From 313eea9b22be4b1f6949a5df9085b625ddeb488b Mon Sep 17 00:00:00 2001 From: dtynn Date: Sat, 13 Nov 2021 09:37:29 +0800 Subject: [PATCH 001/167] feat: add modules: venus-shared & venus-devtool --- Makefile | 35 +- Makefile.bak | 33 ++ venus-devtool/cborgen/main.go | 49 ++ venus-devtool/go.mod | 10 + venus-devtool/go.sum | 179 +++++++ venus-shared/bigint/bigint.go | 59 +++ venus-shared/bigint/bigint_test.go | 42 ++ venus-shared/chain/beacon.go | 6 + venus-shared/chain/block_header.go | 198 +++++++ venus-shared/chain/cbor_gen.go | 710 ++++++++++++++++++++++++++ venus-shared/chain/election_proof.go | 256 ++++++++++ venus-shared/constants/chain.go | 8 + venus-shared/go.mod | 19 + venus-shared/go.sum | 180 +++++++ venus-shared/libp2p/hello/cbor_gen.go | 275 ++++++++++ venus-shared/libp2p/hello/hello.go | 24 + 16 files changed, 2050 insertions(+), 33 deletions(-) create mode 100644 Makefile.bak create mode 100644 venus-devtool/cborgen/main.go create mode 100644 venus-devtool/go.mod create mode 100644 venus-devtool/go.sum create mode 100644 venus-shared/bigint/bigint.go create mode 100644 venus-shared/bigint/bigint_test.go create mode 100644 venus-shared/chain/beacon.go create mode 100644 venus-shared/chain/block_header.go create mode 100644 venus-shared/chain/cbor_gen.go create mode 100644 venus-shared/chain/election_proof.go create mode 100644 venus-shared/constants/chain.go create mode 100644 venus-shared/go.mod create mode 100644 venus-shared/go.sum create mode 100644 venus-shared/libp2p/hello/cbor_gen.go create mode 100644 venus-shared/libp2p/hello/hello.go diff --git a/Makefile b/Makefile index 87b322d2fc..53d5120460 100644 --- a/Makefile +++ b/Makefile @@ -1,33 +1,2 @@ -export CGO_CFLAGS_ALLOW=-D__BLST_PORTABLE__ -export CGO_CFLAGS=-D__BLST_PORTABLE__ - -all: - go run ./build/*.go build - -deps: - git submodule update --init - go run ./build/*.go smartdeps - -lint: - go run ./build/*.go lint - -test: - go run ./build/*.go test -timeout=30m - -# WARNING THIS BUILDS A GO PLUGIN AND PLUGINS *DO NOT* WORK ON WINDOWS SYSTEMS -iptb: - make -C tools/iptb-plugins all - -clean: - rm ./venus - - rm -rf ./extern/filecoin-ffi - rm -rf ./extern/test-vectors - -gen: - go run ./tools/gen/api/proxygen.go - gofmt -s -l -w ./app/client/full.go - goimports -l -w ./app/client/full.go - -gen-asset: - go-bindata -pkg=asset -o ./fixtures/asset/asset.go ./fixtures/_assets/car/ ./fixtures/_assets/proof-params/ ./fixtures/_assets/arch-diagram.monopic +cborgen: + cd venus-devtool && go run ./cborgen/*.go diff --git a/Makefile.bak b/Makefile.bak new file mode 100644 index 0000000000..87b322d2fc --- /dev/null +++ b/Makefile.bak @@ -0,0 +1,33 @@ +export CGO_CFLAGS_ALLOW=-D__BLST_PORTABLE__ +export CGO_CFLAGS=-D__BLST_PORTABLE__ + +all: + go run ./build/*.go build + +deps: + git submodule update --init + go run ./build/*.go smartdeps + +lint: + go run ./build/*.go lint + +test: + go run ./build/*.go test -timeout=30m + +# WARNING THIS BUILDS A GO PLUGIN AND PLUGINS *DO NOT* WORK ON WINDOWS SYSTEMS +iptb: + make -C tools/iptb-plugins all + +clean: + rm ./venus + + rm -rf ./extern/filecoin-ffi + rm -rf ./extern/test-vectors + +gen: + go run ./tools/gen/api/proxygen.go + gofmt -s -l -w ./app/client/full.go + goimports -l -w ./app/client/full.go + +gen-asset: + go-bindata -pkg=asset -o ./fixtures/asset/asset.go ./fixtures/_assets/car/ ./fixtures/_assets/proof-params/ ./fixtures/_assets/arch-diagram.monopic diff --git a/venus-devtool/cborgen/main.go b/venus-devtool/cborgen/main.go new file mode 100644 index 0000000000..63af4a2262 --- /dev/null +++ b/venus-devtool/cborgen/main.go @@ -0,0 +1,49 @@ +package main + +import ( + "log" + "path/filepath" + + gen "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/libp2p/hello" +) + +type genTarget struct { + dir string + pkg string + types []interface{} +} + +func main() { + targets := []genTarget{ + { + dir: "../venus-shared/libp2p/hello/", + types: []interface{}{ + hello.GreetingMessage{}, + hello.LatencyMessage{}, + }, + }, + { + dir: "../venus-shared/chain/", + types: []interface{}{ + chain.BlockHeader{}, + chain.Ticket{}, + chain.ElectionProof{}, + chain.BeaconEntry{}, + }, + }, + } + + for _, target := range targets { + pkg := target.pkg + if pkg == "" { + pkg = filepath.Base(target.dir) + } + + if err := gen.WriteTupleEncodersToFile(filepath.Join(target.dir, "cbor_gen.go"), pkg, target.types...); err != nil { + log.Fatalf("gen for %s: %s", target.dir, err) + } + } +} diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod new file mode 100644 index 0000000000..df9b8e7f8c --- /dev/null +++ b/venus-devtool/go.mod @@ -0,0 +1,10 @@ +module github.com/filecoin-project/venus/venus-devtool + +go 1.16 + +require ( + github.com/filecoin-project/venus/venus-shared v0.0.1 + github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 +) + +replace github.com/filecoin-project/venus/venus-shared => ../venus-shared/ diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum new file mode 100644 index 0000000000..7ead32ba6d --- /dev/null +++ b/venus-devtool/go.sum @@ -0,0 +1,179 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/filecoin-project/go-address v0.0.3 h1:eVfbdjEbpbzIrbiSa+PiGUY+oDK9HnUn+M1R/ggoHf8= +github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= +github.com/filecoin-project/go-bitfield v0.2.0 h1:gCtLcjskIPtdg4NfN7gQZSQF9yrBQ7mkT0qCJxzGI2Q= +github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= +github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= +github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= +github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+eEvrDCGJoPLxFpDynFjYfBjI= +github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= +github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/specs-actors v0.9.13 h1:rUEOQouefi9fuVY/2HOroROJlZbOzWYXXeIh41KF2M4= +github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= +github.com/filecoin-project/specs-actors/v2 v2.3.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= +github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= +github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= +github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= +github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE= +github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= +github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= +github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= +github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= +github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= +github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= +github.com/ipfs/go-ipld-cbor v0.0.4 h1:Aw3KPOKXjvrm6VjwJvFf1F1ekR/BH3jdof3Bk7OTiSA= +github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= +github.com/ipfs/go-ipld-format v0.0.2 h1:OVAGlyYT6JPZ0pEfGntFPS40lfrDmaDbQwNHEY2G9Zs= +github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= +github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= +github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= +github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= +github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= +github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +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/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= +github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= +github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= +github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= +github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= +github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= +github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= +github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= +github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= +github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a h1:hjZfReYVLbqFkAtr2us7vdy04YWz3LVAirzP7reh8+M= +github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= +github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= +github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= +github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830 h1:8kxMKmKzXXL4Ru1nyhvdms/JjWt+3YLpvRb/bAjO/y0= +github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= +github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= +github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= +github.com/whyrusleeping/cbor-gen v0.0.0-20200715143311-227fab5a2377/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20200806213330-63aa96ca5488/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20200810223238-211df3b9e24c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c h1:otRnI08JoahNBxUFqX3372Ab9GnTj8L5J9iP5ImyxGU= +github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 h1:7WtW9D9VGpmRLuQmrPy2JobUNdka95z3MKEVpELtOjo= +github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o= +golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2 h1:46ULzRKLh1CwgRq2dC5SlBzEqqNCi8rreOZnNrbqcIY= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/venus-shared/bigint/bigint.go b/venus-shared/bigint/bigint.go new file mode 100644 index 0000000000..86d89adbab --- /dev/null +++ b/venus-shared/bigint/bigint.go @@ -0,0 +1,59 @@ +package bigint + +import ( + "fmt" + "math/big" + + big2 "github.com/filecoin-project/go-state-types/big" +) + +var EmptyInt = BigInt{} + +type BigInt = big2.Int + +func NewInt(i uint64) BigInt { + return BigInt{Int: big.NewInt(0).SetUint64(i)} +} + +func BigFromBytes(b []byte) BigInt { + i := big.NewInt(0).SetBytes(b) + return BigInt{Int: i} +} + +func BigFromString(s string) (BigInt, error) { + v, ok := big.NewInt(0).SetString(s, 10) + if !ok { + return BigInt{}, fmt.Errorf("failed to parse string as a big int") + } + + return BigInt{Int: v}, nil +} + +func BigMul(a, b BigInt) BigInt { + return BigInt{Int: big.NewInt(0).Mul(a.Int, b.Int)} +} + +func BigDiv(a, b BigInt) BigInt { + return BigInt{Int: big.NewInt(0).Div(a.Int, b.Int)} +} + +func BigDivFloat(num, den BigInt) float64 { + res, _ := new(big.Rat).SetFrac(num.Int, den.Int).Float64() + return res +} + +func BigMod(a, b BigInt) BigInt { + return BigInt{Int: big.NewInt(0).Mod(a.Int, b.Int)} +} + +func BigAdd(a, b BigInt) BigInt { + return BigInt{Int: big.NewInt(0).Add(a.Int, b.Int)} +} + +func BigSub(a, b BigInt) BigInt { + return BigInt{Int: big.NewInt(0).Sub(a.Int, b.Int)} +} + +func BigCmp(a, b BigInt) int { + return a.Int.Cmp(b.Int) +} diff --git a/venus-shared/bigint/bigint_test.go b/venus-shared/bigint/bigint_test.go new file mode 100644 index 0000000000..3a70b1a8bf --- /dev/null +++ b/venus-shared/bigint/bigint_test.go @@ -0,0 +1,42 @@ +package bigint + +import ( + "bytes" + "math/big" + "math/rand" + "strings" + "testing" + "time" + + "github.com/docker/go-units" + + "github.com/stretchr/testify/assert" +) + +func TestBigIntSerializationRoundTrip(t *testing.T) { + testValues := []string{ + "0", "1", "10", "-10", "9999", "12345678901234567891234567890123456789012345678901234567890", + } + + for _, v := range testValues { + bi, err := BigFromString(v) + if err != nil { + t.Fatal(err) + } + + buf := new(bytes.Buffer) + if err := bi.MarshalCBOR(buf); err != nil { + t.Fatal(err) + } + + var out BigInt + if err := out.UnmarshalCBOR(buf); err != nil { + t.Fatal(err) + } + + if BigCmp(out, bi) != 0 { + t.Fatal("failed to round trip BigInt through cbor") + } + + } +} diff --git a/venus-shared/chain/beacon.go b/venus-shared/chain/beacon.go new file mode 100644 index 0000000000..b7abe21233 --- /dev/null +++ b/venus-shared/chain/beacon.go @@ -0,0 +1,6 @@ +package chain + +type BeaconEntry struct { + Round uint64 + Data []byte +} diff --git a/venus-shared/chain/block_header.go b/venus-shared/chain/block_header.go new file mode 100644 index 0000000000..fdb7a41014 --- /dev/null +++ b/venus-shared/chain/block_header.go @@ -0,0 +1,198 @@ +package chain + +import ( + "bytes" + "encoding/json" + "fmt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/crypto" + proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" + cbor "github.com/ipfs/go-ipld-cbor" + node "github.com/ipfs/go-ipld-format" +) + +// DecodeBlock decodes raw cbor bytes into a BlockHeader. +func DecodeBlock(b []byte) (*BlockHeader, error) { + var out BlockHeader + if err := out.UnmarshalCBOR(bytes.NewReader(b)); err != nil { + return nil, err + } + + out.cachedBytes = b + + return &out, nil +} + +// BlockHeader is a newBlock in the blockchain. +type BlockHeader struct { + // Miner is the address of the miner actor that mined this newBlock. + Miner address.Address + + // Ticket is the ticket submitted with this newBlock. + Ticket Ticket + + // ElectionProof is the vrf proof giving this newBlock's miner authoring rights + ElectionProof *ElectionProof + + // BeaconEntries contain the verifiable oracle randomness used to elect + // this newBlock's author leader + BeaconEntries []*BeaconEntry + + // WinPoStProof are the winning post proofs + WinPoStProof []proof2.PoStProof + + // Parents is the set of parents this newBlock was based on. Typically one, + // but can be several in the case where there were multiple winning ticket- + // holders for an epoch. + Parents []cid.Cid + + // ParentWeight is the aggregate chain weight of the parent set. + ParentWeight big.Int + + // Height is the chain height of this newBlock. + Height abi.ChainEpoch + + // ParentStateRoot is the CID of the root of the state tree after application of the messages in the parent tipset + // to the parent tipset's state root. + ParentStateRoot cid.Cid + + // ParentMessageReceipts is a list of receipts corresponding to the application of the messages in the parent tipset + // to the parent tipset's state root (corresponding to this newBlock's ParentStateRoot). + ParentMessageReceipts cid.Cid + + // Messages is the set of messages included in this newBlock + Messages cid.Cid + + // The aggregate signature of all BLS signed messages in the newBlock + BLSAggregate *crypto.Signature + + // The timestamp, in seconds since the Unix epoch, at which this newBlock was created. + Timestamp uint64 + + // The signature of the miner's worker key over the newBlock + BlockSig *crypto.Signature + + // ForkSignaling is extra data used by miners to communicate + ForkSignaling uint64 + + //identical for all blocks in same tipset: the base fee after executing parent tipset + ParentBaseFee abi.TokenAmount + + cachedCid cid.Cid + + cachedBytes []byte + + validated bool // internal, true if the signature has been validated +} + +// Cid returns the content id of this newBlock. +func (b *BlockHeader) Cid() cid.Cid { + c, err := b.cid() + if err != nil { + panic(err) + } + + return c +} + +func (b *BlockHeader) cid() (cid.Cid, error) { + if b.cachedCid == cid.Undef { + data, err := b.Serialize() + if err != nil { + return cid.Undef, err + } + + b.cachedCid, err = abi.CidBuilder.Sum(data) + if err != nil { + return cid.Undef, err + } + } + + return b.cachedCid, nil +} + +// ToNode converts the BlockHeader to an IPLD node. +func (b *BlockHeader) ToNode() node.Node { + blk, err := b.ToStorageBlock() + if err != nil { + panic(err) + } + + n, err := cbor.DecodeBlock(blk) + if err != nil { + panic(err) + } + return n +} + +func (b *BlockHeader) String() string { + errStr := "(error encoding BlockHeader)" + c := b.Cid() + js, err := json.MarshalIndent(b, "", " ") + if err != nil { + return errStr + } + return fmt.Sprintf("BlockHeader cid=[%v]: %s", c, string(js)) +} + +// Equals returns true if the BlockHeader is equal to other. +func (b *BlockHeader) Equals(other *BlockHeader) bool { + return b.Cid().Equals(other.Cid()) +} + +// SignatureData returns the newBlock's bytes with a null signature field for +// signature creation and verification +func (b *BlockHeader) SignatureData() []byte { + tmp := *b + tmp.BlockSig = nil + return tmp.ToNode().RawData() +} + +// Serialize serialize blockheader to binary +func (b *BlockHeader) Serialize() ([]byte, error) { + if len(b.cachedBytes) == 0 { + buf := new(bytes.Buffer) + if err := b.MarshalCBOR(buf); err != nil { + return nil, err + } + + b.cachedBytes = buf.Bytes() + } + + return b.cachedBytes, nil +} + +// ToStorageBlock convert blockheader to data block with cid +func (b *BlockHeader) ToStorageBlock() (blocks.Block, error) { + data, err := b.Serialize() + if err != nil { + return nil, err + } + + c, err := b.cid() + if err != nil { + return nil, err + } + + return blocks.NewBlockWithCid(data, c) +} + +// LastTicket get ticket in block +func (b *BlockHeader) LastTicket() *Ticket { + return &b.Ticket +} + +// SetValidated set block signature is valid after checkout blocksig +func (b *BlockHeader) SetValidated() { + b.validated = true +} + +// IsValidated check whether block signature is valid from memory +func (b *BlockHeader) IsValidated() bool { + return b.validated +} diff --git a/venus-shared/chain/cbor_gen.go b/venus-shared/chain/cbor_gen.go new file mode 100644 index 0000000000..d1e5dcb7ee --- /dev/null +++ b/venus-shared/chain/cbor_gen.go @@ -0,0 +1,710 @@ +// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. + +package chain + +import ( + "fmt" + "io" + "math" + "sort" + + abi "github.com/filecoin-project/go-state-types/abi" + crypto "github.com/filecoin-project/go-state-types/crypto" + proof "github.com/filecoin-project/specs-actors/actors/runtime/proof" + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" +) + +var _ = xerrors.Errorf +var _ = cid.Undef +var _ = math.E +var _ = sort.Sort + +var lengthBufBlockHeader = []byte{144} + +func (t *BlockHeader) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufBlockHeader); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Miner (address.Address) (struct) + if err := t.Miner.MarshalCBOR(w); err != nil { + return err + } + + // t.Ticket (chain.Ticket) (struct) + if err := t.Ticket.MarshalCBOR(w); err != nil { + return err + } + + // t.ElectionProof (chain.ElectionProof) (struct) + if err := t.ElectionProof.MarshalCBOR(w); err != nil { + return err + } + + // t.BeaconEntries ([]*chain.BeaconEntry) (slice) + if len(t.BeaconEntries) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.BeaconEntries was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.BeaconEntries))); err != nil { + return err + } + for _, v := range t.BeaconEntries { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + + // t.WinPoStProof ([]proof.PoStProof) (slice) + if len(t.WinPoStProof) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.WinPoStProof was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.WinPoStProof))); err != nil { + return err + } + for _, v := range t.WinPoStProof { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + + // t.Parents ([]cid.Cid) (slice) + if len(t.Parents) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Parents was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Parents))); err != nil { + return err + } + for _, v := range t.Parents { + if err := cbg.WriteCidBuf(scratch, w, v); err != nil { + return xerrors.Errorf("failed writing cid field t.Parents: %w", err) + } + } + + // t.ParentWeight (big.Int) (struct) + if err := t.ParentWeight.MarshalCBOR(w); err != nil { + return err + } + + // t.Height (abi.ChainEpoch) (int64) + if t.Height >= 0 { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Height)); err != nil { + return err + } + } else { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.Height-1)); err != nil { + return err + } + } + + // t.ParentStateRoot (cid.Cid) (struct) + + if err := cbg.WriteCidBuf(scratch, w, t.ParentStateRoot); err != nil { + return xerrors.Errorf("failed to write cid field t.ParentStateRoot: %w", err) + } + + // t.ParentMessageReceipts (cid.Cid) (struct) + + if err := cbg.WriteCidBuf(scratch, w, t.ParentMessageReceipts); err != nil { + return xerrors.Errorf("failed to write cid field t.ParentMessageReceipts: %w", err) + } + + // t.Messages (cid.Cid) (struct) + + if err := cbg.WriteCidBuf(scratch, w, t.Messages); err != nil { + return xerrors.Errorf("failed to write cid field t.Messages: %w", err) + } + + // t.BLSAggregate (crypto.Signature) (struct) + if err := t.BLSAggregate.MarshalCBOR(w); err != nil { + return err + } + + // t.Timestamp (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Timestamp)); err != nil { + return err + } + + // t.BlockSig (crypto.Signature) (struct) + if err := t.BlockSig.MarshalCBOR(w); err != nil { + return err + } + + // t.ForkSignaling (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.ForkSignaling)); err != nil { + return err + } + + // t.ParentBaseFee (big.Int) (struct) + if err := t.ParentBaseFee.MarshalCBOR(w); err != nil { + return err + } + return nil +} + +func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error { + *t = BlockHeader{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 16 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Miner (address.Address) (struct) + + { + + if err := t.Miner.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Miner: %w", err) + } + + } + // t.Ticket (chain.Ticket) (struct) + + { + + if err := t.Ticket.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Ticket: %w", err) + } + + } + // t.ElectionProof (chain.ElectionProof) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + t.ElectionProof = new(ElectionProof) + if err := t.ElectionProof.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.ElectionProof pointer: %w", err) + } + } + + } + // t.BeaconEntries ([]*chain.BeaconEntry) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.BeaconEntries: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.BeaconEntries = make([]*BeaconEntry, extra) + } + + for i := 0; i < int(extra); i++ { + + var v BeaconEntry + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.BeaconEntries[i] = &v + } + + // t.WinPoStProof ([]proof.PoStProof) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.WinPoStProof: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.WinPoStProof = make([]proof.PoStProof, extra) + } + + for i := 0; i < int(extra); i++ { + + var v proof.PoStProof + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.WinPoStProof[i] = v + } + + // t.Parents ([]cid.Cid) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Parents: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Parents = make([]cid.Cid, extra) + } + + for i := 0; i < int(extra); i++ { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("reading cid field t.Parents failed: %w", err) + } + t.Parents[i] = c + } + + // t.ParentWeight (big.Int) (struct) + + { + + if err := t.ParentWeight.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.ParentWeight: %w", err) + } + + } + // t.Height (abi.ChainEpoch) (int64) + { + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.Height = abi.ChainEpoch(extraI) + } + // t.ParentStateRoot (cid.Cid) (struct) + + { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.ParentStateRoot: %w", err) + } + + t.ParentStateRoot = c + + } + // t.ParentMessageReceipts (cid.Cid) (struct) + + { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.ParentMessageReceipts: %w", err) + } + + t.ParentMessageReceipts = c + + } + // t.Messages (cid.Cid) (struct) + + { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.Messages: %w", err) + } + + t.Messages = c + + } + // t.BLSAggregate (crypto.Signature) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + t.BLSAggregate = new(crypto.Signature) + if err := t.BLSAggregate.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.BLSAggregate pointer: %w", err) + } + } + + } + // t.Timestamp (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Timestamp = uint64(extra) + + } + // t.BlockSig (crypto.Signature) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + t.BlockSig = new(crypto.Signature) + if err := t.BlockSig.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.BlockSig pointer: %w", err) + } + } + + } + // t.ForkSignaling (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.ForkSignaling = uint64(extra) + + } + // t.ParentBaseFee (big.Int) (struct) + + { + + if err := t.ParentBaseFee.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.ParentBaseFee: %w", err) + } + + } + return nil +} + +var lengthBufTicket = []byte{129} + +func (t *Ticket) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufTicket); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.VRFProof (chain.VRFPi) (slice) + if len(t.VRFProof) > cbg.ByteArrayMaxLen { + return xerrors.Errorf("Byte array in field t.VRFProof was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.VRFProof))); err != nil { + return err + } + + if _, err := w.Write(t.VRFProof[:]); err != nil { + return err + } + return nil +} + +func (t *Ticket) UnmarshalCBOR(r io.Reader) error { + *t = Ticket{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 1 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.VRFProof (chain.VRFPi) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.ByteArrayMaxLen { + return fmt.Errorf("t.VRFProof: byte array too large (%d)", extra) + } + if maj != cbg.MajByteString { + return fmt.Errorf("expected byte array") + } + + if extra > 0 { + t.VRFProof = make([]uint8, extra) + } + + if _, err := io.ReadFull(br, t.VRFProof[:]); err != nil { + return err + } + return nil +} + +var lengthBufElectionProof = []byte{130} + +func (t *ElectionProof) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufElectionProof); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.WinCount (int64) (int64) + if t.WinCount >= 0 { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.WinCount)); err != nil { + return err + } + } else { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.WinCount-1)); err != nil { + return err + } + } + + // t.VRFProof (chain.VRFPi) (slice) + if len(t.VRFProof) > cbg.ByteArrayMaxLen { + return xerrors.Errorf("Byte array in field t.VRFProof was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.VRFProof))); err != nil { + return err + } + + if _, err := w.Write(t.VRFProof[:]); err != nil { + return err + } + return nil +} + +func (t *ElectionProof) UnmarshalCBOR(r io.Reader) error { + *t = ElectionProof{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 2 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.WinCount (int64) (int64) + { + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.WinCount = int64(extraI) + } + // t.VRFProof (chain.VRFPi) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.ByteArrayMaxLen { + return fmt.Errorf("t.VRFProof: byte array too large (%d)", extra) + } + if maj != cbg.MajByteString { + return fmt.Errorf("expected byte array") + } + + if extra > 0 { + t.VRFProof = make([]uint8, extra) + } + + if _, err := io.ReadFull(br, t.VRFProof[:]); err != nil { + return err + } + return nil +} + +var lengthBufBeaconEntry = []byte{130} + +func (t *BeaconEntry) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufBeaconEntry); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Round (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Round)); err != nil { + return err + } + + // t.Data ([]uint8) (slice) + if len(t.Data) > cbg.ByteArrayMaxLen { + return xerrors.Errorf("Byte array in field t.Data was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.Data))); err != nil { + return err + } + + if _, err := w.Write(t.Data[:]); err != nil { + return err + } + return nil +} + +func (t *BeaconEntry) UnmarshalCBOR(r io.Reader) error { + *t = BeaconEntry{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 2 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Round (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Round = uint64(extra) + + } + // t.Data ([]uint8) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.ByteArrayMaxLen { + return fmt.Errorf("t.Data: byte array too large (%d)", extra) + } + if maj != cbg.MajByteString { + return fmt.Errorf("expected byte array") + } + + if extra > 0 { + t.Data = make([]uint8, extra) + } + + if _, err := io.ReadFull(br, t.Data[:]); err != nil { + return err + } + return nil +} diff --git a/venus-shared/chain/election_proof.go b/venus-shared/chain/election_proof.go new file mode 100644 index 0000000000..48497d0586 --- /dev/null +++ b/venus-shared/chain/election_proof.go @@ -0,0 +1,256 @@ +package chain + +import ( + "bytes" + "fmt" + "math/big" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/minio/blake2b-simd" + + "github.com/filecoin-project/venus/venus-shared/bigint" + "github.com/filecoin-project/venus/venus-shared/constants" +) + +// A Ticket is a marker of a tick of the blockchain's clock. It is the source +// of randomness for proofs of storage and leader election. It is generated +// by the miner of a newBlock using a VRF. +type Ticket struct { + // A proof output by running a VRF on the VRFProof of the parent ticket + VRFProof VRFPi +} + +// String returns the string representation of the VRFProof of the ticket +func (t Ticket) String() string { + return fmt.Sprintf("%x", t.VRFProof) +} + +func (t *Ticket) Compare(o *Ticket) int { + tDigest := t.VRFProof.Digest() + oDigest := o.VRFProof.Digest() + return bytes.Compare(tDigest[:], oDigest[:]) +} + +func (t *Ticket) Less(o *Ticket) bool { + return t.Compare(o) < 0 +} + +func (t *Ticket) Quality() float64 { + ticketHash := blake2b.Sum256(t.VRFProof) + ticketNum := bigint.BigFromBytes(ticketHash[:]).Int + ticketDenu := big.NewInt(1) + ticketDenu.Lsh(ticketDenu, 256) + tv, _ := new(big.Rat).SetFrac(ticketNum, ticketDenu).Float64() + tq := 1 - tv + return tq +} + +// VRFPi is the proof output from running a VRF. +type VRFPi []byte + +// Digest returns the digest (hash) of a proof, for use generating challenges etc. +func (p VRFPi) Digest() [32]byte { + proofDigest := blake2b.Sum256(p) + return proofDigest +} + +type ElectionProof struct { + WinCount int64 + + // A proof output by running a VRF on the VRFProof of the parent ticket + VRFProof VRFPi +} + +const precision = 256 + +var blocksPerEpoch = big.NewInt(0).SetUint64(constants.BlocksPerEpoch) + +var ( + expNumCoef []*big.Int + expDenoCoef []*big.Int +) + +func init() { + parse := func(coefs []string) []*big.Int { + out := make([]*big.Int, len(coefs)) + for i, coef := range coefs { + c, ok := new(big.Int).SetString(coef, 10) + if !ok { + panic("could not parse exp paramemter") + } + // << 256 (Q.0 to Q.256), >> 128 to transform integer params to coefficients + c = c.Lsh(c, precision-128) + out[i] = c + } + return out + } + + // parameters are in integer format, + // coefficients are *2^-128 of that + num := []string{ + "-648770010757830093818553637600", + "67469480939593786226847644286976", + "-3197587544499098424029388939001856", + "89244641121992890118377641805348864", + "-1579656163641440567800982336819953664", + "17685496037279256458459817590917169152", + "-115682590513835356866803355398940131328", + "340282366920938463463374607431768211456", + } + expNumCoef = parse(num) + + deno := []string{ + "1225524182432722209606361", + "114095592300906098243859450", + "5665570424063336070530214243", + "194450132448609991765137938448", + "5068267641632683791026134915072", + "104716890604972796896895427629056", + "1748338658439454459487681798864896", + "23704654329841312470660182937960448", + "259380097567996910282699886670381056", + "2250336698853390384720606936038375424", + "14978272436876548034486263159246028800", + "72144088983913131323343765784380833792", + "224599776407103106596571252037123047424", + "340282366920938463463374607431768211456", + } + expDenoCoef = parse(deno) +} + +// expneg accepts x in Q.256 format and computes e^-x. +// It is most precise within [0, 1.725) range, where error is less than 3.4e-30. +// Over the [0, 5) range its error is less than 4.6e-15. +// Output is in Q.256 format. +func expneg(x *big.Int) *big.Int { + // exp is approximated by rational function + // polynomials of the rational function are evaluated using Horner's method + num := polyval(expNumCoef, x) // Q.256 + deno := polyval(expDenoCoef, x) // Q.256 + + num = num.Lsh(num, precision) // Q.512 + return num.Div(num, deno) // Q.512 / Q.256 => Q.256 +} + +// polyval evaluates a polynomial given by coefficients `p` in Q.256 format +// at point `x` in Q.256 format. Output is in Q.256. +// Coefficients should be ordered from the highest order coefficient to the lowest. +func polyval(p []*big.Int, x *big.Int) *big.Int { + // evaluation using Horner's method + res := new(big.Int).Set(p[0]) // Q.256 + tmp := new(big.Int) // big.Int.Mul doesn't like when input is reused as output + for _, c := range p[1:] { + tmp = tmp.Mul(res, x) // Q.256 * Q.256 => Q.512 + res = res.Rsh(tmp, precision) // Q.512 >> 256 => Q.256 + res = res.Add(res, c) + } + + return res +} + +// computes lambda in Q.256 +func lambda(power, totalPower *big.Int) *big.Int { + lam := new(big.Int).Mul(power, blocksPerEpoch) // Q.0 + lam = lam.Lsh(lam, precision) // Q.256 + lam = lam.Div(lam /* Q.256 */, totalPower /* Q.0 */) // Q.256 + return lam +} + +var MaxWinCount = 3 * int64(constants.BlocksPerEpoch) + +type poiss struct { + lam *big.Int + pmf *big.Int + icdf *big.Int + + tmp *big.Int // temporary variable for optimization + + k uint64 +} + +// newPoiss starts poisson inverted CDF +// lambda is in Q.256 format +// returns (instance, `1-poisscdf(0, lambda)`) +// CDF value returend is reused when calling `next` +func newPoiss(lambda *big.Int) (*poiss, *big.Int) { + + // pmf(k) = (lambda^k)*(e^lambda) / k! + // k = 0 here, so it simplifies to just e^-lambda + elam := expneg(lambda) // Q.256 + pmf := new(big.Int).Set(elam) + + // icdf(k) = 1 - ∑ᵏᵢ₌₀ pmf(i) + // icdf(0) = 1 - pmf(0) + icdf := big.NewInt(1) + icdf = icdf.Lsh(icdf, precision) // Q.256 + icdf = icdf.Sub(icdf, pmf) // Q.256 + + k := uint64(0) + + p := &poiss{ + lam: lambda, + pmf: pmf, + + tmp: elam, + icdf: icdf, + + k: k, + } + + return p, icdf +} + +// next computes `k++, 1-poisscdf(k, lam)` +// return is in Q.256 format +func (p *poiss) next() *big.Int { + // incrementally compute next pmf and icdf + + // pmf(k) = (lambda^k)*(e^lambda) / k! + // so pmf(k) = pmf(k-1) * lambda / k + p.k++ + p.tmp.SetUint64(p.k) // Q.0 + + // calculate pmf for k + p.pmf = p.pmf.Div(p.pmf, p.tmp) // Q.256 / Q.0 => Q.256 + // we are using `tmp` as target for multiplication as using an input as output + // for Int.Mul causes allocations + p.tmp = p.tmp.Mul(p.pmf, p.lam) // Q.256 * Q.256 => Q.512 + p.pmf = p.pmf.Rsh(p.tmp, precision) // Q.512 >> 256 => Q.256 + + // calculate output + // icdf(k) = icdf(k-1) - pmf(k) + p.icdf = p.icdf.Sub(p.icdf, p.pmf) // Q.256 + return p.icdf +} + +// ComputeWinCount uses VRFProof to compute number of wins +// The algorithm is based on Algorand's Sortition with Binomial distribution +// replaced by Poisson distribution. +func (ep *ElectionProof) ComputeWinCount(power abi.StoragePower, totalPower abi.StoragePower) int64 { + h := blake2b.Sum256(ep.VRFProof) + + lhs := big.NewInt(0).SetBytes(h[:]) // 256bits, assume Q.256 so [0, 1) + + // We are calculating upside-down CDF of Poisson distribution with + // rate λ=power*E/totalPower + // Steps: + // 1. calculate λ=power*E/totalPower + // 2. calculate elam = exp(-λ) + // 3. Check how many times we win: + // j = 0 + // pmf = elam + // rhs = 1 - pmf + // for h(vrf) < rhs: j++; pmf = pmf * lam / j; rhs = rhs - pmf + + lam := lambda(power.Int, totalPower.Int) // Q.256 + + p, rhs := newPoiss(lam) + + var j int64 + for lhs.Cmp(rhs) < 0 && j < MaxWinCount { + rhs = p.next() + j++ + } + + return j +} diff --git a/venus-shared/constants/chain.go b/venus-shared/constants/chain.go new file mode 100644 index 0000000000..a6490284a5 --- /dev/null +++ b/venus-shared/constants/chain.go @@ -0,0 +1,8 @@ +package constants + +import ( + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" +) + +// Blocks (e) +var BlocksPerEpoch = uint64(builtin2.ExpectedLeadersPerEpoch) diff --git a/venus-shared/go.mod b/venus-shared/go.mod new file mode 100644 index 0000000000..2b69e81fec --- /dev/null +++ b/venus-shared/go.mod @@ -0,0 +1,19 @@ +module github.com/filecoin-project/venus/venus-shared + +go 1.16 + +require ( + github.com/docker/go-units v0.4.0 + github.com/filecoin-project/go-address v0.0.3 + github.com/filecoin-project/go-state-types v0.1.1 + github.com/filecoin-project/specs-actors v0.9.13 + github.com/filecoin-project/specs-actors/v2 v2.3.5 + github.com/ipfs/go-block-format v0.0.2 + github.com/ipfs/go-cid v0.1.0 + github.com/ipfs/go-ipld-cbor v0.0.4 + github.com/ipfs/go-ipld-format v0.0.2 + github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 + github.com/stretchr/testify v1.6.1 + github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 +) diff --git a/venus-shared/go.sum b/venus-shared/go.sum new file mode 100644 index 0000000000..365737eb8e --- /dev/null +++ b/venus-shared/go.sum @@ -0,0 +1,180 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/filecoin-project/go-address v0.0.3 h1:eVfbdjEbpbzIrbiSa+PiGUY+oDK9HnUn+M1R/ggoHf8= +github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= +github.com/filecoin-project/go-bitfield v0.2.0 h1:gCtLcjskIPtdg4NfN7gQZSQF9yrBQ7mkT0qCJxzGI2Q= +github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= +github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= +github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= +github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+eEvrDCGJoPLxFpDynFjYfBjI= +github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= +github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/specs-actors v0.9.13 h1:rUEOQouefi9fuVY/2HOroROJlZbOzWYXXeIh41KF2M4= +github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= +github.com/filecoin-project/specs-actors/v2 v2.3.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= +github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= +github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= +github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= +github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE= +github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= +github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= +github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= +github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= +github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= +github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= +github.com/ipfs/go-ipld-cbor v0.0.4 h1:Aw3KPOKXjvrm6VjwJvFf1F1ekR/BH3jdof3Bk7OTiSA= +github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= +github.com/ipfs/go-ipld-format v0.0.2 h1:OVAGlyYT6JPZ0pEfGntFPS40lfrDmaDbQwNHEY2G9Zs= +github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= +github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= +github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= +github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= +github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= +github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +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/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= +github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= +github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= +github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= +github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= +github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= +github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= +github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= +github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= +github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a h1:hjZfReYVLbqFkAtr2us7vdy04YWz3LVAirzP7reh8+M= +github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= +github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= +github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= +github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830 h1:8kxMKmKzXXL4Ru1nyhvdms/JjWt+3YLpvRb/bAjO/y0= +github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= +github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= +github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= +github.com/whyrusleeping/cbor-gen v0.0.0-20200715143311-227fab5a2377/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20200806213330-63aa96ca5488/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20200810223238-211df3b9e24c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c h1:otRnI08JoahNBxUFqX3372Ab9GnTj8L5J9iP5ImyxGU= +github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o= +golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2 h1:46ULzRKLh1CwgRq2dC5SlBzEqqNCi8rreOZnNrbqcIY= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/venus-shared/libp2p/hello/cbor_gen.go b/venus-shared/libp2p/hello/cbor_gen.go new file mode 100644 index 0000000000..b31ba9c027 --- /dev/null +++ b/venus-shared/libp2p/hello/cbor_gen.go @@ -0,0 +1,275 @@ +// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. + +package hello + +import ( + "fmt" + "io" + "math" + "sort" + + abi "github.com/filecoin-project/go-state-types/abi" + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" +) + +var _ = xerrors.Errorf +var _ = cid.Undef +var _ = math.E +var _ = sort.Sort + +var lengthBufGreetingMessage = []byte{132} + +func (t *GreetingMessage) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufGreetingMessage); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.HeaviestTipSet ([]cid.Cid) (slice) + if len(t.HeaviestTipSet) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.HeaviestTipSet was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.HeaviestTipSet))); err != nil { + return err + } + for _, v := range t.HeaviestTipSet { + if err := cbg.WriteCidBuf(scratch, w, v); err != nil { + return xerrors.Errorf("failed writing cid field t.HeaviestTipSet: %w", err) + } + } + + // t.HeaviestTipSetHeight (abi.ChainEpoch) (int64) + if t.HeaviestTipSetHeight >= 0 { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.HeaviestTipSetHeight)); err != nil { + return err + } + } else { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.HeaviestTipSetHeight-1)); err != nil { + return err + } + } + + // t.HeaviestTipSetWeight (big.Int) (struct) + if err := t.HeaviestTipSetWeight.MarshalCBOR(w); err != nil { + return err + } + + // t.GenesisHash (cid.Cid) (struct) + + if err := cbg.WriteCidBuf(scratch, w, t.GenesisHash); err != nil { + return xerrors.Errorf("failed to write cid field t.GenesisHash: %w", err) + } + + return nil +} + +func (t *GreetingMessage) UnmarshalCBOR(r io.Reader) error { + *t = GreetingMessage{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 4 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.HeaviestTipSet ([]cid.Cid) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.HeaviestTipSet: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.HeaviestTipSet = make([]cid.Cid, extra) + } + + for i := 0; i < int(extra); i++ { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("reading cid field t.HeaviestTipSet failed: %w", err) + } + t.HeaviestTipSet[i] = c + } + + // t.HeaviestTipSetHeight (abi.ChainEpoch) (int64) + { + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.HeaviestTipSetHeight = abi.ChainEpoch(extraI) + } + // t.HeaviestTipSetWeight (big.Int) (struct) + + { + + if err := t.HeaviestTipSetWeight.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.HeaviestTipSetWeight: %w", err) + } + + } + // t.GenesisHash (cid.Cid) (struct) + + { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.GenesisHash: %w", err) + } + + t.GenesisHash = c + + } + return nil +} + +var lengthBufLatencyMessage = []byte{130} + +func (t *LatencyMessage) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufLatencyMessage); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.TArrival (int64) (int64) + if t.TArrival >= 0 { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.TArrival)); err != nil { + return err + } + } else { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.TArrival-1)); err != nil { + return err + } + } + + // t.TSent (int64) (int64) + if t.TSent >= 0 { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.TSent)); err != nil { + return err + } + } else { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.TSent-1)); err != nil { + return err + } + } + return nil +} + +func (t *LatencyMessage) UnmarshalCBOR(r io.Reader) error { + *t = LatencyMessage{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 2 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.TArrival (int64) (int64) + { + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.TArrival = int64(extraI) + } + // t.TSent (int64) (int64) + { + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.TSent = int64(extraI) + } + return nil +} diff --git a/venus-shared/libp2p/hello/hello.go b/venus-shared/libp2p/hello/hello.go new file mode 100644 index 0000000000..c04ee28647 --- /dev/null +++ b/venus-shared/libp2p/hello/hello.go @@ -0,0 +1,24 @@ +package hello + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/ipfs/go-cid" +) + +const ProtocolID = "/fil/hello/1.0.0" + +// GreetingMessage is the data structure of a single message in the hello protocol. +type GreetingMessage struct { + HeaviestTipSet []cid.Cid + HeaviestTipSetHeight abi.ChainEpoch + HeaviestTipSetWeight big.Int + GenesisHash cid.Cid +} + +// LatencyMessage is written in response to a hello message for measuring peer +// latency. +type LatencyMessage struct { + TArrival int64 + TSent int64 +} From 3e1c2b31fa241c93d619aafed95be149ffebcd4d Mon Sep 17 00:00:00 2001 From: dtynn Date: Sat, 13 Nov 2021 09:58:19 +0800 Subject: [PATCH 002/167] add simple test for blockHeader serializing & caching, fix test for bigint --- Makefile | 5 +++ venus-devtool/go.sum | 5 ++- venus-shared/bigint/bigint_test.go | 8 ----- venus-shared/chain/block_header.go | 2 ++ venus-shared/chain/block_header_test.go | 48 +++++++++++++++++++++++++ venus-shared/go.mod | 2 +- venus-shared/go.sum | 2 ++ 7 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 venus-shared/chain/block_header_test.go diff --git a/Makefile b/Makefile index 53d5120460..9e79a7dbf3 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,7 @@ cborgen: cd venus-devtool && go run ./cborgen/*.go + +test-venus-shared: + cd venus-shared && go test -v ./... + +test: test-venus-shared diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index 7ead32ba6d..21194f1cd3 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -2,7 +2,6 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/filecoin-project/go-address v0.0.3 h1:eVfbdjEbpbzIrbiSa+PiGUY+oDK9HnUn+M1R/ggoHf8= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= @@ -111,8 +110,9 @@ github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830 h1:8kxMKmKzXXL4Ru1nyhvdms/JjWt+3YLpvRb/bAjO/y0= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= @@ -122,7 +122,6 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W github.com/whyrusleeping/cbor-gen v0.0.0-20200715143311-227fab5a2377/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200806213330-63aa96ca5488/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200810223238-211df3b9e24c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c h1:otRnI08JoahNBxUFqX3372Ab9GnTj8L5J9iP5ImyxGU= github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 h1:7WtW9D9VGpmRLuQmrPy2JobUNdka95z3MKEVpELtOjo= github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= diff --git a/venus-shared/bigint/bigint_test.go b/venus-shared/bigint/bigint_test.go index 3a70b1a8bf..85de45356e 100644 --- a/venus-shared/bigint/bigint_test.go +++ b/venus-shared/bigint/bigint_test.go @@ -2,15 +2,7 @@ package bigint import ( "bytes" - "math/big" - "math/rand" - "strings" "testing" - "time" - - "github.com/docker/go-units" - - "github.com/stretchr/testify/assert" ) func TestBigIntSerializationRoundTrip(t *testing.T) { diff --git a/venus-shared/chain/block_header.go b/venus-shared/chain/block_header.go index fdb7a41014..b341e019ba 100644 --- a/venus-shared/chain/block_header.go +++ b/venus-shared/chain/block_header.go @@ -150,6 +150,8 @@ func (b *BlockHeader) Equals(other *BlockHeader) bool { func (b *BlockHeader) SignatureData() []byte { tmp := *b tmp.BlockSig = nil + tmp.cachedBytes = nil + tmp.cachedCid = cid.Undef return tmp.ToNode().RawData() } diff --git a/venus-shared/chain/block_header_test.go b/venus-shared/chain/block_header_test.go new file mode 100644 index 0000000000..f158a10a6d --- /dev/null +++ b/venus-shared/chain/block_header_test.go @@ -0,0 +1,48 @@ +package chain + +import ( + "encoding/hex" + "testing" + + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + "github.com/stretchr/testify/assert" +) + +func TestBlockHeaderMarshal(t *testing.T) { + const mdata = "f021344" + const cdata = "bafy2bzaced35aqx5wnwp4ohegreumsheigitrhcqlr3lmz4phyzwikmi44sww" + const bdata = "904400e0a601815860b48541b503b47535334553bf0d1fc702d395133e28b48bbae7550e955025ee09f642cb82c79de036099c657b7efb78e10b685aa99d817f6e560805787c5df894ac6758b0d68c72fb498113a5e763ef65d5bff576cd7fc3a847684a410b89c63c82025860a233b638f28312f9014728cf42e2c353bbf2031506488fa3192d137881e8b9666a2d131218e96b51b701f826940ef6630ae13b20c7bf115155e349c88363949fd7704f8026c3c3b1f872d9085e912856d2b56b8ce8a6fb8cf4e996aaa8476e2c81821a001506545860a699f4d93c54d66d46a46cab8da059fbf7ef82e40dd19a67fc1c5a402422304e7b8eec5c2dc6107e0cf1be676f12ce9b05675160e1c66f0ae5ebcf056e303ca39aa813acd5403844604b51f1e3dd5fcd271978346b85cdfa6d75cb46e2c6609581820358c09095232420f9caff389c0709ace12897ad0b5734b104011849e0f008febf39d8c64079236d3e75c24c08a613bcd946538a4b966b3c5a79cf61832c673f2ec90d22d02c16e28073c20995f5259567736d6e6f2fee588c7c23ca1946d753a783fe14404c3f4684a0a7cf5ceadc8a7a2cd9ad0387b96608eca6d3604ed7beb948f7fa2e235f1d611114f66752c6c36ac9aeb17c2f36d70accbd7554678034381486a1a95ea36db4dc549ee152a00c1b454da4f47b33327609be8b055f14681a2edf84d82a5827000171a0e4022084da38b952ab5644c5418c3305b3c22b5eca92eab9e23cdb675163773a964c53d82a5827000171a0e402201ef87dc542d008d961a30a36935a06d28ef05e4ed5e22f7779c4f3f8002c451dd82a5827000171a0e4022079bfefc62c740cda4b0463ceba68e9613c5c47ef7bbed968b179763ae7978bf4d82a5827000171a0e402202f9becc403d7228035f153d9cba42db472ed3c1cb3f22c7ae02eaaabca53e80f460001d7dbb8171a00067680d82a5827000171a0e402204f2120d6581f3d69a5d62e25dd993d1825ce6a446ffa801a4092e7e3a28d4b73d82a5827000171a0e402204bc482ae9a6a1afd1a252264a4bcae9fb2150faf9910b80703e9fbb91ab041e3d82a5827000171a0e4022017d2c80f5b157b61e96ea4ef3888762fa81a9a853bffa624f4bfb9c388859a88586102b3f7f6dc71591af0a61bbcad978178fc123a6edbec959716c028ec976b997df83af557a5ad1d05544d5ce82e5461c562196ea998b437bf0ceb7965871bd6d9e16a2df9cfaaf50b627f5a406d344f1ae0d8e0eaa5835f9c092fe24681cbc7761d1a618f1680586102920f0a831f86073b12641e6c880ddc2823a9c7b1b14b56f7995eaafc35df9c8f3066cd3ab9693c53b388e4c46d7680b50dcd242471d763a5114274c475eeb7d6561e35f51db3b6ac46c4fb8f4218ddc6d6fae3c1cd09fa70c21e6e87bd94e33100420064" + const sdata = "904400e0a601815860b48541b503b47535334553bf0d1fc702d395133e28b48bbae7550e955025ee09f642cb82c79de036099c657b7efb78e10b685aa99d817f6e560805787c5df894ac6758b0d68c72fb498113a5e763ef65d5bff576cd7fc3a847684a410b89c63c82025860a233b638f28312f9014728cf42e2c353bbf2031506488fa3192d137881e8b9666a2d131218e96b51b701f826940ef6630ae13b20c7bf115155e349c88363949fd7704f8026c3c3b1f872d9085e912856d2b56b8ce8a6fb8cf4e996aaa8476e2c81821a001506545860a699f4d93c54d66d46a46cab8da059fbf7ef82e40dd19a67fc1c5a402422304e7b8eec5c2dc6107e0cf1be676f12ce9b05675160e1c66f0ae5ebcf056e303ca39aa813acd5403844604b51f1e3dd5fcd271978346b85cdfa6d75cb46e2c6609581820358c09095232420f9caff389c0709ace12897ad0b5734b104011849e0f008febf39d8c64079236d3e75c24c08a613bcd946538a4b966b3c5a79cf61832c673f2ec90d22d02c16e28073c20995f5259567736d6e6f2fee588c7c23ca1946d753a783fe14404c3f4684a0a7cf5ceadc8a7a2cd9ad0387b96608eca6d3604ed7beb948f7fa2e235f1d611114f66752c6c36ac9aeb17c2f36d70accbd7554678034381486a1a95ea36db4dc549ee152a00c1b454da4f47b33327609be8b055f14681a2edf84d82a5827000171a0e4022084da38b952ab5644c5418c3305b3c22b5eca92eab9e23cdb675163773a964c53d82a5827000171a0e402201ef87dc542d008d961a30a36935a06d28ef05e4ed5e22f7779c4f3f8002c451dd82a5827000171a0e4022079bfefc62c740cda4b0463ceba68e9613c5c47ef7bbed968b179763ae7978bf4d82a5827000171a0e402202f9becc403d7228035f153d9cba42db472ed3c1cb3f22c7ae02eaaabca53e80f460001d7dbb8171a00067680d82a5827000171a0e402204f2120d6581f3d69a5d62e25dd993d1825ce6a446ffa801a4092e7e3a28d4b73d82a5827000171a0e402204bc482ae9a6a1afd1a252264a4bcae9fb2150faf9910b80703e9fbb91ab041e3d82a5827000171a0e4022017d2c80f5b157b61e96ea4ef3888762fa81a9a853bffa624f4bfb9c388859a88586102b3f7f6dc71591af0a61bbcad978178fc123a6edbec959716c028ec976b997df83af557a5ad1d05544d5ce82e5461c562196ea998b437bf0ceb7965871bd6d9e16a2df9cfaaf50b627f5a406d344f1ae0d8e0eaa5835f9c092fe24681cbc7761d1a618f1680f600420064" + + maddr, err := address.NewFromString(mdata) + assert.NoErrorf(t, err, "parse miner address %s", mdata) + + c, err := cid.Decode(cdata) + assert.NoErrorf(t, err, "decode cid %s", cdata) + + assert.NotEqual(t, bdata, sdata, "check raw sign bytes") + + b, err := hex.DecodeString(bdata) + assert.NoError(t, err, "decode block header binary") + + signb, err := hex.DecodeString(sdata) + assert.NoError(t, err, "decode sign bytes") + + bh, err := DecodeBlock(b) + assert.NoError(t, err, "decode block header") + // make sure cached bytes during decoding will not influence the following tests + bh.cachedBytes = nil + + assert.Equal(t, maddr, bh.Miner, "check for miner") + assert.Equal(t, signb, bh.SignatureData(), "check for signature data") + + blk, err := bh.ToStorageBlock() + assert.NoError(t, err, "ToStorageBlock") + + assert.Equal(t, c, bh.cachedCid, "check for cachedCid") + assert.Equal(t, b, bh.cachedBytes, "check for cachedBytes") + + assert.Equal(t, c, blk.Cid(), "check for blk.Cid()") + assert.Equal(t, b, blk.RawData(), "check for blk.RawData()") +} diff --git a/venus-shared/go.mod b/venus-shared/go.mod index 2b69e81fec..56af51aee3 100644 --- a/venus-shared/go.mod +++ b/venus-shared/go.mod @@ -13,7 +13,7 @@ require ( github.com/ipfs/go-ipld-cbor v0.0.4 github.com/ipfs/go-ipld-format v0.0.2 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 - github.com/stretchr/testify v1.6.1 + github.com/stretchr/testify v1.7.0 github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 ) diff --git a/venus-shared/go.sum b/venus-shared/go.sum index 365737eb8e..e443d51eaa 100644 --- a/venus-shared/go.sum +++ b/venus-shared/go.sum @@ -115,6 +115,8 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830 h1:8kxMKmKzXXL4Ru1nyhvdms/JjWt+3YLpvRb/bAjO/y0= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= From 00e3100c77d2f21ab151ec6ad6799d8e4b1ce345 Mon Sep 17 00:00:00 2001 From: dtynn Date: Sat, 13 Nov 2021 12:39:24 +0800 Subject: [PATCH 003/167] feat: add doc: refactor notes for venus-v2 --- documentation/cn/refactor_notes.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 documentation/cn/refactor_notes.md diff --git a/documentation/cn/refactor_notes.md b/documentation/cn/refactor_notes.md new file mode 100644 index 0000000000..9b05ee6357 --- /dev/null +++ b/documentation/cn/refactor_notes.md @@ -0,0 +1,5 @@ +# 重构日记 + +- [ ] 关于 venus-devtool 部分,也就是开发过程中需要用到的各类辅助工具放置位置:从现在来看,以一个单独的、内部的 module 模式比较好,可以避免在 venus/v2 中显式声明对新的 module 进行 replace,从而也就避免了出现依赖关系上的“难以厘清”。 +- [ ] 在抽取 `chain.BlockHeader` 的过程中,出现了同样的序列化过程反复手写, `cachedBytes` 与 `cachedCid` 用上了又没完全用上的情况,这个应该是在处理历史遗留问题时追求“快速实现”的结果。同时,在写好实现之后立刻进行基本的测试编写帮助找出了 `SignatureData` 方法中,由于结构体复制后没有清除 cache 导致的bug。 + 由此可见,测试用例,尤其是基础功能性的测试用例,应当在逻辑代码实现后立即着手编写,这样做一方面是可以尽快找出问题,避免系统复杂之后更为困难的 debug 过程;另一方面则是可以趁着记忆仍然“新鲜”,保障有一个较好的测试覆盖率。 From 62889861b9b68cee1e45e2c1ec523afe2f8bf80a Mon Sep 17 00:00:00 2001 From: dtynn Date: Sat, 13 Nov 2021 12:42:29 +0800 Subject: [PATCH 004/167] fix: newline in check item --- documentation/cn/refactor_notes.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/documentation/cn/refactor_notes.md b/documentation/cn/refactor_notes.md index 9b05ee6357..a55fbcf805 100644 --- a/documentation/cn/refactor_notes.md +++ b/documentation/cn/refactor_notes.md @@ -1,5 +1,7 @@ # 重构日记 - [ ] 关于 venus-devtool 部分,也就是开发过程中需要用到的各类辅助工具放置位置:从现在来看,以一个单独的、内部的 module 模式比较好,可以避免在 venus/v2 中显式声明对新的 module 进行 replace,从而也就避免了出现依赖关系上的“难以厘清”。 + - [ ] 在抽取 `chain.BlockHeader` 的过程中,出现了同样的序列化过程反复手写, `cachedBytes` 与 `cachedCid` 用上了又没完全用上的情况,这个应该是在处理历史遗留问题时追求“快速实现”的结果。同时,在写好实现之后立刻进行基本的测试编写帮助找出了 `SignatureData` 方法中,由于结构体复制后没有清除 cache 导致的bug。 - 由此可见,测试用例,尤其是基础功能性的测试用例,应当在逻辑代码实现后立即着手编写,这样做一方面是可以尽快找出问题,避免系统复杂之后更为困难的 debug 过程;另一方面则是可以趁着记忆仍然“新鲜”,保障有一个较好的测试覆盖率。 + + 由此可见,测试用例,尤其是基础功能性的测试用例,应当在逻辑代码实现后立即着手编写,这样做一方面是可以尽快找出问题,避免系统复杂之后更为困难的 debug 过程;另一方面则是可以趁着记忆仍然“新鲜”,保障有一个较好的测试覆盖率。 From 554701dcf64ab5b84e26b62f3c925032ce79ac1d Mon Sep 17 00:00:00 2001 From: dtynn Date: Mon, 15 Nov 2021 11:33:11 +0800 Subject: [PATCH 005/167] refactor: remove cachedXXXX fields inside chain.BlockHeader, re-organize usages of Serialize() --- documentation/cn/refactor_notes.md | 6 ++ venus-shared/chain/block_header.go | 75 +++++++------------------ venus-shared/chain/block_header_test.go | 16 +++--- 3 files changed, 35 insertions(+), 62 deletions(-) diff --git a/documentation/cn/refactor_notes.md b/documentation/cn/refactor_notes.md index a55fbcf805..0a388efc1c 100644 --- a/documentation/cn/refactor_notes.md +++ b/documentation/cn/refactor_notes.md @@ -5,3 +5,9 @@ - [ ] 在抽取 `chain.BlockHeader` 的过程中,出现了同样的序列化过程反复手写, `cachedBytes` 与 `cachedCid` 用上了又没完全用上的情况,这个应该是在处理历史遗留问题时追求“快速实现”的结果。同时,在写好实现之后立刻进行基本的测试编写帮助找出了 `SignatureData` 方法中,由于结构体复制后没有清除 cache 导致的bug。 由此可见,测试用例,尤其是基础功能性的测试用例,应当在逻辑代码实现后立即着手编写,这样做一方面是可以尽快找出问题,避免系统复杂之后更为困难的 debug 过程;另一方面则是可以趁着记忆仍然“新鲜”,保障有一个较好的测试覆盖率。 + +- [ ] 在处理 `chain.BlockHeader` 中的 `cachedBytes` 和 `cachedCid` 字段时,出现了反复。最开始认为可以抽象出一类 `cborCache` 类型,专门进行 data 和 cid 的缓存。接着发现,在 `Message` 这类对象中如果使用这样一个缓存,很有可能出现修改了 Message 的属性之后得不到正确的序列化结果和 cid 的问题。 + + 因此,将 `chain.BlockHeader` 中的 cache 字段也做了移除处理。如果仔细去想,这里 cache 字段出现的意义到底是什么?我认为,这类对象提供了太多需要进行雷同的序列化过程的方法。如 `Cid` 这个方法,甚至是先序列化再计算数据的哈希值。这导致序列化被反复无序地使用,我想这才是加上 cache 字段的初衷。 + + 那么实际上,我们真正要做的是减少序列化被使用的位置,并尽可能让且有序,如不提供一个只返回 Cid 的方法,而同时返回序列化结果和 Cid diff --git a/venus-shared/chain/block_header.go b/venus-shared/chain/block_header.go index b341e019ba..8eeb2576e1 100644 --- a/venus-shared/chain/block_header.go +++ b/venus-shared/chain/block_header.go @@ -12,8 +12,6 @@ import ( proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" - cbor "github.com/ipfs/go-ipld-cbor" - node "github.com/ipfs/go-ipld-format" ) // DecodeBlock decodes raw cbor bytes into a BlockHeader. @@ -23,8 +21,6 @@ func DecodeBlock(b []byte) (*BlockHeader, error) { return nil, err } - out.cachedBytes = b - return &out, nil } @@ -83,16 +79,12 @@ type BlockHeader struct { //identical for all blocks in same tipset: the base fee after executing parent tipset ParentBaseFee abi.TokenAmount - cachedCid cid.Cid - - cachedBytes []byte - validated bool // internal, true if the signature has been validated } // Cid returns the content id of this newBlock. func (b *BlockHeader) Cid() cid.Cid { - c, err := b.cid() + c, _, err := b.SerializeWithCid() if err != nil { panic(err) } @@ -100,36 +92,6 @@ func (b *BlockHeader) Cid() cid.Cid { return c } -func (b *BlockHeader) cid() (cid.Cid, error) { - if b.cachedCid == cid.Undef { - data, err := b.Serialize() - if err != nil { - return cid.Undef, err - } - - b.cachedCid, err = abi.CidBuilder.Sum(data) - if err != nil { - return cid.Undef, err - } - } - - return b.cachedCid, nil -} - -// ToNode converts the BlockHeader to an IPLD node. -func (b *BlockHeader) ToNode() node.Node { - blk, err := b.ToStorageBlock() - if err != nil { - panic(err) - } - - n, err := cbor.DecodeBlock(blk) - if err != nil { - panic(err) - } - return n -} - func (b *BlockHeader) String() string { errStr := "(error encoding BlockHeader)" c := b.Cid() @@ -147,36 +109,39 @@ func (b *BlockHeader) Equals(other *BlockHeader) bool { // SignatureData returns the newBlock's bytes with a null signature field for // signature creation and verification -func (b *BlockHeader) SignatureData() []byte { +func (b *BlockHeader) SignatureData() ([]byte, error) { tmp := *b tmp.BlockSig = nil - tmp.cachedBytes = nil - tmp.cachedCid = cid.Undef - return tmp.ToNode().RawData() + return tmp.Serialize() } // Serialize serialize blockheader to binary func (b *BlockHeader) Serialize() ([]byte, error) { - if len(b.cachedBytes) == 0 { - buf := new(bytes.Buffer) - if err := b.MarshalCBOR(buf); err != nil { - return nil, err - } - - b.cachedBytes = buf.Bytes() + buf := new(bytes.Buffer) + if err := b.MarshalCBOR(buf); err != nil { + return nil, err } - return b.cachedBytes, nil + return buf.Bytes(), nil } -// ToStorageBlock convert blockheader to data block with cid -func (b *BlockHeader) ToStorageBlock() (blocks.Block, error) { +func (b *BlockHeader) SerializeWithCid() (cid.Cid, []byte, error) { data, err := b.Serialize() if err != nil { - return nil, err + return cid.Undef, nil, err } - c, err := b.cid() + c, err := abi.CidBuilder.Sum(data) + if err != nil { + return cid.Undef, nil, err + } + + return c, data, nil +} + +// ToStorageBlock convert blockheader to data block with cid +func (b *BlockHeader) ToStorageBlock() (blocks.Block, error) { + c, data, err := b.SerializeWithCid() if err != nil { return nil, err } diff --git a/venus-shared/chain/block_header_test.go b/venus-shared/chain/block_header_test.go index f158a10a6d..5c9978d115 100644 --- a/venus-shared/chain/block_header_test.go +++ b/venus-shared/chain/block_header_test.go @@ -31,17 +31,19 @@ func TestBlockHeaderMarshal(t *testing.T) { bh, err := DecodeBlock(b) assert.NoError(t, err, "decode block header") - // make sure cached bytes during decoding will not influence the following tests - bh.cachedBytes = nil assert.Equal(t, maddr, bh.Miner, "check for miner") - assert.Equal(t, signb, bh.SignatureData(), "check for signature data") + signdata, err := bh.SignatureData() + assert.NoError(t, err, "call bh.SignatureData") + assert.Equal(t, signb, signdata, "check for signature data") - blk, err := bh.ToStorageBlock() - assert.NoError(t, err, "ToStorageBlock") + assert.Equal(t, c, bh.Cid(), "check for bh.Cid()") + serialized, err := bh.Serialize() + assert.NoError(t, err, "call bh.Serialize") + assert.Equal(t, b, serialized, "check for bh.Serialize()") - assert.Equal(t, c, bh.cachedCid, "check for cachedCid") - assert.Equal(t, b, bh.cachedBytes, "check for cachedBytes") + blk, err := bh.ToStorageBlock() + assert.NoError(t, err, "call bh.ToStorageBlock") assert.Equal(t, c, blk.Cid(), "check for blk.Cid()") assert.Equal(t, b, blk.RawData(), "check for blk.RawData()") From deff16e317c99955ba36a21504541a495581c998 Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 16 Nov 2021 11:36:00 +0800 Subject: [PATCH 006/167] feat: add more types --- venus-devtool/cborgen/main.go | 2 + venus-shared/{bigint => chain}/bigint.go | 2 +- venus-shared/chain/bigint_fil.go | 143 +++++++++ venus-shared/chain/bigint_fil_test.go | 131 ++++++++ venus-shared/{bigint => chain}/bigint_test.go | 2 +- venus-shared/chain/bigint_unit.go | 38 +++ venus-shared/chain/bigint_unit_test.go | 57 ++++ venus-shared/chain/block_header.go | 7 +- venus-shared/chain/cbor_gen.go | 298 ++++++++++++++++++ venus-shared/chain/election_proof.go | 13 +- venus-shared/chain/message.go | 128 ++++++++ venus-shared/chain/param.go | 9 + venus-shared/chain/params/chain.go | 8 + venus-shared/chain/params/circulating.go | 7 + venus-shared/chain/signed_message.go | 104 ++++++ venus-shared/constants/chain.go | 8 - 16 files changed, 937 insertions(+), 20 deletions(-) rename venus-shared/{bigint => chain}/bigint.go (98%) create mode 100644 venus-shared/chain/bigint_fil.go create mode 100644 venus-shared/chain/bigint_fil_test.go rename venus-shared/{bigint => chain}/bigint_test.go (97%) create mode 100644 venus-shared/chain/bigint_unit.go create mode 100644 venus-shared/chain/bigint_unit_test.go create mode 100644 venus-shared/chain/message.go create mode 100644 venus-shared/chain/param.go create mode 100644 venus-shared/chain/params/chain.go create mode 100644 venus-shared/chain/params/circulating.go create mode 100644 venus-shared/chain/signed_message.go delete mode 100644 venus-shared/constants/chain.go diff --git a/venus-devtool/cborgen/main.go b/venus-devtool/cborgen/main.go index 63af4a2262..85c37ba8e5 100644 --- a/venus-devtool/cborgen/main.go +++ b/venus-devtool/cborgen/main.go @@ -32,6 +32,8 @@ func main() { chain.Ticket{}, chain.ElectionProof{}, chain.BeaconEntry{}, + chain.Message{}, + chain.SignedMessage{}, }, }, } diff --git a/venus-shared/bigint/bigint.go b/venus-shared/chain/bigint.go similarity index 98% rename from venus-shared/bigint/bigint.go rename to venus-shared/chain/bigint.go index 86d89adbab..1baecc9d80 100644 --- a/venus-shared/bigint/bigint.go +++ b/venus-shared/chain/bigint.go @@ -1,4 +1,4 @@ -package bigint +package chain import ( "fmt" diff --git a/venus-shared/chain/bigint_fil.go b/venus-shared/chain/bigint_fil.go new file mode 100644 index 0000000000..f91e1c1db8 --- /dev/null +++ b/venus-shared/chain/bigint_fil.go @@ -0,0 +1,143 @@ +package chain + +import ( + "encoding" + "fmt" + "math/big" + "strings" + + fbig "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/venus/venus-shared/chain/params" +) + +var ZeroFIL = fbig.NewInt(0) + +type FIL BigInt + +func (f FIL) String() string { + return f.Unitless() + " FIL" +} + +var AttoFil = NewInt(1) +var FemtoFil = BigMul(AttoFil, NewInt(1000)) +var PicoFil = BigMul(FemtoFil, NewInt(1000)) +var NanoFil = BigMul(PicoFil, NewInt(1000)) + +func (f FIL) Unitless() string { + r := new(big.Rat).SetFrac(f.Int, big.NewInt(int64(params.FilecoinPrecision))) + if r.Sign() == 0 { + return "0" + } + return strings.TrimRight(strings.TrimRight(r.FloatString(18), "0"), ".") +} + +var unitPrefixes = []string{"a", "f", "p", "n", "μ", "m"} + +func (f FIL) Short() string { + n := BigInt(f).Abs() + + dn := uint64(1) + var prefix string + for _, p := range unitPrefixes { + if n.LessThan(NewInt(dn * 1000)) { + prefix = p + break + } + dn *= 1000 + } + + r := new(big.Rat).SetFrac(f.Int, big.NewInt(int64(dn))) + if r.Sign() == 0 { + return "0" + } + + return strings.TrimRight(strings.TrimRight(r.FloatString(3), "0"), ".") + " " + prefix + "FIL" +} + +func (f FIL) Nano() string { + r := new(big.Rat).SetFrac(f.Int, big.NewInt(int64(1e9))) + if r.Sign() == 0 { + return "0" + } + + return strings.TrimRight(strings.TrimRight(r.FloatString(9), "0"), ".") + " nFIL" +} + +func (f FIL) Format(s fmt.State, ch rune) { + switch ch { + case 's', 'v': + fmt.Fprint(s, f.String()) + default: + f.Int.Format(s, ch) + } +} + +func (f FIL) MarshalText() (text []byte, err error) { + return []byte(f.String()), nil +} + +func (f FIL) UnmarshalText(text []byte) error { + p, err := ParseFIL(string(text)) + if err != nil { + return err + } + + f.Int.Set(p.Int) + return nil +} + +func ParseFIL(s string) (FIL, error) { + suffix := strings.TrimLeft(s, "-.1234567890") + s = s[:len(s)-len(suffix)] + var attofil bool + if suffix != "" { + norm := strings.ToLower(strings.TrimSpace(suffix)) + switch norm { + case "", "fil": + case "attofil", "afil": + attofil = true + default: + return FIL{}, fmt.Errorf("unrecognized suffix: %q", suffix) + } + } + + if len(s) > 50 { + return FIL{}, fmt.Errorf("string length too large: %d", len(s)) + } + + r, ok := new(big.Rat).SetString(s) + if !ok { + return FIL{}, fmt.Errorf("failed to parse %q as a decimal number", s) + } + + if !attofil { + r = r.Mul(r, big.NewRat(int64(params.FilecoinPrecision), 1)) + } + + if !r.IsInt() { + var pref string + if attofil { + pref = "atto" + } + return FIL{}, fmt.Errorf("invalid %sFIL value: %q", pref, s) + } + + return FIL{r.Num()}, nil +} + +func MustParseFIL(s string) FIL { + n, err := ParseFIL(s) + if err != nil { + panic(err) + } + + return n +} + +func FromFil(i uint64) BigInt { + return BigMul(NewInt(i), NewInt(params.FilecoinPrecision)) +} + +var _ encoding.TextMarshaler = (*FIL)(nil) +var _ encoding.TextUnmarshaler = (*FIL)(nil) diff --git a/venus-shared/chain/bigint_fil_test.go b/venus-shared/chain/bigint_fil_test.go new file mode 100644 index 0000000000..f7caf329e4 --- /dev/null +++ b/venus-shared/chain/bigint_fil_test.go @@ -0,0 +1,131 @@ +package chain + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestFilRoundTrip(t *testing.T) { + testValues := []string{ + "0 FIL", "1 FIL", "1.001 FIL", "100.10001 FIL", "101100 FIL", "5000.01 FIL", "5000 FIL", + } + + for _, v := range testValues { + fval, err := ParseFIL(v) + if err != nil { + t.Fatal(err) + } + + if fval.String() != v { + t.Fatal("mismatch in values!", v, fval.String()) + } + } +} + +func TestFilShort(t *testing.T) { + for _, s := range []struct { + fil string + expect string + }{ + + {fil: "1", expect: "1 FIL"}, + {fil: "1.1", expect: "1.1 FIL"}, + {fil: "12", expect: "12 FIL"}, + {fil: "123", expect: "123 FIL"}, + {fil: "123456", expect: "123456 FIL"}, + {fil: "123.23", expect: "123.23 FIL"}, + {fil: "123456.234", expect: "123456.234 FIL"}, + {fil: "123456.2341234", expect: "123456.234 FIL"}, + {fil: "123456.234123445", expect: "123456.234 FIL"}, + + {fil: "0.1", expect: "100 mFIL"}, + {fil: "0.01", expect: "10 mFIL"}, + {fil: "0.001", expect: "1 mFIL"}, + + {fil: "0.0001", expect: "100 μFIL"}, + {fil: "0.00001", expect: "10 μFIL"}, + {fil: "0.000001", expect: "1 μFIL"}, + + {fil: "0.0000001", expect: "100 nFIL"}, + {fil: "0.00000001", expect: "10 nFIL"}, + {fil: "0.000000001", expect: "1 nFIL"}, + + {fil: "0.0000000001", expect: "100 pFIL"}, + {fil: "0.00000000001", expect: "10 pFIL"}, + {fil: "0.000000000001", expect: "1 pFIL"}, + + {fil: "0.0000000000001", expect: "100 fFIL"}, + {fil: "0.00000000000001", expect: "10 fFIL"}, + {fil: "0.000000000000001", expect: "1 fFIL"}, + + {fil: "0.0000000000000001", expect: "100 aFIL"}, + {fil: "0.00000000000000001", expect: "10 aFIL"}, + {fil: "0.000000000000000001", expect: "1 aFIL"}, + + {fil: "0.0000012", expect: "1.2 μFIL"}, + {fil: "0.00000123", expect: "1.23 μFIL"}, + {fil: "0.000001234", expect: "1.234 μFIL"}, + {fil: "0.0000012344", expect: "1.234 μFIL"}, + {fil: "0.00000123444", expect: "1.234 μFIL"}, + + {fil: "0.0002212", expect: "221.2 μFIL"}, + {fil: "0.00022123", expect: "221.23 μFIL"}, + {fil: "0.000221234", expect: "221.234 μFIL"}, + {fil: "0.0002212344", expect: "221.234 μFIL"}, + {fil: "0.00022123444", expect: "221.234 μFIL"}, + + {fil: "-1", expect: "-1 FIL"}, + {fil: "-1.1", expect: "-1.1 FIL"}, + {fil: "-12", expect: "-12 FIL"}, + {fil: "-123", expect: "-123 FIL"}, + {fil: "-123456", expect: "-123456 FIL"}, + {fil: "-123.23", expect: "-123.23 FIL"}, + {fil: "-123456.234", expect: "-123456.234 FIL"}, + {fil: "-123456.2341234", expect: "-123456.234 FIL"}, + {fil: "-123456.234123445", expect: "-123456.234 FIL"}, + + {fil: "-0.1", expect: "-100 mFIL"}, + {fil: "-0.01", expect: "-10 mFIL"}, + {fil: "-0.001", expect: "-1 mFIL"}, + + {fil: "-0.0001", expect: "-100 μFIL"}, + {fil: "-0.00001", expect: "-10 μFIL"}, + {fil: "-0.000001", expect: "-1 μFIL"}, + + {fil: "-0.0000001", expect: "-100 nFIL"}, + {fil: "-0.00000001", expect: "-10 nFIL"}, + {fil: "-0.000000001", expect: "-1 nFIL"}, + + {fil: "-0.0000000001", expect: "-100 pFIL"}, + {fil: "-0.00000000001", expect: "-10 pFIL"}, + {fil: "-0.000000000001", expect: "-1 pFIL"}, + + {fil: "-0.0000000000001", expect: "-100 fFIL"}, + {fil: "-0.00000000000001", expect: "-10 fFIL"}, + {fil: "-0.000000000000001", expect: "-1 fFIL"}, + + {fil: "-0.0000000000000001", expect: "-100 aFIL"}, + {fil: "-0.00000000000000001", expect: "-10 aFIL"}, + {fil: "-0.000000000000000001", expect: "-1 aFIL"}, + + {fil: "-0.0000012", expect: "-1.2 μFIL"}, + {fil: "-0.00000123", expect: "-1.23 μFIL"}, + {fil: "-0.000001234", expect: "-1.234 μFIL"}, + {fil: "-0.0000012344", expect: "-1.234 μFIL"}, + {fil: "-0.00000123444", expect: "-1.234 μFIL"}, + + {fil: "-0.0002212", expect: "-221.2 μFIL"}, + {fil: "-0.00022123", expect: "-221.23 μFIL"}, + {fil: "-0.000221234", expect: "-221.234 μFIL"}, + {fil: "-0.0002212344", expect: "-221.234 μFIL"}, + {fil: "-0.00022123444", expect: "-221.234 μFIL"}, + } { + s := s + t.Run(s.fil, func(t *testing.T) { + f, err := ParseFIL(s.fil) + require.NoError(t, err) + require.Equal(t, s.expect, f.Short()) + }) + } +} diff --git a/venus-shared/bigint/bigint_test.go b/venus-shared/chain/bigint_test.go similarity index 97% rename from venus-shared/bigint/bigint_test.go rename to venus-shared/chain/bigint_test.go index 85de45356e..86ff1fc44d 100644 --- a/venus-shared/bigint/bigint_test.go +++ b/venus-shared/chain/bigint_test.go @@ -1,4 +1,4 @@ -package bigint +package chain import ( "bytes" diff --git a/venus-shared/chain/bigint_unit.go b/venus-shared/chain/bigint_unit.go new file mode 100644 index 0000000000..4c2d0c4e7f --- /dev/null +++ b/venus-shared/chain/bigint_unit.go @@ -0,0 +1,38 @@ +package chain + +import ( + "fmt" + "math/big" +) + +var byteSizeUnits = []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB"} + +func SizeStr(bi BigInt) string { + r := new(big.Rat).SetInt(bi.Int) + den := big.NewRat(1, 1024) + + var i int + for f, _ := r.Float64(); f >= 1024 && i+1 < len(byteSizeUnits); f, _ = r.Float64() { + i++ + r = r.Mul(r, den) + } + + f, _ := r.Float64() + return fmt.Sprintf("%.4g %s", f, byteSizeUnits[i]) +} + +var deciUnits = []string{"", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"} + +func DeciStr(bi BigInt) string { + r := new(big.Rat).SetInt(bi.Int) + den := big.NewRat(1, 1024) + + var i int + for f, _ := r.Float64(); f >= 1024 && i+1 < len(deciUnits); f, _ = r.Float64() { + i++ + r = r.Mul(r, den) + } + + f, _ := r.Float64() + return fmt.Sprintf("%.3g %s", f, deciUnits[i]) +} diff --git a/venus-shared/chain/bigint_unit_test.go b/venus-shared/chain/bigint_unit_test.go new file mode 100644 index 0000000000..d153df2cf0 --- /dev/null +++ b/venus-shared/chain/bigint_unit_test.go @@ -0,0 +1,57 @@ +package chain + +import ( + "math/big" + "math/rand" + "strings" + "testing" + "time" + + "github.com/docker/go-units" + + "github.com/stretchr/testify/assert" +) + +func TestSizeStr(t *testing.T) { + cases := []struct { + in uint64 + out string + }{ + {0, "0 B"}, + {1, "1 B"}, + {1016, "1016 B"}, + {1024, "1 KiB"}, + {1000 * 1024, "1000 KiB"}, + {2000, "1.953 KiB"}, + {5 << 20, "5 MiB"}, + {11 << 60, "11 EiB"}, + } + + for _, c := range cases { + assert.Equal(t, c.out, SizeStr(NewInt(c.in)), "input %+v, produced wrong result", c) + } +} + +func TestSizeStrUnitsSymmetry(t *testing.T) { + s := rand.NewSource(time.Now().UnixNano()) + r := rand.New(s) + + for i := 0; i < 10000; i++ { + n := r.Uint64() + l := strings.ReplaceAll(units.BytesSize(float64(n)), " ", "") + r := strings.ReplaceAll(SizeStr(NewInt(n)), " ", "") + + assert.NotContains(t, l, "e+") + assert.NotContains(t, r, "e+") + + assert.Equal(t, l, r, "wrong formatting for %d", n) + } +} + +func TestSizeStrBig(t *testing.T) { + ZiB := big.NewInt(50000) + ZiB = ZiB.Lsh(ZiB, 70) + + assert.Equal(t, "5e+04 ZiB", SizeStr(BigInt{Int: ZiB}), "inout %+v, produced wrong result", ZiB) + +} diff --git a/venus-shared/chain/block_header.go b/venus-shared/chain/block_header.go index 8eeb2576e1..542b595aaf 100644 --- a/venus-shared/chain/block_header.go +++ b/venus-shared/chain/block_header.go @@ -94,11 +94,16 @@ func (b *BlockHeader) Cid() cid.Cid { func (b *BlockHeader) String() string { errStr := "(error encoding BlockHeader)" - c := b.Cid() + c, _, err := b.SerializeWithCid() + if err != nil { + return errStr + } + js, err := json.MarshalIndent(b, "", " ") if err != nil { return errStr } + return fmt.Sprintf("BlockHeader cid=[%v]: %s", c, string(js)) } diff --git a/venus-shared/chain/cbor_gen.go b/venus-shared/chain/cbor_gen.go index d1e5dcb7ee..cd6b7b3d5a 100644 --- a/venus-shared/chain/cbor_gen.go +++ b/venus-shared/chain/cbor_gen.go @@ -708,3 +708,301 @@ func (t *BeaconEntry) UnmarshalCBOR(r io.Reader) error { } return nil } + +var lengthBufMessage = []byte{138} + +func (t *Message) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufMessage); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Version (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Version)); err != nil { + return err + } + + // t.To (address.Address) (struct) + if err := t.To.MarshalCBOR(w); err != nil { + return err + } + + // t.From (address.Address) (struct) + if err := t.From.MarshalCBOR(w); err != nil { + return err + } + + // t.Nonce (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Nonce)); err != nil { + return err + } + + // t.Value (big.Int) (struct) + if err := t.Value.MarshalCBOR(w); err != nil { + return err + } + + // t.GasLimit (int64) (int64) + if t.GasLimit >= 0 { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.GasLimit)); err != nil { + return err + } + } else { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.GasLimit-1)); err != nil { + return err + } + } + + // t.GasFeeCap (big.Int) (struct) + if err := t.GasFeeCap.MarshalCBOR(w); err != nil { + return err + } + + // t.GasPremium (big.Int) (struct) + if err := t.GasPremium.MarshalCBOR(w); err != nil { + return err + } + + // t.Method (abi.MethodNum) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Method)); err != nil { + return err + } + + // t.Params ([]uint8) (slice) + if len(t.Params) > cbg.ByteArrayMaxLen { + return xerrors.Errorf("Byte array in field t.Params was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.Params))); err != nil { + return err + } + + if _, err := w.Write(t.Params[:]); err != nil { + return err + } + return nil +} + +func (t *Message) UnmarshalCBOR(r io.Reader) error { + *t = Message{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 10 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Version (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Version = uint64(extra) + + } + // t.To (address.Address) (struct) + + { + + if err := t.To.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.To: %w", err) + } + + } + // t.From (address.Address) (struct) + + { + + if err := t.From.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.From: %w", err) + } + + } + // t.Nonce (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Nonce = uint64(extra) + + } + // t.Value (big.Int) (struct) + + { + + if err := t.Value.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Value: %w", err) + } + + } + // t.GasLimit (int64) (int64) + { + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.GasLimit = int64(extraI) + } + // t.GasFeeCap (big.Int) (struct) + + { + + if err := t.GasFeeCap.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.GasFeeCap: %w", err) + } + + } + // t.GasPremium (big.Int) (struct) + + { + + if err := t.GasPremium.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.GasPremium: %w", err) + } + + } + // t.Method (abi.MethodNum) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Method = abi.MethodNum(extra) + + } + // t.Params ([]uint8) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.ByteArrayMaxLen { + return fmt.Errorf("t.Params: byte array too large (%d)", extra) + } + if maj != cbg.MajByteString { + return fmt.Errorf("expected byte array") + } + + if extra > 0 { + t.Params = make([]uint8, extra) + } + + if _, err := io.ReadFull(br, t.Params[:]); err != nil { + return err + } + return nil +} + +var lengthBufSignedMessage = []byte{130} + +func (t *SignedMessage) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufSignedMessage); err != nil { + return err + } + + // t.Message (chain.Message) (struct) + if err := t.Message.MarshalCBOR(w); err != nil { + return err + } + + // t.Signature (crypto.Signature) (struct) + if err := t.Signature.MarshalCBOR(w); err != nil { + return err + } + return nil +} + +func (t *SignedMessage) UnmarshalCBOR(r io.Reader) error { + *t = SignedMessage{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 2 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Message (chain.Message) (struct) + + { + + if err := t.Message.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Message: %w", err) + } + + } + // t.Signature (crypto.Signature) (struct) + + { + + if err := t.Signature.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Signature: %w", err) + } + + } + return nil +} diff --git a/venus-shared/chain/election_proof.go b/venus-shared/chain/election_proof.go index 48497d0586..ee8a50c691 100644 --- a/venus-shared/chain/election_proof.go +++ b/venus-shared/chain/election_proof.go @@ -8,8 +8,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/minio/blake2b-simd" - "github.com/filecoin-project/venus/venus-shared/bigint" - "github.com/filecoin-project/venus/venus-shared/constants" + "github.com/filecoin-project/venus/venus-shared/chain/params" ) // A Ticket is a marker of a tick of the blockchain's clock. It is the source @@ -37,7 +36,7 @@ func (t *Ticket) Less(o *Ticket) bool { func (t *Ticket) Quality() float64 { ticketHash := blake2b.Sum256(t.VRFProof) - ticketNum := bigint.BigFromBytes(ticketHash[:]).Int + ticketNum := BigFromBytes(ticketHash[:]).Int ticketDenu := big.NewInt(1) ticketDenu.Lsh(ticketDenu, 256) tv, _ := new(big.Rat).SetFrac(ticketNum, ticketDenu).Float64() @@ -63,8 +62,6 @@ type ElectionProof struct { const precision = 256 -var blocksPerEpoch = big.NewInt(0).SetUint64(constants.BlocksPerEpoch) - var ( expNumCoef []*big.Int expDenoCoef []*big.Int @@ -150,14 +147,12 @@ func polyval(p []*big.Int, x *big.Int) *big.Int { // computes lambda in Q.256 func lambda(power, totalPower *big.Int) *big.Int { - lam := new(big.Int).Mul(power, blocksPerEpoch) // Q.0 + lam := new(big.Int).Mul(power, blocksPerEpochBig) // Q.0 lam = lam.Lsh(lam, precision) // Q.256 lam = lam.Div(lam /* Q.256 */, totalPower /* Q.0 */) // Q.256 return lam } -var MaxWinCount = 3 * int64(constants.BlocksPerEpoch) - type poiss struct { lam *big.Int pmf *big.Int @@ -247,7 +242,7 @@ func (ep *ElectionProof) ComputeWinCount(power abi.StoragePower, totalPower abi. p, rhs := newPoiss(lam) var j int64 - for lhs.Cmp(rhs) < 0 && j < MaxWinCount { + for lhs.Cmp(rhs) < 0 && j < params.MaxWinCount { rhs = p.next() j++ } diff --git a/venus-shared/chain/message.go b/venus-shared/chain/message.go new file mode 100644 index 0000000000..65affd4701 --- /dev/null +++ b/venus-shared/chain/message.go @@ -0,0 +1,128 @@ +package chain + +import ( + "bytes" + "encoding/json" + "fmt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" +) + +const MessageVersion = 0 + +func DecodeMessage(b []byte) (*Message, error) { + var msg Message + if err := msg.UnmarshalCBOR(bytes.NewReader(b)); err != nil { + return nil, err + } + + if msg.Version != MessageVersion { + return nil, fmt.Errorf("decoded message had incorrect version (%d)", msg.Version) + } + + return &msg, nil +} + +type Message struct { + Version uint64 + + To address.Address + From address.Address + // When receiving a message from a user account the nonce in + // the message must match the expected nonce in the from actor. + // This prevents replay attacks. + Nonce uint64 + + Value abi.TokenAmount + + GasLimit int64 + GasFeeCap abi.TokenAmount + GasPremium abi.TokenAmount + + Method abi.MethodNum + Params []byte +} + +func (m *Message) Serialize() ([]byte, error) { + buf := new(bytes.Buffer) + if err := m.MarshalCBOR(buf); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +func (m *Message) SerializeWithCid() (cid.Cid, []byte, error) { + data, err := m.Serialize() + if err != nil { + return cid.Undef, nil, err + } + + c, err := abi.CidBuilder.Sum(data) + if err != nil { + return cid.Undef, nil, err + } + + return c, data, nil +} + +func (m *Message) ToStorageBlock() (blocks.Block, error) { + c, data, err := m.SerializeWithCid() + if err != nil { + return nil, err + } + + return blocks.NewBlockWithCid(data, c) +} + +func (m *Message) Cid() cid.Cid { + c, _, err := m.SerializeWithCid() + if err != nil { + panic(err) + } + + return c +} + +func (m *Message) String() string { + errStr := "(error encoding Message)" + c, _, err := m.SerializeWithCid() + if err != nil { + return errStr + } + + js, err := json.MarshalIndent(m, "", " ") + if err != nil { + return errStr + } + + return fmt.Sprintf("Message cid=[%v]: %s", c, string(js)) +} + +func (m *Message) ChainLength() int { + ser, err := m.Serialize() + if err != nil { + panic(err) + } + + return len(ser) +} + +func (m *Message) Equals(o *Message) bool { + return m.Cid() == o.Cid() +} + +func (m *Message) EqualCall(o *Message) bool { + m1 := *m + m2 := *o + + m1.GasLimit, m2.GasLimit = 0, 0 + m1.GasFeeCap, m2.GasFeeCap = big.Zero(), big.Zero() + m1.GasPremium, m2.GasPremium = big.Zero(), big.Zero() + + return (&m1).Equals(&m2) +} diff --git a/venus-shared/chain/param.go b/venus-shared/chain/param.go new file mode 100644 index 0000000000..313de8c0b2 --- /dev/null +++ b/venus-shared/chain/param.go @@ -0,0 +1,9 @@ +package chain + +import ( + "math/big" + + "github.com/filecoin-project/venus/venus-shared/chain/params" +) + +var blocksPerEpochBig = big.NewInt(0).SetUint64(params.BlocksPerEpoch) diff --git a/venus-shared/chain/params/chain.go b/venus-shared/chain/params/chain.go new file mode 100644 index 0000000000..84b365afcc --- /dev/null +++ b/venus-shared/chain/params/chain.go @@ -0,0 +1,8 @@ +package params + +import ( + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" +) + +var BlocksPerEpoch = uint64(builtin0.ExpectedLeadersPerEpoch) +var MaxWinCount = 3 * int64(BlocksPerEpoch) diff --git a/venus-shared/chain/params/circulating.go b/venus-shared/chain/params/circulating.go new file mode 100644 index 0000000000..5d774b3740 --- /dev/null +++ b/venus-shared/chain/params/circulating.go @@ -0,0 +1,7 @@ +package params + +const FilBase = uint64(2_000_000_000) +const FilAllocStorageMining = uint64(1_100_000_000) + +const FilecoinPrecision = uint64(1_000_000_000_000_000_000) +const FilReserved = uint64(300_000_000) diff --git a/venus-shared/chain/signed_message.go b/venus-shared/chain/signed_message.go new file mode 100644 index 0000000000..3506daa99c --- /dev/null +++ b/venus-shared/chain/signed_message.go @@ -0,0 +1,104 @@ +package chain + +import ( + "bytes" + "encoding/json" + "fmt" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/crypto" + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" +) + +// SignedMessage contains a message and its signature +type SignedMessage struct { + Message Message + Signature crypto.Signature +} + +func (smsg *SignedMessage) ChainLength() int { + var data []byte + var err error + if smsg.Signature.Type == crypto.SigTypeBLS { + data, err = smsg.Message.Serialize() + } else { + data, err = smsg.Serialize() + } + + if err != nil { + panic(err) + } + + return len(data) +} + +// Serialize return message binary +func (smsg *SignedMessage) Serialize() ([]byte, error) { + buf := new(bytes.Buffer) + if err := smsg.MarshalCBOR(buf); err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// Serialize return message binary +func (smsg *SignedMessage) SerializeWithCid() (cid.Cid, []byte, error) { + data, err := smsg.Serialize() + if err != nil { + return cid.Undef, nil, err + } + + c, err := abi.CidBuilder.Sum(data) + if err != nil { + return cid.Undef, nil, err + } + + return c, data, nil +} + +func (smsg *SignedMessage) ToStorageBlock() (blocks.Block, error) { + var c cid.Cid + var data []byte + var err error + if smsg.Signature.Type == crypto.SigTypeBLS { + c, data, err = smsg.Message.SerializeWithCid() + } else { + c, data, err = smsg.SerializeWithCid() + } + + if err != nil { + return nil, err + } + + return blocks.NewBlockWithCid(data, c) +} + +func (smsg *SignedMessage) Cid() cid.Cid { + if smsg.Signature.Type == crypto.SigTypeBLS { + return smsg.Message.Cid() + } + + c, _, err := smsg.SerializeWithCid() + if err != nil { + panic(fmt.Errorf("failed to marshal signed-message: %w", err)) + } + + return c +} + +// String return message json string +func (smsg *SignedMessage) String() string { + errStr := "(error encoding SignedMessage)" + c, _, err := smsg.SerializeWithCid() + if err != nil { + return errStr + } + + js, err := json.MarshalIndent(smsg, "", " ") + if err != nil { + return errStr + } + + return fmt.Sprintf("SignedMessage cid=[%v]: %s", c, string(js)) +} diff --git a/venus-shared/constants/chain.go b/venus-shared/constants/chain.go deleted file mode 100644 index a6490284a5..0000000000 --- a/venus-shared/constants/chain.go +++ /dev/null @@ -1,8 +0,0 @@ -package constants - -import ( - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" -) - -// Blocks (e) -var BlocksPerEpoch = uint64(builtin2.ExpectedLeadersPerEpoch) From b3ab9a4c0f964b8a82652fb57b9f0dc567da8d8b Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 16 Nov 2021 15:58:49 +0800 Subject: [PATCH 007/167] feat: more types in venus-shared/chain --- venus-devtool/cborgen/main.go | 5 + venus-shared/chain/actor.go | 35 ++ venus-shared/chain/block_msg.go | 28 ++ venus-shared/chain/cbor_gen.go | 623 ++++++++++++++++++++++++++ venus-shared/chain/message_receipt.go | 26 ++ venus-shared/chain/message_root.go | 55 +++ venus-shared/chain/tipset.go | 278 ++++++++++++ venus-shared/chain/tipset_key.go | 126 ++++++ venus-shared/chain/tipset_marshal.go | 70 +++ 9 files changed, 1246 insertions(+) create mode 100644 venus-shared/chain/actor.go create mode 100644 venus-shared/chain/block_msg.go create mode 100644 venus-shared/chain/message_receipt.go create mode 100644 venus-shared/chain/message_root.go create mode 100644 venus-shared/chain/tipset.go create mode 100644 venus-shared/chain/tipset_key.go create mode 100644 venus-shared/chain/tipset_marshal.go diff --git a/venus-devtool/cborgen/main.go b/venus-devtool/cborgen/main.go index 85c37ba8e5..7383e40754 100644 --- a/venus-devtool/cborgen/main.go +++ b/venus-devtool/cborgen/main.go @@ -34,6 +34,11 @@ func main() { chain.BeaconEntry{}, chain.Message{}, chain.SignedMessage{}, + chain.Actor{}, + chain.MessageRoot{}, + chain.MessageReceipt{}, + chain.BlockMsg{}, + chain.ExpTipSet{}, }, }, } diff --git a/venus-shared/chain/actor.go b/venus-shared/chain/actor.go new file mode 100644 index 0000000000..b38937cc86 --- /dev/null +++ b/venus-shared/chain/actor.go @@ -0,0 +1,35 @@ +package chain + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" +) + +// Actor is the central abstraction of entities in the system. +// +// Both individual accounts, as well as contracts (user & system level) are +// represented as actors. An actor has the following core functionality implemented on a system level: +// - track a Filecoin balance, using the `Balance` field +// - execute code stored in the `Code` field +// - read & write memory +// - replay protection, using the `Nonce` field +// +// Value sent to a non-existent address will be tracked as an empty actor that has a Balance but +// nil Code and Memory. You must nil check Code cids before comparing them. +// +// More specific capabilities for individual accounts or contract specific must be implemented +// inside the code. +// +// Not safe for concurrent access. +type Actor struct { + // Code is a CID of the VM code for this actor's implementation (or a constant for actors implemented in Go code). + // Code may be nil for an uninitialized actor (which exists because it has received a balance). + Code cid.Cid + // Head is the CID of the root of the actor's state tree. + Head cid.Cid + // Nonce is the number expected on the next message from this actor. + // Messages are processed in strict, contiguous order. + Nonce uint64 + // Balance is the amount of attoFIL in the actor's account. + Balance abi.TokenAmount +} diff --git a/venus-shared/chain/block_msg.go b/venus-shared/chain/block_msg.go new file mode 100644 index 0000000000..078651998a --- /dev/null +++ b/venus-shared/chain/block_msg.go @@ -0,0 +1,28 @@ +package chain + +import ( + "bytes" + + "github.com/ipfs/go-cid" +) + +type BlockMsg struct { // nolint: golint + Header *BlockHeader + BlsMessages []cid.Cid + SecpkMessages []cid.Cid +} + +// Cid return block cid +func (bm *BlockMsg) Cid() cid.Cid { + return bm.Header.Cid() +} + +// Serialize return blockmsg binary +func (bm *BlockMsg) Serialize() ([]byte, error) { + buf := new(bytes.Buffer) + if err := bm.MarshalCBOR(buf); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} diff --git a/venus-shared/chain/cbor_gen.go b/venus-shared/chain/cbor_gen.go index cd6b7b3d5a..d2bceb8334 100644 --- a/venus-shared/chain/cbor_gen.go +++ b/venus-shared/chain/cbor_gen.go @@ -10,6 +10,7 @@ import ( abi "github.com/filecoin-project/go-state-types/abi" crypto "github.com/filecoin-project/go-state-types/crypto" + exitcode "github.com/filecoin-project/go-state-types/exitcode" proof "github.com/filecoin-project/specs-actors/actors/runtime/proof" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" @@ -1006,3 +1007,625 @@ func (t *SignedMessage) UnmarshalCBOR(r io.Reader) error { } return nil } + +var lengthBufActor = []byte{132} + +func (t *Actor) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufActor); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Code (cid.Cid) (struct) + + if err := cbg.WriteCidBuf(scratch, w, t.Code); err != nil { + return xerrors.Errorf("failed to write cid field t.Code: %w", err) + } + + // t.Head (cid.Cid) (struct) + + if err := cbg.WriteCidBuf(scratch, w, t.Head); err != nil { + return xerrors.Errorf("failed to write cid field t.Head: %w", err) + } + + // t.Nonce (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Nonce)); err != nil { + return err + } + + // t.Balance (big.Int) (struct) + if err := t.Balance.MarshalCBOR(w); err != nil { + return err + } + return nil +} + +func (t *Actor) UnmarshalCBOR(r io.Reader) error { + *t = Actor{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 4 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Code (cid.Cid) (struct) + + { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.Code: %w", err) + } + + t.Code = c + + } + // t.Head (cid.Cid) (struct) + + { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.Head: %w", err) + } + + t.Head = c + + } + // t.Nonce (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Nonce = uint64(extra) + + } + // t.Balance (big.Int) (struct) + + { + + if err := t.Balance.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Balance: %w", err) + } + + } + return nil +} + +var lengthBufMessageRoot = []byte{130} + +func (t *MessageRoot) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufMessageRoot); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.BlsRoot (cid.Cid) (struct) + + if err := cbg.WriteCidBuf(scratch, w, t.BlsRoot); err != nil { + return xerrors.Errorf("failed to write cid field t.BlsRoot: %w", err) + } + + // t.SecpkRoot (cid.Cid) (struct) + + if err := cbg.WriteCidBuf(scratch, w, t.SecpkRoot); err != nil { + return xerrors.Errorf("failed to write cid field t.SecpkRoot: %w", err) + } + + return nil +} + +func (t *MessageRoot) UnmarshalCBOR(r io.Reader) error { + *t = MessageRoot{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 2 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.BlsRoot (cid.Cid) (struct) + + { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.BlsRoot: %w", err) + } + + t.BlsRoot = c + + } + // t.SecpkRoot (cid.Cid) (struct) + + { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.SecpkRoot: %w", err) + } + + t.SecpkRoot = c + + } + return nil +} + +var lengthBufMessageReceipt = []byte{131} + +func (t *MessageReceipt) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufMessageReceipt); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.ExitCode (exitcode.ExitCode) (int64) + if t.ExitCode >= 0 { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.ExitCode)); err != nil { + return err + } + } else { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.ExitCode-1)); err != nil { + return err + } + } + + // t.ReturnValue ([]uint8) (slice) + if len(t.ReturnValue) > cbg.ByteArrayMaxLen { + return xerrors.Errorf("Byte array in field t.ReturnValue was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.ReturnValue))); err != nil { + return err + } + + if _, err := w.Write(t.ReturnValue[:]); err != nil { + return err + } + + // t.GasUsed (int64) (int64) + if t.GasUsed >= 0 { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.GasUsed)); err != nil { + return err + } + } else { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.GasUsed-1)); err != nil { + return err + } + } + return nil +} + +func (t *MessageReceipt) UnmarshalCBOR(r io.Reader) error { + *t = MessageReceipt{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 3 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.ExitCode (exitcode.ExitCode) (int64) + { + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.ExitCode = exitcode.ExitCode(extraI) + } + // t.ReturnValue ([]uint8) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.ByteArrayMaxLen { + return fmt.Errorf("t.ReturnValue: byte array too large (%d)", extra) + } + if maj != cbg.MajByteString { + return fmt.Errorf("expected byte array") + } + + if extra > 0 { + t.ReturnValue = make([]uint8, extra) + } + + if _, err := io.ReadFull(br, t.ReturnValue[:]); err != nil { + return err + } + // t.GasUsed (int64) (int64) + { + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.GasUsed = int64(extraI) + } + return nil +} + +var lengthBufBlockMsg = []byte{131} + +func (t *BlockMsg) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufBlockMsg); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Header (chain.BlockHeader) (struct) + if err := t.Header.MarshalCBOR(w); err != nil { + return err + } + + // t.BlsMessages ([]cid.Cid) (slice) + if len(t.BlsMessages) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.BlsMessages was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.BlsMessages))); err != nil { + return err + } + for _, v := range t.BlsMessages { + if err := cbg.WriteCidBuf(scratch, w, v); err != nil { + return xerrors.Errorf("failed writing cid field t.BlsMessages: %w", err) + } + } + + // t.SecpkMessages ([]cid.Cid) (slice) + if len(t.SecpkMessages) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.SecpkMessages was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.SecpkMessages))); err != nil { + return err + } + for _, v := range t.SecpkMessages { + if err := cbg.WriteCidBuf(scratch, w, v); err != nil { + return xerrors.Errorf("failed writing cid field t.SecpkMessages: %w", err) + } + } + return nil +} + +func (t *BlockMsg) UnmarshalCBOR(r io.Reader) error { + *t = BlockMsg{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 3 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Header (chain.BlockHeader) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + t.Header = new(BlockHeader) + if err := t.Header.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Header pointer: %w", err) + } + } + + } + // t.BlsMessages ([]cid.Cid) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.BlsMessages: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.BlsMessages = make([]cid.Cid, extra) + } + + for i := 0; i < int(extra); i++ { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("reading cid field t.BlsMessages failed: %w", err) + } + t.BlsMessages[i] = c + } + + // t.SecpkMessages ([]cid.Cid) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.SecpkMessages: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.SecpkMessages = make([]cid.Cid, extra) + } + + for i := 0; i < int(extra); i++ { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("reading cid field t.SecpkMessages failed: %w", err) + } + t.SecpkMessages[i] = c + } + + return nil +} + +var lengthBufExpTipSet = []byte{131} + +func (t *ExpTipSet) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufExpTipSet); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Cids ([]cid.Cid) (slice) + if len(t.Cids) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Cids was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Cids))); err != nil { + return err + } + for _, v := range t.Cids { + if err := cbg.WriteCidBuf(scratch, w, v); err != nil { + return xerrors.Errorf("failed writing cid field t.Cids: %w", err) + } + } + + // t.Blocks ([]*chain.BlockHeader) (slice) + if len(t.Blocks) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Blocks was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Blocks))); err != nil { + return err + } + for _, v := range t.Blocks { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + + // t.Height (abi.ChainEpoch) (int64) + if t.Height >= 0 { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Height)); err != nil { + return err + } + } else { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.Height-1)); err != nil { + return err + } + } + return nil +} + +func (t *ExpTipSet) UnmarshalCBOR(r io.Reader) error { + *t = ExpTipSet{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 3 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Cids ([]cid.Cid) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Cids: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Cids = make([]cid.Cid, extra) + } + + for i := 0; i < int(extra); i++ { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("reading cid field t.Cids failed: %w", err) + } + t.Cids[i] = c + } + + // t.Blocks ([]*chain.BlockHeader) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Blocks: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Blocks = make([]*BlockHeader, extra) + } + + for i := 0; i < int(extra); i++ { + + var v BlockHeader + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.Blocks[i] = &v + } + + // t.Height (abi.ChainEpoch) (int64) + { + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.Height = abi.ChainEpoch(extraI) + } + return nil +} diff --git a/venus-shared/chain/message_receipt.go b/venus-shared/chain/message_receipt.go new file mode 100644 index 0000000000..c31d0e99e7 --- /dev/null +++ b/venus-shared/chain/message_receipt.go @@ -0,0 +1,26 @@ +package chain + +import ( + "encoding/json" + "fmt" + + "github.com/filecoin-project/go-state-types/exitcode" +) + +// MessageReceipt is what is returned by executing a message on the vm. +type MessageReceipt struct { + ExitCode exitcode.ExitCode + ReturnValue []byte + GasUsed int64 +} + +func (r *MessageReceipt) String() string { + errStr := "(error encoding MessageReceipt)" + + js, err := json.MarshalIndent(r, "", " ") + if err != nil { + return errStr + } + + return fmt.Sprintf("MessageReceipt: %s", string(js)) +} diff --git a/venus-shared/chain/message_root.go b/venus-shared/chain/message_root.go new file mode 100644 index 0000000000..39a0c30982 --- /dev/null +++ b/venus-shared/chain/message_root.go @@ -0,0 +1,55 @@ +package chain + +import ( + "bytes" + + "github.com/filecoin-project/go-state-types/abi" + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" +) + +type MessageRoot struct { + BlsRoot cid.Cid + SecpkRoot cid.Cid +} + +func (mr *MessageRoot) Serialize() ([]byte, error) { + buf := new(bytes.Buffer) + if err := mr.MarshalCBOR(buf); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +func (mr *MessageRoot) SerializeWithCid() (cid.Cid, []byte, error) { + data, err := mr.Serialize() + if err != nil { + return cid.Undef, nil, err + } + + c, err := abi.CidBuilder.Sum(data) + if err != nil { + return cid.Undef, nil, err + } + + return c, data, nil +} + +func (mr *MessageRoot) ToStorageBlock() (blocks.Block, error) { + c, data, err := mr.SerializeWithCid() + if err != nil { + return nil, err + } + + return blocks.NewBlockWithCid(data, c) +} + +func (mr *MessageRoot) Cid() cid.Cid { + c, _, err := mr.SerializeWithCid() + if err != nil { + panic(err) + } + + return c +} diff --git a/venus-shared/chain/tipset.go b/venus-shared/chain/tipset.go new file mode 100644 index 0000000000..74152439de --- /dev/null +++ b/venus-shared/chain/tipset.go @@ -0,0 +1,278 @@ +package chain + +import ( + "bytes" + "fmt" + "sort" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/ipfs/go-cid" +) + +type blockHeaderWithCid struct { + c cid.Cid + b *BlockHeader +} + +func NewTipSet(bhs []*BlockHeader) (*TipSet, error) { + if len(bhs) == 0 { + return nil, fmt.Errorf("no blocks for tipset") + } + + blks := make([]*blockHeaderWithCid, len(bhs)) + first := bhs[0] + blks[0] = &blockHeaderWithCid{ + c: first.Cid(), + b: first, + } + + seen := make(map[cid.Cid]struct{}) + seen[blks[0].c] = struct{}{} + + for i := 1; i < len(bhs); i++ { + blk := bhs[i] + if blk.Height != first.Height { + return nil, fmt.Errorf("inconsistent block heights %d and %d", first.Height, blk.Height) + } + + if !sortedCidArrsEqual(blk.Parents, first.Parents) { + return nil, fmt.Errorf("inconsistent block parents %s and %s", NewTipSetKey(first.Parents...), NewTipSetKey(blk.Parents...)) + } + + if !blk.ParentWeight.Equals(first.ParentWeight) { + return nil, fmt.Errorf("inconsistent block parent weights %d and %d", first.ParentWeight, blk.ParentWeight) + } + + bcid := blk.Cid() + if _, ok := seen[bcid]; ok { + return nil, fmt.Errorf("duplicate block %s", bcid) + } + + seen[bcid] = struct{}{} + blks[i] = &blockHeaderWithCid{ + c: bcid, + b: blk, + } + } + + sortBlockHeadersInTipSet(blks) + blocks := make([]*BlockHeader, len(blks)) + cids := make([]cid.Cid, len(blks)) + for i := range blks { + blocks[i] = blks[i].b + cids[i] = blks[i].c + } + + return &TipSet{ + blocks: blocks, + + key: NewTipSetKey(cids...), + cids: cids, + + height: first.Height, + + parentsKey: NewTipSetKey(first.Parents...), + }, nil +} + +// TipSet is a non-empty, immutable set of blocks at the same height with the same parent set. +// Blocks in a tipset are canonically ordered by ticket. Blocks may be iterated either via +// ToSlice() (which involves a shallow copy) or efficiently by index with At(). +// TipSet is a lightweight value type; passing by pointer is usually unnecessary. +// +// Canonical tipset newBlock ordering does not match the order of CIDs in a TipSetKey used as +// a tipset "key". +type TipSet struct { + // This slice is wrapped in a struct to enforce immutability. + blocks []*BlockHeader + // Key is computed at construction and cached. + key TipSetKey + cids []cid.Cid + + height abi.ChainEpoch + + parentsKey TipSetKey +} + +// Defined checks whether the tipset is defined. +// Invoking any other methods on an undefined tipset will result in undefined behaviour (c.f. cid.Undef) +func (ts *TipSet) Defined() bool { + return ts != nil && len(ts.blocks) > 0 +} + +func (ts *TipSet) Equals(ots *TipSet) bool { + if ts == nil && ots == nil { + return true + } + if ts == nil || ots == nil { + return false + } + + if ts.height != ots.height { + return false + } + + if len(ts.cids) != len(ots.cids) { + return false + } + + for i, cid := range ts.cids { + if cid != ots.cids[i] { + return false + } + } + + return true +} + +// Len returns the number of blocks in the tipset. +func (ts *TipSet) Len() int { + if ts == nil { + return 0 + } + return len(ts.blocks) +} + +func (ts *TipSet) Blocks() []*BlockHeader { + return ts.blocks +} + +// Key returns a key for the tipset. +func (ts *TipSet) Key() TipSetKey { + if ts == nil { + return EmptyTSK + } + return ts.key +} + +func (ts *TipSet) Cids() []cid.Cid { + if !ts.Defined() { + return []cid.Cid{} + } + + dst := make([]cid.Cid, len(ts.cids)) + copy(dst, ts.cids) + return dst +} + +// Height returns the height of a tipset. +func (ts *TipSet) Height() abi.ChainEpoch { + if ts.Defined() { + return ts.height + } + + return 0 +} + +// Parents returns the CIDs of the parents of the blocks in the tipset. +func (ts *TipSet) Parents() TipSetKey { + if ts.Defined() { + return ts.parentsKey + } + + return EmptyTSK +} + +// Parents returns the CIDs of the parents of the blocks in the tipset. +func (ts *TipSet) ParentState() cid.Cid { + if ts.Defined() { + return ts.blocks[0].ParentStateRoot + } + return cid.Undef +} + +// ParentWeight returns the tipset's ParentWeight in fixed point form. +func (ts *TipSet) ParentWeight() big.Int { + if ts.Defined() { + return ts.blocks[0].ParentWeight + } + return big.Zero() +} + +// String returns a formatted string of the CIDs in the TipSet. +// "{ }" +// Note: existing callers use this as a unique key for the tipset. We should change them +// to use the TipSetKey explicitly +func (ts TipSet) String() string { + return ts.Key().String() +} + +func (ts *TipSet) IsChildOf(parent *TipSet) bool { + return cidArrsEqual(ts.Parents().Cids(), parent.key.Cids()) && + // FIXME: The height check might go beyond what is meant by + // "parent", but many parts of the code rely on the tipset's + // height for their processing logic at the moment to obviate it. + ts.Height() > parent.Height() +} + +func (ts *TipSet) MinTicketBlock() *BlockHeader { + min := ts.blocks[0] + + for _, b := range ts.blocks[1:] { + if b.LastTicket().Less(min.LastTicket()) { + min = b + } + } + + return min +} + +// MinTicket returns the smallest ticket of all blocks in the tipset. +func (ts *TipSet) MinTicket() Ticket { + return ts.MinTicketBlock().Ticket +} + +func (ts *TipSet) MinTimestamp() uint64 { + minTS := ts.blocks[0].Timestamp + for _, bh := range ts.blocks[1:] { + if bh.Timestamp < minTS { + minTS = bh.Timestamp + } + } + return minTS +} + +func sortedCidArrsEqual(a, b []cid.Cid) bool { + if len(a) != len(b) { + return false + } + + for i := range a { + if a[i] != b[i] { + return false + } + } + + return true +} + +func sortBlockHeadersInTipSet(blks []*blockHeaderWithCid) { + sort.Slice(blks, func(i, j int) bool { + cmp := blks[i].b.Ticket.Compare(&blks[j].b.Ticket) + if cmp == 0 { + // Break ticket ties with the newBlock CIDs, which are distinct. + cmp = bytes.Compare(blks[i].c.Bytes(), blks[j].c.Bytes()) + } + return cmp < 0 + }) +} + +func cidArrsEqual(a, b []cid.Cid) bool { + if len(a) != len(b) { + return false + } + + // order ignoring compare... + s := make(map[cid.Cid]bool) + for _, c := range a { + s[c] = true + } + + for _, c := range b { + if !s[c] { + return false + } + } + return true +} diff --git a/venus-shared/chain/tipset_key.go b/venus-shared/chain/tipset_key.go new file mode 100644 index 0000000000..fbb680fe2a --- /dev/null +++ b/venus-shared/chain/tipset_key.go @@ -0,0 +1,126 @@ +package chain + +import ( + "bytes" + "encoding/json" + "fmt" + "strings" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" +) + +// TipSetKey is an immutable set of CIDs forming a unique key for a TipSet. +// Equal keys will have equivalent iteration order. CIDs are maintained in +// the same order as the canonical iteration order of blocks in a tipset (which is by ticket). +// This convention is maintained by the caller. The order of input cids to the constructor +// must be the same as this canonical order. It is the caller's responsibility to not +// construct a key with duplicate ids +// TipSetKey is a lightweight value type; passing by pointer is usually unnecessary. + +var ( + _ json.Marshaler = TipSetKey{} + _ json.Unmarshaler = (*TipSetKey)(nil) +) + +var EmptyTSK = TipSetKey{} + +// The length of a newBlock header CID in bytes. +var blockHeaderCIDLen int + +func init() { + // hash a large string of zeros so we don't estimate based on inlined CIDs. + var buf [256]byte + c, err := abi.CidBuilder.Sum(buf[:]) + if err != nil { + panic(err) + } + blockHeaderCIDLen = len(c.Bytes()) +} + +// NewTipSetKey builds a new key from a slice of CIDs. +// The CIDs are assumed to be ordered correctly. +func NewTipSetKey(cids ...cid.Cid) TipSetKey { + encoded := encodeKey(cids) + return TipSetKey{string(encoded)} +} + +// A TipSetKey is an immutable collection of CIDs forming a unique key for a tipset. +// The CIDs are assumed to be distinct and in canonical order. Two keys with the same +// CIDs in a different order are not considered equal. +// TipSetKey is a lightweight value type, and may be compared for equality with ==. +type TipSetKey struct { + // The internal representation is a concatenation of the bytes of the CIDs, which are + // self-describing, wrapped as a string. + // These gymnastics make the a TipSetKey usable as a map key. + // The empty key has value "". + value string +} + +// Cids returns a slice of the CIDs comprising this key. +func (tsk TipSetKey) Cids() []cid.Cid { + cids, err := decodeKey([]byte(tsk.value)) + if err != nil { + panic("invalid tipset key: " + err.Error()) + } + return cids +} + +// String returns a human-readable representation of the key. +func (tsk TipSetKey) String() string { + b := strings.Builder{} + b.WriteString("{") + for _, c := range tsk.Cids() { + b.Write([]byte(fmt.Sprintf(" %s", c.String()))) + } + b.WriteString(" }") + return b.String() +} + +// Bytes returns a binary representation of the key. +func (tsk TipSetKey) Bytes() []byte { + return []byte(tsk.value) +} + +func (tsk TipSetKey) MarshalJSON() ([]byte, error) { + return json.Marshal(tsk.Cids()) +} + +func (tsk *TipSetKey) UnmarshalJSON(b []byte) error { + var cids []cid.Cid + if err := json.Unmarshal(b, &cids); err != nil { + return err + } + tsk.value = string(encodeKey(cids)) + return nil +} + +func (tsk TipSetKey) IsEmpty() bool { + return len(tsk.value) == 0 +} + +func encodeKey(cids []cid.Cid) []byte { + buffer := new(bytes.Buffer) + for _, c := range cids { + // bytes.Buffer.Write() err is documented to be always nil. + _, _ = buffer.Write(c.Bytes()) + } + return buffer.Bytes() +} + +func decodeKey(encoded []byte) ([]cid.Cid, error) { + // To avoid reallocation of the underlying array, estimate the number of CIDs to be extracted + // by dividing the encoded length by the expected CID length. + estimatedCount := len(encoded) / blockHeaderCIDLen + cids := make([]cid.Cid, 0, estimatedCount) + nextIdx := 0 + for nextIdx < len(encoded) { + nr, c, err := cid.CidFromBytes(encoded[nextIdx:]) + if err != nil { + return nil, err + } + cids = append(cids, c) + nextIdx += nr + } + return cids, nil +} diff --git a/venus-shared/chain/tipset_marshal.go b/venus-shared/chain/tipset_marshal.go new file mode 100644 index 0000000000..5d1c6bf965 --- /dev/null +++ b/venus-shared/chain/tipset_marshal.go @@ -0,0 +1,70 @@ +package chain + +import ( + "encoding/json" + "io" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" +) + +type ExpTipSet struct { + Cids []cid.Cid + Blocks []*BlockHeader + Height abi.ChainEpoch +} + +func (ts *TipSet) MarshalJSON() ([]byte, error) { + // why didnt i just export the fields? Because the struct has methods with the + // same names already + return json.Marshal(ExpTipSet{ + Cids: ts.cids, + Blocks: ts.blocks, + Height: ts.height, + }) +} + +func (ts *TipSet) UnmarshalJSON(b []byte) error { + var ets ExpTipSet + if err := json.Unmarshal(b, &ets); err != nil { + return err + } + + ots, err := NewTipSet(ets.Blocks) + if err != nil { + return err + } + + *ts = *ots + + return nil +} + +func (ts *TipSet) MarshalCBOR(w io.Writer) error { + if ts == nil { + _, err := w.Write(cbg.CborNull) + return err + } + return (&ExpTipSet{ + Cids: ts.cids, + Blocks: ts.blocks, + Height: ts.height, + }).MarshalCBOR(w) +} + +func (ts *TipSet) UnmarshalCBOR(r io.Reader) error { + var ets ExpTipSet + if err := ets.UnmarshalCBOR(r); err != nil { + return err + } + + ots, err := NewTipSet(ets.Blocks) + if err != nil { + return err + } + + *ts = *ots + + return nil +} From a84fb253ee9cfeecb446dbae32d39a0308233f56 Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 16 Nov 2021 16:39:26 +0800 Subject: [PATCH 008/167] feat: add coverage stat for tests --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9e79a7dbf3..afe3450877 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,6 @@ cborgen: cd venus-devtool && go run ./cborgen/*.go test-venus-shared: - cd venus-shared && go test -v ./... + cd venus-shared && go test -v -covermode=set ./... test: test-venus-shared From 4d4d89fdf65eb328aa0aa3d44d5a3ae0178bd5df Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 16 Nov 2021 21:51:25 +0800 Subject: [PATCH 009/167] feat: impl value provider for testing --- .../testutil/value_provider_primitive.go | 138 +++++++++++++++ .../testutil/value_provider_primitive_test.go | 162 ++++++++++++++++++ .../testutil/value_provider_registry.go | 144 ++++++++++++++++ 3 files changed, 444 insertions(+) create mode 100644 venus-shared/testutil/value_provider_primitive.go create mode 100644 venus-shared/testutil/value_provider_primitive_test.go create mode 100644 venus-shared/testutil/value_provider_registry.go diff --git a/venus-shared/testutil/value_provider_primitive.go b/venus-shared/testutil/value_provider_primitive.go new file mode 100644 index 0000000000..51b7dbf4df --- /dev/null +++ b/venus-shared/testutil/value_provider_primitive.go @@ -0,0 +1,138 @@ +package testutil + +import ( + "encoding/hex" + "math/rand" + "testing" +) + +func init() { + MustRegisterDefaultValueProvier(IntProvider) + MustRegisterDefaultValueProvier(Int64Provider) + MustRegisterDefaultValueProvier(Int32Provider) + MustRegisterDefaultValueProvier(Int16Provider) + MustRegisterDefaultValueProvier(Int8Provider) + + MustRegisterDefaultValueProvier(UintProvider) + MustRegisterDefaultValueProvier(Uint64Provider) + MustRegisterDefaultValueProvier(Uint32Provider) + MustRegisterDefaultValueProvier(Uint16Provider) + MustRegisterDefaultValueProvier(Uint8Provider) + + MustRegisterDefaultValueProvier(BytesFixedProvider(defaultBytesFixedSize)) + MustRegisterDefaultValueProvier(StringInnerFixedProvider(defaultBytesFixedSize)) +} + +const ( + defaultBytesFixedSize = 16 +) + +const ( + mask8 = 1<<8 - 1 + mask16 = 1<<16 - 1 + mask32 = 1<<32 - 1 +) + +func IntProvider(t *testing.T) int { return rand.Int() } +func Int64Provider(t *testing.T) int64 { return int64(IntProvider(t)) } +func Int32Provider(t *testing.T) int32 { return int32(IntProvider(t) & mask32) } +func Int16Provider(t *testing.T) int16 { return int16(IntProvider(t) & mask16) } +func Int8Provider(t *testing.T) int8 { return int8(IntProvider(t) & mask8) } + +func UintProvider(t *testing.T) uint { return uint(IntProvider(t)) } +func Uint64Provider(t *testing.T) uint64 { return uint64(Int64Provider(t)) } +func Uint32Provider(t *testing.T) uint32 { return uint32(Int32Provider(t)) } +func Uint16Provider(t *testing.T) uint16 { return uint16(Int16Provider(t)) } +func Uint8Provider(t *testing.T) uint8 { return uint8(Int8Provider(t)) } + +func BytesFixedProvider(size int) func(*testing.T) []byte { + return func(t *testing.T) []byte { + b := make([]byte, size) + rand.Read(b[:]) + return b + } +} + +func BytesAtMostProvider(size int) func(*testing.T) []byte { + return func(t *testing.T) []byte { + b := make([]byte, rand.Intn(size)) + rand.Read(b[:]) + return b + } +} + +func StringInnerFixedProvider(size int) func(*testing.T) string { + return func(t *testing.T) string { + return hex.EncodeToString(BytesFixedProvider(size)(t)) + } +} + +func StringInnerAtMostProvider(size int) func(*testing.T) string { + return func(t *testing.T) string { + return hex.EncodeToString(BytesFixedProvider(size)(t)) + } +} + +func IntAtMostProvider(n int) func(*testing.T) int { + return func(t *testing.T) int { + if n <= 0 { + t.Fatalf("get non-positive limit number %d", n) + } + + return rand.Intn(n) + } +} + +func Int64AtMostProvider(n int64) func(*testing.T) int64 { + return func(t *testing.T) int64 { + return int64(IntAtMostProvider(int(n))(t)) + } +} + +func Int32AtMostProvider(n int32) func(*testing.T) int32 { + return func(t *testing.T) int32 { + return int32(IntAtMostProvider(int(n))(t)) + } +} + +func Int16AtMostProvider(n int16) func(*testing.T) int16 { + return func(t *testing.T) int16 { + return int16(IntAtMostProvider(int(n))(t)) + } +} + +func Int8AtMostProvider(n int8) func(*testing.T) int8 { + return func(t *testing.T) int8 { + return int8(IntAtMostProvider(int(n))(t)) + } +} + +func UintAtMostProvider(n uint) func(*testing.T) uint { + return func(t *testing.T) uint { + return uint(IntAtMostProvider(int(n))(t)) + } +} + +func Uint64AtMostProvider(n uint64) func(*testing.T) uint64 { + return func(t *testing.T) uint64 { + return uint64(IntAtMostProvider(int(n))(t)) + } +} + +func Uint32AtMostProvider(n uint32) func(*testing.T) uint32 { + return func(t *testing.T) uint32 { + return uint32(IntAtMostProvider(int(n))(t)) + } +} + +func Uint16AtMostProvider(n uint16) func(*testing.T) uint16 { + return func(t *testing.T) uint16 { + return uint16(IntAtMostProvider(int(n))(t)) + } +} + +func Uint8AtMostProvider(n uint8) func(*testing.T) uint8 { + return func(t *testing.T) uint8 { + return uint8(IntAtMostProvider(int(n))(t)) + } +} diff --git a/venus-shared/testutil/value_provider_primitive_test.go b/venus-shared/testutil/value_provider_primitive_test.go new file mode 100644 index 0000000000..eb7b6d1e67 --- /dev/null +++ b/venus-shared/testutil/value_provider_primitive_test.go @@ -0,0 +1,162 @@ +package testutil + +import ( + "encoding/hex" + "math/rand" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestDefaultBytes(t *testing.T) { + seed := time.Now().UnixNano() + rand.Seed(seed) + local := rand.New(rand.NewSource(seed)) + + for i := 0; i < 16; i++ { + var b []byte + Provide(t, &b) + assert.Len(t, b, defaultBytesFixedSize) + + expected := make([]byte, defaultBytesFixedSize) + local.Read(expected[:]) + assert.Equal(t, expected, b) + } + +} + +func TestDefaultString(t *testing.T) { + seed := time.Now().UnixNano() + rand.Seed(seed) + local := rand.New(rand.NewSource(seed)) + + for i := 0; i < 16; i++ { + var s string + Provide(t, &s) + assert.Len(t, s, defaultBytesFixedSize*2) + + expected := make([]byte, defaultBytesFixedSize) + local.Read(expected[:]) + assert.Equal(t, hex.EncodeToString(expected), s) + } +} + +func TestDefaultInt(t *testing.T) { + seed := time.Now().UnixNano() + rand.Seed(seed) + local := rand.New(rand.NewSource(seed)) + + for i := 0; i < 16; i++ { + var n int + Provide(t, &n) + assert.Equal(t, n, local.Int()) + } +} + +func TestDefaultIntSlice(t *testing.T) { + seed := time.Now().UnixNano() + rand.Seed(seed) + local := rand.New(rand.NewSource(seed)) + + var dest []int + Provide(t, &dest) + + assert.Len(t, dest, 1) + assert.Equal(t, dest[0], local.Int()) +} + +func TestDefaultNonNilIntSlice(t *testing.T) { + seed := time.Now().UnixNano() + rand.Seed(seed) + local := rand.New(rand.NewSource(seed)) + + dest := make([]int, 16) + Provide(t, &dest) + + expected := make([]int, 16) + for i := range expected { + expected[i] = local.Int() + } + + assert.Equal(t, expected, dest) +} + +func TestIntSliceWithFixedNumber(t *testing.T) { + now := int(time.Now().UnixNano()) + + dest := make([]int, 16) + Provide(t, &dest, func(t *testing.T) int { + return now + }) + + expected := make([]int, 16) + for i := range expected { + expected[i] = now + } + + assert.Equal(t, expected, dest) +} + +func TestDefaultIntArray(t *testing.T) { + seed := time.Now().UnixNano() + rand.Seed(seed) + local := rand.New(rand.NewSource(seed)) + + var dest [16]int + Provide(t, &dest) + + expected := make([]int, 16) + for i := range expected { + expected[i] = local.Int() + } + + assert.Equal(t, expected, dest[:]) +} + +func TestStruct(t *testing.T) { + seed := time.Now().UnixNano() + rand.Seed(seed) + local := rand.New(rand.NewSource(seed)) + + type inner struct { + Public []int + private []int + } + + var dest inner + + Provide(t, &dest) + + assert.Nil(t, dest.private) + assert.Len(t, dest.Public, 1) + assert.Equal(t, dest.Public[0], local.Int()) +} + +func TestNestedStruct(t *testing.T) { + seed := time.Now().UnixNano() + rand.Seed(seed) + local := rand.New(rand.NewSource(seed)) + + type nested struct { + Ints []int + } + + type inner struct { + Public *nested + Public2 nested + private *nested + } + + var dest inner + + Provide(t, &dest) + assert.NotNil(t, dest.Public) + assert.Nil(t, dest.private) + + assert.Len(t, dest.Public.Ints, 1) + assert.Len(t, dest.Public2.Ints, 1) + + assert.Equal(t, dest.Public.Ints[0], local.Int()) + assert.Equal(t, dest.Public2.Ints[0], local.Int()) +} diff --git a/venus-shared/testutil/value_provider_registry.go b/venus-shared/testutil/value_provider_registry.go new file mode 100644 index 0000000000..3c8dfb5bff --- /dev/null +++ b/venus-shared/testutil/value_provider_registry.go @@ -0,0 +1,144 @@ +package testutil + +import ( + "fmt" + "reflect" + "sync" + "testing" +) + +var typeT = reflect.TypeOf((*testing.T)(nil)) + +func Provide(t *testing.T, dst interface{}, specifiedFns ...interface{}) { + rval := reflect.ValueOf(dst) + if kind := rval.Kind(); kind != reflect.Ptr { + t.Fatalf("value provider can only be applied on to poniters, got %T", dst) + } + + reg := defaultValueProviderRegistry + if len(specifiedFns) > 0 { + reg = defaultValueProviderRegistry.clone() + for fni := range specifiedFns { + if err := reg.register(specifiedFns[fni]); err != nil { + t.Fatalf("register specified provider %T for %T: %s", specifiedFns[fni], dst, err) + } + } + } + + reg.provide(t, rval.Elem()) +} + +func MustRegisterDefaultValueProvier(fn interface{}) { + if err := RegisterDefaultValueProvier(fn); err != nil { + panic(fmt.Errorf("register default value provider %T: %w", fn, err)) + } +} + +func RegisterDefaultValueProvier(fn interface{}) error { + return defaultValueProviderRegistry.register(fn) +} + +var defaultValueProviderRegistry = &valueProviderRegistry{ + providers: map[reflect.Type]reflect.Value{}, +} + +type valueProviderRegistry struct { + sync.RWMutex + providers map[reflect.Type]reflect.Value +} + +func (r *valueProviderRegistry) clone() *valueProviderRegistry { + cloned := &valueProviderRegistry{ + providers: map[reflect.Type]reflect.Value{}, + } + + r.Lock() + for rt, rv := range r.providers { + cloned.providers[rt] = rv + } + r.Unlock() + + return cloned +} + +func (r *valueProviderRegistry) register(fn interface{}) error { + rval := reflect.ValueOf(fn) + rtyp := rval.Type() + + if rkind := rtyp.Kind(); rkind != reflect.Func { + return fmt.Errorf("expected provider func, got %s", rkind) + } + + if numIn := rtyp.NumIn(); numIn != 1 { + return fmt.Errorf("expected provider func with 1 in, got %d", numIn) + } + + if numOut := rtyp.NumOut(); numOut != 1 { + return fmt.Errorf("expected provider func with 1 out, got %d", numOut) + } + + if inTyp := rtyp.In(0); inTyp != typeT { + return fmt.Errorf("expected provider's in type to be *testing.T, got %s", inTyp) + } + + outTyp := rtyp.Out(0) + r.Lock() + r.providers[outTyp] = rval + r.Unlock() + + return nil +} + +func (r *valueProviderRegistry) provide(t *testing.T, rval reflect.Value) { + rtyp := rval.Type() + if !rval.CanSet() { + return + } + + r.RLock() + provider, ok := r.providers[rtyp] + r.RUnlock() + if ok { + ret := provider.Call([]reflect.Value{reflect.ValueOf(t)}) + rval.Set(ret[0]) + return + } + + rkind := rtyp.Kind() + switch rkind { + case reflect.Slice: + if rval.IsNil() || rval.Len() == 0 { + rval.Set(reflect.MakeSlice(rtyp, 1, 1)) + } + + for i := 0; i < rval.Len(); i++ { + r.provide(t, rval.Index(i)) + } + + return + + case reflect.Array: + for i := 0; i < rval.Len(); i++ { + r.provide(t, rval.Index(i)) + } + + return + + case reflect.Ptr: + if rval.IsNil() { + rval.Set(reflect.New(rtyp.Elem())) + } + + r.provide(t, rval.Elem()) + return + + case reflect.Struct: + for i := 0; i < rval.NumField(); i++ { + fieldVal := rval.Field(i) + r.provide(t, fieldVal) + } + + return + } + +} From 23573bc6d3a6b10d03ff740e871810ced9a63104 Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 16 Nov 2021 23:12:48 +0800 Subject: [PATCH 010/167] feat: check for convertible provider, use int for all number types --- .../testutil/value_provider_primitive.go | 98 ++------------- .../testutil/value_provider_primitive_test.go | 112 ++++++++++++++---- .../testutil/value_provider_registry.go | 24 ++++ 3 files changed, 122 insertions(+), 112 deletions(-) diff --git a/venus-shared/testutil/value_provider_primitive.go b/venus-shared/testutil/value_provider_primitive.go index 51b7dbf4df..3160815f9c 100644 --- a/venus-shared/testutil/value_provider_primitive.go +++ b/venus-shared/testutil/value_provider_primitive.go @@ -8,16 +8,6 @@ import ( func init() { MustRegisterDefaultValueProvier(IntProvider) - MustRegisterDefaultValueProvier(Int64Provider) - MustRegisterDefaultValueProvier(Int32Provider) - MustRegisterDefaultValueProvier(Int16Provider) - MustRegisterDefaultValueProvier(Int8Provider) - - MustRegisterDefaultValueProvier(UintProvider) - MustRegisterDefaultValueProvier(Uint64Provider) - MustRegisterDefaultValueProvier(Uint32Provider) - MustRegisterDefaultValueProvier(Uint16Provider) - MustRegisterDefaultValueProvier(Uint8Provider) MustRegisterDefaultValueProvier(BytesFixedProvider(defaultBytesFixedSize)) MustRegisterDefaultValueProvier(StringInnerFixedProvider(defaultBytesFixedSize)) @@ -27,23 +17,17 @@ const ( defaultBytesFixedSize = 16 ) -const ( - mask8 = 1<<8 - 1 - mask16 = 1<<16 - 1 - mask32 = 1<<32 - 1 -) +func IntProvider(t *testing.T) int { return rand.Int() } -func IntProvider(t *testing.T) int { return rand.Int() } -func Int64Provider(t *testing.T) int64 { return int64(IntProvider(t)) } -func Int32Provider(t *testing.T) int32 { return int32(IntProvider(t) & mask32) } -func Int16Provider(t *testing.T) int16 { return int16(IntProvider(t) & mask16) } -func Int8Provider(t *testing.T) int8 { return int8(IntProvider(t) & mask8) } +func IntAtMostProvider(n int) func(*testing.T) int { + return func(t *testing.T) int { + if n <= 0 { + t.Fatalf("get non-positive limit number %d", n) + } -func UintProvider(t *testing.T) uint { return uint(IntProvider(t)) } -func Uint64Provider(t *testing.T) uint64 { return uint64(Int64Provider(t)) } -func Uint32Provider(t *testing.T) uint32 { return uint32(Int32Provider(t)) } -func Uint16Provider(t *testing.T) uint16 { return uint16(Int16Provider(t)) } -func Uint8Provider(t *testing.T) uint8 { return uint8(Int8Provider(t)) } + return rand.Intn(n) + } +} func BytesFixedProvider(size int) func(*testing.T) []byte { return func(t *testing.T) []byte { @@ -72,67 +56,3 @@ func StringInnerAtMostProvider(size int) func(*testing.T) string { return hex.EncodeToString(BytesFixedProvider(size)(t)) } } - -func IntAtMostProvider(n int) func(*testing.T) int { - return func(t *testing.T) int { - if n <= 0 { - t.Fatalf("get non-positive limit number %d", n) - } - - return rand.Intn(n) - } -} - -func Int64AtMostProvider(n int64) func(*testing.T) int64 { - return func(t *testing.T) int64 { - return int64(IntAtMostProvider(int(n))(t)) - } -} - -func Int32AtMostProvider(n int32) func(*testing.T) int32 { - return func(t *testing.T) int32 { - return int32(IntAtMostProvider(int(n))(t)) - } -} - -func Int16AtMostProvider(n int16) func(*testing.T) int16 { - return func(t *testing.T) int16 { - return int16(IntAtMostProvider(int(n))(t)) - } -} - -func Int8AtMostProvider(n int8) func(*testing.T) int8 { - return func(t *testing.T) int8 { - return int8(IntAtMostProvider(int(n))(t)) - } -} - -func UintAtMostProvider(n uint) func(*testing.T) uint { - return func(t *testing.T) uint { - return uint(IntAtMostProvider(int(n))(t)) - } -} - -func Uint64AtMostProvider(n uint64) func(*testing.T) uint64 { - return func(t *testing.T) uint64 { - return uint64(IntAtMostProvider(int(n))(t)) - } -} - -func Uint32AtMostProvider(n uint32) func(*testing.T) uint32 { - return func(t *testing.T) uint32 { - return uint32(IntAtMostProvider(int(n))(t)) - } -} - -func Uint16AtMostProvider(n uint16) func(*testing.T) uint16 { - return func(t *testing.T) uint16 { - return uint16(IntAtMostProvider(int(n))(t)) - } -} - -func Uint8AtMostProvider(n uint8) func(*testing.T) uint8 { - return func(t *testing.T) uint8 { - return uint8(IntAtMostProvider(int(n))(t)) - } -} diff --git a/venus-shared/testutil/value_provider_primitive_test.go b/venus-shared/testutil/value_provider_primitive_test.go index eb7b6d1e67..34c3808c62 100644 --- a/venus-shared/testutil/value_provider_primitive_test.go +++ b/venus-shared/testutil/value_provider_primitive_test.go @@ -3,16 +3,21 @@ package testutil import ( "encoding/hex" "math/rand" + "reflect" "testing" "time" "github.com/stretchr/testify/assert" ) -func TestDefaultBytes(t *testing.T) { +func getRand() *rand.Rand { seed := time.Now().UnixNano() rand.Seed(seed) - local := rand.New(rand.NewSource(seed)) + return rand.New(rand.NewSource(seed)) +} + +func TestDefaultBytes(t *testing.T) { + local := getRand() for i := 0; i < 16; i++ { var b []byte @@ -27,9 +32,7 @@ func TestDefaultBytes(t *testing.T) { } func TestDefaultString(t *testing.T) { - seed := time.Now().UnixNano() - rand.Seed(seed) - local := rand.New(rand.NewSource(seed)) + local := getRand() for i := 0; i < 16; i++ { var s string @@ -43,9 +46,7 @@ func TestDefaultString(t *testing.T) { } func TestDefaultInt(t *testing.T) { - seed := time.Now().UnixNano() - rand.Seed(seed) - local := rand.New(rand.NewSource(seed)) + local := getRand() for i := 0; i < 16; i++ { var n int @@ -54,10 +55,70 @@ func TestDefaultInt(t *testing.T) { } } +func TestDefaultInt64(t *testing.T) { + assert.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(int64(0)))) + + local := getRand() + + for i := 0; i < 16; i++ { + var n int64 + Provide(t, &n) + assert.Equal(t, n, int64(local.Int())) + } +} + +func TestDefaultInt32(t *testing.T) { + assert.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(int32(0)))) + + local := getRand() + + for i := 0; i < 16; i++ { + var n int32 + Provide(t, &n) + assert.Equal(t, n, int32(local.Int())) + } +} + +func TestDefaultFloat64(t *testing.T) { + assert.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(float64(0)))) + + local := getRand() + + for i := 0; i < 16; i++ { + var n float64 + Provide(t, &n) + assert.Equal(t, n, float64(local.Int())) + } +} + +func TestDefaultIntType(t *testing.T) { + type number int + assert.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(number(0)))) + + local := getRand() + + for i := 0; i < 16; i++ { + var n number + Provide(t, &n) + assert.Equal(t, n, number(local.Int())) + } +} + +func TestDefaultFloatType(t *testing.T) { + type double float64 + assert.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(double(0)))) + + local := getRand() + + for i := 0; i < 16; i++ { + var n double + Provide(t, &n) + assert.Equal(t, n, double(local.Int())) + } +} + func TestDefaultIntSlice(t *testing.T) { - seed := time.Now().UnixNano() - rand.Seed(seed) - local := rand.New(rand.NewSource(seed)) + local := getRand() var dest []int Provide(t, &dest) @@ -66,10 +127,21 @@ func TestDefaultIntSlice(t *testing.T) { assert.Equal(t, dest[0], local.Int()) } +func TestDefaultIntTypeSlice(t *testing.T) { + type number int + assert.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(number(0)))) + + local := getRand() + + var dest []number + Provide(t, &dest) + + assert.Len(t, dest, 1) + assert.Equal(t, dest[0], number(local.Int())) +} + func TestDefaultNonNilIntSlice(t *testing.T) { - seed := time.Now().UnixNano() - rand.Seed(seed) - local := rand.New(rand.NewSource(seed)) + local := getRand() dest := make([]int, 16) Provide(t, &dest) @@ -99,9 +171,7 @@ func TestIntSliceWithFixedNumber(t *testing.T) { } func TestDefaultIntArray(t *testing.T) { - seed := time.Now().UnixNano() - rand.Seed(seed) - local := rand.New(rand.NewSource(seed)) + local := getRand() var dest [16]int Provide(t, &dest) @@ -115,9 +185,7 @@ func TestDefaultIntArray(t *testing.T) { } func TestStruct(t *testing.T) { - seed := time.Now().UnixNano() - rand.Seed(seed) - local := rand.New(rand.NewSource(seed)) + local := getRand() type inner struct { Public []int @@ -134,9 +202,7 @@ func TestStruct(t *testing.T) { } func TestNestedStruct(t *testing.T) { - seed := time.Now().UnixNano() - rand.Seed(seed) - local := rand.New(rand.NewSource(seed)) + local := getRand() type nested struct { Ints []int diff --git a/venus-shared/testutil/value_provider_registry.go b/venus-shared/testutil/value_provider_registry.go index 3c8dfb5bff..29f94236dc 100644 --- a/venus-shared/testutil/value_provider_registry.go +++ b/venus-shared/testutil/value_provider_registry.go @@ -89,6 +89,14 @@ func (r *valueProviderRegistry) register(fn interface{}) error { return nil } +func (r *valueProviderRegistry) has(want reflect.Type) bool { + r.RLock() + _, has := r.providers[want] + r.RUnlock() + + return has +} + func (r *valueProviderRegistry) provide(t *testing.T, rval reflect.Value) { rtyp := rval.Type() if !rval.CanSet() { @@ -104,6 +112,22 @@ func (r *valueProviderRegistry) provide(t *testing.T, rval reflect.Value) { return } + r.RLock() + var convertor reflect.Value + for pt := range r.providers { + if pt.ConvertibleTo(rtyp) { + convertor = r.providers[pt] + break + } + } + r.RUnlock() + + if convertor.IsValid() { + ret := convertor.Call([]reflect.Value{reflect.ValueOf(t)}) + rval.Set(ret[0].Convert(rtyp)) + return + } + rkind := rtyp.Kind() switch rkind { case reflect.Slice: From 27aa7e8f52585c9dbaf6c2388b198e2b68890031 Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 16 Nov 2021 23:23:57 +0800 Subject: [PATCH 011/167] feat: test for invalid provider registration --- .../testutil/value_provider_registry_test.go | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 venus-shared/testutil/value_provider_registry_test.go diff --git a/venus-shared/testutil/value_provider_registry_test.go b/venus-shared/testutil/value_provider_registry_test.go new file mode 100644 index 0000000000..1a89899c2f --- /dev/null +++ b/venus-shared/testutil/value_provider_registry_test.go @@ -0,0 +1,23 @@ +package testutil + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestInvalidProviders(t *testing.T) { + vals := []interface{}{ + int(0), + float32(0), + func() {}, + func(t *testing.T) {}, + func() int { return 1 }, + func(int) int { return 1 }, + } + + for ri := range vals { + err := defaultValueProviderRegistry.register(vals[ri]) + assert.Errorf(t, err, "value #%d", ri) + } +} From 4d946246b361734d00491b0c6705c264baccfe00 Mon Sep 17 00:00:00 2001 From: dtynn Date: Wed, 17 Nov 2021 11:19:45 +0800 Subject: [PATCH 012/167] feat: show cbor-gened types in lotus --- venus-devtool/compatible/main.go | 92 ++ venus-devtool/go.mod | 1 + venus-devtool/go.sum | 1976 +++++++++++++++++++++++++++++- 3 files changed, 2055 insertions(+), 14 deletions(-) create mode 100644 venus-devtool/compatible/main.go diff --git a/venus-devtool/compatible/main.go b/venus-devtool/compatible/main.go new file mode 100644 index 0000000000..c7ba71a5b7 --- /dev/null +++ b/venus-devtool/compatible/main.go @@ -0,0 +1,92 @@ +package main + +import ( + "fmt" + "go/ast" + "go/build" + "go/parser" + "go/token" + "log" + "path/filepath" + + _ "github.com/filecoin-project/lotus/build" +) + +func main() { + pkg, err := build.Import("github.com/filecoin-project/lotus/gen", ".", build.FindOnly) + if err != nil { + log.Fatalln("find pkg", err) + } + + targetFile := filepath.Join(pkg.Dir, "main.go") + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, targetFile, nil, 0) + if err != nil { + log.Fatalln("parse file", err) + } + + ast.Inspect(f, func(n ast.Node) bool { + if expr, ok := n.(*ast.CallExpr); ok { + if fn, ok := expr.Fun.(*ast.SelectorExpr); ok { + if fn.Sel != nil && fn.Sel.Name == "WriteMapEncodersToFile" { + ci, err := parseGenCallExpr(expr) + if err != nil { + log.Fatalln(err) + } + + fmt.Printf("%s: %s\n", ci.pkgName, filepath.Dir(filepath.Join("github.com/filecoin-project/lotus", ci.path))) + for ti := range ci.typeNames { + fmt.Printf("\t%s\n", ci.typeNames[ti]) + } + + fmt.Println("") + } + } + } + return true + }) +} + +type callInfo struct { + path string + pkgName string + typeNames []string +} + +func parseGenCallExpr(expr *ast.CallExpr) (*callInfo, error) { + if numIn := len(expr.Args); numIn < 3 { + return nil, fmt.Errorf("not enough args, got %d", numIn) + } + + first, ok := expr.Args[0].(*ast.BasicLit) + if !ok || first.Kind != token.STRING { + return nil, fmt.Errorf("1st arg should be a string, got %T", first) + } + + second, ok := expr.Args[1].(*ast.BasicLit) + if !ok || second.Kind != token.STRING { + return nil, fmt.Errorf("2nd arg should be a string, got %T", second) + } + + typeNames := make([]string, 0, len(expr.Args)-2) + + for _, typArg := range expr.Args[2:] { + lit, ok := typArg.(*ast.CompositeLit) + if !ok { + return nil, fmt.Errorf("should be CompositeLit, got %T", typArg) + } + + sel, ok := lit.Type.(*ast.SelectorExpr) + if !ok || sel.Sel == nil { + return nil, fmt.Errorf("unexpected literal type: %T", sel) + } + + typeNames = append(typeNames, sel.Sel.Name) + } + + return &callInfo{ + path: first.Value[1 : len(first.Value)-1], + pkgName: second.Value[1 : len(second.Value)-1], + typeNames: typeNames, + }, nil +} diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index df9b8e7f8c..67f6ff366f 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -3,6 +3,7 @@ module github.com/filecoin-project/venus/venus-devtool go 1.16 require ( + github.com/filecoin-project/lotus v1.12.0 github.com/filecoin-project/venus/venus-shared v0.0.1 github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 ) diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index 21194f1cd3..9c09ecb544 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -1,74 +1,1241 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +contrib.go.opencensus.io/exporter/jaeger v0.1.0/go.mod h1:VYianECmuFPwU37O699Vc1GOcy+y8kOsfaxHRImmjbA= +contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= +dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= +dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= +dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/jt0CW30vsg= +github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= +github.com/GeertJohan/go.rice v1.0.0 h1:KkI6O9uMaQU3VEKaj01ulavtF7o1fWT7+pk/4voiMLQ= +github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= +github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4uFNYOGG2cJpmFJ04E6SD1NLELPYZB57/7AY= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= +github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa/go.mod h1:WUmMvh9wMtqj1Xhf1hf3kp9RvL+y6odtdYxpyZjb90U= +github.com/Masterminds/glide v0.13.2/go.mod h1:STyF5vcenH/rUqTEv+/hBXlSTo7KYwg2oc2f4tzPWic= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= +github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/Stebalien/go-bitfield v0.0.0-20180330043415-076a62f9ce6e/go.mod h1:3oM7gXIttpYDAJXpVNnSCiUMYBLIZ6cb1t+Ip982MRo= +github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo= +github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= +github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.32.11/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= +github.com/benbjohnson/clock v1.0.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.0.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg= +github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bep/debounce v1.2.0 h1:wXds8Kq8qRfwAOpAxHrJDbCXgC5aHSzgQb/0gKsHQqo= +github.com/bep/debounce v1.2.0/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= +github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.21.0-beta h1:At9hIZdJW0s9E/fAz28nrz6AmcNlSVucCH796ZteX1M= +github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U= +github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20200211180108-c7c1fbc02894/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= +github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/cockroachdb/pebble v0.0.0-20200916222308-4e219a90ba5b/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= +github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= +github.com/cockroachdb/redact v0.0.0-20200622112456-cd282804bbd3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= +github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg= +github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= +github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= +github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY= +github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= +github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= +github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= +github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e/go.mod h1:3ZQK6DMPSz/QZ73jlWxBtUhNA8xZx7LzUFSq/OfP8vk= +github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= +github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= +github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= +github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= +github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= +github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/filecoin-project/go-address v0.0.3 h1:eVfbdjEbpbzIrbiSa+PiGUY+oDK9HnUn+M1R/ggoHf8= +github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= +github.com/drand/drand v1.2.1/go.mod h1:j0P7RGmVaY7E/OuO2yQOcQj7OgeZCuhgu2gdv0JAm+g= +github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= +github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw= +github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U= +github.com/drand/kyber-bls12381 v0.2.0/go.mod h1:zQip/bHdeEB6HFZSU3v+d3cQE0GaBVQw9aR2E7AdoeI= +github.com/drand/kyber-bls12381 v0.2.1/go.mod h1:JwWn4nHO9Mp4F5qCie5sVIPQZ0X6cw8XAeMRvc/GXBE= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elastic/go-sysinfo v1.3.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= +github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= +github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/etclabscore/go-jsonschema-walk v0.0.6/go.mod h1:VdfDY72AFAiUhy0ZXEaWSpveGjMT5JcDIm903NGqFwQ= +github.com/etclabscore/go-openrpc-reflect v0.0.36/go.mod h1:0404Ky3igAasAOpyj1eESjstTyneBAIk5PgJFbK4s5E= +github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A= +github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= +github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= +github.com/filecoin-project/dagstore v0.4.3 h1:yeFl6+2BRY1gOVp/hrZuFa24s7LY0Qqkqx/Gh8lidZs= +github.com/filecoin-project/dagstore v0.4.3/go.mod h1:dm/91AO5UaDd3bABFjg/5fmRH99vvpS7g1mykqvz6KQ= +github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200716204036-cddc56607e1d/go.mod h1:XE4rWG1P7zWPaC11Pkn1CVR20stqN52MnMkIrF4q6ZU= +github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f h1:vg/6KEAOBjICMaWj+xofJCp09HYRfpO3ZbJsnJo22pA= +github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f/go.mod h1:+If3s2VxyjZn+KGGZIoRXBDSFQ9xL404JBJGf4WhEj0= +github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-address v0.0.5 h1:SSaFT/5aLfPXycUlFyemoHYhRgdyXClXCyDdNJKPlDM= +github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-amt-ipld/v2 v2.0.1-0.20200424220931-6263827e49f2/go.mod h1:boRtQhzmxNocrMxOXo1NYn4oUc1NGvR8tEa79wApNXg= +github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= -github.com/filecoin-project/go-bitfield v0.2.0 h1:gCtLcjskIPtdg4NfN7gQZSQF9yrBQ7mkT0qCJxzGI2Q= +github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= +github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= +github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= +github.com/filecoin-project/go-bitfield v0.0.1/go.mod h1:Ry9/iUlWSyjPUzlAvdnfy4Gtvrq4kWmWDztCU1yEgJY= github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= +github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= +github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= +github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= +github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 h1:av5fw6wmm58FYMgJeoB/lK9XXrgdugYiTqkdxjTy9k8= +github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= +github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7 h1:U9Z+76pHCKBmtdxFV7JFZJj7OVm12I6dEKwtMVbq5p0= +github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= +github.com/filecoin-project/go-data-transfer v1.10.0/go.mod h1:uQtqy6vUAY5v70ZHdkF5mJ8CjVtjj/JA3aOoaqzWTVw= +github.com/filecoin-project/go-data-transfer v1.10.1 h1:YQNLwhizxkdfFxegAyrnn3l7WjgMjqDlqFzr18iWiYI= +github.com/filecoin-project/go-data-transfer v1.10.1/go.mod h1:CSDMCrPK2lVGodNB1wPEogjFvM9nVGyiL1GNbBRTSdw= +github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= +github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= +github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= +github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= +github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= +github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= +github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= +github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= +github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= +github.com/filecoin-project/go-fil-markets v1.12.0 h1:RpU5bLaMADVrU4CgLxKMGHC2ZUocNV35uINxogQCf00= +github.com/filecoin-project/go-fil-markets v1.12.0/go.mod h1:XuuZFaFujI47nrgfQJiq7jWB+6rRya6nm7Sj6uXQ80U= +github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= +github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+eEvrDCGJoPLxFpDynFjYfBjI= +github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= +github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= +github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= +github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= +github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= +github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1 h1:0BogtftbcgyBx4lP2JWM00ZK7/pXmgnrDqKp9aLTgVs= +github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= +github.com/filecoin-project/go-paramfetch v0.0.2-0.20210614165157-25a6c7769498/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= +github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/specs-actors v0.9.13 h1:rUEOQouefi9fuVY/2HOroROJlZbOzWYXXeIh41KF2M4= +github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= +github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= +github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= +github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= +github.com/filecoin-project/go-statestore v0.1.1 h1:ufMFq00VqnT2CAuDpcGnwLnCX1I/c3OROw/kXVNSTZk= +github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= +github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= +github.com/filecoin-project/lotus v1.12.0 h1:ayqeGQCsHN3ApK02VZQslEFbjvP1H2d1CXBnJKHUZWA= +github.com/filecoin-project/lotus v1.12.0/go.mod h1:zr8dXJPXFDf3E5tB9RMOpDe4MD8wD9ghsUns9xkXAhY= +github.com/filecoin-project/specs-actors v0.6.1/go.mod h1:dRdy3cURykh2R8O/DKqy8olScl70rmIS7GrB4hB1IDY= +github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= +github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= +github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= +github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= +github.com/filecoin-project/specs-actors/v2 v2.0.1/go.mod h1:v2NZVYinNIKA9acEMBm5wWXxqv5+frFEbekBFemYghY= +github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= github.com/filecoin-project/specs-actors/v2 v2.3.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= +github.com/filecoin-project/specs-actors/v3 v3.1.0/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= +github.com/filecoin-project/specs-actors/v3 v3.1.1 h1:BE8fsns1GnEOxt1DTE5LxBK2FThXtWmCChgcJoHTg0E= +github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= +github.com/filecoin-project/specs-actors/v4 v4.0.0/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= +github.com/filecoin-project/specs-actors/v4 v4.0.1 h1:AiWrtvJZ63MHGe6rn7tPu4nSUY8bA1KDNszqJaD5+Fg= +github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= +github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= +github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= +github.com/filecoin-project/specs-actors/v6 v6.0.0 h1:i+16MFE8GScWWUF0kG7x2RZ5Hqpz0CeyBHTpnijCJ6I= +github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= +github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= +github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= +github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1 h1:EzDjxMg43q1tA2c0MV3tNbaontnHLplHyFF6M5KiVP0= +github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1/go.mod h1:0eHX/BVySxPc6SE2mZRoppGq7qcEagxdmQnA3dzork8= +github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= +github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= +github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/spec v0.19.7/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.19.11/go.mod h1:vqK/dIdLGCosfvYsQV3WfC7N3TiZSnGY2RZKoFK7X28= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.8/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72POcgHMAgSY= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gogo/status v1.0.3/go.mod h1:SavQ51ycCLnc7dGyJxp8YAmudx8xqiVrRf+6IXRsugc= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= +github.com/google/gopacket v1.1.18/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/gxed/go-shellwords v1.0.3/go.mod h1:N7paucT91ByIjmVJHhvoarjoQnmsi3Jd3vH7VqgtMxQ= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE= +github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824/go.mod h1:OiEWyHgK+CWrmOlVquHaIK1vhpUJydC9m0Je6mhaiNE= +github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE= +github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 h1:F9k+7wv5OIk1zcq23QpdiL0hfDuXPjuOmMNaC6fgQ0Q= +github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1/go.mod h1:jvfsLIxk0fY/2BKSQ1xf2406AKA5dwMmKKv0ADcOfN8= +github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4nmd7b5qy5t0GWDTwSn4OyRgfAXSmo6VnryBY= +github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e/go.mod h1:I8h3MITA53gN9OnWGCgaMa0JWVRdXthWw4M3CPM54OY= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+gRZDtmTJkAs= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= +github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= +github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= +github.com/iancoleman/orderedmap v0.1.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= +github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= +github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= +github.com/ipfs/go-bitswap v0.0.3/go.mod h1:jadAZYsP/tcRMl47ZhFxhaNuDQoXawT8iHMg+iFoQbg= +github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= +github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= +github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= +github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= +github.com/ipfs/go-bitswap v0.3.4 h1:AhJhRrG8xkxh6x87b4wWs+4U4y3DVB3doI8yFNqgQME= +github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= +github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= +github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= +github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= +github.com/ipfs/go-blockservice v0.0.3/go.mod h1:/NNihwTi6V2Yr6g8wBI+BSwPuURpBRMtYNGrlxZ8KuI= +github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= +github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= +github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= +github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= +github.com/ipfs/go-blockservice v0.1.5 h1:euqZu96CCbToPyYVwVshu8ENURi8BhFd7FUFfTLi+fQ= +github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.4-0.20191112011718-79e75dffeb10/go.mod h1:/BYOuUoxkE+0f6tGzlzMvycuN+5l35VOR4Bpg2sCmds= +github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M= github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-cid v0.0.8-0.20210716091050-de6c03deae1c/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= -github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= +github.com/ipfs/go-cidutil v0.0.2 h1:CNOboQf1t7Qp0nuNh8QMmhJs0+Q//bRL1axtCnIB1Yo= +github.com/ipfs/go-cidutil v0.0.2/go.mod h1:ewllrvrxG6AMYStla3GD7Cqn+XYSLqjK0vc+086tB6s= +github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= +github.com/ipfs/go-datastore v0.3.0/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= +github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= +github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= +github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= +github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= +github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= +github.com/ipfs/go-datastore v0.4.5 h1:cwOUcGMLdLPWgu3SlrCckCMznaGADbPqE0r8h768/Dg= +github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= +github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= +github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= +github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= +github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= +github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= +github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= +github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= +github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= +github.com/ipfs/go-ds-badger2 v0.1.0/go.mod h1:pbR1p817OZbdId9EvLOhKBgUVTM3BMCSTan78lDDVaw= +github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e/go.mod h1:lJnws7amT9Ehqzta0gwMrRsURU04caT0iRPr1W8AsOU= +github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= +github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= +github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= +github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= +github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= +github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= +github.com/ipfs/go-filestore v1.0.0 h1:QR7ekKH+q2AGiWDc7W2Q0qHuYSRZGUJqUn0GsegEPb0= +github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= +github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= +github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= +github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= +github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= +github.com/ipfs/go-graphsync v0.9.0/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= +github.com/ipfs/go-graphsync v0.9.1/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= +github.com/ipfs/go-graphsync v0.9.3 h1:oWqUuN3OYqLwu669fxYbgymBrIodB0fD7vFZfF//X7Y= +github.com/ipfs/go-graphsync v0.9.3/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= +github.com/ipfs/go-hamt-ipld v0.0.15-0.20200131012125-dd88a59d3f2e/go.mod h1:9aQJu/i/TaRDW6jqB5U217dLIDopn50wxLdHXM2CTfE= +github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= +github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= +github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= +github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= +github.com/ipfs/go-ipfs-blockstore v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= +github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= +github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= +github.com/ipfs/go-ipfs-blockstore v1.0.4 h1:DZdeya9Vu4ttvlGheQPGrj6kWehXnYZRFCp9EsZQ1hI= +github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= +github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= +github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= +github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= +github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= +github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= +github.com/ipfs/go-ipfs-cmds v0.1.0 h1:0CEde9EcxByej8+L6d1PST57J4ambRPyCTjLG5Ymou8= +github.com/ipfs/go-ipfs-cmds v0.1.0/go.mod h1:TiK4e7/V31tuEb8YWDF8lN3qrnDH+BS7ZqWIeYJlAs8= +github.com/ipfs/go-ipfs-config v0.0.11 h1:5/4nas2CQXiKr2/MLxU24GDGTBvtstQIQezuk7ltOQQ= +github.com/ipfs/go-ipfs-config v0.0.11/go.mod h1:wveA8UT5ywN26oKStByzmz1CO6cXwLKKM6Jn/Hfw08I= +github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= +github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= +github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= +github.com/ipfs/go-ipfs-ds-help v1.0.0 h1:bEQ8hMGs80h0sR8O4tfDgV6B01aaF9qeTrujrTLYV3g= +github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE= +github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6rY30GUu7G6LUfpMvM= +github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= +github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= +github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= +github.com/ipfs/go-ipfs-files v0.0.2/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= +github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= +github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= +github.com/ipfs/go-ipfs-files v0.0.8 h1:8o0oFJkJ8UkO/ABl8T6ac6tKF3+NIpj67aAB6ZpusRg= +github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= +github.com/ipfs/go-ipfs-flags v0.0.1/go.mod h1:RnXBb9WV53GSfTrSDVK61NLTFKvWc60n+K9EgCDh+rA= +github.com/ipfs/go-ipfs-http-client v0.0.5 h1:niW5M0qqa0O/VRCAzr3f5Y7i3MjTpf0lhpkisjRtHR8= +github.com/ipfs/go-ipfs-http-client v0.0.5/go.mod h1:8EKP9RGUrUex4Ff86WhnKU7seEBOtjdgXlY9XHYvYMw= +github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= +github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= +github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= +github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= +github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= +github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= +github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= +github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipld-cbor v0.0.4 h1:Aw3KPOKXjvrm6VjwJvFf1F1ekR/BH3jdof3Bk7OTiSA= +github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= +github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= +github.com/ipfs/go-ipld-cbor v0.0.1/go.mod h1:RXHr8s4k0NE0TKhnrxqZC9M888QfsBN9rhS5NjfKzY8= +github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= +github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.5-0.20200204214505-252690b78669/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= +github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= -github.com/ipfs/go-ipld-format v0.0.2 h1:OVAGlyYT6JPZ0pEfGntFPS40lfrDmaDbQwNHEY2G9Zs= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= +github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= +github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= +github.com/ipfs/go-ipns v0.0.2/go.mod h1:WChil4e0/m9cIINWLxZe1Jtf77oz5L05rO2ei/uKJ5U= +github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= +github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMRR8I= +github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= +github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= +github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= +github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= +github.com/ipfs/go-log/v2 v2.0.1/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= +github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= +github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= +github.com/ipfs/go-log/v2 v2.0.8/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= +github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= +github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= +github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= +github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= +github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= +github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= +github.com/ipfs/go-merkledag v0.0.3/go.mod h1:Oc5kIXLHokkE1hWGMBHw+oxehkAaTOqtEb7Zbh6BhLA= +github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= +github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= +github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= +github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= +github.com/ipfs/go-merkledag v0.3.2 h1:MRqj40QkrWkvPswXs4EfSslhZ4RVPRbxwX11js0t1xY= +github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= +github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= +github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= +github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= +github.com/ipfs/go-path v0.0.3/go.mod h1:zIRQUez3LuQIU25zFjC2hpBTHimWx7VK5bjZgRLbbdo= +github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= +github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= +github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= +github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= +github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= +github.com/ipfs/go-peertaskqueue v0.2.0 h1:2cSr7exUGKYyDeUyQ7P/nHPs9P7Ht/B+ROrpN1EJOjc= +github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= +github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= +github.com/ipfs/go-unixfs v0.0.4/go.mod h1:eIo/p9ADu/MFOuyxzwU+Th8D6xoxU//r590vUpWyfz8= +github.com/ipfs/go-unixfs v0.2.1/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= +github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= +github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= +github.com/ipfs/go-unixfs v0.2.6 h1:gq3U3T2vh8x6tXhfo3uSO3n+2z4yW0tYtNgVP/3sIyA= +github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= +github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= +github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= +github.com/ipfs/interface-go-ipfs-core v0.2.3 h1:E6uQ+1fJjkxJWlL9lAE72a5FWeyeeNL3GitLy8+jq3Y= +github.com/ipfs/interface-go-ipfs-core v0.2.3/go.mod h1:Tihp8zxGpUeE3Tokr94L6zWZZdkRQvG5TL6i9MuNE+s= +github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= +github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= +github.com/ipfs/iptb-plugins v0.2.1 h1:au4HWn9/pRPbkxA08pDx2oRAs4cnbgQWgV0teYXuuGA= +github.com/ipfs/iptb-plugins v0.2.1/go.mod h1:QXMbtIWZ+jRsW8a4h13qAKU7jcM7qaittO8wOsTP0Rs= +github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= +github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= +github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= +github.com/ipld/go-car v0.3.1-0.20210601190600-f512dac51e8e h1:iTAJWTWEMe0Lx8JwRaIYrYgDuI9bVzkgogGz43Yv9Eo= +github.com/ipld/go-car v0.3.1-0.20210601190600-f512dac51e8e/go.mod h1:wUxBdwOLA9/0HZBi3fnTBzla0MuwlqgJLyrhOg1XaKI= +github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= +github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= +github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7 h1:6Z0beJSZNsRY+7udoqUl4gQ/tqtrPuRvDySrlsvbqZA= +github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= +github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= +github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= +github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= +github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= +github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= +github.com/ipld/go-ipld-prime v0.5.1-0.20200828233916-988837377a7f/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= +github.com/ipld/go-ipld-prime v0.5.1-0.20201021195245-109253e8a018/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= +github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= +github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= +github.com/ipld/go-ipld-prime v0.12.0 h1:JapyKWTsJgmhrPI7hfx4V798c/RClr85sXfBZnH1VIw= +github.com/ipld/go-ipld-prime v0.12.0/go.mod h1:hy8b93WleDMRKumOJnTIrr0MbbFbx9GD6Kzxa53Xppc= +github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= +github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= +github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= +github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= +github.com/jackpal/gateway v1.0.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= +github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= +github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= +github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= +github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= +github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= +github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= +github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= +github.com/jsimonetti/rtnetlink v0.0.0-20190830100107-3784a6c7c552/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= +github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGuG/smIU4J/54PblvSbh+xvCZmpJnFgr3ds6Z55XMQ= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3/go.mod h1:BYpt4ufZiIGv2nXn4gMxnfKV306n3mWXgNu/d2TqdTU= +github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= +github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/kilic/bls12-381 v0.0.0-20200607163746-32e1441c8a9f/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= +github.com/kilic/bls12-381 v0.0.0-20200731194930-64c428e1bff5/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= +github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.11.7 h1:0hzRabrMN4tSTvMfnL3SCv1ZGeAP23ynzodBgaHeMeg= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.8 h1:bhR2mgIlno/Sfk4oUbH4sPlc83z1yGrN9bvqiq3C33I= +github.com/klauspost/cpuid/v2 v2.0.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= +github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d h1:68u9r4wEvL3gYg2jvAOgROwZ3H+Y3hIDk4tbbmIjcYQ= +github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= +github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= +github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= +github.com/libp2p/go-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw= +github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= +github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= +github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= +github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= +github.com/libp2p/go-conn-security-multistream v0.2.1 h1:ft6/POSK7F+vl/2qzegnHDaXFU0iWB4yVTYrioC6Zy0= +github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= +github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= +github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= +github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= +github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= +github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM= +github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= +github.com/libp2p/go-libp2p v0.0.2/go.mod h1:Qu8bWqFXiocPloabFGUcVG4kk94fLvfC8mWTDdFC9wE= +github.com/libp2p/go-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A= +github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= +github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= +github.com/libp2p/go-libp2p v0.3.1/go.mod h1:e6bwxbdYH1HqWTz8faTChKGR0BjPc8p+6SyP8GTTR7Y= +github.com/libp2p/go-libp2p v0.4.0/go.mod h1:9EsEIf9p2UDuwtPd0DwJsAl0qXVxgAnuDGRvHbfATfI= +github.com/libp2p/go-libp2p v0.6.0/go.mod h1:mfKWI7Soz3ABX+XEBR61lGbg+ewyMtJHVt043oWeqwg= +github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= +github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= +github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= +github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= +github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= +github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= +github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= +github.com/libp2p/go-libp2p v0.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0= +github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= +github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= +github.com/libp2p/go-libp2p v0.14.2 h1:qs0ABtjjNjS+RIXT1uM7sMJEvIc0pq2nKR0VQxFXhHI= +github.com/libp2p/go-libp2p v0.14.2/go.mod h1:0PQMADQEjCM2l8cSMYDpTgsb8gr6Zq7i4LUgq1mlW2E= +github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= +github.com/libp2p/go-libp2p-autonat v0.0.2/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= +github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= +github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= +github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= +github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= +github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= +github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= +github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= +github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= +github.com/libp2p/go-libp2p-autonat v0.4.2 h1:YMp7StMi2dof+baaxkbxaizXjY1RPvU71CXfxExzcUU= +github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= +github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A= +github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uLv+tlkGTAr3jC0S5cLg= +github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= +github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= +github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= +github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= +github.com/libp2p/go-libp2p-circuit v0.0.1/go.mod h1:Dqm0s/BiV63j8EEAs8hr1H5HudqvCAeXxDyic59lCwE= +github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= +github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= +github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= +github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8OTBGoV1AWbWor3qM= +github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= +github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= +github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= +github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= +github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= +github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= +github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4= +github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= +github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= +github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= +github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I= +github.com/libp2p/go-libp2p-core v0.0.6/go.mod h1:0d9xmaYAVY5qmbp/fcgxHT3ZJsLjYeYPMJAUKpaCHrE= +github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI= +github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0= +github.com/libp2p/go-libp2p-core v0.2.3/go.mod h1:GqhyQqyIAPsxFYXHMjfXgMv03lxsvM0mFzuYA9Ib42A= +github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g= +github.com/libp2p/go-libp2p-core v0.2.5/go.mod h1:6+5zJmKhsf7yHn1RbmYDu08qDUpIUxGdqHuEZckmZOA= +github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw= +github.com/libp2p/go-libp2p-core v0.3.1/go.mod h1:thvWy0hvaSBhnVBaW37BvzgVV68OUhgJJLAa6almrII= +github.com/libp2p/go-libp2p-core v0.4.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= +github.com/libp2p/go-libp2p-core v0.5.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= +github.com/libp2p/go-libp2p-core v0.5.1/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= +github.com/libp2p/go-libp2p-core v0.5.2/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= +github.com/libp2p/go-libp2p-core v0.5.3/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= +github.com/libp2p/go-libp2p-core v0.5.4/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= +github.com/libp2p/go-libp2p-core v0.5.5/go.mod h1:vj3awlOr9+GMZJFH9s4mpt9RHHgGqeHCopzbYKZdRjM= +github.com/libp2p/go-libp2p-core v0.5.6/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= +github.com/libp2p/go-libp2p-core v0.5.7/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= +github.com/libp2p/go-libp2p-core v0.6.0/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= +github.com/libp2p/go-libp2p-core v0.6.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.7.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.6 h1:3S8g006qG6Tjpj1JdRK2S+TWc2DJQKX/RG9fdLeiLSU= +github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= +github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= +github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-daemon v0.2.2/go.mod h1:kyrpsLB2JeNYR2rvXSVWyY0iZuRIMhqzWR3im9BV6NQ= +github.com/libp2p/go-libp2p-discovery v0.0.1/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= +github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2TUSBHFlOCetzYdbZL5I= +github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= +github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= +github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= +github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= +github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.5.1 h1:CJylx+h2+4+s68GvrM4pGNyfNhOYviWBPtVv5PA7sfo= +github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= +github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= +github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= +github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= +github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= +github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= +github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= +github.com/libp2p/go-libp2p-kad-dht v0.11.0/go.mod h1:5ojtR2acDPqh/jXf5orWy8YGb8bHQDS+qeDcoscL/PI= +github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= +github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk= +github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= +github.com/libp2p/go-libp2p-mplex v0.1.1/go.mod h1:KUQWpGkCzfV7UIpi8SKsAVxyBgz1c9R5EvxgnwLsb/I= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= +github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= +github.com/libp2p/go-libp2p-mplex v0.3.0/go.mod h1:l9QWxRbbb5/hQMECEb908GbS9Sm2UAR2KFZKUJEynEs= +github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= +github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= +github.com/libp2p/go-libp2p-nat v0.0.2/go.mod h1:QrjXQSD5Dj4IJOdEcjHRkWTSomyxRo6HnUkf/TfQpLQ= +github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= +github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= +github.com/libp2p/go-libp2p-nat v0.0.6 h1:wMWis3kYynCbHoyKLPBEMu4YRLltbm8Mk08HGSfvTkU= +github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= +github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= +github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= +github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= +github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= +github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= +github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= +github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= +github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= +github.com/libp2p/go-libp2p-peerstore v0.0.6/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= +github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs= +github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= +github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= +github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= +github.com/libp2p/go-libp2p-peerstore v0.2.3/go.mod h1:K8ljLdFn590GMttg/luh4caB/3g0vKuY01psze0upRw= +github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= +github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= +github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= +github.com/libp2p/go-libp2p-peerstore v0.2.8 h1:nJghUlUkFVvyk7ccsM67oFA6kqUkwyCM1G4WPVMCWYA= +github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= +github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= +github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= +github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= +github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= +github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= +github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= +github.com/libp2p/go-libp2p-pubsub v0.5.4 h1:rHl9/Xok4zX3zgi0pg0XnUj9Xj2OeXO8oTu85q2+YA8= +github.com/libp2p/go-libp2p-pubsub v0.5.4/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= +github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= +github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= +github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= +github.com/libp2p/go-libp2p-quic-transport v0.11.2 h1:p1YQDZRHH4Cv2LPtHubqlQ9ggz4CKng/REZuXZbZMhM= +github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= +github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= +github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= +github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= +github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= +github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0= +github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= +github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= +github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= +github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw= +github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= +github.com/libp2p/go-libp2p-secio v0.0.3/go.mod h1:hS7HQ00MgLhRO/Wyu1bTX6ctJKhVpm+j2/S2A5UqYb0= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= +github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= +github.com/libp2p/go-libp2p-secio v0.2.2/go.mod h1:wP3bS+m5AUnFA+OFO7Er03uO1mncHG0uVwGrwvjYlNY= +github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= +github.com/libp2p/go-libp2p-swarm v0.0.6/go.mod h1:s5GZvzg9xXe8sbeESuFpjt8CJPTCa8mhEusweJqyFy8= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU= +github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= +github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= +github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= +github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= +github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= +github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= +github.com/libp2p/go-libp2p-swarm v0.3.1/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= +github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= +github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= +github.com/libp2p/go-libp2p-swarm v0.5.3 h1:hsYaD/y6+kZff1o1Mc56NcuwSg80lIphTS/zDk3mO4M= +github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= +github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= +github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= +github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= +github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= +github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= +github.com/libp2p/go-libp2p-testing v0.4.2 h1:IOiA5mMigi+eEjf4J+B7fepDhsjtsoWA9QbsCqbNp5U= +github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= +github.com/libp2p/go-libp2p-tls v0.1.3 h1:twKMhMu44jQO+HgQK9X8NHO5HkeJu2QbhLzLJpa8oNM= +github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= +github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= +github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= +github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= +github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= +github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= +github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= +github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= +github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= +github.com/libp2p/go-libp2p-transport-upgrader v0.4.6 h1:SHt3g0FslnqIkEWF25YOB8UCOCTpGAVvHRWQYJ+veiI= +github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= +github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= +github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= +github.com/libp2p/go-libp2p-yamux v0.2.2/go.mod h1:lIohaR0pT6mOt0AZ0L2dFze9hds9Req3OfS+B+dv4qw= +github.com/libp2p/go-libp2p-yamux v0.2.5/go.mod h1:Zpgj6arbyQrmZ3wxSZxfBmbdnWtbZ48OpsfmQVTErwA= +github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhLEn0XhIoZ5viCwU= +github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= +github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= +github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= +github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= +github.com/libp2p/go-libp2p-yamux v0.5.3/go.mod h1:Vy3TMonBAfTMXHWopsMc8iX/XGRYrRlpUaMzaeuHV/s= +github.com/libp2p/go-libp2p-yamux v0.5.4 h1:/UOPtT/6DHPtr3TtKXBHa6g0Le0szYuI33Xc/Xpd7fQ= +github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= +github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= +github.com/libp2p/go-maddr-filter v0.1.0 h1:4ACqZKw8AqiuJfwFGq1CYDFugfXTOos+qQ3DETkhtCE= +github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= +github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.0.4/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= +github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= +github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= +github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= +github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-msgio v0.0.6 h1:lQ7Uc0kS1wb1EfRxO2Eir/RJoHkHn7t6o+EiwsYIKJA= +github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= +github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= +github.com/libp2p/go-nat v0.0.5 h1:qxnwkco8RLKqVh1NmjQ+tJ8p8khNLFxuElYG/TwqW4Q= +github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= +github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= +github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= +github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= +github.com/libp2p/go-netroute v0.1.6 h1:ruPJStbYyXVYGQ81uzEDzuvbYRLKRrLvTYd33yomC38= +github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= +github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= +github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= +github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= +github.com/libp2p/go-reuseport v0.0.2 h1:XSG94b1FJfGA01BUrT82imejHQyTxO4jEWqheyCXYvU= +github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= +github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= +github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= +github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= +github.com/libp2p/go-reuseport-transport v0.0.5 h1:lJzi+vSYbyJj2faPKLxNGWEIBcaV/uJmyvsUxXy2mLw= +github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= +github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= +github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= +github.com/libp2p/go-sockaddr v0.1.1 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= +github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= +github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= +github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqXJyFvB0mR4A04sQ= +github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-stream-muxer-multistream v0.3.0 h1:TqnSHPJEIqDEO7h1wZZ0p3DXdvDSiLHQidKKUGZtiOY= +github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= +github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= +github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= +github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= +github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M= +github.com/libp2p/go-tcp-transport v0.2.7 h1:Z8Kc/Kb8tD84WiaH55xAlaEnkqzrp88jSEySCKV4+gg= +github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= +github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= +github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= +github.com/libp2p/go-ws-transport v0.0.1/go.mod h1:p3bKjDWHEgtuKKj+2OdPYs5dAPIjtpQGHF2tJfGz7Ww= +github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= +github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= +github.com/libp2p/go-ws-transport v0.1.2/go.mod h1:dsh2Ld8F+XNmzpkaAijmg5Is+e9l6/1tK/6VFOdN69Y= +github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= +github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= +github.com/libp2p/go-ws-transport v0.3.1/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= +github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= +github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.3.6/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= +github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= +github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= +github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= +github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= +github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= +github.com/libp2p/go-yamux/v2 v2.2.0 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWoAFU= +github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= +github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= +github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= +github.com/lucas-clemente/quic-go v0.21.2 h1:8LqqL7nBQFDUINadW0fHV/xSaCQJgmJC0Gv+qUnjd78= +github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= +github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= +github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= +github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= +github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= +github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk= +github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= +github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-15 v0.1.5 h1:Ci4EIUN6Rlb+D6GmLdej/bCQ4nPYNtVXQB+xjiXE1nk= +github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= +github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= +github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1 h1:/rpmWuGvceLwwWuaKPdjpR4JJEUH0tq64/I3hvzaNLM= +github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= +github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= +github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc= +github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= +github.com/mdlayher/netlink v0.0.0-20190828143259-340058475d09/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M= +github.com/mdlayher/netlink v1.0.0/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M= +github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcKp9uZHgmY= +github.com/mdlayher/wifi v0.0.0-20190303161829-b1436901ddee/go.mod h1:Evt/EIne46u9PtQbeTx2NTcqURpr5K4SvKtGmBuDPN8= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= +github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= +github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= +github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= +github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= @@ -77,102 +1244,883 @@ github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= +github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= +github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= +github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z7tZ04iMk5wP4QMGGE= +github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= +github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI= +github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= +github.com/multiformats/go-multiaddr v0.3.3 h1:vo2OTSAqnENB2rLk79pLtr+uhj+VAzSe3uef5q0lRSs= +github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= +github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.1.0/go.mod h1:01k2RAqtoXIuPa3DCavAE9/6jc6nM0H3EgZyfUhN2oY= +github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= +github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= +github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= +github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= +github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= +github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= +github.com/multiformats/go-multiaddr-net v0.1.1/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= +github.com/multiformats/go-multiaddr-net v0.1.2/go.mod h1:QsWt3XK/3hwvNxZJp92iMQKME1qHfpYmyIjFVsSOY6Y= +github.com/multiformats/go-multiaddr-net v0.1.3/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= +github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= +github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= +github.com/multiformats/go-multiaddr-net v0.2.0 h1:MSXRGN0mFymt6B1yo/6BPnIRpLPEnKgQNvVfCX5VDJk= +github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= +github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= +github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= +github.com/multiformats/go-multicodec v0.2.1-0.20210714093213-b2b5bd6fe68b/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= +github.com/multiformats/go-multicodec v0.3.0 h1:tstDwfIjiHbnIjeM5Lp+pMrSeN+LCMsEwOrkPmWm03A= +github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multihash v0.0.7/go.mod h1:XuKXPp8VHcTygube3OWZC+aZrA+H1IhmjoCDtJc7PXM= +github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= +github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= +github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= +github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= +github.com/multiformats/go-multistream v0.2.2 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= +github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= +github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM= +github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= +github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= +github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333/go.mod h1:Ag6rSXkHIckQmjFBCweJEEt1mrTPBv8b9W4aU/NQWfI= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= +github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= +github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= +github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a h1:hjZfReYVLbqFkAtr2us7vdy04YWz3LVAirzP7reh8+M= github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e h1:ZOcivgkkFRnjfoTcGsDq3UQYiBmekwLA+qg0OjyB/ls= +github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= +github.com/prometheus/client_golang v1.10.0 h1:/o0BDeWzLWXNZ+4q5gXltUvaMpJqckTa+jTNoB+z4cg= +github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.18.0 h1:WCVKW7aL6LEe1uryfI9dnEc2ZqNB1Fn0ok930v0iL1Y= +github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.1.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= +github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= +github.com/raulk/go-watchdog v1.0.1/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/cors v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI= +github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sercand/kuberesolver v2.1.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= +github.com/sercand/kuberesolver v2.4.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAriGFsTZppLXDX93OM= +github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= +github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= +github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= +github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= +github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= +github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= +github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= +github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= +github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= +github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= +github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= +github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= +github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= +github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= +github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= +github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= +github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= +github.com/siebenmann/go-kstat v0.0.0-20160321171754-d34789b79745/go.mod h1:G81aIFAMS9ECrwBYR9YxhlPjWgrItd+Kje78O6+uqm8= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= -github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a/go.mod h1:LeFCbQYJ3KJlPs/FvPz2dy1tkpxyeNESVyCNNzRXFR0= +github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= +github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= +github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= +github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tj/go-spin v1.1.0 h1:lhdWZsvImxvZ3q1C5OIB7d72DuOwP4O2NdBg9PyzNds= +github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-client-go v2.23.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= +github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= +github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= +github.com/warpfork/go-testmark v0.3.0 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= +github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830 h1:8kxMKmKzXXL4Ru1nyhvdms/JjWt+3YLpvRb/bAjO/y0= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w= +github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5/go.mod h1:c98fKi5B9u8OsKGiWHLRKus6ToQ1Tubeow44ECO1uxY= +github.com/weaveworks/promrus v1.2.0/go.mod h1:SaE82+OJ91yqjrE1rsvBWVzNZKcHYFtMUyS1+Ogs/KA= +github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM= +github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba h1:X4n8JG2e2biEZZXdBKt9HX7DN3bYGFUqljqqy0DqgnY= +github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba/go.mod h1:CHQnYnQUEPydYCwuy8lmTHfGmdw9TKrhWV0xLx8l0oM= +github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= +github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= +github.com/whyrusleeping/cbor-gen v0.0.0-20200402171437-3d27c146c105/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= +github.com/whyrusleeping/cbor-gen v0.0.0-20200710004633-5379fc63235d/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200715143311-227fab5a2377/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20200723185710-6a3894a6352b/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200806213330-63aa96ca5488/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200810223238-211df3b9e24c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 h1:7WtW9D9VGpmRLuQmrPy2JobUNdka95z3MKEVpELtOjo= github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= +github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= +github.com/whyrusleeping/go-ctrlnet v0.0.0-20180313164037-f564fbbdaa95/go.mod h1:SJqKCCPXRfBFCwXjfNT/skfsceF7+MBFLI2OrvuRA7g= +github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= +github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= +github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= +github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= +github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= +github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= +github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= +github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= +github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4/go.mod h1:K+EVq8d5QcQ2At5VECsA+SNZvWefyBXh8TnIsxo1OvQ= +github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= +github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= +github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= +github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= +github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= +github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325/go.mod h1:g7ckxrjiFh8mi1AY7ox23PZD0g6QU/TxW3U3unX7I3A= +github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= +github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= +github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= +github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/c-for-go v0.0.0-20200718154222-87b0065af829 h1:wb7xrDzfkLgPHsSEBm+VSx6aDdi64VtV0xvP0E6j8bk= +github.com/xlab/c-for-go v0.0.0-20200718154222-87b0065af829/go.mod h1:h/1PEBwj7Ym/8kOuMWvO2ujZ6Lt+TMbySEXNhjjR87I= +github.com/xlab/pkgconfig v0.0.0-20170226114623-cea12a0fd245 h1:Sw125DKxZhPUI4JLlWugkzsrlB50jR9v2khiD9FxuSo= +github.com/xlab/pkgconfig v0.0.0-20170226114623-cea12a0fd245/go.mod h1:C+diUUz7pxhNY6KAoLgrTYARGWnt82zWTylZlxT92vk= github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= +github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 h1:oWgZJmC1DorFZDpfMfWg7xk29yEOZiXmo/wZl+utTI8= +github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.12.1/go.mod h1:KatxXrVDzgWwbssUWsF5+cOJHXPvzQ09YSlzGNuhOEo= +go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= +go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= +go.dedis.ch/kyber/v3 v3.0.9/go.mod h1:rhNjUUg6ahf8HEg5HUvVBYoWY4boAafX8tYxX+PS+qg= +go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= +go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= +go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= +go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= +go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= +go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= +golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= +golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= +golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 h1:Jp57DBw4K7mimZNA3F9f7CndVcUt4kJjmyJf2rzJHoI= +golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200519113804-d87ec0cfa476/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201022231255-08b38378de70/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190902133755-9109b7679e13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191025090151-53bf42e6b339/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210309074719-68d13333faf2 h1:46ULzRKLh1CwgRq2dC5SlBzEqqNCi8rreOZnNrbqcIY= +golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200216192241-b320d3a0f5a2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200711155855-7342f9734a7d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= +gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= +modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= +modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/golex v1.0.0 h1:wWpDlbK8ejRfSyi0frMyhilD3JBvtcx2AdGDnU+JtsE= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/mathutil v1.1.1 h1:FeylZSVX8S+58VsyJlkEj2bcpdytmp9MmDKZkKx8OIE= +modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/strutil v1.1.0 h1:+1/yCzZxY2pZwwrsbH+4T7BQMoLQ9QiBshRC9eicYsc= +modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0 h1:7ccXrupWZIS3twbUGrtKmHS2DXY6xegFua+6O3xgAFU= +modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= From 4be7f6f8206d79886754019a71937e16708d5742 Mon Sep 17 00:00:00 2001 From: dtynn Date: Wed, 17 Nov 2021 15:21:56 +0800 Subject: [PATCH 013/167] feat: add value providers for chain-related types --- .../testutil/value_provdier_chain_test.go | 74 +++++++++++ venus-shared/testutil/value_provider_chain.go | 123 ++++++++++++++++++ .../testutil/value_provider_primitive.go | 9 +- .../testutil/value_provider_primitive_test.go | 38 ++++++ .../testutil/value_provider_registry.go | 63 ++++++++- 5 files changed, 300 insertions(+), 7 deletions(-) create mode 100644 venus-shared/testutil/value_provdier_chain_test.go create mode 100644 venus-shared/testutil/value_provider_chain.go diff --git a/venus-shared/testutil/value_provdier_chain_test.go b/venus-shared/testutil/value_provdier_chain_test.go new file mode 100644 index 0000000000..e42690047e --- /dev/null +++ b/venus-shared/testutil/value_provdier_chain_test.go @@ -0,0 +1,74 @@ +package testutil + +import ( + "testing" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/crypto" + "github.com/ipfs/go-cid" + "github.com/stretchr/testify/assert" +) + +func TestDefaultCid(t *testing.T) { + var c cid.Cid + Provide(t, &c) + assert.NotEqual(t, cid.Undef, c) +} + +func TestDefaultCidSlice(t *testing.T) { + cs := make([]cid.Cid, 16) + Provide(t, &cs) + for ci := range cs { + assert.NotEqual(t, cid.Undef, cs[ci]) + } +} + +func TestDefaultAddresses(t *testing.T) { + addrs := make([]address.Address, 256) + protos := map[address.Protocol]struct{}{} + Provide(t, &addrs) + for i := range addrs { + protos[addrs[i].Protocol()] = struct{}{} + } + + assert.True(t, len(protos) == 4) +} + +func TestDefaultIDAddresses(t *testing.T) { + addrs := make([]address.Address, 256) + protos := map[address.Protocol]struct{}{} + Provide(t, &addrs, IDAddressProvider()) + for i := range addrs { + protos[addrs[i].Protocol()] = struct{}{} + } + + assert.True(t, len(protos) == 1) +} + +func TestDefaultBigs(t *testing.T) { + bigs := make([]big.Int, 256) + Provide(t, &bigs) + hasPositive := false + hasNegative := false + zero := big.Zero() + for bi := range bigs { + assert.NotNil(t, bigs[bi].Int) + hasPositive = hasPositive || bigs[bi].GreaterThan(zero) + hasNegative = hasNegative || bigs[bi].LessThan(zero) + } + + assert.True(t, hasPositive) + assert.True(t, hasNegative) +} + +func TestDefaultSigTypes(t *testing.T) { + sigtyps := make([]crypto.SigType, 256) + Provide(t, &sigtyps) + typs := map[crypto.SigType]struct{}{} + for i := range sigtyps { + typs[sigtyps[i]] = struct{}{} + } + + assert.True(t, len(typs) == 2) +} diff --git a/venus-shared/testutil/value_provider_chain.go b/venus-shared/testutil/value_provider_chain.go new file mode 100644 index 0000000000..06bc3bd4de --- /dev/null +++ b/venus-shared/testutil/value_provider_chain.go @@ -0,0 +1,123 @@ +package testutil + +import ( + "math/rand" + "testing" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/crypto" + "github.com/ipfs/go-cid" +) + +const idmask = uint64(1<<63) - 1 + +func init() { + MustRegisterDefaultValueProvier(CidProvider(defaultBytesFixedSize)) + MustRegisterDefaultValueProvier(AddressProvider()) + MustRegisterDefaultValueProvier(BigProvider()) + MustRegisterDefaultValueProvier(CryptoSigTypeProvider()) +} + +func CidProvider(size int) func(*testing.T) cid.Cid { + bytesProvider := BytesFixedProvider(size) + return func(t *testing.T) cid.Cid { + data := bytesProvider(t) + c, err := abi.CidBuilder.Sum(data) + if err != nil { + t.Fatalf("CidBuilder.Sum: %s", err) + } + + return c + } +} + +func IDAddressProvider() func(*testing.T) address.Address { + return func(t *testing.T) address.Address { + id := rand.Uint64() + addr, err := address.NewIDAddress(id & idmask) + if err != nil { + t.Fatalf("generate id address for %d: %s", id, err) + } + + return addr + } +} + +func ActorAddressProvider(size int) func(*testing.T) address.Address { + bytesProvider := BytesFixedProvider(size) + return func(t *testing.T) address.Address { + data := bytesProvider(t) + addr, err := address.NewActorAddress(data) + if err != nil { + t.Fatalf("generate actor address for %x: %s", data, err) + } + + return addr + } +} + +func SecpAddressProvider(size int) func(*testing.T) address.Address { + bytesProvider := BytesFixedProvider(size) + return func(t *testing.T) address.Address { + data := bytesProvider(t) + addr, err := address.NewSecp256k1Address(data) + if err != nil { + t.Fatalf("generate secp address for %x: %s", data, err) + } + + return addr + } +} + +func BlsAddressProvider() func(*testing.T) address.Address { + bytesProvider := BytesFixedProvider(address.BlsPublicKeyBytes) + return func(t *testing.T) address.Address { + pubkey := bytesProvider(t) + addr, err := address.NewBLSAddress(pubkey) + if err != nil { + t.Fatalf("generate bls address for %x: %s", pubkey, err) + } + + return addr + } +} + +func AddressProvider() func(*testing.T) address.Address { + providers := []func(*testing.T) address.Address{ + IDAddressProvider(), + ActorAddressProvider(defaultBytesFixedSize), + SecpAddressProvider(defaultBytesFixedSize), + BlsAddressProvider(), + } + + return func(t *testing.T) address.Address { + next := rand.Intn(len(providers)) + return providers[next](t) + } +} + +func BigProvider() func(*testing.T) big.Int { + bytesProvider := BytesFixedProvider(16) + return func(t *testing.T) big.Int { + data := bytesProvider(t) + data[0] &= 1 + n, err := big.FromBytes(data) + if err != nil { + t.Fatalf("generate big.Int from bytes %x", data) + } + + return n + } +} + +func CryptoSigTypeProvider() func(*testing.T) crypto.SigType { + opts := []crypto.SigType{ + crypto.SigTypeSecp256k1, + crypto.SigTypeBLS, + } + return func(t *testing.T) crypto.SigType { + return opts[rand.Intn(len(opts))] + } +} diff --git a/venus-shared/testutil/value_provider_primitive.go b/venus-shared/testutil/value_provider_primitive.go index 3160815f9c..eeda9eebad 100644 --- a/venus-shared/testutil/value_provider_primitive.go +++ b/venus-shared/testutil/value_provider_primitive.go @@ -19,13 +19,14 @@ const ( func IntProvider(t *testing.T) int { return rand.Int() } -func IntAtMostProvider(n int) func(*testing.T) int { +func IntRangedProvider(min, max int) func(*testing.T) int { return func(t *testing.T) int { - if n <= 0 { - t.Fatalf("get non-positive limit number %d", n) + gap := max - min + if gap <= 0 { + t.Fatalf("invalid range [%d, %d)", min, max) } - return rand.Intn(n) + return min + rand.Intn(gap) } } diff --git a/venus-shared/testutil/value_provider_primitive_test.go b/venus-shared/testutil/value_provider_primitive_test.go index 34c3808c62..99414e0b4e 100644 --- a/venus-shared/testutil/value_provider_primitive_test.go +++ b/venus-shared/testutil/value_provider_primitive_test.go @@ -127,6 +127,18 @@ func TestDefaultIntSlice(t *testing.T) { assert.Equal(t, dest[0], local.Int()) } +func TestDefaultIntSliceWithLen(t *testing.T) { + local := getRand() + + var dest []int + Provide(t, &dest, WithSliceLen(10)) + + assert.Len(t, dest, 10) + for i := range dest { + assert.Equal(t, dest[i], local.Int()) + } +} + func TestDefaultIntTypeSlice(t *testing.T) { type number int assert.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(number(0)))) @@ -170,6 +182,32 @@ func TestIntSliceWithFixedNumber(t *testing.T) { assert.Equal(t, expected, dest) } +func TestIntSliceRanged(t *testing.T) { + min := 10 + max := 20 + + dest := make([]int, 256) + Provide(t, &dest, IntRangedProvider(min, max)) + + for i := range dest { + assert.GreaterOrEqual(t, dest[i], min) + assert.Less(t, dest[i], max) + } +} + +func TestNegativeIntSliceRanged(t *testing.T) { + min := -20 + max := -10 + + dest := make([]int, 256) + Provide(t, &dest, IntRangedProvider(min, max)) + + for i := range dest { + assert.GreaterOrEqual(t, dest[i], min) + assert.Less(t, dest[i], max) + } +} + func TestDefaultIntArray(t *testing.T) { local := getRand() diff --git a/venus-shared/testutil/value_provider_registry.go b/venus-shared/testutil/value_provider_registry.go index 29f94236dc..840662bf80 100644 --- a/venus-shared/testutil/value_provider_registry.go +++ b/venus-shared/testutil/value_provider_registry.go @@ -7,7 +7,22 @@ import ( "testing" ) -var typeT = reflect.TypeOf((*testing.T)(nil)) +var ( + typeT = reflect.TypeOf((*testing.T)(nil)) + typeInt = reflect.TypeOf(int(0)) +) + +type OptionFunc func(*testing.T, *valueProviderRegistry) + +func WithSliceLen(size int) OptionFunc { + return func(t *testing.T, r *valueProviderRegistry) { + if size < 1 { + t.Fatalf("slice len must be >= 1, got %d", size) + } + + r.opt.sliceLen = &size + } +} func Provide(t *testing.T, dst interface{}, specifiedFns ...interface{}) { rval := reflect.ValueOf(dst) @@ -19,6 +34,12 @@ func Provide(t *testing.T, dst interface{}, specifiedFns ...interface{}) { if len(specifiedFns) > 0 { reg = defaultValueProviderRegistry.clone() for fni := range specifiedFns { + fn := specifiedFns[fni] + if opt, ok := fn.(OptionFunc); ok { + opt(t, reg) + continue + } + if err := reg.register(specifiedFns[fni]); err != nil { t.Fatalf("register specified provider %T for %T: %s", specifiedFns[fni], dst, err) } @@ -45,11 +66,16 @@ var defaultValueProviderRegistry = &valueProviderRegistry{ type valueProviderRegistry struct { sync.RWMutex providers map[reflect.Type]reflect.Value + + opt struct { + sliceLen *int + } } func (r *valueProviderRegistry) clone() *valueProviderRegistry { cloned := &valueProviderRegistry{ providers: map[reflect.Type]reflect.Value{}, + opt: r.opt, } r.Lock() @@ -112,6 +138,33 @@ func (r *valueProviderRegistry) provide(t *testing.T, rval reflect.Value) { return } + rkind := rtyp.Kind() + switch rkind { + case reflect.Int, + reflect.Int8, + reflect.Int16, + reflect.Int32, + reflect.Int64, + reflect.Uint, + reflect.Uint8, + reflect.Uint16, + reflect.Uint32, + reflect.Uint64, + reflect.Float32, + reflect.Float64: + + r.RLock() + provider, ok = r.providers[typeInt] + r.RUnlock() + + } + + if ok { + ret := provider.Call([]reflect.Value{reflect.ValueOf(t)}) + rval.Set(ret[0].Convert(rtyp)) + return + } + r.RLock() var convertor reflect.Value for pt := range r.providers { @@ -128,11 +181,15 @@ func (r *valueProviderRegistry) provide(t *testing.T, rval reflect.Value) { return } - rkind := rtyp.Kind() switch rkind { case reflect.Slice: if rval.IsNil() || rval.Len() == 0 { - rval.Set(reflect.MakeSlice(rtyp, 1, 1)) + size := 1 + if r.opt.sliceLen != nil { + size = *r.opt.sliceLen + } + + rval.Set(reflect.MakeSlice(rtyp, size, size)) } for i := 0; i < rval.Len(); i++ { From 7fa55909714e8a086c8a88f57798583738c3078a Mon Sep 17 00:00:00 2001 From: dtynn Date: Wed, 17 Nov 2021 18:25:40 +0800 Subject: [PATCH 014/167] chore: basic test util for cbor types --- venus-shared/chain/block_header_test.go | 48 ++++++++++++++++++ venus-shared/chain/block_msg_test.go | 59 +++++++++++++++++++++++ venus-shared/chain/election_proof_test.go | 56 +++++++++++++++++++++ venus-shared/chain/message_test.go | 43 +++++++++++++++++ venus-shared/chain/util_test.go | 51 ++++++++++++++++++++ 5 files changed, 257 insertions(+) create mode 100644 venus-shared/chain/block_msg_test.go create mode 100644 venus-shared/chain/election_proof_test.go create mode 100644 venus-shared/chain/message_test.go create mode 100644 venus-shared/chain/util_test.go diff --git a/venus-shared/chain/block_header_test.go b/venus-shared/chain/block_header_test.go index 5c9978d115..c18c801006 100644 --- a/venus-shared/chain/block_header_test.go +++ b/venus-shared/chain/block_header_test.go @@ -1,12 +1,15 @@ package chain import ( + "bytes" "encoding/hex" "testing" "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" "github.com/stretchr/testify/assert" + + "github.com/filecoin-project/venus/venus-shared/testutil" ) func TestBlockHeaderMarshal(t *testing.T) { @@ -48,3 +51,48 @@ func TestBlockHeaderMarshal(t *testing.T) { assert.Equal(t, c, blk.Cid(), "check for blk.Cid()") assert.Equal(t, b, blk.RawData(), "check for blk.RawData()") } + +func TestBlockHeaderBasic(t *testing.T) { + var buf bytes.Buffer + sliceLen := 5 + bytesLen := 32 + for i := 0; i < 64; i++ { + var src, dst BlockHeader + + opt := cborBasicTestOptions{ + buf: &buf, + before: func() { + assert.Equal(t, src, dst) + }, + + provideOpts: []interface{}{ + testutil.WithSliceLen(sliceLen), + testutil.BytesFixedProvider(bytesLen), + testutil.IDAddressProvider(), + }, + + provided: func() { + assert.Equal(t, src.Miner.Protocol(), address.ID, "miner addr proto") + assert.Len(t, src.Parents, sliceLen, "parents length") + assert.NotNil(t, src.ElectionProof, "ElectionProof") + assert.Len(t, src.ElectionProof.VRFProof, bytesLen, "VRFProof len") + assert.NotNil(t, src.BlockSig, "BlockSig") + assert.Len(t, src.BlockSig.Data, bytesLen, "BlockSig.Data len") + assert.NotNil(t, src.BLSAggregate, "BLSAggregate") + assert.Len(t, src.BLSAggregate.Data, bytesLen, "BLSAggregate.Data len") + }, + + marshaled: func(b []byte) { + decoded, err := DecodeBlock(b) + assert.NoError(t, err, "DecodeBlock") + assert.Equal(t, src, *decoded) + }, + + after: func() { + assert.Equal(t, src, dst) + }, + } + + cborBasicTest(t, &src, &dst, opt) + } +} diff --git a/venus-shared/chain/block_msg_test.go b/venus-shared/chain/block_msg_test.go new file mode 100644 index 0000000000..6a5d4ea708 --- /dev/null +++ b/venus-shared/chain/block_msg_test.go @@ -0,0 +1,59 @@ +package chain + +import ( + "bytes" + "testing" + + "github.com/ipfs/go-cid" + "github.com/stretchr/testify/assert" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/venus/venus-shared/testutil" +) + +func TestBlockMsgBasic(t *testing.T) { + msgLen := 16 + emptyCids := make([]cid.Cid, msgLen) + + var buf bytes.Buffer + for i := 0; i < 32; i++ { + var src, dst BlockMsg + + opt := cborBasicTestOptions{ + buf: &buf, + before: func() { + assert.Equal(t, src, dst) + assert.Nil(t, src.Header) + assert.Nil(t, src.BlsMessages) + assert.Nil(t, src.SecpkMessages) + }, + + provideOpts: []interface{}{ + testutil.WithSliceLen(msgLen), + }, + + provided: func() { + assert.NotEqual(t, src, dst, "value provided") + assert.NotNil(t, src.Header) + assert.NotEqual(t, emptyCids, src.BlsMessages) + assert.NotEqual(t, emptyCids, src.SecpkMessages) + }, + + marshaled: func(b []byte) { + bmCid := src.Cid() + assert.Equal(t, bmCid, src.Header.Cid(), "Cid() result for BlockMsg") + + sumCid, err := abi.CidBuilder.Sum(b) + assert.NoError(t, err, "CidBuilder.Sum") + + assert.NotEqual(t, bmCid, sumCid) + }, + + after: func() { + assert.Equal(t, src, dst, "after unmarshaling") + }, + } + + cborBasicTest(t, &src, &dst, opt) + } +} diff --git a/venus-shared/chain/election_proof_test.go b/venus-shared/chain/election_proof_test.go new file mode 100644 index 0000000000..ac002d0999 --- /dev/null +++ b/venus-shared/chain/election_proof_test.go @@ -0,0 +1,56 @@ +package chain + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/filecoin-project/venus/venus-shared/testutil" +) + +func TestElectionProofBasic(t *testing.T) { + vrfLen := 32 + winCountMin := int64(3) + winCountMax := int64(10) + var buf bytes.Buffer + for i := 0; i < 32; i++ { + var src, dst ElectionProof + + opt := cborBasicTestOptions{ + buf: &buf, + before: func() { + assert.Equal(t, src, dst, "empty values") + }, + + provideOpts: []interface{}{ + testutil.BytesFixedProvider(vrfLen), + testutil.IntRangedProvider(int(winCountMin), int(winCountMax)), + }, + + provided: func() { + assert.NotEqual(t, src, dst, "src value provided") + assert.Len(t, src.VRFProof, vrfLen, "vrf length") + assert.GreaterOrEqual(t, src.WinCount, winCountMin, "win count min") + assert.Less(t, src.WinCount, winCountMax, "win count max") + }, + + after: func() { + assert.Equal(t, src, dst, "from src to dst through cbor") + + t1, t2 := Ticket{ + VRFProof: src.VRFProof, + }, Ticket{ + VRFProof: dst.VRFProof, + } + + assert.Equal(t, t1, t2, "ticket") + + assert.True(t, t1.Compare(&t2) == 0, "ticket equal") + assert.Equal(t, t1.Quality(), t2.Quality()) + }, + } + + cborBasicTest(t, &src, &dst, opt) + } +} diff --git a/venus-shared/chain/message_test.go b/venus-shared/chain/message_test.go new file mode 100644 index 0000000000..05316ef0db --- /dev/null +++ b/venus-shared/chain/message_test.go @@ -0,0 +1,43 @@ +package chain + +import ( + "bytes" + "testing" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/venus/venus-shared/testutil" + "github.com/stretchr/testify/assert" +) + +func TestMessageBasic(t *testing.T) { + paramsLen := 32 + var buf bytes.Buffer + for i := 0; i < 32; i++ { + var src, dst Message + opt := cborBasicTestOptions{ + buf: &buf, + before: func() { + assert.Equal(t, src, dst, "empty values") + }, + + provideOpts: []interface{}{ + testutil.BytesFixedProvider(paramsLen), + testutil.BlsAddressProvider(), + }, + + provided: func() { + assert.NotEqual(t, src, dst, "value provided") + assert.Equal(t, src.From.Protocol(), address.BLS, "from addr proto") + assert.Equal(t, src.To.Protocol(), address.BLS, "to addr proto") + assert.Len(t, src.Params, paramsLen, "params length") + }, + + after: func() { + assert.Equal(t, src, dst) + assert.Equal(t, src.Cid(), dst.Cid()) + }, + } + + cborBasicTest(t, &src, &dst, opt) + } +} diff --git a/venus-shared/chain/util_test.go b/venus-shared/chain/util_test.go new file mode 100644 index 0000000000..7824106e52 --- /dev/null +++ b/venus-shared/chain/util_test.go @@ -0,0 +1,51 @@ +package chain + +import ( + "bytes" + "testing" + + "github.com/filecoin-project/go-state-types/cbor" + "github.com/stretchr/testify/assert" + + "github.com/filecoin-project/venus/venus-shared/testutil" +) + +type cborBasicTestOptions struct { + buf *bytes.Buffer + + before func() + + provideOpts []interface{} + provided func() + + marshaled func([]byte) + + after func() +} + +func cborBasicTest(t *testing.T, src, dst cbor.Er, opt cborBasicTestOptions) { + if opt.before != nil { + opt.before() + } + + testutil.Provide(t, src, opt.provideOpts...) + if opt.provided != nil { + opt.provided() + } + + opt.buf.Reset() + err := src.MarshalCBOR(opt.buf) + assert.NoErrorf(t, err, "marshaling from src of %T", src) + + data := opt.buf.Bytes() + if opt.marshaled != nil { + opt.marshaled(data) + } + + err = dst.UnmarshalCBOR(bytes.NewReader(data)) + assert.NoErrorf(t, err, "unmarshaling to dst of %T", dst) + + if opt.after != nil { + opt.after() + } +} From c37fa90e33ff7017f4125eabc3c938b48e118b15 Mon Sep 17 00:00:00 2001 From: dtynn Date: Thu, 18 Nov 2021 09:53:24 +0800 Subject: [PATCH 015/167] feat: move cborErBasic into testutil --- venus-shared/chain/block_header_test.go | 16 ++--- venus-shared/chain/block_msg_test.go | 16 ++--- venus-shared/chain/election_proof_test.go | 14 ++-- venus-shared/chain/message_test.go | 14 ++-- venus-shared/chain/util_test.go | 51 -------------- venus-shared/testutil/cbor_basic.go | 45 ++++++++++++ venus-shared/testutil/cbor_basic_test.go | 68 +++++++++++++++++++ .../testutil/value_provider_registry.go | 12 ++-- 8 files changed, 149 insertions(+), 87 deletions(-) delete mode 100644 venus-shared/chain/util_test.go create mode 100644 venus-shared/testutil/cbor_basic.go create mode 100644 venus-shared/testutil/cbor_basic_test.go diff --git a/venus-shared/chain/block_header_test.go b/venus-shared/chain/block_header_test.go index c18c801006..e72262838b 100644 --- a/venus-shared/chain/block_header_test.go +++ b/venus-shared/chain/block_header_test.go @@ -59,19 +59,19 @@ func TestBlockHeaderBasic(t *testing.T) { for i := 0; i < 64; i++ { var src, dst BlockHeader - opt := cborBasicTestOptions{ - buf: &buf, - before: func() { + opt := testutil.CborErBasicTestOptions{ + Buf: &buf, + Prepare: func() { assert.Equal(t, src, dst) }, - provideOpts: []interface{}{ + ProvideOpts: []interface{}{ testutil.WithSliceLen(sliceLen), testutil.BytesFixedProvider(bytesLen), testutil.IDAddressProvider(), }, - provided: func() { + Provided: func() { assert.Equal(t, src.Miner.Protocol(), address.ID, "miner addr proto") assert.Len(t, src.Parents, sliceLen, "parents length") assert.NotNil(t, src.ElectionProof, "ElectionProof") @@ -82,17 +82,17 @@ func TestBlockHeaderBasic(t *testing.T) { assert.Len(t, src.BLSAggregate.Data, bytesLen, "BLSAggregate.Data len") }, - marshaled: func(b []byte) { + Marshaled: func(b []byte) { decoded, err := DecodeBlock(b) assert.NoError(t, err, "DecodeBlock") assert.Equal(t, src, *decoded) }, - after: func() { + Finished: func() { assert.Equal(t, src, dst) }, } - cborBasicTest(t, &src, &dst, opt) + testutil.CborErBasicTest(t, &src, &dst, opt) } } diff --git a/venus-shared/chain/block_msg_test.go b/venus-shared/chain/block_msg_test.go index 6a5d4ea708..87a895169f 100644 --- a/venus-shared/chain/block_msg_test.go +++ b/venus-shared/chain/block_msg_test.go @@ -19,27 +19,27 @@ func TestBlockMsgBasic(t *testing.T) { for i := 0; i < 32; i++ { var src, dst BlockMsg - opt := cborBasicTestOptions{ - buf: &buf, - before: func() { + opt := testutil.CborErBasicTestOptions{ + Buf: &buf, + Prepare: func() { assert.Equal(t, src, dst) assert.Nil(t, src.Header) assert.Nil(t, src.BlsMessages) assert.Nil(t, src.SecpkMessages) }, - provideOpts: []interface{}{ + ProvideOpts: []interface{}{ testutil.WithSliceLen(msgLen), }, - provided: func() { + Provided: func() { assert.NotEqual(t, src, dst, "value provided") assert.NotNil(t, src.Header) assert.NotEqual(t, emptyCids, src.BlsMessages) assert.NotEqual(t, emptyCids, src.SecpkMessages) }, - marshaled: func(b []byte) { + Marshaled: func(b []byte) { bmCid := src.Cid() assert.Equal(t, bmCid, src.Header.Cid(), "Cid() result for BlockMsg") @@ -49,11 +49,11 @@ func TestBlockMsgBasic(t *testing.T) { assert.NotEqual(t, bmCid, sumCid) }, - after: func() { + Finished: func() { assert.Equal(t, src, dst, "after unmarshaling") }, } - cborBasicTest(t, &src, &dst, opt) + testutil.CborErBasicTest(t, &src, &dst, opt) } } diff --git a/venus-shared/chain/election_proof_test.go b/venus-shared/chain/election_proof_test.go index ac002d0999..1c46e6d71d 100644 --- a/venus-shared/chain/election_proof_test.go +++ b/venus-shared/chain/election_proof_test.go @@ -17,25 +17,25 @@ func TestElectionProofBasic(t *testing.T) { for i := 0; i < 32; i++ { var src, dst ElectionProof - opt := cborBasicTestOptions{ - buf: &buf, - before: func() { + opt := testutil.CborErBasicTestOptions{ + Buf: &buf, + Prepare: func() { assert.Equal(t, src, dst, "empty values") }, - provideOpts: []interface{}{ + ProvideOpts: []interface{}{ testutil.BytesFixedProvider(vrfLen), testutil.IntRangedProvider(int(winCountMin), int(winCountMax)), }, - provided: func() { + Provided: func() { assert.NotEqual(t, src, dst, "src value provided") assert.Len(t, src.VRFProof, vrfLen, "vrf length") assert.GreaterOrEqual(t, src.WinCount, winCountMin, "win count min") assert.Less(t, src.WinCount, winCountMax, "win count max") }, - after: func() { + Finished: func() { assert.Equal(t, src, dst, "from src to dst through cbor") t1, t2 := Ticket{ @@ -51,6 +51,6 @@ func TestElectionProofBasic(t *testing.T) { }, } - cborBasicTest(t, &src, &dst, opt) + testutil.CborErBasicTest(t, &src, &dst, opt) } } diff --git a/venus-shared/chain/message_test.go b/venus-shared/chain/message_test.go index 05316ef0db..b1bf00723c 100644 --- a/venus-shared/chain/message_test.go +++ b/venus-shared/chain/message_test.go @@ -14,30 +14,30 @@ func TestMessageBasic(t *testing.T) { var buf bytes.Buffer for i := 0; i < 32; i++ { var src, dst Message - opt := cborBasicTestOptions{ - buf: &buf, - before: func() { + opt := testutil.CborErBasicTestOptions{ + Buf: &buf, + Prepare: func() { assert.Equal(t, src, dst, "empty values") }, - provideOpts: []interface{}{ + ProvideOpts: []interface{}{ testutil.BytesFixedProvider(paramsLen), testutil.BlsAddressProvider(), }, - provided: func() { + Provided: func() { assert.NotEqual(t, src, dst, "value provided") assert.Equal(t, src.From.Protocol(), address.BLS, "from addr proto") assert.Equal(t, src.To.Protocol(), address.BLS, "to addr proto") assert.Len(t, src.Params, paramsLen, "params length") }, - after: func() { + Finished: func() { assert.Equal(t, src, dst) assert.Equal(t, src.Cid(), dst.Cid()) }, } - cborBasicTest(t, &src, &dst, opt) + testutil.CborErBasicTest(t, &src, &dst, opt) } } diff --git a/venus-shared/chain/util_test.go b/venus-shared/chain/util_test.go deleted file mode 100644 index 7824106e52..0000000000 --- a/venus-shared/chain/util_test.go +++ /dev/null @@ -1,51 +0,0 @@ -package chain - -import ( - "bytes" - "testing" - - "github.com/filecoin-project/go-state-types/cbor" - "github.com/stretchr/testify/assert" - - "github.com/filecoin-project/venus/venus-shared/testutil" -) - -type cborBasicTestOptions struct { - buf *bytes.Buffer - - before func() - - provideOpts []interface{} - provided func() - - marshaled func([]byte) - - after func() -} - -func cborBasicTest(t *testing.T, src, dst cbor.Er, opt cborBasicTestOptions) { - if opt.before != nil { - opt.before() - } - - testutil.Provide(t, src, opt.provideOpts...) - if opt.provided != nil { - opt.provided() - } - - opt.buf.Reset() - err := src.MarshalCBOR(opt.buf) - assert.NoErrorf(t, err, "marshaling from src of %T", src) - - data := opt.buf.Bytes() - if opt.marshaled != nil { - opt.marshaled(data) - } - - err = dst.UnmarshalCBOR(bytes.NewReader(data)) - assert.NoErrorf(t, err, "unmarshaling to dst of %T", dst) - - if opt.after != nil { - opt.after() - } -} diff --git a/venus-shared/testutil/cbor_basic.go b/venus-shared/testutil/cbor_basic.go new file mode 100644 index 0000000000..47d090709b --- /dev/null +++ b/venus-shared/testutil/cbor_basic.go @@ -0,0 +1,45 @@ +package testutil + +import ( + "bytes" + "testing" + + "github.com/filecoin-project/go-state-types/cbor" + "github.com/stretchr/testify/assert" +) + +type CborErBasicTestOptions struct { + Buf *bytes.Buffer + Prepare func() + ProvideOpts []interface{} + Provided func() + Marshaled func(data []byte) + Finished func() +} + +func CborErBasicTest(t *testing.T, src, dst cbor.Er, opts CborErBasicTestOptions) { + if opts.Prepare != nil { + opts.Prepare() + } + + Provide(t, src, opts.ProvideOpts...) + if opts.Provided != nil { + opts.Provided() + } + + opts.Buf.Reset() + + err := src.MarshalCBOR(opts.Buf) + assert.NoErrorf(t, err, "marshal from src of %T", src) + + if opts.Marshaled != nil { + opts.Marshaled(opts.Buf.Bytes()) + } + + err = dst.UnmarshalCBOR(opts.Buf) + assert.NoErrorf(t, err, "unmarshal to dst of %T", dst) + + if opts.Finished != nil { + opts.Finished() + } +} diff --git a/venus-shared/testutil/cbor_basic_test.go b/venus-shared/testutil/cbor_basic_test.go new file mode 100644 index 0000000000..37d57c1c2f --- /dev/null +++ b/venus-shared/testutil/cbor_basic_test.go @@ -0,0 +1,68 @@ +package testutil + +import ( + "bytes" + "testing" + + "github.com/filecoin-project/go-address" + "github.com/stretchr/testify/assert" +) + +func TestCborBasicForAddress(t *testing.T) { + var buf bytes.Buffer + for i := 0; i < 16; i++ { + var src, dst address.Address + opt := CborErBasicTestOptions{ + Buf: &buf, + Prepare: func() { + assert.Equal(t, src, address.Undef, "empty address") + assert.Equal(t, src, dst, "empty cid") + }, + + Provided: func() { + assert.NotEqual(t, src, dst, "address value provided") + }, + + Marshaled: func(b []byte) { + t.Logf("marshaled callback called with %d bytes", len(b)) + }, + + Finished: func() { + assert.Equal(t, src, dst) + assert.NotEqual(t, src, address.Undef, "must not be address.Undef") + }, + } + + CborErBasicTest(t, &src, &dst, opt) + } +} + +func TestCborBasicForIDAddress(t *testing.T) { + var buf bytes.Buffer + for i := 0; i < 16; i++ { + var src, dst address.Address + opt := CborErBasicTestOptions{ + Buf: &buf, + Prepare: func() { + assert.Equal(t, src, address.Undef, "empty address") + assert.Equal(t, src, dst, "empty cid") + }, + + ProvideOpts: []interface{}{ + IDAddressProvider(), + }, + + Provided: func() { + assert.NotEqual(t, src, dst, "address value provided") + assert.Equal(t, src.Protocol(), address.ID, "must be id address") + }, + + Finished: func() { + assert.Equal(t, src, dst) + assert.NotEqual(t, src, address.Undef, "must not be address.Undef") + }, + } + + CborErBasicTest(t, &src, &dst, opt) + } +} diff --git a/venus-shared/testutil/value_provider_registry.go b/venus-shared/testutil/value_provider_registry.go index 840662bf80..09008901d4 100644 --- a/venus-shared/testutil/value_provider_registry.go +++ b/venus-shared/testutil/value_provider_registry.go @@ -24,24 +24,24 @@ func WithSliceLen(size int) OptionFunc { } } -func Provide(t *testing.T, dst interface{}, specifiedFns ...interface{}) { +func Provide(t *testing.T, dst interface{}, options ...interface{}) { rval := reflect.ValueOf(dst) if kind := rval.Kind(); kind != reflect.Ptr { t.Fatalf("value provider can only be applied on to poniters, got %T", dst) } reg := defaultValueProviderRegistry - if len(specifiedFns) > 0 { + if len(options) > 0 { reg = defaultValueProviderRegistry.clone() - for fni := range specifiedFns { - fn := specifiedFns[fni] + for fni := range options { + fn := options[fni] if opt, ok := fn.(OptionFunc); ok { opt(t, reg) continue } - if err := reg.register(specifiedFns[fni]); err != nil { - t.Fatalf("register specified provider %T for %T: %s", specifiedFns[fni], dst, err) + if err := reg.register(fn); err != nil { + t.Fatalf("register specified provider %T for %T: %s", fn, dst, err) } } } From f5a18c5304e5ee64fe217f16f2b2c88e2e59f326 Mon Sep 17 00:00:00 2001 From: dtynn Date: Thu, 18 Nov 2021 10:18:20 +0800 Subject: [PATCH 016/167] feat: add providers for +/- big.Ints --- .../testutil/value_provdier_chain_test.go | 23 +++++++++-- venus-shared/testutil/value_provider_chain.go | 40 +++++++++++++++++++ 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/venus-shared/testutil/value_provdier_chain_test.go b/venus-shared/testutil/value_provdier_chain_test.go index e42690047e..28e377d354 100644 --- a/venus-shared/testutil/value_provdier_chain_test.go +++ b/venus-shared/testutil/value_provdier_chain_test.go @@ -51,17 +51,34 @@ func TestDefaultBigs(t *testing.T) { Provide(t, &bigs) hasPositive := false hasNegative := false - zero := big.Zero() for bi := range bigs { assert.NotNil(t, bigs[bi].Int) - hasPositive = hasPositive || bigs[bi].GreaterThan(zero) - hasNegative = hasNegative || bigs[bi].LessThan(zero) + hasPositive = hasPositive || bigs[bi].GreaterThan(bigZero) + hasNegative = hasNegative || bigs[bi].LessThan(bigZero) } assert.True(t, hasPositive) assert.True(t, hasNegative) } +func TestPositiveBigs(t *testing.T) { + bigs := make([]big.Int, 256) + Provide(t, &bigs, PositiveBigProvider()) + for bi := range bigs { + assert.NotNil(t, bigs[bi].Int) + assert.True(t, bigs[bi].GreaterThan(bigZero)) + } +} + +func TestNegativeBigs(t *testing.T) { + bigs := make([]big.Int, 256) + Provide(t, &bigs, NegativeBigProvider()) + for bi := range bigs { + assert.NotNil(t, bigs[bi].Int) + assert.True(t, bigs[bi].LessThan(bigZero)) + } +} + func TestDefaultSigTypes(t *testing.T) { sigtyps := make([]crypto.SigType, 256) Provide(t, &sigtyps) diff --git a/venus-shared/testutil/value_provider_chain.go b/venus-shared/testutil/value_provider_chain.go index 06bc3bd4de..61e9a831fe 100644 --- a/venus-shared/testutil/value_provider_chain.go +++ b/venus-shared/testutil/value_provider_chain.go @@ -13,6 +13,10 @@ import ( const idmask = uint64(1<<63) - 1 +var ( + bigZero = big.Zero() +) + func init() { MustRegisterDefaultValueProvier(CidProvider(defaultBytesFixedSize)) MustRegisterDefaultValueProvier(AddressProvider()) @@ -112,6 +116,42 @@ func BigProvider() func(*testing.T) big.Int { } } +func PositiveBigProvider() func(*testing.T) big.Int { + bytesProvider := BytesFixedProvider(16) + return func(t *testing.T) big.Int { + for { + data := bytesProvider(t) + data[0] = 0 + n, err := big.FromBytes(data) + if err != nil { + t.Fatalf("generate positive big.Int from bytes %x", data) + } + + if !n.Equals(bigZero) { + return n + } + } + } +} + +func NegativeBigProvider() func(*testing.T) big.Int { + bytesProvider := BytesFixedProvider(16) + return func(t *testing.T) big.Int { + for { + data := bytesProvider(t) + data[0] = 1 + n, err := big.FromBytes(data) + if err != nil { + t.Fatalf("generate negative big.Int from bytes %x", data) + } + + if !n.Equals(bigZero) { + return n + } + } + } +} + func CryptoSigTypeProvider() func(*testing.T) crypto.SigType { opts := []crypto.SigType{ crypto.SigTypeSecp256k1, From 45c6a9d67d393fdd9ca4ef35163e43bf4fdba4da Mon Sep 17 00:00:00 2001 From: dtynn Date: Thu, 18 Nov 2021 10:37:02 +0800 Subject: [PATCH 017/167] feat: complete tests for BigInt --- venus-shared/chain/bigint_test.go | 56 +++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/venus-shared/chain/bigint_test.go b/venus-shared/chain/bigint_test.go index 86ff1fc44d..7ee0b55f6e 100644 --- a/venus-shared/chain/bigint_test.go +++ b/venus-shared/chain/bigint_test.go @@ -3,6 +3,9 @@ package chain import ( "bytes" "testing" + + "github.com/filecoin-project/venus/venus-shared/testutil" + "github.com/stretchr/testify/assert" ) func TestBigIntSerializationRoundTrip(t *testing.T) { @@ -32,3 +35,56 @@ func TestBigIntSerializationRoundTrip(t *testing.T) { } } + +func TestBigIntParseErr(t *testing.T) { + testValues := []string{ + "a0", "1b", "10c", "-1d0", "9e999", "f12345678901234567891234567890123456789012345678901234567890", + } + + for _, v := range testValues { + _, err := BigFromString(v) + assert.Error(t, err, "from invalid big int string") + } +} + +func TestBigIntCalculating(t *testing.T) { + zero := NewInt(0) + maxProvideAttempts := 8 + for i := 0; i < 32; i++ { + var a, b BigInt + for attempt := 0; ; i++ { + if attempt == maxProvideAttempts { + t.Fatal("unable to get required numbers") + } + + testutil.Provide(t, &a) + testutil.Provide(t, &b) + + if a == EmptyInt || b == EmptyInt { + t.Fatal("BigInt not provided") + } + + if !a.Equals(zero) || !b.Equals(zero) { + break + } + } + + sum := BigAdd(a, b) + product := BigMul(a, b) + + assert.True(t, BigSub(sum, a).Equals(b)) + assert.True(t, BigDiv(product, a).Equals(b)) + + base := a + if base.IsZero() { + base = b + } + + base4 := BigMul(base, NewInt(4)) + assert.Equal(t, BigDivFloat(base4, base), 4.0) + assert.Equal(t, BigDivFloat(base, base4), 0.25) + + abs := base.Abs() + assert.True(t, BigMod(abs, BigAdd(abs, NewInt(1))).Equals(abs)) + } +} From 581e196727f1198862b8f23321f8ee849e8dbd81 Mon Sep 17 00:00:00 2001 From: dtynn Date: Thu, 18 Nov 2021 11:05:57 +0800 Subject: [PATCH 018/167] feat: add more tests for FIL --- venus-shared/chain/bigint_fil.go | 4 ++++ venus-shared/chain/bigint_fil_test.go | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/venus-shared/chain/bigint_fil.go b/venus-shared/chain/bigint_fil.go index f91e1c1db8..8831be37e5 100644 --- a/venus-shared/chain/bigint_fil.go +++ b/venus-shared/chain/bigint_fil.go @@ -83,6 +83,10 @@ func (f FIL) UnmarshalText(text []byte) error { return err } + if f.Int == nil { + f.Int = big.NewInt(0) + } + f.Int.Set(p.Int) return nil } diff --git a/venus-shared/chain/bigint_fil_test.go b/venus-shared/chain/bigint_fil_test.go index f7caf329e4..3896d6236b 100644 --- a/venus-shared/chain/bigint_fil_test.go +++ b/venus-shared/chain/bigint_fil_test.go @@ -3,6 +3,7 @@ package chain import ( "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -20,6 +21,14 @@ func TestFilRoundTrip(t *testing.T) { if fval.String() != v { t.Fatal("mismatch in values!", v, fval.String()) } + + text, err := fval.MarshalText() + assert.NoError(t, err, "marshal text for fval") + + fval2 := FIL(NewInt(0)) + err = fval2.UnmarshalText(text) + assert.NoError(t, err, "unmarshal text for fval2") + assert.True(t, BigInt{Int: fval.Int}.Equals(BigInt{Int: fval2.Int})) } } From a262ec5bb2329f919b1938064557652604c4cb2f Mon Sep 17 00:00:00 2001 From: dtynn Date: Thu, 18 Nov 2021 11:18:03 +0800 Subject: [PATCH 019/167] feat: add more tests for unit string --- venus-shared/chain/bigint_unit.go | 22 +++++++++------------- venus-shared/chain/bigint_unit_test.go | 26 ++++++++++++++------------ 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/venus-shared/chain/bigint_unit.go b/venus-shared/chain/bigint_unit.go index 4c2d0c4e7f..fe364acba3 100644 --- a/venus-shared/chain/bigint_unit.go +++ b/venus-shared/chain/bigint_unit.go @@ -8,31 +8,27 @@ import ( var byteSizeUnits = []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB"} func SizeStr(bi BigInt) string { - r := new(big.Rat).SetInt(bi.Int) - den := big.NewRat(1, 1024) - - var i int - for f, _ := r.Float64(); f >= 1024 && i+1 < len(byteSizeUnits); f, _ = r.Float64() { - i++ - r = r.Mul(r, den) - } - - f, _ := r.Float64() + f, i := unitNumber(bi, byteSizeUnits) return fmt.Sprintf("%.4g %s", f, byteSizeUnits[i]) } var deciUnits = []string{"", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"} func DeciStr(bi BigInt) string { - r := new(big.Rat).SetInt(bi.Int) + f, i := unitNumber(bi, deciUnits) + return fmt.Sprintf("%.3g %s", f, deciUnits[i]) +} + +func unitNumber(n BigInt, units []string) (float64, int) { + r := new(big.Rat).SetInt(n.Int) den := big.NewRat(1, 1024) var i int - for f, _ := r.Float64(); f >= 1024 && i+1 < len(deciUnits); f, _ = r.Float64() { + for f, _ := r.Float64(); f >= 1024 && i+1 < len(units); f, _ = r.Float64() { i++ r = r.Mul(r, den) } f, _ := r.Float64() - return fmt.Sprintf("%.3g %s", f, deciUnits[i]) + return f, i } diff --git a/venus-shared/chain/bigint_unit_test.go b/venus-shared/chain/bigint_unit_test.go index d153df2cf0..0da5361d20 100644 --- a/venus-shared/chain/bigint_unit_test.go +++ b/venus-shared/chain/bigint_unit_test.go @@ -12,23 +12,25 @@ import ( "github.com/stretchr/testify/assert" ) -func TestSizeStr(t *testing.T) { +func TestUnitStrs(t *testing.T) { cases := []struct { - in uint64 - out string + in uint64 + size string + deci string }{ - {0, "0 B"}, - {1, "1 B"}, - {1016, "1016 B"}, - {1024, "1 KiB"}, - {1000 * 1024, "1000 KiB"}, - {2000, "1.953 KiB"}, - {5 << 20, "5 MiB"}, - {11 << 60, "11 EiB"}, + {0, "0 B", "0 "}, + {1, "1 B", "1 "}, + {1016, "1016 B", "1.02e+03 "}, + {1024, "1 KiB", "1 Ki"}, + {1000 * 1024, "1000 KiB", "1e+03 Ki"}, + {2000, "1.953 KiB", "1.95 Ki"}, + {5 << 20, "5 MiB", "5 Mi"}, + {11 << 60, "11 EiB", "11 Ei"}, } for _, c := range cases { - assert.Equal(t, c.out, SizeStr(NewInt(c.in)), "input %+v, produced wrong result", c) + assert.Equal(t, c.size, SizeStr(NewInt(c.in)), "result of SizeStr") + assert.Equal(t, c.deci, DeciStr(NewInt(c.in)), "result of DeciStr") } } From 7a09cf27470beaddc9802c8fb281acc739180616 Mon Sep 17 00:00:00 2001 From: dtynn Date: Thu, 18 Nov 2021 11:33:51 +0800 Subject: [PATCH 020/167] feat: basic test for Ticket --- venus-shared/chain/block_header_test.go | 3 ++ venus-shared/chain/block_msg_test.go | 4 ++ venus-shared/chain/election_proof_test.go | 46 +++++++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/venus-shared/chain/block_header_test.go b/venus-shared/chain/block_header_test.go index e72262838b..e2cbd40117 100644 --- a/venus-shared/chain/block_header_test.go +++ b/venus-shared/chain/block_header_test.go @@ -89,7 +89,10 @@ func TestBlockHeaderBasic(t *testing.T) { }, Finished: func() { + assert.Equal(t, src.LastTicket(), dst.LastTicket()) assert.Equal(t, src, dst) + assert.Equal(t, src.String(), dst.String()) + assert.True(t, src.Equals(&dst)) }, } diff --git a/venus-shared/chain/block_msg_test.go b/venus-shared/chain/block_msg_test.go index 87a895169f..c46f9e2ceb 100644 --- a/venus-shared/chain/block_msg_test.go +++ b/venus-shared/chain/block_msg_test.go @@ -47,6 +47,10 @@ func TestBlockMsgBasic(t *testing.T) { assert.NoError(t, err, "CidBuilder.Sum") assert.NotEqual(t, bmCid, sumCid) + + serialized, err := src.Serialize() + assert.NoError(t, err, "Serialize") + assert.Equal(t, b, serialized) }, Finished: func() { diff --git a/venus-shared/chain/election_proof_test.go b/venus-shared/chain/election_proof_test.go index 1c46e6d71d..2ad96ffd95 100644 --- a/venus-shared/chain/election_proof_test.go +++ b/venus-shared/chain/election_proof_test.go @@ -48,6 +48,52 @@ func TestElectionProofBasic(t *testing.T) { assert.True(t, t1.Compare(&t2) == 0, "ticket equal") assert.Equal(t, t1.Quality(), t2.Quality()) + + }, + } + + testutil.CborErBasicTest(t, &src, &dst, opt) + } +} + +func TestTicketBasic(t *testing.T) { + vrfLen := 32 + var buf bytes.Buffer + for i := 0; i < 32; i++ { + var src, dst, another Ticket + + opt := testutil.CborErBasicTestOptions{ + Buf: &buf, + Prepare: func() { + assert.Equal(t, src, dst, "empty values") + }, + + ProvideOpts: []interface{}{ + testutil.BytesFixedProvider(vrfLen), + }, + + Provided: func() { + assert.NotEqual(t, src, dst, "src value provided") + assert.Len(t, src.VRFProof, vrfLen, "vrf length") + }, + + Finished: func() { + assert.Equal(t, src, dst, "from src to dst through cbor") + + t1, t2 := Ticket{ + VRFProof: src.VRFProof, + }, Ticket{ + VRFProof: dst.VRFProof, + } + + assert.Equal(t, t1, t2, "ticket") + + assert.True(t, t1.Compare(&t2) == 0, "ticket equal") + assert.Equal(t, t1.Quality(), t2.Quality()) + + testutil.Provide(t, &another, testutil.BytesFixedProvider(vrfLen)) + assert.Len(t, another.VRFProof, vrfLen, "vrf length") + assert.True(t, src.Less(&another) == (src.Compare(&another) < 0)) }, } From c2961a4ae3bd8cc97615b33f31a683e1969909bf Mon Sep 17 00:00:00 2001 From: dtynn Date: Thu, 18 Nov 2021 11:49:29 +0800 Subject: [PATCH 021/167] feat: more basic tests for cbor.Er types --- .gitignore | 3 +- venus-shared/chain/actor_test.go | 37 ++++++ venus-shared/chain/beacon_test.go | 42 +++++++ venus-shared/chain/bigint_fil_test.go | 54 ++++++++- venus-shared/chain/block_header_test.go | 5 + venus-shared/chain/message_receipt_test.go | 55 +++++++++ venus-shared/chain/message_root_test.go | 45 +++++++ venus-shared/chain/message_test.go | 18 +++ venus-shared/chain/signed_message_test.go | 67 +++++++++++ venus-shared/chain/tipset_exp_tipset_test.go | 46 ++++++++ venus-shared/chain/tipset_key_test.go | 43 +++++++ venus-shared/chain/tipset_test.go | 118 +++++++++++++++++++ 12 files changed, 528 insertions(+), 5 deletions(-) create mode 100644 venus-shared/chain/actor_test.go create mode 100644 venus-shared/chain/beacon_test.go create mode 100644 venus-shared/chain/message_receipt_test.go create mode 100644 venus-shared/chain/message_root_test.go create mode 100644 venus-shared/chain/signed_message_test.go create mode 100644 venus-shared/chain/tipset_exp_tipset_test.go create mode 100644 venus-shared/chain/tipset_key_test.go create mode 100644 venus-shared/chain/tipset_test.go diff --git a/.gitignore b/.gitignore index dc4acf296d..65d96bb91b 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ localnet.json .task .idea *.coverprofile +coverprofile.html *.out *.so @@ -16,7 +17,7 @@ fixtures/test fixtures/live !fixtures/live/.gitkeep -// Tools +// Tools tools/gengen/gengen tools/gengen/gensetup tools/fast/bin/localnet diff --git a/venus-shared/chain/actor_test.go b/venus-shared/chain/actor_test.go new file mode 100644 index 0000000000..be304b1718 --- /dev/null +++ b/venus-shared/chain/actor_test.go @@ -0,0 +1,37 @@ +package chain + +import ( + "bytes" + "testing" + + "github.com/ipfs/go-cid" + "github.com/stretchr/testify/assert" + + "github.com/filecoin-project/venus/venus-shared/testutil" +) + +func TestActorBasic(t *testing.T) { + var buf bytes.Buffer + for i := 0; i < 32; i++ { + var src, dst Actor + + opt := testutil.CborErBasicTestOptions{ + Buf: &buf, + Prepare: func() { + assert.Equal(t, src, dst, "empty values") + }, + + Provided: func() { + assert.NotEqual(t, src.Code, cid.Undef) + assert.NotEqual(t, src.Head, cid.Undef) + }, + + Finished: func() { + assert.Equal(t, src, dst, "from src to dst through cbor") + + }, + } + + testutil.CborErBasicTest(t, &src, &dst, opt) + } +} diff --git a/venus-shared/chain/beacon_test.go b/venus-shared/chain/beacon_test.go new file mode 100644 index 0000000000..add24c0b97 --- /dev/null +++ b/venus-shared/chain/beacon_test.go @@ -0,0 +1,42 @@ +package chain + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/filecoin-project/venus/venus-shared/testutil" +) + +func TestBeaconEntryBasic(t *testing.T) { + dataLen := 32 + + var buf bytes.Buffer + for i := 0; i < 32; i++ { + var src, dst BeaconEntry + + opt := testutil.CborErBasicTestOptions{ + Buf: &buf, + Prepare: func() { + assert.Equal(t, src, dst, "empty values") + assert.Nil(t, src.Data) + }, + + ProvideOpts: []interface{}{ + testutil.BytesFixedProvider(dataLen), + }, + + Provided: func() { + assert.Len(t, src.Data, dataLen) + }, + + Finished: func() { + assert.Equal(t, src, dst, "from src to dst through cbor") + + }, + } + + testutil.CborErBasicTest(t, &src, &dst, opt) + } +} diff --git a/venus-shared/chain/bigint_fil_test.go b/venus-shared/chain/bigint_fil_test.go index 3896d6236b..cb35bb3a00 100644 --- a/venus-shared/chain/bigint_fil_test.go +++ b/venus-shared/chain/bigint_fil_test.go @@ -1,8 +1,11 @@ package chain import ( + "strings" "testing" + "github.com/filecoin-project/venus/venus-shared/chain/params" + "github.com/filecoin-project/venus/venus-shared/testutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -10,13 +13,11 @@ import ( func TestFilRoundTrip(t *testing.T) { testValues := []string{ "0 FIL", "1 FIL", "1.001 FIL", "100.10001 FIL", "101100 FIL", "5000.01 FIL", "5000 FIL", + strings.Repeat("1", 50) + " FIL", } for _, v := range testValues { - fval, err := ParseFIL(v) - if err != nil { - t.Fatal(err) - } + fval := MustParseFIL(v) if fval.String() != v { t.Fatal("mismatch in values!", v, fval.String()) @@ -32,6 +33,51 @@ func TestFilRoundTrip(t *testing.T) { } } +func TestParseAttoFils(t *testing.T) { + testValues := []string{ + "0 aFIL", "1 aFIL", "1 aFIL", "100 aFIL", "101100 aFIL", "5000 aFIL", + "0 attoFIL", "1 attoFIL", "1 attoFIL", "100 attoFIL", "101100 attoFIL", "5000 attoFIL", + } + + for _, v := range testValues { + fval := MustParseFIL(v) + + text, err := fval.MarshalText() + assert.NoError(t, err, "marshal text for fval") + + fval2 := FIL(NewInt(0)) + err = fval2.UnmarshalText(text) + assert.NoError(t, err, "unmarshal text for fval2") + assert.True(t, BigInt{Int: fval.Int}.Equals(BigInt{Int: fval2.Int})) + } +} + +func TestInvalidFILString(t *testing.T) { + testValues := []string{ + "0 nFIL", "1 nFIL", "1.001 nFIL", "100.10001 nFIL", "101100 nFIL", "5000.01 nFIL", "5000 nFIL", + "1.001.1 FIL", + strings.Repeat("1", 51) + " FIL", + } + + for _, v := range testValues { + _, err := ParseFIL(v) + require.Errorf(t, err, "invalid fil string %s", v) + } +} + +func TestBigFromFIL(t *testing.T) { + ratio := NewInt(params.FilecoinPrecision) + + nums := make([]uint64, 32) + testutil.Provide(t, &nums, testutil.IntRangedProvider(10, 1000)) + + for i := range nums { + fval := FromFil(nums[i]) + require.True(t, fval.GreaterThan(ZeroFIL), "greater than zero") + require.True(t, ratio.Equals(BigDiv(fval, NewInt(nums[i]))), "fil precision") + } +} + func TestFilShort(t *testing.T) { for _, s := range []struct { fil string diff --git a/venus-shared/chain/block_header_test.go b/venus-shared/chain/block_header_test.go index e2cbd40117..064d984172 100644 --- a/venus-shared/chain/block_header_test.go +++ b/venus-shared/chain/block_header_test.go @@ -93,6 +93,11 @@ func TestBlockHeaderBasic(t *testing.T) { assert.Equal(t, src, dst) assert.Equal(t, src.String(), dst.String()) assert.True(t, src.Equals(&dst)) + + assert.False(t, src.IsValidated(), "check validated before set") + + src.SetValidated() + assert.True(t, src.IsValidated(), "check validated before set") }, } diff --git a/venus-shared/chain/message_receipt_test.go b/venus-shared/chain/message_receipt_test.go new file mode 100644 index 0000000000..13f5cdb7e5 --- /dev/null +++ b/venus-shared/chain/message_receipt_test.go @@ -0,0 +1,55 @@ +package chain + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/filecoin-project/go-state-types/exitcode" + "github.com/filecoin-project/venus/venus-shared/testutil" +) + +func TestMessageReceiptBasic(t *testing.T) { + dataLen := 32 + + var buf bytes.Buffer + for i := 0; i < 32; i++ { + var src, dst MessageReceipt + + opt := testutil.CborErBasicTestOptions{ + Buf: &buf, + Prepare: func() { + assert.Equal(t, src, dst, "empty values") + assert.Nil(t, src.ReturnValue) + }, + + ProvideOpts: []interface{}{ + testutil.BytesFixedProvider(dataLen), + testutil.IntRangedProvider(10_000_000, 50_000_000), + func(t *testing.T) exitcode.ExitCode { + p := testutil.IntRangedProvider(0, 20) + next := p(t) + return exitcode.ExitCode(next) + }, + }, + + Provided: func() { + assert.Len(t, src.ReturnValue, dataLen) + + assert.GreaterOrEqual(t, src.ExitCode, exitcode.ExitCode(0)) + assert.Less(t, src.ExitCode, exitcode.ExitCode(20)) + + assert.GreaterOrEqual(t, src.GasUsed, int64(10_000_000)) + assert.Less(t, src.GasUsed, int64(50_000_000)) + }, + + Finished: func() { + assert.Equal(t, src, dst, "from src to dst through cbor") + assert.Equal(t, src.String(), dst.String(), "string representation") + }, + } + + testutil.CborErBasicTest(t, &src, &dst, opt) + } +} diff --git a/venus-shared/chain/message_root_test.go b/venus-shared/chain/message_root_test.go new file mode 100644 index 0000000000..a38410b958 --- /dev/null +++ b/venus-shared/chain/message_root_test.go @@ -0,0 +1,45 @@ +package chain + +import ( + "bytes" + "testing" + + "github.com/ipfs/go-cid" + "github.com/stretchr/testify/assert" + + "github.com/filecoin-project/venus/venus-shared/testutil" +) + +func TestMessageRootBasic(t *testing.T) { + var buf bytes.Buffer + for i := 0; i < 32; i++ { + var src, dst MessageRoot + + opt := testutil.CborErBasicTestOptions{ + Buf: &buf, + Prepare: func() { + assert.Equal(t, src, dst, "empty values") + assert.Equal(t, src.BlsRoot, cid.Undef) + assert.Equal(t, src.SecpkRoot, cid.Undef) + }, + + Provided: func() { + assert.NotEqual(t, src.BlsRoot, cid.Undef) + assert.NotEqual(t, src.SecpkRoot, cid.Undef) + }, + + Finished: func() { + assert.Equal(t, src, dst, "from src to dst through cbor") + + blk, err := src.ToStorageBlock() + assert.NoError(t, err, "ToStorageBlock") + + srcCid := src.Cid() + assert.Equal(t, srcCid, dst.Cid(), "cid compare to dst") + assert.Equal(t, srcCid, blk.Cid(), "cid compare to sblk") + }, + } + + testutil.CborErBasicTest(t, &src, &dst, opt) + } +} diff --git a/venus-shared/chain/message_test.go b/venus-shared/chain/message_test.go index b1bf00723c..75978ddc32 100644 --- a/venus-shared/chain/message_test.go +++ b/venus-shared/chain/message_test.go @@ -6,6 +6,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/venus/venus-shared/testutil" + blocks "github.com/ipfs/go-block-format" "github.com/stretchr/testify/assert" ) @@ -14,6 +15,7 @@ func TestMessageBasic(t *testing.T) { var buf bytes.Buffer for i := 0; i < 32; i++ { var src, dst Message + var blk blocks.Block opt := testutil.CborErBasicTestOptions{ Buf: &buf, Prepare: func() { @@ -30,11 +32,27 @@ func TestMessageBasic(t *testing.T) { assert.Equal(t, src.From.Protocol(), address.BLS, "from addr proto") assert.Equal(t, src.To.Protocol(), address.BLS, "to addr proto") assert.Len(t, src.Params, paramsLen, "params length") + + src.Version = MessageVersion + + sblk, err := src.ToStorageBlock() + assert.NoError(t, err, "ToStorageBlock") + blk = sblk + }, + + Marshaled: func(b []byte) { + decoded, err := DecodeMessage(b) + assert.NoError(t, err, "DecodeMessage") + assert.True(t, src.Equals(decoded)) }, Finished: func() { assert.Equal(t, src, dst) + assert.True(t, src.Equals(&dst)) + assert.True(t, src.EqualCall(&dst)) assert.Equal(t, src.Cid(), dst.Cid()) + assert.Equal(t, src.Cid(), blk.Cid()) + assert.Equal(t, src.String(), dst.String()) }, } diff --git a/venus-shared/chain/signed_message_test.go b/venus-shared/chain/signed_message_test.go new file mode 100644 index 0000000000..b0887cf76f --- /dev/null +++ b/venus-shared/chain/signed_message_test.go @@ -0,0 +1,67 @@ +package chain + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/venus/venus-shared/testutil" +) + +func TestSignedMessageBasic(t *testing.T) { + sliceLen := 16 + bytesLen := 32 + + var buf bytes.Buffer + for i := 0; i < 32; i++ { + var src, dst SignedMessage + + opt := testutil.CborErBasicTestOptions{ + Buf: &buf, + Prepare: func() { + assert.Equal(t, src, dst) + assert.Nil(t, src.Signature.Data) + }, + + ProvideOpts: []interface{}{ + testutil.WithSliceLen(sliceLen), + testutil.BytesFixedProvider(bytesLen), + }, + + Provided: func() { + assert.NotEqual(t, src, dst, "value provided") + assert.Len(t, src.Signature.Data, bytesLen) + }, + + Finished: func() { + assert.Equal(t, src, dst, "after unmarshaling") + assert.Equal(t, src.String(), dst.String()) + + c := src.Cid() + + blk, err := src.ToStorageBlock() + assert.NoError(t, err, "ToStorageBlock") + + assert.Equal(t, c, blk.Cid()) + assert.Equal(t, c, dst.Cid()) + + switch src.Signature.Type { + case crypto.SigTypeBLS: + assert.Equal(t, c, src.Message.Cid()) + assert.Equal(t, src.ChainLength(), src.Message.ChainLength()) + + case crypto.SigTypeSecp256k1: + assert.NotEqual(t, c, src.Message.Cid()) + assert.Greater(t, src.ChainLength(), src.Message.ChainLength()) + + default: + t.Fatalf("unexpected sig type %d", src.Signature.Type) + } + }, + } + + testutil.CborErBasicTest(t, &src, &dst, opt) + } +} diff --git a/venus-shared/chain/tipset_exp_tipset_test.go b/venus-shared/chain/tipset_exp_tipset_test.go new file mode 100644 index 0000000000..dd98ab4ed5 --- /dev/null +++ b/venus-shared/chain/tipset_exp_tipset_test.go @@ -0,0 +1,46 @@ +package chain + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/filecoin-project/venus/venus-shared/testutil" +) + +func TestExpTipSet(t *testing.T) { + sliceLen := 5 + bytesLen := 32 + + var buf bytes.Buffer + for i := 0; i < 32; i++ { + var src, dst ExpTipSet + + opt := testutil.CborErBasicTestOptions{ + Buf: &buf, + Prepare: func() { + assert.Equal(t, src, dst, "empty values") + assert.Nil(t, src.Cids, "empty cids") + assert.Nil(t, src.Blocks, "empty blocks") + }, + + ProvideOpts: []interface{}{ + testutil.WithSliceLen(sliceLen), + testutil.BytesFixedProvider(bytesLen), + }, + + Provided: func() { + assert.NotEqual(t, src, dst, "src value provided") + assert.Len(t, src.Cids, sliceLen, "cids length") + assert.Len(t, src.Blocks, sliceLen, "blocks length") + }, + + Finished: func() { + assert.Equal(t, src, dst) + }, + } + + testutil.CborErBasicTest(t, &src, &dst, opt) + } +} diff --git a/venus-shared/chain/tipset_key_test.go b/venus-shared/chain/tipset_key_test.go new file mode 100644 index 0000000000..a522e9bc40 --- /dev/null +++ b/venus-shared/chain/tipset_key_test.go @@ -0,0 +1,43 @@ +package chain + +import ( + "testing" + + "github.com/ipfs/go-cid" + "github.com/stretchr/testify/assert" + + "github.com/filecoin-project/venus/venus-shared/testutil" +) + +func TestTipSetKey(t *testing.T) { + var cids []cid.Cid + cidNum := 10 + + // value provided + testutil.Provide(t, &cids, testutil.WithSliceLen(cidNum)) + assert.Len(t, cids, cidNum) + assert.NotEqual(t, make([]cid.Cid, cidNum), cids) + + // construct + tsk := NewTipSetKey(cids...) + assert.False(t, tsk.IsEmpty()) + + assert.NotEqual(t, tsk, EmptyTSK) + + // content + assert.Equal(t, tsk.Cids(), cids) + tskStr := tsk.String() + for i := range cids { + assert.Contains(t, tskStr, cids[i].String()) + } + + // marshal json + data, err := tsk.MarshalJSON() + assert.NoError(t, err, "marshal json") + + var decoded TipSetKey + err = decoded.UnmarshalJSON(data) + assert.NoError(t, err) + + assert.Equal(t, tsk, decoded) +} diff --git a/venus-shared/chain/tipset_test.go b/venus-shared/chain/tipset_test.go new file mode 100644 index 0000000000..0c0078d3b5 --- /dev/null +++ b/venus-shared/chain/tipset_test.go @@ -0,0 +1,118 @@ +package chain + +import ( + "testing" + "time" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/ipfs/go-cid" + "github.com/stretchr/testify/assert" + + "github.com/filecoin-project/venus/venus-shared/testutil" +) + +const ( + minBlockHeaderNumForTest = 3 + maxBlockHeaderNumForTest = 10 +) + +func constructTipSetKeyInfos(t *testing.T) (abi.ChainEpoch, []cid.Cid, big.Int) { + now := time.Now().Unix() + height := abi.ChainEpoch(now) + + var parentNum int + testutil.Provide(t, &parentNum, testutil.IntRangedProvider(minBlockHeaderNumForTest, maxBlockHeaderNumForTest)) + + var parents []cid.Cid + testutil.Provide(t, &parents, testutil.WithSliceLen(parentNum)) + assert.GreaterOrEqual(t, len(parents), minBlockHeaderNumForTest) + assert.Less(t, len(parents), maxBlockHeaderNumForTest) + + var parentWeight big.Int + testutil.Provide(t, &parentWeight, testutil.PositiveBigProvider()) + assert.True(t, parentWeight.GreaterThan(big.Zero())) + + return height, parents, parentWeight +} + +func constructTipSet(t *testing.T, height abi.ChainEpoch, parents []cid.Cid, parentWeight big.Int) *TipSet { + appliers := []struct { + fn func(*BlockHeader) + msg string + }{ + { + fn: func(bh *BlockHeader) { + bh.Height = height + }, + msg: "inconsistent block heights ", + }, + + { + fn: func(bh *BlockHeader) { + bh.Parents = make([]cid.Cid, len(parents)) + copy(bh.Parents, parents) + }, + msg: "inconsistent block parents ", + }, + + { + fn: func(bh *BlockHeader) { + bh.ParentWeight.Int.Set(parentWeight.Int) + }, + msg: "inconsistent block parent weights ", + }, + } + + var blkNum int + testutil.Provide(t, &blkNum, testutil.IntRangedProvider(minBlockHeaderNumForTest, maxBlockHeaderNumForTest)) + + var bhs []*BlockHeader + testutil.Provide(t, &bhs, testutil.WithSliceLen(blkNum)) + + assert.GreaterOrEqual(t, len(bhs), minBlockHeaderNumForTest) + assert.Less(t, len(bhs), maxBlockHeaderNumForTest) + + for ai := 0; ai < len(appliers); ai++ { + _, err := NewTipSet(bhs) + assert.Errorf(t, err, "attempt to construct tipset before applier #%d", ai) + assert.Containsf(t, err.Error(), appliers[ai].msg, "err msg content before applier #%d", ai) + + for bi := range bhs { + appliers[ai].fn(bhs[bi]) + } + } + + // duplicate bh + _, err := NewTipSet(append(bhs, bhs[0])) + assert.Error(t, err, "attempt to construct tipset with duplicated bh") + assert.Containsf(t, err.Error(), "duplicate block ", "err msg content for duplicate block") + + // construct + ts, err := NewTipSet(bhs) + assert.NoError(t, err, "construct tipset") + + return ts +} + +func TestTipSetConstruct(t *testing.T) { + height, parents, parentWeight := constructTipSetKeyInfos(t) + constructTipSet(t, height, parents, parentWeight) +} + +func TestTipSetMethods(t *testing.T) { + height, parents, parentWeight := constructTipSetKeyInfos(t) + + ts := constructTipSet(t, height, parents, parentWeight) + assert.True(t, ts.Defined()) + + tsk := ts.Key() + assert.NotEqual(t, EmptyTSK, tsk, "tsk not empty") + + assert.Equal(t, ts.Height(), height) + + assert.True(t, ts.ParentWeight().Equals(parentWeight), "parent weight") + + child := constructTipSet(t, height+1, tsk.Cids(), BigMul(parentWeight, NewInt(2))) + assert.True(t, child.IsChildOf(ts), "check if is child") +} From 6ec2a3defb67409c02c790309442f52ac0fa344a Mon Sep 17 00:00:00 2001 From: dtynn Date: Thu, 18 Nov 2021 16:15:20 +0800 Subject: [PATCH 022/167] refactor: use require to replace assert --- venus-shared/chain/actor_test.go | 10 +-- venus-shared/chain/beacon_test.go | 10 +-- venus-shared/chain/bigint_fil_test.go | 13 ++-- venus-shared/chain/bigint_test.go | 14 ++-- venus-shared/chain/bigint_unit_test.go | 14 ++-- venus-shared/chain/block_header_test.go | 66 ++++++++-------- venus-shared/chain/block_msg_test.go | 30 +++---- venus-shared/chain/election_proof_test.go | 38 ++++----- venus-shared/chain/message_receipt_test.go | 20 ++--- venus-shared/chain/message_root_test.go | 20 ++--- venus-shared/chain/message_test.go | 30 +++---- venus-shared/chain/signed_message_test.go | 28 +++---- venus-shared/chain/tipset_exp_tipset_test.go | 16 ++-- venus-shared/chain/tipset_key_test.go | 20 ++--- venus-shared/chain/tipset_test.go | 32 ++++---- venus-shared/go.mod | 1 + venus-shared/go.sum | 3 + venus-shared/testutil/cbor_basic.go | 6 +- venus-shared/testutil/cbor_basic_test.go | 24 +++--- .../testutil/value_provdier_chain_test.go | 26 +++---- .../testutil/value_provider_primitive_test.go | 78 +++++++++---------- .../testutil/value_provider_registry_test.go | 4 +- 22 files changed, 253 insertions(+), 250 deletions(-) diff --git a/venus-shared/chain/actor_test.go b/venus-shared/chain/actor_test.go index be304b1718..60d300ca2c 100644 --- a/venus-shared/chain/actor_test.go +++ b/venus-shared/chain/actor_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/ipfs/go-cid" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/filecoin-project/venus/venus-shared/testutil" ) @@ -18,16 +18,16 @@ func TestActorBasic(t *testing.T) { opt := testutil.CborErBasicTestOptions{ Buf: &buf, Prepare: func() { - assert.Equal(t, src, dst, "empty values") + require.Equal(t, src, dst, "empty values") }, Provided: func() { - assert.NotEqual(t, src.Code, cid.Undef) - assert.NotEqual(t, src.Head, cid.Undef) + require.NotEqual(t, src.Code, cid.Undef) + require.NotEqual(t, src.Head, cid.Undef) }, Finished: func() { - assert.Equal(t, src, dst, "from src to dst through cbor") + require.Equal(t, src, dst, "from src to dst through cbor") }, } diff --git a/venus-shared/chain/beacon_test.go b/venus-shared/chain/beacon_test.go index add24c0b97..f9784564c2 100644 --- a/venus-shared/chain/beacon_test.go +++ b/venus-shared/chain/beacon_test.go @@ -4,7 +4,7 @@ import ( "bytes" "testing" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/filecoin-project/venus/venus-shared/testutil" ) @@ -19,8 +19,8 @@ func TestBeaconEntryBasic(t *testing.T) { opt := testutil.CborErBasicTestOptions{ Buf: &buf, Prepare: func() { - assert.Equal(t, src, dst, "empty values") - assert.Nil(t, src.Data) + require.Equal(t, src, dst, "empty values") + require.Nil(t, src.Data) }, ProvideOpts: []interface{}{ @@ -28,11 +28,11 @@ func TestBeaconEntryBasic(t *testing.T) { }, Provided: func() { - assert.Len(t, src.Data, dataLen) + require.Len(t, src.Data, dataLen) }, Finished: func() { - assert.Equal(t, src, dst, "from src to dst through cbor") + require.Equal(t, src, dst, "from src to dst through cbor") }, } diff --git a/venus-shared/chain/bigint_fil_test.go b/venus-shared/chain/bigint_fil_test.go index cb35bb3a00..597e6e836c 100644 --- a/venus-shared/chain/bigint_fil_test.go +++ b/venus-shared/chain/bigint_fil_test.go @@ -6,7 +6,6 @@ import ( "github.com/filecoin-project/venus/venus-shared/chain/params" "github.com/filecoin-project/venus/venus-shared/testutil" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -24,12 +23,12 @@ func TestFilRoundTrip(t *testing.T) { } text, err := fval.MarshalText() - assert.NoError(t, err, "marshal text for fval") + require.NoError(t, err, "marshal text for fval") fval2 := FIL(NewInt(0)) err = fval2.UnmarshalText(text) - assert.NoError(t, err, "unmarshal text for fval2") - assert.True(t, BigInt{Int: fval.Int}.Equals(BigInt{Int: fval2.Int})) + require.NoError(t, err, "unmarshal text for fval2") + require.True(t, BigInt{Int: fval.Int}.Equals(BigInt{Int: fval2.Int})) } } @@ -43,12 +42,12 @@ func TestParseAttoFils(t *testing.T) { fval := MustParseFIL(v) text, err := fval.MarshalText() - assert.NoError(t, err, "marshal text for fval") + require.NoError(t, err, "marshal text for fval") fval2 := FIL(NewInt(0)) err = fval2.UnmarshalText(text) - assert.NoError(t, err, "unmarshal text for fval2") - assert.True(t, BigInt{Int: fval.Int}.Equals(BigInt{Int: fval2.Int})) + require.NoError(t, err, "unmarshal text for fval2") + require.True(t, BigInt{Int: fval.Int}.Equals(BigInt{Int: fval2.Int})) } } diff --git a/venus-shared/chain/bigint_test.go b/venus-shared/chain/bigint_test.go index 7ee0b55f6e..49184fe3bc 100644 --- a/venus-shared/chain/bigint_test.go +++ b/venus-shared/chain/bigint_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/filecoin-project/venus/venus-shared/testutil" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestBigIntSerializationRoundTrip(t *testing.T) { @@ -43,7 +43,7 @@ func TestBigIntParseErr(t *testing.T) { for _, v := range testValues { _, err := BigFromString(v) - assert.Error(t, err, "from invalid big int string") + require.Error(t, err, "from invalid big int string") } } @@ -72,8 +72,8 @@ func TestBigIntCalculating(t *testing.T) { sum := BigAdd(a, b) product := BigMul(a, b) - assert.True(t, BigSub(sum, a).Equals(b)) - assert.True(t, BigDiv(product, a).Equals(b)) + require.True(t, BigSub(sum, a).Equals(b)) + require.True(t, BigDiv(product, a).Equals(b)) base := a if base.IsZero() { @@ -81,10 +81,10 @@ func TestBigIntCalculating(t *testing.T) { } base4 := BigMul(base, NewInt(4)) - assert.Equal(t, BigDivFloat(base4, base), 4.0) - assert.Equal(t, BigDivFloat(base, base4), 0.25) + require.Equal(t, BigDivFloat(base4, base), 4.0) + require.Equal(t, BigDivFloat(base, base4), 0.25) abs := base.Abs() - assert.True(t, BigMod(abs, BigAdd(abs, NewInt(1))).Equals(abs)) + require.True(t, BigMod(abs, BigAdd(abs, NewInt(1))).Equals(abs)) } } diff --git a/venus-shared/chain/bigint_unit_test.go b/venus-shared/chain/bigint_unit_test.go index 0da5361d20..f2037a03b0 100644 --- a/venus-shared/chain/bigint_unit_test.go +++ b/venus-shared/chain/bigint_unit_test.go @@ -9,7 +9,7 @@ import ( "github.com/docker/go-units" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestUnitStrs(t *testing.T) { @@ -29,8 +29,8 @@ func TestUnitStrs(t *testing.T) { } for _, c := range cases { - assert.Equal(t, c.size, SizeStr(NewInt(c.in)), "result of SizeStr") - assert.Equal(t, c.deci, DeciStr(NewInt(c.in)), "result of DeciStr") + require.Equal(t, c.size, SizeStr(NewInt(c.in)), "result of SizeStr") + require.Equal(t, c.deci, DeciStr(NewInt(c.in)), "result of DeciStr") } } @@ -43,10 +43,10 @@ func TestSizeStrUnitsSymmetry(t *testing.T) { l := strings.ReplaceAll(units.BytesSize(float64(n)), " ", "") r := strings.ReplaceAll(SizeStr(NewInt(n)), " ", "") - assert.NotContains(t, l, "e+") - assert.NotContains(t, r, "e+") + require.NotContains(t, l, "e+") + require.NotContains(t, r, "e+") - assert.Equal(t, l, r, "wrong formatting for %d", n) + require.Equal(t, l, r, "wrong formatting for %d", n) } } @@ -54,6 +54,6 @@ func TestSizeStrBig(t *testing.T) { ZiB := big.NewInt(50000) ZiB = ZiB.Lsh(ZiB, 70) - assert.Equal(t, "5e+04 ZiB", SizeStr(BigInt{Int: ZiB}), "inout %+v, produced wrong result", ZiB) + require.Equal(t, "5e+04 ZiB", SizeStr(BigInt{Int: ZiB}), "inout %+v, produced wrong result", ZiB) } diff --git a/venus-shared/chain/block_header_test.go b/venus-shared/chain/block_header_test.go index 064d984172..df43d20de6 100644 --- a/venus-shared/chain/block_header_test.go +++ b/venus-shared/chain/block_header_test.go @@ -7,7 +7,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/filecoin-project/venus/venus-shared/testutil" ) @@ -19,37 +19,37 @@ func TestBlockHeaderMarshal(t *testing.T) { const sdata = "904400e0a601815860b48541b503b47535334553bf0d1fc702d395133e28b48bbae7550e955025ee09f642cb82c79de036099c657b7efb78e10b685aa99d817f6e560805787c5df894ac6758b0d68c72fb498113a5e763ef65d5bff576cd7fc3a847684a410b89c63c82025860a233b638f28312f9014728cf42e2c353bbf2031506488fa3192d137881e8b9666a2d131218e96b51b701f826940ef6630ae13b20c7bf115155e349c88363949fd7704f8026c3c3b1f872d9085e912856d2b56b8ce8a6fb8cf4e996aaa8476e2c81821a001506545860a699f4d93c54d66d46a46cab8da059fbf7ef82e40dd19a67fc1c5a402422304e7b8eec5c2dc6107e0cf1be676f12ce9b05675160e1c66f0ae5ebcf056e303ca39aa813acd5403844604b51f1e3dd5fcd271978346b85cdfa6d75cb46e2c6609581820358c09095232420f9caff389c0709ace12897ad0b5734b104011849e0f008febf39d8c64079236d3e75c24c08a613bcd946538a4b966b3c5a79cf61832c673f2ec90d22d02c16e28073c20995f5259567736d6e6f2fee588c7c23ca1946d753a783fe14404c3f4684a0a7cf5ceadc8a7a2cd9ad0387b96608eca6d3604ed7beb948f7fa2e235f1d611114f66752c6c36ac9aeb17c2f36d70accbd7554678034381486a1a95ea36db4dc549ee152a00c1b454da4f47b33327609be8b055f14681a2edf84d82a5827000171a0e4022084da38b952ab5644c5418c3305b3c22b5eca92eab9e23cdb675163773a964c53d82a5827000171a0e402201ef87dc542d008d961a30a36935a06d28ef05e4ed5e22f7779c4f3f8002c451dd82a5827000171a0e4022079bfefc62c740cda4b0463ceba68e9613c5c47ef7bbed968b179763ae7978bf4d82a5827000171a0e402202f9becc403d7228035f153d9cba42db472ed3c1cb3f22c7ae02eaaabca53e80f460001d7dbb8171a00067680d82a5827000171a0e402204f2120d6581f3d69a5d62e25dd993d1825ce6a446ffa801a4092e7e3a28d4b73d82a5827000171a0e402204bc482ae9a6a1afd1a252264a4bcae9fb2150faf9910b80703e9fbb91ab041e3d82a5827000171a0e4022017d2c80f5b157b61e96ea4ef3888762fa81a9a853bffa624f4bfb9c388859a88586102b3f7f6dc71591af0a61bbcad978178fc123a6edbec959716c028ec976b997df83af557a5ad1d05544d5ce82e5461c562196ea998b437bf0ceb7965871bd6d9e16a2df9cfaaf50b627f5a406d344f1ae0d8e0eaa5835f9c092fe24681cbc7761d1a618f1680f600420064" maddr, err := address.NewFromString(mdata) - assert.NoErrorf(t, err, "parse miner address %s", mdata) + require.NoErrorf(t, err, "parse miner address %s", mdata) c, err := cid.Decode(cdata) - assert.NoErrorf(t, err, "decode cid %s", cdata) + require.NoErrorf(t, err, "decode cid %s", cdata) - assert.NotEqual(t, bdata, sdata, "check raw sign bytes") + require.NotEqual(t, bdata, sdata, "check raw sign bytes") b, err := hex.DecodeString(bdata) - assert.NoError(t, err, "decode block header binary") + require.NoError(t, err, "decode block header binary") signb, err := hex.DecodeString(sdata) - assert.NoError(t, err, "decode sign bytes") + require.NoError(t, err, "decode sign bytes") bh, err := DecodeBlock(b) - assert.NoError(t, err, "decode block header") + require.NoError(t, err, "decode block header") - assert.Equal(t, maddr, bh.Miner, "check for miner") + require.Equal(t, maddr, bh.Miner, "check for miner") signdata, err := bh.SignatureData() - assert.NoError(t, err, "call bh.SignatureData") - assert.Equal(t, signb, signdata, "check for signature data") + require.NoError(t, err, "call bh.SignatureData") + require.Equal(t, signb, signdata, "check for signature data") - assert.Equal(t, c, bh.Cid(), "check for bh.Cid()") + require.Equal(t, c, bh.Cid(), "check for bh.Cid()") serialized, err := bh.Serialize() - assert.NoError(t, err, "call bh.Serialize") - assert.Equal(t, b, serialized, "check for bh.Serialize()") + require.NoError(t, err, "call bh.Serialize") + require.Equal(t, b, serialized, "check for bh.Serialize()") blk, err := bh.ToStorageBlock() - assert.NoError(t, err, "call bh.ToStorageBlock") + require.NoError(t, err, "call bh.ToStorageBlock") - assert.Equal(t, c, blk.Cid(), "check for blk.Cid()") - assert.Equal(t, b, blk.RawData(), "check for blk.RawData()") + require.Equal(t, c, blk.Cid(), "check for blk.Cid()") + require.Equal(t, b, blk.RawData(), "check for blk.RawData()") } func TestBlockHeaderBasic(t *testing.T) { @@ -62,7 +62,7 @@ func TestBlockHeaderBasic(t *testing.T) { opt := testutil.CborErBasicTestOptions{ Buf: &buf, Prepare: func() { - assert.Equal(t, src, dst) + require.Equal(t, src, dst) }, ProvideOpts: []interface{}{ @@ -72,32 +72,32 @@ func TestBlockHeaderBasic(t *testing.T) { }, Provided: func() { - assert.Equal(t, src.Miner.Protocol(), address.ID, "miner addr proto") - assert.Len(t, src.Parents, sliceLen, "parents length") - assert.NotNil(t, src.ElectionProof, "ElectionProof") - assert.Len(t, src.ElectionProof.VRFProof, bytesLen, "VRFProof len") - assert.NotNil(t, src.BlockSig, "BlockSig") - assert.Len(t, src.BlockSig.Data, bytesLen, "BlockSig.Data len") - assert.NotNil(t, src.BLSAggregate, "BLSAggregate") - assert.Len(t, src.BLSAggregate.Data, bytesLen, "BLSAggregate.Data len") + require.Equal(t, src.Miner.Protocol(), address.ID, "miner addr proto") + require.Len(t, src.Parents, sliceLen, "parents length") + require.NotNil(t, src.ElectionProof, "ElectionProof") + require.Len(t, src.ElectionProof.VRFProof, bytesLen, "VRFProof len") + require.NotNil(t, src.BlockSig, "BlockSig") + require.Len(t, src.BlockSig.Data, bytesLen, "BlockSig.Data len") + require.NotNil(t, src.BLSAggregate, "BLSAggregate") + require.Len(t, src.BLSAggregate.Data, bytesLen, "BLSAggregate.Data len") }, Marshaled: func(b []byte) { decoded, err := DecodeBlock(b) - assert.NoError(t, err, "DecodeBlock") - assert.Equal(t, src, *decoded) + require.NoError(t, err, "DecodeBlock") + require.Equal(t, src, *decoded) }, Finished: func() { - assert.Equal(t, src.LastTicket(), dst.LastTicket()) - assert.Equal(t, src, dst) - assert.Equal(t, src.String(), dst.String()) - assert.True(t, src.Equals(&dst)) + require.Equal(t, src.LastTicket(), dst.LastTicket()) + require.Equal(t, src, dst) + require.Equal(t, src.String(), dst.String()) + require.True(t, src.Equals(&dst)) - assert.False(t, src.IsValidated(), "check validated before set") + require.False(t, src.IsValidated(), "check validated before set") src.SetValidated() - assert.True(t, src.IsValidated(), "check validated before set") + require.True(t, src.IsValidated(), "check validated before set") }, } diff --git a/venus-shared/chain/block_msg_test.go b/venus-shared/chain/block_msg_test.go index c46f9e2ceb..1cab63cff9 100644 --- a/venus-shared/chain/block_msg_test.go +++ b/venus-shared/chain/block_msg_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/ipfs/go-cid" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/venus-shared/testutil" @@ -22,10 +22,10 @@ func TestBlockMsgBasic(t *testing.T) { opt := testutil.CborErBasicTestOptions{ Buf: &buf, Prepare: func() { - assert.Equal(t, src, dst) - assert.Nil(t, src.Header) - assert.Nil(t, src.BlsMessages) - assert.Nil(t, src.SecpkMessages) + require.Equal(t, src, dst) + require.Nil(t, src.Header) + require.Nil(t, src.BlsMessages) + require.Nil(t, src.SecpkMessages) }, ProvideOpts: []interface{}{ @@ -33,28 +33,28 @@ func TestBlockMsgBasic(t *testing.T) { }, Provided: func() { - assert.NotEqual(t, src, dst, "value provided") - assert.NotNil(t, src.Header) - assert.NotEqual(t, emptyCids, src.BlsMessages) - assert.NotEqual(t, emptyCids, src.SecpkMessages) + require.NotEqual(t, src, dst, "value provided") + require.NotNil(t, src.Header) + require.NotEqual(t, emptyCids, src.BlsMessages) + require.NotEqual(t, emptyCids, src.SecpkMessages) }, Marshaled: func(b []byte) { bmCid := src.Cid() - assert.Equal(t, bmCid, src.Header.Cid(), "Cid() result for BlockMsg") + require.Equal(t, bmCid, src.Header.Cid(), "Cid() result for BlockMsg") sumCid, err := abi.CidBuilder.Sum(b) - assert.NoError(t, err, "CidBuilder.Sum") + require.NoError(t, err, "CidBuilder.Sum") - assert.NotEqual(t, bmCid, sumCid) + require.NotEqual(t, bmCid, sumCid) serialized, err := src.Serialize() - assert.NoError(t, err, "Serialize") - assert.Equal(t, b, serialized) + require.NoError(t, err, "Serialize") + require.Equal(t, b, serialized) }, Finished: func() { - assert.Equal(t, src, dst, "after unmarshaling") + require.Equal(t, src, dst, "after unmarshaling") }, } diff --git a/venus-shared/chain/election_proof_test.go b/venus-shared/chain/election_proof_test.go index 2ad96ffd95..c0c3ea79de 100644 --- a/venus-shared/chain/election_proof_test.go +++ b/venus-shared/chain/election_proof_test.go @@ -4,7 +4,7 @@ import ( "bytes" "testing" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/filecoin-project/venus/venus-shared/testutil" ) @@ -20,7 +20,7 @@ func TestElectionProofBasic(t *testing.T) { opt := testutil.CborErBasicTestOptions{ Buf: &buf, Prepare: func() { - assert.Equal(t, src, dst, "empty values") + require.Equal(t, src, dst, "empty values") }, ProvideOpts: []interface{}{ @@ -29,14 +29,14 @@ func TestElectionProofBasic(t *testing.T) { }, Provided: func() { - assert.NotEqual(t, src, dst, "src value provided") - assert.Len(t, src.VRFProof, vrfLen, "vrf length") - assert.GreaterOrEqual(t, src.WinCount, winCountMin, "win count min") - assert.Less(t, src.WinCount, winCountMax, "win count max") + require.NotEqual(t, src, dst, "src value provided") + require.Len(t, src.VRFProof, vrfLen, "vrf length") + require.GreaterOrEqual(t, src.WinCount, winCountMin, "win count min") + require.Less(t, src.WinCount, winCountMax, "win count max") }, Finished: func() { - assert.Equal(t, src, dst, "from src to dst through cbor") + require.Equal(t, src, dst, "from src to dst through cbor") t1, t2 := Ticket{ VRFProof: src.VRFProof, @@ -44,10 +44,10 @@ func TestElectionProofBasic(t *testing.T) { VRFProof: dst.VRFProof, } - assert.Equal(t, t1, t2, "ticket") + require.Equal(t, t1, t2, "ticket") - assert.True(t, t1.Compare(&t2) == 0, "ticket equal") - assert.Equal(t, t1.Quality(), t2.Quality()) + require.True(t, t1.Compare(&t2) == 0, "ticket equal") + require.Equal(t, t1.Quality(), t2.Quality()) }, } @@ -65,7 +65,7 @@ func TestTicketBasic(t *testing.T) { opt := testutil.CborErBasicTestOptions{ Buf: &buf, Prepare: func() { - assert.Equal(t, src, dst, "empty values") + require.Equal(t, src, dst, "empty values") }, ProvideOpts: []interface{}{ @@ -73,12 +73,12 @@ func TestTicketBasic(t *testing.T) { }, Provided: func() { - assert.NotEqual(t, src, dst, "src value provided") - assert.Len(t, src.VRFProof, vrfLen, "vrf length") + require.NotEqual(t, src, dst, "src value provided") + require.Len(t, src.VRFProof, vrfLen, "vrf length") }, Finished: func() { - assert.Equal(t, src, dst, "from src to dst through cbor") + require.Equal(t, src, dst, "from src to dst through cbor") t1, t2 := Ticket{ VRFProof: src.VRFProof, @@ -86,14 +86,14 @@ func TestTicketBasic(t *testing.T) { VRFProof: dst.VRFProof, } - assert.Equal(t, t1, t2, "ticket") + require.Equal(t, t1, t2, "ticket") - assert.True(t, t1.Compare(&t2) == 0, "ticket equal") - assert.Equal(t, t1.Quality(), t2.Quality()) + require.True(t, t1.Compare(&t2) == 0, "ticket equal") + require.Equal(t, t1.Quality(), t2.Quality()) testutil.Provide(t, &another, testutil.BytesFixedProvider(vrfLen)) - assert.Len(t, another.VRFProof, vrfLen, "vrf length") - assert.True(t, src.Less(&another) == (src.Compare(&another) < 0)) + require.Len(t, another.VRFProof, vrfLen, "vrf length") + require.True(t, src.Less(&another) == (src.Compare(&another) < 0)) }, } diff --git a/venus-shared/chain/message_receipt_test.go b/venus-shared/chain/message_receipt_test.go index 13f5cdb7e5..b5b138ff94 100644 --- a/venus-shared/chain/message_receipt_test.go +++ b/venus-shared/chain/message_receipt_test.go @@ -4,7 +4,7 @@ import ( "bytes" "testing" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/venus/venus-shared/testutil" @@ -20,8 +20,8 @@ func TestMessageReceiptBasic(t *testing.T) { opt := testutil.CborErBasicTestOptions{ Buf: &buf, Prepare: func() { - assert.Equal(t, src, dst, "empty values") - assert.Nil(t, src.ReturnValue) + require.Equal(t, src, dst, "empty values") + require.Nil(t, src.ReturnValue) }, ProvideOpts: []interface{}{ @@ -35,18 +35,18 @@ func TestMessageReceiptBasic(t *testing.T) { }, Provided: func() { - assert.Len(t, src.ReturnValue, dataLen) + require.Len(t, src.ReturnValue, dataLen) - assert.GreaterOrEqual(t, src.ExitCode, exitcode.ExitCode(0)) - assert.Less(t, src.ExitCode, exitcode.ExitCode(20)) + require.GreaterOrEqual(t, src.ExitCode, exitcode.ExitCode(0)) + require.Less(t, src.ExitCode, exitcode.ExitCode(20)) - assert.GreaterOrEqual(t, src.GasUsed, int64(10_000_000)) - assert.Less(t, src.GasUsed, int64(50_000_000)) + require.GreaterOrEqual(t, src.GasUsed, int64(10_000_000)) + require.Less(t, src.GasUsed, int64(50_000_000)) }, Finished: func() { - assert.Equal(t, src, dst, "from src to dst through cbor") - assert.Equal(t, src.String(), dst.String(), "string representation") + require.Equal(t, src, dst, "from src to dst through cbor") + require.Equal(t, src.String(), dst.String(), "string representation") }, } diff --git a/venus-shared/chain/message_root_test.go b/venus-shared/chain/message_root_test.go index a38410b958..edbcda7f79 100644 --- a/venus-shared/chain/message_root_test.go +++ b/venus-shared/chain/message_root_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/ipfs/go-cid" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/filecoin-project/venus/venus-shared/testutil" ) @@ -18,25 +18,25 @@ func TestMessageRootBasic(t *testing.T) { opt := testutil.CborErBasicTestOptions{ Buf: &buf, Prepare: func() { - assert.Equal(t, src, dst, "empty values") - assert.Equal(t, src.BlsRoot, cid.Undef) - assert.Equal(t, src.SecpkRoot, cid.Undef) + require.Equal(t, src, dst, "empty values") + require.Equal(t, src.BlsRoot, cid.Undef) + require.Equal(t, src.SecpkRoot, cid.Undef) }, Provided: func() { - assert.NotEqual(t, src.BlsRoot, cid.Undef) - assert.NotEqual(t, src.SecpkRoot, cid.Undef) + require.NotEqual(t, src.BlsRoot, cid.Undef) + require.NotEqual(t, src.SecpkRoot, cid.Undef) }, Finished: func() { - assert.Equal(t, src, dst, "from src to dst through cbor") + require.Equal(t, src, dst, "from src to dst through cbor") blk, err := src.ToStorageBlock() - assert.NoError(t, err, "ToStorageBlock") + require.NoError(t, err, "ToStorageBlock") srcCid := src.Cid() - assert.Equal(t, srcCid, dst.Cid(), "cid compare to dst") - assert.Equal(t, srcCid, blk.Cid(), "cid compare to sblk") + require.Equal(t, srcCid, dst.Cid(), "cid compare to dst") + require.Equal(t, srcCid, blk.Cid(), "cid compare to sblk") }, } diff --git a/venus-shared/chain/message_test.go b/venus-shared/chain/message_test.go index 75978ddc32..c375425671 100644 --- a/venus-shared/chain/message_test.go +++ b/venus-shared/chain/message_test.go @@ -7,7 +7,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/venus/venus-shared/testutil" blocks "github.com/ipfs/go-block-format" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestMessageBasic(t *testing.T) { @@ -19,7 +19,7 @@ func TestMessageBasic(t *testing.T) { opt := testutil.CborErBasicTestOptions{ Buf: &buf, Prepare: func() { - assert.Equal(t, src, dst, "empty values") + require.Equal(t, src, dst, "empty values") }, ProvideOpts: []interface{}{ @@ -28,31 +28,31 @@ func TestMessageBasic(t *testing.T) { }, Provided: func() { - assert.NotEqual(t, src, dst, "value provided") - assert.Equal(t, src.From.Protocol(), address.BLS, "from addr proto") - assert.Equal(t, src.To.Protocol(), address.BLS, "to addr proto") - assert.Len(t, src.Params, paramsLen, "params length") + require.NotEqual(t, src, dst, "value provided") + require.Equal(t, src.From.Protocol(), address.BLS, "from addr proto") + require.Equal(t, src.To.Protocol(), address.BLS, "to addr proto") + require.Len(t, src.Params, paramsLen, "params length") src.Version = MessageVersion sblk, err := src.ToStorageBlock() - assert.NoError(t, err, "ToStorageBlock") + require.NoError(t, err, "ToStorageBlock") blk = sblk }, Marshaled: func(b []byte) { decoded, err := DecodeMessage(b) - assert.NoError(t, err, "DecodeMessage") - assert.True(t, src.Equals(decoded)) + require.NoError(t, err, "DecodeMessage") + require.True(t, src.Equals(decoded)) }, Finished: func() { - assert.Equal(t, src, dst) - assert.True(t, src.Equals(&dst)) - assert.True(t, src.EqualCall(&dst)) - assert.Equal(t, src.Cid(), dst.Cid()) - assert.Equal(t, src.Cid(), blk.Cid()) - assert.Equal(t, src.String(), dst.String()) + require.Equal(t, src, dst) + require.True(t, src.Equals(&dst)) + require.True(t, src.EqualCall(&dst)) + require.Equal(t, src.Cid(), dst.Cid()) + require.Equal(t, src.Cid(), blk.Cid()) + require.Equal(t, src.String(), dst.String()) }, } diff --git a/venus-shared/chain/signed_message_test.go b/venus-shared/chain/signed_message_test.go index b0887cf76f..059cf99a77 100644 --- a/venus-shared/chain/signed_message_test.go +++ b/venus-shared/chain/signed_message_test.go @@ -4,7 +4,7 @@ import ( "bytes" "testing" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/venus/venus-shared/testutil" @@ -21,8 +21,8 @@ func TestSignedMessageBasic(t *testing.T) { opt := testutil.CborErBasicTestOptions{ Buf: &buf, Prepare: func() { - assert.Equal(t, src, dst) - assert.Nil(t, src.Signature.Data) + require.Equal(t, src, dst) + require.Nil(t, src.Signature.Data) }, ProvideOpts: []interface{}{ @@ -31,30 +31,30 @@ func TestSignedMessageBasic(t *testing.T) { }, Provided: func() { - assert.NotEqual(t, src, dst, "value provided") - assert.Len(t, src.Signature.Data, bytesLen) + require.NotEqual(t, src, dst, "value provided") + require.Len(t, src.Signature.Data, bytesLen) }, Finished: func() { - assert.Equal(t, src, dst, "after unmarshaling") - assert.Equal(t, src.String(), dst.String()) + require.Equal(t, src, dst, "after unmarshaling") + require.Equal(t, src.String(), dst.String()) c := src.Cid() blk, err := src.ToStorageBlock() - assert.NoError(t, err, "ToStorageBlock") + require.NoError(t, err, "ToStorageBlock") - assert.Equal(t, c, blk.Cid()) - assert.Equal(t, c, dst.Cid()) + require.Equal(t, c, blk.Cid()) + require.Equal(t, c, dst.Cid()) switch src.Signature.Type { case crypto.SigTypeBLS: - assert.Equal(t, c, src.Message.Cid()) - assert.Equal(t, src.ChainLength(), src.Message.ChainLength()) + require.Equal(t, c, src.Message.Cid()) + require.Equal(t, src.ChainLength(), src.Message.ChainLength()) case crypto.SigTypeSecp256k1: - assert.NotEqual(t, c, src.Message.Cid()) - assert.Greater(t, src.ChainLength(), src.Message.ChainLength()) + require.NotEqual(t, c, src.Message.Cid()) + require.Greater(t, src.ChainLength(), src.Message.ChainLength()) default: t.Fatalf("unexpected sig type %d", src.Signature.Type) diff --git a/venus-shared/chain/tipset_exp_tipset_test.go b/venus-shared/chain/tipset_exp_tipset_test.go index dd98ab4ed5..5db36aafc5 100644 --- a/venus-shared/chain/tipset_exp_tipset_test.go +++ b/venus-shared/chain/tipset_exp_tipset_test.go @@ -4,7 +4,7 @@ import ( "bytes" "testing" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/filecoin-project/venus/venus-shared/testutil" ) @@ -20,9 +20,9 @@ func TestExpTipSet(t *testing.T) { opt := testutil.CborErBasicTestOptions{ Buf: &buf, Prepare: func() { - assert.Equal(t, src, dst, "empty values") - assert.Nil(t, src.Cids, "empty cids") - assert.Nil(t, src.Blocks, "empty blocks") + require.Equal(t, src, dst, "empty values") + require.Nil(t, src.Cids, "empty cids") + require.Nil(t, src.Blocks, "empty blocks") }, ProvideOpts: []interface{}{ @@ -31,13 +31,13 @@ func TestExpTipSet(t *testing.T) { }, Provided: func() { - assert.NotEqual(t, src, dst, "src value provided") - assert.Len(t, src.Cids, sliceLen, "cids length") - assert.Len(t, src.Blocks, sliceLen, "blocks length") + require.NotEqual(t, src, dst, "src value provided") + require.Len(t, src.Cids, sliceLen, "cids length") + require.Len(t, src.Blocks, sliceLen, "blocks length") }, Finished: func() { - assert.Equal(t, src, dst) + require.Equal(t, src, dst) }, } diff --git a/venus-shared/chain/tipset_key_test.go b/venus-shared/chain/tipset_key_test.go index a522e9bc40..b623ef7c8e 100644 --- a/venus-shared/chain/tipset_key_test.go +++ b/venus-shared/chain/tipset_key_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/ipfs/go-cid" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/filecoin-project/venus/venus-shared/testutil" ) @@ -15,29 +15,29 @@ func TestTipSetKey(t *testing.T) { // value provided testutil.Provide(t, &cids, testutil.WithSliceLen(cidNum)) - assert.Len(t, cids, cidNum) - assert.NotEqual(t, make([]cid.Cid, cidNum), cids) + require.Len(t, cids, cidNum) + require.NotEqual(t, make([]cid.Cid, cidNum), cids) // construct tsk := NewTipSetKey(cids...) - assert.False(t, tsk.IsEmpty()) + require.False(t, tsk.IsEmpty()) - assert.NotEqual(t, tsk, EmptyTSK) + require.NotEqual(t, tsk, EmptyTSK) // content - assert.Equal(t, tsk.Cids(), cids) + require.Equal(t, tsk.Cids(), cids) tskStr := tsk.String() for i := range cids { - assert.Contains(t, tskStr, cids[i].String()) + require.Contains(t, tskStr, cids[i].String()) } // marshal json data, err := tsk.MarshalJSON() - assert.NoError(t, err, "marshal json") + require.NoError(t, err, "marshal json") var decoded TipSetKey err = decoded.UnmarshalJSON(data) - assert.NoError(t, err) + require.NoError(t, err) - assert.Equal(t, tsk, decoded) + require.Equal(t, tsk, decoded) } diff --git a/venus-shared/chain/tipset_test.go b/venus-shared/chain/tipset_test.go index 0c0078d3b5..d664331ddc 100644 --- a/venus-shared/chain/tipset_test.go +++ b/venus-shared/chain/tipset_test.go @@ -7,7 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/filecoin-project/venus/venus-shared/testutil" ) @@ -26,12 +26,12 @@ func constructTipSetKeyInfos(t *testing.T) (abi.ChainEpoch, []cid.Cid, big.Int) var parents []cid.Cid testutil.Provide(t, &parents, testutil.WithSliceLen(parentNum)) - assert.GreaterOrEqual(t, len(parents), minBlockHeaderNumForTest) - assert.Less(t, len(parents), maxBlockHeaderNumForTest) + require.GreaterOrEqual(t, len(parents), minBlockHeaderNumForTest) + require.Less(t, len(parents), maxBlockHeaderNumForTest) var parentWeight big.Int testutil.Provide(t, &parentWeight, testutil.PositiveBigProvider()) - assert.True(t, parentWeight.GreaterThan(big.Zero())) + require.True(t, parentWeight.GreaterThan(big.Zero())) return height, parents, parentWeight } @@ -70,13 +70,13 @@ func constructTipSet(t *testing.T, height abi.ChainEpoch, parents []cid.Cid, par var bhs []*BlockHeader testutil.Provide(t, &bhs, testutil.WithSliceLen(blkNum)) - assert.GreaterOrEqual(t, len(bhs), minBlockHeaderNumForTest) - assert.Less(t, len(bhs), maxBlockHeaderNumForTest) + require.GreaterOrEqual(t, len(bhs), minBlockHeaderNumForTest) + require.Less(t, len(bhs), maxBlockHeaderNumForTest) for ai := 0; ai < len(appliers); ai++ { _, err := NewTipSet(bhs) - assert.Errorf(t, err, "attempt to construct tipset before applier #%d", ai) - assert.Containsf(t, err.Error(), appliers[ai].msg, "err msg content before applier #%d", ai) + require.Errorf(t, err, "attempt to construct tipset before applier #%d", ai) + require.Containsf(t, err.Error(), appliers[ai].msg, "err msg content before applier #%d", ai) for bi := range bhs { appliers[ai].fn(bhs[bi]) @@ -85,12 +85,12 @@ func constructTipSet(t *testing.T, height abi.ChainEpoch, parents []cid.Cid, par // duplicate bh _, err := NewTipSet(append(bhs, bhs[0])) - assert.Error(t, err, "attempt to construct tipset with duplicated bh") - assert.Containsf(t, err.Error(), "duplicate block ", "err msg content for duplicate block") + require.Error(t, err, "attempt to construct tipset with duplicated bh") + require.Containsf(t, err.Error(), "duplicate block ", "err msg content for duplicate block") // construct ts, err := NewTipSet(bhs) - assert.NoError(t, err, "construct tipset") + require.NoError(t, err, "construct tipset") return ts } @@ -104,15 +104,15 @@ func TestTipSetMethods(t *testing.T) { height, parents, parentWeight := constructTipSetKeyInfos(t) ts := constructTipSet(t, height, parents, parentWeight) - assert.True(t, ts.Defined()) + require.True(t, ts.Defined()) tsk := ts.Key() - assert.NotEqual(t, EmptyTSK, tsk, "tsk not empty") + require.NotEqual(t, EmptyTSK, tsk, "tsk not empty") - assert.Equal(t, ts.Height(), height) + require.Equal(t, ts.Height(), height) - assert.True(t, ts.ParentWeight().Equals(parentWeight), "parent weight") + require.True(t, ts.ParentWeight().Equals(parentWeight), "parent weight") child := constructTipSet(t, height+1, tsk.Cids(), BigMul(parentWeight, NewInt(2))) - assert.True(t, child.IsChildOf(ts), "check if is child") + require.True(t, child.IsChildOf(ts), "check if is child") } diff --git a/venus-shared/go.mod b/venus-shared/go.mod index 56af51aee3..1fbfdea40a 100644 --- a/venus-shared/go.mod +++ b/venus-shared/go.mod @@ -13,6 +13,7 @@ require ( github.com/ipfs/go-ipld-cbor v0.0.4 github.com/ipfs/go-ipld-format v0.0.2 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 + github.com/smartystreets/assertions v1.0.1 // indirect github.com/stretchr/testify v1.7.0 github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 diff --git a/venus-shared/go.sum b/venus-shared/go.sum index e443d51eaa..ecfbf0b9e2 100644 --- a/venus-shared/go.sum +++ b/venus-shared/go.sum @@ -109,6 +109,9 @@ github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUr github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/requireions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/requireions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= +github.com/smartystreets/requireions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/venus-shared/testutil/cbor_basic.go b/venus-shared/testutil/cbor_basic.go index 47d090709b..4686fd5b1f 100644 --- a/venus-shared/testutil/cbor_basic.go +++ b/venus-shared/testutil/cbor_basic.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/filecoin-project/go-state-types/cbor" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) type CborErBasicTestOptions struct { @@ -30,14 +30,14 @@ func CborErBasicTest(t *testing.T, src, dst cbor.Er, opts CborErBasicTestOptions opts.Buf.Reset() err := src.MarshalCBOR(opts.Buf) - assert.NoErrorf(t, err, "marshal from src of %T", src) + require.NoErrorf(t, err, "marshal from src of %T", src) if opts.Marshaled != nil { opts.Marshaled(opts.Buf.Bytes()) } err = dst.UnmarshalCBOR(opts.Buf) - assert.NoErrorf(t, err, "unmarshal to dst of %T", dst) + require.NoErrorf(t, err, "unmarshal to dst of %T", dst) if opts.Finished != nil { opts.Finished() diff --git a/venus-shared/testutil/cbor_basic_test.go b/venus-shared/testutil/cbor_basic_test.go index 37d57c1c2f..0833481a02 100644 --- a/venus-shared/testutil/cbor_basic_test.go +++ b/venus-shared/testutil/cbor_basic_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/filecoin-project/go-address" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestCborBasicForAddress(t *testing.T) { @@ -15,12 +15,12 @@ func TestCborBasicForAddress(t *testing.T) { opt := CborErBasicTestOptions{ Buf: &buf, Prepare: func() { - assert.Equal(t, src, address.Undef, "empty address") - assert.Equal(t, src, dst, "empty cid") + require.Equal(t, src, address.Undef, "empty address") + require.Equal(t, src, dst, "empty cid") }, Provided: func() { - assert.NotEqual(t, src, dst, "address value provided") + require.NotEqual(t, src, dst, "address value provided") }, Marshaled: func(b []byte) { @@ -28,8 +28,8 @@ func TestCborBasicForAddress(t *testing.T) { }, Finished: func() { - assert.Equal(t, src, dst) - assert.NotEqual(t, src, address.Undef, "must not be address.Undef") + require.Equal(t, src, dst) + require.NotEqual(t, src, address.Undef, "must not be address.Undef") }, } @@ -44,8 +44,8 @@ func TestCborBasicForIDAddress(t *testing.T) { opt := CborErBasicTestOptions{ Buf: &buf, Prepare: func() { - assert.Equal(t, src, address.Undef, "empty address") - assert.Equal(t, src, dst, "empty cid") + require.Equal(t, src, address.Undef, "empty address") + require.Equal(t, src, dst, "empty cid") }, ProvideOpts: []interface{}{ @@ -53,13 +53,13 @@ func TestCborBasicForIDAddress(t *testing.T) { }, Provided: func() { - assert.NotEqual(t, src, dst, "address value provided") - assert.Equal(t, src.Protocol(), address.ID, "must be id address") + require.NotEqual(t, src, dst, "address value provided") + require.Equal(t, src.Protocol(), address.ID, "must be id address") }, Finished: func() { - assert.Equal(t, src, dst) - assert.NotEqual(t, src, address.Undef, "must not be address.Undef") + require.Equal(t, src, dst) + require.NotEqual(t, src, address.Undef, "must not be address.Undef") }, } diff --git a/venus-shared/testutil/value_provdier_chain_test.go b/venus-shared/testutil/value_provdier_chain_test.go index 28e377d354..626ba79a30 100644 --- a/venus-shared/testutil/value_provdier_chain_test.go +++ b/venus-shared/testutil/value_provdier_chain_test.go @@ -7,20 +7,20 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/crypto" "github.com/ipfs/go-cid" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestDefaultCid(t *testing.T) { var c cid.Cid Provide(t, &c) - assert.NotEqual(t, cid.Undef, c) + require.NotEqual(t, cid.Undef, c) } func TestDefaultCidSlice(t *testing.T) { cs := make([]cid.Cid, 16) Provide(t, &cs) for ci := range cs { - assert.NotEqual(t, cid.Undef, cs[ci]) + require.NotEqual(t, cid.Undef, cs[ci]) } } @@ -32,7 +32,7 @@ func TestDefaultAddresses(t *testing.T) { protos[addrs[i].Protocol()] = struct{}{} } - assert.True(t, len(protos) == 4) + require.True(t, len(protos) == 4) } func TestDefaultIDAddresses(t *testing.T) { @@ -43,7 +43,7 @@ func TestDefaultIDAddresses(t *testing.T) { protos[addrs[i].Protocol()] = struct{}{} } - assert.True(t, len(protos) == 1) + require.True(t, len(protos) == 1) } func TestDefaultBigs(t *testing.T) { @@ -52,21 +52,21 @@ func TestDefaultBigs(t *testing.T) { hasPositive := false hasNegative := false for bi := range bigs { - assert.NotNil(t, bigs[bi].Int) + require.NotNil(t, bigs[bi].Int) hasPositive = hasPositive || bigs[bi].GreaterThan(bigZero) hasNegative = hasNegative || bigs[bi].LessThan(bigZero) } - assert.True(t, hasPositive) - assert.True(t, hasNegative) + require.True(t, hasPositive) + require.True(t, hasNegative) } func TestPositiveBigs(t *testing.T) { bigs := make([]big.Int, 256) Provide(t, &bigs, PositiveBigProvider()) for bi := range bigs { - assert.NotNil(t, bigs[bi].Int) - assert.True(t, bigs[bi].GreaterThan(bigZero)) + require.NotNil(t, bigs[bi].Int) + require.True(t, bigs[bi].GreaterThan(bigZero)) } } @@ -74,8 +74,8 @@ func TestNegativeBigs(t *testing.T) { bigs := make([]big.Int, 256) Provide(t, &bigs, NegativeBigProvider()) for bi := range bigs { - assert.NotNil(t, bigs[bi].Int) - assert.True(t, bigs[bi].LessThan(bigZero)) + require.NotNil(t, bigs[bi].Int) + require.True(t, bigs[bi].LessThan(bigZero)) } } @@ -87,5 +87,5 @@ func TestDefaultSigTypes(t *testing.T) { typs[sigtyps[i]] = struct{}{} } - assert.True(t, len(typs) == 2) + require.True(t, len(typs) == 2) } diff --git a/venus-shared/testutil/value_provider_primitive_test.go b/venus-shared/testutil/value_provider_primitive_test.go index 99414e0b4e..5c65fea07b 100644 --- a/venus-shared/testutil/value_provider_primitive_test.go +++ b/venus-shared/testutil/value_provider_primitive_test.go @@ -7,7 +7,7 @@ import ( "testing" "time" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func getRand() *rand.Rand { @@ -22,11 +22,11 @@ func TestDefaultBytes(t *testing.T) { for i := 0; i < 16; i++ { var b []byte Provide(t, &b) - assert.Len(t, b, defaultBytesFixedSize) + require.Len(t, b, defaultBytesFixedSize) expected := make([]byte, defaultBytesFixedSize) local.Read(expected[:]) - assert.Equal(t, expected, b) + require.Equal(t, expected, b) } } @@ -37,11 +37,11 @@ func TestDefaultString(t *testing.T) { for i := 0; i < 16; i++ { var s string Provide(t, &s) - assert.Len(t, s, defaultBytesFixedSize*2) + require.Len(t, s, defaultBytesFixedSize*2) expected := make([]byte, defaultBytesFixedSize) local.Read(expected[:]) - assert.Equal(t, hex.EncodeToString(expected), s) + require.Equal(t, hex.EncodeToString(expected), s) } } @@ -51,69 +51,69 @@ func TestDefaultInt(t *testing.T) { for i := 0; i < 16; i++ { var n int Provide(t, &n) - assert.Equal(t, n, local.Int()) + require.Equal(t, n, local.Int()) } } func TestDefaultInt64(t *testing.T) { - assert.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(int64(0)))) + require.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(int64(0)))) local := getRand() for i := 0; i < 16; i++ { var n int64 Provide(t, &n) - assert.Equal(t, n, int64(local.Int())) + require.Equal(t, n, int64(local.Int())) } } func TestDefaultInt32(t *testing.T) { - assert.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(int32(0)))) + require.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(int32(0)))) local := getRand() for i := 0; i < 16; i++ { var n int32 Provide(t, &n) - assert.Equal(t, n, int32(local.Int())) + require.Equal(t, n, int32(local.Int())) } } func TestDefaultFloat64(t *testing.T) { - assert.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(float64(0)))) + require.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(float64(0)))) local := getRand() for i := 0; i < 16; i++ { var n float64 Provide(t, &n) - assert.Equal(t, n, float64(local.Int())) + require.Equal(t, n, float64(local.Int())) } } func TestDefaultIntType(t *testing.T) { type number int - assert.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(number(0)))) + require.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(number(0)))) local := getRand() for i := 0; i < 16; i++ { var n number Provide(t, &n) - assert.Equal(t, n, number(local.Int())) + require.Equal(t, n, number(local.Int())) } } func TestDefaultFloatType(t *testing.T) { type double float64 - assert.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(double(0)))) + require.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(double(0)))) local := getRand() for i := 0; i < 16; i++ { var n double Provide(t, &n) - assert.Equal(t, n, double(local.Int())) + require.Equal(t, n, double(local.Int())) } } @@ -123,8 +123,8 @@ func TestDefaultIntSlice(t *testing.T) { var dest []int Provide(t, &dest) - assert.Len(t, dest, 1) - assert.Equal(t, dest[0], local.Int()) + require.Len(t, dest, 1) + require.Equal(t, dest[0], local.Int()) } func TestDefaultIntSliceWithLen(t *testing.T) { @@ -133,23 +133,23 @@ func TestDefaultIntSliceWithLen(t *testing.T) { var dest []int Provide(t, &dest, WithSliceLen(10)) - assert.Len(t, dest, 10) + require.Len(t, dest, 10) for i := range dest { - assert.Equal(t, dest[i], local.Int()) + require.Equal(t, dest[i], local.Int()) } } func TestDefaultIntTypeSlice(t *testing.T) { type number int - assert.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(number(0)))) + require.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(number(0)))) local := getRand() var dest []number Provide(t, &dest) - assert.Len(t, dest, 1) - assert.Equal(t, dest[0], number(local.Int())) + require.Len(t, dest, 1) + require.Equal(t, dest[0], number(local.Int())) } func TestDefaultNonNilIntSlice(t *testing.T) { @@ -163,7 +163,7 @@ func TestDefaultNonNilIntSlice(t *testing.T) { expected[i] = local.Int() } - assert.Equal(t, expected, dest) + require.Equal(t, expected, dest) } func TestIntSliceWithFixedNumber(t *testing.T) { @@ -179,7 +179,7 @@ func TestIntSliceWithFixedNumber(t *testing.T) { expected[i] = now } - assert.Equal(t, expected, dest) + require.Equal(t, expected, dest) } func TestIntSliceRanged(t *testing.T) { @@ -190,8 +190,8 @@ func TestIntSliceRanged(t *testing.T) { Provide(t, &dest, IntRangedProvider(min, max)) for i := range dest { - assert.GreaterOrEqual(t, dest[i], min) - assert.Less(t, dest[i], max) + require.GreaterOrEqual(t, dest[i], min) + require.Less(t, dest[i], max) } } @@ -203,8 +203,8 @@ func TestNegativeIntSliceRanged(t *testing.T) { Provide(t, &dest, IntRangedProvider(min, max)) for i := range dest { - assert.GreaterOrEqual(t, dest[i], min) - assert.Less(t, dest[i], max) + require.GreaterOrEqual(t, dest[i], min) + require.Less(t, dest[i], max) } } @@ -219,7 +219,7 @@ func TestDefaultIntArray(t *testing.T) { expected[i] = local.Int() } - assert.Equal(t, expected, dest[:]) + require.Equal(t, expected, dest[:]) } func TestStruct(t *testing.T) { @@ -234,9 +234,9 @@ func TestStruct(t *testing.T) { Provide(t, &dest) - assert.Nil(t, dest.private) - assert.Len(t, dest.Public, 1) - assert.Equal(t, dest.Public[0], local.Int()) + require.Nil(t, dest.private) + require.Len(t, dest.Public, 1) + require.Equal(t, dest.Public[0], local.Int()) } func TestNestedStruct(t *testing.T) { @@ -255,12 +255,12 @@ func TestNestedStruct(t *testing.T) { var dest inner Provide(t, &dest) - assert.NotNil(t, dest.Public) - assert.Nil(t, dest.private) + require.NotNil(t, dest.Public) + require.Nil(t, dest.private) - assert.Len(t, dest.Public.Ints, 1) - assert.Len(t, dest.Public2.Ints, 1) + require.Len(t, dest.Public.Ints, 1) + require.Len(t, dest.Public2.Ints, 1) - assert.Equal(t, dest.Public.Ints[0], local.Int()) - assert.Equal(t, dest.Public2.Ints[0], local.Int()) + require.Equal(t, dest.Public.Ints[0], local.Int()) + require.Equal(t, dest.Public2.Ints[0], local.Int()) } diff --git a/venus-shared/testutil/value_provider_registry_test.go b/venus-shared/testutil/value_provider_registry_test.go index 1a89899c2f..ff8b7b1ce9 100644 --- a/venus-shared/testutil/value_provider_registry_test.go +++ b/venus-shared/testutil/value_provider_registry_test.go @@ -3,7 +3,7 @@ package testutil import ( "testing" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestInvalidProviders(t *testing.T) { @@ -18,6 +18,6 @@ func TestInvalidProviders(t *testing.T) { for ri := range vals { err := defaultValueProviderRegistry.register(vals[ri]) - assert.Errorf(t, err, "value #%d", ri) + require.Errorf(t, err, "value #%d", ri) } } From d70e822eba46564dfec58a94483e927e204699bf Mon Sep 17 00:00:00 2001 From: dtynn Date: Thu, 18 Nov 2021 16:50:45 +0800 Subject: [PATCH 023/167] feat: add more tests for TipSet / ElectionProof / Ticket --- venus-shared/chain/election_proof_test.go | 13 ++++ venus-shared/chain/tipset_marshal_test.go | 75 +++++++++++++++++++++++ venus-shared/chain/tipset_test.go | 4 +- 3 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 venus-shared/chain/tipset_marshal_test.go diff --git a/venus-shared/chain/election_proof_test.go b/venus-shared/chain/election_proof_test.go index c0c3ea79de..8376836813 100644 --- a/venus-shared/chain/election_proof_test.go +++ b/venus-shared/chain/election_proof_test.go @@ -6,6 +6,9 @@ import ( "github.com/stretchr/testify/require" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/venus-shared/chain/params" "github.com/filecoin-project/venus/venus-shared/testutil" ) @@ -17,6 +20,11 @@ func TestElectionProofBasic(t *testing.T) { for i := 0; i < 32; i++ { var src, dst ElectionProof + var power abi.StoragePower + testutil.Provide(t, &power, testutil.PositiveBigProvider()) + require.True(t, power.GreaterThan(big.Zero()), "positive storage power") + totalPower := BigMul(power, NewInt(7)) + opt := testutil.CborErBasicTestOptions{ Buf: &buf, Prepare: func() { @@ -37,6 +45,10 @@ func TestElectionProofBasic(t *testing.T) { Finished: func() { require.Equal(t, src, dst, "from src to dst through cbor") + winCount := src.ComputeWinCount(power, totalPower) + require.GreaterOrEqual(t, winCount, int64(0), "win count >=0") + require.LessOrEqual(t, winCount, params.MaxWinCount, "win count <= MaxWinCount") + require.Equal(t, winCount, dst.ComputeWinCount(power, totalPower)) t1, t2 := Ticket{ VRFProof: src.VRFProof, @@ -90,6 +102,7 @@ func TestTicketBasic(t *testing.T) { require.True(t, t1.Compare(&t2) == 0, "ticket equal") require.Equal(t, t1.Quality(), t2.Quality()) + require.Equal(t, t1.String(), t2.String(), "ticket string") testutil.Provide(t, &another, testutil.BytesFixedProvider(vrfLen)) require.Len(t, another.VRFProof, vrfLen, "vrf length") diff --git a/venus-shared/chain/tipset_marshal_test.go b/venus-shared/chain/tipset_marshal_test.go new file mode 100644 index 0000000000..cd14b1e73e --- /dev/null +++ b/venus-shared/chain/tipset_marshal_test.go @@ -0,0 +1,75 @@ +package chain + +import ( + "bytes" + "encoding/json" + "testing" + + "github.com/filecoin-project/venus/venus-shared/testutil" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func checkForTipSetEqual(t *testing.T, a, b *TipSet) { + require.True(t, a.Equals(b)) + require.Equal(t, a.Len(), b.Len(), "Len equals") + require.Equal(t, a.Cids(), b.Cids(), "Cids equals") + require.Equal(t, a.MinTimestamp(), b.MinTimestamp(), "MinTimestamp equals") + require.Equal(t, a.ParentState(), b.ParentState(), "ParentState equals") + require.Equal(t, a.String(), b.String(), "String equals") + require.Equal(t, a.MinTicketBlock(), b.MinTicketBlock(), "MinTicketBlock equals") + require.Equal(t, a.MinTicket(), b.MinTicket(), "MinTicket equals") +} + +func TestTipSetMarshalJSON(t *testing.T) { + height, paretns, weight := constructTipSetKeyInfos(t) + ts := constructTipSet(t, height, paretns, weight) + + data, err := json.Marshal(ts) + require.NoError(t, err, "json mahrshal for TipSet") + + var dst TipSet + err = json.Unmarshal(data, &dst) + require.NoError(t, err, "json unmarshal for TipSet") + + checkForTipSetEqual(t, ts, &dst) +} + +func TestTipSetEquals(t *testing.T) { + height, paretns, weight := constructTipSetKeyInfos(t) + ts := constructTipSet(t, height, paretns, weight) + + assert.True(t, (*TipSet)(nil).Equals(nil), "nil tipset equals") + assert.False(t, ts.Equals(nil), "non-nil is always != nil") +} + +func TestTipSetBasic(t *testing.T) { + var buf bytes.Buffer + + for i := 0; i < 32; i++ { + height, paretns, weight := constructTipSetKeyInfos(t) + ts := constructTipSet(t, height, paretns, weight) + + var src, dst TipSet + + opts := testutil.CborErBasicTestOptions{ + Buf: &buf, + + Provided: func() { + // all fields in TipSet are private, so we assign the value manually + src = *ts + require.NotEqual(t, src, dst, "src provided") + }, + + Finished: func() { + require.Equal(t, src, dst, "struct equals") + checkForTipSetEqual(t, &src, &dst) + + src.height++ + require.False(t, src.Equals(&dst), "height matters in TipSet.Equals") + }, + } + + testutil.CborErBasicTest(t, &src, &dst, opts) + } +} diff --git a/venus-shared/chain/tipset_test.go b/venus-shared/chain/tipset_test.go index d664331ddc..25379d337a 100644 --- a/venus-shared/chain/tipset_test.go +++ b/venus-shared/chain/tipset_test.go @@ -68,7 +68,8 @@ func constructTipSet(t *testing.T, height abi.ChainEpoch, parents []cid.Cid, par testutil.Provide(t, &blkNum, testutil.IntRangedProvider(minBlockHeaderNumForTest, maxBlockHeaderNumForTest)) var bhs []*BlockHeader - testutil.Provide(t, &bhs, testutil.WithSliceLen(blkNum)) + // use a max-int-limit of 1<<48 to prevent digit precision problem in json + testutil.Provide(t, &bhs, testutil.WithSliceLen(blkNum), testutil.IntRangedProvider(0, 1<<48)) require.GreaterOrEqual(t, len(bhs), minBlockHeaderNumForTest) require.Less(t, len(bhs), maxBlockHeaderNumForTest) @@ -115,4 +116,5 @@ func TestTipSetMethods(t *testing.T) { child := constructTipSet(t, height+1, tsk.Cids(), BigMul(parentWeight, NewInt(2))) require.True(t, child.IsChildOf(ts), "check if is child") + require.Equal(t, tsk.Cids(), child.Parents().Cids(), "child.Parents() == parent.Cids()") } From 03703e591b5c1867cbe818d59a61ed12ebfa3da7 Mon Sep 17 00:00:00 2001 From: dtynn Date: Thu, 18 Nov 2021 17:39:33 +0800 Subject: [PATCH 024/167] feat: add tests for PaddedPieceSize / UnpaddedPieceSize --- .../testutil/value_provdier_chain_test.go | 27 +++++++++++++++++++ venus-shared/testutil/value_provider_chain.go | 25 +++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/venus-shared/testutil/value_provdier_chain_test.go b/venus-shared/testutil/value_provdier_chain_test.go index 626ba79a30..e3826d51ca 100644 --- a/venus-shared/testutil/value_provdier_chain_test.go +++ b/venus-shared/testutil/value_provdier_chain_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/crypto" "github.com/ipfs/go-cid" @@ -89,3 +90,29 @@ func TestDefaultSigTypes(t *testing.T) { require.True(t, len(typs) == 2) } + +func TestDefaultPaddedSize(t *testing.T) { + psizes := make([]abi.PaddedPieceSize, 32) + Provide(t, &psizes) + for i := range psizes { + require.NoErrorf(t, psizes[i].Validate(), "invalid padded size %d", psizes[i]) + } +} + +func TestFixedPaddedSize(t *testing.T) { + shifts := make([]int, 32) + Provide(t, &shifts, IntRangedProvider(1, 50)) + for si := range shifts { + var ps abi.PaddedPieceSize + Provide(t, &ps, PaddedSizeFixedProvider(128< Date: Thu, 18 Nov 2021 18:23:29 +0800 Subject: [PATCH 025/167] feat: add tests for hello types --- Makefile | 2 +- venus-shared/libp2p/hello/hello_test.go | 78 +++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 venus-shared/libp2p/hello/hello_test.go diff --git a/Makefile b/Makefile index afe3450877..65023f7144 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,6 @@ cborgen: cd venus-devtool && go run ./cborgen/*.go test-venus-shared: - cd venus-shared && go test -v -covermode=set ./... + cd venus-shared && go test -covermode=set ./... test: test-venus-shared diff --git a/venus-shared/libp2p/hello/hello_test.go b/venus-shared/libp2p/hello/hello_test.go new file mode 100644 index 0000000000..717e2827ad --- /dev/null +++ b/venus-shared/libp2p/hello/hello_test.go @@ -0,0 +1,78 @@ +package hello + +import ( + "bytes" + "testing" + + "github.com/ipfs/go-cid" + "github.com/stretchr/testify/require" + + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/venus-shared/testutil" +) + +func TestGreetingMessage(t *testing.T) { + var buf bytes.Buffer + sliceLen := 5 + + for i := 0; i < 32; i++ { + var src, dst GreetingMessage + + opt := testutil.CborErBasicTestOptions{ + Buf: &buf, + Prepare: func() { + require.Equal(t, src, dst, "empty values") + }, + + ProvideOpts: []interface{}{ + testutil.WithSliceLen(sliceLen), + testutil.PositiveBigProvider(), + }, + + Provided: func() { + require.Len(t, src.HeaviestTipSet, sliceLen, "HeaviestTipSet length") + require.True(t, src.HeaviestTipSetWeight.GreaterThan(big.Zero()), "positive HeaviestTipSetWeight") + require.NotEqual(t, src.GenesisHash, cid.Undef, "GenesisHash") + }, + + Finished: func() { + require.Equal(t, src, dst, "from src to dst through cbor") + }, + } + + testutil.CborErBasicTest(t, &src, &dst, opt) + } +} + +func TestLatencyMessage(t *testing.T) { + var buf bytes.Buffer + + for i := 0; i < 32; i++ { + var src, dst LatencyMessage + + opt := testutil.CborErBasicTestOptions{ + Buf: &buf, + Prepare: func() { + require.Equal(t, src, dst, "empty values") + }, + + ProvideOpts: []interface{}{ + testutil.IntRangedProvider(100, 200), + }, + + Provided: func() { + require.GreaterOrEqual(t, src.TArrival, int64(100), "LatencyMessage.TArrival min") + require.Less(t, src.TArrival, int64(200), "LatencyMessage.TArrival max") + + require.GreaterOrEqual(t, src.TSent, int64(100), "LatencyMessage.TSent min") + require.Less(t, src.TSent, int64(200), "LatencyMessage.TSent max") + }, + + Finished: func() { + require.Equal(t, src, dst, "from src to dst through cbor") + }, + } + + testutil.CborErBasicTest(t, &src, &dst, opt) + } +} From 9043f2831c529409e64118a429e191d84363b552 Mon Sep 17 00:00:00 2001 From: dtynn Date: Fri, 19 Nov 2021 13:26:31 +0800 Subject: [PATCH 026/167] fetch templates --- Makefile | 10 + venus-devtool/compatible/actors/main.go | 100 +++ venus-devtool/compatible/actors/render.go | 114 ++++ venus-devtool/compatible/actors/templates.go | 163 +++++ venus-devtool/go.mod | 1 + .../actors/builtin/account/actor.go.template | 66 ++ .../builtin/account/state.sep.go.template | 42 ++ .../actors/builtin/builtin.go.template | 146 +++++ .../actors/builtin/cron/actor.go.template | 44 ++ .../actors/builtin/cron/state.sep.go.template | 37 ++ .../actors/builtin/init/actor.go.template | 91 +++ .../actors/builtin/init/state.sep.go.template | 125 ++++ .../actors/builtin/market/actor.go.template | 206 ++++++ .../builtin/market/state.sep.go.template | 269 ++++++++ .../actors/builtin/miner/actor.go.template | 324 ++++++++++ .../builtin/miner/state.sep.go.template | 594 ++++++++++++++++++ .../actors/builtin/multisig/actor.go.template | 143 +++++ .../builtin/multisig/message.sep.go.template | 148 +++++ .../builtin/multisig/state.sep.go.template | 129 ++++ .../actors/builtin/paych/actor.go.template | 134 ++++ .../builtin/paych/message.sep.go.template | 76 +++ .../builtin/paych/state.sep.go.template | 116 ++++ .../actors/builtin/power/actor.go.template | 109 ++++ .../builtin/power/state.sep.go.template | 203 ++++++ .../actors/builtin/reward/actor.go.template | 85 +++ .../builtin/reward/state.sep.go.template | 115 ++++ .../actors/builtin/system/actor.go.template | 43 ++ .../builtin/system/state.sep.go.template | 37 ++ .../actors/builtin/verifreg/actor.go.template | 77 +++ .../builtin/verifreg/state.sep.go.template | 84 +++ venus-shared/actors/policy/policy.go | 549 ++++++++++++++++ venus-shared/actors/policy/policy.go.template | 337 ++++++++++ .../compatible-checks/actor-template.txt | 27 + 33 files changed, 4744 insertions(+) create mode 100644 venus-devtool/compatible/actors/main.go create mode 100644 venus-devtool/compatible/actors/render.go create mode 100644 venus-devtool/compatible/actors/templates.go create mode 100644 venus-shared/actors/builtin/account/actor.go.template create mode 100644 venus-shared/actors/builtin/account/state.sep.go.template create mode 100644 venus-shared/actors/builtin/builtin.go.template create mode 100644 venus-shared/actors/builtin/cron/actor.go.template create mode 100644 venus-shared/actors/builtin/cron/state.sep.go.template create mode 100644 venus-shared/actors/builtin/init/actor.go.template create mode 100644 venus-shared/actors/builtin/init/state.sep.go.template create mode 100644 venus-shared/actors/builtin/market/actor.go.template create mode 100644 venus-shared/actors/builtin/market/state.sep.go.template create mode 100644 venus-shared/actors/builtin/miner/actor.go.template create mode 100644 venus-shared/actors/builtin/miner/state.sep.go.template create mode 100644 venus-shared/actors/builtin/multisig/actor.go.template create mode 100644 venus-shared/actors/builtin/multisig/message.sep.go.template create mode 100644 venus-shared/actors/builtin/multisig/state.sep.go.template create mode 100644 venus-shared/actors/builtin/paych/actor.go.template create mode 100644 venus-shared/actors/builtin/paych/message.sep.go.template create mode 100644 venus-shared/actors/builtin/paych/state.sep.go.template create mode 100644 venus-shared/actors/builtin/power/actor.go.template create mode 100644 venus-shared/actors/builtin/power/state.sep.go.template create mode 100644 venus-shared/actors/builtin/reward/actor.go.template create mode 100644 venus-shared/actors/builtin/reward/state.sep.go.template create mode 100644 venus-shared/actors/builtin/system/actor.go.template create mode 100644 venus-shared/actors/builtin/system/state.sep.go.template create mode 100644 venus-shared/actors/builtin/verifreg/actor.go.template create mode 100644 venus-shared/actors/builtin/verifreg/state.sep.go.template create mode 100644 venus-shared/actors/policy/policy.go create mode 100644 venus-shared/actors/policy/policy.go.template create mode 100644 venus-shared/compatible-checks/actor-template.txt diff --git a/Makefile b/Makefile index 65023f7144..a1c844e5d5 100644 --- a/Makefile +++ b/Makefile @@ -5,3 +5,13 @@ test-venus-shared: cd venus-shared && go test -covermode=set ./... test: test-venus-shared + +compatible-all: compatible-actor + +compatible-actor: actor-template actor-render + +actor-template: + cd venus-devtool && go run ./compatible/actors/*.go templates --dst ../venus-shared/actors/ > ../venus-shared/compatible-checks/actor-template.txt + +actor-render: + cd venus-devtool && go run ./compatible/actors/*.go render ../venus-shared/actors/ diff --git a/venus-devtool/compatible/actors/main.go b/venus-devtool/compatible/actors/main.go new file mode 100644 index 0000000000..d421a5b281 --- /dev/null +++ b/venus-devtool/compatible/actors/main.go @@ -0,0 +1,100 @@ +package main + +import ( + "fmt" + "log" + "os" + "path/filepath" + + "github.com/urfave/cli/v2" +) + +func main() { + app := &cli.App{ + Name: "actors", + Usage: "devtool for template compatible checks between lotus & venus", + EnableBashCompletion: true, + Flags: []cli.Flag{}, + Commands: []*cli.Command{ + templatesCmd, + renderCmd, + }, + } + + app.Setup() + + if err := app.Run(os.Args); err != nil { + fmt.Fprintf(os.Stderr, "ERR: %v\n", err) // nolint: errcheck + } +} + +var templatesCmd = &cli.Command{ + Name: "templates", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "dst", + Value: "", + }, + }, + Action: func(c *cli.Context) error { + srcDir, paths, err := listTemplates() + if err != nil { + return err + } + + log.Println("listing") + + fmt.Println("TEMPLATES IN chain/actors:") + + for _, p := range paths { + fmt.Printf("\t%s\n", p) + } + + dstDir := c.String("dst") + if dstDir == "" { + return nil + } + + log.Println("fetching") + + dstAbs, err := filepath.Abs(dstDir) + if err != nil { + return fmt.Errorf("get absolute dst path for %s: %w", dstDir, err) + } + + return fetch(srcDir, dstAbs, paths) + }, +} + +var renderCmd = &cli.Command{ + Name: "render", + ArgsUsage: "[dir]", + Action: func(cctx *cli.Context) error { + dir := cctx.Args().First() + if dir == "" { + return fmt.Errorf("dir is required") + } + + abs, err := filepath.Abs(dir) + if err != nil { + return fmt.Errorf("get abs path for %s: %w", dir, err) + } + + templates, err := listTemplateInDir(abs) + if err != nil { + return fmt.Errorf("list templates in %s: %w", abs, err) + } + + log.Print("rendering") + for _, tpath := range templates { + err = render(filepath.Join(abs, tpath)) + if err != nil { + return fmt.Errorf("for %s: %w", tpath, err) + } + + log.Printf("%s done", tpath) + } + + return nil + }, +} diff --git a/venus-devtool/compatible/actors/render.go b/venus-devtool/compatible/actors/render.go new file mode 100644 index 0000000000..60976629d8 --- /dev/null +++ b/venus-devtool/compatible/actors/render.go @@ -0,0 +1,114 @@ +package main + +import ( + "bytes" + "fmt" + "go/format" + "os" + "path/filepath" + "strings" + "text/template" + + "github.com/filecoin-project/lotus/chain/actors" +) + +func importPath(v int) string { + if v == 0 { + return "/" + } + + return fmt.Sprintf("/v%d/", v) +} + +func render(tpath string) error { + dir := filepath.Dir(tpath) + fname := filepath.Base(tpath) + + data, err := os.ReadFile(tpath) + if err != nil { + return fmt.Errorf("read file content: %w", err) + } + + var tname string + separated := false + if strings.HasSuffix(fname, separatedGoTemplateExt) { + tname = fname[:len(fname)-separatedGoTemplateExtLen] + separated = true + } else { + tname = fname[:len(fname)-goTemplateExtLen] + } + + funcMap := template.FuncMap{} + if !separated { + funcMap["import"] = importPath + } + + t, err := template.New(tname).Funcs(funcMap).Parse(string(data)) + if err != nil { + return fmt.Errorf("parse template: %w", err) + } + + if separated { + err = renderSeparated(t, dir) + } else { + err = renderSingle(t, dir) + } + + if err != nil { + return err + } + + return nil +} + +func renderSingle(t *template.Template, dir string) error { + var buf bytes.Buffer + err := t.Execute(&buf, map[string]interface{}{ + "versions": actors.Versions, + "latestVersion": actors.LatestVersion, + }) + + if err != nil { + return fmt.Errorf("render single template: %w", err) + } + + formatted, err := format.Source(buf.Bytes()) + if err != nil { + return fmt.Errorf("format go source file: %w", err) + } + + err = os.WriteFile(filepath.Join(dir, t.Name()+".go"), formatted, 0644) + if err != nil { + return fmt.Errorf("write to file: %w", err) + } + + return nil +} + +func renderSeparated(t *template.Template, dir string) error { + var buf bytes.Buffer + for _, v := range actors.Versions { + buf.Reset() + + err := t.Execute(&buf, map[string]interface{}{ + "v": v, + "import": importPath(v), + }) + + if err != nil { + return fmt.Errorf("render separated template for ver %d: %w", v, err) + } + + formatted, err := format.Source(buf.Bytes()) + if err != nil { + return fmt.Errorf("format go source file for ver %d: %w", v, err) + } + + err = os.WriteFile(filepath.Join(dir, fmt.Sprintf("%s.v%d.go", t.Name(), v)), formatted, 0644) + if err != nil { + return fmt.Errorf("write to file for ver %d: %w", v, err) + } + } + + return nil +} diff --git a/venus-devtool/compatible/actors/templates.go b/venus-devtool/compatible/actors/templates.go new file mode 100644 index 0000000000..b1efea44c2 --- /dev/null +++ b/venus-devtool/compatible/actors/templates.go @@ -0,0 +1,163 @@ +package main + +import ( + "bytes" + "fmt" + "go/build" + "io" + "io/fs" + "log" + "os" + "path/filepath" + "sort" + "strings" +) + +const ( + goTemplateExt = ".go.template" + goTemplateExtLen = len(goTemplateExt) + + separatedGoTemplateExt = ".sep.go.template" + separatedGoTemplateExtLen = len(separatedGoTemplateExt) +) + +var separatedSuffixes = []string{ + "state.go.template", + "message.go.template", +} + +var replacers = [][2]string{ + { + "\"github.com/filecoin-project/lotus/chain/types\"", + "types \"github.com/filecoin-project/venus/venus-shared/chain\"", + }, + { + "github.com/filecoin-project/lotus/chain/actors", + "github.com/filecoin-project/venus/venus-shared/actors", + }, + { + "\"github.com/filecoin-project/lotus/node/modules/dtypes\"", + "", + }, + { + "dtypes.NetworkName", + "string", + }, +} + +func listTemplates() (string, []string, error) { + pkg, err := build.Import("github.com/filecoin-project/lotus/chain/actors", ".", build.FindOnly) + if err != nil { + return "", nil, fmt.Errorf("find local build path for louts: %w", err) + } + + paths, err := listTemplateInDir(pkg.Dir) + if err != nil { + return "", nil, fmt.Errorf("list template in dir %s: %w", pkg.Dir, err) + } + + return pkg.Dir, paths, nil +} + +func listTemplateInDir(dir string) ([]string, error) { + var paths []string + + err := fs.WalkDir(os.DirFS(dir), ".", func(path string, d fs.DirEntry, err error) error { + if err != nil { + return fmt.Errorf("walking %s: %w", path, err) + } + + if d.IsDir() { + return nil + } + + if !strings.HasSuffix(path, goTemplateExt) { + return nil + } + + paths = append(paths, path) + return nil + }) + + if err != nil { + return nil, fmt.Errorf("walk through the chain/actors subdir: %w", err) + } + + sort.Strings(paths) + return paths, nil +} + +func fetch(src, dst string, paths []string) error { + err := os.MkdirAll(dst, 0755) + if err != nil { + return fmt.Errorf("mkdir-all for %s: %w", dst, err) + } + + for _, rel := range paths { + if err := fetchOne(src, dst, rel); err != nil { + return fmt.Errorf("fetch template for %s: %w", rel, err) + } + + log.Printf("\t%s done", rel) + } + + return nil +} + +func fetchOne(srcDir, dstDir string, rel string) error { + dstRel := rel + for _, suffix := range separatedSuffixes { + if strings.HasSuffix(rel, suffix) { + dstRel = strings.ReplaceAll(rel, goTemplateExt, separatedGoTemplateExt) + break + } + } + + fsrc, err := os.Open(filepath.Join(srcDir, rel)) + if err != nil { + return fmt.Errorf("open source file: %w", err) + } + + defer fsrc.Close() // nolint: errcheck + + dstPath := filepath.Join(dstDir, dstRel) + err = os.MkdirAll(filepath.Dir(dstPath), 0755) + if err != nil { + return fmt.Errorf("mkdir for %s: %w", dstPath, err) + } + + fdst, err := os.OpenFile(dstPath, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0644) + if err != nil { + return fmt.Errorf("open dst file: %w", err) + } + + defer fdst.Close() // nolint: errcheck + + var buf bytes.Buffer + + if _, err := buf.WriteString(fmt.Sprintf("// FETCHED FROM LOTUS: %s\n\n", rel)); err != nil { + return fmt.Errorf("write file header: %w", err) + } + + _, err = io.Copy(&buf, fsrc) + if err != nil { + return fmt.Errorf("copy to buffer: %w", err) + } + + data := buf.Bytes() + for _, replacer := range replacers { + data = bytes.ReplaceAll(data, []byte(replacer[0]), []byte(replacer[1])) + } + + _, err = io.Copy(fdst, bytes.NewReader(data)) + if err != nil { + return fmt.Errorf("copy to dst file: %w", err) + } + + err = fdst.Sync() + if err != nil { + return fmt.Errorf("dst file sync: %w", err) + } + + return nil +} diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index 67f6ff366f..5a32bf1349 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -5,6 +5,7 @@ go 1.16 require ( github.com/filecoin-project/lotus v1.12.0 github.com/filecoin-project/venus/venus-shared v0.0.1 + github.com/urfave/cli/v2 v2.2.0 // indirect github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 ) diff --git a/venus-shared/actors/builtin/account/actor.go.template b/venus-shared/actors/builtin/account/actor.go.template new file mode 100644 index 0000000000..baf5e19a4b --- /dev/null +++ b/venus-shared/actors/builtin/account/actor.go.template @@ -0,0 +1,66 @@ +// FETCHED FROM LOTUS: builtin/account/actor.go.template + +package account + +import ( + "github.com/filecoin-project/venus/venus-shared/actors" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/cbor" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" +{{range .versions}} + builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" +{{end}} +) + +func init() { +{{range .versions}} + builtin.RegisterActorState(builtin{{.}}.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) +{{end}}} + +var Methods = builtin4.MethodsAccount + +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { +{{range .versions}} + case builtin{{.}}.AccountActorCodeID: + return load{{.}}(store, act.Head) +{{end}} + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return make{{.}}(store, addr) +{{end}} +} + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return builtin{{.}}.AccountActorCodeID, nil +{{end}} + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + cbor.Marshaler + + PubkeyAddress() (address.Address, error) + GetState() interface{} +} diff --git a/venus-shared/actors/builtin/account/state.sep.go.template b/venus-shared/actors/builtin/account/state.sep.go.template new file mode 100644 index 0000000000..b678fe3f2a --- /dev/null +++ b/venus-shared/actors/builtin/account/state.sep.go.template @@ -0,0 +1,42 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + +package account + +import ( + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + account{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/account" +) + +var _ State = (*state{{.v}})(nil) + +func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { + out := state{{.v}}{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make{{.v}}(store adt.Store, addr address.Address) (State, error) { + out := state{{.v}}{store: store} + out.State = account{{.v}}.State{Address:addr} + return &out, nil +} + +type state{{.v}} struct { + account{{.v}}.State + store adt.Store +} + +func (s *state{{.v}}) PubkeyAddress() (address.Address, error) { + return s.Address, nil +} + +func (s *state{{.v}}) GetState() interface{} { + return &s.State +} \ No newline at end of file diff --git a/venus-shared/actors/builtin/builtin.go.template b/venus-shared/actors/builtin/builtin.go.template new file mode 100644 index 0000000000..95a7a22426 --- /dev/null +++ b/venus-shared/actors/builtin/builtin.go.template @@ -0,0 +1,146 @@ +// FETCHED FROM LOTUS: builtin/builtin.go.template + +package builtin + +import ( + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + "golang.org/x/xerrors" + + {{range .versions}} + builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" + smoothing{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/util/smoothing" + {{end}} + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/cbor" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + types "github.com/filecoin-project/venus/venus-shared/chain" + + miner{{.latestVersion}} "github.com/filecoin-project/specs-actors{{import .latestVersion}}actors/builtin/miner" + proof{{.latestVersion}} "github.com/filecoin-project/specs-actors{{import .latestVersion}}actors/runtime/proof" +) + +var SystemActorAddr = builtin{{.latestVersion}}.SystemActorAddr +var BurntFundsActorAddr = builtin{{.latestVersion}}.BurntFundsActorAddr +var CronActorAddr = builtin{{.latestVersion}}.CronActorAddr +var SaftAddress = makeAddress("t0122") +var ReserveAddress = makeAddress("t090") +var RootVerifierAddress = makeAddress("t080") + +var ( + ExpectedLeadersPerEpoch = builtin{{.latestVersion}}.ExpectedLeadersPerEpoch +) + +const ( + EpochDurationSeconds = builtin{{.latestVersion}}.EpochDurationSeconds + EpochsInDay = builtin{{.latestVersion}}.EpochsInDay + SecondsInDay = builtin{{.latestVersion}}.SecondsInDay +) + +const ( + MethodSend = builtin{{.latestVersion}}.MethodSend + MethodConstructor = builtin{{.latestVersion}}.MethodConstructor +) + +// These are all just type aliases across actor versions. In the future, that might change +// and we might need to do something fancier. +type SectorInfo = proof{{.latestVersion}}.SectorInfo +type PoStProof = proof{{.latestVersion}}.PoStProof +type FilterEstimate = smoothing0.FilterEstimate + +func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, verifiedWeight abi.DealWeight) abi.StoragePower { + return miner{{.latestVersion}}.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) +} + +{{range .versions}} + func FromV{{.}}FilterEstimate(v{{.}} smoothing{{.}}.FilterEstimate) FilterEstimate { + {{if (eq . 0)}} + return (FilterEstimate)(v{{.}}) //nolint:unconvert + {{else}} + return (FilterEstimate)(v{{.}}) + {{end}} + } +{{end}} + +type ActorStateLoader func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) + +var ActorStateLoaders = make(map[cid.Cid]ActorStateLoader) + +func RegisterActorState(code cid.Cid, loader ActorStateLoader) { + ActorStateLoaders[code] = loader +} + +func Load(store adt.Store, act *types.Actor) (cbor.Marshaler, error) { + loader, found := ActorStateLoaders[act.Code] + if !found { + return nil, xerrors.Errorf("unknown actor code %s", act.Code) + } + return loader(store, act.Head) +} + +func ActorNameByCode(c cid.Cid) string { + switch { + {{range .versions}} + case builtin{{.}}.IsBuiltinActor(c): + return builtin{{.}}.ActorNameByCode(c) + {{end}} + default: + return "" + } +} + +func IsBuiltinActor(c cid.Cid) bool { + {{range .versions}} + if builtin{{.}}.IsBuiltinActor(c) { + return true + } + {{end}} + return false +} + +func IsAccountActor(c cid.Cid) bool { + {{range .versions}} + if c == builtin{{.}}.AccountActorCodeID { + return true + } + {{end}} + return false +} + +func IsStorageMinerActor(c cid.Cid) bool { + {{range .versions}} + if c == builtin{{.}}.StorageMinerActorCodeID { + return true + } + {{end}} + return false +} + +func IsMultisigActor(c cid.Cid) bool { + {{range .versions}} + if c == builtin{{.}}.MultisigActorCodeID { + return true + } + {{end}} + return false +} + +func IsPaymentChannelActor(c cid.Cid) bool { + {{range .versions}} + if c == builtin{{.}}.PaymentChannelActorCodeID { + return true + } + {{end}} + return false +} + +func makeAddress(addr string) address.Address { + ret, err := address.NewFromString(addr) + if err != nil { + panic(err) + } + + return ret +} diff --git a/venus-shared/actors/builtin/cron/actor.go.template b/venus-shared/actors/builtin/cron/actor.go.template new file mode 100644 index 0000000000..974a0fa561 --- /dev/null +++ b/venus-shared/actors/builtin/cron/actor.go.template @@ -0,0 +1,44 @@ +// FETCHED FROM LOTUS: builtin/cron/actor.go.template + +package cron + +import ( + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "golang.org/x/xerrors" + "github.com/ipfs/go-cid" +{{range .versions}} + builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" +{{end}} +) + +func MakeState(store adt.Store, av actors.Version) (State, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return make{{.}}(store) +{{end}} +} + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return builtin{{.}}.CronActorCodeID, nil +{{end}} + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +var ( + Address = builtin{{.latestVersion}}.CronActorAddr + Methods = builtin{{.latestVersion}}.MethodsCron +) + + +type State interface { + GetState() interface{} +} diff --git a/venus-shared/actors/builtin/cron/state.sep.go.template b/venus-shared/actors/builtin/cron/state.sep.go.template new file mode 100644 index 0000000000..b1e14ce7bf --- /dev/null +++ b/venus-shared/actors/builtin/cron/state.sep.go.template @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + +package cron + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + cron{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/cron" +) + +var _ State = (*state{{.v}})(nil) + +func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { + out := state{{.v}}{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make{{.v}}(store adt.Store) (State, error) { + out := state{{.v}}{store: store} + out.State = *cron{{.v}}.ConstructState(cron{{.v}}.BuiltInEntries()) + return &out, nil +} + +type state{{.v}} struct { + cron{{.v}}.State + store adt.Store +} + +func (s *state{{.v}}) GetState() interface{} { + return &s.State +} \ No newline at end of file diff --git a/venus-shared/actors/builtin/init/actor.go.template b/venus-shared/actors/builtin/init/actor.go.template new file mode 100644 index 0000000000..1e77072aef --- /dev/null +++ b/venus-shared/actors/builtin/init/actor.go.template @@ -0,0 +1,91 @@ +// FETCHED FROM LOTUS: builtin/init/actor.go.template + +package init + +import ( + "github.com/filecoin-project/venus/venus-shared/actors" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/cbor" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" + +{{range .versions}} + builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" +{{end}} +) + +func init() { +{{range .versions}} + builtin.RegisterActorState(builtin{{.}}.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) +{{end}}} + +var ( + Address = builtin{{.latestVersion}}.InitActorAddr + Methods = builtin{{.latestVersion}}.MethodsInit +) + +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { +{{range .versions}} + case builtin{{.}}.InitActorCodeID: + return load{{.}}(store, act.Head) +{{end}} + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version, networkName string) (State, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return make{{.}}(store, networkName) +{{end}} +} + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return builtin{{.}}.InitActorCodeID, nil +{{end}} + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + cbor.Marshaler + + ResolveAddress(address address.Address) (address.Address, bool, error) + MapAddressToNewID(address address.Address) (address.Address, error) + NetworkName() (string, error) + + ForEachActor(func(id abi.ActorID, address address.Address) error) error + + // Remove exists to support tooling that manipulates state for testing. + // It should not be used in production code, as init actor entries are + // immutable. + Remove(addrs ...address.Address) error + + // Sets the network's name. This should only be used on upgrade/fork. + SetNetworkName(name string) error + + // Sets the next ID for the init actor. This should only be used for testing. + SetNextID(id abi.ActorID) error + + // Sets the address map for the init actor. This should only be used for testing. + SetAddressMap(mcid cid.Cid) error + + AddressMap() (adt.Map, error) + GetState() interface{} +} diff --git a/venus-shared/actors/builtin/init/state.sep.go.template b/venus-shared/actors/builtin/init/state.sep.go.template new file mode 100644 index 0000000000..b36e67639e --- /dev/null +++ b/venus-shared/actors/builtin/init/state.sep.go.template @@ -0,0 +1,125 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + +package init + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + +{{if (ge .v 3)}} + builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" +{{end}} + + init{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/init" + adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" +) + +var _ State = (*state{{.v}})(nil) + +func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { + out := state{{.v}}{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make{{.v}}(store adt.Store, networkName string) (State, error) { + out := state{{.v}}{store: store} + {{if (le .v 2)}} + mr, err := adt{{.v}}.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *init{{.v}}.ConstructState(mr, networkName) + {{else}} + s, err := init{{.v}}.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + {{end}} + return &out, nil +} + +type state{{.v}} struct { + init{{.v}}.State + store adt.Store +} + +func (s *state{{.v}}) ResolveAddress(address address.Address) (address.Address, bool, error) { + return s.State.ResolveAddress(s.store, address) +} + +func (s *state{{.v}}) MapAddressToNewID(address address.Address) (address.Address, error) { + return s.State.MapAddressToNewID(s.store, address) +} + +func (s *state{{.v}}) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { + addrs, err := adt{{.v}}.AsMap(s.store, s.State.AddressMap{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) + if err != nil { + return err + } + var actorID cbg.CborInt + return addrs.ForEach(&actorID, func(key string) error { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(abi.ActorID(actorID), addr) + }) +} + +func (s *state{{.v}}) NetworkName() (string, error) { + return string(s.State.NetworkName), nil +} + +func (s *state{{.v}}) SetNetworkName(name string) error { + s.State.NetworkName = name + return nil +} + +func (s *state{{.v}}) SetNextID(id abi.ActorID) error { + s.State.NextID = id + return nil +} + +func (s *state{{.v}}) Remove(addrs ...address.Address) (err error) { + m, err := adt{{.v}}.AsMap(s.store, s.State.AddressMap{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) + if err != nil { + return err + } + for _, addr := range addrs { + if err = m.Delete(abi.AddrKey(addr)); err != nil { + return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) + } + } + amr, err := m.Root() + if err != nil { + return xerrors.Errorf("failed to get address map root: %w", err) + } + s.State.AddressMap = amr + return nil +} + +func (s *state{{.v}}) SetAddressMap(mcid cid.Cid) error { + s.State.AddressMap = mcid + return nil +} + +func (s *state{{.v}}) AddressMap() (adt.Map, error) { + return adt{{.v}}.AsMap(s.store, s.State.AddressMap{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) +} + +func (s *state{{.v}}) GetState() interface{} { + return &s.State +} \ No newline at end of file diff --git a/venus-shared/actors/builtin/market/actor.go.template b/venus-shared/actors/builtin/market/actor.go.template new file mode 100644 index 0000000000..06db86f169 --- /dev/null +++ b/venus-shared/actors/builtin/market/actor.go.template @@ -0,0 +1,206 @@ +// FETCHED FROM LOTUS: builtin/market/actor.go.template + +package market + +import ( + "github.com/filecoin-project/go-state-types/network" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/cbor" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" +{{range .versions}} + builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" +{{end}} + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +func init() { +{{range .versions}} + builtin.RegisterActorState(builtin{{.}}.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) +{{end}}} + +var ( + Address = builtin{{.latestVersion}}.StorageMarketActorAddr + Methods = builtin{{.latestVersion}}.MethodsMarket +) + +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { +{{range .versions}} + case builtin{{.}}.StorageMarketActorCodeID: + return load{{.}}(store, act.Head) +{{end}} + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version) (State, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return make{{.}}(store) +{{end}} +} + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return builtin{{.}}.StorageMarketActorCodeID, nil +{{end}} + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + cbor.Marshaler + BalancesChanged(State) (bool, error) + EscrowTable() (BalanceTable, error) + LockedTable() (BalanceTable, error) + TotalLocked() (abi.TokenAmount, error) + StatesChanged(State) (bool, error) + States() (DealStates, error) + ProposalsChanged(State) (bool, error) + Proposals() (DealProposals, error) + VerifyDealsForActivation( + minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, + ) (weight, verifiedWeight abi.DealWeight, err error) + NextID() (abi.DealID, error) + GetState() interface{} +} + +type BalanceTable interface { + ForEach(cb func(address.Address, abi.TokenAmount) error) error + Get(key address.Address) (abi.TokenAmount, error) +} + +type DealStates interface { + ForEach(cb func(id abi.DealID, ds DealState) error) error + Get(id abi.DealID) (*DealState, bool, error) + + array() adt.Array + decode(*cbg.Deferred) (*DealState, error) +} + +type DealProposals interface { + ForEach(cb func(id abi.DealID, dp DealProposal) error) error + Get(id abi.DealID) (*DealProposal, bool, error) + + array() adt.Array + decode(*cbg.Deferred) (*DealProposal, error) +} + +type PublishStorageDealsParams = market0.PublishStorageDealsParams + +type PublishStorageDealsReturn interface { + DealIDs() ([]abi.DealID, error) + // Note that this index is based on the batch of deals that were published, NOT the DealID + IsDealValid(index uint64) (bool, error) +} + +func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStorageDealsReturn, error) { + av, err := actors.VersionForNetwork(nv) + if err != nil { + return nil, err + } + + switch av { +{{range .versions}} + case actors.Version{{.}}: + return decodePublishStorageDealsReturn{{.}}(b) +{{end}} +} + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +type VerifyDealsForActivationParams = market0.VerifyDealsForActivationParams +type WithdrawBalanceParams = market0.WithdrawBalanceParams + +type ClientDealProposal = market0.ClientDealProposal + +type DealState struct { + SectorStartEpoch abi.ChainEpoch // -1 if not yet included in proven sector + LastUpdatedEpoch abi.ChainEpoch // -1 if deal state never updated + SlashEpoch abi.ChainEpoch // -1 if deal never slashed +} + +type DealProposal struct { + PieceCID cid.Cid + PieceSize abi.PaddedPieceSize + VerifiedDeal bool + Client address.Address + Provider address.Address + Label string + StartEpoch abi.ChainEpoch + EndEpoch abi.ChainEpoch + StoragePricePerEpoch abi.TokenAmount + ProviderCollateral abi.TokenAmount + ClientCollateral abi.TokenAmount +} + +type DealStateChanges struct { + Added []DealIDState + Modified []DealStateChange + Removed []DealIDState +} + +type DealIDState struct { + ID abi.DealID + Deal DealState +} + +// DealStateChange is a change in deal state from -> to +type DealStateChange struct { + ID abi.DealID + From *DealState + To *DealState +} + +type DealProposalChanges struct { + Added []ProposalIDState + Removed []ProposalIDState +} + +type ProposalIDState struct { + ID abi.DealID + Proposal DealProposal +} + +func EmptyDealState() *DealState { + return &DealState{ + SectorStartEpoch: -1, + SlashEpoch: -1, + LastUpdatedEpoch: -1, + } +} + +// returns the earned fees and pending fees for a given deal +func (deal DealProposal) GetDealFees(height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) { + tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch))) + + ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch))) + if ef.LessThan(big.Zero()) { + ef = big.Zero() + } + + if ef.GreaterThan(tf) { + ef = tf + } + + return ef, big.Sub(tf, ef) +} diff --git a/venus-shared/actors/builtin/market/state.sep.go.template b/venus-shared/actors/builtin/market/state.sep.go.template new file mode 100644 index 0000000000..cb4dabb5d5 --- /dev/null +++ b/venus-shared/actors/builtin/market/state.sep.go.template @@ -0,0 +1,269 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + +package market + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + types "github.com/filecoin-project/venus/venus-shared/chain" + + market{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/market" + adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" +) + +var _ State = (*state{{.v}})(nil) + +func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { + out := state{{.v}}{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make{{.v}}(store adt.Store) (State, error) { + out := state{{.v}}{store: store} + {{if (le .v 2)}} + ea, err := adt{{.v}}.MakeEmptyArray(store).Root() + if err != nil { + return nil, err + } + + em, err := adt{{.v}}.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *market{{.v}}.ConstructState(ea, em, em) + {{else}} + s, err := market{{.v}}.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + {{end}} + return &out, nil +} + +type state{{.v}} struct { + market{{.v}}.State + store adt.Store +} + +func (s *state{{.v}}) TotalLocked() (abi.TokenAmount, error) { + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) + return fml, nil +} + +func (s *state{{.v}}) BalancesChanged(otherState State) (bool, error) { + otherState{{.v}}, ok := otherState.(*state{{.v}}) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.EscrowTable.Equals(otherState{{.v}}.State.EscrowTable) || !s.State.LockedTable.Equals(otherState{{.v}}.State.LockedTable), nil +} + +func (s *state{{.v}}) StatesChanged(otherState State) (bool, error) { + otherState{{.v}}, ok := otherState.(*state{{.v}}) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.States.Equals(otherState{{.v}}.State.States), nil +} + +func (s *state{{.v}}) States() (DealStates, error) { + stateArray, err := adt{{.v}}.AsArray(s.store, s.State.States{{if (ge .v 3)}}, market{{.v}}.StatesAmtBitwidth{{end}}) + if err != nil { + return nil, err + } + return &dealStates{{.v}}{stateArray}, nil +} + +func (s *state{{.v}}) ProposalsChanged(otherState State) (bool, error) { + otherState{{.v}}, ok := otherState.(*state{{.v}}) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.Proposals.Equals(otherState{{.v}}.State.Proposals), nil +} + +func (s *state{{.v}}) Proposals() (DealProposals, error) { + proposalArray, err := adt{{.v}}.AsArray(s.store, s.State.Proposals{{if (ge .v 3)}}, market{{.v}}.ProposalsAmtBitwidth{{end}}) + if err != nil { + return nil, err + } + return &dealProposals{{.v}}{proposalArray}, nil +} + +func (s *state{{.v}}) EscrowTable() (BalanceTable, error) { + bt, err := adt{{.v}}.AsBalanceTable(s.store, s.State.EscrowTable) + if err != nil { + return nil, err + } + return &balanceTable{{.v}}{bt}, nil +} + +func (s *state{{.v}}) LockedTable() (BalanceTable, error) { + bt, err := adt{{.v}}.AsBalanceTable(s.store, s.State.LockedTable) + if err != nil { + return nil, err + } + return &balanceTable{{.v}}{bt}, nil +} + +func (s *state{{.v}}) VerifyDealsForActivation( + minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, +) (weight, verifiedWeight abi.DealWeight, err error) { + w, vw{{if (ge .v 2)}}, _{{end}}, err := market{{.v}}.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) + return w, vw, err +} + +func (s *state{{.v}}) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + +type balanceTable{{.v}} struct { + *adt{{.v}}.BalanceTable +} + +func (bt *balanceTable{{.v}}) ForEach(cb func(address.Address, abi.TokenAmount) error) error { + asMap := (*adt{{.v}}.Map)(bt.BalanceTable) + var ta abi.TokenAmount + return asMap.ForEach(&ta, func(key string) error { + a, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(a, ta) + }) +} + +type dealStates{{.v}} struct { + adt.Array +} + +func (s *dealStates{{.v}}) Get(dealID abi.DealID) (*DealState, bool, error) { + var deal{{.v}} market{{.v}}.DealState + found, err := s.Array.Get(uint64(dealID), &deal{{.v}}) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + deal := fromV{{.v}}DealState(deal{{.v}}) + return &deal, true, nil +} + +func (s *dealStates{{.v}}) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { + var ds{{.v}} market{{.v}}.DealState + return s.Array.ForEach(&ds{{.v}}, func(idx int64) error { + return cb(abi.DealID(idx), fromV{{.v}}DealState(ds{{.v}})) + }) +} + +func (s *dealStates{{.v}}) decode(val *cbg.Deferred) (*DealState, error) { + var ds{{.v}} market{{.v}}.DealState + if err := ds{{.v}}.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + ds := fromV{{.v}}DealState(ds{{.v}}) + return &ds, nil +} + +func (s *dealStates{{.v}}) array() adt.Array { + return s.Array +} + +func fromV{{.v}}DealState(v{{.v}} market{{.v}}.DealState) DealState { + return (DealState)(v{{.v}}) +} + +type dealProposals{{.v}} struct { + adt.Array +} + +func (s *dealProposals{{.v}}) Get(dealID abi.DealID) (*DealProposal, bool, error) { + var proposal{{.v}} market{{.v}}.DealProposal + found, err := s.Array.Get(uint64(dealID), &proposal{{.v}}) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + proposal := fromV{{.v}}DealProposal(proposal{{.v}}) + return &proposal, true, nil +} + +func (s *dealProposals{{.v}}) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { + var dp{{.v}} market{{.v}}.DealProposal + return s.Array.ForEach(&dp{{.v}}, func(idx int64) error { + return cb(abi.DealID(idx), fromV{{.v}}DealProposal(dp{{.v}})) + }) +} + +func (s *dealProposals{{.v}}) decode(val *cbg.Deferred) (*DealProposal, error) { + var dp{{.v}} market{{.v}}.DealProposal + if err := dp{{.v}}.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + dp := fromV{{.v}}DealProposal(dp{{.v}}) + return &dp, nil +} + +func (s *dealProposals{{.v}}) array() adt.Array { + return s.Array +} + +func fromV{{.v}}DealProposal(v{{.v}} market{{.v}}.DealProposal) DealProposal { + return (DealProposal)(v{{.v}}) +} + +func (s *state{{.v}}) GetState() interface{} { + return &s.State +} + +var _ PublishStorageDealsReturn = (*publishStorageDealsReturn{{.v}})(nil) + +func decodePublishStorageDealsReturn{{.v}}(b []byte) (PublishStorageDealsReturn, error) { + var retval market{{.v}}.PublishStorageDealsReturn + if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { + return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) + } + + return &publishStorageDealsReturn{{.v}}{retval}, nil +} + +type publishStorageDealsReturn{{.v}} struct { + market{{.v}}.PublishStorageDealsReturn +} + +func (r *publishStorageDealsReturn{{.v}}) IsDealValid(index uint64) (bool, error) { + {{if (ge .v 6)}} + return r.ValidDeals.IsSet(index) + {{else}} + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + {{end}} +} + +func (r *publishStorageDealsReturn{{.v}}) DealIDs() ([]abi.DealID, error) { + return r.IDs, nil +} diff --git a/venus-shared/actors/builtin/miner/actor.go.template b/venus-shared/actors/builtin/miner/actor.go.template new file mode 100644 index 0000000000..7bf44b7fa9 --- /dev/null +++ b/venus-shared/actors/builtin/miner/actor.go.template @@ -0,0 +1,324 @@ +// FETCHED FROM LOTUS: builtin/miner/actor.go.template + +package miner + +import ( + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/cbor" + "github.com/filecoin-project/go-state-types/dline" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" + + miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" + miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" + miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" + miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" +{{range .versions}} + builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" +{{end}} +) + +func init() { +{{range .versions}} + builtin.RegisterActorState(builtin{{.}}.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) +{{end}} +} + +var Methods = builtin{{.latestVersion}}.MethodsMiner + +// Unchanged between v0, v2, v3, v4, and v5 actors +var WPoStProvingPeriod = miner0.WPoStProvingPeriod +var WPoStPeriodDeadlines = miner0.WPoStPeriodDeadlines +var WPoStChallengeWindow = miner0.WPoStChallengeWindow +var WPoStChallengeLookback = miner0.WPoStChallengeLookback +var FaultDeclarationCutoff = miner0.FaultDeclarationCutoff + +const MinSectorExpiration = miner0.MinSectorExpiration + +// Not used / checked in v0 +// TODO: Abstract over network versions +var DeclarationsMax = miner2.DeclarationsMax +var AddressedSectorsMax = miner2.AddressedSectorsMax + +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { +{{range .versions}} + case builtin{{.}}.StorageMinerActorCodeID: + return load{{.}}(store, act.Head) +{{end}} +} + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version) (State, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return make{{.}}(store) +{{end}} +} + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return builtin{{.}}.StorageMinerActorCodeID, nil +{{end}} + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + cbor.Marshaler + + // Total available balance to spend. + AvailableBalance(abi.TokenAmount) (abi.TokenAmount, error) + // Funds that will vest by the given epoch. + VestedFunds(abi.ChainEpoch) (abi.TokenAmount, error) + // Funds locked for various reasons. + LockedFunds() (LockedFunds, error) + FeeDebt() (abi.TokenAmount, error) + + GetSector(abi.SectorNumber) (*SectorOnChainInfo, error) + FindSector(abi.SectorNumber) (*SectorLocation, error) + GetSectorExpiration(abi.SectorNumber) (*SectorExpiration, error) + GetPrecommittedSector(abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) + ForEachPrecommittedSector(func(SectorPreCommitOnChainInfo) error) error + LoadSectors(sectorNos *bitfield.BitField) ([]*SectorOnChainInfo, error) + NumLiveSectors() (uint64, error) + IsAllocated(abi.SectorNumber) (bool, error) + // UnallocatedSectorNumbers returns up to count unallocated sector numbers (or less than + // count if there aren't enough). + UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) + GetAllocatedSectors() (*bitfield.BitField, error) + + // Note that ProvingPeriodStart is deprecated and will be renamed / removed in a future version of actors + GetProvingPeriodStart() (abi.ChainEpoch, error) + // Testing only + EraseAllUnproven() error + + LoadDeadline(idx uint64) (Deadline, error) + ForEachDeadline(cb func(idx uint64, dl Deadline) error) error + NumDeadlines() (uint64, error) + DeadlinesChanged(State) (bool, error) + + Info() (MinerInfo, error) + MinerInfoChanged(State) (bool, error) + + DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) + DeadlineCronActive() (bool, error) + + // Diff helpers. Used by Diff* functions internally. + sectors() (adt.Array, error) + decodeSectorOnChainInfo(*cbg.Deferred) (SectorOnChainInfo, error) + precommits() (adt.Map, error) + decodeSectorPreCommitOnChainInfo(*cbg.Deferred) (SectorPreCommitOnChainInfo, error) + GetState() interface{} +} + +type Deadline interface { + LoadPartition(idx uint64) (Partition, error) + ForEachPartition(cb func(idx uint64, part Partition) error) error + PartitionsPoSted() (bitfield.BitField, error) + + PartitionsChanged(Deadline) (bool, error) + DisputableProofCount() (uint64, error) +} + +type Partition interface { + // AllSectors returns all sector numbers in this partition, including faulty, unproven, and terminated sectors + AllSectors() (bitfield.BitField, error) + + // Subset of sectors detected/declared faulty and not yet recovered (excl. from PoSt). + // Faults ∩ Terminated = ∅ + FaultySectors() (bitfield.BitField, error) + + // Subset of faulty sectors expected to recover on next PoSt + // Recoveries ∩ Terminated = ∅ + RecoveringSectors() (bitfield.BitField, error) + + // Live sectors are those that are not terminated (but may be faulty). + LiveSectors() (bitfield.BitField, error) + + // Active sectors are those that are neither terminated nor faulty nor unproven, i.e. actively contributing power. + ActiveSectors() (bitfield.BitField, error) + + // Unproven sectors in this partition. This bitfield will be cleared on + // a successful window post (or at the end of the partition's next + // deadline). At that time, any still unproven sectors will be added to + // the faulty sector bitfield. + UnprovenSectors() (bitfield.BitField, error) +} + +type SectorOnChainInfo struct { + SectorNumber abi.SectorNumber + SealProof abi.RegisteredSealProof + SealedCID cid.Cid + DealIDs []abi.DealID + Activation abi.ChainEpoch + Expiration abi.ChainEpoch + DealWeight abi.DealWeight + VerifiedDealWeight abi.DealWeight + InitialPledge abi.TokenAmount + ExpectedDayReward abi.TokenAmount + ExpectedStoragePledge abi.TokenAmount +} + +type SectorPreCommitInfo = miner0.SectorPreCommitInfo + +type SectorPreCommitOnChainInfo struct { + Info SectorPreCommitInfo + PreCommitDeposit abi.TokenAmount + PreCommitEpoch abi.ChainEpoch + DealWeight abi.DealWeight + VerifiedDealWeight abi.DealWeight +} + +type PoStPartition = miner0.PoStPartition +type RecoveryDeclaration = miner0.RecoveryDeclaration +type FaultDeclaration = miner0.FaultDeclaration + +// Params +type DeclareFaultsParams = miner0.DeclareFaultsParams +type DeclareFaultsRecoveredParams = miner0.DeclareFaultsRecoveredParams +type SubmitWindowedPoStParams = miner0.SubmitWindowedPoStParams +type ProveCommitSectorParams = miner0.ProveCommitSectorParams +type DisputeWindowedPoStParams = miner3.DisputeWindowedPoStParams +type ProveCommitAggregateParams = miner5.ProveCommitAggregateParams + +func PreferredSealProofTypeFromWindowPoStType(nver network.Version, proof abi.RegisteredPoStProof) (abi.RegisteredSealProof, error) { + // We added support for the new proofs in network version 7, and removed support for the old + // ones in network version 8. + if nver < network.Version7 { + switch proof { + case abi.RegisteredPoStProof_StackedDrgWindow2KiBV1: + return abi.RegisteredSealProof_StackedDrg2KiBV1, nil + case abi.RegisteredPoStProof_StackedDrgWindow8MiBV1: + return abi.RegisteredSealProof_StackedDrg8MiBV1, nil + case abi.RegisteredPoStProof_StackedDrgWindow512MiBV1: + return abi.RegisteredSealProof_StackedDrg512MiBV1, nil + case abi.RegisteredPoStProof_StackedDrgWindow32GiBV1: + return abi.RegisteredSealProof_StackedDrg32GiBV1, nil + case abi.RegisteredPoStProof_StackedDrgWindow64GiBV1: + return abi.RegisteredSealProof_StackedDrg64GiBV1, nil + default: + return -1, xerrors.Errorf("unrecognized window post type: %d", proof) + } + } + + switch proof { + case abi.RegisteredPoStProof_StackedDrgWindow2KiBV1: + return abi.RegisteredSealProof_StackedDrg2KiBV1_1, nil + case abi.RegisteredPoStProof_StackedDrgWindow8MiBV1: + return abi.RegisteredSealProof_StackedDrg8MiBV1_1, nil + case abi.RegisteredPoStProof_StackedDrgWindow512MiBV1: + return abi.RegisteredSealProof_StackedDrg512MiBV1_1, nil + case abi.RegisteredPoStProof_StackedDrgWindow32GiBV1: + return abi.RegisteredSealProof_StackedDrg32GiBV1_1, nil + case abi.RegisteredPoStProof_StackedDrgWindow64GiBV1: + return abi.RegisteredSealProof_StackedDrg64GiBV1_1, nil + default: + return -1, xerrors.Errorf("unrecognized window post type: %d", proof) + } +} + +func WinningPoStProofTypeFromWindowPoStProofType(nver network.Version, proof abi.RegisteredPoStProof) (abi.RegisteredPoStProof, error) { + switch proof { + case abi.RegisteredPoStProof_StackedDrgWindow2KiBV1: + return abi.RegisteredPoStProof_StackedDrgWinning2KiBV1, nil + case abi.RegisteredPoStProof_StackedDrgWindow8MiBV1: + return abi.RegisteredPoStProof_StackedDrgWinning8MiBV1, nil + case abi.RegisteredPoStProof_StackedDrgWindow512MiBV1: + return abi.RegisteredPoStProof_StackedDrgWinning512MiBV1, nil + case abi.RegisteredPoStProof_StackedDrgWindow32GiBV1: + return abi.RegisteredPoStProof_StackedDrgWinning32GiBV1, nil + case abi.RegisteredPoStProof_StackedDrgWindow64GiBV1: + return abi.RegisteredPoStProof_StackedDrgWinning64GiBV1, nil + default: + return -1, xerrors.Errorf("unknown proof type %d", proof) + } +} + +type MinerInfo struct { + Owner address.Address // Must be an ID-address. + Worker address.Address // Must be an ID-address. + NewWorker address.Address // Must be an ID-address. + ControlAddresses []address.Address // Must be an ID-addresses. + WorkerChangeEpoch abi.ChainEpoch + PeerId *peer.ID + Multiaddrs []abi.Multiaddrs + WindowPoStProofType abi.RegisteredPoStProof + SectorSize abi.SectorSize + WindowPoStPartitionSectors uint64 + ConsensusFaultElapsed abi.ChainEpoch +} + +func (mi MinerInfo) IsController(addr address.Address) bool { + if addr == mi.Owner || addr == mi.Worker { + return true + } + + for _, ca := range mi.ControlAddresses { + if addr == ca { + return true + } + } + + return false +} + +type SectorExpiration struct { + OnTime abi.ChainEpoch + + // non-zero if sector is faulty, epoch at which it will be permanently + // removed if it doesn't recover + Early abi.ChainEpoch +} + +type SectorLocation struct { + Deadline uint64 + Partition uint64 +} + +type SectorChanges struct { + Added []SectorOnChainInfo + Extended []SectorExtensions + Removed []SectorOnChainInfo +} + +type SectorExtensions struct { + From SectorOnChainInfo + To SectorOnChainInfo +} + +type PreCommitChanges struct { + Added []SectorPreCommitOnChainInfo + Removed []SectorPreCommitOnChainInfo +} + +type LockedFunds struct { + VestingFunds abi.TokenAmount + InitialPledgeRequirement abi.TokenAmount + PreCommitDeposits abi.TokenAmount +} + +func (lf LockedFunds) TotalLockedFunds() abi.TokenAmount { + return big.Add(lf.VestingFunds, big.Add(lf.InitialPledgeRequirement, lf.PreCommitDeposits)) +} diff --git a/venus-shared/actors/builtin/miner/state.sep.go.template b/venus-shared/actors/builtin/miner/state.sep.go.template new file mode 100644 index 0000000000..5e8a177c81 --- /dev/null +++ b/venus-shared/actors/builtin/miner/state.sep.go.template @@ -0,0 +1,594 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + +package miner + +import ( + "bytes" + "errors" +{{if (le .v 1)}} + "github.com/filecoin-project/go-state-types/big" +{{end}} + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + +{{if (ge .v 3)}} + builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" +{{end}} + miner{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/miner" + adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" +) + +var _ State = (*state{{.v}})(nil) + +func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { + out := state{{.v}}{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make{{.v}}(store adt.Store) (State, error) { + out := state{{.v}}{store: store} + out.State = miner{{.v}}.State{} + return &out, nil +} + +type state{{.v}} struct { + miner{{.v}}.State + store adt.Store +} + +type deadline{{.v}} struct { + miner{{.v}}.Deadline + store adt.Store +} + +type partition{{.v}} struct { + miner{{.v}}.Partition + store adt.Store +} + +func (s *state{{.v}}) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { + defer func() { + if r := recover(); r != nil { + err = xerrors.Errorf("failed to get available balance: %w", r) + available = abi.NewTokenAmount(0) + } + }() + // this panics if the miner doesnt have enough funds to cover their locked pledge + available{{if (ge .v 2)}}, err{{end}} = s.GetAvailableBalance(bal) + return available, err +} + +func (s *state{{.v}}) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.CheckVestedFunds(s.store, epoch) +} + +func (s *state{{.v}}) LockedFunds() (LockedFunds, error) { + return LockedFunds{ + VestingFunds: s.State.LockedFunds, + InitialPledgeRequirement: s.State.InitialPledge{{if (le .v 1)}}Requirement{{end}}, + PreCommitDeposits: s.State.PreCommitDeposits, + }, nil +} + +func (s *state{{.v}}) FeeDebt() (abi.TokenAmount, error) { + return {{if (ge .v 2)}}s.State.FeeDebt{{else}}big.Zero(){{end}}, nil +} + +func (s *state{{.v}}) InitialPledge() (abi.TokenAmount, error) { + return s.State.InitialPledge{{if (le .v 1)}}Requirement{{end}}, nil +} + +func (s *state{{.v}}) PreCommitDeposits() (abi.TokenAmount, error) { + return s.State.PreCommitDeposits, nil +} + +func (s *state{{.v}}) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { + info, ok, err := s.State.GetSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV{{.v}}SectorOnChainInfo(*info) + return &ret, nil +} + +func (s *state{{.v}}) FindSector(num abi.SectorNumber) (*SectorLocation, error) { + dlIdx, partIdx, err := s.State.FindSector(s.store, num) + if err != nil { + return nil, err + } + return &SectorLocation{ + Deadline: dlIdx, + Partition: partIdx, + }, nil +} + +func (s *state{{.v}}) NumLiveSectors() (uint64, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return 0, err + } + var total uint64 + if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner{{.v}}.Deadline) error { + total += dl.LiveSectors + return nil + }); err != nil { + return 0, err + } + return total, nil +} + +// GetSectorExpiration returns the effective expiration of the given sector. +// +// If the sector does not expire early, the Early expiration field is 0. +func (s *state{{.v}}) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + // NOTE: this can be optimized significantly. + // 1. If the sector is non-faulty, it will either expire on-time (can be + // learned from the sector info), or in the next quantized expiration + // epoch (i.e., the first element in the partition's expiration queue. + // 2. If it's faulty, it will expire early within the first 14 entries + // of the expiration queue. + stopErr := errors.New("stop") + out := SectorExpiration{} + err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner{{.v}}.Deadline) error { + partitions, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + quant := s.State.QuantSpecForDeadline(dlIdx) + var part miner{{.v}}.Partition + return partitions.ForEach(&part, func(partIdx int64) error { + if found, err := part.Sectors.IsSet(uint64(num)); err != nil { + return err + } else if !found { + return nil + } + if found, err := part.Terminated.IsSet(uint64(num)); err != nil { + return err + } else if found { + // already terminated + return stopErr + } + + q, err := miner{{.v}}.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant{{if (ge .v 3)}}, miner{{.v}}.PartitionExpirationAmtBitwidth{{end}}) + if err != nil { + return err + } + var exp miner{{.v}}.ExpirationSet + return q.ForEach(&exp, func(epoch int64) error { + if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { + return err + } else if early { + out.Early = abi.ChainEpoch(epoch) + return nil + } + if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { + return err + } else if onTime { + out.OnTime = abi.ChainEpoch(epoch) + return stopErr + } + return nil + }) + }) + }) + if err == stopErr { + err = nil + } + if err != nil { + return nil, err + } + if out.Early == 0 && out.OnTime == 0 { + return nil, xerrors.Errorf("failed to find sector %d", num) + } + return &out, nil +} + +func (s *state{{.v}}) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { + info, ok, err := s.State.GetPrecommittedSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV{{.v}}SectorPreCommitOnChainInfo(*info) + + return &ret, nil +} + +func (s *state{{.v}}) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { +{{if (ge .v 3) -}} + precommitted, err := adt{{.v}}.AsMap(s.store, s.State.PreCommittedSectors, builtin{{.v}}.DefaultHamtBitwidth) +{{- else -}} + precommitted, err := adt{{.v}}.AsMap(s.store, s.State.PreCommittedSectors) +{{- end}} + if err != nil { + return err + } + + var info miner{{.v}}.SectorPreCommitOnChainInfo + if err := precommitted.ForEach(&info, func(_ string) error { + return cb(fromV{{.v}}SectorPreCommitOnChainInfo(info)) + }); err != nil { + return err + } + + return nil +} + +func (s *state{{.v}}) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { + sectors, err := miner{{.v}}.LoadSectors(s.store, s.State.Sectors) + if err != nil { + return nil, err + } + + // If no sector numbers are specified, load all. + if snos == nil { + infos := make([]*SectorOnChainInfo, 0, sectors.Length()) + var info{{.v}} miner{{.v}}.SectorOnChainInfo + if err := sectors.ForEach(&info{{.v}}, func(_ int64) error { + info := fromV{{.v}}SectorOnChainInfo(info{{.v}}) + infos = append(infos, &info) + return nil + }); err != nil { + return nil, err + } + return infos, nil + } + + // Otherwise, load selected. + infos{{.v}}, err := sectors.Load(*snos) + if err != nil { + return nil, err + } + infos := make([]*SectorOnChainInfo, len(infos{{.v}})) + for i, info{{.v}} := range infos{{.v}} { + info := fromV{{.v}}SectorOnChainInfo(*info{{.v}}) + infos[i] = &info + } + return infos, nil +} + +func (s *state{{.v}}) loadAllocatedSectorNumbers() (bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) + return allocatedSectors, err +} + +func (s *state{{.v}}) IsAllocated(num abi.SectorNumber) (bool, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return false, err + } + + return allocatedSectors.IsSet(uint64(num)) +} + +func (s *state{{.v}}) GetProvingPeriodStart() (abi.ChainEpoch, error) { + return s.State.ProvingPeriodStart, nil +} + +func (s *state{{.v}}) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return nil, err + } + + allocatedRuns, err := allocatedSectors.RunIterator() + if err != nil { + return nil, err + } + + unallocatedRuns, err := rle.Subtract( + &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + allocatedRuns, + ) + if err != nil { + return nil, err + } + + iter, err := rle.BitsFromRuns(unallocatedRuns) + if err != nil { + return nil, err + } + + sectors := make([]abi.SectorNumber, 0, count) + for iter.HasNext() && len(sectors) < count { + nextNo, err := iter.Next() + if err != nil { + return nil, err + } + sectors = append(sectors, abi.SectorNumber(nextNo)) + } + + return sectors, nil +} + +func (s *state{{.v}}) GetAllocatedSectors() (*bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { + return nil, err + } + + return &allocatedSectors, nil +} + +func (s *state{{.v}}) LoadDeadline(idx uint64) (Deadline, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + dl, err := dls.LoadDeadline(s.store, idx) + if err != nil { + return nil, err + } + return &deadline{{.v}}{*dl, s.store}, nil +} + +func (s *state{{.v}}) ForEachDeadline(cb func(uint64, Deadline) error) error { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + return dls.ForEach(s.store, func(i uint64, dl *miner{{.v}}.Deadline) error { + return cb(i, &deadline{{.v}}{*dl, s.store}) + }) +} + +func (s *state{{.v}}) NumDeadlines() (uint64, error) { + return miner{{.v}}.WPoStPeriodDeadlines, nil +} + +func (s *state{{.v}}) DeadlinesChanged(other State) (bool, error) { + other{{.v}}, ok := other.(*state{{.v}}) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !s.State.Deadlines.Equals(other{{.v}}.Deadlines), nil +} + +func (s *state{{.v}}) MinerInfoChanged(other State) (bool, error) { + other0, ok := other.(*state{{.v}}) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Info.Equals(other0.State.Info), nil +} + +func (s *state{{.v}}) Info() (MinerInfo, error) { + info, err := s.State.GetInfo(s.store) + if err != nil { + return MinerInfo{}, err + } + + var pid *peer.ID + if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { + pid = &peerID + } +{{if (le .v 2)}} + wpp, err := info.SealProofType.RegisteredWindowPoStProof() + if err != nil { + return MinerInfo{}, err + } +{{end}} + mi := MinerInfo{ + Owner: info.Owner, + Worker: info.Worker, + ControlAddresses: info.ControlAddresses, + + NewWorker: address.Undef, + WorkerChangeEpoch: -1, + + PeerId: pid, + Multiaddrs: info.Multiaddrs, + WindowPoStProofType: {{if (ge .v 3)}}info.WindowPoStProofType{{else}}wpp{{end}}, + SectorSize: info.SectorSize, + WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, + ConsensusFaultElapsed: {{if (ge .v 2)}}info.ConsensusFaultElapsed{{else}}-1{{end}}, + } + + if info.PendingWorkerKey != nil { + mi.NewWorker = info.PendingWorkerKey.NewWorker + mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt + } + + return mi, nil +} + +func (s *state{{.v}}) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { + return s.State.{{if (ge .v 4)}}Recorded{{end}}DeadlineInfo(epoch), nil +} + +func (s *state{{.v}}) DeadlineCronActive() (bool, error) { + return {{if (ge .v 4)}}s.State.DeadlineCronActive{{else}}true{{end}}, nil{{if (lt .v 4)}} // always active in this version{{end}} +} + +func (s *state{{.v}}) sectors() (adt.Array, error) { + return adt{{.v}}.AsArray(s.store, s.Sectors{{if (ge .v 3)}}, miner{{.v}}.SectorsAmtBitwidth{{end}}) +} + +func (s *state{{.v}}) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { + var si miner{{.v}}.SectorOnChainInfo + err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorOnChainInfo{}, err + } + + return fromV{{.v}}SectorOnChainInfo(si), nil +} + +func (s *state{{.v}}) precommits() (adt.Map, error) { + return adt{{.v}}.AsMap(s.store, s.PreCommittedSectors{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) +} + +func (s *state{{.v}}) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { + var sp miner{{.v}}.SectorPreCommitOnChainInfo + err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorPreCommitOnChainInfo{}, err + } + + return fromV{{.v}}SectorPreCommitOnChainInfo(sp), nil +} + +func (s *state{{.v}}) EraseAllUnproven() error { + {{if (ge .v 2)}} + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner{{.v}}.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner{{.v}}.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + {{else}} + // field doesn't exist until v2 + return nil + {{end}} +} + +func (d *deadline{{.v}}) LoadPartition(idx uint64) (Partition, error) { + p, err := d.Deadline.LoadPartition(d.store, idx) + if err != nil { + return nil, err + } + return &partition{{.v}}{*p, d.store}, nil +} + +func (d *deadline{{.v}}) ForEachPartition(cb func(uint64, Partition) error) error { + ps, err := d.Deadline.PartitionsArray(d.store) + if err != nil { + return err + } + var part miner{{.v}}.Partition + return ps.ForEach(&part, func(i int64) error { + return cb(uint64(i), &partition{{.v}}{part, d.store}) + }) +} + +func (d *deadline{{.v}}) PartitionsChanged(other Deadline) (bool, error) { + other{{.v}}, ok := other.(*deadline{{.v}}) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !d.Deadline.Partitions.Equals(other{{.v}}.Deadline.Partitions), nil +} + +func (d *deadline{{.v}}) PartitionsPoSted() (bitfield.BitField, error) { + return d.Deadline.{{if (ge .v 3)}}PartitionsPoSted{{else}}PostSubmissions{{end}}, nil +} + +func (d *deadline{{.v}}) DisputableProofCount() (uint64, error) { +{{if (ge .v 3)}} + ops, err := d.OptimisticProofsSnapshotArray(d.store) + if err != nil { + return 0, err + } + + return ops.Length(), nil +{{else}} + // field doesn't exist until v3 + return 0, nil +{{end}} +} + +func (p *partition{{.v}}) AllSectors() (bitfield.BitField, error) { + return p.Partition.Sectors, nil +} + +func (p *partition{{.v}}) FaultySectors() (bitfield.BitField, error) { + return p.Partition.Faults, nil +} + +func (p *partition{{.v}}) RecoveringSectors() (bitfield.BitField, error) { + return p.Partition.Recoveries, nil +} + +func (p *partition{{.v}}) UnprovenSectors() (bitfield.BitField, error) { + return {{if (ge .v 2)}}p.Partition.Unproven{{else}}bitfield.New(){{end}}, nil +} + +func fromV{{.v}}SectorOnChainInfo(v{{.v}} miner{{.v}}.SectorOnChainInfo) SectorOnChainInfo { +{{if (ge .v 2)}} + return SectorOnChainInfo{ + SectorNumber: v{{.v}}.SectorNumber, + SealProof: v{{.v}}.SealProof, + SealedCID: v{{.v}}.SealedCID, + DealIDs: v{{.v}}.DealIDs, + Activation: v{{.v}}.Activation, + Expiration: v{{.v}}.Expiration, + DealWeight: v{{.v}}.DealWeight, + VerifiedDealWeight: v{{.v}}.VerifiedDealWeight, + InitialPledge: v{{.v}}.InitialPledge, + ExpectedDayReward: v{{.v}}.ExpectedDayReward, + ExpectedStoragePledge: v{{.v}}.ExpectedStoragePledge, + } +{{else}} + return (SectorOnChainInfo)(v0) +{{end}} +} + +func fromV{{.v}}SectorPreCommitOnChainInfo(v{{.v}} miner{{.v}}.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { +{{if (ge .v 2)}} + return SectorPreCommitOnChainInfo{ + Info: (SectorPreCommitInfo)(v{{.v}}.Info), + PreCommitDeposit: v{{.v}}.PreCommitDeposit, + PreCommitEpoch: v{{.v}}.PreCommitEpoch, + DealWeight: v{{.v}}.DealWeight, + VerifiedDealWeight: v{{.v}}.VerifiedDealWeight, + } +{{else}} + return (SectorPreCommitOnChainInfo)(v0) +{{end}} +} + +func (s *state{{.v}}) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/multisig/actor.go.template b/venus-shared/actors/builtin/multisig/actor.go.template new file mode 100644 index 0000000000..04c9bfaecb --- /dev/null +++ b/venus-shared/actors/builtin/multisig/actor.go.template @@ -0,0 +1,143 @@ +// FETCHED FROM LOTUS: builtin/multisig/actor.go.template + +package multisig + +import ( + "fmt" + + "github.com/minio/blake2b-simd" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/cbor" + "github.com/ipfs/go-cid" + + msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" + msig{{.latestVersion}} "github.com/filecoin-project/specs-actors{{import .latestVersion}}actors/builtin/multisig" +{{range .versions}} + builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" +{{end}} + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +func init() { +{{range .versions}} + builtin.RegisterActorState(builtin{{.}}.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) +{{end}}} + +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { +{{range .versions}} + case builtin{{.}}.MultisigActorCodeID: + return load{{.}}(store, act.Head) +{{end}} + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return make{{.}}(store, signers, threshold, startEpoch, unlockDuration, initialBalance) +{{end}} +} + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return builtin{{.}}.MultisigActorCodeID, nil +{{end}} + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + cbor.Marshaler + + LockedBalance(epoch abi.ChainEpoch) (abi.TokenAmount, error) + StartEpoch() (abi.ChainEpoch, error) + UnlockDuration() (abi.ChainEpoch, error) + InitialBalance() (abi.TokenAmount, error) + Threshold() (uint64, error) + Signers() ([]address.Address, error) + + ForEachPendingTxn(func(id int64, txn Transaction) error) error + PendingTxnChanged(State) (bool, error) + + transactions() (adt.Map, error) + decodeTransaction(val *cbg.Deferred) (Transaction, error) + GetState() interface{} +} + +type Transaction = msig0.Transaction + +var Methods = builtin{{.latestVersion}}.MethodsMultisig + +func Message(version actors.Version, from address.Address) MessageBuilder { + switch version { +{{range .versions}} + case actors.Version{{.}}: + return message{{.}}{{"{"}}{{if (ge . 2)}}message0{from}{{else}}from{{end}}} +{{end}} default: + panic(fmt.Sprintf("unsupported actors version: %d", version)) + } +} + +type MessageBuilder interface { + // Create a new multisig with the specified parameters. + Create(signers []address.Address, threshold uint64, + vestingStart, vestingDuration abi.ChainEpoch, + initialAmount abi.TokenAmount) (*types.Message, error) + + // Propose a transaction to the given multisig. + Propose(msig, target address.Address, amt abi.TokenAmount, + method abi.MethodNum, params []byte) (*types.Message, error) + + // Approve a multisig transaction. The "hash" is optional. + Approve(msig address.Address, txID uint64, hash *ProposalHashData) (*types.Message, error) + + // Cancel a multisig transaction. The "hash" is optional. + Cancel(msig address.Address, txID uint64, hash *ProposalHashData) (*types.Message, error) +} + +// this type is the same between v0 and v2 +type ProposalHashData = msig{{.latestVersion}}.ProposalHashData +type ProposeReturn = msig{{.latestVersion}}.ProposeReturn +type ProposeParams = msig{{.latestVersion}}.ProposeParams +type ApproveReturn = msig{{.latestVersion}}.ApproveReturn + +func txnParams(id uint64, data *ProposalHashData) ([]byte, error) { + params := msig{{.latestVersion}}.TxnIDParams{ID: msig{{.latestVersion}}.TxnID(id)} + if data != nil { + if data.Requester.Protocol() != address.ID { + return nil, xerrors.Errorf("proposer address must be an ID address, was %s", data.Requester) + } + if data.Value.Sign() == -1 { + return nil, xerrors.Errorf("proposal value must be non-negative, was %s", data.Value) + } + if data.To == address.Undef { + return nil, xerrors.Errorf("proposed destination address must be set") + } + pser, err := data.Serialize() + if err != nil { + return nil, err + } + hash := blake2b.Sum256(pser) + params.ProposalHash = hash[:] + } + + return actors.SerializeParams(¶ms) +} diff --git a/venus-shared/actors/builtin/multisig/message.sep.go.template b/venus-shared/actors/builtin/multisig/message.sep.go.template new file mode 100644 index 0000000000..8ccbe91a25 --- /dev/null +++ b/venus-shared/actors/builtin/multisig/message.sep.go.template @@ -0,0 +1,148 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + +package multisig + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" + init{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/init" + multisig{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/multisig" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +type message{{.v}} struct{ {{if (ge .v 2)}}message0{{else}}from address.Address{{end}} } + +func (m message{{.v}}) Create( + signers []address.Address, threshold uint64, + unlockStart, unlockDuration abi.ChainEpoch, + initialAmount abi.TokenAmount, +) (*types.Message, error) { + + lenAddrs := uint64(len(signers)) + + if lenAddrs < threshold { + return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") + } + + if threshold == 0 { + threshold = lenAddrs + } + + if m.from == address.Undef { + return nil, xerrors.Errorf("must provide source address") + } +{{if (le .v 1)}} + if unlockStart != 0 { + return nil, xerrors.Errorf("actors v0 does not support a non-zero vesting start time") + } +{{end}} + // Set up constructor parameters for multisig + msigParams := &multisig{{.v}}.ConstructorParams{ + Signers: signers, + NumApprovalsThreshold: threshold, + UnlockDuration: unlockDuration,{{if (ge .v 2)}} + StartEpoch: unlockStart,{{end}} + } + + enc, actErr := actors.SerializeParams(msigParams) + if actErr != nil { + return nil, actErr + } + + // new actors are created by invoking 'exec' on the init actor with the constructor params + execParams := &init{{.v}}.ExecParams{ + CodeCID: builtin{{.v}}.MultisigActorCodeID, + ConstructorParams: enc, + } + + enc, actErr = actors.SerializeParams(execParams) + if actErr != nil { + return nil, actErr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Method: builtin{{.v}}.MethodsInit.Exec, + Params: enc, + Value: initialAmount, + }, nil +} + +{{if (le .v 1)}} + +func (m message0) Propose(msig, to address.Address, amt abi.TokenAmount, + method abi.MethodNum, params []byte) (*types.Message, error) { + + if msig == address.Undef { + return nil, xerrors.Errorf("must provide a multisig address for proposal") + } + + if to == address.Undef { + return nil, xerrors.Errorf("must provide a target address for proposal") + } + + if amt.Sign() == -1 { + return nil, xerrors.Errorf("must provide a non-negative amount for proposed send") + } + + if m.from == address.Undef { + return nil, xerrors.Errorf("must provide source address") + } + + enc, actErr := actors.SerializeParams(&multisig0.ProposeParams{ + To: to, + Value: amt, + Method: method, + Params: params, + }) + if actErr != nil { + return nil, xerrors.Errorf("failed to serialize parameters: %w", actErr) + } + + return &types.Message{ + To: msig, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin0.MethodsMultisig.Propose, + Params: enc, + }, nil +} + +func (m message0) Approve(msig address.Address, txID uint64, hashData *ProposalHashData) (*types.Message, error) { + enc, err := txnParams(txID, hashData) + if err != nil { + return nil, err + } + + return &types.Message{ + To: msig, + From: m.from, + Value: types.NewInt(0), + Method: builtin0.MethodsMultisig.Approve, + Params: enc, + }, nil +} + +func (m message0) Cancel(msig address.Address, txID uint64, hashData *ProposalHashData) (*types.Message, error) { + enc, err := txnParams(txID, hashData) + if err != nil { + return nil, err + } + + return &types.Message{ + To: msig, + From: m.from, + Value: types.NewInt(0), + Method: builtin0.MethodsMultisig.Cancel, + Params: enc, + }, nil +} +{{end}} diff --git a/venus-shared/actors/builtin/multisig/state.sep.go.template b/venus-shared/actors/builtin/multisig/state.sep.go.template new file mode 100644 index 0000000000..9823c41b78 --- /dev/null +++ b/venus-shared/actors/builtin/multisig/state.sep.go.template @@ -0,0 +1,129 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + +package multisig + +import ( + "bytes" + "encoding/binary" + + adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + +{{if (ge .v 3)}} + builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" +{{end}} + msig{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/multisig" +) + +var _ State = (*state{{.v}})(nil) + +func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { + out := state{{.v}}{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make{{.v}}(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { + out := state{{.v}}{store: store} + out.State = msig{{.v}}.State{} + out.State.Signers = signers + out.State.NumApprovalsThreshold = threshold + out.State.StartEpoch = startEpoch + out.State.UnlockDuration = unlockDuration + out.State.InitialBalance = initialBalance + {{if (le .v 2)}} + em, err := adt{{.v}}.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + {{else}} + em, err := adt{{.v}}.StoreEmptyMap(store, builtin{{.v}}.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + {{end}} + return &out, nil +} + +type state{{.v}} struct { + msig{{.v}}.State + store adt.Store +} + +func (s *state{{.v}}) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil +} + +func (s *state{{.v}}) StartEpoch() (abi.ChainEpoch, error) { + return s.State.StartEpoch, nil +} + +func (s *state{{.v}}) UnlockDuration() (abi.ChainEpoch, error) { + return s.State.UnlockDuration, nil +} + +func (s *state{{.v}}) InitialBalance() (abi.TokenAmount, error) { + return s.State.InitialBalance, nil +} + +func (s *state{{.v}}) Threshold() (uint64, error) { + return s.State.NumApprovalsThreshold, nil +} + +func (s *state{{.v}}) Signers() ([]address.Address, error) { + return s.State.Signers, nil +} + +func (s *state{{.v}}) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { + arr, err := adt{{.v}}.AsMap(s.store, s.State.PendingTxns{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) + if err != nil { + return err + } + var out msig{{.v}}.Transaction + return arr.ForEach(&out, func(key string) error { + txid, n := binary.Varint([]byte(key)) + if n <= 0 { + return xerrors.Errorf("invalid pending transaction key: %v", key) + } + return cb(txid, (Transaction)(out)) //nolint:unconvert + }) +} + +func (s *state{{.v}}) PendingTxnChanged(other State) (bool, error) { + other{{.v}}, ok := other.(*state{{.v}}) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.PendingTxns.Equals(other{{.v}}.PendingTxns), nil +} + +func (s *state{{.v}}) transactions() (adt.Map, error) { + return adt{{.v}}.AsMap(s.store, s.PendingTxns{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) +} + +func (s *state{{.v}}) decodeTransaction(val *cbg.Deferred) (Transaction, error) { + var tx msig{{.v}}.Transaction + if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Transaction{}, err + } + return tx, nil +} + +func (s *state{{.v}}) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/paych/actor.go.template b/venus-shared/actors/builtin/paych/actor.go.template new file mode 100644 index 0000000000..f15c72919d --- /dev/null +++ b/venus-shared/actors/builtin/paych/actor.go.template @@ -0,0 +1,134 @@ +// FETCHED FROM LOTUS: builtin/paych/actor.go.template + +package paych + +import ( + "encoding/base64" + "fmt" + + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + big "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/cbor" + "github.com/ipfs/go-cid" + ipldcbor "github.com/ipfs/go-ipld-cbor" + + paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" +{{range .versions}} + builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" +{{end}} + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +func init() { +{{range .versions}} + builtin.RegisterActorState(builtin{{.}}.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) +{{end}}} + +// Load returns an abstract copy of payment channel state, irregardless of actor version +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { +{{range .versions}} + case builtin{{.}}.PaymentChannelActorCodeID: + return load{{.}}(store, act.Head) +{{end}} + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version) (State, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return make{{.}}(store) +{{end}} +} + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return builtin{{.}}.PaymentChannelActorCodeID, nil +{{end}} + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +// State is an abstract version of payment channel state that works across +// versions +type State interface { + cbor.Marshaler + // Channel owner, who has funded the actor + From() (address.Address, error) + // Recipient of payouts from channel + To() (address.Address, error) + + // Height at which the channel can be `Collected` + SettlingAt() (abi.ChainEpoch, error) + + // Amount successfully redeemed through the payment channel, paid out on `Collect()` + ToSend() (abi.TokenAmount, error) + + // Get total number of lanes + LaneCount() (uint64, error) + + // Iterate lane states + ForEachLaneState(cb func(idx uint64, dl LaneState) error) error + + GetState() interface{} +} + +// LaneState is an abstract copy of the state of a single lane +type LaneState interface { + Redeemed() (big.Int, error) + Nonce() (uint64, error) +} + +type SignedVoucher = paych0.SignedVoucher +type ModVerifyParams = paych0.ModVerifyParams + +// DecodeSignedVoucher decodes base64 encoded signed voucher. +func DecodeSignedVoucher(s string) (*SignedVoucher, error) { + data, err := base64.RawURLEncoding.DecodeString(s) + if err != nil { + return nil, err + } + + var sv SignedVoucher + if err := ipldcbor.DecodeInto(data, &sv); err != nil { + return nil, err + } + + return &sv, nil +} + +var Methods = builtin{{.latestVersion}}.MethodsPaych + +func Message(version actors.Version, from address.Address) MessageBuilder { + switch version { +{{range .versions}} + case actors.Version{{.}}: + return message{{.}}{from} +{{end}} + default: + panic(fmt.Sprintf("unsupported actors version: %d", version)) + } +} + +type MessageBuilder interface { + Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) + Update(paych address.Address, voucher *SignedVoucher, secret []byte) (*types.Message, error) + Settle(paych address.Address) (*types.Message, error) + Collect(paych address.Address) (*types.Message, error) +} diff --git a/venus-shared/actors/builtin/paych/message.sep.go.template b/venus-shared/actors/builtin/paych/message.sep.go.template new file mode 100644 index 0000000000..563e3ef712 --- /dev/null +++ b/venus-shared/actors/builtin/paych/message.sep.go.template @@ -0,0 +1,76 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + +package paych + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" + init{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/init" + paych{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/paych" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +type message{{.v}} struct{ from address.Address } + +func (m message{{.v}}) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych{{.v}}.ConstructorParams{From: m.from, To: to}) + if aerr != nil { + return nil, aerr + } + enc, aerr := actors.SerializeParams(&init{{.v}}.ExecParams{ + CodeCID: builtin{{.v}}.PaymentChannelActorCodeID, + ConstructorParams: params, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Value: initialAmount, + Method: builtin{{.v}}.MethodsInit.Exec, + Params: enc, + }, nil +} + +func (m message{{.v}}) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych{{.v}}.UpdateChannelStateParams{ + Sv: *sv, + Secret: secret, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin{{.v}}.MethodsPaych.UpdateChannelState, + Params: params, + }, nil +} + +func (m message{{.v}}) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin{{.v}}.MethodsPaych.Settle, + }, nil +} + +func (m message{{.v}}) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin{{.v}}.MethodsPaych.Collect, + }, nil +} diff --git a/venus-shared/actors/builtin/paych/state.sep.go.template b/venus-shared/actors/builtin/paych/state.sep.go.template new file mode 100644 index 0000000000..08e4e36b2f --- /dev/null +++ b/venus-shared/actors/builtin/paych/state.sep.go.template @@ -0,0 +1,116 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + +package paych + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + paych{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/paych" + adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" +) + +var _ State = (*state{{.v}})(nil) + +func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { + out := state{{.v}}{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make{{.v}}(store adt.Store) (State, error) { + out := state{{.v}}{store: store} + out.State = paych{{.v}}.State{} + return &out, nil +} + +type state{{.v}} struct { + paych{{.v}}.State + store adt.Store + lsAmt *adt{{.v}}.Array +} + +// Channel owner, who has funded the actor +func (s *state{{.v}}) From() (address.Address, error) { + return s.State.From, nil +} + +// Recipient of payouts from channel +func (s *state{{.v}}) To() (address.Address, error) { + return s.State.To, nil +} + +// Height at which the channel can be `Collected` +func (s *state{{.v}}) SettlingAt() (abi.ChainEpoch, error) { + return s.State.SettlingAt, nil +} + +// Amount successfully redeemed through the payment channel, paid out on `Collect()` +func (s *state{{.v}}) ToSend() (abi.TokenAmount, error) { + return s.State.ToSend, nil +} + +func (s *state{{.v}}) getOrLoadLsAmt() (*adt{{.v}}.Array, error) { + if s.lsAmt != nil { + return s.lsAmt, nil + } + + // Get the lane state from the chain + lsamt, err := adt{{.v}}.AsArray(s.store, s.State.LaneStates{{if (ge .v 3)}}, paych{{.v}}.LaneStatesAmtBitwidth{{end}}) + if err != nil { + return nil, err + } + + s.lsAmt = lsamt + return lsamt, nil +} + +// Get total number of lanes +func (s *state{{.v}}) LaneCount() (uint64, error) { + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return 0, err + } + return lsamt.Length(), nil +} + +func (s *state{{.v}}) GetState() interface{} { + return &s.State +} + +// Iterate lane states +func (s *state{{.v}}) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { + // Get the lane state from the chain + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return err + } + + // Note: we use a map instead of an array to store laneStates because the + // client sets the lane ID (the index) and potentially they could use a + // very large index. + var ls paych{{.v}}.LaneState + return lsamt.ForEach(&ls, func(i int64) error { + return cb(uint64(i), &laneState{{.v}}{ls}) + }) +} + +type laneState{{.v}} struct { + paych{{.v}}.LaneState +} + +func (ls *laneState{{.v}}) Redeemed() (big.Int, error) { + return ls.LaneState.Redeemed, nil +} + +func (ls *laneState{{.v}}) Nonce() (uint64, error) { + return ls.LaneState.Nonce, nil +} diff --git a/venus-shared/actors/builtin/power/actor.go.template b/venus-shared/actors/builtin/power/actor.go.template new file mode 100644 index 0000000000..a35cd67d07 --- /dev/null +++ b/venus-shared/actors/builtin/power/actor.go.template @@ -0,0 +1,109 @@ +// FETCHED FROM LOTUS: builtin/power/actor.go.template + +package power + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/cbor" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" +{{range .versions}} + builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" +{{end}} +) + +func init() { +{{range .versions}} + builtin.RegisterActorState(builtin{{.}}.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) +{{end}}} + +var ( + Address = builtin{{.latestVersion}}.StoragePowerActorAddr + Methods = builtin{{.latestVersion}}.MethodsPower +) + +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { +{{range .versions}} + case builtin{{.}}.StoragePowerActorCodeID: + return load{{.}}(store, act.Head) +{{end}} + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version) (State, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return make{{.}}(store) +{{end}} +} + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return builtin{{.}}.StoragePowerActorCodeID, nil +{{end}} + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + cbor.Marshaler + + TotalLocked() (abi.TokenAmount, error) + TotalPower() (Claim, error) + TotalCommitted() (Claim, error) + TotalPowerSmoothed() (builtin.FilterEstimate, error) + GetState() interface{} + + // MinerCounts returns the number of miners. Participating is the number + // with power above the minimum miner threshold. + MinerCounts() (participating, total uint64, err error) + MinerPower(address.Address) (Claim, bool, error) + MinerNominalPowerMeetsConsensusMinimum(address.Address) (bool, error) + ListAllMiners() ([]address.Address, error) + ForEachClaim(func(miner address.Address, claim Claim) error) error + ClaimsChanged(State) (bool, error) + + // Testing or genesis setup only + SetTotalQualityAdjPower(abi.StoragePower) error + SetTotalRawBytePower(abi.StoragePower) error + SetThisEpochQualityAdjPower(abi.StoragePower) error + SetThisEpochRawBytePower(abi.StoragePower) error + + // Diff helpers. Used by Diff* functions internally. + claims() (adt.Map, error) + decodeClaim(*cbg.Deferred) (Claim, error) +} + +type Claim struct { + // Sum of raw byte power for a miner's sectors. + RawBytePower abi.StoragePower + + // Sum of quality adjusted power for a miner's sectors. + QualityAdjPower abi.StoragePower +} + +func AddClaims(a Claim, b Claim) Claim { + return Claim{ + RawBytePower: big.Add(a.RawBytePower, b.RawBytePower), + QualityAdjPower: big.Add(a.QualityAdjPower, b.QualityAdjPower), + } +} diff --git a/venus-shared/actors/builtin/power/state.sep.go.template b/venus-shared/actors/builtin/power/state.sep.go.template new file mode 100644 index 0000000000..4ec1a8fa83 --- /dev/null +++ b/venus-shared/actors/builtin/power/state.sep.go.template @@ -0,0 +1,203 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + +package power + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + +{{if (ge .v 3)}} + builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" +{{end}} + power{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/power" + adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" +) + +var _ State = (*state{{.v}})(nil) + +func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { + out := state{{.v}}{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make{{.v}}(store adt.Store) (State, error) { + out := state{{.v}}{store: store} + {{if (le .v 2)}} + em, err := adt{{.v}}.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + emm, err := adt{{.v}}.MakeEmptyMultimap(store).Root() + if err != nil { + return nil, err + } + + out.State = *power{{.v}}.ConstructState(em, emm) + {{else}} + s, err := power{{.v}}.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + {{end}} + + return &out, nil +} + +type state{{.v}} struct { + power{{.v}}.State + store adt.Store +} + +func (s *state{{.v}}) TotalLocked() (abi.TokenAmount, error) { + return s.TotalPledgeCollateral, nil +} + +func (s *state{{.v}}) TotalPower() (Claim, error) { + return Claim{ + RawBytePower: s.TotalRawBytePower, + QualityAdjPower: s.TotalQualityAdjPower, + }, nil +} + +// Committed power to the network. Includes miners below the minimum threshold. +func (s *state{{.v}}) TotalCommitted() (Claim, error) { + return Claim{ + RawBytePower: s.TotalBytesCommitted, + QualityAdjPower: s.TotalQABytesCommitted, + }, nil +} + +func (s *state{{.v}}) MinerPower(addr address.Address) (Claim, bool, error) { + claims, err := s.claims() + if err != nil { + return Claim{}, false, err + } + var claim power{{.v}}.Claim + ok, err := claims.Get(abi.AddrKey(addr), &claim) + if err != nil { + return Claim{}, false, err + } + return Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }, ok, nil +} + +func (s *state{{.v}}) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { + return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) +} + +func (s *state{{.v}}) TotalPowerSmoothed() (builtin.FilterEstimate, error) { + return builtin.FromV{{.v}}FilterEstimate({{if (le .v 1)}}*{{end}}s.State.ThisEpochQAPowerSmoothed), nil +} + +func (s *state{{.v}}) MinerCounts() (uint64, uint64, error) { + return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil +} + +func (s *state{{.v}}) ListAllMiners() ([]address.Address, error) { + claims, err := s.claims() + if err != nil { + return nil, err + } + + var miners []address.Address + err = claims.ForEach(nil, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + miners = append(miners, a) + return nil + }) + if err != nil { + return nil, err + } + + return miners, nil +} + +func (s *state{{.v}}) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { + claims, err := s.claims() + if err != nil { + return err + } + + var claim power{{.v}}.Claim + return claims.ForEach(&claim, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + return cb(a, Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + }) +} + +func (s *state{{.v}}) ClaimsChanged(other State) (bool, error) { + other{{.v}}, ok := other.(*state{{.v}}) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Claims.Equals(other{{.v}}.State.Claims), nil +} + +func (s *state{{.v}}) SetTotalQualityAdjPower(p abi.StoragePower) error { + s.State.TotalQualityAdjPower = p + return nil +} + +func (s *state{{.v}}) SetTotalRawBytePower(p abi.StoragePower) error { + s.State.TotalRawBytePower = p + return nil +} + +func (s *state{{.v}}) SetThisEpochQualityAdjPower(p abi.StoragePower) error { + s.State.ThisEpochQualityAdjPower = p + return nil +} + +func (s *state{{.v}}) SetThisEpochRawBytePower(p abi.StoragePower) error { + s.State.ThisEpochRawBytePower = p + return nil +} + +func (s *state{{.v}}) GetState() interface{} { + return &s.State +} + +func (s *state{{.v}}) claims() (adt.Map, error) { + return adt{{.v}}.AsMap(s.store, s.Claims{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) +} + +func (s *state{{.v}}) decodeClaim(val *cbg.Deferred) (Claim, error) { + var ci power{{.v}}.Claim + if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Claim{}, err + } + return fromV{{.v}}Claim(ci), nil +} + +func fromV{{.v}}Claim(v{{.v}} power{{.v}}.Claim) Claim { + return Claim{ + RawBytePower: v{{.v}}.RawBytePower, + QualityAdjPower: v{{.v}}.QualityAdjPower, + } +} diff --git a/venus-shared/actors/builtin/reward/actor.go.template b/venus-shared/actors/builtin/reward/actor.go.template new file mode 100644 index 0000000000..547814511c --- /dev/null +++ b/venus-shared/actors/builtin/reward/actor.go.template @@ -0,0 +1,85 @@ +// FETCHED FROM LOTUS: builtin/reward/actor.go.template + +package reward + +import ( + "github.com/filecoin-project/go-state-types/abi" + reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" + "github.com/ipfs/go-cid" + "github.com/filecoin-project/venus/venus-shared/actors" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-state-types/cbor" +{{range .versions}} + builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" +{{end}} + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +func init() { +{{range .versions}} + builtin.RegisterActorState(builtin{{.}}.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) +{{end}}} + +var ( + Address = builtin{{.latestVersion}}.RewardActorAddr + Methods = builtin{{.latestVersion}}.MethodsReward +) + +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { +{{range .versions}} + case builtin{{.}}.RewardActorCodeID: + return load{{.}}(store, act.Head) +{{end}} + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.StoragePower) (State, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return make{{.}}(store, currRealizedPower) +{{end}} +} + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return builtin{{.}}.RewardActorCodeID, nil +{{end}} + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + cbor.Marshaler + + ThisEpochBaselinePower() (abi.StoragePower, error) + ThisEpochReward() (abi.StoragePower, error) + ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) + + EffectiveBaselinePower() (abi.StoragePower, error) + EffectiveNetworkTime() (abi.ChainEpoch, error) + + TotalStoragePowerReward() (abi.TokenAmount, error) + + CumsumBaseline() (abi.StoragePower, error) + CumsumRealized() (abi.StoragePower, error) + + InitialPledgeForPower(abi.StoragePower, abi.TokenAmount, *builtin.FilterEstimate, abi.TokenAmount) (abi.TokenAmount, error) + PreCommitDepositForPower(builtin.FilterEstimate, abi.StoragePower) (abi.TokenAmount, error) + GetState() interface{} +} + +type AwardBlockRewardParams = reward0.AwardBlockRewardParams diff --git a/venus-shared/actors/builtin/reward/state.sep.go.template b/venus-shared/actors/builtin/reward/state.sep.go.template new file mode 100644 index 0000000000..3891b7b1b9 --- /dev/null +++ b/venus-shared/actors/builtin/reward/state.sep.go.template @@ -0,0 +1,115 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + +package reward + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + miner{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/miner" + reward{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/reward" + smoothing{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/smoothing" +) + +var _ State = (*state{{.v}})(nil) + +func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { + out := state{{.v}}{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make{{.v}}(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { + out := state{{.v}}{store: store} + out.State = *reward{{.v}}.ConstructState(currRealizedPower) + return &out, nil +} + +type state{{.v}} struct { + reward{{.v}}.State + store adt.Store +} + +func (s *state{{.v}}) ThisEpochReward() (abi.TokenAmount, error) { + return s.State.ThisEpochReward, nil +} + +func (s *state{{.v}}) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { +{{if (ge .v 2)}} + return builtin.FilterEstimate{ + PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, + VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, + }, nil +{{else}} + return builtin.FromV0FilterEstimate(*s.State.ThisEpochRewardSmoothed), nil +{{end}} +} + +func (s *state{{.v}}) ThisEpochBaselinePower() (abi.StoragePower, error) { + return s.State.ThisEpochBaselinePower, nil +} + +func (s *state{{.v}}) TotalStoragePowerReward() (abi.TokenAmount, error) { + return s.State.{{if (ge .v 2)}}TotalStoragePowerReward{{else}}TotalMined{{end}}, nil +} + +func (s *state{{.v}}) EffectiveBaselinePower() (abi.StoragePower, error) { + return s.State.EffectiveBaselinePower, nil +} + +func (s *state{{.v}}) EffectiveNetworkTime() (abi.ChainEpoch, error) { + return s.State.EffectiveNetworkTime, nil +} + +func (s *state{{.v}}) CumsumBaseline() (reward{{.v}}.Spacetime, error) { + return s.State.CumsumBaseline, nil +} + +func (s *state{{.v}}) CumsumRealized() (reward{{.v}}.Spacetime, error) { + return s.State.CumsumRealized, nil +} +{{if (ge .v 2)}} +func (s *state{{.v}}) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { + return miner{{.v}}.InitialPledgeForPower( + qaPower, + s.State.ThisEpochBaselinePower, + s.State.ThisEpochRewardSmoothed, + smoothing{{.v}}.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply, + ), nil +} +{{else}} +func (s *state0) InitialPledgeForPower(sectorWeight abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { + return miner0.InitialPledgeForPower( + sectorWeight, + s.State.ThisEpochBaselinePower, + networkTotalPledge, + s.State.ThisEpochRewardSmoothed, + &smoothing0.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply), nil +} +{{end}} +func (s *state{{.v}}) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { + return miner{{.v}}.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, + {{if (le .v 0)}}&{{end}}smoothing{{.v}}.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + sectorWeight), nil +} + +func (s *state{{.v}}) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/system/actor.go.template b/venus-shared/actors/builtin/system/actor.go.template new file mode 100644 index 0000000000..f16f20910b --- /dev/null +++ b/venus-shared/actors/builtin/system/actor.go.template @@ -0,0 +1,43 @@ +// FETCHED FROM LOTUS: builtin/system/actor.go.template + +package system + +import ( + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors" + "golang.org/x/xerrors" + "github.com/ipfs/go-cid" + +{{range .versions}} + builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" +{{end}} +) + +var ( + Address = builtin{{.latestVersion}}.SystemActorAddr +) + +func MakeState(store adt.Store, av actors.Version) (State, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return make{{.}}(store) +{{end}} +} + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return builtin{{.}}.SystemActorCodeID, nil +{{end}} + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + GetState() interface{} +} diff --git a/venus-shared/actors/builtin/system/state.sep.go.template b/venus-shared/actors/builtin/system/state.sep.go.template new file mode 100644 index 0000000000..c2544d5bca --- /dev/null +++ b/venus-shared/actors/builtin/system/state.sep.go.template @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + +package system + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + system{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/system" +) + +var _ State = (*state{{.v}})(nil) + +func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { + out := state{{.v}}{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make{{.v}}(store adt.Store) (State, error) { + out := state{{.v}}{store: store} + out.State = system{{.v}}.State{} + return &out, nil +} + +type state{{.v}} struct { + system{{.v}}.State + store adt.Store +} + +func (s *state{{.v}}) GetState() interface{} { + return &s.State +} \ No newline at end of file diff --git a/venus-shared/actors/builtin/verifreg/actor.go.template b/venus-shared/actors/builtin/verifreg/actor.go.template new file mode 100644 index 0000000000..422ada1838 --- /dev/null +++ b/venus-shared/actors/builtin/verifreg/actor.go.template @@ -0,0 +1,77 @@ +// FETCHED FROM LOTUS: builtin/verifreg/actor.go.template + +package verifreg + +import ( + "github.com/ipfs/go-cid" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/go-state-types/cbor" +{{range .versions}} + builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" +{{end}} + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +func init() { +{{range .versions}} + builtin.RegisterActorState(builtin{{.}}.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) +{{end}} +} + +var ( + Address = builtin{{.latestVersion}}.VerifiedRegistryActorAddr + Methods = builtin{{.latestVersion}}.MethodsVerifiedRegistry +) + +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { +{{range .versions}} + case builtin{{.}}.VerifiedRegistryActorCodeID: + return load{{.}}(store, act.Head) +{{end}} + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Address) (State, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return make{{.}}(store, rootKeyAddress) +{{end}} +} + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { +{{range .versions}} + case actors.Version{{.}}: + return builtin{{.}}.VerifiedRegistryActorCodeID, nil +{{end}} + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + + +type State interface { + cbor.Marshaler + + RootKey() (address.Address, error) + VerifiedClientDataCap(address.Address) (bool, abi.StoragePower, error) + VerifierDataCap(address.Address) (bool, abi.StoragePower, error) + ForEachVerifier(func(addr address.Address, dcap abi.StoragePower) error) error + ForEachClient(func(addr address.Address, dcap abi.StoragePower) error) error + GetState() interface{} +} diff --git a/venus-shared/actors/builtin/verifreg/state.sep.go.template b/venus-shared/actors/builtin/verifreg/state.sep.go.template new file mode 100644 index 0000000000..57b8c4a38a --- /dev/null +++ b/venus-shared/actors/builtin/verifreg/state.sep.go.template @@ -0,0 +1,84 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + +package verifreg + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + +{{if (ge .v 3)}} builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" +{{end}} verifreg{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/verifreg" + adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" +) + +var _ State = (*state{{.v}})(nil) + +func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { + out := state{{.v}}{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make{{.v}}(store adt.Store, rootKeyAddress address.Address) (State, error) { + out := state{{.v}}{store: store} + {{if (le .v 2)}} + em, err := adt{{.v}}.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *verifreg{{.v}}.ConstructState(em, rootKeyAddress) + {{else}} + s, err := verifreg{{.v}}.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + {{end}} + return &out, nil +} + +type state{{.v}} struct { + verifreg{{.v}}.State + store adt.Store +} + +func (s *state{{.v}}) RootKey() (address.Address, error) { + return s.State.RootKey, nil +} + +func (s *state{{.v}}) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version{{.v}}, s.verifiedClients, addr) +} + +func (s *state{{.v}}) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version{{.v}}, s.verifiers, addr) +} + +func (s *state{{.v}}) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version{{.v}}, s.verifiers, cb) +} + +func (s *state{{.v}}) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version{{.v}}, s.verifiedClients, cb) +} + +func (s *state{{.v}}) verifiedClients() (adt.Map, error) { + return adt{{.v}}.AsMap(s.store, s.VerifiedClients{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) +} + +func (s *state{{.v}}) verifiers() (adt.Map, error) { + return adt{{.v}}.AsMap(s.store, s.Verifiers{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) +} + +func (s *state{{.v}}) GetState() interface{} { + return &s.State +} \ No newline at end of file diff --git a/venus-shared/actors/policy/policy.go b/venus-shared/actors/policy/policy.go new file mode 100644 index 0000000000..357980ffa3 --- /dev/null +++ b/venus-shared/actors/policy/policy.go @@ -0,0 +1,549 @@ +// FETCHED FROM LOTUS: policy/policy.go.template + +package policy + +import ( + "sort" + + "github.com/filecoin-project/go-state-types/big" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/venus/venus-shared/actors" + + market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" + miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" + power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" + verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" + + builtin2 "github.com/filecoin-project/specs-actors/2/actors/builtin" + market2 "github.com/filecoin-project/specs-actors/2/actors/builtin/market" + miner2 "github.com/filecoin-project/specs-actors/2/actors/builtin/miner" + verifreg2 "github.com/filecoin-project/specs-actors/2/actors/builtin/verifreg" + + builtin3 "github.com/filecoin-project/specs-actors/3/actors/builtin" + market3 "github.com/filecoin-project/specs-actors/3/actors/builtin/market" + miner3 "github.com/filecoin-project/specs-actors/3/actors/builtin/miner" + verifreg3 "github.com/filecoin-project/specs-actors/3/actors/builtin/verifreg" + + builtin4 "github.com/filecoin-project/specs-actors/4/actors/builtin" + market4 "github.com/filecoin-project/specs-actors/4/actors/builtin/market" + miner4 "github.com/filecoin-project/specs-actors/4/actors/builtin/miner" + verifreg4 "github.com/filecoin-project/specs-actors/4/actors/builtin/verifreg" + + builtin5 "github.com/filecoin-project/specs-actors/5/actors/builtin" + market5 "github.com/filecoin-project/specs-actors/5/actors/builtin/market" + miner5 "github.com/filecoin-project/specs-actors/5/actors/builtin/miner" + verifreg5 "github.com/filecoin-project/specs-actors/5/actors/builtin/verifreg" + + builtin6 "github.com/filecoin-project/specs-actors/6/actors/builtin" + market6 "github.com/filecoin-project/specs-actors/6/actors/builtin/market" + miner6 "github.com/filecoin-project/specs-actors/6/actors/builtin/miner" + verifreg6 "github.com/filecoin-project/specs-actors/6/actors/builtin/verifreg" + + paych6 "github.com/filecoin-project/specs-actors/6/actors/builtin/paych" +) + +const ( + ChainFinality = miner6.ChainFinality + SealRandomnessLookback = ChainFinality + PaychSettleDelay = paych6.SettleDelay + MaxPreCommitRandomnessLookback = builtin6.EpochsInDay + SealRandomnessLookback +) + +// SetSupportedProofTypes sets supported proof types, across all actor versions. +// This should only be used for testing. +func SetSupportedProofTypes(types ...abi.RegisteredSealProof) { + + miner0.SupportedProofTypes = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner2.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner2.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) + miner2.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner3.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner3.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) + miner3.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner4.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner4.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) + miner4.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner5.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner6.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + AddSupportedProofTypes(types...) +} + +// AddSupportedProofTypes sets supported proof types, across all actor versions. +// This should only be used for testing. +func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { + for _, t := range types { + if t >= abi.RegisteredSealProof_StackedDrg2KiBV1_1 { + panic("must specify v1 proof types only") + } + // Set for all miner versions. + + miner0.SupportedProofTypes[t] = struct{}{} + + miner2.PreCommitSealProofTypesV0[t] = struct{}{} + miner2.PreCommitSealProofTypesV7[t] = struct{}{} + miner2.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner2.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + + miner3.PreCommitSealProofTypesV0[t] = struct{}{} + miner3.PreCommitSealProofTypesV7[t] = struct{}{} + miner3.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner3.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + + miner4.PreCommitSealProofTypesV0[t] = struct{}{} + miner4.PreCommitSealProofTypesV7[t] = struct{}{} + miner4.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner4.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + + miner5.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err := t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner5.WindowPoStProofTypes[wpp] = struct{}{} + + miner6.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err = t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner6.WindowPoStProofTypes[wpp] = struct{}{} + + } +} + +// SetPreCommitChallengeDelay sets the pre-commit challenge delay across all +// actors versions. Use for testing. +func SetPreCommitChallengeDelay(delay abi.ChainEpoch) { + // Set for all miner versions. + + miner0.PreCommitChallengeDelay = delay + + miner2.PreCommitChallengeDelay = delay + + miner3.PreCommitChallengeDelay = delay + + miner4.PreCommitChallengeDelay = delay + + miner5.PreCommitChallengeDelay = delay + + miner6.PreCommitChallengeDelay = delay + +} + +// TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. +func GetPreCommitChallengeDelay() abi.ChainEpoch { + return miner6.PreCommitChallengeDelay +} + +// SetConsensusMinerMinPower sets the minimum power of an individual miner must +// meet for leader election, across all actor versions. This should only be used +// for testing. +func SetConsensusMinerMinPower(p abi.StoragePower) { + + power0.ConsensusMinerMinPower = p + + for _, policy := range builtin2.SealProofPolicies { + policy.ConsensusMinerMinPower = p + } + + for _, policy := range builtin3.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + for _, policy := range builtin4.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + for _, policy := range builtin5.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + for _, policy := range builtin6.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + +} + +// SetMinVerifiedDealSize sets the minimum size of a verified deal. This should +// only be used for testing. +func SetMinVerifiedDealSize(size abi.StoragePower) { + + verifreg0.MinVerifiedDealSize = size + + verifreg2.MinVerifiedDealSize = size + + verifreg3.MinVerifiedDealSize = size + + verifreg4.MinVerifiedDealSize = size + + verifreg5.MinVerifiedDealSize = size + + verifreg6.MinVerifiedDealSize = size + +} + +func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { + switch ver { + + case actors.Version0: + + return miner0.MaxSealDuration[t], nil + + case actors.Version2: + + return miner2.MaxProveCommitDuration[t], nil + + case actors.Version3: + + return miner3.MaxProveCommitDuration[t], nil + + case actors.Version4: + + return miner4.MaxProveCommitDuration[t], nil + + case actors.Version5: + + return miner5.MaxProveCommitDuration[t], nil + + case actors.Version6: + + return miner6.MaxProveCommitDuration[t], nil + + default: + return 0, xerrors.Errorf("unsupported actors version") + } +} + +// SetProviderCollateralSupplyTarget sets the percentage of normalized circulating +// supply that must be covered by provider collateral in a deal. This should +// only be used for testing. +func SetProviderCollateralSupplyTarget(num, denom big.Int) { + + market2.ProviderCollateralSupplyTarget = builtin2.BigFrac{ + Numerator: num, + Denominator: denom, + } + + market3.ProviderCollateralSupplyTarget = builtin3.BigFrac{ + Numerator: num, + Denominator: denom, + } + + market4.ProviderCollateralSupplyTarget = builtin4.BigFrac{ + Numerator: num, + Denominator: denom, + } + + market5.ProviderCollateralSupplyTarget = builtin5.BigFrac{ + Numerator: num, + Denominator: denom, + } + + market6.ProviderCollateralSupplyTarget = builtin6.BigFrac{ + Numerator: num, + Denominator: denom, + } + +} + +func DealProviderCollateralBounds( + size abi.PaddedPieceSize, verified bool, + rawBytePower, qaPower, baselinePower abi.StoragePower, + circulatingFil abi.TokenAmount, nwVer network.Version, +) (min, max abi.TokenAmount, err error) { + v, err := actors.VersionForNetwork(nwVer) + if err != nil { + return big.Zero(), big.Zero(), err + } + switch v { + + case actors.Version0: + + min, max := market0.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil, nwVer) + return min, max, nil + + case actors.Version2: + + min, max := market2.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + case actors.Version3: + + min, max := market3.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + case actors.Version4: + + min, max := market4.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + case actors.Version5: + + min, max := market5.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + case actors.Version6: + + min, max := market6.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + default: + return big.Zero(), big.Zero(), xerrors.Errorf("unsupported actors version") + } +} + +func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) { + return market6.DealDurationBounds(pieceSize) +} + +// Sets the challenge window and scales the proving period to match (such that +// there are always 48 challenge windows in a proving period). +func SetWPoStChallengeWindow(period abi.ChainEpoch) { + + miner0.WPoStChallengeWindow = period + miner0.WPoStProvingPeriod = period * abi.ChainEpoch(miner0.WPoStPeriodDeadlines) + + miner2.WPoStChallengeWindow = period + miner2.WPoStProvingPeriod = period * abi.ChainEpoch(miner2.WPoStPeriodDeadlines) + + miner3.WPoStChallengeWindow = period + miner3.WPoStProvingPeriod = period * abi.ChainEpoch(miner3.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner3.WPoStDisputeWindow = period * 30 + + miner4.WPoStChallengeWindow = period + miner4.WPoStProvingPeriod = period * abi.ChainEpoch(miner4.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner4.WPoStDisputeWindow = period * 30 + + miner5.WPoStChallengeWindow = period + miner5.WPoStProvingPeriod = period * abi.ChainEpoch(miner5.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner5.WPoStDisputeWindow = period * 30 + + miner6.WPoStChallengeWindow = period + miner6.WPoStProvingPeriod = period * abi.ChainEpoch(miner6.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner6.WPoStDisputeWindow = period * 30 + +} + +func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { + if nwVer <= network.Version3 { + return 10 + } + + // NOTE: if this ever changes, adjust it in a (*Miner).mineOne() logline as well + return ChainFinality +} + +func GetMaxSectorExpirationExtension() abi.ChainEpoch { + return miner6.MaxSectorExpirationExtension +} + +func GetMinSectorExpiration() abi.ChainEpoch { + return miner6.MinSectorExpiration +} + +func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, error) { + sectorsPerPart, err := builtin6.PoStProofWindowPoStPartitionSectors(p) + if err != nil { + return 0, err + } + maxSectors, err := GetAddressedSectorsMax(nv) + if err != nil { + return 0, err + } + return int(uint64(maxSectors) / sectorsPerPart), nil +} + +func GetDefaultSectorSize() abi.SectorSize { + // supported sector sizes are the same across versions. + szs := make([]abi.SectorSize, 0, len(miner6.PreCommitSealProofTypesV8)) + for spt := range miner6.PreCommitSealProofTypesV8 { + ss, err := spt.SectorSize() + if err != nil { + panic(err) + } + + szs = append(szs, ss) + } + + sort.Slice(szs, func(i, j int) bool { + return szs[i] < szs[j] + }) + + return szs[0] +} + +func GetDefaultAggregationProof() abi.RegisteredAggregationProof { + return abi.RegisteredAggregationProof_SnarkPackV1 +} + +func GetSectorMaxLifetime(proof abi.RegisteredSealProof, nwVer network.Version) abi.ChainEpoch { + if nwVer <= network.Version10 { + return builtin4.SealProofPoliciesV0[proof].SectorMaxLifetime + } + + return builtin6.SealProofPoliciesV11[proof].SectorMaxLifetime +} + +func GetAddressedSectorsMax(nwVer network.Version) (int, error) { + v, err := actors.VersionForNetwork(nwVer) + if err != nil { + return 0, err + } + switch v { + + case actors.Version0: + return miner0.AddressedSectorsMax, nil + + case actors.Version2: + return miner2.AddressedSectorsMax, nil + + case actors.Version3: + return miner3.AddressedSectorsMax, nil + + case actors.Version4: + return miner4.AddressedSectorsMax, nil + + case actors.Version5: + return miner5.AddressedSectorsMax, nil + + case actors.Version6: + return miner6.AddressedSectorsMax, nil + + default: + return 0, xerrors.Errorf("unsupported network version") + } +} + +func GetDeclarationsMax(nwVer network.Version) (int, error) { + v, err := actors.VersionForNetwork(nwVer) + if err != nil { + return 0, err + } + switch v { + + case actors.Version0: + + // TODO: Should we instead error here since the concept doesn't exist yet? + return miner0.AddressedPartitionsMax, nil + + case actors.Version2: + + return miner2.DeclarationsMax, nil + + case actors.Version3: + + return miner3.DeclarationsMax, nil + + case actors.Version4: + + return miner4.DeclarationsMax, nil + + case actors.Version5: + + return miner5.DeclarationsMax, nil + + case actors.Version6: + + return miner6.DeclarationsMax, nil + + default: + return 0, xerrors.Errorf("unsupported network version") + } +} + +func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { + v, err := actors.VersionForNetwork(nwVer) + if err != nil { + return big.Zero(), err + } + switch v { + + case actors.Version0: + + return big.Zero(), nil + + case actors.Version2: + + return big.Zero(), nil + + case actors.Version3: + + return big.Zero(), nil + + case actors.Version4: + + return big.Zero(), nil + + case actors.Version5: + + return miner5.AggregateNetworkFee(aggregateSize, baseFee), nil + + case actors.Version6: + + return miner6.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + + default: + return big.Zero(), xerrors.Errorf("unsupported network version") + } +} + +func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { + v, err := actors.VersionForNetwork(nwVer) + if err != nil { + return big.Zero(), err + } + switch v { + + case actors.Version0: + + return big.Zero(), nil + + case actors.Version2: + + return big.Zero(), nil + + case actors.Version3: + + return big.Zero(), nil + + case actors.Version4: + + return big.Zero(), nil + + case actors.Version5: + + return big.Zero(), nil + + case actors.Version6: + + return miner6.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + + default: + return big.Zero(), xerrors.Errorf("unsupported network version") + } +} diff --git a/venus-shared/actors/policy/policy.go.template b/venus-shared/actors/policy/policy.go.template new file mode 100644 index 0000000000..39661a381c --- /dev/null +++ b/venus-shared/actors/policy/policy.go.template @@ -0,0 +1,337 @@ +// FETCHED FROM LOTUS: policy/policy.go.template + +package policy + +import ( + "sort" + + "github.com/filecoin-project/go-state-types/big" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/venus/venus-shared/actors" + + {{range .versions}} + {{if (ge . 2)}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" {{end}} + market{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin/market" + miner{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin/miner" + verifreg{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin/verifreg" + {{if (eq . 0)}} power{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin/power" {{end}} + {{end}} + + paych{{.latestVersion}} "github.com/filecoin-project/specs-actors{{import .latestVersion}}actors/builtin/paych" +) + +const ( + ChainFinality = miner{{.latestVersion}}.ChainFinality + SealRandomnessLookback = ChainFinality + PaychSettleDelay = paych{{.latestVersion}}.SettleDelay + MaxPreCommitRandomnessLookback = builtin{{.latestVersion}}.EpochsInDay + SealRandomnessLookback +) + +// SetSupportedProofTypes sets supported proof types, across all actor versions. +// This should only be used for testing. +func SetSupportedProofTypes(types ...abi.RegisteredSealProof) { + {{range .versions}} + {{if (eq . 0)}} + miner{{.}}.SupportedProofTypes = make(map[abi.RegisteredSealProof]struct{}, len(types)) + {{else if (le . 4)}} + miner{{.}}.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner{{.}}.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) + miner{{.}}.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + {{else}} + miner{{.}}.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + {{end}} + {{end}} + + AddSupportedProofTypes(types...) +} + +// AddSupportedProofTypes sets supported proof types, across all actor versions. +// This should only be used for testing. +func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { + for _, t := range types { + if t >= abi.RegisteredSealProof_StackedDrg2KiBV1_1 { + panic("must specify v1 proof types only") + } + // Set for all miner versions. + + {{range .versions}} + {{if (eq . 0)}} + miner{{.}}.SupportedProofTypes[t] = struct{}{} + {{else if (le . 4)}} + miner{{.}}.PreCommitSealProofTypesV0[t] = struct{}{} + miner{{.}}.PreCommitSealProofTypesV7[t] = struct{}{} + miner{{.}}.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner{{.}}.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + {{else if (eq . 5)}} + miner{{.}}.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err := t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner{{.}}.WindowPoStProofTypes[wpp] = struct{}{} + {{else}} + miner{{.}}.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err = t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner{{.}}.WindowPoStProofTypes[wpp] = struct{}{} + {{end}} + {{end}} + } +} + +// SetPreCommitChallengeDelay sets the pre-commit challenge delay across all +// actors versions. Use for testing. +func SetPreCommitChallengeDelay(delay abi.ChainEpoch) { + // Set for all miner versions. + {{range .versions}} + miner{{.}}.PreCommitChallengeDelay = delay + {{end}} +} + +// TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. +func GetPreCommitChallengeDelay() abi.ChainEpoch { + return miner{{.latestVersion}}.PreCommitChallengeDelay +} + +// SetConsensusMinerMinPower sets the minimum power of an individual miner must +// meet for leader election, across all actor versions. This should only be used +// for testing. +func SetConsensusMinerMinPower(p abi.StoragePower) { + {{range .versions}} + {{if (eq . 0)}} + power{{.}}.ConsensusMinerMinPower = p + {{else if (eq . 2)}} + for _, policy := range builtin{{.}}.SealProofPolicies { + policy.ConsensusMinerMinPower = p + } + {{else}} + for _, policy := range builtin{{.}}.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + {{end}} + {{end}} +} + +// SetMinVerifiedDealSize sets the minimum size of a verified deal. This should +// only be used for testing. +func SetMinVerifiedDealSize(size abi.StoragePower) { + {{range .versions}} + verifreg{{.}}.MinVerifiedDealSize = size + {{end}} +} + +func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { + switch ver { + {{range .versions}} + case actors.Version{{.}}: + {{if (eq . 0)}} + return miner{{.}}.MaxSealDuration[t], nil + {{else}} + return miner{{.}}.MaxProveCommitDuration[t], nil + {{end}} + {{end}} + default: + return 0, xerrors.Errorf("unsupported actors version") + } +} + +// SetProviderCollateralSupplyTarget sets the percentage of normalized circulating +// supply that must be covered by provider collateral in a deal. This should +// only be used for testing. +func SetProviderCollateralSupplyTarget(num, denom big.Int) { +{{range .versions}} + {{if (ge . 2)}} + market{{.}}.ProviderCollateralSupplyTarget = builtin{{.}}.BigFrac{ + Numerator: num, + Denominator: denom, + } + {{end}} +{{end}} +} + +func DealProviderCollateralBounds( + size abi.PaddedPieceSize, verified bool, + rawBytePower, qaPower, baselinePower abi.StoragePower, + circulatingFil abi.TokenAmount, nwVer network.Version, +) (min, max abi.TokenAmount, err error) { + v, err := actors.VersionForNetwork(nwVer) + if err != nil { + return big.Zero(), big.Zero(), err + } + switch v { + {{range .versions}} + case actors.Version{{.}}: + {{if (eq . 0)}} + min, max := market{{.}}.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil, nwVer) + return min, max, nil + {{else}} + min, max := market{{.}}.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + {{end}} + {{end}} + default: + return big.Zero(), big.Zero(), xerrors.Errorf("unsupported actors version") + } +} + +func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) { + return market{{.latestVersion}}.DealDurationBounds(pieceSize) +} + +// Sets the challenge window and scales the proving period to match (such that +// there are always 48 challenge windows in a proving period). +func SetWPoStChallengeWindow(period abi.ChainEpoch) { + {{range .versions}} + miner{{.}}.WPoStChallengeWindow = period + miner{{.}}.WPoStProvingPeriod = period * abi.ChainEpoch(miner{{.}}.WPoStPeriodDeadlines) + {{if (ge . 3)}} + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner{{.}}.WPoStDisputeWindow = period * 30 + {{end}} + {{end}} +} + +func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { + if nwVer <= network.Version3 { + return 10 + } + + // NOTE: if this ever changes, adjust it in a (*Miner).mineOne() logline as well + return ChainFinality +} + +func GetMaxSectorExpirationExtension() abi.ChainEpoch { + return miner{{.latestVersion}}.MaxSectorExpirationExtension +} + +func GetMinSectorExpiration() abi.ChainEpoch { + return miner{{.latestVersion}}.MinSectorExpiration +} + +func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, error) { + sectorsPerPart, err := builtin{{.latestVersion}}.PoStProofWindowPoStPartitionSectors(p) + if err != nil { + return 0, err + } + maxSectors, err := GetAddressedSectorsMax(nv) + if err != nil { + return 0, err + } + return int(uint64(maxSectors) / sectorsPerPart), nil +} + +func GetDefaultSectorSize() abi.SectorSize { + // supported sector sizes are the same across versions. + szs := make([]abi.SectorSize, 0, len(miner{{.latestVersion}}.PreCommitSealProofTypesV8)) + for spt := range miner{{.latestVersion}}.PreCommitSealProofTypesV8 { + ss, err := spt.SectorSize() + if err != nil { + panic(err) + } + + szs = append(szs, ss) + } + + sort.Slice(szs, func(i, j int) bool { + return szs[i] < szs[j] + }) + + return szs[0] +} + +func GetDefaultAggregationProof() abi.RegisteredAggregationProof { + return abi.RegisteredAggregationProof_SnarkPackV1 +} + +func GetSectorMaxLifetime(proof abi.RegisteredSealProof, nwVer network.Version) abi.ChainEpoch { + if nwVer <= network.Version10 { + return builtin4.SealProofPoliciesV0[proof].SectorMaxLifetime + } + + return builtin{{.latestVersion}}.SealProofPoliciesV11[proof].SectorMaxLifetime +} + +func GetAddressedSectorsMax(nwVer network.Version) (int, error) { + v, err := actors.VersionForNetwork(nwVer) + if err != nil { + return 0, err + } + switch v { + {{range .versions}} + case actors.Version{{.}}: + return miner{{.}}.AddressedSectorsMax, nil + {{end}} + default: + return 0, xerrors.Errorf("unsupported network version") + } +} + +func GetDeclarationsMax(nwVer network.Version) (int, error) { + v, err := actors.VersionForNetwork(nwVer) + if err != nil { + return 0, err + } + switch v { + {{range .versions}} + case actors.Version{{.}}: + {{if (eq . 0)}} + // TODO: Should we instead error here since the concept doesn't exist yet? + return miner{{.}}.AddressedPartitionsMax, nil + {{else}} + return miner{{.}}.DeclarationsMax, nil + {{end}} + {{end}} + default: + return 0, xerrors.Errorf("unsupported network version") + } +} + +func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { + v, err := actors.VersionForNetwork(nwVer) + if err != nil { + return big.Zero(), err + } + switch v { + {{range .versions}} + case actors.Version{{.}}: + {{if (ge . 6)}} + return miner{{.}}.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + {{else if (eq . 5)}} + return miner{{.}}.AggregateNetworkFee(aggregateSize, baseFee), nil + {{else}} + return big.Zero(), nil + {{end}} + {{end}} + default: + return big.Zero(), xerrors.Errorf("unsupported network version") + } +} + +func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { + v, err := actors.VersionForNetwork(nwVer) + if err != nil { + return big.Zero(), err + } + switch v { + {{range .versions}} + case actors.Version{{.}}: + {{if (ge . 6)}} + return miner{{.}}.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + {{else}} + return big.Zero(), nil + {{end}} + {{end}} + default: + return big.Zero(), xerrors.Errorf("unsupported network version") + } +} diff --git a/venus-shared/compatible-checks/actor-template.txt b/venus-shared/compatible-checks/actor-template.txt new file mode 100644 index 0000000000..bb2193324d --- /dev/null +++ b/venus-shared/compatible-checks/actor-template.txt @@ -0,0 +1,27 @@ +TEMPLATES IN chain/actors: + builtin/account/actor.go.template + builtin/account/state.go.template + builtin/builtin.go.template + builtin/cron/actor.go.template + builtin/cron/state.go.template + builtin/init/actor.go.template + builtin/init/state.go.template + builtin/market/actor.go.template + builtin/market/state.go.template + builtin/miner/actor.go.template + builtin/miner/state.go.template + builtin/multisig/actor.go.template + builtin/multisig/message.go.template + builtin/multisig/state.go.template + builtin/paych/actor.go.template + builtin/paych/message.go.template + builtin/paych/state.go.template + builtin/power/actor.go.template + builtin/power/state.go.template + builtin/reward/actor.go.template + builtin/reward/state.go.template + builtin/system/actor.go.template + builtin/system/state.go.template + builtin/verifreg/actor.go.template + builtin/verifreg/state.go.template + policy/policy.go.template From 05952718acde39d972e5678835624daf78d9a1a6 Mon Sep 17 00:00:00 2001 From: dtynn Date: Fri, 19 Nov 2021 17:29:34 +0800 Subject: [PATCH 027/167] feat: complete venus-shared/actors --- Makefile | 9 +- venus-devtool/compatible/TODO.md | 3 + venus-devtool/compatible/actors/list.go | 37 ++ venus-devtool/compatible/actors/main.go | 33 +- venus-devtool/compatible/actors/source.go | 1 + venus-devtool/compatible/actors/templates.go | 43 +- venus-devtool/go.mod | 1 + venus-devtool/go.sum | 6 + venus-shared/actors/adt/adt.go | 29 + venus-shared/actors/adt/diff_adt.go | 122 ++++ venus-shared/actors/adt/store.go | 17 + venus-shared/actors/aerrors/error.go | 69 +++ venus-shared/actors/aerrors/wrap.go | 203 +++++++ venus-shared/actors/builtin/account/actor.go | 140 +++++ .../actors/builtin/account/state.v0.go | 42 ++ .../actors/builtin/account/state.v2.go | 42 ++ .../actors/builtin/account/state.v3.go | 42 ++ .../actors/builtin/account/state.v4.go | 42 ++ .../actors/builtin/account/state.v5.go | 42 ++ .../actors/builtin/account/state.v6.go | 42 ++ venus-shared/actors/builtin/builtin.go | 300 +++++++++ venus-shared/actors/builtin/cron/actor.go | 82 +++ venus-shared/actors/builtin/cron/state.v0.go | 37 ++ venus-shared/actors/builtin/cron/state.v2.go | 37 ++ venus-shared/actors/builtin/cron/state.v3.go | 37 ++ venus-shared/actors/builtin/cron/state.v4.go | 37 ++ venus-shared/actors/builtin/cron/state.v5.go | 37 ++ venus-shared/actors/builtin/cron/state.v6.go | 37 ++ venus-shared/actors/builtin/init/actor.go | 164 +++++ venus-shared/actors/builtin/init/state.v0.go | 113 ++++ venus-shared/actors/builtin/init/state.v2.go | 113 ++++ venus-shared/actors/builtin/init/state.v3.go | 115 ++++ venus-shared/actors/builtin/init/state.v4.go | 115 ++++ venus-shared/actors/builtin/init/state.v5.go | 115 ++++ venus-shared/actors/builtin/init/state.v6.go | 115 ++++ venus-shared/actors/builtin/market/actor.go | 295 +++++++++ .../actors/builtin/market/state.v0.go | 260 ++++++++ .../actors/builtin/market/state.v2.go | 260 ++++++++ .../actors/builtin/market/state.v3.go | 255 ++++++++ .../actors/builtin/market/state.v4.go | 255 ++++++++ .../actors/builtin/market/state.v5.go | 255 ++++++++ .../actors/builtin/market/state.v6.go | 254 ++++++++ venus-shared/actors/builtin/miner/actor.go | 398 ++++++++++++ venus-shared/actors/builtin/miner/state.v0.go | 523 ++++++++++++++++ venus-shared/actors/builtin/miner/state.v2.go | 571 +++++++++++++++++ venus-shared/actors/builtin/miner/state.v3.go | 572 ++++++++++++++++++ venus-shared/actors/builtin/miner/state.v4.go | 572 ++++++++++++++++++ venus-shared/actors/builtin/miner/state.v5.go | 572 ++++++++++++++++++ venus-shared/actors/builtin/miner/state.v6.go | 572 ++++++++++++++++++ venus-shared/actors/builtin/multisig/actor.go | 232 +++++++ .../actors/builtin/multisig/message.v0.go | 144 +++++ .../actors/builtin/multisig/message.v2.go | 73 +++ .../actors/builtin/multisig/message.v3.go | 73 +++ .../actors/builtin/multisig/message.v4.go | 73 +++ .../actors/builtin/multisig/message.v5.go | 73 +++ .../actors/builtin/multisig/message.v6.go | 73 +++ .../actors/builtin/multisig/state.v0.go | 119 ++++ .../actors/builtin/multisig/state.v2.go | 119 ++++ .../actors/builtin/multisig/state.v3.go | 121 ++++ .../actors/builtin/multisig/state.v4.go | 121 ++++ .../actors/builtin/multisig/state.v5.go | 121 ++++ .../actors/builtin/multisig/state.v6.go | 121 ++++ venus-shared/actors/builtin/paych/actor.go | 223 +++++++ .../actors/builtin/paych/message.v0.go | 76 +++ .../actors/builtin/paych/message.v2.go | 76 +++ .../actors/builtin/paych/message.v3.go | 76 +++ .../actors/builtin/paych/message.v4.go | 76 +++ .../actors/builtin/paych/message.v5.go | 76 +++ .../actors/builtin/paych/message.v6.go | 76 +++ venus-shared/actors/builtin/paych/state.v0.go | 116 ++++ venus-shared/actors/builtin/paych/state.v2.go | 116 ++++ venus-shared/actors/builtin/paych/state.v3.go | 116 ++++ venus-shared/actors/builtin/paych/state.v4.go | 116 ++++ venus-shared/actors/builtin/paych/state.v5.go | 116 ++++ venus-shared/actors/builtin/paych/state.v6.go | 116 ++++ venus-shared/actors/builtin/power/actor.go | 183 ++++++ venus-shared/actors/builtin/power/state.v0.go | 192 ++++++ venus-shared/actors/builtin/power/state.v2.go | 192 ++++++ venus-shared/actors/builtin/power/state.v3.go | 189 ++++++ venus-shared/actors/builtin/power/state.v4.go | 189 ++++++ venus-shared/actors/builtin/power/state.v5.go | 189 ++++++ venus-shared/actors/builtin/power/state.v6.go | 189 ++++++ venus-shared/actors/builtin/reward/actor.go | 159 +++++ .../actors/builtin/reward/state.v0.go | 97 +++ .../actors/builtin/reward/state.v2.go | 100 +++ .../actors/builtin/reward/state.v3.go | 100 +++ .../actors/builtin/reward/state.v4.go | 100 +++ .../actors/builtin/reward/state.v5.go | 100 +++ .../actors/builtin/reward/state.v6.go | 100 +++ venus-shared/actors/builtin/system/actor.go | 81 +++ .../actors/builtin/system/state.v0.go | 37 ++ .../actors/builtin/system/state.v2.go | 37 ++ .../actors/builtin/system/state.v3.go | 37 ++ .../actors/builtin/system/state.v4.go | 37 ++ .../actors/builtin/system/state.v5.go | 37 ++ .../actors/builtin/system/state.v6.go | 37 ++ venus-shared/actors/builtin/verifreg/actor.go | 150 +++++ .../actors/builtin/verifreg/state.v0.go | 76 +++ .../actors/builtin/verifreg/state.v2.go | 76 +++ .../actors/builtin/verifreg/state.v3.go | 77 +++ .../actors/builtin/verifreg/state.v4.go | 77 +++ .../actors/builtin/verifreg/state.v5.go | 77 +++ .../actors/builtin/verifreg/state.v6.go | 77 +++ venus-shared/actors/builtin/verifreg/util.go | 54 ++ venus-shared/actors/params.go | 19 + venus-shared/actors/policy/policy.go | 52 +- venus-shared/actors/version.go | 42 ++ .../compatible-checks/actor-sources.txt | 112 ++++ ...actor-template.txt => actor-templates.txt} | 0 venus-shared/go.mod | 14 +- venus-shared/go.sum | 247 ++++++++ 111 files changed, 14329 insertions(+), 74 deletions(-) create mode 100644 venus-devtool/compatible/TODO.md create mode 100644 venus-devtool/compatible/actors/list.go create mode 100644 venus-devtool/compatible/actors/source.go create mode 100644 venus-shared/actors/adt/adt.go create mode 100644 venus-shared/actors/adt/diff_adt.go create mode 100644 venus-shared/actors/adt/store.go create mode 100644 venus-shared/actors/aerrors/error.go create mode 100644 venus-shared/actors/aerrors/wrap.go create mode 100644 venus-shared/actors/builtin/account/actor.go create mode 100644 venus-shared/actors/builtin/account/state.v0.go create mode 100644 venus-shared/actors/builtin/account/state.v2.go create mode 100644 venus-shared/actors/builtin/account/state.v3.go create mode 100644 venus-shared/actors/builtin/account/state.v4.go create mode 100644 venus-shared/actors/builtin/account/state.v5.go create mode 100644 venus-shared/actors/builtin/account/state.v6.go create mode 100644 venus-shared/actors/builtin/builtin.go create mode 100644 venus-shared/actors/builtin/cron/actor.go create mode 100644 venus-shared/actors/builtin/cron/state.v0.go create mode 100644 venus-shared/actors/builtin/cron/state.v2.go create mode 100644 venus-shared/actors/builtin/cron/state.v3.go create mode 100644 venus-shared/actors/builtin/cron/state.v4.go create mode 100644 venus-shared/actors/builtin/cron/state.v5.go create mode 100644 venus-shared/actors/builtin/cron/state.v6.go create mode 100644 venus-shared/actors/builtin/init/actor.go create mode 100644 venus-shared/actors/builtin/init/state.v0.go create mode 100644 venus-shared/actors/builtin/init/state.v2.go create mode 100644 venus-shared/actors/builtin/init/state.v3.go create mode 100644 venus-shared/actors/builtin/init/state.v4.go create mode 100644 venus-shared/actors/builtin/init/state.v5.go create mode 100644 venus-shared/actors/builtin/init/state.v6.go create mode 100644 venus-shared/actors/builtin/market/actor.go create mode 100644 venus-shared/actors/builtin/market/state.v0.go create mode 100644 venus-shared/actors/builtin/market/state.v2.go create mode 100644 venus-shared/actors/builtin/market/state.v3.go create mode 100644 venus-shared/actors/builtin/market/state.v4.go create mode 100644 venus-shared/actors/builtin/market/state.v5.go create mode 100644 venus-shared/actors/builtin/market/state.v6.go create mode 100644 venus-shared/actors/builtin/miner/actor.go create mode 100644 venus-shared/actors/builtin/miner/state.v0.go create mode 100644 venus-shared/actors/builtin/miner/state.v2.go create mode 100644 venus-shared/actors/builtin/miner/state.v3.go create mode 100644 venus-shared/actors/builtin/miner/state.v4.go create mode 100644 venus-shared/actors/builtin/miner/state.v5.go create mode 100644 venus-shared/actors/builtin/miner/state.v6.go create mode 100644 venus-shared/actors/builtin/multisig/actor.go create mode 100644 venus-shared/actors/builtin/multisig/message.v0.go create mode 100644 venus-shared/actors/builtin/multisig/message.v2.go create mode 100644 venus-shared/actors/builtin/multisig/message.v3.go create mode 100644 venus-shared/actors/builtin/multisig/message.v4.go create mode 100644 venus-shared/actors/builtin/multisig/message.v5.go create mode 100644 venus-shared/actors/builtin/multisig/message.v6.go create mode 100644 venus-shared/actors/builtin/multisig/state.v0.go create mode 100644 venus-shared/actors/builtin/multisig/state.v2.go create mode 100644 venus-shared/actors/builtin/multisig/state.v3.go create mode 100644 venus-shared/actors/builtin/multisig/state.v4.go create mode 100644 venus-shared/actors/builtin/multisig/state.v5.go create mode 100644 venus-shared/actors/builtin/multisig/state.v6.go create mode 100644 venus-shared/actors/builtin/paych/actor.go create mode 100644 venus-shared/actors/builtin/paych/message.v0.go create mode 100644 venus-shared/actors/builtin/paych/message.v2.go create mode 100644 venus-shared/actors/builtin/paych/message.v3.go create mode 100644 venus-shared/actors/builtin/paych/message.v4.go create mode 100644 venus-shared/actors/builtin/paych/message.v5.go create mode 100644 venus-shared/actors/builtin/paych/message.v6.go create mode 100644 venus-shared/actors/builtin/paych/state.v0.go create mode 100644 venus-shared/actors/builtin/paych/state.v2.go create mode 100644 venus-shared/actors/builtin/paych/state.v3.go create mode 100644 venus-shared/actors/builtin/paych/state.v4.go create mode 100644 venus-shared/actors/builtin/paych/state.v5.go create mode 100644 venus-shared/actors/builtin/paych/state.v6.go create mode 100644 venus-shared/actors/builtin/power/actor.go create mode 100644 venus-shared/actors/builtin/power/state.v0.go create mode 100644 venus-shared/actors/builtin/power/state.v2.go create mode 100644 venus-shared/actors/builtin/power/state.v3.go create mode 100644 venus-shared/actors/builtin/power/state.v4.go create mode 100644 venus-shared/actors/builtin/power/state.v5.go create mode 100644 venus-shared/actors/builtin/power/state.v6.go create mode 100644 venus-shared/actors/builtin/reward/actor.go create mode 100644 venus-shared/actors/builtin/reward/state.v0.go create mode 100644 venus-shared/actors/builtin/reward/state.v2.go create mode 100644 venus-shared/actors/builtin/reward/state.v3.go create mode 100644 venus-shared/actors/builtin/reward/state.v4.go create mode 100644 venus-shared/actors/builtin/reward/state.v5.go create mode 100644 venus-shared/actors/builtin/reward/state.v6.go create mode 100644 venus-shared/actors/builtin/system/actor.go create mode 100644 venus-shared/actors/builtin/system/state.v0.go create mode 100644 venus-shared/actors/builtin/system/state.v2.go create mode 100644 venus-shared/actors/builtin/system/state.v3.go create mode 100644 venus-shared/actors/builtin/system/state.v4.go create mode 100644 venus-shared/actors/builtin/system/state.v5.go create mode 100644 venus-shared/actors/builtin/system/state.v6.go create mode 100644 venus-shared/actors/builtin/verifreg/actor.go create mode 100644 venus-shared/actors/builtin/verifreg/state.v0.go create mode 100644 venus-shared/actors/builtin/verifreg/state.v2.go create mode 100644 venus-shared/actors/builtin/verifreg/state.v3.go create mode 100644 venus-shared/actors/builtin/verifreg/state.v4.go create mode 100644 venus-shared/actors/builtin/verifreg/state.v5.go create mode 100644 venus-shared/actors/builtin/verifreg/state.v6.go create mode 100644 venus-shared/actors/builtin/verifreg/util.go create mode 100644 venus-shared/actors/params.go create mode 100644 venus-shared/actors/version.go create mode 100644 venus-shared/compatible-checks/actor-sources.txt rename venus-shared/compatible-checks/{actor-template.txt => actor-templates.txt} (100%) diff --git a/Makefile b/Makefile index a1c844e5d5..d6ae39821f 100644 --- a/Makefile +++ b/Makefile @@ -8,10 +8,13 @@ test: test-venus-shared compatible-all: compatible-actor -compatible-actor: actor-template actor-render +compatible-actor: actor-templates actor-sources actor-render -actor-template: - cd venus-devtool && go run ./compatible/actors/*.go templates --dst ../venus-shared/actors/ > ../venus-shared/compatible-checks/actor-template.txt +actor-templates: + cd venus-devtool && go run ./compatible/actors/*.go templates --dst ../venus-shared/actors/ > ../venus-shared/compatible-checks/actor-templates.txt + +actor-sources: + cd venus-devtool && go run ./compatible/actors/*.go sources > ../venus-shared/compatible-checks/actor-sources.txt actor-render: cd venus-devtool && go run ./compatible/actors/*.go render ../venus-shared/actors/ diff --git a/venus-devtool/compatible/TODO.md b/venus-devtool/compatible/TODO.md new file mode 100644 index 0000000000..2ddf930307 --- /dev/null +++ b/venus-devtool/compatible/TODO.md @@ -0,0 +1,3 @@ +# TODO Items for Compatible Checks Between Lotus & Venus +- [ ] venus-shared/actors/version.go +- [ ] upgrade schedules diff --git a/venus-devtool/compatible/actors/list.go b/venus-devtool/compatible/actors/list.go new file mode 100644 index 0000000000..fb456731fb --- /dev/null +++ b/venus-devtool/compatible/actors/list.go @@ -0,0 +1,37 @@ +package main + +import ( + "fmt" + "io/fs" + "os" + "sort" + "strings" +) + +func listFilesInDir(dir string, ext string) ([]string, error) { + var paths []string + + err := fs.WalkDir(os.DirFS(dir), ".", func(path string, d fs.DirEntry, err error) error { + if err != nil { + return fmt.Errorf("walking %s: %w", path, err) + } + + if d.IsDir() { + return nil + } + + if !strings.HasSuffix(path, ext) { + return nil + } + + paths = append(paths, path) + return nil + }) + + if err != nil { + return nil, fmt.Errorf("walk through the chain/actors subdir: %w", err) + } + + sort.Strings(paths) + return paths, nil +} diff --git a/venus-devtool/compatible/actors/main.go b/venus-devtool/compatible/actors/main.go index d421a5b281..8bcc6919dd 100644 --- a/venus-devtool/compatible/actors/main.go +++ b/venus-devtool/compatible/actors/main.go @@ -16,6 +16,7 @@ func main() { EnableBashCompletion: true, Flags: []cli.Flag{}, Commands: []*cli.Command{ + sourcesCmd, templatesCmd, renderCmd, }, @@ -37,12 +38,16 @@ var templatesCmd = &cli.Command{ }, }, Action: func(c *cli.Context) error { - srcDir, paths, err := listTemplates() + srcDir, err := findActorsPkgDir() if err != nil { - return err + return fmt.Errorf("find chain/actors: %w", err) } log.Println("listing") + paths, err := listFilesInDir(srcDir, goTemplateExt) + if err != nil { + return fmt.Errorf("list template files: %w", err) + } fmt.Println("TEMPLATES IN chain/actors:") @@ -80,7 +85,7 @@ var renderCmd = &cli.Command{ return fmt.Errorf("get abs path for %s: %w", dir, err) } - templates, err := listTemplateInDir(abs) + templates, err := listFilesInDir(dir, goTemplateExt) if err != nil { return fmt.Errorf("list templates in %s: %w", abs, err) } @@ -98,3 +103,25 @@ var renderCmd = &cli.Command{ return nil }, } + +var sourcesCmd = &cli.Command{ + Name: "sources", + Action: func(cctx *cli.Context) error { + srcDir, err := findActorsPkgDir() + if err != nil { + return fmt.Errorf("find chain/actors: %w", err) + } + + files, err := listFilesInDir(srcDir, goSourceCodeExt) + if err != nil { + return fmt.Errorf("list source code files: %w", err) + } + + fmt.Println("SOURCES IN chain/actors:") + + for _, p := range files { + fmt.Printf("\t%s\n", p) + } + return nil + }, +} diff --git a/venus-devtool/compatible/actors/source.go b/venus-devtool/compatible/actors/source.go new file mode 100644 index 0000000000..06ab7d0f9a --- /dev/null +++ b/venus-devtool/compatible/actors/source.go @@ -0,0 +1 @@ +package main diff --git a/venus-devtool/compatible/actors/templates.go b/venus-devtool/compatible/actors/templates.go index b1efea44c2..a14292ce3d 100644 --- a/venus-devtool/compatible/actors/templates.go +++ b/venus-devtool/compatible/actors/templates.go @@ -5,15 +5,15 @@ import ( "fmt" "go/build" "io" - "io/fs" "log" "os" "path/filepath" - "sort" "strings" ) const ( + goSourceCodeExt = ".go" + goTemplateExt = ".go.template" goTemplateExtLen = len(goTemplateExt) @@ -45,46 +45,13 @@ var replacers = [][2]string{ }, } -func listTemplates() (string, []string, error) { +func findActorsPkgDir() (string, error) { pkg, err := build.Import("github.com/filecoin-project/lotus/chain/actors", ".", build.FindOnly) if err != nil { - return "", nil, fmt.Errorf("find local build path for louts: %w", err) - } - - paths, err := listTemplateInDir(pkg.Dir) - if err != nil { - return "", nil, fmt.Errorf("list template in dir %s: %w", pkg.Dir, err) - } - - return pkg.Dir, paths, nil -} - -func listTemplateInDir(dir string) ([]string, error) { - var paths []string - - err := fs.WalkDir(os.DirFS(dir), ".", func(path string, d fs.DirEntry, err error) error { - if err != nil { - return fmt.Errorf("walking %s: %w", path, err) - } - - if d.IsDir() { - return nil - } - - if !strings.HasSuffix(path, goTemplateExt) { - return nil - } - - paths = append(paths, path) - return nil - }) - - if err != nil { - return nil, fmt.Errorf("walk through the chain/actors subdir: %w", err) + return "", fmt.Errorf("find local build path for louts: %w", err) } - sort.Strings(paths) - return paths, nil + return pkg.Dir, nil } func fetch(src, dst string, paths []string) error { diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index 5a32bf1349..991e272da4 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -4,6 +4,7 @@ go 1.16 require ( github.com/filecoin-project/lotus v1.12.0 + github.com/filecoin-project/specs-actors/v6 v6.0.1 // indirect github.com/filecoin-project/venus/venus-shared v0.0.1 github.com/urfave/cli/v2 v2.2.0 // indirect github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index 9c09ecb544..14f0044def 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -228,6 +228,8 @@ github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be/go.m github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5 h1:SSaFT/5aLfPXycUlFyemoHYhRgdyXClXCyDdNJKPlDM= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= +github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= github.com/filecoin-project/go-amt-ipld/v2 v2.0.1-0.20200424220931-6263827e49f2/go.mod h1:boRtQhzmxNocrMxOXo1NYn4oUc1NGvR8tEa79wApNXg= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= @@ -312,6 +314,8 @@ github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNP github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= github.com/filecoin-project/specs-actors/v6 v6.0.0 h1:i+16MFE8GScWWUF0kG7x2RZ5Hqpz0CeyBHTpnijCJ6I= github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= +github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -908,6 +912,7 @@ github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.6 h1:3S8g006qG6Tjpj1JdRK2S+TWc2DJQKX/RG9fdLeiLSU= github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= +github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -1588,6 +1593,7 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 h1:7WtW9D9VGpmRLuQmrPy2JobUNdka95z3MKEVpELtOjo= github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= diff --git a/venus-shared/actors/adt/adt.go b/venus-shared/actors/adt/adt.go new file mode 100644 index 0000000000..084471bb8f --- /dev/null +++ b/venus-shared/actors/adt/adt.go @@ -0,0 +1,29 @@ +package adt + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/cbor" +) + +type Map interface { + Root() (cid.Cid, error) + + Put(k abi.Keyer, v cbor.Marshaler) error + Get(k abi.Keyer, v cbor.Unmarshaler) (bool, error) + Delete(k abi.Keyer) error + + ForEach(v cbor.Unmarshaler, fn func(key string) error) error +} + +type Array interface { + Root() (cid.Cid, error) + + Set(idx uint64, v cbor.Marshaler) error + Get(idx uint64, v cbor.Unmarshaler) (bool, error) + Delete(idx uint64) error + Length() uint64 + + ForEach(v cbor.Unmarshaler, fn func(idx int64) error) error +} diff --git a/venus-shared/actors/adt/diff_adt.go b/venus-shared/actors/adt/diff_adt.go new file mode 100644 index 0000000000..76a881a95e --- /dev/null +++ b/venus-shared/actors/adt/diff_adt.go @@ -0,0 +1,122 @@ +package adt + +import ( + "bytes" + + "github.com/filecoin-project/go-state-types/abi" + typegen "github.com/whyrusleeping/cbor-gen" +) + +// AdtArrayDiff generalizes adt.Array diffing by accepting a Deferred type that can unmarshalled to its corresponding struct +// in an interface implantation. +// Add should be called when a new k,v is added to the array +// Modify should be called when a value is modified in the array +// Remove should be called when a value is removed from the array +type AdtArrayDiff interface { //nolint + Add(key uint64, val *typegen.Deferred) error + Modify(key uint64, from, to *typegen.Deferred) error + Remove(key uint64, val *typegen.Deferred) error +} + +// TODO Performance can be improved by diffing the underlying IPLD graph, e.g. https://github.com/ipfs/go-merkledag/blob/749fd8717d46b4f34c9ce08253070079c89bc56d/dagutils/diff.go#L104 +// CBOR Marshaling will likely be the largest performance bottleneck here. + +// DiffAdtArray accepts two *adt.Array's and an AdtArrayDiff implementation. It does the following: +// - All values that exist in preArr and not in curArr are passed to AdtArrayDiff.Remove() +// - All values that exist in curArr nnd not in prevArr are passed to adtArrayDiff.Add() +// - All values that exist in preArr and in curArr are passed to AdtArrayDiff.Modify() +// - It is the responsibility of AdtArrayDiff.Modify() to determine if the values it was passed have been modified. +func DiffAdtArray(preArr, curArr Array, out AdtArrayDiff) error { + notNew := make(map[int64]struct{}, curArr.Length()) + prevVal := new(typegen.Deferred) + if err := preArr.ForEach(prevVal, func(i int64) error { + curVal := new(typegen.Deferred) + found, err := curArr.Get(uint64(i), curVal) + if err != nil { + return err + } + if !found { + if err := out.Remove(uint64(i), prevVal); err != nil { + return err + } + return nil + } + + // no modification + if !bytes.Equal(prevVal.Raw, curVal.Raw) { + if err := out.Modify(uint64(i), prevVal, curVal); err != nil { + return err + } + } + notNew[i] = struct{}{} + return nil + }); err != nil { + return err + } + + curVal := new(typegen.Deferred) + return curArr.ForEach(curVal, func(i int64) error { + if _, ok := notNew[i]; ok { + return nil + } + return out.Add(uint64(i), curVal) + }) +} + +// TODO Performance can be improved by diffing the underlying IPLD graph, e.g. https://github.com/ipfs/go-merkledag/blob/749fd8717d46b4f34c9ce08253070079c89bc56d/dagutils/diff.go#L104 +// CBOR Marshaling will likely be the largest performance bottleneck here. + +// AdtMapDiff generalizes adt.Map diffing by accepting a Deferred type that can unmarshalled to its corresponding struct +// in an interface implantation. +// AsKey should return the Keyer implementation specific to the map +// Add should be called when a new k,v is added to the map +// Modify should be called when a value is modified in the map +// Remove should be called when a value is removed from the map +type AdtMapDiff interface { //nolint + AsKey(key string) (abi.Keyer, error) + Add(key string, val *typegen.Deferred) error + Modify(key string, from, to *typegen.Deferred) error + Remove(key string, val *typegen.Deferred) error +} + +func DiffAdtMap(preMap, curMap Map, out AdtMapDiff) error { + notNew := make(map[string]struct{}) + prevVal := new(typegen.Deferred) + if err := preMap.ForEach(prevVal, func(key string) error { + curVal := new(typegen.Deferred) + k, err := out.AsKey(key) + if err != nil { + return err + } + + found, err := curMap.Get(k, curVal) + if err != nil { + return err + } + if !found { + if err := out.Remove(key, prevVal); err != nil { + return err + } + return nil + } + + // no modification + if !bytes.Equal(prevVal.Raw, curVal.Raw) { + if err := out.Modify(key, prevVal, curVal); err != nil { + return err + } + } + notNew[key] = struct{}{} + return nil + }); err != nil { + return err + } + + curVal := new(typegen.Deferred) + return curMap.ForEach(curVal, func(key string) error { + if _, ok := notNew[key]; ok { + return nil + } + return out.Add(key, curVal) + }) +} diff --git a/venus-shared/actors/adt/store.go b/venus-shared/actors/adt/store.go new file mode 100644 index 0000000000..8dd9841a15 --- /dev/null +++ b/venus-shared/actors/adt/store.go @@ -0,0 +1,17 @@ +package adt + +import ( + "context" + + adt "github.com/filecoin-project/specs-actors/actors/util/adt" + cbor "github.com/ipfs/go-ipld-cbor" +) + +type Store interface { + Context() context.Context + cbor.IpldStore +} + +func WrapStore(ctx context.Context, store cbor.IpldStore) Store { + return adt.WrapStore(ctx, store) +} diff --git a/venus-shared/actors/aerrors/error.go b/venus-shared/actors/aerrors/error.go new file mode 100644 index 0000000000..12f802c8fc --- /dev/null +++ b/venus-shared/actors/aerrors/error.go @@ -0,0 +1,69 @@ +package aerrors + +import ( + "fmt" + + "github.com/filecoin-project/go-state-types/exitcode" + "golang.org/x/xerrors" +) + +func IsFatal(err ActorError) bool { + return err != nil && err.IsFatal() +} +func RetCode(err ActorError) exitcode.ExitCode { + if err == nil { + return 0 + } + return err.RetCode() +} + +type internalActorError interface { + ActorError + FormatError(p xerrors.Printer) (next error) + Unwrap() error +} + +type ActorError interface { + error + IsFatal() bool + RetCode() exitcode.ExitCode +} + +type actorError struct { + fatal bool + retCode exitcode.ExitCode + + msg string + frame xerrors.Frame + err error +} + +func (e *actorError) IsFatal() bool { + return e.fatal +} + +func (e *actorError) RetCode() exitcode.ExitCode { + return e.retCode +} + +func (e *actorError) Error() string { + return fmt.Sprint(e) +} +func (e *actorError) Format(s fmt.State, v rune) { xerrors.FormatError(e, s, v) } +func (e *actorError) FormatError(p xerrors.Printer) (next error) { + p.Print(e.msg) + if e.fatal { + p.Print(" (FATAL)") + } else { + p.Printf(" (RetCode=%d)", e.retCode) + } + + e.frame.Format(p) + return e.err +} + +func (e *actorError) Unwrap() error { + return e.err +} + +var _ internalActorError = (*actorError)(nil) diff --git a/venus-shared/actors/aerrors/wrap.go b/venus-shared/actors/aerrors/wrap.go new file mode 100644 index 0000000000..0552829f91 --- /dev/null +++ b/venus-shared/actors/aerrors/wrap.go @@ -0,0 +1,203 @@ +package aerrors + +import ( + "errors" + "fmt" + + "github.com/filecoin-project/go-state-types/exitcode" + cbor "github.com/ipfs/go-ipld-cbor" + "golang.org/x/xerrors" +) + +// New creates a new non-fatal error +func New(retCode exitcode.ExitCode, message string) ActorError { + if retCode == 0 { + return &actorError{ + fatal: true, + retCode: 0, + + msg: "tried creating an error and setting RetCode to 0", + frame: xerrors.Caller(1), + err: errors.New(message), + } + } + return &actorError{ + retCode: retCode, + + msg: message, + frame: xerrors.Caller(1), + } +} + +// Newf creates a new non-fatal error +func Newf(retCode exitcode.ExitCode, format string, args ...interface{}) ActorError { + if retCode == 0 { + return &actorError{ + fatal: true, + retCode: 0, + + msg: "tried creating an error and setting RetCode to 0", + frame: xerrors.Caller(1), + err: fmt.Errorf(format, args...), + } + } + return &actorError{ + retCode: retCode, + + msg: fmt.Sprintf(format, args...), + frame: xerrors.Caller(1), + } +} + +// todo: bit hacky + +func NewfSkip(skip int, retCode exitcode.ExitCode, format string, args ...interface{}) ActorError { + if retCode == 0 { + return &actorError{ + fatal: true, + retCode: 0, + + msg: "tried creating an error and setting RetCode to 0", + frame: xerrors.Caller(skip), + err: fmt.Errorf(format, args...), + } + } + return &actorError{ + retCode: retCode, + + msg: fmt.Sprintf(format, args...), + frame: xerrors.Caller(skip), + } +} + +func Fatal(message string, args ...interface{}) ActorError { + return &actorError{ + fatal: true, + msg: message, + frame: xerrors.Caller(1), + } +} + +func Fatalf(format string, args ...interface{}) ActorError { + return &actorError{ + fatal: true, + msg: fmt.Sprintf(format, args...), + frame: xerrors.Caller(1), + } +} + +// Wrap extens chain of errors with a message +func Wrap(err ActorError, message string) ActorError { + if err == nil { + return nil + } + return &actorError{ + fatal: IsFatal(err), + retCode: RetCode(err), + + msg: message, + frame: xerrors.Caller(1), + err: err, + } +} + +// Wrapf extens chain of errors with a message +func Wrapf(err ActorError, format string, args ...interface{}) ActorError { + if err == nil { + return nil + } + return &actorError{ + fatal: IsFatal(err), + retCode: RetCode(err), + + msg: fmt.Sprintf(format, args...), + frame: xerrors.Caller(1), + err: err, + } +} + +// Absorb takes and error and makes in not fatal ActorError +func Absorb(err error, retCode exitcode.ExitCode, msg string) ActorError { + if err == nil { + return nil + } + if aerr, ok := err.(ActorError); ok && IsFatal(aerr) { + return &actorError{ + fatal: true, + retCode: 0, + + msg: "tried absorbing an error that is already a fatal error", + frame: xerrors.Caller(1), + err: err, + } + } + if retCode == 0 { + return &actorError{ + fatal: true, + retCode: 0, + + msg: "tried absorbing an error and setting RetCode to 0", + frame: xerrors.Caller(1), + err: err, + } + } + + return &actorError{ + fatal: false, + retCode: retCode, + + msg: msg, + frame: xerrors.Caller(1), + err: err, + } +} + +// Escalate takes and error and escalates it into a fatal error +func Escalate(err error, msg string) ActorError { + if err == nil { + return nil + } + return &actorError{ + fatal: true, + + msg: msg, + frame: xerrors.Caller(1), + err: err, + } +} + +func HandleExternalError(err error, msg string) ActorError { + if err == nil { + return nil + } + + if aerr, ok := err.(ActorError); ok { + return &actorError{ + fatal: IsFatal(aerr), + retCode: RetCode(aerr), + + msg: msg, + frame: xerrors.Caller(1), + err: aerr, + } + } + + if xerrors.Is(err, &cbor.SerializationError{}) { + return &actorError{ + fatal: false, + retCode: 253, + msg: msg, + frame: xerrors.Caller(1), + err: err, + } + } + + return &actorError{ + fatal: false, + retCode: 219, + + msg: msg, + frame: xerrors.Caller(1), + err: err, + } +} diff --git a/venus-shared/actors/builtin/account/actor.go b/venus-shared/actors/builtin/account/actor.go new file mode 100644 index 0000000000..d339446c8e --- /dev/null +++ b/venus-shared/actors/builtin/account/actor.go @@ -0,0 +1,140 @@ +// FETCHED FROM LOTUS: builtin/account/actor.go.template + +package account + +import ( + "github.com/filecoin-project/venus/venus-shared/actors" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/cbor" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" +) + +func init() { + + builtin.RegisterActorState(builtin0.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + + builtin.RegisterActorState(builtin2.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + + builtin.RegisterActorState(builtin3.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + + builtin.RegisterActorState(builtin4.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + + builtin.RegisterActorState(builtin5.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + + builtin.RegisterActorState(builtin6.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) +} + +var Methods = builtin4.MethodsAccount + +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { + + case builtin0.AccountActorCodeID: + return load0(store, act.Head) + + case builtin2.AccountActorCodeID: + return load2(store, act.Head) + + case builtin3.AccountActorCodeID: + return load3(store, act.Head) + + case builtin4.AccountActorCodeID: + return load4(store, act.Head) + + case builtin5.AccountActorCodeID: + return load5(store, act.Head) + + case builtin6.AccountActorCodeID: + return load6(store, act.Head) + + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, error) { + switch av { + + case actors.Version0: + return make0(store, addr) + + case actors.Version2: + return make2(store, addr) + + case actors.Version3: + return make3(store, addr) + + case actors.Version4: + return make4(store, addr) + + case actors.Version5: + return make5(store, addr) + + case actors.Version6: + return make6(store, addr) + + } + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { + + case actors.Version0: + return builtin0.AccountActorCodeID, nil + + case actors.Version2: + return builtin2.AccountActorCodeID, nil + + case actors.Version3: + return builtin3.AccountActorCodeID, nil + + case actors.Version4: + return builtin4.AccountActorCodeID, nil + + case actors.Version5: + return builtin5.AccountActorCodeID, nil + + case actors.Version6: + return builtin6.AccountActorCodeID, nil + + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + cbor.Marshaler + + PubkeyAddress() (address.Address, error) + GetState() interface{} +} diff --git a/venus-shared/actors/builtin/account/state.v0.go b/venus-shared/actors/builtin/account/state.v0.go new file mode 100644 index 0000000000..e3f442b83f --- /dev/null +++ b/venus-shared/actors/builtin/account/state.v0.go @@ -0,0 +1,42 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + +package account + +import ( + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + account0 "github.com/filecoin-project/specs-actors/actors/builtin/account" +) + +var _ State = (*state0)(nil) + +func load0(store adt.Store, root cid.Cid) (State, error) { + out := state0{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make0(store adt.Store, addr address.Address) (State, error) { + out := state0{store: store} + out.State = account0.State{Address: addr} + return &out, nil +} + +type state0 struct { + account0.State + store adt.Store +} + +func (s *state0) PubkeyAddress() (address.Address, error) { + return s.Address, nil +} + +func (s *state0) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/account/state.v2.go b/venus-shared/actors/builtin/account/state.v2.go new file mode 100644 index 0000000000..27e3082740 --- /dev/null +++ b/venus-shared/actors/builtin/account/state.v2.go @@ -0,0 +1,42 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + +package account + +import ( + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + account2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/account" +) + +var _ State = (*state2)(nil) + +func load2(store adt.Store, root cid.Cid) (State, error) { + out := state2{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make2(store adt.Store, addr address.Address) (State, error) { + out := state2{store: store} + out.State = account2.State{Address: addr} + return &out, nil +} + +type state2 struct { + account2.State + store adt.Store +} + +func (s *state2) PubkeyAddress() (address.Address, error) { + return s.Address, nil +} + +func (s *state2) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/account/state.v3.go b/venus-shared/actors/builtin/account/state.v3.go new file mode 100644 index 0000000000..0d51da82b6 --- /dev/null +++ b/venus-shared/actors/builtin/account/state.v3.go @@ -0,0 +1,42 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + +package account + +import ( + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + account3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/account" +) + +var _ State = (*state3)(nil) + +func load3(store adt.Store, root cid.Cid) (State, error) { + out := state3{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make3(store adt.Store, addr address.Address) (State, error) { + out := state3{store: store} + out.State = account3.State{Address: addr} + return &out, nil +} + +type state3 struct { + account3.State + store adt.Store +} + +func (s *state3) PubkeyAddress() (address.Address, error) { + return s.Address, nil +} + +func (s *state3) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/account/state.v4.go b/venus-shared/actors/builtin/account/state.v4.go new file mode 100644 index 0000000000..20c752440f --- /dev/null +++ b/venus-shared/actors/builtin/account/state.v4.go @@ -0,0 +1,42 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + +package account + +import ( + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + account4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/account" +) + +var _ State = (*state4)(nil) + +func load4(store adt.Store, root cid.Cid) (State, error) { + out := state4{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make4(store adt.Store, addr address.Address) (State, error) { + out := state4{store: store} + out.State = account4.State{Address: addr} + return &out, nil +} + +type state4 struct { + account4.State + store adt.Store +} + +func (s *state4) PubkeyAddress() (address.Address, error) { + return s.Address, nil +} + +func (s *state4) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/account/state.v5.go b/venus-shared/actors/builtin/account/state.v5.go new file mode 100644 index 0000000000..a70c10aba0 --- /dev/null +++ b/venus-shared/actors/builtin/account/state.v5.go @@ -0,0 +1,42 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + +package account + +import ( + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + account5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/account" +) + +var _ State = (*state5)(nil) + +func load5(store adt.Store, root cid.Cid) (State, error) { + out := state5{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make5(store adt.Store, addr address.Address) (State, error) { + out := state5{store: store} + out.State = account5.State{Address: addr} + return &out, nil +} + +type state5 struct { + account5.State + store adt.Store +} + +func (s *state5) PubkeyAddress() (address.Address, error) { + return s.Address, nil +} + +func (s *state5) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/account/state.v6.go b/venus-shared/actors/builtin/account/state.v6.go new file mode 100644 index 0000000000..6dff2bc031 --- /dev/null +++ b/venus-shared/actors/builtin/account/state.v6.go @@ -0,0 +1,42 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + +package account + +import ( + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + account6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/account" +) + +var _ State = (*state6)(nil) + +func load6(store adt.Store, root cid.Cid) (State, error) { + out := state6{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make6(store adt.Store, addr address.Address) (State, error) { + out := state6{store: store} + out.State = account6.State{Address: addr} + return &out, nil +} + +type state6 struct { + account6.State + store adt.Store +} + +func (s *state6) PubkeyAddress() (address.Address, error) { + return s.Address, nil +} + +func (s *state6) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/builtin.go b/venus-shared/actors/builtin/builtin.go new file mode 100644 index 0000000000..08c77094ff --- /dev/null +++ b/venus-shared/actors/builtin/builtin.go @@ -0,0 +1,300 @@ +// FETCHED FROM LOTUS: builtin/builtin.go.template + +package builtin + +import ( + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + "golang.org/x/xerrors" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + smoothing2 "github.com/filecoin-project/specs-actors/v2/actors/util/smoothing" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + smoothing3 "github.com/filecoin-project/specs-actors/v3/actors/util/smoothing" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + smoothing4 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + smoothing5 "github.com/filecoin-project/specs-actors/v5/actors/util/smoothing" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/cbor" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + types "github.com/filecoin-project/venus/venus-shared/chain" + + miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" + proof6 "github.com/filecoin-project/specs-actors/v6/actors/runtime/proof" +) + +var SystemActorAddr = builtin6.SystemActorAddr +var BurntFundsActorAddr = builtin6.BurntFundsActorAddr +var CronActorAddr = builtin6.CronActorAddr +var SaftAddress = makeAddress("t0122") +var ReserveAddress = makeAddress("t090") +var RootVerifierAddress = makeAddress("t080") + +var ( + ExpectedLeadersPerEpoch = builtin6.ExpectedLeadersPerEpoch +) + +const ( + EpochDurationSeconds = builtin6.EpochDurationSeconds + EpochsInDay = builtin6.EpochsInDay + SecondsInDay = builtin6.SecondsInDay +) + +const ( + MethodSend = builtin6.MethodSend + MethodConstructor = builtin6.MethodConstructor +) + +// These are all just type aliases across actor versions. In the future, that might change +// and we might need to do something fancier. +type SectorInfo = proof6.SectorInfo +type PoStProof = proof6.PoStProof +type FilterEstimate = smoothing0.FilterEstimate + +func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, verifiedWeight abi.DealWeight) abi.StoragePower { + return miner6.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) +} + +func FromV0FilterEstimate(v0 smoothing0.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v0) //nolint:unconvert + +} + +func FromV2FilterEstimate(v2 smoothing2.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v2) + +} + +func FromV3FilterEstimate(v3 smoothing3.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v3) + +} + +func FromV4FilterEstimate(v4 smoothing4.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v4) + +} + +func FromV5FilterEstimate(v5 smoothing5.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v5) + +} + +func FromV6FilterEstimate(v6 smoothing6.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v6) + +} + +type ActorStateLoader func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) + +var ActorStateLoaders = make(map[cid.Cid]ActorStateLoader) + +func RegisterActorState(code cid.Cid, loader ActorStateLoader) { + ActorStateLoaders[code] = loader +} + +func Load(store adt.Store, act *types.Actor) (cbor.Marshaler, error) { + loader, found := ActorStateLoaders[act.Code] + if !found { + return nil, xerrors.Errorf("unknown actor code %s", act.Code) + } + return loader(store, act.Head) +} + +func ActorNameByCode(c cid.Cid) string { + switch { + + case builtin0.IsBuiltinActor(c): + return builtin0.ActorNameByCode(c) + + case builtin2.IsBuiltinActor(c): + return builtin2.ActorNameByCode(c) + + case builtin3.IsBuiltinActor(c): + return builtin3.ActorNameByCode(c) + + case builtin4.IsBuiltinActor(c): + return builtin4.ActorNameByCode(c) + + case builtin5.IsBuiltinActor(c): + return builtin5.ActorNameByCode(c) + + case builtin6.IsBuiltinActor(c): + return builtin6.ActorNameByCode(c) + + default: + return "" + } +} + +func IsBuiltinActor(c cid.Cid) bool { + + if builtin0.IsBuiltinActor(c) { + return true + } + + if builtin2.IsBuiltinActor(c) { + return true + } + + if builtin3.IsBuiltinActor(c) { + return true + } + + if builtin4.IsBuiltinActor(c) { + return true + } + + if builtin5.IsBuiltinActor(c) { + return true + } + + if builtin6.IsBuiltinActor(c) { + return true + } + + return false +} + +func IsAccountActor(c cid.Cid) bool { + + if c == builtin0.AccountActorCodeID { + return true + } + + if c == builtin2.AccountActorCodeID { + return true + } + + if c == builtin3.AccountActorCodeID { + return true + } + + if c == builtin4.AccountActorCodeID { + return true + } + + if c == builtin5.AccountActorCodeID { + return true + } + + if c == builtin6.AccountActorCodeID { + return true + } + + return false +} + +func IsStorageMinerActor(c cid.Cid) bool { + + if c == builtin0.StorageMinerActorCodeID { + return true + } + + if c == builtin2.StorageMinerActorCodeID { + return true + } + + if c == builtin3.StorageMinerActorCodeID { + return true + } + + if c == builtin4.StorageMinerActorCodeID { + return true + } + + if c == builtin5.StorageMinerActorCodeID { + return true + } + + if c == builtin6.StorageMinerActorCodeID { + return true + } + + return false +} + +func IsMultisigActor(c cid.Cid) bool { + + if c == builtin0.MultisigActorCodeID { + return true + } + + if c == builtin2.MultisigActorCodeID { + return true + } + + if c == builtin3.MultisigActorCodeID { + return true + } + + if c == builtin4.MultisigActorCodeID { + return true + } + + if c == builtin5.MultisigActorCodeID { + return true + } + + if c == builtin6.MultisigActorCodeID { + return true + } + + return false +} + +func IsPaymentChannelActor(c cid.Cid) bool { + + if c == builtin0.PaymentChannelActorCodeID { + return true + } + + if c == builtin2.PaymentChannelActorCodeID { + return true + } + + if c == builtin3.PaymentChannelActorCodeID { + return true + } + + if c == builtin4.PaymentChannelActorCodeID { + return true + } + + if c == builtin5.PaymentChannelActorCodeID { + return true + } + + if c == builtin6.PaymentChannelActorCodeID { + return true + } + + return false +} + +func makeAddress(addr string) address.Address { + ret, err := address.NewFromString(addr) + if err != nil { + panic(err) + } + + return ret +} diff --git a/venus-shared/actors/builtin/cron/actor.go b/venus-shared/actors/builtin/cron/actor.go new file mode 100644 index 0000000000..0ff5c89426 --- /dev/null +++ b/venus-shared/actors/builtin/cron/actor.go @@ -0,0 +1,82 @@ +// FETCHED FROM LOTUS: builtin/cron/actor.go.template + +package cron + +import ( + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/ipfs/go-cid" + "golang.org/x/xerrors" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" +) + +func MakeState(store adt.Store, av actors.Version) (State, error) { + switch av { + + case actors.Version0: + return make0(store) + + case actors.Version2: + return make2(store) + + case actors.Version3: + return make3(store) + + case actors.Version4: + return make4(store) + + case actors.Version5: + return make5(store) + + case actors.Version6: + return make6(store) + + } + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { + + case actors.Version0: + return builtin0.CronActorCodeID, nil + + case actors.Version2: + return builtin2.CronActorCodeID, nil + + case actors.Version3: + return builtin3.CronActorCodeID, nil + + case actors.Version4: + return builtin4.CronActorCodeID, nil + + case actors.Version5: + return builtin5.CronActorCodeID, nil + + case actors.Version6: + return builtin6.CronActorCodeID, nil + + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +var ( + Address = builtin6.CronActorAddr + Methods = builtin6.MethodsCron +) + +type State interface { + GetState() interface{} +} diff --git a/venus-shared/actors/builtin/cron/state.v0.go b/venus-shared/actors/builtin/cron/state.v0.go new file mode 100644 index 0000000000..ba0f37d5b6 --- /dev/null +++ b/venus-shared/actors/builtin/cron/state.v0.go @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + +package cron + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + cron0 "github.com/filecoin-project/specs-actors/actors/builtin/cron" +) + +var _ State = (*state0)(nil) + +func load0(store adt.Store, root cid.Cid) (State, error) { + out := state0{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make0(store adt.Store) (State, error) { + out := state0{store: store} + out.State = *cron0.ConstructState(cron0.BuiltInEntries()) + return &out, nil +} + +type state0 struct { + cron0.State + store adt.Store +} + +func (s *state0) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/cron/state.v2.go b/venus-shared/actors/builtin/cron/state.v2.go new file mode 100644 index 0000000000..aff1f50282 --- /dev/null +++ b/venus-shared/actors/builtin/cron/state.v2.go @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + +package cron + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + cron2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/cron" +) + +var _ State = (*state2)(nil) + +func load2(store adt.Store, root cid.Cid) (State, error) { + out := state2{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make2(store adt.Store) (State, error) { + out := state2{store: store} + out.State = *cron2.ConstructState(cron2.BuiltInEntries()) + return &out, nil +} + +type state2 struct { + cron2.State + store adt.Store +} + +func (s *state2) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/cron/state.v3.go b/venus-shared/actors/builtin/cron/state.v3.go new file mode 100644 index 0000000000..b6a4a96121 --- /dev/null +++ b/venus-shared/actors/builtin/cron/state.v3.go @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + +package cron + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + cron3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/cron" +) + +var _ State = (*state3)(nil) + +func load3(store adt.Store, root cid.Cid) (State, error) { + out := state3{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make3(store adt.Store) (State, error) { + out := state3{store: store} + out.State = *cron3.ConstructState(cron3.BuiltInEntries()) + return &out, nil +} + +type state3 struct { + cron3.State + store adt.Store +} + +func (s *state3) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/cron/state.v4.go b/venus-shared/actors/builtin/cron/state.v4.go new file mode 100644 index 0000000000..0cd6d2c75e --- /dev/null +++ b/venus-shared/actors/builtin/cron/state.v4.go @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + +package cron + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + cron4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/cron" +) + +var _ State = (*state4)(nil) + +func load4(store adt.Store, root cid.Cid) (State, error) { + out := state4{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make4(store adt.Store) (State, error) { + out := state4{store: store} + out.State = *cron4.ConstructState(cron4.BuiltInEntries()) + return &out, nil +} + +type state4 struct { + cron4.State + store adt.Store +} + +func (s *state4) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/cron/state.v5.go b/venus-shared/actors/builtin/cron/state.v5.go new file mode 100644 index 0000000000..12cf83a649 --- /dev/null +++ b/venus-shared/actors/builtin/cron/state.v5.go @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + +package cron + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + cron5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/cron" +) + +var _ State = (*state5)(nil) + +func load5(store adt.Store, root cid.Cid) (State, error) { + out := state5{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make5(store adt.Store) (State, error) { + out := state5{store: store} + out.State = *cron5.ConstructState(cron5.BuiltInEntries()) + return &out, nil +} + +type state5 struct { + cron5.State + store adt.Store +} + +func (s *state5) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/cron/state.v6.go b/venus-shared/actors/builtin/cron/state.v6.go new file mode 100644 index 0000000000..7fe9cf8a2a --- /dev/null +++ b/venus-shared/actors/builtin/cron/state.v6.go @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + +package cron + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + cron6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/cron" +) + +var _ State = (*state6)(nil) + +func load6(store adt.Store, root cid.Cid) (State, error) { + out := state6{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make6(store adt.Store) (State, error) { + out := state6{store: store} + out.State = *cron6.ConstructState(cron6.BuiltInEntries()) + return &out, nil +} + +type state6 struct { + cron6.State + store adt.Store +} + +func (s *state6) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/init/actor.go b/venus-shared/actors/builtin/init/actor.go new file mode 100644 index 0000000000..9e31efd867 --- /dev/null +++ b/venus-shared/actors/builtin/init/actor.go @@ -0,0 +1,164 @@ +// FETCHED FROM LOTUS: builtin/init/actor.go.template + +package init + +import ( + "github.com/filecoin-project/venus/venus-shared/actors" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/cbor" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" +) + +func init() { + + builtin.RegisterActorState(builtin0.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + + builtin.RegisterActorState(builtin2.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + + builtin.RegisterActorState(builtin3.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + + builtin.RegisterActorState(builtin4.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + + builtin.RegisterActorState(builtin5.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + + builtin.RegisterActorState(builtin6.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) +} + +var ( + Address = builtin6.InitActorAddr + Methods = builtin6.MethodsInit +) + +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { + + case builtin0.InitActorCodeID: + return load0(store, act.Head) + + case builtin2.InitActorCodeID: + return load2(store, act.Head) + + case builtin3.InitActorCodeID: + return load3(store, act.Head) + + case builtin4.InitActorCodeID: + return load4(store, act.Head) + + case builtin5.InitActorCodeID: + return load5(store, act.Head) + + case builtin6.InitActorCodeID: + return load6(store, act.Head) + + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version, networkName string) (State, error) { + switch av { + + case actors.Version0: + return make0(store, networkName) + + case actors.Version2: + return make2(store, networkName) + + case actors.Version3: + return make3(store, networkName) + + case actors.Version4: + return make4(store, networkName) + + case actors.Version5: + return make5(store, networkName) + + case actors.Version6: + return make6(store, networkName) + + } + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { + + case actors.Version0: + return builtin0.InitActorCodeID, nil + + case actors.Version2: + return builtin2.InitActorCodeID, nil + + case actors.Version3: + return builtin3.InitActorCodeID, nil + + case actors.Version4: + return builtin4.InitActorCodeID, nil + + case actors.Version5: + return builtin5.InitActorCodeID, nil + + case actors.Version6: + return builtin6.InitActorCodeID, nil + + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + cbor.Marshaler + + ResolveAddress(address address.Address) (address.Address, bool, error) + MapAddressToNewID(address address.Address) (address.Address, error) + NetworkName() (string, error) + + ForEachActor(func(id abi.ActorID, address address.Address) error) error + + // Remove exists to support tooling that manipulates state for testing. + // It should not be used in production code, as init actor entries are + // immutable. + Remove(addrs ...address.Address) error + + // Sets the network's name. This should only be used on upgrade/fork. + SetNetworkName(name string) error + + // Sets the next ID for the init actor. This should only be used for testing. + SetNextID(id abi.ActorID) error + + // Sets the address map for the init actor. This should only be used for testing. + SetAddressMap(mcid cid.Cid) error + + AddressMap() (adt.Map, error) + GetState() interface{} +} diff --git a/venus-shared/actors/builtin/init/state.v0.go b/venus-shared/actors/builtin/init/state.v0.go new file mode 100644 index 0000000000..185b572199 --- /dev/null +++ b/venus-shared/actors/builtin/init/state.v0.go @@ -0,0 +1,113 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + +package init + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" + adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" +) + +var _ State = (*state0)(nil) + +func load0(store adt.Store, root cid.Cid) (State, error) { + out := state0{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make0(store adt.Store, networkName string) (State, error) { + out := state0{store: store} + + mr, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *init0.ConstructState(mr, networkName) + + return &out, nil +} + +type state0 struct { + init0.State + store adt.Store +} + +func (s *state0) ResolveAddress(address address.Address) (address.Address, bool, error) { + return s.State.ResolveAddress(s.store, address) +} + +func (s *state0) MapAddressToNewID(address address.Address) (address.Address, error) { + return s.State.MapAddressToNewID(s.store, address) +} + +func (s *state0) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { + addrs, err := adt0.AsMap(s.store, s.State.AddressMap) + if err != nil { + return err + } + var actorID cbg.CborInt + return addrs.ForEach(&actorID, func(key string) error { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(abi.ActorID(actorID), addr) + }) +} + +func (s *state0) NetworkName() (string, error) { + return string(s.State.NetworkName), nil +} + +func (s *state0) SetNetworkName(name string) error { + s.State.NetworkName = name + return nil +} + +func (s *state0) SetNextID(id abi.ActorID) error { + s.State.NextID = id + return nil +} + +func (s *state0) Remove(addrs ...address.Address) (err error) { + m, err := adt0.AsMap(s.store, s.State.AddressMap) + if err != nil { + return err + } + for _, addr := range addrs { + if err = m.Delete(abi.AddrKey(addr)); err != nil { + return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) + } + } + amr, err := m.Root() + if err != nil { + return xerrors.Errorf("failed to get address map root: %w", err) + } + s.State.AddressMap = amr + return nil +} + +func (s *state0) SetAddressMap(mcid cid.Cid) error { + s.State.AddressMap = mcid + return nil +} + +func (s *state0) AddressMap() (adt.Map, error) { + return adt0.AsMap(s.store, s.State.AddressMap) +} + +func (s *state0) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/init/state.v2.go b/venus-shared/actors/builtin/init/state.v2.go new file mode 100644 index 0000000000..d2052f395c --- /dev/null +++ b/venus-shared/actors/builtin/init/state.v2.go @@ -0,0 +1,113 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + +package init + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" + adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" +) + +var _ State = (*state2)(nil) + +func load2(store adt.Store, root cid.Cid) (State, error) { + out := state2{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make2(store adt.Store, networkName string) (State, error) { + out := state2{store: store} + + mr, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *init2.ConstructState(mr, networkName) + + return &out, nil +} + +type state2 struct { + init2.State + store adt.Store +} + +func (s *state2) ResolveAddress(address address.Address) (address.Address, bool, error) { + return s.State.ResolveAddress(s.store, address) +} + +func (s *state2) MapAddressToNewID(address address.Address) (address.Address, error) { + return s.State.MapAddressToNewID(s.store, address) +} + +func (s *state2) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { + addrs, err := adt2.AsMap(s.store, s.State.AddressMap) + if err != nil { + return err + } + var actorID cbg.CborInt + return addrs.ForEach(&actorID, func(key string) error { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(abi.ActorID(actorID), addr) + }) +} + +func (s *state2) NetworkName() (string, error) { + return string(s.State.NetworkName), nil +} + +func (s *state2) SetNetworkName(name string) error { + s.State.NetworkName = name + return nil +} + +func (s *state2) SetNextID(id abi.ActorID) error { + s.State.NextID = id + return nil +} + +func (s *state2) Remove(addrs ...address.Address) (err error) { + m, err := adt2.AsMap(s.store, s.State.AddressMap) + if err != nil { + return err + } + for _, addr := range addrs { + if err = m.Delete(abi.AddrKey(addr)); err != nil { + return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) + } + } + amr, err := m.Root() + if err != nil { + return xerrors.Errorf("failed to get address map root: %w", err) + } + s.State.AddressMap = amr + return nil +} + +func (s *state2) SetAddressMap(mcid cid.Cid) error { + s.State.AddressMap = mcid + return nil +} + +func (s *state2) AddressMap() (adt.Map, error) { + return adt2.AsMap(s.store, s.State.AddressMap) +} + +func (s *state2) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/init/state.v3.go b/venus-shared/actors/builtin/init/state.v3.go new file mode 100644 index 0000000000..709875249e --- /dev/null +++ b/venus-shared/actors/builtin/init/state.v3.go @@ -0,0 +1,115 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + +package init + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" + adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" +) + +var _ State = (*state3)(nil) + +func load3(store adt.Store, root cid.Cid) (State, error) { + out := state3{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make3(store adt.Store, networkName string) (State, error) { + out := state3{store: store} + + s, err := init3.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state3 struct { + init3.State + store adt.Store +} + +func (s *state3) ResolveAddress(address address.Address) (address.Address, bool, error) { + return s.State.ResolveAddress(s.store, address) +} + +func (s *state3) MapAddressToNewID(address address.Address) (address.Address, error) { + return s.State.MapAddressToNewID(s.store, address) +} + +func (s *state3) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { + addrs, err := adt3.AsMap(s.store, s.State.AddressMap, builtin3.DefaultHamtBitwidth) + if err != nil { + return err + } + var actorID cbg.CborInt + return addrs.ForEach(&actorID, func(key string) error { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(abi.ActorID(actorID), addr) + }) +} + +func (s *state3) NetworkName() (string, error) { + return string(s.State.NetworkName), nil +} + +func (s *state3) SetNetworkName(name string) error { + s.State.NetworkName = name + return nil +} + +func (s *state3) SetNextID(id abi.ActorID) error { + s.State.NextID = id + return nil +} + +func (s *state3) Remove(addrs ...address.Address) (err error) { + m, err := adt3.AsMap(s.store, s.State.AddressMap, builtin3.DefaultHamtBitwidth) + if err != nil { + return err + } + for _, addr := range addrs { + if err = m.Delete(abi.AddrKey(addr)); err != nil { + return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) + } + } + amr, err := m.Root() + if err != nil { + return xerrors.Errorf("failed to get address map root: %w", err) + } + s.State.AddressMap = amr + return nil +} + +func (s *state3) SetAddressMap(mcid cid.Cid) error { + s.State.AddressMap = mcid + return nil +} + +func (s *state3) AddressMap() (adt.Map, error) { + return adt3.AsMap(s.store, s.State.AddressMap, builtin3.DefaultHamtBitwidth) +} + +func (s *state3) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/init/state.v4.go b/venus-shared/actors/builtin/init/state.v4.go new file mode 100644 index 0000000000..fdb333cfdd --- /dev/null +++ b/venus-shared/actors/builtin/init/state.v4.go @@ -0,0 +1,115 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + +package init + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" + adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" +) + +var _ State = (*state4)(nil) + +func load4(store adt.Store, root cid.Cid) (State, error) { + out := state4{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make4(store adt.Store, networkName string) (State, error) { + out := state4{store: store} + + s, err := init4.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state4 struct { + init4.State + store adt.Store +} + +func (s *state4) ResolveAddress(address address.Address) (address.Address, bool, error) { + return s.State.ResolveAddress(s.store, address) +} + +func (s *state4) MapAddressToNewID(address address.Address) (address.Address, error) { + return s.State.MapAddressToNewID(s.store, address) +} + +func (s *state4) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { + addrs, err := adt4.AsMap(s.store, s.State.AddressMap, builtin4.DefaultHamtBitwidth) + if err != nil { + return err + } + var actorID cbg.CborInt + return addrs.ForEach(&actorID, func(key string) error { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(abi.ActorID(actorID), addr) + }) +} + +func (s *state4) NetworkName() (string, error) { + return string(s.State.NetworkName), nil +} + +func (s *state4) SetNetworkName(name string) error { + s.State.NetworkName = name + return nil +} + +func (s *state4) SetNextID(id abi.ActorID) error { + s.State.NextID = id + return nil +} + +func (s *state4) Remove(addrs ...address.Address) (err error) { + m, err := adt4.AsMap(s.store, s.State.AddressMap, builtin4.DefaultHamtBitwidth) + if err != nil { + return err + } + for _, addr := range addrs { + if err = m.Delete(abi.AddrKey(addr)); err != nil { + return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) + } + } + amr, err := m.Root() + if err != nil { + return xerrors.Errorf("failed to get address map root: %w", err) + } + s.State.AddressMap = amr + return nil +} + +func (s *state4) SetAddressMap(mcid cid.Cid) error { + s.State.AddressMap = mcid + return nil +} + +func (s *state4) AddressMap() (adt.Map, error) { + return adt4.AsMap(s.store, s.State.AddressMap, builtin4.DefaultHamtBitwidth) +} + +func (s *state4) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/init/state.v5.go b/venus-shared/actors/builtin/init/state.v5.go new file mode 100644 index 0000000000..0251b64c2f --- /dev/null +++ b/venus-shared/actors/builtin/init/state.v5.go @@ -0,0 +1,115 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + +package init + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" + adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" +) + +var _ State = (*state5)(nil) + +func load5(store adt.Store, root cid.Cid) (State, error) { + out := state5{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make5(store adt.Store, networkName string) (State, error) { + out := state5{store: store} + + s, err := init5.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state5 struct { + init5.State + store adt.Store +} + +func (s *state5) ResolveAddress(address address.Address) (address.Address, bool, error) { + return s.State.ResolveAddress(s.store, address) +} + +func (s *state5) MapAddressToNewID(address address.Address) (address.Address, error) { + return s.State.MapAddressToNewID(s.store, address) +} + +func (s *state5) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { + addrs, err := adt5.AsMap(s.store, s.State.AddressMap, builtin5.DefaultHamtBitwidth) + if err != nil { + return err + } + var actorID cbg.CborInt + return addrs.ForEach(&actorID, func(key string) error { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(abi.ActorID(actorID), addr) + }) +} + +func (s *state5) NetworkName() (string, error) { + return string(s.State.NetworkName), nil +} + +func (s *state5) SetNetworkName(name string) error { + s.State.NetworkName = name + return nil +} + +func (s *state5) SetNextID(id abi.ActorID) error { + s.State.NextID = id + return nil +} + +func (s *state5) Remove(addrs ...address.Address) (err error) { + m, err := adt5.AsMap(s.store, s.State.AddressMap, builtin5.DefaultHamtBitwidth) + if err != nil { + return err + } + for _, addr := range addrs { + if err = m.Delete(abi.AddrKey(addr)); err != nil { + return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) + } + } + amr, err := m.Root() + if err != nil { + return xerrors.Errorf("failed to get address map root: %w", err) + } + s.State.AddressMap = amr + return nil +} + +func (s *state5) SetAddressMap(mcid cid.Cid) error { + s.State.AddressMap = mcid + return nil +} + +func (s *state5) AddressMap() (adt.Map, error) { + return adt5.AsMap(s.store, s.State.AddressMap, builtin5.DefaultHamtBitwidth) +} + +func (s *state5) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/init/state.v6.go b/venus-shared/actors/builtin/init/state.v6.go new file mode 100644 index 0000000000..293ef84e39 --- /dev/null +++ b/venus-shared/actors/builtin/init/state.v6.go @@ -0,0 +1,115 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + +package init + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" + adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" +) + +var _ State = (*state6)(nil) + +func load6(store adt.Store, root cid.Cid) (State, error) { + out := state6{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make6(store adt.Store, networkName string) (State, error) { + out := state6{store: store} + + s, err := init6.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state6 struct { + init6.State + store adt.Store +} + +func (s *state6) ResolveAddress(address address.Address) (address.Address, bool, error) { + return s.State.ResolveAddress(s.store, address) +} + +func (s *state6) MapAddressToNewID(address address.Address) (address.Address, error) { + return s.State.MapAddressToNewID(s.store, address) +} + +func (s *state6) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { + addrs, err := adt6.AsMap(s.store, s.State.AddressMap, builtin6.DefaultHamtBitwidth) + if err != nil { + return err + } + var actorID cbg.CborInt + return addrs.ForEach(&actorID, func(key string) error { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(abi.ActorID(actorID), addr) + }) +} + +func (s *state6) NetworkName() (string, error) { + return string(s.State.NetworkName), nil +} + +func (s *state6) SetNetworkName(name string) error { + s.State.NetworkName = name + return nil +} + +func (s *state6) SetNextID(id abi.ActorID) error { + s.State.NextID = id + return nil +} + +func (s *state6) Remove(addrs ...address.Address) (err error) { + m, err := adt6.AsMap(s.store, s.State.AddressMap, builtin6.DefaultHamtBitwidth) + if err != nil { + return err + } + for _, addr := range addrs { + if err = m.Delete(abi.AddrKey(addr)); err != nil { + return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) + } + } + amr, err := m.Root() + if err != nil { + return xerrors.Errorf("failed to get address map root: %w", err) + } + s.State.AddressMap = amr + return nil +} + +func (s *state6) SetAddressMap(mcid cid.Cid) error { + s.State.AddressMap = mcid + return nil +} + +func (s *state6) AddressMap() (adt.Map, error) { + return adt6.AsMap(s.store, s.State.AddressMap, builtin6.DefaultHamtBitwidth) +} + +func (s *state6) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/market/actor.go b/venus-shared/actors/builtin/market/actor.go new file mode 100644 index 0000000000..6cad1485d4 --- /dev/null +++ b/venus-shared/actors/builtin/market/actor.go @@ -0,0 +1,295 @@ +// FETCHED FROM LOTUS: builtin/market/actor.go.template + +package market + +import ( + "github.com/filecoin-project/go-state-types/network" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/cbor" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +func init() { + + builtin.RegisterActorState(builtin0.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + + builtin.RegisterActorState(builtin2.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + + builtin.RegisterActorState(builtin3.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + + builtin.RegisterActorState(builtin4.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + + builtin.RegisterActorState(builtin5.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + + builtin.RegisterActorState(builtin6.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) +} + +var ( + Address = builtin6.StorageMarketActorAddr + Methods = builtin6.MethodsMarket +) + +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { + + case builtin0.StorageMarketActorCodeID: + return load0(store, act.Head) + + case builtin2.StorageMarketActorCodeID: + return load2(store, act.Head) + + case builtin3.StorageMarketActorCodeID: + return load3(store, act.Head) + + case builtin4.StorageMarketActorCodeID: + return load4(store, act.Head) + + case builtin5.StorageMarketActorCodeID: + return load5(store, act.Head) + + case builtin6.StorageMarketActorCodeID: + return load6(store, act.Head) + + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version) (State, error) { + switch av { + + case actors.Version0: + return make0(store) + + case actors.Version2: + return make2(store) + + case actors.Version3: + return make3(store) + + case actors.Version4: + return make4(store) + + case actors.Version5: + return make5(store) + + case actors.Version6: + return make6(store) + + } + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { + + case actors.Version0: + return builtin0.StorageMarketActorCodeID, nil + + case actors.Version2: + return builtin2.StorageMarketActorCodeID, nil + + case actors.Version3: + return builtin3.StorageMarketActorCodeID, nil + + case actors.Version4: + return builtin4.StorageMarketActorCodeID, nil + + case actors.Version5: + return builtin5.StorageMarketActorCodeID, nil + + case actors.Version6: + return builtin6.StorageMarketActorCodeID, nil + + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + cbor.Marshaler + BalancesChanged(State) (bool, error) + EscrowTable() (BalanceTable, error) + LockedTable() (BalanceTable, error) + TotalLocked() (abi.TokenAmount, error) + StatesChanged(State) (bool, error) + States() (DealStates, error) + ProposalsChanged(State) (bool, error) + Proposals() (DealProposals, error) + VerifyDealsForActivation( + minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, + ) (weight, verifiedWeight abi.DealWeight, err error) + NextID() (abi.DealID, error) + GetState() interface{} +} + +type BalanceTable interface { + ForEach(cb func(address.Address, abi.TokenAmount) error) error + Get(key address.Address) (abi.TokenAmount, error) +} + +type DealStates interface { + ForEach(cb func(id abi.DealID, ds DealState) error) error + Get(id abi.DealID) (*DealState, bool, error) + + array() adt.Array + decode(*cbg.Deferred) (*DealState, error) +} + +type DealProposals interface { + ForEach(cb func(id abi.DealID, dp DealProposal) error) error + Get(id abi.DealID) (*DealProposal, bool, error) + + array() adt.Array + decode(*cbg.Deferred) (*DealProposal, error) +} + +type PublishStorageDealsParams = market0.PublishStorageDealsParams + +type PublishStorageDealsReturn interface { + DealIDs() ([]abi.DealID, error) + // Note that this index is based on the batch of deals that were published, NOT the DealID + IsDealValid(index uint64) (bool, error) +} + +func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStorageDealsReturn, error) { + av, err := actors.VersionForNetwork(nv) + if err != nil { + return nil, err + } + + switch av { + + case actors.Version0: + return decodePublishStorageDealsReturn0(b) + + case actors.Version2: + return decodePublishStorageDealsReturn2(b) + + case actors.Version3: + return decodePublishStorageDealsReturn3(b) + + case actors.Version4: + return decodePublishStorageDealsReturn4(b) + + case actors.Version5: + return decodePublishStorageDealsReturn5(b) + + case actors.Version6: + return decodePublishStorageDealsReturn6(b) + + } + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +type VerifyDealsForActivationParams = market0.VerifyDealsForActivationParams +type WithdrawBalanceParams = market0.WithdrawBalanceParams + +type ClientDealProposal = market0.ClientDealProposal + +type DealState struct { + SectorStartEpoch abi.ChainEpoch // -1 if not yet included in proven sector + LastUpdatedEpoch abi.ChainEpoch // -1 if deal state never updated + SlashEpoch abi.ChainEpoch // -1 if deal never slashed +} + +type DealProposal struct { + PieceCID cid.Cid + PieceSize abi.PaddedPieceSize + VerifiedDeal bool + Client address.Address + Provider address.Address + Label string + StartEpoch abi.ChainEpoch + EndEpoch abi.ChainEpoch + StoragePricePerEpoch abi.TokenAmount + ProviderCollateral abi.TokenAmount + ClientCollateral abi.TokenAmount +} + +type DealStateChanges struct { + Added []DealIDState + Modified []DealStateChange + Removed []DealIDState +} + +type DealIDState struct { + ID abi.DealID + Deal DealState +} + +// DealStateChange is a change in deal state from -> to +type DealStateChange struct { + ID abi.DealID + From *DealState + To *DealState +} + +type DealProposalChanges struct { + Added []ProposalIDState + Removed []ProposalIDState +} + +type ProposalIDState struct { + ID abi.DealID + Proposal DealProposal +} + +func EmptyDealState() *DealState { + return &DealState{ + SectorStartEpoch: -1, + SlashEpoch: -1, + LastUpdatedEpoch: -1, + } +} + +// returns the earned fees and pending fees for a given deal +func (deal DealProposal) GetDealFees(height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) { + tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch))) + + ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch))) + if ef.LessThan(big.Zero()) { + ef = big.Zero() + } + + if ef.GreaterThan(tf) { + ef = tf + } + + return ef, big.Sub(tf, ef) +} diff --git a/venus-shared/actors/builtin/market/state.v0.go b/venus-shared/actors/builtin/market/state.v0.go new file mode 100644 index 0000000000..3cdb209b1f --- /dev/null +++ b/venus-shared/actors/builtin/market/state.v0.go @@ -0,0 +1,260 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + +package market + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + types "github.com/filecoin-project/venus/venus-shared/chain" + + market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" + adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" +) + +var _ State = (*state0)(nil) + +func load0(store adt.Store, root cid.Cid) (State, error) { + out := state0{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make0(store adt.Store) (State, error) { + out := state0{store: store} + + ea, err := adt0.MakeEmptyArray(store).Root() + if err != nil { + return nil, err + } + + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *market0.ConstructState(ea, em, em) + + return &out, nil +} + +type state0 struct { + market0.State + store adt.Store +} + +func (s *state0) TotalLocked() (abi.TokenAmount, error) { + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) + return fml, nil +} + +func (s *state0) BalancesChanged(otherState State) (bool, error) { + otherState0, ok := otherState.(*state0) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.EscrowTable.Equals(otherState0.State.EscrowTable) || !s.State.LockedTable.Equals(otherState0.State.LockedTable), nil +} + +func (s *state0) StatesChanged(otherState State) (bool, error) { + otherState0, ok := otherState.(*state0) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.States.Equals(otherState0.State.States), nil +} + +func (s *state0) States() (DealStates, error) { + stateArray, err := adt0.AsArray(s.store, s.State.States) + if err != nil { + return nil, err + } + return &dealStates0{stateArray}, nil +} + +func (s *state0) ProposalsChanged(otherState State) (bool, error) { + otherState0, ok := otherState.(*state0) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.Proposals.Equals(otherState0.State.Proposals), nil +} + +func (s *state0) Proposals() (DealProposals, error) { + proposalArray, err := adt0.AsArray(s.store, s.State.Proposals) + if err != nil { + return nil, err + } + return &dealProposals0{proposalArray}, nil +} + +func (s *state0) EscrowTable() (BalanceTable, error) { + bt, err := adt0.AsBalanceTable(s.store, s.State.EscrowTable) + if err != nil { + return nil, err + } + return &balanceTable0{bt}, nil +} + +func (s *state0) LockedTable() (BalanceTable, error) { + bt, err := adt0.AsBalanceTable(s.store, s.State.LockedTable) + if err != nil { + return nil, err + } + return &balanceTable0{bt}, nil +} + +func (s *state0) VerifyDealsForActivation( + minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, +) (weight, verifiedWeight abi.DealWeight, err error) { + w, vw, err := market0.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) + return w, vw, err +} + +func (s *state0) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + +type balanceTable0 struct { + *adt0.BalanceTable +} + +func (bt *balanceTable0) ForEach(cb func(address.Address, abi.TokenAmount) error) error { + asMap := (*adt0.Map)(bt.BalanceTable) + var ta abi.TokenAmount + return asMap.ForEach(&ta, func(key string) error { + a, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(a, ta) + }) +} + +type dealStates0 struct { + adt.Array +} + +func (s *dealStates0) Get(dealID abi.DealID) (*DealState, bool, error) { + var deal0 market0.DealState + found, err := s.Array.Get(uint64(dealID), &deal0) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + deal := fromV0DealState(deal0) + return &deal, true, nil +} + +func (s *dealStates0) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { + var ds0 market0.DealState + return s.Array.ForEach(&ds0, func(idx int64) error { + return cb(abi.DealID(idx), fromV0DealState(ds0)) + }) +} + +func (s *dealStates0) decode(val *cbg.Deferred) (*DealState, error) { + var ds0 market0.DealState + if err := ds0.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + ds := fromV0DealState(ds0) + return &ds, nil +} + +func (s *dealStates0) array() adt.Array { + return s.Array +} + +func fromV0DealState(v0 market0.DealState) DealState { + return (DealState)(v0) +} + +type dealProposals0 struct { + adt.Array +} + +func (s *dealProposals0) Get(dealID abi.DealID) (*DealProposal, bool, error) { + var proposal0 market0.DealProposal + found, err := s.Array.Get(uint64(dealID), &proposal0) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + proposal := fromV0DealProposal(proposal0) + return &proposal, true, nil +} + +func (s *dealProposals0) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { + var dp0 market0.DealProposal + return s.Array.ForEach(&dp0, func(idx int64) error { + return cb(abi.DealID(idx), fromV0DealProposal(dp0)) + }) +} + +func (s *dealProposals0) decode(val *cbg.Deferred) (*DealProposal, error) { + var dp0 market0.DealProposal + if err := dp0.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + dp := fromV0DealProposal(dp0) + return &dp, nil +} + +func (s *dealProposals0) array() adt.Array { + return s.Array +} + +func fromV0DealProposal(v0 market0.DealProposal) DealProposal { + return (DealProposal)(v0) +} + +func (s *state0) GetState() interface{} { + return &s.State +} + +var _ PublishStorageDealsReturn = (*publishStorageDealsReturn0)(nil) + +func decodePublishStorageDealsReturn0(b []byte) (PublishStorageDealsReturn, error) { + var retval market0.PublishStorageDealsReturn + if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { + return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) + } + + return &publishStorageDealsReturn0{retval}, nil +} + +type publishStorageDealsReturn0 struct { + market0.PublishStorageDealsReturn +} + +func (r *publishStorageDealsReturn0) IsDealValid(index uint64) (bool, error) { + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + +} + +func (r *publishStorageDealsReturn0) DealIDs() ([]abi.DealID, error) { + return r.IDs, nil +} diff --git a/venus-shared/actors/builtin/market/state.v2.go b/venus-shared/actors/builtin/market/state.v2.go new file mode 100644 index 0000000000..2f1d4b4a25 --- /dev/null +++ b/venus-shared/actors/builtin/market/state.v2.go @@ -0,0 +1,260 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + +package market + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + types "github.com/filecoin-project/venus/venus-shared/chain" + + market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" + adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" +) + +var _ State = (*state2)(nil) + +func load2(store adt.Store, root cid.Cid) (State, error) { + out := state2{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make2(store adt.Store) (State, error) { + out := state2{store: store} + + ea, err := adt2.MakeEmptyArray(store).Root() + if err != nil { + return nil, err + } + + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *market2.ConstructState(ea, em, em) + + return &out, nil +} + +type state2 struct { + market2.State + store adt.Store +} + +func (s *state2) TotalLocked() (abi.TokenAmount, error) { + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) + return fml, nil +} + +func (s *state2) BalancesChanged(otherState State) (bool, error) { + otherState2, ok := otherState.(*state2) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.EscrowTable.Equals(otherState2.State.EscrowTable) || !s.State.LockedTable.Equals(otherState2.State.LockedTable), nil +} + +func (s *state2) StatesChanged(otherState State) (bool, error) { + otherState2, ok := otherState.(*state2) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.States.Equals(otherState2.State.States), nil +} + +func (s *state2) States() (DealStates, error) { + stateArray, err := adt2.AsArray(s.store, s.State.States) + if err != nil { + return nil, err + } + return &dealStates2{stateArray}, nil +} + +func (s *state2) ProposalsChanged(otherState State) (bool, error) { + otherState2, ok := otherState.(*state2) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.Proposals.Equals(otherState2.State.Proposals), nil +} + +func (s *state2) Proposals() (DealProposals, error) { + proposalArray, err := adt2.AsArray(s.store, s.State.Proposals) + if err != nil { + return nil, err + } + return &dealProposals2{proposalArray}, nil +} + +func (s *state2) EscrowTable() (BalanceTable, error) { + bt, err := adt2.AsBalanceTable(s.store, s.State.EscrowTable) + if err != nil { + return nil, err + } + return &balanceTable2{bt}, nil +} + +func (s *state2) LockedTable() (BalanceTable, error) { + bt, err := adt2.AsBalanceTable(s.store, s.State.LockedTable) + if err != nil { + return nil, err + } + return &balanceTable2{bt}, nil +} + +func (s *state2) VerifyDealsForActivation( + minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, +) (weight, verifiedWeight abi.DealWeight, err error) { + w, vw, _, err := market2.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) + return w, vw, err +} + +func (s *state2) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + +type balanceTable2 struct { + *adt2.BalanceTable +} + +func (bt *balanceTable2) ForEach(cb func(address.Address, abi.TokenAmount) error) error { + asMap := (*adt2.Map)(bt.BalanceTable) + var ta abi.TokenAmount + return asMap.ForEach(&ta, func(key string) error { + a, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(a, ta) + }) +} + +type dealStates2 struct { + adt.Array +} + +func (s *dealStates2) Get(dealID abi.DealID) (*DealState, bool, error) { + var deal2 market2.DealState + found, err := s.Array.Get(uint64(dealID), &deal2) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + deal := fromV2DealState(deal2) + return &deal, true, nil +} + +func (s *dealStates2) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { + var ds2 market2.DealState + return s.Array.ForEach(&ds2, func(idx int64) error { + return cb(abi.DealID(idx), fromV2DealState(ds2)) + }) +} + +func (s *dealStates2) decode(val *cbg.Deferred) (*DealState, error) { + var ds2 market2.DealState + if err := ds2.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + ds := fromV2DealState(ds2) + return &ds, nil +} + +func (s *dealStates2) array() adt.Array { + return s.Array +} + +func fromV2DealState(v2 market2.DealState) DealState { + return (DealState)(v2) +} + +type dealProposals2 struct { + adt.Array +} + +func (s *dealProposals2) Get(dealID abi.DealID) (*DealProposal, bool, error) { + var proposal2 market2.DealProposal + found, err := s.Array.Get(uint64(dealID), &proposal2) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + proposal := fromV2DealProposal(proposal2) + return &proposal, true, nil +} + +func (s *dealProposals2) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { + var dp2 market2.DealProposal + return s.Array.ForEach(&dp2, func(idx int64) error { + return cb(abi.DealID(idx), fromV2DealProposal(dp2)) + }) +} + +func (s *dealProposals2) decode(val *cbg.Deferred) (*DealProposal, error) { + var dp2 market2.DealProposal + if err := dp2.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + dp := fromV2DealProposal(dp2) + return &dp, nil +} + +func (s *dealProposals2) array() adt.Array { + return s.Array +} + +func fromV2DealProposal(v2 market2.DealProposal) DealProposal { + return (DealProposal)(v2) +} + +func (s *state2) GetState() interface{} { + return &s.State +} + +var _ PublishStorageDealsReturn = (*publishStorageDealsReturn2)(nil) + +func decodePublishStorageDealsReturn2(b []byte) (PublishStorageDealsReturn, error) { + var retval market2.PublishStorageDealsReturn + if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { + return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) + } + + return &publishStorageDealsReturn2{retval}, nil +} + +type publishStorageDealsReturn2 struct { + market2.PublishStorageDealsReturn +} + +func (r *publishStorageDealsReturn2) IsDealValid(index uint64) (bool, error) { + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + +} + +func (r *publishStorageDealsReturn2) DealIDs() ([]abi.DealID, error) { + return r.IDs, nil +} diff --git a/venus-shared/actors/builtin/market/state.v3.go b/venus-shared/actors/builtin/market/state.v3.go new file mode 100644 index 0000000000..3c9c32a776 --- /dev/null +++ b/venus-shared/actors/builtin/market/state.v3.go @@ -0,0 +1,255 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + +package market + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + types "github.com/filecoin-project/venus/venus-shared/chain" + + market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" + adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" +) + +var _ State = (*state3)(nil) + +func load3(store adt.Store, root cid.Cid) (State, error) { + out := state3{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make3(store adt.Store) (State, error) { + out := state3{store: store} + + s, err := market3.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state3 struct { + market3.State + store adt.Store +} + +func (s *state3) TotalLocked() (abi.TokenAmount, error) { + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) + return fml, nil +} + +func (s *state3) BalancesChanged(otherState State) (bool, error) { + otherState3, ok := otherState.(*state3) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.EscrowTable.Equals(otherState3.State.EscrowTable) || !s.State.LockedTable.Equals(otherState3.State.LockedTable), nil +} + +func (s *state3) StatesChanged(otherState State) (bool, error) { + otherState3, ok := otherState.(*state3) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.States.Equals(otherState3.State.States), nil +} + +func (s *state3) States() (DealStates, error) { + stateArray, err := adt3.AsArray(s.store, s.State.States, market3.StatesAmtBitwidth) + if err != nil { + return nil, err + } + return &dealStates3{stateArray}, nil +} + +func (s *state3) ProposalsChanged(otherState State) (bool, error) { + otherState3, ok := otherState.(*state3) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.Proposals.Equals(otherState3.State.Proposals), nil +} + +func (s *state3) Proposals() (DealProposals, error) { + proposalArray, err := adt3.AsArray(s.store, s.State.Proposals, market3.ProposalsAmtBitwidth) + if err != nil { + return nil, err + } + return &dealProposals3{proposalArray}, nil +} + +func (s *state3) EscrowTable() (BalanceTable, error) { + bt, err := adt3.AsBalanceTable(s.store, s.State.EscrowTable) + if err != nil { + return nil, err + } + return &balanceTable3{bt}, nil +} + +func (s *state3) LockedTable() (BalanceTable, error) { + bt, err := adt3.AsBalanceTable(s.store, s.State.LockedTable) + if err != nil { + return nil, err + } + return &balanceTable3{bt}, nil +} + +func (s *state3) VerifyDealsForActivation( + minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, +) (weight, verifiedWeight abi.DealWeight, err error) { + w, vw, _, err := market3.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) + return w, vw, err +} + +func (s *state3) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + +type balanceTable3 struct { + *adt3.BalanceTable +} + +func (bt *balanceTable3) ForEach(cb func(address.Address, abi.TokenAmount) error) error { + asMap := (*adt3.Map)(bt.BalanceTable) + var ta abi.TokenAmount + return asMap.ForEach(&ta, func(key string) error { + a, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(a, ta) + }) +} + +type dealStates3 struct { + adt.Array +} + +func (s *dealStates3) Get(dealID abi.DealID) (*DealState, bool, error) { + var deal3 market3.DealState + found, err := s.Array.Get(uint64(dealID), &deal3) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + deal := fromV3DealState(deal3) + return &deal, true, nil +} + +func (s *dealStates3) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { + var ds3 market3.DealState + return s.Array.ForEach(&ds3, func(idx int64) error { + return cb(abi.DealID(idx), fromV3DealState(ds3)) + }) +} + +func (s *dealStates3) decode(val *cbg.Deferred) (*DealState, error) { + var ds3 market3.DealState + if err := ds3.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + ds := fromV3DealState(ds3) + return &ds, nil +} + +func (s *dealStates3) array() adt.Array { + return s.Array +} + +func fromV3DealState(v3 market3.DealState) DealState { + return (DealState)(v3) +} + +type dealProposals3 struct { + adt.Array +} + +func (s *dealProposals3) Get(dealID abi.DealID) (*DealProposal, bool, error) { + var proposal3 market3.DealProposal + found, err := s.Array.Get(uint64(dealID), &proposal3) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + proposal := fromV3DealProposal(proposal3) + return &proposal, true, nil +} + +func (s *dealProposals3) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { + var dp3 market3.DealProposal + return s.Array.ForEach(&dp3, func(idx int64) error { + return cb(abi.DealID(idx), fromV3DealProposal(dp3)) + }) +} + +func (s *dealProposals3) decode(val *cbg.Deferred) (*DealProposal, error) { + var dp3 market3.DealProposal + if err := dp3.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + dp := fromV3DealProposal(dp3) + return &dp, nil +} + +func (s *dealProposals3) array() adt.Array { + return s.Array +} + +func fromV3DealProposal(v3 market3.DealProposal) DealProposal { + return (DealProposal)(v3) +} + +func (s *state3) GetState() interface{} { + return &s.State +} + +var _ PublishStorageDealsReturn = (*publishStorageDealsReturn3)(nil) + +func decodePublishStorageDealsReturn3(b []byte) (PublishStorageDealsReturn, error) { + var retval market3.PublishStorageDealsReturn + if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { + return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) + } + + return &publishStorageDealsReturn3{retval}, nil +} + +type publishStorageDealsReturn3 struct { + market3.PublishStorageDealsReturn +} + +func (r *publishStorageDealsReturn3) IsDealValid(index uint64) (bool, error) { + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + +} + +func (r *publishStorageDealsReturn3) DealIDs() ([]abi.DealID, error) { + return r.IDs, nil +} diff --git a/venus-shared/actors/builtin/market/state.v4.go b/venus-shared/actors/builtin/market/state.v4.go new file mode 100644 index 0000000000..8dcad1a918 --- /dev/null +++ b/venus-shared/actors/builtin/market/state.v4.go @@ -0,0 +1,255 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + +package market + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + types "github.com/filecoin-project/venus/venus-shared/chain" + + market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" + adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" +) + +var _ State = (*state4)(nil) + +func load4(store adt.Store, root cid.Cid) (State, error) { + out := state4{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make4(store adt.Store) (State, error) { + out := state4{store: store} + + s, err := market4.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state4 struct { + market4.State + store adt.Store +} + +func (s *state4) TotalLocked() (abi.TokenAmount, error) { + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) + return fml, nil +} + +func (s *state4) BalancesChanged(otherState State) (bool, error) { + otherState4, ok := otherState.(*state4) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.EscrowTable.Equals(otherState4.State.EscrowTable) || !s.State.LockedTable.Equals(otherState4.State.LockedTable), nil +} + +func (s *state4) StatesChanged(otherState State) (bool, error) { + otherState4, ok := otherState.(*state4) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.States.Equals(otherState4.State.States), nil +} + +func (s *state4) States() (DealStates, error) { + stateArray, err := adt4.AsArray(s.store, s.State.States, market4.StatesAmtBitwidth) + if err != nil { + return nil, err + } + return &dealStates4{stateArray}, nil +} + +func (s *state4) ProposalsChanged(otherState State) (bool, error) { + otherState4, ok := otherState.(*state4) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.Proposals.Equals(otherState4.State.Proposals), nil +} + +func (s *state4) Proposals() (DealProposals, error) { + proposalArray, err := adt4.AsArray(s.store, s.State.Proposals, market4.ProposalsAmtBitwidth) + if err != nil { + return nil, err + } + return &dealProposals4{proposalArray}, nil +} + +func (s *state4) EscrowTable() (BalanceTable, error) { + bt, err := adt4.AsBalanceTable(s.store, s.State.EscrowTable) + if err != nil { + return nil, err + } + return &balanceTable4{bt}, nil +} + +func (s *state4) LockedTable() (BalanceTable, error) { + bt, err := adt4.AsBalanceTable(s.store, s.State.LockedTable) + if err != nil { + return nil, err + } + return &balanceTable4{bt}, nil +} + +func (s *state4) VerifyDealsForActivation( + minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, +) (weight, verifiedWeight abi.DealWeight, err error) { + w, vw, _, err := market4.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) + return w, vw, err +} + +func (s *state4) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + +type balanceTable4 struct { + *adt4.BalanceTable +} + +func (bt *balanceTable4) ForEach(cb func(address.Address, abi.TokenAmount) error) error { + asMap := (*adt4.Map)(bt.BalanceTable) + var ta abi.TokenAmount + return asMap.ForEach(&ta, func(key string) error { + a, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(a, ta) + }) +} + +type dealStates4 struct { + adt.Array +} + +func (s *dealStates4) Get(dealID abi.DealID) (*DealState, bool, error) { + var deal4 market4.DealState + found, err := s.Array.Get(uint64(dealID), &deal4) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + deal := fromV4DealState(deal4) + return &deal, true, nil +} + +func (s *dealStates4) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { + var ds4 market4.DealState + return s.Array.ForEach(&ds4, func(idx int64) error { + return cb(abi.DealID(idx), fromV4DealState(ds4)) + }) +} + +func (s *dealStates4) decode(val *cbg.Deferred) (*DealState, error) { + var ds4 market4.DealState + if err := ds4.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + ds := fromV4DealState(ds4) + return &ds, nil +} + +func (s *dealStates4) array() adt.Array { + return s.Array +} + +func fromV4DealState(v4 market4.DealState) DealState { + return (DealState)(v4) +} + +type dealProposals4 struct { + adt.Array +} + +func (s *dealProposals4) Get(dealID abi.DealID) (*DealProposal, bool, error) { + var proposal4 market4.DealProposal + found, err := s.Array.Get(uint64(dealID), &proposal4) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + proposal := fromV4DealProposal(proposal4) + return &proposal, true, nil +} + +func (s *dealProposals4) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { + var dp4 market4.DealProposal + return s.Array.ForEach(&dp4, func(idx int64) error { + return cb(abi.DealID(idx), fromV4DealProposal(dp4)) + }) +} + +func (s *dealProposals4) decode(val *cbg.Deferred) (*DealProposal, error) { + var dp4 market4.DealProposal + if err := dp4.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + dp := fromV4DealProposal(dp4) + return &dp, nil +} + +func (s *dealProposals4) array() adt.Array { + return s.Array +} + +func fromV4DealProposal(v4 market4.DealProposal) DealProposal { + return (DealProposal)(v4) +} + +func (s *state4) GetState() interface{} { + return &s.State +} + +var _ PublishStorageDealsReturn = (*publishStorageDealsReturn4)(nil) + +func decodePublishStorageDealsReturn4(b []byte) (PublishStorageDealsReturn, error) { + var retval market4.PublishStorageDealsReturn + if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { + return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) + } + + return &publishStorageDealsReturn4{retval}, nil +} + +type publishStorageDealsReturn4 struct { + market4.PublishStorageDealsReturn +} + +func (r *publishStorageDealsReturn4) IsDealValid(index uint64) (bool, error) { + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + +} + +func (r *publishStorageDealsReturn4) DealIDs() ([]abi.DealID, error) { + return r.IDs, nil +} diff --git a/venus-shared/actors/builtin/market/state.v5.go b/venus-shared/actors/builtin/market/state.v5.go new file mode 100644 index 0000000000..d5081e8ec4 --- /dev/null +++ b/venus-shared/actors/builtin/market/state.v5.go @@ -0,0 +1,255 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + +package market + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + types "github.com/filecoin-project/venus/venus-shared/chain" + + market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" + adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" +) + +var _ State = (*state5)(nil) + +func load5(store adt.Store, root cid.Cid) (State, error) { + out := state5{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make5(store adt.Store) (State, error) { + out := state5{store: store} + + s, err := market5.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state5 struct { + market5.State + store adt.Store +} + +func (s *state5) TotalLocked() (abi.TokenAmount, error) { + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) + return fml, nil +} + +func (s *state5) BalancesChanged(otherState State) (bool, error) { + otherState5, ok := otherState.(*state5) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.EscrowTable.Equals(otherState5.State.EscrowTable) || !s.State.LockedTable.Equals(otherState5.State.LockedTable), nil +} + +func (s *state5) StatesChanged(otherState State) (bool, error) { + otherState5, ok := otherState.(*state5) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.States.Equals(otherState5.State.States), nil +} + +func (s *state5) States() (DealStates, error) { + stateArray, err := adt5.AsArray(s.store, s.State.States, market5.StatesAmtBitwidth) + if err != nil { + return nil, err + } + return &dealStates5{stateArray}, nil +} + +func (s *state5) ProposalsChanged(otherState State) (bool, error) { + otherState5, ok := otherState.(*state5) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.Proposals.Equals(otherState5.State.Proposals), nil +} + +func (s *state5) Proposals() (DealProposals, error) { + proposalArray, err := adt5.AsArray(s.store, s.State.Proposals, market5.ProposalsAmtBitwidth) + if err != nil { + return nil, err + } + return &dealProposals5{proposalArray}, nil +} + +func (s *state5) EscrowTable() (BalanceTable, error) { + bt, err := adt5.AsBalanceTable(s.store, s.State.EscrowTable) + if err != nil { + return nil, err + } + return &balanceTable5{bt}, nil +} + +func (s *state5) LockedTable() (BalanceTable, error) { + bt, err := adt5.AsBalanceTable(s.store, s.State.LockedTable) + if err != nil { + return nil, err + } + return &balanceTable5{bt}, nil +} + +func (s *state5) VerifyDealsForActivation( + minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, +) (weight, verifiedWeight abi.DealWeight, err error) { + w, vw, _, err := market5.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) + return w, vw, err +} + +func (s *state5) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + +type balanceTable5 struct { + *adt5.BalanceTable +} + +func (bt *balanceTable5) ForEach(cb func(address.Address, abi.TokenAmount) error) error { + asMap := (*adt5.Map)(bt.BalanceTable) + var ta abi.TokenAmount + return asMap.ForEach(&ta, func(key string) error { + a, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(a, ta) + }) +} + +type dealStates5 struct { + adt.Array +} + +func (s *dealStates5) Get(dealID abi.DealID) (*DealState, bool, error) { + var deal5 market5.DealState + found, err := s.Array.Get(uint64(dealID), &deal5) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + deal := fromV5DealState(deal5) + return &deal, true, nil +} + +func (s *dealStates5) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { + var ds5 market5.DealState + return s.Array.ForEach(&ds5, func(idx int64) error { + return cb(abi.DealID(idx), fromV5DealState(ds5)) + }) +} + +func (s *dealStates5) decode(val *cbg.Deferred) (*DealState, error) { + var ds5 market5.DealState + if err := ds5.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + ds := fromV5DealState(ds5) + return &ds, nil +} + +func (s *dealStates5) array() adt.Array { + return s.Array +} + +func fromV5DealState(v5 market5.DealState) DealState { + return (DealState)(v5) +} + +type dealProposals5 struct { + adt.Array +} + +func (s *dealProposals5) Get(dealID abi.DealID) (*DealProposal, bool, error) { + var proposal5 market5.DealProposal + found, err := s.Array.Get(uint64(dealID), &proposal5) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + proposal := fromV5DealProposal(proposal5) + return &proposal, true, nil +} + +func (s *dealProposals5) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { + var dp5 market5.DealProposal + return s.Array.ForEach(&dp5, func(idx int64) error { + return cb(abi.DealID(idx), fromV5DealProposal(dp5)) + }) +} + +func (s *dealProposals5) decode(val *cbg.Deferred) (*DealProposal, error) { + var dp5 market5.DealProposal + if err := dp5.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + dp := fromV5DealProposal(dp5) + return &dp, nil +} + +func (s *dealProposals5) array() adt.Array { + return s.Array +} + +func fromV5DealProposal(v5 market5.DealProposal) DealProposal { + return (DealProposal)(v5) +} + +func (s *state5) GetState() interface{} { + return &s.State +} + +var _ PublishStorageDealsReturn = (*publishStorageDealsReturn5)(nil) + +func decodePublishStorageDealsReturn5(b []byte) (PublishStorageDealsReturn, error) { + var retval market5.PublishStorageDealsReturn + if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { + return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) + } + + return &publishStorageDealsReturn5{retval}, nil +} + +type publishStorageDealsReturn5 struct { + market5.PublishStorageDealsReturn +} + +func (r *publishStorageDealsReturn5) IsDealValid(index uint64) (bool, error) { + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + +} + +func (r *publishStorageDealsReturn5) DealIDs() ([]abi.DealID, error) { + return r.IDs, nil +} diff --git a/venus-shared/actors/builtin/market/state.v6.go b/venus-shared/actors/builtin/market/state.v6.go new file mode 100644 index 0000000000..da5bec9b91 --- /dev/null +++ b/venus-shared/actors/builtin/market/state.v6.go @@ -0,0 +1,254 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + +package market + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + types "github.com/filecoin-project/venus/venus-shared/chain" + + market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" + adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" +) + +var _ State = (*state6)(nil) + +func load6(store adt.Store, root cid.Cid) (State, error) { + out := state6{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make6(store adt.Store) (State, error) { + out := state6{store: store} + + s, err := market6.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state6 struct { + market6.State + store adt.Store +} + +func (s *state6) TotalLocked() (abi.TokenAmount, error) { + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) + return fml, nil +} + +func (s *state6) BalancesChanged(otherState State) (bool, error) { + otherState6, ok := otherState.(*state6) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.EscrowTable.Equals(otherState6.State.EscrowTable) || !s.State.LockedTable.Equals(otherState6.State.LockedTable), nil +} + +func (s *state6) StatesChanged(otherState State) (bool, error) { + otherState6, ok := otherState.(*state6) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.States.Equals(otherState6.State.States), nil +} + +func (s *state6) States() (DealStates, error) { + stateArray, err := adt6.AsArray(s.store, s.State.States, market6.StatesAmtBitwidth) + if err != nil { + return nil, err + } + return &dealStates6{stateArray}, nil +} + +func (s *state6) ProposalsChanged(otherState State) (bool, error) { + otherState6, ok := otherState.(*state6) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.Proposals.Equals(otherState6.State.Proposals), nil +} + +func (s *state6) Proposals() (DealProposals, error) { + proposalArray, err := adt6.AsArray(s.store, s.State.Proposals, market6.ProposalsAmtBitwidth) + if err != nil { + return nil, err + } + return &dealProposals6{proposalArray}, nil +} + +func (s *state6) EscrowTable() (BalanceTable, error) { + bt, err := adt6.AsBalanceTable(s.store, s.State.EscrowTable) + if err != nil { + return nil, err + } + return &balanceTable6{bt}, nil +} + +func (s *state6) LockedTable() (BalanceTable, error) { + bt, err := adt6.AsBalanceTable(s.store, s.State.LockedTable) + if err != nil { + return nil, err + } + return &balanceTable6{bt}, nil +} + +func (s *state6) VerifyDealsForActivation( + minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, +) (weight, verifiedWeight abi.DealWeight, err error) { + w, vw, _, err := market6.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) + return w, vw, err +} + +func (s *state6) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + +type balanceTable6 struct { + *adt6.BalanceTable +} + +func (bt *balanceTable6) ForEach(cb func(address.Address, abi.TokenAmount) error) error { + asMap := (*adt6.Map)(bt.BalanceTable) + var ta abi.TokenAmount + return asMap.ForEach(&ta, func(key string) error { + a, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(a, ta) + }) +} + +type dealStates6 struct { + adt.Array +} + +func (s *dealStates6) Get(dealID abi.DealID) (*DealState, bool, error) { + var deal6 market6.DealState + found, err := s.Array.Get(uint64(dealID), &deal6) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + deal := fromV6DealState(deal6) + return &deal, true, nil +} + +func (s *dealStates6) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { + var ds6 market6.DealState + return s.Array.ForEach(&ds6, func(idx int64) error { + return cb(abi.DealID(idx), fromV6DealState(ds6)) + }) +} + +func (s *dealStates6) decode(val *cbg.Deferred) (*DealState, error) { + var ds6 market6.DealState + if err := ds6.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + ds := fromV6DealState(ds6) + return &ds, nil +} + +func (s *dealStates6) array() adt.Array { + return s.Array +} + +func fromV6DealState(v6 market6.DealState) DealState { + return (DealState)(v6) +} + +type dealProposals6 struct { + adt.Array +} + +func (s *dealProposals6) Get(dealID abi.DealID) (*DealProposal, bool, error) { + var proposal6 market6.DealProposal + found, err := s.Array.Get(uint64(dealID), &proposal6) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + proposal := fromV6DealProposal(proposal6) + return &proposal, true, nil +} + +func (s *dealProposals6) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { + var dp6 market6.DealProposal + return s.Array.ForEach(&dp6, func(idx int64) error { + return cb(abi.DealID(idx), fromV6DealProposal(dp6)) + }) +} + +func (s *dealProposals6) decode(val *cbg.Deferred) (*DealProposal, error) { + var dp6 market6.DealProposal + if err := dp6.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + dp := fromV6DealProposal(dp6) + return &dp, nil +} + +func (s *dealProposals6) array() adt.Array { + return s.Array +} + +func fromV6DealProposal(v6 market6.DealProposal) DealProposal { + return (DealProposal)(v6) +} + +func (s *state6) GetState() interface{} { + return &s.State +} + +var _ PublishStorageDealsReturn = (*publishStorageDealsReturn6)(nil) + +func decodePublishStorageDealsReturn6(b []byte) (PublishStorageDealsReturn, error) { + var retval market6.PublishStorageDealsReturn + if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { + return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) + } + + return &publishStorageDealsReturn6{retval}, nil +} + +type publishStorageDealsReturn6 struct { + market6.PublishStorageDealsReturn +} + +func (r *publishStorageDealsReturn6) IsDealValid(index uint64) (bool, error) { + + return r.ValidDeals.IsSet(index) + +} + +func (r *publishStorageDealsReturn6) DealIDs() ([]abi.DealID, error) { + return r.IDs, nil +} diff --git a/venus-shared/actors/builtin/miner/actor.go b/venus-shared/actors/builtin/miner/actor.go new file mode 100644 index 0000000000..d3a9d60959 --- /dev/null +++ b/venus-shared/actors/builtin/miner/actor.go @@ -0,0 +1,398 @@ +// FETCHED FROM LOTUS: builtin/miner/actor.go.template + +package miner + +import ( + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/cbor" + "github.com/filecoin-project/go-state-types/dline" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" + + miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" + miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" + miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" + miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" +) + +func init() { + + builtin.RegisterActorState(builtin0.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + + builtin.RegisterActorState(builtin2.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + + builtin.RegisterActorState(builtin3.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + + builtin.RegisterActorState(builtin4.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + + builtin.RegisterActorState(builtin5.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + + builtin.RegisterActorState(builtin6.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) + +} + +var Methods = builtin6.MethodsMiner + +// Unchanged between v0, v2, v3, v4, and v5 actors +var WPoStProvingPeriod = miner0.WPoStProvingPeriod +var WPoStPeriodDeadlines = miner0.WPoStPeriodDeadlines +var WPoStChallengeWindow = miner0.WPoStChallengeWindow +var WPoStChallengeLookback = miner0.WPoStChallengeLookback +var FaultDeclarationCutoff = miner0.FaultDeclarationCutoff + +const MinSectorExpiration = miner0.MinSectorExpiration + +// Not used / checked in v0 +// TODO: Abstract over network versions +var DeclarationsMax = miner2.DeclarationsMax +var AddressedSectorsMax = miner2.AddressedSectorsMax + +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { + + case builtin0.StorageMinerActorCodeID: + return load0(store, act.Head) + + case builtin2.StorageMinerActorCodeID: + return load2(store, act.Head) + + case builtin3.StorageMinerActorCodeID: + return load3(store, act.Head) + + case builtin4.StorageMinerActorCodeID: + return load4(store, act.Head) + + case builtin5.StorageMinerActorCodeID: + return load5(store, act.Head) + + case builtin6.StorageMinerActorCodeID: + return load6(store, act.Head) + + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version) (State, error) { + switch av { + + case actors.Version0: + return make0(store) + + case actors.Version2: + return make2(store) + + case actors.Version3: + return make3(store) + + case actors.Version4: + return make4(store) + + case actors.Version5: + return make5(store) + + case actors.Version6: + return make6(store) + + } + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { + + case actors.Version0: + return builtin0.StorageMinerActorCodeID, nil + + case actors.Version2: + return builtin2.StorageMinerActorCodeID, nil + + case actors.Version3: + return builtin3.StorageMinerActorCodeID, nil + + case actors.Version4: + return builtin4.StorageMinerActorCodeID, nil + + case actors.Version5: + return builtin5.StorageMinerActorCodeID, nil + + case actors.Version6: + return builtin6.StorageMinerActorCodeID, nil + + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + cbor.Marshaler + + // Total available balance to spend. + AvailableBalance(abi.TokenAmount) (abi.TokenAmount, error) + // Funds that will vest by the given epoch. + VestedFunds(abi.ChainEpoch) (abi.TokenAmount, error) + // Funds locked for various reasons. + LockedFunds() (LockedFunds, error) + FeeDebt() (abi.TokenAmount, error) + + GetSector(abi.SectorNumber) (*SectorOnChainInfo, error) + FindSector(abi.SectorNumber) (*SectorLocation, error) + GetSectorExpiration(abi.SectorNumber) (*SectorExpiration, error) + GetPrecommittedSector(abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) + ForEachPrecommittedSector(func(SectorPreCommitOnChainInfo) error) error + LoadSectors(sectorNos *bitfield.BitField) ([]*SectorOnChainInfo, error) + NumLiveSectors() (uint64, error) + IsAllocated(abi.SectorNumber) (bool, error) + // UnallocatedSectorNumbers returns up to count unallocated sector numbers (or less than + // count if there aren't enough). + UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) + GetAllocatedSectors() (*bitfield.BitField, error) + + // Note that ProvingPeriodStart is deprecated and will be renamed / removed in a future version of actors + GetProvingPeriodStart() (abi.ChainEpoch, error) + // Testing only + EraseAllUnproven() error + + LoadDeadline(idx uint64) (Deadline, error) + ForEachDeadline(cb func(idx uint64, dl Deadline) error) error + NumDeadlines() (uint64, error) + DeadlinesChanged(State) (bool, error) + + Info() (MinerInfo, error) + MinerInfoChanged(State) (bool, error) + + DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) + DeadlineCronActive() (bool, error) + + // Diff helpers. Used by Diff* functions internally. + sectors() (adt.Array, error) + decodeSectorOnChainInfo(*cbg.Deferred) (SectorOnChainInfo, error) + precommits() (adt.Map, error) + decodeSectorPreCommitOnChainInfo(*cbg.Deferred) (SectorPreCommitOnChainInfo, error) + GetState() interface{} +} + +type Deadline interface { + LoadPartition(idx uint64) (Partition, error) + ForEachPartition(cb func(idx uint64, part Partition) error) error + PartitionsPoSted() (bitfield.BitField, error) + + PartitionsChanged(Deadline) (bool, error) + DisputableProofCount() (uint64, error) +} + +type Partition interface { + // AllSectors returns all sector numbers in this partition, including faulty, unproven, and terminated sectors + AllSectors() (bitfield.BitField, error) + + // Subset of sectors detected/declared faulty and not yet recovered (excl. from PoSt). + // Faults ∩ Terminated = ∅ + FaultySectors() (bitfield.BitField, error) + + // Subset of faulty sectors expected to recover on next PoSt + // Recoveries ∩ Terminated = ∅ + RecoveringSectors() (bitfield.BitField, error) + + // Live sectors are those that are not terminated (but may be faulty). + LiveSectors() (bitfield.BitField, error) + + // Active sectors are those that are neither terminated nor faulty nor unproven, i.e. actively contributing power. + ActiveSectors() (bitfield.BitField, error) + + // Unproven sectors in this partition. This bitfield will be cleared on + // a successful window post (or at the end of the partition's next + // deadline). At that time, any still unproven sectors will be added to + // the faulty sector bitfield. + UnprovenSectors() (bitfield.BitField, error) +} + +type SectorOnChainInfo struct { + SectorNumber abi.SectorNumber + SealProof abi.RegisteredSealProof + SealedCID cid.Cid + DealIDs []abi.DealID + Activation abi.ChainEpoch + Expiration abi.ChainEpoch + DealWeight abi.DealWeight + VerifiedDealWeight abi.DealWeight + InitialPledge abi.TokenAmount + ExpectedDayReward abi.TokenAmount + ExpectedStoragePledge abi.TokenAmount +} + +type SectorPreCommitInfo = miner0.SectorPreCommitInfo + +type SectorPreCommitOnChainInfo struct { + Info SectorPreCommitInfo + PreCommitDeposit abi.TokenAmount + PreCommitEpoch abi.ChainEpoch + DealWeight abi.DealWeight + VerifiedDealWeight abi.DealWeight +} + +type PoStPartition = miner0.PoStPartition +type RecoveryDeclaration = miner0.RecoveryDeclaration +type FaultDeclaration = miner0.FaultDeclaration + +// Params +type DeclareFaultsParams = miner0.DeclareFaultsParams +type DeclareFaultsRecoveredParams = miner0.DeclareFaultsRecoveredParams +type SubmitWindowedPoStParams = miner0.SubmitWindowedPoStParams +type ProveCommitSectorParams = miner0.ProveCommitSectorParams +type DisputeWindowedPoStParams = miner3.DisputeWindowedPoStParams +type ProveCommitAggregateParams = miner5.ProveCommitAggregateParams + +func PreferredSealProofTypeFromWindowPoStType(nver network.Version, proof abi.RegisteredPoStProof) (abi.RegisteredSealProof, error) { + // We added support for the new proofs in network version 7, and removed support for the old + // ones in network version 8. + if nver < network.Version7 { + switch proof { + case abi.RegisteredPoStProof_StackedDrgWindow2KiBV1: + return abi.RegisteredSealProof_StackedDrg2KiBV1, nil + case abi.RegisteredPoStProof_StackedDrgWindow8MiBV1: + return abi.RegisteredSealProof_StackedDrg8MiBV1, nil + case abi.RegisteredPoStProof_StackedDrgWindow512MiBV1: + return abi.RegisteredSealProof_StackedDrg512MiBV1, nil + case abi.RegisteredPoStProof_StackedDrgWindow32GiBV1: + return abi.RegisteredSealProof_StackedDrg32GiBV1, nil + case abi.RegisteredPoStProof_StackedDrgWindow64GiBV1: + return abi.RegisteredSealProof_StackedDrg64GiBV1, nil + default: + return -1, xerrors.Errorf("unrecognized window post type: %d", proof) + } + } + + switch proof { + case abi.RegisteredPoStProof_StackedDrgWindow2KiBV1: + return abi.RegisteredSealProof_StackedDrg2KiBV1_1, nil + case abi.RegisteredPoStProof_StackedDrgWindow8MiBV1: + return abi.RegisteredSealProof_StackedDrg8MiBV1_1, nil + case abi.RegisteredPoStProof_StackedDrgWindow512MiBV1: + return abi.RegisteredSealProof_StackedDrg512MiBV1_1, nil + case abi.RegisteredPoStProof_StackedDrgWindow32GiBV1: + return abi.RegisteredSealProof_StackedDrg32GiBV1_1, nil + case abi.RegisteredPoStProof_StackedDrgWindow64GiBV1: + return abi.RegisteredSealProof_StackedDrg64GiBV1_1, nil + default: + return -1, xerrors.Errorf("unrecognized window post type: %d", proof) + } +} + +func WinningPoStProofTypeFromWindowPoStProofType(nver network.Version, proof abi.RegisteredPoStProof) (abi.RegisteredPoStProof, error) { + switch proof { + case abi.RegisteredPoStProof_StackedDrgWindow2KiBV1: + return abi.RegisteredPoStProof_StackedDrgWinning2KiBV1, nil + case abi.RegisteredPoStProof_StackedDrgWindow8MiBV1: + return abi.RegisteredPoStProof_StackedDrgWinning8MiBV1, nil + case abi.RegisteredPoStProof_StackedDrgWindow512MiBV1: + return abi.RegisteredPoStProof_StackedDrgWinning512MiBV1, nil + case abi.RegisteredPoStProof_StackedDrgWindow32GiBV1: + return abi.RegisteredPoStProof_StackedDrgWinning32GiBV1, nil + case abi.RegisteredPoStProof_StackedDrgWindow64GiBV1: + return abi.RegisteredPoStProof_StackedDrgWinning64GiBV1, nil + default: + return -1, xerrors.Errorf("unknown proof type %d", proof) + } +} + +type MinerInfo struct { + Owner address.Address // Must be an ID-address. + Worker address.Address // Must be an ID-address. + NewWorker address.Address // Must be an ID-address. + ControlAddresses []address.Address // Must be an ID-addresses. + WorkerChangeEpoch abi.ChainEpoch + PeerId *peer.ID + Multiaddrs []abi.Multiaddrs + WindowPoStProofType abi.RegisteredPoStProof + SectorSize abi.SectorSize + WindowPoStPartitionSectors uint64 + ConsensusFaultElapsed abi.ChainEpoch +} + +func (mi MinerInfo) IsController(addr address.Address) bool { + if addr == mi.Owner || addr == mi.Worker { + return true + } + + for _, ca := range mi.ControlAddresses { + if addr == ca { + return true + } + } + + return false +} + +type SectorExpiration struct { + OnTime abi.ChainEpoch + + // non-zero if sector is faulty, epoch at which it will be permanently + // removed if it doesn't recover + Early abi.ChainEpoch +} + +type SectorLocation struct { + Deadline uint64 + Partition uint64 +} + +type SectorChanges struct { + Added []SectorOnChainInfo + Extended []SectorExtensions + Removed []SectorOnChainInfo +} + +type SectorExtensions struct { + From SectorOnChainInfo + To SectorOnChainInfo +} + +type PreCommitChanges struct { + Added []SectorPreCommitOnChainInfo + Removed []SectorPreCommitOnChainInfo +} + +type LockedFunds struct { + VestingFunds abi.TokenAmount + InitialPledgeRequirement abi.TokenAmount + PreCommitDeposits abi.TokenAmount +} + +func (lf LockedFunds) TotalLockedFunds() abi.TokenAmount { + return big.Add(lf.VestingFunds, big.Add(lf.InitialPledgeRequirement, lf.PreCommitDeposits)) +} diff --git a/venus-shared/actors/builtin/miner/state.v0.go b/venus-shared/actors/builtin/miner/state.v0.go new file mode 100644 index 0000000000..00feff13e4 --- /dev/null +++ b/venus-shared/actors/builtin/miner/state.v0.go @@ -0,0 +1,523 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + +package miner + +import ( + "bytes" + "errors" + + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" + adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" +) + +var _ State = (*state0)(nil) + +func load0(store adt.Store, root cid.Cid) (State, error) { + out := state0{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make0(store adt.Store) (State, error) { + out := state0{store: store} + out.State = miner0.State{} + return &out, nil +} + +type state0 struct { + miner0.State + store adt.Store +} + +type deadline0 struct { + miner0.Deadline + store adt.Store +} + +type partition0 struct { + miner0.Partition + store adt.Store +} + +func (s *state0) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { + defer func() { + if r := recover(); r != nil { + err = xerrors.Errorf("failed to get available balance: %w", r) + available = abi.NewTokenAmount(0) + } + }() + // this panics if the miner doesnt have enough funds to cover their locked pledge + available = s.GetAvailableBalance(bal) + return available, err +} + +func (s *state0) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.CheckVestedFunds(s.store, epoch) +} + +func (s *state0) LockedFunds() (LockedFunds, error) { + return LockedFunds{ + VestingFunds: s.State.LockedFunds, + InitialPledgeRequirement: s.State.InitialPledgeRequirement, + PreCommitDeposits: s.State.PreCommitDeposits, + }, nil +} + +func (s *state0) FeeDebt() (abi.TokenAmount, error) { + return big.Zero(), nil +} + +func (s *state0) InitialPledge() (abi.TokenAmount, error) { + return s.State.InitialPledgeRequirement, nil +} + +func (s *state0) PreCommitDeposits() (abi.TokenAmount, error) { + return s.State.PreCommitDeposits, nil +} + +func (s *state0) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { + info, ok, err := s.State.GetSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV0SectorOnChainInfo(*info) + return &ret, nil +} + +func (s *state0) FindSector(num abi.SectorNumber) (*SectorLocation, error) { + dlIdx, partIdx, err := s.State.FindSector(s.store, num) + if err != nil { + return nil, err + } + return &SectorLocation{ + Deadline: dlIdx, + Partition: partIdx, + }, nil +} + +func (s *state0) NumLiveSectors() (uint64, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return 0, err + } + var total uint64 + if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner0.Deadline) error { + total += dl.LiveSectors + return nil + }); err != nil { + return 0, err + } + return total, nil +} + +// GetSectorExpiration returns the effective expiration of the given sector. +// +// If the sector does not expire early, the Early expiration field is 0. +func (s *state0) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + // NOTE: this can be optimized significantly. + // 1. If the sector is non-faulty, it will either expire on-time (can be + // learned from the sector info), or in the next quantized expiration + // epoch (i.e., the first element in the partition's expiration queue. + // 2. If it's faulty, it will expire early within the first 14 entries + // of the expiration queue. + stopErr := errors.New("stop") + out := SectorExpiration{} + err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner0.Deadline) error { + partitions, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + quant := s.State.QuantSpecForDeadline(dlIdx) + var part miner0.Partition + return partitions.ForEach(&part, func(partIdx int64) error { + if found, err := part.Sectors.IsSet(uint64(num)); err != nil { + return err + } else if !found { + return nil + } + if found, err := part.Terminated.IsSet(uint64(num)); err != nil { + return err + } else if found { + // already terminated + return stopErr + } + + q, err := miner0.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant) + if err != nil { + return err + } + var exp miner0.ExpirationSet + return q.ForEach(&exp, func(epoch int64) error { + if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { + return err + } else if early { + out.Early = abi.ChainEpoch(epoch) + return nil + } + if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { + return err + } else if onTime { + out.OnTime = abi.ChainEpoch(epoch) + return stopErr + } + return nil + }) + }) + }) + if err == stopErr { + err = nil + } + if err != nil { + return nil, err + } + if out.Early == 0 && out.OnTime == 0 { + return nil, xerrors.Errorf("failed to find sector %d", num) + } + return &out, nil +} + +func (s *state0) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { + info, ok, err := s.State.GetPrecommittedSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV0SectorPreCommitOnChainInfo(*info) + + return &ret, nil +} + +func (s *state0) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { + precommitted, err := adt0.AsMap(s.store, s.State.PreCommittedSectors) + if err != nil { + return err + } + + var info miner0.SectorPreCommitOnChainInfo + if err := precommitted.ForEach(&info, func(_ string) error { + return cb(fromV0SectorPreCommitOnChainInfo(info)) + }); err != nil { + return err + } + + return nil +} + +func (s *state0) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { + sectors, err := miner0.LoadSectors(s.store, s.State.Sectors) + if err != nil { + return nil, err + } + + // If no sector numbers are specified, load all. + if snos == nil { + infos := make([]*SectorOnChainInfo, 0, sectors.Length()) + var info0 miner0.SectorOnChainInfo + if err := sectors.ForEach(&info0, func(_ int64) error { + info := fromV0SectorOnChainInfo(info0) + infos = append(infos, &info) + return nil + }); err != nil { + return nil, err + } + return infos, nil + } + + // Otherwise, load selected. + infos0, err := sectors.Load(*snos) + if err != nil { + return nil, err + } + infos := make([]*SectorOnChainInfo, len(infos0)) + for i, info0 := range infos0 { + info := fromV0SectorOnChainInfo(*info0) + infos[i] = &info + } + return infos, nil +} + +func (s *state0) loadAllocatedSectorNumbers() (bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) + return allocatedSectors, err +} + +func (s *state0) IsAllocated(num abi.SectorNumber) (bool, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return false, err + } + + return allocatedSectors.IsSet(uint64(num)) +} + +func (s *state0) GetProvingPeriodStart() (abi.ChainEpoch, error) { + return s.State.ProvingPeriodStart, nil +} + +func (s *state0) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return nil, err + } + + allocatedRuns, err := allocatedSectors.RunIterator() + if err != nil { + return nil, err + } + + unallocatedRuns, err := rle.Subtract( + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + allocatedRuns, + ) + if err != nil { + return nil, err + } + + iter, err := rle.BitsFromRuns(unallocatedRuns) + if err != nil { + return nil, err + } + + sectors := make([]abi.SectorNumber, 0, count) + for iter.HasNext() && len(sectors) < count { + nextNo, err := iter.Next() + if err != nil { + return nil, err + } + sectors = append(sectors, abi.SectorNumber(nextNo)) + } + + return sectors, nil +} + +func (s *state0) GetAllocatedSectors() (*bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { + return nil, err + } + + return &allocatedSectors, nil +} + +func (s *state0) LoadDeadline(idx uint64) (Deadline, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + dl, err := dls.LoadDeadline(s.store, idx) + if err != nil { + return nil, err + } + return &deadline0{*dl, s.store}, nil +} + +func (s *state0) ForEachDeadline(cb func(uint64, Deadline) error) error { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + return dls.ForEach(s.store, func(i uint64, dl *miner0.Deadline) error { + return cb(i, &deadline0{*dl, s.store}) + }) +} + +func (s *state0) NumDeadlines() (uint64, error) { + return miner0.WPoStPeriodDeadlines, nil +} + +func (s *state0) DeadlinesChanged(other State) (bool, error) { + other0, ok := other.(*state0) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !s.State.Deadlines.Equals(other0.Deadlines), nil +} + +func (s *state0) MinerInfoChanged(other State) (bool, error) { + other0, ok := other.(*state0) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Info.Equals(other0.State.Info), nil +} + +func (s *state0) Info() (MinerInfo, error) { + info, err := s.State.GetInfo(s.store) + if err != nil { + return MinerInfo{}, err + } + + var pid *peer.ID + if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { + pid = &peerID + } + + wpp, err := info.SealProofType.RegisteredWindowPoStProof() + if err != nil { + return MinerInfo{}, err + } + + mi := MinerInfo{ + Owner: info.Owner, + Worker: info.Worker, + ControlAddresses: info.ControlAddresses, + + NewWorker: address.Undef, + WorkerChangeEpoch: -1, + + PeerId: pid, + Multiaddrs: info.Multiaddrs, + WindowPoStProofType: wpp, + SectorSize: info.SectorSize, + WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, + ConsensusFaultElapsed: -1, + } + + if info.PendingWorkerKey != nil { + mi.NewWorker = info.PendingWorkerKey.NewWorker + mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt + } + + return mi, nil +} + +func (s *state0) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { + return s.State.DeadlineInfo(epoch), nil +} + +func (s *state0) DeadlineCronActive() (bool, error) { + return true, nil // always active in this version +} + +func (s *state0) sectors() (adt.Array, error) { + return adt0.AsArray(s.store, s.Sectors) +} + +func (s *state0) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { + var si miner0.SectorOnChainInfo + err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorOnChainInfo{}, err + } + + return fromV0SectorOnChainInfo(si), nil +} + +func (s *state0) precommits() (adt.Map, error) { + return adt0.AsMap(s.store, s.PreCommittedSectors) +} + +func (s *state0) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { + var sp miner0.SectorPreCommitOnChainInfo + err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorPreCommitOnChainInfo{}, err + } + + return fromV0SectorPreCommitOnChainInfo(sp), nil +} + +func (s *state0) EraseAllUnproven() error { + + // field doesn't exist until v2 + return nil + +} + +func (d *deadline0) LoadPartition(idx uint64) (Partition, error) { + p, err := d.Deadline.LoadPartition(d.store, idx) + if err != nil { + return nil, err + } + return &partition0{*p, d.store}, nil +} + +func (d *deadline0) ForEachPartition(cb func(uint64, Partition) error) error { + ps, err := d.Deadline.PartitionsArray(d.store) + if err != nil { + return err + } + var part miner0.Partition + return ps.ForEach(&part, func(i int64) error { + return cb(uint64(i), &partition0{part, d.store}) + }) +} + +func (d *deadline0) PartitionsChanged(other Deadline) (bool, error) { + other0, ok := other.(*deadline0) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !d.Deadline.Partitions.Equals(other0.Deadline.Partitions), nil +} + +func (d *deadline0) PartitionsPoSted() (bitfield.BitField, error) { + return d.Deadline.PostSubmissions, nil +} + +func (d *deadline0) DisputableProofCount() (uint64, error) { + + // field doesn't exist until v3 + return 0, nil + +} + +func (p *partition0) AllSectors() (bitfield.BitField, error) { + return p.Partition.Sectors, nil +} + +func (p *partition0) FaultySectors() (bitfield.BitField, error) { + return p.Partition.Faults, nil +} + +func (p *partition0) RecoveringSectors() (bitfield.BitField, error) { + return p.Partition.Recoveries, nil +} + +func (p *partition0) UnprovenSectors() (bitfield.BitField, error) { + return bitfield.New(), nil +} + +func fromV0SectorOnChainInfo(v0 miner0.SectorOnChainInfo) SectorOnChainInfo { + + return (SectorOnChainInfo)(v0) + +} + +func fromV0SectorPreCommitOnChainInfo(v0 miner0.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { + + return (SectorPreCommitOnChainInfo)(v0) + +} + +func (s *state0) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/miner/state.v2.go b/venus-shared/actors/builtin/miner/state.v2.go new file mode 100644 index 0000000000..dc14fca95a --- /dev/null +++ b/venus-shared/actors/builtin/miner/state.v2.go @@ -0,0 +1,571 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + +package miner + +import ( + "bytes" + "errors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" + adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" +) + +var _ State = (*state2)(nil) + +func load2(store adt.Store, root cid.Cid) (State, error) { + out := state2{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make2(store adt.Store) (State, error) { + out := state2{store: store} + out.State = miner2.State{} + return &out, nil +} + +type state2 struct { + miner2.State + store adt.Store +} + +type deadline2 struct { + miner2.Deadline + store adt.Store +} + +type partition2 struct { + miner2.Partition + store adt.Store +} + +func (s *state2) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { + defer func() { + if r := recover(); r != nil { + err = xerrors.Errorf("failed to get available balance: %w", r) + available = abi.NewTokenAmount(0) + } + }() + // this panics if the miner doesnt have enough funds to cover their locked pledge + available, err = s.GetAvailableBalance(bal) + return available, err +} + +func (s *state2) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.CheckVestedFunds(s.store, epoch) +} + +func (s *state2) LockedFunds() (LockedFunds, error) { + return LockedFunds{ + VestingFunds: s.State.LockedFunds, + InitialPledgeRequirement: s.State.InitialPledge, + PreCommitDeposits: s.State.PreCommitDeposits, + }, nil +} + +func (s *state2) FeeDebt() (abi.TokenAmount, error) { + return s.State.FeeDebt, nil +} + +func (s *state2) InitialPledge() (abi.TokenAmount, error) { + return s.State.InitialPledge, nil +} + +func (s *state2) PreCommitDeposits() (abi.TokenAmount, error) { + return s.State.PreCommitDeposits, nil +} + +func (s *state2) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { + info, ok, err := s.State.GetSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV2SectorOnChainInfo(*info) + return &ret, nil +} + +func (s *state2) FindSector(num abi.SectorNumber) (*SectorLocation, error) { + dlIdx, partIdx, err := s.State.FindSector(s.store, num) + if err != nil { + return nil, err + } + return &SectorLocation{ + Deadline: dlIdx, + Partition: partIdx, + }, nil +} + +func (s *state2) NumLiveSectors() (uint64, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return 0, err + } + var total uint64 + if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner2.Deadline) error { + total += dl.LiveSectors + return nil + }); err != nil { + return 0, err + } + return total, nil +} + +// GetSectorExpiration returns the effective expiration of the given sector. +// +// If the sector does not expire early, the Early expiration field is 0. +func (s *state2) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + // NOTE: this can be optimized significantly. + // 1. If the sector is non-faulty, it will either expire on-time (can be + // learned from the sector info), or in the next quantized expiration + // epoch (i.e., the first element in the partition's expiration queue. + // 2. If it's faulty, it will expire early within the first 14 entries + // of the expiration queue. + stopErr := errors.New("stop") + out := SectorExpiration{} + err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner2.Deadline) error { + partitions, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + quant := s.State.QuantSpecForDeadline(dlIdx) + var part miner2.Partition + return partitions.ForEach(&part, func(partIdx int64) error { + if found, err := part.Sectors.IsSet(uint64(num)); err != nil { + return err + } else if !found { + return nil + } + if found, err := part.Terminated.IsSet(uint64(num)); err != nil { + return err + } else if found { + // already terminated + return stopErr + } + + q, err := miner2.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant) + if err != nil { + return err + } + var exp miner2.ExpirationSet + return q.ForEach(&exp, func(epoch int64) error { + if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { + return err + } else if early { + out.Early = abi.ChainEpoch(epoch) + return nil + } + if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { + return err + } else if onTime { + out.OnTime = abi.ChainEpoch(epoch) + return stopErr + } + return nil + }) + }) + }) + if err == stopErr { + err = nil + } + if err != nil { + return nil, err + } + if out.Early == 0 && out.OnTime == 0 { + return nil, xerrors.Errorf("failed to find sector %d", num) + } + return &out, nil +} + +func (s *state2) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { + info, ok, err := s.State.GetPrecommittedSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV2SectorPreCommitOnChainInfo(*info) + + return &ret, nil +} + +func (s *state2) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { + precommitted, err := adt2.AsMap(s.store, s.State.PreCommittedSectors) + if err != nil { + return err + } + + var info miner2.SectorPreCommitOnChainInfo + if err := precommitted.ForEach(&info, func(_ string) error { + return cb(fromV2SectorPreCommitOnChainInfo(info)) + }); err != nil { + return err + } + + return nil +} + +func (s *state2) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { + sectors, err := miner2.LoadSectors(s.store, s.State.Sectors) + if err != nil { + return nil, err + } + + // If no sector numbers are specified, load all. + if snos == nil { + infos := make([]*SectorOnChainInfo, 0, sectors.Length()) + var info2 miner2.SectorOnChainInfo + if err := sectors.ForEach(&info2, func(_ int64) error { + info := fromV2SectorOnChainInfo(info2) + infos = append(infos, &info) + return nil + }); err != nil { + return nil, err + } + return infos, nil + } + + // Otherwise, load selected. + infos2, err := sectors.Load(*snos) + if err != nil { + return nil, err + } + infos := make([]*SectorOnChainInfo, len(infos2)) + for i, info2 := range infos2 { + info := fromV2SectorOnChainInfo(*info2) + infos[i] = &info + } + return infos, nil +} + +func (s *state2) loadAllocatedSectorNumbers() (bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) + return allocatedSectors, err +} + +func (s *state2) IsAllocated(num abi.SectorNumber) (bool, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return false, err + } + + return allocatedSectors.IsSet(uint64(num)) +} + +func (s *state2) GetProvingPeriodStart() (abi.ChainEpoch, error) { + return s.State.ProvingPeriodStart, nil +} + +func (s *state2) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return nil, err + } + + allocatedRuns, err := allocatedSectors.RunIterator() + if err != nil { + return nil, err + } + + unallocatedRuns, err := rle.Subtract( + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + allocatedRuns, + ) + if err != nil { + return nil, err + } + + iter, err := rle.BitsFromRuns(unallocatedRuns) + if err != nil { + return nil, err + } + + sectors := make([]abi.SectorNumber, 0, count) + for iter.HasNext() && len(sectors) < count { + nextNo, err := iter.Next() + if err != nil { + return nil, err + } + sectors = append(sectors, abi.SectorNumber(nextNo)) + } + + return sectors, nil +} + +func (s *state2) GetAllocatedSectors() (*bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { + return nil, err + } + + return &allocatedSectors, nil +} + +func (s *state2) LoadDeadline(idx uint64) (Deadline, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + dl, err := dls.LoadDeadline(s.store, idx) + if err != nil { + return nil, err + } + return &deadline2{*dl, s.store}, nil +} + +func (s *state2) ForEachDeadline(cb func(uint64, Deadline) error) error { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + return dls.ForEach(s.store, func(i uint64, dl *miner2.Deadline) error { + return cb(i, &deadline2{*dl, s.store}) + }) +} + +func (s *state2) NumDeadlines() (uint64, error) { + return miner2.WPoStPeriodDeadlines, nil +} + +func (s *state2) DeadlinesChanged(other State) (bool, error) { + other2, ok := other.(*state2) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !s.State.Deadlines.Equals(other2.Deadlines), nil +} + +func (s *state2) MinerInfoChanged(other State) (bool, error) { + other0, ok := other.(*state2) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Info.Equals(other0.State.Info), nil +} + +func (s *state2) Info() (MinerInfo, error) { + info, err := s.State.GetInfo(s.store) + if err != nil { + return MinerInfo{}, err + } + + var pid *peer.ID + if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { + pid = &peerID + } + + wpp, err := info.SealProofType.RegisteredWindowPoStProof() + if err != nil { + return MinerInfo{}, err + } + + mi := MinerInfo{ + Owner: info.Owner, + Worker: info.Worker, + ControlAddresses: info.ControlAddresses, + + NewWorker: address.Undef, + WorkerChangeEpoch: -1, + + PeerId: pid, + Multiaddrs: info.Multiaddrs, + WindowPoStProofType: wpp, + SectorSize: info.SectorSize, + WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, + ConsensusFaultElapsed: info.ConsensusFaultElapsed, + } + + if info.PendingWorkerKey != nil { + mi.NewWorker = info.PendingWorkerKey.NewWorker + mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt + } + + return mi, nil +} + +func (s *state2) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { + return s.State.DeadlineInfo(epoch), nil +} + +func (s *state2) DeadlineCronActive() (bool, error) { + return true, nil // always active in this version +} + +func (s *state2) sectors() (adt.Array, error) { + return adt2.AsArray(s.store, s.Sectors) +} + +func (s *state2) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { + var si miner2.SectorOnChainInfo + err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorOnChainInfo{}, err + } + + return fromV2SectorOnChainInfo(si), nil +} + +func (s *state2) precommits() (adt.Map, error) { + return adt2.AsMap(s.store, s.PreCommittedSectors) +} + +func (s *state2) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { + var sp miner2.SectorPreCommitOnChainInfo + err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorPreCommitOnChainInfo{}, err + } + + return fromV2SectorPreCommitOnChainInfo(sp), nil +} + +func (s *state2) EraseAllUnproven() error { + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner2.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner2.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + +} + +func (d *deadline2) LoadPartition(idx uint64) (Partition, error) { + p, err := d.Deadline.LoadPartition(d.store, idx) + if err != nil { + return nil, err + } + return &partition2{*p, d.store}, nil +} + +func (d *deadline2) ForEachPartition(cb func(uint64, Partition) error) error { + ps, err := d.Deadline.PartitionsArray(d.store) + if err != nil { + return err + } + var part miner2.Partition + return ps.ForEach(&part, func(i int64) error { + return cb(uint64(i), &partition2{part, d.store}) + }) +} + +func (d *deadline2) PartitionsChanged(other Deadline) (bool, error) { + other2, ok := other.(*deadline2) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !d.Deadline.Partitions.Equals(other2.Deadline.Partitions), nil +} + +func (d *deadline2) PartitionsPoSted() (bitfield.BitField, error) { + return d.Deadline.PostSubmissions, nil +} + +func (d *deadline2) DisputableProofCount() (uint64, error) { + + // field doesn't exist until v3 + return 0, nil + +} + +func (p *partition2) AllSectors() (bitfield.BitField, error) { + return p.Partition.Sectors, nil +} + +func (p *partition2) FaultySectors() (bitfield.BitField, error) { + return p.Partition.Faults, nil +} + +func (p *partition2) RecoveringSectors() (bitfield.BitField, error) { + return p.Partition.Recoveries, nil +} + +func (p *partition2) UnprovenSectors() (bitfield.BitField, error) { + return p.Partition.Unproven, nil +} + +func fromV2SectorOnChainInfo(v2 miner2.SectorOnChainInfo) SectorOnChainInfo { + + return SectorOnChainInfo{ + SectorNumber: v2.SectorNumber, + SealProof: v2.SealProof, + SealedCID: v2.SealedCID, + DealIDs: v2.DealIDs, + Activation: v2.Activation, + Expiration: v2.Expiration, + DealWeight: v2.DealWeight, + VerifiedDealWeight: v2.VerifiedDealWeight, + InitialPledge: v2.InitialPledge, + ExpectedDayReward: v2.ExpectedDayReward, + ExpectedStoragePledge: v2.ExpectedStoragePledge, + } + +} + +func fromV2SectorPreCommitOnChainInfo(v2 miner2.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { + + return SectorPreCommitOnChainInfo{ + Info: (SectorPreCommitInfo)(v2.Info), + PreCommitDeposit: v2.PreCommitDeposit, + PreCommitEpoch: v2.PreCommitEpoch, + DealWeight: v2.DealWeight, + VerifiedDealWeight: v2.VerifiedDealWeight, + } + +} + +func (s *state2) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/miner/state.v3.go b/venus-shared/actors/builtin/miner/state.v3.go new file mode 100644 index 0000000000..63cbfaa60c --- /dev/null +++ b/venus-shared/actors/builtin/miner/state.v3.go @@ -0,0 +1,572 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + +package miner + +import ( + "bytes" + "errors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" + adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" +) + +var _ State = (*state3)(nil) + +func load3(store adt.Store, root cid.Cid) (State, error) { + out := state3{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make3(store adt.Store) (State, error) { + out := state3{store: store} + out.State = miner3.State{} + return &out, nil +} + +type state3 struct { + miner3.State + store adt.Store +} + +type deadline3 struct { + miner3.Deadline + store adt.Store +} + +type partition3 struct { + miner3.Partition + store adt.Store +} + +func (s *state3) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { + defer func() { + if r := recover(); r != nil { + err = xerrors.Errorf("failed to get available balance: %w", r) + available = abi.NewTokenAmount(0) + } + }() + // this panics if the miner doesnt have enough funds to cover their locked pledge + available, err = s.GetAvailableBalance(bal) + return available, err +} + +func (s *state3) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.CheckVestedFunds(s.store, epoch) +} + +func (s *state3) LockedFunds() (LockedFunds, error) { + return LockedFunds{ + VestingFunds: s.State.LockedFunds, + InitialPledgeRequirement: s.State.InitialPledge, + PreCommitDeposits: s.State.PreCommitDeposits, + }, nil +} + +func (s *state3) FeeDebt() (abi.TokenAmount, error) { + return s.State.FeeDebt, nil +} + +func (s *state3) InitialPledge() (abi.TokenAmount, error) { + return s.State.InitialPledge, nil +} + +func (s *state3) PreCommitDeposits() (abi.TokenAmount, error) { + return s.State.PreCommitDeposits, nil +} + +func (s *state3) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { + info, ok, err := s.State.GetSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV3SectorOnChainInfo(*info) + return &ret, nil +} + +func (s *state3) FindSector(num abi.SectorNumber) (*SectorLocation, error) { + dlIdx, partIdx, err := s.State.FindSector(s.store, num) + if err != nil { + return nil, err + } + return &SectorLocation{ + Deadline: dlIdx, + Partition: partIdx, + }, nil +} + +func (s *state3) NumLiveSectors() (uint64, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return 0, err + } + var total uint64 + if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner3.Deadline) error { + total += dl.LiveSectors + return nil + }); err != nil { + return 0, err + } + return total, nil +} + +// GetSectorExpiration returns the effective expiration of the given sector. +// +// If the sector does not expire early, the Early expiration field is 0. +func (s *state3) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + // NOTE: this can be optimized significantly. + // 1. If the sector is non-faulty, it will either expire on-time (can be + // learned from the sector info), or in the next quantized expiration + // epoch (i.e., the first element in the partition's expiration queue. + // 2. If it's faulty, it will expire early within the first 14 entries + // of the expiration queue. + stopErr := errors.New("stop") + out := SectorExpiration{} + err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner3.Deadline) error { + partitions, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + quant := s.State.QuantSpecForDeadline(dlIdx) + var part miner3.Partition + return partitions.ForEach(&part, func(partIdx int64) error { + if found, err := part.Sectors.IsSet(uint64(num)); err != nil { + return err + } else if !found { + return nil + } + if found, err := part.Terminated.IsSet(uint64(num)); err != nil { + return err + } else if found { + // already terminated + return stopErr + } + + q, err := miner3.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner3.PartitionExpirationAmtBitwidth) + if err != nil { + return err + } + var exp miner3.ExpirationSet + return q.ForEach(&exp, func(epoch int64) error { + if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { + return err + } else if early { + out.Early = abi.ChainEpoch(epoch) + return nil + } + if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { + return err + } else if onTime { + out.OnTime = abi.ChainEpoch(epoch) + return stopErr + } + return nil + }) + }) + }) + if err == stopErr { + err = nil + } + if err != nil { + return nil, err + } + if out.Early == 0 && out.OnTime == 0 { + return nil, xerrors.Errorf("failed to find sector %d", num) + } + return &out, nil +} + +func (s *state3) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { + info, ok, err := s.State.GetPrecommittedSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV3SectorPreCommitOnChainInfo(*info) + + return &ret, nil +} + +func (s *state3) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { + precommitted, err := adt3.AsMap(s.store, s.State.PreCommittedSectors, builtin3.DefaultHamtBitwidth) + if err != nil { + return err + } + + var info miner3.SectorPreCommitOnChainInfo + if err := precommitted.ForEach(&info, func(_ string) error { + return cb(fromV3SectorPreCommitOnChainInfo(info)) + }); err != nil { + return err + } + + return nil +} + +func (s *state3) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { + sectors, err := miner3.LoadSectors(s.store, s.State.Sectors) + if err != nil { + return nil, err + } + + // If no sector numbers are specified, load all. + if snos == nil { + infos := make([]*SectorOnChainInfo, 0, sectors.Length()) + var info3 miner3.SectorOnChainInfo + if err := sectors.ForEach(&info3, func(_ int64) error { + info := fromV3SectorOnChainInfo(info3) + infos = append(infos, &info) + return nil + }); err != nil { + return nil, err + } + return infos, nil + } + + // Otherwise, load selected. + infos3, err := sectors.Load(*snos) + if err != nil { + return nil, err + } + infos := make([]*SectorOnChainInfo, len(infos3)) + for i, info3 := range infos3 { + info := fromV3SectorOnChainInfo(*info3) + infos[i] = &info + } + return infos, nil +} + +func (s *state3) loadAllocatedSectorNumbers() (bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) + return allocatedSectors, err +} + +func (s *state3) IsAllocated(num abi.SectorNumber) (bool, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return false, err + } + + return allocatedSectors.IsSet(uint64(num)) +} + +func (s *state3) GetProvingPeriodStart() (abi.ChainEpoch, error) { + return s.State.ProvingPeriodStart, nil +} + +func (s *state3) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return nil, err + } + + allocatedRuns, err := allocatedSectors.RunIterator() + if err != nil { + return nil, err + } + + unallocatedRuns, err := rle.Subtract( + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + allocatedRuns, + ) + if err != nil { + return nil, err + } + + iter, err := rle.BitsFromRuns(unallocatedRuns) + if err != nil { + return nil, err + } + + sectors := make([]abi.SectorNumber, 0, count) + for iter.HasNext() && len(sectors) < count { + nextNo, err := iter.Next() + if err != nil { + return nil, err + } + sectors = append(sectors, abi.SectorNumber(nextNo)) + } + + return sectors, nil +} + +func (s *state3) GetAllocatedSectors() (*bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { + return nil, err + } + + return &allocatedSectors, nil +} + +func (s *state3) LoadDeadline(idx uint64) (Deadline, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + dl, err := dls.LoadDeadline(s.store, idx) + if err != nil { + return nil, err + } + return &deadline3{*dl, s.store}, nil +} + +func (s *state3) ForEachDeadline(cb func(uint64, Deadline) error) error { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + return dls.ForEach(s.store, func(i uint64, dl *miner3.Deadline) error { + return cb(i, &deadline3{*dl, s.store}) + }) +} + +func (s *state3) NumDeadlines() (uint64, error) { + return miner3.WPoStPeriodDeadlines, nil +} + +func (s *state3) DeadlinesChanged(other State) (bool, error) { + other3, ok := other.(*state3) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !s.State.Deadlines.Equals(other3.Deadlines), nil +} + +func (s *state3) MinerInfoChanged(other State) (bool, error) { + other0, ok := other.(*state3) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Info.Equals(other0.State.Info), nil +} + +func (s *state3) Info() (MinerInfo, error) { + info, err := s.State.GetInfo(s.store) + if err != nil { + return MinerInfo{}, err + } + + var pid *peer.ID + if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { + pid = &peerID + } + + mi := MinerInfo{ + Owner: info.Owner, + Worker: info.Worker, + ControlAddresses: info.ControlAddresses, + + NewWorker: address.Undef, + WorkerChangeEpoch: -1, + + PeerId: pid, + Multiaddrs: info.Multiaddrs, + WindowPoStProofType: info.WindowPoStProofType, + SectorSize: info.SectorSize, + WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, + ConsensusFaultElapsed: info.ConsensusFaultElapsed, + } + + if info.PendingWorkerKey != nil { + mi.NewWorker = info.PendingWorkerKey.NewWorker + mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt + } + + return mi, nil +} + +func (s *state3) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { + return s.State.DeadlineInfo(epoch), nil +} + +func (s *state3) DeadlineCronActive() (bool, error) { + return true, nil // always active in this version +} + +func (s *state3) sectors() (adt.Array, error) { + return adt3.AsArray(s.store, s.Sectors, miner3.SectorsAmtBitwidth) +} + +func (s *state3) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { + var si miner3.SectorOnChainInfo + err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorOnChainInfo{}, err + } + + return fromV3SectorOnChainInfo(si), nil +} + +func (s *state3) precommits() (adt.Map, error) { + return adt3.AsMap(s.store, s.PreCommittedSectors, builtin3.DefaultHamtBitwidth) +} + +func (s *state3) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { + var sp miner3.SectorPreCommitOnChainInfo + err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorPreCommitOnChainInfo{}, err + } + + return fromV3SectorPreCommitOnChainInfo(sp), nil +} + +func (s *state3) EraseAllUnproven() error { + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner3.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner3.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + +} + +func (d *deadline3) LoadPartition(idx uint64) (Partition, error) { + p, err := d.Deadline.LoadPartition(d.store, idx) + if err != nil { + return nil, err + } + return &partition3{*p, d.store}, nil +} + +func (d *deadline3) ForEachPartition(cb func(uint64, Partition) error) error { + ps, err := d.Deadline.PartitionsArray(d.store) + if err != nil { + return err + } + var part miner3.Partition + return ps.ForEach(&part, func(i int64) error { + return cb(uint64(i), &partition3{part, d.store}) + }) +} + +func (d *deadline3) PartitionsChanged(other Deadline) (bool, error) { + other3, ok := other.(*deadline3) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !d.Deadline.Partitions.Equals(other3.Deadline.Partitions), nil +} + +func (d *deadline3) PartitionsPoSted() (bitfield.BitField, error) { + return d.Deadline.PartitionsPoSted, nil +} + +func (d *deadline3) DisputableProofCount() (uint64, error) { + + ops, err := d.OptimisticProofsSnapshotArray(d.store) + if err != nil { + return 0, err + } + + return ops.Length(), nil + +} + +func (p *partition3) AllSectors() (bitfield.BitField, error) { + return p.Partition.Sectors, nil +} + +func (p *partition3) FaultySectors() (bitfield.BitField, error) { + return p.Partition.Faults, nil +} + +func (p *partition3) RecoveringSectors() (bitfield.BitField, error) { + return p.Partition.Recoveries, nil +} + +func (p *partition3) UnprovenSectors() (bitfield.BitField, error) { + return p.Partition.Unproven, nil +} + +func fromV3SectorOnChainInfo(v3 miner3.SectorOnChainInfo) SectorOnChainInfo { + + return SectorOnChainInfo{ + SectorNumber: v3.SectorNumber, + SealProof: v3.SealProof, + SealedCID: v3.SealedCID, + DealIDs: v3.DealIDs, + Activation: v3.Activation, + Expiration: v3.Expiration, + DealWeight: v3.DealWeight, + VerifiedDealWeight: v3.VerifiedDealWeight, + InitialPledge: v3.InitialPledge, + ExpectedDayReward: v3.ExpectedDayReward, + ExpectedStoragePledge: v3.ExpectedStoragePledge, + } + +} + +func fromV3SectorPreCommitOnChainInfo(v3 miner3.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { + + return SectorPreCommitOnChainInfo{ + Info: (SectorPreCommitInfo)(v3.Info), + PreCommitDeposit: v3.PreCommitDeposit, + PreCommitEpoch: v3.PreCommitEpoch, + DealWeight: v3.DealWeight, + VerifiedDealWeight: v3.VerifiedDealWeight, + } + +} + +func (s *state3) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/miner/state.v4.go b/venus-shared/actors/builtin/miner/state.v4.go new file mode 100644 index 0000000000..7a922c4ab9 --- /dev/null +++ b/venus-shared/actors/builtin/miner/state.v4.go @@ -0,0 +1,572 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + +package miner + +import ( + "bytes" + "errors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" + adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" +) + +var _ State = (*state4)(nil) + +func load4(store adt.Store, root cid.Cid) (State, error) { + out := state4{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make4(store adt.Store) (State, error) { + out := state4{store: store} + out.State = miner4.State{} + return &out, nil +} + +type state4 struct { + miner4.State + store adt.Store +} + +type deadline4 struct { + miner4.Deadline + store adt.Store +} + +type partition4 struct { + miner4.Partition + store adt.Store +} + +func (s *state4) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { + defer func() { + if r := recover(); r != nil { + err = xerrors.Errorf("failed to get available balance: %w", r) + available = abi.NewTokenAmount(0) + } + }() + // this panics if the miner doesnt have enough funds to cover their locked pledge + available, err = s.GetAvailableBalance(bal) + return available, err +} + +func (s *state4) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.CheckVestedFunds(s.store, epoch) +} + +func (s *state4) LockedFunds() (LockedFunds, error) { + return LockedFunds{ + VestingFunds: s.State.LockedFunds, + InitialPledgeRequirement: s.State.InitialPledge, + PreCommitDeposits: s.State.PreCommitDeposits, + }, nil +} + +func (s *state4) FeeDebt() (abi.TokenAmount, error) { + return s.State.FeeDebt, nil +} + +func (s *state4) InitialPledge() (abi.TokenAmount, error) { + return s.State.InitialPledge, nil +} + +func (s *state4) PreCommitDeposits() (abi.TokenAmount, error) { + return s.State.PreCommitDeposits, nil +} + +func (s *state4) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { + info, ok, err := s.State.GetSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV4SectorOnChainInfo(*info) + return &ret, nil +} + +func (s *state4) FindSector(num abi.SectorNumber) (*SectorLocation, error) { + dlIdx, partIdx, err := s.State.FindSector(s.store, num) + if err != nil { + return nil, err + } + return &SectorLocation{ + Deadline: dlIdx, + Partition: partIdx, + }, nil +} + +func (s *state4) NumLiveSectors() (uint64, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return 0, err + } + var total uint64 + if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner4.Deadline) error { + total += dl.LiveSectors + return nil + }); err != nil { + return 0, err + } + return total, nil +} + +// GetSectorExpiration returns the effective expiration of the given sector. +// +// If the sector does not expire early, the Early expiration field is 0. +func (s *state4) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + // NOTE: this can be optimized significantly. + // 1. If the sector is non-faulty, it will either expire on-time (can be + // learned from the sector info), or in the next quantized expiration + // epoch (i.e., the first element in the partition's expiration queue. + // 2. If it's faulty, it will expire early within the first 14 entries + // of the expiration queue. + stopErr := errors.New("stop") + out := SectorExpiration{} + err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner4.Deadline) error { + partitions, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + quant := s.State.QuantSpecForDeadline(dlIdx) + var part miner4.Partition + return partitions.ForEach(&part, func(partIdx int64) error { + if found, err := part.Sectors.IsSet(uint64(num)); err != nil { + return err + } else if !found { + return nil + } + if found, err := part.Terminated.IsSet(uint64(num)); err != nil { + return err + } else if found { + // already terminated + return stopErr + } + + q, err := miner4.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner4.PartitionExpirationAmtBitwidth) + if err != nil { + return err + } + var exp miner4.ExpirationSet + return q.ForEach(&exp, func(epoch int64) error { + if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { + return err + } else if early { + out.Early = abi.ChainEpoch(epoch) + return nil + } + if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { + return err + } else if onTime { + out.OnTime = abi.ChainEpoch(epoch) + return stopErr + } + return nil + }) + }) + }) + if err == stopErr { + err = nil + } + if err != nil { + return nil, err + } + if out.Early == 0 && out.OnTime == 0 { + return nil, xerrors.Errorf("failed to find sector %d", num) + } + return &out, nil +} + +func (s *state4) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { + info, ok, err := s.State.GetPrecommittedSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV4SectorPreCommitOnChainInfo(*info) + + return &ret, nil +} + +func (s *state4) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { + precommitted, err := adt4.AsMap(s.store, s.State.PreCommittedSectors, builtin4.DefaultHamtBitwidth) + if err != nil { + return err + } + + var info miner4.SectorPreCommitOnChainInfo + if err := precommitted.ForEach(&info, func(_ string) error { + return cb(fromV4SectorPreCommitOnChainInfo(info)) + }); err != nil { + return err + } + + return nil +} + +func (s *state4) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { + sectors, err := miner4.LoadSectors(s.store, s.State.Sectors) + if err != nil { + return nil, err + } + + // If no sector numbers are specified, load all. + if snos == nil { + infos := make([]*SectorOnChainInfo, 0, sectors.Length()) + var info4 miner4.SectorOnChainInfo + if err := sectors.ForEach(&info4, func(_ int64) error { + info := fromV4SectorOnChainInfo(info4) + infos = append(infos, &info) + return nil + }); err != nil { + return nil, err + } + return infos, nil + } + + // Otherwise, load selected. + infos4, err := sectors.Load(*snos) + if err != nil { + return nil, err + } + infos := make([]*SectorOnChainInfo, len(infos4)) + for i, info4 := range infos4 { + info := fromV4SectorOnChainInfo(*info4) + infos[i] = &info + } + return infos, nil +} + +func (s *state4) loadAllocatedSectorNumbers() (bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) + return allocatedSectors, err +} + +func (s *state4) IsAllocated(num abi.SectorNumber) (bool, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return false, err + } + + return allocatedSectors.IsSet(uint64(num)) +} + +func (s *state4) GetProvingPeriodStart() (abi.ChainEpoch, error) { + return s.State.ProvingPeriodStart, nil +} + +func (s *state4) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return nil, err + } + + allocatedRuns, err := allocatedSectors.RunIterator() + if err != nil { + return nil, err + } + + unallocatedRuns, err := rle.Subtract( + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + allocatedRuns, + ) + if err != nil { + return nil, err + } + + iter, err := rle.BitsFromRuns(unallocatedRuns) + if err != nil { + return nil, err + } + + sectors := make([]abi.SectorNumber, 0, count) + for iter.HasNext() && len(sectors) < count { + nextNo, err := iter.Next() + if err != nil { + return nil, err + } + sectors = append(sectors, abi.SectorNumber(nextNo)) + } + + return sectors, nil +} + +func (s *state4) GetAllocatedSectors() (*bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { + return nil, err + } + + return &allocatedSectors, nil +} + +func (s *state4) LoadDeadline(idx uint64) (Deadline, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + dl, err := dls.LoadDeadline(s.store, idx) + if err != nil { + return nil, err + } + return &deadline4{*dl, s.store}, nil +} + +func (s *state4) ForEachDeadline(cb func(uint64, Deadline) error) error { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + return dls.ForEach(s.store, func(i uint64, dl *miner4.Deadline) error { + return cb(i, &deadline4{*dl, s.store}) + }) +} + +func (s *state4) NumDeadlines() (uint64, error) { + return miner4.WPoStPeriodDeadlines, nil +} + +func (s *state4) DeadlinesChanged(other State) (bool, error) { + other4, ok := other.(*state4) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !s.State.Deadlines.Equals(other4.Deadlines), nil +} + +func (s *state4) MinerInfoChanged(other State) (bool, error) { + other0, ok := other.(*state4) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Info.Equals(other0.State.Info), nil +} + +func (s *state4) Info() (MinerInfo, error) { + info, err := s.State.GetInfo(s.store) + if err != nil { + return MinerInfo{}, err + } + + var pid *peer.ID + if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { + pid = &peerID + } + + mi := MinerInfo{ + Owner: info.Owner, + Worker: info.Worker, + ControlAddresses: info.ControlAddresses, + + NewWorker: address.Undef, + WorkerChangeEpoch: -1, + + PeerId: pid, + Multiaddrs: info.Multiaddrs, + WindowPoStProofType: info.WindowPoStProofType, + SectorSize: info.SectorSize, + WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, + ConsensusFaultElapsed: info.ConsensusFaultElapsed, + } + + if info.PendingWorkerKey != nil { + mi.NewWorker = info.PendingWorkerKey.NewWorker + mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt + } + + return mi, nil +} + +func (s *state4) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { + return s.State.RecordedDeadlineInfo(epoch), nil +} + +func (s *state4) DeadlineCronActive() (bool, error) { + return s.State.DeadlineCronActive, nil +} + +func (s *state4) sectors() (adt.Array, error) { + return adt4.AsArray(s.store, s.Sectors, miner4.SectorsAmtBitwidth) +} + +func (s *state4) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { + var si miner4.SectorOnChainInfo + err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorOnChainInfo{}, err + } + + return fromV4SectorOnChainInfo(si), nil +} + +func (s *state4) precommits() (adt.Map, error) { + return adt4.AsMap(s.store, s.PreCommittedSectors, builtin4.DefaultHamtBitwidth) +} + +func (s *state4) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { + var sp miner4.SectorPreCommitOnChainInfo + err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorPreCommitOnChainInfo{}, err + } + + return fromV4SectorPreCommitOnChainInfo(sp), nil +} + +func (s *state4) EraseAllUnproven() error { + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner4.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner4.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + +} + +func (d *deadline4) LoadPartition(idx uint64) (Partition, error) { + p, err := d.Deadline.LoadPartition(d.store, idx) + if err != nil { + return nil, err + } + return &partition4{*p, d.store}, nil +} + +func (d *deadline4) ForEachPartition(cb func(uint64, Partition) error) error { + ps, err := d.Deadline.PartitionsArray(d.store) + if err != nil { + return err + } + var part miner4.Partition + return ps.ForEach(&part, func(i int64) error { + return cb(uint64(i), &partition4{part, d.store}) + }) +} + +func (d *deadline4) PartitionsChanged(other Deadline) (bool, error) { + other4, ok := other.(*deadline4) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !d.Deadline.Partitions.Equals(other4.Deadline.Partitions), nil +} + +func (d *deadline4) PartitionsPoSted() (bitfield.BitField, error) { + return d.Deadline.PartitionsPoSted, nil +} + +func (d *deadline4) DisputableProofCount() (uint64, error) { + + ops, err := d.OptimisticProofsSnapshotArray(d.store) + if err != nil { + return 0, err + } + + return ops.Length(), nil + +} + +func (p *partition4) AllSectors() (bitfield.BitField, error) { + return p.Partition.Sectors, nil +} + +func (p *partition4) FaultySectors() (bitfield.BitField, error) { + return p.Partition.Faults, nil +} + +func (p *partition4) RecoveringSectors() (bitfield.BitField, error) { + return p.Partition.Recoveries, nil +} + +func (p *partition4) UnprovenSectors() (bitfield.BitField, error) { + return p.Partition.Unproven, nil +} + +func fromV4SectorOnChainInfo(v4 miner4.SectorOnChainInfo) SectorOnChainInfo { + + return SectorOnChainInfo{ + SectorNumber: v4.SectorNumber, + SealProof: v4.SealProof, + SealedCID: v4.SealedCID, + DealIDs: v4.DealIDs, + Activation: v4.Activation, + Expiration: v4.Expiration, + DealWeight: v4.DealWeight, + VerifiedDealWeight: v4.VerifiedDealWeight, + InitialPledge: v4.InitialPledge, + ExpectedDayReward: v4.ExpectedDayReward, + ExpectedStoragePledge: v4.ExpectedStoragePledge, + } + +} + +func fromV4SectorPreCommitOnChainInfo(v4 miner4.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { + + return SectorPreCommitOnChainInfo{ + Info: (SectorPreCommitInfo)(v4.Info), + PreCommitDeposit: v4.PreCommitDeposit, + PreCommitEpoch: v4.PreCommitEpoch, + DealWeight: v4.DealWeight, + VerifiedDealWeight: v4.VerifiedDealWeight, + } + +} + +func (s *state4) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/miner/state.v5.go b/venus-shared/actors/builtin/miner/state.v5.go new file mode 100644 index 0000000000..8da5889874 --- /dev/null +++ b/venus-shared/actors/builtin/miner/state.v5.go @@ -0,0 +1,572 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + +package miner + +import ( + "bytes" + "errors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" + adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" +) + +var _ State = (*state5)(nil) + +func load5(store adt.Store, root cid.Cid) (State, error) { + out := state5{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make5(store adt.Store) (State, error) { + out := state5{store: store} + out.State = miner5.State{} + return &out, nil +} + +type state5 struct { + miner5.State + store adt.Store +} + +type deadline5 struct { + miner5.Deadline + store adt.Store +} + +type partition5 struct { + miner5.Partition + store adt.Store +} + +func (s *state5) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { + defer func() { + if r := recover(); r != nil { + err = xerrors.Errorf("failed to get available balance: %w", r) + available = abi.NewTokenAmount(0) + } + }() + // this panics if the miner doesnt have enough funds to cover their locked pledge + available, err = s.GetAvailableBalance(bal) + return available, err +} + +func (s *state5) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.CheckVestedFunds(s.store, epoch) +} + +func (s *state5) LockedFunds() (LockedFunds, error) { + return LockedFunds{ + VestingFunds: s.State.LockedFunds, + InitialPledgeRequirement: s.State.InitialPledge, + PreCommitDeposits: s.State.PreCommitDeposits, + }, nil +} + +func (s *state5) FeeDebt() (abi.TokenAmount, error) { + return s.State.FeeDebt, nil +} + +func (s *state5) InitialPledge() (abi.TokenAmount, error) { + return s.State.InitialPledge, nil +} + +func (s *state5) PreCommitDeposits() (abi.TokenAmount, error) { + return s.State.PreCommitDeposits, nil +} + +func (s *state5) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { + info, ok, err := s.State.GetSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV5SectorOnChainInfo(*info) + return &ret, nil +} + +func (s *state5) FindSector(num abi.SectorNumber) (*SectorLocation, error) { + dlIdx, partIdx, err := s.State.FindSector(s.store, num) + if err != nil { + return nil, err + } + return &SectorLocation{ + Deadline: dlIdx, + Partition: partIdx, + }, nil +} + +func (s *state5) NumLiveSectors() (uint64, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return 0, err + } + var total uint64 + if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner5.Deadline) error { + total += dl.LiveSectors + return nil + }); err != nil { + return 0, err + } + return total, nil +} + +// GetSectorExpiration returns the effective expiration of the given sector. +// +// If the sector does not expire early, the Early expiration field is 0. +func (s *state5) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + // NOTE: this can be optimized significantly. + // 1. If the sector is non-faulty, it will either expire on-time (can be + // learned from the sector info), or in the next quantized expiration + // epoch (i.e., the first element in the partition's expiration queue. + // 2. If it's faulty, it will expire early within the first 14 entries + // of the expiration queue. + stopErr := errors.New("stop") + out := SectorExpiration{} + err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner5.Deadline) error { + partitions, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + quant := s.State.QuantSpecForDeadline(dlIdx) + var part miner5.Partition + return partitions.ForEach(&part, func(partIdx int64) error { + if found, err := part.Sectors.IsSet(uint64(num)); err != nil { + return err + } else if !found { + return nil + } + if found, err := part.Terminated.IsSet(uint64(num)); err != nil { + return err + } else if found { + // already terminated + return stopErr + } + + q, err := miner5.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner5.PartitionExpirationAmtBitwidth) + if err != nil { + return err + } + var exp miner5.ExpirationSet + return q.ForEach(&exp, func(epoch int64) error { + if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { + return err + } else if early { + out.Early = abi.ChainEpoch(epoch) + return nil + } + if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { + return err + } else if onTime { + out.OnTime = abi.ChainEpoch(epoch) + return stopErr + } + return nil + }) + }) + }) + if err == stopErr { + err = nil + } + if err != nil { + return nil, err + } + if out.Early == 0 && out.OnTime == 0 { + return nil, xerrors.Errorf("failed to find sector %d", num) + } + return &out, nil +} + +func (s *state5) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { + info, ok, err := s.State.GetPrecommittedSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV5SectorPreCommitOnChainInfo(*info) + + return &ret, nil +} + +func (s *state5) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { + precommitted, err := adt5.AsMap(s.store, s.State.PreCommittedSectors, builtin5.DefaultHamtBitwidth) + if err != nil { + return err + } + + var info miner5.SectorPreCommitOnChainInfo + if err := precommitted.ForEach(&info, func(_ string) error { + return cb(fromV5SectorPreCommitOnChainInfo(info)) + }); err != nil { + return err + } + + return nil +} + +func (s *state5) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { + sectors, err := miner5.LoadSectors(s.store, s.State.Sectors) + if err != nil { + return nil, err + } + + // If no sector numbers are specified, load all. + if snos == nil { + infos := make([]*SectorOnChainInfo, 0, sectors.Length()) + var info5 miner5.SectorOnChainInfo + if err := sectors.ForEach(&info5, func(_ int64) error { + info := fromV5SectorOnChainInfo(info5) + infos = append(infos, &info) + return nil + }); err != nil { + return nil, err + } + return infos, nil + } + + // Otherwise, load selected. + infos5, err := sectors.Load(*snos) + if err != nil { + return nil, err + } + infos := make([]*SectorOnChainInfo, len(infos5)) + for i, info5 := range infos5 { + info := fromV5SectorOnChainInfo(*info5) + infos[i] = &info + } + return infos, nil +} + +func (s *state5) loadAllocatedSectorNumbers() (bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) + return allocatedSectors, err +} + +func (s *state5) IsAllocated(num abi.SectorNumber) (bool, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return false, err + } + + return allocatedSectors.IsSet(uint64(num)) +} + +func (s *state5) GetProvingPeriodStart() (abi.ChainEpoch, error) { + return s.State.ProvingPeriodStart, nil +} + +func (s *state5) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return nil, err + } + + allocatedRuns, err := allocatedSectors.RunIterator() + if err != nil { + return nil, err + } + + unallocatedRuns, err := rle.Subtract( + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + allocatedRuns, + ) + if err != nil { + return nil, err + } + + iter, err := rle.BitsFromRuns(unallocatedRuns) + if err != nil { + return nil, err + } + + sectors := make([]abi.SectorNumber, 0, count) + for iter.HasNext() && len(sectors) < count { + nextNo, err := iter.Next() + if err != nil { + return nil, err + } + sectors = append(sectors, abi.SectorNumber(nextNo)) + } + + return sectors, nil +} + +func (s *state5) GetAllocatedSectors() (*bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { + return nil, err + } + + return &allocatedSectors, nil +} + +func (s *state5) LoadDeadline(idx uint64) (Deadline, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + dl, err := dls.LoadDeadline(s.store, idx) + if err != nil { + return nil, err + } + return &deadline5{*dl, s.store}, nil +} + +func (s *state5) ForEachDeadline(cb func(uint64, Deadline) error) error { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + return dls.ForEach(s.store, func(i uint64, dl *miner5.Deadline) error { + return cb(i, &deadline5{*dl, s.store}) + }) +} + +func (s *state5) NumDeadlines() (uint64, error) { + return miner5.WPoStPeriodDeadlines, nil +} + +func (s *state5) DeadlinesChanged(other State) (bool, error) { + other5, ok := other.(*state5) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !s.State.Deadlines.Equals(other5.Deadlines), nil +} + +func (s *state5) MinerInfoChanged(other State) (bool, error) { + other0, ok := other.(*state5) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Info.Equals(other0.State.Info), nil +} + +func (s *state5) Info() (MinerInfo, error) { + info, err := s.State.GetInfo(s.store) + if err != nil { + return MinerInfo{}, err + } + + var pid *peer.ID + if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { + pid = &peerID + } + + mi := MinerInfo{ + Owner: info.Owner, + Worker: info.Worker, + ControlAddresses: info.ControlAddresses, + + NewWorker: address.Undef, + WorkerChangeEpoch: -1, + + PeerId: pid, + Multiaddrs: info.Multiaddrs, + WindowPoStProofType: info.WindowPoStProofType, + SectorSize: info.SectorSize, + WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, + ConsensusFaultElapsed: info.ConsensusFaultElapsed, + } + + if info.PendingWorkerKey != nil { + mi.NewWorker = info.PendingWorkerKey.NewWorker + mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt + } + + return mi, nil +} + +func (s *state5) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { + return s.State.RecordedDeadlineInfo(epoch), nil +} + +func (s *state5) DeadlineCronActive() (bool, error) { + return s.State.DeadlineCronActive, nil +} + +func (s *state5) sectors() (adt.Array, error) { + return adt5.AsArray(s.store, s.Sectors, miner5.SectorsAmtBitwidth) +} + +func (s *state5) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { + var si miner5.SectorOnChainInfo + err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorOnChainInfo{}, err + } + + return fromV5SectorOnChainInfo(si), nil +} + +func (s *state5) precommits() (adt.Map, error) { + return adt5.AsMap(s.store, s.PreCommittedSectors, builtin5.DefaultHamtBitwidth) +} + +func (s *state5) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { + var sp miner5.SectorPreCommitOnChainInfo + err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorPreCommitOnChainInfo{}, err + } + + return fromV5SectorPreCommitOnChainInfo(sp), nil +} + +func (s *state5) EraseAllUnproven() error { + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner5.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner5.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + +} + +func (d *deadline5) LoadPartition(idx uint64) (Partition, error) { + p, err := d.Deadline.LoadPartition(d.store, idx) + if err != nil { + return nil, err + } + return &partition5{*p, d.store}, nil +} + +func (d *deadline5) ForEachPartition(cb func(uint64, Partition) error) error { + ps, err := d.Deadline.PartitionsArray(d.store) + if err != nil { + return err + } + var part miner5.Partition + return ps.ForEach(&part, func(i int64) error { + return cb(uint64(i), &partition5{part, d.store}) + }) +} + +func (d *deadline5) PartitionsChanged(other Deadline) (bool, error) { + other5, ok := other.(*deadline5) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !d.Deadline.Partitions.Equals(other5.Deadline.Partitions), nil +} + +func (d *deadline5) PartitionsPoSted() (bitfield.BitField, error) { + return d.Deadline.PartitionsPoSted, nil +} + +func (d *deadline5) DisputableProofCount() (uint64, error) { + + ops, err := d.OptimisticProofsSnapshotArray(d.store) + if err != nil { + return 0, err + } + + return ops.Length(), nil + +} + +func (p *partition5) AllSectors() (bitfield.BitField, error) { + return p.Partition.Sectors, nil +} + +func (p *partition5) FaultySectors() (bitfield.BitField, error) { + return p.Partition.Faults, nil +} + +func (p *partition5) RecoveringSectors() (bitfield.BitField, error) { + return p.Partition.Recoveries, nil +} + +func (p *partition5) UnprovenSectors() (bitfield.BitField, error) { + return p.Partition.Unproven, nil +} + +func fromV5SectorOnChainInfo(v5 miner5.SectorOnChainInfo) SectorOnChainInfo { + + return SectorOnChainInfo{ + SectorNumber: v5.SectorNumber, + SealProof: v5.SealProof, + SealedCID: v5.SealedCID, + DealIDs: v5.DealIDs, + Activation: v5.Activation, + Expiration: v5.Expiration, + DealWeight: v5.DealWeight, + VerifiedDealWeight: v5.VerifiedDealWeight, + InitialPledge: v5.InitialPledge, + ExpectedDayReward: v5.ExpectedDayReward, + ExpectedStoragePledge: v5.ExpectedStoragePledge, + } + +} + +func fromV5SectorPreCommitOnChainInfo(v5 miner5.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { + + return SectorPreCommitOnChainInfo{ + Info: (SectorPreCommitInfo)(v5.Info), + PreCommitDeposit: v5.PreCommitDeposit, + PreCommitEpoch: v5.PreCommitEpoch, + DealWeight: v5.DealWeight, + VerifiedDealWeight: v5.VerifiedDealWeight, + } + +} + +func (s *state5) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/miner/state.v6.go b/venus-shared/actors/builtin/miner/state.v6.go new file mode 100644 index 0000000000..9fc2015b4e --- /dev/null +++ b/venus-shared/actors/builtin/miner/state.v6.go @@ -0,0 +1,572 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + +package miner + +import ( + "bytes" + "errors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" + adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" +) + +var _ State = (*state6)(nil) + +func load6(store adt.Store, root cid.Cid) (State, error) { + out := state6{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make6(store adt.Store) (State, error) { + out := state6{store: store} + out.State = miner6.State{} + return &out, nil +} + +type state6 struct { + miner6.State + store adt.Store +} + +type deadline6 struct { + miner6.Deadline + store adt.Store +} + +type partition6 struct { + miner6.Partition + store adt.Store +} + +func (s *state6) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { + defer func() { + if r := recover(); r != nil { + err = xerrors.Errorf("failed to get available balance: %w", r) + available = abi.NewTokenAmount(0) + } + }() + // this panics if the miner doesnt have enough funds to cover their locked pledge + available, err = s.GetAvailableBalance(bal) + return available, err +} + +func (s *state6) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.CheckVestedFunds(s.store, epoch) +} + +func (s *state6) LockedFunds() (LockedFunds, error) { + return LockedFunds{ + VestingFunds: s.State.LockedFunds, + InitialPledgeRequirement: s.State.InitialPledge, + PreCommitDeposits: s.State.PreCommitDeposits, + }, nil +} + +func (s *state6) FeeDebt() (abi.TokenAmount, error) { + return s.State.FeeDebt, nil +} + +func (s *state6) InitialPledge() (abi.TokenAmount, error) { + return s.State.InitialPledge, nil +} + +func (s *state6) PreCommitDeposits() (abi.TokenAmount, error) { + return s.State.PreCommitDeposits, nil +} + +func (s *state6) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { + info, ok, err := s.State.GetSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV6SectorOnChainInfo(*info) + return &ret, nil +} + +func (s *state6) FindSector(num abi.SectorNumber) (*SectorLocation, error) { + dlIdx, partIdx, err := s.State.FindSector(s.store, num) + if err != nil { + return nil, err + } + return &SectorLocation{ + Deadline: dlIdx, + Partition: partIdx, + }, nil +} + +func (s *state6) NumLiveSectors() (uint64, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return 0, err + } + var total uint64 + if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner6.Deadline) error { + total += dl.LiveSectors + return nil + }); err != nil { + return 0, err + } + return total, nil +} + +// GetSectorExpiration returns the effective expiration of the given sector. +// +// If the sector does not expire early, the Early expiration field is 0. +func (s *state6) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + // NOTE: this can be optimized significantly. + // 1. If the sector is non-faulty, it will either expire on-time (can be + // learned from the sector info), or in the next quantized expiration + // epoch (i.e., the first element in the partition's expiration queue. + // 2. If it's faulty, it will expire early within the first 14 entries + // of the expiration queue. + stopErr := errors.New("stop") + out := SectorExpiration{} + err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner6.Deadline) error { + partitions, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + quant := s.State.QuantSpecForDeadline(dlIdx) + var part miner6.Partition + return partitions.ForEach(&part, func(partIdx int64) error { + if found, err := part.Sectors.IsSet(uint64(num)); err != nil { + return err + } else if !found { + return nil + } + if found, err := part.Terminated.IsSet(uint64(num)); err != nil { + return err + } else if found { + // already terminated + return stopErr + } + + q, err := miner6.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner6.PartitionExpirationAmtBitwidth) + if err != nil { + return err + } + var exp miner6.ExpirationSet + return q.ForEach(&exp, func(epoch int64) error { + if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { + return err + } else if early { + out.Early = abi.ChainEpoch(epoch) + return nil + } + if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { + return err + } else if onTime { + out.OnTime = abi.ChainEpoch(epoch) + return stopErr + } + return nil + }) + }) + }) + if err == stopErr { + err = nil + } + if err != nil { + return nil, err + } + if out.Early == 0 && out.OnTime == 0 { + return nil, xerrors.Errorf("failed to find sector %d", num) + } + return &out, nil +} + +func (s *state6) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { + info, ok, err := s.State.GetPrecommittedSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV6SectorPreCommitOnChainInfo(*info) + + return &ret, nil +} + +func (s *state6) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { + precommitted, err := adt6.AsMap(s.store, s.State.PreCommittedSectors, builtin6.DefaultHamtBitwidth) + if err != nil { + return err + } + + var info miner6.SectorPreCommitOnChainInfo + if err := precommitted.ForEach(&info, func(_ string) error { + return cb(fromV6SectorPreCommitOnChainInfo(info)) + }); err != nil { + return err + } + + return nil +} + +func (s *state6) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { + sectors, err := miner6.LoadSectors(s.store, s.State.Sectors) + if err != nil { + return nil, err + } + + // If no sector numbers are specified, load all. + if snos == nil { + infos := make([]*SectorOnChainInfo, 0, sectors.Length()) + var info6 miner6.SectorOnChainInfo + if err := sectors.ForEach(&info6, func(_ int64) error { + info := fromV6SectorOnChainInfo(info6) + infos = append(infos, &info) + return nil + }); err != nil { + return nil, err + } + return infos, nil + } + + // Otherwise, load selected. + infos6, err := sectors.Load(*snos) + if err != nil { + return nil, err + } + infos := make([]*SectorOnChainInfo, len(infos6)) + for i, info6 := range infos6 { + info := fromV6SectorOnChainInfo(*info6) + infos[i] = &info + } + return infos, nil +} + +func (s *state6) loadAllocatedSectorNumbers() (bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) + return allocatedSectors, err +} + +func (s *state6) IsAllocated(num abi.SectorNumber) (bool, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return false, err + } + + return allocatedSectors.IsSet(uint64(num)) +} + +func (s *state6) GetProvingPeriodStart() (abi.ChainEpoch, error) { + return s.State.ProvingPeriodStart, nil +} + +func (s *state6) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return nil, err + } + + allocatedRuns, err := allocatedSectors.RunIterator() + if err != nil { + return nil, err + } + + unallocatedRuns, err := rle.Subtract( + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + allocatedRuns, + ) + if err != nil { + return nil, err + } + + iter, err := rle.BitsFromRuns(unallocatedRuns) + if err != nil { + return nil, err + } + + sectors := make([]abi.SectorNumber, 0, count) + for iter.HasNext() && len(sectors) < count { + nextNo, err := iter.Next() + if err != nil { + return nil, err + } + sectors = append(sectors, abi.SectorNumber(nextNo)) + } + + return sectors, nil +} + +func (s *state6) GetAllocatedSectors() (*bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { + return nil, err + } + + return &allocatedSectors, nil +} + +func (s *state6) LoadDeadline(idx uint64) (Deadline, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + dl, err := dls.LoadDeadline(s.store, idx) + if err != nil { + return nil, err + } + return &deadline6{*dl, s.store}, nil +} + +func (s *state6) ForEachDeadline(cb func(uint64, Deadline) error) error { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + return dls.ForEach(s.store, func(i uint64, dl *miner6.Deadline) error { + return cb(i, &deadline6{*dl, s.store}) + }) +} + +func (s *state6) NumDeadlines() (uint64, error) { + return miner6.WPoStPeriodDeadlines, nil +} + +func (s *state6) DeadlinesChanged(other State) (bool, error) { + other6, ok := other.(*state6) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !s.State.Deadlines.Equals(other6.Deadlines), nil +} + +func (s *state6) MinerInfoChanged(other State) (bool, error) { + other0, ok := other.(*state6) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Info.Equals(other0.State.Info), nil +} + +func (s *state6) Info() (MinerInfo, error) { + info, err := s.State.GetInfo(s.store) + if err != nil { + return MinerInfo{}, err + } + + var pid *peer.ID + if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { + pid = &peerID + } + + mi := MinerInfo{ + Owner: info.Owner, + Worker: info.Worker, + ControlAddresses: info.ControlAddresses, + + NewWorker: address.Undef, + WorkerChangeEpoch: -1, + + PeerId: pid, + Multiaddrs: info.Multiaddrs, + WindowPoStProofType: info.WindowPoStProofType, + SectorSize: info.SectorSize, + WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, + ConsensusFaultElapsed: info.ConsensusFaultElapsed, + } + + if info.PendingWorkerKey != nil { + mi.NewWorker = info.PendingWorkerKey.NewWorker + mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt + } + + return mi, nil +} + +func (s *state6) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { + return s.State.RecordedDeadlineInfo(epoch), nil +} + +func (s *state6) DeadlineCronActive() (bool, error) { + return s.State.DeadlineCronActive, nil +} + +func (s *state6) sectors() (adt.Array, error) { + return adt6.AsArray(s.store, s.Sectors, miner6.SectorsAmtBitwidth) +} + +func (s *state6) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { + var si miner6.SectorOnChainInfo + err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorOnChainInfo{}, err + } + + return fromV6SectorOnChainInfo(si), nil +} + +func (s *state6) precommits() (adt.Map, error) { + return adt6.AsMap(s.store, s.PreCommittedSectors, builtin6.DefaultHamtBitwidth) +} + +func (s *state6) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { + var sp miner6.SectorPreCommitOnChainInfo + err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorPreCommitOnChainInfo{}, err + } + + return fromV6SectorPreCommitOnChainInfo(sp), nil +} + +func (s *state6) EraseAllUnproven() error { + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner6.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner6.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + +} + +func (d *deadline6) LoadPartition(idx uint64) (Partition, error) { + p, err := d.Deadline.LoadPartition(d.store, idx) + if err != nil { + return nil, err + } + return &partition6{*p, d.store}, nil +} + +func (d *deadline6) ForEachPartition(cb func(uint64, Partition) error) error { + ps, err := d.Deadline.PartitionsArray(d.store) + if err != nil { + return err + } + var part miner6.Partition + return ps.ForEach(&part, func(i int64) error { + return cb(uint64(i), &partition6{part, d.store}) + }) +} + +func (d *deadline6) PartitionsChanged(other Deadline) (bool, error) { + other6, ok := other.(*deadline6) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !d.Deadline.Partitions.Equals(other6.Deadline.Partitions), nil +} + +func (d *deadline6) PartitionsPoSted() (bitfield.BitField, error) { + return d.Deadline.PartitionsPoSted, nil +} + +func (d *deadline6) DisputableProofCount() (uint64, error) { + + ops, err := d.OptimisticProofsSnapshotArray(d.store) + if err != nil { + return 0, err + } + + return ops.Length(), nil + +} + +func (p *partition6) AllSectors() (bitfield.BitField, error) { + return p.Partition.Sectors, nil +} + +func (p *partition6) FaultySectors() (bitfield.BitField, error) { + return p.Partition.Faults, nil +} + +func (p *partition6) RecoveringSectors() (bitfield.BitField, error) { + return p.Partition.Recoveries, nil +} + +func (p *partition6) UnprovenSectors() (bitfield.BitField, error) { + return p.Partition.Unproven, nil +} + +func fromV6SectorOnChainInfo(v6 miner6.SectorOnChainInfo) SectorOnChainInfo { + + return SectorOnChainInfo{ + SectorNumber: v6.SectorNumber, + SealProof: v6.SealProof, + SealedCID: v6.SealedCID, + DealIDs: v6.DealIDs, + Activation: v6.Activation, + Expiration: v6.Expiration, + DealWeight: v6.DealWeight, + VerifiedDealWeight: v6.VerifiedDealWeight, + InitialPledge: v6.InitialPledge, + ExpectedDayReward: v6.ExpectedDayReward, + ExpectedStoragePledge: v6.ExpectedStoragePledge, + } + +} + +func fromV6SectorPreCommitOnChainInfo(v6 miner6.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { + + return SectorPreCommitOnChainInfo{ + Info: (SectorPreCommitInfo)(v6.Info), + PreCommitDeposit: v6.PreCommitDeposit, + PreCommitEpoch: v6.PreCommitEpoch, + DealWeight: v6.DealWeight, + VerifiedDealWeight: v6.VerifiedDealWeight, + } + +} + +func (s *state6) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/multisig/actor.go b/venus-shared/actors/builtin/multisig/actor.go new file mode 100644 index 0000000000..7b01b09d75 --- /dev/null +++ b/venus-shared/actors/builtin/multisig/actor.go @@ -0,0 +1,232 @@ +// FETCHED FROM LOTUS: builtin/multisig/actor.go.template + +package multisig + +import ( + "fmt" + + "github.com/minio/blake2b-simd" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/cbor" + "github.com/ipfs/go-cid" + + msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" + msig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +func init() { + + builtin.RegisterActorState(builtin0.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + + builtin.RegisterActorState(builtin2.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + + builtin.RegisterActorState(builtin3.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + + builtin.RegisterActorState(builtin4.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + + builtin.RegisterActorState(builtin5.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + + builtin.RegisterActorState(builtin6.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) +} + +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { + + case builtin0.MultisigActorCodeID: + return load0(store, act.Head) + + case builtin2.MultisigActorCodeID: + return load2(store, act.Head) + + case builtin3.MultisigActorCodeID: + return load3(store, act.Head) + + case builtin4.MultisigActorCodeID: + return load4(store, act.Head) + + case builtin5.MultisigActorCodeID: + return load5(store, act.Head) + + case builtin6.MultisigActorCodeID: + return load6(store, act.Head) + + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { + switch av { + + case actors.Version0: + return make0(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + + case actors.Version2: + return make2(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + + case actors.Version3: + return make3(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + + case actors.Version4: + return make4(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + + case actors.Version5: + return make5(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + + case actors.Version6: + return make6(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + + } + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { + + case actors.Version0: + return builtin0.MultisigActorCodeID, nil + + case actors.Version2: + return builtin2.MultisigActorCodeID, nil + + case actors.Version3: + return builtin3.MultisigActorCodeID, nil + + case actors.Version4: + return builtin4.MultisigActorCodeID, nil + + case actors.Version5: + return builtin5.MultisigActorCodeID, nil + + case actors.Version6: + return builtin6.MultisigActorCodeID, nil + + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + cbor.Marshaler + + LockedBalance(epoch abi.ChainEpoch) (abi.TokenAmount, error) + StartEpoch() (abi.ChainEpoch, error) + UnlockDuration() (abi.ChainEpoch, error) + InitialBalance() (abi.TokenAmount, error) + Threshold() (uint64, error) + Signers() ([]address.Address, error) + + ForEachPendingTxn(func(id int64, txn Transaction) error) error + PendingTxnChanged(State) (bool, error) + + transactions() (adt.Map, error) + decodeTransaction(val *cbg.Deferred) (Transaction, error) + GetState() interface{} +} + +type Transaction = msig0.Transaction + +var Methods = builtin6.MethodsMultisig + +func Message(version actors.Version, from address.Address) MessageBuilder { + switch version { + + case actors.Version0: + return message0{from} + + case actors.Version2: + return message2{message0{from}} + + case actors.Version3: + return message3{message0{from}} + + case actors.Version4: + return message4{message0{from}} + + case actors.Version5: + return message5{message0{from}} + + case actors.Version6: + return message6{message0{from}} + default: + panic(fmt.Sprintf("unsupported actors version: %d", version)) + } +} + +type MessageBuilder interface { + // Create a new multisig with the specified parameters. + Create(signers []address.Address, threshold uint64, + vestingStart, vestingDuration abi.ChainEpoch, + initialAmount abi.TokenAmount) (*types.Message, error) + + // Propose a transaction to the given multisig. + Propose(msig, target address.Address, amt abi.TokenAmount, + method abi.MethodNum, params []byte) (*types.Message, error) + + // Approve a multisig transaction. The "hash" is optional. + Approve(msig address.Address, txID uint64, hash *ProposalHashData) (*types.Message, error) + + // Cancel a multisig transaction. The "hash" is optional. + Cancel(msig address.Address, txID uint64, hash *ProposalHashData) (*types.Message, error) +} + +// this type is the same between v0 and v2 +type ProposalHashData = msig6.ProposalHashData +type ProposeReturn = msig6.ProposeReturn +type ProposeParams = msig6.ProposeParams +type ApproveReturn = msig6.ApproveReturn + +func txnParams(id uint64, data *ProposalHashData) ([]byte, error) { + params := msig6.TxnIDParams{ID: msig6.TxnID(id)} + if data != nil { + if data.Requester.Protocol() != address.ID { + return nil, xerrors.Errorf("proposer address must be an ID address, was %s", data.Requester) + } + if data.Value.Sign() == -1 { + return nil, xerrors.Errorf("proposal value must be non-negative, was %s", data.Value) + } + if data.To == address.Undef { + return nil, xerrors.Errorf("proposed destination address must be set") + } + pser, err := data.Serialize() + if err != nil { + return nil, err + } + hash := blake2b.Sum256(pser) + params.ProposalHash = hash[:] + } + + return actors.SerializeParams(¶ms) +} diff --git a/venus-shared/actors/builtin/multisig/message.v0.go b/venus-shared/actors/builtin/multisig/message.v0.go new file mode 100644 index 0000000000..5bdb018027 --- /dev/null +++ b/venus-shared/actors/builtin/multisig/message.v0.go @@ -0,0 +1,144 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + +package multisig + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" + multisig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +type message0 struct{ from address.Address } + +func (m message0) Create( + signers []address.Address, threshold uint64, + unlockStart, unlockDuration abi.ChainEpoch, + initialAmount abi.TokenAmount, +) (*types.Message, error) { + + lenAddrs := uint64(len(signers)) + + if lenAddrs < threshold { + return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") + } + + if threshold == 0 { + threshold = lenAddrs + } + + if m.from == address.Undef { + return nil, xerrors.Errorf("must provide source address") + } + + if unlockStart != 0 { + return nil, xerrors.Errorf("actors v0 does not support a non-zero vesting start time") + } + + // Set up constructor parameters for multisig + msigParams := &multisig0.ConstructorParams{ + Signers: signers, + NumApprovalsThreshold: threshold, + UnlockDuration: unlockDuration, + } + + enc, actErr := actors.SerializeParams(msigParams) + if actErr != nil { + return nil, actErr + } + + // new actors are created by invoking 'exec' on the init actor with the constructor params + execParams := &init0.ExecParams{ + CodeCID: builtin0.MultisigActorCodeID, + ConstructorParams: enc, + } + + enc, actErr = actors.SerializeParams(execParams) + if actErr != nil { + return nil, actErr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Method: builtin0.MethodsInit.Exec, + Params: enc, + Value: initialAmount, + }, nil +} + +func (m message0) Propose(msig, to address.Address, amt abi.TokenAmount, + method abi.MethodNum, params []byte) (*types.Message, error) { + + if msig == address.Undef { + return nil, xerrors.Errorf("must provide a multisig address for proposal") + } + + if to == address.Undef { + return nil, xerrors.Errorf("must provide a target address for proposal") + } + + if amt.Sign() == -1 { + return nil, xerrors.Errorf("must provide a non-negative amount for proposed send") + } + + if m.from == address.Undef { + return nil, xerrors.Errorf("must provide source address") + } + + enc, actErr := actors.SerializeParams(&multisig0.ProposeParams{ + To: to, + Value: amt, + Method: method, + Params: params, + }) + if actErr != nil { + return nil, xerrors.Errorf("failed to serialize parameters: %w", actErr) + } + + return &types.Message{ + To: msig, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin0.MethodsMultisig.Propose, + Params: enc, + }, nil +} + +func (m message0) Approve(msig address.Address, txID uint64, hashData *ProposalHashData) (*types.Message, error) { + enc, err := txnParams(txID, hashData) + if err != nil { + return nil, err + } + + return &types.Message{ + To: msig, + From: m.from, + Value: types.NewInt(0), + Method: builtin0.MethodsMultisig.Approve, + Params: enc, + }, nil +} + +func (m message0) Cancel(msig address.Address, txID uint64, hashData *ProposalHashData) (*types.Message, error) { + enc, err := txnParams(txID, hashData) + if err != nil { + return nil, err + } + + return &types.Message{ + To: msig, + From: m.from, + Value: types.NewInt(0), + Method: builtin0.MethodsMultisig.Cancel, + Params: enc, + }, nil +} diff --git a/venus-shared/actors/builtin/multisig/message.v2.go b/venus-shared/actors/builtin/multisig/message.v2.go new file mode 100644 index 0000000000..43b781eb12 --- /dev/null +++ b/venus-shared/actors/builtin/multisig/message.v2.go @@ -0,0 +1,73 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + +package multisig + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" + multisig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +type message2 struct{ message0 } + +func (m message2) Create( + signers []address.Address, threshold uint64, + unlockStart, unlockDuration abi.ChainEpoch, + initialAmount abi.TokenAmount, +) (*types.Message, error) { + + lenAddrs := uint64(len(signers)) + + if lenAddrs < threshold { + return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") + } + + if threshold == 0 { + threshold = lenAddrs + } + + if m.from == address.Undef { + return nil, xerrors.Errorf("must provide source address") + } + + // Set up constructor parameters for multisig + msigParams := &multisig2.ConstructorParams{ + Signers: signers, + NumApprovalsThreshold: threshold, + UnlockDuration: unlockDuration, + StartEpoch: unlockStart, + } + + enc, actErr := actors.SerializeParams(msigParams) + if actErr != nil { + return nil, actErr + } + + // new actors are created by invoking 'exec' on the init actor with the constructor params + execParams := &init2.ExecParams{ + CodeCID: builtin2.MultisigActorCodeID, + ConstructorParams: enc, + } + + enc, actErr = actors.SerializeParams(execParams) + if actErr != nil { + return nil, actErr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Method: builtin2.MethodsInit.Exec, + Params: enc, + Value: initialAmount, + }, nil +} diff --git a/venus-shared/actors/builtin/multisig/message.v3.go b/venus-shared/actors/builtin/multisig/message.v3.go new file mode 100644 index 0000000000..b65de2c3e2 --- /dev/null +++ b/venus-shared/actors/builtin/multisig/message.v3.go @@ -0,0 +1,73 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + +package multisig + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" + multisig3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/multisig" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +type message3 struct{ message0 } + +func (m message3) Create( + signers []address.Address, threshold uint64, + unlockStart, unlockDuration abi.ChainEpoch, + initialAmount abi.TokenAmount, +) (*types.Message, error) { + + lenAddrs := uint64(len(signers)) + + if lenAddrs < threshold { + return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") + } + + if threshold == 0 { + threshold = lenAddrs + } + + if m.from == address.Undef { + return nil, xerrors.Errorf("must provide source address") + } + + // Set up constructor parameters for multisig + msigParams := &multisig3.ConstructorParams{ + Signers: signers, + NumApprovalsThreshold: threshold, + UnlockDuration: unlockDuration, + StartEpoch: unlockStart, + } + + enc, actErr := actors.SerializeParams(msigParams) + if actErr != nil { + return nil, actErr + } + + // new actors are created by invoking 'exec' on the init actor with the constructor params + execParams := &init3.ExecParams{ + CodeCID: builtin3.MultisigActorCodeID, + ConstructorParams: enc, + } + + enc, actErr = actors.SerializeParams(execParams) + if actErr != nil { + return nil, actErr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Method: builtin3.MethodsInit.Exec, + Params: enc, + Value: initialAmount, + }, nil +} diff --git a/venus-shared/actors/builtin/multisig/message.v4.go b/venus-shared/actors/builtin/multisig/message.v4.go new file mode 100644 index 0000000000..c0421bad64 --- /dev/null +++ b/venus-shared/actors/builtin/multisig/message.v4.go @@ -0,0 +1,73 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + +package multisig + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" + multisig4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +type message4 struct{ message0 } + +func (m message4) Create( + signers []address.Address, threshold uint64, + unlockStart, unlockDuration abi.ChainEpoch, + initialAmount abi.TokenAmount, +) (*types.Message, error) { + + lenAddrs := uint64(len(signers)) + + if lenAddrs < threshold { + return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") + } + + if threshold == 0 { + threshold = lenAddrs + } + + if m.from == address.Undef { + return nil, xerrors.Errorf("must provide source address") + } + + // Set up constructor parameters for multisig + msigParams := &multisig4.ConstructorParams{ + Signers: signers, + NumApprovalsThreshold: threshold, + UnlockDuration: unlockDuration, + StartEpoch: unlockStart, + } + + enc, actErr := actors.SerializeParams(msigParams) + if actErr != nil { + return nil, actErr + } + + // new actors are created by invoking 'exec' on the init actor with the constructor params + execParams := &init4.ExecParams{ + CodeCID: builtin4.MultisigActorCodeID, + ConstructorParams: enc, + } + + enc, actErr = actors.SerializeParams(execParams) + if actErr != nil { + return nil, actErr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Method: builtin4.MethodsInit.Exec, + Params: enc, + Value: initialAmount, + }, nil +} diff --git a/venus-shared/actors/builtin/multisig/message.v5.go b/venus-shared/actors/builtin/multisig/message.v5.go new file mode 100644 index 0000000000..f4b0315a72 --- /dev/null +++ b/venus-shared/actors/builtin/multisig/message.v5.go @@ -0,0 +1,73 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + +package multisig + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" + multisig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +type message5 struct{ message0 } + +func (m message5) Create( + signers []address.Address, threshold uint64, + unlockStart, unlockDuration abi.ChainEpoch, + initialAmount abi.TokenAmount, +) (*types.Message, error) { + + lenAddrs := uint64(len(signers)) + + if lenAddrs < threshold { + return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") + } + + if threshold == 0 { + threshold = lenAddrs + } + + if m.from == address.Undef { + return nil, xerrors.Errorf("must provide source address") + } + + // Set up constructor parameters for multisig + msigParams := &multisig5.ConstructorParams{ + Signers: signers, + NumApprovalsThreshold: threshold, + UnlockDuration: unlockDuration, + StartEpoch: unlockStart, + } + + enc, actErr := actors.SerializeParams(msigParams) + if actErr != nil { + return nil, actErr + } + + // new actors are created by invoking 'exec' on the init actor with the constructor params + execParams := &init5.ExecParams{ + CodeCID: builtin5.MultisigActorCodeID, + ConstructorParams: enc, + } + + enc, actErr = actors.SerializeParams(execParams) + if actErr != nil { + return nil, actErr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Method: builtin5.MethodsInit.Exec, + Params: enc, + Value: initialAmount, + }, nil +} diff --git a/venus-shared/actors/builtin/multisig/message.v6.go b/venus-shared/actors/builtin/multisig/message.v6.go new file mode 100644 index 0000000000..f298cf742b --- /dev/null +++ b/venus-shared/actors/builtin/multisig/message.v6.go @@ -0,0 +1,73 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + +package multisig + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" + multisig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +type message6 struct{ message0 } + +func (m message6) Create( + signers []address.Address, threshold uint64, + unlockStart, unlockDuration abi.ChainEpoch, + initialAmount abi.TokenAmount, +) (*types.Message, error) { + + lenAddrs := uint64(len(signers)) + + if lenAddrs < threshold { + return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") + } + + if threshold == 0 { + threshold = lenAddrs + } + + if m.from == address.Undef { + return nil, xerrors.Errorf("must provide source address") + } + + // Set up constructor parameters for multisig + msigParams := &multisig6.ConstructorParams{ + Signers: signers, + NumApprovalsThreshold: threshold, + UnlockDuration: unlockDuration, + StartEpoch: unlockStart, + } + + enc, actErr := actors.SerializeParams(msigParams) + if actErr != nil { + return nil, actErr + } + + // new actors are created by invoking 'exec' on the init actor with the constructor params + execParams := &init6.ExecParams{ + CodeCID: builtin6.MultisigActorCodeID, + ConstructorParams: enc, + } + + enc, actErr = actors.SerializeParams(execParams) + if actErr != nil { + return nil, actErr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Method: builtin6.MethodsInit.Exec, + Params: enc, + Value: initialAmount, + }, nil +} diff --git a/venus-shared/actors/builtin/multisig/state.v0.go b/venus-shared/actors/builtin/multisig/state.v0.go new file mode 100644 index 0000000000..e8379632fb --- /dev/null +++ b/venus-shared/actors/builtin/multisig/state.v0.go @@ -0,0 +1,119 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + +package multisig + +import ( + "bytes" + "encoding/binary" + + adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" +) + +var _ State = (*state0)(nil) + +func load0(store adt.Store, root cid.Cid) (State, error) { + out := state0{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make0(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { + out := state0{store: store} + out.State = msig0.State{} + out.State.Signers = signers + out.State.NumApprovalsThreshold = threshold + out.State.StartEpoch = startEpoch + out.State.UnlockDuration = unlockDuration + out.State.InitialBalance = initialBalance + + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + + return &out, nil +} + +type state0 struct { + msig0.State + store adt.Store +} + +func (s *state0) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil +} + +func (s *state0) StartEpoch() (abi.ChainEpoch, error) { + return s.State.StartEpoch, nil +} + +func (s *state0) UnlockDuration() (abi.ChainEpoch, error) { + return s.State.UnlockDuration, nil +} + +func (s *state0) InitialBalance() (abi.TokenAmount, error) { + return s.State.InitialBalance, nil +} + +func (s *state0) Threshold() (uint64, error) { + return s.State.NumApprovalsThreshold, nil +} + +func (s *state0) Signers() ([]address.Address, error) { + return s.State.Signers, nil +} + +func (s *state0) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { + arr, err := adt0.AsMap(s.store, s.State.PendingTxns) + if err != nil { + return err + } + var out msig0.Transaction + return arr.ForEach(&out, func(key string) error { + txid, n := binary.Varint([]byte(key)) + if n <= 0 { + return xerrors.Errorf("invalid pending transaction key: %v", key) + } + return cb(txid, (Transaction)(out)) //nolint:unconvert + }) +} + +func (s *state0) PendingTxnChanged(other State) (bool, error) { + other0, ok := other.(*state0) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.PendingTxns.Equals(other0.PendingTxns), nil +} + +func (s *state0) transactions() (adt.Map, error) { + return adt0.AsMap(s.store, s.PendingTxns) +} + +func (s *state0) decodeTransaction(val *cbg.Deferred) (Transaction, error) { + var tx msig0.Transaction + if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Transaction{}, err + } + return tx, nil +} + +func (s *state0) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/multisig/state.v2.go b/venus-shared/actors/builtin/multisig/state.v2.go new file mode 100644 index 0000000000..564f3b3e39 --- /dev/null +++ b/venus-shared/actors/builtin/multisig/state.v2.go @@ -0,0 +1,119 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + +package multisig + +import ( + "bytes" + "encoding/binary" + + adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + msig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" +) + +var _ State = (*state2)(nil) + +func load2(store adt.Store, root cid.Cid) (State, error) { + out := state2{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make2(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { + out := state2{store: store} + out.State = msig2.State{} + out.State.Signers = signers + out.State.NumApprovalsThreshold = threshold + out.State.StartEpoch = startEpoch + out.State.UnlockDuration = unlockDuration + out.State.InitialBalance = initialBalance + + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + + return &out, nil +} + +type state2 struct { + msig2.State + store adt.Store +} + +func (s *state2) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil +} + +func (s *state2) StartEpoch() (abi.ChainEpoch, error) { + return s.State.StartEpoch, nil +} + +func (s *state2) UnlockDuration() (abi.ChainEpoch, error) { + return s.State.UnlockDuration, nil +} + +func (s *state2) InitialBalance() (abi.TokenAmount, error) { + return s.State.InitialBalance, nil +} + +func (s *state2) Threshold() (uint64, error) { + return s.State.NumApprovalsThreshold, nil +} + +func (s *state2) Signers() ([]address.Address, error) { + return s.State.Signers, nil +} + +func (s *state2) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { + arr, err := adt2.AsMap(s.store, s.State.PendingTxns) + if err != nil { + return err + } + var out msig2.Transaction + return arr.ForEach(&out, func(key string) error { + txid, n := binary.Varint([]byte(key)) + if n <= 0 { + return xerrors.Errorf("invalid pending transaction key: %v", key) + } + return cb(txid, (Transaction)(out)) //nolint:unconvert + }) +} + +func (s *state2) PendingTxnChanged(other State) (bool, error) { + other2, ok := other.(*state2) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.PendingTxns.Equals(other2.PendingTxns), nil +} + +func (s *state2) transactions() (adt.Map, error) { + return adt2.AsMap(s.store, s.PendingTxns) +} + +func (s *state2) decodeTransaction(val *cbg.Deferred) (Transaction, error) { + var tx msig2.Transaction + if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Transaction{}, err + } + return tx, nil +} + +func (s *state2) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/multisig/state.v3.go b/venus-shared/actors/builtin/multisig/state.v3.go new file mode 100644 index 0000000000..35c9cc3db6 --- /dev/null +++ b/venus-shared/actors/builtin/multisig/state.v3.go @@ -0,0 +1,121 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + +package multisig + +import ( + "bytes" + "encoding/binary" + + adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + msig3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/multisig" +) + +var _ State = (*state3)(nil) + +func load3(store adt.Store, root cid.Cid) (State, error) { + out := state3{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make3(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { + out := state3{store: store} + out.State = msig3.State{} + out.State.Signers = signers + out.State.NumApprovalsThreshold = threshold + out.State.StartEpoch = startEpoch + out.State.UnlockDuration = unlockDuration + out.State.InitialBalance = initialBalance + + em, err := adt3.StoreEmptyMap(store, builtin3.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + + return &out, nil +} + +type state3 struct { + msig3.State + store adt.Store +} + +func (s *state3) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil +} + +func (s *state3) StartEpoch() (abi.ChainEpoch, error) { + return s.State.StartEpoch, nil +} + +func (s *state3) UnlockDuration() (abi.ChainEpoch, error) { + return s.State.UnlockDuration, nil +} + +func (s *state3) InitialBalance() (abi.TokenAmount, error) { + return s.State.InitialBalance, nil +} + +func (s *state3) Threshold() (uint64, error) { + return s.State.NumApprovalsThreshold, nil +} + +func (s *state3) Signers() ([]address.Address, error) { + return s.State.Signers, nil +} + +func (s *state3) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { + arr, err := adt3.AsMap(s.store, s.State.PendingTxns, builtin3.DefaultHamtBitwidth) + if err != nil { + return err + } + var out msig3.Transaction + return arr.ForEach(&out, func(key string) error { + txid, n := binary.Varint([]byte(key)) + if n <= 0 { + return xerrors.Errorf("invalid pending transaction key: %v", key) + } + return cb(txid, (Transaction)(out)) //nolint:unconvert + }) +} + +func (s *state3) PendingTxnChanged(other State) (bool, error) { + other3, ok := other.(*state3) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.PendingTxns.Equals(other3.PendingTxns), nil +} + +func (s *state3) transactions() (adt.Map, error) { + return adt3.AsMap(s.store, s.PendingTxns, builtin3.DefaultHamtBitwidth) +} + +func (s *state3) decodeTransaction(val *cbg.Deferred) (Transaction, error) { + var tx msig3.Transaction + if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Transaction{}, err + } + return tx, nil +} + +func (s *state3) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/multisig/state.v4.go b/venus-shared/actors/builtin/multisig/state.v4.go new file mode 100644 index 0000000000..68b69a8885 --- /dev/null +++ b/venus-shared/actors/builtin/multisig/state.v4.go @@ -0,0 +1,121 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + +package multisig + +import ( + "bytes" + "encoding/binary" + + adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + msig4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig" +) + +var _ State = (*state4)(nil) + +func load4(store adt.Store, root cid.Cid) (State, error) { + out := state4{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make4(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { + out := state4{store: store} + out.State = msig4.State{} + out.State.Signers = signers + out.State.NumApprovalsThreshold = threshold + out.State.StartEpoch = startEpoch + out.State.UnlockDuration = unlockDuration + out.State.InitialBalance = initialBalance + + em, err := adt4.StoreEmptyMap(store, builtin4.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + + return &out, nil +} + +type state4 struct { + msig4.State + store adt.Store +} + +func (s *state4) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil +} + +func (s *state4) StartEpoch() (abi.ChainEpoch, error) { + return s.State.StartEpoch, nil +} + +func (s *state4) UnlockDuration() (abi.ChainEpoch, error) { + return s.State.UnlockDuration, nil +} + +func (s *state4) InitialBalance() (abi.TokenAmount, error) { + return s.State.InitialBalance, nil +} + +func (s *state4) Threshold() (uint64, error) { + return s.State.NumApprovalsThreshold, nil +} + +func (s *state4) Signers() ([]address.Address, error) { + return s.State.Signers, nil +} + +func (s *state4) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { + arr, err := adt4.AsMap(s.store, s.State.PendingTxns, builtin4.DefaultHamtBitwidth) + if err != nil { + return err + } + var out msig4.Transaction + return arr.ForEach(&out, func(key string) error { + txid, n := binary.Varint([]byte(key)) + if n <= 0 { + return xerrors.Errorf("invalid pending transaction key: %v", key) + } + return cb(txid, (Transaction)(out)) //nolint:unconvert + }) +} + +func (s *state4) PendingTxnChanged(other State) (bool, error) { + other4, ok := other.(*state4) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.PendingTxns.Equals(other4.PendingTxns), nil +} + +func (s *state4) transactions() (adt.Map, error) { + return adt4.AsMap(s.store, s.PendingTxns, builtin4.DefaultHamtBitwidth) +} + +func (s *state4) decodeTransaction(val *cbg.Deferred) (Transaction, error) { + var tx msig4.Transaction + if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Transaction{}, err + } + return tx, nil +} + +func (s *state4) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/multisig/state.v5.go b/venus-shared/actors/builtin/multisig/state.v5.go new file mode 100644 index 0000000000..8db9b15dfb --- /dev/null +++ b/venus-shared/actors/builtin/multisig/state.v5.go @@ -0,0 +1,121 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + +package multisig + +import ( + "bytes" + "encoding/binary" + + adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + msig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig" +) + +var _ State = (*state5)(nil) + +func load5(store adt.Store, root cid.Cid) (State, error) { + out := state5{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make5(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { + out := state5{store: store} + out.State = msig5.State{} + out.State.Signers = signers + out.State.NumApprovalsThreshold = threshold + out.State.StartEpoch = startEpoch + out.State.UnlockDuration = unlockDuration + out.State.InitialBalance = initialBalance + + em, err := adt5.StoreEmptyMap(store, builtin5.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + + return &out, nil +} + +type state5 struct { + msig5.State + store adt.Store +} + +func (s *state5) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil +} + +func (s *state5) StartEpoch() (abi.ChainEpoch, error) { + return s.State.StartEpoch, nil +} + +func (s *state5) UnlockDuration() (abi.ChainEpoch, error) { + return s.State.UnlockDuration, nil +} + +func (s *state5) InitialBalance() (abi.TokenAmount, error) { + return s.State.InitialBalance, nil +} + +func (s *state5) Threshold() (uint64, error) { + return s.State.NumApprovalsThreshold, nil +} + +func (s *state5) Signers() ([]address.Address, error) { + return s.State.Signers, nil +} + +func (s *state5) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { + arr, err := adt5.AsMap(s.store, s.State.PendingTxns, builtin5.DefaultHamtBitwidth) + if err != nil { + return err + } + var out msig5.Transaction + return arr.ForEach(&out, func(key string) error { + txid, n := binary.Varint([]byte(key)) + if n <= 0 { + return xerrors.Errorf("invalid pending transaction key: %v", key) + } + return cb(txid, (Transaction)(out)) //nolint:unconvert + }) +} + +func (s *state5) PendingTxnChanged(other State) (bool, error) { + other5, ok := other.(*state5) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.PendingTxns.Equals(other5.PendingTxns), nil +} + +func (s *state5) transactions() (adt.Map, error) { + return adt5.AsMap(s.store, s.PendingTxns, builtin5.DefaultHamtBitwidth) +} + +func (s *state5) decodeTransaction(val *cbg.Deferred) (Transaction, error) { + var tx msig5.Transaction + if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Transaction{}, err + } + return tx, nil +} + +func (s *state5) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/multisig/state.v6.go b/venus-shared/actors/builtin/multisig/state.v6.go new file mode 100644 index 0000000000..81679baa5e --- /dev/null +++ b/venus-shared/actors/builtin/multisig/state.v6.go @@ -0,0 +1,121 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + +package multisig + +import ( + "bytes" + "encoding/binary" + + adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + msig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" +) + +var _ State = (*state6)(nil) + +func load6(store adt.Store, root cid.Cid) (State, error) { + out := state6{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make6(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { + out := state6{store: store} + out.State = msig6.State{} + out.State.Signers = signers + out.State.NumApprovalsThreshold = threshold + out.State.StartEpoch = startEpoch + out.State.UnlockDuration = unlockDuration + out.State.InitialBalance = initialBalance + + em, err := adt6.StoreEmptyMap(store, builtin6.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + + return &out, nil +} + +type state6 struct { + msig6.State + store adt.Store +} + +func (s *state6) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil +} + +func (s *state6) StartEpoch() (abi.ChainEpoch, error) { + return s.State.StartEpoch, nil +} + +func (s *state6) UnlockDuration() (abi.ChainEpoch, error) { + return s.State.UnlockDuration, nil +} + +func (s *state6) InitialBalance() (abi.TokenAmount, error) { + return s.State.InitialBalance, nil +} + +func (s *state6) Threshold() (uint64, error) { + return s.State.NumApprovalsThreshold, nil +} + +func (s *state6) Signers() ([]address.Address, error) { + return s.State.Signers, nil +} + +func (s *state6) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { + arr, err := adt6.AsMap(s.store, s.State.PendingTxns, builtin6.DefaultHamtBitwidth) + if err != nil { + return err + } + var out msig6.Transaction + return arr.ForEach(&out, func(key string) error { + txid, n := binary.Varint([]byte(key)) + if n <= 0 { + return xerrors.Errorf("invalid pending transaction key: %v", key) + } + return cb(txid, (Transaction)(out)) //nolint:unconvert + }) +} + +func (s *state6) PendingTxnChanged(other State) (bool, error) { + other6, ok := other.(*state6) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.PendingTxns.Equals(other6.PendingTxns), nil +} + +func (s *state6) transactions() (adt.Map, error) { + return adt6.AsMap(s.store, s.PendingTxns, builtin6.DefaultHamtBitwidth) +} + +func (s *state6) decodeTransaction(val *cbg.Deferred) (Transaction, error) { + var tx msig6.Transaction + if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Transaction{}, err + } + return tx, nil +} + +func (s *state6) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/paych/actor.go b/venus-shared/actors/builtin/paych/actor.go new file mode 100644 index 0000000000..31d69f65fd --- /dev/null +++ b/venus-shared/actors/builtin/paych/actor.go @@ -0,0 +1,223 @@ +// FETCHED FROM LOTUS: builtin/paych/actor.go.template + +package paych + +import ( + "encoding/base64" + "fmt" + + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + big "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/cbor" + "github.com/ipfs/go-cid" + ipldcbor "github.com/ipfs/go-ipld-cbor" + + paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +func init() { + + builtin.RegisterActorState(builtin0.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + + builtin.RegisterActorState(builtin2.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + + builtin.RegisterActorState(builtin3.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + + builtin.RegisterActorState(builtin4.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + + builtin.RegisterActorState(builtin5.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + + builtin.RegisterActorState(builtin6.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) +} + +// Load returns an abstract copy of payment channel state, irregardless of actor version +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { + + case builtin0.PaymentChannelActorCodeID: + return load0(store, act.Head) + + case builtin2.PaymentChannelActorCodeID: + return load2(store, act.Head) + + case builtin3.PaymentChannelActorCodeID: + return load3(store, act.Head) + + case builtin4.PaymentChannelActorCodeID: + return load4(store, act.Head) + + case builtin5.PaymentChannelActorCodeID: + return load5(store, act.Head) + + case builtin6.PaymentChannelActorCodeID: + return load6(store, act.Head) + + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version) (State, error) { + switch av { + + case actors.Version0: + return make0(store) + + case actors.Version2: + return make2(store) + + case actors.Version3: + return make3(store) + + case actors.Version4: + return make4(store) + + case actors.Version5: + return make5(store) + + case actors.Version6: + return make6(store) + + } + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { + + case actors.Version0: + return builtin0.PaymentChannelActorCodeID, nil + + case actors.Version2: + return builtin2.PaymentChannelActorCodeID, nil + + case actors.Version3: + return builtin3.PaymentChannelActorCodeID, nil + + case actors.Version4: + return builtin4.PaymentChannelActorCodeID, nil + + case actors.Version5: + return builtin5.PaymentChannelActorCodeID, nil + + case actors.Version6: + return builtin6.PaymentChannelActorCodeID, nil + + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +// State is an abstract version of payment channel state that works across +// versions +type State interface { + cbor.Marshaler + // Channel owner, who has funded the actor + From() (address.Address, error) + // Recipient of payouts from channel + To() (address.Address, error) + + // Height at which the channel can be `Collected` + SettlingAt() (abi.ChainEpoch, error) + + // Amount successfully redeemed through the payment channel, paid out on `Collect()` + ToSend() (abi.TokenAmount, error) + + // Get total number of lanes + LaneCount() (uint64, error) + + // Iterate lane states + ForEachLaneState(cb func(idx uint64, dl LaneState) error) error + + GetState() interface{} +} + +// LaneState is an abstract copy of the state of a single lane +type LaneState interface { + Redeemed() (big.Int, error) + Nonce() (uint64, error) +} + +type SignedVoucher = paych0.SignedVoucher +type ModVerifyParams = paych0.ModVerifyParams + +// DecodeSignedVoucher decodes base64 encoded signed voucher. +func DecodeSignedVoucher(s string) (*SignedVoucher, error) { + data, err := base64.RawURLEncoding.DecodeString(s) + if err != nil { + return nil, err + } + + var sv SignedVoucher + if err := ipldcbor.DecodeInto(data, &sv); err != nil { + return nil, err + } + + return &sv, nil +} + +var Methods = builtin6.MethodsPaych + +func Message(version actors.Version, from address.Address) MessageBuilder { + switch version { + + case actors.Version0: + return message0{from} + + case actors.Version2: + return message2{from} + + case actors.Version3: + return message3{from} + + case actors.Version4: + return message4{from} + + case actors.Version5: + return message5{from} + + case actors.Version6: + return message6{from} + + default: + panic(fmt.Sprintf("unsupported actors version: %d", version)) + } +} + +type MessageBuilder interface { + Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) + Update(paych address.Address, voucher *SignedVoucher, secret []byte) (*types.Message, error) + Settle(paych address.Address) (*types.Message, error) + Collect(paych address.Address) (*types.Message, error) +} diff --git a/venus-shared/actors/builtin/paych/message.v0.go b/venus-shared/actors/builtin/paych/message.v0.go new file mode 100644 index 0000000000..ddf035d5b6 --- /dev/null +++ b/venus-shared/actors/builtin/paych/message.v0.go @@ -0,0 +1,76 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + +package paych + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" + paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +type message0 struct{ from address.Address } + +func (m message0) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych0.ConstructorParams{From: m.from, To: to}) + if aerr != nil { + return nil, aerr + } + enc, aerr := actors.SerializeParams(&init0.ExecParams{ + CodeCID: builtin0.PaymentChannelActorCodeID, + ConstructorParams: params, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Value: initialAmount, + Method: builtin0.MethodsInit.Exec, + Params: enc, + }, nil +} + +func (m message0) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych0.UpdateChannelStateParams{ + Sv: *sv, + Secret: secret, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin0.MethodsPaych.UpdateChannelState, + Params: params, + }, nil +} + +func (m message0) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin0.MethodsPaych.Settle, + }, nil +} + +func (m message0) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin0.MethodsPaych.Collect, + }, nil +} diff --git a/venus-shared/actors/builtin/paych/message.v2.go b/venus-shared/actors/builtin/paych/message.v2.go new file mode 100644 index 0000000000..ea168b9d63 --- /dev/null +++ b/venus-shared/actors/builtin/paych/message.v2.go @@ -0,0 +1,76 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + +package paych + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" + paych2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/paych" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +type message2 struct{ from address.Address } + +func (m message2) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych2.ConstructorParams{From: m.from, To: to}) + if aerr != nil { + return nil, aerr + } + enc, aerr := actors.SerializeParams(&init2.ExecParams{ + CodeCID: builtin2.PaymentChannelActorCodeID, + ConstructorParams: params, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Value: initialAmount, + Method: builtin2.MethodsInit.Exec, + Params: enc, + }, nil +} + +func (m message2) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych2.UpdateChannelStateParams{ + Sv: *sv, + Secret: secret, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin2.MethodsPaych.UpdateChannelState, + Params: params, + }, nil +} + +func (m message2) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin2.MethodsPaych.Settle, + }, nil +} + +func (m message2) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin2.MethodsPaych.Collect, + }, nil +} diff --git a/venus-shared/actors/builtin/paych/message.v3.go b/venus-shared/actors/builtin/paych/message.v3.go new file mode 100644 index 0000000000..6f7c5db2d8 --- /dev/null +++ b/venus-shared/actors/builtin/paych/message.v3.go @@ -0,0 +1,76 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + +package paych + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" + paych3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/paych" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +type message3 struct{ from address.Address } + +func (m message3) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych3.ConstructorParams{From: m.from, To: to}) + if aerr != nil { + return nil, aerr + } + enc, aerr := actors.SerializeParams(&init3.ExecParams{ + CodeCID: builtin3.PaymentChannelActorCodeID, + ConstructorParams: params, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Value: initialAmount, + Method: builtin3.MethodsInit.Exec, + Params: enc, + }, nil +} + +func (m message3) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych3.UpdateChannelStateParams{ + Sv: *sv, + Secret: secret, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin3.MethodsPaych.UpdateChannelState, + Params: params, + }, nil +} + +func (m message3) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin3.MethodsPaych.Settle, + }, nil +} + +func (m message3) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin3.MethodsPaych.Collect, + }, nil +} diff --git a/venus-shared/actors/builtin/paych/message.v4.go b/venus-shared/actors/builtin/paych/message.v4.go new file mode 100644 index 0000000000..d89ecda6b0 --- /dev/null +++ b/venus-shared/actors/builtin/paych/message.v4.go @@ -0,0 +1,76 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + +package paych + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" + paych4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/paych" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +type message4 struct{ from address.Address } + +func (m message4) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych4.ConstructorParams{From: m.from, To: to}) + if aerr != nil { + return nil, aerr + } + enc, aerr := actors.SerializeParams(&init4.ExecParams{ + CodeCID: builtin4.PaymentChannelActorCodeID, + ConstructorParams: params, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Value: initialAmount, + Method: builtin4.MethodsInit.Exec, + Params: enc, + }, nil +} + +func (m message4) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych4.UpdateChannelStateParams{ + Sv: *sv, + Secret: secret, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin4.MethodsPaych.UpdateChannelState, + Params: params, + }, nil +} + +func (m message4) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin4.MethodsPaych.Settle, + }, nil +} + +func (m message4) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin4.MethodsPaych.Collect, + }, nil +} diff --git a/venus-shared/actors/builtin/paych/message.v5.go b/venus-shared/actors/builtin/paych/message.v5.go new file mode 100644 index 0000000000..95046ffa0b --- /dev/null +++ b/venus-shared/actors/builtin/paych/message.v5.go @@ -0,0 +1,76 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + +package paych + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" + paych5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/paych" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +type message5 struct{ from address.Address } + +func (m message5) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych5.ConstructorParams{From: m.from, To: to}) + if aerr != nil { + return nil, aerr + } + enc, aerr := actors.SerializeParams(&init5.ExecParams{ + CodeCID: builtin5.PaymentChannelActorCodeID, + ConstructorParams: params, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Value: initialAmount, + Method: builtin5.MethodsInit.Exec, + Params: enc, + }, nil +} + +func (m message5) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych5.UpdateChannelStateParams{ + Sv: *sv, + Secret: secret, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin5.MethodsPaych.UpdateChannelState, + Params: params, + }, nil +} + +func (m message5) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin5.MethodsPaych.Settle, + }, nil +} + +func (m message5) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin5.MethodsPaych.Collect, + }, nil +} diff --git a/venus-shared/actors/builtin/paych/message.v6.go b/venus-shared/actors/builtin/paych/message.v6.go new file mode 100644 index 0000000000..cfbcdf6cfe --- /dev/null +++ b/venus-shared/actors/builtin/paych/message.v6.go @@ -0,0 +1,76 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + +package paych + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" + paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +type message6 struct{ from address.Address } + +func (m message6) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych6.ConstructorParams{From: m.from, To: to}) + if aerr != nil { + return nil, aerr + } + enc, aerr := actors.SerializeParams(&init6.ExecParams{ + CodeCID: builtin6.PaymentChannelActorCodeID, + ConstructorParams: params, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Value: initialAmount, + Method: builtin6.MethodsInit.Exec, + Params: enc, + }, nil +} + +func (m message6) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych6.UpdateChannelStateParams{ + Sv: *sv, + Secret: secret, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin6.MethodsPaych.UpdateChannelState, + Params: params, + }, nil +} + +func (m message6) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin6.MethodsPaych.Settle, + }, nil +} + +func (m message6) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin6.MethodsPaych.Collect, + }, nil +} diff --git a/venus-shared/actors/builtin/paych/state.v0.go b/venus-shared/actors/builtin/paych/state.v0.go new file mode 100644 index 0000000000..0ce32fa29f --- /dev/null +++ b/venus-shared/actors/builtin/paych/state.v0.go @@ -0,0 +1,116 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + +package paych + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" + adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" +) + +var _ State = (*state0)(nil) + +func load0(store adt.Store, root cid.Cid) (State, error) { + out := state0{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make0(store adt.Store) (State, error) { + out := state0{store: store} + out.State = paych0.State{} + return &out, nil +} + +type state0 struct { + paych0.State + store adt.Store + lsAmt *adt0.Array +} + +// Channel owner, who has funded the actor +func (s *state0) From() (address.Address, error) { + return s.State.From, nil +} + +// Recipient of payouts from channel +func (s *state0) To() (address.Address, error) { + return s.State.To, nil +} + +// Height at which the channel can be `Collected` +func (s *state0) SettlingAt() (abi.ChainEpoch, error) { + return s.State.SettlingAt, nil +} + +// Amount successfully redeemed through the payment channel, paid out on `Collect()` +func (s *state0) ToSend() (abi.TokenAmount, error) { + return s.State.ToSend, nil +} + +func (s *state0) getOrLoadLsAmt() (*adt0.Array, error) { + if s.lsAmt != nil { + return s.lsAmt, nil + } + + // Get the lane state from the chain + lsamt, err := adt0.AsArray(s.store, s.State.LaneStates) + if err != nil { + return nil, err + } + + s.lsAmt = lsamt + return lsamt, nil +} + +// Get total number of lanes +func (s *state0) LaneCount() (uint64, error) { + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return 0, err + } + return lsamt.Length(), nil +} + +func (s *state0) GetState() interface{} { + return &s.State +} + +// Iterate lane states +func (s *state0) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { + // Get the lane state from the chain + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return err + } + + // Note: we use a map instead of an array to store laneStates because the + // client sets the lane ID (the index) and potentially they could use a + // very large index. + var ls paych0.LaneState + return lsamt.ForEach(&ls, func(i int64) error { + return cb(uint64(i), &laneState0{ls}) + }) +} + +type laneState0 struct { + paych0.LaneState +} + +func (ls *laneState0) Redeemed() (big.Int, error) { + return ls.LaneState.Redeemed, nil +} + +func (ls *laneState0) Nonce() (uint64, error) { + return ls.LaneState.Nonce, nil +} diff --git a/venus-shared/actors/builtin/paych/state.v2.go b/venus-shared/actors/builtin/paych/state.v2.go new file mode 100644 index 0000000000..5591b1bf24 --- /dev/null +++ b/venus-shared/actors/builtin/paych/state.v2.go @@ -0,0 +1,116 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + +package paych + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + paych2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/paych" + adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" +) + +var _ State = (*state2)(nil) + +func load2(store adt.Store, root cid.Cid) (State, error) { + out := state2{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make2(store adt.Store) (State, error) { + out := state2{store: store} + out.State = paych2.State{} + return &out, nil +} + +type state2 struct { + paych2.State + store adt.Store + lsAmt *adt2.Array +} + +// Channel owner, who has funded the actor +func (s *state2) From() (address.Address, error) { + return s.State.From, nil +} + +// Recipient of payouts from channel +func (s *state2) To() (address.Address, error) { + return s.State.To, nil +} + +// Height at which the channel can be `Collected` +func (s *state2) SettlingAt() (abi.ChainEpoch, error) { + return s.State.SettlingAt, nil +} + +// Amount successfully redeemed through the payment channel, paid out on `Collect()` +func (s *state2) ToSend() (abi.TokenAmount, error) { + return s.State.ToSend, nil +} + +func (s *state2) getOrLoadLsAmt() (*adt2.Array, error) { + if s.lsAmt != nil { + return s.lsAmt, nil + } + + // Get the lane state from the chain + lsamt, err := adt2.AsArray(s.store, s.State.LaneStates) + if err != nil { + return nil, err + } + + s.lsAmt = lsamt + return lsamt, nil +} + +// Get total number of lanes +func (s *state2) LaneCount() (uint64, error) { + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return 0, err + } + return lsamt.Length(), nil +} + +func (s *state2) GetState() interface{} { + return &s.State +} + +// Iterate lane states +func (s *state2) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { + // Get the lane state from the chain + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return err + } + + // Note: we use a map instead of an array to store laneStates because the + // client sets the lane ID (the index) and potentially they could use a + // very large index. + var ls paych2.LaneState + return lsamt.ForEach(&ls, func(i int64) error { + return cb(uint64(i), &laneState2{ls}) + }) +} + +type laneState2 struct { + paych2.LaneState +} + +func (ls *laneState2) Redeemed() (big.Int, error) { + return ls.LaneState.Redeemed, nil +} + +func (ls *laneState2) Nonce() (uint64, error) { + return ls.LaneState.Nonce, nil +} diff --git a/venus-shared/actors/builtin/paych/state.v3.go b/venus-shared/actors/builtin/paych/state.v3.go new file mode 100644 index 0000000000..6bf17f1d10 --- /dev/null +++ b/venus-shared/actors/builtin/paych/state.v3.go @@ -0,0 +1,116 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + +package paych + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + paych3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/paych" + adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" +) + +var _ State = (*state3)(nil) + +func load3(store adt.Store, root cid.Cid) (State, error) { + out := state3{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make3(store adt.Store) (State, error) { + out := state3{store: store} + out.State = paych3.State{} + return &out, nil +} + +type state3 struct { + paych3.State + store adt.Store + lsAmt *adt3.Array +} + +// Channel owner, who has funded the actor +func (s *state3) From() (address.Address, error) { + return s.State.From, nil +} + +// Recipient of payouts from channel +func (s *state3) To() (address.Address, error) { + return s.State.To, nil +} + +// Height at which the channel can be `Collected` +func (s *state3) SettlingAt() (abi.ChainEpoch, error) { + return s.State.SettlingAt, nil +} + +// Amount successfully redeemed through the payment channel, paid out on `Collect()` +func (s *state3) ToSend() (abi.TokenAmount, error) { + return s.State.ToSend, nil +} + +func (s *state3) getOrLoadLsAmt() (*adt3.Array, error) { + if s.lsAmt != nil { + return s.lsAmt, nil + } + + // Get the lane state from the chain + lsamt, err := adt3.AsArray(s.store, s.State.LaneStates, paych3.LaneStatesAmtBitwidth) + if err != nil { + return nil, err + } + + s.lsAmt = lsamt + return lsamt, nil +} + +// Get total number of lanes +func (s *state3) LaneCount() (uint64, error) { + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return 0, err + } + return lsamt.Length(), nil +} + +func (s *state3) GetState() interface{} { + return &s.State +} + +// Iterate lane states +func (s *state3) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { + // Get the lane state from the chain + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return err + } + + // Note: we use a map instead of an array to store laneStates because the + // client sets the lane ID (the index) and potentially they could use a + // very large index. + var ls paych3.LaneState + return lsamt.ForEach(&ls, func(i int64) error { + return cb(uint64(i), &laneState3{ls}) + }) +} + +type laneState3 struct { + paych3.LaneState +} + +func (ls *laneState3) Redeemed() (big.Int, error) { + return ls.LaneState.Redeemed, nil +} + +func (ls *laneState3) Nonce() (uint64, error) { + return ls.LaneState.Nonce, nil +} diff --git a/venus-shared/actors/builtin/paych/state.v4.go b/venus-shared/actors/builtin/paych/state.v4.go new file mode 100644 index 0000000000..915ca202ef --- /dev/null +++ b/venus-shared/actors/builtin/paych/state.v4.go @@ -0,0 +1,116 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + +package paych + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + paych4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/paych" + adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" +) + +var _ State = (*state4)(nil) + +func load4(store adt.Store, root cid.Cid) (State, error) { + out := state4{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make4(store adt.Store) (State, error) { + out := state4{store: store} + out.State = paych4.State{} + return &out, nil +} + +type state4 struct { + paych4.State + store adt.Store + lsAmt *adt4.Array +} + +// Channel owner, who has funded the actor +func (s *state4) From() (address.Address, error) { + return s.State.From, nil +} + +// Recipient of payouts from channel +func (s *state4) To() (address.Address, error) { + return s.State.To, nil +} + +// Height at which the channel can be `Collected` +func (s *state4) SettlingAt() (abi.ChainEpoch, error) { + return s.State.SettlingAt, nil +} + +// Amount successfully redeemed through the payment channel, paid out on `Collect()` +func (s *state4) ToSend() (abi.TokenAmount, error) { + return s.State.ToSend, nil +} + +func (s *state4) getOrLoadLsAmt() (*adt4.Array, error) { + if s.lsAmt != nil { + return s.lsAmt, nil + } + + // Get the lane state from the chain + lsamt, err := adt4.AsArray(s.store, s.State.LaneStates, paych4.LaneStatesAmtBitwidth) + if err != nil { + return nil, err + } + + s.lsAmt = lsamt + return lsamt, nil +} + +// Get total number of lanes +func (s *state4) LaneCount() (uint64, error) { + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return 0, err + } + return lsamt.Length(), nil +} + +func (s *state4) GetState() interface{} { + return &s.State +} + +// Iterate lane states +func (s *state4) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { + // Get the lane state from the chain + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return err + } + + // Note: we use a map instead of an array to store laneStates because the + // client sets the lane ID (the index) and potentially they could use a + // very large index. + var ls paych4.LaneState + return lsamt.ForEach(&ls, func(i int64) error { + return cb(uint64(i), &laneState4{ls}) + }) +} + +type laneState4 struct { + paych4.LaneState +} + +func (ls *laneState4) Redeemed() (big.Int, error) { + return ls.LaneState.Redeemed, nil +} + +func (ls *laneState4) Nonce() (uint64, error) { + return ls.LaneState.Nonce, nil +} diff --git a/venus-shared/actors/builtin/paych/state.v5.go b/venus-shared/actors/builtin/paych/state.v5.go new file mode 100644 index 0000000000..9448fde2da --- /dev/null +++ b/venus-shared/actors/builtin/paych/state.v5.go @@ -0,0 +1,116 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + +package paych + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + paych5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/paych" + adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" +) + +var _ State = (*state5)(nil) + +func load5(store adt.Store, root cid.Cid) (State, error) { + out := state5{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make5(store adt.Store) (State, error) { + out := state5{store: store} + out.State = paych5.State{} + return &out, nil +} + +type state5 struct { + paych5.State + store adt.Store + lsAmt *adt5.Array +} + +// Channel owner, who has funded the actor +func (s *state5) From() (address.Address, error) { + return s.State.From, nil +} + +// Recipient of payouts from channel +func (s *state5) To() (address.Address, error) { + return s.State.To, nil +} + +// Height at which the channel can be `Collected` +func (s *state5) SettlingAt() (abi.ChainEpoch, error) { + return s.State.SettlingAt, nil +} + +// Amount successfully redeemed through the payment channel, paid out on `Collect()` +func (s *state5) ToSend() (abi.TokenAmount, error) { + return s.State.ToSend, nil +} + +func (s *state5) getOrLoadLsAmt() (*adt5.Array, error) { + if s.lsAmt != nil { + return s.lsAmt, nil + } + + // Get the lane state from the chain + lsamt, err := adt5.AsArray(s.store, s.State.LaneStates, paych5.LaneStatesAmtBitwidth) + if err != nil { + return nil, err + } + + s.lsAmt = lsamt + return lsamt, nil +} + +// Get total number of lanes +func (s *state5) LaneCount() (uint64, error) { + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return 0, err + } + return lsamt.Length(), nil +} + +func (s *state5) GetState() interface{} { + return &s.State +} + +// Iterate lane states +func (s *state5) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { + // Get the lane state from the chain + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return err + } + + // Note: we use a map instead of an array to store laneStates because the + // client sets the lane ID (the index) and potentially they could use a + // very large index. + var ls paych5.LaneState + return lsamt.ForEach(&ls, func(i int64) error { + return cb(uint64(i), &laneState5{ls}) + }) +} + +type laneState5 struct { + paych5.LaneState +} + +func (ls *laneState5) Redeemed() (big.Int, error) { + return ls.LaneState.Redeemed, nil +} + +func (ls *laneState5) Nonce() (uint64, error) { + return ls.LaneState.Nonce, nil +} diff --git a/venus-shared/actors/builtin/paych/state.v6.go b/venus-shared/actors/builtin/paych/state.v6.go new file mode 100644 index 0000000000..fb9448a3af --- /dev/null +++ b/venus-shared/actors/builtin/paych/state.v6.go @@ -0,0 +1,116 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + +package paych + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych" + adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" +) + +var _ State = (*state6)(nil) + +func load6(store adt.Store, root cid.Cid) (State, error) { + out := state6{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make6(store adt.Store) (State, error) { + out := state6{store: store} + out.State = paych6.State{} + return &out, nil +} + +type state6 struct { + paych6.State + store adt.Store + lsAmt *adt6.Array +} + +// Channel owner, who has funded the actor +func (s *state6) From() (address.Address, error) { + return s.State.From, nil +} + +// Recipient of payouts from channel +func (s *state6) To() (address.Address, error) { + return s.State.To, nil +} + +// Height at which the channel can be `Collected` +func (s *state6) SettlingAt() (abi.ChainEpoch, error) { + return s.State.SettlingAt, nil +} + +// Amount successfully redeemed through the payment channel, paid out on `Collect()` +func (s *state6) ToSend() (abi.TokenAmount, error) { + return s.State.ToSend, nil +} + +func (s *state6) getOrLoadLsAmt() (*adt6.Array, error) { + if s.lsAmt != nil { + return s.lsAmt, nil + } + + // Get the lane state from the chain + lsamt, err := adt6.AsArray(s.store, s.State.LaneStates, paych6.LaneStatesAmtBitwidth) + if err != nil { + return nil, err + } + + s.lsAmt = lsamt + return lsamt, nil +} + +// Get total number of lanes +func (s *state6) LaneCount() (uint64, error) { + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return 0, err + } + return lsamt.Length(), nil +} + +func (s *state6) GetState() interface{} { + return &s.State +} + +// Iterate lane states +func (s *state6) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { + // Get the lane state from the chain + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return err + } + + // Note: we use a map instead of an array to store laneStates because the + // client sets the lane ID (the index) and potentially they could use a + // very large index. + var ls paych6.LaneState + return lsamt.ForEach(&ls, func(i int64) error { + return cb(uint64(i), &laneState6{ls}) + }) +} + +type laneState6 struct { + paych6.LaneState +} + +func (ls *laneState6) Redeemed() (big.Int, error) { + return ls.LaneState.Redeemed, nil +} + +func (ls *laneState6) Nonce() (uint64, error) { + return ls.LaneState.Nonce, nil +} diff --git a/venus-shared/actors/builtin/power/actor.go b/venus-shared/actors/builtin/power/actor.go new file mode 100644 index 0000000000..a5062427c9 --- /dev/null +++ b/venus-shared/actors/builtin/power/actor.go @@ -0,0 +1,183 @@ +// FETCHED FROM LOTUS: builtin/power/actor.go.template + +package power + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/cbor" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" +) + +func init() { + + builtin.RegisterActorState(builtin0.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + + builtin.RegisterActorState(builtin2.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + + builtin.RegisterActorState(builtin3.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + + builtin.RegisterActorState(builtin4.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + + builtin.RegisterActorState(builtin5.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + + builtin.RegisterActorState(builtin6.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) +} + +var ( + Address = builtin6.StoragePowerActorAddr + Methods = builtin6.MethodsPower +) + +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { + + case builtin0.StoragePowerActorCodeID: + return load0(store, act.Head) + + case builtin2.StoragePowerActorCodeID: + return load2(store, act.Head) + + case builtin3.StoragePowerActorCodeID: + return load3(store, act.Head) + + case builtin4.StoragePowerActorCodeID: + return load4(store, act.Head) + + case builtin5.StoragePowerActorCodeID: + return load5(store, act.Head) + + case builtin6.StoragePowerActorCodeID: + return load6(store, act.Head) + + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version) (State, error) { + switch av { + + case actors.Version0: + return make0(store) + + case actors.Version2: + return make2(store) + + case actors.Version3: + return make3(store) + + case actors.Version4: + return make4(store) + + case actors.Version5: + return make5(store) + + case actors.Version6: + return make6(store) + + } + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { + + case actors.Version0: + return builtin0.StoragePowerActorCodeID, nil + + case actors.Version2: + return builtin2.StoragePowerActorCodeID, nil + + case actors.Version3: + return builtin3.StoragePowerActorCodeID, nil + + case actors.Version4: + return builtin4.StoragePowerActorCodeID, nil + + case actors.Version5: + return builtin5.StoragePowerActorCodeID, nil + + case actors.Version6: + return builtin6.StoragePowerActorCodeID, nil + + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + cbor.Marshaler + + TotalLocked() (abi.TokenAmount, error) + TotalPower() (Claim, error) + TotalCommitted() (Claim, error) + TotalPowerSmoothed() (builtin.FilterEstimate, error) + GetState() interface{} + + // MinerCounts returns the number of miners. Participating is the number + // with power above the minimum miner threshold. + MinerCounts() (participating, total uint64, err error) + MinerPower(address.Address) (Claim, bool, error) + MinerNominalPowerMeetsConsensusMinimum(address.Address) (bool, error) + ListAllMiners() ([]address.Address, error) + ForEachClaim(func(miner address.Address, claim Claim) error) error + ClaimsChanged(State) (bool, error) + + // Testing or genesis setup only + SetTotalQualityAdjPower(abi.StoragePower) error + SetTotalRawBytePower(abi.StoragePower) error + SetThisEpochQualityAdjPower(abi.StoragePower) error + SetThisEpochRawBytePower(abi.StoragePower) error + + // Diff helpers. Used by Diff* functions internally. + claims() (adt.Map, error) + decodeClaim(*cbg.Deferred) (Claim, error) +} + +type Claim struct { + // Sum of raw byte power for a miner's sectors. + RawBytePower abi.StoragePower + + // Sum of quality adjusted power for a miner's sectors. + QualityAdjPower abi.StoragePower +} + +func AddClaims(a Claim, b Claim) Claim { + return Claim{ + RawBytePower: big.Add(a.RawBytePower, b.RawBytePower), + QualityAdjPower: big.Add(a.QualityAdjPower, b.QualityAdjPower), + } +} diff --git a/venus-shared/actors/builtin/power/state.v0.go b/venus-shared/actors/builtin/power/state.v0.go new file mode 100644 index 0000000000..85a81bbdaf --- /dev/null +++ b/venus-shared/actors/builtin/power/state.v0.go @@ -0,0 +1,192 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + +package power + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" + adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" +) + +var _ State = (*state0)(nil) + +func load0(store adt.Store, root cid.Cid) (State, error) { + out := state0{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make0(store adt.Store) (State, error) { + out := state0{store: store} + + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + emm, err := adt0.MakeEmptyMultimap(store).Root() + if err != nil { + return nil, err + } + + out.State = *power0.ConstructState(em, emm) + + return &out, nil +} + +type state0 struct { + power0.State + store adt.Store +} + +func (s *state0) TotalLocked() (abi.TokenAmount, error) { + return s.TotalPledgeCollateral, nil +} + +func (s *state0) TotalPower() (Claim, error) { + return Claim{ + RawBytePower: s.TotalRawBytePower, + QualityAdjPower: s.TotalQualityAdjPower, + }, nil +} + +// Committed power to the network. Includes miners below the minimum threshold. +func (s *state0) TotalCommitted() (Claim, error) { + return Claim{ + RawBytePower: s.TotalBytesCommitted, + QualityAdjPower: s.TotalQABytesCommitted, + }, nil +} + +func (s *state0) MinerPower(addr address.Address) (Claim, bool, error) { + claims, err := s.claims() + if err != nil { + return Claim{}, false, err + } + var claim power0.Claim + ok, err := claims.Get(abi.AddrKey(addr), &claim) + if err != nil { + return Claim{}, false, err + } + return Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }, ok, nil +} + +func (s *state0) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { + return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) +} + +func (s *state0) TotalPowerSmoothed() (builtin.FilterEstimate, error) { + return builtin.FromV0FilterEstimate(*s.State.ThisEpochQAPowerSmoothed), nil +} + +func (s *state0) MinerCounts() (uint64, uint64, error) { + return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil +} + +func (s *state0) ListAllMiners() ([]address.Address, error) { + claims, err := s.claims() + if err != nil { + return nil, err + } + + var miners []address.Address + err = claims.ForEach(nil, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + miners = append(miners, a) + return nil + }) + if err != nil { + return nil, err + } + + return miners, nil +} + +func (s *state0) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { + claims, err := s.claims() + if err != nil { + return err + } + + var claim power0.Claim + return claims.ForEach(&claim, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + return cb(a, Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + }) +} + +func (s *state0) ClaimsChanged(other State) (bool, error) { + other0, ok := other.(*state0) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Claims.Equals(other0.State.Claims), nil +} + +func (s *state0) SetTotalQualityAdjPower(p abi.StoragePower) error { + s.State.TotalQualityAdjPower = p + return nil +} + +func (s *state0) SetTotalRawBytePower(p abi.StoragePower) error { + s.State.TotalRawBytePower = p + return nil +} + +func (s *state0) SetThisEpochQualityAdjPower(p abi.StoragePower) error { + s.State.ThisEpochQualityAdjPower = p + return nil +} + +func (s *state0) SetThisEpochRawBytePower(p abi.StoragePower) error { + s.State.ThisEpochRawBytePower = p + return nil +} + +func (s *state0) GetState() interface{} { + return &s.State +} + +func (s *state0) claims() (adt.Map, error) { + return adt0.AsMap(s.store, s.Claims) +} + +func (s *state0) decodeClaim(val *cbg.Deferred) (Claim, error) { + var ci power0.Claim + if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Claim{}, err + } + return fromV0Claim(ci), nil +} + +func fromV0Claim(v0 power0.Claim) Claim { + return Claim{ + RawBytePower: v0.RawBytePower, + QualityAdjPower: v0.QualityAdjPower, + } +} diff --git a/venus-shared/actors/builtin/power/state.v2.go b/venus-shared/actors/builtin/power/state.v2.go new file mode 100644 index 0000000000..885e1f29fc --- /dev/null +++ b/venus-shared/actors/builtin/power/state.v2.go @@ -0,0 +1,192 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + +package power + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + power2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/power" + adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" +) + +var _ State = (*state2)(nil) + +func load2(store adt.Store, root cid.Cid) (State, error) { + out := state2{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make2(store adt.Store) (State, error) { + out := state2{store: store} + + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + emm, err := adt2.MakeEmptyMultimap(store).Root() + if err != nil { + return nil, err + } + + out.State = *power2.ConstructState(em, emm) + + return &out, nil +} + +type state2 struct { + power2.State + store adt.Store +} + +func (s *state2) TotalLocked() (abi.TokenAmount, error) { + return s.TotalPledgeCollateral, nil +} + +func (s *state2) TotalPower() (Claim, error) { + return Claim{ + RawBytePower: s.TotalRawBytePower, + QualityAdjPower: s.TotalQualityAdjPower, + }, nil +} + +// Committed power to the network. Includes miners below the minimum threshold. +func (s *state2) TotalCommitted() (Claim, error) { + return Claim{ + RawBytePower: s.TotalBytesCommitted, + QualityAdjPower: s.TotalQABytesCommitted, + }, nil +} + +func (s *state2) MinerPower(addr address.Address) (Claim, bool, error) { + claims, err := s.claims() + if err != nil { + return Claim{}, false, err + } + var claim power2.Claim + ok, err := claims.Get(abi.AddrKey(addr), &claim) + if err != nil { + return Claim{}, false, err + } + return Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }, ok, nil +} + +func (s *state2) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { + return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) +} + +func (s *state2) TotalPowerSmoothed() (builtin.FilterEstimate, error) { + return builtin.FromV2FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil +} + +func (s *state2) MinerCounts() (uint64, uint64, error) { + return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil +} + +func (s *state2) ListAllMiners() ([]address.Address, error) { + claims, err := s.claims() + if err != nil { + return nil, err + } + + var miners []address.Address + err = claims.ForEach(nil, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + miners = append(miners, a) + return nil + }) + if err != nil { + return nil, err + } + + return miners, nil +} + +func (s *state2) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { + claims, err := s.claims() + if err != nil { + return err + } + + var claim power2.Claim + return claims.ForEach(&claim, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + return cb(a, Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + }) +} + +func (s *state2) ClaimsChanged(other State) (bool, error) { + other2, ok := other.(*state2) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Claims.Equals(other2.State.Claims), nil +} + +func (s *state2) SetTotalQualityAdjPower(p abi.StoragePower) error { + s.State.TotalQualityAdjPower = p + return nil +} + +func (s *state2) SetTotalRawBytePower(p abi.StoragePower) error { + s.State.TotalRawBytePower = p + return nil +} + +func (s *state2) SetThisEpochQualityAdjPower(p abi.StoragePower) error { + s.State.ThisEpochQualityAdjPower = p + return nil +} + +func (s *state2) SetThisEpochRawBytePower(p abi.StoragePower) error { + s.State.ThisEpochRawBytePower = p + return nil +} + +func (s *state2) GetState() interface{} { + return &s.State +} + +func (s *state2) claims() (adt.Map, error) { + return adt2.AsMap(s.store, s.Claims) +} + +func (s *state2) decodeClaim(val *cbg.Deferred) (Claim, error) { + var ci power2.Claim + if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Claim{}, err + } + return fromV2Claim(ci), nil +} + +func fromV2Claim(v2 power2.Claim) Claim { + return Claim{ + RawBytePower: v2.RawBytePower, + QualityAdjPower: v2.QualityAdjPower, + } +} diff --git a/venus-shared/actors/builtin/power/state.v3.go b/venus-shared/actors/builtin/power/state.v3.go new file mode 100644 index 0000000000..db47e469f6 --- /dev/null +++ b/venus-shared/actors/builtin/power/state.v3.go @@ -0,0 +1,189 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + +package power + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + power3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/power" + adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" +) + +var _ State = (*state3)(nil) + +func load3(store adt.Store, root cid.Cid) (State, error) { + out := state3{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make3(store adt.Store) (State, error) { + out := state3{store: store} + + s, err := power3.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state3 struct { + power3.State + store adt.Store +} + +func (s *state3) TotalLocked() (abi.TokenAmount, error) { + return s.TotalPledgeCollateral, nil +} + +func (s *state3) TotalPower() (Claim, error) { + return Claim{ + RawBytePower: s.TotalRawBytePower, + QualityAdjPower: s.TotalQualityAdjPower, + }, nil +} + +// Committed power to the network. Includes miners below the minimum threshold. +func (s *state3) TotalCommitted() (Claim, error) { + return Claim{ + RawBytePower: s.TotalBytesCommitted, + QualityAdjPower: s.TotalQABytesCommitted, + }, nil +} + +func (s *state3) MinerPower(addr address.Address) (Claim, bool, error) { + claims, err := s.claims() + if err != nil { + return Claim{}, false, err + } + var claim power3.Claim + ok, err := claims.Get(abi.AddrKey(addr), &claim) + if err != nil { + return Claim{}, false, err + } + return Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }, ok, nil +} + +func (s *state3) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { + return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) +} + +func (s *state3) TotalPowerSmoothed() (builtin.FilterEstimate, error) { + return builtin.FromV3FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil +} + +func (s *state3) MinerCounts() (uint64, uint64, error) { + return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil +} + +func (s *state3) ListAllMiners() ([]address.Address, error) { + claims, err := s.claims() + if err != nil { + return nil, err + } + + var miners []address.Address + err = claims.ForEach(nil, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + miners = append(miners, a) + return nil + }) + if err != nil { + return nil, err + } + + return miners, nil +} + +func (s *state3) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { + claims, err := s.claims() + if err != nil { + return err + } + + var claim power3.Claim + return claims.ForEach(&claim, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + return cb(a, Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + }) +} + +func (s *state3) ClaimsChanged(other State) (bool, error) { + other3, ok := other.(*state3) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Claims.Equals(other3.State.Claims), nil +} + +func (s *state3) SetTotalQualityAdjPower(p abi.StoragePower) error { + s.State.TotalQualityAdjPower = p + return nil +} + +func (s *state3) SetTotalRawBytePower(p abi.StoragePower) error { + s.State.TotalRawBytePower = p + return nil +} + +func (s *state3) SetThisEpochQualityAdjPower(p abi.StoragePower) error { + s.State.ThisEpochQualityAdjPower = p + return nil +} + +func (s *state3) SetThisEpochRawBytePower(p abi.StoragePower) error { + s.State.ThisEpochRawBytePower = p + return nil +} + +func (s *state3) GetState() interface{} { + return &s.State +} + +func (s *state3) claims() (adt.Map, error) { + return adt3.AsMap(s.store, s.Claims, builtin3.DefaultHamtBitwidth) +} + +func (s *state3) decodeClaim(val *cbg.Deferred) (Claim, error) { + var ci power3.Claim + if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Claim{}, err + } + return fromV3Claim(ci), nil +} + +func fromV3Claim(v3 power3.Claim) Claim { + return Claim{ + RawBytePower: v3.RawBytePower, + QualityAdjPower: v3.QualityAdjPower, + } +} diff --git a/venus-shared/actors/builtin/power/state.v4.go b/venus-shared/actors/builtin/power/state.v4.go new file mode 100644 index 0000000000..c268d07af5 --- /dev/null +++ b/venus-shared/actors/builtin/power/state.v4.go @@ -0,0 +1,189 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + +package power + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + power4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/power" + adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" +) + +var _ State = (*state4)(nil) + +func load4(store adt.Store, root cid.Cid) (State, error) { + out := state4{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make4(store adt.Store) (State, error) { + out := state4{store: store} + + s, err := power4.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state4 struct { + power4.State + store adt.Store +} + +func (s *state4) TotalLocked() (abi.TokenAmount, error) { + return s.TotalPledgeCollateral, nil +} + +func (s *state4) TotalPower() (Claim, error) { + return Claim{ + RawBytePower: s.TotalRawBytePower, + QualityAdjPower: s.TotalQualityAdjPower, + }, nil +} + +// Committed power to the network. Includes miners below the minimum threshold. +func (s *state4) TotalCommitted() (Claim, error) { + return Claim{ + RawBytePower: s.TotalBytesCommitted, + QualityAdjPower: s.TotalQABytesCommitted, + }, nil +} + +func (s *state4) MinerPower(addr address.Address) (Claim, bool, error) { + claims, err := s.claims() + if err != nil { + return Claim{}, false, err + } + var claim power4.Claim + ok, err := claims.Get(abi.AddrKey(addr), &claim) + if err != nil { + return Claim{}, false, err + } + return Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }, ok, nil +} + +func (s *state4) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { + return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) +} + +func (s *state4) TotalPowerSmoothed() (builtin.FilterEstimate, error) { + return builtin.FromV4FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil +} + +func (s *state4) MinerCounts() (uint64, uint64, error) { + return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil +} + +func (s *state4) ListAllMiners() ([]address.Address, error) { + claims, err := s.claims() + if err != nil { + return nil, err + } + + var miners []address.Address + err = claims.ForEach(nil, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + miners = append(miners, a) + return nil + }) + if err != nil { + return nil, err + } + + return miners, nil +} + +func (s *state4) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { + claims, err := s.claims() + if err != nil { + return err + } + + var claim power4.Claim + return claims.ForEach(&claim, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + return cb(a, Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + }) +} + +func (s *state4) ClaimsChanged(other State) (bool, error) { + other4, ok := other.(*state4) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Claims.Equals(other4.State.Claims), nil +} + +func (s *state4) SetTotalQualityAdjPower(p abi.StoragePower) error { + s.State.TotalQualityAdjPower = p + return nil +} + +func (s *state4) SetTotalRawBytePower(p abi.StoragePower) error { + s.State.TotalRawBytePower = p + return nil +} + +func (s *state4) SetThisEpochQualityAdjPower(p abi.StoragePower) error { + s.State.ThisEpochQualityAdjPower = p + return nil +} + +func (s *state4) SetThisEpochRawBytePower(p abi.StoragePower) error { + s.State.ThisEpochRawBytePower = p + return nil +} + +func (s *state4) GetState() interface{} { + return &s.State +} + +func (s *state4) claims() (adt.Map, error) { + return adt4.AsMap(s.store, s.Claims, builtin4.DefaultHamtBitwidth) +} + +func (s *state4) decodeClaim(val *cbg.Deferred) (Claim, error) { + var ci power4.Claim + if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Claim{}, err + } + return fromV4Claim(ci), nil +} + +func fromV4Claim(v4 power4.Claim) Claim { + return Claim{ + RawBytePower: v4.RawBytePower, + QualityAdjPower: v4.QualityAdjPower, + } +} diff --git a/venus-shared/actors/builtin/power/state.v5.go b/venus-shared/actors/builtin/power/state.v5.go new file mode 100644 index 0000000000..6a99231e65 --- /dev/null +++ b/venus-shared/actors/builtin/power/state.v5.go @@ -0,0 +1,189 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + +package power + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + power5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/power" + adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" +) + +var _ State = (*state5)(nil) + +func load5(store adt.Store, root cid.Cid) (State, error) { + out := state5{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make5(store adt.Store) (State, error) { + out := state5{store: store} + + s, err := power5.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state5 struct { + power5.State + store adt.Store +} + +func (s *state5) TotalLocked() (abi.TokenAmount, error) { + return s.TotalPledgeCollateral, nil +} + +func (s *state5) TotalPower() (Claim, error) { + return Claim{ + RawBytePower: s.TotalRawBytePower, + QualityAdjPower: s.TotalQualityAdjPower, + }, nil +} + +// Committed power to the network. Includes miners below the minimum threshold. +func (s *state5) TotalCommitted() (Claim, error) { + return Claim{ + RawBytePower: s.TotalBytesCommitted, + QualityAdjPower: s.TotalQABytesCommitted, + }, nil +} + +func (s *state5) MinerPower(addr address.Address) (Claim, bool, error) { + claims, err := s.claims() + if err != nil { + return Claim{}, false, err + } + var claim power5.Claim + ok, err := claims.Get(abi.AddrKey(addr), &claim) + if err != nil { + return Claim{}, false, err + } + return Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }, ok, nil +} + +func (s *state5) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { + return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) +} + +func (s *state5) TotalPowerSmoothed() (builtin.FilterEstimate, error) { + return builtin.FromV5FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil +} + +func (s *state5) MinerCounts() (uint64, uint64, error) { + return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil +} + +func (s *state5) ListAllMiners() ([]address.Address, error) { + claims, err := s.claims() + if err != nil { + return nil, err + } + + var miners []address.Address + err = claims.ForEach(nil, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + miners = append(miners, a) + return nil + }) + if err != nil { + return nil, err + } + + return miners, nil +} + +func (s *state5) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { + claims, err := s.claims() + if err != nil { + return err + } + + var claim power5.Claim + return claims.ForEach(&claim, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + return cb(a, Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + }) +} + +func (s *state5) ClaimsChanged(other State) (bool, error) { + other5, ok := other.(*state5) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Claims.Equals(other5.State.Claims), nil +} + +func (s *state5) SetTotalQualityAdjPower(p abi.StoragePower) error { + s.State.TotalQualityAdjPower = p + return nil +} + +func (s *state5) SetTotalRawBytePower(p abi.StoragePower) error { + s.State.TotalRawBytePower = p + return nil +} + +func (s *state5) SetThisEpochQualityAdjPower(p abi.StoragePower) error { + s.State.ThisEpochQualityAdjPower = p + return nil +} + +func (s *state5) SetThisEpochRawBytePower(p abi.StoragePower) error { + s.State.ThisEpochRawBytePower = p + return nil +} + +func (s *state5) GetState() interface{} { + return &s.State +} + +func (s *state5) claims() (adt.Map, error) { + return adt5.AsMap(s.store, s.Claims, builtin5.DefaultHamtBitwidth) +} + +func (s *state5) decodeClaim(val *cbg.Deferred) (Claim, error) { + var ci power5.Claim + if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Claim{}, err + } + return fromV5Claim(ci), nil +} + +func fromV5Claim(v5 power5.Claim) Claim { + return Claim{ + RawBytePower: v5.RawBytePower, + QualityAdjPower: v5.QualityAdjPower, + } +} diff --git a/venus-shared/actors/builtin/power/state.v6.go b/venus-shared/actors/builtin/power/state.v6.go new file mode 100644 index 0000000000..9e212a3331 --- /dev/null +++ b/venus-shared/actors/builtin/power/state.v6.go @@ -0,0 +1,189 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + +package power + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + power6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/power" + adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" +) + +var _ State = (*state6)(nil) + +func load6(store adt.Store, root cid.Cid) (State, error) { + out := state6{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make6(store adt.Store) (State, error) { + out := state6{store: store} + + s, err := power6.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state6 struct { + power6.State + store adt.Store +} + +func (s *state6) TotalLocked() (abi.TokenAmount, error) { + return s.TotalPledgeCollateral, nil +} + +func (s *state6) TotalPower() (Claim, error) { + return Claim{ + RawBytePower: s.TotalRawBytePower, + QualityAdjPower: s.TotalQualityAdjPower, + }, nil +} + +// Committed power to the network. Includes miners below the minimum threshold. +func (s *state6) TotalCommitted() (Claim, error) { + return Claim{ + RawBytePower: s.TotalBytesCommitted, + QualityAdjPower: s.TotalQABytesCommitted, + }, nil +} + +func (s *state6) MinerPower(addr address.Address) (Claim, bool, error) { + claims, err := s.claims() + if err != nil { + return Claim{}, false, err + } + var claim power6.Claim + ok, err := claims.Get(abi.AddrKey(addr), &claim) + if err != nil { + return Claim{}, false, err + } + return Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }, ok, nil +} + +func (s *state6) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { + return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) +} + +func (s *state6) TotalPowerSmoothed() (builtin.FilterEstimate, error) { + return builtin.FromV6FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil +} + +func (s *state6) MinerCounts() (uint64, uint64, error) { + return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil +} + +func (s *state6) ListAllMiners() ([]address.Address, error) { + claims, err := s.claims() + if err != nil { + return nil, err + } + + var miners []address.Address + err = claims.ForEach(nil, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + miners = append(miners, a) + return nil + }) + if err != nil { + return nil, err + } + + return miners, nil +} + +func (s *state6) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { + claims, err := s.claims() + if err != nil { + return err + } + + var claim power6.Claim + return claims.ForEach(&claim, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + return cb(a, Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + }) +} + +func (s *state6) ClaimsChanged(other State) (bool, error) { + other6, ok := other.(*state6) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Claims.Equals(other6.State.Claims), nil +} + +func (s *state6) SetTotalQualityAdjPower(p abi.StoragePower) error { + s.State.TotalQualityAdjPower = p + return nil +} + +func (s *state6) SetTotalRawBytePower(p abi.StoragePower) error { + s.State.TotalRawBytePower = p + return nil +} + +func (s *state6) SetThisEpochQualityAdjPower(p abi.StoragePower) error { + s.State.ThisEpochQualityAdjPower = p + return nil +} + +func (s *state6) SetThisEpochRawBytePower(p abi.StoragePower) error { + s.State.ThisEpochRawBytePower = p + return nil +} + +func (s *state6) GetState() interface{} { + return &s.State +} + +func (s *state6) claims() (adt.Map, error) { + return adt6.AsMap(s.store, s.Claims, builtin6.DefaultHamtBitwidth) +} + +func (s *state6) decodeClaim(val *cbg.Deferred) (Claim, error) { + var ci power6.Claim + if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Claim{}, err + } + return fromV6Claim(ci), nil +} + +func fromV6Claim(v6 power6.Claim) Claim { + return Claim{ + RawBytePower: v6.RawBytePower, + QualityAdjPower: v6.QualityAdjPower, + } +} diff --git a/venus-shared/actors/builtin/reward/actor.go b/venus-shared/actors/builtin/reward/actor.go new file mode 100644 index 0000000000..17f7375a62 --- /dev/null +++ b/venus-shared/actors/builtin/reward/actor.go @@ -0,0 +1,159 @@ +// FETCHED FROM LOTUS: builtin/reward/actor.go.template + +package reward + +import ( + "github.com/filecoin-project/go-state-types/abi" + reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/ipfs/go-cid" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-state-types/cbor" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +func init() { + + builtin.RegisterActorState(builtin0.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + + builtin.RegisterActorState(builtin2.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + + builtin.RegisterActorState(builtin3.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + + builtin.RegisterActorState(builtin4.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + + builtin.RegisterActorState(builtin5.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + + builtin.RegisterActorState(builtin6.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) +} + +var ( + Address = builtin6.RewardActorAddr + Methods = builtin6.MethodsReward +) + +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { + + case builtin0.RewardActorCodeID: + return load0(store, act.Head) + + case builtin2.RewardActorCodeID: + return load2(store, act.Head) + + case builtin3.RewardActorCodeID: + return load3(store, act.Head) + + case builtin4.RewardActorCodeID: + return load4(store, act.Head) + + case builtin5.RewardActorCodeID: + return load5(store, act.Head) + + case builtin6.RewardActorCodeID: + return load6(store, act.Head) + + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.StoragePower) (State, error) { + switch av { + + case actors.Version0: + return make0(store, currRealizedPower) + + case actors.Version2: + return make2(store, currRealizedPower) + + case actors.Version3: + return make3(store, currRealizedPower) + + case actors.Version4: + return make4(store, currRealizedPower) + + case actors.Version5: + return make5(store, currRealizedPower) + + case actors.Version6: + return make6(store, currRealizedPower) + + } + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { + + case actors.Version0: + return builtin0.RewardActorCodeID, nil + + case actors.Version2: + return builtin2.RewardActorCodeID, nil + + case actors.Version3: + return builtin3.RewardActorCodeID, nil + + case actors.Version4: + return builtin4.RewardActorCodeID, nil + + case actors.Version5: + return builtin5.RewardActorCodeID, nil + + case actors.Version6: + return builtin6.RewardActorCodeID, nil + + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + cbor.Marshaler + + ThisEpochBaselinePower() (abi.StoragePower, error) + ThisEpochReward() (abi.StoragePower, error) + ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) + + EffectiveBaselinePower() (abi.StoragePower, error) + EffectiveNetworkTime() (abi.ChainEpoch, error) + + TotalStoragePowerReward() (abi.TokenAmount, error) + + CumsumBaseline() (abi.StoragePower, error) + CumsumRealized() (abi.StoragePower, error) + + InitialPledgeForPower(abi.StoragePower, abi.TokenAmount, *builtin.FilterEstimate, abi.TokenAmount) (abi.TokenAmount, error) + PreCommitDepositForPower(builtin.FilterEstimate, abi.StoragePower) (abi.TokenAmount, error) + GetState() interface{} +} + +type AwardBlockRewardParams = reward0.AwardBlockRewardParams diff --git a/venus-shared/actors/builtin/reward/state.v0.go b/venus-shared/actors/builtin/reward/state.v0.go new file mode 100644 index 0000000000..bac009a809 --- /dev/null +++ b/venus-shared/actors/builtin/reward/state.v0.go @@ -0,0 +1,97 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + +package reward + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" + reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" + smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing" +) + +var _ State = (*state0)(nil) + +func load0(store adt.Store, root cid.Cid) (State, error) { + out := state0{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make0(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { + out := state0{store: store} + out.State = *reward0.ConstructState(currRealizedPower) + return &out, nil +} + +type state0 struct { + reward0.State + store adt.Store +} + +func (s *state0) ThisEpochReward() (abi.TokenAmount, error) { + return s.State.ThisEpochReward, nil +} + +func (s *state0) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { + + return builtin.FromV0FilterEstimate(*s.State.ThisEpochRewardSmoothed), nil + +} + +func (s *state0) ThisEpochBaselinePower() (abi.StoragePower, error) { + return s.State.ThisEpochBaselinePower, nil +} + +func (s *state0) TotalStoragePowerReward() (abi.TokenAmount, error) { + return s.State.TotalMined, nil +} + +func (s *state0) EffectiveBaselinePower() (abi.StoragePower, error) { + return s.State.EffectiveBaselinePower, nil +} + +func (s *state0) EffectiveNetworkTime() (abi.ChainEpoch, error) { + return s.State.EffectiveNetworkTime, nil +} + +func (s *state0) CumsumBaseline() (reward0.Spacetime, error) { + return s.State.CumsumBaseline, nil +} + +func (s *state0) CumsumRealized() (reward0.Spacetime, error) { + return s.State.CumsumRealized, nil +} + +func (s *state0) InitialPledgeForPower(sectorWeight abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { + return miner0.InitialPledgeForPower( + sectorWeight, + s.State.ThisEpochBaselinePower, + networkTotalPledge, + s.State.ThisEpochRewardSmoothed, + &smoothing0.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply), nil +} + +func (s *state0) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { + return miner0.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, + &smoothing0.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + sectorWeight), nil +} + +func (s *state0) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/reward/state.v2.go b/venus-shared/actors/builtin/reward/state.v2.go new file mode 100644 index 0000000000..9445e2c0d9 --- /dev/null +++ b/venus-shared/actors/builtin/reward/state.v2.go @@ -0,0 +1,100 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + +package reward + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" + reward2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/reward" + smoothing2 "github.com/filecoin-project/specs-actors/v2/actors/util/smoothing" +) + +var _ State = (*state2)(nil) + +func load2(store adt.Store, root cid.Cid) (State, error) { + out := state2{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make2(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { + out := state2{store: store} + out.State = *reward2.ConstructState(currRealizedPower) + return &out, nil +} + +type state2 struct { + reward2.State + store adt.Store +} + +func (s *state2) ThisEpochReward() (abi.TokenAmount, error) { + return s.State.ThisEpochReward, nil +} + +func (s *state2) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { + + return builtin.FilterEstimate{ + PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, + VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, + }, nil + +} + +func (s *state2) ThisEpochBaselinePower() (abi.StoragePower, error) { + return s.State.ThisEpochBaselinePower, nil +} + +func (s *state2) TotalStoragePowerReward() (abi.TokenAmount, error) { + return s.State.TotalStoragePowerReward, nil +} + +func (s *state2) EffectiveBaselinePower() (abi.StoragePower, error) { + return s.State.EffectiveBaselinePower, nil +} + +func (s *state2) EffectiveNetworkTime() (abi.ChainEpoch, error) { + return s.State.EffectiveNetworkTime, nil +} + +func (s *state2) CumsumBaseline() (reward2.Spacetime, error) { + return s.State.CumsumBaseline, nil +} + +func (s *state2) CumsumRealized() (reward2.Spacetime, error) { + return s.State.CumsumRealized, nil +} + +func (s *state2) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { + return miner2.InitialPledgeForPower( + qaPower, + s.State.ThisEpochBaselinePower, + s.State.ThisEpochRewardSmoothed, + smoothing2.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply, + ), nil +} + +func (s *state2) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { + return miner2.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, + smoothing2.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + sectorWeight), nil +} + +func (s *state2) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/reward/state.v3.go b/venus-shared/actors/builtin/reward/state.v3.go new file mode 100644 index 0000000000..95f3585b58 --- /dev/null +++ b/venus-shared/actors/builtin/reward/state.v3.go @@ -0,0 +1,100 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + +package reward + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" + reward3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/reward" + smoothing3 "github.com/filecoin-project/specs-actors/v3/actors/util/smoothing" +) + +var _ State = (*state3)(nil) + +func load3(store adt.Store, root cid.Cid) (State, error) { + out := state3{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make3(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { + out := state3{store: store} + out.State = *reward3.ConstructState(currRealizedPower) + return &out, nil +} + +type state3 struct { + reward3.State + store adt.Store +} + +func (s *state3) ThisEpochReward() (abi.TokenAmount, error) { + return s.State.ThisEpochReward, nil +} + +func (s *state3) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { + + return builtin.FilterEstimate{ + PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, + VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, + }, nil + +} + +func (s *state3) ThisEpochBaselinePower() (abi.StoragePower, error) { + return s.State.ThisEpochBaselinePower, nil +} + +func (s *state3) TotalStoragePowerReward() (abi.TokenAmount, error) { + return s.State.TotalStoragePowerReward, nil +} + +func (s *state3) EffectiveBaselinePower() (abi.StoragePower, error) { + return s.State.EffectiveBaselinePower, nil +} + +func (s *state3) EffectiveNetworkTime() (abi.ChainEpoch, error) { + return s.State.EffectiveNetworkTime, nil +} + +func (s *state3) CumsumBaseline() (reward3.Spacetime, error) { + return s.State.CumsumBaseline, nil +} + +func (s *state3) CumsumRealized() (reward3.Spacetime, error) { + return s.State.CumsumRealized, nil +} + +func (s *state3) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { + return miner3.InitialPledgeForPower( + qaPower, + s.State.ThisEpochBaselinePower, + s.State.ThisEpochRewardSmoothed, + smoothing3.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply, + ), nil +} + +func (s *state3) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { + return miner3.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, + smoothing3.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + sectorWeight), nil +} + +func (s *state3) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/reward/state.v4.go b/venus-shared/actors/builtin/reward/state.v4.go new file mode 100644 index 0000000000..05755641f7 --- /dev/null +++ b/venus-shared/actors/builtin/reward/state.v4.go @@ -0,0 +1,100 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + +package reward + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" + reward4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/reward" + smoothing4 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing" +) + +var _ State = (*state4)(nil) + +func load4(store adt.Store, root cid.Cid) (State, error) { + out := state4{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make4(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { + out := state4{store: store} + out.State = *reward4.ConstructState(currRealizedPower) + return &out, nil +} + +type state4 struct { + reward4.State + store adt.Store +} + +func (s *state4) ThisEpochReward() (abi.TokenAmount, error) { + return s.State.ThisEpochReward, nil +} + +func (s *state4) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { + + return builtin.FilterEstimate{ + PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, + VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, + }, nil + +} + +func (s *state4) ThisEpochBaselinePower() (abi.StoragePower, error) { + return s.State.ThisEpochBaselinePower, nil +} + +func (s *state4) TotalStoragePowerReward() (abi.TokenAmount, error) { + return s.State.TotalStoragePowerReward, nil +} + +func (s *state4) EffectiveBaselinePower() (abi.StoragePower, error) { + return s.State.EffectiveBaselinePower, nil +} + +func (s *state4) EffectiveNetworkTime() (abi.ChainEpoch, error) { + return s.State.EffectiveNetworkTime, nil +} + +func (s *state4) CumsumBaseline() (reward4.Spacetime, error) { + return s.State.CumsumBaseline, nil +} + +func (s *state4) CumsumRealized() (reward4.Spacetime, error) { + return s.State.CumsumRealized, nil +} + +func (s *state4) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { + return miner4.InitialPledgeForPower( + qaPower, + s.State.ThisEpochBaselinePower, + s.State.ThisEpochRewardSmoothed, + smoothing4.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply, + ), nil +} + +func (s *state4) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { + return miner4.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, + smoothing4.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + sectorWeight), nil +} + +func (s *state4) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/reward/state.v5.go b/venus-shared/actors/builtin/reward/state.v5.go new file mode 100644 index 0000000000..0360320aab --- /dev/null +++ b/venus-shared/actors/builtin/reward/state.v5.go @@ -0,0 +1,100 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + +package reward + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" + reward5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/reward" + smoothing5 "github.com/filecoin-project/specs-actors/v5/actors/util/smoothing" +) + +var _ State = (*state5)(nil) + +func load5(store adt.Store, root cid.Cid) (State, error) { + out := state5{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make5(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { + out := state5{store: store} + out.State = *reward5.ConstructState(currRealizedPower) + return &out, nil +} + +type state5 struct { + reward5.State + store adt.Store +} + +func (s *state5) ThisEpochReward() (abi.TokenAmount, error) { + return s.State.ThisEpochReward, nil +} + +func (s *state5) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { + + return builtin.FilterEstimate{ + PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, + VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, + }, nil + +} + +func (s *state5) ThisEpochBaselinePower() (abi.StoragePower, error) { + return s.State.ThisEpochBaselinePower, nil +} + +func (s *state5) TotalStoragePowerReward() (abi.TokenAmount, error) { + return s.State.TotalStoragePowerReward, nil +} + +func (s *state5) EffectiveBaselinePower() (abi.StoragePower, error) { + return s.State.EffectiveBaselinePower, nil +} + +func (s *state5) EffectiveNetworkTime() (abi.ChainEpoch, error) { + return s.State.EffectiveNetworkTime, nil +} + +func (s *state5) CumsumBaseline() (reward5.Spacetime, error) { + return s.State.CumsumBaseline, nil +} + +func (s *state5) CumsumRealized() (reward5.Spacetime, error) { + return s.State.CumsumRealized, nil +} + +func (s *state5) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { + return miner5.InitialPledgeForPower( + qaPower, + s.State.ThisEpochBaselinePower, + s.State.ThisEpochRewardSmoothed, + smoothing5.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply, + ), nil +} + +func (s *state5) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { + return miner5.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, + smoothing5.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + sectorWeight), nil +} + +func (s *state5) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/reward/state.v6.go b/venus-shared/actors/builtin/reward/state.v6.go new file mode 100644 index 0000000000..799bb9193b --- /dev/null +++ b/venus-shared/actors/builtin/reward/state.v6.go @@ -0,0 +1,100 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + +package reward + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" + reward6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/reward" + smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" +) + +var _ State = (*state6)(nil) + +func load6(store adt.Store, root cid.Cid) (State, error) { + out := state6{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make6(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { + out := state6{store: store} + out.State = *reward6.ConstructState(currRealizedPower) + return &out, nil +} + +type state6 struct { + reward6.State + store adt.Store +} + +func (s *state6) ThisEpochReward() (abi.TokenAmount, error) { + return s.State.ThisEpochReward, nil +} + +func (s *state6) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { + + return builtin.FilterEstimate{ + PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, + VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, + }, nil + +} + +func (s *state6) ThisEpochBaselinePower() (abi.StoragePower, error) { + return s.State.ThisEpochBaselinePower, nil +} + +func (s *state6) TotalStoragePowerReward() (abi.TokenAmount, error) { + return s.State.TotalStoragePowerReward, nil +} + +func (s *state6) EffectiveBaselinePower() (abi.StoragePower, error) { + return s.State.EffectiveBaselinePower, nil +} + +func (s *state6) EffectiveNetworkTime() (abi.ChainEpoch, error) { + return s.State.EffectiveNetworkTime, nil +} + +func (s *state6) CumsumBaseline() (reward6.Spacetime, error) { + return s.State.CumsumBaseline, nil +} + +func (s *state6) CumsumRealized() (reward6.Spacetime, error) { + return s.State.CumsumRealized, nil +} + +func (s *state6) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { + return miner6.InitialPledgeForPower( + qaPower, + s.State.ThisEpochBaselinePower, + s.State.ThisEpochRewardSmoothed, + smoothing6.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply, + ), nil +} + +func (s *state6) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { + return miner6.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, + smoothing6.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + sectorWeight), nil +} + +func (s *state6) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/system/actor.go b/venus-shared/actors/builtin/system/actor.go new file mode 100644 index 0000000000..01d75a6eb2 --- /dev/null +++ b/venus-shared/actors/builtin/system/actor.go @@ -0,0 +1,81 @@ +// FETCHED FROM LOTUS: builtin/system/actor.go.template + +package system + +import ( + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/ipfs/go-cid" + "golang.org/x/xerrors" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" +) + +var ( + Address = builtin6.SystemActorAddr +) + +func MakeState(store adt.Store, av actors.Version) (State, error) { + switch av { + + case actors.Version0: + return make0(store) + + case actors.Version2: + return make2(store) + + case actors.Version3: + return make3(store) + + case actors.Version4: + return make4(store) + + case actors.Version5: + return make5(store) + + case actors.Version6: + return make6(store) + + } + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { + + case actors.Version0: + return builtin0.SystemActorCodeID, nil + + case actors.Version2: + return builtin2.SystemActorCodeID, nil + + case actors.Version3: + return builtin3.SystemActorCodeID, nil + + case actors.Version4: + return builtin4.SystemActorCodeID, nil + + case actors.Version5: + return builtin5.SystemActorCodeID, nil + + case actors.Version6: + return builtin6.SystemActorCodeID, nil + + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + GetState() interface{} +} diff --git a/venus-shared/actors/builtin/system/state.v0.go b/venus-shared/actors/builtin/system/state.v0.go new file mode 100644 index 0000000000..9204cd8382 --- /dev/null +++ b/venus-shared/actors/builtin/system/state.v0.go @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + +package system + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + system0 "github.com/filecoin-project/specs-actors/actors/builtin/system" +) + +var _ State = (*state0)(nil) + +func load0(store adt.Store, root cid.Cid) (State, error) { + out := state0{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make0(store adt.Store) (State, error) { + out := state0{store: store} + out.State = system0.State{} + return &out, nil +} + +type state0 struct { + system0.State + store adt.Store +} + +func (s *state0) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/system/state.v2.go b/venus-shared/actors/builtin/system/state.v2.go new file mode 100644 index 0000000000..d0c35d89c9 --- /dev/null +++ b/venus-shared/actors/builtin/system/state.v2.go @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + +package system + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + system2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/system" +) + +var _ State = (*state2)(nil) + +func load2(store adt.Store, root cid.Cid) (State, error) { + out := state2{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make2(store adt.Store) (State, error) { + out := state2{store: store} + out.State = system2.State{} + return &out, nil +} + +type state2 struct { + system2.State + store adt.Store +} + +func (s *state2) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/system/state.v3.go b/venus-shared/actors/builtin/system/state.v3.go new file mode 100644 index 0000000000..c6382434c1 --- /dev/null +++ b/venus-shared/actors/builtin/system/state.v3.go @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + +package system + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + system3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/system" +) + +var _ State = (*state3)(nil) + +func load3(store adt.Store, root cid.Cid) (State, error) { + out := state3{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make3(store adt.Store) (State, error) { + out := state3{store: store} + out.State = system3.State{} + return &out, nil +} + +type state3 struct { + system3.State + store adt.Store +} + +func (s *state3) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/system/state.v4.go b/venus-shared/actors/builtin/system/state.v4.go new file mode 100644 index 0000000000..63d360a24b --- /dev/null +++ b/venus-shared/actors/builtin/system/state.v4.go @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + +package system + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + system4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/system" +) + +var _ State = (*state4)(nil) + +func load4(store adt.Store, root cid.Cid) (State, error) { + out := state4{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make4(store adt.Store) (State, error) { + out := state4{store: store} + out.State = system4.State{} + return &out, nil +} + +type state4 struct { + system4.State + store adt.Store +} + +func (s *state4) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/system/state.v5.go b/venus-shared/actors/builtin/system/state.v5.go new file mode 100644 index 0000000000..2ac0c71ae6 --- /dev/null +++ b/venus-shared/actors/builtin/system/state.v5.go @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + +package system + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + system5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/system" +) + +var _ State = (*state5)(nil) + +func load5(store adt.Store, root cid.Cid) (State, error) { + out := state5{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make5(store adt.Store) (State, error) { + out := state5{store: store} + out.State = system5.State{} + return &out, nil +} + +type state5 struct { + system5.State + store adt.Store +} + +func (s *state5) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/system/state.v6.go b/venus-shared/actors/builtin/system/state.v6.go new file mode 100644 index 0000000000..219dd9619a --- /dev/null +++ b/venus-shared/actors/builtin/system/state.v6.go @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + +package system + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + system6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/system" +) + +var _ State = (*state6)(nil) + +func load6(store adt.Store, root cid.Cid) (State, error) { + out := state6{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make6(store adt.Store) (State, error) { + out := state6{store: store} + out.State = system6.State{} + return &out, nil +} + +type state6 struct { + system6.State + store adt.Store +} + +func (s *state6) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/verifreg/actor.go b/venus-shared/actors/builtin/verifreg/actor.go new file mode 100644 index 0000000000..771e54e30d --- /dev/null +++ b/venus-shared/actors/builtin/verifreg/actor.go @@ -0,0 +1,150 @@ +// FETCHED FROM LOTUS: builtin/verifreg/actor.go.template + +package verifreg + +import ( + "github.com/ipfs/go-cid" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/go-state-types/cbor" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +func init() { + + builtin.RegisterActorState(builtin0.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + + builtin.RegisterActorState(builtin2.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + + builtin.RegisterActorState(builtin3.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + + builtin.RegisterActorState(builtin4.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + + builtin.RegisterActorState(builtin5.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + + builtin.RegisterActorState(builtin6.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) + +} + +var ( + Address = builtin6.VerifiedRegistryActorAddr + Methods = builtin6.MethodsVerifiedRegistry +) + +func Load(store adt.Store, act *types.Actor) (State, error) { + switch act.Code { + + case builtin0.VerifiedRegistryActorCodeID: + return load0(store, act.Head) + + case builtin2.VerifiedRegistryActorCodeID: + return load2(store, act.Head) + + case builtin3.VerifiedRegistryActorCodeID: + return load3(store, act.Head) + + case builtin4.VerifiedRegistryActorCodeID: + return load4(store, act.Head) + + case builtin5.VerifiedRegistryActorCodeID: + return load5(store, act.Head) + + case builtin6.VerifiedRegistryActorCodeID: + return load6(store, act.Head) + + } + return nil, xerrors.Errorf("unknown actor code %s", act.Code) +} + +func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Address) (State, error) { + switch av { + + case actors.Version0: + return make0(store, rootKeyAddress) + + case actors.Version2: + return make2(store, rootKeyAddress) + + case actors.Version3: + return make3(store, rootKeyAddress) + + case actors.Version4: + return make4(store, rootKeyAddress) + + case actors.Version5: + return make5(store, rootKeyAddress) + + case actors.Version6: + return make6(store, rootKeyAddress) + + } + return nil, xerrors.Errorf("unknown actor version %d", av) +} + +func GetActorCodeID(av actors.Version) (cid.Cid, error) { + switch av { + + case actors.Version0: + return builtin0.VerifiedRegistryActorCodeID, nil + + case actors.Version2: + return builtin2.VerifiedRegistryActorCodeID, nil + + case actors.Version3: + return builtin3.VerifiedRegistryActorCodeID, nil + + case actors.Version4: + return builtin4.VerifiedRegistryActorCodeID, nil + + case actors.Version5: + return builtin5.VerifiedRegistryActorCodeID, nil + + case actors.Version6: + return builtin6.VerifiedRegistryActorCodeID, nil + + } + + return cid.Undef, xerrors.Errorf("unknown actor version %d", av) +} + +type State interface { + cbor.Marshaler + + RootKey() (address.Address, error) + VerifiedClientDataCap(address.Address) (bool, abi.StoragePower, error) + VerifierDataCap(address.Address) (bool, abi.StoragePower, error) + ForEachVerifier(func(addr address.Address, dcap abi.StoragePower) error) error + ForEachClient(func(addr address.Address, dcap abi.StoragePower) error) error + GetState() interface{} +} diff --git a/venus-shared/actors/builtin/verifreg/state.v0.go b/venus-shared/actors/builtin/verifreg/state.v0.go new file mode 100644 index 0000000000..676dc218c3 --- /dev/null +++ b/venus-shared/actors/builtin/verifreg/state.v0.go @@ -0,0 +1,76 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + +package verifreg + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" + adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" +) + +var _ State = (*state0)(nil) + +func load0(store adt.Store, root cid.Cid) (State, error) { + out := state0{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make0(store adt.Store, rootKeyAddress address.Address) (State, error) { + out := state0{store: store} + + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *verifreg0.ConstructState(em, rootKeyAddress) + + return &out, nil +} + +type state0 struct { + verifreg0.State + store adt.Store +} + +func (s *state0) RootKey() (address.Address, error) { + return s.State.RootKey, nil +} + +func (s *state0) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version0, s.verifiedClients, addr) +} + +func (s *state0) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version0, s.verifiers, addr) +} + +func (s *state0) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version0, s.verifiers, cb) +} + +func (s *state0) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version0, s.verifiedClients, cb) +} + +func (s *state0) verifiedClients() (adt.Map, error) { + return adt0.AsMap(s.store, s.VerifiedClients) +} + +func (s *state0) verifiers() (adt.Map, error) { + return adt0.AsMap(s.store, s.Verifiers) +} + +func (s *state0) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/verifreg/state.v2.go b/venus-shared/actors/builtin/verifreg/state.v2.go new file mode 100644 index 0000000000..3fe4ad24c1 --- /dev/null +++ b/venus-shared/actors/builtin/verifreg/state.v2.go @@ -0,0 +1,76 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + +package verifreg + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" + adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" +) + +var _ State = (*state2)(nil) + +func load2(store adt.Store, root cid.Cid) (State, error) { + out := state2{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make2(store adt.Store, rootKeyAddress address.Address) (State, error) { + out := state2{store: store} + + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *verifreg2.ConstructState(em, rootKeyAddress) + + return &out, nil +} + +type state2 struct { + verifreg2.State + store adt.Store +} + +func (s *state2) RootKey() (address.Address, error) { + return s.State.RootKey, nil +} + +func (s *state2) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version2, s.verifiedClients, addr) +} + +func (s *state2) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version2, s.verifiers, addr) +} + +func (s *state2) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version2, s.verifiers, cb) +} + +func (s *state2) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version2, s.verifiedClients, cb) +} + +func (s *state2) verifiedClients() (adt.Map, error) { + return adt2.AsMap(s.store, s.VerifiedClients) +} + +func (s *state2) verifiers() (adt.Map, error) { + return adt2.AsMap(s.store, s.Verifiers) +} + +func (s *state2) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/verifreg/state.v3.go b/venus-shared/actors/builtin/verifreg/state.v3.go new file mode 100644 index 0000000000..71b7dab582 --- /dev/null +++ b/venus-shared/actors/builtin/verifreg/state.v3.go @@ -0,0 +1,77 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + +package verifreg + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + verifreg3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/verifreg" + adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" +) + +var _ State = (*state3)(nil) + +func load3(store adt.Store, root cid.Cid) (State, error) { + out := state3{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make3(store adt.Store, rootKeyAddress address.Address) (State, error) { + out := state3{store: store} + + s, err := verifreg3.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state3 struct { + verifreg3.State + store adt.Store +} + +func (s *state3) RootKey() (address.Address, error) { + return s.State.RootKey, nil +} + +func (s *state3) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version3, s.verifiedClients, addr) +} + +func (s *state3) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version3, s.verifiers, addr) +} + +func (s *state3) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version3, s.verifiers, cb) +} + +func (s *state3) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version3, s.verifiedClients, cb) +} + +func (s *state3) verifiedClients() (adt.Map, error) { + return adt3.AsMap(s.store, s.VerifiedClients, builtin3.DefaultHamtBitwidth) +} + +func (s *state3) verifiers() (adt.Map, error) { + return adt3.AsMap(s.store, s.Verifiers, builtin3.DefaultHamtBitwidth) +} + +func (s *state3) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/verifreg/state.v4.go b/venus-shared/actors/builtin/verifreg/state.v4.go new file mode 100644 index 0000000000..3fe92b7efc --- /dev/null +++ b/venus-shared/actors/builtin/verifreg/state.v4.go @@ -0,0 +1,77 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + +package verifreg + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" + adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" +) + +var _ State = (*state4)(nil) + +func load4(store adt.Store, root cid.Cid) (State, error) { + out := state4{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make4(store adt.Store, rootKeyAddress address.Address) (State, error) { + out := state4{store: store} + + s, err := verifreg4.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state4 struct { + verifreg4.State + store adt.Store +} + +func (s *state4) RootKey() (address.Address, error) { + return s.State.RootKey, nil +} + +func (s *state4) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version4, s.verifiedClients, addr) +} + +func (s *state4) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version4, s.verifiers, addr) +} + +func (s *state4) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version4, s.verifiers, cb) +} + +func (s *state4) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version4, s.verifiedClients, cb) +} + +func (s *state4) verifiedClients() (adt.Map, error) { + return adt4.AsMap(s.store, s.VerifiedClients, builtin4.DefaultHamtBitwidth) +} + +func (s *state4) verifiers() (adt.Map, error) { + return adt4.AsMap(s.store, s.Verifiers, builtin4.DefaultHamtBitwidth) +} + +func (s *state4) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/verifreg/state.v5.go b/venus-shared/actors/builtin/verifreg/state.v5.go new file mode 100644 index 0000000000..eb246b5542 --- /dev/null +++ b/venus-shared/actors/builtin/verifreg/state.v5.go @@ -0,0 +1,77 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + +package verifreg + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + verifreg5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/verifreg" + adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" +) + +var _ State = (*state5)(nil) + +func load5(store adt.Store, root cid.Cid) (State, error) { + out := state5{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make5(store adt.Store, rootKeyAddress address.Address) (State, error) { + out := state5{store: store} + + s, err := verifreg5.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state5 struct { + verifreg5.State + store adt.Store +} + +func (s *state5) RootKey() (address.Address, error) { + return s.State.RootKey, nil +} + +func (s *state5) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version5, s.verifiedClients, addr) +} + +func (s *state5) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version5, s.verifiers, addr) +} + +func (s *state5) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version5, s.verifiers, cb) +} + +func (s *state5) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version5, s.verifiedClients, cb) +} + +func (s *state5) verifiedClients() (adt.Map, error) { + return adt5.AsMap(s.store, s.VerifiedClients, builtin5.DefaultHamtBitwidth) +} + +func (s *state5) verifiers() (adt.Map, error) { + return adt5.AsMap(s.store, s.Verifiers, builtin5.DefaultHamtBitwidth) +} + +func (s *state5) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/verifreg/state.v6.go b/venus-shared/actors/builtin/verifreg/state.v6.go new file mode 100644 index 0000000000..e2fe162186 --- /dev/null +++ b/venus-shared/actors/builtin/verifreg/state.v6.go @@ -0,0 +1,77 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + +package verifreg + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" + adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" +) + +var _ State = (*state6)(nil) + +func load6(store adt.Store, root cid.Cid) (State, error) { + out := state6{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make6(store adt.Store, rootKeyAddress address.Address) (State, error) { + out := state6{store: store} + + s, err := verifreg6.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state6 struct { + verifreg6.State + store adt.Store +} + +func (s *state6) RootKey() (address.Address, error) { + return s.State.RootKey, nil +} + +func (s *state6) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version6, s.verifiedClients, addr) +} + +func (s *state6) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version6, s.verifiers, addr) +} + +func (s *state6) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version6, s.verifiers, cb) +} + +func (s *state6) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version6, s.verifiedClients, cb) +} + +func (s *state6) verifiedClients() (adt.Map, error) { + return adt6.AsMap(s.store, s.VerifiedClients, builtin6.DefaultHamtBitwidth) +} + +func (s *state6) verifiers() (adt.Map, error) { + return adt6.AsMap(s.store, s.Verifiers, builtin6.DefaultHamtBitwidth) +} + +func (s *state6) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/verifreg/util.go b/venus-shared/actors/builtin/verifreg/util.go new file mode 100644 index 0000000000..022c2fa17f --- /dev/null +++ b/venus-shared/actors/builtin/verifreg/util.go @@ -0,0 +1,54 @@ +package verifreg + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" +) + +// taking this as a function instead of asking the caller to call it helps reduce some of the error +// checking boilerplate. +// +// "go made me do it" +type rootFunc func() (adt.Map, error) + +// Assumes that the bitwidth for v3 HAMTs is the DefaultHamtBitwidth +func getDataCap(store adt.Store, ver actors.Version, root rootFunc, addr address.Address) (bool, abi.StoragePower, error) { + if addr.Protocol() != address.ID { + return false, big.Zero(), xerrors.Errorf("can only look up ID addresses") + } + vh, err := root() + if err != nil { + return false, big.Zero(), xerrors.Errorf("loading verifreg: %w", err) + } + + var dcap abi.StoragePower + if found, err := vh.Get(abi.AddrKey(addr), &dcap); err != nil { + return false, big.Zero(), xerrors.Errorf("looking up addr: %w", err) + } else if !found { + return false, big.Zero(), nil + } + + return true, dcap, nil +} + +// Assumes that the bitwidth for v3 HAMTs is the DefaultHamtBitwidth +func forEachCap(store adt.Store, ver actors.Version, root rootFunc, cb func(addr address.Address, dcap abi.StoragePower) error) error { + vh, err := root() + if err != nil { + return xerrors.Errorf("loading verified clients: %w", err) + } + var dcap abi.StoragePower + return vh.ForEach(&dcap, func(key string) error { + a, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(a, dcap) + }) +} diff --git a/venus-shared/actors/params.go b/venus-shared/actors/params.go new file mode 100644 index 0000000000..2cc90b3250 --- /dev/null +++ b/venus-shared/actors/params.go @@ -0,0 +1,19 @@ +package actors + +import ( + "bytes" + + "github.com/filecoin-project/go-state-types/exitcode" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/venus-shared/actors/aerrors" +) + +func SerializeParams(i cbg.CBORMarshaler) ([]byte, aerrors.ActorError) { + buf := new(bytes.Buffer) + if err := i.MarshalCBOR(buf); err != nil { + // TODO: shouldnt this be a fatal error? + return nil, aerrors.Absorb(err, exitcode.ErrSerialization, "failed to encode parameter") + } + return buf.Bytes(), nil +} diff --git a/venus-shared/actors/policy/policy.go b/venus-shared/actors/policy/policy.go index 357980ffa3..d11356ccd1 100644 --- a/venus-shared/actors/policy/policy.go +++ b/venus-shared/actors/policy/policy.go @@ -17,32 +17,32 @@ import ( power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" - builtin2 "github.com/filecoin-project/specs-actors/2/actors/builtin" - market2 "github.com/filecoin-project/specs-actors/2/actors/builtin/market" - miner2 "github.com/filecoin-project/specs-actors/2/actors/builtin/miner" - verifreg2 "github.com/filecoin-project/specs-actors/2/actors/builtin/verifreg" - - builtin3 "github.com/filecoin-project/specs-actors/3/actors/builtin" - market3 "github.com/filecoin-project/specs-actors/3/actors/builtin/market" - miner3 "github.com/filecoin-project/specs-actors/3/actors/builtin/miner" - verifreg3 "github.com/filecoin-project/specs-actors/3/actors/builtin/verifreg" - - builtin4 "github.com/filecoin-project/specs-actors/4/actors/builtin" - market4 "github.com/filecoin-project/specs-actors/4/actors/builtin/market" - miner4 "github.com/filecoin-project/specs-actors/4/actors/builtin/miner" - verifreg4 "github.com/filecoin-project/specs-actors/4/actors/builtin/verifreg" - - builtin5 "github.com/filecoin-project/specs-actors/5/actors/builtin" - market5 "github.com/filecoin-project/specs-actors/5/actors/builtin/market" - miner5 "github.com/filecoin-project/specs-actors/5/actors/builtin/miner" - verifreg5 "github.com/filecoin-project/specs-actors/5/actors/builtin/verifreg" - - builtin6 "github.com/filecoin-project/specs-actors/6/actors/builtin" - market6 "github.com/filecoin-project/specs-actors/6/actors/builtin/market" - miner6 "github.com/filecoin-project/specs-actors/6/actors/builtin/miner" - verifreg6 "github.com/filecoin-project/specs-actors/6/actors/builtin/verifreg" - - paych6 "github.com/filecoin-project/specs-actors/6/actors/builtin/paych" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" + miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" + verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" + miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" + verifreg3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/verifreg" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" + miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" + verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" + miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" + verifreg5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/verifreg" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" + miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" + verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" + + paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych" ) const ( diff --git a/venus-shared/actors/version.go b/venus-shared/actors/version.go new file mode 100644 index 0000000000..95dd091268 --- /dev/null +++ b/venus-shared/actors/version.go @@ -0,0 +1,42 @@ +package actors + +import ( + "fmt" + + "github.com/filecoin-project/go-state-types/network" +) + +type Version int + +var LatestVersion = 6 + +var Versions = []int{0, 2, 3, 4, 5, LatestVersion} + +const ( + Version0 Version = 0 + Version2 Version = 2 + Version3 Version = 3 + Version4 Version = 4 + Version5 Version = 5 + Version6 Version = 6 +) + +// Converts a network version into an actors adt version. +func VersionForNetwork(version network.Version) (Version, error) { + switch version { + case network.Version0, network.Version1, network.Version2, network.Version3: + return Version0, nil + case network.Version4, network.Version5, network.Version6, network.Version7, network.Version8, network.Version9: + return Version2, nil + case network.Version10, network.Version11: + return Version3, nil + case network.Version12: + return Version4, nil + case network.Version13: + return Version5, nil + case network.Version14: + return Version6, nil + default: + return -1, fmt.Errorf("unsupported network version %d", version) + } +} diff --git a/venus-shared/compatible-checks/actor-sources.txt b/venus-shared/compatible-checks/actor-sources.txt new file mode 100644 index 0000000000..72805828c6 --- /dev/null +++ b/venus-shared/compatible-checks/actor-sources.txt @@ -0,0 +1,112 @@ +SOURCES IN chain/actors: + adt/adt.go + adt/diff_adt.go + adt/diff_adt_test.go + adt/store.go + aerrors/error.go + aerrors/error_test.go + aerrors/wrap.go + agen/main.go + builtin/account/account.go + builtin/account/v0.go + builtin/account/v2.go + builtin/account/v3.go + builtin/account/v4.go + builtin/account/v5.go + builtin/account/v6.go + builtin/builtin.go + builtin/cron/cron.go + builtin/cron/v0.go + builtin/cron/v2.go + builtin/cron/v3.go + builtin/cron/v4.go + builtin/cron/v5.go + builtin/cron/v6.go + builtin/init/diff.go + builtin/init/init.go + builtin/init/v0.go + builtin/init/v2.go + builtin/init/v3.go + builtin/init/v4.go + builtin/init/v5.go + builtin/init/v6.go + builtin/market/diff.go + builtin/market/market.go + builtin/market/v0.go + builtin/market/v2.go + builtin/market/v3.go + builtin/market/v4.go + builtin/market/v5.go + builtin/market/v6.go + builtin/miner/diff.go + builtin/miner/diff_deadlines.go + builtin/miner/miner.go + builtin/miner/utils.go + builtin/miner/v0.go + builtin/miner/v2.go + builtin/miner/v3.go + builtin/miner/v4.go + builtin/miner/v5.go + builtin/miner/v6.go + builtin/multisig/diff.go + builtin/multisig/message0.go + builtin/multisig/message2.go + builtin/multisig/message3.go + builtin/multisig/message4.go + builtin/multisig/message5.go + builtin/multisig/message6.go + builtin/multisig/multisig.go + builtin/multisig/v0.go + builtin/multisig/v2.go + builtin/multisig/v3.go + builtin/multisig/v4.go + builtin/multisig/v5.go + builtin/multisig/v6.go + builtin/paych/message0.go + builtin/paych/message2.go + builtin/paych/message3.go + builtin/paych/message4.go + builtin/paych/message5.go + builtin/paych/message6.go + builtin/paych/mock/mock.go + builtin/paych/paych.go + builtin/paych/v0.go + builtin/paych/v2.go + builtin/paych/v3.go + builtin/paych/v4.go + builtin/paych/v5.go + builtin/paych/v6.go + builtin/power/diff.go + builtin/power/power.go + builtin/power/v0.go + builtin/power/v2.go + builtin/power/v3.go + builtin/power/v4.go + builtin/power/v5.go + builtin/power/v6.go + builtin/reward/reward.go + builtin/reward/v0.go + builtin/reward/v2.go + builtin/reward/v3.go + builtin/reward/v4.go + builtin/reward/v5.go + builtin/reward/v6.go + builtin/system/system.go + builtin/system/v0.go + builtin/system/v2.go + builtin/system/v3.go + builtin/system/v4.go + builtin/system/v5.go + builtin/system/v6.go + builtin/verifreg/util.go + builtin/verifreg/v0.go + builtin/verifreg/v2.go + builtin/verifreg/v3.go + builtin/verifreg/v4.go + builtin/verifreg/v5.go + builtin/verifreg/v6.go + builtin/verifreg/verifreg.go + params.go + policy/policy.go + policy/policy_test.go + version.go diff --git a/venus-shared/compatible-checks/actor-template.txt b/venus-shared/compatible-checks/actor-templates.txt similarity index 100% rename from venus-shared/compatible-checks/actor-template.txt rename to venus-shared/compatible-checks/actor-templates.txt diff --git a/venus-shared/go.mod b/venus-shared/go.mod index 1fbfdea40a..5b6f4abf8d 100644 --- a/venus-shared/go.mod +++ b/venus-shared/go.mod @@ -4,17 +4,23 @@ go 1.16 require ( github.com/docker/go-units v0.4.0 - github.com/filecoin-project/go-address v0.0.3 + github.com/filecoin-project/go-address v0.0.6 + github.com/filecoin-project/go-bitfield v0.2.4 // indirect github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/specs-actors v0.9.13 github.com/filecoin-project/specs-actors/v2 v2.3.5 - github.com/ipfs/go-block-format v0.0.2 + github.com/filecoin-project/specs-actors/v3 v3.1.1 // indirect + github.com/filecoin-project/specs-actors/v4 v4.0.1 // indirect + github.com/filecoin-project/specs-actors/v5 v5.0.4 // indirect + github.com/filecoin-project/specs-actors/v6 v6.0.1 // indirect + github.com/ipfs/go-block-format v0.0.3 github.com/ipfs/go-cid v0.1.0 - github.com/ipfs/go-ipld-cbor v0.0.4 + github.com/ipfs/go-ipld-cbor v0.0.5 github.com/ipfs/go-ipld-format v0.0.2 + github.com/libp2p/go-libp2p-core v0.11.0 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/smartystreets/assertions v1.0.1 // indirect github.com/stretchr/testify v1.7.0 - github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c + github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 ) diff --git a/venus-shared/go.sum b/venus-shared/go.sum index ecfbf0b9e2..a0d23d0a48 100644 --- a/venus-shared/go.sum +++ b/venus-shared/go.sum @@ -1,36 +1,109 @@ +github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= +github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= +github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/filecoin-project/go-address v0.0.3 h1:eVfbdjEbpbzIrbiSa+PiGUY+oDK9HnUn+M1R/ggoHf8= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= +github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= +github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= +github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= +github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= +github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= github.com/filecoin-project/go-bitfield v0.2.0 h1:gCtLcjskIPtdg4NfN7gQZSQF9yrBQ7mkT0qCJxzGI2Q= github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= +github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= +github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= +github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= +github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+eEvrDCGJoPLxFpDynFjYfBjI= +github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= +github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= +github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/specs-actors v0.9.13 h1:rUEOQouefi9fuVY/2HOroROJlZbOzWYXXeIh41KF2M4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= +github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= github.com/filecoin-project/specs-actors/v2 v2.3.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= +github.com/filecoin-project/specs-actors/v3 v3.1.0/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= +github.com/filecoin-project/specs-actors/v3 v3.1.1 h1:BE8fsns1GnEOxt1DTE5LxBK2FThXtWmCChgcJoHTg0E= +github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= +github.com/filecoin-project/specs-actors/v4 v4.0.0/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= +github.com/filecoin-project/specs-actors/v4 v4.0.1 h1:AiWrtvJZ63MHGe6rn7tPu4nSUY8bA1KDNszqJaD5+Fg= +github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= +github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= +github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= +github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= +github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= +github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= +github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= +github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= +github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= +github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= +github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -40,38 +113,148 @@ github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqg github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= +github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= +github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= +github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= +github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= +github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= +github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= +github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= +github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= +github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= +github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= +github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= +github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= +github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= +github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= +github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= +github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= +github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4 h1:Aw3KPOKXjvrm6VjwJvFf1F1ekR/BH3jdof3Bk7OTiSA= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= +github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2 h1:OVAGlyYT6JPZ0pEfGntFPS40lfrDmaDbQwNHEY2G9Zs= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= +github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/ipfs/go-log v1.0.4 h1:6nLQdX4W8P9yZZFH7mO+X/PzjN8Laozm/lMJ6esdgzY= github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= +github.com/ipfs/go-log/v2 v2.0.5 h1:fL4YI+1g5V/b1Yxr1qAiXTMg1H8z9vx/VmJxBuQMHvU= github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= +github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= +github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= +github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= +github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= +github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= +github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= +github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= +github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= +github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= +github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= +github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= +github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= +github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= +github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= +github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= +github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= +github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= +github.com/libp2p/go-libp2p-core v0.11.0 h1:75jAgdA+IChNa+/mZXogfmrGkgwxkVvxmIC7pV+F6sI= +github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= +github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= +github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= +github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= +github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= +github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= @@ -80,18 +263,36 @@ github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= +github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.2.2 h1:XZLDTszBIJe6m0zF6ITBrEcZR73OPUhCBBS9rYAuUzI= +github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= +github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= +github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -99,19 +300,26 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a h1:hjZfReYVLbqFkAtr2us7vdy04YWz3LVAirzP7reh8+M= github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/requireions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/requireions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= github.com/smartystreets/requireions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -120,6 +328,7 @@ github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830 h1:8kxMKmKzXXL4Ru1nyhvdms/JjWt+3YLpvRb/bAjO/y0= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= @@ -127,32 +336,64 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:X github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= github.com/whyrusleeping/cbor-gen v0.0.0-20200715143311-227fab5a2377/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20200723185710-6a3894a6352b/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200806213330-63aa96ca5488/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200810223238-211df3b9e24c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c h1:otRnI08JoahNBxUFqX3372Ab9GnTj8L5J9iP5ImyxGU= github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 h1:7WtW9D9VGpmRLuQmrPy2JobUNdka95z3MKEVpELtOjo= +github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= +github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= +github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= +github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= +github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= +github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= +github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= +go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -161,7 +402,9 @@ golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -173,11 +416,15 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= From 3863ed74e3fb9d50aef5dc86050d2131dc5913d4 Mon Sep 17 00:00:00 2001 From: dtynn Date: Fri, 19 Nov 2021 18:31:53 +0800 Subject: [PATCH 028/167] feat: add FullBlock, FullTipSet in chain, add types in libp2p/exchange --- venus-devtool/cborgen/main.go | 10 + venus-shared/TODO.md | 1 + venus-shared/chain/full_block.go | 18 + venus-shared/chain/full_tipset.go | 71 +++ venus-shared/libp2p/exchange/cbor_gen.go | 649 +++++++++++++++++++++++ venus-shared/libp2p/exchange/exchange.go | 135 +++++ 6 files changed, 884 insertions(+) create mode 100644 venus-shared/TODO.md create mode 100644 venus-shared/chain/full_block.go create mode 100644 venus-shared/chain/full_tipset.go create mode 100644 venus-shared/libp2p/exchange/cbor_gen.go create mode 100644 venus-shared/libp2p/exchange/exchange.go diff --git a/venus-devtool/cborgen/main.go b/venus-devtool/cborgen/main.go index 7383e40754..b6d4a65f3e 100644 --- a/venus-devtool/cborgen/main.go +++ b/venus-devtool/cborgen/main.go @@ -7,6 +7,7 @@ import ( gen "github.com/whyrusleeping/cbor-gen" "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/libp2p/exchange" "github.com/filecoin-project/venus/venus-shared/libp2p/hello" ) @@ -25,6 +26,15 @@ func main() { hello.LatencyMessage{}, }, }, + { + dir: "../venus-shared/libp2p/exchange/", + types: []interface{}{ + exchange.Request{}, + exchange.Response{}, + exchange.CompactedMessages{}, + exchange.BSTipSet{}, + }, + }, { dir: "../venus-shared/chain/", types: []interface{}{ diff --git a/venus-shared/TODO.md b/venus-shared/TODO.md new file mode 100644 index 0000000000..932bed20ba --- /dev/null +++ b/venus-shared/TODO.md @@ -0,0 +1 @@ +- [ ] tests in actors diff --git a/venus-shared/chain/full_block.go b/venus-shared/chain/full_block.go new file mode 100644 index 0000000000..fa0d9f5248 --- /dev/null +++ b/venus-shared/chain/full_block.go @@ -0,0 +1,18 @@ +package chain + +import ( + "github.com/ipfs/go-cid" +) + +// FullBlock carries a newBlock header and the message and receipt collections +// referenced from the header. +type FullBlock struct { + Header *BlockHeader + BLSMessages []*Message + SECPMessages []*SignedMessage +} + +// Cid returns the FullBlock's header's Cid +func (fb *FullBlock) Cid() cid.Cid { + return fb.Header.Cid() +} diff --git a/venus-shared/chain/full_tipset.go b/venus-shared/chain/full_tipset.go new file mode 100644 index 0000000000..ab43a1aa7c --- /dev/null +++ b/venus-shared/chain/full_tipset.go @@ -0,0 +1,71 @@ +package chain + +import ( + "github.com/ipfs/go-cid" +) + +// FullTipSet is an expanded version of the TipSet that contains all the blocks and messages +type FullTipSet struct { + Blocks []*FullBlock + tipset *TipSet + cids []cid.Cid +} + +func NewFullTipSet(blks []*FullBlock) *FullTipSet { + return &FullTipSet{ + Blocks: blks, + } +} + +func (fts *FullTipSet) Cids() []cid.Cid { + if fts.cids != nil { + return fts.cids + } + + var cids []cid.Cid + for _, b := range fts.Blocks { + cids = append(cids, b.Cid()) + } + fts.cids = cids + + return cids +} + +// TipSet returns a narrower view of this FullTipSet elliding the newBlock +// messages. +func (fts *FullTipSet) TipSet() *TipSet { + if fts.tipset != nil { + // FIXME: fts.tipset is actually never set. Should it memoize? + return fts.tipset + } + + var headers []*BlockHeader + for _, b := range fts.Blocks { + headers = append(headers, b.Header) + } + + ts, err := NewTipSet(headers) + if err != nil { + panic(err) + } + + return ts +} + +// Reverse reverses the order of the slice `chain`. +func ReverseFullBlock(chain []*FullTipSet) { + // https://github.com/golang/go/wiki/SliceTricks#reversing + for i := len(chain)/2 - 1; i >= 0; i-- { + opp := len(chain) - 1 - i + chain[i], chain[opp] = chain[opp], chain[i] + } +} + +// Reverse reverses the order of the slice `chain`. +func ReverseTipSet(chain []*TipSet) { + // https://github.com/golang/go/wiki/SliceTricks#reversing + for i := len(chain)/2 - 1; i >= 0; i-- { + opp := len(chain) - 1 - i + chain[i], chain[opp] = chain[opp], chain[i] + } +} diff --git a/venus-shared/libp2p/exchange/cbor_gen.go b/venus-shared/libp2p/exchange/cbor_gen.go new file mode 100644 index 0000000000..829e6f3d60 --- /dev/null +++ b/venus-shared/libp2p/exchange/cbor_gen.go @@ -0,0 +1,649 @@ +// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. + +package exchange + +import ( + "fmt" + "io" + "math" + "sort" + + chain "github.com/filecoin-project/venus/venus-shared/chain" + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" +) + +var _ = xerrors.Errorf +var _ = cid.Undef +var _ = math.E +var _ = sort.Sort + +var lengthBufRequest = []byte{131} + +func (t *Request) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufRequest); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Head ([]cid.Cid) (slice) + if len(t.Head) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Head was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Head))); err != nil { + return err + } + for _, v := range t.Head { + if err := cbg.WriteCidBuf(scratch, w, v); err != nil { + return xerrors.Errorf("failed writing cid field t.Head: %w", err) + } + } + + // t.Length (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Length)); err != nil { + return err + } + + // t.Options (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Options)); err != nil { + return err + } + + return nil +} + +func (t *Request) UnmarshalCBOR(r io.Reader) error { + *t = Request{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 3 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Head ([]cid.Cid) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Head: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Head = make([]cid.Cid, extra) + } + + for i := 0; i < int(extra); i++ { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("reading cid field t.Head failed: %w", err) + } + t.Head[i] = c + } + + // t.Length (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Length = uint64(extra) + + } + // t.Options (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Options = uint64(extra) + + } + return nil +} + +var lengthBufResponse = []byte{131} + +func (t *Response) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufResponse); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Status (exchange.status) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Status)); err != nil { + return err + } + + // t.ErrorMessage (string) (string) + if len(t.ErrorMessage) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.ErrorMessage was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.ErrorMessage))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.ErrorMessage)); err != nil { + return err + } + + // t.Chain ([]*exchange.BSTipSet) (slice) + if len(t.Chain) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Chain was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Chain))); err != nil { + return err + } + for _, v := range t.Chain { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + return nil +} + +func (t *Response) UnmarshalCBOR(r io.Reader) error { + *t = Response{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 3 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Status (exchange.status) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Status = status(extra) + + } + // t.ErrorMessage (string) (string) + + { + sval, err := cbg.ReadStringBuf(br, scratch) + if err != nil { + return err + } + + t.ErrorMessage = string(sval) + } + // t.Chain ([]*exchange.BSTipSet) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Chain: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Chain = make([]*BSTipSet, extra) + } + + for i := 0; i < int(extra); i++ { + + var v BSTipSet + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.Chain[i] = &v + } + + return nil +} + +var lengthBufCompactedMessages = []byte{132} + +func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufCompactedMessages); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Bls ([]*chain.Message) (slice) + if len(t.Bls) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Bls was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Bls))); err != nil { + return err + } + for _, v := range t.Bls { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + + // t.BlsIncludes ([][]uint64) (slice) + if len(t.BlsIncludes) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.BlsIncludes was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.BlsIncludes))); err != nil { + return err + } + for _, v := range t.BlsIncludes { + if len(v) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field v was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(v))); err != nil { + return err + } + for _, v := range v { + if err := cbg.CborWriteHeader(w, cbg.MajUnsignedInt, uint64(v)); err != nil { + return err + } + } + } + + // t.Secpk ([]*chain.SignedMessage) (slice) + if len(t.Secpk) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Secpk was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Secpk))); err != nil { + return err + } + for _, v := range t.Secpk { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + + // t.SecpkIncludes ([][]uint64) (slice) + if len(t.SecpkIncludes) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.SecpkIncludes was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.SecpkIncludes))); err != nil { + return err + } + for _, v := range t.SecpkIncludes { + if len(v) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field v was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(v))); err != nil { + return err + } + for _, v := range v { + if err := cbg.CborWriteHeader(w, cbg.MajUnsignedInt, uint64(v)); err != nil { + return err + } + } + } + return nil +} + +func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) error { + *t = CompactedMessages{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 4 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Bls ([]*chain.Message) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Bls: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Bls = make([]*chain.Message, extra) + } + + for i := 0; i < int(extra); i++ { + + var v chain.Message + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.Bls[i] = &v + } + + // t.BlsIncludes ([][]uint64) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.BlsIncludes: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.BlsIncludes = make([][]uint64, extra) + } + + for i := 0; i < int(extra); i++ { + { + var maj byte + var extra uint64 + var err error + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.BlsIncludes[i]: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.BlsIncludes[i] = make([]uint64, extra) + } + + for j := 0; j < int(extra); j++ { + + maj, val, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return xerrors.Errorf("failed to read uint64 for t.BlsIncludes[i] slice: %w", err) + } + + if maj != cbg.MajUnsignedInt { + return xerrors.Errorf("value read for array t.BlsIncludes[i] was not a uint, instead got %d", maj) + } + + t.BlsIncludes[i][j] = uint64(val) + } + + } + } + + // t.Secpk ([]*chain.SignedMessage) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Secpk: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Secpk = make([]*chain.SignedMessage, extra) + } + + for i := 0; i < int(extra); i++ { + + var v chain.SignedMessage + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.Secpk[i] = &v + } + + // t.SecpkIncludes ([][]uint64) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.SecpkIncludes: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.SecpkIncludes = make([][]uint64, extra) + } + + for i := 0; i < int(extra); i++ { + { + var maj byte + var extra uint64 + var err error + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.SecpkIncludes[i]: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.SecpkIncludes[i] = make([]uint64, extra) + } + + for j := 0; j < int(extra); j++ { + + maj, val, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return xerrors.Errorf("failed to read uint64 for t.SecpkIncludes[i] slice: %w", err) + } + + if maj != cbg.MajUnsignedInt { + return xerrors.Errorf("value read for array t.SecpkIncludes[i] was not a uint, instead got %d", maj) + } + + t.SecpkIncludes[i][j] = uint64(val) + } + + } + } + + return nil +} + +var lengthBufBSTipSet = []byte{130} + +func (t *BSTipSet) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufBSTipSet); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Blocks ([]*chain.BlockHeader) (slice) + if len(t.Blocks) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Blocks was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Blocks))); err != nil { + return err + } + for _, v := range t.Blocks { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + + // t.Messages (exchange.CompactedMessages) (struct) + if err := t.Messages.MarshalCBOR(w); err != nil { + return err + } + return nil +} + +func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error { + *t = BSTipSet{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 2 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Blocks ([]*chain.BlockHeader) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Blocks: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Blocks = make([]*chain.BlockHeader, extra) + } + + for i := 0; i < int(extra); i++ { + + var v chain.BlockHeader + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.Blocks[i] = &v + } + + // t.Messages (exchange.CompactedMessages) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + t.Messages = new(CompactedMessages) + if err := t.Messages.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Messages pointer: %w", err) + } + } + + } + return nil +} diff --git a/venus-shared/libp2p/exchange/exchange.go b/venus-shared/libp2p/exchange/exchange.go new file mode 100644 index 0000000000..57f905b95f --- /dev/null +++ b/venus-shared/libp2p/exchange/exchange.go @@ -0,0 +1,135 @@ +package exchange + +import ( + "fmt" + "time" + + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/policy" + "github.com/filecoin-project/venus/venus-shared/chain" +) + +const ( + // BlockSyncProtocolID is the protocol ID of the former blocksync protocol. + // Deprecated. + BlockSyncProtocolID = "/fil/sync/blk/0.0.1" + + // ChainExchangeProtocolID is the protocol ID of the chain exchange + // protocol. + ChainExchangeProtocolID = "/fil/chain/xchg/0.0.1" +) + +// FIXME: Bumped from original 800 to this to accommodate `syncFork()` +// use of `GetBlocks()`. It seems the expectation of that API is to +// fetch any amount of blocks leaving it to the internal logic here +// to partition and reassemble the requests if they go above the maximum. +// (Also as a consequence of this temporarily removing the `const` +// qualifier to avoid "const initializer [...] is not a constant" error.) +var MaxRequestLength = uint64(policy.ChainFinality) + +const ( + // Extracted constants from the code. + // FIXME: Should be reviewed and confirmed. + SuccessPeerTagValue = 25 + WriteReqDeadline = 5 * time.Second + ReadResDeadline = WriteReqDeadline + ReadResMinSpeed = 50 << 10 + ShufflePeersPrefix = 16 + WriteResDeadline = 60 * time.Second +) + +// FIXME: Rename. Make private. +type Request struct { + // List of ordered CIDs comprising a `TipSetKey` from where to start + // fetching backwards. + // FIXME: Consider using `TipSetKey` now (introduced after the creation + // of this protocol) instead of converting back and forth. + Head []cid.Cid + // Number of block sets to fetch from `Head` (inclusive, should always + // be in the range `[1, MaxRequestLength]`). + Length uint64 + // Request options, see `Options` type for more details. Compressed + // in a single `uint64` to save space. + Options uint64 +} + +// Request options. When fetching the chain segment we can fetch +// either block headers, messages, or both. +const ( + Headers = 1 << iota + Messages +) + +// FIXME: Rename. Make private. +type Response struct { + Status status + // String that complements the error status when converting to an + // internal error (see `statusToError()`). + ErrorMessage string + + Chain []*BSTipSet +} + +type status uint64 + +const ( + Ok status = 0 + // We could not fetch all blocks requested (but at least we returned + // the `Head` requested). Not considered an error. + Partial = 101 + + // Errors + NotFound = 201 + GoAway = 202 + InternalError = 203 + BadRequest = 204 +) + +// Convert status to internal error. +func (res *Response) StatusToError() error { + switch res.Status { + case Ok, Partial: + return nil + // FIXME: Consider if we want to not process `Partial` responses + // and return an error instead. + case NotFound: + return fmt.Errorf("not found") + case GoAway: + return fmt.Errorf("not handling 'go away' chainxchg responses yet") + case InternalError: + return fmt.Errorf("block sync peer errored: %s", res.ErrorMessage) + case BadRequest: + return fmt.Errorf("block sync request invalid: %s", res.ErrorMessage) + default: + return fmt.Errorf("unrecognized response code: %d", res.Status) + } +} + +// FIXME: Rename. +type BSTipSet struct { + // List of blocks belonging to a single tipset to which the + // `CompactedMessages` are linked. + Blocks []*chain.BlockHeader + Messages *CompactedMessages +} + +// All messages of a single tipset compacted together instead +// of grouped by block to save space, since there are normally +// many repeated messages per tipset in different blocks. +// +// `BlsIncludes`/`SecpkIncludes` matches `Bls`/`Secpk` messages +// to blocks in the tipsets with the format: +// `BlsIncludes[BI][MI]` +// * BI: block index in the tipset. +// * MI: message index in `Bls` list +// +// FIXME: The logic to decompress this structure should belong +// to itself, not to the consumer. +type CompactedMessages struct { + Bls []*chain.Message + BlsIncludes [][]uint64 + + Secpk []*chain.SignedMessage + SecpkIncludes [][]uint64 +} From 9ca6c1f851b6d92f7bad910e08959c0423c49998 Mon Sep 17 00:00:00 2001 From: dtynn Date: Mon, 22 Nov 2021 13:15:29 +0800 Subject: [PATCH 029/167] feat: remove variables for implementations in libp2p/exchange --- venus-shared/libp2p/exchange/exchange.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/venus-shared/libp2p/exchange/exchange.go b/venus-shared/libp2p/exchange/exchange.go index 57f905b95f..59e8fe1865 100644 --- a/venus-shared/libp2p/exchange/exchange.go +++ b/venus-shared/libp2p/exchange/exchange.go @@ -2,7 +2,6 @@ package exchange import ( "fmt" - "time" "github.com/ipfs/go-cid" @@ -28,17 +27,6 @@ const ( // qualifier to avoid "const initializer [...] is not a constant" error.) var MaxRequestLength = uint64(policy.ChainFinality) -const ( - // Extracted constants from the code. - // FIXME: Should be reviewed and confirmed. - SuccessPeerTagValue = 25 - WriteReqDeadline = 5 * time.Second - ReadResDeadline = WriteReqDeadline - ReadResMinSpeed = 50 << 10 - ShufflePeersPrefix = 16 - WriteResDeadline = 60 * time.Second -) - // FIXME: Rename. Make private. type Request struct { // List of ordered CIDs comprising a `TipSetKey` from where to start From ef94da2599b81891e26908596f1f848c11335475 Mon Sep 17 00:00:00 2001 From: dtynn Date: Mon, 22 Nov 2021 14:26:46 +0800 Subject: [PATCH 030/167] feat: add interfaces for libp2p components --- venus-shared/libp2p/exchange/client.go | 35 ++++++++++++++++++++++++++ venus-shared/libp2p/peer_mgr.go | 15 +++++++++++ venus-shared/localstore/chain.go | 24 ++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 venus-shared/libp2p/exchange/client.go create mode 100644 venus-shared/libp2p/peer_mgr.go create mode 100644 venus-shared/localstore/chain.go diff --git a/venus-shared/libp2p/exchange/client.go b/venus-shared/libp2p/exchange/client.go new file mode 100644 index 0000000000..c619f6f3e2 --- /dev/null +++ b/venus-shared/libp2p/exchange/client.go @@ -0,0 +1,35 @@ +package exchange + +import ( + "context" + + "github.com/libp2p/go-libp2p-core/peer" + + "github.com/filecoin-project/venus/venus-shared/chain" +) + +// Client is the requesting side of the ChainExchange protocol. It acts as +// a proxy for other components to request chain data from peers. It is chiefly +// used by the Syncer. +type Client interface { + // GetBlocks fetches block headers from the network, from the provided + // tipset *backwards*, returning as many tipsets as the count parameter, + // or less. + GetBlocks(ctx context.Context, tsk chain.TipSetKey, count int) ([]*chain.TipSet, error) + + // GetChainMessages fetches messages from the network, starting from the first provided tipset + // and returning messages from as many tipsets as requested or less. + GetChainMessages(ctx context.Context, tipsets []*chain.TipSet) ([]*CompactedMessages, error) + + // GetFullTipSet fetches a full tipset from a given peer. If successful, + // the fetched object contains block headers and all messages in full form. + GetFullTipSet(ctx context.Context, peer []peer.ID, tsk chain.TipSetKey) (*chain.FullTipSet, error) + + // AddPeer adds a peer to the pool of peers that the Client requests + // data from. + AddPeer(ctx context.Context, peer peer.ID) + + // RemovePeer removes a peer from the pool of peers that the Client + // requests data from. + RemovePeer(ctx context.Context, peer peer.ID) +} diff --git a/venus-shared/libp2p/peer_mgr.go b/venus-shared/libp2p/peer_mgr.go new file mode 100644 index 0000000000..4d2e938c10 --- /dev/null +++ b/venus-shared/libp2p/peer_mgr.go @@ -0,0 +1,15 @@ +package libp2p + +import ( + "context" + "time" + + "github.com/libp2p/go-libp2p-core/peer" +) + +type PeerManager interface { + AddFilecoinPeer(ctx context.Context, p peer.ID) + GetPeerLatency(ctx context.Context, p peer.ID) (time.Duration, bool) + SetPeerLatency(ctx context.Context, p peer.ID, latency time.Duration) + Disconnect(ctx context.Context, p peer.ID) +} diff --git a/venus-shared/localstore/chain.go b/venus-shared/localstore/chain.go new file mode 100644 index 0000000000..b32e830d9a --- /dev/null +++ b/venus-shared/localstore/chain.go @@ -0,0 +1,24 @@ +package localstore + +import ( + "context" + + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/ipfs/go-cid" +) + +type TipSetLoader interface { + GetTipSet(context.Context, chain.TipSetKey) (*chain.TipSet, error) +} + +type MessageLoader interface { + ReadMsgMetaCids(ctx context.Context, mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) + + LoadMessagesFromCids(cids []cid.Cid) ([]*chain.Message, error) + LoadSignedMessagesFromCids(cids []cid.Cid) ([]*chain.SignedMessage, error) +} + +type ChainLoader interface { + TipSetLoader + MessageLoader +} From 6e9c2bcd75ca8e6a1deaaae3a9c8c3e274e937a0 Mon Sep 17 00:00:00 2001 From: dtynn Date: Mon, 22 Nov 2021 15:01:46 +0800 Subject: [PATCH 031/167] init venus-component module --- venus-component/go.mod | 10 ++ venus-component/go.sum | 380 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 390 insertions(+) create mode 100644 venus-component/go.mod create mode 100644 venus-component/go.sum diff --git a/venus-component/go.mod b/venus-component/go.mod new file mode 100644 index 0000000000..0c3353e0aa --- /dev/null +++ b/venus-component/go.mod @@ -0,0 +1,10 @@ +module github.com/filecoin-project/venus/venus-component + +go 1.16 + +require ( + github.com/filecoin-project/venus/venus-shared v0.0.0 + github.com/libp2p/go-libp2p-core v0.11.0 // indirect +) + +replace github.com/filecoin-project/venus/venus-shared => github.com/dtynn/venus/venus-shared v0.0.0-20211122062646-6bb571186c37 diff --git a/venus-component/go.sum b/venus-component/go.sum new file mode 100644 index 0000000000..50bca05dc9 --- /dev/null +++ b/venus-component/go.sum @@ -0,0 +1,380 @@ +github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= +github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= +github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dtynn/venus/venus-shared v0.0.0-20211122062646-6bb571186c37 h1:TvkS0D8Vdl418Hk6gs6w8U70ZJHReevP7X5+H1BdSAc= +github.com/dtynn/venus/venus-shared v0.0.0-20211122062646-6bb571186c37/go.mod h1:deIJ0lkLYvcVURL0HZmJMhF694QlC4r+Kk2MIdjGjGQ= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= +github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= +github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= +github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= +github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= +github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= +github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= +github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= +github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+eEvrDCGJoPLxFpDynFjYfBjI= +github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= +github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= +github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= +github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= +github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= +github.com/filecoin-project/specs-actors/v3 v3.1.0/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= +github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= +github.com/filecoin-project/specs-actors/v4 v4.0.0/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= +github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= +github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= +github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= +github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= +github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= +github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= +github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= +github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= +github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= +github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= +github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= +github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= +github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= +github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= +github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= +github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= +github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= +github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= +github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= +github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= +github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= +github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= +github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= +github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= +github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= +github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= +github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= +github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= +github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= +github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= +github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= +github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= +github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= +github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= +github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= +github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= +github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= +github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= +github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= +github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= +github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= +github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= +github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= +github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= +github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= +github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= +github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= +github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= +github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= +github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= +github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= +github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= +github.com/libp2p/go-libp2p-core v0.11.0 h1:75jAgdA+IChNa+/mZXogfmrGkgwxkVvxmIC7pV+F6sI= +github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= +github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= +github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= +github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= +github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= +github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +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/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= +github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= +github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.2.2 h1:XZLDTszBIJe6m0zF6ITBrEcZR73OPUhCBBS9rYAuUzI= +github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= +github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= +github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= +github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= +github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= +github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= +github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= +github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= +github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= +github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= +github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= +github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= +github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= +github.com/whyrusleeping/cbor-gen v0.0.0-20200715143311-227fab5a2377/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20200723185710-6a3894a6352b/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20200806213330-63aa96ca5488/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20200810223238-211df3b9e24c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= +github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= +github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= +github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= +github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= +github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= +github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= +github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o= +golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2 h1:46ULzRKLh1CwgRq2dC5SlBzEqqNCi8rreOZnNrbqcIY= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= From c5a3b65ae76a58352dd086419d43dd2e9b4534f2 Mon Sep 17 00:00:00 2001 From: dtynn Date: Mon, 22 Nov 2021 16:39:33 +0800 Subject: [PATCH 032/167] duplicate pkg/chainsync/exchange into venus-componet/libp2p --- {pkg/chainsync => venus-component/libp2p}/exchange/cbor_gen.go | 0 {pkg/chainsync => venus-component/libp2p}/exchange/client.go | 0 {pkg/chainsync => venus-component/libp2p}/exchange/doc.go | 0 {pkg/chainsync => venus-component/libp2p}/exchange/inct.go | 0 {pkg/chainsync => venus-component/libp2p}/exchange/interfaces.go | 0 .../chainsync => venus-component/libp2p}/exchange/peer_tracker.go | 0 {pkg/chainsync => venus-component/libp2p}/exchange/protocol.go | 0 {pkg/chainsync => venus-component/libp2p}/exchange/server.go | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename {pkg/chainsync => venus-component/libp2p}/exchange/cbor_gen.go (100%) rename {pkg/chainsync => venus-component/libp2p}/exchange/client.go (100%) rename {pkg/chainsync => venus-component/libp2p}/exchange/doc.go (100%) rename {pkg/chainsync => venus-component/libp2p}/exchange/inct.go (100%) rename {pkg/chainsync => venus-component/libp2p}/exchange/interfaces.go (100%) rename {pkg/chainsync => venus-component/libp2p}/exchange/peer_tracker.go (100%) rename {pkg/chainsync => venus-component/libp2p}/exchange/protocol.go (100%) rename {pkg/chainsync => venus-component/libp2p}/exchange/server.go (100%) diff --git a/pkg/chainsync/exchange/cbor_gen.go b/venus-component/libp2p/exchange/cbor_gen.go similarity index 100% rename from pkg/chainsync/exchange/cbor_gen.go rename to venus-component/libp2p/exchange/cbor_gen.go diff --git a/pkg/chainsync/exchange/client.go b/venus-component/libp2p/exchange/client.go similarity index 100% rename from pkg/chainsync/exchange/client.go rename to venus-component/libp2p/exchange/client.go diff --git a/pkg/chainsync/exchange/doc.go b/venus-component/libp2p/exchange/doc.go similarity index 100% rename from pkg/chainsync/exchange/doc.go rename to venus-component/libp2p/exchange/doc.go diff --git a/pkg/chainsync/exchange/inct.go b/venus-component/libp2p/exchange/inct.go similarity index 100% rename from pkg/chainsync/exchange/inct.go rename to venus-component/libp2p/exchange/inct.go diff --git a/pkg/chainsync/exchange/interfaces.go b/venus-component/libp2p/exchange/interfaces.go similarity index 100% rename from pkg/chainsync/exchange/interfaces.go rename to venus-component/libp2p/exchange/interfaces.go diff --git a/pkg/chainsync/exchange/peer_tracker.go b/venus-component/libp2p/exchange/peer_tracker.go similarity index 100% rename from pkg/chainsync/exchange/peer_tracker.go rename to venus-component/libp2p/exchange/peer_tracker.go diff --git a/pkg/chainsync/exchange/protocol.go b/venus-component/libp2p/exchange/protocol.go similarity index 100% rename from pkg/chainsync/exchange/protocol.go rename to venus-component/libp2p/exchange/protocol.go diff --git a/pkg/chainsync/exchange/server.go b/venus-component/libp2p/exchange/server.go similarity index 100% rename from pkg/chainsync/exchange/server.go rename to venus-component/libp2p/exchange/server.go From 4b2b6bb7a8c6f8412e48ffdea2fc89b3d671538f Mon Sep 17 00:00:00 2001 From: dtynn Date: Mon, 22 Nov 2021 16:40:04 +0800 Subject: [PATCH 033/167] restore pkg/chainsync/exchange --- pkg/chainsync/exchange/cbor_gen.go | 647 +++++++++++++++++++++++++ pkg/chainsync/exchange/client.go | 499 +++++++++++++++++++ pkg/chainsync/exchange/doc.go | 19 + pkg/chainsync/exchange/inct.go | 67 +++ pkg/chainsync/exchange/interfaces.go | 41 ++ pkg/chainsync/exchange/peer_tracker.go | 179 +++++++ pkg/chainsync/exchange/protocol.go | 205 ++++++++ pkg/chainsync/exchange/server.go | 271 +++++++++++ 8 files changed, 1928 insertions(+) create mode 100644 pkg/chainsync/exchange/cbor_gen.go create mode 100644 pkg/chainsync/exchange/client.go create mode 100644 pkg/chainsync/exchange/doc.go create mode 100644 pkg/chainsync/exchange/inct.go create mode 100644 pkg/chainsync/exchange/interfaces.go create mode 100644 pkg/chainsync/exchange/peer_tracker.go create mode 100644 pkg/chainsync/exchange/protocol.go create mode 100644 pkg/chainsync/exchange/server.go diff --git a/pkg/chainsync/exchange/cbor_gen.go b/pkg/chainsync/exchange/cbor_gen.go new file mode 100644 index 0000000000..81ec6b39df --- /dev/null +++ b/pkg/chainsync/exchange/cbor_gen.go @@ -0,0 +1,647 @@ +// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. + +package exchange + +import ( + "fmt" + "io" + "sort" + + "github.com/filecoin-project/venus/pkg/types" + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" +) + +var _ = xerrors.Errorf +var _ = cid.Undef +var _ = sort.Sort + +var lengthBufRequest = []byte{131} + +func (t *Request) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufRequest); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Head ([]cid.Cid) (slice) + if len(t.Head) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Head was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Head))); err != nil { + return err + } + for _, v := range t.Head { + if err := cbg.WriteCidBuf(scratch, w, v); err != nil { + return xerrors.Errorf("failed writing cid field t.Head: %w", err) + } + } + + // t.Length (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Length)); err != nil { + return err + } + + // t.Options (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Options)); err != nil { + return err + } + + return nil +} + +func (t *Request) UnmarshalCBOR(r io.Reader) error { + *t = Request{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 3 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Head ([]cid.Cid) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Head: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Head = make([]cid.Cid, extra) + } + + for i := 0; i < int(extra); i++ { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("reading cid field t.Head failed: %w", err) + } + t.Head[i] = c + } + + // t.Length (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Length = uint64(extra) + + } + // t.Options (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Options = uint64(extra) + + } + return nil +} + +var lengthBufResponse = []byte{131} + +func (t *Response) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufResponse); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Status (exchange.status) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Status)); err != nil { + return err + } + + // t.ErrorMessage (string) (string) + if len(t.ErrorMessage) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.ErrorMessage was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.ErrorMessage))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.ErrorMessage)); err != nil { + return err + } + + // t.Chain ([]*exchange.BSTipSet) (slice) + if len(t.Chain) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Chain was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Chain))); err != nil { + return err + } + for _, v := range t.Chain { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + return nil +} + +func (t *Response) UnmarshalCBOR(r io.Reader) error { + *t = Response{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 3 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Status (exchange.status) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Status = status(extra) + + } + // t.ErrorMessage (string) (string) + + { + sval, err := cbg.ReadStringBuf(br, scratch) + if err != nil { + return err + } + + t.ErrorMessage = string(sval) + } + // t.Chain ([]*exchange.BSTipSet) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Chain: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Chain = make([]*BSTipSet, extra) + } + + for i := 0; i < int(extra); i++ { + + var v BSTipSet + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.Chain[i] = &v + } + + return nil +} + +var lengthBufCompactedMessages = []byte{132} + +func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufCompactedMessages); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Bls ([]*types.UnsignedMessage) (slice) + if len(t.Bls) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Bls was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Bls))); err != nil { + return err + } + for _, v := range t.Bls { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + + // t.BlsIncludes ([][]uint64) (slice) + if len(t.BlsIncludes) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.BlsIncludes was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.BlsIncludes))); err != nil { + return err + } + for _, v := range t.BlsIncludes { + if len(v) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field v was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(v))); err != nil { + return err + } + for _, v := range v { + if err := cbg.CborWriteHeader(w, cbg.MajUnsignedInt, uint64(v)); err != nil { + return err + } + } + } + + // t.Secpk ([]*types.SignedMessage) (slice) + if len(t.Secpk) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Secpk was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Secpk))); err != nil { + return err + } + for _, v := range t.Secpk { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + + // t.SecpkIncludes ([][]uint64) (slice) + if len(t.SecpkIncludes) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.SecpkIncludes was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.SecpkIncludes))); err != nil { + return err + } + for _, v := range t.SecpkIncludes { + if len(v) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field v was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(v))); err != nil { + return err + } + for _, v := range v { + if err := cbg.CborWriteHeader(w, cbg.MajUnsignedInt, uint64(v)); err != nil { + return err + } + } + } + return nil +} + +func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) error { + *t = CompactedMessages{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 4 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Bls ([]*types.UnsignedMessage) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Bls: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Bls = make([]*types.UnsignedMessage, extra) + } + + for i := 0; i < int(extra); i++ { + + var v types.UnsignedMessage + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.Bls[i] = &v + } + + // t.BlsIncludes ([][]uint64) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.BlsIncludes: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.BlsIncludes = make([][]uint64, extra) + } + + for i := 0; i < int(extra); i++ { + { + var maj byte + var extra uint64 + var err error + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.BlsIncludes[i]: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.BlsIncludes[i] = make([]uint64, extra) + } + + for j := 0; j < int(extra); j++ { + + maj, val, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return xerrors.Errorf("failed to read uint64 for t.BlsIncludes[i] slice: %w", err) + } + + if maj != cbg.MajUnsignedInt { + return xerrors.Errorf("value read for array t.BlsIncludes[i] was not a uint, instead got %d", maj) + } + + t.BlsIncludes[i][j] = uint64(val) + } + + } + } + + // t.Secpk ([]*types.SignedMessage) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Secpk: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Secpk = make([]*types.SignedMessage, extra) + } + + for i := 0; i < int(extra); i++ { + + var v types.SignedMessage + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.Secpk[i] = &v + } + + // t.SecpkIncludes ([][]uint64) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.SecpkIncludes: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.SecpkIncludes = make([][]uint64, extra) + } + + for i := 0; i < int(extra); i++ { + { + var maj byte + var extra uint64 + var err error + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.SecpkIncludes[i]: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.SecpkIncludes[i] = make([]uint64, extra) + } + + for j := 0; j < int(extra); j++ { + + maj, val, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return xerrors.Errorf("failed to read uint64 for t.SecpkIncludes[i] slice: %w", err) + } + + if maj != cbg.MajUnsignedInt { + return xerrors.Errorf("value read for array t.SecpkIncludes[i] was not a uint, instead got %d", maj) + } + + t.SecpkIncludes[i][j] = uint64(val) + } + + } + } + + return nil +} + +var lengthBufBSTipSet = []byte{130} + +func (t *BSTipSet) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufBSTipSet); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Blocks ([]*types.BlockHeader) (slice) + if len(t.Blocks) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Blocks was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Blocks))); err != nil { + return err + } + for _, v := range t.Blocks { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + + // t.Messages (exchange.CompactedMessages) (struct) + if err := t.Messages.MarshalCBOR(w); err != nil { + return err + } + return nil +} + +func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error { + *t = BSTipSet{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 2 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Blocks ([]*types.BlockHeader) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Blocks: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Blocks = make([]*types.BlockHeader, extra) + } + + for i := 0; i < int(extra); i++ { + + var v types.BlockHeader + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.Blocks[i] = &v + } + + // t.Messages (exchange.CompactedMessages) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + t.Messages = new(CompactedMessages) + if err := t.Messages.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Messages pointer: %w", err) + } + } + + } + return nil +} diff --git a/pkg/chainsync/exchange/client.go b/pkg/chainsync/exchange/client.go new file mode 100644 index 0000000000..afa98ede45 --- /dev/null +++ b/pkg/chainsync/exchange/client.go @@ -0,0 +1,499 @@ +package exchange + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io/ioutil" + "math/rand" + "time" + + cborutil "github.com/filecoin-project/go-cbor-util" + "github.com/filecoin-project/venus/pkg/types" + logging "github.com/ipfs/go-log" + + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + + "go.opencensus.io/trace" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/pkg/net" +) + +var exchangeClientLogger = logging.Logger("exchange.client") + +// client implements exchange.Client, using the libp2p ChainExchange protocol +// as the fetching mechanism. +type client struct { + // Connection manager used to contact the server. + // FIXME: We should have a reduced interface here, initialized + // just with our protocol ID, we shouldn't be able to open *any* + // connection. + host host.Host + + peerTracker *bsPeerTracker +} + +var _ Client = (*client)(nil) + +// NewClient creates a new libp2p-based exchange.Client that uses the libp2p +// ChainExhange protocol as the fetching mechanism. +func NewClient(host host.Host, pmgr net.IPeerMgr) Client { + return &client{ + host: host, + peerTracker: newPeerTracker(host, pmgr), + } +} + +// Main logic of the client request service. The provided `Request` +// is sent to the `singlePeer` if one is indicated or to all available +// ones otherwise. The response is processed and validated according +// to the `Request` options. Either a `validatedResponse` is returned +// (which can be safely accessed), or an `error` that may represent +// either a response error status, a failed validation or an internal +// error. +// +// This is the internal single point of entry for all external-facing +// APIs, currently we have 3 very heterogeneous services exposed: +// * GetBlocks: Headers +// * GetFullTipSet: Headers | Messages +// * GetChainMessages: Messages +// This function handles all the different combinations of the available +// request options without disrupting external calls. In the future the +// consumers should be forced to use a more standardized service and +// adhere to a single API derived from this function. +func (c *client) doRequest( + ctx context.Context, + req *Request, + singlePeer []peer.ID, + // In the `GetChainMessages` case, we won't request the headers but we still + // need them to check the integrity of the `CompactedMessages` in the response + // so the tipset blocks need to be provided by the caller. + tipsets []*types.TipSet, +) (*validatedResponse, error) { + // Validate request. + if req.Length == 0 { + return nil, xerrors.Errorf("invalid request of length 0") + } + + if req.Length > MaxRequestLength { + return nil, xerrors.Errorf("request length (%d) above maximum (%d)", + req.Length, MaxRequestLength) + } + + if req.Options == 0 { + return nil, xerrors.Errorf("request with no options set") + } + + // Generate the list of peers to be queried, either the + // `singlePeer` indicated or all peers available (sorted + // by an internal peer tracker with some randomness injected). + var selectPeers []peer.ID + if singlePeer != nil { + selectPeers = append(selectPeers, singlePeer...) + } else { + selectPeers = c.getShuffledPeers() + } + if len(selectPeers) == 0 { + return nil, xerrors.Errorf("no peers available") + } + + // Try the request for each peer in the list, + // return on the first successful response. + // FIXME: Doing this serially isn't great, but fetching in parallel + // may not be a good idea either. Think about this more. + globalTime := time.Now() + // Global time used to track what is the expected time we will need to get + // a response if a client fails us. + for _, peer := range selectPeers { + select { + case <-ctx.Done(): + return nil, xerrors.Errorf("context cancelled: %w", ctx.Err()) + default: + } + + // Send request, read response. + res, err := c.sendRequestToPeer(ctx, peer, req) + if err != nil { + if !xerrors.Is(err, network.ErrNoConn) { + exchangeClientLogger.Warnf("could not send request to peer %s: %s", + peer.String(), err) + } + continue + } + + // Process and validate response. + validRes, err := c.processResponse(req, res, tipsets) + if err != nil { + exchangeClientLogger.Warnf("processing peer %s response failed: %s", peer.String(), err) + continue + } + + c.peerTracker.logGlobalSuccess(time.Since(globalTime)) + c.host.ConnManager().TagPeer(peer, "bsync", SuccessPeerTagValue) + return validRes, nil + } + + return nil, xerrors.Errorf("doRequest failed for all peers") +} + +// Process and validate response. Check the status, the integrity of the +// information returned, and that it matches the request. Extract the information +// into a `validatedResponse` for the external-facing APIs to select what they +// need. +// +// We are conflating in the single error returned both status and validation +// errors. Peer penalization should happen here then, before returning, so +// we can apply the correct penalties depending on the cause of the error. +// FIXME: Add the `peer` as argument once we implement penalties. +func (c *client) processResponse(req *Request, res *Response, tipsets []*types.TipSet) (*validatedResponse, error) { + err := res.statusToError() + if err != nil { + return nil, xerrors.Errorf("status error: %s", err) + } + + options := parseOptions(req.Options) + if options.noOptionsSet() { + // Safety check: this shouldn't have been sent, and even if it did + // it should have been caught by the peer in its error status. + return nil, xerrors.Errorf("nothing was requested") + } + + // Verify that the chain segment returned is in the valid range. + // Note that the returned length might be less than requested. + resLength := len(res.Chain) + if resLength == 0 { + return nil, xerrors.Errorf("got no chain in successful response") + } + if resLength > int(req.Length) { + return nil, xerrors.Errorf("got longer response (%d) than requested (%d)", + resLength, req.Length) + } + if resLength < int(req.Length) && res.Status != Partial { + return nil, xerrors.Errorf("got less than requested without a proper status: %d", res.Status) + } + + validRes := &validatedResponse{} + if options.IncludeHeaders { + // Check for valid block sets and extract them into `TipSet`s. + validRes.tipsets = make([]*types.TipSet, resLength) + for i := 0; i < resLength; i++ { + if res.Chain[i] == nil { + return nil, xerrors.Errorf("response with nil tipset in pos %d", i) + } + for blockIdx, block := range res.Chain[i].Blocks { + if block == nil { + return nil, xerrors.Errorf("tipset with nil block in pos %d", blockIdx) + // FIXME: Maybe we should move this check to `NewTipSet`. + } + } + + validRes.tipsets[i], err = types.NewTipSet(res.Chain[i].Blocks...) + if err != nil { + return nil, xerrors.Errorf("invalid tipset blocks at height (head - %d): %w", i, err) + } + } + + // Check that the returned head matches the one requested + if !types.CidArrsEqual(validRes.tipsets[0].Key().Cids(), req.Head) { + return nil, xerrors.Errorf("returned chain head does not match request") + } + + // Check `TipSet`s are connected (valid chain). + for i := 0; i < len(validRes.tipsets)-1; i++ { + if !validRes.tipsets[i].IsChildOf(validRes.tipsets[i+1]) { + return nil, fmt.Errorf("tipsets are not connected at height (head - %d)/(head - %d)", + i, i+1) + // FIXME: Maybe give more information here, like CIDs. + } + } + } + + if options.IncludeMessages { + validRes.messages = make([]*CompactedMessages, resLength) + for i := 0; i < resLength; i++ { + if res.Chain[i].Messages == nil { + return nil, xerrors.Errorf("no messages included for tipset at height (head - %d)", i) + } + validRes.messages[i] = res.Chain[i].Messages + } + + if options.IncludeHeaders { + // If the headers were also returned check that the compression + // indexes are valid before `toFullTipSets()` is called by the + // consumer. + err := c.validateCompressedIndices(res.Chain) + if err != nil { + return nil, err + } + } else { + // If we didn't request the headers they should have been provided + // by the caller. + if len(tipsets) < len(res.Chain) { + return nil, xerrors.Errorf("not enought tipsets provided for message response validation, needed %d, have %d", len(res.Chain), len(tipsets)) + } + chain := make([]*BSTipSet, 0, resLength) + for i, resChain := range res.Chain { + next := &BSTipSet{ + Blocks: tipsets[i].Blocks(), + Messages: resChain.Messages, + } + chain = append(chain, next) + } + + err := c.validateCompressedIndices(chain) + if err != nil { + return nil, err + } + } + } + + return validRes, nil +} + +func (c *client) validateCompressedIndices(chain []*BSTipSet) error { + resLength := len(chain) + for tipsetIdx := 0; tipsetIdx < resLength; tipsetIdx++ { + msgs := chain[tipsetIdx].Messages + blocksNum := len(chain[tipsetIdx].Blocks) + + if len(msgs.BlsIncludes) != blocksNum { + return xerrors.Errorf("BlsIncludes (%d) does not match number of blocks (%d)", + len(msgs.BlsIncludes), blocksNum) + } + + if len(msgs.SecpkIncludes) != blocksNum { + return xerrors.Errorf("SecpkIncludes (%d) does not match number of blocks (%d)", + len(msgs.SecpkIncludes), blocksNum) + } + + for blockIdx := 0; blockIdx < blocksNum; blockIdx++ { + for _, mi := range msgs.BlsIncludes[blockIdx] { + if int(mi) >= len(msgs.Bls) { + return xerrors.Errorf("index in BlsIncludes (%d) exceeds number of messages (%d)", + mi, len(msgs.Bls)) + } + } + + for _, mi := range msgs.SecpkIncludes[blockIdx] { + if int(mi) >= len(msgs.Secpk) { + return xerrors.Errorf("index in SecpkIncludes (%d) exceeds number of messages (%d)", + mi, len(msgs.Secpk)) + } + } + } + } + + return nil +} + +// GetBlocks implements Client.GetBlocks(). Refer to the godocs there. +func (c *client) GetBlocks(ctx context.Context, tsk types.TipSetKey, count int) ([]*types.TipSet, error) { + ctx, span := trace.StartSpan(ctx, "bsync.GetBlocks") + defer span.End() + if span.IsRecordingEvents() { + span.AddAttributes( + trace.StringAttribute("tipset", fmt.Sprint(tsk.Cids())), + trace.Int64Attribute("count", int64(count)), + ) + } + + req := &Request{ + Head: tsk.Cids(), + Length: uint64(count), + Options: Headers, + } + + validRes, err := c.doRequest(ctx, req, nil, nil) + if err != nil { + return nil, err + } + + return validRes.tipsets, nil +} + +// GetFullTipSet implements Client.GetFullTipSet(). Refer to the godocs there. +func (c *client) GetFullTipSet(ctx context.Context, peers []peer.ID, tsk types.TipSetKey) (*types.FullTipSet, error) { + // TODO: round robin through these peers on error + + req := &Request{ + Head: tsk.Cids(), + Length: 1, + Options: Headers | Messages, + } + + validRes, err := c.doRequest(ctx, req, peers, nil) + if err != nil { + return nil, err + } + + return validRes.toFullTipSets()[0], nil + // If `doRequest` didn't fail we are guaranteed to have at least + // *one* tipset here, so it's safe to index directly. +} + +// GetChainMessages implements Client.GetChainMessages(). Refer to the godocs there. +func (c *client) GetChainMessages(ctx context.Context, tipsets []*types.TipSet) ([]*CompactedMessages, error) { + head := tipsets[0] + length := uint64(len(tipsets)) + + ctx, span := trace.StartSpan(ctx, "GetChainMessages") + if span.IsRecordingEvents() { + span.AddAttributes( + trace.StringAttribute("tipset", fmt.Sprint(head.Key().Cids())), + trace.Int64Attribute("count", int64(length)), + ) + } + defer span.End() + + req := &Request{ + Head: head.Key().Cids(), + Length: length, + Options: Messages, + } + + validRes, err := c.doRequest(ctx, req, nil, tipsets) + if err != nil { + return nil, err + } + + return validRes.messages, nil +} + +// Send a request to a peer. Write request in the stream and read the +// response back. We do not do any processing of the request/response +// here. +func (c *client) sendRequestToPeer(ctx context.Context, peer peer.ID, req *Request) (_ *Response, err error) { + // Trace code. + ctx, span := trace.StartSpan(ctx, "sendRequestToPeer") + defer span.End() + if span.IsRecordingEvents() { + span.AddAttributes( + trace.StringAttribute("peer", peer.Pretty()), + ) + } + defer func() { + if err != nil { + if span.IsRecordingEvents() { + span.SetStatus(trace.Status{ + Code: 5, + Message: err.Error(), + }) + } + } + }() + // -- TRACE -- + + supported, err := c.host.Peerstore().SupportsProtocols(peer, BlockSyncProtocolID, ChainExchangeProtocolID) + if err != nil { + c.RemovePeer(peer) + return nil, xerrors.Errorf("failed to get protocols for peer: %w", err) + } + if len(supported) == 0 || (supported[0] != BlockSyncProtocolID && supported[0] != ChainExchangeProtocolID) { + c.RemovePeer(peer) + c.host.ConnManager().TagPeer(peer, "no match protocol", -2000) + return nil, xerrors.Errorf("peer %s does not support protocols %s", peer, []string{BlockSyncProtocolID, ChainExchangeProtocolID}) + } + + connectionStart := time.Now() + + // Open stream to peer. + stream, err := c.host.NewStream( + network.WithNoDial(ctx, "should already have connection"), + peer, + ChainExchangeProtocolID, BlockSyncProtocolID) + if err != nil { + c.RemovePeer(peer) + return nil, xerrors.Errorf("failed to open stream to peer: %w", err) + } + + defer func() { + // Note: this will become just stream.Close once we've completed the go-libp2p migration to + // go-libp2p-core 0.7.0 + go stream.Close() //nolint:errcheck + }() + + // Write request. + _ = stream.SetWriteDeadline(time.Now().Add(WriteReqDeadline)) + if err := cborutil.WriteCborRPC(stream, req); err != nil { + _ = stream.SetWriteDeadline(time.Time{}) + c.peerTracker.logFailure(peer, time.Since(connectionStart), req.Length) + // FIXME: Should we also remove peer here? + return nil, err + } + _ = stream.SetWriteDeadline(time.Time{}) // clear deadline // FIXME: Needs + // its own API (https://github.com/libp2p/go-libp2p-core/issues/162). + + // Read response. + _ = stream.SetReadDeadline(time.Time{}) + + //TODO Note: this will remove once we've completed the go-libp2p migration to + // go-libp2p-core 0.7.0 + respBytes, err := ioutil.ReadAll(bufio.NewReader(NewInct(stream, ReadResMinSpeed, ReadResDeadline))) + if err != nil { + return nil, err + } + + var res Response + err = cborutil.ReadCborRPC( + bytes.NewReader(respBytes), + //bufio.NewReader(NewInct(stream, ReadResMinSpeed, ReadResDeadline)), + &res) + if err != nil { + c.peerTracker.logFailure(peer, time.Since(connectionStart), req.Length) + return nil, xerrors.Errorf("failed to read chainxchg response: %w", err) + } + + // FIXME: Move all this together at the top using a defer as done elsewhere. + // Maybe we need to declare `res` in the signature. + if span.IsRecordingEvents() { + span.AddAttributes( + trace.Int64Attribute("resp_status", int64(res.Status)), + trace.StringAttribute("msg", res.ErrorMessage), + trace.Int64Attribute("chain_len", int64(len(res.Chain))), + ) + } + + c.peerTracker.logSuccess(peer, time.Since(connectionStart), uint64(len(res.Chain))) + // FIXME: We should really log a success only after we validate the response. + // It might be a bit hard to do. + return &res, nil +} + +// AddPeer implements Client.AddPeer(). Refer to the godocs there. +func (c *client) AddPeer(p peer.ID) { + c.peerTracker.addPeer(p) +} + +// RemovePeer implements Client.RemovePeer(). Refer to the godocs there. +func (c *client) RemovePeer(p peer.ID) { + c.peerTracker.removePeer(p) +} + +// getShuffledPeers returns a preference-sorted set of peers (by latency +// and failure counting), shuffling the first few peers so we don't always +// pick the same peer. +// FIXME: Consider merging with `shufflePrefix()s`. +func (c *client) getShuffledPeers() []peer.ID { + peers := c.peerTracker.prefSortedPeers() + shufflePrefix(peers) + return peers +} + +func shufflePrefix(peers []peer.ID) { + prefix := ShufflePeersPrefix + if len(peers) < prefix { + prefix = len(peers) + } + + buf := make([]peer.ID, prefix) + perm := rand.Perm(prefix) + for i, v := range perm { + buf[i] = peers[v] + } + + copy(peers, buf) +} diff --git a/pkg/chainsync/exchange/doc.go b/pkg/chainsync/exchange/doc.go new file mode 100644 index 0000000000..b20ee0c1fe --- /dev/null +++ b/pkg/chainsync/exchange/doc.go @@ -0,0 +1,19 @@ +// Package exchange contains the ChainExchange server and client components. +// +// ChainExchange is the basic chain synchronization protocol of Filecoin. +// ChainExchange is an RPC-oriented protocol, with a single operation to +// request blocks for now. +// +// A request contains a start anchor block (referred to with a CID), and a +// amount of blocks requested beyond the anchor (including the anchor itself). +// +// A client can also pass options, encoded as a 64-bit bitfield. Lotus supports +// two options at the moment: +// +// - include block contents +// - include block messages +// +// The response will include a status code, an optional message, and the +// response payload in case of success. The payload is a slice of serialized +// tipsets. +package exchange diff --git a/pkg/chainsync/exchange/inct.go b/pkg/chainsync/exchange/inct.go new file mode 100644 index 0000000000..ad3c345f58 --- /dev/null +++ b/pkg/chainsync/exchange/inct.go @@ -0,0 +1,67 @@ +package exchange + +import ( + "io" + "time" +) + +type ReaderDeadline interface { + Read([]byte) (int, error) + SetReadDeadline(time.Time) error +} + +type incrt struct { + rd ReaderDeadline + + waitPerByte time.Duration + wait time.Duration + maxWait time.Duration +} + +// New creates an Incremental Reader Timeout, with minimum sustained speed of +// minSpeed bytes per second and with maximum wait of maxWait +func NewInct(rd ReaderDeadline, minSpeed int64, maxWait time.Duration) io.Reader { + return &incrt{ + rd: rd, + waitPerByte: time.Second / time.Duration(minSpeed), + wait: maxWait, + maxWait: maxWait, + } +} + +type errNoWait struct{} + +func (err errNoWait) Error() string { + return "wait time exceeded" +} +func (err errNoWait) Timeout() bool { + return true +} + +func (crt *incrt) Read(buf []byte) (int, error) { + start := time.Now() + if crt.wait == 0 { + return 0, errNoWait{} + } + + err := crt.rd.SetReadDeadline(start.Add(crt.wait)) + if err != nil { + log.Debugf("unable to set deadline: %+v", err) + } + + n, err := crt.rd.Read(buf) + + _ = crt.rd.SetReadDeadline(time.Time{}) + if err == nil { + dur := time.Since(start) + crt.wait -= dur + crt.wait += time.Duration(n) * crt.waitPerByte + if crt.wait < 0 { + crt.wait = 0 + } + if crt.wait > crt.maxWait { + crt.wait = crt.maxWait + } + } + return n, err +} diff --git a/pkg/chainsync/exchange/interfaces.go b/pkg/chainsync/exchange/interfaces.go new file mode 100644 index 0000000000..5fb8dec405 --- /dev/null +++ b/pkg/chainsync/exchange/interfaces.go @@ -0,0 +1,41 @@ +package exchange + +import ( + "context" + "github.com/filecoin-project/venus/pkg/types" + + "github.com/libp2p/go-libp2p-core/peer" +) + +// Server is the responder side of the ChainExchange protocol. It accepts +// requests from clients and services them by returning the requested +// chain data. +type Server interface { + Register() +} + +// Client is the requesting side of the ChainExchange protocol. It acts as +// a proxy for other components to request chain data from peers. It is chiefly +// used by the Syncer. +type Client interface { + // GetBlocks fetches block headers from the network, from the provided + // tipset *backwards*, returning as many tipsets as the count parameter, + // or less. + GetBlocks(ctx context.Context, tsk types.TipSetKey, count int) ([]*types.TipSet, error) + + // GetChainMessages fetches messages from the network, starting from the first provided tipset + // and returning messages from as many tipsets as requested or less. + GetChainMessages(ctx context.Context, tipsets []*types.TipSet) ([]*CompactedMessages, error) + + // GetFullTipSet fetches a full tipset from a given peer. If successful, + // the fetched object contains block headers and all messages in full form. + GetFullTipSet(ctx context.Context, peer []peer.ID, tsk types.TipSetKey) (*types.FullTipSet, error) + + // AddPeer adds a peer to the pool of peers that the Client requests + // data from. + AddPeer(peer peer.ID) + + // RemovePeer removes a peer from the pool of peers that the Client + // requests data from. + RemovePeer(peer peer.ID) +} diff --git a/pkg/chainsync/exchange/peer_tracker.go b/pkg/chainsync/exchange/peer_tracker.go new file mode 100644 index 0000000000..2d14e022cc --- /dev/null +++ b/pkg/chainsync/exchange/peer_tracker.go @@ -0,0 +1,179 @@ +package exchange + +// FIXME: This needs to be reviewed. + +import ( + "sort" + "sync" + "time" + + host "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + + "github.com/filecoin-project/venus/pkg/net" +) + +type peerStats struct { + successes int + failures int + firstSeen time.Time + averageTime time.Duration +} + +type bsPeerTracker struct { + lk sync.Mutex + + peers map[peer.ID]*peerStats + avgGlobalTime time.Duration + + pmgr net.IPeerMgr +} + +func newPeerTracker(h host.Host, pmgr net.IPeerMgr) *bsPeerTracker { + bsPt := &bsPeerTracker{ + peers: make(map[peer.ID]*peerStats), + pmgr: pmgr, + } + + sub, err := h.EventBus().Subscribe(new(net.NewFilPeer)) + if err != nil { + panic(err) + } + + go func() { + for newPeer := range sub.Out() { + bsPt.addPeer(newPeer.(net.NewFilPeer).Id) + } + }() + return bsPt +} + +func (bpt *bsPeerTracker) addPeer(p peer.ID) { + bpt.lk.Lock() + defer bpt.lk.Unlock() + if _, ok := bpt.peers[p]; ok { + return + } + bpt.peers[p] = &peerStats{ + firstSeen: time.Now(), + } + +} + +const ( + // newPeerMul is how much better than average is the new peer assumed to be + // less than one to encourouge trying new peers + newPeerMul = 0.9 +) + +func (bpt *bsPeerTracker) prefSortedPeers() []peer.ID { + // TODO: this could probably be cached, but as long as its not too many peers, fine for now + bpt.lk.Lock() + defer bpt.lk.Unlock() + out := make([]peer.ID, 0, len(bpt.peers)) + for p := range bpt.peers { + out = append(out, p) + } + + // sort by 'expected cost' of requesting data from that peer + // additionally handle edge cases where not enough data is available + sort.Slice(out, func(i, j int) bool { + pi := bpt.peers[out[i]] + pj := bpt.peers[out[j]] + + var costI, costJ float64 + + getPeerInitLat := func(p peer.ID) float64 { + return float64(bpt.avgGlobalTime) * newPeerMul + } + + if pi.successes+pi.failures > 0 { + failRateI := float64(pi.failures) / float64(pi.failures+pi.successes) + costI = float64(pi.averageTime) + failRateI*float64(bpt.avgGlobalTime) + } else { + costI = getPeerInitLat(out[i]) + } + + if pj.successes+pj.failures > 0 { + failRateJ := float64(pj.failures) / float64(pj.failures+pj.successes) + costJ = float64(pj.averageTime) + failRateJ*float64(bpt.avgGlobalTime) + } else { + costJ = getPeerInitLat(out[j]) + } + + return costI < costJ + }) + + return out +} + +const ( + // xInvAlpha = (N+1)/2 + + localInvAlpha = 10 // 86% of the value is the last 19 + globalInvAlpha = 25 // 86% of the value is the last 49 +) + +func (bpt *bsPeerTracker) logGlobalSuccess(dur time.Duration) { + bpt.lk.Lock() + defer bpt.lk.Unlock() + + if bpt.avgGlobalTime == 0 { + bpt.avgGlobalTime = dur + return + } + delta := (dur - bpt.avgGlobalTime) / globalInvAlpha + bpt.avgGlobalTime += delta +} + +func logTime(pi *peerStats, dur time.Duration) { + if pi.averageTime == 0 { + pi.averageTime = dur + return + } + delta := (dur - pi.averageTime) / localInvAlpha + pi.averageTime += delta + +} + +func (bpt *bsPeerTracker) logSuccess(p peer.ID, dur time.Duration, reqSize uint64) { + bpt.lk.Lock() + defer bpt.lk.Unlock() + + var pi *peerStats + var ok bool + if pi, ok = bpt.peers[p]; !ok { + log.Debugf("log success called on peer not in tracker", "peerid", p.String()) + return + } + + pi.successes++ + if reqSize == 0 { + reqSize = 1 + } + logTime(pi, dur/time.Duration(reqSize)) +} + +func (bpt *bsPeerTracker) logFailure(p peer.ID, dur time.Duration, reqSize uint64) { + bpt.lk.Lock() + defer bpt.lk.Unlock() + + var pi *peerStats + var ok bool + if pi, ok = bpt.peers[p]; !ok { + log.Warn("log failure called on peer not in tracker", "peerid", p.String()) + return + } + + pi.failures++ + if reqSize == 0 { + reqSize = 1 + } + logTime(pi, dur/time.Duration(reqSize)) +} + +func (bpt *bsPeerTracker) removePeer(p peer.ID) { + bpt.lk.Lock() + defer bpt.lk.Unlock() + delete(bpt.peers, p) +} diff --git a/pkg/chainsync/exchange/protocol.go b/pkg/chainsync/exchange/protocol.go new file mode 100644 index 0000000000..46dbfd432f --- /dev/null +++ b/pkg/chainsync/exchange/protocol.go @@ -0,0 +1,205 @@ +package exchange + +import ( + "time" + + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/pkg/types/specactors/policy" + logging "github.com/ipfs/go-log" + "golang.org/x/xerrors" +) + +var log = logging.Logger("exchange") + +const ( + // BlockSyncProtocolID is the protocol ID of the former blocksync protocol. + // Deprecated. + BlockSyncProtocolID = "/fil/sync/blk/0.0.1" + + // ChainExchangeProtocolID is the protocol ID of the chain exchange + // protocol. + ChainExchangeProtocolID = "/fil/chain/xchg/0.0.1" +) + +// FIXME: Bumped from original 800 to this to accommodate `syncFork()` +// use of `GetBlocks()`. It seems the expectation of that API is to +// fetch any amount of blocks leaving it to the internal logic here +// to partition and reassemble the requests if they go above the maximum. +// (Also as a consequence of this temporarily removing the `const` +// qualifier to avoid "const initializer [...] is not a constant" error.) +var MaxRequestLength = uint64(policy.ChainFinality) + +const ( + // Extracted constants from the code. + // FIXME: Should be reviewed and confirmed. + SuccessPeerTagValue = 25 + WriteReqDeadline = 5 * time.Second + ReadResDeadline = WriteReqDeadline + ReadResMinSpeed = 50 << 10 + ShufflePeersPrefix = 16 + WriteResDeadline = 60 * time.Second +) + +// FIXME: Rename. Make private. +type Request struct { + // List of ordered CIDs comprising a `TipSetKey` from where to start + // fetching backwards. + // FIXME: Consider using `TipSetKey` now (introduced after the creation + // of this protocol) instead of converting back and forth. + Head []cid.Cid + // Number of block sets to fetch from `Head` (inclusive, should always + // be in the range `[1, MaxRequestLength]`). + Length uint64 + // Request options, see `Options` type for more details. Compressed + // in a single `uint64` to save space. + Options uint64 +} + +// `Request` processed and validated to query the tipsets needed. +type validatedRequest struct { + head types.TipSetKey + length uint64 + options *parsedOptions +} + +// Request options. When fetching the chain segment we can fetch +// either block headers, messages, or both. +const ( + Headers = 1 << iota + Messages +) + +// Decompressed options into separate struct members for easy access +// during internal processing.. +type parsedOptions struct { + IncludeHeaders bool + IncludeMessages bool +} + +func (options *parsedOptions) noOptionsSet() bool { + return !options.IncludeHeaders && !options.IncludeMessages +} + +func parseOptions(optfield uint64) *parsedOptions { + return &parsedOptions{ + IncludeHeaders: optfield&(uint64(Headers)) != 0, + IncludeMessages: optfield&(uint64(Messages)) != 0, + } +} + +// FIXME: Rename. Make private. +type Response struct { + Status status + // String that complements the error status when converting to an + // internal error (see `statusToError()`). + ErrorMessage string + + Chain []*BSTipSet +} + +type status uint64 + +const ( + Ok status = 0 + // We could not fetch all blocks requested (but at least we returned + // the `Head` requested). Not considered an error. + Partial = 101 + + // Errors + NotFound = 201 + GoAway = 202 + InternalError = 203 + BadRequest = 204 +) + +// Convert status to internal error. +func (res *Response) statusToError() error { + switch res.Status { + case Ok, Partial: + return nil + // FIXME: Consider if we want to not process `Partial` responses + // and return an error instead. + case NotFound: + return xerrors.Errorf("not found") + case GoAway: + return xerrors.Errorf("not handling 'go away' chainxchg responses yet") + case InternalError: + return xerrors.Errorf("block sync peer errored: %s", res.ErrorMessage) + case BadRequest: + return xerrors.Errorf("block sync request invalid: %s", res.ErrorMessage) + default: + return xerrors.Errorf("unrecognized response code: %d", res.Status) + } +} + +// FIXME: Rename. +type BSTipSet struct { + // List of blocks belonging to a single tipset to which the + // `CompactedMessages` are linked. + Blocks []*types.BlockHeader + Messages *CompactedMessages +} + +// All messages of a single tipset compacted together instead +// of grouped by block to save space, since there are normally +// many repeated messages per tipset in different blocks. +// +// `BlsIncludes`/`SecpkIncludes` matches `Bls`/`Secpk` messages +// to blocks in the tipsets with the format: +// `BlsIncludes[BI][MI]` +// * BI: block index in the tipset. +// * MI: message index in `Bls` list +// +// FIXME: The logic to decompress this structure should belong +// to itself, not to the consumer. +type CompactedMessages struct { + Bls []*types.UnsignedMessage + BlsIncludes [][]uint64 + + Secpk []*types.SignedMessage + SecpkIncludes [][]uint64 +} + +// Response that has been validated according to the protocol +// and can be safely accessed. +type validatedResponse struct { + tipsets []*types.TipSet + // List of all messages per tipset (grouped by tipset, + // not by block, hence a single index like `tipsets`). + messages []*CompactedMessages +} + +// Decompress messages and form full tipsets with them. The headers +// need to have been requested as well. +func (res *validatedResponse) toFullTipSets() []*types.FullTipSet { + if len(res.tipsets) == 0 || len(res.tipsets) != len(res.messages) { + // This decompression can only be done if both headers and + // messages are returned in the response. (The second check + // is already implied by the guarantees of `validatedResponse`, + // added here just for completeness.) + return nil + } + ftsList := make([]*types.FullTipSet, len(res.tipsets)) + for tipsetIdx := range res.tipsets { + fts := &types.FullTipSet{} // FIXME: We should use the `NewFullTipSet` API. + msgs := res.messages[tipsetIdx] + for blockIdx, b := range res.tipsets[tipsetIdx].Blocks() { + fb := &types.FullBlock{ + Header: b, + } + + for _, mi := range msgs.BlsIncludes[blockIdx] { + fb.BLSMessages = append(fb.BLSMessages, msgs.Bls[mi]) + } + for _, mi := range msgs.SecpkIncludes[blockIdx] { + fb.SECPMessages = append(fb.SECPMessages, msgs.Secpk[mi]) + } + + fts.Blocks = append(fts.Blocks, fb) + } + ftsList[tipsetIdx] = fts + } + return ftsList +} diff --git a/pkg/chainsync/exchange/server.go b/pkg/chainsync/exchange/server.go new file mode 100644 index 0000000000..1a83a7778d --- /dev/null +++ b/pkg/chainsync/exchange/server.go @@ -0,0 +1,271 @@ +package exchange + +import ( + "bufio" + "context" + "fmt" + cborutil "github.com/filecoin-project/go-cbor-util" + logging "github.com/ipfs/go-log" + "time" + + "go.opencensus.io/trace" + "golang.org/x/xerrors" + + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/host" + inet "github.com/libp2p/go-libp2p-core/network" + + "github.com/filecoin-project/venus/pkg/types" +) + +var exchangeServerLog = logging.Logger("exchange.server") + +type chainReader interface { + GetTipSet(types.TipSetKey) (*types.TipSet, error) +} + +type messageStore interface { + ReadMsgMetaCids(ctx context.Context, mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) + + LoadUnsignedMessagesFromCids(cids []cid.Cid) ([]*types.UnsignedMessage, error) + LoadSignedMessagesFromCids(cids []cid.Cid) ([]*types.SignedMessage, error) +} + +// server implements exchange.Server. It services requests for the +// libp2p ChainExchange protocol. +type server struct { + cr chainReader + mr messageStore + h host.Host +} + +var _ Server = (*server)(nil) + +// NewServer creates a new libp2p-based exchange.Server. It services requests +// for the libp2p ChainExchange protocol. +func NewServer(cr chainReader, mr messageStore, h host.Host) Server { + return &server{ + cr: cr, + mr: mr, + h: h, + } +} + +func (s *server) Register() { + s.h.SetStreamHandler(BlockSyncProtocolID, s.handleStream) // old + s.h.SetStreamHandler(ChainExchangeProtocolID, s.handleStream) // new +} + +// HandleStream implements Server.HandleStream. Refer to the godocs there. +func (s *server) handleStream(stream inet.Stream) { + ctx, span := trace.StartSpan(context.Background(), "chainxchg.HandleStream") + defer span.End() + + // Note: this will become just stream.Close once we've completed the go-libp2p migration to + // go-libp2p-core 0.7.0 + defer stream.Close() //nolint:errcheck + + var req Request + if err := cborutil.ReadCborRPC(bufio.NewReader(stream), &req); err != nil { + exchangeServerLog.Warnf("failed to read block sync request: %s", err) + return + } + fmt.Println(stream.Conn().RemotePeer()) + exchangeServerLog.Infow("block sync request", "start", req.Head, "len", req.Length) + + resp, err := s.processRequest(ctx, &req) + if err != nil { + exchangeServerLog.Warn("failed to process request: ", err) + return + } + + _ = stream.SetDeadline(time.Now().Add(WriteResDeadline)) + if err := cborutil.WriteCborRPC(stream, resp); err != nil { + _ = stream.SetDeadline(time.Time{}) + exchangeServerLog.Warnw("failed to write back response for handle stream", + "err", err, "peer", stream.Conn().RemotePeer()) + return + } + _ = stream.SetDeadline(time.Time{}) +} + +// Validate and service the request. We return either a protocol +// response or an internal error. +func (s *server) processRequest(ctx context.Context, req *Request) (*Response, error) { + validReq, errResponse := validateRequest(ctx, req) + if errResponse != nil { + // The request did not pass validation, return the response + // indicating it. + return errResponse, nil + } + + return s.serviceRequest(ctx, validReq) +} + +// Validate request. We either return a `validatedRequest`, or an error +// `Response` indicating why we can't process it. We do not return any +// internal errors here, we just signal protocol ones. +func validateRequest(ctx context.Context, req *Request) (*validatedRequest, *Response) { + _, span := trace.StartSpan(ctx, "chainxchg.ValidateRequest") + defer span.End() + + validReq := validatedRequest{} + + validReq.options = parseOptions(req.Options) + if validReq.options.noOptionsSet() { + return nil, &Response{ + Status: BadRequest, + ErrorMessage: "no options set", + } + } + + validReq.length = req.Length + if validReq.length > MaxRequestLength { + return nil, &Response{ + Status: BadRequest, + ErrorMessage: fmt.Sprintf("request length over maximum allowed (%d)", + MaxRequestLength), + } + } + if validReq.length == 0 { + return nil, &Response{ + Status: BadRequest, + ErrorMessage: "invalid request length of zero", + } + } + + if len(req.Head) == 0 { + return nil, &Response{ + Status: BadRequest, + ErrorMessage: "no cids in request", + } + } + validReq.head = types.NewTipSetKey(req.Head...) + + // FIXME: Add as a defer at the start. + span.AddAttributes( + trace.BoolAttribute("blocks", validReq.options.IncludeHeaders), + trace.BoolAttribute("messages", validReq.options.IncludeMessages), + trace.Int64Attribute("reqlen", int64(validReq.length)), + ) + + return &validReq, nil +} + +func (s *server) serviceRequest(ctx context.Context, req *validatedRequest) (*Response, error) { + _, span := trace.StartSpan(ctx, "chainxchg.ServiceRequest") + defer span.End() + + chain, err := collectChainSegment(s.cr, s.mr, req) + if err != nil { + exchangeServerLog.Warn("block sync request: collectChainSegment failed: ", err) + return &Response{ + Status: InternalError, + ErrorMessage: err.Error(), + }, nil + } + + status := Ok + if len(chain) < int(req.length) { + status = Partial + } + + return &Response{ + Chain: chain, + Status: status, + }, nil +} + +func collectChainSegment(cr chainReader, mr messageStore, req *validatedRequest) ([]*BSTipSet, error) { + var bstips []*BSTipSet + + cur := req.head + for { + var bst BSTipSet + ts, err := cr.GetTipSet(cur) + if err != nil { + return nil, xerrors.Errorf("failed loading tipset %s: %w", cur, err) + } + + if req.options.IncludeHeaders { + bst.Blocks = ts.Blocks() + } + + if req.options.IncludeMessages { + bmsgs, bmincl, smsgs, smincl, err := GatherMessages(cr, mr, ts) + if err != nil { + return nil, xerrors.Errorf("gather messages failed: %w", err) + } + + // FIXME: Pass the response to `gatherMessages()` and set all this there. + bst.Messages = &CompactedMessages{} + bst.Messages.Bls = bmsgs + bst.Messages.BlsIncludes = bmincl + bst.Messages.Secpk = smsgs + bst.Messages.SecpkIncludes = smincl + } + + bstips = append(bstips, &bst) + + // If we collected the length requested or if we reached the + // start (genesis), then stop. + if uint64(len(bstips)) >= req.length || ts.Height() == 0 { + return bstips, nil + } + + cur = ts.Parents() + } +} + +func GatherMessages(cr chainReader, mr messageStore, ts *types.TipSet) ([]*types.UnsignedMessage, [][]uint64, []*types.SignedMessage, [][]uint64, error) { + blsmsgmap := make(map[cid.Cid]uint64) + secpkmsgmap := make(map[cid.Cid]uint64) + var secpkincl, blsincl [][]uint64 + + var blscids, secpkcids []cid.Cid + for _, block := range ts.Blocks() { + bc, sc, err := mr.ReadMsgMetaCids(context.TODO(), block.Messages) + if err != nil { + return nil, nil, nil, nil, err + } + + // FIXME: DRY. Use `chain.Message` interface. + bmi := make([]uint64, 0, len(bc)) + for _, m := range bc { + i, ok := blsmsgmap[m] + if !ok { + i = uint64(len(blscids)) + blscids = append(blscids, m) + blsmsgmap[m] = i + } + + bmi = append(bmi, i) + } + blsincl = append(blsincl, bmi) + + smi := make([]uint64, 0, len(sc)) + for _, m := range sc { + i, ok := secpkmsgmap[m] + if !ok { + i = uint64(len(secpkcids)) + secpkcids = append(secpkcids, m) + secpkmsgmap[m] = i + } + + smi = append(smi, i) + } + secpkincl = append(secpkincl, smi) + } + + blsmsgs, err := mr.LoadUnsignedMessagesFromCids(blscids) + if err != nil { + return nil, nil, nil, nil, err + } + + secpkmsgs, err := mr.LoadSignedMessagesFromCids(secpkcids) + if err != nil { + return nil, nil, nil, nil, err + } + + return blsmsgs, blsincl, secpkmsgs, secpkincl, nil +} From 1ea167e33136c6ed89cc841e841b147e4c82039a Mon Sep 17 00:00:00 2001 From: dtynn Date: Mon, 22 Nov 2021 17:37:04 +0800 Subject: [PATCH 034/167] fix: stuffs required by venus-component/libp2p/exchange --- venus-shared/chain/tipset.go | 4 ++-- venus-shared/libp2p/peer_mgr.go | 4 ++++ venus-shared/localstore/chain.go | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/venus-shared/chain/tipset.go b/venus-shared/chain/tipset.go index 74152439de..4ce6ea62b1 100644 --- a/venus-shared/chain/tipset.go +++ b/venus-shared/chain/tipset.go @@ -199,7 +199,7 @@ func (ts TipSet) String() string { } func (ts *TipSet) IsChildOf(parent *TipSet) bool { - return cidArrsEqual(ts.Parents().Cids(), parent.key.Cids()) && + return CidArrsEqual(ts.Parents().Cids(), parent.key.Cids()) && // FIXME: The height check might go beyond what is meant by // "parent", but many parts of the code rely on the tipset's // height for their processing logic at the moment to obviate it. @@ -258,7 +258,7 @@ func sortBlockHeadersInTipSet(blks []*blockHeaderWithCid) { }) } -func cidArrsEqual(a, b []cid.Cid) bool { +func CidArrsEqual(a, b []cid.Cid) bool { if len(a) != len(b) { return false } diff --git a/venus-shared/libp2p/peer_mgr.go b/venus-shared/libp2p/peer_mgr.go index 4d2e938c10..36fc395904 100644 --- a/venus-shared/libp2p/peer_mgr.go +++ b/venus-shared/libp2p/peer_mgr.go @@ -7,6 +7,10 @@ import ( "github.com/libp2p/go-libp2p-core/peer" ) +type NewFilPeer struct { + Id peer.ID // nolint: stylecheck +} + type PeerManager interface { AddFilecoinPeer(ctx context.Context, p peer.ID) GetPeerLatency(ctx context.Context, p peer.ID) (time.Duration, bool) diff --git a/venus-shared/localstore/chain.go b/venus-shared/localstore/chain.go index b32e830d9a..452b78e90e 100644 --- a/venus-shared/localstore/chain.go +++ b/venus-shared/localstore/chain.go @@ -14,8 +14,8 @@ type TipSetLoader interface { type MessageLoader interface { ReadMsgMetaCids(ctx context.Context, mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) - LoadMessagesFromCids(cids []cid.Cid) ([]*chain.Message, error) - LoadSignedMessagesFromCids(cids []cid.Cid) ([]*chain.SignedMessage, error) + LoadMessagesFromCids(ctx context.Context, cids []cid.Cid) ([]*chain.Message, error) + LoadSignedMessagesFromCids(ctx context.Context, cids []cid.Cid) ([]*chain.SignedMessage, error) } type ChainLoader interface { From 11f364ef90d93441173e3d03ff1d17afb0729e77 Mon Sep 17 00:00:00 2001 From: dtynn Date: Mon, 22 Nov 2021 17:54:26 +0800 Subject: [PATCH 035/167] feat: duplicate chainsync/exchange, make it depend on venus-shared --- venus-component/go.mod | 8 +- venus-component/go.sum | 149 +++- venus-component/libp2p/exchange/cbor_gen.go | 647 ------------------ venus-component/libp2p/exchange/client.go | 140 ++-- venus-component/libp2p/exchange/interfaces.go | 41 -- .../libp2p/exchange/peer_tracker.go | 10 +- venus-component/libp2p/exchange/protocol.go | 152 +--- venus-component/libp2p/exchange/server.go | 119 ++-- 8 files changed, 302 insertions(+), 964 deletions(-) delete mode 100644 venus-component/libp2p/exchange/cbor_gen.go delete mode 100644 venus-component/libp2p/exchange/interfaces.go diff --git a/venus-component/go.mod b/venus-component/go.mod index 0c3353e0aa..f9045c8497 100644 --- a/venus-component/go.mod +++ b/venus-component/go.mod @@ -3,8 +3,12 @@ module github.com/filecoin-project/venus/venus-component go 1.16 require ( + github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/venus/venus-shared v0.0.0 - github.com/libp2p/go-libp2p-core v0.11.0 // indirect + github.com/ipfs/go-cid v0.1.0 + github.com/ipfs/go-log v1.0.5 + github.com/libp2p/go-libp2p-core v0.11.0 + go.opencensus.io v0.23.0 ) -replace github.com/filecoin-project/venus/venus-shared => github.com/dtynn/venus/venus-shared v0.0.0-20211122062646-6bb571186c37 +replace github.com/filecoin-project/venus/venus-shared => github.com/dtynn/venus/venus-shared v0.0.0-20211122093704-d17df8c81e67 diff --git a/venus-component/go.sum b/venus-component/go.sum index 50bca05dc9..16fd231a58 100644 --- a/venus-component/go.sum +++ b/venus-component/go.sum @@ -1,4 +1,6 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= @@ -16,59 +18,105 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dtynn/venus/venus-shared v0.0.0-20211122062646-6bb571186c37 h1:TvkS0D8Vdl418Hk6gs6w8U70ZJHReevP7X5+H1BdSAc= -github.com/dtynn/venus/venus-shared v0.0.0-20211122062646-6bb571186c37/go.mod h1:deIJ0lkLYvcVURL0HZmJMhF694QlC4r+Kk2MIdjGjGQ= +github.com/dtynn/venus/venus-shared v0.0.0-20211122093704-d17df8c81e67 h1:2Jxs4ZBNc34iugyQZJz2Qt9G0I8Ajz7TdhmLZUAdhO8= +github.com/dtynn/venus/venus-shared v0.0.0-20211122093704-d17df8c81e67/go.mod h1:deIJ0lkLYvcVURL0HZmJMhF694QlC4r+Kk2MIdjGjGQ= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= +github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= +github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= +github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= +github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= +github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= +github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= +github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+eEvrDCGJoPLxFpDynFjYfBjI= github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= +github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/specs-actors v0.9.13 h1:rUEOQouefi9fuVY/2HOroROJlZbOzWYXXeIh41KF2M4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= +github.com/filecoin-project/specs-actors/v2 v2.3.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= github.com/filecoin-project/specs-actors/v3 v3.1.0/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= +github.com/filecoin-project/specs-actors/v3 v3.1.1 h1:BE8fsns1GnEOxt1DTE5LxBK2FThXtWmCChgcJoHTg0E= github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= github.com/filecoin-project/specs-actors/v4 v4.0.0/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= +github.com/filecoin-project/specs-actors/v4 v4.0.1 h1:AiWrtvJZ63MHGe6rn7tPu4nSUY8bA1KDNszqJaD5+Fg= github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= +github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= +github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= @@ -82,6 +130,7 @@ github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSA github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= +github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -112,15 +161,24 @@ github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqt github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= +github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= +github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= +github.com/ipfs/go-ipld-format v0.0.2 h1:OVAGlyYT6JPZ0pEfGntFPS40lfrDmaDbQwNHEY2G9Zs= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= +github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= +github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= +github.com/ipfs/go-log/v2 v2.1.3 h1:1iS3IU7aXRlbgUpN8yTTpJ53NXYjAe37vcI5+5nYrzk= +github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= @@ -130,6 +188,7 @@ github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZ github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= +github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= @@ -142,9 +201,11 @@ github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZl github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw= @@ -262,32 +323,44 @@ github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a h1:hjZfReYVLbqFkAtr2us7vdy04YWz3LVAirzP7reh8+M= github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830 h1:8kxMKmKzXXL4Ru1nyhvdms/JjWt+3YLpvRb/bAjO/y0= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= @@ -298,6 +371,7 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200810223238-211df3b9e24c/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 h1:7WtW9D9VGpmRLuQmrPy2JobUNdka95z3MKEVpELtOjo= github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= @@ -306,11 +380,25 @@ github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= +github.com/xorcare/golden v0.6.0 h1:E8emU8bhyMIEpYmgekkTUaw4vtcrRE+Wa0c5wYIcgXc= github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -320,22 +408,43 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -347,6 +456,7 @@ golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2 h1:46ULzRKLh1CwgRq2dC5SlBzEqqNCi8rreOZnNrbqcIY= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -358,15 +468,43 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a h1:CB3a9Nez8M13wwlr/E2YtwoU+qYHKfC+JrDa45RXXoQ= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -375,6 +513,11 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/venus-component/libp2p/exchange/cbor_gen.go b/venus-component/libp2p/exchange/cbor_gen.go deleted file mode 100644 index 81ec6b39df..0000000000 --- a/venus-component/libp2p/exchange/cbor_gen.go +++ /dev/null @@ -1,647 +0,0 @@ -// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. - -package exchange - -import ( - "fmt" - "io" - "sort" - - "github.com/filecoin-project/venus/pkg/types" - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" -) - -var _ = xerrors.Errorf -var _ = cid.Undef -var _ = sort.Sort - -var lengthBufRequest = []byte{131} - -func (t *Request) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufRequest); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.Head ([]cid.Cid) (slice) - if len(t.Head) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.Head was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Head))); err != nil { - return err - } - for _, v := range t.Head { - if err := cbg.WriteCidBuf(scratch, w, v); err != nil { - return xerrors.Errorf("failed writing cid field t.Head: %w", err) - } - } - - // t.Length (uint64) (uint64) - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Length)); err != nil { - return err - } - - // t.Options (uint64) (uint64) - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Options)); err != nil { - return err - } - - return nil -} - -func (t *Request) UnmarshalCBOR(r io.Reader) error { - *t = Request{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 3 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Head ([]cid.Cid) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.Head: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.Head = make([]cid.Cid, extra) - } - - for i := 0; i < int(extra); i++ { - - c, err := cbg.ReadCid(br) - if err != nil { - return xerrors.Errorf("reading cid field t.Head failed: %w", err) - } - t.Head[i] = c - } - - // t.Length (uint64) (uint64) - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Length = uint64(extra) - - } - // t.Options (uint64) (uint64) - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Options = uint64(extra) - - } - return nil -} - -var lengthBufResponse = []byte{131} - -func (t *Response) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufResponse); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.Status (exchange.status) (uint64) - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Status)); err != nil { - return err - } - - // t.ErrorMessage (string) (string) - if len(t.ErrorMessage) > cbg.MaxLength { - return xerrors.Errorf("Value in field t.ErrorMessage was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.ErrorMessage))); err != nil { - return err - } - if _, err := io.WriteString(w, string(t.ErrorMessage)); err != nil { - return err - } - - // t.Chain ([]*exchange.BSTipSet) (slice) - if len(t.Chain) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.Chain was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Chain))); err != nil { - return err - } - for _, v := range t.Chain { - if err := v.MarshalCBOR(w); err != nil { - return err - } - } - return nil -} - -func (t *Response) UnmarshalCBOR(r io.Reader) error { - *t = Response{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 3 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Status (exchange.status) (uint64) - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Status = status(extra) - - } - // t.ErrorMessage (string) (string) - - { - sval, err := cbg.ReadStringBuf(br, scratch) - if err != nil { - return err - } - - t.ErrorMessage = string(sval) - } - // t.Chain ([]*exchange.BSTipSet) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.Chain: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.Chain = make([]*BSTipSet, extra) - } - - for i := 0; i < int(extra); i++ { - - var v BSTipSet - if err := v.UnmarshalCBOR(br); err != nil { - return err - } - - t.Chain[i] = &v - } - - return nil -} - -var lengthBufCompactedMessages = []byte{132} - -func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufCompactedMessages); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.Bls ([]*types.UnsignedMessage) (slice) - if len(t.Bls) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.Bls was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Bls))); err != nil { - return err - } - for _, v := range t.Bls { - if err := v.MarshalCBOR(w); err != nil { - return err - } - } - - // t.BlsIncludes ([][]uint64) (slice) - if len(t.BlsIncludes) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.BlsIncludes was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.BlsIncludes))); err != nil { - return err - } - for _, v := range t.BlsIncludes { - if len(v) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field v was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(v))); err != nil { - return err - } - for _, v := range v { - if err := cbg.CborWriteHeader(w, cbg.MajUnsignedInt, uint64(v)); err != nil { - return err - } - } - } - - // t.Secpk ([]*types.SignedMessage) (slice) - if len(t.Secpk) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.Secpk was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Secpk))); err != nil { - return err - } - for _, v := range t.Secpk { - if err := v.MarshalCBOR(w); err != nil { - return err - } - } - - // t.SecpkIncludes ([][]uint64) (slice) - if len(t.SecpkIncludes) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.SecpkIncludes was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.SecpkIncludes))); err != nil { - return err - } - for _, v := range t.SecpkIncludes { - if len(v) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field v was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(v))); err != nil { - return err - } - for _, v := range v { - if err := cbg.CborWriteHeader(w, cbg.MajUnsignedInt, uint64(v)); err != nil { - return err - } - } - } - return nil -} - -func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) error { - *t = CompactedMessages{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 4 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Bls ([]*types.UnsignedMessage) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.Bls: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.Bls = make([]*types.UnsignedMessage, extra) - } - - for i := 0; i < int(extra); i++ { - - var v types.UnsignedMessage - if err := v.UnmarshalCBOR(br); err != nil { - return err - } - - t.Bls[i] = &v - } - - // t.BlsIncludes ([][]uint64) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.BlsIncludes: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.BlsIncludes = make([][]uint64, extra) - } - - for i := 0; i < int(extra); i++ { - { - var maj byte - var extra uint64 - var err error - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.BlsIncludes[i]: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.BlsIncludes[i] = make([]uint64, extra) - } - - for j := 0; j < int(extra); j++ { - - maj, val, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return xerrors.Errorf("failed to read uint64 for t.BlsIncludes[i] slice: %w", err) - } - - if maj != cbg.MajUnsignedInt { - return xerrors.Errorf("value read for array t.BlsIncludes[i] was not a uint, instead got %d", maj) - } - - t.BlsIncludes[i][j] = uint64(val) - } - - } - } - - // t.Secpk ([]*types.SignedMessage) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.Secpk: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.Secpk = make([]*types.SignedMessage, extra) - } - - for i := 0; i < int(extra); i++ { - - var v types.SignedMessage - if err := v.UnmarshalCBOR(br); err != nil { - return err - } - - t.Secpk[i] = &v - } - - // t.SecpkIncludes ([][]uint64) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.SecpkIncludes: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.SecpkIncludes = make([][]uint64, extra) - } - - for i := 0; i < int(extra); i++ { - { - var maj byte - var extra uint64 - var err error - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.SecpkIncludes[i]: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.SecpkIncludes[i] = make([]uint64, extra) - } - - for j := 0; j < int(extra); j++ { - - maj, val, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return xerrors.Errorf("failed to read uint64 for t.SecpkIncludes[i] slice: %w", err) - } - - if maj != cbg.MajUnsignedInt { - return xerrors.Errorf("value read for array t.SecpkIncludes[i] was not a uint, instead got %d", maj) - } - - t.SecpkIncludes[i][j] = uint64(val) - } - - } - } - - return nil -} - -var lengthBufBSTipSet = []byte{130} - -func (t *BSTipSet) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufBSTipSet); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.Blocks ([]*types.BlockHeader) (slice) - if len(t.Blocks) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.Blocks was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Blocks))); err != nil { - return err - } - for _, v := range t.Blocks { - if err := v.MarshalCBOR(w); err != nil { - return err - } - } - - // t.Messages (exchange.CompactedMessages) (struct) - if err := t.Messages.MarshalCBOR(w); err != nil { - return err - } - return nil -} - -func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error { - *t = BSTipSet{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 2 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Blocks ([]*types.BlockHeader) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.Blocks: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.Blocks = make([]*types.BlockHeader, extra) - } - - for i := 0; i < int(extra); i++ { - - var v types.BlockHeader - if err := v.UnmarshalCBOR(br); err != nil { - return err - } - - t.Blocks[i] = &v - } - - // t.Messages (exchange.CompactedMessages) (struct) - - { - - b, err := br.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := br.UnreadByte(); err != nil { - return err - } - t.Messages = new(CompactedMessages) - if err := t.Messages.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.Messages pointer: %w", err) - } - } - - } - return nil -} diff --git a/venus-component/libp2p/exchange/client.go b/venus-component/libp2p/exchange/client.go index afa98ede45..a6c1fca364 100644 --- a/venus-component/libp2p/exchange/client.go +++ b/venus-component/libp2p/exchange/client.go @@ -4,26 +4,25 @@ import ( "bufio" "bytes" "context" + "errors" "fmt" "io/ioutil" "math/rand" "time" cborutil "github.com/filecoin-project/go-cbor-util" - "github.com/filecoin-project/venus/pkg/types" logging "github.com/ipfs/go-log" - "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" - "go.opencensus.io/trace" - "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/net" + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/libp2p" + "github.com/filecoin-project/venus/venus-shared/libp2p/exchange" ) -var exchangeClientLogger = logging.Logger("exchange.client") +var clientLog = logging.Logger("exchange.client") // client implements exchange.Client, using the libp2p ChainExchange protocol // as the fetching mechanism. @@ -37,11 +36,11 @@ type client struct { peerTracker *bsPeerTracker } -var _ Client = (*client)(nil) +var _ exchange.Client = (*client)(nil) // NewClient creates a new libp2p-based exchange.Client that uses the libp2p // ChainExhange protocol as the fetching mechanism. -func NewClient(host host.Host, pmgr net.IPeerMgr) Client { +func NewClient(host host.Host, pmgr libp2p.PeerManager) exchange.Client { return &client{ host: host, peerTracker: newPeerTracker(host, pmgr), @@ -67,25 +66,25 @@ func NewClient(host host.Host, pmgr net.IPeerMgr) Client { // adhere to a single API derived from this function. func (c *client) doRequest( ctx context.Context, - req *Request, + req *exchange.Request, singlePeer []peer.ID, // In the `GetChainMessages` case, we won't request the headers but we still // need them to check the integrity of the `CompactedMessages` in the response // so the tipset blocks need to be provided by the caller. - tipsets []*types.TipSet, + tipsets []*chain.TipSet, ) (*validatedResponse, error) { // Validate request. if req.Length == 0 { - return nil, xerrors.Errorf("invalid request of length 0") + return nil, fmt.Errorf("invalid request of length 0") } - if req.Length > MaxRequestLength { - return nil, xerrors.Errorf("request length (%d) above maximum (%d)", - req.Length, MaxRequestLength) + if req.Length > exchange.MaxRequestLength { + return nil, fmt.Errorf("request length (%d) above maximum (%d)", + req.Length, exchange.MaxRequestLength) } if req.Options == 0 { - return nil, xerrors.Errorf("request with no options set") + return nil, fmt.Errorf("request with no options set") } // Generate the list of peers to be queried, either the @@ -98,7 +97,7 @@ func (c *client) doRequest( selectPeers = c.getShuffledPeers() } if len(selectPeers) == 0 { - return nil, xerrors.Errorf("no peers available") + return nil, fmt.Errorf("no peers available") } // Try the request for each peer in the list, @@ -111,15 +110,15 @@ func (c *client) doRequest( for _, peer := range selectPeers { select { case <-ctx.Done(): - return nil, xerrors.Errorf("context cancelled: %w", ctx.Err()) + return nil, fmt.Errorf("context cancelled: %w", ctx.Err()) default: } // Send request, read response. res, err := c.sendRequestToPeer(ctx, peer, req) if err != nil { - if !xerrors.Is(err, network.ErrNoConn) { - exchangeClientLogger.Warnf("could not send request to peer %s: %s", + if !errors.Is(err, network.ErrNoConn) { + clientLog.Warnf("could not send request to peer %s: %s", peer.String(), err) } continue @@ -128,7 +127,7 @@ func (c *client) doRequest( // Process and validate response. validRes, err := c.processResponse(req, res, tipsets) if err != nil { - exchangeClientLogger.Warnf("processing peer %s response failed: %s", peer.String(), err) + clientLog.Warnf("processing peer %s response failed: %s", peer.String(), err) continue } @@ -137,7 +136,7 @@ func (c *client) doRequest( return validRes, nil } - return nil, xerrors.Errorf("doRequest failed for all peers") + return nil, fmt.Errorf("doRequest failed for all peers") } // Process and validate response. Check the status, the integrity of the @@ -149,57 +148,59 @@ func (c *client) doRequest( // errors. Peer penalization should happen here then, before returning, so // we can apply the correct penalties depending on the cause of the error. // FIXME: Add the `peer` as argument once we implement penalties. -func (c *client) processResponse(req *Request, res *Response, tipsets []*types.TipSet) (*validatedResponse, error) { - err := res.statusToError() +func (c *client) processResponse(req *exchange.Request, res *exchange.Response, tipsets []*chain.TipSet) (*validatedResponse, error) { + err := res.StatusToError() if err != nil { - return nil, xerrors.Errorf("status error: %s", err) + return nil, fmt.Errorf("status error: %w", err) } options := parseOptions(req.Options) if options.noOptionsSet() { // Safety check: this shouldn't have been sent, and even if it did // it should have been caught by the peer in its error status. - return nil, xerrors.Errorf("nothing was requested") + return nil, fmt.Errorf("nothing was requested") } // Verify that the chain segment returned is in the valid range. // Note that the returned length might be less than requested. resLength := len(res.Chain) if resLength == 0 { - return nil, xerrors.Errorf("got no chain in successful response") + return nil, fmt.Errorf("got no chain in successful response") } + if resLength > int(req.Length) { - return nil, xerrors.Errorf("got longer response (%d) than requested (%d)", + return nil, fmt.Errorf("got longer response (%d) than requested (%d)", resLength, req.Length) } - if resLength < int(req.Length) && res.Status != Partial { - return nil, xerrors.Errorf("got less than requested without a proper status: %d", res.Status) + + if resLength < int(req.Length) && res.Status != exchange.Partial { + return nil, fmt.Errorf("got less than requested without a proper status: %d", res.Status) } validRes := &validatedResponse{} if options.IncludeHeaders { // Check for valid block sets and extract them into `TipSet`s. - validRes.tipsets = make([]*types.TipSet, resLength) + validRes.tipsets = make([]*chain.TipSet, resLength) for i := 0; i < resLength; i++ { if res.Chain[i] == nil { - return nil, xerrors.Errorf("response with nil tipset in pos %d", i) + return nil, fmt.Errorf("response with nil tipset in pos %d", i) } for blockIdx, block := range res.Chain[i].Blocks { if block == nil { - return nil, xerrors.Errorf("tipset with nil block in pos %d", blockIdx) + return nil, fmt.Errorf("tipset with nil block in pos %d", blockIdx) // FIXME: Maybe we should move this check to `NewTipSet`. } } - validRes.tipsets[i], err = types.NewTipSet(res.Chain[i].Blocks...) + validRes.tipsets[i], err = chain.NewTipSet(res.Chain[i].Blocks) if err != nil { - return nil, xerrors.Errorf("invalid tipset blocks at height (head - %d): %w", i, err) + return nil, fmt.Errorf("invalid tipset blocks at height (head - %d): %w", i, err) } } // Check that the returned head matches the one requested - if !types.CidArrsEqual(validRes.tipsets[0].Key().Cids(), req.Head) { - return nil, xerrors.Errorf("returned chain head does not match request") + if !chain.CidArrsEqual(validRes.tipsets[0].Key().Cids(), req.Head) { + return nil, fmt.Errorf("returned chain head does not match request") } // Check `TipSet`s are connected (valid chain). @@ -213,10 +214,10 @@ func (c *client) processResponse(req *Request, res *Response, tipsets []*types.T } if options.IncludeMessages { - validRes.messages = make([]*CompactedMessages, resLength) + validRes.messages = make([]*exchange.CompactedMessages, resLength) for i := 0; i < resLength; i++ { if res.Chain[i].Messages == nil { - return nil, xerrors.Errorf("no messages included for tipset at height (head - %d)", i) + return nil, fmt.Errorf("no messages included for tipset at height (head - %d)", i) } validRes.messages[i] = res.Chain[i].Messages } @@ -233,11 +234,11 @@ func (c *client) processResponse(req *Request, res *Response, tipsets []*types.T // If we didn't request the headers they should have been provided // by the caller. if len(tipsets) < len(res.Chain) { - return nil, xerrors.Errorf("not enought tipsets provided for message response validation, needed %d, have %d", len(res.Chain), len(tipsets)) + return nil, fmt.Errorf("not enought tipsets provided for message response validation, needed %d, have %d", len(res.Chain), len(tipsets)) } - chain := make([]*BSTipSet, 0, resLength) + chain := make([]*exchange.BSTipSet, 0, resLength) for i, resChain := range res.Chain { - next := &BSTipSet{ + next := &exchange.BSTipSet{ Blocks: tipsets[i].Blocks(), Messages: resChain.Messages, } @@ -254,33 +255,33 @@ func (c *client) processResponse(req *Request, res *Response, tipsets []*types.T return validRes, nil } -func (c *client) validateCompressedIndices(chain []*BSTipSet) error { +func (c *client) validateCompressedIndices(chain []*exchange.BSTipSet) error { resLength := len(chain) for tipsetIdx := 0; tipsetIdx < resLength; tipsetIdx++ { msgs := chain[tipsetIdx].Messages blocksNum := len(chain[tipsetIdx].Blocks) if len(msgs.BlsIncludes) != blocksNum { - return xerrors.Errorf("BlsIncludes (%d) does not match number of blocks (%d)", + return fmt.Errorf("BlsIncludes (%d) does not match number of blocks (%d)", len(msgs.BlsIncludes), blocksNum) } if len(msgs.SecpkIncludes) != blocksNum { - return xerrors.Errorf("SecpkIncludes (%d) does not match number of blocks (%d)", + return fmt.Errorf("SecpkIncludes (%d) does not match number of blocks (%d)", len(msgs.SecpkIncludes), blocksNum) } for blockIdx := 0; blockIdx < blocksNum; blockIdx++ { for _, mi := range msgs.BlsIncludes[blockIdx] { if int(mi) >= len(msgs.Bls) { - return xerrors.Errorf("index in BlsIncludes (%d) exceeds number of messages (%d)", + return fmt.Errorf("index in BlsIncludes (%d) exceeds number of messages (%d)", mi, len(msgs.Bls)) } } for _, mi := range msgs.SecpkIncludes[blockIdx] { if int(mi) >= len(msgs.Secpk) { - return xerrors.Errorf("index in SecpkIncludes (%d) exceeds number of messages (%d)", + return fmt.Errorf("index in SecpkIncludes (%d) exceeds number of messages (%d)", mi, len(msgs.Secpk)) } } @@ -291,7 +292,7 @@ func (c *client) validateCompressedIndices(chain []*BSTipSet) error { } // GetBlocks implements Client.GetBlocks(). Refer to the godocs there. -func (c *client) GetBlocks(ctx context.Context, tsk types.TipSetKey, count int) ([]*types.TipSet, error) { +func (c *client) GetBlocks(ctx context.Context, tsk chain.TipSetKey, count int) ([]*chain.TipSet, error) { ctx, span := trace.StartSpan(ctx, "bsync.GetBlocks") defer span.End() if span.IsRecordingEvents() { @@ -301,10 +302,10 @@ func (c *client) GetBlocks(ctx context.Context, tsk types.TipSetKey, count int) ) } - req := &Request{ + req := &exchange.Request{ Head: tsk.Cids(), Length: uint64(count), - Options: Headers, + Options: exchange.Headers, } validRes, err := c.doRequest(ctx, req, nil, nil) @@ -316,13 +317,13 @@ func (c *client) GetBlocks(ctx context.Context, tsk types.TipSetKey, count int) } // GetFullTipSet implements Client.GetFullTipSet(). Refer to the godocs there. -func (c *client) GetFullTipSet(ctx context.Context, peers []peer.ID, tsk types.TipSetKey) (*types.FullTipSet, error) { +func (c *client) GetFullTipSet(ctx context.Context, peers []peer.ID, tsk chain.TipSetKey) (*chain.FullTipSet, error) { // TODO: round robin through these peers on error - req := &Request{ + req := &exchange.Request{ Head: tsk.Cids(), Length: 1, - Options: Headers | Messages, + Options: exchange.Headers | exchange.Messages, } validRes, err := c.doRequest(ctx, req, peers, nil) @@ -336,7 +337,7 @@ func (c *client) GetFullTipSet(ctx context.Context, peers []peer.ID, tsk types.T } // GetChainMessages implements Client.GetChainMessages(). Refer to the godocs there. -func (c *client) GetChainMessages(ctx context.Context, tipsets []*types.TipSet) ([]*CompactedMessages, error) { +func (c *client) GetChainMessages(ctx context.Context, tipsets []*chain.TipSet) ([]*exchange.CompactedMessages, error) { head := tipsets[0] length := uint64(len(tipsets)) @@ -349,10 +350,10 @@ func (c *client) GetChainMessages(ctx context.Context, tipsets []*types.TipSet) } defer span.End() - req := &Request{ + req := &exchange.Request{ Head: head.Key().Cids(), Length: length, - Options: Messages, + Options: exchange.Messages, } validRes, err := c.doRequest(ctx, req, nil, tipsets) @@ -366,7 +367,7 @@ func (c *client) GetChainMessages(ctx context.Context, tipsets []*types.TipSet) // Send a request to a peer. Write request in the stream and read the // response back. We do not do any processing of the request/response // here. -func (c *client) sendRequestToPeer(ctx context.Context, peer peer.ID, req *Request) (_ *Response, err error) { +func (c *client) sendRequestToPeer(ctx context.Context, peer peer.ID, req *exchange.Request) (_ *exchange.Response, err error) { // Trace code. ctx, span := trace.StartSpan(ctx, "sendRequestToPeer") defer span.End() @@ -387,15 +388,16 @@ func (c *client) sendRequestToPeer(ctx context.Context, peer peer.ID, req *Reque }() // -- TRACE -- - supported, err := c.host.Peerstore().SupportsProtocols(peer, BlockSyncProtocolID, ChainExchangeProtocolID) + supported, err := c.host.Peerstore().SupportsProtocols(peer, exchange.BlockSyncProtocolID, exchange.ChainExchangeProtocolID) if err != nil { - c.RemovePeer(peer) - return nil, xerrors.Errorf("failed to get protocols for peer: %w", err) + c.RemovePeer(ctx, peer) + return nil, fmt.Errorf("failed to get protocols for peer: %w", err) } - if len(supported) == 0 || (supported[0] != BlockSyncProtocolID && supported[0] != ChainExchangeProtocolID) { - c.RemovePeer(peer) + + if len(supported) == 0 || (supported[0] != exchange.BlockSyncProtocolID && supported[0] != exchange.ChainExchangeProtocolID) { + c.RemovePeer(ctx, peer) c.host.ConnManager().TagPeer(peer, "no match protocol", -2000) - return nil, xerrors.Errorf("peer %s does not support protocols %s", peer, []string{BlockSyncProtocolID, ChainExchangeProtocolID}) + return nil, fmt.Errorf("peer %s does not support protocols %s", peer, []string{exchange.BlockSyncProtocolID, exchange.ChainExchangeProtocolID}) } connectionStart := time.Now() @@ -404,10 +406,10 @@ func (c *client) sendRequestToPeer(ctx context.Context, peer peer.ID, req *Reque stream, err := c.host.NewStream( network.WithNoDial(ctx, "should already have connection"), peer, - ChainExchangeProtocolID, BlockSyncProtocolID) + exchange.ChainExchangeProtocolID, exchange.BlockSyncProtocolID) if err != nil { - c.RemovePeer(peer) - return nil, xerrors.Errorf("failed to open stream to peer: %w", err) + c.RemovePeer(ctx, peer) + return nil, fmt.Errorf("failed to open stream to peer: %w", err) } defer func() { @@ -437,14 +439,14 @@ func (c *client) sendRequestToPeer(ctx context.Context, peer peer.ID, req *Reque return nil, err } - var res Response + var res exchange.Response err = cborutil.ReadCborRPC( bytes.NewReader(respBytes), //bufio.NewReader(NewInct(stream, ReadResMinSpeed, ReadResDeadline)), &res) if err != nil { c.peerTracker.logFailure(peer, time.Since(connectionStart), req.Length) - return nil, xerrors.Errorf("failed to read chainxchg response: %w", err) + return nil, fmt.Errorf("failed to read chainxchg response: %w", err) } // FIXME: Move all this together at the top using a defer as done elsewhere. @@ -464,12 +466,12 @@ func (c *client) sendRequestToPeer(ctx context.Context, peer peer.ID, req *Reque } // AddPeer implements Client.AddPeer(). Refer to the godocs there. -func (c *client) AddPeer(p peer.ID) { +func (c *client) AddPeer(ctx context.Context, p peer.ID) { c.peerTracker.addPeer(p) } // RemovePeer implements Client.RemovePeer(). Refer to the godocs there. -func (c *client) RemovePeer(p peer.ID) { +func (c *client) RemovePeer(ctx context.Context, p peer.ID) { c.peerTracker.removePeer(p) } diff --git a/venus-component/libp2p/exchange/interfaces.go b/venus-component/libp2p/exchange/interfaces.go deleted file mode 100644 index 5fb8dec405..0000000000 --- a/venus-component/libp2p/exchange/interfaces.go +++ /dev/null @@ -1,41 +0,0 @@ -package exchange - -import ( - "context" - "github.com/filecoin-project/venus/pkg/types" - - "github.com/libp2p/go-libp2p-core/peer" -) - -// Server is the responder side of the ChainExchange protocol. It accepts -// requests from clients and services them by returning the requested -// chain data. -type Server interface { - Register() -} - -// Client is the requesting side of the ChainExchange protocol. It acts as -// a proxy for other components to request chain data from peers. It is chiefly -// used by the Syncer. -type Client interface { - // GetBlocks fetches block headers from the network, from the provided - // tipset *backwards*, returning as many tipsets as the count parameter, - // or less. - GetBlocks(ctx context.Context, tsk types.TipSetKey, count int) ([]*types.TipSet, error) - - // GetChainMessages fetches messages from the network, starting from the first provided tipset - // and returning messages from as many tipsets as requested or less. - GetChainMessages(ctx context.Context, tipsets []*types.TipSet) ([]*CompactedMessages, error) - - // GetFullTipSet fetches a full tipset from a given peer. If successful, - // the fetched object contains block headers and all messages in full form. - GetFullTipSet(ctx context.Context, peer []peer.ID, tsk types.TipSetKey) (*types.FullTipSet, error) - - // AddPeer adds a peer to the pool of peers that the Client requests - // data from. - AddPeer(peer peer.ID) - - // RemovePeer removes a peer from the pool of peers that the Client - // requests data from. - RemovePeer(peer peer.ID) -} diff --git a/venus-component/libp2p/exchange/peer_tracker.go b/venus-component/libp2p/exchange/peer_tracker.go index 2d14e022cc..0d6df7d38e 100644 --- a/venus-component/libp2p/exchange/peer_tracker.go +++ b/venus-component/libp2p/exchange/peer_tracker.go @@ -10,7 +10,7 @@ import ( host "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-core/peer" - "github.com/filecoin-project/venus/pkg/net" + "github.com/filecoin-project/venus/venus-shared/libp2p" ) type peerStats struct { @@ -26,23 +26,23 @@ type bsPeerTracker struct { peers map[peer.ID]*peerStats avgGlobalTime time.Duration - pmgr net.IPeerMgr + pmgr libp2p.PeerManager } -func newPeerTracker(h host.Host, pmgr net.IPeerMgr) *bsPeerTracker { +func newPeerTracker(h host.Host, pmgr libp2p.PeerManager) *bsPeerTracker { bsPt := &bsPeerTracker{ peers: make(map[peer.ID]*peerStats), pmgr: pmgr, } - sub, err := h.EventBus().Subscribe(new(net.NewFilPeer)) + sub, err := h.EventBus().Subscribe(new(libp2p.NewFilPeer)) if err != nil { panic(err) } go func() { for newPeer := range sub.Out() { - bsPt.addPeer(newPeer.(net.NewFilPeer).Id) + bsPt.addPeer(newPeer.(libp2p.NewFilPeer).Id) } }() return bsPt diff --git a/venus-component/libp2p/exchange/protocol.go b/venus-component/libp2p/exchange/protocol.go index 46dbfd432f..f39d19076f 100644 --- a/venus-component/libp2p/exchange/protocol.go +++ b/venus-component/libp2p/exchange/protocol.go @@ -3,33 +3,13 @@ package exchange import ( "time" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/policy" logging "github.com/ipfs/go-log" - "golang.org/x/xerrors" -) - -var log = logging.Logger("exchange") -const ( - // BlockSyncProtocolID is the protocol ID of the former blocksync protocol. - // Deprecated. - BlockSyncProtocolID = "/fil/sync/blk/0.0.1" - - // ChainExchangeProtocolID is the protocol ID of the chain exchange - // protocol. - ChainExchangeProtocolID = "/fil/chain/xchg/0.0.1" + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/libp2p/exchange" ) -// FIXME: Bumped from original 800 to this to accommodate `syncFork()` -// use of `GetBlocks()`. It seems the expectation of that API is to -// fetch any amount of blocks leaving it to the internal logic here -// to partition and reassemble the requests if they go above the maximum. -// (Also as a consequence of this temporarily removing the `const` -// qualifier to avoid "const initializer [...] is not a constant" error.) -var MaxRequestLength = uint64(policy.ChainFinality) +var log = logging.Logger("exchange") const ( // Extracted constants from the code. @@ -42,35 +22,13 @@ const ( WriteResDeadline = 60 * time.Second ) -// FIXME: Rename. Make private. -type Request struct { - // List of ordered CIDs comprising a `TipSetKey` from where to start - // fetching backwards. - // FIXME: Consider using `TipSetKey` now (introduced after the creation - // of this protocol) instead of converting back and forth. - Head []cid.Cid - // Number of block sets to fetch from `Head` (inclusive, should always - // be in the range `[1, MaxRequestLength]`). - Length uint64 - // Request options, see `Options` type for more details. Compressed - // in a single `uint64` to save space. - Options uint64 -} - // `Request` processed and validated to query the tipsets needed. type validatedRequest struct { - head types.TipSetKey + head chain.TipSetKey length uint64 options *parsedOptions } -// Request options. When fetching the chain segment we can fetch -// either block headers, messages, or both. -const ( - Headers = 1 << iota - Messages -) - // Decompressed options into separate struct members for easy access // during internal processing.. type parsedOptions struct { @@ -84,96 +42,23 @@ func (options *parsedOptions) noOptionsSet() bool { func parseOptions(optfield uint64) *parsedOptions { return &parsedOptions{ - IncludeHeaders: optfield&(uint64(Headers)) != 0, - IncludeMessages: optfield&(uint64(Messages)) != 0, + IncludeHeaders: optfield&(uint64(exchange.Headers)) != 0, + IncludeMessages: optfield&(uint64(exchange.Messages)) != 0, } } -// FIXME: Rename. Make private. -type Response struct { - Status status - // String that complements the error status when converting to an - // internal error (see `statusToError()`). - ErrorMessage string - - Chain []*BSTipSet -} - -type status uint64 - -const ( - Ok status = 0 - // We could not fetch all blocks requested (but at least we returned - // the `Head` requested). Not considered an error. - Partial = 101 - - // Errors - NotFound = 201 - GoAway = 202 - InternalError = 203 - BadRequest = 204 -) - -// Convert status to internal error. -func (res *Response) statusToError() error { - switch res.Status { - case Ok, Partial: - return nil - // FIXME: Consider if we want to not process `Partial` responses - // and return an error instead. - case NotFound: - return xerrors.Errorf("not found") - case GoAway: - return xerrors.Errorf("not handling 'go away' chainxchg responses yet") - case InternalError: - return xerrors.Errorf("block sync peer errored: %s", res.ErrorMessage) - case BadRequest: - return xerrors.Errorf("block sync request invalid: %s", res.ErrorMessage) - default: - return xerrors.Errorf("unrecognized response code: %d", res.Status) - } -} - -// FIXME: Rename. -type BSTipSet struct { - // List of blocks belonging to a single tipset to which the - // `CompactedMessages` are linked. - Blocks []*types.BlockHeader - Messages *CompactedMessages -} - -// All messages of a single tipset compacted together instead -// of grouped by block to save space, since there are normally -// many repeated messages per tipset in different blocks. -// -// `BlsIncludes`/`SecpkIncludes` matches `Bls`/`Secpk` messages -// to blocks in the tipsets with the format: -// `BlsIncludes[BI][MI]` -// * BI: block index in the tipset. -// * MI: message index in `Bls` list -// -// FIXME: The logic to decompress this structure should belong -// to itself, not to the consumer. -type CompactedMessages struct { - Bls []*types.UnsignedMessage - BlsIncludes [][]uint64 - - Secpk []*types.SignedMessage - SecpkIncludes [][]uint64 -} - // Response that has been validated according to the protocol // and can be safely accessed. type validatedResponse struct { - tipsets []*types.TipSet + tipsets []*chain.TipSet // List of all messages per tipset (grouped by tipset, // not by block, hence a single index like `tipsets`). - messages []*CompactedMessages + messages []*exchange.CompactedMessages } // Decompress messages and form full tipsets with them. The headers // need to have been requested as well. -func (res *validatedResponse) toFullTipSets() []*types.FullTipSet { +func (res *validatedResponse) toFullTipSets() []*chain.FullTipSet { if len(res.tipsets) == 0 || len(res.tipsets) != len(res.messages) { // This decompression can only be done if both headers and // messages are returned in the response. (The second check @@ -181,13 +66,18 @@ func (res *validatedResponse) toFullTipSets() []*types.FullTipSet { // added here just for completeness.) return nil } - ftsList := make([]*types.FullTipSet, len(res.tipsets)) + + ftsList := make([]*chain.FullTipSet, len(res.tipsets)) for tipsetIdx := range res.tipsets { - fts := &types.FullTipSet{} // FIXME: We should use the `NewFullTipSet` API. + blksInTipset := res.tipsets[tipsetIdx].Blocks() msgs := res.messages[tipsetIdx] + + fblks := make([]*chain.FullBlock, 0, len(blksInTipset)) for blockIdx, b := range res.tipsets[tipsetIdx].Blocks() { - fb := &types.FullBlock{ - Header: b, + fb := &chain.FullBlock{ + Header: b, + BLSMessages: make([]*chain.Message, 0, len(msgs.Bls)), + SECPMessages: make([]*chain.SignedMessage, 0, len(msgs.Secpk)), } for _, mi := range msgs.BlsIncludes[blockIdx] { @@ -197,9 +87,11 @@ func (res *validatedResponse) toFullTipSets() []*types.FullTipSet { fb.SECPMessages = append(fb.SECPMessages, msgs.Secpk[mi]) } - fts.Blocks = append(fts.Blocks, fb) + fblks = append(fblks, fb) } - ftsList[tipsetIdx] = fts + + ftsList[tipsetIdx] = chain.NewFullTipSet(fblks) } + return ftsList } diff --git a/venus-component/libp2p/exchange/server.go b/venus-component/libp2p/exchange/server.go index 1a83a7778d..a3e8833249 100644 --- a/venus-component/libp2p/exchange/server.go +++ b/venus-component/libp2p/exchange/server.go @@ -4,60 +4,45 @@ import ( "bufio" "context" "fmt" - cborutil "github.com/filecoin-project/go-cbor-util" - logging "github.com/ipfs/go-log" "time" - "go.opencensus.io/trace" - "golang.org/x/xerrors" - + cborutil "github.com/filecoin-project/go-cbor-util" "github.com/ipfs/go-cid" + logging "github.com/ipfs/go-log" "github.com/libp2p/go-libp2p-core/host" inet "github.com/libp2p/go-libp2p-core/network" + "go.opencensus.io/trace" - "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/libp2p/exchange" + "github.com/filecoin-project/venus/venus-shared/localstore" ) -var exchangeServerLog = logging.Logger("exchange.server") +var exchangeServerLog = logging.Logger("exchange.Server") -type chainReader interface { - GetTipSet(types.TipSetKey) (*types.TipSet, error) -} - -type messageStore interface { - ReadMsgMetaCids(ctx context.Context, mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) - - LoadUnsignedMessagesFromCids(cids []cid.Cid) ([]*types.UnsignedMessage, error) - LoadSignedMessagesFromCids(cids []cid.Cid) ([]*types.SignedMessage, error) -} - -// server implements exchange.Server. It services requests for the +// Server implements exchange.Server. It services requests for the // libp2p ChainExchange protocol. -type server struct { - cr chainReader - mr messageStore - h host.Host +type Server struct { + loader localstore.ChainLoader + h host.Host } -var _ Server = (*server)(nil) - // NewServer creates a new libp2p-based exchange.Server. It services requests // for the libp2p ChainExchange protocol. -func NewServer(cr chainReader, mr messageStore, h host.Host) Server { - return &server{ - cr: cr, - mr: mr, - h: h, +func NewServer(loader localstore.ChainLoader, h host.Host) *Server { + return &Server{ + loader: loader, + h: h, } } -func (s *server) Register() { - s.h.SetStreamHandler(BlockSyncProtocolID, s.handleStream) // old - s.h.SetStreamHandler(ChainExchangeProtocolID, s.handleStream) // new +func (s *Server) Register() { + s.h.SetStreamHandler(exchange.BlockSyncProtocolID, s.handleStream) // old + s.h.SetStreamHandler(exchange.ChainExchangeProtocolID, s.handleStream) // new } // HandleStream implements Server.HandleStream. Refer to the godocs there. -func (s *server) handleStream(stream inet.Stream) { +func (s *Server) handleStream(stream inet.Stream) { ctx, span := trace.StartSpan(context.Background(), "chainxchg.HandleStream") defer span.End() @@ -65,7 +50,7 @@ func (s *server) handleStream(stream inet.Stream) { // go-libp2p-core 0.7.0 defer stream.Close() //nolint:errcheck - var req Request + var req exchange.Request if err := cborutil.ReadCborRPC(bufio.NewReader(stream), &req); err != nil { exchangeServerLog.Warnf("failed to read block sync request: %s", err) return @@ -91,7 +76,7 @@ func (s *server) handleStream(stream inet.Stream) { // Validate and service the request. We return either a protocol // response or an internal error. -func (s *server) processRequest(ctx context.Context, req *Request) (*Response, error) { +func (s *Server) processRequest(ctx context.Context, req *exchange.Request) (*exchange.Response, error) { validReq, errResponse := validateRequest(ctx, req) if errResponse != nil { // The request did not pass validation, return the response @@ -105,7 +90,7 @@ func (s *server) processRequest(ctx context.Context, req *Request) (*Response, e // Validate request. We either return a `validatedRequest`, or an error // `Response` indicating why we can't process it. We do not return any // internal errors here, we just signal protocol ones. -func validateRequest(ctx context.Context, req *Request) (*validatedRequest, *Response) { +func validateRequest(ctx context.Context, req *exchange.Request) (*validatedRequest, *exchange.Response) { _, span := trace.StartSpan(ctx, "chainxchg.ValidateRequest") defer span.End() @@ -113,34 +98,34 @@ func validateRequest(ctx context.Context, req *Request) (*validatedRequest, *Res validReq.options = parseOptions(req.Options) if validReq.options.noOptionsSet() { - return nil, &Response{ - Status: BadRequest, + return nil, &exchange.Response{ + Status: exchange.BadRequest, ErrorMessage: "no options set", } } validReq.length = req.Length - if validReq.length > MaxRequestLength { - return nil, &Response{ - Status: BadRequest, + if validReq.length > exchange.MaxRequestLength { + return nil, &exchange.Response{ + Status: exchange.BadRequest, ErrorMessage: fmt.Sprintf("request length over maximum allowed (%d)", - MaxRequestLength), + exchange.MaxRequestLength), } } if validReq.length == 0 { - return nil, &Response{ - Status: BadRequest, + return nil, &exchange.Response{ + Status: exchange.BadRequest, ErrorMessage: "invalid request length of zero", } } if len(req.Head) == 0 { - return nil, &Response{ - Status: BadRequest, + return nil, &exchange.Response{ + Status: exchange.BadRequest, ErrorMessage: "no cids in request", } } - validReq.head = types.NewTipSetKey(req.Head...) + validReq.head = chain.NewTipSetKey(req.Head...) // FIXME: Add as a defer at the start. span.AddAttributes( @@ -152,39 +137,39 @@ func validateRequest(ctx context.Context, req *Request) (*validatedRequest, *Res return &validReq, nil } -func (s *server) serviceRequest(ctx context.Context, req *validatedRequest) (*Response, error) { +func (s *Server) serviceRequest(ctx context.Context, req *validatedRequest) (*exchange.Response, error) { _, span := trace.StartSpan(ctx, "chainxchg.ServiceRequest") defer span.End() - chain, err := collectChainSegment(s.cr, s.mr, req) + chain, err := collectChainSegment(ctx, s.loader, req) if err != nil { exchangeServerLog.Warn("block sync request: collectChainSegment failed: ", err) - return &Response{ - Status: InternalError, + return &exchange.Response{ + Status: exchange.InternalError, ErrorMessage: err.Error(), }, nil } - status := Ok + status := exchange.Ok if len(chain) < int(req.length) { - status = Partial + status = exchange.Partial } - return &Response{ + return &exchange.Response{ Chain: chain, Status: status, }, nil } -func collectChainSegment(cr chainReader, mr messageStore, req *validatedRequest) ([]*BSTipSet, error) { - var bstips []*BSTipSet +func collectChainSegment(ctx context.Context, loader localstore.ChainLoader, req *validatedRequest) ([]*exchange.BSTipSet, error) { + var bstips []*exchange.BSTipSet cur := req.head for { - var bst BSTipSet - ts, err := cr.GetTipSet(cur) + var bst exchange.BSTipSet + ts, err := loader.GetTipSet(ctx, cur) if err != nil { - return nil, xerrors.Errorf("failed loading tipset %s: %w", cur, err) + return nil, fmt.Errorf("failed loading tipset %s: %w", cur, err) } if req.options.IncludeHeaders { @@ -192,13 +177,13 @@ func collectChainSegment(cr chainReader, mr messageStore, req *validatedRequest) } if req.options.IncludeMessages { - bmsgs, bmincl, smsgs, smincl, err := GatherMessages(cr, mr, ts) + bmsgs, bmincl, smsgs, smincl, err := GatherMessages(ctx, loader, ts) if err != nil { - return nil, xerrors.Errorf("gather messages failed: %w", err) + return nil, fmt.Errorf("gather messages failed: %w", err) } // FIXME: Pass the response to `gatherMessages()` and set all this there. - bst.Messages = &CompactedMessages{} + bst.Messages = &exchange.CompactedMessages{} bst.Messages.Bls = bmsgs bst.Messages.BlsIncludes = bmincl bst.Messages.Secpk = smsgs @@ -217,14 +202,14 @@ func collectChainSegment(cr chainReader, mr messageStore, req *validatedRequest) } } -func GatherMessages(cr chainReader, mr messageStore, ts *types.TipSet) ([]*types.UnsignedMessage, [][]uint64, []*types.SignedMessage, [][]uint64, error) { +func GatherMessages(ctx context.Context, loader localstore.ChainLoader, ts *chain.TipSet) ([]*chain.Message, [][]uint64, []*chain.SignedMessage, [][]uint64, error) { blsmsgmap := make(map[cid.Cid]uint64) secpkmsgmap := make(map[cid.Cid]uint64) var secpkincl, blsincl [][]uint64 var blscids, secpkcids []cid.Cid for _, block := range ts.Blocks() { - bc, sc, err := mr.ReadMsgMetaCids(context.TODO(), block.Messages) + bc, sc, err := loader.ReadMsgMetaCids(ctx, block.Messages) if err != nil { return nil, nil, nil, nil, err } @@ -257,12 +242,12 @@ func GatherMessages(cr chainReader, mr messageStore, ts *types.TipSet) ([]*types secpkincl = append(secpkincl, smi) } - blsmsgs, err := mr.LoadUnsignedMessagesFromCids(blscids) + blsmsgs, err := loader.LoadMessagesFromCids(ctx, blscids) if err != nil { return nil, nil, nil, nil, err } - secpkmsgs, err := mr.LoadSignedMessagesFromCids(secpkcids) + secpkmsgs, err := loader.LoadSignedMessagesFromCids(ctx, secpkcids) if err != nil { return nil, nil, nil, nil, err } From fe56f5d8800ee6fdfd4b343c0f47d1a9fe27e227 Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 23 Nov 2021 10:28:45 +0800 Subject: [PATCH 036/167] feat: add type Options for exchange protocol --- venus-shared/libp2p/exchange/exchange.go | 28 ++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/venus-shared/libp2p/exchange/exchange.go b/venus-shared/libp2p/exchange/exchange.go index 59e8fe1865..cd42eb162c 100644 --- a/venus-shared/libp2p/exchange/exchange.go +++ b/venus-shared/libp2p/exchange/exchange.go @@ -49,6 +49,34 @@ const ( Messages ) +type Options struct { + IncludeHeaders bool + IncludeMessages bool +} + +func (opt *Options) IsEmpty() bool { + return !opt.IncludeHeaders && !opt.IncludeMessages +} + +func (opt *Options) ToBits() uint64 { + var bits uint64 + if opt.IncludeHeaders { + bits |= Headers + } + + if opt.IncludeMessages { + bits |= Messages + } + return bits +} + +func ParseOptions(optfield uint64) *Options { + return &Options{ + IncludeHeaders: optfield&(uint64(Headers)) != 0, + IncludeMessages: optfield&(uint64(Messages)) != 0, + } +} + // FIXME: Rename. Make private. type Response struct { Status status From c3736aaafa815af94b55cfe3b3edb65f5d71a02d Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 23 Nov 2021 11:44:35 +0800 Subject: [PATCH 037/167] feat: logger with context --- venus-shared/go.mod | 2 ++ venus-shared/logging/logger.go | 35 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 venus-shared/logging/logger.go diff --git a/venus-shared/go.mod b/venus-shared/go.mod index 5b6f4abf8d..e4f5e05e54 100644 --- a/venus-shared/go.mod +++ b/venus-shared/go.mod @@ -17,10 +17,12 @@ require ( github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-ipld-cbor v0.0.5 github.com/ipfs/go-ipld-format v0.0.2 + github.com/ipfs/go-log v1.0.4 // indirect github.com/libp2p/go-libp2p-core v0.11.0 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/smartystreets/assertions v1.0.1 // indirect github.com/stretchr/testify v1.7.0 github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 + go.uber.org/zap v1.14.1 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 ) diff --git a/venus-shared/logging/logger.go b/venus-shared/logging/logger.go new file mode 100644 index 0000000000..fb2ebb642c --- /dev/null +++ b/venus-shared/logging/logger.go @@ -0,0 +1,35 @@ +package logging + +import ( + "context" + + logging "github.com/ipfs/go-log" + "go.uber.org/zap" +) + +type contextKey string + +var ctxKey contextKey = "logger" + +type ( + EventLogger = logging.ZapEventLogger + TaggedLogger = zap.SugaredLogger +) + +var New = logging.Logger + +func ContextWithLogger(parent context.Context, l TaggedLogger) context.Context { + return context.WithValue(parent, ctxKey, l) +} + +func LoggerFromContext(ctx context.Context, fallback *EventLogger) TaggedLogger { + val := ctx.Value(ctxKey) + if val != nil { + l, ok := val.(TaggedLogger) + if ok { + return l + } + } + + return fallback.SugaredLogger +} From e1f8a89bb7d322dd35826a67364debc4d5b7450a Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 23 Nov 2021 12:12:19 +0800 Subject: [PATCH 038/167] use *TaggedLogger --- venus-shared/logging/logger.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/venus-shared/logging/logger.go b/venus-shared/logging/logger.go index fb2ebb642c..38fccea19c 100644 --- a/venus-shared/logging/logger.go +++ b/venus-shared/logging/logger.go @@ -18,18 +18,18 @@ type ( var New = logging.Logger -func ContextWithLogger(parent context.Context, l TaggedLogger) context.Context { +func ContextWithLogger(parent context.Context, l *TaggedLogger) context.Context { return context.WithValue(parent, ctxKey, l) } -func LoggerFromContext(ctx context.Context, fallback *EventLogger) TaggedLogger { +func LoggerFromContext(ctx context.Context, fallback *EventLogger) *TaggedLogger { val := ctx.Value(ctxKey) if val != nil { - l, ok := val.(TaggedLogger) - if ok { + l, ok := val.(*TaggedLogger) + if ok && l != nil { return l } } - return fallback.SugaredLogger + return &fallback.SugaredLogger } From aaf8a13e46257d3af491800d488e5205400d416f Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 23 Nov 2021 14:10:34 +0800 Subject: [PATCH 039/167] add FilPeerEventType --- venus-shared/libp2p/peer_mgr.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/venus-shared/libp2p/peer_mgr.go b/venus-shared/libp2p/peer_mgr.go index 36fc395904..7fd47f589e 100644 --- a/venus-shared/libp2p/peer_mgr.go +++ b/venus-shared/libp2p/peer_mgr.go @@ -7,8 +7,16 @@ import ( "github.com/libp2p/go-libp2p-core/peer" ) -type NewFilPeer struct { - Id peer.ID // nolint: stylecheck +type FilPeerEvtType int + +const ( + AddFilPeerEvt FilPeerEvtType = iota + RemoveFilPeerEvt +) + +type FilPeerEvent struct { + Type FilPeerEvtType + ID peer.ID } type PeerManager interface { From 130498992284d8f478d211e17b5ef0d9dff15825 Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 23 Nov 2021 14:14:40 +0800 Subject: [PATCH 040/167] impl: exchange Server --- venus-component/libp2p/exchange/server.go | 161 +++++++++++----------- 1 file changed, 83 insertions(+), 78 deletions(-) diff --git a/venus-component/libp2p/exchange/server.go b/venus-component/libp2p/exchange/server.go index a3e8833249..b8e6988708 100644 --- a/venus-component/libp2p/exchange/server.go +++ b/venus-component/libp2p/exchange/server.go @@ -8,7 +8,6 @@ import ( cborutil "github.com/filecoin-project/go-cbor-util" "github.com/ipfs/go-cid" - logging "github.com/ipfs/go-log" "github.com/libp2p/go-libp2p-core/host" inet "github.com/libp2p/go-libp2p-core/network" "go.opencensus.io/trace" @@ -16,9 +15,69 @@ import ( "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/venus/venus-shared/libp2p/exchange" "github.com/filecoin-project/venus/venus-shared/localstore" + "github.com/filecoin-project/venus/venus-shared/logging" ) -var exchangeServerLog = logging.Logger("exchange.Server") +var log = logging.New("exchange") + +const ( + WriteResDeadline = 60 * time.Second +) + +// `Request` processed and validated to query the tipsets needed. +type validatedRequest struct { + head chain.TipSetKey + length uint64 + options *exchange.Options +} + +func validateRequest(ctx context.Context, req *exchange.Request) (*validatedRequest, *exchange.Response) { + _, span := trace.StartSpan(ctx, "chainxchg.ValidateRequest") + defer span.End() + + if len(req.Head) == 0 { + return nil, &exchange.Response{ + Status: exchange.BadRequest, + ErrorMessage: "no cids in request", + } + } + + if req.Length == 0 { + return nil, &exchange.Response{ + Status: exchange.BadRequest, + ErrorMessage: "invalid request length of zero", + } + } + + if req.Length > exchange.MaxRequestLength { + return nil, &exchange.Response{ + Status: exchange.BadRequest, + ErrorMessage: fmt.Sprintf("request length over maximum allowed (%d)", + exchange.MaxRequestLength), + } + } + + opts := exchange.ParseOptions(req.Options) + if opts.IsEmpty() { + return nil, &exchange.Response{ + Status: exchange.BadRequest, + ErrorMessage: "no options set", + } + } + + // FIXME: Add as a defer at the start. + span.AddAttributes( + trace.BoolAttribute("blocks", opts.IncludeHeaders), + trace.BoolAttribute("messages", opts.IncludeMessages), + trace.Int64Attribute("reqlen", int64(req.Length)), + ) + + return &validatedRequest{ + head: chain.NewTipSetKey(req.Head...), + length: req.Length, + options: opts, + }, nil +} // Server implements exchange.Server. It services requests for the // libp2p ChainExchange protocol. @@ -36,13 +95,8 @@ func NewServer(loader localstore.ChainLoader, h host.Host) *Server { } } -func (s *Server) Register() { - s.h.SetStreamHandler(exchange.BlockSyncProtocolID, s.handleStream) // old - s.h.SetStreamHandler(exchange.ChainExchangeProtocolID, s.handleStream) // new -} - // HandleStream implements Server.HandleStream. Refer to the godocs there. -func (s *Server) handleStream(stream inet.Stream) { +func (s *Server) HandleStream(stream inet.Stream) { ctx, span := trace.StartSpan(context.Background(), "chainxchg.HandleStream") defer span.End() @@ -50,25 +104,28 @@ func (s *Server) handleStream(stream inet.Stream) { // go-libp2p-core 0.7.0 defer stream.Close() //nolint:errcheck + slog := log.With("peer", stream.Conn().RemotePeer()) + ctx = logging.ContextWithLogger(ctx, slog) + var req exchange.Request if err := cborutil.ReadCborRPC(bufio.NewReader(stream), &req); err != nil { - exchangeServerLog.Warnf("failed to read block sync request: %s", err) + slog.Warnf("failed to read block sync request: %s", err) return } - fmt.Println(stream.Conn().RemotePeer()) - exchangeServerLog.Infow("block sync request", "start", req.Head, "len", req.Length) + + slog.Infow("block sync request", "start", req.Head, "len", req.Length) resp, err := s.processRequest(ctx, &req) if err != nil { - exchangeServerLog.Warn("failed to process request: ", err) + slog.Warnf("failed to process request: %s", err) return } _ = stream.SetDeadline(time.Now().Add(WriteResDeadline)) if err := cborutil.WriteCborRPC(stream, resp); err != nil { _ = stream.SetDeadline(time.Time{}) - exchangeServerLog.Warnw("failed to write back response for handle stream", - "err", err, "peer", stream.Conn().RemotePeer()) + slog.Warnw("failed to write back response for handle stream", + "err", err) return } _ = stream.SetDeadline(time.Time{}) @@ -87,63 +144,13 @@ func (s *Server) processRequest(ctx context.Context, req *exchange.Request) (*ex return s.serviceRequest(ctx, validReq) } -// Validate request. We either return a `validatedRequest`, or an error -// `Response` indicating why we can't process it. We do not return any -// internal errors here, we just signal protocol ones. -func validateRequest(ctx context.Context, req *exchange.Request) (*validatedRequest, *exchange.Response) { - _, span := trace.StartSpan(ctx, "chainxchg.ValidateRequest") - defer span.End() - - validReq := validatedRequest{} - - validReq.options = parseOptions(req.Options) - if validReq.options.noOptionsSet() { - return nil, &exchange.Response{ - Status: exchange.BadRequest, - ErrorMessage: "no options set", - } - } - - validReq.length = req.Length - if validReq.length > exchange.MaxRequestLength { - return nil, &exchange.Response{ - Status: exchange.BadRequest, - ErrorMessage: fmt.Sprintf("request length over maximum allowed (%d)", - exchange.MaxRequestLength), - } - } - if validReq.length == 0 { - return nil, &exchange.Response{ - Status: exchange.BadRequest, - ErrorMessage: "invalid request length of zero", - } - } - - if len(req.Head) == 0 { - return nil, &exchange.Response{ - Status: exchange.BadRequest, - ErrorMessage: "no cids in request", - } - } - validReq.head = chain.NewTipSetKey(req.Head...) - - // FIXME: Add as a defer at the start. - span.AddAttributes( - trace.BoolAttribute("blocks", validReq.options.IncludeHeaders), - trace.BoolAttribute("messages", validReq.options.IncludeMessages), - trace.Int64Attribute("reqlen", int64(validReq.length)), - ) - - return &validReq, nil -} - func (s *Server) serviceRequest(ctx context.Context, req *validatedRequest) (*exchange.Response, error) { _, span := trace.StartSpan(ctx, "chainxchg.ServiceRequest") defer span.End() chain, err := collectChainSegment(ctx, s.loader, req) if err != nil { - exchangeServerLog.Warn("block sync request: collectChainSegment failed: ", err) + logging.LoggerFromContext(ctx, log).Warnf("block sync request: collectChainSegment failed: %s", err) return &exchange.Response{ Status: exchange.InternalError, ErrorMessage: err.Error(), @@ -177,17 +184,10 @@ func collectChainSegment(ctx context.Context, loader localstore.ChainLoader, req } if req.options.IncludeMessages { - bmsgs, bmincl, smsgs, smincl, err := GatherMessages(ctx, loader, ts) + bst.Messages, err = gatherMessages(ctx, loader, ts) if err != nil { return nil, fmt.Errorf("gather messages failed: %w", err) } - - // FIXME: Pass the response to `gatherMessages()` and set all this there. - bst.Messages = &exchange.CompactedMessages{} - bst.Messages.Bls = bmsgs - bst.Messages.BlsIncludes = bmincl - bst.Messages.Secpk = smsgs - bst.Messages.SecpkIncludes = smincl } bstips = append(bstips, &bst) @@ -202,7 +202,7 @@ func collectChainSegment(ctx context.Context, loader localstore.ChainLoader, req } } -func GatherMessages(ctx context.Context, loader localstore.ChainLoader, ts *chain.TipSet) ([]*chain.Message, [][]uint64, []*chain.SignedMessage, [][]uint64, error) { +func gatherMessages(ctx context.Context, loader localstore.ChainLoader, ts *chain.TipSet) (*exchange.CompactedMessages, error) { blsmsgmap := make(map[cid.Cid]uint64) secpkmsgmap := make(map[cid.Cid]uint64) var secpkincl, blsincl [][]uint64 @@ -211,7 +211,7 @@ func GatherMessages(ctx context.Context, loader localstore.ChainLoader, ts *chai for _, block := range ts.Blocks() { bc, sc, err := loader.ReadMsgMetaCids(ctx, block.Messages) if err != nil { - return nil, nil, nil, nil, err + return nil, err } // FIXME: DRY. Use `chain.Message` interface. @@ -244,13 +244,18 @@ func GatherMessages(ctx context.Context, loader localstore.ChainLoader, ts *chai blsmsgs, err := loader.LoadMessagesFromCids(ctx, blscids) if err != nil { - return nil, nil, nil, nil, err + return nil, err } secpkmsgs, err := loader.LoadSignedMessagesFromCids(ctx, secpkcids) if err != nil { - return nil, nil, nil, nil, err + return nil, err } - return blsmsgs, blsincl, secpkmsgs, secpkincl, nil + return &exchange.CompactedMessages{ + Bls: blsmsgs, + BlsIncludes: blsincl, + Secpk: secpkmsgs, + SecpkIncludes: secpkincl, + }, nil } From 76a8f7aaf20fc4831e32fa421e4e84e392033b3c Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 23 Nov 2021 14:18:10 +0800 Subject: [PATCH 041/167] impl: exchange Client --- venus-component/libp2p/exchange/{ => client}/inct.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename venus-component/libp2p/exchange/{ => client}/inct.go (98%) diff --git a/venus-component/libp2p/exchange/inct.go b/venus-component/libp2p/exchange/client/inct.go similarity index 98% rename from venus-component/libp2p/exchange/inct.go rename to venus-component/libp2p/exchange/client/inct.go index ad3c345f58..d1121a2647 100644 --- a/venus-component/libp2p/exchange/inct.go +++ b/venus-component/libp2p/exchange/client/inct.go @@ -1,4 +1,4 @@ -package exchange +package client import ( "io" From 135acb52e104108f0fc5ac04f0f1e842aa03a789 Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 23 Nov 2021 14:25:47 +0800 Subject: [PATCH 042/167] move client side codes into separated pkg --- venus-component/go.mod | 3 +- venus-component/go.sum | 23 +++++++++++++ .../libp2p/exchange/{ => client}/client.go | 22 +++++++------ .../exchange/{ => client}/peer_tracker.go | 29 +++++++++++++---- .../{protocol.go => client/response.go} | 32 +------------------ 5 files changed, 60 insertions(+), 49 deletions(-) rename venus-component/libp2p/exchange/{ => client}/client.go (96%) rename venus-component/libp2p/exchange/{ => client}/peer_tracker.go (83%) rename venus-component/libp2p/exchange/{protocol.go => client/response.go} (71%) diff --git a/venus-component/go.mod b/venus-component/go.mod index f9045c8497..43d7da7929 100644 --- a/venus-component/go.mod +++ b/venus-component/go.mod @@ -9,6 +9,7 @@ require ( github.com/ipfs/go-log v1.0.5 github.com/libp2p/go-libp2p-core v0.11.0 go.opencensus.io v0.23.0 + go.uber.org/fx v1.15.0 // indirect ) -replace github.com/filecoin-project/venus/venus-shared => github.com/dtynn/venus/venus-shared v0.0.0-20211122093704-d17df8c81e67 +replace github.com/filecoin-project/venus/venus-shared => github.com/dtynn/venus/venus-shared v0.0.0-20211123061034-42c7681cb4bc diff --git a/venus-component/go.sum b/venus-component/go.sum index 16fd231a58..6384242e03 100644 --- a/venus-component/go.sum +++ b/venus-component/go.sum @@ -33,6 +33,14 @@ github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dtynn/venus/venus-shared v0.0.0-20211122093704-d17df8c81e67 h1:2Jxs4ZBNc34iugyQZJz2Qt9G0I8Ajz7TdhmLZUAdhO8= github.com/dtynn/venus/venus-shared v0.0.0-20211122093704-d17df8c81e67/go.mod h1:deIJ0lkLYvcVURL0HZmJMhF694QlC4r+Kk2MIdjGjGQ= +github.com/dtynn/venus/venus-shared v0.0.0-20211123022845-0a9a6390f7ad h1:YgK59RVx/NIL9q7CXl7CrSLPrED+rlQNbIwokU1ArEg= +github.com/dtynn/venus/venus-shared v0.0.0-20211123022845-0a9a6390f7ad/go.mod h1:deIJ0lkLYvcVURL0HZmJMhF694QlC4r+Kk2MIdjGjGQ= +github.com/dtynn/venus/venus-shared v0.0.0-20211123034435-9997bac2384c h1:/oEM4eOdqYrEzbbe2YbLCvWs9GGxjREWVRGVl2mHOPM= +github.com/dtynn/venus/venus-shared v0.0.0-20211123034435-9997bac2384c/go.mod h1:goyPoyE7NO1pTxRgBKb9dzUyx/vQngs3pYWNsPrPf3Q= +github.com/dtynn/venus/venus-shared v0.0.0-20211123041219-eac8c12b6613 h1:Mp+w8n8c1GRMxqqY6CrmcPUoGILCEhQ3Y3fEIjkNntw= +github.com/dtynn/venus/venus-shared v0.0.0-20211123041219-eac8c12b6613/go.mod h1:goyPoyE7NO1pTxRgBKb9dzUyx/vQngs3pYWNsPrPf3Q= +github.com/dtynn/venus/venus-shared v0.0.0-20211123061034-42c7681cb4bc h1:pCjA3lCRoS+Yye5P8mBLgrkniRRZM8rbdcEvv/h1PBc= +github.com/dtynn/venus/venus-shared v0.0.0-20211123061034-42c7681cb4bc/go.mod h1:goyPoyE7NO1pTxRgBKb9dzUyx/vQngs3pYWNsPrPf3Q= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -384,12 +392,18 @@ github.com/xorcare/golden v0.6.0 h1:E8emU8bhyMIEpYmgekkTUaw4vtcrRE+Wa0c5wYIcgXc= github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/dig v1.12.0 h1:l1GQeZpEbss0/M4l/ZotuBndCrkMdjnygzgcuOjAdaY= +go.uber.org/dig v1.12.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= +go.uber.org/fx v1.15.0 h1:kcfBpAm98n0ksanyyZLFE/Q3T7yPi13Ge2liu3TxR+A= +go.uber.org/fx v1.15.0/go.mod h1:jI3RazQUhGv5KkpZIRv+kuP4CcgX3fnc0qX8bLnzbx8= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= @@ -423,6 +437,7 @@ golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKG golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -438,12 +453,14 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -460,6 +477,10 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2 h1:46ULzRKLh1CwgRq2dC5SlBzEqqNCi8rreOZnNrbqcIY= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210903071746-97244b99971b h1:3Dq0eVHn0uaQJmPO+/aYPI/fRMqdrVDbu7MQcku54gg= +golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -476,10 +497,12 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a h1:CB3a9Nez8M13wwlr/E2YtwoU+qYHKfC+JrDa45RXXoQ= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/venus-component/libp2p/exchange/client.go b/venus-component/libp2p/exchange/client/client.go similarity index 96% rename from venus-component/libp2p/exchange/client.go rename to venus-component/libp2p/exchange/client/client.go index a6c1fca364..c7dcdde29d 100644 --- a/venus-component/libp2p/exchange/client.go +++ b/venus-component/libp2p/exchange/client/client.go @@ -1,4 +1,4 @@ -package exchange +package client import ( "bufio" @@ -11,18 +11,19 @@ import ( "time" cborutil "github.com/filecoin-project/go-cbor-util" - logging "github.com/ipfs/go-log" "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" "go.opencensus.io/trace" + "go.uber.org/fx" "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/venus/venus-shared/libp2p" "github.com/filecoin-project/venus/venus-shared/libp2p/exchange" + "github.com/filecoin-project/venus/venus-shared/logging" ) -var clientLog = logging.Logger("exchange.client") +var log = logging.New("exchange.client") // client implements exchange.Client, using the libp2p ChainExchange protocol // as the fetching mechanism. @@ -40,10 +41,10 @@ var _ exchange.Client = (*client)(nil) // NewClient creates a new libp2p-based exchange.Client that uses the libp2p // ChainExhange protocol as the fetching mechanism. -func NewClient(host host.Host, pmgr libp2p.PeerManager) exchange.Client { +func NewClient(lc fx.Lifecycle, host host.Host, pmgr libp2p.PeerManager) exchange.Client { return &client{ host: host, - peerTracker: newPeerTracker(host, pmgr), + peerTracker: newPeerTracker(lc, host, pmgr), } } @@ -114,12 +115,13 @@ func (c *client) doRequest( default: } + plog := log.With("peer", peer.String()) + // Send request, read response. res, err := c.sendRequestToPeer(ctx, peer, req) if err != nil { if !errors.Is(err, network.ErrNoConn) { - clientLog.Warnf("could not send request to peer %s: %s", - peer.String(), err) + plog.Warnf("could not send request to peer: %s", err) } continue } @@ -127,7 +129,7 @@ func (c *client) doRequest( // Process and validate response. validRes, err := c.processResponse(req, res, tipsets) if err != nil { - clientLog.Warnf("processing peer %s response failed: %s", peer.String(), err) + plog.Warnf("processing peer response failed: %s", err) continue } @@ -154,8 +156,8 @@ func (c *client) processResponse(req *exchange.Request, res *exchange.Response, return nil, fmt.Errorf("status error: %w", err) } - options := parseOptions(req.Options) - if options.noOptionsSet() { + options := exchange.ParseOptions(req.Options) + if options.IsEmpty() { // Safety check: this shouldn't have been sent, and even if it did // it should have been caught by the peer in its error status. return nil, fmt.Errorf("nothing was requested") diff --git a/venus-component/libp2p/exchange/peer_tracker.go b/venus-component/libp2p/exchange/client/peer_tracker.go similarity index 83% rename from venus-component/libp2p/exchange/peer_tracker.go rename to venus-component/libp2p/exchange/client/peer_tracker.go index 0d6df7d38e..1af5808fd1 100644 --- a/venus-component/libp2p/exchange/peer_tracker.go +++ b/venus-component/libp2p/exchange/client/peer_tracker.go @@ -1,14 +1,16 @@ -package exchange +package client // FIXME: This needs to be reviewed. import ( + "context" "sort" "sync" "time" host "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-core/peer" + "go.uber.org/fx" "github.com/filecoin-project/venus/venus-shared/libp2p" ) @@ -29,22 +31,35 @@ type bsPeerTracker struct { pmgr libp2p.PeerManager } -func newPeerTracker(h host.Host, pmgr libp2p.PeerManager) *bsPeerTracker { +func newPeerTracker(lc fx.Lifecycle, h host.Host, pmgr libp2p.PeerManager) *bsPeerTracker { bsPt := &bsPeerTracker{ peers: make(map[peer.ID]*peerStats), pmgr: pmgr, } - sub, err := h.EventBus().Subscribe(new(libp2p.NewFilPeer)) + sub, err := h.EventBus().Subscribe(new(libp2p.FilPeerEvent)) if err != nil { panic(err) } go func() { - for newPeer := range sub.Out() { - bsPt.addPeer(newPeer.(libp2p.NewFilPeer).Id) + for evt := range sub.Out() { + pEvt := evt.(libp2p.FilPeerEvent) + switch pEvt.Type { + case libp2p.AddFilPeerEvt: + bsPt.addPeer(pEvt.ID) + case libp2p.RemoveFilPeerEvt: + bsPt.removePeer(pEvt.ID) + } } }() + + lc.Append(fx.Hook{ + OnStop: func(ctx context.Context) error { + return sub.Close() + }, + }) + return bsPt } @@ -143,7 +158,7 @@ func (bpt *bsPeerTracker) logSuccess(p peer.ID, dur time.Duration, reqSize uint6 var pi *peerStats var ok bool if pi, ok = bpt.peers[p]; !ok { - log.Debugf("log success called on peer not in tracker", "peerid", p.String()) + log.Warnw("log success called on peer not in tracker", "peerid", p.String()) return } @@ -161,7 +176,7 @@ func (bpt *bsPeerTracker) logFailure(p peer.ID, dur time.Duration, reqSize uint6 var pi *peerStats var ok bool if pi, ok = bpt.peers[p]; !ok { - log.Warn("log failure called on peer not in tracker", "peerid", p.String()) + log.Warnw("log failure called on peer not in tracker", "peerid", p.String()) return } diff --git a/venus-component/libp2p/exchange/protocol.go b/venus-component/libp2p/exchange/client/response.go similarity index 71% rename from venus-component/libp2p/exchange/protocol.go rename to venus-component/libp2p/exchange/client/response.go index f39d19076f..73d01d0ce4 100644 --- a/venus-component/libp2p/exchange/protocol.go +++ b/venus-component/libp2p/exchange/client/response.go @@ -1,16 +1,12 @@ -package exchange +package client import ( "time" - logging "github.com/ipfs/go-log" - "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/venus/venus-shared/libp2p/exchange" ) -var log = logging.Logger("exchange") - const ( // Extracted constants from the code. // FIXME: Should be reviewed and confirmed. @@ -19,34 +15,8 @@ const ( ReadResDeadline = WriteReqDeadline ReadResMinSpeed = 50 << 10 ShufflePeersPrefix = 16 - WriteResDeadline = 60 * time.Second ) -// `Request` processed and validated to query the tipsets needed. -type validatedRequest struct { - head chain.TipSetKey - length uint64 - options *parsedOptions -} - -// Decompressed options into separate struct members for easy access -// during internal processing.. -type parsedOptions struct { - IncludeHeaders bool - IncludeMessages bool -} - -func (options *parsedOptions) noOptionsSet() bool { - return !options.IncludeHeaders && !options.IncludeMessages -} - -func parseOptions(optfield uint64) *parsedOptions { - return &parsedOptions{ - IncludeHeaders: optfield&(uint64(exchange.Headers)) != 0, - IncludeMessages: optfield&(uint64(exchange.Messages)) != 0, - } -} - // Response that has been validated according to the protocol // and can be safely accessed. type validatedResponse struct { From 1f26f90242bb78ddda5615281ed87436e3531b36 Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 23 Nov 2021 15:21:47 +0800 Subject: [PATCH 043/167] feat: update exchange.Client.GetFullTipSet --- venus-shared/libp2p/exchange/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/venus-shared/libp2p/exchange/client.go b/venus-shared/libp2p/exchange/client.go index c619f6f3e2..e09a20c87f 100644 --- a/venus-shared/libp2p/exchange/client.go +++ b/venus-shared/libp2p/exchange/client.go @@ -23,7 +23,7 @@ type Client interface { // GetFullTipSet fetches a full tipset from a given peer. If successful, // the fetched object contains block headers and all messages in full form. - GetFullTipSet(ctx context.Context, peer []peer.ID, tsk chain.TipSetKey) (*chain.FullTipSet, error) + GetFullTipSet(ctx context.Context, peer peer.ID, tsk chain.TipSetKey) (*chain.FullTipSet, error) // AddPeer adds a peer to the pool of peers that the Client requests // data from. From 5eb598cb6a061630fa683f1ea6984e4d9f7b1939 Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 23 Nov 2021 15:27:59 +0800 Subject: [PATCH 044/167] feat: impl exchange.Client --- venus-component/go.mod | 6 +- venus-component/go.sum | 18 ++--- .../libp2p/exchange/client/client.go | 76 ++++++++----------- 3 files changed, 41 insertions(+), 59 deletions(-) diff --git a/venus-component/go.mod b/venus-component/go.mod index 43d7da7929..306c467904 100644 --- a/venus-component/go.mod +++ b/venus-component/go.mod @@ -6,10 +6,10 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/venus/venus-shared v0.0.0 github.com/ipfs/go-cid v0.1.0 - github.com/ipfs/go-log v1.0.5 + github.com/ipfs/go-log v1.0.5 // indirect github.com/libp2p/go-libp2p-core v0.11.0 go.opencensus.io v0.23.0 - go.uber.org/fx v1.15.0 // indirect + go.uber.org/fx v1.15.0 ) -replace github.com/filecoin-project/venus/venus-shared => github.com/dtynn/venus/venus-shared v0.0.0-20211123061034-42c7681cb4bc +replace github.com/filecoin-project/venus/venus-shared => github.com/dtynn/venus/venus-shared v0.0.0-20211123072147-edbf49c4507e diff --git a/venus-component/go.sum b/venus-component/go.sum index 6384242e03..851e51e95b 100644 --- a/venus-component/go.sum +++ b/venus-component/go.sum @@ -31,16 +31,8 @@ github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzA github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dtynn/venus/venus-shared v0.0.0-20211122093704-d17df8c81e67 h1:2Jxs4ZBNc34iugyQZJz2Qt9G0I8Ajz7TdhmLZUAdhO8= -github.com/dtynn/venus/venus-shared v0.0.0-20211122093704-d17df8c81e67/go.mod h1:deIJ0lkLYvcVURL0HZmJMhF694QlC4r+Kk2MIdjGjGQ= -github.com/dtynn/venus/venus-shared v0.0.0-20211123022845-0a9a6390f7ad h1:YgK59RVx/NIL9q7CXl7CrSLPrED+rlQNbIwokU1ArEg= -github.com/dtynn/venus/venus-shared v0.0.0-20211123022845-0a9a6390f7ad/go.mod h1:deIJ0lkLYvcVURL0HZmJMhF694QlC4r+Kk2MIdjGjGQ= -github.com/dtynn/venus/venus-shared v0.0.0-20211123034435-9997bac2384c h1:/oEM4eOdqYrEzbbe2YbLCvWs9GGxjREWVRGVl2mHOPM= -github.com/dtynn/venus/venus-shared v0.0.0-20211123034435-9997bac2384c/go.mod h1:goyPoyE7NO1pTxRgBKb9dzUyx/vQngs3pYWNsPrPf3Q= -github.com/dtynn/venus/venus-shared v0.0.0-20211123041219-eac8c12b6613 h1:Mp+w8n8c1GRMxqqY6CrmcPUoGILCEhQ3Y3fEIjkNntw= -github.com/dtynn/venus/venus-shared v0.0.0-20211123041219-eac8c12b6613/go.mod h1:goyPoyE7NO1pTxRgBKb9dzUyx/vQngs3pYWNsPrPf3Q= -github.com/dtynn/venus/venus-shared v0.0.0-20211123061034-42c7681cb4bc h1:pCjA3lCRoS+Yye5P8mBLgrkniRRZM8rbdcEvv/h1PBc= -github.com/dtynn/venus/venus-shared v0.0.0-20211123061034-42c7681cb4bc/go.mod h1:goyPoyE7NO1pTxRgBKb9dzUyx/vQngs3pYWNsPrPf3Q= +github.com/dtynn/venus/venus-shared v0.0.0-20211123072147-edbf49c4507e h1:gv9YiO71L/FIQSjW0OhHLr1g8ipO/R0/9hgqzqPBEf8= +github.com/dtynn/venus/venus-shared v0.0.0-20211123072147-edbf49c4507e/go.mod h1:goyPoyE7NO1pTxRgBKb9dzUyx/vQngs3pYWNsPrPf3Q= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -403,6 +395,7 @@ go.uber.org/dig v1.12.0 h1:l1GQeZpEbss0/M4l/ZotuBndCrkMdjnygzgcuOjAdaY= go.uber.org/dig v1.12.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= go.uber.org/fx v1.15.0 h1:kcfBpAm98n0ksanyyZLFE/Q3T7yPi13Ge2liu3TxR+A= go.uber.org/fx v1.15.0/go.mod h1:jI3RazQUhGv5KkpZIRv+kuP4CcgX3fnc0qX8bLnzbx8= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -435,8 +428,8 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -475,7 +468,6 @@ golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210309074719-68d13333faf2 h1:46ULzRKLh1CwgRq2dC5SlBzEqqNCi8rreOZnNrbqcIY= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -500,8 +492,8 @@ golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a h1:CB3a9Nez8M13wwlr/E2YtwoU+qYHKfC+JrDa45RXXoQ= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/venus-component/libp2p/exchange/client/client.go b/venus-component/libp2p/exchange/client/client.go index c7dcdde29d..0607e4f42d 100644 --- a/venus-component/libp2p/exchange/client/client.go +++ b/venus-component/libp2p/exchange/client/client.go @@ -2,11 +2,9 @@ package client import ( "bufio" - "bytes" "context" "errors" "fmt" - "io/ioutil" "math/rand" "time" @@ -68,7 +66,7 @@ func NewClient(lc fx.Lifecycle, host host.Host, pmgr libp2p.PeerManager) exchang func (c *client) doRequest( ctx context.Context, req *exchange.Request, - singlePeer []peer.ID, + singlePeer *peer.ID, // In the `GetChainMessages` case, we won't request the headers but we still // need them to check the integrity of the `CompactedMessages` in the response // so the tipset blocks need to be provided by the caller. @@ -78,12 +76,10 @@ func (c *client) doRequest( if req.Length == 0 { return nil, fmt.Errorf("invalid request of length 0") } - if req.Length > exchange.MaxRequestLength { return nil, fmt.Errorf("request length (%d) above maximum (%d)", req.Length, exchange.MaxRequestLength) } - if req.Options == 0 { return nil, fmt.Errorf("request with no options set") } @@ -91,14 +87,14 @@ func (c *client) doRequest( // Generate the list of peers to be queried, either the // `singlePeer` indicated or all peers available (sorted // by an internal peer tracker with some randomness injected). - var selectPeers []peer.ID + var peers []peer.ID if singlePeer != nil { - selectPeers = append(selectPeers, singlePeer...) + peers = []peer.ID{*singlePeer} } else { - selectPeers = c.getShuffledPeers() - } - if len(selectPeers) == 0 { - return nil, fmt.Errorf("no peers available") + peers = c.getShuffledPeers() + if len(peers) == 0 { + return nil, fmt.Errorf("no peers available") + } } // Try the request for each peer in the list, @@ -108,7 +104,7 @@ func (c *client) doRequest( globalTime := time.Now() // Global time used to track what is the expected time we will need to get // a response if a client fails us. - for _, peer := range selectPeers { + for _, peer := range peers { select { case <-ctx.Done(): return nil, fmt.Errorf("context cancelled: %w", ctx.Err()) @@ -138,7 +134,11 @@ func (c *client) doRequest( return validRes, nil } - return nil, fmt.Errorf("doRequest failed for all peers") + errString := "doRequest failed for all peers" + if singlePeer != nil { + errString = fmt.Sprintf("doRequest failed for single peer %s", *singlePeer) + } + return nil, fmt.Errorf(errString) } // Process and validate response. Check the status, the integrity of the @@ -150,12 +150,20 @@ func (c *client) doRequest( // errors. Peer penalization should happen here then, before returning, so // we can apply the correct penalties depending on the cause of the error. // FIXME: Add the `peer` as argument once we implement penalties. -func (c *client) processResponse(req *exchange.Request, res *exchange.Response, tipsets []*chain.TipSet) (*validatedResponse, error) { - err := res.StatusToError() +func (c *client) processResponse(req *exchange.Request, res *exchange.Response, tipsets []*chain.TipSet) (r *validatedResponse, err error) { + err = res.StatusToError() if err != nil { return nil, fmt.Errorf("status error: %w", err) } + defer func() { + if rerr := recover(); rerr != nil { + log.Errorf("process response error: %s", rerr) + err = fmt.Errorf("process response error: %s", rerr) + return + } + }() + options := exchange.ParseOptions(req.Options) if options.IsEmpty() { // Safety check: this shouldn't have been sent, and even if it did @@ -169,12 +177,10 @@ func (c *client) processResponse(req *exchange.Request, res *exchange.Response, if resLength == 0 { return nil, fmt.Errorf("got no chain in successful response") } - if resLength > int(req.Length) { return nil, fmt.Errorf("got longer response (%d) than requested (%d)", resLength, req.Length) } - if resLength < int(req.Length) && res.Status != exchange.Partial { return nil, fmt.Errorf("got less than requested without a proper status: %d", res.Status) } @@ -200,8 +206,8 @@ func (c *client) processResponse(req *exchange.Request, res *exchange.Response, } } - // Check that the returned head matches the one requested - if !chain.CidArrsEqual(validRes.tipsets[0].Key().Cids(), req.Head) { + // Check that the returned head matches the one requested. + if !chain.CidArrsEqual(validRes.tipsets[0].Cids(), req.Head) { return nil, fmt.Errorf("returned chain head does not match request") } @@ -319,7 +325,7 @@ func (c *client) GetBlocks(ctx context.Context, tsk chain.TipSetKey, count int) } // GetFullTipSet implements Client.GetFullTipSet(). Refer to the godocs there. -func (c *client) GetFullTipSet(ctx context.Context, peers []peer.ID, tsk chain.TipSetKey) (*chain.FullTipSet, error) { +func (c *client) GetFullTipSet(ctx context.Context, peer peer.ID, tsk chain.TipSetKey) (*chain.FullTipSet, error) { // TODO: round robin through these peers on error req := &exchange.Request{ @@ -328,7 +334,7 @@ func (c *client) GetFullTipSet(ctx context.Context, peers []peer.ID, tsk chain.T Options: exchange.Headers | exchange.Messages, } - validRes, err := c.doRequest(ctx, req, peers, nil) + validRes, err := c.doRequest(ctx, req, &peer, nil) if err != nil { return nil, err } @@ -346,14 +352,14 @@ func (c *client) GetChainMessages(ctx context.Context, tipsets []*chain.TipSet) ctx, span := trace.StartSpan(ctx, "GetChainMessages") if span.IsRecordingEvents() { span.AddAttributes( - trace.StringAttribute("tipset", fmt.Sprint(head.Key().Cids())), + trace.StringAttribute("tipset", fmt.Sprint(head.Cids())), trace.Int64Attribute("count", int64(length)), ) } defer span.End() req := &exchange.Request{ - Head: head.Key().Cids(), + Head: head.Cids(), Length: length, Options: exchange.Messages, } @@ -395,11 +401,9 @@ func (c *client) sendRequestToPeer(ctx context.Context, peer peer.ID, req *excha c.RemovePeer(ctx, peer) return nil, fmt.Errorf("failed to get protocols for peer: %w", err) } - if len(supported) == 0 || (supported[0] != exchange.BlockSyncProtocolID && supported[0] != exchange.ChainExchangeProtocolID) { - c.RemovePeer(ctx, peer) - c.host.ConnManager().TagPeer(peer, "no match protocol", -2000) - return nil, fmt.Errorf("peer %s does not support protocols %s", peer, []string{exchange.BlockSyncProtocolID, exchange.ChainExchangeProtocolID}) + return nil, fmt.Errorf("peer %s does not support protocols %s", + peer, []string{exchange.BlockSyncProtocolID, exchange.ChainExchangeProtocolID}) } connectionStart := time.Now() @@ -414,11 +418,7 @@ func (c *client) sendRequestToPeer(ctx context.Context, peer peer.ID, req *excha return nil, fmt.Errorf("failed to open stream to peer: %w", err) } - defer func() { - // Note: this will become just stream.Close once we've completed the go-libp2p migration to - // go-libp2p-core 0.7.0 - go stream.Close() //nolint:errcheck - }() + defer stream.Close() //nolint:errcheck // Write request. _ = stream.SetWriteDeadline(time.Now().Add(WriteReqDeadline)) @@ -432,19 +432,9 @@ func (c *client) sendRequestToPeer(ctx context.Context, peer peer.ID, req *excha // its own API (https://github.com/libp2p/go-libp2p-core/issues/162). // Read response. - _ = stream.SetReadDeadline(time.Time{}) - - //TODO Note: this will remove once we've completed the go-libp2p migration to - // go-libp2p-core 0.7.0 - respBytes, err := ioutil.ReadAll(bufio.NewReader(NewInct(stream, ReadResMinSpeed, ReadResDeadline))) - if err != nil { - return nil, err - } - var res exchange.Response err = cborutil.ReadCborRPC( - bytes.NewReader(respBytes), - //bufio.NewReader(NewInct(stream, ReadResMinSpeed, ReadResDeadline)), + bufio.NewReader(NewInct(stream, ReadResMinSpeed, ReadResDeadline)), &res) if err != nil { c.peerTracker.logFailure(peer, time.Since(connectionStart), req.Length) From 1e7bdbd96889d3de4d5da05d85c383f51407afb4 Mon Sep 17 00:00:00 2001 From: dtynn Date: Fri, 26 Nov 2021 14:51:04 +0800 Subject: [PATCH 045/167] impl & test Message.ValidForBlockInclusion --- venus-shared/chain/message.go | 68 +++++++- venus-shared/chain/message_test.go | 146 ++++++++++++++++++ venus-shared/chain/param.go | 10 +- venus-shared/chain/params/chain.go | 14 ++ venus-shared/chain/shared_func.go | 24 +++ venus-shared/testutil/value_set_n_reset.go | 41 +++++ .../testutil/value_set_n_reset_test.go | 19 +++ 7 files changed, 318 insertions(+), 4 deletions(-) create mode 100644 venus-shared/chain/shared_func.go create mode 100644 venus-shared/testutil/value_set_n_reset.go create mode 100644 venus-shared/testutil/value_set_n_reset_test.go diff --git a/venus-shared/chain/message.go b/venus-shared/chain/message.go index 65affd4701..c016b4f829 100644 --- a/venus-shared/chain/message.go +++ b/venus-shared/chain/message.go @@ -7,7 +7,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/venus/venus-shared/chain/params" blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" ) @@ -121,8 +122,69 @@ func (m *Message) EqualCall(o *Message) bool { m2 := *o m1.GasLimit, m2.GasLimit = 0, 0 - m1.GasFeeCap, m2.GasFeeCap = big.Zero(), big.Zero() - m1.GasPremium, m2.GasPremium = big.Zero(), big.Zero() + m1.GasFeeCap, m2.GasFeeCap = bigZero, bigZero + m1.GasPremium, m2.GasPremium = bigZero, bigZero return (&m1).Equals(&m2) } + +func (m *Message) ValidForBlockInclusion(minGas int64, version network.Version) error { + if m.Version != 0 { + return fmt.Errorf("'Version' unsupported") + } + + if m.To == address.Undef { + return fmt.Errorf("'To' address cannot be empty") + } + + if m.To == ZeroAddress && version >= network.Version7 { + return fmt.Errorf("invalid 'To' address") + } + + if m.From == address.Undef { + return fmt.Errorf("'From' address cannot be empty") + } + + if m.Value.Int == nil { + return fmt.Errorf("'Value' cannot be nil") + } + + if m.Value.LessThan(bigZero) { + return fmt.Errorf("'Value' field cannot be negative") + } + + if m.Value.GreaterThan(TotalFilecoinInt) { + return fmt.Errorf("'Value' field cannot be greater than total filecoin supply") + } + + if m.GasFeeCap.Int == nil { + return fmt.Errorf("'GasFeeCap' cannot be nil") + } + + if m.GasFeeCap.LessThan(bigZero) { + return fmt.Errorf("'GasFeeCap' field cannot be negative") + } + + if m.GasPremium.Int == nil { + return fmt.Errorf("'GasPremium' cannot be nil") + } + + if m.GasPremium.LessThan(bigZero) { + return fmt.Errorf("'GasPremium' field cannot be negative") + } + + if m.GasPremium.GreaterThan(m.GasFeeCap) { + return fmt.Errorf("'GasFeeCap' less than 'GasPremium'") + } + + if m.GasLimit > params.BlockGasLimit { + return fmt.Errorf("'GasLimit' field cannot be greater than a block's gas limit") + } + + // since prices might vary with time, this is technically semantic validation + if m.GasLimit < minGas { + return fmt.Errorf("'GasLimit' field cannot be less than the cost of storing a message on chain %d < %d", m.GasLimit, minGas) + } + + return nil +} diff --git a/venus-shared/chain/message_test.go b/venus-shared/chain/message_test.go index c375425671..35a8dc7447 100644 --- a/venus-shared/chain/message_test.go +++ b/venus-shared/chain/message_test.go @@ -5,6 +5,9 @@ import ( "testing" "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/venus/venus-shared/chain/params" "github.com/filecoin-project/venus/venus-shared/testutil" blocks "github.com/ipfs/go-block-format" "github.com/stretchr/testify/require" @@ -59,3 +62,146 @@ func TestMessageBasic(t *testing.T) { testutil.CborErBasicTest(t, &src, &dst, opt) } } + +func TestMessageValidForBlockInclusion(t *testing.T) { + var msg Message + testutil.Provide( + t, + &msg, + testutil.IntRangedProvider(0, params.BlockGasLimit), + func(t *testing.T) big.Int { + ip := testutil.IntRangedProvider(0, int(params.FilBase)) + return FromFil(uint64(ip(t))) + }, + ) + + // ensure that random assignments won't break the validation + msg.Version = 0 + msg.GasPremium = msg.GasFeeCap + + err := msg.ValidForBlockInclusion(0, network.Version7) + require.NoError(t, err, "ValidForBlockInclusion") + + neg := NewInt(1).Neg() + + valCases := []struct { + name string + sets []interface{} + minGas int64 + version network.Version + }{ + { + name: "Version != 0", + sets: []interface{}{ + &msg.Version, + uint64(MessageVersion + 1), + }, + }, + { + name: "To:Undef", + sets: []interface{}{ + &msg.To, + address.Undef, + }, + }, + { + name: "To:ZeroAddress", + sets: []interface{}{ + &msg.To, + ZeroAddress, + }, + version: network.Version7, + }, + { + name: "From:Undef", + sets: []interface{}{ + &msg.From, + address.Undef, + }, + }, + { + name: "Value:nil", + sets: []interface{}{ + &msg.Value, + EmptyInt, + }, + }, + { + name: "Value:neg", + sets: []interface{}{ + &msg.Value, + neg, + }, + }, + { + name: "Value:TooLarge", + sets: []interface{}{ + &msg.Value, + BigAdd(TotalFilecoinInt, NewInt(1)), + }, + }, + { + name: "GasFeeCap:nil", + sets: []interface{}{ + &msg.GasFeeCap, + EmptyInt, + }, + }, + { + name: "GasFeeCap:neg", + sets: []interface{}{ + &msg.GasFeeCap, + neg, + }, + }, + { + name: "GasPremium:nil", + sets: []interface{}{ + &msg.GasPremium, + EmptyInt, + }, + }, + { + name: "GasPremium:neg", + sets: []interface{}{ + &msg.GasPremium, + neg, + }, + }, + { + name: "GasPremium: > GasFeeCap", + sets: []interface{}{ + &msg.GasPremium, + BigAdd(msg.GasFeeCap, NewInt(1)), + }, + }, + { + name: "GasLimit: > BlockGasLimit", + sets: []interface{}{ + &msg.GasLimit, + int64(params.BlockGasLimit) + 1, + }, + }, + { + name: "GasLimit: < minGas", + sets: []interface{}{ + &msg.GasLimit, + int64(-1), + }, + }, + } + + for _, c := range valCases { + onSet := func() { + err := msg.ValidForBlockInclusion(c.minGas, c.version) + require.Errorf(t, err, "after invalid values set for %s", c.name) + } + + onReset := func() { + err := msg.ValidForBlockInclusion(c.minGas, c.version) + require.NoErrorf(t, err, "after values reset for %s", c.name) + } + + testutil.ValueSetNReset(t, c.name, onSet, onReset, c.sets...) + } +} diff --git a/venus-shared/chain/param.go b/venus-shared/chain/param.go index 313de8c0b2..4554286c06 100644 --- a/venus-shared/chain/param.go +++ b/venus-shared/chain/param.go @@ -3,7 +3,15 @@ package chain import ( "math/big" + big2 "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/venus/venus-shared/chain/params" ) -var blocksPerEpochBig = big.NewInt(0).SetUint64(params.BlocksPerEpoch) +var ( + bigZero = big2.Zero() + blocksPerEpochBig = big.NewInt(0).SetUint64(params.BlocksPerEpoch) +) + +var TotalFilecoinInt = FromFil(params.FilBase) + +var ZeroAddress = MustParseAddress("f3yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaby2smx7a") diff --git a/venus-shared/chain/params/chain.go b/venus-shared/chain/params/chain.go index 84b365afcc..3b7848400b 100644 --- a/venus-shared/chain/params/chain.go +++ b/venus-shared/chain/params/chain.go @@ -6,3 +6,17 @@ import ( var BlocksPerEpoch = uint64(builtin0.ExpectedLeadersPerEpoch) var MaxWinCount = 3 * int64(BlocksPerEpoch) + +// /////// +// Limits + +// TODO: If this is gonna stay, it should move to specs-actors +const BlockMessageLimit = 10000 + +const BlockGasLimit = 10_000_000_000 +const BlockGasTarget = BlockGasLimit / 2 +const BaseFeeMaxChangeDenom = 8 // 12.5% +const InitialBaseFee = 100e6 +const MinimumBaseFee = 100 +const PackingEfficiencyNum = 4 +const PackingEfficiencyDenom = 5 diff --git a/venus-shared/chain/shared_func.go b/venus-shared/chain/shared_func.go new file mode 100644 index 0000000000..55a65665a6 --- /dev/null +++ b/venus-shared/chain/shared_func.go @@ -0,0 +1,24 @@ +package chain + +import ( + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" +) + +func MustParseAddress(addr string) address.Address { + ret, err := address.NewFromString(addr) + if err != nil { + panic(err) + } + + return ret +} + +func MustParseCid(c string) cid.Cid { + ret, err := cid.Decode(c) + if err != nil { + panic(err) + } + + return ret +} diff --git a/venus-shared/testutil/value_set_n_reset.go b/venus-shared/testutil/value_set_n_reset.go new file mode 100644 index 0000000000..b9a82047d3 --- /dev/null +++ b/venus-shared/testutil/value_set_n_reset.go @@ -0,0 +1,41 @@ +package testutil + +import ( + "reflect" + "testing" + + "github.com/stretchr/testify/require" +) + +func ValueSetNReset(t *testing.T, name string, onSet func(), onReset func(), vsets ...interface{}) { + psize := len(vsets) + require.Greaterf(t, psize, 0, "value sets should not be empty for case %s", name) + require.Truef(t, psize%2 == 0, "params count should be odd for case %s", name) + + ptrs := make([]reflect.Value, psize/2) + originalVals := make([]reflect.Value, psize/2) + for i := 0; i < psize/2; i++ { + pi := i * 2 + ptr := reflect.ValueOf(vsets[pi]) + require.Equalf(t, ptr.Type().Kind(), reflect.Ptr, "#%d param should be pointer to the target value for case %s", i, name) + ptrs[i] = ptr + + originVal := reflect.New(ptr.Elem().Type()) + originVal.Elem().Set(ptr.Elem()) + + originalVals[i] = originVal + ptr.Elem().Set(reflect.ValueOf(vsets[pi+1])) + } + + if onSet != nil { + onSet() + } + + for i := range ptrs { + ptrs[i].Elem().Set(originalVals[i].Elem()) + } + + if onReset != nil { + onReset() + } +} diff --git a/venus-shared/testutil/value_set_n_reset_test.go b/venus-shared/testutil/value_set_n_reset_test.go new file mode 100644 index 0000000000..de870e1095 --- /dev/null +++ b/venus-shared/testutil/value_set_n_reset_test.go @@ -0,0 +1,19 @@ +package testutil + +import ( + "fmt" + "math/rand" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestValueSetNReset(t *testing.T) { + for i := 0; i < 32; i++ { + originVal := rand.Int() + newVal := originVal + 1 + + target := originVal + ValueSetNReset(t, fmt.Sprintf("set %d to %d", originVal, newVal), func() { require.Equal(t, target, newVal, "after set") }, func() { require.Equal(t, target, originVal, "after reset") }, &target, newVal) + } +} From 5afbb0069a8ed2fb419b69ee6a7cd38253334cf0 Mon Sep 17 00:00:00 2001 From: dtynn Date: Mon, 29 Nov 2021 10:08:26 +0800 Subject: [PATCH 046/167] more types in venus-shared --- venus-shared/bazaar/bazaar.go | 12 ++++++++++++ venus-shared/bazaar/event.go | 16 ++++++++++++++++ venus-shared/libp2p/hello/hello.go | 4 ++++ venus-shared/localstore/chain.go | 8 ++++++++ 4 files changed, 40 insertions(+) create mode 100644 venus-shared/bazaar/bazaar.go create mode 100644 venus-shared/bazaar/event.go diff --git a/venus-shared/bazaar/bazaar.go b/venus-shared/bazaar/bazaar.go new file mode 100644 index 0000000000..79dcd35c8c --- /dev/null +++ b/venus-shared/bazaar/bazaar.go @@ -0,0 +1,12 @@ +package bazaar + +import ( + "context" + + "github.com/libp2p/go-libp2p-core/peer" +) + +type Host interface { + RegisterHandler(typ Event, hdl EventHandler) error + Emit(ctx context.Context, evt Event, to ...peer.ID) error +} diff --git a/venus-shared/bazaar/event.go b/venus-shared/bazaar/event.go new file mode 100644 index 0000000000..9fc4c328a0 --- /dev/null +++ b/venus-shared/bazaar/event.go @@ -0,0 +1,16 @@ +package bazaar + +import "github.com/libp2p/go-libp2p-core/peer" + +// developers can define the types except Ping +const EventPing EventType = 0 + +type EventType uint64 + +type Event struct { + Type EventType + Data []byte + Time int64 +} + +type EventHandler func(peer.ID, *Event) error diff --git a/venus-shared/libp2p/hello/hello.go b/venus-shared/libp2p/hello/hello.go index c04ee28647..e62af590f5 100644 --- a/venus-shared/libp2p/hello/hello.go +++ b/venus-shared/libp2p/hello/hello.go @@ -1,11 +1,15 @@ package hello import ( + "fmt" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" ) +var ErrBadGenesis = fmt.Errorf("bad genesis block") + const ProtocolID = "/fil/hello/1.0.0" // GreetingMessage is the data structure of a single message in the hello protocol. diff --git a/venus-shared/localstore/chain.go b/venus-shared/localstore/chain.go index 452b78e90e..7e668cbc2d 100644 --- a/venus-shared/localstore/chain.go +++ b/venus-shared/localstore/chain.go @@ -22,3 +22,11 @@ type ChainLoader interface { TipSetLoader MessageLoader } + +type FullTipSetLoader interface { + LoadFullTipSet(ctx context.Context, tsk chain.TipSetKey) (*chain.FullTipSet, error) +} + +type FullTipSetStorer interface { + StoreFullTipSet(ctx context.Context, fb *chain.FullTipSet) error +} From 52232e2bc2ea288e255eac697f5eb34c5a85635b Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 30 Nov 2021 14:07:49 +0800 Subject: [PATCH 047/167] impl: typechecker --- venus-devtool/compatible/apis/main.go | 11 + venus-devtool/compatible/typecheck/fields.go | 51 +++ venus-devtool/compatible/typecheck/methods.go | 51 +++ venus-devtool/compatible/typecheck/similar.go | 392 ++++++++++++++++++ venus-devtool/go.mod | 5 +- venus-devtool/go.sum | 28 +- 6 files changed, 527 insertions(+), 11 deletions(-) create mode 100644 venus-devtool/compatible/apis/main.go create mode 100644 venus-devtool/compatible/typecheck/fields.go create mode 100644 venus-devtool/compatible/typecheck/methods.go create mode 100644 venus-devtool/compatible/typecheck/similar.go diff --git a/venus-devtool/compatible/apis/main.go b/venus-devtool/compatible/apis/main.go new file mode 100644 index 0000000000..fe8e63cb72 --- /dev/null +++ b/venus-devtool/compatible/apis/main.go @@ -0,0 +1,11 @@ +package main + +import ( + "fmt" + + "github.com/filecoin-project/lotus/api" +) + +func main() { + fmt.Printf("%T\n", api.FullNode(nil)) +} diff --git a/venus-devtool/compatible/typecheck/fields.go b/venus-devtool/compatible/typecheck/fields.go new file mode 100644 index 0000000000..93124e3f01 --- /dev/null +++ b/venus-devtool/compatible/typecheck/fields.go @@ -0,0 +1,51 @@ +package typecheck + +import ( + "fmt" + "go/ast" + "reflect" + "sync" +) + +var exportedFieldsCache = struct { + sync.RWMutex + fields map[reflect.Type][]reflect.StructField +}{ + fields: make(map[reflect.Type][]reflect.StructField), +} + +func ExportedFields(obj interface{}) ([]reflect.StructField, error) { + typ, ok := obj.(reflect.Type) + if !ok { + typ = reflect.TypeOf(obj) + } + + if kind := typ.Kind(); kind != reflect.Struct { + return nil, fmt.Errorf("%s is not struct", typ) + } + + exportedFieldsCache.RLock() + fields, ok := exportedFieldsCache.fields[typ] + exportedFieldsCache.RUnlock() + + if ok { + return fields, nil + } + + num := typ.NumField() + fields = make([]reflect.StructField, 0, num) + for i := 0; i < num; i++ { + field := typ.Field(i) + if !ast.IsExported(field.Name) { + continue + } + + fields = append(fields, field) + } + + exportedFieldsCache.Lock() + exportedFieldsCache.fields[typ] = fields + exportedFieldsCache.Unlock() + + return fields, nil +} diff --git a/venus-devtool/compatible/typecheck/methods.go b/venus-devtool/compatible/typecheck/methods.go new file mode 100644 index 0000000000..f69d558444 --- /dev/null +++ b/venus-devtool/compatible/typecheck/methods.go @@ -0,0 +1,51 @@ +package typecheck + +import ( + "fmt" + "go/ast" + "reflect" + "sync" +) + +var exportedMethodsCache = struct { + sync.RWMutex + methods map[reflect.Type][]reflect.Method +}{ + methods: make(map[reflect.Type][]reflect.Method), +} + +func ExportedMethods(obj interface{}) ([]reflect.Method, error) { + typ, ok := obj.(reflect.Type) + if !ok { + typ = reflect.TypeOf(obj) + } + + if kind := typ.Kind(); kind != reflect.Struct && kind != reflect.Interface { + return nil, fmt.Errorf("unexpected type kind %s", kind) + } + + exportedMethodsCache.RLock() + methods, ok := exportedMethodsCache.methods[typ] + exportedMethodsCache.RUnlock() + + if ok { + return methods, nil + } + + num := typ.NumMethod() + methods = make([]reflect.Method, 0, num) + for i := 0; i < num; i++ { + method := typ.Method(i) + if !ast.IsExported(method.Name) { + continue + } + + methods = append(methods, method) + } + + exportedMethodsCache.Lock() + exportedMethodsCache.methods[typ] = methods + exportedMethodsCache.Unlock() + + return methods, nil +} diff --git a/venus-devtool/compatible/typecheck/similar.go b/venus-devtool/compatible/typecheck/similar.go new file mode 100644 index 0000000000..af6efbc307 --- /dev/null +++ b/venus-devtool/compatible/typecheck/similar.go @@ -0,0 +1,392 @@ +package typecheck + +import ( + "encoding" + "encoding/json" + "fmt" + "math/bits" + "reflect" + "sync" + + "github.com/filecoin-project/go-state-types/cbor" +) + +func init() { + if zeroes := bits.TrailingZeros(uint(_CodecLimit)); zeroes != len(codecs) { + panic(fmt.Errorf("codec count not match, %d != %d", zeroes, len(codecs))) + } + + for ci := range codecs { + if zeroes := bits.TrailingZeros(uint(codecs[ci].flag)); zeroes != ci { + panic(fmt.Errorf("#%d codec's flag is not matched", ci)) + } + } +} + +type CodecFlag uint + +const ( + BinaryCodec CodecFlag = 1 << iota + TextCodec + JSONCodec + CborCodec + _CodecLimit +) + +type Ordered uint + +const ( + StructFieldsOrdered Ordered = 1 << iota + InterfaceMethodsOrdered +) + +var ( + codecs = []struct { + flag CodecFlag + marshaler reflect.Type + unmarshaler reflect.Type + }{ + { + flag: BinaryCodec, + marshaler: reflect.TypeOf((*encoding.BinaryMarshaler)(nil)).Elem(), + unmarshaler: reflect.TypeOf((*encoding.BinaryUnmarshaler)(nil)).Elem(), + }, + { + flag: TextCodec, + marshaler: reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem(), + unmarshaler: reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem(), + }, + { + flag: JSONCodec, + marshaler: reflect.TypeOf((*json.Marshaler)(nil)).Elem(), + unmarshaler: reflect.TypeOf((*json.Unmarshaler)(nil)).Elem(), + }, + { + flag: CborCodec, + marshaler: reflect.TypeOf((*cbor.Marshaler)(nil)).Elem(), + unmarshaler: reflect.TypeOf((*cbor.Unmarshaler)(nil)).Elem(), + }, + } +) + +type similarResult struct { + similar bool + reason string +} + +var similarCache = struct { + sync.RWMutex + results map[[2]reflect.Type]similarResult +}{ + results: make(map[[2]reflect.Type]similarResult), +} + +func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, string) { + atyp, ok := a.(reflect.Type) + if !ok { + atyp = reflect.TypeOf(a) + } + + btyp, ok := b.(reflect.Type) + if !ok { + btyp = reflect.TypeOf(b) + } + + if atyp == btyp { + return true, "" + } + + similarCache.RLock() + res, has := similarCache.results[[2]reflect.Type{atyp, btyp}] + if !has { + res, has = similarCache.results[[2]reflect.Type{btyp, atyp}] + } + similarCache.RUnlock() + + if has { + return res.similar, res.reason + } + + var yes bool + var reason string + + defer func() { + similarCache.Lock() + similarCache.results[[2]reflect.Type{atyp, btyp}] = similarResult{ + similar: yes, + reason: reason, + } + similarCache.Unlock() + }() + + akind := atyp.Kind() + bkind := btyp.Kind() + + if akind != bkind { + reason = fmt.Sprintf("kinds not match, %s != %s", akind, bkind) + return yes, reason + } + + if codecFlag != 0 { + for i := range codecs { + if codecFlag|codecs[i].flag == 0 { + continue + } + + aMarImpl := atyp.Implements(codecs[i].marshaler) + bMarImpl := btyp.Implements(codecs[i].marshaler) + if aMarImpl != bMarImpl { + reason = fmt.Sprintf("codec marshaler implementations not match, a: %v, b: %v", aMarImpl, bMarImpl) + return yes, reason + } + + aUMarImpl := atyp.Implements(codecs[i].unmarshaler) + bUMarImpl := btyp.Implements(codecs[i].unmarshaler) + if aUMarImpl != bUMarImpl { + reason = fmt.Sprintf("codec unmarshaler implementations not match, a: %v, b: %v", aMarImpl, bMarImpl) + return yes, reason + } + } + } + + switch akind { + case reflect.Bool: + fallthrough + + case reflect.Int, + reflect.Int8, + reflect.Int16, + reflect.Int32, + reflect.Int64: + fallthrough + + case reflect.Uint, + reflect.Uint8, + reflect.Uint16, + reflect.Uint32, + reflect.Uint64: + fallthrough + + case reflect.Float32, reflect.Float64: + fallthrough + + case reflect.Complex64, reflect.Complex128: + fallthrough + + case reflect.String: + yes = true + + case reflect.Array: + if atyp.Len() != btyp.Len() { + reason = fmt.Sprintf("arrays with different length: %d != %d", atyp.Len(), btyp.Len()) + break + } + + elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, ordered) + if !elemMatch { + reason = fmt.Sprintf("array element not match: %s", elemReason) + break + } + + yes = true + + case reflect.Map: + keyMatch, keyReason := Similar(atyp.Key(), btyp.Key(), codecFlag, ordered) + if !keyMatch { + reason = fmt.Sprintf("map key not match: %s", keyReason) + break + } + + valueMatch, valueReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, ordered) + if !valueMatch { + reason = fmt.Sprintf("map value not match: %s", valueReason) + break + } + + yes = true + + case reflect.Ptr: + elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, ordered) + if !elemMatch { + reason = fmt.Sprintf("elem of ptr not match: %s", elemReason) + break + } + + yes = true + + case reflect.Slice: + elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, ordered) + if !elemMatch { + reason = fmt.Sprintf("slice element not match: %s", elemReason) + break + } + + yes = true + + case reflect.Struct: + fieldsMatch, fieldsReason := fieldsSimilar(atyp, btyp, codecFlag, ordered) + if !fieldsMatch { + reason = fmt.Sprintf("exported fields not match: %s", fieldsReason) + break + } + + yes = true + + case reflect.Interface: + methsMatch, methsReason := methodsSimilar(atyp, btyp, codecFlag, ordered) + if !methsMatch { + reason = fmt.Sprintf("exported methods not match: %s", methsReason) + break + } + + yes = true + + case reflect.Chan: + adir := atyp.ChanDir() + bdir := btyp.ChanDir() + if adir != bdir { + reason = fmt.Sprintf("chan dir not match, %d != %d", adir, bdir) + break + } + + elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, ordered) + if !elemMatch { + reason = fmt.Sprintf("chan element not match: %s", elemReason) + break + } + + yes = true + + case reflect.Func: + yes, reason = funcSimilar(atyp, btyp, codecFlag, ordered) + + default: + reason = fmt.Sprintf("unexpected type kind %s", akind) + } + + return yes, reason +} + +func funcSimilar(atyp, btyp reflect.Type, codecFlag CodecFlag, ordered Ordered) (bool, string) { + aNumIn := atyp.NumIn() + bNumIn := btyp.NumIn() + if aNumIn != bNumIn { + return false, fmt.Sprintf("num of inputs not match, %d != %d", aNumIn, bNumIn) + } + + aNumOut := atyp.NumOut() + bNumOut := btyp.NumOut() + if aNumOut != bNumOut { + return false, fmt.Sprintf("num of outputs not match, %d != %d", aNumOut, bNumOut) + } + + for i := 0; i < aNumIn; i++ { + inMatch, inReason := Similar(atyp.In(i), btyp.In(i), codecFlag, ordered) + if !inMatch { + return false, fmt.Sprintf("#%d input not match: %s", i, inReason) + } + } + + for i := 0; i < aNumOut; i++ { + outMatch, outReason := Similar(atyp.Out(i), btyp.Out(i), codecFlag, ordered) + if !outMatch { + return false, fmt.Sprintf("#%d output not match: %s", i, outReason) + } + } + + return true, "" +} + +func fieldsSimilar(a, b reflect.Type, codecFlag CodecFlag, ordered Ordered) (bool, string) { + afields, err := ExportedFields(a) + if err != nil { + return false, err.Error() + } + + bfields, err := ExportedFields(b) + if err != nil { + return false, err.Error() + } + + if len(afields) != len(bfields) { + return false, fmt.Sprintf("fields count not match, %d != %d", len(afields), len(bfields)) + } + + if ordered|StructFieldsOrdered != 0 { + for i := range afields { + yes, reason := Similar(afields[i].Type, bfields[i].Type, codecFlag, ordered) + if !yes { + return false, fmt.Sprintf("#%d field not match: %s", i, reason) + } + } + + return true, "" + } + + mfields := map[string]reflect.Type{} + for i := range afields { + mfields[afields[i].Name] = afields[i].Type + } + + for i := range bfields { + f := bfields[i] + typ, has := mfields[f.Name] + if !has { + return false, fmt.Sprintf("named field %s of %s not found", f.Name, b) + } + + yes, reason := Similar(typ, f.Type, codecFlag, ordered) + if !yes { + return false, fmt.Sprintf("named field %s not match: %s", f.Name, reason) + } + } + + return true, "" +} + +func methodsSimilar(a, b reflect.Type, codecFlag CodecFlag, ordered Ordered) (bool, string) { + ameths, err := ExportedMethods(a) + if err != nil { + return false, err.Error() + } + + bmeths, err := ExportedMethods(b) + if err != nil { + return false, err.Error() + } + + if len(ameths) != len(bmeths) { + return false, fmt.Sprintf("methods count not match, %d != %d", len(ameths), len(bmeths)) + } + + if ordered|InterfaceMethodsOrdered != 0 { + for i := range ameths { + yes, reason := Similar(ameths[i].Type, bmeths[i].Type, codecFlag, ordered) + if !yes { + return false, fmt.Sprintf("#%d method not match: %s", i, reason) + } + } + + return true, "" + } + + mmeths := map[string]reflect.Type{} + for i := range ameths { + mmeths[ameths[i].Name] = ameths[i].Type + } + + for i := range bmeths { + f := bmeths[i] + typ, has := mmeths[f.Name] + if !has { + return false, fmt.Sprintf("named method %s of %s not found", f.Name, b) + } + + yes, reason := Similar(typ, f.Type, codecFlag, ordered) + if !yes { + return false, fmt.Sprintf("named method %s not match: %s", f.Name, reason) + } + } + + return true, "" +} diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index 991e272da4..65199d3e87 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -3,10 +3,11 @@ module github.com/filecoin-project/venus/venus-devtool go 1.16 require ( + github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/lotus v1.12.0 - github.com/filecoin-project/specs-actors/v6 v6.0.1 // indirect github.com/filecoin-project/venus/venus-shared v0.0.1 - github.com/urfave/cli/v2 v2.2.0 // indirect + github.com/ipfs/go-ipfs-http-client v0.1.0 // indirect + github.com/urfave/cli/v2 v2.2.0 github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 ) diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index 14f0044def..f4cc1e7562 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -172,6 +172,7 @@ github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f/go.mod h1:rQY github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e h1:lj77EKYUpYXTd8CD/+QMIf8b6OIOTsfEBSXiAzuEHTU= github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e/go.mod h1:3ZQK6DMPSz/QZ73jlWxBtUhNA8xZx7LzUFSq/OfP8vk= github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= @@ -226,7 +227,6 @@ github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f h github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f/go.mod h1:+If3s2VxyjZn+KGGZIoRXBDSFQ9xL404JBJGf4WhEj0= github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= -github.com/filecoin-project/go-address v0.0.5 h1:SSaFT/5aLfPXycUlFyemoHYhRgdyXClXCyDdNJKPlDM= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= @@ -269,6 +269,7 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= +github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec h1:rGI5I7fdU4viManxmDdbk5deZO7afe6L1Wc04dAmlOM= github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= @@ -312,10 +313,10 @@ github.com/filecoin-project/specs-actors/v4 v4.0.1 h1:AiWrtvJZ63MHGe6rn7tPu4nSUY github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= -github.com/filecoin-project/specs-actors/v6 v6.0.0 h1:i+16MFE8GScWWUF0kG7x2RZ5Hqpz0CeyBHTpnijCJ6I= github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -458,6 +459,7 @@ github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51 github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -483,11 +485,13 @@ github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4n github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e/go.mod h1:I8h3MITA53gN9OnWGCgaMa0JWVRdXthWw4M3CPM54OY= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= @@ -607,10 +611,12 @@ github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtL github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= -github.com/ipfs/go-ipfs-cmds v0.1.0 h1:0CEde9EcxByej8+L6d1PST57J4ambRPyCTjLG5Ymou8= github.com/ipfs/go-ipfs-cmds v0.1.0/go.mod h1:TiK4e7/V31tuEb8YWDF8lN3qrnDH+BS7ZqWIeYJlAs8= -github.com/ipfs/go-ipfs-config v0.0.11 h1:5/4nas2CQXiKr2/MLxU24GDGTBvtstQIQezuk7ltOQQ= +github.com/ipfs/go-ipfs-cmds v0.3.0 h1:mi9oYrSCox5aBhutqAYqw6/9crlyGbw4E/aJtwS4zI4= +github.com/ipfs/go-ipfs-cmds v0.3.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= github.com/ipfs/go-ipfs-config v0.0.11/go.mod h1:wveA8UT5ywN26oKStByzmz1CO6cXwLKKM6Jn/Hfw08I= +github.com/ipfs/go-ipfs-config v0.5.3 h1:3GpI/xR9FoJNTjU6YvCMRbYyEi0dBVY5UtlUTcNRlSA= +github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= @@ -628,8 +634,9 @@ github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjN github.com/ipfs/go-ipfs-files v0.0.8 h1:8o0oFJkJ8UkO/ABl8T6ac6tKF3+NIpj67aAB6ZpusRg= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= github.com/ipfs/go-ipfs-flags v0.0.1/go.mod h1:RnXBb9WV53GSfTrSDVK61NLTFKvWc60n+K9EgCDh+rA= -github.com/ipfs/go-ipfs-http-client v0.0.5 h1:niW5M0qqa0O/VRCAzr3f5Y7i3MjTpf0lhpkisjRtHR8= github.com/ipfs/go-ipfs-http-client v0.0.5/go.mod h1:8EKP9RGUrUex4Ff86WhnKU7seEBOtjdgXlY9XHYvYMw= +github.com/ipfs/go-ipfs-http-client v0.1.0 h1:YrJ+/vqmZF1ignpxfHUaJEax7e4tgbaFCTLfIS5yFZY= +github.com/ipfs/go-ipfs-http-client v0.1.0/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= @@ -699,12 +706,14 @@ github.com/ipfs/go-unixfs v0.2.6 h1:gq3U3T2vh8x6tXhfo3uSO3n+2z4yW0tYtNgVP/3sIyA= github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/ipfs/interface-go-ipfs-core v0.2.3 h1:E6uQ+1fJjkxJWlL9lAE72a5FWeyeeNL3GitLy8+jq3Y= github.com/ipfs/interface-go-ipfs-core v0.2.3/go.mod h1:Tihp8zxGpUeE3Tokr94L6zWZZdkRQvG5TL6i9MuNE+s= +github.com/ipfs/interface-go-ipfs-core v0.4.0 h1:+mUiamyHIwedqP8ZgbCIwpy40oX7QcXUbo4CZOeJVJg= +github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= -github.com/ipfs/iptb-plugins v0.2.1 h1:au4HWn9/pRPbkxA08pDx2oRAs4cnbgQWgV0teYXuuGA= github.com/ipfs/iptb-plugins v0.2.1/go.mod h1:QXMbtIWZ+jRsW8a4h13qAKU7jcM7qaittO8wOsTP0Rs= +github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= +github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= @@ -910,8 +919,8 @@ github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.6 h1:3S8g006qG6Tjpj1JdRK2S+TWc2DJQKX/RG9fdLeiLSU= github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= +github.com/libp2p/go-libp2p-core v0.11.0 h1:75jAgdA+IChNa+/mZXogfmrGkgwxkVvxmIC7pV+F6sI= github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= @@ -1447,8 +1456,9 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/cors v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= From 6b7bcdf57e71bf2d26c07577168d281dec085a3b Mon Sep 17 00:00:00 2001 From: dtynn Date: Tue, 30 Nov 2021 17:41:08 +0800 Subject: [PATCH 048/167] impl: typecheck.Similar & tests --- .../compatible/typecheck/fields_test.go | 24 + venus-devtool/compatible/typecheck/methods.go | 5 - .../compatible/typecheck/methods_test.go | 25 + venus-devtool/compatible/typecheck/similar.go | 56 +- .../compatible/typecheck/similar_test.go | 569 ++++++++++++++++++ venus-devtool/go.mod | 1 + 6 files changed, 645 insertions(+), 35 deletions(-) create mode 100644 venus-devtool/compatible/typecheck/fields_test.go create mode 100644 venus-devtool/compatible/typecheck/methods_test.go create mode 100644 venus-devtool/compatible/typecheck/similar_test.go diff --git a/venus-devtool/compatible/typecheck/fields_test.go b/venus-devtool/compatible/typecheck/fields_test.go new file mode 100644 index 0000000000..f164f8a985 --- /dev/null +++ b/venus-devtool/compatible/typecheck/fields_test.go @@ -0,0 +1,24 @@ +package typecheck + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestExportedFields(t *testing.T) { + _, err := ExportedFields(new(int)) + require.Error(t, err, "only allow structs") + + type S struct { + A int + B uint + C bool + d float32 // nolint + _C float64 // nolint + } + + f, err := ExportedFields(S{}) + require.NoError(t, err, "get exported fields") + require.Len(t, f, 3, "exported fields") +} diff --git a/venus-devtool/compatible/typecheck/methods.go b/venus-devtool/compatible/typecheck/methods.go index f69d558444..0592cc05d1 100644 --- a/venus-devtool/compatible/typecheck/methods.go +++ b/venus-devtool/compatible/typecheck/methods.go @@ -1,7 +1,6 @@ package typecheck import ( - "fmt" "go/ast" "reflect" "sync" @@ -20,10 +19,6 @@ func ExportedMethods(obj interface{}) ([]reflect.Method, error) { typ = reflect.TypeOf(obj) } - if kind := typ.Kind(); kind != reflect.Struct && kind != reflect.Interface { - return nil, fmt.Errorf("unexpected type kind %s", kind) - } - exportedMethodsCache.RLock() methods, ok := exportedMethodsCache.methods[typ] exportedMethodsCache.RUnlock() diff --git a/venus-devtool/compatible/typecheck/methods_test.go b/venus-devtool/compatible/typecheck/methods_test.go new file mode 100644 index 0000000000..511bb7512e --- /dev/null +++ b/venus-devtool/compatible/typecheck/methods_test.go @@ -0,0 +1,25 @@ +package typecheck + +import ( + "io" + "reflect" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestExportedMethods(t *testing.T) { + + meths, err := ExportedMethods(reflect.TypeOf((*io.ReadCloser)(nil)).Elem()) + require.NoError(t, err, "get exported methods for io.ReadCloser") + require.Len(t, meths, 2, "exported methods for io.ReadCloser") + + var ci codecInt + meths, err = ExportedMethods(&ci) + require.NoError(t, err, "get exported methods for *codecInt") + require.Len(t, meths, 8, "exported methods for *codecInt") + + meths, err = ExportedMethods(ci) + require.NoError(t, err, "get exported methods for codecInt") + require.Len(t, meths, 4, "exported methods for codecInt") +} diff --git a/venus-devtool/compatible/typecheck/similar.go b/venus-devtool/compatible/typecheck/similar.go index af6efbc307..60dd5c3876 100644 --- a/venus-devtool/compatible/typecheck/similar.go +++ b/venus-devtool/compatible/typecheck/similar.go @@ -37,7 +37,6 @@ type Ordered uint const ( StructFieldsOrdered Ordered = 1 << iota - InterfaceMethodsOrdered ) var ( @@ -74,11 +73,18 @@ type similarResult struct { reason string } +type similarInput struct { + a reflect.Type + b reflect.Type + codecFlag CodecFlag + ordered Ordered +} + var similarCache = struct { sync.RWMutex - results map[[2]reflect.Type]similarResult + results map[similarInput]similarResult }{ - results: make(map[[2]reflect.Type]similarResult), + results: make(map[similarInput]similarResult), } func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, string) { @@ -96,10 +102,18 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, stri return true, "" } + sinput := similarInput{ + a: atyp, + b: btyp, + codecFlag: codecFlag, + ordered: ordered, + } + similarCache.RLock() - res, has := similarCache.results[[2]reflect.Type{atyp, btyp}] + res, has := similarCache.results[sinput] if !has { - res, has = similarCache.results[[2]reflect.Type{btyp, atyp}] + sinput.a, sinput.b = btyp, atyp + res, has = similarCache.results[sinput] } similarCache.RUnlock() @@ -112,7 +126,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, stri defer func() { similarCache.Lock() - similarCache.results[[2]reflect.Type{atyp, btyp}] = similarResult{ + similarCache.results[sinput] = similarResult{ similar: yes, reason: reason, } @@ -129,7 +143,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, stri if codecFlag != 0 { for i := range codecs { - if codecFlag|codecs[i].flag == 0 { + if codecFlag&codecs[i].flag == 0 { continue } @@ -312,7 +326,7 @@ func fieldsSimilar(a, b reflect.Type, codecFlag CodecFlag, ordered Ordered) (boo return false, fmt.Sprintf("fields count not match, %d != %d", len(afields), len(bfields)) } - if ordered|StructFieldsOrdered != 0 { + if ordered&StructFieldsOrdered != 0 { for i := range afields { yes, reason := Similar(afields[i].Type, bfields[i].Type, codecFlag, ordered) if !yes { @@ -359,32 +373,14 @@ func methodsSimilar(a, b reflect.Type, codecFlag CodecFlag, ordered Ordered) (bo return false, fmt.Sprintf("methods count not match, %d != %d", len(ameths), len(bmeths)) } - if ordered|InterfaceMethodsOrdered != 0 { - for i := range ameths { - yes, reason := Similar(ameths[i].Type, bmeths[i].Type, codecFlag, ordered) - if !yes { - return false, fmt.Sprintf("#%d method not match: %s", i, reason) - } - } - - return true, "" - } - - mmeths := map[string]reflect.Type{} for i := range ameths { - mmeths[ameths[i].Name] = ameths[i].Type - } - - for i := range bmeths { - f := bmeths[i] - typ, has := mmeths[f.Name] - if !has { - return false, fmt.Sprintf("named method %s of %s not found", f.Name, b) + if ameths[i].Name != bmeths[i].Name { + return false, fmt.Sprintf("#%d method name not match: %s != %s", i, ameths[i].Name, bmeths[i].Name) } - yes, reason := Similar(typ, f.Type, codecFlag, ordered) + yes, reason := Similar(ameths[i].Type, bmeths[i].Type, codecFlag, ordered) if !yes { - return false, fmt.Sprintf("named method %s not match: %s", f.Name, reason) + return false, fmt.Sprintf("#%d method not match: %s", i, reason) } } diff --git a/venus-devtool/compatible/typecheck/similar_test.go b/venus-devtool/compatible/typecheck/similar_test.go new file mode 100644 index 0000000000..5f0eb03b6c --- /dev/null +++ b/venus-devtool/compatible/typecheck/similar_test.go @@ -0,0 +1,569 @@ +package typecheck + +import ( + "context" + "io" + "reflect" + "testing" + "unsafe" + + "github.com/stretchr/testify/require" +) + +type ABool bool +type AInt int +type AInt8 int8 +type AInt16 int16 +type AInt32 int32 +type AInt64 int64 +type AUInt uint +type AUInt8 uint8 +type AUInt16 uint16 +type AUInt32 uint32 +type AUInt64 uint64 +type AFloat32 float32 +type AFloat64 float64 +type AComplet64 complex64 +type AComplet128 complex128 +type AString string + +type BBool bool +type BInt int +type BInt8 int8 +type BInt16 int16 +type BInt32 int32 +type BInt64 int64 +type BUInt uint +type BUInt8 uint8 +type BUInt16 uint16 +type BUInt32 uint32 +type BUInt64 uint64 +type BFloat32 float32 +type BFloat64 float64 +type BComplet64 complex64 +type BComplet128 complex128 +type BString string + +func TestSimilarSimple(t *testing.T) { + alist := []interface{}{ + new(ABool), + new(AInt), + new(AInt8), + new(AInt16), + new(AInt32), + new(AInt64), + new(AUInt), + new(AUInt8), + new(AUInt16), + new(AUInt32), + new(AUInt64), + new(AFloat32), + new(AFloat64), + new(AComplet64), + new(AComplet128), + new(AString), + } + + blist := []interface{}{ + new(BBool), + new(BInt), + new(BInt8), + new(BInt16), + new(BInt32), + new(BInt64), + new(BUInt), + new(BUInt8), + new(BUInt16), + new(BUInt32), + new(BUInt64), + new(BFloat32), + new(BFloat64), + new(BComplet64), + new(BComplet128), + new(BString), + } + + require.Equal(t, len(alist), len(blist), "values of newed types") + + for i := range alist { + aval, bval := alist[i], blist[i] + + yes, reason := Similar(aval, bval, 0, 0) + require.Truef(t, yes, "similar result for %T <-> %T: %s", aval, bval, reason) + + ratyp, rbtyp := reflect.TypeOf(aval), reflect.TypeOf(bval) + require.Truef(t, ratyp != rbtyp, "not same type: %s vs %s", ratyp, rbtyp) + + yes, reason = Similar(ratyp, rbtyp, 0, 0) + require.Truef(t, yes, "similar result for reflect.Type of %s <-> %s: %s", ratyp, rbtyp, reason) + + yes, reason = Similar(ratyp.Elem(), rbtyp.Elem(), 0, 0) + require.Truef(t, yes, "similar result for reflect.Type of %s <-> %s: %s", ratyp.Elem(), rbtyp.Elem(), reason) + } +} + +type similarCase struct { + val interface{} + why string + codecFlag CodecFlag + ordered Ordered + expected bool +} + +func similarTest(t *testing.T, origin interface{}, cases []similarCase, checkIndirect bool) { + valOrigin := reflect.ValueOf(origin) + typOrigin := valOrigin.Type() + indirect := checkIndirect && reflect.Indirect(valOrigin).Type() != typOrigin + + for i := range cases { + typCase := reflect.TypeOf(cases[i].val) + require.NotEqual(t, typOrigin, typCase, "types should be different") + require.Equal(t, typOrigin.Kind(), typCase.Kind(), "kind should not be different") + + yes, reason := Similar(typOrigin, typCase, cases[i].codecFlag, cases[i].ordered) + require.Equalf(t, cases[i].expected, yes, "expected result of %s <-> %s: %v as a result of %s, got reason: %s", typOrigin, typCase, cases[i].expected, cases[i].why, reason) + + if indirect { + require.Equal(t, typOrigin.Elem().Kind(), typCase.Elem().Kind(), "kind of indirect type should not be different") + + yes, reason = Similar(typOrigin.Elem(), typCase.Elem(), cases[i].codecFlag, cases[i].ordered) + require.Equalf(t, cases[i].expected, yes, "expected result for indirect types %s <-> %s: %v as a result of %s, got reason: %s", typOrigin.Elem(), typCase.Elem(), cases[i].expected, cases[i].why, reason) + } + } +} + +func TestArray(t *testing.T) { + type origin [2]int + type case1 [2]uint + type case2 [3]int + + type case3 [2]AInt + type case4 [3]AInt + + cases := []similarCase{ + { + val: new(case1), + why: "array element", + expected: false, + }, + { + val: new(case2), + why: "array len", + expected: false, + }, + { + val: new(case3), + expected: true, + }, + { + val: new(case4), + why: "array len", + expected: false, + }, + } + + similarTest(t, new(origin), cases, true) +} + +func TestMap(t *testing.T) { + type origin map[string]int + + type case1 map[int]int + type case2 map[string]string + + type case3 map[string]AInt + type case4 map[AString]AInt + + cases := []similarCase{ + { + val: new(case1), + why: "map key", + expected: false, + }, + { + val: new(case2), + why: "map value", + expected: false, + }, + { + val: new(case3), + expected: true, + }, + { + val: new(case4), + expected: true, + }, + } + + similarTest(t, new(origin), cases, true) +} + +func TestSlice(t *testing.T) { + type origin []int + + type case1 []uint + type case2 []string + + type case3 []AInt + + cases := []similarCase{ + { + val: new(case1), + why: "slice element", + expected: false, + }, + { + val: new(case2), + why: "slice element", + expected: false, + }, + { + val: new(case3), + expected: true, + }, + } + + similarTest(t, new(origin), cases, true) +} + +func TestChan(t *testing.T) { + type origin chan int + + type case1 chan uint + type case2 <-chan int + type case3 chan<- int + + type case4 chan AInt + + cases := []similarCase{ + { + val: new(case1), + why: "elem type", + expected: false, + }, + { + val: new(case2), + why: "chan dir", + expected: false, + }, + { + val: new(case3), + why: "chan dir", + expected: false, + }, + { + val: new(case4), + expected: true, + }, + } + + similarTest(t, new(origin), cases, true) +} + +func TestStruct(t *testing.T) { + type origin struct { + A uint + B int + } + + type case1 struct { + C uint + B int + } + + type case2 struct { + B int + A uint + } + + type case3 struct { + B AInt + A AUInt + } + + type case4 struct { + A AUInt + B AInt + a bool // nolint + } + + type case5 struct { + A AUInt + b AInt // nolint + } + + type case6 struct { + A uint + B uint + } + + cases := []similarCase{ + { + val: new(case1), + ordered: StructFieldsOrdered, + expected: true, + }, + { + val: new(case1), + ordered: 0, + why: "name diverse", + expected: false, + }, + { + val: new(case2), + ordered: 0, + expected: true, + }, + { + val: new(case2), + ordered: StructFieldsOrdered, + why: "order not match", + expected: false, + }, + { + val: new(case3), + ordered: 0, + expected: true, + }, + { + val: new(case3), + ordered: StructFieldsOrdered, + why: "order not match", + expected: false, + }, + { + val: new(case4), + ordered: 0, + expected: true, + }, + { + val: new(case4), + ordered: StructFieldsOrdered, + expected: true, + }, + { + val: new(case5), + ordered: 0, + why: "field count", + expected: false, + }, + { + val: new(case5), + ordered: StructFieldsOrdered, + why: "field count", + expected: false, + }, + { + val: new(case6), + ordered: 0, + why: "field type", + expected: false, + }, + { + val: new(case6), + ordered: StructFieldsOrdered, + why: "field type", + expected: false, + }, + } + + similarTest(t, new(origin), cases, true) +} + +func TestInterface(t *testing.T) { + type origin interface { + Read(context.Context) (int, error) + Write(context.Context, []byte) (int, error) + Close(context.Context) error + } + + type case1 interface { + Write(context.Context, []byte) (int, error) + Read(context.Context) (int, error) + Close(context.Context) error + } + + type case2 interface { + Read1(context.Context) (int, error) + Write(context.Context, []byte) (int, error) + Close(context.Context) error + } + + type case3 interface { + Read(context.Context, []byte) (int, error) + Write(context.Context, []byte) (int, error) + Close(context.Context) error + } + + type case4 interface { + Read(context.Context) error + Write(context.Context, []byte) (int, error) + Close(context.Context) error + } + + type Bytes []byte + type case5 interface { + Read(context.Context) (AInt, error) + Write(context.Context, Bytes) (AInt, error) + Close(context.Context) error + } + + type case6 interface { + Read(context.Context) (AInt, error) + Write(context.Context, Bytes) (AInt, error) + } + + type case7 interface { + Read(context.Context) (AUInt, error) + Write(context.Context, Bytes) (AInt, error) + Close(context.Context) error + } + + type case8 interface { + Read(context.Context) (AInt, error) + Write(context.Context, string) (AInt, error) + Close(context.Context) error + } + + cases := []similarCase{ + { + val: new(case1), + expected: true, + }, + { + val: new(case2), + why: "method name", + expected: false, + }, + { + val: new(case3), + why: "in num", + expected: false, + }, + { + val: new(case4), + why: "out num", + expected: false, + }, + { + val: new(case5), + expected: true, + }, + { + val: new(case6), + why: "method num", + expected: false, + }, + { + val: new(case7), + why: "out type", + expected: false, + }, + { + val: new(case8), + why: "in type", + expected: false, + }, + } + + similarTest(t, new(origin), cases, true) +} + +type codecInt int + +func (ci codecInt) MarshalBinary() ([]byte, error) { // nolint + panic("not impl") +} + +func (ci *codecInt) UnmarshalBinary([]byte) error { // nolint + panic("not impl") +} + +func (ci codecInt) MarshalText() ([]byte, error) { // nolint + panic("not impl") +} + +func (ci *codecInt) UnmarshalText([]byte) error { // nolint + panic("not impl") +} + +func (ci codecInt) MarshalJSON() ([]byte, error) { // nolint + panic("not impl") +} + +func (ci *codecInt) UnmarshalJSON([]byte) error { // nolint + panic("not impl") +} + +func (ci codecInt) MarshalCBOR(w io.Writer) error { // nolint + panic("not impl") +} + +func (ci *codecInt) UnmarshalCBOR(r io.Reader) error { // nolint + panic("not impl") +} + +type halfCodecInt int + +func (ci halfCodecInt) MarshalBinary() ([]byte, error) { // nolint + panic("not impl") +} + +func (ci halfCodecInt) MarshalText() ([]byte, error) { // nolint + panic("not impl") +} + +func (ci halfCodecInt) MarshalJSON() ([]byte, error) { // nolint + panic("not impl") +} + +func (ci halfCodecInt) MarshalCBOR(w io.Writer) error { // nolint + panic("not impl") +} + +func TestCodec(t *testing.T) { + cases := []similarCase{ + { + val: new(codecInt), + codecFlag: 0, + expected: true, + }, + { + val: new(codecInt), + codecFlag: BinaryCodec, + why: "binary codec", + expected: false, + }, + { + val: new(codecInt), + codecFlag: TextCodec, + why: "text codec", + expected: false, + }, + { + val: new(codecInt), + codecFlag: JSONCodec, + why: "json codec", + expected: false, + }, + { + val: new(codecInt), + codecFlag: CborCodec, + why: "cbor codec", + expected: false, + }, + } + + similarTest(t, new(AInt), cases, false) + similarTest(t, new(halfCodecInt), cases, false) +} + +func TestUnexpectedKind(t *testing.T) { + type Uintptr uintptr + yes, _ := Similar(new(uintptr), new(Uintptr), 0, 0) + require.False(t, yes, "uintptr is unexpected") + + type UnsafePointer unsafe.Pointer + yes, _ = Similar(new(unsafe.Pointer), new(UnsafePointer), 0, 0) + require.False(t, yes, "unsafe.Pointer is unexpected") +} diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index 65199d3e87..c8ec694e2c 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -7,6 +7,7 @@ require ( github.com/filecoin-project/lotus v1.12.0 github.com/filecoin-project/venus/venus-shared v0.0.1 github.com/ipfs/go-ipfs-http-client v0.1.0 // indirect + github.com/stretchr/testify v1.7.0 // indirect github.com/urfave/cli/v2 v2.2.0 github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 ) From 4ab31d124092f1af78b711fc762cb0594800ef22 Mon Sep 17 00:00:00 2001 From: dtynn Date: Wed, 1 Dec 2021 09:22:13 +0800 Subject: [PATCH 049/167] mv typecheck into venus-shared --- .../compatible/typecheck => venus-shared/typeutil}/fields.go | 0 .../compatible/typecheck => venus-shared/typeutil}/fields_test.go | 0 .../compatible/typecheck => venus-shared/typeutil}/methods.go | 0 .../typecheck => venus-shared/typeutil}/methods_test.go | 0 .../compatible/typecheck => venus-shared/typeutil}/similar.go | 0 .../typecheck => venus-shared/typeutil}/similar_test.go | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename {venus-devtool/compatible/typecheck => venus-shared/typeutil}/fields.go (100%) rename {venus-devtool/compatible/typecheck => venus-shared/typeutil}/fields_test.go (100%) rename {venus-devtool/compatible/typecheck => venus-shared/typeutil}/methods.go (100%) rename {venus-devtool/compatible/typecheck => venus-shared/typeutil}/methods_test.go (100%) rename {venus-devtool/compatible/typecheck => venus-shared/typeutil}/similar.go (100%) rename {venus-devtool/compatible/typecheck => venus-shared/typeutil}/similar_test.go (100%) diff --git a/venus-devtool/compatible/typecheck/fields.go b/venus-shared/typeutil/fields.go similarity index 100% rename from venus-devtool/compatible/typecheck/fields.go rename to venus-shared/typeutil/fields.go diff --git a/venus-devtool/compatible/typecheck/fields_test.go b/venus-shared/typeutil/fields_test.go similarity index 100% rename from venus-devtool/compatible/typecheck/fields_test.go rename to venus-shared/typeutil/fields_test.go diff --git a/venus-devtool/compatible/typecheck/methods.go b/venus-shared/typeutil/methods.go similarity index 100% rename from venus-devtool/compatible/typecheck/methods.go rename to venus-shared/typeutil/methods.go diff --git a/venus-devtool/compatible/typecheck/methods_test.go b/venus-shared/typeutil/methods_test.go similarity index 100% rename from venus-devtool/compatible/typecheck/methods_test.go rename to venus-shared/typeutil/methods_test.go diff --git a/venus-devtool/compatible/typecheck/similar.go b/venus-shared/typeutil/similar.go similarity index 100% rename from venus-devtool/compatible/typecheck/similar.go rename to venus-shared/typeutil/similar.go diff --git a/venus-devtool/compatible/typecheck/similar_test.go b/venus-shared/typeutil/similar_test.go similarity index 100% rename from venus-devtool/compatible/typecheck/similar_test.go rename to venus-shared/typeutil/similar_test.go From d12882bb342dbf01163d8e1ed47337538acd0841 Mon Sep 17 00:00:00 2001 From: dtynn Date: Wed, 1 Dec 2021 09:24:07 +0800 Subject: [PATCH 050/167] rename package --- venus-shared/typeutil/fields.go | 2 +- venus-shared/typeutil/fields_test.go | 2 +- venus-shared/typeutil/methods.go | 2 +- venus-shared/typeutil/methods_test.go | 2 +- venus-shared/typeutil/similar.go | 2 +- venus-shared/typeutil/similar_test.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/venus-shared/typeutil/fields.go b/venus-shared/typeutil/fields.go index 93124e3f01..386d681d4f 100644 --- a/venus-shared/typeutil/fields.go +++ b/venus-shared/typeutil/fields.go @@ -1,4 +1,4 @@ -package typecheck +package typeutil import ( "fmt" diff --git a/venus-shared/typeutil/fields_test.go b/venus-shared/typeutil/fields_test.go index f164f8a985..16b021c32d 100644 --- a/venus-shared/typeutil/fields_test.go +++ b/venus-shared/typeutil/fields_test.go @@ -1,4 +1,4 @@ -package typecheck +package typeutil import ( "testing" diff --git a/venus-shared/typeutil/methods.go b/venus-shared/typeutil/methods.go index 0592cc05d1..fa807db5ec 100644 --- a/venus-shared/typeutil/methods.go +++ b/venus-shared/typeutil/methods.go @@ -1,4 +1,4 @@ -package typecheck +package typeutil import ( "go/ast" diff --git a/venus-shared/typeutil/methods_test.go b/venus-shared/typeutil/methods_test.go index 511bb7512e..139a48e411 100644 --- a/venus-shared/typeutil/methods_test.go +++ b/venus-shared/typeutil/methods_test.go @@ -1,4 +1,4 @@ -package typecheck +package typeutil import ( "io" diff --git a/venus-shared/typeutil/similar.go b/venus-shared/typeutil/similar.go index 60dd5c3876..74da0cdb1d 100644 --- a/venus-shared/typeutil/similar.go +++ b/venus-shared/typeutil/similar.go @@ -1,4 +1,4 @@ -package typecheck +package typeutil import ( "encoding" diff --git a/venus-shared/typeutil/similar_test.go b/venus-shared/typeutil/similar_test.go index 5f0eb03b6c..88d5037fa5 100644 --- a/venus-shared/typeutil/similar_test.go +++ b/venus-shared/typeutil/similar_test.go @@ -1,4 +1,4 @@ -package typecheck +package typeutil import ( "context" From 2cb097a905baa8492b4f7e0e215411f2001cc216 Mon Sep 17 00:00:00 2001 From: dtynn Date: Wed, 1 Dec 2021 12:30:03 +0800 Subject: [PATCH 051/167] impl: similar-check reason info --- venus-shared/typeutil/fields.go | 9 +- venus-shared/typeutil/fields_test.go | 7 +- venus-shared/typeutil/methods.go | 6 +- venus-shared/typeutil/methods_test.go | 9 +- venus-shared/typeutil/similar.go | 111 +++++----- venus-shared/typeutil/similar_reason.go | 83 ++++++++ venus-shared/typeutil/similar_test.go | 272 +++++++++++++----------- 7 files changed, 297 insertions(+), 200 deletions(-) create mode 100644 venus-shared/typeutil/similar_reason.go diff --git a/venus-shared/typeutil/fields.go b/venus-shared/typeutil/fields.go index 386d681d4f..b08346bbdc 100644 --- a/venus-shared/typeutil/fields.go +++ b/venus-shared/typeutil/fields.go @@ -1,7 +1,6 @@ package typeutil import ( - "fmt" "go/ast" "reflect" "sync" @@ -14,14 +13,14 @@ var exportedFieldsCache = struct { fields: make(map[reflect.Type][]reflect.StructField), } -func ExportedFields(obj interface{}) ([]reflect.StructField, error) { +func ExportedFields(obj interface{}) []reflect.StructField { typ, ok := obj.(reflect.Type) if !ok { typ = reflect.TypeOf(obj) } if kind := typ.Kind(); kind != reflect.Struct { - return nil, fmt.Errorf("%s is not struct", typ) + return nil } exportedFieldsCache.RLock() @@ -29,7 +28,7 @@ func ExportedFields(obj interface{}) ([]reflect.StructField, error) { exportedFieldsCache.RUnlock() if ok { - return fields, nil + return fields } num := typ.NumField() @@ -47,5 +46,5 @@ func ExportedFields(obj interface{}) ([]reflect.StructField, error) { exportedFieldsCache.fields[typ] = fields exportedFieldsCache.Unlock() - return fields, nil + return fields } diff --git a/venus-shared/typeutil/fields_test.go b/venus-shared/typeutil/fields_test.go index 16b021c32d..6a3cceca3f 100644 --- a/venus-shared/typeutil/fields_test.go +++ b/venus-shared/typeutil/fields_test.go @@ -7,8 +7,8 @@ import ( ) func TestExportedFields(t *testing.T) { - _, err := ExportedFields(new(int)) - require.Error(t, err, "only allow structs") + f := ExportedFields(new(int)) + require.Nil(t, f, "nil fields for non-struct type") type S struct { A int @@ -18,7 +18,6 @@ func TestExportedFields(t *testing.T) { _C float64 // nolint } - f, err := ExportedFields(S{}) - require.NoError(t, err, "get exported fields") + f = ExportedFields(S{}) require.Len(t, f, 3, "exported fields") } diff --git a/venus-shared/typeutil/methods.go b/venus-shared/typeutil/methods.go index fa807db5ec..f8909f3233 100644 --- a/venus-shared/typeutil/methods.go +++ b/venus-shared/typeutil/methods.go @@ -13,7 +13,7 @@ var exportedMethodsCache = struct { methods: make(map[reflect.Type][]reflect.Method), } -func ExportedMethods(obj interface{}) ([]reflect.Method, error) { +func ExportedMethods(obj interface{}) []reflect.Method { typ, ok := obj.(reflect.Type) if !ok { typ = reflect.TypeOf(obj) @@ -24,7 +24,7 @@ func ExportedMethods(obj interface{}) ([]reflect.Method, error) { exportedMethodsCache.RUnlock() if ok { - return methods, nil + return methods } num := typ.NumMethod() @@ -42,5 +42,5 @@ func ExportedMethods(obj interface{}) ([]reflect.Method, error) { exportedMethodsCache.methods[typ] = methods exportedMethodsCache.Unlock() - return methods, nil + return methods } diff --git a/venus-shared/typeutil/methods_test.go b/venus-shared/typeutil/methods_test.go index 139a48e411..faf27e7bea 100644 --- a/venus-shared/typeutil/methods_test.go +++ b/venus-shared/typeutil/methods_test.go @@ -10,16 +10,13 @@ import ( func TestExportedMethods(t *testing.T) { - meths, err := ExportedMethods(reflect.TypeOf((*io.ReadCloser)(nil)).Elem()) - require.NoError(t, err, "get exported methods for io.ReadCloser") + meths := ExportedMethods(reflect.TypeOf((*io.ReadCloser)(nil)).Elem()) require.Len(t, meths, 2, "exported methods for io.ReadCloser") var ci codecInt - meths, err = ExportedMethods(&ci) - require.NoError(t, err, "get exported methods for *codecInt") + meths = ExportedMethods(&ci) require.Len(t, meths, 8, "exported methods for *codecInt") - meths, err = ExportedMethods(ci) - require.NoError(t, err, "get exported methods for codecInt") + meths = ExportedMethods(ci) require.Len(t, meths, 4, "exported methods for codecInt") } diff --git a/venus-shared/typeutil/similar.go b/venus-shared/typeutil/similar.go index 74da0cdb1d..573710153d 100644 --- a/venus-shared/typeutil/similar.go +++ b/venus-shared/typeutil/similar.go @@ -70,7 +70,7 @@ var ( type similarResult struct { similar bool - reason string + reason *Reason } type similarInput struct { @@ -87,7 +87,7 @@ var similarCache = struct { results: make(map[similarInput]similarResult), } -func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, string) { +func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, *Reason) { atyp, ok := a.(reflect.Type) if !ok { atyp = reflect.TypeOf(a) @@ -99,7 +99,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, stri } if atyp == btyp { - return true, "" + return true, nil } sinput := similarInput{ @@ -122,7 +122,11 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, stri } var yes bool - var reason string + var reason *Reason + + reasonf := makeReasonf(atyp, btyp) + + reasonWrap := makeReasonWrap(atyp, btyp) defer func() { similarCache.Lock() @@ -137,7 +141,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, stri bkind := btyp.Kind() if akind != bkind { - reason = fmt.Sprintf("kinds not match, %s != %s", akind, bkind) + reason = reasonf("%w: %s != %s", ReasonTypeKinds, akind, bkind) return yes, reason } @@ -150,14 +154,14 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, stri aMarImpl := atyp.Implements(codecs[i].marshaler) bMarImpl := btyp.Implements(codecs[i].marshaler) if aMarImpl != bMarImpl { - reason = fmt.Sprintf("codec marshaler implementations not match, a: %v, b: %v", aMarImpl, bMarImpl) + reason = reasonf("%w for codec %d: %v != %v", ReasonCodecMarshalerImplementations, codecs[i].flag, aMarImpl, bMarImpl) return yes, reason } aUMarImpl := atyp.Implements(codecs[i].unmarshaler) bUMarImpl := btyp.Implements(codecs[i].unmarshaler) if aUMarImpl != bUMarImpl { - reason = fmt.Sprintf("codec unmarshaler implementations not match, a: %v, b: %v", aMarImpl, bMarImpl) + reason = reasonf("%w for codec %d: %v; %v", ReasonCodecUnmarshalerImplementations, codecs[i].flag, aUMarImpl, bUMarImpl) return yes, reason } } @@ -187,18 +191,21 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, stri case reflect.Complex64, reflect.Complex128: fallthrough + case reflect.Uintptr, reflect.UnsafePointer: + fallthrough + case reflect.String: yes = true case reflect.Array: if atyp.Len() != btyp.Len() { - reason = fmt.Sprintf("arrays with different length: %d != %d", atyp.Len(), btyp.Len()) + reason = reasonf("%w: %d != %d", ReasonArrayLength, atyp.Len(), btyp.Len()) break } elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, ordered) if !elemMatch { - reason = fmt.Sprintf("array element not match: %s", elemReason) + reason = reasonWrap(elemReason, ReasonArrayElement) break } @@ -207,13 +214,13 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, stri case reflect.Map: keyMatch, keyReason := Similar(atyp.Key(), btyp.Key(), codecFlag, ordered) if !keyMatch { - reason = fmt.Sprintf("map key not match: %s", keyReason) + reason = reasonWrap(keyReason, ReasonMapKey) break } valueMatch, valueReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, ordered) if !valueMatch { - reason = fmt.Sprintf("map value not match: %s", valueReason) + reason = reasonWrap(valueReason, ReasonMapValue) break } @@ -222,7 +229,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, stri case reflect.Ptr: elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, ordered) if !elemMatch { - reason = fmt.Sprintf("elem of ptr not match: %s", elemReason) + reason = reasonWrap(elemReason, ReasonPtrElememnt) break } @@ -231,7 +238,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, stri case reflect.Slice: elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, ordered) if !elemMatch { - reason = fmt.Sprintf("slice element not match: %s", elemReason) + reason = reasonWrap(elemReason, ReasonSliceElement) break } @@ -240,7 +247,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, stri case reflect.Struct: fieldsMatch, fieldsReason := fieldsSimilar(atyp, btyp, codecFlag, ordered) if !fieldsMatch { - reason = fmt.Sprintf("exported fields not match: %s", fieldsReason) + reason = reasonWrap(fieldsReason, ReasonStructField) break } @@ -249,7 +256,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, stri case reflect.Interface: methsMatch, methsReason := methodsSimilar(atyp, btyp, codecFlag, ordered) if !methsMatch { - reason = fmt.Sprintf("exported methods not match: %s", methsReason) + reason = reasonWrap(methsReason, ReasonInterfaceMethod) break } @@ -259,13 +266,13 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, stri adir := atyp.ChanDir() bdir := btyp.ChanDir() if adir != bdir { - reason = fmt.Sprintf("chan dir not match, %d != %d", adir, bdir) + reason = reasonf("%w: %s != %s", ReasonChanDir, adir, bdir) break } elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, ordered) if !elemMatch { - reason = fmt.Sprintf("chan element not match: %s", elemReason) + reason = reasonWrap(elemReason, ReasonChanElement) break } @@ -274,67 +281,69 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, stri case reflect.Func: yes, reason = funcSimilar(atyp, btyp, codecFlag, ordered) - default: - reason = fmt.Sprintf("unexpected type kind %s", akind) } return yes, reason } -func funcSimilar(atyp, btyp reflect.Type, codecFlag CodecFlag, ordered Ordered) (bool, string) { +func funcSimilar(atyp, btyp reflect.Type, codecFlag CodecFlag, ordered Ordered) (bool, *Reason) { + reasonf := makeReasonf(atyp, btyp) + reasonWrap := makeReasonWrap(atyp, btyp) + aNumIn := atyp.NumIn() bNumIn := btyp.NumIn() if aNumIn != bNumIn { - return false, fmt.Sprintf("num of inputs not match, %d != %d", aNumIn, bNumIn) + return false, reasonf("%w: %d != %d", ReasonFuncInNum, aNumIn, bNumIn) } aNumOut := atyp.NumOut() bNumOut := btyp.NumOut() if aNumOut != bNumOut { - return false, fmt.Sprintf("num of outputs not match, %d != %d", aNumOut, bNumOut) + return false, reasonf("%w: %d != %d", ReasonFuncOutNum, aNumOut, bNumOut) } for i := 0; i < aNumIn; i++ { inMatch, inReason := Similar(atyp.In(i), btyp.In(i), codecFlag, ordered) if !inMatch { - return false, fmt.Sprintf("#%d input not match: %s", i, inReason) + return false, reasonWrap(inReason, fmt.Errorf("%w: #%d input", ReasonFuncInType, i)) } } for i := 0; i < aNumOut; i++ { outMatch, outReason := Similar(atyp.Out(i), btyp.Out(i), codecFlag, ordered) if !outMatch { - return false, fmt.Sprintf("#%d output not match: %s", i, outReason) + return false, reasonWrap(outReason, fmt.Errorf("%w: #%d input", ReasonFuncOutType, i)) } } - return true, "" + return true, nil } -func fieldsSimilar(a, b reflect.Type, codecFlag CodecFlag, ordered Ordered) (bool, string) { - afields, err := ExportedFields(a) - if err != nil { - return false, err.Error() - } +func fieldsSimilar(a, b reflect.Type, codecFlag CodecFlag, ordered Ordered) (bool, *Reason) { + reasonf := makeReasonf(a, b) + reasonWrap := makeReasonWrap(a, b) - bfields, err := ExportedFields(b) - if err != nil { - return false, err.Error() - } + afields := ExportedFields(a) + + bfields := ExportedFields(b) if len(afields) != len(bfields) { - return false, fmt.Sprintf("fields count not match, %d != %d", len(afields), len(bfields)) + return false, reasonf("%w: %d != %d", ReasonExportedFieldsCount, len(afields), len(bfields)) } if ordered&StructFieldsOrdered != 0 { for i := range afields { + if afields[i].Name != bfields[i].Name { + return false, reasonf("%w: #%d field, %s != %s", ReasonExportedFieldName, i, afields[i].Name, bfields[i].Name) + } + yes, reason := Similar(afields[i].Type, bfields[i].Type, codecFlag, ordered) if !yes { - return false, fmt.Sprintf("#%d field not match: %s", i, reason) + return false, reasonWrap(reason, fmt.Errorf("%w: #%d field named %s", ReasonExportedFieldType, i, afields[i].Name)) } } - return true, "" + return true, nil } mfields := map[string]reflect.Type{} @@ -346,43 +355,39 @@ func fieldsSimilar(a, b reflect.Type, codecFlag CodecFlag, ordered Ordered) (boo f := bfields[i] typ, has := mfields[f.Name] if !has { - return false, fmt.Sprintf("named field %s of %s not found", f.Name, b) + return false, reasonf("%w: named %s", ReasonExportedFieldNotFound, f.Name) } yes, reason := Similar(typ, f.Type, codecFlag, ordered) if !yes { - return false, fmt.Sprintf("named field %s not match: %s", f.Name, reason) + return false, reasonWrap(reason, fmt.Errorf("%w: named %s", ReasonExportedFieldType, f.Name)) } } - return true, "" + return true, nil } -func methodsSimilar(a, b reflect.Type, codecFlag CodecFlag, ordered Ordered) (bool, string) { - ameths, err := ExportedMethods(a) - if err != nil { - return false, err.Error() - } +func methodsSimilar(a, b reflect.Type, codecFlag CodecFlag, ordered Ordered) (bool, *Reason) { + reasonf := makeReasonf(a, b) + reasonWrap := makeReasonWrap(a, b) - bmeths, err := ExportedMethods(b) - if err != nil { - return false, err.Error() - } + ameths := ExportedMethods(a) + bmeths := ExportedMethods(b) if len(ameths) != len(bmeths) { - return false, fmt.Sprintf("methods count not match, %d != %d", len(ameths), len(bmeths)) + return false, reasonf("%w: %d != %d", ReasonExportedMethodsCount, len(ameths), len(bmeths)) } for i := range ameths { if ameths[i].Name != bmeths[i].Name { - return false, fmt.Sprintf("#%d method name not match: %s != %s", i, ameths[i].Name, bmeths[i].Name) + return false, reasonf("%w: #%d method, %s != %s ", ReasonExportedMethodName, i, ameths[i].Name, bmeths[i].Name) } yes, reason := Similar(ameths[i].Type, bmeths[i].Type, codecFlag, ordered) if !yes { - return false, fmt.Sprintf("#%d method not match: %s", i, reason) + return false, reasonWrap(reason, fmt.Errorf("%w: #%d method named %s", ReasonExportedMethodType, i, ameths[i].Name)) } } - return true, "" + return true, nil } diff --git a/venus-shared/typeutil/similar_reason.go b/venus-shared/typeutil/similar_reason.go new file mode 100644 index 0000000000..de10be2399 --- /dev/null +++ b/venus-shared/typeutil/similar_reason.go @@ -0,0 +1,83 @@ +package typeutil + +import ( + "errors" + "fmt" + "reflect" +) + +func makeReasonf(a, b reflect.Type) func(f string, args ...interface{}) *Reason { + return func(f string, args ...interface{}) *Reason { + wrapfn := makeReasonWrap(a, b) + return wrapfn(nil, fmt.Errorf(f, args...)) + } +} + +func makeReasonWrap(a, b reflect.Type) func(nested *Reason, base error) *Reason { + return func(nested *Reason, base error) *Reason { + return &Reason{ + TypeA: a, + TypeB: b, + Base: base, + Nested: nested, + } + } +} + +type Reason struct { + TypeA reflect.Type + TypeB reflect.Type + Base error + Nested *Reason +} + +func (r *Reason) Error() string { + if r == nil || r.Base == nil { + return "nil" + } + + return fmt.Sprintf("{[%s <> %s] base=%s; nested=%s}", r.TypeA, r.TypeB, r.Base, r.Nested) +} + +func (r *Reason) Is(target error) bool { + if r == nil || r.Base == nil { + return false + } + + return errors.Is(r.Base, target) +} + +func (r *Reason) Unwrap() error { + if r == nil || r.Nested == nil { + return nil + } + + return r.Nested +} + +var ( + ReasonTypeKinds = fmt.Errorf("type kinds") // nolint + ReasonCodecMarshalerImplementations = fmt.Errorf("codec marshaler implementations") // nolint + ReasonCodecUnmarshalerImplementations = fmt.Errorf("codec unmarshaler implementations") // nolint + ReasonArrayLength = fmt.Errorf("array length") // nolint + ReasonArrayElement = fmt.Errorf("array element") // nolint + ReasonMapKey = fmt.Errorf("map key") // nolint + ReasonMapValue = fmt.Errorf("map value") // nolint + ReasonPtrElememnt = fmt.Errorf("pointed type") // nolint + ReasonSliceElement = fmt.Errorf("slice element") // nolint + ReasonStructField = fmt.Errorf("struct field") // nolint + ReasonInterfaceMethod = fmt.Errorf("interface method") // nolint + ReasonChanDir = fmt.Errorf("channel direction") // nolint + ReasonChanElement = fmt.Errorf("channel element") // nolint + ReasonFuncInNum = fmt.Errorf("func in num") // nolint + ReasonFuncOutNum = fmt.Errorf("func out num") // nolint + ReasonFuncInType = fmt.Errorf("func in type") // nolint + ReasonFuncOutType = fmt.Errorf("func out type") // nolint + ReasonExportedFieldsCount = fmt.Errorf("exported fields count") // nolint + ReasonExportedFieldName = fmt.Errorf("exported field name") // nolint + ReasonExportedFieldNotFound = fmt.Errorf("exported field not found") // nolint + ReasonExportedFieldType = fmt.Errorf("exported field type") // nolint + ReasonExportedMethodsCount = fmt.Errorf("exported methods count") // nolint + ReasonExportedMethodName = fmt.Errorf("exported method name") // nolint + ReasonExportedMethodType = fmt.Errorf("exported method type") // nolint +) diff --git a/venus-shared/typeutil/similar_test.go b/venus-shared/typeutil/similar_test.go index 88d5037fa5..29bfaa792c 100644 --- a/venus-shared/typeutil/similar_test.go +++ b/venus-shared/typeutil/similar_test.go @@ -2,6 +2,7 @@ package typeutil import ( "context" + "errors" "io" "reflect" "testing" @@ -26,6 +27,8 @@ type AFloat64 float64 type AComplet64 complex64 type AComplet128 complex128 type AString string +type AUintptr uintptr +type AUnsafePointer unsafe.Pointer type BBool bool type BInt int @@ -43,6 +46,8 @@ type BFloat64 float64 type BComplet64 complex64 type BComplet128 complex128 type BString string +type BUintptr uintptr +type BUnsafePointer unsafe.Pointer func TestSimilarSimple(t *testing.T) { alist := []interface{}{ @@ -62,6 +67,8 @@ func TestSimilarSimple(t *testing.T) { new(AComplet64), new(AComplet128), new(AString), + new(AUintptr), + new(AUnsafePointer), } blist := []interface{}{ @@ -81,6 +88,8 @@ func TestSimilarSimple(t *testing.T) { new(BComplet64), new(BComplet128), new(BString), + new(BUintptr), + new(BUnsafePointer), } require.Equal(t, len(alist), len(blist), "values of newed types") @@ -104,10 +113,9 @@ func TestSimilarSimple(t *testing.T) { type similarCase struct { val interface{} - why string codecFlag CodecFlag ordered Ordered - expected bool + reasons []error } func similarTest(t *testing.T, origin interface{}, cases []similarCase, checkIndirect bool) { @@ -116,18 +124,40 @@ func similarTest(t *testing.T, origin interface{}, cases []similarCase, checkInd indirect := checkIndirect && reflect.Indirect(valOrigin).Type() != typOrigin for i := range cases { + expectedYes := len(cases[i].reasons) == 0 + typCase := reflect.TypeOf(cases[i].val) require.NotEqual(t, typOrigin, typCase, "types should be different") require.Equal(t, typOrigin.Kind(), typCase.Kind(), "kind should not be different") yes, reason := Similar(typOrigin, typCase, cases[i].codecFlag, cases[i].ordered) - require.Equalf(t, cases[i].expected, yes, "expected result of %s <-> %s: %v as a result of %s, got reason: %s", typOrigin, typCase, cases[i].expected, cases[i].why, reason) + + require.Equalf(t, expectedYes, yes, "#%d similar result for %s <> %s", i, typOrigin, typCase) + if expectedYes { + require.Nil(t, reason, "reason should be nil") + } else { + require.NotNil(t, reason, "reason should not be nil") + for ei := range cases[i].reasons { + ce := cases[i].reasons[ei] + require.Truef(t, errors.Is(reason, ce), "for case #%d %s <> %s, reason should contains base %s, actual: %s", i, typOrigin, typCase, ce, reason) + } + } if indirect { require.Equal(t, typOrigin.Elem().Kind(), typCase.Elem().Kind(), "kind of indirect type should not be different") yes, reason = Similar(typOrigin.Elem(), typCase.Elem(), cases[i].codecFlag, cases[i].ordered) - require.Equalf(t, cases[i].expected, yes, "expected result for indirect types %s <-> %s: %v as a result of %s, got reason: %s", typOrigin.Elem(), typCase.Elem(), cases[i].expected, cases[i].why, reason) + + require.Equalf(t, expectedYes, yes, "#%d similar result for %s <> %s", i, typOrigin.Elem(), typCase.Elem()) + if expectedYes { + require.Nil(t, reason, "reason should be nil") + } else { + require.NotNil(t, reason, "reason should not be nil") + for ei := range cases[i].reasons { + ce := cases[i].reasons[ei] + require.Truef(t, errors.Is(reason, ce), "for case #%d %s <> %s, reason should contains base %s, actual: %s", i, typOrigin.Elem(), typCase.Elem(), ce, reason) + } + } } } } @@ -142,23 +172,19 @@ func TestArray(t *testing.T) { cases := []similarCase{ { - val: new(case1), - why: "array element", - expected: false, + val: new(case1), + reasons: []error{ReasonArrayElement}, }, { - val: new(case2), - why: "array len", - expected: false, + val: new(case2), + reasons: []error{ReasonArrayLength}, }, { - val: new(case3), - expected: true, + val: new(case3), }, { - val: new(case4), - why: "array len", - expected: false, + val: new(case4), + reasons: []error{ReasonArrayLength}, }, } @@ -176,22 +202,18 @@ func TestMap(t *testing.T) { cases := []similarCase{ { - val: new(case1), - why: "map key", - expected: false, + val: new(case1), + reasons: []error{ReasonMapKey}, }, { - val: new(case2), - why: "map value", - expected: false, + val: new(case2), + reasons: []error{ReasonMapValue}, }, { - val: new(case3), - expected: true, + val: new(case3), }, { - val: new(case4), - expected: true, + val: new(case4), }, } @@ -208,18 +230,15 @@ func TestSlice(t *testing.T) { cases := []similarCase{ { - val: new(case1), - why: "slice element", - expected: false, + val: new(case1), + reasons: []error{ReasonSliceElement}, }, { - val: new(case2), - why: "slice element", - expected: false, + val: new(case2), + reasons: []error{ReasonSliceElement}, }, { - val: new(case3), - expected: true, + val: new(case3), }, } @@ -237,23 +256,19 @@ func TestChan(t *testing.T) { cases := []similarCase{ { - val: new(case1), - why: "elem type", - expected: false, + val: new(case1), + reasons: []error{ReasonChanElement}, }, { - val: new(case2), - why: "chan dir", - expected: false, + val: new(case2), + reasons: []error{ReasonChanDir}, }, { - val: new(case3), - why: "chan dir", - expected: false, + val: new(case3), + reasons: []error{ReasonChanDir}, }, { - val: new(case4), - expected: true, + val: new(case4), }, } @@ -299,71 +314,60 @@ func TestStruct(t *testing.T) { cases := []similarCase{ { - val: new(case1), - ordered: StructFieldsOrdered, - expected: true, + val: new(case1), + ordered: StructFieldsOrdered, + reasons: []error{ReasonStructField, ReasonExportedFieldName}, }, { - val: new(case1), - ordered: 0, - why: "name diverse", - expected: false, + val: new(case1), + ordered: 0, + reasons: []error{ReasonStructField, ReasonExportedFieldNotFound}, }, { - val: new(case2), - ordered: 0, - expected: true, + val: new(case2), + ordered: StructFieldsOrdered, + reasons: []error{ReasonStructField, ReasonExportedFieldName}, }, { - val: new(case2), - ordered: StructFieldsOrdered, - why: "order not match", - expected: false, + val: new(case2), + ordered: 0, }, { - val: new(case3), - ordered: 0, - expected: true, + val: new(case3), + ordered: StructFieldsOrdered, + reasons: []error{ReasonStructField, ReasonExportedFieldName}, }, { - val: new(case3), - ordered: StructFieldsOrdered, - why: "order not match", - expected: false, + val: new(case3), + ordered: 0, }, { - val: new(case4), - ordered: 0, - expected: true, + val: new(case4), + ordered: 0, }, { - val: new(case4), - ordered: StructFieldsOrdered, - expected: true, + val: new(case4), + ordered: StructFieldsOrdered, }, { - val: new(case5), - ordered: 0, - why: "field count", - expected: false, + val: new(case5), + ordered: 0, + reasons: []error{ReasonStructField, ReasonExportedFieldsCount}, }, { - val: new(case5), - ordered: StructFieldsOrdered, - why: "field count", - expected: false, + val: new(case5), + ordered: StructFieldsOrdered, + reasons: []error{ReasonStructField, ReasonExportedFieldsCount}, }, { - val: new(case6), - ordered: 0, - why: "field type", - expected: false, + val: new(case6), + ordered: 0, + reasons: []error{ReasonStructField, ReasonExportedFieldType}, }, { - val: new(case6), - ordered: StructFieldsOrdered, - why: "field type", - expected: false, + val: new(case6), + ordered: StructFieldsOrdered, + reasons: []error{ReasonStructField, ReasonExportedFieldType}, }, } @@ -425,44 +429,46 @@ func TestInterface(t *testing.T) { Close(context.Context) error } + type case9 interface { + Read(context.Context) (AInt, error) + Write(context.Context, Bytes) (AInt, error) + Close(context.Context) error + read(context.Context) + } + cases := []similarCase{ { - val: new(case1), - expected: true, + val: new(case1), + }, + { + val: new(case2), + reasons: []error{ReasonExportedMethodName}, }, { - val: new(case2), - why: "method name", - expected: false, + val: new(case3), + reasons: []error{ReasonExportedMethodType, ReasonFuncInNum}, }, { - val: new(case3), - why: "in num", - expected: false, + val: new(case4), + reasons: []error{ReasonExportedMethodType, ReasonFuncOutNum}, }, { - val: new(case4), - why: "out num", - expected: false, + val: new(case5), }, { - val: new(case5), - expected: true, + val: new(case6), + reasons: []error{ReasonExportedMethodsCount}, }, { - val: new(case6), - why: "method num", - expected: false, + val: new(case7), + reasons: []error{ReasonExportedMethodType, ReasonFuncOutType}, }, { - val: new(case7), - why: "out type", - expected: false, + val: new(case8), + reasons: []error{ReasonExportedMethodType, ReasonFuncInType}, }, { - val: new(case8), - why: "in type", - expected: false, + val: new(case9), }, } @@ -523,47 +529,55 @@ func (ci halfCodecInt) MarshalCBOR(w io.Writer) error { // nolint func TestCodec(t *testing.T) { cases := []similarCase{ + { + val: new(AInt), + codecFlag: 0, + }, + { + val: new(AInt), + codecFlag: BinaryCodec, + reasons: []error{ReasonCodecMarshalerImplementations}, + }, + { + val: new(AInt), + codecFlag: TextCodec, + reasons: []error{ReasonCodecMarshalerImplementations}, + }, + { + val: new(AInt), + codecFlag: JSONCodec, + reasons: []error{ReasonCodecMarshalerImplementations}, + }, + { + val: new(AInt), + codecFlag: CborCodec, + reasons: []error{ReasonCodecMarshalerImplementations}, + }, { val: new(codecInt), codecFlag: 0, - expected: true, }, { val: new(codecInt), codecFlag: BinaryCodec, - why: "binary codec", - expected: false, + reasons: []error{ReasonCodecUnmarshalerImplementations}, }, { val: new(codecInt), codecFlag: TextCodec, - why: "text codec", - expected: false, + reasons: []error{ReasonCodecUnmarshalerImplementations}, }, { val: new(codecInt), codecFlag: JSONCodec, - why: "json codec", - expected: false, + reasons: []error{ReasonCodecUnmarshalerImplementations}, }, { val: new(codecInt), codecFlag: CborCodec, - why: "cbor codec", - expected: false, + reasons: []error{ReasonCodecUnmarshalerImplementations}, }, } - similarTest(t, new(AInt), cases, false) similarTest(t, new(halfCodecInt), cases, false) } - -func TestUnexpectedKind(t *testing.T) { - type Uintptr uintptr - yes, _ := Similar(new(uintptr), new(Uintptr), 0, 0) - require.False(t, yes, "uintptr is unexpected") - - type UnsafePointer unsafe.Pointer - yes, _ = Similar(new(unsafe.Pointer), new(UnsafePointer), 0, 0) - require.False(t, yes, "unsafe.Pointer is unexpected") -} From accd85e29e977f2f7cf610c83dc6b0ddd027abd7 Mon Sep 17 00:00:00 2001 From: dtynn Date: Wed, 1 Dec 2021 13:10:06 +0800 Subject: [PATCH 052/167] duplicate v0 apis --- {app/client/apiface => venus-shared/api/chain/v0}/blockservice.go | 0 {app/client/apiface => venus-shared/api/chain/v0}/blockstore.go | 0 {app/client/apiface => venus-shared/api/chain/v0}/chain.go | 0 {app/client/apiface => venus-shared/api/chain/v0}/config.go | 0 {app/client/apiface => venus-shared/api/chain/v0}/discovery.go | 0 {app/client/apiface => venus-shared/api/chain/v0}/fullnode.go | 0 {app/client/apiface => venus-shared/api/chain/v0}/jwtauth.go | 0 {app/client/apiface => venus-shared/api/chain/v0}/market.go | 0 {app/client/apiface => venus-shared/api/chain/v0}/mining.go | 0 {app/client/apiface => venus-shared/api/chain/v0}/mpool.go | 0 {app/client/apiface => venus-shared/api/chain/v0}/multisig.go | 0 {app/client/apiface => venus-shared/api/chain/v0}/network.go | 0 {app/client/apiface => venus-shared/api/chain/v0}/paych.go | 0 {app/client/apiface => venus-shared/api/chain/v0}/syncer.go | 0 {app/client/apiface => venus-shared/api/chain/v0}/wallet.go | 0 15 files changed, 0 insertions(+), 0 deletions(-) rename {app/client/apiface => venus-shared/api/chain/v0}/blockservice.go (100%) rename {app/client/apiface => venus-shared/api/chain/v0}/blockstore.go (100%) rename {app/client/apiface => venus-shared/api/chain/v0}/chain.go (100%) rename {app/client/apiface => venus-shared/api/chain/v0}/config.go (100%) rename {app/client/apiface => venus-shared/api/chain/v0}/discovery.go (100%) rename {app/client/apiface => venus-shared/api/chain/v0}/fullnode.go (100%) rename {app/client/apiface => venus-shared/api/chain/v0}/jwtauth.go (100%) rename {app/client/apiface => venus-shared/api/chain/v0}/market.go (100%) rename {app/client/apiface => venus-shared/api/chain/v0}/mining.go (100%) rename {app/client/apiface => venus-shared/api/chain/v0}/mpool.go (100%) rename {app/client/apiface => venus-shared/api/chain/v0}/multisig.go (100%) rename {app/client/apiface => venus-shared/api/chain/v0}/network.go (100%) rename {app/client/apiface => venus-shared/api/chain/v0}/paych.go (100%) rename {app/client/apiface => venus-shared/api/chain/v0}/syncer.go (100%) rename {app/client/apiface => venus-shared/api/chain/v0}/wallet.go (100%) diff --git a/app/client/apiface/blockservice.go b/venus-shared/api/chain/v0/blockservice.go similarity index 100% rename from app/client/apiface/blockservice.go rename to venus-shared/api/chain/v0/blockservice.go diff --git a/app/client/apiface/blockstore.go b/venus-shared/api/chain/v0/blockstore.go similarity index 100% rename from app/client/apiface/blockstore.go rename to venus-shared/api/chain/v0/blockstore.go diff --git a/app/client/apiface/chain.go b/venus-shared/api/chain/v0/chain.go similarity index 100% rename from app/client/apiface/chain.go rename to venus-shared/api/chain/v0/chain.go diff --git a/app/client/apiface/config.go b/venus-shared/api/chain/v0/config.go similarity index 100% rename from app/client/apiface/config.go rename to venus-shared/api/chain/v0/config.go diff --git a/app/client/apiface/discovery.go b/venus-shared/api/chain/v0/discovery.go similarity index 100% rename from app/client/apiface/discovery.go rename to venus-shared/api/chain/v0/discovery.go diff --git a/app/client/apiface/fullnode.go b/venus-shared/api/chain/v0/fullnode.go similarity index 100% rename from app/client/apiface/fullnode.go rename to venus-shared/api/chain/v0/fullnode.go diff --git a/app/client/apiface/jwtauth.go b/venus-shared/api/chain/v0/jwtauth.go similarity index 100% rename from app/client/apiface/jwtauth.go rename to venus-shared/api/chain/v0/jwtauth.go diff --git a/app/client/apiface/market.go b/venus-shared/api/chain/v0/market.go similarity index 100% rename from app/client/apiface/market.go rename to venus-shared/api/chain/v0/market.go diff --git a/app/client/apiface/mining.go b/venus-shared/api/chain/v0/mining.go similarity index 100% rename from app/client/apiface/mining.go rename to venus-shared/api/chain/v0/mining.go diff --git a/app/client/apiface/mpool.go b/venus-shared/api/chain/v0/mpool.go similarity index 100% rename from app/client/apiface/mpool.go rename to venus-shared/api/chain/v0/mpool.go diff --git a/app/client/apiface/multisig.go b/venus-shared/api/chain/v0/multisig.go similarity index 100% rename from app/client/apiface/multisig.go rename to venus-shared/api/chain/v0/multisig.go diff --git a/app/client/apiface/network.go b/venus-shared/api/chain/v0/network.go similarity index 100% rename from app/client/apiface/network.go rename to venus-shared/api/chain/v0/network.go diff --git a/app/client/apiface/paych.go b/venus-shared/api/chain/v0/paych.go similarity index 100% rename from app/client/apiface/paych.go rename to venus-shared/api/chain/v0/paych.go diff --git a/app/client/apiface/syncer.go b/venus-shared/api/chain/v0/syncer.go similarity index 100% rename from app/client/apiface/syncer.go rename to venus-shared/api/chain/v0/syncer.go diff --git a/app/client/apiface/wallet.go b/venus-shared/api/chain/v0/wallet.go similarity index 100% rename from app/client/apiface/wallet.go rename to venus-shared/api/chain/v0/wallet.go From 92cf2a6f7102e4e952ca91d3c491b31c4f694265 Mon Sep 17 00:00:00 2001 From: dtynn Date: Wed, 1 Dec 2021 13:10:57 +0800 Subject: [PATCH 053/167] checkout app/client/apiface --- app/client/apiface/blockservice.go | 19 +++ app/client/apiface/blockstore.go | 20 +++ app/client/apiface/chain.go | 215 +++++++++++++++++++++++++++++ app/client/apiface/config.go | 10 ++ app/client/apiface/discovery.go | 4 + app/client/apiface/fullnode.go | 31 +++++ app/client/apiface/jwtauth.go | 13 ++ app/client/apiface/market.go | 13 ++ app/client/apiface/mining.go | 16 +++ app/client/apiface/mpool.go | 69 +++++++++ app/client/apiface/multisig.go | 39 ++++++ app/client/apiface/network.go | 35 +++++ app/client/apiface/paych.go | 101 ++++++++++++++ app/client/apiface/syncer.go | 28 ++++ app/client/apiface/wallet.go | 44 ++++++ 15 files changed, 657 insertions(+) create mode 100644 app/client/apiface/blockservice.go create mode 100644 app/client/apiface/blockstore.go create mode 100644 app/client/apiface/chain.go create mode 100644 app/client/apiface/config.go create mode 100644 app/client/apiface/discovery.go create mode 100644 app/client/apiface/fullnode.go create mode 100644 app/client/apiface/jwtauth.go create mode 100644 app/client/apiface/market.go create mode 100644 app/client/apiface/mining.go create mode 100644 app/client/apiface/mpool.go create mode 100644 app/client/apiface/multisig.go create mode 100644 app/client/apiface/network.go create mode 100644 app/client/apiface/paych.go create mode 100644 app/client/apiface/syncer.go create mode 100644 app/client/apiface/wallet.go diff --git a/app/client/apiface/blockservice.go b/app/client/apiface/blockservice.go new file mode 100644 index 0000000000..628d5ab78b --- /dev/null +++ b/app/client/apiface/blockservice.go @@ -0,0 +1,19 @@ +package apiface + +import ( + "context" + "github.com/ipfs/go-cid" + ipld "github.com/ipfs/go-ipld-format" + "io" +) + +type IDagService interface { + // Rule[perm:read] + DAGGetNode(ctx context.Context, ref string) (interface{}, error) + // Rule[perm:read] + DAGGetFileSize(ctx context.Context, c cid.Cid) (uint64, error) + // Rule[perm:read] + DAGCat(ctx context.Context, c cid.Cid) (io.Reader, error) + // Rule[perm:read] + DAGImportData(ctx context.Context, data io.Reader) (ipld.Node, error) +} diff --git a/app/client/apiface/blockstore.go b/app/client/apiface/blockstore.go new file mode 100644 index 0000000000..3252fd303c --- /dev/null +++ b/app/client/apiface/blockstore.go @@ -0,0 +1,20 @@ +package apiface + +import ( + "context" + + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/app/submodule/apitypes" +) + +type IBlockStore interface { + // Rule[perm:read] + ChainReadObj(ctx context.Context, ocid cid.Cid) ([]byte, error) + // Rule[perm:read] + ChainDeleteObj(ctx context.Context, obj cid.Cid) error + // Rule[perm:read] + ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) + // Rule[perm:read] + ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (apitypes.ObjStat, error) +} diff --git a/app/client/apiface/chain.go b/app/client/apiface/chain.go new file mode 100644 index 0000000000..0b87a6c58e --- /dev/null +++ b/app/client/apiface/chain.go @@ -0,0 +1,215 @@ +package apiface + +import ( + "context" + "time" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" + "github.com/filecoin-project/venus/app/submodule/apitypes" + "github.com/filecoin-project/venus/pkg/chain" + "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" + + "github.com/filecoin-project/go-state-types/big" + acrypto "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/network" + "github.com/ipfs/go-cid" +) + +type IChain interface { + IAccount + IActor + IBeacon + IMinerState + IChainInfo +} + +type IAccount interface { + // Rule[perm:read] + StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) +} + +type IActor interface { + // Rule[perm:read] + StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) + // Rule[perm:read] + ListActor(ctx context.Context) (map[address.Address]*types.Actor, error) +} + +type IBeacon interface { + // Rule[perm:read] + BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) +} + +type IChainInfo interface { + // Rule[perm:read] + BlockTime(ctx context.Context) time.Duration + // Rule[perm:read] + ChainList(ctx context.Context, tsKey types.TipSetKey, count int) ([]types.TipSetKey, error) + // Rule[perm:read] + ChainHead(ctx context.Context) (*types.TipSet, error) + // Rule[perm:read] + ChainSetHead(ctx context.Context, key types.TipSetKey) error + // Rule[perm:read] + ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) + // Rule[perm:read] + ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) + // Rule[perm:read] + ChainGetTipSetAfterHeight(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) + // Rule[perm:read] + ChainGetRandomnessFromBeacon(ctx context.Context, key types.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) + // Rule[perm:read] + ChainGetRandomnessFromTickets(ctx context.Context, tsk types.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) + // Rule[perm:read] + StateGetRandomnessFromTickets(ctx context.Context, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) + // Rule[perm:read] + StateGetRandomnessFromBeacon(ctx context.Context, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) + // Rule[perm:read] + ChainGetBlock(ctx context.Context, id cid.Cid) (*types.BlockHeader, error) + // Rule[perm:read] + ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.UnsignedMessage, error) + // Rule[perm:read] + ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*apitypes.BlockMessages, error) + // Rule[perm:read] + ChainGetMessagesInTipset(ctx context.Context, key types.TipSetKey) ([]apitypes.Message, error) + // Rule[perm:read] + ChainGetReceipts(ctx context.Context, id cid.Cid) ([]types.MessageReceipt, error) + // Rule[perm:read] + ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]apitypes.Message, error) + // Rule[perm:read] + ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) + // Rule[perm:read] + StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) + // Rule[perm:read] + StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) + // Rule[perm:read] + ChainNotify(ctx context.Context) <-chan []*chain.HeadChange + // Rule[perm:read] + GetFullBlock(ctx context.Context, id cid.Cid) (*types.FullBlock, error) + // Rule[perm:read] + GetActor(ctx context.Context, addr address.Address) (*types.Actor, error) + // Rule[perm:read] + GetParentStateRootActor(ctx context.Context, ts *types.TipSet, addr address.Address) (*types.Actor, error) + // Rule[perm:read] + GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*types.BeaconEntry, error) + // Rule[perm:read] + MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*chain.ChainMessage, error) + // Rule[perm:read] + ProtocolParameters(ctx context.Context) (*apitypes.ProtocolParams, error) + // Rule[perm:read] + ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) + // Rule[perm:read] + StateNetworkName(ctx context.Context) (apitypes.NetworkName, error) + // StateSearchMsg looks back up to limit epochs in the chain for a message, and returns its receipt and the tipset where it was executed + // + // NOTE: If a replacing message is found on chain, this method will return + // a MsgLookup for the replacing message - the MsgLookup.Message will be a different + // CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the + // result of the execution of the replacing message. + // + // If the caller wants to ensure that exactly the requested message was executed, + // they must check that MsgLookup.Message is equal to the provided 'cid', or set the + // `allowReplaced` parameter to false. Without this check, and with `allowReplaced` + // set to true, both the requested and original message may appear as + // successfully executed on-chain, which may look like a double-spend. + // + // A replacing message is a message with a different CID, any of Gas values, and + // different signature, but with all other parameters matching (source/destination, + // nonce, params, etc.) + // Rule[perm:read] + StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) + // StateWaitMsg looks back up to limit epochs in the chain for a message. + // If not found, it blocks until the message arrives on chain, and gets to the + // indicated confidence depth. + // + // NOTE: If a replacing message is found on chain, this method will return + // a MsgLookup for the replacing message - the MsgLookup.Message will be a different + // CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the + // result of the execution of the replacing message. + // + // If the caller wants to ensure that exactly the requested message was executed, + // they must check that MsgLookup.Message is equal to the provided 'cid', or set the + // `allowReplaced` parameter to false. Without this check, and with `allowReplaced` + // set to true, both the requested and original message may appear as + // successfully executed on-chain, which may look like a double-spend. + // + // A replacing message is a message with a different CID, any of Gas values, and + // different signature, but with all other parameters matching (source/destination, + // nonce, params, etc.) + // Rule[perm:read] + StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) + // Rule[perm:read] + StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) + // Rule[perm:read] + VerifyEntry(parent, child *types.BeaconEntry, height abi.ChainEpoch) bool + // Rule[perm:read] + ChainExport(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []byte, error) + // Rule[perm:read] + ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*chain.HeadChange, error) +} + +type IMinerState interface { + // Rule[perm:read] + StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) + // Rule[perm:read] + StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) + // Rule[perm:read] + StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) + // Rule[perm:read] + StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorLocation, error) + // Rule[perm:read] + StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (abi.SectorSize, error) + // Rule[perm:read] + StateMinerInfo(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) + // Rule[perm:read] + StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (address.Address, error) + // Rule[perm:read] + StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) + // Rule[perm:read] + StateMinerFaults(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) + // Rule[perm:read] + StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) + // Rule[perm:read] + StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]apitypes.Partition, error) + // Rule[perm:read] + StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]apitypes.Deadline, error) + // Rule[perm:read] + StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) + // Rule[perm:read] + StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*apitypes.MarketDeal, error) + // Rule[perm:read] + StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) + // Rule[perm:read] + StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) + // Rule[perm:read] + StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (chain.CirculatingSupply, error) + // Rule[perm:read] + StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) + // Rule[perm:read] + StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) + // Rule[perm:read] + StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) + // Rule[perm:read] + StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) + // Rule[perm:read] + StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) + // Rule[perm:read] + StateListActors(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) + // Rule[perm:read] + StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*apitypes.MinerPower, error) + // Rule[perm:read] + StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) + // Rule[perm:read] + StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorExpiration, error) + // Rule[perm:read] + StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (apitypes.MinerSectors, error) + // Rule[perm:read] + StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (apitypes.MarketBalance, error) + // Rule[perm:read] + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (apitypes.DealCollateralBounds, error) + // Rule[perm:read] + StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) +} diff --git a/app/client/apiface/config.go b/app/client/apiface/config.go new file mode 100644 index 0000000000..323ce38ba3 --- /dev/null +++ b/app/client/apiface/config.go @@ -0,0 +1,10 @@ +package apiface + +import "context" + +type IConfig interface { + // Rule[perm:read] + ConfigSet(ctx context.Context, dottedPath string, paramJSON string) error + // Rule[perm:read] + ConfigGet(ctx context.Context, dottedPath string) (interface{}, error) +} diff --git a/app/client/apiface/discovery.go b/app/client/apiface/discovery.go new file mode 100644 index 0000000000..8a22c380e2 --- /dev/null +++ b/app/client/apiface/discovery.go @@ -0,0 +1,4 @@ +package apiface + +type IDiscovery interface { +} diff --git a/app/client/apiface/fullnode.go b/app/client/apiface/fullnode.go new file mode 100644 index 0000000000..7e1e1c1f99 --- /dev/null +++ b/app/client/apiface/fullnode.go @@ -0,0 +1,31 @@ +/* +in api interface, you can add comment tags to the function +Note: +Rule[perm:admin,ignore:true] +perm: read,write,sign,admin +jwt token permission check +ignore: bool +the func in the api whether needs to be added to the client for external exposure + +TODO: +1. Support global FUNC injection + +*/ +package apiface + +type FullNode interface { + IDagService + IBlockStore + IChain + IConfig + IDiscovery + IMarket + IMining + IMessagePool + IMultiSig + INetwork + IPaychan + ISyncer + IWallet + IJwtAuthAPI +} diff --git a/app/client/apiface/jwtauth.go b/app/client/apiface/jwtauth.go new file mode 100644 index 0000000000..705864d690 --- /dev/null +++ b/app/client/apiface/jwtauth.go @@ -0,0 +1,13 @@ +package apiface + +import ( + "context" + "github.com/filecoin-project/go-jsonrpc/auth" +) + +type IJwtAuthAPI interface { + // Rule[perm:read] + Verify(ctx context.Context, host, token string) ([]auth.Permission, error) + // Rule[perm:read] + AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) +} diff --git a/app/client/apiface/market.go b/app/client/apiface/market.go new file mode 100644 index 0000000000..3a88cbfab1 --- /dev/null +++ b/app/client/apiface/market.go @@ -0,0 +1,13 @@ +package apiface + +import ( + "context" + + "github.com/filecoin-project/venus/app/submodule/apitypes" + "github.com/filecoin-project/venus/pkg/types" +) + +type IMarket interface { + // Rule[perm:read] + StateMarketParticipants(ctx context.Context, tsk types.TipSetKey) (map[string]apitypes.MarketBalance, error) //perm:admin +} diff --git a/app/client/apiface/mining.go b/app/client/apiface/mining.go new file mode 100644 index 0000000000..d2b5ae6fe2 --- /dev/null +++ b/app/client/apiface/mining.go @@ -0,0 +1,16 @@ +package apiface + +import ( + "context" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/venus/app/submodule/apitypes" + "github.com/filecoin-project/venus/pkg/types" +) + +type IMining interface { + // Rule[perm:read] + MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*apitypes.MiningBaseInfo, error) + // Rule[perm:read] + MinerCreateBlock(ctx context.Context, bt *apitypes.BlockTemplate) (*types.BlockMsg, error) +} diff --git a/app/client/apiface/mpool.go b/app/client/apiface/mpool.go new file mode 100644 index 0000000000..ecac02dab7 --- /dev/null +++ b/app/client/apiface/mpool.go @@ -0,0 +1,69 @@ +package apiface + +import ( + "context" + + "github.com/filecoin-project/venus/app/submodule/apitypes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/pkg/messagepool" + "github.com/filecoin-project/venus/pkg/types" + "github.com/ipfs/go-cid" +) + +type IMessagePool interface { + // Rule[perm:read] + MpoolDeleteByAdress(ctx context.Context, addr address.Address) error + // Rule[perm:read] + MpoolPublishByAddr(context.Context, address.Address) error + // Rule[perm:read] + MpoolPublishMessage(ctx context.Context, smsg *types.SignedMessage) error + // Rule[perm:read] + MpoolPush(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) + // Rule[perm:read] + MpoolGetConfig(context.Context) (*messagepool.MpoolConfig, error) + // Rule[perm:read] + MpoolSetConfig(ctx context.Context, cfg *messagepool.MpoolConfig) error + // Rule[perm:read] + MpoolSelect(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) + // Rule[perm:read] + MpoolSelects(context.Context, types.TipSetKey, []float64) ([][]*types.SignedMessage, error) + // Rule[perm:read] + MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*types.SignedMessage, error) + // Rule[perm:read] + MpoolClear(ctx context.Context, local bool) error + // Rule[perm:read] + MpoolPushUntrusted(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) + // Rule[perm:read] + MpoolPushMessage(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec) (*types.SignedMessage, error) + // Rule[perm:read] + MpoolBatchPush(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) + // Rule[perm:read] + MpoolBatchPushUntrusted(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) + // Rule[perm:read] + MpoolBatchPushMessage(ctx context.Context, msgs []*types.UnsignedMessage, spec *types.MessageSendSpec) ([]*types.SignedMessage, error) + // Rule[perm:read] + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) + // Rule[perm:read] + MpoolSub(ctx context.Context) (<-chan messagepool.MpoolUpdate, error) + // Rule[perm:read] + GasEstimateMessageGas(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec, tsk types.TipSetKey) (*types.UnsignedMessage, error) + // Rule[perm:read] + GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) + // Rule[perm:read] + GasEstimateFeeCap(ctx context.Context, msg *types.UnsignedMessage, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) + // Rule[perm:read] + GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk types.TipSetKey) (big.Int, error) + // Rule[perm:read] + GasEstimateGasLimit(ctx context.Context, msgIn *types.UnsignedMessage, tsk types.TipSetKey) (int64, error) + // MpoolCheckMessages performs logical checks on a batch of messages + // Rule[perm:read] + MpoolCheckMessages(ctx context.Context, protos []*apitypes.MessagePrototype) ([][]apitypes.MessageCheckStatus, error) + // MpoolCheckPendingMessages performs logical checks for all pending messages from a given address + // Rule[perm:read] + MpoolCheckPendingMessages(ctx context.Context, addr address.Address) ([][]apitypes.MessageCheckStatus, error) + // MpoolCheckReplaceMessages performs logical checks on pending messages with replacement + // Rule[perm:read] + MpoolCheckReplaceMessages(ctx context.Context, msg []*types.Message) ([][]apitypes.MessageCheckStatus, error) +} diff --git a/app/client/apiface/multisig.go b/app/client/apiface/multisig.go new file mode 100644 index 0000000000..7795b4befd --- /dev/null +++ b/app/client/apiface/multisig.go @@ -0,0 +1,39 @@ +package apiface + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/venus/app/submodule/apitypes" + "github.com/filecoin-project/venus/pkg/types" +) + +type IMultiSig interface { + // Rule[perm:read] + MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (*apitypes.MessagePrototype, error) + // Rule[perm:read] + MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) + // Rule[perm:read] + MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*apitypes.MessagePrototype, error) + // Rule[perm:read] + MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*apitypes.MessagePrototype, error) + // Rule[perm:read] + MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*apitypes.MessagePrototype, error) + // Rule[perm:read] + MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*apitypes.MessagePrototype, error) + // Rule[perm:read] + MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*apitypes.MessagePrototype, error) + // Rule[perm:read] + MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*apitypes.MessagePrototype, error) + // Rule[perm:read] + MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*apitypes.MessagePrototype, error) + // Rule[perm:read] + MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) + // Rule[perm:read] + MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) + // Rule[perm:read] + MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*apitypes.MessagePrototype, error) + // Rule[perm:read] + MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) +} diff --git a/app/client/apiface/network.go b/app/client/apiface/network.go new file mode 100644 index 0000000000..db5bf753dd --- /dev/null +++ b/app/client/apiface/network.go @@ -0,0 +1,35 @@ +package apiface + +import ( + "context" + "github.com/filecoin-project/venus/app/submodule/apitypes" + + "github.com/filecoin-project/venus/pkg/net" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/metrics" + "github.com/libp2p/go-libp2p-core/peer" + ma "github.com/multiformats/go-multiaddr" +) + +type INetwork interface { + // Rule[perm:admin] + NetworkGetBandwidthStats(ctx context.Context) metrics.Stats + // Rule[perm:admin] + NetworkGetPeerAddresses(ctx context.Context) []ma.Multiaddr + // Rule[perm:admin] + NetworkGetPeerID(ctx context.Context) peer.ID + // Rule[perm:read] + NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo + // Rule[perm:read] + NetworkGetClosestPeers(ctx context.Context, key string) (<-chan peer.ID, error) + // Rule[perm:read] + NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) + // Rule[perm:read] + NetworkConnect(ctx context.Context, addrs []string) (<-chan net.ConnectionResult, error) + // Rule[perm:read] + NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) + // Rule[perm:read] + Version(context.Context) (apitypes.Version, error) + // Rule[perm:read] + NetAddrsListen(context.Context) (peer.AddrInfo, error) +} diff --git a/app/client/apiface/paych.go b/app/client/apiface/paych.go new file mode 100644 index 0000000000..4c44b2f16b --- /dev/null +++ b/app/client/apiface/paych.go @@ -0,0 +1,101 @@ +package apiface + +import ( + "context" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/app/submodule/apitypes" + "github.com/filecoin-project/venus/pkg/paychmgr" + "github.com/filecoin-project/venus/pkg/types" + + "github.com/filecoin-project/specs-actors/actors/builtin/paych" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-address" +) + +type IPaychan interface { + // PaychGet creates a payment channel to a provider with a amount of FIL + // @from: the payment channel sender + // @to: the payment channel recipient + // @amt: the deposits funds in the payment channel + // Rule[perm:read] + PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*apitypes.ChannelInfo, error) + // PaychAvailableFunds get the status of an outbound payment channel + // @pch: payment channel address + // Rule[perm:read] + PaychAvailableFunds(ctx context.Context, ch address.Address) (*paychmgr.ChannelAvailableFunds, error) + // PaychAvailableFundsByFromTo get the status of an outbound payment channel + // @from: the payment channel sender + // @to: he payment channel recipient + // Rule[perm:read] + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*paychmgr.ChannelAvailableFunds, error) + // PaychGetWaitReady waits until the create channel / add funds message with the sentinel + // @sentinel: given message CID arrives. + // @ch: the returned channel address can safely be used against the Manager methods. + // Rule[perm:read] + PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (address.Address, error) + // PaychAllocateLane Allocate late creates a lane within a payment channel so that calls to + // CreatePaymentVoucher will automatically make vouchers only for the difference in total + // Rule[perm:read] + PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) + // PaychNewPayment aggregate vouchers into a new lane + // @from: the payment channel sender + // @to: the payment channel recipient + // @vouchers: the outstanding (non-redeemed) vouchers + // Rule[perm:read] + PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []apitypes.VoucherSpec) (*apitypes.PaymentInfo, error) + // PaychList list the addresses of all channels that have been created + // Rule[perm:read] + PaychList(ctx context.Context) ([]address.Address, error) + // PaychStatus get the payment channel status + // @pch: payment channel address + // Rule[perm:read] + PaychStatus(ctx context.Context, pch address.Address) (*types.PaychStatus, error) + // PaychSettle update payment channel status to settle + // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain + // @pch: payment channel address + // Rule[perm:read] + PaychSettle(ctx context.Context, addr address.Address) (cid.Cid, error) + // PaychCollect update payment channel status to collect + // Collect sends the value of submitted vouchers to the channel recipient (the provider), + // and refunds the remaining channel balance to the channel creator (the client). + // @pch: payment channel address + // Rule[perm:read] + PaychCollect(ctx context.Context, addr address.Address) (cid.Cid, error) + + // PaychVoucherCheckValid checks if the given voucher is valid (is or could become spendable at some point). + // If the channel is not in the store, fetches the channel from state (and checks that + // the channel To address is owned by the wallet). + // @pch: payment channel address + // @sv: voucher + // Rule[perm:read] + PaychVoucherCheckValid(ctx context.Context, ch address.Address, sv *paych.SignedVoucher) error + // PaychVoucherCheckSpendable checks if the given voucher is currently spendable + // @pch: payment channel address + // @sv: voucher + // Rule[perm:read] + PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (bool, error) + // PaychVoucherAdd adds a voucher for an inbound channel. + // If the channel is not in the store, fetches the channel from state (and checks that + // the channel To address is owned by the wallet). + // Rule[perm:read] + PaychVoucherAdd(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) + // PaychVoucherCreate creates a new signed voucher on the given payment channel + // with the given lane and amount. The value passed in is exactly the value + // that will be used to create the voucher, so if previous vouchers exist, the + // actual additional value of this voucher will only be the difference between + // the two. + // If there are insufficient funds in the channel to create the voucher, + // returns a nil voucher and the shortfall. + // Rule[perm:read] + PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paychmgr.VoucherCreateResult, error) + // PaychVoucherList list vouchers in payment channel + // @pch: payment channel address + // Rule[perm:read] + PaychVoucherList(ctx context.Context, pch address.Address) ([]*paych.SignedVoucher, error) + // PaychVoucherSubmit Submit voucher to chain to update payment channel state + // @pch: payment channel address + // @sv: voucher in payment channel + // Rule[perm:read] + PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) +} diff --git a/app/client/apiface/syncer.go b/app/client/apiface/syncer.go new file mode 100644 index 0000000000..43fe60229e --- /dev/null +++ b/app/client/apiface/syncer.go @@ -0,0 +1,28 @@ +package apiface + +import ( + "context" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/app/submodule/apitypes" + syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" + "github.com/filecoin-project/venus/pkg/types" +) + +type ISyncer interface { + // Rule[perm:read] + ChainSyncHandleNewTipSet(ctx context.Context, ci *types.ChainInfo) error + // Rule[perm:read] + SetConcurrent(ctx context.Context, concurrent int64) error + // Rule[perm:read] + SyncerTracker(ctx context.Context) *syncTypes.TargetTracker + // Rule[perm:read] + Concurrent(ctx context.Context) int64 + // Rule[perm:read] + ChainTipSetWeight(ctx context.Context, tsk types.TipSetKey) (big.Int, error) + // Rule[perm:read] + SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error + // Rule[perm:read] + StateCall(ctx context.Context, msg *types.UnsignedMessage, tsk types.TipSetKey) (*types.InvocResult, error) + // Rule[perm:read] + SyncState(ctx context.Context) (*apitypes.SyncState, error) +} diff --git a/app/client/apiface/wallet.go b/app/client/apiface/wallet.go new file mode 100644 index 0000000000..19c1e27e69 --- /dev/null +++ b/app/client/apiface/wallet.go @@ -0,0 +1,44 @@ +package apiface + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/venus/pkg/crypto" + "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/pkg/wallet" +) + +type IWallet interface { + // Rule[perm:sign] + WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) + // Rule[perm:admin] + WalletExport(addr address.Address, password string) (*crypto.KeyInfo, error) + // Rule[perm:admin] + WalletImport(key *crypto.KeyInfo) (address.Address, error) + // Rule[perm:write] + WalletHas(ctx context.Context, addr address.Address) (bool, error) + // Rule[perm:write] + WalletNewAddress(protocol address.Protocol) (address.Address, error) + // Rule[perm:read] + WalletBalance(ctx context.Context, addr address.Address) (abi.TokenAmount, error) //not exists in remote + // Rule[perm:write] + WalletDefaultAddress(ctx context.Context) (address.Address, error) //not exists in remote + // Rule[perm:admin] + WalletAddresses(ctx context.Context) []address.Address + // Rule[perm:admin] + WalletSetDefault(ctx context.Context, addr address.Address) error //not exists in remote + // Rule[perm:sign] + WalletSignMessage(ctx context.Context, k address.Address, msg *types.UnsignedMessage) (*types.SignedMessage, error) + // Rule[perm:admin] + LockWallet(ctx context.Context) error + // Rule[perm:admin] + UnLockWallet(ctx context.Context, password []byte) error + // Rule[perm:admin] + SetPassword(Context context.Context, password []byte) error + // Rule[perm:admin] + HasPassword(Context context.Context) bool + // Rule[perm:admin] + WalletState(Context context.Context) int +} From 997c990d8ad0e73153a5c2fade2f34874217c982 Mon Sep 17 00:00:00 2001 From: dtynn Date: Wed, 1 Dec 2021 16:21:43 +0800 Subject: [PATCH 054/167] pick fullnode decl --- venus-devtool/compatible/apis/main.go | 51 ++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/venus-devtool/compatible/apis/main.go b/venus-devtool/compatible/apis/main.go index fe8e63cb72..bdebd93533 100644 --- a/venus-devtool/compatible/apis/main.go +++ b/venus-devtool/compatible/apis/main.go @@ -1,11 +1,54 @@ package main import ( - "fmt" - - "github.com/filecoin-project/lotus/api" + "bytes" + "go/ast" + "go/build" + "go/format" + "go/parser" + "go/token" + "log" ) func main() { - fmt.Printf("%T\n", api.FullNode(nil)) + pkg, err := build.Import("github.com/filecoin-project/lotus/api", ".", build.FindOnly) + if err != nil { + log.Fatalln(err) + } + + fset := token.NewFileSet() + p, err := parser.ParseDir(fset, pkg.Dir, nil, parser.AllErrors|parser.ParseComments) + if err != nil { + log.Fatalln(err) + } + + for _, fp := range p { + ast.Inspect(fp, func(n ast.Node) bool { + decl, ok := n.(*ast.GenDecl) + if !ok || decl.Tok != token.TYPE || len(decl.Specs) != 1 { + return true + } + + spec, ok := decl.Specs[0].(*ast.TypeSpec) + if !ok { + return true + } + + _, ok = spec.Type.(*ast.InterfaceType) + if !ok { + return true + } + + if spec.Name.Name == "FullNode" { + log.Println("FullNode found") + var buf bytes.Buffer + if err := format.Node(&buf, fset, n); err != nil { + log.Fatalln(err) + } + + log.Printf("\n%s", buf.String()) + } + return true + }) + } } From 61bccc25e9161ce51d228eba505afcb2b04a03da Mon Sep 17 00:00:00 2001 From: dtynn Date: Wed, 1 Dec 2021 17:23:08 +0800 Subject: [PATCH 055/167] feat: checksum for api.FullNode --- Makefile | 7 +- venus-devtool/compatible/apis/main.go | 99 +++-- .../compatible-checks/api-checksum.txt | 419 ++++++++++++++++++ 3 files changed, 488 insertions(+), 37 deletions(-) create mode 100644 venus-shared/compatible-checks/api-checksum.txt diff --git a/Makefile b/Makefile index d6ae39821f..3be3e2d001 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,12 @@ test-venus-shared: test: test-venus-shared -compatible-all: compatible-actor +compatible-all: compatible-api compatible-actor + +compatible-api: api-checksum + +api-checksum: + cd venus-devtool && go run ./compatible/apis/*.go templates > ../venus-shared/compatible-checks/api-checksum.txt compatible-actor: actor-templates actor-sources actor-render diff --git a/venus-devtool/compatible/apis/main.go b/venus-devtool/compatible/apis/main.go index bdebd93533..0f60d7644a 100644 --- a/venus-devtool/compatible/apis/main.go +++ b/venus-devtool/compatible/apis/main.go @@ -2,53 +2,80 @@ package main import ( "bytes" - "go/ast" - "go/build" - "go/format" - "go/parser" - "go/token" - "log" + "crypto/md5" + "fmt" + "reflect" + "strings" + + "github.com/filecoin-project/lotus/api/v0api" + "github.com/filecoin-project/lotus/api/v1api" ) func main() { - pkg, err := build.Import("github.com/filecoin-project/lotus/api", ".", build.FindOnly) - if err != nil { - log.Fatalln(err) + wants := []reflect.Type{ + reflect.TypeOf((*v0api.FullNode)(nil)).Elem(), + reflect.TypeOf((*v1api.FullNode)(nil)).Elem(), } - fset := token.NewFileSet() - p, err := parser.ParseDir(fset, pkg.Dir, nil, parser.AllErrors|parser.ParseComments) - if err != nil { - log.Fatalln(err) - } + var buf bytes.Buffer + for _, rt := range wants { + fmt.Printf("%s:\n", rt) + for mi := 0; mi < rt.NumMethod(); mi++ { + buf.Reset() + meth := rt.Method(mi) + numIn := meth.Type.NumIn() + numOut := meth.Type.NumOut() - for _, fp := range p { - ast.Inspect(fp, func(n ast.Node) bool { - decl, ok := n.(*ast.GenDecl) - if !ok || decl.Tok != token.TYPE || len(decl.Specs) != 1 { - return true + for ii := 0; ii < numIn; ii++ { + inTyp := meth.Type.In(ii) + fmt.Fprintf(&buf, "\tIn: %s\n", formatType(inTyp)) // nolint } - spec, ok := decl.Specs[0].(*ast.TypeSpec) - if !ok { - return true + for oi := 0; oi < numOut; oi++ { + outTyp := meth.Type.Out(oi) + fmt.Fprintf(&buf, "\tOut: %s\n", formatType(outTyp)) // nolint } - _, ok = spec.Type.(*ast.InterfaceType) - if !ok { - return true - } + fmt.Printf("\t%s:\tIn=%d,\tOut=%d,\tCheckSum=%x\n", meth.Name, numIn, numOut, md5.Sum(buf.Bytes())) + } + fmt.Println() + } +} - if spec.Name.Name == "FullNode" { - log.Println("FullNode found") - var buf bytes.Buffer - if err := format.Node(&buf, fset, n); err != nil { - log.Fatalln(err) - } +func formatType(rt reflect.Type) string { + switch rt.Kind() { + case reflect.Array: + return fmt.Sprintf("[%d]%s", rt.Len(), formatType(rt.Elem())) - log.Printf("\n%s", buf.String()) - } - return true - }) + case reflect.Chan: + return fmt.Sprintf("%s %s", rt.ChanDir(), formatType(rt.Elem())) + + case reflect.Func: + ins := make([]string, rt.NumIn()) + outs := make([]string, rt.NumOut()) + for i := range ins { + ins[i] = formatType(rt.In(i)) + } + + for i := range outs { + outs[i] = formatType(rt.Out(i)) + } + + return fmt.Sprintf("func(%s) (%s)", strings.Join(ins, ", "), strings.Join(outs, ", ")) + + case reflect.Map: + return fmt.Sprintf("map[%s]%s", formatType(rt.Key()), formatType(rt.Elem())) + + case reflect.Ptr: + return fmt.Sprintf("*%s", formatType(rt.Elem())) + + case reflect.Slice: + return fmt.Sprintf("[]%s", formatType(rt.Elem())) + + default: + if p := rt.PkgPath(); p != "" { + return p + "." + rt.Name() + } + return rt.Name() } } diff --git a/venus-shared/compatible-checks/api-checksum.txt b/venus-shared/compatible-checks/api-checksum.txt new file mode 100644 index 0000000000..4b076d1fcd --- /dev/null +++ b/venus-shared/compatible-checks/api-checksum.txt @@ -0,0 +1,419 @@ +v0api.FullNode: + AuthNew: In=2, Out=2, CheckSum=faeef9dc68d6f2533bdf7d8f22ef902d + AuthVerify: In=2, Out=2, CheckSum=3cb63db9d6f8869fd4e9da953cc9cdcb + BeaconGetEntry: In=2, Out=2, CheckSum=c74f5c0f4039207ea45c11bfe3319c38 + ChainDeleteObj: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 + ChainExport: In=4, Out=2, CheckSum=aaf98926e0ba36ec808a96de76a3cd98 + ChainGetBlock: In=2, Out=2, CheckSum=0d2bba23d84a51413bbbebe218dcbcf9 + ChainGetBlockMessages: In=2, Out=2, CheckSum=944437b34bb952bf3d50aa6415c9e0d3 + ChainGetGenesis: In=1, Out=2, CheckSum=6d1e4c4d8184dc8d645a56278f14cfad + ChainGetMessage: In=2, Out=2, CheckSum=d1c0ae931458a2a7b07de152ca3de558 + ChainGetMessagesInTipset: In=2, Out=2, CheckSum=6c0bfa48ffcacdfa9dbed1b9e23ad88e + ChainGetNode: In=2, Out=2, CheckSum=66a718f5dbb8b0fcddcf761b58744e38 + ChainGetParentMessages: In=2, Out=2, CheckSum=e659caaae75cd643a7100b1c8cc3125a + ChainGetParentReceipts: In=2, Out=2, CheckSum=de820c5da3d8d036d854ce42ea9d85a3 + ChainGetPath: In=3, Out=2, CheckSum=a745af1a69b379493504c432b15839e7 + ChainGetRandomnessFromBeacon: In=5, Out=2, CheckSum=555559ae8c2c861ff4a73cd5f5955b25 + ChainGetRandomnessFromTickets: In=5, Out=2, CheckSum=555559ae8c2c861ff4a73cd5f5955b25 + ChainGetTipSet: In=2, Out=2, CheckSum=854d79b3a35822ab54e7459ad95816ad + ChainGetTipSetByHeight: In=3, Out=2, CheckSum=9831731a08357a0247d802268b57a497 + ChainHasObj: In=2, Out=2, CheckSum=7fe71bcffa1b110db106e0104e98a32f + ChainHead: In=1, Out=2, CheckSum=6d1e4c4d8184dc8d645a56278f14cfad + ChainNotify: In=1, Out=2, CheckSum=9525148e93a5b83600ebfbde4d24f3e9 + ChainReadObj: In=2, Out=2, CheckSum=6fd9244d87bf5d14fb5e79b0dbc0940d + ChainSetHead: In=2, Out=1, CheckSum=cdfe593ac791e823186abb77bfad49a0 + ChainStatObj: In=3, Out=2, CheckSum=9db2a0d97998daaf9c15e7c3d6ffe82d + ChainTipSetWeight: In=2, Out=2, CheckSum=22ac180fa0c583b4036666bfc155fd63 + ClientCalcCommP: In=2, Out=2, CheckSum=f83c6f3b9d823d22dfcd13e5aee9fb6b + ClientCancelDataTransfer: In=4, Out=1, CheckSum=074398536c75e25946c7f709574e0cdc + ClientCancelRetrievalDeal: In=2, Out=1, CheckSum=d289f4c3758ed7d6ab991b2cf569c969 + ClientDataTransferUpdates: In=1, Out=2, CheckSum=2d33b419e4b215c06ab0e8b66b5f8430 + ClientDealPieceCID: In=2, Out=2, CheckSum=93537a844ba6b74ec1ce82c887359a75 + ClientDealSize: In=2, Out=2, CheckSum=cca1dd5f58136af28546bdbdef2f948a + ClientFindData: In=3, Out=2, CheckSum=232da9eb987d92a76b37572c8f44bf53 + ClientGenCar: In=3, Out=1, CheckSum=b8a0c89fc2c7c16464ac968865e9c156 + ClientGetDealInfo: In=2, Out=2, CheckSum=e67f0e7b88aff099976b0f275b601c9c + ClientGetDealStatus: In=2, Out=2, CheckSum=1297eb9ae9a9ed209cfcb5899910f415 + ClientGetDealUpdates: In=1, Out=2, CheckSum=459cb2faa373d8dcf4cf8e33a2854366 + ClientGetRetrievalUpdates: In=1, Out=2, CheckSum=9390e4328ba9fe6c034341d574fd6f3d + ClientHasLocal: In=2, Out=2, CheckSum=7fe71bcffa1b110db106e0104e98a32f + ClientImport: In=2, Out=2, CheckSum=8c5886f6f2eb7b5db886d639c62e5808 + ClientListDataTransfers: In=1, Out=2, CheckSum=aa113d3aaf47f5b34fc947d26d58d001 + ClientListDeals: In=1, Out=2, CheckSum=fddf5a2bf3dd94a5aec97248ff7db918 + ClientListImports: In=1, Out=2, CheckSum=1966c3c721d57e0a728d3b51ba3a61d4 + ClientListRetrievals: In=1, Out=2, CheckSum=d5485e62b97cf31e1880d54808968895 + ClientMinerQueryOffer: In=4, Out=2, CheckSum=f57fabb5f04c1086302b43bd5087b9e2 + ClientQueryAsk: In=3, Out=2, CheckSum=2d06866277cf890ee42baa4bacffb2fc + ClientRemoveImport: In=2, Out=1, CheckSum=a3fcb78bf5bac553baac584941c1771f + ClientRestartDataTransfer: In=4, Out=1, CheckSum=074398536c75e25946c7f709574e0cdc + ClientRetrieve: In=3, Out=1, CheckSum=33b5ec01d4c4b4a635ab1e7ba1db7387 + ClientRetrieveTryRestartInsufficientFunds: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 + ClientRetrieveWithEvents: In=3, Out=2, CheckSum=c98dd52dccd96ec2fa8be621fa35a8a8 + ClientStartDeal: In=2, Out=2, CheckSum=85256e9ef86dbb8ebeb76097c3eea078 + ClientStatelessDeal: In=2, Out=2, CheckSum=85256e9ef86dbb8ebeb76097c3eea078 + Closing: In=1, Out=2, CheckSum=3e0dae65a2378c12be14cee8a60a3bfe + CreateBackup: In=2, Out=1, CheckSum=7b0679c2c73ab9606a7da21c5251ad19 + Discover: In=1, Out=2, CheckSum=09640e20c6d71c3e96c7a56c8698acc9 + GasEstimateFeeCap: In=4, Out=2, CheckSum=0fcac02de1d21c9ac6e10696a6499eba + GasEstimateGasLimit: In=3, Out=2, CheckSum=4d1bd57eef0ee90d4c2e89f097d0604d + GasEstimateGasPremium: In=5, Out=2, CheckSum=550724ed37e2fdaa64e55147e82214b1 + GasEstimateMessageGas: In=4, Out=2, CheckSum=6ff6179b579feed33897d96429504624 + ID: In=1, Out=2, CheckSum=1695f00523f88afb55c5df6053bf9ee4 + LogAlerts: In=1, Out=2, CheckSum=c9262fa7c93e891ec80868e0b83a2222 + LogList: In=1, Out=2, CheckSum=c6d763b6ec7190283b7c648e735725c0 + LogSetLevel: In=3, Out=1, CheckSum=ffdc3b95db02b9026a12c29d899e0059 + MarketAddBalance: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 + MarketGetReserved: In=2, Out=2, CheckSum=f1426bf8d7a1afdeaae0cd561fbbfbb0 + MarketReleaseFunds: In=3, Out=1, CheckSum=c20c4060f72c1a1ab8176a4936292a1e + MarketReserveFunds: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 + MarketWithdraw: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 + MinerCreateBlock: In=2, Out=2, CheckSum=c8749e2acc2143226c34fdf3965fd4b9 + MinerGetBaseInfo: In=4, Out=2, CheckSum=a9ead3443999aba71e9444c0cd9730a2 + MpoolBatchPush: In=2, Out=2, CheckSum=4f34d25c5ddbe15922545c0c28c40830 + MpoolBatchPushMessage: In=3, Out=2, CheckSum=66b4628bc63c8ca4bc31db0393ade01b + MpoolBatchPushUntrusted: In=2, Out=2, CheckSum=4f34d25c5ddbe15922545c0c28c40830 + MpoolClear: In=2, Out=1, CheckSum=790632b52ba8d2fb863afad93556528c + MpoolGetConfig: In=1, Out=2, CheckSum=b28b0828ec4c43c705feb84536e66aa8 + MpoolGetNonce: In=2, Out=2, CheckSum=2f0992ed1f0be8ff9bee0c3f0a39e1e1 + MpoolPending: In=2, Out=2, CheckSum=867ae9cbeb080683492ec76cc0c1ea7f + MpoolPush: In=2, Out=2, CheckSum=3b29294f39a940d77be58a07e30e8d4b + MpoolPushMessage: In=3, Out=2, CheckSum=97e029b4d408862c42035318e3c21d05 + MpoolPushUntrusted: In=2, Out=2, CheckSum=3b29294f39a940d77be58a07e30e8d4b + MpoolSelect: In=3, Out=2, CheckSum=a524ad1b1c0d7d27b21c69c62e926f9c + MpoolSetConfig: In=2, Out=1, CheckSum=f1ed0cdb9842cfb5176188c281577fba + MpoolSub: In=1, Out=2, CheckSum=337ebc027637bda66141bad6af2f6cc4 + MsigAddApprove: In=7, Out=2, CheckSum=4dbd86148df51d0975f2f5c6adac7c00 + MsigAddCancel: In=6, Out=2, CheckSum=afb744caa58c307fffa99d052c97e9c7 + MsigAddPropose: In=5, Out=2, CheckSum=6d40bd8a8f2563f75402a23915a23000 + MsigApprove: In=4, Out=2, CheckSum=09bc2481f1717ddc5147c1e8eb76bbbc + MsigApproveTxnHash: In=9, Out=2, CheckSum=7715b69bd67ece799d3da978457a2915 + MsigCancel: In=8, Out=2, CheckSum=6a9360010be0849bd6c588dd6759af41 + MsigCreate: In=7, Out=2, CheckSum=ef93a3c107e73884b4073f01da738bce + MsigGetAvailableBalance: In=3, Out=2, CheckSum=a05010da3c73edfba49c3b5d28a216cd + MsigGetPending: In=3, Out=2, CheckSum=895d889866adf330c83b8dffdbd27fac + MsigGetVested: In=4, Out=2, CheckSum=33d14f7f35b833b5b9dd6b2188c84324 + MsigGetVestingSchedule: In=3, Out=2, CheckSum=b9caf183f11d2a8e611b1daea98ad69e + MsigPropose: In=7, Out=2, CheckSum=f297212379eac659948e303e5be88c0b + MsigRemoveSigner: In=5, Out=2, CheckSum=6d40bd8a8f2563f75402a23915a23000 + MsigSwapApprove: In=7, Out=2, CheckSum=17c75be766c59016bc4a4d583b297d2f + MsigSwapCancel: In=6, Out=2, CheckSum=e2222a10bb1cf80d1fdb56be22b07800 + MsigSwapPropose: In=5, Out=2, CheckSum=f207e1bd168bfd4258481aacf03b4ed4 + NetAddrsListen: In=1, Out=2, CheckSum=edb8238a53eb0480f852309ccee11c23 + NetAgentVersion: In=2, Out=2, CheckSum=21c48e39a45af1b545fa3612c5e8d20d + NetAutoNatStatus: In=1, Out=2, CheckSum=05d1ab4460587ed623f3ce1e1f193a83 + NetBandwidthStats: In=1, Out=2, CheckSum=8309e47349b264349eb41a1105c36f14 + NetBandwidthStatsByPeer: In=1, Out=2, CheckSum=c58b4378b7d5bd90ba6e1725b717fade + NetBandwidthStatsByProtocol: In=1, Out=2, CheckSum=53627d49fb1ca70ca88666f0c4764250 + NetBlockAdd: In=2, Out=1, CheckSum=bb826402a0a2406da30862a2c08af435 + NetBlockList: In=1, Out=2, CheckSum=174b57557c7d7487b5b204f961e33abc + NetBlockRemove: In=2, Out=1, CheckSum=bb826402a0a2406da30862a2c08af435 + NetConnect: In=2, Out=1, CheckSum=5258b1ca3f00aec9c2a0d53bb9e78ef7 + NetConnectedness: In=2, Out=2, CheckSum=e489a3544ead801c9121171bdf1f3971 + NetDisconnect: In=2, Out=1, CheckSum=814e6b52918db98c4883832a38cd222b + NetFindPeer: In=2, Out=2, CheckSum=2ffcd1ed349f87c3cc0e2bb1ee2d68c6 + NetPeerInfo: In=2, Out=2, CheckSum=1c030faf779524a321fe8cec305b9f25 + NetPeers: In=1, Out=2, CheckSum=487043eee4cf0ea002d7a6d0a7ff793b + NetPubsubScores: In=1, Out=2, CheckSum=66c7a1061de3d6e11d39ce90692aa885 + PaychAllocateLane: In=2, Out=2, CheckSum=2f0992ed1f0be8ff9bee0c3f0a39e1e1 + PaychAvailableFunds: In=2, Out=2, CheckSum=f40942f65ce181601e7bc49e6378a89c + PaychAvailableFundsByFromTo: In=3, Out=2, CheckSum=829ff29d78db755f3c13ab3259adb32b + PaychCollect: In=2, Out=2, CheckSum=fdb746bab5f269b63dc0256d50570d81 + PaychGet: In=4, Out=2, CheckSum=f7fb571ad0461c404a0789f6b8c38501 + PaychGetWaitReady: In=2, Out=2, CheckSum=59546a25118c9e0dbb3ad569d3ec0c6f + PaychList: In=1, Out=2, CheckSum=566d37a33889023f9f73c632fa4e8279 + PaychNewPayment: In=4, Out=2, CheckSum=8bb33e38d75917df1357fcf071335ba9 + PaychSettle: In=2, Out=2, CheckSum=fdb746bab5f269b63dc0256d50570d81 + PaychStatus: In=2, Out=2, CheckSum=ae911e02219f1412acb95e95a4065478 + PaychVoucherAdd: In=5, Out=2, CheckSum=8abddd426fa4de6362414384cdec101c + PaychVoucherCheckSpendable: In=5, Out=2, CheckSum=ab5f887200e92223e9adb9573f32e23f + PaychVoucherCheckValid: In=3, Out=1, CheckSum=52e8d077109b5410e1dead7e9bf696b0 + PaychVoucherCreate: In=4, Out=2, CheckSum=e5113a58d351abf5cadd77b46f690c2d + PaychVoucherList: In=2, Out=2, CheckSum=55450ef559b971b6894fb3865003b7b4 + PaychVoucherSubmit: In=5, Out=2, CheckSum=158150e9cb2e2d176ee9ba4674d382d9 + Session: In=1, Out=2, CheckSum=cdb04ef6a97114c8f24f456a2e70f1cd + Shutdown: In=1, Out=1, CheckSum=c39be30cc5a8826024fcf4d23e7017d6 + StateAccountKey: In=3, Out=2, CheckSum=9b6f9fdaea5bb22c60772266c418d98f + StateAllMinerFaults: In=3, Out=2, CheckSum=a17e05b21e1ecc8da867e2f76df6c46c + StateCall: In=3, Out=2, CheckSum=b33ab6c7df31d805c256c8ab6691b085 + StateChangedActors: In=3, Out=2, CheckSum=cbc0cd36e495552a6672caab9f839468 + StateCirculatingSupply: In=2, Out=2, CheckSum=22ac180fa0c583b4036666bfc155fd63 + StateCompute: In=4, Out=2, CheckSum=1d429c389354255c7f865f00a59e3888 + StateDealProviderCollateralBounds: In=4, Out=2, CheckSum=5231e44843c0b74a04371e1e7170d4b2 + StateDecodeParams: In=5, Out=2, CheckSum=8c6311be4dc064a657368516c33e1307 + StateGetActor: In=3, Out=2, CheckSum=adcd0bbd36e3ab94f777c7cb3df1fb34 + StateGetRandomnessFromBeacon: In=5, Out=2, CheckSum=b98225c36bf011979dbcad0fb938e659 + StateGetRandomnessFromTickets: In=5, Out=2, CheckSum=b98225c36bf011979dbcad0fb938e659 + StateGetReceipt: In=3, Out=2, CheckSum=03f4f567eaa55a6ccad8b4a4c95b590a + StateListActors: In=2, Out=2, CheckSum=57bcc4526adaf4b0582c0b117d39b042 + StateListMessages: In=4, Out=2, CheckSum=f12ce9e8a127bf320fb0b289a19b4ea6 + StateListMiners: In=2, Out=2, CheckSum=57bcc4526adaf4b0582c0b117d39b042 + StateLookupID: In=3, Out=2, CheckSum=9b6f9fdaea5bb22c60772266c418d98f + StateMarketBalance: In=3, Out=2, CheckSum=bbab976bd25166200f737c94fc970bc7 + StateMarketDeals: In=2, Out=2, CheckSum=38821c8f592f6f56eb985973ac1ffd36 + StateMarketParticipants: In=2, Out=2, CheckSum=acc9019d0b6e389743c6f992350f407c + StateMarketStorageDeal: In=3, Out=2, CheckSum=94af302d39beba9f0ce7648f4118b6aa + StateMinerActiveSectors: In=3, Out=2, CheckSum=bac211cd5a37bfadf156b636ad7b9381 + StateMinerAvailableBalance: In=3, Out=2, CheckSum=a05010da3c73edfba49c3b5d28a216cd + StateMinerDeadlines: In=3, Out=2, CheckSum=5b128c75ba4953740906520cca96b962 + StateMinerFaults: In=3, Out=2, CheckSum=9d26d848f93597964f751b43edd3d476 + StateMinerInfo: In=3, Out=2, CheckSum=0782a05b506c86bcfb47082a6f8e37fc + StateMinerInitialPledgeCollateral: In=4, Out=2, CheckSum=d87787cc5072c480ed580099fc926668 + StateMinerPartitions: In=4, Out=2, CheckSum=b3cba1da3bd87c433cb8f9df7f7edc09 + StateMinerPower: In=3, Out=2, CheckSum=0e70a6360616c25624118181f764d7df + StateMinerPreCommitDepositForPower: In=4, Out=2, CheckSum=d87787cc5072c480ed580099fc926668 + StateMinerProvingDeadline: In=3, Out=2, CheckSum=8c6037a054ad720ecfb3d0c3f4f90fe6 + StateMinerRecoveries: In=3, Out=2, CheckSum=9d26d848f93597964f751b43edd3d476 + StateMinerSectorAllocated: In=4, Out=2, CheckSum=2accd56a9e9196fa1ca85a1d60e19fc2 + StateMinerSectorCount: In=3, Out=2, CheckSum=573483cbcf3ccdd38063b9ce16453dc2 + StateMinerSectors: In=4, Out=2, CheckSum=c04491aa9e0e6e9a743046c60e13683d + StateNetworkName: In=1, Out=2, CheckSum=afb82130640a26dcd9d7010f31c69572 + StateNetworkVersion: In=2, Out=2, CheckSum=47de92e3b59793ade53abd96c347bace + StateReadState: In=3, Out=2, CheckSum=f53f39943eea93d5f3dd64f1389e4c64 + StateReplay: In=3, Out=2, CheckSum=ec89143eb01290212c3ce0032f62c5fc + StateSearchMsg: In=2, Out=2, CheckSum=e4186ab56a9d2e3c99174110e3f697dc + StateSearchMsgLimited: In=3, Out=2, CheckSum=8990ed018d033c44ebb38c0d077bc6d0 + StateSectorExpiration: In=4, Out=2, CheckSum=bb669c8b66b6f74c681b4345c9e4cc8f + StateSectorGetInfo: In=4, Out=2, CheckSum=27a4e36a319274aca9597f105bc438ff + StateSectorPartition: In=4, Out=2, CheckSum=e3743df55a360243a32ac64ce1282c53 + StateSectorPreCommitInfo: In=4, Out=2, CheckSum=40e05fc7142ce524b9a58e8655ce5a01 + StateVMCirculatingSupplyInternal: In=2, Out=2, CheckSum=05c2114e08be095cece55db19e214d2c + StateVerifiedClientStatus: In=3, Out=2, CheckSum=e33ae4cd2315832f2d6f2aa74b68c34e + StateVerifiedRegistryRootKey: In=2, Out=2, CheckSum=5ad3a497ee24e321c780a69b8d2f0936 + StateVerifierStatus: In=3, Out=2, CheckSum=e33ae4cd2315832f2d6f2aa74b68c34e + StateWaitMsg: In=3, Out=2, CheckSum=f997714e2214b7122462163c5e7bc9a2 + StateWaitMsgLimited: In=4, Out=2, CheckSum=0b59c44082d62b85343ca111441315a1 + SyncCheckBad: In=2, Out=2, CheckSum=ba06470da0ca1d6cc2f9ada7f0288a6c + SyncCheckpoint: In=2, Out=1, CheckSum=cdfe593ac791e823186abb77bfad49a0 + SyncIncomingBlocks: In=1, Out=2, CheckSum=f6ad051ba2ce73511f74f9c08032acc3 + SyncMarkBad: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 + SyncState: In=1, Out=2, CheckSum=7004fd3e7bf60990cb1695fa5883d08f + SyncSubmitBlock: In=2, Out=1, CheckSum=04cdc7641df5628e2ef8c90584936142 + SyncUnmarkAllBad: In=1, Out=1, CheckSum=c39be30cc5a8826024fcf4d23e7017d6 + SyncUnmarkBad: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 + SyncValidateTipset: In=2, Out=2, CheckSum=a244b60fe32e540879ec4eeded71136b + Version: In=1, Out=2, CheckSum=0e78a1023c652297e66079f521e11624 + WalletBalance: In=2, Out=2, CheckSum=f1426bf8d7a1afdeaae0cd561fbbfbb0 + WalletDefaultAddress: In=1, Out=2, CheckSum=5591bbacb9b8345a4a07a149c963df55 + WalletDelete: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 + WalletExport: In=2, Out=2, CheckSum=5db217de8a3ec9ecbed4cc583e473991 + WalletHas: In=2, Out=2, CheckSum=9ad76c8c583af5b5a5d0202c0a3fe7f4 + WalletImport: In=2, Out=2, CheckSum=617245aaab0381dc634a2ad50dd440b3 + WalletList: In=1, Out=2, CheckSum=566d37a33889023f9f73c632fa4e8279 + WalletNew: In=2, Out=2, CheckSum=266c59d3ee6f0b3a66e8dbdec099ef06 + WalletSetDefault: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 + WalletSign: In=3, Out=2, CheckSum=b5a8800f8b60b92c4d99e9cb0fcff086 + WalletSignMessage: In=3, Out=2, CheckSum=c9f0ea6123a189cfeab06ce6bdeda7b3 + WalletValidateAddress: In=2, Out=2, CheckSum=610b35f7aa87b32463e5c2a9b4bd3f55 + WalletVerify: In=4, Out=2, CheckSum=9b22231e95efdfb94d9d55038f500636 + +api.FullNode: + AuthNew: In=2, Out=2, CheckSum=faeef9dc68d6f2533bdf7d8f22ef902d + AuthVerify: In=2, Out=2, CheckSum=3cb63db9d6f8869fd4e9da953cc9cdcb + BeaconGetEntry: In=2, Out=2, CheckSum=c74f5c0f4039207ea45c11bfe3319c38 + ChainBlockstoreInfo: In=1, Out=2, CheckSum=09640e20c6d71c3e96c7a56c8698acc9 + ChainCheckBlockstore: In=1, Out=1, CheckSum=c39be30cc5a8826024fcf4d23e7017d6 + ChainDeleteObj: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 + ChainExport: In=4, Out=2, CheckSum=aaf98926e0ba36ec808a96de76a3cd98 + ChainGetBlock: In=2, Out=2, CheckSum=0d2bba23d84a51413bbbebe218dcbcf9 + ChainGetBlockMessages: In=2, Out=2, CheckSum=944437b34bb952bf3d50aa6415c9e0d3 + ChainGetGenesis: In=1, Out=2, CheckSum=6d1e4c4d8184dc8d645a56278f14cfad + ChainGetMessage: In=2, Out=2, CheckSum=d1c0ae931458a2a7b07de152ca3de558 + ChainGetMessagesInTipset: In=2, Out=2, CheckSum=6c0bfa48ffcacdfa9dbed1b9e23ad88e + ChainGetNode: In=2, Out=2, CheckSum=66a718f5dbb8b0fcddcf761b58744e38 + ChainGetParentMessages: In=2, Out=2, CheckSum=e659caaae75cd643a7100b1c8cc3125a + ChainGetParentReceipts: In=2, Out=2, CheckSum=de820c5da3d8d036d854ce42ea9d85a3 + ChainGetPath: In=3, Out=2, CheckSum=a745af1a69b379493504c432b15839e7 + ChainGetTipSet: In=2, Out=2, CheckSum=854d79b3a35822ab54e7459ad95816ad + ChainGetTipSetAfterHeight: In=3, Out=2, CheckSum=9831731a08357a0247d802268b57a497 + ChainGetTipSetByHeight: In=3, Out=2, CheckSum=9831731a08357a0247d802268b57a497 + ChainHasObj: In=2, Out=2, CheckSum=7fe71bcffa1b110db106e0104e98a32f + ChainHead: In=1, Out=2, CheckSum=6d1e4c4d8184dc8d645a56278f14cfad + ChainNotify: In=1, Out=2, CheckSum=9525148e93a5b83600ebfbde4d24f3e9 + ChainReadObj: In=2, Out=2, CheckSum=6fd9244d87bf5d14fb5e79b0dbc0940d + ChainSetHead: In=2, Out=1, CheckSum=cdfe593ac791e823186abb77bfad49a0 + ChainStatObj: In=3, Out=2, CheckSum=9db2a0d97998daaf9c15e7c3d6ffe82d + ChainTipSetWeight: In=2, Out=2, CheckSum=22ac180fa0c583b4036666bfc155fd63 + ClientCalcCommP: In=2, Out=2, CheckSum=f83c6f3b9d823d22dfcd13e5aee9fb6b + ClientCancelDataTransfer: In=4, Out=1, CheckSum=074398536c75e25946c7f709574e0cdc + ClientCancelRetrievalDeal: In=2, Out=1, CheckSum=d289f4c3758ed7d6ab991b2cf569c969 + ClientDataTransferUpdates: In=1, Out=2, CheckSum=2d33b419e4b215c06ab0e8b66b5f8430 + ClientDealPieceCID: In=2, Out=2, CheckSum=93537a844ba6b74ec1ce82c887359a75 + ClientDealSize: In=2, Out=2, CheckSum=cca1dd5f58136af28546bdbdef2f948a + ClientFindData: In=3, Out=2, CheckSum=232da9eb987d92a76b37572c8f44bf53 + ClientGenCar: In=3, Out=1, CheckSum=b8a0c89fc2c7c16464ac968865e9c156 + ClientGetDealInfo: In=2, Out=2, CheckSum=e67f0e7b88aff099976b0f275b601c9c + ClientGetDealStatus: In=2, Out=2, CheckSum=1297eb9ae9a9ed209cfcb5899910f415 + ClientGetDealUpdates: In=1, Out=2, CheckSum=459cb2faa373d8dcf4cf8e33a2854366 + ClientGetRetrievalUpdates: In=1, Out=2, CheckSum=9390e4328ba9fe6c034341d574fd6f3d + ClientHasLocal: In=2, Out=2, CheckSum=7fe71bcffa1b110db106e0104e98a32f + ClientImport: In=2, Out=2, CheckSum=8c5886f6f2eb7b5db886d639c62e5808 + ClientListDataTransfers: In=1, Out=2, CheckSum=aa113d3aaf47f5b34fc947d26d58d001 + ClientListDeals: In=1, Out=2, CheckSum=fddf5a2bf3dd94a5aec97248ff7db918 + ClientListImports: In=1, Out=2, CheckSum=1966c3c721d57e0a728d3b51ba3a61d4 + ClientListRetrievals: In=1, Out=2, CheckSum=d5485e62b97cf31e1880d54808968895 + ClientMinerQueryOffer: In=4, Out=2, CheckSum=f57fabb5f04c1086302b43bd5087b9e2 + ClientQueryAsk: In=3, Out=2, CheckSum=2d06866277cf890ee42baa4bacffb2fc + ClientRemoveImport: In=2, Out=1, CheckSum=a3fcb78bf5bac553baac584941c1771f + ClientRestartDataTransfer: In=4, Out=1, CheckSum=074398536c75e25946c7f709574e0cdc + ClientRetrieve: In=3, Out=1, CheckSum=33b5ec01d4c4b4a635ab1e7ba1db7387 + ClientRetrieveTryRestartInsufficientFunds: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 + ClientRetrieveWithEvents: In=3, Out=2, CheckSum=c98dd52dccd96ec2fa8be621fa35a8a8 + ClientStartDeal: In=2, Out=2, CheckSum=85256e9ef86dbb8ebeb76097c3eea078 + ClientStatelessDeal: In=2, Out=2, CheckSum=85256e9ef86dbb8ebeb76097c3eea078 + Closing: In=1, Out=2, CheckSum=3e0dae65a2378c12be14cee8a60a3bfe + CreateBackup: In=2, Out=1, CheckSum=7b0679c2c73ab9606a7da21c5251ad19 + Discover: In=1, Out=2, CheckSum=09640e20c6d71c3e96c7a56c8698acc9 + GasEstimateFeeCap: In=4, Out=2, CheckSum=0fcac02de1d21c9ac6e10696a6499eba + GasEstimateGasLimit: In=3, Out=2, CheckSum=4d1bd57eef0ee90d4c2e89f097d0604d + GasEstimateGasPremium: In=5, Out=2, CheckSum=550724ed37e2fdaa64e55147e82214b1 + GasEstimateMessageGas: In=4, Out=2, CheckSum=6ff6179b579feed33897d96429504624 + ID: In=1, Out=2, CheckSum=1695f00523f88afb55c5df6053bf9ee4 + LogAlerts: In=1, Out=2, CheckSum=c9262fa7c93e891ec80868e0b83a2222 + LogList: In=1, Out=2, CheckSum=c6d763b6ec7190283b7c648e735725c0 + LogSetLevel: In=3, Out=1, CheckSum=ffdc3b95db02b9026a12c29d899e0059 + MarketAddBalance: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 + MarketGetReserved: In=2, Out=2, CheckSum=f1426bf8d7a1afdeaae0cd561fbbfbb0 + MarketReleaseFunds: In=3, Out=1, CheckSum=c20c4060f72c1a1ab8176a4936292a1e + MarketReserveFunds: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 + MarketWithdraw: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 + MinerCreateBlock: In=2, Out=2, CheckSum=c8749e2acc2143226c34fdf3965fd4b9 + MinerGetBaseInfo: In=4, Out=2, CheckSum=a9ead3443999aba71e9444c0cd9730a2 + MpoolBatchPush: In=2, Out=2, CheckSum=4f34d25c5ddbe15922545c0c28c40830 + MpoolBatchPushMessage: In=3, Out=2, CheckSum=66b4628bc63c8ca4bc31db0393ade01b + MpoolBatchPushUntrusted: In=2, Out=2, CheckSum=4f34d25c5ddbe15922545c0c28c40830 + MpoolCheckMessages: In=2, Out=2, CheckSum=4bf8491c98028f49b05ff0f1d6e3eaf7 + MpoolCheckPendingMessages: In=2, Out=2, CheckSum=f4a139f9278ea6fb2158a05c24c769fb + MpoolCheckReplaceMessages: In=2, Out=2, CheckSum=d8312bb585f0696c77b4d02c84293cdd + MpoolClear: In=2, Out=1, CheckSum=790632b52ba8d2fb863afad93556528c + MpoolGetConfig: In=1, Out=2, CheckSum=b28b0828ec4c43c705feb84536e66aa8 + MpoolGetNonce: In=2, Out=2, CheckSum=2f0992ed1f0be8ff9bee0c3f0a39e1e1 + MpoolPending: In=2, Out=2, CheckSum=867ae9cbeb080683492ec76cc0c1ea7f + MpoolPush: In=2, Out=2, CheckSum=3b29294f39a940d77be58a07e30e8d4b + MpoolPushMessage: In=3, Out=2, CheckSum=97e029b4d408862c42035318e3c21d05 + MpoolPushUntrusted: In=2, Out=2, CheckSum=3b29294f39a940d77be58a07e30e8d4b + MpoolSelect: In=3, Out=2, CheckSum=a524ad1b1c0d7d27b21c69c62e926f9c + MpoolSetConfig: In=2, Out=1, CheckSum=f1ed0cdb9842cfb5176188c281577fba + MpoolSub: In=1, Out=2, CheckSum=337ebc027637bda66141bad6af2f6cc4 + MsigAddApprove: In=7, Out=2, CheckSum=f622ab6c302078342d7834f0c32ddbdb + MsigAddCancel: In=6, Out=2, CheckSum=31b5b364ddd3e12c9d310a9868c6fda2 + MsigAddPropose: In=5, Out=2, CheckSum=801a2539853f3e7206fd87fc4171c40b + MsigApprove: In=4, Out=2, CheckSum=3384d4133b5559461f919c3bdb1dac41 + MsigApproveTxnHash: In=9, Out=2, CheckSum=9a7460af699e6aa82452157078046018 + MsigCancel: In=8, Out=2, CheckSum=912010a9da971230c20e5503503e33e2 + MsigCreate: In=7, Out=2, CheckSum=3b8196718c58238e8579cd1e2b8368d9 + MsigGetAvailableBalance: In=3, Out=2, CheckSum=a05010da3c73edfba49c3b5d28a216cd + MsigGetPending: In=3, Out=2, CheckSum=895d889866adf330c83b8dffdbd27fac + MsigGetVested: In=4, Out=2, CheckSum=33d14f7f35b833b5b9dd6b2188c84324 + MsigGetVestingSchedule: In=3, Out=2, CheckSum=b9caf183f11d2a8e611b1daea98ad69e + MsigPropose: In=7, Out=2, CheckSum=22d693fea428a547510ddd48222c5f7a + MsigRemoveSigner: In=5, Out=2, CheckSum=801a2539853f3e7206fd87fc4171c40b + MsigSwapApprove: In=7, Out=2, CheckSum=15b73f7c86aa2009ab368b43d96b5485 + MsigSwapCancel: In=6, Out=2, CheckSum=47441127af7eaa6580d48b2daa13fd1d + MsigSwapPropose: In=5, Out=2, CheckSum=2766f47b61843d276e20ab487ac9849a + NetAddrsListen: In=1, Out=2, CheckSum=edb8238a53eb0480f852309ccee11c23 + NetAgentVersion: In=2, Out=2, CheckSum=21c48e39a45af1b545fa3612c5e8d20d + NetAutoNatStatus: In=1, Out=2, CheckSum=05d1ab4460587ed623f3ce1e1f193a83 + NetBandwidthStats: In=1, Out=2, CheckSum=8309e47349b264349eb41a1105c36f14 + NetBandwidthStatsByPeer: In=1, Out=2, CheckSum=c58b4378b7d5bd90ba6e1725b717fade + NetBandwidthStatsByProtocol: In=1, Out=2, CheckSum=53627d49fb1ca70ca88666f0c4764250 + NetBlockAdd: In=2, Out=1, CheckSum=bb826402a0a2406da30862a2c08af435 + NetBlockList: In=1, Out=2, CheckSum=174b57557c7d7487b5b204f961e33abc + NetBlockRemove: In=2, Out=1, CheckSum=bb826402a0a2406da30862a2c08af435 + NetConnect: In=2, Out=1, CheckSum=5258b1ca3f00aec9c2a0d53bb9e78ef7 + NetConnectedness: In=2, Out=2, CheckSum=e489a3544ead801c9121171bdf1f3971 + NetDisconnect: In=2, Out=1, CheckSum=814e6b52918db98c4883832a38cd222b + NetFindPeer: In=2, Out=2, CheckSum=2ffcd1ed349f87c3cc0e2bb1ee2d68c6 + NetPeerInfo: In=2, Out=2, CheckSum=1c030faf779524a321fe8cec305b9f25 + NetPeers: In=1, Out=2, CheckSum=487043eee4cf0ea002d7a6d0a7ff793b + NetPubsubScores: In=1, Out=2, CheckSum=66c7a1061de3d6e11d39ce90692aa885 + NodeStatus: In=2, Out=2, CheckSum=b46530b68171c85301db86c1b7c19824 + PaychAllocateLane: In=2, Out=2, CheckSum=2f0992ed1f0be8ff9bee0c3f0a39e1e1 + PaychAvailableFunds: In=2, Out=2, CheckSum=f40942f65ce181601e7bc49e6378a89c + PaychAvailableFundsByFromTo: In=3, Out=2, CheckSum=829ff29d78db755f3c13ab3259adb32b + PaychCollect: In=2, Out=2, CheckSum=fdb746bab5f269b63dc0256d50570d81 + PaychGet: In=4, Out=2, CheckSum=f7fb571ad0461c404a0789f6b8c38501 + PaychGetWaitReady: In=2, Out=2, CheckSum=59546a25118c9e0dbb3ad569d3ec0c6f + PaychList: In=1, Out=2, CheckSum=566d37a33889023f9f73c632fa4e8279 + PaychNewPayment: In=4, Out=2, CheckSum=8bb33e38d75917df1357fcf071335ba9 + PaychSettle: In=2, Out=2, CheckSum=fdb746bab5f269b63dc0256d50570d81 + PaychStatus: In=2, Out=2, CheckSum=ae911e02219f1412acb95e95a4065478 + PaychVoucherAdd: In=5, Out=2, CheckSum=8abddd426fa4de6362414384cdec101c + PaychVoucherCheckSpendable: In=5, Out=2, CheckSum=ab5f887200e92223e9adb9573f32e23f + PaychVoucherCheckValid: In=3, Out=1, CheckSum=52e8d077109b5410e1dead7e9bf696b0 + PaychVoucherCreate: In=4, Out=2, CheckSum=e5113a58d351abf5cadd77b46f690c2d + PaychVoucherList: In=2, Out=2, CheckSum=55450ef559b971b6894fb3865003b7b4 + PaychVoucherSubmit: In=5, Out=2, CheckSum=158150e9cb2e2d176ee9ba4674d382d9 + Session: In=1, Out=2, CheckSum=cdb04ef6a97114c8f24f456a2e70f1cd + Shutdown: In=1, Out=1, CheckSum=c39be30cc5a8826024fcf4d23e7017d6 + StateAccountKey: In=3, Out=2, CheckSum=9b6f9fdaea5bb22c60772266c418d98f + StateAllMinerFaults: In=3, Out=2, CheckSum=a17e05b21e1ecc8da867e2f76df6c46c + StateCall: In=3, Out=2, CheckSum=b33ab6c7df31d805c256c8ab6691b085 + StateChangedActors: In=3, Out=2, CheckSum=cbc0cd36e495552a6672caab9f839468 + StateCirculatingSupply: In=2, Out=2, CheckSum=22ac180fa0c583b4036666bfc155fd63 + StateCompute: In=4, Out=2, CheckSum=1d429c389354255c7f865f00a59e3888 + StateDealProviderCollateralBounds: In=4, Out=2, CheckSum=5231e44843c0b74a04371e1e7170d4b2 + StateDecodeParams: In=5, Out=2, CheckSum=8c6311be4dc064a657368516c33e1307 + StateEncodeParams: In=4, Out=2, CheckSum=3e1a5390b92b1b69f9be038cd7400e38 + StateGetActor: In=3, Out=2, CheckSum=adcd0bbd36e3ab94f777c7cb3df1fb34 + StateGetRandomnessFromBeacon: In=5, Out=2, CheckSum=b98225c36bf011979dbcad0fb938e659 + StateGetRandomnessFromTickets: In=5, Out=2, CheckSum=b98225c36bf011979dbcad0fb938e659 + StateListActors: In=2, Out=2, CheckSum=57bcc4526adaf4b0582c0b117d39b042 + StateListMessages: In=4, Out=2, CheckSum=f12ce9e8a127bf320fb0b289a19b4ea6 + StateListMiners: In=2, Out=2, CheckSum=57bcc4526adaf4b0582c0b117d39b042 + StateLookupID: In=3, Out=2, CheckSum=9b6f9fdaea5bb22c60772266c418d98f + StateMarketBalance: In=3, Out=2, CheckSum=bbab976bd25166200f737c94fc970bc7 + StateMarketDeals: In=2, Out=2, CheckSum=38821c8f592f6f56eb985973ac1ffd36 + StateMarketParticipants: In=2, Out=2, CheckSum=acc9019d0b6e389743c6f992350f407c + StateMarketStorageDeal: In=3, Out=2, CheckSum=94af302d39beba9f0ce7648f4118b6aa + StateMinerActiveSectors: In=3, Out=2, CheckSum=bac211cd5a37bfadf156b636ad7b9381 + StateMinerAvailableBalance: In=3, Out=2, CheckSum=a05010da3c73edfba49c3b5d28a216cd + StateMinerDeadlines: In=3, Out=2, CheckSum=5b128c75ba4953740906520cca96b962 + StateMinerFaults: In=3, Out=2, CheckSum=9d26d848f93597964f751b43edd3d476 + StateMinerInfo: In=3, Out=2, CheckSum=0782a05b506c86bcfb47082a6f8e37fc + StateMinerInitialPledgeCollateral: In=4, Out=2, CheckSum=d87787cc5072c480ed580099fc926668 + StateMinerPartitions: In=4, Out=2, CheckSum=b3cba1da3bd87c433cb8f9df7f7edc09 + StateMinerPower: In=3, Out=2, CheckSum=0e70a6360616c25624118181f764d7df + StateMinerPreCommitDepositForPower: In=4, Out=2, CheckSum=d87787cc5072c480ed580099fc926668 + StateMinerProvingDeadline: In=3, Out=2, CheckSum=8c6037a054ad720ecfb3d0c3f4f90fe6 + StateMinerRecoveries: In=3, Out=2, CheckSum=9d26d848f93597964f751b43edd3d476 + StateMinerSectorAllocated: In=4, Out=2, CheckSum=2accd56a9e9196fa1ca85a1d60e19fc2 + StateMinerSectorCount: In=3, Out=2, CheckSum=573483cbcf3ccdd38063b9ce16453dc2 + StateMinerSectors: In=4, Out=2, CheckSum=c04491aa9e0e6e9a743046c60e13683d + StateNetworkName: In=1, Out=2, CheckSum=afb82130640a26dcd9d7010f31c69572 + StateNetworkVersion: In=2, Out=2, CheckSum=47de92e3b59793ade53abd96c347bace + StateReadState: In=3, Out=2, CheckSum=f53f39943eea93d5f3dd64f1389e4c64 + StateReplay: In=3, Out=2, CheckSum=ec89143eb01290212c3ce0032f62c5fc + StateSearchMsg: In=5, Out=2, CheckSum=05ad20588933ea6ffa941f47b826708a + StateSectorExpiration: In=4, Out=2, CheckSum=bb669c8b66b6f74c681b4345c9e4cc8f + StateSectorGetInfo: In=4, Out=2, CheckSum=27a4e36a319274aca9597f105bc438ff + StateSectorPartition: In=4, Out=2, CheckSum=e3743df55a360243a32ac64ce1282c53 + StateSectorPreCommitInfo: In=4, Out=2, CheckSum=40e05fc7142ce524b9a58e8655ce5a01 + StateVMCirculatingSupplyInternal: In=2, Out=2, CheckSum=05c2114e08be095cece55db19e214d2c + StateVerifiedClientStatus: In=3, Out=2, CheckSum=e33ae4cd2315832f2d6f2aa74b68c34e + StateVerifiedRegistryRootKey: In=2, Out=2, CheckSum=5ad3a497ee24e321c780a69b8d2f0936 + StateVerifierStatus: In=3, Out=2, CheckSum=e33ae4cd2315832f2d6f2aa74b68c34e + StateWaitMsg: In=5, Out=2, CheckSum=561c18d1417310b5cd35cfffb0b75a00 + SyncCheckBad: In=2, Out=2, CheckSum=ba06470da0ca1d6cc2f9ada7f0288a6c + SyncCheckpoint: In=2, Out=1, CheckSum=cdfe593ac791e823186abb77bfad49a0 + SyncIncomingBlocks: In=1, Out=2, CheckSum=f6ad051ba2ce73511f74f9c08032acc3 + SyncMarkBad: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 + SyncState: In=1, Out=2, CheckSum=7004fd3e7bf60990cb1695fa5883d08f + SyncSubmitBlock: In=2, Out=1, CheckSum=04cdc7641df5628e2ef8c90584936142 + SyncUnmarkAllBad: In=1, Out=1, CheckSum=c39be30cc5a8826024fcf4d23e7017d6 + SyncUnmarkBad: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 + SyncValidateTipset: In=2, Out=2, CheckSum=a244b60fe32e540879ec4eeded71136b + Version: In=1, Out=2, CheckSum=0e78a1023c652297e66079f521e11624 + WalletBalance: In=2, Out=2, CheckSum=f1426bf8d7a1afdeaae0cd561fbbfbb0 + WalletDefaultAddress: In=1, Out=2, CheckSum=5591bbacb9b8345a4a07a149c963df55 + WalletDelete: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 + WalletExport: In=2, Out=2, CheckSum=5db217de8a3ec9ecbed4cc583e473991 + WalletHas: In=2, Out=2, CheckSum=9ad76c8c583af5b5a5d0202c0a3fe7f4 + WalletImport: In=2, Out=2, CheckSum=617245aaab0381dc634a2ad50dd440b3 + WalletList: In=1, Out=2, CheckSum=566d37a33889023f9f73c632fa4e8279 + WalletNew: In=2, Out=2, CheckSum=266c59d3ee6f0b3a66e8dbdec099ef06 + WalletSetDefault: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 + WalletSign: In=3, Out=2, CheckSum=b5a8800f8b60b92c4d99e9cb0fcff086 + WalletSignMessage: In=3, Out=2, CheckSum=c9f0ea6123a189cfeab06ce6bdeda7b3 + WalletValidateAddress: In=2, Out=2, CheckSum=610b35f7aa87b32463e5c2a9b4bd3f55 + WalletVerify: In=4, Out=2, CheckSum=9b22231e95efdfb94d9d55038f500636 + From a0d19c65ee97e5d2381ace8a34c97951c184de19 Mon Sep 17 00:00:00 2001 From: dtynn Date: Wed, 1 Dec 2021 17:54:34 +0800 Subject: [PATCH 056/167] go mod tidy --- venus-devtool/go.mod | 2 -- 1 file changed, 2 deletions(-) diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index c8ec694e2c..06476e66d0 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -3,11 +3,9 @@ module github.com/filecoin-project/venus/venus-devtool go 1.16 require ( - github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/lotus v1.12.0 github.com/filecoin-project/venus/venus-shared v0.0.1 github.com/ipfs/go-ipfs-http-client v0.1.0 // indirect - github.com/stretchr/testify v1.7.0 // indirect github.com/urfave/cli/v2 v2.2.0 github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 ) From cceb86bd985c561a46f7b9cf8c959d55d044e2f3 Mon Sep 17 00:00:00 2001 From: dtynn Date: Thu, 2 Dec 2021 13:18:39 +0800 Subject: [PATCH 057/167] add method group: chain for v0api of chain service --- venus-shared/api/chain/v0/chain.go | 298 ++++++++++------------------- venus-shared/api/chain/v0/types.go | 35 ++++ 2 files changed, 135 insertions(+), 198 deletions(-) create mode 100644 venus-shared/api/chain/v0/types.go diff --git a/venus-shared/api/chain/v0/chain.go b/venus-shared/api/chain/v0/chain.go index 0b87a6c58e..074606a46f 100644 --- a/venus-shared/api/chain/v0/chain.go +++ b/venus-shared/api/chain/v0/chain.go @@ -1,215 +1,117 @@ -package apiface +package v0 import ( "context" - "time" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/chain" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" - - "github.com/filecoin-project/go-state-types/big" - acrypto "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/go-state-types/crypto" "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/chain" ) -type IChain interface { - IAccount - IActor - IBeacon - IMinerState - IChainInfo -} +type ChainAPI interface { + // MethodGroup: Chain + // The Chain method group contains methods for interacting with the + // blockchain, but that do not require any form of state computation. -type IAccount interface { - // Rule[perm:read] - StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) -} + // ChainNotify returns channel with chain head updates. + // First message is guaranteed to be of len == 1, and type == 'current'. + ChainNotify(context.Context) (<-chan []*HeadChange, error) //perm:read -type IActor interface { - // Rule[perm:read] - StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) - // Rule[perm:read] - ListActor(ctx context.Context) (map[address.Address]*types.Actor, error) -} + // ChainHead returns the current head of the chain. + ChainHead(context.Context) (*chain.TipSet, error) //perm:read -type IBeacon interface { - // Rule[perm:read] - BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) -} + // ChainGetRandomnessFromTickets is used to sample the chain for randomness. + ChainGetRandomnessFromTickets(ctx context.Context, tsk chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read -type IChainInfo interface { - // Rule[perm:read] - BlockTime(ctx context.Context) time.Duration - // Rule[perm:read] - ChainList(ctx context.Context, tsKey types.TipSetKey, count int) ([]types.TipSetKey, error) - // Rule[perm:read] - ChainHead(ctx context.Context) (*types.TipSet, error) - // Rule[perm:read] - ChainSetHead(ctx context.Context, key types.TipSetKey) error - // Rule[perm:read] - ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) - // Rule[perm:read] - ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) - // Rule[perm:read] - ChainGetTipSetAfterHeight(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) - // Rule[perm:read] - ChainGetRandomnessFromBeacon(ctx context.Context, key types.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) - // Rule[perm:read] - ChainGetRandomnessFromTickets(ctx context.Context, tsk types.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) - // Rule[perm:read] - StateGetRandomnessFromTickets(ctx context.Context, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) - // Rule[perm:read] - StateGetRandomnessFromBeacon(ctx context.Context, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) - // Rule[perm:read] - ChainGetBlock(ctx context.Context, id cid.Cid) (*types.BlockHeader, error) - // Rule[perm:read] - ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.UnsignedMessage, error) - // Rule[perm:read] - ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*apitypes.BlockMessages, error) - // Rule[perm:read] - ChainGetMessagesInTipset(ctx context.Context, key types.TipSetKey) ([]apitypes.Message, error) - // Rule[perm:read] - ChainGetReceipts(ctx context.Context, id cid.Cid) ([]types.MessageReceipt, error) - // Rule[perm:read] - ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]apitypes.Message, error) - // Rule[perm:read] - ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) - // Rule[perm:read] - StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) - // Rule[perm:read] - StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) - // Rule[perm:read] - ChainNotify(ctx context.Context) <-chan []*chain.HeadChange - // Rule[perm:read] - GetFullBlock(ctx context.Context, id cid.Cid) (*types.FullBlock, error) - // Rule[perm:read] - GetActor(ctx context.Context, addr address.Address) (*types.Actor, error) - // Rule[perm:read] - GetParentStateRootActor(ctx context.Context, ts *types.TipSet, addr address.Address) (*types.Actor, error) - // Rule[perm:read] - GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*types.BeaconEntry, error) - // Rule[perm:read] - MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*chain.ChainMessage, error) - // Rule[perm:read] - ProtocolParameters(ctx context.Context) (*apitypes.ProtocolParams, error) - // Rule[perm:read] - ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) - // Rule[perm:read] - StateNetworkName(ctx context.Context) (apitypes.NetworkName, error) - // StateSearchMsg looks back up to limit epochs in the chain for a message, and returns its receipt and the tipset where it was executed - // - // NOTE: If a replacing message is found on chain, this method will return - // a MsgLookup for the replacing message - the MsgLookup.Message will be a different - // CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the - // result of the execution of the replacing message. - // - // If the caller wants to ensure that exactly the requested message was executed, - // they must check that MsgLookup.Message is equal to the provided 'cid', or set the - // `allowReplaced` parameter to false. Without this check, and with `allowReplaced` - // set to true, both the requested and original message may appear as - // successfully executed on-chain, which may look like a double-spend. - // - // A replacing message is a message with a different CID, any of Gas values, and - // different signature, but with all other parameters matching (source/destination, - // nonce, params, etc.) - // Rule[perm:read] - StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) - // StateWaitMsg looks back up to limit epochs in the chain for a message. - // If not found, it blocks until the message arrives on chain, and gets to the - // indicated confidence depth. + // ChainGetRandomnessFromBeacon is used to sample the beacon for randomness. + ChainGetRandomnessFromBeacon(ctx context.Context, tsk chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read + + // ChainGetBlock returns the block specified by the given CID. + ChainGetBlock(context.Context, cid.Cid) (*chain.BlockHeader, error) //perm:read + // ChainGetTipSet returns the tipset specified by the given TipSetKey. + ChainGetTipSet(context.Context, chain.TipSetKey) (*chain.TipSet, error) //perm:read + + // ChainGetBlockMessages returns messages stored in the specified block. // - // NOTE: If a replacing message is found on chain, this method will return - // a MsgLookup for the replacing message - the MsgLookup.Message will be a different - // CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the - // result of the execution of the replacing message. + // Note: If there are multiple blocks in a tipset, it's likely that some + // messages will be duplicated. It's also possible for blocks in a tipset to have + // different messages from the same sender at the same nonce. When that happens, + // only the first message (in a block with lowest ticket) will be considered + // for execution // - // If the caller wants to ensure that exactly the requested message was executed, - // they must check that MsgLookup.Message is equal to the provided 'cid', or set the - // `allowReplaced` parameter to false. Without this check, and with `allowReplaced` - // set to true, both the requested and original message may appear as - // successfully executed on-chain, which may look like a double-spend. + // NOTE: THIS METHOD SHOULD ONLY BE USED FOR GETTING MESSAGES IN A SPECIFIC BLOCK // - // A replacing message is a message with a different CID, any of Gas values, and - // different signature, but with all other parameters matching (source/destination, - // nonce, params, etc.) - // Rule[perm:read] - StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) - // Rule[perm:read] - StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) - // Rule[perm:read] - VerifyEntry(parent, child *types.BeaconEntry, height abi.ChainEpoch) bool - // Rule[perm:read] - ChainExport(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []byte, error) - // Rule[perm:read] - ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*chain.HeadChange, error) -} + // DO NOT USE THIS METHOD TO GET MESSAGES INCLUDED IN A TIPSET + // Use ChainGetParentMessages, which will perform correct message deduplication + ChainGetBlockMessages(ctx context.Context, blockCid cid.Cid) (*BlockMessages, error) //perm:read + + // ChainGetParentReceipts returns receipts for messages in parent tipset of + // the specified block. The receipts in the list returned is one-to-one with the + // messages returned by a call to ChainGetParentMessages with the same blockCid. + ChainGetParentReceipts(ctx context.Context, blockCid cid.Cid) ([]*chain.MessageReceipt, error) //perm:read + + // ChainGetParentMessages returns messages stored in parent tipset of the + // specified block. + ChainGetParentMessages(ctx context.Context, blockCid cid.Cid) ([]Message, error) //perm:read + + // ChainGetMessagesInTipset returns message stores in current tipset + ChainGetMessagesInTipset(ctx context.Context, tsk chain.TipSetKey) ([]Message, error) //perm:read + + // ChainGetTipSetByHeight looks back for a tipset at the specified epoch. + // If there are no blocks at the specified epoch, a tipset at an earlier epoch + // will be returned. + ChainGetTipSetByHeight(context.Context, abi.ChainEpoch, chain.TipSetKey) (*chain.TipSet, error) //perm:read + + // ChainReadObj reads ipld nodes referenced by the specified CID from chain + // blockstore and returns raw bytes. + ChainReadObj(context.Context, cid.Cid) ([]byte, error) //perm:read + + // ChainDeleteObj deletes node referenced by the given CID + ChainDeleteObj(context.Context, cid.Cid) error //perm:admin + + // ChainHasObj checks if a given CID exists in the chain blockstore. + ChainHasObj(context.Context, cid.Cid) (bool, error) //perm:read + + // ChainStatObj returns statistics about the graph referenced by 'obj'. + // If 'base' is also specified, then the returned stat will be a diff + // between the two objects. + ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (ObjStat, error) //perm:read + + // ChainSetHead forcefully sets current chain head. Use with caution. + ChainSetHead(context.Context, chain.TipSetKey) error //perm:admin + + // ChainGetGenesis returns the genesis tipset. + ChainGetGenesis(context.Context) (*chain.TipSet, error) //perm:read + + // ChainTipSetWeight computes weight for the specified tipset. + ChainTipSetWeight(context.Context, chain.TipSetKey) (chain.BigInt, error) //perm:read + ChainGetNode(ctx context.Context, p string) (*IpldObject, error) //perm:read + + // ChainGetMessage reads a message referenced by the specified CID from the + // chain blockstore. + ChainGetMessage(context.Context, cid.Cid) (*chain.Message, error) //perm:read + + // ChainGetPath returns a set of revert/apply operations needed to get from + // one tipset to another, for example: + //``` + // to + // ^ + // from tAA + // ^ ^ + // tBA tAB + // ^---*--^ + // ^ + // tRR + //``` + // Would return `[revert(tBA), apply(tAB), apply(tAA)]` + ChainGetPath(ctx context.Context, from chain.TipSetKey, to chain.TipSetKey) ([]*HeadChange, error) //perm:read -type IMinerState interface { - // Rule[perm:read] - StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) - // Rule[perm:read] - StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) - // Rule[perm:read] - StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) - // Rule[perm:read] - StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorLocation, error) - // Rule[perm:read] - StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (abi.SectorSize, error) - // Rule[perm:read] - StateMinerInfo(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) - // Rule[perm:read] - StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (address.Address, error) - // Rule[perm:read] - StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) - // Rule[perm:read] - StateMinerFaults(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) - // Rule[perm:read] - StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) - // Rule[perm:read] - StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]apitypes.Partition, error) - // Rule[perm:read] - StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]apitypes.Deadline, error) - // Rule[perm:read] - StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) - // Rule[perm:read] - StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*apitypes.MarketDeal, error) - // Rule[perm:read] - StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) - // Rule[perm:read] - StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) - // Rule[perm:read] - StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (chain.CirculatingSupply, error) - // Rule[perm:read] - StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) - // Rule[perm:read] - StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) - // Rule[perm:read] - StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) - // Rule[perm:read] - StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) - // Rule[perm:read] - StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) - // Rule[perm:read] - StateListActors(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) - // Rule[perm:read] - StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*apitypes.MinerPower, error) - // Rule[perm:read] - StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) - // Rule[perm:read] - StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorExpiration, error) - // Rule[perm:read] - StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (apitypes.MinerSectors, error) - // Rule[perm:read] - StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (apitypes.MarketBalance, error) - // Rule[perm:read] - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (apitypes.DealCollateralBounds, error) - // Rule[perm:read] - StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) + // ChainExport returns a stream of bytes with CAR dump of chain data. + // The exported chain data includes the header chain from the given tipset + // back to genesis, the entire genesis state, and the most recent 'nroots' + // state trees. + // If oldmsgskip is set, messages from before the requested roots are also not included. + ChainExport(ctx context.Context, nroots abi.ChainEpoch, oldmsgskip bool, tsk chain.TipSetKey) (<-chan []byte, error) //perm:read } diff --git a/venus-shared/api/chain/v0/types.go b/venus-shared/api/chain/v0/types.go new file mode 100644 index 0000000000..3fd6c51f0d --- /dev/null +++ b/venus-shared/api/chain/v0/types.go @@ -0,0 +1,35 @@ +package v0 + +import ( + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/ipfs/go-cid" +) + +type HeadChange struct { + Type string + Val *chain.TipSet +} + +// BlsMessages[x].cid = Cids[x] +// SecpkMessages[y].cid = Cids[BlsMessages.length + y] +type BlockMessages struct { + BlsMessages []*chain.Message + SecpkMessages []*chain.SignedMessage + + Cids []cid.Cid +} + +type Message struct { + Cid cid.Cid + Message *chain.Message +} + +type ObjStat struct { + Size uint64 + Links uint64 +} + +type IpldObject struct { + Cid cid.Cid + Obj interface{} +} From fbc8fb43516526dab48fd64d58c3473c4e2dc6fc Mon Sep 17 00:00:00 2001 From: dtynn Date: Thu, 2 Dec 2021 13:25:34 +0800 Subject: [PATCH 058/167] add subcmd: checksum for apis --- Makefile | 2 +- venus-devtool/compatible/apis/checksum.go | 87 +++++++++++++++++++++++ venus-devtool/compatible/apis/main.go | 81 ++++----------------- 3 files changed, 101 insertions(+), 69 deletions(-) create mode 100644 venus-devtool/compatible/apis/checksum.go diff --git a/Makefile b/Makefile index 3be3e2d001..8df47246c1 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ compatible-all: compatible-api compatible-actor compatible-api: api-checksum api-checksum: - cd venus-devtool && go run ./compatible/apis/*.go templates > ../venus-shared/compatible-checks/api-checksum.txt + cd venus-devtool && go run ./compatible/apis/*.go checksum > ../venus-shared/compatible-checks/api-checksum.txt compatible-actor: actor-templates actor-sources actor-render diff --git a/venus-devtool/compatible/apis/checksum.go b/venus-devtool/compatible/apis/checksum.go new file mode 100644 index 0000000000..40c1051e0a --- /dev/null +++ b/venus-devtool/compatible/apis/checksum.go @@ -0,0 +1,87 @@ +package main + +import ( + "bytes" + "crypto/md5" + "fmt" + "reflect" + "strings" + + "github.com/filecoin-project/lotus/api/v0api" + "github.com/filecoin-project/lotus/api/v1api" + "github.com/urfave/cli/v2" +) + +var checksumCmd = &cli.Command{ + Name: "checksum", + Flags: []cli.Flag{}, + Action: func(cctx *cli.Context) error { + wants := []reflect.Type{ + reflect.TypeOf((*v0api.FullNode)(nil)).Elem(), + reflect.TypeOf((*v1api.FullNode)(nil)).Elem(), + } + + var buf bytes.Buffer + for _, rt := range wants { + fmt.Printf("%s:\n", rt) + for mi := 0; mi < rt.NumMethod(); mi++ { + buf.Reset() + meth := rt.Method(mi) + numIn := meth.Type.NumIn() + numOut := meth.Type.NumOut() + + for ii := 0; ii < numIn; ii++ { + inTyp := meth.Type.In(ii) + fmt.Fprintf(&buf, "\tIn: %s\n", formatType(inTyp)) // nolint + } + + for oi := 0; oi < numOut; oi++ { + outTyp := meth.Type.Out(oi) + fmt.Fprintf(&buf, "\tOut: %s\n", formatType(outTyp)) // nolint + } + + fmt.Printf("\t%s:\tIn=%d,\tOut=%d,\tCheckSum=%x\n", meth.Name, numIn, numOut, md5.Sum(buf.Bytes())) + } + fmt.Println() + } + return nil + }, +} + +func formatType(rt reflect.Type) string { + switch rt.Kind() { + case reflect.Array: + return fmt.Sprintf("[%d]%s", rt.Len(), formatType(rt.Elem())) + + case reflect.Chan: + return fmt.Sprintf("%s %s", rt.ChanDir(), formatType(rt.Elem())) + + case reflect.Func: + ins := make([]string, rt.NumIn()) + outs := make([]string, rt.NumOut()) + for i := range ins { + ins[i] = formatType(rt.In(i)) + } + + for i := range outs { + outs[i] = formatType(rt.Out(i)) + } + + return fmt.Sprintf("func(%s) (%s)", strings.Join(ins, ", "), strings.Join(outs, ", ")) + + case reflect.Map: + return fmt.Sprintf("map[%s]%s", formatType(rt.Key()), formatType(rt.Elem())) + + case reflect.Ptr: + return fmt.Sprintf("*%s", formatType(rt.Elem())) + + case reflect.Slice: + return fmt.Sprintf("[]%s", formatType(rt.Elem())) + + default: + if p := rt.PkgPath(); p != "" { + return p + "." + rt.Name() + } + return rt.Name() + } +} diff --git a/venus-devtool/compatible/apis/main.go b/venus-devtool/compatible/apis/main.go index 0f60d7644a..2771a3eab9 100644 --- a/venus-devtool/compatible/apis/main.go +++ b/venus-devtool/compatible/apis/main.go @@ -1,81 +1,26 @@ package main import ( - "bytes" - "crypto/md5" "fmt" - "reflect" - "strings" + "os" - "github.com/filecoin-project/lotus/api/v0api" - "github.com/filecoin-project/lotus/api/v1api" + "github.com/urfave/cli/v2" ) func main() { - wants := []reflect.Type{ - reflect.TypeOf((*v0api.FullNode)(nil)).Elem(), - reflect.TypeOf((*v1api.FullNode)(nil)).Elem(), + app := &cli.App{ + Name: "apis", + Usage: "devtool for api compatible checks between lotus & venus", + EnableBashCompletion: true, + Flags: []cli.Flag{}, + Commands: []*cli.Command{ + checksumCmd, + }, } - var buf bytes.Buffer - for _, rt := range wants { - fmt.Printf("%s:\n", rt) - for mi := 0; mi < rt.NumMethod(); mi++ { - buf.Reset() - meth := rt.Method(mi) - numIn := meth.Type.NumIn() - numOut := meth.Type.NumOut() + app.Setup() - for ii := 0; ii < numIn; ii++ { - inTyp := meth.Type.In(ii) - fmt.Fprintf(&buf, "\tIn: %s\n", formatType(inTyp)) // nolint - } - - for oi := 0; oi < numOut; oi++ { - outTyp := meth.Type.Out(oi) - fmt.Fprintf(&buf, "\tOut: %s\n", formatType(outTyp)) // nolint - } - - fmt.Printf("\t%s:\tIn=%d,\tOut=%d,\tCheckSum=%x\n", meth.Name, numIn, numOut, md5.Sum(buf.Bytes())) - } - fmt.Println() - } -} - -func formatType(rt reflect.Type) string { - switch rt.Kind() { - case reflect.Array: - return fmt.Sprintf("[%d]%s", rt.Len(), formatType(rt.Elem())) - - case reflect.Chan: - return fmt.Sprintf("%s %s", rt.ChanDir(), formatType(rt.Elem())) - - case reflect.Func: - ins := make([]string, rt.NumIn()) - outs := make([]string, rt.NumOut()) - for i := range ins { - ins[i] = formatType(rt.In(i)) - } - - for i := range outs { - outs[i] = formatType(rt.Out(i)) - } - - return fmt.Sprintf("func(%s) (%s)", strings.Join(ins, ", "), strings.Join(outs, ", ")) - - case reflect.Map: - return fmt.Sprintf("map[%s]%s", formatType(rt.Key()), formatType(rt.Elem())) - - case reflect.Ptr: - return fmt.Sprintf("*%s", formatType(rt.Elem())) - - case reflect.Slice: - return fmt.Sprintf("[]%s", formatType(rt.Elem())) - - default: - if p := rt.PkgPath(); p != "" { - return p + "." + rt.Name() - } - return rt.Name() + if err := app.Run(os.Args); err != nil { + fmt.Fprintf(os.Stderr, "ERR: %v\n", err) // nolint: errcheck } } From 1dc2054175f7798d2429d037b9aa86acfd4b35c5 Mon Sep 17 00:00:00 2001 From: dtynn Date: Thu, 2 Dec 2021 15:33:56 +0800 Subject: [PATCH 059/167] add subcmd: diff for apis --- venus-devtool/compatible/apis/diff.go | 102 ++++++++++++++++++++++ venus-devtool/compatible/apis/main.go | 1 + venus-shared/api/chain/v0/chain.go | 117 -------------------------- venus-shared/api/chain/v0/types.go | 35 -------- 4 files changed, 103 insertions(+), 152 deletions(-) create mode 100644 venus-devtool/compatible/apis/diff.go delete mode 100644 venus-shared/api/chain/v0/chain.go delete mode 100644 venus-shared/api/chain/v0/types.go diff --git a/venus-devtool/compatible/apis/diff.go b/venus-devtool/compatible/apis/diff.go new file mode 100644 index 0000000000..c5213bd438 --- /dev/null +++ b/venus-devtool/compatible/apis/diff.go @@ -0,0 +1,102 @@ +package main + +import ( + "fmt" + "reflect" + "sort" + + "github.com/filecoin-project/lotus/api/v1api" + "github.com/urfave/cli/v2" + + "github.com/filecoin-project/venus/venus-shared/api/chain/v1" + "github.com/filecoin-project/venus/venus-shared/typeutil" +) + +var diffCmd = &cli.Command{ + Name: "diff", + Flags: []cli.Flag{}, + Action: func(cctx *cli.Context) error { + pairs := [][2]reflect.Type{ + { + reflect.TypeOf((*v1.FullNode)(nil)).Elem(), + reflect.TypeOf((*v1api.FullNode)(nil)).Elem(), + }, + } + + for _, pair := range pairs { + showDiff(pair[0], pair[1]) + } + return nil + }, +} + +type methDiff struct { + typ string + name string + desc string +} + +func showDiff(impl, origin reflect.Type) { + fmt.Printf("%s <> %s:\n", formatType(impl), formatType(origin)) + implMethods := typeutil.ExportedMethods(impl) + originMethods := typeutil.ExportedMethods(origin) + + implMap := map[string]int{} + originMap := map[string]int{} + diffs := make([]methDiff, 0, len(implMethods)+len(originMethods)) + + for ii := range implMethods { + implMap[implMethods[ii].Name] = ii + } + + for oi := range originMethods { + methName := originMethods[oi].Name + originMap[methName] = oi + + ii, has := implMap[methName] + if !has { + // + diffs = append(diffs, methDiff{ + name: methName, + typ: "-", + }) + continue + } + + similar, reason := typeutil.Similar(implMethods[ii], originMethods[oi], typeutil.JSONCodec|typeutil.CborCodec, typeutil.StructFieldsOrdered) + if similar { + continue + } + + diffs = append(diffs, methDiff{ + typ: ">", + name: methName, + desc: reason.Error(), + }) + } + + for ii := range implMethods { + methName := implMethods[ii].Name + if _, has := originMap[methName]; !has { + diffs = append(diffs, methDiff{ + name: methName, + typ: "+", + }) + } + } + + sort.Slice(diffs, func(i, j int) bool { + return diffs[i].name < diffs[j].name + }) + + for _, d := range diffs { + if d.desc == "" { + fmt.Printf("\t%s %s\n", d.typ, d.name) + continue + } + + fmt.Printf("\t%s %s %s\n", d.typ, d.name, d.desc) + } + + fmt.Println() +} diff --git a/venus-devtool/compatible/apis/main.go b/venus-devtool/compatible/apis/main.go index 2771a3eab9..df23ef34c8 100644 --- a/venus-devtool/compatible/apis/main.go +++ b/venus-devtool/compatible/apis/main.go @@ -15,6 +15,7 @@ func main() { Flags: []cli.Flag{}, Commands: []*cli.Command{ checksumCmd, + diffCmd, }, } diff --git a/venus-shared/api/chain/v0/chain.go b/venus-shared/api/chain/v0/chain.go deleted file mode 100644 index 074606a46f..0000000000 --- a/venus-shared/api/chain/v0/chain.go +++ /dev/null @@ -1,117 +0,0 @@ -package v0 - -import ( - "context" - - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/crypto" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/venus-shared/chain" -) - -type ChainAPI interface { - // MethodGroup: Chain - // The Chain method group contains methods for interacting with the - // blockchain, but that do not require any form of state computation. - - // ChainNotify returns channel with chain head updates. - // First message is guaranteed to be of len == 1, and type == 'current'. - ChainNotify(context.Context) (<-chan []*HeadChange, error) //perm:read - - // ChainHead returns the current head of the chain. - ChainHead(context.Context) (*chain.TipSet, error) //perm:read - - // ChainGetRandomnessFromTickets is used to sample the chain for randomness. - ChainGetRandomnessFromTickets(ctx context.Context, tsk chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read - - // ChainGetRandomnessFromBeacon is used to sample the beacon for randomness. - ChainGetRandomnessFromBeacon(ctx context.Context, tsk chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read - - // ChainGetBlock returns the block specified by the given CID. - ChainGetBlock(context.Context, cid.Cid) (*chain.BlockHeader, error) //perm:read - // ChainGetTipSet returns the tipset specified by the given TipSetKey. - ChainGetTipSet(context.Context, chain.TipSetKey) (*chain.TipSet, error) //perm:read - - // ChainGetBlockMessages returns messages stored in the specified block. - // - // Note: If there are multiple blocks in a tipset, it's likely that some - // messages will be duplicated. It's also possible for blocks in a tipset to have - // different messages from the same sender at the same nonce. When that happens, - // only the first message (in a block with lowest ticket) will be considered - // for execution - // - // NOTE: THIS METHOD SHOULD ONLY BE USED FOR GETTING MESSAGES IN A SPECIFIC BLOCK - // - // DO NOT USE THIS METHOD TO GET MESSAGES INCLUDED IN A TIPSET - // Use ChainGetParentMessages, which will perform correct message deduplication - ChainGetBlockMessages(ctx context.Context, blockCid cid.Cid) (*BlockMessages, error) //perm:read - - // ChainGetParentReceipts returns receipts for messages in parent tipset of - // the specified block. The receipts in the list returned is one-to-one with the - // messages returned by a call to ChainGetParentMessages with the same blockCid. - ChainGetParentReceipts(ctx context.Context, blockCid cid.Cid) ([]*chain.MessageReceipt, error) //perm:read - - // ChainGetParentMessages returns messages stored in parent tipset of the - // specified block. - ChainGetParentMessages(ctx context.Context, blockCid cid.Cid) ([]Message, error) //perm:read - - // ChainGetMessagesInTipset returns message stores in current tipset - ChainGetMessagesInTipset(ctx context.Context, tsk chain.TipSetKey) ([]Message, error) //perm:read - - // ChainGetTipSetByHeight looks back for a tipset at the specified epoch. - // If there are no blocks at the specified epoch, a tipset at an earlier epoch - // will be returned. - ChainGetTipSetByHeight(context.Context, abi.ChainEpoch, chain.TipSetKey) (*chain.TipSet, error) //perm:read - - // ChainReadObj reads ipld nodes referenced by the specified CID from chain - // blockstore and returns raw bytes. - ChainReadObj(context.Context, cid.Cid) ([]byte, error) //perm:read - - // ChainDeleteObj deletes node referenced by the given CID - ChainDeleteObj(context.Context, cid.Cid) error //perm:admin - - // ChainHasObj checks if a given CID exists in the chain blockstore. - ChainHasObj(context.Context, cid.Cid) (bool, error) //perm:read - - // ChainStatObj returns statistics about the graph referenced by 'obj'. - // If 'base' is also specified, then the returned stat will be a diff - // between the two objects. - ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (ObjStat, error) //perm:read - - // ChainSetHead forcefully sets current chain head. Use with caution. - ChainSetHead(context.Context, chain.TipSetKey) error //perm:admin - - // ChainGetGenesis returns the genesis tipset. - ChainGetGenesis(context.Context) (*chain.TipSet, error) //perm:read - - // ChainTipSetWeight computes weight for the specified tipset. - ChainTipSetWeight(context.Context, chain.TipSetKey) (chain.BigInt, error) //perm:read - ChainGetNode(ctx context.Context, p string) (*IpldObject, error) //perm:read - - // ChainGetMessage reads a message referenced by the specified CID from the - // chain blockstore. - ChainGetMessage(context.Context, cid.Cid) (*chain.Message, error) //perm:read - - // ChainGetPath returns a set of revert/apply operations needed to get from - // one tipset to another, for example: - //``` - // to - // ^ - // from tAA - // ^ ^ - // tBA tAB - // ^---*--^ - // ^ - // tRR - //``` - // Would return `[revert(tBA), apply(tAB), apply(tAA)]` - ChainGetPath(ctx context.Context, from chain.TipSetKey, to chain.TipSetKey) ([]*HeadChange, error) //perm:read - - // ChainExport returns a stream of bytes with CAR dump of chain data. - // The exported chain data includes the header chain from the given tipset - // back to genesis, the entire genesis state, and the most recent 'nroots' - // state trees. - // If oldmsgskip is set, messages from before the requested roots are also not included. - ChainExport(ctx context.Context, nroots abi.ChainEpoch, oldmsgskip bool, tsk chain.TipSetKey) (<-chan []byte, error) //perm:read -} diff --git a/venus-shared/api/chain/v0/types.go b/venus-shared/api/chain/v0/types.go deleted file mode 100644 index 3fd6c51f0d..0000000000 --- a/venus-shared/api/chain/v0/types.go +++ /dev/null @@ -1,35 +0,0 @@ -package v0 - -import ( - "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/ipfs/go-cid" -) - -type HeadChange struct { - Type string - Val *chain.TipSet -} - -// BlsMessages[x].cid = Cids[x] -// SecpkMessages[y].cid = Cids[BlsMessages.length + y] -type BlockMessages struct { - BlsMessages []*chain.Message - SecpkMessages []*chain.SignedMessage - - Cids []cid.Cid -} - -type Message struct { - Cid cid.Cid - Message *chain.Message -} - -type ObjStat struct { - Size uint64 - Links uint64 -} - -type IpldObject struct { - Cid cid.Cid - Obj interface{} -} From d80aad23c40a81bc55e2921d9e524d0743d2dce3 Mon Sep 17 00:00:00 2001 From: dtynn Date: Thu, 2 Dec 2021 15:35:48 +0800 Subject: [PATCH 060/167] mv v0 to v1 --- .../api/chain/{v0 => v1}/blockservice.go | 2 +- .../api/chain/{v0 => v1}/blockstore.go | 2 +- venus-shared/api/chain/v1/chain.go | 215 ++++++++++++++++++ venus-shared/api/chain/{v0 => v1}/config.go | 2 +- .../api/chain/{v0 => v1}/discovery.go | 2 +- venus-shared/api/chain/{v0 => v1}/fullnode.go | 2 +- venus-shared/api/chain/{v0 => v1}/jwtauth.go | 2 +- venus-shared/api/chain/{v0 => v1}/market.go | 2 +- venus-shared/api/chain/{v0 => v1}/mining.go | 2 +- venus-shared/api/chain/{v0 => v1}/mpool.go | 2 +- venus-shared/api/chain/{v0 => v1}/multisig.go | 2 +- venus-shared/api/chain/{v0 => v1}/network.go | 2 +- venus-shared/api/chain/{v0 => v1}/paych.go | 2 +- venus-shared/api/chain/{v0 => v1}/syncer.go | 2 +- venus-shared/api/chain/{v0 => v1}/wallet.go | 2 +- 15 files changed, 229 insertions(+), 14 deletions(-) rename venus-shared/api/chain/{v0 => v1}/blockservice.go (96%) rename venus-shared/api/chain/{v0 => v1}/blockstore.go (96%) create mode 100644 venus-shared/api/chain/v1/chain.go rename venus-shared/api/chain/{v0 => v1}/config.go (93%) rename venus-shared/api/chain/{v0 => v1}/discovery.go (65%) rename venus-shared/api/chain/{v0 => v1}/fullnode.go (96%) rename venus-shared/api/chain/{v0 => v1}/jwtauth.go (94%) rename venus-shared/api/chain/{v0 => v1}/market.go (94%) rename venus-shared/api/chain/{v0 => v1}/mining.go (97%) rename venus-shared/api/chain/{v0 => v1}/mpool.go (99%) rename venus-shared/api/chain/{v0 => v1}/multisig.go (99%) rename venus-shared/api/chain/{v0 => v1}/network.go (98%) rename venus-shared/api/chain/{v0 => v1}/paych.go (99%) rename venus-shared/api/chain/{v0 => v1}/syncer.go (98%) rename venus-shared/api/chain/{v0 => v1}/wallet.go (99%) diff --git a/venus-shared/api/chain/v0/blockservice.go b/venus-shared/api/chain/v1/blockservice.go similarity index 96% rename from venus-shared/api/chain/v0/blockservice.go rename to venus-shared/api/chain/v1/blockservice.go index 628d5ab78b..b2648cc3f3 100644 --- a/venus-shared/api/chain/v0/blockservice.go +++ b/venus-shared/api/chain/v1/blockservice.go @@ -1,4 +1,4 @@ -package apiface +package v1 import ( "context" diff --git a/venus-shared/api/chain/v0/blockstore.go b/venus-shared/api/chain/v1/blockstore.go similarity index 96% rename from venus-shared/api/chain/v0/blockstore.go rename to venus-shared/api/chain/v1/blockstore.go index 3252fd303c..546a018b9e 100644 --- a/venus-shared/api/chain/v0/blockstore.go +++ b/venus-shared/api/chain/v1/blockstore.go @@ -1,4 +1,4 @@ -package apiface +package v1 import ( "context" diff --git a/venus-shared/api/chain/v1/chain.go b/venus-shared/api/chain/v1/chain.go new file mode 100644 index 0000000000..925974aa62 --- /dev/null +++ b/venus-shared/api/chain/v1/chain.go @@ -0,0 +1,215 @@ +package v1 + +import ( + "context" + "time" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" + "github.com/filecoin-project/venus/app/submodule/apitypes" + "github.com/filecoin-project/venus/pkg/chain" + "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" + + "github.com/filecoin-project/go-state-types/big" + acrypto "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/network" + "github.com/ipfs/go-cid" +) + +type IChain interface { + IAccount + IActor + IBeacon + IMinerState + IChainInfo +} + +type IAccount interface { + // Rule[perm:read] + StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) +} + +type IActor interface { + // Rule[perm:read] + StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) + // Rule[perm:read] + ListActor(ctx context.Context) (map[address.Address]*types.Actor, error) +} + +type IBeacon interface { + // Rule[perm:read] + BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) +} + +type IChainInfo interface { + // Rule[perm:read] + BlockTime(ctx context.Context) time.Duration + // Rule[perm:read] + ChainList(ctx context.Context, tsKey types.TipSetKey, count int) ([]types.TipSetKey, error) + // Rule[perm:read] + ChainHead(ctx context.Context) (*types.TipSet, error) + // Rule[perm:read] + ChainSetHead(ctx context.Context, key types.TipSetKey) error + // Rule[perm:read] + ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) + // Rule[perm:read] + ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) + // Rule[perm:read] + ChainGetTipSetAfterHeight(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) + // Rule[perm:read] + ChainGetRandomnessFromBeacon(ctx context.Context, key types.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) + // Rule[perm:read] + ChainGetRandomnessFromTickets(ctx context.Context, tsk types.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) + // Rule[perm:read] + StateGetRandomnessFromTickets(ctx context.Context, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) + // Rule[perm:read] + StateGetRandomnessFromBeacon(ctx context.Context, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) + // Rule[perm:read] + ChainGetBlock(ctx context.Context, id cid.Cid) (*types.BlockHeader, error) + // Rule[perm:read] + ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.UnsignedMessage, error) + // Rule[perm:read] + ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*apitypes.BlockMessages, error) + // Rule[perm:read] + ChainGetMessagesInTipset(ctx context.Context, key types.TipSetKey) ([]apitypes.Message, error) + // Rule[perm:read] + ChainGetReceipts(ctx context.Context, id cid.Cid) ([]types.MessageReceipt, error) + // Rule[perm:read] + ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]apitypes.Message, error) + // Rule[perm:read] + ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) + // Rule[perm:read] + StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) + // Rule[perm:read] + StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) + // Rule[perm:read] + ChainNotify(ctx context.Context) <-chan []*chain.HeadChange + // Rule[perm:read] + GetFullBlock(ctx context.Context, id cid.Cid) (*types.FullBlock, error) + // Rule[perm:read] + GetActor(ctx context.Context, addr address.Address) (*types.Actor, error) + // Rule[perm:read] + GetParentStateRootActor(ctx context.Context, ts *types.TipSet, addr address.Address) (*types.Actor, error) + // Rule[perm:read] + GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*types.BeaconEntry, error) + // Rule[perm:read] + MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*chain.ChainMessage, error) + // Rule[perm:read] + ProtocolParameters(ctx context.Context) (*apitypes.ProtocolParams, error) + // Rule[perm:read] + ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) + // Rule[perm:read] + StateNetworkName(ctx context.Context) (apitypes.NetworkName, error) + // StateSearchMsg looks back up to limit epochs in the chain for a message, and returns its receipt and the tipset where it was executed + // + // NOTE: If a replacing message is found on chain, this method will return + // a MsgLookup for the replacing message - the MsgLookup.Message will be a different + // CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the + // result of the execution of the replacing message. + // + // If the caller wants to ensure that exactly the requested message was executed, + // they must check that MsgLookup.Message is equal to the provided 'cid', or set the + // `allowReplaced` parameter to false. Without this check, and with `allowReplaced` + // set to true, both the requested and original message may appear as + // successfully executed on-chain, which may look like a double-spend. + // + // A replacing message is a message with a different CID, any of Gas values, and + // different signature, but with all other parameters matching (source/destination, + // nonce, params, etc.) + // Rule[perm:read] + StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) + // StateWaitMsg looks back up to limit epochs in the chain for a message. + // If not found, it blocks until the message arrives on chain, and gets to the + // indicated confidence depth. + // + // NOTE: If a replacing message is found on chain, this method will return + // a MsgLookup for the replacing message - the MsgLookup.Message will be a different + // CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the + // result of the execution of the replacing message. + // + // If the caller wants to ensure that exactly the requested message was executed, + // they must check that MsgLookup.Message is equal to the provided 'cid', or set the + // `allowReplaced` parameter to false. Without this check, and with `allowReplaced` + // set to true, both the requested and original message may appear as + // successfully executed on-chain, which may look like a double-spend. + // + // A replacing message is a message with a different CID, any of Gas values, and + // different signature, but with all other parameters matching (source/destination, + // nonce, params, etc.) + // Rule[perm:read] + StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) + // Rule[perm:read] + StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) + // Rule[perm:read] + VerifyEntry(parent, child *types.BeaconEntry, height abi.ChainEpoch) bool + // Rule[perm:read] + ChainExport(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []byte, error) + // Rule[perm:read] + ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*chain.HeadChange, error) +} + +type IMinerState interface { + // Rule[perm:read] + StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) + // Rule[perm:read] + StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) + // Rule[perm:read] + StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) + // Rule[perm:read] + StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorLocation, error) + // Rule[perm:read] + StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (abi.SectorSize, error) + // Rule[perm:read] + StateMinerInfo(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) + // Rule[perm:read] + StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (address.Address, error) + // Rule[perm:read] + StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) + // Rule[perm:read] + StateMinerFaults(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) + // Rule[perm:read] + StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) + // Rule[perm:read] + StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]apitypes.Partition, error) + // Rule[perm:read] + StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]apitypes.Deadline, error) + // Rule[perm:read] + StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) + // Rule[perm:read] + StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*apitypes.MarketDeal, error) + // Rule[perm:read] + StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) + // Rule[perm:read] + StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) + // Rule[perm:read] + StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (chain.CirculatingSupply, error) + // Rule[perm:read] + StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) + // Rule[perm:read] + StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) + // Rule[perm:read] + StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) + // Rule[perm:read] + StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) + // Rule[perm:read] + StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) + // Rule[perm:read] + StateListActors(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) + // Rule[perm:read] + StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*apitypes.MinerPower, error) + // Rule[perm:read] + StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) + // Rule[perm:read] + StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorExpiration, error) + // Rule[perm:read] + StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (apitypes.MinerSectors, error) + // Rule[perm:read] + StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (apitypes.MarketBalance, error) + // Rule[perm:read] + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (apitypes.DealCollateralBounds, error) + // Rule[perm:read] + StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) +} diff --git a/venus-shared/api/chain/v0/config.go b/venus-shared/api/chain/v1/config.go similarity index 93% rename from venus-shared/api/chain/v0/config.go rename to venus-shared/api/chain/v1/config.go index 323ce38ba3..907320244e 100644 --- a/venus-shared/api/chain/v0/config.go +++ b/venus-shared/api/chain/v1/config.go @@ -1,4 +1,4 @@ -package apiface +package v1 import "context" diff --git a/venus-shared/api/chain/v0/discovery.go b/venus-shared/api/chain/v1/discovery.go similarity index 65% rename from venus-shared/api/chain/v0/discovery.go rename to venus-shared/api/chain/v1/discovery.go index 8a22c380e2..168f5aa4f7 100644 --- a/venus-shared/api/chain/v0/discovery.go +++ b/venus-shared/api/chain/v1/discovery.go @@ -1,4 +1,4 @@ -package apiface +package v1 type IDiscovery interface { } diff --git a/venus-shared/api/chain/v0/fullnode.go b/venus-shared/api/chain/v1/fullnode.go similarity index 96% rename from venus-shared/api/chain/v0/fullnode.go rename to venus-shared/api/chain/v1/fullnode.go index 7e1e1c1f99..285d44621a 100644 --- a/venus-shared/api/chain/v0/fullnode.go +++ b/venus-shared/api/chain/v1/fullnode.go @@ -11,7 +11,7 @@ TODO: 1. Support global FUNC injection */ -package apiface +package v1 type FullNode interface { IDagService diff --git a/venus-shared/api/chain/v0/jwtauth.go b/venus-shared/api/chain/v1/jwtauth.go similarity index 94% rename from venus-shared/api/chain/v0/jwtauth.go rename to venus-shared/api/chain/v1/jwtauth.go index 705864d690..ce454971bc 100644 --- a/venus-shared/api/chain/v0/jwtauth.go +++ b/venus-shared/api/chain/v1/jwtauth.go @@ -1,4 +1,4 @@ -package apiface +package v1 import ( "context" diff --git a/venus-shared/api/chain/v0/market.go b/venus-shared/api/chain/v1/market.go similarity index 94% rename from venus-shared/api/chain/v0/market.go rename to venus-shared/api/chain/v1/market.go index 3a88cbfab1..65ff9565f0 100644 --- a/venus-shared/api/chain/v0/market.go +++ b/venus-shared/api/chain/v1/market.go @@ -1,4 +1,4 @@ -package apiface +package v1 import ( "context" diff --git a/venus-shared/api/chain/v0/mining.go b/venus-shared/api/chain/v1/mining.go similarity index 97% rename from venus-shared/api/chain/v0/mining.go rename to venus-shared/api/chain/v1/mining.go index d2b5ae6fe2..2d76eb45fb 100644 --- a/venus-shared/api/chain/v0/mining.go +++ b/venus-shared/api/chain/v1/mining.go @@ -1,4 +1,4 @@ -package apiface +package v1 import ( "context" diff --git a/venus-shared/api/chain/v0/mpool.go b/venus-shared/api/chain/v1/mpool.go similarity index 99% rename from venus-shared/api/chain/v0/mpool.go rename to venus-shared/api/chain/v1/mpool.go index ecac02dab7..83bcec9ea6 100644 --- a/venus-shared/api/chain/v0/mpool.go +++ b/venus-shared/api/chain/v1/mpool.go @@ -1,4 +1,4 @@ -package apiface +package v1 import ( "context" diff --git a/venus-shared/api/chain/v0/multisig.go b/venus-shared/api/chain/v1/multisig.go similarity index 99% rename from venus-shared/api/chain/v0/multisig.go rename to venus-shared/api/chain/v1/multisig.go index 7795b4befd..54bdc4347e 100644 --- a/venus-shared/api/chain/v0/multisig.go +++ b/venus-shared/api/chain/v1/multisig.go @@ -1,4 +1,4 @@ -package apiface +package v1 import ( "context" diff --git a/venus-shared/api/chain/v0/network.go b/venus-shared/api/chain/v1/network.go similarity index 98% rename from venus-shared/api/chain/v0/network.go rename to venus-shared/api/chain/v1/network.go index db5bf753dd..735ff8e795 100644 --- a/venus-shared/api/chain/v0/network.go +++ b/venus-shared/api/chain/v1/network.go @@ -1,4 +1,4 @@ -package apiface +package v1 import ( "context" diff --git a/venus-shared/api/chain/v0/paych.go b/venus-shared/api/chain/v1/paych.go similarity index 99% rename from venus-shared/api/chain/v0/paych.go rename to venus-shared/api/chain/v1/paych.go index 4c44b2f16b..e35d42f824 100644 --- a/venus-shared/api/chain/v0/paych.go +++ b/venus-shared/api/chain/v1/paych.go @@ -1,4 +1,4 @@ -package apiface +package v1 import ( "context" diff --git a/venus-shared/api/chain/v0/syncer.go b/venus-shared/api/chain/v1/syncer.go similarity index 98% rename from venus-shared/api/chain/v0/syncer.go rename to venus-shared/api/chain/v1/syncer.go index 43fe60229e..24f6bdf0a5 100644 --- a/venus-shared/api/chain/v0/syncer.go +++ b/venus-shared/api/chain/v1/syncer.go @@ -1,4 +1,4 @@ -package apiface +package v1 import ( "context" diff --git a/venus-shared/api/chain/v0/wallet.go b/venus-shared/api/chain/v1/wallet.go similarity index 99% rename from venus-shared/api/chain/v0/wallet.go rename to venus-shared/api/chain/v1/wallet.go index 19c1e27e69..ca5d30006a 100644 --- a/venus-shared/api/chain/v0/wallet.go +++ b/venus-shared/api/chain/v1/wallet.go @@ -1,4 +1,4 @@ -package apiface +package v1 import ( "context" From 88d786016253c5c93e5e77e74231e41b560f7638 Mon Sep 17 00:00:00 2001 From: dtynn Date: Thu, 2 Dec 2021 16:51:18 +0800 Subject: [PATCH 061/167] introduce api/chain/v1 --- venus-shared/api/chain/v1/blockservice.go | 19 -- venus-shared/api/chain/v1/blockstore.go | 4 +- venus-shared/api/chain/v1/chain.go | 146 +++++----- venus-shared/api/chain/v1/config.go | 10 - venus-shared/api/chain/v1/discovery.go | 4 - venus-shared/api/chain/v1/fullnode.go | 3 - venus-shared/api/chain/v1/jwtauth.go | 1 + venus-shared/api/chain/v1/market.go | 5 +- venus-shared/api/chain/v1/mining.go | 8 +- venus-shared/api/chain/v1/mpool.go | 43 ++- venus-shared/api/chain/v1/multisig.go | 31 +-- venus-shared/api/chain/v1/network.go | 6 +- venus-shared/api/chain/v1/paych.go | 20 +- venus-shared/api/chain/v1/syncer.go | 20 +- venus-shared/api/chain/v1/types.go | 311 ++++++++++++++++++++++ venus-shared/api/chain/v1/wallet.go | 13 +- venus-shared/api/version.go | 7 + venus-shared/chain/supply.go | 12 + venus-shared/go.mod | 2 + venus-shared/go.sum | 39 +++ venus-shared/libp2p/net/net.go | 53 ++++ venus-shared/messagepool/config.go | 16 ++ venus-shared/messagepool/mpool.go | 55 ++++ venus-shared/stmgr/exec.go | 106 ++++++++ venus-shared/wallet/key_info.go | 59 ++++ venus-shared/wallet/msg_meta.go | 26 ++ 26 files changed, 832 insertions(+), 187 deletions(-) delete mode 100644 venus-shared/api/chain/v1/blockservice.go delete mode 100644 venus-shared/api/chain/v1/config.go delete mode 100644 venus-shared/api/chain/v1/discovery.go create mode 100644 venus-shared/api/chain/v1/types.go create mode 100644 venus-shared/api/version.go create mode 100644 venus-shared/chain/supply.go create mode 100644 venus-shared/libp2p/net/net.go create mode 100644 venus-shared/messagepool/config.go create mode 100644 venus-shared/messagepool/mpool.go create mode 100644 venus-shared/stmgr/exec.go create mode 100644 venus-shared/wallet/key_info.go create mode 100644 venus-shared/wallet/msg_meta.go diff --git a/venus-shared/api/chain/v1/blockservice.go b/venus-shared/api/chain/v1/blockservice.go deleted file mode 100644 index b2648cc3f3..0000000000 --- a/venus-shared/api/chain/v1/blockservice.go +++ /dev/null @@ -1,19 +0,0 @@ -package v1 - -import ( - "context" - "github.com/ipfs/go-cid" - ipld "github.com/ipfs/go-ipld-format" - "io" -) - -type IDagService interface { - // Rule[perm:read] - DAGGetNode(ctx context.Context, ref string) (interface{}, error) - // Rule[perm:read] - DAGGetFileSize(ctx context.Context, c cid.Cid) (uint64, error) - // Rule[perm:read] - DAGCat(ctx context.Context, c cid.Cid) (io.Reader, error) - // Rule[perm:read] - DAGImportData(ctx context.Context, data io.Reader) (ipld.Node, error) -} diff --git a/venus-shared/api/chain/v1/blockstore.go b/venus-shared/api/chain/v1/blockstore.go index 546a018b9e..b49aefa1a4 100644 --- a/venus-shared/api/chain/v1/blockstore.go +++ b/venus-shared/api/chain/v1/blockstore.go @@ -4,8 +4,6 @@ import ( "context" "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/app/submodule/apitypes" ) type IBlockStore interface { @@ -16,5 +14,5 @@ type IBlockStore interface { // Rule[perm:read] ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) // Rule[perm:read] - ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (apitypes.ObjStat, error) + ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (ObjStat, error) } diff --git a/venus-shared/api/chain/v1/chain.go b/venus-shared/api/chain/v1/chain.go index 925974aa62..47c7ea4dd9 100644 --- a/venus-shared/api/chain/v1/chain.go +++ b/venus-shared/api/chain/v1/chain.go @@ -7,16 +7,14 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/chain" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" - "github.com/filecoin-project/go-state-types/big" acrypto "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/chain" ) type IChain interface { @@ -29,80 +27,80 @@ type IChain interface { type IAccount interface { // Rule[perm:read] - StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) + StateAccountKey(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (address.Address, error) } type IActor interface { // Rule[perm:read] - StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) + StateGetActor(ctx context.Context, actor address.Address, tsk chain.TipSetKey) (*chain.Actor, error) // Rule[perm:read] - ListActor(ctx context.Context) (map[address.Address]*types.Actor, error) + ListActor(ctx context.Context) (map[address.Address]*chain.Actor, error) } type IBeacon interface { // Rule[perm:read] - BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) + BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*chain.BeaconEntry, error) } type IChainInfo interface { // Rule[perm:read] BlockTime(ctx context.Context) time.Duration // Rule[perm:read] - ChainList(ctx context.Context, tsKey types.TipSetKey, count int) ([]types.TipSetKey, error) + ChainList(ctx context.Context, tsKey chain.TipSetKey, count int) ([]chain.TipSetKey, error) // Rule[perm:read] - ChainHead(ctx context.Context) (*types.TipSet, error) + ChainHead(ctx context.Context) (*chain.TipSet, error) // Rule[perm:read] - ChainSetHead(ctx context.Context, key types.TipSetKey) error + ChainSetHead(ctx context.Context, key chain.TipSetKey) error // Rule[perm:read] - ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) + ChainGetTipSet(ctx context.Context, key chain.TipSetKey) (*chain.TipSet, error) // Rule[perm:read] - ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) + ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk chain.TipSetKey) (*chain.TipSet, error) // Rule[perm:read] - ChainGetTipSetAfterHeight(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) + ChainGetTipSetAfterHeight(ctx context.Context, height abi.ChainEpoch, tsk chain.TipSetKey) (*chain.TipSet, error) // Rule[perm:read] - ChainGetRandomnessFromBeacon(ctx context.Context, key types.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) + ChainGetRandomnessFromBeacon(ctx context.Context, key chain.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) // Rule[perm:read] - ChainGetRandomnessFromTickets(ctx context.Context, tsk types.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) + ChainGetRandomnessFromTickets(ctx context.Context, tsk chain.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) // Rule[perm:read] - StateGetRandomnessFromTickets(ctx context.Context, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) + StateGetRandomnessFromTickets(ctx context.Context, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk chain.TipSetKey) (abi.Randomness, error) // Rule[perm:read] - StateGetRandomnessFromBeacon(ctx context.Context, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) + StateGetRandomnessFromBeacon(ctx context.Context, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk chain.TipSetKey) (abi.Randomness, error) // Rule[perm:read] - ChainGetBlock(ctx context.Context, id cid.Cid) (*types.BlockHeader, error) + ChainGetBlock(ctx context.Context, id cid.Cid) (*chain.BlockHeader, error) // Rule[perm:read] - ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.UnsignedMessage, error) + ChainGetMessage(ctx context.Context, msgID cid.Cid) (*chain.Message, error) // Rule[perm:read] - ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*apitypes.BlockMessages, error) + ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*BlockMessages, error) // Rule[perm:read] - ChainGetMessagesInTipset(ctx context.Context, key types.TipSetKey) ([]apitypes.Message, error) + ChainGetMessagesInTipset(ctx context.Context, key chain.TipSetKey) ([]Message, error) // Rule[perm:read] - ChainGetReceipts(ctx context.Context, id cid.Cid) ([]types.MessageReceipt, error) + ChainGetReceipts(ctx context.Context, id cid.Cid) ([]chain.MessageReceipt, error) // Rule[perm:read] - ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]apitypes.Message, error) + ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]Message, error) // Rule[perm:read] - ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) + ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*chain.MessageReceipt, error) // Rule[perm:read] - StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) + StateVerifiedRegistryRootKey(ctx context.Context, tsk chain.TipSetKey) (address.Address, error) // Rule[perm:read] - StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) + StateVerifierStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) // Rule[perm:read] - ChainNotify(ctx context.Context) <-chan []*chain.HeadChange + ChainNotify(ctx context.Context) <-chan []*HeadChange // Rule[perm:read] - GetFullBlock(ctx context.Context, id cid.Cid) (*types.FullBlock, error) + GetFullBlock(ctx context.Context, id cid.Cid) (*chain.FullBlock, error) // Rule[perm:read] - GetActor(ctx context.Context, addr address.Address) (*types.Actor, error) + GetActor(ctx context.Context, addr address.Address) (*chain.Actor, error) // Rule[perm:read] - GetParentStateRootActor(ctx context.Context, ts *types.TipSet, addr address.Address) (*types.Actor, error) + GetParentStateRootActor(ctx context.Context, ts *chain.TipSet, addr address.Address) (*chain.Actor, error) // Rule[perm:read] - GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*types.BeaconEntry, error) + GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*chain.BeaconEntry, error) // Rule[perm:read] - MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*chain.ChainMessage, error) + MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*ChainMessage, error) // Rule[perm:read] - ProtocolParameters(ctx context.Context) (*apitypes.ProtocolParams, error) + ProtocolParameters(ctx context.Context) (*ProtocolParams, error) // Rule[perm:read] - ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) + ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *chain.TipSet) (address.Address, error) // Rule[perm:read] - StateNetworkName(ctx context.Context) (apitypes.NetworkName, error) + StateNetworkName(ctx context.Context) (NetworkName, error) // StateSearchMsg looks back up to limit epochs in the chain for a message, and returns its receipt and the tipset where it was executed // // NOTE: If a replacing message is found on chain, this method will return @@ -120,7 +118,7 @@ type IChainInfo interface { // different signature, but with all other parameters matching (source/destination, // nonce, params, etc.) // Rule[perm:read] - StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) + StateSearchMsg(ctx context.Context, from chain.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*MsgLookup, error) // StateWaitMsg looks back up to limit epochs in the chain for a message. // If not found, it blocks until the message arrives on chain, and gets to the // indicated confidence depth. @@ -140,76 +138,76 @@ type IChainInfo interface { // different signature, but with all other parameters matching (source/destination, // nonce, params, etc.) // Rule[perm:read] - StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) + StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*MsgLookup, error) // Rule[perm:read] - StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) + StateNetworkVersion(ctx context.Context, tsk chain.TipSetKey) (network.Version, error) // Rule[perm:read] - VerifyEntry(parent, child *types.BeaconEntry, height abi.ChainEpoch) bool + VerifyEntry(parent, child *chain.BeaconEntry, height abi.ChainEpoch) bool // Rule[perm:read] - ChainExport(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []byte, error) + ChainExport(context.Context, abi.ChainEpoch, bool, chain.TipSetKey) (<-chan []byte, error) // Rule[perm:read] - ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*chain.HeadChange, error) + ChainGetPath(ctx context.Context, from chain.TipSetKey, to chain.TipSetKey) ([]*HeadChange, error) } type IMinerState interface { // Rule[perm:read] - StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) + StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk chain.TipSetKey) (bool, error) // Rule[perm:read] - StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) + StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) // Rule[perm:read] - StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) + StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorOnChainInfo, error) // Rule[perm:read] - StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorLocation, error) + StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorLocation, error) // Rule[perm:read] - StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (abi.SectorSize, error) + StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (abi.SectorSize, error) // Rule[perm:read] - StateMinerInfo(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) + StateMinerInfo(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (miner.MinerInfo, error) // Rule[perm:read] - StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (address.Address, error) + StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (address.Address, error) // Rule[perm:read] - StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) + StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (bitfield.BitField, error) // Rule[perm:read] - StateMinerFaults(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) + StateMinerFaults(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (bitfield.BitField, error) // Rule[perm:read] - StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) + StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (*dline.Info, error) // Rule[perm:read] - StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]apitypes.Partition, error) + StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk chain.TipSetKey) ([]Partition, error) // Rule[perm:read] - StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]apitypes.Deadline, error) + StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]Deadline, error) // Rule[perm:read] - StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) + StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) // Rule[perm:read] - StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*apitypes.MarketDeal, error) + StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk chain.TipSetKey) (*MarketDeal, error) // Rule[perm:read] - StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) + StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) // Rule[perm:read] - StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) + StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) // Rule[perm:read] - StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (chain.CirculatingSupply, error) + StateVMCirculatingSupplyInternal(ctx context.Context, tsk chain.TipSetKey) (chain.CirculatingSupply, error) // Rule[perm:read] - StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) + StateCirculatingSupply(ctx context.Context, tsk chain.TipSetKey) (abi.TokenAmount, error) // Rule[perm:read] - StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) + StateMarketDeals(ctx context.Context, tsk chain.TipSetKey) (map[string]MarketDeal, error) // Rule[perm:read] - StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) + StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) // Rule[perm:read] - StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) + StateLookupID(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (address.Address, error) // Rule[perm:read] - StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) + StateListMiners(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) // Rule[perm:read] - StateListActors(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) + StateListActors(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) // Rule[perm:read] - StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*apitypes.MinerPower, error) + StateMinerPower(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*MinerPower, error) // Rule[perm:read] - StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) + StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (big.Int, error) // Rule[perm:read] - StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorExpiration, error) + StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorExpiration, error) // Rule[perm:read] - StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (apitypes.MinerSectors, error) + StateMinerSectorCount(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (MinerSectors, error) // Rule[perm:read] - StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (apitypes.MarketBalance, error) + StateMarketBalance(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (MarketBalance, error) // Rule[perm:read] - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (apitypes.DealCollateralBounds, error) + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk chain.TipSetKey) (DealCollateralBounds, error) // Rule[perm:read] - StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) + StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) } diff --git a/venus-shared/api/chain/v1/config.go b/venus-shared/api/chain/v1/config.go deleted file mode 100644 index 907320244e..0000000000 --- a/venus-shared/api/chain/v1/config.go +++ /dev/null @@ -1,10 +0,0 @@ -package v1 - -import "context" - -type IConfig interface { - // Rule[perm:read] - ConfigSet(ctx context.Context, dottedPath string, paramJSON string) error - // Rule[perm:read] - ConfigGet(ctx context.Context, dottedPath string) (interface{}, error) -} diff --git a/venus-shared/api/chain/v1/discovery.go b/venus-shared/api/chain/v1/discovery.go deleted file mode 100644 index 168f5aa4f7..0000000000 --- a/venus-shared/api/chain/v1/discovery.go +++ /dev/null @@ -1,4 +0,0 @@ -package v1 - -type IDiscovery interface { -} diff --git a/venus-shared/api/chain/v1/fullnode.go b/venus-shared/api/chain/v1/fullnode.go index 285d44621a..031b07235e 100644 --- a/venus-shared/api/chain/v1/fullnode.go +++ b/venus-shared/api/chain/v1/fullnode.go @@ -14,11 +14,8 @@ TODO: package v1 type FullNode interface { - IDagService IBlockStore IChain - IConfig - IDiscovery IMarket IMining IMessagePool diff --git a/venus-shared/api/chain/v1/jwtauth.go b/venus-shared/api/chain/v1/jwtauth.go index ce454971bc..c4fe684a9f 100644 --- a/venus-shared/api/chain/v1/jwtauth.go +++ b/venus-shared/api/chain/v1/jwtauth.go @@ -2,6 +2,7 @@ package v1 import ( "context" + "github.com/filecoin-project/go-jsonrpc/auth" ) diff --git a/venus-shared/api/chain/v1/market.go b/venus-shared/api/chain/v1/market.go index 65ff9565f0..78c6fd5e14 100644 --- a/venus-shared/api/chain/v1/market.go +++ b/venus-shared/api/chain/v1/market.go @@ -3,11 +3,10 @@ package v1 import ( "context" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/venus-shared/chain" ) type IMarket interface { // Rule[perm:read] - StateMarketParticipants(ctx context.Context, tsk types.TipSetKey) (map[string]apitypes.MarketBalance, error) //perm:admin + StateMarketParticipants(ctx context.Context, tsk chain.TipSetKey) (map[string]MarketBalance, error) //perm:admin } diff --git a/venus-shared/api/chain/v1/mining.go b/venus-shared/api/chain/v1/mining.go index 2d76eb45fb..a15c34ccaf 100644 --- a/venus-shared/api/chain/v1/mining.go +++ b/venus-shared/api/chain/v1/mining.go @@ -4,13 +4,13 @@ import ( "context" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/types" + + "github.com/filecoin-project/venus/venus-shared/chain" ) type IMining interface { // Rule[perm:read] - MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*apitypes.MiningBaseInfo, error) + MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk chain.TipSetKey) (*MiningBaseInfo, error) // Rule[perm:read] - MinerCreateBlock(ctx context.Context, bt *apitypes.BlockTemplate) (*types.BlockMsg, error) + MinerCreateBlock(ctx context.Context, bt *BlockTemplate) (*chain.BlockMsg, error) } diff --git a/venus-shared/api/chain/v1/mpool.go b/venus-shared/api/chain/v1/mpool.go index 83bcec9ea6..7b06b144a3 100644 --- a/venus-shared/api/chain/v1/mpool.go +++ b/venus-shared/api/chain/v1/mpool.go @@ -3,13 +3,12 @@ package v1 import ( "context" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/pkg/messagepool" - "github.com/filecoin-project/venus/pkg/types" "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/messagepool" ) type IMessagePool interface { @@ -18,52 +17,52 @@ type IMessagePool interface { // Rule[perm:read] MpoolPublishByAddr(context.Context, address.Address) error // Rule[perm:read] - MpoolPublishMessage(ctx context.Context, smsg *types.SignedMessage) error + MpoolPublishMessage(ctx context.Context, smsg *chain.SignedMessage) error // Rule[perm:read] - MpoolPush(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) + MpoolPush(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) // Rule[perm:read] MpoolGetConfig(context.Context) (*messagepool.MpoolConfig, error) // Rule[perm:read] MpoolSetConfig(ctx context.Context, cfg *messagepool.MpoolConfig) error // Rule[perm:read] - MpoolSelect(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) + MpoolSelect(context.Context, chain.TipSetKey, float64) ([]*chain.SignedMessage, error) // Rule[perm:read] - MpoolSelects(context.Context, types.TipSetKey, []float64) ([][]*types.SignedMessage, error) + MpoolSelects(context.Context, chain.TipSetKey, []float64) ([][]*chain.SignedMessage, error) // Rule[perm:read] - MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*types.SignedMessage, error) + MpoolPending(ctx context.Context, tsk chain.TipSetKey) ([]*chain.SignedMessage, error) // Rule[perm:read] MpoolClear(ctx context.Context, local bool) error // Rule[perm:read] - MpoolPushUntrusted(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) + MpoolPushUntrusted(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) // Rule[perm:read] - MpoolPushMessage(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec) (*types.SignedMessage, error) + MpoolPushMessage(ctx context.Context, msg *chain.Message, spec *MessageSendSpec) (*chain.SignedMessage, error) // Rule[perm:read] - MpoolBatchPush(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) + MpoolBatchPush(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) // Rule[perm:read] - MpoolBatchPushUntrusted(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) + MpoolBatchPushUntrusted(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) // Rule[perm:read] - MpoolBatchPushMessage(ctx context.Context, msgs []*types.UnsignedMessage, spec *types.MessageSendSpec) ([]*types.SignedMessage, error) + MpoolBatchPushMessage(ctx context.Context, msgs []*chain.Message, spec *MessageSendSpec) ([]*chain.SignedMessage, error) // Rule[perm:read] MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) // Rule[perm:read] MpoolSub(ctx context.Context) (<-chan messagepool.MpoolUpdate, error) // Rule[perm:read] - GasEstimateMessageGas(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec, tsk types.TipSetKey) (*types.UnsignedMessage, error) + GasEstimateMessageGas(ctx context.Context, msg *chain.Message, spec *MessageSendSpec, tsk chain.TipSetKey) (*chain.Message, error) // Rule[perm:read] - GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) + GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*EstimateMessage, fromNonce uint64, tsk chain.TipSetKey) ([]*EstimateResult, error) // Rule[perm:read] - GasEstimateFeeCap(ctx context.Context, msg *types.UnsignedMessage, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) + GasEstimateFeeCap(ctx context.Context, msg *chain.Message, maxqueueblks int64, tsk chain.TipSetKey) (big.Int, error) // Rule[perm:read] - GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk types.TipSetKey) (big.Int, error) + GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk chain.TipSetKey) (big.Int, error) // Rule[perm:read] - GasEstimateGasLimit(ctx context.Context, msgIn *types.UnsignedMessage, tsk types.TipSetKey) (int64, error) + GasEstimateGasLimit(ctx context.Context, msgIn *chain.Message, tsk chain.TipSetKey) (int64, error) // MpoolCheckMessages performs logical checks on a batch of messages // Rule[perm:read] - MpoolCheckMessages(ctx context.Context, protos []*apitypes.MessagePrototype) ([][]apitypes.MessageCheckStatus, error) + MpoolCheckMessages(ctx context.Context, protos []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) // MpoolCheckPendingMessages performs logical checks for all pending messages from a given address // Rule[perm:read] - MpoolCheckPendingMessages(ctx context.Context, addr address.Address) ([][]apitypes.MessageCheckStatus, error) + MpoolCheckPendingMessages(ctx context.Context, addr address.Address) ([][]messagepool.MessageCheckStatus, error) // MpoolCheckReplaceMessages performs logical checks on pending messages with replacement // Rule[perm:read] - MpoolCheckReplaceMessages(ctx context.Context, msg []*types.Message) ([][]apitypes.MessageCheckStatus, error) + MpoolCheckReplaceMessages(ctx context.Context, msg []*chain.Message) ([][]messagepool.MessageCheckStatus, error) } diff --git a/venus-shared/api/chain/v1/multisig.go b/venus-shared/api/chain/v1/multisig.go index 54bdc4347e..7bce87615b 100644 --- a/venus-shared/api/chain/v1/multisig.go +++ b/venus-shared/api/chain/v1/multisig.go @@ -5,35 +5,36 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/types" + + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/messagepool" ) type IMultiSig interface { // Rule[perm:read] - MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (*apitypes.MessagePrototype, error) + MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val chain.BigInt, src address.Address, gp chain.BigInt) (*messagepool.MessagePrototype, error) // Rule[perm:read] - MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) + MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) // Rule[perm:read] - MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*apitypes.MessagePrototype, error) + MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) // Rule[perm:read] - MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*apitypes.MessagePrototype, error) + MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) // Rule[perm:read] - MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*apitypes.MessagePrototype, error) + MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) // Rule[perm:read] - MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*apitypes.MessagePrototype, error) + MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) // Rule[perm:read] - MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*apitypes.MessagePrototype, error) + MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) // Rule[perm:read] - MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*apitypes.MessagePrototype, error) + MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) // Rule[perm:read] - MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*apitypes.MessagePrototype, error) + MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) // Rule[perm:read] - MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) + MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) // Rule[perm:read] - MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) + MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) // Rule[perm:read] - MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*apitypes.MessagePrototype, error) + MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*messagepool.MessagePrototype, error) // Rule[perm:read] - MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) + MsigGetVested(ctx context.Context, addr address.Address, start chain.TipSetKey, end chain.TipSetKey) (chain.BigInt, error) } diff --git a/venus-shared/api/chain/v1/network.go b/venus-shared/api/chain/v1/network.go index 735ff8e795..c4564f3c4b 100644 --- a/venus-shared/api/chain/v1/network.go +++ b/venus-shared/api/chain/v1/network.go @@ -2,13 +2,13 @@ package v1 import ( "context" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/net" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" + + "github.com/filecoin-project/venus/venus-shared/libp2p/net" ) type INetwork interface { @@ -29,7 +29,7 @@ type INetwork interface { // Rule[perm:read] NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) // Rule[perm:read] - Version(context.Context) (apitypes.Version, error) + Version(context.Context) (Version, error) // Rule[perm:read] NetAddrsListen(context.Context) (peer.AddrInfo, error) } diff --git a/venus-shared/api/chain/v1/paych.go b/venus-shared/api/chain/v1/paych.go index e35d42f824..d7e975b896 100644 --- a/venus-shared/api/chain/v1/paych.go +++ b/venus-shared/api/chain/v1/paych.go @@ -2,15 +2,11 @@ package v1 import ( "context" - "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/paychmgr" - "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/specs-actors/actors/builtin/paych" "github.com/ipfs/go-cid" - - "github.com/filecoin-project/go-address" ) type IPaychan interface { @@ -19,16 +15,16 @@ type IPaychan interface { // @to: the payment channel recipient // @amt: the deposits funds in the payment channel // Rule[perm:read] - PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*apitypes.ChannelInfo, error) + PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*ChannelInfo, error) // PaychAvailableFunds get the status of an outbound payment channel // @pch: payment channel address // Rule[perm:read] - PaychAvailableFunds(ctx context.Context, ch address.Address) (*paychmgr.ChannelAvailableFunds, error) + PaychAvailableFunds(ctx context.Context, ch address.Address) (*ChannelAvailableFunds, error) // PaychAvailableFundsByFromTo get the status of an outbound payment channel // @from: the payment channel sender // @to: he payment channel recipient // Rule[perm:read] - PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*paychmgr.ChannelAvailableFunds, error) + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*ChannelAvailableFunds, error) // PaychGetWaitReady waits until the create channel / add funds message with the sentinel // @sentinel: given message CID arrives. // @ch: the returned channel address can safely be used against the Manager methods. @@ -43,14 +39,14 @@ type IPaychan interface { // @to: the payment channel recipient // @vouchers: the outstanding (non-redeemed) vouchers // Rule[perm:read] - PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []apitypes.VoucherSpec) (*apitypes.PaymentInfo, error) + PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []VoucherSpec) (*PaymentInfo, error) // PaychList list the addresses of all channels that have been created // Rule[perm:read] PaychList(ctx context.Context) ([]address.Address, error) // PaychStatus get the payment channel status // @pch: payment channel address // Rule[perm:read] - PaychStatus(ctx context.Context, pch address.Address) (*types.PaychStatus, error) + PaychStatus(ctx context.Context, pch address.Address) (*PaychStatus, error) // PaychSettle update payment channel status to settle // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain // @pch: payment channel address @@ -88,7 +84,7 @@ type IPaychan interface { // If there are insufficient funds in the channel to create the voucher, // returns a nil voucher and the shortfall. // Rule[perm:read] - PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paychmgr.VoucherCreateResult, error) + PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*VoucherCreateResult, error) // PaychVoucherList list vouchers in payment channel // @pch: payment channel address // Rule[perm:read] diff --git a/venus-shared/api/chain/v1/syncer.go b/venus-shared/api/chain/v1/syncer.go index 24f6bdf0a5..84556c03c0 100644 --- a/venus-shared/api/chain/v1/syncer.go +++ b/venus-shared/api/chain/v1/syncer.go @@ -2,27 +2,29 @@ package v1 import ( "context" + "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/app/submodule/apitypes" - syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" - "github.com/filecoin-project/venus/pkg/types" + + "github.com/filecoin-project/venus/venus-shared/chain" ) type ISyncer interface { // Rule[perm:read] - ChainSyncHandleNewTipSet(ctx context.Context, ci *types.ChainInfo) error + ChainSyncHandleNewTipSet(ctx context.Context, ci *ChainInfo) error // Rule[perm:read] SetConcurrent(ctx context.Context, concurrent int64) error + // Rule[perm:read] - SyncerTracker(ctx context.Context) *syncTypes.TargetTracker + // SyncerTracker(ctx context.Context) *syncTypes.TargetTracker + // Rule[perm:read] Concurrent(ctx context.Context) int64 // Rule[perm:read] - ChainTipSetWeight(ctx context.Context, tsk types.TipSetKey) (big.Int, error) + ChainTipSetWeight(ctx context.Context, tsk chain.TipSetKey) (big.Int, error) // Rule[perm:read] - SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error + SyncSubmitBlock(ctx context.Context, blk *chain.BlockMsg) error // Rule[perm:read] - StateCall(ctx context.Context, msg *types.UnsignedMessage, tsk types.TipSetKey) (*types.InvocResult, error) + StateCall(ctx context.Context, msg *chain.Message, tsk chain.TipSetKey) (*InvocResult, error) // Rule[perm:read] - SyncState(ctx context.Context) (*apitypes.SyncState, error) + SyncState(ctx context.Context) (*SyncState, error) } diff --git a/venus-shared/api/chain/v1/types.go b/venus-shared/api/chain/v1/types.go new file mode 100644 index 0000000000..854c0dbace --- /dev/null +++ b/venus-shared/api/chain/v1/types.go @@ -0,0 +1,311 @@ +package v1 + +import ( + "fmt" + "time" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" + "github.com/filecoin-project/venus/venus-shared/api" + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/stmgr" +) + +type ObjStat struct { + Size uint64 + Links uint64 +} + +type HeadChange struct { + Type string + Val *chain.TipSet +} + +// ChainMessage is an on-chain message with its block and receipt. +type ChainMessage struct { //nolint + TS *chain.TipSet + Message *chain.Message + Block *chain.BlockHeader + Receipt *chain.MessageReceipt +} + +// BlsMessages[x].cid = Cids[x] +// SecpkMessages[y].cid = Cids[BlsMessages.length + y] +type BlockMessages struct { + BlsMessages []*chain.Message + SecpkMessages []*chain.SignedMessage + Cids []cid.Cid +} + +type Message struct { + Cid cid.Cid + Message *chain.Message +} + +type NetworkName string + +type Partition struct { + AllSectors bitfield.BitField + FaultySectors bitfield.BitField + RecoveringSectors bitfield.BitField + LiveSectors bitfield.BitField + ActiveSectors bitfield.BitField +} + +// SectorInfo provides information about a sector construction +type SectorInfo struct { + Size abi.SectorSize + MaxPieceSize abi.UnpaddedPieceSize +} + +type ProtocolParams struct { + Network string + BlockTime time.Duration + SupportedSectors []SectorInfo +} + +type Deadline struct { + PostSubmissions bitfield.BitField + DisputableProofCount uint64 +} + +type MarketDeal struct { + Proposal market.DealProposal + State market.DealState +} + +type MinerPower struct { + MinerPower power.Claim + TotalPower power.Claim + HasMinPower bool +} + +type MinerSectors struct { + // Live sectors that should be proven. + Live uint64 + // Sectors actively contributing to power. + Active uint64 + // Sectors with failed proofs. + Faulty uint64 +} + +type MarketBalance struct { + Escrow big.Int + Locked big.Int +} + +type DealCollateralBounds struct { + Min abi.TokenAmount + Max abi.TokenAmount +} + +type MsgLookup struct { + Message cid.Cid // Can be different than requested, in case it was replaced, but only gas values changed + Receipt chain.MessageReceipt + ReturnDec interface{} + TipSet chain.TipSetKey + Height abi.ChainEpoch +} + +type MiningBaseInfo struct { //nolint + MinerPower abi.StoragePower + NetworkPower abi.StoragePower + Sectors []builtin.SectorInfo + WorkerKey address.Address + SectorSize abi.SectorSize + PrevBeaconEntry chain.BeaconEntry + BeaconEntries []chain.BeaconEntry + EligibleForMining bool +} + +type BlockTemplate struct { + Miner address.Address + Parents chain.TipSetKey + Ticket chain.Ticket + Eproof *chain.ElectionProof + BeaconValues []*chain.BeaconEntry + Messages []*chain.SignedMessage + Epoch abi.ChainEpoch + Timestamp uint64 + WinningPoStProof []builtin.PoStProof +} + +type EstimateMessage struct { + Msg *Message + Spec *MessageSendSpec +} + +type EstimateResult struct { + Msg *Message + Err string +} + +type MessageSendSpec struct { + MaxFee abi.TokenAmount + GasOverEstimation float64 +} + +// Version provides various build-time information +type Version struct { + Version string + + // APIVersion is a binary encoded semver version of the remote implementing + // this api + // + APIVersion api.Version +} + +type PCHDir int + +const ( + PCHUndef PCHDir = iota + PCHInbound + PCHOutbound +) + +type PaychStatus struct { + ControlAddr address.Address + Direction PCHDir +} + +type ChannelInfo struct { + Channel address.Address + WaitSentinel cid.Cid +} + +type ChannelAvailableFunds struct { + // Channel is the address of the channel + Channel *address.Address + // From is the from address of the channel (channel creator) + From address.Address + // To is the to address of the channel + To address.Address + // ConfirmedAmt is the amount of funds that have been confirmed on-chain + // for the channel + ConfirmedAmt chain.BigInt + // PendingAmt is the amount of funds that are pending confirmation on-chain + PendingAmt chain.BigInt + // PendingWaitSentinel can be used with PaychGetWaitReady to wait for + // confirmation of pending funds + PendingWaitSentinel *cid.Cid + // QueuedAmt is the amount that is queued up behind a pending request + QueuedAmt chain.BigInt + // VoucherRedeemedAmt is the amount that is redeemed by vouchers on-chain + // and in the local datastore + VoucherReedeemedAmt chain.BigInt +} + +type PaymentInfo struct { + Channel address.Address + WaitSentinel cid.Cid + Vouchers []*paych.SignedVoucher +} + +type VoucherSpec struct { + Amount chain.BigInt + TimeLockMin abi.ChainEpoch + TimeLockMax abi.ChainEpoch + MinSettle abi.ChainEpoch + + Extra *paych.ModVerifyParams +} + +// VoucherCreateResult is the response to calling PaychVoucherCreate +type VoucherCreateResult struct { + // Voucher that was created, or nil if there was an error or if there + // were insufficient funds in the channel + Voucher *paych.SignedVoucher + // Shortfall is the additional amount that would be needed in the channel + // in order to be able to create the voucher + Shortfall chain.BigInt +} + +// ChainInfo is used to track metadata about a peer and its chain. +type ChainInfo struct { + // The originator of the TipSetKey propagation wave. + Source peer.ID + // The peer that sent us the TipSetKey message. + Sender peer.ID + Head *chain.TipSet +} + +type SyncState struct { + ActiveSyncs []ActiveSync + + VMApplied uint64 +} + +//just compatible code lotus +type SyncStateStage int + +const ( + StageIdle = SyncStateStage(iota) + StageHeaders + StagePersistHeaders + StageMessages + StageSyncComplete + StageSyncErrored + StageFetchingMessages +) + +func (v SyncStateStage) String() string { + switch v { + case StageHeaders: + return "header sync" + case StagePersistHeaders: + return "persisting headers" + case StageMessages: + return "message sync" + case StageSyncComplete: + return "complete" + case StageSyncErrored: + return "error" + case StageFetchingMessages: + return "fetching messages" + default: + return fmt.Sprintf("", v) + } +} + +type ActiveSync struct { + WorkerID uint64 + Base *chain.TipSet + Target *chain.TipSet + + Stage SyncStateStage + Height abi.ChainEpoch + + Start time.Time + End time.Time + Message string +} + +type MsgGasCost struct { + Message cid.Cid // Can be different than requested, in case it was replaced, but only gas values changed + GasUsed abi.TokenAmount + BaseFeeBurn abi.TokenAmount + OverEstimationBurn abi.TokenAmount + MinerPenalty abi.TokenAmount + MinerTip abi.TokenAmount + Refund abi.TokenAmount + TotalCost abi.TokenAmount +} + +type InvocResult struct { + MsgCid cid.Cid + Msg *chain.Message + MsgRct *chain.MessageReceipt + GasCost MsgGasCost + ExecutionTrace stmgr.ExecutionTrace + Error string + Duration time.Duration +} diff --git a/venus-shared/api/chain/v1/wallet.go b/venus-shared/api/chain/v1/wallet.go index ca5d30006a..b1998aff65 100644 --- a/venus-shared/api/chain/v1/wallet.go +++ b/venus-shared/api/chain/v1/wallet.go @@ -5,18 +5,19 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/wallet" + crypto "github.com/filecoin-project/go-state-types/crypto" + + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/wallet" ) type IWallet interface { // Rule[perm:sign] WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) // Rule[perm:admin] - WalletExport(addr address.Address, password string) (*crypto.KeyInfo, error) + WalletExport(addr address.Address, password string) (*wallet.KeyInfo, error) // Rule[perm:admin] - WalletImport(key *crypto.KeyInfo) (address.Address, error) + WalletImport(key *wallet.KeyInfo) (address.Address, error) // Rule[perm:write] WalletHas(ctx context.Context, addr address.Address) (bool, error) // Rule[perm:write] @@ -30,7 +31,7 @@ type IWallet interface { // Rule[perm:admin] WalletSetDefault(ctx context.Context, addr address.Address) error //not exists in remote // Rule[perm:sign] - WalletSignMessage(ctx context.Context, k address.Address, msg *types.UnsignedMessage) (*types.SignedMessage, error) + WalletSignMessage(ctx context.Context, k address.Address, msg *chain.Message) (*chain.SignedMessage, error) // Rule[perm:admin] LockWallet(ctx context.Context) error // Rule[perm:admin] diff --git a/venus-shared/api/version.go b/venus-shared/api/version.go new file mode 100644 index 0000000000..6dd7a44ba1 --- /dev/null +++ b/venus-shared/api/version.go @@ -0,0 +1,7 @@ +package api + +type Version uint32 + +func NewVer(major, minor, patch uint8) Version { + return Version(uint32(major)<<16 | uint32(minor)<<8 | uint32(patch)) +} diff --git a/venus-shared/chain/supply.go b/venus-shared/chain/supply.go new file mode 100644 index 0000000000..32fd2c8cc6 --- /dev/null +++ b/venus-shared/chain/supply.go @@ -0,0 +1,12 @@ +package chain + +import "github.com/filecoin-project/go-state-types/abi" + +type CirculatingSupply struct { + FilVested abi.TokenAmount + FilMined abi.TokenAmount + FilBurnt abi.TokenAmount + FilLocked abi.TokenAmount + FilCirculating abi.TokenAmount + FilReserveDisbursed abi.TokenAmount +} diff --git a/venus-shared/go.mod b/venus-shared/go.mod index e4f5e05e54..1bb66b76c0 100644 --- a/venus-shared/go.mod +++ b/venus-shared/go.mod @@ -6,6 +6,7 @@ require ( github.com/docker/go-units v0.4.0 github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 // indirect + github.com/filecoin-project/go-jsonrpc v0.1.5 // indirect github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/specs-actors v0.9.13 github.com/filecoin-project/specs-actors/v2 v2.3.5 @@ -20,6 +21,7 @@ require ( github.com/ipfs/go-log v1.0.4 // indirect github.com/libp2p/go-libp2p-core v0.11.0 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 + github.com/multiformats/go-multiaddr v0.2.2 // indirect github.com/smartystreets/assertions v1.0.1 // indirect github.com/stretchr/testify v1.7.0 github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 diff --git a/venus-shared/go.sum b/venus-shared/go.sum index a0d23d0a48..75ba513b85 100644 --- a/venus-shared/go.sum +++ b/venus-shared/go.sum @@ -1,3 +1,4 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= @@ -16,6 +17,7 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -51,6 +53,8 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= +github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= +github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= @@ -77,10 +81,15 @@ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclK github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -88,7 +97,10 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -148,6 +160,8 @@ github.com/ipfs/go-log v1.0.4 h1:6nLQdX4W8P9yZZFH7mO+X/PzjN8Laozm/lMJ6esdgzY= github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= github.com/ipfs/go-log/v2 v2.0.5 h1:fL4YI+1g5V/b1Yxr1qAiXTMg1H8z9vx/VmJxBuQMHvU= github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= +github.com/ipfs/go-log/v2 v2.0.8 h1:3b3YNopMHlj4AvyhWAx0pDxqSQWYi4/WuWO7yRV6/Qg= +github.com/ipfs/go-log/v2 v2.0.8/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= @@ -192,6 +206,7 @@ github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOS github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM= github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= @@ -324,6 +339,7 @@ github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= @@ -353,6 +369,8 @@ github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvX github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= +go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= @@ -372,10 +390,17 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -383,8 +408,12 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -392,6 +421,7 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -407,6 +437,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -416,7 +448,13 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= @@ -429,4 +467,5 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/venus-shared/libp2p/net/net.go b/venus-shared/libp2p/net/net.go new file mode 100644 index 0000000000..92d0adbec5 --- /dev/null +++ b/venus-shared/libp2p/net/net.go @@ -0,0 +1,53 @@ +package net + +import "github.com/libp2p/go-libp2p-core/peer" + +// ConnectionResult represents the result of an attempted connection from the +// Connect method. +type ConnectionResult struct { + PeerID peer.ID + Err error +} + +// SwarmConnInfo represents details about a single swarm connection. +type SwarmConnInfo struct { + Addr string + Peer string + Latency string + Muxer string + Streams []SwarmStreamInfo +} + +// SwarmStreamInfo represents details about a single swarm stream. +type SwarmStreamInfo struct { + Protocol string +} + +func (ci *SwarmConnInfo) Less(i, j int) bool { + return ci.Streams[i].Protocol < ci.Streams[j].Protocol +} + +func (ci *SwarmConnInfo) Len() int { + return len(ci.Streams) +} + +func (ci *SwarmConnInfo) Swap(i, j int) { + ci.Streams[i], ci.Streams[j] = ci.Streams[j], ci.Streams[i] +} + +// SwarmConnInfos represent details about a list of swarm connections. +type SwarmConnInfos struct { + Peers []SwarmConnInfo +} + +func (ci SwarmConnInfos) Less(i, j int) bool { + return ci.Peers[i].Addr < ci.Peers[j].Addr +} + +func (ci SwarmConnInfos) Len() int { + return len(ci.Peers) +} + +func (ci SwarmConnInfos) Swap(i, j int) { + ci.Peers[i], ci.Peers[j] = ci.Peers[j], ci.Peers[i] +} diff --git a/venus-shared/messagepool/config.go b/venus-shared/messagepool/config.go new file mode 100644 index 0000000000..8061b17ab9 --- /dev/null +++ b/venus-shared/messagepool/config.go @@ -0,0 +1,16 @@ +package messagepool + +import ( + "time" + + "github.com/filecoin-project/go-address" +) + +type MpoolConfig struct { + PriorityAddrs []address.Address + SizeLimitHigh int + SizeLimitLow int + ReplaceByFeeRatio float64 + PruneCooldown time.Duration + GasLimitOverestimation float64 +} diff --git a/venus-shared/messagepool/mpool.go b/venus-shared/messagepool/mpool.go new file mode 100644 index 0000000000..c34958e666 --- /dev/null +++ b/venus-shared/messagepool/mpool.go @@ -0,0 +1,55 @@ +package messagepool + +import ( + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/ipfs/go-cid" +) + +type CheckStatusCode int + +//go:generate go run golang.org/x/tools/cmd/stringer -type=CheckStatusCode -trimprefix=CheckStatus +const ( + _ CheckStatusCode = iota + // Message Checks + CheckStatusMessageSerialize + CheckStatusMessageSize + CheckStatusMessageValidity + CheckStatusMessageMinGas + CheckStatusMessageMinBaseFee + CheckStatusMessageBaseFee + CheckStatusMessageBaseFeeLowerBound + CheckStatusMessageBaseFeeUpperBound + CheckStatusMessageGetStateNonce + CheckStatusMessageNonce + CheckStatusMessageGetStateBalance + CheckStatusMessageBalance +) + +type CheckStatus struct { + Code CheckStatusCode + OK bool + Err string + Hint map[string]interface{} +} + +type MessageCheckStatus struct { + Cid cid.Cid + CheckStatus +} + +type MessagePrototype struct { + Message chain.Message + ValidNonce bool +} + +type MpoolChange int + +const ( + MpoolAdd MpoolChange = iota + MpoolRemove +) + +type MpoolUpdate struct { + Type MpoolChange + Message *chain.SignedMessage +} diff --git a/venus-shared/stmgr/exec.go b/venus-shared/stmgr/exec.go new file mode 100644 index 0000000000..2fb4224a03 --- /dev/null +++ b/venus-shared/stmgr/exec.go @@ -0,0 +1,106 @@ +package stmgr + +import ( + "fmt" + "regexp" + "strings" + "time" + + "github.com/filecoin-project/venus/venus-shared/chain" +) + +type ExecutionTrace struct { + Msg *chain.Message + MsgRct *chain.MessageReceipt + Error string + Duration time.Duration + GasCharges []*GasTrace + + Subcalls []ExecutionTrace +} + +type GasTrace struct { + Name string + + Location []Loc `json:"loc"` + TotalGas int64 `json:"tg"` + ComputeGas int64 `json:"cg"` + StorageGas int64 `json:"sg"` + TotalVirtualGas int64 `json:"vtg"` + VirtualComputeGas int64 `json:"vcg"` + VirtualStorageGas int64 `json:"vsg"` + + TimeTaken time.Duration `json:"tt"` + Extra interface{} `json:"ex,omitempty"` + + Callers []uintptr `json:"-"` +} + +type Loc struct { + File string + Line int + Function string +} + +// TODO: ??? +// func (l Loc) Show() bool { +// ignorePrefix := []string{ +// "reflect.", +// "github.com/filecoin-project/lotus/chain/vm.(*Invoker).transform", +// "github.com/filecoin-project/go-amt-ipld/", +// } +// for _, pre := range ignorePrefix { +// if strings.HasPrefix(l.Function, pre) { +// return false +// } +// } +// return true +// } + +func (l Loc) String() string { + file := strings.Split(l.File, "/") + + fn := strings.Split(l.Function, "/") + var fnpkg string + if len(fn) > 2 { + fnpkg = strings.Join(fn[len(fn)-2:], "/") + } else { + fnpkg = l.Function + } + + return fmt.Sprintf("%s@%s:%d", fnpkg, file[len(file)-1], l.Line) +} + +var importantRegex = regexp.MustCompile(`github.com/filecoin-project/specs-actors/(v\d+/)?actors/builtin`) + +func (l Loc) Important() bool { + return importantRegex.MatchString(l.Function) +} + +// TODO: ??? +// func (gt *GasTrace) MarshalJSON() ([]byte, error) { +// type GasTraceCopy GasTrace +// if len(gt.Location) == 0 { +// if len(gt.Callers) != 0 { +// frames := runtime.CallersFrames(gt.Callers) +// for { +// frame, more := frames.Next() +// if frame.Function == "github.com/filecoin-project/lotus/chain/vm.(*VM).ApplyMessage" { +// break +// } +// l := Loc{ +// File: frame.File, +// Line: frame.Line, +// Function: frame.Function, +// } +// gt.Location = append(gt.Location, l) +// if !more { +// break +// } +// } +// } +// } + +// cpy := (*GasTraceCopy)(gt) +// return json.Marshal(cpy) +// } diff --git a/venus-shared/wallet/key_info.go b/venus-shared/wallet/key_info.go new file mode 100644 index 0000000000..fffde7b8e4 --- /dev/null +++ b/venus-shared/wallet/key_info.go @@ -0,0 +1,59 @@ +package wallet + +import ( + "encoding/json" + "fmt" + + "github.com/filecoin-project/go-state-types/crypto" +) + +var ( + ErrKeyInfoNotFound = fmt.Errorf("key info not found") + ErrKeyExists = fmt.Errorf("key already exists") +) + +// KeyType defines a type of a key +type KeyType string + +func (kt *KeyType) UnmarshalJSON(bb []byte) error { + { + // first option, try unmarshaling as string + var s string + err := json.Unmarshal(bb, &s) + if err == nil { + *kt = KeyType(s) + return nil + } + } + + { + var b byte + err := json.Unmarshal(bb, &b) + if err != nil { + return fmt.Errorf("could not unmarshal KeyType either as string nor integer: %w", err) + } + bst := crypto.SigType(b) + + switch bst { + case crypto.SigTypeBLS: + *kt = KTBLS + case crypto.SigTypeSecp256k1: + *kt = KTSecp256k1 + default: + return fmt.Errorf("unknown sigtype: %d", bst) + } + return nil + } +} + +const ( + KTBLS KeyType = "bls" + KTSecp256k1 KeyType = "secp256k1" + KTSecp256k1Ledger KeyType = "secp256k1-ledger" +) + +// KeyInfo is used for storing keys in KeyStore +type KeyInfo struct { + Type KeyType + PrivateKey []byte +} diff --git a/venus-shared/wallet/msg_meta.go b/venus-shared/wallet/msg_meta.go new file mode 100644 index 0000000000..24bb12ec32 --- /dev/null +++ b/venus-shared/wallet/msg_meta.go @@ -0,0 +1,26 @@ +package wallet + +type MsgType string + +const ( + MTUnknown = "unknown" + + // Signing message CID. MsgMeta.Extra contains raw cbor message bytes + MTChainMsg = "message" + + // Signing a blockheader. signing raw cbor block bytes (MsgMeta.Extra is empty) + MTBlock = "block" + + // Signing a deal proposal. signing raw cbor proposal bytes (MsgMeta.Extra is empty) + MTDealProposal = "dealproposal" + + // TODO: Deals, Vouchers, VRF +) + +type MsgMeta struct { + Type MsgType + + // Additional data related to what is signed. Should be verifiable with the + // signed bytes (e.g. CID(Extra).Bytes() == toSign) + Extra []byte +} From 232ffb0b1fae778f4b7f1d2af12a74bb68e0334f Mon Sep 17 00:00:00 2001 From: dtynn Date: Thu, 2 Dec 2021 17:38:24 +0800 Subject: [PATCH 062/167] feat: api diff --- Makefile | 5 +- venus-devtool/compatible/apis/diff.go | 2 +- venus-devtool/go.sum | 2 + venus-shared/compatible-checks/api-diff.txt | 158 ++++++++++++++++++++ 4 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 venus-shared/compatible-checks/api-diff.txt diff --git a/Makefile b/Makefile index 8df47246c1..57b5a84612 100644 --- a/Makefile +++ b/Makefile @@ -8,11 +8,14 @@ test: test-venus-shared compatible-all: compatible-api compatible-actor -compatible-api: api-checksum +compatible-api: api-checksum api-diff api-checksum: cd venus-devtool && go run ./compatible/apis/*.go checksum > ../venus-shared/compatible-checks/api-checksum.txt +api-diff: + cd venus-devtool && go run ./compatible/apis/*.go diff > ../venus-shared/compatible-checks/api-diff.txt + compatible-actor: actor-templates actor-sources actor-render actor-templates: diff --git a/venus-devtool/compatible/apis/diff.go b/venus-devtool/compatible/apis/diff.go index c5213bd438..1b710eb722 100644 --- a/venus-devtool/compatible/apis/diff.go +++ b/venus-devtool/compatible/apis/diff.go @@ -63,7 +63,7 @@ func showDiff(impl, origin reflect.Type) { continue } - similar, reason := typeutil.Similar(implMethods[ii], originMethods[oi], typeutil.JSONCodec|typeutil.CborCodec, typeutil.StructFieldsOrdered) + similar, reason := typeutil.Similar(implMethods[ii].Type, originMethods[oi].Type, typeutil.JSONCodec|typeutil.CborCodec, typeutil.StructFieldsOrdered) if similar { continue } diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index f4cc1e7562..a17ce57f50 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -271,6 +271,8 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AG github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec h1:rGI5I7fdU4viManxmDdbk5deZO7afe6L1Wc04dAmlOM= github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= +github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1 h1:0BogtftbcgyBx4lP2JWM00ZK7/pXmgnrDqKp9aLTgVs= diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt new file mode 100644 index 0000000000..803f7690e2 --- /dev/null +++ b/venus-shared/compatible-checks/api-diff.txt @@ -0,0 +1,158 @@ +github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.com/filecoin-project/lotus/api.FullNode: + - AuthVerify + + BlockTime + - ChainBlockstoreInfo + - ChainCheckBlockstore + > ChainGetBlock {[func(context.Context, cid.Cid) (*chain.BlockHeader, error) <> func(context.Context, cid.Cid) (*types.BlockHeader, error)] base=func out type: #0 input; nested={[*chain.BlockHeader <> *types.BlockHeader] base=pointed type; nested={[chain.BlockHeader <> types.BlockHeader] base=struct field; nested={[chain.BlockHeader <> types.BlockHeader] base=exported field type: #1 field named Ticket; nested={[chain.Ticket <> *types.Ticket] base=type kinds: struct != ptr; nested=nil}}}}} + > ChainGetBlockMessages {[func(context.Context, cid.Cid) (*v1.BlockMessages, error) <> func(context.Context, cid.Cid) (*api.BlockMessages, error)] base=func out type: #0 input; nested={[*v1.BlockMessages <> *api.BlockMessages] base=pointed type; nested={[v1.BlockMessages <> api.BlockMessages] base=struct field; nested={[v1.BlockMessages <> api.BlockMessages] base=exported field type: #0 field named BlsMessages; nested={[[]*chain.Message <> []*types.Message] base=slice element; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}}}}}} + - ChainGetGenesis + > ChainGetMessage {[func(context.Context, cid.Cid) (*chain.Message, error) <> func(context.Context, cid.Cid) (*types.Message, error)] base=func out type: #0 input; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}} + > ChainGetMessagesInTipset {[func(context.Context, chain.TipSetKey) ([]v1.Message, error) <> func(context.Context, types.TipSetKey) ([]api.Message, error)] base=func out type: #0 input; nested={[[]v1.Message <> []api.Message] base=slice element; nested={[v1.Message <> api.Message] base=struct field; nested={[v1.Message <> api.Message] base=exported field type: #1 field named Message; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}}}}} + - ChainGetNode + > ChainGetParentMessages {[func(context.Context, cid.Cid) ([]v1.Message, error) <> func(context.Context, cid.Cid) ([]api.Message, error)] base=func out type: #0 input; nested={[[]v1.Message <> []api.Message] base=slice element; nested={[v1.Message <> api.Message] base=struct field; nested={[v1.Message <> api.Message] base=exported field type: #1 field named Message; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}}}}} + > ChainGetParentReceipts {[func(context.Context, cid.Cid) ([]*chain.MessageReceipt, error) <> func(context.Context, cid.Cid) ([]*types.MessageReceipt, error)] base=func out type: #0 input; nested={[[]*chain.MessageReceipt <> []*types.MessageReceipt] base=slice element; nested={[*chain.MessageReceipt <> *types.MessageReceipt] base=pointed type; nested={[chain.MessageReceipt <> types.MessageReceipt] base=struct field; nested={[chain.MessageReceipt <> types.MessageReceipt] base=exported field name: #1 field, ReturnValue != Return; nested=nil}}}}} + + ChainGetRandomnessFromBeacon + + ChainGetRandomnessFromTickets + + ChainGetReceipts + + ChainList + > ChainNotify {[func(context.Context) <-chan []*v1.HeadChange <> func(context.Context) (<-chan []*api.HeadChange, error)] base=func out num: 1 != 2; nested=nil} + + ChainSyncHandleNewTipSet + - ClientCalcCommP + - ClientCancelDataTransfer + - ClientCancelRetrievalDeal + - ClientDataTransferUpdates + - ClientDealPieceCID + - ClientDealSize + - ClientFindData + - ClientGenCar + - ClientGetDealInfo + - ClientGetDealStatus + - ClientGetDealUpdates + - ClientGetRetrievalUpdates + - ClientHasLocal + - ClientImport + - ClientListDataTransfers + - ClientListDeals + - ClientListImports + - ClientListRetrievals + - ClientMinerQueryOffer + - ClientQueryAsk + - ClientRemoveImport + - ClientRestartDataTransfer + - ClientRetrieve + - ClientRetrieveTryRestartInsufficientFunds + - ClientRetrieveWithEvents + - ClientStartDeal + - ClientStatelessDeal + - Closing + + Concurrent + - CreateBackup + - Discover + + GasBatchEstimateMessageGas + > GasEstimateFeeCap {[func(context.Context, *chain.Message, int64, chain.TipSetKey) (big.Int, error) <> func(context.Context, *types.Message, int64, types.TipSetKey) (big.Int, error)] base=func in type: #1 input; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}} + > GasEstimateGasLimit {[func(context.Context, *chain.Message, chain.TipSetKey) (int64, error) <> func(context.Context, *types.Message, types.TipSetKey) (int64, error)] base=func in type: #1 input; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}} + > GasEstimateMessageGas {[func(context.Context, *chain.Message, *v1.MessageSendSpec, chain.TipSetKey) (*chain.Message, error) <> func(context.Context, *types.Message, *api.MessageSendSpec, types.TipSetKey) (*types.Message, error)] base=func in type: #1 input; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}} + + GetActor + + GetEntry + + GetFullBlock + + GetParentStateRootActor + + HasPassword + - ID + + ListActor + + LockWallet + - LogAlerts + - LogList + - LogSetLevel + - MarketAddBalance + - MarketGetReserved + - MarketReleaseFunds + - MarketReserveFunds + - MarketWithdraw + + MessageWait + > MinerCreateBlock {[func(context.Context, *v1.BlockTemplate) (*chain.BlockMsg, error) <> func(context.Context, *api.BlockTemplate) (*types.BlockMsg, error)] base=func in type: #1 input; nested={[*v1.BlockTemplate <> *api.BlockTemplate] base=pointed type; nested={[v1.BlockTemplate <> api.BlockTemplate] base=struct field; nested={[v1.BlockTemplate <> api.BlockTemplate] base=exported field type: #2 field named Ticket; nested={[chain.Ticket <> *types.Ticket] base=type kinds: struct != ptr; nested=nil}}}}} + > MpoolBatchPush {[func(context.Context, []*chain.SignedMessage) ([]cid.Cid, error) <> func(context.Context, []*types.SignedMessage) ([]cid.Cid, error)] base=func in type: #1 input; nested={[[]*chain.SignedMessage <> []*types.SignedMessage] base=slice element; nested={[*chain.SignedMessage <> *types.SignedMessage] base=codec marshaler implementations for codec 4: false != true; nested=nil}}} + > MpoolBatchPushMessage {[func(context.Context, []*chain.Message, *v1.MessageSendSpec) ([]*chain.SignedMessage, error) <> func(context.Context, []*types.Message, *api.MessageSendSpec) ([]*types.SignedMessage, error)] base=func in type: #1 input; nested={[[]*chain.Message <> []*types.Message] base=slice element; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}}} + > MpoolBatchPushUntrusted {[func(context.Context, []*chain.SignedMessage) ([]cid.Cid, error) <> func(context.Context, []*types.SignedMessage) ([]cid.Cid, error)] base=func in type: #1 input; nested={[[]*chain.SignedMessage <> []*types.SignedMessage] base=slice element; nested={[*chain.SignedMessage <> *types.SignedMessage] base=codec marshaler implementations for codec 4: false != true; nested=nil}}} + > MpoolCheckReplaceMessages {[func(context.Context, []*chain.Message) ([][]messagepool.MessageCheckStatus, error) <> func(context.Context, []*types.Message) ([][]api.MessageCheckStatus, error)] base=func in type: #1 input; nested={[[]*chain.Message <> []*types.Message] base=slice element; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}}} + + MpoolDeleteByAdress + > MpoolPending {[func(context.Context, chain.TipSetKey) ([]*chain.SignedMessage, error) <> func(context.Context, types.TipSetKey) ([]*types.SignedMessage, error)] base=func out type: #0 input; nested={[[]*chain.SignedMessage <> []*types.SignedMessage] base=slice element; nested={[*chain.SignedMessage <> *types.SignedMessage] base=codec marshaler implementations for codec 4: false != true; nested=nil}}} + + MpoolPublishByAddr + + MpoolPublishMessage + > MpoolPush {[func(context.Context, *chain.SignedMessage) (cid.Cid, error) <> func(context.Context, *types.SignedMessage) (cid.Cid, error)] base=func in type: #1 input; nested={[*chain.SignedMessage <> *types.SignedMessage] base=codec marshaler implementations for codec 4: false != true; nested=nil}} + > MpoolPushMessage {[func(context.Context, *chain.Message, *v1.MessageSendSpec) (*chain.SignedMessage, error) <> func(context.Context, *types.Message, *api.MessageSendSpec) (*types.SignedMessage, error)] base=func in type: #1 input; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}} + > MpoolPushUntrusted {[func(context.Context, *chain.SignedMessage) (cid.Cid, error) <> func(context.Context, *types.SignedMessage) (cid.Cid, error)] base=func in type: #1 input; nested={[*chain.SignedMessage <> *types.SignedMessage] base=codec marshaler implementations for codec 4: false != true; nested=nil}} + > MpoolSelect {[func(context.Context, chain.TipSetKey, float64) ([]*chain.SignedMessage, error) <> func(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error)] base=func out type: #0 input; nested={[[]*chain.SignedMessage <> []*types.SignedMessage] base=slice element; nested={[*chain.SignedMessage <> *types.SignedMessage] base=codec marshaler implementations for codec 4: false != true; nested=nil}}} + + MpoolSelects + > MpoolSub {[func(context.Context) (<-chan messagepool.MpoolUpdate, error) <> func(context.Context) (<-chan api.MpoolUpdate, error)] base=func out type: #0 input; nested={[<-chan messagepool.MpoolUpdate <> <-chan api.MpoolUpdate] base=channel element; nested={[messagepool.MpoolUpdate <> api.MpoolUpdate] base=struct field; nested={[messagepool.MpoolUpdate <> api.MpoolUpdate] base=exported field type: #1 field named Message; nested={[*chain.SignedMessage <> *types.SignedMessage] base=codec marshaler implementations for codec 4: false != true; nested=nil}}}}} + - MsigGetAvailableBalance + - MsigGetPending + - MsigGetVestingSchedule + - NetAgentVersion + - NetAutoNatStatus + - NetBandwidthStats + - NetBandwidthStatsByPeer + - NetBandwidthStatsByProtocol + - NetBlockAdd + - NetBlockList + - NetBlockRemove + - NetConnect + - NetConnectedness + - NetDisconnect + - NetFindPeer + - NetPeerInfo + - NetPeers + - NetPubsubScores + + NetworkConnect + + NetworkFindPeer + + NetworkFindProvidersAsync + + NetworkGetBandwidthStats + + NetworkGetClosestPeers + + NetworkGetPeerAddresses + + NetworkGetPeerID + + NetworkPeers + - NodeStatus + > PaychNewPayment {[func(context.Context, address.Address, address.Address, []v1.VoucherSpec) (*v1.PaymentInfo, error) <> func(context.Context, address.Address, address.Address, []api.VoucherSpec) (*api.PaymentInfo, error)] base=func out type: #0 input; nested={[*v1.PaymentInfo <> *api.PaymentInfo] base=codec marshaler implementations for codec 8: false != true; nested=nil}} + + ProtocolParameters + + ResolveToKeyAddr + - Session + + SetConcurrent + + SetPassword + - Shutdown + - StateAllMinerFaults + > StateCall {[func(context.Context, *chain.Message, chain.TipSetKey) (*v1.InvocResult, error) <> func(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error)] base=func in type: #1 input; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}} + - StateChangedActors + - StateCompute + - StateDecodeParams + - StateEncodeParams + - StateListMessages + + StateMinerSectorSize + + StateMinerWorkerAddress + - StateReadState + - StateReplay + > StateSearchMsg {[func(context.Context, chain.TipSetKey, cid.Cid, abi.ChainEpoch, bool) (*v1.MsgLookup, error) <> func(context.Context, types.TipSetKey, cid.Cid, abi.ChainEpoch, bool) (*api.MsgLookup, error)] base=func out type: #0 input; nested={[*v1.MsgLookup <> *api.MsgLookup] base=pointed type; nested={[v1.MsgLookup <> api.MsgLookup] base=struct field; nested={[v1.MsgLookup <> api.MsgLookup] base=exported field type: #1 field named Receipt; nested={[chain.MessageReceipt <> types.MessageReceipt] base=struct field; nested={[chain.MessageReceipt <> types.MessageReceipt] base=exported field name: #1 field, ReturnValue != Return; nested=nil}}}}}} + > StateWaitMsg {[func(context.Context, cid.Cid, uint64, abi.ChainEpoch, bool) (*v1.MsgLookup, error) <> func(context.Context, cid.Cid, uint64, abi.ChainEpoch, bool) (*api.MsgLookup, error)] base=func out type: #0 input; nested={[*v1.MsgLookup <> *api.MsgLookup] base=pointed type; nested={[v1.MsgLookup <> api.MsgLookup] base=struct field; nested={[v1.MsgLookup <> api.MsgLookup] base=exported field type: #1 field named Receipt; nested={[chain.MessageReceipt <> types.MessageReceipt] base=struct field; nested={[chain.MessageReceipt <> types.MessageReceipt] base=exported field name: #1 field, ReturnValue != Return; nested=nil}}}}}} + - SyncCheckBad + - SyncCheckpoint + - SyncIncomingBlocks + - SyncMarkBad + > SyncSubmitBlock {[func(context.Context, *chain.BlockMsg) error <> func(context.Context, *types.BlockMsg) error] base=func in type: #1 input; nested={[*chain.BlockMsg <> *types.BlockMsg] base=pointed type; nested={[chain.BlockMsg <> types.BlockMsg] base=struct field; nested={[chain.BlockMsg <> types.BlockMsg] base=exported field type: #0 field named Header; nested={[*chain.BlockHeader <> *types.BlockHeader] base=pointed type; nested={[chain.BlockHeader <> types.BlockHeader] base=struct field; nested={[chain.BlockHeader <> types.BlockHeader] base=exported field type: #1 field named Ticket; nested={[chain.Ticket <> *types.Ticket] base=type kinds: struct != ptr; nested=nil}}}}}}}} + - SyncUnmarkAllBad + - SyncUnmarkBad + - SyncValidateTipset + + UnLockWallet + + Verify + + VerifyEntry + > Version {[func(context.Context) (v1.Version, error) <> func(context.Context) (api.APIVersion, error)] base=func out type: #0 input; nested={[v1.Version <> api.APIVersion] base=struct field; nested={[v1.Version <> api.APIVersion] base=exported fields count: 2 != 3; nested=nil}}} + + WalletAddresses + - WalletDelete + > WalletExport {[func(address.Address, string) (*wallet.KeyInfo, error) <> func(context.Context, address.Address) (*types.KeyInfo, error)] base=func in type: #0 input; nested={[address.Address <> context.Context] base=type kinds: struct != interface; nested=nil}} + > WalletImport {[func(*wallet.KeyInfo) (address.Address, error) <> func(context.Context, *types.KeyInfo) (address.Address, error)] base=func in num: 1 != 2; nested=nil} + - WalletList + - WalletNew + + WalletNewAddress + > WalletSign {[func(context.Context, address.Address, []uint8, wallet.MsgMeta) (*crypto.Signature, error) <> func(context.Context, address.Address, []uint8) (*crypto.Signature, error)] base=func in num: 4 != 3; nested=nil} + > WalletSignMessage {[func(context.Context, address.Address, *chain.Message) (*chain.SignedMessage, error) <> func(context.Context, address.Address, *types.Message) (*types.SignedMessage, error)] base=func in type: #2 input; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}} + + WalletState + - WalletValidateAddress + - WalletVerify + From 48880845736b74a2a290cb150a3505319ab88f52 Mon Sep 17 00:00:00 2001 From: dtynn Date: Fri, 3 Dec 2021 11:32:21 +0800 Subject: [PATCH 063/167] add struct field check for Similar --- venus-shared/typeutil/similar.go | 58 ++++++++++++++----------- venus-shared/typeutil/similar_reason.go | 1 + venus-shared/typeutil/similar_test.go | 48 ++++++++++++-------- 3 files changed, 63 insertions(+), 44 deletions(-) diff --git a/venus-shared/typeutil/similar.go b/venus-shared/typeutil/similar.go index 573710153d..114b89e947 100644 --- a/venus-shared/typeutil/similar.go +++ b/venus-shared/typeutil/similar.go @@ -33,10 +33,11 @@ const ( _CodecLimit ) -type Ordered uint +type SimilarMode uint const ( - StructFieldsOrdered Ordered = 1 << iota + StructFieldsOrdered SimilarMode = 1 << iota + StructFieldTagsMatch ) var ( @@ -77,7 +78,7 @@ type similarInput struct { a reflect.Type b reflect.Type codecFlag CodecFlag - ordered Ordered + smode SimilarMode } var similarCache = struct { @@ -87,7 +88,7 @@ var similarCache = struct { results: make(map[similarInput]similarResult), } -func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, *Reason) { +func Similar(a, b interface{}, codecFlag CodecFlag, smode SimilarMode) (bool, *Reason) { atyp, ok := a.(reflect.Type) if !ok { atyp = reflect.TypeOf(a) @@ -106,7 +107,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, *Rea a: atyp, b: btyp, codecFlag: codecFlag, - ordered: ordered, + smode: smode, } similarCache.RLock() @@ -203,7 +204,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, *Rea break } - elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, ordered) + elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, smode) if !elemMatch { reason = reasonWrap(elemReason, ReasonArrayElement) break @@ -212,13 +213,13 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, *Rea yes = true case reflect.Map: - keyMatch, keyReason := Similar(atyp.Key(), btyp.Key(), codecFlag, ordered) + keyMatch, keyReason := Similar(atyp.Key(), btyp.Key(), codecFlag, smode) if !keyMatch { reason = reasonWrap(keyReason, ReasonMapKey) break } - valueMatch, valueReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, ordered) + valueMatch, valueReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, smode) if !valueMatch { reason = reasonWrap(valueReason, ReasonMapValue) break @@ -227,7 +228,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, *Rea yes = true case reflect.Ptr: - elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, ordered) + elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, smode) if !elemMatch { reason = reasonWrap(elemReason, ReasonPtrElememnt) break @@ -236,7 +237,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, *Rea yes = true case reflect.Slice: - elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, ordered) + elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, smode) if !elemMatch { reason = reasonWrap(elemReason, ReasonSliceElement) break @@ -245,7 +246,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, *Rea yes = true case reflect.Struct: - fieldsMatch, fieldsReason := fieldsSimilar(atyp, btyp, codecFlag, ordered) + fieldsMatch, fieldsReason := fieldsSimilar(atyp, btyp, codecFlag, smode) if !fieldsMatch { reason = reasonWrap(fieldsReason, ReasonStructField) break @@ -254,7 +255,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, *Rea yes = true case reflect.Interface: - methsMatch, methsReason := methodsSimilar(atyp, btyp, codecFlag, ordered) + methsMatch, methsReason := methodsSimilar(atyp, btyp, codecFlag, smode) if !methsMatch { reason = reasonWrap(methsReason, ReasonInterfaceMethod) break @@ -270,7 +271,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, *Rea break } - elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, ordered) + elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, smode) if !elemMatch { reason = reasonWrap(elemReason, ReasonChanElement) break @@ -279,14 +280,14 @@ func Similar(a, b interface{}, codecFlag CodecFlag, ordered Ordered) (bool, *Rea yes = true case reflect.Func: - yes, reason = funcSimilar(atyp, btyp, codecFlag, ordered) + yes, reason = funcSimilar(atyp, btyp, codecFlag, smode) } return yes, reason } -func funcSimilar(atyp, btyp reflect.Type, codecFlag CodecFlag, ordered Ordered) (bool, *Reason) { +func funcSimilar(atyp, btyp reflect.Type, codecFlag CodecFlag, ordered SimilarMode) (bool, *Reason) { reasonf := makeReasonf(atyp, btyp) reasonWrap := makeReasonWrap(atyp, btyp) @@ -319,25 +320,28 @@ func funcSimilar(atyp, btyp reflect.Type, codecFlag CodecFlag, ordered Ordered) return true, nil } -func fieldsSimilar(a, b reflect.Type, codecFlag CodecFlag, ordered Ordered) (bool, *Reason) { +func fieldsSimilar(a, b reflect.Type, codecFlag CodecFlag, smode SimilarMode) (bool, *Reason) { reasonf := makeReasonf(a, b) reasonWrap := makeReasonWrap(a, b) afields := ExportedFields(a) - bfields := ExportedFields(b) if len(afields) != len(bfields) { return false, reasonf("%w: %d != %d", ReasonExportedFieldsCount, len(afields), len(bfields)) } - if ordered&StructFieldsOrdered != 0 { + if smode&StructFieldsOrdered != 0 { for i := range afields { if afields[i].Name != bfields[i].Name { return false, reasonf("%w: #%d field, %s != %s", ReasonExportedFieldName, i, afields[i].Name, bfields[i].Name) } - yes, reason := Similar(afields[i].Type, bfields[i].Type, codecFlag, ordered) + if smode&StructFieldTagsMatch != 0 && afields[i].Tag != bfields[i].Tag { + return false, reasonf("%w: #%d field, %s != %s", ReasonExportedFieldTag, i, afields[i].Tag, bfields[i].Tag) + } + + yes, reason := Similar(afields[i].Type, bfields[i].Type, codecFlag, smode) if !yes { return false, reasonWrap(reason, fmt.Errorf("%w: #%d field named %s", ReasonExportedFieldType, i, afields[i].Name)) } @@ -346,19 +350,23 @@ func fieldsSimilar(a, b reflect.Type, codecFlag CodecFlag, ordered Ordered) (boo return true, nil } - mfields := map[string]reflect.Type{} + mfields := map[string]reflect.StructField{} for i := range afields { - mfields[afields[i].Name] = afields[i].Type + mfields[afields[i].Name] = afields[i] } for i := range bfields { f := bfields[i] - typ, has := mfields[f.Name] + af, has := mfields[f.Name] if !has { return false, reasonf("%w: named %s", ReasonExportedFieldNotFound, f.Name) } - yes, reason := Similar(typ, f.Type, codecFlag, ordered) + if smode&StructFieldTagsMatch != 0 && af.Tag != f.Tag { + return false, reasonf("%w: named field %s, %s != %s", ReasonExportedFieldTag, f.Name, af.Tag, f.Tag) + } + + yes, reason := Similar(af.Type, f.Type, codecFlag, smode) if !yes { return false, reasonWrap(reason, fmt.Errorf("%w: named %s", ReasonExportedFieldType, f.Name)) } @@ -367,7 +375,7 @@ func fieldsSimilar(a, b reflect.Type, codecFlag CodecFlag, ordered Ordered) (boo return true, nil } -func methodsSimilar(a, b reflect.Type, codecFlag CodecFlag, ordered Ordered) (bool, *Reason) { +func methodsSimilar(a, b reflect.Type, codecFlag CodecFlag, smode SimilarMode) (bool, *Reason) { reasonf := makeReasonf(a, b) reasonWrap := makeReasonWrap(a, b) @@ -383,7 +391,7 @@ func methodsSimilar(a, b reflect.Type, codecFlag CodecFlag, ordered Ordered) (bo return false, reasonf("%w: #%d method, %s != %s ", ReasonExportedMethodName, i, ameths[i].Name, bmeths[i].Name) } - yes, reason := Similar(ameths[i].Type, bmeths[i].Type, codecFlag, ordered) + yes, reason := Similar(ameths[i].Type, bmeths[i].Type, codecFlag, smode) if !yes { return false, reasonWrap(reason, fmt.Errorf("%w: #%d method named %s", ReasonExportedMethodType, i, ameths[i].Name)) } diff --git a/venus-shared/typeutil/similar_reason.go b/venus-shared/typeutil/similar_reason.go index de10be2399..6d15417148 100644 --- a/venus-shared/typeutil/similar_reason.go +++ b/venus-shared/typeutil/similar_reason.go @@ -75,6 +75,7 @@ var ( ReasonFuncOutType = fmt.Errorf("func out type") // nolint ReasonExportedFieldsCount = fmt.Errorf("exported fields count") // nolint ReasonExportedFieldName = fmt.Errorf("exported field name") // nolint + ReasonExportedFieldTag = fmt.Errorf("exported field tag") // nolint ReasonExportedFieldNotFound = fmt.Errorf("exported field not found") // nolint ReasonExportedFieldType = fmt.Errorf("exported field type") // nolint ReasonExportedMethodsCount = fmt.Errorf("exported methods count") // nolint diff --git a/venus-shared/typeutil/similar_test.go b/venus-shared/typeutil/similar_test.go index 29bfaa792c..0472cae76b 100644 --- a/venus-shared/typeutil/similar_test.go +++ b/venus-shared/typeutil/similar_test.go @@ -114,7 +114,7 @@ func TestSimilarSimple(t *testing.T) { type similarCase struct { val interface{} codecFlag CodecFlag - ordered Ordered + smode SimilarMode reasons []error } @@ -130,7 +130,7 @@ func similarTest(t *testing.T, origin interface{}, cases []similarCase, checkInd require.NotEqual(t, typOrigin, typCase, "types should be different") require.Equal(t, typOrigin.Kind(), typCase.Kind(), "kind should not be different") - yes, reason := Similar(typOrigin, typCase, cases[i].codecFlag, cases[i].ordered) + yes, reason := Similar(typOrigin, typCase, cases[i].codecFlag, cases[i].smode) require.Equalf(t, expectedYes, yes, "#%d similar result for %s <> %s", i, typOrigin, typCase) if expectedYes { @@ -146,7 +146,7 @@ func similarTest(t *testing.T, origin interface{}, cases []similarCase, checkInd if indirect { require.Equal(t, typOrigin.Elem().Kind(), typCase.Elem().Kind(), "kind of indirect type should not be different") - yes, reason = Similar(typOrigin.Elem(), typCase.Elem(), cases[i].codecFlag, cases[i].ordered) + yes, reason = Similar(typOrigin.Elem(), typCase.Elem(), cases[i].codecFlag, cases[i].smode) require.Equalf(t, expectedYes, yes, "#%d similar result for %s <> %s", i, typOrigin.Elem(), typCase.Elem()) if expectedYes { @@ -312,63 +312,73 @@ func TestStruct(t *testing.T) { B uint } + type case7 struct { + A AUInt `json:"a"` + B AInt + } + cases := []similarCase{ { val: new(case1), - ordered: StructFieldsOrdered, + smode: StructFieldsOrdered, reasons: []error{ReasonStructField, ReasonExportedFieldName}, }, { val: new(case1), - ordered: 0, + smode: 0, reasons: []error{ReasonStructField, ReasonExportedFieldNotFound}, }, { val: new(case2), - ordered: StructFieldsOrdered, + smode: StructFieldsOrdered, reasons: []error{ReasonStructField, ReasonExportedFieldName}, }, { - val: new(case2), - ordered: 0, + val: new(case2), + smode: 0, }, { val: new(case3), - ordered: StructFieldsOrdered, + smode: StructFieldsOrdered, reasons: []error{ReasonStructField, ReasonExportedFieldName}, }, { - val: new(case3), - ordered: 0, + val: new(case3), + smode: 0, }, { - val: new(case4), - ordered: 0, + val: new(case4), + smode: 0, }, { - val: new(case4), - ordered: StructFieldsOrdered, + val: new(case4), + smode: StructFieldsOrdered, }, { val: new(case5), - ordered: 0, + smode: 0, reasons: []error{ReasonStructField, ReasonExportedFieldsCount}, }, { val: new(case5), - ordered: StructFieldsOrdered, + smode: StructFieldsOrdered, reasons: []error{ReasonStructField, ReasonExportedFieldsCount}, }, { val: new(case6), - ordered: 0, + smode: 0, reasons: []error{ReasonStructField, ReasonExportedFieldType}, }, { val: new(case6), - ordered: StructFieldsOrdered, + smode: StructFieldsOrdered, reasons: []error{ReasonStructField, ReasonExportedFieldType}, }, + { + val: new(case7), + smode: StructFieldsOrdered | StructFieldTagsMatch, + reasons: []error{ReasonStructField, ReasonExportedFieldTag}, + }, } similarTest(t, new(origin), cases, true) From ff822d8f9b694e16bf18db8a1be49d761bcb3776 Mon Sep 17 00:00:00 2001 From: dtynn Date: Fri, 3 Dec 2021 11:38:07 +0800 Subject: [PATCH 064/167] add struct tag check for api-diff --- venus-devtool/compatible/apis/diff.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/venus-devtool/compatible/apis/diff.go b/venus-devtool/compatible/apis/diff.go index 1b710eb722..072935f1b0 100644 --- a/venus-devtool/compatible/apis/diff.go +++ b/venus-devtool/compatible/apis/diff.go @@ -63,7 +63,7 @@ func showDiff(impl, origin reflect.Type) { continue } - similar, reason := typeutil.Similar(implMethods[ii].Type, originMethods[oi].Type, typeutil.JSONCodec|typeutil.CborCodec, typeutil.StructFieldsOrdered) + similar, reason := typeutil.Similar(implMethods[ii].Type, originMethods[oi].Type, typeutil.JSONCodec|typeutil.CborCodec, typeutil.StructFieldsOrdered|typeutil.StructFieldTagsMatch) if similar { continue } From 1b57c32eba8795f14e363efb693303a41a3f19cc Mon Sep 17 00:00:00 2001 From: dtynn Date: Fri, 3 Dec 2021 13:23:12 +0800 Subject: [PATCH 065/167] fix: api diffs caused by chain.BlockHeader --- venus-shared/chain/block_header.go | 6 +++--- venus-shared/chain/cbor_gen.go | 22 +++++++++++++++------ venus-shared/chain/tipset.go | 4 ++-- venus-shared/compatible-checks/api-diff.txt | 2 -- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/venus-shared/chain/block_header.go b/venus-shared/chain/block_header.go index 542b595aaf..dc2515bbe7 100644 --- a/venus-shared/chain/block_header.go +++ b/venus-shared/chain/block_header.go @@ -30,14 +30,14 @@ type BlockHeader struct { Miner address.Address // Ticket is the ticket submitted with this newBlock. - Ticket Ticket + Ticket *Ticket // ElectionProof is the vrf proof giving this newBlock's miner authoring rights ElectionProof *ElectionProof // BeaconEntries contain the verifiable oracle randomness used to elect // this newBlock's author leader - BeaconEntries []*BeaconEntry + BeaconEntries []BeaconEntry // WinPoStProof are the winning post proofs WinPoStProof []proof2.PoStProof @@ -156,7 +156,7 @@ func (b *BlockHeader) ToStorageBlock() (blocks.Block, error) { // LastTicket get ticket in block func (b *BlockHeader) LastTicket() *Ticket { - return &b.Ticket + return b.Ticket } // SetValidated set block signature is valid after checkout blocksig diff --git a/venus-shared/chain/cbor_gen.go b/venus-shared/chain/cbor_gen.go index d2bceb8334..051eff390a 100644 --- a/venus-shared/chain/cbor_gen.go +++ b/venus-shared/chain/cbor_gen.go @@ -50,7 +50,7 @@ func (t *BlockHeader) MarshalCBOR(w io.Writer) error { return err } - // t.BeaconEntries ([]*chain.BeaconEntry) (slice) + // t.BeaconEntries ([]chain.BeaconEntry) (slice) if len(t.BeaconEntries) > cbg.MaxLength { return xerrors.Errorf("Slice value in field t.BeaconEntries was too long") } @@ -186,8 +186,18 @@ func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error { { - if err := t.Ticket.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.Ticket: %w", err) + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + t.Ticket = new(Ticket) + if err := t.Ticket.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Ticket pointer: %w", err) + } } } @@ -210,7 +220,7 @@ func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error { } } - // t.BeaconEntries ([]*chain.BeaconEntry) (slice) + // t.BeaconEntries ([]chain.BeaconEntry) (slice) maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) if err != nil { @@ -226,7 +236,7 @@ func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error { } if extra > 0 { - t.BeaconEntries = make([]*BeaconEntry, extra) + t.BeaconEntries = make([]BeaconEntry, extra) } for i := 0; i < int(extra); i++ { @@ -236,7 +246,7 @@ func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error { return err } - t.BeaconEntries[i] = &v + t.BeaconEntries[i] = v } // t.WinPoStProof ([]proof.PoStProof) (slice) diff --git a/venus-shared/chain/tipset.go b/venus-shared/chain/tipset.go index 4ce6ea62b1..90ad4412ec 100644 --- a/venus-shared/chain/tipset.go +++ b/venus-shared/chain/tipset.go @@ -219,7 +219,7 @@ func (ts *TipSet) MinTicketBlock() *BlockHeader { } // MinTicket returns the smallest ticket of all blocks in the tipset. -func (ts *TipSet) MinTicket() Ticket { +func (ts *TipSet) MinTicket() *Ticket { return ts.MinTicketBlock().Ticket } @@ -249,7 +249,7 @@ func sortedCidArrsEqual(a, b []cid.Cid) bool { func sortBlockHeadersInTipSet(blks []*blockHeaderWithCid) { sort.Slice(blks, func(i, j int) bool { - cmp := blks[i].b.Ticket.Compare(&blks[j].b.Ticket) + cmp := blks[i].b.Ticket.Compare(blks[j].b.Ticket) if cmp == 0 { // Break ticket ties with the newBlock CIDs, which are distinct. cmp = bytes.Compare(blks[i].c.Bytes(), blks[j].c.Bytes()) diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt index 803f7690e2..10a5cd6662 100644 --- a/venus-shared/compatible-checks/api-diff.txt +++ b/venus-shared/compatible-checks/api-diff.txt @@ -3,7 +3,6 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c + BlockTime - ChainBlockstoreInfo - ChainCheckBlockstore - > ChainGetBlock {[func(context.Context, cid.Cid) (*chain.BlockHeader, error) <> func(context.Context, cid.Cid) (*types.BlockHeader, error)] base=func out type: #0 input; nested={[*chain.BlockHeader <> *types.BlockHeader] base=pointed type; nested={[chain.BlockHeader <> types.BlockHeader] base=struct field; nested={[chain.BlockHeader <> types.BlockHeader] base=exported field type: #1 field named Ticket; nested={[chain.Ticket <> *types.Ticket] base=type kinds: struct != ptr; nested=nil}}}}} > ChainGetBlockMessages {[func(context.Context, cid.Cid) (*v1.BlockMessages, error) <> func(context.Context, cid.Cid) (*api.BlockMessages, error)] base=func out type: #0 input; nested={[*v1.BlockMessages <> *api.BlockMessages] base=pointed type; nested={[v1.BlockMessages <> api.BlockMessages] base=struct field; nested={[v1.BlockMessages <> api.BlockMessages] base=exported field type: #0 field named BlsMessages; nested={[[]*chain.Message <> []*types.Message] base=slice element; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}}}}}} - ChainGetGenesis > ChainGetMessage {[func(context.Context, cid.Cid) (*chain.Message, error) <> func(context.Context, cid.Cid) (*types.Message, error)] base=func out type: #0 input; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}} @@ -135,7 +134,6 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c - SyncCheckpoint - SyncIncomingBlocks - SyncMarkBad - > SyncSubmitBlock {[func(context.Context, *chain.BlockMsg) error <> func(context.Context, *types.BlockMsg) error] base=func in type: #1 input; nested={[*chain.BlockMsg <> *types.BlockMsg] base=pointed type; nested={[chain.BlockMsg <> types.BlockMsg] base=struct field; nested={[chain.BlockMsg <> types.BlockMsg] base=exported field type: #0 field named Header; nested={[*chain.BlockHeader <> *types.BlockHeader] base=pointed type; nested={[chain.BlockHeader <> types.BlockHeader] base=struct field; nested={[chain.BlockHeader <> types.BlockHeader] base=exported field type: #1 field named Ticket; nested={[chain.Ticket <> *types.Ticket] base=type kinds: struct != ptr; nested=nil}}}}}}}} - SyncUnmarkAllBad - SyncUnmarkBad - SyncValidateTipset From bde43be2d41ba2c0f491b9dbebe5fc71686e87fc Mon Sep 17 00:00:00 2001 From: dtynn Date: Fri, 3 Dec 2021 13:31:59 +0800 Subject: [PATCH 066/167] fix: api diffs caused by json.Marshaler impl of Message & SignedMessage --- venus-shared/chain/message_marshal.go | 21 ++++++++++++++++++ venus-shared/chain/signed_message_marshal.go | 21 ++++++++++++++++++ venus-shared/compatible-checks/api-diff.txt | 23 ++++---------------- 3 files changed, 46 insertions(+), 19 deletions(-) create mode 100644 venus-shared/chain/message_marshal.go create mode 100644 venus-shared/chain/signed_message_marshal.go diff --git a/venus-shared/chain/message_marshal.go b/venus-shared/chain/message_marshal.go new file mode 100644 index 0000000000..50773b747d --- /dev/null +++ b/venus-shared/chain/message_marshal.go @@ -0,0 +1,21 @@ +package chain + +import ( + "encoding/json" + + "github.com/ipfs/go-cid" +) + +type RawMessage Message + +type mCid struct { + CID cid.Cid + *RawMessage +} + +func (m *Message) MarshalJSON() ([]byte, error) { + return json.Marshal(&mCid{ + RawMessage: (*RawMessage)(m), + CID: m.Cid(), + }) +} diff --git a/venus-shared/chain/signed_message_marshal.go b/venus-shared/chain/signed_message_marshal.go new file mode 100644 index 0000000000..059b1d03bb --- /dev/null +++ b/venus-shared/chain/signed_message_marshal.go @@ -0,0 +1,21 @@ +package chain + +import ( + "encoding/json" + + "github.com/ipfs/go-cid" +) + +type smCid struct { + *RawSignedMessage + CID cid.Cid +} + +type RawSignedMessage SignedMessage + +func (sm *SignedMessage) MarshalJSON() ([]byte, error) { + return json.Marshal(&smCid{ + RawSignedMessage: (*RawSignedMessage)(sm), + CID: sm.Cid(), + }) +} diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt index 10a5cd6662..54ec2392a5 100644 --- a/venus-shared/compatible-checks/api-diff.txt +++ b/venus-shared/compatible-checks/api-diff.txt @@ -3,12 +3,8 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c + BlockTime - ChainBlockstoreInfo - ChainCheckBlockstore - > ChainGetBlockMessages {[func(context.Context, cid.Cid) (*v1.BlockMessages, error) <> func(context.Context, cid.Cid) (*api.BlockMessages, error)] base=func out type: #0 input; nested={[*v1.BlockMessages <> *api.BlockMessages] base=pointed type; nested={[v1.BlockMessages <> api.BlockMessages] base=struct field; nested={[v1.BlockMessages <> api.BlockMessages] base=exported field type: #0 field named BlsMessages; nested={[[]*chain.Message <> []*types.Message] base=slice element; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}}}}}} - ChainGetGenesis - > ChainGetMessage {[func(context.Context, cid.Cid) (*chain.Message, error) <> func(context.Context, cid.Cid) (*types.Message, error)] base=func out type: #0 input; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}} - > ChainGetMessagesInTipset {[func(context.Context, chain.TipSetKey) ([]v1.Message, error) <> func(context.Context, types.TipSetKey) ([]api.Message, error)] base=func out type: #0 input; nested={[[]v1.Message <> []api.Message] base=slice element; nested={[v1.Message <> api.Message] base=struct field; nested={[v1.Message <> api.Message] base=exported field type: #1 field named Message; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}}}}} - ChainGetNode - > ChainGetParentMessages {[func(context.Context, cid.Cid) ([]v1.Message, error) <> func(context.Context, cid.Cid) ([]api.Message, error)] base=func out type: #0 input; nested={[[]v1.Message <> []api.Message] base=slice element; nested={[v1.Message <> api.Message] base=struct field; nested={[v1.Message <> api.Message] base=exported field type: #1 field named Message; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}}}}} > ChainGetParentReceipts {[func(context.Context, cid.Cid) ([]*chain.MessageReceipt, error) <> func(context.Context, cid.Cid) ([]*types.MessageReceipt, error)] base=func out type: #0 input; nested={[[]*chain.MessageReceipt <> []*types.MessageReceipt] base=slice element; nested={[*chain.MessageReceipt <> *types.MessageReceipt] base=pointed type; nested={[chain.MessageReceipt <> types.MessageReceipt] base=struct field; nested={[chain.MessageReceipt <> types.MessageReceipt] base=exported field name: #1 field, ReturnValue != Return; nested=nil}}}}} + ChainGetRandomnessFromBeacon + ChainGetRandomnessFromTickets @@ -48,9 +44,7 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c - CreateBackup - Discover + GasBatchEstimateMessageGas - > GasEstimateFeeCap {[func(context.Context, *chain.Message, int64, chain.TipSetKey) (big.Int, error) <> func(context.Context, *types.Message, int64, types.TipSetKey) (big.Int, error)] base=func in type: #1 input; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}} - > GasEstimateGasLimit {[func(context.Context, *chain.Message, chain.TipSetKey) (int64, error) <> func(context.Context, *types.Message, types.TipSetKey) (int64, error)] base=func in type: #1 input; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}} - > GasEstimateMessageGas {[func(context.Context, *chain.Message, *v1.MessageSendSpec, chain.TipSetKey) (*chain.Message, error) <> func(context.Context, *types.Message, *api.MessageSendSpec, types.TipSetKey) (*types.Message, error)] base=func in type: #1 input; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}} + > GasEstimateMessageGas {[func(context.Context, *chain.Message, *v1.MessageSendSpec, chain.TipSetKey) (*chain.Message, error) <> func(context.Context, *types.Message, *api.MessageSendSpec, types.TipSetKey) (*types.Message, error)] base=func in type: #2 input; nested={[*v1.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[v1.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[v1.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} + GetActor + GetEntry + GetFullBlock @@ -69,20 +63,12 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c - MarketWithdraw + MessageWait > MinerCreateBlock {[func(context.Context, *v1.BlockTemplate) (*chain.BlockMsg, error) <> func(context.Context, *api.BlockTemplate) (*types.BlockMsg, error)] base=func in type: #1 input; nested={[*v1.BlockTemplate <> *api.BlockTemplate] base=pointed type; nested={[v1.BlockTemplate <> api.BlockTemplate] base=struct field; nested={[v1.BlockTemplate <> api.BlockTemplate] base=exported field type: #2 field named Ticket; nested={[chain.Ticket <> *types.Ticket] base=type kinds: struct != ptr; nested=nil}}}}} - > MpoolBatchPush {[func(context.Context, []*chain.SignedMessage) ([]cid.Cid, error) <> func(context.Context, []*types.SignedMessage) ([]cid.Cid, error)] base=func in type: #1 input; nested={[[]*chain.SignedMessage <> []*types.SignedMessage] base=slice element; nested={[*chain.SignedMessage <> *types.SignedMessage] base=codec marshaler implementations for codec 4: false != true; nested=nil}}} - > MpoolBatchPushMessage {[func(context.Context, []*chain.Message, *v1.MessageSendSpec) ([]*chain.SignedMessage, error) <> func(context.Context, []*types.Message, *api.MessageSendSpec) ([]*types.SignedMessage, error)] base=func in type: #1 input; nested={[[]*chain.Message <> []*types.Message] base=slice element; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}}} - > MpoolBatchPushUntrusted {[func(context.Context, []*chain.SignedMessage) ([]cid.Cid, error) <> func(context.Context, []*types.SignedMessage) ([]cid.Cid, error)] base=func in type: #1 input; nested={[[]*chain.SignedMessage <> []*types.SignedMessage] base=slice element; nested={[*chain.SignedMessage <> *types.SignedMessage] base=codec marshaler implementations for codec 4: false != true; nested=nil}}} - > MpoolCheckReplaceMessages {[func(context.Context, []*chain.Message) ([][]messagepool.MessageCheckStatus, error) <> func(context.Context, []*types.Message) ([][]api.MessageCheckStatus, error)] base=func in type: #1 input; nested={[[]*chain.Message <> []*types.Message] base=slice element; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}}} + > MpoolBatchPushMessage {[func(context.Context, []*chain.Message, *v1.MessageSendSpec) ([]*chain.SignedMessage, error) <> func(context.Context, []*types.Message, *api.MessageSendSpec) ([]*types.SignedMessage, error)] base=func in type: #2 input; nested={[*v1.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[v1.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[v1.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} + MpoolDeleteByAdress - > MpoolPending {[func(context.Context, chain.TipSetKey) ([]*chain.SignedMessage, error) <> func(context.Context, types.TipSetKey) ([]*types.SignedMessage, error)] base=func out type: #0 input; nested={[[]*chain.SignedMessage <> []*types.SignedMessage] base=slice element; nested={[*chain.SignedMessage <> *types.SignedMessage] base=codec marshaler implementations for codec 4: false != true; nested=nil}}} + MpoolPublishByAddr + MpoolPublishMessage - > MpoolPush {[func(context.Context, *chain.SignedMessage) (cid.Cid, error) <> func(context.Context, *types.SignedMessage) (cid.Cid, error)] base=func in type: #1 input; nested={[*chain.SignedMessage <> *types.SignedMessage] base=codec marshaler implementations for codec 4: false != true; nested=nil}} - > MpoolPushMessage {[func(context.Context, *chain.Message, *v1.MessageSendSpec) (*chain.SignedMessage, error) <> func(context.Context, *types.Message, *api.MessageSendSpec) (*types.SignedMessage, error)] base=func in type: #1 input; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}} - > MpoolPushUntrusted {[func(context.Context, *chain.SignedMessage) (cid.Cid, error) <> func(context.Context, *types.SignedMessage) (cid.Cid, error)] base=func in type: #1 input; nested={[*chain.SignedMessage <> *types.SignedMessage] base=codec marshaler implementations for codec 4: false != true; nested=nil}} - > MpoolSelect {[func(context.Context, chain.TipSetKey, float64) ([]*chain.SignedMessage, error) <> func(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error)] base=func out type: #0 input; nested={[[]*chain.SignedMessage <> []*types.SignedMessage] base=slice element; nested={[*chain.SignedMessage <> *types.SignedMessage] base=codec marshaler implementations for codec 4: false != true; nested=nil}}} + > MpoolPushMessage {[func(context.Context, *chain.Message, *v1.MessageSendSpec) (*chain.SignedMessage, error) <> func(context.Context, *types.Message, *api.MessageSendSpec) (*types.SignedMessage, error)] base=func in type: #2 input; nested={[*v1.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[v1.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[v1.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} + MpoolSelects - > MpoolSub {[func(context.Context) (<-chan messagepool.MpoolUpdate, error) <> func(context.Context) (<-chan api.MpoolUpdate, error)] base=func out type: #0 input; nested={[<-chan messagepool.MpoolUpdate <> <-chan api.MpoolUpdate] base=channel element; nested={[messagepool.MpoolUpdate <> api.MpoolUpdate] base=struct field; nested={[messagepool.MpoolUpdate <> api.MpoolUpdate] base=exported field type: #1 field named Message; nested={[*chain.SignedMessage <> *types.SignedMessage] base=codec marshaler implementations for codec 4: false != true; nested=nil}}}}} - MsigGetAvailableBalance - MsigGetPending - MsigGetVestingSchedule @@ -118,7 +104,7 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c + SetPassword - Shutdown - StateAllMinerFaults - > StateCall {[func(context.Context, *chain.Message, chain.TipSetKey) (*v1.InvocResult, error) <> func(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error)] base=func in type: #1 input; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}} + > StateCall {[func(context.Context, *chain.Message, chain.TipSetKey) (*v1.InvocResult, error) <> func(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error)] base=func out type: #0 input; nested={[*v1.InvocResult <> *api.InvocResult] base=pointed type; nested={[v1.InvocResult <> api.InvocResult] base=struct field; nested={[v1.InvocResult <> api.InvocResult] base=exported field type: #2 field named MsgRct; nested={[*chain.MessageReceipt <> *types.MessageReceipt] base=pointed type; nested={[chain.MessageReceipt <> types.MessageReceipt] base=struct field; nested={[chain.MessageReceipt <> types.MessageReceipt] base=exported field name: #1 field, ReturnValue != Return; nested=nil}}}}}}} - StateChangedActors - StateCompute - StateDecodeParams @@ -149,7 +135,6 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c - WalletNew + WalletNewAddress > WalletSign {[func(context.Context, address.Address, []uint8, wallet.MsgMeta) (*crypto.Signature, error) <> func(context.Context, address.Address, []uint8) (*crypto.Signature, error)] base=func in num: 4 != 3; nested=nil} - > WalletSignMessage {[func(context.Context, address.Address, *chain.Message) (*chain.SignedMessage, error) <> func(context.Context, address.Address, *types.Message) (*types.SignedMessage, error)] base=func in type: #2 input; nested={[*chain.Message <> *types.Message] base=codec marshaler implementations for codec 4: false != true; nested=nil}} + WalletState - WalletValidateAddress - WalletVerify From 9158704aec03005c774cf173e8190247b08e2f0a Mon Sep 17 00:00:00 2001 From: dtynn Date: Fri, 3 Dec 2021 13:35:04 +0800 Subject: [PATCH 067/167] fix: api diffs caused by MessageReceipt.ReturnValue --- venus-shared/chain/cbor_gen.go | 18 +++++++++--------- venus-shared/chain/message_receipt.go | 6 +++--- venus-shared/chain/message_receipt_test.go | 4 ++-- venus-shared/compatible-checks/api-diff.txt | 5 +---- 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/venus-shared/chain/cbor_gen.go b/venus-shared/chain/cbor_gen.go index 051eff390a..f64c7e78d5 100644 --- a/venus-shared/chain/cbor_gen.go +++ b/venus-shared/chain/cbor_gen.go @@ -1221,16 +1221,16 @@ func (t *MessageReceipt) MarshalCBOR(w io.Writer) error { } } - // t.ReturnValue ([]uint8) (slice) - if len(t.ReturnValue) > cbg.ByteArrayMaxLen { - return xerrors.Errorf("Byte array in field t.ReturnValue was too long") + // t.Return ([]uint8) (slice) + if len(t.Return) > cbg.ByteArrayMaxLen { + return xerrors.Errorf("Byte array in field t.Return was too long") } - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.ReturnValue))); err != nil { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.Return))); err != nil { return err } - if _, err := w.Write(t.ReturnValue[:]); err != nil { + if _, err := w.Write(t.Return[:]); err != nil { return err } @@ -1290,7 +1290,7 @@ func (t *MessageReceipt) UnmarshalCBOR(r io.Reader) error { t.ExitCode = exitcode.ExitCode(extraI) } - // t.ReturnValue ([]uint8) (slice) + // t.Return ([]uint8) (slice) maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) if err != nil { @@ -1298,17 +1298,17 @@ func (t *MessageReceipt) UnmarshalCBOR(r io.Reader) error { } if extra > cbg.ByteArrayMaxLen { - return fmt.Errorf("t.ReturnValue: byte array too large (%d)", extra) + return fmt.Errorf("t.Return: byte array too large (%d)", extra) } if maj != cbg.MajByteString { return fmt.Errorf("expected byte array") } if extra > 0 { - t.ReturnValue = make([]uint8, extra) + t.Return = make([]uint8, extra) } - if _, err := io.ReadFull(br, t.ReturnValue[:]); err != nil { + if _, err := io.ReadFull(br, t.Return[:]); err != nil { return err } // t.GasUsed (int64) (int64) diff --git a/venus-shared/chain/message_receipt.go b/venus-shared/chain/message_receipt.go index c31d0e99e7..3d7f9a5982 100644 --- a/venus-shared/chain/message_receipt.go +++ b/venus-shared/chain/message_receipt.go @@ -9,9 +9,9 @@ import ( // MessageReceipt is what is returned by executing a message on the vm. type MessageReceipt struct { - ExitCode exitcode.ExitCode - ReturnValue []byte - GasUsed int64 + ExitCode exitcode.ExitCode + Return []byte + GasUsed int64 } func (r *MessageReceipt) String() string { diff --git a/venus-shared/chain/message_receipt_test.go b/venus-shared/chain/message_receipt_test.go index b5b138ff94..4d7d166626 100644 --- a/venus-shared/chain/message_receipt_test.go +++ b/venus-shared/chain/message_receipt_test.go @@ -21,7 +21,7 @@ func TestMessageReceiptBasic(t *testing.T) { Buf: &buf, Prepare: func() { require.Equal(t, src, dst, "empty values") - require.Nil(t, src.ReturnValue) + require.Nil(t, src.Return) }, ProvideOpts: []interface{}{ @@ -35,7 +35,7 @@ func TestMessageReceiptBasic(t *testing.T) { }, Provided: func() { - require.Len(t, src.ReturnValue, dataLen) + require.Len(t, src.Return, dataLen) require.GreaterOrEqual(t, src.ExitCode, exitcode.ExitCode(0)) require.Less(t, src.ExitCode, exitcode.ExitCode(20)) diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt index 54ec2392a5..bcc5eb49c2 100644 --- a/venus-shared/compatible-checks/api-diff.txt +++ b/venus-shared/compatible-checks/api-diff.txt @@ -5,7 +5,6 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c - ChainCheckBlockstore - ChainGetGenesis - ChainGetNode - > ChainGetParentReceipts {[func(context.Context, cid.Cid) ([]*chain.MessageReceipt, error) <> func(context.Context, cid.Cid) ([]*types.MessageReceipt, error)] base=func out type: #0 input; nested={[[]*chain.MessageReceipt <> []*types.MessageReceipt] base=slice element; nested={[*chain.MessageReceipt <> *types.MessageReceipt] base=pointed type; nested={[chain.MessageReceipt <> types.MessageReceipt] base=struct field; nested={[chain.MessageReceipt <> types.MessageReceipt] base=exported field name: #1 field, ReturnValue != Return; nested=nil}}}}} + ChainGetRandomnessFromBeacon + ChainGetRandomnessFromTickets + ChainGetReceipts @@ -104,7 +103,7 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c + SetPassword - Shutdown - StateAllMinerFaults - > StateCall {[func(context.Context, *chain.Message, chain.TipSetKey) (*v1.InvocResult, error) <> func(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error)] base=func out type: #0 input; nested={[*v1.InvocResult <> *api.InvocResult] base=pointed type; nested={[v1.InvocResult <> api.InvocResult] base=struct field; nested={[v1.InvocResult <> api.InvocResult] base=exported field type: #2 field named MsgRct; nested={[*chain.MessageReceipt <> *types.MessageReceipt] base=pointed type; nested={[chain.MessageReceipt <> types.MessageReceipt] base=struct field; nested={[chain.MessageReceipt <> types.MessageReceipt] base=exported field name: #1 field, ReturnValue != Return; nested=nil}}}}}}} + > StateCall {[func(context.Context, *chain.Message, chain.TipSetKey) (*v1.InvocResult, error) <> func(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error)] base=func out type: #0 input; nested={[*v1.InvocResult <> *api.InvocResult] base=pointed type; nested={[v1.InvocResult <> api.InvocResult] base=struct field; nested={[v1.InvocResult <> api.InvocResult] base=exported field type: #4 field named ExecutionTrace; nested={[stmgr.ExecutionTrace <> types.ExecutionTrace] base=struct field; nested={[stmgr.ExecutionTrace <> types.ExecutionTrace] base=exported field type: #4 field named GasCharges; nested={[[]*stmgr.GasTrace <> []*types.GasTrace] base=slice element; nested={[*stmgr.GasTrace <> *types.GasTrace] base=codec marshaler implementations for codec 4: false != true; nested=nil}}}}}}}} - StateChangedActors - StateCompute - StateDecodeParams @@ -114,8 +113,6 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c + StateMinerWorkerAddress - StateReadState - StateReplay - > StateSearchMsg {[func(context.Context, chain.TipSetKey, cid.Cid, abi.ChainEpoch, bool) (*v1.MsgLookup, error) <> func(context.Context, types.TipSetKey, cid.Cid, abi.ChainEpoch, bool) (*api.MsgLookup, error)] base=func out type: #0 input; nested={[*v1.MsgLookup <> *api.MsgLookup] base=pointed type; nested={[v1.MsgLookup <> api.MsgLookup] base=struct field; nested={[v1.MsgLookup <> api.MsgLookup] base=exported field type: #1 field named Receipt; nested={[chain.MessageReceipt <> types.MessageReceipt] base=struct field; nested={[chain.MessageReceipt <> types.MessageReceipt] base=exported field name: #1 field, ReturnValue != Return; nested=nil}}}}}} - > StateWaitMsg {[func(context.Context, cid.Cid, uint64, abi.ChainEpoch, bool) (*v1.MsgLookup, error) <> func(context.Context, cid.Cid, uint64, abi.ChainEpoch, bool) (*api.MsgLookup, error)] base=func out type: #0 input; nested={[*v1.MsgLookup <> *api.MsgLookup] base=pointed type; nested={[v1.MsgLookup <> api.MsgLookup] base=struct field; nested={[v1.MsgLookup <> api.MsgLookup] base=exported field type: #1 field named Receipt; nested={[chain.MessageReceipt <> types.MessageReceipt] base=struct field; nested={[chain.MessageReceipt <> types.MessageReceipt] base=exported field name: #1 field, ReturnValue != Return; nested=nil}}}}}} - SyncCheckBad - SyncCheckpoint - SyncIncomingBlocks From 71225ba6a62dab6e5e2d55f77e9e70a1b0ff991a Mon Sep 17 00:00:00 2001 From: dtynn Date: Fri, 3 Dec 2021 13:38:30 +0800 Subject: [PATCH 068/167] fix: add returned error for ChainNotify --- venus-shared/api/chain/v1/chain.go | 2 +- venus-shared/compatible-checks/api-diff.txt | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/venus-shared/api/chain/v1/chain.go b/venus-shared/api/chain/v1/chain.go index 47c7ea4dd9..416c222eac 100644 --- a/venus-shared/api/chain/v1/chain.go +++ b/venus-shared/api/chain/v1/chain.go @@ -84,7 +84,7 @@ type IChainInfo interface { // Rule[perm:read] StateVerifierStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) // Rule[perm:read] - ChainNotify(ctx context.Context) <-chan []*HeadChange + ChainNotify(ctx context.Context) (<-chan []*HeadChange, error) // Rule[perm:read] GetFullBlock(ctx context.Context, id cid.Cid) (*chain.FullBlock, error) // Rule[perm:read] diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt index bcc5eb49c2..77bd872a60 100644 --- a/venus-shared/compatible-checks/api-diff.txt +++ b/venus-shared/compatible-checks/api-diff.txt @@ -9,7 +9,6 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c + ChainGetRandomnessFromTickets + ChainGetReceipts + ChainList - > ChainNotify {[func(context.Context) <-chan []*v1.HeadChange <> func(context.Context) (<-chan []*api.HeadChange, error)] base=func out num: 1 != 2; nested=nil} + ChainSyncHandleNewTipSet - ClientCalcCommP - ClientCancelDataTransfer From d21d341442ce133ec500282e9db0ba6fc089ef1e Mon Sep 17 00:00:00 2001 From: dtynn Date: Fri, 3 Dec 2021 13:44:13 +0800 Subject: [PATCH 069/167] fix: api diffs caused by BlockTemplate --- venus-shared/api/chain/v1/types.go | 4 ++-- venus-shared/compatible-checks/api-diff.txt | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/venus-shared/api/chain/v1/types.go b/venus-shared/api/chain/v1/types.go index 854c0dbace..29d8879987 100644 --- a/venus-shared/api/chain/v1/types.go +++ b/venus-shared/api/chain/v1/types.go @@ -130,9 +130,9 @@ type MiningBaseInfo struct { //nolint type BlockTemplate struct { Miner address.Address Parents chain.TipSetKey - Ticket chain.Ticket + Ticket *chain.Ticket Eproof *chain.ElectionProof - BeaconValues []*chain.BeaconEntry + BeaconValues []chain.BeaconEntry Messages []*chain.SignedMessage Epoch abi.ChainEpoch Timestamp uint64 diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt index 77bd872a60..e40f2227f4 100644 --- a/venus-shared/compatible-checks/api-diff.txt +++ b/venus-shared/compatible-checks/api-diff.txt @@ -60,7 +60,6 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c - MarketReserveFunds - MarketWithdraw + MessageWait - > MinerCreateBlock {[func(context.Context, *v1.BlockTemplate) (*chain.BlockMsg, error) <> func(context.Context, *api.BlockTemplate) (*types.BlockMsg, error)] base=func in type: #1 input; nested={[*v1.BlockTemplate <> *api.BlockTemplate] base=pointed type; nested={[v1.BlockTemplate <> api.BlockTemplate] base=struct field; nested={[v1.BlockTemplate <> api.BlockTemplate] base=exported field type: #2 field named Ticket; nested={[chain.Ticket <> *types.Ticket] base=type kinds: struct != ptr; nested=nil}}}}} > MpoolBatchPushMessage {[func(context.Context, []*chain.Message, *v1.MessageSendSpec) ([]*chain.SignedMessage, error) <> func(context.Context, []*types.Message, *api.MessageSendSpec) ([]*types.SignedMessage, error)] base=func in type: #2 input; nested={[*v1.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[v1.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[v1.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} + MpoolDeleteByAdress + MpoolPublishByAddr From 80eedbd28a83b7c8bf4a7a1b13468c07f1f258af Mon Sep 17 00:00:00 2001 From: dtynn Date: Fri, 3 Dec 2021 14:07:28 +0800 Subject: [PATCH 070/167] fix: api diffs caused by PaymentInfo cbor codec impl --- venus-devtool/cborgen/main.go | 7 ++ venus-shared/api/chain/v1/paych.go | 11 +- venus-shared/api/chain/v1/types.go | 44 ------- venus-shared/compatible-checks/api-diff.txt | 1 - venus-shared/paych/cbor_gen.go | 131 ++++++++++++++++++++ venus-shared/paych/paych.go | 55 ++++++++ 6 files changed, 199 insertions(+), 50 deletions(-) create mode 100644 venus-shared/paych/cbor_gen.go create mode 100644 venus-shared/paych/paych.go diff --git a/venus-devtool/cborgen/main.go b/venus-devtool/cborgen/main.go index b6d4a65f3e..b6e07b4ccd 100644 --- a/venus-devtool/cborgen/main.go +++ b/venus-devtool/cborgen/main.go @@ -9,6 +9,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/venus/venus-shared/libp2p/exchange" "github.com/filecoin-project/venus/venus-shared/libp2p/hello" + "github.com/filecoin-project/venus/venus-shared/paych" ) type genTarget struct { @@ -35,6 +36,12 @@ func main() { exchange.BSTipSet{}, }, }, + { + dir: "../venus-shared/paych/", + types: []interface{}{ + paych.PaymentInfo{}, + }, + }, { dir: "../venus-shared/chain/", types: []interface{}{ diff --git a/venus-shared/api/chain/v1/paych.go b/venus-shared/api/chain/v1/paych.go index d7e975b896..6bfe91db19 100644 --- a/venus-shared/api/chain/v1/paych.go +++ b/venus-shared/api/chain/v1/paych.go @@ -5,8 +5,9 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/specs-actors/actors/builtin/paych" "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/paych" ) type IPaychan interface { @@ -15,7 +16,7 @@ type IPaychan interface { // @to: the payment channel recipient // @amt: the deposits funds in the payment channel // Rule[perm:read] - PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*ChannelInfo, error) + PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*paych.ChannelInfo, error) // PaychAvailableFunds get the status of an outbound payment channel // @pch: payment channel address // Rule[perm:read] @@ -39,14 +40,14 @@ type IPaychan interface { // @to: the payment channel recipient // @vouchers: the outstanding (non-redeemed) vouchers // Rule[perm:read] - PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []VoucherSpec) (*PaymentInfo, error) + PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []paych.VoucherSpec) (*paych.PaymentInfo, error) // PaychList list the addresses of all channels that have been created // Rule[perm:read] PaychList(ctx context.Context) ([]address.Address, error) // PaychStatus get the payment channel status // @pch: payment channel address // Rule[perm:read] - PaychStatus(ctx context.Context, pch address.Address) (*PaychStatus, error) + PaychStatus(ctx context.Context, pch address.Address) (*paych.Status, error) // PaychSettle update payment channel status to settle // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain // @pch: payment channel address @@ -84,7 +85,7 @@ type IPaychan interface { // If there are insufficient funds in the channel to create the voucher, // returns a nil voucher and the shortfall. // Rule[perm:read] - PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*VoucherCreateResult, error) + PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paych.VoucherCreateResult, error) // PaychVoucherList list vouchers in payment channel // @pch: payment channel address // Rule[perm:read] diff --git a/venus-shared/api/chain/v1/types.go b/venus-shared/api/chain/v1/types.go index 29d8879987..c4622d176f 100644 --- a/venus-shared/api/chain/v1/types.go +++ b/venus-shared/api/chain/v1/types.go @@ -13,7 +13,6 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" - "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" "github.com/filecoin-project/venus/venus-shared/api" "github.com/filecoin-project/venus/venus-shared/chain" @@ -164,24 +163,6 @@ type Version struct { APIVersion api.Version } -type PCHDir int - -const ( - PCHUndef PCHDir = iota - PCHInbound - PCHOutbound -) - -type PaychStatus struct { - ControlAddr address.Address - Direction PCHDir -} - -type ChannelInfo struct { - Channel address.Address - WaitSentinel cid.Cid -} - type ChannelAvailableFunds struct { // Channel is the address of the channel Channel *address.Address @@ -204,31 +185,6 @@ type ChannelAvailableFunds struct { VoucherReedeemedAmt chain.BigInt } -type PaymentInfo struct { - Channel address.Address - WaitSentinel cid.Cid - Vouchers []*paych.SignedVoucher -} - -type VoucherSpec struct { - Amount chain.BigInt - TimeLockMin abi.ChainEpoch - TimeLockMax abi.ChainEpoch - MinSettle abi.ChainEpoch - - Extra *paych.ModVerifyParams -} - -// VoucherCreateResult is the response to calling PaychVoucherCreate -type VoucherCreateResult struct { - // Voucher that was created, or nil if there was an error or if there - // were insufficient funds in the channel - Voucher *paych.SignedVoucher - // Shortfall is the additional amount that would be needed in the channel - // in order to be able to create the voucher - Shortfall chain.BigInt -} - // ChainInfo is used to track metadata about a peer and its chain. type ChainInfo struct { // The originator of the TipSetKey propagation wave. diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt index e40f2227f4..f562b6f99b 100644 --- a/venus-shared/compatible-checks/api-diff.txt +++ b/venus-shared/compatible-checks/api-diff.txt @@ -93,7 +93,6 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c + NetworkGetPeerID + NetworkPeers - NodeStatus - > PaychNewPayment {[func(context.Context, address.Address, address.Address, []v1.VoucherSpec) (*v1.PaymentInfo, error) <> func(context.Context, address.Address, address.Address, []api.VoucherSpec) (*api.PaymentInfo, error)] base=func out type: #0 input; nested={[*v1.PaymentInfo <> *api.PaymentInfo] base=codec marshaler implementations for codec 8: false != true; nested=nil}} + ProtocolParameters + ResolveToKeyAddr - Session diff --git a/venus-shared/paych/cbor_gen.go b/venus-shared/paych/cbor_gen.go new file mode 100644 index 0000000000..3afd90051d --- /dev/null +++ b/venus-shared/paych/cbor_gen.go @@ -0,0 +1,131 @@ +// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. + +package paych + +import ( + "fmt" + "io" + "math" + "sort" + + paych "github.com/filecoin-project/specs-actors/actors/builtin/paych" + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" +) + +var _ = xerrors.Errorf +var _ = cid.Undef +var _ = math.E +var _ = sort.Sort + +var lengthBufPaymentInfo = []byte{131} + +func (t *PaymentInfo) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufPaymentInfo); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Channel (address.Address) (struct) + if err := t.Channel.MarshalCBOR(w); err != nil { + return err + } + + // t.WaitSentinel (cid.Cid) (struct) + + if err := cbg.WriteCidBuf(scratch, w, t.WaitSentinel); err != nil { + return xerrors.Errorf("failed to write cid field t.WaitSentinel: %w", err) + } + + // t.Vouchers ([]*paych.SignedVoucher) (slice) + if len(t.Vouchers) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Vouchers was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Vouchers))); err != nil { + return err + } + for _, v := range t.Vouchers { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + return nil +} + +func (t *PaymentInfo) UnmarshalCBOR(r io.Reader) error { + *t = PaymentInfo{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 3 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Channel (address.Address) (struct) + + { + + if err := t.Channel.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Channel: %w", err) + } + + } + // t.WaitSentinel (cid.Cid) (struct) + + { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.WaitSentinel: %w", err) + } + + t.WaitSentinel = c + + } + // t.Vouchers ([]*paych.SignedVoucher) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Vouchers: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Vouchers = make([]*paych.SignedVoucher, extra) + } + + for i := 0; i < int(extra); i++ { + + var v paych.SignedVoucher + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.Vouchers[i] = &v + } + + return nil +} diff --git a/venus-shared/paych/paych.go b/venus-shared/paych/paych.go new file mode 100644 index 0000000000..be966aeace --- /dev/null +++ b/venus-shared/paych/paych.go @@ -0,0 +1,55 @@ +package paych + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" + "github.com/filecoin-project/venus/venus-shared/chain" +) + +type SignedVoucher = paych.SignedVoucher + +type PCHDir int + +const ( + PCHUndef PCHDir = iota + PCHInbound + PCHOutbound +) + +type Status struct { + ControlAddr address.Address + Direction PCHDir +} + +type ChannelInfo struct { + Channel address.Address + WaitSentinel cid.Cid +} + +type PaymentInfo struct { + Channel address.Address + WaitSentinel cid.Cid + Vouchers []*paych.SignedVoucher +} + +type VoucherSpec struct { + Amount chain.BigInt + TimeLockMin abi.ChainEpoch + TimeLockMax abi.ChainEpoch + MinSettle abi.ChainEpoch + + Extra *paych.ModVerifyParams +} + +// VoucherCreateResult is the response to calling PaychVoucherCreate +type VoucherCreateResult struct { + // Voucher that was created, or nil if there was an error or if there + // were insufficient funds in the channel + Voucher *paych.SignedVoucher + // Shortfall is the additional amount that would be needed in the channel + // in order to be able to create the voucher + Shortfall chain.BigInt +} From d5241fa52440f814ffaa17f0b5c71d173e13adf4 Mon Sep 17 00:00:00 2001 From: dtynn Date: Fri, 3 Dec 2021 15:02:34 +0800 Subject: [PATCH 071/167] show codec string in Similar reason --- Makefile | 5 ++- venus-devtool/compatible/apis/diff.go | 2 +- venus-shared/compatible-checks/api-diff.txt | 2 +- venus-shared/go.sum | 1 + .../messagepool/checkstatuscode_string.go | 35 +++++++++++++++ venus-shared/typeutil/codecflag_string.go | 43 +++++++++++++++++++ venus-shared/typeutil/similar.go | 25 +++++------ venus-shared/typeutil/similar_test.go | 16 +++---- 8 files changed, 106 insertions(+), 23 deletions(-) create mode 100644 venus-shared/messagepool/checkstatuscode_string.go create mode 100644 venus-shared/typeutil/codecflag_string.go diff --git a/Makefile b/Makefile index 57b5a84612..23f49b9406 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,13 @@ cborgen: cd venus-devtool && go run ./cborgen/*.go +gogen: + cd venus-shared && go generate ./... + test-venus-shared: cd venus-shared && go test -covermode=set ./... -test: test-venus-shared +test: gogen test-venus-shared compatible-all: compatible-api compatible-actor diff --git a/venus-devtool/compatible/apis/diff.go b/venus-devtool/compatible/apis/diff.go index 072935f1b0..5fd2782c30 100644 --- a/venus-devtool/compatible/apis/diff.go +++ b/venus-devtool/compatible/apis/diff.go @@ -63,7 +63,7 @@ func showDiff(impl, origin reflect.Type) { continue } - similar, reason := typeutil.Similar(implMethods[ii].Type, originMethods[oi].Type, typeutil.JSONCodec|typeutil.CborCodec, typeutil.StructFieldsOrdered|typeutil.StructFieldTagsMatch) + similar, reason := typeutil.Similar(implMethods[ii].Type, originMethods[oi].Type, typeutil.CodecJSON|typeutil.CodecCbor, typeutil.StructFieldsOrdered|typeutil.StructFieldTagsMatch) if similar { continue } diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt index f562b6f99b..e9b5c3c811 100644 --- a/venus-shared/compatible-checks/api-diff.txt +++ b/venus-shared/compatible-checks/api-diff.txt @@ -100,7 +100,7 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c + SetPassword - Shutdown - StateAllMinerFaults - > StateCall {[func(context.Context, *chain.Message, chain.TipSetKey) (*v1.InvocResult, error) <> func(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error)] base=func out type: #0 input; nested={[*v1.InvocResult <> *api.InvocResult] base=pointed type; nested={[v1.InvocResult <> api.InvocResult] base=struct field; nested={[v1.InvocResult <> api.InvocResult] base=exported field type: #4 field named ExecutionTrace; nested={[stmgr.ExecutionTrace <> types.ExecutionTrace] base=struct field; nested={[stmgr.ExecutionTrace <> types.ExecutionTrace] base=exported field type: #4 field named GasCharges; nested={[[]*stmgr.GasTrace <> []*types.GasTrace] base=slice element; nested={[*stmgr.GasTrace <> *types.GasTrace] base=codec marshaler implementations for codec 4: false != true; nested=nil}}}}}}}} + > StateCall {[func(context.Context, *chain.Message, chain.TipSetKey) (*v1.InvocResult, error) <> func(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error)] base=func out type: #0 input; nested={[*v1.InvocResult <> *api.InvocResult] base=pointed type; nested={[v1.InvocResult <> api.InvocResult] base=struct field; nested={[v1.InvocResult <> api.InvocResult] base=exported field type: #4 field named ExecutionTrace; nested={[stmgr.ExecutionTrace <> types.ExecutionTrace] base=struct field; nested={[stmgr.ExecutionTrace <> types.ExecutionTrace] base=exported field type: #4 field named GasCharges; nested={[[]*stmgr.GasTrace <> []*types.GasTrace] base=slice element; nested={[*stmgr.GasTrace <> *types.GasTrace] base=codec marshaler implementations for codec JSON: false != true; nested=nil}}}}}}}} - StateChangedActors - StateCompute - StateDecodeParams diff --git a/venus-shared/go.sum b/venus-shared/go.sum index 75ba513b85..6029973ce8 100644 --- a/venus-shared/go.sum +++ b/venus-shared/go.sum @@ -443,6 +443,7 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/venus-shared/messagepool/checkstatuscode_string.go b/venus-shared/messagepool/checkstatuscode_string.go new file mode 100644 index 0000000000..bb009d30fd --- /dev/null +++ b/venus-shared/messagepool/checkstatuscode_string.go @@ -0,0 +1,35 @@ +// Code generated by "stringer -type=CheckStatusCode -trimprefix=CheckStatus"; DO NOT EDIT. + +package messagepool + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[CheckStatusMessageSerialize-1] + _ = x[CheckStatusMessageSize-2] + _ = x[CheckStatusMessageValidity-3] + _ = x[CheckStatusMessageMinGas-4] + _ = x[CheckStatusMessageMinBaseFee-5] + _ = x[CheckStatusMessageBaseFee-6] + _ = x[CheckStatusMessageBaseFeeLowerBound-7] + _ = x[CheckStatusMessageBaseFeeUpperBound-8] + _ = x[CheckStatusMessageGetStateNonce-9] + _ = x[CheckStatusMessageNonce-10] + _ = x[CheckStatusMessageGetStateBalance-11] + _ = x[CheckStatusMessageBalance-12] +} + +const _CheckStatusCode_name = "MessageSerializeMessageSizeMessageValidityMessageMinGasMessageMinBaseFeeMessageBaseFeeMessageBaseFeeLowerBoundMessageBaseFeeUpperBoundMessageGetStateNonceMessageNonceMessageGetStateBalanceMessageBalance" + +var _CheckStatusCode_index = [...]uint8{0, 16, 27, 42, 55, 72, 86, 110, 134, 154, 166, 188, 202} + +func (i CheckStatusCode) String() string { + i -= 1 + if i < 0 || i >= CheckStatusCode(len(_CheckStatusCode_index)-1) { + return "CheckStatusCode(" + strconv.FormatInt(int64(i+1), 10) + ")" + } + return _CheckStatusCode_name[_CheckStatusCode_index[i]:_CheckStatusCode_index[i+1]] +} diff --git a/venus-shared/typeutil/codecflag_string.go b/venus-shared/typeutil/codecflag_string.go new file mode 100644 index 0000000000..05938eec98 --- /dev/null +++ b/venus-shared/typeutil/codecflag_string.go @@ -0,0 +1,43 @@ +// Code generated by "stringer -type=CodecFlag -trimprefix=Codec"; DO NOT EDIT. + +package typeutil + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[CodecBinary-1] + _ = x[CodecText-2] + _ = x[CodecJSON-4] + _ = x[CodecCbor-8] + _ = x[CodecMaxLimit-16] +} + +const ( + _CodecFlag_name_0 = "BinaryText" + _CodecFlag_name_1 = "JSON" + _CodecFlag_name_2 = "Cbor" + _CodecFlag_name_3 = "MaxLimit" +) + +var ( + _CodecFlag_index_0 = [...]uint8{0, 6, 10} +) + +func (i CodecFlag) String() string { + switch { + case 1 <= i && i <= 2: + i -= 1 + return _CodecFlag_name_0[_CodecFlag_index_0[i]:_CodecFlag_index_0[i+1]] + case i == 4: + return _CodecFlag_name_1 + case i == 8: + return _CodecFlag_name_2 + case i == 16: + return _CodecFlag_name_3 + default: + return "CodecFlag(" + strconv.FormatInt(int64(i), 10) + ")" + } +} diff --git a/venus-shared/typeutil/similar.go b/venus-shared/typeutil/similar.go index 114b89e947..e40384bed3 100644 --- a/venus-shared/typeutil/similar.go +++ b/venus-shared/typeutil/similar.go @@ -12,7 +12,7 @@ import ( ) func init() { - if zeroes := bits.TrailingZeros(uint(_CodecLimit)); zeroes != len(codecs) { + if zeroes := bits.TrailingZeros(uint(CodecMaxLimit)); zeroes != len(codecs) { panic(fmt.Errorf("codec count not match, %d != %d", zeroes, len(codecs))) } @@ -25,12 +25,13 @@ func init() { type CodecFlag uint +//go:generate go run golang.org/x/tools/cmd/stringer -type=CodecFlag -trimprefix=Codec const ( - BinaryCodec CodecFlag = 1 << iota - TextCodec - JSONCodec - CborCodec - _CodecLimit + CodecBinary CodecFlag = 1 << iota + CodecText + CodecJSON + CodecCbor + CodecMaxLimit ) type SimilarMode uint @@ -47,22 +48,22 @@ var ( unmarshaler reflect.Type }{ { - flag: BinaryCodec, + flag: CodecBinary, marshaler: reflect.TypeOf((*encoding.BinaryMarshaler)(nil)).Elem(), unmarshaler: reflect.TypeOf((*encoding.BinaryUnmarshaler)(nil)).Elem(), }, { - flag: TextCodec, + flag: CodecText, marshaler: reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem(), unmarshaler: reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem(), }, { - flag: JSONCodec, + flag: CodecJSON, marshaler: reflect.TypeOf((*json.Marshaler)(nil)).Elem(), unmarshaler: reflect.TypeOf((*json.Unmarshaler)(nil)).Elem(), }, { - flag: CborCodec, + flag: CodecCbor, marshaler: reflect.TypeOf((*cbor.Marshaler)(nil)).Elem(), unmarshaler: reflect.TypeOf((*cbor.Unmarshaler)(nil)).Elem(), }, @@ -155,14 +156,14 @@ func Similar(a, b interface{}, codecFlag CodecFlag, smode SimilarMode) (bool, *R aMarImpl := atyp.Implements(codecs[i].marshaler) bMarImpl := btyp.Implements(codecs[i].marshaler) if aMarImpl != bMarImpl { - reason = reasonf("%w for codec %d: %v != %v", ReasonCodecMarshalerImplementations, codecs[i].flag, aMarImpl, bMarImpl) + reason = reasonf("%w for codec %s: %v != %v", ReasonCodecMarshalerImplementations, codecs[i].flag, aMarImpl, bMarImpl) return yes, reason } aUMarImpl := atyp.Implements(codecs[i].unmarshaler) bUMarImpl := btyp.Implements(codecs[i].unmarshaler) if aUMarImpl != bUMarImpl { - reason = reasonf("%w for codec %d: %v; %v", ReasonCodecUnmarshalerImplementations, codecs[i].flag, aUMarImpl, bUMarImpl) + reason = reasonf("%w for codec %s: %v; %v", ReasonCodecUnmarshalerImplementations, codecs[i].flag, aUMarImpl, bUMarImpl) return yes, reason } } diff --git a/venus-shared/typeutil/similar_test.go b/venus-shared/typeutil/similar_test.go index 0472cae76b..8f9d4b6364 100644 --- a/venus-shared/typeutil/similar_test.go +++ b/venus-shared/typeutil/similar_test.go @@ -545,22 +545,22 @@ func TestCodec(t *testing.T) { }, { val: new(AInt), - codecFlag: BinaryCodec, + codecFlag: CodecBinary, reasons: []error{ReasonCodecMarshalerImplementations}, }, { val: new(AInt), - codecFlag: TextCodec, + codecFlag: CodecText, reasons: []error{ReasonCodecMarshalerImplementations}, }, { val: new(AInt), - codecFlag: JSONCodec, + codecFlag: CodecJSON, reasons: []error{ReasonCodecMarshalerImplementations}, }, { val: new(AInt), - codecFlag: CborCodec, + codecFlag: CodecCbor, reasons: []error{ReasonCodecMarshalerImplementations}, }, { @@ -569,22 +569,22 @@ func TestCodec(t *testing.T) { }, { val: new(codecInt), - codecFlag: BinaryCodec, + codecFlag: CodecBinary, reasons: []error{ReasonCodecUnmarshalerImplementations}, }, { val: new(codecInt), - codecFlag: TextCodec, + codecFlag: CodecText, reasons: []error{ReasonCodecUnmarshalerImplementations}, }, { val: new(codecInt), - codecFlag: JSONCodec, + codecFlag: CodecJSON, reasons: []error{ReasonCodecUnmarshalerImplementations}, }, { val: new(codecInt), - codecFlag: CborCodec, + codecFlag: CodecCbor, reasons: []error{ReasonCodecUnmarshalerImplementations}, }, } From 9a6e3dd2b3b61aa62fe66e22cd63dacf4dec8be9 Mon Sep 17 00:00:00 2001 From: dtynn Date: Fri, 3 Dec 2021 18:23:42 +0800 Subject: [PATCH 072/167] impl Similar: convertible, interface all methods, recursive --- venus-shared/compatible-checks/api-diff.txt | 1 - venus-shared/stmgr/exec.go | 54 +++++++------ venus-shared/typeutil/codecflag_string.go | 4 +- venus-shared/typeutil/methods.go | 43 +++++++++- venus-shared/typeutil/methods_test.go | 17 ++++ venus-shared/typeutil/similar.go | 88 ++++++++++++--------- venus-shared/typeutil/similar_reason.go | 1 + venus-shared/typeutil/similar_test.go | 85 ++++++++++++++++++++ 8 files changed, 224 insertions(+), 69 deletions(-) diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt index e9b5c3c811..4b6b8aaa12 100644 --- a/venus-shared/compatible-checks/api-diff.txt +++ b/venus-shared/compatible-checks/api-diff.txt @@ -100,7 +100,6 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c + SetPassword - Shutdown - StateAllMinerFaults - > StateCall {[func(context.Context, *chain.Message, chain.TipSetKey) (*v1.InvocResult, error) <> func(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error)] base=func out type: #0 input; nested={[*v1.InvocResult <> *api.InvocResult] base=pointed type; nested={[v1.InvocResult <> api.InvocResult] base=struct field; nested={[v1.InvocResult <> api.InvocResult] base=exported field type: #4 field named ExecutionTrace; nested={[stmgr.ExecutionTrace <> types.ExecutionTrace] base=struct field; nested={[stmgr.ExecutionTrace <> types.ExecutionTrace] base=exported field type: #4 field named GasCharges; nested={[[]*stmgr.GasTrace <> []*types.GasTrace] base=slice element; nested={[*stmgr.GasTrace <> *types.GasTrace] base=codec marshaler implementations for codec JSON: false != true; nested=nil}}}}}}}} - StateChangedActors - StateCompute - StateDecodeParams diff --git a/venus-shared/stmgr/exec.go b/venus-shared/stmgr/exec.go index 2fb4224a03..3d91870851 100644 --- a/venus-shared/stmgr/exec.go +++ b/venus-shared/stmgr/exec.go @@ -1,8 +1,10 @@ package stmgr import ( + "encoding/json" "fmt" "regexp" + "runtime" "strings" "time" @@ -77,30 +79,30 @@ func (l Loc) Important() bool { return importantRegex.MatchString(l.Function) } -// TODO: ??? -// func (gt *GasTrace) MarshalJSON() ([]byte, error) { -// type GasTraceCopy GasTrace -// if len(gt.Location) == 0 { -// if len(gt.Callers) != 0 { -// frames := runtime.CallersFrames(gt.Callers) -// for { -// frame, more := frames.Next() -// if frame.Function == "github.com/filecoin-project/lotus/chain/vm.(*VM).ApplyMessage" { -// break -// } -// l := Loc{ -// File: frame.File, -// Line: frame.Line, -// Function: frame.Function, -// } -// gt.Location = append(gt.Location, l) -// if !more { -// break -// } -// } -// } -// } +func (gt *GasTrace) MarshalJSON() ([]byte, error) { + type GasTraceCopy GasTrace + if len(gt.Location) == 0 { + if len(gt.Callers) != 0 { + frames := runtime.CallersFrames(gt.Callers) + for { + frame, more := frames.Next() + // TODO: this func name must be fixed + if frame.Function == "github.com/filecoin-project/lotus/chain/vm.(*VM).ApplyMessage" { + break + } + l := Loc{ + File: frame.File, + Line: frame.Line, + Function: frame.Function, + } + gt.Location = append(gt.Location, l) + if !more { + break + } + } + } + } -// cpy := (*GasTraceCopy)(gt) -// return json.Marshal(cpy) -// } + cpy := (*GasTraceCopy)(gt) + return json.Marshal(cpy) +} diff --git a/venus-shared/typeutil/codecflag_string.go b/venus-shared/typeutil/codecflag_string.go index 05938eec98..d62c80d4cf 100644 --- a/venus-shared/typeutil/codecflag_string.go +++ b/venus-shared/typeutil/codecflag_string.go @@ -12,14 +12,14 @@ func _() { _ = x[CodecText-2] _ = x[CodecJSON-4] _ = x[CodecCbor-8] - _ = x[CodecMaxLimit-16] + _ = x[_codecLimit-16] } const ( _CodecFlag_name_0 = "BinaryText" _CodecFlag_name_1 = "JSON" _CodecFlag_name_2 = "Cbor" - _CodecFlag_name_3 = "MaxLimit" + _CodecFlag_name_3 = "_codecLimit" ) var ( diff --git a/venus-shared/typeutil/methods.go b/venus-shared/typeutil/methods.go index f8909f3233..1b432b046a 100644 --- a/venus-shared/typeutil/methods.go +++ b/venus-shared/typeutil/methods.go @@ -27,10 +27,10 @@ func ExportedMethods(obj interface{}) []reflect.Method { return methods } - num := typ.NumMethod() - methods = make([]reflect.Method, 0, num) - for i := 0; i < num; i++ { - method := typ.Method(i) + all := AllMethods(typ) + methods = make([]reflect.Method, 0, len(all)) + for i := range all { + method := all[i] if !ast.IsExported(method.Name) { continue } @@ -44,3 +44,38 @@ func ExportedMethods(obj interface{}) []reflect.Method { return methods } + +var allMethodsCache = struct { + sync.RWMutex + methods map[reflect.Type][]reflect.Method +}{ + methods: make(map[reflect.Type][]reflect.Method), +} + +func AllMethods(obj interface{}) []reflect.Method { + typ, ok := obj.(reflect.Type) + if !ok { + typ = reflect.TypeOf(obj) + } + + allMethodsCache.RLock() + methods, ok := allMethodsCache.methods[typ] + allMethodsCache.RUnlock() + + if ok { + return methods + } + + num := typ.NumMethod() + methods = make([]reflect.Method, 0, num) + for i := 0; i < num; i++ { + method := typ.Method(i) + methods = append(methods, method) + } + + allMethodsCache.Lock() + allMethodsCache.methods[typ] = methods + allMethodsCache.Unlock() + + return methods +} diff --git a/venus-shared/typeutil/methods_test.go b/venus-shared/typeutil/methods_test.go index faf27e7bea..b1b4e1e328 100644 --- a/venus-shared/typeutil/methods_test.go +++ b/venus-shared/typeutil/methods_test.go @@ -13,10 +13,27 @@ func TestExportedMethods(t *testing.T) { meths := ExportedMethods(reflect.TypeOf((*io.ReadCloser)(nil)).Elem()) require.Len(t, meths, 2, "exported methods for io.ReadCloser") + type I interface { + Public() + private() + } + + meths = AllMethods(reflect.TypeOf((*I)(nil)).Elem()) + require.Len(t, meths, 2, "all methods for I") + + meths = ExportedMethods(reflect.TypeOf((*I)(nil)).Elem()) + require.Len(t, meths, 1, "exported methods for I") + var ci codecInt meths = ExportedMethods(&ci) require.Len(t, meths, 8, "exported methods for *codecInt") meths = ExportedMethods(ci) require.Len(t, meths, 4, "exported methods for codecInt") + + meths = AllMethods(&ci) + require.Len(t, meths, 8, "all methods for *codecInt") + + meths = AllMethods(ci) + require.Len(t, meths, 4, "all methods for codecInt") } diff --git a/venus-shared/typeutil/similar.go b/venus-shared/typeutil/similar.go index e40384bed3..e2a30135e4 100644 --- a/venus-shared/typeutil/similar.go +++ b/venus-shared/typeutil/similar.go @@ -4,25 +4,12 @@ import ( "encoding" "encoding/json" "fmt" - "math/bits" "reflect" "sync" "github.com/filecoin-project/go-state-types/cbor" ) -func init() { - if zeroes := bits.TrailingZeros(uint(CodecMaxLimit)); zeroes != len(codecs) { - panic(fmt.Errorf("codec count not match, %d != %d", zeroes, len(codecs))) - } - - for ci := range codecs { - if zeroes := bits.TrailingZeros(uint(codecs[ci].flag)); zeroes != ci { - panic(fmt.Errorf("#%d codec's flag is not matched", ci)) - } - } -} - type CodecFlag uint //go:generate go run golang.org/x/tools/cmd/stringer -type=CodecFlag -trimprefix=Codec @@ -31,7 +18,7 @@ const ( CodecText CodecJSON CodecCbor - CodecMaxLimit + _codecLimit ) type SimilarMode uint @@ -39,6 +26,8 @@ type SimilarMode uint const ( StructFieldsOrdered SimilarMode = 1 << iota StructFieldTagsMatch + InterfaceAllMethods + AvoidRecursive ) var ( @@ -89,7 +78,9 @@ var similarCache = struct { results: make(map[similarInput]similarResult), } -func Similar(a, b interface{}, codecFlag CodecFlag, smode SimilarMode) (bool, *Reason) { +type SimilarStack = [2]reflect.Type + +func Similar(a, b interface{}, codecFlag CodecFlag, smode SimilarMode, stack ...SimilarStack) (bool, *Reason) { atyp, ok := a.(reflect.Type) if !ok { atyp = reflect.TypeOf(a) @@ -123,13 +114,23 @@ func Similar(a, b interface{}, codecFlag CodecFlag, smode SimilarMode) (bool, *R return res.similar, res.reason } - var yes bool - var reason *Reason - reasonf := makeReasonf(atyp, btyp) - reasonWrap := makeReasonWrap(atyp, btyp) + // recursive + for si := range stack { + // we assumpt that they are similar + // but we won't cache the result + if (stack[si][0] == atyp && stack[si][1] == btyp) || (stack[si][1] == atyp && stack[si][0] == btyp) { + return smode&AvoidRecursive == 0, reasonf("%w in the stack #%d, now in #%d", ReasonRecursiveCompare, si, len(stack)) + } + } + + stack = append(stack, [2]reflect.Type{atyp, btyp}) + + var yes bool + var reason *Reason + defer func() { similarCache.Lock() similarCache.results[sinput] = similarResult{ @@ -199,13 +200,24 @@ func Similar(a, b interface{}, codecFlag CodecFlag, smode SimilarMode) (bool, *R case reflect.String: yes = true + case reflect.Interface: + + default: + yes = atyp.ConvertibleTo(btyp) + } + + if yes { + return yes, reason + } + + switch akind { case reflect.Array: if atyp.Len() != btyp.Len() { reason = reasonf("%w: %d != %d", ReasonArrayLength, atyp.Len(), btyp.Len()) break } - elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, smode) + elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, smode, stack...) if !elemMatch { reason = reasonWrap(elemReason, ReasonArrayElement) break @@ -214,13 +226,13 @@ func Similar(a, b interface{}, codecFlag CodecFlag, smode SimilarMode) (bool, *R yes = true case reflect.Map: - keyMatch, keyReason := Similar(atyp.Key(), btyp.Key(), codecFlag, smode) + keyMatch, keyReason := Similar(atyp.Key(), btyp.Key(), codecFlag, smode, stack...) if !keyMatch { reason = reasonWrap(keyReason, ReasonMapKey) break } - valueMatch, valueReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, smode) + valueMatch, valueReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, smode, stack...) if !valueMatch { reason = reasonWrap(valueReason, ReasonMapValue) break @@ -229,7 +241,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, smode SimilarMode) (bool, *R yes = true case reflect.Ptr: - elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, smode) + elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, smode, stack...) if !elemMatch { reason = reasonWrap(elemReason, ReasonPtrElememnt) break @@ -238,7 +250,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, smode SimilarMode) (bool, *R yes = true case reflect.Slice: - elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, smode) + elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, smode, stack...) if !elemMatch { reason = reasonWrap(elemReason, ReasonSliceElement) break @@ -247,7 +259,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, smode SimilarMode) (bool, *R yes = true case reflect.Struct: - fieldsMatch, fieldsReason := fieldsSimilar(atyp, btyp, codecFlag, smode) + fieldsMatch, fieldsReason := fieldsSimilar(atyp, btyp, codecFlag, smode, stack...) if !fieldsMatch { reason = reasonWrap(fieldsReason, ReasonStructField) break @@ -256,7 +268,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, smode SimilarMode) (bool, *R yes = true case reflect.Interface: - methsMatch, methsReason := methodsSimilar(atyp, btyp, codecFlag, smode) + methsMatch, methsReason := methodsSimilar(atyp, btyp, codecFlag, smode, stack...) if !methsMatch { reason = reasonWrap(methsReason, ReasonInterfaceMethod) break @@ -272,7 +284,7 @@ func Similar(a, b interface{}, codecFlag CodecFlag, smode SimilarMode) (bool, *R break } - elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, smode) + elemMatch, elemReason := Similar(atyp.Elem(), btyp.Elem(), codecFlag, smode, stack...) if !elemMatch { reason = reasonWrap(elemReason, ReasonChanElement) break @@ -281,14 +293,14 @@ func Similar(a, b interface{}, codecFlag CodecFlag, smode SimilarMode) (bool, *R yes = true case reflect.Func: - yes, reason = funcSimilar(atyp, btyp, codecFlag, smode) + yes, reason = funcSimilar(atyp, btyp, codecFlag, smode, stack...) } return yes, reason } -func funcSimilar(atyp, btyp reflect.Type, codecFlag CodecFlag, ordered SimilarMode) (bool, *Reason) { +func funcSimilar(atyp, btyp reflect.Type, codecFlag CodecFlag, smode SimilarMode, stack ...SimilarStack) (bool, *Reason) { reasonf := makeReasonf(atyp, btyp) reasonWrap := makeReasonWrap(atyp, btyp) @@ -305,14 +317,14 @@ func funcSimilar(atyp, btyp reflect.Type, codecFlag CodecFlag, ordered SimilarMo } for i := 0; i < aNumIn; i++ { - inMatch, inReason := Similar(atyp.In(i), btyp.In(i), codecFlag, ordered) + inMatch, inReason := Similar(atyp.In(i), btyp.In(i), codecFlag, smode, stack...) if !inMatch { return false, reasonWrap(inReason, fmt.Errorf("%w: #%d input", ReasonFuncInType, i)) } } for i := 0; i < aNumOut; i++ { - outMatch, outReason := Similar(atyp.Out(i), btyp.Out(i), codecFlag, ordered) + outMatch, outReason := Similar(atyp.Out(i), btyp.Out(i), codecFlag, smode, stack...) if !outMatch { return false, reasonWrap(outReason, fmt.Errorf("%w: #%d input", ReasonFuncOutType, i)) } @@ -321,7 +333,7 @@ func funcSimilar(atyp, btyp reflect.Type, codecFlag CodecFlag, ordered SimilarMo return true, nil } -func fieldsSimilar(a, b reflect.Type, codecFlag CodecFlag, smode SimilarMode) (bool, *Reason) { +func fieldsSimilar(a, b reflect.Type, codecFlag CodecFlag, smode SimilarMode, stack ...SimilarStack) (bool, *Reason) { reasonf := makeReasonf(a, b) reasonWrap := makeReasonWrap(a, b) @@ -342,7 +354,7 @@ func fieldsSimilar(a, b reflect.Type, codecFlag CodecFlag, smode SimilarMode) (b return false, reasonf("%w: #%d field, %s != %s", ReasonExportedFieldTag, i, afields[i].Tag, bfields[i].Tag) } - yes, reason := Similar(afields[i].Type, bfields[i].Type, codecFlag, smode) + yes, reason := Similar(afields[i].Type, bfields[i].Type, codecFlag, smode, stack...) if !yes { return false, reasonWrap(reason, fmt.Errorf("%w: #%d field named %s", ReasonExportedFieldType, i, afields[i].Name)) } @@ -367,7 +379,7 @@ func fieldsSimilar(a, b reflect.Type, codecFlag CodecFlag, smode SimilarMode) (b return false, reasonf("%w: named field %s, %s != %s", ReasonExportedFieldTag, f.Name, af.Tag, f.Tag) } - yes, reason := Similar(af.Type, f.Type, codecFlag, smode) + yes, reason := Similar(af.Type, f.Type, codecFlag, smode, stack...) if !yes { return false, reasonWrap(reason, fmt.Errorf("%w: named %s", ReasonExportedFieldType, f.Name)) } @@ -376,12 +388,16 @@ func fieldsSimilar(a, b reflect.Type, codecFlag CodecFlag, smode SimilarMode) (b return true, nil } -func methodsSimilar(a, b reflect.Type, codecFlag CodecFlag, smode SimilarMode) (bool, *Reason) { +func methodsSimilar(a, b reflect.Type, codecFlag CodecFlag, smode SimilarMode, stack ...SimilarStack) (bool, *Reason) { reasonf := makeReasonf(a, b) reasonWrap := makeReasonWrap(a, b) ameths := ExportedMethods(a) bmeths := ExportedMethods(b) + if smode&InterfaceAllMethods != 0 { + ameths = AllMethods(a) + bmeths = AllMethods(b) + } if len(ameths) != len(bmeths) { return false, reasonf("%w: %d != %d", ReasonExportedMethodsCount, len(ameths), len(bmeths)) @@ -392,7 +408,7 @@ func methodsSimilar(a, b reflect.Type, codecFlag CodecFlag, smode SimilarMode) ( return false, reasonf("%w: #%d method, %s != %s ", ReasonExportedMethodName, i, ameths[i].Name, bmeths[i].Name) } - yes, reason := Similar(ameths[i].Type, bmeths[i].Type, codecFlag, smode) + yes, reason := Similar(ameths[i].Type, bmeths[i].Type, codecFlag, smode, stack...) if !yes { return false, reasonWrap(reason, fmt.Errorf("%w: #%d method named %s", ReasonExportedMethodType, i, ameths[i].Name)) } diff --git a/venus-shared/typeutil/similar_reason.go b/venus-shared/typeutil/similar_reason.go index 6d15417148..45e63820a6 100644 --- a/venus-shared/typeutil/similar_reason.go +++ b/venus-shared/typeutil/similar_reason.go @@ -81,4 +81,5 @@ var ( ReasonExportedMethodsCount = fmt.Errorf("exported methods count") // nolint ReasonExportedMethodName = fmt.Errorf("exported method name") // nolint ReasonExportedMethodType = fmt.Errorf("exported method type") // nolint + ReasonRecursiveCompare = fmt.Errorf("recursive compare") // nolint ) diff --git a/venus-shared/typeutil/similar_test.go b/venus-shared/typeutil/similar_test.go index 8f9d4b6364..84de1348a5 100644 --- a/venus-shared/typeutil/similar_test.go +++ b/venus-shared/typeutil/similar_test.go @@ -4,6 +4,7 @@ import ( "context" "errors" "io" + "math/bits" "reflect" "testing" "unsafe" @@ -11,6 +12,16 @@ import ( "github.com/stretchr/testify/require" ) +func TestCodecList(t *testing.T) { + zeroes := bits.TrailingZeros(uint(_codecLimit)) + require.Equalf(t, zeroes, len(codecs), "codec count not match, %d != %d", zeroes, len(codecs)) + + for ci := range codecs { + czeroes := bits.TrailingZeros(uint(codecs[ci].flag)) + require.Equalf(t, czeroes, ci, "#%d codec's flag is not matched", ci) + } +} + type ABool bool type AInt int type AInt8 int8 @@ -374,6 +385,11 @@ func TestStruct(t *testing.T) { smode: StructFieldsOrdered, reasons: []error{ReasonStructField, ReasonExportedFieldType}, }, + { + val: new(case7), + smode: StructFieldTagsMatch, + reasons: []error{ReasonStructField, ReasonExportedFieldTag}, + }, { val: new(case7), smode: StructFieldsOrdered | StructFieldTagsMatch, @@ -480,6 +496,11 @@ func TestInterface(t *testing.T) { { val: new(case9), }, + { + val: new(case9), + smode: InterfaceAllMethods, + reasons: []error{ReasonExportedMethodsCount}, + }, } similarTest(t, new(origin), cases, true) @@ -591,3 +612,67 @@ func TestCodec(t *testing.T) { similarTest(t, new(halfCodecInt), cases, false) } + +func TestConvertible(t *testing.T) { + type origin struct { + A uint + B int + } + + type another origin + + yes, reason := Similar(new(origin), new(another), 0, 0) + require.Truef(t, yes, "convertible types, got reason: %s", reason) + + type ra = io.ReadCloser + type rb = io.Reader + rta := reflect.TypeOf(new(ra)).Elem() + rtb := reflect.TypeOf(new(rb)).Elem() + require.True(t, rta.ConvertibleTo(rtb)) + + yes, reason = Similar(rta, rtb, 0, 0) + require.False(t, yes, "convertible interface may not be similar") + require.True(t, errors.Is(reason, ReasonExportedMethodsCount)) +} + +func TestRecursive(t *testing.T) { + type origin struct { + A uint + B int + Sub []origin + } + + type case1 struct { + A uint + B int + Sub []case1 + } + + type case2 struct { + A uint + B int + Sub []origin + } + + cases := []similarCase{ + { + val: new(case1), + smode: 0, + }, + { + val: new(case1), + smode: AvoidRecursive, + reasons: []error{ReasonRecursiveCompare}, + }, + { + val: new(case2), + smode: 0, + }, + { + val: new(case2), + smode: AvoidRecursive, + }, + } + + similarTest(t, new(origin), cases, false) +} From af98f3cb848dbd3201ce03f9bdff72a338ea3de4 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Mon, 20 Dec 2021 10:01:47 +0800 Subject: [PATCH 073/167] Feat/fix api permission (#4626) * fix api permission * fix v0 api permission * CI integration API permission validation * add v0 api and fix permission --- .circleci/config.yml | 19 + Makefile | 39 ++ Makefile.bak | 33 -- app/client/apiface/blockservice.go | 5 +- app/client/apiface/blockstore.go | 2 +- app/client/apiface/chain.go | 2 +- app/client/apiface/config.go | 2 +- app/client/apiface/jwtauth.go | 3 +- app/client/apiface/mining.go | 3 +- app/client/apiface/mpool.go | 22 +- app/client/apiface/multisig.go | 24 +- app/client/apiface/network.go | 1 + app/client/apiface/paych.go | 25 +- app/client/apiface/syncer.go | 7 +- app/client/apiface/v0api/blockservice.go | 20 + app/client/apiface/v0api/blockstore.go | 20 + app/client/apiface/v0api/chain.go | 100 +++- app/client/apiface/v0api/config.go | 10 + app/client/apiface/v0api/discovery.go | 4 + app/client/apiface/v0api/fullnode.go | 31 ++ app/client/apiface/v0api/jwtauth.go | 14 + app/client/apiface/v0api/market.go | 13 + app/client/apiface/v0api/mining.go | 17 + app/client/apiface/v0api/mpool.go | 58 ++ app/client/apiface/v0api/multisig.go | 24 +- app/client/apiface/v0api/network.go | 36 ++ app/client/apiface/v0api/paych.go | 102 ++++ app/client/apiface/v0api/syncer.go | 29 + app/client/apiface/v0api/wallet.go | 44 ++ app/client/apiface/wallet.go | 2 +- app/client/full.go | 95 ++-- app/client/v0api/full.go | 171 +++--- app/node/env.go | 1 + .../blockstore/blockstore_submodule.go | 4 +- app/submodule/config/config.go | 6 +- .../dagservice/blockservice_submoodule.go | 4 +- .../discovery/discovery_submodule.go | 6 +- app/submodule/market/market_submodule.go | 3 +- app/submodule/mining/mining_submodule.go | 3 +- app/submodule/mpool/mpool_submodule.go | 19 +- app/submodule/network/network_submodule.go | 9 +- app/submodule/paych/paych_submodule.go | 4 +- app/submodule/syncer/syncer_submodule.go | 10 +- app/submodule/wallet/wallet_submodule.go | 4 +- build/main.go | 10 + scripts/check_api_file_change.sh | 25 + tools/gen/api/proxygen.go | 390 +++++++++---- tools/gen/api/stable_method_info.json | 527 ++++++++++++++++++ venus-shared/api/chain/{v1 => }/types.go | 2 +- venus-shared/api/chain/v0/blockstore.go | 20 + venus-shared/api/chain/v0/chain.go | 180 ++++++ venus-shared/api/chain/v0/discovery.go | 4 + venus-shared/api/chain/v0/fullnode.go | 29 + venus-shared/api/chain/v0/jwtauth.go | 14 + venus-shared/api/chain/v0/market.go | 13 + venus-shared/api/chain/v0/mining.go | 18 + venus-shared/api/chain/v0/mpool.go | 60 ++ venus-shared/api/chain/v0/multisig.go | 44 ++ venus-shared/api/chain/v0/network.go | 36 ++ venus-shared/api/chain/v0/paych.go | 99 ++++ venus-shared/api/chain/v0/syncer.go | 31 ++ venus-shared/api/chain/v0/wallet.go | 45 ++ venus-shared/api/chain/v1/blockstore.go | 6 +- venus-shared/api/chain/v1/chain.go | 39 +- venus-shared/api/chain/v1/market.go | 4 +- venus-shared/api/chain/v1/mining.go | 8 +- venus-shared/api/chain/v1/mpool.go | 31 +- venus-shared/api/chain/v1/multisig.go | 24 +- venus-shared/api/chain/v1/network.go | 3 +- venus-shared/api/chain/v1/paych.go | 33 +- venus-shared/api/chain/v1/syncer.go | 13 +- 71 files changed, 2317 insertions(+), 441 deletions(-) delete mode 100644 Makefile.bak create mode 100644 app/client/apiface/v0api/blockservice.go create mode 100644 app/client/apiface/v0api/blockstore.go create mode 100644 app/client/apiface/v0api/config.go create mode 100644 app/client/apiface/v0api/discovery.go create mode 100644 app/client/apiface/v0api/fullnode.go create mode 100644 app/client/apiface/v0api/jwtauth.go create mode 100644 app/client/apiface/v0api/market.go create mode 100644 app/client/apiface/v0api/mining.go create mode 100644 app/client/apiface/v0api/mpool.go create mode 100644 app/client/apiface/v0api/network.go create mode 100644 app/client/apiface/v0api/paych.go create mode 100644 app/client/apiface/v0api/syncer.go create mode 100644 app/client/apiface/v0api/wallet.go create mode 100644 scripts/check_api_file_change.sh create mode 100644 tools/gen/api/stable_method_info.json rename venus-shared/api/chain/{v1 => }/types.go (99%) create mode 100644 venus-shared/api/chain/v0/blockstore.go create mode 100644 venus-shared/api/chain/v0/chain.go create mode 100644 venus-shared/api/chain/v0/discovery.go create mode 100644 venus-shared/api/chain/v0/fullnode.go create mode 100644 venus-shared/api/chain/v0/jwtauth.go create mode 100644 venus-shared/api/chain/v0/market.go create mode 100644 venus-shared/api/chain/v0/mining.go create mode 100644 venus-shared/api/chain/v0/mpool.go create mode 100644 venus-shared/api/chain/v0/multisig.go create mode 100644 venus-shared/api/chain/v0/network.go create mode 100644 venus-shared/api/chain/v0/paych.go create mode 100644 venus-shared/api/chain/v0/syncer.go create mode 100644 venus-shared/api/chain/v0/wallet.go diff --git a/.circleci/config.yml b/.circleci/config.yml index b4d405241c..7abb84fbd3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -184,6 +184,7 @@ jobs: fingerprints: - "1e:73:c5:15:75:e0:e4:98:54:3c:2b:9e:e8:94:14:2e" - checkout + - clone_lotus - update_submodules # Save the Git SHA of the rust-fil-proofs submodule so that we can use it when creating a cache key - generate_rust_submodules_checksums @@ -199,6 +200,9 @@ jobs: cmd: "lint" - go_build: cmd: "build" + - go_build: + cmd: "gen-api" + - check_file_change # place the filecoin binary in PATH for IPTB - go_build: cmd: "install" @@ -749,6 +753,21 @@ commands: name: fetch all tags command: | git fetch --all + clone_lotus: + steps: + - run: + name: Clone lotus + command: | + mkdir -p ${GOPATH}/pkg/mod/github.com/filecoin-project + cd ${GOPATH}/pkg/mod/github.com/filecoin-project + git clone -b v1.12.0 https://github.com/filecoin-project/lotus.git + check_file_change: + steps: + - run: + name: Check api file change + command: | + cd /go/src/github.com/filecoin-project/venus + bash ./scripts/check_api_file_change.sh go_build: parameters: cmd: diff --git a/Makefile b/Makefile index 23f49b9406..f1e43db53b 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,42 @@ +export CGO_CFLAGS_ALLOW=-D__BLST_PORTABLE__ +export CGO_CFLAGS=-D__BLST_PORTABLE__ + +all: + go run ./build/*.go build + +deps: + git submodule update --init + go run ./build/*.go smartdeps + +lint: + go run ./build/*.go lint + +test: + go run ./build/*.go test -timeout=30m + +# WARNING THIS BUILDS A GO PLUGIN AND PLUGINS *DO NOT* WORK ON WINDOWS SYSTEMS +iptb: + make -C tools/iptb-plugins all + +clean: + rm ./venus + + rm -rf ./extern/filecoin-ffi + rm -rf ./extern/test-vectors + +gen-api: + go run ./tools/gen/api/proxygen.go + gofmt -s -l -w ./app/client/full.go + gofmt -s -l -w ./app/client/v0api/full.go + +compare-api: + go run ./tools/gen/api/proxygen.go compare + +gen-asset: + go-bindata -pkg=asset -o ./fixtures/asset/asset.go ./fixtures/_assets/car/ ./fixtures/_assets/proof-params/ ./fixtures/_assets/arch-diagram.monopic + + +### shared module ### cborgen: cd venus-devtool && go run ./cborgen/*.go diff --git a/Makefile.bak b/Makefile.bak deleted file mode 100644 index 87b322d2fc..0000000000 --- a/Makefile.bak +++ /dev/null @@ -1,33 +0,0 @@ -export CGO_CFLAGS_ALLOW=-D__BLST_PORTABLE__ -export CGO_CFLAGS=-D__BLST_PORTABLE__ - -all: - go run ./build/*.go build - -deps: - git submodule update --init - go run ./build/*.go smartdeps - -lint: - go run ./build/*.go lint - -test: - go run ./build/*.go test -timeout=30m - -# WARNING THIS BUILDS A GO PLUGIN AND PLUGINS *DO NOT* WORK ON WINDOWS SYSTEMS -iptb: - make -C tools/iptb-plugins all - -clean: - rm ./venus - - rm -rf ./extern/filecoin-ffi - rm -rf ./extern/test-vectors - -gen: - go run ./tools/gen/api/proxygen.go - gofmt -s -l -w ./app/client/full.go - goimports -l -w ./app/client/full.go - -gen-asset: - go-bindata -pkg=asset -o ./fixtures/asset/asset.go ./fixtures/_assets/car/ ./fixtures/_assets/proof-params/ ./fixtures/_assets/arch-diagram.monopic diff --git a/app/client/apiface/blockservice.go b/app/client/apiface/blockservice.go index 628d5ab78b..63f25ffcd3 100644 --- a/app/client/apiface/blockservice.go +++ b/app/client/apiface/blockservice.go @@ -2,9 +2,10 @@ package apiface import ( "context" + "io" + "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" - "io" ) type IDagService interface { @@ -14,6 +15,6 @@ type IDagService interface { DAGGetFileSize(ctx context.Context, c cid.Cid) (uint64, error) // Rule[perm:read] DAGCat(ctx context.Context, c cid.Cid) (io.Reader, error) - // Rule[perm:read] + // Rule[perm:write] DAGImportData(ctx context.Context, data io.Reader) (ipld.Node, error) } diff --git a/app/client/apiface/blockstore.go b/app/client/apiface/blockstore.go index 3252fd303c..73de91ca65 100644 --- a/app/client/apiface/blockstore.go +++ b/app/client/apiface/blockstore.go @@ -11,7 +11,7 @@ import ( type IBlockStore interface { // Rule[perm:read] ChainReadObj(ctx context.Context, ocid cid.Cid) ([]byte, error) - // Rule[perm:read] + // Rule[perm:admin] ChainDeleteObj(ctx context.Context, obj cid.Cid) error // Rule[perm:read] ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) diff --git a/app/client/apiface/chain.go b/app/client/apiface/chain.go index 0b87a6c58e..98b753d70e 100644 --- a/app/client/apiface/chain.go +++ b/app/client/apiface/chain.go @@ -51,7 +51,7 @@ type IChainInfo interface { ChainList(ctx context.Context, tsKey types.TipSetKey, count int) ([]types.TipSetKey, error) // Rule[perm:read] ChainHead(ctx context.Context) (*types.TipSet, error) - // Rule[perm:read] + // Rule[perm:admin] ChainSetHead(ctx context.Context, key types.TipSetKey) error // Rule[perm:read] ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) diff --git a/app/client/apiface/config.go b/app/client/apiface/config.go index 323ce38ba3..ccf748d36d 100644 --- a/app/client/apiface/config.go +++ b/app/client/apiface/config.go @@ -3,7 +3,7 @@ package apiface import "context" type IConfig interface { - // Rule[perm:read] + // Rule[perm:admin] ConfigSet(ctx context.Context, dottedPath string, paramJSON string) error // Rule[perm:read] ConfigGet(ctx context.Context, dottedPath string) (interface{}, error) diff --git a/app/client/apiface/jwtauth.go b/app/client/apiface/jwtauth.go index 705864d690..fc5210c943 100644 --- a/app/client/apiface/jwtauth.go +++ b/app/client/apiface/jwtauth.go @@ -2,12 +2,13 @@ package apiface import ( "context" + "github.com/filecoin-project/go-jsonrpc/auth" ) type IJwtAuthAPI interface { // Rule[perm:read] Verify(ctx context.Context, host, token string) ([]auth.Permission, error) - // Rule[perm:read] + // Rule[perm:admin] AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) } diff --git a/app/client/apiface/mining.go b/app/client/apiface/mining.go index d2b5ae6fe2..fd62fefbc1 100644 --- a/app/client/apiface/mining.go +++ b/app/client/apiface/mining.go @@ -2,6 +2,7 @@ package apiface import ( "context" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/app/submodule/apitypes" @@ -11,6 +12,6 @@ import ( type IMining interface { // Rule[perm:read] MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*apitypes.MiningBaseInfo, error) - // Rule[perm:read] + // Rule[perm:write] MinerCreateBlock(ctx context.Context, bt *apitypes.BlockTemplate) (*types.BlockMsg, error) } diff --git a/app/client/apiface/mpool.go b/app/client/apiface/mpool.go index ecac02dab7..8ef62954dc 100644 --- a/app/client/apiface/mpool.go +++ b/app/client/apiface/mpool.go @@ -13,17 +13,17 @@ import ( ) type IMessagePool interface { - // Rule[perm:read] + // Rule[perm:admin] MpoolDeleteByAdress(ctx context.Context, addr address.Address) error - // Rule[perm:read] + // Rule[perm:write] MpoolPublishByAddr(context.Context, address.Address) error - // Rule[perm:read] + // Rule[perm:write] MpoolPublishMessage(ctx context.Context, smsg *types.SignedMessage) error - // Rule[perm:read] + // Rule[perm:write] MpoolPush(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) // Rule[perm:read] MpoolGetConfig(context.Context) (*messagepool.MpoolConfig, error) - // Rule[perm:read] + // Rule[perm:admin] MpoolSetConfig(ctx context.Context, cfg *messagepool.MpoolConfig) error // Rule[perm:read] MpoolSelect(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) @@ -31,17 +31,17 @@ type IMessagePool interface { MpoolSelects(context.Context, types.TipSetKey, []float64) ([][]*types.SignedMessage, error) // Rule[perm:read] MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*types.SignedMessage, error) - // Rule[perm:read] + // Rule[perm:write] MpoolClear(ctx context.Context, local bool) error - // Rule[perm:read] + // Rule[perm:write] MpoolPushUntrusted(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) - // Rule[perm:read] + // Rule[perm:sign] MpoolPushMessage(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec) (*types.SignedMessage, error) - // Rule[perm:read] + // Rule[perm:write] MpoolBatchPush(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) - // Rule[perm:read] + // Rule[perm:write] MpoolBatchPushUntrusted(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) - // Rule[perm:read] + // Rule[perm:sign] MpoolBatchPushMessage(ctx context.Context, msgs []*types.UnsignedMessage, spec *types.MessageSendSpec) ([]*types.SignedMessage, error) // Rule[perm:read] MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) diff --git a/app/client/apiface/multisig.go b/app/client/apiface/multisig.go index 7795b4befd..d5bd29f699 100644 --- a/app/client/apiface/multisig.go +++ b/app/client/apiface/multisig.go @@ -10,29 +10,29 @@ import ( ) type IMultiSig interface { - // Rule[perm:read] + // Rule[perm:sign] MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (*apitypes.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*apitypes.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*apitypes.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*apitypes.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*apitypes.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*apitypes.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*apitypes.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*apitypes.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*apitypes.MessagePrototype, error) // Rule[perm:read] MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) diff --git a/app/client/apiface/network.go b/app/client/apiface/network.go index db5bf753dd..e6eb3c40fd 100644 --- a/app/client/apiface/network.go +++ b/app/client/apiface/network.go @@ -2,6 +2,7 @@ package apiface import ( "context" + "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/net" diff --git a/app/client/apiface/paych.go b/app/client/apiface/paych.go index 4c44b2f16b..f064115895 100644 --- a/app/client/apiface/paych.go +++ b/app/client/apiface/paych.go @@ -2,6 +2,7 @@ package apiface import ( "context" + "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/paychmgr" @@ -18,31 +19,31 @@ type IPaychan interface { // @from: the payment channel sender // @to: the payment channel recipient // @amt: the deposits funds in the payment channel - // Rule[perm:read] + // Rule[perm:sign] PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*apitypes.ChannelInfo, error) // PaychAvailableFunds get the status of an outbound payment channel // @pch: payment channel address - // Rule[perm:read] + // Rule[perm:sign] PaychAvailableFunds(ctx context.Context, ch address.Address) (*paychmgr.ChannelAvailableFunds, error) // PaychAvailableFundsByFromTo get the status of an outbound payment channel // @from: the payment channel sender // @to: he payment channel recipient - // Rule[perm:read] + // Rule[perm:sign] PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*paychmgr.ChannelAvailableFunds, error) // PaychGetWaitReady waits until the create channel / add funds message with the sentinel // @sentinel: given message CID arrives. // @ch: the returned channel address can safely be used against the Manager methods. - // Rule[perm:read] + // Rule[perm:sign] PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (address.Address, error) // PaychAllocateLane Allocate late creates a lane within a payment channel so that calls to // CreatePaymentVoucher will automatically make vouchers only for the difference in total - // Rule[perm:read] + // Rule[perm:sign] PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) // PaychNewPayment aggregate vouchers into a new lane // @from: the payment channel sender // @to: the payment channel recipient // @vouchers: the outstanding (non-redeemed) vouchers - // Rule[perm:read] + // Rule[perm:sign] PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []apitypes.VoucherSpec) (*apitypes.PaymentInfo, error) // PaychList list the addresses of all channels that have been created // Rule[perm:read] @@ -54,13 +55,13 @@ type IPaychan interface { // PaychSettle update payment channel status to settle // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain // @pch: payment channel address - // Rule[perm:read] + // Rule[perm:sign] PaychSettle(ctx context.Context, addr address.Address) (cid.Cid, error) // PaychCollect update payment channel status to collect // Collect sends the value of submitted vouchers to the channel recipient (the provider), // and refunds the remaining channel balance to the channel creator (the client). // @pch: payment channel address - // Rule[perm:read] + // Rule[perm:sign] PaychCollect(ctx context.Context, addr address.Address) (cid.Cid, error) // PaychVoucherCheckValid checks if the given voucher is valid (is or could become spendable at some point). @@ -78,7 +79,7 @@ type IPaychan interface { // PaychVoucherAdd adds a voucher for an inbound channel. // If the channel is not in the store, fetches the channel from state (and checks that // the channel To address is owned by the wallet). - // Rule[perm:read] + // Rule[perm:write] PaychVoucherAdd(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) // PaychVoucherCreate creates a new signed voucher on the given payment channel // with the given lane and amount. The value passed in is exactly the value @@ -87,15 +88,15 @@ type IPaychan interface { // the two. // If there are insufficient funds in the channel to create the voucher, // returns a nil voucher and the shortfall. - // Rule[perm:read] + // Rule[perm:sign] PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paychmgr.VoucherCreateResult, error) // PaychVoucherList list vouchers in payment channel // @pch: payment channel address - // Rule[perm:read] + // Rule[perm:write] PaychVoucherList(ctx context.Context, pch address.Address) ([]*paych.SignedVoucher, error) // PaychVoucherSubmit Submit voucher to chain to update payment channel state // @pch: payment channel address // @sv: voucher in payment channel - // Rule[perm:read] + // Rule[perm:sign] PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) } diff --git a/app/client/apiface/syncer.go b/app/client/apiface/syncer.go index 43fe60229e..fd109ee521 100644 --- a/app/client/apiface/syncer.go +++ b/app/client/apiface/syncer.go @@ -2,6 +2,7 @@ package apiface import ( "context" + "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/venus/app/submodule/apitypes" syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" @@ -9,9 +10,9 @@ import ( ) type ISyncer interface { - // Rule[perm:read] + // Rule[perm:write] ChainSyncHandleNewTipSet(ctx context.Context, ci *types.ChainInfo) error - // Rule[perm:read] + // Rule[perm:admin] SetConcurrent(ctx context.Context, concurrent int64) error // Rule[perm:read] SyncerTracker(ctx context.Context) *syncTypes.TargetTracker @@ -19,7 +20,7 @@ type ISyncer interface { Concurrent(ctx context.Context) int64 // Rule[perm:read] ChainTipSetWeight(ctx context.Context, tsk types.TipSetKey) (big.Int, error) - // Rule[perm:read] + // Rule[perm:write] SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error // Rule[perm:read] StateCall(ctx context.Context, msg *types.UnsignedMessage, tsk types.TipSetKey) (*types.InvocResult, error) diff --git a/app/client/apiface/v0api/blockservice.go b/app/client/apiface/v0api/blockservice.go new file mode 100644 index 0000000000..4e00b3db93 --- /dev/null +++ b/app/client/apiface/v0api/blockservice.go @@ -0,0 +1,20 @@ +package v0api + +import ( + "context" + "io" + + "github.com/ipfs/go-cid" + ipld "github.com/ipfs/go-ipld-format" +) + +type IDagService interface { + // Rule[perm:read] + DAGGetNode(ctx context.Context, ref string) (interface{}, error) + // Rule[perm:read] + DAGGetFileSize(ctx context.Context, c cid.Cid) (uint64, error) + // Rule[perm:read] + DAGCat(ctx context.Context, c cid.Cid) (io.Reader, error) + // Rule[perm:write] + DAGImportData(ctx context.Context, data io.Reader) (ipld.Node, error) +} diff --git a/app/client/apiface/v0api/blockstore.go b/app/client/apiface/v0api/blockstore.go new file mode 100644 index 0000000000..aa9c77a809 --- /dev/null +++ b/app/client/apiface/v0api/blockstore.go @@ -0,0 +1,20 @@ +package v0api + +import ( + "context" + + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/app/submodule/apitypes" +) + +type IBlockStore interface { + // Rule[perm:read] + ChainReadObj(ctx context.Context, ocid cid.Cid) ([]byte, error) + // Rule[perm:admin] + ChainDeleteObj(ctx context.Context, obj cid.Cid) error + // Rule[perm:read] + ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) + // Rule[perm:read] + ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (apitypes.ObjStat, error) +} diff --git a/app/client/apiface/v0api/chain.go b/app/client/apiface/v0api/chain.go index 79e91b6d75..e7c83613fb 100644 --- a/app/client/apiface/v0api/chain.go +++ b/app/client/apiface/v0api/chain.go @@ -5,20 +5,45 @@ import ( "time" "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" + "github.com/filecoin-project/go-state-types/big" acrypto "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" "github.com/ipfs/go-cid" ) type IChain interface { + IAccount + IActor + IBeacon + IMinerState IChainInfo } +type IAccount interface { + // Rule[perm:read] + StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) +} + +type IActor interface { + // Rule[perm:read] + StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) + // Rule[perm:read] + ListActor(ctx context.Context) (map[address.Address]*types.Actor, error) +} + +type IBeacon interface { + // Rule[perm:read] + BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) +} + type IChainInfo interface { // Rule[perm:read] BlockTime(ctx context.Context) time.Duration @@ -26,7 +51,7 @@ type IChainInfo interface { ChainList(ctx context.Context, tsKey types.TipSetKey, count int) ([]types.TipSetKey, error) // Rule[perm:read] ChainHead(ctx context.Context) (*types.TipSet, error) - // Rule[perm:read] + // Rule[perm:admin] ChainSetHead(ctx context.Context, key types.TipSetKey) error // Rule[perm:read] ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) @@ -43,11 +68,17 @@ type IChainInfo interface { // Rule[perm:read] ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*apitypes.BlockMessages, error) // Rule[perm:read] + ChainGetMessagesInTipset(ctx context.Context, key types.TipSetKey) ([]apitypes.Message, error) + // Rule[perm:read] ChainGetReceipts(ctx context.Context, id cid.Cid) ([]types.MessageReceipt, error) // Rule[perm:read] ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]apitypes.Message, error) // Rule[perm:read] ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) + //Rule[perm:read] + StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) + // Rule[perm:read] + StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) // Rule[perm:read] ChainNotify(ctx context.Context) <-chan []*chain.HeadChange // Rule[perm:read] @@ -81,9 +112,70 @@ type IChainInfo interface { // Rule[perm:read] VerifyEntry(parent, child *types.BeaconEntry, height abi.ChainEpoch) bool // Rule[perm:read] - ChainExport(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) + ChainExport(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []byte, error) // Rule[perm:read] - StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) + ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*chain.HeadChange, error) +} + +type IMinerState interface { // Rule[perm:read] - StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) + StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) + // Rule[perm:read] + StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) + // Rule[perm:read] + StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) + // Rule[perm:read] + StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorLocation, error) + // Rule[perm:read] + StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (abi.SectorSize, error) + // Rule[perm:read] + StateMinerInfo(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) + // Rule[perm:read] + StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (address.Address, error) + // Rule[perm:read] + StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) + // Rule[perm:read] + StateMinerFaults(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) + // Rule[perm:read] + StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) + // Rule[perm:read] + StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]apitypes.Partition, error) + // Rule[perm:read] + StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]apitypes.Deadline, error) + // Rule[perm:read] + StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) + // Rule[perm:read] + StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*apitypes.MarketDeal, error) + // Rule[perm:read] + StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) + // Rule[perm:read] + StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) + // Rule[perm:read] + StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (chain.CirculatingSupply, error) + // Rule[perm:read] + StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) + // Rule[perm:read] + StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) + // Rule[perm:read] + StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) + // Rule[perm:read] + StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) + // Rule[perm:read] + StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) + // Rule[perm:read] + StateListActors(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) + // Rule[perm:read] + StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*apitypes.MinerPower, error) + // Rule[perm:read] + StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) + // Rule[perm:read] + StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorExpiration, error) + // Rule[perm:read] + StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (apitypes.MinerSectors, error) + // Rule[perm:read] + StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (apitypes.MarketBalance, error) + // Rule[perm:read] + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (apitypes.DealCollateralBounds, error) + // Rule[perm:read] + StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) } diff --git a/app/client/apiface/v0api/config.go b/app/client/apiface/v0api/config.go new file mode 100644 index 0000000000..576b3cc7cf --- /dev/null +++ b/app/client/apiface/v0api/config.go @@ -0,0 +1,10 @@ +package v0api + +import "context" + +type IConfig interface { + // Rule[perm:admin] + ConfigSet(ctx context.Context, dottedPath string, paramJSON string) error + // Rule[perm:read] + ConfigGet(ctx context.Context, dottedPath string) (interface{}, error) +} diff --git a/app/client/apiface/v0api/discovery.go b/app/client/apiface/v0api/discovery.go new file mode 100644 index 0000000000..2e92f5579e --- /dev/null +++ b/app/client/apiface/v0api/discovery.go @@ -0,0 +1,4 @@ +package v0api + +type IDiscovery interface { +} diff --git a/app/client/apiface/v0api/fullnode.go b/app/client/apiface/v0api/fullnode.go new file mode 100644 index 0000000000..3395b64e41 --- /dev/null +++ b/app/client/apiface/v0api/fullnode.go @@ -0,0 +1,31 @@ +/* +in api interface, you can add comment tags to the function +Note: +Rule[perm:admin,ignore:true] +perm: read,write,sign,admin +jwt token permission check +ignore: bool +the func in the api whether needs to be added to the client for external exposure + +TODO: +1. Support global FUNC injection + +*/ +package v0api + +type FullNode interface { + IDagService + IBlockStore + IChain + IConfig + IDiscovery + IMarket + IMining + IMessagePool + IMultiSig + INetwork + IPaychan + ISyncer + IWallet + IJwtAuthAPI +} diff --git a/app/client/apiface/v0api/jwtauth.go b/app/client/apiface/v0api/jwtauth.go new file mode 100644 index 0000000000..6c52109f92 --- /dev/null +++ b/app/client/apiface/v0api/jwtauth.go @@ -0,0 +1,14 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/go-jsonrpc/auth" +) + +type IJwtAuthAPI interface { + // Rule[perm:read] + Verify(ctx context.Context, host, token string) ([]auth.Permission, error) + // Rule[perm:admin] + AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) +} diff --git a/app/client/apiface/v0api/market.go b/app/client/apiface/v0api/market.go new file mode 100644 index 0000000000..cc107ec916 --- /dev/null +++ b/app/client/apiface/v0api/market.go @@ -0,0 +1,13 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/venus/app/submodule/apitypes" + "github.com/filecoin-project/venus/pkg/types" +) + +type IMarket interface { + // Rule[perm:read] + StateMarketParticipants(ctx context.Context, tsk types.TipSetKey) (map[string]apitypes.MarketBalance, error) //perm:admin +} diff --git a/app/client/apiface/v0api/mining.go b/app/client/apiface/v0api/mining.go new file mode 100644 index 0000000000..ccca2ed78b --- /dev/null +++ b/app/client/apiface/v0api/mining.go @@ -0,0 +1,17 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/venus/app/submodule/apitypes" + "github.com/filecoin-project/venus/pkg/types" +) + +type IMining interface { + // Rule[perm:read] + MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*apitypes.MiningBaseInfo, error) + // Rule[perm:write] + MinerCreateBlock(ctx context.Context, bt *apitypes.BlockTemplate) (*types.BlockMsg, error) +} diff --git a/app/client/apiface/v0api/mpool.go b/app/client/apiface/v0api/mpool.go new file mode 100644 index 0000000000..834b1812d8 --- /dev/null +++ b/app/client/apiface/v0api/mpool.go @@ -0,0 +1,58 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/pkg/messagepool" + "github.com/filecoin-project/venus/pkg/types" + "github.com/ipfs/go-cid" +) + +type IMessagePool interface { + // Rule[perm:admin] + MpoolDeleteByAdress(ctx context.Context, addr address.Address) error + // Rule[perm:write] + MpoolPublishByAddr(context.Context, address.Address) error + // Rule[perm:write] + MpoolPublishMessage(ctx context.Context, smsg *types.SignedMessage) error + // Rule[perm:write] + MpoolPush(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) + // Rule[perm:read] + MpoolGetConfig(context.Context) (*messagepool.MpoolConfig, error) + // Rule[perm:admin] + MpoolSetConfig(ctx context.Context, cfg *messagepool.MpoolConfig) error + // Rule[perm:read] + MpoolSelect(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) + // Rule[perm:read] + MpoolSelects(context.Context, types.TipSetKey, []float64) ([][]*types.SignedMessage, error) + // Rule[perm:read] + MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*types.SignedMessage, error) + // Rule[perm:write] + MpoolClear(ctx context.Context, local bool) error + // Rule[perm:write] + MpoolPushUntrusted(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) + // Rule[perm:sign] + MpoolPushMessage(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec) (*types.SignedMessage, error) + // Rule[perm:write] + MpoolBatchPush(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) + // Rule[perm:write] + MpoolBatchPushUntrusted(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) + // Rule[perm:sign] + MpoolBatchPushMessage(ctx context.Context, msgs []*types.UnsignedMessage, spec *types.MessageSendSpec) ([]*types.SignedMessage, error) + // Rule[perm:read] + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) + // Rule[perm:read] + MpoolSub(ctx context.Context) (<-chan messagepool.MpoolUpdate, error) + // Rule[perm:read] + GasEstimateMessageGas(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec, tsk types.TipSetKey) (*types.UnsignedMessage, error) + // Rule[perm:read] + GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) + // Rule[perm:read] + GasEstimateFeeCap(ctx context.Context, msg *types.UnsignedMessage, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) + // Rule[perm:read] + GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk types.TipSetKey) (big.Int, error) + // Rule[perm:read] + GasEstimateGasLimit(ctx context.Context, msgIn *types.UnsignedMessage, tsk types.TipSetKey) (int64, error) +} diff --git a/app/client/apiface/v0api/multisig.go b/app/client/apiface/v0api/multisig.go index f2ed15409d..0864bdab90 100644 --- a/app/client/apiface/v0api/multisig.go +++ b/app/client/apiface/v0api/multisig.go @@ -14,29 +14,29 @@ type IMultiSig interface { // MsigCreate creates a multisig wallet // It takes the following params: , , //, , - // Rule[perm:read] + // Rule[perm:sign] MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, types.BigInt, address.Address, types.BigInt) (cid.Cid, error) - // Rule[perm:read] + // Rule[perm:sign] MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) - // Rule[perm:read] + // Rule[perm:sign] MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (cid.Cid, error) - // Rule[perm:read] + // Rule[perm:sign] MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (cid.Cid, error) - // Rule[perm:read] + // Rule[perm:sign] MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (cid.Cid, error) - // Rule[perm:read] + // Rule[perm:sign] MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) - // Rule[perm:read] + // Rule[perm:sign] MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) - // Rule[perm:read] + // Rule[perm:sign] MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) - // Rule[perm:read] + // Rule[perm:sign] MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (cid.Cid, error) - // Rule[perm:read] + // Rule[perm:sign] MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) - // Rule[perm:read] + // Rule[perm:sign] MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) - // Rule[perm:read] + // Rule[perm:sign] MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (cid.Cid, error) // Rule[perm:read] MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) diff --git a/app/client/apiface/v0api/network.go b/app/client/apiface/v0api/network.go new file mode 100644 index 0000000000..749d7980d3 --- /dev/null +++ b/app/client/apiface/v0api/network.go @@ -0,0 +1,36 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/venus/app/submodule/apitypes" + + "github.com/filecoin-project/venus/pkg/net" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/metrics" + "github.com/libp2p/go-libp2p-core/peer" + ma "github.com/multiformats/go-multiaddr" +) + +type INetwork interface { + // Rule[perm:admin] + NetworkGetBandwidthStats(ctx context.Context) metrics.Stats + // Rule[perm:admin] + NetworkGetPeerAddresses(ctx context.Context) []ma.Multiaddr + // Rule[perm:admin] + NetworkGetPeerID(ctx context.Context) peer.ID + // Rule[perm:read] + NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo + // Rule[perm:admin] + NetworkGetClosestPeers(ctx context.Context, key string) (<-chan peer.ID, error) + // Rule[perm:read] + NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) + // Rule[perm:read] + NetworkConnect(ctx context.Context, addrs []string) (<-chan net.ConnectionResult, error) + // Rule[perm:read] + NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) + // Rule[perm:read] + Version(context.Context) (apitypes.Version, error) + // Rule[perm:read] + NetAddrsListen(context.Context) (peer.AddrInfo, error) +} diff --git a/app/client/apiface/v0api/paych.go b/app/client/apiface/v0api/paych.go new file mode 100644 index 0000000000..6a25683d71 --- /dev/null +++ b/app/client/apiface/v0api/paych.go @@ -0,0 +1,102 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/app/submodule/apitypes" + "github.com/filecoin-project/venus/pkg/paychmgr" + "github.com/filecoin-project/venus/pkg/types" + + "github.com/filecoin-project/specs-actors/actors/builtin/paych" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-address" +) + +type IPaychan interface { + // PaychGet creates a payment channel to a provider with a amount of FIL + // @from: the payment channel sender + // @to: the payment channel recipient + // @amt: the deposits funds in the payment channel + // Rule[perm:sign] + PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*apitypes.ChannelInfo, error) + // PaychAvailableFunds get the status of an outbound payment channel + // @pch: payment channel address + // Rule[perm:sign] + PaychAvailableFunds(ctx context.Context, ch address.Address) (*paychmgr.ChannelAvailableFunds, error) + // PaychAvailableFundsByFromTo get the status of an outbound payment channel + // @from: the payment channel sender + // @to: he payment channel recipient + // Rule[perm:sign] + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*paychmgr.ChannelAvailableFunds, error) + // PaychGetWaitReady waits until the create channel / add funds message with the sentinel + // @sentinel: given message CID arrives. + // @ch: the returned channel address can safely be used against the Manager methods. + // Rule[perm:sign] + PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (address.Address, error) + // PaychAllocateLane Allocate late creates a lane within a payment channel so that calls to + // CreatePaymentVoucher will automatically make vouchers only for the difference in total + // Rule[perm:sign] + PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) + // PaychNewPayment aggregate vouchers into a new lane + // @from: the payment channel sender + // @to: the payment channel recipient + // @vouchers: the outstanding (non-redeemed) vouchers + // Rule[perm:sign] + PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []apitypes.VoucherSpec) (*apitypes.PaymentInfo, error) + // PaychList list the addresses of all channels that have been created + // Rule[perm:read] + PaychList(ctx context.Context) ([]address.Address, error) + // PaychStatus get the payment channel status + // @pch: payment channel address + // Rule[perm:read] + PaychStatus(ctx context.Context, pch address.Address) (*types.PaychStatus, error) + // PaychSettle update payment channel status to settle + // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain + // @pch: payment channel address + // Rule[perm:sign] + PaychSettle(ctx context.Context, addr address.Address) (cid.Cid, error) + // PaychCollect update payment channel status to collect + // Collect sends the value of submitted vouchers to the channel recipient (the provider), + // and refunds the remaining channel balance to the channel creator (the client). + // @pch: payment channel address + // Rule[perm:sign] + PaychCollect(ctx context.Context, addr address.Address) (cid.Cid, error) + + // PaychVoucherCheckValid checks if the given voucher is valid (is or could become spendable at some point). + // If the channel is not in the store, fetches the channel from state (and checks that + // the channel To address is owned by the wallet). + // @pch: payment channel address + // @sv: voucher + // Rule[perm:read] + PaychVoucherCheckValid(ctx context.Context, ch address.Address, sv *paych.SignedVoucher) error + // PaychVoucherCheckSpendable checks if the given voucher is currently spendable + // @pch: payment channel address + // @sv: voucher + // Rule[perm:read] + PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (bool, error) + // PaychVoucherAdd adds a voucher for an inbound channel. + // If the channel is not in the store, fetches the channel from state (and checks that + // the channel To address is owned by the wallet). + // Rule[perm:write] + PaychVoucherAdd(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) + // PaychVoucherCreate creates a new signed voucher on the given payment channel + // with the given lane and amount. The value passed in is exactly the value + // that will be used to create the voucher, so if previous vouchers exist, the + // actual additional value of this voucher will only be the difference between + // the two. + // If there are insufficient funds in the channel to create the voucher, + // returns a nil voucher and the shortfall. + // Rule[perm:sign] + PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paychmgr.VoucherCreateResult, error) + // PaychVoucherList list vouchers in payment channel + // @pch: payment channel address + // Rule[perm:write] + PaychVoucherList(ctx context.Context, pch address.Address) ([]*paych.SignedVoucher, error) + // PaychVoucherSubmit Submit voucher to chain to update payment channel state + // @pch: payment channel address + // @sv: voucher in payment channel + // Rule[perm:sign] + PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) +} diff --git a/app/client/apiface/v0api/syncer.go b/app/client/apiface/v0api/syncer.go new file mode 100644 index 0000000000..5902edbff9 --- /dev/null +++ b/app/client/apiface/v0api/syncer.go @@ -0,0 +1,29 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/app/submodule/apitypes" + syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" + "github.com/filecoin-project/venus/pkg/types" +) + +type ISyncer interface { + // Rule[perm:write] + ChainSyncHandleNewTipSet(ctx context.Context, ci *types.ChainInfo) error + // Rule[perm:admin] + SetConcurrent(ctx context.Context, concurrent int64) error + // Rule[perm:read] + SyncerTracker(ctx context.Context) *syncTypes.TargetTracker + // Rule[perm:read] + Concurrent(ctx context.Context) int64 + // Rule[perm:read] + ChainTipSetWeight(ctx context.Context, tsk types.TipSetKey) (big.Int, error) + // Rule[perm:write] + SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error + // Rule[perm:read] + StateCall(ctx context.Context, msg *types.UnsignedMessage, tsk types.TipSetKey) (*types.InvocResult, error) + // Rule[perm:read] + SyncState(ctx context.Context) (*apitypes.SyncState, error) +} diff --git a/app/client/apiface/v0api/wallet.go b/app/client/apiface/v0api/wallet.go new file mode 100644 index 0000000000..e516d994bd --- /dev/null +++ b/app/client/apiface/v0api/wallet.go @@ -0,0 +1,44 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/venus/pkg/crypto" + "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/pkg/wallet" +) + +type IWallet interface { + // Rule[perm:sign] + WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) + // Rule[perm:admin] + WalletExport(addr address.Address, password string) (*crypto.KeyInfo, error) + // Rule[perm:admin] + WalletImport(key *crypto.KeyInfo) (address.Address, error) + // Rule[perm:write] + WalletHas(ctx context.Context, addr address.Address) (bool, error) + // Rule[perm:write] + WalletNewAddress(protocol address.Protocol) (address.Address, error) + // Rule[perm:read] + WalletBalance(ctx context.Context, addr address.Address) (abi.TokenAmount, error) //not exists in remote + // Rule[perm:write] + WalletDefaultAddress(ctx context.Context) (address.Address, error) //not exists in remote + // Rule[perm:admin] + WalletAddresses(ctx context.Context) []address.Address + // Rule[perm:write] + WalletSetDefault(ctx context.Context, addr address.Address) error //not exists in remote + // Rule[perm:sign] + WalletSignMessage(ctx context.Context, k address.Address, msg *types.UnsignedMessage) (*types.SignedMessage, error) + // Rule[perm:admin] + LockWallet(ctx context.Context) error + // Rule[perm:admin] + UnLockWallet(ctx context.Context, password []byte) error + // Rule[perm:admin] + SetPassword(Context context.Context, password []byte) error + // Rule[perm:admin] + HasPassword(Context context.Context) bool + // Rule[perm:admin] + WalletState(Context context.Context) int +} diff --git a/app/client/apiface/wallet.go b/app/client/apiface/wallet.go index 19c1e27e69..b9733a4f08 100644 --- a/app/client/apiface/wallet.go +++ b/app/client/apiface/wallet.go @@ -27,7 +27,7 @@ type IWallet interface { WalletDefaultAddress(ctx context.Context) (address.Address, error) //not exists in remote // Rule[perm:admin] WalletAddresses(ctx context.Context) []address.Address - // Rule[perm:admin] + // Rule[perm:write] WalletSetDefault(ctx context.Context, addr address.Address) error //not exists in remote // Rule[perm:sign] WalletSignMessage(ctx context.Context, k address.Address, msg *types.UnsignedMessage) (*types.SignedMessage, error) diff --git a/app/client/full.go b/app/client/full.go index 1e091dfbc5..646235eb54 100644 --- a/app/client/full.go +++ b/app/client/full.go @@ -4,9 +4,6 @@ package client import ( "context" - "io" - "time" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-jsonrpc/auth" @@ -31,6 +28,8 @@ import ( "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" + "io" + "time" ) type FullNodeStruct struct { @@ -87,7 +86,7 @@ func (s *IBeaconStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (* type IBlockStoreStruct struct { Internal struct { - ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"read"` + ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"` ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (apitypes.ObjStat, error) `perm:"read"` @@ -138,7 +137,7 @@ type IChainInfoStruct struct { ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"` ChainList func(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) `perm:"read"` ChainNotify func(p0 context.Context) <-chan []*chain.HeadChange `perm:"read"` - ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"read"` + ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` GetActor func(p0 context.Context, p1 address.Address) (*types.Actor, error) `perm:"read"` GetEntry func(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) `perm:"read"` GetFullBlock func(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) `perm:"read"` @@ -301,7 +300,7 @@ func (s *IChainInfoStruct) VerifyEntry(p0 *types.BeaconEntry, p1 *types.BeaconEn type IConfigStruct struct { Internal struct { ConfigGet func(p0 context.Context, p1 string) (interface{}, error) `perm:"read"` - ConfigSet func(p0 context.Context, p1 string, p2 string) error `perm:"read"` + ConfigSet func(p0 context.Context, p1 string, p2 string) error `perm:"admin"` } } @@ -318,7 +317,7 @@ type IDagServiceStruct struct { DAGCat func(p0 context.Context, p1 cid.Cid) (io.Reader, error) `perm:"read"` DAGGetFileSize func(p0 context.Context, p1 cid.Cid) (uint64, error) `perm:"read"` DAGGetNode func(p0 context.Context, p1 string) (interface{}, error) `perm:"read"` - DAGImportData func(p0 context.Context, p1 io.Reader) (ipld.Node, error) `perm:"read"` + DAGImportData func(p0 context.Context, p1 io.Reader) (ipld.Node, error) `perm:"write"` } } @@ -343,7 +342,7 @@ type IDiscoveryStruct struct { type IJwtAuthAPIStruct struct { Internal struct { - AuthNew func(p0 context.Context, p1 []auth.Permission) ([]byte, error) `perm:"read"` + AuthNew func(p0 context.Context, p1 []auth.Permission) ([]byte, error) `perm:"admin"` Verify func(p0 context.Context, p1 string, p2 string) ([]auth.Permission, error) `perm:"read"` } } @@ -373,25 +372,25 @@ type IMessagePoolStruct struct { GasEstimateGasLimit func(p0 context.Context, p1 *types.UnsignedMessage, p2 types.TipSetKey) (int64, error) `perm:"read"` GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) `perm:"read"` GasEstimateMessageGas func(p0 context.Context, p1 *types.UnsignedMessage, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.UnsignedMessage, error) `perm:"read"` - MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"read"` - MpoolBatchPushMessage func(p0 context.Context, p1 []*types.UnsignedMessage, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"read"` - MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"read"` + MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolBatchPushMessage func(p0 context.Context, p1 []*types.UnsignedMessage, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` + MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` MpoolCheckMessages func(p0 context.Context, p1 []*apitypes.MessagePrototype) ([][]apitypes.MessageCheckStatus, error) `perm:"read"` MpoolCheckPendingMessages func(p0 context.Context, p1 address.Address) ([][]apitypes.MessageCheckStatus, error) `perm:"read"` MpoolCheckReplaceMessages func(p0 context.Context, p1 []*types.Message) ([][]apitypes.MessageCheckStatus, error) `perm:"read"` - MpoolClear func(p0 context.Context, p1 bool) error `perm:"read"` - MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"read"` + MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` + MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` MpoolGetConfig func(p0 context.Context) (*messagepool.MpoolConfig, error) `perm:"read"` MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` - MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"read"` - MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"read"` - MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"read"` - MpoolPushMessage func(p0 context.Context, p1 *types.UnsignedMessage, p2 *types.MessageSendSpec) (*types.SignedMessage, error) `perm:"read"` - MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"read"` + MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"write"` + MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"write"` + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolPushMessage func(p0 context.Context, p1 *types.UnsignedMessage, p2 *types.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` + MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` MpoolSelects func(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) `perm:"read"` - MpoolSetConfig func(p0 context.Context, p1 *messagepool.MpoolConfig) error `perm:"read"` + MpoolSetConfig func(p0 context.Context, p1 *messagepool.MpoolConfig) error `perm:"admin"` MpoolSub func(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) `perm:"read"` } } @@ -653,7 +652,7 @@ func (s *IMinerStateStruct) StateVerifiedClientStatus(p0 context.Context, p1 add type IMiningStruct struct { Internal struct { - MinerCreateBlock func(p0 context.Context, p1 *apitypes.BlockTemplate) (*types.BlockMsg, error) `perm:"read"` + MinerCreateBlock func(p0 context.Context, p1 *apitypes.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*apitypes.MiningBaseInfo, error) `perm:"read"` } } @@ -668,19 +667,19 @@ func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, type IMultiSigStruct struct { Internal struct { - MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*apitypes.MessagePrototype, error) `perm:"read"` + MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*apitypes.MessagePrototype, error) `perm:"sign"` + MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*apitypes.MessagePrototype, error) `perm:"sign"` + MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*apitypes.MessagePrototype, error) `perm:"sign"` + MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*apitypes.MessagePrototype, error) `perm:"sign"` + MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*apitypes.MessagePrototype, error) `perm:"sign"` + MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*apitypes.MessagePrototype, error) `perm:"sign"` + MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*apitypes.MessagePrototype, error) `perm:"sign"` MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` - MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*apitypes.MessagePrototype, error) `perm:"read"` + MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*apitypes.MessagePrototype, error) `perm:"sign"` + MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*apitypes.MessagePrototype, error) `perm:"sign"` + MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*apitypes.MessagePrototype, error) `perm:"sign"` + MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*apitypes.MessagePrototype, error) `perm:"sign"` + MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*apitypes.MessagePrototype, error) `perm:"sign"` } } @@ -793,22 +792,22 @@ func (s *INetworkStruct) Version(p0 context.Context) (apitypes.Version, error) { type IPaychanStruct struct { Internal struct { - PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` - PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"read"` - PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"read"` - PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"read"` - PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*apitypes.ChannelInfo, error) `perm:"read"` - PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"read"` + PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` + PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"sign"` + PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*apitypes.ChannelInfo, error) `perm:"sign"` + PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` - PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []apitypes.VoucherSpec) (*apitypes.PaymentInfo, error) `perm:"read"` - PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"read"` + PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []apitypes.VoucherSpec) (*apitypes.PaymentInfo, error) `perm:"sign"` + PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` PaychStatus func(p0 context.Context, p1 address.Address) (*types.PaychStatus, error) `perm:"read"` - PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"read"` + PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` - PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychmgr.VoucherCreateResult, error) `perm:"read"` - PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"read"` - PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"read"` + PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychmgr.VoucherCreateResult, error) `perm:"sign"` + PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` + PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` } } @@ -878,13 +877,13 @@ func (s *IPaychanStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Addre type ISyncerStruct struct { Internal struct { - ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"read"` + ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"write"` ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (big.Int, error) `perm:"read"` Concurrent func(p0 context.Context) int64 `perm:"read"` - SetConcurrent func(p0 context.Context, p1 int64) error `perm:"read"` + SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` StateCall func(p0 context.Context, p1 *types.UnsignedMessage, p2 types.TipSetKey) (*types.InvocResult, error) `perm:"read"` SyncState func(p0 context.Context) (*apitypes.SyncState, error) `perm:"read"` - SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"read"` + SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` SyncerTracker func(p0 context.Context) *syncTypes.TargetTracker `perm:"read"` } } @@ -934,7 +933,7 @@ type IWalletStruct struct { WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` WalletImport func(p0 *crypto.KeyInfo) (address.Address, error) `perm:"admin"` WalletNewAddress func(p0 address.Protocol) (address.Address, error) `perm:"write"` - WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"admin"` + WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) `perm:"sign"` WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.UnsignedMessage) (*types.SignedMessage, error) `perm:"sign"` WalletState func(p0 context.Context) int `perm:"admin"` diff --git a/app/client/v0api/full.go b/app/client/v0api/full.go index aa82723020..18c50a839b 100644 --- a/app/client/v0api/full.go +++ b/app/client/v0api/full.go @@ -4,9 +4,6 @@ package v0api import ( "context" - "io" - "time" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-jsonrpc/auth" @@ -31,6 +28,8 @@ import ( "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" + "io" + "time" ) type FullNodeStruct struct { @@ -87,7 +86,7 @@ func (s *IBeaconStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (* type IBlockStoreStruct struct { Internal struct { - ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"read"` + ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"` ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (apitypes.ObjStat, error) `perm:"read"` @@ -133,12 +132,11 @@ type IChainInfoStruct struct { ChainGetRandomnessFromTickets func(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` ChainGetReceipts func(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) `perm:"read"` ChainGetTipSet func(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - ChainGetTipSetAfterHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"` ChainList func(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) `perm:"read"` ChainNotify func(p0 context.Context) <-chan []*chain.HeadChange `perm:"read"` - ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"read"` + ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` GetActor func(p0 context.Context, p1 address.Address) (*types.Actor, error) `perm:"read"` GetEntry func(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) `perm:"read"` GetFullBlock func(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) `perm:"read"` @@ -146,11 +144,15 @@ type IChainInfoStruct struct { MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*chain.ChainMessage, error) `perm:"read"` ProtocolParameters func(p0 context.Context) (*apitypes.ProtocolParams, error) `perm:"read"` ResolveToKeyAddr func(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) `perm:"read"` + StateGetReceipt func(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) `perm:"read"` StateNetworkName func(p0 context.Context) (apitypes.NetworkName, error) `perm:"read"` StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (network.Version, error) `perm:"read"` - StateSearchMsg func(p0 context.Context, p2 cid.Cid) (*apitypes.MsgLookup, error) `perm:"read"` + StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*apitypes.MsgLookup, error) `perm:"read"` + StateSearchMsgLimited func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*apitypes.MsgLookup, error) `perm:"read"` + StateVerifiedRegistryRootKey func(p0 context.Context, p1 types.TipSetKey) (address.Address, error) `perm:"read"` + StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*apitypes.MsgLookup, error) `perm:"read"` - StateGetReceipt func(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error) `perm:"read""` + StateWaitMsgLimited func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*apitypes.MsgLookup, error) `perm:"read"` VerifyEntry func(p0 *types.BeaconEntry, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool `perm:"read"` } } @@ -207,10 +209,6 @@ func (s *IChainInfoStruct) ChainGetTipSet(p0 context.Context, p1 types.TipSetKey return s.Internal.ChainGetTipSet(p0, p1) } -func (s *IChainInfoStruct) ChainGetTipSetAfterHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { - return s.Internal.ChainGetTipSetAfterHeight(p0, p1, p2) -} - func (s *IChainInfoStruct) ChainGetTipSetByHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { return s.Internal.ChainGetTipSetByHeight(p0, p1, p2) } @@ -259,6 +257,10 @@ func (s *IChainInfoStruct) ResolveToKeyAddr(p0 context.Context, p1 address.Addre return s.Internal.ResolveToKeyAddr(p0, p1, p2) } +func (s *IChainInfoStruct) StateGetReceipt(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) { + return s.Internal.StateGetReceipt(p0, p1, p2) +} + func (s *IChainInfoStruct) StateNetworkName(p0 context.Context) (apitypes.NetworkName, error) { return s.Internal.StateNetworkName(p0) } @@ -271,12 +273,24 @@ func (s *IChainInfoStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*apit return s.Internal.StateSearchMsg(p0, p1) } +func (s *IChainInfoStruct) StateSearchMsgLimited(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*apitypes.MsgLookup, error) { + return s.Internal.StateSearchMsgLimited(p0, p1, p2) +} + +func (s *IChainInfoStruct) StateVerifiedRegistryRootKey(p0 context.Context, p1 types.TipSetKey) (address.Address, error) { + return s.Internal.StateVerifiedRegistryRootKey(p0, p1) +} + +func (s *IChainInfoStruct) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { + return s.Internal.StateVerifierStatus(p0, p1, p2) +} + func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64) (*apitypes.MsgLookup, error) { return s.Internal.StateWaitMsg(p0, p1, p2) } -func (s *IChainInfoStruct) StateGetReceipt(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) { - return s.Internal.StateGetReceipt(p0, p1, p2) +func (s *IChainInfoStruct) StateWaitMsgLimited(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*apitypes.MsgLookup, error) { + return s.Internal.StateWaitMsgLimited(p0, p1, p2, p3) } func (s *IChainInfoStruct) VerifyEntry(p0 *types.BeaconEntry, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool { @@ -286,7 +300,7 @@ func (s *IChainInfoStruct) VerifyEntry(p0 *types.BeaconEntry, p1 *types.BeaconEn type IConfigStruct struct { Internal struct { ConfigGet func(p0 context.Context, p1 string) (interface{}, error) `perm:"read"` - ConfigSet func(p0 context.Context, p1 string, p2 string) error `perm:"read"` + ConfigSet func(p0 context.Context, p1 string, p2 string) error `perm:"admin"` } } @@ -303,7 +317,7 @@ type IDagServiceStruct struct { DAGCat func(p0 context.Context, p1 cid.Cid) (io.Reader, error) `perm:"read"` DAGGetFileSize func(p0 context.Context, p1 cid.Cid) (uint64, error) `perm:"read"` DAGGetNode func(p0 context.Context, p1 string) (interface{}, error) `perm:"read"` - DAGImportData func(p0 context.Context, p1 io.Reader) (ipld.Node, error) `perm:"read"` + DAGImportData func(p0 context.Context, p1 io.Reader) (ipld.Node, error) `perm:"write"` } } @@ -328,7 +342,7 @@ type IDiscoveryStruct struct { type IJwtAuthAPIStruct struct { Internal struct { - AuthNew func(p0 context.Context, p1 []auth.Permission) ([]byte, error) `perm:"read"` + AuthNew func(p0 context.Context, p1 []auth.Permission) ([]byte, error) `perm:"admin"` Verify func(p0 context.Context, p1 string, p2 string) ([]auth.Permission, error) `perm:"read"` } } @@ -358,25 +372,22 @@ type IMessagePoolStruct struct { GasEstimateGasLimit func(p0 context.Context, p1 *types.UnsignedMessage, p2 types.TipSetKey) (int64, error) `perm:"read"` GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) `perm:"read"` GasEstimateMessageGas func(p0 context.Context, p1 *types.UnsignedMessage, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.UnsignedMessage, error) `perm:"read"` - MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"read"` - MpoolBatchPushMessage func(p0 context.Context, p1 []*types.UnsignedMessage, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"read"` - MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"read"` - MpoolCheckMessages func(p0 context.Context, p1 []*apitypes.MessagePrototype) ([][]apitypes.MessageCheckStatus, error) `perm:"read"` - MpoolCheckPendingMessages func(p0 context.Context, p1 address.Address) ([][]apitypes.MessageCheckStatus, error) `perm:"read"` - MpoolCheckReplaceMessages func(p0 context.Context, p1 []*types.Message) ([][]apitypes.MessageCheckStatus, error) `perm:"read"` - MpoolClear func(p0 context.Context, p1 bool) error `perm:"read"` - MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"read"` + MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolBatchPushMessage func(p0 context.Context, p1 []*types.UnsignedMessage, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` + MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` + MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` MpoolGetConfig func(p0 context.Context) (*messagepool.MpoolConfig, error) `perm:"read"` MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` - MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"read"` - MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"read"` - MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"read"` - MpoolPushMessage func(p0 context.Context, p1 *types.UnsignedMessage, p2 *types.MessageSendSpec) (*types.SignedMessage, error) `perm:"read"` - MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"read"` + MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"write"` + MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"write"` + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolPushMessage func(p0 context.Context, p1 *types.UnsignedMessage, p2 *types.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` + MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` MpoolSelects func(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) `perm:"read"` - MpoolSetConfig func(p0 context.Context, p1 *messagepool.MpoolConfig) error `perm:"read"` + MpoolSetConfig func(p0 context.Context, p1 *messagepool.MpoolConfig) error `perm:"admin"` MpoolSub func(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) `perm:"read"` } } @@ -413,18 +424,6 @@ func (s *IMessagePoolStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*t return s.Internal.MpoolBatchPushUntrusted(p0, p1) } -func (s *IMessagePoolStruct) MpoolCheckMessages(p0 context.Context, p1 []*apitypes.MessagePrototype) ([][]apitypes.MessageCheckStatus, error) { - return s.Internal.MpoolCheckMessages(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolCheckPendingMessages(p0 context.Context, p1 address.Address) ([][]apitypes.MessageCheckStatus, error) { - return s.Internal.MpoolCheckPendingMessages(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolCheckReplaceMessages(p0 context.Context, p1 []*types.Message) ([][]apitypes.MessageCheckStatus, error) { - return s.Internal.MpoolCheckReplaceMessages(p0, p1) -} - func (s *IMessagePoolStruct) MpoolClear(p0 context.Context, p1 bool) error { return s.Internal.MpoolClear(p0, p1) } @@ -638,7 +637,7 @@ func (s *IMinerStateStruct) StateVerifiedClientStatus(p0 context.Context, p1 add type IMiningStruct struct { Internal struct { - MinerCreateBlock func(p0 context.Context, p1 *apitypes.BlockTemplate) (*types.BlockMsg, error) `perm:"read"` + MinerCreateBlock func(p0 context.Context, p1 *apitypes.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*apitypes.MiningBaseInfo, error) `perm:"read"` } } @@ -653,47 +652,47 @@ func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, type IMultiSigStruct struct { Internal struct { - MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` - MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*apitypes.MessagePrototype, error) `perm:"read"` - MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*apitypes.MessagePrototype, error) `perm:"read"` + MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) `perm:"sign"` + MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (cid.Cid, error) `perm:"sign"` + MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` + MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) `perm:"sign"` + MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) `perm:"sign"` + MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) `perm:"sign"` + MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) `perm:"sign"` + MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` + MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) `perm:"sign"` + MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` + MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (cid.Cid, error) `perm:"sign"` + MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (cid.Cid, error) `perm:"sign"` + MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (cid.Cid, error) `perm:"sign"` } } -func (s *IMultiSigStruct) MsigAddApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigAddApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) { return s.Internal.MsigAddApprove(p0, p1, p2, p3, p4, p5, p6) } -func (s *IMultiSigStruct) MsigAddCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigAddCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (cid.Cid, error) { return s.Internal.MsigAddCancel(p0, p1, p2, p3, p4, p5) } -func (s *IMultiSigStruct) MsigAddPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigAddPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) { return s.Internal.MsigAddPropose(p0, p1, p2, p3, p4) } -func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) { return s.Internal.MsigApprove(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) { return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3, p4, p5, p6, p7, p8) } -func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) { return s.Internal.MsigCancel(p0, p1, p2, p3, p4, p5, p6, p7) } -func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) { return s.Internal.MsigCreate(p0, p1, p2, p3, p4, p5, p6) } @@ -701,23 +700,23 @@ func (s *IMultiSigStruct) MsigGetVested(p0 context.Context, p1 address.Address, return s.Internal.MsigGetVested(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) { return s.Internal.MsigPropose(p0, p1, p2, p3, p4, p5, p6) } -func (s *IMultiSigStruct) MsigRemoveSigner(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigRemoveSigner(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) { return s.Internal.MsigRemoveSigner(p0, p1, p2, p3, p4) } -func (s *IMultiSigStruct) MsigSwapApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigSwapApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (cid.Cid, error) { return s.Internal.MsigSwapApprove(p0, p1, p2, p3, p4, p5, p6) } -func (s *IMultiSigStruct) MsigSwapCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigSwapCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (cid.Cid, error) { return s.Internal.MsigSwapCancel(p0, p1, p2, p3, p4, p5) } -func (s *IMultiSigStruct) MsigSwapPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigSwapPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (cid.Cid, error) { return s.Internal.MsigSwapPropose(p0, p1, p2, p3, p4) } @@ -728,7 +727,7 @@ type INetworkStruct struct { NetworkFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` NetworkFindProvidersAsync func(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo `perm:"read"` NetworkGetBandwidthStats func(p0 context.Context) metrics.Stats `perm:"admin"` - NetworkGetClosestPeers func(p0 context.Context, p1 string) (<-chan peer.ID, error) `perm:"read"` + NetworkGetClosestPeers func(p0 context.Context, p1 string) (<-chan peer.ID, error) `perm:"admin"` NetworkGetPeerAddresses func(p0 context.Context) []ma.Multiaddr `perm:"admin"` NetworkGetPeerID func(p0 context.Context) peer.ID `perm:"admin"` NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*net.SwarmConnInfos, error) `perm:"read"` @@ -778,22 +777,22 @@ func (s *INetworkStruct) Version(p0 context.Context) (apitypes.Version, error) { type IPaychanStruct struct { Internal struct { - PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` - PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"read"` - PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"read"` - PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"read"` - PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*apitypes.ChannelInfo, error) `perm:"read"` - PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"read"` + PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` + PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"sign"` + PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*apitypes.ChannelInfo, error) `perm:"sign"` + PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` - PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []apitypes.VoucherSpec) (*apitypes.PaymentInfo, error) `perm:"read"` - PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"read"` + PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []apitypes.VoucherSpec) (*apitypes.PaymentInfo, error) `perm:"sign"` + PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` PaychStatus func(p0 context.Context, p1 address.Address) (*types.PaychStatus, error) `perm:"read"` - PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"read"` + PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` - PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychmgr.VoucherCreateResult, error) `perm:"read"` - PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"read"` - PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"read"` + PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychmgr.VoucherCreateResult, error) `perm:"sign"` + PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` + PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` } } @@ -863,13 +862,13 @@ func (s *IPaychanStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Addre type ISyncerStruct struct { Internal struct { - ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"read"` + ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"write"` ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (big.Int, error) `perm:"read"` Concurrent func(p0 context.Context) int64 `perm:"read"` - SetConcurrent func(p0 context.Context, p1 int64) error `perm:"read"` + SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` StateCall func(p0 context.Context, p1 *types.UnsignedMessage, p2 types.TipSetKey) (*types.InvocResult, error) `perm:"read"` SyncState func(p0 context.Context) (*apitypes.SyncState, error) `perm:"read"` - SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"read"` + SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` SyncerTracker func(p0 context.Context) *syncTypes.TargetTracker `perm:"read"` } } @@ -919,7 +918,7 @@ type IWalletStruct struct { WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` WalletImport func(p0 *crypto.KeyInfo) (address.Address, error) `perm:"admin"` WalletNewAddress func(p0 address.Protocol) (address.Address, error) `perm:"write"` - WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"admin"` + WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) `perm:"sign"` WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.UnsignedMessage) (*types.SignedMessage, error) `perm:"sign"` WalletState func(p0 context.Context) int `perm:"admin"` diff --git a/app/node/env.go b/app/node/env.go index 322224ed2b..6283a28de5 100644 --- a/app/node/env.go +++ b/app/node/env.go @@ -2,6 +2,7 @@ package node import ( "context" + "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/app/client/apiface/v0api" diff --git a/app/submodule/blockstore/blockstore_submodule.go b/app/submodule/blockstore/blockstore_submodule.go index e2eea9bf55..b963897db1 100644 --- a/app/submodule/blockstore/blockstore_submodule.go +++ b/app/submodule/blockstore/blockstore_submodule.go @@ -2,7 +2,9 @@ package blockstore import ( "context" + "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/filecoin-project/venus/pkg/repo" bstore "github.com/ipfs/go-ipfs-blockstore" ) @@ -33,6 +35,6 @@ func (bsm *BlockstoreSubmodule) API() apiface.IBlockStore { return &blockstoreAPI{blockstore: bsm} } -func (bsm *BlockstoreSubmodule) V0API() apiface.IBlockStore { +func (bsm *BlockstoreSubmodule) V0API() v0api.IBlockStore { return &blockstoreAPI{blockstore: bsm} } diff --git a/app/submodule/config/config.go b/app/submodule/config/config.go index 4019f5769d..08e428ef27 100644 --- a/app/submodule/config/config.go +++ b/app/submodule/config/config.go @@ -1,9 +1,11 @@ package config import ( + "sync" + "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/app/client/apiface/v0api" repo2 "github.com/filecoin-project/venus/pkg/repo" - "sync" ) // configModule is plumbing implementation for setting and retrieving values from local config. @@ -40,6 +42,6 @@ func (s *ConfigModule) API() apiface.IConfig { return &configAPI{config: s} } -func (s *ConfigModule) V0API() apiface.IConfig { +func (s *ConfigModule) V0API() v0api.IConfig { return &configAPI{config: s} } diff --git a/app/submodule/dagservice/blockservice_submoodule.go b/app/submodule/dagservice/blockservice_submoodule.go index af76001f0c..803fe5d2c3 100644 --- a/app/submodule/dagservice/blockservice_submoodule.go +++ b/app/submodule/dagservice/blockservice_submoodule.go @@ -2,7 +2,9 @@ package dagservice import ( "context" + "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/filecoin-project/venus/app/submodule/network" "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/util/dag" @@ -38,6 +40,6 @@ func (blockService *DagServiceSubmodule) API() apiface.IDagService { return &dagServiceAPI{dagService: blockService} } -func (blockService *DagServiceSubmodule) V0API() apiface.IDagService { +func (blockService *DagServiceSubmodule) V0API() v0api.IDagService { return &dagServiceAPI{dagService: blockService} } diff --git a/app/submodule/discovery/discovery_submodule.go b/app/submodule/discovery/discovery_submodule.go index 74475c527b..a7d1b202f4 100644 --- a/app/submodule/discovery/discovery_submodule.go +++ b/app/submodule/discovery/discovery_submodule.go @@ -2,12 +2,14 @@ package discovery import ( "context" + "time" + "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/filecoin-project/venus/app/submodule/network" "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/types" "github.com/libp2p/go-libp2p-core/host" - "time" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" @@ -132,6 +134,6 @@ func (discovery *DiscoverySubmodule) API() apiface.IDiscovery { return &discoveryAPI{discovery: discovery} } -func (discovery *DiscoverySubmodule) V0API() apiface.IDiscovery { +func (discovery *DiscoverySubmodule) V0API() v0api.IDiscovery { return &discoveryAPI{discovery: discovery} } diff --git a/app/submodule/market/market_submodule.go b/app/submodule/market/market_submodule.go index 6ee52e90ff..6879fde131 100644 --- a/app/submodule/market/market_submodule.go +++ b/app/submodule/market/market_submodule.go @@ -2,6 +2,7 @@ package market import ( "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/filecoin-project/venus/pkg/statemanger" ) @@ -20,6 +21,6 @@ func (ms *MarketSubmodule) API() apiface.IMarket { return newMarketAPI(ms.c, ms.sm) } -func (ms *MarketSubmodule) V0API() apiface.IMarket { +func (ms *MarketSubmodule) V0API() v0api.IMarket { return newMarketAPI(ms.c, ms.sm) } diff --git a/app/submodule/mining/mining_submodule.go b/app/submodule/mining/mining_submodule.go index 44d4fa8468..71f6ba5ace 100644 --- a/app/submodule/mining/mining_submodule.go +++ b/app/submodule/mining/mining_submodule.go @@ -2,6 +2,7 @@ package mining import ( "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/filecoin-project/venus/app/submodule/blockstore" chain2 "github.com/filecoin-project/venus/app/submodule/chain" "github.com/filecoin-project/venus/app/submodule/network" @@ -34,7 +35,7 @@ func (miningModule *MiningModule) API() apiface.IMining { return &MiningAPI{Ming: miningModule} } -func (miningModule *MiningModule) V0API() apiface.IMining { +func (miningModule *MiningModule) V0API() v0api.IMining { return &MiningAPI{Ming: miningModule} } diff --git a/app/submodule/mpool/mpool_submodule.go b/app/submodule/mpool/mpool_submodule.go index 020673c042..d7ca57d798 100644 --- a/app/submodule/mpool/mpool_submodule.go +++ b/app/submodule/mpool/mpool_submodule.go @@ -3,23 +3,26 @@ package mpool import ( "bytes" "context" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/pkg/messagepool" - logging "github.com/ipfs/go-log" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-pubsub" - "golang.org/x/xerrors" "os" "strconv" "time" + "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/app/client/apiface/v0api" + "github.com/libp2p/go-libp2p-core/peer" + pubsub "github.com/libp2p/go-libp2p-pubsub" + + "github.com/filecoin-project/go-address" + logging "github.com/ipfs/go-log" + "golang.org/x/xerrors" + "github.com/filecoin-project/venus/app/submodule/chain" "github.com/filecoin-project/venus/app/submodule/network" "github.com/filecoin-project/venus/app/submodule/wallet" chainpkg "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/constants" + "github.com/filecoin-project/venus/pkg/messagepool" "github.com/filecoin-project/venus/pkg/messagepool/journal" "github.com/filecoin-project/venus/pkg/net/msgsub" "github.com/filecoin-project/venus/pkg/repo" @@ -249,7 +252,7 @@ func (mp *MessagePoolSubmodule) API() apiface.IMessagePool { return &MessagePoolAPI{mp: mp, pushLocks: pushLocks} } -func (mp *MessagePoolSubmodule) V0API() apiface.IMessagePool { +func (mp *MessagePoolSubmodule) V0API() v0api.IMessagePool { pushLocks := messagepool.NewMpoolLocker() return &MessagePoolAPI{mp: mp, pushLocks: pushLocks} } diff --git a/app/submodule/network/network_submodule.go b/app/submodule/network/network_submodule.go index 5918ca5628..9ba8cc629c 100644 --- a/app/submodule/network/network_submodule.go +++ b/app/submodule/network/network_submodule.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "fmt" - "github.com/filecoin-project/venus/app/client/apiface" "os" "path/filepath" "runtime" @@ -50,7 +49,9 @@ import ( ma "github.com/multiformats/go-multiaddr" "github.com/pkg/errors" - "github.com/filecoin-project/venus/app/submodule/network/v0api" + "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/app/client/apiface/v0api" + v0apiwrapper "github.com/filecoin-project/venus/app/submodule/network/v0api" ) var networkLogger = logging.Logger("network_module") @@ -85,8 +86,8 @@ func (networkSubmodule *NetworkSubmodule) API() apiface.INetwork { return &networkAPI{network: networkSubmodule} } -func (networkSubmodule *NetworkSubmodule) V0API() apiface.INetwork { - return &v0api.WrapperV1INetwork{INetwork: &networkAPI{network: networkSubmodule}} +func (networkSubmodule *NetworkSubmodule) V0API() v0api.INetwork { + return &v0apiwrapper.WrapperV1INetwork{INetwork: &networkAPI{network: networkSubmodule}} } func (networkSubmodule *NetworkSubmodule) Stop(ctx context.Context) { diff --git a/app/submodule/paych/paych_submodule.go b/app/submodule/paych/paych_submodule.go index 9e752adfd6..83bb1ab5d0 100644 --- a/app/submodule/paych/paych_submodule.go +++ b/app/submodule/paych/paych_submodule.go @@ -2,7 +2,9 @@ package paych import ( "context" + "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/filecoin-project/venus/pkg/paychmgr" "github.com/ipfs/go-datastore" ) @@ -31,6 +33,6 @@ func (ps *PaychSubmodule) API() apiface.IPaychan { return NewPaychAPI(ps.pmgr) } -func (ps *PaychSubmodule) V0API() apiface.IPaychan { +func (ps *PaychSubmodule) V0API() v0api.IPaychan { return NewPaychAPI(ps.pmgr) } diff --git a/app/submodule/syncer/syncer_submodule.go b/app/submodule/syncer/syncer_submodule.go index d55c6bfdde..9239ce6d9b 100644 --- a/app/submodule/syncer/syncer_submodule.go +++ b/app/submodule/syncer/syncer_submodule.go @@ -3,15 +3,17 @@ package syncer import ( "bytes" "context" + "reflect" + "runtime" + "time" + "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/app/client/apiface/v0api" chain2 "github.com/filecoin-project/venus/app/submodule/chain" "github.com/filecoin-project/venus/pkg/clock" "github.com/filecoin-project/venus/pkg/statemanger" "github.com/filecoin-project/venus/pkg/util/ffiwrapper" cbor "github.com/ipfs/go-ipld-cbor" - "reflect" - "runtime" - "time" fbig "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" @@ -325,6 +327,6 @@ func (syncer *SyncerSubmodule) API() apiface.ISyncer { return &syncerAPI{syncer: syncer} } -func (syncer *SyncerSubmodule) V0API() apiface.ISyncer { +func (syncer *SyncerSubmodule) V0API() v0api.ISyncer { return &syncerAPI{syncer: syncer} } diff --git a/app/submodule/wallet/wallet_submodule.go b/app/submodule/wallet/wallet_submodule.go index 0b4e7f959f..4a9db98be6 100644 --- a/app/submodule/wallet/wallet_submodule.go +++ b/app/submodule/wallet/wallet_submodule.go @@ -3,6 +3,8 @@ package wallet import ( "context" + "github.com/filecoin-project/venus/app/client/apiface/v0api" + "github.com/filecoin-project/venus/app/client/apiface" logging "github.com/ipfs/go-log" "github.com/pkg/errors" @@ -80,7 +82,7 @@ func (wallet *WalletSubmodule) API() apiface.IWallet { } } -func (wallet *WalletSubmodule) V0API() apiface.IWallet { +func (wallet *WalletSubmodule) V0API() v0api.IWallet { return &WalletAPI{ walletModule: wallet, adapter: wallet.adapter, diff --git a/build/main.go b/build/main.go index 07c9ad1922..2f62d010ae 100644 --- a/build/main.go +++ b/build/main.go @@ -267,6 +267,14 @@ func test(userArgs ...string) { log.Printf("Tests finished in %.1f seconds\n", end.Sub(begin).Seconds()) } +func genAPI() { + log.Println("generate api...") + + runCmd(cmd("go run ./tools/gen/api/proxygen.go")) + runCmd(cmd("gofmt -s -l -w ./app/client/v0api/full.go")) + runCmd(cmd("gofmt -s -l -w ./app/client/full.go")) +} + func main() { args := os.Args[1:] @@ -302,6 +310,8 @@ func main() { case "best": build() test(args[1:]...) + case "gen-api": + genAPI() case "all": deps() lint() diff --git a/scripts/check_api_file_change.sh b/scripts/check_api_file_change.sh new file mode 100644 index 0000000000..0d424c91ea --- /dev/null +++ b/scripts/check_api_file_change.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +change=$(git status | grep full.go); +change2=$(git status | grep stable_method_info.json); + +echo "$change" +echo "$change2" +echo "" + +if [[ "$change" = "" ]] +then + if [[ "$change2" == "" ]] + then + # api file not change, eixt + echo "full.go not change" + echo "stable_method_info.json not change" + exit 0 + else + echo "$change2" + exit 1 + fi +else + echo "$change" + exit 1 +fi diff --git a/tools/gen/api/proxygen.go b/tools/gen/api/proxygen.go index 0f57bb248b..2042e87cd4 100644 --- a/tools/gen/api/proxygen.go +++ b/tools/gen/api/proxygen.go @@ -1,12 +1,14 @@ package main import ( + "encoding/json" "fmt" "go/ast" "go/parser" "go/token" - "io" + "io/ioutil" "os" + "path" "path/filepath" "regexp" "strconv" @@ -15,8 +17,6 @@ import ( "unicode" "github.com/filecoin-project/venus/app/client/funcrule" - "github.com/ipfs/go-path" - "golang.org/x/xerrors" ) @@ -103,105 +103,161 @@ func (v *Visitor) Visit(node ast.Node) ast.Visitor { } func main() { - if err := generate("./app/client", "apiface", "client", "./app/client/full.go"); err != nil { - fmt.Println("error: ", err) + var arg string + if len(os.Args) > 1 { + arg = os.Args[1] + } + + onlyCompare := arg == "compare" + lpath := lotusPath() + + infos := struct { + V0 *stableMethodInfo + V1 *stableMethodInfo + }{ + V0: v0API(lpath, onlyCompare), + V1: v1API(lpath, onlyCompare), } + + data, err := json.MarshalIndent(infos, "", "\t") + checkError(err) + err = ioutil.WriteFile("./tools/gen/api/stable_method_info.json", data, 0666) + checkError(err) } -func typeName(e ast.Expr, pkg string) (string, error) { - switch t := e.(type) { - case *ast.SelectorExpr: - return t.X.(*ast.Ident).Name + "." + t.Sel.Name, nil - case *ast.Ident: - pstr := t.Name - if !unicode.IsLower(rune(pstr[0])) && pkg != "client" { - pstr = "client." + pstr // todo src pkg name - } - return pstr, nil - case *ast.ArrayType: - subt, err := typeName(t.Elt, pkg) - if err != nil { - return "", err - } - return "[]" + subt, nil - case *ast.StarExpr: - subt, err := typeName(t.X, pkg) - if err != nil { - return "", err - } - return "*" + subt, nil - case *ast.MapType: - k, err := typeName(t.Key, pkg) - if err != nil { - return "", err - } - v, err := typeName(t.Value, pkg) - if err != nil { - return "", err - } - return "map[" + k + "]" + v, nil - case *ast.StructType: - if len(t.Fields.List) != 0 { - return "", xerrors.Errorf("can't struct") - } - return "struct{}", nil - case *ast.InterfaceType: - if len(t.Methods.List) != 0 { - return "", xerrors.Errorf("can't interface") +func v0API(lpath string, onlyCompare bool) *stableMethodInfo { + apiFilePaths := []string{ + path.Join(lpath, "api/v0api/full.go"), + path.Join(lpath, "api/api_common.go"), + path.Join(lpath, "api/api_net.go"), + } + fmt.Println("v0 lotus api file: ", apiFilePaths) + + bmp, err := benchmarkMethodPerm(apiFilePaths) + checkError(err) + //outputWithJSON(bmp, "v0 benchmarkMethodPerm: ") + + mm, err := methodMetaFromInterface("./app/client/apiface", "v0api", "v0api") + checkError(err) + + smi := check(bmp, mm) + outputWithJSON(smi, "v0 api StableMethodInfo: ") + + if !onlyCompare { + outfile := "./app/client/v0api/full.go" + checkError(doTemplate(outfile, mm, templ)) + } + + return smi +} + +func v1API(lpath string, onlyCompare bool) *stableMethodInfo { + apiFilePaths := []string{ + path.Join(lpath, "api/api_full.go"), + path.Join(lpath, "api/api_common.go"), + path.Join(lpath, "api/api_net.go"), + } + fmt.Println("v1 lotus api file: ", apiFilePaths) + + bmp, err := benchmarkMethodPerm(apiFilePaths) + checkError(err) + //outputWithJSON(bmp, "v1 benchmarkMethodPerm: ") + + mm, err := methodMetaFromInterface("./app/client", "apiface", "client") + checkError(err) + + smi := check(bmp, mm) + outputWithJSON(smi, "v1 api StableMethodInfo: ") + + if !onlyCompare { + outfile := "./app/client/full.go" + checkError(doTemplate(outfile, mm, templ)) + } + + return smi +} + +func lotusPath() string { + currPath := "../lotus" + rootPath := path.Join(os.Getenv("GOPATH"), "pkg/mod/github.com/filecoin-project") + dirs, err := os.ReadDir(rootPath) + if err == nil { + // Select the latest version of Lotus + for _, dir := range dirs { + if strings.Contains(dir.Name(), "lotus") { + fmt.Println(dir.Name()) + currPath = path.Join(rootPath, dir.Name()) + } } - return "interface{}", nil - case *ast.ChanType: - subt, err := typeName(t.Value, pkg) + } + fmt.Println("lotus path:", currPath) + + return currPath +} + +func benchmarkMethodPerm(apiFilePaths []string) (map[string]string, error) { + fset := token.NewFileSet() + files := make([]*ast.File, 0, len(apiFilePaths)) + visitor := &Visitor{make(map[string]map[string]*methodMeta), map[string][]string{}} + + for _, fpath := range apiFilePaths { + f, err := parser.ParseFile(fset, fpath, nil, parser.AllErrors|parser.ParseComments) if err != nil { - return "", err + return nil, err } - if t.Dir == ast.SEND { - subt = "->chan " + subt - } else { - subt = "<-chan " + subt + files = append(files, f) + ast.Walk(visitor, f) + } + + perms := make(map[string]string) + for _, f := range files { + cmap := ast.NewCommentMap(fset, f, f.Comments) + for _, methods := range visitor.Methods { + for mname, node := range methods { + filteredComments := cmap.Filter(node.node).Comments() + if len(filteredComments) > 0 { + cmt := filteredComments[len(filteredComments)-1].List[0].Text + if !strings.Contains(cmt, "perm:") { + fmt.Println("lotus method not found perm: ", mname) + continue + } + pairs := strings.Split(cmt, ":") + if len(pairs) != 2 { + continue + } + perms[mname] = pairs[1] + } + } } - return subt, nil - default: - return "", xerrors.Errorf("unknown type") } + + return perms, nil } -// nolint -func isGoFile(fi os.FileInfo) bool { - name := fi.Name() - return !fi.IsDir() && - len(name) > 0 && name[0] != '.' && // ignore .files - filepath.Ext(name) == ".go" +type methodInfo struct { + Name string + node ast.Node + Tags map[string][]string + NamedParams, ParamNames, Results, DefRes string +} +type strinfo struct { + Name string + Methods map[string]*methodInfo + Include []string +} +type meta struct { + Infos map[string]*strinfo + Imports map[string]string + OutPkg string } -func generate(rootPath string, pkg, outpkg, outfile string) error { +func methodMetaFromInterface(rootPath string, pkg, outpkg string) (*meta, error) { fset := token.NewFileSet() apiDir, err := filepath.Abs(rootPath) if err != nil { - return err - } - outfile, err = filepath.Abs(outfile) - if err != nil { - return err + return nil, err } - type methodInfo struct { - Name string - node ast.Node - Tags map[string][]string - NamedParams, ParamNames, Results, DefRes string - } - type strinfo struct { - Name string - Methods map[string]*methodInfo - Include []string - } - - type meta struct { - Infos map[string]*strinfo - Imports map[string]string - OutPkg string - } visitor := &Visitor{make(map[string]map[string]*methodMeta), map[string][]string{}} m := &meta{ OutPkg: outpkg, @@ -209,9 +265,9 @@ func generate(rootPath string, pkg, outpkg, outfile string) error { Imports: map[string]string{}, } //filter := isGoFile - pkgs, err := parser.ParseDir(fset, path.Join([]string{apiDir, pkg}), nil, parser.AllErrors|parser.ParseComments) + pkgs, err := parser.ParseDir(fset, path.Join(apiDir, pkg), nil, parser.AllErrors|parser.ParseComments) if err != nil { - return err + return nil, err } ap := pkgs[pkg] @@ -242,7 +298,7 @@ func generate(rootPath string, pkg, outpkg, outfile string) error { for _, param := range node.ftype.Params.List { pstr, err := typeName(param.Type, outpkg) if err != nil { - return err + return nil, err } c := len(param.Names) @@ -261,7 +317,7 @@ func generate(rootPath string, pkg, outpkg, outfile string) error { for _, result := range node.ftype.Results.List { rs, err := typeName(result.Type, outpkg) if err != nil { - return err + return nil, err } results = append(results, rs) } @@ -293,12 +349,11 @@ func generate(rootPath string, pkg, outpkg, outfile string) error { Results: strings.Join(results, ", "), DefRes: defRes, } - } // try to parse tag info if len(filteredComments) > 0 { - cmt := filteredComments[0].List[0].Text + cmt := filteredComments[0].List[len(filteredComments[0].List)-1].Text rule, tags := parseRule(cmt) info.Methods[mname].Tags[rkPerm] = tags[rkPerm] // remove ignore method @@ -314,11 +369,127 @@ func generate(rootPath string, pkg, outpkg, outfile string) error { delete(m.Infos[ifname].Methods, mname) } } + + return m, nil +} + +func typeName(e ast.Expr, pkg string) (string, error) { + switch t := e.(type) { + case *ast.SelectorExpr: + return t.X.(*ast.Ident).Name + "." + t.Sel.Name, nil + case *ast.Ident: + pstr := t.Name + if !unicode.IsLower(rune(pstr[0])) && pkg != "client" { + pstr = "client." + pstr // todo src pkg name + } + return pstr, nil + case *ast.ArrayType: + subt, err := typeName(t.Elt, pkg) + if err != nil { + return "", err + } + return "[]" + subt, nil + case *ast.StarExpr: + subt, err := typeName(t.X, pkg) + if err != nil { + return "", err + } + return "*" + subt, nil + case *ast.MapType: + k, err := typeName(t.Key, pkg) + if err != nil { + return "", err + } + v, err := typeName(t.Value, pkg) + if err != nil { + return "", err + } + return "map[" + k + "]" + v, nil + case *ast.StructType: + if len(t.Fields.List) != 0 { + return "", xerrors.Errorf("can't struct") + } + return "struct{}", nil + case *ast.InterfaceType: + if len(t.Methods.List) != 0 { + return "", xerrors.Errorf("can't interface") + } + return "interface{}", nil + case *ast.ChanType: + subt, err := typeName(t.Value, pkg) + if err != nil { + return "", err + } + if t.Dir == ast.SEND { + subt = "->chan " + subt + } else { + subt = "<-chan " + subt + } + return subt, nil + default: + return "", xerrors.Errorf("unknown type") + } +} + +type stableMethodInfo struct { + // Lotus and Venus both have functions and the same permissions + Common map[string]string + // Venus has functions that Lotus does not + Extend map[string]string + // Lotus has functions that Venus does not + Loss map[string]string + // Both Lotus and venus has functions but the permissions are different + Gap map[string]string +} + +func newStableMethodInfo() *stableMethodInfo { + return &stableMethodInfo{ + Common: make(map[string]string), + Extend: make(map[string]string), + Loss: make(map[string]string), + Gap: make(map[string]string), + } +} + +func check(bmp map[string]string, m *meta) *stableMethodInfo { + smi := newStableMethodInfo() + vMethodPerms := make(map[string]string) + for _, info := range m.Infos { + for _, one := range info.Methods { + mperm := one.Tags[rkPerm][1] + vMethodPerms[one.Name] = mperm + if perm, ok := bmp[one.Name]; ok { + if mperm != perm { + smi.Gap[one.Name] = fmt.Sprintf("venus:%s lotus:%s", mperm, perm) + continue + } + smi.Common[one.Name] = mperm + } else { + smi.Extend[one.Name] = mperm + } + } + } + for m, p := range bmp { + if _, ok := vMethodPerms[m]; !ok { + smi.Loss[m] = p + } + } + + return smi +} + +func doTemplate(outfile string, info interface{}, templ string) error { w, err := os.OpenFile(outfile, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) if err != nil { return err } - err = doTemplate(w, m, `// Code generated by github.com/filecoin-project/tools/gen/api. DO NOT EDIT. + t := template.Must(template.New(""). + Funcs(template.FuncMap{}).Parse(templ)) + + return t.Execute(w, info) +} + +var templ = `// Code generated by github.com/filecoin-project/tools/gen/api. DO NOT EDIT. package {{.OutPkg}} @@ -327,41 +498,40 @@ import ( {{end}} ) -`) - if err != nil { - return err - } - - err = doTemplate(w, m, ` {{range .Infos}} + {{$name := .Name}} type {{.Name}}Struct struct { {{range .Include}} {{.}}Struct {{end}} {{ if gt (len .Methods) 0 }} - Internal struct { - {{range .Methods}} {{.Name}} func({{.NamedParams}}) ({{.Results}}) `+"`"+`{{range .Tags}}{{index . 0}}:"{{index . 1}}"{{end}}`+"`"+` - {{end}} - } + Internal struct { + {{range .Methods}} {{.Name}} func({{.NamedParams}}) ({{.Results}}) ` + "`" + `{{range .Tags}}{{index . 0}}:"{{index . 1}}"{{end}}` + "`" + ` + {{end}} + } {{ end }} } {{range .Methods}} func(s *{{$name}}Struct) {{.Name}} ({{.NamedParams}}) ({{.Results}}){ - return s.Internal.{{.Name}}({{.ParamNames}}) + return s.Internal.{{.Name}}({{.ParamNames}}) } {{end}} {{end}} +` -`) - return err +func checkError(err error) { + if err != nil { + panic(err) + } } -func doTemplate(w io.Writer, info interface{}, templ string) error { - t := template.Must(template.New(""). - Funcs(template.FuncMap{}).Parse(templ)) - - return t.Execute(w, info) +func outputWithJSON(obj interface{}, comment string) { + b, err := json.MarshalIndent(obj, "", "\t") + if err != nil { + fmt.Println("json marshal error: ", err) + } + fmt.Println(comment, "\n", string(b)) } diff --git a/tools/gen/api/stable_method_info.json b/tools/gen/api/stable_method_info.json new file mode 100644 index 0000000000..2f585fc8d5 --- /dev/null +++ b/tools/gen/api/stable_method_info.json @@ -0,0 +1,527 @@ +{ + "V0": { + "Common": { + "AuthNew": "admin", + "BeaconGetEntry": "read", + "ChainDeleteObj": "admin", + "ChainExport": "read", + "ChainGetBlock": "read", + "ChainGetBlockMessages": "read", + "ChainGetMessage": "read", + "ChainGetMessagesInTipset": "read", + "ChainGetParentMessages": "read", + "ChainGetParentReceipts": "read", + "ChainGetPath": "read", + "ChainGetRandomnessFromBeacon": "read", + "ChainGetRandomnessFromTickets": "read", + "ChainGetTipSet": "read", + "ChainGetTipSetByHeight": "read", + "ChainHasObj": "read", + "ChainHead": "read", + "ChainNotify": "read", + "ChainReadObj": "read", + "ChainSetHead": "admin", + "ChainStatObj": "read", + "ChainTipSetWeight": "read", + "GasEstimateFeeCap": "read", + "GasEstimateGasLimit": "read", + "GasEstimateGasPremium": "read", + "GasEstimateMessageGas": "read", + "MinerCreateBlock": "write", + "MinerGetBaseInfo": "read", + "MpoolBatchPush": "write", + "MpoolBatchPushMessage": "sign", + "MpoolBatchPushUntrusted": "write", + "MpoolClear": "write", + "MpoolGetConfig": "read", + "MpoolGetNonce": "read", + "MpoolPending": "read", + "MpoolPush": "write", + "MpoolPushMessage": "sign", + "MpoolPushUntrusted": "write", + "MpoolSelect": "read", + "MpoolSetConfig": "admin", + "MpoolSub": "read", + "MsigAddApprove": "sign", + "MsigAddCancel": "sign", + "MsigAddPropose": "sign", + "MsigApprove": "sign", + "MsigApproveTxnHash": "sign", + "MsigCancel": "sign", + "MsigCreate": "sign", + "MsigGetVested": "read", + "MsigPropose": "sign", + "MsigRemoveSigner": "sign", + "MsigSwapApprove": "sign", + "MsigSwapCancel": "sign", + "MsigSwapPropose": "sign", + "NetAddrsListen": "read", + "PaychAllocateLane": "sign", + "PaychAvailableFunds": "sign", + "PaychAvailableFundsByFromTo": "sign", + "PaychCollect": "sign", + "PaychGet": "sign", + "PaychGetWaitReady": "sign", + "PaychList": "read", + "PaychNewPayment": "sign", + "PaychSettle": "sign", + "PaychStatus": "read", + "PaychVoucherAdd": "write", + "PaychVoucherCheckSpendable": "read", + "PaychVoucherCheckValid": "read", + "PaychVoucherCreate": "sign", + "PaychVoucherList": "write", + "PaychVoucherSubmit": "sign", + "StateAccountKey": "read", + "StateCall": "read", + "StateCirculatingSupply": "read", + "StateDealProviderCollateralBounds": "read", + "StateGetActor": "read", + "StateGetReceipt": "read", + "StateListActors": "read", + "StateListMiners": "read", + "StateLookupID": "read", + "StateMarketBalance": "read", + "StateMarketDeals": "read", + "StateMarketParticipants": "read", + "StateMarketStorageDeal": "read", + "StateMinerActiveSectors": "read", + "StateMinerAvailableBalance": "read", + "StateMinerDeadlines": "read", + "StateMinerFaults": "read", + "StateMinerInfo": "read", + "StateMinerInitialPledgeCollateral": "read", + "StateMinerPartitions": "read", + "StateMinerPower": "read", + "StateMinerPreCommitDepositForPower": "read", + "StateMinerProvingDeadline": "read", + "StateMinerRecoveries": "read", + "StateMinerSectorAllocated": "read", + "StateMinerSectorCount": "read", + "StateMinerSectors": "read", + "StateNetworkName": "read", + "StateNetworkVersion": "read", + "StateSearchMsg": "read", + "StateSearchMsgLimited": "read", + "StateSectorExpiration": "read", + "StateSectorGetInfo": "read", + "StateSectorPartition": "read", + "StateSectorPreCommitInfo": "read", + "StateVMCirculatingSupplyInternal": "read", + "StateVerifiedClientStatus": "read", + "StateVerifiedRegistryRootKey": "read", + "StateVerifierStatus": "read", + "StateWaitMsg": "read", + "StateWaitMsgLimited": "read", + "SyncState": "read", + "SyncSubmitBlock": "write", + "Version": "read", + "WalletBalance": "read", + "WalletDefaultAddress": "write", + "WalletExport": "admin", + "WalletHas": "write", + "WalletImport": "admin", + "WalletSetDefault": "write", + "WalletSign": "sign", + "WalletSignMessage": "sign" + }, + "Extend": { + "BlockTime": "read", + "ChainGetReceipts": "read", + "ChainList": "read", + "ChainSyncHandleNewTipSet": "write", + "Concurrent": "read", + "ConfigGet": "read", + "ConfigSet": "admin", + "DAGCat": "read", + "DAGGetFileSize": "read", + "DAGGetNode": "read", + "DAGImportData": "write", + "GasBatchEstimateMessageGas": "read", + "GetActor": "read", + "GetEntry": "read", + "GetFullBlock": "read", + "GetParentStateRootActor": "read", + "HasPassword": "admin", + "ListActor": "read", + "LockWallet": "admin", + "MessageWait": "read", + "MpoolDeleteByAdress": "admin", + "MpoolPublishByAddr": "write", + "MpoolPublishMessage": "write", + "MpoolSelects": "read", + "NetworkConnect": "read", + "NetworkFindPeer": "read", + "NetworkFindProvidersAsync": "read", + "NetworkGetBandwidthStats": "admin", + "NetworkGetClosestPeers": "admin", + "NetworkGetPeerAddresses": "admin", + "NetworkGetPeerID": "admin", + "NetworkPeers": "read", + "ProtocolParameters": "read", + "ResolveToKeyAddr": "read", + "SetConcurrent": "admin", + "SetPassword": "admin", + "StateMinerSectorSize": "read", + "StateMinerWorkerAddress": "read", + "SyncerTracker": "read", + "UnLockWallet": "admin", + "Verify": "read", + "VerifyEntry": "read", + "WalletAddresses": "admin", + "WalletNewAddress": "write", + "WalletState": "admin" + }, + "Loss": { + "AuthVerify": "read", + "ChainGetGenesis": "read", + "ChainGetNode": "read", + "ClientCalcCommP": "write", + "ClientCancelDataTransfer": "write", + "ClientCancelRetrievalDeal": "write", + "ClientDataTransferUpdates": "write", + "ClientDealPieceCID": "read", + "ClientDealSize": "read", + "ClientFindData": "read", + "ClientGenCar": "write", + "ClientGetDealInfo": "read", + "ClientGetDealStatus": "read", + "ClientGetDealUpdates": "write", + "ClientGetRetrievalUpdates": "write", + "ClientHasLocal": "write", + "ClientImport": "admin", + "ClientListDataTransfers": "write", + "ClientListDeals": "write", + "ClientListImports": "write", + "ClientListRetrievals": "write", + "ClientMinerQueryOffer": "read", + "ClientQueryAsk": "read", + "ClientRemoveImport": "admin", + "ClientRestartDataTransfer": "write", + "ClientRetrieve": "admin", + "ClientRetrieveTryRestartInsufficientFunds": "write", + "ClientRetrieveWithEvents": "admin", + "ClientStartDeal": "admin", + "ClientStatelessDeal": "write", + "Closing": "read", + "CreateBackup": "admin", + "Discover": "read", + "ID": "read", + "LogAlerts": "admin", + "LogList": "write", + "LogSetLevel": "write", + "MarketAddBalance": "sign", + "MarketGetReserved": "sign", + "MarketReleaseFunds": "sign", + "MarketReserveFunds": "sign", + "MarketWithdraw": "sign", + "MsigGetAvailableBalance": "read", + "MsigGetPending": "read", + "MsigGetVestingSchedule": "read", + "NetAgentVersion": "read", + "NetAutoNatStatus": "read", + "NetBandwidthStats": "read", + "NetBandwidthStatsByPeer": "read", + "NetBandwidthStatsByProtocol": "read", + "NetBlockAdd": "admin", + "NetBlockList": "read", + "NetBlockRemove": "admin", + "NetConnect": "write", + "NetConnectedness": "read", + "NetDisconnect": "write", + "NetFindPeer": "read", + "NetPeerInfo": "read", + "NetPeers": "read", + "NetPubsubScores": "read", + "Session": "read", + "Shutdown": "admin", + "StateAllMinerFaults": "read", + "StateChangedActors": "read", + "StateCompute": "read", + "StateDecodeParams": "read", + "StateGetRandomnessFromBeacon": "read", + "StateGetRandomnessFromTickets": "read", + "StateListMessages": "read", + "StateReadState": "read", + "StateReplay": "read", + "SyncCheckBad": "read", + "SyncCheckpoint": "admin", + "SyncIncomingBlocks": "read", + "SyncMarkBad": "admin", + "SyncUnmarkAllBad": "admin", + "SyncUnmarkBad": "admin", + "SyncValidateTipset": "read", + "WalletDelete": "admin", + "WalletList": "write", + "WalletNew": "write", + "WalletValidateAddress": "read", + "WalletVerify": "read" + }, + "Gap": {} + }, + "V1": { + "Common": { + "AuthNew": "admin", + "BeaconGetEntry": "read", + "ChainDeleteObj": "admin", + "ChainExport": "read", + "ChainGetBlock": "read", + "ChainGetBlockMessages": "read", + "ChainGetMessage": "read", + "ChainGetMessagesInTipset": "read", + "ChainGetParentMessages": "read", + "ChainGetParentReceipts": "read", + "ChainGetPath": "read", + "ChainGetTipSet": "read", + "ChainGetTipSetAfterHeight": "read", + "ChainGetTipSetByHeight": "read", + "ChainHasObj": "read", + "ChainHead": "read", + "ChainNotify": "read", + "ChainReadObj": "read", + "ChainSetHead": "admin", + "ChainStatObj": "read", + "ChainTipSetWeight": "read", + "GasEstimateFeeCap": "read", + "GasEstimateGasLimit": "read", + "GasEstimateGasPremium": "read", + "GasEstimateMessageGas": "read", + "MinerCreateBlock": "write", + "MinerGetBaseInfo": "read", + "MpoolBatchPush": "write", + "MpoolBatchPushMessage": "sign", + "MpoolBatchPushUntrusted": "write", + "MpoolCheckMessages": "read", + "MpoolCheckPendingMessages": "read", + "MpoolCheckReplaceMessages": "read", + "MpoolClear": "write", + "MpoolGetConfig": "read", + "MpoolGetNonce": "read", + "MpoolPending": "read", + "MpoolPush": "write", + "MpoolPushMessage": "sign", + "MpoolPushUntrusted": "write", + "MpoolSelect": "read", + "MpoolSetConfig": "admin", + "MpoolSub": "read", + "MsigAddApprove": "sign", + "MsigAddCancel": "sign", + "MsigAddPropose": "sign", + "MsigApprove": "sign", + "MsigApproveTxnHash": "sign", + "MsigCancel": "sign", + "MsigCreate": "sign", + "MsigGetVested": "read", + "MsigPropose": "sign", + "MsigRemoveSigner": "sign", + "MsigSwapApprove": "sign", + "MsigSwapCancel": "sign", + "MsigSwapPropose": "sign", + "NetAddrsListen": "read", + "PaychAllocateLane": "sign", + "PaychAvailableFunds": "sign", + "PaychAvailableFundsByFromTo": "sign", + "PaychCollect": "sign", + "PaychGet": "sign", + "PaychGetWaitReady": "sign", + "PaychList": "read", + "PaychNewPayment": "sign", + "PaychSettle": "sign", + "PaychStatus": "read", + "PaychVoucherAdd": "write", + "PaychVoucherCheckSpendable": "read", + "PaychVoucherCheckValid": "read", + "PaychVoucherCreate": "sign", + "PaychVoucherList": "write", + "PaychVoucherSubmit": "sign", + "StateAccountKey": "read", + "StateCall": "read", + "StateCirculatingSupply": "read", + "StateDealProviderCollateralBounds": "read", + "StateGetActor": "read", + "StateGetRandomnessFromBeacon": "read", + "StateGetRandomnessFromTickets": "read", + "StateListActors": "read", + "StateListMiners": "read", + "StateLookupID": "read", + "StateMarketBalance": "read", + "StateMarketDeals": "read", + "StateMarketParticipants": "read", + "StateMarketStorageDeal": "read", + "StateMinerActiveSectors": "read", + "StateMinerAvailableBalance": "read", + "StateMinerDeadlines": "read", + "StateMinerFaults": "read", + "StateMinerInfo": "read", + "StateMinerInitialPledgeCollateral": "read", + "StateMinerPartitions": "read", + "StateMinerPower": "read", + "StateMinerPreCommitDepositForPower": "read", + "StateMinerProvingDeadline": "read", + "StateMinerRecoveries": "read", + "StateMinerSectorAllocated": "read", + "StateMinerSectorCount": "read", + "StateMinerSectors": "read", + "StateNetworkName": "read", + "StateNetworkVersion": "read", + "StateSearchMsg": "read", + "StateSectorExpiration": "read", + "StateSectorGetInfo": "read", + "StateSectorPartition": "read", + "StateSectorPreCommitInfo": "read", + "StateVMCirculatingSupplyInternal": "read", + "StateVerifiedClientStatus": "read", + "StateVerifiedRegistryRootKey": "read", + "StateVerifierStatus": "read", + "StateWaitMsg": "read", + "SyncState": "read", + "SyncSubmitBlock": "write", + "Version": "read", + "WalletBalance": "read", + "WalletDefaultAddress": "write", + "WalletExport": "admin", + "WalletHas": "write", + "WalletImport": "admin", + "WalletSetDefault": "write", + "WalletSign": "sign", + "WalletSignMessage": "sign" + }, + "Extend": { + "BlockTime": "read", + "ChainGetRandomnessFromBeacon": "read", + "ChainGetRandomnessFromTickets": "read", + "ChainGetReceipts": "read", + "ChainList": "read", + "ChainSyncHandleNewTipSet": "write", + "Concurrent": "read", + "ConfigGet": "read", + "ConfigSet": "admin", + "DAGCat": "read", + "DAGGetFileSize": "read", + "DAGGetNode": "read", + "DAGImportData": "write", + "GasBatchEstimateMessageGas": "read", + "GetActor": "read", + "GetEntry": "read", + "GetFullBlock": "read", + "GetParentStateRootActor": "read", + "HasPassword": "admin", + "ListActor": "read", + "LockWallet": "admin", + "MessageWait": "read", + "MpoolDeleteByAdress": "admin", + "MpoolPublishByAddr": "write", + "MpoolPublishMessage": "write", + "MpoolSelects": "read", + "NetworkConnect": "read", + "NetworkFindPeer": "read", + "NetworkFindProvidersAsync": "read", + "NetworkGetBandwidthStats": "admin", + "NetworkGetClosestPeers": "read", + "NetworkGetPeerAddresses": "admin", + "NetworkGetPeerID": "admin", + "NetworkPeers": "read", + "ProtocolParameters": "read", + "ResolveToKeyAddr": "read", + "SetConcurrent": "admin", + "SetPassword": "admin", + "StateMinerSectorSize": "read", + "StateMinerWorkerAddress": "read", + "SyncerTracker": "read", + "UnLockWallet": "admin", + "Verify": "read", + "VerifyEntry": "read", + "WalletAddresses": "admin", + "WalletNewAddress": "write", + "WalletState": "admin" + }, + "Loss": { + "AuthVerify": "read", + "ChainBlockstoreInfo": "read", + "ChainCheckBlockstore": "admin", + "ChainGetGenesis": "read", + "ChainGetNode": "read", + "ClientCalcCommP": "write", + "ClientCancelDataTransfer": "write", + "ClientCancelRetrievalDeal": "write", + "ClientDataTransferUpdates": "write", + "ClientDealPieceCID": "read", + "ClientDealSize": "read", + "ClientFindData": "read", + "ClientGenCar": "write", + "ClientGetDealInfo": "read", + "ClientGetDealStatus": "read", + "ClientGetDealUpdates": "write", + "ClientGetRetrievalUpdates": "write", + "ClientHasLocal": "write", + "ClientImport": "admin", + "ClientListDataTransfers": "write", + "ClientListDeals": "write", + "ClientListImports": "write", + "ClientListRetrievals": "write", + "ClientMinerQueryOffer": "read", + "ClientQueryAsk": "read", + "ClientRemoveImport": "admin", + "ClientRestartDataTransfer": "write", + "ClientRetrieve": "admin", + "ClientRetrieveTryRestartInsufficientFunds": "write", + "ClientRetrieveWithEvents": "admin", + "ClientStartDeal": "admin", + "ClientStatelessDeal": "write", + "Closing": "read", + "CreateBackup": "admin", + "Discover": "read", + "ID": "read", + "LogAlerts": "admin", + "LogList": "write", + "LogSetLevel": "write", + "MarketAddBalance": "sign", + "MarketGetReserved": "sign", + "MarketReleaseFunds": "sign", + "MarketReserveFunds": "sign", + "MarketWithdraw": "sign", + "MsigGetAvailableBalance": "read", + "MsigGetPending": "read", + "MsigGetVestingSchedule": "read", + "NetAgentVersion": "read", + "NetAutoNatStatus": "read", + "NetBandwidthStats": "read", + "NetBandwidthStatsByPeer": "read", + "NetBandwidthStatsByProtocol": "read", + "NetBlockAdd": "admin", + "NetBlockList": "read", + "NetBlockRemove": "admin", + "NetConnect": "write", + "NetConnectedness": "read", + "NetDisconnect": "write", + "NetFindPeer": "read", + "NetPeerInfo": "read", + "NetPeers": "read", + "NetPubsubScores": "read", + "NodeStatus": "read", + "Session": "read", + "Shutdown": "admin", + "StateAllMinerFaults": "read", + "StateChangedActors": "read", + "StateCompute": "read", + "StateDecodeParams": "read", + "StateEncodeParams": "read", + "StateListMessages": "read", + "StateReadState": "read", + "StateReplay": "read", + "SyncCheckBad": "read", + "SyncCheckpoint": "admin", + "SyncIncomingBlocks": "read", + "SyncMarkBad": "admin", + "SyncUnmarkAllBad": "admin", + "SyncUnmarkBad": "admin", + "SyncValidateTipset": "read", + "WalletDelete": "admin", + "WalletList": "write", + "WalletNew": "write", + "WalletValidateAddress": "read", + "WalletVerify": "read" + }, + "Gap": {} + } +} \ No newline at end of file diff --git a/venus-shared/api/chain/v1/types.go b/venus-shared/api/chain/types.go similarity index 99% rename from venus-shared/api/chain/v1/types.go rename to venus-shared/api/chain/types.go index c4622d176f..7cf1552e71 100644 --- a/venus-shared/api/chain/v1/types.go +++ b/venus-shared/api/chain/types.go @@ -1,4 +1,4 @@ -package v1 +package chain import ( "fmt" diff --git a/venus-shared/api/chain/v0/blockstore.go b/venus-shared/api/chain/v0/blockstore.go new file mode 100644 index 0000000000..62aef247d5 --- /dev/null +++ b/venus-shared/api/chain/v0/blockstore.go @@ -0,0 +1,20 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/venus/venus-shared/api/chain" + + "github.com/ipfs/go-cid" +) + +type IBlockStore interface { + // Rule[perm:read] + ChainReadObj(ctx context.Context, ocid cid.Cid) ([]byte, error) + // Rule[perm:admin] + ChainDeleteObj(ctx context.Context, obj cid.Cid) error + // Rule[perm:read] + ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) + // Rule[perm:read] + ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (chain.ObjStat, error) +} diff --git a/venus-shared/api/chain/v0/chain.go b/venus-shared/api/chain/v0/chain.go new file mode 100644 index 0000000000..4cbb1ddba1 --- /dev/null +++ b/venus-shared/api/chain/v0/chain.go @@ -0,0 +1,180 @@ +package v0api + +import ( + "context" + "time" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + acrypto "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/dline" + "github.com/filecoin-project/go-state-types/network" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" + "github.com/filecoin-project/venus/venus-shared/chain" +) + +type IChain interface { + IAccount + IActor + IBeacon + IMinerState + IChainInfo +} + +type IAccount interface { + // Rule[perm:read] + StateAccountKey(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (address.Address, error) +} + +type IActor interface { + // Rule[perm:read] + StateGetActor(ctx context.Context, actor address.Address, tsk chain.TipSetKey) (*chain.Actor, error) + // Rule[perm:read] + ListActor(ctx context.Context) (map[address.Address]*chain.Actor, error) +} + +type IBeacon interface { + // Rule[perm:read] + BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*chain.BeaconEntry, error) +} + +type IChainInfo interface { + // Rule[perm:read] + BlockTime(ctx context.Context) time.Duration + // Rule[perm:read] + ChainList(ctx context.Context, tsKey chain.TipSetKey, count int) ([]chain.TipSetKey, error) + // Rule[perm:read] + ChainHead(ctx context.Context) (*chain.TipSet, error) + // Rule[perm:admin] + ChainSetHead(ctx context.Context, key chain.TipSetKey) error + // Rule[perm:read] + ChainGetTipSet(ctx context.Context, key chain.TipSetKey) (*chain.TipSet, error) + // Rule[perm:read] + ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk chain.TipSetKey) (*chain.TipSet, error) + // Rule[perm:read] + ChainGetRandomnessFromBeacon(ctx context.Context, key chain.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) + // Rule[perm:read] + ChainGetRandomnessFromTickets(ctx context.Context, tsk chain.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) + // Rule[perm:read] + ChainGetBlock(ctx context.Context, id cid.Cid) (*chain.BlockHeader, error) + // Rule[perm:read] + ChainGetMessage(ctx context.Context, msgID cid.Cid) (*chain.Message, error) + // Rule[perm:read] + ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*chain2.BlockMessages, error) + // Rule[perm:read] + ChainGetMessagesInTipset(ctx context.Context, key chain.TipSetKey) ([]chain2.Message, error) + // Rule[perm:read] + ChainGetReceipts(ctx context.Context, id cid.Cid) ([]chain.MessageReceipt, error) + // Rule[perm:read] + ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]chain2.Message, error) + // Rule[perm:read] + ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*chain.MessageReceipt, error) + //Rule[perm:read] + StateVerifiedRegistryRootKey(ctx context.Context, tsk chain.TipSetKey) (address.Address, error) + // Rule[perm:read] + StateVerifierStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) + // Rule[perm:read] + ChainNotify(ctx context.Context) (<-chan []*chain2.HeadChange, error) + // Rule[perm:read] + GetFullBlock(ctx context.Context, id cid.Cid) (*chain.FullBlock, error) + // Rule[perm:read] + GetActor(ctx context.Context, addr address.Address) (*chain.Actor, error) + // Rule[perm:read] + GetParentStateRootActor(ctx context.Context, ts *chain.TipSet, addr address.Address) (*chain.Actor, error) + // Rule[perm:read] + GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*chain.BeaconEntry, error) + // Rule[perm:read] + MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*chain2.ChainMessage, error) + // Rule[perm:read] + ProtocolParameters(ctx context.Context) (*chain2.ProtocolParams, error) + // Rule[perm:read] + ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *chain.TipSet) (address.Address, error) + // Rule[perm:read] + StateNetworkName(ctx context.Context) (chain2.NetworkName, error) + // Rule[perm:read] + StateGetReceipt(ctx context.Context, msg cid.Cid, from chain.TipSetKey) (*chain.MessageReceipt, error) + // Rule[perm:read] + StateSearchMsg(ctx context.Context, msg cid.Cid) (*chain2.MsgLookup, error) + // Rule[perm:read] + StateSearchMsgLimited(ctx context.Context, cid cid.Cid, limit abi.ChainEpoch) (*chain2.MsgLookup, error) + // Rule[perm:read] + StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64) (*chain2.MsgLookup, error) + // Rule[perm:read] + StateWaitMsgLimited(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch) (*chain2.MsgLookup, error) + // Rule[perm:read] + StateNetworkVersion(ctx context.Context, tsk chain.TipSetKey) (network.Version, error) + // Rule[perm:read] + VerifyEntry(parent, child *chain.BeaconEntry, height abi.ChainEpoch) bool + // Rule[perm:read] + ChainExport(context.Context, abi.ChainEpoch, bool, chain.TipSetKey) (<-chan []byte, error) + // Rule[perm:read] + ChainGetPath(ctx context.Context, from chain.TipSetKey, to chain.TipSetKey) ([]*chain2.HeadChange, error) +} + +type IMinerState interface { + // Rule[perm:read] + StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk chain.TipSetKey) (bool, error) + // Rule[perm:read] + StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) + // Rule[perm:read] + StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorOnChainInfo, error) + // Rule[perm:read] + StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorLocation, error) + // Rule[perm:read] + StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (abi.SectorSize, error) + // Rule[perm:read] + StateMinerInfo(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (miner.MinerInfo, error) + // Rule[perm:read] + StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (address.Address, error) + // Rule[perm:read] + StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (bitfield.BitField, error) + // Rule[perm:read] + StateMinerFaults(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (bitfield.BitField, error) + // Rule[perm:read] + StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (*dline.Info, error) + // Rule[perm:read] + StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk chain.TipSetKey) ([]chain2.Partition, error) + // Rule[perm:read] + StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]chain2.Deadline, error) + // Rule[perm:read] + StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) + // Rule[perm:read] + StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk chain.TipSetKey) (*chain2.MarketDeal, error) + // Rule[perm:read] + StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) + // Rule[perm:read] + StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) + // Rule[perm:read] + StateVMCirculatingSupplyInternal(ctx context.Context, tsk chain.TipSetKey) (chain.CirculatingSupply, error) + // Rule[perm:read] + StateCirculatingSupply(ctx context.Context, tsk chain.TipSetKey) (abi.TokenAmount, error) + // Rule[perm:read] + StateMarketDeals(ctx context.Context, tsk chain.TipSetKey) (map[string]chain2.MarketDeal, error) + // Rule[perm:read] + StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) + // Rule[perm:read] + StateLookupID(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (address.Address, error) + // Rule[perm:read] + StateListMiners(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) + // Rule[perm:read] + StateListActors(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) + // Rule[perm:read] + StateMinerPower(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*chain2.MinerPower, error) + // Rule[perm:read] + StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (big.Int, error) + // Rule[perm:read] + StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorExpiration, error) + // Rule[perm:read] + StateMinerSectorCount(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (chain2.MinerSectors, error) + // Rule[perm:read] + StateMarketBalance(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (chain2.MarketBalance, error) + // Rule[perm:read] + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk chain.TipSetKey) (chain2.DealCollateralBounds, error) + // Rule[perm:read] + StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) +} diff --git a/venus-shared/api/chain/v0/discovery.go b/venus-shared/api/chain/v0/discovery.go new file mode 100644 index 0000000000..2e92f5579e --- /dev/null +++ b/venus-shared/api/chain/v0/discovery.go @@ -0,0 +1,4 @@ +package v0api + +type IDiscovery interface { +} diff --git a/venus-shared/api/chain/v0/fullnode.go b/venus-shared/api/chain/v0/fullnode.go new file mode 100644 index 0000000000..d9b7162fdd --- /dev/null +++ b/venus-shared/api/chain/v0/fullnode.go @@ -0,0 +1,29 @@ +/* +in api interface, you can add comment tags to the function +Note: +Rule[perm:admin,ignore:true] +perm: read,write,sign,admin +jwt token permission check +ignore: bool +the func in the api whether needs to be added to the client for external exposure + +TODO: +1. Support global FUNC injection + +*/ +package v0api + +type FullNode interface { + IBlockStore + IChain + IDiscovery + IMarket + IMining + IMessagePool + IMultiSig + INetwork + IPaychan + ISyncer + IWallet + IJwtAuthAPI +} diff --git a/venus-shared/api/chain/v0/jwtauth.go b/venus-shared/api/chain/v0/jwtauth.go new file mode 100644 index 0000000000..6c52109f92 --- /dev/null +++ b/venus-shared/api/chain/v0/jwtauth.go @@ -0,0 +1,14 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/go-jsonrpc/auth" +) + +type IJwtAuthAPI interface { + // Rule[perm:read] + Verify(ctx context.Context, host, token string) ([]auth.Permission, error) + // Rule[perm:admin] + AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) +} diff --git a/venus-shared/api/chain/v0/market.go b/venus-shared/api/chain/v0/market.go new file mode 100644 index 0000000000..e5083d087c --- /dev/null +++ b/venus-shared/api/chain/v0/market.go @@ -0,0 +1,13 @@ +package v0api + +import ( + "context" + + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" + "github.com/filecoin-project/venus/venus-shared/chain" +) + +type IMarket interface { + // Rule[perm:read] + StateMarketParticipants(ctx context.Context, tsk chain.TipSetKey) (map[string]chain2.MarketBalance, error) //perm:admin +} diff --git a/venus-shared/api/chain/v0/mining.go b/venus-shared/api/chain/v0/mining.go new file mode 100644 index 0000000000..977b58d5d7 --- /dev/null +++ b/venus-shared/api/chain/v0/mining.go @@ -0,0 +1,18 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" + "github.com/filecoin-project/venus/venus-shared/chain" +) + +type IMining interface { + // Rule[perm:read] + MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk chain.TipSetKey) (*chain2.MiningBaseInfo, error) + // Rule[perm:write] + MinerCreateBlock(ctx context.Context, bt *chain2.BlockTemplate) (*chain.BlockMsg, error) +} diff --git a/venus-shared/api/chain/v0/mpool.go b/venus-shared/api/chain/v0/mpool.go new file mode 100644 index 0000000000..1c7c8c64e0 --- /dev/null +++ b/venus-shared/api/chain/v0/mpool.go @@ -0,0 +1,60 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/big" + "github.com/ipfs/go-cid" + + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/messagepool" +) + +type IMessagePool interface { + // Rule[perm:admin] + MpoolDeleteByAdress(ctx context.Context, addr address.Address) error + // Rule[perm:admin] + MpoolPublishByAddr(context.Context, address.Address) error + // Rule[perm:admin] + MpoolPublishMessage(ctx context.Context, smsg *chain.SignedMessage) error + // Rule[perm:write] + MpoolPush(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) + // Rule[perm:read] + MpoolGetConfig(context.Context) (*messagepool.MpoolConfig, error) + // Rule[perm:admin] + MpoolSetConfig(ctx context.Context, cfg *messagepool.MpoolConfig) error + // Rule[perm:read] + MpoolSelect(context.Context, chain.TipSetKey, float64) ([]*chain.SignedMessage, error) + // Rule[perm:read] + MpoolSelects(context.Context, chain.TipSetKey, []float64) ([][]*chain.SignedMessage, error) + // Rule[perm:read] + MpoolPending(ctx context.Context, tsk chain.TipSetKey) ([]*chain.SignedMessage, error) + // Rule[perm:write] + MpoolClear(ctx context.Context, local bool) error + // Rule[perm:write] + MpoolPushUntrusted(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) + // Rule[perm:sign] + MpoolPushMessage(ctx context.Context, msg *chain.Message, spec *chain2.MessageSendSpec) (*chain.SignedMessage, error) + // Rule[perm:write] + MpoolBatchPush(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) + // Rule[perm:write] + MpoolBatchPushUntrusted(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) + // Rule[perm:sign] + MpoolBatchPushMessage(ctx context.Context, msgs []*chain.Message, spec *chain2.MessageSendSpec) ([]*chain.SignedMessage, error) + // Rule[perm:read] + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) + // Rule[perm:read] + MpoolSub(ctx context.Context) (<-chan messagepool.MpoolUpdate, error) + // Rule[perm:read] + GasEstimateMessageGas(ctx context.Context, msg *chain.Message, spec *chain2.MessageSendSpec, tsk chain.TipSetKey) (*chain.Message, error) + // Rule[perm:read] + GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*chain2.EstimateMessage, fromNonce uint64, tsk chain.TipSetKey) ([]*chain2.EstimateResult, error) + // Rule[perm:read] + GasEstimateFeeCap(ctx context.Context, msg *chain.Message, maxqueueblks int64, tsk chain.TipSetKey) (big.Int, error) + // Rule[perm:read] + GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk chain.TipSetKey) (big.Int, error) + // Rule[perm:read] + GasEstimateGasLimit(ctx context.Context, msgIn *chain.Message, tsk chain.TipSetKey) (int64, error) +} diff --git a/venus-shared/api/chain/v0/multisig.go b/venus-shared/api/chain/v0/multisig.go new file mode 100644 index 0000000000..54930f7d5a --- /dev/null +++ b/venus-shared/api/chain/v0/multisig.go @@ -0,0 +1,44 @@ +package v0api + +import ( + "context" + + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/venus/venus-shared/chain" +) + +type IMultiSig interface { + // MsigCreate creates a multisig wallet + // It takes the following params: , , + //, , + // Rule[perm:sign] + MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, chain.BigInt, address.Address, chain.BigInt) (cid.Cid, error) + // Rule[perm:sign] + MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) + // Rule[perm:sign] + MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (cid.Cid, error) + // Rule[perm:sign] + MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (cid.Cid, error) + // Rule[perm:sign] + MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (cid.Cid, error) + // Rule[perm:sign] + MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) + // Rule[perm:sign] + MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) + // Rule[perm:sign] + MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) + // Rule[perm:sign] + MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (cid.Cid, error) + // Rule[perm:sign] + MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) + // Rule[perm:sign] + MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) + // Rule[perm:sign] + MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (cid.Cid, error) + // Rule[perm:read] + MsigGetVested(ctx context.Context, addr address.Address, start chain.TipSetKey, end chain.TipSetKey) (chain.BigInt, error) +} diff --git a/venus-shared/api/chain/v0/network.go b/venus-shared/api/chain/v0/network.go new file mode 100644 index 0000000000..fa7df7c102 --- /dev/null +++ b/venus-shared/api/chain/v0/network.go @@ -0,0 +1,36 @@ +package v0api + +import ( + "context" + + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/metrics" + "github.com/libp2p/go-libp2p-core/peer" + ma "github.com/multiformats/go-multiaddr" + + "github.com/filecoin-project/venus/venus-shared/api/chain" + "github.com/filecoin-project/venus/venus-shared/libp2p/net" +) + +type INetwork interface { + // Rule[perm:admin] + NetworkGetBandwidthStats(ctx context.Context) metrics.Stats + // Rule[perm:admin] + NetworkGetPeerAddresses(ctx context.Context) []ma.Multiaddr + // Rule[perm:admin] + NetworkGetPeerID(ctx context.Context) peer.ID + // Rule[perm:read] + NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo + // Rule[perm:read] + NetworkGetClosestPeers(ctx context.Context, key string) (<-chan peer.ID, error) + // Rule[perm:read] + NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) + // Rule[perm:read] + NetworkConnect(ctx context.Context, addrs []string) (<-chan net.ConnectionResult, error) + // Rule[perm:read] + NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) + // Rule[perm:read] + Version(context.Context) (chain.Version, error) + // Rule[perm:read] + NetAddrsListen(context.Context) (peer.AddrInfo, error) +} diff --git a/venus-shared/api/chain/v0/paych.go b/venus-shared/api/chain/v0/paych.go new file mode 100644 index 0000000000..e07a5e0c48 --- /dev/null +++ b/venus-shared/api/chain/v0/paych.go @@ -0,0 +1,99 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/big" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/api/chain" + "github.com/filecoin-project/venus/venus-shared/paych" +) + +type IPaychan interface { + // PaychGet creates a payment channel to a provider with a amount of FIL + // @from: the payment channel sender + // @to: the payment channel recipient + // @amt: the deposits funds in the payment channel + // Rule[perm:sign] + PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*paych.ChannelInfo, error) + // PaychAvailableFunds get the status of an outbound payment channel + // @pch: payment channel address + // Rule[perm:sign] + PaychAvailableFunds(ctx context.Context, ch address.Address) (*chain.ChannelAvailableFunds, error) + // PaychAvailableFundsByFromTo get the status of an outbound payment channel + // @from: the payment channel sender + // @to: he payment channel recipient + // Rule[perm:sign] + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*chain.ChannelAvailableFunds, error) + // PaychGetWaitReady waits until the create channel / add funds message with the sentinel + // @sentinel: given message CID arrives. + // @ch: the returned channel address can safely be used against the Manager methods. + // Rule[perm:sign] + PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (address.Address, error) + // PaychAllocateLane Allocate late creates a lane within a payment channel so that calls to + // CreatePaymentVoucher will automatically make vouchers only for the difference in total + // Rule[perm:sign] + PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) + // PaychNewPayment aggregate vouchers into a new lane + // @from: the payment channel sender + // @to: the payment channel recipient + // @vouchers: the outstanding (non-redeemed) vouchers + // Rule[perm:sign] + PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []paych.VoucherSpec) (*paych.PaymentInfo, error) + // PaychList list the addresses of all channels that have been created + // Rule[perm:read] + PaychList(ctx context.Context) ([]address.Address, error) + // PaychStatus get the payment channel status + // @pch: payment channel address + // Rule[perm:read] + PaychStatus(ctx context.Context, pch address.Address) (*paych.Status, error) + // PaychSettle update payment channel status to settle + // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain + // @pch: payment channel address + // Rule[perm:sign] + PaychSettle(ctx context.Context, addr address.Address) (cid.Cid, error) + // PaychCollect update payment channel status to collect + // Collect sends the value of submitted vouchers to the channel recipient (the provider), + // and refunds the remaining channel balance to the channel creator (the client). + // @pch: payment channel address + // Rule[perm:sign] + PaychCollect(ctx context.Context, addr address.Address) (cid.Cid, error) + + // PaychVoucherCheckValid checks if the given voucher is valid (is or could become spendable at some point). + // If the channel is not in the store, fetches the channel from state (and checks that + // the channel To address is owned by the wallet). + // @pch: payment channel address + // @sv: voucher + // Rule[perm:read] + PaychVoucherCheckValid(ctx context.Context, ch address.Address, sv *paych.SignedVoucher) error + // PaychVoucherCheckSpendable checks if the given voucher is currently spendable + // @pch: payment channel address + // @sv: voucher + // Rule[perm:read] + PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (bool, error) + // PaychVoucherAdd adds a voucher for an inbound channel. + // If the channel is not in the store, fetches the channel from state (and checks that + // the channel To address is owned by the wallet). + // Rule[perm:write] + PaychVoucherAdd(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) + // PaychVoucherCreate creates a new signed voucher on the given payment channel + // with the given lane and amount. The value passed in is exactly the value + // that will be used to create the voucher, so if previous vouchers exist, the + // actual additional value of this voucher will only be the difference between + // the two. + // If there are insufficient funds in the channel to create the voucher, + // returns a nil voucher and the shortfall. + // Rule[perm:sign] + PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paych.VoucherCreateResult, error) + // PaychVoucherList list vouchers in payment channel + // @pch: payment channel address + // Rule[perm:write] + PaychVoucherList(ctx context.Context, pch address.Address) ([]*paych.SignedVoucher, error) + // PaychVoucherSubmit Submit voucher to chain to update payment channel state + // @pch: payment channel address + // @sv: voucher in payment channel + // Rule[perm:sign] + PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) +} diff --git a/venus-shared/api/chain/v0/syncer.go b/venus-shared/api/chain/v0/syncer.go new file mode 100644 index 0000000000..60932dc8f9 --- /dev/null +++ b/venus-shared/api/chain/v0/syncer.go @@ -0,0 +1,31 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/go-state-types/big" + + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" + "github.com/filecoin-project/venus/venus-shared/chain" +) + +type ISyncer interface { + // Rule[perm:write] + ChainSyncHandleNewTipSet(ctx context.Context, ci *chain2.ChainInfo) error + // Rule[perm:admin] + SetConcurrent(ctx context.Context, concurrent int64) error + + // Rule[perm:read] + //SyncerTracker(ctx context.Context) *chain.TargetTracker + + // Rule[perm:read] + Concurrent(ctx context.Context) int64 + // Rule[perm:read] + ChainTipSetWeight(ctx context.Context, tsk chain.TipSetKey) (big.Int, error) + // Rule[perm:write] + SyncSubmitBlock(ctx context.Context, blk *chain.BlockMsg) error + // Rule[perm:read] + StateCall(ctx context.Context, msg *chain.Message, tsk chain.TipSetKey) (*chain2.InvocResult, error) + // Rule[perm:read] + SyncState(ctx context.Context) (*chain2.SyncState, error) +} diff --git a/venus-shared/api/chain/v0/wallet.go b/venus-shared/api/chain/v0/wallet.go new file mode 100644 index 0000000000..47f36a0c03 --- /dev/null +++ b/venus-shared/api/chain/v0/wallet.go @@ -0,0 +1,45 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + crypto "github.com/filecoin-project/go-state-types/crypto" + + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/wallet" +) + +type IWallet interface { + // Rule[perm:sign] + WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) + // Rule[perm:admin] + WalletExport(addr address.Address, password string) (*wallet.KeyInfo, error) + // Rule[perm:admin] + WalletImport(key *wallet.KeyInfo) (address.Address, error) + // Rule[perm:write] + WalletHas(ctx context.Context, addr address.Address) (bool, error) + // Rule[perm:write] + WalletNewAddress(protocol address.Protocol) (address.Address, error) + // Rule[perm:read] + WalletBalance(ctx context.Context, addr address.Address) (abi.TokenAmount, error) //not exists in remote + // Rule[perm:write] + WalletDefaultAddress(ctx context.Context) (address.Address, error) //not exists in remote + // Rule[perm:admin] + WalletAddresses(ctx context.Context) []address.Address + // Rule[perm:write] + WalletSetDefault(ctx context.Context, addr address.Address) error //not exists in remote + // Rule[perm:sign] + WalletSignMessage(ctx context.Context, k address.Address, msg *chain.Message) (*chain.SignedMessage, error) + // Rule[perm:admin] + LockWallet(ctx context.Context) error + // Rule[perm:admin] + UnLockWallet(ctx context.Context, password []byte) error + // Rule[perm:admin] + SetPassword(Context context.Context, password []byte) error + // Rule[perm:admin] + HasPassword(Context context.Context) bool + // Rule[perm:admin] + WalletState(Context context.Context) int +} diff --git a/venus-shared/api/chain/v1/blockstore.go b/venus-shared/api/chain/v1/blockstore.go index b49aefa1a4..6a28e6e050 100644 --- a/venus-shared/api/chain/v1/blockstore.go +++ b/venus-shared/api/chain/v1/blockstore.go @@ -3,16 +3,18 @@ package v1 import ( "context" + "github.com/filecoin-project/venus/venus-shared/api/chain" + "github.com/ipfs/go-cid" ) type IBlockStore interface { // Rule[perm:read] ChainReadObj(ctx context.Context, ocid cid.Cid) ([]byte, error) - // Rule[perm:read] + // Rule[perm:admin] ChainDeleteObj(ctx context.Context, obj cid.Cid) error // Rule[perm:read] ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) // Rule[perm:read] - ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (ObjStat, error) + ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (chain.ObjStat, error) } diff --git a/venus-shared/api/chain/v1/chain.go b/venus-shared/api/chain/v1/chain.go index 416c222eac..a926643c3f 100644 --- a/venus-shared/api/chain/v1/chain.go +++ b/venus-shared/api/chain/v1/chain.go @@ -14,6 +14,7 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/filecoin-project/venus/venus-shared/chain" ) @@ -49,7 +50,7 @@ type IChainInfo interface { ChainList(ctx context.Context, tsKey chain.TipSetKey, count int) ([]chain.TipSetKey, error) // Rule[perm:read] ChainHead(ctx context.Context) (*chain.TipSet, error) - // Rule[perm:read] + // Rule[perm:admin] ChainSetHead(ctx context.Context, key chain.TipSetKey) error // Rule[perm:read] ChainGetTipSet(ctx context.Context, key chain.TipSetKey) (*chain.TipSet, error) @@ -70,13 +71,13 @@ type IChainInfo interface { // Rule[perm:read] ChainGetMessage(ctx context.Context, msgID cid.Cid) (*chain.Message, error) // Rule[perm:read] - ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*BlockMessages, error) + ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*chain2.BlockMessages, error) // Rule[perm:read] - ChainGetMessagesInTipset(ctx context.Context, key chain.TipSetKey) ([]Message, error) + ChainGetMessagesInTipset(ctx context.Context, key chain.TipSetKey) ([]chain2.Message, error) // Rule[perm:read] ChainGetReceipts(ctx context.Context, id cid.Cid) ([]chain.MessageReceipt, error) // Rule[perm:read] - ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]Message, error) + ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]chain2.Message, error) // Rule[perm:read] ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*chain.MessageReceipt, error) // Rule[perm:read] @@ -84,7 +85,7 @@ type IChainInfo interface { // Rule[perm:read] StateVerifierStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) // Rule[perm:read] - ChainNotify(ctx context.Context) (<-chan []*HeadChange, error) + ChainNotify(ctx context.Context) (<-chan []*chain2.HeadChange, error) // Rule[perm:read] GetFullBlock(ctx context.Context, id cid.Cid) (*chain.FullBlock, error) // Rule[perm:read] @@ -94,13 +95,13 @@ type IChainInfo interface { // Rule[perm:read] GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*chain.BeaconEntry, error) // Rule[perm:read] - MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*ChainMessage, error) + MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*chain2.ChainMessage, error) // Rule[perm:read] - ProtocolParameters(ctx context.Context) (*ProtocolParams, error) + ProtocolParameters(ctx context.Context) (*chain2.ProtocolParams, error) // Rule[perm:read] ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *chain.TipSet) (address.Address, error) // Rule[perm:read] - StateNetworkName(ctx context.Context) (NetworkName, error) + StateNetworkName(ctx context.Context) (chain2.NetworkName, error) // StateSearchMsg looks back up to limit epochs in the chain for a message, and returns its receipt and the tipset where it was executed // // NOTE: If a replacing message is found on chain, this method will return @@ -118,7 +119,7 @@ type IChainInfo interface { // different signature, but with all other parameters matching (source/destination, // nonce, params, etc.) // Rule[perm:read] - StateSearchMsg(ctx context.Context, from chain.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*MsgLookup, error) + StateSearchMsg(ctx context.Context, from chain.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*chain2.MsgLookup, error) // StateWaitMsg looks back up to limit epochs in the chain for a message. // If not found, it blocks until the message arrives on chain, and gets to the // indicated confidence depth. @@ -138,7 +139,7 @@ type IChainInfo interface { // different signature, but with all other parameters matching (source/destination, // nonce, params, etc.) // Rule[perm:read] - StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*MsgLookup, error) + StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*chain2.MsgLookup, error) // Rule[perm:read] StateNetworkVersion(ctx context.Context, tsk chain.TipSetKey) (network.Version, error) // Rule[perm:read] @@ -146,7 +147,7 @@ type IChainInfo interface { // Rule[perm:read] ChainExport(context.Context, abi.ChainEpoch, bool, chain.TipSetKey) (<-chan []byte, error) // Rule[perm:read] - ChainGetPath(ctx context.Context, from chain.TipSetKey, to chain.TipSetKey) ([]*HeadChange, error) + ChainGetPath(ctx context.Context, from chain.TipSetKey, to chain.TipSetKey) ([]*chain2.HeadChange, error) } type IMinerState interface { @@ -171,13 +172,13 @@ type IMinerState interface { // Rule[perm:read] StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (*dline.Info, error) // Rule[perm:read] - StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk chain.TipSetKey) ([]Partition, error) + StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk chain.TipSetKey) ([]chain2.Partition, error) // Rule[perm:read] - StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]Deadline, error) + StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]chain2.Deadline, error) // Rule[perm:read] StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) // Rule[perm:read] - StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk chain.TipSetKey) (*MarketDeal, error) + StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk chain.TipSetKey) (*chain2.MarketDeal, error) // Rule[perm:read] StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) // Rule[perm:read] @@ -187,7 +188,7 @@ type IMinerState interface { // Rule[perm:read] StateCirculatingSupply(ctx context.Context, tsk chain.TipSetKey) (abi.TokenAmount, error) // Rule[perm:read] - StateMarketDeals(ctx context.Context, tsk chain.TipSetKey) (map[string]MarketDeal, error) + StateMarketDeals(ctx context.Context, tsk chain.TipSetKey) (map[string]chain2.MarketDeal, error) // Rule[perm:read] StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) // Rule[perm:read] @@ -197,17 +198,17 @@ type IMinerState interface { // Rule[perm:read] StateListActors(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) // Rule[perm:read] - StateMinerPower(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*MinerPower, error) + StateMinerPower(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*chain2.MinerPower, error) // Rule[perm:read] StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (big.Int, error) // Rule[perm:read] StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorExpiration, error) // Rule[perm:read] - StateMinerSectorCount(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (MinerSectors, error) + StateMinerSectorCount(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (chain2.MinerSectors, error) // Rule[perm:read] - StateMarketBalance(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (MarketBalance, error) + StateMarketBalance(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (chain2.MarketBalance, error) // Rule[perm:read] - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk chain.TipSetKey) (DealCollateralBounds, error) + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk chain.TipSetKey) (chain2.DealCollateralBounds, error) // Rule[perm:read] StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) } diff --git a/venus-shared/api/chain/v1/market.go b/venus-shared/api/chain/v1/market.go index 78c6fd5e14..27583a26ce 100644 --- a/venus-shared/api/chain/v1/market.go +++ b/venus-shared/api/chain/v1/market.go @@ -3,10 +3,12 @@ package v1 import ( "context" + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" + "github.com/filecoin-project/venus/venus-shared/chain" ) type IMarket interface { // Rule[perm:read] - StateMarketParticipants(ctx context.Context, tsk chain.TipSetKey) (map[string]MarketBalance, error) //perm:admin + StateMarketParticipants(ctx context.Context, tsk chain.TipSetKey) (map[string]chain2.MarketBalance, error) //perm:admin } diff --git a/venus-shared/api/chain/v1/mining.go b/venus-shared/api/chain/v1/mining.go index a15c34ccaf..e9f4b72a1f 100644 --- a/venus-shared/api/chain/v1/mining.go +++ b/venus-shared/api/chain/v1/mining.go @@ -2,15 +2,17 @@ package v1 import ( "context" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/filecoin-project/venus/venus-shared/chain" ) type IMining interface { // Rule[perm:read] - MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk chain.TipSetKey) (*MiningBaseInfo, error) - // Rule[perm:read] - MinerCreateBlock(ctx context.Context, bt *BlockTemplate) (*chain.BlockMsg, error) + MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk chain.TipSetKey) (*chain2.MiningBaseInfo, error) + // Rule[perm:write] + MinerCreateBlock(ctx context.Context, bt *chain2.BlockTemplate) (*chain.BlockMsg, error) } diff --git a/venus-shared/api/chain/v1/mpool.go b/venus-shared/api/chain/v1/mpool.go index 7b06b144a3..0d16538217 100644 --- a/venus-shared/api/chain/v1/mpool.go +++ b/venus-shared/api/chain/v1/mpool.go @@ -7,22 +7,23 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/venus/venus-shared/messagepool" ) type IMessagePool interface { - // Rule[perm:read] + // Rule[perm:admin] MpoolDeleteByAdress(ctx context.Context, addr address.Address) error - // Rule[perm:read] + // Rule[perm:write] MpoolPublishByAddr(context.Context, address.Address) error - // Rule[perm:read] + // Rule[perm:write] MpoolPublishMessage(ctx context.Context, smsg *chain.SignedMessage) error - // Rule[perm:read] + // Rule[perm:write] MpoolPush(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) // Rule[perm:read] MpoolGetConfig(context.Context) (*messagepool.MpoolConfig, error) - // Rule[perm:read] + // Rule[perm:admin] MpoolSetConfig(ctx context.Context, cfg *messagepool.MpoolConfig) error // Rule[perm:read] MpoolSelect(context.Context, chain.TipSetKey, float64) ([]*chain.SignedMessage, error) @@ -30,26 +31,26 @@ type IMessagePool interface { MpoolSelects(context.Context, chain.TipSetKey, []float64) ([][]*chain.SignedMessage, error) // Rule[perm:read] MpoolPending(ctx context.Context, tsk chain.TipSetKey) ([]*chain.SignedMessage, error) - // Rule[perm:read] + // Rule[perm:write] MpoolClear(ctx context.Context, local bool) error - // Rule[perm:read] + // Rule[perm:write] MpoolPushUntrusted(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) - // Rule[perm:read] - MpoolPushMessage(ctx context.Context, msg *chain.Message, spec *MessageSendSpec) (*chain.SignedMessage, error) - // Rule[perm:read] + // Rule[perm:sign] + MpoolPushMessage(ctx context.Context, msg *chain.Message, spec *chain2.MessageSendSpec) (*chain.SignedMessage, error) + // Rule[perm:write] MpoolBatchPush(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) - // Rule[perm:read] + // Rule[perm:write] MpoolBatchPushUntrusted(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) - // Rule[perm:read] - MpoolBatchPushMessage(ctx context.Context, msgs []*chain.Message, spec *MessageSendSpec) ([]*chain.SignedMessage, error) + // Rule[perm:sign] + MpoolBatchPushMessage(ctx context.Context, msgs []*chain.Message, spec *chain2.MessageSendSpec) ([]*chain.SignedMessage, error) // Rule[perm:read] MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) // Rule[perm:read] MpoolSub(ctx context.Context) (<-chan messagepool.MpoolUpdate, error) // Rule[perm:read] - GasEstimateMessageGas(ctx context.Context, msg *chain.Message, spec *MessageSendSpec, tsk chain.TipSetKey) (*chain.Message, error) + GasEstimateMessageGas(ctx context.Context, msg *chain.Message, spec *chain2.MessageSendSpec, tsk chain.TipSetKey) (*chain.Message, error) // Rule[perm:read] - GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*EstimateMessage, fromNonce uint64, tsk chain.TipSetKey) ([]*EstimateResult, error) + GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*chain2.EstimateMessage, fromNonce uint64, tsk chain.TipSetKey) ([]*chain2.EstimateResult, error) // Rule[perm:read] GasEstimateFeeCap(ctx context.Context, msg *chain.Message, maxqueueblks int64, tsk chain.TipSetKey) (big.Int, error) // Rule[perm:read] diff --git a/venus-shared/api/chain/v1/multisig.go b/venus-shared/api/chain/v1/multisig.go index 7bce87615b..41b8a6f198 100644 --- a/venus-shared/api/chain/v1/multisig.go +++ b/venus-shared/api/chain/v1/multisig.go @@ -11,29 +11,29 @@ import ( ) type IMultiSig interface { - // Rule[perm:read] + // Rule[perm:sign] MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val chain.BigInt, src address.Address, gp chain.BigInt) (*messagepool.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) - // Rule[perm:read] + // Rule[perm:sign] MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*messagepool.MessagePrototype, error) // Rule[perm:read] MsigGetVested(ctx context.Context, addr address.Address, start chain.TipSetKey, end chain.TipSetKey) (chain.BigInt, error) diff --git a/venus-shared/api/chain/v1/network.go b/venus-shared/api/chain/v1/network.go index c4564f3c4b..34f105ce97 100644 --- a/venus-shared/api/chain/v1/network.go +++ b/venus-shared/api/chain/v1/network.go @@ -8,6 +8,7 @@ import ( "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" + "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/filecoin-project/venus/venus-shared/libp2p/net" ) @@ -29,7 +30,7 @@ type INetwork interface { // Rule[perm:read] NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) // Rule[perm:read] - Version(context.Context) (Version, error) + Version(context.Context) (chain.Version, error) // Rule[perm:read] NetAddrsListen(context.Context) (peer.AddrInfo, error) } diff --git a/venus-shared/api/chain/v1/paych.go b/venus-shared/api/chain/v1/paych.go index 6bfe91db19..0e192eec9b 100644 --- a/venus-shared/api/chain/v1/paych.go +++ b/venus-shared/api/chain/v1/paych.go @@ -7,6 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" + "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/filecoin-project/venus/venus-shared/paych" ) @@ -15,31 +16,31 @@ type IPaychan interface { // @from: the payment channel sender // @to: the payment channel recipient // @amt: the deposits funds in the payment channel - // Rule[perm:read] + // Rule[perm:sign] PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*paych.ChannelInfo, error) // PaychAvailableFunds get the status of an outbound payment channel // @pch: payment channel address - // Rule[perm:read] - PaychAvailableFunds(ctx context.Context, ch address.Address) (*ChannelAvailableFunds, error) + // Rule[perm:sign] + PaychAvailableFunds(ctx context.Context, ch address.Address) (*chain.ChannelAvailableFunds, error) // PaychAvailableFundsByFromTo get the status of an outbound payment channel // @from: the payment channel sender // @to: he payment channel recipient - // Rule[perm:read] - PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*ChannelAvailableFunds, error) - // PaychGetWaitReady waits until the create channel / add funds message with the sentinel + // Rule[perm:sign] + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*chain.ChannelAvailableFunds, error) + // PaychGetWaitsigny waits until the create channel / add funds message with the sentinel // @sentinel: given message CID arrives. // @ch: the returned channel address can safely be used against the Manager methods. - // Rule[perm:read] - PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (address.Address, error) + // Rule[perm:sign] + PaychGetWaitsigny(ctx context.Context, sentinel cid.Cid) (address.Address, error) // PaychAllocateLane Allocate late creates a lane within a payment channel so that calls to // CreatePaymentVoucher will automatically make vouchers only for the difference in total - // Rule[perm:read] + // Rule[perm:sign] PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) // PaychNewPayment aggregate vouchers into a new lane // @from: the payment channel sender // @to: the payment channel recipient // @vouchers: the outstanding (non-redeemed) vouchers - // Rule[perm:read] + // Rule[perm:sign] PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []paych.VoucherSpec) (*paych.PaymentInfo, error) // PaychList list the addresses of all channels that have been created // Rule[perm:read] @@ -51,13 +52,13 @@ type IPaychan interface { // PaychSettle update payment channel status to settle // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain // @pch: payment channel address - // Rule[perm:read] + // Rule[perm:sign] PaychSettle(ctx context.Context, addr address.Address) (cid.Cid, error) // PaychCollect update payment channel status to collect // Collect sends the value of submitted vouchers to the channel recipient (the provider), // and refunds the remaining channel balance to the channel creator (the client). // @pch: payment channel address - // Rule[perm:read] + // Rule[perm:sign] PaychCollect(ctx context.Context, addr address.Address) (cid.Cid, error) // PaychVoucherCheckValid checks if the given voucher is valid (is or could become spendable at some point). @@ -75,7 +76,7 @@ type IPaychan interface { // PaychVoucherAdd adds a voucher for an inbound channel. // If the channel is not in the store, fetches the channel from state (and checks that // the channel To address is owned by the wallet). - // Rule[perm:read] + // Rule[perm:sign] PaychVoucherAdd(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) // PaychVoucherCreate creates a new signed voucher on the given payment channel // with the given lane and amount. The value passed in is exactly the value @@ -84,15 +85,15 @@ type IPaychan interface { // the two. // If there are insufficient funds in the channel to create the voucher, // returns a nil voucher and the shortfall. - // Rule[perm:read] + // Rule[perm:sign] PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paych.VoucherCreateResult, error) // PaychVoucherList list vouchers in payment channel // @pch: payment channel address - // Rule[perm:read] + // Rule[perm:write] PaychVoucherList(ctx context.Context, pch address.Address) ([]*paych.SignedVoucher, error) // PaychVoucherSubmit Submit voucher to chain to update payment channel state // @pch: payment channel address // @sv: voucher in payment channel - // Rule[perm:read] + // Rule[perm:sign] PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) } diff --git a/venus-shared/api/chain/v1/syncer.go b/venus-shared/api/chain/v1/syncer.go index 84556c03c0..104bc7ab08 100644 --- a/venus-shared/api/chain/v1/syncer.go +++ b/venus-shared/api/chain/v1/syncer.go @@ -5,13 +5,14 @@ import ( "github.com/filecoin-project/go-state-types/big" + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/filecoin-project/venus/venus-shared/chain" ) type ISyncer interface { - // Rule[perm:read] - ChainSyncHandleNewTipSet(ctx context.Context, ci *ChainInfo) error - // Rule[perm:read] + // Rule[perm:write] + ChainSyncHandleNewTipSet(ctx context.Context, ci *chain2.ChainInfo) error + // Rule[perm:admin] SetConcurrent(ctx context.Context, concurrent int64) error // Rule[perm:read] @@ -21,10 +22,10 @@ type ISyncer interface { Concurrent(ctx context.Context) int64 // Rule[perm:read] ChainTipSetWeight(ctx context.Context, tsk chain.TipSetKey) (big.Int, error) - // Rule[perm:read] + // Rule[perm:write] SyncSubmitBlock(ctx context.Context, blk *chain.BlockMsg) error // Rule[perm:read] - StateCall(ctx context.Context, msg *chain.Message, tsk chain.TipSetKey) (*InvocResult, error) + StateCall(ctx context.Context, msg *chain.Message, tsk chain.TipSetKey) (*chain2.InvocResult, error) // Rule[perm:read] - SyncState(ctx context.Context) (*SyncState, error) + SyncState(ctx context.Context) (*chain2.SyncState, error) } From 0b80cc66469c51a9f9494476019cc40df65eb6c6 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Mon, 20 Dec 2021 10:57:19 +0800 Subject: [PATCH 074/167] Feat/replica actos file (#4628) * add cmd to replica actors file * replica actors files --- venus-devtool/compatible/actors/list.go | 22 ++- venus-devtool/compatible/actors/main.go | 65 ++++++- venus-devtool/compatible/actors/templates.go | 4 +- venus-shared/actors/adt/diff_adt.go | 6 +- venus-shared/actors/builtin/init/diff.go | 154 +++++++++++++++ venus-shared/actors/builtin/market/diff.go | 93 +++++++++ venus-shared/actors/builtin/miner/diff.go | 129 +++++++++++++ .../actors/builtin/miner/diff_deadlines.go | 178 ++++++++++++++++++ venus-shared/actors/builtin/multisig/diff.go | 136 +++++++++++++ venus-shared/actors/builtin/power/diff.go | 119 ++++++++++++ venus-shared/actors/params.go | 4 +- venus-shared/actors/version.go | 2 + 12 files changed, 898 insertions(+), 14 deletions(-) create mode 100644 venus-shared/actors/builtin/init/diff.go create mode 100644 venus-shared/actors/builtin/market/diff.go create mode 100644 venus-shared/actors/builtin/miner/diff.go create mode 100644 venus-shared/actors/builtin/miner/diff_deadlines.go create mode 100644 venus-shared/actors/builtin/multisig/diff.go create mode 100644 venus-shared/actors/builtin/power/diff.go diff --git a/venus-devtool/compatible/actors/list.go b/venus-devtool/compatible/actors/list.go index fb456731fb..a8bfae0c24 100644 --- a/venus-devtool/compatible/actors/list.go +++ b/venus-devtool/compatible/actors/list.go @@ -8,7 +8,21 @@ import ( "strings" ) -func listFilesInDir(dir string, ext string) ([]string, error) { +var filterWithSuffix = func(suffix string) func(path string, d fs.DirEntry) bool { + return func(path string, d fs.DirEntry) bool { + if d.IsDir() { + return true + } + + if !strings.HasSuffix(path, suffix) { + return true + } + + return false + } +} + +func listFilesInDir(dir string, filter func(string, fs.DirEntry) bool) ([]string, error) { var paths []string err := fs.WalkDir(os.DirFS(dir), ".", func(path string, d fs.DirEntry, err error) error { @@ -16,11 +30,7 @@ func listFilesInDir(dir string, ext string) ([]string, error) { return fmt.Errorf("walking %s: %w", path, err) } - if d.IsDir() { - return nil - } - - if !strings.HasSuffix(path, ext) { + if filter(path, d) { return nil } diff --git a/venus-devtool/compatible/actors/main.go b/venus-devtool/compatible/actors/main.go index 8bcc6919dd..5708af6aa8 100644 --- a/venus-devtool/compatible/actors/main.go +++ b/venus-devtool/compatible/actors/main.go @@ -2,9 +2,11 @@ package main import ( "fmt" + "io/fs" "log" "os" "path/filepath" + "strings" "github.com/urfave/cli/v2" ) @@ -19,6 +21,7 @@ func main() { sourcesCmd, templatesCmd, renderCmd, + replicaCmd, }, } @@ -44,7 +47,7 @@ var templatesCmd = &cli.Command{ } log.Println("listing") - paths, err := listFilesInDir(srcDir, goTemplateExt) + paths, err := listFilesInDir(srcDir, filterWithSuffix(goTemplateExt)) if err != nil { return fmt.Errorf("list template files: %w", err) } @@ -85,7 +88,7 @@ var renderCmd = &cli.Command{ return fmt.Errorf("get abs path for %s: %w", dir, err) } - templates, err := listFilesInDir(dir, goTemplateExt) + templates, err := listFilesInDir(dir, filterWithSuffix(goTemplateExt)) if err != nil { return fmt.Errorf("list templates in %s: %w", abs, err) } @@ -112,7 +115,7 @@ var sourcesCmd = &cli.Command{ return fmt.Errorf("find chain/actors: %w", err) } - files, err := listFilesInDir(srcDir, goSourceCodeExt) + files, err := listFilesInDir(srcDir, filterWithSuffix(goSourceCodeExt)) if err != nil { return fmt.Errorf("list source code files: %w", err) } @@ -125,3 +128,59 @@ var sourcesCmd = &cli.Command{ return nil }, } + +var replicaCmd = &cli.Command{ + Name: "replica", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "dst", + Value: "", + Required: true, + }, + }, + Action: func(cctx *cli.Context) error { + srcDir, err := findActorsPkgDir() + if err != nil { + return fmt.Errorf("find chain/actors: %w", err) + } + + files, err := listFilesInDir(srcDir, func(path string, d fs.DirEntry) bool { + if d.IsDir() { + return true + } + + if strings.HasSuffix(path, "test.go") { + return true + } + + // diff.go diff_deadlines.go version.go params.go + if !strings.Contains(path, "diff") && !strings.HasSuffix(path, "version.go") && + !strings.HasSuffix(path, "params.go") { + return true + } + + return false + }) + if err != nil { + return fmt.Errorf("list replica files failed: %w", err) + } + + fmt.Println("replica files IN chain/actors:") + + for _, p := range files { + fmt.Printf("\t%s\n", p) + } + + replacers := [][2]string{ + {"github.com/filecoin-project/lotus/chain/actors/adt", "github.com/filecoin-project/venus/venus-shared/actors/adt"}, + {"github.com/filecoin-project/lotus/chain/actors/aerrors", "github.com/filecoin-project/venus/venus-shared/actors/aerrors"}, + } + + for _, file := range files { + if err := fetchOne(srcDir, cctx.String("dst"), file, replacers); err != nil { + return fmt.Errorf("fetch for %s: %w", file, err) + } + } + return nil + }, +} diff --git a/venus-devtool/compatible/actors/templates.go b/venus-devtool/compatible/actors/templates.go index a14292ce3d..b1a297bdee 100644 --- a/venus-devtool/compatible/actors/templates.go +++ b/venus-devtool/compatible/actors/templates.go @@ -61,7 +61,7 @@ func fetch(src, dst string, paths []string) error { } for _, rel := range paths { - if err := fetchOne(src, dst, rel); err != nil { + if err := fetchOne(src, dst, rel, replacers); err != nil { return fmt.Errorf("fetch template for %s: %w", rel, err) } @@ -71,7 +71,7 @@ func fetch(src, dst string, paths []string) error { return nil } -func fetchOne(srcDir, dstDir string, rel string) error { +func fetchOne(srcDir, dstDir string, rel string, replacers [][2]string) error { dstRel := rel for _, suffix := range separatedSuffixes { if strings.HasSuffix(rel, suffix) { diff --git a/venus-shared/actors/adt/diff_adt.go b/venus-shared/actors/adt/diff_adt.go index 76a881a95e..c4bfbd85a9 100644 --- a/venus-shared/actors/adt/diff_adt.go +++ b/venus-shared/actors/adt/diff_adt.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: adt/diff_adt.go + package adt import ( @@ -12,7 +14,7 @@ import ( // Add should be called when a new k,v is added to the array // Modify should be called when a value is modified in the array // Remove should be called when a value is removed from the array -type AdtArrayDiff interface { //nolint +type AdtArrayDiff interface { Add(key uint64, val *typegen.Deferred) error Modify(key uint64, from, to *typegen.Deferred) error Remove(key uint64, val *typegen.Deferred) error @@ -72,7 +74,7 @@ func DiffAdtArray(preArr, curArr Array, out AdtArrayDiff) error { // Add should be called when a new k,v is added to the map // Modify should be called when a value is modified in the map // Remove should be called when a value is removed from the map -type AdtMapDiff interface { //nolint +type AdtMapDiff interface { AsKey(key string) (abi.Keyer, error) Add(key string, val *typegen.Deferred) error Modify(key string, from, to *typegen.Deferred) error diff --git a/venus-shared/actors/builtin/init/diff.go b/venus-shared/actors/builtin/init/diff.go new file mode 100644 index 0000000000..a11dbef2d9 --- /dev/null +++ b/venus-shared/actors/builtin/init/diff.go @@ -0,0 +1,154 @@ +// FETCHED FROM LOTUS: builtin/init/diff.go + +package init + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + typegen "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" +) + +func DiffAddressMap(pre, cur State) (*AddressMapChanges, error) { + prem, err := pre.AddressMap() + if err != nil { + return nil, err + } + + curm, err := cur.AddressMap() + if err != nil { + return nil, err + } + + preRoot, err := prem.Root() + if err != nil { + return nil, err + } + + curRoot, err := curm.Root() + if err != nil { + return nil, err + } + + results := new(AddressMapChanges) + // no change. + if curRoot.Equals(preRoot) { + return results, nil + } + + err = adt.DiffAdtMap(prem, curm, &addressMapDiffer{results, pre, cur}) + if err != nil { + return nil, err + } + + return results, nil +} + +type addressMapDiffer struct { + Results *AddressMapChanges + pre, adter State +} + +type AddressMapChanges struct { + Added []AddressPair + Modified []AddressChange + Removed []AddressPair +} + +func (i *addressMapDiffer) AsKey(key string) (abi.Keyer, error) { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return nil, err + } + return abi.AddrKey(addr), nil +} + +func (i *addressMapDiffer) Add(key string, val *typegen.Deferred) error { + pkAddr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + id := new(typegen.CborInt) + if err := id.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return err + } + idAddr, err := address.NewIDAddress(uint64(*id)) + if err != nil { + return err + } + i.Results.Added = append(i.Results.Added, AddressPair{ + ID: idAddr, + PK: pkAddr, + }) + return nil +} + +func (i *addressMapDiffer) Modify(key string, from, to *typegen.Deferred) error { + pkAddr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + + fromID := new(typegen.CborInt) + if err := fromID.UnmarshalCBOR(bytes.NewReader(from.Raw)); err != nil { + return err + } + fromIDAddr, err := address.NewIDAddress(uint64(*fromID)) + if err != nil { + return err + } + + toID := new(typegen.CborInt) + if err := toID.UnmarshalCBOR(bytes.NewReader(to.Raw)); err != nil { + return err + } + toIDAddr, err := address.NewIDAddress(uint64(*toID)) + if err != nil { + return err + } + + i.Results.Modified = append(i.Results.Modified, AddressChange{ + From: AddressPair{ + ID: fromIDAddr, + PK: pkAddr, + }, + To: AddressPair{ + ID: toIDAddr, + PK: pkAddr, + }, + }) + return nil +} + +func (i *addressMapDiffer) Remove(key string, val *typegen.Deferred) error { + pkAddr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + id := new(typegen.CborInt) + if err := id.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return err + } + idAddr, err := address.NewIDAddress(uint64(*id)) + if err != nil { + return err + } + i.Results.Removed = append(i.Results.Removed, AddressPair{ + ID: idAddr, + PK: pkAddr, + }) + return nil +} + +type AddressChange struct { + From AddressPair + To AddressPair +} + +type AddressPair struct { + ID address.Address + PK address.Address +} diff --git a/venus-shared/actors/builtin/market/diff.go b/venus-shared/actors/builtin/market/diff.go new file mode 100644 index 0000000000..9a946c9152 --- /dev/null +++ b/venus-shared/actors/builtin/market/diff.go @@ -0,0 +1,93 @@ +// FETCHED FROM LOTUS: builtin/market/diff.go + +package market + +import ( + "fmt" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + cbg "github.com/whyrusleeping/cbor-gen" +) + +func DiffDealProposals(pre, cur DealProposals) (*DealProposalChanges, error) { + results := new(DealProposalChanges) + if err := adt.DiffAdtArray(pre.array(), cur.array(), &marketProposalsDiffer{results, pre, cur}); err != nil { + return nil, fmt.Errorf("diffing deal states: %w", err) + } + return results, nil +} + +type marketProposalsDiffer struct { + Results *DealProposalChanges + pre, cur DealProposals +} + +func (d *marketProposalsDiffer) Add(key uint64, val *cbg.Deferred) error { + dp, err := d.cur.decode(val) + if err != nil { + return err + } + d.Results.Added = append(d.Results.Added, ProposalIDState{abi.DealID(key), *dp}) + return nil +} + +func (d *marketProposalsDiffer) Modify(key uint64, from, to *cbg.Deferred) error { + // short circuit, DealProposals are static + return nil +} + +func (d *marketProposalsDiffer) Remove(key uint64, val *cbg.Deferred) error { + dp, err := d.pre.decode(val) + if err != nil { + return err + } + d.Results.Removed = append(d.Results.Removed, ProposalIDState{abi.DealID(key), *dp}) + return nil +} + +func DiffDealStates(pre, cur DealStates) (*DealStateChanges, error) { + results := new(DealStateChanges) + if err := adt.DiffAdtArray(pre.array(), cur.array(), &marketStatesDiffer{results, pre, cur}); err != nil { + return nil, fmt.Errorf("diffing deal states: %w", err) + } + return results, nil +} + +type marketStatesDiffer struct { + Results *DealStateChanges + pre, cur DealStates +} + +func (d *marketStatesDiffer) Add(key uint64, val *cbg.Deferred) error { + ds, err := d.cur.decode(val) + if err != nil { + return err + } + d.Results.Added = append(d.Results.Added, DealIDState{abi.DealID(key), *ds}) + return nil +} + +func (d *marketStatesDiffer) Modify(key uint64, from, to *cbg.Deferred) error { + dsFrom, err := d.pre.decode(from) + if err != nil { + return err + } + dsTo, err := d.cur.decode(to) + if err != nil { + return err + } + if *dsFrom != *dsTo { + d.Results.Modified = append(d.Results.Modified, DealStateChange{abi.DealID(key), dsFrom, dsTo}) + } + return nil +} + +func (d *marketStatesDiffer) Remove(key uint64, val *cbg.Deferred) error { + ds, err := d.pre.decode(val) + if err != nil { + return err + } + d.Results.Removed = append(d.Results.Removed, DealIDState{abi.DealID(key), *ds}) + return nil +} diff --git a/venus-shared/actors/builtin/miner/diff.go b/venus-shared/actors/builtin/miner/diff.go new file mode 100644 index 0000000000..f40fd163f8 --- /dev/null +++ b/venus-shared/actors/builtin/miner/diff.go @@ -0,0 +1,129 @@ +// FETCHED FROM LOTUS: builtin/miner/diff.go + +package miner + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + cbg "github.com/whyrusleeping/cbor-gen" +) + +func DiffPreCommits(pre, cur State) (*PreCommitChanges, error) { + results := new(PreCommitChanges) + + prep, err := pre.precommits() + if err != nil { + return nil, err + } + + curp, err := cur.precommits() + if err != nil { + return nil, err + } + + err = adt.DiffAdtMap(prep, curp, &preCommitDiffer{results, pre, cur}) + if err != nil { + return nil, err + } + + return results, nil +} + +type preCommitDiffer struct { + Results *PreCommitChanges + pre, after State +} + +func (m *preCommitDiffer) AsKey(key string) (abi.Keyer, error) { + sector, err := abi.ParseUIntKey(key) + if err != nil { + return nil, err + } + return abi.UIntKey(sector), nil +} + +func (m *preCommitDiffer) Add(key string, val *cbg.Deferred) error { + sp, err := m.after.decodeSectorPreCommitOnChainInfo(val) + if err != nil { + return err + } + m.Results.Added = append(m.Results.Added, sp) + return nil +} + +func (m *preCommitDiffer) Modify(key string, from, to *cbg.Deferred) error { + return nil +} + +func (m *preCommitDiffer) Remove(key string, val *cbg.Deferred) error { + sp, err := m.pre.decodeSectorPreCommitOnChainInfo(val) + if err != nil { + return err + } + m.Results.Removed = append(m.Results.Removed, sp) + return nil +} + +func DiffSectors(pre, cur State) (*SectorChanges, error) { + results := new(SectorChanges) + + pres, err := pre.sectors() + if err != nil { + return nil, err + } + + curs, err := cur.sectors() + if err != nil { + return nil, err + } + + err = adt.DiffAdtArray(pres, curs, §orDiffer{results, pre, cur}) + if err != nil { + return nil, err + } + + return results, nil +} + +type sectorDiffer struct { + Results *SectorChanges + pre, after State +} + +func (m *sectorDiffer) Add(key uint64, val *cbg.Deferred) error { + si, err := m.after.decodeSectorOnChainInfo(val) + if err != nil { + return err + } + m.Results.Added = append(m.Results.Added, si) + return nil +} + +func (m *sectorDiffer) Modify(key uint64, from, to *cbg.Deferred) error { + siFrom, err := m.pre.decodeSectorOnChainInfo(from) + if err != nil { + return err + } + + siTo, err := m.after.decodeSectorOnChainInfo(to) + if err != nil { + return err + } + + if siFrom.Expiration != siTo.Expiration { + m.Results.Extended = append(m.Results.Extended, SectorExtensions{ + From: siFrom, + To: siTo, + }) + } + return nil +} + +func (m *sectorDiffer) Remove(key uint64, val *cbg.Deferred) error { + si, err := m.pre.decodeSectorOnChainInfo(val) + if err != nil { + return err + } + m.Results.Removed = append(m.Results.Removed, si) + return nil +} diff --git a/venus-shared/actors/builtin/miner/diff_deadlines.go b/venus-shared/actors/builtin/miner/diff_deadlines.go new file mode 100644 index 0000000000..af39d81cc0 --- /dev/null +++ b/venus-shared/actors/builtin/miner/diff_deadlines.go @@ -0,0 +1,178 @@ +// FETCHED FROM LOTUS: builtin/miner/diff_deadlines.go + +package miner + +import ( + "errors" + + "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-state-types/exitcode" +) + +type DeadlinesDiff map[uint64]DeadlineDiff + +func DiffDeadlines(pre, cur State) (DeadlinesDiff, error) { + changed, err := pre.DeadlinesChanged(cur) + if err != nil { + return nil, err + } + if !changed { + return nil, nil + } + + dlDiff := make(DeadlinesDiff) + if err := pre.ForEachDeadline(func(idx uint64, preDl Deadline) error { + curDl, err := cur.LoadDeadline(idx) + if err != nil { + return err + } + + diff, err := DiffDeadline(preDl, curDl) + if err != nil { + return err + } + + dlDiff[idx] = diff + return nil + }); err != nil { + return nil, err + } + return dlDiff, nil +} + +type DeadlineDiff map[uint64]*PartitionDiff + +func DiffDeadline(pre, cur Deadline) (DeadlineDiff, error) { + changed, err := pre.PartitionsChanged(cur) + if err != nil { + return nil, err + } + if !changed { + return nil, nil + } + + partDiff := make(DeadlineDiff) + if err := pre.ForEachPartition(func(idx uint64, prePart Partition) error { + // try loading current partition at this index + curPart, err := cur.LoadPartition(idx) + if err != nil { + if errors.Is(err, exitcode.ErrNotFound) { + // TODO correctness? + return nil // the partition was removed. + } + return err + } + + // compare it with the previous partition + diff, err := DiffPartition(prePart, curPart) + if err != nil { + return err + } + + partDiff[idx] = diff + return nil + }); err != nil { + return nil, err + } + + // all previous partitions have been walked. + // all partitions in cur and not in prev are new... can they be faulty already? + // TODO is this correct? + if err := cur.ForEachPartition(func(idx uint64, curPart Partition) error { + if _, found := partDiff[idx]; found { + return nil + } + faults, err := curPart.FaultySectors() + if err != nil { + return err + } + recovering, err := curPart.RecoveringSectors() + if err != nil { + return err + } + partDiff[idx] = &PartitionDiff{ + Removed: bitfield.New(), + Recovered: bitfield.New(), + Faulted: faults, + Recovering: recovering, + } + + return nil + }); err != nil { + return nil, err + } + + return partDiff, nil +} + +type PartitionDiff struct { + Removed bitfield.BitField + Recovered bitfield.BitField + Faulted bitfield.BitField + Recovering bitfield.BitField +} + +func DiffPartition(pre, cur Partition) (*PartitionDiff, error) { + prevLiveSectors, err := pre.LiveSectors() + if err != nil { + return nil, err + } + curLiveSectors, err := cur.LiveSectors() + if err != nil { + return nil, err + } + + removed, err := bitfield.SubtractBitField(prevLiveSectors, curLiveSectors) + if err != nil { + return nil, err + } + + prevRecoveries, err := pre.RecoveringSectors() + if err != nil { + return nil, err + } + + curRecoveries, err := cur.RecoveringSectors() + if err != nil { + return nil, err + } + + recovering, err := bitfield.SubtractBitField(curRecoveries, prevRecoveries) + if err != nil { + return nil, err + } + + prevFaults, err := pre.FaultySectors() + if err != nil { + return nil, err + } + + curFaults, err := cur.FaultySectors() + if err != nil { + return nil, err + } + + faulted, err := bitfield.SubtractBitField(curFaults, prevFaults) + if err != nil { + return nil, err + } + + // all current good sectors + curActiveSectors, err := cur.ActiveSectors() + if err != nil { + return nil, err + } + + // sectors that were previously fault and are now currently active are considered recovered. + recovered, err := bitfield.IntersectBitField(prevFaults, curActiveSectors) + if err != nil { + return nil, err + } + + return &PartitionDiff{ + Removed: removed, + Recovered: recovered, + Faulted: faulted, + Recovering: recovering, + }, nil +} diff --git a/venus-shared/actors/builtin/multisig/diff.go b/venus-shared/actors/builtin/multisig/diff.go new file mode 100644 index 0000000000..5cd8edd5d9 --- /dev/null +++ b/venus-shared/actors/builtin/multisig/diff.go @@ -0,0 +1,136 @@ +// FETCHED FROM LOTUS: builtin/multisig/diff.go + +package multisig + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" +) + +type PendingTransactionChanges struct { + Added []TransactionChange + Modified []TransactionModification + Removed []TransactionChange +} + +type TransactionChange struct { + TxID int64 + Tx Transaction +} + +type TransactionModification struct { + TxID int64 + From Transaction + To Transaction +} + +func DiffPendingTransactions(pre, cur State) (*PendingTransactionChanges, error) { + results := new(PendingTransactionChanges) + if changed, err := pre.PendingTxnChanged(cur); err != nil { + return nil, err + } else if !changed { // if nothing has changed then return an empty result and bail. + return results, nil + } + + pret, err := pre.transactions() + if err != nil { + return nil, err + } + + curt, err := cur.transactions() + if err != nil { + return nil, err + } + + if err := adt.DiffAdtMap(pret, curt, &transactionDiffer{results, pre, cur}); err != nil { + return nil, err + } + return results, nil +} + +type transactionDiffer struct { + Results *PendingTransactionChanges + pre, after State +} + +func (t *transactionDiffer) AsKey(key string) (abi.Keyer, error) { + txID, err := abi.ParseIntKey(key) + if err != nil { + return nil, err + } + return abi.IntKey(txID), nil +} + +func (t *transactionDiffer) Add(key string, val *cbg.Deferred) error { + txID, err := abi.ParseIntKey(key) + if err != nil { + return err + } + tx, err := t.after.decodeTransaction(val) + if err != nil { + return err + } + t.Results.Added = append(t.Results.Added, TransactionChange{ + TxID: txID, + Tx: tx, + }) + return nil +} + +func (t *transactionDiffer) Modify(key string, from, to *cbg.Deferred) error { + txID, err := abi.ParseIntKey(key) + if err != nil { + return err + } + + txFrom, err := t.pre.decodeTransaction(from) + if err != nil { + return err + } + + txTo, err := t.after.decodeTransaction(to) + if err != nil { + return err + } + + if approvalsChanged(txFrom.Approved, txTo.Approved) { + t.Results.Modified = append(t.Results.Modified, TransactionModification{ + TxID: txID, + From: txFrom, + To: txTo, + }) + } + + return nil +} + +func approvalsChanged(from, to []address.Address) bool { + if len(from) != len(to) { + return true + } + for idx := range from { + if from[idx] != to[idx] { + return true + } + } + return false +} + +func (t *transactionDiffer) Remove(key string, val *cbg.Deferred) error { + txID, err := abi.ParseIntKey(key) + if err != nil { + return err + } + tx, err := t.pre.decodeTransaction(val) + if err != nil { + return err + } + t.Results.Removed = append(t.Results.Removed, TransactionChange{ + TxID: txID, + Tx: tx, + }) + return nil +} diff --git a/venus-shared/actors/builtin/power/diff.go b/venus-shared/actors/builtin/power/diff.go new file mode 100644 index 0000000000..f5d8b7f593 --- /dev/null +++ b/venus-shared/actors/builtin/power/diff.go @@ -0,0 +1,119 @@ +// FETCHED FROM LOTUS: builtin/power/diff.go + +package power + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" +) + +type ClaimChanges struct { + Added []ClaimInfo + Modified []ClaimModification + Removed []ClaimInfo +} + +type ClaimModification struct { + Miner address.Address + From Claim + To Claim +} + +type ClaimInfo struct { + Miner address.Address + Claim Claim +} + +func DiffClaims(pre, cur State) (*ClaimChanges, error) { + results := new(ClaimChanges) + + prec, err := pre.claims() + if err != nil { + return nil, err + } + + curc, err := cur.claims() + if err != nil { + return nil, err + } + + if err := adt.DiffAdtMap(prec, curc, &claimDiffer{results, pre, cur}); err != nil { + return nil, err + } + + return results, nil +} + +type claimDiffer struct { + Results *ClaimChanges + pre, after State +} + +func (c *claimDiffer) AsKey(key string) (abi.Keyer, error) { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return nil, err + } + return abi.AddrKey(addr), nil +} + +func (c *claimDiffer) Add(key string, val *cbg.Deferred) error { + ci, err := c.after.decodeClaim(val) + if err != nil { + return err + } + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + c.Results.Added = append(c.Results.Added, ClaimInfo{ + Miner: addr, + Claim: ci, + }) + return nil +} + +func (c *claimDiffer) Modify(key string, from, to *cbg.Deferred) error { + ciFrom, err := c.pre.decodeClaim(from) + if err != nil { + return err + } + + ciTo, err := c.after.decodeClaim(to) + if err != nil { + return err + } + + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + + if ciFrom != ciTo { + c.Results.Modified = append(c.Results.Modified, ClaimModification{ + Miner: addr, + From: ciFrom, + To: ciTo, + }) + } + return nil +} + +func (c *claimDiffer) Remove(key string, val *cbg.Deferred) error { + ci, err := c.after.decodeClaim(val) + if err != nil { + return err + } + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + c.Results.Removed = append(c.Results.Removed, ClaimInfo{ + Miner: addr, + Claim: ci, + }) + return nil +} diff --git a/venus-shared/actors/params.go b/venus-shared/actors/params.go index 2cc90b3250..f61f05eeaf 100644 --- a/venus-shared/actors/params.go +++ b/venus-shared/actors/params.go @@ -1,12 +1,14 @@ +// FETCHED FROM LOTUS: params.go + package actors import ( "bytes" "github.com/filecoin-project/go-state-types/exitcode" - cbg "github.com/whyrusleeping/cbor-gen" "github.com/filecoin-project/venus/venus-shared/actors/aerrors" + cbg "github.com/whyrusleeping/cbor-gen" ) func SerializeParams(i cbg.CBORMarshaler) ([]byte, aerrors.ActorError) { diff --git a/venus-shared/actors/version.go b/venus-shared/actors/version.go index 95dd091268..744c3c2776 100644 --- a/venus-shared/actors/version.go +++ b/venus-shared/actors/version.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: version.go + package actors import ( From 1d419d5b66e50d3081af53a35f26f1f2e5e16565 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Tue, 21 Dec 2021 09:34:33 +0800 Subject: [PATCH 075/167] Feat/replace actors (#4632) * use actors from shared * update shared go.mod --- .DS_Store | Bin 0 -> 10245 bytes app/client/apiface/chain.go | 2 +- app/client/apiface/v0api/chain.go | 2 +- app/client/full.go | 2 +- app/client/v0api/full.go | 2 +- app/node/builder_opts.go | 5 +- app/node/test/setup.go | 2 +- app/submodule/apitypes/chain.go | 4 +- app/submodule/apitypes/mining.go | 2 +- app/submodule/chain/miner_api.go | 26 ++--- app/submodule/mining/mining_api.go | 8 +- app/submodule/multisig/multisig_api.go | 28 +++--- cmd/dispute.go | 9 +- cmd/message.go | 2 +- cmd/miner.go | 15 +-- cmd/miner_actor.go | 21 ++-- cmd/miner_proving.go | 12 ++- cmd/multisig.go | 19 ++-- cmd/paych.go | 2 +- cmd/paych_test.go | 5 +- cmd/seed.go | 2 +- cmd/state.go | 5 +- extern/filecoin-ffi | 2 +- go.mod | 2 + pkg/chain/circulating_supply.go | 20 ++-- pkg/chain/store.go | 27 ++--- pkg/chain/utils.go | 7 +- pkg/chainsync/exchange/protocol.go | 2 +- pkg/chainsync/syncer/syncer.go | 9 +- pkg/chainsync/syncer/syncer_test.go | 5 +- pkg/clock/chainclock.go | 2 +- pkg/consensus/block_validator.go | 20 ++-- pkg/consensus/testing_poster.go | 2 +- pkg/consensusfault/check.go | 10 +- pkg/constants/shared_vals.go | 2 +- pkg/events/state/predicates.go | 27 ++--- pkg/events/state/predicates_test.go | 12 ++- pkg/fork/fork.go | 18 ++-- pkg/gen/genesis/f00_system.go | 8 +- pkg/gen/genesis/f01_init.go | 6 +- pkg/gen/genesis/f02_reward.go | 8 +- pkg/gen/genesis/f03_cron.go | 8 +- pkg/gen/genesis/f04_power.go | 6 +- pkg/gen/genesis/f05_market.go | 8 +- pkg/gen/genesis/f06_vreg.go | 6 +- pkg/gen/genesis/genesis.go | 33 +++---- pkg/gen/genesis/miners.go | 44 ++++----- pkg/gen/genesis/util.go | 4 +- pkg/market/fundmanager.go | 11 ++- pkg/market/fundmanager_test.go | 2 +- pkg/messagepool/gas.go | 4 +- pkg/messagepool/gasguess/guessgas.go | 2 +- pkg/messagepool/provider.go | 5 +- pkg/paychmgr/manager.go | 5 +- pkg/paychmgr/mock_test.go | 7 +- pkg/paychmgr/paych.go | 15 +-- pkg/paychmgr/paych_test.go | 7 +- pkg/paychmgr/paychget_test.go | 9 +- pkg/paychmgr/paychvoucherfunds_test.go | 7 +- pkg/paychmgr/settler/settler.go | 2 +- pkg/paychmgr/settler/stl.go | 3 +- pkg/paychmgr/simple.go | 2 +- pkg/paychmgr/state.go | 3 +- pkg/paychmgr/store.go | 2 +- pkg/paychmgr/util.go | 2 +- pkg/state/power_table_view.go | 5 +- pkg/state/testing.go | 5 +- pkg/state/tree/state.go | 10 +- pkg/state/view.go | 50 +++++----- pkg/statemanger/state_manger.go | 9 +- pkg/types/types.go | 4 +- pkg/vm/dispatch/loader.go | 6 +- pkg/vm/gas/pricelistV0.go | 2 +- pkg/vm/register/default.go | 2 +- pkg/vm/vmcontext/invocation_context.go | 20 ++-- pkg/vm/vmcontext/pattern.go | 10 +- pkg/vm/vmcontext/runtime_adapter.go | 4 +- pkg/vm/vmcontext/syscalls.go | 5 +- pkg/vm/vmcontext/syscallsStateView.go | 12 ++- pkg/vm/vmcontext/vmcontext.go | 15 +-- tools/conformance/chaos/actor.go | 2 +- tools/fast/action_message.go | 5 +- .../fast/series/send_filecoin_from_default.go | 2 +- venus-devtool/compatible/actors/main.go | 5 +- venus-shared/actors/builtin/miner/utils.go | 71 +++++++++++++ .../actors/builtin/paych/mock/mock.go | 93 ++++++++++++++++++ venus-shared/actors/builtin/verifreg/util.go | 6 +- venus-shared/go.mod | 28 +++--- venus-shared/go.sum | 44 ++++----- 89 files changed, 594 insertions(+), 382 deletions(-) create mode 100644 .DS_Store create mode 100644 venus-shared/actors/builtin/miner/utils.go create mode 100644 venus-shared/actors/builtin/paych/mock/mock.go diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..50f94ec0705ab59aae307c8be48e3c8f4b980a94 GIT binary patch literal 10245 zcmeHM&ubGw6n@(z%|@;EAPA+xA_%2c&9((gp%~K&6%{Ix7V$@uZDJFf?1p61*0zzL z7ySnWQP96Y{0pS$O~Grg;=zKTc=e=jer$Fon}nXK;B44=n|<%i_suuiN!|niv}7%7 z0vG_G<4J7)A#BZG%~wihZ)` zLF1_!FEKQhj(&rLqfKzzV3wtW#?nFK$QrLuG>VRS1`P)-!K`YP0!o3P0;G12!5LDs zLq)9L&D4@pDzk+3x9y`!&diKebS(7h`JMTxE0gapbc)RGF|wQ&ksH_@M3G+>9AvkG zy9<@#vKVn{HW(rDs*f*tyjuDxIXzthQ~qh z`{?cbB5rK(ji&>}g*?>2644QOh3gWhhHL!sjpg z9ufb?&<#%mo+s)b^h$Wq2E(&Zbz8!N$S%dB9uaT&`yC&Td;M_+y%HW9Uj!`Fxqy3G zSs8QKMNGjf;yxZ<^l+sJAG>{ojK9ssy9A{c>~K1Pt`I&8=n-+FkJ27))9Ygfy%Jt; zn&9>Er>us3=fDOR=hwyYJ78OD)iQt5KU(Etq3XutJ6caD9O;efv6vp~i``D;owbyk zack9NrgD?Ko6ER)i(g-NoMQ7jW6c+GYm5CyrybkP6zp7uCKs|f47s&Xu(Qru(y7_m zD(xr59297=e_(TS)HKINjL`|RK4NT|ra3WUoSPV{*JJvzljhW=bm{)a=2rc|b22LY zEx>;>z!CPo*}lN5E`ydQoo0237ANEI@t0q(vc<4#hCe}j%aA6G4Wmo{tEq}zbZoK} zOBCqENnOVY#U)gJh|WH#&$ar+(PXzG->%toX_xvCAK*?gBIEerPr_M;yZE6ZOlrs^ z2USVu?ccxJ#fW@Puix`N>VdvQPTk@}UhvK!yh6B`t-!Lx=EUd+-y?GPGQH|?;CUi) z&@17Yp9x+Rs`waJP>V8ZA*%ob3&98xfA&=qzoj3MN9QPs52Oj72(obSRczrB{`5@t ziah2YHow}0e33)@2nk|2{BL5J~~1 zz~53p3(urxl8Elr$*n}l#+HF+8c%YNxCXN{1sf7V?$hmfd_%V5hxk3ZS;Vgs+%}k{ f>6k~;(X!qA{rWRN)&FHO4XXY(hz$Q%{eR#Ox%8%_ literal 0 HcmV?d00001 diff --git a/app/client/apiface/chain.go b/app/client/apiface/chain.go index 98b753d70e..b09494e61a 100644 --- a/app/client/apiface/chain.go +++ b/app/client/apiface/chain.go @@ -11,7 +11,7 @@ import ( "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/filecoin-project/go-state-types/big" acrypto "github.com/filecoin-project/go-state-types/crypto" diff --git a/app/client/apiface/v0api/chain.go b/app/client/apiface/v0api/chain.go index e7c83613fb..c72f001869 100644 --- a/app/client/apiface/v0api/chain.go +++ b/app/client/apiface/v0api/chain.go @@ -11,7 +11,7 @@ import ( "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/filecoin-project/go-state-types/big" acrypto "github.com/filecoin-project/go-state-types/crypto" diff --git a/app/client/full.go b/app/client/full.go index 646235eb54..e6ae3ff67f 100644 --- a/app/client/full.go +++ b/app/client/full.go @@ -21,8 +21,8 @@ import ( "github.com/filecoin-project/venus/pkg/net" "github.com/filecoin-project/venus/pkg/paychmgr" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" "github.com/filecoin-project/venus/pkg/wallet" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" "github.com/libp2p/go-libp2p-core/metrics" diff --git a/app/client/v0api/full.go b/app/client/v0api/full.go index 18c50a839b..7f9190b650 100644 --- a/app/client/v0api/full.go +++ b/app/client/v0api/full.go @@ -21,8 +21,8 @@ import ( "github.com/filecoin-project/venus/pkg/net" "github.com/filecoin-project/venus/pkg/paychmgr" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" "github.com/filecoin-project/venus/pkg/wallet" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" "github.com/libp2p/go-libp2p-core/metrics" diff --git a/app/node/builder_opts.go b/app/node/builder_opts.go index dbcc8dab5a..0ffaf0b8d5 100644 --- a/app/node/builder_opts.go +++ b/app/node/builder_opts.go @@ -1,16 +1,17 @@ package node import ( + "time" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/venus/pkg/clock" "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/journal" - "github.com/filecoin-project/venus/pkg/types/specactors/policy" "github.com/filecoin-project/venus/pkg/util/ffiwrapper" + "github.com/filecoin-project/venus/venus-shared/actors/policy" "github.com/libp2p/go-libp2p" - "time" ) // BuilderOpt is an option for building a filecoin node. diff --git a/app/node/test/setup.go b/app/node/test/setup.go index 865f408798..0ab72e42f8 100644 --- a/app/node/test/setup.go +++ b/app/node/test/setup.go @@ -14,8 +14,8 @@ import ( "github.com/filecoin-project/venus/build/project" "github.com/filecoin-project/venus/pkg/clock" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" gengen "github.com/filecoin-project/venus/tools/gengen/util" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" ) const blockTime = builtin.EpochDurationSeconds * time.Second diff --git a/app/submodule/apitypes/chain.go b/app/submodule/apitypes/chain.go index 7f614addba..3d8f6085d8 100644 --- a/app/submodule/apitypes/chain.go +++ b/app/submodule/apitypes/chain.go @@ -10,8 +10,8 @@ import ( "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/market" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/power" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" ) type Partition struct { diff --git a/app/submodule/apitypes/mining.go b/app/submodule/apitypes/mining.go index c51ac5156f..6ae394596a 100644 --- a/app/submodule/apitypes/mining.go +++ b/app/submodule/apitypes/mining.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" ) type MiningBaseInfo struct { //nolint diff --git a/app/submodule/chain/miner_api.go b/app/submodule/chain/miner_api.go index d048aba51f..62af1df575 100644 --- a/app/submodule/chain/miner_api.go +++ b/app/submodule/chain/miner_api.go @@ -2,8 +2,9 @@ package chain import ( "context" + "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/pkg/types/specactors/policy" + "github.com/filecoin-project/venus/venus-shared/actors/policy" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" @@ -16,11 +17,12 @@ import ( "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/state/tree" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/market" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/power" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/reward" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" + types2 "github.com/filecoin-project/venus/venus-shared/chain" ) var _ apiface.IMinerState = &minerStateAPI{} @@ -357,7 +359,7 @@ func (msa *minerStateAPI) StateMinerPreCommitDepositForPower(ctx context.Context var sectorWeight abi.StoragePower if act, found, err := sTree.GetActor(ctx, market.Address); err != nil || !found { return big.Int{}, xerrors.Errorf("loading market actor %s: %v", maddr, err) - } else if s, err := market.Load(store, act); err != nil { + } else if s, err := market.Load(store, (*types2.Actor)(act)); err != nil { return big.Int{}, xerrors.Errorf("loading market actor state %s: %v", maddr, err) } else if w, vw, err := s.VerifyDealsForActivation(maddr, pci.DealIDs, ts.Height(), pci.Expiration); err != nil { return big.Int{}, xerrors.Errorf("verifying deals for activation: %v", err) @@ -370,7 +372,7 @@ func (msa *minerStateAPI) StateMinerPreCommitDepositForPower(ctx context.Context var powerSmoothed builtin.FilterEstimate if act, found, err := sTree.GetActor(ctx, power.Address); err != nil || !found { return big.Int{}, xerrors.Errorf("loading power actor: %v", err) - } else if s, err := power.Load(store, act); err != nil { + } else if s, err := power.Load(store, (*types2.Actor)(act)); err != nil { return big.Int{}, xerrors.Errorf("loading power actor state: %v", err) } else if p, err := s.TotalPowerSmoothed(); err != nil { return big.Int{}, xerrors.Errorf("failed to determine total power: %v", err) @@ -383,7 +385,7 @@ func (msa *minerStateAPI) StateMinerPreCommitDepositForPower(ctx context.Context return big.Int{}, xerrors.Errorf("loading miner actor: %v", err) } - rewardState, err := reward.Load(store, rewardActor) + rewardState, err := reward.Load(store, (*types2.Actor)(rewardActor)) if err != nil { return big.Int{}, xerrors.Errorf("loading reward actor state: %v", err) } @@ -417,7 +419,7 @@ func (msa *minerStateAPI) StateMinerInitialPledgeCollateral(ctx context.Context, var sectorWeight abi.StoragePower if act, found, err := state.GetActor(ctx, market.Address); err != nil || !found { return big.Int{}, xerrors.Errorf("loading miner actor %s: %v", maddr, err) - } else if s, err := market.Load(store, act); err != nil { + } else if s, err := market.Load(store, (*types2.Actor)(act)); err != nil { return big.Int{}, xerrors.Errorf("loading market actor state %s: %v", maddr, err) } else if w, vw, err := s.VerifyDealsForActivation(maddr, pci.DealIDs, ts.Height(), pci.Expiration); err != nil { return big.Int{}, xerrors.Errorf("verifying deals for activation: %v", err) @@ -433,7 +435,7 @@ func (msa *minerStateAPI) StateMinerInitialPledgeCollateral(ctx context.Context, ) if act, found, err := state.GetActor(ctx, power.Address); err != nil || !found { return big.Int{}, xerrors.Errorf("loading miner actor: %v", err) - } else if s, err := power.Load(store, act); err != nil { + } else if s, err := power.Load(store, (*types2.Actor)(act)); err != nil { return big.Int{}, xerrors.Errorf("loading power actor state: %v", err) } else if p, err := s.TotalPowerSmoothed(); err != nil { return big.Int{}, xerrors.Errorf("failed to determine total power: %v", err) @@ -449,7 +451,7 @@ func (msa *minerStateAPI) StateMinerInitialPledgeCollateral(ctx context.Context, return big.Int{}, xerrors.Errorf("loading miner actor: %v", err) } - rewardState, err := reward.Load(store, rewardActor) + rewardState, err := reward.Load(store, (*types2.Actor)(rewardActor)) if err != nil { return big.Int{}, xerrors.Errorf("loading reward actor state: %v", err) } diff --git a/app/submodule/mining/mining_api.go b/app/submodule/mining/mining_api.go index a0daa414c8..d981289c1b 100644 --- a/app/submodule/mining/mining_api.go +++ b/app/submodule/mining/mining_api.go @@ -3,9 +3,10 @@ package mining import ( "bytes" "context" + "os" + "github.com/filecoin-project/venus/app/client/apiface" cbor "github.com/ipfs/go-ipld-cbor" - "os" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" @@ -22,8 +23,9 @@ import ( "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" "github.com/filecoin-project/venus/pkg/wallet" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + types2 "github.com/filecoin-project/venus/venus-shared/chain" ) var _ apiface.IMining = &MiningAPI{} @@ -82,7 +84,7 @@ func (miningAPI *MiningAPI) MinerGetBaseInfo(ctx context.Context, maddr address. if err != nil { return nil, xerrors.Errorf("failed to load miner actor: %v", err) } - mas, err := miner.Load(chainStore.Store(ctx), act) + mas, err := miner.Load(chainStore.Store(ctx), (*types2.Actor)(act)) if err != nil { return nil, xerrors.Errorf("failed to load miner actor state: %v", err) } diff --git a/app/submodule/multisig/multisig_api.go b/app/submodule/multisig/multisig_api.go index 3e264dd453..3aa7b1e864 100644 --- a/app/submodule/multisig/multisig_api.go +++ b/app/submodule/multisig/multisig_api.go @@ -2,6 +2,7 @@ package multisig import ( "context" + "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/go-address" @@ -12,8 +13,9 @@ import ( "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/multisig" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/multisig" + types2 "github.com/filecoin-project/venus/venus-shared/chain" ) var _ apiface.IMultiSig = &multiSig{} @@ -40,7 +42,7 @@ func (a *multiSig) messageBuilder(ctx context.Context, from address.Address) (mu if err != nil { return nil, err } - aver, err := specactors.VersionForNetwork(nver) + aver, err := actors.VersionForNetwork(nver) if err != nil { return nil, err } @@ -63,7 +65,7 @@ func (a *multiSig) MsigCreate(ctx context.Context, req uint64, addrs []address.A } return &apitypes.MessagePrototype{ - Message: *msg, + Message: types.UnsignedMessage(*msg), ValidNonce: false, }, nil } @@ -81,7 +83,7 @@ func (a *multiSig) MsigPropose(ctx context.Context, msig address.Address, to add } return &apitypes.MessagePrototype{ - Message: *msg, + Message: types.UnsignedMessage(*msg), ValidNonce: false, }, nil } @@ -212,7 +214,7 @@ func (a *multiSig) MsigGetVested(ctx context.Context, addr address.Address, star return types.EmptyInt, xerrors.Errorf("failed to load multisig actor at end epoch: %w", err) } - msas, err := multisig.Load(a.store.Store(ctx), act) + msas, err := multisig.Load(a.store.Store(ctx), (*types2.Actor)(act)) if err != nil { return types.EmptyInt, xerrors.Errorf("failed to load multisig actor state: %w", err) } @@ -244,7 +246,7 @@ func (a *multiSig) msigApproveOrCancelSimple(ctx context.Context, operation Msig return nil, err } - var msg *types.Message + var msg *types2.Message switch operation { case MsigApprove: msg, err = mb.Approve(msig, txID, nil) @@ -257,7 +259,7 @@ func (a *multiSig) msigApproveOrCancelSimple(ctx context.Context, operation Msig return nil, err } - return &apitypes.MessagePrototype{Message: *msg, ValidNonce: false}, nil + return &apitypes.MessagePrototype{Message: types.UnsignedMessage(*msg), ValidNonce: false}, nil } func (a *multiSig) msigApproveOrCancelTxnHash(ctx context.Context, operation MsigProposeResponse, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) { @@ -290,7 +292,7 @@ func (a *multiSig) msigApproveOrCancelTxnHash(ctx context.Context, operation Msi return nil, err } - var msg *types.Message + var msg *types2.Message switch operation { case MsigApprove: msg, err = mb.Approve(msig, txID, &p) @@ -304,13 +306,13 @@ func (a *multiSig) msigApproveOrCancelTxnHash(ctx context.Context, operation Msi } return &apitypes.MessagePrototype{ - Message: *msg, + Message: types.UnsignedMessage(*msg), ValidNonce: false, }, nil } func serializeAddParams(new address.Address, inc bool) ([]byte, error) { - enc, actErr := specactors.SerializeParams(&multisig2.AddSignerParams{ + enc, actErr := actors.SerializeParams(&multisig2.AddSignerParams{ Signer: new, Increase: inc, }) @@ -322,7 +324,7 @@ func serializeAddParams(new address.Address, inc bool) ([]byte, error) { } func serializeSwapParams(old address.Address, new address.Address) ([]byte, error) { - enc, actErr := specactors.SerializeParams(&multisig2.SwapSignerParams{ + enc, actErr := actors.SerializeParams(&multisig2.SwapSignerParams{ From: old, To: new, }) @@ -334,7 +336,7 @@ func serializeSwapParams(old address.Address, new address.Address) ([]byte, erro } func serializeRemoveParams(rem address.Address, dec bool) ([]byte, error) { - enc, actErr := specactors.SerializeParams(&multisig2.RemoveSignerParams{ + enc, actErr := actors.SerializeParams(&multisig2.RemoveSignerParams{ Signer: rem, Decrease: dec, }) diff --git a/cmd/dispute.go b/cmd/dispute.go index 53072f11bd..313a8f490b 100644 --- a/cmd/dispute.go +++ b/cmd/dispute.go @@ -4,10 +4,12 @@ import ( "bytes" "context" "fmt" - "github.com/filecoin-project/venus/app/client/apiface" "strconv" "time" + "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/venus-shared/actors" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" @@ -22,7 +24,6 @@ import ( "github.com/filecoin-project/venus/app/node" chainpkg "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors" ) var disputeLog = logging.Logger("disputer") @@ -85,7 +86,7 @@ var disputerMsgCmd = &cmds.Command{ return err } - dpp, aerr := specactors.SerializeParams(&miner3.DisputeWindowedPoStParams{ + dpp, aerr := actors.SerializeParams(&miner3.DisputeWindowedPoStParams{ Deadline: deadline, PoStIndex: postIndex, }) @@ -352,7 +353,7 @@ func makeDisputeWindowedPosts(ctx context.Context, api apiface.ISyncer, dl miner for i := uint64(0); i < postsSnapshotted; i++ { - dpp, aerr := specactors.SerializeParams(&miner3.DisputeWindowedPoStParams{ + dpp, aerr := actors.SerializeParams(&miner3.DisputeWindowedPoStParams{ Deadline: dl.index, PoStIndex: i, }) diff --git a/cmd/message.go b/cmd/message.go index 06b2d1afc2..9c31313398 100644 --- a/cmd/message.go +++ b/cmd/message.go @@ -20,8 +20,8 @@ import ( "github.com/filecoin-project/venus/app/node" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" "github.com/filecoin-project/venus/pkg/vm" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" ) // MessageSendResult is the return type for message send command diff --git a/cmd/miner.go b/cmd/miner.go index adea224fae..86bbd259e9 100644 --- a/cmd/miner.go +++ b/cmd/miner.go @@ -19,13 +19,14 @@ import ( "github.com/filecoin-project/venus/app/submodule/chain" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/power" - "github.com/filecoin-project/venus/pkg/types/specactors/policy" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/pkg/wallet" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" + "github.com/filecoin-project/venus/venus-shared/actors/policy" + types2 "github.com/filecoin-project/venus/venus-shared/chain" ) var minerCmdLog = logging.Logger("miner.cmd") @@ -133,7 +134,7 @@ var newMinerCmd = &cmds.Command{ return xerrors.Errorf("getting seal proof type: %v", err) } - params, err := specactors.SerializeParams(&power2.CreateMinerParams{ + params, err := actors.SerializeParams(&power2.CreateMinerParams{ Owner: owner, Worker: worker, SealProofType: spt, @@ -250,7 +251,7 @@ var minerInfoCmd = &cmds.Command{ } tbs := blockstoreutil.NewTieredBstore(chain.NewAPIBlockstore(blockstoreAPI), blockstoreutil.NewTemporary()) - mas, err := miner.Load(adt.WrapStore(ctx, cbor.NewCborStore(tbs)), mact) + mas, err := miner.Load(adt.WrapStore(ctx, cbor.NewCborStore(tbs)), (*types2.Actor)(mact)) if err != nil { return err } diff --git a/cmd/miner_actor.go b/cmd/miner_actor.go index ea1ef9a783..665b3e8a4b 100644 --- a/cmd/miner_actor.go +++ b/cmd/miner_actor.go @@ -23,9 +23,10 @@ import ( "github.com/filecoin-project/venus/app/submodule/chain" "github.com/filecoin-project/venus/cmd/tablewriter" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + types2 "github.com/filecoin-project/venus/venus-shared/chain" ) var minerActorCmd = &cmds.Command{ @@ -85,7 +86,7 @@ var actorSetAddrsCmd = &cmds.Command{ return err } - params, err := specactors.SerializeParams(&miner2.ChangeMultiaddrsParams{NewMultiaddrs: addrs}) + params, err := actors.SerializeParams(&miner2.ChangeMultiaddrsParams{NewMultiaddrs: addrs}) if err != nil { return err } @@ -137,7 +138,7 @@ var actorSetPeeridCmd = &cmds.Command{ return err } - params, err := specactors.SerializeParams(&miner2.ChangePeerIDParams{NewID: abi.PeerID(pid)}) + params, err := actors.SerializeParams(&miner2.ChangePeerIDParams{NewID: abi.PeerID(pid)}) if err != nil { return err } @@ -200,7 +201,7 @@ var actorWithdrawCmd = &cmds.Command{ return xerrors.Errorf("can't withdraw more funds than available; requested: %s; available: %s", amount, available) } - params, err := specactors.SerializeParams(&miner2.WithdrawBalanceParams{ + params, err := actors.SerializeParams(&miner2.WithdrawBalanceParams{ AmountRequested: amount, // Default to attempting to withdraw all the extra funds in the miner actor }) if err != nil { @@ -294,7 +295,7 @@ var actorRepayDebtCmd = &cmds.Command{ store := adt.WrapStore(ctx, cbor.NewCborStore(chain.NewAPIBlockstore(env.(*node.Env).BlockStoreAPI))) - mst, err := miner.Load(store, mact) + mst, err := miner.Load(store, (*types2.Actor)(mact)) if err != nil { return err } @@ -381,7 +382,7 @@ var actorSetOwnerCmd = &cmds.Command{ return err } - sp, err := specactors.SerializeParams(&newAddr) + sp, err := actors.SerializeParams(&newAddr) if err != nil { return xerrors.Errorf("serializing params: %w", err) } @@ -628,7 +629,7 @@ var actorControlSet = &cmds.Command{ NewControlAddrs: toSet, } - sp, err := specactors.SerializeParams(cwp) + sp, err := actors.SerializeParams(cwp) if err != nil { return xerrors.Errorf("serializing params: %w", err) } @@ -705,7 +706,7 @@ var actorProposeChangeWorker = &cmds.Command{ NewControlAddrs: mi.ControlAddresses, } - sp, err := specactors.SerializeParams(cwp) + sp, err := actors.SerializeParams(cwp) if err != nil { return xerrors.Errorf("serializing params: %w", err) } diff --git a/cmd/miner_proving.go b/cmd/miner_proving.go index f521b80fde..5a29e5b709 100644 --- a/cmd/miner_proving.go +++ b/cmd/miner_proving.go @@ -3,10 +3,11 @@ package cmd import ( "bytes" "fmt" - "github.com/filecoin-project/venus/pkg/types" "strconv" "text/tabwriter" + "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/go-address" cmds "github.com/ipfs/go-ipfs-cmds" cbor "github.com/ipfs/go-ipld-cbor" @@ -14,8 +15,9 @@ import ( "github.com/filecoin-project/venus/app/node" "github.com/filecoin-project/venus/app/submodule/chain" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + types2 "github.com/filecoin-project/venus/venus-shared/chain" ) var minerProvingCmd = &cmds.Command{ @@ -62,7 +64,7 @@ var provingInfoCmd = &cmds.Command{ stor := adt.WrapStore(ctx, cbor.NewCborStore(chain.NewAPIBlockstore(env.(*node.Env).BlockStoreAPI))) - mas, err := miner.Load(stor, mact) + mas, err := miner.Load(stor, (*types2.Actor)(mact)) if err != nil { return err } @@ -323,7 +325,7 @@ var provingFaultsCmd = &cmds.Command{ return err } - mas, err := miner.Load(stor, mact) + mas, err := miner.Load(stor, (*types2.Actor)(mact)) if err != nil { return err } diff --git a/cmd/multisig.go b/cmd/multisig.go index b2d1296ce2..ac5ad84851 100644 --- a/cmd/multisig.go +++ b/cmd/multisig.go @@ -21,10 +21,11 @@ import ( "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/multisig" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/multisig" + types2 "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" cmds "github.com/ipfs/go-ipfs-cmds" cbor "github.com/ipfs/go-ipld-cbor" @@ -177,7 +178,7 @@ var msigInspectCmd = &cmds.Command{ if err != nil { return err } - mstate, err := multisig.Load(store, act) + mstate, err := multisig.Load(store, (*types2.Actor)(act)) if err != nil { return err } @@ -986,7 +987,7 @@ var msigLockProposeCmd = &cmds.Command{ if err != nil { return err } - params, actErr := specactors.SerializeParams(&msig2.LockBalanceParams{ + params, actErr := actors.SerializeParams(&msig2.LockBalanceParams{ StartEpoch: abi.ChainEpoch(start), UnlockDuration: abi.ChainEpoch(duration), Amount: big.Int(amount), @@ -1077,7 +1078,7 @@ var msigLockApproveCmd = &cmds.Command{ return err } - params, actErr := specactors.SerializeParams(&msig2.LockBalanceParams{ + params, actErr := actors.SerializeParams(&msig2.LockBalanceParams{ StartEpoch: abi.ChainEpoch(start), UnlockDuration: abi.ChainEpoch(duration), Amount: big.Int(amount), @@ -1155,7 +1156,7 @@ var msigLockCancelCmd = &cmds.Command{ return err } - params, actErr := specactors.SerializeParams(&msig2.LockBalanceParams{ + params, actErr := actors.SerializeParams(&msig2.LockBalanceParams{ StartEpoch: abi.ChainEpoch(start), UnlockDuration: abi.ChainEpoch(duration), Amount: big.Int(amount), @@ -1267,7 +1268,7 @@ var msigProposeThresholdCmd = &cmds.Command{ return err } - params, actErr := specactors.SerializeParams(&msig2.ChangeNumApprovalsThresholdParams{ + params, actErr := actors.SerializeParams(&msig2.ChangeNumApprovalsThresholdParams{ NewThreshold: newM, }) diff --git a/cmd/paych.go b/cmd/paych.go index fef5e11f5c..ea5699a620 100644 --- a/cmd/paych.go +++ b/cmd/paych.go @@ -15,7 +15,7 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/paychmgr" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" cmds "github.com/ipfs/go-ipfs-cmds" "golang.org/x/xerrors" ) diff --git a/cmd/paych_test.go b/cmd/paych_test.go index d0bc6f3b43..dc416f4a16 100644 --- a/cmd/paych_test.go +++ b/cmd/paych_test.go @@ -1,14 +1,15 @@ package cmd import ( + "testing" + addr "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/specs-actors/actors/builtin" "github.com/filecoin-project/specs-actors/actors/runtime" tutil "github.com/filecoin-project/specs-actors/support/testing" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" "github.com/stretchr/testify/assert" - "testing" ) func TestEncodedString(t *testing.T) { diff --git a/cmd/seed.go b/cmd/seed.go index 5afc2c2db7..1539631bc9 100644 --- a/cmd/seed.go +++ b/cmd/seed.go @@ -26,8 +26,8 @@ import ( "github.com/filecoin-project/venus/pkg/gen" "github.com/filecoin-project/venus/pkg/gen/genesis" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" "github.com/filecoin-project/venus/tools/seed" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" ) var seedCmd = &cmds.Command{ diff --git a/cmd/state.go b/cmd/state.go index c83b93530a..c890155a9d 100644 --- a/cmd/state.go +++ b/cmd/state.go @@ -5,10 +5,11 @@ import ( "context" "encoding/json" "fmt" - "github.com/filecoin-project/venus/app/client/apiface" "io" "strconv" + "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -21,7 +22,7 @@ import ( "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" ) // ActorView represents a generic way to represent details about any actor to the user. diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 4e75bb4a20..52d80081bf 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 4e75bb4a20d185bc912939c60fdcdc6c41fd8e60 +Subproject commit 52d80081bfdd8a30bc44bcfe44cb0f299615b9f3 diff --git a/go.mod b/go.mod index fac42d42b4..64c0f31fc6 100644 --- a/go.mod +++ b/go.mod @@ -43,6 +43,7 @@ require ( github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578 + github.com/filecoin-project/venus/venus-shared v0.0.0-00010101000000-000000000000 github.com/gbrlsnchs/jwt/v3 v3.0.0 github.com/go-errors/errors v1.0.1 github.com/go-kit/kit v0.10.0 @@ -143,6 +144,7 @@ replace ( github.com/filecoin-project/go-jsonrpc => github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc github.com/filecoin-project/test-vectors => ./extern/test-vectors github.com/filecoin-project/venus => ./ + github.com/filecoin-project/venus/venus-shared => ./venus-shared github.com/golangci/golangci-lint => github.com/golangci/golangci-lint v1.39.0 github.com/ipfs/go-ipfs-cmds => github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab ) diff --git a/pkg/chain/circulating_supply.go b/pkg/chain/circulating_supply.go index d68837e944..44e2524bba 100644 --- a/pkg/chain/circulating_supply.go +++ b/pkg/chain/circulating_supply.go @@ -2,9 +2,10 @@ package chain import ( "context" - "github.com/filecoin-project/venus/pkg/constants" "sync" + "github.com/filecoin-project/venus/pkg/constants" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" @@ -16,12 +17,13 @@ import ( "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/market" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/power" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/reward" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type ICirculatingSupplyCalcualtor interface { @@ -369,7 +371,7 @@ func GetFilMined(ctx context.Context, st tree.Tree) (abi.TokenAmount, error) { return big.Zero(), xerrors.Errorf("failed to load reward actor state: %v", err) } - rst, err := reward.Load(adt.WrapStore(ctx, st.GetStore()), ractor) + rst, err := reward.Load(adt.WrapStore(ctx, st.GetStore()), (*types.Actor)(ractor)) if err != nil { return big.Zero(), err } @@ -409,7 +411,7 @@ func getFilMarketLocked(ctx context.Context, st tree.Tree) (abi.TokenAmount, err return big.Zero(), xerrors.Errorf("failed to load market actor: %v", err) } - mst, err := market.Load(adt.WrapStore(ctx, st.GetStore()), act) + mst, err := market.Load(adt.WrapStore(ctx, st.GetStore()), (*types.Actor)(act)) if err != nil { return big.Zero(), xerrors.Errorf("failed to load market state: %v", err) } @@ -423,7 +425,7 @@ func getFilPowerLocked(ctx context.Context, st tree.Tree) (abi.TokenAmount, erro return big.Zero(), xerrors.Errorf("failed to load power actor: %v", err) } - pst, err := power.Load(adt.WrapStore(ctx, st.GetStore()), pactor) + pst, err := power.Load(adt.WrapStore(ctx, st.GetStore()), (*types.Actor)(pactor)) if err != nil { return big.Zero(), xerrors.Errorf("failed to load power state: %v", err) } diff --git a/pkg/chain/store.go b/pkg/chain/store.go index 67551c9d08..91717f0ad8 100644 --- a/pkg/chain/store.go +++ b/pkg/chain/store.go @@ -35,17 +35,18 @@ import ( "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/state/tree" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - _init "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/market" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/multisig" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/power" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/reward" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/verifreg" - "github.com/filecoin-project/venus/pkg/types/specactors/policy" "github.com/filecoin-project/venus/pkg/util" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + _init "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/multisig" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/verifreg" + "github.com/filecoin-project/venus/venus-shared/actors/policy" + types2 "github.com/filecoin-project/venus/venus-shared/chain" ) // HeadChangeTopic is the topic used to publish new heads. @@ -1096,7 +1097,7 @@ func (store *Store) getCirculatingSupply(ctx context.Context, height abi.ChainEp unCirc = big.Add(unCirc, actor.Balance) case a == market.Address: - mst, err := market.Load(adtStore, actor) + mst, err := market.Load(adtStore, (*types2.Actor)(actor)) if err != nil { return err } @@ -1113,7 +1114,7 @@ func (store *Store) getCirculatingSupply(ctx context.Context, height abi.ChainEp circ = big.Add(circ, actor.Balance) case builtin.IsStorageMinerActor(actor.Code): - mst, err := miner.Load(adtStore, actor) + mst, err := miner.Load(adtStore, (*types2.Actor)(actor)) if err != nil { return err } @@ -1130,7 +1131,7 @@ func (store *Store) getCirculatingSupply(ctx context.Context, height abi.ChainEp } case builtin.IsMultisigActor(actor.Code): - mst, err := multisig.Load(adtStore, actor) + mst, err := multisig.Load(adtStore, (*types2.Actor)(actor)) if err != nil { return err } diff --git a/pkg/chain/utils.go b/pkg/chain/utils.go index ee265e3fcb..5d502e0722 100644 --- a/pkg/chain/utils.go +++ b/pkg/chain/utils.go @@ -1,12 +1,13 @@ package chain import ( - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "reflect" "runtime" "strings" + "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/rt" blockFormat "github.com/ipfs/go-block-format" @@ -19,7 +20,7 @@ import ( exported5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/exported" exported6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/exported" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" ) type MethodMeta struct { diff --git a/pkg/chainsync/exchange/protocol.go b/pkg/chainsync/exchange/protocol.go index 46dbfd432f..b9622a0e1b 100644 --- a/pkg/chainsync/exchange/protocol.go +++ b/pkg/chainsync/exchange/protocol.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/policy" + "github.com/filecoin-project/venus/venus-shared/actors/policy" logging "github.com/ipfs/go-log" "golang.org/x/xerrors" ) diff --git a/pkg/chainsync/syncer/syncer.go b/pkg/chainsync/syncer/syncer.go index ffa604967f..7cb002095b 100644 --- a/pkg/chainsync/syncer/syncer.go +++ b/pkg/chainsync/syncer/syncer.go @@ -3,13 +3,14 @@ package syncer import ( "context" "fmt" - "github.com/filecoin-project/venus/pkg/consensus" - "github.com/filecoin-project/venus/pkg/statemanger" - "github.com/hashicorp/go-multierror" "sync" "sync/atomic" "time" + "github.com/filecoin-project/venus/pkg/consensus" + "github.com/filecoin-project/venus/pkg/statemanger" + "github.com/hashicorp/go-multierror" + "golang.org/x/sync/errgroup" syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" @@ -24,8 +25,8 @@ import ( "github.com/filecoin-project/venus/pkg/metrics" "github.com/filecoin-project/venus/pkg/metrics/tracing" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/policy" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + "github.com/filecoin-project/venus/venus-shared/actors/policy" "github.com/ipfs/go-cid" blockstore "github.com/ipfs/go-ipfs-blockstore" logging "github.com/ipfs/go-log/v2" diff --git a/pkg/chainsync/syncer/syncer_test.go b/pkg/chainsync/syncer/syncer_test.go index a15f1fe3ea..34940086ef 100644 --- a/pkg/chainsync/syncer/syncer_test.go +++ b/pkg/chainsync/syncer/syncer_test.go @@ -2,10 +2,11 @@ package syncer_test import ( "context" - "github.com/filecoin-project/venus/pkg/statemanger" "testing" "time" + "github.com/filecoin-project/venus/pkg/statemanger" + syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" emptycid "github.com/filecoin-project/venus/pkg/testhelpers/empty_cid" @@ -18,8 +19,8 @@ import ( "github.com/filecoin-project/venus/pkg/fork" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/policy" "github.com/filecoin-project/venus/pkg/util/test" + "github.com/filecoin-project/venus/venus-shared/actors/policy" "github.com/ipfs/go-cid" "github.com/pkg/errors" "github.com/stretchr/testify/assert" diff --git a/pkg/clock/chainclock.go b/pkg/clock/chainclock.go index 2b1447906f..8f3d7cc88e 100644 --- a/pkg/clock/chainclock.go +++ b/pkg/clock/chainclock.go @@ -6,7 +6,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" ) // DefaultEpochDuration is the default duration of epochs diff --git a/pkg/consensus/block_validator.go b/pkg/consensus/block_validator.go index 7606384be3..4b85ee0e7a 100644 --- a/pkg/consensus/block_validator.go +++ b/pkg/consensus/block_validator.go @@ -5,11 +5,12 @@ import ( "context" "errors" "fmt" - "go.opencensus.io/trace" "os" "strings" "time" + "go.opencensus.io/trace" + blockadt "github.com/filecoin-project/specs-actors/actors/util/adt" pubsub "github.com/libp2p/go-libp2p-pubsub" cbg "github.com/whyrusleeping/cbor-gen" @@ -30,12 +31,13 @@ import ( appstate "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/state/tree" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/power" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/pkg/vm/gas" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" + types2 "github.com/filecoin-project/venus/venus-shared/chain" "github.com/hashicorp/go-multierror" lru "github.com/hashicorp/golang-lru" "github.com/ipfs/go-cid" @@ -480,7 +482,7 @@ func (bv *BlockValidator) minerIsValid(ctx context.Context, maddr address.Addres return xerrors.New("power actor not found") } - ps, err := power.Load(adt.WrapStore(ctx, vms), pact) + ps, err := power.Load(adt.WrapStore(ctx, vms), (*types2.Actor)(pact)) if err != nil { return err } @@ -605,7 +607,7 @@ func (bv *BlockValidator) MinerEligibleToMine(ctx context.Context, addr address. return false, xerrors.New("power actor not found") } - pstate, err := power.Load(adt.WrapStore(ctx, bv.cstore), pact) + pstate, err := power.Load(adt.WrapStore(ctx, bv.cstore), (*types2.Actor)(pact)) if err != nil { return false, err } @@ -619,7 +621,7 @@ func (bv *BlockValidator) MinerEligibleToMine(ctx context.Context, addr address. return false, xerrors.Errorf("miner actor %s not found", addr) } - mstate, err := miner.Load(adt.WrapStore(ctx, vms), mact) + mstate, err := miner.Load(adt.WrapStore(ctx, vms), (*types2.Actor)(mact)) if err != nil { return false, err } @@ -669,7 +671,7 @@ func (bv *BlockValidator) minerHasMinPower(ctx context.Context, addr address.Add return false, xerrors.New("power actor not found") } - ps, err := power.Load(adt.WrapStore(ctx, vms), pact) + ps, err := power.Load(adt.WrapStore(ctx, vms), (*types2.Actor)(pact)) if err != nil { return false, err } diff --git a/pkg/consensus/testing_poster.go b/pkg/consensus/testing_poster.go index f5666721a5..4539edcf03 100644 --- a/pkg/consensus/testing_poster.go +++ b/pkg/consensus/testing_poster.go @@ -6,7 +6,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" ) // TestElectionPoster generates and verifies electoin PoSts diff --git a/pkg/consensusfault/check.go b/pkg/consensusfault/check.go index 9e6c82b6d1..f76632912c 100644 --- a/pkg/consensusfault/check.go +++ b/pkg/consensusfault/check.go @@ -4,16 +4,18 @@ import ( "bytes" "context" "fmt" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/pkg/fork" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" - "github.com/filecoin-project/venus/pkg/types/specactors/policy" "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/pkg/vm/vmcontext" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/actors/policy" + types2 "github.com/filecoin-project/venus/venus-shared/chain" cbornode "github.com/ipfs/go-ipld-cbor" "github.com/filecoin-project/venus/pkg/config" @@ -159,7 +161,7 @@ func verifyBlockSignature(ctx context.Context, blk types.BlockHeader, nv network return errors.Wrapf(err, "failed to get miner actor") } - mas, err := miner.Load(adt.WrapStore(ctx, gasIpld), act) + mas, err := miner.Load(adt.WrapStore(ctx, gasIpld), (*types2.Actor)(act)) if err != nil { return xerrors.Errorf("failed to load state for miner %s", receiver) } diff --git a/pkg/constants/shared_vals.go b/pkg/constants/shared_vals.go index 87dc816ae1..7637f04758 100644 --- a/pkg/constants/shared_vals.go +++ b/pkg/constants/shared_vals.go @@ -3,7 +3,7 @@ package constants import ( "math/big" - "github.com/filecoin-project/venus/pkg/types/specactors/policy" + "github.com/filecoin-project/venus/venus-shared/actors/policy" "github.com/filecoin-project/go-address" diff --git a/pkg/events/state/predicates.go b/pkg/events/state/predicates.go index d72c911306..2d1f7c29a5 100644 --- a/pkg/events/state/predicates.go +++ b/pkg/events/state/predicates.go @@ -11,11 +11,12 @@ import ( "github.com/filecoin-project/venus/app/submodule/chain" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/market" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" + types2 "github.com/filecoin-project/venus/venus-shared/chain" ) // UserData is the data returned from the DiffTipSetKeyFunc @@ -72,11 +73,11 @@ type DiffStorageMarketStateFunc func(ctx context.Context, oldState market.State, // OnStorageMarketActorChanged calls diffStorageMarketState when the state changes for the market actor func (sp *StatePredicates) OnStorageMarketActorChanged(diffStorageMarketState DiffStorageMarketStateFunc) DiffTipSetKeyFunc { return sp.OnActorStateChanged(market.Address, func(ctx context.Context, oldActorState, newActorState *types.Actor) (changed bool, user UserData, err error) { - oldState, err := market.Load(adt.WrapStore(ctx, sp.cst), oldActorState) + oldState, err := market.Load(adt.WrapStore(ctx, sp.cst), (*types2.Actor)(oldActorState)) if err != nil { return false, nil, err } - newState, err := market.Load(adt.WrapStore(ctx, sp.cst), newActorState) + newState, err := market.Load(adt.WrapStore(ctx, sp.cst), (*types2.Actor)(newActorState)) if err != nil { return false, nil, err } @@ -308,11 +309,11 @@ type DiffMinerActorStateFunc func(ctx context.Context, oldState miner.State, new func (sp *StatePredicates) OnInitActorChange(diffInitActorState DiffInitActorStateFunc) DiffTipSetKeyFunc { return sp.OnActorStateChanged(init_.Address, func(ctx context.Context, oldActorState, newActorState *types.Actor) (changed bool, user UserData, err error) { - oldState, err := init_.Load(adt.WrapStore(ctx, sp.cst), oldActorState) + oldState, err := init_.Load(adt.WrapStore(ctx, sp.cst), (*types2.Actor)(oldActorState)) if err != nil { return false, nil, err } - newState, err := init_.Load(adt.WrapStore(ctx, sp.cst), newActorState) + newState, err := init_.Load(adt.WrapStore(ctx, sp.cst), (*types2.Actor)(newActorState)) if err != nil { return false, nil, err } @@ -323,11 +324,11 @@ func (sp *StatePredicates) OnInitActorChange(diffInitActorState DiffInitActorSta func (sp *StatePredicates) OnMinerActorChange(minerAddr address.Address, diffMinerActorState DiffMinerActorStateFunc) DiffTipSetKeyFunc { return sp.OnActorStateChanged(minerAddr, func(ctx context.Context, oldActorState, newActorState *types.Actor) (changed bool, user UserData, err error) { - oldState, err := miner.Load(adt.WrapStore(ctx, sp.cst), oldActorState) + oldState, err := miner.Load(adt.WrapStore(ctx, sp.cst), (*types2.Actor)(oldActorState)) if err != nil { return false, nil, err } - newState, err := miner.Load(adt.WrapStore(ctx, sp.cst), newActorState) + newState, err := miner.Load(adt.WrapStore(ctx, sp.cst), (*types2.Actor)(newActorState)) if err != nil { return false, nil, err } @@ -371,11 +372,11 @@ type DiffPaymentChannelStateFunc func(ctx context.Context, oldState paych.State, // OnPaymentChannelActorChanged calls diffPaymentChannelState when the state changes for the the payment channel actor func (sp *StatePredicates) OnPaymentChannelActorChanged(paychAddr address.Address, diffPaymentChannelState DiffPaymentChannelStateFunc) DiffTipSetKeyFunc { return sp.OnActorStateChanged(paychAddr, func(ctx context.Context, oldActorState, newActorState *types.Actor) (changed bool, user UserData, err error) { - oldState, err := paych.Load(adt.WrapStore(ctx, sp.cst), oldActorState) + oldState, err := paych.Load(adt.WrapStore(ctx, sp.cst), (*types2.Actor)(oldActorState)) if err != nil { return false, nil, err } - newState, err := paych.Load(adt.WrapStore(ctx, sp.cst), newActorState) + newState, err := paych.Load(adt.WrapStore(ctx, sp.cst), (*types2.Actor)(newActorState)) if err != nil { return false, nil, err } diff --git a/pkg/events/state/predicates_test.go b/pkg/events/state/predicates_test.go index f52ff17e72..9743cd689a 100644 --- a/pkg/events/state/predicates_test.go +++ b/pkg/events/state/predicates_test.go @@ -2,13 +2,15 @@ package state import ( "context" + "testing" + test "github.com/filecoin-project/venus/pkg/events/state/mock" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/market" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - "testing" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + types2 "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" cbornode "github.com/ipfs/go-ipld-cbor" @@ -205,7 +207,7 @@ func TestMarketPredicates(t *testing.T) { marketState0 := test.CreateEmptyMarketState(t, store) marketCid, err := store.Put(ctx, marketState0) require.NoError(t, err) - marketState, err := market.Load(store, &types.Actor{ + marketState, err := market.Load(store, &types2.Actor{ Code: builtin2.StorageMarketActorCodeID, Head: marketCid, }) @@ -318,7 +320,7 @@ func TestMarketPredicates(t *testing.T) { marketState0 := test.CreateEmptyMarketState(t, store) marketCid, err := store.Put(ctx, marketState0) require.NoError(t, err) - marketState, err := market.Load(store, &types.Actor{ + marketState, err := market.Load(store, &types2.Actor{ Code: builtin2.StorageMarketActorCodeID, Head: marketCid, }) diff --git a/pkg/fork/fork.go b/pkg/fork/fork.go index 2cd5bf18b0..c20d8f5ef7 100644 --- a/pkg/fork/fork.go +++ b/pkg/fork/fork.go @@ -5,12 +5,13 @@ import ( "context" "encoding/binary" "errors" - "golang.org/x/xerrors" "runtime" "sort" "sync" "time" + "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -44,11 +45,12 @@ import ( "github.com/filecoin-project/venus/pkg/constants" vmstate "github.com/filecoin-project/venus/pkg/state/tree" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/multisig" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/multisig" + types2 "github.com/filecoin-project/venus/venus-shared/chain" ) var log = logging.Logger("fork") @@ -911,7 +913,7 @@ func setNetworkName(ctx context.Context, store adt.Store, tree *vmstate.State, n return xerrors.New("did not find init actor") } - initState, err := init_.Load(store, ia) + initState, err := init_.Load(store, (*types2.Actor)(ia)) if err != nil { return xerrors.Errorf("reading init state: %v", err) } @@ -1022,7 +1024,7 @@ func splitGenesisMultisig0(ctx context.Context, addr address.Address, store adt0 return xerrors.Errorf("did not find actor: %s", addr.String()) } - mst, err := multisig.Load(store, mact) + mst, err := multisig.Load(store, (*types2.Actor)(mact)) if err != nil { return xerrors.Errorf("getting msig state: %v", err) } @@ -1498,7 +1500,7 @@ func terminateActor(ctx context.Context, tree *vmstate.State, addr address.Addre return types.ErrActorNotFound } - ias, err := init_.Load(&vmstate.AdtStore{IpldStore: tree.Store}, ia) + ias, err := init_.Load(&vmstate.AdtStore{IpldStore: tree.Store}, (*types2.Actor)(ia)) if err != nil { return xerrors.Errorf("loading init actor state: %v", err) } diff --git a/pkg/gen/genesis/f00_system.go b/pkg/gen/genesis/f00_system.go index 2a9020ce87..19cf3432a9 100644 --- a/pkg/gen/genesis/f00_system.go +++ b/pkg/gen/genesis/f00_system.go @@ -5,9 +5,9 @@ import ( "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/system" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/system" cbor "github.com/ipfs/go-ipld-cbor" @@ -15,7 +15,7 @@ import ( bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" ) -func SetupSystemActor(ctx context.Context, bs bstore.Blockstore, av specactors.Version) (*types.Actor, error) { +func SetupSystemActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { var st system.State cst := cbor.NewCborStore(bs) diff --git a/pkg/gen/genesis/f01_init.go b/pkg/gen/genesis/f01_init.go index 4c50eb0732..ae4746a7ba 100644 --- a/pkg/gen/genesis/f01_init.go +++ b/pkg/gen/genesis/f01_init.go @@ -16,12 +16,12 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" ) -func SetupInitActor(ctx context.Context, bs bstore.Blockstore, netname string, initialActors []Actor, rootVerifier Actor, remainder Actor, av specactors.Version) (int64, *types.Actor, map[address.Address]address.Address, error) { +func SetupInitActor(ctx context.Context, bs bstore.Blockstore, netname string, initialActors []Actor, rootVerifier Actor, remainder Actor, av actors.Version) (int64, *types.Actor, map[address.Address]address.Address, error) { if len(initialActors) > MaxAccounts { return 0, nil, nil, xerrors.New("too many initial actors") } diff --git a/pkg/gen/genesis/f02_reward.go b/pkg/gen/genesis/f02_reward.go index e3e0aa2814..d221f131d1 100644 --- a/pkg/gen/genesis/f02_reward.go +++ b/pkg/gen/genesis/f02_reward.go @@ -4,9 +4,9 @@ import ( "context" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/reward" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" "github.com/filecoin-project/go-state-types/big" @@ -16,7 +16,7 @@ import ( bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" ) -func SetupRewardActor(ctx context.Context, bs bstore.Blockstore, qaPower big.Int, av specactors.Version) (*types.Actor, error) { +func SetupRewardActor(ctx context.Context, bs bstore.Blockstore, qaPower big.Int, av actors.Version) (*types.Actor, error) { cst := cbor.NewCborStore(bs) rst, err := reward.MakeState(adt.WrapStore(ctx, cst), av, qaPower) if err != nil { diff --git a/pkg/gen/genesis/f03_cron.go b/pkg/gen/genesis/f03_cron.go index c75a586bf2..92bc48b2a1 100644 --- a/pkg/gen/genesis/f03_cron.go +++ b/pkg/gen/genesis/f03_cron.go @@ -6,15 +6,15 @@ import ( "github.com/filecoin-project/go-state-types/big" cbor "github.com/ipfs/go-ipld-cbor" - "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/cron" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/cron" "github.com/filecoin-project/venus/pkg/types" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" ) -func SetupCronActor(ctx context.Context, bs bstore.Blockstore, av specactors.Version) (*types.Actor, error) { +func SetupCronActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { cst := cbor.NewCborStore(bs) st, err := cron.MakeState(adt.WrapStore(ctx, cbor.NewCborStore(bs)), av) if err != nil { diff --git a/pkg/gen/genesis/f04_power.go b/pkg/gen/genesis/f04_power.go index 5294eb1edc..04a04dae4d 100644 --- a/pkg/gen/genesis/f04_power.go +++ b/pkg/gen/genesis/f04_power.go @@ -3,8 +3,8 @@ package genesis import ( "context" - "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/power" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/specs-actors/actors/util/adt" @@ -15,7 +15,7 @@ import ( bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" ) -func SetupStoragePowerActor(ctx context.Context, bs bstore.Blockstore, av specactors.Version) (*types.Actor, error) { +func SetupStoragePowerActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { cst := cbor.NewCborStore(bs) pst, err := power.MakeState(adt.WrapStore(ctx, cbor.NewCborStore(bs)), av) diff --git a/pkg/gen/genesis/f05_market.go b/pkg/gen/genesis/f05_market.go index bb29104e01..84909f30a1 100644 --- a/pkg/gen/genesis/f05_market.go +++ b/pkg/gen/genesis/f05_market.go @@ -6,15 +6,15 @@ import ( "github.com/filecoin-project/go-state-types/big" cbor "github.com/ipfs/go-ipld-cbor" - "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/market" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" "github.com/filecoin-project/venus/pkg/types" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" ) -func SetupStorageMarketActor(ctx context.Context, bs bstore.Blockstore, av specactors.Version) (*types.Actor, error) { +func SetupStorageMarketActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { cst := cbor.NewCborStore(bs) mst, err := market.MakeState(adt.WrapStore(ctx, cbor.NewCborStore(bs)), av) if err != nil { diff --git a/pkg/gen/genesis/f06_vreg.go b/pkg/gen/genesis/f06_vreg.go index bfc7dac52c..0f3e44a8e1 100644 --- a/pkg/gen/genesis/f06_vreg.go +++ b/pkg/gen/genesis/f06_vreg.go @@ -3,8 +3,8 @@ package genesis import ( "context" - "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/verifreg" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/verifreg" "github.com/filecoin-project/go-address" cbor "github.com/ipfs/go-ipld-cbor" @@ -29,7 +29,7 @@ func init() { RootVerifierID = idk } -func SetupVerifiedRegistryActor(ctx context.Context, bs bstore.Blockstore, av specactors.Version) (*types.Actor, error) { +func SetupVerifiedRegistryActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { cst := cbor.NewCborStore(bs) vst, err := verifreg.MakeState(adt.WrapStore(ctx, cbor.NewCborStore(bs)), av, RootVerifierID) if err != nil { diff --git a/pkg/gen/genesis/genesis.go b/pkg/gen/genesis/genesis.go index 12a1159b41..478ec83f7b 100644 --- a/pkg/gen/genesis/genesis.go +++ b/pkg/gen/genesis/genesis.go @@ -23,27 +23,26 @@ import ( "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/multisig" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/multisig" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/account" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/account" - "github.com/filecoin-project/venus/pkg/types/specactors" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/verifreg" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/verifreg" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/market" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/power" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/cron" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/cron" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/reward" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/system" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/system" - - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" @@ -155,7 +154,7 @@ func MakeInitialStateTree(ctx context.Context, bs bstore.Blockstore, template Te return nil, nil, xerrors.Errorf("making new state tree: %w", err) } - av, err := specactors.VersionForNetwork(template.NetworkVersion) + av, err := actors.VersionForNetwork(template.NetworkVersion) if err != nil { return nil, nil, xerrors.Errorf("get actor version: %w", err) } @@ -369,7 +368,7 @@ func MakeInitialStateTree(ctx context.Context, bs bstore.Blockstore, template Te return state, keyIDs, nil } -func makeAccountActor(ctx context.Context, cst cbor.IpldStore, av specactors.Version, addr address.Address, bal types.BigInt) (*types.Actor, error) { +func makeAccountActor(ctx context.Context, cst cbor.IpldStore, av actors.Version, addr address.Address, bal types.BigInt) (*types.Actor, error) { ast, err := account.MakeState(adt.WrapStore(ctx, cst), av, addr) if err != nil { return nil, err @@ -394,7 +393,7 @@ func makeAccountActor(ctx context.Context, cst cbor.IpldStore, av specactors.Ver return act, nil } -func createAccountActor(ctx context.Context, cst cbor.IpldStore, state *tree.State, info Actor, keyIDs map[address.Address]address.Address, av specactors.Version) error { +func createAccountActor(ctx context.Context, cst cbor.IpldStore, state *tree.State, info Actor, keyIDs map[address.Address]address.Address, av actors.Version) error { var ainfo AccountMeta if err := json.Unmarshal(info.Meta, &ainfo); err != nil { return xerrors.Errorf("unmarshaling account meta: %w", err) @@ -417,7 +416,7 @@ func createAccountActor(ctx context.Context, cst cbor.IpldStore, state *tree.Sta return nil } -func createMultisigAccount(ctx context.Context, cst cbor.IpldStore, state *tree.State, ida address.Address, info Actor, keyIDs map[address.Address]address.Address, av specactors.Version) error { +func createMultisigAccount(ctx context.Context, cst cbor.IpldStore, state *tree.State, ida address.Address, info Actor, keyIDs map[address.Address]address.Address, av actors.Version) error { if info.Type != TMultisig { return fmt.Errorf("can only call createMultisigAccount with multisig Actor info") } diff --git a/pkg/gen/genesis/miners.go b/pkg/gen/genesis/miners.go index f7103c2d7a..dfeadeaf6b 100644 --- a/pkg/gen/genesis/miners.go +++ b/pkg/gen/genesis/miners.go @@ -13,23 +13,23 @@ import ( market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" - "github.com/filecoin-project/venus/pkg/types/specactors" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/policy" - "github.com/filecoin-project/venus/pkg/types/specactors/policy" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + types2 "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-state-types/network" market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/power" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/reward" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/market" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" @@ -84,7 +84,7 @@ func mkFakedSigSyscalls(sys vmcontext.SyscallsImpl) vmcontext.SyscallsImpl { // Note: Much of this is brittle, if the methodNum / param / return changes, it will break things func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, miners []Miner, nv network.Version, para *config.ForkUpgradeConfig) (cid.Cid, error) { cst := cbor.NewCborStore(cs.Blockstore()) - av, err := specactors.VersionForNetwork(nv) + av, err := actors.VersionForNetwork(nv) if err != nil { return cid.Undef, xerrors.Errorf("get actor version: %w", err) } @@ -179,7 +179,7 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min return cid.Undef, xerrors.New("actor not found") } - mst, err := miner.Load(adt.WrapStore(ctx, cst), mact) + mst, err := miner.Load(adt.WrapStore(ctx, cst), (*types2.Actor)(mact)) if err != nil { return cid.Undef, xerrors.Errorf("getting newly created miner state: %w", err) } @@ -287,7 +287,7 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min return cid.Undef, xerrors.New("power actor not exist") } - pst, err := power.Load(adt.WrapStore(ctx, cst), pact) + pst, err := power.Load(adt.WrapStore(ctx, cst), (*types2.Actor)(pact)) if err != nil { return cid.Undef, xerrors.Errorf("getting power state: %w", err) } @@ -319,7 +319,7 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min return cid.Undef, xerrors.Errorf("setting power state: %w", err) } - ver, err := specactors.VersionForNetwork(nv) + ver, err := actors.VersionForNetwork(nv) if err != nil { return cid.Undef, xerrors.Errorf("get actor version: %w", err) } @@ -370,7 +370,7 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min return cid.Undef, xerrors.New("power actor not exist") } - pst, err := power.Load(adt.WrapStore(ctx, cst), pact) + pst, err := power.Load(adt.WrapStore(ctx, cst), (*types2.Actor)(pact)) if err != nil { return cid.Undef, xerrors.Errorf("getting power state: %w", err) } @@ -431,7 +431,7 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min // Commit one-by-one, otherwise pledge math tends to explode var paramBytes []byte - if av >= specactors.Version6 { + if av >= actors.Version6 { // TODO: fixup confirmParams := &builtin6.ConfirmSectorProofsParams{ Sectors: []abi.SectorNumber{preseal.SectorID}, @@ -451,7 +451,7 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min return cid.Undef, xerrors.Errorf("failed to confirm presealed sectors: %w", err) } - if av > specactors.Version2 { + if av > actors.Version2 { // post v2, we need to explicitly Claim this power since ConfirmSectorProofsValid doesn't do it anymore claimParams := &power4.UpdateClaimedPowerParams{ RawByteDelta: types.NewInt(uint64(m.SectorSize)), @@ -477,7 +477,7 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min return cid.Undef, xerrors.New("actor not found") } - mst, err := miner.Load(adt.WrapStore(ctx, cst), mact) + mst, err := miner.Load(adt.WrapStore(ctx, cst), (*types2.Actor)(mact)) if err != nil { return cid.Undef, xerrors.Errorf("getting miner state: %w", err) } @@ -515,7 +515,7 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min return cid.Undef, xerrors.New("actor not found") } - pst, err := power.Load(adt.WrapStore(ctx, cst), pact) + pst, err := power.Load(adt.WrapStore(ctx, cst), (*types2.Actor)(pact)) if err != nil { return cid.Undef, xerrors.Errorf("getting power state: %w", err) } @@ -570,9 +570,9 @@ func currentTotalPower(ctx context.Context, vmi vm.Interpreter, maddr address.Ad return &pwr, nil } -func dealWeight(ctx context.Context, vmi vm.Interpreter, maddr address.Address, dealIDs []abi.DealID, sectorStart, sectorExpiry abi.ChainEpoch, av specactors.Version) (abi.DealWeight, abi.DealWeight, error) { +func dealWeight(ctx context.Context, vmi vm.Interpreter, maddr address.Address, dealIDs []abi.DealID, sectorStart, sectorExpiry abi.ChainEpoch, av actors.Version) (abi.DealWeight, abi.DealWeight, error) { // TODO: This hack should move to market actor wrapper - if av <= specactors.Version2 { + if av <= actors.Version2 { params := &market0.VerifyDealsForActivationParams{ DealIDs: dealIDs, SectorStart: sectorStart, @@ -619,14 +619,14 @@ func dealWeight(ctx context.Context, vmi vm.Interpreter, maddr address.Address, return dealWeights.Sectors[0].DealWeight, dealWeights.Sectors[0].VerifiedDealWeight, nil } -func currentEpochBlockReward(ctx context.Context, vmi vm.Interpreter, maddr address.Address, av specactors.Version) (abi.StoragePower, builtin.FilterEstimate, error) { +func currentEpochBlockReward(ctx context.Context, vmi vm.Interpreter, maddr address.Address, av actors.Version) (abi.StoragePower, builtin.FilterEstimate, error) { rwret, err := doExecValue(ctx, vmi, reward.Address, maddr, big.Zero(), reward.Methods.ThisEpochReward, nil) if err != nil { return big.Zero(), builtin.FilterEstimate{}, err } // TODO: This hack should move to reward actor wrapper - if av <= specactors.Version2 { + if av <= actors.Version2 { var epochReward reward0.ThisEpochRewardReturn if err := epochReward.UnmarshalCBOR(bytes.NewReader(rwret)); err != nil { diff --git a/pkg/gen/genesis/util.go b/pkg/gen/genesis/util.go index 6618daab8f..fb68840879 100644 --- a/pkg/gen/genesis/util.go +++ b/pkg/gen/genesis/util.go @@ -10,12 +10,12 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/vm" + "github.com/filecoin-project/venus/venus-shared/actors" ) func mustEnc(i cbg.CBORMarshaler) []byte { - enc, err := specactors.SerializeParams(i) + enc, err := actors.SerializeParams(i) if err != nil { panic(err) // ok } diff --git a/pkg/market/fundmanager.go b/pkg/market/fundmanager.go index 70ff5a59cf..b530068e5a 100644 --- a/pkg/market/fundmanager.go +++ b/pkg/market/fundmanager.go @@ -3,15 +3,16 @@ package market import ( "context" "fmt" - "github.com/filecoin-project/venus/app/client/apiface" "sync" + "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/market" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" @@ -661,7 +662,7 @@ func (env *fundManagerEnvironment) AddFunds( addr address.Address, amt abi.TokenAmount, ) (cid.Cid, error) { - params, err := specactors.SerializeParams(&addr) + params, err := actors.SerializeParams(&addr) if err != nil { return cid.Undef, err } @@ -686,7 +687,7 @@ func (env *fundManagerEnvironment) WithdrawFunds( addr address.Address, amt abi.TokenAmount, ) (cid.Cid, error) { - params, err := specactors.SerializeParams(&market.WithdrawBalanceParams{ + params, err := actors.SerializeParams(&market.WithdrawBalanceParams{ ProviderOrClientAddress: addr, Amount: amt, }) diff --git a/pkg/market/fundmanager_test.go b/pkg/market/fundmanager_test.go index 0257ab483e..d6c67bf2ad 100644 --- a/pkg/market/fundmanager_test.go +++ b/pkg/market/fundmanager_test.go @@ -13,7 +13,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/market" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" "github.com/ipfs/go-datastore" "sync" diff --git a/pkg/messagepool/gas.go b/pkg/messagepool/gas.go index 53cfc4f7ab..fe718a5ab6 100644 --- a/pkg/messagepool/gas.go +++ b/pkg/messagepool/gas.go @@ -17,9 +17,9 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/fork" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" "github.com/filecoin-project/venus/pkg/vm" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" ) const MinGasPremium = 100e3 diff --git a/pkg/messagepool/gasguess/guessgas.go b/pkg/messagepool/gasguess/guessgas.go index 5675f6d903..b0b06dabda 100644 --- a/pkg/messagepool/gasguess/guessgas.go +++ b/pkg/messagepool/gasguess/guessgas.go @@ -7,7 +7,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" diff --git a/pkg/messagepool/provider.go b/pkg/messagepool/provider.go index e95257a5d7..765a0a5376 100644 --- a/pkg/messagepool/provider.go +++ b/pkg/messagepool/provider.go @@ -2,17 +2,18 @@ package messagepool import ( "context" + "time" + "github.com/filecoin-project/go-address" tbig "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/statemanger" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/policy" + "github.com/filecoin-project/venus/venus-shared/actors/policy" "github.com/ipfs/go-cid" pubsub "github.com/libp2p/go-libp2p-pubsub" "golang.org/x/xerrors" - "time" ) var ( diff --git a/pkg/paychmgr/manager.go b/pkg/paychmgr/manager.go index 8ed8b6cf57..f753336e92 100644 --- a/pkg/paychmgr/manager.go +++ b/pkg/paychmgr/manager.go @@ -3,9 +3,10 @@ package paychmgr import ( "context" "errors" + "sync" + "github.com/filecoin-project/venus/pkg/statemanger" "github.com/filecoin-project/venus/pkg/types" - "sync" "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" @@ -14,7 +15,7 @@ import ( xerrors "golang.org/x/xerrors" "github.com/filecoin-project/go-address" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" ) var log = logging.Logger("paych") diff --git a/pkg/paychmgr/mock_test.go b/pkg/paychmgr/mock_test.go index 5f1a7409f4..a0a50799c7 100644 --- a/pkg/paychmgr/mock_test.go +++ b/pkg/paychmgr/mock_test.go @@ -3,13 +3,14 @@ package paychmgr import ( "context" "errors" + "sync" + crypto2 "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/vm" - "sync" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/market" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" "github.com/ipfs/go-cid" @@ -18,7 +19,7 @@ import ( "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" ) type mockManagerAPI struct { diff --git a/pkg/paychmgr/paych.go b/pkg/paychmgr/paych.go index afdfe71524..e8117a0fa3 100644 --- a/pkg/paychmgr/paych.go +++ b/pkg/paychmgr/paych.go @@ -3,6 +3,7 @@ package paychmgr import ( "context" "fmt" + "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/types" @@ -13,8 +14,8 @@ import ( cborutil "github.com/filecoin-project/go-cbor-util" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" ) // insufficientFundsErr indicates that there are not enough funds in the @@ -87,7 +88,7 @@ func (ca *channelAccessor) messageBuilder(ctx context.Context, from address.Addr return nil, err } - ver, err := specactors.VersionForNetwork(nwVersion) + ver, err := actors.VersionForNetwork(nwVersion) if err != nil { return nil, err } @@ -320,7 +321,7 @@ func (ca *channelAccessor) checkVoucherSpendable(ctx context.Context, ch address return false, err } - ret, err := ca.api.Call(ctx, mes, nil) + ret, err := ca.api.Call(ctx, (*types.UnsignedMessage)(mes), nil) if err != nil { return false, err } @@ -437,7 +438,7 @@ func (ca *channelAccessor) submitVoucher(ctx context.Context, ch address.Address return cid.Undef, err } - smsg, err := ca.api.MpoolPushMessage(ctx, msg, nil) + smsg, err := ca.api.MpoolPushMessage(ctx, (*types.UnsignedMessage)(msg), nil) if err != nil { return cid.Undef, err } @@ -593,7 +594,7 @@ func (ca *channelAccessor) settle(ctx context.Context, ch address.Address) (cid. if err != nil { return cid.Undef, err } - smgs, err := ca.api.MpoolPushMessage(ctx, msg, nil) + smgs, err := ca.api.MpoolPushMessage(ctx, (*types.UnsignedMessage)(msg), nil) if err != nil { return cid.Undef, err } @@ -625,7 +626,7 @@ func (ca *channelAccessor) collect(ctx context.Context, ch address.Address) (cid return cid.Undef, err } - smsg, err := ca.api.MpoolPushMessage(ctx, msg, nil) + smsg, err := ca.api.MpoolPushMessage(ctx, (*types.UnsignedMessage)(msg), nil) if err != nil { return cid.Undef, err } diff --git a/pkg/paychmgr/paych_test.go b/pkg/paychmgr/paych_test.go index 5aa71ec65b..e42c7006f0 100644 --- a/pkg/paychmgr/paych_test.go +++ b/pkg/paychmgr/paych_test.go @@ -3,10 +3,11 @@ package paychmgr import ( "bytes" "context" + "testing" + crypto2 "github.com/filecoin-project/venus/pkg/crypto" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/pkg/vm" - "testing" "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" @@ -24,8 +25,8 @@ import ( _ "github.com/filecoin-project/venus/pkg/crypto/bls" _ "github.com/filecoin-project/venus/pkg/crypto/secp" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" - paychmock "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych/mock" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" + paychmock "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych/mock" ) func TestCheckVoucherValid(t *testing.T) { diff --git a/pkg/paychmgr/paychget_test.go b/pkg/paychmgr/paychget_test.go index 9b1bac4b26..5894296fc5 100644 --- a/pkg/paychmgr/paychget_test.go +++ b/pkg/paychmgr/paychget_test.go @@ -2,11 +2,12 @@ package paychmgr import ( "context" - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "sync" "testing" "time" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + cborrpc "github.com/filecoin-project/go-cbor-util" "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" @@ -23,9 +24,9 @@ import ( _ "github.com/filecoin-project/venus/pkg/crypto/bls" _ "github.com/filecoin-project/venus/pkg/crypto/secp" "github.com/filecoin-project/venus/pkg/types" - lotusinit "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" - paychmock "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych/mock" + lotusinit "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" + paychmock "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych/mock" ) func testChannelResponse(t *testing.T, ch address.Address) types.MessageReceipt { diff --git a/pkg/paychmgr/paychvoucherfunds_test.go b/pkg/paychmgr/paychvoucherfunds_test.go index 9105bbce18..3d191378ce 100644 --- a/pkg/paychmgr/paychvoucherfunds_test.go +++ b/pkg/paychmgr/paychvoucherfunds_test.go @@ -2,9 +2,10 @@ package paychmgr import ( "context" + "testing" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/pkg/types" - "testing" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -16,8 +17,8 @@ import ( builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" tutils2 "github.com/filecoin-project/specs-actors/v6/support/testing" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" - paychmock "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych/mock" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" + paychmock "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych/mock" ) // TestPaychAddVoucherAfterAddFunds tests adding a voucher to a channel with diff --git a/pkg/paychmgr/settler/settler.go b/pkg/paychmgr/settler/settler.go index f32e6d5dbd..05fa6709fd 100644 --- a/pkg/paychmgr/settler/settler.go +++ b/pkg/paychmgr/settler/settler.go @@ -11,7 +11,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" ) diff --git a/pkg/paychmgr/settler/stl.go b/pkg/paychmgr/settler/stl.go index dbe088bca1..f1a4cdb7eb 100644 --- a/pkg/paychmgr/settler/stl.go +++ b/pkg/paychmgr/settler/stl.go @@ -2,13 +2,14 @@ package settler import ( "context" + "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/paychmgr" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" "github.com/ipfs/go-cid" ) diff --git a/pkg/paychmgr/simple.go b/pkg/paychmgr/simple.go index b439186806..f8dd71ce12 100644 --- a/pkg/paychmgr/simple.go +++ b/pkg/paychmgr/simple.go @@ -386,7 +386,7 @@ func (ca *channelAccessor) createPaych(ctx context.Context, amt big.Int) (cid.Ci return cid.Undef, err } - smsg, err := ca.api.MpoolPushMessage(ctx, msg, nil) + smsg, err := ca.api.MpoolPushMessage(ctx, (*types.UnsignedMessage)(msg), nil) if err != nil { return cid.Undef, xerrors.Errorf("initializing paych actor: %w", err) } diff --git a/pkg/paychmgr/state.go b/pkg/paychmgr/state.go index 25d55f0ff2..cae9357bbf 100644 --- a/pkg/paychmgr/state.go +++ b/pkg/paychmgr/state.go @@ -2,12 +2,13 @@ package paychmgr import ( "context" + "github.com/filecoin-project/venus/pkg/statemanger" "github.com/filecoin-project/go-address" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" ) type stateAccessor struct { diff --git a/pkg/paychmgr/store.go b/pkg/paychmgr/store.go index 1158a39fa5..eec3a4763a 100644 --- a/pkg/paychmgr/store.go +++ b/pkg/paychmgr/store.go @@ -18,7 +18,7 @@ import ( "github.com/filecoin-project/go-address" fbig "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" ) var ErrChannelNotTracked = errors.New("channel not tracked") diff --git a/pkg/paychmgr/util.go b/pkg/paychmgr/util.go index 945b0bed04..7b0175c7d4 100644 --- a/pkg/paychmgr/util.go +++ b/pkg/paychmgr/util.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-address" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" ) type BestSpendableAPI interface { diff --git a/pkg/state/power_table_view.go b/pkg/state/power_table_view.go index a1d8fd4bfc..e946aedd8a 100644 --- a/pkg/state/power_table_view.go +++ b/pkg/state/power_table_view.go @@ -2,14 +2,15 @@ package state import ( "context" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" "github.com/filecoin-project/venus/pkg/util/ffiwrapper" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" ) // PowerStateView is a view of chain state for election computations, typically at some lookback from the diff --git a/pkg/state/testing.go b/pkg/state/testing.go index c4d1f6b3c7..cd607c635e 100644 --- a/pkg/state/testing.go +++ b/pkg/state/testing.go @@ -2,6 +2,7 @@ package state import ( "context" + "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/go-address" @@ -13,9 +14,9 @@ import ( "github.com/libp2p/go-libp2p-core/peer" "github.com/pkg/errors" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" "github.com/filecoin-project/venus/pkg/util/ffiwrapper" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" ) // FakeStateView is a fake state view. diff --git a/pkg/state/tree/state.go b/pkg/state/tree/state.go index 56325aa7e0..a6ba66896a 100644 --- a/pkg/state/tree/state.go +++ b/pkg/state/tree/state.go @@ -6,6 +6,8 @@ import ( "fmt" "io" + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" @@ -18,8 +20,8 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" states0 "github.com/filecoin-project/specs-actors/actors/states" states2 "github.com/filecoin-project/specs-actors/v2/actors/states" @@ -292,7 +294,7 @@ func (st *State) lookupIDinternal(addr address.Address) (address.Address, error) return address.Undef, xerrors.Errorf("getting init actor: %v", err) } - ias, err := init_.Load(&AdtStore{st.Store}, act) + ias, err := init_.Load(&AdtStore{st.Store}, (*chain.Actor)(act)) if err != nil { return address.Undef, xerrors.Errorf("loading init actor state: %v", err) } @@ -438,7 +440,7 @@ func (st *State) ClearSnapshot() { func (st *State) RegisterNewAddress(addr ActorKey) (address.Address, error) { var out address.Address err := st.MutateActor(init_.Address, func(initact *types.Actor) error { - ias, err := init_.Load(&AdtStore{st.Store}, initact) + ias, err := init_.Load(&AdtStore{st.Store}, (*chain.Actor)(initact)) if err != nil { return err } diff --git a/pkg/state/view.go b/pkg/state/view.go index 40684da50c..b6b03c8ecc 100644 --- a/pkg/state/view.go +++ b/pkg/state/view.go @@ -4,6 +4,8 @@ import ( "context" "strconv" + types2 "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" @@ -16,17 +18,17 @@ import ( "github.com/filecoin-project/go-state-types/big" vmstate "github.com/filecoin-project/venus/pkg/state/tree" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/account" - notinit "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/market" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" - paychActor "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/power" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/reward" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/verifreg" "github.com/filecoin-project/venus/pkg/util/ffiwrapper" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/account" + notinit "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + paychActor "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/verifreg" ) // Viewer builds state views from state root CIDs. @@ -384,7 +386,7 @@ func (v *View) StateVerifiedClientStatus(ctx context.Context, addr addr.Address) return abi.NewStoragePower(0), err } - state, err := verifreg.Load(adt.WrapStore(ctx, v.ipldStore), act) + state, err := verifreg.Load(adt.WrapStore(ctx, v.ipldStore), (*types2.Actor)(act)) if err != nil { return abi.NewStoragePower(0), err } @@ -503,7 +505,7 @@ func (v *View) PaychActorParties(ctx context.Context, paychAddr addr.Address) (f return addr.Undef, addr.Undef, err } - state, err := paychActor.Load(adt.WrapStore(ctx, v.ipldStore), a) + state, err := paychActor.Load(adt.WrapStore(ctx, v.ipldStore), (*types2.Actor)(a)) if err != nil { return addr.Undef, addr.Undef, err } @@ -581,7 +583,7 @@ func (v *View) StateMinerAvailableBalance(ctx context.Context, maddr addr.Addres return big.Int{}, err } - mas, err := miner.Load(adt.WrapStore(context.TODO(), v.ipldStore), actor) + mas, err := miner.Load(adt.WrapStore(context.TODO(), v.ipldStore), (*types2.Actor)(actor)) if err != nil { return big.Int{}, xerrors.Errorf("failed to load miner actor state: %v", err) } @@ -728,7 +730,7 @@ func (v *View) ResolveToKeyAddr(ctx context.Context, address addr.Address) (addr return addr.Undef, xerrors.Errorf("failed to find actor: %s", address) } - aast, err := account.Load(adt.WrapStore(context.TODO(), v.ipldStore), act) + aast, err := account.Load(adt.WrapStore(context.TODO(), v.ipldStore), (*types2.Actor)(act)) if err != nil { return addr.Undef, xerrors.Errorf("failed to get account actor state for %s: %v", address, err) } @@ -742,12 +744,12 @@ func (v *View) LoadInitState(ctx context.Context) (notinit.State, error) { return nil, err } - return notinit.Load(adt.WrapStore(ctx, v.ipldStore), actr) + return notinit.Load(adt.WrapStore(ctx, v.ipldStore), (*types2.Actor)(actr)) } //LoadPaychState get pay channel state for actor func (v *View) LoadPaychState(ctx context.Context, actor *types.Actor) (paychActor.State, error) { - return paychActor.Load(adt.WrapStore(context.TODO(), v.ipldStore), actor) + return paychActor.Load(adt.WrapStore(context.TODO(), v.ipldStore), (*types2.Actor)(actor)) } //LoadMinerState return miner state @@ -761,7 +763,7 @@ func (v *View) LoadMinerState(ctx context.Context, maddr addr.Address) (miner.St return nil, err } - return miner.Load(adt.WrapStore(context.TODO(), v.ipldStore), actr) + return miner.Load(adt.WrapStore(context.TODO(), v.ipldStore), (*types2.Actor)(actr)) } func (v *View) LoadPowerActor(ctx context.Context) (power.State, error) { @@ -770,7 +772,7 @@ func (v *View) LoadPowerActor(ctx context.Context) (power.State, error) { return nil, err } - return power.Load(adt.WrapStore(ctx, v.ipldStore), actr) + return power.Load(adt.WrapStore(ctx, v.ipldStore), (*types2.Actor)(actr)) } func (v *View) LoadVerifregActor(ctx context.Context) (verifreg.State, error) { @@ -779,7 +781,7 @@ func (v *View) LoadVerifregActor(ctx context.Context) (verifreg.State, error) { return nil, err } - return verifreg.Load(adt.WrapStore(ctx, v.ipldStore), actr) + return verifreg.Load(adt.WrapStore(ctx, v.ipldStore), (*types2.Actor)(actr)) } // nolint @@ -789,7 +791,7 @@ func (v *View) LoadRewardState(ctx context.Context) (reward.State, error) { return nil, err } - return reward.Load(adt.WrapStore(ctx, v.ipldStore), actr) + return reward.Load(adt.WrapStore(ctx, v.ipldStore), (*types2.Actor)(actr)) } // nolint @@ -799,7 +801,7 @@ func (v *View) LoadPowerState(ctx context.Context) (power.State, error) { return nil, err } - return power.Load(adt.WrapStore(ctx, v.ipldStore), actr) + return power.Load(adt.WrapStore(ctx, v.ipldStore), (*types2.Actor)(actr)) } func (v *View) LoadMarketState(ctx context.Context) (market.State, error) { @@ -808,7 +810,7 @@ func (v *View) LoadMarketState(ctx context.Context) (market.State, error) { return nil, err } - return market.Load(adt.WrapStore(ctx, v.ipldStore), actr) + return market.Load(adt.WrapStore(ctx, v.ipldStore), (*types2.Actor)(actr)) } // nolint @@ -822,7 +824,7 @@ func (v *View) LoadAccountState(ctx context.Context, a addr.Address) (account.St return nil, err } - return account.Load(adt.WrapStore(context.TODO(), v.ipldStore), actr) + return account.Load(adt.WrapStore(context.TODO(), v.ipldStore), (*types2.Actor)(actr)) } //loadActor load actor of address in db @@ -848,7 +850,7 @@ func getFilMarketLocked(ctx context.Context, ipldStore cbor.IpldStore, st vmstat return big.Zero(), xerrors.Errorf("failed to load market actor: %v", err) } - mst, err := market.Load(adt.WrapStore(ctx, ipldStore), mactor) + mst, err := market.Load(adt.WrapStore(ctx, ipldStore), (*types2.Actor)(mactor)) if err != nil { return big.Zero(), xerrors.Errorf("failed to load market state: %v", err) } diff --git a/pkg/statemanger/state_manger.go b/pkg/statemanger/state_manger.go index f126738de8..c0b2a938de 100644 --- a/pkg/statemanger/state_manger.go +++ b/pkg/statemanger/state_manger.go @@ -3,6 +3,9 @@ package statemanger import ( "context" "fmt" + "sync" + "time" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/consensus" @@ -10,16 +13,14 @@ import ( appstate "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/state/tree" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/market" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/pkg/vm/gas" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" "go.opencensus.io/trace" "golang.org/x/xerrors" - "sync" - "time" ) // stateManagerAPI defines the methods needed from StateManager diff --git a/pkg/types/types.go b/pkg/types/types.go index 267ce75e89..5bc4080394 100644 --- a/pkg/types/types.go +++ b/pkg/types/types.go @@ -4,8 +4,8 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/market" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" ) type EstimateMessage struct { diff --git a/pkg/vm/dispatch/loader.go b/pkg/vm/dispatch/loader.go index 96656b64dd..5014f2e517 100644 --- a/pkg/vm/dispatch/loader.go +++ b/pkg/vm/dispatch/loader.go @@ -7,8 +7,8 @@ import ( "github.com/ipfs/go-cid" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types/specactors" vmr "github.com/filecoin-project/venus/pkg/vm/runtime" + "github.com/filecoin-project/venus/venus-shared/actors" ) // CodeLoader allows you to load an actor's code based on its id an epoch. @@ -87,9 +87,9 @@ func (b *CodeLoaderBuilder) Build() CodeLoader { type ActorPredicate func(vmr.Runtime, rtt.VMActor) error //ActorsVersionPredicate get actor predicate base on actor version and network version -func ActorsVersionPredicate(ver specactors.Version) ActorPredicate { +func ActorsVersionPredicate(ver actors.Version) ActorPredicate { return func(rt vmr.Runtime, v rtt.VMActor) error { - nver, err := specactors.VersionForNetwork(rt.NtwkVersion()) + nver, err := actors.VersionForNetwork(rt.NtwkVersion()) if err != nil { return xerrors.Errorf("version for network %w", err) } diff --git a/pkg/vm/gas/pricelistV0.go b/pkg/vm/gas/pricelistV0.go index 3d20c51500..1f5f839523 100644 --- a/pkg/vm/gas/pricelistV0.go +++ b/pkg/vm/gas/pricelistV0.go @@ -10,7 +10,7 @@ import ( proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" ) type scalingCost struct { diff --git a/pkg/vm/register/default.go b/pkg/vm/register/default.go index 46ab707c90..c65e2813ce 100644 --- a/pkg/vm/register/default.go +++ b/pkg/vm/register/default.go @@ -1,8 +1,8 @@ package register import ( - actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/vm/dispatch" + "github.com/filecoin-project/venus/venus-shared/actors" exported0 "github.com/filecoin-project/specs-actors/actors/builtin/exported" exported2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/exported" diff --git a/pkg/vm/vmcontext/invocation_context.go b/pkg/vm/vmcontext/invocation_context.go index 729b0bdf11..eec517e478 100644 --- a/pkg/vm/vmcontext/invocation_context.go +++ b/pkg/vm/vmcontext/invocation_context.go @@ -5,6 +5,8 @@ import ( "encoding/binary" "fmt" + types2 "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -17,15 +19,15 @@ import ( xerrors "github.com/pkg/errors" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/aerrors" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/account" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" "github.com/filecoin-project/venus/pkg/vm/dispatch" "github.com/filecoin-project/venus/pkg/vm/gas" "github.com/filecoin-project/venus/pkg/vm/runtime" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/aerrors" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/account" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" ) var gasOnActorExec = gas.NewGasCharge("OnActorExec", 0, 0) @@ -303,7 +305,7 @@ func (ctx *invocationContext) resolveTarget(target address.Address) (*types.Acto } // get init State - state, err := init_.Load(ctx.vm.ContextStore(), initActorEntry) + state, err := init_.Load(ctx.vm.ContextStore(), (*types2.Actor)(initActorEntry)) if err != nil { panic(err) } @@ -331,7 +333,7 @@ func (ctx *invocationContext) resolveTarget(target address.Address) (*types.Acto // Don't implicitly create an account actor for an address without an associated key. runtime.Abort(exitcode.SysErrInvalidReceiver) } - ver, err := specactors.VersionForNetwork(ctx.vm.NtwkVersion()) + ver, err := actors.VersionForNetwork(ctx.vm.NtwkVersion()) if err != nil { panic(err) } @@ -400,7 +402,7 @@ func (ctx *invocationContext) resolveToKeyAddr(addr address.Address) (address.Ad return address.Undef, xerrors.Errorf("failed to find actor: %s", addr) } - aast, err := account.Load(adt.WrapStore(ctx.vm.context, ctx.vm.store), act) + aast, err := account.Load(adt.WrapStore(ctx.vm.context, ctx.vm.store), (*types2.Actor)(act)) if err != nil { return address.Undef, xerrors.Errorf("failed to get account actor State for %s: %v", addr, err) } diff --git a/pkg/vm/vmcontext/pattern.go b/pkg/vm/vmcontext/pattern.go index 250717591a..b68d20c092 100644 --- a/pkg/vm/vmcontext/pattern.go +++ b/pkg/vm/vmcontext/pattern.go @@ -4,8 +4,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" "github.com/filecoin-project/venus/pkg/vm/runtime" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" ) // IsAccountActor pattern checks if the caller is an account actor. @@ -19,12 +19,12 @@ func (IsAccountActor) IsMatch(ctx runtime.PatternContext) bool { // IsAInitActor pattern checks if the caller is the init actor. // Dragons: delete after switching to new actors -type IsAInitActor struct{} +//type IsAInitActor struct{} // IsMatch returns "True" if the patterns matches -func (IsAInitActor) IsMatch(ctx runtime.PatternContext) bool { - return builtin.IsInitActor(ctx.CallerCode()) -} +//func (IsAInitActor) IsMatch(ctx runtime.PatternContext) bool { +// return builtin.IsInitActor(ctx.CallerCode()) +//} // Any patterns always passses. type Any struct{} diff --git a/pkg/vm/vmcontext/runtime_adapter.go b/pkg/vm/vmcontext/runtime_adapter.go index 75b7614bb6..012242fe85 100644 --- a/pkg/vm/vmcontext/runtime_adapter.go +++ b/pkg/vm/vmcontext/runtime_adapter.go @@ -4,10 +4,10 @@ import ( "context" "fmt" - "github.com/filecoin-project/venus/pkg/types/specactors/aerrors" + "github.com/filecoin-project/venus/venus-shared/actors/aerrors" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/ipfs/go-cid" cbor2 "github.com/ipfs/go-ipld-cbor" diff --git a/pkg/vm/vmcontext/syscalls.go b/pkg/vm/vmcontext/syscalls.go index 9e7a29b8a4..b710783fa8 100644 --- a/pkg/vm/vmcontext/syscalls.go +++ b/pkg/vm/vmcontext/syscalls.go @@ -2,10 +2,11 @@ package vmcontext import ( "context" - cbornode "github.com/ipfs/go-ipld-cbor" goruntime "runtime" "sync" + cbornode "github.com/ipfs/go-ipld-cbor" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" @@ -15,8 +16,8 @@ import ( "github.com/filecoin-project/venus/pkg/crypto" vmState "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" "github.com/filecoin-project/venus/pkg/vm/gas" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" ) type SyscallsStateView interface { diff --git a/pkg/vm/vmcontext/syscallsStateView.go b/pkg/vm/vmcontext/syscallsStateView.go index 4681c0444d..b70abf9aef 100644 --- a/pkg/vm/vmcontext/syscallsStateView.go +++ b/pkg/vm/vmcontext/syscallsStateView.go @@ -3,13 +3,15 @@ package vmcontext import ( "context" "fmt" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/account" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/account" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/pkg/errors" ) @@ -38,7 +40,7 @@ func (vm *syscallsStateView) ResolveToKeyAddr(ctx context.Context, accountAddr a if !found { return address.Undef, fmt.Errorf("signer resolution found no such actor %s", accountAddr) } - accountState, err := account.Load(adt.WrapStore(vm.context, vm.ctx.gasIpld), accountActor) + accountState, err := account.Load(adt.WrapStore(vm.context, vm.ctx.gasIpld), (*types.Actor)(accountActor)) if err != nil { // This error is internal, shouldn't propagate as on-chain failure panic(fmt.Errorf("signer resolution failed To lost stateView for %s ", accountAddr)) @@ -57,7 +59,7 @@ func (vm *syscallsStateView) MinerInfo(ctx context.Context, maddr address.Addres return nil, fmt.Errorf("miner resolution found no such actor %s", maddr) } - accountState, err := miner.Load(adt.WrapStore(vm.context, vm.ctx.gasIpld), accountActor) + accountState, err := miner.Load(adt.WrapStore(vm.context, vm.ctx.gasIpld), (*types.Actor)(accountActor)) if err != nil { panic(fmt.Errorf("signer resolution failed To lost stateView for %s ", maddr)) } diff --git a/pkg/vm/vmcontext/vmcontext.go b/pkg/vm/vmcontext/vmcontext.go index 015c769845..37511f8874 100644 --- a/pkg/vm/vmcontext/vmcontext.go +++ b/pkg/vm/vmcontext/vmcontext.go @@ -8,7 +8,7 @@ import ( "time" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" cbor "github.com/ipfs/go-ipld-cbor" "github.com/filecoin-project/go-address" @@ -24,15 +24,16 @@ import ( rt5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" "github.com/filecoin-project/venus/pkg/state/tree" "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/cron" - initActor "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/reward" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/pkg/vm/dispatch" "github.com/filecoin-project/venus/pkg/vm/gas" "github.com/filecoin-project/venus/pkg/vm/runtime" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/cron" + initActor "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" + types2 "github.com/filecoin-project/venus/venus-shared/chain" ) const MaxCallDepth = 4096 @@ -182,7 +183,7 @@ func (vm *VM) normalizeAddress(addr address.Address) (address.Address, bool) { } // get a view into the actor stateView - initActorState, err := initActor.Load(adt.WrapStore(vm.context, vm.store), initActorEntry) + initActorState, err := initActor.Load(adt.WrapStore(vm.context, vm.store), (*types2.Actor)(initActorEntry)) if err != nil { panic(err) } diff --git a/tools/conformance/chaos/actor.go b/tools/conformance/chaos/actor.go index 29d8e57bb9..91a490792e 100644 --- a/tools/conformance/chaos/actor.go +++ b/tools/conformance/chaos/actor.go @@ -6,7 +6,7 @@ import ( "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-state-types/rt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/ipfs/go-cid" builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" diff --git a/tools/fast/action_message.go b/tools/fast/action_message.go index 5e2af25aa7..8152b3d41a 100644 --- a/tools/fast/action_message.go +++ b/tools/fast/action_message.go @@ -2,14 +2,15 @@ package fast import ( "context" - "github.com/filecoin-project/venus/cmd" "strconv" + "github.com/filecoin-project/venus/cmd" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" cid "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" ) // MessageSend runs the `message send` command against the filecoin process. diff --git a/tools/fast/series/send_filecoin_from_default.go b/tools/fast/series/send_filecoin_from_default.go index ea4b8abded..18a6a271ba 100644 --- a/tools/fast/series/send_filecoin_from_default.go +++ b/tools/fast/series/send_filecoin_from_default.go @@ -7,8 +7,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" "github.com/filecoin-project/venus/tools/fast" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" ) // SendFilecoinFromDefault will send the `value` of FIL from the default wallet diff --git a/venus-devtool/compatible/actors/main.go b/venus-devtool/compatible/actors/main.go index 5708af6aa8..5c1132cf1c 100644 --- a/venus-devtool/compatible/actors/main.go +++ b/venus-devtool/compatible/actors/main.go @@ -129,6 +129,7 @@ var sourcesCmd = &cli.Command{ }, } +// todo: move to the appropriate var replicaCmd = &cli.Command{ Name: "replica", Flags: []cli.Flag{ @@ -153,9 +154,9 @@ var replicaCmd = &cli.Command{ return true } - // diff.go diff_deadlines.go version.go params.go + // diff.go diff_deadlines.go version.go params.go utils.go util.go if !strings.Contains(path, "diff") && !strings.HasSuffix(path, "version.go") && - !strings.HasSuffix(path, "params.go") { + !strings.HasSuffix(path, "params.go") && !strings.Contains(path, "util") { return true } diff --git a/venus-shared/actors/builtin/miner/utils.go b/venus-shared/actors/builtin/miner/utils.go new file mode 100644 index 0000000000..e68a54d9d7 --- /dev/null +++ b/venus-shared/actors/builtin/miner/utils.go @@ -0,0 +1,71 @@ +// FETCHED FROM LOTUS: builtin/miner/utils.go + +package miner + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" +) + +func AllPartSectors(mas State, sget func(Partition) (bitfield.BitField, error)) (bitfield.BitField, error) { + var parts []bitfield.BitField + + err := mas.ForEachDeadline(func(dlidx uint64, dl Deadline) error { + return dl.ForEachPartition(func(partidx uint64, part Partition) error { + s, err := sget(part) + if err != nil { + return xerrors.Errorf("getting sector list (dl: %d, part %d): %w", dlidx, partidx, err) + } + + parts = append(parts, s) + return nil + }) + }) + if err != nil { + return bitfield.BitField{}, err + } + + return bitfield.MultiMerge(parts...) +} + +// SealProofTypeFromSectorSize returns preferred seal proof type for creating +// new miner actors and new sectors +func SealProofTypeFromSectorSize(ssize abi.SectorSize, nv network.Version) (abi.RegisteredSealProof, error) { + switch { + case nv < network.Version7: + switch ssize { + case 2 << 10: + return abi.RegisteredSealProof_StackedDrg2KiBV1, nil + case 8 << 20: + return abi.RegisteredSealProof_StackedDrg8MiBV1, nil + case 512 << 20: + return abi.RegisteredSealProof_StackedDrg512MiBV1, nil + case 32 << 30: + return abi.RegisteredSealProof_StackedDrg32GiBV1, nil + case 64 << 30: + return abi.RegisteredSealProof_StackedDrg64GiBV1, nil + default: + return 0, xerrors.Errorf("unsupported sector size for miner: %v", ssize) + } + case nv >= network.Version7: + switch ssize { + case 2 << 10: + return abi.RegisteredSealProof_StackedDrg2KiBV1_1, nil + case 8 << 20: + return abi.RegisteredSealProof_StackedDrg8MiBV1_1, nil + case 512 << 20: + return abi.RegisteredSealProof_StackedDrg512MiBV1_1, nil + case 32 << 30: + return abi.RegisteredSealProof_StackedDrg32GiBV1_1, nil + case 64 << 30: + return abi.RegisteredSealProof_StackedDrg64GiBV1_1, nil + default: + return 0, xerrors.Errorf("unsupported sector size for miner: %v", ssize) + } + } + + return 0, xerrors.Errorf("unsupported network version") +} diff --git a/venus-shared/actors/builtin/paych/mock/mock.go b/venus-shared/actors/builtin/paych/mock/mock.go new file mode 100644 index 0000000000..0f4d744180 --- /dev/null +++ b/venus-shared/actors/builtin/paych/mock/mock.go @@ -0,0 +1,93 @@ +package mock + +import ( + "io" + + paych2 "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" +) + +type mockState struct { + from address.Address + to address.Address + settlingAt abi.ChainEpoch + toSend abi.TokenAmount + lanes map[uint64]paych2.LaneState +} + +func (ms *mockState) GetState() interface{} { + panic("implement me") +} + +type mockLaneState struct { + redeemed big.Int + nonce uint64 +} + +// NewMockPayChState constructs a state for a payment channel with the set fixed values +// that satisfies the paych.State interface. +func NewMockPayChState(from address.Address, + to address.Address, + settlingAt abi.ChainEpoch, + lanes map[uint64]paych2.LaneState, +) paych2.State { + return &mockState{from: from, to: to, settlingAt: settlingAt, toSend: big.NewInt(0), lanes: lanes} +} + +// NewMockLaneState constructs a state for a payment channel lane with the set fixed values +// that satisfies the paych.LaneState interface. Useful for populating lanes when +// calling NewMockPayChState +func NewMockLaneState(redeemed big.Int, nonce uint64) paych2.LaneState { + return &mockLaneState{redeemed, nonce} +} + +func (ms *mockState) MarshalCBOR(io.Writer) error { + panic("not implemented") +} + +// Channel owner, who has funded the actor +func (ms *mockState) From() (address.Address, error) { + return ms.from, nil +} + +// Recipient of payouts from channel +func (ms *mockState) To() (address.Address, error) { + return ms.to, nil +} + +// Height at which the channel can be `Collected` +func (ms *mockState) SettlingAt() (abi.ChainEpoch, error) { + return ms.settlingAt, nil +} + +// Amount successfully redeemed through the payment channel, paid out on `Collect()` +func (ms *mockState) ToSend() (abi.TokenAmount, error) { + return ms.toSend, nil +} + +// Get total number of lanes +func (ms *mockState) LaneCount() (uint64, error) { + return uint64(len(ms.lanes)), nil +} + +// Iterate lane states +func (ms *mockState) ForEachLaneState(cb func(idx uint64, dl paych2.LaneState) error) error { + var lastErr error + for lane, state := range ms.lanes { + if err := cb(lane, state); err != nil { + lastErr = err + } + } + return lastErr +} + +func (mls *mockLaneState) Redeemed() (big.Int, error) { + return mls.redeemed, nil +} + +func (mls *mockLaneState) Nonce() (uint64, error) { + return mls.nonce, nil +} diff --git a/venus-shared/actors/builtin/verifreg/util.go b/venus-shared/actors/builtin/verifreg/util.go index 022c2fa17f..1a97582d82 100644 --- a/venus-shared/actors/builtin/verifreg/util.go +++ b/venus-shared/actors/builtin/verifreg/util.go @@ -1,14 +1,14 @@ +// FETCHED FROM LOTUS: builtin/verifreg/util.go + package verifreg import ( - "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" + "golang.org/x/xerrors" ) // taking this as a function instead of asking the caller to call it helps reduce some of the error diff --git a/venus-shared/go.mod b/venus-shared/go.mod index 1bb66b76c0..d02ee087fb 100644 --- a/venus-shared/go.mod +++ b/venus-shared/go.mod @@ -4,27 +4,25 @@ go 1.16 require ( github.com/docker/go-units v0.4.0 - github.com/filecoin-project/go-address v0.0.6 - github.com/filecoin-project/go-bitfield v0.2.4 // indirect - github.com/filecoin-project/go-jsonrpc v0.1.5 // indirect - github.com/filecoin-project/go-state-types v0.1.1 + github.com/filecoin-project/go-address v0.0.5 + github.com/filecoin-project/go-bitfield v0.2.4 + github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec + github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379 github.com/filecoin-project/specs-actors v0.9.13 github.com/filecoin-project/specs-actors/v2 v2.3.5 - github.com/filecoin-project/specs-actors/v3 v3.1.1 // indirect - github.com/filecoin-project/specs-actors/v4 v4.0.1 // indirect - github.com/filecoin-project/specs-actors/v5 v5.0.4 // indirect - github.com/filecoin-project/specs-actors/v6 v6.0.1 // indirect + github.com/filecoin-project/specs-actors/v3 v3.1.1 + github.com/filecoin-project/specs-actors/v4 v4.0.1 + github.com/filecoin-project/specs-actors/v5 v5.0.4 + github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/ipfs/go-block-format v0.0.3 github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-ipld-cbor v0.0.5 - github.com/ipfs/go-ipld-format v0.0.2 - github.com/ipfs/go-log v1.0.4 // indirect - github.com/libp2p/go-libp2p-core v0.11.0 // indirect + github.com/ipfs/go-log v1.0.4 + github.com/libp2p/go-libp2p-core v0.8.5 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 - github.com/multiformats/go-multiaddr v0.2.2 // indirect - github.com/smartystreets/assertions v1.0.1 // indirect + github.com/multiformats/go-multiaddr v0.2.2 github.com/stretchr/testify v1.7.0 - github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 - go.uber.org/zap v1.14.1 // indirect + github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2 + go.uber.org/zap v1.14.1 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 ) diff --git a/venus-shared/go.sum b/venus-shared/go.sum index 6029973ce8..c88d641be5 100644 --- a/venus-shared/go.sum +++ b/venus-shared/go.sum @@ -1,5 +1,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= @@ -29,17 +30,14 @@ github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUn github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/filecoin-project/go-address v0.0.3 h1:eVfbdjEbpbzIrbiSa+PiGUY+oDK9HnUn+M1R/ggoHf8= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-address v0.0.5 h1:SSaFT/5aLfPXycUlFyemoHYhRgdyXClXCyDdNJKPlDM= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= -github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= -github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= -github.com/filecoin-project/go-bitfield v0.2.0 h1:gCtLcjskIPtdg4NfN7gQZSQF9yrBQ7mkT0qCJxzGI2Q= github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= @@ -53,14 +51,14 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= -github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec h1:rGI5I7fdU4viManxmDdbk5deZO7afe6L1Wc04dAmlOM= +github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= -github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379 h1:UmKkt13NrtulubqfNXhG7SQ7Pjza8BeKdNBxngqAo64= +github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/specs-actors v0.9.13 h1:rUEOQouefi9fuVY/2HOroROJlZbOzWYXXeIh41KF2M4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= @@ -90,6 +88,7 @@ github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -99,7 +98,6 @@ github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= @@ -111,7 +109,6 @@ github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0r github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= -github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= @@ -143,12 +140,10 @@ github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjN github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= -github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= -github.com/ipfs/go-ipld-cbor v0.0.4 h1:Aw3KPOKXjvrm6VjwJvFf1F1ekR/BH3jdof3Bk7OTiSA= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= @@ -158,7 +153,6 @@ github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.4 h1:6nLQdX4W8P9yZZFH7mO+X/PzjN8Laozm/lMJ6esdgzY= github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= -github.com/ipfs/go-log/v2 v2.0.5 h1:fL4YI+1g5V/b1Yxr1qAiXTMg1H8z9vx/VmJxBuQMHvU= github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= github.com/ipfs/go-log/v2 v2.0.8 h1:3b3YNopMHlj4AvyhWAx0pDxqSQWYi4/WuWO7yRV6/Qg= github.com/ipfs/go-log/v2 v2.0.8/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= @@ -181,6 +175,7 @@ github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -194,8 +189,8 @@ github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QH github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= @@ -216,8 +211,8 @@ github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFk github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= -github.com/libp2p/go-libp2p-core v0.11.0 h1:75jAgdA+IChNa+/mZXogfmrGkgwxkVvxmIC7pV+F6sI= -github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.8.5 h1:aEgbIcPGsKy6zYcC+5AJivYFedhYa4sW7mIpWpUaLKw= +github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= @@ -328,9 +323,6 @@ github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2 github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/requireions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/requireions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= -github.com/smartystreets/requireions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= @@ -340,7 +332,6 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -355,12 +346,10 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200715143311-227fab5a2377/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20200723185710-6a3894a6352b/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200806213330-63aa96ca5488/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200810223238-211df3b9e24c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c h1:otRnI08JoahNBxUFqX3372Ab9GnTj8L5J9iP5ImyxGU= github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 h1:7WtW9D9VGpmRLuQmrPy2JobUNdka95z3MKEVpELtOjo= -github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2 h1:bsUlNhdmbtlfdLVXAVfuvKQ01RnWAM09TVrJkI7NZs4= +github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= @@ -368,13 +357,16 @@ github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= +github.com/xorcare/golden v0.6.0 h1:E8emU8bhyMIEpYmgekkTUaw4vtcrRE+Wa0c5wYIcgXc= github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= -go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= @@ -394,6 +386,7 @@ golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -469,4 +462,5 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= From 7bea6cc0a7905c478ec8c3c79dedf9d2ab7d7c74 Mon Sep 17 00:00:00 2001 From: zl Date: Tue, 21 Dec 2021 15:12:26 +0800 Subject: [PATCH 076/167] complex providers (#4634) --- venus-shared/chain/complex_provider.go | 77 +++++++++++++++++++++ venus-shared/chain/complex_provider_test.go | 36 ++++++++++ 2 files changed, 113 insertions(+) create mode 100644 venus-shared/chain/complex_provider.go create mode 100644 venus-shared/chain/complex_provider_test.go diff --git a/venus-shared/chain/complex_provider.go b/venus-shared/chain/complex_provider.go new file mode 100644 index 0000000000..771183aaf9 --- /dev/null +++ b/venus-shared/chain/complex_provider.go @@ -0,0 +1,77 @@ +package chain + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/venus-shared/chain/params" + "github.com/filecoin-project/venus/venus-shared/testutil" + "github.com/ipfs/go-cid" + "math" + "testing" +) + +func init() { + testutil.MustRegisterDefaultValueProvier(TipsetProvider()) + testutil.MustRegisterDefaultValueProvier(MessageProvider()) +} + +func TipsetProvider() func(*testing.T) *TipSet { + const ( + minBlkNumInTipset = 1 + maxBlkNumInTipset = 5 + ) + + return func(t *testing.T) *TipSet { + var ( + blkNum, parentNum int + parentWeight big.Int + epoch abi.ChainEpoch + blocks []*BlockHeader + parents []cid.Cid + ) + + testutil.Provide(t, &parentNum, testutil.IntRangedProvider(minBlkNumInTipset, maxBlkNumInTipset)) + testutil.Provide(t, &parents, testutil.WithSliceLen(parentNum)) + + testutil.Provide(t, &blkNum, testutil.IntRangedProvider(minBlkNumInTipset+1, maxBlkNumInTipset)) + testutil.Provide(t, &blocks, testutil.WithSliceLen(blkNum), + // blocks in one tipset must be with the same parents. + func(t *testing.T) []cid.Cid { + return parents + }) + + testutil.Provide(t, &epoch, testutil.IntRangedProvider(0, math.MaxUint32)) + testutil.Provide(t, &parentWeight, testutil.PositiveBigProvider()) + + // ensure that random assignments won't break the validation + for _, blk := range blocks { + blk.Height = epoch + blk.ParentWeight.Set(parentWeight.Int) + } + + tipset, err := NewTipSet(blocks) + + if err != nil { + t.Fatalf("create new tipset failed: %s", err.Error()) + } + + return tipset + } +} + +func MessageProvider() func(t *testing.T) *Message { + return func(t *testing.T) *Message { + var msg Message + testutil.Provide(t, &msg, + testutil.IntRangedProvider(0, params.BlockGasLimit), + func(t *testing.T) big.Int { + ip := testutil.IntRangedProvider(0, int(params.FilBase)) + return FromFil(uint64(ip(t))) + }, + ) + // ensure that random assignments won't break the validation + msg.Version = 0 + msg.GasPremium = msg.GasFeeCap + return &msg + } +} diff --git a/venus-shared/chain/complex_provider_test.go b/venus-shared/chain/complex_provider_test.go new file mode 100644 index 0000000000..201c00a12a --- /dev/null +++ b/venus-shared/chain/complex_provider_test.go @@ -0,0 +1,36 @@ +package chain + +import ( + "github.com/filecoin-project/venus/venus-shared/testutil" + "github.com/stretchr/testify/require" + "testing" +) + +func TestTipsetProvider(t *testing.T) { + var tipset = &TipSet{} + testutil.Provide(t, &tipset) + require.Greater(t, len(tipset.blocks), 0, "blocks in a tipset must greater than 0") +} + +func TestMessageProvider(t *testing.T) { + var message *Message + testutil.Provide(t, &message) + require.NotEqual(t, message.Cid().String(), "", "message cid can't be empty") +} + +func TestBlockProvider(t *testing.T) { + var block *BlockHeader + testutil.Provide(t, &block) + require.NotNil(t, block, "block must not be nil") +} + +func TestComplexProvider(t *testing.T) { + tests := map[string]func(*testing.T) { + "Tipset":TestTipsetProvider, + "Message":TestMessageProvider, + "Block":TestBlockProvider, + } + for testName, f := range tests { + t.Run(testName, f) + } +} From b92f36b2d395526228741a78367d801e1114efc9 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Wed, 22 Dec 2021 18:15:26 +0800 Subject: [PATCH 077/167] Feat/replace common type (#4636) * more type and function * replace type --- app/client/apiface/blockstore.go | 2 +- app/client/apiface/chain.go | 8 +- app/client/apiface/market.go | 4 +- app/client/apiface/mining.go | 4 +- app/client/apiface/mpool.go | 25 +- app/client/apiface/multisig.go | 28 +- app/client/apiface/network.go | 6 +- app/client/apiface/paych.go | 14 +- app/client/apiface/syncer.go | 6 +- app/client/apiface/v0api/blockstore.go | 2 +- app/client/apiface/v0api/chain.go | 16 +- app/client/apiface/v0api/market.go | 4 +- app/client/apiface/v0api/mining.go | 4 +- app/client/apiface/v0api/mpool.go | 17 +- app/client/apiface/v0api/multisig.go | 2 +- app/client/apiface/v0api/network.go | 2 +- app/client/apiface/v0api/paych.go | 14 +- app/client/apiface/v0api/syncer.go | 6 +- app/client/apiface/v0api/wallet.go | 6 +- app/client/apiface/wallet.go | 7 +- app/client/full.go | 195 ++++++------ app/client/v0api/full.go | 133 ++++---- app/node/builder.go | 5 +- app/node/env.go | 5 +- app/node/helpers.go | 4 +- app/node/test/node.go | 4 +- app/submodule/apitypes/chain.go | 6 +- app/submodule/apitypes/mining.go | 2 +- app/submodule/apitypes/mpool.go | 2 +- app/submodule/apitypes/syncer.go | 8 +- app/submodule/blockstore/blockstore_api.go | 8 +- app/submodule/chain/account_api.go | 3 +- app/submodule/chain/actor_api.go | 3 +- app/submodule/chain/beacon_api.go | 3 +- app/submodule/chain/chain_submodule.go | 15 +- app/submodule/chain/chaininfo_api.go | 21 +- app/submodule/chain/miner_api.go | 24 +- app/submodule/chain/v0api/chaininfo_v0api.go | 5 +- app/submodule/config/config_test.go | 5 +- .../discovery/discovery_submodule.go | 2 +- app/submodule/market/market_api.go | 8 +- app/submodule/mining/mining_api.go | 22 +- app/submodule/mpool/mpool_api.go | 51 ++- app/submodule/mpool/mpool_submodule.go | 2 +- app/submodule/multisig/multisig_api.go | 56 ++-- .../multisig/v0api/multisig_v0api.go | 7 +- app/submodule/network/network_api.go | 12 +- app/submodule/network/network_submodule.go | 8 +- app/submodule/network/v0api/v1_wrapper.go | 7 +- app/submodule/paych/paych_api.go | 19 +- app/submodule/syncer/chain_sync.go | 5 +- app/submodule/syncer/syncer_api.go | 17 +- app/submodule/syncer/syncer_submodule.go | 4 +- app/submodule/wallet/remotewallet/api.go | 31 +- app/submodule/wallet/remotewallet/keymap.go | 22 +- app/submodule/wallet/remotewallet/remote.go | 3 +- app/submodule/wallet/wallet_api.go | 12 +- app/submodule/wallet/wallet_submodule.go | 2 +- cmd/address.go | 2 +- cmd/chain.go | 8 +- cmd/daemon.go | 7 +- cmd/dag_integration_test.go | 2 +- cmd/dispute.go | 12 +- cmd/main.go | 17 +- cmd/message.go | 14 +- cmd/miner.go | 18 +- cmd/miner_actor.go | 25 +- cmd/miner_proving.go | 8 +- cmd/mpool.go | 21 +- cmd/multisig.go | 19 +- cmd/paych.go | 2 +- cmd/protocol.go | 2 +- cmd/seed.go | 2 +- cmd/show.go | 2 +- cmd/show_test.go | 28 +- cmd/state.go | 6 +- go.mod | 2 +- go.sum | 8 +- pkg/beacon/beacon.go | 9 +- pkg/beacon/drand.go | 2 +- pkg/beacon/mock.go | 2 +- pkg/chain/chain_index.go | 2 +- pkg/chain/circulating_supply.go | 9 +- pkg/chain/coalescer.go | 3 +- pkg/chain/coalescer_test.go | 8 +- pkg/chain/message_store.go | 64 ++-- pkg/chain/message_store_test.go | 13 +- pkg/chain/randomness.go | 15 +- pkg/chain/reorg.go | 2 +- pkg/chain/reorg_test.go | 10 +- pkg/chain/store.go | 19 +- pkg/chain/store_test.go | 15 +- pkg/chain/testing.go | 50 +-- pkg/chain/tip_index.go | 3 +- pkg/chain/traversal.go | 6 +- pkg/chain/traversal_test.go | 15 +- pkg/chain/utils.go | 2 +- pkg/chain/waiter.go | 5 +- pkg/chain/waiter_test.go | 10 +- pkg/chainsync/chainsync.go | 5 +- pkg/chainsync/dispatcher/dispatcher.go | 7 +- pkg/chainsync/dispatcher/dispatcher_test.go | 27 +- pkg/chainsync/exchange/cbor_gen.go | 26 +- pkg/chainsync/exchange/client.go | 4 +- pkg/chainsync/exchange/interfaces.go | 3 +- pkg/chainsync/exchange/protocol.go | 4 +- pkg/chainsync/exchange/server.go | 9 +- pkg/chainsync/slashfilter/mysqldb.go | 8 +- pkg/chainsync/slashfilter/slashfilter.go | 6 +- pkg/chainsync/syncer/syncer.go | 8 +- .../syncer/syncer_integration_test.go | 5 +- pkg/chainsync/syncer/syncer_test.go | 28 +- pkg/chainsync/types/bad_tipset_cache.go | 3 +- pkg/chainsync/types/target_tracker.go | 5 +- pkg/config/config.go | 2 +- pkg/consensus/block_validator.go | 48 +-- pkg/consensus/chain_selector.go | 7 +- pkg/consensus/expected.go | 9 +- pkg/consensus/head_randomness.go | 3 +- pkg/consensus/message_validator.go | 8 +- pkg/consensus/message_validator_test.go | 33 +- pkg/consensus/processor.go | 4 +- pkg/consensus/protocol.go | 8 +- pkg/consensus/testing.go | 14 +- pkg/consensus/ticket.go | 2 +- pkg/consensus/ticket_test.go | 25 +- pkg/consensus/weight_test.go | 34 +- pkg/consensusfault/check.go | 18 +- pkg/discovery/cbor_gen.go | 4 +- pkg/discovery/hello_protocol.go | 2 +- pkg/discovery/hello_protocol_test.go | 6 +- pkg/discovery/peer_tracker.go | 3 +- pkg/discovery/peer_tracker_test.go | 7 +- pkg/events/cache.go | 5 +- pkg/events/eventAPI.go | 4 +- pkg/events/events.go | 2 +- pkg/events/events_called.go | 2 +- pkg/events/events_height.go | 3 +- pkg/events/events_test.go | 16 +- pkg/events/message_cache.go | 2 +- pkg/events/observer.go | 2 +- pkg/events/state/fastapi.go | 3 +- pkg/events/state/mock/api.go | 2 +- pkg/events/state/mock/tipset.go | 4 +- pkg/events/state/predicates.go | 19 +- pkg/events/state/predicates_test.go | 7 +- pkg/events/tscache.go | 3 +- pkg/events/tscache_test.go | 10 +- pkg/events/utils.go | 2 +- pkg/fork/fork.go | 21 +- pkg/fork/mock.go | 3 +- pkg/gen/genesis/f00_system.go | 2 +- pkg/gen/genesis/f01_init.go | 2 +- pkg/gen/genesis/f02_reward.go | 2 +- pkg/gen/genesis/f03_cron.go | 2 +- pkg/gen/genesis/f04_power.go | 2 +- pkg/gen/genesis/f05_market.go | 2 +- pkg/gen/genesis/f06_vreg.go | 2 +- pkg/gen/genesis/genesis.go | 14 +- pkg/gen/genesis/miners.go | 13 +- pkg/gen/genesis/util.go | 6 +- pkg/genesis/genesis.go | 2 +- pkg/genesis/init.go | 5 +- pkg/market/fmgr.go | 9 +- pkg/market/fundmanager.go | 6 +- pkg/market/fundmanager_test.go | 17 +- pkg/messagepool/check.go | 86 ++--- pkg/messagepool/gas.go | 21 +- pkg/messagepool/gasguess/guessgas.go | 2 +- pkg/messagepool/messagepool.go | 42 +-- pkg/messagepool/messagepool_test.go | 21 +- pkg/messagepool/messagesigner.go | 8 +- pkg/messagepool/messagesigner_test.go | 2 +- pkg/messagepool/provider.go | 6 +- pkg/messagepool/pruning.go | 3 +- pkg/messagepool/repub.go | 4 +- pkg/messagepool/selection.go | 11 +- pkg/messagepool/selection_test.go | 15 +- pkg/metrics/heartbeat.go | 2 +- pkg/metrics/heartbeat_test.go | 21 +- pkg/net/blocksub/validator.go | 3 +- pkg/net/blocksub/validator_test.go | 5 +- pkg/net/msgsub/validator.go | 4 +- pkg/paychmgr/manager.go | 2 +- pkg/paychmgr/mock_test.go | 22 +- pkg/paychmgr/paych.go | 10 +- pkg/paychmgr/paych_test.go | 2 +- pkg/paychmgr/paychget_test.go | 46 +-- pkg/paychmgr/paychvoucherfunds_test.go | 2 +- pkg/paychmgr/pcapi.go | 26 +- pkg/paychmgr/settler/settler.go | 13 +- pkg/paychmgr/settler/stl.go | 16 +- pkg/paychmgr/simple.go | 8 +- pkg/paychmgr/state.go | 2 +- pkg/state/power_table_view.go | 10 +- pkg/state/power_table_view_test.go | 12 +- pkg/state/signer.go | 3 +- pkg/state/sigval.go | 5 +- pkg/state/sigval_test.go | 37 ++- pkg/state/testing.go | 8 +- pkg/state/tree/snapshot.go | 2 +- pkg/state/tree/state.go | 13 +- pkg/state/tree/state_test.go | 11 +- pkg/state/tree/testing.go | 6 +- pkg/state/view.go | 69 ++-- pkg/statemanger/call.go | 7 +- pkg/statemanger/state_manger.go | 4 +- pkg/testhelpers/address.go | 31 ++ pkg/testhelpers/cid.go | 67 ++++ pkg/testhelpers/consensus.go | 40 +-- pkg/testhelpers/core.go | 60 ++-- pkg/testhelpers/empty_cid/empty_cid.go | 36 --- pkg/testhelpers/message.go | 295 ++++++++++++++++++ pkg/testhelpers/net.go | 5 +- pkg/testhelpers/singer.go | 153 +++++++++ pkg/testhelpers/test_daemon.go | 2 +- pkg/testhelpers/tipset.go | 16 + pkg/types/internal/atto_fil_test.go | 5 +- pkg/util/dag/dag_test.go | 5 +- pkg/vm/gas/gas_tracker.go | 8 +- pkg/vm/vmcontext/interpreter.go | 2 +- pkg/vm/vmcontext/invocation_context.go | 8 +- pkg/vm/vmcontext/runtime_adapter.go | 2 +- pkg/vm/vmcontext/syscallsStateView.go | 5 +- pkg/vm/vmcontext/types.go | 9 +- pkg/vm/vmcontext/vmcontext.go | 26 +- pkg/wallet/wallet.go | 5 +- pkg/wallet/wallet_test.go | 5 +- tools/client/main.go | 2 +- tools/conformance/driver.go | 11 +- tools/conformance/rand_record.go | 6 +- tools/conformance/runner.go | 7 +- tools/fast/action_mpool.go | 2 +- tools/fast/action_protocol.go | 3 +- tools/fast/action_show.go | 3 +- tools/fast/action_wallet.go | 5 +- tools/fast/series/wait_for_chain_message.go | 2 +- tools/gen_cbor/main.go | 29 +- tools/gengen/util/generator.go | 30 +- tools/gengen/util/gengen.go | 2 +- tools/seed/seed.go | 5 +- venus-shared/api/chain/types.go | 16 +- venus-shared/api/chain/v0/syncer.go | 2 +- venus-shared/api/chain/v0/wallet.go | 2 +- venus-shared/api/chain/v1/market.go | 1 - venus-shared/api/chain/v1/mining.go | 2 +- venus-shared/api/chain/v1/syncer.go | 2 +- venus-shared/api/chain/v1/wallet.go | 2 +- venus-shared/chain/actor.go | 24 ++ venus-shared/chain/block_header.go | 26 ++ venus-shared/chain/block_message.go | 9 + venus-shared/chain/block_message_test.go | 9 + venus-shared/chain/chain_info.go | 31 ++ venus-shared/chain/message.go | 21 ++ venus-shared/chain/param.go | 14 + venus-shared/chain/shared_func.go | 9 + venus-shared/chain/signed_message.go | 6 + venus-shared/chain/signer.go | 14 + venus-shared/chain/tipset.go | 16 + venus-shared/chain/tipset_key.go | 89 ++++++ venus-shared/compatible-checks/api-diff.txt | 134 -------- venus-shared/go.mod | 2 + venus-shared/wallet/key_info.go | 33 ++ venus-shared/wallet/msg_meta.go | 19 +- 264 files changed, 2316 insertions(+), 1619 deletions(-) create mode 100644 pkg/testhelpers/address.go create mode 100644 pkg/testhelpers/cid.go delete mode 100644 pkg/testhelpers/empty_cid/empty_cid.go create mode 100644 pkg/testhelpers/message.go create mode 100644 pkg/testhelpers/singer.go create mode 100644 pkg/testhelpers/tipset.go create mode 100644 venus-shared/chain/block_message.go create mode 100644 venus-shared/chain/block_message_test.go create mode 100644 venus-shared/chain/chain_info.go create mode 100644 venus-shared/chain/signer.go diff --git a/app/client/apiface/blockstore.go b/app/client/apiface/blockstore.go index 73de91ca65..13a44327b3 100644 --- a/app/client/apiface/blockstore.go +++ b/app/client/apiface/blockstore.go @@ -5,7 +5,7 @@ import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/app/submodule/apitypes" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" ) type IBlockStore interface { diff --git a/app/client/apiface/chain.go b/app/client/apiface/chain.go index b09494e61a..f912d896b0 100644 --- a/app/client/apiface/chain.go +++ b/app/client/apiface/chain.go @@ -8,10 +8,10 @@ import ( "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/chain" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-state-types/big" acrypto "github.com/filecoin-project/go-state-types/crypto" @@ -70,7 +70,7 @@ type IChainInfo interface { // Rule[perm:read] ChainGetBlock(ctx context.Context, id cid.Cid) (*types.BlockHeader, error) // Rule[perm:read] - ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.UnsignedMessage, error) + ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.Message, error) // Rule[perm:read] ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*apitypes.BlockMessages, error) // Rule[perm:read] @@ -189,7 +189,7 @@ type IMinerState interface { // Rule[perm:read] StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) // Rule[perm:read] - StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) + StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]apitypes.MarketDeal, error) // Rule[perm:read] StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) // Rule[perm:read] diff --git a/app/client/apiface/market.go b/app/client/apiface/market.go index 3a88cbfab1..6adaa7494d 100644 --- a/app/client/apiface/market.go +++ b/app/client/apiface/market.go @@ -3,8 +3,8 @@ package apiface import ( "context" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type IMarket interface { diff --git a/app/client/apiface/mining.go b/app/client/apiface/mining.go index fd62fefbc1..ee26fcf892 100644 --- a/app/client/apiface/mining.go +++ b/app/client/apiface/mining.go @@ -5,8 +5,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type IMining interface { diff --git a/app/client/apiface/mpool.go b/app/client/apiface/mpool.go index 8ef62954dc..ccc573b6ed 100644 --- a/app/client/apiface/mpool.go +++ b/app/client/apiface/mpool.go @@ -3,12 +3,11 @@ package apiface import ( "context" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/pkg/messagepool" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/messagepool" "github.com/ipfs/go-cid" ) @@ -36,34 +35,34 @@ type IMessagePool interface { // Rule[perm:write] MpoolPushUntrusted(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) // Rule[perm:sign] - MpoolPushMessage(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec) (*types.SignedMessage, error) + MpoolPushMessage(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec) (*types.SignedMessage, error) // Rule[perm:write] MpoolBatchPush(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) // Rule[perm:write] MpoolBatchPushUntrusted(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) // Rule[perm:sign] - MpoolBatchPushMessage(ctx context.Context, msgs []*types.UnsignedMessage, spec *types.MessageSendSpec) ([]*types.SignedMessage, error) + MpoolBatchPushMessage(ctx context.Context, msgs []*types.Message, spec *apitypes.MessageSendSpec) ([]*types.SignedMessage, error) // Rule[perm:read] MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) // Rule[perm:read] MpoolSub(ctx context.Context) (<-chan messagepool.MpoolUpdate, error) // Rule[perm:read] - GasEstimateMessageGas(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec, tsk types.TipSetKey) (*types.UnsignedMessage, error) + GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) // Rule[perm:read] - GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) + GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*apitypes.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*apitypes.EstimateResult, error) // Rule[perm:read] - GasEstimateFeeCap(ctx context.Context, msg *types.UnsignedMessage, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) + GasEstimateFeeCap(ctx context.Context, msg *types.Message, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) // Rule[perm:read] GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk types.TipSetKey) (big.Int, error) // Rule[perm:read] - GasEstimateGasLimit(ctx context.Context, msgIn *types.UnsignedMessage, tsk types.TipSetKey) (int64, error) + GasEstimateGasLimit(ctx context.Context, msgIn *types.Message, tsk types.TipSetKey) (int64, error) // MpoolCheckMessages performs logical checks on a batch of messages // Rule[perm:read] - MpoolCheckMessages(ctx context.Context, protos []*apitypes.MessagePrototype) ([][]apitypes.MessageCheckStatus, error) + MpoolCheckMessages(ctx context.Context, protos []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) // MpoolCheckPendingMessages performs logical checks for all pending messages from a given address // Rule[perm:read] - MpoolCheckPendingMessages(ctx context.Context, addr address.Address) ([][]apitypes.MessageCheckStatus, error) + MpoolCheckPendingMessages(ctx context.Context, addr address.Address) ([][]messagepool.MessageCheckStatus, error) // MpoolCheckReplaceMessages performs logical checks on pending messages with replacement // Rule[perm:read] - MpoolCheckReplaceMessages(ctx context.Context, msg []*types.Message) ([][]apitypes.MessageCheckStatus, error) + MpoolCheckReplaceMessages(ctx context.Context, msg []*types.Message) ([][]messagepool.MessageCheckStatus, error) } diff --git a/app/client/apiface/multisig.go b/app/client/apiface/multisig.go index d5bd29f699..62dc207d14 100644 --- a/app/client/apiface/multisig.go +++ b/app/client/apiface/multisig.go @@ -5,35 +5,35 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/messagepool" ) type IMultiSig interface { // Rule[perm:sign] - MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (*apitypes.MessagePrototype, error) + MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (*messagepool.MessagePrototype, error) // Rule[perm:sign] - MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) + MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) // Rule[perm:sign] - MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*apitypes.MessagePrototype, error) + MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) // Rule[perm:sign] - MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*apitypes.MessagePrototype, error) + MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) // Rule[perm:sign] - MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*apitypes.MessagePrototype, error) + MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) // Rule[perm:sign] - MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*apitypes.MessagePrototype, error) + MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) // Rule[perm:sign] - MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*apitypes.MessagePrototype, error) + MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) // Rule[perm:sign] - MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*apitypes.MessagePrototype, error) + MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) // Rule[perm:sign] - MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*apitypes.MessagePrototype, error) + MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) // Rule[perm:sign] - MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) + MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) // Rule[perm:sign] - MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) + MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) // Rule[perm:sign] - MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*apitypes.MessagePrototype, error) + MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*messagepool.MessagePrototype, error) // Rule[perm:read] MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) } diff --git a/app/client/apiface/network.go b/app/client/apiface/network.go index e6eb3c40fd..41a71743ee 100644 --- a/app/client/apiface/network.go +++ b/app/client/apiface/network.go @@ -3,13 +3,13 @@ package apiface import ( "context" - "github.com/filecoin-project/venus/app/submodule/apitypes" - - "github.com/filecoin-project/venus/pkg/net" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" + + "github.com/filecoin-project/venus/pkg/net" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" ) type INetwork interface { diff --git a/app/client/apiface/paych.go b/app/client/apiface/paych.go index f064115895..04df2757b6 100644 --- a/app/client/apiface/paych.go +++ b/app/client/apiface/paych.go @@ -3,15 +3,13 @@ package apiface import ( "context" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/paychmgr" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/specs-actors/actors/builtin/paych" "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" + "github.com/filecoin-project/venus/pkg/paychmgr" + paychtypes "github.com/filecoin-project/venus/venus-shared/paych" ) type IPaychan interface { @@ -20,7 +18,7 @@ type IPaychan interface { // @to: the payment channel recipient // @amt: the deposits funds in the payment channel // Rule[perm:sign] - PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*apitypes.ChannelInfo, error) + PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*paychtypes.ChannelInfo, error) // PaychAvailableFunds get the status of an outbound payment channel // @pch: payment channel address // Rule[perm:sign] @@ -44,14 +42,14 @@ type IPaychan interface { // @to: the payment channel recipient // @vouchers: the outstanding (non-redeemed) vouchers // Rule[perm:sign] - PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []apitypes.VoucherSpec) (*apitypes.PaymentInfo, error) + PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []paychtypes.VoucherSpec) (*paychtypes.PaymentInfo, error) // PaychList list the addresses of all channels that have been created // Rule[perm:read] PaychList(ctx context.Context) ([]address.Address, error) // PaychStatus get the payment channel status // @pch: payment channel address // Rule[perm:read] - PaychStatus(ctx context.Context, pch address.Address) (*types.PaychStatus, error) + PaychStatus(ctx context.Context, pch address.Address) (*paychtypes.Status, error) // PaychSettle update payment channel status to settle // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain // @pch: payment channel address diff --git a/app/client/apiface/syncer.go b/app/client/apiface/syncer.go index fd109ee521..0bc6539845 100644 --- a/app/client/apiface/syncer.go +++ b/app/client/apiface/syncer.go @@ -4,9 +4,9 @@ import ( "context" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/app/submodule/apitypes" syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type ISyncer interface { @@ -23,7 +23,7 @@ type ISyncer interface { // Rule[perm:write] SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error // Rule[perm:read] - StateCall(ctx context.Context, msg *types.UnsignedMessage, tsk types.TipSetKey) (*types.InvocResult, error) + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*apitypes.InvocResult, error) // Rule[perm:read] SyncState(ctx context.Context) (*apitypes.SyncState, error) } diff --git a/app/client/apiface/v0api/blockstore.go b/app/client/apiface/v0api/blockstore.go index aa9c77a809..fb70a90ac9 100644 --- a/app/client/apiface/v0api/blockstore.go +++ b/app/client/apiface/v0api/blockstore.go @@ -5,7 +5,7 @@ import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/app/submodule/apitypes" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" ) type IBlockStore interface { diff --git a/app/client/apiface/v0api/chain.go b/app/client/apiface/v0api/chain.go index c72f001869..1e42deded4 100644 --- a/app/client/apiface/v0api/chain.go +++ b/app/client/apiface/v0api/chain.go @@ -7,16 +7,16 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/chain" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - "github.com/filecoin-project/go-state-types/big" acrypto "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/pkg/chain" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type IChain interface { @@ -64,7 +64,7 @@ type IChainInfo interface { // Rule[perm:read] ChainGetBlock(ctx context.Context, id cid.Cid) (*types.BlockHeader, error) // Rule[perm:read] - ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.UnsignedMessage, error) + ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.Message, error) // Rule[perm:read] ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*apitypes.BlockMessages, error) // Rule[perm:read] @@ -155,7 +155,7 @@ type IMinerState interface { // Rule[perm:read] StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) // Rule[perm:read] - StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) + StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]apitypes.MarketDeal, error) // Rule[perm:read] StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) // Rule[perm:read] diff --git a/app/client/apiface/v0api/market.go b/app/client/apiface/v0api/market.go index cc107ec916..8eff369c15 100644 --- a/app/client/apiface/v0api/market.go +++ b/app/client/apiface/v0api/market.go @@ -3,8 +3,8 @@ package v0api import ( "context" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type IMarket interface { diff --git a/app/client/apiface/v0api/mining.go b/app/client/apiface/v0api/mining.go index ccca2ed78b..6f3fc2bcfe 100644 --- a/app/client/apiface/v0api/mining.go +++ b/app/client/apiface/v0api/mining.go @@ -5,8 +5,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type IMining interface { diff --git a/app/client/apiface/v0api/mpool.go b/app/client/apiface/v0api/mpool.go index 834b1812d8..9db7446fec 100644 --- a/app/client/apiface/v0api/mpool.go +++ b/app/client/apiface/v0api/mpool.go @@ -5,8 +5,9 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/pkg/messagepool" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/messagepool" "github.com/ipfs/go-cid" ) @@ -34,25 +35,25 @@ type IMessagePool interface { // Rule[perm:write] MpoolPushUntrusted(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) // Rule[perm:sign] - MpoolPushMessage(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec) (*types.SignedMessage, error) + MpoolPushMessage(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec) (*types.SignedMessage, error) // Rule[perm:write] MpoolBatchPush(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) // Rule[perm:write] MpoolBatchPushUntrusted(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) // Rule[perm:sign] - MpoolBatchPushMessage(ctx context.Context, msgs []*types.UnsignedMessage, spec *types.MessageSendSpec) ([]*types.SignedMessage, error) + MpoolBatchPushMessage(ctx context.Context, msgs []*types.Message, spec *apitypes.MessageSendSpec) ([]*types.SignedMessage, error) // Rule[perm:read] MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) // Rule[perm:read] MpoolSub(ctx context.Context) (<-chan messagepool.MpoolUpdate, error) // Rule[perm:read] - GasEstimateMessageGas(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec, tsk types.TipSetKey) (*types.UnsignedMessage, error) + GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) // Rule[perm:read] - GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) + GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*apitypes.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*apitypes.EstimateResult, error) // Rule[perm:read] - GasEstimateFeeCap(ctx context.Context, msg *types.UnsignedMessage, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) + GasEstimateFeeCap(ctx context.Context, msg *types.Message, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) // Rule[perm:read] GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk types.TipSetKey) (big.Int, error) // Rule[perm:read] - GasEstimateGasLimit(ctx context.Context, msgIn *types.UnsignedMessage, tsk types.TipSetKey) (int64, error) + GasEstimateGasLimit(ctx context.Context, msgIn *types.Message, tsk types.TipSetKey) (int64, error) } diff --git a/app/client/apiface/v0api/multisig.go b/app/client/apiface/v0api/multisig.go index 0864bdab90..db3731c032 100644 --- a/app/client/apiface/v0api/multisig.go +++ b/app/client/apiface/v0api/multisig.go @@ -7,7 +7,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type IMultiSig interface { diff --git a/app/client/apiface/v0api/network.go b/app/client/apiface/v0api/network.go index 749d7980d3..9f7464bb6a 100644 --- a/app/client/apiface/v0api/network.go +++ b/app/client/apiface/v0api/network.go @@ -3,7 +3,7 @@ package v0api import ( "context" - "github.com/filecoin-project/venus/app/submodule/apitypes" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/filecoin-project/venus/pkg/net" "github.com/ipfs/go-cid" diff --git a/app/client/apiface/v0api/paych.go b/app/client/apiface/v0api/paych.go index 6a25683d71..ee4115b038 100644 --- a/app/client/apiface/v0api/paych.go +++ b/app/client/apiface/v0api/paych.go @@ -3,15 +3,13 @@ package v0api import ( "context" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/paychmgr" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/specs-actors/actors/builtin/paych" "github.com/ipfs/go-cid" - "github.com/filecoin-project/go-address" + "github.com/filecoin-project/venus/pkg/paychmgr" + paychtypes "github.com/filecoin-project/venus/venus-shared/paych" ) type IPaychan interface { @@ -20,7 +18,7 @@ type IPaychan interface { // @to: the payment channel recipient // @amt: the deposits funds in the payment channel // Rule[perm:sign] - PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*apitypes.ChannelInfo, error) + PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*paychtypes.ChannelInfo, error) // PaychAvailableFunds get the status of an outbound payment channel // @pch: payment channel address // Rule[perm:sign] @@ -44,14 +42,14 @@ type IPaychan interface { // @to: the payment channel recipient // @vouchers: the outstanding (non-redeemed) vouchers // Rule[perm:sign] - PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []apitypes.VoucherSpec) (*apitypes.PaymentInfo, error) + PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []paychtypes.VoucherSpec) (*paychtypes.PaymentInfo, error) // PaychList list the addresses of all channels that have been created // Rule[perm:read] PaychList(ctx context.Context) ([]address.Address, error) // PaychStatus get the payment channel status // @pch: payment channel address // Rule[perm:read] - PaychStatus(ctx context.Context, pch address.Address) (*types.PaychStatus, error) + PaychStatus(ctx context.Context, pch address.Address) (*paychtypes.Status, error) // PaychSettle update payment channel status to settle // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain // @pch: payment channel address diff --git a/app/client/apiface/v0api/syncer.go b/app/client/apiface/v0api/syncer.go index 5902edbff9..3967e8a59d 100644 --- a/app/client/apiface/v0api/syncer.go +++ b/app/client/apiface/v0api/syncer.go @@ -4,9 +4,9 @@ import ( "context" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/app/submodule/apitypes" syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type ISyncer interface { @@ -23,7 +23,7 @@ type ISyncer interface { // Rule[perm:write] SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error // Rule[perm:read] - StateCall(ctx context.Context, msg *types.UnsignedMessage, tsk types.TipSetKey) (*types.InvocResult, error) + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*apitypes.InvocResult, error) // Rule[perm:read] SyncState(ctx context.Context) (*apitypes.SyncState, error) } diff --git a/app/client/apiface/v0api/wallet.go b/app/client/apiface/v0api/wallet.go index e516d994bd..ea20b74f12 100644 --- a/app/client/apiface/v0api/wallet.go +++ b/app/client/apiface/v0api/wallet.go @@ -6,8 +6,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/wallet" + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/wallet" ) type IWallet interface { @@ -30,7 +30,7 @@ type IWallet interface { // Rule[perm:write] WalletSetDefault(ctx context.Context, addr address.Address) error //not exists in remote // Rule[perm:sign] - WalletSignMessage(ctx context.Context, k address.Address, msg *types.UnsignedMessage) (*types.SignedMessage, error) + WalletSignMessage(ctx context.Context, k address.Address, msg *types.Message) (*types.SignedMessage, error) // Rule[perm:admin] LockWallet(ctx context.Context) error // Rule[perm:admin] diff --git a/app/client/apiface/wallet.go b/app/client/apiface/wallet.go index b9733a4f08..74b6217f50 100644 --- a/app/client/apiface/wallet.go +++ b/app/client/apiface/wallet.go @@ -5,9 +5,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/wallet" + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/wallet" ) type IWallet interface { @@ -30,7 +31,7 @@ type IWallet interface { // Rule[perm:write] WalletSetDefault(ctx context.Context, addr address.Address) error //not exists in remote // Rule[perm:sign] - WalletSignMessage(ctx context.Context, k address.Address, msg *types.UnsignedMessage) (*types.SignedMessage, error) + WalletSignMessage(ctx context.Context, k address.Address, msg *types.Message) (*types.SignedMessage, error) // Rule[perm:admin] LockWallet(ctx context.Context) error // Rule[perm:admin] diff --git a/app/client/full.go b/app/client/full.go index e6ae3ff67f..71acf4a71f 100644 --- a/app/client/full.go +++ b/app/client/full.go @@ -13,16 +13,17 @@ import ( "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-actors/actors/builtin/paych" - "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/chain" syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/messagepool" "github.com/filecoin-project/venus/pkg/net" "github.com/filecoin-project/venus/pkg/paychmgr" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/wallet" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/messagepool" + paychtypes "github.com/filecoin-project/venus/venus-shared/paych" + "github.com/filecoin-project/venus/venus-shared/wallet" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" "github.com/libp2p/go-libp2p-core/metrics" @@ -123,7 +124,7 @@ type IChainInfoStruct struct { ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) `perm:"read"` ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) `perm:"read"` ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*apitypes.BlockMessages, error) `perm:"read"` - ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.UnsignedMessage, error) `perm:"read"` + ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"` ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]apitypes.Message, error) `perm:"read"` ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]apitypes.Message, error) `perm:"read"` ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` @@ -173,7 +174,7 @@ func (s *IChainInfoStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) return s.Internal.ChainGetBlockMessages(p0, p1) } -func (s *IChainInfoStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*types.UnsignedMessage, error) { +func (s *IChainInfoStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*types.Message, error) { return s.Internal.ChainGetMessage(p0, p1) } @@ -367,43 +368,43 @@ func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 types.Tip type IMessagePoolStruct struct { Internal struct { - GasBatchEstimateMessageGas func(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) `perm:"read"` - GasEstimateFeeCap func(p0 context.Context, p1 *types.UnsignedMessage, p2 int64, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - GasEstimateGasLimit func(p0 context.Context, p1 *types.UnsignedMessage, p2 types.TipSetKey) (int64, error) `perm:"read"` - GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) `perm:"read"` - GasEstimateMessageGas func(p0 context.Context, p1 *types.UnsignedMessage, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.UnsignedMessage, error) `perm:"read"` - MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolBatchPushMessage func(p0 context.Context, p1 []*types.UnsignedMessage, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` - MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolCheckMessages func(p0 context.Context, p1 []*apitypes.MessagePrototype) ([][]apitypes.MessageCheckStatus, error) `perm:"read"` - MpoolCheckPendingMessages func(p0 context.Context, p1 address.Address) ([][]apitypes.MessageCheckStatus, error) `perm:"read"` - MpoolCheckReplaceMessages func(p0 context.Context, p1 []*types.Message) ([][]apitypes.MessageCheckStatus, error) `perm:"read"` - MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` - MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` - MpoolGetConfig func(p0 context.Context) (*messagepool.MpoolConfig, error) `perm:"read"` - MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` - MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` - MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"write"` - MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"write"` - MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolPushMessage func(p0 context.Context, p1 *types.UnsignedMessage, p2 *types.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` - MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` - MpoolSelects func(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) `perm:"read"` - MpoolSetConfig func(p0 context.Context, p1 *messagepool.MpoolConfig) error `perm:"admin"` - MpoolSub func(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) `perm:"read"` + GasBatchEstimateMessageGas func(p0 context.Context, p1 []*apitypes.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*apitypes.EstimateResult, error) `perm:"read"` + GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) `perm:"read"` + GasEstimateGasLimit func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) `perm:"read"` + GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) `perm:"read"` + GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *apitypes.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"` + MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *apitypes.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` + MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolCheckMessages func(p0 context.Context, p1 []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) `perm:"read"` + MpoolCheckPendingMessages func(p0 context.Context, p1 address.Address) ([][]messagepool.MessageCheckStatus, error) `perm:"read"` + MpoolCheckReplaceMessages func(p0 context.Context, p1 []*types.Message) ([][]messagepool.MessageCheckStatus, error) `perm:"read"` + MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` + MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` + MpoolGetConfig func(p0 context.Context) (*messagepool.MpoolConfig, error) `perm:"read"` + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` + MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` + MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"write"` + MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"write"` + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *apitypes.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` + MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` + MpoolSelects func(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) `perm:"read"` + MpoolSetConfig func(p0 context.Context, p1 *messagepool.MpoolConfig) error `perm:"admin"` + MpoolSub func(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) `perm:"read"` } } -func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) { +func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*apitypes.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*apitypes.EstimateResult, error) { return s.Internal.GasBatchEstimateMessageGas(p0, p1, p2, p3) } -func (s *IMessagePoolStruct) GasEstimateFeeCap(p0 context.Context, p1 *types.UnsignedMessage, p2 int64, p3 types.TipSetKey) (big.Int, error) { +func (s *IMessagePoolStruct) GasEstimateFeeCap(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) { return s.Internal.GasEstimateFeeCap(p0, p1, p2, p3) } -func (s *IMessagePoolStruct) GasEstimateGasLimit(p0 context.Context, p1 *types.UnsignedMessage, p2 types.TipSetKey) (int64, error) { +func (s *IMessagePoolStruct) GasEstimateGasLimit(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) { return s.Internal.GasEstimateGasLimit(p0, p1, p2) } @@ -411,7 +412,7 @@ func (s *IMessagePoolStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64 return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) } -func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.UnsignedMessage, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.UnsignedMessage, error) { +func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *apitypes.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) } @@ -419,7 +420,7 @@ func (s *IMessagePoolStruct) MpoolBatchPush(p0 context.Context, p1 []*types.Sign return s.Internal.MpoolBatchPush(p0, p1) } -func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.UnsignedMessage, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *apitypes.MessageSendSpec) ([]*types.SignedMessage, error) { return s.Internal.MpoolBatchPushMessage(p0, p1, p2) } @@ -427,15 +428,15 @@ func (s *IMessagePoolStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*t return s.Internal.MpoolBatchPushUntrusted(p0, p1) } -func (s *IMessagePoolStruct) MpoolCheckMessages(p0 context.Context, p1 []*apitypes.MessagePrototype) ([][]apitypes.MessageCheckStatus, error) { +func (s *IMessagePoolStruct) MpoolCheckMessages(p0 context.Context, p1 []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) { return s.Internal.MpoolCheckMessages(p0, p1) } -func (s *IMessagePoolStruct) MpoolCheckPendingMessages(p0 context.Context, p1 address.Address) ([][]apitypes.MessageCheckStatus, error) { +func (s *IMessagePoolStruct) MpoolCheckPendingMessages(p0 context.Context, p1 address.Address) ([][]messagepool.MessageCheckStatus, error) { return s.Internal.MpoolCheckPendingMessages(p0, p1) } -func (s *IMessagePoolStruct) MpoolCheckReplaceMessages(p0 context.Context, p1 []*types.Message) ([][]apitypes.MessageCheckStatus, error) { +func (s *IMessagePoolStruct) MpoolCheckReplaceMessages(p0 context.Context, p1 []*types.Message) ([][]messagepool.MessageCheckStatus, error) { return s.Internal.MpoolCheckReplaceMessages(p0, p1) } @@ -471,7 +472,7 @@ func (s *IMessagePoolStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessa return s.Internal.MpoolPush(p0, p1) } -func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *types.UnsignedMessage, p2 *types.MessageSendSpec) (*types.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *apitypes.MessageSendSpec) (*types.SignedMessage, error) { return s.Internal.MpoolPushMessage(p0, p1, p2) } @@ -503,7 +504,7 @@ type IMinerStateStruct struct { StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (apitypes.MarketBalance, error) `perm:"read"` - StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) `perm:"read"` + StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]apitypes.MarketDeal, error) `perm:"read"` StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*apitypes.MarketDeal, error) `perm:"read"` StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) `perm:"read"` @@ -554,7 +555,7 @@ func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Ad return s.Internal.StateMarketBalance(p0, p1, p2) } -func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) { +func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]apitypes.MarketDeal, error) { return s.Internal.StateMarketDeals(p0, p1) } @@ -667,47 +668,47 @@ func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, type IMultiSigStruct struct { Internal struct { - MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*apitypes.MessagePrototype, error) `perm:"sign"` - MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*apitypes.MessagePrototype, error) `perm:"sign"` - MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*apitypes.MessagePrototype, error) `perm:"sign"` - MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*apitypes.MessagePrototype, error) `perm:"sign"` - MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*apitypes.MessagePrototype, error) `perm:"sign"` - MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*apitypes.MessagePrototype, error) `perm:"sign"` - MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*apitypes.MessagePrototype, error) `perm:"sign"` - MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` - MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*apitypes.MessagePrototype, error) `perm:"sign"` - MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*apitypes.MessagePrototype, error) `perm:"sign"` - MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*apitypes.MessagePrototype, error) `perm:"sign"` - MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*apitypes.MessagePrototype, error) `perm:"sign"` - MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*apitypes.MessagePrototype, error) `perm:"sign"` + MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` + MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` } } -func (s *IMultiSigStruct) MsigAddApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigAddApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*messagepool.MessagePrototype, error) { return s.Internal.MsigAddApprove(p0, p1, p2, p3, p4, p5, p6) } -func (s *IMultiSigStruct) MsigAddCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigAddCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*messagepool.MessagePrototype, error) { return s.Internal.MsigAddCancel(p0, p1, p2, p3, p4, p5) } -func (s *IMultiSigStruct) MsigAddPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigAddPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) { return s.Internal.MsigAddPropose(p0, p1, p2, p3, p4) } -func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) { return s.Internal.MsigApprove(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*messagepool.MessagePrototype, error) { return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3, p4, p5, p6, p7, p8) } -func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*messagepool.MessagePrototype, error) { return s.Internal.MsigCancel(p0, p1, p2, p3, p4, p5, p6, p7) } -func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*messagepool.MessagePrototype, error) { return s.Internal.MsigCreate(p0, p1, p2, p3, p4, p5, p6) } @@ -715,23 +716,23 @@ func (s *IMultiSigStruct) MsigGetVested(p0 context.Context, p1 address.Address, return s.Internal.MsigGetVested(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*messagepool.MessagePrototype, error) { return s.Internal.MsigPropose(p0, p1, p2, p3, p4, p5, p6) } -func (s *IMultiSigStruct) MsigRemoveSigner(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigRemoveSigner(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) { return s.Internal.MsigRemoveSigner(p0, p1, p2, p3, p4) } -func (s *IMultiSigStruct) MsigSwapApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigSwapApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*messagepool.MessagePrototype, error) { return s.Internal.MsigSwapApprove(p0, p1, p2, p3, p4, p5, p6) } -func (s *IMultiSigStruct) MsigSwapCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigSwapCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*messagepool.MessagePrototype, error) { return s.Internal.MsigSwapCancel(p0, p1, p2, p3, p4, p5) } -func (s *IMultiSigStruct) MsigSwapPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*apitypes.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigSwapPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*messagepool.MessagePrototype, error) { return s.Internal.MsigSwapPropose(p0, p1, p2, p3, p4) } @@ -792,22 +793,22 @@ func (s *INetworkStruct) Version(p0 context.Context) (apitypes.Version, error) { type IPaychanStruct struct { Internal struct { - PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` - PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"sign"` - PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"sign"` - PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*apitypes.ChannelInfo, error) `perm:"sign"` - PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` - PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` - PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []apitypes.VoucherSpec) (*apitypes.PaymentInfo, error) `perm:"sign"` - PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychStatus func(p0 context.Context, p1 address.Address) (*types.PaychStatus, error) `perm:"read"` - PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` - PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` - PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` - PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychmgr.VoucherCreateResult, error) `perm:"sign"` - PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` - PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` + PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` + PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"sign"` + PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paychtypes.ChannelInfo, error) `perm:"sign"` + PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` + PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` + PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []paychtypes.VoucherSpec) (*paychtypes.PaymentInfo, error) `perm:"sign"` + PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + PaychStatus func(p0 context.Context, p1 address.Address) (*paychtypes.Status, error) `perm:"read"` + PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` + PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` + PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` + PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychmgr.VoucherCreateResult, error) `perm:"sign"` + PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` + PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` } } @@ -827,7 +828,7 @@ func (s *IPaychanStruct) PaychCollect(p0 context.Context, p1 address.Address) (c return s.Internal.PaychCollect(p0, p1) } -func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*apitypes.ChannelInfo, error) { +func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paychtypes.ChannelInfo, error) { return s.Internal.PaychGet(p0, p1, p2, p3) } @@ -839,7 +840,7 @@ func (s *IPaychanStruct) PaychList(p0 context.Context) ([]address.Address, error return s.Internal.PaychList(p0) } -func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []apitypes.VoucherSpec) (*apitypes.PaymentInfo, error) { +func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []paychtypes.VoucherSpec) (*paychtypes.PaymentInfo, error) { return s.Internal.PaychNewPayment(p0, p1, p2, p3) } @@ -847,7 +848,7 @@ func (s *IPaychanStruct) PaychSettle(p0 context.Context, p1 address.Address) (ci return s.Internal.PaychSettle(p0, p1) } -func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*types.PaychStatus, error) { +func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*paychtypes.Status, error) { return s.Internal.PaychStatus(p0, p1) } @@ -877,14 +878,14 @@ func (s *IPaychanStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Addre type ISyncerStruct struct { Internal struct { - ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"write"` - ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (big.Int, error) `perm:"read"` - Concurrent func(p0 context.Context) int64 `perm:"read"` - SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` - StateCall func(p0 context.Context, p1 *types.UnsignedMessage, p2 types.TipSetKey) (*types.InvocResult, error) `perm:"read"` - SyncState func(p0 context.Context) (*apitypes.SyncState, error) `perm:"read"` - SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` - SyncerTracker func(p0 context.Context) *syncTypes.TargetTracker `perm:"read"` + ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"write"` + ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (big.Int, error) `perm:"read"` + Concurrent func(p0 context.Context) int64 `perm:"read"` + SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*apitypes.InvocResult, error) `perm:"read"` + SyncState func(p0 context.Context) (*apitypes.SyncState, error) `perm:"read"` + SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` + SyncerTracker func(p0 context.Context) *syncTypes.TargetTracker `perm:"read"` } } @@ -904,7 +905,7 @@ func (s *ISyncerStruct) SetConcurrent(p0 context.Context, p1 int64) error { return s.Internal.SetConcurrent(p0, p1) } -func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *types.UnsignedMessage, p2 types.TipSetKey) (*types.InvocResult, error) { +func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*apitypes.InvocResult, error) { return s.Internal.StateCall(p0, p1, p2) } @@ -935,7 +936,7 @@ type IWalletStruct struct { WalletNewAddress func(p0 address.Protocol) (address.Address, error) `perm:"write"` WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) `perm:"sign"` - WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.UnsignedMessage) (*types.SignedMessage, error) `perm:"sign"` + WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) `perm:"sign"` WalletState func(p0 context.Context) int `perm:"admin"` } } @@ -992,7 +993,7 @@ func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 [] return s.Internal.WalletSign(p0, p1, p2, p3) } -func (s *IWalletStruct) WalletSignMessage(p0 context.Context, p1 address.Address, p2 *types.UnsignedMessage) (*types.SignedMessage, error) { +func (s *IWalletStruct) WalletSignMessage(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) { return s.Internal.WalletSignMessage(p0, p1, p2) } diff --git a/app/client/v0api/full.go b/app/client/v0api/full.go index 7f9190b650..51ab9ddc4d 100644 --- a/app/client/v0api/full.go +++ b/app/client/v0api/full.go @@ -13,16 +13,17 @@ import ( "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-actors/actors/builtin/paych" - "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/chain" syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/messagepool" "github.com/filecoin-project/venus/pkg/net" "github.com/filecoin-project/venus/pkg/paychmgr" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/wallet" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/messagepool" + paychtypes "github.com/filecoin-project/venus/venus-shared/paych" + "github.com/filecoin-project/venus/venus-shared/wallet" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" "github.com/libp2p/go-libp2p-core/metrics" @@ -123,7 +124,7 @@ type IChainInfoStruct struct { ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) `perm:"read"` ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) `perm:"read"` ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*apitypes.BlockMessages, error) `perm:"read"` - ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.UnsignedMessage, error) `perm:"read"` + ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"` ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]apitypes.Message, error) `perm:"read"` ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]apitypes.Message, error) `perm:"read"` ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` @@ -173,7 +174,7 @@ func (s *IChainInfoStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) return s.Internal.ChainGetBlockMessages(p0, p1) } -func (s *IChainInfoStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*types.UnsignedMessage, error) { +func (s *IChainInfoStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*types.Message, error) { return s.Internal.ChainGetMessage(p0, p1) } @@ -367,40 +368,40 @@ func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 types.Tip type IMessagePoolStruct struct { Internal struct { - GasBatchEstimateMessageGas func(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) `perm:"read"` - GasEstimateFeeCap func(p0 context.Context, p1 *types.UnsignedMessage, p2 int64, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - GasEstimateGasLimit func(p0 context.Context, p1 *types.UnsignedMessage, p2 types.TipSetKey) (int64, error) `perm:"read"` - GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) `perm:"read"` - GasEstimateMessageGas func(p0 context.Context, p1 *types.UnsignedMessage, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.UnsignedMessage, error) `perm:"read"` - MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolBatchPushMessage func(p0 context.Context, p1 []*types.UnsignedMessage, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` - MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` - MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` - MpoolGetConfig func(p0 context.Context) (*messagepool.MpoolConfig, error) `perm:"read"` - MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` - MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` - MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"write"` - MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"write"` - MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolPushMessage func(p0 context.Context, p1 *types.UnsignedMessage, p2 *types.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` - MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` - MpoolSelects func(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) `perm:"read"` - MpoolSetConfig func(p0 context.Context, p1 *messagepool.MpoolConfig) error `perm:"admin"` - MpoolSub func(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) `perm:"read"` + GasBatchEstimateMessageGas func(p0 context.Context, p1 []*apitypes.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*apitypes.EstimateResult, error) `perm:"read"` + GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) `perm:"read"` + GasEstimateGasLimit func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) `perm:"read"` + GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) `perm:"read"` + GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *apitypes.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"` + MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *apitypes.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` + MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` + MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` + MpoolGetConfig func(p0 context.Context) (*messagepool.MpoolConfig, error) `perm:"read"` + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` + MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` + MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"write"` + MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"write"` + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *apitypes.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` + MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` + MpoolSelects func(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) `perm:"read"` + MpoolSetConfig func(p0 context.Context, p1 *messagepool.MpoolConfig) error `perm:"admin"` + MpoolSub func(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) `perm:"read"` } } -func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) { +func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*apitypes.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*apitypes.EstimateResult, error) { return s.Internal.GasBatchEstimateMessageGas(p0, p1, p2, p3) } -func (s *IMessagePoolStruct) GasEstimateFeeCap(p0 context.Context, p1 *types.UnsignedMessage, p2 int64, p3 types.TipSetKey) (big.Int, error) { +func (s *IMessagePoolStruct) GasEstimateFeeCap(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) { return s.Internal.GasEstimateFeeCap(p0, p1, p2, p3) } -func (s *IMessagePoolStruct) GasEstimateGasLimit(p0 context.Context, p1 *types.UnsignedMessage, p2 types.TipSetKey) (int64, error) { +func (s *IMessagePoolStruct) GasEstimateGasLimit(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) { return s.Internal.GasEstimateGasLimit(p0, p1, p2) } @@ -408,7 +409,7 @@ func (s *IMessagePoolStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64 return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) } -func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.UnsignedMessage, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.UnsignedMessage, error) { +func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *apitypes.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) } @@ -416,7 +417,7 @@ func (s *IMessagePoolStruct) MpoolBatchPush(p0 context.Context, p1 []*types.Sign return s.Internal.MpoolBatchPush(p0, p1) } -func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.UnsignedMessage, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *apitypes.MessageSendSpec) ([]*types.SignedMessage, error) { return s.Internal.MpoolBatchPushMessage(p0, p1, p2) } @@ -456,7 +457,7 @@ func (s *IMessagePoolStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessa return s.Internal.MpoolPush(p0, p1) } -func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *types.UnsignedMessage, p2 *types.MessageSendSpec) (*types.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *apitypes.MessageSendSpec) (*types.SignedMessage, error) { return s.Internal.MpoolPushMessage(p0, p1, p2) } @@ -488,7 +489,7 @@ type IMinerStateStruct struct { StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (apitypes.MarketBalance, error) `perm:"read"` - StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) `perm:"read"` + StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]apitypes.MarketDeal, error) `perm:"read"` StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*apitypes.MarketDeal, error) `perm:"read"` StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) `perm:"read"` @@ -539,7 +540,7 @@ func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Ad return s.Internal.StateMarketBalance(p0, p1, p2) } -func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) { +func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]apitypes.MarketDeal, error) { return s.Internal.StateMarketDeals(p0, p1) } @@ -777,22 +778,22 @@ func (s *INetworkStruct) Version(p0 context.Context) (apitypes.Version, error) { type IPaychanStruct struct { Internal struct { - PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` - PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"sign"` - PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"sign"` - PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*apitypes.ChannelInfo, error) `perm:"sign"` - PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` - PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` - PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []apitypes.VoucherSpec) (*apitypes.PaymentInfo, error) `perm:"sign"` - PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychStatus func(p0 context.Context, p1 address.Address) (*types.PaychStatus, error) `perm:"read"` - PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` - PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` - PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` - PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychmgr.VoucherCreateResult, error) `perm:"sign"` - PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` - PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` + PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` + PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"sign"` + PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paychtypes.ChannelInfo, error) `perm:"sign"` + PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` + PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` + PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []paychtypes.VoucherSpec) (*paychtypes.PaymentInfo, error) `perm:"sign"` + PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + PaychStatus func(p0 context.Context, p1 address.Address) (*paychtypes.Status, error) `perm:"read"` + PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` + PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` + PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` + PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychmgr.VoucherCreateResult, error) `perm:"sign"` + PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` + PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` } } @@ -812,7 +813,7 @@ func (s *IPaychanStruct) PaychCollect(p0 context.Context, p1 address.Address) (c return s.Internal.PaychCollect(p0, p1) } -func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*apitypes.ChannelInfo, error) { +func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paychtypes.ChannelInfo, error) { return s.Internal.PaychGet(p0, p1, p2, p3) } @@ -824,7 +825,7 @@ func (s *IPaychanStruct) PaychList(p0 context.Context) ([]address.Address, error return s.Internal.PaychList(p0) } -func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []apitypes.VoucherSpec) (*apitypes.PaymentInfo, error) { +func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []paychtypes.VoucherSpec) (*paychtypes.PaymentInfo, error) { return s.Internal.PaychNewPayment(p0, p1, p2, p3) } @@ -832,7 +833,7 @@ func (s *IPaychanStruct) PaychSettle(p0 context.Context, p1 address.Address) (ci return s.Internal.PaychSettle(p0, p1) } -func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*types.PaychStatus, error) { +func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*paychtypes.Status, error) { return s.Internal.PaychStatus(p0, p1) } @@ -862,14 +863,14 @@ func (s *IPaychanStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Addre type ISyncerStruct struct { Internal struct { - ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"write"` - ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (big.Int, error) `perm:"read"` - Concurrent func(p0 context.Context) int64 `perm:"read"` - SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` - StateCall func(p0 context.Context, p1 *types.UnsignedMessage, p2 types.TipSetKey) (*types.InvocResult, error) `perm:"read"` - SyncState func(p0 context.Context) (*apitypes.SyncState, error) `perm:"read"` - SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` - SyncerTracker func(p0 context.Context) *syncTypes.TargetTracker `perm:"read"` + ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"write"` + ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (big.Int, error) `perm:"read"` + Concurrent func(p0 context.Context) int64 `perm:"read"` + SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*apitypes.InvocResult, error) `perm:"read"` + SyncState func(p0 context.Context) (*apitypes.SyncState, error) `perm:"read"` + SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` + SyncerTracker func(p0 context.Context) *syncTypes.TargetTracker `perm:"read"` } } @@ -889,7 +890,7 @@ func (s *ISyncerStruct) SetConcurrent(p0 context.Context, p1 int64) error { return s.Internal.SetConcurrent(p0, p1) } -func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *types.UnsignedMessage, p2 types.TipSetKey) (*types.InvocResult, error) { +func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*apitypes.InvocResult, error) { return s.Internal.StateCall(p0, p1, p2) } @@ -920,7 +921,7 @@ type IWalletStruct struct { WalletNewAddress func(p0 address.Protocol) (address.Address, error) `perm:"write"` WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) `perm:"sign"` - WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.UnsignedMessage) (*types.SignedMessage, error) `perm:"sign"` + WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) `perm:"sign"` WalletState func(p0 context.Context) int `perm:"admin"` } } @@ -977,7 +978,7 @@ func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 [] return s.Internal.WalletSign(p0, p1, p2, p3) } -func (s *IWalletStruct) WalletSignMessage(p0 context.Context, p1 address.Address, p2 *types.UnsignedMessage) (*types.SignedMessage, error) { +func (s *IWalletStruct) WalletSignMessage(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) { return s.Internal.WalletSignMessage(p0, p1, p2) } diff --git a/app/node/builder.go b/app/node/builder.go index 054322a2a0..5a9683417d 100644 --- a/app/node/builder.go +++ b/app/node/builder.go @@ -2,14 +2,15 @@ package node import ( "context" + "time" + chain2 "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/jwtauth" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs-force-community/metrics/ratelimit" logging "github.com/ipfs/go-log" "golang.org/x/xerrors" - "time" "github.com/filecoin-project/venus/app/submodule/blockstore" "github.com/filecoin-project/venus/app/submodule/chain" diff --git a/app/node/env.go b/app/node/env.go index 6283a28de5..bd083b2726 100644 --- a/app/node/env.go +++ b/app/node/env.go @@ -3,11 +3,10 @@ package node import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" - cmds "github.com/ipfs/go-ipfs-cmds" + "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/filecoin-project/venus/app/submodule/storagenetworking" ) diff --git a/app/node/helpers.go b/app/node/helpers.go index 70370287e9..614b6d2c16 100644 --- a/app/node/helpers.go +++ b/app/node/helpers.go @@ -3,14 +3,14 @@ package node import ( "bytes" "encoding/json" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" "github.com/pkg/errors" "github.com/filecoin-project/venus/pkg/chain" + "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // readGenesisCid is a helper function that queries the provided datastore for diff --git a/app/node/test/node.go b/app/node/test/node.go index cb0965db4e..27663dd690 100644 --- a/app/node/test/node.go +++ b/app/node/test/node.go @@ -2,11 +2,11 @@ package test import ( "context" - "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" "math/rand" "testing" - "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-address" "github.com/filecoin-project/venus/app/node" diff --git a/app/submodule/apitypes/chain.go b/app/submodule/apitypes/chain.go index 3d8f6085d8..5a7b7205e4 100644 --- a/app/submodule/apitypes/chain.go +++ b/app/submodule/apitypes/chain.go @@ -9,9 +9,9 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/pkg/chain" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type Partition struct { @@ -43,7 +43,7 @@ type Deadline struct { // BlsMessages[x].cid = Cids[x] // SecpkMessages[y].cid = Cids[BlsMessages.length + y] type BlockMessages struct { - BlsMessages []*types.UnsignedMessage + BlsMessages []*types.Message SecpkMessages []*types.SignedMessage Cids []cid.Cid } @@ -73,7 +73,7 @@ var MarketBalanceNil = MarketBalance{} type Message struct { Cid cid.Cid - Message *types.UnsignedMessage + Message *types.Message } type MinerPower struct { diff --git a/app/submodule/apitypes/mining.go b/app/submodule/apitypes/mining.go index 6ae394596a..aa8db82f9c 100644 --- a/app/submodule/apitypes/mining.go +++ b/app/submodule/apitypes/mining.go @@ -4,8 +4,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type MiningBaseInfo struct { //nolint diff --git a/app/submodule/apitypes/mpool.go b/app/submodule/apitypes/mpool.go index a9e4fd6e80..a44bf2a665 100644 --- a/app/submodule/apitypes/mpool.go +++ b/app/submodule/apitypes/mpool.go @@ -1,7 +1,7 @@ package apitypes import ( - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" ) diff --git a/app/submodule/apitypes/syncer.go b/app/submodule/apitypes/syncer.go index e337c7e7d9..49452eb58b 100644 --- a/app/submodule/apitypes/syncer.go +++ b/app/submodule/apitypes/syncer.go @@ -2,15 +2,17 @@ package apitypes import ( "fmt" + "time" + "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" - "time" ) type ComputeStateOutput struct { Root cid.Cid - Trace []*types.InvocResult + Trace []*apitypes.InvocResult } type SyncState struct { diff --git a/app/submodule/blockstore/blockstore_api.go b/app/submodule/blockstore/blockstore_api.go index 2797aacab5..45f21f3b84 100644 --- a/app/submodule/blockstore/blockstore_api.go +++ b/app/submodule/blockstore/blockstore_api.go @@ -2,15 +2,17 @@ package blockstore import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/submodule/apitypes" + "sync" + "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" offline "github.com/ipfs/go-ipfs-exchange-offline" ipld "github.com/ipfs/go-ipld-format" "github.com/ipfs/go-merkledag" "golang.org/x/xerrors" - "sync" + + "github.com/filecoin-project/venus/app/client/apiface" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" ) var _ apiface.IBlockStore = &blockstoreAPI{} diff --git a/app/submodule/chain/account_api.go b/app/submodule/chain/account_api.go index 51fdcf7289..bee1ee6713 100644 --- a/app/submodule/chain/account_api.go +++ b/app/submodule/chain/account_api.go @@ -2,8 +2,9 @@ package chain import ( "context" + "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-address" "golang.org/x/xerrors" diff --git a/app/submodule/chain/actor_api.go b/app/submodule/chain/actor_api.go index 7521d68a46..f6ac184373 100644 --- a/app/submodule/chain/actor_api.go +++ b/app/submodule/chain/actor_api.go @@ -2,9 +2,10 @@ package chain import ( "context" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var _ apiface.IActor = &actorAPI{} diff --git a/app/submodule/chain/beacon_api.go b/app/submodule/chain/beacon_api.go index 6b333b4f5a..21e4053555 100644 --- a/app/submodule/chain/beacon_api.go +++ b/app/submodule/chain/beacon_api.go @@ -3,9 +3,10 @@ package chain import ( "context" "fmt" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" xerrors "github.com/pkg/errors" ) diff --git a/app/submodule/chain/chain_submodule.go b/app/submodule/chain/chain_submodule.go index 31fea67130..ee8f84efff 100644 --- a/app/submodule/chain/chain_submodule.go +++ b/app/submodule/chain/chain_submodule.go @@ -2,26 +2,25 @@ package chain import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" - "github.com/filecoin-project/venus/pkg/statemanger" - "github.com/filecoin-project/venus/pkg/vm" - cbor "github.com/ipfs/go-ipld-cbor" "time" - chainv0api "github.com/filecoin-project/venus/app/submodule/chain/v0api" - "github.com/ipfs/go-cid" + cbor "github.com/ipfs/go-ipld-cbor" + "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/app/client/apiface/v0api" + chainv0api "github.com/filecoin-project/venus/app/submodule/chain/v0api" "github.com/filecoin-project/venus/pkg/beacon" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/consensus" "github.com/filecoin-project/venus/pkg/consensusfault" "github.com/filecoin-project/venus/pkg/fork" "github.com/filecoin-project/venus/pkg/repo" - "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/pkg/statemanger" "github.com/filecoin-project/venus/pkg/util/ffiwrapper" + "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/pkg/vmsupport" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // ChainSubmodule enhances the `Node` with chain capabilities. diff --git a/app/submodule/chain/chaininfo_api.go b/app/submodule/chain/chaininfo_api.go index a9e5185a98..12e07f8138 100644 --- a/app/submodule/chain/chaininfo_api.go +++ b/app/submodule/chain/chaininfo_api.go @@ -3,23 +3,22 @@ package chain import ( "bufio" "context" - - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/submodule/apitypes" - logging "github.com/ipfs/go-log/v2" "io" "time" - miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" acrypto "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/venus/pkg/chain" - "github.com/filecoin-project/venus/pkg/types" + miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" "github.com/ipfs/go-cid" + logging "github.com/ipfs/go-log/v2" "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/pkg/chain" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var _ apiface.IChainInfo = &chainInfoAPI{} @@ -148,7 +147,7 @@ func (cia *chainInfoAPI) ChainGetBlock(ctx context.Context, id cid.Cid) (*types. // ChainGetMessage reads a message referenced by the specified CID from the // chain blockstore. -func (cia *chainInfoAPI) ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.UnsignedMessage, error) { +func (cia *chainInfoAPI) ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.Message, error) { msg, err := cia.chain.MessageStore.LoadMessage(msgID) if err != nil { return nil, err @@ -247,7 +246,7 @@ func (cia *chainInfoAPI) ChainGetParentMessages(ctx context.Context, bcid cid.Ci } // TODO: need to get the number of messages better than this - pts, err := cia.chain.ChainReader.GetTipSet(types.NewTipSetKey(b.Parents.Cids()...)) + pts, err := cia.chain.ChainReader.GetTipSet(types.NewTipSetKey(b.Parents...)) if err != nil { return nil, err } @@ -281,7 +280,7 @@ func (cia *chainInfoAPI) ChainGetParentReceipts(ctx context.Context, bcid cid.Ci } // TODO: need to get the number of messages better than this - pts, err := cia.chain.ChainReader.GetTipSet(types.NewTipSetKey(b.Parents.Cids()...)) + pts, err := cia.chain.ChainReader.GetTipSet(types.NewTipSetKey(b.Parents...)) if err != nil { return nil, err } diff --git a/app/submodule/chain/miner_api.go b/app/submodule/chain/miner_api.go index 62af1df575..1fc37a3400 100644 --- a/app/submodule/chain/miner_api.go +++ b/app/submodule/chain/miner_api.go @@ -3,9 +3,6 @@ package chain import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/venus-shared/actors/policy" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" @@ -13,16 +10,17 @@ import ( "github.com/filecoin-project/go-state-types/dline" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/app/submodule/apitypes" + "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/actors/policy" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var _ apiface.IMinerState = &minerStateAPI{} @@ -359,7 +357,7 @@ func (msa *minerStateAPI) StateMinerPreCommitDepositForPower(ctx context.Context var sectorWeight abi.StoragePower if act, found, err := sTree.GetActor(ctx, market.Address); err != nil || !found { return big.Int{}, xerrors.Errorf("loading market actor %s: %v", maddr, err) - } else if s, err := market.Load(store, (*types2.Actor)(act)); err != nil { + } else if s, err := market.Load(store, act); err != nil { return big.Int{}, xerrors.Errorf("loading market actor state %s: %v", maddr, err) } else if w, vw, err := s.VerifyDealsForActivation(maddr, pci.DealIDs, ts.Height(), pci.Expiration); err != nil { return big.Int{}, xerrors.Errorf("verifying deals for activation: %v", err) @@ -372,7 +370,7 @@ func (msa *minerStateAPI) StateMinerPreCommitDepositForPower(ctx context.Context var powerSmoothed builtin.FilterEstimate if act, found, err := sTree.GetActor(ctx, power.Address); err != nil || !found { return big.Int{}, xerrors.Errorf("loading power actor: %v", err) - } else if s, err := power.Load(store, (*types2.Actor)(act)); err != nil { + } else if s, err := power.Load(store, act); err != nil { return big.Int{}, xerrors.Errorf("loading power actor state: %v", err) } else if p, err := s.TotalPowerSmoothed(); err != nil { return big.Int{}, xerrors.Errorf("failed to determine total power: %v", err) @@ -385,7 +383,7 @@ func (msa *minerStateAPI) StateMinerPreCommitDepositForPower(ctx context.Context return big.Int{}, xerrors.Errorf("loading miner actor: %v", err) } - rewardState, err := reward.Load(store, (*types2.Actor)(rewardActor)) + rewardState, err := reward.Load(store, rewardActor) if err != nil { return big.Int{}, xerrors.Errorf("loading reward actor state: %v", err) } @@ -419,7 +417,7 @@ func (msa *minerStateAPI) StateMinerInitialPledgeCollateral(ctx context.Context, var sectorWeight abi.StoragePower if act, found, err := state.GetActor(ctx, market.Address); err != nil || !found { return big.Int{}, xerrors.Errorf("loading miner actor %s: %v", maddr, err) - } else if s, err := market.Load(store, (*types2.Actor)(act)); err != nil { + } else if s, err := market.Load(store, act); err != nil { return big.Int{}, xerrors.Errorf("loading market actor state %s: %v", maddr, err) } else if w, vw, err := s.VerifyDealsForActivation(maddr, pci.DealIDs, ts.Height(), pci.Expiration); err != nil { return big.Int{}, xerrors.Errorf("verifying deals for activation: %v", err) @@ -435,7 +433,7 @@ func (msa *minerStateAPI) StateMinerInitialPledgeCollateral(ctx context.Context, ) if act, found, err := state.GetActor(ctx, power.Address); err != nil || !found { return big.Int{}, xerrors.Errorf("loading miner actor: %v", err) - } else if s, err := power.Load(store, (*types2.Actor)(act)); err != nil { + } else if s, err := power.Load(store, act); err != nil { return big.Int{}, xerrors.Errorf("loading power actor state: %v", err) } else if p, err := s.TotalPowerSmoothed(); err != nil { return big.Int{}, xerrors.Errorf("failed to determine total power: %v", err) @@ -451,7 +449,7 @@ func (msa *minerStateAPI) StateMinerInitialPledgeCollateral(ctx context.Context, return big.Int{}, xerrors.Errorf("loading miner actor: %v", err) } - rewardState, err := reward.Load(store, (*types2.Actor)(rewardActor)) + rewardState, err := reward.Load(store, rewardActor) if err != nil { return big.Int{}, xerrors.Errorf("loading reward actor state: %v", err) } @@ -504,7 +502,7 @@ func (msa *minerStateAPI) StateCirculatingSupply(ctx context.Context, tsk types. } // StateMarketDeals returns information about every deal in the Storage Market -func (msa *minerStateAPI) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) { +func (msa *minerStateAPI) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]apitypes.MarketDeal, error) { _, view, err := msa.Stmgr.ParentStateViewTsk(ctx, tsk) if err != nil { return nil, xerrors.Errorf("Stmgr.ParentStateViewTsk failed:%w", err) diff --git a/app/submodule/chain/v0api/chaininfo_v0api.go b/app/submodule/chain/v0api/chaininfo_v0api.go index 4320195057..85b5a5ad94 100644 --- a/app/submodule/chain/v0api/chaininfo_v0api.go +++ b/app/submodule/chain/v0api/chaininfo_v0api.go @@ -2,15 +2,16 @@ package v0api import ( "context" + "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var _ v0api.IChain = &WrapperV1IChain{} diff --git a/app/submodule/config/config_test.go b/app/submodule/config/config_test.go index 6c480f672c..ad8a1c16ea 100644 --- a/app/submodule/config/config_test.go +++ b/app/submodule/config/config_test.go @@ -3,6 +3,8 @@ package config import ( "testing" + "github.com/filecoin-project/venus/pkg/testhelpers" + "github.com/filecoin-project/go-address" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -10,7 +12,6 @@ import ( "github.com/filecoin-project/venus/pkg/config" repo2 "github.com/filecoin-project/venus/pkg/repo" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" ) func TestConfigGet(t *testing.T) { @@ -72,7 +73,7 @@ func TestConfigSet(t *testing.T) { require.NoError(t, err) assert.Equal(t, ":1234", cfg.API.APIAddress) - testAddr := types.RequireIDAddress(t, 100).String() + testAddr := testhelpers.RequireIDAddress(t, 100).String() err = cfgAPI.Set("walletModule.defaultAddress", testAddr) require.NoError(t, err) assert.Equal(t, testAddr, cfg.Wallet.DefaultAddress.String()) diff --git a/app/submodule/discovery/discovery_submodule.go b/app/submodule/discovery/discovery_submodule.go index a7d1b202f4..421cc80d61 100644 --- a/app/submodule/discovery/discovery_submodule.go +++ b/app/submodule/discovery/discovery_submodule.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/filecoin-project/venus/app/submodule/network" "github.com/filecoin-project/venus/pkg/repo" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/libp2p/go-libp2p-core/host" "github.com/ipfs/go-cid" diff --git a/app/submodule/market/market_api.go b/app/submodule/market/market_api.go index 81f6fedc96..38901c294c 100644 --- a/app/submodule/market/market_api.go +++ b/app/submodule/market/market_api.go @@ -2,14 +2,14 @@ package market import ( "context" + + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/statemanger" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" ) type marketAPI struct { diff --git a/app/submodule/mining/mining_api.go b/app/submodule/mining/mining_api.go index d981289c1b..f67b22e4c1 100644 --- a/app/submodule/mining/mining_api.go +++ b/app/submodule/mining/mining_api.go @@ -17,15 +17,14 @@ import ( ffi "github.com/filecoin-project/filecoin-ffi" - "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/beacon" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/state" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/wallet" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" + wtypes "github.com/filecoin-project/venus/venus-shared/wallet" ) var _ apiface.IMining = &MiningAPI{} @@ -84,7 +83,7 @@ func (miningAPI *MiningAPI) MinerGetBaseInfo(ctx context.Context, maddr address. if err != nil { return nil, xerrors.Errorf("failed to load miner actor: %v", err) } - mas, err := miner.Load(chainStore.Store(ctx), (*types2.Actor)(act)) + mas, err := miner.Load(chainStore.Store(ctx), act) if err != nil { return nil, xerrors.Errorf("failed to load miner actor state: %v", err) } @@ -195,7 +194,7 @@ func (miningAPI *MiningAPI) minerCreateBlock(ctx context.Context, bt *apitypes.B next := &types.BlockHeader{ Miner: bt.Miner, - Parents: bt.Parents, + Parents: bt.Parents.Cids(), Ticket: bt.Ticket, ElectionProof: bt.Eproof, @@ -207,7 +206,7 @@ func (miningAPI *MiningAPI) minerCreateBlock(ctx context.Context, bt *apitypes.B ParentMessageReceipts: receiptCid, } - var blsMessages []*types.UnsignedMessage + var blsMessages []*types.Message var secpkMessages []*types.SignedMessage var blsMsgCids, secpkMsgCids []cid.Cid @@ -266,9 +265,12 @@ func (miningAPI *MiningAPI) minerCreateBlock(ctx context.Context, bt *apitypes.B } if bHas { - nosigbytes := next.SignatureData() - sig, err := miningAPI.Ming.Wallet.API().WalletSign(ctx, worker, nosigbytes, wallet.MsgMeta{ - Type: wallet.MTBlock, + nosigbytes, err := next.SignatureData() + if err != nil { + return nil, err + } + sig, err := miningAPI.Ming.Wallet.API().WalletSign(ctx, worker, nosigbytes, wtypes.MsgMeta{ + Type: wtypes.MTBlock, }) if err != nil { return nil, xerrors.Errorf("failed to sign new block: %v", err) diff --git a/app/submodule/mpool/mpool_api.go b/app/submodule/mpool/mpool_api.go index b114034523..20c5a22b71 100644 --- a/app/submodule/mpool/mpool_api.go +++ b/app/submodule/mpool/mpool_api.go @@ -3,12 +3,14 @@ package mpool import ( "context" "encoding/json" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/messagepool" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" + mptypes "github.com/filecoin-project/venus/venus-shared/messagepool" "github.com/ipfs/go-cid" "golang.org/x/xerrors" ) @@ -42,13 +44,28 @@ func (a *MessagePoolAPI) MpoolPush(ctx context.Context, smsg *types.SignedMessag } // MpoolGetConfig returns (a copy of) the current mpool config -func (a *MessagePoolAPI) MpoolGetConfig(context.Context) (*messagepool.MpoolConfig, error) { - return a.mp.MPool.GetConfig(), nil +func (a *MessagePoolAPI) MpoolGetConfig(context.Context) (*mptypes.MpoolConfig, error) { + cfg := a.mp.MPool.GetConfig() + return &mptypes.MpoolConfig{ + PriorityAddrs: cfg.PriorityAddrs, + SizeLimitHigh: cfg.SizeLimitHigh, + SizeLimitLow: cfg.SizeLimitLow, + ReplaceByFeeRatio: cfg.ReplaceByFeeRatio, + PruneCooldown: cfg.PruneCooldown, + GasLimitOverestimation: cfg.GasLimitOverestimation, + }, nil } // MpoolSetConfig sets the mpool config to (a copy of) the supplied config -func (a *MessagePoolAPI) MpoolSetConfig(ctx context.Context, cfg *messagepool.MpoolConfig) error { - return a.mp.MPool.SetConfig(cfg) +func (a *MessagePoolAPI) MpoolSetConfig(ctx context.Context, cfg *mptypes.MpoolConfig) error { + return a.mp.MPool.SetConfig(&messagepool.MpoolConfig{ + PriorityAddrs: cfg.PriorityAddrs, + SizeLimitHigh: cfg.SizeLimitHigh, + SizeLimitLow: cfg.SizeLimitLow, + ReplaceByFeeRatio: cfg.ReplaceByFeeRatio, + PruneCooldown: cfg.PruneCooldown, + GasLimitOverestimation: cfg.GasLimitOverestimation, + }) } // MpoolSelect returns a list of pending messages for inclusion in the next block @@ -164,7 +181,7 @@ func (a *MessagePoolAPI) MpoolPushUntrusted(ctx context.Context, smsg *types.Sig // // When maxFee is set to 0, MpoolPushMessage will guess appropriate fee // based on current chain conditions -func (a *MessagePoolAPI) MpoolPushMessage(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec) (*types.SignedMessage, error) { +func (a *MessagePoolAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec) (*types.SignedMessage, error) { cp := *msg msg = &cp inMsg := *msg @@ -252,7 +269,7 @@ func (a *MessagePoolAPI) MpoolBatchPushUntrusted(ctx context.Context, smsgs []*t } // MpoolBatchPushMessage batch pushes a unsigned message to mempool. -func (a *MessagePoolAPI) MpoolBatchPushMessage(ctx context.Context, msgs []*types.UnsignedMessage, spec *types.MessageSendSpec) ([]*types.SignedMessage, error) { +func (a *MessagePoolAPI) MpoolBatchPushMessage(ctx context.Context, msgs []*types.Message, spec *apitypes.MessageSendSpec) ([]*types.SignedMessage, error) { var smsgs []*types.SignedMessage for _, msg := range msgs { smsg, err := a.MpoolPushMessage(ctx, msg, spec) @@ -270,25 +287,25 @@ func (a *MessagePoolAPI) MpoolGetNonce(ctx context.Context, addr address.Address return a.mp.MPool.GetNonce(ctx, addr, types.EmptyTSK) } -func (a *MessagePoolAPI) MpoolSub(ctx context.Context) (<-chan messagepool.MpoolUpdate, error) { +func (a *MessagePoolAPI) MpoolSub(ctx context.Context) (<-chan mptypes.MpoolUpdate, error) { return a.mp.MPool.Updates(ctx) } // GasEstimateMessageGas estimates gas values for unset message gas fields -func (a *MessagePoolAPI) GasEstimateMessageGas(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec, tsk types.TipSetKey) (*types.UnsignedMessage, error) { - return a.mp.MPool.GasEstimateMessageGas(ctx, &types.EstimateMessage{Msg: msg, Spec: spec}, tsk) +func (a *MessagePoolAPI) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) { + return a.mp.MPool.GasEstimateMessageGas(ctx, &apitypes.EstimateMessage{Msg: msg, Spec: spec}, tsk) } -func (a *MessagePoolAPI) GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) { +func (a *MessagePoolAPI) GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*apitypes.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*apitypes.EstimateResult, error) { return a.mp.MPool.GasBatchEstimateMessageGas(ctx, estimateMessages, fromNonce, tsk) } // GasEstimateFeeCap estimates gas fee cap -func (a *MessagePoolAPI) GasEstimateFeeCap(ctx context.Context, msg *types.UnsignedMessage, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) { +func (a *MessagePoolAPI) GasEstimateFeeCap(ctx context.Context, msg *types.Message, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) { return a.mp.MPool.GasEstimateFeeCap(ctx, msg, maxqueueblks, tsk) } -func (a *MessagePoolAPI) GasEstimateGasLimit(ctx context.Context, msgIn *types.UnsignedMessage, tsk types.TipSetKey) (int64, error) { +func (a *MessagePoolAPI) GasEstimateGasLimit(ctx context.Context, msgIn *types.Message, tsk types.TipSetKey) (int64, error) { return a.mp.MPool.GasEstimateGasLimit(ctx, msgIn, tsk) } @@ -298,15 +315,15 @@ func (a *MessagePoolAPI) GasEstimateGasPremium(ctx context.Context, nblocksincl return a.mp.MPool.GasEstimateGasPremium(ctx, nblocksincl, sender, gaslimit, tsk, a.mp.MPool.PriceCache) } -func (a *MessagePoolAPI) MpoolCheckMessages(ctx context.Context, protos []*apitypes.MessagePrototype) ([][]apitypes.MessageCheckStatus, error) { +func (a *MessagePoolAPI) MpoolCheckMessages(ctx context.Context, protos []*mptypes.MessagePrototype) ([][]mptypes.MessageCheckStatus, error) { return a.mp.MPool.CheckMessages(ctx, protos) } -func (a *MessagePoolAPI) MpoolCheckPendingMessages(ctx context.Context, addr address.Address) ([][]apitypes.MessageCheckStatus, error) { +func (a *MessagePoolAPI) MpoolCheckPendingMessages(ctx context.Context, addr address.Address) ([][]mptypes.MessageCheckStatus, error) { return a.mp.MPool.CheckPendingMessages(ctx, addr) } -func (a *MessagePoolAPI) MpoolCheckReplaceMessages(ctx context.Context, msg []*types.Message) ([][]apitypes.MessageCheckStatus, error) { +func (a *MessagePoolAPI) MpoolCheckReplaceMessages(ctx context.Context, msg []*types.Message) ([][]mptypes.MessageCheckStatus, error) { return a.mp.MPool.CheckReplaceMessages(ctx, msg) } diff --git a/app/submodule/mpool/mpool_submodule.go b/app/submodule/mpool/mpool_submodule.go index d7ca57d798..d86d898cb1 100644 --- a/app/submodule/mpool/mpool_submodule.go +++ b/app/submodule/mpool/mpool_submodule.go @@ -26,7 +26,7 @@ import ( "github.com/filecoin-project/venus/pkg/messagepool/journal" "github.com/filecoin-project/venus/pkg/net/msgsub" "github.com/filecoin-project/venus/pkg/repo" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var pubsubMsgsSyncEpochs = 10 diff --git a/app/submodule/multisig/multisig_api.go b/app/submodule/multisig/multisig_api.go index 3aa7b1e864..311bf5212d 100644 --- a/app/submodule/multisig/multisig_api.go +++ b/app/submodule/multisig/multisig_api.go @@ -3,19 +3,17 @@ package multisig import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" multisig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/builtin/multisig" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/messagepool" ) var _ apiface.IMultiSig = &multiSig{} @@ -52,7 +50,7 @@ func (a *multiSig) messageBuilder(ctx context.Context, from address.Address) (mu // MsigCreate creates a multisig wallet // It takes the following params: , , //, , -func (a *multiSig) MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (*apitypes.MessagePrototype, error) { +func (a *multiSig) MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (*messagepool.MessagePrototype, error) { mb, err := a.messageBuilder(ctx, src) if err != nil { @@ -64,13 +62,13 @@ func (a *multiSig) MsigCreate(ctx context.Context, req uint64, addrs []address.A return nil, err } - return &apitypes.MessagePrototype{ - Message: types.UnsignedMessage(*msg), + return &messagepool.MessagePrototype{ + Message: *msg, ValidNonce: false, }, nil } -func (a *multiSig) MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) { +func (a *multiSig) MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) { mb, err := a.messageBuilder(ctx, src) if err != nil { @@ -82,13 +80,13 @@ func (a *multiSig) MsigPropose(ctx context.Context, msig address.Address, to add return nil, xerrors.Errorf("failed to create proposal: %w", err) } - return &apitypes.MessagePrototype{ - Message: types.UnsignedMessage(*msg), + return &messagepool.MessagePrototype{ + Message: *msg, ValidNonce: false, }, nil } -func (a *multiSig) MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*apitypes.MessagePrototype, error) { +func (a *multiSig) MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) { enc, actErr := serializeAddParams(newAdd, inc) if actErr != nil { return nil, actErr @@ -97,7 +95,7 @@ func (a *multiSig) MsigAddPropose(ctx context.Context, msig address.Address, src return a.MsigPropose(ctx, msig, msig, big.Zero(), src, uint64(multisig.Methods.AddSigner), enc) } -func (a *multiSig) MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*apitypes.MessagePrototype, error) { +func (a *multiSig) MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) { enc, actErr := serializeAddParams(newAdd, inc) if actErr != nil { return nil, actErr @@ -109,7 +107,7 @@ func (a *multiSig) MsigAddApprove(ctx context.Context, msig address.Address, src // MsigAddApprove approves a previously proposed AddSigner message // It takes the following params: , , , // , , -func (a *multiSig) MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*apitypes.MessagePrototype, error) { +func (a *multiSig) MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) { enc, actErr := serializeAddParams(newAdd, inc) if actErr != nil { return nil, actErr @@ -121,7 +119,7 @@ func (a *multiSig) MsigAddCancel(ctx context.Context, msig address.Address, src // MsigSwapPropose proposes swapping 2 signers in the multisig // It takes the following params: , , // , -func (a *multiSig) MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*apitypes.MessagePrototype, error) { +func (a *multiSig) MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) { enc, actErr := serializeSwapParams(oldAdd, newAdd) if actErr != nil { return nil, actErr @@ -133,7 +131,7 @@ func (a *multiSig) MsigSwapPropose(ctx context.Context, msig address.Address, sr // MsigSwapApprove approves a previously proposed SwapSigner // It takes the following params: , , , // , , -func (a *multiSig) MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*apitypes.MessagePrototype, error) { +func (a *multiSig) MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) { enc, actErr := serializeSwapParams(oldAdd, newAdd) if actErr != nil { return nil, actErr @@ -142,7 +140,7 @@ func (a *multiSig) MsigSwapApprove(ctx context.Context, msig address.Address, sr return a.MsigApproveTxnHash(ctx, msig, txID, proposer, msig, big.Zero(), src, uint64(multisig.Methods.SwapSigner), enc) } -func (a *multiSig) MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*apitypes.MessagePrototype, error) { +func (a *multiSig) MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) { enc, actErr := serializeSwapParams(oldAdd, newAdd) if actErr != nil { return nil, actErr @@ -154,7 +152,7 @@ func (a *multiSig) MsigSwapCancel(ctx context.Context, msig address.Address, src // MsigSwapCancel cancels a previously proposed SwapSigner message // It takes the following params: , , , // , -func (a *multiSig) MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*apitypes.MessagePrototype, error) { +func (a *multiSig) MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) { return a.msigApproveOrCancelSimple(ctx, MsigApprove, msig, txID, src) } @@ -164,14 +162,14 @@ func (a *multiSig) MsigApprove(ctx context.Context, msig address.Address, txID u // exactly the transaction you think you are. // It takes the following params: , , , , , // , , -func (a *multiSig) MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) { +func (a *multiSig) MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) { return a.msigApproveOrCancelTxnHash(ctx, MsigApprove, msig, txID, proposer, to, amt, src, method, params) } // MsigCancel cancels a previously-proposed multisig message // It takes the following params: , , , , // , , -func (a *multiSig) MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) { +func (a *multiSig) MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) { return a.msigApproveOrCancelTxnHash(ctx, MsigCancel, msig, txID, src, to, amt, src, method, params) } @@ -180,7 +178,7 @@ func (a *multiSig) MsigCancel(ctx context.Context, msig address.Address, txID ui // send the message from, the address to be removed, and a boolean // indicating whether or not the signing threshold should be lowered by one // along with the address removal. -func (a *multiSig) MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*apitypes.MessagePrototype, error) { +func (a *multiSig) MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*messagepool.MessagePrototype, error) { enc, actErr := serializeRemoveParams(toRemove, decrease) if actErr != nil { return nil, actErr @@ -214,7 +212,7 @@ func (a *multiSig) MsigGetVested(ctx context.Context, addr address.Address, star return types.EmptyInt, xerrors.Errorf("failed to load multisig actor at end epoch: %w", err) } - msas, err := multisig.Load(a.store.Store(ctx), (*types2.Actor)(act)) + msas, err := multisig.Load(a.store.Store(ctx), act) if err != nil { return types.EmptyInt, xerrors.Errorf("failed to load multisig actor state: %w", err) } @@ -232,7 +230,7 @@ func (a *multiSig) MsigGetVested(ctx context.Context, addr address.Address, star return types.BigSub(startLk, endLk), nil } -func (a *multiSig) msigApproveOrCancelSimple(ctx context.Context, operation MsigProposeResponse, msig address.Address, txID uint64, src address.Address) (*apitypes.MessagePrototype, error) { +func (a *multiSig) msigApproveOrCancelSimple(ctx context.Context, operation MsigProposeResponse, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) { if msig == address.Undef { return nil, xerrors.Errorf("must provide multisig address") } @@ -246,7 +244,7 @@ func (a *multiSig) msigApproveOrCancelSimple(ctx context.Context, operation Msig return nil, err } - var msg *types2.Message + var msg *types.Message switch operation { case MsigApprove: msg, err = mb.Approve(msig, txID, nil) @@ -259,10 +257,10 @@ func (a *multiSig) msigApproveOrCancelSimple(ctx context.Context, operation Msig return nil, err } - return &apitypes.MessagePrototype{Message: types.UnsignedMessage(*msg), ValidNonce: false}, nil + return &messagepool.MessagePrototype{Message: *msg, ValidNonce: false}, nil } -func (a *multiSig) msigApproveOrCancelTxnHash(ctx context.Context, operation MsigProposeResponse, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*apitypes.MessagePrototype, error) { +func (a *multiSig) msigApproveOrCancelTxnHash(ctx context.Context, operation MsigProposeResponse, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) { if msig == address.Undef { return nil, xerrors.Errorf("must provide multisig address") } @@ -292,7 +290,7 @@ func (a *multiSig) msigApproveOrCancelTxnHash(ctx context.Context, operation Msi return nil, err } - var msg *types2.Message + var msg *types.Message switch operation { case MsigApprove: msg, err = mb.Approve(msig, txID, &p) @@ -305,8 +303,8 @@ func (a *multiSig) msigApproveOrCancelTxnHash(ctx context.Context, operation Msi return nil, err } - return &apitypes.MessagePrototype{ - Message: types.UnsignedMessage(*msg), + return &messagepool.MessagePrototype{ + Message: *msg, ValidNonce: false, }, nil } diff --git a/app/submodule/multisig/v0api/multisig_v0api.go b/app/submodule/multisig/v0api/multisig_v0api.go index c2cc2158f5..8d9c2328b3 100644 --- a/app/submodule/multisig/v0api/multisig_v0api.go +++ b/app/submodule/multisig/v0api/multisig_v0api.go @@ -2,13 +2,14 @@ package v0api import ( "context" + "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/app/client/apiface/v0api" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/venus-shared/messagepool" "github.com/ipfs/go-cid" "golang.org/x/xerrors" ) @@ -20,7 +21,7 @@ type WrapperV1IMultiSig struct { var _ v0api.IMultiSig = (*WrapperV1IMultiSig)(nil) -func (a *WrapperV1IMultiSig) executePrototype(ctx context.Context, p *apitypes.MessagePrototype) (cid.Cid, error) { +func (a *WrapperV1IMultiSig) executePrototype(ctx context.Context, p *messagepool.MessagePrototype) (cid.Cid, error) { sm, err := a.IMessagePool.MpoolPushMessage(ctx, &p.Message, nil) if err != nil { return cid.Undef, xerrors.Errorf("pushing message: %w", err) diff --git a/app/submodule/network/network_api.go b/app/submodule/network/network_api.go index 4aa7c56f45..45969f4242 100644 --- a/app/submodule/network/network_api.go +++ b/app/submodule/network/network_api.go @@ -2,15 +2,17 @@ package network import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/net" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" + + "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/pkg/constants" + "github.com/filecoin-project/venus/pkg/net" + "github.com/filecoin-project/venus/venus-shared/api" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" ) var _ apiface.INetwork = &networkAPI{} @@ -62,7 +64,7 @@ func (na *networkAPI) NetworkPeers(ctx context.Context, verbose, latency, stream func (na *networkAPI) Version(context.Context) (apitypes.Version, error) { return apitypes.Version{ Version: constants.UserVersion(), - APIVersion: constants.FullAPIVersion1, + APIVersion: api.Version(constants.FullAPIVersion1), }, nil } diff --git a/app/submodule/network/network_submodule.go b/app/submodule/network/network_submodule.go index 9ba8cc629c..ce285ab6b8 100644 --- a/app/submodule/network/network_submodule.go +++ b/app/submodule/network/network_submodule.go @@ -14,8 +14,8 @@ import ( dtnet "github.com/filecoin-project/go-data-transfer/network" dtgstransport "github.com/filecoin-project/go-data-transfer/transport/graphsync" "github.com/filecoin-project/venus/pkg/repo" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + types "github.com/filecoin-project/venus/venus-shared/chain" blocks "github.com/ipfs/go-block-format" bserv "github.com/ipfs/go-blockservice" "github.com/ipfs/go-datastore" @@ -255,10 +255,10 @@ func (networkSubmodule *NetworkSubmodule) FetchMessagesByCids( ctx context.Context, service bserv.BlockService, cids []cid.Cid, -) ([]*types.UnsignedMessage, error) { - out := make([]*types.UnsignedMessage, len(cids)) +) ([]*types.Message, error) { + out := make([]*types.Message, len(cids)) err := networkSubmodule.fetchCids(ctx, service, cids, func(idx int, blk blocks.Block) error { - var msg types.UnsignedMessage + var msg types.Message if err := msg.UnmarshalCBOR(bytes.NewReader(blk.RawData())); err != nil { return err } diff --git a/app/submodule/network/v0api/v1_wrapper.go b/app/submodule/network/v0api/v1_wrapper.go index 1c8daa13d4..2fff6daec9 100644 --- a/app/submodule/network/v0api/v1_wrapper.go +++ b/app/submodule/network/v0api/v1_wrapper.go @@ -2,10 +2,11 @@ package v0api import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/submodule/apitypes" + "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/pkg/constants" + "github.com/filecoin-project/venus/venus-shared/api" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" ) type WrapperV1INetwork struct { @@ -18,7 +19,7 @@ func (w *WrapperV1INetwork) Version(ctx context.Context) (apitypes.Version, erro return apitypes.Version{}, err } - ver.APIVersion = constants.FullAPIVersion0 + ver.APIVersion = api.Version(constants.FullAPIVersion0) return ver, nil } diff --git a/app/submodule/paych/paych_api.go b/app/submodule/paych/paych_api.go index 2a88d1da11..cbc4e4ae99 100644 --- a/app/submodule/paych/paych_api.go +++ b/app/submodule/paych/paych_api.go @@ -10,9 +10,8 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/specs-actors/actors/builtin/paych" - "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/paychmgr" - "github.com/filecoin-project/venus/pkg/types" + paychtypes "github.com/filecoin-project/venus/venus-shared/paych" ) type PaychAPI struct { @@ -23,15 +22,13 @@ func NewPaychAPI(p *paychmgr.Manager) *PaychAPI { return &PaychAPI{p} } -type PaychStatus = types.PaychStatus //nolint - -func (a *PaychAPI) PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*apitypes.ChannelInfo, error) { +func (a *PaychAPI) PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*paychtypes.ChannelInfo, error) { ch, mcid, err := a.paychMgr.GetPaych(ctx, from, to, amt) if err != nil { return nil, err } - return &apitypes.ChannelInfo{ + return &paychtypes.ChannelInfo{ Channel: ch, WaitSentinel: mcid, }, nil @@ -53,7 +50,7 @@ func (a *PaychAPI) PaychAllocateLane(ctx context.Context, ch address.Address) (u return a.paychMgr.AllocateLane(ch) } -func (a *PaychAPI) PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []apitypes.VoucherSpec) (*apitypes.PaymentInfo, error) { +func (a *PaychAPI) PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []paychtypes.VoucherSpec) (*paychtypes.PaymentInfo, error) { amount := vouchers[len(vouchers)-1].Amount // TODO: Fix free fund tracking in PaychGet @@ -90,7 +87,7 @@ func (a *PaychAPI) PaychNewPayment(ctx context.Context, from, to address.Address svs[i] = sv.Voucher } - return &apitypes.PaymentInfo{ + return &paychtypes.PaymentInfo{ Channel: ch.Channel, WaitSentinel: ch.WaitSentinel, Vouchers: svs, @@ -101,14 +98,14 @@ func (a *PaychAPI) PaychList(ctx context.Context) ([]address.Address, error) { return a.paychMgr.ListChannels() } -func (a *PaychAPI) PaychStatus(ctx context.Context, pch address.Address) (*types.PaychStatus, error) { +func (a *PaychAPI) PaychStatus(ctx context.Context, pch address.Address) (*paychtypes.Status, error) { ci, err := a.paychMgr.GetChannelInfo(pch) if err != nil { return nil, err } - return &types.PaychStatus{ + return &paychtypes.Status{ ControlAddr: ci.Control, - Direction: types.PCHDir(ci.Direction), + Direction: paychtypes.PCHDir(ci.Direction), }, nil } diff --git a/app/submodule/syncer/chain_sync.go b/app/submodule/syncer/chain_sync.go index 63a99c5c5d..6d540f67f1 100644 --- a/app/submodule/syncer/chain_sync.go +++ b/app/submodule/syncer/chain_sync.go @@ -1,9 +1,10 @@ package syncer import ( - "github.com/filecoin-project/venus/pkg/chainsync" - "github.com/filecoin-project/venus/pkg/types" "time" + + "github.com/filecoin-project/venus/pkg/chainsync" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type chainSync interface { diff --git a/app/submodule/syncer/syncer_api.go b/app/submodule/syncer/syncer_api.go index 8290ee79b1..c972e6cf0a 100644 --- a/app/submodule/syncer/syncer_api.go +++ b/app/submodule/syncer/syncer_api.go @@ -2,14 +2,15 @@ package syncer import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" "time" - "github.com/filecoin-project/venus/app/submodule/apitypes" + "github.com/filecoin-project/venus/app/client/apiface" syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" + stmgrtypes "github.com/filecoin-project/venus/venus-shared/stmgr" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/pkg/types" logging "github.com/ipfs/go-log/v2" xerrors "github.com/pkg/errors" ) @@ -57,7 +58,7 @@ func (sa *syncerAPI) ChainSyncHandleNewTipSet(ctx context.Context, ci *types.Cha func (sa *syncerAPI) SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error { //todo many dot. how to get directly chainModule := sa.syncer.ChainModule - parent, err := chainModule.ChainReader.GetBlock(ctx, blk.Header.Parents.Cids()[0]) + parent, err := chainModule.ChainReader.GetBlock(ctx, blk.Header.Parents[0]) if err != nil { return xerrors.Errorf("loading parent block: %v", err) } @@ -87,7 +88,7 @@ func (sa *syncerAPI) SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) e return xerrors.Errorf("provided messages did not match block: %v", err) } - ts, err := types.NewTipSet(blk.Header) + ts, err := types.NewTipSet([]*types.BlockHeader{blk.Header}) if err != nil { return xerrors.Errorf("somehow failed to make a tipset out of a single block: %v", err) } @@ -124,7 +125,7 @@ func (sa *syncerAPI) SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) e // StateCall applies the message to the tipset's parent state. The // message is not applied on-top-of the messages in the passed-in // tipset. -func (sa *syncerAPI) StateCall(ctx context.Context, msg *types.UnsignedMessage, tsk types.TipSetKey) (*types.InvocResult, error) { +func (sa *syncerAPI) StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*apitypes.InvocResult, error) { start := time.Now() ts, err := sa.syncer.ChainModule.ChainReader.GetTipSet(tsk) if err != nil { @@ -137,11 +138,11 @@ func (sa *syncerAPI) StateCall(ctx context.Context, msg *types.UnsignedMessage, duration := time.Since(start) mcid := msg.Cid() - return &types.InvocResult{ + return &apitypes.InvocResult{ MsgCid: mcid, Msg: msg, MsgRct: &ret.Receipt, - ExecutionTrace: &types.ExecutionTrace{}, + ExecutionTrace: stmgrtypes.ExecutionTrace{}, Duration: duration, }, nil } diff --git a/app/submodule/syncer/syncer_submodule.go b/app/submodule/syncer/syncer_submodule.go index 9239ce6d9b..d73f1fc9b9 100644 --- a/app/submodule/syncer/syncer_submodule.go +++ b/app/submodule/syncer/syncer_submodule.go @@ -33,8 +33,8 @@ import ( "github.com/filecoin-project/venus/pkg/net/pubsub" "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/state" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/vm/gas" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-blockservice" ) @@ -232,7 +232,7 @@ func (syncer *SyncerSubmodule) handleIncomingBlocks(ctx context.Context, msg pub syncer.NetworkModule.Host.ConnManager().TagPeer(sender, "new-block", 20) log.Infof("fetch message success at %s", bm.Header.Cid()) - ts, _ := types.NewTipSet(header) + ts, _ := types.NewTipSet([]*types.BlockHeader{header}) chainInfo := types.NewChainInfo(source, sender, ts) if err = syncer.ChainSyncManager.BlockProposer().SendGossipBlock(chainInfo); err != nil { diff --git a/app/submodule/wallet/remotewallet/api.go b/app/submodule/wallet/remotewallet/api.go index dd11bad02d..88fc65a8aa 100644 --- a/app/submodule/wallet/remotewallet/api.go +++ b/app/submodule/wallet/remotewallet/api.go @@ -10,15 +10,16 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/venus/pkg/wallet" + types "github.com/filecoin-project/venus/venus-shared/wallet" ) type IWallet interface { - WalletNew(context.Context, wallet.KeyType) (address.Address, error) + WalletNew(context.Context, types.KeyType) (address.Address, error) WalletHas(ctx context.Context, address address.Address) (bool, error) WalletList(ctx context.Context) ([]address.Address, error) - WalletSign(ctx context.Context, signer address.Address, toSign []byte, meta wallet.MsgMeta) (*wallet.Signature, error) - WalletExport(ctx context.Context, addr address.Address) (*wallet.KeyInfo, error) - WalletImport(context.Context, *wallet.KeyInfo) (address.Address, error) + WalletSign(ctx context.Context, signer address.Address, toSign []byte, meta types.MsgMeta) (*wallet.Signature, error) + WalletExport(ctx context.Context, addr address.Address) (*types.KeyInfo, error) + WalletImport(context.Context, *types.KeyInfo) (address.Address, error) WalletDelete(context.Context, address.Address) error } @@ -27,17 +28,17 @@ var _ IWallet = &WalletAPIAdapter{} // wallet API permissions constraints type WalletAPIAdapter struct { Internal struct { - WalletNew func(ctx context.Context, kt wallet.KeyType) (address.Address, error) `perm:"admin"` - WalletHas func(ctx context.Context, address address.Address) (bool, error) `perm:"write"` - WalletList func(ctx context.Context) ([]address.Address, error) `perm:"write"` - WalletSign func(ctx context.Context, signer address.Address, toSign []byte, meta wallet.MsgMeta) (*wallet.Signature, error) `perm:"sign"` - WalletExport func(ctx context.Context, addr address.Address) (*wallet.KeyInfo, error) `perm:"admin"` - WalletImport func(ctx context.Context, ki *wallet.KeyInfo) (address.Address, error) `perm:"admin"` - WalletDelete func(ctx context.Context, addr address.Address) error `perm:"admin"` + WalletNew func(ctx context.Context, kt types.KeyType) (address.Address, error) `perm:"admin"` + WalletHas func(ctx context.Context, address address.Address) (bool, error) `perm:"write"` + WalletList func(ctx context.Context) ([]address.Address, error) `perm:"write"` + WalletSign func(ctx context.Context, signer address.Address, toSign []byte, meta types.MsgMeta) (*wallet.Signature, error) `perm:"sign"` + WalletExport func(ctx context.Context, addr address.Address) (*types.KeyInfo, error) `perm:"admin"` + WalletImport func(ctx context.Context, ki *types.KeyInfo) (address.Address, error) `perm:"admin"` + WalletDelete func(ctx context.Context, addr address.Address) error `perm:"admin"` } } -func (c *WalletAPIAdapter) WalletNew(ctx context.Context, keyType wallet.KeyType) (address.Address, error) { +func (c *WalletAPIAdapter) WalletNew(ctx context.Context, keyType types.KeyType) (address.Address, error) { return c.Internal.WalletNew(ctx, keyType) } @@ -49,15 +50,15 @@ func (c *WalletAPIAdapter) WalletList(ctx context.Context) ([]address.Address, e return c.Internal.WalletList(ctx) } -func (c *WalletAPIAdapter) WalletSign(ctx context.Context, signer address.Address, toSign []byte, meta wallet.MsgMeta) (*wallet.Signature, error) { +func (c *WalletAPIAdapter) WalletSign(ctx context.Context, signer address.Address, toSign []byte, meta types.MsgMeta) (*wallet.Signature, error) { return c.Internal.WalletSign(ctx, signer, toSign, meta) } -func (c *WalletAPIAdapter) WalletExport(ctx context.Context, a address.Address) (*wallet.KeyInfo, error) { +func (c *WalletAPIAdapter) WalletExport(ctx context.Context, a address.Address) (*types.KeyInfo, error) { return c.Internal.WalletExport(ctx, a) } -func (c *WalletAPIAdapter) WalletImport(ctx context.Context, ki *wallet.KeyInfo) (address.Address, error) { +func (c *WalletAPIAdapter) WalletImport(ctx context.Context, ki *types.KeyInfo) (address.Address, error) { return c.Internal.WalletImport(ctx, ki) } diff --git a/app/submodule/wallet/remotewallet/keymap.go b/app/submodule/wallet/remotewallet/keymap.go index 956daad2d5..2d0fd6e521 100644 --- a/app/submodule/wallet/remotewallet/keymap.go +++ b/app/submodule/wallet/remotewallet/keymap.go @@ -4,31 +4,31 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/wallet" + types "github.com/filecoin-project/venus/venus-shared/wallet" ) -var keyMapper = map[address.Protocol]wallet.KeyType{ - address.SECP256K1: wallet.KTSecp256k1, - address.BLS: wallet.KTBLS, +var keyMapper = map[address.Protocol]types.KeyType{ + address.SECP256K1: types.KTSecp256k1, + address.BLS: types.KTBLS, } -func GetKeyType(p address.Protocol) wallet.KeyType { +func GetKeyType(p address.Protocol) types.KeyType { k, ok := keyMapper[p] if ok { return k } - return wallet.KTUnknown + return types.KTUnknown } -func ConvertRemoteKeyInfo(key *crypto.KeyInfo) *wallet.KeyInfo { - return &wallet.KeyInfo{ +func ConvertRemoteKeyInfo(key *crypto.KeyInfo) *types.KeyInfo { + return &types.KeyInfo{ PrivateKey: key.Key(), - Type: wallet.SignType2Key(key.SigType), + Type: types.SignType2Key(key.SigType), } } -func ConvertLocalKeyInfo(key *wallet.KeyInfo) *crypto.KeyInfo { +func ConvertLocalKeyInfo(key *types.KeyInfo) *crypto.KeyInfo { ki := &crypto.KeyInfo{ - SigType: wallet.KeyType2Sign(key.Type), + SigType: types.KeyType2Sign(key.Type), } ki.SetPrivateKey(key.PrivateKey) diff --git a/app/submodule/wallet/remotewallet/remote.go b/app/submodule/wallet/remotewallet/remote.go index 4e1b3763a6..87cac4d09f 100644 --- a/app/submodule/wallet/remotewallet/remote.go +++ b/app/submodule/wallet/remotewallet/remote.go @@ -9,6 +9,7 @@ import ( "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/wallet" + types "github.com/filecoin-project/venus/venus-shared/wallet" ) var _ wallet.WalletIntersection = &remoteWallet{} @@ -72,6 +73,6 @@ func (w *remoteWallet) Export(addr address.Address, password string) (*crypto.Ke return ConvertLocalKeyInfo(key), nil } -func (w *remoteWallet) WalletSign(keyAddr address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) { +func (w *remoteWallet) WalletSign(keyAddr address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) { return w.IWallet.WalletSign(context.Background(), keyAddr, msg, meta) } diff --git a/app/submodule/wallet/wallet_api.go b/app/submodule/wallet/wallet_api.go index a9977e0a5e..8ddafaebfe 100644 --- a/app/submodule/wallet/wallet_api.go +++ b/app/submodule/wallet/wallet_api.go @@ -3,14 +3,16 @@ package wallet import ( "context" "errors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/app/client/apiface" "golang.org/x/xerrors" + "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/wallet" + types "github.com/filecoin-project/venus/venus-shared/chain" + wtypes "github.com/filecoin-project/venus/venus-shared/wallet" ) var _ apiface.IWallet = &WalletAPI{} @@ -102,7 +104,7 @@ func (walletAPI *WalletAPI) WalletExport(addr address.Address, password string) } // WalletSign signs the given bytes using the given address. -func (walletAPI *WalletAPI) WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) { +func (walletAPI *WalletAPI) WalletSign(ctx context.Context, k address.Address, msg []byte, meta wtypes.MsgMeta) (*crypto.Signature, error) { keyAddr, err := walletAPI.walletModule.Chain.Stmgr.ResolveToKeyAddress(ctx, k, nil) if err != nil { return nil, xerrors.Errorf("ResolveTokeyAddress failed:%v", err) @@ -111,13 +113,13 @@ func (walletAPI *WalletAPI) WalletSign(ctx context.Context, k address.Address, m } // WalletSignMessage signs the given message using the given address. -func (walletAPI *WalletAPI) WalletSignMessage(ctx context.Context, k address.Address, msg *types.UnsignedMessage) (*types.SignedMessage, error) { +func (walletAPI *WalletAPI) WalletSignMessage(ctx context.Context, k address.Address, msg *types.Message) (*types.SignedMessage, error) { mb, err := msg.ToStorageBlock() if err != nil { return nil, xerrors.Errorf("serializing message: %w", err) } - sign, err := walletAPI.WalletSign(ctx, k, mb.Cid().Bytes(), wallet.MsgMeta{Type: wallet.MTChainMsg}) + sign, err := walletAPI.WalletSign(ctx, k, mb.Cid().Bytes(), wtypes.MsgMeta{Type: wtypes.MTChainMsg}) if err != nil { return nil, xerrors.Errorf("failed to sign message: %w", err) } diff --git a/app/submodule/wallet/wallet_submodule.go b/app/submodule/wallet/wallet_submodule.go index 4a9db98be6..32ede1f173 100644 --- a/app/submodule/wallet/wallet_submodule.go +++ b/app/submodule/wallet/wallet_submodule.go @@ -15,8 +15,8 @@ import ( pconfig "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/state" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/wallet" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var log = logging.Logger("wallet") diff --git a/cmd/address.go b/cmd/address.go index 58b86915d3..57265ff237 100644 --- a/cmd/address.go +++ b/cmd/address.go @@ -19,8 +19,8 @@ import ( "github.com/filecoin-project/venus/app/node" "github.com/filecoin-project/venus/cmd/tablewriter" "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/wallet" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var errMissPassword = errors.New("the wallet is missing password, please use command `venus wallet set-password` to set password") diff --git a/cmd/chain.go b/cmd/chain.go index fbf9e7e91c..3d40c724fc 100644 --- a/cmd/chain.go +++ b/cmd/chain.go @@ -19,9 +19,9 @@ import ( "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/app/node" - "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var chainCmd = &cmds.Command{ @@ -213,7 +213,7 @@ var chainGetBlockCmd = &cmds.Command{ cblock := struct { types.BlockHeader - BlsMessages []*types.UnsignedMessage + BlsMessages []*types.Message SecpkMessages []*types.SignedMessage ParentReceipts []*types.MessageReceipt ParentMessages []cid.Cid @@ -256,7 +256,7 @@ var chainGetMessageCmd = &cmds.Command{ return re.Emit(msg) }, - Type: types.UnsignedMessage{}, + Type: types.Message{}, } var chainGetMessagesCmd = &cmds.Command{ diff --git a/cmd/daemon.go b/cmd/daemon.go index 7f9183d10b..1ff055760a 100644 --- a/cmd/daemon.go +++ b/cmd/daemon.go @@ -5,14 +5,16 @@ import ( "context" "encoding/json" "fmt" - "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/util/ulimit" "io" "io/ioutil" "net/http" "net/url" "os" + "github.com/filecoin-project/venus/pkg/constants" + "github.com/filecoin-project/venus/pkg/util/ulimit" + types "github.com/filecoin-project/venus/venus-shared/chain" + paramfetch "github.com/filecoin-project/go-paramfetch" "github.com/filecoin-project/venus/fixtures/asset" @@ -35,7 +37,6 @@ import ( "github.com/filecoin-project/venus/pkg/journal" "github.com/filecoin-project/venus/pkg/migration" "github.com/filecoin-project/venus/pkg/repo" - "github.com/filecoin-project/venus/pkg/types" gengen "github.com/filecoin-project/venus/tools/gengen/util" ) diff --git a/cmd/dag_integration_test.go b/cmd/dag_integration_test.go index f396023a5f..1fda6df796 100644 --- a/cmd/dag_integration_test.go +++ b/cmd/dag_integration_test.go @@ -3,7 +3,6 @@ package cmd_test import ( "bytes" "context" - "github.com/filecoin-project/venus/pkg/types" "testing" cbor "github.com/ipfs/go-ipld-cbor" @@ -12,6 +11,7 @@ import ( "github.com/filecoin-project/venus/app/node/test" "github.com/filecoin-project/venus/pkg/constants" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + types "github.com/filecoin-project/venus/venus-shared/chain" ) func TestDagDaemon(t *testing.T) { diff --git a/cmd/dispute.go b/cmd/dispute.go index 313a8f490b..4a29788361 100644 --- a/cmd/dispute.go +++ b/cmd/dispute.go @@ -7,9 +7,6 @@ import ( "strconv" "time" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/venus-shared/actors" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" @@ -21,9 +18,12 @@ import ( logging "github.com/ipfs/go-log/v2" + "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/app/node" chainpkg "github.com/filecoin-project/venus/pkg/chain" - "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/venus-shared/actors" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var disputeLog = logging.Logger("disputer") @@ -414,13 +414,13 @@ func getSender(ctx context.Context, api apiface.IWallet, fromStr string) (addres return addr, nil } -func getMaxFee(maxStr string) (*types.MessageSendSpec, error) { +func getMaxFee(maxStr string) (*apitypes.MessageSendSpec, error) { if maxStr != "" { maxFee, err := types.ParseFIL(maxStr) if err != nil { return nil, xerrors.Errorf("parsing max-fee: %w", err) } - return &types.MessageSendSpec{ + return &apitypes.MessageSendSpec{ MaxFee: types.BigInt(maxFee), }, nil } diff --git a/cmd/main.go b/cmd/main.go index d5f3a36fae..fd71c614de 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -19,7 +19,7 @@ import ( "github.com/filecoin-project/venus/app/node" "github.com/filecoin-project/venus/app/paths" "github.com/filecoin-project/venus/pkg/repo" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) const ( @@ -392,24 +392,25 @@ var limitOption = cmds.Int64Option("gas-limit", "Maximum GasUnits this message i func parseGasOptions(req *cmds.Request) (fbig.Int, fbig.Int, int64, error) { var ( - feecap = types.ZeroFIL - premium = types.ZeroFIL + feecap = types.FIL{Int: types.NewInt(0).Int} + premium = types.FIL{Int: types.NewInt(0).Int} ok = false gasLimitInt = int64(0) ) + var err error feecapOption := req.Options["gas-feecap"] if feecapOption != nil { - feecap, ok = types.NewAttoFILFromString(feecapOption.(string), 10) - if !ok { + feecap, err = types.ParseFIL(feecapOption.(string)) + if err != nil { return types.ZeroFIL, types.ZeroFIL, 0, errors.New("invalid gas price (specify FIL as a decimal number)") } } premiumOption := req.Options["gas-premium"] if premiumOption != nil { - premium, ok = types.NewAttoFILFromString(premiumOption.(string), 10) - if !ok { + premium, err = types.ParseFIL(premiumOption.(string)) + if err != nil { return types.ZeroFIL, types.ZeroFIL, 0, errors.New("invalid gas price (specify FIL as a decimal number)") } } @@ -423,5 +424,5 @@ func parseGasOptions(req *cmds.Request) (fbig.Int, fbig.Int, int64, error) { } } - return feecap, premium, gasLimitInt, nil + return fbig.Int{Int: feecap.Int}, fbig.Int{Int: premium.Int}, gasLimitInt, nil } diff --git a/cmd/message.go b/cmd/message.go index 9c31313398..fa3b4b8db4 100644 --- a/cmd/message.go +++ b/cmd/message.go @@ -19,9 +19,9 @@ import ( "github.com/filecoin-project/venus/app/node" "github.com/filecoin-project/venus/pkg/chain" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // MessageSendResult is the return type for message send command @@ -56,9 +56,9 @@ var msgSendCmd = &cmds.Command{ return err } v := req.Arguments[1] - val, ok := types.NewAttoFILFromFILString(v) - if !ok { - return errors.New("mal-formed value") + val, err := types.ParseFIL(v) + if err != nil { + return xerrors.Errorf("mal-formed value: %v", err) } methodID := builtin.MethodSend @@ -103,10 +103,10 @@ var msgSendCmd = &cmds.Command{ params = decparams } - msg := &types.UnsignedMessage{ + msg := &types.Message{ From: fromAddr, To: toAddr, - Value: val, + Value: abi.TokenAmount{Int: val.Int}, GasPremium: premium, GasFeeCap: feecap, GasLimit: gasLimit, @@ -171,7 +171,7 @@ func decodeTypedParams(ctx context.Context, fapi *node.Env, to address.Address, // WaitResult is the result of a message wait call. type WaitResult struct { - Message *types.UnsignedMessage + Message *types.Message Receipt *types.MessageReceipt Signature vm.ActorMethodSignature } diff --git a/cmd/miner.go b/cmd/miner.go index 86bbd259e9..6ee3a9d0c1 100644 --- a/cmd/miner.go +++ b/cmd/miner.go @@ -18,7 +18,6 @@ import ( "github.com/filecoin-project/venus/app/node" "github.com/filecoin-project/venus/app/submodule/chain" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/pkg/wallet" "github.com/filecoin-project/venus/venus-shared/actors" @@ -26,7 +25,8 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" "github.com/filecoin-project/venus/venus-shared/actors/policy" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/chain/params" ) var minerCmdLog = logging.Logger("miner.cmd") @@ -72,7 +72,7 @@ var newMinerCmd = &cmds.Command{ } gp, _ := req.Options["gas-premium"].(string) - gasPrice, err := types.BigFromString(gp) + gasPrice, err := types.ParseFIL(gp) if err != nil { return xerrors.Errorf("failed to parse gas-price flag: %s", err) } @@ -100,7 +100,7 @@ var newMinerCmd = &cmds.Command{ // make sure the worker account exists on chain _, err = env.(*node.Env).ChainAPI.StateLookupID(ctx, worker, types.EmptyTSK) if err != nil { - signed, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.UnsignedMessage{ + signed, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.Message{ From: owner, To: worker, Value: big.NewInt(0), @@ -156,7 +156,7 @@ var newMinerCmd = &cmds.Command{ sender = faddr } - createStorageMinerMsg := &types.UnsignedMessage{ + createStorageMinerMsg := &types.Message{ To: power.Address, From: sender, Value: big.Zero(), @@ -165,7 +165,7 @@ var newMinerCmd = &cmds.Command{ Params: params, GasLimit: 0, - GasPremium: gasPrice, + GasPremium: abi.TokenAmount{Int: gasPrice.Int}, } signed, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, createStorageMinerMsg, nil) @@ -188,7 +188,7 @@ var newMinerCmd = &cmds.Command{ } var retval power2.CreateMinerReturn - if err := retval.UnmarshalCBOR(bytes.NewReader(mw.Receipt.ReturnValue)); err != nil { + if err := retval.UnmarshalCBOR(bytes.NewReader(mw.Receipt.Return)); err != nil { return err } @@ -251,7 +251,7 @@ var minerInfoCmd = &cmds.Command{ } tbs := blockstoreutil.NewTieredBstore(chain.NewAPIBlockstore(blockstoreAPI), blockstoreutil.NewTemporary()) - mas, err := miner.Load(adt.WrapStore(ctx, cbor.NewCborStore(tbs)), (*types2.Actor)(mact)) + mas, err := miner.Load(adt.WrapStore(ctx, cbor.NewCborStore(tbs)), mact) if err != nil { return err } @@ -307,7 +307,7 @@ var minerInfoCmd = &cmds.Command{ if !pow.HasMinPower { writer.Println("Below minimum power threshold, no blocks will be won") } else { - expWinChance := float64(big.Mul(qpercI, big.NewInt(int64(types.BlocksPerEpoch))).Int64()) / 1000000 + expWinChance := float64(big.Mul(qpercI, big.NewInt(int64(params.BlocksPerEpoch))).Int64()) / 1000000 if expWinChance > 0 { if expWinChance > 1 { expWinChance = 1 diff --git a/cmd/miner_actor.go b/cmd/miner_actor.go index 665b3e8a4b..3a5331433a 100644 --- a/cmd/miner_actor.go +++ b/cmd/miner_actor.go @@ -22,11 +22,10 @@ import ( "github.com/filecoin-project/venus/app/node" "github.com/filecoin-project/venus/app/submodule/chain" "github.com/filecoin-project/venus/cmd/tablewriter" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var minerActorCmd = &cmds.Command{ @@ -93,7 +92,7 @@ var actorSetAddrsCmd = &cmds.Command{ gasLimit, _ := req.Options["gas-limit"].(int64) - smsg, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.UnsignedMessage{ + smsg, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.Message{ To: maddr, From: mi.Worker, Value: big.NewInt(0), @@ -145,7 +144,7 @@ var actorSetPeeridCmd = &cmds.Command{ gasLimit, _ := req.Options["gas-limit"].(int64) - smsg, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.UnsignedMessage{ + smsg, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.Message{ To: maddr, From: mi.Worker, Value: big.NewInt(0), @@ -208,7 +207,7 @@ var actorWithdrawCmd = &cmds.Command{ return err } - smsg, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.UnsignedMessage{ + smsg, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.Message{ To: maddr, From: mi.Owner, Value: big.NewInt(0), @@ -240,7 +239,7 @@ var actorWithdrawCmd = &cmds.Command{ if nv >= network.Version14 { var withdrawn abi.TokenAmount - if err := withdrawn.UnmarshalCBOR(bytes.NewReader(wait.Receipt.ReturnValue)); err != nil { + if err := withdrawn.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { return err } @@ -295,7 +294,7 @@ var actorRepayDebtCmd = &cmds.Command{ store := adt.WrapStore(ctx, cbor.NewCborStore(chain.NewAPIBlockstore(env.(*node.Env).BlockStoreAPI))) - mst, err := miner.Load(store, (*types2.Actor)(mact)) + mst, err := miner.Load(store, mact) if err != nil { return err } @@ -327,7 +326,7 @@ var actorRepayDebtCmd = &cmds.Command{ return xerrors.Errorf("sender isn't a controller of miner: %s", fromID) } - smsg, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.UnsignedMessage{ + smsg, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.Message{ To: maddr, From: fromID, Value: amount, @@ -387,7 +386,7 @@ var actorSetOwnerCmd = &cmds.Command{ return xerrors.Errorf("serializing params: %w", err) } - smsg, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.UnsignedMessage{ + smsg, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.Message{ From: mi.Owner, To: maddr, Method: miner.Methods.ChangeOwnerAddress, @@ -413,7 +412,7 @@ var actorSetOwnerCmd = &cmds.Command{ return err } - smsg, err = env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.UnsignedMessage{ + smsg, err = env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.Message{ From: newAddr, To: maddr, Method: miner.Methods.ChangeOwnerAddress, @@ -634,7 +633,7 @@ var actorControlSet = &cmds.Command{ return xerrors.Errorf("serializing params: %w", err) } - smsg, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.UnsignedMessage{ + smsg, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.Message{ From: mi.Owner, To: maddr, Method: miner.Methods.ChangeWorkerAddress, @@ -711,7 +710,7 @@ var actorProposeChangeWorker = &cmds.Command{ return xerrors.Errorf("serializing params: %w", err) } - smsg, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.UnsignedMessage{ + smsg, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.Message{ From: mi.Owner, To: maddr, Method: miner.Methods.ChangeWorkerAddress, @@ -810,7 +809,7 @@ var actorConfirmChangeWorker = &cmds.Command{ return re.Emit("Pass --really-do-it to actually execute this action") } - smsg, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.UnsignedMessage{ + smsg, err := env.(*node.Env).MessagePoolAPI.MpoolPushMessage(ctx, &types.Message{ From: mi.Owner, To: maddr, Method: miner.Methods.ConfirmUpdateWorkerKey, diff --git a/cmd/miner_proving.go b/cmd/miner_proving.go index 5a29e5b709..6e3b44a6ea 100644 --- a/cmd/miner_proving.go +++ b/cmd/miner_proving.go @@ -6,8 +6,6 @@ import ( "strconv" "text/tabwriter" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/go-address" cmds "github.com/ipfs/go-ipfs-cmds" cbor "github.com/ipfs/go-ipld-cbor" @@ -17,7 +15,7 @@ import ( "github.com/filecoin-project/venus/app/submodule/chain" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var minerProvingCmd = &cmds.Command{ @@ -64,7 +62,7 @@ var provingInfoCmd = &cmds.Command{ stor := adt.WrapStore(ctx, cbor.NewCborStore(chain.NewAPIBlockstore(env.(*node.Env).BlockStoreAPI))) - mas, err := miner.Load(stor, (*types2.Actor)(mact)) + mas, err := miner.Load(stor, mact) if err != nil { return err } @@ -325,7 +323,7 @@ var provingFaultsCmd = &cmds.Command{ return err } - mas, err := miner.Load(stor, (*types2.Actor)(mact)) + mas, err := miner.Load(stor, mact) if err != nil { return err } diff --git a/cmd/mpool.go b/cmd/mpool.go index 5af635197f..ac6c00c58d 100644 --- a/cmd/mpool.go +++ b/cmd/mpool.go @@ -20,7 +20,9 @@ import ( "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/messagepool" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" + mptypes "github.com/filecoin-project/venus/venus-shared/messagepool" ) var mpoolCmd = &cmds.Command{ @@ -291,27 +293,16 @@ var mpoolReplaceCmd = &cmds.Command{ msg := found.Message - //msg := types.Message{ - // From: from, - // To: from, - // Method: 2, - // Value: types.FromFil(0), - // Nonce: nonce, - // GasLimit: 100000000, - // GasFeeCap: types.NewInt(100 + 4000000000), - // GasPremium: types.NewInt(5000000000), - //} - if auto { minRBF := messagepool.ComputeMinRBF(msg.GasPremium) - var mss *types.MessageSendSpec + var mss *apitypes.MessageSendSpec if len(maxFee) > 0 { maxFee, err := big.FromString(maxFee) if err != nil { return fmt.Errorf("parsing max-spend: %w", err) } - mss = &types.MessageSendSpec{ + mss = &apitypes.MessageSendSpec{ MaxFee: maxFee, } } @@ -656,7 +647,7 @@ var mpoolConfig = &cmds.Command{ ctx := context.TODO() if len(req.Arguments) > 0 { - cfg := new(messagepool.MpoolConfig) + cfg := new(mptypes.MpoolConfig) paras := req.Arguments[0] err := json.Unmarshal([]byte(paras), cfg) diff --git a/cmd/multisig.go b/cmd/multisig.go index ac5ad84851..31575ff8c6 100644 --- a/cmd/multisig.go +++ b/cmd/multisig.go @@ -20,12 +20,11 @@ import ( sbchain "github.com/filecoin-project/venus/app/submodule/chain" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/actors/builtin/multisig" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" cmds "github.com/ipfs/go-ipfs-cmds" cbor "github.com/ipfs/go-ipld-cbor" @@ -133,7 +132,7 @@ var msigCreateCmd = &cmds.Command{ } // get address of newly created miner var execreturn init2.ExecReturn - if err := execreturn.UnmarshalCBOR(bytes.NewReader(wait.Receipt.ReturnValue)); err != nil { + if err := execreturn.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { return err } // TODO: maybe register this somewhere @@ -178,7 +177,7 @@ var msigInspectCmd = &cmds.Command{ if err != nil { return err } - mstate, err := multisig.Load(store, (*types2.Actor)(act)) + mstate, err := multisig.Load(store, act) if err != nil { return err } @@ -383,7 +382,7 @@ var msigProposeCmd = &cmds.Command{ } var retval msig2.ProposeReturn - if err := retval.UnmarshalCBOR(bytes.NewReader(wait.Receipt.ReturnValue)); err != nil { + if err := retval.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { return fmt.Errorf("failed to unmarshal propose return value: %w", err) } fmt.Fprintf(buf, "Transaction ID: %d\n", retval.TxnID) @@ -447,7 +446,7 @@ var msigRemoveProposeCmd = &cmds.Command{ } var ret multisig.ProposeReturn - err = ret.UnmarshalCBOR(bytes.NewReader(wait.Receipt.ReturnValue)) + err = ret.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)) if err != nil { return xerrors.Errorf("decoding proposal return: %w", err) } @@ -613,7 +612,7 @@ var msigAddProposeCmd = &cmds.Command{ } var ret multisig.ProposeReturn - err = ret.UnmarshalCBOR(bytes.NewReader(wait.Receipt.ReturnValue)) + err = ret.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)) if err != nil { return xerrors.Errorf("decoding proposal return: %w", err) } @@ -805,7 +804,7 @@ var msigSwapProposeCmd = &cmds.Command{ return fmt.Errorf("swap proposal returned exit %d", wait.Receipt.ExitCode) } var ret multisig.ProposeReturn - err = ret.UnmarshalCBOR(bytes.NewReader(wait.Receipt.ReturnValue)) + err = ret.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)) if err != nil { return xerrors.Errorf("decoding proposal return: %w", err) } @@ -1010,7 +1009,7 @@ var msigLockProposeCmd = &cmds.Command{ return fmt.Errorf("lock proposal returned exit %d", wait.Receipt.ExitCode) } var ret multisig.ProposeReturn - err = ret.UnmarshalCBOR(bytes.NewReader(wait.Receipt.ReturnValue)) + err = ret.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)) if err != nil { return xerrors.Errorf("decoding proposal return: %w", err) } @@ -1289,7 +1288,7 @@ var msigProposeThresholdCmd = &cmds.Command{ return fmt.Errorf("change threshold proposal returned exit %d", wait.Receipt.ExitCode) } var ret multisig.ProposeReturn - err = ret.UnmarshalCBOR(bytes.NewReader(wait.Receipt.ReturnValue)) + err = ret.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)) if err != nil { return xerrors.Errorf("decoding proposal return: %w", err) } diff --git a/cmd/paych.go b/cmd/paych.go index ea5699a620..d434beda7c 100644 --- a/cmd/paych.go +++ b/cmd/paych.go @@ -14,8 +14,8 @@ import ( "github.com/filecoin-project/venus/app/node" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/paychmgr" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" + types "github.com/filecoin-project/venus/venus-shared/chain" cmds "github.com/ipfs/go-ipfs-cmds" "golang.org/x/xerrors" ) diff --git a/cmd/protocol.go b/cmd/protocol.go index 2a6b90ac94..6237999d95 100644 --- a/cmd/protocol.go +++ b/cmd/protocol.go @@ -2,7 +2,7 @@ package cmd import ( "github.com/filecoin-project/venus/app/node" - "github.com/filecoin-project/venus/app/submodule/apitypes" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" cmds "github.com/ipfs/go-ipfs-cmds" ) diff --git a/cmd/seed.go b/cmd/seed.go index 1539631bc9..f9c6dbde32 100644 --- a/cmd/seed.go +++ b/cmd/seed.go @@ -25,9 +25,9 @@ import ( "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/gen" "github.com/filecoin-project/venus/pkg/gen/genesis" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/tools/seed" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var seedCmd = &cmds.Command{ diff --git a/cmd/show.go b/cmd/show.go index f9673777f8..b1059ae75c 100644 --- a/cmd/show.go +++ b/cmd/show.go @@ -2,7 +2,7 @@ package cmd import ( "github.com/filecoin-project/venus/app/node" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" cmds "github.com/ipfs/go-ipfs-cmds" diff --git a/cmd/show_test.go b/cmd/show_test.go index 121d45e697..e4f82f5ad3 100644 --- a/cmd/show_test.go +++ b/cmd/show_test.go @@ -3,10 +3,15 @@ package cmd_test import ( "context" "encoding/json" + "testing" + + "github.com/filecoin-project/venus/pkg/testhelpers" + + "github.com/ipfs/go-cid" + "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/venus/pkg/crypto" - emptycid "github.com/filecoin-project/venus/pkg/testhelpers/empty_cid" - "testing" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -14,7 +19,6 @@ import ( "github.com/filecoin-project/venus/app/node/test" "github.com/filecoin-project/venus/fixtures/fortest" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" ) // Receipt is what is returned by executing a message on the vm. @@ -134,7 +138,7 @@ func TestBlockDaemon(t *testing.T) { _, err := mockBlock(t) require.NoError(t, err) - emptyMessagesLine := cmdClient.RunSuccessFirstLine(ctx, "show", "messages", emptycid.EmptyMessagesCID.String(), "--enc", "json") + emptyMessagesLine := cmdClient.RunSuccessFirstLine(ctx, "show", "messages", testhelpers.EmptyMessagesCID.String(), "--enc", "json") var messageCollection []*types.SignedMessage require.NoError(t, json.Unmarshal([]byte(emptyMessagesLine), &messageCollection)) @@ -154,7 +158,7 @@ func TestBlockDaemon(t *testing.T) { _, err := mockBlock(t) require.NoError(t, err) - emptyReceiptsLine := cmdClient.RunSuccessFirstLine(ctx, "show", "receipts", emptycid.EmptyReceiptsCID.String(), "--enc", "json") + emptyReceiptsLine := cmdClient.RunSuccessFirstLine(ctx, "show", "receipts", testhelpers.EmptyReceiptsCID.String(), "--enc", "json") var receipts []Receipt require.NoError(t, json.Unmarshal([]byte(emptyReceiptsLine), &receipts)) @@ -228,21 +232,21 @@ func TestBlockDaemon(t *testing.T) { func mockBlock(t *testing.T) (*types.BlockHeader, error) { b := &types.BlockHeader{ - Miner: types.NewForTestGetter()(), - Ticket: types.Ticket{VRFProof: []byte{0x01, 0x02, 0x03}}, + Miner: testhelpers.NewForTestGetter()(), + Ticket: &types.Ticket{VRFProof: []byte{0x01, 0x02, 0x03}}, ElectionProof: &types.ElectionProof{VRFProof: []byte{0x0a, 0x0b}}, Height: 2, - BeaconEntries: []*types.BeaconEntry{ + BeaconEntries: []types.BeaconEntry{ { Round: 1, Data: []byte{0x3}, }, }, - Messages: types.CidFromString(t, "somecid"), - ParentMessageReceipts: types.CidFromString(t, "somecid"), - Parents: types.NewTipSetKey(types.CidFromString(t, "somecid")), + Messages: testhelpers.CidFromString(t, "somecid"), + ParentMessageReceipts: testhelpers.CidFromString(t, "somecid"), + Parents: []cid.Cid{testhelpers.CidFromString(t, "somecid")}, ParentWeight: big.NewInt(1000), - ParentStateRoot: types.CidFromString(t, "somecid"), + ParentStateRoot: testhelpers.CidFromString(t, "somecid"), Timestamp: 1, BlockSig: &crypto.Signature{ Type: crypto.SigTypeBLS, diff --git a/cmd/state.go b/cmd/state.go index c890155a9d..acfa3e39e3 100644 --- a/cmd/state.go +++ b/cmd/state.go @@ -19,10 +19,10 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/app/node" - "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/builtin" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // ActorView represents a generic way to represent details about any actor to the user. @@ -113,7 +113,7 @@ var stateSearchMsgCmd = &cmds.Command{ writer.Printf("message was executed in tipset: %s", mw.TipSet.Cids()) writer.Printf("\nExit Code: %d", mw.Receipt.ExitCode) writer.Printf("\nGas Used: %d", mw.Receipt.GasUsed) - writer.Printf("\nReturn: %x", mw.Receipt.ReturnValue) + writer.Printf("\nReturn: %x", mw.Receipt.Return) } else { writer.Print("message was not found on chain") } diff --git a/go.mod b/go.mod index 64c0f31fc6..527011cd76 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543 github.com/filecoin-project/go-paramfetch v0.0.2 - github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379 + github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-statestore v0.1.1 // indirect github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.5 diff --git a/go.sum b/go.sum index b7c230a2ec..e8b200f6d1 100644 --- a/go.sum +++ b/go.sum @@ -336,10 +336,10 @@ github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379 h1:UmKkt13NrtulubqfNXhG7SQ7Pjza8BeKdNBxngqAo64= github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= +github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe h1:dF8u+LEWeIcTcfUcCf3WFVlc81Fr2JKg8zPzIbBDKDw= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= @@ -358,11 +358,13 @@ github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008 github.com/filecoin-project/specs-actors/v4 v4.0.0/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= github.com/filecoin-project/specs-actors/v4 v4.0.1 h1:AiWrtvJZ63MHGe6rn7tPu4nSUY8bA1KDNszqJaD5+Fg= github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= -github.com/filecoin-project/specs-actors/v5 v5.0.0-20210512015452-4fe3889fff57/go.mod h1:283yBMMUSDB2abcjP/hhrwTkhb9h3sfM6KGrep/ZlBI= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= +github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9 h1:H10WnEAJQH3JwHyaHwMEgaaj00z+/QMCb9Sjd/SUW1w= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= diff --git a/pkg/beacon/beacon.go b/pkg/beacon/beacon.go index e9e6783641..7b0b6df551 100644 --- a/pkg/beacon/beacon.go +++ b/pkg/beacon/beacon.go @@ -2,10 +2,10 @@ package beacon import ( "context" - "github.com/filecoin-project/venus/pkg/types" "time" "github.com/filecoin-project/go-state-types/abi" + types "github.com/filecoin-project/venus/venus-shared/chain" logging "github.com/ipfs/go-log" "golang.org/x/xerrors" ) @@ -43,7 +43,7 @@ func ValidateBlockValues(bSchedule Schedule, h *types.BlockHeader, parentEpoch a if len(h.BeaconEntries) != 2 { return xerrors.Errorf("expected two beacon entries at beacon fork, got %d", len(h.BeaconEntries)) } - err := currBeacon.VerifyEntry(*h.BeaconEntries[1], *h.BeaconEntries[0]) + err := currBeacon.VerifyEntry(h.BeaconEntries[1], h.BeaconEntries[0]) if err != nil { return xerrors.Errorf("beacon at fork point invalid: (%v, %v): %w", h.BeaconEntries[1], h.BeaconEntries[0], err) @@ -72,10 +72,11 @@ func ValidateBlockValues(bSchedule Schedule, h *types.BlockHeader, parentEpoch a } for i, e := range h.BeaconEntries { - if err := b.VerifyEntry(*e, *prevEntry); err != nil { + if err := b.VerifyEntry(e, *prevEntry); err != nil { return xerrors.Errorf("beacon entry %d (%d - %x (%d)) was invalid: %w", i, e.Round, e.Data, len(e.Data), err) } - prevEntry = e + prevEntry = &h.BeaconEntries[i] + } return nil diff --git a/pkg/beacon/drand.go b/pkg/beacon/drand.go index 5b33d4ef2e..ce28fc08a3 100644 --- a/pkg/beacon/drand.go +++ b/pkg/beacon/drand.go @@ -18,7 +18,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" cfg "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // DrandBeacon connects Lotus with a drand network in order to provide diff --git a/pkg/beacon/mock.go b/pkg/beacon/mock.go index 48d53fe047..4187c1400b 100644 --- a/pkg/beacon/mock.go +++ b/pkg/beacon/mock.go @@ -4,10 +4,10 @@ import ( "bytes" "context" "encoding/binary" - "github.com/filecoin-project/venus/pkg/types" "time" "github.com/filecoin-project/go-state-types/abi" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/minio/blake2b-simd" "golang.org/x/xerrors" ) diff --git a/pkg/chain/chain_index.go b/pkg/chain/chain_index.go index 9d98fa87e8..cbc5d134a7 100644 --- a/pkg/chain/chain_index.go +++ b/pkg/chain/chain_index.go @@ -2,9 +2,9 @@ package chain import ( "context" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/go-state-types/abi" + types "github.com/filecoin-project/venus/venus-shared/chain" lru "github.com/hashicorp/golang-lru" xerrors "github.com/pkg/errors" ) diff --git a/pkg/chain/circulating_supply.go b/pkg/chain/circulating_supply.go index 44e2524bba..cc6a2f62b8 100644 --- a/pkg/chain/circulating_supply.go +++ b/pkg/chain/circulating_supply.go @@ -23,7 +23,6 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" - types "github.com/filecoin-project/venus/venus-shared/chain" ) type ICirculatingSupplyCalcualtor interface { @@ -132,7 +131,7 @@ func (caculator *CirculatingSupplyCalculator) GetCirculatingSupplyDetailed(ctx c /*func (c *Expected) processBlock(ctx context.Context, ts *block.TipSet) (cid.Cid, []types.MessageReceipt, error) { var secpMessages [][]*types.SignedMessage - var blsMessages [][]*types.UnsignedMessage + var blsMessages [][]*types.Message for i := 0; i < ts.Len(); i++ { blk := ts.At(i) secpMsgs, blsMsgs, err := c.messageStore.LoadMetaMessages(ctx, blk.Messages.Cid) @@ -371,7 +370,7 @@ func GetFilMined(ctx context.Context, st tree.Tree) (abi.TokenAmount, error) { return big.Zero(), xerrors.Errorf("failed to load reward actor state: %v", err) } - rst, err := reward.Load(adt.WrapStore(ctx, st.GetStore()), (*types.Actor)(ractor)) + rst, err := reward.Load(adt.WrapStore(ctx, st.GetStore()), ractor) if err != nil { return big.Zero(), err } @@ -411,7 +410,7 @@ func getFilMarketLocked(ctx context.Context, st tree.Tree) (abi.TokenAmount, err return big.Zero(), xerrors.Errorf("failed to load market actor: %v", err) } - mst, err := market.Load(adt.WrapStore(ctx, st.GetStore()), (*types.Actor)(act)) + mst, err := market.Load(adt.WrapStore(ctx, st.GetStore()), act) if err != nil { return big.Zero(), xerrors.Errorf("failed to load market state: %v", err) } @@ -425,7 +424,7 @@ func getFilPowerLocked(ctx context.Context, st tree.Tree) (abi.TokenAmount, erro return big.Zero(), xerrors.Errorf("failed to load power actor: %v", err) } - pst, err := power.Load(adt.WrapStore(ctx, st.GetStore()), (*types.Actor)(pactor)) + pst, err := power.Load(adt.WrapStore(ctx, st.GetStore()), pactor) if err != nil { return big.Zero(), xerrors.Errorf("failed to load power state: %v", err) } diff --git a/pkg/chain/coalescer.go b/pkg/chain/coalescer.go index fac77f7acb..380b4c6f9a 100644 --- a/pkg/chain/coalescer.go +++ b/pkg/chain/coalescer.go @@ -2,8 +2,9 @@ package chain import ( "context" - "github.com/filecoin-project/venus/pkg/types" "time" + + types "github.com/filecoin-project/venus/venus-shared/chain" ) // WrapHeadChangeCoalescer wraps a ReorgNotifee with a head change coalescer. diff --git a/pkg/chain/coalescer_test.go b/pkg/chain/coalescer_test.go index 48f88ac2cc..6d8f4e72ab 100644 --- a/pkg/chain/coalescer_test.go +++ b/pkg/chain/coalescer_test.go @@ -2,7 +2,6 @@ package chain import ( "fmt" - "github.com/filecoin-project/venus/pkg/types" "testing" "time" @@ -14,6 +13,7 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/crypto" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + types "github.com/filecoin-project/venus/venus-shared/chain" ) func mkAddress(i uint64) address.Address { @@ -54,10 +54,10 @@ func mkBlock(parents *types.TipSet, weightInc int64, ticketNonce uint64) *types. ElectionProof: &types.ElectionProof{ VRFProof: []byte(fmt.Sprintf("====%d=====", ticketNonce)), }, - Ticket: types.Ticket{ + Ticket: &types.Ticket{ VRFProof: []byte(fmt.Sprintf("====%d=====", ticketNonce)), }, - Parents: tsKey, + Parents: tsKey.Cids(), ParentMessageReceipts: c, BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS, Data: []byte("boo! im a signature")}, ParentWeight: weight, @@ -71,7 +71,7 @@ func mkBlock(parents *types.TipSet, weightInc int64, ticketNonce uint64) *types. } func mkTipSet(blks ...*types.BlockHeader) *types.TipSet { - ts, err := types.NewTipSet(blks...) + ts, err := types.NewTipSet(blks) if err != nil { panic(err) } diff --git a/pkg/chain/message_store.go b/pkg/chain/message_store.go index d62ac5b6f9..9e213947d5 100644 --- a/pkg/chain/message_store.go +++ b/pkg/chain/message_store.go @@ -23,28 +23,28 @@ import ( "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // MessageProvider is an interface exposing the load methods of the // MessageStore. type MessageProvider interface { LoadTipSetMessage(ctx context.Context, ts *types.TipSet) ([]types.BlockMessagesInfo, error) - LoadMetaMessages(context.Context, cid.Cid) ([]*types.SignedMessage, []*types.UnsignedMessage, error) + LoadMetaMessages(context.Context, cid.Cid) ([]*types.SignedMessage, []*types.Message, error) ReadMsgMetaCids(ctx context.Context, mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) - LoadUnsignedMessagesFromCids(blsCids []cid.Cid) ([]*types.UnsignedMessage, error) + LoadUnsignedMessagesFromCids(blsCids []cid.Cid) ([]*types.Message, error) LoadSignedMessagesFromCids(secpCids []cid.Cid) ([]*types.SignedMessage, error) LoadReceipts(context.Context, cid.Cid) ([]types.MessageReceipt, error) - LoadTxMeta(context.Context, cid.Cid) (types.TxMeta, error) + LoadTxMeta(context.Context, cid.Cid) (types.MessageRoot, error) } // MessageWriter is an interface exposing the write methods of the // MessageStore. type MessageWriter interface { - StoreMessages(ctx context.Context, secpMessages []*types.SignedMessage, blsMessages []*types.UnsignedMessage) (cid.Cid, error) + StoreMessages(ctx context.Context, secpMessages []*types.SignedMessage, blsMessages []*types.Message) (cid.Cid, error) StoreReceipts(context.Context, []types.MessageReceipt) (cid.Cid, error) - StoreTxMeta(context.Context, types.TxMeta) (cid.Cid, error) + StoreTxMeta(context.Context, types.MessageRoot) (cid.Cid, error) } // MessageStore stores and loads collections of signed messages and receipts. @@ -60,14 +60,14 @@ func NewMessageStore(bs blockstore.Blockstore, fkCfg *config.ForkUpgradeConfig) // LoadMetaMessages loads the signed messages in the collection with cid c from ipld // storage. -func (ms *MessageStore) LoadMetaMessages(ctx context.Context, metaCid cid.Cid) ([]*types.SignedMessage, []*types.UnsignedMessage, error) { +func (ms *MessageStore) LoadMetaMessages(ctx context.Context, metaCid cid.Cid) ([]*types.SignedMessage, []*types.Message, error) { // load txmeta meta, err := ms.LoadTxMeta(ctx, metaCid) if err != nil { return nil, nil, err } - secpCids, err := ms.loadAMTCids(ctx, meta.SecpRoot) + secpCids, err := ms.loadAMTCids(ctx, meta.SecpkRoot) if err != nil { return nil, nil, err } @@ -78,7 +78,7 @@ func (ms *MessageStore) LoadMetaMessages(ctx context.Context, metaCid cid.Cid) ( return nil, nil, err } - blsCids, err := ms.loadAMTCids(ctx, meta.BLSRoot) + blsCids, err := ms.loadAMTCids(ctx, meta.BlsRoot) if err != nil { return nil, nil, err } @@ -99,11 +99,11 @@ func (ms *MessageStore) ReadMsgMetaCids(ctx context.Context, mmc cid.Cid) ([]cid return nil, nil, err } - secpCids, err := ms.loadAMTCids(ctx, meta.SecpRoot) + secpCids, err := ms.loadAMTCids(ctx, meta.SecpkRoot) if err != nil { return nil, nil, err } - blsCids, err := ms.loadAMTCids(ctx, meta.BLSRoot) + blsCids, err := ms.loadAMTCids(ctx, meta.BlsRoot) if err != nil { return nil, nil, err } @@ -126,12 +126,12 @@ func (ms *MessageStore) LoadMessage(mid cid.Cid) (types.ChainMsg, error) { } //LoadUnsignedMessage load unsigned messages in tipset -func (ms *MessageStore) LoadUnsignedMessage(mid cid.Cid) (*types.UnsignedMessage, error) { +func (ms *MessageStore) LoadUnsignedMessage(mid cid.Cid) (*types.Message, error) { messageBlock, err := ms.bs.Get(mid) if err != nil { return nil, errors.Wrapf(err, "failed to get bls message %s", mid) } - message := &types.UnsignedMessage{} + message := &types.Message{} if err := message.UnmarshalCBOR(bytes.NewReader(messageBlock.RawData())); err != nil { return nil, errors.Wrapf(err, "could not decode bls message %s", mid) } @@ -154,8 +154,8 @@ func (ms *MessageStore) LoadSignedMessage(mid cid.Cid) (*types.SignedMessage, er } //LoadUnsignedMessagesFromCids load unsigned messages of cid array -func (ms *MessageStore) LoadUnsignedMessagesFromCids(blsCids []cid.Cid) ([]*types.UnsignedMessage, error) { - blsMsgs := make([]*types.UnsignedMessage, len(blsCids)) +func (ms *MessageStore) LoadUnsignedMessagesFromCids(blsCids []cid.Cid) ([]*types.Message, error) { + blsMsgs := make([]*types.Message, len(blsCids)) for i, c := range blsCids { message, err := ms.LoadUnsignedMessage(c) if err != nil { @@ -181,8 +181,8 @@ func (ms *MessageStore) LoadSignedMessagesFromCids(secpCids []cid.Cid) ([]*types // StoreMessages puts the input signed messages to a collection and then writes // this collection to ipld storage. The cid of the collection is returned. -func (ms *MessageStore) StoreMessages(ctx context.Context, secpMessages []*types.SignedMessage, blsMessages []*types.UnsignedMessage) (cid.Cid, error) { - var ret types.TxMeta +func (ms *MessageStore) StoreMessages(ctx context.Context, secpMessages []*types.SignedMessage, blsMessages []*types.Message) (cid.Cid, error) { + var ret types.MessageRoot var err error // store secp messages @@ -203,7 +203,7 @@ func (ms *MessageStore) StoreMessages(ctx context.Context, secpMessages []*types if err != nil { return cid.Undef, errors.Wrap(err, "could not store secp cids as AMT") } - ret.SecpRoot = secpRaw + ret.SecpkRoot = secpRaw // store bls messages blsMsgArr := adt.MakeEmptyArray(adt.WrapStore(context.TODO(), as)) @@ -222,15 +222,15 @@ func (ms *MessageStore) StoreMessages(ctx context.Context, secpMessages []*types if err != nil { return cid.Undef, errors.Wrap(err, "could not store bls cids as AMT") } - ret.BLSRoot = blsRaw + ret.BlsRoot = blsRaw return ms.StoreTxMeta(ctx, ret) } //load message from tipset NOTICE skip message with the same nonce -func (ms *MessageStore) LoadTipSetMesssages(ctx context.Context, ts *types.TipSet) ([][]*types.SignedMessage, [][]*types.UnsignedMessage, error) { +func (ms *MessageStore) LoadTipSetMesssages(ctx context.Context, ts *types.TipSet) ([][]*types.SignedMessage, [][]*types.Message, error) { var secpMessages [][]*types.SignedMessage - var blsMessages [][]*types.UnsignedMessage + var blsMessages [][]*types.Message applied := make(map[address.Address]uint64) @@ -240,7 +240,7 @@ func (ms *MessageStore) LoadTipSetMesssages(ctx context.Context, ts *types.TipSe return nil, nil, errors.Wrapf(err, "failed to load state tree %s", ts.Blocks()[0].ParentStateRoot.String()) } - selectMsg := func(m *types.UnsignedMessage) (bool, error) { + selectMsg := func(m *types.Message) (bool, error) { var sender address.Address if ts.Height() >= ms.fkCfg.UpgradeHyperdriveHeight { sender, err = st.LookupID(m.From) @@ -273,7 +273,7 @@ func (ms *MessageStore) LoadTipSetMesssages(ctx context.Context, ts *types.TipSe } var blksecpMessages []*types.SignedMessage - var blkblsMessages []*types.UnsignedMessage + var blkblsMessages []*types.Message for _, msg := range blsMsgs { b, err := selectMsg(msg) @@ -373,15 +373,15 @@ func (ms *MessageStore) loadAMTCids(ctx context.Context, c cid.Cid) ([]cid.Cid, } // LoadTxMeta loads the secproot, blsroot data from the message store -func (ms *MessageStore) LoadTxMeta(ctx context.Context, c cid.Cid) (types.TxMeta, error) { +func (ms *MessageStore) LoadTxMeta(ctx context.Context, c cid.Cid) (types.MessageRoot, error) { metaBlock, err := ms.bs.Get(c) if err != nil { - return types.TxMeta{}, errors.Wrapf(err, "failed to get tx meta %s", c) + return types.MessageRoot{}, errors.Wrapf(err, "failed to get tx meta %s", c) } - var meta types.TxMeta + var meta types.MessageRoot if err := meta.UnmarshalCBOR(bytes.NewReader(metaBlock.RawData())); err != nil { - return types.TxMeta{}, errors.Wrapf(err, "could not decode tx meta %s", c) + return types.MessageRoot{}, errors.Wrapf(err, "could not decode tx meta %s", c) } return meta, nil } @@ -397,7 +397,7 @@ func (ms *MessageStore) LoadTipSetMessage(ctx context.Context, ts *types.TipSet) return nil, errors.Errorf("failed to load state tree") } - selectMsg := func(m *types.UnsignedMessage) (bool, error) { + selectMsg := func(m *types.Message) (bool, error) { var sender address.Address if ts.Height() >= ms.fkCfg.UpgradeHyperdriveHeight { sender, err = st.LookupID(m.From) @@ -483,7 +483,7 @@ func (ms *MessageStore) StoreMessage(message types.ChainMsg) (cid.Cid, error) { } // StoreTxMeta writes the secproot, blsroot block to the message store -func (ms *MessageStore) StoreTxMeta(ctx context.Context, meta types.TxMeta) (cid.Cid, error) { +func (ms *MessageStore) StoreTxMeta(ctx context.Context, meta types.MessageRoot) (cid.Cid, error) { return cbor.NewCborStore(ms.bs).Put(ctx, &meta) } @@ -642,9 +642,9 @@ func ComputeMsgMeta(bs blockstore.Blockstore, bmsgCids, smsgCids []cid.Cid) (cid return cid.Undef, err } - mrcid, err := store.Put(store.Context(), &types.TxMeta{ - BLSRoot: bmroot, - SecpRoot: smroot, + mrcid, err := store.Put(store.Context(), &types.MessageRoot{ + BlsRoot: bmroot, + SecpkRoot: smroot, }) if err != nil { return cid.Undef, errors.Wrap(err, "failed to put msgmeta") diff --git a/pkg/chain/message_store_test.go b/pkg/chain/message_store_test.go index 166f7a4bcc..c40a62761b 100644 --- a/pkg/chain/message_store_test.go +++ b/pkg/chain/message_store_test.go @@ -2,7 +2,6 @@ package chain_test import ( "context" - "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "testing" "github.com/ipfs/go-datastore" @@ -11,14 +10,16 @@ import ( "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/config" - "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/pkg/testhelpers" + "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + types "github.com/filecoin-project/venus/venus-shared/chain" ) func TestMessageStoreMessagesHappy(t *testing.T) { testflags.UnitTest(t) ctx := context.Background() - keys := types.MustGenerateKeyInfo(2, 42) - mm := types.NewMessageMaker(t, keys) + keys := testhelpers.MustGenerateKeyInfo(2, 42) + mm := testhelpers.NewMessageMaker(t, keys) alice := mm.Addresses()[0] bob := mm.Addresses()[1] @@ -36,7 +37,7 @@ func TestMessageStoreMessagesHappy(t *testing.T) { bs := blockstore.NewBlockstore(datastore.NewMapDatastore()) ms := chain.NewMessageStore(bs, config.DefaultForkUpgradeParam) - msgsCid, err := ms.StoreMessages(ctx, msgs, []*types.UnsignedMessage{}) + msgsCid, err := ms.StoreMessages(ctx, msgs, []*types.Message{}) assert.NoError(t, err) rtMsgs, _, err := ms.LoadMetaMessages(ctx, msgsCid) @@ -47,7 +48,7 @@ func TestMessageStoreMessagesHappy(t *testing.T) { func TestMessageStoreReceiptsHappy(t *testing.T) { ctx := context.Background() - mr := types.NewReceiptMaker() + mr := testhelpers.NewReceiptMaker() receipts := []types.MessageReceipt{ mr.NewReceipt(), diff --git a/pkg/chain/randomness.go b/pkg/chain/randomness.go index 273b2c7841..b79eb8aa8d 100644 --- a/pkg/chain/randomness.go +++ b/pkg/chain/randomness.go @@ -4,13 +4,14 @@ import ( "bytes" "context" "encoding/binary" + "math/rand" + "github.com/filecoin-project/venus/pkg/beacon" + types "github.com/filecoin-project/venus/venus-shared/chain" "golang.org/x/xerrors" - "math/rand" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/venus/pkg/types" "github.com/minio/blake2b-simd" "github.com/pkg/errors" ) @@ -136,7 +137,6 @@ func (c *ChainRandomnessSource) GetBeaconRandomnessTipset(ctx context.Context, r // in which no blocks were produced (an empty tipset or "null block"). A caller desiring a unique see for each epoch // should blend in some distinguishing value (such as the epoch itself) into a hash of this ticket. func (c *ChainRandomnessSource) GetChainRandomness(ctx context.Context, epoch abi.ChainEpoch, lookback bool) (types.Ticket, error) { - var ticket types.Ticket if !c.head.IsEmpty() { start, err := c.reader.GetTipSet(c.head) if err != nil { @@ -159,12 +159,9 @@ func (c *ChainRandomnessSource) GetChainRandomness(ctx context.Context, epoch ab if err != nil { return types.Ticket{}, err } - ticket = tip.MinTicket() - } else { - return types.Ticket{}, xerrors.Errorf("cannot get ticket for empty tipset") + return *tip.MinTicket(), nil } - - return ticket, nil + return types.Ticket{}, xerrors.Errorf("cannot get ticket for empty tipset") } // network v0-12 @@ -250,7 +247,7 @@ func (c *ChainRandomnessSource) extractBeaconEntryForEpoch(ctx context.Context, cbe := randTS.Blocks()[0].BeaconEntries for _, v := range cbe { if v.Round == round { - return v, nil + return &v, nil } } diff --git a/pkg/chain/reorg.go b/pkg/chain/reorg.go index 93b8f1a58b..45958159af 100644 --- a/pkg/chain/reorg.go +++ b/pkg/chain/reorg.go @@ -2,7 +2,7 @@ package chain import ( "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/pkg/errors" ) diff --git a/pkg/chain/reorg_test.go b/pkg/chain/reorg_test.go index a15802222a..dcc4d5a398 100644 --- a/pkg/chain/reorg_test.go +++ b/pkg/chain/reorg_test.go @@ -2,15 +2,17 @@ package chain_test import ( "context" - "github.com/filecoin-project/venus/pkg/types" "testing" + "github.com/filecoin-project/venus/pkg/testhelpers" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/stretchr/testify/assert" "github.com/filecoin-project/venus/pkg/chain" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + types "github.com/filecoin-project/venus/venus-shared/chain" ) func TestIsReorgFork(t *testing.T) { @@ -90,7 +92,7 @@ func getSubsetOldNewCommon(ctx context.Context, t *testing.T, builder *chain.Bui block1 := builder.AppendBlockOnBlocks(commonHead) block2 := builder.AppendBlockOnBlocks(commonHead) - oldHead := types.RequireNewTipSet(t, block1) - superset := types.RequireNewTipSet(t, block1, block2) - return oldHead, superset, types.RequireNewTipSet(t, commonHead) + oldHead := testhelpers.RequireNewTipSet(t, block1) + superset := testhelpers.RequireNewTipSet(t, block1, block2) + return oldHead, superset, testhelpers.RequireNewTipSet(t, commonHead) } diff --git a/pkg/chain/store.go b/pkg/chain/store.go index 91717f0ad8..88c07ed697 100644 --- a/pkg/chain/store.go +++ b/pkg/chain/store.go @@ -34,7 +34,6 @@ import ( "github.com/filecoin-project/venus/pkg/metrics/tracing" "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/util" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" @@ -46,7 +45,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" "github.com/filecoin-project/venus/venus-shared/actors/builtin/verifreg" "github.com/filecoin-project/venus/venus-shared/actors/policy" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // HeadChangeTopic is the topic used to publish new heads. @@ -163,7 +162,7 @@ func NewStore(chainDs repo.Datastore, bsstore: bsstore, headEvents: pubsub.New(64), - checkPoint: types.UndefTipSet.Key(), + checkPoint: types.EmptyTSK, genesis: genesisCid, reorgNotifeeCh: make(chan ReorgNotifee), tsCache: tsCache, @@ -406,7 +405,7 @@ func (store *Store) GetTipSet(key types.TipSetKey) (*types.TipSet, error) { blks[idx] = blk } - ts, err := types.NewTipSet(blks...) + ts, err := types.NewTipSet(blks) if err != nil { return nil, err } @@ -502,7 +501,7 @@ func (store *Store) GetLatestBeaconEntry(ts *types.TipSet) (*types.BeaconEntry, for i := 0; i < 20; i++ { cbe := cur.At(0).BeaconEntries if len(cbe) > 0 { - return cbe[len(cbe)-1], nil + return &cbe[len(cbe)-1], nil } if cur.Height() == 0 { @@ -921,10 +920,10 @@ func (store *Store) WalkSnapshot(ctx context.Context, ts *types.TipSet, inclRece } if b.Height > 0 { - blocksToWalk = append(blocksToWalk, b.Parents.Cids()...) + blocksToWalk = append(blocksToWalk, b.Parents...) } else { // include the genesis block - cids = append(cids, b.Parents.Cids()...) + cids = append(cids, b.Parents...) } out := cids @@ -1097,7 +1096,7 @@ func (store *Store) getCirculatingSupply(ctx context.Context, height abi.ChainEp unCirc = big.Add(unCirc, actor.Balance) case a == market.Address: - mst, err := market.Load(adtStore, (*types2.Actor)(actor)) + mst, err := market.Load(adtStore, actor) if err != nil { return err } @@ -1114,7 +1113,7 @@ func (store *Store) getCirculatingSupply(ctx context.Context, height abi.ChainEp circ = big.Add(circ, actor.Balance) case builtin.IsStorageMinerActor(actor.Code): - mst, err := miner.Load(adtStore, (*types2.Actor)(actor)) + mst, err := miner.Load(adtStore, actor) if err != nil { return err } @@ -1131,7 +1130,7 @@ func (store *Store) getCirculatingSupply(ctx context.Context, height abi.ChainEp } case builtin.IsMultisigActor(actor.Code): - mst, err := multisig.Load(adtStore, (*types2.Actor)(actor)) + mst, err := multisig.Load(adtStore, actor) if err != nil { return err } diff --git a/pkg/chain/store_test.go b/pkg/chain/store_test.go index 96c006f5f1..3e426e7cc7 100644 --- a/pkg/chain/store_test.go +++ b/pkg/chain/store_test.go @@ -5,17 +5,16 @@ import ( "testing" "github.com/filecoin-project/go-address" - emptycid "github.com/filecoin-project/venus/pkg/testhelpers/empty_cid" + "github.com/filecoin-project/venus/pkg/chain" + "github.com/filecoin-project/venus/pkg/repo" + "github.com/filecoin-project/venus/pkg/testhelpers" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/pkg/util/test" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - - "github.com/filecoin-project/venus/pkg/chain" - "github.com/filecoin-project/venus/pkg/repo" - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" ) type CborBlockStore struct { @@ -52,7 +51,7 @@ func requirePutTestChain(ctx context.Context, t *testing.T, cborStore *CborBlock tsas := &chain.TipSetMetadata{ TipSet: ts, TipSetStateRoot: ts.At(0).ParentStateRoot, - TipSetReceipts: emptycid.EmptyReceiptsCID, + TipSetReceipts: testhelpers.EmptyReceiptsCID, } requirePutBlocksToCborStore(t, cborStore.cborStore, tsas.TipSet.Blocks()...) require.NoError(t, cborStore.PutTipSetMetadata(ctx, tsas)) @@ -86,7 +85,7 @@ func TestPutTipSet(t *testing.T) { genTsas := &chain.TipSetMetadata{ TipSet: genTS, TipSetStateRoot: genTS.At(0).ParentStateRoot, - TipSetReceipts: emptycid.EmptyReceiptsCID, + TipSetReceipts: testhelpers.EmptyReceiptsCID, } err := cs.PutTipSetMetadata(ctx, genTsas) assert.NoError(t, err) diff --git a/pkg/chain/testing.go b/pkg/chain/testing.go index c66ebb4452..66569ad8ef 100644 --- a/pkg/chain/testing.go +++ b/pkg/chain/testing.go @@ -31,9 +31,9 @@ import ( "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/repo" - emptycid "github.com/filecoin-project/venus/pkg/testhelpers/empty_cid" - "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/pkg/testhelpers" "github.com/filecoin-project/venus/pkg/util" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // Builder builds fake chains and acts as a provider and fetcher for the chain thus generated. @@ -89,7 +89,7 @@ func (f *Builder) FakeStateEvaluator() *FakeStateEvaluator { func (f *Builder) LoadTipSetMessage(ctx context.Context, ts *types.TipSet) ([]types.BlockMessagesInfo, error) { // gather message applied := make(map[address.Address]uint64) - selectMsg := func(m *types.UnsignedMessage) (bool, error) { + selectMsg := func(m *types.Message) (bool, error) { // The first match for a sender is guaranteed to have correct nonce -- the block isn't valid otherwise if _, ok := applied[m.From]; !ok { applied[m.From] = m.Nonce @@ -219,12 +219,12 @@ func NewBuilderWithDeps(t *testing.T, miner address.Address, sb StateBuilder, st tipStateCids: make(map[string]cid.Cid), } ctx := context.TODO() - _, err := b.mstore.StoreMessages(ctx, []*types.SignedMessage{}, []*types.UnsignedMessage{}) + _, err := b.mstore.StoreMessages(ctx, []*types.SignedMessage{}, []*types.Message{}) require.NoError(t, err) _, err = b.mstore.StoreReceipts(ctx, []types.MessageReceipt{}) require.NoError(t, err) // append genesis - nullState := types.CidFromString(t, "null") + nullState := testhelpers.CidFromString(t, "null") b.tipStateCids[types.NewTipSetKey().String()] = nullState // create a fixed genesis @@ -259,7 +259,7 @@ func NewBuilderWithDeps(t *testing.T, miner address.Address, sb StateBuilder, st func (f *Builder) AppendBlockOnBlocks(parents ...*types.BlockHeader) *types.BlockHeader { var tip *types.TipSet if len(parents) > 0 { - tip = types.RequireNewTipSet(f.t, parents...) + tip = testhelpers.RequireNewTipSet(f.t, parents...) } return f.AppendBlockOn(tip) } @@ -283,7 +283,7 @@ func (f *Builder) FlushHead(ctx context.Context) error { func (f *Builder) AppendManyBlocksOnBlocks(height int, parents ...*types.BlockHeader) *types.BlockHeader { var tip *types.TipSet if len(parents) > 0 { - tip = types.RequireNewTipSet(f.t, parents...) + tip = testhelpers.RequireNewTipSet(f.t, parents...) } return f.BuildManyOn(height, tip, nil).At(0) } @@ -302,7 +302,7 @@ func (f *Builder) AppendManyOn(height int, parent *types.TipSet) *types.TipSet { func (f *Builder) BuildOnBlock(parent *types.BlockHeader, build func(b *BlockBuilder)) *types.BlockHeader { var tip *types.TipSet if parent != nil { - tip = types.RequireNewTipSet(f.t, parent) + tip = testhelpers.RequireNewTipSet(f.t, parent) } return f.BuildOneOn(tip, build).At(0) } @@ -374,14 +374,14 @@ func (f *Builder) BuildOrphaTipset(parent *types.TipSet, width int, build func(b f.seq++ b := &types.BlockHeader{ - Ticket: ticket, + Ticket: &ticket, Miner: f.minerAddress, BeaconEntries: nil, ParentWeight: parentWeight, - Parents: parent.Key(), + Parents: parent.Key().Cids(), Height: height, - Messages: emptycid.EmptyTxMetaCID, - ParentMessageReceipts: emptycid.EmptyReceiptsCID, + Messages: testhelpers.EmptyTxMetaCID, + ParentMessageReceipts: testhelpers.EmptyReceiptsCID, BLSAggregate: &emptyBLSSig, // Omitted fields below // ParentStateRoot: stateRoot, @@ -422,7 +422,7 @@ func (f *Builder) BuildOrphaTipset(parent *types.TipSet, width int, build func(b blocks = append(blocks, b) } - return types.RequireNewTipSet(f.t, blocks...) + return testhelpers.RequireNewTipSet(f.t, blocks...) } // StateForKey loads (or computes) the state root for a tipset key. @@ -501,7 +501,7 @@ type BlockBuilder struct { // SetTicket sets the block's ticket. func (bb *BlockBuilder) SetTicket(raw []byte) { - bb.block.Ticket = types.Ticket{VRFProof: types.VRFPi(raw)} + bb.block.Ticket = &types.Ticket{VRFProof: raw} } // SetTimestamp sets the block's timestamp. @@ -521,7 +521,7 @@ func (bb *BlockBuilder) SetBlockSig(signature crypto.Signature) { } // AddMessages adds a message & receipt collection to the block. -func (bb *BlockBuilder) AddMessages(secpmsgs []*types.SignedMessage, blsMsgs []*types.UnsignedMessage) { +func (bb *BlockBuilder) AddMessages(secpmsgs []*types.SignedMessage, blsMsgs []*types.Message) { ctx := context.Background() meta, err := bb.messages.StoreMessages(ctx, secpmsgs, blsMsgs) @@ -562,9 +562,9 @@ func (FakeStateBuilder) ComputeState(prev cid.Cid, blockmsg []types.BlockMessage mCId := msg.Cid() inputs = append(inputs, mCId) receipts = append(receipts, types.MessageReceipt{ - ExitCode: 0, - ReturnValue: mCId.Bytes(), - GasUsed: 3, + ExitCode: 0, + Return: mCId.Bytes(), + GasUsed: 3, }) } } @@ -695,7 +695,7 @@ func (e *FakeStateEvaluator) RunStateTransition(ctx context.Context, ts *types.T } func (e *FakeStateEvaluator) ValidateFullBlock(ctx context.Context, blk *types.BlockHeader) error { - parent, err := e.ChainStore.GetTipSet(blk.Parents) + parent, err := e.ChainStore.GetTipSet(types.NewTipSetKey(blk.Parents...)) if err != nil { return err } @@ -772,7 +772,7 @@ func (f *Builder) GetTipSet(key types.TipSetKey) (*types.TipSet, error) { } blocks = append(blocks, &blk) } - return types.NewTipSet(blocks...) + return types.NewTipSet(blocks) } // FetchTipSets fetchs the tipset at `tsKey` from the fetchers blockStore backed by the Builder. @@ -853,7 +853,7 @@ func (f *Builder) LoadReceipts(ctx context.Context, c cid.Cid) ([]types.MessageR } // LoadTxMeta returns the tx meta wrapper tracked by the builder. -func (f *Builder) LoadTxMeta(ctx context.Context, metaCid cid.Cid) (types.TxMeta, error) { +func (f *Builder) LoadTxMeta(ctx context.Context, metaCid cid.Cid) (types.MessageRoot, error) { return f.mstore.LoadTxMeta(ctx, metaCid) } @@ -863,11 +863,11 @@ func (f *Builder) StoreReceipts(ctx context.Context, receipts []types.MessageRec } // StoreTxMeta stores a tx meta -func (f *Builder) StoreTxMeta(ctx context.Context, meta types.TxMeta) (cid.Cid, error) { +func (f *Builder) StoreTxMeta(ctx context.Context, meta types.MessageRoot) (cid.Cid, error) { return f.mstore.StoreTxMeta(ctx, meta) } -func (f *Builder) LoadUnsignedMessagesFromCids(blsCids []cid.Cid) ([]*types.UnsignedMessage, error) { +func (f *Builder) LoadUnsignedMessagesFromCids(blsCids []cid.Cid) ([]*types.Message, error) { return f.mstore.LoadUnsignedMessagesFromCids(blsCids) } @@ -876,7 +876,7 @@ func (f *Builder) LoadSignedMessagesFromCids(secpCids []cid.Cid) ([]*types.Signe } // LoadMessages returns the message collections tracked by the builder. -func (f *Builder) LoadMetaMessages(ctx context.Context, metaCid cid.Cid) ([]*types.SignedMessage, []*types.UnsignedMessage, error) { +func (f *Builder) LoadMetaMessages(ctx context.Context, metaCid cid.Cid) ([]*types.SignedMessage, []*types.Message, error) { return f.mstore.LoadMetaMessages(ctx, metaCid) } @@ -942,7 +942,7 @@ func (f *Builder) GeneratorGenesis() *types.TipSet { cur, err := types.DecodeBlock(bsBlk.RawData()) require.NoError(f.t, err) - ts, err := types.NewTipSet(cur) + ts, err := types.NewTipSet([]*types.BlockHeader{cur}) require.NoError(f.t, err) return ts diff --git a/pkg/chain/tip_index.go b/pkg/chain/tip_index.go index bb1a53e9f4..53a09e699a 100644 --- a/pkg/chain/tip_index.go +++ b/pkg/chain/tip_index.go @@ -5,11 +5,10 @@ import ( "sync" "github.com/filecoin-project/go-state-types/abi" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" "github.com/pkg/errors" "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types" ) var ( diff --git a/pkg/chain/traversal.go b/pkg/chain/traversal.go index 98fa613c09..34b886c505 100644 --- a/pkg/chain/traversal.go +++ b/pkg/chain/traversal.go @@ -3,9 +3,9 @@ package chain import ( "context" "errors" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/go-state-types/abi" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" ) @@ -70,7 +70,7 @@ func LoadTipSetBlocks(ctx context.Context, store BlockProvider, key types.TipSet } blocks = append(blocks, blk) } - return types.NewTipSet(blocks...) + return types.NewTipSet(blocks) } type tipsetFromBlockProvider struct { @@ -187,7 +187,7 @@ func FindLatestDRAND(ctx context.Context, start *types.TipSet, reader TipSetProv entries := ts.At(0).BeaconEntries if len(entries) > 0 { - return entries[len(entries)-1], nil + return &entries[len(entries)-1], nil } // No entries, simply move on to the next ancestor } diff --git a/pkg/chain/traversal_test.go b/pkg/chain/traversal_test.go index 43b010ead8..56f11fd6a0 100644 --- a/pkg/chain/traversal_test.go +++ b/pkg/chain/traversal_test.go @@ -4,7 +4,7 @@ import ( "context" "testing" - "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/pkg/testhelpers" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" @@ -13,6 +13,7 @@ import ( "github.com/filecoin-project/venus/pkg/chain" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + types "github.com/filecoin-project/venus/venus-shared/chain" ) func TestIterAncestors(t *testing.T) { @@ -29,9 +30,9 @@ func TestIterAncestors(t *testing.T) { b12 := store.AppendBlockOnBlocks(root) b21 := store.AppendBlockOnBlocks(b11, b12) - t0 := types.RequireNewTipSet(t, root) - t1 := types.RequireNewTipSet(t, b11, b12) - t2 := types.RequireNewTipSet(t, b21) + t0 := testhelpers.RequireNewTipSet(t, root) + t1 := testhelpers.RequireNewTipSet(t, b11, b12) + t2 := testhelpers.RequireNewTipSet(t, b21) it := chain.IterAncestors(ctx, store, t2) assert.False(t, it.Complete()) @@ -58,9 +59,9 @@ func TestIterAncestors(t *testing.T) { b12 := store.AppendBlockOnBlocks(root) b21 := store.AppendBlockOnBlocks(b11, b12) - types.RequireNewTipSet(t, root) - t1 := types.RequireNewTipSet(t, b11, b12) - t2 := types.RequireNewTipSet(t, b21) + testhelpers.RequireNewTipSet(t, root) + t1 := testhelpers.RequireNewTipSet(t, b11, b12) + t2 := testhelpers.RequireNewTipSet(t, b21) it := chain.IterAncestors(ctx, store, t2) assert.False(t, it.Complete()) diff --git a/pkg/chain/utils.go b/pkg/chain/utils.go index 5d502e0722..4d4b3d8034 100644 --- a/pkg/chain/utils.go +++ b/pkg/chain/utils.go @@ -5,8 +5,8 @@ import ( "runtime" "strings" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/rt" diff --git a/pkg/chain/waiter.go b/pkg/chain/waiter.go index 984db34c2c..80a52cd620 100644 --- a/pkg/chain/waiter.go +++ b/pkg/chain/waiter.go @@ -7,13 +7,12 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/constants" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" bstore "github.com/ipfs/go-ipfs-blockstore" cbor "github.com/ipfs/go-ipld-cbor" "github.com/pkg/errors" "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types" ) type MsgLookup struct { @@ -57,7 +56,7 @@ type ChainMessage struct { //nolint } // WaitPredicate is a function that identifies a message and returns true when found. -type WaitPredicate func(msg *types.UnsignedMessage, msgCid cid.Cid) bool +type WaitPredicate func(msg *types.Message, msgCid cid.Cid) bool // NewWaiter returns a new Waiter. func NewWaiter(chainStore waiterChainReader, messages MessageProvider, bs bstore.Blockstore, cst cbor.IpldStore) *Waiter { diff --git a/pkg/chain/waiter_test.go b/pkg/chain/waiter_test.go index a4be33bf9a..fd29b634e8 100644 --- a/pkg/chain/waiter_test.go +++ b/pkg/chain/waiter_test.go @@ -3,22 +3,24 @@ package chain import ( "context" "fmt" - "github.com/filecoin-project/venus/pkg/constants" "testing" "time" + "github.com/filecoin-project/venus/pkg/testhelpers" + + "github.com/filecoin-project/venus/pkg/constants" + "github.com/filecoin-project/go-address" _ "github.com/filecoin-project/venus/pkg/crypto/bls" _ "github.com/filecoin-project/venus/pkg/crypto/secp" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" cbor "github.com/ipfs/go-ipld-cbor" "github.com/stretchr/testify/assert" ) -var mockSigner, _ = types.NewMockSignersAndKeyInfo(10) +var mockSigner, _ = testhelpers.NewMockSignersAndKeyInfo(10) -var newSignedMessage = types.NewSignedMessageForTestGetter(mockSigner) +var newSignedMessage = testhelpers.NewSignedMessageForTestGetter(mockSigner) func setupTest(t *testing.T) (cbor.IpldStore, *Store, *MessageStore, *Waiter) { builder := NewBuilder(t, address.Undef) diff --git a/pkg/chainsync/chainsync.go b/pkg/chainsync/chainsync.go index b7daa07686..90ae44eb0a 100644 --- a/pkg/chainsync/chainsync.go +++ b/pkg/chainsync/chainsync.go @@ -2,16 +2,17 @@ package chainsync import ( "context" + chain2 "github.com/filecoin-project/venus/app/submodule/chain" + "github.com/filecoin-project/venus/pkg/chainsync/exchange" "github.com/filecoin-project/venus/pkg/chainsync/types" "github.com/filecoin-project/venus/pkg/consensus" "github.com/filecoin-project/venus/pkg/statemanger" - types2 "github.com/filecoin-project/venus/pkg/types" + types2 "github.com/filecoin-project/venus/venus-shared/chain" blockstore "github.com/ipfs/go-ipfs-blockstore" "github.com/filecoin-project/venus/pkg/chainsync/dispatcher" - "github.com/filecoin-project/venus/pkg/chainsync/exchange" "github.com/filecoin-project/venus/pkg/chainsync/syncer" "github.com/filecoin-project/venus/pkg/clock" "github.com/filecoin-project/venus/pkg/fork" diff --git a/pkg/chainsync/dispatcher/dispatcher.go b/pkg/chainsync/dispatcher/dispatcher.go index 267f7dbdaa..4abc9d9bee 100644 --- a/pkg/chainsync/dispatcher/dispatcher.go +++ b/pkg/chainsync/dispatcher/dispatcher.go @@ -3,14 +3,15 @@ package dispatcher import ( "container/list" "context" - "github.com/filecoin-project/venus/pkg/chainsync/types" - types2 "github.com/filecoin-project/venus/pkg/types" - "github.com/streadway/handy/atomic" "runtime/debug" "sync" atmoic2 "sync/atomic" "time" + "github.com/filecoin-project/venus/pkg/chainsync/types" + types2 "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/streadway/handy/atomic" + logging "github.com/ipfs/go-log/v2" ) diff --git a/pkg/chainsync/dispatcher/dispatcher_test.go b/pkg/chainsync/dispatcher/dispatcher_test.go index ae9a4ff8c9..ee0cd221e3 100644 --- a/pkg/chainsync/dispatcher/dispatcher_test.go +++ b/pkg/chainsync/dispatcher/dispatcher_test.go @@ -2,19 +2,24 @@ package dispatcher_test import ( "context" + "testing" + "time" + + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/pkg/testhelpers" + fbig "github.com/filecoin-project/go-state-types/big" acrypto "github.com/filecoin-project/go-state-types/crypto" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "testing" - "time" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/chainsync/dispatcher" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" ) type mockSyncer struct { @@ -147,25 +152,25 @@ func requirePop(t *testing.T, q *syncTypes.TargetTracker) *syncTypes.Target { // an int. The tipset key is a faked cid from the string of that integer and // the height is that integer. func chainInfoWithHeightAndWeight(t *testing.T, h int, weight int64) *types.ChainInfo { - newAddress := types.NewForTestGetter() + newAddress := testhelpers.NewForTestGetter() posts := []proof2.PoStProof{{PoStProof: abi.RegisteredPoStProof_StackedDrgWinning32GiBV1, ProofBytes: []byte{0x07}}} blk := &types.BlockHeader{ Miner: newAddress(), - Ticket: types.Ticket{VRFProof: []byte{0x03, 0x01, 0x02}}, + Ticket: &types.Ticket{VRFProof: []byte{0x03, 0x01, 0x02}}, ElectionProof: &types.ElectionProof{VRFProof: []byte{0x0c, 0x0d}}, - BeaconEntries: []*types.BeaconEntry{ + BeaconEntries: []types.BeaconEntry{ { Round: 44, Data: []byte{0xc0}, }, }, Height: abi.ChainEpoch(h), - Messages: types.CidFromString(t, "someothercid"), - ParentMessageReceipts: types.CidFromString(t, "someothercid"), - Parents: types.NewTipSetKey(types.CidFromString(t, "someothercid")), + Messages: testhelpers.CidFromString(t, "someothercid"), + ParentMessageReceipts: testhelpers.CidFromString(t, "someothercid"), + Parents: []cid.Cid{testhelpers.CidFromString(t, "someothercid")}, ParentWeight: fbig.NewInt(weight), ForkSignaling: 2, - ParentStateRoot: types.CidFromString(t, "someothercid"), + ParentStateRoot: testhelpers.CidFromString(t, "someothercid"), Timestamp: 4, ParentBaseFee: abi.NewTokenAmount(20), WinPoStProof: posts, @@ -174,7 +179,7 @@ func chainInfoWithHeightAndWeight(t *testing.T, h int, weight int64) *types.Chai Data: []byte{0x4}, }, } - b, _ := types.NewTipSet(blk) + b, _ := types.NewTipSet([]*types.BlockHeader{blk}) return &types.ChainInfo{ Head: b, } diff --git a/pkg/chainsync/exchange/cbor_gen.go b/pkg/chainsync/exchange/cbor_gen.go index 81ec6b39df..604aec8982 100644 --- a/pkg/chainsync/exchange/cbor_gen.go +++ b/pkg/chainsync/exchange/cbor_gen.go @@ -7,7 +7,7 @@ import ( "io" "sort" - "github.com/filecoin-project/venus/pkg/types" + chain "github.com/filecoin-project/venus/venus-shared/chain" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" @@ -270,7 +270,7 @@ func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { scratch := make([]byte, 9) - // t.Bls ([]*types.UnsignedMessage) (slice) + // t.Bls ([]*chain.Message) (slice) if len(t.Bls) > cbg.MaxLength { return xerrors.Errorf("Slice value in field t.Bls was too long") } @@ -307,7 +307,7 @@ func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { } } - // t.Secpk ([]*types.SignedMessage) (slice) + // t.Secpk ([]*chain.SignedMessage) (slice) if len(t.Secpk) > cbg.MaxLength { return xerrors.Errorf("Slice value in field t.Secpk was too long") } @@ -364,7 +364,7 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) error { return fmt.Errorf("cbor input had wrong number of fields") } - // t.Bls ([]*types.UnsignedMessage) (slice) + // t.Bls ([]*chain.Message) (slice) maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) if err != nil { @@ -380,12 +380,12 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) error { } if extra > 0 { - t.Bls = make([]*types.UnsignedMessage, extra) + t.Bls = make([]*chain.Message, extra) } for i := 0; i < int(extra); i++ { - var v types.UnsignedMessage + var v chain.Message if err := v.UnmarshalCBOR(br); err != nil { return err } @@ -452,7 +452,7 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) error { } } - // t.Secpk ([]*types.SignedMessage) (slice) + // t.Secpk ([]*chain.SignedMessage) (slice) maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) if err != nil { @@ -468,12 +468,12 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) error { } if extra > 0 { - t.Secpk = make([]*types.SignedMessage, extra) + t.Secpk = make([]*chain.SignedMessage, extra) } for i := 0; i < int(extra); i++ { - var v types.SignedMessage + var v chain.SignedMessage if err := v.UnmarshalCBOR(br); err != nil { return err } @@ -556,7 +556,7 @@ func (t *BSTipSet) MarshalCBOR(w io.Writer) error { scratch := make([]byte, 9) - // t.Blocks ([]*types.BlockHeader) (slice) + // t.Blocks ([]*chain.BlockHeader) (slice) if len(t.Blocks) > cbg.MaxLength { return xerrors.Errorf("Slice value in field t.Blocks was too long") } @@ -595,7 +595,7 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error { return fmt.Errorf("cbor input had wrong number of fields") } - // t.Blocks ([]*types.BlockHeader) (slice) + // t.Blocks ([]*chain.BlockHeader) (slice) maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) if err != nil { @@ -611,12 +611,12 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error { } if extra > 0 { - t.Blocks = make([]*types.BlockHeader, extra) + t.Blocks = make([]*chain.BlockHeader, extra) } for i := 0; i < int(extra); i++ { - var v types.BlockHeader + var v chain.BlockHeader if err := v.UnmarshalCBOR(br); err != nil { return err } diff --git a/pkg/chainsync/exchange/client.go b/pkg/chainsync/exchange/client.go index afa98ede45..aa83a31035 100644 --- a/pkg/chainsync/exchange/client.go +++ b/pkg/chainsync/exchange/client.go @@ -10,7 +10,6 @@ import ( "time" cborutil "github.com/filecoin-project/go-cbor-util" - "github.com/filecoin-project/venus/pkg/types" logging "github.com/ipfs/go-log" "github.com/libp2p/go-libp2p-core/host" @@ -21,6 +20,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/net" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var exchangeClientLogger = logging.Logger("exchange.client") @@ -191,7 +191,7 @@ func (c *client) processResponse(req *Request, res *Response, tipsets []*types.T } } - validRes.tipsets[i], err = types.NewTipSet(res.Chain[i].Blocks...) + validRes.tipsets[i], err = types.NewTipSet(res.Chain[i].Blocks) if err != nil { return nil, xerrors.Errorf("invalid tipset blocks at height (head - %d): %w", i, err) } diff --git a/pkg/chainsync/exchange/interfaces.go b/pkg/chainsync/exchange/interfaces.go index 5fb8dec405..67d2919ec1 100644 --- a/pkg/chainsync/exchange/interfaces.go +++ b/pkg/chainsync/exchange/interfaces.go @@ -2,9 +2,10 @@ package exchange import ( "context" - "github.com/filecoin-project/venus/pkg/types" "github.com/libp2p/go-libp2p-core/peer" + + types "github.com/filecoin-project/venus/venus-shared/chain" ) // Server is the responder side of the ChainExchange protocol. It accepts diff --git a/pkg/chainsync/exchange/protocol.go b/pkg/chainsync/exchange/protocol.go index b9622a0e1b..357b599f66 100644 --- a/pkg/chainsync/exchange/protocol.go +++ b/pkg/chainsync/exchange/protocol.go @@ -5,8 +5,8 @@ import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/policy" + types "github.com/filecoin-project/venus/venus-shared/chain" logging "github.com/ipfs/go-log" "golang.org/x/xerrors" ) @@ -155,7 +155,7 @@ type BSTipSet struct { // FIXME: The logic to decompress this structure should belong // to itself, not to the consumer. type CompactedMessages struct { - Bls []*types.UnsignedMessage + Bls []*types.Message BlsIncludes [][]uint64 Secpk []*types.SignedMessage diff --git a/pkg/chainsync/exchange/server.go b/pkg/chainsync/exchange/server.go index 1a83a7778d..85e82119fa 100644 --- a/pkg/chainsync/exchange/server.go +++ b/pkg/chainsync/exchange/server.go @@ -4,9 +4,10 @@ import ( "bufio" "context" "fmt" + "time" + cborutil "github.com/filecoin-project/go-cbor-util" logging "github.com/ipfs/go-log" - "time" "go.opencensus.io/trace" "golang.org/x/xerrors" @@ -15,7 +16,7 @@ import ( "github.com/libp2p/go-libp2p-core/host" inet "github.com/libp2p/go-libp2p-core/network" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var exchangeServerLog = logging.Logger("exchange.server") @@ -27,7 +28,7 @@ type chainReader interface { type messageStore interface { ReadMsgMetaCids(ctx context.Context, mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) - LoadUnsignedMessagesFromCids(cids []cid.Cid) ([]*types.UnsignedMessage, error) + LoadUnsignedMessagesFromCids(cids []cid.Cid) ([]*types.Message, error) LoadSignedMessagesFromCids(cids []cid.Cid) ([]*types.SignedMessage, error) } @@ -217,7 +218,7 @@ func collectChainSegment(cr chainReader, mr messageStore, req *validatedRequest) } } -func GatherMessages(cr chainReader, mr messageStore, ts *types.TipSet) ([]*types.UnsignedMessage, [][]uint64, []*types.SignedMessage, [][]uint64, error) { +func GatherMessages(cr chainReader, mr messageStore, ts *types.TipSet) ([]*types.Message, [][]uint64, []*types.SignedMessage, [][]uint64, error) { blsmsgmap := make(map[cid.Cid]uint64) secpkmsgmap := make(map[cid.Cid]uint64) var secpkincl, blsincl [][]uint64 diff --git a/pkg/chainsync/slashfilter/mysqldb.go b/pkg/chainsync/slashfilter/mysqldb.go index 6b6fb9bb70..7735011371 100644 --- a/pkg/chainsync/slashfilter/mysqldb.go +++ b/pkg/chainsync/slashfilter/mysqldb.go @@ -4,7 +4,6 @@ import ( "time" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/pkg/types" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" @@ -13,6 +12,7 @@ import ( "gorm.io/gorm" "github.com/filecoin-project/venus/pkg/config" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var log = logging.Logger("mysql") @@ -88,7 +88,7 @@ func (f *MysqlSlashFilter) checkSameHeightFault(bh *types.BlockHeader) error { //checkSameParentFault check whether the miner mined block on the same parent func (f *MysqlSlashFilter) checkSameParentFault(bh *types.BlockHeader) error { var bk MinedBlock - err := f._db.Model(&MinedBlock{}).Take(&bk, "miner=? and parent_key=?", bh.Miner.String(), bh.Parents.String()).Error + err := f._db.Model(&MinedBlock{}).Take(&bk, "miner=? and parent_key=?", bh.Miner.String(), types.NewTipSetKey(bh.Parents...).String()).Error if err == gorm.ErrRecordNotFound { return nil } @@ -130,7 +130,7 @@ func (f *MysqlSlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.Cha } var found bool - for _, c := range bh.Parents.Cids() { + for _, c := range bh.Parents { if c.Equals(parent) { found = true } @@ -148,7 +148,7 @@ func (f *MysqlSlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.Cha return f._db.Save(&MinedBlock{ ParentEpoch: int64(parentEpoch), - ParentKey: bh.Parents.String(), + ParentKey: types.NewTipSetKey(bh.Parents...).String(), Epoch: int64(bh.Height), Miner: bh.Miner.String(), Cid: bh.Cid().String(), diff --git a/pkg/chainsync/slashfilter/slashfilter.go b/pkg/chainsync/slashfilter/slashfilter.go index feb063452e..9b7b52a1ff 100644 --- a/pkg/chainsync/slashfilter/slashfilter.go +++ b/pkg/chainsync/slashfilter/slashfilter.go @@ -2,7 +2,6 @@ package slashfilter import ( "fmt" - "github.com/filecoin-project/venus/pkg/types" "golang.org/x/xerrors" @@ -11,6 +10,7 @@ import ( "github.com/ipfs/go-datastore/namespace" "github.com/filecoin-project/go-state-types/abi" + types "github.com/filecoin-project/venus/venus-shared/chain" ) //ISlashFilter used to detect whether the miner mined a invalidated block , support local db and mysql storage @@ -42,7 +42,7 @@ func (f *LocalSlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.Cha } } - parentsKey := ds.NewKey(fmt.Sprintf("/%s/%s", bh.Miner, bh.Parents.String())) + parentsKey := ds.NewKey(fmt.Sprintf("/%s/%s", bh.Miner, types.NewTipSetKey(bh.Parents...).String())) { // time-offset mining faults (2 blocks with the same parents) if err := checkFault(f.byParents, parentsKey, bh, "time-offset mining faults"); err != nil { @@ -73,7 +73,7 @@ func (f *LocalSlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.Cha } var found bool - for _, c := range bh.Parents.Cids() { + for _, c := range bh.Parents { if c.Equals(parent) { found = true } diff --git a/pkg/chainsync/syncer/syncer.go b/pkg/chainsync/syncer/syncer.go index 7cb002095b..888b0cb716 100644 --- a/pkg/chainsync/syncer/syncer.go +++ b/pkg/chainsync/syncer/syncer.go @@ -24,9 +24,9 @@ import ( "github.com/filecoin-project/venus/pkg/fork" "github.com/filecoin-project/venus/pkg/metrics" "github.com/filecoin-project/venus/pkg/metrics/tracing" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/venus-shared/actors/policy" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" blockstore "github.com/ipfs/go-ipfs-blockstore" logging "github.com/ipfs/go-log/v2" @@ -98,7 +98,7 @@ type ChainReaderWriter interface { //messageStore used to save and load message from db type messageStore interface { LoadTipSetMessage(ctx context.Context, ts *types.TipSet) ([]types.BlockMessagesInfo, error) - LoadMetaMessages(context.Context, cid.Cid) ([]*types.SignedMessage, []*types.UnsignedMessage, error) + LoadMetaMessages(context.Context, cid.Cid) ([]*types.SignedMessage, []*types.Message, error) LoadReceipts(context.Context, cid.Cid) ([]types.MessageReceipt, error) StoreReceipts(context.Context, []types.MessageReceipt) (cid.Cid, error) } @@ -701,7 +701,7 @@ func (syncer *Syncer) exceedsForkLength(synced, external *types.TipSet) (bool, e // either validate it here, or ensure that its validated elsewhere (maybe make // sure the blocksync code checks it?) // maybe this code should actually live in blocksync?? -func zipTipSetAndMessages(bs blockstore.Blockstore, ts *types.TipSet, allbmsgs []*types.UnsignedMessage, allsmsgs []*types.SignedMessage, bmi, smi [][]uint64) (*types.FullTipSet, error) { +func zipTipSetAndMessages(bs blockstore.Blockstore, ts *types.TipSet, allbmsgs []*types.Message, allsmsgs []*types.SignedMessage, bmi, smi [][]uint64) (*types.FullTipSet, error) { if len(ts.Blocks()) != len(smi) || len(ts.Blocks()) != len(bmi) { return nil, fmt.Errorf("msgincl length didnt match tipset size") } @@ -720,7 +720,7 @@ func zipTipSetAndMessages(bs blockstore.Blockstore, ts *types.TipSet, allbmsgs [ smsgCids = append(smsgCids, mCid) } - var bmsgs []*types.UnsignedMessage + var bmsgs []*types.Message var bmsgCids []cid.Cid for _, m := range bmi[bi] { bmsgs = append(bmsgs, allbmsgs[m]) diff --git a/pkg/chainsync/syncer/syncer_integration_test.go b/pkg/chainsync/syncer/syncer_integration_test.go index 09c08e0386..4c688328f1 100644 --- a/pkg/chainsync/syncer/syncer_integration_test.go +++ b/pkg/chainsync/syncer/syncer_integration_test.go @@ -2,12 +2,13 @@ package syncer_test import ( "context" - "github.com/filecoin-project/venus/pkg/statemanger" "testing" "time" + "github.com/filecoin-project/venus/pkg/statemanger" + "github.com/filecoin-project/venus/pkg/chainsync/types" - types2 "github.com/filecoin-project/venus/pkg/types" + types2 "github.com/filecoin-project/venus/venus-shared/chain" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/pkg/chainsync/syncer/syncer_test.go b/pkg/chainsync/syncer/syncer_test.go index 34940086ef..ded1dbc988 100644 --- a/pkg/chainsync/syncer/syncer_test.go +++ b/pkg/chainsync/syncer/syncer_test.go @@ -5,22 +5,22 @@ import ( "testing" "time" - "github.com/filecoin-project/venus/pkg/statemanger" + "github.com/filecoin-project/venus/pkg/testhelpers" - syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" - emptycid "github.com/filecoin-project/venus/pkg/testhelpers/empty_cid" + "github.com/filecoin-project/venus/pkg/statemanger" "github.com/filecoin-project/go-address" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/chainsync/syncer" + syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" "github.com/filecoin-project/venus/pkg/clock" _ "github.com/filecoin-project/venus/pkg/crypto/bls" _ "github.com/filecoin-project/venus/pkg/crypto/secp" "github.com/filecoin-project/venus/pkg/fork" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/util/test" "github.com/filecoin-project/venus/venus-shared/actors/policy" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" "github.com/pkg/errors" "github.com/stretchr/testify/assert" @@ -375,7 +375,7 @@ func TestSubsetParent(t *testing.T) { // Sync one tipset with a parent equal to a subset of an existing // tipset in the bsstore: {B1, B2} -> {C1, C2} - tipB1B2 := types.RequireNewTipSet(t, tipB1B2B3.At(0), tipB1B2B3.At(1)) + tipB1B2 := testhelpers.RequireNewTipSet(t, tipB1B2B3.At(0), tipB1B2B3.At(1)) tipC1C2 := builder.AppendOn(tipB1B2, 2) target2 := &syncTypes.Target{ @@ -390,7 +390,7 @@ func TestSubsetParent(t *testing.T) { // Sync another tipset with a parent equal to a subset of the tipset // just synced: C1 -> D1 - tipC1 := types.RequireNewTipSet(t, tipC1C2.At(0)) + tipC1 := testhelpers.RequireNewTipSet(t, tipC1C2.At(0)) tipD1OnC1 := builder.AppendOn(tipC1, 1) target3 := &syncTypes.Target{ @@ -463,9 +463,9 @@ type poisonValidator struct { func (pv *poisonValidator) RunStateTransition(ctx context.Context, ts *types.TipSet) (cid.Cid, cid.Cid, error) { stamp := ts.At(0).Timestamp if pv.fullFailureTS == stamp { - return emptycid.EmptyTxMetaCID, emptycid.EmptyTxMetaCID, errors.New("run state transition fails on poison timestamp") + return testhelpers.EmptyTxMetaCID, testhelpers.EmptyTxMetaCID, errors.New("run state transition fails on poison timestamp") } - return emptycid.EmptyTxMetaCID, emptycid.EmptyTxMetaCID, nil + return testhelpers.EmptyTxMetaCID, testhelpers.EmptyTxMetaCID, nil } func (pv *poisonValidator) ValidateFullBlock(ctx context.Context, blk *types.BlockHeader) error { @@ -503,8 +503,8 @@ func TestSemanticallyBadTipSetFails(t *testing.T) { genesis := builder.Store().GetHead() // Build a chain with messages that will fail semantic header validation - kis := types.MustGenerateKeyInfo(1, 42) - mm := types.NewMessageMaker(t, kis) + kis := testhelpers.MustGenerateKeyInfo(1, 42) + mm := testhelpers.NewMessageMaker(t, kis) alice := mm.Addresses()[0] m1 := mm.NewSignedMessage(alice, 0) m2 := mm.NewSignedMessage(alice, 1) @@ -513,7 +513,7 @@ func TestSemanticallyBadTipSetFails(t *testing.T) { link1 := builder.BuildOneOn(genesis, func(bb *chain.BlockBuilder) { bb.AddMessages( []*types.SignedMessage{m1, m2, m3}, - []*types.UnsignedMessage{}, + []*types.Message{}, ) bb.SetTimestamp(98) // poison header val }) @@ -540,11 +540,11 @@ func TestStoresMessageReceipts(t *testing.T) { builder, syncer := setup(ctx, t) genesis := builder.Store().GetHead() - keys := types.MustGenerateKeyInfo(1, 42) - mm := types.NewMessageMaker(t, keys) + keys := testhelpers.MustGenerateKeyInfo(1, 42) + mm := testhelpers.NewMessageMaker(t, keys) alice := mm.Addresses()[0] t1 := builder.Build(genesis, 4, func(b *chain.BlockBuilder, i int) { - b.AddMessages([]*types.SignedMessage{}, []*types.UnsignedMessage{mm.NewUnsignedMessage(alice, uint64(i))}) + b.AddMessages([]*types.SignedMessage{}, []*types.Message{mm.NewUnsignedMessage(alice, uint64(i))}) }) target1 := &syncTypes.Target{ diff --git a/pkg/chainsync/types/bad_tipset_cache.go b/pkg/chainsync/types/bad_tipset_cache.go index 7689c2a3e1..a77771f0d3 100644 --- a/pkg/chainsync/types/bad_tipset_cache.go +++ b/pkg/chainsync/types/bad_tipset_cache.go @@ -1,8 +1,9 @@ package types import ( - "github.com/filecoin-project/venus/pkg/types" "sync" + + types "github.com/filecoin-project/venus/venus-shared/chain" ) // BadTipSetCache keeps track of bad tipsets that the syncer should not try to diff --git a/pkg/chainsync/types/target_tracker.go b/pkg/chainsync/types/target_tracker.go index e26d5458cf..6ad61e467e 100644 --- a/pkg/chainsync/types/target_tracker.go +++ b/pkg/chainsync/types/target_tracker.go @@ -8,9 +8,10 @@ import ( "time" fbig "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/pkg/types" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" + + types "github.com/filecoin-project/venus/venus-shared/chain" ) var log = logging.Logger("chainsync.target") @@ -282,7 +283,7 @@ func (tq *TargetTracker) widen(t *Target) (*Target, bool) { blks = append(blks, blk) } - newHead, err := types.NewTipSet(blks...) + newHead, err := types.NewTipSet(blks) if err != nil { return nil, false } diff --git a/pkg/config/config.go b/pkg/config/config.go index b6443baef1..38ac57b4ae 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -17,7 +17,7 @@ import ( "github.com/pkg/errors" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) const ( diff --git a/pkg/consensus/block_validator.go b/pkg/consensus/block_validator.go index 4b85ee0e7a..71731d979a 100644 --- a/pkg/consensus/block_validator.go +++ b/pkg/consensus/block_validator.go @@ -30,14 +30,13 @@ import ( "github.com/filecoin-project/venus/pkg/fork" appstate "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/pkg/vm/gas" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/hashicorp/go-multierror" lru "github.com/hashicorp/golang-lru" "github.com/ipfs/go-cid" @@ -141,7 +140,7 @@ func (bv *BlockValidator) ValidateFullBlock(ctx context.Context, blk *types.Bloc } func (bv *BlockValidator) validateBlock(ctx context.Context, blk *types.BlockHeader) error { - parent, err := bv.chainState.GetTipSet(blk.Parents) + parent, err := bv.chainState.GetTipSet(types.NewTipSetKey(blk.Parents...)) if err != nil { return xerrors.Errorf("load parent tipset failed %w", err) } @@ -220,7 +219,11 @@ func (bv *BlockValidator) validateBlock(ctx context.Context, blk *types.BlockHea blockSigCheck := async.Err(func() error { // Validate block signature - return crypto.Verify(blk.BlockSig, workerAddr, blk.SignatureData()) + data, err := blk.SignatureData() + if err != nil { + return err + } + return crypto.Verify(blk.BlockSig, workerAddr, data) }) beaconValuesCheck := async.Err(func() error { @@ -239,7 +242,7 @@ func (bv *BlockValidator) validateBlock(ctx context.Context, blk *types.BlockHea sampleEpoch := blk.Height - constants.TicketRandomnessLookback bSmokeHeight := blk.Height > bv.config.ForkUpgradeParam.UpgradeSmokeHeight - if err := bv.tv.IsValidTicket(ctx, blk.Parents, beaconBase, bSmokeHeight, sampleEpoch, blk.Miner, workerAddr, blk.Ticket); err != nil { + if err := bv.tv.IsValidTicket(ctx, types.NewTipSetKey(blk.Parents...), beaconBase, bSmokeHeight, sampleEpoch, blk.Miner, workerAddr, *blk.Ticket); err != nil { return xerrors.Errorf("invalid ticket: %s in block %s %w", blk.Ticket.String(), blk.Cid(), err) } return nil @@ -414,9 +417,9 @@ func (bv *BlockValidator) validateMsgMeta(ctx context.Context, msg *types.BlockM return err } - mrcid, err := store.Put(store.Context(), &types.TxMeta{ - BLSRoot: bmroot, - SecpRoot: smroot, + mrcid, err := store.Put(store.Context(), &types.MessageRoot{ + BlsRoot: bmroot, + SecpkRoot: smroot, }) if err != nil { @@ -482,7 +485,7 @@ func (bv *BlockValidator) minerIsValid(ctx context.Context, maddr address.Addres return xerrors.New("power actor not found") } - ps, err := power.Load(adt.WrapStore(ctx, vms), (*types2.Actor)(pact)) + ps, err := power.Load(adt.WrapStore(ctx, vms), pact) if err != nil { return err } @@ -508,10 +511,10 @@ func (bv *BlockValidator) ValidateBlockBeacon(blk *types.BlockHeader, parentEpoc func (bv *BlockValidator) beaconBaseEntry(ctx context.Context, blk *types.BlockHeader) (*types.BeaconEntry, error) { if len(blk.BeaconEntries) > 0 { - return blk.BeaconEntries[len(blk.BeaconEntries)-1], nil + return &blk.BeaconEntries[len(blk.BeaconEntries)-1], nil } - parent, err := bv.chainState.GetTipSet(blk.Parents) + parent, err := bv.chainState.GetTipSet(types.NewTipSetKey(blk.Parents...)) if err != nil { return nil, err } @@ -536,7 +539,7 @@ func (bv *BlockValidator) ValidateBlockWinner(ctx context.Context, waddr address rBeacon := prevEntry if len(blk.BeaconEntries) != 0 { - rBeacon = blk.BeaconEntries[len(blk.BeaconEntries)-1] + rBeacon = &blk.BeaconEntries[len(blk.BeaconEntries)-1] } buf := new(bytes.Buffer) if err := blk.Miner.MarshalCBOR(buf); err != nil { @@ -607,7 +610,7 @@ func (bv *BlockValidator) MinerEligibleToMine(ctx context.Context, addr address. return false, xerrors.New("power actor not found") } - pstate, err := power.Load(adt.WrapStore(ctx, bv.cstore), (*types2.Actor)(pact)) + pstate, err := power.Load(adt.WrapStore(ctx, bv.cstore), pact) if err != nil { return false, err } @@ -621,7 +624,7 @@ func (bv *BlockValidator) MinerEligibleToMine(ctx context.Context, addr address. return false, xerrors.Errorf("miner actor %s not found", addr) } - mstate, err := miner.Load(adt.WrapStore(ctx, vms), (*types2.Actor)(mact)) + mstate, err := miner.Load(adt.WrapStore(ctx, vms), mact) if err != nil { return false, err } @@ -671,7 +674,7 @@ func (bv *BlockValidator) minerHasMinPower(ctx context.Context, addr address.Add return false, xerrors.New("power actor not found") } - ps, err := power.Load(adt.WrapStore(ctx, vms), (*types2.Actor)(pact)) + ps, err := power.Load(adt.WrapStore(ctx, vms), pact) if err != nil { return false, err } @@ -698,7 +701,7 @@ func (bv *BlockValidator) VerifyWinningPoStProof(ctx context.Context, nv network rbase := prevBeacon if len(blk.BeaconEntries) > 0 { - rbase = blk.BeaconEntries[len(blk.BeaconEntries)-1] + rbase = &blk.BeaconEntries[len(blk.BeaconEntries)-1] } rand, err := chain.DrawRandomness(rbase.Data, acrypto.DomainSeparationTag_WinningPoStChallengeSeed, blk.Height, buf.Bytes()) @@ -863,9 +866,9 @@ func (bv *BlockValidator) checkBlockMessages(ctx context.Context, sigValidator * return xerrors.Errorf("get secpMsgs root failed: %v", err) } - txMeta := &types.TxMeta{ - BLSRoot: bmroot, - SecpRoot: smroot, + txMeta := &types.MessageRoot{ + BlsRoot: bmroot, + SecpkRoot: smroot, } b, err := chain.MakeBlock(txMeta) if err != nil { @@ -953,8 +956,11 @@ func checkBlockSignature(ctx context.Context, blk *types.BlockHeader, worker add return xerrors.New("block signature not present") } - sigb := blk.SignatureData() - err := crypto.Verify(blk.BlockSig, worker, sigb) + sigb, err := blk.SignatureData() + if err != nil { + return err + } + err = crypto.Verify(blk.BlockSig, worker, sigb) if err == nil { blk.SetValidated() } diff --git a/pkg/consensus/chain_selector.go b/pkg/consensus/chain_selector.go index 9a567615bb..a816df7ee8 100644 --- a/pkg/consensus/chain_selector.go +++ b/pkg/consensus/chain_selector.go @@ -6,16 +6,17 @@ package consensus import ( "context" "errors" - logging "github.com/ipfs/go-log/v2" "math/big" + logging "github.com/ipfs/go-log/v2" + fbig "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/pkg/types" cbor "github.com/ipfs/go-ipld-cbor" xerrors "github.com/pkg/errors" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/state" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var log = logging.Logger("chain_selector") @@ -108,7 +109,7 @@ func breakWeightTie(ts1, ts2 *types.TipSet) bool { // blocks are already sorted by ticket for i := 0; i < s; i++ { - if ts1.Blocks()[i].Ticket.Less(&ts2.Blocks()[i].Ticket) { + if ts1.Blocks()[i].Ticket.Less(ts2.Blocks()[i].Ticket) { log.Infof("weight tie broken in favour of %s", ts1.Key()) return true } diff --git a/pkg/consensus/expected.go b/pkg/consensus/expected.go index 3baace77d2..244fe484e9 100644 --- a/pkg/consensus/expected.go +++ b/pkg/consensus/expected.go @@ -3,29 +3,28 @@ package consensus import "C" import ( "context" - "github.com/filecoin-project/venus/pkg/vm/vmcontext" "time" - "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/pkg/config" + "github.com/filecoin-project/venus/pkg/vm/vmcontext" "github.com/ipfs/go-cid" blockstore "github.com/ipfs/go-ipfs-blockstore" cbor "github.com/ipfs/go-ipld-cbor" logging "github.com/ipfs/go-log" "github.com/pkg/errors" "go.opencensus.io/trace" + "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/fork" appstate "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/pkg/vm/gas" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var ( @@ -46,7 +45,7 @@ const AllowableClockDriftSecs = uint64(1) type Processor interface { // ProcessTipSet processes all messages in a tip set. ProcessTipSet(context.Context, *types.TipSet, *types.TipSet, []types.BlockMessagesInfo, vm.VmOption) (cid.Cid, []types.MessageReceipt, error) - ProcessImplicitMessage(context.Context, *types.UnsignedMessage, vm.VmOption) (*vm.Ret, error) + ProcessImplicitMessage(context.Context, *types.Message, vm.VmOption) (*vm.Ret, error) } // TicketValidator validates that an input ticket is valid. diff --git a/pkg/consensus/head_randomness.go b/pkg/consensus/head_randomness.go index 855d1c65b4..c16a7c4827 100644 --- a/pkg/consensus/head_randomness.go +++ b/pkg/consensus/head_randomness.go @@ -2,11 +2,12 @@ package consensus import ( "context" + "github.com/filecoin-project/venus/pkg/vm/vmcontext" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-state-types/abi" acrypto "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/venus/pkg/types" ) //ChainRandomness define randomness method in filecoin diff --git a/pkg/consensus/message_validator.go b/pkg/consensus/message_validator.go index 691fb097b5..a1fcad7118 100644 --- a/pkg/consensus/message_validator.go +++ b/pkg/consensus/message_validator.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/metrics" "github.com/filecoin-project/venus/pkg/state" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var invReceiverUndefCt *metrics.Int64Counter @@ -25,7 +25,7 @@ var invNegativeValueCt *metrics.Int64Counter var invGasAboveBlockLimitCt *metrics.Int64Counter // The maximum allowed message value. -var msgMaxValue = types.NewAttoFILFromFIL(2e9) +var msgMaxValue = types.FromFil(2e9) // These gas cost values must match those in vm/gas. // TODO: Look up gas costs from the same place the VM gets them, keyed by epoch. https://github.com/filecoin-project/venus/issues/3955 @@ -75,7 +75,7 @@ func (v *DefaultMessageSyntaxValidator) ValidateSignedMessageSyntax(ctx context. // ValidateUnsignedMessageSyntax validates unisigned message syntax and state-independent invariants. // Used for bls messages included in blocks. -func (v *DefaultMessageSyntaxValidator) ValidateUnsignedMessageSyntax(ctx context.Context, msg *types.UnsignedMessage) error { +func (v *DefaultMessageSyntaxValidator) ValidateUnsignedMessageSyntax(ctx context.Context, msg *types.Message) error { buf := new(bytes.Buffer) err := msg.MarshalCBOR(buf) if err != nil { @@ -84,7 +84,7 @@ func (v *DefaultMessageSyntaxValidator) ValidateUnsignedMessageSyntax(ctx contex return v.validateMessageSyntaxShared(ctx, msg, int64(buf.Len())) } -func (v *DefaultMessageSyntaxValidator) validateMessageSyntaxShared(ctx context.Context, msg *types.UnsignedMessage, msgLen int64) error { +func (v *DefaultMessageSyntaxValidator) validateMessageSyntaxShared(ctx context.Context, msg *types.Message, msgLen int64) error { if msg.Version != types.MessageVersion { return fmt.Errorf("version %d, expected %d", msg.Version, types.MessageVersion) } diff --git a/pkg/consensus/message_validator_test.go b/pkg/consensus/message_validator_test.go index 29040e0de8..ade771b464 100644 --- a/pkg/consensus/message_validator_test.go +++ b/pkg/consensus/message_validator_test.go @@ -6,6 +6,8 @@ import ( "testing" "github.com/filecoin-project/venus/pkg/constants" + "github.com/filecoin-project/venus/pkg/testhelpers" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" "github.com/stretchr/testify/assert" @@ -21,10 +23,9 @@ import ( _ "github.com/filecoin-project/venus/pkg/crypto/secp" "github.com/filecoin-project/venus/pkg/state" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" ) -var keys = types.MustGenerateKeyInfo(2, 42) +var keys = testhelpers.MustGenerateKeyInfo(2, 42) var addresses = make([]address.Address, len(keys)) var methodID = abi.MethodNum(21231) @@ -45,10 +46,10 @@ func TestBLSSignatureValidationConfiguration(t *testing.T) { from, err := address.NewBLSAddress(pubKey[:]) require.NoError(t, err) - msg := types.NewMeteredMessage(from, addresses[1], 0, types.ZeroFIL, methodID, []byte("params"), types.NewGasFeeCap(1), types.NewGasPremium(1), 300) + msg := testhelpers.NewMeteredMessage(from, addresses[1], 0, types.ZeroFIL, methodID, []byte("params"), types.NewGasFeeCap(1), types.NewGasPremium(1), 300) mmsgCid := msg.Cid() - var signer = types.NewMockSigner(keys) + var signer = testhelpers.NewMockSigner(keys) signer.AddrKeyInfo[msg.From] = keys[0] sig, err := signer.SignBytes(ctx, mmsgCid.Bytes(), msg.From) require.NoError(t, err) @@ -71,7 +72,7 @@ func TestBLSSignatureValidationConfiguration(t *testing.T) { func TestMessageSyntaxValidator(t *testing.T) { tf.UnitTest(t) - var signer = types.NewMockSigner(keys) + var signer = testhelpers.NewMockSigner(keys) alice := addresses[0] bob := addresses[1] @@ -79,25 +80,25 @@ func TestMessageSyntaxValidator(t *testing.T) { ctx := context.Background() t.Run("Actor not found is not an error", func(t *testing.T) { - msg, err := types.NewSignedMessage(ctx, *newMessage(t, bob, alice, 0, 0, 1, 5000), signer) + msg, err := testhelpers.NewSignedMessage(ctx, *newMessage(t, bob, alice, 0, 0, 1, 5000), signer) require.NoError(t, err) assert.NoError(t, validator.ValidateSignedMessageSyntax(ctx, msg)) }) t.Run("self send passes", func(t *testing.T) { - msg, err := types.NewSignedMessage(ctx, *newMessage(t, alice, alice, 100, 5, 1, 5000), signer) + msg, err := testhelpers.NewSignedMessage(ctx, *newMessage(t, alice, alice, 100, 5, 1, 5000), signer) require.NoError(t, err) assert.NoError(t, validator.ValidateSignedMessageSyntax(ctx, msg), "self") }) t.Run("negative value fails", func(t *testing.T) { - msg, err := types.NewSignedMessage(ctx, *newMessage(t, alice, alice, 100, -5, 1, 5000), signer) + msg, err := testhelpers.NewSignedMessage(ctx, *newMessage(t, alice, alice, 100, -5, 1, 5000), signer) require.NoError(t, err) assert.Errorf(t, validator.ValidateSignedMessageSyntax(ctx, msg), "negative") }) t.Run("block gas limit fails", func(t *testing.T) { - msg, err := types.NewSignedMessage(ctx, *newMessage(t, alice, bob, 100, 5, 1, constants.BlockGasLimit+1), signer) + msg, err := testhelpers.NewSignedMessage(ctx, *newMessage(t, alice, bob, 100, 5, 1, constants.BlockGasLimit+1), signer) require.NoError(t, err) assert.Errorf(t, validator.ValidateSignedMessageSyntax(ctx, msg), "block limit") }) @@ -111,14 +112,14 @@ func newActor(t *testing.T, balanceAF int, nonce uint64) *types.Actor { } func newMessage(t *testing.T, from, to address.Address, nonce uint64, valueAF int, - gasPrice int64, gasLimit int64) *types.UnsignedMessage { - val, ok := types.NewAttoFILFromString(fmt.Sprintf("%d", valueAF), 10) - require.True(t, ok, "invalid attofil") - return types.NewMeteredMessage( + gasPrice int64, gasLimit int64) *types.Message { + val, err := types.ParseFIL(fmt.Sprintf("%d", valueAF)) + require.Nil(t, err, "invalid attofil") + return testhelpers.NewMeteredMessage( from, to, nonce, - val, + abi.TokenAmount{Int: val.Int}, methodID, []byte("params"), types.NewGasFeeCap(gasPrice), @@ -145,12 +146,12 @@ func NewMockIngestionValidatorAPI() *FakeIngestionValidatorAPI { } func (api *FakeIngestionValidatorAPI) GetHead() *types.TipSet { - ts, _ := types.NewTipSet(api.Block) + ts, _ := types.NewTipSet([]*types.BlockHeader{api.Block}) return ts } func (api *FakeIngestionValidatorAPI) GetTipSet(key types.TipSetKey) (*types.TipSet, error) { - return types.NewTipSet(api.Block) + return types.NewTipSet([]*types.BlockHeader{api.Block}) } func (api *FakeIngestionValidatorAPI) GetActorAt(ctx context.Context, key *types.TipSet, a address.Address) (*types.Actor, error) { diff --git a/pkg/consensus/processor.go b/pkg/consensus/processor.go index 7e1e71d082..aa69caef6b 100644 --- a/pkg/consensus/processor.go +++ b/pkg/consensus/processor.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/metrics/tracing" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/venus/pkg/vm" ) @@ -73,7 +73,7 @@ func (p *DefaultProcessor) ProcessTipSet(ctx context.Context, } //ProcessImplicitMessage compute the state of specify message but this functions skip value, gas,check -func (p *DefaultProcessor) ProcessImplicitMessage(ctx context.Context, msg *types.UnsignedMessage, vmOption vm.VmOption) (ret *vm.Ret, err error) { +func (p *DefaultProcessor) ProcessImplicitMessage(ctx context.Context, msg *types.Message, vmOption vm.VmOption) (ret *vm.Ret, err error) { ctx, span := trace.StartSpan(ctx, "DefaultProcessor.ProcessImplicitMessage") span.AddAttributes(trace.StringAttribute("message", msg.String())) defer tracing.AddErrorEndSpan(ctx, span, &err) diff --git a/pkg/consensus/protocol.go b/pkg/consensus/protocol.go index 7840152b00..612878f864 100644 --- a/pkg/consensus/protocol.go +++ b/pkg/consensus/protocol.go @@ -11,9 +11,9 @@ package consensus // except for errors in the case the stores do not have a mapping. import ( "context" - "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/ipfs/go-cid" ) // Protocol is an interface defining a blockchain consensus protocol. The @@ -25,10 +25,10 @@ import ( type Protocol interface { StateTransformer // Call compute message result of specify message - Call(ctx context.Context, msg *types.UnsignedMessage, ts *types.TipSet) (*vm.Ret, error) + Call(ctx context.Context, msg *types.Message, ts *types.TipSet) (*vm.Ret, error) // CallWithGas compute message result of specify message base on messages in mpool - CallWithGas(ctx context.Context, msg *types.UnsignedMessage, priorMsgs []types.ChainMsg, ts *types.TipSet) (*vm.Ret, error) + CallWithGas(ctx context.Context, msg *types.Message, priorMsgs []types.ChainMsg, ts *types.TipSet) (*vm.Ret, error) } */ diff --git a/pkg/consensus/testing.go b/pkg/consensus/testing.go index 6af8cf86cf..1e0a8d9145 100644 --- a/pkg/consensus/testing.go +++ b/pkg/consensus/testing.go @@ -11,13 +11,13 @@ import ( "github.com/stretchr/testify/require" "github.com/filecoin-project/venus/pkg/state" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // RequireNewTipSet instantiates and returns a new tipset of the given blocks // and requires that the setup validation succeed. func RequireNewTipSet(require *require.Assertions, blks ...*types.BlockHeader) *types.TipSet { - ts, err := types.NewTipSet(blks...) + ts, err := types.NewTipSet(blks) require.NoError(err) return ts } @@ -44,7 +44,7 @@ func (mv *FakeMessageValidator) ValidateSignedMessageSyntax(ctx context.Context, return nil } -func (mv *FakeMessageValidator) ValidateUnsignedMessageSyntax(ctx context.Context, msg *types.UnsignedMessage) error { +func (mv *FakeMessageValidator) ValidateUnsignedMessageSyntax(ctx context.Context, msg *types.Message) error { return nil } @@ -53,7 +53,7 @@ type FakeTicketMachine struct{} // MakeTicket returns a fake ticket func (ftm *FakeTicketMachine) MakeTicket(ctx context.Context, base types.TipSetKey, epoch abi.ChainEpoch, miner address.Address, entry *types.BeaconEntry, newPeriod bool, worker address.Address, signer types.Signer) (types.Ticket, error) { - return MakeFakeTicketForTest(), nil + return *MakeFakeTicketForTest(), nil } // IsValidTicket always returns true @@ -72,11 +72,11 @@ func (ftv *FailingTicketValidator) IsValidTicket(ctx context.Context, base types } // MakeFakeTicketForTest creates a fake ticket -func MakeFakeTicketForTest() types.Ticket { +func MakeFakeTicketForTest() *types.Ticket { val := make([]byte, 65) val[0] = 200 - return types.Ticket{ - VRFProof: types.VRFPi(val[:]), + return &types.Ticket{ + VRFProof: val[:], } } diff --git a/pkg/consensus/ticket.go b/pkg/consensus/ticket.go index 2aace0bd28..e3c3a9c830 100644 --- a/pkg/consensus/ticket.go +++ b/pkg/consensus/ticket.go @@ -13,7 +13,7 @@ import ( "github.com/pkg/errors" "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type ChainSampler interface { diff --git a/pkg/consensus/ticket_test.go b/pkg/consensus/ticket_test.go index c8fac27038..39b0685763 100644 --- a/pkg/consensus/ticket_test.go +++ b/pkg/consensus/ticket_test.go @@ -2,9 +2,13 @@ package consensus_test import ( "context" - "github.com/filecoin-project/venus/pkg/constants" "testing" + "github.com/filecoin-project/venus/pkg/testhelpers" + + "github.com/filecoin-project/venus/pkg/constants" + types "github.com/filecoin-project/venus/venus-shared/chain" + fbig "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-address" @@ -16,21 +20,20 @@ import ( tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/pkg/consensus" - "github.com/filecoin-project/venus/pkg/types" ) func TestGenValidTicketChain(t *testing.T) { tf.UnitTest(t) ctx := context.Background() - head, _ := types.NewTipSet(mockBlock()) // Tipset key is unused by fake randomness + head, _ := types.NewTipSet([]*types.BlockHeader{mockBlock()}) // Tipset key is unused by fake randomness loader := newMockTipsetLoader(head) // Interleave 3 signers - kis := types.MustGenerateBLSKeyInfo(3, 0) + kis := testhelpers.MustGenerateBLSKeyInfo(3, 0) miner, err := address.NewIDAddress(uint64(1)) require.NoError(t, err) - signer := types.NewMockSigner(kis) + signer := testhelpers.NewMockSigner(kis) addr1 := requireAddress(t, &kis[0]) addr2 := requireAddress(t, &kis[1]) addr3 := requireAddress(t, &kis[2]) @@ -62,13 +65,13 @@ func requireValidTicket(ctx context.Context, t *testing.T, tm *consensus.TicketM func TestNextTicketFailsWithInvalidSigner(t *testing.T) { ctx := context.Background() - head, _ := types.NewTipSet(mockBlock()) // Tipset key is unused by fake randomness + head, _ := types.NewTipSet([]*types.BlockHeader{mockBlock()}) // Tipset key is unused by fake randomness loader := newMockTipsetLoader(head) miner, err := address.NewIDAddress(uint64(1)) require.NoError(t, err) - signer, _ := types.NewMockSignersAndKeyInfo(1) - badAddr := types.RequireIDAddress(t, 100) + signer, _ := testhelpers.NewMockSignersAndKeyInfo(1) + badAddr := testhelpers.RequireIDAddress(t, 100) tm := consensus.NewTicketMachine(loader) electionEntry := &types.BeaconEntry{} newPeriod := false @@ -86,10 +89,10 @@ func requireAddress(t *testing.T, ki *crypto.KeyInfo) address.Address { func mockBlock() *types.BlockHeader { mockCid, _ := constants.DefaultCidBuilder.Sum([]byte("mock")) return &types.BlockHeader{ - Miner: types.NewForTestGetter()(), - Ticket: types.Ticket{VRFProof: []byte{0x01, 0x02, 0x03}}, + Miner: testhelpers.NewForTestGetter()(), + Ticket: &types.Ticket{VRFProof: []byte{0x01, 0x02, 0x03}}, ElectionProof: &types.ElectionProof{VRFProof: []byte{0x0a, 0x0b}}, - BeaconEntries: []*types.BeaconEntry{ + BeaconEntries: []types.BeaconEntry{ { Round: 5, Data: []byte{0x0c}, diff --git a/pkg/consensus/weight_test.go b/pkg/consensus/weight_test.go index 9a6f9ffd65..ff299c7fdd 100644 --- a/pkg/consensus/weight_test.go +++ b/pkg/consensus/weight_test.go @@ -2,10 +2,12 @@ package consensus_test import ( "context" - emptycid "github.com/filecoin-project/venus/pkg/testhelpers/empty_cid" - "github.com/filecoin-project/venus/pkg/types" "testing" + "github.com/filecoin-project/venus/pkg/testhelpers" + + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/go-state-types/abi" fbig "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" @@ -24,13 +26,13 @@ func TestWeight(t *testing.T) { fakeTree := tree.NewFromString(t, "test-Weight-StateCid", cst) fakeRoot, err := fakeTree.Flush(ctx) require.NoError(t, err) - addrGetter := types.NewForTestGetter() + addrGetter := testhelpers.NewForTestGetter() minerAddr := addrGetter() // We only care about total power for the weight function // Total is 16, so bitlen is 5, log2b is 4 viewer := makeStateViewer(fakeRoot, abi.NewStoragePower(16)) ticket := consensus.MakeFakeTicketForTest() - toWeigh := types.RequireNewTipSet(t, &types.BlockHeader{ + toWeigh := testhelpers.RequireNewTipSet(t, &types.BlockHeader{ Miner: minerAddr, ParentWeight: fbig.Zero(), Ticket: ticket, @@ -38,8 +40,8 @@ func TestWeight(t *testing.T) { WinCount: 1, }, ParentStateRoot: fakeRoot, - Messages: emptycid.EmptyMessagesCID, - ParentMessageReceipts: emptycid.EmptyReceiptsCID, + Messages: testhelpers.EmptyMessagesCID, + ParentMessageReceipts: testhelpers.EmptyReceiptsCID, }) sel := consensus.NewChainSelector(cst, &viewer) @@ -80,7 +82,7 @@ func TestWeight(t *testing.T) { t.Run("non-zero parent weight", func(t *testing.T) { parentWeight := fbig.NewInt(int64(49)) - toWeighWithParent := types.RequireNewTipSet(t, &types.BlockHeader{ + toWeighWithParent := testhelpers.RequireNewTipSet(t, &types.BlockHeader{ Miner: minerAddr, ParentWeight: parentWeight, Ticket: ticket, @@ -88,8 +90,8 @@ func TestWeight(t *testing.T) { WinCount: 1, }, ParentStateRoot: fakeRoot, - Messages: emptycid.EmptyMessagesCID, - ParentMessageReceipts: emptycid.EmptyReceiptsCID, + Messages: testhelpers.EmptyMessagesCID, + ParentMessageReceipts: testhelpers.EmptyReceiptsCID, }) // 49 + (4*256) + (4*1*1*256/2*5) = 1175 @@ -99,7 +101,7 @@ func TestWeight(t *testing.T) { }) t.Run("many blocks", func(t *testing.T) { - toWeighThreeBlock := types.RequireNewTipSet(t, + toWeighThreeBlock := testhelpers.RequireNewTipSet(t, &types.BlockHeader{ Miner: minerAddr, ParentWeight: fbig.Zero(), @@ -109,8 +111,8 @@ func TestWeight(t *testing.T) { WinCount: 1, }, ParentStateRoot: fakeRoot, - Messages: emptycid.EmptyMessagesCID, - ParentMessageReceipts: emptycid.EmptyReceiptsCID, + Messages: testhelpers.EmptyMessagesCID, + ParentMessageReceipts: testhelpers.EmptyReceiptsCID, }, &types.BlockHeader{ Miner: minerAddr, @@ -121,8 +123,8 @@ func TestWeight(t *testing.T) { WinCount: 1, }, ParentStateRoot: fakeRoot, - Messages: emptycid.EmptyMessagesCID, - ParentMessageReceipts: emptycid.EmptyReceiptsCID, + Messages: testhelpers.EmptyMessagesCID, + ParentMessageReceipts: testhelpers.EmptyReceiptsCID, }, &types.BlockHeader{ Miner: minerAddr, @@ -133,8 +135,8 @@ func TestWeight(t *testing.T) { WinCount: 1, }, ParentStateRoot: fakeRoot, - Messages: emptycid.EmptyMessagesCID, - ParentMessageReceipts: emptycid.EmptyReceiptsCID, + Messages: testhelpers.EmptyMessagesCID, + ParentMessageReceipts: testhelpers.EmptyReceiptsCID, }, ) // 0 + (4*256) + (4*3*1*256/2*5) = 1331 diff --git a/pkg/consensusfault/check.go b/pkg/consensusfault/check.go index f76632912c..d59d14ec0e 100644 --- a/pkg/consensusfault/check.go +++ b/pkg/consensusfault/check.go @@ -9,13 +9,12 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/pkg/fork" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/pkg/vm/vmcontext" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/filecoin-project/venus/venus-shared/actors/policy" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" cbornode "github.com/ipfs/go-ipld-cbor" "github.com/filecoin-project/venus/pkg/config" @@ -101,7 +100,9 @@ func (s *ConsensusFaultChecker) VerifyConsensusFault(ctx context.Context, h1, h2 // Time-offset mining fault: two blocks with the same parent but different epochs. // The curEpoch check is redundant at time of writing, but included for robustness to future changes to this method. // The blocks have a common ancestor by definition (the parent). - if b1.Parents.Equals(b2.Parents) && b1.Height != b2.Height { + b1PKey := types.NewTipSetKey(b1.Parents...) + b2PKey := types.NewTipSetKey(b2.Parents...) + if b1PKey.Equals(b2PKey) && b1.Height != b2.Height { fault = &runtime5.ConsensusFault{ Target: b1.Miner, Epoch: b2.Height, @@ -117,7 +118,8 @@ func (s *ConsensusFaultChecker) VerifyConsensusFault(ctx context.Context, h1, h2 if innerErr != nil { return nil, errors.Wrapf(innerErr, "failed to decode extra") } - if b1.Height == b3.Height && b3.Parents.Equals(b1.Parents) && !b2.Parents.Has(b1.Cid()) && b2.Parents.Has(b3.Cid()) { + b3PKey := types.NewTipSetKey(b3.Parents...) + if b1.Height == b3.Height && b3PKey.Equals(b1PKey) && !b2PKey.Has(b1.Cid()) && b2PKey.Has(b3.Cid()) { fault = &runtime5.ConsensusFault{ Target: b1.Miner, Epoch: b2.Height, @@ -161,7 +163,7 @@ func verifyBlockSignature(ctx context.Context, blk types.BlockHeader, nv network return errors.Wrapf(err, "failed to get miner actor") } - mas, err := miner.Load(adt.WrapStore(ctx, gasIpld), (*types2.Actor)(act)) + mas, err := miner.Load(adt.WrapStore(ctx, gasIpld), act) if err != nil { return xerrors.Errorf("failed to load state for miner %s", receiver) } @@ -175,7 +177,11 @@ func verifyBlockSignature(ctx context.Context, blk types.BlockHeader, nv network return errors.Errorf("no consensus fault: block %s has nil signature", blk.Cid()) } - err = state.NewSignatureValidator(view).ValidateSignature(ctx, blk.SignatureData(), info.Worker, *blk.BlockSig) + sd, err := blk.SignatureData() + if err != nil { + return err + } + err = state.NewSignatureValidator(view).ValidateSignature(ctx, sd, info.Worker, *blk.BlockSig) if err != nil { return errors.Wrapf(err, "no consensus fault: block %s signature invalid", blk.Cid()) } diff --git a/pkg/discovery/cbor_gen.go b/pkg/discovery/cbor_gen.go index 713690136c..17579c33b3 100644 --- a/pkg/discovery/cbor_gen.go +++ b/pkg/discovery/cbor_gen.go @@ -30,7 +30,7 @@ func (t *HelloMessage) MarshalCBOR(w io.Writer) error { scratch := make([]byte, 9) - // t.HeaviestTipSetCids (internal.TipSetKey) (struct) + // t.HeaviestTipSetCids (chain.TipSetKey) (struct) if err := t.HeaviestTipSetCids.MarshalCBOR(w); err != nil { return err } @@ -78,7 +78,7 @@ func (t *HelloMessage) UnmarshalCBOR(r io.Reader) error { return fmt.Errorf("cbor input had wrong number of fields") } - // t.HeaviestTipSetCids (internal.TipSetKey) (struct) + // t.HeaviestTipSetCids (chain.TipSetKey) (struct) { diff --git a/pkg/discovery/hello_protocol.go b/pkg/discovery/hello_protocol.go index ea9fd20e55..5d45756c52 100644 --- a/pkg/discovery/hello_protocol.go +++ b/pkg/discovery/hello_protocol.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/chainsync/exchange" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/libp2p/go-libp2p-core/peer" "github.com/filecoin-project/go-state-types/abi" diff --git a/pkg/discovery/hello_protocol_test.go b/pkg/discovery/hello_protocol_test.go index dc9e1dc95a..ffc443aa65 100644 --- a/pkg/discovery/hello_protocol_test.go +++ b/pkg/discovery/hello_protocol_test.go @@ -2,12 +2,9 @@ package discovery_test import ( "context" - "github.com/filecoin-project/venus/pkg/types" "testing" "time" - "github.com/filecoin-project/venus/pkg/net" - "github.com/filecoin-project/venus/pkg/repo" ds "github.com/ipfs/go-datastore" "github.com/libp2p/go-libp2p-core/host" dht "github.com/libp2p/go-libp2p-kad-dht" @@ -21,8 +18,11 @@ import ( "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/discovery" + "github.com/filecoin-project/venus/pkg/net" + "github.com/filecoin-project/venus/pkg/repo" th "github.com/filecoin-project/venus/pkg/testhelpers" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type mockHelloCallback struct { diff --git a/pkg/discovery/peer_tracker.go b/pkg/discovery/peer_tracker.go index 4e10e2b54f..b2b318392b 100644 --- a/pkg/discovery/peer_tracker.go +++ b/pkg/discovery/peer_tracker.go @@ -4,8 +4,7 @@ import ( "sort" "sync" - "github.com/filecoin-project/venus/pkg/types" - + types "github.com/filecoin-project/venus/venus-shared/chain" logging "github.com/ipfs/go-log/v2" "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" diff --git a/pkg/discovery/peer_tracker_test.go b/pkg/discovery/peer_tracker_test.go index a015e8cbec..39134395e0 100644 --- a/pkg/discovery/peer_tracker_test.go +++ b/pkg/discovery/peer_tracker_test.go @@ -2,12 +2,13 @@ package discovery_test import ( "context" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/util/test" - "github.com/libp2p/go-libp2p-core/network" "testing" "time" + "github.com/filecoin-project/venus/pkg/util/test" + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/libp2p/go-libp2p-core/network" + "github.com/filecoin-project/venus/pkg/discovery" "github.com/libp2p/go-libp2p-core/peer" mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" diff --git a/pkg/events/cache.go b/pkg/events/cache.go index 88adff2966..3d742ccade 100644 --- a/pkg/events/cache.go +++ b/pkg/events/cache.go @@ -9,13 +9,14 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/pkg/chain" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type uncachedAPI interface { ChainNotify(context.Context) <-chan []*chain.HeadChange ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*chain.HeadChange, error) - StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*chain.MsgLookup, error) + StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) // optional / for CalledMsg diff --git a/pkg/events/eventAPI.go b/pkg/events/eventAPI.go index c7d7c6255f..bacefbf0a9 100644 --- a/pkg/events/eventAPI.go +++ b/pkg/events/eventAPI.go @@ -7,9 +7,9 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/chain" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // A TipSetObserver receives notifications of tipsets diff --git a/pkg/events/events.go b/pkg/events/events.go index b991a0a007..5f3daf222e 100644 --- a/pkg/events/events.go +++ b/pkg/events/events.go @@ -7,7 +7,7 @@ import ( logging "github.com/ipfs/go-log/v2" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var log = logging.Logger("events") diff --git a/pkg/events/events_called.go b/pkg/events/events_called.go index 896a4e32a2..b747dc35ac 100644 --- a/pkg/events/events_called.go +++ b/pkg/events/events_called.go @@ -10,7 +10,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) const NoTimeout = math.MaxInt64 diff --git a/pkg/events/events_height.go b/pkg/events/events_height.go index 81b4ee0cb3..8099db498d 100644 --- a/pkg/events/events_height.go +++ b/pkg/events/events_height.go @@ -4,9 +4,8 @@ import ( "context" "sync" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/go-state-types/abi" + types "github.com/filecoin-project/venus/venus-shared/chain" "go.opencensus.io/trace" "golang.org/x/xerrors" ) diff --git a/pkg/events/events_test.go b/pkg/events/events_test.go index 74e46de623..a2141cb737 100644 --- a/pkg/events/events_test.go +++ b/pkg/events/events_test.go @@ -18,11 +18,11 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/constants" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var dummyCid cid.Cid @@ -144,7 +144,7 @@ func (fcs *fakeCS) ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*ty return fcs.tipsets[key], nil } -func (fcs *fakeCS) StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*chain.MsgLookup, error) { +func (fcs *fakeCS) StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) { fcs.mu.Lock() defer fcs.mu.Unlock() fcs.callNumber["StateSearchMsg"] = fcs.callNumber["StateSearchMsg"] + 1 @@ -181,9 +181,9 @@ func (fcs *fakeCS) makeTs(t *testing.T, parents []cid.Cid, h abi.ChainEpoch, msg Height: h, Miner: a, - Parents: types.NewTipSetKey(parents...), + Parents: parents, - Ticket: types.Ticket{VRFProof: []byte{byte(h % 2)}}, + Ticket: &types.Ticket{VRFProof: []byte{byte(h % 2)}}, ParentStateRoot: dummyCid, Messages: msgcid, @@ -196,9 +196,9 @@ func (fcs *fakeCS) makeTs(t *testing.T, parents []cid.Cid, h abi.ChainEpoch, msg Height: h, Miner: b, - Parents: types.NewTipSetKey(parents...), + Parents: parents, - Ticket: types.Ticket{VRFProof: []byte{byte((h + 1) % 2)}}, + Ticket: &types.Ticket{VRFProof: []byte{byte((h + 1) % 2)}}, ParentStateRoot: dummyCid, Messages: msgcid, @@ -207,7 +207,7 @@ func (fcs *fakeCS) makeTs(t *testing.T, parents []cid.Cid, h abi.ChainEpoch, msg BlockSig: &crypto.Signature{Type: crypto.SigTypeBLS}, BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS}, }, - }...) + }) if fcs.tipsets == nil { fcs.tipsets = map[types.TipSetKey]*types.TipSet{} diff --git a/pkg/events/message_cache.go b/pkg/events/message_cache.go index 9f866bed18..266fe390cb 100644 --- a/pkg/events/message_cache.go +++ b/pkg/events/message_cache.go @@ -7,7 +7,7 @@ import ( lru "github.com/hashicorp/golang-lru" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/app/submodule/apitypes" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" ) type messageCache struct { diff --git a/pkg/events/observer.go b/pkg/events/observer.go index 8f0a675798..50fc261afb 100644 --- a/pkg/events/observer.go +++ b/pkg/events/observer.go @@ -11,7 +11,7 @@ import ( "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var ObserveDuration = time.Second * 45 diff --git a/pkg/events/state/fastapi.go b/pkg/events/state/fastapi.go index f329bcf5a0..622695ba65 100644 --- a/pkg/events/state/fastapi.go +++ b/pkg/events/state/fastapi.go @@ -4,8 +4,7 @@ import ( "context" "github.com/filecoin-project/go-address" - - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type FastChainAPI interface { diff --git a/pkg/events/state/mock/api.go b/pkg/events/state/mock/api.go index 23023f14b9..dd8e6ed3a0 100644 --- a/pkg/events/state/mock/api.go +++ b/pkg/events/state/mock/api.go @@ -9,8 +9,8 @@ import ( "github.com/ipfs/go-cid" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types" blockstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type MockAPI struct { diff --git a/pkg/events/state/mock/tipset.go b/pkg/events/state/mock/tipset.go index 04b7d7e7f5..1efda23e52 100644 --- a/pkg/events/state/mock/tipset.go +++ b/pkg/events/state/mock/tipset.go @@ -3,7 +3,7 @@ package test import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" ) @@ -23,5 +23,5 @@ func MockTipset(minerAddr address.Address, timestamp uint64) (*types.TipSet, err BlockSig: &crypto.Signature{Type: crypto.SigTypeBLS}, BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS}, Timestamp: timestamp, - }}...) + }}) } diff --git a/pkg/events/state/predicates.go b/pkg/events/state/predicates.go index 2d1f7c29a5..b83cdd08df 100644 --- a/pkg/events/state/predicates.go +++ b/pkg/events/state/predicates.go @@ -10,13 +10,12 @@ import ( "github.com/filecoin-project/venus/app/submodule/chain" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/adt" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // UserData is the data returned from the DiffTipSetKeyFunc @@ -73,11 +72,11 @@ type DiffStorageMarketStateFunc func(ctx context.Context, oldState market.State, // OnStorageMarketActorChanged calls diffStorageMarketState when the state changes for the market actor func (sp *StatePredicates) OnStorageMarketActorChanged(diffStorageMarketState DiffStorageMarketStateFunc) DiffTipSetKeyFunc { return sp.OnActorStateChanged(market.Address, func(ctx context.Context, oldActorState, newActorState *types.Actor) (changed bool, user UserData, err error) { - oldState, err := market.Load(adt.WrapStore(ctx, sp.cst), (*types2.Actor)(oldActorState)) + oldState, err := market.Load(adt.WrapStore(ctx, sp.cst), oldActorState) if err != nil { return false, nil, err } - newState, err := market.Load(adt.WrapStore(ctx, sp.cst), (*types2.Actor)(newActorState)) + newState, err := market.Load(adt.WrapStore(ctx, sp.cst), newActorState) if err != nil { return false, nil, err } @@ -309,11 +308,11 @@ type DiffMinerActorStateFunc func(ctx context.Context, oldState miner.State, new func (sp *StatePredicates) OnInitActorChange(diffInitActorState DiffInitActorStateFunc) DiffTipSetKeyFunc { return sp.OnActorStateChanged(init_.Address, func(ctx context.Context, oldActorState, newActorState *types.Actor) (changed bool, user UserData, err error) { - oldState, err := init_.Load(adt.WrapStore(ctx, sp.cst), (*types2.Actor)(oldActorState)) + oldState, err := init_.Load(adt.WrapStore(ctx, sp.cst), oldActorState) if err != nil { return false, nil, err } - newState, err := init_.Load(adt.WrapStore(ctx, sp.cst), (*types2.Actor)(newActorState)) + newState, err := init_.Load(adt.WrapStore(ctx, sp.cst), newActorState) if err != nil { return false, nil, err } @@ -324,11 +323,11 @@ func (sp *StatePredicates) OnInitActorChange(diffInitActorState DiffInitActorSta func (sp *StatePredicates) OnMinerActorChange(minerAddr address.Address, diffMinerActorState DiffMinerActorStateFunc) DiffTipSetKeyFunc { return sp.OnActorStateChanged(minerAddr, func(ctx context.Context, oldActorState, newActorState *types.Actor) (changed bool, user UserData, err error) { - oldState, err := miner.Load(adt.WrapStore(ctx, sp.cst), (*types2.Actor)(oldActorState)) + oldState, err := miner.Load(adt.WrapStore(ctx, sp.cst), oldActorState) if err != nil { return false, nil, err } - newState, err := miner.Load(adt.WrapStore(ctx, sp.cst), (*types2.Actor)(newActorState)) + newState, err := miner.Load(adt.WrapStore(ctx, sp.cst), newActorState) if err != nil { return false, nil, err } @@ -372,11 +371,11 @@ type DiffPaymentChannelStateFunc func(ctx context.Context, oldState paych.State, // OnPaymentChannelActorChanged calls diffPaymentChannelState when the state changes for the the payment channel actor func (sp *StatePredicates) OnPaymentChannelActorChanged(paychAddr address.Address, diffPaymentChannelState DiffPaymentChannelStateFunc) DiffTipSetKeyFunc { return sp.OnActorStateChanged(paychAddr, func(ctx context.Context, oldActorState, newActorState *types.Actor) (changed bool, user UserData, err error) { - oldState, err := paych.Load(adt.WrapStore(ctx, sp.cst), (*types2.Actor)(oldActorState)) + oldState, err := paych.Load(adt.WrapStore(ctx, sp.cst), oldActorState) if err != nil { return false, nil, err } - newState, err := paych.Load(adt.WrapStore(ctx, sp.cst), (*types2.Actor)(newActorState)) + newState, err := paych.Load(adt.WrapStore(ctx, sp.cst), newActorState) if err != nil { return false, nil, err } diff --git a/pkg/events/state/predicates_test.go b/pkg/events/state/predicates_test.go index 9743cd689a..b30274bbf7 100644 --- a/pkg/events/state/predicates_test.go +++ b/pkg/events/state/predicates_test.go @@ -6,11 +6,10 @@ import ( test "github.com/filecoin-project/venus/pkg/events/state/mock" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" cbornode "github.com/ipfs/go-ipld-cbor" @@ -207,7 +206,7 @@ func TestMarketPredicates(t *testing.T) { marketState0 := test.CreateEmptyMarketState(t, store) marketCid, err := store.Put(ctx, marketState0) require.NoError(t, err) - marketState, err := market.Load(store, &types2.Actor{ + marketState, err := market.Load(store, &types.Actor{ Code: builtin2.StorageMarketActorCodeID, Head: marketCid, }) @@ -320,7 +319,7 @@ func TestMarketPredicates(t *testing.T) { marketState0 := test.CreateEmptyMarketState(t, store) marketCid, err := store.Put(ctx, marketState0) require.NoError(t, err) - marketState, err := market.Load(store, &types2.Actor{ + marketState, err := market.Load(store, &types.Actor{ Code: builtin2.StorageMarketActorCodeID, Head: marketCid, }) diff --git a/pkg/events/tscache.go b/pkg/events/tscache.go index 07dcb72fa2..d8cfaacd6f 100644 --- a/pkg/events/tscache.go +++ b/pkg/events/tscache.go @@ -5,9 +5,8 @@ import ( "sync" "github.com/filecoin-project/go-state-types/abi" + types "github.com/filecoin-project/venus/venus-shared/chain" "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types" ) type tsCacheAPI interface { diff --git a/pkg/events/tscache_test.go b/pkg/events/tscache_test.go index f3e216495a..0c47f2a9b0 100644 --- a/pkg/events/tscache_test.go +++ b/pkg/events/tscache_test.go @@ -11,7 +11,7 @@ import ( "github.com/stretchr/testify/require" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type tsCacheAPIFailOnStorageCall struct { @@ -67,8 +67,8 @@ func (h *cacheHarness) addWithParents(parents []cid.Cid) { ParentMessageReceipts: dummyCid, BlockSig: &crypto.Signature{Type: crypto.SigTypeBLS}, BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS}, - Parents: types.NewTipSetKey(parents...), - }}...) + Parents: parents, + }}) require.NoError(h.t, err) require.NoError(h.t, h.tsc.add(ts)) h.height++ @@ -209,8 +209,8 @@ func TestTsCacheSkip(t *testing.T) { BlockSig: &crypto.Signature{Type: crypto.SigTypeBLS}, BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS}, // With parents that don't match the last block. - Parents: types.EmptyTSK, - }}...) + Parents: types.EmptyTSK.Cids(), + }}) require.NoError(h.t, err) err = h.tsc.add(ts) require.Error(t, err) diff --git a/pkg/events/utils.go b/pkg/events/utils.go index 9023ac5e96..e9b62282f6 100644 --- a/pkg/events/utils.go +++ b/pkg/events/utils.go @@ -6,7 +6,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // CheckMsg convenience function for checking and matching messages diff --git a/pkg/fork/fork.go b/pkg/fork/fork.go index c20d8f5ef7..84b7973305 100644 --- a/pkg/fork/fork.go +++ b/pkg/fork/fork.go @@ -44,13 +44,12 @@ import ( "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/constants" vmstate "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" "github.com/filecoin-project/venus/venus-shared/actors/builtin/multisig" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var log = logging.Logger("fork") @@ -636,11 +635,11 @@ func (c *ChainFork) ParentState(ts *types.TipSet) cid.Cid { func (c *ChainFork) UpgradeFaucetBurnRecovery(ctx context.Context, cache MigrationCache, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { // Some initial parameters - FundsForMiners := types.NewAttoFILFromFIL(1_000_000) + FundsForMiners := types.FromFil(1_000_000) LookbackEpoch := abi.ChainEpoch(32000) - AccountCap := types.NewAttoFILFromFIL(0) - BaseMinerBalance := types.NewAttoFILFromFIL(20) - DesiredReimbursementBalance := types.NewAttoFILFromFIL(5_000_000) + AccountCap := types.FromFil(0) + BaseMinerBalance := types.FromFil(20) + DesiredReimbursementBalance := types.FromFil(5_000_000) isSystemAccount := func(addr address.Address) (bool, error) { id, err := address.IDFromAddress(addr) @@ -896,7 +895,7 @@ func (c *ChainFork) UpgradeFaucetBurnRecovery(ctx context.Context, cache Migrati return cid.Undef, xerrors.Errorf("checking final state balance failed: %v", err) } - exp := types.NewAttoFILFromFIL(constants.FilBase) + exp := types.FromFil(constants.FilBase) if !exp.Equals(total) { return cid.Undef, xerrors.Errorf("resultant state tree account balance was not correct: %s", total) } @@ -913,7 +912,7 @@ func setNetworkName(ctx context.Context, store adt.Store, tree *vmstate.State, n return xerrors.New("did not find init actor") } - initState, err := init_.Load(store, (*types2.Actor)(ia)) + initState, err := init_.Load(store, ia) if err != nil { return xerrors.Errorf("reading init state: %v", err) } @@ -942,7 +941,7 @@ func resetGenesisMsigs0(ctx context.Context, sm *ChainFork, store adt0.Store, tr return xerrors.Errorf("getting genesis block: %v", err) } - gts, err := types.NewTipSet(gb) + gts, err := types.NewTipSet([]*types.BlockHeader{gb}) if err != nil { return xerrors.Errorf("getting genesis tipset: %v", err) } @@ -1024,7 +1023,7 @@ func splitGenesisMultisig0(ctx context.Context, addr address.Address, store adt0 return xerrors.Errorf("did not find actor: %s", addr.String()) } - mst, err := multisig.Load(store, (*types2.Actor)(mact)) + mst, err := multisig.Load(store, mact) if err != nil { return xerrors.Errorf("getting msig state: %v", err) } @@ -1500,7 +1499,7 @@ func terminateActor(ctx context.Context, tree *vmstate.State, addr address.Addre return types.ErrActorNotFound } - ias, err := init_.Load(&vmstate.AdtStore{IpldStore: tree.Store}, (*types2.Actor)(ia)) + ias, err := init_.Load(&vmstate.AdtStore{IpldStore: tree.Store}, ia) if err != nil { return xerrors.Errorf("loading init actor state: %v", err) } diff --git a/pkg/fork/mock.go b/pkg/fork/mock.go index 711179768d..55402b4320 100644 --- a/pkg/fork/mock.go +++ b/pkg/fork/mock.go @@ -2,8 +2,9 @@ package fork import ( "context" + "github.com/filecoin-project/venus/pkg/config" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" diff --git a/pkg/gen/genesis/f00_system.go b/pkg/gen/genesis/f00_system.go index 19cf3432a9..eea94fcdb5 100644 --- a/pkg/gen/genesis/f00_system.go +++ b/pkg/gen/genesis/f00_system.go @@ -11,8 +11,8 @@ import ( cbor "github.com/ipfs/go-ipld-cbor" - "github.com/filecoin-project/venus/pkg/types" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + types "github.com/filecoin-project/venus/venus-shared/chain" ) func SetupSystemActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { diff --git a/pkg/gen/genesis/f01_init.go b/pkg/gen/genesis/f01_init.go index ae4746a7ba..27b5500886 100644 --- a/pkg/gen/genesis/f01_init.go +++ b/pkg/gen/genesis/f01_init.go @@ -15,10 +15,10 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" ) func SetupInitActor(ctx context.Context, bs bstore.Blockstore, netname string, initialActors []Actor, rootVerifier Actor, remainder Actor, av actors.Version) (int64, *types.Actor, map[address.Address]address.Address, error) { diff --git a/pkg/gen/genesis/f02_reward.go b/pkg/gen/genesis/f02_reward.go index d221f131d1..adfe1deb47 100644 --- a/pkg/gen/genesis/f02_reward.go +++ b/pkg/gen/genesis/f02_reward.go @@ -7,12 +7,12 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-state-types/big" cbor "github.com/ipfs/go-ipld-cbor" - "github.com/filecoin-project/venus/pkg/types" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" ) diff --git a/pkg/gen/genesis/f03_cron.go b/pkg/gen/genesis/f03_cron.go index 92bc48b2a1..7c36d58e51 100644 --- a/pkg/gen/genesis/f03_cron.go +++ b/pkg/gen/genesis/f03_cron.go @@ -10,8 +10,8 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin/cron" - "github.com/filecoin-project/venus/pkg/types" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + types "github.com/filecoin-project/venus/venus-shared/chain" ) func SetupCronActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { diff --git a/pkg/gen/genesis/f04_power.go b/pkg/gen/genesis/f04_power.go index 04a04dae4d..4a575d0390 100644 --- a/pkg/gen/genesis/f04_power.go +++ b/pkg/gen/genesis/f04_power.go @@ -11,8 +11,8 @@ import ( cbor "github.com/ipfs/go-ipld-cbor" - "github.com/filecoin-project/venus/pkg/types" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + types "github.com/filecoin-project/venus/venus-shared/chain" ) func SetupStoragePowerActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { diff --git a/pkg/gen/genesis/f05_market.go b/pkg/gen/genesis/f05_market.go index 84909f30a1..0f470614be 100644 --- a/pkg/gen/genesis/f05_market.go +++ b/pkg/gen/genesis/f05_market.go @@ -10,8 +10,8 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" - "github.com/filecoin-project/venus/pkg/types" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + types "github.com/filecoin-project/venus/venus-shared/chain" ) func SetupStorageMarketActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { diff --git a/pkg/gen/genesis/f06_vreg.go b/pkg/gen/genesis/f06_vreg.go index 0f3e44a8e1..329c43b7e5 100644 --- a/pkg/gen/genesis/f06_vreg.go +++ b/pkg/gen/genesis/f06_vreg.go @@ -13,8 +13,8 @@ import ( "github.com/filecoin-project/specs-actors/actors/util/adt" - "github.com/filecoin-project/venus/pkg/types" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var RootVerifierID address.Address diff --git a/pkg/gen/genesis/genesis.go b/pkg/gen/genesis/genesis.go index 478ec83f7b..7c6abe4bdd 100644 --- a/pkg/gen/genesis/genesis.go +++ b/pkg/gen/genesis/genesis.go @@ -10,6 +10,7 @@ import ( "github.com/filecoin-project/venus/pkg/fork" "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" "github.com/filecoin-project/venus/pkg/vmsupport" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/vm/gas" @@ -58,7 +59,6 @@ import ( "github.com/filecoin-project/venus/pkg/chain" sigs "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/repo" - "github.com/filecoin-project/venus/pkg/types" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/pkg/vm" ) @@ -589,9 +589,9 @@ func MakeGenesisBlock(ctx context.Context, rep repo.Repo, bs bstore.Blockstore, return nil, xerrors.Errorf("amt build failed: %w", err) } - mm := &types.TxMeta{ - BLSRoot: emptyroot, - SecpRoot: emptyroot, + mm := &types.MessageRoot{ + BlsRoot: emptyroot, + SecpkRoot: emptyroot, } mmb, err := mm.ToStorageBlock() if err != nil { @@ -605,7 +605,7 @@ func MakeGenesisBlock(ctx context.Context, rep repo.Repo, bs bstore.Blockstore, tickBuf := make([]byte, 32) _, _ = rand.Read(tickBuf) - genesisticket := types.Ticket{ + genesisticket := &types.Ticket{ VRFProof: tickBuf, } @@ -634,7 +634,7 @@ func MakeGenesisBlock(ctx context.Context, rep repo.Repo, bs bstore.Blockstore, b := &types.BlockHeader{ Miner: system.Address, Ticket: genesisticket, - Parents: types.NewTipSetKey(filecoinGenesisCid), + Parents: types.NewTipSetKey(filecoinGenesisCid).Cids(), Height: 0, ParentWeight: types.NewInt(0), ParentStateRoot: stateroot, @@ -644,7 +644,7 @@ func MakeGenesisBlock(ctx context.Context, rep repo.Repo, bs bstore.Blockstore, BlockSig: nil, Timestamp: template.Timestamp, ElectionProof: new(types.ElectionProof), - BeaconEntries: []*types.BeaconEntry{ + BeaconEntries: []types.BeaconEntry{ { Round: 0, Data: make([]byte, 32), diff --git a/pkg/gen/genesis/miners.go b/pkg/gen/genesis/miners.go index dfeadeaf6b..d63d40809f 100644 --- a/pkg/gen/genesis/miners.go +++ b/pkg/gen/genesis/miners.go @@ -19,7 +19,6 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/policy" "github.com/filecoin-project/venus/venus-shared/actors/adt" - types2 "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-state-types/network" @@ -50,12 +49,12 @@ import ( "github.com/filecoin-project/venus/pkg/consensusfault" "github.com/filecoin-project/venus/pkg/fork" "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/pkg/vm/gas" "github.com/filecoin-project/venus/pkg/vm/vmcontext" "github.com/filecoin-project/venus/pkg/vmsupport" + types "github.com/filecoin-project/venus/venus-shared/chain" ) func MinerAddress(genesisIndex uint64) address.Address { @@ -179,7 +178,7 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min return cid.Undef, xerrors.New("actor not found") } - mst, err := miner.Load(adt.WrapStore(ctx, cst), (*types2.Actor)(mact)) + mst, err := miner.Load(adt.WrapStore(ctx, cst), mact) if err != nil { return cid.Undef, xerrors.Errorf("getting newly created miner state: %w", err) } @@ -287,7 +286,7 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min return cid.Undef, xerrors.New("power actor not exist") } - pst, err := power.Load(adt.WrapStore(ctx, cst), (*types2.Actor)(pact)) + pst, err := power.Load(adt.WrapStore(ctx, cst), pact) if err != nil { return cid.Undef, xerrors.Errorf("getting power state: %w", err) } @@ -370,7 +369,7 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min return cid.Undef, xerrors.New("power actor not exist") } - pst, err := power.Load(adt.WrapStore(ctx, cst), (*types2.Actor)(pact)) + pst, err := power.Load(adt.WrapStore(ctx, cst), pact) if err != nil { return cid.Undef, xerrors.Errorf("getting power state: %w", err) } @@ -477,7 +476,7 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min return cid.Undef, xerrors.New("actor not found") } - mst, err := miner.Load(adt.WrapStore(ctx, cst), (*types2.Actor)(mact)) + mst, err := miner.Load(adt.WrapStore(ctx, cst), mact) if err != nil { return cid.Undef, xerrors.Errorf("getting miner state: %w", err) } @@ -515,7 +514,7 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min return cid.Undef, xerrors.New("actor not found") } - pst, err := power.Load(adt.WrapStore(ctx, cst), (*types2.Actor)(pact)) + pst, err := power.Load(adt.WrapStore(ctx, cst), pact) if err != nil { return cid.Undef, xerrors.Errorf("getting power state: %w", err) } diff --git a/pkg/gen/genesis/util.go b/pkg/gen/genesis/util.go index fb68840879..4fdf2ccffc 100644 --- a/pkg/gen/genesis/util.go +++ b/pkg/gen/genesis/util.go @@ -9,9 +9,9 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/venus-shared/actors" + types "github.com/filecoin-project/venus/venus-shared/chain" ) func mustEnc(i cbg.CBORMarshaler) []byte { @@ -32,7 +32,7 @@ func doExecValue(ctx context.Context, vmi vm.Interpreter, to, from address.Addre return nil, xerrors.Errorf("actor (%s) not found", from) } - ret, err := vmi.ApplyImplicitMessage(&types.UnsignedMessage{ + ret, err := vmi.ApplyImplicitMessage(&types.Message{ To: to, From: from, Method: method, @@ -49,5 +49,5 @@ func doExecValue(ctx context.Context, vmi vm.Interpreter, to, from address.Addre return nil, xerrors.Errorf("failed to call method: %w", ret.Receipt.String()) } - return ret.Receipt.ReturnValue, nil + return ret.Receipt.Return, nil } diff --git a/pkg/genesis/genesis.go b/pkg/genesis/genesis.go index f0204272d5..7987c86b1d 100644 --- a/pkg/genesis/genesis.go +++ b/pkg/genesis/genesis.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "fmt" - "github.com/filecoin-project/venus/pkg/types" "io/ioutil" "os" @@ -31,6 +30,7 @@ import ( "github.com/filecoin-project/venus/pkg/state/tree" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/pkg/vm" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var glog = logging.Logger("genesis") diff --git a/pkg/genesis/init.go b/pkg/genesis/init.go index a14ea831df..7c2b4f66c8 100644 --- a/pkg/genesis/init.go +++ b/pkg/genesis/init.go @@ -3,9 +3,10 @@ package genesis import ( "context" "encoding/json" + "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/config" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" bstore "github.com/ipfs/go-ipfs-blockstore" cbor "github.com/ipfs/go-ipld-cbor" @@ -23,7 +24,7 @@ func Init(ctx context.Context, r repo.Repo, bs bstore.Blockstore, cst cbor.IpldS if err != nil { return nil, err } - genTipSet, err := types.NewTipSet(genesis) + genTipSet, err := types.NewTipSet([]*types.BlockHeader{genesis}) if err != nil { return nil, errors.Wrap(err, "failed to generate genesis block") } diff --git a/pkg/market/fmgr.go b/pkg/market/fmgr.go index 5b4d32a7e2..771fbd2a54 100644 --- a/pkg/market/fmgr.go +++ b/pkg/market/fmgr.go @@ -2,19 +2,20 @@ package market import ( "context" + "github.com/filecoin-project/venus/app/client/apiface" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/ipfs/go-cid" ) // fundManagerAPI is the specific methods called by the FundManager // (used by the tests) type fundManager interface { - MpoolPushMessage(context.Context, *types.UnsignedMessage, *types.MessageSendSpec) (*types.SignedMessage, error) + MpoolPushMessage(context.Context, *types.Message, *apitypes.MessageSendSpec) (*types.SignedMessage, error) StateMarketBalance(context.Context, address.Address, types.TipSetKey) (apitypes.MarketBalance, error) StateWaitMsg(ctx context.Context, c cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) } @@ -35,7 +36,7 @@ func newFundmanager(p *FundManagerParams) fundManager { return fmAPI } -func (o *fmgr) MpoolPushMessage(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec) (*types.SignedMessage, error) { +func (o *fmgr) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec) (*types.SignedMessage, error) { return o.MPoolAPI.MpoolPushMessage(ctx, msg, spec) } diff --git a/pkg/market/fundmanager.go b/pkg/market/fundmanager.go index b530068e5a..5e2cc99549 100644 --- a/pkg/market/fundmanager.go +++ b/pkg/market/fundmanager.go @@ -10,9 +10,9 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/repo" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" @@ -667,7 +667,7 @@ func (env *fundManagerEnvironment) AddFunds( return cid.Undef, err } - smsg, aerr := env.api.MpoolPushMessage(ctx, &types.UnsignedMessage{ + smsg, aerr := env.api.MpoolPushMessage(ctx, &types.Message{ To: market.Address, From: wallet, Value: amt, @@ -695,7 +695,7 @@ func (env *fundManagerEnvironment) WithdrawFunds( return cid.Undef, xerrors.Errorf("serializing params: %w", err) } - smsg, aerr := env.api.MpoolPushMessage(ctx, &types.UnsignedMessage{ + smsg, aerr := env.api.MpoolPushMessage(ctx, &types.Message{ To: market.Address, From: wallet, Value: big.NewInt(0), diff --git a/pkg/market/fundmanager_test.go b/pkg/market/fundmanager_test.go index d6c67bf2ad..71c055caeb 100644 --- a/pkg/market/fundmanager_test.go +++ b/pkg/market/fundmanager_test.go @@ -4,15 +4,14 @@ import ( "bytes" "context" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/venus/pkg/config" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/pkg/wallet" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/stretchr/testify/assert" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" "github.com/ipfs/go-datastore" @@ -654,7 +653,7 @@ func setup(t *testing.T) *scaffold { } } -func checkAddMessageFields(t *testing.T, msg *types.UnsignedMessage, from address.Address, to address.Address, amt abi.TokenAmount) { +func checkAddMessageFields(t *testing.T, msg *types.Message, from address.Address, to address.Address, amt abi.TokenAmount) { require.Equal(t, from, msg.From) require.Equal(t, market.Address, msg.To) require.Equal(t, amt, msg.Value) @@ -665,7 +664,7 @@ func checkAddMessageFields(t *testing.T, msg *types.UnsignedMessage, from addres require.Equal(t, to, paramsTo) } -func checkWithdrawMessageFields(t *testing.T, msg *types.UnsignedMessage, from address.Address, addr address.Address, amt abi.TokenAmount) { +func checkWithdrawMessageFields(t *testing.T, msg *types.Message, from address.Address, addr address.Address, amt abi.TokenAmount) { require.Equal(t, from, msg.From) require.Equal(t, market.Address, msg.To) require.Equal(t, abi.NewTokenAmount(0), msg.Value) @@ -702,7 +701,7 @@ func newMockFundManagerAPI(wallet address.Address) *mockFundManagerAPI { } } -func (mapi *mockFundManagerAPI) MpoolPushMessage(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec) (*types.SignedMessage, error) { +func (mapi *mockFundManagerAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec) (*types.SignedMessage, error) { mapi.lk.Lock() defer mapi.lk.Unlock() @@ -713,7 +712,7 @@ func (mapi *mockFundManagerAPI) MpoolPushMessage(ctx context.Context, msg *types return smsg, nil } -func (mapi *mockFundManagerAPI) getSentMessage(c cid.Cid) *types.UnsignedMessage { +func (mapi *mockFundManagerAPI) getSentMessage(c cid.Cid) *types.Message { mapi.lk.Lock() defer mapi.lk.Unlock() @@ -814,8 +813,8 @@ func (mapi *mockFundManagerAPI) StateWaitMsg(ctx context.Context, c cid.Cid, con res := &apitypes.MsgLookup{ Message: c, Receipt: types.MessageReceipt{ - ExitCode: 0, - ReturnValue: nil, + ExitCode: 0, + Return: nil, }, } ready := make(chan struct{}) diff --git a/pkg/messagepool/check.go b/pkg/messagepool/check.go index 250cda67bc..718d6cab41 100644 --- a/pkg/messagepool/check.go +++ b/pkg/messagepool/check.go @@ -10,16 +10,16 @@ import ( "github.com/filecoin-project/go-state-types/big" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/app/submodule/apitypes" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/vm/gas" + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/messagepool" ) var baseFeeUpperBoundFactor = types.NewInt(10) // CheckMessages performs a set of logic checks for a list of messages, prior to submitting it to the mpool -func (mp *MessagePool) CheckMessages(ctx context.Context, protos []*apitypes.MessagePrototype) ([][]apitypes.MessageCheckStatus, error) { +func (mp *MessagePool) CheckMessages(ctx context.Context, protos []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) { flex := make([]bool, len(protos)) msgs := make([]*types.Message, len(protos)) for i, p := range protos { @@ -30,7 +30,7 @@ func (mp *MessagePool) CheckMessages(ctx context.Context, protos []*apitypes.Mes } // CheckPendingMessages performs a set of logical sets for all messages pending from a given actor -func (mp *MessagePool) CheckPendingMessages(ctx context.Context, from address.Address) ([][]apitypes.MessageCheckStatus, error) { +func (mp *MessagePool) CheckPendingMessages(ctx context.Context, from address.Address) ([][]messagepool.MessageCheckStatus, error) { var msgs []*types.Message mp.lk.Lock() mset, ok := mp.pending[from] @@ -54,7 +54,7 @@ func (mp *MessagePool) CheckPendingMessages(ctx context.Context, from address.Ad // CheckReplaceMessages performs a set of logical checks for related messages while performing a // replacement. -func (mp *MessagePool) CheckReplaceMessages(ctx context.Context, replace []*types.Message) ([][]apitypes.MessageCheckStatus, error) { +func (mp *MessagePool) CheckReplaceMessages(ctx context.Context, replace []*types.Message) ([][]messagepool.MessageCheckStatus, error) { msgMap := make(map[address.Address]map[uint64]*types.Message) count := 0 @@ -99,7 +99,7 @@ func (mp *MessagePool) CheckReplaceMessages(ctx context.Context, replace []*type // flexibleNonces should be either nil or of len(msgs), it signifies that message at given index // has non-determied nonce at this point -func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, interned bool, flexibleNonces []bool) (result [][]apitypes.MessageCheckStatus, err error) { +func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, interned bool, flexibleNonces []bool) (result [][]messagepool.MessageCheckStatus, err error) { if mp.api.IsLite() { return nil, nil } @@ -130,14 +130,14 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, state := make(map[address.Address]*actorState) balances := make(map[address.Address]big.Int) - result = make([][]apitypes.MessageCheckStatus, len(msgs)) + result = make([][]messagepool.MessageCheckStatus, len(msgs)) for i, m := range msgs { // pre-check: actor nonce - check := apitypes.MessageCheckStatus{ + check := messagepool.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: apitypes.CheckStatus{ - Code: apitypes.CheckStatusMessageGetStateNonce, + CheckStatus: messagepool.CheckStatus{ + Code: messagepool.CheckStatusMessageGetStateNonce, }, } @@ -184,10 +184,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, } // pre-check: actor balance - check = apitypes.MessageCheckStatus{ + check = messagepool.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: apitypes.CheckStatus{ - Code: apitypes.CheckStatusMessageGetStateBalance, + CheckStatus: messagepool.CheckStatus{ + Code: messagepool.CheckStatusMessageGetStateBalance, }, } @@ -218,10 +218,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, } // 1. Serialization - check = apitypes.MessageCheckStatus{ + check = messagepool.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: apitypes.CheckStatus{ - Code: apitypes.CheckStatusMessageSerialize, + CheckStatus: messagepool.CheckStatus{ + Code: messagepool.CheckStatusMessageSerialize, }, } @@ -236,10 +236,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, result[i] = append(result[i], check) // 2. Message size - check = apitypes.MessageCheckStatus{ + check = messagepool.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: apitypes.CheckStatus{ - Code: apitypes.CheckStatusMessageSize, + CheckStatus: messagepool.CheckStatus{ + Code: messagepool.CheckStatusMessageSize, }, } @@ -253,10 +253,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, result[i] = append(result[i], check) // 3. Syntactic validation - check = apitypes.MessageCheckStatus{ + check = messagepool.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: apitypes.CheckStatus{ - Code: apitypes.CheckStatusMessageValidity, + CheckStatus: messagepool.CheckStatus{ + Code: messagepool.CheckStatusMessageValidity, }, } @@ -278,10 +278,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, // 4. Min Gas minGas := gas.NewPricesSchedule(mp.forkParams).PricelistByEpoch(epoch).OnChainMessage(m.ChainLength()) - check = apitypes.MessageCheckStatus{ + check = messagepool.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: apitypes.CheckStatus{ - Code: apitypes.CheckStatusMessageMinGas, + CheckStatus: messagepool.CheckStatus{ + Code: messagepool.CheckStatusMessageMinGas, Hint: map[string]interface{}{ "minGas": minGas, }, @@ -298,10 +298,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, result[i] = append(result[i], check) // 5. Min Base Fee - check = apitypes.MessageCheckStatus{ + check = messagepool.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: apitypes.CheckStatus{ - Code: apitypes.CheckStatusMessageMinBaseFee, + CheckStatus: messagepool.CheckStatus{ + Code: messagepool.CheckStatusMessageMinBaseFee, }, } @@ -318,10 +318,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, } // 6. Base Fee - check = apitypes.MessageCheckStatus{ + check = messagepool.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: apitypes.CheckStatus{ - Code: apitypes.CheckStatusMessageBaseFee, + CheckStatus: messagepool.CheckStatus{ + Code: messagepool.CheckStatusMessageBaseFee, Hint: map[string]interface{}{ "baseFee": baseFee, }, @@ -338,10 +338,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, result[i] = append(result[i], check) // 7. Base Fee lower bound - check = apitypes.MessageCheckStatus{ + check = messagepool.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: apitypes.CheckStatus{ - Code: apitypes.CheckStatusMessageBaseFeeLowerBound, + CheckStatus: messagepool.CheckStatus{ + Code: messagepool.CheckStatusMessageBaseFeeLowerBound, Hint: map[string]interface{}{ "baseFeeLowerBound": baseFeeLowerBound, "baseFee": baseFee, @@ -359,10 +359,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, result[i] = append(result[i], check) // 8. Base Fee upper bound - check = apitypes.MessageCheckStatus{ + check = messagepool.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: apitypes.CheckStatus{ - Code: apitypes.CheckStatusMessageBaseFeeUpperBound, + CheckStatus: messagepool.CheckStatus{ + Code: messagepool.CheckStatusMessageBaseFeeUpperBound, Hint: map[string]interface{}{ "baseFeeUpperBound": baseFeeUpperBound, "baseFee": baseFee, @@ -382,10 +382,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, // stateful checks checkState: // 9. Message Nonce - check = apitypes.MessageCheckStatus{ + check = messagepool.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: apitypes.CheckStatus{ - Code: apitypes.CheckStatusMessageNonce, + CheckStatus: messagepool.CheckStatus{ + Code: messagepool.CheckStatusMessageNonce, Hint: map[string]interface{}{ "nextNonce": st.nextNonce, }, @@ -407,10 +407,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, st.requiredFunds.Add(st.requiredFunds, m.Value.Int) // 10. Balance - check = apitypes.MessageCheckStatus{ + check = messagepool.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: apitypes.CheckStatus{ - Code: apitypes.CheckStatusMessageBalance, + CheckStatus: messagepool.CheckStatus{ + Code: messagepool.CheckStatusMessageBalance, Hint: map[string]interface{}{ "requiredFunds": big.Int{Int: stdbig.NewInt(0).Set(st.requiredFunds)}, }, diff --git a/pkg/messagepool/gas.go b/pkg/messagepool/gas.go index fe718a5ab6..17a9384250 100644 --- a/pkg/messagepool/gas.go +++ b/pkg/messagepool/gas.go @@ -16,10 +16,11 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/fork" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) const MinGasPremium = 100e3 @@ -73,7 +74,7 @@ func (g *GasPriceCache) GetTSGasStats(provider Provider, ts *types.TipSet) ([]Ga func (mp *MessagePool) GasEstimateFeeCap( ctx context.Context, - msg *types.UnsignedMessage, + msg *types.Message, maxqueueblks int64, tsk types.TipSetKey, ) (big.Int, error) { @@ -183,7 +184,7 @@ func (mp *MessagePool) GasEstimateGasPremium( return premium, nil } -func (mp *MessagePool) GasEstimateGasLimit(ctx context.Context, msgIn *types.UnsignedMessage, tsk types.TipSetKey) (int64, error) { +func (mp *MessagePool) GasEstimateGasLimit(ctx context.Context, msgIn *types.Message, tsk types.TipSetKey) (int64, error) { if tsk.IsEmpty() { ts, err := mp.api.ChainHead() if err != nil { @@ -272,7 +273,7 @@ func (mp *MessagePool) evalMessageGasLimit(ctx context.Context, msgIn *types.Mes return res.Receipt.GasUsed + 76e3, nil } -func (mp *MessagePool) GasEstimateMessageGas(ctx context.Context, estimateMessage *types.EstimateMessage, _ types.TipSetKey) (*types.Message, error) { +func (mp *MessagePool) GasEstimateMessageGas(ctx context.Context, estimateMessage *apitypes.EstimateMessage, _ types.TipSetKey) (*types.Message, error) { if estimateMessage == nil || estimateMessage.Msg == nil { return nil, xerrors.Errorf("estimate message is nil") } @@ -309,7 +310,7 @@ func (mp *MessagePool) GasEstimateMessageGas(ctx context.Context, estimateMessag return estimateMessage.Msg, nil } -func (mp *MessagePool) GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) { +func (mp *MessagePool) GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*apitypes.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*apitypes.EstimateResult, error) { if len(estimateMessages) == 0 { return nil, xerrors.New("estimate messages are empty") } @@ -331,7 +332,7 @@ func (mp *MessagePool) GasBatchEstimateMessageGas(ctx context.Context, estimateM priorMsgs = append(priorMsgs, m) } - var estimateResults []*types.EstimateResult + var estimateResults []*apitypes.EstimateResult for _, estimateMessage := range estimateMessages { estimateMsg := estimateMessage.Msg estimateMsg.Nonce = fromNonce @@ -345,7 +346,7 @@ func (mp *MessagePool) GasBatchEstimateMessageGas(ctx context.Context, estimateM gasUsed, err := mp.evalMessageGasLimit(ctx, estimateMsg, priorMsgs, ts) if err != nil { estimateMsg.Nonce = 0 - estimateResults = append(estimateResults, &types.EstimateResult{ + estimateResults = append(estimateResults, &apitypes.EstimateResult{ Msg: estimateMsg, Err: fmt.Sprintf("estimating gas limit: %v", err), }) @@ -358,7 +359,7 @@ func (mp *MessagePool) GasBatchEstimateMessageGas(ctx context.Context, estimateM gasPremium, err := mp.GasEstimateGasPremium(ctx, 10, estimateMsg.From, estimateMsg.GasLimit, types.TipSetKey{}, mp.PriceCache) if err != nil { estimateMsg.Nonce = 0 - estimateResults = append(estimateResults, &types.EstimateResult{ + estimateResults = append(estimateResults, &apitypes.EstimateResult{ Msg: estimateMsg, Err: fmt.Sprintf("estimating gas premium: %v", err), }) @@ -371,7 +372,7 @@ func (mp *MessagePool) GasBatchEstimateMessageGas(ctx context.Context, estimateM feeCap, err := mp.GasEstimateFeeCap(ctx, estimateMsg, 20, types.EmptyTSK) if err != nil { estimateMsg.Nonce = 0 - estimateResults = append(estimateResults, &types.EstimateResult{ + estimateResults = append(estimateResults, &apitypes.EstimateResult{ Msg: estimateMsg, Err: fmt.Sprintf("estimating fee cap: %v", err), }) @@ -382,7 +383,7 @@ func (mp *MessagePool) GasBatchEstimateMessageGas(ctx context.Context, estimateM CapGasFee(mp.GetMaxFee, estimateMsg, estimateMessage.Spec) - estimateResults = append(estimateResults, &types.EstimateResult{ + estimateResults = append(estimateResults, &apitypes.EstimateResult{ Msg: estimateMsg, }) priorMsgs = append(priorMsgs, estimateMsg) diff --git a/pkg/messagepool/gasguess/guessgas.go b/pkg/messagepool/gasguess/guessgas.go index b0b06dabda..966b500691 100644 --- a/pkg/messagepool/gasguess/guessgas.go +++ b/pkg/messagepool/gasguess/guessgas.go @@ -6,8 +6,8 @@ import ( "github.com/ipfs/go-cid" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/builtin" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" diff --git a/pkg/messagepool/messagepool.go b/pkg/messagepool/messagepool.go index 7cf4ebb713..f8b1ef07dd 100644 --- a/pkg/messagepool/messagepool.go +++ b/pkg/messagepool/messagepool.go @@ -5,7 +5,6 @@ import ( "context" "errors" "fmt" - "github.com/filecoin-project/venus/pkg/statemanger" "math" stdbig "math/big" "os" @@ -38,22 +37,13 @@ import ( "github.com/filecoin-project/venus/pkg/messagepool/journal" "github.com/filecoin-project/venus/pkg/net/msgsub" "github.com/filecoin-project/venus/pkg/repo" - "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/pkg/statemanger" "github.com/filecoin-project/venus/pkg/vm/gas" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" + mptypes "github.com/filecoin-project/venus/venus-shared/messagepool" ) -type MpoolChange int - -const ( - MpoolAdd MpoolChange = iota - MpoolRemove -) - -type MpoolUpdate struct { - Type MpoolChange - Message *types.SignedMessage -} - var log = logging.Logger("messagepool") var futureDebug = false @@ -116,7 +106,7 @@ type MessagePoolEvt struct { // nolint } type MessagePoolEvtMessage struct { // nolint - types.UnsignedMessage + types.Message CID cid.Cid } @@ -216,7 +206,7 @@ func ComputeMinRBF(curPrem abi.TokenAmount) abi.TokenAmount { return big.Add(minPrice, big.NewInt(1)) } -func CapGasFee(mff DefaultMaxFeeFunc, msg *types.Message, sendSepc *types.MessageSendSpec) { +func CapGasFee(mff DefaultMaxFeeFunc, msg *types.Message, sendSepc *apitypes.MessageSendSpec) { var maxFee abi.TokenAmount if sendSepc != nil { maxFee = sendSepc.MaxFee @@ -1027,8 +1017,8 @@ func (mp *MessagePool) addLocked(ctx context.Context, m *types.SignedMessage, st } } - mp.changes.Pub(MpoolUpdate{ - Type: MpoolAdd, + mp.changes.Pub(mptypes.MpoolUpdate{ + Type: mptypes.MpoolAdd, Message: m, }, localUpdates) @@ -1036,7 +1026,7 @@ func (mp *MessagePool) addLocked(ctx context.Context, m *types.SignedMessage, st mc := m.Cid() return MessagePoolEvt{ Action: "add", - Messages: []MessagePoolEvtMessage{{UnsignedMessage: m.Message, CID: mc}}, + Messages: []MessagePoolEvtMessage{{Message: m.Message, CID: mc}}, } }) @@ -1163,15 +1153,15 @@ func (mp *MessagePool) remove(ctx context.Context, from address.Address, nonce u } if m, ok := mset.msgs[nonce]; ok { - mp.changes.Pub(MpoolUpdate{ - Type: MpoolRemove, + mp.changes.Pub(mptypes.MpoolUpdate{ + Type: mptypes.MpoolRemove, Message: m, }, localUpdates) mp.journal.RecordEvent(mp.evtTypes[evtTypeMpoolRemove], func() interface{} { return MessagePoolEvt{ Action: "remove", - Messages: []MessagePoolEvtMessage{{UnsignedMessage: m.Message, CID: m.Cid()}}} + Messages: []MessagePoolEvtMessage{{Message: m.Message, CID: m.Cid()}}} }) mp.currentSize-- @@ -1499,7 +1489,7 @@ func (mp *MessagePool) MessagesForBlocks(blks []*types.BlockHeader) ([]*types.Si return out, nil } -func (mp *MessagePool) RecoverSig(msg *types.UnsignedMessage) *types.SignedMessage { +func (mp *MessagePool) RecoverSig(msg *types.Message) *types.SignedMessage { val, ok := mp.blsSigCache.Get(msg.Cid()) if !ok { return nil @@ -1516,8 +1506,8 @@ func (mp *MessagePool) RecoverSig(msg *types.UnsignedMessage) *types.SignedMessa } } -func (mp *MessagePool) Updates(ctx context.Context) (<-chan MpoolUpdate, error) { - out := make(chan MpoolUpdate, 20) +func (mp *MessagePool) Updates(ctx context.Context) (<-chan mptypes.MpoolUpdate, error) { + out := make(chan mptypes.MpoolUpdate, 20) sub := mp.changes.Sub(localUpdates) go func() { @@ -1528,7 +1518,7 @@ func (mp *MessagePool) Updates(ctx context.Context) (<-chan MpoolUpdate, error) select { case u := <-sub: select { - case out <- u.(MpoolUpdate): + case out <- u.(mptypes.MpoolUpdate): case <-ctx.Done(): return case <-mp.closer: diff --git a/pkg/messagepool/messagepool_test.go b/pkg/messagepool/messagepool_test.go index 3effda2392..c17216e280 100644 --- a/pkg/messagepool/messagepool_test.go +++ b/pkg/messagepool/messagepool_test.go @@ -23,8 +23,9 @@ import ( "github.com/filecoin-project/venus/pkg/messagepool/gasguess" "github.com/filecoin-project/venus/pkg/repo" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/wallet" + types "github.com/filecoin-project/venus/venus-shared/chain" + wtypes "github.com/filecoin-project/venus/venus-shared/wallet" ) func init() { @@ -54,7 +55,7 @@ func mkAddress(i uint64) address.Address { } func mkMessage(from, to address.Address, nonce uint64, w *wallet.Wallet) *types.SignedMessage { - msg := &types.UnsignedMessage{ + msg := &types.Message{ To: to, From: from, Value: tbig.NewInt(1), @@ -65,7 +66,7 @@ func mkMessage(from, to address.Address, nonce uint64, w *wallet.Wallet) *types. } c := msg.Cid() - sig, err := w.WalletSign(from, c.Bytes(), wallet.MsgMeta{}) + sig, err := w.WalletSign(from, c.Bytes(), wtypes.MsgMeta{}) if err != nil { panic(err) } @@ -105,10 +106,10 @@ func mkBlock(parents *types.TipSet, weightInc int64, ticketNonce uint64) *types. ElectionProof: &types.ElectionProof{ VRFProof: []byte(fmt.Sprintf("====%d=====", ticketNonce)), }, - Ticket: types.Ticket{ + Ticket: &types.Ticket{ VRFProof: []byte(fmt.Sprintf("====%d=====", ticketNonce)), }, - Parents: tsKey, + Parents: tsKey.Cids(), ParentMessageReceipts: c, BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS, Data: []byte("boo! im a signature")}, ParentWeight: weight, @@ -122,7 +123,7 @@ func mkBlock(parents *types.TipSet, weightInc int64, ticketNonce uint64) *types. } func mkTipSet(blks ...*types.BlockHeader) *types.TipSet { - ts, err := types.NewTipSet(blks...) + ts, err := types.NewTipSet(blks) if err != nil { panic(err) } @@ -173,7 +174,7 @@ func (tma *testMpoolAPI) setStateNonce(addr address.Address, v uint64) { } func (tma *testMpoolAPI) setBalance(addr address.Address, v uint64) { - tma.balance[addr] = types.NewAttoFILFromFIL(v) + tma.balance[addr] = types.FromFil(v) } func (tma *testMpoolAPI) setBalanceRaw(addr address.Address, v tbig.Int) { @@ -265,7 +266,7 @@ func (tma *testMpoolAPI) StateAccountKey(ctx context.Context, addr address.Addre return addr, nil } -func (tma *testMpoolAPI) MessagesForBlock(h *types.BlockHeader) ([]*types.UnsignedMessage, []*types.SignedMessage, error) { +func (tma *testMpoolAPI) MessagesForBlock(h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { return nil, tma.bmsgs[h.Cid()], nil } @@ -404,7 +405,7 @@ func TestCheckMessageBig(t *testing.T) { Params: make([]byte, 41<<10), // 41KiB payload } - sig, err := w.WalletSign(from, msg.Cid().Bytes(), wallet.MsgMeta{}) + sig, err := w.WalletSign(from, msg.Cid().Bytes(), wtypes.MsgMeta{}) if err != nil { panic(err) } @@ -427,7 +428,7 @@ func TestCheckMessageBig(t *testing.T) { Params: make([]byte, 64<<10), // 64KiB payload } - sig, err := w.WalletSign(from, msg.Cid().Bytes(), wallet.MsgMeta{}) + sig, err := w.WalletSign(from, msg.Cid().Bytes(), wtypes.MsgMeta{}) if err != nil { panic(err) } diff --git a/pkg/messagepool/messagesigner.go b/pkg/messagepool/messagesigner.go index 5de818a9d7..32ee6643d9 100644 --- a/pkg/messagepool/messagesigner.go +++ b/pkg/messagepool/messagesigner.go @@ -6,6 +6,8 @@ import ( "sync" "github.com/filecoin-project/venus/pkg/wallet" + types "github.com/filecoin-project/venus/venus-shared/chain" + mptypes "github.com/filecoin-project/venus/venus-shared/wallet" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" @@ -13,8 +15,6 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-address" - - "github.com/filecoin-project/venus/pkg/types" ) const dsKeyActorNonce = "ActorNextNonce" @@ -62,8 +62,8 @@ func (ms *MessageSigner) SignMessage(ctx context.Context, msg *types.Message, cb return nil, xerrors.Errorf("serializing message: %w", err) } - sig, err := ms.wallet.WalletSign(msg.From, mb.Cid().Bytes(), wallet.MsgMeta{ - Type: wallet.MTChainMsg, + sig, err := ms.wallet.WalletSign(msg.From, mb.Cid().Bytes(), mptypes.MsgMeta{ + Type: mptypes.MTChainMsg, Extra: mb.RawData(), }) if err != nil { diff --git a/pkg/messagepool/messagesigner_test.go b/pkg/messagepool/messagesigner_test.go index 05906f6ebd..94a876f30c 100644 --- a/pkg/messagepool/messagesigner_test.go +++ b/pkg/messagepool/messagesigner_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/filecoin-project/venus/pkg/repo" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/stretchr/testify/assert" "golang.org/x/xerrors" @@ -19,7 +20,6 @@ import ( "github.com/filecoin-project/go-address" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" "github.com/ipfs/go-datastore" _ "github.com/filecoin-project/venus/pkg/crypto/bls" diff --git a/pkg/messagepool/provider.go b/pkg/messagepool/provider.go index 765a0a5376..67e93abcf2 100644 --- a/pkg/messagepool/provider.go +++ b/pkg/messagepool/provider.go @@ -9,8 +9,8 @@ import ( "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/statemanger" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/policy" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" pubsub "github.com/libp2p/go-libp2p-pubsub" "golang.org/x/xerrors" @@ -31,7 +31,7 @@ type Provider interface { GetActorAfter(address.Address, *types.TipSet) (*types.Actor, error) StateAccountKeyAtFinality(context.Context, address.Address, *types.TipSet) (address.Address, error) StateAccountKey(context.Context, address.Address, *types.TipSet) (address.Address, error) - MessagesForBlock(block2 *types.BlockHeader) ([]*types.UnsignedMessage, []*types.SignedMessage, error) + MessagesForBlock(block2 *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) MessagesForTipset(*types.TipSet) ([]types.ChainMsg, error) LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) ChainComputeBaseFee(ctx context.Context, ts *types.TipSet) (tbig.Int, error) @@ -137,7 +137,7 @@ func (mpp *mpoolProvider) StateAccountKey(ctx context.Context, addr address.Addr return mpp.stmgr.ResolveToKeyAddress(ctx, addr, ts) } -func (mpp *mpoolProvider) MessagesForBlock(h *types.BlockHeader) ([]*types.UnsignedMessage, []*types.SignedMessage, error) { +func (mpp *mpoolProvider) MessagesForBlock(h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { secpMsgs, blsMsgs, err := mpp.cms.LoadMetaMessages(context.TODO(), h.Messages) return blsMsgs, secpMsgs, err } diff --git a/pkg/messagepool/pruning.go b/pkg/messagepool/pruning.go index 225efd1fb8..b2f9886ffa 100644 --- a/pkg/messagepool/pruning.go +++ b/pkg/messagepool/pruning.go @@ -6,10 +6,9 @@ import ( "time" "github.com/filecoin-project/go-address" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types" ) func (mp *MessagePool) pruneExcessMessages() error { diff --git a/pkg/messagepool/repub.go b/pkg/messagepool/repub.go index 0b39bcfe74..6fc1c15645 100644 --- a/pkg/messagepool/repub.go +++ b/pkg/messagepool/repub.go @@ -13,7 +13,7 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/messagepool/gasguess" "github.com/filecoin-project/venus/pkg/net/msgsub" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) const repubMsgLimit = 30 @@ -158,7 +158,7 @@ LOOP: mp.journal.RecordEvent(mp.evtTypes[evtTypeMpoolRepub], func() interface{} { msgsEv := make([]MessagePoolEvtMessage, 0, len(msgs)) for _, m := range msgs { - msgsEv = append(msgsEv, MessagePoolEvtMessage{UnsignedMessage: m.Message, CID: m.Cid()}) + msgsEv = append(msgsEv, MessagePoolEvtMessage{Message: m.Message, CID: m.Cid()}) } return MessagePoolEvt{ Action: "repub", diff --git a/pkg/messagepool/selection.go b/pkg/messagepool/selection.go index 16260a0e5e..f9dad88a51 100644 --- a/pkg/messagepool/selection.go +++ b/pkg/messagepool/selection.go @@ -2,22 +2,21 @@ package messagepool import ( "context" - "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/messagepool/gasguess" - "github.com/filecoin-project/venus/pkg/types" "math/big" "math/rand" "sort" "time" cbg "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/go-state-types/crypto" - "golang.org/x/xerrors" "github.com/filecoin-project/go-address" tbig "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/crypto" + + "github.com/filecoin-project/venus/pkg/constants" + "github.com/filecoin-project/venus/pkg/messagepool/gasguess" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var bigBlockGasLimit = big.NewInt(constants.BlockGasLimit) diff --git a/pkg/messagepool/selection_test.go b/pkg/messagepool/selection_test.go index 7f9edd10d8..7be620b2aa 100644 --- a/pkg/messagepool/selection_test.go +++ b/pkg/messagepool/selection_test.go @@ -27,8 +27,9 @@ import ( "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/messagepool/gasguess" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/wallet" + types "github.com/filecoin-project/venus/venus-shared/chain" + mtypes "github.com/filecoin-project/venus/venus-shared/wallet" _ "github.com/filecoin-project/venus/pkg/crypto/secp" @@ -43,11 +44,11 @@ func init() { const UpgradeBreezeHeight = 41280 func makeTestMessage(w *wallet.Wallet, from, to address.Address, nonce uint64, gasLimit int64, gasPrice uint64) *types.SignedMessage { - msg := &types.UnsignedMessage{ + msg := &types.Message{ From: from, To: to, Method: 2, - Value: types.NewAttoFILFromFIL(0), + Value: types.FromFil(0), Nonce: nonce, GasLimit: gasLimit, GasFeeCap: tbig.NewInt(int64(100) + int64(gasPrice)), @@ -55,7 +56,7 @@ func makeTestMessage(w *wallet.Wallet, from, to address.Address, nonce uint64, g } c := msg.Cid() - sig, err := w.WalletSign(from, c.Bytes(), wallet.MsgMeta{}) + sig, err := w.WalletSign(from, c.Bytes(), mtypes.MsgMeta{}) if err != nil { panic(err) } @@ -1412,7 +1413,7 @@ func TestGasReward(t *testing.T) { test := test t.Run(fmt.Sprintf("%v", test), func(t *testing.T) { msg := &types.SignedMessage{ - Message: types.UnsignedMessage{ + Message: types.Message{ GasLimit: 10, GasFeeCap: tbig.NewInt(int64(test.FeeCap)), GasPremium: tbig.NewInt(int64(test.Premium)), @@ -1427,7 +1428,7 @@ func TestGasReward(t *testing.T) { } type SignedMessage struct { - Message types.UnsignedMessage + Message types.Message Signature crypto.Signature } @@ -1507,7 +1508,7 @@ readLoop: m.Message.Nonce -= baseNonce c := m.Message.Cid() - sig, err := w.WalletSign(localActor, c.Bytes(), wallet.MsgMeta{}) + sig, err := w.WalletSign(localActor, c.Bytes(), mtypes.MsgMeta{}) if err != nil { t.Fatal(err) } diff --git a/pkg/metrics/heartbeat.go b/pkg/metrics/heartbeat.go index 12bab5ef9f..96425943ec 100644 --- a/pkg/metrics/heartbeat.go +++ b/pkg/metrics/heartbeat.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "fmt" - "github.com/filecoin-project/venus/pkg/types" "sync" "time" @@ -20,6 +19,7 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/pkg/config" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // HeartbeatProtocol is the libp2p protocol used for the heartbeat service diff --git a/pkg/metrics/heartbeat_test.go b/pkg/metrics/heartbeat_test.go index c872de0ae3..1526c69d67 100644 --- a/pkg/metrics/heartbeat_test.go +++ b/pkg/metrics/heartbeat_test.go @@ -7,7 +7,9 @@ import ( "fmt" "testing" - emptycid "github.com/filecoin-project/venus/pkg/testhelpers/empty_cid" + "github.com/filecoin-project/venus/pkg/testhelpers" + + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-state-types/abi" "github.com/stretchr/testify/assert" @@ -26,7 +28,6 @@ import ( "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/metrics" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" ) var testCid cid.Cid @@ -188,16 +189,16 @@ func TestHeartbeatRunSuccess(t *testing.T) { } func mustMakeTipset(t *testing.T, height abi.ChainEpoch) *types.TipSet { - ts, err := types.NewTipSet(&types.BlockHeader{ - Miner: types.NewForTestGetter()(), - Ticket: types.Ticket{VRFProof: []byte{0}}, - Parents: types.TipSetKey{}, + ts, err := types.NewTipSet([]*types.BlockHeader{{ + Miner: testhelpers.NewForTestGetter()(), + Ticket: &types.Ticket{VRFProof: []byte{0}}, + Parents: types.TipSetKey{}.Cids(), ParentWeight: fbig.Zero(), Height: height, - ParentMessageReceipts: emptycid.EmptyMessagesCID, - Messages: emptycid.EmptyTxMetaCID, - ParentStateRoot: emptycid.EmptyTxMetaCID, - }) + ParentMessageReceipts: testhelpers.EmptyMessagesCID, + Messages: testhelpers.EmptyTxMetaCID, + ParentStateRoot: testhelpers.EmptyTxMetaCID, + }}) if err != nil { t.Fatal(err) } diff --git a/pkg/net/blocksub/validator.go b/pkg/net/blocksub/validator.go index b41f10aefa..0107b06c40 100644 --- a/pkg/net/blocksub/validator.go +++ b/pkg/net/blocksub/validator.go @@ -3,12 +3,13 @@ package blocksub import ( "bytes" "context" - "github.com/filecoin-project/venus/pkg/types" + "github.com/ipfs/go-log/v2" "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/filecoin-project/venus/pkg/metrics" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var blockTopicLogger = log.Logger("net/block_validator") diff --git a/pkg/net/blocksub/validator_test.go b/pkg/net/blocksub/validator_test.go index 194a22fcdd..4f45bc7bdc 100644 --- a/pkg/net/blocksub/validator_test.go +++ b/pkg/net/blocksub/validator_test.go @@ -4,18 +4,19 @@ import ( "bytes" "context" "fmt" + "testing" + "github.com/filecoin-project/go-address" - "github.com/filecoin-project/venus/pkg/types" pubsub "github.com/libp2p/go-libp2p-pubsub" pubsubpb "github.com/libp2p/go-libp2p-pubsub/pb" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "testing" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/net/blocksub" th "github.com/filecoin-project/venus/pkg/testhelpers" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + types "github.com/filecoin-project/venus/venus-shared/chain" ) func TestBlockTopicValidator(t *testing.T) { diff --git a/pkg/net/msgsub/validator.go b/pkg/net/msgsub/validator.go index d15f300833..f8e42f8d44 100644 --- a/pkg/net/msgsub/validator.go +++ b/pkg/net/msgsub/validator.go @@ -6,11 +6,11 @@ import ( logging "github.com/ipfs/go-log" "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-pubsub" + pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/filecoin-project/venus/pkg/consensus" "github.com/filecoin-project/venus/pkg/metrics" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var messageTopicLogger = logging.Logger("net/message_validator") diff --git a/pkg/paychmgr/manager.go b/pkg/paychmgr/manager.go index f753336e92..053c84e372 100644 --- a/pkg/paychmgr/manager.go +++ b/pkg/paychmgr/manager.go @@ -6,7 +6,7 @@ import ( "sync" "github.com/filecoin-project/venus/pkg/statemanger" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" diff --git a/pkg/paychmgr/mock_test.go b/pkg/paychmgr/mock_test.go index a0a50799c7..0c765f252d 100644 --- a/pkg/paychmgr/mock_test.go +++ b/pkg/paychmgr/mock_test.go @@ -7,8 +7,9 @@ import ( crypto2 "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/vm" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" @@ -18,7 +19,6 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" ) @@ -48,7 +48,7 @@ type mockStateManager struct { accountState map[address.Address]address.Address paychState map[address.Address]mockPchState response *vm.Ret - lastCall *types.UnsignedMessage + lastCall *types.Message } func newMockStateManager() *mockStateManager { @@ -97,14 +97,14 @@ func (sm *mockStateManager) setCallResponse(response *vm.Ret) { sm.response = response } -func (sm *mockStateManager) getLastCall() *types.UnsignedMessage { +func (sm *mockStateManager) getLastCall() *types.Message { sm.lk.Lock() defer sm.lk.Unlock() return sm.lastCall } -func (sm *mockStateManager) Call(ctx context.Context, msg *types.UnsignedMessage, ts *types.TipSet) (*vm.Ret, error) { +func (sm *mockStateManager) Call(ctx context.Context, msg *types.Message, ts *types.TipSet) (*vm.Ret, error) { sm.lk.Lock() defer sm.lk.Unlock() @@ -140,7 +140,7 @@ func newMockPaychAPI() *mockPaychAPI { } } -func (pchapi *mockPaychAPI) StateWaitMsg(ctx context.Context, mcid cid.Cid, confidence uint64) (*chain.MsgLookup, error) { +func (pchapi *mockPaychAPI) StateWaitMsg(ctx context.Context, mcid cid.Cid, confidence uint64) (*apitypes.MsgLookup, error) { pchapi.lk.Lock() response := make(chan types.MessageReceipt) @@ -151,14 +151,14 @@ func (pchapi *mockPaychAPI) StateWaitMsg(ctx context.Context, mcid cid.Cid, conf }() delete(pchapi.waitingResponses, mcid) - return &chain.MsgLookup{Receipt: response.receipt}, nil + return &apitypes.MsgLookup{Receipt: response.receipt}, nil } pchapi.waitingCalls[mcid] = &waitingCall{response: response} pchapi.lk.Unlock() receipt := <-response - return &chain.MsgLookup{Receipt: receipt}, nil + return &apitypes.MsgLookup{Receipt: receipt}, nil } func (pchapi *mockPaychAPI) receiveMsgResponse(mcid cid.Cid, receipt types.MessageReceipt) { @@ -186,8 +186,8 @@ func (pchapi *mockPaychAPI) close() { defer pchapi.lk.Unlock() success := types.MessageReceipt{ - ExitCode: 0, - ReturnValue: []byte{}, + ExitCode: 0, + Return: []byte{}, } for mcid, call := range pchapi.waitingCalls { delete(pchapi.waitingCalls, mcid) @@ -195,7 +195,7 @@ func (pchapi *mockPaychAPI) close() { } } -func (pchapi *mockPaychAPI) MpoolPushMessage(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec) (*types.SignedMessage, error) { +func (pchapi *mockPaychAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec) (*types.SignedMessage, error) { pchapi.lk.Lock() defer pchapi.lk.Unlock() diff --git a/pkg/paychmgr/paych.go b/pkg/paychmgr/paych.go index e8117a0fa3..70bcbabb47 100644 --- a/pkg/paychmgr/paych.go +++ b/pkg/paychmgr/paych.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" "golang.org/x/xerrors" @@ -321,7 +321,7 @@ func (ca *channelAccessor) checkVoucherSpendable(ctx context.Context, ch address return false, err } - ret, err := ca.api.Call(ctx, (*types.UnsignedMessage)(mes), nil) + ret, err := ca.api.Call(ctx, mes, nil) if err != nil { return false, err } @@ -438,7 +438,7 @@ func (ca *channelAccessor) submitVoucher(ctx context.Context, ch address.Address return cid.Undef, err } - smsg, err := ca.api.MpoolPushMessage(ctx, (*types.UnsignedMessage)(msg), nil) + smsg, err := ca.api.MpoolPushMessage(ctx, msg, nil) if err != nil { return cid.Undef, err } @@ -594,7 +594,7 @@ func (ca *channelAccessor) settle(ctx context.Context, ch address.Address) (cid. if err != nil { return cid.Undef, err } - smgs, err := ca.api.MpoolPushMessage(ctx, (*types.UnsignedMessage)(msg), nil) + smgs, err := ca.api.MpoolPushMessage(ctx, msg, nil) if err != nil { return cid.Undef, err } @@ -626,7 +626,7 @@ func (ca *channelAccessor) collect(ctx context.Context, ch address.Address) (cid return cid.Undef, err } - smsg, err := ca.api.MpoolPushMessage(ctx, (*types.UnsignedMessage)(msg), nil) + smsg, err := ca.api.MpoolPushMessage(ctx, msg, nil) if err != nil { return cid.Undef, err } diff --git a/pkg/paychmgr/paych_test.go b/pkg/paychmgr/paych_test.go index e42c7006f0..c1c56a2162 100644 --- a/pkg/paychmgr/paych_test.go +++ b/pkg/paychmgr/paych_test.go @@ -8,6 +8,7 @@ import ( crypto2 "github.com/filecoin-project/venus/pkg/crypto" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/pkg/vm" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" @@ -24,7 +25,6 @@ import ( _ "github.com/filecoin-project/venus/pkg/crypto/bls" _ "github.com/filecoin-project/venus/pkg/crypto/secp" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" paychmock "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych/mock" ) diff --git a/pkg/paychmgr/paychget_test.go b/pkg/paychmgr/paychget_test.go index 5894296fc5..68c8bc4762 100644 --- a/pkg/paychmgr/paychget_test.go +++ b/pkg/paychmgr/paychget_test.go @@ -7,6 +7,7 @@ import ( "time" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + types "github.com/filecoin-project/venus/venus-shared/chain" cborrpc "github.com/filecoin-project/go-cbor-util" "github.com/ipfs/go-cid" @@ -23,7 +24,6 @@ import ( _ "github.com/filecoin-project/venus/pkg/crypto/bls" _ "github.com/filecoin-project/venus/pkg/crypto/secp" - "github.com/filecoin-project/venus/pkg/types" lotusinit "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" paychmock "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych/mock" @@ -37,8 +37,8 @@ func testChannelResponse(t *testing.T, ch address.Address) types.MessageReceipt createChannelRetBytes, err := cborrpc.Dump(&createChannelRet) require.NoError(t, err) createChannelResponse := types.MessageReceipt{ - ExitCode: 0, - ReturnValue: createChannelRetBytes, + ExitCode: 0, + Return: createChannelRetBytes, } return createChannelResponse } @@ -185,8 +185,8 @@ func TestPaychGetCreateChannelWithErrorThenCreateAgain(t *testing.T) { // 1. Set up create channel response (sent in response to WaitForMsg()) // This response indicates an error. errResponse := types.MessageReceipt{ - ExitCode: 1, // error - ReturnValue: []byte{}, + ExitCode: 1, // error + Return: []byte{}, } done := make(chan struct{}) @@ -250,8 +250,8 @@ func TestPaychGetRecoverAfterError(t *testing.T) { // Send error create channel response mock.receiveMsgResponse(mcid, types.MessageReceipt{ - ExitCode: 1, // error - ReturnValue: []byte{}, + ExitCode: 1, // error + Return: []byte{}, }) // Send create message for a channel again @@ -312,8 +312,8 @@ func TestPaychGetRecoverAfterAddFundsError(t *testing.T) { // Send error add funds response mock.receiveMsgResponse(mcid2, types.MessageReceipt{ - ExitCode: 1, // error - ReturnValue: []byte{}, + ExitCode: 1, // error + Return: []byte{}, }) _, err = mgr.GetPaychWaitReady(ctx, mcid2) @@ -339,8 +339,8 @@ func TestPaychGetRecoverAfterAddFundsError(t *testing.T) { // Send success add funds response mock.receiveMsgResponse(mcid3, types.MessageReceipt{ - ExitCode: 0, - ReturnValue: []byte{}, + ExitCode: 0, + Return: []byte{}, }) _, err = mgr.GetPaychWaitReady(ctx, mcid3) @@ -484,8 +484,8 @@ func TestPaychGetRestartAfterAddFundsMsg(t *testing.T) { // Send success add funds response mock2.receiveMsgResponse(mcid2, types.MessageReceipt{ - ExitCode: 0, - ReturnValue: []byte{}, + ExitCode: 0, + Return: []byte{}, }) _, err = mgr2.GetPaychWaitReady(ctx, mcid2) @@ -553,8 +553,8 @@ func TestPaychGetWait(t *testing.T) { go func() { // 6. Send add funds response addFundsResponse := types.MessageReceipt{ - ExitCode: 0, - ReturnValue: []byte{}, + ExitCode: 0, + Return: []byte{}, } mock.receiveMsgResponse(addFundsMsgCid, addFundsResponse) }() @@ -604,8 +604,8 @@ func TestPaychGetWaitErr(t *testing.T) { // 3. Send error response to create channel response := types.MessageReceipt{ - ExitCode: 1, // error - ReturnValue: []byte{}, + ExitCode: 1, // error + Return: []byte{}, } mock.receiveMsgResponse(mcid, response) @@ -714,8 +714,8 @@ func TestPaychGetMergeAddFunds(t *testing.T) { // Send success add funds response mock.receiveMsgResponse(addFundsMcid1, types.MessageReceipt{ - ExitCode: 0, - ReturnValue: []byte{}, + ExitCode: 0, + Return: []byte{}, }) // Wait for add funds response @@ -812,8 +812,8 @@ func TestPaychGetMergeAddFundsCtxCancelOne(t *testing.T) { // Send success add funds response mock.receiveMsgResponse(addFundsMcid2, types.MessageReceipt{ - ExitCode: 0, - ReturnValue: []byte{}, + ExitCode: 0, + Return: []byte{}, }) // Wait for add funds response @@ -1027,8 +1027,8 @@ func TestPaychAvailableFunds(t *testing.T) { // Send success add funds response mock.receiveMsgResponse(addFundsMcid, types.MessageReceipt{ - ExitCode: 0, - ReturnValue: []byte{}, + ExitCode: 0, + Return: []byte{}, }) // Wait for add funds response diff --git a/pkg/paychmgr/paychvoucherfunds_test.go b/pkg/paychmgr/paychvoucherfunds_test.go index 3d191378ce..2bbab71cef 100644 --- a/pkg/paychmgr/paychvoucherfunds_test.go +++ b/pkg/paychmgr/paychvoucherfunds_test.go @@ -5,7 +5,7 @@ import ( "testing" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" diff --git a/pkg/paychmgr/pcapi.go b/pkg/paychmgr/pcapi.go index 3161e844c5..96bad8a6a7 100644 --- a/pkg/paychmgr/pcapi.go +++ b/pkg/paychmgr/pcapi.go @@ -2,33 +2,31 @@ package paychmgr import ( "context" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/app/submodule/apitypes" - "github.com/filecoin-project/venus/pkg/chain" - - "github.com/ipfs/go-cid" "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" + "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/wallet" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" + wallettypes "github.com/filecoin-project/venus/venus-shared/wallet" ) // paychDependencyAPI defines the API methods needed by the payment channel manager type paychDependencyAPI interface { StateAccountKey(context.Context, address.Address, types.TipSetKey) (address.Address, error) - StateWaitMsg(ctx context.Context, msg cid.Cid, confidence uint64) (*chain.MsgLookup, error) + StateWaitMsg(ctx context.Context, msg cid.Cid, confidence uint64) (*apitypes.MsgLookup, error) WalletHas(ctx context.Context, addr address.Address) (bool, error) WalletSign(ctx context.Context, k address.Address, msg []byte) (*crypto.Signature, error) StateNetworkVersion(context.Context, types.TipSetKey) (network.Version, error) - MpoolPushMessage(ctx context.Context, msg *types.UnsignedMessage, maxFee *types.MessageSendSpec) (*types.SignedMessage, error) + MpoolPushMessage(ctx context.Context, msg *types.Message, maxFee *apitypes.MessageSendSpec) (*types.SignedMessage, error) } type IMessagePush interface { - MpoolPushMessage(ctx context.Context, msg *types.UnsignedMessage, spec *types.MessageSendSpec) (*types.SignedMessage, error) + MpoolPushMessage(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec) (*types.SignedMessage, error) } type IChainInfo interface { @@ -39,7 +37,7 @@ type IChainInfo interface { type IWalletAPI interface { WalletHas(ctx context.Context, addr address.Address) (bool, error) - WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) + WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallettypes.MsgMeta) (*crypto.Signature, error) } type pcAPI struct { mpAPI IMessagePush @@ -54,17 +52,17 @@ func newPaychDependencyAPI(mpAPI IMessagePush, c IChainInfo, w IWalletAPI) paych func (o *pcAPI) StateAccountKey(ctx context.Context, address address.Address, tsk types.TipSetKey) (address.Address, error) { return o.chainInfoAPI.StateAccountKey(ctx, address, tsk) } -func (o *pcAPI) StateWaitMsg(ctx context.Context, msg cid.Cid, confidence uint64) (*chain.MsgLookup, error) { +func (o *pcAPI) StateWaitMsg(ctx context.Context, msg cid.Cid, confidence uint64) (*apitypes.MsgLookup, error) { return o.chainInfoAPI.StateWaitMsg(ctx, msg, confidence, constants.LookbackNoLimit, true) } -func (o *pcAPI) MpoolPushMessage(ctx context.Context, msg *types.UnsignedMessage, maxFee *types.MessageSendSpec) (*types.SignedMessage, error) { +func (o *pcAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, maxFee *apitypes.MessageSendSpec) (*types.SignedMessage, error) { return o.mpAPI.MpoolPushMessage(ctx, msg, maxFee) } func (o *pcAPI) WalletHas(ctx context.Context, addr address.Address) (bool, error) { return o.walletAPI.WalletHas(ctx, addr) } func (o *pcAPI) WalletSign(ctx context.Context, k address.Address, msg []byte) (*crypto.Signature, error) { - return o.walletAPI.WalletSign(ctx, k, msg, wallet.MsgMeta{Type: wallet.MTSignedVoucher}) + return o.walletAPI.WalletSign(ctx, k, msg, wallettypes.MsgMeta{Type: wallettypes.MTSignedVoucher}) } func (o *pcAPI) StateNetworkVersion(ctx context.Context, ts types.TipSetKey) (network.Version, error) { return o.chainInfoAPI.StateNetworkVersion(ctx, ts) diff --git a/pkg/paychmgr/settler/settler.go b/pkg/paychmgr/settler/settler.go index 05fa6709fd..8e0eb74064 100644 --- a/pkg/paychmgr/settler/settler.go +++ b/pkg/paychmgr/settler/settler.go @@ -6,11 +6,12 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/events" + types "github.com/filecoin-project/venus/venus-shared/chain" + paychtypes "github.com/filecoin-project/venus/venus-shared/paych" "github.com/filecoin-project/venus/pkg/paychmgr" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" @@ -24,9 +25,9 @@ type API struct { } type PaymentChannelSettler interface { check(ts *types.TipSet) (done bool, more bool, err error) - messageHandler(msg *types.UnsignedMessage, rec *types.MessageReceipt, ts *types.TipSet, curH abi.ChainEpoch) (more bool, err error) + messageHandler(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH abi.ChainEpoch) (more bool, err error) revertHandler(ctx context.Context, ts *types.TipSet) error - matcher(msg *types.UnsignedMessage) (matched bool, err error) + matcher(msg *types.Message) (matched bool, err error) } type paymentChannelSettler struct { ctx context.Context @@ -44,7 +45,7 @@ func (pcs *paymentChannelSettler) check(ts *types.TipSet) (done bool, more bool, return false, true, nil } -func (pcs *paymentChannelSettler) messageHandler(msg *types.UnsignedMessage, rec *types.MessageReceipt, ts *types.TipSet, curH abi.ChainEpoch) (more bool, err error) { +func (pcs *paymentChannelSettler) messageHandler(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH abi.ChainEpoch) (more bool, err error) { // Ignore unsuccessful settle messages if rec.ExitCode != 0 { return true, nil @@ -80,7 +81,7 @@ func (pcs *paymentChannelSettler) revertHandler(ctx context.Context, ts *types.T return nil } -func (pcs *paymentChannelSettler) matcher(msg *types.UnsignedMessage) (matched bool, err error) { +func (pcs *paymentChannelSettler) matcher(msg *types.Message) (matched bool, err error) { // Check if this is a settle payment channel message if msg.Method != paych.Methods.Settle { return false, nil @@ -97,7 +98,7 @@ func (pcs *paymentChannelSettler) matcher(msg *types.UnsignedMessage) (matched b if err != nil { return false, err } - if status.Direction == types.PCHInbound { + if status.Direction == paychtypes.PCHInbound { return true, nil } } diff --git a/pkg/paychmgr/settler/stl.go b/pkg/paychmgr/settler/stl.go index f1a4cdb7eb..4a14b7b73f 100644 --- a/pkg/paychmgr/settler/stl.go +++ b/pkg/paychmgr/settler/stl.go @@ -3,23 +3,23 @@ package settler import ( "context" - "github.com/filecoin-project/venus/pkg/chain" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + paychtypes "github.com/filecoin-project/venus/venus-shared/paych" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/paychmgr" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" "github.com/ipfs/go-cid" ) type Settler interface { PaychList(context.Context) ([]address.Address, error) - PaychStatus(ctx context.Context, pch address.Address) (*types.PaychStatus, error) + PaychStatus(ctx context.Context, pch address.Address) (*paychtypes.Status, error) PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (bool, error) PaychVoucherList(context.Context, address.Address) ([]*paych.SignedVoucher, error) PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) - StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*chain.MsgLookup, error) + StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) } type settler struct { @@ -35,14 +35,14 @@ func (o *settler) PaychList(context.Context) ([]address.Address, error) { return o.mgr.ListChannels() } -func (o *settler) PaychStatus(ctx context.Context, pch address.Address) (*types.PaychStatus, error) { +func (o *settler) PaychStatus(ctx context.Context, pch address.Address) (*paychtypes.Status, error) { ci, err := o.mgr.GetChannelInfo(pch) if err != nil { return nil, err } - return &types.PaychStatus{ + return &paychtypes.Status{ ControlAddr: ci.Control, - Direction: types.PCHDir(ci.Direction), + Direction: paychtypes.PCHDir(ci.Direction), }, nil } func (o *settler) PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (bool, error) { @@ -63,6 +63,6 @@ func (o *settler) PaychVoucherList(ctx context.Context, pch address.Address) ([] func (o *settler) PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) { return o.mgr.SubmitVoucher(ctx, ch, sv, secret, proof) } -func (o *settler) StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*chain.MsgLookup, error) { +func (o *settler) StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) { return o.ciAPI.StateWaitMsg(ctx, cid, confidence, lookbackLimit, allowReplaced) } diff --git a/pkg/paychmgr/simple.go b/pkg/paychmgr/simple.go index f8dd71ce12..01d0de0521 100644 --- a/pkg/paychmgr/simple.go +++ b/pkg/paychmgr/simple.go @@ -16,7 +16,7 @@ import ( init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // paychFundsRes is the response to a create channel or add funds request @@ -386,7 +386,7 @@ func (ca *channelAccessor) createPaych(ctx context.Context, amt big.Int) (cid.Ci return cid.Undef, err } - smsg, err := ca.api.MpoolPushMessage(ctx, (*types.UnsignedMessage)(msg), nil) + smsg, err := ca.api.MpoolPushMessage(ctx, msg, nil) if err != nil { return cid.Undef, xerrors.Errorf("initializing paych actor: %w", err) } @@ -437,7 +437,7 @@ func (ca *channelAccessor) waitPaychCreateMsg(channelID string, mcid cid.Cid) er // This "works" because it hasn't changed from v0 to v2, but we still // need an abstraction here. var decodedReturn init2.ExecReturn - err = decodedReturn.UnmarshalCBOR(bytes.NewReader(mwait.Receipt.ReturnValue)) + err = decodedReturn.UnmarshalCBOR(bytes.NewReader(mwait.Receipt.Return)) if err != nil { log.Error(err) return err @@ -459,7 +459,7 @@ func (ca *channelAccessor) waitPaychCreateMsg(channelID string, mcid cid.Cid) er // addFunds sends a message to add funds to the channel and returns the message cid func (ca *channelAccessor) addFunds(ctx context.Context, channelInfo *ChannelInfo, amt big.Int) (*cid.Cid, error) { - msg := &types.UnsignedMessage{ + msg := &types.Message{ To: *channelInfo.Channel, From: channelInfo.Control, Value: amt, diff --git a/pkg/paychmgr/state.go b/pkg/paychmgr/state.go index cae9357bbf..e770595259 100644 --- a/pkg/paychmgr/state.go +++ b/pkg/paychmgr/state.go @@ -4,10 +4,10 @@ import ( "context" "github.com/filecoin-project/venus/pkg/statemanger" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-address" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" ) diff --git a/pkg/state/power_table_view.go b/pkg/state/power_table_view.go index e946aedd8a..fc26648f99 100644 --- a/pkg/state/power_table_view.go +++ b/pkg/state/power_table_view.go @@ -7,7 +7,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/util/ffiwrapper" "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" @@ -21,11 +20,18 @@ type PowerStateView interface { GetMinerWorkerRaw(ctx context.Context, maddr address.Address) (address.Address, error) MinerInfo(ctx context.Context, maddr address.Address, nv network.Version) (*miner.MinerInfo, error) MinerSectorInfo(ctx context.Context, maddr address.Address, sectorNum abi.SectorNumber) (*miner.SectorOnChainInfo, error) - PowerNetworkTotal(ctx context.Context) (*types.NetworkPower, error) + PowerNetworkTotal(ctx context.Context) (*NetworkPower, error) MinerClaimedPower(ctx context.Context, miner address.Address) (raw, qa abi.StoragePower, err error) GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, pv ffiwrapper.Verifier, maddr address.Address, rand abi.PoStRandomness) ([]builtin.SectorInfo, error) } +type NetworkPower struct { + RawBytePower abi.StoragePower + QualityAdjustedPower abi.StoragePower + MinerCount int64 + MinPowerMinerCount int64 +} + // FaultStateView is a view of chain state for adjustment of miner power claims based on changes since the // power state's lookback (primarily, the miner ceasing to be registered). type FaultStateView interface { diff --git a/pkg/state/power_table_view_test.go b/pkg/state/power_table_view_test.go index 2160210cc5..2be1b96bc8 100644 --- a/pkg/state/power_table_view_test.go +++ b/pkg/state/power_table_view_test.go @@ -4,6 +4,8 @@ import ( "context" "testing" + "github.com/filecoin-project/venus/pkg/testhelpers" + cbor "github.com/ipfs/go-ipld-cbor" "github.com/filecoin-project/go-address" @@ -18,8 +20,8 @@ import ( "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/state" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" gengen "github.com/filecoin-project/venus/tools/gengen/util" + types "github.com/filecoin-project/venus/venus-shared/chain" ) func TestTotal(t *testing.T) { @@ -30,7 +32,7 @@ func TestTotal(t *testing.T) { ctx := context.Background() numCommittedSectors := uint64(19) numMiners := 3 - kis := types.MustGenerateBLSKeyInfo(numMiners, 0) + kis := testhelpers.MustGenerateBLSKeyInfo(numMiners, 0) cst, _, root := requireMinerWithNumCommittedSectors(ctx, t, numCommittedSectors, kis) @@ -50,7 +52,7 @@ func TestMiner(t *testing.T) { tf.UnitTest(t) ctx := context.Background() - kis := types.MustGenerateBLSKeyInfo(1, 0) + kis := testhelpers.MustGenerateBLSKeyInfo(1, 0) numCommittedSectors := uint64(10) cst, addrs, root := requireMinerWithNumCommittedSectors(ctx, t, numCommittedSectors, kis) @@ -73,7 +75,7 @@ func TestNoPowerAfterSlash(t *testing.T) { ctx := context.Background() numCommittedSectors := uint64(19) numMiners := 3 - kis := types.MustGenerateBLSKeyInfo(numMiners, 0) + kis := testhelpers.MustGenerateBLSKeyInfo(numMiners, 0) cstPower, addrsPower, rootPower := requireMinerWithNumCommittedSectors(ctx, t, numCommittedSectors, kis) cstFaults, _, rootFaults := requireMinerWithNumCommittedSectors(ctx, t, numCommittedSectors, kis[0:2]) // drop the third key table := state.NewPowerTableView(state.NewView(cstPower, rootPower), state.NewView(cstFaults, rootFaults)) @@ -91,7 +93,7 @@ func TestTotalPowerUnaffectedBySlash(t *testing.T) { ctx := context.Background() numCommittedSectors := uint64(19) numMiners := 3 - kis := types.MustGenerateBLSKeyInfo(numMiners, 0) + kis := testhelpers.MustGenerateBLSKeyInfo(numMiners, 0) cstPower, _, rootPower := requireMinerWithNumCommittedSectors(ctx, t, numCommittedSectors, kis) cstFaults, _, rootFaults := requireMinerWithNumCommittedSectors(ctx, t, numCommittedSectors, kis[0:2]) // drop the third key table := state.NewPowerTableView(state.NewView(cstPower, rootPower), state.NewView(cstFaults, rootFaults)) diff --git a/pkg/state/signer.go b/pkg/state/signer.go index eec1376382..05ecfc0d76 100644 --- a/pkg/state/signer.go +++ b/pkg/state/signer.go @@ -2,10 +2,11 @@ package state import ( "context" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/wallet" + types "github.com/filecoin-project/venus/venus-shared/chain" ) //todo remove Account view a nd headsignerview diff --git a/pkg/state/sigval.go b/pkg/state/sigval.go index 5b85fbbea6..dc2e32b5cc 100644 --- a/pkg/state/sigval.go +++ b/pkg/state/sigval.go @@ -2,11 +2,12 @@ package state import ( "context" + "github.com/filecoin-project/go-address" "github.com/pkg/errors" "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // @@ -36,7 +37,7 @@ func (v *SignatureValidator) ValidateMessageSignature(ctx context.Context, msg * } //ValidateBLSMessageAggregate validate bls aggregate message -func (v *SignatureValidator) ValidateBLSMessageAggregate(ctx context.Context, msgs []*types.UnsignedMessage, sig *crypto.Signature) error { +func (v *SignatureValidator) ValidateBLSMessageAggregate(ctx context.Context, msgs []*types.Message, sig *crypto.Signature) error { if sig == nil { if len(msgs) > 0 { return errors.New("Invalid empty BLS sig over messages") diff --git a/pkg/state/sigval_test.go b/pkg/state/sigval_test.go index 72cd87ee3c..e3ad14158b 100644 --- a/pkg/state/sigval_test.go +++ b/pkg/state/sigval_test.go @@ -4,16 +4,19 @@ import ( "bytes" "context" "fmt" - "github.com/filecoin-project/venus/pkg/state" "testing" + "github.com/filecoin-project/venus/pkg/testhelpers" + + "github.com/filecoin-project/venus/pkg/state" + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/specs-actors/actors/builtin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" _ "github.com/filecoin-project/venus/pkg/crypto/bls" _ "github.com/filecoin-project/venus/pkg/crypto/secp" @@ -39,25 +42,25 @@ func TestSignMessageOk(t *testing.T) { tf.UnitTest(t) ctx := context.Background() - ms, kis := types.NewMockSignersAndKeyInfo(1) + ms, kis := testhelpers.NewMockSignersAndKeyInfo(1) keyAddr, err := kis[0].Address() require.NoError(t, err) t.Run("no resolution", func(t *testing.T) { v := state.NewSignatureValidator(&fakeStateView{}) // No resolution needed. - msg := types.NewMeteredMessage(keyAddr, keyAddr, 1, types.ZeroFIL, builtin.MethodSend, nil, types.NewAttoFILFromFIL(0), types.NewAttoFILFromFIL(0), 1) - smsg, err := types.NewSignedMessage(ctx, *msg, ms) + msg := testhelpers.NewMeteredMessage(keyAddr, keyAddr, 1, types.ZeroFIL, builtin.MethodSend, nil, types.FromFil(0), types.FromFil(0), 1) + smsg, err := testhelpers.NewSignedMessage(ctx, *msg, ms) require.NoError(t, err) assert.NoError(t, v.ValidateMessageSignature(ctx, smsg)) }) t.Run("resolution required", func(t *testing.T) { - idAddress := types.RequireIDAddress(t, 1) + idAddress := testhelpers.RequireIDAddress(t, 1) // Use ID address in message but sign with corresponding key address. stateView := &fakeStateView{keys: map[address.Address]address.Address{ idAddress: keyAddr, }} v := state.NewSignatureValidator(stateView) - msg := types.NewMeteredMessage(idAddress, idAddress, 1, types.ZeroFIL, builtin.MethodSend, nil, types.NewAttoFILFromFIL(0), types.NewAttoFILFromFIL(0), 1) + msg := testhelpers.NewMeteredMessage(idAddress, idAddress, 1, types.ZeroFIL, builtin.MethodSend, nil, types.FromFil(0), types.FromFil(0), 1) msgCid := msg.Cid() sig, err := ms.SignBytes(ctx, msgCid.Bytes(), keyAddr) require.NoError(t, err) @@ -75,7 +78,7 @@ func TestBadFrom(t *testing.T) { tf.UnitTest(t) ctx := context.Background() - signer, kis := types.NewMockSignersAndKeyInfo(2) + signer, kis := testhelpers.NewMockSignersAndKeyInfo(2) keyAddr, err := kis[0].Address() require.NoError(t, err) otherAddr, err := kis[1].Address() @@ -85,7 +88,7 @@ func TestBadFrom(t *testing.T) { v := state.NewSignatureValidator(&fakeStateView{}) // Can't use NewSignedMessage constructor as it always signs with msg.From. - msg := types.NewMeteredMessage(keyAddr, keyAddr, 1, types.ZeroFIL, builtin.MethodSend, nil, types.NewAttoFILFromFIL(0), types.NewAttoFILFromFIL(0), 1) + msg := testhelpers.NewMeteredMessage(keyAddr, keyAddr, 1, types.ZeroFIL, builtin.MethodSend, nil, types.FromFil(0), types.FromFil(0), 1) buf := new(bytes.Buffer) err = msg.MarshalCBOR(buf) require.NoError(t, err) @@ -98,7 +101,7 @@ func TestBadFrom(t *testing.T) { assert.Error(t, v.ValidateMessageSignature(ctx, smsg)) }) t.Run("resolution required", func(t *testing.T) { - idAddress := types.RequireIDAddress(t, 1) + idAddress := testhelpers.RequireIDAddress(t, 1) // Use ID address in message but sign with corresponding key address. stateView := &fakeStateView{keys: map[address.Address]address.Address{ idAddress: keyAddr, @@ -106,7 +109,7 @@ func TestBadFrom(t *testing.T) { v := state.NewSignatureValidator(stateView) // Can't use NewSignedMessage constructor as it always signs with msg.From. - msg := types.NewMeteredMessage(idAddress, idAddress, 1, types.ZeroFIL, builtin.MethodSend, nil, types.NewAttoFILFromFIL(0), types.NewAttoFILFromFIL(0), 1) + msg := testhelpers.NewMeteredMessage(idAddress, idAddress, 1, types.ZeroFIL, builtin.MethodSend, nil, types.FromFil(0), types.FromFil(0), 1) buf := new(bytes.Buffer) err = msg.MarshalCBOR(buf) require.NoError(t, err) @@ -125,13 +128,13 @@ func TestSignedMessageBadSignature(t *testing.T) { tf.UnitTest(t) ctx := context.Background() - signer, kis := types.NewMockSignersAndKeyInfo(1) + signer, kis := testhelpers.NewMockSignersAndKeyInfo(1) keyAddr, err := kis[0].Address() require.NoError(t, err) v := state.NewSignatureValidator(&fakeStateView{}) // no resolution needed - msg := types.NewMeteredMessage(keyAddr, keyAddr, 1, types.ZeroFIL, builtin.MethodSend, nil, types.NewAttoFILFromFIL(0), types.NewAttoFILFromFIL(0), 1) - smsg, err := types.NewSignedMessage(ctx, *msg, signer) + msg := testhelpers.NewMeteredMessage(keyAddr, keyAddr, 1, types.ZeroFIL, builtin.MethodSend, nil, types.FromFil(0), types.FromFil(0), 1) + smsg, err := testhelpers.NewSignedMessage(ctx, *msg, signer) require.NoError(t, err) assert.NoError(t, v.ValidateMessageSignature(ctx, smsg)) @@ -145,13 +148,13 @@ func TestSignedMessageCorrupted(t *testing.T) { ctx := context.Background() - signer, kis := types.NewMockSignersAndKeyInfo(1) + signer, kis := testhelpers.NewMockSignersAndKeyInfo(1) keyAddr, err := kis[0].Address() require.NoError(t, err) v := state.NewSignatureValidator(&fakeStateView{}) // no resolution needed - msg := types.NewMeteredMessage(keyAddr, keyAddr, 1, types.ZeroFIL, builtin.MethodSend, nil, types.NewAttoFILFromFIL(0), types.NewAttoFILFromFIL(0), 1) - smsg, err := types.NewSignedMessage(ctx, *msg, signer) + msg := testhelpers.NewMeteredMessage(keyAddr, keyAddr, 1, types.ZeroFIL, builtin.MethodSend, nil, types.FromFil(0), types.FromFil(0), 1) + smsg, err := testhelpers.NewSignedMessage(ctx, *msg, signer) require.NoError(t, err) assert.NoError(t, v.ValidateMessageSignature(ctx, smsg)) diff --git a/pkg/state/testing.go b/pkg/state/testing.go index cd607c635e..dabda1c15d 100644 --- a/pkg/state/testing.go +++ b/pkg/state/testing.go @@ -3,8 +3,6 @@ package state import ( "context" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" @@ -22,14 +20,14 @@ import ( // FakeStateView is a fake state view. type FakeStateView struct { NetworkName string - Power *types.NetworkPower + Power *NetworkPower Miners map[address.Address]*FakeMinerState } // NewFakeStateView creates a new fake state view. func NewFakeStateView(rawBytePower, qaPower abi.StoragePower, minerCount, minPowerMinerCount int64) *FakeStateView { return &FakeStateView{ - Power: &types.NetworkPower{ + Power: &NetworkPower{ RawBytePower: rawBytePower, QualityAdjustedPower: qaPower, MinerCount: minerCount, @@ -100,7 +98,7 @@ func (v *FakeStateView) MinerProvingPeriod(ctx context.Context, maddr address.Ad return m.ProvingPeriodStart, m.ProvingPeriodEnd, m.PoStFailures, nil } -func (v *FakeStateView) PowerNetworkTotal(_ context.Context) (*types.NetworkPower, error) { +func (v *FakeStateView) PowerNetworkTotal(_ context.Context) (*NetworkPower, error) { return v.Power, nil } diff --git a/pkg/state/tree/snapshot.go b/pkg/state/tree/snapshot.go index fc7fb6403b..152c2c9c5c 100644 --- a/pkg/state/tree/snapshot.go +++ b/pkg/state/tree/snapshot.go @@ -2,7 +2,7 @@ package tree import ( "github.com/filecoin-project/go-address" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type stateSnaps struct { diff --git a/pkg/state/tree/state.go b/pkg/state/tree/state.go index a6ba66896a..b692f05dd2 100644 --- a/pkg/state/tree/state.go +++ b/pkg/state/tree/state.go @@ -6,8 +6,6 @@ import ( "fmt" "io" - "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" @@ -19,15 +17,14 @@ import ( "go.opencensus.io/trace" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/venus-shared/actors/adt" - init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - states0 "github.com/filecoin-project/specs-actors/actors/states" states2 "github.com/filecoin-project/specs-actors/v2/actors/states" states3 "github.com/filecoin-project/specs-actors/v3/actors/states" states4 "github.com/filecoin-project/specs-actors/v4/actors/states" states5 "github.com/filecoin-project/specs-actors/v5/actors/states" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type StateTreeVersion uint64 //nolint @@ -294,7 +291,7 @@ func (st *State) lookupIDinternal(addr address.Address) (address.Address, error) return address.Undef, xerrors.Errorf("getting init actor: %v", err) } - ias, err := init_.Load(&AdtStore{st.Store}, (*chain.Actor)(act)) + ias, err := init_.Load(&AdtStore{st.Store}, act) if err != nil { return address.Undef, xerrors.Errorf("loading init actor state: %v", err) } @@ -440,7 +437,7 @@ func (st *State) ClearSnapshot() { func (st *State) RegisterNewAddress(addr ActorKey) (address.Address, error) { var out address.Address err := st.MutateActor(init_.Address, func(initact *types.Actor) error { - ias, err := init_.Load(&AdtStore{st.Store}, (*chain.Actor)(initact)) + ias, err := init_.Load(&AdtStore{st.Store}, initact) if err != nil { return err } diff --git a/pkg/state/tree/state_test.go b/pkg/state/tree/state_test.go index a1ab698ae9..936822a81e 100644 --- a/pkg/state/tree/state_test.go +++ b/pkg/state/tree/state_test.go @@ -2,20 +2,21 @@ package tree import ( "context" - cbor "github.com/ipfs/go-ipld-cbor" "testing" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + "github.com/filecoin-project/venus/pkg/testhelpers" "github.com/ipfs/go-cid" + cbor "github.com/ipfs/go-ipld-cbor" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/repo" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) func TestStatePutGet(t *testing.T) { @@ -30,7 +31,7 @@ func TestStatePutGet(t *testing.T) { t.Fatal(err) } - addrGetter := types.NewForTestGetter() + addrGetter := testhelpers.NewForTestGetter() addr1 := addrGetter() addr2 := addrGetter() AddAccount(t, tree, cst, addr1) @@ -81,7 +82,7 @@ func TestStateErrors(t *testing.T) { t.Fatal(err) } - AddAccount(t, tree, cst, types.NewForTestGetter()()) + AddAccount(t, tree, cst, testhelpers.NewForTestGetter()()) c, err := constants.DefaultCidBuilder.Sum([]byte("cats")) assert.NoError(t, err) @@ -101,7 +102,7 @@ func TestGetAllActors(t *testing.T) { if err != nil { t.Fatal(err) } - addr := types.NewForTestGetter()() + addr := testhelpers.NewForTestGetter()() newActor := types.Actor{Code: builtin2.AccountActorCodeID, Nonce: 1234, Balance: abi.NewTokenAmount(123)} AddAccount(t, tree, cst, addr) diff --git a/pkg/state/tree/testing.go b/pkg/state/tree/testing.go index cba9bf1beb..84d4826955 100644 --- a/pkg/state/tree/testing.go +++ b/pkg/state/tree/testing.go @@ -2,19 +2,19 @@ package tree import ( "context" + "testing" + "github.com/filecoin-project/go-state-types/abi" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" "github.com/filecoin-project/specs-actors/actors/builtin/account" init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" "github.com/filecoin-project/specs-actors/actors/util/adt" - "testing" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" "github.com/stretchr/testify/require" - - "github.com/filecoin-project/venus/pkg/types" ) // NewFromString sets a state tree based on an int. diff --git a/pkg/state/view.go b/pkg/state/view.go index b6b03c8ecc..8947f59800 100644 --- a/pkg/state/view.go +++ b/pkg/state/view.go @@ -4,7 +4,8 @@ import ( "context" "strconv" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/dline" @@ -17,7 +18,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" vmstate "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/util/ffiwrapper" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" @@ -386,7 +386,7 @@ func (v *View) StateVerifiedClientStatus(ctx context.Context, addr addr.Address) return abi.NewStoragePower(0), err } - state, err := verifreg.Load(adt.WrapStore(ctx, v.ipldStore), (*types2.Actor)(act)) + state, err := verifreg.Load(adt.WrapStore(ctx, v.ipldStore), act) if err != nil { return abi.NewStoragePower(0), err } @@ -404,7 +404,7 @@ func (v *View) StateVerifiedClientStatus(ctx context.Context, addr addr.Address) } // StateMarketStorageDeal returns information about the indicated deal -func (v *View) StateMarketStorageDeal(ctx context.Context, dealID abi.DealID) (*types.MarketDeal, error) { +func (v *View) StateMarketStorageDeal(ctx context.Context, dealID abi.DealID) (*apitypes.MarketDeal, error) { state, err := v.LoadMarketState(ctx) if err != nil { return nil, err @@ -438,14 +438,14 @@ func (v *View) StateMarketStorageDeal(ctx context.Context, dealID abi.DealID) (* return nil, xerrors.New("deal state not found") } - return &types.MarketDeal{ + return &apitypes.MarketDeal{ Proposal: *dealProposal, State: *dealState, }, nil } // Returns the storage power actor's values for network total power. -func (v *View) PowerNetworkTotal(ctx context.Context) (*types.NetworkPower, error) { +func (v *View) PowerNetworkTotal(ctx context.Context) (*NetworkPower, error) { st, err := v.LoadPowerActor(ctx) if err != nil { return nil, err @@ -461,7 +461,7 @@ func (v *View) PowerNetworkTotal(ctx context.Context) (*types.NetworkPower, erro return nil, err } - return &types.NetworkPower{ + return &NetworkPower{ RawBytePower: tp.RawBytePower, QualityAdjustedPower: tp.QualityAdjPower, MinerCount: int64(minerCount), @@ -505,7 +505,7 @@ func (v *View) PaychActorParties(ctx context.Context, paychAddr addr.Address) (f return addr.Undef, addr.Undef, err } - state, err := paychActor.Load(adt.WrapStore(ctx, v.ipldStore), (*types2.Actor)(a)) + state, err := paychActor.Load(adt.WrapStore(ctx, v.ipldStore), a) if err != nil { return addr.Undef, addr.Undef, err } @@ -540,29 +540,6 @@ func (v *View) StateMinerProvingDeadline(ctx context.Context, addr addr.Address, return di.NextNotElapsed(), nil } -// StateMinerActiveSectors returns info about sectors that a given miner is actively proving. -func (v *View) StateMinerSectors(ctx context.Context, addr addr.Address, filter *bitfield.BitField, key types.TipSetKey) ([]*types.ChainSectorInfo, error) { - mas, err := v.LoadMinerState(ctx, addr) - if err != nil { - return nil, xerrors.WithMessage(err, "failed to get proving dealline") - } - - siset, err := mas.LoadSectors(filter) - if err != nil { - return nil, err - } - - sset := make([]*types.ChainSectorInfo, len(siset)) - for i, val := range siset { - sset[i] = &types.ChainSectorInfo{ - Info: *val, - ID: val.SectorNumber, - } - } - - return sset, nil -} - // StateSectorExpiration returns epoch at which given sector will expire func (v *View) StateSectorExpiration(ctx context.Context, maddr addr.Address, sectorNumber abi.SectorNumber, key types.TipSetKey) (*miner.SectorExpiration, error) { mas, err := v.LoadMinerState(ctx, maddr) @@ -583,7 +560,7 @@ func (v *View) StateMinerAvailableBalance(ctx context.Context, maddr addr.Addres return big.Int{}, err } - mas, err := miner.Load(adt.WrapStore(context.TODO(), v.ipldStore), (*types2.Actor)(actor)) + mas, err := miner.Load(adt.WrapStore(context.TODO(), v.ipldStore), actor) if err != nil { return big.Int{}, xerrors.Errorf("failed to load miner actor state: %v", err) } @@ -644,8 +621,8 @@ func (v *View) StateMinerPower(ctx context.Context, maddr addr.Address, tsk type } // StateMarketDeals returns information about every deal in the Storage Market -func (v *View) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) { - out := map[string]types.MarketDeal{} +func (v *View) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]apitypes.MarketDeal, error) { + out := map[string]apitypes.MarketDeal{} state, err := v.LoadMarketState(ctx) if err != nil { @@ -669,7 +646,7 @@ func (v *View) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[s } else if !found { s = market.EmptyDealState() } - out[strconv.FormatInt(int64(dealID), 10)] = types.MarketDeal{ + out[strconv.FormatInt(int64(dealID), 10)] = apitypes.MarketDeal{ Proposal: d, State: *s, } @@ -730,7 +707,7 @@ func (v *View) ResolveToKeyAddr(ctx context.Context, address addr.Address) (addr return addr.Undef, xerrors.Errorf("failed to find actor: %s", address) } - aast, err := account.Load(adt.WrapStore(context.TODO(), v.ipldStore), (*types2.Actor)(act)) + aast, err := account.Load(adt.WrapStore(context.TODO(), v.ipldStore), act) if err != nil { return addr.Undef, xerrors.Errorf("failed to get account actor state for %s: %v", address, err) } @@ -744,12 +721,12 @@ func (v *View) LoadInitState(ctx context.Context) (notinit.State, error) { return nil, err } - return notinit.Load(adt.WrapStore(ctx, v.ipldStore), (*types2.Actor)(actr)) + return notinit.Load(adt.WrapStore(ctx, v.ipldStore), actr) } //LoadPaychState get pay channel state for actor func (v *View) LoadPaychState(ctx context.Context, actor *types.Actor) (paychActor.State, error) { - return paychActor.Load(adt.WrapStore(context.TODO(), v.ipldStore), (*types2.Actor)(actor)) + return paychActor.Load(adt.WrapStore(context.TODO(), v.ipldStore), actor) } //LoadMinerState return miner state @@ -763,7 +740,7 @@ func (v *View) LoadMinerState(ctx context.Context, maddr addr.Address) (miner.St return nil, err } - return miner.Load(adt.WrapStore(context.TODO(), v.ipldStore), (*types2.Actor)(actr)) + return miner.Load(adt.WrapStore(context.TODO(), v.ipldStore), actr) } func (v *View) LoadPowerActor(ctx context.Context) (power.State, error) { @@ -772,7 +749,7 @@ func (v *View) LoadPowerActor(ctx context.Context) (power.State, error) { return nil, err } - return power.Load(adt.WrapStore(ctx, v.ipldStore), (*types2.Actor)(actr)) + return power.Load(adt.WrapStore(ctx, v.ipldStore), actr) } func (v *View) LoadVerifregActor(ctx context.Context) (verifreg.State, error) { @@ -781,7 +758,7 @@ func (v *View) LoadVerifregActor(ctx context.Context) (verifreg.State, error) { return nil, err } - return verifreg.Load(adt.WrapStore(ctx, v.ipldStore), (*types2.Actor)(actr)) + return verifreg.Load(adt.WrapStore(ctx, v.ipldStore), actr) } // nolint @@ -791,7 +768,7 @@ func (v *View) LoadRewardState(ctx context.Context) (reward.State, error) { return nil, err } - return reward.Load(adt.WrapStore(ctx, v.ipldStore), (*types2.Actor)(actr)) + return reward.Load(adt.WrapStore(ctx, v.ipldStore), actr) } // nolint @@ -801,7 +778,7 @@ func (v *View) LoadPowerState(ctx context.Context) (power.State, error) { return nil, err } - return power.Load(adt.WrapStore(ctx, v.ipldStore), (*types2.Actor)(actr)) + return power.Load(adt.WrapStore(ctx, v.ipldStore), actr) } func (v *View) LoadMarketState(ctx context.Context) (market.State, error) { @@ -810,7 +787,7 @@ func (v *View) LoadMarketState(ctx context.Context) (market.State, error) { return nil, err } - return market.Load(adt.WrapStore(ctx, v.ipldStore), (*types2.Actor)(actr)) + return market.Load(adt.WrapStore(ctx, v.ipldStore), actr) } // nolint @@ -824,7 +801,7 @@ func (v *View) LoadAccountState(ctx context.Context, a addr.Address) (account.St return nil, err } - return account.Load(adt.WrapStore(context.TODO(), v.ipldStore), (*types2.Actor)(actr)) + return account.Load(adt.WrapStore(context.TODO(), v.ipldStore), actr) } //loadActor load actor of address in db @@ -850,7 +827,7 @@ func getFilMarketLocked(ctx context.Context, ipldStore cbor.IpldStore, st vmstat return big.Zero(), xerrors.Errorf("failed to load market actor: %v", err) } - mst, err := market.Load(adt.WrapStore(ctx, ipldStore), (*types2.Actor)(mactor)) + mst, err := market.Load(adt.WrapStore(ctx, ipldStore), mactor) if err != nil { return big.Zero(), xerrors.Errorf("failed to load market state: %v", err) } diff --git a/pkg/statemanger/call.go b/pkg/statemanger/call.go index c107cce928..e461b48f7d 100644 --- a/pkg/statemanger/call.go +++ b/pkg/statemanger/call.go @@ -3,9 +3,11 @@ package statemanger import ( "context" "fmt" + "github.com/filecoin-project/venus/pkg/consensus" "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/vm/vmcontext" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" @@ -19,12 +21,11 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/fork" "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/vm" ) // CallWithGas used to estimate message gaslimit, for each incoming message ,should execute after priorMsg in mpool -func (s *Stmgr) CallWithGas(ctx context.Context, msg *types.UnsignedMessage, priorMsgs []types.ChainMsg, ts *types.TipSet) (*vm.Ret, error) { +func (s *Stmgr) CallWithGas(ctx context.Context, msg *types.Message, priorMsgs []types.ChainMsg, ts *types.TipSet) (*vm.Ret, error) { var ( err error stateRoot cid.Cid @@ -118,7 +119,7 @@ func (s *Stmgr) CallWithGas(ctx context.Context, msg *types.UnsignedMessage, pri } // Call used for api invoke to compute a msg base on specify tipset, if the tipset is null, use latest tipset in db -func (s *Stmgr) Call(ctx context.Context, msg *types.UnsignedMessage, ts *types.TipSet) (*vm.Ret, error) { +func (s *Stmgr) Call(ctx context.Context, msg *types.Message, ts *types.TipSet) (*vm.Ret, error) { ctx, span := trace.StartSpan(ctx, "statemanager.Call") defer span.End() diff --git a/pkg/statemanger/state_manger.go b/pkg/statemanger/state_manger.go index c0b2a938de..995ccb1d03 100644 --- a/pkg/statemanger/state_manger.go +++ b/pkg/statemanger/state_manger.go @@ -12,11 +12,11 @@ import ( "github.com/filecoin-project/venus/pkg/fork" appstate "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/pkg/vm/gas" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" "go.opencensus.io/trace" @@ -28,7 +28,7 @@ import ( type IStateManager interface { ResolveToKeyAddress(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) GetPaychState(ctx context.Context, addr address.Address, ts *types.TipSet) (*types.Actor, paych.State, error) - Call(ctx context.Context, msg *types.UnsignedMessage, ts *types.TipSet) (*vm.Ret, error) + Call(ctx context.Context, msg *types.Message, ts *types.TipSet) (*vm.Ret, error) GetMarketState(ctx context.Context, ts *types.TipSet) (market.State, error) } diff --git a/pkg/testhelpers/address.go b/pkg/testhelpers/address.go new file mode 100644 index 0000000000..0045415733 --- /dev/null +++ b/pkg/testhelpers/address.go @@ -0,0 +1,31 @@ +package testhelpers + +import ( + "fmt" + "testing" + + "github.com/filecoin-project/go-address" +) + +func RequireIDAddress(t *testing.T, i int) address.Address { + a, err := address.NewIDAddress(uint64(i)) + if err != nil { + t.Fatalf("failed to make address: %v", err) + } + return a +} + +// NewForTestGetter returns a closure that returns an address unique to that invocation. +// The address is unique wrt the closure returned, not globally. +func NewForTestGetter() func() address.Address { + i := 0 + return func() address.Address { + s := fmt.Sprintf("address%d", i) + i++ + newAddr, err := address.NewSecp256k1Address([]byte(s)) + if err != nil { + panic(err) + } + return newAddr + } +} diff --git a/pkg/testhelpers/cid.go b/pkg/testhelpers/cid.go new file mode 100644 index 0000000000..135976765e --- /dev/null +++ b/pkg/testhelpers/cid.go @@ -0,0 +1,67 @@ +package testhelpers + +import ( + "context" + "testing" + + "github.com/filecoin-project/specs-actors/actors/util/adt" + "github.com/filecoin-project/venus/pkg/constants" + "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/ipfs/go-cid" + "github.com/ipfs/go-datastore" + cbor "github.com/ipfs/go-ipld-cbor" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// EmptyMessagesCID is the cid of an empty collection of messages. +var EmptyMessagesCID cid.Cid + +// EmptyReceiptsCID is the cid of an empty collection of receipts. +var EmptyReceiptsCID cid.Cid + +// EmptyTxMetaCID is the cid of a TxMeta wrapping empty cids +var EmptyTxMetaCID cid.Cid + +func init() { + tmpCst := cbor.NewCborStore(blockstoreutil.NewBlockstore(datastore.NewMapDatastore())) + emptyAmt := adt.MakeEmptyArray(adt.WrapStore(context.Background(), tmpCst)) + emptyAMTCid, err := emptyAmt.Root() + if err != nil { + panic("could not create CID for empty AMT") + } + + EmptyMessagesCID = emptyAMTCid + EmptyReceiptsCID = emptyAMTCid + EmptyTxMetaCID, err = tmpCst.Put(context.Background(), &types.MessageRoot{SecpkRoot: EmptyMessagesCID, BlsRoot: EmptyMessagesCID}) + if err != nil { + panic("could not create CID for empty TxMeta") + } +} + +// CidFromString generates Cid from string input +func CidFromString(t *testing.T, input string) cid.Cid { + c, err := constants.DefaultCidBuilder.Sum([]byte(input)) + require.NoError(t, err) + return c +} + +// HasCid allows two values with CIDs to be compared. +type HasCid interface { + Cid() cid.Cid +} + +// AssertHaveSameCid asserts that two values have identical CIDs. +func AssertHaveSameCid(t *testing.T, m HasCid, n HasCid) { + if !m.Cid().Equals(n.Cid()) { + assert.Fail(t, "CIDs don't match", "not equal %v %v", m.Cid(), n.Cid()) + } +} + +// AssertCidsEqual asserts that two CIDS are identical. +func AssertCidsEqual(t *testing.T, m cid.Cid, n cid.Cid) { + if !m.Equals(n) { + assert.Fail(t, "CIDs don't match", "not equal %v %v", m, n) + } +} diff --git a/pkg/testhelpers/consensus.go b/pkg/testhelpers/consensus.go index 8934102fa0..243ca54f17 100644 --- a/pkg/testhelpers/consensus.go +++ b/pkg/testhelpers/consensus.go @@ -2,47 +2,13 @@ package testhelpers import ( "context" - fbig "github.com/filecoin-project/go-state-types/big" + pubsub "github.com/libp2p/go-libp2p-pubsub" - "testing" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" - "github.com/stretchr/testify/require" - - bls "github.com/filecoin-project/filecoin-ffi" - "github.com/filecoin-project/venus/pkg/consensus" - "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/types" ) -// RequireSignedTestBlockFromTipSet creates a block with a valid signature by -// the passed in miner work and a Miner field set to the minerAddr. -func RequireSignedTestBlockFromTipSet(t *testing.T, baseTipSet types.TipSet, stateRootCid cid.Cid, receiptRootCid cid.Cid, height abi.ChainEpoch, minerAddr address.Address, minerWorker address.Address, signer types.Signer) *types.BlockHeader { - ticket := consensus.MakeFakeTicketForTest() - emptyBLSSig := crypto.Signature{ - Type: crypto.SigTypeBLS, - Data: (*bls.Aggregate([]bls.Signature{}))[:], - } - - b := &types.BlockHeader{ - Miner: minerAddr, - Ticket: ticket, - Parents: baseTipSet.Key(), - ParentWeight: fbig.NewInt(int64(height * 10000)), - Height: height, - ParentStateRoot: stateRootCid, - ParentMessageReceipts: receiptRootCid, - BLSAggregate: &emptyBLSSig, - } - sig, err := signer.SignBytes(context.TODO(), b.SignatureData(), minerWorker) - require.NoError(t, err) - b.BlockSig = sig - - return b -} - // FakeBlockValidator passes everything as valid type FakeBlockValidator struct{} @@ -67,7 +33,7 @@ func (fbv *FakeBlockValidator) ValidateMessagesSyntax(ctx context.Context, messa } // ValidateUnsignedMessagesSyntax does nothing -func (fbv *FakeBlockValidator) ValidateUnsignedMessagesSyntax(ctx context.Context, messages []*types.UnsignedMessage) error { +func (fbv *FakeBlockValidator) ValidateUnsignedMessagesSyntax(ctx context.Context, messages []*types.Message) error { return nil } diff --git a/pkg/testhelpers/core.go b/pkg/testhelpers/core.go index ef8fb0e7d4..4811048d78 100644 --- a/pkg/testhelpers/core.go +++ b/pkg/testhelpers/core.go @@ -3,41 +3,39 @@ package testhelpers import ( "context" "errors" + "math/rand" + "testing" + "github.com/filecoin-project/go-state-types/abi" fbig "github.com/filecoin-project/go-state-types/big" acrypto "github.com/filecoin-project/go-state-types/crypto" - "math/rand" - "testing" - "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" - cbor "github.com/ipfs/go-ipld-cbor" "github.com/libp2p/go-libp2p-core/peer" "github.com/stretchr/testify/require" - "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // RequireMakeStateTree takes a map of addresses to actors and stores them on // the state tree, requiring that all its steps succeed. -func RequireMakeStateTree(t *testing.T, cst cbor.IpldStore, acts map[address.Address]*types.Actor) (cid.Cid, *tree.State) { - ctx := context.Background() - tree, err := tree.NewState(cst, tree.StateTreeVersion0) - if err != nil { - t.Fatal(err) - } - - for addr, act := range acts { - err := tree.SetActor(ctx, addr, act) - require.NoError(t, err) - } - - c, err := tree.Flush(ctx) - require.NoError(t, err) - - return c, tree -} +//func RequireMakeStateTree(t *testing.T, cst cbor.IpldStore, acts map[address.Address]*types.Actor) (cid.Cid, *tree.State) { +// ctx := context.Background() +// tree, err := tree.NewState(cst, tree.StateTreeVersion0) +// if err != nil { +// t.Fatal(err) +// } +// +// for addr, act := range acts { +// err := tree.SetActor(ctx, addr, act) +// require.NoError(t, err) +// } +// +// c, err := tree.Flush(ctx) +// require.NoError(t, err) +// +// return c, tree +//} // RequireRandomPeerID returns a new libp2p peer ID or panics. func RequireRandomPeerID(t *testing.T) peer.ID { @@ -70,24 +68,24 @@ func RequireTipset(t *testing.T) *types.TipSet { } func RequireTipsetWithHeight(t *testing.T, height abi.ChainEpoch) *types.TipSet { - newAddress := types.NewForTestGetter() + newAddress := NewForTestGetter() blk := &types.BlockHeader{ Miner: newAddress(), - Ticket: types.Ticket{VRFProof: []byte{0x03, 0x01, 0x02}}, + Ticket: &types.Ticket{VRFProof: []byte{0x03, 0x01, 0x02}}, ElectionProof: &types.ElectionProof{VRFProof: []byte{0x0c, 0x0d}}, - BeaconEntries: []*types.BeaconEntry{ + BeaconEntries: []types.BeaconEntry{ { Round: 44, Data: []byte{0xc0}, }, }, Height: height, - Messages: types.CidFromString(t, "someothercid"), - ParentMessageReceipts: types.CidFromString(t, "someothercid"), - Parents: types.NewTipSetKey(types.CidFromString(t, "someothercid")), + Messages: CidFromString(t, "someothercid"), + ParentMessageReceipts: CidFromString(t, "someothercid"), + Parents: []cid.Cid{CidFromString(t, "someothercid")}, ParentWeight: fbig.NewInt(1), ForkSignaling: 2, - ParentStateRoot: types.CidFromString(t, "someothercid"), + ParentStateRoot: CidFromString(t, "someothercid"), Timestamp: 4, ParentBaseFee: abi.NewTokenAmount(20), BlockSig: &acrypto.Signature{ @@ -95,6 +93,6 @@ func RequireTipsetWithHeight(t *testing.T, height abi.ChainEpoch) *types.TipSet Data: []byte{0x4}, }, } - b, _ := types.NewTipSet(blk) + b, _ := types.NewTipSet([]*types.BlockHeader{blk}) return b } diff --git a/pkg/testhelpers/empty_cid/empty_cid.go b/pkg/testhelpers/empty_cid/empty_cid.go deleted file mode 100644 index a42a0610a5..0000000000 --- a/pkg/testhelpers/empty_cid/empty_cid.go +++ /dev/null @@ -1,36 +0,0 @@ -package emptycid - -import ( - "context" - "github.com/filecoin-project/specs-actors/actors/util/adt" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - "github.com/ipfs/go-cid" - "github.com/ipfs/go-datastore" - cbor "github.com/ipfs/go-ipld-cbor" -) - -// EmptyMessagesCID is the cid of an empty collection of messages. -var EmptyMessagesCID cid.Cid - -// EmptyReceiptsCID is the cid of an empty collection of receipts. -var EmptyReceiptsCID cid.Cid - -// EmptyTxMetaCID is the cid of a TxMeta wrapping empty cids -var EmptyTxMetaCID cid.Cid - -func init() { - tmpCst := cbor.NewCborStore(blockstoreutil.NewBlockstore(datastore.NewMapDatastore())) - emptyAmt := adt.MakeEmptyArray(adt.WrapStore(context.Background(), tmpCst)) - emptyAMTCid, err := emptyAmt.Root() - if err != nil { - panic("could not create CID for empty AMT") - } - - EmptyMessagesCID = emptyAMTCid - EmptyReceiptsCID = emptyAMTCid - EmptyTxMetaCID, err = tmpCst.Put(context.Background(), &types.TxMeta{SecpRoot: EmptyMessagesCID, BLSRoot: EmptyMessagesCID}) - if err != nil { - panic("could not create CID for empty TxMeta") - } -} diff --git a/pkg/testhelpers/message.go b/pkg/testhelpers/message.go new file mode 100644 index 0000000000..f11fc860c1 --- /dev/null +++ b/pkg/testhelpers/message.go @@ -0,0 +1,295 @@ +package testhelpers + +import ( + "context" + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/filecoin-project/venus/pkg/crypto" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/venus/pkg/constants" + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/ipfs/go-cid" + cbor "github.com/ipfs/go-ipld-cbor" +) + +// NewMessage creates a new message. +func NewMessage(from, to address.Address, nonce uint64, value abi.TokenAmount, method abi.MethodNum, params []byte) *types.Message { + return &types.Message{ + Version: 0, + To: to, + From: from, + Nonce: nonce, + Value: value, + Method: method, + Params: params, + } +} + +// NewMeteredMessage adds gas price and gas limit to the message +func NewMeteredMessage(from, to address.Address, nonce uint64, value abi.TokenAmount, method abi.MethodNum, params []byte, gasFeeCap, gasPremium abi.TokenAmount, limit int64) *types.Message { + return &types.Message{ + Version: 0, + To: to, + From: from, + Nonce: nonce, + Value: value, + GasFeeCap: gasFeeCap, + GasPremium: gasPremium, + GasLimit: limit, + Method: method, + Params: params, + } +} + +// NewSignedMessage accepts a message `msg` and a signer `s`. NewSignedMessage returns a `SignedMessage` containing +// a signature derived from the serialized `msg` and `msg.From` +// NOTE: this method can only sign message with From being a public-key type address, not an ID address. +// We should deprecate this and move to more explicit signing via an address resolver. +func NewSignedMessage(ctx context.Context, msg types.Message, s types.Signer) (*types.SignedMessage, error) { + msgCid := msg.Cid() + + sig, err := s.SignBytes(ctx, msgCid.Bytes(), msg.From) + if err != nil { + return nil, err + } + + return &types.SignedMessage{ + Message: msg, + Signature: *sig, + }, nil +} + +// NewSignedMessageForTestGetter returns a closure that returns a SignedMessage unique to that invocation. +// The message is unique wrt the closure returned, not globally. You can use this function +// in tests instead of manually creating messages -- it both reduces duplication and gives us +// exactly one place to create valid messages for tests if messages require validation in the +// future. +// TODO support chosing from address +func NewSignedMessageForTestGetter(ms MockSigner) func(uint64) *types.SignedMessage { + i := 0 + return func(nonce uint64) *types.SignedMessage { + s := fmt.Sprintf("smsg%d", i) + i++ + newAddr, err := address.NewSecp256k1Address([]byte(s + "-to")) + if err != nil { + panic(err) + } + msg := NewMeteredMessage( + ms.Addresses[0], // from needs to be an address from the signer + newAddr, + nonce, + types.ZeroFIL, + 0, + []byte("params"), + types.ZeroFIL, + types.ZeroFIL, + 0, + ) + smsg, err := NewSignedMessage(context.TODO(), *msg, &ms) + if err != nil { + panic(err) + } + return smsg + } +} + +// NewCidForTestGetter returns a closure that returns a Cid unique to that invocation. +// The Cid is unique wrt the closure returned, not globally. You can use this function +// in tests. +func NewCidForTestGetter() func() cid.Cid { + i := 31337 + return func() cid.Cid { + obj, err := cbor.WrapObject([]int{i}, constants.DefaultHashFunction, -1) + if err != nil { + panic(err) + } + i++ + return obj.Cid() + } +} + +// NewMessageForTestGetter returns a closure that returns a message unique to that invocation. +// The message is unique wrt the closure returned, not globally. You can use this function +// in tests instead of manually creating messages -- it both reduces duplication and gives us +// exactly one place to create valid messages for tests if messages require validation in the +// future. +func NewMessageForTestGetter() func() *types.Message { + i := 0 + return func() *types.Message { + s := fmt.Sprintf("msg%d", i) + i++ + from, err := address.NewSecp256k1Address([]byte(s + "-from")) + if err != nil { + panic(err) + } + to, err := address.NewSecp256k1Address([]byte(s + "-to")) + if err != nil { + panic(err) + } + return NewMessage( + from, + to, + 0, + types.ZeroFIL, + abi.MethodNum(10000+i), + nil) + } +} + +// NewMsgs returns n messages. The messages returned are unique to this invocation +// but are not unique globally (ie, a second call to NewMsgs will return the same +// set of messages). +func NewMsgs(n int) []*types.Message { + newMsg := NewMessageForTestGetter() + msgs := make([]*types.Message, n) + for i := 0; i < n; i++ { + msgs[i] = newMsg() + msgs[i].Nonce = uint64(i) + } + return msgs +} + +// NewSignedMsgs returns n signed messages. The messages returned are unique to this invocation +// but are not unique globally (ie, a second call to NewSignedMsgs will return the same +// set of messages). +func NewSignedMsgs(n uint, ms MockSigner) []*types.SignedMessage { + var err error + newMsg := NewMessageForTestGetter() + smsgs := make([]*types.SignedMessage, n) + for i := uint(0); i < n; i++ { + msg := newMsg() + msg.From = ms.Addresses[0] + msg.Nonce = uint64(i) + msg.GasFeeCap = types.ZeroFIL + msg.GasPremium = types.ZeroFIL + msg.GasLimit = 0 + smsgs[i], err = NewSignedMessage(context.TODO(), *msg, ms) + if err != nil { + panic(err) + } + } + return smsgs +} + +// SignMsgs returns a slice of signed messages where the original messages +// are `msgs`, if signing one of the `msgs` fails an error is returned +func SignMsgs(ms MockSigner, msgs []*types.Message) ([]*types.SignedMessage, error) { + var smsgs []*types.SignedMessage + for _, m := range msgs { + s, err := NewSignedMessage(context.TODO(), *m, ms) + if err != nil { + return nil, err + } + smsgs = append(smsgs, s) + } + return smsgs, nil +} + +// NewMsgsWithAddrs returns a slice of `n` messages who's `From` field's are pulled +// from `a`. This method should be used when the addresses returned are to be signed +// at a later point. +func NewMsgsWithAddrs(n int, a []address.Address) []*types.Message { + if n > len(a) { + panic("cannot create more messages than there are addresess for") + } + newMsg := NewMessageForTestGetter() + msgs := make([]*types.Message, n) + for i := 0; i < n; i++ { + msgs[i] = newMsg() + msgs[i].From = a[i] + } + return msgs +} + +// MessageMaker creates unique, signed messages for use in tests. +type MessageMaker struct { + DefaultGasFeeCap types.BigInt + DefaultGasPremium types.BigInt + DefaultGasUnits int64 + + signer *MockSigner + seq uint + t *testing.T +} + +// NewMessageMaker creates a new message maker with a set of signing keys. +func NewMessageMaker(t *testing.T, keys []crypto.KeyInfo) *MessageMaker { + addresses := make([]address.Address, len(keys)) + signer := NewMockSigner(keys) + + for i, key := range keys { + addr, _ := key.Address() + addresses[i] = addr + } + + return &MessageMaker{types.ZeroFIL, types.ZeroFIL, 0, &signer, 0, t} +} + +// Addresses returns the addresses for which this maker can sign messages. +func (mm *MessageMaker) Addresses() []address.Address { + return mm.signer.Addresses +} + +// Signer returns the signer with which this maker signs messages. +func (mm *MessageMaker) Signer() *MockSigner { + return mm.signer +} + +// NewUnsignedMessage creates a new message. +func (mm *MessageMaker) NewUnsignedMessage(from address.Address, nonce uint64) *types.Message { + seq := mm.seq + mm.seq++ + to, err := address.NewSecp256k1Address([]byte("destination")) + require.NoError(mm.t, err) + return NewMeteredMessage( + from, + to, + nonce, + types.ZeroFIL, + abi.MethodNum(9000+seq), + []byte("params"), + mm.DefaultGasFeeCap, + mm.DefaultGasPremium, + mm.DefaultGasUnits) +} + +// NewSignedMessage creates a new signed message. +func (mm *MessageMaker) NewSignedMessage(from address.Address, nonce uint64) *types.SignedMessage { + msg := mm.NewUnsignedMessage(from, nonce) + signed, err := NewSignedMessage(context.TODO(), *msg, mm.signer) + require.NoError(mm.t, err) + return signed +} + +// EmptyReceipts returns a slice of n empty receipts. +func EmptyReceipts(n int) []*types.MessageReceipt { + out := make([]*types.MessageReceipt, n) + for i := 0; i < n; i++ { + out[i] = &types.MessageReceipt{} + } + return out +} + +// ReceiptMaker generates unique receipts +type ReceiptMaker struct { + seq uint +} + +// NewReceiptMaker creates a new receipt maker +func NewReceiptMaker() *ReceiptMaker { + return &ReceiptMaker{0} +} + +// NewReceipt creates a new distinct receipt. +func (rm *ReceiptMaker) NewReceipt() types.MessageReceipt { + seq := rm.seq + rm.seq++ + return types.MessageReceipt{ + Return: []byte(fmt.Sprintf("%d", seq)), + } +} diff --git a/pkg/testhelpers/net.go b/pkg/testhelpers/net.go index ce1bacbeff..2ba8415d01 100644 --- a/pkg/testhelpers/net.go +++ b/pkg/testhelpers/net.go @@ -8,9 +8,8 @@ import ( "testing" "time" - "github.com/filecoin-project/venus/pkg/types" - "github.com/filecoin-project/venus/pkg/chainsync/exchange" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/connmgr" "github.com/libp2p/go-libp2p-core/event" @@ -213,7 +212,7 @@ func (f *TestFetcher) FetchTipSets(ctx context.Context, tsKey types.TipSetKey, f return nil, err } - ts, err := types.NewTipSet(res...) + ts, err := types.NewTipSet(res) if err != nil { return nil, err } diff --git a/pkg/testhelpers/singer.go b/pkg/testhelpers/singer.go new file mode 100644 index 0000000000..135e033c20 --- /dev/null +++ b/pkg/testhelpers/singer.go @@ -0,0 +1,153 @@ +package testhelpers + +import ( + "bytes" + "context" + "crypto/rand" + "errors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/venus/pkg/crypto" +) + +// MockSigner implements the Signer interface +type MockSigner struct { + AddrKeyInfo map[address.Address]crypto.KeyInfo + Addresses []address.Address + PubKeys [][]byte +} + +// NewMockSigner returns a new mock signer, capable of signing data with +// keys (addresses derived from) in keyinfo +func NewMockSigner(kis []crypto.KeyInfo) MockSigner { + var ms MockSigner + ms.AddrKeyInfo = make(map[address.Address]crypto.KeyInfo) + for _, k := range kis { + // extract public key + pub, err := k.PublicKey() + if err != nil { + panic(err) + } + + var newAddr address.Address + if k.SigType == crypto.SigTypeSecp256k1 { + newAddr, err = address.NewSecp256k1Address(pub) + } else if k.SigType == crypto.SigTypeBLS { + newAddr, err = address.NewBLSAddress(pub) + } + if err != nil { + panic(err) + } + ms.Addresses = append(ms.Addresses, newAddr) + ms.AddrKeyInfo[newAddr] = k + ms.PubKeys = append(ms.PubKeys, pub) + } + return ms +} + +// NewMockSignersAndKeyInfo is a convenience function to generate a mock +// signers with some keys. +func NewMockSignersAndKeyInfo(numSigners int) (MockSigner, []crypto.KeyInfo) { + ki := MustGenerateKeyInfo(numSigners, 42) + signer := NewMockSigner(ki) + return signer, ki +} + +// MustGenerateMixedKeyInfo produces m bls keys and n secp keys. +// BLS and Secp will be interleaved. The keys will be valid, but not deterministic. +func MustGenerateMixedKeyInfo(m int, n int) []crypto.KeyInfo { + info := []crypto.KeyInfo{} + for m > 0 && n > 0 { + if m > 0 { + ki, err := crypto.NewBLSKeyFromSeed(rand.Reader) + if err != nil { + panic(err) + } + info = append(info, ki) + m-- + } + + if n > 0 { + ki, err := crypto.NewSecpKeyFromSeed(rand.Reader) + if err != nil { + panic(err) + } + info = append(info, ki) + n-- + } + } + return info +} + +// MustGenerateBLSKeyInfo produces n distinct BLS keyinfos. +func MustGenerateBLSKeyInfo(n int, seed byte) []crypto.KeyInfo { + token := bytes.Repeat([]byte{seed}, 512) + var keyinfos []crypto.KeyInfo + for i := 0; i < n; i++ { + token[0] = byte(i) + ki, err := crypto.NewBLSKeyFromSeed(bytes.NewReader(token)) + if err != nil { + panic(err) + } + keyinfos = append(keyinfos, ki) + } + return keyinfos +} + +// MustGenerateKeyInfo generates `n` distinct keyinfos using seed `seed`. +// The result is deterministic (for stable tests), don't use this for real keys! +func MustGenerateKeyInfo(n int, seed byte) []crypto.KeyInfo { + token := bytes.Repeat([]byte{seed}, 512) + var keyinfos []crypto.KeyInfo + for i := 0; i < n; i++ { + token[0] = byte(i) + ki, err := crypto.NewSecpKeyFromSeed(bytes.NewReader(token)) + if err != nil { + panic(err) + } + keyinfos = append(keyinfos, ki) + } + return keyinfos +} + +// SignBytes cryptographically signs `data` using the `addr`. +func (ms MockSigner) SignBytes(_ context.Context, data []byte, addr address.Address) (*crypto.Signature, error) { + ki, ok := ms.AddrKeyInfo[addr] + if !ok { + return nil, errors.New("unknown address") + } + var sig *crypto.Signature + err := ki.UsePrivateKey(func(privateKey []byte) error { + var err error + sig, err = crypto.Sign(data, privateKey, ki.SigType) + + return err + }) + return sig, err +} + +// HasAddress returns whether the signer can sign with this address +func (ms MockSigner) HasAddress(_ context.Context, addr address.Address) (bool, error) { + return true, nil +} + +// GetAddressForPubKey looks up a KeyInfo address associated with a given PublicKeyForSecpSecretKey for a MockSigner +func (ms MockSigner) GetAddressForPubKey(pk []byte) (address.Address, error) { + var addr address.Address + + for _, ki := range ms.AddrKeyInfo { + testPk, err := ki.PublicKey() + if err != nil { + return address.Undef, err + } + + if bytes.Equal(testPk, pk) { + addr, err := ki.Address() + if err != nil { + return addr, errors.New("could not fetch address") + } + return addr, nil + } + } + return addr, errors.New("public key not found in wallet") +} diff --git a/pkg/testhelpers/test_daemon.go b/pkg/testhelpers/test_daemon.go index b0d9e1396e..d741e01c36 100644 --- a/pkg/testhelpers/test_daemon.go +++ b/pkg/testhelpers/test_daemon.go @@ -30,7 +30,7 @@ import ( "github.com/filecoin-project/venus/build/project" "github.com/filecoin-project/venus/pkg/config" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) const ( diff --git a/pkg/testhelpers/tipset.go b/pkg/testhelpers/tipset.go new file mode 100644 index 0000000000..7518420d18 --- /dev/null +++ b/pkg/testhelpers/tipset.go @@ -0,0 +1,16 @@ +package testhelpers + +import ( + "testing" + + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/stretchr/testify/require" +) + +// RequireNewTipSet instantiates and returns a new tipset of the given blocks +// and requires that the setup validation succeed. +func RequireNewTipSet(t *testing.T, blks ...*types.BlockHeader) *types.TipSet { + ts, err := types.NewTipSet(blks) + require.NoError(t, err) + return ts +} diff --git a/pkg/types/internal/atto_fil_test.go b/pkg/types/internal/atto_fil_test.go index 3d4f0b5357..f4f6eec969 100644 --- a/pkg/types/internal/atto_fil_test.go +++ b/pkg/types/internal/atto_fil_test.go @@ -1,11 +1,12 @@ package internal import ( + "math/big" + "testing" + specsbig "github.com/filecoin-project/go-state-types/big" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/stretchr/testify/assert" - "math/big" - "testing" ) func mustParseBigInt(s string) big.Int { diff --git a/pkg/util/dag/dag_test.go b/pkg/util/dag/dag_test.go index 761cd3f405..f3c310faf9 100644 --- a/pkg/util/dag/dag_test.go +++ b/pkg/util/dag/dag_test.go @@ -5,6 +5,8 @@ import ( "testing" "time" + "github.com/filecoin-project/venus/pkg/testhelpers" + "github.com/filecoin-project/go-address" "github.com/ipfs/go-blockservice" "github.com/ipfs/go-datastore" @@ -16,7 +18,6 @@ import ( "github.com/filecoin-project/venus/pkg/chain" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" ) func TestDAGGet(t *testing.T) { @@ -47,7 +48,7 @@ func TestDAGGet(t *testing.T) { dserv := merkledag.NewDAGService(blkserv) dag := NewDAG(dserv) - someCid := types.CidFromString(t, "somecid") + someCid := testhelpers.CidFromString(t, "somecid") _, err := dag.GetNode(ctx, someCid.String()) assert.EqualError(t, err, "merkledag: not found") diff --git a/pkg/vm/gas/gas_tracker.go b/pkg/vm/gas/gas_tracker.go index 1b34a086d4..155848d383 100644 --- a/pkg/vm/gas/gas_tracker.go +++ b/pkg/vm/gas/gas_tracker.go @@ -7,8 +7,8 @@ import ( "github.com/filecoin-project/go-state-types/exitcode" - types2 "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/vm/runtime" + types "github.com/filecoin-project/venus/venus-shared/stmgr" ) // GasTracker maintains the stateView of gas usage throughout the execution of a message. @@ -16,12 +16,12 @@ type GasTracker struct { //nolint GasAvailable int64 GasUsed int64 - ExecutionTrace types2.ExecutionTrace + ExecutionTrace types.ExecutionTrace NumActorsCreated uint64 //nolint AllowInternal bool //nolint CallerValidated bool //nolint LastGasChargeTime time.Time //nolint - LastGasCharge *types2.GasTrace + LastGasCharge *types.GasTrace } // NewGasTracker initializes a new empty gas tracker @@ -60,7 +60,7 @@ func (t *GasTracker) TryCharge(gasCharge GasCharge) bool { t.LastGasCharge.TimeTaken = now.Sub(t.LastGasChargeTime) } - gasTrace := types2.GasTrace{ + gasTrace := types.GasTrace{ Name: gasCharge.Name, Extra: gasCharge.Extra, diff --git a/pkg/vm/vmcontext/interpreter.go b/pkg/vm/vmcontext/interpreter.go index 421bd80922..3a802fda80 100644 --- a/pkg/vm/vmcontext/interpreter.go +++ b/pkg/vm/vmcontext/interpreter.go @@ -4,7 +4,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" ) diff --git a/pkg/vm/vmcontext/invocation_context.go b/pkg/vm/vmcontext/invocation_context.go index eec517e478..da7d6c3330 100644 --- a/pkg/vm/vmcontext/invocation_context.go +++ b/pkg/vm/vmcontext/invocation_context.go @@ -5,8 +5,6 @@ import ( "encoding/binary" "fmt" - types2 "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -18,7 +16,6 @@ import ( ipfscbor "github.com/ipfs/go-ipld-cbor" xerrors "github.com/pkg/errors" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/vm/dispatch" "github.com/filecoin-project/venus/pkg/vm/gas" "github.com/filecoin-project/venus/pkg/vm/runtime" @@ -28,6 +25,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/actors/builtin/account" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var gasOnActorExec = gas.NewGasCharge("OnActorExec", 0, 0) @@ -305,7 +303,7 @@ func (ctx *invocationContext) resolveTarget(target address.Address) (*types.Acto } // get init State - state, err := init_.Load(ctx.vm.ContextStore(), (*types2.Actor)(initActorEntry)) + state, err := init_.Load(ctx.vm.ContextStore(), initActorEntry) if err != nil { panic(err) } @@ -402,7 +400,7 @@ func (ctx *invocationContext) resolveToKeyAddr(addr address.Address) (address.Ad return address.Undef, xerrors.Errorf("failed to find actor: %s", addr) } - aast, err := account.Load(adt.WrapStore(ctx.vm.context, ctx.vm.store), (*types2.Actor)(act)) + aast, err := account.Load(adt.WrapStore(ctx.vm.context, ctx.vm.store), act) if err != nil { return address.Undef, xerrors.Errorf("failed to get account actor State for %s: %v", addr, err) } diff --git a/pkg/vm/vmcontext/runtime_adapter.go b/pkg/vm/vmcontext/runtime_adapter.go index 012242fe85..a398a9e781 100644 --- a/pkg/vm/vmcontext/runtime_adapter.go +++ b/pkg/vm/vmcontext/runtime_adapter.go @@ -6,7 +6,6 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/aerrors" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/ipfs/go-cid" @@ -25,6 +24,7 @@ import ( rt5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" "github.com/filecoin-project/venus/pkg/vm/gas" "github.com/filecoin-project/venus/pkg/vm/runtime" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var EmptyObjectCid cid.Cid diff --git a/pkg/vm/vmcontext/syscallsStateView.go b/pkg/vm/vmcontext/syscallsStateView.go index b70abf9aef..024d7e92ae 100644 --- a/pkg/vm/vmcontext/syscallsStateView.go +++ b/pkg/vm/vmcontext/syscallsStateView.go @@ -11,7 +11,6 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin/account" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/pkg/errors" ) @@ -40,7 +39,7 @@ func (vm *syscallsStateView) ResolveToKeyAddr(ctx context.Context, accountAddr a if !found { return address.Undef, fmt.Errorf("signer resolution found no such actor %s", accountAddr) } - accountState, err := account.Load(adt.WrapStore(vm.context, vm.ctx.gasIpld), (*types.Actor)(accountActor)) + accountState, err := account.Load(adt.WrapStore(vm.context, vm.ctx.gasIpld), accountActor) if err != nil { // This error is internal, shouldn't propagate as on-chain failure panic(fmt.Errorf("signer resolution failed To lost stateView for %s ", accountAddr)) @@ -59,7 +58,7 @@ func (vm *syscallsStateView) MinerInfo(ctx context.Context, maddr address.Addres return nil, fmt.Errorf("miner resolution found no such actor %s", maddr) } - accountState, err := miner.Load(adt.WrapStore(vm.context, vm.ctx.gasIpld), (*types.Actor)(accountActor)) + accountState, err := miner.Load(adt.WrapStore(vm.context, vm.ctx.gasIpld), accountActor) if err != nil { panic(fmt.Errorf("signer resolution failed To lost stateView for %s ", maddr)) } diff --git a/pkg/vm/vmcontext/types.go b/pkg/vm/vmcontext/types.go index 6bf021b30f..21f3527138 100644 --- a/pkg/vm/vmcontext/types.go +++ b/pkg/vm/vmcontext/types.go @@ -2,10 +2,12 @@ package vmcontext import ( "context" + acrypto "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" @@ -13,7 +15,6 @@ import ( "github.com/filecoin-project/venus/pkg/fork" "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/vm/dispatch" "github.com/filecoin-project/venus/pkg/vm/gas" ) @@ -70,8 +71,8 @@ type Ret struct { // Failure returns with a non-zero exit code. func Failure(exitCode exitcode.ExitCode, gasAmount int64) types.MessageReceipt { return types.MessageReceipt{ - ExitCode: exitCode, - ReturnValue: []byte{}, - GasUsed: gasAmount, + ExitCode: exitCode, + Return: []byte{}, + GasUsed: gasAmount, } } diff --git a/pkg/vm/vmcontext/vmcontext.go b/pkg/vm/vmcontext/vmcontext.go index 37511f8874..789badcd83 100644 --- a/pkg/vm/vmcontext/vmcontext.go +++ b/pkg/vm/vmcontext/vmcontext.go @@ -23,7 +23,6 @@ import ( rt5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/pkg/vm/dispatch" "github.com/filecoin-project/venus/pkg/vm/gas" @@ -33,7 +32,8 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin/cron" initActor "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" + types2 "github.com/filecoin-project/venus/venus-shared/stmgr" ) const MaxCallDepth = 4096 @@ -76,7 +76,7 @@ type ActorImplLookup interface { GetActorImpl(code cid.Cid, rt runtime.Runtime) (dispatch.Dispatcher, *dispatch.ExcuteError) } -func VmMessageFromUnsignedMessage(msg *types.UnsignedMessage) VmMessage { //nolint +func VmMessageFromUnsignedMessage(msg *types.Message) VmMessage { //nolint return VmMessage{ From: msg.From, To: msg.To, @@ -183,7 +183,7 @@ func (vm *VM) normalizeAddress(addr address.Address) (address.Address, bool) { } // get a view into the actor stateView - initActorState, err := initActor.Load(adt.WrapStore(vm.context, vm.store), (*types2.Actor)(initActorEntry)) + initActorState, err := initActor.Load(adt.WrapStore(vm.context, vm.store), initActorEntry) if err != nil { panic(err) } @@ -286,7 +286,7 @@ func (vm *VM) ApplyTipSetMessages(blocks []types.BlockMessagesInfo, ts *types.Ti msgGasOutput, _ := json.MarshalIndent(ret.OutPuts, "", "\t") vm.debugger.Println(string(msgGasOutput)) - var valuedTraces []*types.GasTrace + var valuedTraces []*types2.GasTrace for _, trace := range ret.GasTracker.ExecutionTrace.GasCharges { if trace.TotalGas > 0 { valuedTraces = append(valuedTraces, trace) @@ -395,9 +395,9 @@ func (vm *VM) applyImplicitMessage(imsg VmMessage) (*Ret, error) { GasTracker: gasTank, OutPuts: gas.GasOutputs{}, Receipt: types.MessageReceipt{ - ExitCode: code, - ReturnValue: ret, - GasUsed: 0, + ExitCode: code, + Return: ret, + GasUsed: 0, }, }, nil } @@ -414,7 +414,7 @@ func (vm *VM) ApplyMessage(msg types.ChainMsg) (*Ret, error) { } // applyMessage applies the message To the current stateView. -func (vm *VM) applyMessage(msg *types.UnsignedMessage, onChainMsgSize int) (*Ret, error) { +func (vm *VM) applyMessage(msg *types.Message, onChainMsgSize int) (*Ret, error) { vm.SetCurrentEpoch(vm.vmOption.Epoch) // This Method does not actually execute the message itself, // but rather deals with the pre/post processing of a message. @@ -619,14 +619,14 @@ func (vm *VM) applyMessage(msg *types.UnsignedMessage, onChainMsgSize int) (*Ret GasTracker: gasTank, OutPuts: gasOutputs, Receipt: types.MessageReceipt{ - ExitCode: code, - ReturnValue: ret, - GasUsed: gasUsed, + ExitCode: code, + Return: ret, + GasUsed: gasUsed, }, }, nil } -func (vm *VM) shouldBurn(ctx context.Context, msg *types.UnsignedMessage, errcode exitcode.ExitCode) (bool, error) { +func (vm *VM) shouldBurn(ctx context.Context, msg *types.Message, errcode exitcode.ExitCode) (bool, error) { if vm.NtwkVersion() <= network.Version12 { // Check to see if we should burn funds. We avoid burning on successful // window post. This won't catch _indirect_ window post calls, but this diff --git a/pkg/wallet/wallet.go b/pkg/wallet/wallet.go index c3923d0928..0e0b0eefef 100644 --- a/pkg/wallet/wallet.go +++ b/pkg/wallet/wallet.go @@ -12,6 +12,7 @@ import ( "github.com/pkg/errors" "github.com/filecoin-project/venus/pkg/crypto" + types "github.com/filecoin-project/venus/venus-shared/wallet" ) var TestPassword = []byte("test-password") @@ -27,7 +28,7 @@ type WalletIntersection interface { NewAddress(p address.Protocol) (address.Address, error) Import(ki *crypto.KeyInfo) (address.Address, error) Export(addr address.Address, password string) (*crypto.KeyInfo, error) - WalletSign(keyAddr address.Address, msg []byte, meta MsgMeta) (*crypto.Signature, error) + WalletSign(keyAddr address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) HasPassword() bool } @@ -203,7 +204,7 @@ func (w *Wallet) Export(addr address.Address, password string) (*crypto.KeyInfo, } //WalletSign used to sign message with private key -func (w *Wallet) WalletSign(addr address.Address, msg []byte, meta MsgMeta) (*crypto.Signature, error) { +func (w *Wallet) WalletSign(addr address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) { ki, err := w.Find(addr) if err != nil { return nil, err diff --git a/pkg/wallet/wallet_test.go b/pkg/wallet/wallet_test.go index 55b93124e2..03f0c27bac 100644 --- a/pkg/wallet/wallet_test.go +++ b/pkg/wallet/wallet_test.go @@ -4,6 +4,8 @@ import ( "bytes" "testing" + "github.com/filecoin-project/venus/pkg/testhelpers" + "github.com/filecoin-project/go-address" "github.com/ipfs/go-datastore" "github.com/stretchr/testify/assert" @@ -13,7 +15,6 @@ import ( "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/crypto" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/types" ) func newWalletAndDSBackend(t *testing.T) (*Wallet, *DSBackend) { @@ -49,7 +50,7 @@ func TestWalletSimple(t *testing.T) { assert.Equal(t, fs, backend) t.Log("find unknown address") - randomAddr := types.NewForTestGetter()() + randomAddr := testhelpers.NewForTestGetter()() assert.False(t, w.HasAddress(randomAddr)) diff --git a/tools/client/main.go b/tools/client/main.go index 52bb52a492..93fd67151f 100644 --- a/tools/client/main.go +++ b/tools/client/main.go @@ -15,7 +15,7 @@ import ( "github.com/filecoin-project/venus/app/client" "github.com/filecoin-project/venus/app/client/v0api" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) const Filecoin = "Filecoin" diff --git a/tools/conformance/driver.go b/tools/conformance/driver.go index 9ee18e0462..4095559033 100644 --- a/tools/conformance/driver.go +++ b/tools/conformance/driver.go @@ -2,11 +2,12 @@ package conformance import ( "context" - "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" - "github.com/filecoin-project/venus/pkg/vm/vmcontext" gobig "math/big" "os" + "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" + "github.com/filecoin-project/venus/pkg/vm/vmcontext" + "github.com/filecoin-project/venus/pkg/vm/gas" cbor "github.com/ipfs/go-ipld-cbor" @@ -27,8 +28,8 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/test-vectors/schema" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/tools/conformance/chaos" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" blockstore "github.com/ipfs/go-ipfs-blockstore" @@ -222,7 +223,7 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, chainDs ds.Batching, pr type ExecuteMessageParams struct { Preroot cid.Cid Epoch abi.ChainEpoch - Message *types.UnsignedMessage + Message *types.Message CircSupply abi.TokenAmount BaseFee abi.TokenAmount @@ -325,7 +326,7 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP // others untouched. // TODO: generate a signature in the DSL so that it's encoded in // the test vector. -func toChainMsg(msg *types.UnsignedMessage) (ret types.ChainMsg) { +func toChainMsg(msg *types.Message) (ret types.ChainMsg) { ret = msg if msg.From.Protocol() == address.SECP256K1 { ret = &types.SignedMessage{ diff --git a/tools/conformance/rand_record.go b/tools/conformance/rand_record.go index b1c2ec8a52..69f32271c7 100644 --- a/tools/conformance/rand_record.go +++ b/tools/conformance/rand_record.go @@ -3,11 +3,11 @@ package conformance import ( "context" "fmt" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/pkg/vm/vmcontext" "sync" - "github.com/filecoin-project/venus/pkg/types" + "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/pkg/vm/vmcontext" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" diff --git a/tools/conformance/runner.go b/tools/conformance/runner.go index 59f0629a78..8655b25aeb 100644 --- a/tools/conformance/runner.go +++ b/tools/conformance/runner.go @@ -6,12 +6,14 @@ import ( "context" "encoding/base64" "fmt" - "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "io/ioutil" "os" "os/exec" "strconv" + "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/fatih/color" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/exitcode" @@ -24,7 +26,6 @@ import ( "github.com/ipfs/go-merkledag" "github.com/ipld/go-car" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/vm" ) @@ -147,7 +148,7 @@ func AssertMsgResult(r Reporter, expected *schema.Receipt, actual *vm.Ret, label if expected, actual := expected.GasUsed, actual.Receipt.GasUsed; expected != actual { r.Errorf("gas used of msg %s did not match; expected: %d, got: %d", label, expected, actual) } - if expected, actual := []byte(expected.ReturnValue), actual.Receipt.ReturnValue; !bytes.Equal(expected, actual) { + if expected, actual := []byte(expected.ReturnValue), actual.Receipt.Return; !bytes.Equal(expected, actual) { r.Errorf("return value of msg %s did not match; expected: %s, got: %s", label, base64.StdEncoding.EncodeToString(expected), base64.StdEncoding.EncodeToString(actual)) } } diff --git a/tools/fast/action_mpool.go b/tools/fast/action_mpool.go index 8167f06570..ce7fc3af53 100644 --- a/tools/fast/action_mpool.go +++ b/tools/fast/action_mpool.go @@ -3,7 +3,7 @@ package fast import ( "context" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // MpoolLs runs the `mpool ls` command against the filecoin process. diff --git a/tools/fast/action_protocol.go b/tools/fast/action_protocol.go index 9c322d9cd7..0278f7c6f8 100644 --- a/tools/fast/action_protocol.go +++ b/tools/fast/action_protocol.go @@ -2,7 +2,8 @@ package fast import ( "context" - "github.com/filecoin-project/venus/app/submodule/apitypes" + + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" ) // Protocol runs the `protocol` command against the filecoin process diff --git a/tools/fast/action_show.go b/tools/fast/action_show.go index 45d4ab879e..207c6a956d 100644 --- a/tools/fast/action_show.go +++ b/tools/fast/action_show.go @@ -3,9 +3,8 @@ package fast import ( "context" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types" ) // ShowHeader runs the `show header` command against the filecoin process diff --git a/tools/fast/action_wallet.go b/tools/fast/action_wallet.go index 1f5aa8c04a..2eb64f2dee 100644 --- a/tools/fast/action_wallet.go +++ b/tools/fast/action_wallet.go @@ -2,16 +2,17 @@ package fast import ( "context" + "strings" + fbig "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/venus/cmd" "github.com/libp2p/go-libp2p-core/peer" - "strings" "github.com/filecoin-project/go-address" files "github.com/ipfs/go-ipfs-files" "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // AddressNew runs the address new command against the filecoin process. diff --git a/tools/fast/series/wait_for_chain_message.go b/tools/fast/series/wait_for_chain_message.go index 44003cad28..482d1d1886 100644 --- a/tools/fast/series/wait_for_chain_message.go +++ b/tools/fast/series/wait_for_chain_message.go @@ -5,8 +5,8 @@ import ( "fmt" "io" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/tools/fast" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" ) diff --git a/tools/gen_cbor/main.go b/tools/gen_cbor/main.go index 2ebec30d05..66c4de6828 100644 --- a/tools/gen_cbor/main.go +++ b/tools/gen_cbor/main.go @@ -7,7 +7,6 @@ import ( "github.com/filecoin-project/venus/pkg/market" "github.com/filecoin-project/venus/pkg/paychmgr" "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/vm/dispatch" gen "github.com/whyrusleeping/cbor-gen" ) @@ -27,20 +26,20 @@ func main() { panic(err) } - if err := gen.WriteTupleEncodersToFile("./pkg/types/internal/cbor_gen.go", "internal", - types.MessageReceipt{}, - types.SignedMessage{}, - types.UnsignedMessage{}, - types.TxMeta{}, - types.Actor{}, - types.BeaconEntry{}, - types.BlockHeader{}, - types.Ticket{}, - types.ElectionProof{}, - types.BlockMsg{}, - ); err != nil { - panic(err) - } + //if err := gen.WriteTupleEncodersToFile("./pkg/types/internal/cbor_gen.go", "internal", + // types.MessageReceipt{}, + // types.SignedMessage{}, + // types.TxMeta{}, + // types.UnsignedMessage{}, + // types.Actor{}, + // types.BeaconEntry{}, + // types.BlockHeader{}, + // types.Ticket{}, + // types.ElectionProof{}, + // types.BlockMsg{}, + //); err != nil { + // panic(err) + //} if err := gen.WriteTupleEncodersToFile("./pkg/discovery/cbor_gen.go", "discovery", discovery.HelloMessage{}, diff --git a/tools/gengen/util/generator.go b/tools/gengen/util/generator.go index b426a76220..1292abb2ca 100644 --- a/tools/gengen/util/generator.go +++ b/tools/gengen/util/generator.go @@ -4,12 +4,12 @@ import ( "bytes" "context" "fmt" - "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" - "github.com/filecoin-project/venus/pkg/vm/vmcontext" "io" mrand "math/rand" "github.com/filecoin-project/venus/pkg/fork" + "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" + "github.com/filecoin-project/venus/pkg/vm/vmcontext" "github.com/filecoin-project/go-address" ds "github.com/ipfs/go-datastore" @@ -41,17 +41,17 @@ import ( "github.com/filecoin-project/venus/pkg/genesis" gfcstate "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/state/tree" - "github.com/filecoin-project/venus/pkg/types" blockstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/pkg/vm/gas" "github.com/filecoin-project/venus/pkg/vmsupport" + types "github.com/filecoin-project/venus/venus-shared/chain" ) const InitialBaseFee = 100e6 var ( - rewardActorInitialBalance = types.NewAttoFILFromFIL(1.4e9) + rewardActorInitialBalance = types.FromFil(1.4e9) ) type GenesisGenerator struct { @@ -304,12 +304,12 @@ func (g *GenesisGenerator) setupPrealloc() error { return err } - value, ok := types.NewAttoFILFromFILString(v) - if !ok { + value, err := types.ParseFIL(v) + if err != nil { return fmt.Errorf("failed to parse FIL value '%s'", v) } - _, err = g.vm.ApplyGenesisMessage(builtin.RewardActorAddr, addr, builtin.MethodSend, value, nil) + _, err = g.vm.ApplyGenesisMessage(builtin.RewardActorAddr, addr, builtin.MethodSend, abi.TokenAmount{Int: value.Int}, nil) if err != nil { return err } @@ -329,7 +329,7 @@ func (g *GenesisGenerator) genBlock(ctx context.Context) (cid.Cid, error) { return cid.Undef, err } - meta := &types.TxMeta{SecpRoot: emptyAMTCid, BLSRoot: emptyAMTCid} + meta := &types.MessageRoot{SecpkRoot: emptyAMTCid, BlsRoot: emptyAMTCid} metaCid, err := g.cst.Put(ctx, meta) if err != nil { return cid.Undef, err @@ -337,10 +337,10 @@ func (g *GenesisGenerator) genBlock(ctx context.Context) (cid.Cid, error) { geneblk := &types.BlockHeader{ Miner: builtin.SystemActorAddr, - Ticket: genesis.Ticket, - BeaconEntries: []*types.BeaconEntry{{Data: []byte{0xca, 0xfe, 0xfa, 0xce}}}, + Ticket: &genesis.Ticket, + BeaconEntries: []types.BeaconEntry{{Data: []byte{0xca, 0xfe, 0xfa, 0xce}}}, ElectionProof: new(types.ElectionProof), - Parents: types.NewTipSetKey(), + Parents: types.NewTipSetKey().Cids(), ParentWeight: big.Zero(), Height: 0, ParentStateRoot: stateRoot, @@ -610,7 +610,7 @@ func (g *GenesisGenerator) createMiner(ctx context.Context, m *CreateStorageMine } // get miner ID address createMinerReturn := power.CreateMinerReturn{} - err = createMinerReturn.UnmarshalCBOR(bytes.NewReader(out.Receipt.ReturnValue)) + err = createMinerReturn.UnmarshalCBOR(bytes.NewReader(out.Receipt.Return)) if err != nil { return address.Undef, address.Undef, err } @@ -675,7 +675,7 @@ func (g *GenesisGenerator) publishDeals(actorAddr, clientAddr address.Address, c return nil, xerrors.Errorf("execute genesis msg error") } publishStoreageDealsReturn := market.PublishStorageDealsReturn{} - err = publishStoreageDealsReturn.UnmarshalCBOR(bytes.NewReader(out.Receipt.ReturnValue)) + err = publishStoreageDealsReturn.UnmarshalCBOR(bytes.NewReader(out.Receipt.Return)) if err != nil { return nil, err } @@ -696,7 +696,7 @@ func (g *GenesisGenerator) getDealWeight(dealID abi.DealID, sectorExpiry abi.Cha return big.Zero(), big.Zero(), xerrors.Errorf("execute genesis msg error") } verifyDealsReturn := market.VerifyDealsForActivationReturn{} - err = verifyDealsReturn.UnmarshalCBOR(bytes.NewReader(weightOut.Receipt.ReturnValue)) + err = verifyDealsReturn.UnmarshalCBOR(bytes.NewReader(weightOut.Receipt.Return)) if err != nil { return big.Zero(), big.Zero(), err } @@ -716,7 +716,7 @@ func (g *GenesisGenerator) doExecValue(ctx context.Context, to, from address.Add if ret.Receipt.ExitCode != 0 { return nil, xerrors.Errorf("execute genesis msg error") } - return ret.Receipt.ReturnValue, nil + return ret.Receipt.Return, nil } func (g *GenesisGenerator) currentTotalPower(ctx context.Context, maddr address.Address) (*power.CurrentTotalPowerReturn, error) { diff --git a/tools/gengen/util/gengen.go b/tools/gengen/util/gengen.go index f730c00327..f32a02d405 100644 --- a/tools/gengen/util/gengen.go +++ b/tools/gengen/util/gengen.go @@ -19,7 +19,7 @@ import ( "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/genesis" - "github.com/filecoin-project/venus/pkg/types" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // CreateStorageMinerConfig holds configuration options used to create a storage diff --git a/tools/seed/seed.go b/tools/seed/seed.go index 9d08b139eb..b9cd5b1605 100644 --- a/tools/seed/seed.go +++ b/tools/seed/seed.go @@ -7,13 +7,15 @@ import ( "encoding/hex" "encoding/json" "fmt" - "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" "io/ioutil" "os" "path/filepath" "strconv" "strings" + "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" + types "github.com/filecoin-project/venus/venus-shared/chain" + ffi "github.com/filecoin-project/filecoin-ffi" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-commp-utils/zerocomm" @@ -31,7 +33,6 @@ import ( "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/gen/genesis" - "github.com/filecoin-project/venus/pkg/types" "github.com/filecoin-project/venus/pkg/util/ffiwrapper/basicfs" "github.com/filecoin-project/venus/pkg/util/storiface" ) diff --git a/venus-shared/api/chain/types.go b/venus-shared/api/chain/types.go index 7cf1552e71..6cd60002e2 100644 --- a/venus-shared/api/chain/types.go +++ b/venus-shared/api/chain/types.go @@ -9,7 +9,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" @@ -77,6 +76,8 @@ type Deadline struct { DisputableProofCount uint64 } +var MarketBalanceNil = MarketBalance{} + type MarketDeal struct { Proposal market.DealProposal State market.DealState @@ -139,12 +140,12 @@ type BlockTemplate struct { } type EstimateMessage struct { - Msg *Message + Msg *chain.Message Spec *MessageSendSpec } type EstimateResult struct { - Msg *Message + Msg *chain.Message Err string } @@ -185,15 +186,6 @@ type ChannelAvailableFunds struct { VoucherReedeemedAmt chain.BigInt } -// ChainInfo is used to track metadata about a peer and its chain. -type ChainInfo struct { - // The originator of the TipSetKey propagation wave. - Source peer.ID - // The peer that sent us the TipSetKey message. - Sender peer.ID - Head *chain.TipSet -} - type SyncState struct { ActiveSyncs []ActiveSync diff --git a/venus-shared/api/chain/v0/syncer.go b/venus-shared/api/chain/v0/syncer.go index 60932dc8f9..51acbd7cd2 100644 --- a/venus-shared/api/chain/v0/syncer.go +++ b/venus-shared/api/chain/v0/syncer.go @@ -11,7 +11,7 @@ import ( type ISyncer interface { // Rule[perm:write] - ChainSyncHandleNewTipSet(ctx context.Context, ci *chain2.ChainInfo) error + ChainSyncHandleNewTipSet(ctx context.Context, ci *chain.ChainInfo) error // Rule[perm:admin] SetConcurrent(ctx context.Context, concurrent int64) error diff --git a/venus-shared/api/chain/v0/wallet.go b/venus-shared/api/chain/v0/wallet.go index 47f36a0c03..5989045826 100644 --- a/venus-shared/api/chain/v0/wallet.go +++ b/venus-shared/api/chain/v0/wallet.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - crypto "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/venus/venus-shared/wallet" diff --git a/venus-shared/api/chain/v1/market.go b/venus-shared/api/chain/v1/market.go index 27583a26ce..fc0119d888 100644 --- a/venus-shared/api/chain/v1/market.go +++ b/venus-shared/api/chain/v1/market.go @@ -4,7 +4,6 @@ import ( "context" chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/chain" ) diff --git a/venus-shared/api/chain/v1/mining.go b/venus-shared/api/chain/v1/mining.go index e9f4b72a1f..abbebb9da9 100644 --- a/venus-shared/api/chain/v1/mining.go +++ b/venus-shared/api/chain/v1/mining.go @@ -5,8 +5,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/filecoin-project/venus/venus-shared/chain" ) diff --git a/venus-shared/api/chain/v1/syncer.go b/venus-shared/api/chain/v1/syncer.go index 104bc7ab08..fc1471f908 100644 --- a/venus-shared/api/chain/v1/syncer.go +++ b/venus-shared/api/chain/v1/syncer.go @@ -11,7 +11,7 @@ import ( type ISyncer interface { // Rule[perm:write] - ChainSyncHandleNewTipSet(ctx context.Context, ci *chain2.ChainInfo) error + ChainSyncHandleNewTipSet(ctx context.Context, ci *chain.ChainInfo) error // Rule[perm:admin] SetConcurrent(ctx context.Context, concurrent int64) error diff --git a/venus-shared/api/chain/v1/wallet.go b/venus-shared/api/chain/v1/wallet.go index b1998aff65..d45d69bade 100644 --- a/venus-shared/api/chain/v1/wallet.go +++ b/venus-shared/api/chain/v1/wallet.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - crypto "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/venus/venus-shared/wallet" diff --git a/venus-shared/chain/actor.go b/venus-shared/chain/actor.go index b38937cc86..2d20c6cfc1 100644 --- a/venus-shared/chain/actor.go +++ b/venus-shared/chain/actor.go @@ -1,10 +1,14 @@ package chain import ( + "errors" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" ) +var ErrActorNotFound = errors.New("actor not found") + // Actor is the central abstraction of entities in the system. // // Both individual accounts, as well as contracts (user & system level) are @@ -33,3 +37,23 @@ type Actor struct { // Balance is the amount of attoFIL in the actor's account. Balance abi.TokenAmount } + +// NewActor constructs a new actor. +func NewActor(code cid.Cid, balance abi.TokenAmount, head cid.Cid) *Actor { + return &Actor{ + Code: code, + Nonce: 0, + Balance: balance, + Head: head, + } +} + +// Empty tests whether the actor's code is defined. +func (t *Actor) Empty() bool { + return !t.Code.Defined() +} + +// IncrementSeqNum increments the seq number. +func (t *Actor) IncrementSeqNum() { + t.Nonce = t.Nonce + 1 +} diff --git a/venus-shared/chain/block_header.go b/venus-shared/chain/block_header.go index dc2515bbe7..cc17a3d4e4 100644 --- a/venus-shared/chain/block_header.go +++ b/venus-shared/chain/block_header.go @@ -12,6 +12,8 @@ import ( proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + cbor "github.com/ipfs/go-ipld-cbor" + node "github.com/ipfs/go-ipld-format" ) // DecodeBlock decodes raw cbor bytes into a BlockHeader. @@ -168,3 +170,27 @@ func (b *BlockHeader) SetValidated() { func (b *BlockHeader) IsValidated() bool { return b.validated } + +// ToNode converts the BlockHeader to an IPLD node. +func (b *BlockHeader) ToNode() node.Node { + buf := new(bytes.Buffer) + err := b.MarshalCBOR(buf) + if err != nil { + panic(err) + } + data := buf.Bytes() + c, err := DefaultCidBuilder.Sum(data) + if err != nil { + panic(err) + } + + blk, err := blocks.NewBlockWithCid(data, c) + if err != nil { + panic(err) + } + n, err := cbor.DecodeBlock(blk) + if err != nil { + panic(err) + } + return n +} diff --git a/venus-shared/chain/block_message.go b/venus-shared/chain/block_message.go new file mode 100644 index 0000000000..c631f35a81 --- /dev/null +++ b/venus-shared/chain/block_message.go @@ -0,0 +1,9 @@ +package chain + +// BlockMessagesInfo contains messages for one newBlock in a tipset. +type BlockMessagesInfo struct { //nolint + BlsMessages []ChainMsg + SecpkMessages []ChainMsg + + Block *BlockHeader +} diff --git a/venus-shared/chain/block_message_test.go b/venus-shared/chain/block_message_test.go new file mode 100644 index 0000000000..25b93fa8a0 --- /dev/null +++ b/venus-shared/chain/block_message_test.go @@ -0,0 +1,9 @@ +package chain + +import ( + "testing" +) + +func TestBlockMessageBasic(t *testing.T) { + // todo +} diff --git a/venus-shared/chain/chain_info.go b/venus-shared/chain/chain_info.go new file mode 100644 index 0000000000..e062c73e09 --- /dev/null +++ b/venus-shared/chain/chain_info.go @@ -0,0 +1,31 @@ +package chain + +import ( + "fmt" + + "github.com/libp2p/go-libp2p-core/peer" +) + +// ChainInfo is used to track metadata about a peer and its chain. +type ChainInfo struct { + // The originator of the TipSetKey propagation wave. + Source peer.ID + // The peer that sent us the TipSetKey message. + Sender peer.ID + Head *TipSet +} + +// NewChainInfo creates a chain info from a peer id a head tipset key and a +// chain height. +func NewChainInfo(source peer.ID, sender peer.ID, head *TipSet) *ChainInfo { + return &ChainInfo{ + Source: source, + Sender: sender, + Head: head, + } +} + +// String returns a human-readable string representation of a chain info +func (i *ChainInfo) String() string { + return fmt.Sprintf("{source=%s sender:%s height=%d head=%s}", i.Source, i.Sender, i.Head.Height(), i.Head.Key()) +} diff --git a/venus-shared/chain/message.go b/venus-shared/chain/message.go index c016b4f829..6b072f350d 100644 --- a/venus-shared/chain/message.go +++ b/venus-shared/chain/message.go @@ -7,6 +7,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/venus-shared/chain/params" blocks "github.com/ipfs/go-block-format" @@ -15,6 +16,16 @@ import ( const MessageVersion = 0 +type ChainMsg interface { + Cid() cid.Cid + VMMessage() *Message + ToStorageBlock() (blocks.Block, error) + // FIXME: This is the *message* length, this name is misleading. + ChainLength() int + cbor.Marshaler + cbor.Unmarshaler +} + func DecodeMessage(b []byte) (*Message, error) { var msg Message if err := msg.UnmarshalCBOR(bytes.NewReader(b)); err != nil { @@ -188,3 +199,13 @@ func (m *Message) ValidForBlockInclusion(minGas int64, version network.Version) return nil } + +func (m *Message) VMMessage() *Message { + return m +} + +func (m *Message) RequiredFunds() abi.TokenAmount { + return abi.TokenAmount{Int: BigMul(BigInt{Int: m.GasFeeCap.Int}, NewInt(uint64(m.GasLimit))).Int} +} + +var _ ChainMsg = (*Message)(nil) diff --git a/venus-shared/chain/param.go b/venus-shared/chain/param.go index 4554286c06..9a8e7f78f7 100644 --- a/venus-shared/chain/param.go +++ b/venus-shared/chain/param.go @@ -3,7 +3,12 @@ package chain import ( "math/big" + "github.com/filecoin-project/go-state-types/abi" + big2 "github.com/filecoin-project/go-state-types/big" + "github.com/ipfs/go-cid" + mh "github.com/multiformats/go-multihash" + "github.com/filecoin-project/venus/venus-shared/chain/params" ) @@ -15,3 +20,12 @@ var ( var TotalFilecoinInt = FromFil(params.FilBase) var ZeroAddress = MustParseAddress("f3yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaby2smx7a") + +var EmptyTokenAmount = abi.TokenAmount{} + +// The multihash function identifier to use for content addresses. +const DefaultHashFunction = uint64(mh.BLAKE2B_MIN + 31) + +// A builder for all blockchain CIDs. +// Note that sector commitments use a different scheme. +var DefaultCidBuilder = cid.V1Builder{Codec: cid.DagCBOR, MhType: DefaultHashFunction} diff --git a/venus-shared/chain/shared_func.go b/venus-shared/chain/shared_func.go index 55a65665a6..23d357e619 100644 --- a/venus-shared/chain/shared_func.go +++ b/venus-shared/chain/shared_func.go @@ -2,6 +2,7 @@ package chain import ( "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" ) @@ -22,3 +23,11 @@ func MustParseCid(c string) cid.Cid { return ret } + +func NewGasFeeCap(price int64) abi.TokenAmount { + return abi.NewTokenAmount(price) +} + +func NewGasPremium(price int64) abi.TokenAmount { + return abi.NewTokenAmount(price) +} diff --git a/venus-shared/chain/signed_message.go b/venus-shared/chain/signed_message.go index 3506daa99c..7e719c82c4 100644 --- a/venus-shared/chain/signed_message.go +++ b/venus-shared/chain/signed_message.go @@ -102,3 +102,9 @@ func (smsg *SignedMessage) String() string { return fmt.Sprintf("SignedMessage cid=[%v]: %s", c, string(js)) } + +func (smsg *SignedMessage) VMMessage() *Message { + return &smsg.Message +} + +var _ ChainMsg = (*SignedMessage)(nil) diff --git a/venus-shared/chain/signer.go b/venus-shared/chain/signer.go new file mode 100644 index 0000000000..f50ad85457 --- /dev/null +++ b/venus-shared/chain/signer.go @@ -0,0 +1,14 @@ +package chain + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/crypto" +) + +// Signer signs data with a private key obtained internally from a provided address. +type Signer interface { + SignBytes(ctx context.Context, data []byte, addr address.Address) (*crypto.Signature, error) + HasAddress(ctx context.Context, addr address.Address) (bool, error) +} diff --git a/venus-shared/chain/tipset.go b/venus-shared/chain/tipset.go index 90ad4412ec..f186337c8b 100644 --- a/venus-shared/chain/tipset.go +++ b/venus-shared/chain/tipset.go @@ -15,6 +15,9 @@ type blockHeaderWithCid struct { b *BlockHeader } +// UndefTipSet is a singleton representing a nil or undefined tipset. +var UndefTipSet = &TipSet{} + func NewTipSet(bhs []*BlockHeader) (*TipSet, error) { if len(bhs) == 0 { return nil, fmt.Errorf("no blocks for tipset") @@ -134,6 +137,12 @@ func (ts *TipSet) Len() int { return len(ts.blocks) } +// At returns the i'th newBlock in the tipset. +// An index outside the half-open range [0, Len()) will panic. +func (ts *TipSet) At(i int) *BlockHeader { + return ts.blocks[i] +} + func (ts *TipSet) Blocks() []*BlockHeader { return ts.blocks } @@ -233,6 +242,13 @@ func (ts *TipSet) MinTimestamp() uint64 { return minTS } +// ToSlice returns an ordered slice of pointers to the tipset's blocks. +func (ts *TipSet) ToSlice() []*BlockHeader { + slice := make([]*BlockHeader, len(ts.blocks)) + copy(slice, ts.blocks) + return slice +} + func sortedCidArrsEqual(a, b []cid.Cid) bool { if len(a) != len(b) { return false diff --git a/venus-shared/chain/tipset_key.go b/venus-shared/chain/tipset_key.go index fbb680fe2a..3289b4807a 100644 --- a/venus-shared/chain/tipset_key.go +++ b/venus-shared/chain/tipset_key.go @@ -4,10 +4,14 @@ import ( "bytes" "encoding/json" "fmt" + "io" "strings" + "golang.org/x/xerrors" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" ) // TipSetKey is an immutable set of CIDs forming a unique key for a TipSet. @@ -99,6 +103,91 @@ func (tsk TipSetKey) IsEmpty() bool { return len(tsk.value) == 0 } +// ContainsAll checks if another set is a subset of this one. +// We can assume that the relative order of members of one key is +// maintained in the other since we assume that all ids are sorted +// by corresponding newBlock ticket value. +func (tipsetKey TipSetKey) ContainsAll(other TipSetKey) bool { + // Since we assume the ids must have the same relative sorting we can + // perform one pass over this set, advancing the other index whenever the + // values match. + cids := tipsetKey.Cids() + otherCids := other.Cids() + otherIdx := 0 + for i := 0; i < len(cids) && otherIdx < len(otherCids); i++ { + if cids[i].Equals(otherCids[otherIdx]) { + otherIdx++ + } + } + // otherIdx is advanced the full length only if every element was found in this set. + return otherIdx == len(otherCids) +} + +// Has checks whether the set contains `id`. +func (tipsetKey TipSetKey) Has(id cid.Cid) bool { + // Find index of the first CID not less than id. + for _, cid := range tipsetKey.Cids() { + if cid == id { + return true + } + } + return false +} + +// Equals checks whether the set contains exactly the same CIDs as another. +func (tipsetKey TipSetKey) Equals(other TipSetKey) bool { + return tipsetKey.value == other.value +} + +func (tipsetKey *TipSetKey) UnmarshalCBOR(r io.Reader) error { + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Parents: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + cids := make([]cid.Cid, extra) + for i := 0; i < int(extra); i++ { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("reading cid field t.Parents failed: %v", err) + } + cids[i] = c + } + tipsetKey.value = string(encodeKey(cids)) + } + return nil +} + +func (tipsetKey TipSetKey) MarshalCBOR(w io.Writer) error { + cids := tipsetKey.Cids() + if len(cids) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Parents was too long") + } + scratch := make([]byte, 9) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(cids))); err != nil { + return err + } + for _, v := range cids { + if err := cbg.WriteCidBuf(scratch, w, v); err != nil { + return xerrors.Errorf("failed writing cid field t.Parents: %v", err) + } + } + return nil +} + func encodeKey(cids []cid.Cid) []byte { buffer := new(bytes.Buffer) for _, c := range cids { diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt index 4b6b8aaa12..e69de29bb2 100644 --- a/venus-shared/compatible-checks/api-diff.txt +++ b/venus-shared/compatible-checks/api-diff.txt @@ -1,134 +0,0 @@ -github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.com/filecoin-project/lotus/api.FullNode: - - AuthVerify - + BlockTime - - ChainBlockstoreInfo - - ChainCheckBlockstore - - ChainGetGenesis - - ChainGetNode - + ChainGetRandomnessFromBeacon - + ChainGetRandomnessFromTickets - + ChainGetReceipts - + ChainList - + ChainSyncHandleNewTipSet - - ClientCalcCommP - - ClientCancelDataTransfer - - ClientCancelRetrievalDeal - - ClientDataTransferUpdates - - ClientDealPieceCID - - ClientDealSize - - ClientFindData - - ClientGenCar - - ClientGetDealInfo - - ClientGetDealStatus - - ClientGetDealUpdates - - ClientGetRetrievalUpdates - - ClientHasLocal - - ClientImport - - ClientListDataTransfers - - ClientListDeals - - ClientListImports - - ClientListRetrievals - - ClientMinerQueryOffer - - ClientQueryAsk - - ClientRemoveImport - - ClientRestartDataTransfer - - ClientRetrieve - - ClientRetrieveTryRestartInsufficientFunds - - ClientRetrieveWithEvents - - ClientStartDeal - - ClientStatelessDeal - - Closing - + Concurrent - - CreateBackup - - Discover - + GasBatchEstimateMessageGas - > GasEstimateMessageGas {[func(context.Context, *chain.Message, *v1.MessageSendSpec, chain.TipSetKey) (*chain.Message, error) <> func(context.Context, *types.Message, *api.MessageSendSpec, types.TipSetKey) (*types.Message, error)] base=func in type: #2 input; nested={[*v1.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[v1.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[v1.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} - + GetActor - + GetEntry - + GetFullBlock - + GetParentStateRootActor - + HasPassword - - ID - + ListActor - + LockWallet - - LogAlerts - - LogList - - LogSetLevel - - MarketAddBalance - - MarketGetReserved - - MarketReleaseFunds - - MarketReserveFunds - - MarketWithdraw - + MessageWait - > MpoolBatchPushMessage {[func(context.Context, []*chain.Message, *v1.MessageSendSpec) ([]*chain.SignedMessage, error) <> func(context.Context, []*types.Message, *api.MessageSendSpec) ([]*types.SignedMessage, error)] base=func in type: #2 input; nested={[*v1.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[v1.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[v1.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} - + MpoolDeleteByAdress - + MpoolPublishByAddr - + MpoolPublishMessage - > MpoolPushMessage {[func(context.Context, *chain.Message, *v1.MessageSendSpec) (*chain.SignedMessage, error) <> func(context.Context, *types.Message, *api.MessageSendSpec) (*types.SignedMessage, error)] base=func in type: #2 input; nested={[*v1.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[v1.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[v1.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} - + MpoolSelects - - MsigGetAvailableBalance - - MsigGetPending - - MsigGetVestingSchedule - - NetAgentVersion - - NetAutoNatStatus - - NetBandwidthStats - - NetBandwidthStatsByPeer - - NetBandwidthStatsByProtocol - - NetBlockAdd - - NetBlockList - - NetBlockRemove - - NetConnect - - NetConnectedness - - NetDisconnect - - NetFindPeer - - NetPeerInfo - - NetPeers - - NetPubsubScores - + NetworkConnect - + NetworkFindPeer - + NetworkFindProvidersAsync - + NetworkGetBandwidthStats - + NetworkGetClosestPeers - + NetworkGetPeerAddresses - + NetworkGetPeerID - + NetworkPeers - - NodeStatus - + ProtocolParameters - + ResolveToKeyAddr - - Session - + SetConcurrent - + SetPassword - - Shutdown - - StateAllMinerFaults - - StateChangedActors - - StateCompute - - StateDecodeParams - - StateEncodeParams - - StateListMessages - + StateMinerSectorSize - + StateMinerWorkerAddress - - StateReadState - - StateReplay - - SyncCheckBad - - SyncCheckpoint - - SyncIncomingBlocks - - SyncMarkBad - - SyncUnmarkAllBad - - SyncUnmarkBad - - SyncValidateTipset - + UnLockWallet - + Verify - + VerifyEntry - > Version {[func(context.Context) (v1.Version, error) <> func(context.Context) (api.APIVersion, error)] base=func out type: #0 input; nested={[v1.Version <> api.APIVersion] base=struct field; nested={[v1.Version <> api.APIVersion] base=exported fields count: 2 != 3; nested=nil}}} - + WalletAddresses - - WalletDelete - > WalletExport {[func(address.Address, string) (*wallet.KeyInfo, error) <> func(context.Context, address.Address) (*types.KeyInfo, error)] base=func in type: #0 input; nested={[address.Address <> context.Context] base=type kinds: struct != interface; nested=nil}} - > WalletImport {[func(*wallet.KeyInfo) (address.Address, error) <> func(context.Context, *types.KeyInfo) (address.Address, error)] base=func in num: 1 != 2; nested=nil} - - WalletList - - WalletNew - + WalletNewAddress - > WalletSign {[func(context.Context, address.Address, []uint8, wallet.MsgMeta) (*crypto.Signature, error) <> func(context.Context, address.Address, []uint8) (*crypto.Signature, error)] base=func in num: 4 != 3; nested=nil} - + WalletState - - WalletValidateAddress - - WalletVerify - diff --git a/venus-shared/go.mod b/venus-shared/go.mod index d02ee087fb..ec46624d7f 100644 --- a/venus-shared/go.mod +++ b/venus-shared/go.mod @@ -17,10 +17,12 @@ require ( github.com/ipfs/go-block-format v0.0.3 github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-ipld-cbor v0.0.5 + github.com/ipfs/go-ipld-format v0.0.2 github.com/ipfs/go-log v1.0.4 github.com/libp2p/go-libp2p-core v0.8.5 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/multiformats/go-multiaddr v0.2.2 + github.com/multiformats/go-multihash v0.0.15 github.com/stretchr/testify v1.7.0 github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2 go.uber.org/zap v1.14.1 diff --git a/venus-shared/wallet/key_info.go b/venus-shared/wallet/key_info.go index fffde7b8e4..0945210227 100644 --- a/venus-shared/wallet/key_info.go +++ b/venus-shared/wallet/key_info.go @@ -3,6 +3,7 @@ package wallet import ( "encoding/json" "fmt" + "math" "github.com/filecoin-project/go-state-types/crypto" ) @@ -46,12 +47,44 @@ func (kt *KeyType) UnmarshalJSON(bb []byte) error { } } +type SigType = crypto.SigType + +const ( + SigTypeUnknown = SigType(math.MaxUint8) + + SigTypeSecp256k1 = SigType(iota) + SigTypeBLS +) + const ( + KTUnknown KeyType = "unknown" KTBLS KeyType = "bls" KTSecp256k1 KeyType = "secp256k1" KTSecp256k1Ledger KeyType = "secp256k1-ledger" ) +func KeyType2Sign(kt KeyType) SigType { + switch kt { + case KTSecp256k1: + return SigTypeSecp256k1 + case KTBLS: + return SigTypeBLS + default: + return SigTypeUnknown + } +} + +func SignType2Key(kt SigType) KeyType { + switch kt { + case SigTypeSecp256k1: + return KTSecp256k1 + case SigTypeBLS: + return KTBLS + default: + return KTUnknown + } +} + // KeyInfo is used for storing keys in KeyStore type KeyInfo struct { Type KeyType diff --git a/venus-shared/wallet/msg_meta.go b/venus-shared/wallet/msg_meta.go index 24bb12ec32..97d0a3e7cc 100644 --- a/venus-shared/wallet/msg_meta.go +++ b/venus-shared/wallet/msg_meta.go @@ -12,9 +12,22 @@ const ( MTBlock = "block" // Signing a deal proposal. signing raw cbor proposal bytes (MsgMeta.Extra is empty) - MTDealProposal = "dealproposal" - - // TODO: Deals, Vouchers, VRF + MTDealProposal = MsgType("dealproposal") + // extra is nil, 'toSign' is cbor raw bytes of 'DrawRandomParams' + // following types follow above rule + MTDrawRandomParam = MsgType("drawrandomparam") + MTSignedVoucher = MsgType("signedvoucher") + MTStorageAsk = MsgType("storageask") + MTAskResponse = MsgType("askresponse") + MTNetWorkResponse = MsgType("networkresposne") + + // reference : storagemarket/impl/remotecli.go:330 + // sign storagemarket.ClientDeal.ProposalCid, + // MsgMeta.Extra is nil, 'toSign' is market.ClientDealProposal + // storagemarket.ClientDeal.ProposalCid equals cborutil.AsIpld(market.ClientDealProposal).Cid() + MTClientDeal = MsgType("clientdeal") + + MTProviderDealState = MsgType("providerdealstate") ) type MsgMeta struct { From 41532c35e8e0ddd16bb49df8e7c884ed9e60b54e Mon Sep 17 00:00:00 2001 From: zl Date: Thu, 23 Dec 2021 15:51:16 +0800 Subject: [PATCH 078/167] venus-devtool add tools for venus-shared api generation, (#4638) and also ouput permisstion check to compatible-checks dir. --- Makefile | 5 + app/client/funcrule/permissioned.go | 2 +- venus-devtool/apigen/proxygen.go | 544 ++++++++ venus-devtool/go.mod | 12 +- venus-devtool/go.sum | 556 ++++++++- venus-shared/api/chain/v0/blockstore.go | 4 +- venus-shared/api/chain/v0/chain.go | 6 +- venus-shared/api/chain/v0/network.go | 4 +- venus-shared/api/chain/v0/paych.go | 6 +- venus-shared/api/chain/v0/proxy_gen.go | 1079 ++++++++++++++++ venus-shared/api/chain/v1/blockstore.go | 4 +- venus-shared/api/chain/v1/chain.go | 10 +- venus-shared/api/chain/v1/network.go | 4 +- venus-shared/api/chain/v1/paych.go | 6 +- venus-shared/api/chain/v1/proxy_gen.go | 1093 +++++++++++++++++ venus-shared/api/client/client.go | 30 + venus-shared/api/version.go | 65 + venus-shared/compatible-checks/api-diff.txt | 191 +++ .../compatible-checks/api-permission.json | 515 ++++++++ venus-shared/go.mod | 4 + 20 files changed, 4077 insertions(+), 63 deletions(-) create mode 100644 venus-devtool/apigen/proxygen.go create mode 100644 venus-shared/api/chain/v0/proxy_gen.go create mode 100644 venus-shared/api/chain/v1/proxy_gen.go create mode 100644 venus-shared/api/client/client.go create mode 100644 venus-shared/compatible-checks/api-permission.json diff --git a/Makefile b/Makefile index f1e43db53b..0440341d92 100644 --- a/Makefile +++ b/Makefile @@ -29,6 +29,11 @@ gen-api: gofmt -s -l -w ./app/client/full.go gofmt -s -l -w ./app/client/v0api/full.go +v2-gen-api: + cd ./venus-devtool/ && go run ./apigen/ + gofmt -s -l -w ./venus-shared/api/chain/v0/proxy_gen.go; + gofmt -s -l -w ./venus-shared/api/chain/v1/proxy_gen.go + compare-api: go run ./tools/gen/api/proxygen.go compare diff --git a/app/client/funcrule/permissioned.go b/app/client/funcrule/permissioned.go index 765fac637c..9c41d35e08 100644 --- a/app/client/funcrule/permissioned.go +++ b/app/client/funcrule/permissioned.go @@ -46,7 +46,7 @@ func PermissionProxy(in interface{}, out interface{}) { panic("missing 'perm' tag on " + field.Name) // ok } curule := defaultRule() - curule.Perm = requiredPerm + curule.Perm = auth.Permission(requiredPerm) fn := ra.Method(i) rint.FieldByName(methodName).Set(reflect.MakeFunc(field.Type, func(args []reflect.Value) (results []reflect.Value) { diff --git a/venus-devtool/apigen/proxygen.go b/venus-devtool/apigen/proxygen.go new file mode 100644 index 0000000000..b158d0977f --- /dev/null +++ b/venus-devtool/apigen/proxygen.go @@ -0,0 +1,544 @@ +package main + +import ( + "encoding/json" + "fmt" + "github.com/filecoin-project/go-jsonrpc/auth" + _ "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/venus/app/client/funcrule" + "go/ast" + "go/build" + "go/parser" + "go/token" + "golang.org/x/xerrors" + "io/fs" + "io/ioutil" + "os" + "path" + "path/filepath" + "regexp" + "strconv" + "strings" + "text/template" + "unicode" +) + +const ( + VenusSharedPath = "../venus-shared" + GenAPIFileName = "proxy_gen.go" +) + +var ( + VenusAPIPath = path.Join("../venus-shared", "api") + VenusCompatibleCheckFile = path.Join(VenusSharedPath, "compatible-checks/api-permission.json") + VenusV0APiFile = path.Join(VenusAPIPath, "chain/v0", GenAPIFileName) + VenusV1ApiFile = path.Join(VenusAPIPath, "chain/v1", GenAPIFileName) +) + +// Rule[perm:read,ignore:true] +var rulePattern = `Rule\[(?P.*)\]` + +type ruleKey = string + +const ( + rkPerm ruleKey = "perm" + rkIgnore ruleKey = "ignore" +) + +var defaultPerm = []string{"perm", "read"} +var regRule, _ = regexp.Compile(rulePattern) + +func parseRule(comment string) (*funcrule.Rule, map[string][]string) { + rule := new(funcrule.Rule) + match := regRule.FindStringSubmatch(comment) + tags := map[string][]string{} + if len(match) == 2 { + pairs := strings.Split(match[1], ",") + for _, v := range pairs { + pair := strings.Split(v, ":") + if len(pair) != 2 { + continue + } + switch pair[0] { + case rkPerm: + tags[rkPerm] = pair + rule.Perm = auth.Permission(pair[1]) + case rkIgnore: + ig, err := strconv.ParseBool(pair[1]) + if err != nil { + panic("the rule tag is invalid format") + } + rule.Ignore = ig + } + } + } else { + rule.Perm = "read" + tags[rkPerm] = defaultPerm + } + return rule, tags +} + +type methodMeta struct { + node ast.Node + ftype *ast.FuncType +} + +type Visitor struct { + Methods map[string]map[string]*methodMeta + Include map[string][]string +} + +func (v *Visitor) Visit(node ast.Node) ast.Visitor { + st, ok := node.(*ast.TypeSpec) + if !ok { + return v + } + + iface, ok := st.Type.(*ast.InterfaceType) + if !ok { + return v + } + if v.Methods[st.Name.Name] == nil { + v.Methods[st.Name.Name] = map[string]*methodMeta{} + } + for _, m := range iface.Methods.List { + switch ft := m.Type.(type) { + case *ast.Ident: + v.Include[st.Name.Name] = append(v.Include[st.Name.Name], ft.Name) + case *ast.FuncType: + v.Methods[st.Name.Name][m.Names[0].Name] = &methodMeta{ + node: m, + ftype: ft, + } + } + } + + return v +} + +func main() { + var arg string + if len(os.Args) > 1 { + arg = os.Args[1] + } + + onlyCompare := arg == "compare" + lpath := lotusAPIPath() + + infos := struct { + V0 *stableMethodInfo + V1 *stableMethodInfo + }{ + V0: v0API(lpath, onlyCompare), + V1: v1API(lpath, onlyCompare), + } + + data, err := json.MarshalIndent(infos, "", "\t") + checkError(err) + err = ioutil.WriteFile(VenusCompatibleCheckFile, data, 0666) + checkError(err) +} + +func v0API(lpath string, onlyCompare bool) *stableMethodInfo { + apiFilePaths := []string{ + path.Join(lpath, "v0api/full.go"), + path.Join(lpath, "api_common.go"), + path.Join(lpath, "api_net.go"), + } + fmt.Println("v0 lotus api file: ", apiFilePaths) + + bmp, err := benchmarkMethodPerm(apiFilePaths) + checkError(err) + // outputWithJSON(bmp, "v0 benchmarkMethodPerm: ") + + mm, err := methodMetaFromInterface(path.Join(VenusAPIPath, "chain/v0"), "v0api", "v0api") + checkError(err) + + smi := check(bmp, mm) + outputWithJSON(smi, "v0 api StableMethodInfo: ") + + if !onlyCompare { + checkError(doTemplate(VenusV0APiFile, mm, templ)) + } + + return smi +} + +func v1API(lpath string, onlyCompare bool) *stableMethodInfo { + apiFilePaths := []string{ + path.Join(lpath, "api_full.go"), + path.Join(lpath, "api_common.go"), + path.Join(lpath, "api_net.go"), + } + fmt.Println("v1 lotus api file: ", apiFilePaths) + + bmp, err := benchmarkMethodPerm(apiFilePaths) + checkError(err) + // outputWithJSON(bmp, "v1 benchmarkMethodPerm: ") + + mm, err := methodMetaFromInterface(path.Join(VenusAPIPath, "/chain/v1"), "v1", "v1") + checkError(err) + + smi := check(bmp, mm) + outputWithJSON(smi, "v1 api StableMethodInfo: ") + + if !onlyCompare { + checkError(doTemplate(VenusV1ApiFile, mm, templ)) + } + + return smi +} + +func lotusAPIPath() string { + lAPIPath := "../lotus/api" + pkg, err := build.Import("github.com/filecoin-project/lotus/api", ".", build.FindOnly) + if err == nil { + lAPIPath = pkg.Dir + } + return lAPIPath +} + +func benchmarkMethodPerm(apiFilePaths []string) (map[string]string, error) { + fset := token.NewFileSet() + files := make([]*ast.File, 0, len(apiFilePaths)) + visitor := &Visitor{make(map[string]map[string]*methodMeta), map[string][]string{}} + + for _, fpath := range apiFilePaths { + f, err := parser.ParseFile(fset, fpath, nil, parser.AllErrors|parser.ParseComments) + if err != nil { + return nil, err + } + files = append(files, f) + ast.Walk(visitor, f) + } + + perms := make(map[string]string) + for _, f := range files { + cmap := ast.NewCommentMap(fset, f, f.Comments) + for _, methods := range visitor.Methods { + for mname, node := range methods { + filteredComments := cmap.Filter(node.node).Comments() + if len(filteredComments) > 0 { + cmt := filteredComments[len(filteredComments)-1].List[0].Text + if !strings.Contains(cmt, "perm:") { + fmt.Println("lotus method not found perm: ", mname) + continue + } + pairs := strings.Split(cmt, ":") + if len(pairs) != 2 { + continue + } + perms[mname] = pairs[1] + } + } + } + } + + return perms, nil +} + +type methodInfo struct { + Name string + node ast.Node + Tags map[string][]string + NamedParams, ParamNames, Results, DefRes string +} +type strinfo struct { + Name string + Methods map[string]*methodInfo + Include []string +} +type meta struct { + Infos map[string]*strinfo + Imports map[string]string + OutPkg string +} + +func filter(f fs.FileInfo) bool { + return f.Name() != GenAPIFileName +} + +func methodMetaFromInterface(rootPath string, pkg, outpkg string) (*meta, error) { + fset := token.NewFileSet() + apiDir, err := filepath.Abs(rootPath) + if err != nil { + return nil, err + } + + visitor := &Visitor{make(map[string]map[string]*methodMeta), map[string][]string{}} + m := &meta{ + OutPkg: outpkg, + Infos: map[string]*strinfo{}, + Imports: map[string]string{}, + } + // filter := isGoFile + pkgs, err := parser.ParseDir(fset, apiDir, filter, parser.AllErrors|parser.ParseComments) + if err != nil { + return nil, err + } + ap := pkgs[pkg] + + ast.Walk(visitor, ap) + ignoreMethods := map[string][]string{} + for k, f := range ap.Files { + if strings.HasSuffix(k, "blockstore.go") { + fmt.Println(k) + } + + var replacedPkgName = make(map[string]string) + + cmap := ast.NewCommentMap(fset, f, f.Comments) + for _, im := range f.Imports { + m.Imports[im.Path.Value] = im.Path.Value + if im.Name != nil { + replacedPkgName[im.Name.Name] = "x" + m.Imports[im.Path.Value] = im.Name.Name + " " + m.Imports[im.Path.Value] + } + } + + for ifname, methods := range visitor.Methods { + if _, ok := m.Infos[ifname]; !ok { + m.Infos[ifname] = &strinfo{ + Name: ifname, + Methods: map[string]*methodInfo{}, + Include: visitor.Include[ifname], + } + } + info := m.Infos[ifname] + for mname, node := range methods { + filteredComments := cmap.Filter(node.node).Comments() + if _, ok := info.Methods[mname]; !ok { + var params, pnames []string + for _, param := range node.ftype.Params.List { + pstr, err := typeName(param.Type, outpkg) + if err != nil { + return nil, err + } + + c := len(param.Names) + if c == 0 { + c = 1 + } + + for i := 0; i < c; i++ { + pname := fmt.Sprintf("p%d", len(params)) + pnames = append(pnames, pname) + params = append(params, pname+" "+pstr) + } + } + + var results []string + for _, result := range node.ftype.Results.List { + if exp, isok := result.Type.(*ast.SelectorExpr); isok && mname == "ChainStatObj" { + x, _ := json.MarshalIndent(exp, "", " ") + fmt.Printf("%s\n", string(x)) + } + rs, err := typeName(result.Type, outpkg) + if err != nil { + return nil, err + } + results = append(results, rs) + } + + defRes := "" + if len(results) > 1 { + defRes = results[0] + switch { + case defRes[0] == '*' || defRes[0] == '<', defRes == "interface{}": + defRes = "nil" + case defRes == "bool": + defRes = "false" + case defRes == "string": + defRes = `""` + case defRes == "int", defRes == "int64", defRes == "uint64", defRes == "uint": + defRes = "0" + default: + defRes = "*new(" + defRes + ")" + } + defRes += ", " + } + + info.Methods[mname] = &methodInfo{ + Name: mname, + node: node.node, + Tags: map[string][]string{}, + NamedParams: strings.Join(params, ", "), + ParamNames: strings.Join(pnames, ", "), + Results: strings.Join(results, ", "), + DefRes: defRes, + } + } + + // try to parse tag info + if len(filteredComments) > 0 { + cmt := filteredComments[0].List[len(filteredComments[0].List)-1].Text + rule, tags := parseRule(cmt) + info.Methods[mname].Tags[rkPerm] = tags[rkPerm] + // remove ignore method + if rule.Ignore { + ignoreMethods[ifname] = append(ignoreMethods[ifname], mname) + } + } + } + } + } + for ifname, mnames := range ignoreMethods { + for _, mname := range mnames { + delete(m.Infos[ifname].Methods, mname) + } + } + + return m, nil +} + +func typeName(e ast.Expr, pkg string) (string, error) { + switch t := e.(type) { + case *ast.SelectorExpr: + return t.X.(*ast.Ident).Name + "." + t.Sel.Name, nil + case *ast.Ident: + pstr := t.Name + if !unicode.IsLower(rune(pstr[0])) && pkg != "client" { + pstr = "client." + pstr // todo src pkg name + } + return pstr, nil + case *ast.ArrayType: + subt, err := typeName(t.Elt, pkg) + if err != nil { + return "", err + } + return "[]" + subt, nil + case *ast.StarExpr: + subt, err := typeName(t.X, pkg) + if err != nil { + return "", err + } + return "*" + subt, nil + case *ast.MapType: + k, err := typeName(t.Key, pkg) + if err != nil { + return "", err + } + v, err := typeName(t.Value, pkg) + if err != nil { + return "", err + } + return "map[" + k + "]" + v, nil + case *ast.StructType: + if len(t.Fields.List) != 0 { + return "", xerrors.Errorf("can't struct") + } + return "struct{}", nil + case *ast.InterfaceType: + if len(t.Methods.List) != 0 { + return "", xerrors.Errorf("can't interface") + } + return "interface{}", nil + case *ast.ChanType: + subt, err := typeName(t.Value, pkg) + if err != nil { + return "", err + } + if t.Dir == ast.SEND { + subt = "->chan " + subt + } else { + subt = "<-chan " + subt + } + return subt, nil + default: + return "", xerrors.Errorf("unknown type") + } +} + +type stableMethodInfo struct { + // Lotus and Venus both have functions and the same permissions + Common map[string]string + // Venus has functions that Lotus does not + Extend map[string]string + // Lotus has functions that Venus does not + Loss map[string]string + // Both Lotus and venus has functions but the permissions are different + Gap map[string]string +} + +func newStableMethodInfo() *stableMethodInfo { + return &stableMethodInfo{ + Common: make(map[string]string), + Extend: make(map[string]string), + Loss: make(map[string]string), + Gap: make(map[string]string), + } +} + +func check(bmp map[string]string, m *meta) *stableMethodInfo { + smi := newStableMethodInfo() + vMethodPerms := make(map[string]string) + for _, info := range m.Infos { + for _, one := range info.Methods { + mperm := one.Tags[rkPerm][1] + vMethodPerms[one.Name] = mperm + if perm, ok := bmp[one.Name]; ok { + if mperm != perm { + smi.Gap[one.Name] = fmt.Sprintf("venus:%s lotus:%s", mperm, perm) + continue + } + smi.Common[one.Name] = mperm + } else { + smi.Extend[one.Name] = mperm + } + } + } + for m, p := range bmp { + if _, ok := vMethodPerms[m]; !ok { + smi.Loss[m] = p + } + } + + return smi +} + +func doTemplate(outfile string, info interface{}, templ string) error { + w, err := os.OpenFile(outfile, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) + if err != nil { + return err + } + t := template.Must(template.New(""). + Funcs(template.FuncMap{}).Parse(templ)) + + return t.Execute(w, info) +} + +var templ = `// Code generated by github.com/filecoin-project/tools/gen/api. DO NOT EDIT. + +package {{.OutPkg}} + +import ( +{{range .Imports}} {{.}} +{{end}}) +{{range .Infos}} {{$name := .Name}} +type {{.Name}}Struct struct { +{{range .Include}} {{.}}Struct +{{end}}{{ if gt (len .Methods) 0 }} Internal struct { {{range .Methods}} + {{.Name}} func({{.NamedParams}}) ({{.Results}}) ` + "`" + `{{range .Tags}}{{index . 0}}:"{{index . 1}}"{{end}}` + "`" + ` +{{end}} } +{{end}}} + +{{range .Methods}}func(s *{{$name}}Struct) {{.Name}} ({{.NamedParams}}) ({{.Results}}){ + return s.Internal.{{.Name}}({{.ParamNames}}) +} + +{{end}} {{end}} +` + +func checkError(err error) { + if err != nil { + panic(err) + } +} + +func outputWithJSON(obj interface{}, comment string) { + b, err := json.MarshalIndent(obj, "", "\t") + if err != nil { + fmt.Println("json marshal error: ", err) + } + fmt.Println(comment, "\n", string(b)) +} diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index 06476e66d0..e1365ab144 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -3,11 +3,19 @@ module github.com/filecoin-project/venus/venus-devtool go 1.16 require ( + github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/lotus v1.12.0 + github.com/filecoin-project/venus v0.0.0-00010101000000-000000000000 github.com/filecoin-project/venus/venus-shared v0.0.1 github.com/ipfs/go-ipfs-http-client v0.1.0 // indirect - github.com/urfave/cli/v2 v2.2.0 + github.com/urfave/cli/v2 v2.3.0 github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 ) -replace github.com/filecoin-project/venus/venus-shared => ../venus-shared/ +replace ( + github.com/filecoin-project/venus => ../ + github.com/filecoin-project/venus/venus-shared => ../venus-shared/ + github.com/ipfs/go-ipfs-cmds => github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab + github.com/multiformats/go-multiaddr => github.com/multiformats/go-multiaddr v0.3.0 +) \ No newline at end of file diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index a17ce57f50..bb1a03d095 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -1,3 +1,5 @@ +4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= +bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -8,16 +10,40 @@ cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxK cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= +cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= contrib.go.opencensus.io/exporter/jaeger v0.1.0/go.mod h1:VYianECmuFPwU37O699Vc1GOcy+y8kOsfaxHRImmjbA= +contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= +contrib.go.opencensus.io/exporter/prometheus v0.3.0/go.mod h1:rpCPVQKhiyH8oomWgm34ZmgIdZa8OVYO5WAIygPbBBE= +contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= +contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -28,10 +54,12 @@ git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGy github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/jt0CW30vsg= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= github.com/GeertJohan/go.rice v1.0.0 h1:KkI6O9uMaQU3VEKaj01ulavtF7o1fWT7+pk/4voiMLQ= @@ -41,9 +69,15 @@ github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa/go.mod h1:WUmMvh9wMtqj1Xhf1hf3kp9RvL+y6odtdYxpyZjb90U= github.com/Masterminds/glide v0.13.2/go.mod h1:STyF5vcenH/rUqTEv+/hBXlSTo7KYwg2oc2f4tzPWic= +github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= @@ -65,8 +99,12 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= +github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -75,9 +113,16 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/ashanbrown/forbidigo v1.1.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= +github.com/ashanbrown/makezero v0.0.0-20210308000810-4155955488a0/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= +github.com/awnumar/memcall v0.0.0-20191004114545-73db50fd9f80/go.mod h1:S911igBPR9CThzd/hYQQmTc9SWNu3ZHIlCGaWsWsoJo= +github.com/awnumar/memguard v0.22.2/go.mod h1:33OwJBHC+T4eEfFcDrQb78TMlBMBvcOPCXWU9xE34gM= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.32.11/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/benbjohnson/clock v1.0.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= @@ -91,6 +136,10 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bep/debounce v1.2.0 h1:wXds8Kq8qRfwAOpAxHrJDbCXgC5aHSzgQb/0gKsHQqo= github.com/bep/debounce v1.2.0/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= +github.com/bluele/gcache v0.0.0-20190518031135-bc40bd653833/go.mod h1:8c4/i2VlovMO2gBnHGQPN5EJw+H0lx1u/5p+cgsXtCk= +github.com/bombsimon/wsl/v3 v3.2.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= @@ -121,6 +170,7 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charithe/durationcheck v0.0.6/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -139,7 +189,9 @@ github.com/cockroachdb/redact v0.0.0-20200622112456-cd282804bbd3/go.mod h1:BVNbl github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -147,10 +199,13 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU= +github.com/cosiner/argv v0.1.0/go.mod h1:EusR6TucWKX+zFgtdUsKT2Cvg45K5rtpCcWz4hK06d8= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -159,10 +214,14 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsr github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg= github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY= github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= +github.com/daixiang0/gci v0.2.8/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -172,6 +231,8 @@ github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f/go.mod h1:rQY github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/deepmap/oapi-codegen v1.3.13/go.mod h1:WAmG5dWY8/PYHt4vKxlt90NsbHMAOCiteYKZMiIRfOo= +github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e h1:lj77EKYUpYXTd8CD/+QMIf8b6OIOTsfEBSXiAzuEHTU= github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e/go.mod h1:3ZQK6DMPSz/QZ73jlWxBtUhNA8xZx7LzUFSq/OfP8vk= github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= @@ -181,12 +242,18 @@ github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlN github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= +github.com/dgraph-io/badger/v3 v3.2011.1/go.mod h1:0rLLrQpKVQAL0or/lBLMQznhr6dWWX7h5AKnmnqx268= github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.0.4-0.20210122082011-bb5d392ed82d/go.mod h1:tv2ec8nA7vRpSYX7/MbP52ihrUMXIHit54CQMq8npXQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v0.7.3-0.20190315170154-87d593639c77/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= @@ -210,7 +277,9 @@ github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4s github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/esimonov/ifshort v1.0.2/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= github.com/etclabscore/go-jsonschema-walk v0.0.6/go.mod h1:VdfDY72AFAiUhy0ZXEaWSpveGjMT5JcDIm903NGqFwQ= github.com/etclabscore/go-openrpc-reflect v0.0.36/go.mod h1:0404Ky3igAasAOpyj1eESjstTyneBAIk5PgJFbK4s5E= github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A= @@ -218,6 +287,8 @@ github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:Jp github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= github.com/filecoin-project/dagstore v0.4.3 h1:yeFl6+2BRY1gOVp/hrZuFa24s7LY0Qqkqx/Gh8lidZs= @@ -227,12 +298,12 @@ github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f h github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f/go.mod h1:+If3s2VxyjZn+KGGZIoRXBDSFQ9xL404JBJGf4WhEj0= github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-address v0.0.5 h1:SSaFT/5aLfPXycUlFyemoHYhRgdyXClXCyDdNJKPlDM= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= -github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= -github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= github.com/filecoin-project/go-amt-ipld/v2 v2.0.1-0.20200424220931-6263827e49f2/go.mod h1:boRtQhzmxNocrMxOXo1NYn4oUc1NGvR8tEa79wApNXg= -github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= +github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349 h1:pIuR0dnMD0i+as8wNnjjHyQrnhP5O5bmba/lmgQeRgU= +github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349/go.mod h1:vgmwKBkx+ca5OIeEvstiQgzAZnb7R6QaqE1oEDSqa6g= github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= @@ -241,10 +312,12 @@ github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQj github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= -github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 h1:av5fw6wmm58FYMgJeoB/lK9XXrgdugYiTqkdxjTy9k8= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7 h1:U9Z+76pHCKBmtdxFV7JFZJj7OVm12I6dEKwtMVbq5p0= +github.com/filecoin-project/go-cbor-util v0.0.0-20201016124514-d0bbec7bfcc4 h1:YmE80qPn5K0txSqxnRNiCRAWyXI1LTO//I4c4H0QwbM= +github.com/filecoin-project/go-cbor-util v0.0.0-20201016124514-d0bbec7bfcc4/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= +github.com/filecoin-project/go-commp-utils v0.1.3 h1:rTxbkNXZU7FLgdkBk8RsQIEOuPONHykEoX3xGk41Fkw= +github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9ANQrY3fDFoXdqyX04J+dWpK30= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= @@ -269,15 +342,17 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec h1:rGI5I7fdU4viManxmDdbk5deZO7afe6L1Wc04dAmlOM= +github.com/filecoin-project/go-jsonrpc v0.1.3/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543/go.mod h1:mjrHv1cDGJWDlGmC0eDc1E5VJr8DmL9XMUcaFwiuKg8= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1 h1:0BogtftbcgyBx4lP2JWM00ZK7/pXmgnrDqKp9aLTgVs= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-paramfetch v0.0.2-0.20210614165157-25a6c7769498/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= @@ -285,9 +360,8 @@ github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379 h1:UmKkt13NrtulubqfNXhG7SQ7Pjza8BeKdNBxngqAo64= github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= -github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= @@ -321,6 +395,7 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVi github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= +github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578/go.mod h1:/cbLZYvQhinVFUG4TP2Uy1o7LtF+guT21qZIMTmKk0g= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= @@ -333,15 +408,24 @@ github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1 h1:EzDjxMg43q1tA2c0MV3tNbaontnHLplHyFF6M5KiVP0= +github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= +github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1/go.mod h1:0eHX/BVySxPc6SE2mZRoppGq7qcEagxdmQnA3dzork8= +github.com/gbrlsnchs/jwt/v3 v3.0.0 h1:gtPjdT3gAbBLjVckJsgNf+a46sqrCBfRebg2r/NysIo= +github.com/gbrlsnchs/jwt/v3 v3.0.0/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= +github.com/getkin/kin-openapi v0.13.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s+pcEVXFuAjw= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-critic/go-critic v0.5.5/go.mod h1:eMs1Oc/oIP+CYNVN09M+XZYffIPuRHawxzlggAPN9Kk= +github.com/go-delve/delve v1.5.0/go.mod h1:c6b3a1Gry6x8a4LGCe/CWzrocrfaHvkUxCj3k4bvSUQ= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -349,6 +433,7 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -366,13 +451,37 @@ github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.8/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72POcgHMAgSY= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v7 v7.0.0-beta/go.mod h1:dohSoK1cSNPaisjbZhSk7RYyPhVx2k+4sAbJdPK5KPs= +github.com/go-redis/redis_rate/v7 v7.0.1/go.mod h1:IWxoSa694TQvppZ53Y5yZtqSfHKflOx+xtSw1TsSoT4= +github.com/go-resty/resty/v2 v2.4.0/go.mod h1:B88+xCTEwvfD94NOuE6GS1wMlnoKNY8eEiNizfNwOwA= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= @@ -387,25 +496,31 @@ github.com/gogo/status v1.0.3/go.mod h1:SavQ51ycCLnc7dGyJxp8YAmudx8xqiVrRf+6IXRs github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -415,23 +530,43 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.39.0/go.mod h1:mzMK3FGyk8LKTOxpRDcDqxwHVudnYemESTt5rpUxqCM= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/revgrep v0.0.0-20210208091834-cd28932614b5/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= +github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= +github.com/google/flatbuffers v1.12.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v2.0.0+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-dap v0.2.0/go.mod h1:5q8aYQFnHOAZEMP+6vmq25HKYAEwE+LF5yh7JKrrhSQ= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -440,10 +575,18 @@ github.com/google/gopacket v1.1.18/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8v github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= +github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -453,27 +596,45 @@ github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gookit/color v1.3.8/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= +github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= +github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= +github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= +github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= +github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= +github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= +github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/gxed/go-shellwords v1.0.3/go.mod h1:N7paucT91ByIjmVJHhvoarjoQnmsi3Jd3vH7VqgtMxQ= @@ -485,7 +646,9 @@ github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 h1:F9k+7 github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1/go.mod h1:jvfsLIxk0fY/2BKSQ1xf2406AKA5dwMmKKv0ADcOfN8= github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4nmd7b5qy5t0GWDTwSn4OyRgfAXSmo6VnryBY= github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e/go.mod h1:I8h3MITA53gN9OnWGCgaMa0JWVRdXthWw4M3CPM54OY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -513,7 +676,10 @@ github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0m github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+gRZDtmTJkAs= +github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= +github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= @@ -523,8 +689,17 @@ github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0 github.com/iancoleman/orderedmap v0.1.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo= +github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb-client-go/v2 v2.2.2/go.mod h1:fa/d1lAdUHxuc1jedx30ZfNG573oQTQmUni3N6pcW+0= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab h1:+Jov61TTljdzTKBecQizmUWJ6IIoVgzjukKppVr5TgI= +github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= +github.com/ipfs-force-community/metrics v1.0.0/go.mod h1:mn40SioMuKtjmRumHFy/fJ26Pn028XuDjUJE9dorjyw= +github.com/ipfs-force-community/metrics v1.0.1-0.20211022060227-11142a08b729/go.mod h1:mn40SioMuKtjmRumHFy/fJ26Pn028XuDjUJE9dorjyw= +github.com/ipfs-force-community/venus-common-utils v0.0.0-20210714054928-2042a9040759/go.mod h1:AWIt7L1UiUeIzqQdjQ/quZcVcCdnr6GXabGLBgEIMzU= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= @@ -533,6 +708,7 @@ github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3 github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= +github.com/ipfs/go-bitswap v0.3.2/go.mod h1:AyWWfN3moBzQX0banEtfKOfbXb3ZeoOeXnZGNPV9S6w= github.com/ipfs/go-bitswap v0.3.4 h1:AhJhRrG8xkxh6x87b4wWs+4U4y3DVB3doI8yFNqgQME= github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= @@ -544,6 +720,7 @@ github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbR github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= +github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.5 h1:euqZu96CCbToPyYVwVshu8ENURi8BhFd7FUFfTLi+fQ= github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -613,9 +790,7 @@ github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtL github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= -github.com/ipfs/go-ipfs-cmds v0.1.0/go.mod h1:TiK4e7/V31tuEb8YWDF8lN3qrnDH+BS7ZqWIeYJlAs8= -github.com/ipfs/go-ipfs-cmds v0.3.0 h1:mi9oYrSCox5aBhutqAYqw6/9crlyGbw4E/aJtwS4zI4= -github.com/ipfs/go-ipfs-cmds v0.3.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= +github.com/ipfs/go-ipfs-cmdkit v0.0.1/go.mod h1:9FtbMdUabcSqv/G4/8WCxSLxkZxn/aZEFrxxqnVcRbg= github.com/ipfs/go-ipfs-config v0.0.11/go.mod h1:wveA8UT5ywN26oKStByzmz1CO6cXwLKKM6Jn/Hfw08I= github.com/ipfs/go-ipfs-config v0.5.3 h1:3GpI/xR9FoJNTjU6YvCMRbYyEi0dBVY5UtlUTcNRlSA= github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM= @@ -762,11 +937,21 @@ github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0 github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jgautheron/goconst v1.4.0/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= +github.com/jingyugao/rowserrcheck v0.0.0-20210315055705-d907ca737bb1/go.mod h1:TOQpc2SLx6huPfoFGK3UOnEG+u02D3C1GeosjupAKCA= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -779,13 +964,17 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/julz/importas v0.0.0-20210228071311-d0bf5cb4e1db/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3/go.mod h1:BYpt4ufZiIGv2nXn4gMxnfKV306n3mWXgNu/d2TqdTU= github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= @@ -795,8 +984,11 @@ github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391/go.mod h1:XXfR6YFC github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/errcheck v1.6.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7 h1:0hzRabrMN4tSTvMfnL3SCv1ZGeAP23ynzodBgaHeMeg= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -804,6 +996,7 @@ github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.0.8 h1:bhR2mgIlno/Sfk4oUbH4sPlc83z1yGrN9bvqiq3C33I= github.com/klauspost/cpuid/v2 v2.0.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d h1:68u9r4wEvL3gYg2jvAOgROwZ3H+Y3hIDk4tbbmIjcYQ= @@ -815,8 +1008,22 @@ github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kulti/thelper v0.4.0/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= +github.com/kunwardeep/paralleltest v1.0.2/go.mod h1:ZPqNm1fVHPllh5LPVujzbVz1JN2GhLxSfY+oqUsvG30= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= +github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/ldez/gomoddirectives v0.2.1/go.mod h1:sGicqkRgBOg//JfpXwkB9Hj0X5RyJ7mlACM5B9f6Me4= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= @@ -921,9 +1128,8 @@ github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.6 h1:3S8g006qG6Tjpj1JdRK2S+TWc2DJQKX/RG9fdLeiLSU= github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= -github.com/libp2p/go-libp2p-core v0.11.0 h1:75jAgdA+IChNa+/mZXogfmrGkgwxkVvxmIC7pV+F6sI= -github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -994,6 +1200,7 @@ github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1 github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= +github.com/libp2p/go-libp2p-pubsub v0.4.2-0.20210212194758-6c1addf493eb/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ= github.com/libp2p/go-libp2p-pubsub v0.5.4 h1:rHl9/Xok4zX3zgi0pg0XnUj9Xj2OeXO8oTu85q2+YA8= github.com/libp2p/go-libp2p-pubsub v0.5.4/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= @@ -1158,6 +1365,7 @@ github.com/libp2p/go-yamux/v2 v2.2.0 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWo github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= @@ -1167,13 +1375,18 @@ github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/magefile/mage v1.11.0 h1:C/55Ywp9BpgVVclD3lRnSYCwXTYxmSppIgLeDYlNuls= +github.com/magefile/mage v1.11.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= @@ -1189,6 +1402,9 @@ github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1 h1:/rpmWuGvceLwwWuaKPdjpR4JJEU github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= +github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= +github.com/mattn/go-colorable v0.0.0-20170327083344-ded68f7a9561/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -1198,22 +1414,32 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc= github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= github.com/mdlayher/netlink v0.0.0-20190828143259-340058475d09/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M= github.com/mdlayher/netlink v1.0.0/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M= github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcKp9uZHgmY= github.com/mdlayher/wifi v0.0.0-20190303161829-b1436901ddee/go.mod h1:Evt/EIne46u9PtQbeTx2NTcqURpr5K4SvKtGmBuDPN8= +github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/mgechev/revive v1.0.5/go.mod h1:tSw34BaGZ0iF+oVKDOjq1/LuxGifgW7shaJ6+dBYFXg= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= @@ -1221,8 +1447,11 @@ github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nr github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= @@ -1238,18 +1467,29 @@ github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mmcloughlin/avo v0.0.0-20201105074841-5d2f697d268f/go.mod h1:6aKT4zZIrpGqB3RpFU14ByCSSyKY6LfJz4J/JJChHfI= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= +github.com/mozilla/tls-observatory v0.0.0-20210209181001-cf43108d6880/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= @@ -1260,18 +1500,8 @@ github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= -github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z7tZ04iMk5wP4QMGGE= -github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= +github.com/multiformats/go-multiaddr v0.3.0 h1:z1Old9IYcUyMEtSbvwCOJ1jcrmJdU0LYH8aFBvZKzcQ= github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI= -github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= -github.com/multiformats/go-multiaddr v0.3.3 h1:vo2OTSAqnENB2rLk79pLtr+uhj+VAzSe3uef5q0lRSs= -github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= @@ -1317,13 +1547,15 @@ github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.2 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= -github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= +github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= +github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= @@ -1331,10 +1563,15 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= +github.com/nishanths/exhaustive v0.1.0/go.mod h1:S1j9110vxV1ECdCudXRkeMnFQ/DQk9ajLT0Uf2MYZQQ= +github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= +github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -1342,14 +1579,20 @@ github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= @@ -1360,9 +1603,12 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333/go.mod h1:Ag6rSXkHIckQmjFBCweJEEt1mrTPBv8b9W4aU/NQWfI= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= @@ -1381,11 +1627,16 @@ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/peterh/liner v0.0.0-20170317030525-88609521dc4b/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -1393,6 +1644,7 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= @@ -1401,11 +1653,13 @@ github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXx github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e h1:ZOcivgkkFRnjfoTcGsDq3UQYiBmekwLA+qg0OjyB/ls= github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= @@ -1413,8 +1667,9 @@ github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= -github.com/prometheus/client_golang v1.10.0 h1:/o0BDeWzLWXNZ+4q5gXltUvaMpJqckTa+jTNoB+z4cg= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= +github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1423,22 +1678,27 @@ github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6T github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.18.0 h1:WCVKW7aL6LEe1uryfI9dnEc2ZqNB1Fn0ok930v0iL1Y= github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.28.0 h1:vGVfV9KrDTvWt5boZO0I19g2E3CsWfpPPKZM9dt3mEw= +github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= @@ -1448,6 +1708,20 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/statsd_exporter v0.20.0/go.mod h1:YL3FWCG8JBBtaUSxAg4Gz2ZYu22bS84XM89ZQXXTWmQ= +github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= +github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= +github.com/quasilyte/go-ruleguard v0.3.1/go.mod h1:s41wdpioTcgelE3dlTUgK57UaUxjihg/DBGUccoN5IU= +github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.1/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20210203162857-b223e0831f88/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20210221215616-dfcc94e3dffd/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= github.com/raulk/go-watchdog v1.0.1/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= @@ -1458,7 +1732,7 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= @@ -1468,14 +1742,21 @@ github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= +github.com/ryancurrah/gomodguard v1.2.0/go.mod h1:rNqbC4TOIdUDcVMSIpNNAzTbzXAZa6W5lnUepvuMMgQ= +github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sanposhiho/wastedassign v0.2.0/go.mod h1:LGpq5Hsv74QaqM47WtIsRSF/ik9kqk07kchgv66tLVE= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/securego/gosec/v2 v2.7.0/go.mod h1:xNbGArrGUspJLuz3LS5XCY1EBW/0vABAl/LWfSklmiM= github.com/sercand/kuberesolver v2.1.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= github.com/sercand/kuberesolver v2.4.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAriGFsTZppLXDX93OM= github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.21.2/go.mod h1:ghfMypLDrFSWN2c9cDYFLHyynQ+QUht0cv/18ZqVczw= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= @@ -1502,6 +1783,7 @@ github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYED github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= github.com/siebenmann/go-kstat v0.0.0-20160321171754-d34789b79745/go.mod h1:G81aIFAMS9ECrwBYR9YxhlPjWgrItd+Kje78O6+uqm8= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -1517,9 +1799,11 @@ github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIK github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a/go.mod h1:LeFCbQYJ3KJlPs/FvPz2dy1tkpxyeNESVyCNNzRXFR0= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= +github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= @@ -1528,20 +1812,33 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.0-20170417170307-b6cb39589372/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v0.0.0-20170417173400-9e4c21054fa1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= +github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -1551,33 +1848,59 @@ github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tetafro/godot v1.4.4/go.mod h1:FVDd4JuKliW3UgjswZfJfHq4vAx0bD/Jd5brJjGeaz4= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/tj/go-spin v1.1.0 h1:lhdWZsvImxvZ3q1C5OIB7d72DuOwP4O2NdBg9PyzNds= github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= +github.com/tklauser/go-sysconf v0.3.4/go.mod h1:Cl2c8ZRWfHD5IrfHo9VN+FX9kCFjIOyVklgXycLB6ek= +github.com/tklauser/numcpus v0.2.1/go.mod h1:9aU+wOc6WjUIZEwWMP62PL/41d65P+iks1gBkr4QyP8= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tomarrell/wrapcheck v1.0.0/go.mod h1:Bd3i1FaEKe3XmcPoHhNQ+HM0S8P6eIXoQIoGj/ndJkU= +github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= +github.com/tommy-muehle/go-mnd/v2 v2.3.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/twitchyliquid64/golang-asm v0.15.0/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.23.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go v1.2.4/go.mod h1:EuaSCk8iZMdIspsu6HXH7X2UGKw1ezO4wCfGszGmmo4= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.4/go.mod h1:bWBu1+kIRWcF8uMklKaJrR6fTWQOwAlrIzX22pHwryA= +github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= +github.com/valyala/fasthttp v1.16.0/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4= +github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/quicktemplate v1.6.3/go.mod h1:fwPzK2fHuYEODzJ9pkw0ipCPNHZ2tD5KW4lOuSdPKzY= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= +github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= github.com/warpfork/go-testmark v0.3.0 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= @@ -1605,7 +1928,6 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 h1:7WtW9D9VGpmRLuQmrPy2JobUNdka95z3MKEVpELtOjo= github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= @@ -1620,6 +1942,7 @@ github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDb github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= +github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1/go.mod h1:tKH72zYNt/exx6/5IQO6L9LoQ0rEjd5SbbWaDTs9Zso= github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4/go.mod h1:K+EVq8d5QcQ2At5VECsA+SNZvWefyBXh8TnIsxo1OvQ= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= @@ -1640,6 +1963,10 @@ github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/ github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 h1:oWgZJmC1DorFZDpfMfWg7xk29yEOZiXmo/wZl+utTI8= github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1652,9 +1979,12 @@ go.dedis.ch/kyber/v3 v3.0.9/go.mod h1:rhNjUUg6ahf8HEg5HUvVBYoWY4boAafX8tYxX+PS+q go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= +go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1664,6 +1994,7 @@ go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= @@ -1671,6 +2002,7 @@ go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9deb go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.starlark.net v0.0.0-20190702223751-32f345186213/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1698,8 +2030,11 @@ go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= +golang.org/x/arch v0.0.0-20190927153633-4e8777c89be4/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= +golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1719,12 +2054,15 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1732,6 +2070,7 @@ golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= @@ -1746,7 +2085,10 @@ golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm0 golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= @@ -1776,6 +2118,7 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -1806,6 +2149,7 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1813,26 +2157,38 @@ golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200519113804-d87ec0cfa476/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201022231255-08b38378de70/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1840,11 +2196,13 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1888,6 +2246,7 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190902133755-9109b7679e13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1899,11 +2258,13 @@ golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191025090151-53bf42e6b339/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1911,13 +2272,20 @@ golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1926,6 +2294,8 @@ golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1936,9 +2306,11 @@ golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1947,23 +2319,31 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -1972,29 +2352,78 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191127201027-ecd32218bd7f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200216192241-b320d3a0f5a2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200711155855-7342f9734a7d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201011145850-ed2f50202694/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201105001634-bc3cf281b174/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= @@ -2015,21 +2444,34 @@ google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEt google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -2040,14 +2482,34 @@ google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dT google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= @@ -2060,12 +2522,17 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= @@ -2087,6 +2554,7 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= @@ -2095,6 +2563,7 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= @@ -2107,6 +2576,7 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= @@ -2114,6 +2584,9 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.1.1/go.mod h1:KdrTanmfLPPyAOeYGyG+UpDys7/7eeWT1zCq+oekYnU= +gorm.io/gorm v1.21.9/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gorm.io/gorm v1.21.12/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2122,6 +2595,8 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= @@ -2135,7 +2610,12 @@ modernc.org/strutil v1.1.0 h1:+1/yCzZxY2pZwwrsbH+4T7BQMoLQ9QiBshRC9eicYsc= modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/xc v1.0.0 h1:7ccXrupWZIS3twbUGrtKmHS2DXY6xegFua+6O3xgAFU= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7/go.mod h1:hBpJkZE8H/sb+VRFvw2+rBpHNsTBcvSpk61hr8mzXZE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/venus-shared/api/chain/v0/blockstore.go b/venus-shared/api/chain/v0/blockstore.go index 62aef247d5..3cfcd97043 100644 --- a/venus-shared/api/chain/v0/blockstore.go +++ b/venus-shared/api/chain/v0/blockstore.go @@ -3,7 +3,7 @@ package v0api import ( "context" - "github.com/filecoin-project/venus/venus-shared/api/chain" + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/ipfs/go-cid" ) @@ -16,5 +16,5 @@ type IBlockStore interface { // Rule[perm:read] ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) // Rule[perm:read] - ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (chain.ObjStat, error) + ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (chain2.ObjStat, error) } diff --git a/venus-shared/api/chain/v0/chain.go b/venus-shared/api/chain/v0/chain.go index 4cbb1ddba1..3a8f14f684 100644 --- a/venus-shared/api/chain/v0/chain.go +++ b/venus-shared/api/chain/v0/chain.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - acrypto "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" "github.com/ipfs/go-cid" @@ -57,9 +57,9 @@ type IChainInfo interface { // Rule[perm:read] ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk chain.TipSetKey) (*chain.TipSet, error) // Rule[perm:read] - ChainGetRandomnessFromBeacon(ctx context.Context, key chain.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) + ChainGetRandomnessFromBeacon(ctx context.Context, key chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) // Rule[perm:read] - ChainGetRandomnessFromTickets(ctx context.Context, tsk chain.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) + ChainGetRandomnessFromTickets(ctx context.Context, tsk chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) // Rule[perm:read] ChainGetBlock(ctx context.Context, id cid.Cid) (*chain.BlockHeader, error) // Rule[perm:read] diff --git a/venus-shared/api/chain/v0/network.go b/venus-shared/api/chain/v0/network.go index fa7df7c102..a5907f4747 100644 --- a/venus-shared/api/chain/v0/network.go +++ b/venus-shared/api/chain/v0/network.go @@ -8,7 +8,7 @@ import ( "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" - "github.com/filecoin-project/venus/venus-shared/api/chain" + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/filecoin-project/venus/venus-shared/libp2p/net" ) @@ -30,7 +30,7 @@ type INetwork interface { // Rule[perm:read] NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) // Rule[perm:read] - Version(context.Context) (chain.Version, error) + Version(context.Context) (chain2.Version, error) // Rule[perm:read] NetAddrsListen(context.Context) (peer.AddrInfo, error) } diff --git a/venus-shared/api/chain/v0/paych.go b/venus-shared/api/chain/v0/paych.go index e07a5e0c48..3c6b3ce668 100644 --- a/venus-shared/api/chain/v0/paych.go +++ b/venus-shared/api/chain/v0/paych.go @@ -7,7 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/venus-shared/api/chain" + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/filecoin-project/venus/venus-shared/paych" ) @@ -21,12 +21,12 @@ type IPaychan interface { // PaychAvailableFunds get the status of an outbound payment channel // @pch: payment channel address // Rule[perm:sign] - PaychAvailableFunds(ctx context.Context, ch address.Address) (*chain.ChannelAvailableFunds, error) + PaychAvailableFunds(ctx context.Context, ch address.Address) (*chain2.ChannelAvailableFunds, error) // PaychAvailableFundsByFromTo get the status of an outbound payment channel // @from: the payment channel sender // @to: he payment channel recipient // Rule[perm:sign] - PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*chain.ChannelAvailableFunds, error) + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*chain2.ChannelAvailableFunds, error) // PaychGetWaitReady waits until the create channel / add funds message with the sentinel // @sentinel: given message CID arrives. // @ch: the returned channel address can safely be used against the Manager methods. diff --git a/venus-shared/api/chain/v0/proxy_gen.go b/venus-shared/api/chain/v0/proxy_gen.go new file mode 100644 index 0000000000..ad95e1ccf7 --- /dev/null +++ b/venus-shared/api/chain/v0/proxy_gen.go @@ -0,0 +1,1079 @@ +// Code generated by github.com/filecoin-project/tools/gen/api. DO NOT EDIT. + +package v0api + +import ( + "context" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-jsonrpc/auth" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/dline" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/libp2p/net" + "github.com/filecoin-project/venus/venus-shared/messagepool" + "github.com/filecoin-project/venus/venus-shared/paych" + "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/metrics" + "github.com/libp2p/go-libp2p-core/peer" + ma "github.com/multiformats/go-multiaddr" + "time" +) + +type FullNodeStruct struct { + IBlockStoreStruct + IChainStruct + IDiscoveryStruct + IMarketStruct + IMiningStruct + IMessagePoolStruct + IMultiSigStruct + INetworkStruct + IPaychanStruct + ISyncerStruct + IWalletStruct + IJwtAuthAPIStruct +} + +type IAccountStruct struct { + Internal struct { + StateAccountKey func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) `perm:"read"` + } +} + +func (s *IAccountStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) { + return s.Internal.StateAccountKey(p0, p1, p2) +} + +type IActorStruct struct { + Internal struct { + ListActor func(p0 context.Context) (map[address.Address]*chain.Actor, error) `perm:"read"` + + StateGetActor func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*chain.Actor, error) `perm:"read"` + } +} + +func (s *IActorStruct) ListActor(p0 context.Context) (map[address.Address]*chain.Actor, error) { + return s.Internal.ListActor(p0) +} + +func (s *IActorStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*chain.Actor, error) { + return s.Internal.StateGetActor(p0, p1, p2) +} + +type IBeaconStruct struct { + Internal struct { + BeaconGetEntry func(p0 context.Context, p1 abi.ChainEpoch) (*chain.BeaconEntry, error) `perm:"read"` + } +} + +func (s *IBeaconStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (*chain.BeaconEntry, error) { + return s.Internal.BeaconGetEntry(p0, p1) +} + +type IBlockStoreStruct struct { + Internal struct { + ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` + + ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"` + + ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` + + ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (chain2.ObjStat, error) `perm:"read"` + } +} + +func (s *IBlockStoreStruct) ChainDeleteObj(p0 context.Context, p1 cid.Cid) error { + return s.Internal.ChainDeleteObj(p0, p1) +} + +func (s *IBlockStoreStruct) ChainHasObj(p0 context.Context, p1 cid.Cid) (bool, error) { + return s.Internal.ChainHasObj(p0, p1) +} + +func (s *IBlockStoreStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { + return s.Internal.ChainReadObj(p0, p1) +} + +func (s *IBlockStoreStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (chain2.ObjStat, error) { + return s.Internal.ChainStatObj(p0, p1, p2) +} + +type IChainStruct struct { + IAccountStruct + IActorStruct + IBeaconStruct + IMinerStateStruct + IChainInfoStruct +} + +type IChainInfoStruct struct { + Internal struct { + BlockTime func(p0 context.Context) time.Duration `perm:"read"` + + ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 chain.TipSetKey) (<-chan []byte, error) `perm:"read"` + + ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*chain.BlockHeader, error) `perm:"read"` + + ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*chain2.BlockMessages, error) `perm:"read"` + + ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*chain.Message, error) `perm:"read"` + + ChainGetMessagesInTipset func(p0 context.Context, p1 chain.TipSetKey) ([]chain2.Message, error) `perm:"read"` + + ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]chain2.Message, error) `perm:"read"` + + ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*chain.MessageReceipt, error) `perm:"read"` + + ChainGetPath func(p0 context.Context, p1 chain.TipSetKey, p2 chain.TipSetKey) ([]*chain2.HeadChange, error) `perm:"read"` + + ChainGetRandomnessFromBeacon func(p0 context.Context, p1 chain.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` + + ChainGetRandomnessFromTickets func(p0 context.Context, p1 chain.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` + + ChainGetReceipts func(p0 context.Context, p1 cid.Cid) ([]chain.MessageReceipt, error) `perm:"read"` + + ChainGetTipSet func(p0 context.Context, p1 chain.TipSetKey) (*chain.TipSet, error) `perm:"read"` + + ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 chain.TipSetKey) (*chain.TipSet, error) `perm:"read"` + + ChainHead func(p0 context.Context) (*chain.TipSet, error) `perm:"read"` + + ChainList func(p0 context.Context, p1 chain.TipSetKey, p2 int) ([]chain.TipSetKey, error) `perm:"read"` + + ChainNotify func(p0 context.Context) (<-chan []*chain2.HeadChange, error) `perm:"read"` + + ChainSetHead func(p0 context.Context, p1 chain.TipSetKey) error `perm:"admin"` + + GetActor func(p0 context.Context, p1 address.Address) (*chain.Actor, error) `perm:"read"` + + GetEntry func(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*chain.BeaconEntry, error) `perm:"read"` + + GetFullBlock func(p0 context.Context, p1 cid.Cid) (*chain.FullBlock, error) `perm:"read"` + + GetParentStateRootActor func(p0 context.Context, p1 *chain.TipSet, p2 address.Address) (*chain.Actor, error) `perm:"read"` + + MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*chain2.ChainMessage, error) `perm:"read"` + + ProtocolParameters func(p0 context.Context) (*chain2.ProtocolParams, error) `perm:"read"` + + ResolveToKeyAddr func(p0 context.Context, p1 address.Address, p2 *chain.TipSet) (address.Address, error) `perm:"read"` + + StateGetReceipt func(p0 context.Context, p1 cid.Cid, p2 chain.TipSetKey) (*chain.MessageReceipt, error) `perm:"read"` + + StateNetworkName func(p0 context.Context) (chain2.NetworkName, error) `perm:"read"` + + StateNetworkVersion func(p0 context.Context, p1 chain.TipSetKey) (network.Version, error) `perm:"read"` + + StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*chain2.MsgLookup, error) `perm:"read"` + + StateSearchMsgLimited func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*chain2.MsgLookup, error) `perm:"read"` + + StateVerifiedRegistryRootKey func(p0 context.Context, p1 chain.TipSetKey) (address.Address, error) `perm:"read"` + + StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*abi.StoragePower, error) `perm:"read"` + + StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*chain2.MsgLookup, error) `perm:"read"` + + StateWaitMsgLimited func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*chain2.MsgLookup, error) `perm:"read"` + + VerifyEntry func(p0 *chain.BeaconEntry, p1 *chain.BeaconEntry, p2 abi.ChainEpoch) bool `perm:"read"` + } +} + +func (s *IChainInfoStruct) BlockTime(p0 context.Context) time.Duration { + return s.Internal.BlockTime(p0) +} + +func (s *IChainInfoStruct) ChainExport(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 chain.TipSetKey) (<-chan []byte, error) { + return s.Internal.ChainExport(p0, p1, p2, p3) +} + +func (s *IChainInfoStruct) ChainGetBlock(p0 context.Context, p1 cid.Cid) (*chain.BlockHeader, error) { + return s.Internal.ChainGetBlock(p0, p1) +} + +func (s *IChainInfoStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*chain2.BlockMessages, error) { + return s.Internal.ChainGetBlockMessages(p0, p1) +} + +func (s *IChainInfoStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*chain.Message, error) { + return s.Internal.ChainGetMessage(p0, p1) +} + +func (s *IChainInfoStruct) ChainGetMessagesInTipset(p0 context.Context, p1 chain.TipSetKey) ([]chain2.Message, error) { + return s.Internal.ChainGetMessagesInTipset(p0, p1) +} + +func (s *IChainInfoStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]chain2.Message, error) { + return s.Internal.ChainGetParentMessages(p0, p1) +} + +func (s *IChainInfoStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid) ([]*chain.MessageReceipt, error) { + return s.Internal.ChainGetParentReceipts(p0, p1) +} + +func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 chain.TipSetKey, p2 chain.TipSetKey) ([]*chain2.HeadChange, error) { + return s.Internal.ChainGetPath(p0, p1, p2) +} + +func (s *IChainInfoStruct) ChainGetRandomnessFromBeacon(p0 context.Context, p1 chain.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { + return s.Internal.ChainGetRandomnessFromBeacon(p0, p1, p2, p3, p4) +} + +func (s *IChainInfoStruct) ChainGetRandomnessFromTickets(p0 context.Context, p1 chain.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { + return s.Internal.ChainGetRandomnessFromTickets(p0, p1, p2, p3, p4) +} + +func (s *IChainInfoStruct) ChainGetReceipts(p0 context.Context, p1 cid.Cid) ([]chain.MessageReceipt, error) { + return s.Internal.ChainGetReceipts(p0, p1) +} + +func (s *IChainInfoStruct) ChainGetTipSet(p0 context.Context, p1 chain.TipSetKey) (*chain.TipSet, error) { + return s.Internal.ChainGetTipSet(p0, p1) +} + +func (s *IChainInfoStruct) ChainGetTipSetByHeight(p0 context.Context, p1 abi.ChainEpoch, p2 chain.TipSetKey) (*chain.TipSet, error) { + return s.Internal.ChainGetTipSetByHeight(p0, p1, p2) +} + +func (s *IChainInfoStruct) ChainHead(p0 context.Context) (*chain.TipSet, error) { + return s.Internal.ChainHead(p0) +} + +func (s *IChainInfoStruct) ChainList(p0 context.Context, p1 chain.TipSetKey, p2 int) ([]chain.TipSetKey, error) { + return s.Internal.ChainList(p0, p1, p2) +} + +func (s *IChainInfoStruct) ChainNotify(p0 context.Context) (<-chan []*chain2.HeadChange, error) { + return s.Internal.ChainNotify(p0) +} + +func (s *IChainInfoStruct) ChainSetHead(p0 context.Context, p1 chain.TipSetKey) error { + return s.Internal.ChainSetHead(p0, p1) +} + +func (s *IChainInfoStruct) GetActor(p0 context.Context, p1 address.Address) (*chain.Actor, error) { + return s.Internal.GetActor(p0, p1) +} + +func (s *IChainInfoStruct) GetEntry(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*chain.BeaconEntry, error) { + return s.Internal.GetEntry(p0, p1, p2) +} + +func (s *IChainInfoStruct) GetFullBlock(p0 context.Context, p1 cid.Cid) (*chain.FullBlock, error) { + return s.Internal.GetFullBlock(p0, p1) +} + +func (s *IChainInfoStruct) GetParentStateRootActor(p0 context.Context, p1 *chain.TipSet, p2 address.Address) (*chain.Actor, error) { + return s.Internal.GetParentStateRootActor(p0, p1, p2) +} + +func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*chain2.ChainMessage, error) { + return s.Internal.MessageWait(p0, p1, p2, p3) +} + +func (s *IChainInfoStruct) ProtocolParameters(p0 context.Context) (*chain2.ProtocolParams, error) { + return s.Internal.ProtocolParameters(p0) +} + +func (s *IChainInfoStruct) ResolveToKeyAddr(p0 context.Context, p1 address.Address, p2 *chain.TipSet) (address.Address, error) { + return s.Internal.ResolveToKeyAddr(p0, p1, p2) +} + +func (s *IChainInfoStruct) StateGetReceipt(p0 context.Context, p1 cid.Cid, p2 chain.TipSetKey) (*chain.MessageReceipt, error) { + return s.Internal.StateGetReceipt(p0, p1, p2) +} + +func (s *IChainInfoStruct) StateNetworkName(p0 context.Context) (chain2.NetworkName, error) { + return s.Internal.StateNetworkName(p0) +} + +func (s *IChainInfoStruct) StateNetworkVersion(p0 context.Context, p1 chain.TipSetKey) (network.Version, error) { + return s.Internal.StateNetworkVersion(p0, p1) +} + +func (s *IChainInfoStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*chain2.MsgLookup, error) { + return s.Internal.StateSearchMsg(p0, p1) +} + +func (s *IChainInfoStruct) StateSearchMsgLimited(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*chain2.MsgLookup, error) { + return s.Internal.StateSearchMsgLimited(p0, p1, p2) +} + +func (s *IChainInfoStruct) StateVerifiedRegistryRootKey(p0 context.Context, p1 chain.TipSetKey) (address.Address, error) { + return s.Internal.StateVerifiedRegistryRootKey(p0, p1) +} + +func (s *IChainInfoStruct) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*abi.StoragePower, error) { + return s.Internal.StateVerifierStatus(p0, p1, p2) +} + +func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64) (*chain2.MsgLookup, error) { + return s.Internal.StateWaitMsg(p0, p1, p2) +} + +func (s *IChainInfoStruct) StateWaitMsgLimited(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*chain2.MsgLookup, error) { + return s.Internal.StateWaitMsgLimited(p0, p1, p2, p3) +} + +func (s *IChainInfoStruct) VerifyEntry(p0 *chain.BeaconEntry, p1 *chain.BeaconEntry, p2 abi.ChainEpoch) bool { + return s.Internal.VerifyEntry(p0, p1, p2) +} + +type IDiscoveryStruct struct { +} + +type IJwtAuthAPIStruct struct { + Internal struct { + AuthNew func(p0 context.Context, p1 []auth.Permission) ([]byte, error) `perm:"admin"` + + Verify func(p0 context.Context, p1 string, p2 string) ([]auth.Permission, error) `perm:"read"` + } +} + +func (s *IJwtAuthAPIStruct) AuthNew(p0 context.Context, p1 []auth.Permission) ([]byte, error) { + return s.Internal.AuthNew(p0, p1) +} + +func (s *IJwtAuthAPIStruct) Verify(p0 context.Context, p1 string, p2 string) ([]auth.Permission, error) { + return s.Internal.Verify(p0, p1, p2) +} + +type IMarketStruct struct { + Internal struct { + StateMarketParticipants func(p0 context.Context, p1 chain.TipSetKey) (map[string]chain2.MarketBalance, error) `perm:"read"` + } +} + +func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 chain.TipSetKey) (map[string]chain2.MarketBalance, error) { + return s.Internal.StateMarketParticipants(p0, p1) +} + +type IMessagePoolStruct struct { + Internal struct { + GasBatchEstimateMessageGas func(p0 context.Context, p1 []*chain2.EstimateMessage, p2 uint64, p3 chain.TipSetKey) ([]*chain2.EstimateResult, error) `perm:"read"` + + GasEstimateFeeCap func(p0 context.Context, p1 *chain.Message, p2 int64, p3 chain.TipSetKey) (big.Int, error) `perm:"read"` + + GasEstimateGasLimit func(p0 context.Context, p1 *chain.Message, p2 chain.TipSetKey) (int64, error) `perm:"read"` + + GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 chain.TipSetKey) (big.Int, error) `perm:"read"` + + GasEstimateMessageGas func(p0 context.Context, p1 *chain.Message, p2 *chain2.MessageSendSpec, p3 chain.TipSetKey) (*chain.Message, error) `perm:"read"` + + MpoolBatchPush func(p0 context.Context, p1 []*chain.SignedMessage) ([]cid.Cid, error) `perm:"write"` + + MpoolBatchPushMessage func(p0 context.Context, p1 []*chain.Message, p2 *chain2.MessageSendSpec) ([]*chain.SignedMessage, error) `perm:"sign"` + + MpoolBatchPushUntrusted func(p0 context.Context, p1 []*chain.SignedMessage) ([]cid.Cid, error) `perm:"write"` + + MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` + + MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` + + MpoolGetConfig func(p0 context.Context) (*messagepool.MpoolConfig, error) `perm:"read"` + + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` + + MpoolPending func(p0 context.Context, p1 chain.TipSetKey) ([]*chain.SignedMessage, error) `perm:"read"` + + MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"admin"` + + MpoolPublishMessage func(p0 context.Context, p1 *chain.SignedMessage) error `perm:"admin"` + + MpoolPush func(p0 context.Context, p1 *chain.SignedMessage) (cid.Cid, error) `perm:"write"` + + MpoolPushMessage func(p0 context.Context, p1 *chain.Message, p2 *chain2.MessageSendSpec) (*chain.SignedMessage, error) `perm:"sign"` + + MpoolPushUntrusted func(p0 context.Context, p1 *chain.SignedMessage) (cid.Cid, error) `perm:"write"` + + MpoolSelect func(p0 context.Context, p1 chain.TipSetKey, p2 float64) ([]*chain.SignedMessage, error) `perm:"read"` + + MpoolSelects func(p0 context.Context, p1 chain.TipSetKey, p2 []float64) ([][]*chain.SignedMessage, error) `perm:"read"` + + MpoolSetConfig func(p0 context.Context, p1 *messagepool.MpoolConfig) error `perm:"admin"` + + MpoolSub func(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) `perm:"read"` + } +} + +func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*chain2.EstimateMessage, p2 uint64, p3 chain.TipSetKey) ([]*chain2.EstimateResult, error) { + return s.Internal.GasBatchEstimateMessageGas(p0, p1, p2, p3) +} + +func (s *IMessagePoolStruct) GasEstimateFeeCap(p0 context.Context, p1 *chain.Message, p2 int64, p3 chain.TipSetKey) (big.Int, error) { + return s.Internal.GasEstimateFeeCap(p0, p1, p2, p3) +} + +func (s *IMessagePoolStruct) GasEstimateGasLimit(p0 context.Context, p1 *chain.Message, p2 chain.TipSetKey) (int64, error) { + return s.Internal.GasEstimateGasLimit(p0, p1, p2) +} + +func (s *IMessagePoolStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 chain.TipSetKey) (big.Int, error) { + return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) +} + +func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *chain.Message, p2 *chain2.MessageSendSpec, p3 chain.TipSetKey) (*chain.Message, error) { + return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) +} + +func (s *IMessagePoolStruct) MpoolBatchPush(p0 context.Context, p1 []*chain.SignedMessage) ([]cid.Cid, error) { + return s.Internal.MpoolBatchPush(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*chain.Message, p2 *chain2.MessageSendSpec) ([]*chain.SignedMessage, error) { + return s.Internal.MpoolBatchPushMessage(p0, p1, p2) +} + +func (s *IMessagePoolStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*chain.SignedMessage) ([]cid.Cid, error) { + return s.Internal.MpoolBatchPushUntrusted(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolClear(p0 context.Context, p1 bool) error { + return s.Internal.MpoolClear(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolDeleteByAdress(p0 context.Context, p1 address.Address) error { + return s.Internal.MpoolDeleteByAdress(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolGetConfig(p0 context.Context) (*messagepool.MpoolConfig, error) { + return s.Internal.MpoolGetConfig(p0) +} + +func (s *IMessagePoolStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + return s.Internal.MpoolGetNonce(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolPending(p0 context.Context, p1 chain.TipSetKey) ([]*chain.SignedMessage, error) { + return s.Internal.MpoolPending(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolPublishByAddr(p0 context.Context, p1 address.Address) error { + return s.Internal.MpoolPublishByAddr(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolPublishMessage(p0 context.Context, p1 *chain.SignedMessage) error { + return s.Internal.MpoolPublishMessage(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolPush(p0 context.Context, p1 *chain.SignedMessage) (cid.Cid, error) { + return s.Internal.MpoolPush(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *chain.Message, p2 *chain2.MessageSendSpec) (*chain.SignedMessage, error) { + return s.Internal.MpoolPushMessage(p0, p1, p2) +} + +func (s *IMessagePoolStruct) MpoolPushUntrusted(p0 context.Context, p1 *chain.SignedMessage) (cid.Cid, error) { + return s.Internal.MpoolPushUntrusted(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolSelect(p0 context.Context, p1 chain.TipSetKey, p2 float64) ([]*chain.SignedMessage, error) { + return s.Internal.MpoolSelect(p0, p1, p2) +} + +func (s *IMessagePoolStruct) MpoolSelects(p0 context.Context, p1 chain.TipSetKey, p2 []float64) ([][]*chain.SignedMessage, error) { + return s.Internal.MpoolSelects(p0, p1, p2) +} + +func (s *IMessagePoolStruct) MpoolSetConfig(p0 context.Context, p1 *messagepool.MpoolConfig) error { + return s.Internal.MpoolSetConfig(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolSub(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) { + return s.Internal.MpoolSub(p0) +} + +type IMinerStateStruct struct { + Internal struct { + StateCirculatingSupply func(p0 context.Context, p1 chain.TipSetKey) (abi.TokenAmount, error) `perm:"read"` + + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 chain.TipSetKey) (chain2.DealCollateralBounds, error) `perm:"read"` + + StateListActors func(p0 context.Context, p1 chain.TipSetKey) ([]address.Address, error) `perm:"read"` + + StateListMiners func(p0 context.Context, p1 chain.TipSetKey) ([]address.Address, error) `perm:"read"` + + StateLookupID func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) `perm:"read"` + + StateMarketBalance func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (chain2.MarketBalance, error) `perm:"read"` + + StateMarketDeals func(p0 context.Context, p1 chain.TipSetKey) (map[string]chain2.MarketDeal, error) `perm:"read"` + + StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 chain.TipSetKey) (*chain2.MarketDeal, error) `perm:"read"` + + StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + + StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (big.Int, error) `perm:"read"` + + StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) ([]chain2.Deadline, error) `perm:"read"` + + StateMinerFaults func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (bitfield.BitField, error) `perm:"read"` + + StateMinerInfo func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (miner.MinerInfo, error) `perm:"read"` + + StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 chain.TipSetKey) (big.Int, error) `perm:"read"` + + StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 chain.TipSetKey) ([]chain2.Partition, error) `perm:"read"` + + StateMinerPower func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*chain2.MinerPower, error) `perm:"read"` + + StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 chain.TipSetKey) (big.Int, error) `perm:"read"` + + StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*dline.Info, error) `perm:"read"` + + StateMinerRecoveries func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (bitfield.BitField, error) `perm:"read"` + + StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (bool, error) `perm:"read"` + + StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (chain2.MinerSectors, error) `perm:"read"` + + StateMinerSectorSize func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (abi.SectorSize, error) `perm:"read"` + + StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + + StateMinerWorkerAddress func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) `perm:"read"` + + StateSectorExpiration func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorExpiration, error) `perm:"read"` + + StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` + + StateSectorPartition func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` + + StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` + + StateVMCirculatingSupplyInternal func(p0 context.Context, p1 chain.TipSetKey) (chain.CirculatingSupply, error) `perm:"read"` + + StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*abi.StoragePower, error) `perm:"read"` + } +} + +func (s *IMinerStateStruct) StateCirculatingSupply(p0 context.Context, p1 chain.TipSetKey) (abi.TokenAmount, error) { + return s.Internal.StateCirculatingSupply(p0, p1) +} + +func (s *IMinerStateStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 chain.TipSetKey) (chain2.DealCollateralBounds, error) { + return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateListActors(p0 context.Context, p1 chain.TipSetKey) ([]address.Address, error) { + return s.Internal.StateListActors(p0, p1) +} + +func (s *IMinerStateStruct) StateListMiners(p0 context.Context, p1 chain.TipSetKey) ([]address.Address, error) { + return s.Internal.StateListMiners(p0, p1) +} + +func (s *IMinerStateStruct) StateLookupID(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) { + return s.Internal.StateLookupID(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (chain2.MarketBalance, error) { + return s.Internal.StateMarketBalance(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 chain.TipSetKey) (map[string]chain2.MarketDeal, error) { + return s.Internal.StateMarketDeals(p0, p1) +} + +func (s *IMinerStateStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 chain.TipSetKey) (*chain2.MarketDeal, error) { + return s.Internal.StateMarketStorageDeal(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerActiveSectors(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) { + return s.Internal.StateMinerActiveSectors(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerAvailableBalance(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (big.Int, error) { + return s.Internal.StateMinerAvailableBalance(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) ([]chain2.Deadline, error) { + return s.Internal.StateMinerDeadlines(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerFaults(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (bitfield.BitField, error) { + return s.Internal.StateMinerFaults(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerInfo(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (miner.MinerInfo, error) { + return s.Internal.StateMinerInfo(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 chain.TipSetKey) (big.Int, error) { + return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 chain.TipSetKey) ([]chain2.Partition, error) { + return s.Internal.StateMinerPartitions(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*chain2.MinerPower, error) { + return s.Internal.StateMinerPower(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerPreCommitDepositForPower(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 chain.TipSetKey) (big.Int, error) { + return s.Internal.StateMinerPreCommitDepositForPower(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateMinerProvingDeadline(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*dline.Info, error) { + return s.Internal.StateMinerProvingDeadline(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerRecoveries(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (bitfield.BitField, error) { + return s.Internal.StateMinerRecoveries(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerSectorAllocated(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (bool, error) { + return s.Internal.StateMinerSectorAllocated(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (chain2.MinerSectors, error) { + return s.Internal.StateMinerSectorCount(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerSectorSize(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (abi.SectorSize, error) { + return s.Internal.StateMinerSectorSize(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerSectors(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) { + return s.Internal.StateMinerSectors(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateMinerWorkerAddress(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) { + return s.Internal.StateMinerWorkerAddress(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateSectorExpiration(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorExpiration, error) { + return s.Internal.StateSectorExpiration(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateSectorGetInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorOnChainInfo, error) { + return s.Internal.StateSectorGetInfo(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateSectorPartition(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorLocation, error) { + return s.Internal.StateSectorPartition(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateSectorPreCommitInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { + return s.Internal.StateSectorPreCommitInfo(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 chain.TipSetKey) (chain.CirculatingSupply, error) { + return s.Internal.StateVMCirculatingSupplyInternal(p0, p1) +} + +func (s *IMinerStateStruct) StateVerifiedClientStatus(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*abi.StoragePower, error) { + return s.Internal.StateVerifiedClientStatus(p0, p1, p2) +} + +type IMiningStruct struct { + Internal struct { + MinerCreateBlock func(p0 context.Context, p1 *chain2.BlockTemplate) (*chain.BlockMsg, error) `perm:"write"` + + MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 chain.TipSetKey) (*chain2.MiningBaseInfo, error) `perm:"read"` + } +} + +func (s *IMiningStruct) MinerCreateBlock(p0 context.Context, p1 *chain2.BlockTemplate) (*chain.BlockMsg, error) { + return s.Internal.MinerCreateBlock(p0, p1) +} + +func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 chain.TipSetKey) (*chain2.MiningBaseInfo, error) { + return s.Internal.MinerGetBaseInfo(p0, p1, p2, p3) +} + +type IMultiSigStruct struct { + Internal struct { + MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) `perm:"sign"` + + MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (cid.Cid, error) `perm:"sign"` + + MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` + + MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) `perm:"sign"` + + MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 chain.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) `perm:"sign"` + + MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 chain.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) `perm:"sign"` + + MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 chain.BigInt, p5 address.Address, p6 chain.BigInt) (cid.Cid, error) `perm:"sign"` + + MsigGetVested func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey, p3 chain.TipSetKey) (chain.BigInt, error) `perm:"read"` + + MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 chain.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) `perm:"sign"` + + MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` + + MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (cid.Cid, error) `perm:"sign"` + + MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (cid.Cid, error) `perm:"sign"` + + MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (cid.Cid, error) `perm:"sign"` + } +} + +func (s *IMultiSigStruct) MsigAddApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) { + return s.Internal.MsigAddApprove(p0, p1, p2, p3, p4, p5, p6) +} + +func (s *IMultiSigStruct) MsigAddCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (cid.Cid, error) { + return s.Internal.MsigAddCancel(p0, p1, p2, p3, p4, p5) +} + +func (s *IMultiSigStruct) MsigAddPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) { + return s.Internal.MsigAddPropose(p0, p1, p2, p3, p4) +} + +func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) { + return s.Internal.MsigApprove(p0, p1, p2, p3) +} + +func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 chain.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) { + return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3, p4, p5, p6, p7, p8) +} + +func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 chain.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) { + return s.Internal.MsigCancel(p0, p1, p2, p3, p4, p5, p6, p7) +} + +func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 chain.BigInt, p5 address.Address, p6 chain.BigInt) (cid.Cid, error) { + return s.Internal.MsigCreate(p0, p1, p2, p3, p4, p5, p6) +} + +func (s *IMultiSigStruct) MsigGetVested(p0 context.Context, p1 address.Address, p2 chain.TipSetKey, p3 chain.TipSetKey) (chain.BigInt, error) { + return s.Internal.MsigGetVested(p0, p1, p2, p3) +} + +func (s *IMultiSigStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 chain.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) { + return s.Internal.MsigPropose(p0, p1, p2, p3, p4, p5, p6) +} + +func (s *IMultiSigStruct) MsigRemoveSigner(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) { + return s.Internal.MsigRemoveSigner(p0, p1, p2, p3, p4) +} + +func (s *IMultiSigStruct) MsigSwapApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (cid.Cid, error) { + return s.Internal.MsigSwapApprove(p0, p1, p2, p3, p4, p5, p6) +} + +func (s *IMultiSigStruct) MsigSwapCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (cid.Cid, error) { + return s.Internal.MsigSwapCancel(p0, p1, p2, p3, p4, p5) +} + +func (s *IMultiSigStruct) MsigSwapPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (cid.Cid, error) { + return s.Internal.MsigSwapPropose(p0, p1, p2, p3, p4) +} + +type INetworkStruct struct { + Internal struct { + NetAddrsListen func(p0 context.Context) (peer.AddrInfo, error) `perm:"read"` + + NetworkConnect func(p0 context.Context, p1 []string) (<-chan net.ConnectionResult, error) `perm:"read"` + + NetworkFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` + + NetworkFindProvidersAsync func(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo `perm:"read"` + + NetworkGetBandwidthStats func(p0 context.Context) metrics.Stats `perm:"admin"` + + NetworkGetClosestPeers func(p0 context.Context, p1 string) (<-chan peer.ID, error) `perm:"read"` + + NetworkGetPeerAddresses func(p0 context.Context) []ma.Multiaddr `perm:"admin"` + + NetworkGetPeerID func(p0 context.Context) peer.ID `perm:"admin"` + + NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*net.SwarmConnInfos, error) `perm:"read"` + + Version func(p0 context.Context) (chain2.Version, error) `perm:"read"` + } +} + +func (s *INetworkStruct) NetAddrsListen(p0 context.Context) (peer.AddrInfo, error) { + return s.Internal.NetAddrsListen(p0) +} + +func (s *INetworkStruct) NetworkConnect(p0 context.Context, p1 []string) (<-chan net.ConnectionResult, error) { + return s.Internal.NetworkConnect(p0, p1) +} + +func (s *INetworkStruct) NetworkFindPeer(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) { + return s.Internal.NetworkFindPeer(p0, p1) +} + +func (s *INetworkStruct) NetworkFindProvidersAsync(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo { + return s.Internal.NetworkFindProvidersAsync(p0, p1, p2) +} + +func (s *INetworkStruct) NetworkGetBandwidthStats(p0 context.Context) metrics.Stats { + return s.Internal.NetworkGetBandwidthStats(p0) +} + +func (s *INetworkStruct) NetworkGetClosestPeers(p0 context.Context, p1 string) (<-chan peer.ID, error) { + return s.Internal.NetworkGetClosestPeers(p0, p1) +} + +func (s *INetworkStruct) NetworkGetPeerAddresses(p0 context.Context) []ma.Multiaddr { + return s.Internal.NetworkGetPeerAddresses(p0) +} + +func (s *INetworkStruct) NetworkGetPeerID(p0 context.Context) peer.ID { + return s.Internal.NetworkGetPeerID(p0) +} + +func (s *INetworkStruct) NetworkPeers(p0 context.Context, p1 bool, p2 bool, p3 bool) (*net.SwarmConnInfos, error) { + return s.Internal.NetworkPeers(p0, p1, p2, p3) +} + +func (s *INetworkStruct) Version(p0 context.Context) (chain2.Version, error) { + return s.Internal.Version(p0) +} + +type IPaychanStruct struct { + Internal struct { + PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` + + PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*chain2.ChannelAvailableFunds, error) `perm:"sign"` + + PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*chain2.ChannelAvailableFunds, error) `perm:"sign"` + + PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + + PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paych.ChannelInfo, error) `perm:"sign"` + + PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` + + PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` + + PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []paych.VoucherSpec) (*paych.PaymentInfo, error) `perm:"sign"` + + PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + + PaychStatus func(p0 context.Context, p1 address.Address) (*paych.Status, error) `perm:"read"` + + PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` + + PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` + + PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` + + PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paych.VoucherCreateResult, error) `perm:"sign"` + + PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` + + PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` + } +} + +func (s *IPaychanStruct) PaychAllocateLane(p0 context.Context, p1 address.Address) (uint64, error) { + return s.Internal.PaychAllocateLane(p0, p1) +} + +func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*chain2.ChannelAvailableFunds, error) { + return s.Internal.PaychAvailableFunds(p0, p1) +} + +func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*chain2.ChannelAvailableFunds, error) { + return s.Internal.PaychAvailableFundsByFromTo(p0, p1, p2) +} + +func (s *IPaychanStruct) PaychCollect(p0 context.Context, p1 address.Address) (cid.Cid, error) { + return s.Internal.PaychCollect(p0, p1) +} + +func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paych.ChannelInfo, error) { + return s.Internal.PaychGet(p0, p1, p2, p3) +} + +func (s *IPaychanStruct) PaychGetWaitReady(p0 context.Context, p1 cid.Cid) (address.Address, error) { + return s.Internal.PaychGetWaitReady(p0, p1) +} + +func (s *IPaychanStruct) PaychList(p0 context.Context) ([]address.Address, error) { + return s.Internal.PaychList(p0) +} + +func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []paych.VoucherSpec) (*paych.PaymentInfo, error) { + return s.Internal.PaychNewPayment(p0, p1, p2, p3) +} + +func (s *IPaychanStruct) PaychSettle(p0 context.Context, p1 address.Address) (cid.Cid, error) { + return s.Internal.PaychSettle(p0, p1) +} + +func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*paych.Status, error) { + return s.Internal.PaychStatus(p0, p1) +} + +func (s *IPaychanStruct) PaychVoucherAdd(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) { + return s.Internal.PaychVoucherAdd(p0, p1, p2, p3, p4) +} + +func (s *IPaychanStruct) PaychVoucherCheckSpendable(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) { + return s.Internal.PaychVoucherCheckSpendable(p0, p1, p2, p3, p4) +} + +func (s *IPaychanStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error { + return s.Internal.PaychVoucherCheckValid(p0, p1, p2) +} + +func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paych.VoucherCreateResult, error) { + return s.Internal.PaychVoucherCreate(p0, p1, p2, p3) +} + +func (s *IPaychanStruct) PaychVoucherList(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) { + return s.Internal.PaychVoucherList(p0, p1) +} + +func (s *IPaychanStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) { + return s.Internal.PaychVoucherSubmit(p0, p1, p2, p3, p4) +} + +type ISyncerStruct struct { + Internal struct { + ChainSyncHandleNewTipSet func(p0 context.Context, p1 *chain.ChainInfo) error `perm:"write"` + + ChainTipSetWeight func(p0 context.Context, p1 chain.TipSetKey) (big.Int, error) `perm:"read"` + + Concurrent func(p0 context.Context) int64 `perm:"read"` + + SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` + + StateCall func(p0 context.Context, p1 *chain.Message, p2 chain.TipSetKey) (*chain2.InvocResult, error) `perm:"read"` + + SyncState func(p0 context.Context) (*chain2.SyncState, error) `perm:"read"` + + SyncSubmitBlock func(p0 context.Context, p1 *chain.BlockMsg) error `perm:"write"` + } +} + +func (s *ISyncerStruct) ChainSyncHandleNewTipSet(p0 context.Context, p1 *chain.ChainInfo) error { + return s.Internal.ChainSyncHandleNewTipSet(p0, p1) +} + +func (s *ISyncerStruct) ChainTipSetWeight(p0 context.Context, p1 chain.TipSetKey) (big.Int, error) { + return s.Internal.ChainTipSetWeight(p0, p1) +} + +func (s *ISyncerStruct) Concurrent(p0 context.Context) int64 { + return s.Internal.Concurrent(p0) +} + +func (s *ISyncerStruct) SetConcurrent(p0 context.Context, p1 int64) error { + return s.Internal.SetConcurrent(p0, p1) +} + +func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *chain.Message, p2 chain.TipSetKey) (*chain2.InvocResult, error) { + return s.Internal.StateCall(p0, p1, p2) +} + +func (s *ISyncerStruct) SyncState(p0 context.Context) (*chain2.SyncState, error) { + return s.Internal.SyncState(p0) +} + +func (s *ISyncerStruct) SyncSubmitBlock(p0 context.Context, p1 *chain.BlockMsg) error { + return s.Internal.SyncSubmitBlock(p0, p1) +} + +type IWalletStruct struct { + Internal struct { + HasPassword func(p0 context.Context) bool `perm:"admin"` + + LockWallet func(p0 context.Context) error `perm:"admin"` + + SetPassword func(p0 context.Context, p1 []byte) error `perm:"admin"` + + UnLockWallet func(p0 context.Context, p1 []byte) error `perm:"admin"` + + WalletAddresses func(p0 context.Context) []address.Address `perm:"admin"` + + WalletBalance func(p0 context.Context, p1 address.Address) (abi.TokenAmount, error) `perm:"read"` + + WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"` + + WalletExport func(p0 address.Address, p1 string) (*wallet.KeyInfo, error) `perm:"admin"` + + WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` + + WalletImport func(p0 *wallet.KeyInfo) (address.Address, error) `perm:"admin"` + + WalletNewAddress func(p0 address.Protocol) (address.Address, error) `perm:"write"` + + WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` + + WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) `perm:"sign"` + + WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *chain.Message) (*chain.SignedMessage, error) `perm:"sign"` + + WalletState func(p0 context.Context) int `perm:"admin"` + } +} + +func (s *IWalletStruct) HasPassword(p0 context.Context) bool { + return s.Internal.HasPassword(p0) +} + +func (s *IWalletStruct) LockWallet(p0 context.Context) error { + return s.Internal.LockWallet(p0) +} + +func (s *IWalletStruct) SetPassword(p0 context.Context, p1 []byte) error { + return s.Internal.SetPassword(p0, p1) +} + +func (s *IWalletStruct) UnLockWallet(p0 context.Context, p1 []byte) error { + return s.Internal.UnLockWallet(p0, p1) +} + +func (s *IWalletStruct) WalletAddresses(p0 context.Context) []address.Address { + return s.Internal.WalletAddresses(p0) +} + +func (s *IWalletStruct) WalletBalance(p0 context.Context, p1 address.Address) (abi.TokenAmount, error) { + return s.Internal.WalletBalance(p0, p1) +} + +func (s *IWalletStruct) WalletDefaultAddress(p0 context.Context) (address.Address, error) { + return s.Internal.WalletDefaultAddress(p0) +} + +func (s *IWalletStruct) WalletExport(p0 address.Address, p1 string) (*wallet.KeyInfo, error) { + return s.Internal.WalletExport(p0, p1) +} + +func (s *IWalletStruct) WalletHas(p0 context.Context, p1 address.Address) (bool, error) { + return s.Internal.WalletHas(p0, p1) +} + +func (s *IWalletStruct) WalletImport(p0 *wallet.KeyInfo) (address.Address, error) { + return s.Internal.WalletImport(p0) +} + +func (s *IWalletStruct) WalletNewAddress(p0 address.Protocol) (address.Address, error) { + return s.Internal.WalletNewAddress(p0) +} + +func (s *IWalletStruct) WalletSetDefault(p0 context.Context, p1 address.Address) error { + return s.Internal.WalletSetDefault(p0, p1) +} + +func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) { + return s.Internal.WalletSign(p0, p1, p2, p3) +} + +func (s *IWalletStruct) WalletSignMessage(p0 context.Context, p1 address.Address, p2 *chain.Message) (*chain.SignedMessage, error) { + return s.Internal.WalletSignMessage(p0, p1, p2) +} + +func (s *IWalletStruct) WalletState(p0 context.Context) int { + return s.Internal.WalletState(p0) +} diff --git a/venus-shared/api/chain/v1/blockstore.go b/venus-shared/api/chain/v1/blockstore.go index 6a28e6e050..041de41c31 100644 --- a/venus-shared/api/chain/v1/blockstore.go +++ b/venus-shared/api/chain/v1/blockstore.go @@ -3,7 +3,7 @@ package v1 import ( "context" - "github.com/filecoin-project/venus/venus-shared/api/chain" + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/ipfs/go-cid" ) @@ -16,5 +16,5 @@ type IBlockStore interface { // Rule[perm:read] ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) // Rule[perm:read] - ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (chain.ObjStat, error) + ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (chain2.ObjStat, error) } diff --git a/venus-shared/api/chain/v1/chain.go b/venus-shared/api/chain/v1/chain.go index a926643c3f..d2a159c81a 100644 --- a/venus-shared/api/chain/v1/chain.go +++ b/venus-shared/api/chain/v1/chain.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - acrypto "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" "github.com/ipfs/go-cid" @@ -59,13 +59,13 @@ type IChainInfo interface { // Rule[perm:read] ChainGetTipSetAfterHeight(ctx context.Context, height abi.ChainEpoch, tsk chain.TipSetKey) (*chain.TipSet, error) // Rule[perm:read] - ChainGetRandomnessFromBeacon(ctx context.Context, key chain.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) + ChainGetRandomnessFromBeacon(ctx context.Context, key chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) // Rule[perm:read] - ChainGetRandomnessFromTickets(ctx context.Context, tsk chain.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) + ChainGetRandomnessFromTickets(ctx context.Context, tsk chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) // Rule[perm:read] - StateGetRandomnessFromTickets(ctx context.Context, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk chain.TipSetKey) (abi.Randomness, error) + StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk chain.TipSetKey) (abi.Randomness, error) // Rule[perm:read] - StateGetRandomnessFromBeacon(ctx context.Context, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk chain.TipSetKey) (abi.Randomness, error) + StateGetRandomnessFromBeacon(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk chain.TipSetKey) (abi.Randomness, error) // Rule[perm:read] ChainGetBlock(ctx context.Context, id cid.Cid) (*chain.BlockHeader, error) // Rule[perm:read] diff --git a/venus-shared/api/chain/v1/network.go b/venus-shared/api/chain/v1/network.go index 34f105ce97..5935fc53de 100644 --- a/venus-shared/api/chain/v1/network.go +++ b/venus-shared/api/chain/v1/network.go @@ -8,7 +8,7 @@ import ( "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" - "github.com/filecoin-project/venus/venus-shared/api/chain" + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/filecoin-project/venus/venus-shared/libp2p/net" ) @@ -30,7 +30,7 @@ type INetwork interface { // Rule[perm:read] NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) // Rule[perm:read] - Version(context.Context) (chain.Version, error) + Version(context.Context) (chain2.Version, error) // Rule[perm:read] NetAddrsListen(context.Context) (peer.AddrInfo, error) } diff --git a/venus-shared/api/chain/v1/paych.go b/venus-shared/api/chain/v1/paych.go index 0e192eec9b..d630fc75bc 100644 --- a/venus-shared/api/chain/v1/paych.go +++ b/venus-shared/api/chain/v1/paych.go @@ -7,7 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/venus-shared/api/chain" + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/filecoin-project/venus/venus-shared/paych" ) @@ -21,12 +21,12 @@ type IPaychan interface { // PaychAvailableFunds get the status of an outbound payment channel // @pch: payment channel address // Rule[perm:sign] - PaychAvailableFunds(ctx context.Context, ch address.Address) (*chain.ChannelAvailableFunds, error) + PaychAvailableFunds(ctx context.Context, ch address.Address) (*chain2.ChannelAvailableFunds, error) // PaychAvailableFundsByFromTo get the status of an outbound payment channel // @from: the payment channel sender // @to: he payment channel recipient // Rule[perm:sign] - PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*chain.ChannelAvailableFunds, error) + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*chain2.ChannelAvailableFunds, error) // PaychGetWaitsigny waits until the create channel / add funds message with the sentinel // @sentinel: given message CID arrives. // @ch: the returned channel address can safely be used against the Manager methods. diff --git a/venus-shared/api/chain/v1/proxy_gen.go b/venus-shared/api/chain/v1/proxy_gen.go new file mode 100644 index 0000000000..09afef5aa2 --- /dev/null +++ b/venus-shared/api/chain/v1/proxy_gen.go @@ -0,0 +1,1093 @@ +// Code generated by github.com/filecoin-project/tools/gen/api. DO NOT EDIT. + +package v1 + +import ( + "context" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-jsonrpc/auth" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/dline" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/libp2p/net" + "github.com/filecoin-project/venus/venus-shared/messagepool" + "github.com/filecoin-project/venus/venus-shared/paych" + "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/metrics" + "github.com/libp2p/go-libp2p-core/peer" + ma "github.com/multiformats/go-multiaddr" + "time" +) + +type FullNodeStruct struct { + IBlockStoreStruct + IChainStruct + IMarketStruct + IMiningStruct + IMessagePoolStruct + IMultiSigStruct + INetworkStruct + IPaychanStruct + ISyncerStruct + IWalletStruct + IJwtAuthAPIStruct +} + +type IAccountStruct struct { + Internal struct { + StateAccountKey func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) `perm:"read"` + } +} + +func (s *IAccountStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) { + return s.Internal.StateAccountKey(p0, p1, p2) +} + +type IActorStruct struct { + Internal struct { + ListActor func(p0 context.Context) (map[address.Address]*chain.Actor, error) `perm:"read"` + + StateGetActor func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*chain.Actor, error) `perm:"read"` + } +} + +func (s *IActorStruct) ListActor(p0 context.Context) (map[address.Address]*chain.Actor, error) { + return s.Internal.ListActor(p0) +} + +func (s *IActorStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*chain.Actor, error) { + return s.Internal.StateGetActor(p0, p1, p2) +} + +type IBeaconStruct struct { + Internal struct { + BeaconGetEntry func(p0 context.Context, p1 abi.ChainEpoch) (*chain.BeaconEntry, error) `perm:"read"` + } +} + +func (s *IBeaconStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (*chain.BeaconEntry, error) { + return s.Internal.BeaconGetEntry(p0, p1) +} + +type IBlockStoreStruct struct { + Internal struct { + ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` + + ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"` + + ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` + + ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (chain2.ObjStat, error) `perm:"read"` + } +} + +func (s *IBlockStoreStruct) ChainDeleteObj(p0 context.Context, p1 cid.Cid) error { + return s.Internal.ChainDeleteObj(p0, p1) +} + +func (s *IBlockStoreStruct) ChainHasObj(p0 context.Context, p1 cid.Cid) (bool, error) { + return s.Internal.ChainHasObj(p0, p1) +} + +func (s *IBlockStoreStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { + return s.Internal.ChainReadObj(p0, p1) +} + +func (s *IBlockStoreStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (chain2.ObjStat, error) { + return s.Internal.ChainStatObj(p0, p1, p2) +} + +type IChainStruct struct { + IAccountStruct + IActorStruct + IBeaconStruct + IMinerStateStruct + IChainInfoStruct +} + +type IChainInfoStruct struct { + Internal struct { + BlockTime func(p0 context.Context) time.Duration `perm:"read"` + + ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 chain.TipSetKey) (<-chan []byte, error) `perm:"read"` + + ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*chain.BlockHeader, error) `perm:"read"` + + ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*chain2.BlockMessages, error) `perm:"read"` + + ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*chain.Message, error) `perm:"read"` + + ChainGetMessagesInTipset func(p0 context.Context, p1 chain.TipSetKey) ([]chain2.Message, error) `perm:"read"` + + ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]chain2.Message, error) `perm:"read"` + + ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*chain.MessageReceipt, error) `perm:"read"` + + ChainGetPath func(p0 context.Context, p1 chain.TipSetKey, p2 chain.TipSetKey) ([]*chain2.HeadChange, error) `perm:"read"` + + ChainGetRandomnessFromBeacon func(p0 context.Context, p1 chain.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` + + ChainGetRandomnessFromTickets func(p0 context.Context, p1 chain.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` + + ChainGetReceipts func(p0 context.Context, p1 cid.Cid) ([]chain.MessageReceipt, error) `perm:"read"` + + ChainGetTipSet func(p0 context.Context, p1 chain.TipSetKey) (*chain.TipSet, error) `perm:"read"` + + ChainGetTipSetAfterHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 chain.TipSetKey) (*chain.TipSet, error) `perm:"read"` + + ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 chain.TipSetKey) (*chain.TipSet, error) `perm:"read"` + + ChainHead func(p0 context.Context) (*chain.TipSet, error) `perm:"read"` + + ChainList func(p0 context.Context, p1 chain.TipSetKey, p2 int) ([]chain.TipSetKey, error) `perm:"read"` + + ChainNotify func(p0 context.Context) (<-chan []*chain2.HeadChange, error) `perm:"read"` + + ChainSetHead func(p0 context.Context, p1 chain.TipSetKey) error `perm:"admin"` + + GetActor func(p0 context.Context, p1 address.Address) (*chain.Actor, error) `perm:"read"` + + GetEntry func(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*chain.BeaconEntry, error) `perm:"read"` + + GetFullBlock func(p0 context.Context, p1 cid.Cid) (*chain.FullBlock, error) `perm:"read"` + + GetParentStateRootActor func(p0 context.Context, p1 *chain.TipSet, p2 address.Address) (*chain.Actor, error) `perm:"read"` + + MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*chain2.ChainMessage, error) `perm:"read"` + + ProtocolParameters func(p0 context.Context) (*chain2.ProtocolParams, error) `perm:"read"` + + ResolveToKeyAddr func(p0 context.Context, p1 address.Address, p2 *chain.TipSet) (address.Address, error) `perm:"read"` + + StateGetRandomnessFromBeacon func(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 chain.TipSetKey) (abi.Randomness, error) `perm:"read"` + + StateGetRandomnessFromTickets func(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 chain.TipSetKey) (abi.Randomness, error) `perm:"read"` + + StateNetworkName func(p0 context.Context) (chain2.NetworkName, error) `perm:"read"` + + StateNetworkVersion func(p0 context.Context, p1 chain.TipSetKey) (network.Version, error) `perm:"read"` + + StateSearchMsg func(p0 context.Context, p1 chain.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*chain2.MsgLookup, error) `perm:"read"` + + StateVerifiedRegistryRootKey func(p0 context.Context, p1 chain.TipSetKey) (address.Address, error) `perm:"read"` + + StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*abi.StoragePower, error) `perm:"read"` + + StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*chain2.MsgLookup, error) `perm:"read"` + + VerifyEntry func(p0 *chain.BeaconEntry, p1 *chain.BeaconEntry, p2 abi.ChainEpoch) bool `perm:"read"` + } +} + +func (s *IChainInfoStruct) BlockTime(p0 context.Context) time.Duration { + return s.Internal.BlockTime(p0) +} + +func (s *IChainInfoStruct) ChainExport(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 chain.TipSetKey) (<-chan []byte, error) { + return s.Internal.ChainExport(p0, p1, p2, p3) +} + +func (s *IChainInfoStruct) ChainGetBlock(p0 context.Context, p1 cid.Cid) (*chain.BlockHeader, error) { + return s.Internal.ChainGetBlock(p0, p1) +} + +func (s *IChainInfoStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*chain2.BlockMessages, error) { + return s.Internal.ChainGetBlockMessages(p0, p1) +} + +func (s *IChainInfoStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*chain.Message, error) { + return s.Internal.ChainGetMessage(p0, p1) +} + +func (s *IChainInfoStruct) ChainGetMessagesInTipset(p0 context.Context, p1 chain.TipSetKey) ([]chain2.Message, error) { + return s.Internal.ChainGetMessagesInTipset(p0, p1) +} + +func (s *IChainInfoStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]chain2.Message, error) { + return s.Internal.ChainGetParentMessages(p0, p1) +} + +func (s *IChainInfoStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid) ([]*chain.MessageReceipt, error) { + return s.Internal.ChainGetParentReceipts(p0, p1) +} + +func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 chain.TipSetKey, p2 chain.TipSetKey) ([]*chain2.HeadChange, error) { + return s.Internal.ChainGetPath(p0, p1, p2) +} + +func (s *IChainInfoStruct) ChainGetRandomnessFromBeacon(p0 context.Context, p1 chain.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { + return s.Internal.ChainGetRandomnessFromBeacon(p0, p1, p2, p3, p4) +} + +func (s *IChainInfoStruct) ChainGetRandomnessFromTickets(p0 context.Context, p1 chain.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { + return s.Internal.ChainGetRandomnessFromTickets(p0, p1, p2, p3, p4) +} + +func (s *IChainInfoStruct) ChainGetReceipts(p0 context.Context, p1 cid.Cid) ([]chain.MessageReceipt, error) { + return s.Internal.ChainGetReceipts(p0, p1) +} + +func (s *IChainInfoStruct) ChainGetTipSet(p0 context.Context, p1 chain.TipSetKey) (*chain.TipSet, error) { + return s.Internal.ChainGetTipSet(p0, p1) +} + +func (s *IChainInfoStruct) ChainGetTipSetAfterHeight(p0 context.Context, p1 abi.ChainEpoch, p2 chain.TipSetKey) (*chain.TipSet, error) { + return s.Internal.ChainGetTipSetAfterHeight(p0, p1, p2) +} + +func (s *IChainInfoStruct) ChainGetTipSetByHeight(p0 context.Context, p1 abi.ChainEpoch, p2 chain.TipSetKey) (*chain.TipSet, error) { + return s.Internal.ChainGetTipSetByHeight(p0, p1, p2) +} + +func (s *IChainInfoStruct) ChainHead(p0 context.Context) (*chain.TipSet, error) { + return s.Internal.ChainHead(p0) +} + +func (s *IChainInfoStruct) ChainList(p0 context.Context, p1 chain.TipSetKey, p2 int) ([]chain.TipSetKey, error) { + return s.Internal.ChainList(p0, p1, p2) +} + +func (s *IChainInfoStruct) ChainNotify(p0 context.Context) (<-chan []*chain2.HeadChange, error) { + return s.Internal.ChainNotify(p0) +} + +func (s *IChainInfoStruct) ChainSetHead(p0 context.Context, p1 chain.TipSetKey) error { + return s.Internal.ChainSetHead(p0, p1) +} + +func (s *IChainInfoStruct) GetActor(p0 context.Context, p1 address.Address) (*chain.Actor, error) { + return s.Internal.GetActor(p0, p1) +} + +func (s *IChainInfoStruct) GetEntry(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*chain.BeaconEntry, error) { + return s.Internal.GetEntry(p0, p1, p2) +} + +func (s *IChainInfoStruct) GetFullBlock(p0 context.Context, p1 cid.Cid) (*chain.FullBlock, error) { + return s.Internal.GetFullBlock(p0, p1) +} + +func (s *IChainInfoStruct) GetParentStateRootActor(p0 context.Context, p1 *chain.TipSet, p2 address.Address) (*chain.Actor, error) { + return s.Internal.GetParentStateRootActor(p0, p1, p2) +} + +func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*chain2.ChainMessage, error) { + return s.Internal.MessageWait(p0, p1, p2, p3) +} + +func (s *IChainInfoStruct) ProtocolParameters(p0 context.Context) (*chain2.ProtocolParams, error) { + return s.Internal.ProtocolParameters(p0) +} + +func (s *IChainInfoStruct) ResolveToKeyAddr(p0 context.Context, p1 address.Address, p2 *chain.TipSet) (address.Address, error) { + return s.Internal.ResolveToKeyAddr(p0, p1, p2) +} + +func (s *IChainInfoStruct) StateGetRandomnessFromBeacon(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 chain.TipSetKey) (abi.Randomness, error) { + return s.Internal.StateGetRandomnessFromBeacon(p0, p1, p2, p3, p4) +} + +func (s *IChainInfoStruct) StateGetRandomnessFromTickets(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 chain.TipSetKey) (abi.Randomness, error) { + return s.Internal.StateGetRandomnessFromTickets(p0, p1, p2, p3, p4) +} + +func (s *IChainInfoStruct) StateNetworkName(p0 context.Context) (chain2.NetworkName, error) { + return s.Internal.StateNetworkName(p0) +} + +func (s *IChainInfoStruct) StateNetworkVersion(p0 context.Context, p1 chain.TipSetKey) (network.Version, error) { + return s.Internal.StateNetworkVersion(p0, p1) +} + +func (s *IChainInfoStruct) StateSearchMsg(p0 context.Context, p1 chain.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*chain2.MsgLookup, error) { + return s.Internal.StateSearchMsg(p0, p1, p2, p3, p4) +} + +func (s *IChainInfoStruct) StateVerifiedRegistryRootKey(p0 context.Context, p1 chain.TipSetKey) (address.Address, error) { + return s.Internal.StateVerifiedRegistryRootKey(p0, p1) +} + +func (s *IChainInfoStruct) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*abi.StoragePower, error) { + return s.Internal.StateVerifierStatus(p0, p1, p2) +} + +func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*chain2.MsgLookup, error) { + return s.Internal.StateWaitMsg(p0, p1, p2, p3, p4) +} + +func (s *IChainInfoStruct) VerifyEntry(p0 *chain.BeaconEntry, p1 *chain.BeaconEntry, p2 abi.ChainEpoch) bool { + return s.Internal.VerifyEntry(p0, p1, p2) +} + +type IJwtAuthAPIStruct struct { + Internal struct { + AuthNew func(p0 context.Context, p1 []auth.Permission) ([]byte, error) `perm:"read"` + + Verify func(p0 context.Context, p1 string, p2 string) ([]auth.Permission, error) `perm:"read"` + } +} + +func (s *IJwtAuthAPIStruct) AuthNew(p0 context.Context, p1 []auth.Permission) ([]byte, error) { + return s.Internal.AuthNew(p0, p1) +} + +func (s *IJwtAuthAPIStruct) Verify(p0 context.Context, p1 string, p2 string) ([]auth.Permission, error) { + return s.Internal.Verify(p0, p1, p2) +} + +type IMarketStruct struct { + Internal struct { + StateMarketParticipants func(p0 context.Context, p1 chain.TipSetKey) (map[string]chain2.MarketBalance, error) `perm:"read"` + } +} + +func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 chain.TipSetKey) (map[string]chain2.MarketBalance, error) { + return s.Internal.StateMarketParticipants(p0, p1) +} + +type IMessagePoolStruct struct { + Internal struct { + GasBatchEstimateMessageGas func(p0 context.Context, p1 []*chain2.EstimateMessage, p2 uint64, p3 chain.TipSetKey) ([]*chain2.EstimateResult, error) `perm:"read"` + + GasEstimateFeeCap func(p0 context.Context, p1 *chain.Message, p2 int64, p3 chain.TipSetKey) (big.Int, error) `perm:"read"` + + GasEstimateGasLimit func(p0 context.Context, p1 *chain.Message, p2 chain.TipSetKey) (int64, error) `perm:"read"` + + GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 chain.TipSetKey) (big.Int, error) `perm:"read"` + + GasEstimateMessageGas func(p0 context.Context, p1 *chain.Message, p2 *chain2.MessageSendSpec, p3 chain.TipSetKey) (*chain.Message, error) `perm:"read"` + + MpoolBatchPush func(p0 context.Context, p1 []*chain.SignedMessage) ([]cid.Cid, error) `perm:"write"` + + MpoolBatchPushMessage func(p0 context.Context, p1 []*chain.Message, p2 *chain2.MessageSendSpec) ([]*chain.SignedMessage, error) `perm:"sign"` + + MpoolBatchPushUntrusted func(p0 context.Context, p1 []*chain.SignedMessage) ([]cid.Cid, error) `perm:"write"` + + MpoolCheckMessages func(p0 context.Context, p1 []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) `perm:"read"` + + MpoolCheckPendingMessages func(p0 context.Context, p1 address.Address) ([][]messagepool.MessageCheckStatus, error) `perm:"read"` + + MpoolCheckReplaceMessages func(p0 context.Context, p1 []*chain.Message) ([][]messagepool.MessageCheckStatus, error) `perm:"read"` + + MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` + + MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` + + MpoolGetConfig func(p0 context.Context) (*messagepool.MpoolConfig, error) `perm:"read"` + + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` + + MpoolPending func(p0 context.Context, p1 chain.TipSetKey) ([]*chain.SignedMessage, error) `perm:"read"` + + MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"write"` + + MpoolPublishMessage func(p0 context.Context, p1 *chain.SignedMessage) error `perm:"write"` + + MpoolPush func(p0 context.Context, p1 *chain.SignedMessage) (cid.Cid, error) `perm:"write"` + + MpoolPushMessage func(p0 context.Context, p1 *chain.Message, p2 *chain2.MessageSendSpec) (*chain.SignedMessage, error) `perm:"sign"` + + MpoolPushUntrusted func(p0 context.Context, p1 *chain.SignedMessage) (cid.Cid, error) `perm:"write"` + + MpoolSelect func(p0 context.Context, p1 chain.TipSetKey, p2 float64) ([]*chain.SignedMessage, error) `perm:"read"` + + MpoolSelects func(p0 context.Context, p1 chain.TipSetKey, p2 []float64) ([][]*chain.SignedMessage, error) `perm:"read"` + + MpoolSetConfig func(p0 context.Context, p1 *messagepool.MpoolConfig) error `perm:"admin"` + + MpoolSub func(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) `perm:"read"` + } +} + +func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*chain2.EstimateMessage, p2 uint64, p3 chain.TipSetKey) ([]*chain2.EstimateResult, error) { + return s.Internal.GasBatchEstimateMessageGas(p0, p1, p2, p3) +} + +func (s *IMessagePoolStruct) GasEstimateFeeCap(p0 context.Context, p1 *chain.Message, p2 int64, p3 chain.TipSetKey) (big.Int, error) { + return s.Internal.GasEstimateFeeCap(p0, p1, p2, p3) +} + +func (s *IMessagePoolStruct) GasEstimateGasLimit(p0 context.Context, p1 *chain.Message, p2 chain.TipSetKey) (int64, error) { + return s.Internal.GasEstimateGasLimit(p0, p1, p2) +} + +func (s *IMessagePoolStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 chain.TipSetKey) (big.Int, error) { + return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) +} + +func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *chain.Message, p2 *chain2.MessageSendSpec, p3 chain.TipSetKey) (*chain.Message, error) { + return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) +} + +func (s *IMessagePoolStruct) MpoolBatchPush(p0 context.Context, p1 []*chain.SignedMessage) ([]cid.Cid, error) { + return s.Internal.MpoolBatchPush(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*chain.Message, p2 *chain2.MessageSendSpec) ([]*chain.SignedMessage, error) { + return s.Internal.MpoolBatchPushMessage(p0, p1, p2) +} + +func (s *IMessagePoolStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*chain.SignedMessage) ([]cid.Cid, error) { + return s.Internal.MpoolBatchPushUntrusted(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolCheckMessages(p0 context.Context, p1 []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) { + return s.Internal.MpoolCheckMessages(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolCheckPendingMessages(p0 context.Context, p1 address.Address) ([][]messagepool.MessageCheckStatus, error) { + return s.Internal.MpoolCheckPendingMessages(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolCheckReplaceMessages(p0 context.Context, p1 []*chain.Message) ([][]messagepool.MessageCheckStatus, error) { + return s.Internal.MpoolCheckReplaceMessages(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolClear(p0 context.Context, p1 bool) error { + return s.Internal.MpoolClear(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolDeleteByAdress(p0 context.Context, p1 address.Address) error { + return s.Internal.MpoolDeleteByAdress(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolGetConfig(p0 context.Context) (*messagepool.MpoolConfig, error) { + return s.Internal.MpoolGetConfig(p0) +} + +func (s *IMessagePoolStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + return s.Internal.MpoolGetNonce(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolPending(p0 context.Context, p1 chain.TipSetKey) ([]*chain.SignedMessage, error) { + return s.Internal.MpoolPending(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolPublishByAddr(p0 context.Context, p1 address.Address) error { + return s.Internal.MpoolPublishByAddr(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolPublishMessage(p0 context.Context, p1 *chain.SignedMessage) error { + return s.Internal.MpoolPublishMessage(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolPush(p0 context.Context, p1 *chain.SignedMessage) (cid.Cid, error) { + return s.Internal.MpoolPush(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *chain.Message, p2 *chain2.MessageSendSpec) (*chain.SignedMessage, error) { + return s.Internal.MpoolPushMessage(p0, p1, p2) +} + +func (s *IMessagePoolStruct) MpoolPushUntrusted(p0 context.Context, p1 *chain.SignedMessage) (cid.Cid, error) { + return s.Internal.MpoolPushUntrusted(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolSelect(p0 context.Context, p1 chain.TipSetKey, p2 float64) ([]*chain.SignedMessage, error) { + return s.Internal.MpoolSelect(p0, p1, p2) +} + +func (s *IMessagePoolStruct) MpoolSelects(p0 context.Context, p1 chain.TipSetKey, p2 []float64) ([][]*chain.SignedMessage, error) { + return s.Internal.MpoolSelects(p0, p1, p2) +} + +func (s *IMessagePoolStruct) MpoolSetConfig(p0 context.Context, p1 *messagepool.MpoolConfig) error { + return s.Internal.MpoolSetConfig(p0, p1) +} + +func (s *IMessagePoolStruct) MpoolSub(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) { + return s.Internal.MpoolSub(p0) +} + +type IMinerStateStruct struct { + Internal struct { + StateCirculatingSupply func(p0 context.Context, p1 chain.TipSetKey) (abi.TokenAmount, error) `perm:"read"` + + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 chain.TipSetKey) (chain2.DealCollateralBounds, error) `perm:"read"` + + StateListActors func(p0 context.Context, p1 chain.TipSetKey) ([]address.Address, error) `perm:"read"` + + StateListMiners func(p0 context.Context, p1 chain.TipSetKey) ([]address.Address, error) `perm:"read"` + + StateLookupID func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) `perm:"read"` + + StateMarketBalance func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (chain2.MarketBalance, error) `perm:"read"` + + StateMarketDeals func(p0 context.Context, p1 chain.TipSetKey) (map[string]chain2.MarketDeal, error) `perm:"read"` + + StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 chain.TipSetKey) (*chain2.MarketDeal, error) `perm:"read"` + + StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + + StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (big.Int, error) `perm:"read"` + + StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) ([]chain2.Deadline, error) `perm:"read"` + + StateMinerFaults func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (bitfield.BitField, error) `perm:"read"` + + StateMinerInfo func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (miner.MinerInfo, error) `perm:"read"` + + StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 chain.TipSetKey) (big.Int, error) `perm:"read"` + + StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 chain.TipSetKey) ([]chain2.Partition, error) `perm:"read"` + + StateMinerPower func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*chain2.MinerPower, error) `perm:"read"` + + StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 chain.TipSetKey) (big.Int, error) `perm:"read"` + + StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*dline.Info, error) `perm:"read"` + + StateMinerRecoveries func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (bitfield.BitField, error) `perm:"read"` + + StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (bool, error) `perm:"read"` + + StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (chain2.MinerSectors, error) `perm:"read"` + + StateMinerSectorSize func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (abi.SectorSize, error) `perm:"read"` + + StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + + StateMinerWorkerAddress func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) `perm:"read"` + + StateSectorExpiration func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorExpiration, error) `perm:"read"` + + StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` + + StateSectorPartition func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` + + StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` + + StateVMCirculatingSupplyInternal func(p0 context.Context, p1 chain.TipSetKey) (chain.CirculatingSupply, error) `perm:"read"` + + StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*abi.StoragePower, error) `perm:"read"` + } +} + +func (s *IMinerStateStruct) StateCirculatingSupply(p0 context.Context, p1 chain.TipSetKey) (abi.TokenAmount, error) { + return s.Internal.StateCirculatingSupply(p0, p1) +} + +func (s *IMinerStateStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 chain.TipSetKey) (chain2.DealCollateralBounds, error) { + return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateListActors(p0 context.Context, p1 chain.TipSetKey) ([]address.Address, error) { + return s.Internal.StateListActors(p0, p1) +} + +func (s *IMinerStateStruct) StateListMiners(p0 context.Context, p1 chain.TipSetKey) ([]address.Address, error) { + return s.Internal.StateListMiners(p0, p1) +} + +func (s *IMinerStateStruct) StateLookupID(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) { + return s.Internal.StateLookupID(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (chain2.MarketBalance, error) { + return s.Internal.StateMarketBalance(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 chain.TipSetKey) (map[string]chain2.MarketDeal, error) { + return s.Internal.StateMarketDeals(p0, p1) +} + +func (s *IMinerStateStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 chain.TipSetKey) (*chain2.MarketDeal, error) { + return s.Internal.StateMarketStorageDeal(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerActiveSectors(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) { + return s.Internal.StateMinerActiveSectors(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerAvailableBalance(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (big.Int, error) { + return s.Internal.StateMinerAvailableBalance(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) ([]chain2.Deadline, error) { + return s.Internal.StateMinerDeadlines(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerFaults(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (bitfield.BitField, error) { + return s.Internal.StateMinerFaults(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerInfo(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (miner.MinerInfo, error) { + return s.Internal.StateMinerInfo(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 chain.TipSetKey) (big.Int, error) { + return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 chain.TipSetKey) ([]chain2.Partition, error) { + return s.Internal.StateMinerPartitions(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*chain2.MinerPower, error) { + return s.Internal.StateMinerPower(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerPreCommitDepositForPower(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 chain.TipSetKey) (big.Int, error) { + return s.Internal.StateMinerPreCommitDepositForPower(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateMinerProvingDeadline(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*dline.Info, error) { + return s.Internal.StateMinerProvingDeadline(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerRecoveries(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (bitfield.BitField, error) { + return s.Internal.StateMinerRecoveries(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerSectorAllocated(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (bool, error) { + return s.Internal.StateMinerSectorAllocated(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (chain2.MinerSectors, error) { + return s.Internal.StateMinerSectorCount(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerSectorSize(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (abi.SectorSize, error) { + return s.Internal.StateMinerSectorSize(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateMinerSectors(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) { + return s.Internal.StateMinerSectors(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateMinerWorkerAddress(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) { + return s.Internal.StateMinerWorkerAddress(p0, p1, p2) +} + +func (s *IMinerStateStruct) StateSectorExpiration(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorExpiration, error) { + return s.Internal.StateSectorExpiration(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateSectorGetInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorOnChainInfo, error) { + return s.Internal.StateSectorGetInfo(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateSectorPartition(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorLocation, error) { + return s.Internal.StateSectorPartition(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateSectorPreCommitInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { + return s.Internal.StateSectorPreCommitInfo(p0, p1, p2, p3) +} + +func (s *IMinerStateStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 chain.TipSetKey) (chain.CirculatingSupply, error) { + return s.Internal.StateVMCirculatingSupplyInternal(p0, p1) +} + +func (s *IMinerStateStruct) StateVerifiedClientStatus(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*abi.StoragePower, error) { + return s.Internal.StateVerifiedClientStatus(p0, p1, p2) +} + +type IMiningStruct struct { + Internal struct { + MinerCreateBlock func(p0 context.Context, p1 *chain2.BlockTemplate) (*chain.BlockMsg, error) `perm:"write"` + + MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 chain.TipSetKey) (*chain2.MiningBaseInfo, error) `perm:"read"` + } +} + +func (s *IMiningStruct) MinerCreateBlock(p0 context.Context, p1 *chain2.BlockTemplate) (*chain.BlockMsg, error) { + return s.Internal.MinerCreateBlock(p0, p1) +} + +func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 chain.TipSetKey) (*chain2.MiningBaseInfo, error) { + return s.Internal.MinerGetBaseInfo(p0, p1, p2, p3) +} + +type IMultiSigStruct struct { + Internal struct { + MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` + + MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` + + MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` + + MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + + MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 chain.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` + + MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 chain.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` + + MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 chain.BigInt, p5 address.Address, p6 chain.BigInt) (*messagepool.MessagePrototype, error) `perm:"sign"` + + MsigGetVested func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey, p3 chain.TipSetKey) (chain.BigInt, error) `perm:"read"` + + MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 chain.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` + + MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` + + MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + + MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + + MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + } +} + +func (s *IMultiSigStruct) MsigAddApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigAddApprove(p0, p1, p2, p3, p4, p5, p6) +} + +func (s *IMultiSigStruct) MsigAddCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigAddCancel(p0, p1, p2, p3, p4, p5) +} + +func (s *IMultiSigStruct) MsigAddPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigAddPropose(p0, p1, p2, p3, p4) +} + +func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigApprove(p0, p1, p2, p3) +} + +func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 chain.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3, p4, p5, p6, p7, p8) +} + +func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 chain.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigCancel(p0, p1, p2, p3, p4, p5, p6, p7) +} + +func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 chain.BigInt, p5 address.Address, p6 chain.BigInt) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigCreate(p0, p1, p2, p3, p4, p5, p6) +} + +func (s *IMultiSigStruct) MsigGetVested(p0 context.Context, p1 address.Address, p2 chain.TipSetKey, p3 chain.TipSetKey) (chain.BigInt, error) { + return s.Internal.MsigGetVested(p0, p1, p2, p3) +} + +func (s *IMultiSigStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 chain.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigPropose(p0, p1, p2, p3, p4, p5, p6) +} + +func (s *IMultiSigStruct) MsigRemoveSigner(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigRemoveSigner(p0, p1, p2, p3, p4) +} + +func (s *IMultiSigStruct) MsigSwapApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigSwapApprove(p0, p1, p2, p3, p4, p5, p6) +} + +func (s *IMultiSigStruct) MsigSwapCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigSwapCancel(p0, p1, p2, p3, p4, p5) +} + +func (s *IMultiSigStruct) MsigSwapPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigSwapPropose(p0, p1, p2, p3, p4) +} + +type INetworkStruct struct { + Internal struct { + NetAddrsListen func(p0 context.Context) (peer.AddrInfo, error) `perm:"read"` + + NetworkConnect func(p0 context.Context, p1 []string) (<-chan net.ConnectionResult, error) `perm:"read"` + + NetworkFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` + + NetworkFindProvidersAsync func(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo `perm:"read"` + + NetworkGetBandwidthStats func(p0 context.Context) metrics.Stats `perm:"admin"` + + NetworkGetClosestPeers func(p0 context.Context, p1 string) (<-chan peer.ID, error) `perm:"read"` + + NetworkGetPeerAddresses func(p0 context.Context) []ma.Multiaddr `perm:"admin"` + + NetworkGetPeerID func(p0 context.Context) peer.ID `perm:"admin"` + + NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*net.SwarmConnInfos, error) `perm:"read"` + + Version func(p0 context.Context) (chain2.Version, error) `perm:"read"` + } +} + +func (s *INetworkStruct) NetAddrsListen(p0 context.Context) (peer.AddrInfo, error) { + return s.Internal.NetAddrsListen(p0) +} + +func (s *INetworkStruct) NetworkConnect(p0 context.Context, p1 []string) (<-chan net.ConnectionResult, error) { + return s.Internal.NetworkConnect(p0, p1) +} + +func (s *INetworkStruct) NetworkFindPeer(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) { + return s.Internal.NetworkFindPeer(p0, p1) +} + +func (s *INetworkStruct) NetworkFindProvidersAsync(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo { + return s.Internal.NetworkFindProvidersAsync(p0, p1, p2) +} + +func (s *INetworkStruct) NetworkGetBandwidthStats(p0 context.Context) metrics.Stats { + return s.Internal.NetworkGetBandwidthStats(p0) +} + +func (s *INetworkStruct) NetworkGetClosestPeers(p0 context.Context, p1 string) (<-chan peer.ID, error) { + return s.Internal.NetworkGetClosestPeers(p0, p1) +} + +func (s *INetworkStruct) NetworkGetPeerAddresses(p0 context.Context) []ma.Multiaddr { + return s.Internal.NetworkGetPeerAddresses(p0) +} + +func (s *INetworkStruct) NetworkGetPeerID(p0 context.Context) peer.ID { + return s.Internal.NetworkGetPeerID(p0) +} + +func (s *INetworkStruct) NetworkPeers(p0 context.Context, p1 bool, p2 bool, p3 bool) (*net.SwarmConnInfos, error) { + return s.Internal.NetworkPeers(p0, p1, p2, p3) +} + +func (s *INetworkStruct) Version(p0 context.Context) (chain2.Version, error) { + return s.Internal.Version(p0) +} + +type IPaychanStruct struct { + Internal struct { + PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` + + PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*chain2.ChannelAvailableFunds, error) `perm:"sign"` + + PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*chain2.ChannelAvailableFunds, error) `perm:"sign"` + + PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + + PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paych.ChannelInfo, error) `perm:"sign"` + + PaychGetWaitsigny func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` + + PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` + + PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []paych.VoucherSpec) (*paych.PaymentInfo, error) `perm:"sign"` + + PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + + PaychStatus func(p0 context.Context, p1 address.Address) (*paych.Status, error) `perm:"read"` + + PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"sign"` + + PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` + + PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` + + PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paych.VoucherCreateResult, error) `perm:"sign"` + + PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` + + PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` + } +} + +func (s *IPaychanStruct) PaychAllocateLane(p0 context.Context, p1 address.Address) (uint64, error) { + return s.Internal.PaychAllocateLane(p0, p1) +} + +func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*chain2.ChannelAvailableFunds, error) { + return s.Internal.PaychAvailableFunds(p0, p1) +} + +func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*chain2.ChannelAvailableFunds, error) { + return s.Internal.PaychAvailableFundsByFromTo(p0, p1, p2) +} + +func (s *IPaychanStruct) PaychCollect(p0 context.Context, p1 address.Address) (cid.Cid, error) { + return s.Internal.PaychCollect(p0, p1) +} + +func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paych.ChannelInfo, error) { + return s.Internal.PaychGet(p0, p1, p2, p3) +} + +func (s *IPaychanStruct) PaychGetWaitsigny(p0 context.Context, p1 cid.Cid) (address.Address, error) { + return s.Internal.PaychGetWaitsigny(p0, p1) +} + +func (s *IPaychanStruct) PaychList(p0 context.Context) ([]address.Address, error) { + return s.Internal.PaychList(p0) +} + +func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []paych.VoucherSpec) (*paych.PaymentInfo, error) { + return s.Internal.PaychNewPayment(p0, p1, p2, p3) +} + +func (s *IPaychanStruct) PaychSettle(p0 context.Context, p1 address.Address) (cid.Cid, error) { + return s.Internal.PaychSettle(p0, p1) +} + +func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*paych.Status, error) { + return s.Internal.PaychStatus(p0, p1) +} + +func (s *IPaychanStruct) PaychVoucherAdd(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) { + return s.Internal.PaychVoucherAdd(p0, p1, p2, p3, p4) +} + +func (s *IPaychanStruct) PaychVoucherCheckSpendable(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) { + return s.Internal.PaychVoucherCheckSpendable(p0, p1, p2, p3, p4) +} + +func (s *IPaychanStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error { + return s.Internal.PaychVoucherCheckValid(p0, p1, p2) +} + +func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paych.VoucherCreateResult, error) { + return s.Internal.PaychVoucherCreate(p0, p1, p2, p3) +} + +func (s *IPaychanStruct) PaychVoucherList(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) { + return s.Internal.PaychVoucherList(p0, p1) +} + +func (s *IPaychanStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) { + return s.Internal.PaychVoucherSubmit(p0, p1, p2, p3, p4) +} + +type ISyncerStruct struct { + Internal struct { + ChainSyncHandleNewTipSet func(p0 context.Context, p1 *chain.ChainInfo) error `perm:"write"` + + ChainTipSetWeight func(p0 context.Context, p1 chain.TipSetKey) (big.Int, error) `perm:"read"` + + Concurrent func(p0 context.Context) int64 `perm:"read"` + + SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` + + StateCall func(p0 context.Context, p1 *chain.Message, p2 chain.TipSetKey) (*chain2.InvocResult, error) `perm:"read"` + + SyncState func(p0 context.Context) (*chain2.SyncState, error) `perm:"read"` + + SyncSubmitBlock func(p0 context.Context, p1 *chain.BlockMsg) error `perm:"write"` + } +} + +func (s *ISyncerStruct) ChainSyncHandleNewTipSet(p0 context.Context, p1 *chain.ChainInfo) error { + return s.Internal.ChainSyncHandleNewTipSet(p0, p1) +} + +func (s *ISyncerStruct) ChainTipSetWeight(p0 context.Context, p1 chain.TipSetKey) (big.Int, error) { + return s.Internal.ChainTipSetWeight(p0, p1) +} + +func (s *ISyncerStruct) Concurrent(p0 context.Context) int64 { + return s.Internal.Concurrent(p0) +} + +func (s *ISyncerStruct) SetConcurrent(p0 context.Context, p1 int64) error { + return s.Internal.SetConcurrent(p0, p1) +} + +func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *chain.Message, p2 chain.TipSetKey) (*chain2.InvocResult, error) { + return s.Internal.StateCall(p0, p1, p2) +} + +func (s *ISyncerStruct) SyncState(p0 context.Context) (*chain2.SyncState, error) { + return s.Internal.SyncState(p0) +} + +func (s *ISyncerStruct) SyncSubmitBlock(p0 context.Context, p1 *chain.BlockMsg) error { + return s.Internal.SyncSubmitBlock(p0, p1) +} + +type IWalletStruct struct { + Internal struct { + HasPassword func(p0 context.Context) bool `perm:"admin"` + + LockWallet func(p0 context.Context) error `perm:"admin"` + + SetPassword func(p0 context.Context, p1 []byte) error `perm:"admin"` + + UnLockWallet func(p0 context.Context, p1 []byte) error `perm:"admin"` + + WalletAddresses func(p0 context.Context) []address.Address `perm:"admin"` + + WalletBalance func(p0 context.Context, p1 address.Address) (abi.TokenAmount, error) `perm:"read"` + + WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"` + + WalletExport func(p0 address.Address, p1 string) (*wallet.KeyInfo, error) `perm:"admin"` + + WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` + + WalletImport func(p0 *wallet.KeyInfo) (address.Address, error) `perm:"admin"` + + WalletNewAddress func(p0 address.Protocol) (address.Address, error) `perm:"write"` + + WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"admin"` + + WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) `perm:"sign"` + + WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *chain.Message) (*chain.SignedMessage, error) `perm:"sign"` + + WalletState func(p0 context.Context) int `perm:"admin"` + } +} + +func (s *IWalletStruct) HasPassword(p0 context.Context) bool { + return s.Internal.HasPassword(p0) +} + +func (s *IWalletStruct) LockWallet(p0 context.Context) error { + return s.Internal.LockWallet(p0) +} + +func (s *IWalletStruct) SetPassword(p0 context.Context, p1 []byte) error { + return s.Internal.SetPassword(p0, p1) +} + +func (s *IWalletStruct) UnLockWallet(p0 context.Context, p1 []byte) error { + return s.Internal.UnLockWallet(p0, p1) +} + +func (s *IWalletStruct) WalletAddresses(p0 context.Context) []address.Address { + return s.Internal.WalletAddresses(p0) +} + +func (s *IWalletStruct) WalletBalance(p0 context.Context, p1 address.Address) (abi.TokenAmount, error) { + return s.Internal.WalletBalance(p0, p1) +} + +func (s *IWalletStruct) WalletDefaultAddress(p0 context.Context) (address.Address, error) { + return s.Internal.WalletDefaultAddress(p0) +} + +func (s *IWalletStruct) WalletExport(p0 address.Address, p1 string) (*wallet.KeyInfo, error) { + return s.Internal.WalletExport(p0, p1) +} + +func (s *IWalletStruct) WalletHas(p0 context.Context, p1 address.Address) (bool, error) { + return s.Internal.WalletHas(p0, p1) +} + +func (s *IWalletStruct) WalletImport(p0 *wallet.KeyInfo) (address.Address, error) { + return s.Internal.WalletImport(p0) +} + +func (s *IWalletStruct) WalletNewAddress(p0 address.Protocol) (address.Address, error) { + return s.Internal.WalletNewAddress(p0) +} + +func (s *IWalletStruct) WalletSetDefault(p0 context.Context, p1 address.Address) error { + return s.Internal.WalletSetDefault(p0, p1) +} + +func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) { + return s.Internal.WalletSign(p0, p1, p2, p3) +} + +func (s *IWalletStruct) WalletSignMessage(p0 context.Context, p1 address.Address, p2 *chain.Message) (*chain.SignedMessage, error) { + return s.Internal.WalletSignMessage(p0, p1, p2) +} + +func (s *IWalletStruct) WalletState(p0 context.Context) int { + return s.Internal.WalletState(p0) +} diff --git a/venus-shared/api/client/client.go b/venus-shared/api/client/client.go new file mode 100644 index 0000000000..922013238f --- /dev/null +++ b/venus-shared/api/client/client.go @@ -0,0 +1,30 @@ +package client + +import ( + "context" + "github.com/filecoin-project/go-jsonrpc" + v0 "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + v1 "github.com/filecoin-project/venus/venus-shared/api/chain/v1" + + "net/http" +) + +func NewFullRPCV0(ctx context.Context, addr string, header http.Header) (v0.FullNode, jsonrpc.ClientCloser, error) { + var full v0.FullNodeStruct + closer, err := jsonrpc.NewClient(ctx, addr, "Filecoin", &full, + header) + return &full, closer, err +} + +func NewFullRPCV1(ctx context.Context, addr string, header http.Header) (v1.FullNode, jsonrpc.ClientCloser, error) { + var full v1.FullNodeStruct + closer, err := jsonrpc.NewClient(ctx, addr, "Filecoin", &full, + header) + return &full, closer, err +} + +func NewWalletRPC(ctx context.Context, addr string, header http.Header) (v1.IWallet, jsonrpc.ClientCloser, error) { + var wallet v1.IWalletStruct + closer, err := jsonrpc.NewClient(ctx, addr, "Filecoin", &wallet, header) + return &wallet, closer, err +} diff --git a/venus-shared/api/version.go b/venus-shared/api/version.go index 6dd7a44ba1..b80a222e21 100644 --- a/venus-shared/api/version.go +++ b/venus-shared/api/version.go @@ -1,7 +1,72 @@ package api +import ( + "fmt" + "golang.org/x/xerrors" +) + type Version uint32 func NewVer(major, minor, patch uint8) Version { return Version(uint32(major)<<16 | uint32(minor)<<8 | uint32(patch)) } + +// Ints returns (major, minor, patch) versions +func (ve Version) Ints() (uint32, uint32, uint32) { + v := uint32(ve) + return (v & majorOnlyMask) >> 16, (v & minorOnlyMask) >> 8, v & patchOnlyMask +} + +func (ve Version) String() string { + vmj, vmi, vp := ve.Ints() + return fmt.Sprintf("%d.%d.%d", vmj, vmi, vp) +} + +func (ve Version) EqMajorMinor(v2 Version) bool { + return ve&minorMask == v2&minorMask +} + +type NodeType int + +const ( + NodeUnknown NodeType = iota + + NodeFull + NodeMiner + NodeWorker +) + +var RunningNodeType NodeType + +func VersionForType(nodeType NodeType) (Version, error) { + switch nodeType { + case NodeFull: + return FullAPIVersion1, nil + case NodeMiner: + return MinerAPIVersion0, nil + case NodeWorker: + return WorkerAPIVersion0, nil + default: + return Version(0), xerrors.Errorf("unknown node type %d", nodeType) + } +} + +// semver versions of the rpc api exposed +var ( + FullAPIVersion0 = NewVer(1, 4, 0) + FullAPIVersion1 = NewVer(2, 1, 0) + + MinerAPIVersion0 = NewVer(1, 2, 0) + WorkerAPIVersion0 = NewVer(1, 5, 0) +) + +//nolint:varcheck,deadcode +const ( + majorMask = 0xff0000 + minorMask = 0xffff00 + patchMask = 0xffffff + + majorOnlyMask = 0xff0000 + minorOnlyMask = 0x00ff00 + patchOnlyMask = 0x0000ff +) diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt index e69de29bb2..1b0ed0315f 100644 --- a/venus-shared/compatible-checks/api-diff.txt +++ b/venus-shared/compatible-checks/api-diff.txt @@ -0,0 +1,191 @@ +github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.com/filecoin-project/lotus/api.FullNode: + - AuthVerify + + BlockTime + - ChainBlockstoreInfo + - ChainCheckBlockstore + > ChainExport {[func(context.Context, abi.ChainEpoch, bool, chain.TipSetKey) (<-chan []uint8, error) <> func(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []uint8, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - ChainGetGenesis + > ChainGetMessagesInTipset {[func(context.Context, chain.TipSetKey) ([]chain.Message, error) <> func(context.Context, types.TipSetKey) ([]api.Message, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - ChainGetNode + > ChainGetPath {[func(context.Context, chain.TipSetKey, chain.TipSetKey) ([]*chain.HeadChange, error) <> func(context.Context, types.TipSetKey, types.TipSetKey) ([]*api.HeadChange, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + ChainGetRandomnessFromBeacon + + ChainGetRandomnessFromTickets + + ChainGetReceipts + > ChainGetTipSet {[func(context.Context, chain.TipSetKey) (*chain.TipSet, error) <> func(context.Context, types.TipSetKey) (*types.TipSet, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > ChainGetTipSetAfterHeight {[func(context.Context, abi.ChainEpoch, chain.TipSetKey) (*chain.TipSet, error) <> func(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > ChainGetTipSetByHeight {[func(context.Context, abi.ChainEpoch, chain.TipSetKey) (*chain.TipSet, error) <> func(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + ChainList + > ChainSetHead {[func(context.Context, chain.TipSetKey) error <> func(context.Context, types.TipSetKey) error] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + ChainSyncHandleNewTipSet + > ChainTipSetWeight {[func(context.Context, chain.TipSetKey) (big.Int, error) <> func(context.Context, types.TipSetKey) (big.Int, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - ClientCalcCommP + - ClientCancelDataTransfer + - ClientCancelRetrievalDeal + - ClientDataTransferUpdates + - ClientDealPieceCID + - ClientDealSize + - ClientFindData + - ClientGenCar + - ClientGetDealInfo + - ClientGetDealStatus + - ClientGetDealUpdates + - ClientGetRetrievalUpdates + - ClientHasLocal + - ClientImport + - ClientListDataTransfers + - ClientListDeals + - ClientListImports + - ClientListRetrievals + - ClientMinerQueryOffer + - ClientQueryAsk + - ClientRemoveImport + - ClientRestartDataTransfer + - ClientRetrieve + - ClientRetrieveTryRestartInsufficientFunds + - ClientRetrieveWithEvents + - ClientStartDeal + - ClientStatelessDeal + - Closing + + Concurrent + - CreateBackup + - Discover + + GasBatchEstimateMessageGas + > GasEstimateFeeCap {[func(context.Context, *chain.Message, int64, chain.TipSetKey) (big.Int, error) <> func(context.Context, *types.Message, int64, types.TipSetKey) (big.Int, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > GasEstimateGasLimit {[func(context.Context, *chain.Message, chain.TipSetKey) (int64, error) <> func(context.Context, *types.Message, types.TipSetKey) (int64, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > GasEstimateGasPremium {[func(context.Context, uint64, address.Address, int64, chain.TipSetKey) (big.Int, error) <> func(context.Context, uint64, address.Address, int64, types.TipSetKey) (big.Int, error)] base=func in type: #4 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > GasEstimateMessageGas {[func(context.Context, *chain.Message, *chain.MessageSendSpec, chain.TipSetKey) (*chain.Message, error) <> func(context.Context, *types.Message, *api.MessageSendSpec, types.TipSetKey) (*types.Message, error)] base=func in type: #2 input; nested={[*chain.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[chain.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[chain.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} + + GetActor + + GetEntry + + GetFullBlock + + GetParentStateRootActor + + HasPassword + - ID + + ListActor + + LockWallet + - LogAlerts + - LogList + - LogSetLevel + - MarketAddBalance + - MarketGetReserved + - MarketReleaseFunds + - MarketReserveFunds + - MarketWithdraw + + MessageWait + > MinerCreateBlock {[func(context.Context, *chain.BlockTemplate) (*chain.BlockMsg, error) <> func(context.Context, *api.BlockTemplate) (*types.BlockMsg, error)] base=func in type: #1 input; nested={[*chain.BlockTemplate <> *api.BlockTemplate] base=pointed type; nested={[chain.BlockTemplate <> api.BlockTemplate] base=struct field; nested={[chain.BlockTemplate <> api.BlockTemplate] base=exported field type: #1 field named Parents; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}}}}} + > MinerGetBaseInfo {[func(context.Context, address.Address, abi.ChainEpoch, chain.TipSetKey) (*chain.MiningBaseInfo, error) <> func(context.Context, address.Address, abi.ChainEpoch, types.TipSetKey) (*api.MiningBaseInfo, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > MpoolBatchPushMessage {[func(context.Context, []*chain.Message, *chain.MessageSendSpec) ([]*chain.SignedMessage, error) <> func(context.Context, []*types.Message, *api.MessageSendSpec) ([]*types.SignedMessage, error)] base=func in type: #2 input; nested={[*chain.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[chain.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[chain.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} + + MpoolDeleteByAdress + > MpoolPending {[func(context.Context, chain.TipSetKey) ([]*chain.SignedMessage, error) <> func(context.Context, types.TipSetKey) ([]*types.SignedMessage, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + MpoolPublishByAddr + + MpoolPublishMessage + > MpoolPushMessage {[func(context.Context, *chain.Message, *chain.MessageSendSpec) (*chain.SignedMessage, error) <> func(context.Context, *types.Message, *api.MessageSendSpec) (*types.SignedMessage, error)] base=func in type: #2 input; nested={[*chain.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[chain.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[chain.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} + > MpoolSelect {[func(context.Context, chain.TipSetKey, float64) ([]*chain.SignedMessage, error) <> func(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + MpoolSelects + - MsigGetAvailableBalance + - MsigGetPending + > MsigGetVested {[func(context.Context, address.Address, chain.TipSetKey, chain.TipSetKey) (big.Int, error) <> func(context.Context, address.Address, types.TipSetKey, types.TipSetKey) (big.Int, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - MsigGetVestingSchedule + - NetAgentVersion + - NetAutoNatStatus + - NetBandwidthStats + - NetBandwidthStatsByPeer + - NetBandwidthStatsByProtocol + - NetBlockAdd + - NetBlockList + - NetBlockRemove + - NetConnect + - NetConnectedness + - NetDisconnect + - NetFindPeer + - NetPeerInfo + - NetPeers + - NetPubsubScores + + NetworkConnect + + NetworkFindPeer + + NetworkFindProvidersAsync + + NetworkGetBandwidthStats + + NetworkGetClosestPeers + + NetworkGetPeerAddresses + + NetworkGetPeerID + + NetworkPeers + - NodeStatus + - PaychGetWaitReady + + PaychGetWaitsigny + + ProtocolParameters + + ResolveToKeyAddr + - Session + + SetConcurrent + + SetPassword + - Shutdown + > StateAccountKey {[func(context.Context, address.Address, chain.TipSetKey) (address.Address, error) <> func(context.Context, address.Address, types.TipSetKey) (address.Address, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateAllMinerFaults + > StateCall {[func(context.Context, *chain.Message, chain.TipSetKey) (*chain.InvocResult, error) <> func(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateChangedActors + > StateCirculatingSupply {[func(context.Context, chain.TipSetKey) (big.Int, error) <> func(context.Context, types.TipSetKey) (big.Int, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateCompute + > StateDealProviderCollateralBounds {[func(context.Context, abi.PaddedPieceSize, bool, chain.TipSetKey) (chain.DealCollateralBounds, error) <> func(context.Context, abi.PaddedPieceSize, bool, types.TipSetKey) (api.DealCollateralBounds, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateDecodeParams + - StateEncodeParams + > StateGetActor {[func(context.Context, address.Address, chain.TipSetKey) (*chain.Actor, error) <> func(context.Context, address.Address, types.TipSetKey) (*types.Actor, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateGetRandomnessFromBeacon {[func(context.Context, crypto.DomainSeparationTag, abi.ChainEpoch, []uint8, chain.TipSetKey) (abi.Randomness, error) <> func(context.Context, crypto.DomainSeparationTag, abi.ChainEpoch, []uint8, types.TipSetKey) (abi.Randomness, error)] base=func in type: #4 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateGetRandomnessFromTickets {[func(context.Context, crypto.DomainSeparationTag, abi.ChainEpoch, []uint8, chain.TipSetKey) (abi.Randomness, error) <> func(context.Context, crypto.DomainSeparationTag, abi.ChainEpoch, []uint8, types.TipSetKey) (abi.Randomness, error)] base=func in type: #4 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateListActors {[func(context.Context, chain.TipSetKey) ([]address.Address, error) <> func(context.Context, types.TipSetKey) ([]address.Address, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateListMessages + > StateListMiners {[func(context.Context, chain.TipSetKey) ([]address.Address, error) <> func(context.Context, types.TipSetKey) ([]address.Address, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateLookupID {[func(context.Context, address.Address, chain.TipSetKey) (address.Address, error) <> func(context.Context, address.Address, types.TipSetKey) (address.Address, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMarketBalance {[func(context.Context, address.Address, chain.TipSetKey) (chain.MarketBalance, error) <> func(context.Context, address.Address, types.TipSetKey) (api.MarketBalance, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMarketDeals {[func(context.Context, chain.TipSetKey) (map[string]chain.MarketDeal, error) <> func(context.Context, types.TipSetKey) (map[string]api.MarketDeal, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMarketParticipants {[func(context.Context, chain.TipSetKey) (map[string]chain.MarketBalance, error) <> func(context.Context, types.TipSetKey) (map[string]api.MarketBalance, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMarketStorageDeal {[func(context.Context, abi.DealID, chain.TipSetKey) (*chain.MarketDeal, error) <> func(context.Context, abi.DealID, types.TipSetKey) (*api.MarketDeal, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerActiveSectors {[func(context.Context, address.Address, chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) <> func(context.Context, address.Address, types.TipSetKey) ([]*miner.SectorOnChainInfo, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerAvailableBalance {[func(context.Context, address.Address, chain.TipSetKey) (big.Int, error) <> func(context.Context, address.Address, types.TipSetKey) (big.Int, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerDeadlines {[func(context.Context, address.Address, chain.TipSetKey) ([]chain.Deadline, error) <> func(context.Context, address.Address, types.TipSetKey) ([]api.Deadline, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerFaults {[func(context.Context, address.Address, chain.TipSetKey) (bitfield.BitField, error) <> func(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerInfo {[func(context.Context, address.Address, chain.TipSetKey) (miner.MinerInfo, error) <> func(context.Context, address.Address, types.TipSetKey) (miner.MinerInfo, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerInitialPledgeCollateral {[func(context.Context, address.Address, miner.SectorPreCommitInfo, chain.TipSetKey) (big.Int, error) <> func(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (big.Int, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerPartitions {[func(context.Context, address.Address, uint64, chain.TipSetKey) ([]chain.Partition, error) <> func(context.Context, address.Address, uint64, types.TipSetKey) ([]api.Partition, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerPower {[func(context.Context, address.Address, chain.TipSetKey) (*chain.MinerPower, error) <> func(context.Context, address.Address, types.TipSetKey) (*api.MinerPower, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerPreCommitDepositForPower {[func(context.Context, address.Address, miner.SectorPreCommitInfo, chain.TipSetKey) (big.Int, error) <> func(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (big.Int, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerProvingDeadline {[func(context.Context, address.Address, chain.TipSetKey) (*dline.Info, error) <> func(context.Context, address.Address, types.TipSetKey) (*dline.Info, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerRecoveries {[func(context.Context, address.Address, chain.TipSetKey) (bitfield.BitField, error) <> func(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerSectorAllocated {[func(context.Context, address.Address, abi.SectorNumber, chain.TipSetKey) (bool, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (bool, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerSectorCount {[func(context.Context, address.Address, chain.TipSetKey) (chain.MinerSectors, error) <> func(context.Context, address.Address, types.TipSetKey) (api.MinerSectors, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + StateMinerSectorSize + > StateMinerSectors {[func(context.Context, address.Address, *bitfield.BitField, chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) <> func(context.Context, address.Address, *bitfield.BitField, types.TipSetKey) ([]*miner.SectorOnChainInfo, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + StateMinerWorkerAddress + > StateNetworkVersion {[func(context.Context, chain.TipSetKey) (network.Version, error) <> func(context.Context, types.TipSetKey) (network.Version, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateReadState + - StateReplay + > StateSearchMsg {[func(context.Context, chain.TipSetKey, cid.Cid, abi.ChainEpoch, bool) (*chain.MsgLookup, error) <> func(context.Context, types.TipSetKey, cid.Cid, abi.ChainEpoch, bool) (*api.MsgLookup, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateSectorExpiration {[func(context.Context, address.Address, abi.SectorNumber, chain.TipSetKey) (*miner.SectorExpiration, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorExpiration, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateSectorGetInfo {[func(context.Context, address.Address, abi.SectorNumber, chain.TipSetKey) (*miner.SectorOnChainInfo, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorOnChainInfo, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateSectorPartition {[func(context.Context, address.Address, abi.SectorNumber, chain.TipSetKey) (*miner.SectorLocation, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorLocation, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateSectorPreCommitInfo {[func(context.Context, address.Address, abi.SectorNumber, chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateVMCirculatingSupplyInternal {[func(context.Context, chain.TipSetKey) (chain.CirculatingSupply, error) <> func(context.Context, types.TipSetKey) (api.CirculatingSupply, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateVerifiedClientStatus {[func(context.Context, address.Address, chain.TipSetKey) (*big.Int, error) <> func(context.Context, address.Address, types.TipSetKey) (*big.Int, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateVerifiedRegistryRootKey {[func(context.Context, chain.TipSetKey) (address.Address, error) <> func(context.Context, types.TipSetKey) (address.Address, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateVerifierStatus {[func(context.Context, address.Address, chain.TipSetKey) (*big.Int, error) <> func(context.Context, address.Address, types.TipSetKey) (*big.Int, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateWaitMsg {[func(context.Context, cid.Cid, uint64, abi.ChainEpoch, bool) (*chain.MsgLookup, error) <> func(context.Context, cid.Cid, uint64, abi.ChainEpoch, bool) (*api.MsgLookup, error)] base=func out type: #0 input; nested={[*chain.MsgLookup <> *api.MsgLookup] base=pointed type; nested={[chain.MsgLookup <> api.MsgLookup] base=struct field; nested={[chain.MsgLookup <> api.MsgLookup] base=exported field type: #3 field named TipSet; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}}}}} + - SyncCheckBad + - SyncCheckpoint + - SyncIncomingBlocks + - SyncMarkBad + - SyncUnmarkAllBad + - SyncUnmarkBad + - SyncValidateTipset + + UnLockWallet + + Verify + + VerifyEntry + > Version {[func(context.Context) (chain.Version, error) <> func(context.Context) (api.APIVersion, error)] base=func out type: #0 input; nested={[chain.Version <> api.APIVersion] base=struct field; nested={[chain.Version <> api.APIVersion] base=exported fields count: 2 != 3; nested=nil}}} + + WalletAddresses + - WalletDelete + > WalletExport {[func(address.Address, string) (*wallet.KeyInfo, error) <> func(context.Context, address.Address) (*types.KeyInfo, error)] base=func in type: #0 input; nested={[address.Address <> context.Context] base=type kinds: struct != interface; nested=nil}} + > WalletImport {[func(*wallet.KeyInfo) (address.Address, error) <> func(context.Context, *types.KeyInfo) (address.Address, error)] base=func in num: 1 != 2; nested=nil} + - WalletList + - WalletNew + + WalletNewAddress + > WalletSign {[func(context.Context, address.Address, []uint8, wallet.MsgMeta) (*crypto.Signature, error) <> func(context.Context, address.Address, []uint8) (*crypto.Signature, error)] base=func in num: 4 != 3; nested=nil} + + WalletState + - WalletValidateAddress + - WalletVerify + diff --git a/venus-shared/compatible-checks/api-permission.json b/venus-shared/compatible-checks/api-permission.json new file mode 100644 index 0000000000..d4be1294e7 --- /dev/null +++ b/venus-shared/compatible-checks/api-permission.json @@ -0,0 +1,515 @@ +{ + "V0": { + "Common": { + "AuthNew": "admin", + "BeaconGetEntry": "read", + "ChainDeleteObj": "admin", + "ChainExport": "read", + "ChainGetBlock": "read", + "ChainGetBlockMessages": "read", + "ChainGetMessage": "read", + "ChainGetMessagesInTipset": "read", + "ChainGetParentMessages": "read", + "ChainGetParentReceipts": "read", + "ChainGetPath": "read", + "ChainGetRandomnessFromBeacon": "read", + "ChainGetRandomnessFromTickets": "read", + "ChainGetTipSet": "read", + "ChainGetTipSetByHeight": "read", + "ChainHasObj": "read", + "ChainHead": "read", + "ChainNotify": "read", + "ChainReadObj": "read", + "ChainSetHead": "admin", + "ChainStatObj": "read", + "ChainTipSetWeight": "read", + "GasEstimateFeeCap": "read", + "GasEstimateGasLimit": "read", + "GasEstimateGasPremium": "read", + "GasEstimateMessageGas": "read", + "MinerCreateBlock": "write", + "MinerGetBaseInfo": "read", + "MpoolBatchPush": "write", + "MpoolBatchPushMessage": "sign", + "MpoolBatchPushUntrusted": "write", + "MpoolClear": "write", + "MpoolGetConfig": "read", + "MpoolGetNonce": "read", + "MpoolPending": "read", + "MpoolPush": "write", + "MpoolPushMessage": "sign", + "MpoolPushUntrusted": "write", + "MpoolSelect": "read", + "MpoolSetConfig": "admin", + "MpoolSub": "read", + "MsigAddApprove": "sign", + "MsigAddCancel": "sign", + "MsigAddPropose": "sign", + "MsigApprove": "sign", + "MsigApproveTxnHash": "sign", + "MsigCancel": "sign", + "MsigCreate": "sign", + "MsigGetVested": "read", + "MsigPropose": "sign", + "MsigRemoveSigner": "sign", + "MsigSwapApprove": "sign", + "MsigSwapCancel": "sign", + "MsigSwapPropose": "sign", + "NetAddrsListen": "read", + "PaychAllocateLane": "sign", + "PaychAvailableFunds": "sign", + "PaychAvailableFundsByFromTo": "sign", + "PaychCollect": "sign", + "PaychGet": "sign", + "PaychGetWaitReady": "sign", + "PaychList": "read", + "PaychNewPayment": "sign", + "PaychSettle": "sign", + "PaychStatus": "read", + "PaychVoucherAdd": "write", + "PaychVoucherCheckSpendable": "read", + "PaychVoucherCheckValid": "read", + "PaychVoucherCreate": "sign", + "PaychVoucherList": "write", + "PaychVoucherSubmit": "sign", + "StateAccountKey": "read", + "StateCall": "read", + "StateCirculatingSupply": "read", + "StateDealProviderCollateralBounds": "read", + "StateGetActor": "read", + "StateGetReceipt": "read", + "StateListActors": "read", + "StateListMiners": "read", + "StateLookupID": "read", + "StateMarketBalance": "read", + "StateMarketDeals": "read", + "StateMarketParticipants": "read", + "StateMarketStorageDeal": "read", + "StateMinerActiveSectors": "read", + "StateMinerAvailableBalance": "read", + "StateMinerDeadlines": "read", + "StateMinerFaults": "read", + "StateMinerInfo": "read", + "StateMinerInitialPledgeCollateral": "read", + "StateMinerPartitions": "read", + "StateMinerPower": "read", + "StateMinerPreCommitDepositForPower": "read", + "StateMinerProvingDeadline": "read", + "StateMinerRecoveries": "read", + "StateMinerSectorAllocated": "read", + "StateMinerSectorCount": "read", + "StateMinerSectors": "read", + "StateNetworkName": "read", + "StateNetworkVersion": "read", + "StateSearchMsg": "read", + "StateSearchMsgLimited": "read", + "StateSectorExpiration": "read", + "StateSectorGetInfo": "read", + "StateSectorPartition": "read", + "StateSectorPreCommitInfo": "read", + "StateVMCirculatingSupplyInternal": "read", + "StateVerifiedClientStatus": "read", + "StateVerifiedRegistryRootKey": "read", + "StateVerifierStatus": "read", + "StateWaitMsg": "read", + "StateWaitMsgLimited": "read", + "SyncState": "read", + "SyncSubmitBlock": "write", + "Version": "read", + "WalletBalance": "read", + "WalletDefaultAddress": "write", + "WalletExport": "admin", + "WalletHas": "write", + "WalletImport": "admin", + "WalletSetDefault": "write", + "WalletSign": "sign", + "WalletSignMessage": "sign" + }, + "Extend": { + "BlockTime": "read", + "ChainGetReceipts": "read", + "ChainList": "read", + "ChainSyncHandleNewTipSet": "write", + "Concurrent": "read", + "GasBatchEstimateMessageGas": "read", + "GetActor": "read", + "GetEntry": "read", + "GetFullBlock": "read", + "GetParentStateRootActor": "read", + "HasPassword": "admin", + "ListActor": "read", + "LockWallet": "admin", + "MessageWait": "read", + "MpoolDeleteByAdress": "admin", + "MpoolPublishByAddr": "admin", + "MpoolPublishMessage": "admin", + "MpoolSelects": "read", + "NetworkConnect": "read", + "NetworkFindPeer": "read", + "NetworkFindProvidersAsync": "read", + "NetworkGetBandwidthStats": "admin", + "NetworkGetClosestPeers": "read", + "NetworkGetPeerAddresses": "admin", + "NetworkGetPeerID": "admin", + "NetworkPeers": "read", + "ProtocolParameters": "read", + "ResolveToKeyAddr": "read", + "SetConcurrent": "admin", + "SetPassword": "admin", + "StateMinerSectorSize": "read", + "StateMinerWorkerAddress": "read", + "UnLockWallet": "admin", + "Verify": "read", + "VerifyEntry": "read", + "WalletAddresses": "admin", + "WalletNewAddress": "write", + "WalletState": "admin" + }, + "Loss": { + "AuthVerify": "read", + "ChainGetGenesis": "read", + "ChainGetNode": "read", + "ClientCalcCommP": "write", + "ClientCancelDataTransfer": "write", + "ClientCancelRetrievalDeal": "write", + "ClientDataTransferUpdates": "write", + "ClientDealPieceCID": "read", + "ClientDealSize": "read", + "ClientFindData": "read", + "ClientGenCar": "write", + "ClientGetDealInfo": "read", + "ClientGetDealStatus": "read", + "ClientGetDealUpdates": "write", + "ClientGetRetrievalUpdates": "write", + "ClientHasLocal": "write", + "ClientImport": "admin", + "ClientListDataTransfers": "write", + "ClientListDeals": "write", + "ClientListImports": "write", + "ClientListRetrievals": "write", + "ClientMinerQueryOffer": "read", + "ClientQueryAsk": "read", + "ClientRemoveImport": "admin", + "ClientRestartDataTransfer": "write", + "ClientRetrieve": "admin", + "ClientRetrieveTryRestartInsufficientFunds": "write", + "ClientRetrieveWithEvents": "admin", + "ClientStartDeal": "admin", + "ClientStatelessDeal": "write", + "Closing": "read", + "CreateBackup": "admin", + "Discover": "read", + "ID": "read", + "LogAlerts": "admin", + "LogList": "write", + "LogSetLevel": "write", + "MarketAddBalance": "sign", + "MarketGetReserved": "sign", + "MarketReleaseFunds": "sign", + "MarketReserveFunds": "sign", + "MarketWithdraw": "sign", + "MsigGetAvailableBalance": "read", + "MsigGetPending": "read", + "MsigGetVestingSchedule": "read", + "NetAgentVersion": "read", + "NetAutoNatStatus": "read", + "NetBandwidthStats": "read", + "NetBandwidthStatsByPeer": "read", + "NetBandwidthStatsByProtocol": "read", + "NetBlockAdd": "admin", + "NetBlockList": "read", + "NetBlockRemove": "admin", + "NetConnect": "write", + "NetConnectedness": "read", + "NetDisconnect": "write", + "NetFindPeer": "read", + "NetPeerInfo": "read", + "NetPeers": "read", + "NetPubsubScores": "read", + "Session": "read", + "Shutdown": "admin", + "StateAllMinerFaults": "read", + "StateChangedActors": "read", + "StateCompute": "read", + "StateDecodeParams": "read", + "StateGetRandomnessFromBeacon": "read", + "StateGetRandomnessFromTickets": "read", + "StateListMessages": "read", + "StateReadState": "read", + "StateReplay": "read", + "SyncCheckBad": "read", + "SyncCheckpoint": "admin", + "SyncIncomingBlocks": "read", + "SyncMarkBad": "admin", + "SyncUnmarkAllBad": "admin", + "SyncUnmarkBad": "admin", + "SyncValidateTipset": "read", + "WalletDelete": "admin", + "WalletList": "write", + "WalletNew": "write", + "WalletValidateAddress": "read", + "WalletVerify": "read" + }, + "Gap": {} + }, + "V1": { + "Common": { + "BeaconGetEntry": "read", + "ChainDeleteObj": "admin", + "ChainExport": "read", + "ChainGetBlock": "read", + "ChainGetBlockMessages": "read", + "ChainGetMessage": "read", + "ChainGetMessagesInTipset": "read", + "ChainGetParentMessages": "read", + "ChainGetParentReceipts": "read", + "ChainGetPath": "read", + "ChainGetTipSet": "read", + "ChainGetTipSetAfterHeight": "read", + "ChainGetTipSetByHeight": "read", + "ChainHasObj": "read", + "ChainHead": "read", + "ChainNotify": "read", + "ChainReadObj": "read", + "ChainSetHead": "admin", + "ChainStatObj": "read", + "ChainTipSetWeight": "read", + "GasEstimateFeeCap": "read", + "GasEstimateGasLimit": "read", + "GasEstimateGasPremium": "read", + "GasEstimateMessageGas": "read", + "MinerCreateBlock": "write", + "MinerGetBaseInfo": "read", + "MpoolBatchPush": "write", + "MpoolBatchPushMessage": "sign", + "MpoolBatchPushUntrusted": "write", + "MpoolCheckMessages": "read", + "MpoolCheckPendingMessages": "read", + "MpoolCheckReplaceMessages": "read", + "MpoolClear": "write", + "MpoolGetConfig": "read", + "MpoolGetNonce": "read", + "MpoolPending": "read", + "MpoolPush": "write", + "MpoolPushMessage": "sign", + "MpoolPushUntrusted": "write", + "MpoolSelect": "read", + "MpoolSetConfig": "admin", + "MpoolSub": "read", + "MsigAddApprove": "sign", + "MsigAddCancel": "sign", + "MsigAddPropose": "sign", + "MsigApprove": "sign", + "MsigApproveTxnHash": "sign", + "MsigCancel": "sign", + "MsigCreate": "sign", + "MsigGetVested": "read", + "MsigPropose": "sign", + "MsigRemoveSigner": "sign", + "MsigSwapApprove": "sign", + "MsigSwapCancel": "sign", + "MsigSwapPropose": "sign", + "NetAddrsListen": "read", + "PaychAllocateLane": "sign", + "PaychAvailableFunds": "sign", + "PaychAvailableFundsByFromTo": "sign", + "PaychCollect": "sign", + "PaychGet": "sign", + "PaychList": "read", + "PaychNewPayment": "sign", + "PaychSettle": "sign", + "PaychStatus": "read", + "PaychVoucherCheckSpendable": "read", + "PaychVoucherCheckValid": "read", + "PaychVoucherCreate": "sign", + "PaychVoucherList": "write", + "PaychVoucherSubmit": "sign", + "StateAccountKey": "read", + "StateCall": "read", + "StateCirculatingSupply": "read", + "StateDealProviderCollateralBounds": "read", + "StateGetActor": "read", + "StateGetRandomnessFromBeacon": "read", + "StateGetRandomnessFromTickets": "read", + "StateListActors": "read", + "StateListMiners": "read", + "StateLookupID": "read", + "StateMarketBalance": "read", + "StateMarketDeals": "read", + "StateMarketParticipants": "read", + "StateMarketStorageDeal": "read", + "StateMinerActiveSectors": "read", + "StateMinerAvailableBalance": "read", + "StateMinerDeadlines": "read", + "StateMinerFaults": "read", + "StateMinerInfo": "read", + "StateMinerInitialPledgeCollateral": "read", + "StateMinerPartitions": "read", + "StateMinerPower": "read", + "StateMinerPreCommitDepositForPower": "read", + "StateMinerProvingDeadline": "read", + "StateMinerRecoveries": "read", + "StateMinerSectorAllocated": "read", + "StateMinerSectorCount": "read", + "StateMinerSectors": "read", + "StateNetworkName": "read", + "StateNetworkVersion": "read", + "StateSearchMsg": "read", + "StateSectorExpiration": "read", + "StateSectorGetInfo": "read", + "StateSectorPartition": "read", + "StateSectorPreCommitInfo": "read", + "StateVMCirculatingSupplyInternal": "read", + "StateVerifiedClientStatus": "read", + "StateVerifiedRegistryRootKey": "read", + "StateVerifierStatus": "read", + "StateWaitMsg": "read", + "SyncState": "read", + "SyncSubmitBlock": "write", + "Version": "read", + "WalletBalance": "read", + "WalletDefaultAddress": "write", + "WalletExport": "admin", + "WalletHas": "write", + "WalletImport": "admin", + "WalletSign": "sign", + "WalletSignMessage": "sign" + }, + "Extend": { + "BlockTime": "read", + "ChainGetRandomnessFromBeacon": "read", + "ChainGetRandomnessFromTickets": "read", + "ChainGetReceipts": "read", + "ChainList": "read", + "ChainSyncHandleNewTipSet": "write", + "Concurrent": "read", + "GasBatchEstimateMessageGas": "read", + "GetActor": "read", + "GetEntry": "read", + "GetFullBlock": "read", + "GetParentStateRootActor": "read", + "HasPassword": "admin", + "ListActor": "read", + "LockWallet": "admin", + "MessageWait": "read", + "MpoolDeleteByAdress": "admin", + "MpoolPublishByAddr": "write", + "MpoolPublishMessage": "write", + "MpoolSelects": "read", + "NetworkConnect": "read", + "NetworkFindPeer": "read", + "NetworkFindProvidersAsync": "read", + "NetworkGetBandwidthStats": "admin", + "NetworkGetClosestPeers": "read", + "NetworkGetPeerAddresses": "admin", + "NetworkGetPeerID": "admin", + "NetworkPeers": "read", + "PaychGetWaitsigny": "sign", + "ProtocolParameters": "read", + "ResolveToKeyAddr": "read", + "SetConcurrent": "admin", + "SetPassword": "admin", + "StateMinerSectorSize": "read", + "StateMinerWorkerAddress": "read", + "UnLockWallet": "admin", + "Verify": "read", + "VerifyEntry": "read", + "WalletAddresses": "admin", + "WalletNewAddress": "write", + "WalletState": "admin" + }, + "Loss": { + "AuthVerify": "read", + "ChainBlockstoreInfo": "read", + "ChainCheckBlockstore": "admin", + "ChainGetGenesis": "read", + "ChainGetNode": "read", + "ClientCalcCommP": "write", + "ClientCancelDataTransfer": "write", + "ClientCancelRetrievalDeal": "write", + "ClientDataTransferUpdates": "write", + "ClientDealPieceCID": "read", + "ClientDealSize": "read", + "ClientFindData": "read", + "ClientGenCar": "write", + "ClientGetDealInfo": "read", + "ClientGetDealStatus": "read", + "ClientGetDealUpdates": "write", + "ClientGetRetrievalUpdates": "write", + "ClientHasLocal": "write", + "ClientImport": "admin", + "ClientListDataTransfers": "write", + "ClientListDeals": "write", + "ClientListImports": "write", + "ClientListRetrievals": "write", + "ClientMinerQueryOffer": "read", + "ClientQueryAsk": "read", + "ClientRemoveImport": "admin", + "ClientRestartDataTransfer": "write", + "ClientRetrieve": "admin", + "ClientRetrieveTryRestartInsufficientFunds": "write", + "ClientRetrieveWithEvents": "admin", + "ClientStartDeal": "admin", + "ClientStatelessDeal": "write", + "Closing": "read", + "CreateBackup": "admin", + "Discover": "read", + "ID": "read", + "LogAlerts": "admin", + "LogList": "write", + "LogSetLevel": "write", + "MarketAddBalance": "sign", + "MarketGetReserved": "sign", + "MarketReleaseFunds": "sign", + "MarketReserveFunds": "sign", + "MarketWithdraw": "sign", + "MsigGetAvailableBalance": "read", + "MsigGetPending": "read", + "MsigGetVestingSchedule": "read", + "NetAgentVersion": "read", + "NetAutoNatStatus": "read", + "NetBandwidthStats": "read", + "NetBandwidthStatsByPeer": "read", + "NetBandwidthStatsByProtocol": "read", + "NetBlockAdd": "admin", + "NetBlockList": "read", + "NetBlockRemove": "admin", + "NetConnect": "write", + "NetConnectedness": "read", + "NetDisconnect": "write", + "NetFindPeer": "read", + "NetPeerInfo": "read", + "NetPeers": "read", + "NetPubsubScores": "read", + "NodeStatus": "read", + "PaychGetWaitReady": "sign", + "Session": "read", + "Shutdown": "admin", + "StateAllMinerFaults": "read", + "StateChangedActors": "read", + "StateCompute": "read", + "StateDecodeParams": "read", + "StateEncodeParams": "read", + "StateListMessages": "read", + "StateReadState": "read", + "StateReplay": "read", + "SyncCheckBad": "read", + "SyncCheckpoint": "admin", + "SyncIncomingBlocks": "read", + "SyncMarkBad": "admin", + "SyncUnmarkAllBad": "admin", + "SyncUnmarkBad": "admin", + "SyncValidateTipset": "read", + "WalletDelete": "admin", + "WalletList": "write", + "WalletNew": "write", + "WalletValidateAddress": "read", + "WalletVerify": "read" + }, + "Gap": { + "AuthNew": "venus:read lotus:admin", + "PaychVoucherAdd": "venus:sign lotus:write", + "WalletSetDefault": "venus:admin lotus:write" + } + } +} \ No newline at end of file diff --git a/venus-shared/go.mod b/venus-shared/go.mod index ec46624d7f..7deb1e398c 100644 --- a/venus-shared/go.mod +++ b/venus-shared/go.mod @@ -28,3 +28,7 @@ require ( go.uber.org/zap v1.14.1 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 ) + +replace ( + github.com/filecoin-project/go-jsonrpc => github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc +) From 7a91e50d3f80a5e37abd92b1a1d875fa6181933d Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Thu, 23 Dec 2021 16:36:26 +0800 Subject: [PATCH 079/167] add v7 actor files (#4637) --- Makefile | 3 + go.sum | 4 +- venus-devtool/compatible/actors/main.go | 1 + venus-devtool/go.mod | 6 +- venus-devtool/go.sum | 431 +++++++++---- venus-shared/actors/builtin/account/actor.go | 15 + .../actors/builtin/account/state.v7.go | 42 ++ venus-shared/actors/builtin/builtin.go | 60 +- venus-shared/actors/builtin/cron/actor.go | 12 +- venus-shared/actors/builtin/cron/state.v7.go | 37 ++ venus-shared/actors/builtin/init/actor.go | 19 +- venus-shared/actors/builtin/init/state.v7.go | 115 ++++ venus-shared/actors/builtin/market/actor.go | 22 +- .../actors/builtin/market/state.v7.go | 254 ++++++++ venus-shared/actors/builtin/miner/actor.go | 18 +- .../actors/builtin/miner/actor.go.template | 1 + .../builtin/miner/state.sep.go.template | 23 +- venus-shared/actors/builtin/miner/state.v0.go | 18 +- venus-shared/actors/builtin/miner/state.v2.go | 6 +- venus-shared/actors/builtin/miner/state.v3.go | 6 +- venus-shared/actors/builtin/miner/state.v4.go | 6 +- venus-shared/actors/builtin/miner/state.v5.go | 6 +- venus-shared/actors/builtin/miner/state.v6.go | 8 +- venus-shared/actors/builtin/miner/state.v7.go | 573 ++++++++++++++++++ venus-shared/actors/builtin/miner/utils.go | 19 + venus-shared/actors/builtin/multisig/actor.go | 32 +- .../actors/builtin/multisig/message.v7.go | 73 +++ .../actors/builtin/multisig/state.v7.go | 121 ++++ venus-shared/actors/builtin/paych/actor.go | 20 +- .../actors/builtin/paych/message.v7.go | 76 +++ venus-shared/actors/builtin/paych/state.v7.go | 116 ++++ venus-shared/actors/builtin/power/actor.go | 19 +- venus-shared/actors/builtin/power/state.v7.go | 189 ++++++ venus-shared/actors/builtin/reward/actor.go | 19 +- .../actors/builtin/reward/state.v7.go | 100 +++ venus-shared/actors/builtin/system/actor.go | 10 +- .../actors/builtin/system/state.v7.go | 37 ++ venus-shared/actors/builtin/verifreg/actor.go | 19 +- .../actors/builtin/verifreg/state.v7.go | 77 +++ venus-shared/actors/policy/policy.go | 84 ++- venus-shared/actors/version.go | 21 +- .../compatible-checks/actor-sources.txt | 13 + venus-shared/go.mod | 3 +- venus-shared/go.sum | 7 +- 44 files changed, 2543 insertions(+), 198 deletions(-) create mode 100644 venus-shared/actors/builtin/account/state.v7.go create mode 100644 venus-shared/actors/builtin/cron/state.v7.go create mode 100644 venus-shared/actors/builtin/init/state.v7.go create mode 100644 venus-shared/actors/builtin/market/state.v7.go create mode 100644 venus-shared/actors/builtin/miner/state.v7.go create mode 100644 venus-shared/actors/builtin/multisig/message.v7.go create mode 100644 venus-shared/actors/builtin/multisig/state.v7.go create mode 100644 venus-shared/actors/builtin/paych/message.v7.go create mode 100644 venus-shared/actors/builtin/paych/state.v7.go create mode 100644 venus-shared/actors/builtin/power/state.v7.go create mode 100644 venus-shared/actors/builtin/reward/state.v7.go create mode 100644 venus-shared/actors/builtin/system/state.v7.go create mode 100644 venus-shared/actors/builtin/verifreg/state.v7.go diff --git a/Makefile b/Makefile index 0440341d92..d9e7817db6 100644 --- a/Makefile +++ b/Makefile @@ -73,3 +73,6 @@ actor-sources: actor-render: cd venus-devtool && go run ./compatible/actors/*.go render ../venus-shared/actors/ + +actor-replica: + cd venus-devtool && go run ./compatible/actors/*.go replica --dst ../venus-shared/actors/ diff --git a/go.sum b/go.sum index e8b200f6d1..112c72f53d 100644 --- a/go.sum +++ b/go.sum @@ -337,7 +337,6 @@ github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe h1:dF8u+LEWeIcTcfUcCf3WFVlc81Fr2JKg8zPzIbBDKDw= @@ -363,8 +362,9 @@ github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4U github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9 h1:H10WnEAJQH3JwHyaHwMEgaaj00z+/QMCb9Sjd/SUW1w= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= diff --git a/venus-devtool/compatible/actors/main.go b/venus-devtool/compatible/actors/main.go index 5c1132cf1c..c72c351f76 100644 --- a/venus-devtool/compatible/actors/main.go +++ b/venus-devtool/compatible/actors/main.go @@ -173,6 +173,7 @@ var replicaCmd = &cli.Command{ } replacers := [][2]string{ + {"github.com/filecoin-project/lotus/chain/actors", "github.com/filecoin-project/venus/venus-shared/actors"}, {"github.com/filecoin-project/lotus/chain/actors/adt", "github.com/filecoin-project/venus/venus-shared/actors/adt"}, {"github.com/filecoin-project/lotus/chain/actors/aerrors", "github.com/filecoin-project/venus/venus-shared/actors/aerrors"}, } diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index e1365ab144..6afed6bb1c 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -4,9 +4,9 @@ go 1.16 require ( github.com/filecoin-project/go-jsonrpc v0.1.5 - github.com/filecoin-project/lotus v1.12.0 + github.com/filecoin-project/lotus v1.13.2-0.20211213233817-8a4246227153 github.com/filecoin-project/venus v0.0.0-00010101000000-000000000000 - github.com/filecoin-project/venus/venus-shared v0.0.1 + github.com/filecoin-project/venus/venus-shared v0.0.0-00010101000000-000000000000 github.com/ipfs/go-ipfs-http-client v0.1.0 // indirect github.com/urfave/cli/v2 v2.3.0 github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 @@ -18,4 +18,4 @@ replace ( github.com/filecoin-project/venus/venus-shared => ../venus-shared/ github.com/ipfs/go-ipfs-cmds => github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab github.com/multiformats/go-multiaddr => github.com/multiformats/go-multiaddr v0.3.0 -) \ No newline at end of file +) diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index bb1a03d095..9dabf2b19d 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -38,10 +38,9 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -contrib.go.opencensus.io/exporter/jaeger v0.1.0/go.mod h1:VYianECmuFPwU37O699Vc1GOcy+y8kOsfaxHRImmjbA= contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= -contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= contrib.go.opencensus.io/exporter/prometheus v0.3.0/go.mod h1:rpCPVQKhiyH8oomWgm34ZmgIdZa8OVYO5WAIygPbBBE= +contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -55,16 +54,21 @@ github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOv github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= +github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/jt0CW30vsg= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= -github.com/GeertJohan/go.rice v1.0.0 h1:KkI6O9uMaQU3VEKaj01ulavtF7o1fWT7+pk/4voiMLQ= -github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= +github.com/GeertJohan/go.rice v1.0.2 h1:PtRw+Tg3oa3HYwiDBZyvOJ8LdIyf6lAovJJtr7YOAYk= +github.com/GeertJohan/go.rice v1.0.2/go.mod h1:af5vUNlDNkCjOZeSGFgIJxDje9qdjsO6hshx0gTmZt4= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4uFNYOGG2cJpmFJ04E6SD1NLELPYZB57/7AY= +github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa/go.mod h1:WUmMvh9wMtqj1Xhf1hf3kp9RvL+y6odtdYxpyZjb90U= @@ -82,15 +86,16 @@ github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/Stebalien/go-bitfield v0.0.0-20180330043415-076a62f9ce6e/go.mod h1:3oM7gXIttpYDAJXpVNnSCiUMYBLIZ6cb1t+Ip982MRo= +github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo= github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= @@ -110,7 +115,9 @@ github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/ashanbrown/forbidigo v1.1.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= @@ -123,12 +130,18 @@ github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpi github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.32.11/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/benbjohnson/clock v1.0.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.0.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.2.0 h1:9Re3G2TWxkE06LdMWMpcY6KV81GLXMGiYpPYUPkFAws= +github.com/benbjohnson/clock v1.2.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -147,12 +160,14 @@ github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcug github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.21.0-beta h1:At9hIZdJW0s9E/fAz28nrz6AmcNlSVucCH796ZteX1M= github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= +github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= +github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= @@ -160,26 +175,35 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U= +github.com/buger/goterm v1.0.3/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20200211180108-c7c1fbc02894/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charithe/durationcheck v0.0.6/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.2.0 h1:Fv93L3KKckEcEHR3oApXVzyBTDA8WAm6VXhPE00N3f8= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= @@ -188,6 +212,7 @@ github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07/go.mod h1:hU7vh github.com/cockroachdb/redact v0.0.0-20200622112456-cd282804bbd3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= +github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327 h1:7grrpcfCtbZLsjtB0DgMuzs1umsJmpzaHMZ6cO6iAWw= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -200,8 +225,11 @@ github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU= @@ -239,16 +267,20 @@ github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzA github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= +github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= +github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/badger/v3 v3.2011.1/go.mod h1:0rLLrQpKVQAL0or/lBLMQznhr6dWWX7h5AKnmnqx268= github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.0.4-0.20210122082011-bb5d392ed82d h1:eQYOG6A4td1tht0NdJB9Ls6DsXRGb2Ft6X9REU/MbbE= github.com/dgraph-io/ristretto v0.0.4-0.20210122082011-bb5d392ed82d/go.mod h1:tv2ec8nA7vRpSYX7/MbP52ihrUMXIHit54CQMq8npXQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= @@ -264,19 +296,26 @@ github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5 github.com/drand/kyber-bls12381 v0.2.0/go.mod h1:zQip/bHdeEB6HFZSU3v+d3cQE0GaBVQw9aR2E7AdoeI= github.com/drand/kyber-bls12381 v0.2.1/go.mod h1:JwWn4nHO9Mp4F5qCie5sVIPQZ0X6cw8XAeMRvc/GXBE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elastic/go-sysinfo v1.3.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= +github.com/elastic/go-sysinfo v1.7.0 h1:4vVvcfi255+8+TyQ7TYUTEK3A+G8v5FLE+ZKYL1z1Dg= +github.com/elastic/go-sysinfo v1.7.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= +github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elastic/gosigar v0.14.1/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/esimonov/ifshort v1.0.2/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= @@ -288,8 +327,9 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= github.com/filecoin-project/dagstore v0.4.3 h1:yeFl6+2BRY1gOVp/hrZuFa24s7LY0Qqkqx/Gh8lidZs= github.com/filecoin-project/dagstore v0.4.3/go.mod h1:dm/91AO5UaDd3bABFjg/5fmRH99vvpS7g1mykqvz6KQ= @@ -298,8 +338,9 @@ github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f h github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f/go.mod h1:+If3s2VxyjZn+KGGZIoRXBDSFQ9xL404JBJGf4WhEj0= github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= -github.com/filecoin-project/go-address v0.0.5 h1:SSaFT/5aLfPXycUlFyemoHYhRgdyXClXCyDdNJKPlDM= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= +github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= github.com/filecoin-project/go-amt-ipld/v2 v2.0.1-0.20200424220931-6263827e49f2/go.mod h1:boRtQhzmxNocrMxOXo1NYn4oUc1NGvR8tEa79wApNXg= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349 h1:pIuR0dnMD0i+as8wNnjjHyQrnhP5O5bmba/lmgQeRgU= @@ -313,17 +354,20 @@ github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQj github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-cbor-util v0.0.0-20201016124514-d0bbec7bfcc4 h1:YmE80qPn5K0txSqxnRNiCRAWyXI1LTO//I4c4H0QwbM= github.com/filecoin-project/go-cbor-util v0.0.0-20201016124514-d0bbec7bfcc4/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= +github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= +github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= +github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-commp-utils v0.1.3 h1:rTxbkNXZU7FLgdkBk8RsQIEOuPONHykEoX3xGk41Fkw= github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9ANQrY3fDFoXdqyX04J+dWpK30= -github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= +github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.10.0/go.mod h1:uQtqy6vUAY5v70ZHdkF5mJ8CjVtjj/JA3aOoaqzWTVw= -github.com/filecoin-project/go-data-transfer v1.10.1 h1:YQNLwhizxkdfFxegAyrnn3l7WjgMjqDlqFzr18iWiYI= github.com/filecoin-project/go-data-transfer v1.10.1/go.mod h1:CSDMCrPK2lVGodNB1wPEogjFvM9nVGyiL1GNbBRTSdw= +github.com/filecoin-project/go-data-transfer v1.11.4 h1:jKvlx0/C8HSyLRn/G1P9TjtfBtFU9jbCvCVFmWbyYVQ= +github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -333,8 +377,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+ github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.12.0 h1:RpU5bLaMADVrU4CgLxKMGHC2ZUocNV35uINxogQCf00= -github.com/filecoin-project/go-fil-markets v1.12.0/go.mod h1:XuuZFaFujI47nrgfQJiq7jWB+6rRya6nm7Sj6uXQ80U= +github.com/filecoin-project/go-fil-markets v1.13.4 h1:NAu+ACelR2mYsj+yJ4iLu8FGqWK50OnU5VF8axkLsSc= +github.com/filecoin-project/go-fil-markets v1.13.4/go.mod h1:aANjXD2XMHWnT2zWpyGWLsWLC24C4mHm0gRm85OpPWE= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -349,9 +393,9 @@ github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4G github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543/go.mod h1:mjrHv1cDGJWDlGmC0eDc1E5VJr8DmL9XMUcaFwiuKg8= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= -github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1 h1:0BogtftbcgyBx4lP2JWM00ZK7/pXmgnrDqKp9aLTgVs= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -github.com/filecoin-project/go-paramfetch v0.0.2-0.20210614165157-25a6c7769498/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= +github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= @@ -360,8 +404,9 @@ github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379 h1:UmKkt13NrtulubqfNXhG7SQ7Pjza8BeKdNBxngqAo64= github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= +github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= @@ -369,8 +414,8 @@ github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZO github.com/filecoin-project/go-statestore v0.1.1 h1:ufMFq00VqnT2CAuDpcGnwLnCX1I/c3OROw/kXVNSTZk= github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= -github.com/filecoin-project/lotus v1.12.0 h1:ayqeGQCsHN3ApK02VZQslEFbjvP1H2d1CXBnJKHUZWA= -github.com/filecoin-project/lotus v1.12.0/go.mod h1:zr8dXJPXFDf3E5tB9RMOpDe4MD8wD9ghsUns9xkXAhY= +github.com/filecoin-project/lotus v1.13.2-0.20211213233817-8a4246227153 h1:YDplDR4tT8a7cGAvUg5uhf9WschEMyt9aErAP5MjxBY= +github.com/filecoin-project/lotus v1.13.2-0.20211213233817-8a4246227153/go.mod h1:/gEkKgo2ms5Eycdoij8E5ye2J7ZFgdkJVgJ6Q+HljFA= github.com/filecoin-project/specs-actors v0.6.1/go.mod h1:dRdy3cURykh2R8O/DKqy8olScl70rmIS7GrB4hB1IDY= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -392,27 +437,33 @@ github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4U github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/specs-storage v0.1.1-0.20211202151826-2e51da61d454 h1:9II9Xf+jq5xAPQiS4rVoKIiALINa3loMC+ghyFYIrqQ= +github.com/filecoin-project/specs-storage v0.1.1-0.20211202151826-2e51da61d454/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578/go.mod h1:/cbLZYvQhinVFUG4TP2Uy1o7LtF+guT21qZIMTmKk0g= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= -github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1/go.mod h1:0eHX/BVySxPc6SE2mZRoppGq7qcEagxdmQnA3dzork8= -github.com/gbrlsnchs/jwt/v3 v3.0.0 h1:gtPjdT3gAbBLjVckJsgNf+a46sqrCBfRebg2r/NysIo= github.com/gbrlsnchs/jwt/v3 v3.0.0/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= +github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= +github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= github.com/getkin/kin-openapi v0.13.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s+pcEVXFuAjw= @@ -433,13 +484,19 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= @@ -478,9 +535,13 @@ github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslW github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968 h1:s+PDl6lozQ+dEUtUtQnO7+A2iPG3sK1pI4liU+jxn90= github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -494,6 +555,8 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.0.3/go.mod h1:SavQ51ycCLnc7dGyJxp8YAmudx8xqiVrRf+6IXRsugc= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -536,6 +599,8 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= @@ -590,8 +655,9 @@ github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4Mgqvf github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -636,11 +702,11 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/gxed/go-shellwords v1.0.3/go.mod h1:N7paucT91ByIjmVJHhvoarjoQnmsi3Jd3vH7VqgtMxQ= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824/go.mod h1:OiEWyHgK+CWrmOlVquHaIK1vhpUJydC9m0Je6mhaiNE= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE= github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 h1:F9k+7wv5OIk1zcq23QpdiL0hfDuXPjuOmMNaC6fgQ0Q= github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1/go.mod h1:jvfsLIxk0fY/2BKSQ1xf2406AKA5dwMmKKv0ADcOfN8= @@ -648,17 +714,27 @@ github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4n github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e/go.mod h1:I8h3MITA53gN9OnWGCgaMa0JWVRdXthWw4M3CPM54OY= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -673,27 +749,36 @@ github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uG github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+gRZDtmTJkAs= github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= -github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= +github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= +github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/iancoleman/orderedmap v0.1.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo= +github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 h1:9tcYMdi+7Rb1y0E9Del1DRHui7Ne3za5lLw6CjMJv/M= +github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1CF7AqnKZK+UCytLcY3G+UKo0ByXX/3xfdNyqQ= +github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k= +github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb-client-go/v2 v2.2.2/go.mod h1:fa/d1lAdUHxuc1jedx30ZfNG573oQTQmUni3N6pcW+0= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab h1:+Jov61TTljdzTKBecQizmUWJ6IIoVgzjukKppVr5TgI= github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= @@ -703,7 +788,6 @@ github.com/ipfs-force-community/venus-common-utils v0.0.0-20210714054928-2042a90 github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= -github.com/ipfs/go-bitswap v0.0.3/go.mod h1:jadAZYsP/tcRMl47ZhFxhaNuDQoXawT8iHMg+iFoQbg= github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= @@ -715,14 +799,14 @@ github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/ github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= -github.com/ipfs/go-blockservice v0.0.3/go.mod h1:/NNihwTi6V2Yr6g8wBI+BSwPuURpBRMtYNGrlxZ8KuI= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.5 h1:euqZu96CCbToPyYVwVshu8ENURi8BhFd7FUFfTLi+fQ= github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= +github.com/ipfs/go-blockservice v0.1.7 h1:yVe9te0M7ow8i+PPkx03YFSpxqzXx594d6h+34D6qMg= +github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -747,8 +831,10 @@ github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13X github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.5 h1:cwOUcGMLdLPWgu3SlrCckCMznaGADbPqE0r8h768/Dg= github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= +github.com/ipfs/go-datastore v0.4.6 h1:zU2cmweykxJ+ziXnA2cPtsLe8rdR/vrthOipLPuf6kc= +github.com/ipfs/go-datastore v0.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7frtpHkyPFUc= +github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= @@ -758,28 +844,33 @@ github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBR github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger2 v0.1.0/go.mod h1:pbR1p817OZbdId9EvLOhKBgUVTM3BMCSTan78lDDVaw= +github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e h1:Xi1nil8K2lBOorBS6Ys7+hmUCzH8fr3U9ipdL/IrcEI= github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e/go.mod h1:lJnws7amT9Ehqzta0gwMrRsURU04caT0iRPr1W8AsOU= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= +github.com/ipfs/go-ds-leveldb v0.4.2 h1:QmQoAJ9WkPMUfBLnu1sBVy0xWWlJPg0m4kRAiJL9iaw= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= +github.com/ipfs/go-ds-measure v0.1.0 h1:vE4TyY4aeLeVgnnPBC5QzKIjKrqzha0NCujTfgvVbVQ= github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= github.com/ipfs/go-filestore v1.0.0 h1:QR7ekKH+q2AGiWDc7W2Q0qHuYSRZGUJqUn0GsegEPb0= github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= +github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= -github.com/ipfs/go-graphsync v0.9.0/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= github.com/ipfs/go-graphsync v0.9.1/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= -github.com/ipfs/go-graphsync v0.9.3 h1:oWqUuN3OYqLwu669fxYbgymBrIodB0fD7vFZfF//X7Y= -github.com/ipfs/go-graphsync v0.9.3/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= +github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= +github.com/ipfs/go-graphsync v0.10.6 h1:GkYan4EoDslceHaqYo/hxktWtuZ7VmsyRXLdSmoCcBQ= +github.com/ipfs/go-graphsync v0.10.6/go.mod h1:tQMjWNDD/vSz80YLT/VvzrUmy58aF9lR1uCwSLzjWzI= github.com/ipfs/go-hamt-ipld v0.0.15-0.20200131012125-dd88a59d3f2e/go.mod h1:9aQJu/i/TaRDW6jqB5U217dLIDopn50wxLdHXM2CTfE= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= +github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= github.com/ipfs/go-ipfs-blockstore v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= @@ -791,7 +882,6 @@ github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcB github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= github.com/ipfs/go-ipfs-cmdkit v0.0.1/go.mod h1:9FtbMdUabcSqv/G4/8WCxSLxkZxn/aZEFrxxqnVcRbg= -github.com/ipfs/go-ipfs-config v0.0.11/go.mod h1:wveA8UT5ywN26oKStByzmz1CO6cXwLKKM6Jn/Hfw08I= github.com/ipfs/go-ipfs-config v0.5.3 h1:3GpI/xR9FoJNTjU6YvCMRbYyEi0dBVY5UtlUTcNRlSA= github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= @@ -805,13 +895,12 @@ github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6r github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= -github.com/ipfs/go-ipfs-files v0.0.2/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-files v0.0.8 h1:8o0oFJkJ8UkO/ABl8T6ac6tKF3+NIpj67aAB6ZpusRg= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= -github.com/ipfs/go-ipfs-flags v0.0.1/go.mod h1:RnXBb9WV53GSfTrSDVK61NLTFKvWc60n+K9EgCDh+rA= -github.com/ipfs/go-ipfs-http-client v0.0.5/go.mod h1:8EKP9RGUrUex4Ff86WhnKU7seEBOtjdgXlY9XHYvYMw= +github.com/ipfs/go-ipfs-files v0.0.9 h1:OFyOfmuVDu9c5YtjSDORmwXzE6fmZikzZpzsnNkgFEg= +github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= +github.com/ipfs/go-ipfs-http-client v0.0.6/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= github.com/ipfs/go-ipfs-http-client v0.1.0 h1:YrJ+/vqmZF1ignpxfHUaJEax7e4tgbaFCTLfIS5yFZY= github.com/ipfs/go-ipfs-http-client v0.1.0/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= @@ -825,7 +914,6 @@ github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42 github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= -github.com/ipfs/go-ipld-cbor v0.0.1/go.mod h1:RXHr8s4k0NE0TKhnrxqZC9M888QfsBN9rhS5NjfKzY8= github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= @@ -836,7 +924,11 @@ github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dC github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= +github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= +github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2cdcc= +github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= github.com/ipfs/go-ipns v0.0.2/go.mod h1:WChil4e0/m9cIINWLxZe1Jtf77oz5L05rO2ei/uKJ5U= +github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMRR8I= @@ -856,50 +948,47 @@ github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHn github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= -github.com/ipfs/go-merkledag v0.0.3/go.mod h1:Oc5kIXLHokkE1hWGMBHw+oxehkAaTOqtEb7Zbh6BhLA= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -github.com/ipfs/go-merkledag v0.3.2 h1:MRqj40QkrWkvPswXs4EfSslhZ4RVPRbxwX11js0t1xY= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= +github.com/ipfs/go-merkledag v0.4.1 h1:CEEQZnwRkszN06oezuasHwDD823Xcr4p4zluUN9vXqs= +github.com/ipfs/go-merkledag v0.4.1/go.mod h1:56biPaS6e+IS0eXkEt6A8tG+BUQaEIFqDqJuFfQDBoE= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= -github.com/ipfs/go-path v0.0.3/go.mod h1:zIRQUez3LuQIU25zFjC2hpBTHimWx7VK5bjZgRLbbdo= github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.2.0 h1:2cSr7exUGKYyDeUyQ7P/nHPs9P7Ht/B+ROrpN1EJOjc= github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= +github.com/ipfs/go-peertaskqueue v0.6.0 h1:BT1/PuNViVomiz1PnnP5+WmKsTNHrxIDvkZrkj4JhOg= +github.com/ipfs/go-peertaskqueue v0.6.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= -github.com/ipfs/go-unixfs v0.0.4/go.mod h1:eIo/p9ADu/MFOuyxzwU+Th8D6xoxU//r590vUpWyfz8= -github.com/ipfs/go-unixfs v0.2.1/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= github.com/ipfs/go-unixfs v0.2.6 h1:gq3U3T2vh8x6tXhfo3uSO3n+2z4yW0tYtNgVP/3sIyA= github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/ipfs/interface-go-ipfs-core v0.2.3/go.mod h1:Tihp8zxGpUeE3Tokr94L6zWZZdkRQvG5TL6i9MuNE+s= github.com/ipfs/interface-go-ipfs-core v0.4.0 h1:+mUiamyHIwedqP8ZgbCIwpy40oX7QcXUbo4CZOeJVJg= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= -github.com/ipfs/iptb-plugins v0.2.1/go.mod h1:QXMbtIWZ+jRsW8a4h13qAKU7jcM7qaittO8wOsTP0Rs= github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= -github.com/ipld/go-car v0.3.1-0.20210601190600-f512dac51e8e h1:iTAJWTWEMe0Lx8JwRaIYrYgDuI9bVzkgogGz43Yv9Eo= github.com/ipld/go-car v0.3.1-0.20210601190600-f512dac51e8e/go.mod h1:wUxBdwOLA9/0HZBi3fnTBzla0MuwlqgJLyrhOg1XaKI= +github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 h1:8JMSJ0k71fU9lIUrpVwEdoX4KoxiTEX8cZG97v/hTDw= +github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7 h1:6Z0beJSZNsRY+7udoqUl4gQ/tqtrPuRvDySrlsvbqZA= -github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= +github.com/ipld/go-car/v2 v2.1.0 h1:t8R/WXUSkfu1K1gpPk76mytCxsEdMjGcMIgpOq3/Cnw= +github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= @@ -908,16 +997,22 @@ github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVI github.com/ipld/go-ipld-prime v0.5.1-0.20200828233916-988837377a7f/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.5.1-0.20201021195245-109253e8a018/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= +github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= +github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.12.0 h1:JapyKWTsJgmhrPI7hfx4V798c/RClr85sXfBZnH1VIw= github.com/ipld/go-ipld-prime v0.12.0/go.mod h1:hy8b93WleDMRKumOJnTIrr0MbbFbx9GD6Kzxa53Xppc= +github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.14.2 h1:P5fO2usnisXwrN/1sR5exCgEvINg/w/27EuYPKB/zx8= +github.com/ipld/go-ipld-prime v0.14.2/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= +github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= +github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= -github.com/jackpal/gateway v1.0.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= @@ -948,6 +1043,7 @@ github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeY github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -965,6 +1061,7 @@ github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -974,9 +1071,11 @@ github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSg github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/julz/importas v0.0.0-20210228071311-d0bf5cb4e1db/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3/go.mod h1:BYpt4ufZiIGv2nXn4gMxnfKV306n3mWXgNu/d2TqdTU= github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= +github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kilic/bls12-381 v0.0.0-20200607163746-32e1441c8a9f/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= github.com/kilic/bls12-381 v0.0.0-20200731194930-64c428e1bff5/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= @@ -989,23 +1088,28 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.7 h1:0hzRabrMN4tSTvMfnL3SCv1ZGeAP23ynzodBgaHeMeg= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.8 h1:bhR2mgIlno/Sfk4oUbH4sPlc83z1yGrN9bvqiq3C33I= github.com/klauspost/cpuid/v2 v2.0.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d h1:68u9r4wEvL3gYg2jvAOgROwZ3H+Y3hIDk4tbbmIjcYQ= github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= +github.com/koron/go-ssdp v0.0.2 h1:fL3wAoyT6hXHQlORyXUW4Q23kkQpJRgEAYcZB5BR71o= +github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJuqPYs= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -1033,7 +1137,6 @@ github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOS github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= @@ -1047,7 +1150,6 @@ github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZ github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM= github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/libp2p/go-libp2p v0.0.2/go.mod h1:Qu8bWqFXiocPloabFGUcVG4kk94fLvfC8mWTDdFC9wE= github.com/libp2p/go-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= @@ -1064,10 +1166,11 @@ github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ github.com/libp2p/go-libp2p v0.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0= github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= -github.com/libp2p/go-libp2p v0.14.2 h1:qs0ABtjjNjS+RIXT1uM7sMJEvIc0pq2nKR0VQxFXhHI= github.com/libp2p/go-libp2p v0.14.2/go.mod h1:0PQMADQEjCM2l8cSMYDpTgsb8gr6Zq7i4LUgq1mlW2E= +github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= +github.com/libp2p/go-libp2p v0.15.0 h1:jbMbdmtizfpvl1+oQuGJzfGhttAtuxUCavF3enwFncg= +github.com/libp2p/go-libp2p v0.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= -github.com/libp2p/go-libp2p-autonat v0.0.2/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= @@ -1086,7 +1189,6 @@ github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLN github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= -github.com/libp2p/go-libp2p-circuit v0.0.1/go.mod h1:Dqm0s/BiV63j8EEAs8hr1H5HudqvCAeXxDyic59lCwE= github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= @@ -1128,13 +1230,13 @@ github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.6 h1:3S8g006qG6Tjpj1JdRK2S+TWc2DJQKX/RG9fdLeiLSU= github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= +github.com/libp2p/go-libp2p-core v0.9.0 h1:t97Mv0LIBZlP2FXVRNKKVzHJCIjbIWGxYptGId4+htU= +github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= github.com/libp2p/go-libp2p-daemon v0.2.2/go.mod h1:kyrpsLB2JeNYR2rvXSVWyY0iZuRIMhqzWR3im9BV6NQ= -github.com/libp2p/go-libp2p-discovery v0.0.1/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2TUSBHFlOCetzYdbZL5I= github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= @@ -1151,7 +1253,9 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= github.com/libp2p/go-libp2p-kad-dht v0.11.0/go.mod h1:5ojtR2acDPqh/jXf5orWy8YGb8bHQDS+qeDcoscL/PI= +github.com/libp2p/go-libp2p-kad-dht v0.13.0/go.mod h1:NkGf28RNhPrcsGYWJHm6EH8ULkiJ2qxsWmpE7VTL3LI= github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= +github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk= github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= @@ -1165,7 +1269,6 @@ github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxW github.com/libp2p/go-libp2p-mplex v0.3.0/go.mod h1:l9QWxRbbb5/hQMECEb908GbS9Sm2UAR2KFZKUJEynEs= github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= -github.com/libp2p/go-libp2p-nat v0.0.2/go.mod h1:QrjXQSD5Dj4IJOdEcjHRkWTSomyxRo6HnUkf/TfQpLQ= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= github.com/libp2p/go-libp2p-nat v0.0.6 h1:wMWis3kYynCbHoyKLPBEMu4YRLltbm8Mk08HGSfvTkU= @@ -1177,6 +1280,7 @@ github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLK github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= @@ -1192,8 +1296,9 @@ github.com/libp2p/go-libp2p-peerstore v0.2.3/go.mod h1:K8ljLdFn590GMttg/luh4caB/ github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-peerstore v0.2.8 h1:nJghUlUkFVvyk7ccsM67oFA6kqUkwyCM1G4WPVMCWYA= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= +github.com/libp2p/go-libp2p-peerstore v0.3.0 h1:wp/G0+37+GLr7tu+wE+4GWNrA3uxKg6IPRigIMSS5oQ= +github.com/libp2p/go-libp2p-peerstore v0.3.0/go.mod h1:fNX9WlOENMvdx/YD7YO/5Hkrn8+lQIk5A39BHa1HIrM= github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= @@ -1201,8 +1306,8 @@ github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEX github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= github.com/libp2p/go-libp2p-pubsub v0.4.2-0.20210212194758-6c1addf493eb/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ= -github.com/libp2p/go-libp2p-pubsub v0.5.4 h1:rHl9/Xok4zX3zgi0pg0XnUj9Xj2OeXO8oTu85q2+YA8= -github.com/libp2p/go-libp2p-pubsub v0.5.4/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= +github.com/libp2p/go-libp2p-pubsub v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= +github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= @@ -1217,13 +1322,11 @@ github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= github.com/libp2p/go-libp2p-secio v0.0.3/go.mod h1:hS7HQ00MgLhRO/Wyu1bTX6ctJKhVpm+j2/S2A5UqYb0= github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= github.com/libp2p/go-libp2p-secio v0.2.2/go.mod h1:wP3bS+m5AUnFA+OFO7Er03uO1mncHG0uVwGrwvjYlNY= -github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= github.com/libp2p/go-libp2p-swarm v0.0.6/go.mod h1:s5GZvzg9xXe8sbeESuFpjt8CJPTCa8mhEusweJqyFy8= github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU= @@ -1249,20 +1352,21 @@ github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehts github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.4.2 h1:IOiA5mMigi+eEjf4J+B7fepDhsjtsoWA9QbsCqbNp5U= github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-tls v0.1.3 h1:twKMhMu44jQO+HgQK9X8NHO5HkeJu2QbhLzLJpa8oNM= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= +github.com/libp2p/go-libp2p-tls v0.2.0 h1:N8i5wPiHudA+02sfW85R2nUbybPm7agjAywZc6pd3xA= +github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= +github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6 h1:SHt3g0FslnqIkEWF25YOB8UCOCTpGAVvHRWQYJ+veiI= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= +github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= @@ -1282,7 +1386,6 @@ github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9 github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= github.com/libp2p/go-maddr-filter v0.1.0 h1:4ACqZKw8AqiuJfwFGq1CYDFugfXTOos+qQ3DETkhtCE= github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= github.com/libp2p/go-mplex v0.0.4/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= @@ -1290,7 +1393,6 @@ github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3 github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= @@ -1314,7 +1416,6 @@ github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= github.com/libp2p/go-reuseport v0.0.2 h1:XSG94b1FJfGA01BUrT82imejHQyTxO4jEWqheyCXYvU= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= @@ -1330,17 +1431,17 @@ github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcc github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= github.com/libp2p/go-stream-muxer-multistream v0.3.0 h1:TqnSHPJEIqDEO7h1wZZ0p3DXdvDSiLHQidKKUGZtiOY= github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o= github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M= -github.com/libp2p/go-tcp-transport v0.2.7 h1:Z8Kc/Kb8tD84WiaH55xAlaEnkqzrp88jSEySCKV4+gg= +github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= +github.com/libp2p/go-tcp-transport v0.2.8 h1:aLjX+Nkz+kIz3uA56WtlGKRSAnKDvnqKmv1qF4EyyE4= +github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= -github.com/libp2p/go-ws-transport v0.0.1/go.mod h1:p3bKjDWHEgtuKKj+2OdPYs5dAPIjtpQGHF2tJfGz7Ww= github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= github.com/libp2p/go-ws-transport v0.1.2/go.mod h1:dsh2Ld8F+XNmzpkaAijmg5Is+e9l6/1tK/6VFOdN69Y= @@ -1348,6 +1449,7 @@ github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzl github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.3.1/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= +github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= @@ -1363,6 +1465,7 @@ github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawO github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.2.0 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWoAFU= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= +github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= @@ -1409,7 +1512,9 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -1418,8 +1523,9 @@ github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2y github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -1443,13 +1549,14 @@ github.com/mgechev/revive v1.0.5/go.mod h1:tSw34BaGZ0iF+oVKDOjq1/LuxGifgW7shaJ6+ github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= @@ -1459,6 +1566,8 @@ github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdn github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= @@ -1467,6 +1576,7 @@ github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -1478,6 +1588,7 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mmcloughlin/avo v0.0.0-20201105074841-5d2f697d268f/go.mod h1:6aKT4zZIrpGqB3RpFU14ByCSSyKY6LfJz4J/JJChHfI= @@ -1485,6 +1596,7 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= @@ -1496,8 +1608,9 @@ github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjW github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= 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/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-base32 v0.0.4 h1:+qMh4a2f37b4xTNs6mqitDinryCI+tfO2dRVMN9mjSE= +github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= github.com/multiformats/go-multiaddr v0.3.0 h1:z1Old9IYcUyMEtSbvwCOJ1jcrmJdU0LYH8aFBvZKzcQ= @@ -1525,20 +1638,22 @@ github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= +github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.2.1-0.20210714093213-b2b5bd6fe68b/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.3.0 h1:tstDwfIjiHbnIjeM5Lp+pMrSeN+LCMsEwOrkPmWm03A= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= -github.com/multiformats/go-multihash v0.0.7/go.mod h1:XuKXPp8VHcTygube3OWZC+aZrA+H1IhmjoCDtJc7PXM= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= +github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= @@ -1558,10 +1673,16 @@ github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0 github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= +github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= @@ -1572,8 +1693,8 @@ github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0 github.com/nishanths/exhaustive v0.1.0/go.mod h1:S1j9110vxV1ECdCudXRkeMnFQ/DQk9ajLT0Uf2MYZQQ= github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= -github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= -github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= +github.com/nkovacs/streamquote v1.0.0 h1:PmVIV08Zlx2lZK5fFZlMZ04eHcDTIFJCv/5/0twVUow= +github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -1609,6 +1730,7 @@ github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWEr github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333/go.mod h1:Ag6rSXkHIckQmjFBCweJEEt1mrTPBv8b9W4aU/NQWfI= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= @@ -1625,13 +1747,16 @@ github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTm github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= @@ -1655,6 +1780,7 @@ github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e h1:ZOcivgkkFRnjfoTc github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= @@ -1663,6 +1789,7 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= @@ -1690,8 +1817,9 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8 github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.28.0 h1:vGVfV9KrDTvWt5boZO0I19g2E3CsWfpPPKZM9dt3mEw= github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug= +github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1706,9 +1834,11 @@ github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4 github.com/prometheus/procfs v0.1.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/statsd_exporter v0.20.0/go.mod h1:YL3FWCG8JBBtaUSxAg4Gz2ZYu22bS84XM89ZQXXTWmQ= +github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= @@ -1732,6 +1862,8 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0= github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= @@ -1787,6 +1919,7 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= @@ -1832,7 +1965,9 @@ github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/ github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -1849,6 +1984,7 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= @@ -1868,6 +2004,7 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1 github.com/tomarrell/wrapcheck v1.0.0/go.mod h1:Bd3i1FaEKe3XmcPoHhNQ+HM0S8P6eIXoQIoGj/ndJkU= github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= github.com/tommy-muehle/go-mnd/v2 v2.3.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.0/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.23.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= @@ -1901,6 +2038,7 @@ github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= +github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= github.com/warpfork/go-testmark v0.3.0 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= @@ -1928,6 +2066,7 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 h1:7WtW9D9VGpmRLuQmrPy2JobUNdka95z3MKEVpELtOjo= github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= @@ -1938,10 +2077,6 @@ github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1/go.mod h1:tKH72zYNt/exx6/5IQO6L9LoQ0rEjd5SbbWaDTs9Zso= github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4/go.mod h1:K+EVq8d5QcQ2At5VECsA+SNZvWefyBXh8TnIsxo1OvQ= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= @@ -1952,7 +2087,6 @@ github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go. github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325/go.mod h1:g7ckxrjiFh8mi1AY7ox23PZD0g6QU/TxW3U3unX7I3A= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/c-for-go v0.0.0-20200718154222-87b0065af829 h1:wb7xrDzfkLgPHsSEBm+VSx6aDdi64VtV0xvP0E6j8bk= @@ -1971,6 +2105,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.12.1/go.mod h1:KatxXrVDzgWwbssUWsF5+cOJHXPvzQ09YSlzGNuhOEo= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= @@ -1984,6 +2119,10 @@ go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1995,25 +2134,39 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.22.6-0.20201102222123-380f4078db9f/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= +go.opentelemetry.io/otel/bridge/opencensus v0.25.0/go.mod h1:dkZDdaNwLlIutxK2Kc2m3jwW2M1ISaNf8/rOYVwuVHs= +go.opentelemetry.io/otel/exporters/jaeger v1.2.0/go.mod h1:KJLFbEMKTNPIfOxcg/WikIozEoKcPgJRz3Ce1vLlM8E= +go.opentelemetry.io/otel/internal/metric v0.25.0/go.mod h1:Nhuw26QSX7d6n4duoqAFi5KOQR4AuzyMcl5eXOgwxtc= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk2s/F1Ju+TEEm8= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= +go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HMUYRvxXXCCnQCg2+ovdt2z8Pk= +go.opentelemetry.io/otel/sdk/metric v0.25.0/go.mod h1:G4xzj4LvC6xDDSsVXpvRVclQCbofGGg4ZU2VKKtDRfg= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20190702223751-32f345186213/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -2026,9 +2179,14 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= golang.org/x/arch v0.0.0-20190927153633-4e8777c89be4/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= @@ -2063,6 +2221,7 @@ golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2072,12 +2231,20 @@ golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b h1:QAqMVf3pSa6eeTsuklijukjXBlj7Es2QQplab+/RbQ4= +golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= @@ -2094,6 +2261,7 @@ golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJS golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 h1:Jp57DBw4K7mimZNA3F9f7CndVcUt4kJjmyJf2rzJHoI= golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -2106,8 +2274,8 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= @@ -2122,7 +2290,6 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2176,6 +2343,7 @@ golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201022231255-08b38378de70/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -2187,8 +2355,13 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2224,6 +2397,7 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2250,6 +2424,7 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190902133755-9109b7679e13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2261,6 +2436,7 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2301,7 +2477,10 @@ golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2309,8 +2488,12 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= +golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -2320,13 +2503,14 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2336,6 +2520,7 @@ golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -2352,6 +2537,7 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2428,18 +2614,23 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2509,6 +2700,8 @@ google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2534,8 +2727,12 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2597,9 +2794,12 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= +lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0 h1:wWpDlbK8ejRfSyi0frMyhilD3JBvtcx2AdGDnU+JtsE= @@ -2619,6 +2819,7 @@ rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/venus-shared/actors/builtin/account/actor.go b/venus-shared/actors/builtin/account/actor.go index d339446c8e..1e1ecce9b8 100644 --- a/venus-shared/actors/builtin/account/actor.go +++ b/venus-shared/actors/builtin/account/actor.go @@ -25,6 +25,8 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" ) func init() { @@ -52,6 +54,10 @@ func init() { builtin.RegisterActorState(builtin6.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var Methods = builtin4.MethodsAccount @@ -77,6 +83,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.AccountActorCodeID: return load6(store, act.Head) + case builtin7.AccountActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -102,6 +111,9 @@ func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, case actors.Version6: return make6(store, addr) + case actors.Version7: + return make7(store, addr) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -127,6 +139,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.AccountActorCodeID, nil + case actors.Version7: + return builtin7.AccountActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/venus-shared/actors/builtin/account/state.v7.go b/venus-shared/actors/builtin/account/state.v7.go new file mode 100644 index 0000000000..00141f18f5 --- /dev/null +++ b/venus-shared/actors/builtin/account/state.v7.go @@ -0,0 +1,42 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + +package account + +import ( + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + account7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/account" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, addr address.Address) (State, error) { + out := state7{store: store} + out.State = account7.State{Address: addr} + return &out, nil +} + +type state7 struct { + account7.State + store adt.Store +} + +func (s *state7) PubkeyAddress() (address.Address, error) { + return s.Address, nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/builtin.go b/venus-shared/actors/builtin/builtin.go index 08c77094ff..07d256662b 100644 --- a/venus-shared/actors/builtin/builtin.go +++ b/venus-shared/actors/builtin/builtin.go @@ -25,46 +25,49 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/venus/venus-shared/actors/adt" types "github.com/filecoin-project/venus/venus-shared/chain" - miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" - proof6 "github.com/filecoin-project/specs-actors/v6/actors/runtime/proof" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" ) -var SystemActorAddr = builtin6.SystemActorAddr -var BurntFundsActorAddr = builtin6.BurntFundsActorAddr -var CronActorAddr = builtin6.CronActorAddr +var SystemActorAddr = builtin7.SystemActorAddr +var BurntFundsActorAddr = builtin7.BurntFundsActorAddr +var CronActorAddr = builtin7.CronActorAddr var SaftAddress = makeAddress("t0122") var ReserveAddress = makeAddress("t090") var RootVerifierAddress = makeAddress("t080") var ( - ExpectedLeadersPerEpoch = builtin6.ExpectedLeadersPerEpoch + ExpectedLeadersPerEpoch = builtin7.ExpectedLeadersPerEpoch ) const ( - EpochDurationSeconds = builtin6.EpochDurationSeconds - EpochsInDay = builtin6.EpochsInDay - SecondsInDay = builtin6.SecondsInDay + EpochDurationSeconds = builtin7.EpochDurationSeconds + EpochsInDay = builtin7.EpochsInDay + SecondsInDay = builtin7.SecondsInDay ) const ( - MethodSend = builtin6.MethodSend - MethodConstructor = builtin6.MethodConstructor + MethodSend = builtin7.MethodSend + MethodConstructor = builtin7.MethodConstructor ) // These are all just type aliases across actor versions. In the future, that might change // and we might need to do something fancier. -type SectorInfo = proof6.SectorInfo -type PoStProof = proof6.PoStProof +type SectorInfo = proof7.SectorInfo +type PoStProof = proof7.PoStProof type FilterEstimate = smoothing0.FilterEstimate func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, verifiedWeight abi.DealWeight) abi.StoragePower { - return miner6.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) + return miner7.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) } func FromV0FilterEstimate(v0 smoothing0.FilterEstimate) FilterEstimate { @@ -103,6 +106,12 @@ func FromV6FilterEstimate(v6 smoothing6.FilterEstimate) FilterEstimate { } +func FromV7FilterEstimate(v7 smoothing7.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v7) + +} + type ActorStateLoader func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) var ActorStateLoaders = make(map[cid.Cid]ActorStateLoader) @@ -140,6 +149,9 @@ func ActorNameByCode(c cid.Cid) string { case builtin6.IsBuiltinActor(c): return builtin6.ActorNameByCode(c) + case builtin7.IsBuiltinActor(c): + return builtin7.ActorNameByCode(c) + default: return "" } @@ -171,6 +183,10 @@ func IsBuiltinActor(c cid.Cid) bool { return true } + if builtin7.IsBuiltinActor(c) { + return true + } + return false } @@ -200,6 +216,10 @@ func IsAccountActor(c cid.Cid) bool { return true } + if c == builtin7.AccountActorCodeID { + return true + } + return false } @@ -229,6 +249,10 @@ func IsStorageMinerActor(c cid.Cid) bool { return true } + if c == builtin7.StorageMinerActorCodeID { + return true + } + return false } @@ -258,6 +282,10 @@ func IsMultisigActor(c cid.Cid) bool { return true } + if c == builtin7.MultisigActorCodeID { + return true + } + return false } @@ -287,6 +315,10 @@ func IsPaymentChannelActor(c cid.Cid) bool { return true } + if c == builtin7.PaymentChannelActorCodeID { + return true + } + return false } diff --git a/venus-shared/actors/builtin/cron/actor.go b/venus-shared/actors/builtin/cron/actor.go index 0ff5c89426..cd8c92e309 100644 --- a/venus-shared/actors/builtin/cron/actor.go +++ b/venus-shared/actors/builtin/cron/actor.go @@ -19,6 +19,8 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" ) func MakeState(store adt.Store, av actors.Version) (State, error) { @@ -42,6 +44,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -67,14 +72,17 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.CronActorCodeID, nil + case actors.Version7: + return builtin7.CronActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) } var ( - Address = builtin6.CronActorAddr - Methods = builtin6.MethodsCron + Address = builtin7.CronActorAddr + Methods = builtin7.MethodsCron ) type State interface { diff --git a/venus-shared/actors/builtin/cron/state.v7.go b/venus-shared/actors/builtin/cron/state.v7.go new file mode 100644 index 0000000000..a1352ab5c9 --- /dev/null +++ b/venus-shared/actors/builtin/cron/state.v7.go @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + +package cron + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + cron7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/cron" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + out.State = *cron7.ConstructState(cron7.BuiltInEntries()) + return &out, nil +} + +type state7 struct { + cron7.State + store adt.Store +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/init/actor.go b/venus-shared/actors/builtin/init/actor.go index 9e31efd867..0e28713421 100644 --- a/venus-shared/actors/builtin/init/actor.go +++ b/venus-shared/actors/builtin/init/actor.go @@ -26,6 +26,8 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" ) func init() { @@ -53,11 +55,15 @@ func init() { builtin.RegisterActorState(builtin6.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var ( - Address = builtin6.InitActorAddr - Methods = builtin6.MethodsInit + Address = builtin7.InitActorAddr + Methods = builtin7.MethodsInit ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -81,6 +87,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.InitActorCodeID: return load6(store, act.Head) + case builtin7.InitActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -106,6 +115,9 @@ func MakeState(store adt.Store, av actors.Version, networkName string) (State, e case actors.Version6: return make6(store, networkName) + case actors.Version7: + return make7(store, networkName) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -131,6 +143,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.InitActorCodeID, nil + case actors.Version7: + return builtin7.InitActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/venus-shared/actors/builtin/init/state.v7.go b/venus-shared/actors/builtin/init/state.v7.go new file mode 100644 index 0000000000..d5d465bffd --- /dev/null +++ b/venus-shared/actors/builtin/init/state.v7.go @@ -0,0 +1,115 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + +package init + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, networkName string) (State, error) { + out := state7{store: store} + + s, err := init7.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state7 struct { + init7.State + store adt.Store +} + +func (s *state7) ResolveAddress(address address.Address) (address.Address, bool, error) { + return s.State.ResolveAddress(s.store, address) +} + +func (s *state7) MapAddressToNewID(address address.Address) (address.Address, error) { + return s.State.MapAddressToNewID(s.store, address) +} + +func (s *state7) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { + addrs, err := adt7.AsMap(s.store, s.State.AddressMap, builtin7.DefaultHamtBitwidth) + if err != nil { + return err + } + var actorID cbg.CborInt + return addrs.ForEach(&actorID, func(key string) error { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(abi.ActorID(actorID), addr) + }) +} + +func (s *state7) NetworkName() (string, error) { + return string(s.State.NetworkName), nil +} + +func (s *state7) SetNetworkName(name string) error { + s.State.NetworkName = name + return nil +} + +func (s *state7) SetNextID(id abi.ActorID) error { + s.State.NextID = id + return nil +} + +func (s *state7) Remove(addrs ...address.Address) (err error) { + m, err := adt7.AsMap(s.store, s.State.AddressMap, builtin7.DefaultHamtBitwidth) + if err != nil { + return err + } + for _, addr := range addrs { + if err = m.Delete(abi.AddrKey(addr)); err != nil { + return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) + } + } + amr, err := m.Root() + if err != nil { + return xerrors.Errorf("failed to get address map root: %w", err) + } + s.State.AddressMap = amr + return nil +} + +func (s *state7) SetAddressMap(mcid cid.Cid) error { + s.State.AddressMap = mcid + return nil +} + +func (s *state7) AddressMap() (adt.Map, error) { + return adt7.AsMap(s.store, s.State.AddressMap, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/market/actor.go b/venus-shared/actors/builtin/market/actor.go index 6cad1485d4..a7aa665b48 100644 --- a/venus-shared/actors/builtin/market/actor.go +++ b/venus-shared/actors/builtin/market/actor.go @@ -27,6 +27,8 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" @@ -58,11 +60,15 @@ func init() { builtin.RegisterActorState(builtin6.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var ( - Address = builtin6.StorageMarketActorAddr - Methods = builtin6.MethodsMarket + Address = builtin7.StorageMarketActorAddr + Methods = builtin7.MethodsMarket ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -86,6 +92,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.StorageMarketActorCodeID: return load6(store, act.Head) + case builtin7.StorageMarketActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -111,6 +120,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -136,6 +148,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.StorageMarketActorCodeID, nil + case actors.Version7: + return builtin7.StorageMarketActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -213,6 +228,9 @@ func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStora case actors.Version6: return decodePublishStorageDealsReturn6(b) + case actors.Version7: + return decodePublishStorageDealsReturn7(b) + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/venus-shared/actors/builtin/market/state.v7.go b/venus-shared/actors/builtin/market/state.v7.go new file mode 100644 index 0000000000..d45c48c810 --- /dev/null +++ b/venus-shared/actors/builtin/market/state.v7.go @@ -0,0 +1,254 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + +package market + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + types "github.com/filecoin-project/venus/venus-shared/chain" + + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + + s, err := market7.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state7 struct { + market7.State + store adt.Store +} + +func (s *state7) TotalLocked() (abi.TokenAmount, error) { + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) + return fml, nil +} + +func (s *state7) BalancesChanged(otherState State) (bool, error) { + otherState7, ok := otherState.(*state7) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.EscrowTable.Equals(otherState7.State.EscrowTable) || !s.State.LockedTable.Equals(otherState7.State.LockedTable), nil +} + +func (s *state7) StatesChanged(otherState State) (bool, error) { + otherState7, ok := otherState.(*state7) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.States.Equals(otherState7.State.States), nil +} + +func (s *state7) States() (DealStates, error) { + stateArray, err := adt7.AsArray(s.store, s.State.States, market7.StatesAmtBitwidth) + if err != nil { + return nil, err + } + return &dealStates7{stateArray}, nil +} + +func (s *state7) ProposalsChanged(otherState State) (bool, error) { + otherState7, ok := otherState.(*state7) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.Proposals.Equals(otherState7.State.Proposals), nil +} + +func (s *state7) Proposals() (DealProposals, error) { + proposalArray, err := adt7.AsArray(s.store, s.State.Proposals, market7.ProposalsAmtBitwidth) + if err != nil { + return nil, err + } + return &dealProposals7{proposalArray}, nil +} + +func (s *state7) EscrowTable() (BalanceTable, error) { + bt, err := adt7.AsBalanceTable(s.store, s.State.EscrowTable) + if err != nil { + return nil, err + } + return &balanceTable7{bt}, nil +} + +func (s *state7) LockedTable() (BalanceTable, error) { + bt, err := adt7.AsBalanceTable(s.store, s.State.LockedTable) + if err != nil { + return nil, err + } + return &balanceTable7{bt}, nil +} + +func (s *state7) VerifyDealsForActivation( + minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, +) (weight, verifiedWeight abi.DealWeight, err error) { + w, vw, _, err := market7.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) + return w, vw, err +} + +func (s *state7) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + +type balanceTable7 struct { + *adt7.BalanceTable +} + +func (bt *balanceTable7) ForEach(cb func(address.Address, abi.TokenAmount) error) error { + asMap := (*adt7.Map)(bt.BalanceTable) + var ta abi.TokenAmount + return asMap.ForEach(&ta, func(key string) error { + a, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(a, ta) + }) +} + +type dealStates7 struct { + adt.Array +} + +func (s *dealStates7) Get(dealID abi.DealID) (*DealState, bool, error) { + var deal7 market7.DealState + found, err := s.Array.Get(uint64(dealID), &deal7) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + deal := fromV7DealState(deal7) + return &deal, true, nil +} + +func (s *dealStates7) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { + var ds7 market7.DealState + return s.Array.ForEach(&ds7, func(idx int64) error { + return cb(abi.DealID(idx), fromV7DealState(ds7)) + }) +} + +func (s *dealStates7) decode(val *cbg.Deferred) (*DealState, error) { + var ds7 market7.DealState + if err := ds7.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + ds := fromV7DealState(ds7) + return &ds, nil +} + +func (s *dealStates7) array() adt.Array { + return s.Array +} + +func fromV7DealState(v7 market7.DealState) DealState { + return (DealState)(v7) +} + +type dealProposals7 struct { + adt.Array +} + +func (s *dealProposals7) Get(dealID abi.DealID) (*DealProposal, bool, error) { + var proposal7 market7.DealProposal + found, err := s.Array.Get(uint64(dealID), &proposal7) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + proposal := fromV7DealProposal(proposal7) + return &proposal, true, nil +} + +func (s *dealProposals7) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { + var dp7 market7.DealProposal + return s.Array.ForEach(&dp7, func(idx int64) error { + return cb(abi.DealID(idx), fromV7DealProposal(dp7)) + }) +} + +func (s *dealProposals7) decode(val *cbg.Deferred) (*DealProposal, error) { + var dp7 market7.DealProposal + if err := dp7.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + dp := fromV7DealProposal(dp7) + return &dp, nil +} + +func (s *dealProposals7) array() adt.Array { + return s.Array +} + +func fromV7DealProposal(v7 market7.DealProposal) DealProposal { + return (DealProposal)(v7) +} + +func (s *state7) GetState() interface{} { + return &s.State +} + +var _ PublishStorageDealsReturn = (*publishStorageDealsReturn7)(nil) + +func decodePublishStorageDealsReturn7(b []byte) (PublishStorageDealsReturn, error) { + var retval market7.PublishStorageDealsReturn + if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { + return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) + } + + return &publishStorageDealsReturn7{retval}, nil +} + +type publishStorageDealsReturn7 struct { + market7.PublishStorageDealsReturn +} + +func (r *publishStorageDealsReturn7) IsDealValid(index uint64) (bool, error) { + + return r.ValidDeals.IsSet(index) + +} + +func (r *publishStorageDealsReturn7) DealIDs() ([]abi.DealID, error) { + return r.IDs, nil +} diff --git a/venus-shared/actors/builtin/miner/actor.go b/venus-shared/actors/builtin/miner/actor.go index d3a9d60959..2938c896c7 100644 --- a/venus-shared/actors/builtin/miner/actor.go +++ b/venus-shared/actors/builtin/miner/actor.go @@ -37,6 +37,8 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" ) func init() { @@ -65,9 +67,13 @@ func init() { return load6(store, root) }) + builtin.RegisterActorState(builtin7.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } -var Methods = builtin6.MethodsMiner +var Methods = builtin7.MethodsMiner // Unchanged between v0, v2, v3, v4, and v5 actors var WPoStProvingPeriod = miner0.WPoStProvingPeriod @@ -104,6 +110,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.StorageMinerActorCodeID: return load6(store, act.Head) + case builtin7.StorageMinerActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -129,6 +138,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -154,6 +166,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.StorageMinerActorCodeID, nil + case actors.Version7: + return builtin7.StorageMinerActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -253,6 +268,7 @@ type SectorOnChainInfo struct { InitialPledge abi.TokenAmount ExpectedDayReward abi.TokenAmount ExpectedStoragePledge abi.TokenAmount + SectorKeyCID *cid.Cid } type SectorPreCommitInfo = miner0.SectorPreCommitInfo diff --git a/venus-shared/actors/builtin/miner/actor.go.template b/venus-shared/actors/builtin/miner/actor.go.template index 7bf44b7fa9..1a8b1ce91f 100644 --- a/venus-shared/actors/builtin/miner/actor.go.template +++ b/venus-shared/actors/builtin/miner/actor.go.template @@ -179,6 +179,7 @@ type SectorOnChainInfo struct { InitialPledge abi.TokenAmount ExpectedDayReward abi.TokenAmount ExpectedStoragePledge abi.TokenAmount + SectorKeyCID *cid.Cid } type SectorPreCommitInfo = miner0.SectorPreCommitInfo diff --git a/venus-shared/actors/builtin/miner/state.sep.go.template b/venus-shared/actors/builtin/miner/state.sep.go.template index 5e8a177c81..920bd974d0 100644 --- a/venus-shared/actors/builtin/miner/state.sep.go.template +++ b/venus-shared/actors/builtin/miner/state.sep.go.template @@ -140,11 +140,22 @@ func (s *state{{.v}}) GetSectorExpiration(num abi.SectorNumber) (*SectorExpirati return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be +{{if (ge .v 7) -}} + // 1. If the sector is non-faulty, it will expire on-time (can be + // learned from the sector info). +{{- else -}} + // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. +{{- end}} +{{if (ge .v 6) -}} + // 2. If it's faulty, it will expire early within the first 42 entries + // of the expiration queue. +{{- else -}} // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. +{{- end}} + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner{{.v}}.Deadline) error { @@ -556,8 +567,7 @@ func (p *partition{{.v}}) UnprovenSectors() (bitfield.BitField, error) { } func fromV{{.v}}SectorOnChainInfo(v{{.v}} miner{{.v}}.SectorOnChainInfo) SectorOnChainInfo { -{{if (ge .v 2)}} - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v{{.v}}.SectorNumber, SealProof: v{{.v}}.SealProof, SealedCID: v{{.v}}.SealedCID, @@ -569,10 +579,11 @@ func fromV{{.v}}SectorOnChainInfo(v{{.v}} miner{{.v}}.SectorOnChainInfo) SectorO InitialPledge: v{{.v}}.InitialPledge, ExpectedDayReward: v{{.v}}.ExpectedDayReward, ExpectedStoragePledge: v{{.v}}.ExpectedStoragePledge, + {{if (ge .v 7)}} + SectorKeyCID: v{{.v}}.SectorKeyCID, + {{end}} } -{{else}} - return (SectorOnChainInfo)(v0) -{{end}} + return info } func fromV{{.v}}SectorPreCommitOnChainInfo(v{{.v}} miner{{.v}}.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/venus-shared/actors/builtin/miner/state.v0.go b/venus-shared/actors/builtin/miner/state.v0.go index 00feff13e4..360028e939 100644 --- a/venus-shared/actors/builtin/miner/state.v0.go +++ b/venus-shared/actors/builtin/miner/state.v0.go @@ -142,6 +142,7 @@ func (s *state0) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // epoch (i.e., the first element in the partition's expiration queue. // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner0.Deadline) error { @@ -507,9 +508,20 @@ func (p *partition0) UnprovenSectors() (bitfield.BitField, error) { } func fromV0SectorOnChainInfo(v0 miner0.SectorOnChainInfo) SectorOnChainInfo { - - return (SectorOnChainInfo)(v0) - + info := SectorOnChainInfo{ + SectorNumber: v0.SectorNumber, + SealProof: v0.SealProof, + SealedCID: v0.SealedCID, + DealIDs: v0.DealIDs, + Activation: v0.Activation, + Expiration: v0.Expiration, + DealWeight: v0.DealWeight, + VerifiedDealWeight: v0.VerifiedDealWeight, + InitialPledge: v0.InitialPledge, + ExpectedDayReward: v0.ExpectedDayReward, + ExpectedStoragePledge: v0.ExpectedStoragePledge, + } + return info } func fromV0SectorPreCommitOnChainInfo(v0 miner0.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/venus-shared/actors/builtin/miner/state.v2.go b/venus-shared/actors/builtin/miner/state.v2.go index dc14fca95a..7bfadf2bfe 100644 --- a/venus-shared/actors/builtin/miner/state.v2.go +++ b/venus-shared/actors/builtin/miner/state.v2.go @@ -140,6 +140,7 @@ func (s *state2) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // epoch (i.e., the first element in the partition's expiration queue. // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner2.Deadline) error { @@ -537,8 +538,7 @@ func (p *partition2) UnprovenSectors() (bitfield.BitField, error) { } func fromV2SectorOnChainInfo(v2 miner2.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v2.SectorNumber, SealProof: v2.SealProof, SealedCID: v2.SealedCID, @@ -551,7 +551,7 @@ func fromV2SectorOnChainInfo(v2 miner2.SectorOnChainInfo) SectorOnChainInfo { ExpectedDayReward: v2.ExpectedDayReward, ExpectedStoragePledge: v2.ExpectedStoragePledge, } - + return info } func fromV2SectorPreCommitOnChainInfo(v2 miner2.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/venus-shared/actors/builtin/miner/state.v3.go b/venus-shared/actors/builtin/miner/state.v3.go index 63cbfaa60c..bb44fe25b0 100644 --- a/venus-shared/actors/builtin/miner/state.v3.go +++ b/venus-shared/actors/builtin/miner/state.v3.go @@ -142,6 +142,7 @@ func (s *state3) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // epoch (i.e., the first element in the partition's expiration queue. // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner3.Deadline) error { @@ -538,8 +539,7 @@ func (p *partition3) UnprovenSectors() (bitfield.BitField, error) { } func fromV3SectorOnChainInfo(v3 miner3.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v3.SectorNumber, SealProof: v3.SealProof, SealedCID: v3.SealedCID, @@ -552,7 +552,7 @@ func fromV3SectorOnChainInfo(v3 miner3.SectorOnChainInfo) SectorOnChainInfo { ExpectedDayReward: v3.ExpectedDayReward, ExpectedStoragePledge: v3.ExpectedStoragePledge, } - + return info } func fromV3SectorPreCommitOnChainInfo(v3 miner3.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/venus-shared/actors/builtin/miner/state.v4.go b/venus-shared/actors/builtin/miner/state.v4.go index 7a922c4ab9..4a52967c9a 100644 --- a/venus-shared/actors/builtin/miner/state.v4.go +++ b/venus-shared/actors/builtin/miner/state.v4.go @@ -142,6 +142,7 @@ func (s *state4) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // epoch (i.e., the first element in the partition's expiration queue. // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner4.Deadline) error { @@ -538,8 +539,7 @@ func (p *partition4) UnprovenSectors() (bitfield.BitField, error) { } func fromV4SectorOnChainInfo(v4 miner4.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v4.SectorNumber, SealProof: v4.SealProof, SealedCID: v4.SealedCID, @@ -552,7 +552,7 @@ func fromV4SectorOnChainInfo(v4 miner4.SectorOnChainInfo) SectorOnChainInfo { ExpectedDayReward: v4.ExpectedDayReward, ExpectedStoragePledge: v4.ExpectedStoragePledge, } - + return info } func fromV4SectorPreCommitOnChainInfo(v4 miner4.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/venus-shared/actors/builtin/miner/state.v5.go b/venus-shared/actors/builtin/miner/state.v5.go index 8da5889874..2127787e19 100644 --- a/venus-shared/actors/builtin/miner/state.v5.go +++ b/venus-shared/actors/builtin/miner/state.v5.go @@ -142,6 +142,7 @@ func (s *state5) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // epoch (i.e., the first element in the partition's expiration queue. // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner5.Deadline) error { @@ -538,8 +539,7 @@ func (p *partition5) UnprovenSectors() (bitfield.BitField, error) { } func fromV5SectorOnChainInfo(v5 miner5.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v5.SectorNumber, SealProof: v5.SealProof, SealedCID: v5.SealedCID, @@ -552,7 +552,7 @@ func fromV5SectorOnChainInfo(v5 miner5.SectorOnChainInfo) SectorOnChainInfo { ExpectedDayReward: v5.ExpectedDayReward, ExpectedStoragePledge: v5.ExpectedStoragePledge, } - + return info } func fromV5SectorPreCommitOnChainInfo(v5 miner5.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/venus-shared/actors/builtin/miner/state.v6.go b/venus-shared/actors/builtin/miner/state.v6.go index 9fc2015b4e..a766adb5c7 100644 --- a/venus-shared/actors/builtin/miner/state.v6.go +++ b/venus-shared/actors/builtin/miner/state.v6.go @@ -140,8 +140,9 @@ func (s *state6) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries + // 2. If it's faulty, it will expire early within the first 42 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner6.Deadline) error { @@ -538,8 +539,7 @@ func (p *partition6) UnprovenSectors() (bitfield.BitField, error) { } func fromV6SectorOnChainInfo(v6 miner6.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v6.SectorNumber, SealProof: v6.SealProof, SealedCID: v6.SealedCID, @@ -552,7 +552,7 @@ func fromV6SectorOnChainInfo(v6 miner6.SectorOnChainInfo) SectorOnChainInfo { ExpectedDayReward: v6.ExpectedDayReward, ExpectedStoragePledge: v6.ExpectedStoragePledge, } - + return info } func fromV6SectorPreCommitOnChainInfo(v6 miner6.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/venus-shared/actors/builtin/miner/state.v7.go b/venus-shared/actors/builtin/miner/state.v7.go new file mode 100644 index 0000000000..ee0207214e --- /dev/null +++ b/venus-shared/actors/builtin/miner/state.v7.go @@ -0,0 +1,573 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + +package miner + +import ( + "bytes" + "errors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + out.State = miner7.State{} + return &out, nil +} + +type state7 struct { + miner7.State + store adt.Store +} + +type deadline7 struct { + miner7.Deadline + store adt.Store +} + +type partition7 struct { + miner7.Partition + store adt.Store +} + +func (s *state7) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { + defer func() { + if r := recover(); r != nil { + err = xerrors.Errorf("failed to get available balance: %w", r) + available = abi.NewTokenAmount(0) + } + }() + // this panics if the miner doesnt have enough funds to cover their locked pledge + available, err = s.GetAvailableBalance(bal) + return available, err +} + +func (s *state7) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.CheckVestedFunds(s.store, epoch) +} + +func (s *state7) LockedFunds() (LockedFunds, error) { + return LockedFunds{ + VestingFunds: s.State.LockedFunds, + InitialPledgeRequirement: s.State.InitialPledge, + PreCommitDeposits: s.State.PreCommitDeposits, + }, nil +} + +func (s *state7) FeeDebt() (abi.TokenAmount, error) { + return s.State.FeeDebt, nil +} + +func (s *state7) InitialPledge() (abi.TokenAmount, error) { + return s.State.InitialPledge, nil +} + +func (s *state7) PreCommitDeposits() (abi.TokenAmount, error) { + return s.State.PreCommitDeposits, nil +} + +func (s *state7) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { + info, ok, err := s.State.GetSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV7SectorOnChainInfo(*info) + return &ret, nil +} + +func (s *state7) FindSector(num abi.SectorNumber) (*SectorLocation, error) { + dlIdx, partIdx, err := s.State.FindSector(s.store, num) + if err != nil { + return nil, err + } + return &SectorLocation{ + Deadline: dlIdx, + Partition: partIdx, + }, nil +} + +func (s *state7) NumLiveSectors() (uint64, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return 0, err + } + var total uint64 + if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner7.Deadline) error { + total += dl.LiveSectors + return nil + }); err != nil { + return 0, err + } + return total, nil +} + +// GetSectorExpiration returns the effective expiration of the given sector. +// +// If the sector does not expire early, the Early expiration field is 0. +func (s *state7) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + // NOTE: this can be optimized significantly. + // 1. If the sector is non-faulty, it will expire on-time (can be + // learned from the sector info). + // 2. If it's faulty, it will expire early within the first 42 entries + // of the expiration queue. + + stopErr := errors.New("stop") + out := SectorExpiration{} + err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner7.Deadline) error { + partitions, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + quant := s.State.QuantSpecForDeadline(dlIdx) + var part miner7.Partition + return partitions.ForEach(&part, func(partIdx int64) error { + if found, err := part.Sectors.IsSet(uint64(num)); err != nil { + return err + } else if !found { + return nil + } + if found, err := part.Terminated.IsSet(uint64(num)); err != nil { + return err + } else if found { + // already terminated + return stopErr + } + + q, err := miner7.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner7.PartitionExpirationAmtBitwidth) + if err != nil { + return err + } + var exp miner7.ExpirationSet + return q.ForEach(&exp, func(epoch int64) error { + if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { + return err + } else if early { + out.Early = abi.ChainEpoch(epoch) + return nil + } + if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { + return err + } else if onTime { + out.OnTime = abi.ChainEpoch(epoch) + return stopErr + } + return nil + }) + }) + }) + if err == stopErr { + err = nil + } + if err != nil { + return nil, err + } + if out.Early == 0 && out.OnTime == 0 { + return nil, xerrors.Errorf("failed to find sector %d", num) + } + return &out, nil +} + +func (s *state7) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { + info, ok, err := s.State.GetPrecommittedSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV7SectorPreCommitOnChainInfo(*info) + + return &ret, nil +} + +func (s *state7) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { + precommitted, err := adt7.AsMap(s.store, s.State.PreCommittedSectors, builtin7.DefaultHamtBitwidth) + if err != nil { + return err + } + + var info miner7.SectorPreCommitOnChainInfo + if err := precommitted.ForEach(&info, func(_ string) error { + return cb(fromV7SectorPreCommitOnChainInfo(info)) + }); err != nil { + return err + } + + return nil +} + +func (s *state7) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { + sectors, err := miner7.LoadSectors(s.store, s.State.Sectors) + if err != nil { + return nil, err + } + + // If no sector numbers are specified, load all. + if snos == nil { + infos := make([]*SectorOnChainInfo, 0, sectors.Length()) + var info7 miner7.SectorOnChainInfo + if err := sectors.ForEach(&info7, func(_ int64) error { + info := fromV7SectorOnChainInfo(info7) + infos = append(infos, &info) + return nil + }); err != nil { + return nil, err + } + return infos, nil + } + + // Otherwise, load selected. + infos7, err := sectors.Load(*snos) + if err != nil { + return nil, err + } + infos := make([]*SectorOnChainInfo, len(infos7)) + for i, info7 := range infos7 { + info := fromV7SectorOnChainInfo(*info7) + infos[i] = &info + } + return infos, nil +} + +func (s *state7) loadAllocatedSectorNumbers() (bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) + return allocatedSectors, err +} + +func (s *state7) IsAllocated(num abi.SectorNumber) (bool, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return false, err + } + + return allocatedSectors.IsSet(uint64(num)) +} + +func (s *state7) GetProvingPeriodStart() (abi.ChainEpoch, error) { + return s.State.ProvingPeriodStart, nil +} + +func (s *state7) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return nil, err + } + + allocatedRuns, err := allocatedSectors.RunIterator() + if err != nil { + return nil, err + } + + unallocatedRuns, err := rle.Subtract( + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + allocatedRuns, + ) + if err != nil { + return nil, err + } + + iter, err := rle.BitsFromRuns(unallocatedRuns) + if err != nil { + return nil, err + } + + sectors := make([]abi.SectorNumber, 0, count) + for iter.HasNext() && len(sectors) < count { + nextNo, err := iter.Next() + if err != nil { + return nil, err + } + sectors = append(sectors, abi.SectorNumber(nextNo)) + } + + return sectors, nil +} + +func (s *state7) GetAllocatedSectors() (*bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { + return nil, err + } + + return &allocatedSectors, nil +} + +func (s *state7) LoadDeadline(idx uint64) (Deadline, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + dl, err := dls.LoadDeadline(s.store, idx) + if err != nil { + return nil, err + } + return &deadline7{*dl, s.store}, nil +} + +func (s *state7) ForEachDeadline(cb func(uint64, Deadline) error) error { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + return dls.ForEach(s.store, func(i uint64, dl *miner7.Deadline) error { + return cb(i, &deadline7{*dl, s.store}) + }) +} + +func (s *state7) NumDeadlines() (uint64, error) { + return miner7.WPoStPeriodDeadlines, nil +} + +func (s *state7) DeadlinesChanged(other State) (bool, error) { + other7, ok := other.(*state7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !s.State.Deadlines.Equals(other7.Deadlines), nil +} + +func (s *state7) MinerInfoChanged(other State) (bool, error) { + other0, ok := other.(*state7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Info.Equals(other0.State.Info), nil +} + +func (s *state7) Info() (MinerInfo, error) { + info, err := s.State.GetInfo(s.store) + if err != nil { + return MinerInfo{}, err + } + + var pid *peer.ID + if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { + pid = &peerID + } + + mi := MinerInfo{ + Owner: info.Owner, + Worker: info.Worker, + ControlAddresses: info.ControlAddresses, + + NewWorker: address.Undef, + WorkerChangeEpoch: -1, + + PeerId: pid, + Multiaddrs: info.Multiaddrs, + WindowPoStProofType: info.WindowPoStProofType, + SectorSize: info.SectorSize, + WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, + ConsensusFaultElapsed: info.ConsensusFaultElapsed, + } + + if info.PendingWorkerKey != nil { + mi.NewWorker = info.PendingWorkerKey.NewWorker + mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt + } + + return mi, nil +} + +func (s *state7) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { + return s.State.RecordedDeadlineInfo(epoch), nil +} + +func (s *state7) DeadlineCronActive() (bool, error) { + return s.State.DeadlineCronActive, nil +} + +func (s *state7) sectors() (adt.Array, error) { + return adt7.AsArray(s.store, s.Sectors, miner7.SectorsAmtBitwidth) +} + +func (s *state7) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { + var si miner7.SectorOnChainInfo + err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorOnChainInfo{}, err + } + + return fromV7SectorOnChainInfo(si), nil +} + +func (s *state7) precommits() (adt.Map, error) { + return adt7.AsMap(s.store, s.PreCommittedSectors, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { + var sp miner7.SectorPreCommitOnChainInfo + err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorPreCommitOnChainInfo{}, err + } + + return fromV7SectorPreCommitOnChainInfo(sp), nil +} + +func (s *state7) EraseAllUnproven() error { + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner7.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner7.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + +} + +func (d *deadline7) LoadPartition(idx uint64) (Partition, error) { + p, err := d.Deadline.LoadPartition(d.store, idx) + if err != nil { + return nil, err + } + return &partition7{*p, d.store}, nil +} + +func (d *deadline7) ForEachPartition(cb func(uint64, Partition) error) error { + ps, err := d.Deadline.PartitionsArray(d.store) + if err != nil { + return err + } + var part miner7.Partition + return ps.ForEach(&part, func(i int64) error { + return cb(uint64(i), &partition7{part, d.store}) + }) +} + +func (d *deadline7) PartitionsChanged(other Deadline) (bool, error) { + other7, ok := other.(*deadline7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !d.Deadline.Partitions.Equals(other7.Deadline.Partitions), nil +} + +func (d *deadline7) PartitionsPoSted() (bitfield.BitField, error) { + return d.Deadline.PartitionsPoSted, nil +} + +func (d *deadline7) DisputableProofCount() (uint64, error) { + + ops, err := d.OptimisticProofsSnapshotArray(d.store) + if err != nil { + return 0, err + } + + return ops.Length(), nil + +} + +func (p *partition7) AllSectors() (bitfield.BitField, error) { + return p.Partition.Sectors, nil +} + +func (p *partition7) FaultySectors() (bitfield.BitField, error) { + return p.Partition.Faults, nil +} + +func (p *partition7) RecoveringSectors() (bitfield.BitField, error) { + return p.Partition.Recoveries, nil +} + +func (p *partition7) UnprovenSectors() (bitfield.BitField, error) { + return p.Partition.Unproven, nil +} + +func fromV7SectorOnChainInfo(v7 miner7.SectorOnChainInfo) SectorOnChainInfo { + info := SectorOnChainInfo{ + SectorNumber: v7.SectorNumber, + SealProof: v7.SealProof, + SealedCID: v7.SealedCID, + DealIDs: v7.DealIDs, + Activation: v7.Activation, + Expiration: v7.Expiration, + DealWeight: v7.DealWeight, + VerifiedDealWeight: v7.VerifiedDealWeight, + InitialPledge: v7.InitialPledge, + ExpectedDayReward: v7.ExpectedDayReward, + ExpectedStoragePledge: v7.ExpectedStoragePledge, + + SectorKeyCID: v7.SectorKeyCID, + } + return info +} + +func fromV7SectorPreCommitOnChainInfo(v7 miner7.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { + + return SectorPreCommitOnChainInfo{ + Info: (SectorPreCommitInfo)(v7.Info), + PreCommitDeposit: v7.PreCommitDeposit, + PreCommitEpoch: v7.PreCommitEpoch, + DealWeight: v7.DealWeight, + VerifiedDealWeight: v7.VerifiedDealWeight, + } + +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/miner/utils.go b/venus-shared/actors/builtin/miner/utils.go index e68a54d9d7..a4aaaf9721 100644 --- a/venus-shared/actors/builtin/miner/utils.go +++ b/venus-shared/actors/builtin/miner/utils.go @@ -69,3 +69,22 @@ func SealProofTypeFromSectorSize(ssize abi.SectorSize, nv network.Version) (abi. return 0, xerrors.Errorf("unsupported network version") } + +// WindowPoStProofTypeFromSectorSize returns preferred post proof type for creating +// new miner actors and new sectors +func WindowPoStProofTypeFromSectorSize(ssize abi.SectorSize) (abi.RegisteredPoStProof, error) { + switch ssize { + case 2 << 10: + return abi.RegisteredPoStProof_StackedDrgWindow2KiBV1, nil + case 8 << 20: + return abi.RegisteredPoStProof_StackedDrgWindow8MiBV1, nil + case 512 << 20: + return abi.RegisteredPoStProof_StackedDrgWindow512MiBV1, nil + case 32 << 30: + return abi.RegisteredPoStProof_StackedDrgWindow32GiBV1, nil + case 64 << 30: + return abi.RegisteredPoStProof_StackedDrgWindow64GiBV1, nil + default: + return 0, xerrors.Errorf("unsupported sector size for miner: %v", ssize) + } +} diff --git a/venus-shared/actors/builtin/multisig/actor.go b/venus-shared/actors/builtin/multisig/actor.go index 7b01b09d75..bb1d463043 100644 --- a/venus-shared/actors/builtin/multisig/actor.go +++ b/venus-shared/actors/builtin/multisig/actor.go @@ -15,7 +15,7 @@ import ( "github.com/ipfs/go-cid" msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" - msig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" + msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -29,6 +29,8 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" @@ -60,6 +62,10 @@ func init() { builtin.RegisterActorState(builtin6.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } func Load(store adt.Store, act *types.Actor) (State, error) { @@ -83,6 +89,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.MultisigActorCodeID: return load6(store, act.Head) + case builtin7.MultisigActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -108,6 +117,9 @@ func MakeState(store adt.Store, av actors.Version, signers []address.Address, th case actors.Version6: return make6(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + case actors.Version7: + return make7(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -133,6 +145,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.MultisigActorCodeID, nil + case actors.Version7: + return builtin7.MultisigActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -158,7 +173,7 @@ type State interface { type Transaction = msig0.Transaction -var Methods = builtin6.MethodsMultisig +var Methods = builtin7.MethodsMultisig func Message(version actors.Version, from address.Address) MessageBuilder { switch version { @@ -180,6 +195,9 @@ func Message(version actors.Version, from address.Address) MessageBuilder { case actors.Version6: return message6{message0{from}} + + case actors.Version7: + return message7{message0{from}} default: panic(fmt.Sprintf("unsupported actors version: %d", version)) } @@ -203,13 +221,13 @@ type MessageBuilder interface { } // this type is the same between v0 and v2 -type ProposalHashData = msig6.ProposalHashData -type ProposeReturn = msig6.ProposeReturn -type ProposeParams = msig6.ProposeParams -type ApproveReturn = msig6.ApproveReturn +type ProposalHashData = msig7.ProposalHashData +type ProposeReturn = msig7.ProposeReturn +type ProposeParams = msig7.ProposeParams +type ApproveReturn = msig7.ApproveReturn func txnParams(id uint64, data *ProposalHashData) ([]byte, error) { - params := msig6.TxnIDParams{ID: msig6.TxnID(id)} + params := msig7.TxnIDParams{ID: msig7.TxnID(id)} if data != nil { if data.Requester.Protocol() != address.ID { return nil, xerrors.Errorf("proposer address must be an ID address, was %s", data.Requester) diff --git a/venus-shared/actors/builtin/multisig/message.v7.go b/venus-shared/actors/builtin/multisig/message.v7.go new file mode 100644 index 0000000000..770001d4cc --- /dev/null +++ b/venus-shared/actors/builtin/multisig/message.v7.go @@ -0,0 +1,73 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + +package multisig + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" + multisig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +type message7 struct{ message0 } + +func (m message7) Create( + signers []address.Address, threshold uint64, + unlockStart, unlockDuration abi.ChainEpoch, + initialAmount abi.TokenAmount, +) (*types.Message, error) { + + lenAddrs := uint64(len(signers)) + + if lenAddrs < threshold { + return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") + } + + if threshold == 0 { + threshold = lenAddrs + } + + if m.from == address.Undef { + return nil, xerrors.Errorf("must provide source address") + } + + // Set up constructor parameters for multisig + msigParams := &multisig7.ConstructorParams{ + Signers: signers, + NumApprovalsThreshold: threshold, + UnlockDuration: unlockDuration, + StartEpoch: unlockStart, + } + + enc, actErr := actors.SerializeParams(msigParams) + if actErr != nil { + return nil, actErr + } + + // new actors are created by invoking 'exec' on the init actor with the constructor params + execParams := &init7.ExecParams{ + CodeCID: builtin7.MultisigActorCodeID, + ConstructorParams: enc, + } + + enc, actErr = actors.SerializeParams(execParams) + if actErr != nil { + return nil, actErr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Method: builtin7.MethodsInit.Exec, + Params: enc, + Value: initialAmount, + }, nil +} diff --git a/venus-shared/actors/builtin/multisig/state.v7.go b/venus-shared/actors/builtin/multisig/state.v7.go new file mode 100644 index 0000000000..6fd8e10bae --- /dev/null +++ b/venus-shared/actors/builtin/multisig/state.v7.go @@ -0,0 +1,121 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + +package multisig + +import ( + "bytes" + "encoding/binary" + + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { + out := state7{store: store} + out.State = msig7.State{} + out.State.Signers = signers + out.State.NumApprovalsThreshold = threshold + out.State.StartEpoch = startEpoch + out.State.UnlockDuration = unlockDuration + out.State.InitialBalance = initialBalance + + em, err := adt7.StoreEmptyMap(store, builtin7.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + + return &out, nil +} + +type state7 struct { + msig7.State + store adt.Store +} + +func (s *state7) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil +} + +func (s *state7) StartEpoch() (abi.ChainEpoch, error) { + return s.State.StartEpoch, nil +} + +func (s *state7) UnlockDuration() (abi.ChainEpoch, error) { + return s.State.UnlockDuration, nil +} + +func (s *state7) InitialBalance() (abi.TokenAmount, error) { + return s.State.InitialBalance, nil +} + +func (s *state7) Threshold() (uint64, error) { + return s.State.NumApprovalsThreshold, nil +} + +func (s *state7) Signers() ([]address.Address, error) { + return s.State.Signers, nil +} + +func (s *state7) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { + arr, err := adt7.AsMap(s.store, s.State.PendingTxns, builtin7.DefaultHamtBitwidth) + if err != nil { + return err + } + var out msig7.Transaction + return arr.ForEach(&out, func(key string) error { + txid, n := binary.Varint([]byte(key)) + if n <= 0 { + return xerrors.Errorf("invalid pending transaction key: %v", key) + } + return cb(txid, (Transaction)(out)) //nolint:unconvert + }) +} + +func (s *state7) PendingTxnChanged(other State) (bool, error) { + other7, ok := other.(*state7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.PendingTxns.Equals(other7.PendingTxns), nil +} + +func (s *state7) transactions() (adt.Map, error) { + return adt7.AsMap(s.store, s.PendingTxns, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) decodeTransaction(val *cbg.Deferred) (Transaction, error) { + var tx msig7.Transaction + if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Transaction{}, err + } + return tx, nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/paych/actor.go b/venus-shared/actors/builtin/paych/actor.go index 31d69f65fd..af65881ddc 100644 --- a/venus-shared/actors/builtin/paych/actor.go +++ b/venus-shared/actors/builtin/paych/actor.go @@ -29,6 +29,8 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" @@ -60,6 +62,10 @@ func init() { builtin.RegisterActorState(builtin6.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } // Load returns an abstract copy of payment channel state, irregardless of actor version @@ -84,6 +90,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.PaymentChannelActorCodeID: return load6(store, act.Head) + case builtin7.PaymentChannelActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -109,6 +118,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -134,6 +146,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.PaymentChannelActorCodeID, nil + case actors.Version7: + return builtin7.PaymentChannelActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -187,7 +202,7 @@ func DecodeSignedVoucher(s string) (*SignedVoucher, error) { return &sv, nil } -var Methods = builtin6.MethodsPaych +var Methods = builtin7.MethodsPaych func Message(version actors.Version, from address.Address) MessageBuilder { switch version { @@ -210,6 +225,9 @@ func Message(version actors.Version, from address.Address) MessageBuilder { case actors.Version6: return message6{from} + case actors.Version7: + return message7{from} + default: panic(fmt.Sprintf("unsupported actors version: %d", version)) } diff --git a/venus-shared/actors/builtin/paych/message.v7.go b/venus-shared/actors/builtin/paych/message.v7.go new file mode 100644 index 0000000000..5d2f98f9cb --- /dev/null +++ b/venus-shared/actors/builtin/paych/message.v7.go @@ -0,0 +1,76 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + +package paych + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" + paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + types "github.com/filecoin-project/venus/venus-shared/chain" +) + +type message7 struct{ from address.Address } + +func (m message7) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych7.ConstructorParams{From: m.from, To: to}) + if aerr != nil { + return nil, aerr + } + enc, aerr := actors.SerializeParams(&init7.ExecParams{ + CodeCID: builtin7.PaymentChannelActorCodeID, + ConstructorParams: params, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Value: initialAmount, + Method: builtin7.MethodsInit.Exec, + Params: enc, + }, nil +} + +func (m message7) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych7.UpdateChannelStateParams{ + Sv: *sv, + Secret: secret, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin7.MethodsPaych.UpdateChannelState, + Params: params, + }, nil +} + +func (m message7) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin7.MethodsPaych.Settle, + }, nil +} + +func (m message7) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin7.MethodsPaych.Collect, + }, nil +} diff --git a/venus-shared/actors/builtin/paych/state.v7.go b/venus-shared/actors/builtin/paych/state.v7.go new file mode 100644 index 0000000000..eca0c46fb6 --- /dev/null +++ b/venus-shared/actors/builtin/paych/state.v7.go @@ -0,0 +1,116 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + +package paych + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + out.State = paych7.State{} + return &out, nil +} + +type state7 struct { + paych7.State + store adt.Store + lsAmt *adt7.Array +} + +// Channel owner, who has funded the actor +func (s *state7) From() (address.Address, error) { + return s.State.From, nil +} + +// Recipient of payouts from channel +func (s *state7) To() (address.Address, error) { + return s.State.To, nil +} + +// Height at which the channel can be `Collected` +func (s *state7) SettlingAt() (abi.ChainEpoch, error) { + return s.State.SettlingAt, nil +} + +// Amount successfully redeemed through the payment channel, paid out on `Collect()` +func (s *state7) ToSend() (abi.TokenAmount, error) { + return s.State.ToSend, nil +} + +func (s *state7) getOrLoadLsAmt() (*adt7.Array, error) { + if s.lsAmt != nil { + return s.lsAmt, nil + } + + // Get the lane state from the chain + lsamt, err := adt7.AsArray(s.store, s.State.LaneStates, paych7.LaneStatesAmtBitwidth) + if err != nil { + return nil, err + } + + s.lsAmt = lsamt + return lsamt, nil +} + +// Get total number of lanes +func (s *state7) LaneCount() (uint64, error) { + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return 0, err + } + return lsamt.Length(), nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} + +// Iterate lane states +func (s *state7) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { + // Get the lane state from the chain + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return err + } + + // Note: we use a map instead of an array to store laneStates because the + // client sets the lane ID (the index) and potentially they could use a + // very large index. + var ls paych7.LaneState + return lsamt.ForEach(&ls, func(i int64) error { + return cb(uint64(i), &laneState7{ls}) + }) +} + +type laneState7 struct { + paych7.LaneState +} + +func (ls *laneState7) Redeemed() (big.Int, error) { + return ls.LaneState.Redeemed, nil +} + +func (ls *laneState7) Nonce() (uint64, error) { + return ls.LaneState.Nonce, nil +} diff --git a/venus-shared/actors/builtin/power/actor.go b/venus-shared/actors/builtin/power/actor.go index a5062427c9..65b351b038 100644 --- a/venus-shared/actors/builtin/power/actor.go +++ b/venus-shared/actors/builtin/power/actor.go @@ -28,6 +28,8 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" ) func init() { @@ -55,11 +57,15 @@ func init() { builtin.RegisterActorState(builtin6.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var ( - Address = builtin6.StoragePowerActorAddr - Methods = builtin6.MethodsPower + Address = builtin7.StoragePowerActorAddr + Methods = builtin7.MethodsPower ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -83,6 +89,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.StoragePowerActorCodeID: return load6(store, act.Head) + case builtin7.StoragePowerActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -108,6 +117,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -133,6 +145,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.StoragePowerActorCodeID, nil + case actors.Version7: + return builtin7.StoragePowerActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/venus-shared/actors/builtin/power/state.v7.go b/venus-shared/actors/builtin/power/state.v7.go new file mode 100644 index 0000000000..605a3be8f5 --- /dev/null +++ b/venus-shared/actors/builtin/power/state.v7.go @@ -0,0 +1,189 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + +package power + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + power7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/power" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + + s, err := power7.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state7 struct { + power7.State + store adt.Store +} + +func (s *state7) TotalLocked() (abi.TokenAmount, error) { + return s.TotalPledgeCollateral, nil +} + +func (s *state7) TotalPower() (Claim, error) { + return Claim{ + RawBytePower: s.TotalRawBytePower, + QualityAdjPower: s.TotalQualityAdjPower, + }, nil +} + +// Committed power to the network. Includes miners below the minimum threshold. +func (s *state7) TotalCommitted() (Claim, error) { + return Claim{ + RawBytePower: s.TotalBytesCommitted, + QualityAdjPower: s.TotalQABytesCommitted, + }, nil +} + +func (s *state7) MinerPower(addr address.Address) (Claim, bool, error) { + claims, err := s.claims() + if err != nil { + return Claim{}, false, err + } + var claim power7.Claim + ok, err := claims.Get(abi.AddrKey(addr), &claim) + if err != nil { + return Claim{}, false, err + } + return Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }, ok, nil +} + +func (s *state7) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { + return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) +} + +func (s *state7) TotalPowerSmoothed() (builtin.FilterEstimate, error) { + return builtin.FromV7FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil +} + +func (s *state7) MinerCounts() (uint64, uint64, error) { + return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil +} + +func (s *state7) ListAllMiners() ([]address.Address, error) { + claims, err := s.claims() + if err != nil { + return nil, err + } + + var miners []address.Address + err = claims.ForEach(nil, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + miners = append(miners, a) + return nil + }) + if err != nil { + return nil, err + } + + return miners, nil +} + +func (s *state7) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { + claims, err := s.claims() + if err != nil { + return err + } + + var claim power7.Claim + return claims.ForEach(&claim, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + return cb(a, Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + }) +} + +func (s *state7) ClaimsChanged(other State) (bool, error) { + other7, ok := other.(*state7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Claims.Equals(other7.State.Claims), nil +} + +func (s *state7) SetTotalQualityAdjPower(p abi.StoragePower) error { + s.State.TotalQualityAdjPower = p + return nil +} + +func (s *state7) SetTotalRawBytePower(p abi.StoragePower) error { + s.State.TotalRawBytePower = p + return nil +} + +func (s *state7) SetThisEpochQualityAdjPower(p abi.StoragePower) error { + s.State.ThisEpochQualityAdjPower = p + return nil +} + +func (s *state7) SetThisEpochRawBytePower(p abi.StoragePower) error { + s.State.ThisEpochRawBytePower = p + return nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} + +func (s *state7) claims() (adt.Map, error) { + return adt7.AsMap(s.store, s.Claims, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) decodeClaim(val *cbg.Deferred) (Claim, error) { + var ci power7.Claim + if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Claim{}, err + } + return fromV7Claim(ci), nil +} + +func fromV7Claim(v7 power7.Claim) Claim { + return Claim{ + RawBytePower: v7.RawBytePower, + QualityAdjPower: v7.QualityAdjPower, + } +} diff --git a/venus-shared/actors/builtin/reward/actor.go b/venus-shared/actors/builtin/reward/actor.go index 17f7375a62..528ca7a18d 100644 --- a/venus-shared/actors/builtin/reward/actor.go +++ b/venus-shared/actors/builtin/reward/actor.go @@ -23,6 +23,8 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" types "github.com/filecoin-project/venus/venus-shared/chain" @@ -53,11 +55,15 @@ func init() { builtin.RegisterActorState(builtin6.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var ( - Address = builtin6.RewardActorAddr - Methods = builtin6.MethodsReward + Address = builtin7.RewardActorAddr + Methods = builtin7.MethodsReward ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -81,6 +87,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.RewardActorCodeID: return load6(store, act.Head) + case builtin7.RewardActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -106,6 +115,9 @@ func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.Storage case actors.Version6: return make6(store, currRealizedPower) + case actors.Version7: + return make7(store, currRealizedPower) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -131,6 +143,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.RewardActorCodeID, nil + case actors.Version7: + return builtin7.RewardActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/venus-shared/actors/builtin/reward/state.v7.go b/venus-shared/actors/builtin/reward/state.v7.go new file mode 100644 index 0000000000..72d3cc18ce --- /dev/null +++ b/venus-shared/actors/builtin/reward/state.v7.go @@ -0,0 +1,100 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + +package reward + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" + reward7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/reward" + smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { + out := state7{store: store} + out.State = *reward7.ConstructState(currRealizedPower) + return &out, nil +} + +type state7 struct { + reward7.State + store adt.Store +} + +func (s *state7) ThisEpochReward() (abi.TokenAmount, error) { + return s.State.ThisEpochReward, nil +} + +func (s *state7) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { + + return builtin.FilterEstimate{ + PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, + VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, + }, nil + +} + +func (s *state7) ThisEpochBaselinePower() (abi.StoragePower, error) { + return s.State.ThisEpochBaselinePower, nil +} + +func (s *state7) TotalStoragePowerReward() (abi.TokenAmount, error) { + return s.State.TotalStoragePowerReward, nil +} + +func (s *state7) EffectiveBaselinePower() (abi.StoragePower, error) { + return s.State.EffectiveBaselinePower, nil +} + +func (s *state7) EffectiveNetworkTime() (abi.ChainEpoch, error) { + return s.State.EffectiveNetworkTime, nil +} + +func (s *state7) CumsumBaseline() (reward7.Spacetime, error) { + return s.State.CumsumBaseline, nil +} + +func (s *state7) CumsumRealized() (reward7.Spacetime, error) { + return s.State.CumsumRealized, nil +} + +func (s *state7) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { + return miner7.InitialPledgeForPower( + qaPower, + s.State.ThisEpochBaselinePower, + s.State.ThisEpochRewardSmoothed, + smoothing7.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply, + ), nil +} + +func (s *state7) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { + return miner7.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, + smoothing7.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + sectorWeight), nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/system/actor.go b/venus-shared/actors/builtin/system/actor.go index 01d75a6eb2..30f3a39958 100644 --- a/venus-shared/actors/builtin/system/actor.go +++ b/venus-shared/actors/builtin/system/actor.go @@ -19,10 +19,12 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" ) var ( - Address = builtin6.SystemActorAddr + Address = builtin7.SystemActorAddr ) func MakeState(store adt.Store, av actors.Version) (State, error) { @@ -46,6 +48,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -71,6 +76,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.SystemActorCodeID, nil + case actors.Version7: + return builtin7.SystemActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/venus-shared/actors/builtin/system/state.v7.go b/venus-shared/actors/builtin/system/state.v7.go new file mode 100644 index 0000000000..f4f68fcc78 --- /dev/null +++ b/venus-shared/actors/builtin/system/state.v7.go @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + +package system + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + system7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/system" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + out.State = system7.State{} + return &out, nil +} + +type state7 struct { + system7.State + store adt.Store +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/builtin/verifreg/actor.go b/venus-shared/actors/builtin/verifreg/actor.go index 771e54e30d..190dd4d0ab 100644 --- a/venus-shared/actors/builtin/verifreg/actor.go +++ b/venus-shared/actors/builtin/verifreg/actor.go @@ -23,6 +23,8 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" @@ -55,11 +57,15 @@ func init() { return load6(store, root) }) + builtin.RegisterActorState(builtin7.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } var ( - Address = builtin6.VerifiedRegistryActorAddr - Methods = builtin6.MethodsVerifiedRegistry + Address = builtin7.VerifiedRegistryActorAddr + Methods = builtin7.MethodsVerifiedRegistry ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -83,6 +89,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.VerifiedRegistryActorCodeID: return load6(store, act.Head) + case builtin7.VerifiedRegistryActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -108,6 +117,9 @@ func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Addres case actors.Version6: return make6(store, rootKeyAddress) + case actors.Version7: + return make7(store, rootKeyAddress) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -133,6 +145,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.VerifiedRegistryActorCodeID, nil + case actors.Version7: + return builtin7.VerifiedRegistryActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/venus-shared/actors/builtin/verifreg/state.v7.go b/venus-shared/actors/builtin/verifreg/state.v7.go new file mode 100644 index 0000000000..077e3ddc06 --- /dev/null +++ b/venus-shared/actors/builtin/verifreg/state.v7.go @@ -0,0 +1,77 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + +package verifreg + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, rootKeyAddress address.Address) (State, error) { + out := state7{store: store} + + s, err := verifreg7.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state7 struct { + verifreg7.State + store adt.Store +} + +func (s *state7) RootKey() (address.Address, error) { + return s.State.RootKey, nil +} + +func (s *state7) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version7, s.verifiedClients, addr) +} + +func (s *state7) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version7, s.verifiers, addr) +} + +func (s *state7) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version7, s.verifiers, cb) +} + +func (s *state7) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version7, s.verifiedClients, cb) +} + +func (s *state7) verifiedClients() (adt.Map, error) { + return adt7.AsMap(s.store, s.VerifiedClients, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) verifiers() (adt.Map, error) { + return adt7.AsMap(s.store, s.Verifiers, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/venus-shared/actors/policy/policy.go b/venus-shared/actors/policy/policy.go index d11356ccd1..0dd81ef088 100644 --- a/venus-shared/actors/policy/policy.go +++ b/venus-shared/actors/policy/policy.go @@ -42,14 +42,19 @@ import ( miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" - paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" + verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" + + paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" ) const ( - ChainFinality = miner6.ChainFinality + ChainFinality = miner7.ChainFinality SealRandomnessLookback = ChainFinality - PaychSettleDelay = paych6.SettleDelay - MaxPreCommitRandomnessLookback = builtin6.EpochsInDay + SealRandomnessLookback + PaychSettleDelay = paych7.SettleDelay + MaxPreCommitRandomnessLookback = builtin7.EpochsInDay + SealRandomnessLookback ) // SetSupportedProofTypes sets supported proof types, across all actor versions. @@ -74,6 +79,8 @@ func SetSupportedProofTypes(types ...abi.RegisteredSealProof) { miner6.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner7.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + AddSupportedProofTypes(types...) } @@ -121,6 +128,15 @@ func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { miner6.WindowPoStProofTypes[wpp] = struct{}{} + miner7.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err = t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner7.WindowPoStProofTypes[wpp] = struct{}{} + } } @@ -141,11 +157,13 @@ func SetPreCommitChallengeDelay(delay abi.ChainEpoch) { miner6.PreCommitChallengeDelay = delay + miner7.PreCommitChallengeDelay = delay + } // TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. func GetPreCommitChallengeDelay() abi.ChainEpoch { - return miner6.PreCommitChallengeDelay + return miner7.PreCommitChallengeDelay } // SetConsensusMinerMinPower sets the minimum power of an individual miner must @@ -175,6 +193,10 @@ func SetConsensusMinerMinPower(p abi.StoragePower) { policy.ConsensusMinerMinPower = p } + for _, policy := range builtin7.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + } // SetMinVerifiedDealSize sets the minimum size of a verified deal. This should @@ -193,6 +215,8 @@ func SetMinVerifiedDealSize(size abi.StoragePower) { verifreg6.MinVerifiedDealSize = size + verifreg7.MinVerifiedDealSize = size + } func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { @@ -222,6 +246,10 @@ func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (a return miner6.MaxProveCommitDuration[t], nil + case actors.Version7: + + return miner7.MaxProveCommitDuration[t], nil + default: return 0, xerrors.Errorf("unsupported actors version") } @@ -257,6 +285,11 @@ func SetProviderCollateralSupplyTarget(num, denom big.Int) { Denominator: denom, } + market7.ProviderCollateralSupplyTarget = builtin7.BigFrac{ + Numerator: num, + Denominator: denom, + } + } func DealProviderCollateralBounds( @@ -300,13 +333,18 @@ func DealProviderCollateralBounds( min, max := market6.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) return min, max, nil + case actors.Version7: + + min, max := market7.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + default: return big.Zero(), big.Zero(), xerrors.Errorf("unsupported actors version") } } func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) { - return market6.DealDurationBounds(pieceSize) + return market7.DealDurationBounds(pieceSize) } // Sets the challenge window and scales the proving period to match (such that @@ -347,6 +385,13 @@ func SetWPoStChallengeWindow(period abi.ChainEpoch) { // scale it if we're scaling the challenge period. miner6.WPoStDisputeWindow = period * 30 + miner7.WPoStChallengeWindow = period + miner7.WPoStProvingPeriod = period * abi.ChainEpoch(miner7.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner7.WPoStDisputeWindow = period * 30 + } func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { @@ -359,15 +404,15 @@ func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { } func GetMaxSectorExpirationExtension() abi.ChainEpoch { - return miner6.MaxSectorExpirationExtension + return miner7.MaxSectorExpirationExtension } func GetMinSectorExpiration() abi.ChainEpoch { - return miner6.MinSectorExpiration + return miner7.MinSectorExpiration } func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, error) { - sectorsPerPart, err := builtin6.PoStProofWindowPoStPartitionSectors(p) + sectorsPerPart, err := builtin7.PoStProofWindowPoStPartitionSectors(p) if err != nil { return 0, err } @@ -380,8 +425,8 @@ func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, e func GetDefaultSectorSize() abi.SectorSize { // supported sector sizes are the same across versions. - szs := make([]abi.SectorSize, 0, len(miner6.PreCommitSealProofTypesV8)) - for spt := range miner6.PreCommitSealProofTypesV8 { + szs := make([]abi.SectorSize, 0, len(miner7.PreCommitSealProofTypesV8)) + for spt := range miner7.PreCommitSealProofTypesV8 { ss, err := spt.SectorSize() if err != nil { panic(err) @@ -406,7 +451,7 @@ func GetSectorMaxLifetime(proof abi.RegisteredSealProof, nwVer network.Version) return builtin4.SealProofPoliciesV0[proof].SectorMaxLifetime } - return builtin6.SealProofPoliciesV11[proof].SectorMaxLifetime + return builtin7.SealProofPoliciesV11[proof].SectorMaxLifetime } func GetAddressedSectorsMax(nwVer network.Version) (int, error) { @@ -434,6 +479,9 @@ func GetAddressedSectorsMax(nwVer network.Version) (int, error) { case actors.Version6: return miner6.AddressedSectorsMax, nil + case actors.Version7: + return miner7.AddressedSectorsMax, nil + default: return 0, xerrors.Errorf("unsupported network version") } @@ -471,6 +519,10 @@ func GetDeclarationsMax(nwVer network.Version) (int, error) { return miner6.DeclarationsMax, nil + case actors.Version7: + + return miner7.DeclarationsMax, nil + default: return 0, xerrors.Errorf("unsupported network version") } @@ -507,6 +559,10 @@ func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, ba return miner6.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + case actors.Version7: + + return miner7.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + default: return big.Zero(), xerrors.Errorf("unsupported network version") } @@ -543,6 +599,10 @@ func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, base return miner6.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + case actors.Version7: + + return miner7.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + default: return big.Zero(), xerrors.Errorf("unsupported network version") } diff --git a/venus-shared/actors/version.go b/venus-shared/actors/version.go index 744c3c2776..338cc75700 100644 --- a/venus-shared/actors/version.go +++ b/venus-shared/actors/version.go @@ -10,9 +10,21 @@ import ( type Version int -var LatestVersion = 6 +/* inline-gen template -var Versions = []int{0, 2, 3, 4, 5, LatestVersion} +var LatestVersion = {{.latestActorsVersion}} + +var Versions = []int{ {{range .actorVersions}} {{.}}, {{end}} } + +const ({{range .actorVersions}} + Version{{.}} Version = {{.}}{{end}} +) + +/* inline-gen start */ + +var LatestVersion = 7 + +var Versions = []int{0, 2, 3, 4, 5, 6, 7} const ( Version0 Version = 0 @@ -21,8 +33,11 @@ const ( Version4 Version = 4 Version5 Version = 5 Version6 Version = 6 + Version7 Version = 7 ) +/* inline-gen end */ + // Converts a network version into an actors adt version. func VersionForNetwork(version network.Version) (Version, error) { switch version { @@ -38,6 +53,8 @@ func VersionForNetwork(version network.Version) (Version, error) { return Version5, nil case network.Version14: return Version6, nil + case network.Version15: + return Version7, nil default: return -1, fmt.Errorf("unsupported network version %d", version) } diff --git a/venus-shared/compatible-checks/actor-sources.txt b/venus-shared/compatible-checks/actor-sources.txt index 72805828c6..6a6f4d2fa3 100644 --- a/venus-shared/compatible-checks/actor-sources.txt +++ b/venus-shared/compatible-checks/actor-sources.txt @@ -14,6 +14,7 @@ SOURCES IN chain/actors: builtin/account/v4.go builtin/account/v5.go builtin/account/v6.go + builtin/account/v7.go builtin/builtin.go builtin/cron/cron.go builtin/cron/v0.go @@ -22,6 +23,7 @@ SOURCES IN chain/actors: builtin/cron/v4.go builtin/cron/v5.go builtin/cron/v6.go + builtin/cron/v7.go builtin/init/diff.go builtin/init/init.go builtin/init/v0.go @@ -30,6 +32,7 @@ SOURCES IN chain/actors: builtin/init/v4.go builtin/init/v5.go builtin/init/v6.go + builtin/init/v7.go builtin/market/diff.go builtin/market/market.go builtin/market/v0.go @@ -38,6 +41,7 @@ SOURCES IN chain/actors: builtin/market/v4.go builtin/market/v5.go builtin/market/v6.go + builtin/market/v7.go builtin/miner/diff.go builtin/miner/diff_deadlines.go builtin/miner/miner.go @@ -48,6 +52,7 @@ SOURCES IN chain/actors: builtin/miner/v4.go builtin/miner/v5.go builtin/miner/v6.go + builtin/miner/v7.go builtin/multisig/diff.go builtin/multisig/message0.go builtin/multisig/message2.go @@ -55,6 +60,7 @@ SOURCES IN chain/actors: builtin/multisig/message4.go builtin/multisig/message5.go builtin/multisig/message6.go + builtin/multisig/message7.go builtin/multisig/multisig.go builtin/multisig/v0.go builtin/multisig/v2.go @@ -62,12 +68,14 @@ SOURCES IN chain/actors: builtin/multisig/v4.go builtin/multisig/v5.go builtin/multisig/v6.go + builtin/multisig/v7.go builtin/paych/message0.go builtin/paych/message2.go builtin/paych/message3.go builtin/paych/message4.go builtin/paych/message5.go builtin/paych/message6.go + builtin/paych/message7.go builtin/paych/mock/mock.go builtin/paych/paych.go builtin/paych/v0.go @@ -76,6 +84,7 @@ SOURCES IN chain/actors: builtin/paych/v4.go builtin/paych/v5.go builtin/paych/v6.go + builtin/paych/v7.go builtin/power/diff.go builtin/power/power.go builtin/power/v0.go @@ -84,6 +93,7 @@ SOURCES IN chain/actors: builtin/power/v4.go builtin/power/v5.go builtin/power/v6.go + builtin/power/v7.go builtin/reward/reward.go builtin/reward/v0.go builtin/reward/v2.go @@ -91,6 +101,7 @@ SOURCES IN chain/actors: builtin/reward/v4.go builtin/reward/v5.go builtin/reward/v6.go + builtin/reward/v7.go builtin/system/system.go builtin/system/v0.go builtin/system/v2.go @@ -98,6 +109,7 @@ SOURCES IN chain/actors: builtin/system/v4.go builtin/system/v5.go builtin/system/v6.go + builtin/system/v7.go builtin/verifreg/util.go builtin/verifreg/v0.go builtin/verifreg/v2.go @@ -105,6 +117,7 @@ SOURCES IN chain/actors: builtin/verifreg/v4.go builtin/verifreg/v5.go builtin/verifreg/v6.go + builtin/verifreg/v7.go builtin/verifreg/verifreg.go params.go policy/policy.go diff --git a/venus-shared/go.mod b/venus-shared/go.mod index 7deb1e398c..44f611b05b 100644 --- a/venus-shared/go.mod +++ b/venus-shared/go.mod @@ -7,13 +7,14 @@ require ( github.com/filecoin-project/go-address v0.0.5 github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec - github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379 + github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/specs-actors v0.9.13 github.com/filecoin-project/specs-actors/v2 v2.3.5 github.com/filecoin-project/specs-actors/v3 v3.1.1 github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 + github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec github.com/ipfs/go-block-format v0.0.3 github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-ipld-cbor v0.0.5 diff --git a/venus-shared/go.sum b/venus-shared/go.sum index c88d641be5..ca7fb51ed5 100644 --- a/venus-shared/go.sum +++ b/venus-shared/go.sum @@ -57,8 +57,8 @@ github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379 h1:UmKkt13NrtulubqfNXhG7SQ7Pjza8BeKdNBxngqAo64= -github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= +github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/specs-actors v0.9.13 h1:rUEOQouefi9fuVY/2HOroROJlZbOzWYXXeIh41KF2M4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= @@ -72,8 +72,11 @@ github.com/filecoin-project/specs-actors/v4 v4.0.1 h1:AiWrtvJZ63MHGe6rn7tPu4nSUY github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= +github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= From de6377c2b7d745987446d670b14d387cb6dd20a9 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Fri, 24 Dec 2021 15:11:52 +0800 Subject: [PATCH 080/167] use the shared API (#4639) * use the shared API --- .circleci/config.yml | 6 +- app/client/apiface/chain.go | 9 +- app/client/apiface/network.go | 2 +- app/client/apiface/paych.go | 8 +- app/client/apiface/v0api/chain.go | 9 +- app/client/apiface/v0api/network.go | 3 +- app/client/apiface/v0api/paych.go | 8 +- app/client/full.go | 32 +++--- app/client/funcrule/permissioned.go | 5 +- app/client/v0api/full.go | 32 +++--- app/node/env.go | 25 ++--- app/node/node.go | 18 ++-- app/node/rpc.go | 11 +- app/submodule/blockstore/blockstore_api.go | 4 +- .../blockstore/blockstore_submodule.go | 5 +- app/submodule/chain/account_api.go | 6 +- app/submodule/chain/actor_api.go | 6 +- app/submodule/chain/beacon_api.go | 6 +- app/submodule/chain/chain_api.go | 14 +-- app/submodule/chain/chain_submodule.go | 10 +- app/submodule/chain/chaininfo_api.go | 20 ++-- app/submodule/chain/miner_api.go | 13 ++- app/submodule/chain/v0api/chaininfo_v0api.go | 6 +- app/submodule/config/config.go | 12 ++- app/submodule/config/config_api.go | 3 +- app/submodule/dagservice/blockservice_api.go | 6 +- .../dagservice/blockservice_submoodule.go | 16 ++- app/submodule/discovery/discovery_api.go | 6 +- .../discovery/discovery_submodule.go | 6 +- app/submodule/market/market_api.go | 6 +- app/submodule/market/market_submodule.go | 10 +- app/submodule/mining/mining_api.go | 4 +- app/submodule/mining/mining_submodule.go | 6 +- app/submodule/mpool/mpool_api.go | 4 +- app/submodule/mpool/mpool_submodule.go | 8 +- app/submodule/multisig/multisig_api.go | 6 +- app/submodule/multisig/multisig_submodule.go | 16 +-- .../multisig/v0api/multisig_v0api.go | 8 +- app/submodule/network/network_api.go | 6 +- app/submodule/network/network_submodule.go | 10 +- app/submodule/network/v0api/v1_wrapper.go | 6 +- app/submodule/paych/paych_api.go | 7 +- app/submodule/paych/paych_submodule.go | 6 +- app/submodule/syncer/syncer_api.go | 60 ++++++++--- app/submodule/syncer/syncer_submodule.go | 6 +- app/submodule/wallet/wallet_api.go | 17 +-- app/submodule/wallet/wallet_submodule.go | 6 +- cmd/address.go | 3 +- cmd/chain.go | 6 +- cmd/config.go | 102 ------------------ cmd/config_integration_test.go | 83 -------------- cmd/dag.go | 33 ------ cmd/dag_integration_test.go | 49 --------- cmd/dispute.go | 13 ++- cmd/main.go | 4 +- cmd/miner.go | 2 +- cmd/miner_proving.go | 2 +- cmd/paych.go | 3 +- cmd/state.go | 24 +++-- cmd/swarm.go | 5 +- cmd/sync.go | 13 +-- pkg/chain/circulating_supply.go | 36 +++---- pkg/chain/circulating_supply_mock.go | 6 +- pkg/chain/store.go | 22 ++-- pkg/chain/store_test.go | 3 +- pkg/chain/waiter.go | 29 ++--- pkg/chain/waiter_test.go | 4 +- pkg/consensus/expected.go | 2 +- pkg/events/cache.go | 5 +- pkg/events/eventAPI.go | 5 +- pkg/events/events_test.go | 22 ++-- pkg/events/observer.go | 3 +- pkg/fork/fork.go | 3 +- pkg/market/fmgr.go | 8 +- pkg/market/fundmanager.go | 9 +- pkg/net/network.go | 68 ++---------- pkg/paychmgr/manager.go | 42 ++------ pkg/paychmgr/paych.go | 7 +- pkg/paychmgr/simple.go | 9 +- tools/client/main.go | 2 +- tools/conformance/rand_record.go | 6 +- tools/fast/action_swarm.go | 6 +- tools/gen/api/stable_method_info.json | 4 +- venus-devtool/apigen/proxygen.go | 11 +- venus-devtool/go.mod | 1 + venus-devtool/go.sum | 7 +- venus-shared/api/chain/types.go | 16 +++ venus-shared/api/chain/v0/blockstore.go | 2 +- venus-shared/api/chain/v0/chain.go | 2 +- venus-shared/api/chain/v0/discovery.go | 2 +- venus-shared/api/chain/v0/fullnode.go | 2 +- venus-shared/api/chain/v0/jwtauth.go | 2 +- venus-shared/api/chain/v0/market.go | 2 +- venus-shared/api/chain/v0/mining.go | 2 +- venus-shared/api/chain/v0/mpool.go | 2 +- venus-shared/api/chain/v0/multisig.go | 2 +- venus-shared/api/chain/v0/network.go | 2 +- venus-shared/api/chain/v0/paych.go | 2 +- venus-shared/api/chain/v0/proxy_gen.go | 8 +- venus-shared/api/chain/v0/syncer.go | 6 +- venus-shared/api/chain/v0/wallet.go | 2 +- venus-shared/api/chain/v1/jwtauth.go | 2 +- venus-shared/api/chain/v1/paych.go | 6 +- venus-shared/api/chain/v1/proxy_gen.go | 18 ++-- venus-shared/api/chain/v1/syncer.go | 4 +- venus-shared/api/chain/v1/wallet.go | 2 +- .../compatible-checks/api-permission.json | 18 ++-- 107 files changed, 485 insertions(+), 780 deletions(-) delete mode 100644 cmd/config.go delete mode 100644 cmd/config_integration_test.go delete mode 100644 cmd/dag.go delete mode 100644 cmd/dag_integration_test.go diff --git a/.circleci/config.yml b/.circleci/config.yml index 7abb84fbd3..da9392ecff 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -200,9 +200,9 @@ jobs: cmd: "lint" - go_build: cmd: "build" - - go_build: - cmd: "gen-api" - - check_file_change + #- go_build: + # cmd: "gen-api" + #- check_file_change # place the filecoin binary in PATH for IPTB - go_build: cmd: "install" diff --git a/app/client/apiface/chain.go b/app/client/apiface/chain.go index f912d896b0..7494f2e0a3 100644 --- a/app/client/apiface/chain.go +++ b/app/client/apiface/chain.go @@ -8,7 +8,6 @@ import ( "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" types "github.com/filecoin-project/venus/venus-shared/chain" @@ -86,7 +85,7 @@ type IChainInfo interface { // Rule[perm:read] StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) // Rule[perm:read] - ChainNotify(ctx context.Context) <-chan []*chain.HeadChange + ChainNotify(ctx context.Context) <-chan []*apitypes.HeadChange // Rule[perm:read] GetFullBlock(ctx context.Context, id cid.Cid) (*types.FullBlock, error) // Rule[perm:read] @@ -96,7 +95,7 @@ type IChainInfo interface { // Rule[perm:read] GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*types.BeaconEntry, error) // Rule[perm:read] - MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*chain.ChainMessage, error) + MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*apitypes.ChainMessage, error) // Rule[perm:read] ProtocolParameters(ctx context.Context) (*apitypes.ProtocolParams, error) // Rule[perm:read] @@ -148,7 +147,7 @@ type IChainInfo interface { // Rule[perm:read] ChainExport(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []byte, error) // Rule[perm:read] - ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*chain.HeadChange, error) + ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*apitypes.HeadChange, error) } type IMinerState interface { @@ -185,7 +184,7 @@ type IMinerState interface { // Rule[perm:read] StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) // Rule[perm:read] - StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (chain.CirculatingSupply, error) + StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) // Rule[perm:read] StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) // Rule[perm:read] diff --git a/app/client/apiface/network.go b/app/client/apiface/network.go index 41a71743ee..b95c832392 100644 --- a/app/client/apiface/network.go +++ b/app/client/apiface/network.go @@ -8,8 +8,8 @@ import ( "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" - "github.com/filecoin-project/venus/pkg/net" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + "github.com/filecoin-project/venus/venus-shared/libp2p/net" ) type INetwork interface { diff --git a/app/client/apiface/paych.go b/app/client/apiface/paych.go index 04df2757b6..b886670033 100644 --- a/app/client/apiface/paych.go +++ b/app/client/apiface/paych.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/specs-actors/actors/builtin/paych" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/paychmgr" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" paychtypes "github.com/filecoin-project/venus/venus-shared/paych" ) @@ -22,12 +22,12 @@ type IPaychan interface { // PaychAvailableFunds get the status of an outbound payment channel // @pch: payment channel address // Rule[perm:sign] - PaychAvailableFunds(ctx context.Context, ch address.Address) (*paychmgr.ChannelAvailableFunds, error) + PaychAvailableFunds(ctx context.Context, ch address.Address) (*apitypes.ChannelAvailableFunds, error) // PaychAvailableFundsByFromTo get the status of an outbound payment channel // @from: the payment channel sender // @to: he payment channel recipient // Rule[perm:sign] - PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*paychmgr.ChannelAvailableFunds, error) + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*apitypes.ChannelAvailableFunds, error) // PaychGetWaitReady waits until the create channel / add funds message with the sentinel // @sentinel: given message CID arrives. // @ch: the returned channel address can safely be used against the Manager methods. @@ -87,7 +87,7 @@ type IPaychan interface { // If there are insufficient funds in the channel to create the voucher, // returns a nil voucher and the shortfall. // Rule[perm:sign] - PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paychmgr.VoucherCreateResult, error) + PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paychtypes.VoucherCreateResult, error) // PaychVoucherList list vouchers in payment channel // @pch: payment channel address // Rule[perm:write] diff --git a/app/client/apiface/v0api/chain.go b/app/client/apiface/v0api/chain.go index 1e42deded4..762112c77d 100644 --- a/app/client/apiface/v0api/chain.go +++ b/app/client/apiface/v0api/chain.go @@ -13,7 +13,6 @@ import ( "github.com/filecoin-project/go-state-types/network" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" types "github.com/filecoin-project/venus/venus-shared/chain" @@ -80,7 +79,7 @@ type IChainInfo interface { // Rule[perm:read] StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) // Rule[perm:read] - ChainNotify(ctx context.Context) <-chan []*chain.HeadChange + ChainNotify(ctx context.Context) <-chan []*apitypes.HeadChange // Rule[perm:read] GetFullBlock(ctx context.Context, id cid.Cid) (*types.FullBlock, error) // Rule[perm:read] @@ -90,7 +89,7 @@ type IChainInfo interface { // Rule[perm:read] GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*types.BeaconEntry, error) // Rule[perm:read] - MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*chain.ChainMessage, error) + MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*apitypes.ChainMessage, error) // Rule[perm:read] ProtocolParameters(ctx context.Context) (*apitypes.ProtocolParams, error) // Rule[perm:read] @@ -114,7 +113,7 @@ type IChainInfo interface { // Rule[perm:read] ChainExport(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []byte, error) // Rule[perm:read] - ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*chain.HeadChange, error) + ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*apitypes.HeadChange, error) } type IMinerState interface { @@ -151,7 +150,7 @@ type IMinerState interface { // Rule[perm:read] StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) // Rule[perm:read] - StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (chain.CirculatingSupply, error) + StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) // Rule[perm:read] StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) // Rule[perm:read] diff --git a/app/client/apiface/v0api/network.go b/app/client/apiface/v0api/network.go index 9f7464bb6a..1229741989 100644 --- a/app/client/apiface/v0api/network.go +++ b/app/client/apiface/v0api/network.go @@ -4,8 +4,7 @@ import ( "context" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - - "github.com/filecoin-project/venus/pkg/net" + "github.com/filecoin-project/venus/venus-shared/libp2p/net" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/peer" diff --git a/app/client/apiface/v0api/paych.go b/app/client/apiface/v0api/paych.go index ee4115b038..30ec19f238 100644 --- a/app/client/apiface/v0api/paych.go +++ b/app/client/apiface/v0api/paych.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/specs-actors/actors/builtin/paych" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/paychmgr" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" paychtypes "github.com/filecoin-project/venus/venus-shared/paych" ) @@ -22,12 +22,12 @@ type IPaychan interface { // PaychAvailableFunds get the status of an outbound payment channel // @pch: payment channel address // Rule[perm:sign] - PaychAvailableFunds(ctx context.Context, ch address.Address) (*paychmgr.ChannelAvailableFunds, error) + PaychAvailableFunds(ctx context.Context, ch address.Address) (*apitypes.ChannelAvailableFunds, error) // PaychAvailableFundsByFromTo get the status of an outbound payment channel // @from: the payment channel sender // @to: he payment channel recipient // Rule[perm:sign] - PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*paychmgr.ChannelAvailableFunds, error) + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*apitypes.ChannelAvailableFunds, error) // PaychGetWaitReady waits until the create channel / add funds message with the sentinel // @sentinel: given message CID arrives. // @ch: the returned channel address can safely be used against the Manager methods. @@ -87,7 +87,7 @@ type IPaychan interface { // If there are insufficient funds in the channel to create the voucher, // returns a nil voucher and the shortfall. // Rule[perm:sign] - PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paychmgr.VoucherCreateResult, error) + PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paychtypes.VoucherCreateResult, error) // PaychVoucherList list vouchers in payment channel // @pch: payment channel address // Rule[perm:write] diff --git a/app/client/full.go b/app/client/full.go index 71acf4a71f..cf00e83dfd 100644 --- a/app/client/full.go +++ b/app/client/full.go @@ -13,14 +13,12 @@ import ( "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-actors/actors/builtin/paych" - "github.com/filecoin-project/venus/pkg/chain" syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/net" - "github.com/filecoin-project/venus/pkg/paychmgr" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/libp2p/net" "github.com/filecoin-project/venus/venus-shared/messagepool" paychtypes "github.com/filecoin-project/venus/venus-shared/paych" "github.com/filecoin-project/venus/venus-shared/wallet" @@ -128,7 +126,7 @@ type IChainInfoStruct struct { ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]apitypes.Message, error) `perm:"read"` ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]apitypes.Message, error) `perm:"read"` ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` - ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*chain.HeadChange, error) `perm:"read"` + ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*apitypes.HeadChange, error) `perm:"read"` ChainGetRandomnessFromBeacon func(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` ChainGetRandomnessFromTickets func(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` ChainGetReceipts func(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) `perm:"read"` @@ -137,13 +135,13 @@ type IChainInfoStruct struct { ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"` ChainList func(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) `perm:"read"` - ChainNotify func(p0 context.Context) <-chan []*chain.HeadChange `perm:"read"` + ChainNotify func(p0 context.Context) <-chan []*apitypes.HeadChange `perm:"read"` ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` GetActor func(p0 context.Context, p1 address.Address) (*types.Actor, error) `perm:"read"` GetEntry func(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) `perm:"read"` GetFullBlock func(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) `perm:"read"` GetParentStateRootActor func(p0 context.Context, p1 *types.TipSet, p2 address.Address) (*types.Actor, error) `perm:"read"` - MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*chain.ChainMessage, error) `perm:"read"` + MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*apitypes.ChainMessage, error) `perm:"read"` ProtocolParameters func(p0 context.Context) (*apitypes.ProtocolParams, error) `perm:"read"` ResolveToKeyAddr func(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) `perm:"read"` StateGetRandomnessFromBeacon func(p0 context.Context, p1 acrypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) `perm:"read"` @@ -190,7 +188,7 @@ func (s *IChainInfoStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid return s.Internal.ChainGetParentReceipts(p0, p1) } -func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*chain.HeadChange, error) { +func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*apitypes.HeadChange, error) { return s.Internal.ChainGetPath(p0, p1, p2) } @@ -226,7 +224,7 @@ func (s *IChainInfoStruct) ChainList(p0 context.Context, p1 types.TipSetKey, p2 return s.Internal.ChainList(p0, p1, p2) } -func (s *IChainInfoStruct) ChainNotify(p0 context.Context) <-chan []*chain.HeadChange { +func (s *IChainInfoStruct) ChainNotify(p0 context.Context) <-chan []*apitypes.HeadChange { return s.Internal.ChainNotify(p0) } @@ -250,7 +248,7 @@ func (s *IChainInfoStruct) GetParentStateRootActor(p0 context.Context, p1 *types return s.Internal.GetParentStateRootActor(p0, p1, p2) } -func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*chain.ChainMessage, error) { +func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*apitypes.ChainMessage, error) { return s.Internal.MessageWait(p0, p1, p2, p3) } @@ -526,7 +524,7 @@ type IMinerStateStruct struct { StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` StateSectorPartition func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` - StateVMCirculatingSupplyInternal func(p0 context.Context, p1 types.TipSetKey) (chain.CirculatingSupply, error) `perm:"read"` + StateVMCirculatingSupplyInternal func(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) `perm:"read"` StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` } } @@ -643,7 +641,7 @@ func (s *IMinerStateStruct) StateSectorPreCommitInfo(p0 context.Context, p1 addr return s.Internal.StateSectorPreCommitInfo(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 types.TipSetKey) (chain.CirculatingSupply, error) { +func (s *IMinerStateStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) { return s.Internal.StateVMCirculatingSupplyInternal(p0, p1) } @@ -794,8 +792,8 @@ func (s *INetworkStruct) Version(p0 context.Context) (apitypes.Version, error) { type IPaychanStruct struct { Internal struct { PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` - PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"sign"` - PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*apitypes.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*apitypes.ChannelAvailableFunds, error) `perm:"sign"` PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paychtypes.ChannelInfo, error) `perm:"sign"` PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` @@ -806,7 +804,7 @@ type IPaychanStruct struct { PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` - PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychmgr.VoucherCreateResult, error) `perm:"sign"` + PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychtypes.VoucherCreateResult, error) `perm:"sign"` PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` } @@ -816,11 +814,11 @@ func (s *IPaychanStruct) PaychAllocateLane(p0 context.Context, p1 address.Addres return s.Internal.PaychAllocateLane(p0, p1) } -func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*paychmgr.ChannelAvailableFunds, error) { +func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*apitypes.ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFunds(p0, p1) } -func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*paychmgr.ChannelAvailableFunds, error) { +func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*apitypes.ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFundsByFromTo(p0, p1, p2) } @@ -864,7 +862,7 @@ func (s *IPaychanStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.A return s.Internal.PaychVoucherCheckValid(p0, p1, p2) } -func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychmgr.VoucherCreateResult, error) { +func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychtypes.VoucherCreateResult, error) { return s.Internal.PaychVoucherCreate(p0, p1, p2, p3) } diff --git a/app/client/funcrule/permissioned.go b/app/client/funcrule/permissioned.go index 9c41d35e08..96e700b3b4 100644 --- a/app/client/funcrule/permissioned.go +++ b/app/client/funcrule/permissioned.go @@ -2,9 +2,10 @@ package funcrule import ( "context" - "github.com/filecoin-project/venus/pkg/util/proxy" "reflect" + "github.com/filecoin-project/venus/pkg/util/proxy" + "github.com/filecoin-project/go-jsonrpc/auth" "golang.org/x/xerrors" ) @@ -46,7 +47,7 @@ func PermissionProxy(in interface{}, out interface{}) { panic("missing 'perm' tag on " + field.Name) // ok } curule := defaultRule() - curule.Perm = auth.Permission(requiredPerm) + curule.Perm = requiredPerm fn := ra.Method(i) rint.FieldByName(methodName).Set(reflect.MakeFunc(field.Type, func(args []reflect.Value) (results []reflect.Value) { diff --git a/app/client/v0api/full.go b/app/client/v0api/full.go index 51ab9ddc4d..7fc28845de 100644 --- a/app/client/v0api/full.go +++ b/app/client/v0api/full.go @@ -13,14 +13,12 @@ import ( "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-actors/actors/builtin/paych" - "github.com/filecoin-project/venus/pkg/chain" syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/pkg/net" - "github.com/filecoin-project/venus/pkg/paychmgr" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/libp2p/net" "github.com/filecoin-project/venus/venus-shared/messagepool" paychtypes "github.com/filecoin-project/venus/venus-shared/paych" "github.com/filecoin-project/venus/venus-shared/wallet" @@ -128,7 +126,7 @@ type IChainInfoStruct struct { ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]apitypes.Message, error) `perm:"read"` ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]apitypes.Message, error) `perm:"read"` ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` - ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*chain.HeadChange, error) `perm:"read"` + ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*apitypes.HeadChange, error) `perm:"read"` ChainGetRandomnessFromBeacon func(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` ChainGetRandomnessFromTickets func(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` ChainGetReceipts func(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) `perm:"read"` @@ -136,13 +134,13 @@ type IChainInfoStruct struct { ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"` ChainList func(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) `perm:"read"` - ChainNotify func(p0 context.Context) <-chan []*chain.HeadChange `perm:"read"` + ChainNotify func(p0 context.Context) <-chan []*apitypes.HeadChange `perm:"read"` ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` GetActor func(p0 context.Context, p1 address.Address) (*types.Actor, error) `perm:"read"` GetEntry func(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) `perm:"read"` GetFullBlock func(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) `perm:"read"` GetParentStateRootActor func(p0 context.Context, p1 *types.TipSet, p2 address.Address) (*types.Actor, error) `perm:"read"` - MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*chain.ChainMessage, error) `perm:"read"` + MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*apitypes.ChainMessage, error) `perm:"read"` ProtocolParameters func(p0 context.Context) (*apitypes.ProtocolParams, error) `perm:"read"` ResolveToKeyAddr func(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) `perm:"read"` StateGetReceipt func(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) `perm:"read"` @@ -190,7 +188,7 @@ func (s *IChainInfoStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid return s.Internal.ChainGetParentReceipts(p0, p1) } -func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*chain.HeadChange, error) { +func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*apitypes.HeadChange, error) { return s.Internal.ChainGetPath(p0, p1, p2) } @@ -222,7 +220,7 @@ func (s *IChainInfoStruct) ChainList(p0 context.Context, p1 types.TipSetKey, p2 return s.Internal.ChainList(p0, p1, p2) } -func (s *IChainInfoStruct) ChainNotify(p0 context.Context) <-chan []*chain.HeadChange { +func (s *IChainInfoStruct) ChainNotify(p0 context.Context) <-chan []*apitypes.HeadChange { return s.Internal.ChainNotify(p0) } @@ -246,7 +244,7 @@ func (s *IChainInfoStruct) GetParentStateRootActor(p0 context.Context, p1 *types return s.Internal.GetParentStateRootActor(p0, p1, p2) } -func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*chain.ChainMessage, error) { +func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*apitypes.ChainMessage, error) { return s.Internal.MessageWait(p0, p1, p2, p3) } @@ -511,7 +509,7 @@ type IMinerStateStruct struct { StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` StateSectorPartition func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` - StateVMCirculatingSupplyInternal func(p0 context.Context, p1 types.TipSetKey) (chain.CirculatingSupply, error) `perm:"read"` + StateVMCirculatingSupplyInternal func(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) `perm:"read"` StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` } } @@ -628,7 +626,7 @@ func (s *IMinerStateStruct) StateSectorPreCommitInfo(p0 context.Context, p1 addr return s.Internal.StateSectorPreCommitInfo(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 types.TipSetKey) (chain.CirculatingSupply, error) { +func (s *IMinerStateStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) { return s.Internal.StateVMCirculatingSupplyInternal(p0, p1) } @@ -779,8 +777,8 @@ func (s *INetworkStruct) Version(p0 context.Context) (apitypes.Version, error) { type IPaychanStruct struct { Internal struct { PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` - PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"sign"` - PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*paychmgr.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*apitypes.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*apitypes.ChannelAvailableFunds, error) `perm:"sign"` PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paychtypes.ChannelInfo, error) `perm:"sign"` PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` @@ -791,7 +789,7 @@ type IPaychanStruct struct { PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` - PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychmgr.VoucherCreateResult, error) `perm:"sign"` + PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychtypes.VoucherCreateResult, error) `perm:"sign"` PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` } @@ -801,11 +799,11 @@ func (s *IPaychanStruct) PaychAllocateLane(p0 context.Context, p1 address.Addres return s.Internal.PaychAllocateLane(p0, p1) } -func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*paychmgr.ChannelAvailableFunds, error) { +func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*apitypes.ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFunds(p0, p1) } -func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*paychmgr.ChannelAvailableFunds, error) { +func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*apitypes.ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFundsByFromTo(p0, p1, p2) } @@ -849,7 +847,7 @@ func (s *IPaychanStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.A return s.Internal.PaychVoucherCheckValid(p0, p1, p2) } -func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychmgr.VoucherCreateResult, error) { +func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychtypes.VoucherCreateResult, error) { return s.Internal.PaychVoucherCreate(p0, p1, p2, p3) } diff --git a/app/node/env.go b/app/node/env.go index bd083b2726..6c71ad919d 100644 --- a/app/node/env.go +++ b/app/node/env.go @@ -5,30 +5,27 @@ import ( cmds "github.com/ipfs/go-ipfs-cmds" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/filecoin-project/venus/app/submodule/storagenetworking" + v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" ) // Env is the environment for command API handlers. type Env struct { ctx context.Context InspectorAPI IInspector - BlockServiceAPI apiface.IDagService - BlockStoreAPI apiface.IBlockStore - ChainAPI apiface.IChain - ConfigAPI apiface.IConfig - DiscoveryAPI apiface.IDiscovery - NetworkAPI apiface.INetwork + BlockStoreAPI v1api.IBlockStore + ChainAPI v1api.IChain + NetworkAPI v1api.INetwork StorageNetworkingAPI storagenetworking.IStorageNetworking - SyncerAPI apiface.ISyncer - WalletAPI apiface.IWallet - MingingAPI apiface.IMining - MessagePoolAPI apiface.IMessagePool + SyncerAPI v1api.ISyncer + WalletAPI v1api.IWallet + MingingAPI v1api.IMining + MessagePoolAPI v1api.IMessagePool MultiSigAPI v0api.IMultiSig - MarketAPI apiface.IMarket - PaychAPI apiface.IPaychan + MarketAPI v1api.IMarket + PaychAPI v1api.IPaychan } var _ cmds.Environment = (*Env)(nil) diff --git a/app/node/node.go b/app/node/node.go index 8f4a62d486..cc4a0fe3a7 100644 --- a/app/node/node.go +++ b/app/node/node.go @@ -2,8 +2,13 @@ package node import ( "context" - "contrib.go.opencensus.io/exporter/jaeger" "fmt" + "net" + "net/http" + "os" + "syscall" + + "contrib.go.opencensus.io/exporter/jaeger" "github.com/awnumar/memguard" "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/venus-auth/cmd/jwtclient" @@ -16,7 +21,7 @@ import ( "github.com/filecoin-project/venus/app/submodule/mining" "github.com/filecoin-project/venus/app/submodule/mpool" "github.com/filecoin-project/venus/app/submodule/multisig" - "github.com/filecoin-project/venus/app/submodule/multisig/v0api" + apiwrapper "github.com/filecoin-project/venus/app/submodule/multisig/v0api" network2 "github.com/filecoin-project/venus/app/submodule/network" "github.com/filecoin-project/venus/app/submodule/paych" "github.com/filecoin-project/venus/app/submodule/storagenetworking" @@ -37,10 +42,6 @@ import ( manet "github.com/multiformats/go-multiaddr/net" "github.com/pkg/errors" "go.opencensus.io/tag" - "net" - "net/http" - "os" - "syscall" ) var log = logging.Logger("node") // nolint: deadcode @@ -350,11 +351,8 @@ func (node *Node) createServerEnv(ctx context.Context) *Env { env := Env{ ctx: ctx, InspectorAPI: NewInspectorAPI(node.repo), - BlockServiceAPI: node.blockservice.API(), BlockStoreAPI: node.blockstore.API(), ChainAPI: node.chain.API(), - ConfigAPI: node.configModule.API(), - DiscoveryAPI: node.discovery.API(), NetworkAPI: node.network.API(), StorageNetworkingAPI: node.storageNetworking.API(), SyncerAPI: node.syncer.API(), @@ -363,7 +361,7 @@ func (node *Node) createServerEnv(ctx context.Context) *Env { MessagePoolAPI: node.mpool.API(), PaychAPI: node.paychan.API(), MarketAPI: node.market.API(), - MultiSigAPI: &v0api.WrapperV1IMultiSig{IMultiSig: node.multiSig.API(), IMessagePool: node.mpool.API()}, + MultiSigAPI: &apiwrapper.WrapperV1IMultiSig{IMultiSig: node.multiSig.API(), IMessagePool: node.mpool.API()}, } return &env diff --git a/app/node/rpc.go b/app/node/rpc.go index 4ced333b69..b4af905ba5 100644 --- a/app/node/rpc.go +++ b/app/node/rpc.go @@ -1,17 +1,14 @@ package node import ( - "github.com/filecoin-project/venus/app/client/funcrule" - "github.com/ipfs-force-community/metrics/ratelimit" "reflect" - "github.com/filecoin-project/venus/app/client/v0api" - "github.com/filecoin-project/go-jsonrpc" - - "golang.org/x/xerrors" - "github.com/filecoin-project/venus/app/client" + "github.com/filecoin-project/venus/app/client/funcrule" + v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + "github.com/ipfs-force-community/metrics/ratelimit" + "golang.org/x/xerrors" ) type RPCService interface { diff --git a/app/submodule/blockstore/blockstore_api.go b/app/submodule/blockstore/blockstore_api.go index 45f21f3b84..8702fee067 100644 --- a/app/submodule/blockstore/blockstore_api.go +++ b/app/submodule/blockstore/blockstore_api.go @@ -11,11 +11,11 @@ import ( "github.com/ipfs/go-merkledag" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/app/client/apiface" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" ) -var _ apiface.IBlockStore = &blockstoreAPI{} +var _ v1api.IBlockStore = &blockstoreAPI{} type blockstoreAPI struct { //nolint blockstore *BlockstoreSubmodule diff --git a/app/submodule/blockstore/blockstore_submodule.go b/app/submodule/blockstore/blockstore_submodule.go index b963897db1..ee41c73f50 100644 --- a/app/submodule/blockstore/blockstore_submodule.go +++ b/app/submodule/blockstore/blockstore_submodule.go @@ -3,9 +3,8 @@ package blockstore import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/filecoin-project/venus/pkg/repo" + v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" bstore "github.com/ipfs/go-ipfs-blockstore" ) @@ -31,7 +30,7 @@ func NewBlockstoreSubmodule(ctx context.Context, repo blockstoreRepo) (*Blocksto }, nil } -func (bsm *BlockstoreSubmodule) API() apiface.IBlockStore { +func (bsm *BlockstoreSubmodule) API() v0api.IBlockStore { return &blockstoreAPI{blockstore: bsm} } diff --git a/app/submodule/chain/account_api.go b/app/submodule/chain/account_api.go index bee1ee6713..86125c9e47 100644 --- a/app/submodule/chain/account_api.go +++ b/app/submodule/chain/account_api.go @@ -3,21 +3,21 @@ package chain import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-address" "golang.org/x/xerrors" ) -var _ apiface.IAccount = &accountAPI{} +var _ v1api.IAccount = &accountAPI{} type accountAPI struct { chain *ChainSubmodule } //NewAccountAPI create a new account api -func NewAccountAPI(chain *ChainSubmodule) apiface.IAccount { +func NewAccountAPI(chain *ChainSubmodule) v1api.IAccount { return &accountAPI{chain: chain} } diff --git a/app/submodule/chain/actor_api.go b/app/submodule/chain/actor_api.go index f6ac184373..b779685cb3 100644 --- a/app/submodule/chain/actor_api.go +++ b/app/submodule/chain/actor_api.go @@ -4,18 +4,18 @@ import ( "context" "github.com/filecoin-project/go-address" - "github.com/filecoin-project/venus/app/client/apiface" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" ) -var _ apiface.IActor = &actorAPI{} +var _ v1api.IActor = &actorAPI{} type actorAPI struct { chain *ChainSubmodule } //NewActorAPI new actor api -func NewActorAPI(chain *ChainSubmodule) apiface.IActor { +func NewActorAPI(chain *ChainSubmodule) v1api.IActor { return &actorAPI{chain: chain} } diff --git a/app/submodule/chain/beacon_api.go b/app/submodule/chain/beacon_api.go index 21e4053555..a99b5b7850 100644 --- a/app/submodule/chain/beacon_api.go +++ b/app/submodule/chain/beacon_api.go @@ -5,19 +5,19 @@ import ( "fmt" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/app/client/apiface" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" xerrors "github.com/pkg/errors" ) -var _ apiface.IBeacon = &beaconAPI{} +var _ v1api.IBeacon = &beaconAPI{} type beaconAPI struct { chain *ChainSubmodule } //NewBeaconAPI create new beacon api -func NewBeaconAPI(chain *ChainSubmodule) apiface.IBeacon { +func NewBeaconAPI(chain *ChainSubmodule) v1api.IBeacon { return &beaconAPI{chain: chain} } diff --git a/app/submodule/chain/chain_api.go b/app/submodule/chain/chain_api.go index 597839f08e..d822962d27 100644 --- a/app/submodule/chain/chain_api.go +++ b/app/submodule/chain/chain_api.go @@ -1,15 +1,15 @@ package chain import ( - "github.com/filecoin-project/venus/app/client/apiface" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" ) type chainAPI struct { // nolint: golint - apiface.IAccount - apiface.IActor - apiface.IBeacon - apiface.IMinerState - apiface.IChainInfo + v1api.IAccount + v1api.IActor + v1api.IBeacon + v1api.IMinerState + v1api.IChainInfo } -var _ apiface.IChain = &chainAPI{} +var _ v1api.IChain = &chainAPI{} diff --git a/app/submodule/chain/chain_submodule.go b/app/submodule/chain/chain_submodule.go index ee8f84efff..fbd03e376b 100644 --- a/app/submodule/chain/chain_submodule.go +++ b/app/submodule/chain/chain_submodule.go @@ -7,9 +7,7 @@ import ( "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" - chainv0api "github.com/filecoin-project/venus/app/submodule/chain/v0api" + apiwrapper "github.com/filecoin-project/venus/app/submodule/chain/v0api" "github.com/filecoin-project/venus/pkg/beacon" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/consensus" @@ -20,6 +18,8 @@ import ( "github.com/filecoin-project/venus/pkg/util/ffiwrapper" "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/pkg/vmsupport" + v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" ) @@ -107,7 +107,7 @@ func (chain *ChainSubmodule) Stop(ctx context.Context) { } //API chain module api implement -func (chain *ChainSubmodule) API() apiface.IChain { +func (chain *ChainSubmodule) API() v1api.IChain { return &chainAPI{ IAccount: NewAccountAPI(chain), IActor: NewActorAPI(chain), @@ -118,5 +118,5 @@ func (chain *ChainSubmodule) API() apiface.IChain { } func (chain *ChainSubmodule) V0API() v0api.IChain { - return &chainv0api.WrapperV1IChain{IChain: chain.API()} + return &apiwrapper.WrapperV1IChain{IChain: chain.API()} } diff --git a/app/submodule/chain/chaininfo_api.go b/app/submodule/chain/chaininfo_api.go index 12e07f8138..9612905ffa 100644 --- a/app/submodule/chain/chaininfo_api.go +++ b/app/submodule/chain/chaininfo_api.go @@ -15,13 +15,13 @@ import ( logging "github.com/ipfs/go-log/v2" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/pkg/chain" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" ) -var _ apiface.IChainInfo = &chainInfoAPI{} +var _ v1api.IChainInfo = &chainInfoAPI{} type chainInfoAPI struct { //nolint chain *ChainSubmodule @@ -30,7 +30,7 @@ type chainInfoAPI struct { //nolint var log = logging.Logger("chain") //NewChainInfoAPI new chain info api -func NewChainInfoAPI(chain *ChainSubmodule) apiface.IChainInfo { +func NewChainInfoAPI(chain *ChainSubmodule) v1api.IChainInfo { return &chainInfoAPI{chain: chain} } @@ -313,8 +313,8 @@ func (cia *chainInfoAPI) ResolveToKeyAddr(ctx context.Context, addr address.Addr //************Drand****************// // ChainNotify subscribe to chain head change event -func (cia *chainInfoAPI) ChainNotify(ctx context.Context) <-chan []*chain.HeadChange { - return cia.chain.ChainReader.SubHeadChanges(ctx) +func (cia *chainInfoAPI) ChainNotify(ctx context.Context) (<-chan []*apitypes.HeadChange, error) { + return cia.chain.ChainReader.SubHeadChanges(ctx), nil } //************Drand****************// @@ -464,7 +464,7 @@ func (cia *chainInfoAPI) StateVerifierStatus(ctx context.Context, addr address.A // the case that it appears in a newly mined block. An error is returned if one is // encountered or if the context is canceled. Otherwise, it waits forever for the message // to appear on chain. -func (cia *chainInfoAPI) MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*chain.ChainMessage, error) { +func (cia *chainInfoAPI) MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*apitypes.ChainMessage, error) { chainMsg, err := cia.chain.MessageStore.LoadMessage(msgCid) if err != nil { return nil, err @@ -583,7 +583,7 @@ func (cia *chainInfoAPI) ChainExport(ctx context.Context, nroots abi.ChainEpoch, // tRR //``` // Would return `[revert(tBA), apply(tAB), apply(tAA)]` -func (cia *chainInfoAPI) ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*chain.HeadChange, error) { +func (cia *chainInfoAPI) ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*apitypes.HeadChange, error) { fts, err := cia.chain.ChainReader.GetTipSet(from) if err != nil { return nil, xerrors.Errorf("loading from tipset %s: %w", from, err) @@ -598,12 +598,12 @@ func (cia *chainInfoAPI) ChainGetPath(ctx context.Context, from types.TipSetKey, return nil, xerrors.Errorf("error getting tipset branches: %w", err) } - path := make([]*chain.HeadChange, len(revert)+len(apply)) + path := make([]*apitypes.HeadChange, len(revert)+len(apply)) for i, r := range revert { - path[i] = &chain.HeadChange{Type: chain.HCRevert, Val: r} + path[i] = &apitypes.HeadChange{Type: chain.HCRevert, Val: r} } for j, i := 0, len(apply)-1; i >= 0; j, i = j+1, i-1 { - path[j+len(revert)] = &chain.HeadChange{Type: chain.HCApply, Val: apply[i]} + path[j+len(revert)] = &apitypes.HeadChange{Type: chain.HCApply, Val: apply[i]} } return path, nil } diff --git a/app/submodule/chain/miner_api.go b/app/submodule/chain/miner_api.go index 1fc37a3400..3baa614326 100644 --- a/app/submodule/chain/miner_api.go +++ b/app/submodule/chain/miner_api.go @@ -10,8 +10,6 @@ import ( "github.com/filecoin-project/go-state-types/dline" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/state/tree" "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" @@ -20,17 +18,18 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" "github.com/filecoin-project/venus/venus-shared/actors/policy" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" ) -var _ apiface.IMinerState = &minerStateAPI{} +var _ v1api.IMinerState = &minerStateAPI{} type minerStateAPI struct { *ChainSubmodule } // NewMinerStateAPI create miner state api -func NewMinerStateAPI(chain *ChainSubmodule) apiface.IMinerState { +func NewMinerStateAPI(chain *ChainSubmodule) v1api.IMinerState { return &minerStateAPI{ChainSubmodule: chain} } @@ -474,15 +473,15 @@ func (msa *minerStateAPI) StateMinerInitialPledgeCollateral(ctx context.Context, // StateVMCirculatingSupplyInternal returns an approximation of the circulating supply of Filecoin at the given tipset. // This is the value reported by the runtime interface to actors code. -func (msa *minerStateAPI) StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (chain.CirculatingSupply, error) { +func (msa *minerStateAPI) StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) { ts, err := msa.ChainReader.GetTipSet(tsk) if err != nil { - return chain.CirculatingSupply{}, err + return types.CirculatingSupply{}, err } _, sTree, err := msa.Stmgr.ParentState(ctx, ts) if err != nil { - return chain.CirculatingSupply{}, err + return types.CirculatingSupply{}, err } return msa.ChainReader.GetCirculatingSupplyDetailed(ctx, ts.Height(), sTree) diff --git a/app/submodule/chain/v0api/chaininfo_v0api.go b/app/submodule/chain/v0api/chaininfo_v0api.go index 85b5a5ad94..db14183ced 100644 --- a/app/submodule/chain/v0api/chaininfo_v0api.go +++ b/app/submodule/chain/v0api/chaininfo_v0api.go @@ -3,8 +3,8 @@ package v0api import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" + v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" @@ -17,7 +17,7 @@ import ( var _ v0api.IChain = &WrapperV1IChain{} type WrapperV1IChain struct { //nolint - apiface.IChain + v1api.IChain } func (a *WrapperV1IChain) StateSearchMsg(ctx context.Context, msg cid.Cid) (*apitypes.MsgLookup, error) { diff --git a/app/submodule/config/config.go b/app/submodule/config/config.go index 08e428ef27..d789ff9be3 100644 --- a/app/submodule/config/config.go +++ b/app/submodule/config/config.go @@ -1,13 +1,17 @@ package config import ( + "context" "sync" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" repo2 "github.com/filecoin-project/venus/pkg/repo" ) +type IConfig interface { + ConfigSet(ctx context.Context, dottedPath string, paramJSON string) error + ConfigGet(ctx context.Context, dottedPath string) (interface{}, error) +} + // configModule is plumbing implementation for setting and retrieving values from local config. type ConfigModule struct { //nolint repo repo2.Repo @@ -38,10 +42,10 @@ func (s *ConfigModule) Get(dottedKey string) (interface{}, error) { } //API create a new config api implement -func (s *ConfigModule) API() apiface.IConfig { +func (s *ConfigModule) API() IConfig { return &configAPI{config: s} } -func (s *ConfigModule) V0API() v0api.IConfig { +func (s *ConfigModule) V0API() IConfig { return &configAPI{config: s} } diff --git a/app/submodule/config/config_api.go b/app/submodule/config/config_api.go index ce4f5ddde0..969de8b2df 100644 --- a/app/submodule/config/config_api.go +++ b/app/submodule/config/config_api.go @@ -2,10 +2,9 @@ package config import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" ) -var _ apiface.IConfig = &configAPI{} +var _ IConfig = &configAPI{} type configAPI struct { //nolint config *ConfigModule diff --git a/app/submodule/dagservice/blockservice_api.go b/app/submodule/dagservice/blockservice_api.go index 408910e06f..46813707ef 100644 --- a/app/submodule/dagservice/blockservice_api.go +++ b/app/submodule/dagservice/blockservice_api.go @@ -2,13 +2,13 @@ package dagservice import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" + "io" + "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" - "io" ) -var _ apiface.IDagService = &dagServiceAPI{} +var _ IDagService = &dagServiceAPI{} type dagServiceAPI struct { //nolint dagService *DagServiceSubmodule diff --git a/app/submodule/dagservice/blockservice_submoodule.go b/app/submodule/dagservice/blockservice_submoodule.go index 803fe5d2c3..41454a0a3d 100644 --- a/app/submodule/dagservice/blockservice_submoodule.go +++ b/app/submodule/dagservice/blockservice_submoodule.go @@ -2,17 +2,25 @@ package dagservice import ( "context" + "io" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/filecoin-project/venus/app/submodule/network" "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/util/dag" + "github.com/ipfs/go-cid" + ipld "github.com/ipfs/go-ipld-format" "github.com/ipfs/go-merkledag" bserv "github.com/ipfs/go-blockservice" ) +type IDagService interface { + DAGGetNode(ctx context.Context, ref string) (interface{}, error) + DAGGetFileSize(ctx context.Context, c cid.Cid) (uint64, error) + DAGCat(ctx context.Context, c cid.Cid) (io.Reader, error) + DAGImportData(ctx context.Context, data io.Reader) (ipld.Node, error) +} + // DagServiceSubmodule enhances the `Node` with networked key/value fetching capabilities. // - `BlockService` is shared by chain/graphsync and piece/bitswap data type DagServiceSubmodule struct { //nolint @@ -36,10 +44,10 @@ func NewDagserviceSubmodule(ctx context.Context, dagCfg dagConfig, network *netw }, nil } -func (blockService *DagServiceSubmodule) API() apiface.IDagService { +func (blockService *DagServiceSubmodule) API() IDagService { return &dagServiceAPI{dagService: blockService} } -func (blockService *DagServiceSubmodule) V0API() v0api.IDagService { +func (blockService *DagServiceSubmodule) V0API() IDagService { return &dagServiceAPI{dagService: blockService} } diff --git a/app/submodule/discovery/discovery_api.go b/app/submodule/discovery/discovery_api.go index ce71baad7f..8288215621 100644 --- a/app/submodule/discovery/discovery_api.go +++ b/app/submodule/discovery/discovery_api.go @@ -1,10 +1,8 @@ package discovery -import ( - "github.com/filecoin-project/venus/app/client/apiface" -) +type IDiscovery interface{} -var _ apiface.IDiscovery = &discoveryAPI{} +var _ IDiscovery = &discoveryAPI{} type discoveryAPI struct { //nolint discovery *DiscoverySubmodule diff --git a/app/submodule/discovery/discovery_submodule.go b/app/submodule/discovery/discovery_submodule.go index 421cc80d61..d7408c201a 100644 --- a/app/submodule/discovery/discovery_submodule.go +++ b/app/submodule/discovery/discovery_submodule.go @@ -4,8 +4,6 @@ import ( "context" "time" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/filecoin-project/venus/app/submodule/network" "github.com/filecoin-project/venus/pkg/repo" types "github.com/filecoin-project/venus/venus-shared/chain" @@ -130,10 +128,10 @@ func (discovery *DiscoverySubmodule) Stop() { } //API create a discovery api implement -func (discovery *DiscoverySubmodule) API() apiface.IDiscovery { +func (discovery *DiscoverySubmodule) API() IDiscovery { return &discoveryAPI{discovery: discovery} } -func (discovery *DiscoverySubmodule) V0API() v0api.IDiscovery { +func (discovery *DiscoverySubmodule) V0API() IDiscovery { return &discoveryAPI{discovery: discovery} } diff --git a/app/submodule/market/market_api.go b/app/submodule/market/market_api.go index 38901c294c..870bb11033 100644 --- a/app/submodule/market/market_api.go +++ b/app/submodule/market/market_api.go @@ -5,19 +5,19 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/pkg/statemanger" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" "golang.org/x/xerrors" ) type marketAPI struct { - chain apiface.IChain + chain v1api.IChain stmgr statemanger.IStateManager } -func newMarketAPI(c apiface.IChain, stmgr statemanger.IStateManager) apiface.IMarket { +func newMarketAPI(c v1api.IChain, stmgr statemanger.IStateManager) v1api.IMarket { return &marketAPI{c, stmgr} } diff --git a/app/submodule/market/market_submodule.go b/app/submodule/market/market_submodule.go index 6879fde131..4f9751b20a 100644 --- a/app/submodule/market/market_submodule.go +++ b/app/submodule/market/market_submodule.go @@ -1,23 +1,23 @@ package market import ( - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/filecoin-project/venus/pkg/statemanger" + v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" ) // MarketSubmodule enhances the `Node` with market capabilities. type MarketSubmodule struct { //nolint - c apiface.IChain + c v1api.IChain sm statemanger.IStateManager } // NewMarketModule create new market module -func NewMarketModule(c apiface.IChain, sm statemanger.IStateManager) *MarketSubmodule { //nolint +func NewMarketModule(c v1api.IChain, sm statemanger.IStateManager) *MarketSubmodule { //nolint return &MarketSubmodule{c, sm} } -func (ms *MarketSubmodule) API() apiface.IMarket { +func (ms *MarketSubmodule) API() v1api.IMarket { return newMarketAPI(ms.c, ms.sm) } diff --git a/app/submodule/mining/mining_api.go b/app/submodule/mining/mining_api.go index f67b22e4c1..8227f8754a 100644 --- a/app/submodule/mining/mining_api.go +++ b/app/submodule/mining/mining_api.go @@ -5,7 +5,6 @@ import ( "context" "os" - "github.com/filecoin-project/venus/app/client/apiface" cbor "github.com/ipfs/go-ipld-cbor" "github.com/filecoin-project/go-address" @@ -23,11 +22,12 @@ import ( "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" wtypes "github.com/filecoin-project/venus/venus-shared/wallet" ) -var _ apiface.IMining = &MiningAPI{} +var _ v1api.IMining = &MiningAPI{} type MiningAPI struct { //nolint Ming *MiningModule diff --git a/app/submodule/mining/mining_submodule.go b/app/submodule/mining/mining_submodule.go index 71f6ba5ace..5a9901a45e 100644 --- a/app/submodule/mining/mining_submodule.go +++ b/app/submodule/mining/mining_submodule.go @@ -1,8 +1,6 @@ package mining import ( - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/filecoin-project/venus/app/submodule/blockstore" chain2 "github.com/filecoin-project/venus/app/submodule/chain" "github.com/filecoin-project/venus/app/submodule/network" @@ -11,6 +9,8 @@ import ( "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/statemanger" "github.com/filecoin-project/venus/pkg/util/ffiwrapper" + v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" ) type miningConfig interface { @@ -31,7 +31,7 @@ type MiningModule struct { //nolint } //API create new miningAPi implement -func (miningModule *MiningModule) API() apiface.IMining { +func (miningModule *MiningModule) API() v1api.IMining { return &MiningAPI{Ming: miningModule} } diff --git a/app/submodule/mpool/mpool_api.go b/app/submodule/mpool/mpool_api.go index 20c5a22b71..95aa14c3bc 100644 --- a/app/submodule/mpool/mpool_api.go +++ b/app/submodule/mpool/mpool_api.go @@ -6,16 +6,16 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/pkg/messagepool" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" mptypes "github.com/filecoin-project/venus/venus-shared/messagepool" "github.com/ipfs/go-cid" "golang.org/x/xerrors" ) -var _ apiface.IMessagePool = &MessagePoolAPI{} +var _ v1api.IMessagePool = &MessagePoolAPI{} //MessagePoolAPI messsage pool api implement type MessagePoolAPI struct { diff --git a/app/submodule/mpool/mpool_submodule.go b/app/submodule/mpool/mpool_submodule.go index d86d898cb1..f78b23e01a 100644 --- a/app/submodule/mpool/mpool_submodule.go +++ b/app/submodule/mpool/mpool_submodule.go @@ -7,8 +7,6 @@ import ( "strconv" "time" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" @@ -26,6 +24,8 @@ import ( "github.com/filecoin-project/venus/pkg/messagepool/journal" "github.com/filecoin-project/venus/pkg/net/msgsub" "github.com/filecoin-project/venus/pkg/repo" + v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" ) @@ -58,7 +58,7 @@ type MessagePoolSubmodule struct { //nolint msgSigner *messagepool.MessageSigner chain *chain.ChainSubmodule network *network.NetworkSubmodule - walletAPI apiface.IWallet + walletAPI v1api.IWallet networkCfg *config.NetworkParamsConfig } @@ -247,7 +247,7 @@ func (mp *MessagePoolSubmodule) Stop(ctx context.Context) { } //API create a new mpool api implement -func (mp *MessagePoolSubmodule) API() apiface.IMessagePool { +func (mp *MessagePoolSubmodule) API() v1api.IMessagePool { pushLocks := messagepool.NewMpoolLocker() return &MessagePoolAPI{mp: mp, pushLocks: pushLocks} } diff --git a/app/submodule/multisig/multisig_api.go b/app/submodule/multisig/multisig_api.go index 311bf5212d..39a566426c 100644 --- a/app/submodule/multisig/multisig_api.go +++ b/app/submodule/multisig/multisig_api.go @@ -9,14 +9,14 @@ import ( multisig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/builtin/multisig" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/venus/venus-shared/messagepool" ) -var _ apiface.IMultiSig = &multiSig{} +var _ v1api.IMultiSig = &multiSig{} type multiSig struct { *MultiSigSubmodule @@ -29,7 +29,7 @@ const ( MsigCancel ) -func newMultiSig(m *MultiSigSubmodule) apiface.IMultiSig { +func newMultiSig(m *MultiSigSubmodule) v1api.IMultiSig { return &multiSig{ MultiSigSubmodule: m, } diff --git a/app/submodule/multisig/multisig_submodule.go b/app/submodule/multisig/multisig_submodule.go index 2c23ff9578..3487a0b982 100644 --- a/app/submodule/multisig/multisig_submodule.go +++ b/app/submodule/multisig/multisig_submodule.go @@ -1,30 +1,30 @@ package multisig import ( - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" - multisigv0 "github.com/filecoin-project/venus/app/submodule/multisig/v0api" + apiwrapper "github.com/filecoin-project/venus/app/submodule/multisig/v0api" chain2 "github.com/filecoin-project/venus/pkg/chain" + v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" ) type MultiSigSubmodule struct { //nolint - state apiface.IChain - mpool apiface.IMessagePool + state v1api.IChain + mpool v1api.IMessagePool store *chain2.Store } // MessagingSubmodule enhances the `Node` with multisig capabilities. -func NewMultiSigSubmodule(chainState apiface.IChain, msgPool apiface.IMessagePool, store *chain2.Store) *MultiSigSubmodule { +func NewMultiSigSubmodule(chainState v1api.IChain, msgPool v1api.IMessagePool, store *chain2.Store) *MultiSigSubmodule { return &MultiSigSubmodule{state: chainState, mpool: msgPool, store: store} } //API create a new multisig implement -func (sb *MultiSigSubmodule) API() apiface.IMultiSig { +func (sb *MultiSigSubmodule) API() v1api.IMultiSig { return newMultiSig(sb) } func (sb *MultiSigSubmodule) V0API() v0api.IMultiSig { - return &multisigv0.WrapperV1IMultiSig{ + return &apiwrapper.WrapperV1IMultiSig{ IMultiSig: newMultiSig(sb), IMessagePool: sb.mpool, } diff --git a/app/submodule/multisig/v0api/multisig_v0api.go b/app/submodule/multisig/v0api/multisig_v0api.go index 8d9c2328b3..ba44f01507 100644 --- a/app/submodule/multisig/v0api/multisig_v0api.go +++ b/app/submodule/multisig/v0api/multisig_v0api.go @@ -3,8 +3,8 @@ package v0api import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" + v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-address" @@ -15,8 +15,8 @@ import ( ) type WrapperV1IMultiSig struct { - apiface.IMultiSig - apiface.IMessagePool + v1api.IMultiSig + v1api.IMessagePool } var _ v0api.IMultiSig = (*WrapperV1IMultiSig)(nil) diff --git a/app/submodule/network/network_api.go b/app/submodule/network/network_api.go index 45969f4242..7950fcf06c 100644 --- a/app/submodule/network/network_api.go +++ b/app/submodule/network/network_api.go @@ -8,14 +8,14 @@ import ( "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" - "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/net" "github.com/filecoin-project/venus/venus-shared/api" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" + "github.com/filecoin-project/venus/venus-shared/libp2p/net" ) -var _ apiface.INetwork = &networkAPI{} +var _ v1api.INetwork = &networkAPI{} type networkAPI struct { //nolint network *NetworkSubmodule diff --git a/app/submodule/network/network_submodule.go b/app/submodule/network/network_submodule.go index ce285ab6b8..e1b7fdf03c 100644 --- a/app/submodule/network/network_submodule.go +++ b/app/submodule/network/network_submodule.go @@ -49,9 +49,9 @@ import ( ma "github.com/multiformats/go-multiaddr" "github.com/pkg/errors" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" - v0apiwrapper "github.com/filecoin-project/venus/app/submodule/network/v0api" + apiwrapper "github.com/filecoin-project/venus/app/submodule/network/v0api" + v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" ) var networkLogger = logging.Logger("network_module") @@ -82,12 +82,12 @@ type NetworkSubmodule struct { //nolint } //API create a new network implement -func (networkSubmodule *NetworkSubmodule) API() apiface.INetwork { +func (networkSubmodule *NetworkSubmodule) API() v1api.INetwork { return &networkAPI{network: networkSubmodule} } func (networkSubmodule *NetworkSubmodule) V0API() v0api.INetwork { - return &v0apiwrapper.WrapperV1INetwork{INetwork: &networkAPI{network: networkSubmodule}} + return &apiwrapper.WrapperV1INetwork{INetwork: &networkAPI{network: networkSubmodule}} } func (networkSubmodule *NetworkSubmodule) Stop(ctx context.Context) { diff --git a/app/submodule/network/v0api/v1_wrapper.go b/app/submodule/network/v0api/v1_wrapper.go index 2fff6daec9..9eae5d9ff2 100644 --- a/app/submodule/network/v0api/v1_wrapper.go +++ b/app/submodule/network/v0api/v1_wrapper.go @@ -3,14 +3,14 @@ package v0api import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/venus-shared/api" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" ) type WrapperV1INetwork struct { - apiface.INetwork + v1api.INetwork } func (w *WrapperV1INetwork) Version(ctx context.Context) (apitypes.Version, error) { @@ -24,4 +24,4 @@ func (w *WrapperV1INetwork) Version(ctx context.Context) (apitypes.Version, erro return ver, nil } -var _ apiface.INetwork = &WrapperV1INetwork{} +var _ v1api.INetwork = &WrapperV1INetwork{} diff --git a/app/submodule/paych/paych_api.go b/app/submodule/paych/paych_api.go index cbc4e4ae99..8b1b316b47 100644 --- a/app/submodule/paych/paych_api.go +++ b/app/submodule/paych/paych_api.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/specs-actors/actors/builtin/paych" "github.com/filecoin-project/venus/pkg/paychmgr" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" paychtypes "github.com/filecoin-project/venus/venus-shared/paych" ) @@ -34,11 +35,11 @@ func (a *PaychAPI) PaychGet(ctx context.Context, from, to address.Address, amt b }, nil } -func (a *PaychAPI) PaychAvailableFunds(ctx context.Context, ch address.Address) (*paychmgr.ChannelAvailableFunds, error) { +func (a *PaychAPI) PaychAvailableFunds(ctx context.Context, ch address.Address) (*apitypes.ChannelAvailableFunds, error) { return a.paychMgr.AvailableFunds(ch) } -func (a *PaychAPI) PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*paychmgr.ChannelAvailableFunds, error) { +func (a *PaychAPI) PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*apitypes.ChannelAvailableFunds, error) { return a.paychMgr.AvailableFundsByFromTo(from, to) } @@ -136,7 +137,7 @@ func (a *PaychAPI) PaychVoucherAdd(ctx context.Context, ch address.Address, sv * // the two. // If there are insufficient funds in the channel to create the voucher, // returns a nil voucher and the shortfall. -func (a *PaychAPI) PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paychmgr.VoucherCreateResult, error) { +func (a *PaychAPI) PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paychtypes.VoucherCreateResult, error) { return a.paychMgr.CreateVoucher(ctx, pch, paych.SignedVoucher{Amount: amt, Lane: lane}) } diff --git a/app/submodule/paych/paych_submodule.go b/app/submodule/paych/paych_submodule.go index 83bb1ab5d0..df460d3971 100644 --- a/app/submodule/paych/paych_submodule.go +++ b/app/submodule/paych/paych_submodule.go @@ -3,9 +3,9 @@ package paych import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" "github.com/filecoin-project/venus/pkg/paychmgr" + v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" "github.com/ipfs/go-datastore" ) @@ -29,7 +29,7 @@ func (ps *PaychSubmodule) Stop() { } //API create a new paych implement -func (ps *PaychSubmodule) API() apiface.IPaychan { +func (ps *PaychSubmodule) API() v1api.IPaychan { return NewPaychAPI(ps.pmgr) } diff --git a/app/submodule/syncer/syncer_api.go b/app/submodule/syncer/syncer_api.go index c972e6cf0a..a68ebe01b8 100644 --- a/app/submodule/syncer/syncer_api.go +++ b/app/submodule/syncer/syncer_api.go @@ -4,9 +4,9 @@ import ( "context" "time" - "github.com/filecoin-project/venus/app/client/apiface" syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" stmgrtypes "github.com/filecoin-project/venus/venus-shared/stmgr" @@ -17,15 +17,54 @@ import ( var syncAPILog = logging.Logger("syncAPI") -var _ apiface.ISyncer = &syncerAPI{} +var _ v1api.ISyncer = &syncerAPI{} type syncerAPI struct { //nolint syncer *SyncerSubmodule } // SyncerStatus returns the current status of the active or last active chain sync operation. -func (sa *syncerAPI) SyncerTracker(ctx context.Context) *syncTypes.TargetTracker { - return sa.syncer.ChainSyncManager.BlockProposer().SyncTracker() +func (sa *syncerAPI) SyncerTracker(ctx context.Context) *apitypes.TargetTracker { + tracker := sa.syncer.ChainSyncManager.BlockProposer().SyncTracker() + tt := &apitypes.TargetTracker{ + History: make([]*apitypes.Target, 0), + Buckets: make([]*apitypes.Target, 0), + } + convertTarget := func(src *syncTypes.Target) *apitypes.Target { + return &apitypes.Target{ + State: convertSyncStateStage(src.State), + Base: src.Base, + Current: src.Current, + Start: src.Start, + End: src.End, + Err: src.Err, + ChainInfo: src.ChainInfo, + } + } + for _, target := range tracker.History() { + tt.History = append(tt.History, convertTarget(target)) + } + for _, target := range tracker.Buckets() { + tt.Buckets = append(tt.Buckets, convertTarget(target)) + } + + return tt +} + +func convertSyncStateStage(srtState syncTypes.SyncStateStage) apitypes.SyncStateStage { + var state apitypes.SyncStateStage + switch srtState { + case syncTypes.StageIdle: + state = apitypes.StageIdle + case syncTypes.StageSyncErrored: + state = apitypes.StageSyncErrored + case syncTypes.StageSyncComplete: + state = apitypes.StageSyncComplete + case syncTypes.StateInSyncing: + state = apitypes.StageMessages + } + + return state } // SyncerStatus returns the current status of the active or last active chain sync operation. @@ -173,23 +212,12 @@ func (sa *syncerAPI) SyncState(ctx context.Context) (*apitypes.SyncState, error) WorkerID: uint64(count), Base: t.Base, Target: t.Head, + Stage: convertSyncStateStage(t.State), Height: currentHeight, Start: t.Start, End: t.End, Message: msg, } - - switch t.State { - case syncTypes.StageIdle: - activeSync.Stage = apitypes.StageIdle - case syncTypes.StageSyncErrored: - activeSync.Stage = apitypes.StageSyncErrored - case syncTypes.StageSyncComplete: - activeSync.Stage = apitypes.StageSyncComplete - case syncTypes.StateInSyncing: - activeSync.Stage = apitypes.StageMessages - } - return activeSync } //current diff --git a/app/submodule/syncer/syncer_submodule.go b/app/submodule/syncer/syncer_submodule.go index d73f1fc9b9..0bddf403fd 100644 --- a/app/submodule/syncer/syncer_submodule.go +++ b/app/submodule/syncer/syncer_submodule.go @@ -7,12 +7,12 @@ import ( "runtime" "time" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/venus/app/client/apiface/v0api" chain2 "github.com/filecoin-project/venus/app/submodule/chain" "github.com/filecoin-project/venus/pkg/clock" "github.com/filecoin-project/venus/pkg/statemanger" "github.com/filecoin-project/venus/pkg/util/ffiwrapper" + v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" cbor "github.com/ipfs/go-ipld-cbor" fbig "github.com/filecoin-project/go-state-types/big" @@ -323,7 +323,7 @@ func (syncer *SyncerSubmodule) Stop(ctx context.Context) { } //API create a new sync api implement -func (syncer *SyncerSubmodule) API() apiface.ISyncer { +func (syncer *SyncerSubmodule) API() v1api.ISyncer { return &syncerAPI{syncer: syncer} } diff --git a/app/submodule/wallet/wallet_api.go b/app/submodule/wallet/wallet_api.go index 8ddafaebfe..7ddee55eba 100644 --- a/app/submodule/wallet/wallet_api.go +++ b/app/submodule/wallet/wallet_api.go @@ -8,14 +8,15 @@ import ( "github.com/filecoin-project/go-state-types/abi" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/app/submodule/wallet/remotewallet" "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/wallet" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" wtypes "github.com/filecoin-project/venus/venus-shared/wallet" ) -var _ apiface.IWallet = &WalletAPI{} +var _ v1api.IWallet = &WalletAPI{} var ErrNoDefaultFromAddress = errors.New("unable to determine a default walletModule address") @@ -90,8 +91,8 @@ func (walletAPI *WalletAPI) WalletNewAddress(protocol address.Protocol) (address } // WalletImport adds a given set of KeyInfos to the walletModule -func (walletAPI *WalletAPI) WalletImport(key *crypto.KeyInfo) (address.Address, error) { - addr, err := walletAPI.adapter.Import(key) +func (walletAPI *WalletAPI) WalletImport(key *wtypes.KeyInfo) (address.Address, error) { + addr, err := walletAPI.adapter.Import(remotewallet.ConvertLocalKeyInfo(key)) if err != nil { return address.Undef, err } @@ -99,8 +100,12 @@ func (walletAPI *WalletAPI) WalletImport(key *crypto.KeyInfo) (address.Address, } // WalletExport returns the KeyInfos for the given walletModule addresses -func (walletAPI *WalletAPI) WalletExport(addr address.Address, password string) (*crypto.KeyInfo, error) { - return walletAPI.adapter.Export(addr, password) +func (walletAPI *WalletAPI) WalletExport(addr address.Address, password string) (*wtypes.KeyInfo, error) { + ki, err := walletAPI.adapter.Export(addr, password) + if err != nil { + return nil, err + } + return remotewallet.ConvertRemoteKeyInfo(ki), nil } // WalletSign signs the given bytes using the given address. diff --git a/app/submodule/wallet/wallet_submodule.go b/app/submodule/wallet/wallet_submodule.go index 32ede1f173..51772ed24f 100644 --- a/app/submodule/wallet/wallet_submodule.go +++ b/app/submodule/wallet/wallet_submodule.go @@ -3,9 +3,9 @@ package wallet import ( "context" - "github.com/filecoin-project/venus/app/client/apiface/v0api" + v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - "github.com/filecoin-project/venus/app/client/apiface" logging "github.com/ipfs/go-log" "github.com/pkg/errors" @@ -75,7 +75,7 @@ func NewWalletSubmodule(ctx context.Context, } //API create a new wallet api implement -func (wallet *WalletSubmodule) API() apiface.IWallet { +func (wallet *WalletSubmodule) API() v1api.IWallet { return &WalletAPI{ walletModule: wallet, adapter: wallet.adapter, diff --git a/cmd/address.go b/cmd/address.go index 57265ff237..b274b65105 100644 --- a/cmd/address.go +++ b/cmd/address.go @@ -21,6 +21,7 @@ import ( "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/wallet" types "github.com/filecoin-project/venus/venus-shared/chain" + wtypes "github.com/filecoin-project/venus/venus-shared/wallet" ) var errMissPassword = errors.New("the wallet is missing password, please use command `venus wallet set-password` to set password") @@ -253,7 +254,7 @@ var walletImportCmd = &cmds.Command{ return fmt.Errorf("given file was not a files.File") } - var key crypto.KeyInfo + var key wtypes.KeyInfo err := json.NewDecoder(hex.NewDecoder(fi)).Decode(&key) if err != nil { return err diff --git a/cmd/chain.go b/cmd/chain.go index 3d40c724fc..436d80f31a 100644 --- a/cmd/chain.go +++ b/cmd/chain.go @@ -17,10 +17,10 @@ import ( cmds "github.com/ipfs/go-ipfs-cmds" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/app/node" "github.com/filecoin-project/venus/pkg/constants" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" ) @@ -387,7 +387,7 @@ var chainExportCmd = &cmds.Command{ // LoadTipSet gets the tipset from the context, or the head from the API. // // It always gets the head from the API so commands use a consistent tipset even if time pases. -func LoadTipSet(ctx context.Context, req *cmds.Request, chainAPI apiface.IChain) (*types.TipSet, error) { +func LoadTipSet(ctx context.Context, req *cmds.Request, chainAPI v1api.IChain) (*types.TipSet, error) { tss := req.Options["tipset"].(string) if tss == "" { return chainAPI.ChainHead(ctx) @@ -396,7 +396,7 @@ func LoadTipSet(ctx context.Context, req *cmds.Request, chainAPI apiface.IChain) return ParseTipSetRef(ctx, chainAPI, tss) } -func ParseTipSetRef(ctx context.Context, chainAPI apiface.IChain, tss string) (*types.TipSet, error) { +func ParseTipSetRef(ctx context.Context, chainAPI v1api.IChain, tss string) (*types.TipSet, error) { if tss[0] == '@' { if tss == "@head" { return chainAPI.ChainHead(ctx) diff --git a/cmd/config.go b/cmd/config.go deleted file mode 100644 index c2a7cd62e0..0000000000 --- a/cmd/config.go +++ /dev/null @@ -1,102 +0,0 @@ -package cmd - -import ( - "github.com/filecoin-project/venus/app/node" - "strings" - - cmds "github.com/ipfs/go-ipfs-cmds" -) - -var configCmd = &cmds.Command{ - Helptext: cmds.HelpText{ - Tagline: "Get and set filecoin config values", - ShortDescription: ` -venus config controls configuration variables. These variables are stored -in a config file inside your filecoin repo. When getting values, a key should be -provided, like so: - -venus config KEY - -When setting values, the key should be given first followed by the value and -separated by a space, like so: - -venus config KEY VALUE - -The key should be specified as a period separated string of keys. The value may -be either a bare string or any valid json compatible with the given key.`, - LongDescription: ` -venus config controls configuration variables. The configuration values -are stored as a JSON config file in your filecoin repo. When using venus -config, a key and value may be provided to set variables, or just a key may be -provided to fetch it's associated value without modifying it. - -Keys should be listed with a dot separation for each layer of nesting within The -JSON config. For example, the "addresses" key resides within an object under the -"bootstrap" key, therefore it should be addressed with the string -"bootstrap.addresses" like so: - -$ venus config bootstrap.addresses -[ - "newaddr" -] - -Values may be either bare strings (be sure to quote said string if they contain -spaces to avoid arguments being separated by your shell) or as encoded JSON -compatible with the associated keys. For example, "bootstrap.addresses" expects -an array of strings, so it should be set with something like so: - -$ venus config bootstrap.addresses '["newaddr"]' - -When setting keys with subkeys, such as the "bootstrap" key which has 3 keys -underneath it, period, minPeerThreshold, and addresses, the given JSON value -will be merged with existing values to avoid unintentionally resetting other -configuration variables under "bootstrap". For example, setting period then -setting addresses, like so, will not change the value of "period": - -$ venus config bootstrap -{ - "addresses": [], - "minPeerThreshold": 0, - "period": "1m" -} -$ venus config bootstrap '{"period": "5m"}' -$ venus config bootstrap '{"addresses": ["newaddr"]}' -$ venus config bootstrap -{ - "addresses": ["newaddr"], - "minPeerThreshold": 0, - "period": "5m" -} -`, - }, - Arguments: []cmds.Argument{ - cmds.StringArg("key", true, false, "The key of the config entry (e.g. \"api.address\")"), - cmds.StringArg("value", false, false, "Optionally, a value with which to set the config entry"), - }, - Run: func(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment) error { - api := env.(*node.Env).ConfigAPI - key := req.Arguments[0] - var value string - - if len(req.Arguments) == 2 { - value = req.Arguments[1] - } else if strings.Contains(key, "=") { - args := strings.Split(key, "=") - key = args[0] - value = args[1] - } - - if value != "" { - err := api.ConfigSet(req.Context, key, value) - if err != nil { - return err - } - } - res, err := api.ConfigGet(req.Context, key) - if err != nil { - return err - } - - return re.Emit(res) - }, -} diff --git a/cmd/config_integration_test.go b/cmd/config_integration_test.go deleted file mode 100644 index 961d6e03a6..0000000000 --- a/cmd/config_integration_test.go +++ /dev/null @@ -1,83 +0,0 @@ -package cmd_test - -import ( - "context" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/filecoin-project/venus/app/node/test" - "github.com/filecoin-project/venus/pkg/config" - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" -) - -func TestConfigDaemon(t *testing.T) { - tf.IntegrationTest(t) - ctx := context.Background() - - t.Run("config prints config value", func(t *testing.T) { - builder := test.NewNodeBuilder(t) - - _, cmdClient, done := builder.BuildAndStartAPI(ctx) - defer done() - - wrapped1 := config.NewDefaultConfig().Datastore - - var decodedOutput1 config.DatastoreConfig - cmdClient.RunMarshaledJSON(ctx, &decodedOutput1, "config", "datastore") - assert.Equal(t, wrapped1, &decodedOutput1) - - var path string - cmdClient.RunMarshaledJSON(ctx, &path, "config", "datastore.path") - assert.Equal(t, config.NewDefaultConfig().Datastore.Path, path) - }) - - t.Run("config simple_value updates config", func(t *testing.T) { - builder := test.NewNodeBuilder(t) - - n, cmdClient, done := builder.BuildAndStartAPI(ctx) - defer done() - - period := "1m" - // check writing default does not error - cmdClient.RunSuccess(ctx, "config", "bootstrap.period", period) - - // validate output - var retrievedPeriod string - cmdClient.RunMarshaledJSON(ctx, &retrievedPeriod, "config", "bootstrap.period") - assert.Equal(t, period, retrievedPeriod) - - // validate config write - nbci, err := n.ConfigModule().API().ConfigGet(ctx, "bootstrap.period") //nolint - require.NoError(t, err) - nbc, ok := nbci.(string) - require.True(t, ok) - assert.Equal(t, nbc, period) - }) - - t.Run("config updates config", func(t *testing.T) { - builder := test.NewNodeBuilder(t) - - n, cmdClient, done := builder.BuildAndStartAPI(ctx) - defer done() - - cmdClient.RunSuccess(ctx, "config", "bootstrap", `{"addresses": ["fake1", "fake2"], "period": "1m", "minPeerThreshold": 0}`) - - var bootstrapConfig config.BootstrapConfig - cmdClient.RunMarshaledJSON(ctx, &bootstrapConfig, "config", "bootstrap") - - // validate output - require.Len(t, bootstrapConfig.Addresses, 2) - assert.Equal(t, "fake1", bootstrapConfig.Addresses[0]) - assert.Equal(t, "fake2", bootstrapConfig.Addresses[1]) - - // validate config write - nbci, err := n.ConfigModule().API().ConfigGet(ctx, "bootstrap") //nolint - require.NoError(t, err) - nbc, ok := nbci.(*config.BootstrapConfig) - require.True(t, ok) - - assert.Equal(t, nbc, &bootstrapConfig) - }) -} diff --git a/cmd/dag.go b/cmd/dag.go deleted file mode 100644 index f2ce30b610..0000000000 --- a/cmd/dag.go +++ /dev/null @@ -1,33 +0,0 @@ -// Package commands implements the command to print the blockchain. -package cmd - -import ( - "github.com/filecoin-project/venus/app/node" - cmds "github.com/ipfs/go-ipfs-cmds" -) - -var dagCmd = &cmds.Command{ - Helptext: cmds.HelpText{ - Tagline: "Interact with IPLD DAG objects.", - }, - Subcommands: map[string]*cmds.Command{ - "get": dagGetCmd, - }, -} - -var dagGetCmd = &cmds.Command{ - Helptext: cmds.HelpText{ - Tagline: "Get a DAG node by its CID", - }, - Arguments: []cmds.Argument{ - cmds.StringArg("ref", true, false, "CID of object to get"), - }, - Run: func(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment) error { - out, err := env.(*node.Env).BlockServiceAPI.DAGGetNode(req.Context, req.Arguments[0]) - if err != nil { - return err - } - - return re.Emit(out) - }, -} diff --git a/cmd/dag_integration_test.go b/cmd/dag_integration_test.go deleted file mode 100644 index 1fda6df796..0000000000 --- a/cmd/dag_integration_test.go +++ /dev/null @@ -1,49 +0,0 @@ -package cmd_test - -import ( - "bytes" - "context" - "testing" - - cbor "github.com/ipfs/go-ipld-cbor" - "github.com/stretchr/testify/require" - - "github.com/filecoin-project/venus/app/node/test" - "github.com/filecoin-project/venus/pkg/constants" - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - types "github.com/filecoin-project/venus/venus-shared/chain" -) - -func TestDagDaemon(t *testing.T) { - tf.IntegrationTest(t) - ctx := context.Background() - - t.Run("dag get returning the genesis block", func(t *testing.T) { - builder := test.NewNodeBuilder(t) - - n, cmdClient, done := builder.BuildAndStartAPI(ctx) - defer done() - - head, err := n.Chain().API().ChainHead(context.Background()) - require.NoError(t, err) - hb := head.Key().Cids()[0] - // get an IPLD node from the DAG by its CID - op := cmdClient.RunSuccess(ctx, "dag", "get", hb.String(), "--enc", "json") - result2 := op.ReadStdoutTrimNewlines() - - ipldnode, err := cbor.FromJSON(bytes.NewReader([]byte(result2)), constants.DefaultHashFunction, -1) - require.NoError(t, err) - - // CBOR decode the IPLD node's raw data into a Filecoin block - - var actual types.BlockHeader - actual.UnmarshalCBOR(bytes.NewReader(ipldnode.RawData())) // nolint: errcheck - // assert.NoError(err) - // TODO Enable ^^ and debug why BlockHeader.Miner isn't being de/encoded properly. - - // CIDs should be equal - - // TODO: reenable once cbor versions are matching! - // types.AssertHaveSameCid(assert, &expected, &actual) - }) -} diff --git a/cmd/dispute.go b/cmd/dispute.go index 4a29788361..e5df4f273f 100644 --- a/cmd/dispute.go +++ b/cmd/dispute.go @@ -18,11 +18,11 @@ import ( logging "github.com/ipfs/go-log/v2" - "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/app/node" chainpkg "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/venus-shared/actors" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" ) @@ -167,7 +167,10 @@ var disputerStartCmd = &cmds.Command{ // subscribe to head changes and validate the current value - headChanges := env.(*node.Env).ChainAPI.ChainNotify(ctx) + headChanges, err := env.(*node.Env).ChainAPI.ChainNotify(ctx) + if err != nil { + return err + } head, ok := <-headChanges if !ok { return xerrors.Errorf("Notify stream was invalid") @@ -348,7 +351,7 @@ var disputerStartCmd = &cmds.Command{ // for a given miner, index, and maxPostIndex, tries to dispute posts from 0...postsSnapshotted-1 // returns a list of DisputeWindowedPoSt msgs that are expected to succeed if sent -func makeDisputeWindowedPosts(ctx context.Context, api apiface.ISyncer, dl minerDeadline, postsSnapshotted uint64, sender address.Address) ([]*types.Message, error) { +func makeDisputeWindowedPosts(ctx context.Context, api v1api.ISyncer, dl minerDeadline, postsSnapshotted uint64, sender address.Address) ([]*types.Message, error) { disputes := make([]*types.Message, 0) for i := uint64(0); i < postsSnapshotted; i++ { @@ -380,7 +383,7 @@ func makeDisputeWindowedPosts(ctx context.Context, api apiface.ISyncer, dl miner return disputes, nil } -func makeMinerDeadline(ctx context.Context, api apiface.IChain, mAddr address.Address) (abi.ChainEpoch, *minerDeadline, error) { +func makeMinerDeadline(ctx context.Context, api v1api.IChain, mAddr address.Address) (abi.ChainEpoch, *minerDeadline, error) { dl, err := api.StateMinerProvingDeadline(ctx, mAddr, types.EmptyTSK) if err != nil { return -1, nil, xerrors.Errorf("getting proving index list: %w", err) @@ -392,7 +395,7 @@ func makeMinerDeadline(ctx context.Context, api apiface.IChain, mAddr address.Ad }, nil } -func getSender(ctx context.Context, api apiface.IWallet, fromStr string) (address.Address, error) { +func getSender(ctx context.Context, api v1api.IWallet, fromStr string) (address.Address, error) { if fromStr == "" { return api.WalletDefaultAddress(ctx) } diff --git a/cmd/main.go b/cmd/main.go index fd71c614de..f654c3ca6a 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -158,7 +158,7 @@ TOOL COMMANDS Options: []cmds.Option{ cmds.StringsOption(OptionToken, "set the auth token to use"), cmds.StringOption(OptionAPI, "set the api port to use"), - cmds.StringOption(OptionRepoDir, "set the repo directory, defaults to ~/.venus/repo"), + cmds.StringOption(OptionRepoDir, "set the repo directory, defaults to ~/.venus").WithDefault("~/.venus"), cmds.StringOption(cmds.EncLong, cmds.EncShort, "The encoding type the output should be encoded with (pretty-json or json)").WithDefault("pretty-json"), cmds.BoolOption("help", "Show the full command help text."), cmds.BoolOption("h", "Show a short version of the command help text."), @@ -184,9 +184,7 @@ var rootSubcmdsLocal = map[string]*cmds.Command{ var rootSubcmdsDaemon = map[string]*cmds.Command{ "chain": chainCmd, "sync": syncCmd, - "config": configCmd, "drand": drandCmd, - "dag": dagCmd, "inspect": inspectCmd, "leb128": leb128Cmd, "log": logCmd, diff --git a/cmd/miner.go b/cmd/miner.go index 6ee3a9d0c1..ab921b6d95 100644 --- a/cmd/miner.go +++ b/cmd/miner.go @@ -220,7 +220,7 @@ var minerInfoCmd = &cmds.Command{ blockstoreAPI := env.(*node.Env).BlockStoreAPI api := env.(*node.Env).ChainAPI - blockDelay, err := blockDelay(env.(*node.Env).ConfigAPI) + blockDelay, err := blockDelay(req) if err != nil { return err } diff --git a/cmd/miner_proving.go b/cmd/miner_proving.go index 6e3b44a6ea..1eec0af374 100644 --- a/cmd/miner_proving.go +++ b/cmd/miner_proving.go @@ -44,7 +44,7 @@ var provingInfoCmd = &cmds.Command{ } ctx := req.Context - blockDelay, err := blockDelay(env.(*node.Env).ConfigAPI) + blockDelay, err := blockDelay(req) if err != nil { return err } diff --git a/cmd/paych.go b/cmd/paych.go index d434beda7c..460be6683e 100644 --- a/cmd/paych.go +++ b/cmd/paych.go @@ -15,6 +15,7 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/paychmgr" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" types "github.com/filecoin-project/venus/venus-shared/chain" cmds "github.com/ipfs/go-ipfs-cmds" "golang.org/x/xerrors" @@ -436,7 +437,7 @@ func sortVouchers(vouchers []*paych.SignedVoucher) []*paych.SignedVoucher { }) return vouchers } -func paychStatus(writer io.Writer, avail *paychmgr.ChannelAvailableFunds) { +func paychStatus(writer io.Writer, avail *apitypes.ChannelAvailableFunds) { if avail.Channel == nil { if avail.PendingWaitSentinel != nil { fmt.Fprint(writer, "Creating channel\n") diff --git a/cmd/state.go b/cmd/state.go index acfa3e39e3..5bf26c5b19 100644 --- a/cmd/state.go +++ b/cmd/state.go @@ -2,13 +2,15 @@ package cmd import ( "bytes" - "context" "encoding/json" "fmt" "io" + "path/filepath" "strconv" - "github.com/filecoin-project/venus/app/client/apiface" + "github.com/filecoin-project/venus/app/paths" + + "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" @@ -259,7 +261,7 @@ var stateSectorCmd = &cmds.Command{ return err } - blockDelay, err := blockDelay(env.(*node.Env).ConfigAPI) + blockDelay, err := blockDelay(req) if err != nil { return err } @@ -303,14 +305,20 @@ var stateSectorCmd = &cmds.Command{ }, } -func blockDelay(a apiface.IConfig) (uint64, error) { - data, err := a.ConfigGet(context.Background(), "parameters.blockDelay") +func blockDelay(req *cmds.Request) (uint64, error) { + var err error + repoDir, _ := req.Options[OptionRepoDir].(string) + repoDir, err = paths.GetRepoPath(repoDir) + if err != nil { + return 0, err + } + cfgPath := filepath.Join(repoDir, "config.json") + cfg, err := config.ReadFile(cfgPath) if err != nil { return 0, err } - blockDelay, _ := data.(uint64) - return blockDelay, nil + return cfg.NetworkParams.BlockDelay, nil } type ActorInfo struct { @@ -463,7 +471,7 @@ var stateMinerInfo = &cmds.Command{ return err } - blockDelay, err := blockDelay(env.(*node.Env).ConfigAPI) + blockDelay, err := blockDelay(req) if err != nil { return err } diff --git a/cmd/swarm.go b/cmd/swarm.go index 9cdce08dd8..492958fbdc 100644 --- a/cmd/swarm.go +++ b/cmd/swarm.go @@ -5,6 +5,8 @@ import ( "encoding/base64" "encoding/json" "fmt" + "time" + "github.com/filecoin-project/venus/app/node" "github.com/ipfs/go-cid" cmds "github.com/ipfs/go-ipfs-cmds" @@ -12,9 +14,8 @@ import ( "github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/routing" ma "github.com/multiformats/go-multiaddr" - "time" - "github.com/filecoin-project/venus/pkg/net" + "github.com/filecoin-project/venus/venus-shared/libp2p/net" ) const ( diff --git a/cmd/sync.go b/cmd/sync.go index c8e6b18281..8d49154391 100644 --- a/cmd/sync.go +++ b/cmd/sync.go @@ -5,10 +5,11 @@ import ( "bytes" "strconv" - syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" cmds "github.com/ipfs/go-ipfs-cmds" "github.com/filecoin-project/venus/app/node" + syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" ) var syncCmd = &cmds.Command{ @@ -59,14 +60,14 @@ var storeStatusCmd = &cmds.Command{ }, Run: func(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment) error { tracker := env.(*node.Env).SyncerAPI.SyncerTracker(req.Context) - targets := tracker.Buckets() + targets := tracker.Buckets w := bytes.NewBufferString("") writer := NewSilentWriter(w) - var inSyncing []*syncTypes.Target - var waitTarget []*syncTypes.Target + var inSyncing []*apitypes.Target + var waitTarget []*apitypes.Target for _, t := range targets { - if t.State == syncTypes.StateInSyncing { + if t.State == apitypes.SyncStateStage(syncTypes.StateInSyncing) { inSyncing = append(inSyncing, t) } else { waitTarget = append(waitTarget, t) @@ -126,7 +127,7 @@ var historyCmd = &cmds.Command{ writer := NewSilentWriter(w) writer.Println("History:") - history := tracker.History() + history := tracker.History count := 1 for _, t := range history { writer.Println("SyncTarget:", strconv.Itoa(count)) diff --git a/pkg/chain/circulating_supply.go b/pkg/chain/circulating_supply.go index cc6a2f62b8..c94b6cbde9 100644 --- a/pkg/chain/circulating_supply.go +++ b/pkg/chain/circulating_supply.go @@ -4,10 +4,10 @@ import ( "context" "sync" - "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/pkg/constants" + types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" cbornode "github.com/ipfs/go-ipld-cbor" xerrors "github.com/pkg/errors" @@ -26,17 +26,7 @@ import ( ) type ICirculatingSupplyCalcualtor interface { - GetCirculatingSupplyDetailed(ctx context.Context, height abi.ChainEpoch, st tree.Tree) (CirculatingSupply, error) -} - -//CirculatingSupply circulation information, including mining, public offering, private placement, release, combustion, mortgage, circulation, -type CirculatingSupply struct { - FilVested abi.TokenAmount - FilMined abi.TokenAmount - FilBurnt abi.TokenAmount - FilLocked abi.TokenAmount - FilCirculating abi.TokenAmount - FilReserveDisbursed abi.TokenAmount + GetCirculatingSupplyDetailed(ctx context.Context, height abi.ChainEpoch, st tree.Tree) (types.CirculatingSupply, error) } //CirculatingSupplyCalculator used to calculate the funds at a specific block height @@ -62,53 +52,53 @@ func NewCirculatingSupplyCalculator(bstore blockstoreutil.Blockstore, genesisRoo } //GetCirculatingSupplyDetailed query contract and calculate circulation status at specific height and tree state -func (caculator *CirculatingSupplyCalculator) GetCirculatingSupplyDetailed(ctx context.Context, height abi.ChainEpoch, st tree.Tree) (CirculatingSupply, error) { +func (caculator *CirculatingSupplyCalculator) GetCirculatingSupplyDetailed(ctx context.Context, height abi.ChainEpoch, st tree.Tree) (types.CirculatingSupply, error) { caculator.genesisMsigLk.Lock() defer caculator.genesisMsigLk.Unlock() //setup genesis asset information if caculator.preIgnitionVesting == nil || caculator.genesisPledge.IsZero() || caculator.genesisMarketFunds.IsZero() { err := caculator.setupGenesisVestingSchedule(ctx) if err != nil { - return CirculatingSupply{}, xerrors.Errorf("failed to setup pre-ignition vesting schedule: %v", err) + return types.CirculatingSupply{}, xerrors.Errorf("failed to setup pre-ignition vesting schedule: %v", err) } } if caculator.postIgnitionVesting == nil { err := caculator.setupPostIgnitionVesting(ctx) if err != nil { - return CirculatingSupply{}, xerrors.Errorf("failed to setup post-ignition vesting schedule: %v", err) + return types.CirculatingSupply{}, xerrors.Errorf("failed to setup post-ignition vesting schedule: %v", err) } } if caculator.postCalicoVesting == nil { err := caculator.setupPostCalicoVesting(ctx) if err != nil { - return CirculatingSupply{}, xerrors.Errorf("failed to setup post-calico vesting schedule: %v", err) + return types.CirculatingSupply{}, xerrors.Errorf("failed to setup post-calico vesting schedule: %v", err) } } filVested, err := caculator.GetFilVested(ctx, height, st) if err != nil { - return CirculatingSupply{}, xerrors.Errorf("failed to calculate filVested: %v", err) + return types.CirculatingSupply{}, xerrors.Errorf("failed to calculate filVested: %v", err) } filReserveDisbursed := big.Zero() if height > caculator.upgradeConfig.UpgradeAssemblyHeight { filReserveDisbursed, err = caculator.GetFilReserveDisbursed(ctx, st) if err != nil { - return CirculatingSupply{}, xerrors.Errorf("failed to calculate filReserveDisbursed: %v", err) + return types.CirculatingSupply{}, xerrors.Errorf("failed to calculate filReserveDisbursed: %v", err) } } filMined, err := GetFilMined(ctx, st) if err != nil { - return CirculatingSupply{}, xerrors.Errorf("failed to calculate filMined: %v", err) + return types.CirculatingSupply{}, xerrors.Errorf("failed to calculate filMined: %v", err) } filBurnt, err := GetFilBurnt(ctx, st) if err != nil { - return CirculatingSupply{}, xerrors.Errorf("failed to calculate filBurnt: %v", err) + return types.CirculatingSupply{}, xerrors.Errorf("failed to calculate filBurnt: %v", err) } filLocked, err := caculator.GetFilLocked(ctx, st) if err != nil { - return CirculatingSupply{}, xerrors.Errorf("failed to calculate filLocked: %v", err) + return types.CirculatingSupply{}, xerrors.Errorf("failed to calculate filLocked: %v", err) } ret := big.Add(filVested, filMined) ret = big.Add(ret, filReserveDisbursed) @@ -119,7 +109,7 @@ func (caculator *CirculatingSupplyCalculator) GetCirculatingSupplyDetailed(ctx c ret = big.Zero() } - return CirculatingSupply{ + return types.CirculatingSupply{ FilVested: filVested, FilMined: filMined, FilBurnt: filBurnt, diff --git a/pkg/chain/circulating_supply_mock.go b/pkg/chain/circulating_supply_mock.go index 8a84fe0316..af102e0c94 100644 --- a/pkg/chain/circulating_supply_mock.go +++ b/pkg/chain/circulating_supply_mock.go @@ -2,8 +2,10 @@ package chain import ( "context" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/state/tree" + types "github.com/filecoin-project/venus/venus-shared/chain" ) var _ ICirculatingSupplyCalcualtor = (*MockCirculatingSupplyCalculator)(nil) @@ -15,8 +17,8 @@ func NewMockCirculatingSupplyCalculator() ICirculatingSupplyCalcualtor { return &MockCirculatingSupplyCalculator{} } -func (m MockCirculatingSupplyCalculator) GetCirculatingSupplyDetailed(ctx context.Context, height abi.ChainEpoch, st tree.Tree) (CirculatingSupply, error) { - return CirculatingSupply{ +func (m MockCirculatingSupplyCalculator) GetCirculatingSupplyDetailed(ctx context.Context, height abi.ChainEpoch, st tree.Tree) (types.CirculatingSupply, error) { + return types.CirculatingSupply{ FilVested: abi.TokenAmount{}, FilMined: abi.TokenAmount{}, FilBurnt: abi.TokenAmount{}, diff --git a/pkg/chain/store.go b/pkg/chain/store.go index 88c07ed697..e68fbb8dcb 100644 --- a/pkg/chain/store.go +++ b/pkg/chain/store.go @@ -45,6 +45,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" "github.com/filecoin-project/venus/venus-shared/actors/builtin/verifreg" "github.com/filecoin-project/venus/venus-shared/actors/policy" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" types "github.com/filecoin-project/venus/venus-shared/chain" ) @@ -85,11 +86,6 @@ type reorg struct { new []*types.TipSet } -type HeadChange struct { - Type string - Val *types.TipSet -} - // CheckPoint is the key which the check-point written in the datastore. var CheckPoint = datastore.NewKey("/chain/checkPoint") @@ -617,16 +613,16 @@ func (store *Store) SetHead(ctx context.Context, newTS *types.TipSet) error { func (store *Store) reorgWorker(ctx context.Context) chan reorg { headChangeNotifee := func(rev, app []*types.TipSet) error { - notif := make([]*HeadChange, len(rev)+len(app)) + notif := make([]*apitypes.HeadChange, len(rev)+len(app)) for i, revert := range rev { - notif[i] = &HeadChange{ + notif[i] = &apitypes.HeadChange{ Type: HCRevert, Val: revert, } } for i, apply := range app { - notif[i+len(rev)] = &HeadChange{ + notif[i+len(rev)] = &apitypes.HeadChange{ Type: HCApply, Val: apply, } @@ -689,14 +685,14 @@ func (store *Store) reorgWorker(ctx context.Context) chan reorg { // SubHeadChanges returns channel with chain head updates. // First message is guaranteed to be of len == 1, and type == 'current'. // Then event in the message may be HCApply and HCRevert. -func (store *Store) SubHeadChanges(ctx context.Context) chan []*HeadChange { +func (store *Store) SubHeadChanges(ctx context.Context) chan []*apitypes.HeadChange { store.mu.RLock() subCh := store.headEvents.Sub(HeadChangeTopic) head := store.head store.mu.RUnlock() - out := make(chan []*HeadChange, 16) - out <- []*HeadChange{{ + out := make(chan []*apitypes.HeadChange, 16) + out <- []*apitypes.HeadChange{{ Type: HCCurrent, Val: head, }} @@ -714,7 +710,7 @@ func (store *Store) SubHeadChanges(ctx context.Context) chan []*HeadChange { } select { - case out <- val.([]*HeadChange): + case out <- val.([]*apitypes.HeadChange): default: log.Errorf("closing head change subscription due to slow reader") return @@ -1049,7 +1045,7 @@ func (store *Store) WriteCheckPoint(ctx context.Context, cids types.TipSetKey) e return store.ds.Put(CheckPoint, buf.Bytes()) } -func (store *Store) GetCirculatingSupplyDetailed(ctx context.Context, height abi.ChainEpoch, st tree.Tree) (CirculatingSupply, error) { +func (store *Store) GetCirculatingSupplyDetailed(ctx context.Context, height abi.ChainEpoch, st tree.Tree) (types.CirculatingSupply, error) { return store.circulatingSupplyCalculator.GetCirculatingSupplyDetailed(ctx, height, st) } diff --git a/pkg/chain/store_test.go b/pkg/chain/store_test.go index 3e426e7cc7..e0e2bb1f9f 100644 --- a/pkg/chain/store_test.go +++ b/pkg/chain/store_test.go @@ -10,6 +10,7 @@ import ( "github.com/filecoin-project/venus/pkg/testhelpers" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/pkg/util/test" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" @@ -240,7 +241,7 @@ func TestHead(t *testing.T) { assert.ObjectsAreEqualValues(link1.Key(), cs.GetHead()) } -func assertEmptyCh(t *testing.T, ch <-chan []*chain.HeadChange) { +func assertEmptyCh(t *testing.T, ch <-chan []*apitypes.HeadChange) { select { case <-ch: assert.True(t, false) diff --git a/pkg/chain/waiter.go b/pkg/chain/waiter.go index 80a52cd620..3a7f4dd011 100644 --- a/pkg/chain/waiter.go +++ b/pkg/chain/waiter.go @@ -7,6 +7,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/constants" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" bstore "github.com/ipfs/go-ipfs-blockstore" @@ -30,7 +31,7 @@ type waiterChainReader interface { LookupID(context.Context, *types.TipSet, address.Address) (address.Address, error) GetActorAt(context.Context, *types.TipSet, address.Address) (*types.Actor, error) GetTipSetReceiptsRoot(*types.TipSet) (cid.Cid, error) - SubHeadChanges(context.Context) chan []*HeadChange + SubHeadChanges(context.Context) chan []*apitypes.HeadChange } type IStmgr interface { @@ -47,14 +48,6 @@ type Waiter struct { Stmgr IStmgr } -// ChainMessage is an on-chain message with its block and receipt. -type ChainMessage struct { //nolint - TS *types.TipSet - Message types.ChainMsg - Block *types.BlockHeader - Receipt *types.MessageReceipt -} - // WaitPredicate is a function that identifies a message and returns true when found. type WaitPredicate func(msg *types.Message, msgCid cid.Cid) bool @@ -69,7 +62,7 @@ func NewWaiter(chainStore waiterChainReader, messages MessageProvider, bs bstore } // Find searches the blockchain history (but doesn't wait). -func (w *Waiter) Find(ctx context.Context, msg types.ChainMsg, lookback abi.ChainEpoch, ts *types.TipSet, allowReplaced bool) (*ChainMessage, bool, error) { +func (w *Waiter) Find(ctx context.Context, msg types.ChainMsg, lookback abi.ChainEpoch, ts *types.TipSet, allowReplaced bool) (*apitypes.ChainMessage, bool, error) { if ts == nil { ts = w.chainReader.GetHead() } @@ -88,7 +81,7 @@ func (w *Waiter) Find(ctx context.Context, msg types.ChainMsg, lookback abi.Chai // This method will always check for the message in the current head tipset. // A lookback parameter > 1 will cause this method to check for the message in // up to that many previous tipsets on the chain of the current head. -func (w *Waiter) WaitPredicate(ctx context.Context, msg types.ChainMsg, confidence uint64, lookback abi.ChainEpoch, allowReplaced bool) (*ChainMessage, error) { +func (w *Waiter) WaitPredicate(ctx context.Context, msg types.ChainMsg, confidence uint64, lookback abi.ChainEpoch, allowReplaced bool) (*apitypes.ChainMessage, error) { ch := w.chainReader.SubHeadChanges(ctx) chainMsg, found, err := w.waitForMessage(ctx, ch, msg, confidence, lookback, allowReplaced) if err != nil { @@ -101,7 +94,7 @@ func (w *Waiter) WaitPredicate(ctx context.Context, msg types.ChainMsg, confiden } // Wait uses WaitPredicate to invoke the callback when a message with the given cid appears on chain. -func (w *Waiter) Wait(ctx context.Context, msg types.ChainMsg, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*ChainMessage, error) { +func (w *Waiter) Wait(ctx context.Context, msg types.ChainMsg, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*apitypes.ChainMessage, error) { mid := msg.VMMessage().Cid() log.Infof("Calling Waiter.Wait CID: %s", mid.String()) @@ -112,7 +105,7 @@ func (w *Waiter) Wait(ctx context.Context, msg types.ChainMsg, confidence uint64 // block and receipt, when it is found. Returns the found message/block or nil // if now block with the given CID exists in the chain. // The lookback parameter is the number of tipsets in the past this method will check before giving up. -func (w *Waiter) findMessage(ctx context.Context, from *types.TipSet, m types.ChainMsg, lookback abi.ChainEpoch, allowReplaced bool) (*ChainMessage, bool, error) { +func (w *Waiter) findMessage(ctx context.Context, from *types.TipSet, m types.ChainMsg, lookback abi.ChainEpoch, allowReplaced bool) (*apitypes.ChainMessage, bool, error) { limitHeight := from.Height() - lookback noLimit := lookback == constants.LookbackNoLimit @@ -178,7 +171,7 @@ func (w *Waiter) findMessage(ctx context.Context, from *types.TipSet, m types.Ch // channel closed without finding it), whether it was found, or an error. // notice matching mesage by message from and nonce. the return message may not be // expected, because there maybe another message have the same from and nonce value -func (w *Waiter) waitForMessage(ctx context.Context, ch <-chan []*HeadChange, msg types.ChainMsg, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*ChainMessage, bool, error) { +func (w *Waiter) waitForMessage(ctx context.Context, ch <-chan []*apitypes.HeadChange, msg types.ChainMsg, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*apitypes.ChainMessage, bool, error) { current, ok := <-ch if !ok { return nil, false, fmt.Errorf("SubHeadChanges stream was invalid") @@ -201,7 +194,7 @@ func (w *Waiter) waitForMessage(ctx context.Context, ch <-chan []*HeadChange, ms return chainMsg, found, nil } - var backRcp *ChainMessage + var backRcp *apitypes.ChainMessage backSearchWait := make(chan struct{}) go func() { r, foundMsg, err := w.findMessage(ctx, currentHead, msg, lookbackLimit, allowReplaced) @@ -216,7 +209,7 @@ func (w *Waiter) waitForMessage(ctx context.Context, ch <-chan []*HeadChange, ms }() var candidateTS *types.TipSet - var candidateRcp *ChainMessage + var candidateRcp *apitypes.ChainMessage heightOfHead := currentHead.Height() reverts := map[string]bool{} @@ -275,7 +268,7 @@ func (w *Waiter) waitForMessage(ctx context.Context, ch <-chan []*HeadChange, ms } } -func (w *Waiter) receiptForTipset(ctx context.Context, ts *types.TipSet, msg types.ChainMsg, allowReplaced bool) (*ChainMessage, bool, error) { +func (w *Waiter) receiptForTipset(ctx context.Context, ts *types.TipSet, msg types.ChainMsg, allowReplaced bool) (*apitypes.ChainMessage, bool, error) { // The genesis block if ts.Height() == 0 { return nil, false, nil @@ -307,7 +300,7 @@ func (w *Waiter) receiptForTipset(ctx context.Context, ts *types.TipSet, msg typ if err != nil { return nil, false, errors.Wrap(err, "error retrieving receipt from tipset") } - return &ChainMessage{ts, msg, bms.Block, recpt}, true, nil + return &apitypes.ChainMessage{TS: ts, Message: msg.VMMessage(), Block: bms.Block, Receipt: recpt}, true, nil } // this should be that message diff --git a/pkg/chain/waiter_test.go b/pkg/chain/waiter_test.go index fd29b634e8..5e3826d5fb 100644 --- a/pkg/chain/waiter_test.go +++ b/pkg/chain/waiter_test.go @@ -16,6 +16,8 @@ import ( tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" cbor "github.com/ipfs/go-ipld-cbor" "github.com/stretchr/testify/assert" + + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" ) var mockSigner, _ = testhelpers.NewMockSignersAndKeyInfo(10) @@ -37,7 +39,7 @@ func TestWaitRespectsContextCancel(t *testing.T) { _, _, _, waiter := setupTest(t) var err error - var chainMessage *ChainMessage + var chainMessage *apitypes.ChainMessage doneCh := make(chan struct{}) go func() { defer close(doneCh) diff --git a/pkg/consensus/expected.go b/pkg/consensus/expected.go index 244fe484e9..6ee870b118 100644 --- a/pkg/consensus/expected.go +++ b/pkg/consensus/expected.go @@ -89,7 +89,7 @@ type chainReader interface { GetGenesisBlock(context.Context) (*types.BlockHeader, error) GetLatestBeaconEntry(*types.TipSet) (*types.BeaconEntry, error) GetTipSetByHeight(context.Context, *types.TipSet, abi.ChainEpoch, bool) (*types.TipSet, error) - GetCirculatingSupplyDetailed(context.Context, abi.ChainEpoch, tree.Tree) (chain.CirculatingSupply, error) + GetCirculatingSupplyDetailed(context.Context, abi.ChainEpoch, tree.Tree) (types.CirculatingSupply, error) GetLookbackTipSetForRound(ctx context.Context, ts *types.TipSet, round abi.ChainEpoch, version network.Version) (*types.TipSet, cid.Cid, error) GetTipsetMetadata(*types.TipSet) (*chain.TipSetMetadata, error) PutTipSetMetadata(context.Context, *chain.TipSetMetadata) error diff --git a/pkg/events/cache.go b/pkg/events/cache.go index 3d742ccade..d9558f2d8e 100644 --- a/pkg/events/cache.go +++ b/pkg/events/cache.go @@ -8,14 +8,13 @@ import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/chain" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" types "github.com/filecoin-project/venus/venus-shared/chain" ) type uncachedAPI interface { - ChainNotify(context.Context) <-chan []*chain.HeadChange - ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*chain.HeadChange, error) + ChainNotify(context.Context) <-chan []*apitypes.HeadChange + ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*apitypes.HeadChange, error) StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) // optional / for CalledMsg diff --git a/pkg/events/eventAPI.go b/pkg/events/eventAPI.go index bacefbf0a9..3b20bdb434 100644 --- a/pkg/events/eventAPI.go +++ b/pkg/events/eventAPI.go @@ -7,7 +7,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/chain" apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" types "github.com/filecoin-project/venus/venus-shared/chain" ) @@ -19,14 +18,14 @@ type TipSetObserver interface { } type IEvent interface { - ChainNotify(context.Context) <-chan []*chain.HeadChange + ChainNotify(context.Context) <-chan []*apitypes.HeadChange ChainGetBlockMessages(context.Context, cid.Cid) (*apitypes.BlockMessages, error) ChainGetTipSetByHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) ChainGetTipSetAfterHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) ChainHead(context.Context) (*types.TipSet, error) StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) ChainGetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) - ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*chain.HeadChange, error) + ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*apitypes.HeadChange, error) StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) // optional / for CalledMsg } diff --git a/pkg/events/events_test.go b/pkg/events/events_test.go index a2141cb737..82d5f5bc65 100644 --- a/pkg/events/events_test.go +++ b/pkg/events/events_test.go @@ -51,7 +51,7 @@ type fakeCS struct { mu sync.Mutex waitSub chan struct{} - subCh chan<- []*chain.HeadChange + subCh chan<- []*apitypes.HeadChange callNumber map[string]int cancel context.CancelFunc @@ -104,7 +104,7 @@ func (fcs *fakeCS) ChainHead(ctx context.Context) (*types.TipSet, error) { return fcs.tsc.ChainHead(ctx) } -func (fcs *fakeCS) ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*chain.HeadChange, error) { +func (fcs *fakeCS) ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*apitypes.HeadChange, error) { fcs.mu.Lock() fcs.callNumber["ChainGetPath"] = fcs.callNumber["ChainGetPath"] + 1 fcs.mu.Unlock() @@ -127,12 +127,12 @@ func (fcs *fakeCS) ChainGetPath(ctx context.Context, from, to types.TipSetKey) ( return nil, err } - path := make([]*chain.HeadChange, len(revert)+len(apply)) + path := make([]*apitypes.HeadChange, len(revert)+len(apply)) for i, r := range revert { - path[i] = &chain.HeadChange{Type: chain.HCRevert, Val: r} + path[i] = &apitypes.HeadChange{Type: chain.HCRevert, Val: r} } for j, i := 0, len(apply)-1; i >= 0; j, i = j+1, i-1 { - path[j+len(revert)] = &chain.HeadChange{Type: chain.HCApply, Val: apply[i]} + path[j+len(revert)] = &apitypes.HeadChange{Type: chain.HCApply, Val: apply[i]} } return path, nil } @@ -219,12 +219,12 @@ func (fcs *fakeCS) makeTs(t *testing.T, parents []cid.Cid, h abi.ChainEpoch, msg return ts } -func (fcs *fakeCS) ChainNotify(ctx context.Context) <-chan []*chain.HeadChange { +func (fcs *fakeCS) ChainNotify(ctx context.Context) <-chan []*apitypes.HeadChange { fcs.mu.Lock() defer fcs.mu.Unlock() fcs.callNumber["ChainNotify"] = fcs.callNumber["ChainNotify"] + 1 - out := make(chan []*chain.HeadChange, 1) + out := make(chan []*apitypes.HeadChange, 1) if fcs.subCh != nil { close(out) fcs.t.Error("already subscribed to notifications") @@ -236,7 +236,7 @@ func (fcs *fakeCS) ChainNotify(ctx context.Context) <-chan []*chain.HeadChange { panic(err) } - out <- []*chain.HeadChange{{Type: chain.HCCurrent, Val: best}} + out <- []*apitypes.HeadChange{{Type: chain.HCCurrent, Val: best}} fcs.subCh = out close(fcs.waitSub) @@ -301,16 +301,16 @@ func (fcs *fakeCS) dropSub() { func (fcs *fakeCS) sub(rev, app []*types.TipSet) { <-fcs.waitSub - notif := make([]*chain.HeadChange, len(rev)+len(app)) + notif := make([]*apitypes.HeadChange, len(rev)+len(app)) for i, r := range rev { - notif[i] = &chain.HeadChange{ + notif[i] = &apitypes.HeadChange{ Type: chain.HCRevert, Val: r, } } for i, r := range app { - notif[i+len(rev)] = &chain.HeadChange{ + notif[i+len(rev)] = &apitypes.HeadChange{ Type: chain.HCApply, Val: r, } diff --git a/pkg/events/observer.go b/pkg/events/observer.go index 50fc261afb..19b91a4d4b 100644 --- a/pkg/events/observer.go +++ b/pkg/events/observer.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/constants" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" types "github.com/filecoin-project/venus/venus-shared/chain" ) @@ -103,7 +104,7 @@ func (o *observer) listenHeadChangesOnce(ctx context.Context) error { return nil } -func (o *observer) applyChanges(ctx context.Context, changes []*chain.HeadChange) error { +func (o *observer) applyChanges(ctx context.Context, changes []*apitypes.HeadChange) error { // Used to wait for a prior notification round to finish (by tests) if len(changes) == 0 { return nil diff --git a/pkg/fork/fork.go b/pkg/fork/fork.go index 84b7973305..c45de572ef 100644 --- a/pkg/fork/fork.go +++ b/pkg/fork/fork.go @@ -49,6 +49,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" "github.com/filecoin-project/venus/venus-shared/actors/builtin/multisig" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" types "github.com/filecoin-project/venus/venus-shared/chain" ) @@ -337,7 +338,7 @@ type chainReader interface { GetTipSetByHeight(context.Context, *types.TipSet, abi.ChainEpoch, bool) (*types.TipSet, error) GetTipSetState(context.Context, *types.TipSet) (vmstate.Tree, error) GetGenesisBlock(context.Context) (*types.BlockHeader, error) - SubHeadChanges(context.Context) chan []*chain.HeadChange + SubHeadChanges(context.Context) chan []*apitypes.HeadChange } type IFork interface { diff --git a/pkg/market/fmgr.go b/pkg/market/fmgr.go index 771fbd2a54..61388bea22 100644 --- a/pkg/market/fmgr.go +++ b/pkg/market/fmgr.go @@ -3,7 +3,7 @@ package market import ( "context" - "github.com/filecoin-project/venus/app/client/apiface" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-address" @@ -21,9 +21,9 @@ type fundManager interface { } type fmgr struct { - MPoolAPI apiface.IMessagePool - ChainInfoAPI apiface.IChainInfo - MinerStateAPI apiface.IMinerState + MPoolAPI v1api.IMessagePool + ChainInfoAPI v1api.IChainInfo + MinerStateAPI v1api.IMinerState } func newFundmanager(p *FundManagerParams) fundManager { diff --git a/pkg/market/fundmanager.go b/pkg/market/fundmanager.go index 5e2cc99549..0fc7664542 100644 --- a/pkg/market/fundmanager.go +++ b/pkg/market/fundmanager.go @@ -5,13 +5,12 @@ import ( "fmt" "sync" - "github.com/filecoin-project/venus/app/client/apiface" - "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-address" @@ -26,9 +25,9 @@ import ( var log = logging.Logger("market_adapter") type FundManagerParams struct { - MP apiface.IMessagePool - CI apiface.IChainInfo - MS apiface.IMinerState + MP v1api.IMessagePool + CI v1api.IChainInfo + MS v1api.IMinerState DS repo.Datastore } diff --git a/pkg/net/network.go b/pkg/net/network.go index 6bedd4fc57..38d1cc3486 100644 --- a/pkg/net/network.go +++ b/pkg/net/network.go @@ -12,50 +12,9 @@ import ( swarm "github.com/libp2p/go-libp2p-swarm" ma "github.com/multiformats/go-multiaddr" "github.com/pkg/errors" -) - -// SwarmConnInfo represents details about a single swarm connection. -type SwarmConnInfo struct { - Addr string - Peer string - Latency string - Muxer string - Streams []SwarmStreamInfo -} - -// SwarmStreamInfo represents details about a single swarm stream. -type SwarmStreamInfo struct { - Protocol string -} - -func (ci *SwarmConnInfo) Less(i, j int) bool { - return ci.Streams[i].Protocol < ci.Streams[j].Protocol -} - -func (ci *SwarmConnInfo) Len() int { - return len(ci.Streams) -} - -func (ci *SwarmConnInfo) Swap(i, j int) { - ci.Streams[i], ci.Streams[j] = ci.Streams[j], ci.Streams[i] -} -// SwarmConnInfos represent details about a list of swarm connections. -type SwarmConnInfos struct { - Peers []SwarmConnInfo -} - -func (ci SwarmConnInfos) Less(i, j int) bool { - return ci.Peers[i].Addr < ci.Peers[j].Addr -} - -func (ci SwarmConnInfos) Len() int { - return len(ci.Peers) -} - -func (ci SwarmConnInfos) Swap(i, j int) { - ci.Peers[i], ci.Peers[j] = ci.Peers[j], ci.Peers[i] -} + "github.com/filecoin-project/venus/venus-shared/libp2p/net" +) // Network is a unified interface for dealing with libp2p type Network struct { @@ -92,16 +51,9 @@ func (network *Network) GetBandwidthStats() metrics.Stats { return network.Reporter.GetBandwidthTotals() } -// ConnectionResult represents the result of an attempted connection from the -// Connect method. -type ConnectionResult struct { - PeerID peer.ID - Err error -} - // Connect connects to peers at the given addresses. Does not retry. -func (network *Network) Connect(ctx context.Context, addrs []string) (<-chan ConnectionResult, error) { - outCh := make(chan ConnectionResult) +func (network *Network) Connect(ctx context.Context, addrs []string) (<-chan net.ConnectionResult, error) { + outCh := make(chan net.ConnectionResult) swrm, ok := network.host.Network().(*swarm.Swarm) if !ok { @@ -121,7 +73,7 @@ func (network *Network) Connect(ctx context.Context, addrs []string) (<-chan Con go func(pi peer.AddrInfo) { swrm.Backoff().Clear(pi.ID) err := network.host.Connect(ctx, pi) - outCh <- ConnectionResult{ + outCh <- net.ConnectionResult{ PeerID: pi.ID, Err: err, } @@ -137,21 +89,21 @@ func (network *Network) Connect(ctx context.Context, addrs []string) (<-chan Con } // Peers lists peers currently available on the network -func (network *Network) Peers(ctx context.Context, verbose, latency, streams bool) (*SwarmConnInfos, error) { +func (network *Network) Peers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) { if network.host == nil { return nil, errors.New("node must be online") } conns := network.host.Network().Conns() - out := SwarmConnInfos{ - Peers: []SwarmConnInfo{}, + out := net.SwarmConnInfos{ + Peers: []net.SwarmConnInfo{}, } for _, c := range conns { pid := c.RemotePeer() addr := c.RemoteMultiaddr() - ci := SwarmConnInfo{ + ci := net.SwarmConnInfo{ Addr: addr.String(), Peer: pid.Pretty(), } @@ -168,7 +120,7 @@ func (network *Network) Peers(ctx context.Context, verbose, latency, streams boo strs := c.GetStreams() for _, s := range strs { - ci.Streams = append(ci.Streams, SwarmStreamInfo{Protocol: string(s.Protocol())}) + ci.Streams = append(ci.Streams, net.SwarmStreamInfo{Protocol: string(s.Protocol())}) } } sort.Sort(&ci) diff --git a/pkg/paychmgr/manager.go b/pkg/paychmgr/manager.go index 053c84e372..ee6611e90a 100644 --- a/pkg/paychmgr/manager.go +++ b/pkg/paychmgr/manager.go @@ -6,7 +6,9 @@ import ( "sync" "github.com/filecoin-project/venus/pkg/statemanger" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" types "github.com/filecoin-project/venus/venus-shared/chain" + paychtypes "github.com/filecoin-project/venus/venus-shared/paych" "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" @@ -22,38 +24,6 @@ var log = logging.Logger("paych") var errProofNotSupported = errors.New("payment channel proof parameter is not supported") -type ChannelAvailableFunds struct { - // Channel is the address of the channel - Channel *address.Address - // From is the from address of the channel (channel creator) - From address.Address - // To is the to address of the channel - To address.Address - // ConfirmedAmt is the amount of funds that have been confirmed on-chain - // for the channel - ConfirmedAmt big.Int - // PendingAmt is the amount of funds that are pending confirmation on-chain - PendingAmt big.Int - // PendingWaitSentinel can be used with PaychGetWaitReady to wait for - // confirmation of pending funds - PendingWaitSentinel *cid.Cid - // QueuedAmt is the amount that is queued up behind a pending request - QueuedAmt big.Int - // VoucherRedeemedAmt is the amount that is redeemed by vouchers on-chain - // and in the local datastore - VoucherReedeemedAmt big.Int -} - -// VoucherCreateResult is the response to calling PaychVoucherCreate -type VoucherCreateResult struct { - // Voucher that was created, or nil if there was an error or if there - // were insufficient funds in the channel - Voucher *paych.SignedVoucher - // Shortfall is the additional amount that would be needed in the channel - // in order to be able to create the voucher - Shortfall big.Int -} - // managerAPI defines all methods needed by the manager type managerAPI interface { statemanger.IStateManager @@ -132,7 +102,7 @@ func (pm *Manager) GetPaych(ctx context.Context, from, to address.Address, amt b return chanAccessor.getPaych(ctx, amt) } -func (pm *Manager) AvailableFunds(ch address.Address) (*ChannelAvailableFunds, error) { +func (pm *Manager) AvailableFunds(ch address.Address) (*apitypes.ChannelAvailableFunds, error) { ca, err := pm.accessorByAddress(ch) if err != nil { return nil, err @@ -146,7 +116,7 @@ func (pm *Manager) AvailableFunds(ch address.Address) (*ChannelAvailableFunds, e return ca.availableFunds(ci.ChannelID) } -func (pm *Manager) AvailableFundsByFromTo(from address.Address, to address.Address) (*ChannelAvailableFunds, error) { +func (pm *Manager) AvailableFundsByFromTo(from address.Address, to address.Address) (*apitypes.ChannelAvailableFunds, error) { ca, err := pm.accessorByFromTo(from, to) if err != nil { return nil, err @@ -158,7 +128,7 @@ func (pm *Manager) AvailableFundsByFromTo(from address.Address, to address.Addre // return an empty ChannelAvailableFunds, so that clients can check // for the existence of a channel between from / to without getting // an error. - return &ChannelAvailableFunds{ + return &apitypes.ChannelAvailableFunds{ Channel: nil, From: from, To: to, @@ -217,7 +187,7 @@ func (pm *Manager) GetChannelInfo(addr address.Address) (*ChannelInfo, error) { return ca.getChannelInfo(addr) } -func (pm *Manager) CreateVoucher(ctx context.Context, ch address.Address, voucher paych.SignedVoucher) (*VoucherCreateResult, error) { +func (pm *Manager) CreateVoucher(ctx context.Context, ch address.Address, voucher paych.SignedVoucher) (*paychtypes.VoucherCreateResult, error) { ca, err := pm.accessorByAddress(ch) if err != nil { return nil, err diff --git a/pkg/paychmgr/paych.go b/pkg/paychmgr/paych.go index 70bcbabb47..99a88406d7 100644 --- a/pkg/paychmgr/paych.go +++ b/pkg/paychmgr/paych.go @@ -6,6 +6,7 @@ import ( "github.com/filecoin-project/venus/pkg/crypto" types "github.com/filecoin-project/venus/venus-shared/chain" + paychtypes "github.com/filecoin-project/venus/venus-shared/paych" "github.com/ipfs/go-cid" "golang.org/x/xerrors" @@ -113,7 +114,7 @@ func (ca *channelAccessor) outboundActiveByFromTo(from, to address.Address) (*Ch // nonce, signing the voucher and storing it in the local datastore. // If there are not enough funds in the channel to create the voucher, returns // the shortfall in funds. -func (ca *channelAccessor) createVoucher(ctx context.Context, ch address.Address, voucher paych.SignedVoucher) (*VoucherCreateResult, error) { +func (ca *channelAccessor) createVoucher(ctx context.Context, ch address.Address, voucher paych.SignedVoucher) (*paychtypes.VoucherCreateResult, error) { ca.lk.Lock() defer ca.lk.Unlock() @@ -148,7 +149,7 @@ func (ca *channelAccessor) createVoucher(ctx context.Context, ch address.Address // return a voucher create result with the shortfall var ife insufficientFundsErr if xerrors.As(err, &ife) { - return &VoucherCreateResult{ + return &paychtypes.VoucherCreateResult{ Shortfall: ife.Shortfall(), }, nil } @@ -156,7 +157,7 @@ func (ca *channelAccessor) createVoucher(ctx context.Context, ch address.Address return nil, xerrors.Errorf("failed to persist voucher: %w", err) } - return &VoucherCreateResult{Voucher: sv, Shortfall: big.NewInt(0)}, nil + return &paychtypes.VoucherCreateResult{Voucher: sv, Shortfall: big.NewInt(0)}, nil } func (ca *channelAccessor) nextNonceForLane(ci *ChannelInfo, lane uint64) uint64 { diff --git a/pkg/paychmgr/simple.go b/pkg/paychmgr/simple.go index 01d0de0521..8fc12cb077 100644 --- a/pkg/paychmgr/simple.go +++ b/pkg/paychmgr/simple.go @@ -16,6 +16,7 @@ import ( init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" "github.com/filecoin-project/venus/pkg/constants" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" types "github.com/filecoin-project/venus/venus-shared/chain" ) @@ -179,7 +180,7 @@ func (ca *channelAccessor) enqueue(task *fundsReq) { } // Run the operations in the queue -func (ca *channelAccessor) processQueue(channelID string) (*ChannelAvailableFunds, error) { +func (ca *channelAccessor) processQueue(channelID string) (*apitypes.ChannelAvailableFunds, error) { ca.lk.Lock() defer ca.lk.Unlock() @@ -275,7 +276,7 @@ func (ca *channelAccessor) msgWaitComplete(mcid cid.Cid, err error) { } } -func (ca *channelAccessor) currentAvailableFunds(channelID string, queuedAmt big.Int) (*ChannelAvailableFunds, error) { +func (ca *channelAccessor) currentAvailableFunds(channelID string, queuedAmt big.Int) (*apitypes.ChannelAvailableFunds, error) { if len(channelID) == 0 { return nil, nil } @@ -316,7 +317,7 @@ func (ca *channelAccessor) currentAvailableFunds(channelID string, queuedAmt big } } - return &ChannelAvailableFunds{ + return &apitypes.ChannelAvailableFunds{ Channel: channelInfo.Channel, From: channelInfo.from(), To: channelInfo.to(), @@ -686,6 +687,6 @@ func (ca *channelAccessor) msgPromise(ctx context.Context, mcid cid.Cid) chan on return promise } -func (ca *channelAccessor) availableFunds(channelID string) (*ChannelAvailableFunds, error) { +func (ca *channelAccessor) availableFunds(channelID string) (*apitypes.ChannelAvailableFunds, error) { return ca.processQueue(channelID) } diff --git a/tools/client/main.go b/tools/client/main.go index 93fd67151f..0b59d5932f 100644 --- a/tools/client/main.go +++ b/tools/client/main.go @@ -13,8 +13,8 @@ import ( manet "github.com/multiformats/go-multiaddr/net" "github.com/filecoin-project/venus/app/client" - "github.com/filecoin-project/venus/app/client/v0api" "github.com/filecoin-project/venus/pkg/constants" + v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" types "github.com/filecoin-project/venus/venus-shared/chain" ) diff --git a/tools/conformance/rand_record.go b/tools/conformance/rand_record.go index 69f32271c7..bd0ebf00c1 100644 --- a/tools/conformance/rand_record.go +++ b/tools/conformance/rand_record.go @@ -5,8 +5,8 @@ import ( "fmt" "sync" - "github.com/filecoin-project/venus/app/client/apiface" "github.com/filecoin-project/venus/pkg/vm/vmcontext" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/go-state-types/abi" @@ -17,7 +17,7 @@ import ( type RecordingRand struct { reporter Reporter - api apiface.FullNode + api v1api.FullNode // once guards the loading of the head tipset. // can be removed when https://github.com/filecoin-project/lotus/issues/4223 // is fixed. @@ -40,7 +40,7 @@ var _ vmcontext.HeadChainRandomness = (*RecordingRand)(nil) // NewRecordingRand returns a vm.Rand implementation that proxies calls to a // full Lotus node via JSON-RPC, and records matching rules and responses so // they can later be embedded in test vectors. -func NewRecordingRand(reporter Reporter, api apiface.FullNode) *RecordingRand { +func NewRecordingRand(reporter Reporter, api v1api.FullNode) *RecordingRand { return &RecordingRand{reporter: reporter, api: api} } diff --git a/tools/fast/action_swarm.go b/tools/fast/action_swarm.go index 17c6b9b3bb..c8d22a65b3 100644 --- a/tools/fast/action_swarm.go +++ b/tools/fast/action_swarm.go @@ -3,14 +3,14 @@ package fast import ( "context" "encoding/json" + "io" + "github.com/filecoin-project/venus/cmd" + "github.com/filecoin-project/venus/venus-shared/libp2p/net" "github.com/ipfs/go-cid" - "io" "github.com/libp2p/go-libp2p-core/peer" "github.com/multiformats/go-multiaddr" - - "github.com/filecoin-project/venus/pkg/net" ) // ID runs the `id` command against the filecoin process diff --git a/tools/gen/api/stable_method_info.json b/tools/gen/api/stable_method_info.json index 2f585fc8d5..de50e4bd25 100644 --- a/tools/gen/api/stable_method_info.json +++ b/tools/gen/api/stable_method_info.json @@ -447,6 +447,7 @@ "ClientDataTransferUpdates": "write", "ClientDealPieceCID": "read", "ClientDealSize": "read", + "ClientExport": "admin", "ClientFindData": "read", "ClientGenCar": "write", "ClientGetDealInfo": "read", @@ -465,7 +466,7 @@ "ClientRestartDataTransfer": "write", "ClientRetrieve": "admin", "ClientRetrieveTryRestartInsufficientFunds": "write", - "ClientRetrieveWithEvents": "admin", + "ClientRetrieveWait": "admin", "ClientStartDeal": "admin", "ClientStatelessDeal": "write", "Closing": "read", @@ -480,6 +481,7 @@ "MarketReleaseFunds": "sign", "MarketReserveFunds": "sign", "MarketWithdraw": "sign", + "MsigCancelTxnHash": "sign", "MsigGetAvailableBalance": "read", "MsigGetPending": "read", "MsigGetVestingSchedule": "read", diff --git a/venus-devtool/apigen/proxygen.go b/venus-devtool/apigen/proxygen.go index b158d0977f..a458432516 100644 --- a/venus-devtool/apigen/proxygen.go +++ b/venus-devtool/apigen/proxygen.go @@ -3,14 +3,10 @@ package main import ( "encoding/json" "fmt" - "github.com/filecoin-project/go-jsonrpc/auth" - _ "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/venus/app/client/funcrule" "go/ast" "go/build" "go/parser" "go/token" - "golang.org/x/xerrors" "io/fs" "io/ioutil" "os" @@ -21,6 +17,11 @@ import ( "strings" "text/template" "unicode" + + "github.com/filecoin-project/go-jsonrpc/auth" + _ "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/venus/app/client/funcrule" + "golang.org/x/xerrors" ) const ( @@ -151,7 +152,7 @@ func v0API(lpath string, onlyCompare bool) *stableMethodInfo { checkError(err) // outputWithJSON(bmp, "v0 benchmarkMethodPerm: ") - mm, err := methodMetaFromInterface(path.Join(VenusAPIPath, "chain/v0"), "v0api", "v0api") + mm, err := methodMetaFromInterface(path.Join(VenusAPIPath, "chain/v0"), "v0", "v0") checkError(err) smi := check(bmp, mm) diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index 6afed6bb1c..0a22ab52d0 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -14,6 +14,7 @@ require ( ) replace ( + github.com/filecoin-project/go-jsonrpc => github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc github.com/filecoin-project/venus => ../ github.com/filecoin-project/venus/venus-shared => ../venus-shared/ github.com/ipfs/go-ipfs-cmds => github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index 9dabf2b19d..7f550ce677 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -386,10 +386,6 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-jsonrpc v0.1.3/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= -github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543/go.mod h1:mjrHv1cDGJWDlGmC0eDc1E5VJr8DmL9XMUcaFwiuKg8= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= @@ -404,7 +400,6 @@ github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= @@ -782,6 +777,8 @@ github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab h1:+Jov61TTljdzTKBecQizmUWJ6IIoVgzjukKppVr5TgI= github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= +github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc h1:L4JH2Ltl/Embq4qYezs3RsIYW1BB/fB9TfUkk42FOzU= +github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/ipfs-force-community/metrics v1.0.0/go.mod h1:mn40SioMuKtjmRumHFy/fJ26Pn028XuDjUJE9dorjyw= github.com/ipfs-force-community/metrics v1.0.1-0.20211022060227-11142a08b729/go.mod h1:mn40SioMuKtjmRumHFy/fJ26Pn028XuDjUJE9dorjyw= github.com/ipfs-force-community/venus-common-utils v0.0.0-20210714054928-2042a9040759/go.mod h1:AWIt7L1UiUeIzqQdjQ/quZcVcCdnr6GXabGLBgEIMzU= diff --git a/venus-shared/api/chain/types.go b/venus-shared/api/chain/types.go index 6cd60002e2..e41006e500 100644 --- a/venus-shared/api/chain/types.go +++ b/venus-shared/api/chain/types.go @@ -237,6 +237,22 @@ type ActiveSync struct { Message string } +// sync +type Target struct { + State SyncStateStage + Base *chain.TipSet + Current *chain.TipSet + Start time.Time + End time.Time + Err error + chain.ChainInfo +} + +type TargetTracker struct { + History []*Target + Buckets []*Target +} + type MsgGasCost struct { Message cid.Cid // Can be different than requested, in case it was replaced, but only gas values changed GasUsed abi.TokenAmount diff --git a/venus-shared/api/chain/v0/blockstore.go b/venus-shared/api/chain/v0/blockstore.go index 3cfcd97043..adca654f68 100644 --- a/venus-shared/api/chain/v0/blockstore.go +++ b/venus-shared/api/chain/v0/blockstore.go @@ -1,4 +1,4 @@ -package v0api +package v0 import ( "context" diff --git a/venus-shared/api/chain/v0/chain.go b/venus-shared/api/chain/v0/chain.go index 3a8f14f684..4cc4e6b20d 100644 --- a/venus-shared/api/chain/v0/chain.go +++ b/venus-shared/api/chain/v0/chain.go @@ -1,4 +1,4 @@ -package v0api +package v0 import ( "context" diff --git a/venus-shared/api/chain/v0/discovery.go b/venus-shared/api/chain/v0/discovery.go index 2e92f5579e..2fd1fe7bcd 100644 --- a/venus-shared/api/chain/v0/discovery.go +++ b/venus-shared/api/chain/v0/discovery.go @@ -1,4 +1,4 @@ -package v0api +package v0 type IDiscovery interface { } diff --git a/venus-shared/api/chain/v0/fullnode.go b/venus-shared/api/chain/v0/fullnode.go index d9b7162fdd..cd812ddbcc 100644 --- a/venus-shared/api/chain/v0/fullnode.go +++ b/venus-shared/api/chain/v0/fullnode.go @@ -11,7 +11,7 @@ TODO: 1. Support global FUNC injection */ -package v0api +package v0 type FullNode interface { IBlockStore diff --git a/venus-shared/api/chain/v0/jwtauth.go b/venus-shared/api/chain/v0/jwtauth.go index 6c52109f92..a32f7dd0f5 100644 --- a/venus-shared/api/chain/v0/jwtauth.go +++ b/venus-shared/api/chain/v0/jwtauth.go @@ -1,4 +1,4 @@ -package v0api +package v0 import ( "context" diff --git a/venus-shared/api/chain/v0/market.go b/venus-shared/api/chain/v0/market.go index e5083d087c..36d80dec11 100644 --- a/venus-shared/api/chain/v0/market.go +++ b/venus-shared/api/chain/v0/market.go @@ -1,4 +1,4 @@ -package v0api +package v0 import ( "context" diff --git a/venus-shared/api/chain/v0/mining.go b/venus-shared/api/chain/v0/mining.go index 977b58d5d7..df8442f1a4 100644 --- a/venus-shared/api/chain/v0/mining.go +++ b/venus-shared/api/chain/v0/mining.go @@ -1,4 +1,4 @@ -package v0api +package v0 import ( "context" diff --git a/venus-shared/api/chain/v0/mpool.go b/venus-shared/api/chain/v0/mpool.go index 1c7c8c64e0..b3b481c42c 100644 --- a/venus-shared/api/chain/v0/mpool.go +++ b/venus-shared/api/chain/v0/mpool.go @@ -1,4 +1,4 @@ -package v0api +package v0 import ( "context" diff --git a/venus-shared/api/chain/v0/multisig.go b/venus-shared/api/chain/v0/multisig.go index 54930f7d5a..2673c422bc 100644 --- a/venus-shared/api/chain/v0/multisig.go +++ b/venus-shared/api/chain/v0/multisig.go @@ -1,4 +1,4 @@ -package v0api +package v0 import ( "context" diff --git a/venus-shared/api/chain/v0/network.go b/venus-shared/api/chain/v0/network.go index a5907f4747..fd00a5d835 100644 --- a/venus-shared/api/chain/v0/network.go +++ b/venus-shared/api/chain/v0/network.go @@ -1,4 +1,4 @@ -package v0api +package v0 import ( "context" diff --git a/venus-shared/api/chain/v0/paych.go b/venus-shared/api/chain/v0/paych.go index 3c6b3ce668..b738725cee 100644 --- a/venus-shared/api/chain/v0/paych.go +++ b/venus-shared/api/chain/v0/paych.go @@ -1,4 +1,4 @@ -package v0api +package v0 import ( "context" diff --git a/venus-shared/api/chain/v0/proxy_gen.go b/venus-shared/api/chain/v0/proxy_gen.go index ad95e1ccf7..ad37fd695d 100644 --- a/venus-shared/api/chain/v0/proxy_gen.go +++ b/venus-shared/api/chain/v0/proxy_gen.go @@ -1,6 +1,6 @@ // Code generated by github.com/filecoin-project/tools/gen/api. DO NOT EDIT. -package v0api +package v0 import ( "context" @@ -953,6 +953,8 @@ type ISyncerStruct struct { SyncState func(p0 context.Context) (*chain2.SyncState, error) `perm:"read"` SyncSubmitBlock func(p0 context.Context, p1 *chain.BlockMsg) error `perm:"write"` + + SyncerTracker func(p0 context.Context) *chain2.TargetTracker `perm:"read"` } } @@ -984,6 +986,10 @@ func (s *ISyncerStruct) SyncSubmitBlock(p0 context.Context, p1 *chain.BlockMsg) return s.Internal.SyncSubmitBlock(p0, p1) } +func (s *ISyncerStruct) SyncerTracker(p0 context.Context) *chain2.TargetTracker { + return s.Internal.SyncerTracker(p0) +} + type IWalletStruct struct { Internal struct { HasPassword func(p0 context.Context) bool `perm:"admin"` diff --git a/venus-shared/api/chain/v0/syncer.go b/venus-shared/api/chain/v0/syncer.go index 51acbd7cd2..413db069b2 100644 --- a/venus-shared/api/chain/v0/syncer.go +++ b/venus-shared/api/chain/v0/syncer.go @@ -1,4 +1,4 @@ -package v0api +package v0 import ( "context" @@ -14,10 +14,8 @@ type ISyncer interface { ChainSyncHandleNewTipSet(ctx context.Context, ci *chain.ChainInfo) error // Rule[perm:admin] SetConcurrent(ctx context.Context, concurrent int64) error - // Rule[perm:read] - //SyncerTracker(ctx context.Context) *chain.TargetTracker - + SyncerTracker(ctx context.Context) *chain2.TargetTracker // Rule[perm:read] Concurrent(ctx context.Context) int64 // Rule[perm:read] diff --git a/venus-shared/api/chain/v0/wallet.go b/venus-shared/api/chain/v0/wallet.go index 5989045826..1f78fb5c20 100644 --- a/venus-shared/api/chain/v0/wallet.go +++ b/venus-shared/api/chain/v0/wallet.go @@ -1,4 +1,4 @@ -package v0api +package v0 import ( "context" diff --git a/venus-shared/api/chain/v1/jwtauth.go b/venus-shared/api/chain/v1/jwtauth.go index c4fe684a9f..d2c24ca86f 100644 --- a/venus-shared/api/chain/v1/jwtauth.go +++ b/venus-shared/api/chain/v1/jwtauth.go @@ -9,6 +9,6 @@ import ( type IJwtAuthAPI interface { // Rule[perm:read] Verify(ctx context.Context, host, token string) ([]auth.Permission, error) - // Rule[perm:read] + // Rule[perm:admin] AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) } diff --git a/venus-shared/api/chain/v1/paych.go b/venus-shared/api/chain/v1/paych.go index d630fc75bc..c02d557f06 100644 --- a/venus-shared/api/chain/v1/paych.go +++ b/venus-shared/api/chain/v1/paych.go @@ -27,11 +27,11 @@ type IPaychan interface { // @to: he payment channel recipient // Rule[perm:sign] PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*chain2.ChannelAvailableFunds, error) - // PaychGetWaitsigny waits until the create channel / add funds message with the sentinel + // PaychGetWaitReady waits until the create channel / add funds message with the sentinel // @sentinel: given message CID arrives. // @ch: the returned channel address can safely be used against the Manager methods. // Rule[perm:sign] - PaychGetWaitsigny(ctx context.Context, sentinel cid.Cid) (address.Address, error) + PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (address.Address, error) // PaychAllocateLane Allocate late creates a lane within a payment channel so that calls to // CreatePaymentVoucher will automatically make vouchers only for the difference in total // Rule[perm:sign] @@ -76,7 +76,7 @@ type IPaychan interface { // PaychVoucherAdd adds a voucher for an inbound channel. // If the channel is not in the store, fetches the channel from state (and checks that // the channel To address is owned by the wallet). - // Rule[perm:sign] + // Rule[perm:write] PaychVoucherAdd(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) // PaychVoucherCreate creates a new signed voucher on the given payment channel // with the given lane and amount. The value passed in is exactly the value diff --git a/venus-shared/api/chain/v1/proxy_gen.go b/venus-shared/api/chain/v1/proxy_gen.go index 09afef5aa2..860f7720ed 100644 --- a/venus-shared/api/chain/v1/proxy_gen.go +++ b/venus-shared/api/chain/v1/proxy_gen.go @@ -328,7 +328,7 @@ func (s *IChainInfoStruct) VerifyEntry(p0 *chain.BeaconEntry, p1 *chain.BeaconEn type IJwtAuthAPIStruct struct { Internal struct { - AuthNew func(p0 context.Context, p1 []auth.Permission) ([]byte, error) `perm:"read"` + AuthNew func(p0 context.Context, p1 []auth.Permission) ([]byte, error) `perm:"admin"` Verify func(p0 context.Context, p1 string, p2 string) ([]auth.Permission, error) `perm:"read"` } @@ -864,7 +864,7 @@ type IPaychanStruct struct { PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paych.ChannelInfo, error) `perm:"sign"` - PaychGetWaitsigny func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` + PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` @@ -874,7 +874,7 @@ type IPaychanStruct struct { PaychStatus func(p0 context.Context, p1 address.Address) (*paych.Status, error) `perm:"read"` - PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"sign"` + PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` @@ -908,8 +908,8 @@ func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 add return s.Internal.PaychGet(p0, p1, p2, p3) } -func (s *IPaychanStruct) PaychGetWaitsigny(p0 context.Context, p1 cid.Cid) (address.Address, error) { - return s.Internal.PaychGetWaitsigny(p0, p1) +func (s *IPaychanStruct) PaychGetWaitReady(p0 context.Context, p1 cid.Cid) (address.Address, error) { + return s.Internal.PaychGetWaitReady(p0, p1) } func (s *IPaychanStruct) PaychList(p0 context.Context) ([]address.Address, error) { @@ -967,6 +967,8 @@ type ISyncerStruct struct { SyncState func(p0 context.Context) (*chain2.SyncState, error) `perm:"read"` SyncSubmitBlock func(p0 context.Context, p1 *chain.BlockMsg) error `perm:"write"` + + SyncerTracker func(p0 context.Context) *chain2.TargetTracker `perm:"read"` } } @@ -998,6 +1000,10 @@ func (s *ISyncerStruct) SyncSubmitBlock(p0 context.Context, p1 *chain.BlockMsg) return s.Internal.SyncSubmitBlock(p0, p1) } +func (s *ISyncerStruct) SyncerTracker(p0 context.Context) *chain2.TargetTracker { + return s.Internal.SyncerTracker(p0) +} + type IWalletStruct struct { Internal struct { HasPassword func(p0 context.Context) bool `perm:"admin"` @@ -1022,7 +1028,7 @@ type IWalletStruct struct { WalletNewAddress func(p0 address.Protocol) (address.Address, error) `perm:"write"` - WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"admin"` + WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) `perm:"sign"` diff --git a/venus-shared/api/chain/v1/syncer.go b/venus-shared/api/chain/v1/syncer.go index fc1471f908..7d9a434fbb 100644 --- a/venus-shared/api/chain/v1/syncer.go +++ b/venus-shared/api/chain/v1/syncer.go @@ -14,10 +14,8 @@ type ISyncer interface { ChainSyncHandleNewTipSet(ctx context.Context, ci *chain.ChainInfo) error // Rule[perm:admin] SetConcurrent(ctx context.Context, concurrent int64) error - // Rule[perm:read] - // SyncerTracker(ctx context.Context) *syncTypes.TargetTracker - + SyncerTracker(ctx context.Context) *chain2.TargetTracker // Rule[perm:read] Concurrent(ctx context.Context) int64 // Rule[perm:read] diff --git a/venus-shared/api/chain/v1/wallet.go b/venus-shared/api/chain/v1/wallet.go index d45d69bade..8c24d740a4 100644 --- a/venus-shared/api/chain/v1/wallet.go +++ b/venus-shared/api/chain/v1/wallet.go @@ -28,7 +28,7 @@ type IWallet interface { WalletDefaultAddress(ctx context.Context) (address.Address, error) //not exists in remote // Rule[perm:admin] WalletAddresses(ctx context.Context) []address.Address - // Rule[perm:admin] + // Rule[perm:write] WalletSetDefault(ctx context.Context, addr address.Address) error //not exists in remote // Rule[perm:sign] WalletSignMessage(ctx context.Context, k address.Address, msg *chain.Message) (*chain.SignedMessage, error) diff --git a/venus-shared/compatible-checks/api-permission.json b/venus-shared/compatible-checks/api-permission.json index d4be1294e7..5cfbc85f1a 100644 --- a/venus-shared/compatible-checks/api-permission.json +++ b/venus-shared/compatible-checks/api-permission.json @@ -158,6 +158,7 @@ "SetPassword": "admin", "StateMinerSectorSize": "read", "StateMinerWorkerAddress": "read", + "SyncerTracker": "read", "UnLockWallet": "admin", "Verify": "read", "VerifyEntry": "read", @@ -254,6 +255,7 @@ }, "V1": { "Common": { + "AuthNew": "admin", "BeaconGetEntry": "read", "ChainDeleteObj": "admin", "ChainExport": "read", @@ -315,10 +317,12 @@ "PaychAvailableFundsByFromTo": "sign", "PaychCollect": "sign", "PaychGet": "sign", + "PaychGetWaitReady": "sign", "PaychList": "read", "PaychNewPayment": "sign", "PaychSettle": "sign", "PaychStatus": "read", + "PaychVoucherAdd": "write", "PaychVoucherCheckSpendable": "read", "PaychVoucherCheckValid": "read", "PaychVoucherCreate": "sign", @@ -372,6 +376,7 @@ "WalletExport": "admin", "WalletHas": "write", "WalletImport": "admin", + "WalletSetDefault": "write", "WalletSign": "sign", "WalletSignMessage": "sign" }, @@ -404,13 +409,13 @@ "NetworkGetPeerAddresses": "admin", "NetworkGetPeerID": "admin", "NetworkPeers": "read", - "PaychGetWaitsigny": "sign", "ProtocolParameters": "read", "ResolveToKeyAddr": "read", "SetConcurrent": "admin", "SetPassword": "admin", "StateMinerSectorSize": "read", "StateMinerWorkerAddress": "read", + "SyncerTracker": "read", "UnLockWallet": "admin", "Verify": "read", "VerifyEntry": "read", @@ -430,6 +435,7 @@ "ClientDataTransferUpdates": "write", "ClientDealPieceCID": "read", "ClientDealSize": "read", + "ClientExport": "admin", "ClientFindData": "read", "ClientGenCar": "write", "ClientGetDealInfo": "read", @@ -448,7 +454,7 @@ "ClientRestartDataTransfer": "write", "ClientRetrieve": "admin", "ClientRetrieveTryRestartInsufficientFunds": "write", - "ClientRetrieveWithEvents": "admin", + "ClientRetrieveWait": "admin", "ClientStartDeal": "admin", "ClientStatelessDeal": "write", "Closing": "read", @@ -463,6 +469,7 @@ "MarketReleaseFunds": "sign", "MarketReserveFunds": "sign", "MarketWithdraw": "sign", + "MsigCancelTxnHash": "sign", "MsigGetAvailableBalance": "read", "MsigGetPending": "read", "MsigGetVestingSchedule": "read", @@ -482,7 +489,6 @@ "NetPeers": "read", "NetPubsubScores": "read", "NodeStatus": "read", - "PaychGetWaitReady": "sign", "Session": "read", "Shutdown": "admin", "StateAllMinerFaults": "read", @@ -506,10 +512,6 @@ "WalletValidateAddress": "read", "WalletVerify": "read" }, - "Gap": { - "AuthNew": "venus:read lotus:admin", - "PaychVoucherAdd": "venus:sign lotus:write", - "WalletSetDefault": "venus:admin lotus:write" - } + "Gap": {} } } \ No newline at end of file From d8f7ba0dfa295dc7ff058f94a0ea1160f21567c0 Mon Sep 17 00:00:00 2001 From: zl Date: Fri, 24 Dec 2021 16:18:34 +0800 Subject: [PATCH 081/167] tool for auto generate api document. (#4640) --- Makefile | 12 +- venus-devtool/api-docs-gen/cmd/docgen.go | 123 + venus-devtool/api-docs-gen/docgen.go | 417 ++ venus-devtool/{apigen => api-gen}/proxygen.go | 0 venus-devtool/go.mod | 11 + venus-shared/api/api-document.md | 4573 +++++++++++++++++ venus-shared/wallet/msg_meta.go | 6 +- 7 files changed, 5138 insertions(+), 4 deletions(-) create mode 100644 venus-devtool/api-docs-gen/cmd/docgen.go create mode 100644 venus-devtool/api-docs-gen/docgen.go rename venus-devtool/{apigen => api-gen}/proxygen.go (100%) create mode 100644 venus-shared/api/api-document.md diff --git a/Makefile b/Makefile index d9e7817db6..9df6315f65 100644 --- a/Makefile +++ b/Makefile @@ -30,10 +30,20 @@ gen-api: gofmt -s -l -w ./app/client/v0api/full.go v2-gen-api: - cd ./venus-devtool/ && go run ./apigen/ + cd ./venus-devtool/ && go run ./api-gen/ gofmt -s -l -w ./venus-shared/api/chain/v0/proxy_gen.go; gofmt -s -l -w ./venus-shared/api/chain/v1/proxy_gen.go +docfile = ./venus-shared/api/api-document.md +api-docs: + cd ./venus-devtool/ && \ + go run ./api-docs-gen/cmd \ + ../venus-shared/api/chain/v1/fullnode.go \ + FullNode v1 \ + ../venus-shared/api/chain/v1 > \ + .$(docfile) + echo json-rpc-doc-file : $(docfile) + compare-api: go run ./tools/gen/api/proxygen.go compare diff --git a/venus-devtool/api-docs-gen/cmd/docgen.go b/venus-devtool/api-docs-gen/cmd/docgen.go new file mode 100644 index 0000000000..7371e20bc1 --- /dev/null +++ b/venus-devtool/api-docs-gen/cmd/docgen.go @@ -0,0 +1,123 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "reflect" + "sort" + "strings" + + "github.com/filecoin-project/venus/venus-devtool/api-docs-gen" +) + +func main() { + comments, groupComments := docgen.ParseApiASTInfo(os.Args[1], os.Args[2], os.Args[3], os.Args[4]) + + groups := make(map[string]*docgen.MethodGroup) + + _, t, permStruct := docgen.GetAPIType(os.Args[2], os.Args[3]) + + for i := 0; i < t.NumMethod(); i++ { + m := t.Method(i) + + groupName := docgen.MethodGroupFromName(m.Name) + + g, ok := groups[groupName] + if !ok { + g = new(docgen.MethodGroup) + g.Header = groupComments[groupName] + g.GroupName = groupName + groups[groupName] = g + } + var args []interface{} + ft := m.Func.Type() + for j := 2; j < ft.NumIn(); j++ { + inp := ft.In(j) + args = append(args, docgen.ExampleValue(m.Name, inp, nil)) + } + + v, err := json.MarshalIndent(args, "", " ") + if err != nil { + panic(err) + } + + outv := docgen.ExampleValue(m.Name, ft.Out(0), nil) + if outv == nil { + continue + } + + ov, err := json.MarshalIndent(outv, "", " ") + if err != nil { + panic(err) + } + + g.Methods = append(g.Methods, &docgen.Method{ + Name: m.Name, + Comment: comments[m.Name], + InputExample: string(v), + ResponseExample: string(ov), + }) + } + + var groupslice []*docgen.MethodGroup + for _, g := range groups { + groupslice = append(groupslice, g) + } + + sort.Slice(groupslice, func(i, j int) bool { + return groupslice[i].GroupName < groupslice[j].GroupName + }) + + fmt.Printf("# Groups\n") + + for _, g := range groupslice { + fmt.Printf("* [%s](#%s)\n", g.GroupName, g.GroupName) + for _, method := range g.Methods { + fmt.Printf(" * [%s](#%s)\n", method.Name, method.Name) + } + } + + for _, g := range groupslice { + g := g + fmt.Printf("## %s\n", g.GroupName) + fmt.Printf("%s\n\n", g.Header) + + sort.Slice(g.Methods, func(i, j int) bool { + return g.Methods[i].Name < g.Methods[j].Name + }) + + for _, m := range g.Methods { + fmt.Printf("### %s\n", m.Name) + fmt.Printf("%s\n\n", m.Comment) + + var meth reflect.StructField + var ok bool + for _, ps := range permStruct { + meth, ok = ps.FieldByName(m.Name) + if ok { + break + } + } + if !ok { + panic("no perms for method: " + m.Name) + } + + perms := meth.Tag.Get("perm") + + fmt.Printf("Perms: %s\n\n", perms) + + if strings.Count(m.InputExample, "\n") > 0 { + fmt.Printf("Inputs:\n```json\n%s\n```\n\n", m.InputExample) + } else { + fmt.Printf("Inputs: `%s`\n\n", m.InputExample) + } + + if strings.Count(m.ResponseExample, "\n") > 0 { + fmt.Printf("Response:\n```json\n%s\n```\n\n", m.ResponseExample) + } else { + fmt.Printf("Response: `%s`\n\n", m.ResponseExample) + } + } + } +} diff --git a/venus-devtool/api-docs-gen/docgen.go b/venus-devtool/api-docs-gen/docgen.go new file mode 100644 index 0000000000..45e3a736fd --- /dev/null +++ b/venus-devtool/api-docs-gen/docgen.go @@ -0,0 +1,417 @@ +package docgen + +import ( + "fmt" + network2 "github.com/filecoin-project/go-state-types/network" + chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" + v0 "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + v1 "github.com/filecoin-project/venus/venus-shared/api/chain/v1" + "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/messagepool" + "github.com/filecoin-project/venus/venus-shared/paych" + "github.com/filecoin-project/venus/venus-shared/stmgr" + "github.com/filecoin-project/venus/venus-shared/wallet" + "os" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + datatransfer "github.com/filecoin-project/go-data-transfer" + "github.com/filecoin-project/go-fil-markets/retrievalmarket" + "github.com/filecoin-project/go-jsonrpc/auth" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/exitcode" + "github.com/filecoin-project/venus/venus-shared/api" + "github.com/ipfs/go-cid" + "github.com/ipfs/go-graphsync" + textselector "github.com/ipld/go-ipld-selector-text-lite" + "github.com/libp2p/go-libp2p-core/metrics" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/protocol" + pubsub "github.com/libp2p/go-libp2p-pubsub" + "github.com/multiformats/go-multiaddr" + "go/ast" + "go/parser" + "go/token" + "path/filepath" + "reflect" + "strings" + "time" + "unicode" +) + +var ExampleValues = map[reflect.Type]interface{}{ + reflect.TypeOf(auth.Permission("")): auth.Permission("write"), + reflect.TypeOf(""): "string value", + reflect.TypeOf(uint64(42)): uint64(42), + reflect.TypeOf(byte(7)): byte(7), + reflect.TypeOf([]byte{}): []byte("byte array"), +} + +func addExample(v interface{}) { + ExampleValues[reflect.TypeOf(v)] = v +} + +func init() { + c, err := cid.Decode("bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4") + if err != nil { + panic(err) + } + + ExampleValues[reflect.TypeOf(c)] = c + + c2, err := cid.Decode("bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve") + if err != nil { + panic(err) + } + + tsk := chain.NewTipSetKey(c, c2) + + ExampleValues[reflect.TypeOf(tsk)] = tsk + + addr, err := address.NewIDAddress(1234) + if err != nil { + panic(err) + } + + ExampleValues[reflect.TypeOf(addr)] = addr + + pid, err := peer.Decode("12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf") + if err != nil { + panic(err) + } + addExample(pid) + addExample(&pid) + addExample(network2.Version14) + textSelExample := textselector.Expression("Links/21/Hash/Links/42/Hash") + clientEvent := retrievalmarket.ClientEventDealAccepted + addExample(bitfield.NewFromSet([]uint64{5})) + addExample(abi.RegisteredSealProof_StackedDrg32GiBV1_1) + addExample(abi.RegisteredPoStProof_StackedDrgWindow32GiBV1) + addExample(abi.ChainEpoch(10101)) + addExample(crypto.SigTypeBLS) + addExample(wallet.KTBLS) + addExample(wallet.MTChainMsg) + addExample(int64(9)) + addExample(12.3) + addExample(123) + addExample(uintptr(0)) + addExample(abi.MethodNum(1)) + addExample(exitcode.ExitCode(0)) + addExample(crypto.DomainSeparationTag_ElectionProofProduction) + addExample(true) + addExample(abi.UnpaddedPieceSize(1024)) + addExample(abi.UnpaddedPieceSize(1024).Padded()) + addExample(abi.DealID(5432)) + addExample(abi.SectorNumber(9)) + addExample(abi.SectorSize(32 * 1024 * 1024 * 1024)) + addExample(messagepool.MpoolChange(0)) + addExample(network.Connected) + addExample(chain2.NetworkName("mainnet")) + addExample(chain2.SyncStateStage(1)) + addExample(api.FullAPIVersion1) + addExample(paych.PCHInbound) + addExample(time.Minute) + addExample(graphsync.RequestID(4)) + addExample(datatransfer.TransferID(3)) + addExample(datatransfer.Ongoing) + addExample(clientEvent) + addExample(&clientEvent) + addExample(retrievalmarket.ClientEventDealAccepted) + addExample(retrievalmarket.DealStatusNew) + addExample(&textSelExample) + addExample(network.ReachabilityPublic) + addExample(map[string]int{"name": 42}) + addExample(map[string]time.Time{"name": time.Unix(1615243938, 0).UTC()}) + addExample(&stmgr.ExecutionTrace{ + Msg: ExampleValue("init", reflect.TypeOf(&chain.Message{}), nil).(*chain.Message), + MsgRct: ExampleValue("init", reflect.TypeOf(&chain.MessageReceipt{}), nil).(*chain.MessageReceipt), + }) + addExample(map[string]chain.Actor{ + "t01236": ExampleValue("init", reflect.TypeOf(chain.Actor{}), nil).(chain.Actor), + }) + addExample(map[string]chain.Actor{ + "t01236": ExampleValue("init", reflect.TypeOf(chain.Actor{}), nil).(chain.Actor), + }) + // todo: get an error on MarshalJSON ? + // addExample(map[address.Address]*chain.Actor{ + // "t01236": ExampleValue("init", reflect.TypeOf(*chain.Actor{}), nil).(*chain.Actor), + // }) + addExample(map[string]chain2.MarketDeal{ + "t026363": ExampleValue("init", reflect.TypeOf(chain2.MarketDeal{}), nil).(chain2.MarketDeal), + }) + addExample(map[string]chain2.MarketBalance{ + "t026363": ExampleValue("init", reflect.TypeOf(chain2.MarketBalance{}), nil).(chain2.MarketBalance), + }) + addExample(map[string]*pubsub.TopicScoreSnapshot{ + "/blocks": { + TimeInMesh: time.Minute, + FirstMessageDeliveries: 122, + MeshMessageDeliveries: 1234, + InvalidMessageDeliveries: 3, + }, + }) + addExample(map[string]metrics.Stats{ + "12D3KooWSXmXLJmBR1M7i9RW9GQPNUhZSzXKzxDHWtAgNuJAbyEJ": { + RateIn: 100, + RateOut: 50, + TotalIn: 174000, + TotalOut: 12500, + }, + }) + addExample(map[protocol.ID]metrics.Stats{ + "/fil/hello/1.0.0": { + RateIn: 100, + RateOut: 50, + TotalIn: 174000, + TotalOut: 12500, + }, + }) + maddr, err := multiaddr.NewMultiaddr("/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior") + if err != nil { + panic(err) + } + // because reflect.TypeOf(maddr) returns the concrete type... + ExampleValues[reflect.TypeOf(struct{ A multiaddr.Multiaddr }{}).Field(0).Type] = maddr + si := uint64(12) + addExample(&si) + addExample(retrievalmarket.DealID(5)) + addExample(abi.ActorID(1000)) + addExample(map[abi.SectorNumber]string{ + 123: "can't acquire read lock", + }) + addExample([]abi.SectorNumber{123, 124}) + // addExample(apitypes.OpenRPCDocument{ + // "openrpc": "1.2.6", + // "info": map[string]interface{}{ + // "title": "Lotus RPC API", + // "version": "1.2.1/generated=2020-11-22T08:22:42-06:00", + // }, + // "methods": []interface{}{}}, + // ) + addExample(messagepool.CheckStatusCode(0)) + addExample(map[string]interface{}{"abc": 123}) +} + +func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []reflect.Type) { + + switch pkg { + case "v1": // latest + switch name { + case "FullNode": + i = &v1.FullNodeStruct{} + t = reflect.TypeOf(new(struct{ v1.FullNode })).Elem() + permStruct = append(permStruct, reflect.TypeOf(v1.IBlockStoreStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v1.IBeaconStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v1.IChainStruct{}.IAccountStruct.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v1.IChainStruct{}.IActorStruct.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v1.IChainStruct{}.IBeaconStruct.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v1.IChainStruct{}.IMinerStateStruct.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v1.IChainStruct{}.IChainInfoStruct.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v1.IMarketStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v1.IMiningStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v1.IMessagePoolStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v1.IMultiSigStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v1.INetworkStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v1.IPaychanStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v1.ISyncerStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v1.IWalletStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v1.IJwtAuthAPIStruct{}.Internal)) + default: + panic("unknown type") + } + case "v0": + switch name { + case "FullNode": + i = &v0.FullNodeStruct{} + t = reflect.TypeOf(new(struct{ v0.FullNode })).Elem() + permStruct = append(permStruct, reflect.TypeOf(v0.IBlockStoreStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v0.IBeaconStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v0.IChainStruct{}.IAccountStruct.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v0.IChainStruct{}.IActorStruct.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v0.IChainStruct{}.IBeaconStruct.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v0.IChainStruct{}.IMinerStateStruct.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v0.IChainStruct{}.IChainInfoStruct.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v0.IMarketStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v0.IMiningStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v0.IMessagePoolStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v0.IMultiSigStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v0.INetworkStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v0.IPaychanStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v0.ISyncerStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v0.IWalletStruct{}.Internal)) + permStruct = append(permStruct, reflect.TypeOf(v0.IJwtAuthAPIStruct{}.Internal)) + default: + panic("unknown type") + } + } + return +} + +func ExampleValue(method string, t, parent reflect.Type) interface{} { + v, ok := ExampleValues[t] + if ok { + return v + } + + switch t.Kind() { + case reflect.Slice: + out := reflect.New(t).Elem() + reflect.Append(out, reflect.ValueOf(ExampleValue(method, t.Elem(), t))) + return out.Interface() + case reflect.Chan: + return ExampleValue(method, t.Elem(), nil) + case reflect.Struct: + es := exampleStruct(method, t, parent) + v := reflect.ValueOf(es).Elem().Interface() + ExampleValues[t] = v + return v + case reflect.Array: + out := reflect.New(t).Elem() + for i := 0; i < t.Len(); i++ { + out.Index(i).Set(reflect.ValueOf(ExampleValue(method, t.Elem(), t))) + } + return out.Interface() + + case reflect.Ptr: + if t.Elem().Kind() == reflect.Struct { + es := exampleStruct(method, t.Elem(), t) + // ExampleValues[t] = es + return es + } + case reflect.Interface: + if t.Implements(reflect.TypeOf((*error)(nil)).Elem()) { + return fmt.Errorf("empty error") + } + return struct{}{} + } + + fmt.Fprintf(os.Stderr, "Warnning: No example value for type: %s (method '%s')\n", t, method) + return nil +} + +func exampleStruct(method string, t, parent reflect.Type) interface{} { + ns := reflect.New(t) + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Type == parent { + continue + } + if strings.Title(f.Name) == f.Name { + ns.Elem().Field(i).Set(reflect.ValueOf(ExampleValue(method, f.Type, t))) + } + } + + return ns.Interface() +} + +type Visitor struct { + Root string + Methods map[string]ast.Node +} + +func (v *Visitor) Visit(node ast.Node) ast.Visitor { + st, ok := node.(*ast.TypeSpec) + if !ok { + return v + } + + if st.Name.Name != v.Root { + return nil + } + + iface := st.Type.(*ast.InterfaceType) + for _, m := range iface.Methods.List { + if len(m.Names) > 0 { + v.Methods[m.Names[0].Name] = m + } + } + + return v +} + +const NoComment = "There are not yet any comments for this method." + +func ParseApiASTInfo(apiFile, iface, pkg, dir string) (comments map[string]string, groupDocs map[string]string) { //nolint:golint + fset := token.NewFileSet() + apiDir, err := filepath.Abs(dir) + if err != nil { + fmt.Println("./api filepath absolute error: ", err) + return + } + apiFile, err = filepath.Abs(apiFile) + if err != nil { + fmt.Println("filepath absolute error: ", err, "file:", apiFile) + return + } + pkgs, err := parser.ParseDir(fset, apiDir, nil, parser.AllErrors|parser.ParseComments) + if err != nil { + fmt.Println("parse error: ", err) + return + } + + ap := pkgs[pkg] + + f := ap.Files[apiFile] + + cmap := ast.NewCommentMap(fset, f, f.Comments) + + v := &Visitor{iface, make(map[string]ast.Node)} + ast.Walk(v, ap) + + comments = make(map[string]string) + groupDocs = make(map[string]string) + for mn, node := range v.Methods { + filteredComments := cmap.Filter(node).Comments() + if len(filteredComments) == 0 { + comments[mn] = NoComment + } else { + for _, c := range filteredComments { + if strings.HasPrefix(c.Text(), "MethodGroup:") { + parts := strings.Split(c.Text(), "\n") + groupName := strings.TrimSpace(parts[0][12:]) + comment := strings.Join(parts[1:], "\n") + groupDocs[groupName] = comment + + break + } + } + + l := len(filteredComments) - 1 + if len(filteredComments) > 1 { + l = len(filteredComments) - 2 + } + last := filteredComments[l].Text() + if !strings.HasPrefix(last, "MethodGroup:") { + comments[mn] = last + } else { + comments[mn] = NoComment + } + } + } + return comments, groupDocs +} + +type MethodGroup struct { + GroupName string + Header string + Methods []*Method +} + +type Method struct { + Comment string + Name string + InputExample string + ResponseExample string +} + +func MethodGroupFromName(mn string) string { + i := strings.IndexFunc(mn[1:], func(r rune) bool { + return unicode.IsUpper(r) + }) + if i < 0 { + return "" + } + return mn[:i+1] +} diff --git a/venus-devtool/apigen/proxygen.go b/venus-devtool/api-gen/proxygen.go similarity index 100% rename from venus-devtool/apigen/proxygen.go rename to venus-devtool/api-gen/proxygen.go diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index 0a22ab52d0..7a8969af8c 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -3,11 +3,22 @@ module github.com/filecoin-project/venus/venus-devtool go 1.16 require ( + github.com/filecoin-project/go-address v0.0.6 + github.com/filecoin-project/go-bitfield v0.2.4 + github.com/filecoin-project/go-data-transfer v1.11.4 + github.com/filecoin-project/go-fil-markets v1.13.4 github.com/filecoin-project/go-jsonrpc v0.1.5 + github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/lotus v1.13.2-0.20211213233817-8a4246227153 github.com/filecoin-project/venus v0.0.0-00010101000000-000000000000 github.com/filecoin-project/venus/venus-shared v0.0.0-00010101000000-000000000000 + github.com/ipfs/go-cid v0.1.0 + github.com/ipfs/go-graphsync v0.10.6 github.com/ipfs/go-ipfs-http-client v0.1.0 // indirect + github.com/ipld/go-ipld-selector-text-lite v0.0.1 + github.com/libp2p/go-libp2p-core v0.9.0 + github.com/libp2p/go-libp2p-pubsub v0.5.6 + github.com/multiformats/go-multiaddr v0.4.1 github.com/urfave/cli/v2 v2.3.0 github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 diff --git a/venus-shared/api/api-document.md b/venus-shared/api/api-document.md new file mode 100644 index 0000000000..b38f48bf11 --- /dev/null +++ b/venus-shared/api/api-document.md @@ -0,0 +1,4573 @@ +# Groups +* [](#) + * [Concurrent](#Concurrent) + * [Verify](#Verify) + * [Version](#Version) +* [Auth](#Auth) + * [AuthNew](#AuthNew) +* [Beacon](#Beacon) + * [BeaconGetEntry](#BeaconGetEntry) +* [Block](#Block) + * [BlockTime](#BlockTime) +* [Chain](#Chain) + * [ChainDeleteObj](#ChainDeleteObj) + * [ChainExport](#ChainExport) + * [ChainGetBlock](#ChainGetBlock) + * [ChainGetBlockMessages](#ChainGetBlockMessages) + * [ChainGetMessage](#ChainGetMessage) + * [ChainGetMessagesInTipset](#ChainGetMessagesInTipset) + * [ChainGetParentMessages](#ChainGetParentMessages) + * [ChainGetParentReceipts](#ChainGetParentReceipts) + * [ChainGetPath](#ChainGetPath) + * [ChainGetRandomnessFromBeacon](#ChainGetRandomnessFromBeacon) + * [ChainGetRandomnessFromTickets](#ChainGetRandomnessFromTickets) + * [ChainGetReceipts](#ChainGetReceipts) + * [ChainGetTipSet](#ChainGetTipSet) + * [ChainGetTipSetAfterHeight](#ChainGetTipSetAfterHeight) + * [ChainGetTipSetByHeight](#ChainGetTipSetByHeight) + * [ChainHasObj](#ChainHasObj) + * [ChainHead](#ChainHead) + * [ChainList](#ChainList) + * [ChainNotify](#ChainNotify) + * [ChainReadObj](#ChainReadObj) + * [ChainSetHead](#ChainSetHead) + * [ChainStatObj](#ChainStatObj) + * [ChainSyncHandleNewTipSet](#ChainSyncHandleNewTipSet) + * [ChainTipSetWeight](#ChainTipSetWeight) +* [Gas](#Gas) + * [GasBatchEstimateMessageGas](#GasBatchEstimateMessageGas) + * [GasEstimateFeeCap](#GasEstimateFeeCap) + * [GasEstimateGasLimit](#GasEstimateGasLimit) + * [GasEstimateGasPremium](#GasEstimateGasPremium) + * [GasEstimateMessageGas](#GasEstimateMessageGas) +* [Get](#Get) + * [GetActor](#GetActor) + * [GetEntry](#GetEntry) + * [GetFullBlock](#GetFullBlock) + * [GetParentStateRootActor](#GetParentStateRootActor) +* [Has](#Has) + * [HasPassword](#HasPassword) +* [List](#List) +* [Lock](#Lock) + * [LockWallet](#LockWallet) +* [Message](#Message) + * [MessageWait](#MessageWait) +* [Miner](#Miner) + * [MinerCreateBlock](#MinerCreateBlock) + * [MinerGetBaseInfo](#MinerGetBaseInfo) +* [Mpool](#Mpool) + * [MpoolBatchPush](#MpoolBatchPush) + * [MpoolBatchPushMessage](#MpoolBatchPushMessage) + * [MpoolBatchPushUntrusted](#MpoolBatchPushUntrusted) + * [MpoolCheckMessages](#MpoolCheckMessages) + * [MpoolCheckPendingMessages](#MpoolCheckPendingMessages) + * [MpoolCheckReplaceMessages](#MpoolCheckReplaceMessages) + * [MpoolClear](#MpoolClear) + * [MpoolDeleteByAdress](#MpoolDeleteByAdress) + * [MpoolGetConfig](#MpoolGetConfig) + * [MpoolGetNonce](#MpoolGetNonce) + * [MpoolPending](#MpoolPending) + * [MpoolPublishByAddr](#MpoolPublishByAddr) + * [MpoolPublishMessage](#MpoolPublishMessage) + * [MpoolPush](#MpoolPush) + * [MpoolPushMessage](#MpoolPushMessage) + * [MpoolPushUntrusted](#MpoolPushUntrusted) + * [MpoolSelect](#MpoolSelect) + * [MpoolSelects](#MpoolSelects) + * [MpoolSetConfig](#MpoolSetConfig) + * [MpoolSub](#MpoolSub) +* [Msig](#Msig) + * [MsigAddApprove](#MsigAddApprove) + * [MsigAddCancel](#MsigAddCancel) + * [MsigAddPropose](#MsigAddPropose) + * [MsigApprove](#MsigApprove) + * [MsigApproveTxnHash](#MsigApproveTxnHash) + * [MsigCancel](#MsigCancel) + * [MsigCreate](#MsigCreate) + * [MsigGetVested](#MsigGetVested) + * [MsigPropose](#MsigPropose) + * [MsigRemoveSigner](#MsigRemoveSigner) + * [MsigSwapApprove](#MsigSwapApprove) + * [MsigSwapCancel](#MsigSwapCancel) + * [MsigSwapPropose](#MsigSwapPropose) +* [Net](#Net) + * [NetAddrsListen](#NetAddrsListen) +* [Network](#Network) + * [NetworkConnect](#NetworkConnect) + * [NetworkFindPeer](#NetworkFindPeer) + * [NetworkFindProvidersAsync](#NetworkFindProvidersAsync) + * [NetworkGetBandwidthStats](#NetworkGetBandwidthStats) + * [NetworkGetClosestPeers](#NetworkGetClosestPeers) + * [NetworkGetPeerAddresses](#NetworkGetPeerAddresses) + * [NetworkGetPeerID](#NetworkGetPeerID) + * [NetworkPeers](#NetworkPeers) +* [Paych](#Paych) + * [PaychAllocateLane](#PaychAllocateLane) + * [PaychAvailableFunds](#PaychAvailableFunds) + * [PaychAvailableFundsByFromTo](#PaychAvailableFundsByFromTo) + * [PaychCollect](#PaychCollect) + * [PaychGet](#PaychGet) + * [PaychGetWaitReady](#PaychGetWaitReady) + * [PaychList](#PaychList) + * [PaychNewPayment](#PaychNewPayment) + * [PaychSettle](#PaychSettle) + * [PaychStatus](#PaychStatus) + * [PaychVoucherAdd](#PaychVoucherAdd) + * [PaychVoucherCheckSpendable](#PaychVoucherCheckSpendable) + * [PaychVoucherCheckValid](#PaychVoucherCheckValid) + * [PaychVoucherCreate](#PaychVoucherCreate) + * [PaychVoucherList](#PaychVoucherList) + * [PaychVoucherSubmit](#PaychVoucherSubmit) +* [Protocol](#Protocol) + * [ProtocolParameters](#ProtocolParameters) +* [Resolve](#Resolve) + * [ResolveToKeyAddr](#ResolveToKeyAddr) +* [Set](#Set) + * [SetConcurrent](#SetConcurrent) + * [SetPassword](#SetPassword) +* [State](#State) + * [StateAccountKey](#StateAccountKey) + * [StateCall](#StateCall) + * [StateCirculatingSupply](#StateCirculatingSupply) + * [StateDealProviderCollateralBounds](#StateDealProviderCollateralBounds) + * [StateGetActor](#StateGetActor) + * [StateGetRandomnessFromBeacon](#StateGetRandomnessFromBeacon) + * [StateGetRandomnessFromTickets](#StateGetRandomnessFromTickets) + * [StateListActors](#StateListActors) + * [StateListMiners](#StateListMiners) + * [StateLookupID](#StateLookupID) + * [StateMarketBalance](#StateMarketBalance) + * [StateMarketDeals](#StateMarketDeals) + * [StateMarketParticipants](#StateMarketParticipants) + * [StateMarketStorageDeal](#StateMarketStorageDeal) + * [StateMinerActiveSectors](#StateMinerActiveSectors) + * [StateMinerAvailableBalance](#StateMinerAvailableBalance) + * [StateMinerDeadlines](#StateMinerDeadlines) + * [StateMinerFaults](#StateMinerFaults) + * [StateMinerInfo](#StateMinerInfo) + * [StateMinerInitialPledgeCollateral](#StateMinerInitialPledgeCollateral) + * [StateMinerPartitions](#StateMinerPartitions) + * [StateMinerPower](#StateMinerPower) + * [StateMinerPreCommitDepositForPower](#StateMinerPreCommitDepositForPower) + * [StateMinerProvingDeadline](#StateMinerProvingDeadline) + * [StateMinerRecoveries](#StateMinerRecoveries) + * [StateMinerSectorAllocated](#StateMinerSectorAllocated) + * [StateMinerSectorCount](#StateMinerSectorCount) + * [StateMinerSectorSize](#StateMinerSectorSize) + * [StateMinerSectors](#StateMinerSectors) + * [StateMinerWorkerAddress](#StateMinerWorkerAddress) + * [StateNetworkName](#StateNetworkName) + * [StateNetworkVersion](#StateNetworkVersion) + * [StateSearchMsg](#StateSearchMsg) + * [StateSectorExpiration](#StateSectorExpiration) + * [StateSectorGetInfo](#StateSectorGetInfo) + * [StateSectorPartition](#StateSectorPartition) + * [StateSectorPreCommitInfo](#StateSectorPreCommitInfo) + * [StateVMCirculatingSupplyInternal](#StateVMCirculatingSupplyInternal) + * [StateVerifiedClientStatus](#StateVerifiedClientStatus) + * [StateVerifiedRegistryRootKey](#StateVerifiedRegistryRootKey) + * [StateVerifierStatus](#StateVerifierStatus) + * [StateWaitMsg](#StateWaitMsg) +* [Sync](#Sync) + * [SyncState](#SyncState) + * [SyncSubmitBlock](#SyncSubmitBlock) +* [Syncer](#Syncer) + * [SyncerTracker](#SyncerTracker) +* [Un](#Un) + * [UnLockWallet](#UnLockWallet) +* [Verify](#Verify) + * [VerifyEntry](#VerifyEntry) +* [Wallet](#Wallet) + * [WalletAddresses](#WalletAddresses) + * [WalletBalance](#WalletBalance) + * [WalletDefaultAddress](#WalletDefaultAddress) + * [WalletExport](#WalletExport) + * [WalletHas](#WalletHas) + * [WalletImport](#WalletImport) + * [WalletNewAddress](#WalletNewAddress) + * [WalletSetDefault](#WalletSetDefault) + * [WalletSign](#WalletSign) + * [WalletSignMessage](#WalletSignMessage) + * [WalletState](#WalletState) +## + + +### Concurrent + + +Perms: read + +Inputs: `null` + +Response: `9` + +### Verify + + +Perms: read + +Inputs: +```json +[ + "string value", + "string value" +] +``` + +Response: `null` + +### Version + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "Version": "string value", + "APIVersion": 131328 +} +``` + +## Auth + + +### AuthNew + + +Perms: admin + +Inputs: +```json +[ + null +] +``` + +Response: `"Ynl0ZSBhcnJheQ=="` + +## Beacon + + +### BeaconGetEntry + + +Perms: read + +Inputs: +```json +[ + 10101 +] +``` + +Response: +```json +{ + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" +} +``` + +## Block + + +### BlockTime + + +Perms: read + +Inputs: `null` + +Response: `60000000000` + +## Chain + + +### ChainDeleteObj + + +Perms: admin + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `{}` + +### ChainExport + + +Perms: read + +Inputs: +```json +[ + 10101, + true, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"Ynl0ZSBhcnJheQ=="` + +### ChainGetBlock + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Miner": "t01234", + "Ticket": { + "VRFProof": null + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": null + }, + "BeaconEntries": null, + "WinPoStProof": null, + "Parents": null, + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" +} +``` + +### ChainGetBlockMessages + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "BlsMessages": null, + "SecpkMessages": null, + "Cids": null +} +``` + +### ChainGetMessage + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" +} +``` + +### ChainGetMessagesInTipset + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### ChainGetParentMessages + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `null` + +### ChainGetParentReceipts + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `null` + +### ChainGetPath + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### ChainGetRandomnessFromBeacon + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + 2, + 10101, + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: `null` + +### ChainGetRandomnessFromTickets + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + 2, + 10101, + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: `null` + +### ChainGetReceipts + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `null` + +### ChainGetTipSet + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Cids": null, + "Blocks": null, + "Height": 0 +} +``` + +### ChainGetTipSetAfterHeight + + +Perms: read + +Inputs: +```json +[ + 10101, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Cids": null, + "Blocks": null, + "Height": 0 +} +``` + +### ChainGetTipSetByHeight + + +Perms: read + +Inputs: +```json +[ + 10101, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Cids": null, + "Blocks": null, + "Height": 0 +} +``` + +### ChainHasObj + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `true` + +### ChainHead + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "Cids": null, + "Blocks": null, + "Height": 0 +} +``` + +### ChainList + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + 123 +] +``` + +Response: `null` + +### ChainNotify + + +Perms: read + +Inputs: `null` + +Response: `null` + +### ChainReadObj + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `"Ynl0ZSBhcnJheQ=="` + +### ChainSetHead + + +Perms: admin + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `{}` + +### ChainStatObj + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Size": 42, + "Links": 42 +} +``` + +### ChainSyncHandleNewTipSet + + +Perms: write + +Inputs: +```json +[ + { + "Source": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Sender": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Head": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } +] +``` + +Response: `{}` + +### ChainTipSetWeight + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +## Gas + + +### GasBatchEstimateMessageGas + + +Perms: read + +Inputs: +```json +[ + null, + 42, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### GasEstimateFeeCap + + +Perms: read + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### GasEstimateGasLimit + + +Perms: read + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `9` + +### GasEstimateGasPremium + + +Perms: read + +Inputs: +```json +[ + 42, + "t01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### GasEstimateMessageGas + + +Perms: read + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + { + "MaxFee": "0", + "GasOverEstimation": 12.3 + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" +} +``` + +## Get + + +### GetActor + + +Perms: read + +Inputs: +```json +[ + "t01234" +] +``` + +Response: +```json +{ + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Head": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Nonce": 42, + "Balance": "0" +} +``` + +### GetEntry + + +Perms: read + +Inputs: +```json +[ + 10101, + 42 +] +``` + +Response: +```json +{ + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" +} +``` + +### GetFullBlock + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Header": { + "Miner": "t01234", + "Ticket": { + "VRFProof": null + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": null + }, + "BeaconEntries": null, + "WinPoStProof": null, + "Parents": null, + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" + }, + "BLSMessages": null, + "SECPMessages": null +} +``` + +### GetParentStateRootActor + + +Perms: read + +Inputs: +```json +[ + { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "t01234" +] +``` + +Response: +```json +{ + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Head": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Nonce": 42, + "Balance": "0" +} +``` + +## Has + + +### HasPassword + + +Perms: admin + +Inputs: `null` + +Response: `true` + +## List + + +## Lock + + +### LockWallet + + +Perms: admin + +Inputs: `null` + +Response: `{}` + +## Message + + +### MessageWait + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 10101, + 10101 +] +``` + +Response: +```json +{ + "TS": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Block": { + "Miner": "t01234", + "Ticket": { + "VRFProof": null + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": null + }, + "BeaconEntries": null, + "WinPoStProof": null, + "Parents": null, + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + } +} +``` + +## Miner + + +### MinerCreateBlock + + +Perms: write + +Inputs: +```json +[ + { + "Miner": "t01234", + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Ticket": { + "VRFProof": null + }, + "Eproof": { + "WinCount": 9, + "VRFProof": null + }, + "BeaconValues": null, + "Messages": null, + "Epoch": 10101, + "Timestamp": 42, + "WinningPoStProof": null + } +] +``` + +Response: +```json +{ + "Header": { + "Miner": "t01234", + "Ticket": { + "VRFProof": null + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": null + }, + "BeaconEntries": null, + "WinPoStProof": null, + "Parents": null, + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" + }, + "BlsMessages": null, + "SecpkMessages": null +} +``` + +### MinerGetBaseInfo + + +Perms: read + +Inputs: +```json +[ + "t01234", + 10101, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "MinerPower": "0", + "NetworkPower": "0", + "Sectors": null, + "WorkerKey": "t01234", + "SectorSize": 34359738368, + "PrevBeaconEntry": { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "BeaconEntries": null, + "EligibleForMining": true +} +``` + +## Mpool + + +### MpoolBatchPush + + +Perms: write + +Inputs: +```json +[ + null +] +``` + +Response: `null` + +### MpoolBatchPushMessage + + +Perms: sign + +Inputs: +```json +[ + null, + { + "MaxFee": "0", + "GasOverEstimation": 12.3 + } +] +``` + +Response: `null` + +### MpoolBatchPushUntrusted + + +Perms: write + +Inputs: +```json +[ + null +] +``` + +Response: `null` + +### MpoolCheckMessages + + +Perms: read + +Inputs: +```json +[ + null +] +``` + +Response: `null` + +### MpoolCheckPendingMessages + + +Perms: read + +Inputs: +```json +[ + "t01234" +] +``` + +Response: `null` + +### MpoolCheckReplaceMessages + + +Perms: read + +Inputs: +```json +[ + null +] +``` + +Response: `null` + +### MpoolClear + + +Perms: write + +Inputs: +```json +[ + true +] +``` + +Response: `{}` + +### MpoolDeleteByAdress + + +Perms: admin + +Inputs: +```json +[ + "t01234" +] +``` + +Response: `{}` + +### MpoolGetConfig + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "PriorityAddrs": null, + "SizeLimitHigh": 123, + "SizeLimitLow": 123, + "ReplaceByFeeRatio": 12.3, + "PruneCooldown": 60000000000, + "GasLimitOverestimation": 12.3 +} +``` + +### MpoolGetNonce + + +Perms: read + +Inputs: +```json +[ + "t01234" +] +``` + +Response: `42` + +### MpoolPending + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### MpoolPublishByAddr + + +Perms: write + +Inputs: +```json +[ + "t01234" +] +``` + +Response: `{}` + +### MpoolPublishMessage + + +Perms: write + +Inputs: +```json +[ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` + +Response: `{}` + +### MpoolPush + + +Perms: write + +Inputs: +```json +[ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MpoolPushMessage + + +Perms: sign + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + { + "MaxFee": "0", + "GasOverEstimation": 12.3 + } +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } +} +``` + +### MpoolPushUntrusted + + +Perms: write + +Inputs: +```json +[ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MpoolSelect + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + 12.3 +] +``` + +Response: `null` + +### MpoolSelects + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + null +] +``` + +Response: `null` + +### MpoolSetConfig + + +Perms: admin + +Inputs: +```json +[ + { + "PriorityAddrs": null, + "SizeLimitHigh": 123, + "SizeLimitLow": 123, + "ReplaceByFeeRatio": 12.3, + "PruneCooldown": 60000000000, + "GasLimitOverestimation": 12.3 + } +] +``` + +Response: `{}` + +### MpoolSub + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "Type": 0, + "Message": { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +} +``` + +## Msig + + +### MsigAddApprove + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + 42, + "t01234", + "t01234", + true +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` + +### MsigAddCancel + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + 42, + "t01234", + true +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` + +### MsigAddPropose + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + "t01234", + true +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` + +### MsigApprove + + +Perms: sign + +Inputs: +```json +[ + "t01234", + 42, + "t01234" +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` + +### MsigApproveTxnHash + + +Perms: sign + +Inputs: +```json +[ + "t01234", + 42, + "t01234", + "t01234", + "0", + "t01234", + 42, + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` + +### MsigCancel + + +Perms: sign + +Inputs: +```json +[ + "t01234", + 42, + "t01234", + "0", + "t01234", + 42, + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` + +### MsigCreate + + +Perms: sign + +Inputs: +```json +[ + 42, + null, + 10101, + "0", + "t01234", + "0" +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` + +### MsigGetVested + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### MsigPropose + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + "0", + "t01234", + 42, + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` + +### MsigRemoveSigner + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + "t01234", + true +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` + +### MsigSwapApprove + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + 42, + "t01234", + "t01234", + "t01234" +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` + +### MsigSwapCancel + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + 42, + "t01234", + "t01234" +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` + +### MsigSwapPropose + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + "t01234", + "t01234" +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` + +## Net + + +### NetAddrsListen + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [] +} +``` + +## Network + + +### NetworkConnect + + +Perms: read + +Inputs: +```json +[ + null +] +``` + +Response: +```json +{ + "PeerID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Err": {} +} +``` + +### NetworkFindPeer + + +Perms: read + +Inputs: +```json +[ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" +] +``` + +Response: +```json +{ + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [] +} +``` + +### NetworkFindProvidersAsync + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 123 +] +``` + +Response: +```json +{ + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [] +} +``` + +### NetworkGetBandwidthStats + + +Perms: admin + +Inputs: `null` + +Response: +```json +{ + "TotalIn": 9, + "TotalOut": 9, + "RateIn": 12.3, + "RateOut": 12.3 +} +``` + +### NetworkGetClosestPeers + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: `"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"` + +### NetworkGetPeerAddresses + + +Perms: admin + +Inputs: `null` + +Response: `null` + +### NetworkGetPeerID + + +Perms: admin + +Inputs: `null` + +Response: `"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"` + +### NetworkPeers + + +Perms: read + +Inputs: +```json +[ + true, + true, + true +] +``` + +Response: +```json +{ + "Peers": null +} +``` + +## Paych + + +### PaychAllocateLane + + +Perms: sign + +Inputs: +```json +[ + "t01234" +] +``` + +Response: `42` + +### PaychAvailableFunds + + +Perms: sign + +Inputs: +```json +[ + "t01234" +] +``` + +Response: +```json +{ + "Channel": "\u003cempty\u003e", + "From": "t01234", + "To": "t01234", + "ConfirmedAmt": "0", + "PendingAmt": "0", + "PendingWaitSentinel": null, + "QueuedAmt": "0", + "VoucherReedeemedAmt": "0" +} +``` + +### PaychAvailableFundsByFromTo + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234" +] +``` + +Response: +```json +{ + "Channel": "\u003cempty\u003e", + "From": "t01234", + "To": "t01234", + "ConfirmedAmt": "0", + "PendingAmt": "0", + "PendingWaitSentinel": null, + "QueuedAmt": "0", + "VoucherReedeemedAmt": "0" +} +``` + +### PaychCollect + + +Perms: sign + +Inputs: +```json +[ + "t01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### PaychGet + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + "0" +] +``` + +Response: +```json +{ + "Channel": "t01234", + "WaitSentinel": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +} +``` + +### PaychGetWaitReady + + +Perms: sign + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `"t01234"` + +### PaychList + + +Perms: read + +Inputs: `null` + +Response: `null` + +### PaychNewPayment + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + null +] +``` + +Response: +```json +{ + "Channel": "t01234", + "WaitSentinel": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Vouchers": null +} +``` + +### PaychSettle + + +Perms: sign + +Inputs: +```json +[ + "t01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### PaychStatus + + +Perms: read + +Inputs: +```json +[ + "t01234" +] +``` + +Response: +```json +{ + "ControlAddr": "t01234", + "Direction": 1 +} +``` + +### PaychVoucherAdd + + +Perms: write + +Inputs: +```json +[ + "t01234", + { + "ChannelAddr": "t01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "t01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": null, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + }, + "Ynl0ZSBhcnJheQ==", + "0" +] +``` + +Response: `"0"` + +### PaychVoucherCheckSpendable + + +Perms: read + +Inputs: +```json +[ + "t01234", + { + "ChannelAddr": "t01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "t01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": null, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + }, + "Ynl0ZSBhcnJheQ==", + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: `true` + +### PaychVoucherCheckValid + + +Perms: read + +Inputs: +```json +[ + "t01234", + { + "ChannelAddr": "t01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "t01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": null, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } +] +``` + +Response: `{}` + +### PaychVoucherCreate + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "0", + 42 +] +``` + +Response: +```json +{ + "Voucher": { + "ChannelAddr": "t01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "t01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": null, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + }, + "Shortfall": "0" +} +``` + +### PaychVoucherList + + +Perms: write + +Inputs: +```json +[ + "t01234" +] +``` + +Response: `null` + +### PaychVoucherSubmit + + +Perms: sign + +Inputs: +```json +[ + "t01234", + { + "ChannelAddr": "t01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "t01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": null, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + }, + "Ynl0ZSBhcnJheQ==", + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +## Protocol + + +### ProtocolParameters + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "Network": "string value", + "BlockTime": 60000000000, + "SupportedSectors": null +} +``` + +## Resolve + + +### ResolveToKeyAddr + + +Perms: read + +Inputs: +```json +[ + "t01234", + { + "Cids": null, + "Blocks": null, + "Height": 0 + } +] +``` + +Response: `"t01234"` + +## Set + + +### SetConcurrent + + +Perms: admin + +Inputs: +```json +[ + 9 +] +``` + +Response: `{}` + +### SetPassword + + +Perms: admin + +Inputs: +```json +[ + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: `{}` + +## State + + +### StateAccountKey + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"t01234"` + +### StateCall + + +Perms: read + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "MsgCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "GasCost": { + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "GasUsed": "0", + "BaseFeeBurn": "0", + "OverEstimationBurn": "0", + "MinerPenalty": "0", + "MinerTip": "0", + "Refund": "0", + "TotalCost": "0" + }, + "ExecutionTrace": { + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": null, + "Subcalls": null + }, + "Error": "string value", + "Duration": 60000000000 +} +``` + +### StateCirculatingSupply + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateDealProviderCollateralBounds + + +Perms: read + +Inputs: +```json +[ + 1032, + true, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Min": "0", + "Max": "0" +} +``` + +### StateGetActor + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Head": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Nonce": 42, + "Balance": "0" +} +``` + +### StateGetRandomnessFromBeacon + + +Perms: read + +Inputs: +```json +[ + 2, + 10101, + "Ynl0ZSBhcnJheQ==", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### StateGetRandomnessFromTickets + + +Perms: read + +Inputs: +```json +[ + 2, + 10101, + "Ynl0ZSBhcnJheQ==", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### StateListActors + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### StateListMiners + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### StateLookupID + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"t01234"` + +### StateMarketBalance + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Escrow": "0", + "Locked": "0" +} +``` + +### StateMarketDeals + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "t026363": { + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "t01234", + "Provider": "t01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "State": { + "SectorStartEpoch": 10101, + "LastUpdatedEpoch": 10101, + "SlashEpoch": 10101 + } + } +} +``` + +### StateMarketParticipants + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "t026363": { + "Escrow": "0", + "Locked": "0" + } +} +``` + +### StateMarketStorageDeal + + +Perms: read + +Inputs: +```json +[ + 5432, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "t01234", + "Provider": "t01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "State": { + "SectorStartEpoch": 10101, + "LastUpdatedEpoch": 10101, + "SlashEpoch": 10101 + } +} +``` + +### StateMinerActiveSectors + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### StateMinerAvailableBalance + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateMinerDeadlines + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### StateMinerFaults + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + 5, + 1 +] +``` + +### StateMinerInfo + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Owner": "t01234", + "Worker": "t01234", + "NewWorker": "t01234", + "ControlAddresses": null, + "WorkerChangeEpoch": 10101, + "PeerId": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Multiaddrs": null, + "WindowPoStProofType": 8, + "SectorSize": 34359738368, + "WindowPoStPartitionSectors": 42, + "ConsensusFaultElapsed": 10101 +} +``` + +### StateMinerInitialPledgeCollateral + + +Perms: read + +Inputs: +```json +[ + "t01234", + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SealRandEpoch": 10101, + "DealIDs": null, + "Expiration": 10101, + "ReplaceCapacity": true, + "ReplaceSectorDeadline": 42, + "ReplaceSectorPartition": 42, + "ReplaceSectorNumber": 9 + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateMinerPartitions + + +Perms: read + +Inputs: +```json +[ + "t01234", + 42, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### StateMinerPower + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "MinerPower": { + "RawBytePower": "0", + "QualityAdjPower": "0" + }, + "TotalPower": { + "RawBytePower": "0", + "QualityAdjPower": "0" + }, + "HasMinPower": true +} +``` + +### StateMinerPreCommitDepositForPower + + +Perms: read + +Inputs: +```json +[ + "t01234", + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SealRandEpoch": 10101, + "DealIDs": null, + "Expiration": 10101, + "ReplaceCapacity": true, + "ReplaceSectorDeadline": 42, + "ReplaceSectorPartition": 42, + "ReplaceSectorNumber": 9 + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateMinerProvingDeadline + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "CurrentEpoch": 10101, + "PeriodStart": 10101, + "Index": 42, + "Open": 10101, + "Close": 10101, + "Challenge": 10101, + "FaultCutoff": 10101, + "WPoStPeriodDeadlines": 42, + "WPoStProvingPeriod": 10101, + "WPoStChallengeWindow": 10101, + "WPoStChallengeLookback": 10101, + "FaultDeclarationCutoff": 10101 +} +``` + +### StateMinerRecoveries + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + 5, + 1 +] +``` + +### StateMinerSectorAllocated + + +Perms: read + +Inputs: +```json +[ + "t01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `true` + +### StateMinerSectorCount + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Live": 42, + "Active": 42, + "Faulty": 42 +} +``` + +### StateMinerSectorSize + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `34359738368` + +### StateMinerSectors + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + 0 + ], + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### StateMinerWorkerAddress + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"t01234"` + +### StateNetworkName + + +Perms: read + +Inputs: `null` + +Response: `"mainnet"` + +### StateNetworkVersion + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `14` + +### StateSearchMsg + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 10101, + true +] +``` + +Response: +```json +{ + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "ReturnDec": {}, + "TipSet": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 +} +``` + +### StateSectorExpiration + + +Perms: read + +Inputs: +```json +[ + "t01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "OnTime": 10101, + "Early": 10101 +} +``` + +### StateSectorGetInfo + + +Perms: read + +Inputs: +```json +[ + "t01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": null, + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null +} +``` + +### StateSectorPartition + + +Perms: read + +Inputs: +```json +[ + "t01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Deadline": 42, + "Partition": 42 +} +``` + +### StateSectorPreCommitInfo + + +Perms: read + +Inputs: +```json +[ + "t01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Info": { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SealRandEpoch": 10101, + "DealIDs": null, + "Expiration": 10101, + "ReplaceCapacity": true, + "ReplaceSectorDeadline": 42, + "ReplaceSectorPartition": 42, + "ReplaceSectorNumber": 9 + }, + "PreCommitDeposit": "0", + "PreCommitEpoch": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0" +} +``` + +### StateVMCirculatingSupplyInternal + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "FilVested": "0", + "FilMined": "0", + "FilBurnt": "0", + "FilLocked": "0", + "FilCirculating": "0", + "FilReserveDisbursed": "0" +} +``` + +### StateVerifiedClientStatus + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateVerifiedRegistryRootKey + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"t01234"` + +### StateVerifierStatus + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateWaitMsg + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 42, + 10101, + true +] +``` + +Response: +```json +{ + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "ReturnDec": {}, + "TipSet": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 +} +``` + +## Sync + + +### SyncState + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "ActiveSyncs": null, + "VMApplied": 42 +} +``` + +### SyncSubmitBlock + + +Perms: write + +Inputs: +```json +[ + { + "Header": { + "Miner": "t01234", + "Ticket": { + "VRFProof": null + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": null + }, + "BeaconEntries": null, + "WinPoStProof": null, + "Parents": null, + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" + }, + "BlsMessages": null, + "SecpkMessages": null + } +] +``` + +Response: `{}` + +## Syncer + + +### SyncerTracker + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "History": null, + "Buckets": null +} +``` + +## Un + + +### UnLockWallet + + +Perms: admin + +Inputs: +```json +[ + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: `{}` + +## Verify + + +### VerifyEntry + + +Perms: read + +Inputs: +```json +[ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + }, + 10101 +] +``` + +Response: `true` + +## Wallet + + +### WalletAddresses + + +Perms: admin + +Inputs: `null` + +Response: `null` + +### WalletBalance + + +Perms: read + +Inputs: +```json +[ + "t01234" +] +``` + +Response: `"0"` + +### WalletDefaultAddress + + +Perms: write + +Inputs: `null` + +Response: `"t01234"` + +### WalletExport + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "Type": "bls", + "PrivateKey": "Ynl0ZSBhcnJheQ==" +} +``` + +### WalletHas + + +Perms: write + +Inputs: +```json +[ + "t01234" +] +``` + +Response: `true` + +### WalletImport + + +Perms: admin + +Inputs: `null` + +Response: `"t01234"` + +### WalletNewAddress + + +Perms: write + +Inputs: `null` + +Response: `"t01234"` + +### WalletSetDefault + + +Perms: write + +Inputs: +```json +[ + "t01234" +] +``` + +Response: `{}` + +### WalletSign + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "Ynl0ZSBhcnJheQ==", + { + "Type": "message", + "Extra": "Ynl0ZSBhcnJheQ==" + } +] +``` + +Response: +```json +{ + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" +} +``` + +### WalletSignMessage + + +Perms: sign + +Inputs: +```json +[ + "t01234", + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + } +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } +} +``` + +### WalletState + + +Perms: admin + +Inputs: `null` + +Response: `123` + diff --git a/venus-shared/wallet/msg_meta.go b/venus-shared/wallet/msg_meta.go index 97d0a3e7cc..82a1bc8072 100644 --- a/venus-shared/wallet/msg_meta.go +++ b/venus-shared/wallet/msg_meta.go @@ -3,13 +3,13 @@ package wallet type MsgType string const ( - MTUnknown = "unknown" + MTUnknown = MsgType("unknown") // Signing message CID. MsgMeta.Extra contains raw cbor message bytes - MTChainMsg = "message" + MTChainMsg = MsgType("message") // Signing a blockheader. signing raw cbor block bytes (MsgMeta.Extra is empty) - MTBlock = "block" + MTBlock = MsgType("block") // Signing a deal proposal. signing raw cbor proposal bytes (MsgMeta.Extra is empty) MTDealProposal = MsgType("dealproposal") From b848969388b0b7c7bbe2696fbc4f965d5912ce4c Mon Sep 17 00:00:00 2001 From: zl Date: Fri, 24 Dec 2021 16:56:13 +0800 Subject: [PATCH 082/167] provide esitimate-message type for doc generation (#4641) --- venus-devtool/api-docs-gen/docgen.go | 4 ++++ venus-shared/api/api-document.md | 24 +++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/venus-devtool/api-docs-gen/docgen.go b/venus-devtool/api-docs-gen/docgen.go index 45e3a736fd..004d9cdd9f 100644 --- a/venus-devtool/api-docs-gen/docgen.go +++ b/venus-devtool/api-docs-gen/docgen.go @@ -144,6 +144,10 @@ func init() { addExample(map[string]chain2.MarketBalance{ "t026363": ExampleValue("init", reflect.TypeOf(chain2.MarketBalance{}), nil).(chain2.MarketBalance), }) + addExample([]*chain2.EstimateMessage{ + {Msg: ExampleValue("init", reflect.TypeOf(&chain.Message{}), nil).(*chain.Message), + Spec: ExampleValue("init", reflect.TypeOf(&chain2.MessageSendSpec{}), nil).(*chain2.MessageSendSpec), + }}) addExample(map[string]*pubsub.TopicScoreSnapshot{ "/blocks": { TimeInMesh: time.Minute, diff --git a/venus-shared/api/api-document.md b/venus-shared/api/api-document.md index b38f48bf11..5bb258cd35 100644 --- a/venus-shared/api/api-document.md +++ b/venus-shared/api/api-document.md @@ -845,7 +845,29 @@ Perms: read Inputs: ```json [ - null, + [ + { + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Spec": { + "MaxFee": "0", + "GasOverEstimation": 12.3 + } + } + ], 42, [ { From c27b5c6282a30d3d92aa1b9e21f06e821cfa7ede Mon Sep 17 00:00:00 2001 From: zl Date: Tue, 28 Dec 2021 12:27:31 +0800 Subject: [PATCH 083/167] api mocks (#4654) --- go.mod | 1 - go.sum | 2 + venus-devtool/api-docs-gen/cmd/docgen.go | 1 + venus-devtool/api-docs-gen/docgen.go | 5 +- venus-shared/api/api-document.md | 1228 ++++++++++- venus-shared/api/chain/v0/fullnode.go | 3 + venus-shared/api/chain/v0/mock/full.go | 2460 +++++++++++++++++++++ venus-shared/api/chain/v1/fullnode.go | 2 + venus-shared/api/chain/v1/mock/full.go | 2505 ++++++++++++++++++++++ venus-shared/go.mod | 5 +- venus-shared/go.sum | 22 +- 11 files changed, 6112 insertions(+), 122 deletions(-) create mode 100644 venus-shared/api/chain/v0/mock/full.go create mode 100644 venus-shared/api/chain/v1/mock/full.go diff --git a/go.mod b/go.mod index 527011cd76..98c80267b1 100644 --- a/go.mod +++ b/go.mod @@ -131,7 +131,6 @@ require ( golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 - golang.org/x/tools v0.1.1 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 gopkg.in/cheggaaa/pb.v1 v1.0.28 gorm.io/driver/mysql v1.1.1 diff --git a/go.sum b/go.sum index 112c72f53d..db9db6dc06 100644 --- a/go.sum +++ b/go.sum @@ -497,6 +497,8 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= diff --git a/venus-devtool/api-docs-gen/cmd/docgen.go b/venus-devtool/api-docs-gen/cmd/docgen.go index 7371e20bc1..370007de3e 100644 --- a/venus-devtool/api-docs-gen/cmd/docgen.go +++ b/venus-devtool/api-docs-gen/cmd/docgen.go @@ -44,6 +44,7 @@ func main() { outv := docgen.ExampleValue(m.Name, ft.Out(0), nil) if outv == nil { + _, _ = fmt.Fprintf(os.Stderr, "ExampleValue for %s get nil\n", ft.Out(0).String()) continue } diff --git a/venus-devtool/api-docs-gen/docgen.go b/venus-devtool/api-docs-gen/docgen.go index 004d9cdd9f..6aaaee5372 100644 --- a/venus-devtool/api-docs-gen/docgen.go +++ b/venus-devtool/api-docs-gen/docgen.go @@ -262,7 +262,7 @@ func ExampleValue(method string, t, parent reflect.Type) interface{} { switch t.Kind() { case reflect.Slice: out := reflect.New(t).Elem() - reflect.Append(out, reflect.ValueOf(ExampleValue(method, t.Elem(), t))) + out = reflect.Append(out, reflect.ValueOf(ExampleValue(method, t.Elem(), t))) return out.Interface() case reflect.Chan: return ExampleValue(method, t.Elem(), nil) @@ -277,7 +277,6 @@ func ExampleValue(method string, t, parent reflect.Type) interface{} { out.Index(i).Set(reflect.ValueOf(ExampleValue(method, t.Elem(), t))) } return out.Interface() - case reflect.Ptr: if t.Elem().Kind() == reflect.Struct { es := exampleStruct(method, t.Elem(), t) @@ -291,7 +290,7 @@ func ExampleValue(method string, t, parent reflect.Type) interface{} { return struct{}{} } - fmt.Fprintf(os.Stderr, "Warnning: No example value for type: %s (method '%s')\n", t, method) + _, _ = fmt.Fprintf(os.Stderr, "Warnning: No example value for type: %s (method '%s')\n", t, method) return nil } diff --git a/venus-shared/api/api-document.md b/venus-shared/api/api-document.md index 5bb258cd35..60000c7e39 100644 --- a/venus-shared/api/api-document.md +++ b/venus-shared/api/api-document.md @@ -214,7 +214,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "string value" +] +``` ### Version @@ -242,7 +247,9 @@ Perms: admin Inputs: ```json [ - null + [ + "string value" + ] ] ``` @@ -344,15 +351,29 @@ Response: { "Miner": "t01234", "Ticket": { - "VRFProof": null + "VRFProof": "Bw==" }, "ElectionProof": { "WinCount": 9, - "VRFProof": null + "VRFProof": "Bw==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -395,9 +416,54 @@ Inputs: Response: ```json { - "BlsMessages": null, - "SecpkMessages": null, - "Cids": null + "BlsMessages": [ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + } + ], + "SecpkMessages": [ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], + "Cids": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] } ``` @@ -453,7 +519,31 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + } + } +] +``` ### ChainGetParentMessages @@ -469,7 +559,31 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + } + } +] +``` ### ChainGetParentReceipts @@ -485,7 +599,16 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + } +] +``` ### ChainGetPath @@ -514,7 +637,19 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Type": "string value", + "Val": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } +] +``` ### ChainGetRandomnessFromBeacon @@ -538,7 +673,7 @@ Inputs: ] ``` -Response: `null` +Response: `"Bw=="` ### ChainGetRandomnessFromTickets @@ -562,7 +697,7 @@ Inputs: ] ``` -Response: `null` +Response: `"Bw=="` ### ChainGetReceipts @@ -578,7 +713,16 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + } +] +``` ### ChainGetTipSet @@ -718,7 +862,19 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` ### ChainNotify @@ -727,7 +883,19 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Type": "string value", + "Val": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } +] +``` ### ChainReadObj @@ -880,7 +1048,29 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Err": "string value" + } +] +``` ### GasEstimateFeeCap @@ -1106,15 +1296,29 @@ Response: "Header": { "Miner": "t01234", "Ticket": { - "VRFProof": null + "VRFProof": "Bw==" }, "ElectionProof": { "WinCount": 9, - "VRFProof": null + "VRFProof": "Bw==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -1138,8 +1342,49 @@ Response: "ForkSignaling": 42, "ParentBaseFee": "0" }, - "BLSMessages": null, - "SECPMessages": null + "BLSMessages": [ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + } + ], + "SECPMessages": [ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] } ``` @@ -1246,15 +1491,29 @@ Response: "Block": { "Miner": "t01234", "Ticket": { - "VRFProof": null + "VRFProof": "Bw==" }, "ElectionProof": { "WinCount": 9, - "VRFProof": null + "VRFProof": "Bw==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -1308,17 +1567,52 @@ Inputs: } ], "Ticket": { - "VRFProof": null + "VRFProof": "Bw==" }, "Eproof": { "WinCount": 9, - "VRFProof": null + "VRFProof": "Bw==" }, - "BeaconValues": null, - "Messages": null, + "BeaconValues": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "Messages": [ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], "Epoch": 10101, "Timestamp": 42, - "WinningPoStProof": null + "WinningPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ] } ] ``` @@ -1329,15 +1623,29 @@ Response: "Header": { "Miner": "t01234", "Ticket": { - "VRFProof": null + "VRFProof": "Bw==" }, "ElectionProof": { "WinCount": 9, - "VRFProof": null + "VRFProof": "Bw==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -1361,8 +1669,16 @@ Response: "ForkSignaling": 42, "ParentBaseFee": "0" }, - "BlsMessages": null, - "SecpkMessages": null + "BlsMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "SecpkMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] } ``` @@ -1392,14 +1708,27 @@ Response: { "MinerPower": "0", "NetworkPower": "0", - "Sectors": null, + "Sectors": [ + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ], "WorkerKey": "t01234", "SectorSize": 34359738368, "PrevBeaconEntry": { "Round": 42, "Data": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], "EligibleForMining": true } ``` @@ -1415,11 +1744,43 @@ Perms: write Inputs: ```json [ - null + [ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] ] ``` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### MpoolBatchPushMessage @@ -1429,7 +1790,23 @@ Perms: sign Inputs: ```json [ - null, + [ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + } + ], { "MaxFee": "0", "GasOverEstimation": 12.3 @@ -1437,7 +1814,35 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` ### MpoolBatchPushUntrusted @@ -1447,11 +1852,43 @@ Perms: write Inputs: ```json [ - null + [ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] ] ``` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### MpoolCheckMessages @@ -1461,11 +1898,47 @@ Perms: read Inputs: ```json [ - null + [ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true + } + ] ] ``` -Response: `null` +Response: +```json +[ + [ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Code": 0, + "OK": true, + "Err": "string value", + "Hint": { + "abc": 123 + } + } + ] +] +``` ### MpoolCheckPendingMessages @@ -1479,7 +1952,24 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + [ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Code": 0, + "OK": true, + "Err": "string value", + "Hint": { + "abc": 123 + } + } + ] +] +``` ### MpoolCheckReplaceMessages @@ -1489,11 +1979,44 @@ Perms: read Inputs: ```json [ - null + [ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + } + ] ] ``` -Response: `null` +Response: +```json +[ + [ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Code": 0, + "OK": true, + "Err": "string value", + "Hint": { + "abc": 123 + } + } + ] +] +``` ### MpoolClear @@ -1533,7 +2056,9 @@ Inputs: `null` Response: ```json { - "PriorityAddrs": null, + "PriorityAddrs": [ + "t01234" + ], "SizeLimitHigh": 123, "SizeLimitLow": 123, "ReplaceByFeeRatio": 12.3, @@ -1568,15 +2093,43 @@ Inputs: { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" } - ] + } ] ``` -Response: `null` - ### MpoolPublishByAddr @@ -1790,7 +2343,35 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` ### MpoolSelects @@ -1808,11 +2389,43 @@ Inputs: "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } ], - null + [ + 12.3 + ] ] ``` -Response: `null` +Response: +```json +[ + [ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] +] +``` ### MpoolSetConfig @@ -1823,7 +2436,9 @@ Inputs: ```json [ { - "PriorityAddrs": null, + "PriorityAddrs": [ + "t01234" + ], "SizeLimitHigh": 123, "SizeLimitLow": 123, "ReplaceByFeeRatio": 12.3, @@ -2116,7 +2731,9 @@ Inputs: ```json [ 42, - null, + [ + "t01234" + ], 10101, "0", "t01234", @@ -2380,7 +2997,9 @@ Response: ```json { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` @@ -2395,7 +3014,9 @@ Perms: read Inputs: ```json [ - null + [ + "string value" + ] ] ``` @@ -2423,7 +3044,9 @@ Response: ```json { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` @@ -2446,7 +3069,9 @@ Response: ```json { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` @@ -2488,7 +3113,12 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" +] +``` ### NetworkGetPeerID @@ -2516,7 +3146,19 @@ Inputs: Response: ```json { - "Peers": null + "Peers": [ + { + "Addr": "string value", + "Peer": "string value", + "Latency": "string value", + "Muxer": "string value", + "Streams": [ + { + "Protocol": "string value" + } + ] + } + ] } ``` @@ -2656,7 +3298,12 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + "t01234" +] +``` ### PaychNewPayment @@ -2668,7 +3315,19 @@ Inputs: [ "t01234", "t01234", - null + [ + { + "Amount": "0", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "MinSettle": 10101, + "Extra": { + "Actor": "t01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + } + } + ] ] ``` @@ -2679,7 +3338,33 @@ Response: "WaitSentinel": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Vouchers": null + "Vouchers": [ + { + "ChannelAddr": "t01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "t01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } + ] } ``` @@ -2745,7 +3430,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -2781,7 +3471,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -2817,7 +3512,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -2859,7 +3559,12 @@ Response: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -2881,7 +3586,36 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ChannelAddr": "t01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "t01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } +] +``` ### PaychVoucherSubmit @@ -2906,7 +3640,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -2939,7 +3678,12 @@ Response: { "Network": "string value", "BlockTime": 60000000000, - "SupportedSectors": null + "SupportedSectors": [ + { + "Size": 34359738368, + "MaxPieceSize": 1024 + } + ] } ``` @@ -3116,8 +3860,73 @@ Response: }, "Error": "string value", "Duration": 60000000000, - "GasCharges": null, - "Subcalls": null + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": [ + { + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": null + } + ] }, "Error": "string value", "Duration": 60000000000 @@ -3230,7 +4039,7 @@ Inputs: ] ``` -Response: `null` +Response: `"Bw=="` ### StateGetRandomnessFromTickets @@ -3254,7 +4063,7 @@ Inputs: ] ``` -Response: `null` +Response: `"Bw=="` ### StateListActors @@ -3275,7 +4084,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "t01234" +] +``` ### StateListMiners @@ -3296,7 +4110,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "t01234" +] +``` ### StateLookupID @@ -3490,7 +4309,29 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null + } +] +``` ### StateMinerAvailableBalance @@ -3534,7 +4375,18 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "PostSubmissions": [ + 5, + 1 + ], + "DisputableProofCount": 42 + } +] +``` ### StateMinerFaults @@ -3590,10 +4442,14 @@ Response: "Owner": "t01234", "Worker": "t01234", "NewWorker": "t01234", - "ControlAddresses": null, + "ControlAddresses": [ + "t01234" + ], "WorkerChangeEpoch": 10101, "PeerId": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Multiaddrs": null, + "Multiaddrs": [ + "Ynl0ZSBhcnJheQ==" + ], "WindowPoStProofType": 8, "SectorSize": 34359738368, "WindowPoStPartitionSectors": 42, @@ -3617,7 +4473,9 @@ Inputs: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, "SealRandEpoch": 10101, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Expiration": 10101, "ReplaceCapacity": true, "ReplaceSectorDeadline": 42, @@ -3658,7 +4516,33 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "AllSectors": [ + 5, + 1 + ], + "FaultySectors": [ + 5, + 1 + ], + "RecoveringSectors": [ + 5, + 1 + ], + "LiveSectors": [ + 5, + 1 + ], + "ActiveSectors": [ + 5, + 1 + ] + } +] +``` ### StateMinerPower @@ -3711,7 +4595,9 @@ Inputs: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, "SealRandEpoch": 10101, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Expiration": 10101, "ReplaceCapacity": true, "ReplaceSectorDeadline": 42, @@ -3894,7 +4780,29 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null + } +] +``` ### StateMinerWorkerAddress @@ -4054,7 +4962,9 @@ Response: "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Activation": 10101, "Expiration": 10101, "DealWeight": "0", @@ -4126,7 +5036,9 @@ Response: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, "SealRandEpoch": 10101, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Expiration": 10101, "ReplaceCapacity": true, "ReplaceSectorDeadline": 42, @@ -4290,7 +5202,26 @@ Inputs: `null` Response: ```json { - "ActiveSyncs": null, + "ActiveSyncs": [ + { + "WorkerID": 42, + "Base": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Target": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Stage": 1, + "Height": 10101, + "Start": "0001-01-01T00:00:00Z", + "End": "0001-01-01T00:00:00Z", + "Message": "string value" + } + ], "VMApplied": 42 } ``` @@ -4307,15 +5238,29 @@ Inputs: "Header": { "Miner": "t01234", "Ticket": { - "VRFProof": null + "VRFProof": "Bw==" }, "ElectionProof": { "WinCount": 9, - "VRFProof": null + "VRFProof": "Bw==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -4339,8 +5284,16 @@ Inputs: "ForkSignaling": 42, "ParentBaseFee": "0" }, - "BlsMessages": null, - "SecpkMessages": null + "BlsMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "SecpkMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] } ] ``` @@ -4360,8 +5313,56 @@ Inputs: `null` Response: ```json { - "History": null, - "Buckets": null + "History": [ + { + "State": 1, + "Base": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Current": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Start": "0001-01-01T00:00:00Z", + "End": "0001-01-01T00:00:00Z", + "Err": {}, + "Source": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Sender": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Head": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } + ], + "Buckets": [ + { + "State": 1, + "Base": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Current": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Start": "0001-01-01T00:00:00Z", + "End": "0001-01-01T00:00:00Z", + "Err": {}, + "Source": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Sender": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Head": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } + ] } ``` @@ -4413,7 +5414,12 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + "t01234" +] +``` ### WalletBalance diff --git a/venus-shared/api/chain/v0/fullnode.go b/venus-shared/api/chain/v0/fullnode.go index cd812ddbcc..a33a5cff18 100644 --- a/venus-shared/api/chain/v0/fullnode.go +++ b/venus-shared/api/chain/v0/fullnode.go @@ -13,6 +13,9 @@ TODO: */ package v0 +//go:generate go run github.com/golang/mock/mockgen@v1.6.0 -destination=./mock/full.go -package=mock . FullNode + + type FullNode interface { IBlockStore IChain diff --git a/venus-shared/api/chain/v0/mock/full.go b/venus-shared/api/chain/v0/mock/full.go new file mode 100644 index 0000000000..4d488a0f64 --- /dev/null +++ b/venus-shared/api/chain/v0/mock/full.go @@ -0,0 +1,2460 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/filecoin-project/venus/venus-shared/api/chain/v0 (interfaces: FullNode) + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + time "time" + + address "github.com/filecoin-project/go-address" + bitfield "github.com/filecoin-project/go-bitfield" + abi "github.com/filecoin-project/go-state-types/abi" + big "github.com/filecoin-project/go-state-types/big" + crypto "github.com/filecoin-project/go-state-types/crypto" + dline "github.com/filecoin-project/go-state-types/dline" + network "github.com/filecoin-project/go-state-types/network" + miner "github.com/filecoin-project/specs-actors/actors/builtin/miner" + paych "github.com/filecoin-project/specs-actors/actors/builtin/paych" + miner0 "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + chain "github.com/filecoin-project/venus/venus-shared/api/chain" + chain0 "github.com/filecoin-project/venus/venus-shared/chain" + net "github.com/filecoin-project/venus/venus-shared/libp2p/net" + messagepool "github.com/filecoin-project/venus/venus-shared/messagepool" + paych0 "github.com/filecoin-project/venus/venus-shared/paych" + wallet "github.com/filecoin-project/venus/venus-shared/wallet" + gomock "github.com/golang/mock/gomock" + cid "github.com/ipfs/go-cid" + metrics "github.com/libp2p/go-libp2p-core/metrics" + peer "github.com/libp2p/go-libp2p-core/peer" + multiaddr "github.com/multiformats/go-multiaddr" +) + +// MockFullNode is a mock of FullNode interface. +type MockFullNode struct { + ctrl *gomock.Controller + recorder *MockFullNodeMockRecorder +} + +// MockFullNodeMockRecorder is the mock recorder for MockFullNode. +type MockFullNodeMockRecorder struct { + mock *MockFullNode +} + +// NewMockFullNode creates a new mock instance. +func NewMockFullNode(ctrl *gomock.Controller) *MockFullNode { + mock := &MockFullNode{ctrl: ctrl} + mock.recorder = &MockFullNodeMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockFullNode) EXPECT() *MockFullNodeMockRecorder { + return m.recorder +} + +// AuthNew mocks base method. +func (m *MockFullNode) AuthNew(arg0 context.Context, arg1 []string) ([]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AuthNew", arg0, arg1) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AuthNew indicates an expected call of AuthNew. +func (mr *MockFullNodeMockRecorder) AuthNew(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AuthNew", reflect.TypeOf((*MockFullNode)(nil).AuthNew), arg0, arg1) +} + +// BeaconGetEntry mocks base method. +func (m *MockFullNode) BeaconGetEntry(arg0 context.Context, arg1 abi.ChainEpoch) (*chain0.BeaconEntry, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BeaconGetEntry", arg0, arg1) + ret0, _ := ret[0].(*chain0.BeaconEntry) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BeaconGetEntry indicates an expected call of BeaconGetEntry. +func (mr *MockFullNodeMockRecorder) BeaconGetEntry(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BeaconGetEntry", reflect.TypeOf((*MockFullNode)(nil).BeaconGetEntry), arg0, arg1) +} + +// BlockTime mocks base method. +func (m *MockFullNode) BlockTime(arg0 context.Context) time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BlockTime", arg0) + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// BlockTime indicates an expected call of BlockTime. +func (mr *MockFullNodeMockRecorder) BlockTime(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BlockTime", reflect.TypeOf((*MockFullNode)(nil).BlockTime), arg0) +} + +// ChainDeleteObj mocks base method. +func (m *MockFullNode) ChainDeleteObj(arg0 context.Context, arg1 cid.Cid) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainDeleteObj", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// ChainDeleteObj indicates an expected call of ChainDeleteObj. +func (mr *MockFullNodeMockRecorder) ChainDeleteObj(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainDeleteObj", reflect.TypeOf((*MockFullNode)(nil).ChainDeleteObj), arg0, arg1) +} + +// ChainExport mocks base method. +func (m *MockFullNode) ChainExport(arg0 context.Context, arg1 abi.ChainEpoch, arg2 bool, arg3 chain0.TipSetKey) (<-chan []byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainExport", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(<-chan []byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainExport indicates an expected call of ChainExport. +func (mr *MockFullNodeMockRecorder) ChainExport(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainExport", reflect.TypeOf((*MockFullNode)(nil).ChainExport), arg0, arg1, arg2, arg3) +} + +// ChainGetBlock mocks base method. +func (m *MockFullNode) ChainGetBlock(arg0 context.Context, arg1 cid.Cid) (*chain0.BlockHeader, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetBlock", arg0, arg1) + ret0, _ := ret[0].(*chain0.BlockHeader) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetBlock indicates an expected call of ChainGetBlock. +func (mr *MockFullNodeMockRecorder) ChainGetBlock(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetBlock", reflect.TypeOf((*MockFullNode)(nil).ChainGetBlock), arg0, arg1) +} + +// ChainGetBlockMessages mocks base method. +func (m *MockFullNode) ChainGetBlockMessages(arg0 context.Context, arg1 cid.Cid) (*chain.BlockMessages, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetBlockMessages", arg0, arg1) + ret0, _ := ret[0].(*chain.BlockMessages) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetBlockMessages indicates an expected call of ChainGetBlockMessages. +func (mr *MockFullNodeMockRecorder) ChainGetBlockMessages(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetBlockMessages", reflect.TypeOf((*MockFullNode)(nil).ChainGetBlockMessages), arg0, arg1) +} + +// ChainGetMessage mocks base method. +func (m *MockFullNode) ChainGetMessage(arg0 context.Context, arg1 cid.Cid) (*chain0.Message, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetMessage", arg0, arg1) + ret0, _ := ret[0].(*chain0.Message) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetMessage indicates an expected call of ChainGetMessage. +func (mr *MockFullNodeMockRecorder) ChainGetMessage(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetMessage", reflect.TypeOf((*MockFullNode)(nil).ChainGetMessage), arg0, arg1) +} + +// ChainGetMessagesInTipset mocks base method. +func (m *MockFullNode) ChainGetMessagesInTipset(arg0 context.Context, arg1 chain0.TipSetKey) ([]chain.Message, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetMessagesInTipset", arg0, arg1) + ret0, _ := ret[0].([]chain.Message) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetMessagesInTipset indicates an expected call of ChainGetMessagesInTipset. +func (mr *MockFullNodeMockRecorder) ChainGetMessagesInTipset(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetMessagesInTipset", reflect.TypeOf((*MockFullNode)(nil).ChainGetMessagesInTipset), arg0, arg1) +} + +// ChainGetParentMessages mocks base method. +func (m *MockFullNode) ChainGetParentMessages(arg0 context.Context, arg1 cid.Cid) ([]chain.Message, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetParentMessages", arg0, arg1) + ret0, _ := ret[0].([]chain.Message) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetParentMessages indicates an expected call of ChainGetParentMessages. +func (mr *MockFullNodeMockRecorder) ChainGetParentMessages(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetParentMessages", reflect.TypeOf((*MockFullNode)(nil).ChainGetParentMessages), arg0, arg1) +} + +// ChainGetParentReceipts mocks base method. +func (m *MockFullNode) ChainGetParentReceipts(arg0 context.Context, arg1 cid.Cid) ([]*chain0.MessageReceipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetParentReceipts", arg0, arg1) + ret0, _ := ret[0].([]*chain0.MessageReceipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetParentReceipts indicates an expected call of ChainGetParentReceipts. +func (mr *MockFullNodeMockRecorder) ChainGetParentReceipts(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetParentReceipts", reflect.TypeOf((*MockFullNode)(nil).ChainGetParentReceipts), arg0, arg1) +} + +// ChainGetPath mocks base method. +func (m *MockFullNode) ChainGetPath(arg0 context.Context, arg1, arg2 chain0.TipSetKey) ([]*chain.HeadChange, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetPath", arg0, arg1, arg2) + ret0, _ := ret[0].([]*chain.HeadChange) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetPath indicates an expected call of ChainGetPath. +func (mr *MockFullNodeMockRecorder) ChainGetPath(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetPath", reflect.TypeOf((*MockFullNode)(nil).ChainGetPath), arg0, arg1, arg2) +} + +// ChainGetRandomnessFromBeacon mocks base method. +func (m *MockFullNode) ChainGetRandomnessFromBeacon(arg0 context.Context, arg1 chain0.TipSetKey, arg2 crypto.DomainSeparationTag, arg3 abi.ChainEpoch, arg4 []byte) (abi.Randomness, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetRandomnessFromBeacon", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(abi.Randomness) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetRandomnessFromBeacon indicates an expected call of ChainGetRandomnessFromBeacon. +func (mr *MockFullNodeMockRecorder) ChainGetRandomnessFromBeacon(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetRandomnessFromBeacon", reflect.TypeOf((*MockFullNode)(nil).ChainGetRandomnessFromBeacon), arg0, arg1, arg2, arg3, arg4) +} + +// ChainGetRandomnessFromTickets mocks base method. +func (m *MockFullNode) ChainGetRandomnessFromTickets(arg0 context.Context, arg1 chain0.TipSetKey, arg2 crypto.DomainSeparationTag, arg3 abi.ChainEpoch, arg4 []byte) (abi.Randomness, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetRandomnessFromTickets", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(abi.Randomness) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetRandomnessFromTickets indicates an expected call of ChainGetRandomnessFromTickets. +func (mr *MockFullNodeMockRecorder) ChainGetRandomnessFromTickets(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetRandomnessFromTickets", reflect.TypeOf((*MockFullNode)(nil).ChainGetRandomnessFromTickets), arg0, arg1, arg2, arg3, arg4) +} + +// ChainGetReceipts mocks base method. +func (m *MockFullNode) ChainGetReceipts(arg0 context.Context, arg1 cid.Cid) ([]chain0.MessageReceipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetReceipts", arg0, arg1) + ret0, _ := ret[0].([]chain0.MessageReceipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetReceipts indicates an expected call of ChainGetReceipts. +func (mr *MockFullNodeMockRecorder) ChainGetReceipts(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetReceipts", reflect.TypeOf((*MockFullNode)(nil).ChainGetReceipts), arg0, arg1) +} + +// ChainGetTipSet mocks base method. +func (m *MockFullNode) ChainGetTipSet(arg0 context.Context, arg1 chain0.TipSetKey) (*chain0.TipSet, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetTipSet", arg0, arg1) + ret0, _ := ret[0].(*chain0.TipSet) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetTipSet indicates an expected call of ChainGetTipSet. +func (mr *MockFullNodeMockRecorder) ChainGetTipSet(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetTipSet", reflect.TypeOf((*MockFullNode)(nil).ChainGetTipSet), arg0, arg1) +} + +// ChainGetTipSetByHeight mocks base method. +func (m *MockFullNode) ChainGetTipSetByHeight(arg0 context.Context, arg1 abi.ChainEpoch, arg2 chain0.TipSetKey) (*chain0.TipSet, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetTipSetByHeight", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain0.TipSet) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetTipSetByHeight indicates an expected call of ChainGetTipSetByHeight. +func (mr *MockFullNodeMockRecorder) ChainGetTipSetByHeight(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetTipSetByHeight", reflect.TypeOf((*MockFullNode)(nil).ChainGetTipSetByHeight), arg0, arg1, arg2) +} + +// ChainHasObj mocks base method. +func (m *MockFullNode) ChainHasObj(arg0 context.Context, arg1 cid.Cid) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainHasObj", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainHasObj indicates an expected call of ChainHasObj. +func (mr *MockFullNodeMockRecorder) ChainHasObj(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainHasObj", reflect.TypeOf((*MockFullNode)(nil).ChainHasObj), arg0, arg1) +} + +// ChainHead mocks base method. +func (m *MockFullNode) ChainHead(arg0 context.Context) (*chain0.TipSet, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainHead", arg0) + ret0, _ := ret[0].(*chain0.TipSet) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainHead indicates an expected call of ChainHead. +func (mr *MockFullNodeMockRecorder) ChainHead(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainHead", reflect.TypeOf((*MockFullNode)(nil).ChainHead), arg0) +} + +// ChainList mocks base method. +func (m *MockFullNode) ChainList(arg0 context.Context, arg1 chain0.TipSetKey, arg2 int) ([]chain0.TipSetKey, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainList", arg0, arg1, arg2) + ret0, _ := ret[0].([]chain0.TipSetKey) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainList indicates an expected call of ChainList. +func (mr *MockFullNodeMockRecorder) ChainList(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainList", reflect.TypeOf((*MockFullNode)(nil).ChainList), arg0, arg1, arg2) +} + +// ChainNotify mocks base method. +func (m *MockFullNode) ChainNotify(arg0 context.Context) (<-chan []*chain.HeadChange, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainNotify", arg0) + ret0, _ := ret[0].(<-chan []*chain.HeadChange) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainNotify indicates an expected call of ChainNotify. +func (mr *MockFullNodeMockRecorder) ChainNotify(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainNotify", reflect.TypeOf((*MockFullNode)(nil).ChainNotify), arg0) +} + +// ChainReadObj mocks base method. +func (m *MockFullNode) ChainReadObj(arg0 context.Context, arg1 cid.Cid) ([]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainReadObj", arg0, arg1) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainReadObj indicates an expected call of ChainReadObj. +func (mr *MockFullNodeMockRecorder) ChainReadObj(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainReadObj", reflect.TypeOf((*MockFullNode)(nil).ChainReadObj), arg0, arg1) +} + +// ChainSetHead mocks base method. +func (m *MockFullNode) ChainSetHead(arg0 context.Context, arg1 chain0.TipSetKey) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainSetHead", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// ChainSetHead indicates an expected call of ChainSetHead. +func (mr *MockFullNodeMockRecorder) ChainSetHead(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainSetHead", reflect.TypeOf((*MockFullNode)(nil).ChainSetHead), arg0, arg1) +} + +// ChainStatObj mocks base method. +func (m *MockFullNode) ChainStatObj(arg0 context.Context, arg1, arg2 cid.Cid) (chain.ObjStat, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainStatObj", arg0, arg1, arg2) + ret0, _ := ret[0].(chain.ObjStat) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainStatObj indicates an expected call of ChainStatObj. +func (mr *MockFullNodeMockRecorder) ChainStatObj(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainStatObj", reflect.TypeOf((*MockFullNode)(nil).ChainStatObj), arg0, arg1, arg2) +} + +// ChainSyncHandleNewTipSet mocks base method. +func (m *MockFullNode) ChainSyncHandleNewTipSet(arg0 context.Context, arg1 *chain0.ChainInfo) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainSyncHandleNewTipSet", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// ChainSyncHandleNewTipSet indicates an expected call of ChainSyncHandleNewTipSet. +func (mr *MockFullNodeMockRecorder) ChainSyncHandleNewTipSet(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainSyncHandleNewTipSet", reflect.TypeOf((*MockFullNode)(nil).ChainSyncHandleNewTipSet), arg0, arg1) +} + +// ChainTipSetWeight mocks base method. +func (m *MockFullNode) ChainTipSetWeight(arg0 context.Context, arg1 chain0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainTipSetWeight", arg0, arg1) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainTipSetWeight indicates an expected call of ChainTipSetWeight. +func (mr *MockFullNodeMockRecorder) ChainTipSetWeight(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainTipSetWeight", reflect.TypeOf((*MockFullNode)(nil).ChainTipSetWeight), arg0, arg1) +} + +// Concurrent mocks base method. +func (m *MockFullNode) Concurrent(arg0 context.Context) int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Concurrent", arg0) + ret0, _ := ret[0].(int64) + return ret0 +} + +// Concurrent indicates an expected call of Concurrent. +func (mr *MockFullNodeMockRecorder) Concurrent(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Concurrent", reflect.TypeOf((*MockFullNode)(nil).Concurrent), arg0) +} + +// GasBatchEstimateMessageGas mocks base method. +func (m *MockFullNode) GasBatchEstimateMessageGas(arg0 context.Context, arg1 []*chain.EstimateMessage, arg2 uint64, arg3 chain0.TipSetKey) ([]*chain.EstimateResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GasBatchEstimateMessageGas", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].([]*chain.EstimateResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GasBatchEstimateMessageGas indicates an expected call of GasBatchEstimateMessageGas. +func (mr *MockFullNodeMockRecorder) GasBatchEstimateMessageGas(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GasBatchEstimateMessageGas", reflect.TypeOf((*MockFullNode)(nil).GasBatchEstimateMessageGas), arg0, arg1, arg2, arg3) +} + +// GasEstimateFeeCap mocks base method. +func (m *MockFullNode) GasEstimateFeeCap(arg0 context.Context, arg1 *chain0.Message, arg2 int64, arg3 chain0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GasEstimateFeeCap", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GasEstimateFeeCap indicates an expected call of GasEstimateFeeCap. +func (mr *MockFullNodeMockRecorder) GasEstimateFeeCap(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GasEstimateFeeCap", reflect.TypeOf((*MockFullNode)(nil).GasEstimateFeeCap), arg0, arg1, arg2, arg3) +} + +// GasEstimateGasLimit mocks base method. +func (m *MockFullNode) GasEstimateGasLimit(arg0 context.Context, arg1 *chain0.Message, arg2 chain0.TipSetKey) (int64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GasEstimateGasLimit", arg0, arg1, arg2) + ret0, _ := ret[0].(int64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GasEstimateGasLimit indicates an expected call of GasEstimateGasLimit. +func (mr *MockFullNodeMockRecorder) GasEstimateGasLimit(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GasEstimateGasLimit", reflect.TypeOf((*MockFullNode)(nil).GasEstimateGasLimit), arg0, arg1, arg2) +} + +// GasEstimateGasPremium mocks base method. +func (m *MockFullNode) GasEstimateGasPremium(arg0 context.Context, arg1 uint64, arg2 address.Address, arg3 int64, arg4 chain0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GasEstimateGasPremium", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GasEstimateGasPremium indicates an expected call of GasEstimateGasPremium. +func (mr *MockFullNodeMockRecorder) GasEstimateGasPremium(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GasEstimateGasPremium", reflect.TypeOf((*MockFullNode)(nil).GasEstimateGasPremium), arg0, arg1, arg2, arg3, arg4) +} + +// GasEstimateMessageGas mocks base method. +func (m *MockFullNode) GasEstimateMessageGas(arg0 context.Context, arg1 *chain0.Message, arg2 *chain.MessageSendSpec, arg3 chain0.TipSetKey) (*chain0.Message, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GasEstimateMessageGas", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*chain0.Message) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GasEstimateMessageGas indicates an expected call of GasEstimateMessageGas. +func (mr *MockFullNodeMockRecorder) GasEstimateMessageGas(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GasEstimateMessageGas", reflect.TypeOf((*MockFullNode)(nil).GasEstimateMessageGas), arg0, arg1, arg2, arg3) +} + +// GetActor mocks base method. +func (m *MockFullNode) GetActor(arg0 context.Context, arg1 address.Address) (*chain0.Actor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetActor", arg0, arg1) + ret0, _ := ret[0].(*chain0.Actor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetActor indicates an expected call of GetActor. +func (mr *MockFullNodeMockRecorder) GetActor(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetActor", reflect.TypeOf((*MockFullNode)(nil).GetActor), arg0, arg1) +} + +// GetEntry mocks base method. +func (m *MockFullNode) GetEntry(arg0 context.Context, arg1 abi.ChainEpoch, arg2 uint64) (*chain0.BeaconEntry, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetEntry", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain0.BeaconEntry) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetEntry indicates an expected call of GetEntry. +func (mr *MockFullNodeMockRecorder) GetEntry(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEntry", reflect.TypeOf((*MockFullNode)(nil).GetEntry), arg0, arg1, arg2) +} + +// GetFullBlock mocks base method. +func (m *MockFullNode) GetFullBlock(arg0 context.Context, arg1 cid.Cid) (*chain0.FullBlock, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetFullBlock", arg0, arg1) + ret0, _ := ret[0].(*chain0.FullBlock) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetFullBlock indicates an expected call of GetFullBlock. +func (mr *MockFullNodeMockRecorder) GetFullBlock(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetFullBlock", reflect.TypeOf((*MockFullNode)(nil).GetFullBlock), arg0, arg1) +} + +// GetParentStateRootActor mocks base method. +func (m *MockFullNode) GetParentStateRootActor(arg0 context.Context, arg1 *chain0.TipSet, arg2 address.Address) (*chain0.Actor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetParentStateRootActor", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain0.Actor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetParentStateRootActor indicates an expected call of GetParentStateRootActor. +func (mr *MockFullNodeMockRecorder) GetParentStateRootActor(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetParentStateRootActor", reflect.TypeOf((*MockFullNode)(nil).GetParentStateRootActor), arg0, arg1, arg2) +} + +// HasPassword mocks base method. +func (m *MockFullNode) HasPassword(arg0 context.Context) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HasPassword", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// HasPassword indicates an expected call of HasPassword. +func (mr *MockFullNodeMockRecorder) HasPassword(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasPassword", reflect.TypeOf((*MockFullNode)(nil).HasPassword), arg0) +} + +// ListActor mocks base method. +func (m *MockFullNode) ListActor(arg0 context.Context) (map[address.Address]*chain0.Actor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListActor", arg0) + ret0, _ := ret[0].(map[address.Address]*chain0.Actor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListActor indicates an expected call of ListActor. +func (mr *MockFullNodeMockRecorder) ListActor(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListActor", reflect.TypeOf((*MockFullNode)(nil).ListActor), arg0) +} + +// LockWallet mocks base method. +func (m *MockFullNode) LockWallet(arg0 context.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LockWallet", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// LockWallet indicates an expected call of LockWallet. +func (mr *MockFullNodeMockRecorder) LockWallet(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LockWallet", reflect.TypeOf((*MockFullNode)(nil).LockWallet), arg0) +} + +// MessageWait mocks base method. +func (m *MockFullNode) MessageWait(arg0 context.Context, arg1 cid.Cid, arg2, arg3 abi.ChainEpoch) (*chain.ChainMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MessageWait", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*chain.ChainMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MessageWait indicates an expected call of MessageWait. +func (mr *MockFullNodeMockRecorder) MessageWait(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MessageWait", reflect.TypeOf((*MockFullNode)(nil).MessageWait), arg0, arg1, arg2, arg3) +} + +// MinerCreateBlock mocks base method. +func (m *MockFullNode) MinerCreateBlock(arg0 context.Context, arg1 *chain.BlockTemplate) (*chain0.BlockMsg, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MinerCreateBlock", arg0, arg1) + ret0, _ := ret[0].(*chain0.BlockMsg) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MinerCreateBlock indicates an expected call of MinerCreateBlock. +func (mr *MockFullNodeMockRecorder) MinerCreateBlock(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MinerCreateBlock", reflect.TypeOf((*MockFullNode)(nil).MinerCreateBlock), arg0, arg1) +} + +// MinerGetBaseInfo mocks base method. +func (m *MockFullNode) MinerGetBaseInfo(arg0 context.Context, arg1 address.Address, arg2 abi.ChainEpoch, arg3 chain0.TipSetKey) (*chain.MiningBaseInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MinerGetBaseInfo", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*chain.MiningBaseInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MinerGetBaseInfo indicates an expected call of MinerGetBaseInfo. +func (mr *MockFullNodeMockRecorder) MinerGetBaseInfo(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MinerGetBaseInfo", reflect.TypeOf((*MockFullNode)(nil).MinerGetBaseInfo), arg0, arg1, arg2, arg3) +} + +// MpoolBatchPush mocks base method. +func (m *MockFullNode) MpoolBatchPush(arg0 context.Context, arg1 []*chain0.SignedMessage) ([]cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolBatchPush", arg0, arg1) + ret0, _ := ret[0].([]cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolBatchPush indicates an expected call of MpoolBatchPush. +func (mr *MockFullNodeMockRecorder) MpoolBatchPush(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolBatchPush", reflect.TypeOf((*MockFullNode)(nil).MpoolBatchPush), arg0, arg1) +} + +// MpoolBatchPushMessage mocks base method. +func (m *MockFullNode) MpoolBatchPushMessage(arg0 context.Context, arg1 []*chain0.Message, arg2 *chain.MessageSendSpec) ([]*chain0.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolBatchPushMessage", arg0, arg1, arg2) + ret0, _ := ret[0].([]*chain0.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolBatchPushMessage indicates an expected call of MpoolBatchPushMessage. +func (mr *MockFullNodeMockRecorder) MpoolBatchPushMessage(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolBatchPushMessage", reflect.TypeOf((*MockFullNode)(nil).MpoolBatchPushMessage), arg0, arg1, arg2) +} + +// MpoolBatchPushUntrusted mocks base method. +func (m *MockFullNode) MpoolBatchPushUntrusted(arg0 context.Context, arg1 []*chain0.SignedMessage) ([]cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolBatchPushUntrusted", arg0, arg1) + ret0, _ := ret[0].([]cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolBatchPushUntrusted indicates an expected call of MpoolBatchPushUntrusted. +func (mr *MockFullNodeMockRecorder) MpoolBatchPushUntrusted(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolBatchPushUntrusted", reflect.TypeOf((*MockFullNode)(nil).MpoolBatchPushUntrusted), arg0, arg1) +} + +// MpoolClear mocks base method. +func (m *MockFullNode) MpoolClear(arg0 context.Context, arg1 bool) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolClear", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// MpoolClear indicates an expected call of MpoolClear. +func (mr *MockFullNodeMockRecorder) MpoolClear(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolClear", reflect.TypeOf((*MockFullNode)(nil).MpoolClear), arg0, arg1) +} + +// MpoolDeleteByAdress mocks base method. +func (m *MockFullNode) MpoolDeleteByAdress(arg0 context.Context, arg1 address.Address) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolDeleteByAdress", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// MpoolDeleteByAdress indicates an expected call of MpoolDeleteByAdress. +func (mr *MockFullNodeMockRecorder) MpoolDeleteByAdress(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolDeleteByAdress", reflect.TypeOf((*MockFullNode)(nil).MpoolDeleteByAdress), arg0, arg1) +} + +// MpoolGetConfig mocks base method. +func (m *MockFullNode) MpoolGetConfig(arg0 context.Context) (*messagepool.MpoolConfig, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolGetConfig", arg0) + ret0, _ := ret[0].(*messagepool.MpoolConfig) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolGetConfig indicates an expected call of MpoolGetConfig. +func (mr *MockFullNodeMockRecorder) MpoolGetConfig(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolGetConfig", reflect.TypeOf((*MockFullNode)(nil).MpoolGetConfig), arg0) +} + +// MpoolGetNonce mocks base method. +func (m *MockFullNode) MpoolGetNonce(arg0 context.Context, arg1 address.Address) (uint64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolGetNonce", arg0, arg1) + ret0, _ := ret[0].(uint64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolGetNonce indicates an expected call of MpoolGetNonce. +func (mr *MockFullNodeMockRecorder) MpoolGetNonce(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolGetNonce", reflect.TypeOf((*MockFullNode)(nil).MpoolGetNonce), arg0, arg1) +} + +// MpoolPending mocks base method. +func (m *MockFullNode) MpoolPending(arg0 context.Context, arg1 chain0.TipSetKey) ([]*chain0.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolPending", arg0, arg1) + ret0, _ := ret[0].([]*chain0.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolPending indicates an expected call of MpoolPending. +func (mr *MockFullNodeMockRecorder) MpoolPending(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPending", reflect.TypeOf((*MockFullNode)(nil).MpoolPending), arg0, arg1) +} + +// MpoolPublishByAddr mocks base method. +func (m *MockFullNode) MpoolPublishByAddr(arg0 context.Context, arg1 address.Address) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolPublishByAddr", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// MpoolPublishByAddr indicates an expected call of MpoolPublishByAddr. +func (mr *MockFullNodeMockRecorder) MpoolPublishByAddr(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPublishByAddr", reflect.TypeOf((*MockFullNode)(nil).MpoolPublishByAddr), arg0, arg1) +} + +// MpoolPublishMessage mocks base method. +func (m *MockFullNode) MpoolPublishMessage(arg0 context.Context, arg1 *chain0.SignedMessage) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolPublishMessage", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// MpoolPublishMessage indicates an expected call of MpoolPublishMessage. +func (mr *MockFullNodeMockRecorder) MpoolPublishMessage(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPublishMessage", reflect.TypeOf((*MockFullNode)(nil).MpoolPublishMessage), arg0, arg1) +} + +// MpoolPush mocks base method. +func (m *MockFullNode) MpoolPush(arg0 context.Context, arg1 *chain0.SignedMessage) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolPush", arg0, arg1) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolPush indicates an expected call of MpoolPush. +func (mr *MockFullNodeMockRecorder) MpoolPush(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPush", reflect.TypeOf((*MockFullNode)(nil).MpoolPush), arg0, arg1) +} + +// MpoolPushMessage mocks base method. +func (m *MockFullNode) MpoolPushMessage(arg0 context.Context, arg1 *chain0.Message, arg2 *chain.MessageSendSpec) (*chain0.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolPushMessage", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain0.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolPushMessage indicates an expected call of MpoolPushMessage. +func (mr *MockFullNodeMockRecorder) MpoolPushMessage(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPushMessage", reflect.TypeOf((*MockFullNode)(nil).MpoolPushMessage), arg0, arg1, arg2) +} + +// MpoolPushUntrusted mocks base method. +func (m *MockFullNode) MpoolPushUntrusted(arg0 context.Context, arg1 *chain0.SignedMessage) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolPushUntrusted", arg0, arg1) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolPushUntrusted indicates an expected call of MpoolPushUntrusted. +func (mr *MockFullNodeMockRecorder) MpoolPushUntrusted(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPushUntrusted", reflect.TypeOf((*MockFullNode)(nil).MpoolPushUntrusted), arg0, arg1) +} + +// MpoolSelect mocks base method. +func (m *MockFullNode) MpoolSelect(arg0 context.Context, arg1 chain0.TipSetKey, arg2 float64) ([]*chain0.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolSelect", arg0, arg1, arg2) + ret0, _ := ret[0].([]*chain0.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolSelect indicates an expected call of MpoolSelect. +func (mr *MockFullNodeMockRecorder) MpoolSelect(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolSelect", reflect.TypeOf((*MockFullNode)(nil).MpoolSelect), arg0, arg1, arg2) +} + +// MpoolSelects mocks base method. +func (m *MockFullNode) MpoolSelects(arg0 context.Context, arg1 chain0.TipSetKey, arg2 []float64) ([][]*chain0.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolSelects", arg0, arg1, arg2) + ret0, _ := ret[0].([][]*chain0.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolSelects indicates an expected call of MpoolSelects. +func (mr *MockFullNodeMockRecorder) MpoolSelects(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolSelects", reflect.TypeOf((*MockFullNode)(nil).MpoolSelects), arg0, arg1, arg2) +} + +// MpoolSetConfig mocks base method. +func (m *MockFullNode) MpoolSetConfig(arg0 context.Context, arg1 *messagepool.MpoolConfig) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolSetConfig", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// MpoolSetConfig indicates an expected call of MpoolSetConfig. +func (mr *MockFullNodeMockRecorder) MpoolSetConfig(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolSetConfig", reflect.TypeOf((*MockFullNode)(nil).MpoolSetConfig), arg0, arg1) +} + +// MpoolSub mocks base method. +func (m *MockFullNode) MpoolSub(arg0 context.Context) (<-chan messagepool.MpoolUpdate, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolSub", arg0) + ret0, _ := ret[0].(<-chan messagepool.MpoolUpdate) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolSub indicates an expected call of MpoolSub. +func (mr *MockFullNodeMockRecorder) MpoolSub(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolSub", reflect.TypeOf((*MockFullNode)(nil).MpoolSub), arg0) +} + +// MsigAddApprove mocks base method. +func (m *MockFullNode) MsigAddApprove(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5 address.Address, arg6 bool) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigAddApprove", arg0, arg1, arg2, arg3, arg4, arg5, arg6) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigAddApprove indicates an expected call of MsigAddApprove. +func (mr *MockFullNodeMockRecorder) MsigAddApprove(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigAddApprove", reflect.TypeOf((*MockFullNode)(nil).MsigAddApprove), arg0, arg1, arg2, arg3, arg4, arg5, arg6) +} + +// MsigAddCancel mocks base method. +func (m *MockFullNode) MsigAddCancel(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4 address.Address, arg5 bool) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigAddCancel", arg0, arg1, arg2, arg3, arg4, arg5) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigAddCancel indicates an expected call of MsigAddCancel. +func (mr *MockFullNodeMockRecorder) MsigAddCancel(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigAddCancel", reflect.TypeOf((*MockFullNode)(nil).MsigAddCancel), arg0, arg1, arg2, arg3, arg4, arg5) +} + +// MsigAddPropose mocks base method. +func (m *MockFullNode) MsigAddPropose(arg0 context.Context, arg1, arg2, arg3 address.Address, arg4 bool) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigAddPropose", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigAddPropose indicates an expected call of MsigAddPropose. +func (mr *MockFullNodeMockRecorder) MsigAddPropose(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigAddPropose", reflect.TypeOf((*MockFullNode)(nil).MsigAddPropose), arg0, arg1, arg2, arg3, arg4) +} + +// MsigApprove mocks base method. +func (m *MockFullNode) MsigApprove(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigApprove", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigApprove indicates an expected call of MsigApprove. +func (mr *MockFullNodeMockRecorder) MsigApprove(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigApprove", reflect.TypeOf((*MockFullNode)(nil).MsigApprove), arg0, arg1, arg2, arg3) +} + +// MsigApproveTxnHash mocks base method. +func (m *MockFullNode) MsigApproveTxnHash(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3, arg4 address.Address, arg5 big.Int, arg6 address.Address, arg7 uint64, arg8 []byte) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigApproveTxnHash", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigApproveTxnHash indicates an expected call of MsigApproveTxnHash. +func (mr *MockFullNodeMockRecorder) MsigApproveTxnHash(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigApproveTxnHash", reflect.TypeOf((*MockFullNode)(nil).MsigApproveTxnHash), arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) +} + +// MsigCancel mocks base method. +func (m *MockFullNode) MsigCancel(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address, arg4 big.Int, arg5 address.Address, arg6 uint64, arg7 []byte) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigCancel", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigCancel indicates an expected call of MsigCancel. +func (mr *MockFullNodeMockRecorder) MsigCancel(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigCancel", reflect.TypeOf((*MockFullNode)(nil).MsigCancel), arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) +} + +// MsigCreate mocks base method. +func (m *MockFullNode) MsigCreate(arg0 context.Context, arg1 uint64, arg2 []address.Address, arg3 abi.ChainEpoch, arg4 big.Int, arg5 address.Address, arg6 big.Int) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigCreate", arg0, arg1, arg2, arg3, arg4, arg5, arg6) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigCreate indicates an expected call of MsigCreate. +func (mr *MockFullNodeMockRecorder) MsigCreate(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigCreate", reflect.TypeOf((*MockFullNode)(nil).MsigCreate), arg0, arg1, arg2, arg3, arg4, arg5, arg6) +} + +// MsigGetVested mocks base method. +func (m *MockFullNode) MsigGetVested(arg0 context.Context, arg1 address.Address, arg2, arg3 chain0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigGetVested", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigGetVested indicates an expected call of MsigGetVested. +func (mr *MockFullNodeMockRecorder) MsigGetVested(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigGetVested", reflect.TypeOf((*MockFullNode)(nil).MsigGetVested), arg0, arg1, arg2, arg3) +} + +// MsigPropose mocks base method. +func (m *MockFullNode) MsigPropose(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int, arg4 address.Address, arg5 uint64, arg6 []byte) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigPropose", arg0, arg1, arg2, arg3, arg4, arg5, arg6) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigPropose indicates an expected call of MsigPropose. +func (mr *MockFullNodeMockRecorder) MsigPropose(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigPropose", reflect.TypeOf((*MockFullNode)(nil).MsigPropose), arg0, arg1, arg2, arg3, arg4, arg5, arg6) +} + +// MsigRemoveSigner mocks base method. +func (m *MockFullNode) MsigRemoveSigner(arg0 context.Context, arg1, arg2, arg3 address.Address, arg4 bool) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigRemoveSigner", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigRemoveSigner indicates an expected call of MsigRemoveSigner. +func (mr *MockFullNodeMockRecorder) MsigRemoveSigner(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigRemoveSigner", reflect.TypeOf((*MockFullNode)(nil).MsigRemoveSigner), arg0, arg1, arg2, arg3, arg4) +} + +// MsigSwapApprove mocks base method. +func (m *MockFullNode) MsigSwapApprove(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5, arg6 address.Address) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigSwapApprove", arg0, arg1, arg2, arg3, arg4, arg5, arg6) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigSwapApprove indicates an expected call of MsigSwapApprove. +func (mr *MockFullNodeMockRecorder) MsigSwapApprove(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigSwapApprove", reflect.TypeOf((*MockFullNode)(nil).MsigSwapApprove), arg0, arg1, arg2, arg3, arg4, arg5, arg6) +} + +// MsigSwapCancel mocks base method. +func (m *MockFullNode) MsigSwapCancel(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5 address.Address) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigSwapCancel", arg0, arg1, arg2, arg3, arg4, arg5) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigSwapCancel indicates an expected call of MsigSwapCancel. +func (mr *MockFullNodeMockRecorder) MsigSwapCancel(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigSwapCancel", reflect.TypeOf((*MockFullNode)(nil).MsigSwapCancel), arg0, arg1, arg2, arg3, arg4, arg5) +} + +// MsigSwapPropose mocks base method. +func (m *MockFullNode) MsigSwapPropose(arg0 context.Context, arg1, arg2, arg3, arg4 address.Address) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigSwapPropose", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigSwapPropose indicates an expected call of MsigSwapPropose. +func (mr *MockFullNodeMockRecorder) MsigSwapPropose(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigSwapPropose", reflect.TypeOf((*MockFullNode)(nil).MsigSwapPropose), arg0, arg1, arg2, arg3, arg4) +} + +// NetAddrsListen mocks base method. +func (m *MockFullNode) NetAddrsListen(arg0 context.Context) (peer.AddrInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetAddrsListen", arg0) + ret0, _ := ret[0].(peer.AddrInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetAddrsListen indicates an expected call of NetAddrsListen. +func (mr *MockFullNodeMockRecorder) NetAddrsListen(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetAddrsListen", reflect.TypeOf((*MockFullNode)(nil).NetAddrsListen), arg0) +} + +// NetworkConnect mocks base method. +func (m *MockFullNode) NetworkConnect(arg0 context.Context, arg1 []string) (<-chan net.ConnectionResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetworkConnect", arg0, arg1) + ret0, _ := ret[0].(<-chan net.ConnectionResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetworkConnect indicates an expected call of NetworkConnect. +func (mr *MockFullNodeMockRecorder) NetworkConnect(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkConnect", reflect.TypeOf((*MockFullNode)(nil).NetworkConnect), arg0, arg1) +} + +// NetworkFindPeer mocks base method. +func (m *MockFullNode) NetworkFindPeer(arg0 context.Context, arg1 peer.ID) (peer.AddrInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetworkFindPeer", arg0, arg1) + ret0, _ := ret[0].(peer.AddrInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetworkFindPeer indicates an expected call of NetworkFindPeer. +func (mr *MockFullNodeMockRecorder) NetworkFindPeer(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkFindPeer", reflect.TypeOf((*MockFullNode)(nil).NetworkFindPeer), arg0, arg1) +} + +// NetworkFindProvidersAsync mocks base method. +func (m *MockFullNode) NetworkFindProvidersAsync(arg0 context.Context, arg1 cid.Cid, arg2 int) <-chan peer.AddrInfo { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetworkFindProvidersAsync", arg0, arg1, arg2) + ret0, _ := ret[0].(<-chan peer.AddrInfo) + return ret0 +} + +// NetworkFindProvidersAsync indicates an expected call of NetworkFindProvidersAsync. +func (mr *MockFullNodeMockRecorder) NetworkFindProvidersAsync(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkFindProvidersAsync", reflect.TypeOf((*MockFullNode)(nil).NetworkFindProvidersAsync), arg0, arg1, arg2) +} + +// NetworkGetBandwidthStats mocks base method. +func (m *MockFullNode) NetworkGetBandwidthStats(arg0 context.Context) metrics.Stats { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetworkGetBandwidthStats", arg0) + ret0, _ := ret[0].(metrics.Stats) + return ret0 +} + +// NetworkGetBandwidthStats indicates an expected call of NetworkGetBandwidthStats. +func (mr *MockFullNodeMockRecorder) NetworkGetBandwidthStats(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkGetBandwidthStats", reflect.TypeOf((*MockFullNode)(nil).NetworkGetBandwidthStats), arg0) +} + +// NetworkGetClosestPeers mocks base method. +func (m *MockFullNode) NetworkGetClosestPeers(arg0 context.Context, arg1 string) (<-chan peer.ID, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetworkGetClosestPeers", arg0, arg1) + ret0, _ := ret[0].(<-chan peer.ID) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetworkGetClosestPeers indicates an expected call of NetworkGetClosestPeers. +func (mr *MockFullNodeMockRecorder) NetworkGetClosestPeers(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkGetClosestPeers", reflect.TypeOf((*MockFullNode)(nil).NetworkGetClosestPeers), arg0, arg1) +} + +// NetworkGetPeerAddresses mocks base method. +func (m *MockFullNode) NetworkGetPeerAddresses(arg0 context.Context) []multiaddr.Multiaddr { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetworkGetPeerAddresses", arg0) + ret0, _ := ret[0].([]multiaddr.Multiaddr) + return ret0 +} + +// NetworkGetPeerAddresses indicates an expected call of NetworkGetPeerAddresses. +func (mr *MockFullNodeMockRecorder) NetworkGetPeerAddresses(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkGetPeerAddresses", reflect.TypeOf((*MockFullNode)(nil).NetworkGetPeerAddresses), arg0) +} + +// NetworkGetPeerID mocks base method. +func (m *MockFullNode) NetworkGetPeerID(arg0 context.Context) peer.ID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetworkGetPeerID", arg0) + ret0, _ := ret[0].(peer.ID) + return ret0 +} + +// NetworkGetPeerID indicates an expected call of NetworkGetPeerID. +func (mr *MockFullNodeMockRecorder) NetworkGetPeerID(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkGetPeerID", reflect.TypeOf((*MockFullNode)(nil).NetworkGetPeerID), arg0) +} + +// NetworkPeers mocks base method. +func (m *MockFullNode) NetworkPeers(arg0 context.Context, arg1, arg2, arg3 bool) (*net.SwarmConnInfos, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetworkPeers", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*net.SwarmConnInfos) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetworkPeers indicates an expected call of NetworkPeers. +func (mr *MockFullNodeMockRecorder) NetworkPeers(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkPeers", reflect.TypeOf((*MockFullNode)(nil).NetworkPeers), arg0, arg1, arg2, arg3) +} + +// PaychAllocateLane mocks base method. +func (m *MockFullNode) PaychAllocateLane(arg0 context.Context, arg1 address.Address) (uint64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychAllocateLane", arg0, arg1) + ret0, _ := ret[0].(uint64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychAllocateLane indicates an expected call of PaychAllocateLane. +func (mr *MockFullNodeMockRecorder) PaychAllocateLane(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychAllocateLane", reflect.TypeOf((*MockFullNode)(nil).PaychAllocateLane), arg0, arg1) +} + +// PaychAvailableFunds mocks base method. +func (m *MockFullNode) PaychAvailableFunds(arg0 context.Context, arg1 address.Address) (*chain.ChannelAvailableFunds, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychAvailableFunds", arg0, arg1) + ret0, _ := ret[0].(*chain.ChannelAvailableFunds) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychAvailableFunds indicates an expected call of PaychAvailableFunds. +func (mr *MockFullNodeMockRecorder) PaychAvailableFunds(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychAvailableFunds", reflect.TypeOf((*MockFullNode)(nil).PaychAvailableFunds), arg0, arg1) +} + +// PaychAvailableFundsByFromTo mocks base method. +func (m *MockFullNode) PaychAvailableFundsByFromTo(arg0 context.Context, arg1, arg2 address.Address) (*chain.ChannelAvailableFunds, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychAvailableFundsByFromTo", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain.ChannelAvailableFunds) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychAvailableFundsByFromTo indicates an expected call of PaychAvailableFundsByFromTo. +func (mr *MockFullNodeMockRecorder) PaychAvailableFundsByFromTo(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychAvailableFundsByFromTo", reflect.TypeOf((*MockFullNode)(nil).PaychAvailableFundsByFromTo), arg0, arg1, arg2) +} + +// PaychCollect mocks base method. +func (m *MockFullNode) PaychCollect(arg0 context.Context, arg1 address.Address) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychCollect", arg0, arg1) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychCollect indicates an expected call of PaychCollect. +func (mr *MockFullNodeMockRecorder) PaychCollect(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychCollect", reflect.TypeOf((*MockFullNode)(nil).PaychCollect), arg0, arg1) +} + +// PaychGet mocks base method. +func (m *MockFullNode) PaychGet(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int) (*paych0.ChannelInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychGet", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*paych0.ChannelInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychGet indicates an expected call of PaychGet. +func (mr *MockFullNodeMockRecorder) PaychGet(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychGet", reflect.TypeOf((*MockFullNode)(nil).PaychGet), arg0, arg1, arg2, arg3) +} + +// PaychGetWaitReady mocks base method. +func (m *MockFullNode) PaychGetWaitReady(arg0 context.Context, arg1 cid.Cid) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychGetWaitReady", arg0, arg1) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychGetWaitReady indicates an expected call of PaychGetWaitReady. +func (mr *MockFullNodeMockRecorder) PaychGetWaitReady(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychGetWaitReady", reflect.TypeOf((*MockFullNode)(nil).PaychGetWaitReady), arg0, arg1) +} + +// PaychList mocks base method. +func (m *MockFullNode) PaychList(arg0 context.Context) ([]address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychList", arg0) + ret0, _ := ret[0].([]address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychList indicates an expected call of PaychList. +func (mr *MockFullNodeMockRecorder) PaychList(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychList", reflect.TypeOf((*MockFullNode)(nil).PaychList), arg0) +} + +// PaychNewPayment mocks base method. +func (m *MockFullNode) PaychNewPayment(arg0 context.Context, arg1, arg2 address.Address, arg3 []paych0.VoucherSpec) (*paych0.PaymentInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychNewPayment", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*paych0.PaymentInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychNewPayment indicates an expected call of PaychNewPayment. +func (mr *MockFullNodeMockRecorder) PaychNewPayment(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychNewPayment", reflect.TypeOf((*MockFullNode)(nil).PaychNewPayment), arg0, arg1, arg2, arg3) +} + +// PaychSettle mocks base method. +func (m *MockFullNode) PaychSettle(arg0 context.Context, arg1 address.Address) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychSettle", arg0, arg1) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychSettle indicates an expected call of PaychSettle. +func (mr *MockFullNodeMockRecorder) PaychSettle(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychSettle", reflect.TypeOf((*MockFullNode)(nil).PaychSettle), arg0, arg1) +} + +// PaychStatus mocks base method. +func (m *MockFullNode) PaychStatus(arg0 context.Context, arg1 address.Address) (*paych0.Status, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychStatus", arg0, arg1) + ret0, _ := ret[0].(*paych0.Status) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychStatus indicates an expected call of PaychStatus. +func (mr *MockFullNodeMockRecorder) PaychStatus(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychStatus", reflect.TypeOf((*MockFullNode)(nil).PaychStatus), arg0, arg1) +} + +// PaychVoucherAdd mocks base method. +func (m *MockFullNode) PaychVoucherAdd(arg0 context.Context, arg1 address.Address, arg2 *paych.SignedVoucher, arg3 []byte, arg4 big.Int) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherAdd", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychVoucherAdd indicates an expected call of PaychVoucherAdd. +func (mr *MockFullNodeMockRecorder) PaychVoucherAdd(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherAdd", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherAdd), arg0, arg1, arg2, arg3, arg4) +} + +// PaychVoucherCheckSpendable mocks base method. +func (m *MockFullNode) PaychVoucherCheckSpendable(arg0 context.Context, arg1 address.Address, arg2 *paych.SignedVoucher, arg3, arg4 []byte) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherCheckSpendable", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychVoucherCheckSpendable indicates an expected call of PaychVoucherCheckSpendable. +func (mr *MockFullNodeMockRecorder) PaychVoucherCheckSpendable(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherCheckSpendable", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherCheckSpendable), arg0, arg1, arg2, arg3, arg4) +} + +// PaychVoucherCheckValid mocks base method. +func (m *MockFullNode) PaychVoucherCheckValid(arg0 context.Context, arg1 address.Address, arg2 *paych.SignedVoucher) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherCheckValid", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// PaychVoucherCheckValid indicates an expected call of PaychVoucherCheckValid. +func (mr *MockFullNodeMockRecorder) PaychVoucherCheckValid(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherCheckValid", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherCheckValid), arg0, arg1, arg2) +} + +// PaychVoucherCreate mocks base method. +func (m *MockFullNode) PaychVoucherCreate(arg0 context.Context, arg1 address.Address, arg2 big.Int, arg3 uint64) (*paych0.VoucherCreateResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherCreate", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*paych0.VoucherCreateResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychVoucherCreate indicates an expected call of PaychVoucherCreate. +func (mr *MockFullNodeMockRecorder) PaychVoucherCreate(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherCreate", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherCreate), arg0, arg1, arg2, arg3) +} + +// PaychVoucherList mocks base method. +func (m *MockFullNode) PaychVoucherList(arg0 context.Context, arg1 address.Address) ([]*paych.SignedVoucher, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherList", arg0, arg1) + ret0, _ := ret[0].([]*paych.SignedVoucher) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychVoucherList indicates an expected call of PaychVoucherList. +func (mr *MockFullNodeMockRecorder) PaychVoucherList(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherList", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherList), arg0, arg1) +} + +// PaychVoucherSubmit mocks base method. +func (m *MockFullNode) PaychVoucherSubmit(arg0 context.Context, arg1 address.Address, arg2 *paych.SignedVoucher, arg3, arg4 []byte) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherSubmit", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychVoucherSubmit indicates an expected call of PaychVoucherSubmit. +func (mr *MockFullNodeMockRecorder) PaychVoucherSubmit(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherSubmit", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherSubmit), arg0, arg1, arg2, arg3, arg4) +} + +// ProtocolParameters mocks base method. +func (m *MockFullNode) ProtocolParameters(arg0 context.Context) (*chain.ProtocolParams, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ProtocolParameters", arg0) + ret0, _ := ret[0].(*chain.ProtocolParams) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ProtocolParameters indicates an expected call of ProtocolParameters. +func (mr *MockFullNodeMockRecorder) ProtocolParameters(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ProtocolParameters", reflect.TypeOf((*MockFullNode)(nil).ProtocolParameters), arg0) +} + +// ResolveToKeyAddr mocks base method. +func (m *MockFullNode) ResolveToKeyAddr(arg0 context.Context, arg1 address.Address, arg2 *chain0.TipSet) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ResolveToKeyAddr", arg0, arg1, arg2) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ResolveToKeyAddr indicates an expected call of ResolveToKeyAddr. +func (mr *MockFullNodeMockRecorder) ResolveToKeyAddr(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResolveToKeyAddr", reflect.TypeOf((*MockFullNode)(nil).ResolveToKeyAddr), arg0, arg1, arg2) +} + +// SetConcurrent mocks base method. +func (m *MockFullNode) SetConcurrent(arg0 context.Context, arg1 int64) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetConcurrent", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetConcurrent indicates an expected call of SetConcurrent. +func (mr *MockFullNodeMockRecorder) SetConcurrent(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetConcurrent", reflect.TypeOf((*MockFullNode)(nil).SetConcurrent), arg0, arg1) +} + +// SetPassword mocks base method. +func (m *MockFullNode) SetPassword(arg0 context.Context, arg1 []byte) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetPassword", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetPassword indicates an expected call of SetPassword. +func (mr *MockFullNodeMockRecorder) SetPassword(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetPassword", reflect.TypeOf((*MockFullNode)(nil).SetPassword), arg0, arg1) +} + +// StateAccountKey mocks base method. +func (m *MockFullNode) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateAccountKey", arg0, arg1, arg2) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateAccountKey indicates an expected call of StateAccountKey. +func (mr *MockFullNodeMockRecorder) StateAccountKey(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateAccountKey", reflect.TypeOf((*MockFullNode)(nil).StateAccountKey), arg0, arg1, arg2) +} + +// StateCall mocks base method. +func (m *MockFullNode) StateCall(arg0 context.Context, arg1 *chain0.Message, arg2 chain0.TipSetKey) (*chain.InvocResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateCall", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain.InvocResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateCall indicates an expected call of StateCall. +func (mr *MockFullNodeMockRecorder) StateCall(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateCall", reflect.TypeOf((*MockFullNode)(nil).StateCall), arg0, arg1, arg2) +} + +// StateCirculatingSupply mocks base method. +func (m *MockFullNode) StateCirculatingSupply(arg0 context.Context, arg1 chain0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateCirculatingSupply", arg0, arg1) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateCirculatingSupply indicates an expected call of StateCirculatingSupply. +func (mr *MockFullNodeMockRecorder) StateCirculatingSupply(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateCirculatingSupply", reflect.TypeOf((*MockFullNode)(nil).StateCirculatingSupply), arg0, arg1) +} + +// StateDealProviderCollateralBounds mocks base method. +func (m *MockFullNode) StateDealProviderCollateralBounds(arg0 context.Context, arg1 abi.PaddedPieceSize, arg2 bool, arg3 chain0.TipSetKey) (chain.DealCollateralBounds, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateDealProviderCollateralBounds", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(chain.DealCollateralBounds) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateDealProviderCollateralBounds indicates an expected call of StateDealProviderCollateralBounds. +func (mr *MockFullNodeMockRecorder) StateDealProviderCollateralBounds(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateDealProviderCollateralBounds", reflect.TypeOf((*MockFullNode)(nil).StateDealProviderCollateralBounds), arg0, arg1, arg2, arg3) +} + +// StateGetActor mocks base method. +func (m *MockFullNode) StateGetActor(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*chain0.Actor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateGetActor", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain0.Actor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateGetActor indicates an expected call of StateGetActor. +func (mr *MockFullNodeMockRecorder) StateGetActor(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetActor", reflect.TypeOf((*MockFullNode)(nil).StateGetActor), arg0, arg1, arg2) +} + +// StateGetReceipt mocks base method. +func (m *MockFullNode) StateGetReceipt(arg0 context.Context, arg1 cid.Cid, arg2 chain0.TipSetKey) (*chain0.MessageReceipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateGetReceipt", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain0.MessageReceipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateGetReceipt indicates an expected call of StateGetReceipt. +func (mr *MockFullNodeMockRecorder) StateGetReceipt(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetReceipt", reflect.TypeOf((*MockFullNode)(nil).StateGetReceipt), arg0, arg1, arg2) +} + +// StateListActors mocks base method. +func (m *MockFullNode) StateListActors(arg0 context.Context, arg1 chain0.TipSetKey) ([]address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateListActors", arg0, arg1) + ret0, _ := ret[0].([]address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateListActors indicates an expected call of StateListActors. +func (mr *MockFullNodeMockRecorder) StateListActors(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateListActors", reflect.TypeOf((*MockFullNode)(nil).StateListActors), arg0, arg1) +} + +// StateListMiners mocks base method. +func (m *MockFullNode) StateListMiners(arg0 context.Context, arg1 chain0.TipSetKey) ([]address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateListMiners", arg0, arg1) + ret0, _ := ret[0].([]address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateListMiners indicates an expected call of StateListMiners. +func (mr *MockFullNodeMockRecorder) StateListMiners(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateListMiners", reflect.TypeOf((*MockFullNode)(nil).StateListMiners), arg0, arg1) +} + +// StateLookupID mocks base method. +func (m *MockFullNode) StateLookupID(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateLookupID", arg0, arg1, arg2) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateLookupID indicates an expected call of StateLookupID. +func (mr *MockFullNodeMockRecorder) StateLookupID(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateLookupID", reflect.TypeOf((*MockFullNode)(nil).StateLookupID), arg0, arg1, arg2) +} + +// StateMarketBalance mocks base method. +func (m *MockFullNode) StateMarketBalance(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (chain.MarketBalance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMarketBalance", arg0, arg1, arg2) + ret0, _ := ret[0].(chain.MarketBalance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMarketBalance indicates an expected call of StateMarketBalance. +func (mr *MockFullNodeMockRecorder) StateMarketBalance(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMarketBalance", reflect.TypeOf((*MockFullNode)(nil).StateMarketBalance), arg0, arg1, arg2) +} + +// StateMarketDeals mocks base method. +func (m *MockFullNode) StateMarketDeals(arg0 context.Context, arg1 chain0.TipSetKey) (map[string]chain.MarketDeal, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMarketDeals", arg0, arg1) + ret0, _ := ret[0].(map[string]chain.MarketDeal) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMarketDeals indicates an expected call of StateMarketDeals. +func (mr *MockFullNodeMockRecorder) StateMarketDeals(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMarketDeals", reflect.TypeOf((*MockFullNode)(nil).StateMarketDeals), arg0, arg1) +} + +// StateMarketParticipants mocks base method. +func (m *MockFullNode) StateMarketParticipants(arg0 context.Context, arg1 chain0.TipSetKey) (map[string]chain.MarketBalance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMarketParticipants", arg0, arg1) + ret0, _ := ret[0].(map[string]chain.MarketBalance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMarketParticipants indicates an expected call of StateMarketParticipants. +func (mr *MockFullNodeMockRecorder) StateMarketParticipants(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMarketParticipants", reflect.TypeOf((*MockFullNode)(nil).StateMarketParticipants), arg0, arg1) +} + +// StateMarketStorageDeal mocks base method. +func (m *MockFullNode) StateMarketStorageDeal(arg0 context.Context, arg1 abi.DealID, arg2 chain0.TipSetKey) (*chain.MarketDeal, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMarketStorageDeal", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain.MarketDeal) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMarketStorageDeal indicates an expected call of StateMarketStorageDeal. +func (mr *MockFullNodeMockRecorder) StateMarketStorageDeal(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMarketStorageDeal", reflect.TypeOf((*MockFullNode)(nil).StateMarketStorageDeal), arg0, arg1, arg2) +} + +// StateMinerActiveSectors mocks base method. +func (m *MockFullNode) StateMinerActiveSectors(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) ([]*miner0.SectorOnChainInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerActiveSectors", arg0, arg1, arg2) + ret0, _ := ret[0].([]*miner0.SectorOnChainInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerActiveSectors indicates an expected call of StateMinerActiveSectors. +func (mr *MockFullNodeMockRecorder) StateMinerActiveSectors(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerActiveSectors", reflect.TypeOf((*MockFullNode)(nil).StateMinerActiveSectors), arg0, arg1, arg2) +} + +// StateMinerAvailableBalance mocks base method. +func (m *MockFullNode) StateMinerAvailableBalance(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerAvailableBalance", arg0, arg1, arg2) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerAvailableBalance indicates an expected call of StateMinerAvailableBalance. +func (mr *MockFullNodeMockRecorder) StateMinerAvailableBalance(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerAvailableBalance", reflect.TypeOf((*MockFullNode)(nil).StateMinerAvailableBalance), arg0, arg1, arg2) +} + +// StateMinerDeadlines mocks base method. +func (m *MockFullNode) StateMinerDeadlines(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) ([]chain.Deadline, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerDeadlines", arg0, arg1, arg2) + ret0, _ := ret[0].([]chain.Deadline) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerDeadlines indicates an expected call of StateMinerDeadlines. +func (mr *MockFullNodeMockRecorder) StateMinerDeadlines(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerDeadlines", reflect.TypeOf((*MockFullNode)(nil).StateMinerDeadlines), arg0, arg1, arg2) +} + +// StateMinerFaults mocks base method. +func (m *MockFullNode) StateMinerFaults(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (bitfield.BitField, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerFaults", arg0, arg1, arg2) + ret0, _ := ret[0].(bitfield.BitField) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerFaults indicates an expected call of StateMinerFaults. +func (mr *MockFullNodeMockRecorder) StateMinerFaults(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerFaults", reflect.TypeOf((*MockFullNode)(nil).StateMinerFaults), arg0, arg1, arg2) +} + +// StateMinerInfo mocks base method. +func (m *MockFullNode) StateMinerInfo(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (miner0.MinerInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerInfo", arg0, arg1, arg2) + ret0, _ := ret[0].(miner0.MinerInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerInfo indicates an expected call of StateMinerInfo. +func (mr *MockFullNodeMockRecorder) StateMinerInfo(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerInfo", reflect.TypeOf((*MockFullNode)(nil).StateMinerInfo), arg0, arg1, arg2) +} + +// StateMinerInitialPledgeCollateral mocks base method. +func (m *MockFullNode) StateMinerInitialPledgeCollateral(arg0 context.Context, arg1 address.Address, arg2 miner.SectorPreCommitInfo, arg3 chain0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerInitialPledgeCollateral", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerInitialPledgeCollateral indicates an expected call of StateMinerInitialPledgeCollateral. +func (mr *MockFullNodeMockRecorder) StateMinerInitialPledgeCollateral(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerInitialPledgeCollateral", reflect.TypeOf((*MockFullNode)(nil).StateMinerInitialPledgeCollateral), arg0, arg1, arg2, arg3) +} + +// StateMinerPartitions mocks base method. +func (m *MockFullNode) StateMinerPartitions(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 chain0.TipSetKey) ([]chain.Partition, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerPartitions", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].([]chain.Partition) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerPartitions indicates an expected call of StateMinerPartitions. +func (mr *MockFullNodeMockRecorder) StateMinerPartitions(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerPartitions", reflect.TypeOf((*MockFullNode)(nil).StateMinerPartitions), arg0, arg1, arg2, arg3) +} + +// StateMinerPower mocks base method. +func (m *MockFullNode) StateMinerPower(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*chain.MinerPower, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerPower", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain.MinerPower) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerPower indicates an expected call of StateMinerPower. +func (mr *MockFullNodeMockRecorder) StateMinerPower(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerPower", reflect.TypeOf((*MockFullNode)(nil).StateMinerPower), arg0, arg1, arg2) +} + +// StateMinerPreCommitDepositForPower mocks base method. +func (m *MockFullNode) StateMinerPreCommitDepositForPower(arg0 context.Context, arg1 address.Address, arg2 miner.SectorPreCommitInfo, arg3 chain0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerPreCommitDepositForPower", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerPreCommitDepositForPower indicates an expected call of StateMinerPreCommitDepositForPower. +func (mr *MockFullNodeMockRecorder) StateMinerPreCommitDepositForPower(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerPreCommitDepositForPower", reflect.TypeOf((*MockFullNode)(nil).StateMinerPreCommitDepositForPower), arg0, arg1, arg2, arg3) +} + +// StateMinerProvingDeadline mocks base method. +func (m *MockFullNode) StateMinerProvingDeadline(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*dline.Info, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerProvingDeadline", arg0, arg1, arg2) + ret0, _ := ret[0].(*dline.Info) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerProvingDeadline indicates an expected call of StateMinerProvingDeadline. +func (mr *MockFullNodeMockRecorder) StateMinerProvingDeadline(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerProvingDeadline", reflect.TypeOf((*MockFullNode)(nil).StateMinerProvingDeadline), arg0, arg1, arg2) +} + +// StateMinerRecoveries mocks base method. +func (m *MockFullNode) StateMinerRecoveries(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (bitfield.BitField, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerRecoveries", arg0, arg1, arg2) + ret0, _ := ret[0].(bitfield.BitField) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerRecoveries indicates an expected call of StateMinerRecoveries. +func (mr *MockFullNodeMockRecorder) StateMinerRecoveries(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerRecoveries", reflect.TypeOf((*MockFullNode)(nil).StateMinerRecoveries), arg0, arg1, arg2) +} + +// StateMinerSectorAllocated mocks base method. +func (m *MockFullNode) StateMinerSectorAllocated(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerSectorAllocated", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerSectorAllocated indicates an expected call of StateMinerSectorAllocated. +func (mr *MockFullNodeMockRecorder) StateMinerSectorAllocated(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerSectorAllocated", reflect.TypeOf((*MockFullNode)(nil).StateMinerSectorAllocated), arg0, arg1, arg2, arg3) +} + +// StateMinerSectorCount mocks base method. +func (m *MockFullNode) StateMinerSectorCount(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (chain.MinerSectors, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerSectorCount", arg0, arg1, arg2) + ret0, _ := ret[0].(chain.MinerSectors) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerSectorCount indicates an expected call of StateMinerSectorCount. +func (mr *MockFullNodeMockRecorder) StateMinerSectorCount(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerSectorCount", reflect.TypeOf((*MockFullNode)(nil).StateMinerSectorCount), arg0, arg1, arg2) +} + +// StateMinerSectorSize mocks base method. +func (m *MockFullNode) StateMinerSectorSize(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (abi.SectorSize, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerSectorSize", arg0, arg1, arg2) + ret0, _ := ret[0].(abi.SectorSize) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerSectorSize indicates an expected call of StateMinerSectorSize. +func (mr *MockFullNodeMockRecorder) StateMinerSectorSize(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerSectorSize", reflect.TypeOf((*MockFullNode)(nil).StateMinerSectorSize), arg0, arg1, arg2) +} + +// StateMinerSectors mocks base method. +func (m *MockFullNode) StateMinerSectors(arg0 context.Context, arg1 address.Address, arg2 *bitfield.BitField, arg3 chain0.TipSetKey) ([]*miner0.SectorOnChainInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerSectors", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].([]*miner0.SectorOnChainInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerSectors indicates an expected call of StateMinerSectors. +func (mr *MockFullNodeMockRecorder) StateMinerSectors(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerSectors", reflect.TypeOf((*MockFullNode)(nil).StateMinerSectors), arg0, arg1, arg2, arg3) +} + +// StateMinerWorkerAddress mocks base method. +func (m *MockFullNode) StateMinerWorkerAddress(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerWorkerAddress", arg0, arg1, arg2) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerWorkerAddress indicates an expected call of StateMinerWorkerAddress. +func (mr *MockFullNodeMockRecorder) StateMinerWorkerAddress(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerWorkerAddress", reflect.TypeOf((*MockFullNode)(nil).StateMinerWorkerAddress), arg0, arg1, arg2) +} + +// StateNetworkName mocks base method. +func (m *MockFullNode) StateNetworkName(arg0 context.Context) (chain.NetworkName, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateNetworkName", arg0) + ret0, _ := ret[0].(chain.NetworkName) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateNetworkName indicates an expected call of StateNetworkName. +func (mr *MockFullNodeMockRecorder) StateNetworkName(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateNetworkName", reflect.TypeOf((*MockFullNode)(nil).StateNetworkName), arg0) +} + +// StateNetworkVersion mocks base method. +func (m *MockFullNode) StateNetworkVersion(arg0 context.Context, arg1 chain0.TipSetKey) (network.Version, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateNetworkVersion", arg0, arg1) + ret0, _ := ret[0].(network.Version) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateNetworkVersion indicates an expected call of StateNetworkVersion. +func (mr *MockFullNodeMockRecorder) StateNetworkVersion(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateNetworkVersion", reflect.TypeOf((*MockFullNode)(nil).StateNetworkVersion), arg0, arg1) +} + +// StateSearchMsg mocks base method. +func (m *MockFullNode) StateSearchMsg(arg0 context.Context, arg1 cid.Cid) (*chain.MsgLookup, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSearchMsg", arg0, arg1) + ret0, _ := ret[0].(*chain.MsgLookup) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSearchMsg indicates an expected call of StateSearchMsg. +func (mr *MockFullNodeMockRecorder) StateSearchMsg(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSearchMsg", reflect.TypeOf((*MockFullNode)(nil).StateSearchMsg), arg0, arg1) +} + +// StateSearchMsgLimited mocks base method. +func (m *MockFullNode) StateSearchMsgLimited(arg0 context.Context, arg1 cid.Cid, arg2 abi.ChainEpoch) (*chain.MsgLookup, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSearchMsgLimited", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain.MsgLookup) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSearchMsgLimited indicates an expected call of StateSearchMsgLimited. +func (mr *MockFullNodeMockRecorder) StateSearchMsgLimited(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSearchMsgLimited", reflect.TypeOf((*MockFullNode)(nil).StateSearchMsgLimited), arg0, arg1, arg2) +} + +// StateSectorExpiration mocks base method. +func (m *MockFullNode) StateSectorExpiration(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (*miner0.SectorExpiration, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSectorExpiration", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*miner0.SectorExpiration) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSectorExpiration indicates an expected call of StateSectorExpiration. +func (mr *MockFullNodeMockRecorder) StateSectorExpiration(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSectorExpiration", reflect.TypeOf((*MockFullNode)(nil).StateSectorExpiration), arg0, arg1, arg2, arg3) +} + +// StateSectorGetInfo mocks base method. +func (m *MockFullNode) StateSectorGetInfo(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (*miner0.SectorOnChainInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSectorGetInfo", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*miner0.SectorOnChainInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSectorGetInfo indicates an expected call of StateSectorGetInfo. +func (mr *MockFullNodeMockRecorder) StateSectorGetInfo(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSectorGetInfo", reflect.TypeOf((*MockFullNode)(nil).StateSectorGetInfo), arg0, arg1, arg2, arg3) +} + +// StateSectorPartition mocks base method. +func (m *MockFullNode) StateSectorPartition(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (*miner0.SectorLocation, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSectorPartition", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*miner0.SectorLocation) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSectorPartition indicates an expected call of StateSectorPartition. +func (mr *MockFullNodeMockRecorder) StateSectorPartition(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSectorPartition", reflect.TypeOf((*MockFullNode)(nil).StateSectorPartition), arg0, arg1, arg2, arg3) +} + +// StateSectorPreCommitInfo mocks base method. +func (m *MockFullNode) StateSectorPreCommitInfo(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (miner0.SectorPreCommitOnChainInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSectorPreCommitInfo", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(miner0.SectorPreCommitOnChainInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSectorPreCommitInfo indicates an expected call of StateSectorPreCommitInfo. +func (mr *MockFullNodeMockRecorder) StateSectorPreCommitInfo(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSectorPreCommitInfo", reflect.TypeOf((*MockFullNode)(nil).StateSectorPreCommitInfo), arg0, arg1, arg2, arg3) +} + +// StateVMCirculatingSupplyInternal mocks base method. +func (m *MockFullNode) StateVMCirculatingSupplyInternal(arg0 context.Context, arg1 chain0.TipSetKey) (chain0.CirculatingSupply, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateVMCirculatingSupplyInternal", arg0, arg1) + ret0, _ := ret[0].(chain0.CirculatingSupply) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateVMCirculatingSupplyInternal indicates an expected call of StateVMCirculatingSupplyInternal. +func (mr *MockFullNodeMockRecorder) StateVMCirculatingSupplyInternal(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateVMCirculatingSupplyInternal", reflect.TypeOf((*MockFullNode)(nil).StateVMCirculatingSupplyInternal), arg0, arg1) +} + +// StateVerifiedClientStatus mocks base method. +func (m *MockFullNode) StateVerifiedClientStatus(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateVerifiedClientStatus", arg0, arg1, arg2) + ret0, _ := ret[0].(*big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateVerifiedClientStatus indicates an expected call of StateVerifiedClientStatus. +func (mr *MockFullNodeMockRecorder) StateVerifiedClientStatus(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateVerifiedClientStatus", reflect.TypeOf((*MockFullNode)(nil).StateVerifiedClientStatus), arg0, arg1, arg2) +} + +// StateVerifiedRegistryRootKey mocks base method. +func (m *MockFullNode) StateVerifiedRegistryRootKey(arg0 context.Context, arg1 chain0.TipSetKey) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateVerifiedRegistryRootKey", arg0, arg1) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateVerifiedRegistryRootKey indicates an expected call of StateVerifiedRegistryRootKey. +func (mr *MockFullNodeMockRecorder) StateVerifiedRegistryRootKey(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateVerifiedRegistryRootKey", reflect.TypeOf((*MockFullNode)(nil).StateVerifiedRegistryRootKey), arg0, arg1) +} + +// StateVerifierStatus mocks base method. +func (m *MockFullNode) StateVerifierStatus(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateVerifierStatus", arg0, arg1, arg2) + ret0, _ := ret[0].(*big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateVerifierStatus indicates an expected call of StateVerifierStatus. +func (mr *MockFullNodeMockRecorder) StateVerifierStatus(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateVerifierStatus", reflect.TypeOf((*MockFullNode)(nil).StateVerifierStatus), arg0, arg1, arg2) +} + +// StateWaitMsg mocks base method. +func (m *MockFullNode) StateWaitMsg(arg0 context.Context, arg1 cid.Cid, arg2 uint64) (*chain.MsgLookup, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateWaitMsg", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain.MsgLookup) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateWaitMsg indicates an expected call of StateWaitMsg. +func (mr *MockFullNodeMockRecorder) StateWaitMsg(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateWaitMsg", reflect.TypeOf((*MockFullNode)(nil).StateWaitMsg), arg0, arg1, arg2) +} + +// StateWaitMsgLimited mocks base method. +func (m *MockFullNode) StateWaitMsgLimited(arg0 context.Context, arg1 cid.Cid, arg2 uint64, arg3 abi.ChainEpoch) (*chain.MsgLookup, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateWaitMsgLimited", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*chain.MsgLookup) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateWaitMsgLimited indicates an expected call of StateWaitMsgLimited. +func (mr *MockFullNodeMockRecorder) StateWaitMsgLimited(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateWaitMsgLimited", reflect.TypeOf((*MockFullNode)(nil).StateWaitMsgLimited), arg0, arg1, arg2, arg3) +} + +// SyncState mocks base method. +func (m *MockFullNode) SyncState(arg0 context.Context) (*chain.SyncState, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncState", arg0) + ret0, _ := ret[0].(*chain.SyncState) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SyncState indicates an expected call of SyncState. +func (mr *MockFullNodeMockRecorder) SyncState(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncState", reflect.TypeOf((*MockFullNode)(nil).SyncState), arg0) +} + +// SyncSubmitBlock mocks base method. +func (m *MockFullNode) SyncSubmitBlock(arg0 context.Context, arg1 *chain0.BlockMsg) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncSubmitBlock", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// SyncSubmitBlock indicates an expected call of SyncSubmitBlock. +func (mr *MockFullNodeMockRecorder) SyncSubmitBlock(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncSubmitBlock", reflect.TypeOf((*MockFullNode)(nil).SyncSubmitBlock), arg0, arg1) +} + +// SyncerTracker mocks base method. +func (m *MockFullNode) SyncerTracker(arg0 context.Context) *chain.TargetTracker { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncerTracker", arg0) + ret0, _ := ret[0].(*chain.TargetTracker) + return ret0 +} + +// SyncerTracker indicates an expected call of SyncerTracker. +func (mr *MockFullNodeMockRecorder) SyncerTracker(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncerTracker", reflect.TypeOf((*MockFullNode)(nil).SyncerTracker), arg0) +} + +// UnLockWallet mocks base method. +func (m *MockFullNode) UnLockWallet(arg0 context.Context, arg1 []byte) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UnLockWallet", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// UnLockWallet indicates an expected call of UnLockWallet. +func (mr *MockFullNodeMockRecorder) UnLockWallet(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnLockWallet", reflect.TypeOf((*MockFullNode)(nil).UnLockWallet), arg0, arg1) +} + +// Verify mocks base method. +func (m *MockFullNode) Verify(arg0 context.Context, arg1, arg2 string) ([]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Verify", arg0, arg1, arg2) + ret0, _ := ret[0].([]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Verify indicates an expected call of Verify. +func (mr *MockFullNodeMockRecorder) Verify(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Verify", reflect.TypeOf((*MockFullNode)(nil).Verify), arg0, arg1, arg2) +} + +// VerifyEntry mocks base method. +func (m *MockFullNode) VerifyEntry(arg0, arg1 *chain0.BeaconEntry, arg2 abi.ChainEpoch) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "VerifyEntry", arg0, arg1, arg2) + ret0, _ := ret[0].(bool) + return ret0 +} + +// VerifyEntry indicates an expected call of VerifyEntry. +func (mr *MockFullNodeMockRecorder) VerifyEntry(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "VerifyEntry", reflect.TypeOf((*MockFullNode)(nil).VerifyEntry), arg0, arg1, arg2) +} + +// Version mocks base method. +func (m *MockFullNode) Version(arg0 context.Context) (chain.Version, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Version", arg0) + ret0, _ := ret[0].(chain.Version) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Version indicates an expected call of Version. +func (mr *MockFullNodeMockRecorder) Version(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Version", reflect.TypeOf((*MockFullNode)(nil).Version), arg0) +} + +// WalletAddresses mocks base method. +func (m *MockFullNode) WalletAddresses(arg0 context.Context) []address.Address { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletAddresses", arg0) + ret0, _ := ret[0].([]address.Address) + return ret0 +} + +// WalletAddresses indicates an expected call of WalletAddresses. +func (mr *MockFullNodeMockRecorder) WalletAddresses(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletAddresses", reflect.TypeOf((*MockFullNode)(nil).WalletAddresses), arg0) +} + +// WalletBalance mocks base method. +func (m *MockFullNode) WalletBalance(arg0 context.Context, arg1 address.Address) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletBalance", arg0, arg1) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletBalance indicates an expected call of WalletBalance. +func (mr *MockFullNodeMockRecorder) WalletBalance(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletBalance", reflect.TypeOf((*MockFullNode)(nil).WalletBalance), arg0, arg1) +} + +// WalletDefaultAddress mocks base method. +func (m *MockFullNode) WalletDefaultAddress(arg0 context.Context) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletDefaultAddress", arg0) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletDefaultAddress indicates an expected call of WalletDefaultAddress. +func (mr *MockFullNodeMockRecorder) WalletDefaultAddress(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletDefaultAddress", reflect.TypeOf((*MockFullNode)(nil).WalletDefaultAddress), arg0) +} + +// WalletExport mocks base method. +func (m *MockFullNode) WalletExport(arg0 address.Address, arg1 string) (*wallet.KeyInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletExport", arg0, arg1) + ret0, _ := ret[0].(*wallet.KeyInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletExport indicates an expected call of WalletExport. +func (mr *MockFullNodeMockRecorder) WalletExport(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletExport", reflect.TypeOf((*MockFullNode)(nil).WalletExport), arg0, arg1) +} + +// WalletHas mocks base method. +func (m *MockFullNode) WalletHas(arg0 context.Context, arg1 address.Address) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletHas", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletHas indicates an expected call of WalletHas. +func (mr *MockFullNodeMockRecorder) WalletHas(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletHas", reflect.TypeOf((*MockFullNode)(nil).WalletHas), arg0, arg1) +} + +// WalletImport mocks base method. +func (m *MockFullNode) WalletImport(arg0 *wallet.KeyInfo) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletImport", arg0) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletImport indicates an expected call of WalletImport. +func (mr *MockFullNodeMockRecorder) WalletImport(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletImport", reflect.TypeOf((*MockFullNode)(nil).WalletImport), arg0) +} + +// WalletNewAddress mocks base method. +func (m *MockFullNode) WalletNewAddress(arg0 byte) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletNewAddress", arg0) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletNewAddress indicates an expected call of WalletNewAddress. +func (mr *MockFullNodeMockRecorder) WalletNewAddress(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletNewAddress", reflect.TypeOf((*MockFullNode)(nil).WalletNewAddress), arg0) +} + +// WalletSetDefault mocks base method. +func (m *MockFullNode) WalletSetDefault(arg0 context.Context, arg1 address.Address) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletSetDefault", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// WalletSetDefault indicates an expected call of WalletSetDefault. +func (mr *MockFullNodeMockRecorder) WalletSetDefault(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletSetDefault", reflect.TypeOf((*MockFullNode)(nil).WalletSetDefault), arg0, arg1) +} + +// WalletSign mocks base method. +func (m *MockFullNode) WalletSign(arg0 context.Context, arg1 address.Address, arg2 []byte, arg3 wallet.MsgMeta) (*crypto.Signature, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletSign", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*crypto.Signature) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletSign indicates an expected call of WalletSign. +func (mr *MockFullNodeMockRecorder) WalletSign(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletSign", reflect.TypeOf((*MockFullNode)(nil).WalletSign), arg0, arg1, arg2, arg3) +} + +// WalletSignMessage mocks base method. +func (m *MockFullNode) WalletSignMessage(arg0 context.Context, arg1 address.Address, arg2 *chain0.Message) (*chain0.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletSignMessage", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain0.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletSignMessage indicates an expected call of WalletSignMessage. +func (mr *MockFullNodeMockRecorder) WalletSignMessage(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletSignMessage", reflect.TypeOf((*MockFullNode)(nil).WalletSignMessage), arg0, arg1, arg2) +} + +// WalletState mocks base method. +func (m *MockFullNode) WalletState(arg0 context.Context) int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletState", arg0) + ret0, _ := ret[0].(int) + return ret0 +} + +// WalletState indicates an expected call of WalletState. +func (mr *MockFullNodeMockRecorder) WalletState(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletState", reflect.TypeOf((*MockFullNode)(nil).WalletState), arg0) +} diff --git a/venus-shared/api/chain/v1/fullnode.go b/venus-shared/api/chain/v1/fullnode.go index 031b07235e..25b7743348 100644 --- a/venus-shared/api/chain/v1/fullnode.go +++ b/venus-shared/api/chain/v1/fullnode.go @@ -13,6 +13,8 @@ TODO: */ package v1 +//go:generate go run github.com/golang/mock/mockgen@v1.6.0 -destination=./mock/full.go -package=mock . FullNode + type FullNode interface { IBlockStore IChain diff --git a/venus-shared/api/chain/v1/mock/full.go b/venus-shared/api/chain/v1/mock/full.go new file mode 100644 index 0000000000..c8d8646ad6 --- /dev/null +++ b/venus-shared/api/chain/v1/mock/full.go @@ -0,0 +1,2505 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/filecoin-project/venus/venus-shared/api/chain/v1 (interfaces: FullNode) + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + time "time" + + address "github.com/filecoin-project/go-address" + bitfield "github.com/filecoin-project/go-bitfield" + abi "github.com/filecoin-project/go-state-types/abi" + big "github.com/filecoin-project/go-state-types/big" + crypto "github.com/filecoin-project/go-state-types/crypto" + dline "github.com/filecoin-project/go-state-types/dline" + network "github.com/filecoin-project/go-state-types/network" + miner "github.com/filecoin-project/specs-actors/actors/builtin/miner" + paych "github.com/filecoin-project/specs-actors/actors/builtin/paych" + miner0 "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + chain "github.com/filecoin-project/venus/venus-shared/api/chain" + chain0 "github.com/filecoin-project/venus/venus-shared/chain" + net "github.com/filecoin-project/venus/venus-shared/libp2p/net" + messagepool "github.com/filecoin-project/venus/venus-shared/messagepool" + paych0 "github.com/filecoin-project/venus/venus-shared/paych" + wallet "github.com/filecoin-project/venus/venus-shared/wallet" + gomock "github.com/golang/mock/gomock" + cid "github.com/ipfs/go-cid" + metrics "github.com/libp2p/go-libp2p-core/metrics" + peer "github.com/libp2p/go-libp2p-core/peer" + multiaddr "github.com/multiformats/go-multiaddr" +) + +// MockFullNode is a mock of FullNode interface. +type MockFullNode struct { + ctrl *gomock.Controller + recorder *MockFullNodeMockRecorder +} + +// MockFullNodeMockRecorder is the mock recorder for MockFullNode. +type MockFullNodeMockRecorder struct { + mock *MockFullNode +} + +// NewMockFullNode creates a new mock instance. +func NewMockFullNode(ctrl *gomock.Controller) *MockFullNode { + mock := &MockFullNode{ctrl: ctrl} + mock.recorder = &MockFullNodeMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockFullNode) EXPECT() *MockFullNodeMockRecorder { + return m.recorder +} + +// AuthNew mocks base method. +func (m *MockFullNode) AuthNew(arg0 context.Context, arg1 []string) ([]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AuthNew", arg0, arg1) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AuthNew indicates an expected call of AuthNew. +func (mr *MockFullNodeMockRecorder) AuthNew(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AuthNew", reflect.TypeOf((*MockFullNode)(nil).AuthNew), arg0, arg1) +} + +// BeaconGetEntry mocks base method. +func (m *MockFullNode) BeaconGetEntry(arg0 context.Context, arg1 abi.ChainEpoch) (*chain0.BeaconEntry, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BeaconGetEntry", arg0, arg1) + ret0, _ := ret[0].(*chain0.BeaconEntry) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BeaconGetEntry indicates an expected call of BeaconGetEntry. +func (mr *MockFullNodeMockRecorder) BeaconGetEntry(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BeaconGetEntry", reflect.TypeOf((*MockFullNode)(nil).BeaconGetEntry), arg0, arg1) +} + +// BlockTime mocks base method. +func (m *MockFullNode) BlockTime(arg0 context.Context) time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BlockTime", arg0) + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// BlockTime indicates an expected call of BlockTime. +func (mr *MockFullNodeMockRecorder) BlockTime(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BlockTime", reflect.TypeOf((*MockFullNode)(nil).BlockTime), arg0) +} + +// ChainDeleteObj mocks base method. +func (m *MockFullNode) ChainDeleteObj(arg0 context.Context, arg1 cid.Cid) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainDeleteObj", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// ChainDeleteObj indicates an expected call of ChainDeleteObj. +func (mr *MockFullNodeMockRecorder) ChainDeleteObj(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainDeleteObj", reflect.TypeOf((*MockFullNode)(nil).ChainDeleteObj), arg0, arg1) +} + +// ChainExport mocks base method. +func (m *MockFullNode) ChainExport(arg0 context.Context, arg1 abi.ChainEpoch, arg2 bool, arg3 chain0.TipSetKey) (<-chan []byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainExport", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(<-chan []byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainExport indicates an expected call of ChainExport. +func (mr *MockFullNodeMockRecorder) ChainExport(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainExport", reflect.TypeOf((*MockFullNode)(nil).ChainExport), arg0, arg1, arg2, arg3) +} + +// ChainGetBlock mocks base method. +func (m *MockFullNode) ChainGetBlock(arg0 context.Context, arg1 cid.Cid) (*chain0.BlockHeader, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetBlock", arg0, arg1) + ret0, _ := ret[0].(*chain0.BlockHeader) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetBlock indicates an expected call of ChainGetBlock. +func (mr *MockFullNodeMockRecorder) ChainGetBlock(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetBlock", reflect.TypeOf((*MockFullNode)(nil).ChainGetBlock), arg0, arg1) +} + +// ChainGetBlockMessages mocks base method. +func (m *MockFullNode) ChainGetBlockMessages(arg0 context.Context, arg1 cid.Cid) (*chain.BlockMessages, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetBlockMessages", arg0, arg1) + ret0, _ := ret[0].(*chain.BlockMessages) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetBlockMessages indicates an expected call of ChainGetBlockMessages. +func (mr *MockFullNodeMockRecorder) ChainGetBlockMessages(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetBlockMessages", reflect.TypeOf((*MockFullNode)(nil).ChainGetBlockMessages), arg0, arg1) +} + +// ChainGetMessage mocks base method. +func (m *MockFullNode) ChainGetMessage(arg0 context.Context, arg1 cid.Cid) (*chain0.Message, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetMessage", arg0, arg1) + ret0, _ := ret[0].(*chain0.Message) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetMessage indicates an expected call of ChainGetMessage. +func (mr *MockFullNodeMockRecorder) ChainGetMessage(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetMessage", reflect.TypeOf((*MockFullNode)(nil).ChainGetMessage), arg0, arg1) +} + +// ChainGetMessagesInTipset mocks base method. +func (m *MockFullNode) ChainGetMessagesInTipset(arg0 context.Context, arg1 chain0.TipSetKey) ([]chain.Message, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetMessagesInTipset", arg0, arg1) + ret0, _ := ret[0].([]chain.Message) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetMessagesInTipset indicates an expected call of ChainGetMessagesInTipset. +func (mr *MockFullNodeMockRecorder) ChainGetMessagesInTipset(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetMessagesInTipset", reflect.TypeOf((*MockFullNode)(nil).ChainGetMessagesInTipset), arg0, arg1) +} + +// ChainGetParentMessages mocks base method. +func (m *MockFullNode) ChainGetParentMessages(arg0 context.Context, arg1 cid.Cid) ([]chain.Message, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetParentMessages", arg0, arg1) + ret0, _ := ret[0].([]chain.Message) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetParentMessages indicates an expected call of ChainGetParentMessages. +func (mr *MockFullNodeMockRecorder) ChainGetParentMessages(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetParentMessages", reflect.TypeOf((*MockFullNode)(nil).ChainGetParentMessages), arg0, arg1) +} + +// ChainGetParentReceipts mocks base method. +func (m *MockFullNode) ChainGetParentReceipts(arg0 context.Context, arg1 cid.Cid) ([]*chain0.MessageReceipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetParentReceipts", arg0, arg1) + ret0, _ := ret[0].([]*chain0.MessageReceipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetParentReceipts indicates an expected call of ChainGetParentReceipts. +func (mr *MockFullNodeMockRecorder) ChainGetParentReceipts(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetParentReceipts", reflect.TypeOf((*MockFullNode)(nil).ChainGetParentReceipts), arg0, arg1) +} + +// ChainGetPath mocks base method. +func (m *MockFullNode) ChainGetPath(arg0 context.Context, arg1, arg2 chain0.TipSetKey) ([]*chain.HeadChange, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetPath", arg0, arg1, arg2) + ret0, _ := ret[0].([]*chain.HeadChange) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetPath indicates an expected call of ChainGetPath. +func (mr *MockFullNodeMockRecorder) ChainGetPath(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetPath", reflect.TypeOf((*MockFullNode)(nil).ChainGetPath), arg0, arg1, arg2) +} + +// ChainGetRandomnessFromBeacon mocks base method. +func (m *MockFullNode) ChainGetRandomnessFromBeacon(arg0 context.Context, arg1 chain0.TipSetKey, arg2 crypto.DomainSeparationTag, arg3 abi.ChainEpoch, arg4 []byte) (abi.Randomness, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetRandomnessFromBeacon", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(abi.Randomness) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetRandomnessFromBeacon indicates an expected call of ChainGetRandomnessFromBeacon. +func (mr *MockFullNodeMockRecorder) ChainGetRandomnessFromBeacon(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetRandomnessFromBeacon", reflect.TypeOf((*MockFullNode)(nil).ChainGetRandomnessFromBeacon), arg0, arg1, arg2, arg3, arg4) +} + +// ChainGetRandomnessFromTickets mocks base method. +func (m *MockFullNode) ChainGetRandomnessFromTickets(arg0 context.Context, arg1 chain0.TipSetKey, arg2 crypto.DomainSeparationTag, arg3 abi.ChainEpoch, arg4 []byte) (abi.Randomness, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetRandomnessFromTickets", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(abi.Randomness) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetRandomnessFromTickets indicates an expected call of ChainGetRandomnessFromTickets. +func (mr *MockFullNodeMockRecorder) ChainGetRandomnessFromTickets(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetRandomnessFromTickets", reflect.TypeOf((*MockFullNode)(nil).ChainGetRandomnessFromTickets), arg0, arg1, arg2, arg3, arg4) +} + +// ChainGetReceipts mocks base method. +func (m *MockFullNode) ChainGetReceipts(arg0 context.Context, arg1 cid.Cid) ([]chain0.MessageReceipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetReceipts", arg0, arg1) + ret0, _ := ret[0].([]chain0.MessageReceipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetReceipts indicates an expected call of ChainGetReceipts. +func (mr *MockFullNodeMockRecorder) ChainGetReceipts(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetReceipts", reflect.TypeOf((*MockFullNode)(nil).ChainGetReceipts), arg0, arg1) +} + +// ChainGetTipSet mocks base method. +func (m *MockFullNode) ChainGetTipSet(arg0 context.Context, arg1 chain0.TipSetKey) (*chain0.TipSet, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetTipSet", arg0, arg1) + ret0, _ := ret[0].(*chain0.TipSet) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetTipSet indicates an expected call of ChainGetTipSet. +func (mr *MockFullNodeMockRecorder) ChainGetTipSet(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetTipSet", reflect.TypeOf((*MockFullNode)(nil).ChainGetTipSet), arg0, arg1) +} + +// ChainGetTipSetAfterHeight mocks base method. +func (m *MockFullNode) ChainGetTipSetAfterHeight(arg0 context.Context, arg1 abi.ChainEpoch, arg2 chain0.TipSetKey) (*chain0.TipSet, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetTipSetAfterHeight", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain0.TipSet) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetTipSetAfterHeight indicates an expected call of ChainGetTipSetAfterHeight. +func (mr *MockFullNodeMockRecorder) ChainGetTipSetAfterHeight(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetTipSetAfterHeight", reflect.TypeOf((*MockFullNode)(nil).ChainGetTipSetAfterHeight), arg0, arg1, arg2) +} + +// ChainGetTipSetByHeight mocks base method. +func (m *MockFullNode) ChainGetTipSetByHeight(arg0 context.Context, arg1 abi.ChainEpoch, arg2 chain0.TipSetKey) (*chain0.TipSet, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetTipSetByHeight", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain0.TipSet) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetTipSetByHeight indicates an expected call of ChainGetTipSetByHeight. +func (mr *MockFullNodeMockRecorder) ChainGetTipSetByHeight(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetTipSetByHeight", reflect.TypeOf((*MockFullNode)(nil).ChainGetTipSetByHeight), arg0, arg1, arg2) +} + +// ChainHasObj mocks base method. +func (m *MockFullNode) ChainHasObj(arg0 context.Context, arg1 cid.Cid) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainHasObj", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainHasObj indicates an expected call of ChainHasObj. +func (mr *MockFullNodeMockRecorder) ChainHasObj(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainHasObj", reflect.TypeOf((*MockFullNode)(nil).ChainHasObj), arg0, arg1) +} + +// ChainHead mocks base method. +func (m *MockFullNode) ChainHead(arg0 context.Context) (*chain0.TipSet, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainHead", arg0) + ret0, _ := ret[0].(*chain0.TipSet) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainHead indicates an expected call of ChainHead. +func (mr *MockFullNodeMockRecorder) ChainHead(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainHead", reflect.TypeOf((*MockFullNode)(nil).ChainHead), arg0) +} + +// ChainList mocks base method. +func (m *MockFullNode) ChainList(arg0 context.Context, arg1 chain0.TipSetKey, arg2 int) ([]chain0.TipSetKey, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainList", arg0, arg1, arg2) + ret0, _ := ret[0].([]chain0.TipSetKey) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainList indicates an expected call of ChainList. +func (mr *MockFullNodeMockRecorder) ChainList(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainList", reflect.TypeOf((*MockFullNode)(nil).ChainList), arg0, arg1, arg2) +} + +// ChainNotify mocks base method. +func (m *MockFullNode) ChainNotify(arg0 context.Context) (<-chan []*chain.HeadChange, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainNotify", arg0) + ret0, _ := ret[0].(<-chan []*chain.HeadChange) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainNotify indicates an expected call of ChainNotify. +func (mr *MockFullNodeMockRecorder) ChainNotify(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainNotify", reflect.TypeOf((*MockFullNode)(nil).ChainNotify), arg0) +} + +// ChainReadObj mocks base method. +func (m *MockFullNode) ChainReadObj(arg0 context.Context, arg1 cid.Cid) ([]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainReadObj", arg0, arg1) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainReadObj indicates an expected call of ChainReadObj. +func (mr *MockFullNodeMockRecorder) ChainReadObj(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainReadObj", reflect.TypeOf((*MockFullNode)(nil).ChainReadObj), arg0, arg1) +} + +// ChainSetHead mocks base method. +func (m *MockFullNode) ChainSetHead(arg0 context.Context, arg1 chain0.TipSetKey) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainSetHead", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// ChainSetHead indicates an expected call of ChainSetHead. +func (mr *MockFullNodeMockRecorder) ChainSetHead(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainSetHead", reflect.TypeOf((*MockFullNode)(nil).ChainSetHead), arg0, arg1) +} + +// ChainStatObj mocks base method. +func (m *MockFullNode) ChainStatObj(arg0 context.Context, arg1, arg2 cid.Cid) (chain.ObjStat, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainStatObj", arg0, arg1, arg2) + ret0, _ := ret[0].(chain.ObjStat) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainStatObj indicates an expected call of ChainStatObj. +func (mr *MockFullNodeMockRecorder) ChainStatObj(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainStatObj", reflect.TypeOf((*MockFullNode)(nil).ChainStatObj), arg0, arg1, arg2) +} + +// ChainSyncHandleNewTipSet mocks base method. +func (m *MockFullNode) ChainSyncHandleNewTipSet(arg0 context.Context, arg1 *chain0.ChainInfo) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainSyncHandleNewTipSet", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// ChainSyncHandleNewTipSet indicates an expected call of ChainSyncHandleNewTipSet. +func (mr *MockFullNodeMockRecorder) ChainSyncHandleNewTipSet(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainSyncHandleNewTipSet", reflect.TypeOf((*MockFullNode)(nil).ChainSyncHandleNewTipSet), arg0, arg1) +} + +// ChainTipSetWeight mocks base method. +func (m *MockFullNode) ChainTipSetWeight(arg0 context.Context, arg1 chain0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainTipSetWeight", arg0, arg1) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainTipSetWeight indicates an expected call of ChainTipSetWeight. +func (mr *MockFullNodeMockRecorder) ChainTipSetWeight(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainTipSetWeight", reflect.TypeOf((*MockFullNode)(nil).ChainTipSetWeight), arg0, arg1) +} + +// Concurrent mocks base method. +func (m *MockFullNode) Concurrent(arg0 context.Context) int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Concurrent", arg0) + ret0, _ := ret[0].(int64) + return ret0 +} + +// Concurrent indicates an expected call of Concurrent. +func (mr *MockFullNodeMockRecorder) Concurrent(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Concurrent", reflect.TypeOf((*MockFullNode)(nil).Concurrent), arg0) +} + +// GasBatchEstimateMessageGas mocks base method. +func (m *MockFullNode) GasBatchEstimateMessageGas(arg0 context.Context, arg1 []*chain.EstimateMessage, arg2 uint64, arg3 chain0.TipSetKey) ([]*chain.EstimateResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GasBatchEstimateMessageGas", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].([]*chain.EstimateResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GasBatchEstimateMessageGas indicates an expected call of GasBatchEstimateMessageGas. +func (mr *MockFullNodeMockRecorder) GasBatchEstimateMessageGas(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GasBatchEstimateMessageGas", reflect.TypeOf((*MockFullNode)(nil).GasBatchEstimateMessageGas), arg0, arg1, arg2, arg3) +} + +// GasEstimateFeeCap mocks base method. +func (m *MockFullNode) GasEstimateFeeCap(arg0 context.Context, arg1 *chain0.Message, arg2 int64, arg3 chain0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GasEstimateFeeCap", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GasEstimateFeeCap indicates an expected call of GasEstimateFeeCap. +func (mr *MockFullNodeMockRecorder) GasEstimateFeeCap(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GasEstimateFeeCap", reflect.TypeOf((*MockFullNode)(nil).GasEstimateFeeCap), arg0, arg1, arg2, arg3) +} + +// GasEstimateGasLimit mocks base method. +func (m *MockFullNode) GasEstimateGasLimit(arg0 context.Context, arg1 *chain0.Message, arg2 chain0.TipSetKey) (int64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GasEstimateGasLimit", arg0, arg1, arg2) + ret0, _ := ret[0].(int64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GasEstimateGasLimit indicates an expected call of GasEstimateGasLimit. +func (mr *MockFullNodeMockRecorder) GasEstimateGasLimit(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GasEstimateGasLimit", reflect.TypeOf((*MockFullNode)(nil).GasEstimateGasLimit), arg0, arg1, arg2) +} + +// GasEstimateGasPremium mocks base method. +func (m *MockFullNode) GasEstimateGasPremium(arg0 context.Context, arg1 uint64, arg2 address.Address, arg3 int64, arg4 chain0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GasEstimateGasPremium", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GasEstimateGasPremium indicates an expected call of GasEstimateGasPremium. +func (mr *MockFullNodeMockRecorder) GasEstimateGasPremium(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GasEstimateGasPremium", reflect.TypeOf((*MockFullNode)(nil).GasEstimateGasPremium), arg0, arg1, arg2, arg3, arg4) +} + +// GasEstimateMessageGas mocks base method. +func (m *MockFullNode) GasEstimateMessageGas(arg0 context.Context, arg1 *chain0.Message, arg2 *chain.MessageSendSpec, arg3 chain0.TipSetKey) (*chain0.Message, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GasEstimateMessageGas", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*chain0.Message) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GasEstimateMessageGas indicates an expected call of GasEstimateMessageGas. +func (mr *MockFullNodeMockRecorder) GasEstimateMessageGas(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GasEstimateMessageGas", reflect.TypeOf((*MockFullNode)(nil).GasEstimateMessageGas), arg0, arg1, arg2, arg3) +} + +// GetActor mocks base method. +func (m *MockFullNode) GetActor(arg0 context.Context, arg1 address.Address) (*chain0.Actor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetActor", arg0, arg1) + ret0, _ := ret[0].(*chain0.Actor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetActor indicates an expected call of GetActor. +func (mr *MockFullNodeMockRecorder) GetActor(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetActor", reflect.TypeOf((*MockFullNode)(nil).GetActor), arg0, arg1) +} + +// GetEntry mocks base method. +func (m *MockFullNode) GetEntry(arg0 context.Context, arg1 abi.ChainEpoch, arg2 uint64) (*chain0.BeaconEntry, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetEntry", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain0.BeaconEntry) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetEntry indicates an expected call of GetEntry. +func (mr *MockFullNodeMockRecorder) GetEntry(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEntry", reflect.TypeOf((*MockFullNode)(nil).GetEntry), arg0, arg1, arg2) +} + +// GetFullBlock mocks base method. +func (m *MockFullNode) GetFullBlock(arg0 context.Context, arg1 cid.Cid) (*chain0.FullBlock, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetFullBlock", arg0, arg1) + ret0, _ := ret[0].(*chain0.FullBlock) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetFullBlock indicates an expected call of GetFullBlock. +func (mr *MockFullNodeMockRecorder) GetFullBlock(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetFullBlock", reflect.TypeOf((*MockFullNode)(nil).GetFullBlock), arg0, arg1) +} + +// GetParentStateRootActor mocks base method. +func (m *MockFullNode) GetParentStateRootActor(arg0 context.Context, arg1 *chain0.TipSet, arg2 address.Address) (*chain0.Actor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetParentStateRootActor", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain0.Actor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetParentStateRootActor indicates an expected call of GetParentStateRootActor. +func (mr *MockFullNodeMockRecorder) GetParentStateRootActor(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetParentStateRootActor", reflect.TypeOf((*MockFullNode)(nil).GetParentStateRootActor), arg0, arg1, arg2) +} + +// HasPassword mocks base method. +func (m *MockFullNode) HasPassword(arg0 context.Context) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HasPassword", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// HasPassword indicates an expected call of HasPassword. +func (mr *MockFullNodeMockRecorder) HasPassword(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasPassword", reflect.TypeOf((*MockFullNode)(nil).HasPassword), arg0) +} + +// ListActor mocks base method. +func (m *MockFullNode) ListActor(arg0 context.Context) (map[address.Address]*chain0.Actor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListActor", arg0) + ret0, _ := ret[0].(map[address.Address]*chain0.Actor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListActor indicates an expected call of ListActor. +func (mr *MockFullNodeMockRecorder) ListActor(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListActor", reflect.TypeOf((*MockFullNode)(nil).ListActor), arg0) +} + +// LockWallet mocks base method. +func (m *MockFullNode) LockWallet(arg0 context.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LockWallet", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// LockWallet indicates an expected call of LockWallet. +func (mr *MockFullNodeMockRecorder) LockWallet(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LockWallet", reflect.TypeOf((*MockFullNode)(nil).LockWallet), arg0) +} + +// MessageWait mocks base method. +func (m *MockFullNode) MessageWait(arg0 context.Context, arg1 cid.Cid, arg2, arg3 abi.ChainEpoch) (*chain.ChainMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MessageWait", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*chain.ChainMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MessageWait indicates an expected call of MessageWait. +func (mr *MockFullNodeMockRecorder) MessageWait(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MessageWait", reflect.TypeOf((*MockFullNode)(nil).MessageWait), arg0, arg1, arg2, arg3) +} + +// MinerCreateBlock mocks base method. +func (m *MockFullNode) MinerCreateBlock(arg0 context.Context, arg1 *chain.BlockTemplate) (*chain0.BlockMsg, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MinerCreateBlock", arg0, arg1) + ret0, _ := ret[0].(*chain0.BlockMsg) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MinerCreateBlock indicates an expected call of MinerCreateBlock. +func (mr *MockFullNodeMockRecorder) MinerCreateBlock(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MinerCreateBlock", reflect.TypeOf((*MockFullNode)(nil).MinerCreateBlock), arg0, arg1) +} + +// MinerGetBaseInfo mocks base method. +func (m *MockFullNode) MinerGetBaseInfo(arg0 context.Context, arg1 address.Address, arg2 abi.ChainEpoch, arg3 chain0.TipSetKey) (*chain.MiningBaseInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MinerGetBaseInfo", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*chain.MiningBaseInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MinerGetBaseInfo indicates an expected call of MinerGetBaseInfo. +func (mr *MockFullNodeMockRecorder) MinerGetBaseInfo(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MinerGetBaseInfo", reflect.TypeOf((*MockFullNode)(nil).MinerGetBaseInfo), arg0, arg1, arg2, arg3) +} + +// MpoolBatchPush mocks base method. +func (m *MockFullNode) MpoolBatchPush(arg0 context.Context, arg1 []*chain0.SignedMessage) ([]cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolBatchPush", arg0, arg1) + ret0, _ := ret[0].([]cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolBatchPush indicates an expected call of MpoolBatchPush. +func (mr *MockFullNodeMockRecorder) MpoolBatchPush(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolBatchPush", reflect.TypeOf((*MockFullNode)(nil).MpoolBatchPush), arg0, arg1) +} + +// MpoolBatchPushMessage mocks base method. +func (m *MockFullNode) MpoolBatchPushMessage(arg0 context.Context, arg1 []*chain0.Message, arg2 *chain.MessageSendSpec) ([]*chain0.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolBatchPushMessage", arg0, arg1, arg2) + ret0, _ := ret[0].([]*chain0.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolBatchPushMessage indicates an expected call of MpoolBatchPushMessage. +func (mr *MockFullNodeMockRecorder) MpoolBatchPushMessage(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolBatchPushMessage", reflect.TypeOf((*MockFullNode)(nil).MpoolBatchPushMessage), arg0, arg1, arg2) +} + +// MpoolBatchPushUntrusted mocks base method. +func (m *MockFullNode) MpoolBatchPushUntrusted(arg0 context.Context, arg1 []*chain0.SignedMessage) ([]cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolBatchPushUntrusted", arg0, arg1) + ret0, _ := ret[0].([]cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolBatchPushUntrusted indicates an expected call of MpoolBatchPushUntrusted. +func (mr *MockFullNodeMockRecorder) MpoolBatchPushUntrusted(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolBatchPushUntrusted", reflect.TypeOf((*MockFullNode)(nil).MpoolBatchPushUntrusted), arg0, arg1) +} + +// MpoolCheckMessages mocks base method. +func (m *MockFullNode) MpoolCheckMessages(arg0 context.Context, arg1 []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolCheckMessages", arg0, arg1) + ret0, _ := ret[0].([][]messagepool.MessageCheckStatus) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolCheckMessages indicates an expected call of MpoolCheckMessages. +func (mr *MockFullNodeMockRecorder) MpoolCheckMessages(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolCheckMessages", reflect.TypeOf((*MockFullNode)(nil).MpoolCheckMessages), arg0, arg1) +} + +// MpoolCheckPendingMessages mocks base method. +func (m *MockFullNode) MpoolCheckPendingMessages(arg0 context.Context, arg1 address.Address) ([][]messagepool.MessageCheckStatus, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolCheckPendingMessages", arg0, arg1) + ret0, _ := ret[0].([][]messagepool.MessageCheckStatus) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolCheckPendingMessages indicates an expected call of MpoolCheckPendingMessages. +func (mr *MockFullNodeMockRecorder) MpoolCheckPendingMessages(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolCheckPendingMessages", reflect.TypeOf((*MockFullNode)(nil).MpoolCheckPendingMessages), arg0, arg1) +} + +// MpoolCheckReplaceMessages mocks base method. +func (m *MockFullNode) MpoolCheckReplaceMessages(arg0 context.Context, arg1 []*chain0.Message) ([][]messagepool.MessageCheckStatus, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolCheckReplaceMessages", arg0, arg1) + ret0, _ := ret[0].([][]messagepool.MessageCheckStatus) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolCheckReplaceMessages indicates an expected call of MpoolCheckReplaceMessages. +func (mr *MockFullNodeMockRecorder) MpoolCheckReplaceMessages(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolCheckReplaceMessages", reflect.TypeOf((*MockFullNode)(nil).MpoolCheckReplaceMessages), arg0, arg1) +} + +// MpoolClear mocks base method. +func (m *MockFullNode) MpoolClear(arg0 context.Context, arg1 bool) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolClear", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// MpoolClear indicates an expected call of MpoolClear. +func (mr *MockFullNodeMockRecorder) MpoolClear(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolClear", reflect.TypeOf((*MockFullNode)(nil).MpoolClear), arg0, arg1) +} + +// MpoolDeleteByAdress mocks base method. +func (m *MockFullNode) MpoolDeleteByAdress(arg0 context.Context, arg1 address.Address) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolDeleteByAdress", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// MpoolDeleteByAdress indicates an expected call of MpoolDeleteByAdress. +func (mr *MockFullNodeMockRecorder) MpoolDeleteByAdress(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolDeleteByAdress", reflect.TypeOf((*MockFullNode)(nil).MpoolDeleteByAdress), arg0, arg1) +} + +// MpoolGetConfig mocks base method. +func (m *MockFullNode) MpoolGetConfig(arg0 context.Context) (*messagepool.MpoolConfig, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolGetConfig", arg0) + ret0, _ := ret[0].(*messagepool.MpoolConfig) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolGetConfig indicates an expected call of MpoolGetConfig. +func (mr *MockFullNodeMockRecorder) MpoolGetConfig(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolGetConfig", reflect.TypeOf((*MockFullNode)(nil).MpoolGetConfig), arg0) +} + +// MpoolGetNonce mocks base method. +func (m *MockFullNode) MpoolGetNonce(arg0 context.Context, arg1 address.Address) (uint64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolGetNonce", arg0, arg1) + ret0, _ := ret[0].(uint64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolGetNonce indicates an expected call of MpoolGetNonce. +func (mr *MockFullNodeMockRecorder) MpoolGetNonce(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolGetNonce", reflect.TypeOf((*MockFullNode)(nil).MpoolGetNonce), arg0, arg1) +} + +// MpoolPending mocks base method. +func (m *MockFullNode) MpoolPending(arg0 context.Context, arg1 chain0.TipSetKey) ([]*chain0.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolPending", arg0, arg1) + ret0, _ := ret[0].([]*chain0.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolPending indicates an expected call of MpoolPending. +func (mr *MockFullNodeMockRecorder) MpoolPending(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPending", reflect.TypeOf((*MockFullNode)(nil).MpoolPending), arg0, arg1) +} + +// MpoolPublishByAddr mocks base method. +func (m *MockFullNode) MpoolPublishByAddr(arg0 context.Context, arg1 address.Address) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolPublishByAddr", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// MpoolPublishByAddr indicates an expected call of MpoolPublishByAddr. +func (mr *MockFullNodeMockRecorder) MpoolPublishByAddr(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPublishByAddr", reflect.TypeOf((*MockFullNode)(nil).MpoolPublishByAddr), arg0, arg1) +} + +// MpoolPublishMessage mocks base method. +func (m *MockFullNode) MpoolPublishMessage(arg0 context.Context, arg1 *chain0.SignedMessage) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolPublishMessage", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// MpoolPublishMessage indicates an expected call of MpoolPublishMessage. +func (mr *MockFullNodeMockRecorder) MpoolPublishMessage(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPublishMessage", reflect.TypeOf((*MockFullNode)(nil).MpoolPublishMessage), arg0, arg1) +} + +// MpoolPush mocks base method. +func (m *MockFullNode) MpoolPush(arg0 context.Context, arg1 *chain0.SignedMessage) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolPush", arg0, arg1) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolPush indicates an expected call of MpoolPush. +func (mr *MockFullNodeMockRecorder) MpoolPush(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPush", reflect.TypeOf((*MockFullNode)(nil).MpoolPush), arg0, arg1) +} + +// MpoolPushMessage mocks base method. +func (m *MockFullNode) MpoolPushMessage(arg0 context.Context, arg1 *chain0.Message, arg2 *chain.MessageSendSpec) (*chain0.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolPushMessage", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain0.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolPushMessage indicates an expected call of MpoolPushMessage. +func (mr *MockFullNodeMockRecorder) MpoolPushMessage(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPushMessage", reflect.TypeOf((*MockFullNode)(nil).MpoolPushMessage), arg0, arg1, arg2) +} + +// MpoolPushUntrusted mocks base method. +func (m *MockFullNode) MpoolPushUntrusted(arg0 context.Context, arg1 *chain0.SignedMessage) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolPushUntrusted", arg0, arg1) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolPushUntrusted indicates an expected call of MpoolPushUntrusted. +func (mr *MockFullNodeMockRecorder) MpoolPushUntrusted(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPushUntrusted", reflect.TypeOf((*MockFullNode)(nil).MpoolPushUntrusted), arg0, arg1) +} + +// MpoolSelect mocks base method. +func (m *MockFullNode) MpoolSelect(arg0 context.Context, arg1 chain0.TipSetKey, arg2 float64) ([]*chain0.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolSelect", arg0, arg1, arg2) + ret0, _ := ret[0].([]*chain0.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolSelect indicates an expected call of MpoolSelect. +func (mr *MockFullNodeMockRecorder) MpoolSelect(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolSelect", reflect.TypeOf((*MockFullNode)(nil).MpoolSelect), arg0, arg1, arg2) +} + +// MpoolSelects mocks base method. +func (m *MockFullNode) MpoolSelects(arg0 context.Context, arg1 chain0.TipSetKey, arg2 []float64) ([][]*chain0.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolSelects", arg0, arg1, arg2) + ret0, _ := ret[0].([][]*chain0.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolSelects indicates an expected call of MpoolSelects. +func (mr *MockFullNodeMockRecorder) MpoolSelects(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolSelects", reflect.TypeOf((*MockFullNode)(nil).MpoolSelects), arg0, arg1, arg2) +} + +// MpoolSetConfig mocks base method. +func (m *MockFullNode) MpoolSetConfig(arg0 context.Context, arg1 *messagepool.MpoolConfig) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolSetConfig", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// MpoolSetConfig indicates an expected call of MpoolSetConfig. +func (mr *MockFullNodeMockRecorder) MpoolSetConfig(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolSetConfig", reflect.TypeOf((*MockFullNode)(nil).MpoolSetConfig), arg0, arg1) +} + +// MpoolSub mocks base method. +func (m *MockFullNode) MpoolSub(arg0 context.Context) (<-chan messagepool.MpoolUpdate, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolSub", arg0) + ret0, _ := ret[0].(<-chan messagepool.MpoolUpdate) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolSub indicates an expected call of MpoolSub. +func (mr *MockFullNodeMockRecorder) MpoolSub(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolSub", reflect.TypeOf((*MockFullNode)(nil).MpoolSub), arg0) +} + +// MsigAddApprove mocks base method. +func (m *MockFullNode) MsigAddApprove(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5 address.Address, arg6 bool) (*messagepool.MessagePrototype, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigAddApprove", arg0, arg1, arg2, arg3, arg4, arg5, arg6) + ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigAddApprove indicates an expected call of MsigAddApprove. +func (mr *MockFullNodeMockRecorder) MsigAddApprove(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigAddApprove", reflect.TypeOf((*MockFullNode)(nil).MsigAddApprove), arg0, arg1, arg2, arg3, arg4, arg5, arg6) +} + +// MsigAddCancel mocks base method. +func (m *MockFullNode) MsigAddCancel(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4 address.Address, arg5 bool) (*messagepool.MessagePrototype, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigAddCancel", arg0, arg1, arg2, arg3, arg4, arg5) + ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigAddCancel indicates an expected call of MsigAddCancel. +func (mr *MockFullNodeMockRecorder) MsigAddCancel(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigAddCancel", reflect.TypeOf((*MockFullNode)(nil).MsigAddCancel), arg0, arg1, arg2, arg3, arg4, arg5) +} + +// MsigAddPropose mocks base method. +func (m *MockFullNode) MsigAddPropose(arg0 context.Context, arg1, arg2, arg3 address.Address, arg4 bool) (*messagepool.MessagePrototype, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigAddPropose", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigAddPropose indicates an expected call of MsigAddPropose. +func (mr *MockFullNodeMockRecorder) MsigAddPropose(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigAddPropose", reflect.TypeOf((*MockFullNode)(nil).MsigAddPropose), arg0, arg1, arg2, arg3, arg4) +} + +// MsigApprove mocks base method. +func (m *MockFullNode) MsigApprove(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address) (*messagepool.MessagePrototype, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigApprove", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigApprove indicates an expected call of MsigApprove. +func (mr *MockFullNodeMockRecorder) MsigApprove(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigApprove", reflect.TypeOf((*MockFullNode)(nil).MsigApprove), arg0, arg1, arg2, arg3) +} + +// MsigApproveTxnHash mocks base method. +func (m *MockFullNode) MsigApproveTxnHash(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3, arg4 address.Address, arg5 big.Int, arg6 address.Address, arg7 uint64, arg8 []byte) (*messagepool.MessagePrototype, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigApproveTxnHash", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) + ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigApproveTxnHash indicates an expected call of MsigApproveTxnHash. +func (mr *MockFullNodeMockRecorder) MsigApproveTxnHash(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigApproveTxnHash", reflect.TypeOf((*MockFullNode)(nil).MsigApproveTxnHash), arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) +} + +// MsigCancel mocks base method. +func (m *MockFullNode) MsigCancel(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address, arg4 big.Int, arg5 address.Address, arg6 uint64, arg7 []byte) (*messagepool.MessagePrototype, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigCancel", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) + ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigCancel indicates an expected call of MsigCancel. +func (mr *MockFullNodeMockRecorder) MsigCancel(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigCancel", reflect.TypeOf((*MockFullNode)(nil).MsigCancel), arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) +} + +// MsigCreate mocks base method. +func (m *MockFullNode) MsigCreate(arg0 context.Context, arg1 uint64, arg2 []address.Address, arg3 abi.ChainEpoch, arg4 big.Int, arg5 address.Address, arg6 big.Int) (*messagepool.MessagePrototype, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigCreate", arg0, arg1, arg2, arg3, arg4, arg5, arg6) + ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigCreate indicates an expected call of MsigCreate. +func (mr *MockFullNodeMockRecorder) MsigCreate(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigCreate", reflect.TypeOf((*MockFullNode)(nil).MsigCreate), arg0, arg1, arg2, arg3, arg4, arg5, arg6) +} + +// MsigGetVested mocks base method. +func (m *MockFullNode) MsigGetVested(arg0 context.Context, arg1 address.Address, arg2, arg3 chain0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigGetVested", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigGetVested indicates an expected call of MsigGetVested. +func (mr *MockFullNodeMockRecorder) MsigGetVested(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigGetVested", reflect.TypeOf((*MockFullNode)(nil).MsigGetVested), arg0, arg1, arg2, arg3) +} + +// MsigPropose mocks base method. +func (m *MockFullNode) MsigPropose(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int, arg4 address.Address, arg5 uint64, arg6 []byte) (*messagepool.MessagePrototype, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigPropose", arg0, arg1, arg2, arg3, arg4, arg5, arg6) + ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigPropose indicates an expected call of MsigPropose. +func (mr *MockFullNodeMockRecorder) MsigPropose(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigPropose", reflect.TypeOf((*MockFullNode)(nil).MsigPropose), arg0, arg1, arg2, arg3, arg4, arg5, arg6) +} + +// MsigRemoveSigner mocks base method. +func (m *MockFullNode) MsigRemoveSigner(arg0 context.Context, arg1, arg2, arg3 address.Address, arg4 bool) (*messagepool.MessagePrototype, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigRemoveSigner", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigRemoveSigner indicates an expected call of MsigRemoveSigner. +func (mr *MockFullNodeMockRecorder) MsigRemoveSigner(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigRemoveSigner", reflect.TypeOf((*MockFullNode)(nil).MsigRemoveSigner), arg0, arg1, arg2, arg3, arg4) +} + +// MsigSwapApprove mocks base method. +func (m *MockFullNode) MsigSwapApprove(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5, arg6 address.Address) (*messagepool.MessagePrototype, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigSwapApprove", arg0, arg1, arg2, arg3, arg4, arg5, arg6) + ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigSwapApprove indicates an expected call of MsigSwapApprove. +func (mr *MockFullNodeMockRecorder) MsigSwapApprove(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigSwapApprove", reflect.TypeOf((*MockFullNode)(nil).MsigSwapApprove), arg0, arg1, arg2, arg3, arg4, arg5, arg6) +} + +// MsigSwapCancel mocks base method. +func (m *MockFullNode) MsigSwapCancel(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5 address.Address) (*messagepool.MessagePrototype, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigSwapCancel", arg0, arg1, arg2, arg3, arg4, arg5) + ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigSwapCancel indicates an expected call of MsigSwapCancel. +func (mr *MockFullNodeMockRecorder) MsigSwapCancel(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigSwapCancel", reflect.TypeOf((*MockFullNode)(nil).MsigSwapCancel), arg0, arg1, arg2, arg3, arg4, arg5) +} + +// MsigSwapPropose mocks base method. +func (m *MockFullNode) MsigSwapPropose(arg0 context.Context, arg1, arg2, arg3, arg4 address.Address) (*messagepool.MessagePrototype, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigSwapPropose", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigSwapPropose indicates an expected call of MsigSwapPropose. +func (mr *MockFullNodeMockRecorder) MsigSwapPropose(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigSwapPropose", reflect.TypeOf((*MockFullNode)(nil).MsigSwapPropose), arg0, arg1, arg2, arg3, arg4) +} + +// NetAddrsListen mocks base method. +func (m *MockFullNode) NetAddrsListen(arg0 context.Context) (peer.AddrInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetAddrsListen", arg0) + ret0, _ := ret[0].(peer.AddrInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetAddrsListen indicates an expected call of NetAddrsListen. +func (mr *MockFullNodeMockRecorder) NetAddrsListen(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetAddrsListen", reflect.TypeOf((*MockFullNode)(nil).NetAddrsListen), arg0) +} + +// NetworkConnect mocks base method. +func (m *MockFullNode) NetworkConnect(arg0 context.Context, arg1 []string) (<-chan net.ConnectionResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetworkConnect", arg0, arg1) + ret0, _ := ret[0].(<-chan net.ConnectionResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetworkConnect indicates an expected call of NetworkConnect. +func (mr *MockFullNodeMockRecorder) NetworkConnect(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkConnect", reflect.TypeOf((*MockFullNode)(nil).NetworkConnect), arg0, arg1) +} + +// NetworkFindPeer mocks base method. +func (m *MockFullNode) NetworkFindPeer(arg0 context.Context, arg1 peer.ID) (peer.AddrInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetworkFindPeer", arg0, arg1) + ret0, _ := ret[0].(peer.AddrInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetworkFindPeer indicates an expected call of NetworkFindPeer. +func (mr *MockFullNodeMockRecorder) NetworkFindPeer(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkFindPeer", reflect.TypeOf((*MockFullNode)(nil).NetworkFindPeer), arg0, arg1) +} + +// NetworkFindProvidersAsync mocks base method. +func (m *MockFullNode) NetworkFindProvidersAsync(arg0 context.Context, arg1 cid.Cid, arg2 int) <-chan peer.AddrInfo { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetworkFindProvidersAsync", arg0, arg1, arg2) + ret0, _ := ret[0].(<-chan peer.AddrInfo) + return ret0 +} + +// NetworkFindProvidersAsync indicates an expected call of NetworkFindProvidersAsync. +func (mr *MockFullNodeMockRecorder) NetworkFindProvidersAsync(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkFindProvidersAsync", reflect.TypeOf((*MockFullNode)(nil).NetworkFindProvidersAsync), arg0, arg1, arg2) +} + +// NetworkGetBandwidthStats mocks base method. +func (m *MockFullNode) NetworkGetBandwidthStats(arg0 context.Context) metrics.Stats { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetworkGetBandwidthStats", arg0) + ret0, _ := ret[0].(metrics.Stats) + return ret0 +} + +// NetworkGetBandwidthStats indicates an expected call of NetworkGetBandwidthStats. +func (mr *MockFullNodeMockRecorder) NetworkGetBandwidthStats(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkGetBandwidthStats", reflect.TypeOf((*MockFullNode)(nil).NetworkGetBandwidthStats), arg0) +} + +// NetworkGetClosestPeers mocks base method. +func (m *MockFullNode) NetworkGetClosestPeers(arg0 context.Context, arg1 string) (<-chan peer.ID, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetworkGetClosestPeers", arg0, arg1) + ret0, _ := ret[0].(<-chan peer.ID) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetworkGetClosestPeers indicates an expected call of NetworkGetClosestPeers. +func (mr *MockFullNodeMockRecorder) NetworkGetClosestPeers(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkGetClosestPeers", reflect.TypeOf((*MockFullNode)(nil).NetworkGetClosestPeers), arg0, arg1) +} + +// NetworkGetPeerAddresses mocks base method. +func (m *MockFullNode) NetworkGetPeerAddresses(arg0 context.Context) []multiaddr.Multiaddr { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetworkGetPeerAddresses", arg0) + ret0, _ := ret[0].([]multiaddr.Multiaddr) + return ret0 +} + +// NetworkGetPeerAddresses indicates an expected call of NetworkGetPeerAddresses. +func (mr *MockFullNodeMockRecorder) NetworkGetPeerAddresses(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkGetPeerAddresses", reflect.TypeOf((*MockFullNode)(nil).NetworkGetPeerAddresses), arg0) +} + +// NetworkGetPeerID mocks base method. +func (m *MockFullNode) NetworkGetPeerID(arg0 context.Context) peer.ID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetworkGetPeerID", arg0) + ret0, _ := ret[0].(peer.ID) + return ret0 +} + +// NetworkGetPeerID indicates an expected call of NetworkGetPeerID. +func (mr *MockFullNodeMockRecorder) NetworkGetPeerID(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkGetPeerID", reflect.TypeOf((*MockFullNode)(nil).NetworkGetPeerID), arg0) +} + +// NetworkPeers mocks base method. +func (m *MockFullNode) NetworkPeers(arg0 context.Context, arg1, arg2, arg3 bool) (*net.SwarmConnInfos, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetworkPeers", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*net.SwarmConnInfos) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetworkPeers indicates an expected call of NetworkPeers. +func (mr *MockFullNodeMockRecorder) NetworkPeers(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkPeers", reflect.TypeOf((*MockFullNode)(nil).NetworkPeers), arg0, arg1, arg2, arg3) +} + +// PaychAllocateLane mocks base method. +func (m *MockFullNode) PaychAllocateLane(arg0 context.Context, arg1 address.Address) (uint64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychAllocateLane", arg0, arg1) + ret0, _ := ret[0].(uint64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychAllocateLane indicates an expected call of PaychAllocateLane. +func (mr *MockFullNodeMockRecorder) PaychAllocateLane(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychAllocateLane", reflect.TypeOf((*MockFullNode)(nil).PaychAllocateLane), arg0, arg1) +} + +// PaychAvailableFunds mocks base method. +func (m *MockFullNode) PaychAvailableFunds(arg0 context.Context, arg1 address.Address) (*chain.ChannelAvailableFunds, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychAvailableFunds", arg0, arg1) + ret0, _ := ret[0].(*chain.ChannelAvailableFunds) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychAvailableFunds indicates an expected call of PaychAvailableFunds. +func (mr *MockFullNodeMockRecorder) PaychAvailableFunds(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychAvailableFunds", reflect.TypeOf((*MockFullNode)(nil).PaychAvailableFunds), arg0, arg1) +} + +// PaychAvailableFundsByFromTo mocks base method. +func (m *MockFullNode) PaychAvailableFundsByFromTo(arg0 context.Context, arg1, arg2 address.Address) (*chain.ChannelAvailableFunds, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychAvailableFundsByFromTo", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain.ChannelAvailableFunds) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychAvailableFundsByFromTo indicates an expected call of PaychAvailableFundsByFromTo. +func (mr *MockFullNodeMockRecorder) PaychAvailableFundsByFromTo(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychAvailableFundsByFromTo", reflect.TypeOf((*MockFullNode)(nil).PaychAvailableFundsByFromTo), arg0, arg1, arg2) +} + +// PaychCollect mocks base method. +func (m *MockFullNode) PaychCollect(arg0 context.Context, arg1 address.Address) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychCollect", arg0, arg1) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychCollect indicates an expected call of PaychCollect. +func (mr *MockFullNodeMockRecorder) PaychCollect(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychCollect", reflect.TypeOf((*MockFullNode)(nil).PaychCollect), arg0, arg1) +} + +// PaychGet mocks base method. +func (m *MockFullNode) PaychGet(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int) (*paych0.ChannelInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychGet", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*paych0.ChannelInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychGet indicates an expected call of PaychGet. +func (mr *MockFullNodeMockRecorder) PaychGet(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychGet", reflect.TypeOf((*MockFullNode)(nil).PaychGet), arg0, arg1, arg2, arg3) +} + +// PaychGetWaitReady mocks base method. +func (m *MockFullNode) PaychGetWaitReady(arg0 context.Context, arg1 cid.Cid) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychGetWaitReady", arg0, arg1) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychGetWaitReady indicates an expected call of PaychGetWaitReady. +func (mr *MockFullNodeMockRecorder) PaychGetWaitReady(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychGetWaitReady", reflect.TypeOf((*MockFullNode)(nil).PaychGetWaitReady), arg0, arg1) +} + +// PaychList mocks base method. +func (m *MockFullNode) PaychList(arg0 context.Context) ([]address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychList", arg0) + ret0, _ := ret[0].([]address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychList indicates an expected call of PaychList. +func (mr *MockFullNodeMockRecorder) PaychList(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychList", reflect.TypeOf((*MockFullNode)(nil).PaychList), arg0) +} + +// PaychNewPayment mocks base method. +func (m *MockFullNode) PaychNewPayment(arg0 context.Context, arg1, arg2 address.Address, arg3 []paych0.VoucherSpec) (*paych0.PaymentInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychNewPayment", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*paych0.PaymentInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychNewPayment indicates an expected call of PaychNewPayment. +func (mr *MockFullNodeMockRecorder) PaychNewPayment(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychNewPayment", reflect.TypeOf((*MockFullNode)(nil).PaychNewPayment), arg0, arg1, arg2, arg3) +} + +// PaychSettle mocks base method. +func (m *MockFullNode) PaychSettle(arg0 context.Context, arg1 address.Address) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychSettle", arg0, arg1) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychSettle indicates an expected call of PaychSettle. +func (mr *MockFullNodeMockRecorder) PaychSettle(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychSettle", reflect.TypeOf((*MockFullNode)(nil).PaychSettle), arg0, arg1) +} + +// PaychStatus mocks base method. +func (m *MockFullNode) PaychStatus(arg0 context.Context, arg1 address.Address) (*paych0.Status, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychStatus", arg0, arg1) + ret0, _ := ret[0].(*paych0.Status) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychStatus indicates an expected call of PaychStatus. +func (mr *MockFullNodeMockRecorder) PaychStatus(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychStatus", reflect.TypeOf((*MockFullNode)(nil).PaychStatus), arg0, arg1) +} + +// PaychVoucherAdd mocks base method. +func (m *MockFullNode) PaychVoucherAdd(arg0 context.Context, arg1 address.Address, arg2 *paych.SignedVoucher, arg3 []byte, arg4 big.Int) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherAdd", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychVoucherAdd indicates an expected call of PaychVoucherAdd. +func (mr *MockFullNodeMockRecorder) PaychVoucherAdd(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherAdd", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherAdd), arg0, arg1, arg2, arg3, arg4) +} + +// PaychVoucherCheckSpendable mocks base method. +func (m *MockFullNode) PaychVoucherCheckSpendable(arg0 context.Context, arg1 address.Address, arg2 *paych.SignedVoucher, arg3, arg4 []byte) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherCheckSpendable", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychVoucherCheckSpendable indicates an expected call of PaychVoucherCheckSpendable. +func (mr *MockFullNodeMockRecorder) PaychVoucherCheckSpendable(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherCheckSpendable", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherCheckSpendable), arg0, arg1, arg2, arg3, arg4) +} + +// PaychVoucherCheckValid mocks base method. +func (m *MockFullNode) PaychVoucherCheckValid(arg0 context.Context, arg1 address.Address, arg2 *paych.SignedVoucher) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherCheckValid", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// PaychVoucherCheckValid indicates an expected call of PaychVoucherCheckValid. +func (mr *MockFullNodeMockRecorder) PaychVoucherCheckValid(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherCheckValid", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherCheckValid), arg0, arg1, arg2) +} + +// PaychVoucherCreate mocks base method. +func (m *MockFullNode) PaychVoucherCreate(arg0 context.Context, arg1 address.Address, arg2 big.Int, arg3 uint64) (*paych0.VoucherCreateResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherCreate", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*paych0.VoucherCreateResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychVoucherCreate indicates an expected call of PaychVoucherCreate. +func (mr *MockFullNodeMockRecorder) PaychVoucherCreate(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherCreate", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherCreate), arg0, arg1, arg2, arg3) +} + +// PaychVoucherList mocks base method. +func (m *MockFullNode) PaychVoucherList(arg0 context.Context, arg1 address.Address) ([]*paych.SignedVoucher, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherList", arg0, arg1) + ret0, _ := ret[0].([]*paych.SignedVoucher) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychVoucherList indicates an expected call of PaychVoucherList. +func (mr *MockFullNodeMockRecorder) PaychVoucherList(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherList", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherList), arg0, arg1) +} + +// PaychVoucherSubmit mocks base method. +func (m *MockFullNode) PaychVoucherSubmit(arg0 context.Context, arg1 address.Address, arg2 *paych.SignedVoucher, arg3, arg4 []byte) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherSubmit", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychVoucherSubmit indicates an expected call of PaychVoucherSubmit. +func (mr *MockFullNodeMockRecorder) PaychVoucherSubmit(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherSubmit", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherSubmit), arg0, arg1, arg2, arg3, arg4) +} + +// ProtocolParameters mocks base method. +func (m *MockFullNode) ProtocolParameters(arg0 context.Context) (*chain.ProtocolParams, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ProtocolParameters", arg0) + ret0, _ := ret[0].(*chain.ProtocolParams) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ProtocolParameters indicates an expected call of ProtocolParameters. +func (mr *MockFullNodeMockRecorder) ProtocolParameters(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ProtocolParameters", reflect.TypeOf((*MockFullNode)(nil).ProtocolParameters), arg0) +} + +// ResolveToKeyAddr mocks base method. +func (m *MockFullNode) ResolveToKeyAddr(arg0 context.Context, arg1 address.Address, arg2 *chain0.TipSet) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ResolveToKeyAddr", arg0, arg1, arg2) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ResolveToKeyAddr indicates an expected call of ResolveToKeyAddr. +func (mr *MockFullNodeMockRecorder) ResolveToKeyAddr(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResolveToKeyAddr", reflect.TypeOf((*MockFullNode)(nil).ResolveToKeyAddr), arg0, arg1, arg2) +} + +// SetConcurrent mocks base method. +func (m *MockFullNode) SetConcurrent(arg0 context.Context, arg1 int64) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetConcurrent", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetConcurrent indicates an expected call of SetConcurrent. +func (mr *MockFullNodeMockRecorder) SetConcurrent(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetConcurrent", reflect.TypeOf((*MockFullNode)(nil).SetConcurrent), arg0, arg1) +} + +// SetPassword mocks base method. +func (m *MockFullNode) SetPassword(arg0 context.Context, arg1 []byte) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetPassword", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetPassword indicates an expected call of SetPassword. +func (mr *MockFullNodeMockRecorder) SetPassword(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetPassword", reflect.TypeOf((*MockFullNode)(nil).SetPassword), arg0, arg1) +} + +// StateAccountKey mocks base method. +func (m *MockFullNode) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateAccountKey", arg0, arg1, arg2) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateAccountKey indicates an expected call of StateAccountKey. +func (mr *MockFullNodeMockRecorder) StateAccountKey(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateAccountKey", reflect.TypeOf((*MockFullNode)(nil).StateAccountKey), arg0, arg1, arg2) +} + +// StateCall mocks base method. +func (m *MockFullNode) StateCall(arg0 context.Context, arg1 *chain0.Message, arg2 chain0.TipSetKey) (*chain.InvocResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateCall", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain.InvocResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateCall indicates an expected call of StateCall. +func (mr *MockFullNodeMockRecorder) StateCall(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateCall", reflect.TypeOf((*MockFullNode)(nil).StateCall), arg0, arg1, arg2) +} + +// StateCirculatingSupply mocks base method. +func (m *MockFullNode) StateCirculatingSupply(arg0 context.Context, arg1 chain0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateCirculatingSupply", arg0, arg1) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateCirculatingSupply indicates an expected call of StateCirculatingSupply. +func (mr *MockFullNodeMockRecorder) StateCirculatingSupply(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateCirculatingSupply", reflect.TypeOf((*MockFullNode)(nil).StateCirculatingSupply), arg0, arg1) +} + +// StateDealProviderCollateralBounds mocks base method. +func (m *MockFullNode) StateDealProviderCollateralBounds(arg0 context.Context, arg1 abi.PaddedPieceSize, arg2 bool, arg3 chain0.TipSetKey) (chain.DealCollateralBounds, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateDealProviderCollateralBounds", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(chain.DealCollateralBounds) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateDealProviderCollateralBounds indicates an expected call of StateDealProviderCollateralBounds. +func (mr *MockFullNodeMockRecorder) StateDealProviderCollateralBounds(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateDealProviderCollateralBounds", reflect.TypeOf((*MockFullNode)(nil).StateDealProviderCollateralBounds), arg0, arg1, arg2, arg3) +} + +// StateGetActor mocks base method. +func (m *MockFullNode) StateGetActor(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*chain0.Actor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateGetActor", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain0.Actor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateGetActor indicates an expected call of StateGetActor. +func (mr *MockFullNodeMockRecorder) StateGetActor(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetActor", reflect.TypeOf((*MockFullNode)(nil).StateGetActor), arg0, arg1, arg2) +} + +// StateGetRandomnessFromBeacon mocks base method. +func (m *MockFullNode) StateGetRandomnessFromBeacon(arg0 context.Context, arg1 crypto.DomainSeparationTag, arg2 abi.ChainEpoch, arg3 []byte, arg4 chain0.TipSetKey) (abi.Randomness, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateGetRandomnessFromBeacon", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(abi.Randomness) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateGetRandomnessFromBeacon indicates an expected call of StateGetRandomnessFromBeacon. +func (mr *MockFullNodeMockRecorder) StateGetRandomnessFromBeacon(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetRandomnessFromBeacon", reflect.TypeOf((*MockFullNode)(nil).StateGetRandomnessFromBeacon), arg0, arg1, arg2, arg3, arg4) +} + +// StateGetRandomnessFromTickets mocks base method. +func (m *MockFullNode) StateGetRandomnessFromTickets(arg0 context.Context, arg1 crypto.DomainSeparationTag, arg2 abi.ChainEpoch, arg3 []byte, arg4 chain0.TipSetKey) (abi.Randomness, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateGetRandomnessFromTickets", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(abi.Randomness) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateGetRandomnessFromTickets indicates an expected call of StateGetRandomnessFromTickets. +func (mr *MockFullNodeMockRecorder) StateGetRandomnessFromTickets(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetRandomnessFromTickets", reflect.TypeOf((*MockFullNode)(nil).StateGetRandomnessFromTickets), arg0, arg1, arg2, arg3, arg4) +} + +// StateListActors mocks base method. +func (m *MockFullNode) StateListActors(arg0 context.Context, arg1 chain0.TipSetKey) ([]address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateListActors", arg0, arg1) + ret0, _ := ret[0].([]address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateListActors indicates an expected call of StateListActors. +func (mr *MockFullNodeMockRecorder) StateListActors(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateListActors", reflect.TypeOf((*MockFullNode)(nil).StateListActors), arg0, arg1) +} + +// StateListMiners mocks base method. +func (m *MockFullNode) StateListMiners(arg0 context.Context, arg1 chain0.TipSetKey) ([]address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateListMiners", arg0, arg1) + ret0, _ := ret[0].([]address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateListMiners indicates an expected call of StateListMiners. +func (mr *MockFullNodeMockRecorder) StateListMiners(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateListMiners", reflect.TypeOf((*MockFullNode)(nil).StateListMiners), arg0, arg1) +} + +// StateLookupID mocks base method. +func (m *MockFullNode) StateLookupID(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateLookupID", arg0, arg1, arg2) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateLookupID indicates an expected call of StateLookupID. +func (mr *MockFullNodeMockRecorder) StateLookupID(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateLookupID", reflect.TypeOf((*MockFullNode)(nil).StateLookupID), arg0, arg1, arg2) +} + +// StateMarketBalance mocks base method. +func (m *MockFullNode) StateMarketBalance(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (chain.MarketBalance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMarketBalance", arg0, arg1, arg2) + ret0, _ := ret[0].(chain.MarketBalance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMarketBalance indicates an expected call of StateMarketBalance. +func (mr *MockFullNodeMockRecorder) StateMarketBalance(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMarketBalance", reflect.TypeOf((*MockFullNode)(nil).StateMarketBalance), arg0, arg1, arg2) +} + +// StateMarketDeals mocks base method. +func (m *MockFullNode) StateMarketDeals(arg0 context.Context, arg1 chain0.TipSetKey) (map[string]chain.MarketDeal, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMarketDeals", arg0, arg1) + ret0, _ := ret[0].(map[string]chain.MarketDeal) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMarketDeals indicates an expected call of StateMarketDeals. +func (mr *MockFullNodeMockRecorder) StateMarketDeals(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMarketDeals", reflect.TypeOf((*MockFullNode)(nil).StateMarketDeals), arg0, arg1) +} + +// StateMarketParticipants mocks base method. +func (m *MockFullNode) StateMarketParticipants(arg0 context.Context, arg1 chain0.TipSetKey) (map[string]chain.MarketBalance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMarketParticipants", arg0, arg1) + ret0, _ := ret[0].(map[string]chain.MarketBalance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMarketParticipants indicates an expected call of StateMarketParticipants. +func (mr *MockFullNodeMockRecorder) StateMarketParticipants(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMarketParticipants", reflect.TypeOf((*MockFullNode)(nil).StateMarketParticipants), arg0, arg1) +} + +// StateMarketStorageDeal mocks base method. +func (m *MockFullNode) StateMarketStorageDeal(arg0 context.Context, arg1 abi.DealID, arg2 chain0.TipSetKey) (*chain.MarketDeal, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMarketStorageDeal", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain.MarketDeal) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMarketStorageDeal indicates an expected call of StateMarketStorageDeal. +func (mr *MockFullNodeMockRecorder) StateMarketStorageDeal(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMarketStorageDeal", reflect.TypeOf((*MockFullNode)(nil).StateMarketStorageDeal), arg0, arg1, arg2) +} + +// StateMinerActiveSectors mocks base method. +func (m *MockFullNode) StateMinerActiveSectors(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) ([]*miner0.SectorOnChainInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerActiveSectors", arg0, arg1, arg2) + ret0, _ := ret[0].([]*miner0.SectorOnChainInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerActiveSectors indicates an expected call of StateMinerActiveSectors. +func (mr *MockFullNodeMockRecorder) StateMinerActiveSectors(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerActiveSectors", reflect.TypeOf((*MockFullNode)(nil).StateMinerActiveSectors), arg0, arg1, arg2) +} + +// StateMinerAvailableBalance mocks base method. +func (m *MockFullNode) StateMinerAvailableBalance(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerAvailableBalance", arg0, arg1, arg2) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerAvailableBalance indicates an expected call of StateMinerAvailableBalance. +func (mr *MockFullNodeMockRecorder) StateMinerAvailableBalance(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerAvailableBalance", reflect.TypeOf((*MockFullNode)(nil).StateMinerAvailableBalance), arg0, arg1, arg2) +} + +// StateMinerDeadlines mocks base method. +func (m *MockFullNode) StateMinerDeadlines(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) ([]chain.Deadline, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerDeadlines", arg0, arg1, arg2) + ret0, _ := ret[0].([]chain.Deadline) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerDeadlines indicates an expected call of StateMinerDeadlines. +func (mr *MockFullNodeMockRecorder) StateMinerDeadlines(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerDeadlines", reflect.TypeOf((*MockFullNode)(nil).StateMinerDeadlines), arg0, arg1, arg2) +} + +// StateMinerFaults mocks base method. +func (m *MockFullNode) StateMinerFaults(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (bitfield.BitField, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerFaults", arg0, arg1, arg2) + ret0, _ := ret[0].(bitfield.BitField) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerFaults indicates an expected call of StateMinerFaults. +func (mr *MockFullNodeMockRecorder) StateMinerFaults(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerFaults", reflect.TypeOf((*MockFullNode)(nil).StateMinerFaults), arg0, arg1, arg2) +} + +// StateMinerInfo mocks base method. +func (m *MockFullNode) StateMinerInfo(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (miner0.MinerInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerInfo", arg0, arg1, arg2) + ret0, _ := ret[0].(miner0.MinerInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerInfo indicates an expected call of StateMinerInfo. +func (mr *MockFullNodeMockRecorder) StateMinerInfo(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerInfo", reflect.TypeOf((*MockFullNode)(nil).StateMinerInfo), arg0, arg1, arg2) +} + +// StateMinerInitialPledgeCollateral mocks base method. +func (m *MockFullNode) StateMinerInitialPledgeCollateral(arg0 context.Context, arg1 address.Address, arg2 miner.SectorPreCommitInfo, arg3 chain0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerInitialPledgeCollateral", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerInitialPledgeCollateral indicates an expected call of StateMinerInitialPledgeCollateral. +func (mr *MockFullNodeMockRecorder) StateMinerInitialPledgeCollateral(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerInitialPledgeCollateral", reflect.TypeOf((*MockFullNode)(nil).StateMinerInitialPledgeCollateral), arg0, arg1, arg2, arg3) +} + +// StateMinerPartitions mocks base method. +func (m *MockFullNode) StateMinerPartitions(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 chain0.TipSetKey) ([]chain.Partition, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerPartitions", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].([]chain.Partition) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerPartitions indicates an expected call of StateMinerPartitions. +func (mr *MockFullNodeMockRecorder) StateMinerPartitions(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerPartitions", reflect.TypeOf((*MockFullNode)(nil).StateMinerPartitions), arg0, arg1, arg2, arg3) +} + +// StateMinerPower mocks base method. +func (m *MockFullNode) StateMinerPower(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*chain.MinerPower, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerPower", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain.MinerPower) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerPower indicates an expected call of StateMinerPower. +func (mr *MockFullNodeMockRecorder) StateMinerPower(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerPower", reflect.TypeOf((*MockFullNode)(nil).StateMinerPower), arg0, arg1, arg2) +} + +// StateMinerPreCommitDepositForPower mocks base method. +func (m *MockFullNode) StateMinerPreCommitDepositForPower(arg0 context.Context, arg1 address.Address, arg2 miner.SectorPreCommitInfo, arg3 chain0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerPreCommitDepositForPower", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerPreCommitDepositForPower indicates an expected call of StateMinerPreCommitDepositForPower. +func (mr *MockFullNodeMockRecorder) StateMinerPreCommitDepositForPower(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerPreCommitDepositForPower", reflect.TypeOf((*MockFullNode)(nil).StateMinerPreCommitDepositForPower), arg0, arg1, arg2, arg3) +} + +// StateMinerProvingDeadline mocks base method. +func (m *MockFullNode) StateMinerProvingDeadline(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*dline.Info, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerProvingDeadline", arg0, arg1, arg2) + ret0, _ := ret[0].(*dline.Info) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerProvingDeadline indicates an expected call of StateMinerProvingDeadline. +func (mr *MockFullNodeMockRecorder) StateMinerProvingDeadline(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerProvingDeadline", reflect.TypeOf((*MockFullNode)(nil).StateMinerProvingDeadline), arg0, arg1, arg2) +} + +// StateMinerRecoveries mocks base method. +func (m *MockFullNode) StateMinerRecoveries(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (bitfield.BitField, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerRecoveries", arg0, arg1, arg2) + ret0, _ := ret[0].(bitfield.BitField) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerRecoveries indicates an expected call of StateMinerRecoveries. +func (mr *MockFullNodeMockRecorder) StateMinerRecoveries(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerRecoveries", reflect.TypeOf((*MockFullNode)(nil).StateMinerRecoveries), arg0, arg1, arg2) +} + +// StateMinerSectorAllocated mocks base method. +func (m *MockFullNode) StateMinerSectorAllocated(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerSectorAllocated", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerSectorAllocated indicates an expected call of StateMinerSectorAllocated. +func (mr *MockFullNodeMockRecorder) StateMinerSectorAllocated(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerSectorAllocated", reflect.TypeOf((*MockFullNode)(nil).StateMinerSectorAllocated), arg0, arg1, arg2, arg3) +} + +// StateMinerSectorCount mocks base method. +func (m *MockFullNode) StateMinerSectorCount(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (chain.MinerSectors, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerSectorCount", arg0, arg1, arg2) + ret0, _ := ret[0].(chain.MinerSectors) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerSectorCount indicates an expected call of StateMinerSectorCount. +func (mr *MockFullNodeMockRecorder) StateMinerSectorCount(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerSectorCount", reflect.TypeOf((*MockFullNode)(nil).StateMinerSectorCount), arg0, arg1, arg2) +} + +// StateMinerSectorSize mocks base method. +func (m *MockFullNode) StateMinerSectorSize(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (abi.SectorSize, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerSectorSize", arg0, arg1, arg2) + ret0, _ := ret[0].(abi.SectorSize) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerSectorSize indicates an expected call of StateMinerSectorSize. +func (mr *MockFullNodeMockRecorder) StateMinerSectorSize(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerSectorSize", reflect.TypeOf((*MockFullNode)(nil).StateMinerSectorSize), arg0, arg1, arg2) +} + +// StateMinerSectors mocks base method. +func (m *MockFullNode) StateMinerSectors(arg0 context.Context, arg1 address.Address, arg2 *bitfield.BitField, arg3 chain0.TipSetKey) ([]*miner0.SectorOnChainInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerSectors", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].([]*miner0.SectorOnChainInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerSectors indicates an expected call of StateMinerSectors. +func (mr *MockFullNodeMockRecorder) StateMinerSectors(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerSectors", reflect.TypeOf((*MockFullNode)(nil).StateMinerSectors), arg0, arg1, arg2, arg3) +} + +// StateMinerWorkerAddress mocks base method. +func (m *MockFullNode) StateMinerWorkerAddress(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerWorkerAddress", arg0, arg1, arg2) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerWorkerAddress indicates an expected call of StateMinerWorkerAddress. +func (mr *MockFullNodeMockRecorder) StateMinerWorkerAddress(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerWorkerAddress", reflect.TypeOf((*MockFullNode)(nil).StateMinerWorkerAddress), arg0, arg1, arg2) +} + +// StateNetworkName mocks base method. +func (m *MockFullNode) StateNetworkName(arg0 context.Context) (chain.NetworkName, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateNetworkName", arg0) + ret0, _ := ret[0].(chain.NetworkName) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateNetworkName indicates an expected call of StateNetworkName. +func (mr *MockFullNodeMockRecorder) StateNetworkName(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateNetworkName", reflect.TypeOf((*MockFullNode)(nil).StateNetworkName), arg0) +} + +// StateNetworkVersion mocks base method. +func (m *MockFullNode) StateNetworkVersion(arg0 context.Context, arg1 chain0.TipSetKey) (network.Version, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateNetworkVersion", arg0, arg1) + ret0, _ := ret[0].(network.Version) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateNetworkVersion indicates an expected call of StateNetworkVersion. +func (mr *MockFullNodeMockRecorder) StateNetworkVersion(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateNetworkVersion", reflect.TypeOf((*MockFullNode)(nil).StateNetworkVersion), arg0, arg1) +} + +// StateSearchMsg mocks base method. +func (m *MockFullNode) StateSearchMsg(arg0 context.Context, arg1 chain0.TipSetKey, arg2 cid.Cid, arg3 abi.ChainEpoch, arg4 bool) (*chain.MsgLookup, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSearchMsg", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(*chain.MsgLookup) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSearchMsg indicates an expected call of StateSearchMsg. +func (mr *MockFullNodeMockRecorder) StateSearchMsg(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSearchMsg", reflect.TypeOf((*MockFullNode)(nil).StateSearchMsg), arg0, arg1, arg2, arg3, arg4) +} + +// StateSectorExpiration mocks base method. +func (m *MockFullNode) StateSectorExpiration(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (*miner0.SectorExpiration, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSectorExpiration", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*miner0.SectorExpiration) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSectorExpiration indicates an expected call of StateSectorExpiration. +func (mr *MockFullNodeMockRecorder) StateSectorExpiration(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSectorExpiration", reflect.TypeOf((*MockFullNode)(nil).StateSectorExpiration), arg0, arg1, arg2, arg3) +} + +// StateSectorGetInfo mocks base method. +func (m *MockFullNode) StateSectorGetInfo(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (*miner0.SectorOnChainInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSectorGetInfo", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*miner0.SectorOnChainInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSectorGetInfo indicates an expected call of StateSectorGetInfo. +func (mr *MockFullNodeMockRecorder) StateSectorGetInfo(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSectorGetInfo", reflect.TypeOf((*MockFullNode)(nil).StateSectorGetInfo), arg0, arg1, arg2, arg3) +} + +// StateSectorPartition mocks base method. +func (m *MockFullNode) StateSectorPartition(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (*miner0.SectorLocation, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSectorPartition", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*miner0.SectorLocation) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSectorPartition indicates an expected call of StateSectorPartition. +func (mr *MockFullNodeMockRecorder) StateSectorPartition(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSectorPartition", reflect.TypeOf((*MockFullNode)(nil).StateSectorPartition), arg0, arg1, arg2, arg3) +} + +// StateSectorPreCommitInfo mocks base method. +func (m *MockFullNode) StateSectorPreCommitInfo(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (miner0.SectorPreCommitOnChainInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSectorPreCommitInfo", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(miner0.SectorPreCommitOnChainInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSectorPreCommitInfo indicates an expected call of StateSectorPreCommitInfo. +func (mr *MockFullNodeMockRecorder) StateSectorPreCommitInfo(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSectorPreCommitInfo", reflect.TypeOf((*MockFullNode)(nil).StateSectorPreCommitInfo), arg0, arg1, arg2, arg3) +} + +// StateVMCirculatingSupplyInternal mocks base method. +func (m *MockFullNode) StateVMCirculatingSupplyInternal(arg0 context.Context, arg1 chain0.TipSetKey) (chain0.CirculatingSupply, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateVMCirculatingSupplyInternal", arg0, arg1) + ret0, _ := ret[0].(chain0.CirculatingSupply) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateVMCirculatingSupplyInternal indicates an expected call of StateVMCirculatingSupplyInternal. +func (mr *MockFullNodeMockRecorder) StateVMCirculatingSupplyInternal(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateVMCirculatingSupplyInternal", reflect.TypeOf((*MockFullNode)(nil).StateVMCirculatingSupplyInternal), arg0, arg1) +} + +// StateVerifiedClientStatus mocks base method. +func (m *MockFullNode) StateVerifiedClientStatus(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateVerifiedClientStatus", arg0, arg1, arg2) + ret0, _ := ret[0].(*big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateVerifiedClientStatus indicates an expected call of StateVerifiedClientStatus. +func (mr *MockFullNodeMockRecorder) StateVerifiedClientStatus(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateVerifiedClientStatus", reflect.TypeOf((*MockFullNode)(nil).StateVerifiedClientStatus), arg0, arg1, arg2) +} + +// StateVerifiedRegistryRootKey mocks base method. +func (m *MockFullNode) StateVerifiedRegistryRootKey(arg0 context.Context, arg1 chain0.TipSetKey) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateVerifiedRegistryRootKey", arg0, arg1) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateVerifiedRegistryRootKey indicates an expected call of StateVerifiedRegistryRootKey. +func (mr *MockFullNodeMockRecorder) StateVerifiedRegistryRootKey(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateVerifiedRegistryRootKey", reflect.TypeOf((*MockFullNode)(nil).StateVerifiedRegistryRootKey), arg0, arg1) +} + +// StateVerifierStatus mocks base method. +func (m *MockFullNode) StateVerifierStatus(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateVerifierStatus", arg0, arg1, arg2) + ret0, _ := ret[0].(*big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateVerifierStatus indicates an expected call of StateVerifierStatus. +func (mr *MockFullNodeMockRecorder) StateVerifierStatus(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateVerifierStatus", reflect.TypeOf((*MockFullNode)(nil).StateVerifierStatus), arg0, arg1, arg2) +} + +// StateWaitMsg mocks base method. +func (m *MockFullNode) StateWaitMsg(arg0 context.Context, arg1 cid.Cid, arg2 uint64, arg3 abi.ChainEpoch, arg4 bool) (*chain.MsgLookup, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateWaitMsg", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(*chain.MsgLookup) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateWaitMsg indicates an expected call of StateWaitMsg. +func (mr *MockFullNodeMockRecorder) StateWaitMsg(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateWaitMsg", reflect.TypeOf((*MockFullNode)(nil).StateWaitMsg), arg0, arg1, arg2, arg3, arg4) +} + +// SyncState mocks base method. +func (m *MockFullNode) SyncState(arg0 context.Context) (*chain.SyncState, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncState", arg0) + ret0, _ := ret[0].(*chain.SyncState) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SyncState indicates an expected call of SyncState. +func (mr *MockFullNodeMockRecorder) SyncState(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncState", reflect.TypeOf((*MockFullNode)(nil).SyncState), arg0) +} + +// SyncSubmitBlock mocks base method. +func (m *MockFullNode) SyncSubmitBlock(arg0 context.Context, arg1 *chain0.BlockMsg) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncSubmitBlock", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// SyncSubmitBlock indicates an expected call of SyncSubmitBlock. +func (mr *MockFullNodeMockRecorder) SyncSubmitBlock(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncSubmitBlock", reflect.TypeOf((*MockFullNode)(nil).SyncSubmitBlock), arg0, arg1) +} + +// SyncerTracker mocks base method. +func (m *MockFullNode) SyncerTracker(arg0 context.Context) *chain.TargetTracker { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncerTracker", arg0) + ret0, _ := ret[0].(*chain.TargetTracker) + return ret0 +} + +// SyncerTracker indicates an expected call of SyncerTracker. +func (mr *MockFullNodeMockRecorder) SyncerTracker(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncerTracker", reflect.TypeOf((*MockFullNode)(nil).SyncerTracker), arg0) +} + +// UnLockWallet mocks base method. +func (m *MockFullNode) UnLockWallet(arg0 context.Context, arg1 []byte) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UnLockWallet", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// UnLockWallet indicates an expected call of UnLockWallet. +func (mr *MockFullNodeMockRecorder) UnLockWallet(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnLockWallet", reflect.TypeOf((*MockFullNode)(nil).UnLockWallet), arg0, arg1) +} + +// Verify mocks base method. +func (m *MockFullNode) Verify(arg0 context.Context, arg1, arg2 string) ([]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Verify", arg0, arg1, arg2) + ret0, _ := ret[0].([]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Verify indicates an expected call of Verify. +func (mr *MockFullNodeMockRecorder) Verify(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Verify", reflect.TypeOf((*MockFullNode)(nil).Verify), arg0, arg1, arg2) +} + +// VerifyEntry mocks base method. +func (m *MockFullNode) VerifyEntry(arg0, arg1 *chain0.BeaconEntry, arg2 abi.ChainEpoch) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "VerifyEntry", arg0, arg1, arg2) + ret0, _ := ret[0].(bool) + return ret0 +} + +// VerifyEntry indicates an expected call of VerifyEntry. +func (mr *MockFullNodeMockRecorder) VerifyEntry(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "VerifyEntry", reflect.TypeOf((*MockFullNode)(nil).VerifyEntry), arg0, arg1, arg2) +} + +// Version mocks base method. +func (m *MockFullNode) Version(arg0 context.Context) (chain.Version, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Version", arg0) + ret0, _ := ret[0].(chain.Version) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Version indicates an expected call of Version. +func (mr *MockFullNodeMockRecorder) Version(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Version", reflect.TypeOf((*MockFullNode)(nil).Version), arg0) +} + +// WalletAddresses mocks base method. +func (m *MockFullNode) WalletAddresses(arg0 context.Context) []address.Address { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletAddresses", arg0) + ret0, _ := ret[0].([]address.Address) + return ret0 +} + +// WalletAddresses indicates an expected call of WalletAddresses. +func (mr *MockFullNodeMockRecorder) WalletAddresses(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletAddresses", reflect.TypeOf((*MockFullNode)(nil).WalletAddresses), arg0) +} + +// WalletBalance mocks base method. +func (m *MockFullNode) WalletBalance(arg0 context.Context, arg1 address.Address) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletBalance", arg0, arg1) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletBalance indicates an expected call of WalletBalance. +func (mr *MockFullNodeMockRecorder) WalletBalance(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletBalance", reflect.TypeOf((*MockFullNode)(nil).WalletBalance), arg0, arg1) +} + +// WalletDefaultAddress mocks base method. +func (m *MockFullNode) WalletDefaultAddress(arg0 context.Context) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletDefaultAddress", arg0) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletDefaultAddress indicates an expected call of WalletDefaultAddress. +func (mr *MockFullNodeMockRecorder) WalletDefaultAddress(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletDefaultAddress", reflect.TypeOf((*MockFullNode)(nil).WalletDefaultAddress), arg0) +} + +// WalletExport mocks base method. +func (m *MockFullNode) WalletExport(arg0 address.Address, arg1 string) (*wallet.KeyInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletExport", arg0, arg1) + ret0, _ := ret[0].(*wallet.KeyInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletExport indicates an expected call of WalletExport. +func (mr *MockFullNodeMockRecorder) WalletExport(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletExport", reflect.TypeOf((*MockFullNode)(nil).WalletExport), arg0, arg1) +} + +// WalletHas mocks base method. +func (m *MockFullNode) WalletHas(arg0 context.Context, arg1 address.Address) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletHas", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletHas indicates an expected call of WalletHas. +func (mr *MockFullNodeMockRecorder) WalletHas(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletHas", reflect.TypeOf((*MockFullNode)(nil).WalletHas), arg0, arg1) +} + +// WalletImport mocks base method. +func (m *MockFullNode) WalletImport(arg0 *wallet.KeyInfo) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletImport", arg0) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletImport indicates an expected call of WalletImport. +func (mr *MockFullNodeMockRecorder) WalletImport(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletImport", reflect.TypeOf((*MockFullNode)(nil).WalletImport), arg0) +} + +// WalletNewAddress mocks base method. +func (m *MockFullNode) WalletNewAddress(arg0 byte) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletNewAddress", arg0) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletNewAddress indicates an expected call of WalletNewAddress. +func (mr *MockFullNodeMockRecorder) WalletNewAddress(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletNewAddress", reflect.TypeOf((*MockFullNode)(nil).WalletNewAddress), arg0) +} + +// WalletSetDefault mocks base method. +func (m *MockFullNode) WalletSetDefault(arg0 context.Context, arg1 address.Address) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletSetDefault", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// WalletSetDefault indicates an expected call of WalletSetDefault. +func (mr *MockFullNodeMockRecorder) WalletSetDefault(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletSetDefault", reflect.TypeOf((*MockFullNode)(nil).WalletSetDefault), arg0, arg1) +} + +// WalletSign mocks base method. +func (m *MockFullNode) WalletSign(arg0 context.Context, arg1 address.Address, arg2 []byte, arg3 wallet.MsgMeta) (*crypto.Signature, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletSign", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*crypto.Signature) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletSign indicates an expected call of WalletSign. +func (mr *MockFullNodeMockRecorder) WalletSign(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletSign", reflect.TypeOf((*MockFullNode)(nil).WalletSign), arg0, arg1, arg2, arg3) +} + +// WalletSignMessage mocks base method. +func (m *MockFullNode) WalletSignMessage(arg0 context.Context, arg1 address.Address, arg2 *chain0.Message) (*chain0.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletSignMessage", arg0, arg1, arg2) + ret0, _ := ret[0].(*chain0.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletSignMessage indicates an expected call of WalletSignMessage. +func (mr *MockFullNodeMockRecorder) WalletSignMessage(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletSignMessage", reflect.TypeOf((*MockFullNode)(nil).WalletSignMessage), arg0, arg1, arg2) +} + +// WalletState mocks base method. +func (m *MockFullNode) WalletState(arg0 context.Context) int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletState", arg0) + ret0, _ := ret[0].(int) + return ret0 +} + +// WalletState indicates an expected call of WalletState. +func (mr *MockFullNodeMockRecorder) WalletState(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletState", reflect.TypeOf((*MockFullNode)(nil).WalletState), arg0) +} diff --git a/venus-shared/go.mod b/venus-shared/go.mod index 44f611b05b..afbb17811d 100644 --- a/venus-shared/go.mod +++ b/venus-shared/go.mod @@ -15,6 +15,7 @@ require ( github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec + github.com/golang/mock v1.6.0 github.com/ipfs/go-block-format v0.0.3 github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-ipld-cbor v0.0.5 @@ -30,6 +31,4 @@ require ( golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 ) -replace ( - github.com/filecoin-project/go-jsonrpc => github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc -) +replace github.com/filecoin-project/go-jsonrpc => github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc diff --git a/venus-shared/go.sum b/venus-shared/go.sum index ca7fb51ed5..c8dee457f0 100644 --- a/venus-shared/go.sum +++ b/venus-shared/go.sum @@ -51,8 +51,6 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec h1:rGI5I7fdU4viManxmDdbk5deZO7afe6L1Wc04dAmlOM= -github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= @@ -86,6 +84,8 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -101,6 +101,7 @@ github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= @@ -108,6 +109,8 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc h1:L4JH2Ltl/Embq4qYezs3RsIYW1BB/fB9TfUkk42FOzU= +github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= @@ -362,6 +365,7 @@ github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= github.com/xorcare/golden v0.6.0 h1:E8emU8bhyMIEpYmgekkTUaw4vtcrRE+Wa0c5wYIcgXc= github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -382,6 +386,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= @@ -392,6 +397,8 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -404,11 +411,13 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -423,8 +432,10 @@ golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210309074719-68d13333faf2 h1:46ULzRKLh1CwgRq2dC5SlBzEqqNCi8rreOZnNrbqcIY= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -439,9 +450,12 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 659b93bcb35fea1b711a7bd1ac05d28782c83372 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Wed, 29 Dec 2021 11:13:09 +0800 Subject: [PATCH 084/167] Feat/simple api perm comment (#4655) * simplified permission comment * fix replica cmd * add proxy util --- venus-devtool/api-gen/proxygen.go | 55 +------ venus-devtool/compatible/actors/main.go | 24 ++- venus-shared/actors/adt/adt.go | 2 + venus-shared/actors/adt/store.go | 2 + venus-shared/actors/aerrors/error.go | 2 + venus-shared/actors/aerrors/wrap.go | 2 + venus-shared/actors/builtin/README.md | 31 ++++ venus-shared/api/chain/v0/blockstore.go | 12 +- venus-shared/api/chain/v0/chain.go | 207 ++++++++---------------- venus-shared/api/chain/v0/discovery.go | 4 - venus-shared/api/chain/v0/fullnode.go | 14 -- venus-shared/api/chain/v0/jwtauth.go | 6 +- venus-shared/api/chain/v0/market.go | 3 +- venus-shared/api/chain/v0/mining.go | 6 +- venus-shared/api/chain/v0/mpool.go | 66 +++----- venus-shared/api/chain/v0/multisig.go | 39 ++--- venus-shared/api/chain/v0/network.go | 30 ++-- venus-shared/api/chain/v0/paych.go | 48 ++---- venus-shared/api/chain/v0/proxy_gen.go | 4 - venus-shared/api/chain/v0/syncer.go | 24 +-- venus-shared/api/chain/v0/wallet.go | 45 ++---- venus-shared/api/chain/v1/blockstore.go | 12 +- venus-shared/api/chain/v1/chain.go | 207 ++++++++---------------- venus-shared/api/chain/v1/fullnode.go | 13 -- venus-shared/api/chain/v1/jwtauth.go | 6 +- venus-shared/api/chain/v1/market.go | 3 +- venus-shared/api/chain/v1/mining.go | 6 +- venus-shared/api/chain/v1/mpool.go | 75 +++------ venus-shared/api/chain/v1/multisig.go | 39 ++--- venus-shared/api/chain/v1/network.go | 30 ++-- venus-shared/api/chain/v1/paych.go | 48 ++---- venus-shared/api/chain/v1/syncer.go | 24 +-- venus-shared/api/chain/v1/wallet.go | 45 ++---- venus-shared/api/proxy_util.go | 30 ++++ venus-shared/api/proxy_util_test.go | 62 +++++++ 35 files changed, 485 insertions(+), 741 deletions(-) create mode 100644 venus-shared/actors/builtin/README.md delete mode 100644 venus-shared/api/chain/v0/discovery.go create mode 100644 venus-shared/api/proxy_util.go create mode 100644 venus-shared/api/proxy_util_test.go diff --git a/venus-devtool/api-gen/proxygen.go b/venus-devtool/api-gen/proxygen.go index a458432516..a5d05e3b00 100644 --- a/venus-devtool/api-gen/proxygen.go +++ b/venus-devtool/api-gen/proxygen.go @@ -12,15 +12,11 @@ import ( "os" "path" "path/filepath" - "regexp" - "strconv" "strings" "text/template" "unicode" - "github.com/filecoin-project/go-jsonrpc/auth" _ "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/venus/app/client/funcrule" "golang.org/x/xerrors" ) @@ -36,49 +32,12 @@ var ( VenusV1ApiFile = path.Join(VenusAPIPath, "chain/v1", GenAPIFileName) ) -// Rule[perm:read,ignore:true] -var rulePattern = `Rule\[(?P.*)\]` - type ruleKey = string const ( - rkPerm ruleKey = "perm" - rkIgnore ruleKey = "ignore" + rkPerm ruleKey = "perm" ) -var defaultPerm = []string{"perm", "read"} -var regRule, _ = regexp.Compile(rulePattern) - -func parseRule(comment string) (*funcrule.Rule, map[string][]string) { - rule := new(funcrule.Rule) - match := regRule.FindStringSubmatch(comment) - tags := map[string][]string{} - if len(match) == 2 { - pairs := strings.Split(match[1], ",") - for _, v := range pairs { - pair := strings.Split(v, ":") - if len(pair) != 2 { - continue - } - switch pair[0] { - case rkPerm: - tags[rkPerm] = pair - rule.Perm = auth.Permission(pair[1]) - case rkIgnore: - ig, err := strconv.ParseBool(pair[1]) - if err != nil { - panic("the rule tag is invalid format") - } - rule.Ignore = ig - } - } - } else { - rule.Perm = "read" - tags[rkPerm] = defaultPerm - } - return rule, tags -} - type methodMeta struct { node ast.Node ftype *ast.FuncType @@ -372,13 +331,11 @@ func methodMetaFromInterface(rootPath string, pkg, outpkg string) (*meta, error) // try to parse tag info if len(filteredComments) > 0 { - cmt := filteredComments[0].List[len(filteredComments[0].List)-1].Text - rule, tags := parseRule(cmt) - info.Methods[mname].Tags[rkPerm] = tags[rkPerm] - // remove ignore method - if rule.Ignore { - ignoreMethods[ifname] = append(ignoreMethods[ifname], mname) - } + lastComment := filteredComments[len(filteredComments)-1] + // eg. cmt = `//perm:read` + cmt := lastComment.List[len(lastComment.List)-1].Text + cmt = strings.Replace(cmt, "//", "", 1) + info.Methods[mname].Tags[rkPerm] = strings.Split(cmt, ":") } } } diff --git a/venus-devtool/compatible/actors/main.go b/venus-devtool/compatible/actors/main.go index c72c351f76..8ae1746842 100644 --- a/venus-devtool/compatible/actors/main.go +++ b/venus-devtool/compatible/actors/main.go @@ -6,6 +6,7 @@ import ( "log" "os" "path/filepath" + "regexp" "strings" "github.com/urfave/cli/v2" @@ -145,18 +146,35 @@ var replicaCmd = &cli.Command{ return fmt.Errorf("find chain/actors: %w", err) } + reg := regexp.MustCompile(`v[0-9]+.go`) + files, err := listFilesInDir(srcDir, func(path string, d fs.DirEntry) bool { if d.IsDir() { return true } + // need adt.go diff_adt.go + if strings.Contains(path, "adt.go") { + return false + } + + // skip test file if strings.HasSuffix(path, "test.go") { return true } - // diff.go diff_deadlines.go version.go params.go utils.go util.go - if !strings.Contains(path, "diff") && !strings.HasSuffix(path, "version.go") && - !strings.HasSuffix(path, "params.go") && !strings.Contains(path, "util") { + if strings.HasSuffix(path, "main.go") || strings.Contains(path, "template") || + strings.Contains(path, "message") { + return true + } + + dir := filepath.Dir(path) + arr := strings.Split(dir, "/") + if strings.HasSuffix(path, fmt.Sprintf("%s.go", arr[len(arr)-1])) { + return true + } + + if reg.MatchString(d.Name()) { return true } diff --git a/venus-shared/actors/adt/adt.go b/venus-shared/actors/adt/adt.go index 084471bb8f..6cebb1e0e6 100644 --- a/venus-shared/actors/adt/adt.go +++ b/venus-shared/actors/adt/adt.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: adt/adt.go + package adt import ( diff --git a/venus-shared/actors/adt/store.go b/venus-shared/actors/adt/store.go index 8dd9841a15..04b71797da 100644 --- a/venus-shared/actors/adt/store.go +++ b/venus-shared/actors/adt/store.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: adt/store.go + package adt import ( diff --git a/venus-shared/actors/aerrors/error.go b/venus-shared/actors/aerrors/error.go index 12f802c8fc..df5f23a817 100644 --- a/venus-shared/actors/aerrors/error.go +++ b/venus-shared/actors/aerrors/error.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: aerrors/error.go + package aerrors import ( diff --git a/venus-shared/actors/aerrors/wrap.go b/venus-shared/actors/aerrors/wrap.go index 0552829f91..4193628428 100644 --- a/venus-shared/actors/aerrors/wrap.go +++ b/venus-shared/actors/aerrors/wrap.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: aerrors/wrap.go + package aerrors import ( diff --git a/venus-shared/actors/builtin/README.md b/venus-shared/actors/builtin/README.md new file mode 100644 index 0000000000..b47dd68fed --- /dev/null +++ b/venus-shared/actors/builtin/README.md @@ -0,0 +1,31 @@ +// FETCHED FROM LOTUS: builtin/README.md + +# Actors + +This package contains shims for abstracting over different actor versions. + +## Design + +Shims in this package follow a few common design principles. + +### Structure Agnostic + +Shims interfaces defined in this package should (ideally) not change even if the +structure of the underlying data changes. For example: + +* All shims store an internal "store" object. That way, state can be moved into + a separate object without needing to add a store to the function signature. +* All functions must return an error, even if unused for now. + +### Minimal + +These interfaces should be expanded only as necessary to reduce maintenance burden. + +### Queries, not field assessors. + +When possible, functions should query the state instead of simply acting as +field assessors. These queries are more likely to remain stable across +specs-actor upgrades than specific state fields. + +Note: there is a trade-off here. Avoid implementing _complicated_ query logic +inside these shims, as it will need to be replicated in every shim. diff --git a/venus-shared/api/chain/v0/blockstore.go b/venus-shared/api/chain/v0/blockstore.go index adca654f68..511e14852d 100644 --- a/venus-shared/api/chain/v0/blockstore.go +++ b/venus-shared/api/chain/v0/blockstore.go @@ -9,12 +9,8 @@ import ( ) type IBlockStore interface { - // Rule[perm:read] - ChainReadObj(ctx context.Context, ocid cid.Cid) ([]byte, error) - // Rule[perm:admin] - ChainDeleteObj(ctx context.Context, obj cid.Cid) error - // Rule[perm:read] - ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) - // Rule[perm:read] - ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (chain2.ObjStat, error) + ChainReadObj(ctx context.Context, cid cid.Cid) ([]byte, error) //perm:read + ChainDeleteObj(ctx context.Context, obj cid.Cid) error //perm:admin + ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) //perm:read + ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (chain2.ObjStat, error) //perm:read } diff --git a/venus-shared/api/chain/v0/chain.go b/venus-shared/api/chain/v0/chain.go index 4cc4e6b20d..25b0c16677 100644 --- a/venus-shared/api/chain/v0/chain.go +++ b/venus-shared/api/chain/v0/chain.go @@ -27,154 +27,85 @@ type IChain interface { } type IAccount interface { - // Rule[perm:read] - StateAccountKey(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (address.Address, error) + StateAccountKey(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (address.Address, error) //perm:read } type IActor interface { - // Rule[perm:read] - StateGetActor(ctx context.Context, actor address.Address, tsk chain.TipSetKey) (*chain.Actor, error) - // Rule[perm:read] - ListActor(ctx context.Context) (map[address.Address]*chain.Actor, error) + StateGetActor(ctx context.Context, actor address.Address, tsk chain.TipSetKey) (*chain.Actor, error) //perm:read + ListActor(ctx context.Context) (map[address.Address]*chain.Actor, error) //perm:read } type IBeacon interface { - // Rule[perm:read] - BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*chain.BeaconEntry, error) + BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*chain.BeaconEntry, error) //perm:read } type IChainInfo interface { - // Rule[perm:read] - BlockTime(ctx context.Context) time.Duration - // Rule[perm:read] - ChainList(ctx context.Context, tsKey chain.TipSetKey, count int) ([]chain.TipSetKey, error) - // Rule[perm:read] - ChainHead(ctx context.Context) (*chain.TipSet, error) - // Rule[perm:admin] - ChainSetHead(ctx context.Context, key chain.TipSetKey) error - // Rule[perm:read] - ChainGetTipSet(ctx context.Context, key chain.TipSetKey) (*chain.TipSet, error) - // Rule[perm:read] - ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk chain.TipSetKey) (*chain.TipSet, error) - // Rule[perm:read] - ChainGetRandomnessFromBeacon(ctx context.Context, key chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) - // Rule[perm:read] - ChainGetRandomnessFromTickets(ctx context.Context, tsk chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) - // Rule[perm:read] - ChainGetBlock(ctx context.Context, id cid.Cid) (*chain.BlockHeader, error) - // Rule[perm:read] - ChainGetMessage(ctx context.Context, msgID cid.Cid) (*chain.Message, error) - // Rule[perm:read] - ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*chain2.BlockMessages, error) - // Rule[perm:read] - ChainGetMessagesInTipset(ctx context.Context, key chain.TipSetKey) ([]chain2.Message, error) - // Rule[perm:read] - ChainGetReceipts(ctx context.Context, id cid.Cid) ([]chain.MessageReceipt, error) - // Rule[perm:read] - ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]chain2.Message, error) - // Rule[perm:read] - ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*chain.MessageReceipt, error) - //Rule[perm:read] - StateVerifiedRegistryRootKey(ctx context.Context, tsk chain.TipSetKey) (address.Address, error) - // Rule[perm:read] - StateVerifierStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) - // Rule[perm:read] - ChainNotify(ctx context.Context) (<-chan []*chain2.HeadChange, error) - // Rule[perm:read] - GetFullBlock(ctx context.Context, id cid.Cid) (*chain.FullBlock, error) - // Rule[perm:read] - GetActor(ctx context.Context, addr address.Address) (*chain.Actor, error) - // Rule[perm:read] - GetParentStateRootActor(ctx context.Context, ts *chain.TipSet, addr address.Address) (*chain.Actor, error) - // Rule[perm:read] - GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*chain.BeaconEntry, error) - // Rule[perm:read] - MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*chain2.ChainMessage, error) - // Rule[perm:read] - ProtocolParameters(ctx context.Context) (*chain2.ProtocolParams, error) - // Rule[perm:read] - ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *chain.TipSet) (address.Address, error) - // Rule[perm:read] - StateNetworkName(ctx context.Context) (chain2.NetworkName, error) - // Rule[perm:read] - StateGetReceipt(ctx context.Context, msg cid.Cid, from chain.TipSetKey) (*chain.MessageReceipt, error) - // Rule[perm:read] - StateSearchMsg(ctx context.Context, msg cid.Cid) (*chain2.MsgLookup, error) - // Rule[perm:read] - StateSearchMsgLimited(ctx context.Context, cid cid.Cid, limit abi.ChainEpoch) (*chain2.MsgLookup, error) - // Rule[perm:read] - StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64) (*chain2.MsgLookup, error) - // Rule[perm:read] - StateWaitMsgLimited(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch) (*chain2.MsgLookup, error) - // Rule[perm:read] - StateNetworkVersion(ctx context.Context, tsk chain.TipSetKey) (network.Version, error) - // Rule[perm:read] - VerifyEntry(parent, child *chain.BeaconEntry, height abi.ChainEpoch) bool - // Rule[perm:read] - ChainExport(context.Context, abi.ChainEpoch, bool, chain.TipSetKey) (<-chan []byte, error) - // Rule[perm:read] - ChainGetPath(ctx context.Context, from chain.TipSetKey, to chain.TipSetKey) ([]*chain2.HeadChange, error) + BlockTime(ctx context.Context) time.Duration //perm:read + ChainList(ctx context.Context, tsKey chain.TipSetKey, count int) ([]chain.TipSetKey, error) //perm:read + ChainHead(ctx context.Context) (*chain.TipSet, error) //perm:read + ChainSetHead(ctx context.Context, key chain.TipSetKey) error //perm:admin + ChainGetTipSet(ctx context.Context, key chain.TipSetKey) (*chain.TipSet, error) //perm:read + ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk chain.TipSetKey) (*chain.TipSet, error) //perm:read + ChainGetRandomnessFromBeacon(ctx context.Context, key chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read + ChainGetRandomnessFromTickets(ctx context.Context, tsk chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read + ChainGetBlock(ctx context.Context, id cid.Cid) (*chain.BlockHeader, error) //perm:read + ChainGetMessage(ctx context.Context, msgID cid.Cid) (*chain.Message, error) //perm:read + ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*chain2.BlockMessages, error) //perm:read + ChainGetMessagesInTipset(ctx context.Context, key chain.TipSetKey) ([]chain2.Message, error) //perm:read + ChainGetReceipts(ctx context.Context, id cid.Cid) ([]chain.MessageReceipt, error) //perm:read + ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]chain2.Message, error) //perm:read + ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*chain.MessageReceipt, error) //perm:read + StateVerifiedRegistryRootKey(ctx context.Context, tsk chain.TipSetKey) (address.Address, error) //perm:read + StateVerifierStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) //perm:read + ChainNotify(ctx context.Context) (<-chan []*chain2.HeadChange, error) //perm:read + GetFullBlock(ctx context.Context, id cid.Cid) (*chain.FullBlock, error) //perm:read + GetActor(ctx context.Context, addr address.Address) (*chain.Actor, error) //perm:read + GetParentStateRootActor(ctx context.Context, ts *chain.TipSet, addr address.Address) (*chain.Actor, error) //perm:read + GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*chain.BeaconEntry, error) //perm:read + MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*chain2.ChainMessage, error) //perm:read + ProtocolParameters(ctx context.Context) (*chain2.ProtocolParams, error) //perm:read + ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *chain.TipSet) (address.Address, error) //perm:read + StateNetworkName(ctx context.Context) (chain2.NetworkName, error) //perm:read + StateGetReceipt(ctx context.Context, msg cid.Cid, from chain.TipSetKey) (*chain.MessageReceipt, error) //perm:read + StateSearchMsg(ctx context.Context, msg cid.Cid) (*chain2.MsgLookup, error) //perm:read + StateSearchMsgLimited(ctx context.Context, cid cid.Cid, limit abi.ChainEpoch) (*chain2.MsgLookup, error) //perm:read + StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64) (*chain2.MsgLookup, error) //perm:read + StateWaitMsgLimited(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch) (*chain2.MsgLookup, error) //perm:read + StateNetworkVersion(ctx context.Context, tsk chain.TipSetKey) (network.Version, error) //perm:read + VerifyEntry(parent, child *chain.BeaconEntry, height abi.ChainEpoch) bool //perm:read + ChainExport(context.Context, abi.ChainEpoch, bool, chain.TipSetKey) (<-chan []byte, error) //perm:read + ChainGetPath(ctx context.Context, from chain.TipSetKey, to chain.TipSetKey) ([]*chain2.HeadChange, error) //perm:read } type IMinerState interface { - // Rule[perm:read] - StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk chain.TipSetKey) (bool, error) - // Rule[perm:read] - StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) - // Rule[perm:read] - StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorOnChainInfo, error) - // Rule[perm:read] - StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorLocation, error) - // Rule[perm:read] - StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (abi.SectorSize, error) - // Rule[perm:read] - StateMinerInfo(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (miner.MinerInfo, error) - // Rule[perm:read] - StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (address.Address, error) - // Rule[perm:read] - StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (bitfield.BitField, error) - // Rule[perm:read] - StateMinerFaults(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (bitfield.BitField, error) - // Rule[perm:read] - StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (*dline.Info, error) - // Rule[perm:read] - StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk chain.TipSetKey) ([]chain2.Partition, error) - // Rule[perm:read] - StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]chain2.Deadline, error) - // Rule[perm:read] - StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) - // Rule[perm:read] - StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk chain.TipSetKey) (*chain2.MarketDeal, error) - // Rule[perm:read] - StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) - // Rule[perm:read] - StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) - // Rule[perm:read] - StateVMCirculatingSupplyInternal(ctx context.Context, tsk chain.TipSetKey) (chain.CirculatingSupply, error) - // Rule[perm:read] - StateCirculatingSupply(ctx context.Context, tsk chain.TipSetKey) (abi.TokenAmount, error) - // Rule[perm:read] - StateMarketDeals(ctx context.Context, tsk chain.TipSetKey) (map[string]chain2.MarketDeal, error) - // Rule[perm:read] - StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) - // Rule[perm:read] - StateLookupID(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (address.Address, error) - // Rule[perm:read] - StateListMiners(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) - // Rule[perm:read] - StateListActors(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) - // Rule[perm:read] - StateMinerPower(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*chain2.MinerPower, error) - // Rule[perm:read] - StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (big.Int, error) - // Rule[perm:read] - StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorExpiration, error) - // Rule[perm:read] - StateMinerSectorCount(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (chain2.MinerSectors, error) - // Rule[perm:read] - StateMarketBalance(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (chain2.MarketBalance, error) - // Rule[perm:read] - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk chain.TipSetKey) (chain2.DealCollateralBounds, error) - // Rule[perm:read] - StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) + StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk chain.TipSetKey) (bool, error) //perm:read + StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) //perm:read + StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorOnChainInfo, error) //perm:read + StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorLocation, error) //perm:read + StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (abi.SectorSize, error) //perm:read + StateMinerInfo(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (miner.MinerInfo, error) //perm:read + StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (address.Address, error) //perm:read + StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (bitfield.BitField, error) //perm:read + StateMinerFaults(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (bitfield.BitField, error) //perm:read + StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (*dline.Info, error) //perm:read + StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk chain.TipSetKey) ([]chain2.Partition, error) //perm:read + StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]chain2.Deadline, error) //perm:read + StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) //perm:read + StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk chain.TipSetKey) (*chain2.MarketDeal, error) //perm:read + StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) //perm:read + StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) //perm:read + StateVMCirculatingSupplyInternal(ctx context.Context, tsk chain.TipSetKey) (chain.CirculatingSupply, error) //perm:read + StateCirculatingSupply(ctx context.Context, tsk chain.TipSetKey) (abi.TokenAmount, error) //perm:read + StateMarketDeals(ctx context.Context, tsk chain.TipSetKey) (map[string]chain2.MarketDeal, error) //perm:read + StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) //perm:read + StateLookupID(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (address.Address, error) //perm:read + StateListMiners(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) //perm:read + StateListActors(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) //perm:read + StateMinerPower(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*chain2.MinerPower, error) //perm:read + StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (big.Int, error) //perm:read + StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorExpiration, error) //perm:read + StateMinerSectorCount(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (chain2.MinerSectors, error) //perm:read + StateMarketBalance(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (chain2.MarketBalance, error) //perm:read + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk chain.TipSetKey) (chain2.DealCollateralBounds, error) //perm:read + StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) //perm:read } diff --git a/venus-shared/api/chain/v0/discovery.go b/venus-shared/api/chain/v0/discovery.go deleted file mode 100644 index 2fd1fe7bcd..0000000000 --- a/venus-shared/api/chain/v0/discovery.go +++ /dev/null @@ -1,4 +0,0 @@ -package v0 - -type IDiscovery interface { -} diff --git a/venus-shared/api/chain/v0/fullnode.go b/venus-shared/api/chain/v0/fullnode.go index a33a5cff18..99e896b1e7 100644 --- a/venus-shared/api/chain/v0/fullnode.go +++ b/venus-shared/api/chain/v0/fullnode.go @@ -1,16 +1,3 @@ -/* -in api interface, you can add comment tags to the function -Note: -Rule[perm:admin,ignore:true] -perm: read,write,sign,admin -jwt token permission check -ignore: bool -the func in the api whether needs to be added to the client for external exposure - -TODO: -1. Support global FUNC injection - -*/ package v0 //go:generate go run github.com/golang/mock/mockgen@v1.6.0 -destination=./mock/full.go -package=mock . FullNode @@ -19,7 +6,6 @@ package v0 type FullNode interface { IBlockStore IChain - IDiscovery IMarket IMining IMessagePool diff --git a/venus-shared/api/chain/v0/jwtauth.go b/venus-shared/api/chain/v0/jwtauth.go index a32f7dd0f5..ef3f0c9bb8 100644 --- a/venus-shared/api/chain/v0/jwtauth.go +++ b/venus-shared/api/chain/v0/jwtauth.go @@ -7,8 +7,6 @@ import ( ) type IJwtAuthAPI interface { - // Rule[perm:read] - Verify(ctx context.Context, host, token string) ([]auth.Permission, error) - // Rule[perm:admin] - AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) + Verify(ctx context.Context, host, token string) ([]auth.Permission, error) //perm:read + AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) //perm:admin } diff --git a/venus-shared/api/chain/v0/market.go b/venus-shared/api/chain/v0/market.go index 36d80dec11..81c6eb75fb 100644 --- a/venus-shared/api/chain/v0/market.go +++ b/venus-shared/api/chain/v0/market.go @@ -8,6 +8,5 @@ import ( ) type IMarket interface { - // Rule[perm:read] - StateMarketParticipants(ctx context.Context, tsk chain.TipSetKey) (map[string]chain2.MarketBalance, error) //perm:admin + StateMarketParticipants(ctx context.Context, tsk chain.TipSetKey) (map[string]chain2.MarketBalance, error) //perm:read } diff --git a/venus-shared/api/chain/v0/mining.go b/venus-shared/api/chain/v0/mining.go index df8442f1a4..99da702aa6 100644 --- a/venus-shared/api/chain/v0/mining.go +++ b/venus-shared/api/chain/v0/mining.go @@ -11,8 +11,6 @@ import ( ) type IMining interface { - // Rule[perm:read] - MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk chain.TipSetKey) (*chain2.MiningBaseInfo, error) - // Rule[perm:write] - MinerCreateBlock(ctx context.Context, bt *chain2.BlockTemplate) (*chain.BlockMsg, error) + MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk chain.TipSetKey) (*chain2.MiningBaseInfo, error) //perm:read + MinerCreateBlock(ctx context.Context, bt *chain2.BlockTemplate) (*chain.BlockMsg, error) //perm:write } diff --git a/venus-shared/api/chain/v0/mpool.go b/venus-shared/api/chain/v0/mpool.go index b3b481c42c..eb867dcc3f 100644 --- a/venus-shared/api/chain/v0/mpool.go +++ b/venus-shared/api/chain/v0/mpool.go @@ -13,48 +13,26 @@ import ( ) type IMessagePool interface { - // Rule[perm:admin] - MpoolDeleteByAdress(ctx context.Context, addr address.Address) error - // Rule[perm:admin] - MpoolPublishByAddr(context.Context, address.Address) error - // Rule[perm:admin] - MpoolPublishMessage(ctx context.Context, smsg *chain.SignedMessage) error - // Rule[perm:write] - MpoolPush(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) - // Rule[perm:read] - MpoolGetConfig(context.Context) (*messagepool.MpoolConfig, error) - // Rule[perm:admin] - MpoolSetConfig(ctx context.Context, cfg *messagepool.MpoolConfig) error - // Rule[perm:read] - MpoolSelect(context.Context, chain.TipSetKey, float64) ([]*chain.SignedMessage, error) - // Rule[perm:read] - MpoolSelects(context.Context, chain.TipSetKey, []float64) ([][]*chain.SignedMessage, error) - // Rule[perm:read] - MpoolPending(ctx context.Context, tsk chain.TipSetKey) ([]*chain.SignedMessage, error) - // Rule[perm:write] - MpoolClear(ctx context.Context, local bool) error - // Rule[perm:write] - MpoolPushUntrusted(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) - // Rule[perm:sign] - MpoolPushMessage(ctx context.Context, msg *chain.Message, spec *chain2.MessageSendSpec) (*chain.SignedMessage, error) - // Rule[perm:write] - MpoolBatchPush(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) - // Rule[perm:write] - MpoolBatchPushUntrusted(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) - // Rule[perm:sign] - MpoolBatchPushMessage(ctx context.Context, msgs []*chain.Message, spec *chain2.MessageSendSpec) ([]*chain.SignedMessage, error) - // Rule[perm:read] - MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) - // Rule[perm:read] - MpoolSub(ctx context.Context) (<-chan messagepool.MpoolUpdate, error) - // Rule[perm:read] - GasEstimateMessageGas(ctx context.Context, msg *chain.Message, spec *chain2.MessageSendSpec, tsk chain.TipSetKey) (*chain.Message, error) - // Rule[perm:read] - GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*chain2.EstimateMessage, fromNonce uint64, tsk chain.TipSetKey) ([]*chain2.EstimateResult, error) - // Rule[perm:read] - GasEstimateFeeCap(ctx context.Context, msg *chain.Message, maxqueueblks int64, tsk chain.TipSetKey) (big.Int, error) - // Rule[perm:read] - GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk chain.TipSetKey) (big.Int, error) - // Rule[perm:read] - GasEstimateGasLimit(ctx context.Context, msgIn *chain.Message, tsk chain.TipSetKey) (int64, error) + MpoolDeleteByAdress(ctx context.Context, addr address.Address) error //perm:admin + MpoolPublishByAddr(context.Context, address.Address) error //perm:admin + MpoolPublishMessage(ctx context.Context, smsg *chain.SignedMessage) error //perm:admin + MpoolPush(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) //perm:write + MpoolGetConfig(context.Context) (*messagepool.MpoolConfig, error) //perm:read + MpoolSetConfig(ctx context.Context, cfg *messagepool.MpoolConfig) error //perm:admin + MpoolSelect(context.Context, chain.TipSetKey, float64) ([]*chain.SignedMessage, error) //perm:read + MpoolSelects(context.Context, chain.TipSetKey, []float64) ([][]*chain.SignedMessage, error) //perm:read + MpoolPending(ctx context.Context, tsk chain.TipSetKey) ([]*chain.SignedMessage, error) //perm:read + MpoolClear(ctx context.Context, local bool) error //perm:write + MpoolPushUntrusted(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) //perm:write + MpoolPushMessage(ctx context.Context, msg *chain.Message, spec *chain2.MessageSendSpec) (*chain.SignedMessage, error) //perm:sign + MpoolBatchPush(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) //perm:write + MpoolBatchPushUntrusted(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) //perm:write + MpoolBatchPushMessage(ctx context.Context, msgs []*chain.Message, spec *chain2.MessageSendSpec) ([]*chain.SignedMessage, error) //perm:sign + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) //perm:read + MpoolSub(ctx context.Context) (<-chan messagepool.MpoolUpdate, error) //perm:read + GasEstimateMessageGas(ctx context.Context, msg *chain.Message, spec *chain2.MessageSendSpec, tsk chain.TipSetKey) (*chain.Message, error) //perm:read + GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*chain2.EstimateMessage, fromNonce uint64, tsk chain.TipSetKey) ([]*chain2.EstimateResult, error) //perm:read + GasEstimateFeeCap(ctx context.Context, msg *chain.Message, maxqueueblks int64, tsk chain.TipSetKey) (big.Int, error) //perm:read + GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk chain.TipSetKey) (big.Int, error) //perm:read + GasEstimateGasLimit(ctx context.Context, msgIn *chain.Message, tsk chain.TipSetKey) (int64, error) //perm:read } diff --git a/venus-shared/api/chain/v0/multisig.go b/venus-shared/api/chain/v0/multisig.go index 2673c422bc..fbb98798a3 100644 --- a/venus-shared/api/chain/v0/multisig.go +++ b/venus-shared/api/chain/v0/multisig.go @@ -15,30 +15,17 @@ type IMultiSig interface { // MsigCreate creates a multisig wallet // It takes the following params: , , //, , - // Rule[perm:sign] - MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, chain.BigInt, address.Address, chain.BigInt) (cid.Cid, error) - // Rule[perm:sign] - MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) - // Rule[perm:sign] - MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (cid.Cid, error) - // Rule[perm:sign] - MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (cid.Cid, error) - // Rule[perm:sign] - MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (cid.Cid, error) - // Rule[perm:sign] - MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) - // Rule[perm:sign] - MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) - // Rule[perm:sign] - MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) - // Rule[perm:sign] - MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (cid.Cid, error) - // Rule[perm:sign] - MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) - // Rule[perm:sign] - MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) - // Rule[perm:sign] - MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (cid.Cid, error) - // Rule[perm:read] - MsigGetVested(ctx context.Context, addr address.Address, start chain.TipSetKey, end chain.TipSetKey) (chain.BigInt, error) + MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, chain.BigInt, address.Address, chain.BigInt) (cid.Cid, error) //perm:sign + MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) //perm:sign + MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (cid.Cid, error) //perm:sign + MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (cid.Cid, error) //perm:sign + MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (cid.Cid, error) //perm:sign + MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) //perm:sign + MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) //perm:sign + MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) //perm:sign + MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (cid.Cid, error) //perm:sign + MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) //perm:sign + MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) //perm:sign + MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (cid.Cid, error) //perm:sign + MsigGetVested(ctx context.Context, addr address.Address, start chain.TipSetKey, end chain.TipSetKey) (chain.BigInt, error) //perm:read } diff --git a/venus-shared/api/chain/v0/network.go b/venus-shared/api/chain/v0/network.go index fd00a5d835..0c1bffb4ab 100644 --- a/venus-shared/api/chain/v0/network.go +++ b/venus-shared/api/chain/v0/network.go @@ -13,24 +13,14 @@ import ( ) type INetwork interface { - // Rule[perm:admin] - NetworkGetBandwidthStats(ctx context.Context) metrics.Stats - // Rule[perm:admin] - NetworkGetPeerAddresses(ctx context.Context) []ma.Multiaddr - // Rule[perm:admin] - NetworkGetPeerID(ctx context.Context) peer.ID - // Rule[perm:read] - NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo - // Rule[perm:read] - NetworkGetClosestPeers(ctx context.Context, key string) (<-chan peer.ID, error) - // Rule[perm:read] - NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) - // Rule[perm:read] - NetworkConnect(ctx context.Context, addrs []string) (<-chan net.ConnectionResult, error) - // Rule[perm:read] - NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) - // Rule[perm:read] - Version(context.Context) (chain2.Version, error) - // Rule[perm:read] - NetAddrsListen(context.Context) (peer.AddrInfo, error) + NetworkGetBandwidthStats(ctx context.Context) metrics.Stats //perm:admin + NetworkGetPeerAddresses(ctx context.Context) []ma.Multiaddr //perm:admin + NetworkGetPeerID(ctx context.Context) peer.ID //perm:admin + NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo //perm:read + NetworkGetClosestPeers(ctx context.Context, key string) (<-chan peer.ID, error) //perm:read + NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) //perm:read + NetworkConnect(ctx context.Context, addrs []string) (<-chan net.ConnectionResult, error) //perm:read + NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) //perm:read + Version(context.Context) (chain2.Version, error) //perm:read + NetAddrsListen(context.Context) (peer.AddrInfo, error) //perm:read } diff --git a/venus-shared/api/chain/v0/paych.go b/venus-shared/api/chain/v0/paych.go index b738725cee..062ca411c9 100644 --- a/venus-shared/api/chain/v0/paych.go +++ b/venus-shared/api/chain/v0/paych.go @@ -16,68 +16,55 @@ type IPaychan interface { // @from: the payment channel sender // @to: the payment channel recipient // @amt: the deposits funds in the payment channel - // Rule[perm:sign] - PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*paych.ChannelInfo, error) + PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*paych.ChannelInfo, error) //perm:sign // PaychAvailableFunds get the status of an outbound payment channel // @pch: payment channel address - // Rule[perm:sign] - PaychAvailableFunds(ctx context.Context, ch address.Address) (*chain2.ChannelAvailableFunds, error) + PaychAvailableFunds(ctx context.Context, ch address.Address) (*chain2.ChannelAvailableFunds, error) //perm:sign // PaychAvailableFundsByFromTo get the status of an outbound payment channel // @from: the payment channel sender // @to: he payment channel recipient - // Rule[perm:sign] - PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*chain2.ChannelAvailableFunds, error) + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*chain2.ChannelAvailableFunds, error) //perm:sign // PaychGetWaitReady waits until the create channel / add funds message with the sentinel // @sentinel: given message CID arrives. // @ch: the returned channel address can safely be used against the Manager methods. - // Rule[perm:sign] - PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (address.Address, error) + PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (address.Address, error) //perm:sign // PaychAllocateLane Allocate late creates a lane within a payment channel so that calls to // CreatePaymentVoucher will automatically make vouchers only for the difference in total - // Rule[perm:sign] - PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) + PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) //perm:sign // PaychNewPayment aggregate vouchers into a new lane // @from: the payment channel sender // @to: the payment channel recipient // @vouchers: the outstanding (non-redeemed) vouchers - // Rule[perm:sign] - PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []paych.VoucherSpec) (*paych.PaymentInfo, error) + PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []paych.VoucherSpec) (*paych.PaymentInfo, error) //perm:sign // PaychList list the addresses of all channels that have been created - // Rule[perm:read] - PaychList(ctx context.Context) ([]address.Address, error) + PaychList(ctx context.Context) ([]address.Address, error) //perm:read // PaychStatus get the payment channel status // @pch: payment channel address - // Rule[perm:read] - PaychStatus(ctx context.Context, pch address.Address) (*paych.Status, error) + PaychStatus(ctx context.Context, pch address.Address) (*paych.Status, error) //perm:read // PaychSettle update payment channel status to settle // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain // @pch: payment channel address - // Rule[perm:sign] - PaychSettle(ctx context.Context, addr address.Address) (cid.Cid, error) + PaychSettle(ctx context.Context, addr address.Address) (cid.Cid, error) //perm:sign // PaychCollect update payment channel status to collect // Collect sends the value of submitted vouchers to the channel recipient (the provider), // and refunds the remaining channel balance to the channel creator (the client). // @pch: payment channel address - // Rule[perm:sign] - PaychCollect(ctx context.Context, addr address.Address) (cid.Cid, error) + PaychCollect(ctx context.Context, addr address.Address) (cid.Cid, error) //perm:sign // PaychVoucherCheckValid checks if the given voucher is valid (is or could become spendable at some point). // If the channel is not in the store, fetches the channel from state (and checks that // the channel To address is owned by the wallet). // @pch: payment channel address // @sv: voucher - // Rule[perm:read] - PaychVoucherCheckValid(ctx context.Context, ch address.Address, sv *paych.SignedVoucher) error + PaychVoucherCheckValid(ctx context.Context, ch address.Address, sv *paych.SignedVoucher) error //perm:read // PaychVoucherCheckSpendable checks if the given voucher is currently spendable // @pch: payment channel address // @sv: voucher - // Rule[perm:read] - PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (bool, error) + PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (bool, error) //perm:read // PaychVoucherAdd adds a voucher for an inbound channel. // If the channel is not in the store, fetches the channel from state (and checks that // the channel To address is owned by the wallet). - // Rule[perm:write] - PaychVoucherAdd(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) + PaychVoucherAdd(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) //perm:write // PaychVoucherCreate creates a new signed voucher on the given payment channel // with the given lane and amount. The value passed in is exactly the value // that will be used to create the voucher, so if previous vouchers exist, the @@ -85,15 +72,12 @@ type IPaychan interface { // the two. // If there are insufficient funds in the channel to create the voucher, // returns a nil voucher and the shortfall. - // Rule[perm:sign] - PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paych.VoucherCreateResult, error) + PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paych.VoucherCreateResult, error) //perm:sign // PaychVoucherList list vouchers in payment channel // @pch: payment channel address - // Rule[perm:write] - PaychVoucherList(ctx context.Context, pch address.Address) ([]*paych.SignedVoucher, error) + PaychVoucherList(ctx context.Context, pch address.Address) ([]*paych.SignedVoucher, error) //perm:write // PaychVoucherSubmit Submit voucher to chain to update payment channel state // @pch: payment channel address // @sv: voucher in payment channel - // Rule[perm:sign] - PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) + PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) //perm:sign } diff --git a/venus-shared/api/chain/v0/proxy_gen.go b/venus-shared/api/chain/v0/proxy_gen.go index ad37fd695d..d067bc9699 100644 --- a/venus-shared/api/chain/v0/proxy_gen.go +++ b/venus-shared/api/chain/v0/proxy_gen.go @@ -29,7 +29,6 @@ import ( type FullNodeStruct struct { IBlockStoreStruct IChainStruct - IDiscoveryStruct IMarketStruct IMiningStruct IMessagePoolStruct @@ -327,9 +326,6 @@ func (s *IChainInfoStruct) VerifyEntry(p0 *chain.BeaconEntry, p1 *chain.BeaconEn return s.Internal.VerifyEntry(p0, p1, p2) } -type IDiscoveryStruct struct { -} - type IJwtAuthAPIStruct struct { Internal struct { AuthNew func(p0 context.Context, p1 []auth.Permission) ([]byte, error) `perm:"admin"` diff --git a/venus-shared/api/chain/v0/syncer.go b/venus-shared/api/chain/v0/syncer.go index 413db069b2..439b7f043b 100644 --- a/venus-shared/api/chain/v0/syncer.go +++ b/venus-shared/api/chain/v0/syncer.go @@ -10,20 +10,12 @@ import ( ) type ISyncer interface { - // Rule[perm:write] - ChainSyncHandleNewTipSet(ctx context.Context, ci *chain.ChainInfo) error - // Rule[perm:admin] - SetConcurrent(ctx context.Context, concurrent int64) error - // Rule[perm:read] - SyncerTracker(ctx context.Context) *chain2.TargetTracker - // Rule[perm:read] - Concurrent(ctx context.Context) int64 - // Rule[perm:read] - ChainTipSetWeight(ctx context.Context, tsk chain.TipSetKey) (big.Int, error) - // Rule[perm:write] - SyncSubmitBlock(ctx context.Context, blk *chain.BlockMsg) error - // Rule[perm:read] - StateCall(ctx context.Context, msg *chain.Message, tsk chain.TipSetKey) (*chain2.InvocResult, error) - // Rule[perm:read] - SyncState(ctx context.Context) (*chain2.SyncState, error) + ChainSyncHandleNewTipSet(ctx context.Context, ci *chain.ChainInfo) error //perm:write + SetConcurrent(ctx context.Context, concurrent int64) error //perm:admin + SyncerTracker(ctx context.Context) *chain2.TargetTracker //perm:read + Concurrent(ctx context.Context) int64 //perm:read + ChainTipSetWeight(ctx context.Context, tsk chain.TipSetKey) (big.Int, error) //perm:read + SyncSubmitBlock(ctx context.Context, blk *chain.BlockMsg) error //perm:write + StateCall(ctx context.Context, msg *chain.Message, tsk chain.TipSetKey) (*chain2.InvocResult, error) //perm:read + SyncState(ctx context.Context) (*chain2.SyncState, error) //perm:read } diff --git a/venus-shared/api/chain/v0/wallet.go b/venus-shared/api/chain/v0/wallet.go index 1f78fb5c20..bed48a5e50 100644 --- a/venus-shared/api/chain/v0/wallet.go +++ b/venus-shared/api/chain/v0/wallet.go @@ -12,34 +12,19 @@ import ( ) type IWallet interface { - // Rule[perm:sign] - WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) - // Rule[perm:admin] - WalletExport(addr address.Address, password string) (*wallet.KeyInfo, error) - // Rule[perm:admin] - WalletImport(key *wallet.KeyInfo) (address.Address, error) - // Rule[perm:write] - WalletHas(ctx context.Context, addr address.Address) (bool, error) - // Rule[perm:write] - WalletNewAddress(protocol address.Protocol) (address.Address, error) - // Rule[perm:read] - WalletBalance(ctx context.Context, addr address.Address) (abi.TokenAmount, error) //not exists in remote - // Rule[perm:write] - WalletDefaultAddress(ctx context.Context) (address.Address, error) //not exists in remote - // Rule[perm:admin] - WalletAddresses(ctx context.Context) []address.Address - // Rule[perm:write] - WalletSetDefault(ctx context.Context, addr address.Address) error //not exists in remote - // Rule[perm:sign] - WalletSignMessage(ctx context.Context, k address.Address, msg *chain.Message) (*chain.SignedMessage, error) - // Rule[perm:admin] - LockWallet(ctx context.Context) error - // Rule[perm:admin] - UnLockWallet(ctx context.Context, password []byte) error - // Rule[perm:admin] - SetPassword(Context context.Context, password []byte) error - // Rule[perm:admin] - HasPassword(Context context.Context) bool - // Rule[perm:admin] - WalletState(Context context.Context) int + WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) //perm:sign + WalletExport(addr address.Address, password string) (*wallet.KeyInfo, error) //perm:admin + WalletImport(key *wallet.KeyInfo) (address.Address, error) //perm:admin + WalletHas(ctx context.Context, addr address.Address) (bool, error) //perm:write + WalletNewAddress(protocol address.Protocol) (address.Address, error) //perm:write + WalletBalance(ctx context.Context, addr address.Address) (abi.TokenAmount, error) //perm:read + WalletDefaultAddress(ctx context.Context) (address.Address, error) //perm:write + WalletAddresses(ctx context.Context) []address.Address //perm:admin + WalletSetDefault(ctx context.Context, addr address.Address) error //perm:write + WalletSignMessage(ctx context.Context, k address.Address, msg *chain.Message) (*chain.SignedMessage, error) //perm:sign + LockWallet(ctx context.Context) error //perm:admin + UnLockWallet(ctx context.Context, password []byte) error //perm:admin + SetPassword(Context context.Context, password []byte) error //perm:admin + HasPassword(Context context.Context) bool //perm:admin + WalletState(Context context.Context) int //perm:admin } diff --git a/venus-shared/api/chain/v1/blockstore.go b/venus-shared/api/chain/v1/blockstore.go index 041de41c31..c96e3d04b0 100644 --- a/venus-shared/api/chain/v1/blockstore.go +++ b/venus-shared/api/chain/v1/blockstore.go @@ -9,12 +9,8 @@ import ( ) type IBlockStore interface { - // Rule[perm:read] - ChainReadObj(ctx context.Context, ocid cid.Cid) ([]byte, error) - // Rule[perm:admin] - ChainDeleteObj(ctx context.Context, obj cid.Cid) error - // Rule[perm:read] - ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) - // Rule[perm:read] - ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (chain2.ObjStat, error) + ChainReadObj(ctx context.Context, cid cid.Cid) ([]byte, error) //perm:read + ChainDeleteObj(ctx context.Context, obj cid.Cid) error //perm:admin + ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) //perm:read + ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (chain2.ObjStat, error) //perm:read } diff --git a/venus-shared/api/chain/v1/chain.go b/venus-shared/api/chain/v1/chain.go index d2a159c81a..18629b99c7 100644 --- a/venus-shared/api/chain/v1/chain.go +++ b/venus-shared/api/chain/v1/chain.go @@ -27,81 +27,48 @@ type IChain interface { } type IAccount interface { - // Rule[perm:read] - StateAccountKey(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (address.Address, error) + StateAccountKey(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (address.Address, error) //perm:read } type IActor interface { - // Rule[perm:read] - StateGetActor(ctx context.Context, actor address.Address, tsk chain.TipSetKey) (*chain.Actor, error) - // Rule[perm:read] - ListActor(ctx context.Context) (map[address.Address]*chain.Actor, error) + StateGetActor(ctx context.Context, actor address.Address, tsk chain.TipSetKey) (*chain.Actor, error) //perm:read + ListActor(ctx context.Context) (map[address.Address]*chain.Actor, error) //perm:read } type IBeacon interface { - // Rule[perm:read] - BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*chain.BeaconEntry, error) + BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*chain.BeaconEntry, error) //perm:read } type IChainInfo interface { - // Rule[perm:read] - BlockTime(ctx context.Context) time.Duration - // Rule[perm:read] - ChainList(ctx context.Context, tsKey chain.TipSetKey, count int) ([]chain.TipSetKey, error) - // Rule[perm:read] - ChainHead(ctx context.Context) (*chain.TipSet, error) - // Rule[perm:admin] - ChainSetHead(ctx context.Context, key chain.TipSetKey) error - // Rule[perm:read] - ChainGetTipSet(ctx context.Context, key chain.TipSetKey) (*chain.TipSet, error) - // Rule[perm:read] - ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk chain.TipSetKey) (*chain.TipSet, error) - // Rule[perm:read] - ChainGetTipSetAfterHeight(ctx context.Context, height abi.ChainEpoch, tsk chain.TipSetKey) (*chain.TipSet, error) - // Rule[perm:read] - ChainGetRandomnessFromBeacon(ctx context.Context, key chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) - // Rule[perm:read] - ChainGetRandomnessFromTickets(ctx context.Context, tsk chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) - // Rule[perm:read] - StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk chain.TipSetKey) (abi.Randomness, error) - // Rule[perm:read] - StateGetRandomnessFromBeacon(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk chain.TipSetKey) (abi.Randomness, error) - // Rule[perm:read] - ChainGetBlock(ctx context.Context, id cid.Cid) (*chain.BlockHeader, error) - // Rule[perm:read] - ChainGetMessage(ctx context.Context, msgID cid.Cid) (*chain.Message, error) - // Rule[perm:read] - ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*chain2.BlockMessages, error) - // Rule[perm:read] - ChainGetMessagesInTipset(ctx context.Context, key chain.TipSetKey) ([]chain2.Message, error) - // Rule[perm:read] - ChainGetReceipts(ctx context.Context, id cid.Cid) ([]chain.MessageReceipt, error) - // Rule[perm:read] - ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]chain2.Message, error) - // Rule[perm:read] - ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*chain.MessageReceipt, error) - // Rule[perm:read] - StateVerifiedRegistryRootKey(ctx context.Context, tsk chain.TipSetKey) (address.Address, error) - // Rule[perm:read] - StateVerifierStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) - // Rule[perm:read] - ChainNotify(ctx context.Context) (<-chan []*chain2.HeadChange, error) - // Rule[perm:read] - GetFullBlock(ctx context.Context, id cid.Cid) (*chain.FullBlock, error) - // Rule[perm:read] - GetActor(ctx context.Context, addr address.Address) (*chain.Actor, error) - // Rule[perm:read] - GetParentStateRootActor(ctx context.Context, ts *chain.TipSet, addr address.Address) (*chain.Actor, error) - // Rule[perm:read] - GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*chain.BeaconEntry, error) - // Rule[perm:read] - MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*chain2.ChainMessage, error) - // Rule[perm:read] - ProtocolParameters(ctx context.Context) (*chain2.ProtocolParams, error) - // Rule[perm:read] - ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *chain.TipSet) (address.Address, error) - // Rule[perm:read] - StateNetworkName(ctx context.Context) (chain2.NetworkName, error) + BlockTime(ctx context.Context) time.Duration //perm:read + ChainList(ctx context.Context, tsKey chain.TipSetKey, count int) ([]chain.TipSetKey, error) //perm:read + ChainHead(ctx context.Context) (*chain.TipSet, error) //perm:read + ChainSetHead(ctx context.Context, key chain.TipSetKey) error //perm:admin + ChainGetTipSet(ctx context.Context, key chain.TipSetKey) (*chain.TipSet, error) //perm:read + ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk chain.TipSetKey) (*chain.TipSet, error) //perm:read + ChainGetTipSetAfterHeight(ctx context.Context, height abi.ChainEpoch, tsk chain.TipSetKey) (*chain.TipSet, error) //perm:read + ChainGetRandomnessFromBeacon(ctx context.Context, key chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read + ChainGetRandomnessFromTickets(ctx context.Context, tsk chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read + StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk chain.TipSetKey) (abi.Randomness, error) //perm:read + StateGetRandomnessFromBeacon(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk chain.TipSetKey) (abi.Randomness, error) //perm:read + ChainGetBlock(ctx context.Context, id cid.Cid) (*chain.BlockHeader, error) //perm:read + ChainGetMessage(ctx context.Context, msgID cid.Cid) (*chain.Message, error) //perm:read + ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*chain2.BlockMessages, error) //perm:read + ChainGetMessagesInTipset(ctx context.Context, key chain.TipSetKey) ([]chain2.Message, error) //perm:read + ChainGetReceipts(ctx context.Context, id cid.Cid) ([]chain.MessageReceipt, error) //perm:read + ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]chain2.Message, error) //perm:read + ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*chain.MessageReceipt, error) //perm:read + StateVerifiedRegistryRootKey(ctx context.Context, tsk chain.TipSetKey) (address.Address, error) //perm:read + StateVerifierStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) //perm:read + ChainNotify(ctx context.Context) (<-chan []*chain2.HeadChange, error) //perm:read + GetFullBlock(ctx context.Context, id cid.Cid) (*chain.FullBlock, error) //perm:read + GetActor(ctx context.Context, addr address.Address) (*chain.Actor, error) //perm:read + GetParentStateRootActor(ctx context.Context, ts *chain.TipSet, addr address.Address) (*chain.Actor, error) //perm:read + GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*chain.BeaconEntry, error) //perm:read + MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*chain2.ChainMessage, error) //perm:read + ProtocolParameters(ctx context.Context) (*chain2.ProtocolParams, error) //perm:read + ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *chain.TipSet) (address.Address, error) //perm:read + StateNetworkName(ctx context.Context) (chain2.NetworkName, error) //perm:read // StateSearchMsg looks back up to limit epochs in the chain for a message, and returns its receipt and the tipset where it was executed // // NOTE: If a replacing message is found on chain, this method will return @@ -118,8 +85,7 @@ type IChainInfo interface { // A replacing message is a message with a different CID, any of Gas values, and // different signature, but with all other parameters matching (source/destination, // nonce, params, etc.) - // Rule[perm:read] - StateSearchMsg(ctx context.Context, from chain.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*chain2.MsgLookup, error) + StateSearchMsg(ctx context.Context, from chain.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*chain2.MsgLookup, error) //perm:read // StateWaitMsg looks back up to limit epochs in the chain for a message. // If not found, it blocks until the message arrives on chain, and gets to the // indicated confidence depth. @@ -138,77 +104,42 @@ type IChainInfo interface { // A replacing message is a message with a different CID, any of Gas values, and // different signature, but with all other parameters matching (source/destination, // nonce, params, etc.) - // Rule[perm:read] - StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*chain2.MsgLookup, error) - // Rule[perm:read] - StateNetworkVersion(ctx context.Context, tsk chain.TipSetKey) (network.Version, error) - // Rule[perm:read] - VerifyEntry(parent, child *chain.BeaconEntry, height abi.ChainEpoch) bool - // Rule[perm:read] - ChainExport(context.Context, abi.ChainEpoch, bool, chain.TipSetKey) (<-chan []byte, error) - // Rule[perm:read] - ChainGetPath(ctx context.Context, from chain.TipSetKey, to chain.TipSetKey) ([]*chain2.HeadChange, error) + StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*chain2.MsgLookup, error) //perm:read + StateNetworkVersion(ctx context.Context, tsk chain.TipSetKey) (network.Version, error) //perm:read + VerifyEntry(parent, child *chain.BeaconEntry, height abi.ChainEpoch) bool //perm:read + ChainExport(context.Context, abi.ChainEpoch, bool, chain.TipSetKey) (<-chan []byte, error) //perm:read + ChainGetPath(ctx context.Context, from chain.TipSetKey, to chain.TipSetKey) ([]*chain2.HeadChange, error) //perm:read } type IMinerState interface { - // Rule[perm:read] - StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk chain.TipSetKey) (bool, error) - // Rule[perm:read] - StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) - // Rule[perm:read] - StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorOnChainInfo, error) - // Rule[perm:read] - StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorLocation, error) - // Rule[perm:read] - StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (abi.SectorSize, error) - // Rule[perm:read] - StateMinerInfo(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (miner.MinerInfo, error) - // Rule[perm:read] - StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (address.Address, error) - // Rule[perm:read] - StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (bitfield.BitField, error) - // Rule[perm:read] - StateMinerFaults(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (bitfield.BitField, error) - // Rule[perm:read] - StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (*dline.Info, error) - // Rule[perm:read] - StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk chain.TipSetKey) ([]chain2.Partition, error) - // Rule[perm:read] - StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]chain2.Deadline, error) - // Rule[perm:read] - StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) - // Rule[perm:read] - StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk chain.TipSetKey) (*chain2.MarketDeal, error) - // Rule[perm:read] - StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) - // Rule[perm:read] - StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) - // Rule[perm:read] - StateVMCirculatingSupplyInternal(ctx context.Context, tsk chain.TipSetKey) (chain.CirculatingSupply, error) - // Rule[perm:read] - StateCirculatingSupply(ctx context.Context, tsk chain.TipSetKey) (abi.TokenAmount, error) - // Rule[perm:read] - StateMarketDeals(ctx context.Context, tsk chain.TipSetKey) (map[string]chain2.MarketDeal, error) - // Rule[perm:read] - StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) - // Rule[perm:read] - StateLookupID(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (address.Address, error) - // Rule[perm:read] - StateListMiners(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) - // Rule[perm:read] - StateListActors(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) - // Rule[perm:read] - StateMinerPower(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*chain2.MinerPower, error) - // Rule[perm:read] - StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (big.Int, error) - // Rule[perm:read] - StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorExpiration, error) - // Rule[perm:read] - StateMinerSectorCount(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (chain2.MinerSectors, error) - // Rule[perm:read] - StateMarketBalance(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (chain2.MarketBalance, error) - // Rule[perm:read] - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk chain.TipSetKey) (chain2.DealCollateralBounds, error) - // Rule[perm:read] - StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) + StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk chain.TipSetKey) (bool, error) //perm:read + StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) //perm:read + StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorOnChainInfo, error) //perm:read + StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorLocation, error) //perm:read + StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (abi.SectorSize, error) //perm:read + StateMinerInfo(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (miner.MinerInfo, error) //perm:read + StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (address.Address, error) //perm:read + StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (bitfield.BitField, error) //perm:read + StateMinerFaults(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (bitfield.BitField, error) //perm:read + StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (*dline.Info, error) //perm:read + StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk chain.TipSetKey) ([]chain2.Partition, error) //perm:read + StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]chain2.Deadline, error) //perm:read + StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) //perm:read + StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk chain.TipSetKey) (*chain2.MarketDeal, error) //perm:read + StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) //perm:read + StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) //perm:read + StateVMCirculatingSupplyInternal(ctx context.Context, tsk chain.TipSetKey) (chain.CirculatingSupply, error) //perm:read + StateCirculatingSupply(ctx context.Context, tsk chain.TipSetKey) (abi.TokenAmount, error) //perm:read + StateMarketDeals(ctx context.Context, tsk chain.TipSetKey) (map[string]chain2.MarketDeal, error) //perm:read + StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) //perm:read + StateLookupID(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (address.Address, error) //perm:read + StateListMiners(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) //perm:read + StateListActors(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) //perm:read + StateMinerPower(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*chain2.MinerPower, error) //perm:read + StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (big.Int, error) //perm:read + StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorExpiration, error) //perm:read + StateMinerSectorCount(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (chain2.MinerSectors, error) //perm:read + StateMarketBalance(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (chain2.MarketBalance, error) //perm:read + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk chain.TipSetKey) (chain2.DealCollateralBounds, error) //perm:read + StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) //perm:read } diff --git a/venus-shared/api/chain/v1/fullnode.go b/venus-shared/api/chain/v1/fullnode.go index 25b7743348..aad482dd0a 100644 --- a/venus-shared/api/chain/v1/fullnode.go +++ b/venus-shared/api/chain/v1/fullnode.go @@ -1,16 +1,3 @@ -/* -in api interface, you can add comment tags to the function -Note: -Rule[perm:admin,ignore:true] -perm: read,write,sign,admin -jwt token permission check -ignore: bool -the func in the api whether needs to be added to the client for external exposure - -TODO: -1. Support global FUNC injection - -*/ package v1 //go:generate go run github.com/golang/mock/mockgen@v1.6.0 -destination=./mock/full.go -package=mock . FullNode diff --git a/venus-shared/api/chain/v1/jwtauth.go b/venus-shared/api/chain/v1/jwtauth.go index d2c24ca86f..5b412252a1 100644 --- a/venus-shared/api/chain/v1/jwtauth.go +++ b/venus-shared/api/chain/v1/jwtauth.go @@ -7,8 +7,6 @@ import ( ) type IJwtAuthAPI interface { - // Rule[perm:read] - Verify(ctx context.Context, host, token string) ([]auth.Permission, error) - // Rule[perm:admin] - AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) + Verify(ctx context.Context, host, token string) ([]auth.Permission, error) //perm:read + AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) //perm:admin } diff --git a/venus-shared/api/chain/v1/market.go b/venus-shared/api/chain/v1/market.go index fc0119d888..c6c3e0cee3 100644 --- a/venus-shared/api/chain/v1/market.go +++ b/venus-shared/api/chain/v1/market.go @@ -8,6 +8,5 @@ import ( ) type IMarket interface { - // Rule[perm:read] - StateMarketParticipants(ctx context.Context, tsk chain.TipSetKey) (map[string]chain2.MarketBalance, error) //perm:admin + StateMarketParticipants(ctx context.Context, tsk chain.TipSetKey) (map[string]chain2.MarketBalance, error) //perm:read } diff --git a/venus-shared/api/chain/v1/mining.go b/venus-shared/api/chain/v1/mining.go index abbebb9da9..d881a2d4a2 100644 --- a/venus-shared/api/chain/v1/mining.go +++ b/venus-shared/api/chain/v1/mining.go @@ -11,8 +11,6 @@ import ( ) type IMining interface { - // Rule[perm:read] - MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk chain.TipSetKey) (*chain2.MiningBaseInfo, error) - // Rule[perm:write] - MinerCreateBlock(ctx context.Context, bt *chain2.BlockTemplate) (*chain.BlockMsg, error) + MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk chain.TipSetKey) (*chain2.MiningBaseInfo, error) //perm:read + MinerCreateBlock(ctx context.Context, bt *chain2.BlockTemplate) (*chain.BlockMsg, error) //perm:write } diff --git a/venus-shared/api/chain/v1/mpool.go b/venus-shared/api/chain/v1/mpool.go index 0d16538217..584239f18f 100644 --- a/venus-shared/api/chain/v1/mpool.go +++ b/venus-shared/api/chain/v1/mpool.go @@ -13,57 +13,32 @@ import ( ) type IMessagePool interface { - // Rule[perm:admin] - MpoolDeleteByAdress(ctx context.Context, addr address.Address) error - // Rule[perm:write] - MpoolPublishByAddr(context.Context, address.Address) error - // Rule[perm:write] - MpoolPublishMessage(ctx context.Context, smsg *chain.SignedMessage) error - // Rule[perm:write] - MpoolPush(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) - // Rule[perm:read] - MpoolGetConfig(context.Context) (*messagepool.MpoolConfig, error) - // Rule[perm:admin] - MpoolSetConfig(ctx context.Context, cfg *messagepool.MpoolConfig) error - // Rule[perm:read] - MpoolSelect(context.Context, chain.TipSetKey, float64) ([]*chain.SignedMessage, error) - // Rule[perm:read] - MpoolSelects(context.Context, chain.TipSetKey, []float64) ([][]*chain.SignedMessage, error) - // Rule[perm:read] - MpoolPending(ctx context.Context, tsk chain.TipSetKey) ([]*chain.SignedMessage, error) - // Rule[perm:write] - MpoolClear(ctx context.Context, local bool) error - // Rule[perm:write] - MpoolPushUntrusted(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) - // Rule[perm:sign] - MpoolPushMessage(ctx context.Context, msg *chain.Message, spec *chain2.MessageSendSpec) (*chain.SignedMessage, error) - // Rule[perm:write] - MpoolBatchPush(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) - // Rule[perm:write] - MpoolBatchPushUntrusted(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) - // Rule[perm:sign] - MpoolBatchPushMessage(ctx context.Context, msgs []*chain.Message, spec *chain2.MessageSendSpec) ([]*chain.SignedMessage, error) - // Rule[perm:read] - MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) - // Rule[perm:read] - MpoolSub(ctx context.Context) (<-chan messagepool.MpoolUpdate, error) - // Rule[perm:read] - GasEstimateMessageGas(ctx context.Context, msg *chain.Message, spec *chain2.MessageSendSpec, tsk chain.TipSetKey) (*chain.Message, error) - // Rule[perm:read] - GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*chain2.EstimateMessage, fromNonce uint64, tsk chain.TipSetKey) ([]*chain2.EstimateResult, error) - // Rule[perm:read] - GasEstimateFeeCap(ctx context.Context, msg *chain.Message, maxqueueblks int64, tsk chain.TipSetKey) (big.Int, error) - // Rule[perm:read] - GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk chain.TipSetKey) (big.Int, error) - // Rule[perm:read] - GasEstimateGasLimit(ctx context.Context, msgIn *chain.Message, tsk chain.TipSetKey) (int64, error) + MpoolDeleteByAdress(ctx context.Context, addr address.Address) error //perm:admin + MpoolPublishByAddr(context.Context, address.Address) error //perm:write + MpoolPublishMessage(ctx context.Context, smsg *chain.SignedMessage) error //perm:write + MpoolPush(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) //perm:write + MpoolGetConfig(context.Context) (*messagepool.MpoolConfig, error) //perm:read + MpoolSetConfig(ctx context.Context, cfg *messagepool.MpoolConfig) error //perm:admin + MpoolSelect(context.Context, chain.TipSetKey, float64) ([]*chain.SignedMessage, error) //perm:read + MpoolSelects(context.Context, chain.TipSetKey, []float64) ([][]*chain.SignedMessage, error) //perm:read + MpoolPending(ctx context.Context, tsk chain.TipSetKey) ([]*chain.SignedMessage, error) //perm:read + MpoolClear(ctx context.Context, local bool) error //perm:write + MpoolPushUntrusted(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) //perm:write + MpoolPushMessage(ctx context.Context, msg *chain.Message, spec *chain2.MessageSendSpec) (*chain.SignedMessage, error) //perm:sign + MpoolBatchPush(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) //perm:write + MpoolBatchPushUntrusted(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) //perm:write + MpoolBatchPushMessage(ctx context.Context, msgs []*chain.Message, spec *chain2.MessageSendSpec) ([]*chain.SignedMessage, error) //perm:sign + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) //perm:read + MpoolSub(ctx context.Context) (<-chan messagepool.MpoolUpdate, error) //perm:read + GasEstimateMessageGas(ctx context.Context, msg *chain.Message, spec *chain2.MessageSendSpec, tsk chain.TipSetKey) (*chain.Message, error) //perm:read + GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*chain2.EstimateMessage, fromNonce uint64, tsk chain.TipSetKey) ([]*chain2.EstimateResult, error) //perm:read + GasEstimateFeeCap(ctx context.Context, msg *chain.Message, maxqueueblks int64, tsk chain.TipSetKey) (big.Int, error) //perm:read + GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk chain.TipSetKey) (big.Int, error) //perm:read + GasEstimateGasLimit(ctx context.Context, msgIn *chain.Message, tsk chain.TipSetKey) (int64, error) //perm:read // MpoolCheckMessages performs logical checks on a batch of messages - // Rule[perm:read] - MpoolCheckMessages(ctx context.Context, protos []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) + MpoolCheckMessages(ctx context.Context, protos []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) //perm:read // MpoolCheckPendingMessages performs logical checks for all pending messages from a given address - // Rule[perm:read] - MpoolCheckPendingMessages(ctx context.Context, addr address.Address) ([][]messagepool.MessageCheckStatus, error) + MpoolCheckPendingMessages(ctx context.Context, addr address.Address) ([][]messagepool.MessageCheckStatus, error) //perm:read // MpoolCheckReplaceMessages performs logical checks on pending messages with replacement - // Rule[perm:read] - MpoolCheckReplaceMessages(ctx context.Context, msg []*chain.Message) ([][]messagepool.MessageCheckStatus, error) + MpoolCheckReplaceMessages(ctx context.Context, msg []*chain.Message) ([][]messagepool.MessageCheckStatus, error) //perm:read } diff --git a/venus-shared/api/chain/v1/multisig.go b/venus-shared/api/chain/v1/multisig.go index 41b8a6f198..e72eac71fb 100644 --- a/venus-shared/api/chain/v1/multisig.go +++ b/venus-shared/api/chain/v1/multisig.go @@ -11,30 +11,17 @@ import ( ) type IMultiSig interface { - // Rule[perm:sign] - MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val chain.BigInt, src address.Address, gp chain.BigInt) (*messagepool.MessagePrototype, error) - // Rule[perm:sign] - MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) - // Rule[perm:sign] - MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) - // Rule[perm:sign] - MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) - // Rule[perm:sign] - MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) - // Rule[perm:sign] - MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) - // Rule[perm:sign] - MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) - // Rule[perm:sign] - MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) - // Rule[perm:sign] - MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) - // Rule[perm:sign] - MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) - // Rule[perm:sign] - MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) - // Rule[perm:sign] - MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*messagepool.MessagePrototype, error) - // Rule[perm:read] - MsigGetVested(ctx context.Context, addr address.Address, start chain.TipSetKey, end chain.TipSetKey) (chain.BigInt, error) + MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val chain.BigInt, src address.Address, gp chain.BigInt) (*messagepool.MessagePrototype, error) //perm:sign + MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) //perm:sign + MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) //perm:sign + MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) //perm:sign + MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) //perm:sign + MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) //perm:sign + MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) //perm:sign + MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) //perm:sign + MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) //perm:sign + MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) //perm:sign + MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) //perm:sign + MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*messagepool.MessagePrototype, error) //perm:sign + MsigGetVested(ctx context.Context, addr address.Address, start chain.TipSetKey, end chain.TipSetKey) (chain.BigInt, error) //perm:read } diff --git a/venus-shared/api/chain/v1/network.go b/venus-shared/api/chain/v1/network.go index 5935fc53de..1b1d291491 100644 --- a/venus-shared/api/chain/v1/network.go +++ b/venus-shared/api/chain/v1/network.go @@ -13,24 +13,14 @@ import ( ) type INetwork interface { - // Rule[perm:admin] - NetworkGetBandwidthStats(ctx context.Context) metrics.Stats - // Rule[perm:admin] - NetworkGetPeerAddresses(ctx context.Context) []ma.Multiaddr - // Rule[perm:admin] - NetworkGetPeerID(ctx context.Context) peer.ID - // Rule[perm:read] - NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo - // Rule[perm:read] - NetworkGetClosestPeers(ctx context.Context, key string) (<-chan peer.ID, error) - // Rule[perm:read] - NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) - // Rule[perm:read] - NetworkConnect(ctx context.Context, addrs []string) (<-chan net.ConnectionResult, error) - // Rule[perm:read] - NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) - // Rule[perm:read] - Version(context.Context) (chain2.Version, error) - // Rule[perm:read] - NetAddrsListen(context.Context) (peer.AddrInfo, error) + NetworkGetBandwidthStats(ctx context.Context) metrics.Stats //perm:admin + NetworkGetPeerAddresses(ctx context.Context) []ma.Multiaddr //perm:admin + NetworkGetPeerID(ctx context.Context) peer.ID //perm:admin + NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo //perm:read + NetworkGetClosestPeers(ctx context.Context, key string) (<-chan peer.ID, error) //perm:read + NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) //perm:read + NetworkConnect(ctx context.Context, addrs []string) (<-chan net.ConnectionResult, error) //perm:read + NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) //perm:read + Version(context.Context) (chain2.Version, error) //perm:read + NetAddrsListen(context.Context) (peer.AddrInfo, error) //perm:read } diff --git a/venus-shared/api/chain/v1/paych.go b/venus-shared/api/chain/v1/paych.go index c02d557f06..f726bcc1b5 100644 --- a/venus-shared/api/chain/v1/paych.go +++ b/venus-shared/api/chain/v1/paych.go @@ -16,68 +16,55 @@ type IPaychan interface { // @from: the payment channel sender // @to: the payment channel recipient // @amt: the deposits funds in the payment channel - // Rule[perm:sign] - PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*paych.ChannelInfo, error) + PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*paych.ChannelInfo, error) //perm:sign // PaychAvailableFunds get the status of an outbound payment channel // @pch: payment channel address - // Rule[perm:sign] - PaychAvailableFunds(ctx context.Context, ch address.Address) (*chain2.ChannelAvailableFunds, error) + PaychAvailableFunds(ctx context.Context, ch address.Address) (*chain2.ChannelAvailableFunds, error) //perm:sign // PaychAvailableFundsByFromTo get the status of an outbound payment channel // @from: the payment channel sender // @to: he payment channel recipient - // Rule[perm:sign] - PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*chain2.ChannelAvailableFunds, error) + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*chain2.ChannelAvailableFunds, error) //perm:sign // PaychGetWaitReady waits until the create channel / add funds message with the sentinel // @sentinel: given message CID arrives. // @ch: the returned channel address can safely be used against the Manager methods. - // Rule[perm:sign] - PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (address.Address, error) + PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (address.Address, error) //perm:sign // PaychAllocateLane Allocate late creates a lane within a payment channel so that calls to // CreatePaymentVoucher will automatically make vouchers only for the difference in total - // Rule[perm:sign] - PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) + PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) //perm:sign // PaychNewPayment aggregate vouchers into a new lane // @from: the payment channel sender // @to: the payment channel recipient // @vouchers: the outstanding (non-redeemed) vouchers - // Rule[perm:sign] - PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []paych.VoucherSpec) (*paych.PaymentInfo, error) + PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []paych.VoucherSpec) (*paych.PaymentInfo, error) //perm:sign // PaychList list the addresses of all channels that have been created - // Rule[perm:read] - PaychList(ctx context.Context) ([]address.Address, error) + PaychList(ctx context.Context) ([]address.Address, error) //perm:read // PaychStatus get the payment channel status // @pch: payment channel address - // Rule[perm:read] - PaychStatus(ctx context.Context, pch address.Address) (*paych.Status, error) + PaychStatus(ctx context.Context, pch address.Address) (*paych.Status, error) //perm:read // PaychSettle update payment channel status to settle // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain // @pch: payment channel address - // Rule[perm:sign] - PaychSettle(ctx context.Context, addr address.Address) (cid.Cid, error) + PaychSettle(ctx context.Context, addr address.Address) (cid.Cid, error) //perm:sign // PaychCollect update payment channel status to collect // Collect sends the value of submitted vouchers to the channel recipient (the provider), // and refunds the remaining channel balance to the channel creator (the client). // @pch: payment channel address - // Rule[perm:sign] - PaychCollect(ctx context.Context, addr address.Address) (cid.Cid, error) + PaychCollect(ctx context.Context, addr address.Address) (cid.Cid, error) //perm:sign // PaychVoucherCheckValid checks if the given voucher is valid (is or could become spendable at some point). // If the channel is not in the store, fetches the channel from state (and checks that // the channel To address is owned by the wallet). // @pch: payment channel address // @sv: voucher - // Rule[perm:read] - PaychVoucherCheckValid(ctx context.Context, ch address.Address, sv *paych.SignedVoucher) error + PaychVoucherCheckValid(ctx context.Context, ch address.Address, sv *paych.SignedVoucher) error //perm:read // PaychVoucherCheckSpendable checks if the given voucher is currently spendable // @pch: payment channel address // @sv: voucher - // Rule[perm:read] - PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (bool, error) + PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (bool, error) //perm:read // PaychVoucherAdd adds a voucher for an inbound channel. // If the channel is not in the store, fetches the channel from state (and checks that // the channel To address is owned by the wallet). - // Rule[perm:write] - PaychVoucherAdd(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) + PaychVoucherAdd(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) //perm:write // PaychVoucherCreate creates a new signed voucher on the given payment channel // with the given lane and amount. The value passed in is exactly the value // that will be used to create the voucher, so if previous vouchers exist, the @@ -85,15 +72,12 @@ type IPaychan interface { // the two. // If there are insufficient funds in the channel to create the voucher, // returns a nil voucher and the shortfall. - // Rule[perm:sign] - PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paych.VoucherCreateResult, error) + PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paych.VoucherCreateResult, error) //perm:sign // PaychVoucherList list vouchers in payment channel // @pch: payment channel address - // Rule[perm:write] - PaychVoucherList(ctx context.Context, pch address.Address) ([]*paych.SignedVoucher, error) + PaychVoucherList(ctx context.Context, pch address.Address) ([]*paych.SignedVoucher, error) //perm:write // PaychVoucherSubmit Submit voucher to chain to update payment channel state // @pch: payment channel address // @sv: voucher in payment channel - // Rule[perm:sign] - PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) + PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) //perm:sign } diff --git a/venus-shared/api/chain/v1/syncer.go b/venus-shared/api/chain/v1/syncer.go index 7d9a434fbb..560e4ededa 100644 --- a/venus-shared/api/chain/v1/syncer.go +++ b/venus-shared/api/chain/v1/syncer.go @@ -10,20 +10,12 @@ import ( ) type ISyncer interface { - // Rule[perm:write] - ChainSyncHandleNewTipSet(ctx context.Context, ci *chain.ChainInfo) error - // Rule[perm:admin] - SetConcurrent(ctx context.Context, concurrent int64) error - // Rule[perm:read] - SyncerTracker(ctx context.Context) *chain2.TargetTracker - // Rule[perm:read] - Concurrent(ctx context.Context) int64 - // Rule[perm:read] - ChainTipSetWeight(ctx context.Context, tsk chain.TipSetKey) (big.Int, error) - // Rule[perm:write] - SyncSubmitBlock(ctx context.Context, blk *chain.BlockMsg) error - // Rule[perm:read] - StateCall(ctx context.Context, msg *chain.Message, tsk chain.TipSetKey) (*chain2.InvocResult, error) - // Rule[perm:read] - SyncState(ctx context.Context) (*chain2.SyncState, error) + ChainSyncHandleNewTipSet(ctx context.Context, ci *chain.ChainInfo) error //perm:write + SetConcurrent(ctx context.Context, concurrent int64) error //perm:admin + SyncerTracker(ctx context.Context) *chain2.TargetTracker //perm:read + Concurrent(ctx context.Context) int64 //perm:read + ChainTipSetWeight(ctx context.Context, tsk chain.TipSetKey) (big.Int, error) //perm:read + SyncSubmitBlock(ctx context.Context, blk *chain.BlockMsg) error //perm:write + StateCall(ctx context.Context, msg *chain.Message, tsk chain.TipSetKey) (*chain2.InvocResult, error) //perm:read + SyncState(ctx context.Context) (*chain2.SyncState, error) //perm:read } diff --git a/venus-shared/api/chain/v1/wallet.go b/venus-shared/api/chain/v1/wallet.go index 8c24d740a4..42c1c5dd6e 100644 --- a/venus-shared/api/chain/v1/wallet.go +++ b/venus-shared/api/chain/v1/wallet.go @@ -12,34 +12,19 @@ import ( ) type IWallet interface { - // Rule[perm:sign] - WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) - // Rule[perm:admin] - WalletExport(addr address.Address, password string) (*wallet.KeyInfo, error) - // Rule[perm:admin] - WalletImport(key *wallet.KeyInfo) (address.Address, error) - // Rule[perm:write] - WalletHas(ctx context.Context, addr address.Address) (bool, error) - // Rule[perm:write] - WalletNewAddress(protocol address.Protocol) (address.Address, error) - // Rule[perm:read] - WalletBalance(ctx context.Context, addr address.Address) (abi.TokenAmount, error) //not exists in remote - // Rule[perm:write] - WalletDefaultAddress(ctx context.Context) (address.Address, error) //not exists in remote - // Rule[perm:admin] - WalletAddresses(ctx context.Context) []address.Address - // Rule[perm:write] - WalletSetDefault(ctx context.Context, addr address.Address) error //not exists in remote - // Rule[perm:sign] - WalletSignMessage(ctx context.Context, k address.Address, msg *chain.Message) (*chain.SignedMessage, error) - // Rule[perm:admin] - LockWallet(ctx context.Context) error - // Rule[perm:admin] - UnLockWallet(ctx context.Context, password []byte) error - // Rule[perm:admin] - SetPassword(Context context.Context, password []byte) error - // Rule[perm:admin] - HasPassword(Context context.Context) bool - // Rule[perm:admin] - WalletState(Context context.Context) int + WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) //perm:sign + WalletExport(addr address.Address, password string) (*wallet.KeyInfo, error) //perm:admin + WalletImport(key *wallet.KeyInfo) (address.Address, error) //perm:admin + WalletHas(ctx context.Context, addr address.Address) (bool, error) //perm:write + WalletNewAddress(protocol address.Protocol) (address.Address, error) //perm:write + WalletBalance(ctx context.Context, addr address.Address) (abi.TokenAmount, error) //perm:read + WalletDefaultAddress(ctx context.Context) (address.Address, error) //perm:write + WalletAddresses(ctx context.Context) []address.Address //perm:admin + WalletSetDefault(ctx context.Context, addr address.Address) error //perm:write + WalletSignMessage(ctx context.Context, k address.Address, msg *chain.Message) (*chain.SignedMessage, error) //perm:sign + LockWallet(ctx context.Context) error //perm:admin + UnLockWallet(ctx context.Context, password []byte) error //perm:admin + SetPassword(Context context.Context, password []byte) error //perm:admin + HasPassword(Context context.Context) bool //perm:admin + WalletState(Context context.Context) int //perm:admin } diff --git a/venus-shared/api/proxy_util.go b/venus-shared/api/proxy_util.go new file mode 100644 index 0000000000..ba94a9e5dc --- /dev/null +++ b/venus-shared/api/proxy_util.go @@ -0,0 +1,30 @@ +package api + +import "reflect" + +var _internalField = "Internal" + +// GetInternalStructs extracts all pointers to 'Internal' sub-structs from the provided pointer to a proxy struct +func GetInternalStructs(in interface{}) []interface{} { + return getInternalStructs(reflect.ValueOf(in).Elem()) +} + +func getInternalStructs(rv reflect.Value) []interface{} { + var out []interface{} + + internal := rv.FieldByName(_internalField) + ii := internal.Addr().Interface() + out = append(out, ii) + + for i := 0; i < rv.NumField(); i++ { + if rv.Type().Field(i).Name == _internalField { + continue + } + + sub := getInternalStructs(rv.Field(i)) + + out = append(out, sub...) + } + + return out +} diff --git a/venus-shared/api/proxy_util_test.go b/venus-shared/api/proxy_util_test.go new file mode 100644 index 0000000000..3cbc466b6a --- /dev/null +++ b/venus-shared/api/proxy_util_test.go @@ -0,0 +1,62 @@ +package api + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +type StrA struct { + StrB + + Internal struct { + A int + } +} + +type StrB struct { + Internal struct { + B int + } +} + +type StrC struct { + Internal struct { + Internal struct { + C int + } + } +} + +func TestGetInternalStructs(t *testing.T) { + var proxy StrA + + sts := GetInternalStructs(&proxy) + require.Len(t, sts, 2) + + sa := sts[0].(*struct{ A int }) + sa.A = 3 + sb := sts[1].(*struct{ B int }) + sb.B = 4 + + require.Equal(t, 3, proxy.Internal.A) + require.Equal(t, 4, proxy.StrB.Internal.B) +} + +func TestNestedInternalStructs(t *testing.T) { + var proxy StrC + + // check that only the top-level internal struct gets picked up + + sts := GetInternalStructs(&proxy) + require.Len(t, sts, 1) + + sa := sts[0].(*struct { + Internal struct { + C int + } + }) + sa.Internal.C = 5 + + require.Equal(t, 5, proxy.Internal.Internal.C) +} From d4a911eb15c7abf635d44bae5e1092d0a17f9f3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E9=A1=B5=E7=B4=A0=E4=B9=A6?= <2931107265@qq.com> Date: Mon, 6 Dec 2021 16:31:04 +0800 Subject: [PATCH 085/167] specactors: pull in lotus upgrade --- .gitignore | 3 + go.mod | 1 + go.sum | 1 - .../specactors/builtin/account/account.go | 54 +- .../builtin/account/actor.go.template | 16 +- .../builtin/account/state.go.template | 2 + pkg/types/specactors/builtin/account/v0.go | 6 +- pkg/types/specactors/builtin/account/v2.go | 6 +- pkg/types/specactors/builtin/account/v3.go | 6 +- pkg/types/specactors/builtin/account/v4.go | 6 +- pkg/types/specactors/builtin/account/v5.go | 6 +- pkg/types/specactors/builtin/account/v6.go | 6 +- pkg/types/specactors/builtin/account/v7.go | 42 + pkg/types/specactors/builtin/builtin.go | 475 ++++++----- .../specactors/builtin/builtin.go.template | 15 +- .../specactors/builtin/cron/actor.go.template | 12 +- pkg/types/specactors/builtin/cron/cron.go | 50 +- .../specactors/builtin/cron/state.go.template | 2 + pkg/types/specactors/builtin/cron/v0.go | 4 +- pkg/types/specactors/builtin/cron/v2.go | 4 +- pkg/types/specactors/builtin/cron/v3.go | 4 +- pkg/types/specactors/builtin/cron/v4.go | 4 +- pkg/types/specactors/builtin/cron/v5.go | 4 +- pkg/types/specactors/builtin/cron/v6.go | 4 +- pkg/types/specactors/builtin/cron/v7.go | 37 + .../specactors/builtin/init/actor.go.template | 17 +- pkg/types/specactors/builtin/init/diff.go | 151 ---- pkg/types/specactors/builtin/init/init.go | 59 +- .../specactors/builtin/init/state.go.template | 5 +- pkg/types/specactors/builtin/init/v0.go | 23 +- pkg/types/specactors/builtin/init/v2.go | 23 +- pkg/types/specactors/builtin/init/v3.go | 23 +- pkg/types/specactors/builtin/init/v4.go | 23 +- pkg/types/specactors/builtin/init/v5.go | 23 +- pkg/types/specactors/builtin/init/v6.go | 23 +- pkg/types/specactors/builtin/init/v7.go | 118 +++ .../builtin/market/actor.go.template | 23 +- pkg/types/specactors/builtin/market/diff.go | 91 -- pkg/types/specactors/builtin/market/market.go | 134 +-- .../builtin/market/state.go.template | 11 +- pkg/types/specactors/builtin/market/v0.go | 40 +- pkg/types/specactors/builtin/market/v2.go | 40 +- pkg/types/specactors/builtin/market/v3.go | 32 +- pkg/types/specactors/builtin/market/v4.go | 32 +- pkg/types/specactors/builtin/market/v5.go | 32 +- pkg/types/specactors/builtin/market/v6.go | 30 +- pkg/types/specactors/builtin/market/v7.go | 254 ++++++ .../builtin/miner/actor.go.template | 17 +- pkg/types/specactors/builtin/miner/diff.go | 127 --- .../builtin/miner/diff_deadlines.go | 176 ---- pkg/types/specactors/builtin/miner/miner.go | 63 +- .../builtin/miner/state.go.template | 25 +- pkg/types/specactors/builtin/miner/utils.go | 69 -- pkg/types/specactors/builtin/miner/v0.go | 38 +- pkg/types/specactors/builtin/miner/v2.go | 70 +- pkg/types/specactors/builtin/miner/v3.go | 70 +- pkg/types/specactors/builtin/miner/v4.go | 70 +- pkg/types/specactors/builtin/miner/v5.go | 70 +- pkg/types/specactors/builtin/miner/v6.go | 70 +- pkg/types/specactors/builtin/miner/v7.go | 575 +++++++++++++ .../builtin/multisig/actor.go.template | 30 +- pkg/types/specactors/builtin/multisig/diff.go | 133 --- .../builtin/multisig/message.go.template | 32 +- .../specactors/builtin/multisig/message0.go | 35 +- .../specactors/builtin/multisig/message2.go | 16 +- .../specactors/builtin/multisig/message3.go | 16 +- .../specactors/builtin/multisig/message4.go | 16 +- .../specactors/builtin/multisig/message5.go | 16 +- .../specactors/builtin/multisig/message6.go | 16 +- .../specactors/builtin/multisig/message7.go | 75 ++ .../specactors/builtin/multisig/multisig.go | 95 ++- .../builtin/multisig/state.go.template | 2 + pkg/types/specactors/builtin/multisig/v0.go | 17 +- pkg/types/specactors/builtin/multisig/v2.go | 17 +- pkg/types/specactors/builtin/multisig/v3.go | 17 +- pkg/types/specactors/builtin/multisig/v4.go | 17 +- pkg/types/specactors/builtin/multisig/v5.go | 17 +- pkg/types/specactors/builtin/multisig/v6.go | 17 +- pkg/types/specactors/builtin/multisig/v7.go | 122 +++ .../builtin/paych/actor.go.template | 28 +- .../builtin/paych/message.go.template | 28 +- .../specactors/builtin/paych/message0.go | 28 +- .../specactors/builtin/paych/message2.go | 28 +- .../specactors/builtin/paych/message3.go | 28 +- .../specactors/builtin/paych/message4.go | 28 +- .../specactors/builtin/paych/message5.go | 28 +- .../specactors/builtin/paych/message6.go | 28 +- .../specactors/builtin/paych/message7.go | 76 ++ .../specactors/builtin/paych/mock/mock.go | 13 +- pkg/types/specactors/builtin/paych/paych.go | 81 +- .../builtin/paych/state.go.template | 2 + pkg/types/specactors/builtin/paych/v0.go | 2 + pkg/types/specactors/builtin/paych/v2.go | 2 + pkg/types/specactors/builtin/paych/v3.go | 2 + pkg/types/specactors/builtin/paych/v4.go | 2 + pkg/types/specactors/builtin/paych/v5.go | 2 + pkg/types/specactors/builtin/paych/v6.go | 2 + pkg/types/specactors/builtin/paych/v7.go | 116 +++ .../builtin/power/actor.go.template | 16 +- pkg/types/specactors/builtin/power/diff.go | 116 --- pkg/types/specactors/builtin/power/power.go | 58 +- .../builtin/power/state.go.template | 2 + pkg/types/specactors/builtin/power/v0.go | 24 +- pkg/types/specactors/builtin/power/v2.go | 24 +- pkg/types/specactors/builtin/power/v3.go | 16 +- pkg/types/specactors/builtin/power/v4.go | 16 +- pkg/types/specactors/builtin/power/v5.go | 16 +- pkg/types/specactors/builtin/power/v6.go | 16 +- pkg/types/specactors/builtin/power/v7.go | 191 +++++ .../builtin/reward/actor.go.template | 16 +- pkg/types/specactors/builtin/reward/reward.go | 58 +- .../builtin/reward/state.go.template | 2 + pkg/types/specactors/builtin/reward/v0.go | 2 + pkg/types/specactors/builtin/reward/v2.go | 4 +- pkg/types/specactors/builtin/reward/v3.go | 4 +- pkg/types/specactors/builtin/reward/v4.go | 4 +- pkg/types/specactors/builtin/reward/v5.go | 4 +- pkg/types/specactors/builtin/reward/v6.go | 4 +- pkg/types/specactors/builtin/reward/v7.go | 100 +++ .../builtin/system/actor.go.template | 12 +- .../builtin/system/state.go.template | 2 + pkg/types/specactors/builtin/system/system.go | 48 +- pkg/types/specactors/builtin/system/v0.go | 4 +- pkg/types/specactors/builtin/system/v2.go | 4 +- pkg/types/specactors/builtin/system/v3.go | 4 +- pkg/types/specactors/builtin/system/v4.go | 4 +- pkg/types/specactors/builtin/system/v5.go | 4 +- pkg/types/specactors/builtin/system/v6.go | 4 +- pkg/types/specactors/builtin/system/v7.go | 37 + .../builtin/verifreg/actor.go.template | 16 +- .../builtin/verifreg/state.go.template | 12 +- pkg/types/specactors/builtin/verifreg/util.go | 53 -- pkg/types/specactors/builtin/verifreg/v0.go | 30 +- pkg/types/specactors/builtin/verifreg/v2.go | 30 +- pkg/types/specactors/builtin/verifreg/v3.go | 30 +- pkg/types/specactors/builtin/verifreg/v4.go | 30 +- pkg/types/specactors/builtin/verifreg/v5.go | 30 +- pkg/types/specactors/builtin/verifreg/v6.go | 30 +- pkg/types/specactors/builtin/verifreg/v7.go | 77 ++ .../specactors/builtin/verifreg/verifreg.go | 59 +- pkg/types/specactors/params.go | 7 +- pkg/types/specactors/policy/policy.go | 799 +++++++++++------- .../specactors/policy/policy.go.template | 3 +- pkg/types/specactors/policy/policy_test.go | 4 +- pkg/types/specactors/version.go | 21 +- 145 files changed, 4143 insertions(+), 2551 deletions(-) create mode 100644 pkg/types/specactors/builtin/account/v7.go create mode 100644 pkg/types/specactors/builtin/cron/v7.go delete mode 100644 pkg/types/specactors/builtin/init/diff.go create mode 100644 pkg/types/specactors/builtin/init/v7.go delete mode 100644 pkg/types/specactors/builtin/market/diff.go create mode 100644 pkg/types/specactors/builtin/market/v7.go delete mode 100644 pkg/types/specactors/builtin/miner/diff.go delete mode 100644 pkg/types/specactors/builtin/miner/diff_deadlines.go delete mode 100644 pkg/types/specactors/builtin/miner/utils.go create mode 100644 pkg/types/specactors/builtin/miner/v7.go delete mode 100644 pkg/types/specactors/builtin/multisig/diff.go create mode 100644 pkg/types/specactors/builtin/multisig/message7.go create mode 100644 pkg/types/specactors/builtin/multisig/v7.go create mode 100644 pkg/types/specactors/builtin/paych/message7.go create mode 100644 pkg/types/specactors/builtin/paych/v7.go delete mode 100644 pkg/types/specactors/builtin/power/diff.go create mode 100644 pkg/types/specactors/builtin/power/v7.go create mode 100644 pkg/types/specactors/builtin/reward/v7.go create mode 100644 pkg/types/specactors/builtin/system/v7.go delete mode 100644 pkg/types/specactors/builtin/verifreg/util.go create mode 100644 pkg/types/specactors/builtin/verifreg/v7.go diff --git a/.gitignore b/.gitignore index 65d96bb91b..ad74358989 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,9 @@ tools/chain-util/chain-util .DS_Store **/.DS_Store +// venus-dev-tool +venus-dev-tool + // IDE (vscode) .vscode debug.test diff --git a/go.mod b/go.mod index 98c80267b1..25ac28ed26 100644 --- a/go.mod +++ b/go.mod @@ -40,6 +40,7 @@ require ( github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 + github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578 diff --git a/go.sum b/go.sum index db9db6dc06..710beb43e8 100644 --- a/go.sum +++ b/go.sum @@ -497,7 +497,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= diff --git a/pkg/types/specactors/builtin/account/account.go b/pkg/types/specactors/builtin/account/account.go index 6ca5addf70..1f42a62721 100644 --- a/pkg/types/specactors/builtin/account/account.go +++ b/pkg/types/specactors/builtin/account/account.go @@ -1,16 +1,18 @@ +// FETCHED FROM LOTUS: builtin/account/actor.go.template + package account import ( - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/cbor" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/types/internal" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + types "github.com/filecoin-project/venus/pkg/types/internal" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -23,6 +25,9 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + ) func init() { @@ -50,11 +55,15 @@ func init() { builtin.RegisterActorState(builtin6.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var Methods = builtin4.MethodsAccount -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { case builtin0.AccountActorCodeID: @@ -75,56 +84,65 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { case builtin6.AccountActorCodeID: return load6(store, act.Head) + case builtin7.AccountActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version, addr address.Address) (State, error) { +func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, error) { switch av { - case specactors.Version0: + case actors.Version0: return make0(store, addr) - case specactors.Version2: + case actors.Version2: return make2(store, addr) - case specactors.Version3: + case actors.Version3: return make3(store, addr) - case specactors.Version4: + case actors.Version4: return make4(store, addr) - case specactors.Version5: + case actors.Version5: return make5(store, addr) - case specactors.Version6: + case actors.Version6: return make6(store, addr) - } + case actors.Version7: + return make7(store, addr) + +} return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { - case specactors.Version0: + case actors.Version0: return builtin0.AccountActorCodeID, nil - case specactors.Version2: + case actors.Version2: return builtin2.AccountActorCodeID, nil - case specactors.Version3: + case actors.Version3: return builtin3.AccountActorCodeID, nil - case specactors.Version4: + case actors.Version4: return builtin4.AccountActorCodeID, nil - case specactors.Version5: + case actors.Version5: return builtin5.AccountActorCodeID, nil - case specactors.Version6: + case actors.Version6: return builtin6.AccountActorCodeID, nil + case actors.Version7: + return builtin7.AccountActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/pkg/types/specactors/builtin/account/actor.go.template b/pkg/types/specactors/builtin/account/actor.go.template index f29863f676..5797647df6 100644 --- a/pkg/types/specactors/builtin/account/actor.go.template +++ b/pkg/types/specactors/builtin/account/actor.go.template @@ -1,7 +1,9 @@ +// FETCHED FROM LOTUS: builtin/account/actor.go.template + package account import ( - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" @@ -10,7 +12,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/internal" + types "github.com/filecoin-project/venus/pkg/types/internal" {{range .versions}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" {{end}} @@ -25,7 +27,7 @@ func init() { var Methods = builtin4.MethodsAccount -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { {{range .versions}} case builtin{{.}}.AccountActorCodeID: @@ -35,20 +37,20 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version, addr address.Address) (State, error) { +func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return make{{.}}(store, addr) {{end}} } return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return builtin{{.}}.AccountActorCodeID, nil {{end}} } diff --git a/pkg/types/specactors/builtin/account/state.go.template b/pkg/types/specactors/builtin/account/state.go.template index c1d044da2a..24ccf80682 100644 --- a/pkg/types/specactors/builtin/account/state.go.template +++ b/pkg/types/specactors/builtin/account/state.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + package account import ( diff --git a/pkg/types/specactors/builtin/account/v0.go b/pkg/types/specactors/builtin/account/v0.go index 634241175f..aef9d0a802 100644 --- a/pkg/types/specactors/builtin/account/v0.go +++ b/pkg/types/specactors/builtin/account/v0.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + package account import ( @@ -22,7 +24,7 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store, addr address.Address) (State, error) { out := state0{store: store} - out.State = account0.State{Address: addr} + out.State = account0.State{Address:addr} return &out, nil } @@ -37,4 +39,4 @@ func (s *state0) PubkeyAddress() (address.Address, error) { func (s *state0) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/account/v2.go b/pkg/types/specactors/builtin/account/v2.go index d3d238ec32..1ac1633fb0 100644 --- a/pkg/types/specactors/builtin/account/v2.go +++ b/pkg/types/specactors/builtin/account/v2.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + package account import ( @@ -22,7 +24,7 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store, addr address.Address) (State, error) { out := state2{store: store} - out.State = account2.State{Address: addr} + out.State = account2.State{Address:addr} return &out, nil } @@ -37,4 +39,4 @@ func (s *state2) PubkeyAddress() (address.Address, error) { func (s *state2) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/account/v3.go b/pkg/types/specactors/builtin/account/v3.go index 23c4fea256..557c9a3b4b 100644 --- a/pkg/types/specactors/builtin/account/v3.go +++ b/pkg/types/specactors/builtin/account/v3.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + package account import ( @@ -22,7 +24,7 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store, addr address.Address) (State, error) { out := state3{store: store} - out.State = account3.State{Address: addr} + out.State = account3.State{Address:addr} return &out, nil } @@ -37,4 +39,4 @@ func (s *state3) PubkeyAddress() (address.Address, error) { func (s *state3) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/account/v4.go b/pkg/types/specactors/builtin/account/v4.go index ffa5564cf8..d52cb5dbad 100644 --- a/pkg/types/specactors/builtin/account/v4.go +++ b/pkg/types/specactors/builtin/account/v4.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + package account import ( @@ -22,7 +24,7 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store, addr address.Address) (State, error) { out := state4{store: store} - out.State = account4.State{Address: addr} + out.State = account4.State{Address:addr} return &out, nil } @@ -37,4 +39,4 @@ func (s *state4) PubkeyAddress() (address.Address, error) { func (s *state4) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/account/v5.go b/pkg/types/specactors/builtin/account/v5.go index 2ddd718ca7..4af3320550 100644 --- a/pkg/types/specactors/builtin/account/v5.go +++ b/pkg/types/specactors/builtin/account/v5.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + package account import ( @@ -22,7 +24,7 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store, addr address.Address) (State, error) { out := state5{store: store} - out.State = account5.State{Address: addr} + out.State = account5.State{Address:addr} return &out, nil } @@ -37,4 +39,4 @@ func (s *state5) PubkeyAddress() (address.Address, error) { func (s *state5) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/account/v6.go b/pkg/types/specactors/builtin/account/v6.go index f1760440c2..8a103d3b9e 100644 --- a/pkg/types/specactors/builtin/account/v6.go +++ b/pkg/types/specactors/builtin/account/v6.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + package account import ( @@ -22,7 +24,7 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store, addr address.Address) (State, error) { out := state6{store: store} - out.State = account6.State{Address: addr} + out.State = account6.State{Address:addr} return &out, nil } @@ -37,4 +39,4 @@ func (s *state6) PubkeyAddress() (address.Address, error) { func (s *state6) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/account/v7.go b/pkg/types/specactors/builtin/account/v7.go new file mode 100644 index 0000000000..57b0aa7c57 --- /dev/null +++ b/pkg/types/specactors/builtin/account/v7.go @@ -0,0 +1,42 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + +package account + +import ( + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/pkg/types/specactors/adt" + + account7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/account" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, addr address.Address) (State, error) { + out := state7{store: store} + out.State = account7.State{Address:addr} + return &out, nil +} + +type state7 struct { + account7.State + store adt.Store +} + +func (s *state7) PubkeyAddress() (address.Address, error) { + return s.Address, nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/builtin.go b/pkg/types/specactors/builtin/builtin.go index 12142efc42..01855056e0 100644 --- a/pkg/types/specactors/builtin/builtin.go +++ b/pkg/types/specactors/builtin/builtin.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/builtin.go.template + package builtin import ( @@ -5,101 +7,114 @@ import ( "github.com/ipfs/go-cid" "golang.org/x/xerrors" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - smoothing2 "github.com/filecoin-project/specs-actors/v2/actors/util/smoothing" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - smoothing3 "github.com/filecoin-project/specs-actors/v3/actors/util/smoothing" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - smoothing4 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - smoothing5 "github.com/filecoin-project/specs-actors/v5/actors/util/smoothing" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + smoothing2 "github.com/filecoin-project/specs-actors/v2/actors/util/smoothing" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + smoothing3 "github.com/filecoin-project/specs-actors/v3/actors/util/smoothing" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + smoothing4 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + smoothing5 "github.com/filecoin-project/specs-actors/v5/actors/util/smoothing" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/cbor" - "github.com/filecoin-project/venus/pkg/types/internal" "github.com/filecoin-project/venus/pkg/types/specactors/adt" + types "github.com/filecoin-project/venus/pkg/types/internal" - miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" - proof6 "github.com/filecoin-project/specs-actors/v6/actors/runtime/proof" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" ) -var SystemActorAddr = builtin6.SystemActorAddr -var BurntFundsActorAddr = builtin6.BurntFundsActorAddr -var CronActorAddr = builtin6.CronActorAddr +var SystemActorAddr = builtin7.SystemActorAddr +var BurntFundsActorAddr = builtin7.BurntFundsActorAddr +var CronActorAddr = builtin7.CronActorAddr var SaftAddress = makeAddress("t0122") var ReserveAddress = makeAddress("t090") var RootVerifierAddress = makeAddress("t080") var ( - ExpectedLeadersPerEpoch = builtin6.ExpectedLeadersPerEpoch + ExpectedLeadersPerEpoch = builtin7.ExpectedLeadersPerEpoch ) const ( - EpochDurationSeconds = builtin6.EpochDurationSeconds - EpochsInDay = builtin6.EpochsInDay - SecondsInDay = builtin6.SecondsInDay + EpochDurationSeconds = builtin7.EpochDurationSeconds + EpochsInDay = builtin7.EpochsInDay + SecondsInDay = builtin7.SecondsInDay ) const ( - MethodSend = builtin6.MethodSend - MethodConstructor = builtin6.MethodConstructor + MethodSend = builtin7.MethodSend + MethodConstructor = builtin7.MethodConstructor ) // These are all just type aliases across actor versions. In the future, that might change // and we might need to do something fancier. -type SectorInfo = proof6.SectorInfo -type PoStProof = proof6.PoStProof +type SectorInfo = proof7.SectorInfo +type PoStProof = proof7.PoStProof type FilterEstimate = smoothing0.FilterEstimate func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, verifiedWeight abi.DealWeight) abi.StoragePower { - return miner6.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) + return miner7.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) } -func FromV0FilterEstimate(v0 smoothing0.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v0) //nolint:unconvert - -} - -func FromV2FilterEstimate(v2 smoothing2.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v2) - -} - -func FromV3FilterEstimate(v3 smoothing3.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v3) -} - -func FromV4FilterEstimate(v4 smoothing4.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v4) + func FromV0FilterEstimate(v0 smoothing0.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v0) //nolint:unconvert + + } -} + func FromV2FilterEstimate(v2 smoothing2.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v2) + + } -func FromV5FilterEstimate(v5 smoothing5.FilterEstimate) FilterEstimate { + func FromV3FilterEstimate(v3 smoothing3.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v3) + + } - return (FilterEstimate)(v5) + func FromV4FilterEstimate(v4 smoothing4.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v4) + + } -} + func FromV5FilterEstimate(v5 smoothing5.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v5) + + } -func FromV6FilterEstimate(v6 smoothing6.FilterEstimate) FilterEstimate { + func FromV6FilterEstimate(v6 smoothing6.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v6) + + } - return (FilterEstimate)(v6) + func FromV7FilterEstimate(v7 smoothing7.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v7) + + } -} type ActorStateLoader func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) @@ -109,7 +124,7 @@ func RegisterActorState(code cid.Cid, loader ActorStateLoader) { ActorStateLoaders[code] = loader } -func Load(store adt.Store, act *internal.Actor) (cbor.Marshaler, error) { +func Load(store adt.Store, act *types.Actor) (cbor.Marshaler, error) { loader, found := ActorStateLoaders[act.Code] if !found { return nil, xerrors.Errorf("unknown actor code %s", act.Code) @@ -119,201 +134,195 @@ func Load(store adt.Store, act *internal.Actor) (cbor.Marshaler, error) { func ActorNameByCode(c cid.Cid) string { switch { - - case builtin0.IsBuiltinActor(c): - return builtin0.ActorNameByCode(c) - - case builtin2.IsBuiltinActor(c): - return builtin2.ActorNameByCode(c) - - case builtin3.IsBuiltinActor(c): - return builtin3.ActorNameByCode(c) - - case builtin4.IsBuiltinActor(c): - return builtin4.ActorNameByCode(c) - - case builtin5.IsBuiltinActor(c): - return builtin5.ActorNameByCode(c) - - case builtin6.IsBuiltinActor(c): - return builtin6.ActorNameByCode(c) - + + case builtin0.IsBuiltinActor(c): + return builtin0.ActorNameByCode(c) + + case builtin2.IsBuiltinActor(c): + return builtin2.ActorNameByCode(c) + + case builtin3.IsBuiltinActor(c): + return builtin3.ActorNameByCode(c) + + case builtin4.IsBuiltinActor(c): + return builtin4.ActorNameByCode(c) + + case builtin5.IsBuiltinActor(c): + return builtin5.ActorNameByCode(c) + + case builtin6.IsBuiltinActor(c): + return builtin6.ActorNameByCode(c) + + case builtin7.IsBuiltinActor(c): + return builtin7.ActorNameByCode(c) + default: return "" } } func IsBuiltinActor(c cid.Cid) bool { - - if builtin0.IsBuiltinActor(c) { - return true - } - - if builtin2.IsBuiltinActor(c) { - return true - } - - if builtin3.IsBuiltinActor(c) { - return true - } - - if builtin4.IsBuiltinActor(c) { - return true - } - - if builtin5.IsBuiltinActor(c) { - return true - } - - if builtin6.IsBuiltinActor(c) { - return true - } - + + if builtin0.IsBuiltinActor(c) { + return true + } + + if builtin2.IsBuiltinActor(c) { + return true + } + + if builtin3.IsBuiltinActor(c) { + return true + } + + if builtin4.IsBuiltinActor(c) { + return true + } + + if builtin5.IsBuiltinActor(c) { + return true + } + + if builtin6.IsBuiltinActor(c) { + return true + } + + if builtin7.IsBuiltinActor(c) { + return true + } + return false } func IsAccountActor(c cid.Cid) bool { - - if c == builtin0.AccountActorCodeID { - return true - } - - if c == builtin2.AccountActorCodeID { - return true - } - - if c == builtin3.AccountActorCodeID { - return true - } - - if c == builtin4.AccountActorCodeID { - return true - } - - if c == builtin5.AccountActorCodeID { - return true - } - - if c == builtin6.AccountActorCodeID { - return true - } - - return false -} - -func IsInitActor(c cid.Cid) bool { - - if c == builtin0.InitActorCodeID { - return true - } - - if c == builtin2.InitActorCodeID { - return true - } - - if c == builtin3.InitActorCodeID { - return true - } - - if c == builtin4.InitActorCodeID { - return true - } - - if c == builtin5.InitActorCodeID { - return true - } - - if c == builtin6.InitActorCodeID { - return true - } - + + if c == builtin0.AccountActorCodeID { + return true + } + + if c == builtin2.AccountActorCodeID { + return true + } + + if c == builtin3.AccountActorCodeID { + return true + } + + if c == builtin4.AccountActorCodeID { + return true + } + + if c == builtin5.AccountActorCodeID { + return true + } + + if c == builtin6.AccountActorCodeID { + return true + } + + if c == builtin7.AccountActorCodeID { + return true + } + return false } func IsStorageMinerActor(c cid.Cid) bool { - - if c == builtin0.StorageMinerActorCodeID { - return true - } - - if c == builtin2.StorageMinerActorCodeID { - return true - } - - if c == builtin3.StorageMinerActorCodeID { - return true - } - - if c == builtin4.StorageMinerActorCodeID { - return true - } - - if c == builtin5.StorageMinerActorCodeID { - return true - } - - if c == builtin6.StorageMinerActorCodeID { - return true - } - + + if c == builtin0.StorageMinerActorCodeID { + return true + } + + if c == builtin2.StorageMinerActorCodeID { + return true + } + + if c == builtin3.StorageMinerActorCodeID { + return true + } + + if c == builtin4.StorageMinerActorCodeID { + return true + } + + if c == builtin5.StorageMinerActorCodeID { + return true + } + + if c == builtin6.StorageMinerActorCodeID { + return true + } + + if c == builtin7.StorageMinerActorCodeID { + return true + } + return false } func IsMultisigActor(c cid.Cid) bool { - - if c == builtin0.MultisigActorCodeID { - return true - } - - if c == builtin2.MultisigActorCodeID { - return true - } - - if c == builtin3.MultisigActorCodeID { - return true - } - - if c == builtin4.MultisigActorCodeID { - return true - } - - if c == builtin5.MultisigActorCodeID { - return true - } - - if c == builtin6.MultisigActorCodeID { - return true - } - + + if c == builtin0.MultisigActorCodeID { + return true + } + + if c == builtin2.MultisigActorCodeID { + return true + } + + if c == builtin3.MultisigActorCodeID { + return true + } + + if c == builtin4.MultisigActorCodeID { + return true + } + + if c == builtin5.MultisigActorCodeID { + return true + } + + if c == builtin6.MultisigActorCodeID { + return true + } + + if c == builtin7.MultisigActorCodeID { + return true + } + return false } func IsPaymentChannelActor(c cid.Cid) bool { - - if c == builtin0.PaymentChannelActorCodeID { - return true - } - - if c == builtin2.PaymentChannelActorCodeID { - return true - } - - if c == builtin3.PaymentChannelActorCodeID { - return true - } - - if c == builtin4.PaymentChannelActorCodeID { - return true - } - - if c == builtin5.PaymentChannelActorCodeID { - return true - } - - if c == builtin6.PaymentChannelActorCodeID { - return true - } - + + if c == builtin0.PaymentChannelActorCodeID { + return true + } + + if c == builtin2.PaymentChannelActorCodeID { + return true + } + + if c == builtin3.PaymentChannelActorCodeID { + return true + } + + if c == builtin4.PaymentChannelActorCodeID { + return true + } + + if c == builtin5.PaymentChannelActorCodeID { + return true + } + + if c == builtin6.PaymentChannelActorCodeID { + return true + } + + if c == builtin7.PaymentChannelActorCodeID { + return true + } + return false } diff --git a/pkg/types/specactors/builtin/builtin.go.template b/pkg/types/specactors/builtin/builtin.go.template index 9a9417ee83..3a6eb5f890 100644 --- a/pkg/types/specactors/builtin/builtin.go.template +++ b/pkg/types/specactors/builtin/builtin.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/builtin.go.template + package builtin import ( @@ -14,7 +16,7 @@ import ( "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/internal" + types "github.com/filecoin-project/venus/pkg/types/internal" miner{{.latestVersion}} "github.com/filecoin-project/specs-actors{{import .latestVersion}}actors/builtin/miner" proof{{.latestVersion}} "github.com/filecoin-project/specs-actors{{import .latestVersion}}actors/runtime/proof" @@ -70,7 +72,7 @@ func RegisterActorState(code cid.Cid, loader ActorStateLoader) { ActorStateLoaders[code] = loader } -func Load(store adt.Store, act *internal.Actor) (cbor.Marshaler, error) { +func Load(store adt.Store, act *types.Actor) (cbor.Marshaler, error) { loader, found := ActorStateLoaders[act.Code] if !found { return nil, xerrors.Errorf("unknown actor code %s", act.Code) @@ -107,15 +109,6 @@ func IsAccountActor(c cid.Cid) bool { return false } -func IsInitActor(c cid.Cid) bool { - {{range .versions}} - if c == builtin{{.}}.InitActorCodeID { - return true - } - {{end}} - return false -} - func IsStorageMinerActor(c cid.Cid) bool { {{range .versions}} if c == builtin{{.}}.StorageMinerActorCodeID { diff --git a/pkg/types/specactors/builtin/cron/actor.go.template b/pkg/types/specactors/builtin/cron/actor.go.template index 1900e7f70d..c8a8759821 100644 --- a/pkg/types/specactors/builtin/cron/actor.go.template +++ b/pkg/types/specactors/builtin/cron/actor.go.template @@ -1,7 +1,9 @@ +// FETCHED FROM LOTUS: builtin/cron/actor.go.template + package cron import ( - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "golang.org/x/xerrors" "github.com/ipfs/go-cid" @@ -10,20 +12,20 @@ import ( {{end}} ) -func MakeState(store adt.Store, av specactors.Version) (State, error) { +func MakeState(store adt.Store, av actors.Version) (State, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return make{{.}}(store) {{end}} } return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return builtin{{.}}.CronActorCodeID, nil {{end}} } diff --git a/pkg/types/specactors/builtin/cron/cron.go b/pkg/types/specactors/builtin/cron/cron.go index e9bd6440fd..277152dd69 100644 --- a/pkg/types/specactors/builtin/cron/cron.go +++ b/pkg/types/specactors/builtin/cron/cron.go @@ -1,10 +1,12 @@ +// FETCHED FROM LOTUS: builtin/cron/actor.go.template + package cron import ( - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/ipfs/go-cid" "golang.org/x/xerrors" + "github.com/ipfs/go-cid" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -17,64 +19,74 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + ) -func MakeState(store adt.Store, av specactors.Version) (State, error) { +func MakeState(store adt.Store, av actors.Version) (State, error) { switch av { - case specactors.Version0: + case actors.Version0: return make0(store) - case specactors.Version2: + case actors.Version2: return make2(store) - case specactors.Version3: + case actors.Version3: return make3(store) - case specactors.Version4: + case actors.Version4: return make4(store) - case specactors.Version5: + case actors.Version5: return make5(store) - case specactors.Version6: + case actors.Version6: return make6(store) - } + case actors.Version7: + return make7(store) + +} return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { - case specactors.Version0: + case actors.Version0: return builtin0.CronActorCodeID, nil - case specactors.Version2: + case actors.Version2: return builtin2.CronActorCodeID, nil - case specactors.Version3: + case actors.Version3: return builtin3.CronActorCodeID, nil - case specactors.Version4: + case actors.Version4: return builtin4.CronActorCodeID, nil - case specactors.Version5: + case actors.Version5: return builtin5.CronActorCodeID, nil - case specactors.Version6: + case actors.Version6: return builtin6.CronActorCodeID, nil + case actors.Version7: + return builtin7.CronActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) } var ( - Address = builtin6.CronActorAddr - Methods = builtin6.MethodsCron + Address = builtin7.CronActorAddr + Methods = builtin7.MethodsCron ) + type State interface { GetState() interface{} } diff --git a/pkg/types/specactors/builtin/cron/state.go.template b/pkg/types/specactors/builtin/cron/state.go.template index 44cbbda615..a06a777b27 100644 --- a/pkg/types/specactors/builtin/cron/state.go.template +++ b/pkg/types/specactors/builtin/cron/state.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + package cron import ( diff --git a/pkg/types/specactors/builtin/cron/v0.go b/pkg/types/specactors/builtin/cron/v0.go index c3682ac2ac..4029ab15da 100644 --- a/pkg/types/specactors/builtin/cron/v0.go +++ b/pkg/types/specactors/builtin/cron/v0.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + package cron import ( @@ -32,4 +34,4 @@ type state0 struct { func (s *state0) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/cron/v2.go b/pkg/types/specactors/builtin/cron/v2.go index 62a105c619..4a54b18506 100644 --- a/pkg/types/specactors/builtin/cron/v2.go +++ b/pkg/types/specactors/builtin/cron/v2.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + package cron import ( @@ -32,4 +34,4 @@ type state2 struct { func (s *state2) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/cron/v3.go b/pkg/types/specactors/builtin/cron/v3.go index 468a04fe14..799dec7e5f 100644 --- a/pkg/types/specactors/builtin/cron/v3.go +++ b/pkg/types/specactors/builtin/cron/v3.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + package cron import ( @@ -32,4 +34,4 @@ type state3 struct { func (s *state3) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/cron/v4.go b/pkg/types/specactors/builtin/cron/v4.go index 65de38762c..3e58e275d9 100644 --- a/pkg/types/specactors/builtin/cron/v4.go +++ b/pkg/types/specactors/builtin/cron/v4.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + package cron import ( @@ -32,4 +34,4 @@ type state4 struct { func (s *state4) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/cron/v5.go b/pkg/types/specactors/builtin/cron/v5.go index 101bf115a3..0ba27a6e7a 100644 --- a/pkg/types/specactors/builtin/cron/v5.go +++ b/pkg/types/specactors/builtin/cron/v5.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + package cron import ( @@ -32,4 +34,4 @@ type state5 struct { func (s *state5) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/cron/v6.go b/pkg/types/specactors/builtin/cron/v6.go index 4b44d75ca1..87c7e59195 100644 --- a/pkg/types/specactors/builtin/cron/v6.go +++ b/pkg/types/specactors/builtin/cron/v6.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + package cron import ( @@ -32,4 +34,4 @@ type state6 struct { func (s *state6) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/cron/v7.go b/pkg/types/specactors/builtin/cron/v7.go new file mode 100644 index 0000000000..35bbab5a96 --- /dev/null +++ b/pkg/types/specactors/builtin/cron/v7.go @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + +package cron + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/pkg/types/specactors/adt" + + cron7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/cron" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + out.State = *cron7.ConstructState(cron7.BuiltInEntries()) + return &out, nil +} + +type state7 struct { + cron7.State + store adt.Store +} + +func (s *state7) GetState() interface{} { + return &s.State +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/init/actor.go.template b/pkg/types/specactors/builtin/init/actor.go.template index b5f40117ea..8a257f85d4 100644 --- a/pkg/types/specactors/builtin/init/actor.go.template +++ b/pkg/types/specactors/builtin/init/actor.go.template @@ -1,7 +1,9 @@ +// FETCHED FROM LOTUS: builtin/init/actor.go.template + package init import ( - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" @@ -11,7 +13,8 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/internal" + types "github.com/filecoin-project/venus/pkg/types/internal" + {{range .versions}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" {{end}} @@ -29,7 +32,7 @@ var ( Methods = builtin{{.latestVersion}}.MethodsInit ) -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { {{range .versions}} case builtin{{.}}.InitActorCodeID: @@ -39,20 +42,20 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version, networkName string) (State, error) { +func MakeState(store adt.Store, av actors.Version, networkName string) (State, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return make{{.}}(store, networkName) {{end}} } return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return builtin{{.}}.InitActorCodeID, nil {{end}} } diff --git a/pkg/types/specactors/builtin/init/diff.go b/pkg/types/specactors/builtin/init/diff.go deleted file mode 100644 index 566e80ae08..0000000000 --- a/pkg/types/specactors/builtin/init/diff.go +++ /dev/null @@ -1,151 +0,0 @@ -package init - -import ( - "bytes" - adt2 "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - typegen "github.com/whyrusleeping/cbor-gen" -) - -func DiffAddressMap(pre, cur State) (*AddressMapChanges, error) { - prem, err := pre.AddressMap() - if err != nil { - return nil, err - } - - curm, err := cur.AddressMap() - if err != nil { - return nil, err - } - - preRoot, err := prem.Root() - if err != nil { - return nil, err - } - - curRoot, err := curm.Root() - if err != nil { - return nil, err - } - - results := new(AddressMapChanges) - // no change. - if curRoot.Equals(preRoot) { - return results, nil - } - - err = adt2.DiffAdtMap(prem, curm, &addressMapDiffer{results, pre, cur}) - if err != nil { - return nil, err - } - - return results, nil -} - -type addressMapDiffer struct { - Results *AddressMapChanges - pre, adter State -} - -type AddressMapChanges struct { - Added []AddressPair - Modified []AddressChange - Removed []AddressPair -} - -func (i *addressMapDiffer) AsKey(key string) (abi.Keyer, error) { - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return nil, err - } - return abi.AddrKey(addr), nil -} - -func (i *addressMapDiffer) Add(key string, val *typegen.Deferred) error { - pkAddr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - id := new(typegen.CborInt) - if err := id.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return err - } - idAddr, err := address.NewIDAddress(uint64(*id)) - if err != nil { - return err - } - i.Results.Added = append(i.Results.Added, AddressPair{ - ID: idAddr, - PK: pkAddr, - }) - return nil -} - -func (i *addressMapDiffer) Modify(key string, from, to *typegen.Deferred) error { - pkAddr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - - fromID := new(typegen.CborInt) - if err := fromID.UnmarshalCBOR(bytes.NewReader(from.Raw)); err != nil { - return err - } - fromIDAddr, err := address.NewIDAddress(uint64(*fromID)) - if err != nil { - return err - } - - toID := new(typegen.CborInt) - if err := toID.UnmarshalCBOR(bytes.NewReader(to.Raw)); err != nil { - return err - } - toIDAddr, err := address.NewIDAddress(uint64(*toID)) - if err != nil { - return err - } - - i.Results.Modified = append(i.Results.Modified, AddressChange{ - From: AddressPair{ - ID: fromIDAddr, - PK: pkAddr, - }, - To: AddressPair{ - ID: toIDAddr, - PK: pkAddr, - }, - }) - return nil -} - -func (i *addressMapDiffer) Remove(key string, val *typegen.Deferred) error { - pkAddr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - id := new(typegen.CborInt) - if err := id.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return err - } - idAddr, err := address.NewIDAddress(uint64(*id)) - if err != nil { - return err - } - i.Results.Removed = append(i.Results.Removed, AddressPair{ - ID: idAddr, - PK: pkAddr, - }) - return nil -} - -type AddressChange struct { - From AddressPair - To AddressPair -} - -type AddressPair struct { - ID address.Address - PK address.Address -} diff --git a/pkg/types/specactors/builtin/init/init.go b/pkg/types/specactors/builtin/init/init.go index f053cfcd25..f59355f5a9 100644 --- a/pkg/types/specactors/builtin/init/init.go +++ b/pkg/types/specactors/builtin/init/init.go @@ -1,7 +1,9 @@ +// FETCHED FROM LOTUS: builtin/init/actor.go.template + package init import ( - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" @@ -9,9 +11,10 @@ import ( "github.com/filecoin-project/go-state-types/cbor" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/types/internal" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + types "github.com/filecoin-project/venus/pkg/types/internal" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -24,6 +27,9 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + ) func init() { @@ -51,14 +57,18 @@ func init() { builtin.RegisterActorState(builtin6.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var ( - Address = builtin6.InitActorAddr - Methods = builtin6.MethodsInit + Address = builtin7.InitActorAddr + Methods = builtin7.MethodsInit ) -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { case builtin0.InitActorCodeID: @@ -79,56 +89,65 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { case builtin6.InitActorCodeID: return load6(store, act.Head) + case builtin7.InitActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version, networkName string) (State, error) { +func MakeState(store adt.Store, av actors.Version, networkName string) (State, error) { switch av { - case specactors.Version0: + case actors.Version0: return make0(store, networkName) - case specactors.Version2: + case actors.Version2: return make2(store, networkName) - case specactors.Version3: + case actors.Version3: return make3(store, networkName) - case specactors.Version4: + case actors.Version4: return make4(store, networkName) - case specactors.Version5: + case actors.Version5: return make5(store, networkName) - case specactors.Version6: + case actors.Version6: return make6(store, networkName) - } + case actors.Version7: + return make7(store, networkName) + +} return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { - case specactors.Version0: + case actors.Version0: return builtin0.InitActorCodeID, nil - case specactors.Version2: + case actors.Version2: return builtin2.InitActorCodeID, nil - case specactors.Version3: + case actors.Version3: return builtin3.InitActorCodeID, nil - case specactors.Version4: + case actors.Version4: return builtin4.InitActorCodeID, nil - case specactors.Version5: + case actors.Version5: return builtin5.InitActorCodeID, nil - case specactors.Version6: + case actors.Version6: return builtin6.InitActorCodeID, nil + case actors.Version7: + return builtin7.InitActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/pkg/types/specactors/builtin/init/state.go.template b/pkg/types/specactors/builtin/init/state.go.template index 21392e2aeb..6a2e33452e 100644 --- a/pkg/types/specactors/builtin/init/state.go.template +++ b/pkg/types/specactors/builtin/init/state.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + package init import ( @@ -8,6 +10,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" + {{if (ge .v 3)}} builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" @@ -77,7 +80,7 @@ func (s *state{{.v}}) ForEachActor(cb func(id abi.ActorID, address address.Addre } func (s *state{{.v}}) NetworkName() (string, error) { - return s.State.NetworkName, nil + return string(s.State.NetworkName), nil } func (s *state{{.v}}) SetNetworkName(name string) error { diff --git a/pkg/types/specactors/builtin/init/v0.go b/pkg/types/specactors/builtin/init/v0.go index 5a78c0f05c..6bc0b3f132 100644 --- a/pkg/types/specactors/builtin/init/v0.go +++ b/pkg/types/specactors/builtin/init/v0.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + package init import ( @@ -8,6 +10,9 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" + + + init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" @@ -26,14 +31,14 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store, networkName string) (State, error) { out := state0{store: store} + + mr, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } - mr, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *init0.ConstructState(mr, networkName) - + out.State = *init0.ConstructState(mr, networkName) + return &out, nil } @@ -66,7 +71,7 @@ func (s *state0) ForEachActor(cb func(id abi.ActorID, address address.Address) e } func (s *state0) NetworkName() (string, error) { - return s.State.NetworkName, nil + return string(s.State.NetworkName), nil } func (s *state0) SetNetworkName(name string) error { @@ -108,4 +113,4 @@ func (s *state0) AddressMap() (adt.Map, error) { func (s *state0) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/init/v2.go b/pkg/types/specactors/builtin/init/v2.go index 7fc3114b38..6c7b143d1b 100644 --- a/pkg/types/specactors/builtin/init/v2.go +++ b/pkg/types/specactors/builtin/init/v2.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + package init import ( @@ -8,6 +10,9 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" + + + init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" @@ -26,14 +31,14 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store, networkName string) (State, error) { out := state2{store: store} + + mr, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } - mr, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *init2.ConstructState(mr, networkName) - + out.State = *init2.ConstructState(mr, networkName) + return &out, nil } @@ -66,7 +71,7 @@ func (s *state2) ForEachActor(cb func(id abi.ActorID, address address.Address) e } func (s *state2) NetworkName() (string, error) { - return s.State.NetworkName, nil + return string(s.State.NetworkName), nil } func (s *state2) SetNetworkName(name string) error { @@ -108,4 +113,4 @@ func (s *state2) AddressMap() (adt.Map, error) { func (s *state2) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/init/v3.go b/pkg/types/specactors/builtin/init/v3.go index 93d17f83cf..3fee0b227c 100644 --- a/pkg/types/specactors/builtin/init/v3.go +++ b/pkg/types/specactors/builtin/init/v3.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + package init import ( @@ -8,9 +10,12 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" ) @@ -28,14 +33,14 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store, networkName string) (State, error) { out := state3{store: store} + + s, err := init3.ConstructState(store, networkName) + if err != nil { + return nil, err + } - s, err := init3.ConstructState(store, networkName) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -68,7 +73,7 @@ func (s *state3) ForEachActor(cb func(id abi.ActorID, address address.Address) e } func (s *state3) NetworkName() (string, error) { - return s.State.NetworkName, nil + return string(s.State.NetworkName), nil } func (s *state3) SetNetworkName(name string) error { @@ -110,4 +115,4 @@ func (s *state3) AddressMap() (adt.Map, error) { func (s *state3) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/init/v4.go b/pkg/types/specactors/builtin/init/v4.go index e97cae0fd9..6897447ed2 100644 --- a/pkg/types/specactors/builtin/init/v4.go +++ b/pkg/types/specactors/builtin/init/v4.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + package init import ( @@ -8,9 +10,12 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" ) @@ -28,14 +33,14 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store, networkName string) (State, error) { out := state4{store: store} + + s, err := init4.ConstructState(store, networkName) + if err != nil { + return nil, err + } - s, err := init4.ConstructState(store, networkName) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -68,7 +73,7 @@ func (s *state4) ForEachActor(cb func(id abi.ActorID, address address.Address) e } func (s *state4) NetworkName() (string, error) { - return s.State.NetworkName, nil + return string(s.State.NetworkName), nil } func (s *state4) SetNetworkName(name string) error { @@ -110,4 +115,4 @@ func (s *state4) AddressMap() (adt.Map, error) { func (s *state4) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/init/v5.go b/pkg/types/specactors/builtin/init/v5.go index 67d1db7bf2..2804256ddf 100644 --- a/pkg/types/specactors/builtin/init/v5.go +++ b/pkg/types/specactors/builtin/init/v5.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + package init import ( @@ -8,9 +10,12 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" ) @@ -28,14 +33,14 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store, networkName string) (State, error) { out := state5{store: store} + + s, err := init5.ConstructState(store, networkName) + if err != nil { + return nil, err + } - s, err := init5.ConstructState(store, networkName) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -68,7 +73,7 @@ func (s *state5) ForEachActor(cb func(id abi.ActorID, address address.Address) e } func (s *state5) NetworkName() (string, error) { - return s.State.NetworkName, nil + return string(s.State.NetworkName), nil } func (s *state5) SetNetworkName(name string) error { @@ -110,4 +115,4 @@ func (s *state5) AddressMap() (adt.Map, error) { func (s *state5) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/init/v6.go b/pkg/types/specactors/builtin/init/v6.go index 1cb375b769..816d548210 100644 --- a/pkg/types/specactors/builtin/init/v6.go +++ b/pkg/types/specactors/builtin/init/v6.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + package init import ( @@ -8,9 +10,12 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" ) @@ -28,14 +33,14 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store, networkName string) (State, error) { out := state6{store: store} + + s, err := init6.ConstructState(store, networkName) + if err != nil { + return nil, err + } - s, err := init6.ConstructState(store, networkName) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -68,7 +73,7 @@ func (s *state6) ForEachActor(cb func(id abi.ActorID, address address.Address) e } func (s *state6) NetworkName() (string, error) { - return s.State.NetworkName, nil + return string(s.State.NetworkName), nil } func (s *state6) SetNetworkName(name string) error { @@ -110,4 +115,4 @@ func (s *state6) AddressMap() (adt.Map, error) { func (s *state6) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/init/v7.go b/pkg/types/specactors/builtin/init/v7.go new file mode 100644 index 0000000000..51ac746de4 --- /dev/null +++ b/pkg/types/specactors/builtin/init/v7.go @@ -0,0 +1,118 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + +package init + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/pkg/types/specactors/adt" + + + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + + init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, networkName string) (State, error) { + out := state7{store: store} + + s, err := init7.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state7 struct { + init7.State + store adt.Store +} + +func (s *state7) ResolveAddress(address address.Address) (address.Address, bool, error) { + return s.State.ResolveAddress(s.store, address) +} + +func (s *state7) MapAddressToNewID(address address.Address) (address.Address, error) { + return s.State.MapAddressToNewID(s.store, address) +} + +func (s *state7) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { + addrs, err := adt7.AsMap(s.store, s.State.AddressMap, builtin7.DefaultHamtBitwidth) + if err != nil { + return err + } + var actorID cbg.CborInt + return addrs.ForEach(&actorID, func(key string) error { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(abi.ActorID(actorID), addr) + }) +} + +func (s *state7) NetworkName() (string, error) { + return string(s.State.NetworkName), nil +} + +func (s *state7) SetNetworkName(name string) error { + s.State.NetworkName = name + return nil +} + +func (s *state7) SetNextID(id abi.ActorID) error { + s.State.NextID = id + return nil +} + +func (s *state7) Remove(addrs ...address.Address) (err error) { + m, err := adt7.AsMap(s.store, s.State.AddressMap, builtin7.DefaultHamtBitwidth) + if err != nil { + return err + } + for _, addr := range addrs { + if err = m.Delete(abi.AddrKey(addr)); err != nil { + return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) + } + } + amr, err := m.Root() + if err != nil { + return xerrors.Errorf("failed to get address map root: %w", err) + } + s.State.AddressMap = amr + return nil +} + +func (s *state7) SetAddressMap(mcid cid.Cid) error { + s.State.AddressMap = mcid + return nil +} + +func (s *state7) AddressMap() (adt.Map, error) { + return adt7.AsMap(s.store, s.State.AddressMap, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) GetState() interface{} { + return &s.State +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/market/actor.go.template b/pkg/types/specactors/builtin/market/actor.go.template index f7460a3a12..a7d31d43e1 100644 --- a/pkg/types/specactors/builtin/market/actor.go.template +++ b/pkg/types/specactors/builtin/market/actor.go.template @@ -1,7 +1,9 @@ +// FETCHED FROM LOTUS: builtin/market/actor.go.template + package market import ( - "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/go-state-types/network" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" @@ -17,9 +19,9 @@ import ( {{end}} "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/internal" + types "github.com/filecoin-project/venus/pkg/types/internal" ) func init() { @@ -34,7 +36,7 @@ var ( Methods = builtin{{.latestVersion}}.MethodsMarket ) -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { {{range .versions}} case builtin{{.}}.StorageMarketActorCodeID: @@ -44,20 +46,20 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version) (State, error) { +func MakeState(store adt.Store, av actors.Version) (State, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return make{{.}}(store) {{end}} } return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return builtin{{.}}.StorageMarketActorCodeID, nil {{end}} } @@ -104,6 +106,7 @@ type DealProposals interface { } type PublishStorageDealsParams = market0.PublishStorageDealsParams + type PublishStorageDealsReturn interface { DealIDs() ([]abi.DealID, error) // Note that this index is based on the batch of deals that were published, NOT the DealID @@ -111,14 +114,14 @@ type PublishStorageDealsReturn interface { } func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStorageDealsReturn, error) { - av, err := specactors.VersionForNetwork(nv) + av, err := actors.VersionForNetwork(nv) if err != nil { return nil, err } switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return decodePublishStorageDealsReturn{{.}}(b) {{end}} } diff --git a/pkg/types/specactors/builtin/market/diff.go b/pkg/types/specactors/builtin/market/diff.go deleted file mode 100644 index 42bb416a69..0000000000 --- a/pkg/types/specactors/builtin/market/diff.go +++ /dev/null @@ -1,91 +0,0 @@ -package market - -import ( - "fmt" - adt2 "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - "github.com/filecoin-project/go-state-types/abi" - cbg "github.com/whyrusleeping/cbor-gen" -) - -func DiffDealProposals(pre, cur DealProposals) (*DealProposalChanges, error) { - results := new(DealProposalChanges) - if err := adt2.DiffAdtArray(pre.array(), cur.array(), &marketProposalsDiffer{results, pre, cur}); err != nil { - return nil, fmt.Errorf("diffing deal states: %w", err) - } - return results, nil -} - -type marketProposalsDiffer struct { - Results *DealProposalChanges - pre, cur DealProposals -} - -func (d *marketProposalsDiffer) Add(key uint64, val *cbg.Deferred) error { - dp, err := d.cur.decode(val) - if err != nil { - return err - } - d.Results.Added = append(d.Results.Added, ProposalIDState{abi.DealID(key), *dp}) - return nil -} - -func (d *marketProposalsDiffer) Modify(key uint64, from, to *cbg.Deferred) error { - // short circuit, DealProposals are static - return nil -} - -func (d *marketProposalsDiffer) Remove(key uint64, val *cbg.Deferred) error { - dp, err := d.pre.decode(val) - if err != nil { - return err - } - d.Results.Removed = append(d.Results.Removed, ProposalIDState{abi.DealID(key), *dp}) - return nil -} - -func DiffDealStates(pre, cur DealStates) (*DealStateChanges, error) { - results := new(DealStateChanges) - if err := adt2.DiffAdtArray(pre.array(), cur.array(), &marketStatesDiffer{results, pre, cur}); err != nil { - return nil, fmt.Errorf("diffing deal states: %w", err) - } - return results, nil -} - -type marketStatesDiffer struct { - Results *DealStateChanges - pre, cur DealStates -} - -func (d *marketStatesDiffer) Add(key uint64, val *cbg.Deferred) error { - ds, err := d.cur.decode(val) - if err != nil { - return err - } - d.Results.Added = append(d.Results.Added, DealIDState{abi.DealID(key), *ds}) - return nil -} - -func (d *marketStatesDiffer) Modify(key uint64, from, to *cbg.Deferred) error { - dsFrom, err := d.pre.decode(from) - if err != nil { - return err - } - dsTo, err := d.cur.decode(to) - if err != nil { - return err - } - if *dsFrom != *dsTo { - d.Results.Modified = append(d.Results.Modified, DealStateChange{abi.DealID(key), dsFrom, dsTo}) - } - return nil -} - -func (d *marketStatesDiffer) Remove(key uint64, val *cbg.Deferred) error { - ds, err := d.pre.decode(val) - if err != nil { - return err - } - d.Results.Removed = append(d.Results.Removed, DealIDState{abi.DealID(key), *ds}) - return nil -} diff --git a/pkg/types/specactors/builtin/market/market.go b/pkg/types/specactors/builtin/market/market.go index ecda193445..77383ba8c8 100644 --- a/pkg/types/specactors/builtin/market/market.go +++ b/pkg/types/specactors/builtin/market/market.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/market/actor.go.template + package market import ( @@ -25,10 +27,13 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + "github.com/filecoin-project/venus/pkg/types/specactors/adt" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + types "github.com/filecoin-project/venus/pkg/types/internal" ) func init() { @@ -56,14 +61,18 @@ func init() { builtin.RegisterActorState(builtin6.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var ( - Address = builtin6.StorageMarketActorAddr - Methods = builtin6.MethodsMarket + Address = builtin7.StorageMarketActorAddr + Methods = builtin7.MethodsMarket ) -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { case builtin0.StorageMarketActorCodeID: @@ -84,56 +93,65 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { case builtin6.StorageMarketActorCodeID: return load6(store, act.Head) + case builtin7.StorageMarketActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version) (State, error) { +func MakeState(store adt.Store, av actors.Version) (State, error) { switch av { - case specactors.Version0: + case actors.Version0: return make0(store) - case specactors.Version2: + case actors.Version2: return make2(store) - case specactors.Version3: + case actors.Version3: return make3(store) - case specactors.Version4: + case actors.Version4: return make4(store) - case specactors.Version5: + case actors.Version5: return make5(store) - case specactors.Version6: + case actors.Version6: return make6(store) - } + case actors.Version7: + return make7(store) + +} return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { - case specactors.Version0: + case actors.Version0: return builtin0.StorageMarketActorCodeID, nil - case specactors.Version2: + case actors.Version2: return builtin2.StorageMarketActorCodeID, nil - case specactors.Version3: + case actors.Version3: return builtin3.StorageMarketActorCodeID, nil - case specactors.Version4: + case actors.Version4: return builtin4.StorageMarketActorCodeID, nil - case specactors.Version5: + case actors.Version5: return builtin5.StorageMarketActorCodeID, nil - case specactors.Version6: + case actors.Version6: return builtin6.StorageMarketActorCodeID, nil + case actors.Version7: + return builtin7.StorageMarketActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -178,39 +196,43 @@ type DealProposals interface { } type PublishStorageDealsParams = market0.PublishStorageDealsParams + type PublishStorageDealsReturn interface { - DealIDs() ([]abi.DealID, error) + DealIDs() ([]abi.DealID, error) // Note that this index is based on the batch of deals that were published, NOT the DealID IsDealValid(index uint64) (bool, error) } func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStorageDealsReturn, error) { - av, err := specactors.VersionForNetwork(nv) + av, err := actors.VersionForNetwork(nv) if err != nil { return nil, err } switch av { - case specactors.Version0: + case actors.Version0: return decodePublishStorageDealsReturn0(b) - case specactors.Version2: + case actors.Version2: return decodePublishStorageDealsReturn2(b) - case specactors.Version3: + case actors.Version3: return decodePublishStorageDealsReturn3(b) - case specactors.Version4: + case actors.Version4: return decodePublishStorageDealsReturn4(b) - case specactors.Version5: + case actors.Version5: return decodePublishStorageDealsReturn5(b) - case specactors.Version6: + case actors.Version6: return decodePublishStorageDealsReturn6(b) - } + case actors.Version7: + return decodePublishStorageDealsReturn7(b) + +} return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -226,67 +248,67 @@ type DealState struct { } type DealProposal struct { - PieceCID cid.Cid - PieceSize abi.PaddedPieceSize - VerifiedDeal bool - Client address.Address - Provider address.Address - Label string - StartEpoch abi.ChainEpoch - EndEpoch abi.ChainEpoch + PieceCID cid.Cid + PieceSize abi.PaddedPieceSize + VerifiedDeal bool + Client address.Address + Provider address.Address + Label string + StartEpoch abi.ChainEpoch + EndEpoch abi.ChainEpoch StoragePricePerEpoch abi.TokenAmount - ProviderCollateral abi.TokenAmount - ClientCollateral abi.TokenAmount + ProviderCollateral abi.TokenAmount + ClientCollateral abi.TokenAmount } type DealStateChanges struct { - Added []DealIDState + Added []DealIDState Modified []DealStateChange - Removed []DealIDState + Removed []DealIDState } type DealIDState struct { - ID abi.DealID + ID abi.DealID Deal DealState } // DealStateChange is a change in deal state from -> to type DealStateChange struct { - ID abi.DealID + ID abi.DealID From *DealState - To *DealState + To *DealState } type DealProposalChanges struct { - Added []ProposalIDState + Added []ProposalIDState Removed []ProposalIDState } type ProposalIDState struct { - ID abi.DealID + ID abi.DealID Proposal DealProposal } func EmptyDealState() *DealState { return &DealState{ SectorStartEpoch: -1, - SlashEpoch: -1, + SlashEpoch: -1, LastUpdatedEpoch: -1, } } // returns the earned fees and pending fees for a given deal func (deal DealProposal) GetDealFees(height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) { - tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch))) + tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch))) - ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch))) - if ef.LessThan(big.Zero()) { - ef = big.Zero() - } + ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch))) + if ef.LessThan(big.Zero()) { + ef = big.Zero() + } - if ef.GreaterThan(tf) { - ef = tf - } + if ef.GreaterThan(tf) { + ef = tf + } - return ef, big.Sub(tf, ef) + return ef, big.Sub(tf, ef) } diff --git a/pkg/types/specactors/builtin/market/state.go.template b/pkg/types/specactors/builtin/market/state.go.template index 21d814f571..291fa4f631 100644 --- a/pkg/types/specactors/builtin/market/state.go.template +++ b/pkg/types/specactors/builtin/market/state.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + package market import ( @@ -10,7 +12,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/internal" + types "github.com/filecoin-project/venus/pkg/types/internal" market{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/market" adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" @@ -58,8 +60,8 @@ type state{{.v}} struct { } func (s *state{{.v}}) TotalLocked() (abi.TokenAmount, error) { - fml := internal.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) - fml = internal.BigAdd(fml, s.TotalClientStorageFee) + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) return fml, nil } @@ -238,7 +240,6 @@ func (s *state{{.v}}) GetState() interface{} { return &s.State } - var _ PublishStorageDealsReturn = (*publishStorageDealsReturn{{.v}})(nil) func decodePublishStorageDealsReturn{{.v}}(b []byte) (PublishStorageDealsReturn, error) { @@ -265,4 +266,4 @@ func (r *publishStorageDealsReturn{{.v}}) IsDealValid(index uint64) (bool, error func (r *publishStorageDealsReturn{{.v}}) DealIDs() ([]abi.DealID, error) { return r.IDs, nil -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/market/v0.go b/pkg/types/specactors/builtin/market/v0.go index 635d7a8e3f..25319e5790 100644 --- a/pkg/types/specactors/builtin/market/v0.go +++ b/pkg/types/specactors/builtin/market/v0.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + package market import ( @@ -9,8 +11,8 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types/internal" "github.com/filecoin-project/venus/pkg/types/specactors/adt" + types "github.com/filecoin-project/venus/pkg/types/internal" market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" @@ -29,19 +31,19 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store) (State, error) { out := state0{store: store} + + ea, err := adt0.MakeEmptyArray(store).Root() + if err != nil { + return nil, err + } - ea, err := adt0.MakeEmptyArray(store).Root() - if err != nil { - return nil, err - } - - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *market0.ConstructState(ea, em, em) + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + out.State = *market0.ConstructState(ea, em, em) + return &out, nil } @@ -51,8 +53,8 @@ type state0 struct { } func (s *state0) TotalLocked() (abi.TokenAmount, error) { - fml := internal.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) - fml = internal.BigAdd(fml, s.TotalClientStorageFee) + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) return fml, nil } @@ -247,12 +249,12 @@ type publishStorageDealsReturn0 struct { } func (r *publishStorageDealsReturn0) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn0) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/pkg/types/specactors/builtin/market/v2.go b/pkg/types/specactors/builtin/market/v2.go index 5ff8a67b86..39b4cb8d77 100644 --- a/pkg/types/specactors/builtin/market/v2.go +++ b/pkg/types/specactors/builtin/market/v2.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + package market import ( @@ -9,8 +11,8 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types/internal" "github.com/filecoin-project/venus/pkg/types/specactors/adt" + types "github.com/filecoin-project/venus/pkg/types/internal" market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" @@ -29,19 +31,19 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store) (State, error) { out := state2{store: store} + + ea, err := adt2.MakeEmptyArray(store).Root() + if err != nil { + return nil, err + } - ea, err := adt2.MakeEmptyArray(store).Root() - if err != nil { - return nil, err - } - - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *market2.ConstructState(ea, em, em) + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + out.State = *market2.ConstructState(ea, em, em) + return &out, nil } @@ -51,8 +53,8 @@ type state2 struct { } func (s *state2) TotalLocked() (abi.TokenAmount, error) { - fml := internal.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) - fml = internal.BigAdd(fml, s.TotalClientStorageFee) + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) return fml, nil } @@ -247,12 +249,12 @@ type publishStorageDealsReturn2 struct { } func (r *publishStorageDealsReturn2) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn2) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/pkg/types/specactors/builtin/market/v3.go b/pkg/types/specactors/builtin/market/v3.go index 206d9bc608..7aa0916583 100644 --- a/pkg/types/specactors/builtin/market/v3.go +++ b/pkg/types/specactors/builtin/market/v3.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + package market import ( @@ -9,8 +11,8 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types/internal" "github.com/filecoin-project/venus/pkg/types/specactors/adt" + types "github.com/filecoin-project/venus/pkg/types/internal" market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" @@ -29,14 +31,14 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store) (State, error) { out := state3{store: store} + + s, err := market3.ConstructState(store) + if err != nil { + return nil, err + } - s, err := market3.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -46,8 +48,8 @@ type state3 struct { } func (s *state3) TotalLocked() (abi.TokenAmount, error) { - fml := internal.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) - fml = internal.BigAdd(fml, s.TotalClientStorageFee) + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) return fml, nil } @@ -242,12 +244,12 @@ type publishStorageDealsReturn3 struct { } func (r *publishStorageDealsReturn3) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn3) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/pkg/types/specactors/builtin/market/v4.go b/pkg/types/specactors/builtin/market/v4.go index 9a7209d5cc..8256396d53 100644 --- a/pkg/types/specactors/builtin/market/v4.go +++ b/pkg/types/specactors/builtin/market/v4.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + package market import ( @@ -9,8 +11,8 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types/internal" "github.com/filecoin-project/venus/pkg/types/specactors/adt" + types "github.com/filecoin-project/venus/pkg/types/internal" market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" @@ -29,14 +31,14 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store) (State, error) { out := state4{store: store} + + s, err := market4.ConstructState(store) + if err != nil { + return nil, err + } - s, err := market4.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -46,8 +48,8 @@ type state4 struct { } func (s *state4) TotalLocked() (abi.TokenAmount, error) { - fml := internal.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) - fml = internal.BigAdd(fml, s.TotalClientStorageFee) + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) return fml, nil } @@ -242,12 +244,12 @@ type publishStorageDealsReturn4 struct { } func (r *publishStorageDealsReturn4) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn4) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/pkg/types/specactors/builtin/market/v5.go b/pkg/types/specactors/builtin/market/v5.go index 7ba80cd049..d1440322a6 100644 --- a/pkg/types/specactors/builtin/market/v5.go +++ b/pkg/types/specactors/builtin/market/v5.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + package market import ( @@ -9,8 +11,8 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types/internal" "github.com/filecoin-project/venus/pkg/types/specactors/adt" + types "github.com/filecoin-project/venus/pkg/types/internal" market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" @@ -29,14 +31,14 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store) (State, error) { out := state5{store: store} + + s, err := market5.ConstructState(store) + if err != nil { + return nil, err + } - s, err := market5.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -46,8 +48,8 @@ type state5 struct { } func (s *state5) TotalLocked() (abi.TokenAmount, error) { - fml := internal.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) - fml = internal.BigAdd(fml, s.TotalClientStorageFee) + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) return fml, nil } @@ -242,12 +244,12 @@ type publishStorageDealsReturn5 struct { } func (r *publishStorageDealsReturn5) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn5) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/pkg/types/specactors/builtin/market/v6.go b/pkg/types/specactors/builtin/market/v6.go index 2c41ac4b2b..4bb5ff9fe8 100644 --- a/pkg/types/specactors/builtin/market/v6.go +++ b/pkg/types/specactors/builtin/market/v6.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + package market import ( @@ -9,8 +11,8 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types/internal" "github.com/filecoin-project/venus/pkg/types/specactors/adt" + types "github.com/filecoin-project/venus/pkg/types/internal" market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" @@ -29,14 +31,14 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store) (State, error) { out := state6{store: store} + + s, err := market6.ConstructState(store) + if err != nil { + return nil, err + } - s, err := market6.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -46,8 +48,8 @@ type state6 struct { } func (s *state6) TotalLocked() (abi.TokenAmount, error) { - fml := internal.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) - fml = internal.BigAdd(fml, s.TotalClientStorageFee) + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) return fml, nil } @@ -242,11 +244,11 @@ type publishStorageDealsReturn6 struct { } func (r *publishStorageDealsReturn6) IsDealValid(index uint64) (bool, error) { - - return r.ValidDeals.IsSet(index) - + + return r.ValidDeals.IsSet(index) + } func (r *publishStorageDealsReturn6) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/pkg/types/specactors/builtin/market/v7.go b/pkg/types/specactors/builtin/market/v7.go new file mode 100644 index 0000000000..a9d32383be --- /dev/null +++ b/pkg/types/specactors/builtin/market/v7.go @@ -0,0 +1,254 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + +package market + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/pkg/types/specactors/adt" + types "github.com/filecoin-project/venus/pkg/types/internal" + + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + + s, err := market7.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state7 struct { + market7.State + store adt.Store +} + +func (s *state7) TotalLocked() (abi.TokenAmount, error) { + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) + return fml, nil +} + +func (s *state7) BalancesChanged(otherState State) (bool, error) { + otherState7, ok := otherState.(*state7) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.EscrowTable.Equals(otherState7.State.EscrowTable) || !s.State.LockedTable.Equals(otherState7.State.LockedTable), nil +} + +func (s *state7) StatesChanged(otherState State) (bool, error) { + otherState7, ok := otherState.(*state7) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.States.Equals(otherState7.State.States), nil +} + +func (s *state7) States() (DealStates, error) { + stateArray, err := adt7.AsArray(s.store, s.State.States, market7.StatesAmtBitwidth) + if err != nil { + return nil, err + } + return &dealStates7{stateArray}, nil +} + +func (s *state7) ProposalsChanged(otherState State) (bool, error) { + otherState7, ok := otherState.(*state7) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.Proposals.Equals(otherState7.State.Proposals), nil +} + +func (s *state7) Proposals() (DealProposals, error) { + proposalArray, err := adt7.AsArray(s.store, s.State.Proposals, market7.ProposalsAmtBitwidth) + if err != nil { + return nil, err + } + return &dealProposals7{proposalArray}, nil +} + +func (s *state7) EscrowTable() (BalanceTable, error) { + bt, err := adt7.AsBalanceTable(s.store, s.State.EscrowTable) + if err != nil { + return nil, err + } + return &balanceTable7{bt}, nil +} + +func (s *state7) LockedTable() (BalanceTable, error) { + bt, err := adt7.AsBalanceTable(s.store, s.State.LockedTable) + if err != nil { + return nil, err + } + return &balanceTable7{bt}, nil +} + +func (s *state7) VerifyDealsForActivation( + minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, +) (weight, verifiedWeight abi.DealWeight, err error) { + w, vw, _, err := market7.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) + return w, vw, err +} + +func (s *state7) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + +type balanceTable7 struct { + *adt7.BalanceTable +} + +func (bt *balanceTable7) ForEach(cb func(address.Address, abi.TokenAmount) error) error { + asMap := (*adt7.Map)(bt.BalanceTable) + var ta abi.TokenAmount + return asMap.ForEach(&ta, func(key string) error { + a, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(a, ta) + }) +} + +type dealStates7 struct { + adt.Array +} + +func (s *dealStates7) Get(dealID abi.DealID) (*DealState, bool, error) { + var deal7 market7.DealState + found, err := s.Array.Get(uint64(dealID), &deal7) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + deal := fromV7DealState(deal7) + return &deal, true, nil +} + +func (s *dealStates7) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { + var ds7 market7.DealState + return s.Array.ForEach(&ds7, func(idx int64) error { + return cb(abi.DealID(idx), fromV7DealState(ds7)) + }) +} + +func (s *dealStates7) decode(val *cbg.Deferred) (*DealState, error) { + var ds7 market7.DealState + if err := ds7.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + ds := fromV7DealState(ds7) + return &ds, nil +} + +func (s *dealStates7) array() adt.Array { + return s.Array +} + +func fromV7DealState(v7 market7.DealState) DealState { + return (DealState)(v7) +} + +type dealProposals7 struct { + adt.Array +} + +func (s *dealProposals7) Get(dealID abi.DealID) (*DealProposal, bool, error) { + var proposal7 market7.DealProposal + found, err := s.Array.Get(uint64(dealID), &proposal7) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + proposal := fromV7DealProposal(proposal7) + return &proposal, true, nil +} + +func (s *dealProposals7) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { + var dp7 market7.DealProposal + return s.Array.ForEach(&dp7, func(idx int64) error { + return cb(abi.DealID(idx), fromV7DealProposal(dp7)) + }) +} + +func (s *dealProposals7) decode(val *cbg.Deferred) (*DealProposal, error) { + var dp7 market7.DealProposal + if err := dp7.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + dp := fromV7DealProposal(dp7) + return &dp, nil +} + +func (s *dealProposals7) array() adt.Array { + return s.Array +} + +func fromV7DealProposal(v7 market7.DealProposal) DealProposal { + return (DealProposal)(v7) +} + +func (s *state7) GetState() interface{} { + return &s.State +} + +var _ PublishStorageDealsReturn = (*publishStorageDealsReturn7)(nil) + +func decodePublishStorageDealsReturn7(b []byte) (PublishStorageDealsReturn, error) { + var retval market7.PublishStorageDealsReturn + if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { + return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) + } + + return &publishStorageDealsReturn7{retval}, nil +} + +type publishStorageDealsReturn7 struct { + market7.PublishStorageDealsReturn +} + +func (r *publishStorageDealsReturn7) IsDealValid(index uint64) (bool, error) { + + return r.ValidDeals.IsSet(index) + +} + +func (r *publishStorageDealsReturn7) DealIDs() ([]abi.DealID, error) { + return r.IDs, nil +} diff --git a/pkg/types/specactors/builtin/miner/actor.go.template b/pkg/types/specactors/builtin/miner/actor.go.template index ff27f568b5..b58e5d82d3 100644 --- a/pkg/types/specactors/builtin/miner/actor.go.template +++ b/pkg/types/specactors/builtin/miner/actor.go.template @@ -1,9 +1,11 @@ +// FETCHED FROM LOTUS: builtin/miner/actor.go.template + package miner import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/peer" cbg "github.com/whyrusleeping/cbor-gen" @@ -17,7 +19,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/internal" + types "github.com/filecoin-project/venus/pkg/types/internal" miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" @@ -52,7 +54,7 @@ const MinSectorExpiration = miner0.MinSectorExpiration var DeclarationsMax = miner2.DeclarationsMax var AddressedSectorsMax = miner2.AddressedSectorsMax -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { {{range .versions}} case builtin{{.}}.StorageMinerActorCodeID: @@ -62,20 +64,20 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version) (State, error) { +func MakeState(store adt.Store, av actors.Version) (State, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return make{{.}}(store) {{end}} } return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return builtin{{.}}.StorageMinerActorCodeID, nil {{end}} } @@ -177,6 +179,7 @@ type SectorOnChainInfo struct { InitialPledge abi.TokenAmount ExpectedDayReward abi.TokenAmount ExpectedStoragePledge abi.TokenAmount + SectorKeyCID *cid.Cid } type SectorPreCommitInfo = miner0.SectorPreCommitInfo diff --git a/pkg/types/specactors/builtin/miner/diff.go b/pkg/types/specactors/builtin/miner/diff.go deleted file mode 100644 index e0ec2f39b2..0000000000 --- a/pkg/types/specactors/builtin/miner/diff.go +++ /dev/null @@ -1,127 +0,0 @@ -package miner - -import ( - "github.com/filecoin-project/go-state-types/abi" - adt2 "github.com/filecoin-project/venus/pkg/types/specactors/adt" - cbg "github.com/whyrusleeping/cbor-gen" -) - -func DiffPreCommits(pre, cur State) (*PreCommitChanges, error) { - results := new(PreCommitChanges) - - prep, err := pre.precommits() - if err != nil { - return nil, err - } - - curp, err := cur.precommits() - if err != nil { - return nil, err - } - - err = adt2.DiffAdtMap(prep, curp, &preCommitDiffer{results, pre, cur}) - if err != nil { - return nil, err - } - - return results, nil -} - -type preCommitDiffer struct { - Results *PreCommitChanges - pre, after State -} - -func (m *preCommitDiffer) AsKey(key string) (abi.Keyer, error) { - sector, err := abi.ParseUIntKey(key) - if err != nil { - return nil, err - } - return abi.UIntKey(sector), nil -} - -func (m *preCommitDiffer) Add(key string, val *cbg.Deferred) error { - sp, err := m.after.decodeSectorPreCommitOnChainInfo(val) - if err != nil { - return err - } - m.Results.Added = append(m.Results.Added, sp) - return nil -} - -func (m *preCommitDiffer) Modify(key string, from, to *cbg.Deferred) error { - return nil -} - -func (m *preCommitDiffer) Remove(key string, val *cbg.Deferred) error { - sp, err := m.pre.decodeSectorPreCommitOnChainInfo(val) - if err != nil { - return err - } - m.Results.Removed = append(m.Results.Removed, sp) - return nil -} - -func DiffSectors(pre, cur State) (*SectorChanges, error) { - results := new(SectorChanges) - - pres, err := pre.sectors() - if err != nil { - return nil, err - } - - curs, err := cur.sectors() - if err != nil { - return nil, err - } - - err = adt2.DiffAdtArray(pres, curs, §orDiffer{results, pre, cur}) - if err != nil { - return nil, err - } - - return results, nil -} - -type sectorDiffer struct { - Results *SectorChanges - pre, after State -} - -func (m *sectorDiffer) Add(key uint64, val *cbg.Deferred) error { - si, err := m.after.decodeSectorOnChainInfo(val) - if err != nil { - return err - } - m.Results.Added = append(m.Results.Added, si) - return nil -} - -func (m *sectorDiffer) Modify(key uint64, from, to *cbg.Deferred) error { - siFrom, err := m.pre.decodeSectorOnChainInfo(from) - if err != nil { - return err - } - - siTo, err := m.after.decodeSectorOnChainInfo(to) - if err != nil { - return err - } - - if siFrom.Expiration != siTo.Expiration { - m.Results.Extended = append(m.Results.Extended, SectorExtensions{ - From: siFrom, - To: siTo, - }) - } - return nil -} - -func (m *sectorDiffer) Remove(key uint64, val *cbg.Deferred) error { - si, err := m.pre.decodeSectorOnChainInfo(val) - if err != nil { - return err - } - m.Results.Removed = append(m.Results.Removed, si) - return nil -} diff --git a/pkg/types/specactors/builtin/miner/diff_deadlines.go b/pkg/types/specactors/builtin/miner/diff_deadlines.go deleted file mode 100644 index 7d686ece5b..0000000000 --- a/pkg/types/specactors/builtin/miner/diff_deadlines.go +++ /dev/null @@ -1,176 +0,0 @@ -package miner - -import ( - "errors" - - "github.com/filecoin-project/go-bitfield" - "github.com/filecoin-project/go-state-types/exitcode" -) - -type DeadlinesDiff map[uint64]DeadlineDiff - -func DiffDeadlines(pre, cur State) (DeadlinesDiff, error) { - changed, err := pre.DeadlinesChanged(cur) - if err != nil { - return nil, err - } - if !changed { - return nil, nil - } - - dlDiff := make(DeadlinesDiff) - if err := pre.ForEachDeadline(func(idx uint64, preDl Deadline) error { - curDl, err := cur.LoadDeadline(idx) - if err != nil { - return err - } - - diff, err := DiffDeadline(preDl, curDl) - if err != nil { - return err - } - - dlDiff[idx] = diff - return nil - }); err != nil { - return nil, err - } - return dlDiff, nil -} - -type DeadlineDiff map[uint64]*PartitionDiff - -func DiffDeadline(pre, cur Deadline) (DeadlineDiff, error) { - changed, err := pre.PartitionsChanged(cur) - if err != nil { - return nil, err - } - if !changed { - return nil, nil - } - - partDiff := make(DeadlineDiff) - if err := pre.ForEachPartition(func(idx uint64, prePart Partition) error { - // try loading current partition at this index - curPart, err := cur.LoadPartition(idx) - if err != nil { - if errors.Is(err, exitcode.ErrNotFound) { - // TODO correctness? - return nil // the partition was removed. - } - return err - } - - // compare it with the previous partition - diff, err := DiffPartition(prePart, curPart) - if err != nil { - return err - } - - partDiff[idx] = diff - return nil - }); err != nil { - return nil, err - } - - // all previous partitions have been walked. - // all partitions in cur and not in prev are new... can they be faulty already? - // TODO is this correct? - if err := cur.ForEachPartition(func(idx uint64, curPart Partition) error { - if _, found := partDiff[idx]; found { - return nil - } - faults, err := curPart.FaultySectors() - if err != nil { - return err - } - recovering, err := curPart.RecoveringSectors() - if err != nil { - return err - } - partDiff[idx] = &PartitionDiff{ - Removed: bitfield.New(), - Recovered: bitfield.New(), - Faulted: faults, - Recovering: recovering, - } - - return nil - }); err != nil { - return nil, err - } - - return partDiff, nil -} - -type PartitionDiff struct { - Removed bitfield.BitField - Recovered bitfield.BitField - Faulted bitfield.BitField - Recovering bitfield.BitField -} - -func DiffPartition(pre, cur Partition) (*PartitionDiff, error) { - prevLiveSectors, err := pre.LiveSectors() - if err != nil { - return nil, err - } - curLiveSectors, err := cur.LiveSectors() - if err != nil { - return nil, err - } - - removed, err := bitfield.SubtractBitField(prevLiveSectors, curLiveSectors) - if err != nil { - return nil, err - } - - prevRecoveries, err := pre.RecoveringSectors() - if err != nil { - return nil, err - } - - curRecoveries, err := cur.RecoveringSectors() - if err != nil { - return nil, err - } - - recovering, err := bitfield.SubtractBitField(curRecoveries, prevRecoveries) - if err != nil { - return nil, err - } - - prevFaults, err := pre.FaultySectors() - if err != nil { - return nil, err - } - - curFaults, err := cur.FaultySectors() - if err != nil { - return nil, err - } - - faulted, err := bitfield.SubtractBitField(curFaults, prevFaults) - if err != nil { - return nil, err - } - - // all current good sectors - curActiveSectors, err := cur.ActiveSectors() - if err != nil { - return nil, err - } - - // sectors that were previously fault and are now currently active are considered recovered. - recovered, err := bitfield.IntersectBitField(prevFaults, curActiveSectors) - if err != nil { - return nil, err - } - - return &PartitionDiff{ - Removed: removed, - Recovered: recovered, - Faulted: faulted, - Recovering: recovering, - }, nil -} diff --git a/pkg/types/specactors/builtin/miner/miner.go b/pkg/types/specactors/builtin/miner/miner.go index 6c1c721067..8233c8669a 100644 --- a/pkg/types/specactors/builtin/miner/miner.go +++ b/pkg/types/specactors/builtin/miner/miner.go @@ -1,9 +1,11 @@ +// FETCHED FROM LOTUS: builtin/miner/actor.go.template + package miner import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/peer" cbg "github.com/whyrusleeping/cbor-gen" @@ -15,9 +17,9 @@ import ( "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/venus/pkg/types/internal" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + types "github.com/filecoin-project/venus/pkg/types/internal" miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" @@ -35,6 +37,9 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + ) func init() { @@ -63,9 +68,13 @@ func init() { return load6(store, root) }) + builtin.RegisterActorState(builtin7.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } -var Methods = builtin6.MethodsMiner +var Methods = builtin7.MethodsMiner // Unchanged between v0, v2, v3, v4, and v5 actors var WPoStProvingPeriod = miner0.WPoStProvingPeriod @@ -81,7 +90,7 @@ const MinSectorExpiration = miner0.MinSectorExpiration var DeclarationsMax = miner2.DeclarationsMax var AddressedSectorsMax = miner2.AddressedSectorsMax -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { case builtin0.StorageMinerActorCodeID: @@ -102,56 +111,65 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { case builtin6.StorageMinerActorCodeID: return load6(store, act.Head) - } + case builtin7.StorageMinerActorCodeID: + return load7(store, act.Head) + +} return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version) (State, error) { +func MakeState(store adt.Store, av actors.Version) (State, error) { switch av { - case specactors.Version0: + case actors.Version0: return make0(store) - case specactors.Version2: + case actors.Version2: return make2(store) - case specactors.Version3: + case actors.Version3: return make3(store) - case specactors.Version4: + case actors.Version4: return make4(store) - case specactors.Version5: + case actors.Version5: return make5(store) - case specactors.Version6: + case actors.Version6: return make6(store) - } + case actors.Version7: + return make7(store) + +} return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { - case specactors.Version0: + case actors.Version0: return builtin0.StorageMinerActorCodeID, nil - case specactors.Version2: + case actors.Version2: return builtin2.StorageMinerActorCodeID, nil - case specactors.Version3: + case actors.Version3: return builtin3.StorageMinerActorCodeID, nil - case specactors.Version4: + case actors.Version4: return builtin4.StorageMinerActorCodeID, nil - case specactors.Version5: + case actors.Version5: return builtin5.StorageMinerActorCodeID, nil - case specactors.Version6: + case actors.Version6: return builtin6.StorageMinerActorCodeID, nil + case actors.Version7: + return builtin7.StorageMinerActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -176,8 +194,8 @@ type State interface { LoadSectors(sectorNos *bitfield.BitField) ([]*SectorOnChainInfo, error) NumLiveSectors() (uint64, error) IsAllocated(abi.SectorNumber) (bool, error) - // UnallocatedSectorNumbers returns up to count unallocated sector numbers (or less than - // count if there aren't enough). + // UnallocatedSectorNumbers returns up to count unallocated sector numbers (or less than + // count if there aren't enough). UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) GetAllocatedSectors() (*bitfield.BitField, error) @@ -251,6 +269,7 @@ type SectorOnChainInfo struct { InitialPledge abi.TokenAmount ExpectedDayReward abi.TokenAmount ExpectedStoragePledge abi.TokenAmount + SectorKeyCID *cid.Cid } type SectorPreCommitInfo = miner0.SectorPreCommitInfo diff --git a/pkg/types/specactors/builtin/miner/state.go.template b/pkg/types/specactors/builtin/miner/state.go.template index e999fe0963..76e96fc345 100644 --- a/pkg/types/specactors/builtin/miner/state.go.template +++ b/pkg/types/specactors/builtin/miner/state.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + package miner import ( @@ -138,11 +140,22 @@ func (s *state{{.v}}) GetSectorExpiration(num abi.SectorNumber) (*SectorExpirati return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be +{{if (ge .v 7) -}} + // 1. If the sector is non-faulty, it will expire on-time (can be + // learned from the sector info). +{{- else -}} + // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. +{{- end}} +{{if (ge .v 6) -}} + // 2. If it's faulty, it will expire early within the first 42 entries + // of the expiration queue. +{{- else -}} // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. +{{- end}} + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner{{.v}}.Deadline) error { @@ -554,8 +567,7 @@ func (p *partition{{.v}}) UnprovenSectors() (bitfield.BitField, error) { } func fromV{{.v}}SectorOnChainInfo(v{{.v}} miner{{.v}}.SectorOnChainInfo) SectorOnChainInfo { -{{if (ge .v 2)}} - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v{{.v}}.SectorNumber, SealProof: v{{.v}}.SealProof, SealedCID: v{{.v}}.SealedCID, @@ -567,10 +579,11 @@ func fromV{{.v}}SectorOnChainInfo(v{{.v}} miner{{.v}}.SectorOnChainInfo) SectorO InitialPledge: v{{.v}}.InitialPledge, ExpectedDayReward: v{{.v}}.ExpectedDayReward, ExpectedStoragePledge: v{{.v}}.ExpectedStoragePledge, + {{if (ge .v 7)}} + SectorKeyCID: v{{.v}}.SectorKeyCID, + {{end}} } -{{else}} - return (SectorOnChainInfo)(v0) -{{end}} + return info } func fromV{{.v}}SectorPreCommitOnChainInfo(v{{.v}} miner{{.v}}.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/pkg/types/specactors/builtin/miner/utils.go b/pkg/types/specactors/builtin/miner/utils.go deleted file mode 100644 index 2f24e84540..0000000000 --- a/pkg/types/specactors/builtin/miner/utils.go +++ /dev/null @@ -1,69 +0,0 @@ -package miner - -import ( - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-bitfield" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" -) - -func AllPartSectors(mas State, sget func(Partition) (bitfield.BitField, error)) (bitfield.BitField, error) { - var parts []bitfield.BitField - - err := mas.ForEachDeadline(func(dlidx uint64, dl Deadline) error { - return dl.ForEachPartition(func(partidx uint64, part Partition) error { - s, err := sget(part) - if err != nil { - return xerrors.Errorf("getting sector list (dl: %d, part %d): %w", dlidx, partidx, err) - } - - parts = append(parts, s) - return nil - }) - }) - if err != nil { - return bitfield.BitField{}, err - } - - return bitfield.MultiMerge(parts...) -} - -// SealProofTypeFromSectorSize returns preferred seal proof type for creating -// new miner actors and new sectors -func SealProofTypeFromSectorSize(ssize abi.SectorSize, nv network.Version) (abi.RegisteredSealProof, error) { - switch { - case nv < network.Version7: - switch ssize { - case 2 << 10: - return abi.RegisteredSealProof_StackedDrg2KiBV1, nil - case 8 << 20: - return abi.RegisteredSealProof_StackedDrg8MiBV1, nil - case 512 << 20: - return abi.RegisteredSealProof_StackedDrg512MiBV1, nil - case 32 << 30: - return abi.RegisteredSealProof_StackedDrg32GiBV1, nil - case 64 << 30: - return abi.RegisteredSealProof_StackedDrg64GiBV1, nil - default: - return 0, xerrors.Errorf("unsupported sector size for miner: %v", ssize) - } - case nv >= network.Version7: - switch ssize { - case 2 << 10: - return abi.RegisteredSealProof_StackedDrg2KiBV1_1, nil - case 8 << 20: - return abi.RegisteredSealProof_StackedDrg8MiBV1_1, nil - case 512 << 20: - return abi.RegisteredSealProof_StackedDrg512MiBV1_1, nil - case 32 << 30: - return abi.RegisteredSealProof_StackedDrg32GiBV1_1, nil - case 64 << 30: - return abi.RegisteredSealProof_StackedDrg64GiBV1_1, nil - default: - return 0, xerrors.Errorf("unsupported sector size for miner: %v", ssize) - } - } - - return 0, xerrors.Errorf("unsupported network version") -} diff --git a/pkg/types/specactors/builtin/miner/v0.go b/pkg/types/specactors/builtin/miner/v0.go index 37ddd6ad51..1d68b5a2d0 100644 --- a/pkg/types/specactors/builtin/miner/v0.go +++ b/pkg/types/specactors/builtin/miner/v0.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + package miner import ( @@ -18,6 +20,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" + miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" ) @@ -135,11 +138,12 @@ func (s *state0) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be +// 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries +// 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner0.Deadline) error { @@ -208,7 +212,7 @@ func (s *state0) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state0) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt0.AsMap(s.store, s.State.PreCommittedSectors) +precommitted, err := adt0.AsMap(s.store, s.State.PreCommittedSectors) if err != nil { return err } @@ -287,7 +291,7 @@ func (s *state0) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, allocatedRuns, ) if err != nil { @@ -442,10 +446,10 @@ func (s *state0) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state0) EraseAllUnproven() error { - - // field doesn't exist until v2 - return nil - + + // field doesn't exist until v2 + return nil + } func (d *deadline0) LoadPartition(idx uint64) (Partition, error) { @@ -505,9 +509,21 @@ func (p *partition0) UnprovenSectors() (bitfield.BitField, error) { } func fromV0SectorOnChainInfo(v0 miner0.SectorOnChainInfo) SectorOnChainInfo { - - return (SectorOnChainInfo)(v0) - + info := SectorOnChainInfo{ + SectorNumber: v0.SectorNumber, + SealProof: v0.SealProof, + SealedCID: v0.SealedCID, + DealIDs: v0.DealIDs, + Activation: v0.Activation, + Expiration: v0.Expiration, + DealWeight: v0.DealWeight, + VerifiedDealWeight: v0.VerifiedDealWeight, + InitialPledge: v0.InitialPledge, + ExpectedDayReward: v0.ExpectedDayReward, + ExpectedStoragePledge: v0.ExpectedStoragePledge, + + } + return info } func fromV0SectorPreCommitOnChainInfo(v0 miner0.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/pkg/types/specactors/builtin/miner/v2.go b/pkg/types/specactors/builtin/miner/v2.go index eda31e41bf..1903441f29 100644 --- a/pkg/types/specactors/builtin/miner/v2.go +++ b/pkg/types/specactors/builtin/miner/v2.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + package miner import ( @@ -16,6 +18,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" + miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" ) @@ -133,11 +136,12 @@ func (s *state2) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be +// 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries +// 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner2.Deadline) error { @@ -206,7 +210,7 @@ func (s *state2) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state2) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt2.AsMap(s.store, s.State.PreCommittedSectors) +precommitted, err := adt2.AsMap(s.store, s.State.PreCommittedSectors) if err != nil { return err } @@ -285,7 +289,7 @@ func (s *state2) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, allocatedRuns, ) if err != nil { @@ -440,42 +444,42 @@ func (s *state2) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state2) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner2.Deadline) error { - ps, err := dl.PartitionsArray(s.store) + + dls, err := s.State.LoadDeadlines(s.store) if err != nil { return err } - var part miner2.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) + err = dls.ForEach(s.store, func(dindx uint64, dl *miner2.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } - if err != nil { - return err - } + var part miner2.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } - dl.Partitions, err = ps.Root() + return dls.UpdateDeadline(s.store, dindx, dl) + }) if err != nil { return err } - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline2) LoadPartition(idx uint64) (Partition, error) { @@ -535,8 +539,7 @@ func (p *partition2) UnprovenSectors() (bitfield.BitField, error) { } func fromV2SectorOnChainInfo(v2 miner2.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v2.SectorNumber, SealProof: v2.SealProof, SealedCID: v2.SealedCID, @@ -548,8 +551,9 @@ func fromV2SectorOnChainInfo(v2 miner2.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v2.InitialPledge, ExpectedDayReward: v2.ExpectedDayReward, ExpectedStoragePledge: v2.ExpectedStoragePledge, + } - + return info } func fromV2SectorPreCommitOnChainInfo(v2 miner2.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/pkg/types/specactors/builtin/miner/v3.go b/pkg/types/specactors/builtin/miner/v3.go index 132f7d7116..4353b7206f 100644 --- a/pkg/types/specactors/builtin/miner/v3.go +++ b/pkg/types/specactors/builtin/miner/v3.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + package miner import ( @@ -16,6 +18,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" @@ -135,11 +138,12 @@ func (s *state3) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be +// 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries +// 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner3.Deadline) error { @@ -208,7 +212,7 @@ func (s *state3) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state3) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt3.AsMap(s.store, s.State.PreCommittedSectors, builtin3.DefaultHamtBitwidth) +precommitted, err := adt3.AsMap(s.store, s.State.PreCommittedSectors, builtin3.DefaultHamtBitwidth) if err != nil { return err } @@ -287,7 +291,7 @@ func (s *state3) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, allocatedRuns, ) if err != nil { @@ -437,42 +441,42 @@ func (s *state3) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state3) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner3.Deadline) error { - ps, err := dl.PartitionsArray(s.store) + + dls, err := s.State.LoadDeadlines(s.store) if err != nil { return err } - var part miner3.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) + err = dls.ForEach(s.store, func(dindx uint64, dl *miner3.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } - if err != nil { - return err - } + var part miner3.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } - dl.Partitions, err = ps.Root() + return dls.UpdateDeadline(s.store, dindx, dl) + }) if err != nil { return err } - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline3) LoadPartition(idx uint64) (Partition, error) { @@ -536,8 +540,7 @@ func (p *partition3) UnprovenSectors() (bitfield.BitField, error) { } func fromV3SectorOnChainInfo(v3 miner3.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v3.SectorNumber, SealProof: v3.SealProof, SealedCID: v3.SealedCID, @@ -549,8 +552,9 @@ func fromV3SectorOnChainInfo(v3 miner3.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v3.InitialPledge, ExpectedDayReward: v3.ExpectedDayReward, ExpectedStoragePledge: v3.ExpectedStoragePledge, + } - + return info } func fromV3SectorPreCommitOnChainInfo(v3 miner3.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/pkg/types/specactors/builtin/miner/v4.go b/pkg/types/specactors/builtin/miner/v4.go index 5d3a9d2e85..67a3a5e55b 100644 --- a/pkg/types/specactors/builtin/miner/v4.go +++ b/pkg/types/specactors/builtin/miner/v4.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + package miner import ( @@ -16,6 +18,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" @@ -135,11 +138,12 @@ func (s *state4) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be +// 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries +// 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner4.Deadline) error { @@ -208,7 +212,7 @@ func (s *state4) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state4) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt4.AsMap(s.store, s.State.PreCommittedSectors, builtin4.DefaultHamtBitwidth) +precommitted, err := adt4.AsMap(s.store, s.State.PreCommittedSectors, builtin4.DefaultHamtBitwidth) if err != nil { return err } @@ -287,7 +291,7 @@ func (s *state4) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, allocatedRuns, ) if err != nil { @@ -437,42 +441,42 @@ func (s *state4) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state4) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner4.Deadline) error { - ps, err := dl.PartitionsArray(s.store) + + dls, err := s.State.LoadDeadlines(s.store) if err != nil { return err } - var part miner4.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) + err = dls.ForEach(s.store, func(dindx uint64, dl *miner4.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } - if err != nil { - return err - } + var part miner4.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } - dl.Partitions, err = ps.Root() + return dls.UpdateDeadline(s.store, dindx, dl) + }) if err != nil { return err } - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline4) LoadPartition(idx uint64) (Partition, error) { @@ -536,8 +540,7 @@ func (p *partition4) UnprovenSectors() (bitfield.BitField, error) { } func fromV4SectorOnChainInfo(v4 miner4.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v4.SectorNumber, SealProof: v4.SealProof, SealedCID: v4.SealedCID, @@ -549,8 +552,9 @@ func fromV4SectorOnChainInfo(v4 miner4.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v4.InitialPledge, ExpectedDayReward: v4.ExpectedDayReward, ExpectedStoragePledge: v4.ExpectedStoragePledge, + } - + return info } func fromV4SectorPreCommitOnChainInfo(v4 miner4.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/pkg/types/specactors/builtin/miner/v5.go b/pkg/types/specactors/builtin/miner/v5.go index 7dfdee83bc..4a5ccd28c6 100644 --- a/pkg/types/specactors/builtin/miner/v5.go +++ b/pkg/types/specactors/builtin/miner/v5.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + package miner import ( @@ -16,6 +18,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" @@ -135,11 +138,12 @@ func (s *state5) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be +// 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries +// 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner5.Deadline) error { @@ -208,7 +212,7 @@ func (s *state5) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state5) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt5.AsMap(s.store, s.State.PreCommittedSectors, builtin5.DefaultHamtBitwidth) +precommitted, err := adt5.AsMap(s.store, s.State.PreCommittedSectors, builtin5.DefaultHamtBitwidth) if err != nil { return err } @@ -287,7 +291,7 @@ func (s *state5) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, allocatedRuns, ) if err != nil { @@ -437,42 +441,42 @@ func (s *state5) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state5) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner5.Deadline) error { - ps, err := dl.PartitionsArray(s.store) + + dls, err := s.State.LoadDeadlines(s.store) if err != nil { return err } - var part miner5.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) + err = dls.ForEach(s.store, func(dindx uint64, dl *miner5.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } - if err != nil { - return err - } + var part miner5.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } - dl.Partitions, err = ps.Root() + return dls.UpdateDeadline(s.store, dindx, dl) + }) if err != nil { return err } - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline5) LoadPartition(idx uint64) (Partition, error) { @@ -536,8 +540,7 @@ func (p *partition5) UnprovenSectors() (bitfield.BitField, error) { } func fromV5SectorOnChainInfo(v5 miner5.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v5.SectorNumber, SealProof: v5.SealProof, SealedCID: v5.SealedCID, @@ -549,8 +552,9 @@ func fromV5SectorOnChainInfo(v5 miner5.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v5.InitialPledge, ExpectedDayReward: v5.ExpectedDayReward, ExpectedStoragePledge: v5.ExpectedStoragePledge, + } - + return info } func fromV5SectorPreCommitOnChainInfo(v5 miner5.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/pkg/types/specactors/builtin/miner/v6.go b/pkg/types/specactors/builtin/miner/v6.go index d6eb4f054c..f33d42cdba 100644 --- a/pkg/types/specactors/builtin/miner/v6.go +++ b/pkg/types/specactors/builtin/miner/v6.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + package miner import ( @@ -16,6 +18,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" @@ -135,11 +138,12 @@ func (s *state6) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be +// 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries +// 2. If it's faulty, it will expire early within the first 42 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner6.Deadline) error { @@ -208,7 +212,7 @@ func (s *state6) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state6) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt6.AsMap(s.store, s.State.PreCommittedSectors, builtin6.DefaultHamtBitwidth) +precommitted, err := adt6.AsMap(s.store, s.State.PreCommittedSectors, builtin6.DefaultHamtBitwidth) if err != nil { return err } @@ -287,7 +291,7 @@ func (s *state6) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, allocatedRuns, ) if err != nil { @@ -437,42 +441,42 @@ func (s *state6) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state6) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner6.Deadline) error { - ps, err := dl.PartitionsArray(s.store) + + dls, err := s.State.LoadDeadlines(s.store) if err != nil { return err } - var part miner6.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) + err = dls.ForEach(s.store, func(dindx uint64, dl *miner6.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } - if err != nil { - return err - } + var part miner6.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } - dl.Partitions, err = ps.Root() + return dls.UpdateDeadline(s.store, dindx, dl) + }) if err != nil { return err } - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline6) LoadPartition(idx uint64) (Partition, error) { @@ -536,8 +540,7 @@ func (p *partition6) UnprovenSectors() (bitfield.BitField, error) { } func fromV6SectorOnChainInfo(v6 miner6.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v6.SectorNumber, SealProof: v6.SealProof, SealedCID: v6.SealedCID, @@ -549,8 +552,9 @@ func fromV6SectorOnChainInfo(v6 miner6.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v6.InitialPledge, ExpectedDayReward: v6.ExpectedDayReward, ExpectedStoragePledge: v6.ExpectedStoragePledge, + } - + return info } func fromV6SectorPreCommitOnChainInfo(v6 miner6.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/pkg/types/specactors/builtin/miner/v7.go b/pkg/types/specactors/builtin/miner/v7.go new file mode 100644 index 0000000000..7902229e6c --- /dev/null +++ b/pkg/types/specactors/builtin/miner/v7.go @@ -0,0 +1,575 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + +package miner + +import ( + "bytes" + "errors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/pkg/types/specactors/adt" + + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + out.State = miner7.State{} + return &out, nil +} + +type state7 struct { + miner7.State + store adt.Store +} + +type deadline7 struct { + miner7.Deadline + store adt.Store +} + +type partition7 struct { + miner7.Partition + store adt.Store +} + +func (s *state7) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { + defer func() { + if r := recover(); r != nil { + err = xerrors.Errorf("failed to get available balance: %w", r) + available = abi.NewTokenAmount(0) + } + }() + // this panics if the miner doesnt have enough funds to cover their locked pledge + available, err = s.GetAvailableBalance(bal) + return available, err +} + +func (s *state7) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.CheckVestedFunds(s.store, epoch) +} + +func (s *state7) LockedFunds() (LockedFunds, error) { + return LockedFunds{ + VestingFunds: s.State.LockedFunds, + InitialPledgeRequirement: s.State.InitialPledge, + PreCommitDeposits: s.State.PreCommitDeposits, + }, nil +} + +func (s *state7) FeeDebt() (abi.TokenAmount, error) { + return s.State.FeeDebt, nil +} + +func (s *state7) InitialPledge() (abi.TokenAmount, error) { + return s.State.InitialPledge, nil +} + +func (s *state7) PreCommitDeposits() (abi.TokenAmount, error) { + return s.State.PreCommitDeposits, nil +} + +func (s *state7) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { + info, ok, err := s.State.GetSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV7SectorOnChainInfo(*info) + return &ret, nil +} + +func (s *state7) FindSector(num abi.SectorNumber) (*SectorLocation, error) { + dlIdx, partIdx, err := s.State.FindSector(s.store, num) + if err != nil { + return nil, err + } + return &SectorLocation{ + Deadline: dlIdx, + Partition: partIdx, + }, nil +} + +func (s *state7) NumLiveSectors() (uint64, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return 0, err + } + var total uint64 + if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner7.Deadline) error { + total += dl.LiveSectors + return nil + }); err != nil { + return 0, err + } + return total, nil +} + +// GetSectorExpiration returns the effective expiration of the given sector. +// +// If the sector does not expire early, the Early expiration field is 0. +func (s *state7) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + // NOTE: this can be optimized significantly. +// 1. If the sector is non-faulty, it will expire on-time (can be + // learned from the sector info). +// 2. If it's faulty, it will expire early within the first 42 entries + // of the expiration queue. + + stopErr := errors.New("stop") + out := SectorExpiration{} + err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner7.Deadline) error { + partitions, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + quant := s.State.QuantSpecForDeadline(dlIdx) + var part miner7.Partition + return partitions.ForEach(&part, func(partIdx int64) error { + if found, err := part.Sectors.IsSet(uint64(num)); err != nil { + return err + } else if !found { + return nil + } + if found, err := part.Terminated.IsSet(uint64(num)); err != nil { + return err + } else if found { + // already terminated + return stopErr + } + + q, err := miner7.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner7.PartitionExpirationAmtBitwidth) + if err != nil { + return err + } + var exp miner7.ExpirationSet + return q.ForEach(&exp, func(epoch int64) error { + if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { + return err + } else if early { + out.Early = abi.ChainEpoch(epoch) + return nil + } + if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { + return err + } else if onTime { + out.OnTime = abi.ChainEpoch(epoch) + return stopErr + } + return nil + }) + }) + }) + if err == stopErr { + err = nil + } + if err != nil { + return nil, err + } + if out.Early == 0 && out.OnTime == 0 { + return nil, xerrors.Errorf("failed to find sector %d", num) + } + return &out, nil +} + +func (s *state7) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { + info, ok, err := s.State.GetPrecommittedSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV7SectorPreCommitOnChainInfo(*info) + + return &ret, nil +} + +func (s *state7) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { +precommitted, err := adt7.AsMap(s.store, s.State.PreCommittedSectors, builtin7.DefaultHamtBitwidth) + if err != nil { + return err + } + + var info miner7.SectorPreCommitOnChainInfo + if err := precommitted.ForEach(&info, func(_ string) error { + return cb(fromV7SectorPreCommitOnChainInfo(info)) + }); err != nil { + return err + } + + return nil +} + +func (s *state7) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { + sectors, err := miner7.LoadSectors(s.store, s.State.Sectors) + if err != nil { + return nil, err + } + + // If no sector numbers are specified, load all. + if snos == nil { + infos := make([]*SectorOnChainInfo, 0, sectors.Length()) + var info7 miner7.SectorOnChainInfo + if err := sectors.ForEach(&info7, func(_ int64) error { + info := fromV7SectorOnChainInfo(info7) + infos = append(infos, &info) + return nil + }); err != nil { + return nil, err + } + return infos, nil + } + + // Otherwise, load selected. + infos7, err := sectors.Load(*snos) + if err != nil { + return nil, err + } + infos := make([]*SectorOnChainInfo, len(infos7)) + for i, info7 := range infos7 { + info := fromV7SectorOnChainInfo(*info7) + infos[i] = &info + } + return infos, nil +} + +func (s *state7) loadAllocatedSectorNumbers() (bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) + return allocatedSectors, err +} + +func (s *state7) IsAllocated(num abi.SectorNumber) (bool, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return false, err + } + + return allocatedSectors.IsSet(uint64(num)) +} + +func (s *state7) GetProvingPeriodStart() (abi.ChainEpoch, error) { + return s.State.ProvingPeriodStart, nil +} + +func (s *state7) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return nil, err + } + + allocatedRuns, err := allocatedSectors.RunIterator() + if err != nil { + return nil, err + } + + unallocatedRuns, err := rle.Subtract( + &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + allocatedRuns, + ) + if err != nil { + return nil, err + } + + iter, err := rle.BitsFromRuns(unallocatedRuns) + if err != nil { + return nil, err + } + + sectors := make([]abi.SectorNumber, 0, count) + for iter.HasNext() && len(sectors) < count { + nextNo, err := iter.Next() + if err != nil { + return nil, err + } + sectors = append(sectors, abi.SectorNumber(nextNo)) + } + + return sectors, nil +} + +func (s *state7) GetAllocatedSectors() (*bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { + return nil, err + } + + return &allocatedSectors, nil +} + +func (s *state7) LoadDeadline(idx uint64) (Deadline, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + dl, err := dls.LoadDeadline(s.store, idx) + if err != nil { + return nil, err + } + return &deadline7{*dl, s.store}, nil +} + +func (s *state7) ForEachDeadline(cb func(uint64, Deadline) error) error { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + return dls.ForEach(s.store, func(i uint64, dl *miner7.Deadline) error { + return cb(i, &deadline7{*dl, s.store}) + }) +} + +func (s *state7) NumDeadlines() (uint64, error) { + return miner7.WPoStPeriodDeadlines, nil +} + +func (s *state7) DeadlinesChanged(other State) (bool, error) { + other7, ok := other.(*state7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !s.State.Deadlines.Equals(other7.Deadlines), nil +} + +func (s *state7) MinerInfoChanged(other State) (bool, error) { + other0, ok := other.(*state7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Info.Equals(other0.State.Info), nil +} + +func (s *state7) Info() (MinerInfo, error) { + info, err := s.State.GetInfo(s.store) + if err != nil { + return MinerInfo{}, err + } + + var pid *peer.ID + if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { + pid = &peerID + } + + mi := MinerInfo{ + Owner: info.Owner, + Worker: info.Worker, + ControlAddresses: info.ControlAddresses, + + NewWorker: address.Undef, + WorkerChangeEpoch: -1, + + PeerId: pid, + Multiaddrs: info.Multiaddrs, + WindowPoStProofType: info.WindowPoStProofType, + SectorSize: info.SectorSize, + WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, + ConsensusFaultElapsed: info.ConsensusFaultElapsed, + } + + if info.PendingWorkerKey != nil { + mi.NewWorker = info.PendingWorkerKey.NewWorker + mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt + } + + return mi, nil +} + +func (s *state7) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { + return s.State.RecordedDeadlineInfo(epoch), nil +} + +func (s *state7) DeadlineCronActive() (bool, error) { + return s.State.DeadlineCronActive, nil +} + +func (s *state7) sectors() (adt.Array, error) { + return adt7.AsArray(s.store, s.Sectors, miner7.SectorsAmtBitwidth) +} + +func (s *state7) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { + var si miner7.SectorOnChainInfo + err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorOnChainInfo{}, err + } + + return fromV7SectorOnChainInfo(si), nil +} + +func (s *state7) precommits() (adt.Map, error) { + return adt7.AsMap(s.store, s.PreCommittedSectors, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { + var sp miner7.SectorPreCommitOnChainInfo + err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorPreCommitOnChainInfo{}, err + } + + return fromV7SectorPreCommitOnChainInfo(sp), nil +} + +func (s *state7) EraseAllUnproven() error { + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner7.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner7.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + +} + +func (d *deadline7) LoadPartition(idx uint64) (Partition, error) { + p, err := d.Deadline.LoadPartition(d.store, idx) + if err != nil { + return nil, err + } + return &partition7{*p, d.store}, nil +} + +func (d *deadline7) ForEachPartition(cb func(uint64, Partition) error) error { + ps, err := d.Deadline.PartitionsArray(d.store) + if err != nil { + return err + } + var part miner7.Partition + return ps.ForEach(&part, func(i int64) error { + return cb(uint64(i), &partition7{part, d.store}) + }) +} + +func (d *deadline7) PartitionsChanged(other Deadline) (bool, error) { + other7, ok := other.(*deadline7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !d.Deadline.Partitions.Equals(other7.Deadline.Partitions), nil +} + +func (d *deadline7) PartitionsPoSted() (bitfield.BitField, error) { + return d.Deadline.PartitionsPoSted, nil +} + +func (d *deadline7) DisputableProofCount() (uint64, error) { + + ops, err := d.OptimisticProofsSnapshotArray(d.store) + if err != nil { + return 0, err + } + + return ops.Length(), nil + +} + +func (p *partition7) AllSectors() (bitfield.BitField, error) { + return p.Partition.Sectors, nil +} + +func (p *partition7) FaultySectors() (bitfield.BitField, error) { + return p.Partition.Faults, nil +} + +func (p *partition7) RecoveringSectors() (bitfield.BitField, error) { + return p.Partition.Recoveries, nil +} + +func (p *partition7) UnprovenSectors() (bitfield.BitField, error) { + return p.Partition.Unproven, nil +} + +func fromV7SectorOnChainInfo(v7 miner7.SectorOnChainInfo) SectorOnChainInfo { + info := SectorOnChainInfo{ + SectorNumber: v7.SectorNumber, + SealProof: v7.SealProof, + SealedCID: v7.SealedCID, + DealIDs: v7.DealIDs, + Activation: v7.Activation, + Expiration: v7.Expiration, + DealWeight: v7.DealWeight, + VerifiedDealWeight: v7.VerifiedDealWeight, + InitialPledge: v7.InitialPledge, + ExpectedDayReward: v7.ExpectedDayReward, + ExpectedStoragePledge: v7.ExpectedStoragePledge, + + SectorKeyCID: v7.SectorKeyCID, + + } + return info +} + +func fromV7SectorPreCommitOnChainInfo(v7 miner7.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { + + return SectorPreCommitOnChainInfo{ + Info: (SectorPreCommitInfo)(v7.Info), + PreCommitDeposit: v7.PreCommitDeposit, + PreCommitEpoch: v7.PreCommitEpoch, + DealWeight: v7.DealWeight, + VerifiedDealWeight: v7.VerifiedDealWeight, + } + +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/pkg/types/specactors/builtin/multisig/actor.go.template b/pkg/types/specactors/builtin/multisig/actor.go.template index b36d83afd4..411afa16ee 100644 --- a/pkg/types/specactors/builtin/multisig/actor.go.template +++ b/pkg/types/specactors/builtin/multisig/actor.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/multisig/actor.go.template + package multisig import ( @@ -18,10 +20,10 @@ import ( builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" {{end}} - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/internal" + types "github.com/filecoin-project/venus/pkg/types/internal" ) func init() { @@ -31,7 +33,7 @@ func init() { }) {{end}}} -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { {{range .versions}} case builtin{{.}}.MultisigActorCodeID: @@ -41,20 +43,20 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { +func MakeState(store adt.Store, av actors.Version, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return make{{.}}(store, signers, threshold, startEpoch, unlockDuration, initialBalance) {{end}} } return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return builtin{{.}}.MultisigActorCodeID, nil {{end}} } @@ -84,10 +86,10 @@ type Transaction = msig0.Transaction var Methods = builtin{{.latestVersion}}.MethodsMultisig -func Message(version specactors.Version, from address.Address) MessageBuilder { +func Message(version actors.Version, from address.Address) MessageBuilder { switch version { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return message{{.}}{{"{"}}{{if (ge . 2)}}message0{from}{{else}}from{{end}}} {{end}} default: panic(fmt.Sprintf("unsupported actors version: %d", version)) @@ -98,17 +100,17 @@ type MessageBuilder interface { // Create a new multisig with the specified parameters. Create(signers []address.Address, threshold uint64, vestingStart, vestingDuration abi.ChainEpoch, - initialAmount abi.TokenAmount) (*internal.Message, error) + initialAmount abi.TokenAmount) (*types.Message, error) // Propose a transaction to the given multisig. Propose(msig, target address.Address, amt abi.TokenAmount, - method abi.MethodNum, params []byte) (*internal.Message, error) + method abi.MethodNum, params []byte) (*types.Message, error) // Approve a multisig transaction. The "hash" is optional. - Approve(msig address.Address, txID uint64, hash *ProposalHashData) (*internal.Message, error) + Approve(msig address.Address, txID uint64, hash *ProposalHashData) (*types.Message, error) // Cancel a multisig transaction. The "hash" is optional. - Cancel(msig address.Address, txID uint64, hash *ProposalHashData) (*internal.Message, error) + Cancel(msig address.Address, txID uint64, hash *ProposalHashData) (*types.Message, error) } // this type is the same between v0 and v2 @@ -137,5 +139,5 @@ func txnParams(id uint64, data *ProposalHashData) ([]byte, error) { params.ProposalHash = hash[:] } - return specactors.SerializeParams(¶ms) + return actors.SerializeParams(¶ms) } diff --git a/pkg/types/specactors/builtin/multisig/diff.go b/pkg/types/specactors/builtin/multisig/diff.go deleted file mode 100644 index f598c2dacb..0000000000 --- a/pkg/types/specactors/builtin/multisig/diff.go +++ /dev/null @@ -1,133 +0,0 @@ -package multisig - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - adt2 "github.com/filecoin-project/venus/pkg/types/specactors/adt" - cbg "github.com/whyrusleeping/cbor-gen" -) - -type PendingTransactionChanges struct { - Added []TransactionChange - Modified []TransactionModification - Removed []TransactionChange -} - -type TransactionChange struct { - TxID int64 - Tx Transaction -} - -type TransactionModification struct { - TxID int64 - From Transaction - To Transaction -} - -func DiffPendingTransactions(pre, cur State) (*PendingTransactionChanges, error) { - results := new(PendingTransactionChanges) - if changed, err := pre.PendingTxnChanged(cur); err != nil { - return nil, err - } else if !changed { // if nothing has changed then return an empty result and bail. - return results, nil - } - - pret, err := pre.transactions() - if err != nil { - return nil, err - } - - curt, err := cur.transactions() - if err != nil { - return nil, err - } - - if err := adt2.DiffAdtMap(pret, curt, &transactionDiffer{results, pre, cur}); err != nil { - return nil, err - } - return results, nil -} - -type transactionDiffer struct { - Results *PendingTransactionChanges - pre, after State -} - -func (t *transactionDiffer) AsKey(key string) (abi.Keyer, error) { - txID, err := abi.ParseIntKey(key) - if err != nil { - return nil, err - } - return abi.IntKey(txID), nil -} - -func (t *transactionDiffer) Add(key string, val *cbg.Deferred) error { - txID, err := abi.ParseIntKey(key) - if err != nil { - return err - } - tx, err := t.after.decodeTransaction(val) - if err != nil { - return err - } - t.Results.Added = append(t.Results.Added, TransactionChange{ - TxID: txID, - Tx: tx, - }) - return nil -} - -func (t *transactionDiffer) Modify(key string, from, to *cbg.Deferred) error { - txID, err := abi.ParseIntKey(key) - if err != nil { - return err - } - - txFrom, err := t.pre.decodeTransaction(from) - if err != nil { - return err - } - - txTo, err := t.after.decodeTransaction(to) - if err != nil { - return err - } - - if approvalsChanged(txFrom.Approved, txTo.Approved) { - t.Results.Modified = append(t.Results.Modified, TransactionModification{ - TxID: txID, - From: txFrom, - To: txTo, - }) - } - - return nil -} - -func approvalsChanged(from, to []address.Address) bool { - if len(from) != len(to) { - return true - } - for idx := range from { - if from[idx] != to[idx] { - return true - } - } - return false -} - -func (t *transactionDiffer) Remove(key string, val *cbg.Deferred) error { - txID, err := abi.ParseIntKey(key) - if err != nil { - return err - } - tx, err := t.pre.decodeTransaction(val) - if err != nil { - return err - } - t.Results.Removed = append(t.Results.Removed, TransactionChange{ - TxID: txID, - Tx: tx, - }) - return nil -} diff --git a/pkg/types/specactors/builtin/multisig/message.go.template b/pkg/types/specactors/builtin/multisig/message.go.template index 64f7a9ed9f..2aab87e4d1 100644 --- a/pkg/types/specactors/builtin/multisig/message.go.template +++ b/pkg/types/specactors/builtin/multisig/message.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + package multisig import ( @@ -10,9 +12,9 @@ import ( init{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/init" multisig{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/multisig" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - "github.com/filecoin-project/venus/pkg/types/internal" + types "github.com/filecoin-project/venus/pkg/types/internal" ) type message{{.v}} struct{ {{if (ge .v 2)}}message0{{else}}from address.Address{{end}} } @@ -21,7 +23,7 @@ func (m message{{.v}}) Create( signers []address.Address, threshold uint64, unlockStart, unlockDuration abi.ChainEpoch, initialAmount abi.TokenAmount, -) (*internal.Message, error) { +) (*types.Message, error) { lenAddrs := uint64(len(signers)) @@ -49,7 +51,7 @@ func (m message{{.v}}) Create( StartEpoch: unlockStart,{{end}} } - enc, actErr := specactors.SerializeParams(msigParams) + enc, actErr := actors.SerializeParams(msigParams) if actErr != nil { return nil, actErr } @@ -60,12 +62,12 @@ func (m message{{.v}}) Create( ConstructorParams: enc, } - enc, actErr = specactors.SerializeParams(execParams) + enc, actErr = actors.SerializeParams(execParams) if actErr != nil { return nil, actErr } - return &internal.Message{ + return &types.Message{ To: init_.Address, From: m.from, Method: builtin{{.v}}.MethodsInit.Exec, @@ -77,7 +79,7 @@ func (m message{{.v}}) Create( {{if (le .v 1)}} func (m message0) Propose(msig, to address.Address, amt abi.TokenAmount, - method abi.MethodNum, params []byte) (*internal.Message, error) { + method abi.MethodNum, params []byte) (*types.Message, error) { if msig == address.Undef { return nil, xerrors.Errorf("must provide a multisig address for proposal") @@ -95,7 +97,7 @@ func (m message0) Propose(msig, to address.Address, amt abi.TokenAmount, return nil, xerrors.Errorf("must provide source address") } - enc, actErr := specactors.SerializeParams(&multisig0.ProposeParams{ + enc, actErr := actors.SerializeParams(&multisig0.ProposeParams{ To: to, Value: amt, Method: method, @@ -105,7 +107,7 @@ func (m message0) Propose(msig, to address.Address, amt abi.TokenAmount, return nil, xerrors.Errorf("failed to serialize parameters: %w", actErr) } - return &internal.Message{ + return &types.Message{ To: msig, From: m.from, Value: abi.NewTokenAmount(0), @@ -114,31 +116,31 @@ func (m message0) Propose(msig, to address.Address, amt abi.TokenAmount, }, nil } -func (m message0) Approve(msig address.Address, txID uint64, hashData *ProposalHashData) (*internal.Message, error) { +func (m message0) Approve(msig address.Address, txID uint64, hashData *ProposalHashData) (*types.Message, error) { enc, err := txnParams(txID, hashData) if err != nil { return nil, err } - return &internal.Message{ + return &types.Message{ To: msig, From: m.from, - Value: internal.NewInt(0), + Value: types.NewInt(0), Method: builtin0.MethodsMultisig.Approve, Params: enc, }, nil } -func (m message0) Cancel(msig address.Address, txID uint64, hashData *ProposalHashData) (*internal.Message, error) { +func (m message0) Cancel(msig address.Address, txID uint64, hashData *ProposalHashData) (*types.Message, error) { enc, err := txnParams(txID, hashData) if err != nil { return nil, err } - return &internal.Message{ + return &types.Message{ To: msig, From: m.from, - Value: internal.NewInt(0), + Value: types.NewInt(0), Method: builtin0.MethodsMultisig.Cancel, Params: enc, }, nil diff --git a/pkg/types/specactors/builtin/multisig/message0.go b/pkg/types/specactors/builtin/multisig/message0.go index f71f5c35e5..cf032a58c6 100644 --- a/pkg/types/specactors/builtin/multisig/message0.go +++ b/pkg/types/specactors/builtin/multisig/message0.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + package multisig import ( @@ -10,9 +12,9 @@ import ( init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" multisig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" + types "github.com/filecoin-project/venus/pkg/types/internal" ) type message0 struct{ from address.Address } @@ -21,7 +23,7 @@ func (m message0) Create( signers []address.Address, threshold uint64, unlockStart, unlockDuration abi.ChainEpoch, initialAmount abi.TokenAmount, -) (*internal.Message, error) { +) (*types.Message, error) { lenAddrs := uint64(len(signers)) @@ -48,7 +50,7 @@ func (m message0) Create( UnlockDuration: unlockDuration, } - enc, actErr := specactors.SerializeParams(msigParams) + enc, actErr := actors.SerializeParams(msigParams) if actErr != nil { return nil, actErr } @@ -59,12 +61,12 @@ func (m message0) Create( ConstructorParams: enc, } - enc, actErr = specactors.SerializeParams(execParams) + enc, actErr = actors.SerializeParams(execParams) if actErr != nil { return nil, actErr } - return &internal.Message{ + return &types.Message{ To: init_.Address, From: m.from, Method: builtin0.MethodsInit.Exec, @@ -73,8 +75,10 @@ func (m message0) Create( }, nil } + + func (m message0) Propose(msig, to address.Address, amt abi.TokenAmount, - method abi.MethodNum, params []byte) (*internal.Message, error) { + method abi.MethodNum, params []byte) (*types.Message, error) { if msig == address.Undef { return nil, xerrors.Errorf("must provide a multisig address for proposal") @@ -92,7 +96,7 @@ func (m message0) Propose(msig, to address.Address, amt abi.TokenAmount, return nil, xerrors.Errorf("must provide source address") } - enc, actErr := specactors.SerializeParams(&multisig0.ProposeParams{ + enc, actErr := actors.SerializeParams(&multisig0.ProposeParams{ To: to, Value: amt, Method: method, @@ -102,7 +106,7 @@ func (m message0) Propose(msig, to address.Address, amt abi.TokenAmount, return nil, xerrors.Errorf("failed to serialize parameters: %w", actErr) } - return &internal.Message{ + return &types.Message{ To: msig, From: m.from, Value: abi.NewTokenAmount(0), @@ -111,32 +115,33 @@ func (m message0) Propose(msig, to address.Address, amt abi.TokenAmount, }, nil } -func (m message0) Approve(msig address.Address, txID uint64, hashData *ProposalHashData) (*internal.Message, error) { +func (m message0) Approve(msig address.Address, txID uint64, hashData *ProposalHashData) (*types.Message, error) { enc, err := txnParams(txID, hashData) if err != nil { return nil, err } - return &internal.Message{ + return &types.Message{ To: msig, From: m.from, - Value: internal.NewInt(0), + Value: types.NewInt(0), Method: builtin0.MethodsMultisig.Approve, Params: enc, }, nil } -func (m message0) Cancel(msig address.Address, txID uint64, hashData *ProposalHashData) (*internal.Message, error) { +func (m message0) Cancel(msig address.Address, txID uint64, hashData *ProposalHashData) (*types.Message, error) { enc, err := txnParams(txID, hashData) if err != nil { return nil, err } - return &internal.Message{ + return &types.Message{ To: msig, From: m.from, - Value: internal.NewInt(0), + Value: types.NewInt(0), Method: builtin0.MethodsMultisig.Cancel, Params: enc, }, nil } + diff --git a/pkg/types/specactors/builtin/multisig/message2.go b/pkg/types/specactors/builtin/multisig/message2.go index 585547dd88..3eb6f616ad 100644 --- a/pkg/types/specactors/builtin/multisig/message2.go +++ b/pkg/types/specactors/builtin/multisig/message2.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + package multisig import ( @@ -10,9 +12,9 @@ import ( init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" multisig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" + types "github.com/filecoin-project/venus/pkg/types/internal" ) type message2 struct{ message0 } @@ -21,7 +23,7 @@ func (m message2) Create( signers []address.Address, threshold uint64, unlockStart, unlockDuration abi.ChainEpoch, initialAmount abi.TokenAmount, -) (*internal.Message, error) { +) (*types.Message, error) { lenAddrs := uint64(len(signers)) @@ -45,7 +47,7 @@ func (m message2) Create( StartEpoch: unlockStart, } - enc, actErr := specactors.SerializeParams(msigParams) + enc, actErr := actors.SerializeParams(msigParams) if actErr != nil { return nil, actErr } @@ -56,12 +58,12 @@ func (m message2) Create( ConstructorParams: enc, } - enc, actErr = specactors.SerializeParams(execParams) + enc, actErr = actors.SerializeParams(execParams) if actErr != nil { return nil, actErr } - return &internal.Message{ + return &types.Message{ To: init_.Address, From: m.from, Method: builtin2.MethodsInit.Exec, @@ -69,3 +71,5 @@ func (m message2) Create( Value: initialAmount, }, nil } + + diff --git a/pkg/types/specactors/builtin/multisig/message3.go b/pkg/types/specactors/builtin/multisig/message3.go index 943c1c493e..8c18faf7bd 100644 --- a/pkg/types/specactors/builtin/multisig/message3.go +++ b/pkg/types/specactors/builtin/multisig/message3.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + package multisig import ( @@ -10,9 +12,9 @@ import ( init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" multisig3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/multisig" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" + types "github.com/filecoin-project/venus/pkg/types/internal" ) type message3 struct{ message0 } @@ -21,7 +23,7 @@ func (m message3) Create( signers []address.Address, threshold uint64, unlockStart, unlockDuration abi.ChainEpoch, initialAmount abi.TokenAmount, -) (*internal.Message, error) { +) (*types.Message, error) { lenAddrs := uint64(len(signers)) @@ -45,7 +47,7 @@ func (m message3) Create( StartEpoch: unlockStart, } - enc, actErr := specactors.SerializeParams(msigParams) + enc, actErr := actors.SerializeParams(msigParams) if actErr != nil { return nil, actErr } @@ -56,12 +58,12 @@ func (m message3) Create( ConstructorParams: enc, } - enc, actErr = specactors.SerializeParams(execParams) + enc, actErr = actors.SerializeParams(execParams) if actErr != nil { return nil, actErr } - return &internal.Message{ + return &types.Message{ To: init_.Address, From: m.from, Method: builtin3.MethodsInit.Exec, @@ -69,3 +71,5 @@ func (m message3) Create( Value: initialAmount, }, nil } + + diff --git a/pkg/types/specactors/builtin/multisig/message4.go b/pkg/types/specactors/builtin/multisig/message4.go index d1b7432e61..d1f69214b1 100644 --- a/pkg/types/specactors/builtin/multisig/message4.go +++ b/pkg/types/specactors/builtin/multisig/message4.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + package multisig import ( @@ -10,9 +12,9 @@ import ( init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" multisig4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" + types "github.com/filecoin-project/venus/pkg/types/internal" ) type message4 struct{ message0 } @@ -21,7 +23,7 @@ func (m message4) Create( signers []address.Address, threshold uint64, unlockStart, unlockDuration abi.ChainEpoch, initialAmount abi.TokenAmount, -) (*internal.Message, error) { +) (*types.Message, error) { lenAddrs := uint64(len(signers)) @@ -45,7 +47,7 @@ func (m message4) Create( StartEpoch: unlockStart, } - enc, actErr := specactors.SerializeParams(msigParams) + enc, actErr := actors.SerializeParams(msigParams) if actErr != nil { return nil, actErr } @@ -56,12 +58,12 @@ func (m message4) Create( ConstructorParams: enc, } - enc, actErr = specactors.SerializeParams(execParams) + enc, actErr = actors.SerializeParams(execParams) if actErr != nil { return nil, actErr } - return &internal.Message{ + return &types.Message{ To: init_.Address, From: m.from, Method: builtin4.MethodsInit.Exec, @@ -69,3 +71,5 @@ func (m message4) Create( Value: initialAmount, }, nil } + + diff --git a/pkg/types/specactors/builtin/multisig/message5.go b/pkg/types/specactors/builtin/multisig/message5.go index dcc5ecf90a..a83021a2ec 100644 --- a/pkg/types/specactors/builtin/multisig/message5.go +++ b/pkg/types/specactors/builtin/multisig/message5.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + package multisig import ( @@ -10,9 +12,9 @@ import ( init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" multisig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" + types "github.com/filecoin-project/venus/pkg/types/internal" ) type message5 struct{ message0 } @@ -21,7 +23,7 @@ func (m message5) Create( signers []address.Address, threshold uint64, unlockStart, unlockDuration abi.ChainEpoch, initialAmount abi.TokenAmount, -) (*internal.Message, error) { +) (*types.Message, error) { lenAddrs := uint64(len(signers)) @@ -45,7 +47,7 @@ func (m message5) Create( StartEpoch: unlockStart, } - enc, actErr := specactors.SerializeParams(msigParams) + enc, actErr := actors.SerializeParams(msigParams) if actErr != nil { return nil, actErr } @@ -56,12 +58,12 @@ func (m message5) Create( ConstructorParams: enc, } - enc, actErr = specactors.SerializeParams(execParams) + enc, actErr = actors.SerializeParams(execParams) if actErr != nil { return nil, actErr } - return &internal.Message{ + return &types.Message{ To: init_.Address, From: m.from, Method: builtin5.MethodsInit.Exec, @@ -69,3 +71,5 @@ func (m message5) Create( Value: initialAmount, }, nil } + + diff --git a/pkg/types/specactors/builtin/multisig/message6.go b/pkg/types/specactors/builtin/multisig/message6.go index 43f7fd1e1d..79d0afc500 100644 --- a/pkg/types/specactors/builtin/multisig/message6.go +++ b/pkg/types/specactors/builtin/multisig/message6.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + package multisig import ( @@ -10,9 +12,9 @@ import ( init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" multisig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" + types "github.com/filecoin-project/venus/pkg/types/internal" ) type message6 struct{ message0 } @@ -21,7 +23,7 @@ func (m message6) Create( signers []address.Address, threshold uint64, unlockStart, unlockDuration abi.ChainEpoch, initialAmount abi.TokenAmount, -) (*internal.Message, error) { +) (*types.Message, error) { lenAddrs := uint64(len(signers)) @@ -45,7 +47,7 @@ func (m message6) Create( StartEpoch: unlockStart, } - enc, actErr := specactors.SerializeParams(msigParams) + enc, actErr := actors.SerializeParams(msigParams) if actErr != nil { return nil, actErr } @@ -56,12 +58,12 @@ func (m message6) Create( ConstructorParams: enc, } - enc, actErr = specactors.SerializeParams(execParams) + enc, actErr = actors.SerializeParams(execParams) if actErr != nil { return nil, actErr } - return &internal.Message{ + return &types.Message{ To: init_.Address, From: m.from, Method: builtin6.MethodsInit.Exec, @@ -69,3 +71,5 @@ func (m message6) Create( Value: initialAmount, }, nil } + + diff --git a/pkg/types/specactors/builtin/multisig/message7.go b/pkg/types/specactors/builtin/multisig/message7.go new file mode 100644 index 0000000000..409754d1d8 --- /dev/null +++ b/pkg/types/specactors/builtin/multisig/message7.go @@ -0,0 +1,75 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + +package multisig + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" + multisig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" + + actors "github.com/filecoin-project/venus/pkg/types/specactors" + init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" + types "github.com/filecoin-project/venus/pkg/types/internal" +) + +type message7 struct{ message0 } + +func (m message7) Create( + signers []address.Address, threshold uint64, + unlockStart, unlockDuration abi.ChainEpoch, + initialAmount abi.TokenAmount, +) (*types.Message, error) { + + lenAddrs := uint64(len(signers)) + + if lenAddrs < threshold { + return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") + } + + if threshold == 0 { + threshold = lenAddrs + } + + if m.from == address.Undef { + return nil, xerrors.Errorf("must provide source address") + } + + // Set up constructor parameters for multisig + msigParams := &multisig7.ConstructorParams{ + Signers: signers, + NumApprovalsThreshold: threshold, + UnlockDuration: unlockDuration, + StartEpoch: unlockStart, + } + + enc, actErr := actors.SerializeParams(msigParams) + if actErr != nil { + return nil, actErr + } + + // new actors are created by invoking 'exec' on the init actor with the constructor params + execParams := &init7.ExecParams{ + CodeCID: builtin7.MultisigActorCodeID, + ConstructorParams: enc, + } + + enc, actErr = actors.SerializeParams(execParams) + if actErr != nil { + return nil, actErr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Method: builtin7.MethodsInit.Exec, + Params: enc, + Value: initialAmount, + }, nil +} + + diff --git a/pkg/types/specactors/builtin/multisig/multisig.go b/pkg/types/specactors/builtin/multisig/multisig.go index db097d82e9..5c3740482f 100644 --- a/pkg/types/specactors/builtin/multisig/multisig.go +++ b/pkg/types/specactors/builtin/multisig/multisig.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/multisig/actor.go.template + package multisig import ( @@ -13,7 +15,7 @@ import ( "github.com/ipfs/go-cid" msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" - msig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" + msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -27,10 +29,13 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + types "github.com/filecoin-project/venus/pkg/types/internal" ) func init() { @@ -58,9 +63,13 @@ func init() { builtin.RegisterActorState(builtin6.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { case builtin0.MultisigActorCodeID: @@ -81,56 +90,65 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { case builtin6.MultisigActorCodeID: return load6(store, act.Head) + case builtin7.MultisigActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { +func MakeState(store adt.Store, av actors.Version, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { switch av { - case specactors.Version0: + case actors.Version0: return make0(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - case specactors.Version2: + case actors.Version2: return make2(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - case specactors.Version3: + case actors.Version3: return make3(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - case specactors.Version4: + case actors.Version4: return make4(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - case specactors.Version5: + case actors.Version5: return make5(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - case specactors.Version6: + case actors.Version6: return make6(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - } + case actors.Version7: + return make7(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + +} return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { - case specactors.Version0: + case actors.Version0: return builtin0.MultisigActorCodeID, nil - case specactors.Version2: + case actors.Version2: return builtin2.MultisigActorCodeID, nil - case specactors.Version3: + case actors.Version3: return builtin3.MultisigActorCodeID, nil - case specactors.Version4: + case actors.Version4: return builtin4.MultisigActorCodeID, nil - case specactors.Version5: + case actors.Version5: return builtin5.MultisigActorCodeID, nil - case specactors.Version6: + case actors.Version6: return builtin6.MultisigActorCodeID, nil + case actors.Version7: + return builtin7.MultisigActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -156,28 +174,31 @@ type State interface { type Transaction = msig0.Transaction -var Methods = builtin6.MethodsMultisig +var Methods = builtin7.MethodsMultisig -func Message(version specactors.Version, from address.Address) MessageBuilder { +func Message(version actors.Version, from address.Address) MessageBuilder { switch version { - case specactors.Version0: + case actors.Version0: return message0{from} - case specactors.Version2: + case actors.Version2: return message2{message0{from}} - case specactors.Version3: + case actors.Version3: return message3{message0{from}} - case specactors.Version4: + case actors.Version4: return message4{message0{from}} - case specactors.Version5: + case actors.Version5: return message5{message0{from}} - case specactors.Version6: + case actors.Version6: return message6{message0{from}} + + case actors.Version7: + return message7{message0{from}} default: panic(fmt.Sprintf("unsupported actors version: %d", version)) } @@ -187,27 +208,27 @@ type MessageBuilder interface { // Create a new multisig with the specified parameters. Create(signers []address.Address, threshold uint64, vestingStart, vestingDuration abi.ChainEpoch, - initialAmount abi.TokenAmount) (*internal.Message, error) + initialAmount abi.TokenAmount) (*types.Message, error) // Propose a transaction to the given multisig. Propose(msig, target address.Address, amt abi.TokenAmount, - method abi.MethodNum, params []byte) (*internal.Message, error) + method abi.MethodNum, params []byte) (*types.Message, error) // Approve a multisig transaction. The "hash" is optional. - Approve(msig address.Address, txID uint64, hash *ProposalHashData) (*internal.Message, error) + Approve(msig address.Address, txID uint64, hash *ProposalHashData) (*types.Message, error) // Cancel a multisig transaction. The "hash" is optional. - Cancel(msig address.Address, txID uint64, hash *ProposalHashData) (*internal.Message, error) + Cancel(msig address.Address, txID uint64, hash *ProposalHashData) (*types.Message, error) } // this type is the same between v0 and v2 -type ProposalHashData = msig6.ProposalHashData -type ProposeReturn = msig6.ProposeReturn -type ProposeParams = msig6.ProposeParams -type ApproveReturn = msig6.ApproveReturn +type ProposalHashData = msig7.ProposalHashData +type ProposeReturn = msig7.ProposeReturn +type ProposeParams = msig7.ProposeParams +type ApproveReturn = msig7.ApproveReturn func txnParams(id uint64, data *ProposalHashData) ([]byte, error) { - params := msig6.TxnIDParams{ID: msig6.TxnID(id)} + params := msig7.TxnIDParams{ID: msig7.TxnID(id)} if data != nil { if data.Requester.Protocol() != address.ID { return nil, xerrors.Errorf("proposer address must be an ID address, was %s", data.Requester) @@ -226,5 +247,5 @@ func txnParams(id uint64, data *ProposalHashData) ([]byte, error) { params.ProposalHash = hash[:] } - return specactors.SerializeParams(¶ms) + return actors.SerializeParams(¶ms) } diff --git a/pkg/types/specactors/builtin/multisig/state.go.template b/pkg/types/specactors/builtin/multisig/state.go.template index 909756537e..b3d6122fc3 100644 --- a/pkg/types/specactors/builtin/multisig/state.go.template +++ b/pkg/types/specactors/builtin/multisig/state.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + package multisig import ( diff --git a/pkg/types/specactors/builtin/multisig/v0.go b/pkg/types/specactors/builtin/multisig/v0.go index d67479646a..4fce5992e8 100644 --- a/pkg/types/specactors/builtin/multisig/v0.go +++ b/pkg/types/specactors/builtin/multisig/v0.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + package multisig import ( @@ -14,6 +16,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" + msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" ) @@ -36,14 +39,14 @@ func make0(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance + + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - + out.State.PendingTxns = em + return &out, nil } diff --git a/pkg/types/specactors/builtin/multisig/v2.go b/pkg/types/specactors/builtin/multisig/v2.go index 6eef5c88fa..f091bf872f 100644 --- a/pkg/types/specactors/builtin/multisig/v2.go +++ b/pkg/types/specactors/builtin/multisig/v2.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + package multisig import ( @@ -14,6 +16,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" + msig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" ) @@ -36,14 +39,14 @@ func make2(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance + + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - + out.State.PendingTxns = em + return &out, nil } diff --git a/pkg/types/specactors/builtin/multisig/v3.go b/pkg/types/specactors/builtin/multisig/v3.go index 9a1ef13acf..60d95149fd 100644 --- a/pkg/types/specactors/builtin/multisig/v3.go +++ b/pkg/types/specactors/builtin/multisig/v3.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + package multisig import ( @@ -14,6 +16,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" msig3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/multisig" @@ -38,14 +41,14 @@ func make3(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance + + em, err := adt3.StoreEmptyMap(store, builtin3.DefaultHamtBitwidth) + if err != nil { + return nil, err + } - em, err := adt3.StoreEmptyMap(store, builtin3.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - + out.State.PendingTxns = em + return &out, nil } diff --git a/pkg/types/specactors/builtin/multisig/v4.go b/pkg/types/specactors/builtin/multisig/v4.go index d6d8871770..31840e1a01 100644 --- a/pkg/types/specactors/builtin/multisig/v4.go +++ b/pkg/types/specactors/builtin/multisig/v4.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + package multisig import ( @@ -14,6 +16,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" msig4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig" @@ -38,14 +41,14 @@ func make4(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance + + em, err := adt4.StoreEmptyMap(store, builtin4.DefaultHamtBitwidth) + if err != nil { + return nil, err + } - em, err := adt4.StoreEmptyMap(store, builtin4.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - + out.State.PendingTxns = em + return &out, nil } diff --git a/pkg/types/specactors/builtin/multisig/v5.go b/pkg/types/specactors/builtin/multisig/v5.go index 2f5bad7c32..6d461c3949 100644 --- a/pkg/types/specactors/builtin/multisig/v5.go +++ b/pkg/types/specactors/builtin/multisig/v5.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + package multisig import ( @@ -14,6 +16,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" msig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig" @@ -38,14 +41,14 @@ func make5(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance + + em, err := adt5.StoreEmptyMap(store, builtin5.DefaultHamtBitwidth) + if err != nil { + return nil, err + } - em, err := adt5.StoreEmptyMap(store, builtin5.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - + out.State.PendingTxns = em + return &out, nil } diff --git a/pkg/types/specactors/builtin/multisig/v6.go b/pkg/types/specactors/builtin/multisig/v6.go index 8ba7ccad43..3df27e97d3 100644 --- a/pkg/types/specactors/builtin/multisig/v6.go +++ b/pkg/types/specactors/builtin/multisig/v6.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + package multisig import ( @@ -14,6 +16,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" msig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" @@ -38,14 +41,14 @@ func make6(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance + + em, err := adt6.StoreEmptyMap(store, builtin6.DefaultHamtBitwidth) + if err != nil { + return nil, err + } - em, err := adt6.StoreEmptyMap(store, builtin6.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - + out.State.PendingTxns = em + return &out, nil } diff --git a/pkg/types/specactors/builtin/multisig/v7.go b/pkg/types/specactors/builtin/multisig/v7.go new file mode 100644 index 0000000000..c5dd025fba --- /dev/null +++ b/pkg/types/specactors/builtin/multisig/v7.go @@ -0,0 +1,122 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + +package multisig + +import ( + "bytes" + "encoding/binary" + + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/venus/pkg/types/specactors/adt" + + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { + out := state7{store: store} + out.State = msig7.State{} + out.State.Signers = signers + out.State.NumApprovalsThreshold = threshold + out.State.StartEpoch = startEpoch + out.State.UnlockDuration = unlockDuration + out.State.InitialBalance = initialBalance + + em, err := adt7.StoreEmptyMap(store, builtin7.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + + return &out, nil +} + +type state7 struct { + msig7.State + store adt.Store +} + +func (s *state7) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil +} + +func (s *state7) StartEpoch() (abi.ChainEpoch, error) { + return s.State.StartEpoch, nil +} + +func (s *state7) UnlockDuration() (abi.ChainEpoch, error) { + return s.State.UnlockDuration, nil +} + +func (s *state7) InitialBalance() (abi.TokenAmount, error) { + return s.State.InitialBalance, nil +} + +func (s *state7) Threshold() (uint64, error) { + return s.State.NumApprovalsThreshold, nil +} + +func (s *state7) Signers() ([]address.Address, error) { + return s.State.Signers, nil +} + +func (s *state7) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { + arr, err := adt7.AsMap(s.store, s.State.PendingTxns, builtin7.DefaultHamtBitwidth) + if err != nil { + return err + } + var out msig7.Transaction + return arr.ForEach(&out, func(key string) error { + txid, n := binary.Varint([]byte(key)) + if n <= 0 { + return xerrors.Errorf("invalid pending transaction key: %v", key) + } + return cb(txid, (Transaction)(out)) //nolint:unconvert + }) +} + +func (s *state7) PendingTxnChanged(other State) (bool, error) { + other7, ok := other.(*state7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.PendingTxns.Equals(other7.PendingTxns), nil +} + +func (s *state7) transactions() (adt.Map, error) { + return adt7.AsMap(s.store, s.PendingTxns, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) decodeTransaction(val *cbg.Deferred) (Transaction, error) { + var tx msig7.Transaction + if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Transaction{}, err + } + return tx, nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/pkg/types/specactors/builtin/paych/actor.go.template b/pkg/types/specactors/builtin/paych/actor.go.template index 27ce59ab63..0c84ec4c59 100644 --- a/pkg/types/specactors/builtin/paych/actor.go.template +++ b/pkg/types/specactors/builtin/paych/actor.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/paych/actor.go.template + package paych import ( @@ -18,10 +20,10 @@ import ( builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" {{end}} - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/internal" + types "github.com/filecoin-project/venus/pkg/types/internal" ) func init() { @@ -32,7 +34,7 @@ func init() { {{end}}} // Load returns an abstract copy of payment channel state, irregardless of actor version -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { {{range .versions}} case builtin{{.}}.PaymentChannelActorCodeID: @@ -42,20 +44,20 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version) (State, error) { +func MakeState(store adt.Store, av actors.Version) (State, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return make{{.}}(store) {{end}} } return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return builtin{{.}}.PaymentChannelActorCodeID, nil {{end}} } @@ -113,10 +115,10 @@ func DecodeSignedVoucher(s string) (*SignedVoucher, error) { var Methods = builtin{{.latestVersion}}.MethodsPaych -func Message(version specactors.Version, from address.Address) MessageBuilder { +func Message(version actors.Version, from address.Address) MessageBuilder { switch version { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return message{{.}}{from} {{end}} default: @@ -125,8 +127,8 @@ func Message(version specactors.Version, from address.Address) MessageBuilder { } type MessageBuilder interface { - Create(to address.Address, initialAmount abi.TokenAmount) (*internal.Message, error) - Update(paych address.Address, voucher *SignedVoucher, secret []byte) (*internal.Message, error) - Settle(paych address.Address) (*internal.Message, error) - Collect(paych address.Address) (*internal.Message, error) + Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) + Update(paych address.Address, voucher *SignedVoucher, secret []byte) (*types.Message, error) + Settle(paych address.Address) (*types.Message, error) + Collect(paych address.Address) (*types.Message, error) } diff --git a/pkg/types/specactors/builtin/paych/message.go.template b/pkg/types/specactors/builtin/paych/message.go.template index c17353c857..23091d71fc 100644 --- a/pkg/types/specactors/builtin/paych/message.go.template +++ b/pkg/types/specactors/builtin/paych/message.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + package paych import ( @@ -8,19 +10,19 @@ import ( init{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/init" paych{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/paych" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - "github.com/filecoin-project/venus/pkg/types/internal" + types "github.com/filecoin-project/venus/pkg/types/internal" ) type message{{.v}} struct{ from address.Address } -func (m message{{.v}}) Create(to address.Address, initialAmount abi.TokenAmount) (*internal.Message, error) { - params, aerr := specactors.SerializeParams(&paych{{.v}}.ConstructorParams{From: m.from, To: to}) +func (m message{{.v}}) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych{{.v}}.ConstructorParams{From: m.from, To: to}) if aerr != nil { return nil, aerr } - enc, aerr := specactors.SerializeParams(&init{{.v}}.ExecParams{ + enc, aerr := actors.SerializeParams(&init{{.v}}.ExecParams{ CodeCID: builtin{{.v}}.PaymentChannelActorCodeID, ConstructorParams: params, }) @@ -28,7 +30,7 @@ func (m message{{.v}}) Create(to address.Address, initialAmount abi.TokenAmount) return nil, aerr } - return &internal.Message{ + return &types.Message{ To: init_.Address, From: m.from, Value: initialAmount, @@ -37,8 +39,8 @@ func (m message{{.v}}) Create(to address.Address, initialAmount abi.TokenAmount) }, nil } -func (m message{{.v}}) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*internal.Message, error) { - params, aerr := specactors.SerializeParams(&paych{{.v}}.UpdateChannelStateParams{ +func (m message{{.v}}) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych{{.v}}.UpdateChannelStateParams{ Sv: *sv, Secret: secret, }) @@ -46,7 +48,7 @@ func (m message{{.v}}) Update(paych address.Address, sv *SignedVoucher, secret [ return nil, aerr } - return &internal.Message{ + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), @@ -55,8 +57,8 @@ func (m message{{.v}}) Update(paych address.Address, sv *SignedVoucher, secret [ }, nil } -func (m message{{.v}}) Settle(paych address.Address) (*internal.Message, error) { - return &internal.Message{ +func (m message{{.v}}) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), @@ -64,8 +66,8 @@ func (m message{{.v}}) Settle(paych address.Address) (*internal.Message, error) }, nil } -func (m message{{.v}}) Collect(paych address.Address) (*internal.Message, error) { - return &internal.Message{ +func (m message{{.v}}) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), diff --git a/pkg/types/specactors/builtin/paych/message0.go b/pkg/types/specactors/builtin/paych/message0.go index 9598041ef8..2979d6870f 100644 --- a/pkg/types/specactors/builtin/paych/message0.go +++ b/pkg/types/specactors/builtin/paych/message0.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + package paych import ( @@ -8,19 +10,19 @@ import ( init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" + types "github.com/filecoin-project/venus/pkg/types/internal" ) type message0 struct{ from address.Address } -func (m message0) Create(to address.Address, initialAmount abi.TokenAmount) (*internal.Message, error) { - params, aerr := specactors.SerializeParams(&paych0.ConstructorParams{From: m.from, To: to}) +func (m message0) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych0.ConstructorParams{From: m.from, To: to}) if aerr != nil { return nil, aerr } - enc, aerr := specactors.SerializeParams(&init0.ExecParams{ + enc, aerr := actors.SerializeParams(&init0.ExecParams{ CodeCID: builtin0.PaymentChannelActorCodeID, ConstructorParams: params, }) @@ -28,7 +30,7 @@ func (m message0) Create(to address.Address, initialAmount abi.TokenAmount) (*in return nil, aerr } - return &internal.Message{ + return &types.Message{ To: init_.Address, From: m.from, Value: initialAmount, @@ -37,8 +39,8 @@ func (m message0) Create(to address.Address, initialAmount abi.TokenAmount) (*in }, nil } -func (m message0) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*internal.Message, error) { - params, aerr := specactors.SerializeParams(&paych0.UpdateChannelStateParams{ +func (m message0) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych0.UpdateChannelStateParams{ Sv: *sv, Secret: secret, }) @@ -46,7 +48,7 @@ func (m message0) Update(paych address.Address, sv *SignedVoucher, secret []byte return nil, aerr } - return &internal.Message{ + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), @@ -55,8 +57,8 @@ func (m message0) Update(paych address.Address, sv *SignedVoucher, secret []byte }, nil } -func (m message0) Settle(paych address.Address) (*internal.Message, error) { - return &internal.Message{ +func (m message0) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), @@ -64,8 +66,8 @@ func (m message0) Settle(paych address.Address) (*internal.Message, error) { }, nil } -func (m message0) Collect(paych address.Address) (*internal.Message, error) { - return &internal.Message{ +func (m message0) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), diff --git a/pkg/types/specactors/builtin/paych/message2.go b/pkg/types/specactors/builtin/paych/message2.go index 3bccf6a4b5..bbedf81c81 100644 --- a/pkg/types/specactors/builtin/paych/message2.go +++ b/pkg/types/specactors/builtin/paych/message2.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + package paych import ( @@ -8,19 +10,19 @@ import ( init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" paych2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/paych" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" + types "github.com/filecoin-project/venus/pkg/types/internal" ) type message2 struct{ from address.Address } -func (m message2) Create(to address.Address, initialAmount abi.TokenAmount) (*internal.Message, error) { - params, aerr := specactors.SerializeParams(&paych2.ConstructorParams{From: m.from, To: to}) +func (m message2) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych2.ConstructorParams{From: m.from, To: to}) if aerr != nil { return nil, aerr } - enc, aerr := specactors.SerializeParams(&init2.ExecParams{ + enc, aerr := actors.SerializeParams(&init2.ExecParams{ CodeCID: builtin2.PaymentChannelActorCodeID, ConstructorParams: params, }) @@ -28,7 +30,7 @@ func (m message2) Create(to address.Address, initialAmount abi.TokenAmount) (*in return nil, aerr } - return &internal.Message{ + return &types.Message{ To: init_.Address, From: m.from, Value: initialAmount, @@ -37,8 +39,8 @@ func (m message2) Create(to address.Address, initialAmount abi.TokenAmount) (*in }, nil } -func (m message2) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*internal.Message, error) { - params, aerr := specactors.SerializeParams(&paych2.UpdateChannelStateParams{ +func (m message2) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych2.UpdateChannelStateParams{ Sv: *sv, Secret: secret, }) @@ -46,7 +48,7 @@ func (m message2) Update(paych address.Address, sv *SignedVoucher, secret []byte return nil, aerr } - return &internal.Message{ + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), @@ -55,8 +57,8 @@ func (m message2) Update(paych address.Address, sv *SignedVoucher, secret []byte }, nil } -func (m message2) Settle(paych address.Address) (*internal.Message, error) { - return &internal.Message{ +func (m message2) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), @@ -64,8 +66,8 @@ func (m message2) Settle(paych address.Address) (*internal.Message, error) { }, nil } -func (m message2) Collect(paych address.Address) (*internal.Message, error) { - return &internal.Message{ +func (m message2) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), diff --git a/pkg/types/specactors/builtin/paych/message3.go b/pkg/types/specactors/builtin/paych/message3.go index 9481b25d02..5179766423 100644 --- a/pkg/types/specactors/builtin/paych/message3.go +++ b/pkg/types/specactors/builtin/paych/message3.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + package paych import ( @@ -8,19 +10,19 @@ import ( init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" paych3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/paych" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" + types "github.com/filecoin-project/venus/pkg/types/internal" ) type message3 struct{ from address.Address } -func (m message3) Create(to address.Address, initialAmount abi.TokenAmount) (*internal.Message, error) { - params, aerr := specactors.SerializeParams(&paych3.ConstructorParams{From: m.from, To: to}) +func (m message3) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych3.ConstructorParams{From: m.from, To: to}) if aerr != nil { return nil, aerr } - enc, aerr := specactors.SerializeParams(&init3.ExecParams{ + enc, aerr := actors.SerializeParams(&init3.ExecParams{ CodeCID: builtin3.PaymentChannelActorCodeID, ConstructorParams: params, }) @@ -28,7 +30,7 @@ func (m message3) Create(to address.Address, initialAmount abi.TokenAmount) (*in return nil, aerr } - return &internal.Message{ + return &types.Message{ To: init_.Address, From: m.from, Value: initialAmount, @@ -37,8 +39,8 @@ func (m message3) Create(to address.Address, initialAmount abi.TokenAmount) (*in }, nil } -func (m message3) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*internal.Message, error) { - params, aerr := specactors.SerializeParams(&paych3.UpdateChannelStateParams{ +func (m message3) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych3.UpdateChannelStateParams{ Sv: *sv, Secret: secret, }) @@ -46,7 +48,7 @@ func (m message3) Update(paych address.Address, sv *SignedVoucher, secret []byte return nil, aerr } - return &internal.Message{ + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), @@ -55,8 +57,8 @@ func (m message3) Update(paych address.Address, sv *SignedVoucher, secret []byte }, nil } -func (m message3) Settle(paych address.Address) (*internal.Message, error) { - return &internal.Message{ +func (m message3) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), @@ -64,8 +66,8 @@ func (m message3) Settle(paych address.Address) (*internal.Message, error) { }, nil } -func (m message3) Collect(paych address.Address) (*internal.Message, error) { - return &internal.Message{ +func (m message3) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), diff --git a/pkg/types/specactors/builtin/paych/message4.go b/pkg/types/specactors/builtin/paych/message4.go index 82494be189..d6478fecb9 100644 --- a/pkg/types/specactors/builtin/paych/message4.go +++ b/pkg/types/specactors/builtin/paych/message4.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + package paych import ( @@ -8,19 +10,19 @@ import ( init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" paych4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/paych" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" + types "github.com/filecoin-project/venus/pkg/types/internal" ) type message4 struct{ from address.Address } -func (m message4) Create(to address.Address, initialAmount abi.TokenAmount) (*internal.Message, error) { - params, aerr := specactors.SerializeParams(&paych4.ConstructorParams{From: m.from, To: to}) +func (m message4) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych4.ConstructorParams{From: m.from, To: to}) if aerr != nil { return nil, aerr } - enc, aerr := specactors.SerializeParams(&init4.ExecParams{ + enc, aerr := actors.SerializeParams(&init4.ExecParams{ CodeCID: builtin4.PaymentChannelActorCodeID, ConstructorParams: params, }) @@ -28,7 +30,7 @@ func (m message4) Create(to address.Address, initialAmount abi.TokenAmount) (*in return nil, aerr } - return &internal.Message{ + return &types.Message{ To: init_.Address, From: m.from, Value: initialAmount, @@ -37,8 +39,8 @@ func (m message4) Create(to address.Address, initialAmount abi.TokenAmount) (*in }, nil } -func (m message4) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*internal.Message, error) { - params, aerr := specactors.SerializeParams(&paych4.UpdateChannelStateParams{ +func (m message4) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych4.UpdateChannelStateParams{ Sv: *sv, Secret: secret, }) @@ -46,7 +48,7 @@ func (m message4) Update(paych address.Address, sv *SignedVoucher, secret []byte return nil, aerr } - return &internal.Message{ + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), @@ -55,8 +57,8 @@ func (m message4) Update(paych address.Address, sv *SignedVoucher, secret []byte }, nil } -func (m message4) Settle(paych address.Address) (*internal.Message, error) { - return &internal.Message{ +func (m message4) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), @@ -64,8 +66,8 @@ func (m message4) Settle(paych address.Address) (*internal.Message, error) { }, nil } -func (m message4) Collect(paych address.Address) (*internal.Message, error) { - return &internal.Message{ +func (m message4) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), diff --git a/pkg/types/specactors/builtin/paych/message5.go b/pkg/types/specactors/builtin/paych/message5.go index 4afcfe0ca2..c7364383e7 100644 --- a/pkg/types/specactors/builtin/paych/message5.go +++ b/pkg/types/specactors/builtin/paych/message5.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + package paych import ( @@ -8,19 +10,19 @@ import ( init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" paych5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/paych" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" + types "github.com/filecoin-project/venus/pkg/types/internal" ) type message5 struct{ from address.Address } -func (m message5) Create(to address.Address, initialAmount abi.TokenAmount) (*internal.Message, error) { - params, aerr := specactors.SerializeParams(&paych5.ConstructorParams{From: m.from, To: to}) +func (m message5) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych5.ConstructorParams{From: m.from, To: to}) if aerr != nil { return nil, aerr } - enc, aerr := specactors.SerializeParams(&init5.ExecParams{ + enc, aerr := actors.SerializeParams(&init5.ExecParams{ CodeCID: builtin5.PaymentChannelActorCodeID, ConstructorParams: params, }) @@ -28,7 +30,7 @@ func (m message5) Create(to address.Address, initialAmount abi.TokenAmount) (*in return nil, aerr } - return &internal.Message{ + return &types.Message{ To: init_.Address, From: m.from, Value: initialAmount, @@ -37,8 +39,8 @@ func (m message5) Create(to address.Address, initialAmount abi.TokenAmount) (*in }, nil } -func (m message5) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*internal.Message, error) { - params, aerr := specactors.SerializeParams(&paych5.UpdateChannelStateParams{ +func (m message5) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych5.UpdateChannelStateParams{ Sv: *sv, Secret: secret, }) @@ -46,7 +48,7 @@ func (m message5) Update(paych address.Address, sv *SignedVoucher, secret []byte return nil, aerr } - return &internal.Message{ + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), @@ -55,8 +57,8 @@ func (m message5) Update(paych address.Address, sv *SignedVoucher, secret []byte }, nil } -func (m message5) Settle(paych address.Address) (*internal.Message, error) { - return &internal.Message{ +func (m message5) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), @@ -64,8 +66,8 @@ func (m message5) Settle(paych address.Address) (*internal.Message, error) { }, nil } -func (m message5) Collect(paych address.Address) (*internal.Message, error) { - return &internal.Message{ +func (m message5) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), diff --git a/pkg/types/specactors/builtin/paych/message6.go b/pkg/types/specactors/builtin/paych/message6.go index b3420b9451..f561103ec2 100644 --- a/pkg/types/specactors/builtin/paych/message6.go +++ b/pkg/types/specactors/builtin/paych/message6.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + package paych import ( @@ -8,19 +10,19 @@ import ( init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" + types "github.com/filecoin-project/venus/pkg/types/internal" ) type message6 struct{ from address.Address } -func (m message6) Create(to address.Address, initialAmount abi.TokenAmount) (*internal.Message, error) { - params, aerr := specactors.SerializeParams(&paych6.ConstructorParams{From: m.from, To: to}) +func (m message6) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych6.ConstructorParams{From: m.from, To: to}) if aerr != nil { return nil, aerr } - enc, aerr := specactors.SerializeParams(&init6.ExecParams{ + enc, aerr := actors.SerializeParams(&init6.ExecParams{ CodeCID: builtin6.PaymentChannelActorCodeID, ConstructorParams: params, }) @@ -28,7 +30,7 @@ func (m message6) Create(to address.Address, initialAmount abi.TokenAmount) (*in return nil, aerr } - return &internal.Message{ + return &types.Message{ To: init_.Address, From: m.from, Value: initialAmount, @@ -37,8 +39,8 @@ func (m message6) Create(to address.Address, initialAmount abi.TokenAmount) (*in }, nil } -func (m message6) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*internal.Message, error) { - params, aerr := specactors.SerializeParams(&paych6.UpdateChannelStateParams{ +func (m message6) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych6.UpdateChannelStateParams{ Sv: *sv, Secret: secret, }) @@ -46,7 +48,7 @@ func (m message6) Update(paych address.Address, sv *SignedVoucher, secret []byte return nil, aerr } - return &internal.Message{ + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), @@ -55,8 +57,8 @@ func (m message6) Update(paych address.Address, sv *SignedVoucher, secret []byte }, nil } -func (m message6) Settle(paych address.Address) (*internal.Message, error) { - return &internal.Message{ +func (m message6) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), @@ -64,8 +66,8 @@ func (m message6) Settle(paych address.Address) (*internal.Message, error) { }, nil } -func (m message6) Collect(paych address.Address) (*internal.Message, error) { - return &internal.Message{ +func (m message6) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ To: paych, From: m.from, Value: abi.NewTokenAmount(0), diff --git a/pkg/types/specactors/builtin/paych/message7.go b/pkg/types/specactors/builtin/paych/message7.go new file mode 100644 index 0000000000..59ae295c77 --- /dev/null +++ b/pkg/types/specactors/builtin/paych/message7.go @@ -0,0 +1,76 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + +package paych + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" + paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" + + actors "github.com/filecoin-project/venus/pkg/types/specactors" + init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" + types "github.com/filecoin-project/venus/pkg/types/internal" +) + +type message7 struct{ from address.Address } + +func (m message7) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych7.ConstructorParams{From: m.from, To: to}) + if aerr != nil { + return nil, aerr + } + enc, aerr := actors.SerializeParams(&init7.ExecParams{ + CodeCID: builtin7.PaymentChannelActorCodeID, + ConstructorParams: params, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Value: initialAmount, + Method: builtin7.MethodsInit.Exec, + Params: enc, + }, nil +} + +func (m message7) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych7.UpdateChannelStateParams{ + Sv: *sv, + Secret: secret, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin7.MethodsPaych.UpdateChannelState, + Params: params, + }, nil +} + +func (m message7) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin7.MethodsPaych.Settle, + }, nil +} + +func (m message7) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin7.MethodsPaych.Collect, + }, nil +} diff --git a/pkg/types/specactors/builtin/paych/mock/mock.go b/pkg/types/specactors/builtin/paych/mock/mock.go index d5826b051a..2b4d4898d7 100644 --- a/pkg/types/specactors/builtin/paych/mock/mock.go +++ b/pkg/types/specactors/builtin/paych/mock/mock.go @@ -1,12 +1,13 @@ package mock import ( - paych2 "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" "io" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" ) type mockState struct { @@ -14,7 +15,7 @@ type mockState struct { to address.Address settlingAt abi.ChainEpoch toSend abi.TokenAmount - lanes map[uint64]paych2.LaneState + lanes map[uint64]paych.LaneState } func (ms *mockState) GetState() interface{} { @@ -31,15 +32,15 @@ type mockLaneState struct { func NewMockPayChState(from address.Address, to address.Address, settlingAt abi.ChainEpoch, - lanes map[uint64]paych2.LaneState, -) paych2.State { + lanes map[uint64]paych.LaneState, +) paych.State { return &mockState{from: from, to: to, settlingAt: settlingAt, toSend: big.NewInt(0), lanes: lanes} } // NewMockLaneState constructs a state for a payment channel lane with the set fixed values // that satisfies the paych.LaneState interface. Useful for populating lanes when // calling NewMockPayChState -func NewMockLaneState(redeemed big.Int, nonce uint64) paych2.LaneState { +func NewMockLaneState(redeemed big.Int, nonce uint64) paych.LaneState { return &mockLaneState{redeemed, nonce} } @@ -73,7 +74,7 @@ func (ms *mockState) LaneCount() (uint64, error) { } // Iterate lane states -func (ms *mockState) ForEachLaneState(cb func(idx uint64, dl paych2.LaneState) error) error { +func (ms *mockState) ForEachLaneState(cb func(idx uint64, dl paych.LaneState) error) error { var lastErr error for lane, state := range ms.lanes { if err := cb(lane, state); err != nil { diff --git a/pkg/types/specactors/builtin/paych/paych.go b/pkg/types/specactors/builtin/paych/paych.go index fe8b2d26c8..e2db314594 100644 --- a/pkg/types/specactors/builtin/paych/paych.go +++ b/pkg/types/specactors/builtin/paych/paych.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/paych/actor.go.template + package paych import ( @@ -27,10 +29,13 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + types "github.com/filecoin-project/venus/pkg/types/internal" ) func init() { @@ -58,10 +63,14 @@ func init() { builtin.RegisterActorState(builtin6.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } // Load returns an abstract copy of payment channel state, irregardless of actor version -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { case builtin0.PaymentChannelActorCodeID: @@ -82,56 +91,65 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { case builtin6.PaymentChannelActorCodeID: return load6(store, act.Head) + case builtin7.PaymentChannelActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version) (State, error) { +func MakeState(store adt.Store, av actors.Version) (State, error) { switch av { - case specactors.Version0: + case actors.Version0: return make0(store) - case specactors.Version2: + case actors.Version2: return make2(store) - case specactors.Version3: + case actors.Version3: return make3(store) - case specactors.Version4: + case actors.Version4: return make4(store) - case specactors.Version5: + case actors.Version5: return make5(store) - case specactors.Version6: + case actors.Version6: return make6(store) - } + case actors.Version7: + return make7(store) + +} return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { - case specactors.Version0: + case actors.Version0: return builtin0.PaymentChannelActorCodeID, nil - case specactors.Version2: + case actors.Version2: return builtin2.PaymentChannelActorCodeID, nil - case specactors.Version3: + case actors.Version3: return builtin3.PaymentChannelActorCodeID, nil - case specactors.Version4: + case actors.Version4: return builtin4.PaymentChannelActorCodeID, nil - case specactors.Version5: + case actors.Version5: return builtin5.PaymentChannelActorCodeID, nil - case specactors.Version6: + case actors.Version6: return builtin6.PaymentChannelActorCodeID, nil + case actors.Version7: + return builtin7.PaymentChannelActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -185,37 +203,40 @@ func DecodeSignedVoucher(s string) (*SignedVoucher, error) { return &sv, nil } -var Methods = builtin6.MethodsPaych +var Methods = builtin7.MethodsPaych -func Message(version specactors.Version, from address.Address) MessageBuilder { +func Message(version actors.Version, from address.Address) MessageBuilder { switch version { - case specactors.Version0: + case actors.Version0: return message0{from} - case specactors.Version2: + case actors.Version2: return message2{from} - case specactors.Version3: + case actors.Version3: return message3{from} - case specactors.Version4: + case actors.Version4: return message4{from} - case specactors.Version5: + case actors.Version5: return message5{from} - case specactors.Version6: + case actors.Version6: return message6{from} + case actors.Version7: + return message7{from} + default: panic(fmt.Sprintf("unsupported actors version: %d", version)) } } type MessageBuilder interface { - Create(to address.Address, initialAmount abi.TokenAmount) (*internal.Message, error) - Update(paych address.Address, voucher *SignedVoucher, secret []byte) (*internal.Message, error) - Settle(paych address.Address) (*internal.Message, error) - Collect(paych address.Address) (*internal.Message, error) + Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) + Update(paych address.Address, voucher *SignedVoucher, secret []byte) (*types.Message, error) + Settle(paych address.Address) (*types.Message, error) + Collect(paych address.Address) (*types.Message, error) } diff --git a/pkg/types/specactors/builtin/paych/state.go.template b/pkg/types/specactors/builtin/paych/state.go.template index e9251ef2d8..75dde50bdf 100644 --- a/pkg/types/specactors/builtin/paych/state.go.template +++ b/pkg/types/specactors/builtin/paych/state.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + package paych import ( diff --git a/pkg/types/specactors/builtin/paych/v0.go b/pkg/types/specactors/builtin/paych/v0.go index ad65c0eb44..09a9dd7adc 100644 --- a/pkg/types/specactors/builtin/paych/v0.go +++ b/pkg/types/specactors/builtin/paych/v0.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + package paych import ( diff --git a/pkg/types/specactors/builtin/paych/v2.go b/pkg/types/specactors/builtin/paych/v2.go index 77cf780b4d..07fafb1e97 100644 --- a/pkg/types/specactors/builtin/paych/v2.go +++ b/pkg/types/specactors/builtin/paych/v2.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + package paych import ( diff --git a/pkg/types/specactors/builtin/paych/v3.go b/pkg/types/specactors/builtin/paych/v3.go index 81168fb3f1..7145277826 100644 --- a/pkg/types/specactors/builtin/paych/v3.go +++ b/pkg/types/specactors/builtin/paych/v3.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + package paych import ( diff --git a/pkg/types/specactors/builtin/paych/v4.go b/pkg/types/specactors/builtin/paych/v4.go index 7fefbbb297..901a714c2d 100644 --- a/pkg/types/specactors/builtin/paych/v4.go +++ b/pkg/types/specactors/builtin/paych/v4.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + package paych import ( diff --git a/pkg/types/specactors/builtin/paych/v5.go b/pkg/types/specactors/builtin/paych/v5.go index 1e75333992..7bab8e2407 100644 --- a/pkg/types/specactors/builtin/paych/v5.go +++ b/pkg/types/specactors/builtin/paych/v5.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + package paych import ( diff --git a/pkg/types/specactors/builtin/paych/v6.go b/pkg/types/specactors/builtin/paych/v6.go index ca168aa63f..322e0478e9 100644 --- a/pkg/types/specactors/builtin/paych/v6.go +++ b/pkg/types/specactors/builtin/paych/v6.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + package paych import ( diff --git a/pkg/types/specactors/builtin/paych/v7.go b/pkg/types/specactors/builtin/paych/v7.go new file mode 100644 index 0000000000..bbad7a4e32 --- /dev/null +++ b/pkg/types/specactors/builtin/paych/v7.go @@ -0,0 +1,116 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + +package paych + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/venus/pkg/types/specactors/adt" + + paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + out.State = paych7.State{} + return &out, nil +} + +type state7 struct { + paych7.State + store adt.Store + lsAmt *adt7.Array +} + +// Channel owner, who has funded the actor +func (s *state7) From() (address.Address, error) { + return s.State.From, nil +} + +// Recipient of payouts from channel +func (s *state7) To() (address.Address, error) { + return s.State.To, nil +} + +// Height at which the channel can be `Collected` +func (s *state7) SettlingAt() (abi.ChainEpoch, error) { + return s.State.SettlingAt, nil +} + +// Amount successfully redeemed through the payment channel, paid out on `Collect()` +func (s *state7) ToSend() (abi.TokenAmount, error) { + return s.State.ToSend, nil +} + +func (s *state7) getOrLoadLsAmt() (*adt7.Array, error) { + if s.lsAmt != nil { + return s.lsAmt, nil + } + + // Get the lane state from the chain + lsamt, err := adt7.AsArray(s.store, s.State.LaneStates, paych7.LaneStatesAmtBitwidth) + if err != nil { + return nil, err + } + + s.lsAmt = lsamt + return lsamt, nil +} + +// Get total number of lanes +func (s *state7) LaneCount() (uint64, error) { + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return 0, err + } + return lsamt.Length(), nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} + +// Iterate lane states +func (s *state7) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { + // Get the lane state from the chain + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return err + } + + // Note: we use a map instead of an array to store laneStates because the + // client sets the lane ID (the index) and potentially they could use a + // very large index. + var ls paych7.LaneState + return lsamt.ForEach(&ls, func(i int64) error { + return cb(uint64(i), &laneState7{ls}) + }) +} + +type laneState7 struct { + paych7.LaneState +} + +func (ls *laneState7) Redeemed() (big.Int, error) { + return ls.LaneState.Redeemed, nil +} + +func (ls *laneState7) Nonce() (uint64, error) { + return ls.LaneState.Nonce, nil +} diff --git a/pkg/types/specactors/builtin/power/actor.go.template b/pkg/types/specactors/builtin/power/actor.go.template index f4606e1829..7d1ffd2693 100644 --- a/pkg/types/specactors/builtin/power/actor.go.template +++ b/pkg/types/specactors/builtin/power/actor.go.template @@ -1,9 +1,11 @@ +// FETCHED FROM LOTUS: builtin/power/actor.go.template + package power import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" @@ -13,7 +15,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/internal" + types "github.com/filecoin-project/venus/pkg/types/internal" {{range .versions}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" {{end}} @@ -31,7 +33,7 @@ var ( Methods = builtin{{.latestVersion}}.MethodsPower ) -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { {{range .versions}} case builtin{{.}}.StoragePowerActorCodeID: @@ -41,20 +43,20 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version) (State, error) { +func MakeState(store adt.Store, av actors.Version) (State, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return make{{.}}(store) {{end}} } return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return builtin{{.}}.StoragePowerActorCodeID, nil {{end}} } diff --git a/pkg/types/specactors/builtin/power/diff.go b/pkg/types/specactors/builtin/power/diff.go deleted file mode 100644 index 1098ab1b3d..0000000000 --- a/pkg/types/specactors/builtin/power/diff.go +++ /dev/null @@ -1,116 +0,0 @@ -package power - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - adt2 "github.com/filecoin-project/venus/pkg/types/specactors/adt" - cbg "github.com/whyrusleeping/cbor-gen" -) - -type ClaimChanges struct { - Added []ClaimInfo - Modified []ClaimModification - Removed []ClaimInfo -} - -type ClaimModification struct { - Miner address.Address - From Claim - To Claim -} - -type ClaimInfo struct { - Miner address.Address - Claim Claim -} - -func DiffClaims(pre, cur State) (*ClaimChanges, error) { - results := new(ClaimChanges) - - prec, err := pre.claims() - if err != nil { - return nil, err - } - - curc, err := cur.claims() - if err != nil { - return nil, err - } - - if err := adt2.DiffAdtMap(prec, curc, &claimDiffer{results, pre, cur}); err != nil { - return nil, err - } - - return results, nil -} - -type claimDiffer struct { - Results *ClaimChanges - pre, after State -} - -func (c *claimDiffer) AsKey(key string) (abi.Keyer, error) { - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return nil, err - } - return abi.AddrKey(addr), nil -} - -func (c *claimDiffer) Add(key string, val *cbg.Deferred) error { - ci, err := c.after.decodeClaim(val) - if err != nil { - return err - } - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - c.Results.Added = append(c.Results.Added, ClaimInfo{ - Miner: addr, - Claim: ci, - }) - return nil -} - -func (c *claimDiffer) Modify(key string, from, to *cbg.Deferred) error { - ciFrom, err := c.pre.decodeClaim(from) - if err != nil { - return err - } - - ciTo, err := c.after.decodeClaim(to) - if err != nil { - return err - } - - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - - if ciFrom != ciTo { - c.Results.Modified = append(c.Results.Modified, ClaimModification{ - Miner: addr, - From: ciFrom, - To: ciTo, - }) - } - return nil -} - -func (c *claimDiffer) Remove(key string, val *cbg.Deferred) error { - ci, err := c.after.decodeClaim(val) - if err != nil { - return err - } - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - c.Results.Removed = append(c.Results.Removed, ClaimInfo{ - Miner: addr, - Claim: ci, - }) - return nil -} diff --git a/pkg/types/specactors/builtin/power/power.go b/pkg/types/specactors/builtin/power/power.go index 6c0588837a..ac161d59d9 100644 --- a/pkg/types/specactors/builtin/power/power.go +++ b/pkg/types/specactors/builtin/power/power.go @@ -1,9 +1,11 @@ +// FETCHED FROM LOTUS: builtin/power/actor.go.template + package power import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" @@ -11,9 +13,9 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/cbor" - "github.com/filecoin-project/venus/pkg/types/internal" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + types "github.com/filecoin-project/venus/pkg/types/internal" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -26,6 +28,9 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + ) func init() { @@ -53,14 +58,18 @@ func init() { builtin.RegisterActorState(builtin6.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var ( - Address = builtin6.StoragePowerActorAddr - Methods = builtin6.MethodsPower + Address = builtin7.StoragePowerActorAddr + Methods = builtin7.MethodsPower ) -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { case builtin0.StoragePowerActorCodeID: @@ -81,56 +90,65 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { case builtin6.StoragePowerActorCodeID: return load6(store, act.Head) + case builtin7.StoragePowerActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version) (State, error) { +func MakeState(store adt.Store, av actors.Version) (State, error) { switch av { - case specactors.Version0: + case actors.Version0: return make0(store) - case specactors.Version2: + case actors.Version2: return make2(store) - case specactors.Version3: + case actors.Version3: return make3(store) - case specactors.Version4: + case actors.Version4: return make4(store) - case specactors.Version5: + case actors.Version5: return make5(store) - case specactors.Version6: + case actors.Version6: return make6(store) - } + case actors.Version7: + return make7(store) + +} return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { - case specactors.Version0: + case actors.Version0: return builtin0.StoragePowerActorCodeID, nil - case specactors.Version2: + case actors.Version2: return builtin2.StoragePowerActorCodeID, nil - case specactors.Version3: + case actors.Version3: return builtin3.StoragePowerActorCodeID, nil - case specactors.Version4: + case actors.Version4: return builtin4.StoragePowerActorCodeID, nil - case specactors.Version5: + case actors.Version5: return builtin5.StoragePowerActorCodeID, nil - case specactors.Version6: + case actors.Version6: return builtin6.StoragePowerActorCodeID, nil + case actors.Version7: + return builtin7.StoragePowerActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/pkg/types/specactors/builtin/power/state.go.template b/pkg/types/specactors/builtin/power/state.go.template index c84fb374da..e8a5a5f5cc 100644 --- a/pkg/types/specactors/builtin/power/state.go.template +++ b/pkg/types/specactors/builtin/power/state.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + package power import ( diff --git a/pkg/types/specactors/builtin/power/v0.go b/pkg/types/specactors/builtin/power/v0.go index cd22094701..36d80e5c79 100644 --- a/pkg/types/specactors/builtin/power/v0.go +++ b/pkg/types/specactors/builtin/power/v0.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + package power import ( @@ -11,6 +13,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" ) @@ -28,18 +31,19 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store) (State, error) { out := state0{store: store} + + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - emm, err := adt0.MakeEmptyMultimap(store).Root() - if err != nil { - return nil, err - } + emm, err := adt0.MakeEmptyMultimap(store).Root() + if err != nil { + return nil, err + } - out.State = *power0.ConstructState(em, emm) + out.State = *power0.ConstructState(em, emm) + return &out, nil } diff --git a/pkg/types/specactors/builtin/power/v2.go b/pkg/types/specactors/builtin/power/v2.go index cb5ff51f72..81e2cb9d56 100644 --- a/pkg/types/specactors/builtin/power/v2.go +++ b/pkg/types/specactors/builtin/power/v2.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + package power import ( @@ -11,6 +13,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + power2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/power" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" ) @@ -28,18 +31,19 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store) (State, error) { out := state2{store: store} + + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - emm, err := adt2.MakeEmptyMultimap(store).Root() - if err != nil { - return nil, err - } + emm, err := adt2.MakeEmptyMultimap(store).Root() + if err != nil { + return nil, err + } - out.State = *power2.ConstructState(em, emm) + out.State = *power2.ConstructState(em, emm) + return &out, nil } diff --git a/pkg/types/specactors/builtin/power/v3.go b/pkg/types/specactors/builtin/power/v3.go index fbf222e428..c8ce1b7fe2 100644 --- a/pkg/types/specactors/builtin/power/v3.go +++ b/pkg/types/specactors/builtin/power/v3.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + package power import ( @@ -11,6 +13,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" power3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/power" @@ -30,13 +33,14 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store) (State, error) { out := state3{store: store} + + s, err := power3.ConstructState(store) + if err != nil { + return nil, err + } - s, err := power3.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s + out.State = *s + return &out, nil } diff --git a/pkg/types/specactors/builtin/power/v4.go b/pkg/types/specactors/builtin/power/v4.go index f015925250..c1ba984186 100644 --- a/pkg/types/specactors/builtin/power/v4.go +++ b/pkg/types/specactors/builtin/power/v4.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + package power import ( @@ -11,6 +13,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" power4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/power" @@ -30,13 +33,14 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store) (State, error) { out := state4{store: store} + + s, err := power4.ConstructState(store) + if err != nil { + return nil, err + } - s, err := power4.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s + out.State = *s + return &out, nil } diff --git a/pkg/types/specactors/builtin/power/v5.go b/pkg/types/specactors/builtin/power/v5.go index 8406eea59a..20bb9b6f4d 100644 --- a/pkg/types/specactors/builtin/power/v5.go +++ b/pkg/types/specactors/builtin/power/v5.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + package power import ( @@ -11,6 +13,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" power5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/power" @@ -30,13 +33,14 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store) (State, error) { out := state5{store: store} + + s, err := power5.ConstructState(store) + if err != nil { + return nil, err + } - s, err := power5.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s + out.State = *s + return &out, nil } diff --git a/pkg/types/specactors/builtin/power/v6.go b/pkg/types/specactors/builtin/power/v6.go index 9ffe9165c2..d52353e5f3 100644 --- a/pkg/types/specactors/builtin/power/v6.go +++ b/pkg/types/specactors/builtin/power/v6.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + package power import ( @@ -11,6 +13,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" power6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/power" @@ -30,13 +33,14 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store) (State, error) { out := state6{store: store} + + s, err := power6.ConstructState(store) + if err != nil { + return nil, err + } - s, err := power6.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s + out.State = *s + return &out, nil } diff --git a/pkg/types/specactors/builtin/power/v7.go b/pkg/types/specactors/builtin/power/v7.go new file mode 100644 index 0000000000..106e780da7 --- /dev/null +++ b/pkg/types/specactors/builtin/power/v7.go @@ -0,0 +1,191 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + +package power + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/pkg/types/specactors/adt" + "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + power7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/power" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + + s, err := power7.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + + return &out, nil +} + +type state7 struct { + power7.State + store adt.Store +} + +func (s *state7) TotalLocked() (abi.TokenAmount, error) { + return s.TotalPledgeCollateral, nil +} + +func (s *state7) TotalPower() (Claim, error) { + return Claim{ + RawBytePower: s.TotalRawBytePower, + QualityAdjPower: s.TotalQualityAdjPower, + }, nil +} + +// Committed power to the network. Includes miners below the minimum threshold. +func (s *state7) TotalCommitted() (Claim, error) { + return Claim{ + RawBytePower: s.TotalBytesCommitted, + QualityAdjPower: s.TotalQABytesCommitted, + }, nil +} + +func (s *state7) MinerPower(addr address.Address) (Claim, bool, error) { + claims, err := s.claims() + if err != nil { + return Claim{}, false, err + } + var claim power7.Claim + ok, err := claims.Get(abi.AddrKey(addr), &claim) + if err != nil { + return Claim{}, false, err + } + return Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }, ok, nil +} + +func (s *state7) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { + return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) +} + +func (s *state7) TotalPowerSmoothed() (builtin.FilterEstimate, error) { + return builtin.FromV7FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil +} + +func (s *state7) MinerCounts() (uint64, uint64, error) { + return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil +} + +func (s *state7) ListAllMiners() ([]address.Address, error) { + claims, err := s.claims() + if err != nil { + return nil, err + } + + var miners []address.Address + err = claims.ForEach(nil, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + miners = append(miners, a) + return nil + }) + if err != nil { + return nil, err + } + + return miners, nil +} + +func (s *state7) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { + claims, err := s.claims() + if err != nil { + return err + } + + var claim power7.Claim + return claims.ForEach(&claim, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + return cb(a, Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + }) +} + +func (s *state7) ClaimsChanged(other State) (bool, error) { + other7, ok := other.(*state7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Claims.Equals(other7.State.Claims), nil +} + +func (s *state7) SetTotalQualityAdjPower(p abi.StoragePower) error { + s.State.TotalQualityAdjPower = p + return nil +} + +func (s *state7) SetTotalRawBytePower(p abi.StoragePower) error { + s.State.TotalRawBytePower = p + return nil +} + +func (s *state7) SetThisEpochQualityAdjPower(p abi.StoragePower) error { + s.State.ThisEpochQualityAdjPower = p + return nil +} + +func (s *state7) SetThisEpochRawBytePower(p abi.StoragePower) error { + s.State.ThisEpochRawBytePower = p + return nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} + +func (s *state7) claims() (adt.Map, error) { + return adt7.AsMap(s.store, s.Claims, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) decodeClaim(val *cbg.Deferred) (Claim, error) { + var ci power7.Claim + if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Claim{}, err + } + return fromV7Claim(ci), nil +} + +func fromV7Claim(v7 power7.Claim) Claim { + return Claim{ + RawBytePower: v7.RawBytePower, + QualityAdjPower: v7.QualityAdjPower, + } +} diff --git a/pkg/types/specactors/builtin/reward/actor.go.template b/pkg/types/specactors/builtin/reward/actor.go.template index 89aa1f57ed..27d969b11e 100644 --- a/pkg/types/specactors/builtin/reward/actor.go.template +++ b/pkg/types/specactors/builtin/reward/actor.go.template @@ -1,10 +1,12 @@ +// FETCHED FROM LOTUS: builtin/reward/actor.go.template + package reward import ( "github.com/filecoin-project/go-state-types/abi" reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/cbor" @@ -14,7 +16,7 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/internal" + types "github.com/filecoin-project/venus/pkg/types/internal" ) func init() { @@ -29,7 +31,7 @@ var ( Methods = builtin{{.latestVersion}}.MethodsReward ) -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { {{range .versions}} case builtin{{.}}.RewardActorCodeID: @@ -39,20 +41,20 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version, currRealizedPower abi.StoragePower) (State, error) { +func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.StoragePower) (State, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return make{{.}}(store, currRealizedPower) {{end}} } return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return builtin{{.}}.RewardActorCodeID, nil {{end}} } diff --git a/pkg/types/specactors/builtin/reward/reward.go b/pkg/types/specactors/builtin/reward/reward.go index 1c2cb4be23..1607ad587c 100644 --- a/pkg/types/specactors/builtin/reward/reward.go +++ b/pkg/types/specactors/builtin/reward/reward.go @@ -1,10 +1,12 @@ +// FETCHED FROM LOTUS: builtin/reward/actor.go.template + package reward import ( "github.com/filecoin-project/go-state-types/abi" reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" - "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/ipfs/go-cid" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/cbor" @@ -21,9 +23,12 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - "github.com/filecoin-project/venus/pkg/types/internal" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + types "github.com/filecoin-project/venus/pkg/types/internal" ) func init() { @@ -51,14 +56,18 @@ func init() { builtin.RegisterActorState(builtin6.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var ( - Address = builtin6.RewardActorAddr - Methods = builtin6.MethodsReward + Address = builtin7.RewardActorAddr + Methods = builtin7.MethodsReward ) -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { case builtin0.RewardActorCodeID: @@ -79,56 +88,65 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { case builtin6.RewardActorCodeID: return load6(store, act.Head) + case builtin7.RewardActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version, currRealizedPower abi.StoragePower) (State, error) { +func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.StoragePower) (State, error) { switch av { - case specactors.Version0: + case actors.Version0: return make0(store, currRealizedPower) - case specactors.Version2: + case actors.Version2: return make2(store, currRealizedPower) - case specactors.Version3: + case actors.Version3: return make3(store, currRealizedPower) - case specactors.Version4: + case actors.Version4: return make4(store, currRealizedPower) - case specactors.Version5: + case actors.Version5: return make5(store, currRealizedPower) - case specactors.Version6: + case actors.Version6: return make6(store, currRealizedPower) - } + case actors.Version7: + return make7(store, currRealizedPower) + +} return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { - case specactors.Version0: + case actors.Version0: return builtin0.RewardActorCodeID, nil - case specactors.Version2: + case actors.Version2: return builtin2.RewardActorCodeID, nil - case specactors.Version3: + case actors.Version3: return builtin3.RewardActorCodeID, nil - case specactors.Version4: + case actors.Version4: return builtin4.RewardActorCodeID, nil - case specactors.Version5: + case actors.Version5: return builtin5.RewardActorCodeID, nil - case specactors.Version6: + case actors.Version6: return builtin6.RewardActorCodeID, nil + case actors.Version7: + return builtin7.RewardActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/pkg/types/specactors/builtin/reward/state.go.template b/pkg/types/specactors/builtin/reward/state.go.template index b13411188b..397a861c77 100644 --- a/pkg/types/specactors/builtin/reward/state.go.template +++ b/pkg/types/specactors/builtin/reward/state.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + package reward import ( diff --git a/pkg/types/specactors/builtin/reward/v0.go b/pkg/types/specactors/builtin/reward/v0.go index c5d6490982..dd83b4dee4 100644 --- a/pkg/types/specactors/builtin/reward/v0.go +++ b/pkg/types/specactors/builtin/reward/v0.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + package reward import ( diff --git a/pkg/types/specactors/builtin/reward/v2.go b/pkg/types/specactors/builtin/reward/v2.go index b7bb5a8851..8c7a5cbb3d 100644 --- a/pkg/types/specactors/builtin/reward/v2.go +++ b/pkg/types/specactors/builtin/reward/v2.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + package reward import ( @@ -40,7 +42,7 @@ func (s *state2) ThisEpochReward() (abi.TokenAmount, error) { func (s *state2) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/pkg/types/specactors/builtin/reward/v3.go b/pkg/types/specactors/builtin/reward/v3.go index 136c7c129f..5c05a5f320 100644 --- a/pkg/types/specactors/builtin/reward/v3.go +++ b/pkg/types/specactors/builtin/reward/v3.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + package reward import ( @@ -40,7 +42,7 @@ func (s *state3) ThisEpochReward() (abi.TokenAmount, error) { func (s *state3) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/pkg/types/specactors/builtin/reward/v4.go b/pkg/types/specactors/builtin/reward/v4.go index c1572e4197..c617676b89 100644 --- a/pkg/types/specactors/builtin/reward/v4.go +++ b/pkg/types/specactors/builtin/reward/v4.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + package reward import ( @@ -40,7 +42,7 @@ func (s *state4) ThisEpochReward() (abi.TokenAmount, error) { func (s *state4) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/pkg/types/specactors/builtin/reward/v5.go b/pkg/types/specactors/builtin/reward/v5.go index 8a0da9c0c6..da362a571d 100644 --- a/pkg/types/specactors/builtin/reward/v5.go +++ b/pkg/types/specactors/builtin/reward/v5.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + package reward import ( @@ -40,7 +42,7 @@ func (s *state5) ThisEpochReward() (abi.TokenAmount, error) { func (s *state5) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/pkg/types/specactors/builtin/reward/v6.go b/pkg/types/specactors/builtin/reward/v6.go index 0538c5dde8..a088e0fd6d 100644 --- a/pkg/types/specactors/builtin/reward/v6.go +++ b/pkg/types/specactors/builtin/reward/v6.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + package reward import ( @@ -40,7 +42,7 @@ func (s *state6) ThisEpochReward() (abi.TokenAmount, error) { func (s *state6) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/pkg/types/specactors/builtin/reward/v7.go b/pkg/types/specactors/builtin/reward/v7.go new file mode 100644 index 0000000000..aa381e9e18 --- /dev/null +++ b/pkg/types/specactors/builtin/reward/v7.go @@ -0,0 +1,100 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + +package reward + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/pkg/types/specactors/adt" + "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" + reward7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/reward" + smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { + out := state7{store: store} + out.State = *reward7.ConstructState(currRealizedPower) + return &out, nil +} + +type state7 struct { + reward7.State + store adt.Store +} + +func (s *state7) ThisEpochReward() (abi.TokenAmount, error) { + return s.State.ThisEpochReward, nil +} + +func (s *state7) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { + + return builtin.FilterEstimate{ + PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, + VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, + }, nil + +} + +func (s *state7) ThisEpochBaselinePower() (abi.StoragePower, error) { + return s.State.ThisEpochBaselinePower, nil +} + +func (s *state7) TotalStoragePowerReward() (abi.TokenAmount, error) { + return s.State.TotalStoragePowerReward, nil +} + +func (s *state7) EffectiveBaselinePower() (abi.StoragePower, error) { + return s.State.EffectiveBaselinePower, nil +} + +func (s *state7) EffectiveNetworkTime() (abi.ChainEpoch, error) { + return s.State.EffectiveNetworkTime, nil +} + +func (s *state7) CumsumBaseline() (reward7.Spacetime, error) { + return s.State.CumsumBaseline, nil +} + +func (s *state7) CumsumRealized() (reward7.Spacetime, error) { + return s.State.CumsumRealized, nil +} + +func (s *state7) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { + return miner7.InitialPledgeForPower( + qaPower, + s.State.ThisEpochBaselinePower, + s.State.ThisEpochRewardSmoothed, + smoothing7.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply, + ), nil +} + +func (s *state7) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { + return miner7.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, + smoothing7.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + sectorWeight), nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/pkg/types/specactors/builtin/system/actor.go.template b/pkg/types/specactors/builtin/system/actor.go.template index 0bf0d4f131..14c30b0075 100644 --- a/pkg/types/specactors/builtin/system/actor.go.template +++ b/pkg/types/specactors/builtin/system/actor.go.template @@ -1,8 +1,10 @@ +// FETCHED FROM LOTUS: builtin/system/actor.go.template + package system import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "golang.org/x/xerrors" "github.com/ipfs/go-cid" @@ -15,20 +17,20 @@ var ( Address = builtin{{.latestVersion}}.SystemActorAddr ) -func MakeState(store adt.Store, av specactors.Version) (State, error) { +func MakeState(store adt.Store, av actors.Version) (State, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return make{{.}}(store) {{end}} } return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return builtin{{.}}.SystemActorCodeID, nil {{end}} } diff --git a/pkg/types/specactors/builtin/system/state.go.template b/pkg/types/specactors/builtin/system/state.go.template index 0281a13bf0..a02a7e939b 100644 --- a/pkg/types/specactors/builtin/system/state.go.template +++ b/pkg/types/specactors/builtin/system/state.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + package system import ( diff --git a/pkg/types/specactors/builtin/system/system.go b/pkg/types/specactors/builtin/system/system.go index c0367bcd4d..4196ef59a6 100644 --- a/pkg/types/specactors/builtin/system/system.go +++ b/pkg/types/specactors/builtin/system/system.go @@ -1,10 +1,13 @@ +// FETCHED FROM LOTUS: builtin/system/actor.go.template + package system import ( - "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/ipfs/go-cid" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "golang.org/x/xerrors" + "github.com/ipfs/go-cid" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -17,58 +20,67 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + ) var ( - Address = builtin6.SystemActorAddr + Address = builtin7.SystemActorAddr ) -func MakeState(store adt.Store, av specactors.Version) (State, error) { +func MakeState(store adt.Store, av actors.Version) (State, error) { switch av { - case specactors.Version0: + case actors.Version0: return make0(store) - case specactors.Version2: + case actors.Version2: return make2(store) - case specactors.Version3: + case actors.Version3: return make3(store) - case specactors.Version4: + case actors.Version4: return make4(store) - case specactors.Version5: + case actors.Version5: return make5(store) - case specactors.Version6: + case actors.Version6: return make6(store) - } + case actors.Version7: + return make7(store) + +} return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { - case specactors.Version0: + case actors.Version0: return builtin0.SystemActorCodeID, nil - case specactors.Version2: + case actors.Version2: return builtin2.SystemActorCodeID, nil - case specactors.Version3: + case actors.Version3: return builtin3.SystemActorCodeID, nil - case specactors.Version4: + case actors.Version4: return builtin4.SystemActorCodeID, nil - case specactors.Version5: + case actors.Version5: return builtin5.SystemActorCodeID, nil - case specactors.Version6: + case actors.Version6: return builtin6.SystemActorCodeID, nil + case actors.Version7: + return builtin7.SystemActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/pkg/types/specactors/builtin/system/v0.go b/pkg/types/specactors/builtin/system/v0.go index 6f93c59d17..b690c9d0a4 100644 --- a/pkg/types/specactors/builtin/system/v0.go +++ b/pkg/types/specactors/builtin/system/v0.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + package system import ( @@ -32,4 +34,4 @@ type state0 struct { func (s *state0) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/system/v2.go b/pkg/types/specactors/builtin/system/v2.go index f11512720b..d2b244fcaf 100644 --- a/pkg/types/specactors/builtin/system/v2.go +++ b/pkg/types/specactors/builtin/system/v2.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + package system import ( @@ -32,4 +34,4 @@ type state2 struct { func (s *state2) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/system/v3.go b/pkg/types/specactors/builtin/system/v3.go index 90b4594045..13ad0716f7 100644 --- a/pkg/types/specactors/builtin/system/v3.go +++ b/pkg/types/specactors/builtin/system/v3.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + package system import ( @@ -32,4 +34,4 @@ type state3 struct { func (s *state3) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/system/v4.go b/pkg/types/specactors/builtin/system/v4.go index ceab2000cc..2266d9ccf0 100644 --- a/pkg/types/specactors/builtin/system/v4.go +++ b/pkg/types/specactors/builtin/system/v4.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + package system import ( @@ -32,4 +34,4 @@ type state4 struct { func (s *state4) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/system/v5.go b/pkg/types/specactors/builtin/system/v5.go index 78be5e9378..eb1fdafecc 100644 --- a/pkg/types/specactors/builtin/system/v5.go +++ b/pkg/types/specactors/builtin/system/v5.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + package system import ( @@ -32,4 +34,4 @@ type state5 struct { func (s *state5) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/system/v6.go b/pkg/types/specactors/builtin/system/v6.go index 983fd3a607..0cc38d8c0a 100644 --- a/pkg/types/specactors/builtin/system/v6.go +++ b/pkg/types/specactors/builtin/system/v6.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + package system import ( @@ -32,4 +34,4 @@ type state6 struct { func (s *state6) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/system/v7.go b/pkg/types/specactors/builtin/system/v7.go new file mode 100644 index 0000000000..a528763a8d --- /dev/null +++ b/pkg/types/specactors/builtin/system/v7.go @@ -0,0 +1,37 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + +package system + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/pkg/types/specactors/adt" + + system7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/system" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + out.State = system7.State{} + return &out, nil +} + +type state7 struct { + system7.State + store adt.Store +} + +func (s *state7) GetState() interface{} { + return &s.State +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/verifreg/actor.go.template b/pkg/types/specactors/builtin/verifreg/actor.go.template index e540293dee..2112fad3ee 100644 --- a/pkg/types/specactors/builtin/verifreg/actor.go.template +++ b/pkg/types/specactors/builtin/verifreg/actor.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/verifreg/actor.go.template + package verifreg import ( @@ -14,8 +16,8 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/internal" + actors "github.com/filecoin-project/venus/pkg/types/specactors" + types "github.com/filecoin-project/venus/pkg/types/internal" ) func init() { @@ -31,7 +33,7 @@ var ( Methods = builtin{{.latestVersion}}.MethodsVerifiedRegistry ) -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { {{range .versions}} case builtin{{.}}.VerifiedRegistryActorCodeID: @@ -41,20 +43,20 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version, rootKeyAddress address.Address) (State, error) { +func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Address) (State, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return make{{.}}(store, rootKeyAddress) {{end}} } return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { {{range .versions}} - case specactors.Version{{.}}: + case actors.Version{{.}}: return builtin{{.}}.VerifiedRegistryActorCodeID, nil {{end}} } diff --git a/pkg/types/specactors/builtin/verifreg/state.go.template b/pkg/types/specactors/builtin/verifreg/state.go.template index ed89b51b0f..507b8530bc 100644 --- a/pkg/types/specactors/builtin/verifreg/state.go.template +++ b/pkg/types/specactors/builtin/verifreg/state.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + package verifreg import ( @@ -5,7 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" {{if (ge .v 3)}} builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" @@ -54,19 +56,19 @@ func (s *state{{.v}}) RootKey() (address.Address, error) { } func (s *state{{.v}}) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, specactors.Version{{.v}}, s.verifiedClients, addr) + return getDataCap(s.store, actors.Version{{.v}}, s.verifiedClients, addr) } func (s *state{{.v}}) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, specactors.Version{{.v}}, s.verifiers, addr) + return getDataCap(s.store, actors.Version{{.v}}, s.verifiers, addr) } func (s *state{{.v}}) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, specactors.Version{{.v}}, s.verifiers, cb) + return forEachCap(s.store, actors.Version{{.v}}, s.verifiers, cb) } func (s *state{{.v}}) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, specactors.Version{{.v}}, s.verifiedClients, cb) + return forEachCap(s.store, actors.Version{{.v}}, s.verifiedClients, cb) } func (s *state{{.v}}) verifiedClients() (adt.Map, error) { diff --git a/pkg/types/specactors/builtin/verifreg/util.go b/pkg/types/specactors/builtin/verifreg/util.go deleted file mode 100644 index 78173def51..0000000000 --- a/pkg/types/specactors/builtin/verifreg/util.go +++ /dev/null @@ -1,53 +0,0 @@ -package verifreg - -import ( - specactors2 "github.com/filecoin-project/venus/pkg/types/specactors" - adt2 "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" -) - -// taking this as a function instead of asking the caller to call it helps reduce some of the error -// checking boilerplate. -// -// "go made me do it" -type rootFunc func() (adt2.Map, error) - -// Assumes that the bitwidth for v3 HAMTs is the DefaultHamtBitwidth -func getDataCap(store adt2.Store, ver specactors2.Version, root rootFunc, addr address.Address) (bool, abi.StoragePower, error) { - if addr.Protocol() != address.ID { - return false, big.Zero(), xerrors.Errorf("can only look up ID addresses") - } - vh, err := root() - if err != nil { - return false, big.Zero(), xerrors.Errorf("loading verifreg: %w", err) - } - - var dcap abi.StoragePower - if found, err := vh.Get(abi.AddrKey(addr), &dcap); err != nil { - return false, big.Zero(), xerrors.Errorf("looking up addr: %w", err) - } else if !found { - return false, big.Zero(), nil - } - - return true, dcap, nil -} - -// Assumes that the bitwidth for v3 HAMTs is the DefaultHamtBitwidth -func forEachCap(store adt2.Store, ver specactors2.Version, root rootFunc, cb func(addr address.Address, dcap abi.StoragePower) error) error { - vh, err := root() - if err != nil { - return xerrors.Errorf("loading verified clients: %w", err) - } - var dcap abi.StoragePower - return vh.ForEach(&dcap, func(key string) error { - a, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(a, dcap) - }) -} diff --git a/pkg/types/specactors/builtin/verifreg/v0.go b/pkg/types/specactors/builtin/verifreg/v0.go index ff4150b55d..e7a51a72d8 100644 --- a/pkg/types/specactors/builtin/verifreg/v0.go +++ b/pkg/types/specactors/builtin/verifreg/v0.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + package verifreg import ( @@ -5,7 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" @@ -25,14 +27,14 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state0{store: store} - - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *verifreg0.ConstructState(em, rootKeyAddress) - + + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *verifreg0.ConstructState(em, rootKeyAddress) + return &out, nil } @@ -46,19 +48,19 @@ func (s *state0) RootKey() (address.Address, error) { } func (s *state0) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, specactors.Version0, s.verifiedClients, addr) + return getDataCap(s.store, actors.Version0, s.verifiedClients, addr) } func (s *state0) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, specactors.Version0, s.verifiers, addr) + return getDataCap(s.store, actors.Version0, s.verifiers, addr) } func (s *state0) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, specactors.Version0, s.verifiers, cb) + return forEachCap(s.store, actors.Version0, s.verifiers, cb) } func (s *state0) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, specactors.Version0, s.verifiedClients, cb) + return forEachCap(s.store, actors.Version0, s.verifiedClients, cb) } func (s *state0) verifiedClients() (adt.Map, error) { @@ -71,4 +73,4 @@ func (s *state0) verifiers() (adt.Map, error) { func (s *state0) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/verifreg/v2.go b/pkg/types/specactors/builtin/verifreg/v2.go index a92ef1ef72..721493a2e3 100644 --- a/pkg/types/specactors/builtin/verifreg/v2.go +++ b/pkg/types/specactors/builtin/verifreg/v2.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + package verifreg import ( @@ -5,7 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" @@ -25,14 +27,14 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state2{store: store} - - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *verifreg2.ConstructState(em, rootKeyAddress) - + + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *verifreg2.ConstructState(em, rootKeyAddress) + return &out, nil } @@ -46,19 +48,19 @@ func (s *state2) RootKey() (address.Address, error) { } func (s *state2) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, specactors.Version2, s.verifiedClients, addr) + return getDataCap(s.store, actors.Version2, s.verifiedClients, addr) } func (s *state2) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, specactors.Version2, s.verifiers, addr) + return getDataCap(s.store, actors.Version2, s.verifiers, addr) } func (s *state2) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, specactors.Version2, s.verifiers, cb) + return forEachCap(s.store, actors.Version2, s.verifiers, cb) } func (s *state2) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, specactors.Version2, s.verifiedClients, cb) + return forEachCap(s.store, actors.Version2, s.verifiedClients, cb) } func (s *state2) verifiedClients() (adt.Map, error) { @@ -71,4 +73,4 @@ func (s *state2) verifiers() (adt.Map, error) { func (s *state2) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/verifreg/v3.go b/pkg/types/specactors/builtin/verifreg/v3.go index 194e72e9dd..819d809928 100644 --- a/pkg/types/specactors/builtin/verifreg/v3.go +++ b/pkg/types/specactors/builtin/verifreg/v3.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + package verifreg import ( @@ -5,7 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" @@ -26,14 +28,14 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state3{store: store} - - s, err := verifreg3.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - + + s, err := verifreg3.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -47,19 +49,19 @@ func (s *state3) RootKey() (address.Address, error) { } func (s *state3) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, specactors.Version3, s.verifiedClients, addr) + return getDataCap(s.store, actors.Version3, s.verifiedClients, addr) } func (s *state3) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, specactors.Version3, s.verifiers, addr) + return getDataCap(s.store, actors.Version3, s.verifiers, addr) } func (s *state3) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, specactors.Version3, s.verifiers, cb) + return forEachCap(s.store, actors.Version3, s.verifiers, cb) } func (s *state3) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, specactors.Version3, s.verifiedClients, cb) + return forEachCap(s.store, actors.Version3, s.verifiedClients, cb) } func (s *state3) verifiedClients() (adt.Map, error) { @@ -72,4 +74,4 @@ func (s *state3) verifiers() (adt.Map, error) { func (s *state3) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/verifreg/v4.go b/pkg/types/specactors/builtin/verifreg/v4.go index 3a3b71e7b7..cc25d31954 100644 --- a/pkg/types/specactors/builtin/verifreg/v4.go +++ b/pkg/types/specactors/builtin/verifreg/v4.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + package verifreg import ( @@ -5,7 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" @@ -26,14 +28,14 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state4{store: store} - - s, err := verifreg4.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - + + s, err := verifreg4.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -47,19 +49,19 @@ func (s *state4) RootKey() (address.Address, error) { } func (s *state4) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, specactors.Version4, s.verifiedClients, addr) + return getDataCap(s.store, actors.Version4, s.verifiedClients, addr) } func (s *state4) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, specactors.Version4, s.verifiers, addr) + return getDataCap(s.store, actors.Version4, s.verifiers, addr) } func (s *state4) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, specactors.Version4, s.verifiers, cb) + return forEachCap(s.store, actors.Version4, s.verifiers, cb) } func (s *state4) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, specactors.Version4, s.verifiedClients, cb) + return forEachCap(s.store, actors.Version4, s.verifiedClients, cb) } func (s *state4) verifiedClients() (adt.Map, error) { @@ -72,4 +74,4 @@ func (s *state4) verifiers() (adt.Map, error) { func (s *state4) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/verifreg/v5.go b/pkg/types/specactors/builtin/verifreg/v5.go index 98a7de408c..870dd17a3d 100644 --- a/pkg/types/specactors/builtin/verifreg/v5.go +++ b/pkg/types/specactors/builtin/verifreg/v5.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + package verifreg import ( @@ -5,7 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" @@ -26,14 +28,14 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state5{store: store} - - s, err := verifreg5.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - + + s, err := verifreg5.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -47,19 +49,19 @@ func (s *state5) RootKey() (address.Address, error) { } func (s *state5) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, specactors.Version5, s.verifiedClients, addr) + return getDataCap(s.store, actors.Version5, s.verifiedClients, addr) } func (s *state5) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, specactors.Version5, s.verifiers, addr) + return getDataCap(s.store, actors.Version5, s.verifiers, addr) } func (s *state5) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, specactors.Version5, s.verifiers, cb) + return forEachCap(s.store, actors.Version5, s.verifiers, cb) } func (s *state5) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, specactors.Version5, s.verifiedClients, cb) + return forEachCap(s.store, actors.Version5, s.verifiedClients, cb) } func (s *state5) verifiedClients() (adt.Map, error) { @@ -72,4 +74,4 @@ func (s *state5) verifiers() (adt.Map, error) { func (s *state5) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/verifreg/v6.go b/pkg/types/specactors/builtin/verifreg/v6.go index 5776f1479c..917b6eed3c 100644 --- a/pkg/types/specactors/builtin/verifreg/v6.go +++ b/pkg/types/specactors/builtin/verifreg/v6.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + package verifreg import ( @@ -5,7 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - "github.com/filecoin-project/venus/pkg/types/specactors" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" @@ -26,14 +28,14 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state6{store: store} - - s, err := verifreg6.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - + + s, err := verifreg6.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -47,19 +49,19 @@ func (s *state6) RootKey() (address.Address, error) { } func (s *state6) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, specactors.Version6, s.verifiedClients, addr) + return getDataCap(s.store, actors.Version6, s.verifiedClients, addr) } func (s *state6) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, specactors.Version6, s.verifiers, addr) + return getDataCap(s.store, actors.Version6, s.verifiers, addr) } func (s *state6) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, specactors.Version6, s.verifiers, cb) + return forEachCap(s.store, actors.Version6, s.verifiers, cb) } func (s *state6) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, specactors.Version6, s.verifiedClients, cb) + return forEachCap(s.store, actors.Version6, s.verifiedClients, cb) } func (s *state6) verifiedClients() (adt.Map, error) { @@ -72,4 +74,4 @@ func (s *state6) verifiers() (adt.Map, error) { func (s *state6) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/verifreg/v7.go b/pkg/types/specactors/builtin/verifreg/v7.go new file mode 100644 index 0000000000..88f284f28f --- /dev/null +++ b/pkg/types/specactors/builtin/verifreg/v7.go @@ -0,0 +1,77 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + +package verifreg + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + actors "github.com/filecoin-project/venus/pkg/types/specactors" + "github.com/filecoin-project/venus/pkg/types/specactors/adt" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, rootKeyAddress address.Address) (State, error) { + out := state7{store: store} + + s, err := verifreg7.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state7 struct { + verifreg7.State + store adt.Store +} + +func (s *state7) RootKey() (address.Address, error) { + return s.State.RootKey, nil +} + +func (s *state7) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version7, s.verifiedClients, addr) +} + +func (s *state7) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version7, s.verifiers, addr) +} + +func (s *state7) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version7, s.verifiers, cb) +} + +func (s *state7) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version7, s.verifiedClients, cb) +} + +func (s *state7) verifiedClients() (adt.Map, error) { + return adt7.AsMap(s.store, s.VerifiedClients, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) verifiers() (adt.Map, error) { + return adt7.AsMap(s.store, s.Verifiers, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) GetState() interface{} { + return &s.State +} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/verifreg/verifreg.go b/pkg/types/specactors/builtin/verifreg/verifreg.go index cc3f6c0246..35de089433 100644 --- a/pkg/types/specactors/builtin/verifreg/verifreg.go +++ b/pkg/types/specactors/builtin/verifreg/verifreg.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: builtin/verifreg/actor.go.template + package verifreg import ( @@ -21,10 +23,13 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" + actors "github.com/filecoin-project/venus/pkg/types/specactors" + types "github.com/filecoin-project/venus/pkg/types/internal" ) func init() { @@ -53,14 +58,18 @@ func init() { return load6(store, root) }) + builtin.RegisterActorState(builtin7.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } var ( - Address = builtin6.VerifiedRegistryActorAddr - Methods = builtin6.MethodsVerifiedRegistry + Address = builtin7.VerifiedRegistryActorAddr + Methods = builtin7.MethodsVerifiedRegistry ) -func Load(store adt.Store, act *internal.Actor) (State, error) { +func Load(store adt.Store, act *types.Actor) (State, error) { switch act.Code { case builtin0.VerifiedRegistryActorCodeID: @@ -81,61 +90,71 @@ func Load(store adt.Store, act *internal.Actor) (State, error) { case builtin6.VerifiedRegistryActorCodeID: return load6(store, act.Head) + case builtin7.VerifiedRegistryActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } -func MakeState(store adt.Store, av specactors.Version, rootKeyAddress address.Address) (State, error) { +func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Address) (State, error) { switch av { - case specactors.Version0: + case actors.Version0: return make0(store, rootKeyAddress) - case specactors.Version2: + case actors.Version2: return make2(store, rootKeyAddress) - case specactors.Version3: + case actors.Version3: return make3(store, rootKeyAddress) - case specactors.Version4: + case actors.Version4: return make4(store, rootKeyAddress) - case specactors.Version5: + case actors.Version5: return make5(store, rootKeyAddress) - case specactors.Version6: + case actors.Version6: return make6(store, rootKeyAddress) - } + case actors.Version7: + return make7(store, rootKeyAddress) + +} return nil, xerrors.Errorf("unknown actor version %d", av) } -func GetActorCodeID(av specactors.Version) (cid.Cid, error) { +func GetActorCodeID(av actors.Version) (cid.Cid, error) { switch av { - case specactors.Version0: + case actors.Version0: return builtin0.VerifiedRegistryActorCodeID, nil - case specactors.Version2: + case actors.Version2: return builtin2.VerifiedRegistryActorCodeID, nil - case specactors.Version3: + case actors.Version3: return builtin3.VerifiedRegistryActorCodeID, nil - case specactors.Version4: + case actors.Version4: return builtin4.VerifiedRegistryActorCodeID, nil - case specactors.Version5: + case actors.Version5: return builtin5.VerifiedRegistryActorCodeID, nil - case specactors.Version6: + case actors.Version6: return builtin6.VerifiedRegistryActorCodeID, nil + case actors.Version7: + return builtin7.VerifiedRegistryActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) } + type State interface { cbor.Marshaler diff --git a/pkg/types/specactors/params.go b/pkg/types/specactors/params.go index c8c240c070..f933ce33de 100644 --- a/pkg/types/specactors/params.go +++ b/pkg/types/specactors/params.go @@ -2,17 +2,18 @@ package specactors import ( "bytes" - aerrors2 "github.com/filecoin-project/venus/pkg/types/specactors/aerrors" "github.com/filecoin-project/go-state-types/exitcode" cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/pkg/types/specactors/aerrors" ) -func SerializeParams(i cbg.CBORMarshaler) ([]byte, aerrors2.ActorError) { +func SerializeParams(i cbg.CBORMarshaler) ([]byte, aerrors.ActorError) { buf := new(bytes.Buffer) if err := i.MarshalCBOR(buf); err != nil { // TODO: shouldnt this be a fatal error? - return nil, aerrors2.Absorb(err, exitcode.ErrSerialization, "failed to encode parameter") + return nil, aerrors.Absorb(err, exitcode.ErrSerialization, "failed to encode parameter") } return buf.Bytes(), nil } diff --git a/pkg/types/specactors/policy/policy.go b/pkg/types/specactors/policy/policy.go index 704bc0f830..d31129725a 100644 --- a/pkg/types/specactors/policy/policy.go +++ b/pkg/types/specactors/policy/policy.go @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: policy/policy.go.template + package policy import ( @@ -10,67 +12,98 @@ import ( "github.com/filecoin-project/go-state-types/network" actors "github.com/filecoin-project/venus/pkg/types/specactors" + + market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" - power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" verifreg3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/verifreg" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" verifreg5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/verifreg" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" - - paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych" + + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" + verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" + + + + paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" ) const ( - ChainFinality = miner6.ChainFinality + ChainFinality = miner7.ChainFinality SealRandomnessLookback = ChainFinality - PaychSettleDelay = paych6.SettleDelay - MaxPreCommitRandomnessLookback = builtin6.EpochsInDay + SealRandomnessLookback + PaychSettleDelay = paych7.SettleDelay + MaxPreCommitRandomnessLookback = builtin7.EpochsInDay + SealRandomnessLookback ) // SetSupportedProofTypes sets supported proof types, across all actor versions. // This should only be used for testing. func SetSupportedProofTypes(types ...abi.RegisteredSealProof) { - - miner0.SupportedProofTypes = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner2.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner2.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) - miner2.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner3.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner3.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) - miner3.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner4.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner4.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) - miner4.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner5.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner6.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + + miner0.SupportedProofTypes = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + + + miner2.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner2.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) + miner2.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + + + miner3.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner3.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) + miner3.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + + + miner4.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner4.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) + miner4.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + + + miner5.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + + + miner6.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + + + miner7.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + AddSupportedProofTypes(types...) } @@ -84,41 +117,65 @@ func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { } // Set for all miner versions. - miner0.SupportedProofTypes[t] = struct{}{} - - miner2.PreCommitSealProofTypesV0[t] = struct{}{} - miner2.PreCommitSealProofTypesV7[t] = struct{}{} - miner2.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner2.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - - miner3.PreCommitSealProofTypesV0[t] = struct{}{} - miner3.PreCommitSealProofTypesV7[t] = struct{}{} - miner3.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner3.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - - miner4.PreCommitSealProofTypesV0[t] = struct{}{} - miner4.PreCommitSealProofTypesV7[t] = struct{}{} - miner4.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner4.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - - miner5.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err := t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } - - miner5.WindowPoStProofTypes[wpp] = struct{}{} - - miner6.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err = t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } - - miner6.WindowPoStProofTypes[wpp] = struct{}{} - + + + miner0.SupportedProofTypes[t] = struct{}{} + + + + miner2.PreCommitSealProofTypesV0[t] = struct{}{} + miner2.PreCommitSealProofTypesV7[t] = struct{}{} + miner2.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner2.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + + + + miner3.PreCommitSealProofTypesV0[t] = struct{}{} + miner3.PreCommitSealProofTypesV7[t] = struct{}{} + miner3.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner3.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + + + + miner4.PreCommitSealProofTypesV0[t] = struct{}{} + miner4.PreCommitSealProofTypesV7[t] = struct{}{} + miner4.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner4.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + + + + miner5.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err := t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner5.WindowPoStProofTypes[wpp] = struct{}{} + + + + miner6.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err = t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner6.WindowPoStProofTypes[wpp] = struct{}{} + + + + miner7.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err = t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner7.WindowPoStProofTypes[wpp] = struct{}{} + + } } @@ -126,100 +183,133 @@ func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { // actors versions. Use for testing. func SetPreCommitChallengeDelay(delay abi.ChainEpoch) { // Set for all miner versions. - - miner0.PreCommitChallengeDelay = delay - - miner2.PreCommitChallengeDelay = delay - - miner3.PreCommitChallengeDelay = delay - - miner4.PreCommitChallengeDelay = delay - - miner5.PreCommitChallengeDelay = delay - - miner6.PreCommitChallengeDelay = delay - + + miner0.PreCommitChallengeDelay = delay + + miner2.PreCommitChallengeDelay = delay + + miner3.PreCommitChallengeDelay = delay + + miner4.PreCommitChallengeDelay = delay + + miner5.PreCommitChallengeDelay = delay + + miner6.PreCommitChallengeDelay = delay + + miner7.PreCommitChallengeDelay = delay + } // TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. func GetPreCommitChallengeDelay() abi.ChainEpoch { - return miner6.PreCommitChallengeDelay + return miner7.PreCommitChallengeDelay } // SetConsensusMinerMinPower sets the minimum power of an individual miner must // meet for leader election, across all actor versions. This should only be used // for testing. func SetConsensusMinerMinPower(p abi.StoragePower) { - - power0.ConsensusMinerMinPower = p - - for _, policy := range builtin2.SealProofPolicies { - policy.ConsensusMinerMinPower = p - } - - for _, policy := range builtin3.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - for _, policy := range builtin4.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - for _, policy := range builtin5.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - for _, policy := range builtin6.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - + + + power0.ConsensusMinerMinPower = p + + + + for _, policy := range builtin2.SealProofPolicies { + policy.ConsensusMinerMinPower = p + } + + + + for _, policy := range builtin3.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + + + for _, policy := range builtin4.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + + + for _, policy := range builtin5.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + + + for _, policy := range builtin6.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + + + for _, policy := range builtin7.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + } // SetMinVerifiedDealSize sets the minimum size of a verified deal. This should // only be used for testing. func SetMinVerifiedDealSize(size abi.StoragePower) { - - verifreg0.MinVerifiedDealSize = size - - verifreg2.MinVerifiedDealSize = size - - verifreg3.MinVerifiedDealSize = size - - verifreg4.MinVerifiedDealSize = size - - verifreg5.MinVerifiedDealSize = size - - verifreg6.MinVerifiedDealSize = size - + + verifreg0.MinVerifiedDealSize = size + + verifreg2.MinVerifiedDealSize = size + + verifreg3.MinVerifiedDealSize = size + + verifreg4.MinVerifiedDealSize = size + + verifreg5.MinVerifiedDealSize = size + + verifreg6.MinVerifiedDealSize = size + + verifreg7.MinVerifiedDealSize = size + } func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { switch ver { - - case actors.Version0: - - return miner0.MaxSealDuration[t], nil - - case actors.Version2: - - return miner2.MaxProveCommitDuration[t], nil - - case actors.Version3: - - return miner3.MaxProveCommitDuration[t], nil - - case actors.Version4: - - return miner4.MaxProveCommitDuration[t], nil - - case actors.Version5: - - return miner5.MaxProveCommitDuration[t], nil - - case actors.Version6: - - return miner6.MaxProveCommitDuration[t], nil - + + case actors.Version0: + + return miner0.MaxSealDuration[t], nil + + + case actors.Version2: + + return miner2.MaxProveCommitDuration[t], nil + + + case actors.Version3: + + return miner3.MaxProveCommitDuration[t], nil + + + case actors.Version4: + + return miner4.MaxProveCommitDuration[t], nil + + + case actors.Version5: + + return miner5.MaxProveCommitDuration[t], nil + + + case actors.Version6: + + return miner6.MaxProveCommitDuration[t], nil + + + case actors.Version7: + + return miner7.MaxProveCommitDuration[t], nil + + default: return 0, xerrors.Errorf("unsupported actors version") } @@ -230,30 +320,49 @@ func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (a // only be used for testing. func SetProviderCollateralSupplyTarget(num, denom big.Int) { + + + market2.ProviderCollateralSupplyTarget = builtin2.BigFrac{ Numerator: num, Denominator: denom, } + + market3.ProviderCollateralSupplyTarget = builtin3.BigFrac{ Numerator: num, Denominator: denom, } + + market4.ProviderCollateralSupplyTarget = builtin4.BigFrac{ Numerator: num, Denominator: denom, } + + market5.ProviderCollateralSupplyTarget = builtin5.BigFrac{ Numerator: num, Denominator: denom, } + + market6.ProviderCollateralSupplyTarget = builtin6.BigFrac{ Numerator: num, Denominator: denom, } + + + + market7.ProviderCollateralSupplyTarget = builtin7.BigFrac{ + Numerator: num, + Denominator: denom, + } + } @@ -267,84 +376,110 @@ func DealProviderCollateralBounds( return big.Zero(), big.Zero(), err } switch v { - - case actors.Version0: - - min, max := market0.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil, nwVer) - return min, max, nil - - case actors.Version2: - - min, max := market2.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - case actors.Version3: - - min, max := market3.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - case actors.Version4: - - min, max := market4.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - case actors.Version5: - - min, max := market5.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - case actors.Version6: - - min, max := market6.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - + + case actors.Version0: + + min, max := market0.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil, nwVer) + return min, max, nil + + + case actors.Version2: + + min, max := market2.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + + case actors.Version3: + + min, max := market3.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + + case actors.Version4: + + min, max := market4.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + + case actors.Version5: + + min, max := market5.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + + case actors.Version6: + + min, max := market6.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + + case actors.Version7: + + min, max := market7.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + default: return big.Zero(), big.Zero(), xerrors.Errorf("unsupported actors version") } } func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) { - return market6.DealDurationBounds(pieceSize) + return market7.DealDurationBounds(pieceSize) } // Sets the challenge window and scales the proving period to match (such that // there are always 48 challenge windows in a proving period). func SetWPoStChallengeWindow(period abi.ChainEpoch) { - - miner0.WPoStChallengeWindow = period - miner0.WPoStProvingPeriod = period * abi.ChainEpoch(miner0.WPoStPeriodDeadlines) - - miner2.WPoStChallengeWindow = period - miner2.WPoStProvingPeriod = period * abi.ChainEpoch(miner2.WPoStPeriodDeadlines) - - miner3.WPoStChallengeWindow = period - miner3.WPoStProvingPeriod = period * abi.ChainEpoch(miner3.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner3.WPoStDisputeWindow = period * 30 - - miner4.WPoStChallengeWindow = period - miner4.WPoStProvingPeriod = period * abi.ChainEpoch(miner4.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner4.WPoStDisputeWindow = period * 30 - - miner5.WPoStChallengeWindow = period - miner5.WPoStProvingPeriod = period * abi.ChainEpoch(miner5.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner5.WPoStDisputeWindow = period * 30 - - miner6.WPoStChallengeWindow = period - miner6.WPoStProvingPeriod = period * abi.ChainEpoch(miner6.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner6.WPoStDisputeWindow = period * 30 - + + miner0.WPoStChallengeWindow = period + miner0.WPoStProvingPeriod = period * abi.ChainEpoch(miner0.WPoStPeriodDeadlines) + + + miner2.WPoStChallengeWindow = period + miner2.WPoStProvingPeriod = period * abi.ChainEpoch(miner2.WPoStPeriodDeadlines) + + + miner3.WPoStChallengeWindow = period + miner3.WPoStProvingPeriod = period * abi.ChainEpoch(miner3.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner3.WPoStDisputeWindow = period * 30 + + + miner4.WPoStChallengeWindow = period + miner4.WPoStProvingPeriod = period * abi.ChainEpoch(miner4.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner4.WPoStDisputeWindow = period * 30 + + + miner5.WPoStChallengeWindow = period + miner5.WPoStProvingPeriod = period * abi.ChainEpoch(miner5.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner5.WPoStDisputeWindow = period * 30 + + + miner6.WPoStChallengeWindow = period + miner6.WPoStProvingPeriod = period * abi.ChainEpoch(miner6.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner6.WPoStDisputeWindow = period * 30 + + + miner7.WPoStChallengeWindow = period + miner7.WPoStProvingPeriod = period * abi.ChainEpoch(miner7.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner7.WPoStDisputeWindow = period * 30 + + } func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { @@ -357,15 +492,15 @@ func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { } func GetMaxSectorExpirationExtension() abi.ChainEpoch { - return miner6.MaxSectorExpirationExtension + return miner7.MaxSectorExpirationExtension } func GetMinSectorExpiration() abi.ChainEpoch { - return miner6.MinSectorExpiration + return miner7.MinSectorExpiration } func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, error) { - sectorsPerPart, err := builtin6.PoStProofWindowPoStPartitionSectors(p) + sectorsPerPart, err := builtin7.PoStProofWindowPoStPartitionSectors(p) if err != nil { return 0, err } @@ -378,8 +513,8 @@ func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, e func GetDefaultSectorSize() abi.SectorSize { // supported sector sizes are the same across versions. - szs := make([]abi.SectorSize, 0, len(miner6.PreCommitSealProofTypesV8)) - for spt := range miner6.PreCommitSealProofTypesV8 { + szs := make([]abi.SectorSize, 0, len(miner7.PreCommitSealProofTypesV8)) + for spt := range miner7.PreCommitSealProofTypesV8 { ss, err := spt.SectorSize() if err != nil { panic(err) @@ -404,7 +539,7 @@ func GetSectorMaxLifetime(proof abi.RegisteredSealProof, nwVer network.Version) return builtin4.SealProofPoliciesV0[proof].SectorMaxLifetime } - return builtin6.SealProofPoliciesV11[proof].SectorMaxLifetime + return builtin7.SealProofPoliciesV11[proof].SectorMaxLifetime } func GetAddressedSectorsMax(nwVer network.Version) (int, error) { @@ -413,25 +548,28 @@ func GetAddressedSectorsMax(nwVer network.Version) (int, error) { return 0, err } switch v { - - case actors.Version0: - return miner0.AddressedSectorsMax, nil - - case actors.Version2: - return miner2.AddressedSectorsMax, nil - - case actors.Version3: - return miner3.AddressedSectorsMax, nil - - case actors.Version4: - return miner4.AddressedSectorsMax, nil - - case actors.Version5: - return miner5.AddressedSectorsMax, nil - - case actors.Version6: - return miner6.AddressedSectorsMax, nil - + + case actors.Version0: + return miner0.AddressedSectorsMax, nil + + case actors.Version2: + return miner2.AddressedSectorsMax, nil + + case actors.Version3: + return miner3.AddressedSectorsMax, nil + + case actors.Version4: + return miner4.AddressedSectorsMax, nil + + case actors.Version5: + return miner5.AddressedSectorsMax, nil + + case actors.Version6: + return miner6.AddressedSectorsMax, nil + + case actors.Version7: + return miner7.AddressedSectorsMax, nil + default: return 0, xerrors.Errorf("unsupported network version") } @@ -443,104 +581,137 @@ func GetDeclarationsMax(nwVer network.Version) (int, error) { return 0, err } switch v { - - case actors.Version0: - - // TODO: Should we instead error here since the concept doesn't exist yet? - return miner0.AddressedPartitionsMax, nil - - case actors.Version2: - - return miner2.DeclarationsMax, nil - - case actors.Version3: - - return miner3.DeclarationsMax, nil - - case actors.Version4: - - return miner4.DeclarationsMax, nil - - case actors.Version5: - - return miner5.DeclarationsMax, nil - - case actors.Version6: - - return miner6.DeclarationsMax, nil - + + case actors.Version0: + + // TODO: Should we instead error here since the concept doesn't exist yet? + return miner0.AddressedPartitionsMax, nil + + + case actors.Version2: + + return miner2.DeclarationsMax, nil + + + case actors.Version3: + + return miner3.DeclarationsMax, nil + + + case actors.Version4: + + return miner4.DeclarationsMax, nil + + + case actors.Version5: + + return miner5.DeclarationsMax, nil + + + case actors.Version6: + + return miner6.DeclarationsMax, nil + + + case actors.Version7: + + return miner7.DeclarationsMax, nil + + default: return 0, xerrors.Errorf("unsupported network version") } } func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actors.VersionForNetwork(nwVer) if err != nil { return big.Zero(), err } switch v { - - case actors.Version0: - - return big.Zero(), nil - - case actors.Version2: - - return big.Zero(), nil - - case actors.Version3: - - return big.Zero(), nil - - case actors.Version4: - - return big.Zero(), nil - - case actors.Version5: - - return miner5.AggregateNetworkFee(aggregateSize, baseFee), nil - - case actors.Version6: - - return miner6.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil - + + case actors.Version0: + + return big.Zero(), nil + + + case actors.Version2: + + return big.Zero(), nil + + + case actors.Version3: + + return big.Zero(), nil + + + case actors.Version4: + + return big.Zero(), nil + + + case actors.Version5: + + return miner5.AggregateNetworkFee(aggregateSize, baseFee), nil + + + case actors.Version6: + + return miner6.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + + + case actors.Version7: + + return miner7.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + + default: return big.Zero(), xerrors.Errorf("unsupported network version") } } func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actors.VersionForNetwork(nwVer) if err != nil { return big.Zero(), err } switch v { - - case actors.Version0: - - return big.Zero(), nil - - case actors.Version2: - - return big.Zero(), nil - - case actors.Version3: - - return big.Zero(), nil - - case actors.Version4: - - return big.Zero(), nil - - case actors.Version5: - - return big.Zero(), nil - - case actors.Version6: - - return miner6.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil - + + case actors.Version0: + + return big.Zero(), nil + + + case actors.Version2: + + return big.Zero(), nil + + + case actors.Version3: + + return big.Zero(), nil + + + case actors.Version4: + + return big.Zero(), nil + + + case actors.Version5: + + return big.Zero(), nil + + + case actors.Version6: + + return miner6.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + + + case actors.Version7: + + return miner7.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + + default: return big.Zero(), xerrors.Errorf("unsupported network version") } diff --git a/pkg/types/specactors/policy/policy.go.template b/pkg/types/specactors/policy/policy.go.template index 22187813bb..1654671e61 100644 --- a/pkg/types/specactors/policy/policy.go.template +++ b/pkg/types/specactors/policy/policy.go.template @@ -1,3 +1,5 @@ +// FETCHED FROM LOTUS: policy/policy.go.template + package policy import ( @@ -21,7 +23,6 @@ import ( paych{{.latestVersion}} "github.com/filecoin-project/specs-actors{{import .latestVersion}}actors/builtin/paych" ) - const ( ChainFinality = miner{{.latestVersion}}.ChainFinality SealRandomnessLookback = ChainFinality diff --git a/pkg/types/specactors/policy/policy_test.go b/pkg/types/specactors/policy/policy_test.go index 03dcf784b0..fd644f1e07 100644 --- a/pkg/types/specactors/policy/policy_test.go +++ b/pkg/types/specactors/policy/policy_test.go @@ -3,6 +3,8 @@ package policy import ( "testing" + "github.com/stretchr/testify/require" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -13,7 +15,6 @@ import ( miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" paych2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/paych" verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" - "github.com/stretchr/testify/require" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" ) @@ -75,6 +76,7 @@ func TestPartitionSizes(t *testing.T) { } func TestPoStSize(t *testing.T) { + tf.UnitTest(t) v12PoStSize, err := GetMaxPoStPartitions(network.Version12, abi.RegisteredPoStProof_StackedDrgWindow64GiBV1) require.Equal(t, 4, v12PoStSize) require.NoError(t, err) diff --git a/pkg/types/specactors/version.go b/pkg/types/specactors/version.go index 60e7b3ba5d..3db0af5841 100644 --- a/pkg/types/specactors/version.go +++ b/pkg/types/specactors/version.go @@ -8,9 +8,21 @@ import ( type Version int -var LatestVersion = 6 +/* inline-gen template -var Versions = []int{0, 2, 3, 4, 5, LatestVersion} +var LatestVersion = {{.latestActorsVersion}} + +var Versions = []int{ {{range .actorVersions}} {{.}}, {{end}} } + +const ({{range .actorVersions}} + Version{{.}} Version = {{.}}{{end}} +) + +/* inline-gen start */ + +var LatestVersion = 7 + +var Versions = []int{0, 2, 3, 4, 5, 6, 7} const ( Version0 Version = 0 @@ -19,8 +31,11 @@ const ( Version4 Version = 4 Version5 Version = 5 Version6 Version = 6 + Version7 Version = 7 ) +/* inline-gen end */ + // Converts a network version into an actors adt version. func VersionForNetwork(version network.Version) (Version, error) { switch version { @@ -36,6 +51,8 @@ func VersionForNetwork(version network.Version) (Version, error) { return Version5, nil case network.Version14: return Version6, nil + case network.Version15: + return Version7, nil default: return -1, fmt.Errorf("unsupported network version %d", version) } From 178a210c52f24c8b64eca523758637310b469cf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E9=A1=B5=E7=B4=A0=E4=B9=A6?= <2931107265@qq.com> Date: Tue, 7 Dec 2021 10:47:48 +0800 Subject: [PATCH 086/167] specactors: Add code not generated by the template --- pkg/types/specactors/builtin/builtin.go | 29 ++++++ pkg/types/specactors/builtin/miner/util.go | 88 +++++++++++++++++++ pkg/types/specactors/builtin/verifreg/util.go | 54 ++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 pkg/types/specactors/builtin/miner/util.go create mode 100644 pkg/types/specactors/builtin/verifreg/util.go diff --git a/pkg/types/specactors/builtin/builtin.go b/pkg/types/specactors/builtin/builtin.go index 01855056e0..91f888de05 100644 --- a/pkg/types/specactors/builtin/builtin.go +++ b/pkg/types/specactors/builtin/builtin.go @@ -326,6 +326,35 @@ func IsPaymentChannelActor(c cid.Cid) bool { return false } +func IsInitActor(c cid.Cid) bool { + + if c == builtin0.InitActorCodeID { + return true + } + + if c == builtin2.InitActorCodeID { + return true + } + + if c == builtin3.InitActorCodeID { + return true + } + + if c == builtin4.InitActorCodeID { + return true + } + + if c == builtin5.InitActorCodeID { + return true + } + + if c == builtin6.InitActorCodeID { + return true + } + + return false +} + func makeAddress(addr string) address.Address { ret, err := address.NewFromString(addr) if err != nil { diff --git a/pkg/types/specactors/builtin/miner/util.go b/pkg/types/specactors/builtin/miner/util.go new file mode 100644 index 0000000000..5fafc31ef7 --- /dev/null +++ b/pkg/types/specactors/builtin/miner/util.go @@ -0,0 +1,88 @@ +package miner + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" +) + +func AllPartSectors(mas State, sget func(Partition) (bitfield.BitField, error)) (bitfield.BitField, error) { + var parts []bitfield.BitField + + err := mas.ForEachDeadline(func(dlidx uint64, dl Deadline) error { + return dl.ForEachPartition(func(partidx uint64, part Partition) error { + s, err := sget(part) + if err != nil { + return xerrors.Errorf("getting sector list (dl: %d, part %d): %w", dlidx, partidx, err) + } + + parts = append(parts, s) + return nil + }) + }) + if err != nil { + return bitfield.BitField{}, err + } + + return bitfield.MultiMerge(parts...) +} + +// SealProofTypeFromSectorSize returns preferred seal proof type for creating +// new miner actors and new sectors +func SealProofTypeFromSectorSize(ssize abi.SectorSize, nv network.Version) (abi.RegisteredSealProof, error) { + switch { + case nv < network.Version7: + switch ssize { + case 2 << 10: + return abi.RegisteredSealProof_StackedDrg2KiBV1, nil + case 8 << 20: + return abi.RegisteredSealProof_StackedDrg8MiBV1, nil + case 512 << 20: + return abi.RegisteredSealProof_StackedDrg512MiBV1, nil + case 32 << 30: + return abi.RegisteredSealProof_StackedDrg32GiBV1, nil + case 64 << 30: + return abi.RegisteredSealProof_StackedDrg64GiBV1, nil + default: + return 0, xerrors.Errorf("unsupported sector size for miner: %v", ssize) + } + case nv >= network.Version7: + switch ssize { + case 2 << 10: + return abi.RegisteredSealProof_StackedDrg2KiBV1_1, nil + case 8 << 20: + return abi.RegisteredSealProof_StackedDrg8MiBV1_1, nil + case 512 << 20: + return abi.RegisteredSealProof_StackedDrg512MiBV1_1, nil + case 32 << 30: + return abi.RegisteredSealProof_StackedDrg32GiBV1_1, nil + case 64 << 30: + return abi.RegisteredSealProof_StackedDrg64GiBV1_1, nil + default: + return 0, xerrors.Errorf("unsupported sector size for miner: %v", ssize) + } + } + + return 0, xerrors.Errorf("unsupported network version") +} + +// WindowPoStProofTypeFromSectorSize returns preferred post proof type for creating +// new miner actors and new sectors +func WindowPoStProofTypeFromSectorSize(ssize abi.SectorSize) (abi.RegisteredPoStProof, error) { + switch ssize { + case 2 << 10: + return abi.RegisteredPoStProof_StackedDrgWindow2KiBV1, nil + case 8 << 20: + return abi.RegisteredPoStProof_StackedDrgWindow8MiBV1, nil + case 512 << 20: + return abi.RegisteredPoStProof_StackedDrgWindow512MiBV1, nil + case 32 << 30: + return abi.RegisteredPoStProof_StackedDrgWindow32GiBV1, nil + case 64 << 30: + return abi.RegisteredPoStProof_StackedDrgWindow64GiBV1, nil + default: + return 0, xerrors.Errorf("unsupported sector size for miner: %v", ssize) + } +} diff --git a/pkg/types/specactors/builtin/verifreg/util.go b/pkg/types/specactors/builtin/verifreg/util.go new file mode 100644 index 0000000000..6cd78fac24 --- /dev/null +++ b/pkg/types/specactors/builtin/verifreg/util.go @@ -0,0 +1,54 @@ +package verifreg + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + + actors "github.com/filecoin-project/venus/pkg/types/specactors" + "github.com/filecoin-project/venus/pkg/types/specactors/adt" +) + +// taking this as a function instead of asking the caller to call it helps reduce some of the error +// checking boilerplate. +// +// "go made me do it" +type rootFunc func() (adt.Map, error) + +// Assumes that the bitwidth for v3 HAMTs is the DefaultHamtBitwidth +func getDataCap(store adt.Store, ver actors.Version, root rootFunc, addr address.Address) (bool, abi.StoragePower, error) { + if addr.Protocol() != address.ID { + return false, big.Zero(), xerrors.Errorf("can only look up ID addresses") + } + vh, err := root() + if err != nil { + return false, big.Zero(), xerrors.Errorf("loading verifreg: %w", err) + } + + var dcap abi.StoragePower + if found, err := vh.Get(abi.AddrKey(addr), &dcap); err != nil { + return false, big.Zero(), xerrors.Errorf("looking up addr: %w", err) + } else if !found { + return false, big.Zero(), nil + } + + return true, dcap, nil +} + +// Assumes that the bitwidth for v3 HAMTs is the DefaultHamtBitwidth +func forEachCap(store adt.Store, ver actors.Version, root rootFunc, cb func(addr address.Address, dcap abi.StoragePower) error) error { + vh, err := root() + if err != nil { + return xerrors.Errorf("loading verified clients: %w", err) + } + var dcap abi.StoragePower + return vh.ForEach(&dcap, func(key string) error { + a, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(a, dcap) + }) +} From d9470b24528c616b6947564963958d7815c60b46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E9=A1=B5=E7=B4=A0=E4=B9=A6?= <2931107265@qq.com> Date: Tue, 7 Dec 2021 14:09:55 +0800 Subject: [PATCH 087/167] upgrade vm @ network params for actor v7 --- fixtures/networks/calibration.go | 1 + fixtures/networks/forcenet.go | 1 + fixtures/networks/integrationtestnet.go | 2 + fixtures/networks/interopnet.go | 1 + fixtures/networks/mainnet.go | 1 + fixtures/networks/net_2k.go | 1 + pkg/config/config.go | 2 + pkg/consensus/proof_verifier.go | 14 ++- pkg/consensus/proof_verifier_mock.go | 6 ++ pkg/consensusfault/check.go | 32 +++---- pkg/constants/shared_vals.go | 2 +- pkg/fork/fork.go | 111 ++++++++++++++++++++++- pkg/state/tree/state.go | 2 +- pkg/util/ffiwrapper/impl/testing.go | 9 +- pkg/util/ffiwrapper/impl/verifier_cgo.go | 5 + pkg/util/ffiwrapper/verifier.go | 4 + pkg/vm/gas/gascost.go | 9 +- pkg/vm/gas/pricelistV0.go | 15 ++- pkg/vm/register/default.go | 2 + pkg/vmsupport/syscalls.go | 37 ++++++-- 20 files changed, 211 insertions(+), 46 deletions(-) diff --git a/fixtures/networks/calibration.go b/fixtures/networks/calibration.go index 775f3abd2e..261d6f3b95 100644 --- a/fixtures/networks/calibration.go +++ b/fixtures/networks/calibration.go @@ -56,6 +56,7 @@ func Calibration() *NetworkConf { BreezeGasTampingDuration: 120, UpgradeClausHeight: 270, UpgradeChocolateHeight: 312746, + UpgradeSnapDealsHeight: 99999999, }, DrandSchedule: map[abi.ChainEpoch]config.DrandEnum{0: 1}, AddressNetwork: address.Testnet, diff --git a/fixtures/networks/forcenet.go b/fixtures/networks/forcenet.go index f0233f0933..5a189f18b2 100644 --- a/fixtures/networks/forcenet.go +++ b/fixtures/networks/forcenet.go @@ -51,6 +51,7 @@ func ForceNet() *NetworkConf { UpgradeTurboHeight: -15, UpgradeHyperdriveHeight: -16, UpgradeChocolateHeight: -17, + UpgradeSnapDealsHeight: -18, }, DrandSchedule: map[abi.ChainEpoch]config.DrandEnum{0: config.DrandMainnet}, AddressNetwork: address.Testnet, diff --git a/fixtures/networks/integrationtestnet.go b/fixtures/networks/integrationtestnet.go index e401020cca..8e5deef78c 100644 --- a/fixtures/networks/integrationtestnet.go +++ b/fixtures/networks/integrationtestnet.go @@ -37,6 +37,8 @@ func IntegrationNet() *NetworkConf { UpgradeTurboHeight: 712320, UpgradeHyperdriveHeight: 892800, UpgradeChocolateHeight: 1231620, + UpgradeSnapDealsHeight: 999999999999, + BreezeGasTampingDuration: 120, UpgradeClausHeight: 343200, diff --git a/fixtures/networks/interopnet.go b/fixtures/networks/interopnet.go index 4600c2579e..37f4fbd9ce 100644 --- a/fixtures/networks/interopnet.go +++ b/fixtures/networks/interopnet.go @@ -48,6 +48,7 @@ func InteropNet() *NetworkConf { UpgradeTurboHeight: -15, UpgradeHyperdriveHeight: -16, UpgradeChocolateHeight: -17, + UpgradeSnapDealsHeight: -18, BreezeGasTampingDuration: 0, UpgradeClausHeight: -11, diff --git a/fixtures/networks/mainnet.go b/fixtures/networks/mainnet.go index 3d6e646218..f5c972d137 100644 --- a/fixtures/networks/mainnet.go +++ b/fixtures/networks/mainnet.go @@ -58,6 +58,7 @@ func Mainnet() *NetworkConf { UpgradeTurboHeight: 712320, // 2021-04-29T06:00:00Z UpgradeHyperdriveHeight: 892800, // 2021-06-30T22:00:00Z UpgradeChocolateHeight: 1231620, + UpgradeSnapDealsHeight: 999999999999, BreezeGasTampingDuration: 120, UpgradeClausHeight: 343200, // 2020-12-22T02:00:00Z diff --git a/fixtures/networks/net_2k.go b/fixtures/networks/net_2k.go index 628b6bc744..33e626851e 100644 --- a/fixtures/networks/net_2k.go +++ b/fixtures/networks/net_2k.go @@ -43,6 +43,7 @@ func Net2k() *NetworkConf { UpgradeTurboHeight: -15, UpgradeHyperdriveHeight: -16, UpgradeChocolateHeight: -17, + UpgradeSnapDealsHeight: -18, BreezeGasTampingDuration: 0, UpgradeClausHeight: -11, diff --git a/pkg/config/config.go b/pkg/config/config.go index 38ac57b4ae..0a51017204 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -284,6 +284,7 @@ type ForkUpgradeConfig struct { UpgradeTurboHeight abi.ChainEpoch `json:"upgradeActorsV4Height"` UpgradeHyperdriveHeight abi.ChainEpoch `json:"upgradeHyperdriveHeight"` UpgradeChocolateHeight abi.ChainEpoch `json:"upgradeChocolateHeight"` + UpgradeSnapDealsHeight abi.ChainEpoch `json:"upgradeSnapDealsHeight"` } func IsNearUpgrade(epoch, upgradeEpoch abi.ChainEpoch) bool { @@ -310,6 +311,7 @@ var DefaultForkUpgradeParam = &ForkUpgradeConfig{ UpgradeTurboHeight: 712320, UpgradeHyperdriveHeight: 892800, UpgradeChocolateHeight: 1231620, + UpgradeSnapDealsHeight: 999999999999, } func newDefaultNetworkParamsConfig() *NetworkParamsConfig { diff --git a/pkg/consensus/proof_verifier.go b/pkg/consensus/proof_verifier.go index 34a633e642..e47ef85831 100644 --- a/pkg/consensus/proof_verifier.go +++ b/pkg/consensus/proof_verifier.go @@ -2,22 +2,26 @@ package consensus import ( "context" - crypto2 "github.com/filecoin-project/venus/pkg/crypto" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" - "github.com/filecoin-project/venus/pkg/constants" + "go.opencensus.io/trace" + "golang.org/x/xerrors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" - "go.opencensus.io/trace" - "golang.org/x/xerrors" + + proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + + "github.com/filecoin-project/venus/pkg/constants" + crypto2 "github.com/filecoin-project/venus/pkg/crypto" ) // Interface to PoSt verification, modify by force EPoStVerifier -> ProofVerifier type ProofVerifier interface { VerifySeal(info proof5.SealVerifyInfo) (bool, error) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) + VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) GenerateWinningPoStSectorChallenge(ctx context.Context, proofType abi.RegisteredPoStProof, minerID abi.ActorID, randomness abi.PoStRandomness, eligibleSectorCount uint64) ([]uint64, error) diff --git a/pkg/consensus/proof_verifier_mock.go b/pkg/consensus/proof_verifier_mock.go index dfddbe7ee9..1a712d315b 100644 --- a/pkg/consensus/proof_verifier_mock.go +++ b/pkg/consensus/proof_verifier_mock.go @@ -4,7 +4,9 @@ import ( "context" "github.com/filecoin-project/go-state-types/abi" + proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/venus/pkg/util/ffiwrapper" ) @@ -21,6 +23,10 @@ func (m genFakeVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVeri panic("implement me") } +func (m genFakeVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { + panic("not supported") +} + func (m genFakeVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { panic("not supported") } diff --git a/pkg/consensusfault/check.go b/pkg/consensusfault/check.go index d59d14ec0e..7ac95b6fbf 100644 --- a/pkg/consensusfault/check.go +++ b/pkg/consensusfault/check.go @@ -5,25 +5,23 @@ import ( "context" "fmt" + cbornode "github.com/ipfs/go-ipld-cbor" + "github.com/pkg/errors" + "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" + runtime7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" + "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/fork" + "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/pkg/vm/vmcontext" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/filecoin-project/venus/venus-shared/actors/policy" types "github.com/filecoin-project/venus/venus-shared/chain" - cbornode "github.com/ipfs/go-ipld-cbor" - - "github.com/filecoin-project/venus/pkg/config" - "github.com/pkg/errors" - "golang.org/x/xerrors" - - runtime5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" - - "github.com/filecoin-project/venus/pkg/state" ) type FaultStateView interface { @@ -49,7 +47,7 @@ func NewFaultChecker(chain chainReader, fork fork.IFork) *ConsensusFaultChecker // Checks validity of the submitted consensus fault with the two block headers needed to prove the fault // and an optional extra one to check common ancestry (as needed). // Note that the blocks are ordered: the method requires a.Epoch() <= b.Epoch(). -func (s *ConsensusFaultChecker) VerifyConsensusFault(ctx context.Context, h1, h2, extra []byte, curEpoch abi.ChainEpoch, msg vm.VmMessage, gasIpld cbornode.IpldStore, view vm.SyscallsStateView, getter vmcontext.LookbackStateGetter) (*runtime5.ConsensusFault, error) { +func (s *ConsensusFaultChecker) VerifyConsensusFault(ctx context.Context, h1, h2, extra []byte, curEpoch abi.ChainEpoch, msg vm.VmMessage, gasIpld cbornode.IpldStore, view vm.SyscallsStateView, getter vmcontext.LookbackStateGetter) (*runtime7.ConsensusFault, error) { if bytes.Equal(h1, h2) { return nil, fmt.Errorf("no consensus fault: blocks identical") } @@ -86,15 +84,15 @@ func (s *ConsensusFaultChecker) VerifyConsensusFault(ctx context.Context, h1, h2 } // Check the basic fault conditions first, defer the (expensive) signature and chain history check until last. - var fault *runtime5.ConsensusFault + var fault *runtime7.ConsensusFault // Double-fork mining fault: two blocks at the same epoch. // It is not necessary to present a common ancestor of the blocks. if b1.Height == b2.Height { - fault = &runtime5.ConsensusFault{ + fault = &runtime7.ConsensusFault{ Target: b1.Miner, Epoch: b2.Height, - Type: runtime5.ConsensusFaultDoubleForkMining, + Type: runtime7.ConsensusFaultDoubleForkMining, } } // Time-offset mining fault: two blocks with the same parent but different epochs. @@ -103,10 +101,10 @@ func (s *ConsensusFaultChecker) VerifyConsensusFault(ctx context.Context, h1, h2 b1PKey := types.NewTipSetKey(b1.Parents...) b2PKey := types.NewTipSetKey(b2.Parents...) if b1PKey.Equals(b2PKey) && b1.Height != b2.Height { - fault = &runtime5.ConsensusFault{ + fault = &runtime7.ConsensusFault{ Target: b1.Miner, Epoch: b2.Height, - Type: runtime5.ConsensusFaultTimeOffsetMining, + Type: runtime7.ConsensusFaultTimeOffsetMining, } } // Parent-grinding fault: one block’s parent is a tipset that provably should have included some block but does not. @@ -120,10 +118,10 @@ func (s *ConsensusFaultChecker) VerifyConsensusFault(ctx context.Context, h1, h2 } b3PKey := types.NewTipSetKey(b3.Parents...) if b1.Height == b3.Height && b3PKey.Equals(b1PKey) && !b2PKey.Has(b1.Cid()) && b2PKey.Has(b3.Cid()) { - fault = &runtime5.ConsensusFault{ + fault = &runtime7.ConsensusFault{ Target: b1.Miner, Epoch: b2.Height, - Type: runtime5.ConsensusFaultParentGrinding, + Type: runtime7.ConsensusFaultParentGrinding, } } } diff --git a/pkg/constants/shared_vals.go b/pkg/constants/shared_vals.go index 7637f04758..f2ce993820 100644 --- a/pkg/constants/shared_vals.go +++ b/pkg/constants/shared_vals.go @@ -14,7 +14,7 @@ import ( // Consensus / Network const AllowableClockDriftSecs = uint64(1) -const NewestNetworkVersion = network.Version14 +const NewestNetworkVersion = network.Version15 // constants for Weight calculation // The ratio of weight contributed by short-term vs long-term factors in a given round diff --git a/pkg/fork/fork.go b/pkg/fork/fork.go index c45de572ef..f18d30eb48 100644 --- a/pkg/fork/fork.go +++ b/pkg/fork/fork.go @@ -17,7 +17,6 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/rt" - "github.com/filecoin-project/specs-actors/v6/actors/migration/nv14" ipfsblock "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" blockstore "github.com/ipfs/go-ipfs-blockstore" @@ -33,6 +32,8 @@ import ( "github.com/filecoin-project/specs-actors/v3/actors/migration/nv10" "github.com/filecoin-project/specs-actors/v4/actors/migration/nv12" "github.com/filecoin-project/specs-actors/v5/actors/migration/nv13" + "github.com/filecoin-project/specs-actors/v6/actors/migration/nv14" + "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" @@ -264,7 +265,24 @@ func defaultUpgradeSchedule(cf *ChainFork, upgradeHeight *config.ForkUpgradeConf StopWithin: 5, }}, Expensive: true, - }} + }, { + Height: upgradeHeight.UpgradeSnapDealsHeight, + Network: network.Version15, + Migration: cf.UpgradeActorsV7, + PreMigrations: []PreMigration{{ + PreMigration: cf.PreUpgradeActorsV7, + StartWithin: 120, + DontStartWithin: 60, + StopWithin: 35, + }, { + PreMigration: cf.PreUpgradeActorsV7, + StartWithin: 30, + DontStartWithin: 15, + StopWithin: 5, + }}, + Expensive: true, + }, + } for _, u := range updates { if u.Height < 0 { @@ -1882,6 +1900,95 @@ func (c *ChainFork) upgradeActorsV6Common( return newRoot, nil } +func (c *ChainFork) UpgradeActorsV7(ctx context.Context, cache MigrationCache, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + // Use all the CPUs except 3. + workerCount := runtime.NumCPU() - 3 + if workerCount <= 0 { + workerCount = 1 + } + + config := nv15.Config{ + MaxWorkers: uint(workerCount), + JobQueueSize: 1000, + ResultQueueSize: 100, + ProgressLogPeriod: 10 * time.Second, + } + + newRoot, err := c.upgradeActorsV7Common(ctx, cache, root, epoch, ts, config) + if err != nil { + return cid.Undef, xerrors.Errorf("migrating actors v6 state: %w", err) + } + + return newRoot, nil +} + +func (c *ChainFork) PreUpgradeActorsV7(ctx context.Context, cache MigrationCache, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) error { + // Use half the CPUs for pre-migration, but leave at least 3. + workerCount := runtime.NumCPU() + if workerCount <= 4 { + workerCount = 1 + } else { + workerCount /= 2 + } + + config := nv15.Config{MaxWorkers: uint(workerCount)} + _, err := c.upgradeActorsV7Common(ctx, cache, root, epoch, ts, config) + return err +} + +func (c *ChainFork) upgradeActorsV7Common( + ctx context.Context, + cache MigrationCache, + root cid.Cid, epoch abi.ChainEpoch, + ts *types.TipSet, + config nv15.Config, +) (cid.Cid, error) { + buf := blockstoreutil.NewTieredBstore(c.bs, blockstoreutil.NewTemporarySync()) + store := chain.ActorStore(ctx, buf) + + // Load the state root. + var stateRoot vmstate.StateRoot + if err := store.Get(ctx, root, &stateRoot); err != nil { + return cid.Undef, xerrors.Errorf("failed to decode state root: %w", err) + } + + if stateRoot.Version != vmstate.StateTreeVersion4 { + return cid.Undef, xerrors.Errorf( + "expected state root version 4 for actors v7 upgrade, got %d", + stateRoot.Version, + ) + } + + // Perform the migration + newHamtRoot, err := nv15.MigrateStateTree(ctx, store, stateRoot.Actors, epoch, config, migrationLogger{}, cache) + if err != nil { + return cid.Undef, xerrors.Errorf("upgrading to actors v7: %w", err) + } + + // Persist the result. + newRoot, err := store.Put(ctx, &vmstate.StateRoot{ + Version: vmstate.StateTreeVersion4, + Actors: newHamtRoot, + Info: stateRoot.Info, + }) + if err != nil { + return cid.Undef, xerrors.Errorf("failed to persist new state root: %w", err) + } + + // Persist the new tree. + + { + from := buf + to := buf.Read() + + if err := Copy(ctx, from, to, newRoot); err != nil { + return cid.Undef, xerrors.Errorf("copying migrated tree: %w", err) + } + } + + return newRoot, nil +} + func (c *ChainFork) GetForkUpgrade() *config.ForkUpgradeConfig { return c.forkUpgrade } diff --git a/pkg/state/tree/state.go b/pkg/state/tree/state.go index b692f05dd2..94ff206590 100644 --- a/pkg/state/tree/state.go +++ b/pkg/state/tree/state.go @@ -137,7 +137,7 @@ func VersionForNetwork(ver network.Version) (StateTreeVersion, error) { return StateTreeVersion2, nil case network.Version12: return StateTreeVersion3, nil - case network.Version13, network.Version14: + case network.Version13, network.Version14, network.Version15: return StateTreeVersion4, nil default: panic(fmt.Sprintf("unsupported network version %d", ver)) diff --git a/pkg/util/ffiwrapper/impl/testing.go b/pkg/util/ffiwrapper/impl/testing.go index 36791f4adb..e0be647b69 100644 --- a/pkg/util/ffiwrapper/impl/testing.go +++ b/pkg/util/ffiwrapper/impl/testing.go @@ -2,10 +2,13 @@ package impl import ( "context" - "github.com/filecoin-project/venus/pkg/util/ffiwrapper" "github.com/filecoin-project/go-state-types/abi" + proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + + "github.com/filecoin-project/venus/pkg/util/ffiwrapper" ) // FakeVerifier is a simple mock Verifier for testing. @@ -22,6 +25,10 @@ func (f *FakeVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerify return true, nil } +func (f *FakeVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { + return true, nil +} + func (f *FakeVerifier) VerifyWinningPoSt(context.Context, proof5.WinningPoStVerifyInfo) (bool, error) { return true, nil } diff --git a/pkg/util/ffiwrapper/impl/verifier_cgo.go b/pkg/util/ffiwrapper/impl/verifier_cgo.go index ea0c5f8c84..c7b19d2cee 100644 --- a/pkg/util/ffiwrapper/impl/verifier_cgo.go +++ b/pkg/util/ffiwrapper/impl/verifier_cgo.go @@ -9,6 +9,7 @@ import ( ffi "github.com/filecoin-project/filecoin-ffi" "github.com/filecoin-project/go-state-types/abi" proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/specs-storage/storage" "go.opencensus.io/trace" "golang.org/x/xerrors" @@ -119,6 +120,10 @@ func (verifier proofVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSea return ffi.VerifyAggregateSeals(aggregate) } +func (proofVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { + return ffi.SectorUpdate.VerifyUpdateProof(update) +} + func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { info.Randomness[31] &= 0x3f _, span := trace.StartSpan(ctx, "VerifyWinningPoSt") diff --git a/pkg/util/ffiwrapper/verifier.go b/pkg/util/ffiwrapper/verifier.go index 5104ff6175..6633b5eea9 100644 --- a/pkg/util/ffiwrapper/verifier.go +++ b/pkg/util/ffiwrapper/verifier.go @@ -2,13 +2,17 @@ package ffiwrapper import ( "context" + "github.com/filecoin-project/go-state-types/abi" + proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" ) type Verifier interface { VerifySeal(proof5.SealVerifyInfo) (bool, error) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) + VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) diff --git a/pkg/vm/gas/gascost.go b/pkg/vm/gas/gascost.go index 6fcb7f497f..b8f85f3ba9 100644 --- a/pkg/vm/gas/gascost.go +++ b/pkg/vm/gas/gascost.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/crypto" @@ -74,9 +74,10 @@ type Pricelist interface { OnVerifySignature(sigType crypto.SigType, planTextSize int) (GasCharge, error) OnHashing(dataSize int) GasCharge OnComputeUnsealedSectorCid(proofType abi.RegisteredSealProof, pieces []abi.PieceInfo) GasCharge - OnVerifySeal(info proof5.SealVerifyInfo) GasCharge - OnVerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) GasCharge - OnVerifyPost(info proof5.WindowPoStVerifyInfo) GasCharge + OnVerifySeal(info proof7.SealVerifyInfo) GasCharge + OnVerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) GasCharge + OnVerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) GasCharge + OnVerifyPost(info proof7.WindowPoStVerifyInfo) GasCharge OnVerifyConsensusFault() GasCharge } diff --git a/pkg/vm/gas/pricelistV0.go b/pkg/vm/gas/pricelistV0.go index 1f5f839523..a8acbb1cf9 100644 --- a/pkg/vm/gas/pricelistV0.go +++ b/pkg/vm/gas/pricelistV0.go @@ -7,8 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/crypto" - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/venus/venus-shared/actors/builtin" ) @@ -206,14 +205,14 @@ func (pl *pricelistV0) OnComputeUnsealedSectorCid(proofType abi.RegisteredSealPr } // OnVerifySeal -func (pl *pricelistV0) OnVerifySeal(info proof2.SealVerifyInfo) GasCharge { +func (pl *pricelistV0) OnVerifySeal(info proof7.SealVerifyInfo) GasCharge { // TODO: this needs more cost tunning, check with @lotus // this is not used return NewGasCharge("OnVerifySeal", pl.verifySealBase, 0) } // OnVerifyAggregateSeals -func (pl *pricelistV0) OnVerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) GasCharge { +func (pl *pricelistV0) OnVerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) GasCharge { proofType := aggregate.SealProof perProof, ok := pl.verifyAggregateSealPer[proofType] if !ok { @@ -228,8 +227,14 @@ func (pl *pricelistV0) OnVerifyAggregateSeals(aggregate proof5.AggregateSealVeri return NewGasCharge("OnVerifyAggregateSeals", perProof*num+step.Lookup(num), 0) } +// OnVerifyReplicaUpdate +func (pl *pricelistV0) OnVerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) GasCharge { + // TODO: do the thing + return GasCharge{} +} + // OnVerifyPost -func (pl *pricelistV0) OnVerifyPost(info proof2.WindowPoStVerifyInfo) GasCharge { +func (pl *pricelistV0) OnVerifyPost(info proof7.WindowPoStVerifyInfo) GasCharge { sectorSize := "unknown" var proofType abi.RegisteredPoStProof diff --git a/pkg/vm/register/default.go b/pkg/vm/register/default.go index c65e2813ce..03a699a2ce 100644 --- a/pkg/vm/register/default.go +++ b/pkg/vm/register/default.go @@ -10,6 +10,7 @@ import ( exported4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/exported" exported5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/exported" exported6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/exported" + exported7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/exported" ) // DefaultActors is list of all actors that ship with Filecoin. @@ -25,5 +26,6 @@ func init() { DefaultActorBuilder.AddMany(dispatch.ActorsVersionPredicate(actors.Version4), exported4.BuiltinActors()...) DefaultActorBuilder.AddMany(dispatch.ActorsVersionPredicate(actors.Version5), exported5.BuiltinActors()...) DefaultActorBuilder.AddMany(dispatch.ActorsVersionPredicate(actors.Version6), exported6.BuiltinActors()...) + DefaultActorBuilder.AddMany(dispatch.ActorsVersionPredicate(actors.Version7), exported7.BuiltinActors()...) DefaultActors = DefaultActorBuilder.Build() } diff --git a/pkg/vmsupport/syscalls.go b/pkg/vmsupport/syscalls.go index 90a2945325..b4e75c0c51 100644 --- a/pkg/vmsupport/syscalls.go +++ b/pkg/vmsupport/syscalls.go @@ -4,31 +4,35 @@ import ( "context" "errors" "fmt" - "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" - "github.com/filecoin-project/venus/pkg/vm/vmcontext" - cbornode "github.com/ipfs/go-ipld-cbor" goruntime "runtime" "sync" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - rt5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" - "github.com/filecoin-project/venus/pkg/util/ffiwrapper" "github.com/ipfs/go-cid" + cbornode "github.com/ipfs/go-ipld-cbor" logging "github.com/ipfs/go-log/v2" "github.com/minio/blake2b-simd" "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + + vmr "github.com/filecoin-project/specs-actors/v7/actors/runtime" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/state" + "github.com/filecoin-project/venus/pkg/util/ffiwrapper" + "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" "github.com/filecoin-project/venus/pkg/vm" + "github.com/filecoin-project/venus/pkg/vm/vmcontext" ) var log = logging.Logger("vmsupport") type faultChecker interface { - VerifyConsensusFault(ctx context.Context, h1, h2, extra []byte, curEpoch abi.ChainEpoch, msg vm.VmMessage, gasIpld cbornode.IpldStore, view vm.SyscallsStateView, getter vmcontext.LookbackStateGetter) (*rt5.ConsensusFault, error) + VerifyConsensusFault(ctx context.Context, h1, h2, extra []byte, curEpoch abi.ChainEpoch, msg vm.VmMessage, gasIpld cbornode.IpldStore, view vm.SyscallsStateView, getter vmcontext.LookbackStateGetter) (*vmr.ConsensusFault, error) } // Syscalls contains the concrete implementation of VM system calls, including connection to @@ -50,6 +54,19 @@ func NewSyscalls(faultChecker faultChecker, verifier ffiwrapper.Verifier) *Sysca } } +func (s *Syscalls) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) error { + ok, err := s.verifier.VerifyReplicaUpdate(update) + if err != nil { + return xerrors.Errorf("failed to verify replica update: %w", err) + } + + if !ok { + return fmt.Errorf("invalid replica update") + } + + return nil +} + // VerifySignature Verifies that a signature is valid for an address and plaintext. func (s *Syscalls) VerifySignature(ctx context.Context, view vm.SyscallsStateView, signature crypto.Signature, signer address.Address, plaintext []byte) error { return state.NewSignatureValidator(view).ValidateSignature(ctx, plaintext, signer, signature) @@ -146,6 +163,6 @@ func (s *Syscalls) VerifyPoSt(ctx context.Context, info proof5.WindowPoStVerifyI // the "parent grinding fault", in which case it must be the sibling of h1 (same parent tipset) and one of the // blocks in the parent of h2 (i.e. h2's grandparent). // Returns nil and an error if the headers don't prove a fault. -func (s *Syscalls) VerifyConsensusFault(ctx context.Context, h1, h2, extra []byte, curEpoch abi.ChainEpoch, msg vm.VmMessage, gasIpld cbornode.IpldStore, view vm.SyscallsStateView, getter vmcontext.LookbackStateGetter) (*rt5.ConsensusFault, error) { +func (s *Syscalls) VerifyConsensusFault(ctx context.Context, h1, h2, extra []byte, curEpoch abi.ChainEpoch, msg vm.VmMessage, gasIpld cbornode.IpldStore, view vm.SyscallsStateView, getter vmcontext.LookbackStateGetter) (*vmr.ConsensusFault, error) { return s.faultChecker.VerifyConsensusFault(ctx, h1, h2, extra, curEpoch, msg, gasIpld, view, getter) } From cc0202f209c979415a319755ce71f9dd60c22376 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Wed, 29 Dec 2021 18:14:58 +0800 Subject: [PATCH 088/167] specactors: Add code not generated by the template (#4657) --- fixtures/networks/integrationtestnet.go | 1 - pkg/types/specactors/builtin/init/diff.go | 152 ++++ pkg/types/specactors/builtin/market/diff.go | 91 ++ pkg/types/specactors/builtin/miner/diff.go | 127 +++ .../builtin/miner/diff_deadlines.go | 176 ++++ pkg/types/specactors/builtin/multisig/diff.go | 134 +++ pkg/types/specactors/builtin/power/diff.go | 117 +++ pkg/types/specactors/policy/policy.go | 815 ++++++++---------- 8 files changed, 1150 insertions(+), 463 deletions(-) create mode 100644 pkg/types/specactors/builtin/init/diff.go create mode 100644 pkg/types/specactors/builtin/market/diff.go create mode 100644 pkg/types/specactors/builtin/miner/diff.go create mode 100644 pkg/types/specactors/builtin/miner/diff_deadlines.go create mode 100644 pkg/types/specactors/builtin/multisig/diff.go create mode 100644 pkg/types/specactors/builtin/power/diff.go diff --git a/fixtures/networks/integrationtestnet.go b/fixtures/networks/integrationtestnet.go index 8e5deef78c..28a1aed686 100644 --- a/fixtures/networks/integrationtestnet.go +++ b/fixtures/networks/integrationtestnet.go @@ -39,7 +39,6 @@ func IntegrationNet() *NetworkConf { UpgradeChocolateHeight: 1231620, UpgradeSnapDealsHeight: 999999999999, - BreezeGasTampingDuration: 120, UpgradeClausHeight: 343200, }, diff --git a/pkg/types/specactors/builtin/init/diff.go b/pkg/types/specactors/builtin/init/diff.go new file mode 100644 index 0000000000..37a6979098 --- /dev/null +++ b/pkg/types/specactors/builtin/init/diff.go @@ -0,0 +1,152 @@ +package init + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + typegen "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/pkg/types/specactors/adt" +) + +func DiffAddressMap(pre, cur State) (*AddressMapChanges, error) { + prem, err := pre.AddressMap() + if err != nil { + return nil, err + } + + curm, err := cur.AddressMap() + if err != nil { + return nil, err + } + + preRoot, err := prem.Root() + if err != nil { + return nil, err + } + + curRoot, err := curm.Root() + if err != nil { + return nil, err + } + + results := new(AddressMapChanges) + // no change. + if curRoot.Equals(preRoot) { + return results, nil + } + + err = adt.DiffAdtMap(prem, curm, &addressMapDiffer{results, pre, cur}) + if err != nil { + return nil, err + } + + return results, nil +} + +type addressMapDiffer struct { + Results *AddressMapChanges + pre, adter State +} + +type AddressMapChanges struct { + Added []AddressPair + Modified []AddressChange + Removed []AddressPair +} + +func (i *addressMapDiffer) AsKey(key string) (abi.Keyer, error) { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return nil, err + } + return abi.AddrKey(addr), nil +} + +func (i *addressMapDiffer) Add(key string, val *typegen.Deferred) error { + pkAddr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + id := new(typegen.CborInt) + if err := id.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return err + } + idAddr, err := address.NewIDAddress(uint64(*id)) + if err != nil { + return err + } + i.Results.Added = append(i.Results.Added, AddressPair{ + ID: idAddr, + PK: pkAddr, + }) + return nil +} + +func (i *addressMapDiffer) Modify(key string, from, to *typegen.Deferred) error { + pkAddr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + + fromID := new(typegen.CborInt) + if err := fromID.UnmarshalCBOR(bytes.NewReader(from.Raw)); err != nil { + return err + } + fromIDAddr, err := address.NewIDAddress(uint64(*fromID)) + if err != nil { + return err + } + + toID := new(typegen.CborInt) + if err := toID.UnmarshalCBOR(bytes.NewReader(to.Raw)); err != nil { + return err + } + toIDAddr, err := address.NewIDAddress(uint64(*toID)) + if err != nil { + return err + } + + i.Results.Modified = append(i.Results.Modified, AddressChange{ + From: AddressPair{ + ID: fromIDAddr, + PK: pkAddr, + }, + To: AddressPair{ + ID: toIDAddr, + PK: pkAddr, + }, + }) + return nil +} + +func (i *addressMapDiffer) Remove(key string, val *typegen.Deferred) error { + pkAddr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + id := new(typegen.CborInt) + if err := id.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return err + } + idAddr, err := address.NewIDAddress(uint64(*id)) + if err != nil { + return err + } + i.Results.Removed = append(i.Results.Removed, AddressPair{ + ID: idAddr, + PK: pkAddr, + }) + return nil +} + +type AddressChange struct { + From AddressPair + To AddressPair +} + +type AddressPair struct { + ID address.Address + PK address.Address +} diff --git a/pkg/types/specactors/builtin/market/diff.go b/pkg/types/specactors/builtin/market/diff.go new file mode 100644 index 0000000000..90c4e75cad --- /dev/null +++ b/pkg/types/specactors/builtin/market/diff.go @@ -0,0 +1,91 @@ +package market + +import ( + "fmt" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/venus/pkg/types/specactors/adt" + cbg "github.com/whyrusleeping/cbor-gen" +) + +func DiffDealProposals(pre, cur DealProposals) (*DealProposalChanges, error) { + results := new(DealProposalChanges) + if err := adt.DiffAdtArray(pre.array(), cur.array(), &marketProposalsDiffer{results, pre, cur}); err != nil { + return nil, fmt.Errorf("diffing deal states: %w", err) + } + return results, nil +} + +type marketProposalsDiffer struct { + Results *DealProposalChanges + pre, cur DealProposals +} + +func (d *marketProposalsDiffer) Add(key uint64, val *cbg.Deferred) error { + dp, err := d.cur.decode(val) + if err != nil { + return err + } + d.Results.Added = append(d.Results.Added, ProposalIDState{abi.DealID(key), *dp}) + return nil +} + +func (d *marketProposalsDiffer) Modify(key uint64, from, to *cbg.Deferred) error { + // short circuit, DealProposals are static + return nil +} + +func (d *marketProposalsDiffer) Remove(key uint64, val *cbg.Deferred) error { + dp, err := d.pre.decode(val) + if err != nil { + return err + } + d.Results.Removed = append(d.Results.Removed, ProposalIDState{abi.DealID(key), *dp}) + return nil +} + +func DiffDealStates(pre, cur DealStates) (*DealStateChanges, error) { + results := new(DealStateChanges) + if err := adt.DiffAdtArray(pre.array(), cur.array(), &marketStatesDiffer{results, pre, cur}); err != nil { + return nil, fmt.Errorf("diffing deal states: %w", err) + } + return results, nil +} + +type marketStatesDiffer struct { + Results *DealStateChanges + pre, cur DealStates +} + +func (d *marketStatesDiffer) Add(key uint64, val *cbg.Deferred) error { + ds, err := d.cur.decode(val) + if err != nil { + return err + } + d.Results.Added = append(d.Results.Added, DealIDState{abi.DealID(key), *ds}) + return nil +} + +func (d *marketStatesDiffer) Modify(key uint64, from, to *cbg.Deferred) error { + dsFrom, err := d.pre.decode(from) + if err != nil { + return err + } + dsTo, err := d.cur.decode(to) + if err != nil { + return err + } + if *dsFrom != *dsTo { + d.Results.Modified = append(d.Results.Modified, DealStateChange{abi.DealID(key), dsFrom, dsTo}) + } + return nil +} + +func (d *marketStatesDiffer) Remove(key uint64, val *cbg.Deferred) error { + ds, err := d.pre.decode(val) + if err != nil { + return err + } + d.Results.Removed = append(d.Results.Removed, DealIDState{abi.DealID(key), *ds}) + return nil +} diff --git a/pkg/types/specactors/builtin/miner/diff.go b/pkg/types/specactors/builtin/miner/diff.go new file mode 100644 index 0000000000..617090976a --- /dev/null +++ b/pkg/types/specactors/builtin/miner/diff.go @@ -0,0 +1,127 @@ +package miner + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/venus/pkg/types/specactors/adt" + cbg "github.com/whyrusleeping/cbor-gen" +) + +func DiffPreCommits(pre, cur State) (*PreCommitChanges, error) { + results := new(PreCommitChanges) + + prep, err := pre.precommits() + if err != nil { + return nil, err + } + + curp, err := cur.precommits() + if err != nil { + return nil, err + } + + err = adt.DiffAdtMap(prep, curp, &preCommitDiffer{results, pre, cur}) + if err != nil { + return nil, err + } + + return results, nil +} + +type preCommitDiffer struct { + Results *PreCommitChanges + pre, after State +} + +func (m *preCommitDiffer) AsKey(key string) (abi.Keyer, error) { + sector, err := abi.ParseUIntKey(key) + if err != nil { + return nil, err + } + return abi.UIntKey(sector), nil +} + +func (m *preCommitDiffer) Add(key string, val *cbg.Deferred) error { + sp, err := m.after.decodeSectorPreCommitOnChainInfo(val) + if err != nil { + return err + } + m.Results.Added = append(m.Results.Added, sp) + return nil +} + +func (m *preCommitDiffer) Modify(key string, from, to *cbg.Deferred) error { + return nil +} + +func (m *preCommitDiffer) Remove(key string, val *cbg.Deferred) error { + sp, err := m.pre.decodeSectorPreCommitOnChainInfo(val) + if err != nil { + return err + } + m.Results.Removed = append(m.Results.Removed, sp) + return nil +} + +func DiffSectors(pre, cur State) (*SectorChanges, error) { + results := new(SectorChanges) + + pres, err := pre.sectors() + if err != nil { + return nil, err + } + + curs, err := cur.sectors() + if err != nil { + return nil, err + } + + err = adt.DiffAdtArray(pres, curs, §orDiffer{results, pre, cur}) + if err != nil { + return nil, err + } + + return results, nil +} + +type sectorDiffer struct { + Results *SectorChanges + pre, after State +} + +func (m *sectorDiffer) Add(key uint64, val *cbg.Deferred) error { + si, err := m.after.decodeSectorOnChainInfo(val) + if err != nil { + return err + } + m.Results.Added = append(m.Results.Added, si) + return nil +} + +func (m *sectorDiffer) Modify(key uint64, from, to *cbg.Deferred) error { + siFrom, err := m.pre.decodeSectorOnChainInfo(from) + if err != nil { + return err + } + + siTo, err := m.after.decodeSectorOnChainInfo(to) + if err != nil { + return err + } + + if siFrom.Expiration != siTo.Expiration { + m.Results.Extended = append(m.Results.Extended, SectorExtensions{ + From: siFrom, + To: siTo, + }) + } + return nil +} + +func (m *sectorDiffer) Remove(key uint64, val *cbg.Deferred) error { + si, err := m.pre.decodeSectorOnChainInfo(val) + if err != nil { + return err + } + m.Results.Removed = append(m.Results.Removed, si) + return nil +} diff --git a/pkg/types/specactors/builtin/miner/diff_deadlines.go b/pkg/types/specactors/builtin/miner/diff_deadlines.go new file mode 100644 index 0000000000..7d686ece5b --- /dev/null +++ b/pkg/types/specactors/builtin/miner/diff_deadlines.go @@ -0,0 +1,176 @@ +package miner + +import ( + "errors" + + "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-state-types/exitcode" +) + +type DeadlinesDiff map[uint64]DeadlineDiff + +func DiffDeadlines(pre, cur State) (DeadlinesDiff, error) { + changed, err := pre.DeadlinesChanged(cur) + if err != nil { + return nil, err + } + if !changed { + return nil, nil + } + + dlDiff := make(DeadlinesDiff) + if err := pre.ForEachDeadline(func(idx uint64, preDl Deadline) error { + curDl, err := cur.LoadDeadline(idx) + if err != nil { + return err + } + + diff, err := DiffDeadline(preDl, curDl) + if err != nil { + return err + } + + dlDiff[idx] = diff + return nil + }); err != nil { + return nil, err + } + return dlDiff, nil +} + +type DeadlineDiff map[uint64]*PartitionDiff + +func DiffDeadline(pre, cur Deadline) (DeadlineDiff, error) { + changed, err := pre.PartitionsChanged(cur) + if err != nil { + return nil, err + } + if !changed { + return nil, nil + } + + partDiff := make(DeadlineDiff) + if err := pre.ForEachPartition(func(idx uint64, prePart Partition) error { + // try loading current partition at this index + curPart, err := cur.LoadPartition(idx) + if err != nil { + if errors.Is(err, exitcode.ErrNotFound) { + // TODO correctness? + return nil // the partition was removed. + } + return err + } + + // compare it with the previous partition + diff, err := DiffPartition(prePart, curPart) + if err != nil { + return err + } + + partDiff[idx] = diff + return nil + }); err != nil { + return nil, err + } + + // all previous partitions have been walked. + // all partitions in cur and not in prev are new... can they be faulty already? + // TODO is this correct? + if err := cur.ForEachPartition(func(idx uint64, curPart Partition) error { + if _, found := partDiff[idx]; found { + return nil + } + faults, err := curPart.FaultySectors() + if err != nil { + return err + } + recovering, err := curPart.RecoveringSectors() + if err != nil { + return err + } + partDiff[idx] = &PartitionDiff{ + Removed: bitfield.New(), + Recovered: bitfield.New(), + Faulted: faults, + Recovering: recovering, + } + + return nil + }); err != nil { + return nil, err + } + + return partDiff, nil +} + +type PartitionDiff struct { + Removed bitfield.BitField + Recovered bitfield.BitField + Faulted bitfield.BitField + Recovering bitfield.BitField +} + +func DiffPartition(pre, cur Partition) (*PartitionDiff, error) { + prevLiveSectors, err := pre.LiveSectors() + if err != nil { + return nil, err + } + curLiveSectors, err := cur.LiveSectors() + if err != nil { + return nil, err + } + + removed, err := bitfield.SubtractBitField(prevLiveSectors, curLiveSectors) + if err != nil { + return nil, err + } + + prevRecoveries, err := pre.RecoveringSectors() + if err != nil { + return nil, err + } + + curRecoveries, err := cur.RecoveringSectors() + if err != nil { + return nil, err + } + + recovering, err := bitfield.SubtractBitField(curRecoveries, prevRecoveries) + if err != nil { + return nil, err + } + + prevFaults, err := pre.FaultySectors() + if err != nil { + return nil, err + } + + curFaults, err := cur.FaultySectors() + if err != nil { + return nil, err + } + + faulted, err := bitfield.SubtractBitField(curFaults, prevFaults) + if err != nil { + return nil, err + } + + // all current good sectors + curActiveSectors, err := cur.ActiveSectors() + if err != nil { + return nil, err + } + + // sectors that were previously fault and are now currently active are considered recovered. + recovered, err := bitfield.IntersectBitField(prevFaults, curActiveSectors) + if err != nil { + return nil, err + } + + return &PartitionDiff{ + Removed: removed, + Recovered: recovered, + Faulted: faulted, + Recovering: recovering, + }, nil +} diff --git a/pkg/types/specactors/builtin/multisig/diff.go b/pkg/types/specactors/builtin/multisig/diff.go new file mode 100644 index 0000000000..4d0c4639a4 --- /dev/null +++ b/pkg/types/specactors/builtin/multisig/diff.go @@ -0,0 +1,134 @@ +package multisig + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/pkg/types/specactors/adt" +) + +type PendingTransactionChanges struct { + Added []TransactionChange + Modified []TransactionModification + Removed []TransactionChange +} + +type TransactionChange struct { + TxID int64 + Tx Transaction +} + +type TransactionModification struct { + TxID int64 + From Transaction + To Transaction +} + +func DiffPendingTransactions(pre, cur State) (*PendingTransactionChanges, error) { + results := new(PendingTransactionChanges) + if changed, err := pre.PendingTxnChanged(cur); err != nil { + return nil, err + } else if !changed { // if nothing has changed then return an empty result and bail. + return results, nil + } + + pret, err := pre.transactions() + if err != nil { + return nil, err + } + + curt, err := cur.transactions() + if err != nil { + return nil, err + } + + if err := adt.DiffAdtMap(pret, curt, &transactionDiffer{results, pre, cur}); err != nil { + return nil, err + } + return results, nil +} + +type transactionDiffer struct { + Results *PendingTransactionChanges + pre, after State +} + +func (t *transactionDiffer) AsKey(key string) (abi.Keyer, error) { + txID, err := abi.ParseIntKey(key) + if err != nil { + return nil, err + } + return abi.IntKey(txID), nil +} + +func (t *transactionDiffer) Add(key string, val *cbg.Deferred) error { + txID, err := abi.ParseIntKey(key) + if err != nil { + return err + } + tx, err := t.after.decodeTransaction(val) + if err != nil { + return err + } + t.Results.Added = append(t.Results.Added, TransactionChange{ + TxID: txID, + Tx: tx, + }) + return nil +} + +func (t *transactionDiffer) Modify(key string, from, to *cbg.Deferred) error { + txID, err := abi.ParseIntKey(key) + if err != nil { + return err + } + + txFrom, err := t.pre.decodeTransaction(from) + if err != nil { + return err + } + + txTo, err := t.after.decodeTransaction(to) + if err != nil { + return err + } + + if approvalsChanged(txFrom.Approved, txTo.Approved) { + t.Results.Modified = append(t.Results.Modified, TransactionModification{ + TxID: txID, + From: txFrom, + To: txTo, + }) + } + + return nil +} + +func approvalsChanged(from, to []address.Address) bool { + if len(from) != len(to) { + return true + } + for idx := range from { + if from[idx] != to[idx] { + return true + } + } + return false +} + +func (t *transactionDiffer) Remove(key string, val *cbg.Deferred) error { + txID, err := abi.ParseIntKey(key) + if err != nil { + return err + } + tx, err := t.pre.decodeTransaction(val) + if err != nil { + return err + } + t.Results.Removed = append(t.Results.Removed, TransactionChange{ + TxID: txID, + Tx: tx, + }) + return nil +} diff --git a/pkg/types/specactors/builtin/power/diff.go b/pkg/types/specactors/builtin/power/diff.go new file mode 100644 index 0000000000..07d8768390 --- /dev/null +++ b/pkg/types/specactors/builtin/power/diff.go @@ -0,0 +1,117 @@ +package power + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/pkg/types/specactors/adt" +) + +type ClaimChanges struct { + Added []ClaimInfo + Modified []ClaimModification + Removed []ClaimInfo +} + +type ClaimModification struct { + Miner address.Address + From Claim + To Claim +} + +type ClaimInfo struct { + Miner address.Address + Claim Claim +} + +func DiffClaims(pre, cur State) (*ClaimChanges, error) { + results := new(ClaimChanges) + + prec, err := pre.claims() + if err != nil { + return nil, err + } + + curc, err := cur.claims() + if err != nil { + return nil, err + } + + if err := adt.DiffAdtMap(prec, curc, &claimDiffer{results, pre, cur}); err != nil { + return nil, err + } + + return results, nil +} + +type claimDiffer struct { + Results *ClaimChanges + pre, after State +} + +func (c *claimDiffer) AsKey(key string) (abi.Keyer, error) { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return nil, err + } + return abi.AddrKey(addr), nil +} + +func (c *claimDiffer) Add(key string, val *cbg.Deferred) error { + ci, err := c.after.decodeClaim(val) + if err != nil { + return err + } + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + c.Results.Added = append(c.Results.Added, ClaimInfo{ + Miner: addr, + Claim: ci, + }) + return nil +} + +func (c *claimDiffer) Modify(key string, from, to *cbg.Deferred) error { + ciFrom, err := c.pre.decodeClaim(from) + if err != nil { + return err + } + + ciTo, err := c.after.decodeClaim(to) + if err != nil { + return err + } + + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + + if ciFrom != ciTo { + c.Results.Modified = append(c.Results.Modified, ClaimModification{ + Miner: addr, + From: ciFrom, + To: ciTo, + }) + } + return nil +} + +func (c *claimDiffer) Remove(key string, val *cbg.Deferred) error { + ci, err := c.after.decodeClaim(val) + if err != nil { + return err + } + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + c.Results.Removed = append(c.Results.Removed, ClaimInfo{ + Miner: addr, + Claim: ci, + }) + return nil +} diff --git a/pkg/types/specactors/policy/policy.go b/pkg/types/specactors/policy/policy.go index d31129725a..ecc0e004a8 100644 --- a/pkg/types/specactors/policy/policy.go +++ b/pkg/types/specactors/policy/policy.go @@ -12,49 +12,40 @@ import ( "github.com/filecoin-project/go-state-types/network" actors "github.com/filecoin-project/venus/pkg/types/specactors" - - market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" + power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" - power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" - - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" verifreg3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/verifreg" - - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" - - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" verifreg5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/verifreg" - - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" - - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" - - paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" ) @@ -69,41 +60,26 @@ const ( // SetSupportedProofTypes sets supported proof types, across all actor versions. // This should only be used for testing. func SetSupportedProofTypes(types ...abi.RegisteredSealProof) { - - - miner0.SupportedProofTypes = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - - - miner2.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner2.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) - miner2.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - - - miner3.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner3.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) - miner3.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - - - miner4.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner4.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) - miner4.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - - - miner5.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - - - miner6.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - - - miner7.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - + + miner0.SupportedProofTypes = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner2.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner2.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) + miner2.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner3.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner3.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) + miner3.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner4.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner4.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) + miner4.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner5.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner6.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner7.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) AddSupportedProofTypes(types...) } @@ -117,65 +93,50 @@ func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { } // Set for all miner versions. - - - miner0.SupportedProofTypes[t] = struct{}{} - - - - miner2.PreCommitSealProofTypesV0[t] = struct{}{} - miner2.PreCommitSealProofTypesV7[t] = struct{}{} - miner2.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner2.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - - - - miner3.PreCommitSealProofTypesV0[t] = struct{}{} - miner3.PreCommitSealProofTypesV7[t] = struct{}{} - miner3.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner3.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - - - - miner4.PreCommitSealProofTypesV0[t] = struct{}{} - miner4.PreCommitSealProofTypesV7[t] = struct{}{} - miner4.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner4.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - - - - miner5.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err := t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } - - miner5.WindowPoStProofTypes[wpp] = struct{}{} - - - - miner6.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err = t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } - - miner6.WindowPoStProofTypes[wpp] = struct{}{} - - - - miner7.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err = t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } - - miner7.WindowPoStProofTypes[wpp] = struct{}{} - - + miner0.SupportedProofTypes[t] = struct{}{} + + miner2.PreCommitSealProofTypesV0[t] = struct{}{} + miner2.PreCommitSealProofTypesV7[t] = struct{}{} + miner2.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner2.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + + miner3.PreCommitSealProofTypesV0[t] = struct{}{} + miner3.PreCommitSealProofTypesV7[t] = struct{}{} + miner3.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner3.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + + miner4.PreCommitSealProofTypesV0[t] = struct{}{} + miner4.PreCommitSealProofTypesV7[t] = struct{}{} + miner4.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner4.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + + miner5.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err := t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner5.WindowPoStProofTypes[wpp] = struct{}{} + + miner6.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err = t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner6.WindowPoStProofTypes[wpp] = struct{}{} + + miner7.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err = t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner7.WindowPoStProofTypes[wpp] = struct{}{} + } } @@ -183,21 +144,21 @@ func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { // actors versions. Use for testing. func SetPreCommitChallengeDelay(delay abi.ChainEpoch) { // Set for all miner versions. - - miner0.PreCommitChallengeDelay = delay - - miner2.PreCommitChallengeDelay = delay - - miner3.PreCommitChallengeDelay = delay - - miner4.PreCommitChallengeDelay = delay - - miner5.PreCommitChallengeDelay = delay - - miner6.PreCommitChallengeDelay = delay - - miner7.PreCommitChallengeDelay = delay - + + miner0.PreCommitChallengeDelay = delay + + miner2.PreCommitChallengeDelay = delay + + miner3.PreCommitChallengeDelay = delay + + miner4.PreCommitChallengeDelay = delay + + miner5.PreCommitChallengeDelay = delay + + miner6.PreCommitChallengeDelay = delay + + miner7.PreCommitChallengeDelay = delay + } // TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. @@ -209,107 +170,86 @@ func GetPreCommitChallengeDelay() abi.ChainEpoch { // meet for leader election, across all actor versions. This should only be used // for testing. func SetConsensusMinerMinPower(p abi.StoragePower) { - - - power0.ConsensusMinerMinPower = p - - - - for _, policy := range builtin2.SealProofPolicies { - policy.ConsensusMinerMinPower = p - } - - - - for _, policy := range builtin3.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - - - for _, policy := range builtin4.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - - - for _, policy := range builtin5.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - - - for _, policy := range builtin6.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - - - for _, policy := range builtin7.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - + + power0.ConsensusMinerMinPower = p + + for _, policy := range builtin2.SealProofPolicies { + policy.ConsensusMinerMinPower = p + } + + for _, policy := range builtin3.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + for _, policy := range builtin4.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + for _, policy := range builtin5.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + for _, policy := range builtin6.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + for _, policy := range builtin7.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + } // SetMinVerifiedDealSize sets the minimum size of a verified deal. This should // only be used for testing. func SetMinVerifiedDealSize(size abi.StoragePower) { - - verifreg0.MinVerifiedDealSize = size - - verifreg2.MinVerifiedDealSize = size - - verifreg3.MinVerifiedDealSize = size - - verifreg4.MinVerifiedDealSize = size - - verifreg5.MinVerifiedDealSize = size - - verifreg6.MinVerifiedDealSize = size - - verifreg7.MinVerifiedDealSize = size - + + verifreg0.MinVerifiedDealSize = size + + verifreg2.MinVerifiedDealSize = size + + verifreg3.MinVerifiedDealSize = size + + verifreg4.MinVerifiedDealSize = size + + verifreg5.MinVerifiedDealSize = size + + verifreg6.MinVerifiedDealSize = size + + verifreg7.MinVerifiedDealSize = size + } func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { switch ver { - - case actors.Version0: - - return miner0.MaxSealDuration[t], nil - - - case actors.Version2: - - return miner2.MaxProveCommitDuration[t], nil - - - case actors.Version3: - - return miner3.MaxProveCommitDuration[t], nil - - - case actors.Version4: - - return miner4.MaxProveCommitDuration[t], nil - - - case actors.Version5: - - return miner5.MaxProveCommitDuration[t], nil - - - case actors.Version6: - - return miner6.MaxProveCommitDuration[t], nil - - - case actors.Version7: - - return miner7.MaxProveCommitDuration[t], nil - - + + case actors.Version0: + + return miner0.MaxSealDuration[t], nil + + case actors.Version2: + + return miner2.MaxProveCommitDuration[t], nil + + case actors.Version3: + + return miner3.MaxProveCommitDuration[t], nil + + case actors.Version4: + + return miner4.MaxProveCommitDuration[t], nil + + case actors.Version5: + + return miner5.MaxProveCommitDuration[t], nil + + case actors.Version6: + + return miner6.MaxProveCommitDuration[t], nil + + case actors.Version7: + + return miner7.MaxProveCommitDuration[t], nil + default: return 0, xerrors.Errorf("unsupported actors version") } @@ -320,49 +260,35 @@ func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (a // only be used for testing. func SetProviderCollateralSupplyTarget(num, denom big.Int) { - - - market2.ProviderCollateralSupplyTarget = builtin2.BigFrac{ Numerator: num, Denominator: denom, } - - market3.ProviderCollateralSupplyTarget = builtin3.BigFrac{ Numerator: num, Denominator: denom, } - - market4.ProviderCollateralSupplyTarget = builtin4.BigFrac{ Numerator: num, Denominator: denom, } - - market5.ProviderCollateralSupplyTarget = builtin5.BigFrac{ Numerator: num, Denominator: denom, } - - market6.ProviderCollateralSupplyTarget = builtin6.BigFrac{ Numerator: num, Denominator: denom, } - - market7.ProviderCollateralSupplyTarget = builtin7.BigFrac{ Numerator: num, Denominator: denom, } - } @@ -376,49 +302,42 @@ func DealProviderCollateralBounds( return big.Zero(), big.Zero(), err } switch v { - - case actors.Version0: - - min, max := market0.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil, nwVer) - return min, max, nil - - - case actors.Version2: - - min, max := market2.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - - case actors.Version3: - - min, max := market3.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - - case actors.Version4: - - min, max := market4.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - - case actors.Version5: - - min, max := market5.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - - case actors.Version6: - - min, max := market6.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - - case actors.Version7: - - min, max := market7.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - + + case actors.Version0: + + min, max := market0.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil, nwVer) + return min, max, nil + + case actors.Version2: + + min, max := market2.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + case actors.Version3: + + min, max := market3.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + case actors.Version4: + + min, max := market4.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + case actors.Version5: + + min, max := market5.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + case actors.Version6: + + min, max := market6.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + case actors.Version7: + + min, max := market7.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + default: return big.Zero(), big.Zero(), xerrors.Errorf("unsupported actors version") } @@ -431,55 +350,48 @@ func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) // Sets the challenge window and scales the proving period to match (such that // there are always 48 challenge windows in a proving period). func SetWPoStChallengeWindow(period abi.ChainEpoch) { - - miner0.WPoStChallengeWindow = period - miner0.WPoStProvingPeriod = period * abi.ChainEpoch(miner0.WPoStPeriodDeadlines) - - - miner2.WPoStChallengeWindow = period - miner2.WPoStProvingPeriod = period * abi.ChainEpoch(miner2.WPoStPeriodDeadlines) - - - miner3.WPoStChallengeWindow = period - miner3.WPoStProvingPeriod = period * abi.ChainEpoch(miner3.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner3.WPoStDisputeWindow = period * 30 - - - miner4.WPoStChallengeWindow = period - miner4.WPoStProvingPeriod = period * abi.ChainEpoch(miner4.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner4.WPoStDisputeWindow = period * 30 - - - miner5.WPoStChallengeWindow = period - miner5.WPoStProvingPeriod = period * abi.ChainEpoch(miner5.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner5.WPoStDisputeWindow = period * 30 - - - miner6.WPoStChallengeWindow = period - miner6.WPoStProvingPeriod = period * abi.ChainEpoch(miner6.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner6.WPoStDisputeWindow = period * 30 - - - miner7.WPoStChallengeWindow = period - miner7.WPoStProvingPeriod = period * abi.ChainEpoch(miner7.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner7.WPoStDisputeWindow = period * 30 - - + + miner0.WPoStChallengeWindow = period + miner0.WPoStProvingPeriod = period * abi.ChainEpoch(miner0.WPoStPeriodDeadlines) + + miner2.WPoStChallengeWindow = period + miner2.WPoStProvingPeriod = period * abi.ChainEpoch(miner2.WPoStPeriodDeadlines) + + miner3.WPoStChallengeWindow = period + miner3.WPoStProvingPeriod = period * abi.ChainEpoch(miner3.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner3.WPoStDisputeWindow = period * 30 + + miner4.WPoStChallengeWindow = period + miner4.WPoStProvingPeriod = period * abi.ChainEpoch(miner4.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner4.WPoStDisputeWindow = period * 30 + + miner5.WPoStChallengeWindow = period + miner5.WPoStProvingPeriod = period * abi.ChainEpoch(miner5.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner5.WPoStDisputeWindow = period * 30 + + miner6.WPoStChallengeWindow = period + miner6.WPoStProvingPeriod = period * abi.ChainEpoch(miner6.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner6.WPoStDisputeWindow = period * 30 + + miner7.WPoStChallengeWindow = period + miner7.WPoStProvingPeriod = period * abi.ChainEpoch(miner7.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner7.WPoStDisputeWindow = period * 30 + } func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { @@ -548,28 +460,28 @@ func GetAddressedSectorsMax(nwVer network.Version) (int, error) { return 0, err } switch v { - - case actors.Version0: - return miner0.AddressedSectorsMax, nil - - case actors.Version2: - return miner2.AddressedSectorsMax, nil - - case actors.Version3: - return miner3.AddressedSectorsMax, nil - - case actors.Version4: - return miner4.AddressedSectorsMax, nil - - case actors.Version5: - return miner5.AddressedSectorsMax, nil - - case actors.Version6: - return miner6.AddressedSectorsMax, nil - - case actors.Version7: - return miner7.AddressedSectorsMax, nil - + + case actors.Version0: + return miner0.AddressedSectorsMax, nil + + case actors.Version2: + return miner2.AddressedSectorsMax, nil + + case actors.Version3: + return miner3.AddressedSectorsMax, nil + + case actors.Version4: + return miner4.AddressedSectorsMax, nil + + case actors.Version5: + return miner5.AddressedSectorsMax, nil + + case actors.Version6: + return miner6.AddressedSectorsMax, nil + + case actors.Version7: + return miner7.AddressedSectorsMax, nil + default: return 0, xerrors.Errorf("unsupported network version") } @@ -581,137 +493,116 @@ func GetDeclarationsMax(nwVer network.Version) (int, error) { return 0, err } switch v { - - case actors.Version0: - - // TODO: Should we instead error here since the concept doesn't exist yet? - return miner0.AddressedPartitionsMax, nil - - - case actors.Version2: - - return miner2.DeclarationsMax, nil - - - case actors.Version3: - - return miner3.DeclarationsMax, nil - - - case actors.Version4: - - return miner4.DeclarationsMax, nil - - - case actors.Version5: - - return miner5.DeclarationsMax, nil - - - case actors.Version6: - - return miner6.DeclarationsMax, nil - - - case actors.Version7: - - return miner7.DeclarationsMax, nil - - + + case actors.Version0: + + // TODO: Should we instead error here since the concept doesn't exist yet? + return miner0.AddressedPartitionsMax, nil + + case actors.Version2: + + return miner2.DeclarationsMax, nil + + case actors.Version3: + + return miner3.DeclarationsMax, nil + + case actors.Version4: + + return miner4.DeclarationsMax, nil + + case actors.Version5: + + return miner5.DeclarationsMax, nil + + case actors.Version6: + + return miner6.DeclarationsMax, nil + + case actors.Version7: + + return miner7.DeclarationsMax, nil + default: return 0, xerrors.Errorf("unsupported network version") } } func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actors.VersionForNetwork(nwVer) if err != nil { return big.Zero(), err } switch v { - - case actors.Version0: - - return big.Zero(), nil - - - case actors.Version2: - - return big.Zero(), nil - - - case actors.Version3: - - return big.Zero(), nil - - - case actors.Version4: - - return big.Zero(), nil - - - case actors.Version5: - - return miner5.AggregateNetworkFee(aggregateSize, baseFee), nil - - - case actors.Version6: - - return miner6.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil - - - case actors.Version7: - - return miner7.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil - - + + case actors.Version0: + + return big.Zero(), nil + + case actors.Version2: + + return big.Zero(), nil + + case actors.Version3: + + return big.Zero(), nil + + case actors.Version4: + + return big.Zero(), nil + + case actors.Version5: + + return miner5.AggregateNetworkFee(aggregateSize, baseFee), nil + + case actors.Version6: + + return miner6.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + + case actors.Version7: + + return miner7.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + default: return big.Zero(), xerrors.Errorf("unsupported network version") } } func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actors.VersionForNetwork(nwVer) if err != nil { return big.Zero(), err } switch v { - - case actors.Version0: - - return big.Zero(), nil - - - case actors.Version2: - - return big.Zero(), nil - - - case actors.Version3: - - return big.Zero(), nil - - - case actors.Version4: - - return big.Zero(), nil - - - case actors.Version5: - - return big.Zero(), nil - - - case actors.Version6: - - return miner6.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil - - - case actors.Version7: - - return miner7.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil - - + + case actors.Version0: + + return big.Zero(), nil + + case actors.Version2: + + return big.Zero(), nil + + case actors.Version3: + + return big.Zero(), nil + + case actors.Version4: + + return big.Zero(), nil + + case actors.Version5: + + return big.Zero(), nil + + case actors.Version6: + + return miner6.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + + case actors.Version7: + + return miner7.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + default: return big.Zero(), xerrors.Errorf("unsupported network version") } From 54e2bc197de1b71eef6e7650bb22f0bda30334f1 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Thu, 30 Dec 2021 17:50:52 +0800 Subject: [PATCH 089/167] shared remove go.mod (#4659) --- go.mod | 3 +- go.sum | 12 +- venus-shared/go.mod | 34 ---- venus-shared/go.sum | 483 -------------------------------------------- 4 files changed, 4 insertions(+), 528 deletions(-) delete mode 100644 venus-shared/go.mod delete mode 100644 venus-shared/go.sum diff --git a/go.mod b/go.mod index 25ac28ed26..2b94584a0e 100644 --- a/go.mod +++ b/go.mod @@ -44,10 +44,10 @@ require ( github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578 - github.com/filecoin-project/venus/venus-shared v0.0.0-00010101000000-000000000000 github.com/gbrlsnchs/jwt/v3 v3.0.0 github.com/go-errors/errors v1.0.1 github.com/go-kit/kit v0.10.0 + github.com/golang/mock v1.4.4 github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf // indirect github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a github.com/golangci/golangci-lint v1.39.0 @@ -144,7 +144,6 @@ replace ( github.com/filecoin-project/go-jsonrpc => github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc github.com/filecoin-project/test-vectors => ./extern/test-vectors github.com/filecoin-project/venus => ./ - github.com/filecoin-project/venus/venus-shared => ./venus-shared github.com/golangci/golangci-lint => github.com/golangci/golangci-lint v1.39.0 github.com/ipfs/go-ipfs-cmds => github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab ) diff --git a/go.sum b/go.sum index 710beb43e8..2d472ce903 100644 --- a/go.sum +++ b/go.sum @@ -496,8 +496,8 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= @@ -1894,7 +1894,6 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= @@ -2025,9 +2024,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2085,7 +2083,6 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -2195,10 +2192,8 @@ golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2316,9 +2311,8 @@ golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56 h1:g3QwFWCjsUzBtcQIcI+CYmiL/0i0BxTJjQp54GGDLEM= golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/venus-shared/go.mod b/venus-shared/go.mod deleted file mode 100644 index afbb17811d..0000000000 --- a/venus-shared/go.mod +++ /dev/null @@ -1,34 +0,0 @@ -module github.com/filecoin-project/venus/venus-shared - -go 1.16 - -require ( - github.com/docker/go-units v0.4.0 - github.com/filecoin-project/go-address v0.0.5 - github.com/filecoin-project/go-bitfield v0.2.4 - github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec - github.com/filecoin-project/go-state-types v0.1.1 - github.com/filecoin-project/specs-actors v0.9.13 - github.com/filecoin-project/specs-actors/v2 v2.3.5 - github.com/filecoin-project/specs-actors/v3 v3.1.1 - github.com/filecoin-project/specs-actors/v4 v4.0.1 - github.com/filecoin-project/specs-actors/v5 v5.0.4 - github.com/filecoin-project/specs-actors/v6 v6.0.1 - github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec - github.com/golang/mock v1.6.0 - github.com/ipfs/go-block-format v0.0.3 - github.com/ipfs/go-cid v0.1.0 - github.com/ipfs/go-ipld-cbor v0.0.5 - github.com/ipfs/go-ipld-format v0.0.2 - github.com/ipfs/go-log v1.0.4 - github.com/libp2p/go-libp2p-core v0.8.5 - github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 - github.com/multiformats/go-multiaddr v0.2.2 - github.com/multiformats/go-multihash v0.0.15 - github.com/stretchr/testify v1.7.0 - github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2 - go.uber.org/zap v1.14.1 - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 -) - -replace github.com/filecoin-project/go-jsonrpc => github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc diff --git a/venus-shared/go.sum b/venus-shared/go.sum deleted file mode 100644 index c8dee457f0..0000000000 --- a/venus-shared/go.sum +++ /dev/null @@ -1,483 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= -github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= -github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= -github.com/filecoin-project/go-address v0.0.5 h1:SSaFT/5aLfPXycUlFyemoHYhRgdyXClXCyDdNJKPlDM= -github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= -github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= -github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= -github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= -github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= -github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= -github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= -github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= -github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= -github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= -github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= -github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= -github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= -github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= -github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+eEvrDCGJoPLxFpDynFjYfBjI= -github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= -github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= -github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= -github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/specs-actors v0.9.13 h1:rUEOQouefi9fuVY/2HOroROJlZbOzWYXXeIh41KF2M4= -github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= -github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= -github.com/filecoin-project/specs-actors/v2 v2.3.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= -github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= -github.com/filecoin-project/specs-actors/v3 v3.1.0/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= -github.com/filecoin-project/specs-actors/v3 v3.1.1 h1:BE8fsns1GnEOxt1DTE5LxBK2FThXtWmCChgcJoHTg0E= -github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= -github.com/filecoin-project/specs-actors/v4 v4.0.0/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= -github.com/filecoin-project/specs-actors/v4 v4.0.1 h1:AiWrtvJZ63MHGe6rn7tPu4nSUY8bA1KDNszqJaD5+Fg= -github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= -github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= -github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= -github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= -github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= -github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc h1:L4JH2Ltl/Embq4qYezs3RsIYW1BB/fB9TfUkk42FOzU= -github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= -github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= -github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= -github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= -github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= -github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= -github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= -github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= -github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= -github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= -github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= -github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= -github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= -github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= -github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= -github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= -github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= -github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= -github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= -github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= -github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= -github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= -github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= -github.com/ipfs/go-ipld-format v0.0.2 h1:OVAGlyYT6JPZ0pEfGntFPS40lfrDmaDbQwNHEY2G9Zs= -github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/ipfs/go-log v1.0.4 h1:6nLQdX4W8P9yZZFH7mO+X/PzjN8Laozm/lMJ6esdgzY= -github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= -github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= -github.com/ipfs/go-log/v2 v2.0.8 h1:3b3YNopMHlj4AvyhWAx0pDxqSQWYi4/WuWO7yRV6/Qg= -github.com/ipfs/go-log/v2 v2.0.8/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= -github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= -github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= -github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= -github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= -github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= -github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= -github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= -github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= -github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= -github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= -github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= -github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= -github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= -github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= -github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= -github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= -github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= -github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM= -github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= -github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= -github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= -github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= -github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= -github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= -github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= -github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= -github.com/libp2p/go-libp2p-core v0.8.5 h1:aEgbIcPGsKy6zYcC+5AJivYFedhYa4sW7mIpWpUaLKw= -github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= -github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= -github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= -github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= -github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= -github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= -github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= -github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= -github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= -github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= -github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= -github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= -github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= -github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= -github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= -github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= -github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= -github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= -github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= -github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= -github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= -github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= -github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= -github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -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/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= -github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= -github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.2.2 h1:XZLDTszBIJe6m0zF6ITBrEcZR73OPUhCBBS9rYAuUzI= -github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= -github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= -github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= -github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= -github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= -github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= -github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= -github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= -github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= -github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a h1:hjZfReYVLbqFkAtr2us7vdy04YWz3LVAirzP7reh8+M= -github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= -github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= -github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= -github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= -github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830 h1:8kxMKmKzXXL4Ru1nyhvdms/JjWt+3YLpvRb/bAjO/y0= -github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= -github.com/whyrusleeping/cbor-gen v0.0.0-20200715143311-227fab5a2377/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20200723185710-6a3894a6352b/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20200806213330-63aa96ca5488/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20200810223238-211df3b9e24c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2 h1:bsUlNhdmbtlfdLVXAVfuvKQ01RnWAM09TVrJkI7NZs4= -github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= -github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= -github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/xorcare/golden v0.6.0 h1:E8emU8bhyMIEpYmgekkTUaw4vtcrRE+Wa0c5wYIcgXc= -github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo= -go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o= -golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= From 5c93bea798c6c6dd539cac4e98e0f028994aaddc Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Fri, 31 Dec 2021 09:53:40 +0800 Subject: [PATCH 090/167] VM: Circ supply should be constant per epoch (#4656) --- pkg/consensus/processor.go | 4 ++-- pkg/gen/genesis/genesis.go | 8 +++++-- pkg/gen/genesis/miners.go | 2 +- pkg/statemanger/call.go | 4 ++-- pkg/vm/vm.go | 6 ++++-- pkg/vm/vmcontext/syscallsStateView.go | 2 +- pkg/vm/vmcontext/vmcontext.go | 31 +++++++++++++++++++++------ tools/conformance/driver.go | 14 ++++-------- tools/gengen/util/generator.go | 5 ++++- 9 files changed, 48 insertions(+), 28 deletions(-) diff --git a/pkg/consensus/processor.go b/pkg/consensus/processor.go index aa69caef6b..bef5f6539c 100644 --- a/pkg/consensus/processor.go +++ b/pkg/consensus/processor.go @@ -64,7 +64,7 @@ func (p *DefaultProcessor) ProcessTipSet(ctx context.Context, parentEpoch = parent.Height() } - v, err := vm.NewVM(vmOption) + v, err := vm.NewVM(ctx, vmOption) if err != nil { return cid.Undef, nil, err } @@ -78,7 +78,7 @@ func (p *DefaultProcessor) ProcessImplicitMessage(ctx context.Context, msg *type span.AddAttributes(trace.StringAttribute("message", msg.String())) defer tracing.AddErrorEndSpan(ctx, span, &err) - v, err := vm.NewVM(vmOption) + v, err := vm.NewVM(ctx, vmOption) if err != nil { return nil, err } diff --git a/pkg/gen/genesis/genesis.go b/pkg/gen/genesis/genesis.go index 7c6abe4bdd..0385174a7e 100644 --- a/pkg/gen/genesis/genesis.go +++ b/pkg/gen/genesis/genesis.go @@ -488,9 +488,13 @@ func VerifyPreSealedData(ctx context.Context, cs *chain.Store, stateroot cid.Cid return nv } + csc := func(context.Context, abi.ChainEpoch, tree.Tree) (abi.TokenAmount, error) { + return big.Zero(), nil + } + gasPriceSchedule := gas.NewPricesSchedule(para) vmopt := vm.VmOption{ - CircSupplyCalculator: nil, + CircSupplyCalculator: csc, NtwkVersionGetter: genesisNetworkVersion, Rnd: &fakeRand{}, BaseFee: big.NewInt(0), @@ -501,7 +505,7 @@ func VerifyPreSealedData(ctx context.Context, cs *chain.Store, stateroot cid.Cid GasPriceSchedule: gasPriceSchedule, } - vm, err := vm.NewVM(vmopt) + vm, err := vm.NewVM(ctx, vmopt) if err != nil { return cid.Undef, xerrors.Errorf("failed to create NewVM: %w", err) } diff --git a/pkg/gen/genesis/miners.go b/pkg/gen/genesis/miners.go index d63d40809f..9a2864b32f 100644 --- a/pkg/gen/genesis/miners.go +++ b/pkg/gen/genesis/miners.go @@ -111,7 +111,7 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min GasPriceSchedule: gasPirceSchedule, } - vmi, err := vm.NewVM(vmopt) + vmi, err := vm.NewVM(ctx, vmopt) if err != nil { return cid.Undef, xerrors.Errorf("failed to create NewVM: %w", err) } diff --git a/pkg/statemanger/call.go b/pkg/statemanger/call.go index e461b48f7d..3d41b52dba 100644 --- a/pkg/statemanger/call.go +++ b/pkg/statemanger/call.go @@ -76,7 +76,7 @@ func (s *Stmgr) CallWithGas(ctx context.Context, msg *types.Message, priorMsgs [ Fork: s.fork, } - vmi, err := vm.NewVM(vmOption) + vmi, err := vm.NewVM(ctx, vmOption) if err != nil { return nil, err } @@ -208,7 +208,7 @@ func (s *Stmgr) Call(ctx context.Context, msg *types.Message, ts *types.TipSet) SysCallsImpl: s.syscallsImpl, } - v, err := vm.NewVM(vmOption) + v, err := vm.NewVM(ctx, vmOption) if err != nil { return nil, err } diff --git a/pkg/vm/vm.go b/pkg/vm/vm.go index 4fa4671d9d..2de5c62a99 100644 --- a/pkg/vm/vm.go +++ b/pkg/vm/vm.go @@ -1,6 +1,8 @@ package vm import ( + "context" + "github.com/filecoin-project/venus/pkg/vm/dispatch" "github.com/filecoin-project/venus/pkg/vm/register" "github.com/filecoin-project/venus/pkg/vm/vmcontext" @@ -24,12 +26,12 @@ type FakeSyscalls = vmcontext.FakeSyscalls type ChainRandomness = vmcontext.HeadChainRandomness // NewVM creates a new VM interpreter. -func NewVM(option VmOption) (Interpreter, error) { +func NewVM(ctx context.Context, option VmOption) (Interpreter, error) { if option.ActorCodeLoader == nil { option.ActorCodeLoader = &DefaultActors } - return vmcontext.NewVM(option.ActorCodeLoader, option) + return vmcontext.NewVM(ctx, option.ActorCodeLoader, option) } // DefaultActors is a code loader with the built-in actors that come with the system. diff --git a/pkg/vm/vmcontext/syscallsStateView.go b/pkg/vm/vmcontext/syscallsStateView.go index 024d7e92ae..bff43c698d 100644 --- a/pkg/vm/vmcontext/syscallsStateView.go +++ b/pkg/vm/vmcontext/syscallsStateView.go @@ -78,5 +78,5 @@ func (vm *syscallsStateView) GetNtwkVersion(ctx context.Context, ce abi.ChainEpo //GetNtwkVersion get network version func (vm *syscallsStateView) TotalFilCircSupply(height abi.ChainEpoch, st tree.Tree) (abi.TokenAmount, error) { - return vm.vmOption.CircSupplyCalculator(context.TODO(), height, st) + return vm.GetCircSupply(context.TODO()) } diff --git a/pkg/vm/vmcontext/vmcontext.go b/pkg/vm/vmcontext/vmcontext.go index 789badcd83..7749650a06 100644 --- a/pkg/vm/vmcontext/vmcontext.go +++ b/pkg/vm/vmcontext/vmcontext.go @@ -54,6 +54,8 @@ type VM struct { debugger *VMDebugMsg vmOption VmOption + baseCircSupply abi.TokenAmount + State tree.Tree } @@ -91,7 +93,7 @@ var _ VMInterpreter = (*VM)(nil) // NewVM creates a new runtime for executing messages. // Dragons: change To take a root and the store, build the tree internally -func NewVM(actorImpls ActorImplLookup, vmOption VmOption) (*VM, error) { +func NewVM(ctx context.Context, actorImpls ActorImplLookup, vmOption VmOption) (*VM, error) { buf := blockstoreutil.NewBufferedBstore(vmOption.Bsstore) cst := cbor.NewCborStore(buf) var st tree.Tree @@ -109,13 +111,19 @@ func NewVM(actorImpls ActorImplLookup, vmOption VmOption) (*VM, error) { } } + baseCirc, err := vmOption.CircSupplyCalculator(ctx, vmOption.Epoch, st) + if err != nil { + return nil, err + } + return &VM{ - context: context.Background(), - actorImpls: actorImpls, - bsstore: buf, - store: cst, - State: st, - vmOption: vmOption, + context: context.Background(), + actorImpls: actorImpls, + bsstore: buf, + store: cst, + State: st, + vmOption: vmOption, + baseCircSupply: baseCirc, // loaded during execution // currentEpoch: .., }, nil @@ -764,6 +772,15 @@ func (vm *VM) StateTree() tree.Tree { return vm.State } +func (vm *VM) GetCircSupply(ctx context.Context) (abi.TokenAmount, error) { + // Before v15, this was recalculated on each invocation as the state tree was mutated + if vm.vmOption.NtwkVersionGetter(ctx, vm.vmOption.Epoch) <= network.Version14 { + return vm.vmOption.CircSupplyCalculator(ctx, vm.vmOption.Epoch, vm.State) + } + + return vm.baseCircSupply, nil +} + func deductFunds(act *types.Actor, amt abi.TokenAmount) error { if act.Balance.LessThan(amt) { return fmt.Errorf("not enough funds") diff --git a/tools/conformance/driver.go b/tools/conformance/driver.go index 4095559033..ce644a7bd6 100644 --- a/tools/conformance/driver.go +++ b/tools/conformance/driver.go @@ -114,15 +114,9 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, chainDs ds.Batching, pr return nil, err } var ( - caculator = chain.NewCirculatingSupplyCalculator(bs, cid.Undef, mainNetParams.Network.ForkUpgradeParam) - vmOption = vm.VmOption{ - CircSupplyCalculator: func(ctx context.Context, epoch abi.ChainEpoch, tree tree.Tree) (abi.TokenAmount, error) { - dertail, err := caculator.GetCirculatingSupplyDetailed(ctx, epoch, tree) - if err != nil { - return abi.TokenAmount{}, err - } - return dertail.FilCirculating, nil + CircSupplyCalculator: func(context.Context, abi.ChainEpoch, tree.Tree) (abi.TokenAmount, error) { + return big.Zero(), nil }, LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(chainStore, chainFork, nil), NtwkVersionGetter: chainFork.GetNtwkVersion, @@ -137,7 +131,7 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, chainDs ds.Batching, pr } ) - lvm, err := vm.NewVM(vmOption) + lvm, err := vm.NewVM(context.Background(), vmOption) if err != nil { return nil, err } @@ -293,7 +287,7 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP } ) - lvm, err := vm.NewVM(vmOption) + lvm, err := vm.NewVM(context.TODO(), vmOption) if err != nil { return nil, cid.Undef, err } diff --git a/tools/gengen/util/generator.go b/tools/gengen/util/generator.go index 1292abb2ca..fa3950ce7b 100644 --- a/tools/gengen/util/generator.go +++ b/tools/gengen/util/generator.go @@ -7,6 +7,9 @@ import ( "io" mrand "math/rand" + "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" + "github.com/filecoin-project/venus/pkg/vm/vmcontext" + "github.com/filecoin-project/venus/pkg/fork" "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" "github.com/filecoin-project/venus/pkg/vm/vmcontext" @@ -97,7 +100,7 @@ func NewGenesisGenerator(bs blockstore.Blockstore) *GenesisGenerator { SysCallsImpl: syscallImpl, Fork: chainFork, } - vm, err := vm.NewVM(vmOption) + vm, err := vm.NewVM(context.Background(), vmOption) if err != nil { panic(xerrors.Errorf("create state error, should never come here")) } From 2e07619b87e8ec0453b09f5372d7cfdf33e46590 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Fri, 31 Dec 2021 18:12:25 +0800 Subject: [PATCH 091/167] inline coed gen (#4663) * inline coed gen * fix test --- Makefile | 3 + pkg/constants/shared_vals.go | 9 ++ pkg/state/tree/state.go | 8 ++ pkg/vm/register/default.go | 17 ++- tools/gengen/util/generator.go | 3 - venus-devtool/go.mod | 2 - venus-devtool/inline-gen/inlinegen-data.json | 7 + venus-devtool/inline-gen/main.go | 130 ++++++++++++++++++ venus-shared/api/proxy_util_test.go | 3 + venus-shared/chain/actor_test.go | 2 + venus-shared/chain/beacon_test.go | 2 + venus-shared/chain/bigint_fil_test.go | 6 + venus-shared/chain/bigint_test.go | 4 + venus-shared/chain/bigint_unit_test.go | 4 + venus-shared/chain/block_header_test.go | 3 + venus-shared/chain/block_message_test.go | 4 +- venus-shared/chain/block_msg_test.go | 2 + venus-shared/chain/complex_provider_test.go | 16 ++- venus-shared/chain/election_proof_test.go | 3 + venus-shared/chain/message_receipt_test.go | 2 + venus-shared/chain/message_root_test.go | 2 + venus-shared/chain/message_test.go | 3 + venus-shared/chain/signed_message.go | 1 + venus-shared/chain/signed_message_test.go | 2 + venus-shared/chain/tipset_exp_tipset_test.go | 2 + venus-shared/chain/tipset_key_test.go | 2 + venus-shared/chain/tipset_marshal_test.go | 4 + venus-shared/chain/tipset_test.go | 6 +- venus-shared/libp2p/hello/hello_test.go | 3 + venus-shared/testutil/cbor_basic_test.go | 4 + .../testutil/value_provdier_chain_test.go | 17 +++ .../testutil/value_provider_primitive_test.go | 37 +++++ .../testutil/value_provider_registry_test.go | 3 + .../testutil/value_set_n_reset_test.go | 3 + venus-shared/typeutil/fields_test.go | 3 + venus-shared/typeutil/methods_test.go | 3 +- venus-shared/typeutil/similar_test.go | 13 ++ 37 files changed, 322 insertions(+), 16 deletions(-) create mode 100644 venus-devtool/inline-gen/inlinegen-data.json create mode 100644 venus-devtool/inline-gen/main.go diff --git a/Makefile b/Makefile index 9df6315f65..fe8e0ec1f5 100644 --- a/Makefile +++ b/Makefile @@ -58,6 +58,9 @@ cborgen: gogen: cd venus-shared && go generate ./... +inline-gen: + cd venus-devtool && go run ./inline-gen/main.go ../ ./inline-gen/inlinegen-data.json + test-venus-shared: cd venus-shared && go test -covermode=set ./... diff --git a/pkg/constants/shared_vals.go b/pkg/constants/shared_vals.go index f2ce993820..aca034901a 100644 --- a/pkg/constants/shared_vals.go +++ b/pkg/constants/shared_vals.go @@ -14,8 +14,17 @@ import ( // Consensus / Network const AllowableClockDriftSecs = uint64(1) + +/* inline-gen template + +const NewestNetworkVersion = network.Version{{.latestNetworkVersion}} + +/* inline-gen start */ + const NewestNetworkVersion = network.Version15 +/* inline-gen end */ + // constants for Weight calculation // The ratio of weight contributed by short-term vs long-term factors in a given round const WRatioNum = int64(1) diff --git a/pkg/state/tree/state.go b/pkg/state/tree/state.go index 94ff206590..3e324b48d6 100644 --- a/pkg/state/tree/state.go +++ b/pkg/state/tree/state.go @@ -137,7 +137,15 @@ func VersionForNetwork(ver network.Version) (StateTreeVersion, error) { return StateTreeVersion2, nil case network.Version12: return StateTreeVersion3, nil + + /* inline-gen template + {{$lastNv := .latestNetworkVersion}} + case{{range .networkVersions}} {{if (ge . 13.)}} network.Version{{.}}{{if (lt . $lastNv)}},{{end}}{{end}}{{end}}: + /* inline-gen start */ + case network.Version13, network.Version14, network.Version15: + /* inline-gen end */ + return StateTreeVersion4, nil default: panic(fmt.Sprintf("unsupported network version %d", ver)) diff --git a/pkg/vm/register/default.go b/pkg/vm/register/default.go index 03a699a2ce..ed593f41bc 100644 --- a/pkg/vm/register/default.go +++ b/pkg/vm/register/default.go @@ -1,8 +1,10 @@ package register import ( - "github.com/filecoin-project/venus/pkg/vm/dispatch" - "github.com/filecoin-project/venus/venus-shared/actors" + /* inline-gen template + {{range .actorVersions}} + exported{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin/exported"{{end}} + /* inline-gen start */ exported0 "github.com/filecoin-project/specs-actors/actors/builtin/exported" exported2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/exported" @@ -11,6 +13,10 @@ import ( exported5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/exported" exported6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/exported" exported7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/exported" + /* inline-gen end */ + + "github.com/filecoin-project/venus/pkg/vm/dispatch" + "github.com/filecoin-project/venus/venus-shared/actors" ) // DefaultActors is list of all actors that ship with Filecoin. @@ -20,6 +26,11 @@ var DefaultActorBuilder = dispatch.NewBuilder() var DefaultActors dispatch.CodeLoader func init() { + /* inline-gen template + {{range .actorVersions}} + DefaultActorBuilder.AddMany(dispatch.ActorsVersionPredicate(actors.Version{{.}}), exported{{.}}.BuiltinActors()...){{end}} + /* inline-gen start */ + DefaultActorBuilder.AddMany(dispatch.ActorsVersionPredicate(actors.Version0), exported0.BuiltinActors()...) DefaultActorBuilder.AddMany(dispatch.ActorsVersionPredicate(actors.Version2), exported2.BuiltinActors()...) DefaultActorBuilder.AddMany(dispatch.ActorsVersionPredicate(actors.Version3), exported3.BuiltinActors()...) @@ -27,5 +38,7 @@ func init() { DefaultActorBuilder.AddMany(dispatch.ActorsVersionPredicate(actors.Version5), exported5.BuiltinActors()...) DefaultActorBuilder.AddMany(dispatch.ActorsVersionPredicate(actors.Version6), exported6.BuiltinActors()...) DefaultActorBuilder.AddMany(dispatch.ActorsVersionPredicate(actors.Version7), exported7.BuiltinActors()...) + /* inline-gen end */ + DefaultActors = DefaultActorBuilder.Build() } diff --git a/tools/gengen/util/generator.go b/tools/gengen/util/generator.go index fa3950ce7b..df7fd63574 100644 --- a/tools/gengen/util/generator.go +++ b/tools/gengen/util/generator.go @@ -7,9 +7,6 @@ import ( "io" mrand "math/rand" - "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" - "github.com/filecoin-project/venus/pkg/vm/vmcontext" - "github.com/filecoin-project/venus/pkg/fork" "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" "github.com/filecoin-project/venus/pkg/vm/vmcontext" diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index 7a8969af8c..d5ef15c0ac 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -11,7 +11,6 @@ require ( github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/lotus v1.13.2-0.20211213233817-8a4246227153 github.com/filecoin-project/venus v0.0.0-00010101000000-000000000000 - github.com/filecoin-project/venus/venus-shared v0.0.0-00010101000000-000000000000 github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-graphsync v0.10.6 github.com/ipfs/go-ipfs-http-client v0.1.0 // indirect @@ -27,7 +26,6 @@ require ( replace ( github.com/filecoin-project/go-jsonrpc => github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc github.com/filecoin-project/venus => ../ - github.com/filecoin-project/venus/venus-shared => ../venus-shared/ github.com/ipfs/go-ipfs-cmds => github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab github.com/multiformats/go-multiaddr => github.com/multiformats/go-multiaddr v0.3.0 ) diff --git a/venus-devtool/inline-gen/inlinegen-data.json b/venus-devtool/inline-gen/inlinegen-data.json new file mode 100644 index 0000000000..dcabba3484 --- /dev/null +++ b/venus-devtool/inline-gen/inlinegen-data.json @@ -0,0 +1,7 @@ +{ + "actorVersions": [0, 2, 3, 4, 5, 6, 7], + "latestActorsVersion": 7, + + "networkVersions": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + "latestNetworkVersion": 15 +} \ No newline at end of file diff --git a/venus-devtool/inline-gen/main.go b/venus-devtool/inline-gen/main.go new file mode 100644 index 0000000000..e8a652209f --- /dev/null +++ b/venus-devtool/inline-gen/main.go @@ -0,0 +1,130 @@ +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "io/fs" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "strings" + "text/template" +) + +const ( + stateGlobal = iota + stateTemplate + stateGen +) + +func main() { + db, err := ioutil.ReadFile(os.Args[2]) + if err != nil { + panic(err) + } + var data map[string]interface{} + if err := json.Unmarshal(db, &data); err != nil { + panic(err) + } + + err = filepath.WalkDir(os.Args[1], func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() { + return nil + } + if filepath.Ext(path) != ".go" { + return nil + } + fb, err := ioutil.ReadFile(path) + if err != nil { + return err + } + + lines := strings.Split(string(fb), "\n") + + outLines := make([]string, 0, len(lines)) + var templateLines []string + + state := stateGlobal + + rewrite := false + + for i, line := range lines { + ln := i + 1 + switch state { + case stateGlobal: + outLines = append(outLines, line) + if strings.TrimSpace(line) == `/* inline-gen template` { + state = stateTemplate + fmt.Printf("template section start %s:%d\n", path, ln) + } + case stateTemplate: + outLines = append(outLines, line) // output all template lines + + if strings.TrimSpace(line) == `/* inline-gen start */` { + state = stateGen + fmt.Printf("generated section start %s:%d\n", path, ln) + continue + } + templateLines = append(templateLines, line) + case stateGen: + if strings.TrimSpace(line) != `/* inline-gen end */` { + continue + } + fmt.Printf("generated section end %s:%d\n", path, ln) + + state = stateGlobal + rewrite = true + + tpl, err := template.New("").Funcs(template.FuncMap{ + "import": func(v float64) string { + if v == 0 { + return "/" + } + return fmt.Sprintf("/v%d/", int(v)) + }, + "add": func(a, b float64) float64 { + return a + b + }, + }).Parse(strings.Join(templateLines, "\n")) + if err != nil { + fmt.Printf("%s:%d: parsing template: %s\n", path, ln, err) + os.Exit(1) + } + + var b bytes.Buffer + err = tpl.Execute(&b, data) + if err != nil { + fmt.Printf("%s:%d: executing template: %s\n", path, ln, err) + os.Exit(1) + } + + outLines = append(outLines, strings.Split(b.String(), "\n")...) + outLines = append(outLines, line) + templateLines = nil + } + } + + if rewrite { + fmt.Printf("write %s\n", path) + if err := ioutil.WriteFile(path, []byte(strings.Join(outLines, "\n")), 0664); err != nil { + return err + } + + fmtFile(path) + } + + return nil + }) + if err != nil { + panic(err) + } +} + +func fmtFile(path string) { + exec.Command("gofmt", "-s", "-l", "-w", path).Run() +} diff --git a/venus-shared/api/proxy_util_test.go b/venus-shared/api/proxy_util_test.go index 3cbc466b6a..bf9a4c0c06 100644 --- a/venus-shared/api/proxy_util_test.go +++ b/venus-shared/api/proxy_util_test.go @@ -3,6 +3,7 @@ package api import ( "testing" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/stretchr/testify/require" ) @@ -29,6 +30,7 @@ type StrC struct { } func TestGetInternalStructs(t *testing.T) { + tf.UnitTest(t) var proxy StrA sts := GetInternalStructs(&proxy) @@ -44,6 +46,7 @@ func TestGetInternalStructs(t *testing.T) { } func TestNestedInternalStructs(t *testing.T) { + tf.UnitTest(t) var proxy StrC // check that only the top-level internal struct gets picked up diff --git a/venus-shared/chain/actor_test.go b/venus-shared/chain/actor_test.go index 60d300ca2c..dbeb099f0c 100644 --- a/venus-shared/chain/actor_test.go +++ b/venus-shared/chain/actor_test.go @@ -7,10 +7,12 @@ import ( "github.com/ipfs/go-cid" "github.com/stretchr/testify/require" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/venus-shared/testutil" ) func TestActorBasic(t *testing.T) { + tf.UnitTest(t) var buf bytes.Buffer for i := 0; i < 32; i++ { var src, dst Actor diff --git a/venus-shared/chain/beacon_test.go b/venus-shared/chain/beacon_test.go index f9784564c2..09be937ff2 100644 --- a/venus-shared/chain/beacon_test.go +++ b/venus-shared/chain/beacon_test.go @@ -6,10 +6,12 @@ import ( "github.com/stretchr/testify/require" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/venus-shared/testutil" ) func TestBeaconEntryBasic(t *testing.T) { + tf.UnitTest(t) dataLen := 32 var buf bytes.Buffer diff --git a/venus-shared/chain/bigint_fil_test.go b/venus-shared/chain/bigint_fil_test.go index 597e6e836c..c9ef06902b 100644 --- a/venus-shared/chain/bigint_fil_test.go +++ b/venus-shared/chain/bigint_fil_test.go @@ -4,12 +4,14 @@ import ( "strings" "testing" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/venus-shared/chain/params" "github.com/filecoin-project/venus/venus-shared/testutil" "github.com/stretchr/testify/require" ) func TestFilRoundTrip(t *testing.T) { + tf.UnitTest(t) testValues := []string{ "0 FIL", "1 FIL", "1.001 FIL", "100.10001 FIL", "101100 FIL", "5000.01 FIL", "5000 FIL", strings.Repeat("1", 50) + " FIL", @@ -33,6 +35,7 @@ func TestFilRoundTrip(t *testing.T) { } func TestParseAttoFils(t *testing.T) { + tf.UnitTest(t) testValues := []string{ "0 aFIL", "1 aFIL", "1 aFIL", "100 aFIL", "101100 aFIL", "5000 aFIL", "0 attoFIL", "1 attoFIL", "1 attoFIL", "100 attoFIL", "101100 attoFIL", "5000 attoFIL", @@ -52,6 +55,7 @@ func TestParseAttoFils(t *testing.T) { } func TestInvalidFILString(t *testing.T) { + tf.UnitTest(t) testValues := []string{ "0 nFIL", "1 nFIL", "1.001 nFIL", "100.10001 nFIL", "101100 nFIL", "5000.01 nFIL", "5000 nFIL", "1.001.1 FIL", @@ -65,6 +69,7 @@ func TestInvalidFILString(t *testing.T) { } func TestBigFromFIL(t *testing.T) { + tf.UnitTest(t) ratio := NewInt(params.FilecoinPrecision) nums := make([]uint64, 32) @@ -78,6 +83,7 @@ func TestBigFromFIL(t *testing.T) { } func TestFilShort(t *testing.T) { + tf.UnitTest(t) for _, s := range []struct { fil string expect string diff --git a/venus-shared/chain/bigint_test.go b/venus-shared/chain/bigint_test.go index 49184fe3bc..5ae880d076 100644 --- a/venus-shared/chain/bigint_test.go +++ b/venus-shared/chain/bigint_test.go @@ -4,11 +4,13 @@ import ( "bytes" "testing" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/venus-shared/testutil" "github.com/stretchr/testify/require" ) func TestBigIntSerializationRoundTrip(t *testing.T) { + tf.UnitTest(t) testValues := []string{ "0", "1", "10", "-10", "9999", "12345678901234567891234567890123456789012345678901234567890", } @@ -37,6 +39,7 @@ func TestBigIntSerializationRoundTrip(t *testing.T) { } func TestBigIntParseErr(t *testing.T) { + tf.UnitTest(t) testValues := []string{ "a0", "1b", "10c", "-1d0", "9e999", "f12345678901234567891234567890123456789012345678901234567890", } @@ -48,6 +51,7 @@ func TestBigIntParseErr(t *testing.T) { } func TestBigIntCalculating(t *testing.T) { + tf.UnitTest(t) zero := NewInt(0) maxProvideAttempts := 8 for i := 0; i < 32; i++ { diff --git a/venus-shared/chain/bigint_unit_test.go b/venus-shared/chain/bigint_unit_test.go index f2037a03b0..3b86094797 100644 --- a/venus-shared/chain/bigint_unit_test.go +++ b/venus-shared/chain/bigint_unit_test.go @@ -9,10 +9,12 @@ import ( "github.com/docker/go-units" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/stretchr/testify/require" ) func TestUnitStrs(t *testing.T) { + tf.UnitTest(t) cases := []struct { in uint64 size string @@ -35,6 +37,7 @@ func TestUnitStrs(t *testing.T) { } func TestSizeStrUnitsSymmetry(t *testing.T) { + tf.UnitTest(t) s := rand.NewSource(time.Now().UnixNano()) r := rand.New(s) @@ -51,6 +54,7 @@ func TestSizeStrUnitsSymmetry(t *testing.T) { } func TestSizeStrBig(t *testing.T) { + tf.UnitTest(t) ZiB := big.NewInt(50000) ZiB = ZiB.Lsh(ZiB, 70) diff --git a/venus-shared/chain/block_header_test.go b/venus-shared/chain/block_header_test.go index df43d20de6..7b5bf75175 100644 --- a/venus-shared/chain/block_header_test.go +++ b/venus-shared/chain/block_header_test.go @@ -9,10 +9,12 @@ import ( "github.com/ipfs/go-cid" "github.com/stretchr/testify/require" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/venus-shared/testutil" ) func TestBlockHeaderMarshal(t *testing.T) { + tf.UnitTest(t) const mdata = "f021344" const cdata = "bafy2bzaced35aqx5wnwp4ohegreumsheigitrhcqlr3lmz4phyzwikmi44sww" const bdata = "904400e0a601815860b48541b503b47535334553bf0d1fc702d395133e28b48bbae7550e955025ee09f642cb82c79de036099c657b7efb78e10b685aa99d817f6e560805787c5df894ac6758b0d68c72fb498113a5e763ef65d5bff576cd7fc3a847684a410b89c63c82025860a233b638f28312f9014728cf42e2c353bbf2031506488fa3192d137881e8b9666a2d131218e96b51b701f826940ef6630ae13b20c7bf115155e349c88363949fd7704f8026c3c3b1f872d9085e912856d2b56b8ce8a6fb8cf4e996aaa8476e2c81821a001506545860a699f4d93c54d66d46a46cab8da059fbf7ef82e40dd19a67fc1c5a402422304e7b8eec5c2dc6107e0cf1be676f12ce9b05675160e1c66f0ae5ebcf056e303ca39aa813acd5403844604b51f1e3dd5fcd271978346b85cdfa6d75cb46e2c6609581820358c09095232420f9caff389c0709ace12897ad0b5734b104011849e0f008febf39d8c64079236d3e75c24c08a613bcd946538a4b966b3c5a79cf61832c673f2ec90d22d02c16e28073c20995f5259567736d6e6f2fee588c7c23ca1946d753a783fe14404c3f4684a0a7cf5ceadc8a7a2cd9ad0387b96608eca6d3604ed7beb948f7fa2e235f1d611114f66752c6c36ac9aeb17c2f36d70accbd7554678034381486a1a95ea36db4dc549ee152a00c1b454da4f47b33327609be8b055f14681a2edf84d82a5827000171a0e4022084da38b952ab5644c5418c3305b3c22b5eca92eab9e23cdb675163773a964c53d82a5827000171a0e402201ef87dc542d008d961a30a36935a06d28ef05e4ed5e22f7779c4f3f8002c451dd82a5827000171a0e4022079bfefc62c740cda4b0463ceba68e9613c5c47ef7bbed968b179763ae7978bf4d82a5827000171a0e402202f9becc403d7228035f153d9cba42db472ed3c1cb3f22c7ae02eaaabca53e80f460001d7dbb8171a00067680d82a5827000171a0e402204f2120d6581f3d69a5d62e25dd993d1825ce6a446ffa801a4092e7e3a28d4b73d82a5827000171a0e402204bc482ae9a6a1afd1a252264a4bcae9fb2150faf9910b80703e9fbb91ab041e3d82a5827000171a0e4022017d2c80f5b157b61e96ea4ef3888762fa81a9a853bffa624f4bfb9c388859a88586102b3f7f6dc71591af0a61bbcad978178fc123a6edbec959716c028ec976b997df83af557a5ad1d05544d5ce82e5461c562196ea998b437bf0ceb7965871bd6d9e16a2df9cfaaf50b627f5a406d344f1ae0d8e0eaa5835f9c092fe24681cbc7761d1a618f1680586102920f0a831f86073b12641e6c880ddc2823a9c7b1b14b56f7995eaafc35df9c8f3066cd3ab9693c53b388e4c46d7680b50dcd242471d763a5114274c475eeb7d6561e35f51db3b6ac46c4fb8f4218ddc6d6fae3c1cd09fa70c21e6e87bd94e33100420064" @@ -53,6 +55,7 @@ func TestBlockHeaderMarshal(t *testing.T) { } func TestBlockHeaderBasic(t *testing.T) { + tf.UnitTest(t) var buf bytes.Buffer sliceLen := 5 bytesLen := 32 diff --git a/venus-shared/chain/block_message_test.go b/venus-shared/chain/block_message_test.go index 25b93fa8a0..be92e26733 100644 --- a/venus-shared/chain/block_message_test.go +++ b/venus-shared/chain/block_message_test.go @@ -2,8 +2,10 @@ package chain import ( "testing" + + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" ) func TestBlockMessageBasic(t *testing.T) { - // todo + tf.UnitTest(t) } diff --git a/venus-shared/chain/block_msg_test.go b/venus-shared/chain/block_msg_test.go index 1cab63cff9..b18e6f7d37 100644 --- a/venus-shared/chain/block_msg_test.go +++ b/venus-shared/chain/block_msg_test.go @@ -8,10 +8,12 @@ import ( "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/abi" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/venus-shared/testutil" ) func TestBlockMsgBasic(t *testing.T) { + tf.UnitTest(t) msgLen := 16 emptyCids := make([]cid.Cid, msgLen) diff --git a/venus-shared/chain/complex_provider_test.go b/venus-shared/chain/complex_provider_test.go index 201c00a12a..b237d4bdfd 100644 --- a/venus-shared/chain/complex_provider_test.go +++ b/venus-shared/chain/complex_provider_test.go @@ -1,34 +1,40 @@ package chain import ( + "testing" + + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/venus-shared/testutil" "github.com/stretchr/testify/require" - "testing" ) func TestTipsetProvider(t *testing.T) { + tf.UnitTest(t) var tipset = &TipSet{} testutil.Provide(t, &tipset) require.Greater(t, len(tipset.blocks), 0, "blocks in a tipset must greater than 0") } func TestMessageProvider(t *testing.T) { + tf.UnitTest(t) var message *Message testutil.Provide(t, &message) require.NotEqual(t, message.Cid().String(), "", "message cid can't be empty") } func TestBlockProvider(t *testing.T) { + tf.UnitTest(t) var block *BlockHeader testutil.Provide(t, &block) require.NotNil(t, block, "block must not be nil") } func TestComplexProvider(t *testing.T) { - tests := map[string]func(*testing.T) { - "Tipset":TestTipsetProvider, - "Message":TestMessageProvider, - "Block":TestBlockProvider, + tf.UnitTest(t) + tests := map[string]func(*testing.T){ + "Tipset": TestTipsetProvider, + "Message": TestMessageProvider, + "Block": TestBlockProvider, } for testName, f := range tests { t.Run(testName, f) diff --git a/venus-shared/chain/election_proof_test.go b/venus-shared/chain/election_proof_test.go index 8376836813..ab30cfd0cc 100644 --- a/venus-shared/chain/election_proof_test.go +++ b/venus-shared/chain/election_proof_test.go @@ -8,11 +8,13 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/venus-shared/chain/params" "github.com/filecoin-project/venus/venus-shared/testutil" ) func TestElectionProofBasic(t *testing.T) { + tf.UnitTest(t) vrfLen := 32 winCountMin := int64(3) winCountMax := int64(10) @@ -69,6 +71,7 @@ func TestElectionProofBasic(t *testing.T) { } func TestTicketBasic(t *testing.T) { + tf.UnitTest(t) vrfLen := 32 var buf bytes.Buffer for i := 0; i < 32; i++ { diff --git a/venus-shared/chain/message_receipt_test.go b/venus-shared/chain/message_receipt_test.go index 4d7d166626..da9c223edb 100644 --- a/venus-shared/chain/message_receipt_test.go +++ b/venus-shared/chain/message_receipt_test.go @@ -7,10 +7,12 @@ import ( "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/exitcode" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/venus-shared/testutil" ) func TestMessageReceiptBasic(t *testing.T) { + tf.UnitTest(t) dataLen := 32 var buf bytes.Buffer diff --git a/venus-shared/chain/message_root_test.go b/venus-shared/chain/message_root_test.go index edbcda7f79..3b5fb06527 100644 --- a/venus-shared/chain/message_root_test.go +++ b/venus-shared/chain/message_root_test.go @@ -7,10 +7,12 @@ import ( "github.com/ipfs/go-cid" "github.com/stretchr/testify/require" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/venus-shared/testutil" ) func TestMessageRootBasic(t *testing.T) { + tf.UnitTest(t) var buf bytes.Buffer for i := 0; i < 32; i++ { var src, dst MessageRoot diff --git a/venus-shared/chain/message_test.go b/venus-shared/chain/message_test.go index 35a8dc7447..94349972fd 100644 --- a/venus-shared/chain/message_test.go +++ b/venus-shared/chain/message_test.go @@ -7,6 +7,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/network" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/venus-shared/chain/params" "github.com/filecoin-project/venus/venus-shared/testutil" blocks "github.com/ipfs/go-block-format" @@ -14,6 +15,7 @@ import ( ) func TestMessageBasic(t *testing.T) { + tf.UnitTest(t) paramsLen := 32 var buf bytes.Buffer for i := 0; i < 32; i++ { @@ -64,6 +66,7 @@ func TestMessageBasic(t *testing.T) { } func TestMessageValidForBlockInclusion(t *testing.T) { + tf.UnitTest(t) var msg Message testutil.Provide( t, diff --git a/venus-shared/chain/signed_message.go b/venus-shared/chain/signed_message.go index 7e719c82c4..c4e79e576f 100644 --- a/venus-shared/chain/signed_message.go +++ b/venus-shared/chain/signed_message.go @@ -17,6 +17,7 @@ type SignedMessage struct { Signature crypto.Signature } +// nolint func (smsg *SignedMessage) ChainLength() int { var data []byte var err error diff --git a/venus-shared/chain/signed_message_test.go b/venus-shared/chain/signed_message_test.go index 059cf99a77..49efb85e09 100644 --- a/venus-shared/chain/signed_message_test.go +++ b/venus-shared/chain/signed_message_test.go @@ -7,10 +7,12 @@ import ( "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/crypto" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/venus-shared/testutil" ) func TestSignedMessageBasic(t *testing.T) { + tf.UnitTest(t) sliceLen := 16 bytesLen := 32 diff --git a/venus-shared/chain/tipset_exp_tipset_test.go b/venus-shared/chain/tipset_exp_tipset_test.go index 5db36aafc5..ebd4096db7 100644 --- a/venus-shared/chain/tipset_exp_tipset_test.go +++ b/venus-shared/chain/tipset_exp_tipset_test.go @@ -6,10 +6,12 @@ import ( "github.com/stretchr/testify/require" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/venus-shared/testutil" ) func TestExpTipSet(t *testing.T) { + tf.UnitTest(t) sliceLen := 5 bytesLen := 32 diff --git a/venus-shared/chain/tipset_key_test.go b/venus-shared/chain/tipset_key_test.go index b623ef7c8e..00a8a3377d 100644 --- a/venus-shared/chain/tipset_key_test.go +++ b/venus-shared/chain/tipset_key_test.go @@ -6,10 +6,12 @@ import ( "github.com/ipfs/go-cid" "github.com/stretchr/testify/require" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/venus-shared/testutil" ) func TestTipSetKey(t *testing.T) { + tf.UnitTest(t) var cids []cid.Cid cidNum := 10 diff --git a/venus-shared/chain/tipset_marshal_test.go b/venus-shared/chain/tipset_marshal_test.go index cd14b1e73e..71d5545ddb 100644 --- a/venus-shared/chain/tipset_marshal_test.go +++ b/venus-shared/chain/tipset_marshal_test.go @@ -5,6 +5,7 @@ import ( "encoding/json" "testing" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/venus-shared/testutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -22,6 +23,7 @@ func checkForTipSetEqual(t *testing.T, a, b *TipSet) { } func TestTipSetMarshalJSON(t *testing.T) { + tf.UnitTest(t) height, paretns, weight := constructTipSetKeyInfos(t) ts := constructTipSet(t, height, paretns, weight) @@ -36,6 +38,7 @@ func TestTipSetMarshalJSON(t *testing.T) { } func TestTipSetEquals(t *testing.T) { + tf.UnitTest(t) height, paretns, weight := constructTipSetKeyInfos(t) ts := constructTipSet(t, height, paretns, weight) @@ -44,6 +47,7 @@ func TestTipSetEquals(t *testing.T) { } func TestTipSetBasic(t *testing.T) { + tf.UnitTest(t) var buf bytes.Buffer for i := 0; i < 32; i++ { diff --git a/venus-shared/chain/tipset_test.go b/venus-shared/chain/tipset_test.go index 25379d337a..1231a1a9f3 100644 --- a/venus-shared/chain/tipset_test.go +++ b/venus-shared/chain/tipset_test.go @@ -6,10 +6,10 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + "github.com/filecoin-project/venus/venus-shared/testutil" "github.com/ipfs/go-cid" "github.com/stretchr/testify/require" - - "github.com/filecoin-project/venus/venus-shared/testutil" ) const ( @@ -97,11 +97,13 @@ func constructTipSet(t *testing.T, height abi.ChainEpoch, parents []cid.Cid, par } func TestTipSetConstruct(t *testing.T) { + tf.UnitTest(t) height, parents, parentWeight := constructTipSetKeyInfos(t) constructTipSet(t, height, parents, parentWeight) } func TestTipSetMethods(t *testing.T) { + tf.UnitTest(t) height, parents, parentWeight := constructTipSetKeyInfos(t) ts := constructTipSet(t, height, parents, parentWeight) diff --git a/venus-shared/libp2p/hello/hello_test.go b/venus-shared/libp2p/hello/hello_test.go index 717e2827ad..844048fc64 100644 --- a/venus-shared/libp2p/hello/hello_test.go +++ b/venus-shared/libp2p/hello/hello_test.go @@ -8,10 +8,12 @@ import ( "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/big" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/venus-shared/testutil" ) func TestGreetingMessage(t *testing.T) { + tf.UnitTest(t) var buf bytes.Buffer sliceLen := 5 @@ -45,6 +47,7 @@ func TestGreetingMessage(t *testing.T) { } func TestLatencyMessage(t *testing.T) { + tf.UnitTest(t) var buf bytes.Buffer for i := 0; i < 32; i++ { diff --git a/venus-shared/testutil/cbor_basic_test.go b/venus-shared/testutil/cbor_basic_test.go index 0833481a02..37972d83fb 100644 --- a/venus-shared/testutil/cbor_basic_test.go +++ b/venus-shared/testutil/cbor_basic_test.go @@ -6,9 +6,12 @@ import ( "github.com/filecoin-project/go-address" "github.com/stretchr/testify/require" + + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" ) func TestCborBasicForAddress(t *testing.T) { + tf.UnitTest(t) var buf bytes.Buffer for i := 0; i < 16; i++ { var src, dst address.Address @@ -38,6 +41,7 @@ func TestCborBasicForAddress(t *testing.T) { } func TestCborBasicForIDAddress(t *testing.T) { + tf.UnitTest(t) var buf bytes.Buffer for i := 0; i < 16; i++ { var src, dst address.Address diff --git a/venus-shared/testutil/value_provdier_chain_test.go b/venus-shared/testutil/value_provdier_chain_test.go index e3826d51ca..6f709edfb5 100644 --- a/venus-shared/testutil/value_provdier_chain_test.go +++ b/venus-shared/testutil/value_provdier_chain_test.go @@ -7,17 +7,20 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/crypto" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/ipfs/go-cid" "github.com/stretchr/testify/require" ) func TestDefaultCid(t *testing.T) { + tf.UnitTest(t) var c cid.Cid Provide(t, &c) require.NotEqual(t, cid.Undef, c) } func TestDefaultCidSlice(t *testing.T) { + tf.UnitTest(t) cs := make([]cid.Cid, 16) Provide(t, &cs) for ci := range cs { @@ -26,6 +29,7 @@ func TestDefaultCidSlice(t *testing.T) { } func TestDefaultAddresses(t *testing.T) { + tf.UnitTest(t) addrs := make([]address.Address, 256) protos := map[address.Protocol]struct{}{} Provide(t, &addrs) @@ -37,6 +41,7 @@ func TestDefaultAddresses(t *testing.T) { } func TestDefaultIDAddresses(t *testing.T) { + tf.UnitTest(t) addrs := make([]address.Address, 256) protos := map[address.Protocol]struct{}{} Provide(t, &addrs, IDAddressProvider()) @@ -48,6 +53,7 @@ func TestDefaultIDAddresses(t *testing.T) { } func TestDefaultBigs(t *testing.T) { + tf.UnitTest(t) bigs := make([]big.Int, 256) Provide(t, &bigs) hasPositive := false @@ -63,6 +69,7 @@ func TestDefaultBigs(t *testing.T) { } func TestPositiveBigs(t *testing.T) { + tf.UnitTest(t) bigs := make([]big.Int, 256) Provide(t, &bigs, PositiveBigProvider()) for bi := range bigs { @@ -72,6 +79,8 @@ func TestPositiveBigs(t *testing.T) { } func TestNegativeBigs(t *testing.T) { + tf.UnitTest(t) + bigs := make([]big.Int, 256) Provide(t, &bigs, NegativeBigProvider()) for bi := range bigs { @@ -81,6 +90,8 @@ func TestNegativeBigs(t *testing.T) { } func TestDefaultSigTypes(t *testing.T) { + tf.UnitTest(t) + sigtyps := make([]crypto.SigType, 256) Provide(t, &sigtyps) typs := map[crypto.SigType]struct{}{} @@ -92,6 +103,8 @@ func TestDefaultSigTypes(t *testing.T) { } func TestDefaultPaddedSize(t *testing.T) { + tf.UnitTest(t) + psizes := make([]abi.PaddedPieceSize, 32) Provide(t, &psizes) for i := range psizes { @@ -100,6 +113,8 @@ func TestDefaultPaddedSize(t *testing.T) { } func TestFixedPaddedSize(t *testing.T) { + tf.UnitTest(t) + shifts := make([]int, 32) Provide(t, &shifts, IntRangedProvider(1, 50)) for si := range shifts { @@ -110,6 +125,8 @@ func TestFixedPaddedSize(t *testing.T) { } func TestDefaultUnpaddedSize(t *testing.T) { + tf.UnitTest(t) + usizes := make([]abi.UnpaddedPieceSize, 32) Provide(t, &usizes) for i := range usizes { diff --git a/venus-shared/testutil/value_provider_primitive_test.go b/venus-shared/testutil/value_provider_primitive_test.go index 5c65fea07b..01a55f08eb 100644 --- a/venus-shared/testutil/value_provider_primitive_test.go +++ b/venus-shared/testutil/value_provider_primitive_test.go @@ -7,6 +7,7 @@ import ( "testing" "time" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/stretchr/testify/require" ) @@ -17,6 +18,8 @@ func getRand() *rand.Rand { } func TestDefaultBytes(t *testing.T) { + tf.UnitTest(t) + local := getRand() for i := 0; i < 16; i++ { @@ -32,6 +35,8 @@ func TestDefaultBytes(t *testing.T) { } func TestDefaultString(t *testing.T) { + tf.UnitTest(t) + local := getRand() for i := 0; i < 16; i++ { @@ -46,6 +51,8 @@ func TestDefaultString(t *testing.T) { } func TestDefaultInt(t *testing.T) { + tf.UnitTest(t) + local := getRand() for i := 0; i < 16; i++ { @@ -56,6 +63,8 @@ func TestDefaultInt(t *testing.T) { } func TestDefaultInt64(t *testing.T) { + tf.UnitTest(t) + require.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(int64(0)))) local := getRand() @@ -68,6 +77,8 @@ func TestDefaultInt64(t *testing.T) { } func TestDefaultInt32(t *testing.T) { + tf.UnitTest(t) + require.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(int32(0)))) local := getRand() @@ -80,6 +91,8 @@ func TestDefaultInt32(t *testing.T) { } func TestDefaultFloat64(t *testing.T) { + tf.UnitTest(t) + require.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(float64(0)))) local := getRand() @@ -92,6 +105,8 @@ func TestDefaultFloat64(t *testing.T) { } func TestDefaultIntType(t *testing.T) { + tf.UnitTest(t) + type number int require.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(number(0)))) @@ -105,6 +120,8 @@ func TestDefaultIntType(t *testing.T) { } func TestDefaultFloatType(t *testing.T) { + tf.UnitTest(t) + type double float64 require.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(double(0)))) @@ -118,6 +135,8 @@ func TestDefaultFloatType(t *testing.T) { } func TestDefaultIntSlice(t *testing.T) { + tf.UnitTest(t) + local := getRand() var dest []int @@ -128,6 +147,8 @@ func TestDefaultIntSlice(t *testing.T) { } func TestDefaultIntSliceWithLen(t *testing.T) { + tf.UnitTest(t) + local := getRand() var dest []int @@ -140,6 +161,8 @@ func TestDefaultIntSliceWithLen(t *testing.T) { } func TestDefaultIntTypeSlice(t *testing.T) { + tf.UnitTest(t) + type number int require.False(t, defaultValueProviderRegistry.has(reflect.TypeOf(number(0)))) @@ -153,6 +176,8 @@ func TestDefaultIntTypeSlice(t *testing.T) { } func TestDefaultNonNilIntSlice(t *testing.T) { + tf.UnitTest(t) + local := getRand() dest := make([]int, 16) @@ -167,6 +192,8 @@ func TestDefaultNonNilIntSlice(t *testing.T) { } func TestIntSliceWithFixedNumber(t *testing.T) { + tf.UnitTest(t) + now := int(time.Now().UnixNano()) dest := make([]int, 16) @@ -183,6 +210,8 @@ func TestIntSliceWithFixedNumber(t *testing.T) { } func TestIntSliceRanged(t *testing.T) { + tf.UnitTest(t) + min := 10 max := 20 @@ -196,6 +225,8 @@ func TestIntSliceRanged(t *testing.T) { } func TestNegativeIntSliceRanged(t *testing.T) { + tf.UnitTest(t) + min := -20 max := -10 @@ -209,6 +240,8 @@ func TestNegativeIntSliceRanged(t *testing.T) { } func TestDefaultIntArray(t *testing.T) { + tf.UnitTest(t) + local := getRand() var dest [16]int @@ -223,6 +256,8 @@ func TestDefaultIntArray(t *testing.T) { } func TestStruct(t *testing.T) { + tf.UnitTest(t) + local := getRand() type inner struct { @@ -240,6 +275,8 @@ func TestStruct(t *testing.T) { } func TestNestedStruct(t *testing.T) { + tf.UnitTest(t) + local := getRand() type nested struct { diff --git a/venus-shared/testutil/value_provider_registry_test.go b/venus-shared/testutil/value_provider_registry_test.go index ff8b7b1ce9..3a8b69b1c3 100644 --- a/venus-shared/testutil/value_provider_registry_test.go +++ b/venus-shared/testutil/value_provider_registry_test.go @@ -3,10 +3,13 @@ package testutil import ( "testing" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/stretchr/testify/require" ) func TestInvalidProviders(t *testing.T) { + tf.UnitTest(t) + vals := []interface{}{ int(0), float32(0), diff --git a/venus-shared/testutil/value_set_n_reset_test.go b/venus-shared/testutil/value_set_n_reset_test.go index de870e1095..71f2618d9b 100644 --- a/venus-shared/testutil/value_set_n_reset_test.go +++ b/venus-shared/testutil/value_set_n_reset_test.go @@ -5,10 +5,13 @@ import ( "math/rand" "testing" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/stretchr/testify/require" ) func TestValueSetNReset(t *testing.T) { + tf.UnitTest(t) + for i := 0; i < 32; i++ { originVal := rand.Int() newVal := originVal + 1 diff --git a/venus-shared/typeutil/fields_test.go b/venus-shared/typeutil/fields_test.go index 6a3cceca3f..51d4cd0fa3 100644 --- a/venus-shared/typeutil/fields_test.go +++ b/venus-shared/typeutil/fields_test.go @@ -3,10 +3,13 @@ package typeutil import ( "testing" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/stretchr/testify/require" ) func TestExportedFields(t *testing.T) { + tf.UnitTest(t) + f := ExportedFields(new(int)) require.Nil(t, f, "nil fields for non-struct type") diff --git a/venus-shared/typeutil/methods_test.go b/venus-shared/typeutil/methods_test.go index b1b4e1e328..0e2e704c28 100644 --- a/venus-shared/typeutil/methods_test.go +++ b/venus-shared/typeutil/methods_test.go @@ -5,11 +5,12 @@ import ( "reflect" "testing" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/stretchr/testify/require" ) func TestExportedMethods(t *testing.T) { - + tf.UnitTest(t) meths := ExportedMethods(reflect.TypeOf((*io.ReadCloser)(nil)).Elem()) require.Len(t, meths, 2, "exported methods for io.ReadCloser") diff --git a/venus-shared/typeutil/similar_test.go b/venus-shared/typeutil/similar_test.go index 84de1348a5..f2e768e3d8 100644 --- a/venus-shared/typeutil/similar_test.go +++ b/venus-shared/typeutil/similar_test.go @@ -9,10 +9,13 @@ import ( "testing" "unsafe" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + "github.com/stretchr/testify/require" ) func TestCodecList(t *testing.T) { + tf.UnitTest(t) zeroes := bits.TrailingZeros(uint(_codecLimit)) require.Equalf(t, zeroes, len(codecs), "codec count not match, %d != %d", zeroes, len(codecs)) @@ -61,6 +64,7 @@ type BUintptr uintptr type BUnsafePointer unsafe.Pointer func TestSimilarSimple(t *testing.T) { + tf.UnitTest(t) alist := []interface{}{ new(ABool), new(AInt), @@ -174,6 +178,7 @@ func similarTest(t *testing.T, origin interface{}, cases []similarCase, checkInd } func TestArray(t *testing.T) { + tf.UnitTest(t) type origin [2]int type case1 [2]uint type case2 [3]int @@ -203,6 +208,7 @@ func TestArray(t *testing.T) { } func TestMap(t *testing.T) { + tf.UnitTest(t) type origin map[string]int type case1 map[int]int @@ -232,6 +238,7 @@ func TestMap(t *testing.T) { } func TestSlice(t *testing.T) { + tf.UnitTest(t) type origin []int type case1 []uint @@ -257,6 +264,7 @@ func TestSlice(t *testing.T) { } func TestChan(t *testing.T) { + tf.UnitTest(t) type origin chan int type case1 chan uint @@ -287,6 +295,7 @@ func TestChan(t *testing.T) { } func TestStruct(t *testing.T) { + tf.UnitTest(t) type origin struct { A uint B int @@ -401,6 +410,7 @@ func TestStruct(t *testing.T) { } func TestInterface(t *testing.T) { + tf.UnitTest(t) type origin interface { Read(context.Context) (int, error) Write(context.Context, []byte) (int, error) @@ -559,6 +569,7 @@ func (ci halfCodecInt) MarshalCBOR(w io.Writer) error { // nolint } func TestCodec(t *testing.T) { + tf.UnitTest(t) cases := []similarCase{ { val: new(AInt), @@ -614,6 +625,7 @@ func TestCodec(t *testing.T) { } func TestConvertible(t *testing.T) { + tf.UnitTest(t) type origin struct { A uint B int @@ -636,6 +648,7 @@ func TestConvertible(t *testing.T) { } func TestRecursive(t *testing.T) { + tf.UnitTest(t) type origin struct { A uint B int From bf8069714ef81033d30958cf21b1c23ce01e8c2c Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Tue, 4 Jan 2022 10:19:06 +0800 Subject: [PATCH 092/167] fix method map (#4666) --- pkg/chain/utils.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pkg/chain/utils.go b/pkg/chain/utils.go index 4d4b3d8034..1fa8f27b38 100644 --- a/pkg/chain/utils.go +++ b/pkg/chain/utils.go @@ -13,12 +13,19 @@ import ( blockFormat "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + /* inline-gen template + {{range .actorVersions}} + exported{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin/exported"{{end}} + /* inline-gen start */ + exported0 "github.com/filecoin-project/specs-actors/actors/builtin/exported" exported2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/exported" exported3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/exported" exported4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/exported" exported5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/exported" exported6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/exported" + exported7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/exported" + /* inline-gen end */ "github.com/filecoin-project/venus/venus-shared/actors/builtin" ) @@ -35,12 +42,21 @@ var MethodsMap = map[cid.Cid]map[abi.MethodNum]MethodMeta{} func init() { // TODO: combine with the runtime actor registry. var actors []rt.VMActor + + /* inline-gen template + {{range .actorVersions}} + actors = append(actors, exported{{.}}.BuiltinActors()...){{end}} + /* inline-gen start */ + actors = append(actors, exported0.BuiltinActors()...) actors = append(actors, exported2.BuiltinActors()...) actors = append(actors, exported3.BuiltinActors()...) actors = append(actors, exported4.BuiltinActors()...) actors = append(actors, exported5.BuiltinActors()...) actors = append(actors, exported6.BuiltinActors()...) + actors = append(actors, exported7.BuiltinActors()...) + /* inline-gen end */ + for _, actor := range actors { exports := actor.Exports() methods := make(map[abi.MethodNum]MethodMeta, len(exports)) From d6da2ff004669f7db4b1435ae69c8f4b80a5dc88 Mon Sep 17 00:00:00 2001 From: Susanoo <40375298+diwufeiwen@users.noreply.github.com> Date: Tue, 4 Jan 2022 16:45:08 +0800 Subject: [PATCH 093/167] Feat/venus v2 snapdeal (#4664) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * upgrade filecoin-ffi * upgrade github.com/ipfs/go-datastore to v0.5.1 * fix go mod * fix PrivKey Marshal * fix api & api-doc * fix consensus test * fix wallet test Co-authored-by: 一页素书 <2931107265@qq.com> --- app/client/apiface/network.go | 2 +- app/client/apiface/v0api/network.go | 2 +- app/client/v0api/full.go | 4 +- app/node/builder.go | 19 +- app/node/helpers.go | 7 +- app/node/init.go | 12 +- app/node/node.go | 2 +- app/node/test/node.go | 18 +- app/node/test/setup.go | 4 +- app/submodule/blockstore/blockstore_api.go | 6 +- app/submodule/chain/account_api.go | 2 +- app/submodule/chain/apibstore.go | 18 +- app/submodule/chain/chaininfo_api.go | 38 +- app/submodule/chain/miner_api.go | 10 +- app/submodule/mining/mining_api.go | 8 +- app/submodule/mpool/mpool_api.go | 8 +- app/submodule/mpool/mpool_submodule.go | 4 +- app/submodule/network/libp2p.go | 6 +- app/submodule/network/network_api.go | 2 +- app/submodule/network/network_submodule.go | 52 ++- app/submodule/paych/paych_api.go | 12 +- app/submodule/paych/paych_submodule.go | 7 +- app/submodule/syncer/syncer_api.go | 12 +- app/submodule/syncer/syncer_submodule.go | 2 +- app/submodule/wallet/remotewallet/remote.go | 14 +- app/submodule/wallet/wallet_api.go | 34 +- app/submodule/wallet/wallet_submodule.go | 2 +- cmd/address.go | 6 +- cmd/address_integration_test.go | 6 +- cmd/daemon.go | 10 +- cmd/import.go | 8 +- cmd/miner.go | 2 +- cmd/swarm.go | 2 +- go.mod | 65 ++- go.sum | 393 ++++++++++++------ pkg/chain/chain_index.go | 30 +- pkg/chain/message_store.go | 32 +- pkg/chain/randomness.go | 10 +- pkg/chain/reorg_test.go | 12 +- pkg/chain/store.go | 149 +++---- pkg/chain/store_test.go | 53 +-- pkg/chain/testing.go | 95 +++-- pkg/chain/tip_index.go | 21 +- pkg/chain/traversal.go | 20 +- pkg/chain/traversal_test.go | 62 +-- pkg/chain/utils.go | 5 +- pkg/chain/waiter.go | 15 +- pkg/chainsync/exchange/server.go | 20 +- pkg/chainsync/slashfilter/mysqldb.go | 3 +- pkg/chainsync/slashfilter/slashfilter.go | 23 +- pkg/chainsync/syncer/syncer.go | 28 +- .../syncer/syncer_integration_test.go | 8 +- pkg/chainsync/syncer/syncer_test.go | 116 +++--- pkg/consensus/block_validator.go | 12 +- pkg/consensus/expected.go | 20 +- pkg/consensus/message_validator.go | 2 +- pkg/consensus/message_validator_test.go | 2 +- pkg/consensus/ticket.go | 4 +- pkg/consensus/ticket_test.go | 2 +- pkg/consensusfault/check.go | 2 +- pkg/discovery/hello_protocol.go | 2 +- pkg/discovery/hello_protocol_test.go | 18 +- pkg/events/events_test.go | 2 +- pkg/events/state/mock/api.go | 4 +- pkg/fork/fork.go | 16 +- pkg/gen/genesis/genesis.go | 6 +- pkg/genesis/init.go | 2 +- pkg/market/fundmanager.go | 40 +- pkg/market/fundmanager_test.go | 48 ++- pkg/market/store.go | 13 +- pkg/messagepool/config.go | 15 +- pkg/messagepool/gas.go | 22 +- pkg/messagepool/messagepool.go | 51 +-- pkg/messagepool/messagepool_test.go | 66 +-- pkg/messagepool/messagesigner.go | 10 +- pkg/messagepool/messagesigner_test.go | 32 +- pkg/messagepool/provider.go | 42 +- pkg/messagepool/pruning.go | 2 +- pkg/messagepool/repub.go | 4 +- pkg/messagepool/repub_test.go | 7 +- pkg/messagepool/selection.go | 10 +- pkg/messagepool/selection_test.go | 66 +-- pkg/metrics/heartbeat_test.go | 2 +- pkg/net/blocksub/validator_test.go | 4 +- pkg/net/router.go | 2 +- pkg/paychmgr/accessorcache.go | 9 +- pkg/paychmgr/manager.go | 60 +-- pkg/paychmgr/paych.go | 38 +- pkg/paychmgr/paych_test.go | 29 +- pkg/paychmgr/paychget_test.go | 80 ++-- pkg/paychmgr/paychvoucherfunds_test.go | 2 +- pkg/paychmgr/settle_test.go | 4 +- pkg/paychmgr/settler/stl.go | 6 +- pkg/paychmgr/simple.go | 90 ++-- pkg/paychmgr/store.go | 85 ++-- pkg/paychmgr/store_test.go | 22 +- pkg/repo/fskeystore/fskeystore_test.go | 10 +- pkg/repo/fsrepo_test.go | 5 +- pkg/state/signer.go | 4 +- pkg/statemanger/call.go | 10 +- pkg/statemanger/state_manger.go | 24 +- pkg/testhelpers/cid.go | 9 +- pkg/testhelpers/net.go | 2 +- pkg/util/blockstoreutil/badger.go | 14 +- pkg/util/blockstoreutil/buf_bstore.go | 42 +- pkg/util/blockstoreutil/copy.go | 16 +- pkg/util/blockstoreutil/memstore.go | 16 +- pkg/util/blockstoreutil/syncstore.go | 24 +- pkg/util/blockstoreutil/view_blockstore.go | 12 +- pkg/util/dag/dag_test.go | 2 +- pkg/vm/vmcontext/gas_charge_ipld.go | 9 +- pkg/vm/vmcontext/types.go | 6 +- pkg/wallet/backend.go | 19 +- pkg/wallet/dsbackend.go | 69 +-- pkg/wallet/dsbackend_test.go | 53 ++- pkg/wallet/passphrase_test.go | 7 +- pkg/wallet/signature_test.go | 15 +- pkg/wallet/wallet.go | 87 ++-- pkg/wallet/wallet_test.go | 49 ++- tools/conformance/driver.go | 15 +- tools/conformance/runner.go | 4 +- tools/gengen/util/generator.go | 2 +- venus-devtool/go.mod | 13 +- venus-devtool/go.sum | 352 ++++++++-------- venus-shared/api/api-document.md | 25 +- venus-shared/api/chain/v0/fullnode.go | 1 - venus-shared/api/chain/v0/mock/full.go | 4 +- venus-shared/api/chain/v0/network.go | 2 +- venus-shared/api/chain/v0/proxy_gen.go | 22 +- venus-shared/api/chain/v0/wallet.go | 12 +- venus-shared/api/chain/v1/mock/full.go | 4 +- venus-shared/api/chain/v1/network.go | 2 +- venus-shared/api/chain/v1/proxy_gen.go | 22 +- venus-shared/api/chain/v1/wallet.go | 12 +- venus-shared/chain/complex_provider_test.go | 1 + venus-shared/chain/tipset_key.go | 20 +- 136 files changed, 1822 insertions(+), 1651 deletions(-) diff --git a/app/client/apiface/network.go b/app/client/apiface/network.go index b95c832392..d2251597dd 100644 --- a/app/client/apiface/network.go +++ b/app/client/apiface/network.go @@ -22,7 +22,7 @@ type INetwork interface { // Rule[perm:read] NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo // Rule[perm:read] - NetworkGetClosestPeers(ctx context.Context, key string) (<-chan peer.ID, error) + NetworkGetClosestPeers(ctx context.Context, key string) ([]peer.ID, error) // Rule[perm:read] NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) // Rule[perm:read] diff --git a/app/client/apiface/v0api/network.go b/app/client/apiface/v0api/network.go index 1229741989..b909ee2240 100644 --- a/app/client/apiface/v0api/network.go +++ b/app/client/apiface/v0api/network.go @@ -21,7 +21,7 @@ type INetwork interface { // Rule[perm:read] NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo // Rule[perm:admin] - NetworkGetClosestPeers(ctx context.Context, key string) (<-chan peer.ID, error) + NetworkGetClosestPeers(ctx context.Context, key string) ([]peer.ID, error) // Rule[perm:read] NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) // Rule[perm:read] diff --git a/app/client/v0api/full.go b/app/client/v0api/full.go index 7fc28845de..a879cf51aa 100644 --- a/app/client/v0api/full.go +++ b/app/client/v0api/full.go @@ -726,7 +726,7 @@ type INetworkStruct struct { NetworkFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` NetworkFindProvidersAsync func(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo `perm:"read"` NetworkGetBandwidthStats func(p0 context.Context) metrics.Stats `perm:"admin"` - NetworkGetClosestPeers func(p0 context.Context, p1 string) (<-chan peer.ID, error) `perm:"admin"` + NetworkGetClosestPeers func(p0 context.Context, p1 string) ([]peer.ID, error) `perm:"admin"` NetworkGetPeerAddresses func(p0 context.Context) []ma.Multiaddr `perm:"admin"` NetworkGetPeerID func(p0 context.Context) peer.ID `perm:"admin"` NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*net.SwarmConnInfos, error) `perm:"read"` @@ -754,7 +754,7 @@ func (s *INetworkStruct) NetworkGetBandwidthStats(p0 context.Context) metrics.St return s.Internal.NetworkGetBandwidthStats(p0) } -func (s *INetworkStruct) NetworkGetClosestPeers(p0 context.Context, p1 string) (<-chan peer.ID, error) { +func (s *INetworkStruct) NetworkGetClosestPeers(p0 context.Context, p1 string) ([]peer.ID, error) { return s.Internal.NetworkGetClosestPeers(p0, p1) } diff --git a/app/node/builder.go b/app/node/builder.go index 5a9683417d..0183ffb7aa 100644 --- a/app/node/builder.go +++ b/app/node/builder.go @@ -4,14 +4,13 @@ import ( "context" "time" - chain2 "github.com/filecoin-project/venus/pkg/chain" - "github.com/filecoin-project/venus/pkg/jwtauth" - "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" - types "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/ipfs-force-community/metrics/ratelimit" logging "github.com/ipfs/go-log" + "github.com/libp2p/go-libp2p" + "github.com/pkg/errors" "golang.org/x/xerrors" + "github.com/ipfs-force-community/metrics/ratelimit" + "github.com/filecoin-project/venus/app/submodule/blockstore" "github.com/filecoin-project/venus/app/submodule/chain" config2 "github.com/filecoin-project/venus/app/submodule/config" @@ -26,13 +25,15 @@ import ( "github.com/filecoin-project/venus/app/submodule/storagenetworking" "github.com/filecoin-project/venus/app/submodule/syncer" "github.com/filecoin-project/venus/app/submodule/wallet" + chain2 "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/clock" "github.com/filecoin-project/venus/pkg/journal" + "github.com/filecoin-project/venus/pkg/jwtauth" "github.com/filecoin-project/venus/pkg/paychmgr" "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/util/ffiwrapper" - "github.com/libp2p/go-libp2p" - "github.com/pkg/errors" + "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // Builder is a helper to aid in the construction of a filecoin node. @@ -84,7 +85,7 @@ func (b *Builder) build(ctx context.Context) (*Node, error) { } // fetch genesis block id - b.genBlk, err = readGenesisCid(b.repo.ChainDatastore(), b.repo.Datastore()) + b.genBlk, err = readGenesisCid(ctx, b.repo.ChainDatastore(), b.repo.Datastore()) if err != nil { return nil, err } @@ -143,7 +144,7 @@ func (b *Builder) build(ctx context.Context) (*Node, error) { return nil, errors.Wrap(err, "failed to build node.wallet") } - nd.mpool, err = mpool.NewMpoolSubmodule((*builder)(b), nd.network, nd.chain, nd.wallet) + nd.mpool, err = mpool.NewMpoolSubmodule(ctx, (*builder)(b), nd.network, nd.chain, nd.wallet) if err != nil { return nil, errors.Wrap(err, "failed to build node.mpool") } diff --git a/app/node/helpers.go b/app/node/helpers.go index 614b6d2c16..9f8e49f8fc 100644 --- a/app/node/helpers.go +++ b/app/node/helpers.go @@ -2,6 +2,7 @@ package node import ( "bytes" + "context" "encoding/json" "github.com/ipfs/go-cid" @@ -15,8 +16,8 @@ import ( // readGenesisCid is a helper function that queries the provided datastore for // an entry with the genesisKey cid, returning if found. -func readGenesisCid(chainDs datastore.Datastore, bs blockstoreutil.Blockstore) (types.BlockHeader, error) { - bb, err := chainDs.Get(chain.GenesisKey) +func readGenesisCid(ctx context.Context, chainDs datastore.Datastore, bs blockstoreutil.Blockstore) (types.BlockHeader, error) { + bb, err := chainDs.Get(ctx, chain.GenesisKey) if err != nil { return types.BlockHeader{}, errors.Wrap(err, "failed to read genesisKey") } @@ -27,7 +28,7 @@ func readGenesisCid(chainDs datastore.Datastore, bs blockstoreutil.Blockstore) ( return types.BlockHeader{}, errors.Wrap(err, "failed to cast genesisCid") } - blkRawData, err := bs.Get(c) + blkRawData, err := bs.Get(ctx, c) if err != nil { return types.BlockHeader{}, errors.Wrap(err, "failed to read genesis block") } diff --git a/app/node/init.go b/app/node/init.go index 7387f3d063..e3b40d970a 100644 --- a/app/node/init.go +++ b/app/node/init.go @@ -77,19 +77,21 @@ func Init(ctx context.Context, r repo.Repo, gen genesis.InitFunc, opts ...InitOp return nil } -func initPeerKey(store fskeystore.Keystore, key acrypto.PrivKey) error { +func initPeerKey(store fskeystore.Keystore, pk acrypto.PrivKey) error { var err error - if key == nil { - key, _, err = acrypto.GenerateKeyPair(acrypto.RSA, defaultPeerKeyBits) + if pk == nil { + pk, _, err = acrypto.GenerateKeyPair(acrypto.RSA, defaultPeerKeyBits) if err != nil { return errors.Wrap(err, "failed to create peer key") } } - data, err := key.Bytes() + + kbytes, err := acrypto.MarshalPrivateKey(pk) if err != nil { return err } - if err := store.Put("self", data); err != nil { + + if err := store.Put("self", kbytes); err != nil { return errors.Wrap(err, "failed to store private key") } return nil diff --git a/app/node/node.go b/app/node/node.go index cc4a0fe3a7..97a8dc7153 100644 --- a/app/node/node.go +++ b/app/node/node.go @@ -189,7 +189,7 @@ func (node *Node) Start(ctx context.Context) error { return err } - err = node.paychan.Start() + err = node.paychan.Start(ctx) if err != nil { return err } diff --git a/app/node/test/node.go b/app/node/test/node.go index 27663dd690..1ecd417cc0 100644 --- a/app/node/test/node.go +++ b/app/node/test/node.go @@ -5,12 +5,6 @@ import ( "math/rand" "testing" - "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" - types "github.com/filecoin-project/venus/venus-shared/chain" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/venus/app/node" - "github.com/filecoin-project/venus/pkg/util/blockstoreutil" ds "github.com/ipfs/go-datastore" blockstore "github.com/ipfs/go-ipfs-blockstore" cbor "github.com/ipfs/go-ipld-cbor" @@ -18,12 +12,18 @@ import ( "github.com/libp2p/go-libp2p-core/peer" "github.com/stretchr/testify/require" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/venus/app/node" "github.com/filecoin-project/venus/fixtures/fortest" "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/constants" + "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" "github.com/filecoin-project/venus/pkg/wallet" gengen "github.com/filecoin-project/venus/tools/gengen/util" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // ChainSeed is a generalized struct for configuring node @@ -63,15 +63,15 @@ func (cs *ChainSeed) GenesisInitFunc(cst cbor.IpldStore, bs blockstore.Blockstor } // GiveKey gives the given key to the given node -func (cs *ChainSeed) GiveKey(t *testing.T, nd *node.Node, key int) address.Address { +func (cs *ChainSeed) GiveKey(ctx context.Context, t *testing.T, nd *node.Node, key int) address.Address { t.Helper() bcks := nd.Wallet().Wallet.Backends(wallet.DSBackendType) require.Len(t, bcks, 1, "expected to get exactly one datastore backend") dsb := bcks[0].(*wallet.DSBackend) - _ = dsb.SetPassword(wallet.TestPassword) + _ = dsb.SetPassword(ctx, wallet.TestPassword) kinfo := cs.info.Keys[key] - require.NoError(t, dsb.ImportKey(kinfo)) + require.NoError(t, dsb.ImportKey(ctx, kinfo)) addr, err := kinfo.Address() require.NoError(t, err) diff --git a/app/node/test/setup.go b/app/node/test/setup.go index 0ab72e42f8..ccd4fe791b 100644 --- a/app/node/test/setup.go +++ b/app/node/test/setup.go @@ -47,7 +47,7 @@ func CreateBootstrapMiner(ctx context.Context, t *testing.T, seed *ChainSeed, ch WithBuilderOpt(node.MonkeyPatchSetProofTypeOption(constants.DevRegisteredSealProof)). Build(ctx) - addr := seed.GiveKey(t, bootstrapMiner, 0) + addr := seed.GiveKey(ctx, t, bootstrapMiner, 0) err := bootstrapMiner.ConfigModule().API().ConfigSet(ctx, "walletModule.defaultAddress", addr.String()) require.NoError(t, err) @@ -60,7 +60,7 @@ func CreateBootstrapMiner(ctx context.Context, t *testing.T, seed *ChainSeed, ch } func initNodeGenesisMiner(ctx context.Context, t *testing.T, nd *node.Node, seed *ChainSeed, minerIdx int) (address.Address, address.Address, error) { - seed.GiveKey(t, nd, minerIdx) + seed.GiveKey(ctx, t, nd, minerIdx) miner, owner := seed.GiveMiner(t, nd, 0) return miner, owner, nil diff --git a/app/submodule/blockstore/blockstore_api.go b/app/submodule/blockstore/blockstore_api.go index 8702fee067..1ed8e86d67 100644 --- a/app/submodule/blockstore/blockstore_api.go +++ b/app/submodule/blockstore/blockstore_api.go @@ -22,7 +22,7 @@ type blockstoreAPI struct { //nolint } func (blockstoreAPI *blockstoreAPI) ChainReadObj(ctx context.Context, ocid cid.Cid) ([]byte, error) { - blk, err := blockstoreAPI.blockstore.Blockstore.Get(ocid) + blk, err := blockstoreAPI.blockstore.Blockstore.Get(ctx, ocid) if err != nil { return nil, xerrors.Errorf("blockstore get: %w", err) } @@ -31,11 +31,11 @@ func (blockstoreAPI *blockstoreAPI) ChainReadObj(ctx context.Context, ocid cid.C } func (blockstoreAPI *blockstoreAPI) ChainDeleteObj(ctx context.Context, obj cid.Cid) error { - return blockstoreAPI.blockstore.Blockstore.DeleteBlock(obj) + return blockstoreAPI.blockstore.Blockstore.DeleteBlock(ctx, obj) } func (blockstoreAPI *blockstoreAPI) ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) { - return blockstoreAPI.blockstore.Blockstore.Has(obj) + return blockstoreAPI.blockstore.Blockstore.Has(ctx, obj) } func (blockstoreAPI *blockstoreAPI) ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (apitypes.ObjStat, error) { diff --git a/app/submodule/chain/account_api.go b/app/submodule/chain/account_api.go index 86125c9e47..a68cab971b 100644 --- a/app/submodule/chain/account_api.go +++ b/app/submodule/chain/account_api.go @@ -23,7 +23,7 @@ func NewAccountAPI(chain *ChainSubmodule) v1api.IAccount { // StateAccountKey returns the public key address of the given ID address func (accountAPI *accountAPI) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) { - ts, err := accountAPI.chain.ChainReader.GetTipSet(tsk) + ts, err := accountAPI.chain.ChainReader.GetTipSet(ctx, tsk) if err != nil { return address.Undef, xerrors.Errorf("loading tipset %s: %w", tsk, err) } diff --git a/app/submodule/chain/apibstore.go b/app/submodule/chain/apibstore.go index 29695e3353..ce418c6387 100644 --- a/app/submodule/chain/apibstore.go +++ b/app/submodule/chain/apibstore.go @@ -26,18 +26,18 @@ func NewAPIBlockstore(cio ChainIO) blockstore.Blockstore { } // DeleteBlock implements Blockstore.DeleteBlock. -func (a *apiBStore) DeleteBlock(cid.Cid) error { +func (a *apiBStore) DeleteBlock(context.Context, cid.Cid) error { return xerrors.New("not supported") } // Has implements Blockstore.Has. -func (a *apiBStore) Has(c cid.Cid) (bool, error) { - return a.api.ChainHasObj(context.TODO(), c) +func (a *apiBStore) Has(ctx context.Context, c cid.Cid) (bool, error) { + return a.api.ChainHasObj(ctx, c) } // Get implements Blockstore.Get. -func (a *apiBStore) Get(c cid.Cid) (blocks.Block, error) { - bb, err := a.api.ChainReadObj(context.TODO(), c) +func (a *apiBStore) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) { + bb, err := a.api.ChainReadObj(ctx, c) if err != nil { return nil, err } @@ -45,8 +45,8 @@ func (a *apiBStore) Get(c cid.Cid) (blocks.Block, error) { } // GetSize implements Blockstore.GetSize. -func (a *apiBStore) GetSize(c cid.Cid) (int, error) { - bb, err := a.api.ChainReadObj(context.TODO(), c) +func (a *apiBStore) GetSize(ctx context.Context, c cid.Cid) (int, error) { + bb, err := a.api.ChainReadObj(ctx, c) if err != nil { return 0, err } @@ -54,12 +54,12 @@ func (a *apiBStore) GetSize(c cid.Cid) (int, error) { } // Put implements Blockstore.Put. -func (a *apiBStore) Put(blocks.Block) error { +func (a *apiBStore) Put(context.Context, blocks.Block) error { return xerrors.New("not supported") } // PutMany implements Blockstore.PutMany. -func (a *apiBStore) PutMany([]blocks.Block) error { +func (a *apiBStore) PutMany(context.Context, []blocks.Block) error { return xerrors.New("not supported") } diff --git a/app/submodule/chain/chaininfo_api.go b/app/submodule/chain/chaininfo_api.go index 9612905ffa..9f100b6444 100644 --- a/app/submodule/chain/chaininfo_api.go +++ b/app/submodule/chain/chaininfo_api.go @@ -43,7 +43,7 @@ func (cia *chainInfoAPI) BlockTime(ctx context.Context) time.Duration { // ChainLs returns an iterator of tipsets from specified head by tsKey to genesis func (cia *chainInfoAPI) ChainList(ctx context.Context, tsKey types.TipSetKey, count int) ([]types.TipSetKey, error) { - fromTS, err := cia.chain.ChainReader.GetTipSet(tsKey) + fromTS, err := cia.chain.ChainReader.GetTipSet(ctx, tsKey) if err != nil { return nil, xerrors.Errorf("could not retrieve network name %w", err) } @@ -88,7 +88,7 @@ func (cia *chainInfoAPI) ChainHead(ctx context.Context) (*types.TipSet, error) { // ChainSetHead sets `key` as the new head of this chain iff it exists in the nodes chain store. func (cia *chainInfoAPI) ChainSetHead(ctx context.Context, key types.TipSetKey) error { - ts, err := cia.chain.ChainReader.GetTipSet(key) + ts, err := cia.chain.ChainReader.GetTipSet(ctx, key) if err != nil { return err } @@ -97,14 +97,14 @@ func (cia *chainInfoAPI) ChainSetHead(ctx context.Context, key types.TipSetKey) // ChainTipSet returns the tipset at the given key func (cia *chainInfoAPI) ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) { - return cia.chain.ChainReader.GetTipSet(key) + return cia.chain.ChainReader.GetTipSet(ctx, key) } // ChainGetTipSetByHeight looks back for a tipset at the specified epoch. // If there are no blocks at the specified epoch, a tipset at an earlier epoch // will be returned. func (cia *chainInfoAPI) ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) { - ts, err := cia.chain.ChainReader.GetTipSet(tsk) + ts, err := cia.chain.ChainReader.GetTipSet(ctx, tsk) if err != nil { return nil, xerrors.Errorf("fail to load tipset %v", err) } @@ -115,7 +115,7 @@ func (cia *chainInfoAPI) ChainGetTipSetByHeight(ctx context.Context, height abi. // If there are no blocks at the specified epoch, the first non-nil tipset at a later epoch // will be returned. func (cia *chainInfoAPI) ChainGetTipSetAfterHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) { - ts, err := cia.chain.ChainReader.GetTipSet(tsk) + ts, err := cia.chain.ChainReader.GetTipSet(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -148,7 +148,7 @@ func (cia *chainInfoAPI) ChainGetBlock(ctx context.Context, id cid.Cid) (*types. // ChainGetMessage reads a message referenced by the specified CID from the // chain blockstore. func (cia *chainInfoAPI) ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.Message, error) { - msg, err := cia.chain.MessageStore.LoadMessage(msgID) + msg, err := cia.chain.MessageStore.LoadMessage(ctx, msgID) if err != nil { return nil, err } @@ -208,7 +208,7 @@ func (cia *chainInfoAPI) GetFullBlock(ctx context.Context, id cid.Cid) (*types.F // ChainGetMessagesInTipset returns message stores in current tipset func (cia *chainInfoAPI) ChainGetMessagesInTipset(ctx context.Context, key types.TipSetKey) ([]apitypes.Message, error) { - ts, err := cia.chain.ChainReader.GetTipSet(key) + ts, err := cia.chain.ChainReader.GetTipSet(ctx, key) if err != nil { return nil, err } @@ -246,7 +246,7 @@ func (cia *chainInfoAPI) ChainGetParentMessages(ctx context.Context, bcid cid.Ci } // TODO: need to get the number of messages better than this - pts, err := cia.chain.ChainReader.GetTipSet(types.NewTipSetKey(b.Parents...)) + pts, err := cia.chain.ChainReader.GetTipSet(ctx, types.NewTipSetKey(b.Parents...)) if err != nil { return nil, err } @@ -280,7 +280,7 @@ func (cia *chainInfoAPI) ChainGetParentReceipts(ctx context.Context, bcid cid.Ci } // TODO: need to get the number of messages better than this - pts, err := cia.chain.ChainReader.GetTipSet(types.NewTipSetKey(b.Parents...)) + pts, err := cia.chain.ChainReader.GetTipSet(ctx, types.NewTipSetKey(b.Parents...)) if err != nil { return nil, err } @@ -402,7 +402,7 @@ func (cia *chainInfoAPI) StateGetRandomnessFromBeacon(ctx context.Context, perso // StateNetworkVersion returns the network version at the given tipset func (cia *chainInfoAPI) StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) { - ts, err := cia.chain.ChainReader.GetTipSet(tsk) + ts, err := cia.chain.ChainReader.GetTipSet(ctx, tsk) if err != nil { return network.VersionMax, xerrors.Errorf("loading tipset %s: %v", tsk, err) } @@ -410,7 +410,7 @@ func (cia *chainInfoAPI) StateNetworkVersion(ctx context.Context, tsk types.TipS } func (cia *chainInfoAPI) StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) { - ts, err := cia.chain.ChainReader.GetTipSet(tsk) + ts, err := cia.chain.ChainReader.GetTipSet(ctx, tsk) if err != nil { return address.Undef, xerrors.Errorf("loading tipset %s: %v", tsk, err) } @@ -428,7 +428,7 @@ func (cia *chainInfoAPI) StateVerifiedRegistryRootKey(ctx context.Context, tsk t } func (cia *chainInfoAPI) StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) { - ts, err := cia.chain.ChainReader.GetTipSet(tsk) + ts, err := cia.chain.ChainReader.GetTipSet(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %v", tsk, err) } @@ -465,7 +465,7 @@ func (cia *chainInfoAPI) StateVerifierStatus(ctx context.Context, addr address.A // encountered or if the context is canceled. Otherwise, it waits forever for the message // to appear on chain. func (cia *chainInfoAPI) MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*apitypes.ChainMessage, error) { - chainMsg, err := cia.chain.MessageStore.LoadMessage(msgCid) + chainMsg, err := cia.chain.MessageStore.LoadMessage(ctx, msgCid) if err != nil { return nil, err } @@ -474,12 +474,12 @@ func (cia *chainInfoAPI) MessageWait(ctx context.Context, msgCid cid.Cid, confid // StateSearchMsg searches for a message in the chain, and returns its receipt and the tipset where it was executed func (cia *chainInfoAPI) StateSearchMsg(ctx context.Context, from types.TipSetKey, mCid cid.Cid, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) { - chainMsg, err := cia.chain.MessageStore.LoadMessage(mCid) + chainMsg, err := cia.chain.MessageStore.LoadMessage(ctx, mCid) if err != nil { return nil, err } //todo add a api for head tipset directly - head, err := cia.chain.ChainReader.GetTipSet(from) + head, err := cia.chain.ChainReader.GetTipSet(ctx, from) if err != nil { return nil, err } @@ -502,7 +502,7 @@ func (cia *chainInfoAPI) StateSearchMsg(ctx context.Context, from types.TipSetKe // StateWaitMsg looks back in the chain for a message. If not found, it blocks until the // message arrives on chain, and gets to the indicated confidence depth. func (cia *chainInfoAPI) StateWaitMsg(ctx context.Context, mCid cid.Cid, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) { - chainMsg, err := cia.chain.MessageStore.LoadMessage(mCid) + chainMsg, err := cia.chain.MessageStore.LoadMessage(ctx, mCid) if err != nil { return nil, err } @@ -522,7 +522,7 @@ func (cia *chainInfoAPI) StateWaitMsg(ctx context.Context, mCid cid.Cid, confide } func (cia *chainInfoAPI) ChainExport(ctx context.Context, nroots abi.ChainEpoch, skipoldmsgs bool, tsk types.TipSetKey) (<-chan []byte, error) { - ts, err := cia.chain.ChainReader.GetTipSet(tsk) + ts, err := cia.chain.ChainReader.GetTipSet(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %v", tsk, err) } @@ -584,11 +584,11 @@ func (cia *chainInfoAPI) ChainExport(ctx context.Context, nroots abi.ChainEpoch, //``` // Would return `[revert(tBA), apply(tAB), apply(tAA)]` func (cia *chainInfoAPI) ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*apitypes.HeadChange, error) { - fts, err := cia.chain.ChainReader.GetTipSet(from) + fts, err := cia.chain.ChainReader.GetTipSet(ctx, from) if err != nil { return nil, xerrors.Errorf("loading from tipset %s: %w", from, err) } - tts, err := cia.chain.ChainReader.GetTipSet(to) + tts, err := cia.chain.ChainReader.GetTipSet(ctx, to) if err != nil { return nil, xerrors.Errorf("loading to tipset %s: %w", to, err) } diff --git a/app/submodule/chain/miner_api.go b/app/submodule/chain/miner_api.go index 3baa614326..f7bf7db661 100644 --- a/app/submodule/chain/miner_api.go +++ b/app/submodule/chain/miner_api.go @@ -152,7 +152,7 @@ func (msa *minerStateAPI) StateMinerFaults(ctx context.Context, maddr address.Ad // StateMinerProvingDeadline calculates the deadline at some epoch for a proving period // and returns the deadline-related calculations. func (msa *minerStateAPI) StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) { - ts, err := msa.ChainReader.GetTipSet(tsk) + ts, err := msa.ChainReader.GetTipSet(ctx, tsk) if err != nil { return nil, xerrors.Errorf("GetTipset failed:%v", err) } @@ -336,7 +336,7 @@ var initialPledgeDen = big.NewInt(100) // StateMinerInitialPledgeCollateral returns the precommit deposit for the specified miner's sector func (msa *minerStateAPI) StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) { - ts, err := msa.ChainReader.GetTipSet(tsk) + ts, err := msa.ChainReader.GetTipSet(ctx, tsk) if err != nil { return big.Int{}, err } @@ -397,7 +397,7 @@ func (msa *minerStateAPI) StateMinerPreCommitDepositForPower(ctx context.Context // StateMinerInitialPledgeCollateral returns the initial pledge collateral for the specified miner's sector func (msa *minerStateAPI) StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) { - ts, err := msa.ChainReader.GetTipSet(tsk) + ts, err := msa.ChainReader.GetTipSet(ctx, tsk) if err != nil { return big.Int{}, xerrors.Errorf("loading tipset %s: %v", tsk, err) } @@ -474,7 +474,7 @@ func (msa *minerStateAPI) StateMinerInitialPledgeCollateral(ctx context.Context, // StateVMCirculatingSupplyInternal returns an approximation of the circulating supply of Filecoin at the given tipset. // This is the value reported by the runtime interface to actors code. func (msa *minerStateAPI) StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) { - ts, err := msa.ChainReader.GetTipSet(tsk) + ts, err := msa.ChainReader.GetTipSet(ctx, tsk) if err != nil { return types.CirculatingSupply{}, err } @@ -577,7 +577,7 @@ func (msa *minerStateAPI) StateMinerPower(ctx context.Context, addr address.Addr // StateMinerAvailableBalance returns the portion of a miner's balance that can be withdrawn or spent func (msa *minerStateAPI) StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) { - ts, err := msa.ChainReader.GetTipSet(tsk) + ts, err := msa.ChainReader.GetTipSet(ctx, tsk) if err != nil { return big.Int{}, xerrors.Errorf("failed to get tipset for %s, %v", tsk.String(), err) } diff --git a/app/submodule/mining/mining_api.go b/app/submodule/mining/mining_api.go index 8227f8754a..ad073205f7 100644 --- a/app/submodule/mining/mining_api.go +++ b/app/submodule/mining/mining_api.go @@ -36,7 +36,7 @@ type MiningAPI struct { //nolint //MinerGetBaseInfo get current miner information func (miningAPI *MiningAPI) MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*apitypes.MiningBaseInfo, error) { chainStore := miningAPI.Ming.ChainModule.ChainReader - ts, err := chainStore.GetTipSet(tsk) + ts, err := chainStore.GetTipSet(ctx, tsk) if err != nil { return nil, xerrors.Errorf("failed to load tipset for mining base: %v", err) } @@ -44,7 +44,7 @@ func (miningAPI *MiningAPI) MinerGetBaseInfo(ctx context.Context, maddr address. if err != nil { return nil, xerrors.Errorf("failed to get tipset root for mining base: %v", err) } - prev, err := chainStore.GetLatestBeaconEntry(ts) + prev, err := chainStore.GetLatestBeaconEntry(ctx, ts) if err != nil { if os.Getenv("VENUS_IGNORE_DRAND") != "_yes_" { return nil, xerrors.Errorf("failed to get latest beacon entry: %v", err) @@ -120,7 +120,7 @@ func (miningAPI *MiningAPI) MinerGetBaseInfo(ctx context.Context, maddr address. return nil, err } - st, err := miningAPI.Ming.ChainModule.ChainReader.StateView(ts) + st, err := miningAPI.Ming.ChainModule.ChainReader.StateView(ctx, ts) if err != nil { return nil, xerrors.Errorf("failed to load latest state: %v", err) } @@ -170,7 +170,7 @@ func (miningAPI *MiningAPI) minerCreateBlock(ctx context.Context, bt *apitypes.B chainStore := miningAPI.Ming.ChainModule.ChainReader messageStore := miningAPI.Ming.ChainModule.MessageStore cfg := miningAPI.Ming.Config.Repo().Config() - pts, err := chainStore.GetTipSet(bt.Parents) + pts, err := chainStore.GetTipSet(ctx, bt.Parents) if err != nil { return nil, xerrors.Errorf("failed to load parent tipset: %v", err) } diff --git a/app/submodule/mpool/mpool_api.go b/app/submodule/mpool/mpool_api.go index 95aa14c3bc..3a9857dc09 100644 --- a/app/submodule/mpool/mpool_api.go +++ b/app/submodule/mpool/mpool_api.go @@ -35,7 +35,7 @@ func (a *MessagePoolAPI) MpoolPublishByAddr(ctx context.Context, addr address.Ad } func (a *MessagePoolAPI) MpoolPublishMessage(ctx context.Context, smsg *types.SignedMessage) error { - return a.mp.MPool.PublishMsg(smsg) + return a.mp.MPool.PublishMsg(ctx, smsg) } // MpoolPush pushes a signed message to mempool. @@ -58,7 +58,7 @@ func (a *MessagePoolAPI) MpoolGetConfig(context.Context) (*mptypes.MpoolConfig, // MpoolSetConfig sets the mpool config to (a copy of) the supplied config func (a *MessagePoolAPI) MpoolSetConfig(ctx context.Context, cfg *mptypes.MpoolConfig) error { - return a.mp.MPool.SetConfig(&messagepool.MpoolConfig{ + return a.mp.MPool.SetConfig(ctx, &messagepool.MpoolConfig{ PriorityAddrs: cfg.PriorityAddrs, SizeLimitHigh: cfg.SizeLimitHigh, SizeLimitLow: cfg.SizeLimitLow, @@ -126,7 +126,7 @@ func (a *MessagePoolAPI) MpoolPending(ctx context.Context, tsk types.TipSetKey) } // different blocks in tipsets - have, err := a.mp.MPool.MessagesForBlocks(ts.Blocks()) + have, err := a.mp.MPool.MessagesForBlocks(ctx, ts.Blocks()) if err != nil { return nil, xerrors.Errorf("getting messages for base ts: %w", err) } @@ -136,7 +136,7 @@ func (a *MessagePoolAPI) MpoolPending(ctx context.Context, tsk types.TipSetKey) } } - msgs, err := a.mp.MPool.MessagesForBlocks(ts.Blocks()) + msgs, err := a.mp.MPool.MessagesForBlocks(ctx, ts.Blocks()) if err != nil { return nil, xerrors.Errorf(": %w", err) } diff --git a/app/submodule/mpool/mpool_submodule.go b/app/submodule/mpool/mpool_submodule.go index f78b23e01a..32125fe19f 100644 --- a/app/submodule/mpool/mpool_submodule.go +++ b/app/submodule/mpool/mpool_submodule.go @@ -71,7 +71,7 @@ func OpenFilesystemJournal(lr repo.Repo) (journal.Journal, error) { return jrnl, err } -func NewMpoolSubmodule(cfg messagepoolConfig, +func NewMpoolSubmodule(ctx context.Context, cfg messagepoolConfig, network *network.NetworkSubmodule, chain *chain.ChainSubmodule, wallet *wallet.WalletSubmodule, @@ -82,7 +82,7 @@ func NewMpoolSubmodule(cfg messagepoolConfig, if err != nil { return nil, err } - mp, err := messagepool.New(mpp, chain.Stmgr, cfg.Repo().MetaDatastore(), + mp, err := messagepool.New(ctx, mpp, chain.Stmgr, cfg.Repo().MetaDatastore(), cfg.Repo().Config().NetworkParams.ForkUpgradeParam, cfg.Repo().Config().Mpool, network.NetworkName, j) if err != nil { diff --git a/app/submodule/network/libp2p.go b/app/submodule/network/libp2p.go index 6dbdb0e4c6..9f5d77aff2 100644 --- a/app/submodule/network/libp2p.go +++ b/app/submodule/network/libp2p.go @@ -32,7 +32,7 @@ func (h noopLibP2PHost) ID() peer.ID { return h.peerId } -func (noopLibP2PHost) Peerstore() peerstore.Peerstore { +func (noopLibP2PHost) Peerstore() (peerstore.Peerstore, error) { return pstoremem.NewPeerstore() } @@ -130,10 +130,6 @@ func (noopLibP2PNetwork) SetStreamHandler(net.StreamHandler) { panic("implement me") } -func (noopLibP2PNetwork) SetConnHandler(net.ConnHandler) { - panic("implement me") -} - func (noopLibP2PNetwork) NewStream(context.Context, peer.ID) (net.Stream, error) { panic("implement me") } diff --git a/app/submodule/network/network_api.go b/app/submodule/network/network_api.go index 7950fcf06c..212626b8f3 100644 --- a/app/submodule/network/network_api.go +++ b/app/submodule/network/network_api.go @@ -42,7 +42,7 @@ func (na *networkAPI) NetworkFindProvidersAsync(ctx context.Context, key cid.Cid } // NetworkGetClosestPeers issues a getClosestPeers query to the filecoin network. -func (na *networkAPI) NetworkGetClosestPeers(ctx context.Context, key string) (<-chan peer.ID, error) { +func (na *networkAPI) NetworkGetClosestPeers(ctx context.Context, key string) ([]peer.ID, error) { return na.network.Network.GetClosestPeers(ctx, key) } diff --git a/app/submodule/network/network_submodule.go b/app/submodule/network/network_submodule.go index e1b7fdf03c..5bf16d5b4f 100644 --- a/app/submodule/network/network_submodule.go +++ b/app/submodule/network/network_submodule.go @@ -10,34 +10,21 @@ import ( "strings" "time" - datatransfer "github.com/filecoin-project/go-data-transfer" - dtnet "github.com/filecoin-project/go-data-transfer/network" - dtgstransport "github.com/filecoin-project/go-data-transfer/transport/graphsync" - "github.com/filecoin-project/venus/pkg/repo" - "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/ipfs/go-bitswap" + bsnet "github.com/ipfs/go-bitswap/network" blocks "github.com/ipfs/go-block-format" bserv "github.com/ipfs/go-blockservice" + "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" - logging "github.com/ipfs/go-log" - - dtimpl "github.com/filecoin-project/go-data-transfer/impl" - "github.com/filecoin-project/venus/pkg/config" - "github.com/filecoin-project/venus/pkg/discovery" - "github.com/filecoin-project/venus/pkg/net" - appstate "github.com/filecoin-project/venus/pkg/state" - "github.com/ipfs/go-bitswap" - bsnet "github.com/ipfs/go-bitswap/network" - "github.com/ipfs/go-cid" "github.com/ipfs/go-graphsync" graphsyncimpl "github.com/ipfs/go-graphsync/impl" gsnet "github.com/ipfs/go-graphsync/network" "github.com/ipfs/go-graphsync/storeutil" exchange "github.com/ipfs/go-ipfs-exchange-interface" cbor "github.com/ipfs/go-ipld-cbor" + logging "github.com/ipfs/go-log" "github.com/libp2p/go-libp2p" - circuit "github.com/libp2p/go-libp2p-circuit" "github.com/libp2p/go-libp2p-core/host" p2pmetrics "github.com/libp2p/go-libp2p-core/metrics" smux "github.com/libp2p/go-libp2p-core/mux" @@ -49,7 +36,20 @@ import ( ma "github.com/multiformats/go-multiaddr" "github.com/pkg/errors" + datatransfer "github.com/filecoin-project/go-data-transfer" + dtimpl "github.com/filecoin-project/go-data-transfer/impl" + dtnet "github.com/filecoin-project/go-data-transfer/network" + dtgstransport "github.com/filecoin-project/go-data-transfer/transport/graphsync" + apiwrapper "github.com/filecoin-project/venus/app/submodule/network/v0api" + "github.com/filecoin-project/venus/pkg/config" + "github.com/filecoin-project/venus/pkg/discovery" + "github.com/filecoin-project/venus/pkg/net" + "github.com/filecoin-project/venus/pkg/repo" + appstate "github.com/filecoin-project/venus/pkg/state" + "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + types "github.com/filecoin-project/venus/venus-shared/chain" + v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" ) @@ -217,9 +217,14 @@ func NewNetworkSubmodule(ctx context.Context, config networkConfig) (*NetworkSub //dataTransger //sc := storedcounter.New(repo.ChainDatastore(), datastore.NewKey("/datatransfer/api/counter")) + // go-data-transfer protocol retries: + // 1s, 5s, 25s, 2m5s, 5m x 11 ~= 1 hour + dtRetryParams := dtnet.RetryParameters(time.Second, 5*time.Minute, 15, 5) + dtn := dtnet.NewFromLibp2pHost(peerHost, dtRetryParams) + dtNet := dtnet.NewFromLibp2pHost(peerHost) dtDs := namespace.Wrap(config.Repo().ChainDatastore(), datastore.NewKey("/datatransfer/api/transfers")) - transport := dtgstransport.NewTransport(peerHost.ID(), gsync) + transport := dtgstransport.NewTransport(peerHost.ID(), gsync, dtn) repoPath, err := config.Repo().Path() if err != nil { @@ -370,8 +375,7 @@ func buildHost(ctx context.Context, config networkConfig, libP2pOpts []libp2p.Op } relayHost, err := libp2p.New( - ctx, - libp2p.EnableRelay(circuit.OptHop), + libp2p.EnableRelay(), // TODO ? libp2p.EnableAutoRelay(), libp2p.Routing(makeDHTRightType), publicAddrFactory, @@ -384,14 +388,16 @@ func buildHost(ctx context.Context, config networkConfig, libP2pOpts []libp2p.Op } return relayHost, nil } - return libp2p.New( - ctx, + + opts := []libp2p.Option{ libp2p.UserAgent("venus"), libp2p.Routing(makeDHTRightType), libp2p.ChainOptions(libP2pOpts...), libp2p.Ping(true), libp2p.DisableRelay(), - ) + } + + return libp2p.New(opts...) } func makeSmuxTransportOption(mplexExp bool) libp2p.Option { diff --git a/app/submodule/paych/paych_api.go b/app/submodule/paych/paych_api.go index 8b1b316b47..3135d61ab3 100644 --- a/app/submodule/paych/paych_api.go +++ b/app/submodule/paych/paych_api.go @@ -36,11 +36,11 @@ func (a *PaychAPI) PaychGet(ctx context.Context, from, to address.Address, amt b } func (a *PaychAPI) PaychAvailableFunds(ctx context.Context, ch address.Address) (*apitypes.ChannelAvailableFunds, error) { - return a.paychMgr.AvailableFunds(ch) + return a.paychMgr.AvailableFunds(ctx, ch) } func (a *PaychAPI) PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*apitypes.ChannelAvailableFunds, error) { - return a.paychMgr.AvailableFundsByFromTo(from, to) + return a.paychMgr.AvailableFundsByFromTo(ctx, from, to) } func (a *PaychAPI) PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (address.Address, error) { @@ -48,7 +48,7 @@ func (a *PaychAPI) PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (add } func (a *PaychAPI) PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) { - return a.paychMgr.AllocateLane(ch) + return a.paychMgr.AllocateLane(ctx, ch) } func (a *PaychAPI) PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []paychtypes.VoucherSpec) (*paychtypes.PaymentInfo, error) { @@ -61,7 +61,7 @@ func (a *PaychAPI) PaychNewPayment(ctx context.Context, from, to address.Address return nil, err } - lane, err := a.paychMgr.AllocateLane(ch.Channel) + lane, err := a.paychMgr.AllocateLane(ctx, ch.Channel) if err != nil { return nil, err } @@ -96,11 +96,11 @@ func (a *PaychAPI) PaychNewPayment(ctx context.Context, from, to address.Address } func (a *PaychAPI) PaychList(ctx context.Context) ([]address.Address, error) { - return a.paychMgr.ListChannels() + return a.paychMgr.ListChannels(ctx) } func (a *PaychAPI) PaychStatus(ctx context.Context, pch address.Address) (*paychtypes.Status, error) { - ci, err := a.paychMgr.GetChannelInfo(pch) + ci, err := a.paychMgr.GetChannelInfo(ctx, pch) if err != nil { return nil, err } diff --git a/app/submodule/paych/paych_submodule.go b/app/submodule/paych/paych_submodule.go index df460d3971..5e923b09f9 100644 --- a/app/submodule/paych/paych_submodule.go +++ b/app/submodule/paych/paych_submodule.go @@ -3,10 +3,11 @@ package paych import ( "context" + "github.com/ipfs/go-datastore" + "github.com/filecoin-project/venus/pkg/paychmgr" v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - "github.com/ipfs/go-datastore" ) //PaychSubmodule support paych related functions, including paych construction, extraction, query and other functions @@ -20,8 +21,8 @@ func NewPaychSubmodule(ctx context.Context, ds datastore.Batching, params *paych return &PaychSubmodule{mgr}, err } -func (ps *PaychSubmodule) Start() error { - return ps.pmgr.Start() +func (ps *PaychSubmodule) Start(ctx context.Context) error { + return ps.pmgr.Start(ctx) } func (ps *PaychSubmodule) Stop() { diff --git a/app/submodule/syncer/syncer_api.go b/app/submodule/syncer/syncer_api.go index a68ebe01b8..d21be52400 100644 --- a/app/submodule/syncer/syncer_api.go +++ b/app/submodule/syncer/syncer_api.go @@ -80,7 +80,7 @@ func (sa *syncerAPI) Concurrent(ctx context.Context) int64 { // ChainTipSetWeight computes weight for the specified tipset. func (sa *syncerAPI) ChainTipSetWeight(ctx context.Context, tsk types.TipSetKey) (big.Int, error) { - ts, err := sa.syncer.ChainModule.ChainReader.GetTipSet(tsk) + ts, err := sa.syncer.ChainModule.ChainReader.GetTipSet(ctx, tsk) if err != nil { return big.Int{}, err } @@ -102,17 +102,17 @@ func (sa *syncerAPI) SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) e return xerrors.Errorf("loading parent block: %v", err) } - if err := sa.syncer.SlashFilter.MinedBlock(blk.Header, parent.Height); err != nil { + if err := sa.syncer.SlashFilter.MinedBlock(ctx, blk.Header, parent.Height); err != nil { log.Errorf(" SLASH FILTER ERROR: %s", err) return xerrors.Errorf(" SLASH FILTER ERROR: %v", err) } // TODO: should we have some sort of fast path to adding a local block? - bmsgs, err := chainModule.MessageStore.LoadUnsignedMessagesFromCids(blk.BlsMessages) + bmsgs, err := chainModule.MessageStore.LoadUnsignedMessagesFromCids(ctx, blk.BlsMessages) if err != nil { return xerrors.Errorf("failed to load bls messages: %v", err) } - smsgs, err := chainModule.MessageStore.LoadSignedMessagesFromCids(blk.SecpkMessages) + smsgs, err := chainModule.MessageStore.LoadSignedMessagesFromCids(ctx, blk.SecpkMessages) if err != nil { return xerrors.Errorf("failed to load secpk message: %v", err) } @@ -123,7 +123,7 @@ func (sa *syncerAPI) SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) e SECPMessages: smsgs, } - if err := sa.syncer.BlockValidator.ValidateMsgMeta(fb); err != nil { + if err := sa.syncer.BlockValidator.ValidateMsgMeta(ctx, fb); err != nil { return xerrors.Errorf("provided messages did not match block: %v", err) } @@ -166,7 +166,7 @@ func (sa *syncerAPI) SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) e // tipset. func (sa *syncerAPI) StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*apitypes.InvocResult, error) { start := time.Now() - ts, err := sa.syncer.ChainModule.ChainReader.GetTipSet(tsk) + ts, err := sa.syncer.ChainModule.ChainReader.GetTipSet(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %v", tsk, err) } diff --git a/app/submodule/syncer/syncer_submodule.go b/app/submodule/syncer/syncer_submodule.go index 0bddf403fd..fd7070ccb9 100644 --- a/app/submodule/syncer/syncer_submodule.go +++ b/app/submodule/syncer/syncer_submodule.go @@ -245,7 +245,7 @@ func (syncer *SyncerSubmodule) handleIncomingBlocks(ctx context.Context, msg pub // nolint func (syncer *SyncerSubmodule) loadLocalFullTipset(ctx context.Context, tsk types.TipSetKey) (*types.FullTipSet, error) { - ts, err := syncer.ChainModule.ChainReader.GetTipSet(tsk) + ts, err := syncer.ChainModule.ChainReader.GetTipSet(ctx, tsk) if err != nil { return nil, err } diff --git a/app/submodule/wallet/remotewallet/remote.go b/app/submodule/wallet/remotewallet/remote.go index 87cac4d09f..5f7a1bac32 100644 --- a/app/submodule/wallet/remotewallet/remote.go +++ b/app/submodule/wallet/remotewallet/remote.go @@ -19,7 +19,7 @@ type remoteWallet struct { Cancel func() } -func (w *remoteWallet) Addresses() []address.Address { +func (w *remoteWallet) Addresses(ctx context.Context) []address.Address { wallets, err := w.IWallet.WalletList(context.Background()) if err != nil { return make([]address.Address, 0) @@ -27,7 +27,7 @@ func (w *remoteWallet) Addresses() []address.Address { return wallets } -func (w *remoteWallet) HasPassword() bool { +func (w *remoteWallet) HasPassword(ctx context.Context) bool { return true } @@ -50,22 +50,22 @@ func SetupRemoteWallet(info string) (wallet.WalletIntersection, error) { }, nil } -func (w *remoteWallet) HasAddress(addr address.Address) bool { +func (w *remoteWallet) HasAddress(ctx context.Context, addr address.Address) bool { exist, err := w.IWallet.WalletHas(context.Background(), addr) if err != nil { return false } return exist } -func (w *remoteWallet) NewAddress(protocol address.Protocol) (address.Address, error) { +func (w *remoteWallet) NewAddress(ctx context.Context, protocol address.Protocol) (address.Address, error) { return w.IWallet.WalletNew(context.Background(), GetKeyType(protocol)) } -func (w *remoteWallet) Import(key *crypto.KeyInfo) (address.Address, error) { +func (w *remoteWallet) Import(ctx context.Context, key *crypto.KeyInfo) (address.Address, error) { return w.IWallet.WalletImport(context.Background(), ConvertRemoteKeyInfo(key)) } -func (w *remoteWallet) Export(addr address.Address, password string) (*crypto.KeyInfo, error) { +func (w *remoteWallet) Export(ctx context.Context, addr address.Address, password string) (*crypto.KeyInfo, error) { key, err := w.IWallet.WalletExport(context.Background(), addr) if err != nil { return nil, err @@ -73,6 +73,6 @@ func (w *remoteWallet) Export(addr address.Address, password string) (*crypto.Ke return ConvertLocalKeyInfo(key), nil } -func (w *remoteWallet) WalletSign(keyAddr address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) { +func (w *remoteWallet) WalletSign(ctx context.Context, keyAddr address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) { return w.IWallet.WalletSign(context.Background(), keyAddr, msg, meta) } diff --git a/app/submodule/wallet/wallet_api.go b/app/submodule/wallet/wallet_api.go index 7ddee55eba..781fc0f230 100644 --- a/app/submodule/wallet/wallet_api.go +++ b/app/submodule/wallet/wallet_api.go @@ -40,7 +40,7 @@ func (walletAPI *WalletAPI) WalletBalance(ctx context.Context, addr address.Addr // WalletHas indicates whether the given address is in the wallet. func (walletAPI *WalletAPI) WalletHas(ctx context.Context, addr address.Address) (bool, error) { - return walletAPI.adapter.HasAddress(addr), nil + return walletAPI.adapter.HasAddress(ctx, addr), nil } // SetWalletDefaultAddress set the specified address as the default in the config. @@ -67,7 +67,7 @@ func (walletAPI *WalletAPI) WalletDefaultAddress(ctx context.Context) (address.A // WalletAddresses gets addresses from the walletModule func (walletAPI *WalletAPI) WalletAddresses(ctx context.Context) []address.Address { - return walletAPI.adapter.Addresses() + return walletAPI.adapter.Addresses(ctx) } // SetWalletDefaultAddress set the specified address as the default in the config. @@ -86,13 +86,13 @@ func (walletAPI *WalletAPI) WalletSetDefault(ctx context.Context, addr address.A } // WalletNewAddress generates a new walletModule address -func (walletAPI *WalletAPI) WalletNewAddress(protocol address.Protocol) (address.Address, error) { - return walletAPI.adapter.NewAddress(protocol) +func (walletAPI *WalletAPI) WalletNewAddress(ctx context.Context, protocol address.Protocol) (address.Address, error) { + return walletAPI.adapter.NewAddress(ctx, protocol) } // WalletImport adds a given set of KeyInfos to the walletModule -func (walletAPI *WalletAPI) WalletImport(key *wtypes.KeyInfo) (address.Address, error) { - addr, err := walletAPI.adapter.Import(remotewallet.ConvertLocalKeyInfo(key)) +func (walletAPI *WalletAPI) WalletImport(ctx context.Context, key *wtypes.KeyInfo) (address.Address, error) { + addr, err := walletAPI.adapter.Import(ctx, remotewallet.ConvertLocalKeyInfo(key)) if err != nil { return address.Undef, err } @@ -100,8 +100,8 @@ func (walletAPI *WalletAPI) WalletImport(key *wtypes.KeyInfo) (address.Address, } // WalletExport returns the KeyInfos for the given walletModule addresses -func (walletAPI *WalletAPI) WalletExport(addr address.Address, password string) (*wtypes.KeyInfo, error) { - ki, err := walletAPI.adapter.Export(addr, password) +func (walletAPI *WalletAPI) WalletExport(ctx context.Context, addr address.Address, password string) (*wtypes.KeyInfo, error) { + ki, err := walletAPI.adapter.Export(ctx, addr, password) if err != nil { return nil, err } @@ -114,7 +114,7 @@ func (walletAPI *WalletAPI) WalletSign(ctx context.Context, k address.Address, m if err != nil { return nil, xerrors.Errorf("ResolveTokeyAddress failed:%v", err) } - return walletAPI.adapter.WalletSign(keyAddr, msg, meta) + return walletAPI.adapter.WalletSign(ctx, keyAddr, msg, meta) } // WalletSignMessage signs the given message using the given address. @@ -137,25 +137,25 @@ func (walletAPI *WalletAPI) WalletSignMessage(ctx context.Context, k address.Add // LockWallet lock wallet func (walletAPI *WalletAPI) LockWallet(ctx context.Context) error { - return walletAPI.walletModule.Wallet.LockWallet() + return walletAPI.walletModule.Wallet.LockWallet(ctx) } // UnLockWallet unlock wallet func (walletAPI *WalletAPI) UnLockWallet(ctx context.Context, password []byte) error { - return walletAPI.walletModule.Wallet.UnLockWallet(password) + return walletAPI.walletModule.Wallet.UnLockWallet(ctx, password) } // SetPassword set wallet password -func (walletAPI *WalletAPI) SetPassword(Context context.Context, password []byte) error { - return walletAPI.walletModule.Wallet.SetPassword(password) +func (walletAPI *WalletAPI) SetPassword(ctx context.Context, password []byte) error { + return walletAPI.walletModule.Wallet.SetPassword(ctx, password) } // HasPassword return whether the wallet has password -func (walletAPI *WalletAPI) HasPassword(Context context.Context) bool { - return walletAPI.adapter.HasPassword() +func (walletAPI *WalletAPI) HasPassword(ctx context.Context) bool { + return walletAPI.adapter.HasPassword(ctx) } // WalletState return wallet state -func (walletAPI *WalletAPI) WalletState(Context context.Context) int { - return walletAPI.walletModule.Wallet.WalletState() +func (walletAPI *WalletAPI) WalletState(ctx context.Context) int { + return walletAPI.walletModule.Wallet.WalletState(ctx) } diff --git a/app/submodule/wallet/wallet_submodule.go b/app/submodule/wallet/wallet_submodule.go index 51772ed24f..376547d204 100644 --- a/app/submodule/wallet/wallet_submodule.go +++ b/app/submodule/wallet/wallet_submodule.go @@ -45,7 +45,7 @@ func NewWalletSubmodule(ctx context.Context, if err != nil { return nil, errors.Wrap(err, "failed to get passphrase config") } - backend, err := wallet.NewDSBackend(repo.WalletDatastore(), passphraseCfg, password) + backend, err := wallet.NewDSBackend(ctx, repo.WalletDatastore(), passphraseCfg, password) if err != nil { return nil, errors.Wrap(err, "failed to set up walletModule backend") } diff --git a/cmd/address.go b/cmd/address.go index b274b65105..ce33c2ea2a 100644 --- a/cmd/address.go +++ b/cmd/address.go @@ -77,7 +77,7 @@ var addrsNewCmd = &cmds.Command{ return errWalletLocked } - addr, err := env.(*node.Env).WalletAPI.WalletNewAddress(protocol) + addr, err := env.(*node.Env).WalletAPI.WalletNewAddress(req.Context, protocol) if err != nil { return err } @@ -260,7 +260,7 @@ var walletImportCmd = &cmds.Command{ return err } - addr, err := env.(*node.Env).WalletAPI.WalletImport(&key) + addr, err := env.(*node.Env).WalletAPI.WalletImport(req.Context, &key) if err != nil { return err } @@ -303,7 +303,7 @@ var ( } pw := req.Arguments[1] - ki, err := env.(*node.Env).WalletAPI.WalletExport(addr, pw) + ki, err := env.(*node.Env).WalletAPI.WalletExport(req.Context, addr, pw) if err != nil { return err } diff --git a/cmd/address_integration_test.go b/cmd/address_integration_test.go index 9e80f47620..0e90883006 100644 --- a/cmd/address_integration_test.go +++ b/cmd/address_integration_test.go @@ -33,7 +33,7 @@ func TestAddressNewAndList(t *testing.T) { addrs := make([]address.Address, 10) var err error for i := 0; i < 10; i++ { - addrs[i], err = n.Wallet().API().WalletNewAddress(address.SECP256K1) + addrs[i], err = n.Wallet().API().WalletNewAddress(ctx, address.SECP256K1) require.NoError(t, err) } @@ -54,7 +54,7 @@ func TestWalletBalance(t *testing.T) { n, cmdClient, done := builder.BuildAndStartAPI(ctx) defer done() - addr, err := n.Wallet().API().WalletNewAddress(address.SECP256K1) + addr, err := n.Wallet().API().WalletNewAddress(ctx, address.SECP256K1) require.NoError(t, err) t.Log("[success] not found, zero") @@ -107,7 +107,7 @@ func TestWalletExportImportRoundTrip(t *testing.T) { n, cmdClient, done := builder.BuildAndStartAPI(ctx) defer done() - addr, err := n.Wallet().API().WalletNewAddress(address.SECP256K1) + addr, err := n.Wallet().API().WalletNewAddress(ctx, address.SECP256K1) require.NoError(t, err) // ./venus wallet ls diff --git a/cmd/daemon.go b/cmd/daemon.go index 1ff055760a..6f2de707b2 100644 --- a/cmd/daemon.go +++ b/cmd/daemon.go @@ -233,7 +233,7 @@ func daemonRun(req *cmds.Request, re cmds.ResponseEmitter) error { } importPath, _ := req.Options[ImportSnapshot].(string) if len(importPath) != 0 { - err := Import(rep, importPath) + err := Import(req.Context, rep, importPath) if err != nil { log.Errorf("failed to import snapshot, import path: %s, error: %s", importPath, err.Error()) return err @@ -368,7 +368,7 @@ func loadGenesis(ctx context.Context, rep repo.Repo, sourceName string, network defer func() { _ = source.Close() }() - genesisBlk, err := extractGenesisBlock(source, rep) + genesisBlk, err := extractGenesisBlock(ctx, source, rep) if err != nil { return nil, err } @@ -444,15 +444,15 @@ func openGenesisSource(sourceName string) (io.ReadCloser, error) { return source, nil } -func extractGenesisBlock(source io.ReadCloser, rep repo.Repo) (*types.BlockHeader, error) { +func extractGenesisBlock(ctx context.Context, source io.ReadCloser, rep repo.Repo) (*types.BlockHeader, error) { bs := rep.Datastore() - ch, err := car.LoadCar(bs, source) + ch, err := car.LoadCar(ctx, bs, source) if err != nil { return nil, err } // need to check if we are being handed a car file with a single genesis block or an entire chain. - bsBlk, err := bs.Get(ch.Roots[0]) + bsBlk, err := bs.Get(ctx, ch.Roots[0]) if err != nil { return nil, err } diff --git a/cmd/import.go b/cmd/import.go index 8925ce6a6c..078e79f9ed 100644 --- a/cmd/import.go +++ b/cmd/import.go @@ -21,11 +21,11 @@ var logImport = logging.Logger("commands/import") // Import cache tipset cids to store. // The value of the cached tipset CIDS is used as the check-point when running `venus daemon` -func Import(r repo.Repo, fileName string) error { - return importChain(r, fileName) +func Import(ctx context.Context, r repo.Repo, fileName string) error { + return importChain(ctx, r, fileName) } -func importChain(r repo.Repo, fname string) error { +func importChain(ctx context.Context, r repo.Repo, fname string) error { var rd io.Reader var l int64 if strings.HasPrefix(fname, "http://") || strings.HasPrefix(fname, "https://") { @@ -76,7 +76,7 @@ func importChain(r repo.Repo, fname string) error { bar.Units = pb.U_BYTES bar.Start() - tip, err := chainStore.Import(br) + tip, err := chainStore.Import(ctx, br) if err != nil { return xerrors.Errorf("importing chain failed: %s", err) } diff --git a/cmd/miner.go b/cmd/miner.go index ab921b6d95..721a876ae9 100644 --- a/cmd/miner.go +++ b/cmd/miner.go @@ -89,7 +89,7 @@ var newMinerCmd = &cmds.Command{ if env.(*node.Env).WalletAPI.WalletState(req.Context) == wallet.Lock { return errWalletLocked } - if worker, err = env.(*node.Env).WalletAPI.WalletNewAddress(address.BLS); err != nil { + if worker, err = env.(*node.Env).WalletAPI.WalletNewAddress(req.Context, address.BLS); err != nil { return err } } diff --git a/cmd/swarm.go b/cmd/swarm.go index 492958fbdc..1851d1c6d8 100644 --- a/cmd/swarm.go +++ b/cmd/swarm.go @@ -135,7 +135,7 @@ var queryDhtCmd = &cmds.Command{ go func() { defer cancel() - for p := range closestPeers { + for _, p := range closestPeers { routing.PublishQueryEvent(ctx, &routing.QueryEvent{ ID: p, Type: routing.FinalPeer, diff --git a/go.mod b/go.mod index 2b94584a0e..2f3c596ca6 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/awnumar/memguard v0.22.2 github.com/bluele/gcache v0.0.0-20190518031135-bc40bd653833 github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e - github.com/dgraph-io/badger/v2 v2.2007.2 + github.com/dgraph-io/badger/v2 v2.2007.3 github.com/docker/distribution v2.7.1+incompatible // indirect github.com/docker/docker v0.7.3-0.20190315170154-87d593639c77 github.com/docker/go-connections v0.4.0 // indirect @@ -27,15 +27,14 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.0-20201016124514-d0bbec7bfcc4 github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 - github.com/filecoin-project/go-data-transfer v1.10.1 + github.com/filecoin-project/go-data-transfer v1.12.0 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543 github.com/filecoin-project/go-paramfetch v0.0.2 github.com/filecoin-project/go-state-types v0.1.1 - github.com/filecoin-project/go-statestore v0.1.1 // indirect github.com/filecoin-project/specs-actors v0.9.14 - github.com/filecoin-project/specs-actors/v2 v2.3.5 + github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 @@ -47,65 +46,64 @@ require ( github.com/gbrlsnchs/jwt/v3 v3.0.0 github.com/go-errors/errors v1.0.1 github.com/go-kit/kit v0.10.0 - github.com/golang/mock v1.4.4 + github.com/golang/mock v1.6.0 github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf // indirect github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a github.com/golangci/golangci-lint v1.39.0 github.com/google/flatbuffers v2.0.0+incompatible // indirect github.com/google/go-github v17.0.0+incompatible - github.com/google/uuid v1.2.0 + github.com/google/uuid v1.3.0 github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e - github.com/hashicorp/go-multierror v1.1.0 + github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/golang-lru v0.5.4 github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c github.com/ipfs-force-community/metrics v1.0.1-0.20211022060227-11142a08b729 github.com/ipfs-force-community/venus-common-utils v0.0.0-20210714054928-2042a9040759 - github.com/ipfs/go-bitswap v0.3.2 + github.com/ipfs/go-bitswap v0.5.1 github.com/ipfs/go-block-format v0.0.3 - github.com/ipfs/go-blockservice v0.1.4 + github.com/ipfs/go-blockservice v0.2.1 github.com/ipfs/go-cid v0.1.0 - github.com/ipfs/go-datastore v0.4.5 - github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e + github.com/ipfs/go-datastore v0.5.1 + github.com/ipfs/go-ds-badger2 v0.1.2 github.com/ipfs/go-fs-lock v0.0.6 - github.com/ipfs/go-graphsync v0.9.1 - github.com/ipfs/go-ipfs-blockstore v1.0.3 + github.com/ipfs/go-graphsync v0.11.0 + github.com/ipfs/go-ipfs-blockstore v1.1.2 github.com/ipfs/go-ipfs-chunker v0.0.5 github.com/ipfs/go-ipfs-cmdkit v0.0.1 github.com/ipfs/go-ipfs-cmds v0.5.0 - github.com/ipfs/go-ipfs-ds-help v1.0.0 - github.com/ipfs/go-ipfs-exchange-interface v0.0.1 - github.com/ipfs/go-ipfs-exchange-offline v0.0.1 + github.com/ipfs/go-ipfs-ds-help v1.1.0 + github.com/ipfs/go-ipfs-exchange-interface v0.1.0 + github.com/ipfs/go-ipfs-exchange-offline v0.1.1 github.com/ipfs/go-ipfs-files v0.0.8 - github.com/ipfs/go-ipfs-routing v0.1.0 - github.com/ipfs/go-ipld-cbor v0.0.5 + github.com/ipfs/go-ipfs-routing v0.2.1 + github.com/ipfs/go-ipld-cbor v0.0.6 github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-log v1.0.5 - github.com/ipfs/go-log/v2 v2.3.0 - github.com/ipfs/go-merkledag v0.3.2 + github.com/ipfs/go-log/v2 v2.4.0 + github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-path v0.0.7 github.com/ipfs/go-unixfs v0.2.4 github.com/ipfs/iptb v1.4.0 - github.com/ipld/go-car v0.3.1-0.20210601190600-f512dac51e8e + github.com/ipld/go-car v0.3.3 github.com/jbenet/goprocess v0.1.4 github.com/jstemmer/go-junit-report v0.9.1 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.14.2 - github.com/libp2p/go-libp2p-circuit v0.4.0 - github.com/libp2p/go-libp2p-core v0.8.5 - github.com/libp2p/go-libp2p-kad-dht v0.11.0 + github.com/libp2p/go-libp2p v0.17.0 + github.com/libp2p/go-libp2p-core v0.13.0 + github.com/libp2p/go-libp2p-kad-dht v0.15.0 github.com/libp2p/go-libp2p-mplex v0.4.1 - github.com/libp2p/go-libp2p-peerstore v0.2.7 - github.com/libp2p/go-libp2p-pubsub v0.4.2-0.20210212194758-6c1addf493eb - github.com/libp2p/go-libp2p-swarm v0.5.0 - github.com/libp2p/go-libp2p-yamux v0.5.4 + github.com/libp2p/go-libp2p-peerstore v0.6.0 + github.com/libp2p/go-libp2p-pubsub v0.6.0 + github.com/libp2p/go-libp2p-swarm v0.9.0 + github.com/libp2p/go-libp2p-yamux v0.7.0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 github.com/mitchellh/mapstructure v1.4.1 // indirect github.com/morikuni/aec v1.0.0 // indirect - github.com/multiformats/go-multiaddr v0.3.3 + github.com/multiformats/go-multiaddr v0.4.0 github.com/multiformats/go-multiaddr-dns v0.3.1 - github.com/multiformats/go-multihash v0.0.15 + github.com/multiformats/go-multihash v0.1.0 github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.1 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible @@ -127,8 +125,8 @@ require ( github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325 github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 // indirect go.opencensus.io v0.23.0 - go.uber.org/zap v1.16.0 - golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf + go.uber.org/zap v1.19.0 + golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 @@ -143,7 +141,6 @@ replace ( github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi github.com/filecoin-project/go-jsonrpc => github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc github.com/filecoin-project/test-vectors => ./extern/test-vectors - github.com/filecoin-project/venus => ./ github.com/golangci/golangci-lint => github.com/golangci/golangci-lint v1.39.0 github.com/ipfs/go-ipfs-cmds => github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab ) diff --git a/go.sum b/go.sum index 2d472ce903..4c3327a8d5 100644 --- a/go.sum +++ b/go.sum @@ -128,8 +128,9 @@ github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZw github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/benbjohnson/clock v1.0.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.0.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -151,12 +152,14 @@ github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcug github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.21.0-beta h1:At9hIZdJW0s9E/fAz28nrz6AmcNlSVucCH796ZteX1M= github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= +github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= +github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= @@ -182,6 +185,8 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -237,8 +242,8 @@ github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlN github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= -github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= -github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= +github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= +github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/badger/v3 v3.2011.1 h1:Hmyof0WMEF/QtutX5SQHzIMnJQxb/IrSzhjckV2SD6g= github.com/dgraph-io/badger/v3 v3.2011.1/go.mod h1:0rLLrQpKVQAL0or/lBLMQznhr6dWWX7h5AKnmnqx268= github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= @@ -281,6 +286,8 @@ github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4s github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/esimonov/ifshort v1.0.2 h1:K5s1W2fGfkoWXsFlxBNqT6J0ZCncPaKrGM5qe0bni68= @@ -312,10 +319,10 @@ github.com/filecoin-project/go-commp-utils v0.1.3 h1:rTxbkNXZU7FLgdkBk8RsQIEOuPO github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9ANQrY3fDFoXdqyX04J+dWpK30= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.10.1 h1:YQNLwhizxkdfFxegAyrnn3l7WjgMjqDlqFzr18iWiYI= -github.com/filecoin-project/go-data-transfer v1.10.1/go.mod h1:CSDMCrPK2lVGodNB1wPEogjFvM9nVGyiL1GNbBRTSdw= -github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= -github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= +github.com/filecoin-project/go-data-transfer v1.12.0 h1:y44x35JvB93kezahMURKizIa/aizGTPSHqi5cbAfTEo= +github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= +github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= +github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -342,15 +349,15 @@ github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psS github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe h1:dF8u+LEWeIcTcfUcCf3WFVlc81Fr2JKg8zPzIbBDKDw= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-statestore v0.1.1 h1:ufMFq00VqnT2CAuDpcGnwLnCX1I/c3OROw/kXVNSTZk= -github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= +github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= +github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= -github.com/filecoin-project/specs-actors/v2 v2.3.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= -github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= +github.com/filecoin-project/specs-actors/v2 v2.3.6 h1:UxnWTfQd7JsOae39/aHCK0m1IBjdcyymCJfqxuSkn+g= +github.com/filecoin-project/specs-actors/v2 v2.3.6/go.mod h1:DJMpxVRXvev9t8P0XWA26RmTzN+MHiL9IlItVLT0zUc= github.com/filecoin-project/specs-actors/v3 v3.1.0/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= github.com/filecoin-project/specs-actors/v3 v3.1.1 h1:BE8fsns1GnEOxt1DTE5LxBK2FThXtWmCChgcJoHTg0E= github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= @@ -379,8 +386,9 @@ github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJn github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -441,6 +449,8 @@ github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfC github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8= @@ -496,8 +506,9 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= @@ -515,8 +526,9 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1 h1:jAbXjIeW2ZSW2AwFxlGTDoc2CjI2XujLkV3ArsZFCvc= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf h1:gFVkHXmVAhEbxZVDln5V9GKrLaluNoFHDbrZwAWZgws= @@ -569,7 +581,6 @@ github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASu github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= -github.com/google/gopacket v1.1.18/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -588,8 +599,9 @@ github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4Mgqvf github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -641,8 +653,9 @@ github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpg github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.14.6 h1:8ERzHx8aj1Sc47mu9n/AksaKCSWrMchFtkdrS4BIj5o= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/gxed/go-shellwords v1.0.3/go.mod h1:N7paucT91ByIjmVJHhvoarjoQnmsi3Jd3vH7VqgtMxQ= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= @@ -663,8 +676,9 @@ github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= @@ -689,8 +703,9 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= +github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -717,18 +732,16 @@ github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyq github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= -github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= -github.com/ipfs/go-bitswap v0.3.2 h1:TdKx7lpidYe2dMAKfdeNS26y6Pc/AZX/i8doI1GV210= -github.com/ipfs/go-bitswap v0.3.2/go.mod h1:AyWWfN3moBzQX0banEtfKOfbXb3ZeoOeXnZGNPV9S6w= +github.com/ipfs/go-bitswap v0.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= +github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.4 h1:Vq+MlsH8000KbbUciRyYMEw/NNP8UAGmcqKi4uWmFGA= -github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= +github.com/ipfs/go-blockservice v0.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= +github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -744,13 +757,14 @@ github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAK github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.5 h1:cwOUcGMLdLPWgu3SlrCckCMznaGADbPqE0r8h768/Dg= github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= +github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.5.1 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ= +github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -758,28 +772,26 @@ github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaH github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= -github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= +github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= +github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= github.com/ipfs/go-ds-badger2 v0.1.0/go.mod h1:pbR1p817OZbdId9EvLOhKBgUVTM3BMCSTan78lDDVaw= -github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e h1:Xi1nil8K2lBOorBS6Ys7+hmUCzH8fr3U9ipdL/IrcEI= -github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e/go.mod h1:lJnws7amT9Ehqzta0gwMrRsURU04caT0iRPr1W8AsOU= +github.com/ipfs/go-ds-badger2 v0.1.2 h1:sQc2q1gaXrv8YFNeUtxil0neuyDf9hnVHfLsi7lpXfE= +github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-filestore v1.0.0 h1:QR7ekKH+q2AGiWDc7W2Q0qHuYSRZGUJqUn0GsegEPb0= -github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= +github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-graphsync v0.9.1 h1:jo7ZaAZ3lal89RhKxKoRkPzIO8lmOY6KUWA1mDRZ2+U= -github.com/ipfs/go-graphsync v0.9.1/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= +github.com/ipfs/go-graphsync v0.11.0 h1:PiiD5CnoC3xEHMW8d6uBGqGcoTwiMB5d9CORIEyF6iA= +github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= -github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= -github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= -github.com/ipfs/go-ipfs-blockstore v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= -github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.3 h1:RDhK6fdg5YsonkpMuMpdvk/pRtOQlrIRIybuQfkvB2M= -github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= +github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= +github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= +github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= +github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= @@ -792,12 +804,15 @@ github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1I github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= -github.com/ipfs/go-ipfs-ds-help v1.0.0 h1:bEQ8hMGs80h0sR8O4tfDgV6B01aaF9qeTrujrTLYV3g= github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE= -github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6rY30GUu7G6LUfpMvM= +github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= +github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= -github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= +github.com/ipfs/go-ipfs-exchange-interface v0.1.0 h1:TiMekCrOGQuWYtZO3mf4YJXDIdNgnKWZ9IE3fGlnWfo= +github.com/ipfs/go-ipfs-exchange-interface v0.1.0/go.mod h1:ych7WPlyHqFvCi/uQI48zLZuAWVP5iTQPXEfVaw5WEI= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1 h1:mEiXWdbMN6C7vtDG21Fphx8TGCbZPpQnz/496w/PL4g= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.8 h1:8o0oFJkJ8UkO/ABl8T6ac6tKF3+NIpj67aAB6ZpusRg= @@ -808,22 +823,27 @@ github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7 github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= -github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= +github.com/ipfs/go-ipfs-routing v0.2.1 h1:E+whHWhJkdN9YeoHZNj5itzc+OR292AJ2uE9FFiW0BY= +github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= +github.com/ipfs/go-ipld-cbor v0.0.6 h1:pYuWHyvSpIsOOLw4Jy7NbBkCyzLDcl64Bf/LZW7eBQ0= +github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= -github.com/ipfs/go-ipns v0.0.2 h1:oq4ErrV4hNQ2Eim257RTYRgfOSV/s8BDaf9iIl4NwFs= -github.com/ipfs/go-ipns v0.0.2/go.mod h1:WChil4e0/m9cIINWLxZe1Jtf77oz5L05rO2ei/uKJ5U= +github.com/ipfs/go-ipld-legacy v0.1.0 h1:wxkkc4k8cnvIGIjPO0waJCe7SHEyFgl+yQdafdjGrpA= +github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= +github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI= +github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMRR8I= @@ -840,23 +860,22 @@ github.com/ipfs/go-log/v2 v2.0.8/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscw github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= -github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= +github.com/ipfs/go-log/v2 v2.4.0 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= +github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= -github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -github.com/ipfs/go-merkledag v0.3.2 h1:MRqj40QkrWkvPswXs4EfSslhZ4RVPRbxwX11js0t1xY= -github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= +github.com/ipfs/go-merkledag v0.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= +github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.2.0 h1:2cSr7exUGKYyDeUyQ7P/nHPs9P7Ht/B+ROrpN1EJOjc= -github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= +github.com/ipfs/go-peertaskqueue v0.7.0 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= +github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4 h1:6NwppOXefWIyysZ4LR/qUBPvXd5//8J3jiMdvpbw6Lo= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= @@ -865,16 +884,17 @@ github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZ github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.3.1-0.20210601190600-f512dac51e8e h1:iTAJWTWEMe0Lx8JwRaIYrYgDuI9bVzkgogGz43Yv9Eo= -github.com/ipld/go-car v0.3.1-0.20210601190600-f512dac51e8e/go.mod h1:wUxBdwOLA9/0HZBi3fnTBzla0MuwlqgJLyrhOg1XaKI= -github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= +github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= +github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= +github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.12.0 h1:JapyKWTsJgmhrPI7hfx4V798c/RClr85sXfBZnH1VIw= -github.com/ipld/go-ipld-prime v0.12.0/go.mod h1:hy8b93WleDMRKumOJnTIrr0MbbFbx9GD6Kzxa53Xppc= +github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 h1:olscE5Sv+ts+N9YLQsIL9k6eS6y6CXMGRl5RCr2Cn/E= +github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= @@ -883,7 +903,6 @@ github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= -github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= @@ -958,19 +977,24 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw= +github.com/klauspost/compress v1.11.7 h1:0hzRabrMN4tSTvMfnL3SCv1ZGeAP23ynzodBgaHeMeg= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d h1:68u9r4wEvL3gYg2jvAOgROwZ3H+Y3hIDk4tbbmIjcYQ= github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= +github.com/koron/go-ssdp v0.0.2 h1:fL3wAoyT6hXHQlORyXUW4Q23kkQpJRgEAYcZB5BR71o= +github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJuqPYs= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -995,8 +1019,9 @@ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= -github.com/libp2p/go-addr-util v0.0.2 h1:7cWK5cdA5x72jX0g8iLrQWm5TRJZ6CzGdPEhWj7plWU= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= +github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= +github.com/libp2p/go-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= @@ -1006,8 +1031,9 @@ github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40J github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= -github.com/libp2p/go-conn-security-multistream v0.2.1 h1:ft6/POSK7F+vl/2qzegnHDaXFU0iWB4yVTYrioC6Zy0= github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= +github.com/libp2p/go-conn-security-multistream v0.3.0 h1:9UCIKlBL1hC9u7nkMXpD1nkc/T53PKMAn3/k9ivBAVc= +github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= @@ -1024,12 +1050,14 @@ github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniV github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= -github.com/libp2p/go-libp2p v0.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0= -github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= -github.com/libp2p/go-libp2p v0.14.2 h1:qs0ABtjjNjS+RIXT1uM7sMJEvIc0pq2nKR0VQxFXhHI= -github.com/libp2p/go-libp2p v0.14.2/go.mod h1:0PQMADQEjCM2l8cSMYDpTgsb8gr6Zq7i4LUgq1mlW2E= -github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052 h1:BM7aaOF7RpmNn9+9g6uTjGJ0cTzWr5j9i9IKeun2M8U= +github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= +github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= +github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= +github.com/libp2p/go-libp2p v0.17.0 h1:8l4GV401OSd4dFRyHDtIT/mEzdh/aQGoFC8xshYgm5M= +github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= +github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= +github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= @@ -1037,15 +1065,17 @@ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQ github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= -github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-autonat v0.4.2 h1:YMp7StMi2dof+baaxkbxaizXjY1RPvU71CXfxExzcUU= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= +github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= +github.com/libp2p/go-libp2p-autonat v0.7.0 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= +github.com/libp2p/go-libp2p-autonat v0.7.0/go.mod h1:uPvPn6J7cN+LCfFwW5tpOYvAz5NvPTc4iBamTV/WDMg= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= -github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= +github.com/libp2p/go-libp2p-blankhost v0.3.0 h1:kTnLArltMabZlzY63pgGDA4kkUcLkBFSM98zBssn/IY= +github.com/libp2p/go-libp2p-blankhost v0.3.0/go.mod h1:urPC+7U01nCGgJ3ZsV8jdwTp6Ji9ID0dMTvq+aJ+nZU= github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= @@ -1081,8 +1111,14 @@ github.com/libp2p/go-libp2p-core v0.7.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.5 h1:aEgbIcPGsKy6zYcC+5AJivYFedhYa4sW7mIpWpUaLKw= github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= +github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= +github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.13.0 h1:IFG/s8dN6JN2OTrXX9eq2wNU/Zlz2KLdwZUp5FplgXI= +github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -1091,16 +1127,18 @@ github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFT github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= -github.com/libp2p/go-libp2p-discovery v0.5.0 h1:Qfl+e5+lfDgwdrXdu4YNCWyEo3fWuP+WgN9mN0iWviQ= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= +github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-kad-dht v0.11.0 h1:ZLhlmDKsFiOkPhTzfEqBrMy/1Tqx+Dk6UgbHM5//IQM= -github.com/libp2p/go-libp2p-kad-dht v0.11.0/go.mod h1:5ojtR2acDPqh/jXf5orWy8YGb8bHQDS+qeDcoscL/PI= +github.com/libp2p/go-libp2p-kad-dht v0.15.0 h1:Ke+Oj78gX5UDXnA6HBdrgvi+fStJxgYTDa51U0TsCLo= +github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= +github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk= github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= @@ -1112,22 +1150,23 @@ github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3 github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= -github.com/libp2p/go-libp2p-mplex v0.3.0/go.mod h1:l9QWxRbbb5/hQMECEb908GbS9Sm2UAR2KFZKUJEynEs= github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aDN3Fx1sc= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= -github.com/libp2p/go-libp2p-nat v0.0.6 h1:wMWis3kYynCbHoyKLPBEMu4YRLltbm8Mk08HGSfvTkU= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= +github.com/libp2p/go-libp2p-nat v0.1.0 h1:vigUi2MEN+fwghe5ijpScxtbbDz+L/6y8XwlzYOJgSY= +github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= -github.com/libp2p/go-libp2p-noise v0.2.0 h1:wmk5nhB9a2w2RxMOyvsoKjizgJOEaJdfAakr0jN8gds= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.3.0 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= +github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= @@ -1142,17 +1181,24 @@ github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRj github.com/libp2p/go-libp2p-peerstore v0.2.3/go.mod h1:K8ljLdFn590GMttg/luh4caB/3g0vKuY01psze0upRw= github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-peerstore v0.2.7 h1:83JoLxyR9OYTnNfB5vvFqvMUv/xDNa6NoPHnENhBsGw= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= +github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= +github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= +github.com/libp2p/go-libp2p-peerstore v0.6.0 h1:HJminhQSGISBIRb93N6WK3t6Fa8OOTnHd/VBjL4mY5A= +github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= -github.com/libp2p/go-libp2p-pubsub v0.4.2-0.20210212194758-6c1addf493eb h1:HExLcdXn8fgtXPciUw97O5NNhBn31dt6d9fVUD4cngo= -github.com/libp2p/go-libp2p-pubsub v0.4.2-0.20210212194758-6c1addf493eb/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ= -github.com/libp2p/go-libp2p-quic-transport v0.10.0 h1:koDCbWD9CCHwcHZL3/WEvP2A+e/o5/W5L3QS/2SPMA0= +github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= +github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= +github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= +github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= +github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= +github.com/libp2p/go-libp2p-quic-transport v0.15.2 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= +github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= @@ -1173,10 +1219,11 @@ github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHv github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.3.1/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= -github.com/libp2p/go-libp2p-swarm v0.5.0 h1:HIK0z3Eqoo8ugmN8YqWAhD2RORgR+3iNXYG4U2PFd1E= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= +github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= +github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= +github.com/libp2p/go-libp2p-swarm v0.9.0 h1:LdWjHDVjPMYt3NCG2EHcQiIP8XzA8BHhHz8ZLAYol2Y= +github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1185,19 +1232,28 @@ github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eq github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= -github.com/libp2p/go-libp2p-testing v0.4.0 h1:PrwHRi0IGqOwVQWR3xzgigSlhlLfxgfXgkHxr77EghQ= github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-tls v0.1.3 h1:twKMhMu44jQO+HgQK9X8NHO5HkeJu2QbhLzLJpa8oNM= +github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= +github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= +github.com/libp2p/go-libp2p-testing v0.6.0 h1:tV/wz6mS1VoAYA/5DGTiyzw9TJ+eXMCMvzU5VPLJSgg= +github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= +github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= +github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= +github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.2 h1:4JsnbfJzgZeRS9AWN7B9dPqn/LY/HoQTlO9gtdJTIYM= github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= +github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= +github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= +github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= +github.com/libp2p/go-libp2p-transport-upgrader v0.6.0 h1:GfMCU+2aGGEm1zW3UcOz6wYSn8tXQalFfVfcww99i5A= +github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo= +github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= @@ -1208,9 +1264,10 @@ github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhL github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= -github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= -github.com/libp2p/go-libp2p-yamux v0.5.4 h1:/UOPtT/6DHPtr3TtKXBHa6g0Le0szYuI33Xc/Xpd7fQ= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= +github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= +github.com/libp2p/go-libp2p-yamux v0.7.0 h1:bVXHbTj/XH4uBBsPrg26BlDABk5WYRlssY73P0SjhPc= +github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= @@ -1227,14 +1284,17 @@ github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.6 h1:lQ7Uc0kS1wb1EfRxO2Eir/RJoHkHn7t6o+EiwsYIKJA= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-msgio v0.1.0 h1:8Q7g/528ivAlfXTFWvWhVjTE8XG8sDTkRUKPYh9+5Q8= +github.com/libp2p/go-msgio v0.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= -github.com/libp2p/go-nat v0.0.5 h1:qxnwkco8RLKqVh1NmjQ+tJ8p8khNLFxuElYG/TwqW4Q= github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= +github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= +github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= github.com/libp2p/go-netroute v0.1.6 h1:ruPJStbYyXVYGQ81uzEDzuvbYRLKRrLvTYd33yomC38= github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= @@ -1244,12 +1304,15 @@ github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport v0.0.2 h1:XSG94b1FJfGA01BUrT82imejHQyTxO4jEWqheyCXYvU= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= +github.com/libp2p/go-reuseport v0.1.0 h1:0ooKOx2iwyIkf339WCZ2HN3ujTDbkK0PjC7JVoP1AiM= +github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= -github.com/libp2p/go-reuseport-transport v0.0.4 h1:OZGz0RB620QDGpv300n1zaOcKGGAoGVf8h9txtt/1uM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= +github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= +github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7CyD1zuN7xQT8gc= +github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.1 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= @@ -1264,8 +1327,11 @@ github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19 github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= -github.com/libp2p/go-tcp-transport v0.2.1 h1:ExZiVQV+h+qL16fzCWtd1HSzPsqWottJ8KXwWaVi8Ns= -github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M= +github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= +github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= +github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= +github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= +github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= @@ -1273,8 +1339,9 @@ github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.3.1/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= -github.com/libp2p/go-ws-transport v0.4.0 h1:9tvtQ9xbws6cA5LvqdE6Ne3vcmGB4f1z9SByggk4s0k= github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= +github.com/libp2p/go-ws-transport v0.5.0 h1:cO6x4P0v6PfxbKnxmf5cY2Ny4OPDGYkUqNvZzp/zdlo= +github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= @@ -1286,14 +1353,18 @@ github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= -github.com/libp2p/go-yamux/v2 v2.2.0 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWoAFU= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= +github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= +github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= +github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lucas-clemente/quic-go v0.19.3 h1:eCDQqvGBB+kCTkA0XrAFtNe81FMa0/fn4QSoeAbmiF4= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= +github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= +github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= +github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= +github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= @@ -1308,10 +1379,17 @@ github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN github.com/maratori/testpackage v1.0.1 h1:QtJ5ZjqapShm0w5DosRjg0PRlSdAdlx+W6cCKoALdbQ= github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= -github.com/marten-seemann/qtls v0.10.0 h1:ECsuYUKalRL240rRD4Ri33ISb7kAQ3qGDlrrl55b2pc= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= -github.com/marten-seemann/qtls-go1-15 v0.1.1 h1:LIH6K34bPVttyXnUWixk0bzH6/N07VxbSabxn5A5gZQ= github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= +github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= +github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/qtls-go1-17 v0.1.0 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= +github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= +github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 h1:pWxk9e//NbPwfxat7RXkts09K+dEBJWakUWwICVqYbA= github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= @@ -1330,8 +1408,9 @@ github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2y github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -1360,12 +1439,18 @@ github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00v github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= +github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= +github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= +github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= +github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= +github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= @@ -1424,8 +1509,9 @@ github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI= github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= -github.com/multiformats/go-multiaddr v0.3.3 h1:vo2OTSAqnENB2rLk79pLtr+uhj+VAzSe3uef5q0lRSs= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= +github.com/multiformats/go-multiaddr v0.4.0 h1:hL/K4ZJhJ5PTw3nwylq9lGU5yArzcAroZmex1ghSEkQ= +github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= @@ -1441,12 +1527,14 @@ github.com/multiformats/go-multiaddr-net v0.1.2/go.mod h1:QsWt3XK/3hwvNxZJp92iMQ github.com/multiformats/go-multiaddr-net v0.1.3/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.2.0 h1:MSXRGN0mFymt6B1yo/6BPnIRpLPEnKgQNvVfCX5VDJk= github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= +github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= +github.com/multiformats/go-multicodec v0.3.0 h1:tstDwfIjiHbnIjeM5Lp+pMrSeN+LCMsEwOrkPmWm03A= +github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -1454,13 +1542,13 @@ github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= +github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= -github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.2 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= @@ -1512,16 +1600,19 @@ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.15.0 h1:1V1NfVQR87RtWAgp1lv9JZJ5Jap+XFGKPi00andXGi4= github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= +github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ= github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= +github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= +github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -1587,6 +1678,7 @@ github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= +github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -1605,9 +1697,11 @@ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt2 github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.28.0 h1:vGVfV9KrDTvWt5boZO0I19g2E3CsWfpPPKZM9dt3mEw= github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug= +github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1619,8 +1713,9 @@ github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4 github.com/prometheus/procfs v0.1.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/statsd_exporter v0.20.0/go.mod h1:YL3FWCG8JBBtaUSxAg4Gz2ZYu22bS84XM89ZQXXTWmQ= github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= @@ -1646,6 +1741,8 @@ github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qq github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0= github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= @@ -1834,6 +1931,7 @@ github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= +github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= github.com/warpfork/go-testmark v0.3.0 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= @@ -1894,6 +1992,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= @@ -1921,29 +2020,39 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20190702223751-32f345186213/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.0.0 h1:qsup4IcBdlmsnGfqyLl4Ntn3C2XCCuKAE7DwHpScyUo= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= +go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= @@ -1987,8 +2096,9 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e h1:VvfwVmMH40bpMeizC9/K7ipM5Qjucuu16RWfneFPyhQ= +golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2024,8 +2134,9 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2078,14 +2189,20 @@ golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2155,6 +2272,7 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2192,9 +2310,17 @@ golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -2206,8 +2332,9 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2311,8 +2438,8 @@ golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56 h1:g3QwFWCjsUzBtcQIcI+CYmiL/0i0BxTJjQp54GGDLEM= -golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2419,8 +2546,11 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2468,8 +2598,9 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.1.1 h1:yr1bpyqiwuSPJ4aGGUX9nu46RHXlF8RASQVb1QQNcvo= gorm.io/driver/mysql v1.1.1/go.mod h1:KdrTanmfLPPyAOeYGyG+UpDys7/7eeWT1zCq+oekYnU= gorm.io/gorm v1.21.9/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= @@ -2488,6 +2619,8 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= diff --git a/pkg/chain/chain_index.go b/pkg/chain/chain_index.go index cbc5d134a7..381d1a6ed4 100644 --- a/pkg/chain/chain_index.go +++ b/pkg/chain/chain_index.go @@ -41,12 +41,12 @@ type lbEntry struct { // the tipset within the skiplength is directly obtained by reading the database. // if the height difference exceeds the skiplength, the tipset is read from caching. // if the caching fails, the tipset is obtained by reading the database and updating the cache -func (ci *ChainIndex) GetTipSetByHeight(_ context.Context, from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { +func (ci *ChainIndex) GetTipSetByHeight(ctx context.Context, from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { if from.Height()-to <= ci.skipLength { - return ci.walkBack(from, to) + return ci.walkBack(ctx, from, to) } - rounded, err := ci.roundDown(from) + rounded, err := ci.roundDown(ctx, from) if err != nil { return nil, err } @@ -56,7 +56,7 @@ func (ci *ChainIndex) GetTipSetByHeight(_ context.Context, from *types.TipSet, t for { cval, ok := ci.skipCache.Get(cur) if !ok { - fc, err := ci.fillCache(cur) + fc, err := ci.fillCache(ctx, cur) if err != nil { return nil, err } @@ -67,7 +67,7 @@ func (ci *ChainIndex) GetTipSetByHeight(_ context.Context, from *types.TipSet, t if lbe.ts.Height() == to || lbe.parentHeight < to { return lbe.ts, nil } else if to > lbe.targetHeight { - return ci.walkBack(lbe.ts, to) + return ci.walkBack(ctx, lbe.ts, to) } cur = lbe.target @@ -75,12 +75,12 @@ func (ci *ChainIndex) GetTipSetByHeight(_ context.Context, from *types.TipSet, t } //GetTipsetByHeightWithoutCache get the tipset of specific height by reading the database directly -func (ci *ChainIndex) GetTipsetByHeightWithoutCache(from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { - return ci.walkBack(from, to) +func (ci *ChainIndex) GetTipsetByHeightWithoutCache(ctx context.Context, from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { + return ci.walkBack(ctx, from, to) } -func (ci *ChainIndex) fillCache(tsk types.TipSetKey) (*lbEntry, error) { - ts, err := ci.loadTipSet(tsk) +func (ci *ChainIndex) fillCache(ctx context.Context, tsk types.TipSetKey) (*lbEntry, error) { + ts, err := ci.loadTipSet(ctx, tsk) if err != nil { return nil, err } @@ -95,7 +95,7 @@ func (ci *ChainIndex) fillCache(tsk types.TipSetKey) (*lbEntry, error) { // will either be equal to ts.Height, or at least > ts.Parent.Height() rheight := ci.roundHeight(ts.Height()) - parent, err := ci.loadTipSet(ts.Parents()) + parent, err := ci.loadTipSet(ctx, ts.Parents()) if err != nil { return nil, err } @@ -109,7 +109,7 @@ func (ci *ChainIndex) fillCache(tsk types.TipSetKey) (*lbEntry, error) { if parent.Height() < rheight { skipTarget = parent } else { - skipTarget, err = ci.walkBack(parent, rheight) + skipTarget, err = ci.walkBack(ctx, parent, rheight) if err != nil { return nil, xerrors.Errorf("fillCache walkback: %s", err) } @@ -131,10 +131,10 @@ func (ci *ChainIndex) roundHeight(h abi.ChainEpoch) abi.ChainEpoch { return (h / ci.skipLength) * ci.skipLength } -func (ci *ChainIndex) roundDown(ts *types.TipSet) (*types.TipSet, error) { +func (ci *ChainIndex) roundDown(ctx context.Context, ts *types.TipSet) (*types.TipSet, error) { target := ci.roundHeight(ts.Height()) - rounded, err := ci.walkBack(ts, target) + rounded, err := ci.walkBack(ctx, ts, target) if err != nil { return nil, err } @@ -142,7 +142,7 @@ func (ci *ChainIndex) roundDown(ts *types.TipSet) (*types.TipSet, error) { return rounded, nil } -func (ci *ChainIndex) walkBack(from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { +func (ci *ChainIndex) walkBack(ctx context.Context, from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { if to > from.Height() { return nil, xerrors.Errorf("looking for tipset with height greater than start point") } @@ -154,7 +154,7 @@ func (ci *ChainIndex) walkBack(from *types.TipSet, to abi.ChainEpoch) (*types.Ti ts := from for { - pts, err := ci.loadTipSet(ts.Parents()) + pts, err := ci.loadTipSet(ctx, ts.Parents()) if err != nil { return nil, err } diff --git a/pkg/chain/message_store.go b/pkg/chain/message_store.go index 9e213947d5..2b797ae64c 100644 --- a/pkg/chain/message_store.go +++ b/pkg/chain/message_store.go @@ -33,8 +33,8 @@ type MessageProvider interface { LoadTipSetMessage(ctx context.Context, ts *types.TipSet) ([]types.BlockMessagesInfo, error) LoadMetaMessages(context.Context, cid.Cid) ([]*types.SignedMessage, []*types.Message, error) ReadMsgMetaCids(ctx context.Context, mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) - LoadUnsignedMessagesFromCids(blsCids []cid.Cid) ([]*types.Message, error) - LoadSignedMessagesFromCids(secpCids []cid.Cid) ([]*types.SignedMessage, error) + LoadUnsignedMessagesFromCids(ctx context.Context, blsCids []cid.Cid) ([]*types.Message, error) + LoadSignedMessagesFromCids(ctx context.Context, secpCids []cid.Cid) ([]*types.SignedMessage, error) LoadReceipts(context.Context, cid.Cid) ([]types.MessageReceipt, error) LoadTxMeta(context.Context, cid.Cid) (types.MessageRoot, error) } @@ -73,7 +73,7 @@ func (ms *MessageStore) LoadMetaMessages(ctx context.Context, metaCid cid.Cid) ( } // load secp messages from cids - secpMsgs, err := ms.LoadSignedMessagesFromCids(secpCids) + secpMsgs, err := ms.LoadSignedMessagesFromCids(ctx, secpCids) if err != nil { return nil, nil, err } @@ -84,7 +84,7 @@ func (ms *MessageStore) LoadMetaMessages(ctx context.Context, metaCid cid.Cid) ( } // load bls messages from cids - blsMsgs, err := ms.LoadUnsignedMessagesFromCids(blsCids) + blsMsgs, err := ms.LoadUnsignedMessagesFromCids(ctx, blsCids) if err != nil { return nil, nil, err } @@ -112,8 +112,8 @@ func (ms *MessageStore) ReadMsgMetaCids(ctx context.Context, mmc cid.Cid) ([]cid //LoadMessage load message of specify message cid //First get the unsigned message. If it is not found, then get the signed message. If still not found, an error will be returned -func (ms *MessageStore) LoadMessage(mid cid.Cid) (types.ChainMsg, error) { - m, err := ms.LoadUnsignedMessage(mid) +func (ms *MessageStore) LoadMessage(ctx context.Context, mid cid.Cid) (types.ChainMsg, error) { + m, err := ms.LoadUnsignedMessage(ctx, mid) if err == nil { return m, nil } @@ -122,12 +122,12 @@ func (ms *MessageStore) LoadMessage(mid cid.Cid) (types.ChainMsg, error) { log.Warnf("GetCMessage: unexpected error getting unsigned message: %s", err) } - return ms.LoadSignedMessage(mid) + return ms.LoadSignedMessage(ctx, mid) } //LoadUnsignedMessage load unsigned messages in tipset -func (ms *MessageStore) LoadUnsignedMessage(mid cid.Cid) (*types.Message, error) { - messageBlock, err := ms.bs.Get(mid) +func (ms *MessageStore) LoadUnsignedMessage(ctx context.Context, mid cid.Cid) (*types.Message, error) { + messageBlock, err := ms.bs.Get(ctx, mid) if err != nil { return nil, errors.Wrapf(err, "failed to get bls message %s", mid) } @@ -139,8 +139,8 @@ func (ms *MessageStore) LoadUnsignedMessage(mid cid.Cid) (*types.Message, error) } //LoadUnsignedMessagesFromCids load unsigned messages of cid array -func (ms *MessageStore) LoadSignedMessage(mid cid.Cid) (*types.SignedMessage, error) { - messageBlock, err := ms.bs.Get(mid) +func (ms *MessageStore) LoadSignedMessage(ctx context.Context, mid cid.Cid) (*types.SignedMessage, error) { + messageBlock, err := ms.bs.Get(ctx, mid) if err != nil { return nil, errors.Wrapf(err, "failed to get bls message %s", mid) } @@ -154,10 +154,10 @@ func (ms *MessageStore) LoadSignedMessage(mid cid.Cid) (*types.SignedMessage, er } //LoadUnsignedMessagesFromCids load unsigned messages of cid array -func (ms *MessageStore) LoadUnsignedMessagesFromCids(blsCids []cid.Cid) ([]*types.Message, error) { +func (ms *MessageStore) LoadUnsignedMessagesFromCids(ctx context.Context, blsCids []cid.Cid) ([]*types.Message, error) { blsMsgs := make([]*types.Message, len(blsCids)) for i, c := range blsCids { - message, err := ms.LoadUnsignedMessage(c) + message, err := ms.LoadUnsignedMessage(ctx, c) if err != nil { return nil, err } @@ -167,10 +167,10 @@ func (ms *MessageStore) LoadUnsignedMessagesFromCids(blsCids []cid.Cid) ([]*type } //LoadSignedMessagesFromCids load signed messages of cid array -func (ms *MessageStore) LoadSignedMessagesFromCids(secpCids []cid.Cid) ([]*types.SignedMessage, error) { +func (ms *MessageStore) LoadSignedMessagesFromCids(ctx context.Context, secpCids []cid.Cid) ([]*types.SignedMessage, error) { secpMsgs := make([]*types.SignedMessage, len(secpCids)) for i, c := range secpCids { - message, err := ms.LoadSignedMessage(c) + message, err := ms.LoadSignedMessage(ctx, c) if err != nil { return nil, err } @@ -374,7 +374,7 @@ func (ms *MessageStore) loadAMTCids(ctx context.Context, c cid.Cid) ([]cid.Cid, // LoadTxMeta loads the secproot, blsroot data from the message store func (ms *MessageStore) LoadTxMeta(ctx context.Context, c cid.Cid) (types.MessageRoot, error) { - metaBlock, err := ms.bs.Get(c) + metaBlock, err := ms.bs.Get(ctx, c) if err != nil { return types.MessageRoot{}, errors.Wrapf(err, "failed to get tx meta %s", c) } diff --git a/pkg/chain/randomness.go b/pkg/chain/randomness.go index b79eb8aa8d..48bfdbd1aa 100644 --- a/pkg/chain/randomness.go +++ b/pkg/chain/randomness.go @@ -91,8 +91,8 @@ type RandomnessSource interface { } type TipSetByHeight interface { - GetTipSet(key types.TipSetKey) (*types.TipSet, error) - GetTipSetByHeight(ctx context.Context, ts *types.TipSet, h abi.ChainEpoch, prev bool) (*types.TipSet, error) + GetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) + GetTipSetByHeight(context.Context, *types.TipSet, abi.ChainEpoch, bool) (*types.TipSet, error) } var _ RandomnessSource = (*ChainRandomnessSource)(nil) @@ -109,7 +109,7 @@ func NewChainRandomnessSource(reader TipSetByHeight, head types.TipSetKey, beaco } func (c *ChainRandomnessSource) GetBeaconRandomnessTipset(ctx context.Context, randEpoch abi.ChainEpoch, lookback bool) (*types.TipSet, error) { - ts, err := c.reader.GetTipSet(c.head) + ts, err := c.reader.GetTipSet(ctx, c.head) if err != nil { return nil, err } @@ -138,7 +138,7 @@ func (c *ChainRandomnessSource) GetBeaconRandomnessTipset(ctx context.Context, r // should blend in some distinguishing value (such as the epoch itself) into a hash of this ticket. func (c *ChainRandomnessSource) GetChainRandomness(ctx context.Context, epoch abi.ChainEpoch, lookback bool) (types.Ticket, error) { if !c.head.IsEmpty() { - start, err := c.reader.GetTipSet(c.head) + start, err := c.reader.GetTipSet(ctx, c.head) if err != nil { return types.Ticket{}, err } @@ -251,7 +251,7 @@ func (c *ChainRandomnessSource) extractBeaconEntryForEpoch(ctx context.Context, } } - next, err := c.reader.GetTipSet(randTS.Parents()) + next, err := c.reader.GetTipSet(ctx, randTS.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load parents when searching back for beacon entry: %w", err) } diff --git a/pkg/chain/reorg_test.go b/pkg/chain/reorg_test.go index dcc4d5a398..bc155c4ae5 100644 --- a/pkg/chain/reorg_test.go +++ b/pkg/chain/reorg_test.go @@ -72,13 +72,13 @@ func TestReorgDiffSubset(t *testing.T) { // This function returns the forked head, the main head and the common ancestor. func getForkOldNewCommon(ctx context.Context, t *testing.T, builder *chain.Builder, a, b, c int) (*types.TipSet, *types.TipSet, *types.TipSet) { // Add "a" tipsets to the head of the chainStore. - commonHead := builder.AppendManyOn(a, types.UndefTipSet) + commonHead := builder.AppendManyOn(ctx, a, types.UndefTipSet) oldHead := commonHead if c > 0 { - oldHead = builder.AppendManyOn(c, commonHead) + oldHead = builder.AppendManyOn(ctx, c, commonHead) } - newHead := builder.AppendManyOn(b, commonHead) + newHead := builder.AppendManyOn(ctx, b, commonHead) return oldHead, newHead, commonHead } @@ -88,9 +88,9 @@ func getForkOldNewCommon(ctx context.Context, t *testing.T, builder *chain.Build // consists of this single block and another block together forming a tipset // that is a superset of the forked head. func getSubsetOldNewCommon(ctx context.Context, t *testing.T, builder *chain.Builder, a int) (*types.TipSet, *types.TipSet, *types.TipSet) { - commonHead := builder.AppendManyBlocksOnBlocks(a) - block1 := builder.AppendBlockOnBlocks(commonHead) - block2 := builder.AppendBlockOnBlocks(commonHead) + commonHead := builder.AppendManyBlocksOnBlocks(ctx, a) + block1 := builder.AppendBlockOnBlocks(ctx, commonHead) + block2 := builder.AppendBlockOnBlocks(ctx, commonHead) oldHead := testhelpers.RequireNewTipSet(t, block1) superset := testhelpers.RequireNewTipSet(t, block1, block2) diff --git a/pkg/chain/store.go b/pkg/chain/store.go index e68fbb8dcb..d3ea6ece66 100644 --- a/pkg/chain/store.go +++ b/pkg/chain/store.go @@ -9,13 +9,6 @@ import ( "runtime/debug" "sync" - "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/venus/pkg/state" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - blockadt "github.com/filecoin-project/specs-actors/actors/util/adt" lru "github.com/hashicorp/golang-lru" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" @@ -30,11 +23,19 @@ import ( "go.opencensus.io/trace" "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/network" + blockadt "github.com/filecoin-project/specs-actors/actors/util/adt" + "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/metrics/tracing" "github.com/filecoin-project/venus/pkg/repo" + "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/state/tree" "github.com/filecoin-project/venus/pkg/util" + "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" _init "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" @@ -76,7 +77,7 @@ var HeadKey = datastore.NewKey("/chain/heaviestTipSet") var ErrNotifeeDone = errors.New("notifee is done and should be removed") -type loadTipSetFunc func(types.TipSetKey) (*types.TipSet, error) +type loadTipSetFunc func(context.Context, types.TipSetKey) (*types.TipSet, error) // ReorgNotifee represents a callback that gets called upon reorgs. type ReorgNotifee func(rev, app []*types.TipSet) error @@ -168,7 +169,7 @@ func NewStore(chainDs repo.Datastore, store.chainIndex = NewChainIndex(store.GetTipSet) store.circulatingSupplyCalculator = circulatiingSupplyCalculator - val, err := store.ds.Get(CheckPoint) + val, err := store.ds.Get(context.TODO(), CheckPoint) if err != nil { store.checkPoint = types.NewTipSetKey(genesisCid) } else { @@ -180,8 +181,8 @@ func NewStore(chainDs repo.Datastore, return store } -func (store *Store) rollbackToTipset(key types.TipSetKey) error { - var target, err = store.GetTipSet(key) +func (store *Store) rollbackToTipset(ctx context.Context, key types.TipSetKey) error { + var target, err = store.GetTipSet(ctx, key) if err != nil { return err } @@ -190,7 +191,7 @@ func (store *Store) rollbackToTipset(key types.TipSetKey) error { var head *types.TipSet - if head, err = store.loadHead(); err != nil { + if head, err = store.loadHead(ctx); err != nil { return err } @@ -203,7 +204,7 @@ func (store *Store) rollbackToTipset(key types.TipSetKey) error { for !head.Equals(target) && head.Height() > target.Height() { toRemoveTS = append(toRemoveTS, head) - if head, err = store.GetTipSet(head.Parents()); err != nil { + if head, err = store.GetTipSet(ctx, head.Parents()); err != nil { return err } } @@ -213,7 +214,7 @@ func (store *Store) rollbackToTipset(key types.TipSetKey) error { } for _, ts := range toRemoveTS { - _ = store.DeleteTipSetMetadata(ts) + _ = store.DeleteTipSetMetadata(ctx, ts) } return store.SetHead(context.TODO(), head) @@ -248,12 +249,12 @@ func (store *Store) Load(ctx context.Context) (err error) { log.Warnf("can't unmarshal environment tipsetkey:%s", vch) headKey = types.EmptyTSK } - if err = store.rollbackToTipset(headKey); err != nil { + if err = store.rollbackToTipset(ctx, headKey); err != nil { return xerrors.Errorf("rollback to tipset(%s) failed:%v", headKey.String(), err) } } - if headTS, err = store.loadHead(); err != nil { + if headTS, err = store.loadHead(ctx); err != nil { return err } @@ -262,8 +263,8 @@ func (store *Store) Load(ctx context.Context) (err error) { // but it's sure that it's parent state is stored.. if headTS.Height() > abi.ChainEpoch(0) { var meta *TipSetMetadata - if meta, err = store.LoadTipsetMetadata(headTS); err != nil || meta == nil { - if headTS, err = store.GetTipSet(headTS.Parents()); err != nil { + if meta, err = store.LoadTipsetMetadata(ctx, headTS); err != nil || meta == nil { + if headTS, err = store.GetTipSet(ctx, headTS.Parents()); err != nil { return err } } @@ -275,13 +276,13 @@ func (store *Store) Load(ctx context.Context) (err error) { // Provide tipsets directly from the block store, not from the tipset index which is // being rebuilt by this traversal. tipsetProvider := TipSetProviderFromBlocks(ctx, store) - for iterator := IterAncestors(ctx, tipsetProvider, headTS); !iterator.Complete(); err = iterator.Next() { + for iterator := IterAncestors(ctx, tipsetProvider, headTS); !iterator.Complete(); err = iterator.Next(ctx) { if err != nil { return err } ts := iterator.Value() - tipSetMetadata, err := store.LoadTipsetMetadata(ts) + tipSetMetadata, err := store.LoadTipsetMetadata(ctx, ts) if err != nil { return err } @@ -298,8 +299,8 @@ func (store *Store) Load(ctx context.Context) (err error) { } // loadHead loads the latest known head from disk. -func (store *Store) loadHead() (*types.TipSet, error) { - tskBytes, err := store.ds.Get(HeadKey) +func (store *Store) loadHead(ctx context.Context) (*types.TipSet, error) { + tskBytes, err := store.ds.Get(ctx, HeadKey) if err != nil { return nil, errors.Wrap(err, "failed to read HeadKey") } @@ -310,15 +311,15 @@ func (store *Store) loadHead() (*types.TipSet, error) { return nil, errors.Wrap(err, "failed to cast headCids") } - return store.GetTipSet(tsk) + return store.GetTipSet(ctx, tsk) } //LoadTipsetMetadata load tipset status (state root and reciepts) -func (store *Store) LoadTipsetMetadata(ts *types.TipSet) (*TipSetMetadata, error) { +func (store *Store) LoadTipsetMetadata(ctx context.Context, ts *types.TipSet) (*TipSetMetadata, error) { h := ts.Height() key := datastore.NewKey(makeKey(ts.String(), h)) - tsStateBytes, err := store.ds.Get(key) + tsStateBytes, err := store.ds.Get(ctx, key) if err != nil { return nil, errors.Wrapf(err, "failed to read tipset key %s", ts.String()) } @@ -341,7 +342,7 @@ func (store *Store) PutTipSetMetadata(ctx context.Context, tsm *TipSetMetadata) store.tipIndex.Put(tsm) // Persist the state mapping. - if err := store.writeTipSetMetadata(tsm); err != nil { + if err := store.writeTipSetMetadata(ctx, tsm); err != nil { return err } @@ -353,7 +354,7 @@ func (store *Store) Ls(ctx context.Context, fromTS *types.TipSet, count int) ([] tipsets := []*types.TipSet{fromTS} fromKey := fromTS.Parents() for i := 0; i < count-1; i++ { - ts, err := store.GetTipSet(fromKey) + ts, err := store.GetTipSet(ctx, fromKey) if err != nil { return nil, err } @@ -380,7 +381,7 @@ func (store *Store) PutObject(ctx context.Context, obj interface{}) (cid.Cid, er } // GetTipSet returns the tipset identified by `key`. -func (store *Store) GetTipSet(key types.TipSetKey) (*types.TipSet, error) { +func (store *Store) GetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) { if key.IsEmpty() { return store.GetHead(), nil } @@ -433,7 +434,7 @@ func (store *Store) GetTipSetByHeight(ctx context.Context, ts *types.TipSet, h a if lbts.Height() < h { log.Warnf("chain index returned the wrong tipset at height %d, using slow retrieval", h) - lbts, err = store.chainIndex.GetTipsetByHeightWithoutCache(ts, h) + lbts, err = store.chainIndex.GetTipsetByHeightWithoutCache(ctx, ts, h) if err != nil { return nil, err } @@ -443,7 +444,7 @@ func (store *Store) GetTipSetByHeight(ctx context.Context, ts *types.TipSet, h a return lbts, nil } - return store.GetTipSet(lbts.Parents()) + return store.GetTipSet(ctx, lbts.Parents()) } // GetTipSetState returns the aggregate state of the tipset identified by `key`. @@ -451,7 +452,7 @@ func (store *Store) GetTipSetState(ctx context.Context, ts *types.TipSet) (tree. if ts == nil { ts = store.head } - stateCid, err := store.tipIndex.GetTipSetStateRoot(ts) + stateCid, err := store.tipIndex.GetTipSetStateRoot(ctx, ts) if err != nil { return nil, err } @@ -464,17 +465,17 @@ func (store *Store) GetGenesisBlock(ctx context.Context) (*types.BlockHeader, er } // GetTipSetStateRoot returns the aggregate state root CID of the tipset identified by `key`. -func (store *Store) GetTipSetStateRoot(key *types.TipSet) (cid.Cid, error) { - return store.tipIndex.GetTipSetStateRoot(key) +func (store *Store) GetTipSetStateRoot(ctx context.Context, key *types.TipSet) (cid.Cid, error) { + return store.tipIndex.GetTipSetStateRoot(ctx, key) } // GetTipSetReceiptsRoot returns the root CID of the message receipts for the tipset identified by `key`. -func (store *Store) GetTipSetReceiptsRoot(key *types.TipSet) (cid.Cid, error) { - return store.tipIndex.GetTipSetReceiptsRoot(key) +func (store *Store) GetTipSetReceiptsRoot(ctx context.Context, key *types.TipSet) (cid.Cid, error) { + return store.tipIndex.GetTipSetReceiptsRoot(ctx, key) } -func (store *Store) GetTipsetMetadata(ts *types.TipSet) (*TipSetMetadata, error) { - tsStat, err := store.tipIndex.Get(ts) +func (store *Store) GetTipsetMetadata(ctx context.Context, ts *types.TipSet) (*TipSetMetadata, error) { + tsStat, err := store.tipIndex.Get(ctx, ts) if err != nil { return nil, err } @@ -487,12 +488,12 @@ func (store *Store) GetTipsetMetadata(ts *types.TipSet) (*TipSetMetadata, error) // HasTipSetAndState returns true iff the default store's tipindex is indexing // the tipset identified by `key`. func (store *Store) HasTipSetAndState(ctx context.Context, ts *types.TipSet) bool { - return store.tipIndex.Has(ts) + return store.tipIndex.Has(ctx, ts) } //GetLatestBeaconEntry get latest beacon from the height. there're no beacon values in the block, try to //get beacon in the parents tipset. the max find depth is 20. -func (store *Store) GetLatestBeaconEntry(ts *types.TipSet) (*types.BeaconEntry, error) { +func (store *Store) GetLatestBeaconEntry(ctx context.Context, ts *types.TipSet) (*types.BeaconEntry, error) { cur := ts for i := 0; i < 20; i++ { cbe := cur.At(0).BeaconEntries @@ -504,7 +505,7 @@ func (store *Store) GetLatestBeaconEntry(ts *types.TipSet) (*types.BeaconEntry, return nil, xerrors.Errorf("made it back to genesis block without finding beacon entry") } - next, err := store.GetTipSet(cur.Parents()) + next, err := store.GetTipSet(ctx, cur.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load parents when searching back for latest beacon entry: %w", err) } @@ -521,7 +522,7 @@ func (store *Store) GetLatestBeaconEntry(ts *types.TipSet) (*types.BeaconEntry, } // nolint -func (store *Store) walkBack(from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { +func (store *Store) walkBack(ctx context.Context, from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { if to > from.Height() { return nil, xerrors.Errorf("looking for tipset with height greater than start point") } @@ -533,7 +534,7 @@ func (store *Store) walkBack(from *types.TipSet, to abi.ChainEpoch) (*types.TipS ts := from for { - pts, err := store.GetTipSet(ts.Parents()) + pts, err := store.GetTipSet(ctx, ts.Parents()) if err != nil { return nil, err } @@ -747,12 +748,12 @@ func (store *Store) writeHead(ctx context.Context, cids types.TipSetKey) error { return err } - return store.ds.Put(HeadKey, buf.Bytes()) + return store.ds.Put(ctx, HeadKey, buf.Bytes()) } // writeTipSetMetadata writes the tipset key and the state root id to the // datastore. -func (store *Store) writeTipSetMetadata(tsm *TipSetMetadata) error { +func (store *Store) writeTipSetMetadata(ctx context.Context, tsm *TipSetMetadata) error { if tsm.TipSetStateRoot == cid.Undef { return errors.New("attempting to write state root cid.Undef") } @@ -774,15 +775,15 @@ func (store *Store) writeTipSetMetadata(tsm *TipSetMetadata) error { h := tsm.TipSet.Height() key := datastore.NewKey(makeKey(tsm.TipSet.String(), h)) - return store.ds.Put(key, buf.Bytes()) + return store.ds.Put(ctx, key, buf.Bytes()) } // deleteTipSetMetadata delete the state root id from the datastore for the tipset key. -func (store *Store) DeleteTipSetMetadata(ts *types.TipSet) error { // nolint +func (store *Store) DeleteTipSetMetadata(ctx context.Context, ts *types.TipSet) error { // nolint store.tipIndex.Del(ts) h := ts.Height() key := datastore.NewKey(makeKey(ts.String(), h)) - return store.ds.Delete(key) + return store.ds.Delete(ctx, key) } // GetHead returns the current head tipset cids. @@ -807,12 +808,12 @@ func (store *Store) GenesisRootCid() cid.Cid { return genesis.ParentStateRoot } -func recurseLinks(bs blockstore.Blockstore, walked *cid.Set, root cid.Cid, in []cid.Cid) ([]cid.Cid, error) { +func recurseLinks(ctx context.Context, bs blockstore.Blockstore, walked *cid.Set, root cid.Cid, in []cid.Cid) ([]cid.Cid, error) { if root.Prefix().Codec != cid.DagCBOR { return in, nil } - data, err := bs.Get(root) + data, err := bs.Get(ctx, root) if err != nil { return nil, xerrors.Errorf("recurse links get (%s) failed: %w", root, err) } @@ -831,7 +832,7 @@ func recurseLinks(bs blockstore.Blockstore, walked *cid.Set, root cid.Cid, in [] in = append(in, c) var err error - in, err = recurseLinks(bs, walked, c, in) + in, err = recurseLinks(ctx, bs, walked, c, in) if err != nil { rerr = err } @@ -854,7 +855,7 @@ func (store *Store) Export(ctx context.Context, ts *types.TipSet, inclRecentRoot } return store.WalkSnapshot(ctx, ts, inclRecentRoots, skipOldMsgs, true, func(c cid.Cid) error { - blk, err := store.bsstore.Get(c) + blk, err := store.bsstore.Get(ctx, c) if err != nil { return xerrors.Errorf("writing object to car, bs.Get: %w", err) } @@ -887,7 +888,7 @@ func (store *Store) WalkSnapshot(ctx context.Context, ts *types.TipSet, inclRece return err } - data, err := store.bsstore.Get(blk) + data, err := store.bsstore.Get(ctx, blk) if err != nil { return xerrors.Errorf("getting block: %w", err) } @@ -907,7 +908,7 @@ func (store *Store) WalkSnapshot(ctx context.Context, ts *types.TipSet, inclRece var cids []cid.Cid if !skipOldMsgs || b.Height > ts.Height()-inclRecentRoots { if walked.Visit(b.Messages) { - mcids, err := recurseLinks(store.bsstore, walked, b.Messages, []cid.Cid{b.Messages}) + mcids, err := recurseLinks(ctx, store.bsstore, walked, b.Messages, []cid.Cid{b.Messages}) if err != nil { return xerrors.Errorf("recursing messages failed: %w", err) } @@ -926,7 +927,7 @@ func (store *Store) WalkSnapshot(ctx context.Context, ts *types.TipSet, inclRece if b.Height == 0 || b.Height > ts.Height()-inclRecentRoots { if walked.Visit(b.ParentStateRoot) { - cids, err := recurseLinks(store.bsstore, walked, b.ParentStateRoot, []cid.Cid{b.ParentStateRoot}) + cids, err := recurseLinks(ctx, store.bsstore, walked, b.ParentStateRoot, []cid.Cid{b.ParentStateRoot}) if err != nil { return xerrors.Errorf("recursing genesis state failed: %w", err) } @@ -972,13 +973,13 @@ func (store *Store) WalkSnapshot(ctx context.Context, ts *types.TipSet, inclRece } //Import import a car file into local db -func (store *Store) Import(r io.Reader) (*types.TipSet, error) { - header, err := car.LoadCar(store.bsstore, r) +func (store *Store) Import(ctx context.Context, r io.Reader) (*types.TipSet, error) { + header, err := car.LoadCar(ctx, store.bsstore, r) if err != nil { return nil, xerrors.Errorf("loadcar failed: %w", err) } - root, err := store.GetTipSet(types.NewTipSetKey(header.Roots...)) + root, err := store.GetTipSet(ctx, types.NewTipSetKey(header.Roots...)) if err != nil { return nil, xerrors.Errorf("failed to load root tipset from chainfile: %w", err) } @@ -999,7 +1000,7 @@ func (store *Store) Import(r io.Reader) (*types.TipSet, error) { break } curTipsetKey := curTipset.Parents() - curParentTipset, err := store.GetTipSet(curTipsetKey) + curParentTipset, err := store.GetTipSet(ctx, curTipsetKey) if err != nil { return nil, xerrors.Errorf("failed to load root tipset from chainfile: %w", err) } @@ -1021,7 +1022,7 @@ func (store *Store) Import(r io.Reader) (*types.TipSet, error) { } if root.Height() > 0 { - root, err = store.GetTipSet(root.Parents()) + root, err = store.GetTipSet(ctx, root.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load root tipset from chainfile: %w", err) } @@ -1042,7 +1043,7 @@ func (store *Store) WriteCheckPoint(ctx context.Context, cids types.TipSetKey) e if err != nil { return err } - return store.ds.Put(CheckPoint, buf.Bytes()) + return store.ds.Put(ctx, CheckPoint, buf.Bytes()) } func (store *Store) GetCirculatingSupplyDetailed(ctx context.Context, height abi.ChainEpoch, st tree.Tree) (types.CirculatingSupply, error) { @@ -1051,12 +1052,12 @@ func (store *Store) GetCirculatingSupplyDetailed(ctx context.Context, height abi //StateCirculatingSupply get circulate supply at specify epoch func (store *Store) StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) { - ts, err := store.GetTipSet(tsk) + ts, err := store.GetTipSet(ctx, tsk) if err != nil { return abi.TokenAmount{}, err } - root, err := store.GetTipSetStateRoot(ts) + root, err := store.GetTipSetStateRoot(ctx, ts) if err != nil { return abi.TokenAmount{}, err } @@ -1183,7 +1184,7 @@ func (store *Store) ReorgOps(a, b *types.TipSet) ([]*types.TipSet, []*types.TipS // // If an error happens along the way, we return the error with nil slices. // todo should move this code into store.ReorgOps. anywhere use this function should invoke store.ReorgOps -func ReorgOps(lts func(types.TipSetKey) (*types.TipSet, error), a, b *types.TipSet) ([]*types.TipSet, []*types.TipSet, error) { +func ReorgOps(lts func(context.Context, types.TipSetKey) (*types.TipSet, error), a, b *types.TipSet) ([]*types.TipSet, []*types.TipSet, error) { left := a right := b @@ -1191,7 +1192,7 @@ func ReorgOps(lts func(types.TipSetKey) (*types.TipSet, error), a, b *types.TipS for !left.Equals(right) { if left.Height() > right.Height() { leftChain = append(leftChain, left) - par, err := lts(left.Parents()) + par, err := lts(context.TODO(), left.Parents()) if err != nil { return nil, nil, err } @@ -1199,7 +1200,7 @@ func ReorgOps(lts func(types.TipSetKey) (*types.TipSet, error), a, b *types.TipS left = par } else { rightChain = append(rightChain, right) - par, err := lts(right.Parents()) + par, err := lts(context.TODO(), right.Parents()) if err != nil { log.Infof("failed to fetch right.Parents: %s", err) return nil, nil, err @@ -1214,8 +1215,8 @@ func ReorgOps(lts func(types.TipSetKey) (*types.TipSet, error), a, b *types.TipS } // PutMessage put message in local db -func (store *Store) PutMessage(m storable) (cid.Cid, error) { - return PutMessage(store.bsstore, m) +func (store *Store) PutMessage(ctx context.Context, m storable) (cid.Cid, error) { + return PutMessage(ctx, store.bsstore, m) } // Blockstore return local blockstore @@ -1257,7 +1258,7 @@ func (store *Store) GetLookbackTipSetForRound(ctx context.Context, ts *types.Tip if lbr >= h { // This should never happen at this point, but may happen before // network version 3 (where the lookback was only 10 blocks). - st, err := store.GetTipSetStateRoot(ts) + st, err := store.GetTipSetStateRoot(ctx, ts) if err != nil { return nil, cid.Undef, err } @@ -1276,7 +1277,7 @@ func (store *Store) GetLookbackTipSetForRound(ctx context.Context, ts *types.Tip } pKey := nextTS.Parents() - lbts, err := store.GetTipSet(pKey) + lbts, err := store.GetTipSet(ctx, pKey) if err != nil { return nil, cid.Undef, xerrors.Errorf("failed to resolve lookback tipset: %v", err) } @@ -1339,7 +1340,7 @@ func (store *Store) LookupID(ctx context.Context, ts *types.TipSet, addr address // ResolveToKeyAddr get key address of specify address. //if ths addr is bls/secpk address, return directly, other get the pubkey and generate address func (store *Store) ResolveToKeyAddr(ctx context.Context, ts *types.TipSet, addr address.Address) (address.Address, error) { - st, err := store.StateView(ts) + st, err := store.StateView(ctx, ts) if err != nil { return address.Undef, errors.Wrap(err, "failed to load latest state") } @@ -1348,11 +1349,11 @@ func (store *Store) ResolveToKeyAddr(ctx context.Context, ts *types.TipSet, addr } // StateView return state view at ts epoch -func (store *Store) StateView(ts *types.TipSet) (*state.View, error) { +func (store *Store) StateView(ctx context.Context, ts *types.TipSet) (*state.View, error) { if ts == nil { ts = store.head } - root, err := store.GetTipSetStateRoot(ts) + root, err := store.GetTipSetStateRoot(ctx, ts) if err != nil { return nil, errors.Wrapf(err, "failed to get state root for %s", ts.Key().String()) } @@ -1361,11 +1362,11 @@ func (store *Store) StateView(ts *types.TipSet) (*state.View, error) { } // AccountView return account view at ts state -func (store *Store) AccountView(ts *types.TipSet) (state.AccountView, error) { +func (store *Store) AccountView(ctx context.Context, ts *types.TipSet) (state.AccountView, error) { if ts == nil { ts = store.head } - root, err := store.GetTipSetStateRoot(ts) + root, err := store.GetTipSetStateRoot(ctx, ts) if err != nil { return nil, errors.Wrapf(err, "failed to get state root for %s", ts.Key().String()) } diff --git a/pkg/chain/store_test.go b/pkg/chain/store_test.go index e0e2bb1f9f..d9c5e159cf 100644 --- a/pkg/chain/store_test.go +++ b/pkg/chain/store_test.go @@ -47,7 +47,7 @@ func newChainStore(r repo.Repo, genTS *types.TipSet) *CborBlockStore { // requirePutTestChain puts the count tipsets preceding head in the source to // the input chain store. func requirePutTestChain(ctx context.Context, t *testing.T, cborStore *CborBlockStore, head types.TipSetKey, source *chain.Builder, count int) { - tss := source.RequireTipSets(head, count) + tss := source.RequireTipSets(ctx, head, count) for _, ts := range tss { tsas := &chain.TipSetMetadata{ TipSet: ts, @@ -103,10 +103,10 @@ func TestGetByKey(t *testing.T) { cs := newChainStore(r, genTS) // Construct test chain data - link1 := builder.AppendOn(genTS, 2) - link2 := builder.AppendOn(link1, 3) - link3 := builder.AppendOn(link2, 1) - link4 := builder.BuildOn(link3, 2, func(bb *chain.BlockBuilder, i int) { bb.IncHeight(2) }) + link1 := builder.AppendOn(ctx, genTS, 2) + link2 := builder.AppendOn(ctx, link1, 3) + link3 := builder.AppendOn(ctx, link2, 1) + link4 := builder.BuildOn(ctx, link3, 2, func(bb *chain.BlockBuilder, i int) { bb.IncHeight(2) }) // Put the test chain to the store requirePutTestChain(ctx, t, cs, link4.Key(), builder, 5) @@ -148,16 +148,16 @@ func TestRevertChange(t *testing.T) { cs := newChainStore(builder.Repo(), genTS) genesis := builder.Genesis() - link1 := builder.AppendOn(genesis, 1) - link2 := builder.AppendOn(link1, 1) - link3 := builder.AppendOn(link2, 1) + link1 := builder.AppendOn(ctx, genesis, 1) + link2 := builder.AppendOn(ctx, link1, 1) + link3 := builder.AppendOn(ctx, link2, 1) err := cs.SetHead(ctx, link3) require.NoError(t, err) - link4 := builder.AppendOn(genesis, 2) - link5 := builder.AppendOn(link4, 2) - link6 := builder.AppendOn(link5, 2) + link4 := builder.AppendOn(ctx, genesis, 2) + link5 := builder.AppendOn(ctx, link4, 2) + link6 := builder.AppendOn(ctx, link5, 2) ch := cs.SubHeadChanges(ctx) currentA := <-ch @@ -211,6 +211,7 @@ func assertSetHead(t *testing.T, cborStore *CborBlockStore, ts *types.TipSet) { func TestHead(t *testing.T) { tf.UnitTest(t) + ctx := context.TODO() builder := chain.NewBuilder(t, address.Undef) genTS := builder.Genesis() r := builder.Repo() @@ -220,10 +221,10 @@ func TestHead(t *testing.T) { Store: chain.NewStore(r.ChainDatastore(), bs, genTS.At(0).Cid(), chain.NewMockCirculatingSupplyCalculator()), } // Construct test chain data - link1 := builder.AppendOn(genTS, 2) - link2 := builder.AppendOn(link1, 3) - link3 := builder.AppendOn(link2, 1) - link4 := builder.BuildOn(link3, 2, func(bb *chain.BlockBuilder, i int) { bb.IncHeight(2) }) + link1 := builder.AppendOn(ctx, genTS, 2) + link2 := builder.AppendOn(ctx, link1, 3) + link3 := builder.AppendOn(ctx, link2, 1) + link4 := builder.BuildOn(ctx, link3, 2, func(bb *chain.BlockBuilder, i int) { bb.IncHeight(2) }) // Head starts as an empty cid set assert.Equal(t, types.UndefTipSet, cs.GetHead()) @@ -258,10 +259,10 @@ func TestHeadEvents(t *testing.T) { genTS := builder.Genesis() chainStore := newChainStore(builder.Repo(), genTS) // Construct test chain data - link1 := builder.AppendOn(genTS, 2) - link2 := builder.AppendOn(link1, 3) - link3 := builder.AppendOn(link2, 1) - link4 := builder.BuildOn(link3, 2, func(bb *chain.BlockBuilder, i int) { bb.IncHeight(2) }) + link1 := builder.AppendOn(ctx, genTS, 2) + link2 := builder.AppendOn(ctx, link1, 3) + link3 := builder.AppendOn(ctx, link2, 1) + link4 := builder.BuildOn(ctx, link3, 2, func(bb *chain.BlockBuilder, i int) { bb.IncHeight(2) }) assertSetHead(t, chainStore, genTS) @@ -315,10 +316,10 @@ func TestLoadAndReboot(t *testing.T) { cst := cbor.NewCborStore(bs) // Construct test chain data - link1 := builder.AppendOn(genTS, 2) - link2 := builder.AppendOn(link1, 3) - link3 := builder.AppendOn(link2, 1) - link4 := builder.BuildOn(link3, 2, func(bb *chain.BlockBuilder, i int) { bb.IncHeight(2) }) + link1 := builder.AppendOn(ctx, genTS, 2) + link2 := builder.AppendOn(ctx, link1, 3) + link3 := builder.AppendOn(ctx, link2, 1) + link4 := builder.BuildOn(ctx, link3, 2, func(bb *chain.BlockBuilder, i int) { bb.IncHeight(2) }) // Add blocks to blockstore requirePutBlocksToCborStore(t, cst, genTS.ToSlice()...) @@ -356,17 +357,17 @@ func TestLoadAndReboot(t *testing.T) { } func requireGetTipSet(ctx context.Context, t *testing.T, chainStore *CborBlockStore, key types.TipSetKey) *types.TipSet { - ts, err := chainStore.GetTipSet(key) + ts, err := chainStore.GetTipSet(ctx, key) require.NoError(t, err) return ts } type tipSetStateRootGetter interface { - GetTipSetStateRoot(*types.TipSet) (cid.Cid, error) + GetTipSetStateRoot(context.Context, *types.TipSet) (cid.Cid, error) } func requireGetTipSetStateRoot(ctx context.Context, t *testing.T, chainStore tipSetStateRootGetter, ts *types.TipSet) cid.Cid { - stateCid, err := chainStore.GetTipSetStateRoot(ts) + stateCid, err := chainStore.GetTipSetStateRoot(ctx, ts) require.NoError(t, err) return stateCid } diff --git a/pkg/chain/testing.go b/pkg/chain/testing.go index 66569ad8ef..5c2ec22cc7 100644 --- a/pkg/chain/testing.go +++ b/pkg/chain/testing.go @@ -256,22 +256,22 @@ func NewBuilderWithDeps(t *testing.T, miner address.Address, sb StateBuilder, st } // AppendBlockOnBlocks creates and returns a new block child of `parents`, with no messages. -func (f *Builder) AppendBlockOnBlocks(parents ...*types.BlockHeader) *types.BlockHeader { +func (f *Builder) AppendBlockOnBlocks(ctx context.Context, parents ...*types.BlockHeader) *types.BlockHeader { var tip *types.TipSet if len(parents) > 0 { tip = testhelpers.RequireNewTipSet(f.t, parents...) } - return f.AppendBlockOn(tip) + return f.AppendBlockOn(ctx, tip) } // AppendBlockOn creates and returns a new block child of `parent`, with no messages. -func (f *Builder) AppendBlockOn(parent *types.TipSet) *types.BlockHeader { - return f.Build(parent, 1, nil).At(0) +func (f *Builder) AppendBlockOn(ctx context.Context, parent *types.TipSet) *types.BlockHeader { + return f.Build(ctx, parent, 1, nil).At(0) } // AppendOn creates and returns a new `width`-block tipset child of `parents`, with no messages. -func (f *Builder) AppendOn(parent *types.TipSet, width int) *types.TipSet { - return f.Build(parent, width, nil) +func (f *Builder) AppendOn(ctx context.Context, parent *types.TipSet, width int) *types.TipSet { + return f.Build(ctx, parent, width, nil) } func (f *Builder) FlushHead(ctx context.Context) error { @@ -280,48 +280,48 @@ func (f *Builder) FlushHead(ctx context.Context) error { } // AppendManyBlocksOnBlocks appends `height` blocks to the chain. -func (f *Builder) AppendManyBlocksOnBlocks(height int, parents ...*types.BlockHeader) *types.BlockHeader { +func (f *Builder) AppendManyBlocksOnBlocks(ctx context.Context, height int, parents ...*types.BlockHeader) *types.BlockHeader { var tip *types.TipSet if len(parents) > 0 { tip = testhelpers.RequireNewTipSet(f.t, parents...) } - return f.BuildManyOn(height, tip, nil).At(0) + return f.BuildManyOn(ctx, height, tip, nil).At(0) } // AppendManyBlocksOn appends `height` blocks to the chain. -func (f *Builder) AppendManyBlocksOn(height int, parent *types.TipSet) *types.BlockHeader { - return f.BuildManyOn(height, parent, nil).At(0) +func (f *Builder) AppendManyBlocksOn(ctx context.Context, height int, parent *types.TipSet) *types.BlockHeader { + return f.BuildManyOn(ctx, height, parent, nil).At(0) } // AppendManyOn appends `height` tipsets to the chain. -func (f *Builder) AppendManyOn(height int, parent *types.TipSet) *types.TipSet { - return f.BuildManyOn(height, parent, nil) +func (f *Builder) AppendManyOn(ctx context.Context, height int, parent *types.TipSet) *types.TipSet { + return f.BuildManyOn(ctx, height, parent, nil) } // BuildOnBlock creates and returns a new block child of singleton tipset `parent`. See Build. -func (f *Builder) BuildOnBlock(parent *types.BlockHeader, build func(b *BlockBuilder)) *types.BlockHeader { +func (f *Builder) BuildOnBlock(ctx context.Context, parent *types.BlockHeader, build func(b *BlockBuilder)) *types.BlockHeader { var tip *types.TipSet if parent != nil { tip = testhelpers.RequireNewTipSet(f.t, parent) } - return f.BuildOneOn(tip, build).At(0) + return f.BuildOneOn(ctx, tip, build).At(0) } // BuildOneOn creates and returns a new single-block tipset child of `parent`. -func (f *Builder) BuildOneOn(parent *types.TipSet, build func(b *BlockBuilder)) *types.TipSet { - return f.Build(parent, 1, singleBuilder(build)) +func (f *Builder) BuildOneOn(ctx context.Context, parent *types.TipSet, build func(b *BlockBuilder)) *types.TipSet { + return f.Build(ctx, parent, 1, singleBuilder(build)) } // BuildOn creates and returns a new `width` block tipset child of `parent`. -func (f *Builder) BuildOn(parent *types.TipSet, width int, build func(b *BlockBuilder, i int)) *types.TipSet { - return f.Build(parent, width, build) +func (f *Builder) BuildOn(ctx context.Context, parent *types.TipSet, width int, build func(b *BlockBuilder, i int)) *types.TipSet { + return f.Build(ctx, parent, width, build) } // BuildManyOn builds a chain by invoking Build `height` times. -func (f *Builder) BuildManyOn(height int, parent *types.TipSet, build func(b *BlockBuilder)) *types.TipSet { +func (f *Builder) BuildManyOn(ctx context.Context, height int, parent *types.TipSet, build func(b *BlockBuilder)) *types.TipSet { require.True(f.t, height > 0, "") for i := 0; i < height; i++ { - parent = f.Build(parent, 1, singleBuilder(build)) + parent = f.Build(ctx, parent, 1, singleBuilder(build)) } return parent } @@ -331,7 +331,7 @@ func (f *Builder) BuildManyOn(height int, parent *types.TipSet, build func(b *Bl // Note: the blocks will all have the same miner, which is unrealistic and forbidden by consensus; // generalise this to random miner addresses when that is rejected by the syncer. // The `build` function is invoked to modify the block before it is stored. -func (f *Builder) Build(parent *types.TipSet, width int, build func(b *BlockBuilder, i int)) *types.TipSet { +func (f *Builder) Build(ctx context.Context, parent *types.TipSet, width int, build func(b *BlockBuilder, i int)) *types.TipSet { tip := f.BuildOrphaTipset(parent, width, build) for _, block := range tip.Blocks() { @@ -341,7 +341,7 @@ func (f *Builder) Build(parent *types.TipSet, width int, build func(b *BlockBuil } // Compute and remember state for the tipset. - stateRoot, _ := f.ComputeState(tip) + stateRoot, _ := f.ComputeState(ctx, tip) f.tipStateCids[tip.Key().String()] = stateRoot return tip } @@ -398,7 +398,7 @@ func (f *Builder) BuildOrphaTipset(parent *types.TipSet, width int, build func(b // Compute state root for this block. ctx := context.Background() - prevState := f.StateForKey(parent.Key()) + prevState := f.StateForKey(ctx, parent.Key()) smsgs, umsgs, err := f.mstore.LoadMetaMessages(ctx, b.Messages) require.NoError(f.t, err) @@ -426,29 +426,29 @@ func (f *Builder) BuildOrphaTipset(parent *types.TipSet, width int, build func(b } // StateForKey loads (or computes) the state root for a tipset key. -func (f *Builder) StateForKey(key types.TipSetKey) cid.Cid { +func (f *Builder) StateForKey(ctx context.Context, key types.TipSetKey) cid.Cid { state, found := f.tipStateCids[key.String()] if found { return state } // No state yet computed for this tip (perhaps because the blocks in it have not previously // been considered together as a tipset). - tip, err := f.GetTipSet(key) + tip, err := f.GetTipSet(ctx, key) require.NoError(f.t, err) - state, _ = f.ComputeState(tip) + state, _ = f.ComputeState(ctx, tip) return state } // GetBlockstoreValue gets data straight out of the underlying blockstore by cid func (f *Builder) GetBlockstoreValue(ctx context.Context, c cid.Cid) (blocks.Block, error) { - return f.bs.Get(c) + return f.bs.Get(ctx, c) } // ComputeState computes the state for a tipset from its parent state. -func (f *Builder) ComputeState(tip *types.TipSet) (cid.Cid, []types.MessageReceipt) { +func (f *Builder) ComputeState(ctx context.Context, tip *types.TipSet) (cid.Cid, []types.MessageReceipt) { parentKey := tip.Parents() // Load the state of the parent tipset and compute the required state (recursively). - prev := f.StateForKey(parentKey) + prev := f.StateForKey(ctx, parentKey) blockMsgInfo := f.tipMessages(tip) state, receipt, err := f.stateBuilder.ComputeState(prev, blockMsgInfo) require.NoError(f.t, err) @@ -652,7 +652,7 @@ func (e *FakeStateEvaluator) RunStateTransition(ctx context.Context, ts *types.T return cid.Undef, cid.Undef, ctx.Err() } } - if m, _ := e.ChainStore.LoadTipsetMetadata(ts); m != nil { + if m, _ := e.ChainStore.LoadTipsetMetadata(ctx, ts); m != nil { e.stLk.Unlock() return m.TipSetStateRoot, m.TipSetReceipts, nil } @@ -695,7 +695,7 @@ func (e *FakeStateEvaluator) RunStateTransition(ctx context.Context, ts *types.T } func (e *FakeStateEvaluator) ValidateFullBlock(ctx context.Context, blk *types.BlockHeader) error { - parent, err := e.ChainStore.GetTipSet(types.NewTipSetKey(blk.Parents...)) + parent, err := e.ChainStore.GetTipSet(ctx, types.NewTipSetKey(blk.Parents...)) if err != nil { return err } @@ -762,8 +762,7 @@ func (f *Builder) GetBlocksByIds(ctx context.Context, cids []cid.Cid) ([]*types. } // GetTipSet returns the tipset identified by `key`. -func (f *Builder) GetTipSet(key types.TipSetKey) (*types.TipSet, error) { - ctx := context.Background() +func (f *Builder) GetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) { var blocks []*types.BlockHeader for _, bid := range key.Cids() { var blk types.BlockHeader @@ -779,7 +778,7 @@ func (f *Builder) GetTipSet(key types.TipSetKey) (*types.TipSet, error) { func (f *Builder) FetchTipSets(ctx context.Context, key types.TipSetKey, from peer.ID, done func(t *types.TipSet) (bool, error)) ([]*types.TipSet, error) { var tips []*types.TipSet for { - tip, err := f.GetTipSet(key) + tip, err := f.GetTipSet(ctx, key) if err != nil { return nil, err } @@ -819,7 +818,7 @@ func (f *Builder) GetTipSetByHeight(ctx context.Context, ts *types.TipSet, h abi } for { - ts = f.RequireTipSet(ts.Parents()) + ts = f.RequireTipSet(ctx, ts.Parents()) height := ts.Height() if height >= 0 && height == h { return ts, nil @@ -830,17 +829,17 @@ func (f *Builder) GetTipSetByHeight(ctx context.Context, ts *types.TipSet, h abi } // RequireTipSet returns a tipset by key, which must exist. -func (f *Builder) RequireTipSet(key types.TipSetKey) *types.TipSet { - tip, err := f.GetTipSet(key) +func (f *Builder) RequireTipSet(ctx context.Context, key types.TipSetKey) *types.TipSet { + tip, err := f.GetTipSet(ctx, key) require.NoError(f.t, err) return tip } // RequireTipSets returns a chain of tipsets from key, which must exist and be long enough. -func (f *Builder) RequireTipSets(head types.TipSetKey, count int) []*types.TipSet { +func (f *Builder) RequireTipSets(ctx context.Context, head types.TipSetKey, count int) []*types.TipSet { var tips []*types.TipSet for i := 0; i < count; i++ { - tip := f.RequireTipSet(head) + tip := f.RequireTipSet(ctx, head) tips = append(tips, tip) head = tip.Parents() } @@ -867,12 +866,12 @@ func (f *Builder) StoreTxMeta(ctx context.Context, meta types.MessageRoot) (cid. return f.mstore.StoreTxMeta(ctx, meta) } -func (f *Builder) LoadUnsignedMessagesFromCids(blsCids []cid.Cid) ([]*types.Message, error) { - return f.mstore.LoadUnsignedMessagesFromCids(blsCids) +func (f *Builder) LoadUnsignedMessagesFromCids(ctx context.Context, blsCids []cid.Cid) ([]*types.Message, error) { + return f.mstore.LoadUnsignedMessagesFromCids(ctx, blsCids) } -func (f *Builder) LoadSignedMessagesFromCids(secpCids []cid.Cid) ([]*types.SignedMessage, error) { - return f.mstore.LoadSignedMessagesFromCids(secpCids) +func (f *Builder) LoadSignedMessagesFromCids(ctx context.Context, secpCids []cid.Cid) ([]*types.SignedMessage, error) { + return f.mstore.LoadSignedMessagesFromCids(ctx, secpCids) } // LoadMessages returns the message collections tracked by the builder. @@ -886,7 +885,7 @@ func (f *Builder) ReadMsgMetaCids(ctx context.Context, metaCid cid.Cid) ([]cid.C // /// exchange ///// func (f *Builder) GetBlocks(ctx context.Context, tsk types.TipSetKey, count int) ([]*types.TipSet, error) { - ts, err := f.GetTipSet(tsk) + ts, err := f.GetTipSet(ctx, tsk) if err != nil { return nil, err } @@ -895,7 +894,7 @@ func (f *Builder) GetBlocks(ctx context.Context, tsk types.TipSetKey, count int) if ts.Height() == 0 { break } - ts, err = f.GetTipSet(ts.Parents()) + ts, err = f.GetTipSet(ctx, ts.Parents()) if err != nil { return nil, err } @@ -907,7 +906,7 @@ func (f *Builder) GetBlocks(ctx context.Context, tsk types.TipSetKey, count int) func (f *Builder) GetChainMessages(ctx context.Context, tipsets []*types.TipSet) ([]*exchange.CompactedMessages, error) { result := []*exchange.CompactedMessages{} for _, ts := range tipsets { - bmsgs, bmincl, smsgs, smincl, err := exchange.GatherMessages(f, f.mstore, ts) + bmsgs, bmincl, smsgs, smincl, err := exchange.GatherMessages(ctx, f, f.mstore, ts) if err != nil { return nil, err } @@ -932,11 +931,11 @@ func (f *Builder) GeneratorGenesis() *types.TipSet { require.NoError(f.t, err) source := ioutil.NopCloser(bytes.NewReader(b)) - ch, err := car.LoadCar(f.bs, source) + ch, err := car.LoadCar(context.Background(), f.bs, source) require.NoError(f.t, err) // need to check if we are being handed a car file with a single genesis block or an entire chain. - bsBlk, err := f.bs.Get(ch.Roots[0]) + bsBlk, err := f.bs.Get(context.Background(), ch.Roots[0]) require.NoError(f.t, err) cur, err := types.DecodeBlock(bsBlk.RawData()) diff --git a/pkg/chain/tip_index.go b/pkg/chain/tip_index.go index 53a09e699a..d1c0fbb99e 100644 --- a/pkg/chain/tip_index.go +++ b/pkg/chain/tip_index.go @@ -1,6 +1,7 @@ package chain import ( + "context" "fmt" "sync" @@ -32,8 +33,8 @@ type TipSetMetadata struct { } type tipLoader interface { - GetTipSet(key types.TipSetKey) (*types.TipSet, error) - LoadTipsetMetadata(ts *types.TipSet) (*TipSetMetadata, error) + GetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) + LoadTipsetMetadata(ctx context.Context, ts *types.TipSet) (*TipSetMetadata, error) } // TipStateCache tracks tipsets and their states by tipset block ids. @@ -68,12 +69,12 @@ func (ti *TipStateCache) Put(tsm *TipSetMetadata) { } // Get returns the tipset given by the input ID and its state. -func (ti *TipStateCache) Get(ts *types.TipSet) (TSState, error) { +func (ti *TipStateCache) Get(ctx context.Context, ts *types.TipSet) (TSState, error) { ti.l.RLock() state, ok := ti.cache[ts.String()] ti.l.RUnlock() if !ok { - tipSetMetadata, err := ti.loader.LoadTipsetMetadata(ts) + tipSetMetadata, err := ti.loader.LoadTipsetMetadata(ctx, ts) if err != nil { return TSState{}, xerrors.New("state not exit") } @@ -88,8 +89,8 @@ func (ti *TipStateCache) Get(ts *types.TipSet) (TSState, error) { } // GetTipSetStateRoot returns the tipsetStateRoot from func (ti *TipStateCache) Get(tsKey string). -func (ti *TipStateCache) GetTipSetStateRoot(ts *types.TipSet) (cid.Cid, error) { - state, err := ti.Get(ts) +func (ti *TipStateCache) GetTipSetStateRoot(ctx context.Context, ts *types.TipSet) (cid.Cid, error) { + state, err := ti.Get(ctx, ts) if err != nil { return cid.Cid{}, err } @@ -97,8 +98,8 @@ func (ti *TipStateCache) GetTipSetStateRoot(ts *types.TipSet) (cid.Cid, error) { } // GetTipSetReceiptsRoot returns the tipsetReceipts from func (ti *TipStateCache) Get(tsKey string). -func (ti *TipStateCache) GetTipSetReceiptsRoot(ts *types.TipSet) (cid.Cid, error) { - state, err := ti.Get(ts) +func (ti *TipStateCache) GetTipSetReceiptsRoot(ctx context.Context, ts *types.TipSet) (cid.Cid, error) { + state, err := ti.Get(ctx, ts) if err != nil { return cid.Cid{}, err } @@ -107,8 +108,8 @@ func (ti *TipStateCache) GetTipSetReceiptsRoot(ts *types.TipSet) (cid.Cid, error // Has returns true iff the tipset with the input ID is stored in // the TipStateCache. -func (ti *TipStateCache) Has(ts *types.TipSet) bool { - _, err := ti.Get(ts) +func (ti *TipStateCache) Has(ctx context.Context, ts *types.TipSet) bool { + _, err := ti.Get(ctx, ts) return err == nil } diff --git a/pkg/chain/traversal.go b/pkg/chain/traversal.go index 34b886c505..e3580ca3a1 100644 --- a/pkg/chain/traversal.go +++ b/pkg/chain/traversal.go @@ -11,7 +11,7 @@ import ( // TipSetProvider provides tipsets for traversal. type TipSetProvider interface { - GetTipSet(tsKey types.TipSetKey) (*types.TipSet, error) + GetTipSet(ctx context.Context, tsKey types.TipSetKey) (*types.TipSet, error) } // IterAncestors returns an iterator over tipset ancestors, yielding first the start tipset and @@ -38,7 +38,7 @@ func (it *TipsetIterator) Complete() bool { } // Next advances the iterator to the next value. -func (it *TipsetIterator) Next() error { +func (it *TipsetIterator) Next(ctx context.Context) error { select { case <-it.ctx.Done(): return it.ctx.Err() @@ -48,7 +48,7 @@ func (it *TipsetIterator) Next() error { } else { var err error parentKey := it.value.Parents() - it.value, err = it.store.GetTipSet(parentKey) + it.value, err = it.store.GetTipSet(ctx, parentKey) return err } return nil @@ -86,7 +86,7 @@ func TipSetProviderFromBlocks(ctx context.Context, blocks BlockProvider) TipSetP } // GetTipSet loads the blocks for a tipset. -func (p *tipsetFromBlockProvider) GetTipSet(tsKey types.TipSetKey) (*types.TipSet, error) { +func (p *tipsetFromBlockProvider) GetTipSet(ctx context.Context, tsKey types.TipSetKey) (*types.TipSet, error) { return LoadTipSetBlocks(p.ctx, p.blocks, tsKey) } @@ -97,7 +97,7 @@ func CollectTipsToCommonAncestor(ctx context.Context, store TipSetProvider, oldH oldIter := IterAncestors(ctx, store, oldHead) newIter := IterAncestors(ctx, store, newHead) - commonAncestor, err := FindCommonAncestor(oldIter, newIter) + commonAncestor, err := FindCommonAncestor(ctx, oldIter, newIter) if err != nil { return } @@ -123,7 +123,7 @@ var ErrNoCommonAncestor = errors.New("no common ancestor") // FindCommonAncestor returns the common ancestor of the two tipsets pointed to // by the input iterators. If they share no common ancestor ErrNoCommonAncestor // will be returned. -func FindCommonAncestor(leftIter, rightIter *TipsetIterator) (*types.TipSet, error) { +func FindCommonAncestor(ctx context.Context, leftIter, rightIter *TipsetIterator) (*types.TipSet, error) { for !rightIter.Complete() && !leftIter.Complete() { left := leftIter.Value() right := rightIter.Value() @@ -140,13 +140,13 @@ func FindCommonAncestor(leftIter, rightIter *TipsetIterator) (*types.TipSet, err // point to a tipset at the same height or higher than the // other pointer's tipset. if rightHeight >= leftHeight { - if err := rightIter.Next(); err != nil { + if err := rightIter.Next(ctx); err != nil { return nil, err } } if leftHeight >= rightHeight { - if err := leftIter.Next(); err != nil { + if err := leftIter.Next(ctx); err != nil { return nil, err } } @@ -160,7 +160,7 @@ func CollectTipSetsOfHeightAtLeast(ctx context.Context, iterator *TipsetIterator var ret []*types.TipSet var err error var h abi.ChainEpoch - for ; !iterator.Complete(); err = iterator.Next() { + for ; !iterator.Complete(); err = iterator.Next(ctx) { if err != nil { return nil, err } @@ -177,7 +177,7 @@ func CollectTipSetsOfHeightAtLeast(ctx context.Context, iterator *TipsetIterator func FindLatestDRAND(ctx context.Context, start *types.TipSet, reader TipSetProvider) (*types.BeaconEntry, error) { iterator := IterAncestors(ctx, reader, start) var err error - for ; !iterator.Complete(); err = iterator.Next() { + for ; !iterator.Complete(); err = iterator.Next(ctx) { if err != nil { return nil, err } diff --git a/pkg/chain/traversal_test.go b/pkg/chain/traversal_test.go index 56f11fd6a0..f2732921a7 100644 --- a/pkg/chain/traversal_test.go +++ b/pkg/chain/traversal_test.go @@ -25,10 +25,10 @@ func TestIterAncestors(t *testing.T) { ctx := context.Background() store := chain.NewBuilder(t, miner) - root := store.AppendBlockOnBlocks() - b11 := store.AppendBlockOnBlocks(root) - b12 := store.AppendBlockOnBlocks(root) - b21 := store.AppendBlockOnBlocks(b11, b12) + root := store.AppendBlockOnBlocks(ctx) + b11 := store.AppendBlockOnBlocks(ctx, root) + b12 := store.AppendBlockOnBlocks(ctx, root) + b21 := store.AppendBlockOnBlocks(ctx, b11, b12) t0 := testhelpers.RequireNewTipSet(t, root) t1 := testhelpers.RequireNewTipSet(t, b11, b12) @@ -38,15 +38,15 @@ func TestIterAncestors(t *testing.T) { assert.False(t, it.Complete()) assert.True(t, t2.Equals(it.Value())) - assert.NoError(t, it.Next()) + assert.NoError(t, it.Next(ctx)) assert.False(t, it.Complete()) assert.True(t, t1.Equals(it.Value())) - assert.NoError(t, it.Next()) + assert.NoError(t, it.Next(ctx)) assert.False(t, it.Complete()) assert.True(t, t0.Equals(it.Value())) - assert.NoError(t, it.Next()) + assert.NoError(t, it.Next(ctx)) assert.True(t, it.Complete()) }) @@ -54,10 +54,10 @@ func TestIterAncestors(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) store := chain.NewBuilder(t, miner) - root := store.AppendBlockOnBlocks() - b11 := store.AppendBlockOnBlocks(root) - b12 := store.AppendBlockOnBlocks(root) - b21 := store.AppendBlockOnBlocks(b11, b12) + root := store.AppendBlockOnBlocks(ctx) + b11 := store.AppendBlockOnBlocks(ctx, root) + b12 := store.AppendBlockOnBlocks(ctx, root) + b21 := store.AppendBlockOnBlocks(ctx, b11, b12) testhelpers.RequireNewTipSet(t, root) t1 := testhelpers.RequireNewTipSet(t, b11, b12) @@ -67,13 +67,13 @@ func TestIterAncestors(t *testing.T) { assert.False(t, it.Complete()) assert.True(t, t2.Equals(it.Value())) - assert.NoError(t, it.Next()) + assert.NoError(t, it.Next(ctx)) assert.False(t, it.Complete()) assert.True(t, t1.Equals(it.Value())) cancel() - assert.Error(t, it.Next()) + assert.Error(t, it.Next(ctx)) }) } @@ -84,7 +84,7 @@ func TestCollectTipSetsOfHeightAtLeast(t *testing.T) { builder := chain.NewBuilder(t, address.Undef) chainLen := 15 - head := builder.AppendManyOn(chainLen, types.UndefTipSet) + head := builder.AppendManyOn(ctx, chainLen, types.UndefTipSet) stopHeight := abi.ChainEpoch(4) iterator := chain.IterAncestors(ctx, builder, head) @@ -104,7 +104,7 @@ func TestCollectTipSetsOfHeightAtLeastZero(t *testing.T) { builder := chain.NewBuilder(t, address.Undef) chainLen := 25 - head := builder.AppendManyOn(chainLen, types.UndefTipSet) + head := builder.AppendManyOn(ctx, chainLen, types.UndefTipSet) stopHeight := abi.ChainEpoch(0) iterator := chain.IterAncestors(ctx, builder, head) @@ -125,15 +125,15 @@ func TestCollectTipSetsOfHeightAtLeastStartingEpochIsNull(t *testing.T) { head := builder.Genesis() // Add 30 tipsets to the head of the chainStore. - head = builder.AppendManyOn(30, head) + head = builder.AppendManyOn(ctx, 30, head) // Now add 10 null blocks and 1 tipset. - head = builder.BuildOneOn(head, func(b *chain.BlockBuilder) { + head = builder.BuildOneOn(ctx, head, func(b *chain.BlockBuilder) { b.IncHeight(10) }) // Now add 19 more tipsets. - head = builder.AppendManyOn(19, head) + head = builder.AppendManyOn(ctx, 19, head) stopHeight := abi.ChainEpoch(35) iterator := chain.IterAncestors(ctx, builder, head) @@ -152,10 +152,10 @@ func TestFindCommonAncestorSameChain(t *testing.T) { builder := chain.NewBuilder(t, address.Undef) head := builder.Genesis() // Add 30 tipsets to the head of the chainStore. - head = builder.AppendManyOn(30, head) + head = builder.AppendManyOn(ctx, 30, head) headIterOne := chain.IterAncestors(ctx, builder, head) headIterTwo := chain.IterAncestors(ctx, builder, head) - commonAncestor, err := chain.FindCommonAncestor(headIterOne, headIterTwo) + commonAncestor, err := chain.FindCommonAncestor(ctx, headIterOne, headIterTwo) assert.NoError(t, err) assert.Equal(t, head, commonAncestor) } @@ -167,19 +167,19 @@ func TestFindCommonAncestorFork(t *testing.T) { head := builder.Genesis() // Add 3 tipsets to the head of the chainStore. - commonHeadTip := builder.AppendManyOn(3, head) + commonHeadTip := builder.AppendManyOn(ctx, 3, head) // Grow the fork chain lenFork := 10 - forkHead := builder.AppendManyOn(lenFork, commonHeadTip) + forkHead := builder.AppendManyOn(ctx, lenFork, commonHeadTip) // Grow the main chain lenMainChain := 14 - mainHead := builder.AppendManyOn(lenMainChain, commonHeadTip) + mainHead := builder.AppendManyOn(ctx, lenMainChain, commonHeadTip) forkItr := chain.IterAncestors(ctx, builder, forkHead) mainItr := chain.IterAncestors(ctx, builder, mainHead) - commonAncestor, err := chain.FindCommonAncestor(mainItr, forkItr) + commonAncestor, err := chain.FindCommonAncestor(ctx, mainItr, forkItr) assert.NoError(t, err) assert.ObjectsAreEqualValues(commonHeadTip, commonAncestor) } @@ -191,15 +191,15 @@ func TestFindCommonAncestorNoFork(t *testing.T) { head := builder.Genesis() // Add 30 tipsets to the head of the chainStore. - head = builder.AppendManyOn(30, head) + head = builder.AppendManyOn(ctx, 30, head) headIterOne := chain.IterAncestors(ctx, builder, head) // Now add 19 more tipsets. expectedAncestor := head - head = builder.AppendManyOn(19, head) + head = builder.AppendManyOn(ctx, 19, head) headIterTwo := chain.IterAncestors(ctx, builder, head) - commonAncestor, err := chain.FindCommonAncestor(headIterOne, headIterTwo) + commonAncestor, err := chain.FindCommonAncestor(ctx, headIterOne, headIterTwo) assert.NoError(t, err) assert.True(t, expectedAncestor.Equals(commonAncestor)) } @@ -213,19 +213,19 @@ func TestFindCommonAncestorNullBlockFork(t *testing.T) { head := builder.Genesis() // Add 10 tipsets to the head of the chainStore. - commonHead := builder.AppendManyOn(10, head) + commonHead := builder.AppendManyOn(ctx, 10, head) // From the common ancestor, add a block following a null block. - headAfterNull := builder.BuildOneOn(commonHead, func(b *chain.BlockBuilder) { + headAfterNull := builder.BuildOneOn(ctx, commonHead, func(b *chain.BlockBuilder) { b.IncHeight(1) }) afterNullItr := chain.IterAncestors(ctx, builder, headAfterNull) // Add a block (with no null) on another fork. - headNoNull := builder.AppendOn(commonHead, 1) + headNoNull := builder.AppendOn(ctx, commonHead, 1) noNullItr := chain.IterAncestors(ctx, builder, headNoNull) - commonAncestor, err := chain.FindCommonAncestor(afterNullItr, noNullItr) + commonAncestor, err := chain.FindCommonAncestor(ctx, afterNullItr, noNullItr) assert.NoError(t, err) assert.ObjectsAreEqualValues(commonHead, commonAncestor) } diff --git a/pkg/chain/utils.go b/pkg/chain/utils.go index 1fa8f27b38..8362cf6bd4 100644 --- a/pkg/chain/utils.go +++ b/pkg/chain/utils.go @@ -1,6 +1,7 @@ package chain import ( + "context" "reflect" "runtime" "strings" @@ -108,13 +109,13 @@ type storable interface { ToStorageBlock() (blockFormat.Block, error) } -func PutMessage(bs blockstoreutil.Blockstore, m storable) (cid.Cid, error) { +func PutMessage(ctx context.Context, bs blockstoreutil.Blockstore, m storable) (cid.Cid, error) { b, err := m.ToStorageBlock() if err != nil { return cid.Undef, err } - if err := bs.Put(b); err != nil { + if err := bs.Put(ctx, b); err != nil { return cid.Undef, err } diff --git a/pkg/chain/waiter.go b/pkg/chain/waiter.go index 3a7f4dd011..50dc1b86d9 100644 --- a/pkg/chain/waiter.go +++ b/pkg/chain/waiter.go @@ -27,10 +27,10 @@ type MsgLookup struct { // Abstracts over a store of blockchain state. type waiterChainReader interface { GetHead() *types.TipSet - GetTipSet(types.TipSetKey) (*types.TipSet, error) + GetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) LookupID(context.Context, *types.TipSet, address.Address) (address.Address, error) GetActorAt(context.Context, *types.TipSet, address.Address) (*types.Actor, error) - GetTipSetReceiptsRoot(*types.TipSet) (cid.Cid, error) + GetTipSetReceiptsRoot(context.Context, *types.TipSet) (cid.Cid, error) SubHeadChanges(context.Context) chan []*apitypes.HeadChange } @@ -137,12 +137,17 @@ func (w *Waiter) findMessage(ctx context.Context, from *types.TipSet, m types.Ch return nil, false, nil } - pts, err := w.chainReader.GetTipSet(cur.Parents()) + pts, err := w.chainReader.GetTipSet(ctx, cur.Parents()) if err != nil { return nil, false, xerrors.Errorf("failed to load tipset during msg wait searchback: %w", err) } - act, err := w.Stmgr.GetActorAt(ctx, m.VMMessage().From, pts) + grandParent, err := w.chainReader.GetTipSet(ctx, pts.Parents()) + if err != nil { + return nil, false, xerrors.Errorf("failed to load tipset during msg wait searchback: %w", err) + } + + act, err := w.Stmgr.GetActorAt(ctx, m.VMMessage().From, grandParent) actorNoExist := errors.Is(err, types.ErrActorNotFound) if err != nil && !actorNoExist { return nil, false, xerrors.Errorf("failed to load the actor: %w", err) @@ -274,7 +279,7 @@ func (w *Waiter) receiptForTipset(ctx context.Context, ts *types.TipSet, msg typ return nil, false, nil } - pts, err := w.chainReader.GetTipSet(ts.Parents()) + pts, err := w.chainReader.GetTipSet(ctx, ts.Parents()) if err != nil { return nil, false, err } diff --git a/pkg/chainsync/exchange/server.go b/pkg/chainsync/exchange/server.go index 85e82119fa..4ffd3d0305 100644 --- a/pkg/chainsync/exchange/server.go +++ b/pkg/chainsync/exchange/server.go @@ -22,14 +22,14 @@ import ( var exchangeServerLog = logging.Logger("exchange.server") type chainReader interface { - GetTipSet(types.TipSetKey) (*types.TipSet, error) + GetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) } type messageStore interface { ReadMsgMetaCids(ctx context.Context, mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) - LoadUnsignedMessagesFromCids(cids []cid.Cid) ([]*types.Message, error) - LoadSignedMessagesFromCids(cids []cid.Cid) ([]*types.SignedMessage, error) + LoadUnsignedMessagesFromCids(ctx context.Context, cids []cid.Cid) ([]*types.Message, error) + LoadSignedMessagesFromCids(ctx context.Context, cids []cid.Cid) ([]*types.SignedMessage, error) } // server implements exchange.Server. It services requests for the @@ -157,7 +157,7 @@ func (s *server) serviceRequest(ctx context.Context, req *validatedRequest) (*Re _, span := trace.StartSpan(ctx, "chainxchg.ServiceRequest") defer span.End() - chain, err := collectChainSegment(s.cr, s.mr, req) + chain, err := collectChainSegment(ctx, s.cr, s.mr, req) if err != nil { exchangeServerLog.Warn("block sync request: collectChainSegment failed: ", err) return &Response{ @@ -177,13 +177,13 @@ func (s *server) serviceRequest(ctx context.Context, req *validatedRequest) (*Re }, nil } -func collectChainSegment(cr chainReader, mr messageStore, req *validatedRequest) ([]*BSTipSet, error) { +func collectChainSegment(ctx context.Context, cr chainReader, mr messageStore, req *validatedRequest) ([]*BSTipSet, error) { var bstips []*BSTipSet cur := req.head for { var bst BSTipSet - ts, err := cr.GetTipSet(cur) + ts, err := cr.GetTipSet(ctx, cur) if err != nil { return nil, xerrors.Errorf("failed loading tipset %s: %w", cur, err) } @@ -193,7 +193,7 @@ func collectChainSegment(cr chainReader, mr messageStore, req *validatedRequest) } if req.options.IncludeMessages { - bmsgs, bmincl, smsgs, smincl, err := GatherMessages(cr, mr, ts) + bmsgs, bmincl, smsgs, smincl, err := GatherMessages(ctx, cr, mr, ts) if err != nil { return nil, xerrors.Errorf("gather messages failed: %w", err) } @@ -218,7 +218,7 @@ func collectChainSegment(cr chainReader, mr messageStore, req *validatedRequest) } } -func GatherMessages(cr chainReader, mr messageStore, ts *types.TipSet) ([]*types.Message, [][]uint64, []*types.SignedMessage, [][]uint64, error) { +func GatherMessages(ctx context.Context, cr chainReader, mr messageStore, ts *types.TipSet) ([]*types.Message, [][]uint64, []*types.SignedMessage, [][]uint64, error) { blsmsgmap := make(map[cid.Cid]uint64) secpkmsgmap := make(map[cid.Cid]uint64) var secpkincl, blsincl [][]uint64 @@ -258,12 +258,12 @@ func GatherMessages(cr chainReader, mr messageStore, ts *types.TipSet) ([]*types secpkincl = append(secpkincl, smi) } - blsmsgs, err := mr.LoadUnsignedMessagesFromCids(blscids) + blsmsgs, err := mr.LoadUnsignedMessagesFromCids(ctx, blscids) if err != nil { return nil, nil, nil, nil, err } - secpkmsgs, err := mr.LoadSignedMessagesFromCids(secpkcids) + secpkmsgs, err := mr.LoadSignedMessagesFromCids(ctx, secpkcids) if err != nil { return nil, nil, nil, nil, err } diff --git a/pkg/chainsync/slashfilter/mysqldb.go b/pkg/chainsync/slashfilter/mysqldb.go index 7735011371..d0932e3d31 100644 --- a/pkg/chainsync/slashfilter/mysqldb.go +++ b/pkg/chainsync/slashfilter/mysqldb.go @@ -1,6 +1,7 @@ package slashfilter import ( + "context" "time" "github.com/filecoin-project/go-state-types/abi" @@ -107,7 +108,7 @@ func (f *MysqlSlashFilter) checkSameParentFault(bh *types.BlockHeader) error { } //MinedBlock check whether the block mined is slash -func (f *MysqlSlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.ChainEpoch) error { +func (f *MysqlSlashFilter) MinedBlock(ctx context.Context, bh *types.BlockHeader, parentEpoch abi.ChainEpoch) error { if err := f.checkSameHeightFault(bh); err != nil { return err } diff --git a/pkg/chainsync/slashfilter/slashfilter.go b/pkg/chainsync/slashfilter/slashfilter.go index 9b7b52a1ff..f25bf2f6b2 100644 --- a/pkg/chainsync/slashfilter/slashfilter.go +++ b/pkg/chainsync/slashfilter/slashfilter.go @@ -1,6 +1,7 @@ package slashfilter import ( + "context" "fmt" "golang.org/x/xerrors" @@ -15,7 +16,7 @@ import ( //ISlashFilter used to detect whether the miner mined a invalidated block , support local db and mysql storage type ISlashFilter interface { - MinedBlock(bh *types.BlockHeader, parentEpoch abi.ChainEpoch) error + MinedBlock(ctx context.Context, bh *types.BlockHeader, parentEpoch abi.ChainEpoch) error } //LocalSlashFilter use badger db to save mined block for detect slash consensus block @@ -33,11 +34,11 @@ func NewLocalSlashFilter(dstore ds.Batching) ISlashFilter { } //MinedBlock check whether the block mined is slash -func (f *LocalSlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.ChainEpoch) error { +func (f *LocalSlashFilter) MinedBlock(ctx context.Context, bh *types.BlockHeader, parentEpoch abi.ChainEpoch) error { epochKey := ds.NewKey(fmt.Sprintf("/%s/%d", bh.Miner, bh.Height)) { // double-fork mining (2 blocks at one epoch) - if err := checkFault(f.byEpoch, epochKey, bh, "double-fork mining faults"); err != nil { + if err := checkFault(ctx, f.byEpoch, epochKey, bh, "double-fork mining faults"); err != nil { return err } } @@ -45,7 +46,7 @@ func (f *LocalSlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.Cha parentsKey := ds.NewKey(fmt.Sprintf("/%s/%s", bh.Miner, types.NewTipSetKey(bh.Parents...).String())) { // time-offset mining faults (2 blocks with the same parents) - if err := checkFault(f.byParents, parentsKey, bh, "time-offset mining faults"); err != nil { + if err := checkFault(ctx, f.byParents, parentsKey, bh, "time-offset mining faults"); err != nil { return err } } @@ -55,14 +56,14 @@ func (f *LocalSlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.Cha // First check if we have mined a block on the parent epoch parentEpochKey := ds.NewKey(fmt.Sprintf("/%s/%d", bh.Miner, parentEpoch)) - have, err := f.byEpoch.Has(parentEpochKey) + have, err := f.byEpoch.Has(ctx, parentEpochKey) if err != nil { return err } if have { // If we had, make sure it's in our parent tipset - cidb, err := f.byEpoch.Get(parentEpochKey) + cidb, err := f.byEpoch.Get(ctx, parentEpochKey) if err != nil { return xerrors.Errorf("getting other block cid: %w", err) } @@ -85,25 +86,25 @@ func (f *LocalSlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.Cha } } - if err := f.byParents.Put(parentsKey, bh.Cid().Bytes()); err != nil { + if err := f.byParents.Put(ctx, parentsKey, bh.Cid().Bytes()); err != nil { return xerrors.Errorf("putting byEpoch entry: %w", err) } - if err := f.byEpoch.Put(epochKey, bh.Cid().Bytes()); err != nil { + if err := f.byEpoch.Put(ctx, epochKey, bh.Cid().Bytes()); err != nil { return xerrors.Errorf("putting byEpoch entry: %w", err) } return nil } -func checkFault(t ds.Datastore, key ds.Key, bh *types.BlockHeader, faultType string) error { - fault, err := t.Has(key) +func checkFault(ctx context.Context, t ds.Datastore, key ds.Key, bh *types.BlockHeader, faultType string) error { + fault, err := t.Has(ctx, key) if err != nil { return err } if fault { - cidb, err := t.Get(key) + cidb, err := t.Get(ctx, key) if err != nil { return xerrors.Errorf("getting other block cid: %w", err) } diff --git a/pkg/chainsync/syncer/syncer.go b/pkg/chainsync/syncer/syncer.go index 888b0cb716..f5c0f49a00 100644 --- a/pkg/chainsync/syncer/syncer.go +++ b/pkg/chainsync/syncer/syncer.go @@ -84,14 +84,14 @@ type BlockValidator interface { // ChainReaderWriter reads and writes the chain bsstore. type ChainReaderWriter interface { GetHead() *types.TipSet - GetTipSet(types.TipSetKey) (*types.TipSet, error) - GetTipSetStateRoot(*types.TipSet) (cid.Cid, error) - GetTipSetReceiptsRoot(*types.TipSet) (cid.Cid, error) + GetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) + GetTipSetStateRoot(context.Context, *types.TipSet) (cid.Cid, error) + GetTipSetReceiptsRoot(context.Context, *types.TipSet) (cid.Cid, error) HasTipSetAndState(context.Context, *types.TipSet) bool - GetTipsetMetadata(*types.TipSet) (*chain.TipSetMetadata, error) + GetTipsetMetadata(context.Context, *types.TipSet) (*chain.TipSetMetadata, error) PutTipSetMetadata(context.Context, *chain.TipSetMetadata) error SetHead(context.Context, *types.TipSet) error - GetLatestBeaconEntry(*types.TipSet) (*types.BeaconEntry, error) + GetLatestBeaconEntry(context.Context, *types.TipSet) (*types.BeaconEntry, error) GetGenesisBlock(context.Context) (*types.BlockHeader, error) } @@ -282,7 +282,7 @@ func (syncer *Syncer) HandleNewTipSet(ctx context.Context, target *syncTypes.Tar } func (syncer *Syncer) syncSegement(ctx context.Context, target *syncTypes.Target, tipsets []*types.TipSet) error { - parent, err := syncer.chainStore.GetTipSet(tipsets[0].Parents()) + parent, err := syncer.chainStore.GetTipSet(ctx, tipsets[0].Parents()) if err != nil { return err } @@ -364,7 +364,7 @@ func (syncer *Syncer) fetchChainBlocks(ctx context.Context, knownTip *types.TipS count := 0 loop: for chainTipsets[len(chainTipsets)-1].Height() > untilHeight { - tipSet, err := syncer.chainStore.GetTipSet(targetTip.Parents()) + tipSet, err := syncer.chainStore.GetTipSet(ctx, targetTip.Parents()) if err == nil { chainTipsets = append(chainTipsets, tipSet) targetTip = tipSet @@ -414,7 +414,7 @@ loop: return chainTipsets, nil } - knownParent, err := syncer.chainStore.GetTipSet(knownTip.Parents()) + knownParent, err := syncer.chainStore.GetTipSet(ctx, knownTip.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load next local tipset: %w", err) } @@ -469,7 +469,7 @@ func (syncer *Syncer) syncFork(ctx context.Context, incoming *types.TipSet, know return nil, err } - nts, err := syncer.chainStore.GetTipSet(known.Parents()) + nts, err := syncer.chainStore.GetTipSet(ctx, known.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load next local tipset: %w", err) } @@ -489,7 +489,7 @@ func (syncer *Syncer) syncFork(ctx context.Context, incoming *types.TipSet, know if nts.Height() < tips[cur].Height() { cur++ } else { - nts, err = syncer.chainStore.GetTipSet(nts.Parents()) + nts, err = syncer.chainStore.GetTipSet(ctx, nts.Parents()) if err != nil { return nil, xerrors.Errorf("loading next local tipset: %w", err) } @@ -618,7 +618,7 @@ func (syncer *Syncer) SetHead(ctx context.Context, ts *types.TipSet) error { // If it is the heaviest update the chainStore. if heavier { - exceeds, err := syncer.exceedsForkLength(head, ts) + exceeds, err := syncer.exceedsForkLength(ctx, head, ts) if err != nil { return err } @@ -639,7 +639,7 @@ func (syncer *Syncer) SetHead(ctx context.Context, ts *types.TipSet) error { // FIXME: We may want to replace some of the logic in `syncFork()` with this. // `syncFork()` counts the length on both sides of the fork at the moment (we // need to settle on that) but here we just enforce it on the `synced` side. -func (syncer *Syncer) exceedsForkLength(synced, external *types.TipSet) (bool, error) { +func (syncer *Syncer) exceedsForkLength(ctx context.Context, synced, external *types.TipSet) (bool, error) { if synced == nil || external == nil { // FIXME: If `cs.heaviest` is nil we should just bypass the entire // `MaybeTakeHeavierTipSet` logic (instead of each of the called @@ -664,7 +664,7 @@ func (syncer *Syncer) exceedsForkLength(synced, external *types.TipSet) (bool, e return true, nil } - external, err = syncer.chainStore.GetTipSet(external.Parents()) + external, err = syncer.chainStore.GetTipSet(ctx, external.Parents()) if err != nil { return false, xerrors.Errorf("failed to load parent tipset in external chain: %w", err) } @@ -687,7 +687,7 @@ func (syncer *Syncer) exceedsForkLength(synced, external *types.TipSet) (bool, e // there is no common ancestor. return true, nil } - synced, err = syncer.chainStore.GetTipSet(synced.Parents()) + synced, err = syncer.chainStore.GetTipSet(ctx, synced.Parents()) if err != nil { return false, xerrors.Errorf("failed to load parent tipset in synced chain: %w", err) } diff --git a/pkg/chainsync/syncer/syncer_integration_test.go b/pkg/chainsync/syncer/syncer_integration_test.go index 4c688328f1..85ab655006 100644 --- a/pkg/chainsync/syncer/syncer_integration_test.go +++ b/pkg/chainsync/syncer/syncer_integration_test.go @@ -46,9 +46,9 @@ func TestLoadFork(t *testing.T) { require.NoError(t, err) - base := builder.AppendManyOn(3, genesis) - left := builder.AppendManyOn(4, base) - right := builder.AppendManyOn(3, base) + base := builder.AppendManyOn(ctx, 3, genesis) + left := builder.AppendManyOn(ctx, 4, base) + right := builder.AppendManyOn(ctx, 3, base) leftTarget := &types.Target{ Base: nil, @@ -78,7 +78,7 @@ func TestLoadFork(t *testing.T) { // tipsets can be reconstructed. The chain builder used for testing doesn't do that, so do // it manually here. for _, tip := range []*types2.TipSet{left, right} { - for itr := chain.IterAncestors(ctx, builder, tip); !itr.Complete(); require.NoError(t, itr.Next()) { + for itr := chain.IterAncestors(ctx, builder, tip); !itr.Complete(); require.NoError(t, itr.Next(ctx)) { for _, block := range itr.Value().ToSlice() { _, err := builder.Cstore().Put(ctx, block) require.NoError(t, err) diff --git a/pkg/chainsync/syncer/syncer_test.go b/pkg/chainsync/syncer/syncer_test.go index ded1dbc988..559c15c8c5 100644 --- a/pkg/chainsync/syncer/syncer_test.go +++ b/pkg/chainsync/syncer/syncer_test.go @@ -31,7 +31,7 @@ func TestOneBlock(t *testing.T) { tf.UnitTest(t) ctx := context.Background() builder, syncer := setup(ctx, t) - t1 := builder.AppendOn(builder.Genesis(), 1) + t1 := builder.AppendOn(ctx, builder.Genesis(), 1) target := &syncTypes.Target{ Base: nil, Current: nil, @@ -55,7 +55,7 @@ func TestMultiBlockTip(t *testing.T) { builder, syncer := setup(ctx, t) genesis := builder.Store().GetHead() - tip := builder.AppendOn(genesis, 2) + tip := builder.AppendOn(ctx, genesis, 2) target := &syncTypes.Target{ Base: nil, Current: nil, @@ -68,7 +68,7 @@ func TestMultiBlockTip(t *testing.T) { assert.NoError(t, syncer.HandleNewTipSet(ctx, target)) assert.NoError(t, builder.FlushHead(ctx)) - verifyTip(t, builder.Store(), tip, builder.StateForKey(tip.Key())) + verifyTip(t, builder.Store(), tip, builder.StateForKey(ctx, tip.Key())) verifyHead(t, builder.Store(), tip) } @@ -78,13 +78,13 @@ func TestChainIncremental(t *testing.T) { builder, syncer := setup(ctx, t) genesis := builder.Store().GetHead() - t1 := builder.AppendOn(genesis, 2) + t1 := builder.AppendOn(ctx, genesis, 2) - t2 := builder.AppendOn(t1, 3) + t2 := builder.AppendOn(ctx, t1, 3) - t3 := builder.AppendOn(t2, 1) + t3 := builder.AppendOn(ctx, t2, 1) - t4 := builder.AppendOn(t3, 2) + t4 := builder.AppendOn(ctx, t3, 2) target1 := &syncTypes.Target{ Base: nil, @@ -122,22 +122,22 @@ func TestChainIncremental(t *testing.T) { } assert.NoError(t, syncer.HandleNewTipSet(ctx, target1)) assert.NoError(t, builder.FlushHead(ctx)) - verifyTip(t, builder.Store(), t1, builder.StateForKey(t1.Key())) + verifyTip(t, builder.Store(), t1, builder.StateForKey(ctx, t1.Key())) verifyHead(t, builder.Store(), t1) assert.NoError(t, syncer.HandleNewTipSet(ctx, target2)) assert.NoError(t, builder.FlushHead(ctx)) - verifyTip(t, builder.Store(), t2, builder.StateForKey(t2.Key())) + verifyTip(t, builder.Store(), t2, builder.StateForKey(ctx, t2.Key())) verifyHead(t, builder.Store(), t2) assert.NoError(t, syncer.HandleNewTipSet(ctx, target3)) assert.NoError(t, builder.FlushHead(ctx)) - verifyTip(t, builder.Store(), t3, builder.StateForKey(t3.Key())) + verifyTip(t, builder.Store(), t3, builder.StateForKey(ctx, t3.Key())) verifyHead(t, builder.Store(), t3) assert.NoError(t, syncer.HandleNewTipSet(ctx, target4)) assert.NoError(t, builder.FlushHead(ctx)) - verifyTip(t, builder.Store(), t4, builder.StateForKey(t4.Key())) + verifyTip(t, builder.Store(), t4, builder.StateForKey(ctx, t4.Key())) verifyHead(t, builder.Store(), t4) } @@ -147,10 +147,10 @@ func TestChainJump(t *testing.T) { builder, syncer := setup(ctx, t) genesis := builder.Store().GetHead() - t1 := builder.AppendOn(genesis, 2) - t2 := builder.AppendOn(t1, 3) - t3 := builder.AppendOn(t2, 1) - t4 := builder.AppendOn(t3, 2) + t1 := builder.AppendOn(ctx, genesis, 2) + t2 := builder.AppendOn(ctx, t1, 3) + t3 := builder.AppendOn(ctx, t2, 1) + t4 := builder.AppendOn(ctx, t3, 2) target1 := &syncTypes.Target{ Base: nil, @@ -162,10 +162,10 @@ func TestChainJump(t *testing.T) { } assert.NoError(t, syncer.HandleNewTipSet(ctx, target1)) assert.NoError(t, builder.FlushHead(ctx)) - verifyTip(t, builder.Store(), t1, builder.StateForKey(t1.Key())) - verifyTip(t, builder.Store(), t2, builder.StateForKey(t2.Key())) - verifyTip(t, builder.Store(), t3, builder.StateForKey(t3.Key())) - verifyTip(t, builder.Store(), t4, builder.StateForKey(t4.Key())) + verifyTip(t, builder.Store(), t1, builder.StateForKey(ctx, t1.Key())) + verifyTip(t, builder.Store(), t2, builder.StateForKey(ctx, t2.Key())) + verifyTip(t, builder.Store(), t3, builder.StateForKey(ctx, t3.Key())) + verifyTip(t, builder.Store(), t4, builder.StateForKey(ctx, t4.Key())) verifyHead(t, builder.Store(), t4) } @@ -175,13 +175,13 @@ func TestIgnoreLightFork(t *testing.T) { builder, syncer := setup(ctx, t) genesis := builder.Store().GetHead() - forkbase := builder.AppendOn(genesis, 1) - forkHead := builder.AppendOn(forkbase, 1) + forkbase := builder.AppendOn(ctx, genesis, 1) + forkHead := builder.AppendOn(ctx, forkbase, 1) - t1 := builder.AppendOn(forkbase, 1) - t2 := builder.AppendOn(t1, 1) - t3 := builder.AppendOn(t2, 1) - t4 := builder.AppendOn(t3, 1) + t1 := builder.AppendOn(ctx, forkbase, 1) + t2 := builder.AppendOn(ctx, t1, 1) + t3 := builder.AppendOn(ctx, t2, 1) + t4 := builder.AppendOn(ctx, t3, 1) // Sync heaviest branch first. target4 := &syncTypes.Target{ @@ -194,7 +194,7 @@ func TestIgnoreLightFork(t *testing.T) { } assert.NoError(t, syncer.HandleNewTipSet(ctx, target4)) assert.NoError(t, builder.FlushHead(ctx)) - verifyTip(t, builder.Store(), t4, builder.StateForKey(t4.Key())) + verifyTip(t, builder.Store(), t4, builder.StateForKey(ctx, t4.Key())) verifyHead(t, builder.Store(), t4) // Lighter fork is processed but not change head. @@ -218,18 +218,18 @@ func TestAcceptHeavierFork(t *testing.T) { builder, syncer := setup(ctx, t) genesis := builder.Store().GetHead() - forkbase := builder.AppendOn(genesis, 1) + forkbase := builder.AppendOn(ctx, genesis, 1) - main1 := builder.AppendOn(forkbase, 1) - main2 := builder.AppendOn(main1, 1) - main3 := builder.AppendOn(main2, 1) - main4 := builder.AppendOn(main3, 1) + main1 := builder.AppendOn(ctx, forkbase, 1) + main2 := builder.AppendOn(ctx, main1, 1) + main3 := builder.AppendOn(ctx, main2, 1) + main4 := builder.AppendOn(ctx, main3, 1) // Fork is heavier with more blocks, despite shorter (with default fake weighing function // from FakeStateEvaluator). - fork1 := builder.AppendOn(forkbase, 3) - fork2 := builder.AppendOn(fork1, 1) - fork3 := builder.AppendOn(fork2, 1) + fork1 := builder.AppendOn(ctx, forkbase, 3) + fork2 := builder.AppendOn(ctx, fork1, 1) + fork3 := builder.AppendOn(ctx, fork2, 1) main4Target := &syncTypes.Target{ Base: nil, @@ -241,7 +241,7 @@ func TestAcceptHeavierFork(t *testing.T) { } assert.NoError(t, syncer.HandleNewTipSet(ctx, main4Target)) assert.NoError(t, builder.FlushHead(ctx)) - verifyTip(t, builder.Store(), main4, builder.StateForKey(main4.Key())) + verifyTip(t, builder.Store(), main4, builder.StateForKey(ctx, main4.Key())) verifyHead(t, builder.Store(), main4) // Heavier fork updates head3 @@ -255,9 +255,9 @@ func TestAcceptHeavierFork(t *testing.T) { } assert.NoError(t, syncer.HandleNewTipSet(ctx, fork3Target)) assert.NoError(t, builder.FlushHead(ctx)) - verifyTip(t, builder.Store(), fork1, builder.StateForKey(fork1.Key())) - verifyTip(t, builder.Store(), fork2, builder.StateForKey(fork2.Key())) - verifyTip(t, builder.Store(), fork3, builder.StateForKey(fork3.Key())) + verifyTip(t, builder.Store(), fork1, builder.StateForKey(ctx, fork1.Key())) + verifyTip(t, builder.Store(), fork2, builder.StateForKey(ctx, fork2.Key())) + verifyTip(t, builder.Store(), fork3, builder.StateForKey(ctx, fork3.Key())) verifyHead(t, builder.Store(), fork3) } @@ -267,7 +267,7 @@ func TestRejectFinalityFork(t *testing.T) { builder, s := setup(ctx, t) genesis := builder.Store().GetHead() - head := builder.AppendManyOn(int(policy.ChainFinality+2), genesis) + head := builder.AppendManyOn(ctx, int(policy.ChainFinality+2), genesis) target := &syncTypes.Target{ Base: nil, Current: nil, @@ -281,10 +281,10 @@ func TestRejectFinalityFork(t *testing.T) { // Differentiate fork for a new chain. Fork has FinalityEpochs + 1 // blocks on top of genesis so forkFinalityBase is more than FinalityEpochs // behind head - forkFinalityBase := builder.BuildOneOn(genesis, func(bb *chain.BlockBuilder) { + forkFinalityBase := builder.BuildOneOn(ctx, genesis, func(bb *chain.BlockBuilder) { bb.SetTicket([]byte{0xbe}) }) - forkFinalityHead := builder.AppendManyOn(int(policy.ChainFinality), forkFinalityBase) + forkFinalityHead := builder.AppendManyOn(ctx, int(policy.ChainFinality), forkFinalityBase) forkHeadTarget := &syncTypes.Target{ Base: nil, Current: nil, @@ -302,7 +302,7 @@ func TestNoUncessesaryFetch(t *testing.T) { builder, s := setup(ctx, t) genesis := builder.Store().GetHead() - head := builder.AppendManyOn(4, genesis) + head := builder.AppendManyOn(ctx, 4, genesis) target := &syncTypes.Target{ Base: nil, Current: nil, @@ -361,8 +361,8 @@ func TestSubsetParent(t *testing.T) { genesis := builder.Store().GetHead() // Set up chain with {A1, A2} -> {B1, B2, B3} - tipA1A2 := builder.AppendOn(genesis, 2) - tipB1B2B3 := builder.AppendOn(tipA1A2, 3) + tipA1A2 := builder.AppendOn(ctx, genesis, 2) + tipB1B2B3 := builder.AppendOn(ctx, tipA1A2, 3) target1 := &syncTypes.Target{ Base: nil, Current: nil, @@ -376,7 +376,7 @@ func TestSubsetParent(t *testing.T) { // Sync one tipset with a parent equal to a subset of an existing // tipset in the bsstore: {B1, B2} -> {C1, C2} tipB1B2 := testhelpers.RequireNewTipSet(t, tipB1B2B3.At(0), tipB1B2B3.At(1)) - tipC1C2 := builder.AppendOn(tipB1B2, 2) + tipC1C2 := builder.AppendOn(ctx, tipB1B2, 2) target2 := &syncTypes.Target{ Base: nil, @@ -391,7 +391,7 @@ func TestSubsetParent(t *testing.T) { // Sync another tipset with a parent equal to a subset of the tipset // just synced: C1 -> D1 tipC1 := testhelpers.RequireNewTipSet(t, tipC1C2.At(0)) - tipD1OnC1 := builder.AppendOn(tipC1, 1) + tipD1OnC1 := builder.AppendOn(ctx, tipC1, 1) target3 := &syncTypes.Target{ Base: nil, @@ -404,7 +404,7 @@ func TestSubsetParent(t *testing.T) { assert.NoError(t, s.HandleNewTipSet(ctx, target3)) // A full parent also works fine: {C1, C2} -> D1 - tipD1OnC1C2 := builder.AppendOn(tipC1C2, 1) + tipD1OnC1C2 := builder.AppendOn(ctx, tipC1C2, 1) target4 := &syncTypes.Target{ Base: nil, Current: nil, @@ -430,8 +430,8 @@ func TestBlockNotLinkedRejected(t *testing.T) { require.True(t, genesis.Equals(gen2)) // The syncer fails to fetch this block so cannot sync it. - b1 := shadowBuilder.AppendOn(genesis, 1) - b2 := shadowBuilder.AppendOn(b1, 1) + b1 := shadowBuilder.AppendOn(ctx, genesis, 1) + b2 := shadowBuilder.AppendOn(ctx, b1, 1) target1 := &syncTypes.Target{ Base: nil, Current: nil, @@ -443,7 +443,7 @@ func TestBlockNotLinkedRejected(t *testing.T) { assert.Error(t, syncer.HandleNewTipSet(ctx, target1)) // Make the same block available from the syncer's builder - builder.AppendBlockOn(genesis) + builder.AppendBlockOn(ctx, genesis) target2 := &syncTypes.Target{ Base: nil, Current: nil, @@ -510,7 +510,7 @@ func TestSemanticallyBadTipSetFails(t *testing.T) { m2 := mm.NewSignedMessage(alice, 1) m3 := mm.NewSignedMessage(alice, 3) - link1 := builder.BuildOneOn(genesis, func(bb *chain.BlockBuilder) { + link1 := builder.BuildOneOn(ctx, genesis, func(bb *chain.BlockBuilder) { bb.AddMessages( []*types.SignedMessage{m1, m2, m3}, []*types.Message{}, @@ -543,7 +543,7 @@ func TestStoresMessageReceipts(t *testing.T) { keys := testhelpers.MustGenerateKeyInfo(1, 42) mm := testhelpers.NewMessageMaker(t, keys) alice := mm.Addresses()[0] - t1 := builder.Build(genesis, 4, func(b *chain.BlockBuilder, i int) { + t1 := builder.Build(ctx, genesis, 4, func(b *chain.BlockBuilder, i int) { b.AddMessages([]*types.SignedMessage{}, []*types.Message{mm.NewUnsignedMessage(alice, uint64(i))}) }) @@ -557,7 +557,7 @@ func TestStoresMessageReceipts(t *testing.T) { } assert.NoError(t, syncer.HandleNewTipSet(ctx, target1)) - receiptsCid, err := builder.Store().GetTipSetReceiptsRoot(t1) + receiptsCid, err := builder.Store().GetTipSetReceiptsRoot(ctx, t1) require.NoError(t, err) @@ -605,17 +605,19 @@ func setupWithValidator(ctx context.Context, t *testing.T, builder *chain.Builde // Sub-interface of the bsstore used for verification. type syncStoreReader interface { GetHead() *types.TipSet - GetTipSet(types.TipSetKey) (*types.TipSet, error) - GetTipSetStateRoot(*types.TipSet) (cid.Cid, error) + GetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) + GetTipSetStateRoot(context.Context, *types.TipSet) (cid.Cid, error) } // Verifies that a tipset and associated state root are stored in the chain bsstore. func verifyTip(t *testing.T, store syncStoreReader, tip *types.TipSet, stateRoot cid.Cid) { - foundTip, err := store.GetTipSet(tip.Key()) + ctx := context.Background() + + foundTip, err := store.GetTipSet(ctx, tip.Key()) require.NoError(t, err) test.Equal(t, tip, foundTip) - foundState, err := store.GetTipSetStateRoot(tip) + foundState, err := store.GetTipSetStateRoot(ctx, tip) require.NoError(t, err) test.Equal(t, stateRoot, foundState) } diff --git a/pkg/consensus/block_validator.go b/pkg/consensus/block_validator.go index 71731d979a..e38c712679 100644 --- a/pkg/consensus/block_validator.go +++ b/pkg/consensus/block_validator.go @@ -140,7 +140,7 @@ func (bv *BlockValidator) ValidateFullBlock(ctx context.Context, blk *types.Bloc } func (bv *BlockValidator) validateBlock(ctx context.Context, blk *types.BlockHeader) error { - parent, err := bv.chainState.GetTipSet(types.NewTipSetKey(blk.Parents...)) + parent, err := bv.chainState.GetTipSet(ctx, types.NewTipSetKey(blk.Parents...)) if err != nil { return xerrors.Errorf("load parent tipset failed %w", err) } @@ -168,7 +168,7 @@ func (bv *BlockValidator) validateBlock(ctx context.Context, blk *types.BlockHea } // get parent beacon - prevBeacon, err := bv.chainState.GetLatestBeaconEntry(parent) + prevBeacon, err := bv.chainState.GetLatestBeaconEntry(ctx, parent) if err != nil { return xerrors.Errorf("failed to get latest beacon entry: %w", err) } @@ -514,7 +514,7 @@ func (bv *BlockValidator) beaconBaseEntry(ctx context.Context, blk *types.BlockH return &blk.BeaconEntries[len(blk.BeaconEntries)-1], nil } - parent, err := bv.chainState.GetTipSet(types.NewTipSetKey(blk.Parents...)) + parent, err := bv.chainState.GetTipSet(ctx, types.NewTipSetKey(blk.Parents...)) if err != nil { return nil, err } @@ -883,7 +883,7 @@ func (bv *BlockValidator) checkBlockMessages(ctx context.Context, sigValidator * // ValidateMsgMeta performs structural and content hash validation of the // messages within this block. If validation passes, it stores the messages in // the underlying IPLD block store. -func (bv *BlockValidator) ValidateMsgMeta(fblk *types.FullBlock) error { +func (bv *BlockValidator) ValidateMsgMeta(ctx context.Context, fblk *types.FullBlock) error { if msgc := len(fblk.BLSMessages) + len(fblk.SECPMessages); msgc > constants.BlockMessageLimit { return xerrors.Errorf("block %s has too many messages (%d)", fblk.Header.Cid(), msgc) } @@ -898,7 +898,7 @@ func (bv *BlockValidator) ValidateMsgMeta(fblk *types.FullBlock) error { var bcids, scids []cid.Cid for _, m := range fblk.BLSMessages { - c, err := chain.PutMessage(blockstore, m) + c, err := chain.PutMessage(ctx, blockstore, m) if err != nil { return xerrors.Errorf("putting bls message to blockstore after msgmeta computation: %v", err) } @@ -906,7 +906,7 @@ func (bv *BlockValidator) ValidateMsgMeta(fblk *types.FullBlock) error { } for _, m := range fblk.SECPMessages { - c, err := chain.PutMessage(blockstore, m) + c, err := chain.PutMessage(ctx, blockstore, m) if err != nil { return xerrors.Errorf("putting bls message to blockstore after msgmeta computation: %w", err) } diff --git a/pkg/consensus/expected.go b/pkg/consensus/expected.go index 6ee870b118..f9718ac541 100644 --- a/pkg/consensus/expected.go +++ b/pkg/consensus/expected.go @@ -81,20 +81,22 @@ type StateViewer interface { } type chainReader interface { - GetTipSet(types.TipSetKey) (*types.TipSet, error) + GetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) GetHead() *types.TipSet - StateView(ts *types.TipSet) (*appstate.View, error) - GetTipSetStateRoot(*types.TipSet) (cid.Cid, error) - GetTipSetReceiptsRoot(*types.TipSet) (cid.Cid, error) + StateView(ctx context.Context, ts *types.TipSet) (*appstate.View, error) + GetTipSetStateRoot(context.Context, *types.TipSet) (cid.Cid, error) + GetTipSetReceiptsRoot(context.Context, *types.TipSet) (cid.Cid, error) GetGenesisBlock(context.Context) (*types.BlockHeader, error) - GetLatestBeaconEntry(*types.TipSet) (*types.BeaconEntry, error) + GetLatestBeaconEntry(context.Context, *types.TipSet) (*types.BeaconEntry, error) GetTipSetByHeight(context.Context, *types.TipSet, abi.ChainEpoch, bool) (*types.TipSet, error) GetCirculatingSupplyDetailed(context.Context, abi.ChainEpoch, tree.Tree) (types.CirculatingSupply, error) GetLookbackTipSetForRound(ctx context.Context, ts *types.TipSet, round abi.ChainEpoch, version network.Version) (*types.TipSet, cid.Cid, error) - GetTipsetMetadata(*types.TipSet) (*chain.TipSetMetadata, error) + GetTipsetMetadata(context.Context, *types.TipSet) (*chain.TipSetMetadata, error) PutTipSetMetadata(context.Context, *chain.TipSetMetadata) error } +var _ chainReader = (*chain.Store)(nil) + // Expected implements expected consensus. type Expected struct { // cstore is used for loading state trees during message running. @@ -133,6 +135,8 @@ type Expected struct { blockValidator *BlockValidator } + + // NewExpected is the constructor for the Expected consenus.Protocol module. func NewExpected(cs cbor.IpldStore, bs blockstore.Blockstore, @@ -190,7 +194,7 @@ func (c *Expected) RunStateTransition(ctx context.Context, ts *types.TipSet) (ci return ts.Blocks()[0].ParentStateRoot, ts.Blocks()[0].ParentMessageReceipts, nil } else if ts.Height() > 0 { parent := ts.Parents() - if pts, err = c.chainState.GetTipSet(parent); err != nil { + if pts, err = c.chainState.GetTipSet(ctx, parent); err != nil { return cid.Undef, cid.Undef, err } } else { @@ -205,7 +209,7 @@ func (c *Expected) RunStateTransition(ctx context.Context, ts *types.TipSet) (ci } return dertail.FilCirculating, nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(c.chainState, c.fork, ts), + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, c.chainState, c.fork, ts), NtwkVersionGetter: c.fork.GetNtwkVersion, Rnd: NewHeadRandomness(c.rnd, ts.Key()), BaseFee: ts.At(0).ParentBaseFee, diff --git a/pkg/consensus/message_validator.go b/pkg/consensus/message_validator.go index a1fcad7118..c1f7e1f0c7 100644 --- a/pkg/consensus/message_validator.go +++ b/pkg/consensus/message_validator.go @@ -139,7 +139,7 @@ type MessageSignatureValidator struct { // signatureValidatorAPI allows the validator to access state needed for signature checking type signatureValidatorAPI interface { GetHead() *types.TipSet - GetTipSet(types.TipSetKey) (*types.TipSet, error) + GetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) AccountView(ts *types.TipSet) (state.AccountView, error) } diff --git a/pkg/consensus/message_validator_test.go b/pkg/consensus/message_validator_test.go index ade771b464..b08bbea75c 100644 --- a/pkg/consensus/message_validator_test.go +++ b/pkg/consensus/message_validator_test.go @@ -150,7 +150,7 @@ func (api *FakeIngestionValidatorAPI) GetHead() *types.TipSet { return ts } -func (api *FakeIngestionValidatorAPI) GetTipSet(key types.TipSetKey) (*types.TipSet, error) { +func (api *FakeIngestionValidatorAPI) GetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) { return types.NewTipSet([]*types.BlockHeader{api.Block}) } diff --git a/pkg/consensus/ticket.go b/pkg/consensus/ticket.go index e3c3a9c830..a6d036178e 100644 --- a/pkg/consensus/ticket.go +++ b/pkg/consensus/ticket.go @@ -21,7 +21,7 @@ type ChainSampler interface { } type tipsetLoader interface { - GetTipSet(types.TipSetKey) (*types.TipSet, error) + GetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) } // TicketMachine uses a VRF and VDF to generate deterministic, unpredictable @@ -72,7 +72,7 @@ func (tm TicketMachine) ticketVRFRandomness(ctx context.Context, base types.TipS } if bSmokeHeight { // todo - ts, err := tm.tipsetLoader.GetTipSet(base) + ts, err := tm.tipsetLoader.GetTipSet(ctx, base) if err != nil { return nil, err } diff --git a/pkg/consensus/ticket_test.go b/pkg/consensus/ticket_test.go index 39b0685763..a8caa2d5a8 100644 --- a/pkg/consensus/ticket_test.go +++ b/pkg/consensus/ticket_test.go @@ -121,6 +121,6 @@ func newMockTipsetLoader(tsk *types.TipSet) *mockTipsetLoader { return &mockTipsetLoader{tsk: tsk} } -func (m *mockTipsetLoader) GetTipSet(tsk types.TipSetKey) (*types.TipSet, error) { +func (m *mockTipsetLoader) GetTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { return m.tsk, nil } diff --git a/pkg/consensusfault/check.go b/pkg/consensusfault/check.go index 7ac95b6fbf..1e6a4eb57c 100644 --- a/pkg/consensusfault/check.go +++ b/pkg/consensusfault/check.go @@ -31,7 +31,7 @@ type FaultStateView interface { // Chain state required for checking consensus fault reports. type chainReader interface { - GetTipSet(types.TipSetKey) (*types.TipSet, error) + GetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) } // Checks the validity of reported consensus faults. diff --git a/pkg/discovery/hello_protocol.go b/pkg/discovery/hello_protocol.go index 5d45756c52..25f46766af 100644 --- a/pkg/discovery/hello_protocol.go +++ b/pkg/discovery/hello_protocol.go @@ -190,7 +190,7 @@ func (h *HelloProtocolHandler) handleNewStream(s net.Stream) { } func (h *HelloProtocolHandler) loadLocalFullTipset(ctx context.Context, tsk types.TipSetKey) (*types.FullTipSet, error) { - ts, err := h.chainStore.GetTipSet(tsk) + ts, err := h.chainStore.GetTipSet(ctx, tsk) if err != nil { return nil, err } diff --git a/pkg/discovery/hello_protocol_test.go b/pkg/discovery/hello_protocol_test.go index ffc443aa65..a62c4db833 100644 --- a/pkg/discovery/hello_protocol_test.go +++ b/pkg/discovery/hello_protocol_test.go @@ -58,8 +58,8 @@ func TestHelloHandshake(t *testing.T) { genesisA := builder.Genesis() store := builder.Store() mstore := builder.Mstore() - heavy1 := builder.AppendOn(genesisA, 1) - heavy2 := builder.AppendOn(heavy1, 1) + heavy1 := builder.AppendOn(ctx, genesisA, 1) + heavy2 := builder.AppendOn(ctx, heavy1, 1) msc1, msc2 := new(mockHelloCallback), new(mockHelloCallback) hg1, hg2 := &mockHeaviestGetter{heavy1}, &mockHeaviestGetter{heavy2} @@ -117,11 +117,11 @@ func TestHelloBadGenesis(t *testing.T) { store := builder.Store() mstore := builder.Mstore() - genesisA := builder.AppendOn(types.UndefTipSet, 1) - genesisB := builder.AppendOn(types.UndefTipSet, 1) + genesisA := builder.AppendOn(ctx, types.UndefTipSet, 1) + genesisB := builder.AppendOn(ctx, types.UndefTipSet, 1) - heavy1 := builder.AppendOn(genesisA, 1) - heavy2 := builder.AppendOn(heavy1, 1) + heavy1 := builder.AppendOn(ctx, genesisA, 1) + heavy2 := builder.AppendOn(ctx, heavy1, 1) msc1, msc2 := new(mockHelloCallback), new(mockHelloCallback) hg1, hg2 := &mockHeaviestGetter{heavy1}, &mockHeaviestGetter{heavy2} @@ -164,9 +164,9 @@ func TestHelloMultiBlock(t *testing.T) { genesisTipset := builder.Genesis() assert.Equal(t, 1, genesisTipset.Len()) - heavy1 := builder.AppendOn(genesisTipset, 3) - heavy1 = builder.AppendOn(heavy1, 3) - heavy2 := builder.AppendOn(heavy1, 3) + heavy1 := builder.AppendOn(ctx, genesisTipset, 3) + heavy1 = builder.AppendOn(ctx, heavy1, 3) + heavy2 := builder.AppendOn(ctx, heavy1, 3) msc1, msc2 := new(mockHelloCallback), new(mockHelloCallback) hg1, hg2 := &mockHeaviestGetter{heavy1}, &mockHeaviestGetter{heavy2} diff --git a/pkg/events/events_test.go b/pkg/events/events_test.go index 82d5f5bc65..490046291a 100644 --- a/pkg/events/events_test.go +++ b/pkg/events/events_test.go @@ -120,7 +120,7 @@ func (fcs *fakeCS) ChainGetPath(ctx context.Context, from, to types.TipSetKey) ( } // copied from the chainstore - revert, apply, err := chain.ReorgOps(func(tsk types.TipSetKey) (*types.TipSet, error) { + revert, apply, err := chain.ReorgOps(func(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { return fcs.ChainGetTipSet(ctx, tsk) }, fromTS, toTS) if err != nil { diff --git a/pkg/events/state/mock/api.go b/pkg/events/state/mock/api.go index dd8e6ed3a0..eda198b22a 100644 --- a/pkg/events/state/mock/api.go +++ b/pkg/events/state/mock/api.go @@ -29,11 +29,11 @@ func NewMockAPI(bs blockstore.Blockstore) *MockAPI { } func (m *MockAPI) ChainHasObj(ctx context.Context, c cid.Cid) (bool, error) { - return m.bs.Has(c) + return m.bs.Has(ctx, c) } func (m *MockAPI) ChainReadObj(ctx context.Context, c cid.Cid) ([]byte, error) { - blk, err := m.bs.Get(c) + blk, err := m.bs.Get(ctx, c) if err != nil { return nil, xerrors.Errorf("blockstore get: %w", err) } diff --git a/pkg/fork/fork.go b/pkg/fork/fork.go index f18d30eb48..5bed606f3e 100644 --- a/pkg/fork/fork.go +++ b/pkg/fork/fork.go @@ -352,7 +352,7 @@ func (us UpgradeSchedule) Validate() error { type chainReader interface { GetHead() *types.TipSet - GetTipSet(types.TipSetKey) (*types.TipSet, error) + GetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) GetTipSetByHeight(context.Context, *types.TipSet, abi.ChainEpoch, bool) (*types.TipSet, error) GetTipSetState(context.Context, *types.TipSet) (vmstate.Tree, error) GetGenesisBlock(context.Context) (*types.BlockHeader, error) @@ -682,7 +682,7 @@ func (c *ChainFork) UpgradeFaucetBurnRecovery(ctx context.Context, cache Migrati return cid.Undef, xerrors.Errorf("failed to get tipset at lookback height: %v", err) } - pts, err := c.cr.GetTipSet(lbts.Parents()) + pts, err := c.cr.GetTipSet(ctx, lbts.Parents()) if err != nil { return cid.Undef, xerrors.Errorf("failed to get tipset : %v", err) } @@ -1258,13 +1258,13 @@ func linksForObj(blk ipfsblock.Block, cb func(cid.Cid)) error { } } -func copyRec(from, to blockstore.Blockstore, root cid.Cid, cp func(ipfsblock.Block) error) error { +func copyRec(ctx context.Context, from, to blockstore.Blockstore, root cid.Cid, cp func(ipfsblock.Block) error) error { if root.Prefix().MhType == 0 { // identity cid, skip return nil } - blk, err := from.Get(root) + blk, err := from.Get(ctx, root) if err != nil { return xerrors.Errorf("get %s failed: %v", root, err) } @@ -1289,7 +1289,7 @@ func copyRec(from, to blockstore.Blockstore, root cid.Cid, cp func(ipfsblock.Blo } } else { // If we have an object, we already have its children, skip the object. - has, err := to.Has(link) + has, err := to.Has(ctx, link) if err != nil { lerr = xerrors.Errorf("has: %v", err) return @@ -1299,7 +1299,7 @@ func copyRec(from, to blockstore.Blockstore, root cid.Cid, cp func(ipfsblock.Blo } } - if err := copyRec(from, to, link, cp); err != nil { + if err := copyRec(ctx, from, to, link, cp); err != nil { lerr = err return } @@ -1336,7 +1336,7 @@ func Copy(ctx context.Context, from, to blockstore.Blockstore, root cid.Cid) err go func() { for b := range toFlush { - if err := to.PutMany(b); err != nil { + if err := to.PutMany(ctx, b); err != nil { close(freeBufs) errFlushChan <- xerrors.Errorf("batch put in copy: %v", err) return @@ -1365,7 +1365,7 @@ func Copy(ctx context.Context, from, to blockstore.Blockstore, root cid.Cid) err return nil } - if err := copyRec(from, to, root, batchCp); err != nil { + if err := copyRec(ctx, from, to, root, batchCp); err != nil { return xerrors.Errorf("copyRec: %v", err) } diff --git a/pkg/gen/genesis/genesis.go b/pkg/gen/genesis/genesis.go index 0385174a7e..04735f4c9b 100644 --- a/pkg/gen/genesis/genesis.go +++ b/pkg/gen/genesis/genesis.go @@ -601,7 +601,7 @@ func MakeGenesisBlock(ctx context.Context, rep repo.Repo, bs bstore.Blockstore, if err != nil { return nil, xerrors.Errorf("serializing msgmeta failed: %w", err) } - if err := bs.Put(mmb); err != nil { + if err := bs.Put(ctx, mmb); err != nil { return nil, xerrors.Errorf("putting msgmeta block to blockstore: %w", err) } @@ -631,7 +631,7 @@ func MakeGenesisBlock(ctx context.Context, rep repo.Repo, bs bstore.Blockstore, return nil, xerrors.Errorf("filecoinGenesisCid != gblk.Cid") } - if err := bs.Put(gblk); err != nil { + if err := bs.Put(ctx, gblk); err != nil { return nil, xerrors.Errorf("failed writing filecoin genesis block to blockstore: %w", err) } @@ -662,7 +662,7 @@ func MakeGenesisBlock(ctx context.Context, rep repo.Repo, bs bstore.Blockstore, return nil, xerrors.Errorf("serializing block header failed: %w", err) } - if err := bs.Put(sb); err != nil { + if err := bs.Put(ctx, sb); err != nil { return nil, xerrors.Errorf("putting header to blockstore: %w", err) } diff --git a/pkg/genesis/init.go b/pkg/genesis/init.go index 7c2b4f66c8..bf564664ec 100644 --- a/pkg/genesis/init.go +++ b/pkg/genesis/init.go @@ -50,7 +50,7 @@ func Init(ctx context.Context, r repo.Repo, bs bstore.Blockstore, cst cbor.IpldS return nil, errors.Wrap(err, "failed to marshal genesis cid") } - if err = r.ChainDatastore().Put(chain.GenesisKey, val); err != nil { + if err = r.ChainDatastore().Put(ctx, chain.GenesisKey, val); err != nil { return nil, errors.Wrap(err, "failed to persist genesis cid") } diff --git a/pkg/market/fundmanager.go b/pkg/market/fundmanager.go index 0fc7664542..d026d4b804 100644 --- a/pkg/market/fundmanager.go +++ b/pkg/market/fundmanager.go @@ -70,7 +70,7 @@ func (fm *FundManager) Stop() { fm.shutdown() } -func (fm *FundManager) Start() error { +func (fm *FundManager) Start(ctx context.Context) error { fm.lk.Lock() defer fm.lk.Unlock() @@ -79,11 +79,11 @@ func (fm *FundManager) Start() error { // - in State() only load addresses with in-progress messages // - load the others just-in-time from getFundedAddress // - delete(fm.fundedAddrs, addr) when the queue has been processed - return fm.str.forEach(func(state *FundedAddressState) { + return fm.str.forEach(ctx, func(state *FundedAddressState) { fa := newFundedAddress(fm, state.Addr) fa.state = state fm.fundedAddrs[fa.state.Addr] = fa - fa.start() + fa.start(ctx) }) } @@ -169,13 +169,13 @@ func newFundedAddress(fm *FundManager, addr address.Address) *fundedAddress { // If there is an in-progress on-chain message, don't submit any more messages // on chain until it completes -func (a *fundedAddress) start() { +func (a *fundedAddress) start(ctx context.Context) { a.lk.Lock() defer a.lk.Unlock() if a.state.MsgCid != nil { a.debugf("restart: wait for %s", a.state.MsgCid) - a.startWaitForResults(*a.state.MsgCid) + a.startWaitForResults(ctx, *a.state.MsgCid) } } @@ -208,7 +208,7 @@ func (a *fundedAddress) requestAndWait(ctx context.Context, wallet address.Addre a.lk.Unlock() // Process the queue - go a.process() + go a.process(ctx) // Wait for the results select { @@ -228,7 +228,7 @@ func (a *fundedAddress) onProcessStart(fn func() bool) { } // Process queued requests -func (a *fundedAddress) process() { +func (a *fundedAddress) process(ctx context.Context) { a.lk.Lock() defer a.lk.Unlock() @@ -257,7 +257,7 @@ func (a *fundedAddress) process() { if haveReservations { res, err := a.processReservations(a.reservations, a.releases) if err == nil { - a.applyStateChange(res.msgCid, res.amtReserved) + a.applyStateChange(ctx, res.msgCid, res.amtReserved) } a.reservations = filterOutProcessedReqs(a.reservations) a.releases = filterOutProcessedReqs(a.releases) @@ -268,7 +268,7 @@ func (a *fundedAddress) process() { if haveWithdrawals && a.state.MsgCid == nil && len(a.reservations) == 0 { withdrawalCid, err := a.processWithdrawals(a.withdrawals) if err == nil && withdrawalCid != cid.Undef { - a.applyStateChange(&withdrawalCid, types.EmptyInt) + a.applyStateChange(ctx, &withdrawalCid, types.EmptyInt) } a.withdrawals = filterOutProcessedReqs(a.withdrawals) } @@ -276,11 +276,11 @@ func (a *fundedAddress) process() { // If a message was sent on-chain if a.state.MsgCid != nil { // Start waiting for results of message (async) - a.startWaitForResults(*a.state.MsgCid) + a.startWaitForResults(ctx, *a.state.MsgCid) } // Process any remaining queued requests - go a.process() + go a.process(ctx) } // Filter out completed requests @@ -295,24 +295,24 @@ func filterOutProcessedReqs(reqs []*fundRequest) []*fundRequest { } // Apply the results of processing queues and save to the datastore -func (a *fundedAddress) applyStateChange(msgCid *cid.Cid, amtReserved abi.TokenAmount) { +func (a *fundedAddress) applyStateChange(ctx context.Context, msgCid *cid.Cid, amtReserved abi.TokenAmount) { a.state.MsgCid = msgCid if !amtReserved.Nil() { a.state.AmtReserved = amtReserved } - a.saveState() + a.saveState(ctx) } // Clear the pending message cid so that a new message can be sent -func (a *fundedAddress) clearWaitState() { +func (a *fundedAddress) clearWaitState(ctx context.Context) { a.state.MsgCid = nil - a.saveState() + a.saveState(ctx) } // Save state to datastore -func (a *fundedAddress) saveState() { +func (a *fundedAddress) saveState(ctx context.Context) { // Not much we can do if saving to the datastore fails, just log - err := a.str.save(a.state) + err := a.str.save(ctx, a.state) if err != nil { log.Errorf("saving state to store for addr %s: %w", a.state.Addr, err) } @@ -563,7 +563,7 @@ func (a *fundedAddress) processWithdrawals(withdrawals []*fundRequest) (msgCid c } // asynchonously wait for results of message -func (a *fundedAddress) startWaitForResults(msgCid cid.Cid) { +func (a *fundedAddress) startWaitForResults(ctx context.Context, msgCid cid.Cid) { go func() { err := a.env.WaitMsg(a.ctx, msgCid) if err != nil { @@ -574,10 +574,10 @@ func (a *fundedAddress) startWaitForResults(msgCid cid.Cid) { a.lk.Lock() a.debugf("complete wait") - a.clearWaitState() + a.clearWaitState(ctx) a.lk.Unlock() - a.process() + a.process(ctx) }() } diff --git a/pkg/market/fundmanager_test.go b/pkg/market/fundmanager_test.go index 71c055caeb..71d53f96f8 100644 --- a/pkg/market/fundmanager_test.go +++ b/pkg/market/fundmanager_test.go @@ -3,31 +3,30 @@ package market import ( "bytes" "context" - - "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/pkg/config" - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/wallet" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/stretchr/testify/assert" - - "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" - "github.com/ipfs/go-datastore" - "sync" "testing" "time" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/ipfs/go-cid" + "github.com/ipfs/go-datastore" + ds_sync "github.com/ipfs/go-datastore/sync" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" tutils "github.com/filecoin-project/specs-actors/v6/support/testing" + + "github.com/filecoin-project/venus/pkg/config" _ "github.com/filecoin-project/venus/pkg/crypto/bls" _ "github.com/filecoin-project/venus/pkg/crypto/secp" - "github.com/ipfs/go-cid" - ds_sync "github.com/ipfs/go-datastore/sync" - "github.com/stretchr/testify/require" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + "github.com/filecoin-project/venus/pkg/wallet" + apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // TestFundManagerBasic verifies that the basic fund manager operations work @@ -213,9 +212,10 @@ func TestFundManagerReserveByWallet(t *testing.T) { s := setup(t) defer s.fm.Stop() - walletAddrA, err := s.wllt.NewAddress(address.SECP256K1) + ctx := context.Background() + walletAddrA, err := s.wllt.NewAddress(ctx, address.SECP256K1) require.NoError(t, err) - walletAddrB, err := s.wllt.NewAddress(address.SECP256K1) + walletAddrB, err := s.wllt.NewAddress(ctx, address.SECP256K1) require.NoError(t, err) // Wait until all the reservation requests are queued up @@ -401,9 +401,11 @@ func TestFundManagerWithdrawByWallet(t *testing.T) { tf.UnitTest(t) s := setup(t) defer s.fm.Stop() - walletAddrA, err := s.wllt.NewAddress(address.SECP256K1) + + ctx := context.Background() + walletAddrA, err := s.wllt.NewAddress(ctx, address.SECP256K1) require.NoError(t, err) - walletAddrB, err := s.wllt.NewAddress(address.SECP256K1) + walletAddrB, err := s.wllt.NewAddress(ctx, address.SECP256K1) require.NoError(t, err) // Reserve 10 @@ -511,6 +513,8 @@ func TestFundManagerRestart(t *testing.T) { s := setup(t) defer s.fm.Stop() + ctx := context.Background() + acctAddr2 := tutils.NewActorAddr(t, "addr2") // Address 1: Reserve 10 @@ -538,7 +542,7 @@ func TestFundManagerRestart(t *testing.T) { // Restart mockAPIAfter := s.mockAPI fmAfter := newFundManager(mockAPIAfter, s.ds) - err = fmAfter.Start() + err = fmAfter.Start(ctx) require.NoError(t, err) amt3 := abi.NewTokenAmount(9) @@ -629,11 +633,11 @@ func setup(t *testing.T) *scaffold { ctx := context.Background() t.Log("create a backend") ds := datastore.NewMapDatastore() - fs, err := wallet.NewDSBackend(ds, config.TestPassphraseConfig(), wallet.TestPassword) + fs, err := wallet.NewDSBackend(ctx, ds, config.TestPassphraseConfig(), wallet.TestPassword) assert.NoError(t, err) t.Log("create a wallet with a single backend") wllt := wallet.New(fs) - walletAddr, err := wllt.NewAddress(address.SECP256K1) + walletAddr, err := wllt.NewAddress(ctx, address.SECP256K1) if err != nil { t.Fatal(err) } diff --git a/pkg/market/store.go b/pkg/market/store.go index 9b58dcc011..16a37c60e0 100644 --- a/pkg/market/store.go +++ b/pkg/market/store.go @@ -2,6 +2,7 @@ package market import ( "bytes" + "context" "github.com/filecoin-project/venus/pkg/repo" @@ -28,7 +29,7 @@ func newStore(ds repo.Datastore) *Store { } // save the state to the datastore -func (ps *Store) save(state *FundedAddressState) error { +func (ps *Store) save(ctx context.Context, state *FundedAddressState) error { k := dskeyForAddr(state.Addr) b, err := cborrpc.Dump(state) @@ -36,15 +37,15 @@ func (ps *Store) save(state *FundedAddressState) error { return err } - return ps.ds.Put(k, b) + return ps.ds.Put(ctx, k, b) } // get the state for the given address // nolint -func (ps *Store) get(addr address.Address) (*FundedAddressState, error) { +func (ps *Store) get(ctx context.Context, addr address.Address) (*FundedAddressState, error) { k := dskeyForAddr(addr) - data, err := ps.ds.Get(k) + data, err := ps.ds.Get(ctx, k) if err != nil { return nil, err } @@ -58,8 +59,8 @@ func (ps *Store) get(addr address.Address) (*FundedAddressState, error) { } // forEach calls iter with each address in the datastore -func (ps *Store) forEach(iter func(*FundedAddressState)) error { - res, err := ps.ds.Query(dsq.Query{Prefix: dsKeyAddr}) +func (ps *Store) forEach(ctx context.Context, iter func(*FundedAddressState)) error { + res, err := ps.ds.Query(ctx, dsq.Query{Prefix: dsKeyAddr}) if err != nil { return err } diff --git a/pkg/messagepool/config.go b/pkg/messagepool/config.go index d866400b90..a54e313404 100644 --- a/pkg/messagepool/config.go +++ b/pkg/messagepool/config.go @@ -1,6 +1,7 @@ package messagepool import ( + "context" "encoding/json" "fmt" "time" @@ -36,8 +37,8 @@ func (mc *MpoolConfig) Clone() *MpoolConfig { return r } -func loadConfig(ds repo.Datastore) (*MpoolConfig, error) { - haveCfg, err := ds.Has(ConfigKey) +func loadConfig(ctx context.Context, ds repo.Datastore) (*MpoolConfig, error) { + haveCfg, err := ds.Has(ctx, ConfigKey) if err != nil { return nil, err } @@ -46,7 +47,7 @@ func loadConfig(ds repo.Datastore) (*MpoolConfig, error) { return DefaultConfig(), nil } - cfgBytes, err := ds.Get(ConfigKey) + cfgBytes, err := ds.Get(ctx, ConfigKey) if err != nil { return nil, err } @@ -55,12 +56,12 @@ func loadConfig(ds repo.Datastore) (*MpoolConfig, error) { return cfg, err } -func saveConfig(cfg *MpoolConfig, ds repo.Datastore) error { +func saveConfig(ctx context.Context, cfg *MpoolConfig, ds repo.Datastore) error { cfgBytes, err := json.Marshal(cfg) if err != nil { return err } - return ds.Put(ConfigKey, cfgBytes) + return ds.Put(ctx, ConfigKey, cfgBytes) } func (mp *MessagePool) GetConfig() *MpoolConfig { @@ -80,7 +81,7 @@ func validateConfg(cfg *MpoolConfig) error { return nil } -func (mp *MessagePool) SetConfig(cfg *MpoolConfig) error { +func (mp *MessagePool) SetConfig(ctx context.Context, cfg *MpoolConfig) error { if err := validateConfg(cfg); err != nil { return err } @@ -88,7 +89,7 @@ func (mp *MessagePool) SetConfig(cfg *MpoolConfig) error { mp.cfgLk.Lock() mp.cfg = cfg - err := saveConfig(cfg, mp.ds) + err := saveConfig(ctx, cfg, mp.ds) if err != nil { log.Warnf("error persisting mpool config: %s", err) } diff --git a/pkg/messagepool/gas.go b/pkg/messagepool/gas.go index 17a9384250..f0675878da 100644 --- a/pkg/messagepool/gas.go +++ b/pkg/messagepool/gas.go @@ -49,14 +49,14 @@ func NewGasPriceCache() *GasPriceCache { } } -func (g *GasPriceCache) GetTSGasStats(provider Provider, ts *types.TipSet) ([]GasMeta, error) { +func (g *GasPriceCache) GetTSGasStats(ctx context.Context, provider Provider, ts *types.TipSet) ([]GasMeta, error) { i, has := g.c.Get(ts.Key()) if has { return i.([]GasMeta), nil } var prices []GasMeta - msgs, err := provider.MessagesForTipset(ts) + msgs, err := provider.MessagesForTipset(ctx, ts) if err != nil { return nil, xerrors.Errorf("loading messages: %w", err) } @@ -78,7 +78,7 @@ func (mp *MessagePool) GasEstimateFeeCap( maxqueueblks int64, tsk types.TipSetKey, ) (big.Int, error) { - ts, err := mp.api.ChainHead() + ts, err := mp.api.ChainHead(ctx) if err != nil { return types.NewGasFeeCap(0), err } @@ -137,7 +137,7 @@ func (mp *MessagePool) GasEstimateGasPremium( var prices []GasMeta var blocks int - ts, err := mp.api.ChainHead() + ts, err := mp.api.ChainHead(ctx) if err != nil { return big.Int{}, err } @@ -147,13 +147,13 @@ func (mp *MessagePool) GasEstimateGasPremium( break // genesis } - pts, err := mp.api.LoadTipSet(ts.Parents()) + pts, err := mp.api.LoadTipSet(ctx, ts.Parents()) if err != nil { return types.BigInt{}, err } blocks += len(pts.Blocks()) - meta, err := cache.GetTSGasStats(mp.api, pts) + meta, err := cache.GetTSGasStats(ctx, mp.api, pts) if err != nil { return types.BigInt{}, err } @@ -186,13 +186,13 @@ func (mp *MessagePool) GasEstimateGasPremium( func (mp *MessagePool) GasEstimateGasLimit(ctx context.Context, msgIn *types.Message, tsk types.TipSetKey) (int64, error) { if tsk.IsEmpty() { - ts, err := mp.api.ChainHead() + ts, err := mp.api.ChainHead(ctx) if err != nil { return -1, xerrors.Errorf("getting head: %v", err) } tsk = ts.Key() } - currTS, err := mp.api.ChainTipSet(tsk) + currTS, err := mp.api.ChainTipSet(ctx, tsk) if err != nil { return -1, xerrors.Errorf("getting tipset: %w", err) } @@ -234,7 +234,7 @@ func (mp *MessagePool) evalMessageGasLimit(ctx context.Context, msgIn *types.Mes break } - ts, err = mp.api.ChainTipSet(ts.Parents()) + ts, err = mp.api.ChainTipSet(ctx, ts.Parents()) if err != nil { return -1, xerrors.Errorf("getting parent tipset: %v", err) } @@ -247,7 +247,7 @@ func (mp *MessagePool) evalMessageGasLimit(ctx context.Context, msgIn *types.Mes } // Special case for PaymentChannel collect, which is deleting actor - pts, err := mp.api.ChainTipSet(ts.Parents()) + pts, err := mp.api.ChainTipSet(ctx, ts.Parents()) if err != nil { _ = err // somewhat ignore it as it can happen and we just want to detect @@ -316,7 +316,7 @@ func (mp *MessagePool) GasBatchEstimateMessageGas(ctx context.Context, estimateM } // ChainTipSet will determine if tsk is empty - currTS, err := mp.api.ChainTipSet(tsk) + currTS, err := mp.api.ChainTipSet(ctx, tsk) if err != nil { return nil, xerrors.Errorf("getting tipset: %w", err) } diff --git a/pkg/messagepool/messagepool.go b/pkg/messagepool/messagepool.go index f8b1ef07dd..d0ab1081b9 100644 --- a/pkg/messagepool/messagepool.go +++ b/pkg/messagepool/messagepool.go @@ -370,7 +370,8 @@ func (ms *msgSet) toSlice() []*types.SignedMessage { return set } -func New(api Provider, +func New(ctx context.Context, + api Provider, sm *statemanger.Stmgr, ds repo.Datastore, forkParams *config.ForkUpgradeConfig, @@ -381,7 +382,7 @@ func New(api Provider, cache, _ := lru.New2Q(constants.BlsSignatureCacheSize) verifcache, _ := lru.New2Q(constants.VerifSigCacheSize) - cfg, err := loadConfig(ds) + cfg, err := loadConfig(ctx, ds) if err != nil { return nil, xerrors.Errorf("error loading mpool config: %v", err) } @@ -428,7 +429,7 @@ func New(api Provider, ctx, cancel := context.WithCancel(context.TODO()) // load the current tipset and subscribe to head changes _before_ loading local messages - mp.curTS = api.SubscribeHeadChanges(func(rev, app []*types.TipSet) error { + mp.curTS = api.SubscribeHeadChanges(ctx, func(rev, app []*types.TipSet) error { err := mp.HeadChange(ctx, rev, app) if err != nil { log.Errorf("mpool head notif handler error: %+v", err) @@ -594,7 +595,7 @@ func (mp *MessagePool) PublishMsgForWallet(ctx context.Context, addr address.Add continue } - err = mp.api.PubSubPublish(msgsub.Topic(mp.netName), msgb) + err = mp.api.PubSubPublish(ctx, msgsub.Topic(mp.netName), msgb) if err != nil { log.Errorf("could not publish: %s", err) continue @@ -604,13 +605,13 @@ func (mp *MessagePool) PublishMsgForWallet(ctx context.Context, addr address.Add return nil } -func (mp *MessagePool) PublishMsg(smsg *types.SignedMessage) error { +func (mp *MessagePool) PublishMsg(ctx context.Context, smsg *types.SignedMessage) error { msgb, err := smsg.Serialize() if err != nil { return xerrors.Errorf("could not serialize: %s", err) } - err = mp.api.PubSubPublish(msgsub.Topic(mp.netName), msgb) + err = mp.api.PubSubPublish(ctx, msgsub.Topic(mp.netName), msgb) if err != nil { return xerrors.Errorf("could not publish: %s", err) } @@ -671,7 +672,7 @@ func (mp *MessagePool) addLocal(ctx context.Context, m *types.SignedMessage) err msgb := buf.Bytes() c := m.Cid() - if err := mp.localMsgs.Put(datastore.NewKey(string(c.Bytes())), msgb); err != nil { + if err := mp.localMsgs.Put(ctx, datastore.NewKey(string(c.Bytes())), msgb); err != nil { return xerrors.Errorf("persisting local message: %v", err) } @@ -758,7 +759,7 @@ func (mp *MessagePool) Push(ctx context.Context, m *types.SignedMessage) (cid.Ci return cid.Undef, xerrors.Errorf("error serializing message: %v", err) } - err = mp.api.PubSubPublish(msgsub.Topic(mp.netName), buf.Bytes()) + err = mp.api.PubSubPublish(ctx, msgsub.Topic(mp.netName), buf.Bytes()) if err != nil { return cid.Undef, xerrors.Errorf("error publishing message: %v", err) } @@ -971,12 +972,12 @@ func (mp *MessagePool) addLocked(ctx context.Context, m *types.SignedMessage, st mp.blsSigCache.Add(m.Cid(), m.Signature) } - if _, err := mp.api.PutMessage(m); err != nil { + if _, err := mp.api.PutMessage(ctx, m); err != nil { log.Warnf("mpooladd sm.PutMessage failed: %s", err) return err } - if _, err := mp.api.PutMessage(&m.Message); err != nil { + if _, err := mp.api.PutMessage(ctx, &m.Message); err != nil { log.Warnf("mpooladd sm.PutMessage failed: %s", err) return err } @@ -1044,10 +1045,10 @@ func (mp *MessagePool) GetNonce(ctx context.Context, addr address.Address, _ typ } // GetActor should not be used. It is only here to satisfy interface mess caused by lite node handling -func (mp *MessagePool) GetActor(_ context.Context, addr address.Address, _ types.TipSetKey) (*types.Actor, error) { +func (mp *MessagePool) GetActor(ctx context.Context, addr address.Address, _ types.TipSetKey) (*types.Actor, error) { mp.curTSLk.Lock() defer mp.curTSLk.Unlock() - return mp.api.GetActorAfter(addr, mp.curTS) + return mp.api.GetActorAfter(ctx, addr, mp.curTS) } func (mp *MessagePool) getNonceLocked(ctx context.Context, addr address.Address, curTS *types.TipSet) (uint64, error) { @@ -1076,7 +1077,7 @@ func (mp *MessagePool) getNonceLocked(ctx context.Context, addr address.Address, } func (mp *MessagePool) getStateNonce(ctx context.Context, addr address.Address, curTS *types.TipSet) (uint64, error) { - act, err := mp.api.GetActorAfter(addr, curTS) + act, err := mp.api.GetActorAfter(ctx, addr, curTS) if err != nil { return 0, err } @@ -1085,7 +1086,7 @@ func (mp *MessagePool) getStateNonce(ctx context.Context, addr address.Address, } func (mp *MessagePool) getStateBalance(ctx context.Context, addr address.Address, ts *types.TipSet) (big.Int, error) { - act, err := mp.api.GetActorAfter(addr, ts) + act, err := mp.api.GetActorAfter(ctx, addr, ts) if err != nil { return big.Zero(), err } @@ -1125,7 +1126,7 @@ func (mp *MessagePool) PushUntrusted(ctx context.Context, m *types.SignedMessage return cid.Undef, xerrors.Errorf("error serializing message: %v", err) } - err = mp.api.PubSubPublish(msgsub.Topic(mp.netName), buf.Bytes()) + err = mp.api.PubSubPublish(ctx, msgsub.Topic(mp.netName), buf.Bytes()) if err != nil { return cid.Undef, xerrors.Errorf("error publishing message: %v", err) } @@ -1265,7 +1266,7 @@ func (mp *MessagePool) HeadChange(ctx context.Context, revert []*types.TipSet, a for _, ts := range revert { tsKey := ts.Parents() - pts, err := mp.api.LoadTipSet(tsKey) + pts, err := mp.api.LoadTipSet(ctx, tsKey) if err != nil { log.Errorf("error loading reverted tipset parent: %s", err) merr = multierror.Append(merr, err) @@ -1274,7 +1275,7 @@ func (mp *MessagePool) HeadChange(ctx context.Context, revert []*types.TipSet, a mp.curTS = pts - msgs, err := mp.MessagesForBlocks(ts.Blocks()) + msgs, err := mp.MessagesForBlocks(ctx, ts.Blocks()) if err != nil { log.Errorf("error retrieving messages for reverted block: %s", err) merr = multierror.Append(merr, err) @@ -1290,7 +1291,7 @@ func (mp *MessagePool) HeadChange(ctx context.Context, revert []*types.TipSet, a mp.curTS = ts for _, b := range ts.Blocks() { - bmsgs, smsgs, err := mp.api.MessagesForBlock(b) + bmsgs, smsgs, err := mp.api.MessagesForBlock(ctx, b) if err != nil { xerr := xerrors.Errorf("failed to get messages for apply block %s(height %d) (msgroot = %s): %v", b.Cid(), b.Height, b.Messages, err) log.Errorf("error retrieving messages for block: %s", xerr) @@ -1346,7 +1347,7 @@ func (mp *MessagePool) HeadChange(ctx context.Context, revert []*types.TipSet, a for a, bkt := range buckets { // TODO that might not be correct with GatActorAfter but it is only debug code - act, err := mp.api.GetActorAfter(a, ts) + act, err := mp.api.GetActorAfter(ctx, a, ts) if err != nil { log.Debugf("%s, err: %s\n", a, err) continue @@ -1427,7 +1428,7 @@ func (mp *MessagePool) runHeadChange(ctx context.Context, from *types.TipSet, to var merr error for _, ts := range revert { - msgs, err := mp.MessagesForBlocks(ts.Blocks()) + msgs, err := mp.MessagesForBlocks(ctx, ts.Blocks()) if err != nil { log.Errorf("error retrieving messages for reverted block: %s", err) merr = multierror.Append(merr, err) @@ -1441,7 +1442,7 @@ func (mp *MessagePool) runHeadChange(ctx context.Context, from *types.TipSet, to for _, ts := range apply { for _, b := range ts.Blocks() { - bmsgs, smsgs, err := mp.api.MessagesForBlock(b) + bmsgs, smsgs, err := mp.api.MessagesForBlock(context.TODO(), b) if err != nil { xerr := xerrors.Errorf("failed to get messages for apply block %s(height %d) (msgroot = %s): %v", b.Cid(), b.Height, b.Messages, err) log.Errorf("error retrieving messages for block: %s", xerr) @@ -1466,11 +1467,11 @@ type statBucket struct { msgs map[uint64]*types.SignedMessage } -func (mp *MessagePool) MessagesForBlocks(blks []*types.BlockHeader) ([]*types.SignedMessage, error) { +func (mp *MessagePool) MessagesForBlocks(ctx context.Context, blks []*types.BlockHeader) ([]*types.SignedMessage, error) { out := make([]*types.SignedMessage, 0) for _, b := range blks { - bmsgs, smsgs, err := mp.api.MessagesForBlock(b) + bmsgs, smsgs, err := mp.api.MessagesForBlock(ctx, b) if err != nil { return nil, xerrors.Errorf("failed to get messages for apply block %s(height %d) (msgroot = %s): %v", b.Cid(), b.Height, b.Messages, err) } @@ -1541,7 +1542,7 @@ func (mp *MessagePool) loadLocal(ctx context.Context) error { return nil } - res, err := mp.localMsgs.Query(query.Query{}) + res, err := mp.localMsgs.Query(ctx, query.Query{}) if err != nil { return xerrors.Errorf("query local messages: %v", err) } @@ -1589,7 +1590,7 @@ func (mp *MessagePool) Clear(ctx context.Context, local bool) { if ok { for _, m := range mset.msgs { - err := mp.localMsgs.Delete(datastore.NewKey(string(m.Cid().Bytes()))) + err := mp.localMsgs.Delete(ctx, datastore.NewKey(string(m.Cid().Bytes()))) if err != nil { log.Warnf("error deleting local message: %s", err) } diff --git a/pkg/messagepool/messagepool_test.go b/pkg/messagepool/messagepool_test.go index c17216e280..f95e2ff30d 100644 --- a/pkg/messagepool/messagepool_test.go +++ b/pkg/messagepool/messagepool_test.go @@ -66,7 +66,7 @@ func mkMessage(from, to address.Address, nonce uint64, w *wallet.Wallet) *types. } c := msg.Cid() - sig, err := w.WalletSign(from, c.Bytes(), wtypes.MsgMeta{}) + sig, err := w.WalletSign(context.Background(), from, c.Bytes(), wtypes.MsgMeta{}) if err != nil { panic(err) } @@ -185,20 +185,20 @@ func (tma *testMpoolAPI) setBlockMessages(h *types.BlockHeader, msgs ...*types.S tma.bmsgs[h.Cid()] = msgs } -func (tma *testMpoolAPI) ChainHead() (*types.TipSet, error) { +func (tma *testMpoolAPI) ChainHead(ctx context.Context) (*types.TipSet, error) { return &types.TipSet{}, nil } -func (tma *testMpoolAPI) ChainTipSet(key types.TipSetKey) (*types.TipSet, error) { +func (tma *testMpoolAPI) ChainTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) { return &types.TipSet{}, nil } -func (tma *testMpoolAPI) SubscribeHeadChanges(cb func(rev, app []*types.TipSet) error) *types.TipSet { +func (tma *testMpoolAPI) SubscribeHeadChanges(ctx context.Context, cb func(rev, app []*types.TipSet) error) *types.TipSet { tma.cb = cb return tma.tipsets[0] } -func (tma *testMpoolAPI) PutMessage(m types.ChainMsg) (cid.Cid, error) { +func (tma *testMpoolAPI) PutMessage(ctx context.Context, m types.ChainMsg) (cid.Cid, error) { return cid.Undef, nil } @@ -206,12 +206,12 @@ func (tma *testMpoolAPI) IsLite() bool { return false } -func (tma *testMpoolAPI) PubSubPublish(string, []byte) error { +func (tma *testMpoolAPI) PubSubPublish(context.Context, string, []byte) error { tma.published++ return nil } -func (tma *testMpoolAPI) GetActorAfter(addr address.Address, ts *types.TipSet) (*types.Actor, error) { +func (tma *testMpoolAPI) GetActorAfter(ctx context.Context, addr address.Address, ts *types.TipSet) (*types.Actor, error) { // regression check for load bug if ts == nil { panic("GetActorAfter called with nil tipset") @@ -266,16 +266,16 @@ func (tma *testMpoolAPI) StateAccountKey(ctx context.Context, addr address.Addre return addr, nil } -func (tma *testMpoolAPI) MessagesForBlock(h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { +func (tma *testMpoolAPI) MessagesForBlock(ctx context.Context, h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { return nil, tma.bmsgs[h.Cid()], nil } -func (tma *testMpoolAPI) MessagesForTipset(ts *types.TipSet) ([]types.ChainMsg, error) { +func (tma *testMpoolAPI) MessagesForTipset(ctx context.Context, ts *types.TipSet) ([]types.ChainMsg, error) { if len(ts.Blocks()) != 1 { panic("cant deal with multiblock tipsets in this test") } - bm, sm, err := tma.MessagesForBlock(ts.Blocks()[0]) + bm, sm, err := tma.MessagesForBlock(ctx, ts.Blocks()[0]) if err != nil { return nil, err } @@ -292,7 +292,7 @@ func (tma *testMpoolAPI) MessagesForTipset(ts *types.TipSet) ([]types.ChainMsg, return out, nil } -func (tma *testMpoolAPI) LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) { +func (tma *testMpoolAPI) LoadTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { for _, ts := range tma.tipsets { if tsk.Equals(ts.Key()) { return ts, nil @@ -332,7 +332,7 @@ func mustAdd(t *testing.T, mp *MessagePool, msg *types.SignedMessage) { func newWalletAndMpool(t *testing.T, tma *testMpoolAPI) (*wallet.Wallet, *MessagePool) { ds := datastore.NewMapDatastore() - mp, err := New(tma, nil, ds, config.DefaultForkUpgradeParam, config.DefaultMessagePoolParam, "mptest", nil) + mp, err := New(context.Background(), tma, nil, ds, config.DefaultForkUpgradeParam, config.DefaultMessagePoolParam, "mptest", nil) if err != nil { t.Fatal(err) } @@ -342,7 +342,7 @@ func newWalletAndMpool(t *testing.T, tma *testMpoolAPI) (*wallet.Wallet, *Messag func newWallet(t *testing.T) *wallet.Wallet { r := repo.NewInMemoryRepo() - backend, err := wallet.NewDSBackend(r.WalletDatastore(), r.Config().Wallet.PassphraseConfig, wallet.TestPassword) + backend, err := wallet.NewDSBackend(context.Background(), r.WalletDatastore(), r.Config().Wallet.PassphraseConfig, wallet.TestPassword) assert.NoError(t, err) return wallet.New(backend) @@ -357,7 +357,7 @@ func TestMessagePool(t *testing.T) { a := tma.nextBlock() - sender, err := w.NewAddress(address.SECP256K1) + sender, err := w.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -386,7 +386,7 @@ func TestCheckMessageBig(t *testing.T) { tma := newTestMpoolAPI() w, mp := newWalletAndMpool(t, tma) - from, err := w.NewAddress(address.SECP256K1) + from, err := w.NewAddress(context.Background(), address.SECP256K1) assert.NoError(t, err) tma.setBalance(from, 1000e9) @@ -405,7 +405,7 @@ func TestCheckMessageBig(t *testing.T) { Params: make([]byte, 41<<10), // 41KiB payload } - sig, err := w.WalletSign(from, msg.Cid().Bytes(), wtypes.MsgMeta{}) + sig, err := w.WalletSign(context.Background(), from, msg.Cid().Bytes(), wtypes.MsgMeta{}) if err != nil { panic(err) } @@ -428,7 +428,7 @@ func TestCheckMessageBig(t *testing.T) { Params: make([]byte, 64<<10), // 64KiB payload } - sig, err := w.WalletSign(from, msg.Cid().Bytes(), wtypes.MsgMeta{}) + sig, err := w.WalletSign(context.Background(), from, msg.Cid().Bytes(), wtypes.MsgMeta{}) if err != nil { panic(err) } @@ -450,7 +450,7 @@ func TestMessagePoolMessagesInEachBlock(t *testing.T) { a := tma.nextBlock() - sender, err := w.NewAddress(address.SECP256K1) + sender, err := w.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -492,7 +492,7 @@ func TestRevertMessages(t *testing.T) { a := tma.nextBlock() b := tma.nextBlock() - sender, err := w.NewAddress(address.SECP256K1) + sender, err := w.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -547,7 +547,7 @@ func TestPruningSimple(t *testing.T) { a := tma.nextBlock() tma.applyBlock(t, a) - sender, err := w.NewAddress(address.SECP256K1) + sender, err := w.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -585,21 +585,21 @@ func TestLoadLocal(t *testing.T) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, nil, ds, config.DefaultForkUpgradeParam, config.DefaultMessagePoolParam, "mptest", nil) + mp, err := New(context.Background(), tma, nil, ds, config.DefaultForkUpgradeParam, config.DefaultMessagePoolParam, "mptest", nil) if err != nil { t.Fatal(err) } // the actors w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } w2 := newWallet(t) - a2, err := w2.NewAddress(address.SECP256K1) + a2, err := w2.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -621,7 +621,7 @@ func TestLoadLocal(t *testing.T) { t.Fatal(err) } - mp, err = New(tma, nil, ds, config.DefaultForkUpgradeParam, config.DefaultMessagePoolParam, "mptest", nil) + mp, err = New(context.Background(), tma, nil, ds, config.DefaultForkUpgradeParam, config.DefaultMessagePoolParam, "mptest", nil) if err != nil { t.Fatal(err) } @@ -652,20 +652,20 @@ func TestClearAll(t *testing.T) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, nil, ds, config.DefaultForkUpgradeParam, config.DefaultMessagePoolParam, "mptest", nil) + mp, err := New(context.Background(), tma, nil, ds, config.DefaultForkUpgradeParam, config.DefaultMessagePoolParam, "mptest", nil) if err != nil { t.Fatal(err) } // the actors w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } w2 := newWallet(t) - a2, err := w2.NewAddress(address.SECP256K1) + a2, err := w2.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -700,20 +700,20 @@ func TestClearNonLocal(t *testing.T) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, nil, ds, config.DefaultForkUpgradeParam, config.DefaultMessagePoolParam, "mptest", nil) + mp, err := New(context.Background(), tma, nil, ds, config.DefaultForkUpgradeParam, config.DefaultMessagePoolParam, "mptest", nil) if err != nil { t.Fatal(err) } // the actors w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } w2 := newWallet(t) - a2, err := w2.NewAddress(address.SECP256K1) + a2, err := w2.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -755,20 +755,20 @@ func TestUpdates(t *testing.T) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, nil, ds, config.DefaultForkUpgradeParam, config.DefaultMessagePoolParam, "mptest", nil) + mp, err := New(context.Background(), tma, nil, ds, config.DefaultForkUpgradeParam, config.DefaultMessagePoolParam, "mptest", nil) if err != nil { t.Fatal(err) } // the actors w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } w2 := newWallet(t) - a2, err := w2.NewAddress(address.SECP256K1) + a2, err := w2.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } diff --git a/pkg/messagepool/messagesigner.go b/pkg/messagepool/messagesigner.go index 32ee6643d9..87953c873b 100644 --- a/pkg/messagepool/messagesigner.go +++ b/pkg/messagepool/messagesigner.go @@ -62,7 +62,7 @@ func (ms *MessageSigner) SignMessage(ctx context.Context, msg *types.Message, cb return nil, xerrors.Errorf("serializing message: %w", err) } - sig, err := ms.wallet.WalletSign(msg.From, mb.Cid().Bytes(), mptypes.MsgMeta{ + sig, err := ms.wallet.WalletSign(ctx, msg.From, mb.Cid().Bytes(), mptypes.MsgMeta{ Type: mptypes.MTChainMsg, Extra: mb.RawData(), }) @@ -81,7 +81,7 @@ func (ms *MessageSigner) SignMessage(ctx context.Context, msg *types.Message, cb } // If the callback executed successfully, write the nonce to the datastore - if err := ms.saveNonce(msg.From, nonce); err != nil { + if err := ms.saveNonce(ctx, msg.From, nonce); err != nil { return nil, xerrors.Errorf("failed to save nonce: %w", err) } @@ -102,7 +102,7 @@ func (ms *MessageSigner) nextNonce(ctx context.Context, addr address.Address) (u // Get the next nonce for this address from the datastore addrNonceKey := ms.dstoreKey(addr) - dsNonceBytes, err := ms.ds.Get(addrNonceKey) + dsNonceBytes, err := ms.ds.Get(ctx, addrNonceKey) switch { case xerrors.Is(err, datastore.ErrNotFound): @@ -136,7 +136,7 @@ func (ms *MessageSigner) nextNonce(ctx context.Context, addr address.Address) (u // saveNonce increments the nonce for this address and writes it to the // datastore -func (ms *MessageSigner) saveNonce(addr address.Address, nonce uint64) error { +func (ms *MessageSigner) saveNonce(ctx context.Context, addr address.Address, nonce uint64) error { // Increment the nonce nonce++ @@ -147,7 +147,7 @@ func (ms *MessageSigner) saveNonce(addr address.Address, nonce uint64) error { if err != nil { return xerrors.Errorf("failed to marshall nonce: %w", err) } - err = ms.ds.Put(addrNonceKey, buf.Bytes()) + err = ms.ds.Put(ctx, addrNonceKey, buf.Bytes()) if err != nil { return xerrors.Errorf("failed to write nonce to datastore: %w", err) } diff --git a/pkg/messagepool/messagesigner_test.go b/pkg/messagepool/messagesigner_test.go index 94a876f30c..15bd2db492 100644 --- a/pkg/messagepool/messagesigner_test.go +++ b/pkg/messagepool/messagesigner_test.go @@ -5,25 +5,19 @@ import ( "sync" "testing" - "github.com/filecoin-project/venus/pkg/repo" - types "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/stretchr/testify/assert" - - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/wallet" - - "github.com/stretchr/testify/require" - - ds_sync "github.com/ipfs/go-datastore/sync" - "github.com/filecoin-project/go-address" - - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + "github.com/filecoin-project/venus/pkg/wallet" "github.com/ipfs/go-datastore" + ds_sync "github.com/ipfs/go-datastore/sync" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.org/x/xerrors" _ "github.com/filecoin-project/venus/pkg/crypto/bls" _ "github.com/filecoin-project/venus/pkg/crypto/secp" + "github.com/filecoin-project/venus/pkg/repo" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + types "github.com/filecoin-project/venus/venus-shared/chain" ) type mockMpool struct { @@ -59,18 +53,18 @@ func TestMessageSignerSignMessage(t *testing.T) { ctx := context.Background() r := repo.NewInMemoryRepo() - backend, err := wallet.NewDSBackend(r.WalletDatastore(), r.Config().Wallet.PassphraseConfig, wallet.TestPassword) + backend, err := wallet.NewDSBackend(ctx, r.WalletDatastore(), r.Config().Wallet.PassphraseConfig, wallet.TestPassword) assert.NoError(t, err) w := wallet.New(backend) - from1, err := w.NewAddress(address.SECP256K1) + from1, err := w.NewAddress(ctx, address.SECP256K1) require.NoError(t, err) - from2, err := w.NewAddress(address.SECP256K1) + from2, err := w.NewAddress(ctx, address.SECP256K1) require.NoError(t, err) - to1, err := w.NewAddress(address.SECP256K1) + to1, err := w.NewAddress(ctx, address.SECP256K1) require.NoError(t, err) - to2, err := w.NewAddress(address.SECP256K1) + to2, err := w.NewAddress(ctx, address.SECP256K1) require.NoError(t, err) type msgSpec struct { diff --git a/pkg/messagepool/provider.go b/pkg/messagepool/provider.go index 67e93abcf2..d6ba9ae8a4 100644 --- a/pkg/messagepool/provider.go +++ b/pkg/messagepool/provider.go @@ -23,17 +23,17 @@ var ( ) type Provider interface { - ChainHead() (*types.TipSet, error) - ChainTipSet(types.TipSetKey) (*types.TipSet, error) - SubscribeHeadChanges(func(rev, app []*types.TipSet) error) *types.TipSet - PutMessage(m types.ChainMsg) (cid.Cid, error) - PubSubPublish(string, []byte) error - GetActorAfter(address.Address, *types.TipSet) (*types.Actor, error) + ChainHead(ctx context.Context) (*types.TipSet, error) + ChainTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) + SubscribeHeadChanges(context.Context, func(rev, app []*types.TipSet) error) *types.TipSet + PutMessage(context.Context, types.ChainMsg) (cid.Cid, error) + PubSubPublish(context.Context, string, []byte) error + GetActorAfter(context.Context, address.Address, *types.TipSet) (*types.Actor, error) StateAccountKeyAtFinality(context.Context, address.Address, *types.TipSet) (address.Address, error) StateAccountKey(context.Context, address.Address, *types.TipSet) (address.Address, error) - MessagesForBlock(block2 *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) - MessagesForTipset(*types.TipSet) ([]types.ChainMsg, error) - LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) + MessagesForBlock(context.Context, *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) + MessagesForTipset(context.Context, *types.TipSet) ([]types.ChainMsg, error) + LoadTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) ChainComputeBaseFee(ctx context.Context, ts *types.TipSet) (tbig.Int, error) IsLite() bool } @@ -68,7 +68,7 @@ func (mpp *mpoolProvider) IsLite() bool { return mpp.lite != nil } -func (mpp *mpoolProvider) SubscribeHeadChanges(cb func(rev, app []*types.TipSet) error) *types.TipSet { +func (mpp *mpoolProvider) SubscribeHeadChanges(ctx context.Context, cb func(rev, app []*types.TipSet) error) *types.TipSet { mpp.sm.SubscribeHeadChanges( chain.WrapHeadChangeCoalescer( cb, @@ -79,23 +79,23 @@ func (mpp *mpoolProvider) SubscribeHeadChanges(cb func(rev, app []*types.TipSet) return mpp.sm.GetHead() } -func (mpp *mpoolProvider) ChainHead() (*types.TipSet, error) { +func (mpp *mpoolProvider) ChainHead(context.Context) (*types.TipSet, error) { return mpp.sm.GetHead(), nil } -func (mpp *mpoolProvider) ChainTipSet(key types.TipSetKey) (*types.TipSet, error) { - return mpp.sm.GetTipSet(key) +func (mpp *mpoolProvider) ChainTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) { + return mpp.sm.GetTipSet(ctx, key) } -func (mpp *mpoolProvider) PutMessage(m types.ChainMsg) (cid.Cid, error) { - return mpp.sm.PutMessage(m) +func (mpp *mpoolProvider) PutMessage(ctx context.Context, m types.ChainMsg) (cid.Cid, error) { + return mpp.sm.PutMessage(ctx, m) } -func (mpp *mpoolProvider) PubSubPublish(k string, v []byte) error { +func (mpp *mpoolProvider) PubSubPublish(ctx context.Context, k string, v []byte) error { return mpp.ps.Publish(k, v) // nolint } -func (mpp *mpoolProvider) GetActorAfter(addr address.Address, ts *types.TipSet) (*types.Actor, error) { +func (mpp *mpoolProvider) GetActorAfter(ctx context.Context, addr address.Address, ts *types.TipSet) (*types.Actor, error) { if mpp.IsLite() { n, err := mpp.lite.GetNonce(context.TODO(), addr, ts.Key()) if err != nil { @@ -137,17 +137,17 @@ func (mpp *mpoolProvider) StateAccountKey(ctx context.Context, addr address.Addr return mpp.stmgr.ResolveToKeyAddress(ctx, addr, ts) } -func (mpp *mpoolProvider) MessagesForBlock(h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { +func (mpp *mpoolProvider) MessagesForBlock(ctx context.Context, h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { secpMsgs, blsMsgs, err := mpp.cms.LoadMetaMessages(context.TODO(), h.Messages) return blsMsgs, secpMsgs, err } -func (mpp *mpoolProvider) MessagesForTipset(ts *types.TipSet) ([]types.ChainMsg, error) { +func (mpp *mpoolProvider) MessagesForTipset(ctx context.Context, ts *types.TipSet) ([]types.ChainMsg, error) { return mpp.cms.MessagesForTipset(ts) } -func (mpp *mpoolProvider) LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) { - return mpp.sm.GetTipSet(tsk) +func (mpp *mpoolProvider) LoadTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { + return mpp.sm.GetTipSet(ctx, tsk) } func (mpp *mpoolProvider) ChainComputeBaseFee(ctx context.Context, ts *types.TipSet) (tbig.Int, error) { diff --git a/pkg/messagepool/pruning.go b/pkg/messagepool/pruning.go index b2f9886ffa..373f715584 100644 --- a/pkg/messagepool/pruning.go +++ b/pkg/messagepool/pruning.go @@ -85,7 +85,7 @@ func (mp *MessagePool) pruneMessages(ctx context.Context, ts *types.TipSet) erro for _, m := range mset { pruneMsgs[m.Message.Cid()] = m } - actorChains := mp.createMessageChains(actor, mset, baseFeeLowerBound, ts) + actorChains := mp.createMessageChains(ctx, actor, mset, baseFeeLowerBound, ts) chains = append(chains, actorChains...) } diff --git a/pkg/messagepool/repub.go b/pkg/messagepool/repub.go index 6fc1c15645..2d577bcd8e 100644 --- a/pkg/messagepool/repub.go +++ b/pkg/messagepool/repub.go @@ -62,7 +62,7 @@ func (mp *MessagePool) republishPendingMessages(ctx context.Context) error { // chains that might become profitable in the next 20 blocks. // We still check the lowerBound condition for individual messages so that we don't send // messages that will be rejected by the mpool spam protector, so this is safe to do. - next := mp.createMessageChains(actor, mset, baseFeeLowerBound, ts) + next := mp.createMessageChains(ctx, actor, mset, baseFeeLowerBound, ts) chains = append(chains, next...) } @@ -140,7 +140,7 @@ LOOP: return xerrors.Errorf("cannot serialize message: %v", err) } - err = mp.api.PubSubPublish(msgsub.Topic(mp.netName), buf.Bytes()) + err = mp.api.PubSubPublish(ctx, msgsub.Topic(mp.netName), buf.Bytes()) if err != nil { return xerrors.Errorf("cannot publish: %v", err) } diff --git a/pkg/messagepool/repub_test.go b/pkg/messagepool/repub_test.go index 277757b2ae..b8312565a1 100644 --- a/pkg/messagepool/repub_test.go +++ b/pkg/messagepool/repub_test.go @@ -26,20 +26,21 @@ func TestRepubMessages(t *testing.T) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, nil, ds, config.DefaultForkUpgradeParam, config.DefaultMessagePoolParam, "mptest", nil) + mp, err := New(context.Background(), tma, nil, ds, config.DefaultForkUpgradeParam, config.DefaultMessagePoolParam, "mptest", nil) if err != nil { t.Fatal(err) } // the actors + ctx := context.Background() w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(ctx, address.SECP256K1) if err != nil { t.Fatal(err) } w2 := newWallet(t) - a2, err := w2.NewAddress(address.SECP256K1) + a2, err := w2.NewAddress(ctx, address.SECP256K1) if err != nil { t.Fatal(err) } diff --git a/pkg/messagepool/selection.go b/pkg/messagepool/selection.go index f9dad88a51..52ea248eed 100644 --- a/pkg/messagepool/selection.go +++ b/pkg/messagepool/selection.go @@ -232,7 +232,7 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTS, ts *typ startChains := time.Now() var chains []*msgChain for actor, mset := range pending { - next := mp.createMessageChains(actor, mset, baseFee, ts) + next := mp.createMessageChains(ctx, actor, mset, baseFee, ts) chains = append(chains, next...) } if dt := time.Since(startChains); dt > time.Millisecond { @@ -473,7 +473,7 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTS, ts *type startChains := time.Now() var chains []*msgChain for actor, mset := range pending { - next := mp.createMessageChains(actor, mset, baseFee, ts) + next := mp.createMessageChains(ctx, actor, mset, baseFee, ts) chains = append(chains, next...) } if dt := time.Since(startChains); dt > time.Millisecond { @@ -601,7 +601,7 @@ func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[a // remove actor from pending set as we are already processed these messages delete(pending, pk) // create chains for the priority actor - next := mp.createMessageChains(actor, mset, baseFee, ts) + next := mp.createMessageChains(ctx, actor, mset, baseFee, ts) chains = append(chains, next...) } } @@ -750,7 +750,7 @@ func (*MessagePool) getGasPerf(gasReward *big.Int, gasLimit int64) float64 { return r } -func (mp *MessagePool) createMessageChains(actor address.Address, mset map[uint64]*types.SignedMessage, baseFee types.BigInt, ts *types.TipSet) []*msgChain { +func (mp *MessagePool) createMessageChains(ctx context.Context, actor address.Address, mset map[uint64]*types.SignedMessage, baseFee types.BigInt, ts *types.TipSet) []*msgChain { // collect all messages msgs := make([]*types.SignedMessage, 0, len(mset)) for _, m := range mset { @@ -769,7 +769,7 @@ func (mp *MessagePool) createMessageChains(actor address.Address, mset map[uint6 // cannot exceed the block limit; drop all messages that exceed the limit // - the total gasReward cannot exceed the actor's balance; drop all messages that exceed // the balance - a, err := mp.api.GetActorAfter(actor, ts) + a, err := mp.api.GetActorAfter(ctx, actor, ts) if err != nil { log.Errorf("failed to load actor state, not building chain for %s: %v", actor, err) return nil diff --git a/pkg/messagepool/selection_test.go b/pkg/messagepool/selection_test.go index 7be620b2aa..6440067f78 100644 --- a/pkg/messagepool/selection_test.go +++ b/pkg/messagepool/selection_test.go @@ -56,7 +56,7 @@ func makeTestMessage(w *wallet.Wallet, from, to address.Address, nonce uint64, g } c := msg.Cid() - sig, err := w.WalletSign(from, c.Bytes(), mtypes.MsgMeta{}) + sig, err := w.WalletSign(context.Background(), from, c.Bytes(), mtypes.MsgMeta{}) if err != nil { panic(err) } @@ -69,7 +69,7 @@ func makeTestMessage(w *wallet.Wallet, from, to address.Address, nonce uint64, g func makeTestMpool() (*MessagePool, *testMpoolAPI) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, nil, ds, config.DefaultForkUpgradeParam, config.DefaultMessagePoolParam, "test", nil) + mp, err := New(context.Background(), tma, nil, ds, config.DefaultForkUpgradeParam, config.DefaultMessagePoolParam, "test", nil) if err != nil { panic(err) } @@ -84,13 +84,13 @@ func TestMessageChains(t *testing.T) { // the actors w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } w2 := newWallet(t) - a2, err := w2.NewAddress(address.SECP256K1) + a2, err := w2.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -113,7 +113,7 @@ func TestMessageChains(t *testing.T) { } baseFee := tbig.NewInt(0) - chains := mp.createMessageChains(a1, mset, baseFee, ts) + chains := mp.createMessageChains(context.Background(), a1, mset, baseFee, ts) if len(chains) != 1 { t.Fatal("expected a single chain") } @@ -134,7 +134,7 @@ func TestMessageChains(t *testing.T) { mset[uint64(i)] = m } - chains = mp.createMessageChains(a1, mset, baseFee, ts) + chains = mp.createMessageChains(context.Background(), a1, mset, baseFee, ts) if len(chains) != 10 { t.Fatal("expected 10 chains") } @@ -158,7 +158,7 @@ func TestMessageChains(t *testing.T) { mset[uint64(i)] = m } - chains = mp.createMessageChains(a1, mset, baseFee, ts) + chains = mp.createMessageChains(context.Background(), a1, mset, baseFee, ts) if len(chains) != 2 { t.Fatal("expected 1 chain") } @@ -189,7 +189,7 @@ func TestMessageChains(t *testing.T) { mset[uint64(i)] = m } - chains = mp.createMessageChains(a1, mset, baseFee, ts) + chains = mp.createMessageChains(context.Background(), a1, mset, baseFee, ts) if len(chains) != 4 { t.Fatal("expected 4 chains") } @@ -222,7 +222,7 @@ func TestMessageChains(t *testing.T) { mset[uint64(i)] = m } - chains = mp.createMessageChains(a1, mset, baseFee, ts) + chains = mp.createMessageChains(context.Background(), a1, mset, baseFee, ts) if len(chains) != 1 { t.Fatal("expected a single chain") } @@ -248,7 +248,7 @@ func TestMessageChains(t *testing.T) { mset[uint64(i)] = m } - chains = mp.createMessageChains(a1, mset, baseFee, ts) + chains = mp.createMessageChains(context.Background(), a1, mset, baseFee, ts) if len(chains) != 1 { t.Fatal("expected a single chain") } @@ -271,7 +271,7 @@ func TestMessageChains(t *testing.T) { mset[uint64(i)] = makeTestMessage(w1, a1, a2, uint64(i), gasLimit, uint64(i+1)) } - chains = mp.createMessageChains(a1, mset, baseFee, ts) + chains = mp.createMessageChains(context.Background(), a1, mset, baseFee, ts) if len(chains) != 1 { t.Fatal("expected a single chain") } @@ -292,7 +292,7 @@ func TestMessageChains(t *testing.T) { mset[uint64(i)] = makeTestMessage(w1, a1, a2, uint64(i), gasLimit, uint64(i+1)) } - chains = mp.createMessageChains(a1, mset, baseFee, ts) + chains = mp.createMessageChains(context.Background(), a1, mset, baseFee, ts) if len(chains) != 1 { t.Fatalf("expected a single chain: got %d", len(chains)) } @@ -316,13 +316,13 @@ func TestMessageChainSkipping(t *testing.T) { // the actors w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } w2 := newWallet(t) - a2, err := w2.NewAddress(address.SECP256K1) + a2, err := w2.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -343,7 +343,7 @@ func TestMessageChainSkipping(t *testing.T) { mset[uint64(i)] = m } - chains := mp.createMessageChains(a1, mset, baseFee, ts) + chains := mp.createMessageChains(context.Background(), a1, mset, baseFee, ts) if len(chains) != 4 { t.Fatalf("expected 4 chains, got %d", len(chains)) } @@ -386,13 +386,13 @@ func TestBasicMessageSelection(t *testing.T) { // the actors w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } w2 := newWallet(t) - a2, err := w2.NewAddress(address.SECP256K1) + a2, err := w2.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -522,13 +522,13 @@ func TestMessageSelectionTrimmingGas(t *testing.T) { // the actors w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } w2 := newWallet(t) - a2, err := w2.NewAddress(address.SECP256K1) + a2, err := w2.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -752,13 +752,13 @@ func TestPriorityMessageSelection(t *testing.T) { // the actors w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } w2 := newWallet(t) - a2, err := w2.NewAddress(address.SECP256K1) + a2, err := w2.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -825,13 +825,13 @@ func TestPriorityMessageSelection2(t *testing.T) { // the actors w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } w2 := newWallet(t) - a2, err := w2.NewAddress(address.SECP256K1) + a2, err := w2.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -888,13 +888,13 @@ func TestPriorityMessageSelection3(t *testing.T) { // the actors w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } w2 := newWallet(t) - a2, err := w2.NewAddress(address.SECP256K1) + a2, err := w2.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -979,13 +979,13 @@ func TestOptimalMessageSelection1(t *testing.T) { // the actors w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } w2 := newWallet(t) - a2, err := w2.NewAddress(address.SECP256K1) + a2, err := w2.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -1040,13 +1040,13 @@ func TestOptimalMessageSelection2(t *testing.T) { // the actors w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } w2 := newWallet(t) - a2, err := w2.NewAddress(address.SECP256K1) + a2, err := w2.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -1119,7 +1119,7 @@ func TestOptimalMessageSelection3(t *testing.T) { for i := 0; i < nActors; i++ { w := newWallet(t) - a, err := w.NewAddress(address.SECP256K1) + a, err := w.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -1196,7 +1196,7 @@ func testCompetitiveMessageSelection(t *testing.T, rng *rand.Rand, getPremium fu for i := 0; i < nActors; i++ { w := newWallet(t) - a, err := w.NewAddress(address.SECP256K1) + a, err := w.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -1489,7 +1489,7 @@ readLoop: if !ok { w := newWallet(t) - a, err := w.NewAddress(address.SECP256K1) + a, err := w.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -1508,7 +1508,7 @@ readLoop: m.Message.Nonce -= baseNonce c := m.Message.Cid() - sig, err := w.WalletSign(localActor, c.Bytes(), mtypes.MsgMeta{}) + sig, err := w.WalletSign(context.Background(), localActor, c.Bytes(), mtypes.MsgMeta{}) if err != nil { t.Fatal(err) } diff --git a/pkg/metrics/heartbeat_test.go b/pkg/metrics/heartbeat_test.go index 1526c69d67..091b72a781 100644 --- a/pkg/metrics/heartbeat_test.go +++ b/pkg/metrics/heartbeat_test.go @@ -56,7 +56,7 @@ func newEndpoint(t *testing.T, port int) endpoint { libp2p.Identity(priv), } - basicHost, err := libp2p.New(context.Background(), opts...) + basicHost, err := libp2p.New(opts...) if err != nil { t.Fatal(err) } diff --git a/pkg/net/blocksub/validator_test.go b/pkg/net/blocksub/validator_test.go index 4f45bc7bdc..8d898972ad 100644 --- a/pkg/net/blocksub/validator_test.go +++ b/pkg/net/blocksub/validator_test.go @@ -28,8 +28,8 @@ func TestBlockTopicValidator(t *testing.T) { builder := chain.NewBuilder(t, address.Undef) pid1 := th.RequireIntPeerID(t, 1) - goodBlk := builder.BuildOnBlock(nil, func(b *chain.BlockBuilder) {}) - badBlk := builder.BuildOnBlock(nil, func(b *chain.BlockBuilder) { + goodBlk := builder.BuildOnBlock(ctx, nil, func(b *chain.BlockBuilder) {}) + badBlk := builder.BuildOnBlock(ctx, nil, func(b *chain.BlockBuilder) { b.IncHeight(1) }) diff --git a/pkg/net/router.go b/pkg/net/router.go index 8c4574ad48..c208d23c5a 100644 --- a/pkg/net/router.go +++ b/pkg/net/router.go @@ -49,7 +49,7 @@ func (r *Router) FindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, e // GetClosestPeers returns a channel of the K closest peers to the given key, // K is the 'K Bucket' parameter of the Kademlia DHT protocol. -func (r *Router) GetClosestPeers(ctx context.Context, key string) (<-chan peer.ID, error) { +func (r *Router) GetClosestPeers(ctx context.Context, key string) ([]peer.ID, error) { ipfsDHT, ok := r.routing.(*dht.IpfsDHT) if !ok { return nil, errors.New("underlying routing should be pointer of IpfsDHT") diff --git a/pkg/paychmgr/accessorcache.go b/pkg/paychmgr/accessorcache.go index 176fbdd118..ee6e4b57ab 100644 --- a/pkg/paychmgr/accessorcache.go +++ b/pkg/paychmgr/accessorcache.go @@ -1,6 +1,9 @@ package paychmgr -import "github.com/filecoin-project/go-address" +import ( + "context" + "github.com/filecoin-project/go-address" +) // accessorByFromTo gets a channel accessor for a given from / to pair. // The channel accessor facilitates locking a channel so that operations @@ -36,10 +39,10 @@ func (pm *Manager) accessorByFromTo(from address.Address, to address.Address) (* // The channel accessor facilitates locking a channel so that operations // must be performed sequentially on a channel (but can be performed at // the same time on different channels). -func (pm *Manager) accessorByAddress(ch address.Address) (*channelAccessor, error) { +func (pm *Manager) accessorByAddress(ctx context.Context, ch address.Address) (*channelAccessor, error) { // Get the channel from / to pm.lk.RLock() - channelInfo, err := pm.store.ByAddress(ch) + channelInfo, err := pm.store.ByAddress(ctx, ch) pm.lk.RUnlock() if err != nil { return nil, err diff --git a/pkg/paychmgr/manager.go b/pkg/paychmgr/manager.go index ee6611e90a..64dcd620f1 100644 --- a/pkg/paychmgr/manager.go +++ b/pkg/paychmgr/manager.go @@ -69,23 +69,23 @@ func NewManager(ctx context.Context, ds datastore.Batching, params *ManagerParam channels: make(map[string]*channelAccessor), pchapi: impl, } - return pm, pm.Start() + return pm, pm.Start(ctx) } // newManager is used by the tests to supply mocks -func newManager(pchStore *Store, pchapi managerAPI) (*Manager, error) { +func newManager(ctx context.Context, pchStore *Store, pchapi managerAPI) (*Manager, error) { pm := &Manager{ store: pchStore, sa: &stateAccessor{sm: pchapi}, channels: make(map[string]*channelAccessor), pchapi: pchapi, } - return pm, pm.Start() + return pm, pm.Start(ctx) } // Start restarts tracking of any messages that were sent to chain. -func (pm *Manager) Start() error { - return pm.restartPending() +func (pm *Manager) Start(ctx context.Context) error { + return pm.restartPending(ctx) } // Stop shuts down any processes used by the manager @@ -102,27 +102,27 @@ func (pm *Manager) GetPaych(ctx context.Context, from, to address.Address, amt b return chanAccessor.getPaych(ctx, amt) } -func (pm *Manager) AvailableFunds(ch address.Address) (*apitypes.ChannelAvailableFunds, error) { - ca, err := pm.accessorByAddress(ch) +func (pm *Manager) AvailableFunds(ctx context.Context, ch address.Address) (*apitypes.ChannelAvailableFunds, error) { + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return nil, err } - ci, err := ca.getChannelInfo(ch) + ci, err := ca.getChannelInfo(ctx, ch) if err != nil { return nil, err } - return ca.availableFunds(ci.ChannelID) + return ca.availableFunds(ctx, ci.ChannelID) } -func (pm *Manager) AvailableFundsByFromTo(from address.Address, to address.Address) (*apitypes.ChannelAvailableFunds, error) { +func (pm *Manager) AvailableFundsByFromTo(ctx context.Context, from address.Address, to address.Address) (*apitypes.ChannelAvailableFunds, error) { ca, err := pm.accessorByFromTo(from, to) if err != nil { return nil, err } - ci, err := ca.outboundActiveByFromTo(from, to) + ci, err := ca.outboundActiveByFromTo(ctx, from, to) if err == ErrChannelNotTracked { // If there is no active channel between from / to we still want to // return an empty ChannelAvailableFunds, so that clients can check @@ -143,7 +143,7 @@ func (pm *Manager) AvailableFundsByFromTo(from address.Address, to address.Addre return nil, err } - return ca.availableFunds(ci.ChannelID) + return ca.availableFunds(ctx, ci.ChannelID) } // GetPaychWaitReady waits until the create channel / add funds message with the @@ -152,7 +152,7 @@ func (pm *Manager) AvailableFundsByFromTo(from address.Address, to address.Addre func (pm *Manager) GetPaychWaitReady(ctx context.Context, mcid cid.Cid) (address.Address, error) { // Find the channel associated with the message CID pm.lk.Lock() - ci, err := pm.store.ByMessageCid(mcid) + ci, err := pm.store.ByMessageCid(ctx, mcid) pm.lk.Unlock() if err != nil { @@ -170,25 +170,25 @@ func (pm *Manager) GetPaychWaitReady(ctx context.Context, mcid cid.Cid) (address return chanAccessor.getPaychWaitReady(ctx, mcid) } -func (pm *Manager) ListChannels() ([]address.Address, error) { +func (pm *Manager) ListChannels(ctx context.Context) ([]address.Address, error) { // Need to take an exclusive lock here so that channel operations can't run // in parallel (see channelLock) pm.lk.Lock() defer pm.lk.Unlock() - return pm.store.ListChannels() + return pm.store.ListChannels(ctx) } -func (pm *Manager) GetChannelInfo(addr address.Address) (*ChannelInfo, error) { - ca, err := pm.accessorByAddress(addr) +func (pm *Manager) GetChannelInfo(ctx context.Context, addr address.Address) (*ChannelInfo, error) { + ca, err := pm.accessorByAddress(ctx, addr) if err != nil { return nil, err } - return ca.getChannelInfo(addr) + return ca.getChannelInfo(ctx, addr) } func (pm *Manager) CreateVoucher(ctx context.Context, ch address.Address, voucher paych.SignedVoucher) (*paychtypes.VoucherCreateResult, error) { - ca, err := pm.accessorByAddress(ch) + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return nil, err } @@ -214,7 +214,7 @@ func (pm *Manager) CheckVoucherSpendable(ctx context.Context, ch address.Address if len(proof) > 0 { return false, errProofNotSupported } - ca, err := pm.accessorByAddress(ch) + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return false, err } @@ -228,7 +228,7 @@ func (pm *Manager) AddVoucherOutbound(ctx context.Context, ch address.Address, s if len(proof) > 0 { return big.NewInt(0), errProofNotSupported } - ca, err := pm.accessorByAddress(ch) + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return big.NewInt(0), err } @@ -274,7 +274,7 @@ func (pm *Manager) trackInboundChannel(ctx context.Context, ch address.Address) defer pm.lk.Unlock() // Check if channel is in store - ci, err := pm.store.ByAddress(ch) + ci, err := pm.store.ByAddress(ctx, ch) if err == nil { // Channel is in store, so it's already being tracked return ci, nil @@ -307,7 +307,7 @@ func (pm *Manager) trackInboundChannel(ctx context.Context, ch address.Address) } // Save channel to store - return pm.store.TrackChannel(stateCi) + return pm.store.TrackChannel(ctx, stateCi) } // TODO: secret vs proof doesn't make sense, there is only one, not two @@ -315,23 +315,23 @@ func (pm *Manager) SubmitVoucher(ctx context.Context, ch address.Address, sv *pa if len(proof) > 0 { return cid.Undef, errProofNotSupported } - ca, err := pm.accessorByAddress(ch) + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return cid.Undef, err } return ca.submitVoucher(ctx, ch, sv, secret) } -func (pm *Manager) AllocateLane(ch address.Address) (uint64, error) { - ca, err := pm.accessorByAddress(ch) +func (pm *Manager) AllocateLane(ctx context.Context, ch address.Address) (uint64, error) { + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return 0, err } - return ca.allocateLane(ch) + return ca.allocateLane(ctx, ch) } func (pm *Manager) ListVouchers(ctx context.Context, ch address.Address) ([]*VoucherInfo, error) { - ca, err := pm.accessorByAddress(ch) + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return nil, err } @@ -339,7 +339,7 @@ func (pm *Manager) ListVouchers(ctx context.Context, ch address.Address) ([]*Vou } func (pm *Manager) Settle(ctx context.Context, addr address.Address) (cid.Cid, error) { - ca, err := pm.accessorByAddress(addr) + ca, err := pm.accessorByAddress(ctx, addr) if err != nil { return cid.Undef, err } @@ -347,7 +347,7 @@ func (pm *Manager) Settle(ctx context.Context, addr address.Address) (cid.Cid, e } func (pm *Manager) Collect(ctx context.Context, addr address.Address) (cid.Cid, error) { - ca, err := pm.accessorByAddress(addr) + ca, err := pm.accessorByAddress(ctx, addr) if err != nil { return cid.Undef, err } diff --git a/pkg/paychmgr/paych.go b/pkg/paychmgr/paych.go index 99a88406d7..74430ca3f8 100644 --- a/pkg/paychmgr/paych.go +++ b/pkg/paychmgr/paych.go @@ -96,18 +96,18 @@ func (ca *channelAccessor) messageBuilder(ctx context.Context, from address.Addr return paych.Message(ver, from), nil } -func (ca *channelAccessor) getChannelInfo(addr address.Address) (*ChannelInfo, error) { +func (ca *channelAccessor) getChannelInfo(ctx context.Context, addr address.Address) (*ChannelInfo, error) { ca.lk.Lock() defer ca.lk.Unlock() - return ca.store.ByAddress(addr) + return ca.store.ByAddress(ctx, addr) } -func (ca *channelAccessor) outboundActiveByFromTo(from, to address.Address) (*ChannelInfo, error) { +func (ca *channelAccessor) outboundActiveByFromTo(ctx context.Context, from, to address.Address) (*ChannelInfo, error) { ca.lk.Lock() defer ca.lk.Unlock() - return ca.store.OutboundActiveByFromTo(from, to) + return ca.store.OutboundActiveByFromTo(ctx, from, to) } // createVoucher creates a voucher with the given specification, setting its @@ -119,7 +119,7 @@ func (ca *channelAccessor) createVoucher(ctx context.Context, ch address.Address defer ca.lk.Unlock() // Find the channel for the voucher - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return nil, xerrors.Errorf("failed to get channel info by address: %w", err) } @@ -229,7 +229,7 @@ func (ca *channelAccessor) checkVoucherValidUnlocked(ctx context.Context, ch add } // Check the voucher against the highest known voucher nonce / value - laneStates, err := ca.laneState(pchState, ch) + laneStates, err := ca.laneState(ctx, pchState, ch) if err != nil { return nil, err } @@ -298,7 +298,7 @@ func (ca *channelAccessor) checkVoucherSpendable(ctx context.Context, ch address return false, err } - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return false, err } @@ -351,7 +351,7 @@ func (ca *channelAccessor) addVoucher(ctx context.Context, ch address.Address, s } func (ca *channelAccessor) addVoucherUnlocked(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, minDelta big.Int) (big.Int, error) { - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return big.Int{}, err } @@ -400,14 +400,14 @@ func (ca *channelAccessor) addVoucherUnlocked(ctx context.Context, ch address.Ad ci.NextLane = sv.Lane + 1 } - return delta, ca.store.putChannelInfo(ci) + return delta, ca.store.putChannelInfo(ctx, ci) } func (ca *channelAccessor) submitVoucher(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte) (cid.Cid, error) { ca.lk.Lock() defer ca.lk.Unlock() - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return cid.Undef, err } @@ -453,18 +453,18 @@ func (ca *channelAccessor) submitVoucher(ctx context.Context, ch address.Address } // Mark the voucher and any lower-nonce vouchers as having been submitted - err = ca.store.MarkVoucherSubmitted(ci, sv) + err = ca.store.MarkVoucherSubmitted(ctx, ci, sv) if err != nil { return cid.Undef, err } return smsg.Cid(), nil } -func (ca *channelAccessor) allocateLane(ch address.Address) (uint64, error) { +func (ca *channelAccessor) allocateLane(ctx context.Context, ch address.Address) (uint64, error) { ca.lk.Lock() defer ca.lk.Unlock() - return ca.store.AllocateLane(ch) + return ca.store.AllocateLane(ctx, ch) } func (ca *channelAccessor) listVouchers(ctx context.Context, ch address.Address) ([]*VoucherInfo, error) { @@ -473,12 +473,12 @@ func (ca *channelAccessor) listVouchers(ctx context.Context, ch address.Address) // TODO: just having a passthrough method like this feels odd. Seems like // there should be some filtering we're doing here - return ca.store.VouchersForPaych(ch) + return ca.store.VouchersForPaych(ctx, ch) } // laneState gets the LaneStates from chain, then applies all vouchers in // the data store over the chain state -func (ca *channelAccessor) laneState(state paych.State, ch address.Address) (map[uint64]paych.LaneState, error) { +func (ca *channelAccessor) laneState(ctx context.Context, state paych.State, ch address.Address) (map[uint64]paych.LaneState, error) { // TODO: we probably want to call UpdateChannelState with all vouchers to be fully correct // (but technically dont't need to) @@ -500,7 +500,7 @@ func (ca *channelAccessor) laneState(state paych.State, ch address.Address) (map } // Apply locally stored vouchers - vouchers, err := ca.store.VouchersForPaych(ch) + vouchers, err := ca.store.VouchersForPaych(ctx, ch) if err != nil && err != ErrChannelNotTracked { return nil, err } @@ -582,7 +582,7 @@ func (ca *channelAccessor) settle(ctx context.Context, ch address.Address) (cid. ca.lk.Lock() defer ca.lk.Unlock() - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return cid.Undef, err } @@ -601,7 +601,7 @@ func (ca *channelAccessor) settle(ctx context.Context, ch address.Address) (cid. } ci.Settling = true - err = ca.store.putChannelInfo(ci) + err = ca.store.putChannelInfo(ctx, ci) if err != nil { log.Errorf("Error marking channel as settled: %s", err) } @@ -612,7 +612,7 @@ func (ca *channelAccessor) collect(ctx context.Context, ch address.Address) (cid ca.lk.Lock() defer ca.lk.Unlock() - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return cid.Undef, err } diff --git a/pkg/paychmgr/paych_test.go b/pkg/paychmgr/paych_test.go index c1c56a2162..fb690ab891 100644 --- a/pkg/paychmgr/paych_test.go +++ b/pkg/paychmgr/paych_test.go @@ -214,7 +214,7 @@ func TestCheckVoucherValid(t *testing.T) { // Create a manager store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // Add channel To address to wallet @@ -360,16 +360,16 @@ func TestAddVoucherNextLane(t *testing.T) { _, err := s.mgr.AddVoucherOutbound(ctx, s.ch, sv, nil, minDelta) require.NoError(t, err) - ci, err := s.mgr.GetChannelInfo(s.ch) + ci, err := s.mgr.GetChannelInfo(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, ci.NextLane, 3) // Allocate a lane (should be lane 3) - lane, err := s.mgr.AllocateLane(s.ch) + lane, err := s.mgr.AllocateLane(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, lane, 3) - ci, err = s.mgr.GetChannelInfo(s.ch) + ci, err = s.mgr.GetChannelInfo(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, ci.NextLane, 4) @@ -379,7 +379,7 @@ func TestAddVoucherNextLane(t *testing.T) { _, err = s.mgr.AddVoucherOutbound(ctx, s.ch, sv, nil, minDelta) require.NoError(t, err) - ci, err = s.mgr.GetChannelInfo(s.ch) + ci, err = s.mgr.GetChannelInfo(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, ci.NextLane, 4) @@ -389,7 +389,7 @@ func TestAddVoucherNextLane(t *testing.T) { _, err = s.mgr.AddVoucherOutbound(ctx, s.ch, sv, nil, minDelta) require.NoError(t, err) - ci, err = s.mgr.GetChannelInfo(s.ch) + ci, err = s.mgr.GetChannelInfo(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, ci.NextLane, 8) } @@ -399,13 +399,15 @@ func TestAllocateLane(t *testing.T) { // Set up a manager with a single payment channel s := testSetupMgrWithChannel(t) + ctx := context.Background() + // First lane should be 0 - lane, err := s.mgr.AllocateLane(s.ch) + lane, err := s.mgr.AllocateLane(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, lane, 0) // Next lane should be 1 - lane, err = s.mgr.AllocateLane(s.ch) + lane, err = s.mgr.AllocateLane(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, lane, 1) } @@ -441,7 +443,7 @@ func TestAllocateLaneWithExistingLaneState(t *testing.T) { mock.setPaychState(ch, act, paychmock.NewMockPayChState(fromAcct, toAcct, abi.ChainEpoch(0), make(map[uint64]paych.LaneState))) - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // Create a voucher on lane 2 @@ -455,7 +457,7 @@ func TestAllocateLaneWithExistingLaneState(t *testing.T) { require.NoError(t, err) // Allocate lane should return the next lane (lane 3) - lane, err := mgr.AllocateLane(ch) + lane, err := mgr.AllocateLane(ctx, ch) require.NoError(t, err) require.EqualValues(t, 3, lane) } @@ -489,7 +491,7 @@ func TestAddVoucherInboundWalletKey(t *testing.T) { // Create a manager store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // Add a voucher @@ -727,6 +729,7 @@ type testScaffold struct { } func testSetupMgrWithChannel(t *testing.T) *testScaffold { + ctx := context.Background() fromKeyPrivate, fromKeyPublic := testGenerateKeyPair(t) ch := tutils.NewIDAddr(t, 100) @@ -750,7 +753,7 @@ func testSetupMgrWithChannel(t *testing.T) *testScaffold { mock.setPaychState(ch, act, paychmock.NewMockPayChState(fromAcct, toAcct, abi.ChainEpoch(0), make(map[uint64]paych.LaneState))) store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // Create the channel in the manager's store @@ -760,7 +763,7 @@ func testSetupMgrWithChannel(t *testing.T) *testScaffold { Target: toAcct, Direction: DirOutbound, } - err = mgr.store.putChannelInfo(ci) + err = mgr.store.putChannelInfo(ctx, ci) require.NoError(t, err) // Add the from signing key to the wallet diff --git a/pkg/paychmgr/paychget_test.go b/pkg/paychmgr/paychget_test.go index 68c8bc4762..51ecdab7c1 100644 --- a/pkg/paychmgr/paychget_test.go +++ b/pkg/paychmgr/paychget_test.go @@ -56,7 +56,7 @@ func TestPaychGetCreateChannelMsg(t *testing.T) { mock := newMockManagerAPI() defer mock.close() - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) amt := big.NewInt(10) @@ -84,7 +84,7 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) { mock := newMockManagerAPI() defer mock.close() - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // Send create message for a channel with value 10 @@ -93,7 +93,7 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) { require.NoError(t, err) // Should have no channels yet (message sent but channel not created) - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 0) @@ -118,7 +118,7 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) { require.NotEqual(t, createMsgCid, addFundsMsgCid) // Should have one channel, whose address is the channel that was created - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) @@ -127,7 +127,7 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) { // channel). // PendingAmount should be amount sent in second GetPaych // (second GetPaych triggered add funds, which has not yet been confirmed) - ci, err := mgr.GetChannelInfo(ch) + ci, err := mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.EqualValues(t, 10, ci.Amount.Int64()) require.EqualValues(t, 5, ci.PendingAmount.Int64()) @@ -141,13 +141,13 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) { require.NoError(t, err) // Should still have one channel - cis, err = mgr.ListChannels() + cis, err = mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) // Channel amount should include last amount sent to GetPaych - ci, err = mgr.GetChannelInfo(ch) + ci, err = mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.EqualValues(t, 15, ci.Amount.Int64()) require.EqualValues(t, 0, ci.PendingAmount.Int64()) @@ -174,7 +174,7 @@ func TestPaychGetCreateChannelWithErrorThenCreateAgain(t *testing.T) { mock := newMockManagerAPI() defer mock.close() - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // Send create message for a channel @@ -210,12 +210,12 @@ func TestPaychGetCreateChannelWithErrorThenCreateAgain(t *testing.T) { require.NoError(t, err) // Should have one channel, whose address is the channel that was created - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) - ci, err := mgr.GetChannelInfo(ch) + ci, err := mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.Equal(t, amt2, ci.Amount) }() @@ -240,7 +240,7 @@ func TestPaychGetRecoverAfterError(t *testing.T) { mock := newMockManagerAPI() defer mock.close() - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // Send create message for a channel @@ -267,12 +267,12 @@ func TestPaychGetRecoverAfterError(t *testing.T) { require.NoError(t, err) // Should have one channel, whose address is the channel that was created - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) - ci, err := mgr.GetChannelInfo(ch) + ci, err := mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.Equal(t, amt2, ci.Amount) require.EqualValues(t, 0, ci.PendingAmount.Int64()) @@ -293,7 +293,7 @@ func TestPaychGetRecoverAfterAddFundsError(t *testing.T) { mock := newMockManagerAPI() defer mock.close() - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // Send create message for a channel @@ -320,12 +320,12 @@ func TestPaychGetRecoverAfterAddFundsError(t *testing.T) { require.Error(t, err) // Should have one channel, whose address is the channel that was created - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) - ci, err := mgr.GetChannelInfo(ch) + ci, err := mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.Equal(t, amt, ci.Amount) require.EqualValues(t, 0, ci.PendingAmount.Int64()) @@ -347,13 +347,13 @@ func TestPaychGetRecoverAfterAddFundsError(t *testing.T) { require.NoError(t, err) // Should have one channel, whose address is the channel that was created - cis, err = mgr.ListChannels() + cis, err = mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) // Amount should include amount for successful add funds msg - ci, err = mgr.GetChannelInfo(ch) + ci, err = mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.Equal(t, amt.Int64()+amt3.Int64(), ci.Amount.Int64()) require.EqualValues(t, 0, ci.PendingAmount.Int64()) @@ -375,7 +375,7 @@ func TestPaychGetRestartAfterCreateChannelMsg(t *testing.T) { mock := newMockManagerAPI() - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // Send create message for a channel with value 10 @@ -390,11 +390,11 @@ func TestPaychGetRestartAfterCreateChannelMsg(t *testing.T) { mock2 := newMockManagerAPI() defer mock2.close() - mgr2, err := newManager(store, mock2) + mgr2, err := newManager(ctx, store, mock2) require.NoError(t, err) // Should have no channels yet (message sent but channel not created) - cis, err := mgr2.ListChannels() + cis, err := mgr2.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 0) @@ -419,7 +419,7 @@ func TestPaychGetRestartAfterCreateChannelMsg(t *testing.T) { require.NotEqual(t, createMsgCid, addFundsMsgCid) // Should have one channel, whose address is the channel that was created - cis, err := mgr2.ListChannels() + cis, err := mgr2.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) @@ -428,7 +428,7 @@ func TestPaychGetRestartAfterCreateChannelMsg(t *testing.T) { // channel). // PendingAmount should be amount sent in second GetPaych // (second GetPaych triggered add funds, which has not yet been confirmed) - ci, err := mgr2.GetChannelInfo(ch) + ci, err := mgr2.GetChannelInfo(ctx, ch) require.NoError(t, err) require.EqualValues(t, 10, ci.Amount.Int64()) require.EqualValues(t, 5, ci.PendingAmount.Int64()) @@ -455,7 +455,7 @@ func TestPaychGetRestartAfterAddFundsMsg(t *testing.T) { mock := newMockManagerAPI() - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // Send create message for a channel @@ -479,7 +479,7 @@ func TestPaychGetRestartAfterAddFundsMsg(t *testing.T) { mock2 := newMockManagerAPI() defer mock2.close() - mgr2, err := newManager(store, mock2) + mgr2, err := newManager(ctx, store, mock2) require.NoError(t, err) // Send success add funds response @@ -492,13 +492,13 @@ func TestPaychGetRestartAfterAddFundsMsg(t *testing.T) { require.NoError(t, err) // Should have one channel, whose address is the channel that was created - cis, err := mgr2.ListChannels() + cis, err := mgr2.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) // Amount should include amount for successful add funds msg - ci, err := mgr2.GetChannelInfo(ch) + ci, err := mgr2.GetChannelInfo(ctx, ch) require.NoError(t, err) require.Equal(t, amt.Int64()+amt2.Int64(), ci.Amount.Int64()) require.EqualValues(t, 0, ci.PendingAmount.Int64()) @@ -519,7 +519,7 @@ func TestPaychGetWait(t *testing.T) { mock := newMockManagerAPI() defer mock.close() - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // 1. Get @@ -577,7 +577,7 @@ func TestPaychGetWaitErr(t *testing.T) { mock := newMockManagerAPI() defer mock.close() - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // 1. Create channel @@ -625,7 +625,7 @@ func TestPaychGetWaitCtx(t *testing.T) { mock := newMockManagerAPI() defer mock.close() - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) amt := big.NewInt(10) @@ -656,7 +656,7 @@ func TestPaychGetMergeAddFunds(t *testing.T) { mock := newMockManagerAPI() defer mock.close() - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // Send create message for a channel with value 10 @@ -755,7 +755,7 @@ func TestPaychGetMergeAddFundsCtxCancelOne(t *testing.T) { mock := newMockManagerAPI() defer mock.close() - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // Send create message for a channel with value 10 @@ -853,7 +853,7 @@ func TestPaychGetMergeAddFundsCtxCancelAll(t *testing.T) { mock := newMockManagerAPI() defer mock.close() - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // Send create message for a channel with value 10 @@ -931,11 +931,11 @@ func TestPaychAvailableFunds(t *testing.T) { mock := newMockManagerAPI() defer mock.close() - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // No channel created yet so available funds should be all zeroes - av, err := mgr.AvailableFundsByFromTo(from, to) + av, err := mgr.AvailableFundsByFromTo(ctx, from, to) require.NoError(t, err) require.Nil(t, av.Channel) require.Nil(t, av.PendingWaitSentinel) @@ -950,7 +950,7 @@ func TestPaychAvailableFunds(t *testing.T) { require.NoError(t, err) // Available funds should reflect create channel message sent - av, err = mgr.AvailableFundsByFromTo(from, to) + av, err = mgr.AvailableFundsByFromTo(ctx, from, to) require.NoError(t, err) require.Nil(t, av.Channel) require.EqualValues(t, 0, av.ConfirmedAmt.Int64()) @@ -979,7 +979,7 @@ func TestPaychAvailableFunds(t *testing.T) { waitForQueueSize(t, mgr, from, to, 1) // Available funds should now include queued funds - av, err = mgr.AvailableFundsByFromTo(from, to) + av, err = mgr.AvailableFundsByFromTo(ctx, from, to) require.NoError(t, err) require.Nil(t, av.Channel) require.NotNil(t, av.PendingWaitSentinel) @@ -1014,7 +1014,7 @@ func TestPaychAvailableFunds(t *testing.T) { // Available funds should now include the channel and also a wait sentinel // for the add funds message - av, err = mgr.AvailableFunds(ch) + av, err = mgr.AvailableFunds(ctx, ch) require.NoError(t, err) require.NotNil(t, av.Channel) require.NotNil(t, av.PendingWaitSentinel) @@ -1036,7 +1036,7 @@ func TestPaychAvailableFunds(t *testing.T) { require.NoError(t, err) // Available funds should no longer have a wait sentinel - av, err = mgr.AvailableFunds(ch) + av, err = mgr.AvailableFunds(ctx, ch) require.NoError(t, err) require.NotNil(t, av.Channel) require.Nil(t, av.PendingWaitSentinel) @@ -1057,7 +1057,7 @@ func TestPaychAvailableFunds(t *testing.T) { _, err = mgr.AddVoucherOutbound(ctx, ch, voucher, nil, big.NewInt(0)) require.NoError(t, err) - av, err = mgr.AvailableFunds(ch) + av, err = mgr.AvailableFunds(ctx, ch) require.NoError(t, err) require.NotNil(t, av.Channel) require.Nil(t, av.PendingWaitSentinel) diff --git a/pkg/paychmgr/paychvoucherfunds_test.go b/pkg/paychmgr/paychvoucherfunds_test.go index 2bbab71cef..1dbcb9478d 100644 --- a/pkg/paychmgr/paychvoucherfunds_test.go +++ b/pkg/paychmgr/paychvoucherfunds_test.go @@ -44,7 +44,7 @@ func TestPaychAddVoucherAfterAddFunds(t *testing.T) { mock.setAccountAddress(toAcct, to) mock.addSigningKey(fromKeyPrivate) - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) // Send create message for a channel with value 10 diff --git a/pkg/paychmgr/settle_test.go b/pkg/paychmgr/settle_test.go index f787a3b566..dfc14f579e 100644 --- a/pkg/paychmgr/settle_test.go +++ b/pkg/paychmgr/settle_test.go @@ -27,7 +27,7 @@ func TestPaychSettle(t *testing.T) { mock := newMockManagerAPI() defer mock.close() - mgr, err := newManager(store, mock) + mgr, err := newManager(ctx, store, mock) require.NoError(t, err) amt := big.NewInt(10) @@ -65,7 +65,7 @@ func TestPaychSettle(t *testing.T) { require.NotEqual(t, ch, ch2) // There should now be two channels - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 2) } diff --git a/pkg/paychmgr/settler/stl.go b/pkg/paychmgr/settler/stl.go index 4a14b7b73f..ce37d4e547 100644 --- a/pkg/paychmgr/settler/stl.go +++ b/pkg/paychmgr/settler/stl.go @@ -31,12 +31,12 @@ func NewSetter(mgr *paychmgr.Manager, chainInfoAPI paychmgr.IChainInfo) Settler return &settler{mgr, chainInfoAPI} } -func (o *settler) PaychList(context.Context) ([]address.Address, error) { - return o.mgr.ListChannels() +func (o *settler) PaychList(ctx context.Context) ([]address.Address, error) { + return o.mgr.ListChannels(ctx) } func (o *settler) PaychStatus(ctx context.Context, pch address.Address) (*paychtypes.Status, error) { - ci, err := o.mgr.GetChannelInfo(pch) + ci, err := o.mgr.GetChannelInfo(ctx, pch) if err != nil { return nil, err } diff --git a/pkg/paychmgr/simple.go b/pkg/paychmgr/simple.go index 8fc12cb077..ef1e9433c1 100644 --- a/pkg/paychmgr/simple.go +++ b/pkg/paychmgr/simple.go @@ -160,7 +160,7 @@ func (m *mergedFundsReq) sum() big.Int { func (ca *channelAccessor) getPaych(ctx context.Context, amt big.Int) (address.Address, cid.Cid, error) { // Add the request to add funds to a queue and wait for the result freq := newFundsReq(ctx, amt) - ca.enqueue(freq) + ca.enqueue(ctx, freq) select { case res := <-freq.promise: return res.channel, res.mcid, res.err @@ -171,16 +171,16 @@ func (ca *channelAccessor) getPaych(ctx context.Context, amt big.Int) (address.A } // Queue up an add funds operation -func (ca *channelAccessor) enqueue(task *fundsReq) { +func (ca *channelAccessor) enqueue(ctx context.Context, task *fundsReq) { ca.lk.Lock() defer ca.lk.Unlock() ca.fundsReqQueue = append(ca.fundsReqQueue, task) - go ca.processQueue("") // nolint: errcheck + go ca.processQueue(ctx, "") // nolint: errcheck } // Run the operations in the queue -func (ca *channelAccessor) processQueue(channelID string) (*apitypes.ChannelAvailableFunds, error) { +func (ca *channelAccessor) processQueue(ctx context.Context, channelID string) (*apitypes.ChannelAvailableFunds, error) { ca.lk.Lock() defer ca.lk.Unlock() @@ -189,7 +189,7 @@ func (ca *channelAccessor) processQueue(channelID string) (*apitypes.ChannelAvai // If there's nothing in the queue, bail out if len(ca.fundsReqQueue) == 0 { - return ca.currentAvailableFunds(channelID, big.NewInt(0)) + return ca.currentAvailableFunds(ctx, channelID, big.NewInt(0)) } // Merge all pending requests into one. @@ -200,7 +200,7 @@ func (ca *channelAccessor) processQueue(channelID string) (*apitypes.ChannelAvai if amt.IsZero() { // Note: The amount can be zero if requests are cancelled as we're // building the mergedFundsReq - return ca.currentAvailableFunds(channelID, amt) + return ca.currentAvailableFunds(ctx, channelID, amt) } res := ca.processTask(merged.ctx, amt) @@ -210,7 +210,7 @@ func (ca *channelAccessor) processQueue(channelID string) (*apitypes.ChannelAvai if res == nil { // Stop processing the fundsReqQueue and wait. When the event occurs it will // call processQueue() again - return ca.currentAvailableFunds(channelID, amt) + return ca.currentAvailableFunds(ctx, channelID, amt) } // Finished processing so clear the queue @@ -219,7 +219,7 @@ func (ca *channelAccessor) processQueue(channelID string) (*apitypes.ChannelAvai // Call the task callback with its results merged.onComplete(res) - return ca.currentAvailableFunds(channelID, big.NewInt(0)) + return ca.currentAvailableFunds(ctx, channelID, big.NewInt(0)) } // filterQueue filters cancelled requests out of the queue @@ -256,12 +256,12 @@ func (ca *channelAccessor) queueSize() int { // msgWaitComplete is called when the message for a previous task is confirmed // or there is an error. -func (ca *channelAccessor) msgWaitComplete(mcid cid.Cid, err error) { +func (ca *channelAccessor) msgWaitComplete(ctx context.Context, mcid cid.Cid, err error) { ca.lk.Lock() defer ca.lk.Unlock() // Save the message result to the store - dserr := ca.store.SaveMessageResult(mcid, err) + dserr := ca.store.SaveMessageResult(ctx, mcid, err) if dserr != nil { log.Errorf("saving message result: %s", dserr) } @@ -272,16 +272,16 @@ func (ca *channelAccessor) msgWaitComplete(mcid cid.Cid, err error) { // The queue may have been waiting for msg completion to proceed, so // process the next queue item if len(ca.fundsReqQueue) > 0 { - go ca.processQueue("") // nolint: errcheck + go ca.processQueue(ctx, "") // nolint: errcheck } } -func (ca *channelAccessor) currentAvailableFunds(channelID string, queuedAmt big.Int) (*apitypes.ChannelAvailableFunds, error) { +func (ca *channelAccessor) currentAvailableFunds(ctx context.Context, channelID string, queuedAmt big.Int) (*apitypes.ChannelAvailableFunds, error) { if len(channelID) == 0 { return nil, nil } - channelInfo, err := ca.store.ByChannelID(channelID) + channelInfo, err := ca.store.ByChannelID(ctx, channelID) if err != nil { return nil, err } @@ -303,7 +303,7 @@ func (ca *channelAccessor) currentAvailableFunds(channelID string, queuedAmt big return nil, err } - laneStates, err := ca.laneState(pchState, ch) + laneStates, err := ca.laneState(ctx, pchState, ch) if err != nil { return nil, err } @@ -338,7 +338,7 @@ func (ca *channelAccessor) processTask(ctx context.Context, amt big.Int) *paychF // Get the payment channel for the from/to addresses. // Note: It's ok if we get ErrChannelNotTracked. It just means we need to // create a channel. - channelInfo, err := ca.store.OutboundActiveByFromTo(ca.from, ca.to) + channelInfo, err := ca.store.OutboundActiveByFromTo(ctx, ca.from, ca.to) if err != nil && err != ErrChannelNotTracked { return &paychFundsRes{err: err} } @@ -393,26 +393,26 @@ func (ca *channelAccessor) createPaych(ctx context.Context, amt big.Int) (cid.Ci } mcid := smsg.Cid() // Create a new channel in the store - ci, err := ca.store.CreateChannel(ca.from, ca.to, mcid, amt) + ci, err := ca.store.CreateChannel(ctx, ca.from, ca.to, mcid, amt) if err != nil { log.Errorf("creating channel: %s", err) return cid.Undef, err } // Wait for the channel to be created on chain - go ca.waitForPaychCreateMsg(ci.ChannelID, mcid) + go ca.waitForPaychCreateMsg(ctx, ci.ChannelID, mcid) return mcid, nil } // waitForPaychCreateMsg waits for mcid to appear on chain and stores the robust address of the // created payment channel -func (ca *channelAccessor) waitForPaychCreateMsg(channelID string, mcid cid.Cid) { - err := ca.waitPaychCreateMsg(channelID, mcid) - ca.msgWaitComplete(mcid, err) +func (ca *channelAccessor) waitForPaychCreateMsg(ctx context.Context, channelID string, mcid cid.Cid) { + err := ca.waitPaychCreateMsg(ctx, channelID, mcid) + ca.msgWaitComplete(ctx, mcid, err) } -func (ca *channelAccessor) waitPaychCreateMsg(channelID string, mcid cid.Cid) error { +func (ca *channelAccessor) waitPaychCreateMsg(ctx context.Context, channelID string, mcid cid.Cid) error { mwait, err := ca.api.StateWaitMsg(ca.chctx, mcid, constants.MessageConfidence) if err != nil { log.Errorf("wait msg: %w", err) @@ -424,7 +424,7 @@ func (ca *channelAccessor) waitPaychCreateMsg(channelID string, mcid cid.Cid) er defer ca.lk.Unlock() // Channel creation failed, so remove the channel from the datastore - dserr := ca.store.RemoveChannel(channelID) + dserr := ca.store.RemoveChannel(ctx, channelID) if dserr != nil { log.Errorf("failed to remove channel %s: %s", channelID, dserr) } @@ -448,7 +448,7 @@ func (ca *channelAccessor) waitPaychCreateMsg(channelID string, mcid cid.Cid) er defer ca.lk.Unlock() // Store robust address of channel - ca.mutateChannelInfo(channelID, func(channelInfo *ChannelInfo) { + ca.mutateChannelInfo(ctx, channelID, func(channelInfo *ChannelInfo) { channelInfo.Channel = &decodedReturn.RobustAddress channelInfo.Amount = channelInfo.PendingAmount channelInfo.PendingAmount = big.NewInt(0) @@ -473,30 +473,30 @@ func (ca *channelAccessor) addFunds(ctx context.Context, channelInfo *ChannelInf } mcid := smsg.Cid() // Store the add funds message CID on the channel - ca.mutateChannelInfo(channelInfo.ChannelID, func(ci *ChannelInfo) { + ca.mutateChannelInfo(ctx, channelInfo.ChannelID, func(ci *ChannelInfo) { ci.PendingAmount = amt ci.AddFundsMsg = &mcid }) // Store a reference from the message CID to the channel, so that we can // look up the channel from the message CID - err = ca.store.SaveNewMessage(channelInfo.ChannelID, mcid) + err = ca.store.SaveNewMessage(ctx, channelInfo.ChannelID, mcid) if err != nil { log.Errorf("saving add funds message CID %s: %s", mcid, err) } - go ca.waitForAddFundsMsg(channelInfo.ChannelID, mcid) + go ca.waitForAddFundsMsg(ctx, channelInfo.ChannelID, mcid) return &mcid, nil } // waitForAddFundsMsg waits for mcid to appear on chain and returns error, if any -func (ca *channelAccessor) waitForAddFundsMsg(channelID string, mcid cid.Cid) { - err := ca.waitAddFundsMsg(channelID, mcid) - ca.msgWaitComplete(mcid, err) +func (ca *channelAccessor) waitForAddFundsMsg(ctx context.Context, channelID string, mcid cid.Cid) { + err := ca.waitAddFundsMsg(ctx, channelID, mcid) + ca.msgWaitComplete(ctx, mcid, err) } -func (ca *channelAccessor) waitAddFundsMsg(channelID string, mcid cid.Cid) error { +func (ca *channelAccessor) waitAddFundsMsg(ctx context.Context, channelID string, mcid cid.Cid) error { mwait, err := ca.api.StateWaitMsg(ca.chctx, mcid, constants.MessageConfidence) if err != nil { log.Error(err) @@ -510,7 +510,7 @@ func (ca *channelAccessor) waitAddFundsMsg(channelID string, mcid cid.Cid) error ca.lk.Lock() defer ca.lk.Unlock() - ca.mutateChannelInfo(channelID, func(channelInfo *ChannelInfo) { + ca.mutateChannelInfo(ctx, channelID, func(channelInfo *ChannelInfo) { channelInfo.PendingAmount = big.NewInt(0) channelInfo.AddFundsMsg = nil }) @@ -522,7 +522,7 @@ func (ca *channelAccessor) waitAddFundsMsg(channelID string, mcid cid.Cid) error defer ca.lk.Unlock() // Store updated amount - ca.mutateChannelInfo(channelID, func(channelInfo *ChannelInfo) { + ca.mutateChannelInfo(ctx, channelID, func(channelInfo *ChannelInfo) { channelInfo.Amount = big.Add(channelInfo.Amount, channelInfo.PendingAmount) channelInfo.PendingAmount = big.NewInt(0) channelInfo.AddFundsMsg = nil @@ -532,8 +532,8 @@ func (ca *channelAccessor) waitAddFundsMsg(channelID string, mcid cid.Cid) error } // Change the state of the channel in the store -func (ca *channelAccessor) mutateChannelInfo(channelID string, mutate func(*ChannelInfo)) { - channelInfo, err := ca.store.ByChannelID(channelID) +func (ca *channelAccessor) mutateChannelInfo(ctx context.Context, channelID string, mutate func(*ChannelInfo)) { + channelInfo, err := ca.store.ByChannelID(ctx, channelID) // If there's an error reading or writing to the store just log an error. // For now we're assuming it's unlikely to happen in practice. @@ -547,7 +547,7 @@ func (ca *channelAccessor) mutateChannelInfo(channelID string, mutate func(*Chan mutate(channelInfo) - err = ca.store.putChannelInfo(channelInfo) + err = ca.store.putChannelInfo(ctx, channelInfo) if err != nil { log.Errorf("Error writing channel info to store: %s", err) } @@ -558,8 +558,8 @@ func (ca *channelAccessor) mutateChannelInfo(channelID string, mutate func(*Chan // messages. // Outstanding messages can occur if a create / add funds message was sent and // then the system was shut down or crashed before the result was received. -func (pm *Manager) restartPending() error { - cis, err := pm.store.WithPendingAddFunds() +func (pm *Manager) restartPending(ctx context.Context) error { + cis, err := pm.store.WithPendingAddFunds(ctx) if err != nil { return err } @@ -573,16 +573,16 @@ func (pm *Manager) restartPending() error { if err != nil { return xerrors.Errorf("error initializing payment channel manager %s -> %s: %s", ci.Control, ci.Target, err) } - go ca.waitForPaychCreateMsg(ci.ChannelID, *ci.CreateMsg) + go ca.waitForPaychCreateMsg(ctx, ci.ChannelID, *ci.CreateMsg) return nil }) } else if ci.AddFundsMsg != nil { group.Go(func() error { - ca, err := pm.accessorByAddress(*ci.Channel) + ca, err := pm.accessorByAddress(ctx, *ci.Channel) if err != nil { return xerrors.Errorf("error initializing payment channel manager %s: %s", ci.Channel, err) } - go ca.waitForAddFundsMsg(ci.ChannelID, *ci.AddFundsMsg) + go ca.waitForAddFundsMsg(ctx, ci.ChannelID, *ci.AddFundsMsg) return nil }) } @@ -596,7 +596,7 @@ func (ca *channelAccessor) getPaychWaitReady(ctx context.Context, mcid cid.Cid) ca.lk.Lock() // First check if the message has completed - msgInfo, err := ca.store.GetMessage(mcid) + msgInfo, err := ca.store.GetMessage(ctx, mcid) if err != nil { ca.lk.Unlock() @@ -615,7 +615,7 @@ func (ca *channelAccessor) getPaychWaitReady(ctx context.Context, mcid cid.Cid) ca.lk.Unlock() // Get the channel address - ci, err := ca.store.ByMessageCid(mcid) + ci, err := ca.store.ByMessageCid(ctx, mcid) if err != nil { return address.Undef, err } @@ -658,7 +658,7 @@ func (ca *channelAccessor) msgPromise(ctx context.Context, mcid cid.Cid) chan on res := onMsgRes{err: err} if res.err == nil { // Get the channel associated with the message cid - ci, err := ca.store.ByMessageCid(mcid) + ci, err := ca.store.ByMessageCid(ctx, mcid) if err != nil { res.err = err } else { @@ -687,6 +687,6 @@ func (ca *channelAccessor) msgPromise(ctx context.Context, mcid cid.Cid) chan on return promise } -func (ca *channelAccessor) availableFunds(channelID string) (*apitypes.ChannelAvailableFunds, error) { - return ca.processQueue(channelID) +func (ca *channelAccessor) availableFunds(ctx context.Context, channelID string) (*apitypes.ChannelAvailableFunds, error) { + return ca.processQueue(ctx, channelID) } diff --git a/pkg/paychmgr/store.go b/pkg/paychmgr/store.go index eec3a4763a..67d941cbf6 100644 --- a/pkg/paychmgr/store.go +++ b/pkg/paychmgr/store.go @@ -2,6 +2,7 @@ package paychmgr import ( "bytes" + "context" "errors" "fmt" @@ -158,26 +159,26 @@ func (ci *ChannelInfo) wasVoucherSubmitted(sv *paych.SignedVoucher) (bool, error // TrackChannel stores a channel, returning an error if the channel was already // being tracked -func (ps *Store) TrackChannel(ci *ChannelInfo) (*ChannelInfo, error) { - _, err := ps.ByAddress(*ci.Channel) +func (ps *Store) TrackChannel(ctx context.Context, ci *ChannelInfo) (*ChannelInfo, error) { + _, err := ps.ByAddress(ctx, *ci.Channel) switch err { default: return nil, err case nil: return nil, fmt.Errorf("already tracking channel: %s", ci.Channel) case ErrChannelNotTracked: - err = ps.putChannelInfo(ci) + err = ps.putChannelInfo(ctx, ci) if err != nil { return nil, err } - return ps.ByAddress(*ci.Channel) + return ps.ByAddress(ctx, *ci.Channel) } } // ListChannels returns the addresses of all channels that have been created -func (ps *Store) ListChannels() ([]address.Address, error) { - cis, err := ps.findChans(func(ci *ChannelInfo) bool { +func (ps *Store) ListChannels(ctx context.Context) ([]address.Address, error) { + cis, err := ps.findChans(ctx, func(ci *ChannelInfo) bool { return ci.Channel != nil }, 0) if err != nil { @@ -194,8 +195,8 @@ func (ps *Store) ListChannels() ([]address.Address, error) { // findChan finds a single channel using the given filter. // If there isn't a channel that matches the filter, returns ErrChannelNotTracked -func (ps *Store) findChan(filter func(ci *ChannelInfo) bool) (*ChannelInfo, error) { - cis, err := ps.findChans(filter, 1) +func (ps *Store) findChan(ctx context.Context, filter func(ci *ChannelInfo) bool) (*ChannelInfo, error) { + cis, err := ps.findChans(ctx, filter, 1) if err != nil { return nil, err } @@ -209,8 +210,8 @@ func (ps *Store) findChan(filter func(ci *ChannelInfo) bool) (*ChannelInfo, erro // findChans loops over all channels, only including those that pass the filter. // max is the maximum number of channels to return. Set to zero to return unlimited channels. -func (ps *Store) findChans(filter func(*ChannelInfo) bool, max int) ([]ChannelInfo, error) { - res, err := ps.ds.Query(dsq.Query{Prefix: dsKeyChannelInfo}) +func (ps *Store) findChans(ctx context.Context, filter func(*ChannelInfo) bool, max int) ([]ChannelInfo, error) { + res, err := ps.ds.Query(ctx, dsq.Query{Prefix: dsKeyChannelInfo}) if err != nil { return nil, err } @@ -252,8 +253,8 @@ func (ps *Store) findChans(filter func(*ChannelInfo) bool, max int) ([]ChannelIn } // AllocateLane allocates a new lane for the given channel -func (ps *Store) AllocateLane(ch address.Address) (uint64, error) { - ci, err := ps.ByAddress(ch) +func (ps *Store) AllocateLane(ctx context.Context, ch address.Address) (uint64, error) { + ci, err := ps.ByAddress(ctx, ch) if err != nil { return 0, err } @@ -261,12 +262,12 @@ func (ps *Store) AllocateLane(ch address.Address) (uint64, error) { out := ci.NextLane ci.NextLane++ - return out, ps.putChannelInfo(ci) + return out, ps.putChannelInfo(ctx, ci) } // VouchersForPaych gets the vouchers for the given channel -func (ps *Store) VouchersForPaych(ch address.Address) ([]*VoucherInfo, error) { - ci, err := ps.ByAddress(ch) +func (ps *Store) VouchersForPaych(ctx context.Context, ch address.Address) ([]*VoucherInfo, error) { + ci, err := ps.ByAddress(ctx, ch) if err != nil { return nil, err } @@ -274,17 +275,17 @@ func (ps *Store) VouchersForPaych(ch address.Address) ([]*VoucherInfo, error) { return ci.Vouchers, nil } -func (ps *Store) MarkVoucherSubmitted(ci *ChannelInfo, sv *paych.SignedVoucher) error { +func (ps *Store) MarkVoucherSubmitted(ctx context.Context, ci *ChannelInfo, sv *paych.SignedVoucher) error { err := ci.markVoucherSubmitted(sv) if err != nil { return err } - return ps.putChannelInfo(ci) + return ps.putChannelInfo(ctx, ci) } // ByAddress gets the channel that matches the given address -func (ps *Store) ByAddress(addr address.Address) (*ChannelInfo, error) { - return ps.findChan(func(ci *ChannelInfo) bool { +func (ps *Store) ByAddress(ctx context.Context, addr address.Address) (*ChannelInfo, error) { + return ps.findChan(ctx, func(ci *ChannelInfo) bool { return ci.Channel != nil && *ci.Channel == addr }) } @@ -308,7 +309,7 @@ func dskeyForMsg(mcid cid.Cid) datastore.Key { } // SaveNewMessage is called when a message is sent -func (ps *Store) SaveNewMessage(channelID string, mcid cid.Cid) error { +func (ps *Store) SaveNewMessage(ctx context.Context, channelID string, mcid cid.Cid) error { k := dskeyForMsg(mcid) b, err := cborutil.Dump(&MsgInfo{ChannelID: channelID, MsgCid: mcid}) @@ -316,12 +317,12 @@ func (ps *Store) SaveNewMessage(channelID string, mcid cid.Cid) error { return err } - return ps.ds.Put(k, b) + return ps.ds.Put(ctx, k, b) } // SaveMessageResult is called when the result of a message is received -func (ps *Store) SaveMessageResult(mcid cid.Cid, msgErr error) error { - minfo, err := ps.GetMessage(mcid) +func (ps *Store) SaveMessageResult(ctx context.Context, mcid cid.Cid, msgErr error) error { + minfo, err := ps.GetMessage(ctx, mcid) if err != nil { return err } @@ -337,17 +338,17 @@ func (ps *Store) SaveMessageResult(mcid cid.Cid, msgErr error) error { return err } - return ps.ds.Put(k, b) + return ps.ds.Put(ctx, k, b) } // ByMessageCid gets the channel associated with a message -func (ps *Store) ByMessageCid(mcid cid.Cid) (*ChannelInfo, error) { - minfo, err := ps.GetMessage(mcid) +func (ps *Store) ByMessageCid(ctx context.Context, mcid cid.Cid) (*ChannelInfo, error) { + minfo, err := ps.GetMessage(ctx, mcid) if err != nil { return nil, err } - ci, err := ps.findChan(func(ci *ChannelInfo) bool { + ci, err := ps.findChan(ctx, func(ci *ChannelInfo) bool { return ci.ChannelID == minfo.ChannelID }) if err != nil { @@ -358,10 +359,10 @@ func (ps *Store) ByMessageCid(mcid cid.Cid) (*ChannelInfo, error) { } // GetMessage gets the message info for a given message CID -func (ps *Store) GetMessage(mcid cid.Cid) (*MsgInfo, error) { +func (ps *Store) GetMessage(ctx context.Context, mcid cid.Cid) (*MsgInfo, error) { k := dskeyForMsg(mcid) - val, err := ps.ds.Get(k) + val, err := ps.ds.Get(ctx, k) if err != nil { return nil, err } @@ -376,8 +377,8 @@ func (ps *Store) GetMessage(mcid cid.Cid) (*MsgInfo, error) { // OutboundActiveByFromTo looks for outbound channels that have not been // settled, with the given from / to addresses -func (ps *Store) OutboundActiveByFromTo(from address.Address, to address.Address) (*ChannelInfo, error) { - return ps.findChan(func(ci *ChannelInfo) bool { +func (ps *Store) OutboundActiveByFromTo(ctx context.Context, from address.Address, to address.Address) (*ChannelInfo, error) { + return ps.findChan(ctx, func(ci *ChannelInfo) bool { if ci.Direction != DirOutbound { return false } @@ -391,8 +392,8 @@ func (ps *Store) OutboundActiveByFromTo(from address.Address, to address.Address // WithPendingAddFunds is used on startup to find channels for which a // create channel or add funds message has been sent, but lotus shut down // before the response was received. -func (ps *Store) WithPendingAddFunds() ([]ChannelInfo, error) { - return ps.findChans(func(ci *ChannelInfo) bool { +func (ps *Store) WithPendingAddFunds(ctx context.Context) ([]ChannelInfo, error) { + return ps.findChans(ctx, func(ci *ChannelInfo) bool { if ci.Direction != DirOutbound { return false } @@ -401,10 +402,10 @@ func (ps *Store) WithPendingAddFunds() ([]ChannelInfo, error) { } // ByChannelID gets channel info by channel ID -func (ps *Store) ByChannelID(channelID string) (*ChannelInfo, error) { +func (ps *Store) ByChannelID(ctx context.Context, channelID string) (*ChannelInfo, error) { var stored ChannelInfo - res, err := ps.ds.Get(dskeyForChannel(channelID)) + res, err := ps.ds.Get(ctx, dskeyForChannel(channelID)) if err != nil { if err == datastore.ErrNotFound { return nil, ErrChannelNotTracked @@ -416,7 +417,7 @@ func (ps *Store) ByChannelID(channelID string) (*ChannelInfo, error) { } // CreateChannel creates an outbound channel for the given from / to -func (ps *Store) CreateChannel(from address.Address, to address.Address, createMsgCid cid.Cid, amt fbig.Int) (*ChannelInfo, error) { +func (ps *Store) CreateChannel(ctx context.Context, from address.Address, to address.Address, createMsgCid cid.Cid, amt fbig.Int) (*ChannelInfo, error) { ci := &ChannelInfo{ Direction: DirOutbound, NextLane: 0, @@ -427,13 +428,13 @@ func (ps *Store) CreateChannel(from address.Address, to address.Address, createM } // Save the new channel - err := ps.putChannelInfo(ci) + err := ps.putChannelInfo(ctx, ci) if err != nil { return nil, err } // Save a reference to the create message - err = ps.SaveNewMessage(ci.ChannelID, createMsgCid) + err = ps.SaveNewMessage(ctx, ci.ChannelID, createMsgCid) if err != nil { return nil, err } @@ -442,8 +443,8 @@ func (ps *Store) CreateChannel(from address.Address, to address.Address, createM } // RemoveChannel removes the channel with the given channel ID -func (ps *Store) RemoveChannel(channelID string) error { - return ps.ds.Delete(dskeyForChannel(channelID)) +func (ps *Store) RemoveChannel(ctx context.Context, channelID string) error { + return ps.ds.Delete(ctx, dskeyForChannel(channelID)) } // The datastore key used to identify the channel info @@ -452,7 +453,7 @@ func dskeyForChannel(channelID string) datastore.Key { } // putChannelInfo stores the channel info in the datastore -func (ps *Store) putChannelInfo(ci *ChannelInfo) error { +func (ps *Store) putChannelInfo(ctx context.Context, ci *ChannelInfo) error { if len(ci.ChannelID) == 0 { ci.ChannelID = uuid.New().String() } @@ -463,7 +464,7 @@ func (ps *Store) putChannelInfo(ci *ChannelInfo) error { return err } - return ps.ds.Put(k, b) + return ps.ds.Put(ctx, k, b) } // TODO: This is a hack to get around not being able to CBOR marshall a nil diff --git a/pkg/paychmgr/store_test.go b/pkg/paychmgr/store_test.go index 7546858e1f..1ab640be34 100644 --- a/pkg/paychmgr/store_test.go +++ b/pkg/paychmgr/store_test.go @@ -1,6 +1,7 @@ package paychmgr import ( + "context" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "testing" @@ -15,7 +16,8 @@ import ( func TestStore(t *testing.T) { tf.UnitTest(t) store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) - addrs, err := store.ListChannels() + ctx := context.Background() + addrs, err := store.ListChannels(ctx) require.NoError(t, err) require.Len(t, addrs, 0) @@ -40,19 +42,19 @@ func TestStore(t *testing.T) { } // Track the channel - _, err = store.TrackChannel(ci) + _, err = store.TrackChannel(ctx, ci) require.NoError(t, err) // Tracking same channel again should error - _, err = store.TrackChannel(ci) + _, err = store.TrackChannel(ctx, ci) require.Error(t, err) // Track another channel - _, err = store.TrackChannel(ci2) + _, err = store.TrackChannel(ctx, ci2) require.NoError(t, err) // List channels should include all channels - addrs, err = store.ListChannels() + addrs, err = store.ListChannels(ctx) require.NoError(t, err) require.Len(t, addrs, 2) t0100, err := address.NewIDAddress(100) @@ -63,25 +65,25 @@ func TestStore(t *testing.T) { require.Contains(t, addrs, t0200) // Request vouchers for channel - vouchers, err := store.VouchersForPaych(*ci.Channel) + vouchers, err := store.VouchersForPaych(ctx, *ci.Channel) require.NoError(t, err) require.Len(t, vouchers, 1) // Requesting voucher for non-existent channel should error - _, err = store.VouchersForPaych(tutils.NewIDAddr(t, 300)) + _, err = store.VouchersForPaych(ctx, tutils.NewIDAddr(t, 300)) require.Equal(t, err, ErrChannelNotTracked) // Allocate lane for channel - lane, err := store.AllocateLane(*ci.Channel) + lane, err := store.AllocateLane(ctx, *ci.Channel) require.NoError(t, err) require.Equal(t, lane, uint64(0)) // Allocate next lane for channel - lane, err = store.AllocateLane(*ci.Channel) + lane, err = store.AllocateLane(ctx, *ci.Channel) require.NoError(t, err) require.Equal(t, lane, uint64(1)) // Allocate next lane for non-existent channel should error - _, err = store.AllocateLane(tutils.NewIDAddr(t, 300)) + _, err = store.AllocateLane(ctx, tutils.NewIDAddr(t, 300)) require.Equal(t, err, ErrChannelNotTracked) } diff --git a/pkg/repo/fskeystore/fskeystore_test.go b/pkg/repo/fskeystore/fskeystore_test.go index 9254e9073e..ff705f57fb 100644 --- a/pkg/repo/fskeystore/fskeystore_test.go +++ b/pkg/repo/fskeystore/fskeystore_test.go @@ -12,7 +12,7 @@ import ( "github.com/stretchr/testify/assert" - ci "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/crypto" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" ) @@ -258,15 +258,17 @@ func (rr rr) Read(b []byte) (int, error) { } func privKeyOrFatal(t *testing.T) []byte { - priv, _, err := ci.GenerateEd25519Key(rr{}) + priv, _, err := crypto.GenerateEd25519Key(rr{}) if err != nil { t.Fatal(err) } - data, err := priv.Bytes() + + kbytes, err := crypto.MarshalPrivateKey(priv) if err != nil { t.Fatal(err) } - return data + + return kbytes } func assertGetKey(ks Keystore, name string, exp []byte) error { diff --git a/pkg/repo/fsrepo_test.go b/pkg/repo/fsrepo_test.go index 4de39f69e6..fa50024001 100644 --- a/pkg/repo/fsrepo_test.go +++ b/pkg/repo/fsrepo_test.go @@ -1,6 +1,7 @@ package repo import ( + "context" "fmt" "io/ioutil" "os" @@ -132,13 +133,13 @@ func TestFSRepoRoundtrip(t *testing.T) { assert.NoError(t, err) assert.Equal(t, cfg, r.Config()) - assert.NoError(t, r.ChainDatastore().Put(ds.NewKey("beep"), []byte("boop"))) + assert.NoError(t, r.ChainDatastore().Put(context.Background(), ds.NewKey("beep"), []byte("boop"))) assert.NoError(t, r.Close()) r2, err := OpenFSRepo(repoPath, 42) assert.NoError(t, err) - val, err := r2.ChainDatastore().Get(ds.NewKey("beep")) + val, err := r2.ChainDatastore().Get(context.Background(), ds.NewKey("beep")) assert.NoError(t, err) assert.Equal(t, []byte("boop"), val) diff --git a/pkg/state/signer.go b/pkg/state/signer.go index 05ecfc0d76..882e65b728 100644 --- a/pkg/state/signer.go +++ b/pkg/state/signer.go @@ -39,7 +39,7 @@ func (s *Signer) SignBytes(ctx context.Context, data []byte, addr address.Addres if err != nil { return nil, err } - return s.wallet.SignBytes(data, signingAddr) + return s.wallet.SignBytes(ctx, data, signingAddr) } // HasAddress returns whether this signer can sign with the given address @@ -48,7 +48,7 @@ func (s *Signer) HasAddress(ctx context.Context, addr address.Address) (bool, er if err != nil { return false, err } - return s.wallet.HasAddress(signingAddr), nil + return s.wallet.HasAddress(ctx, signingAddr), nil } type HeadSignView struct { diff --git a/pkg/statemanger/call.go b/pkg/statemanger/call.go index 3d41b52dba..24851d44d5 100644 --- a/pkg/statemanger/call.go +++ b/pkg/statemanger/call.go @@ -40,7 +40,7 @@ func (s *Stmgr) CallWithGas(ctx context.Context, msg *types.Message, priorMsgs [ // height to have no fork, because we'll run it inside this // function before executing the given message. for ts.Height() > 0 && (s.fork.HasExpensiveFork(ctx, ts.Height()) || s.fork.HasExpensiveFork(ctx, ts.Height()-1)) { - ts, err = s.cs.GetTipSet(ts.Parents()) + ts, err = s.cs.GetTipSet(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("failed to find a non-forking epoch: %v", err) } @@ -64,7 +64,7 @@ func (s *Stmgr) CallWithGas(ctx context.Context, msg *types.Message, priorMsgs [ } return cs.FilCirculating, nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(s.cs, s.fork, ts), + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, s.cs, s.fork, ts), NtwkVersionGetter: s.fork.GetNtwkVersion, Rnd: consensus.NewHeadRandomness(s.rnd, ts.Key()), BaseFee: ts.At(0).ParentBaseFee, @@ -131,14 +131,14 @@ func (s *Stmgr) Call(ctx context.Context, msg *types.Message, ts *types.TipSet) // Search back till we find a height with no fork, or we reach the beginning. for ts.Height() > 0 && s.fork.HasExpensiveFork(ctx, ts.Height()-1) { var err error - ts, err = s.cs.GetTipSet(ts.Parents()) + ts, err = s.cs.GetTipSet(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("failed to find a non-forking epoch: %v", err) } } } - pts, err := s.cs.GetTipSet(ts.Parents()) + pts, err := s.cs.GetTipSet(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load parent tipset: %v", err) } @@ -196,7 +196,7 @@ func (s *Stmgr) Call(ctx context.Context, msg *types.Message, ts *types.TipSet) } return dertail.FilCirculating, nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(s.cs, s.fork, ts), + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, s.cs, s.fork, ts), NtwkVersionGetter: s.fork.GetNtwkVersion, Rnd: consensus.NewHeadRandomness(s.rnd, ts.Key()), BaseFee: ts.At(0).ParentBaseFee, diff --git a/pkg/statemanger/state_manger.go b/pkg/statemanger/state_manger.go index 995ccb1d03..c8e7b2f0bc 100644 --- a/pkg/statemanger/state_manger.go +++ b/pkg/statemanger/state_manger.go @@ -123,7 +123,7 @@ func (s *Stmgr) GetMarketState(ctx context.Context, ts *types.TipSet) (market.St } func (s *Stmgr) ParentStateTsk(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, *tree.State, error) { - ts, err := s.cs.GetTipSet(tsk) + ts, err := s.cs.GetTipSet(ctx, tsk) if err != nil { return nil, nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -134,7 +134,7 @@ func (s *Stmgr) ParentState(ctx context.Context, ts *types.TipSet) (*types.TipSe if ts == nil { ts = s.cs.GetHead() } - parent, err := s.cs.GetTipSet(ts.Parents()) + parent, err := s.cs.GetTipSet(ctx, ts.Parents()) if err != nil { return nil, nil, xerrors.Errorf("find tipset(%s) parent failed:%w", ts.Key().String(), err) @@ -151,7 +151,7 @@ func (s *Stmgr) ParentState(ctx context.Context, ts *types.TipSet) (*types.TipSe } func (s *Stmgr) TipsetStateTsk(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, *tree.State, error) { - ts, err := s.cs.GetTipSet(tsk) + ts, err := s.cs.GetTipSet(ctx, tsk) if err != nil { return nil, nil, xerrors.Errorf("load tipset(%s) failed:%v", tsk.String(), err) @@ -177,7 +177,7 @@ func (s *Stmgr) Rollback(ctx context.Context, pts, cts *types.TipSet) error { s.log.Infof("rollback chain head from(%d) to a valid tipset", pts.Height()) redo: s.stLk.Lock() - if err := s.cs.DeleteTipSetMetadata(pts); err != nil { + if err := s.cs.DeleteTipSetMetadata(ctx, pts); err != nil { s.stLk.Unlock() return err } @@ -191,7 +191,7 @@ redo: return err } else if !root.Equals(cts.At(0).ParentStateRoot) { cts = pts - if pts, err = s.cs.GetTipSet(cts.Parents()); err != nil { + if pts, err = s.cs.GetTipSet(ctx, cts.Parents()); err != nil { return err } goto redo @@ -228,7 +228,7 @@ func (s *Stmgr) RunStateTransition(ctx context.Context, ts *types.TipSet) (root } } - if meta, _ := s.cs.GetTipsetMetadata(ts); meta != nil { + if meta, _ := s.cs.GetTipsetMetadata(ctx, ts); meta != nil { s.stLk.Unlock() return meta.TipSetStateRoot, meta.TipSetReceipts, nil } @@ -264,7 +264,7 @@ func (s *Stmgr) RunStateTransition(ctx context.Context, ts *types.TipSet) (root // ctx context.Context, ts *types.TipSet, addr address.Address func (s *Stmgr) GetActorAtTsk(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.Actor, error) { - ts, err := s.cs.GetTipSet(tsk) + ts, err := s.cs.GetTipSet(ctx, tsk) if err != nil { return nil, err } @@ -319,7 +319,7 @@ func (s *Stmgr) RunStateTransitionV2(ctx context.Context, ts *types.TipSet) (cid return state.stateRoot, state.receipt, nil } - if meta, _ := s.cs.GetTipsetMetadata(ts); meta != nil { + if meta, _ := s.cs.GetTipsetMetadata(ctx, ts); meta != nil { s.stLk.Unlock() return meta.TipSetStateRoot, meta.TipSetReceipts, nil } @@ -356,7 +356,7 @@ func (s *Stmgr) RunStateTransitionV2(ctx context.Context, ts *types.TipSet) (cid } func (s *Stmgr) ParentStateViewTsk(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, *appstate.View, error) { - ts, err := s.cs.GetTipSet(tsk) + ts, err := s.cs.GetTipSet(ctx, tsk) if err != nil { return nil, nil, err } @@ -367,7 +367,7 @@ func (s *Stmgr) ParentStateView(ctx context.Context, ts *types.TipSet) (*types.T if ts == nil { ts = s.cs.GetHead() } - parent, err := s.cs.GetTipSet(ts.Parents()) + parent, err := s.cs.GetTipSet(ctx, ts.Parents()) if err != nil { return nil, nil, err } @@ -380,7 +380,7 @@ func (s *Stmgr) ParentStateView(ctx context.Context, ts *types.TipSet) (*types.T } func (s *Stmgr) StateViewTsk(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, cid.Cid, *appstate.View, error) { - ts, err := s.cs.GetTipSet(tsk) + ts, err := s.cs.GetTipSet(ctx, tsk) if err != nil { return nil, cid.Undef, nil, err } @@ -394,7 +394,7 @@ func (s *Stmgr) StateView(ctx context.Context, ts *types.TipSet) (cid.Cid, *apps return cid.Undef, nil, err } - view, err := s.cs.StateView(ts) + view, err := s.cs.StateView(ctx, ts) if err != nil { return cid.Undef, nil, err } diff --git a/pkg/testhelpers/cid.go b/pkg/testhelpers/cid.go index 135976765e..5af7ca0203 100644 --- a/pkg/testhelpers/cid.go +++ b/pkg/testhelpers/cid.go @@ -4,15 +4,16 @@ import ( "context" "testing" - "github.com/filecoin-project/specs-actors/actors/util/adt" - "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - types "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" cbor "github.com/ipfs/go-ipld-cbor" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/filecoin-project/specs-actors/actors/util/adt" + "github.com/filecoin-project/venus/pkg/constants" + "github.com/filecoin-project/venus/pkg/util/blockstoreutil" + types "github.com/filecoin-project/venus/venus-shared/chain" ) // EmptyMessagesCID is the cid of an empty collection of messages. diff --git a/pkg/testhelpers/net.go b/pkg/testhelpers/net.go index 2ba8415d01..df376d124f 100644 --- a/pkg/testhelpers/net.go +++ b/pkg/testhelpers/net.go @@ -142,7 +142,7 @@ func newFakeStream() fakeStream { return fakeStream{} } func (fs fakeStream) ID() string { return "" } func (fs fakeStream) Protocol() protocol.ID { return fs.pid } // nolint: golint func (fs fakeStream) SetProtocol(id protocol.ID) { fs.pid = id } // nolint: golint -func (fs fakeStream) Stat() inet.Stat { panic("not implemented") } // nolint: golint +func (fs fakeStream) Stat() inet.Stats { panic("not implemented") } // nolint: golint func (fs fakeStream) Conn() inet.Conn { panic("not implemented") } // nolint: golint func (fs fakeStream) Write(_ []byte) (int, error) { return 1, nil } // nolint: golint func (fs fakeStream) Read(_ []byte) (int, error) { return 1, nil } // nolint: golint diff --git a/pkg/util/blockstoreutil/badger.go b/pkg/util/blockstoreutil/badger.go index 974f6534a0..f536e40fa8 100644 --- a/pkg/util/blockstoreutil/badger.go +++ b/pkg/util/blockstoreutil/badger.go @@ -178,7 +178,7 @@ func (b *BadgerBlockstore) ReadonlyDatastore() *TxBlockstore { // View implements blockstore.Viewer, which leverages zero-copy read-only // access to values. -func (b *BadgerBlockstore) View(cid cid.Cid, fn func([]byte) error) error { +func (b *BadgerBlockstore) View(ctx context.Context, cid cid.Cid, fn func([]byte) error) error { if atomic.LoadInt64(&b.state) != stateOpen { return ErrBlockstoreClosed } @@ -197,7 +197,7 @@ func (b *BadgerBlockstore) View(cid cid.Cid, fn func([]byte) error) error { } // Has implements blockstore.Has. -func (b *BadgerBlockstore) Has(cid cid.Cid) (bool, error) { +func (b *BadgerBlockstore) Has(ctx context.Context, cid cid.Cid) (bool, error) { if atomic.LoadInt64(&b.state) != stateOpen { return false, ErrBlockstoreClosed } @@ -225,7 +225,7 @@ func (b *BadgerBlockstore) Has(cid cid.Cid) (bool, error) { } // Get implements blockstore.Get. -func (b *BadgerBlockstore) Get(cid cid.Cid) (blocks.Block, error) { +func (b *BadgerBlockstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) { if !cid.Defined() { return nil, blockstore.ErrNotFound } @@ -268,7 +268,7 @@ func (b *BadgerBlockstore) Get(cid cid.Cid) (blocks.Block, error) { } // GetSize implements blockstore.GetSize. -func (b *BadgerBlockstore) GetSize(cid cid.Cid) (int, error) { +func (b *BadgerBlockstore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { if atomic.LoadInt64(&b.state) != stateOpen { return -1, ErrBlockstoreClosed } @@ -299,7 +299,7 @@ func (b *BadgerBlockstore) GetSize(cid cid.Cid) (int, error) { } // Put implements blockstore.Put. -func (b *BadgerBlockstore) Put(block blocks.Block) error { +func (b *BadgerBlockstore) Put(ctx context.Context, block blocks.Block) error { if atomic.LoadInt64(&b.state) != stateOpen { return ErrBlockstoreClosed } @@ -323,7 +323,7 @@ func (b *BadgerBlockstore) Put(block blocks.Block) error { } // PutMany implements blockstore.PutMany. -func (b *BadgerBlockstore) PutMany(blks []blocks.Block) error { +func (b *BadgerBlockstore) PutMany(ctx context.Context, blks []blocks.Block) error { if atomic.LoadInt64(&b.state) != stateOpen { return ErrBlockstoreClosed } @@ -357,7 +357,7 @@ func (b *BadgerBlockstore) PutMany(blks []blocks.Block) error { } // DeleteBlock implements blockstore.DeleteBlock. -func (b *BadgerBlockstore) DeleteBlock(cid cid.Cid) error { +func (b *BadgerBlockstore) DeleteBlock(ctx context.Context, cid cid.Cid) error { if atomic.LoadInt64(&b.state) != stateOpen { return ErrBlockstoreClosed } diff --git a/pkg/util/blockstoreutil/buf_bstore.go b/pkg/util/blockstoreutil/buf_bstore.go index 58a32304e8..f6e05d2fcf 100644 --- a/pkg/util/blockstoreutil/buf_bstore.go +++ b/pkg/util/blockstoreutil/buf_bstore.go @@ -97,18 +97,18 @@ func (bs *BufferedBS) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { return out, nil } -func (bs *BufferedBS) DeleteBlock(c cid.Cid) error { - if err := bs.read.DeleteBlock(c); err != nil { +func (bs *BufferedBS) DeleteBlock(ctx context.Context, c cid.Cid) error { + if err := bs.read.DeleteBlock(ctx, c); err != nil { return err } - return bs.write.DeleteBlock(c) + return bs.write.DeleteBlock(ctx, c) } -func (bs *BufferedBS) View(c cid.Cid, callback func([]byte) error) error { +func (bs *BufferedBS) View(ctx context.Context, c cid.Cid, callback func([]byte) error) error { if bs.writeviewer == nil || bs.readviewer == nil { // one of the stores isn't Viewer; fall back to pure Get behaviour. - blk, err := bs.Get(c) + blk, err := bs.Get(ctx, c) if err != nil { return err } @@ -116,16 +116,16 @@ func (bs *BufferedBS) View(c cid.Cid, callback func([]byte) error) error { } // both stores are viewable. - if err := bs.writeviewer.View(c, callback); err == ErrNotFound { + if err := bs.writeviewer.View(ctx, c, callback); err == ErrNotFound { // not found in write blockstore; fall through. } else { return err // propagate errors, or nil, i.e. found. } - return bs.readviewer.View(c, callback) + return bs.readviewer.View(ctx, c, callback) } -func (bs *BufferedBS) Get(c cid.Cid) (block.Block, error) { - if out, err := bs.write.Get(c); err != nil { +func (bs *BufferedBS) Get(ctx context.Context, c cid.Cid) (block.Block, error) { + if out, err := bs.write.Get(ctx, c); err != nil { if err != ErrNotFound { return nil, err } @@ -133,20 +133,20 @@ func (bs *BufferedBS) Get(c cid.Cid) (block.Block, error) { return out, nil } - return bs.read.Get(c) + return bs.read.Get(ctx, c) } -func (bs *BufferedBS) GetSize(c cid.Cid) (int, error) { - s, err := bs.read.GetSize(c) +func (bs *BufferedBS) GetSize(ctx context.Context, c cid.Cid) (int, error) { + s, err := bs.read.GetSize(ctx, c) if err == ErrNotFound || s == 0 { - return bs.write.GetSize(c) + return bs.write.GetSize(ctx, c) } return s, err } -func (bs *BufferedBS) Put(blk block.Block) error { - has, err := bs.read.Has(blk.Cid()) // TODO: consider dropping this check +func (bs *BufferedBS) Put(ctx context.Context, blk block.Block) error { + has, err := bs.read.Has(ctx, blk.Cid()) // TODO: consider dropping this check if err != nil { return err } @@ -155,11 +155,11 @@ func (bs *BufferedBS) Put(blk block.Block) error { return nil } - return bs.write.Put(blk) + return bs.write.Put(ctx, blk) } -func (bs *BufferedBS) Has(c cid.Cid) (bool, error) { - has, err := bs.write.Has(c) +func (bs *BufferedBS) Has(ctx context.Context, c cid.Cid) (bool, error) { + has, err := bs.write.Has(ctx, c) if err != nil { return false, err } @@ -167,7 +167,7 @@ func (bs *BufferedBS) Has(c cid.Cid) (bool, error) { return true, nil } - return bs.read.Has(c) + return bs.read.Has(ctx, c) } func (bs *BufferedBS) HashOnRead(hor bool) { @@ -175,8 +175,8 @@ func (bs *BufferedBS) HashOnRead(hor bool) { bs.write.HashOnRead(hor) } -func (bs *BufferedBS) PutMany(blks []block.Block) error { - return bs.write.PutMany(blks) +func (bs *BufferedBS) PutMany(ctx context.Context, blks []block.Block) error { + return bs.write.PutMany(ctx, blks) } func (bs *BufferedBS) Read() Blockstore { diff --git a/pkg/util/blockstoreutil/copy.go b/pkg/util/blockstoreutil/copy.go index d39d554649..cbbc6211c7 100644 --- a/pkg/util/blockstoreutil/copy.go +++ b/pkg/util/blockstoreutil/copy.go @@ -22,7 +22,7 @@ func CopyBlockstore(ctx context.Context, from, to Blockstore) error { // TODO: should probably expose better methods on the blockstore for this operation var blks []blocks.Block for c := range cids { - b, err := from.Get(c) + b, err := from.Get(ctx, c) if err != nil { return err } @@ -30,7 +30,7 @@ func CopyBlockstore(ctx context.Context, from, to Blockstore) error { blks = append(blks, b) } - if err := to.PutMany(blks); err != nil { + if err := to.PutMany(ctx, blks); err != nil { return err } @@ -72,7 +72,7 @@ func CopyParticial(ctx context.Context, from, to Blockstore, root cid.Cid) error go func() { for b := range toFlush { - if err := to.PutMany(b); err != nil { + if err := to.PutMany(ctx, b); err != nil { close(freeBufs) errFlushChan <- xerrors.Errorf("batch put in copy: %v", err) return @@ -101,7 +101,7 @@ func CopyParticial(ctx context.Context, from, to Blockstore, root cid.Cid) error return nil } - if err := copyRec(from, to, root, batchCp); err != nil { + if err := copyRec(ctx, from, to, root, batchCp); err != nil { return xerrors.Errorf("copyRec: %v", err) } @@ -121,13 +121,13 @@ func CopyParticial(ctx context.Context, from, to Blockstore, root cid.Cid) error return nil } -func copyRec(from, to Blockstore, root cid.Cid, cp func(blocks.Block) error) error { +func copyRec(ctx context.Context, from, to Blockstore, root cid.Cid, cp func(blocks.Block) error) error { if root.Prefix().MhType == 0 { // identity cid, skip return nil } - blk, err := from.Get(root) + blk, err := from.Get(ctx, root) if err != nil { return xerrors.Errorf("get %s failed: %v", root, err) } @@ -152,7 +152,7 @@ func copyRec(from, to Blockstore, root cid.Cid, cp func(blocks.Block) error) err } } else { // If we have an object, we already have its children, skip the object. - has, err := to.Has(link) + has, err := to.Has(ctx, link) if err != nil { lerr = xerrors.Errorf("has: %v", err) return @@ -162,7 +162,7 @@ func copyRec(from, to Blockstore, root cid.Cid, cp func(blocks.Block) error) err } } - if err := copyRec(from, to, link, cp); err != nil { + if err := copyRec(ctx, from, to, link, cp); err != nil { lerr = err return } diff --git a/pkg/util/blockstoreutil/memstore.go b/pkg/util/blockstoreutil/memstore.go index fe249b2e56..d53520e645 100644 --- a/pkg/util/blockstoreutil/memstore.go +++ b/pkg/util/blockstoreutil/memstore.go @@ -10,17 +10,17 @@ import ( // MemStore is a terminal blockstore that keeps blocks in memory. type MemStore map[cid.Cid]blocks.Block -func (m MemStore) DeleteBlock(k cid.Cid) error { +func (m MemStore) DeleteBlock(ctx context.Context, k cid.Cid) error { delete(m, k) return nil } -func (m MemStore) Has(k cid.Cid) (bool, error) { +func (m MemStore) Has(ctx context.Context, k cid.Cid) (bool, error) { _, ok := m[k] return ok, nil } -func (m MemStore) View(k cid.Cid, callback func([]byte) error) error { +func (m MemStore) View(ctx context.Context, k cid.Cid, callback func([]byte) error) error { b, ok := m[k] if !ok { return ErrNotFound @@ -28,7 +28,7 @@ func (m MemStore) View(k cid.Cid, callback func([]byte) error) error { return callback(b.RawData()) } -func (m MemStore) Get(k cid.Cid) (blocks.Block, error) { +func (m MemStore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { b, ok := m[k] if !ok { return nil, ErrNotFound @@ -37,7 +37,7 @@ func (m MemStore) Get(k cid.Cid) (blocks.Block, error) { } // GetSize returns the CIDs mapped BlockSize -func (m MemStore) GetSize(k cid.Cid) (int, error) { +func (m MemStore) GetSize(ctx context.Context, k cid.Cid) (int, error) { b, ok := m[k] if !ok { return 0, ErrNotFound @@ -46,7 +46,7 @@ func (m MemStore) GetSize(k cid.Cid) (int, error) { } // Put puts a given block to the underlying datastore -func (m MemStore) Put(b blocks.Block) error { +func (m MemStore) Put(ctx context.Context, b blocks.Block) error { // Convert to a basic block for safety, but try to reuse the existing // block if it's already a basic block. k := b.Cid() @@ -64,9 +64,9 @@ func (m MemStore) Put(b blocks.Block) error { // PutMany puts a slice of blocks at the same time using batching // capabilities of the underlying datastore whenever possible. -func (m MemStore) PutMany(bs []blocks.Block) error { +func (m MemStore) PutMany(ctx context.Context, bs []blocks.Block) error { for _, b := range bs { - _ = m.Put(b) // can't fail + _ = m.Put(ctx, b) // can't fail } return nil } diff --git a/pkg/util/blockstoreutil/syncstore.go b/pkg/util/blockstoreutil/syncstore.go index faf0ae7be5..bdfb216f0f 100644 --- a/pkg/util/blockstoreutil/syncstore.go +++ b/pkg/util/blockstoreutil/syncstore.go @@ -13,42 +13,42 @@ type SyncStore struct { bs MemStore // specifically use a memStore to save indirection overhead. } -func (m *SyncStore) DeleteBlock(k cid.Cid) error { +func (m *SyncStore) DeleteBlock(ctx context.Context, k cid.Cid) error { m.mu.Lock() defer m.mu.Unlock() - return m.bs.DeleteBlock(k) + return m.bs.DeleteBlock(ctx, k) } -func (m *SyncStore) Has(k cid.Cid) (bool, error) { +func (m *SyncStore) Has(ctx context.Context, k cid.Cid) (bool, error) { m.mu.RLock() defer m.mu.RUnlock() - return m.bs.Has(k) + return m.bs.Has(ctx, k) } -func (m *SyncStore) Get(k cid.Cid) (blocks.Block, error) { +func (m *SyncStore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { m.mu.RLock() defer m.mu.RUnlock() - return m.bs.Get(k) + return m.bs.Get(ctx, k) } // GetSize returns the CIDs mapped BlockSize -func (m *SyncStore) GetSize(k cid.Cid) (int, error) { +func (m *SyncStore) GetSize(ctx context.Context, k cid.Cid) (int, error) { m.mu.RLock() defer m.mu.RUnlock() - return m.bs.GetSize(k) + return m.bs.GetSize(ctx, k) } // Put puts a given block to the underlying datastore -func (m *SyncStore) Put(b blocks.Block) error { +func (m *SyncStore) Put(ctx context.Context, b blocks.Block) error { m.mu.Lock() defer m.mu.Unlock() - return m.bs.Put(b) + return m.bs.Put(ctx, b) } // PutMany puts a slice of blocks at the same time using batching // capabilities of the underlying datastore whenever possible. -func (m *SyncStore) PutMany(bs []blocks.Block) error { +func (m *SyncStore) PutMany(ctx context.Context, bs []blocks.Block) error { m.mu.Lock() defer m.mu.Unlock() - return m.bs.PutMany(bs) + return m.bs.PutMany(ctx, bs) } // AllKeysChan returns a channel from which diff --git a/pkg/util/blockstoreutil/view_blockstore.go b/pkg/util/blockstoreutil/view_blockstore.go index c83991c1d1..050f0e39f0 100644 --- a/pkg/util/blockstoreutil/view_blockstore.go +++ b/pkg/util/blockstoreutil/view_blockstore.go @@ -21,11 +21,11 @@ type TxBlockstore struct { keyTransform *keytransform.PrefixTransform } -func (txBlockstore *TxBlockstore) DeleteBlock(cid cid.Cid) error { +func (txBlockstore *TxBlockstore) DeleteBlock(ctx context.Context, cid cid.Cid) error { return xerrors.New("readonly blocksgtore") } -func (txBlockstore *TxBlockstore) Has(cid cid.Cid) (bool, error) { +func (txBlockstore *TxBlockstore) Has(ctx context.Context, cid cid.Cid) (bool, error) { key := txBlockstore.ConvertKey(cid) if txBlockstore.cache != nil { if _, has := txBlockstore.cache.Get(key.String()); has { @@ -44,7 +44,7 @@ func (txBlockstore *TxBlockstore) Has(cid cid.Cid) (bool, error) { } } -func (txBlockstore *TxBlockstore) Get(cid cid.Cid) (blocks.Block, error) { +func (txBlockstore *TxBlockstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) { if !cid.Defined() { return nil, ErrNotFound } @@ -80,7 +80,7 @@ func (txBlockstore *TxBlockstore) Get(cid cid.Cid) (blocks.Block, error) { return blk, nil } -func (txBlockstore *TxBlockstore) GetSize(cid cid.Cid) (int, error) { +func (txBlockstore *TxBlockstore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { key := txBlockstore.ConvertKey(cid) if txBlockstore.cache != nil { if val, has := txBlockstore.cache.Get(key.String()); has { @@ -102,11 +102,11 @@ func (txBlockstore *TxBlockstore) GetSize(cid cid.Cid) (int, error) { return size, err } -func (txBlockstore *TxBlockstore) Put(block blocks.Block) error { +func (txBlockstore *TxBlockstore) Put(ctx context.Context, block blocks.Block) error { return xerrors.New("readonly blocksgtore") } -func (txBlockstore *TxBlockstore) PutMany(blocks []blocks.Block) error { +func (txBlockstore *TxBlockstore) PutMany(ctx context.Context, blocks []blocks.Block) error { return xerrors.New("readonly blocksgtore") } diff --git a/pkg/util/dag/dag_test.go b/pkg/util/dag/dag_test.go index f3c310faf9..e013a0bcc7 100644 --- a/pkg/util/dag/dag_test.go +++ b/pkg/util/dag/dag_test.go @@ -67,7 +67,7 @@ func TestDAGGet(t *testing.T) { ipldnode := chain.NewBuilder(t, address.Undef).Genesis().At(0).ToNode() // put into out dagservice - assert.NoError(t, blkserv.AddBlock(ipldnode)) + assert.NoError(t, blkserv.AddBlock(ctx, ipldnode)) res, err := dag.GetNode(ctx, ipldnode.Cid().String()) assert.NoError(t, err) diff --git a/pkg/vm/vmcontext/gas_charge_ipld.go b/pkg/vm/vmcontext/gas_charge_ipld.go index 881f5c881f..649f87ad3f 100644 --- a/pkg/vm/vmcontext/gas_charge_ipld.go +++ b/pkg/vm/vmcontext/gas_charge_ipld.go @@ -1,6 +1,7 @@ package vmcontext import ( + "context" "github.com/filecoin-project/venus/pkg/vm/gas" blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" @@ -18,10 +19,10 @@ type GasChargeBlockStore struct { } //Get charge gas and than get the value of cid -func (bs *GasChargeBlockStore) Get(c cid.Cid) (blocks.Block, error) { +func (bs *GasChargeBlockStore) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) { bs.gasTank.Charge(bs.pricelist.OnIpldGet(), "storage get %s", c) - blk, err := bs.inner.Get(c) + blk, err := bs.inner.Get(ctx, c) if err != nil { panic(xerrors.WithMessage(err, "failed to get block from blockstore")) } @@ -29,10 +30,10 @@ func (bs *GasChargeBlockStore) Get(c cid.Cid) (blocks.Block, error) { } //Put first charge gas and than save block -func (bs *GasChargeBlockStore) Put(blk blocks.Block) error { +func (bs *GasChargeBlockStore) Put(ctx context.Context, blk blocks.Block) error { bs.gasTank.Charge(bs.pricelist.OnIpldPut(len(blk.RawData())), "%s storage put %d bytes", blk.Cid(), len(blk.RawData())) - if err := bs.inner.Put(blk); err != nil { + if err := bs.inner.Put(ctx, blk); err != nil { panic(xerrors.WithMessage(err, "failed to write data to disk")) } return nil diff --git a/pkg/vm/vmcontext/types.go b/pkg/vm/vmcontext/types.go index 21f3527138..6207519baf 100644 --- a/pkg/vm/vmcontext/types.go +++ b/pkg/vm/vmcontext/types.go @@ -41,18 +41,18 @@ type VmOption struct { //nolint //ChainRandomness define randomness method in filecoin type ILookBack interface { - StateView(ts *types.TipSet) (*state.View, error) + StateView(ctx context.Context, ts *types.TipSet) (*state.View, error) GetLookbackTipSetForRound(ctx context.Context, ts *types.TipSet, round abi.ChainEpoch, version network.Version) (*types.TipSet, cid.Cid, error) } -func LookbackStateGetterForTipset(backer ILookBack, fork fork.IFork, ts *types.TipSet) LookbackStateGetter { +func LookbackStateGetterForTipset(ctx context.Context, backer ILookBack, fork fork.IFork, ts *types.TipSet) LookbackStateGetter { return func(ctx context.Context, round abi.ChainEpoch) (*state.View, error) { ver := fork.GetNtwkVersion(ctx, round) ts, _, err := backer.GetLookbackTipSetForRound(ctx, ts, round, ver) if err != nil { return nil, err } - return backer.StateView(ts) + return backer.StateView(ctx, ts) } } diff --git a/pkg/wallet/backend.go b/pkg/wallet/backend.go index 175ed455e2..971224a176 100644 --- a/pkg/wallet/backend.go +++ b/pkg/wallet/backend.go @@ -1,6 +1,7 @@ package wallet import ( + "context" "github.com/filecoin-project/go-address" "github.com/filecoin-project/venus/pkg/crypto" @@ -10,23 +11,23 @@ import ( // that can contain many addresses. type Backend interface { // Addresses returns a list of all accounts currently stored in this backend. - Addresses() []address.Address + Addresses(ctx context.Context) []address.Address // Contains returns true if this backend stores the passed in address. - HasAddress(address.Address) bool + HasAddress(context.Context, address.Address) bool // Sign cryptographically signs data with the private key associated with an address. - SignBytes([]byte, address.Address) (*crypto.Signature, error) + SignBytes(context.Context, []byte, address.Address) (*crypto.Signature, error) // GetKeyInfo will return the keyinfo associated with address `addr` // iff backend contains the addr. - GetKeyInfo(address.Address) (*crypto.KeyInfo, error) + GetKeyInfo(context.Context, address.Address) (*crypto.KeyInfo, error) - GetKeyInfoPassphrase(address.Address, []byte) (*crypto.KeyInfo, error) + GetKeyInfoPassphrase(context.Context, address.Address, []byte) (*crypto.KeyInfo, error) - LockWallet() error - UnLockWallet([]byte) error - WalletState() int + LockWallet(context.Context) error + UnLockWallet(context.Context, []byte) error + WalletState(context.Context) int } // Importer is a specialization of a wallet backend that can import @@ -35,5 +36,5 @@ type Backend interface { type Importer interface { // ImportKey imports the key described by the given keyinfo // into the backend - ImportKey(*crypto.KeyInfo) error + ImportKey(context.Context, *crypto.KeyInfo) error } diff --git a/pkg/wallet/dsbackend.go b/pkg/wallet/dsbackend.go index 46917a6eaf..a53c64eaf3 100644 --- a/pkg/wallet/dsbackend.go +++ b/pkg/wallet/dsbackend.go @@ -1,6 +1,7 @@ package wallet import ( + "context" "crypto/rand" "reflect" "strings" @@ -52,8 +53,8 @@ type DSBackend struct { var _ Backend = (*DSBackend)(nil) // NewDSBackend constructs a new backend using the passed in datastore. -func NewDSBackend(ds repo.Datastore, passphraseCfg config.PassphraseConfig, password []byte) (*DSBackend, error) { - result, err := ds.Query(dsq.Query{ +func NewDSBackend(ctx context.Context, ds repo.Datastore, passphraseCfg config.PassphraseConfig, password []byte) (*DSBackend, error) { + result, err := ds.Query(ctx, dsq.Query{ KeysOnly: true, }) if err != nil { @@ -82,7 +83,7 @@ func NewDSBackend(ds repo.Datastore, passphraseCfg config.PassphraseConfig, pass } if len(password) != 0 { - if err := backend.SetPassword(password); err != nil { + if err := backend.SetPassword(ctx, password); err != nil { return nil, err } } @@ -91,12 +92,12 @@ func NewDSBackend(ds repo.Datastore, passphraseCfg config.PassphraseConfig, pass } // ImportKey loads the address in `ai` and KeyInfo `ki` into the backend -func (backend *DSBackend) ImportKey(ki *crypto.KeyInfo) error { - return backend.putKeyInfo(ki) +func (backend *DSBackend) ImportKey(ctx context.Context, ki *crypto.KeyInfo) error { + return backend.putKeyInfo(ctx, ki) } // Addresses returns a list of all addresses that are stored in this backend. -func (backend *DSBackend) Addresses() []address.Address { +func (backend *DSBackend) Addresses(ctx context.Context) []address.Address { backend.lk.RLock() defer backend.lk.RUnlock() @@ -109,7 +110,7 @@ func (backend *DSBackend) Addresses() []address.Address { // HasAddress checks if the passed in address is stored in this backend. // Safe for concurrent access. -func (backend *DSBackend) HasAddress(addr address.Address) bool { +func (backend *DSBackend) HasAddress(ctx context.Context, addr address.Address) bool { backend.lk.RLock() defer backend.lk.RUnlock() @@ -125,39 +126,39 @@ func (backend *DSBackend) NewAddress(protocol address.Protocol) (address.Address switch protocol { case address.BLS: - return backend.newBLSAddress() + return backend.newBLSAddress(ctx) case address.SECP256K1: - return backend.newSecpAddress() + return backend.newSecpAddress(ctx) default: return address.Undef, errors.Errorf("Unknown address protocol %d", protocol) } } -func (backend *DSBackend) newSecpAddress() (address.Address, error) { +func (backend *DSBackend) newSecpAddress(ctx context.Context) (address.Address, error) { ki, err := crypto.NewSecpKeyFromSeed(rand.Reader) if err != nil { return address.Undef, err } - if err := backend.putKeyInfo(&ki); err != nil { + if err := backend.putKeyInfo(ctx, &ki); err != nil { return address.Undef, err } return ki.Address() } -func (backend *DSBackend) newBLSAddress() (address.Address, error) { +func (backend *DSBackend) newBLSAddress(ctx context.Context) (address.Address, error) { ki, err := crypto.NewBLSKeyFromSeed(rand.Reader) if err != nil { return address.Undef, err } - if err := backend.putKeyInfo(&ki); err != nil { + if err := backend.putKeyInfo(ctx, &ki); err != nil { return address.Undef, err } return ki.Address() } -func (backend *DSBackend) putKeyInfo(ki *crypto.KeyInfo) error { +func (backend *DSBackend) putKeyInfo(ctx context.Context, ki *crypto.KeyInfo) error { addr, err := ki.Address() if err != nil { return err @@ -188,7 +189,7 @@ func (backend *DSBackend) putKeyInfo(ki *crypto.KeyInfo) error { } // SignBytes cryptographically signs `data` using the private key `priv`. -func (backend *DSBackend) SignBytes(data []byte, addr address.Address) (*crypto.Signature, error) { +func (backend *DSBackend) SignBytes(ctx context.Context, data []byte, addr address.Address) (*crypto.Signature, error) { backend.lk.Lock() ki, found := backend.unLocked[addr] backend.lk.Unlock() @@ -207,15 +208,15 @@ func (backend *DSBackend) SignBytes(data []byte, addr address.Address) (*crypto. // GetKeyInfo will return the private & public keys associated with address `addr` // iff backend contains the addr. -func (backend *DSBackend) GetKeyInfo(addr address.Address) (*crypto.KeyInfo, error) { - if !backend.HasAddress(addr) { +func (backend *DSBackend) GetKeyInfo(ctx context.Context, addr address.Address) (*crypto.KeyInfo, error) { + if !backend.HasAddress(ctx, addr) { return nil, errors.New("backend does not contain address") } var key *Key err := backend.UsePassword(func(password []byte) error { var err error - key, err = backend.getKey(addr, password) + key, err = backend.getKey(ctx, addr, password) return err }) @@ -227,17 +228,17 @@ func (backend *DSBackend) GetKeyInfo(addr address.Address) (*crypto.KeyInfo, err } //GetKeyInfoPassphrase get private private key from wallet, get encrypt byte from db and decrypto it with password -func (backend *DSBackend) GetKeyInfoPassphrase(addr address.Address, password []byte) (*crypto.KeyInfo, error) { +func (backend *DSBackend) GetKeyInfoPassphrase(ctx context.Context, addr address.Address, password []byte) (*crypto.KeyInfo, error) { defer func() { for i := range password { password[i] = 0 } }() - if !backend.HasAddress(addr) { + if !backend.HasAddress(ctx, addr) { return nil, errors.New("backend does not contain address") } - key, err := backend.getKey(addr, password) + key, err := backend.getKey(ctx, addr, password) if err != nil { return nil, err } @@ -245,8 +246,8 @@ func (backend *DSBackend) GetKeyInfoPassphrase(addr address.Address, password [] return key.KeyInfo, nil } -func (backend *DSBackend) getKey(addr address.Address, password []byte) (*Key, error) { - b, err := backend.ds.Get(ds.NewKey(addr.String())) +func (backend *DSBackend) getKey(ctx context.Context, addr address.Address, password []byte) (*Key, error) { + b, err := backend.ds.Get(ctx, ds.NewKey(addr.String())) if err != nil { return nil, errors.Wrap(err, "failed to fetch private key from backend") } @@ -254,16 +255,16 @@ func (backend *DSBackend) getKey(addr address.Address, password []byte) (*Key, e return decryptKey(b, password) } -func (backend *DSBackend) LockWallet() error { +func (backend *DSBackend) LockWallet(ctx context.Context) error { if backend.state == Lock { return xerrors.Errorf("already locked") } - if len(backend.Addresses()) == 0 { + if len(backend.Addresses(ctx)) == 0 { return xerrors.Errorf("no address need lock") } - for _, addr := range backend.Addresses() { + for _, addr := range backend.Addresses(ctx) { backend.lk.Lock() delete(backend.unLocked, addr) backend.lk.Unlock() @@ -275,7 +276,7 @@ func (backend *DSBackend) LockWallet() error { } //UnLockWallet unlock wallet with password, decrypt local key in db and save to protected memory -func (backend *DSBackend) UnLockWallet(password []byte) error { +func (backend *DSBackend) UnLockWallet(ctx context.Context, password []byte) error { defer func() { for i := range password { password[i] = 0 @@ -285,12 +286,12 @@ func (backend *DSBackend) UnLockWallet(password []byte) error { return xerrors.Errorf("already unlocked") } - if len(backend.Addresses()) == 0 { + if len(backend.Addresses(ctx)) == 0 { return xerrors.Errorf("no address need unlock") } - for _, addr := range backend.Addresses() { - ki, err := backend.GetKeyInfoPassphrase(addr, password) + for _, addr := range backend.Addresses(ctx) { + ki, err := backend.GetKeyInfoPassphrase(ctx, addr, password) if err != nil { return err } @@ -305,13 +306,13 @@ func (backend *DSBackend) UnLockWallet(password []byte) error { } //SetPassword set password for wallet , and wallet used this password to encrypt private key -func (backend *DSBackend) SetPassword(password []byte) error { +func (backend *DSBackend) SetPassword(ctx context.Context, password []byte) error { if backend.password != nil { return ErrRepeatPassword } - for _, addr := range backend.Addresses() { - ki, err := backend.GetKeyInfoPassphrase(addr, password) + for _, addr := range backend.Addresses(ctx) { + ki, err := backend.GetKeyInfoPassphrase(ctx, addr, password) if err != nil { return err } @@ -334,7 +335,7 @@ func (backend *DSBackend) HasPassword() bool { } //WalletState return wallet state(lock/unlock) -func (backend *DSBackend) WalletState() int { +func (backend *DSBackend) WalletState(ctx context.Context) int { return backend.state } diff --git a/pkg/wallet/dsbackend_test.go b/pkg/wallet/dsbackend_test.go index 845ee9fc8a..9c3f6f492d 100644 --- a/pkg/wallet/dsbackend_test.go +++ b/pkg/wallet/dsbackend_test.go @@ -1,6 +1,7 @@ package wallet import ( + "context" "crypto/rand" "io" "sync" @@ -27,24 +28,25 @@ func TestDSBackendSimple(t *testing.T) { require.NoError(t, ds.Close()) }() - fs, err := NewDSBackend(ds, config.TestPassphraseConfig(), TestPassword) + ctx := context.Background() + fs, err := NewDSBackend(ctx, ds, config.TestPassphraseConfig(), TestPassword) assert.NoError(t, err) t.Log("empty address list on empty datastore") - assert.Len(t, fs.Addresses(), 0) + assert.Len(t, fs.Addresses(ctx), 0) t.Log("can create new address") - addr, err := fs.NewAddress(address.SECP256K1) + addr, err := fs.NewAddress(ctx, address.SECP256K1) assert.NoError(t, err) t.Log("address is stored") - assert.True(t, fs.HasAddress(addr)) + assert.True(t, fs.HasAddress(ctx, addr)) t.Log("address is stored in repo, and back when loading fresh in a new backend") - fs2, err := NewDSBackend(ds, config.TestPassphraseConfig(), []byte("test-password")) + fs2, err := NewDSBackend(ctx, ds, config.TestPassphraseConfig(), []byte("test-password")) assert.NoError(t, err) - assert.True(t, fs2.HasAddress(addr)) + assert.True(t, fs2.HasAddress(ctx, addr)) } func TestDSBackendKeyPairMatchAddress(t *testing.T) { @@ -55,18 +57,19 @@ func TestDSBackendKeyPairMatchAddress(t *testing.T) { require.NoError(t, ds.Close()) }() - fs, err := NewDSBackend(ds, config.TestPassphraseConfig(), TestPassword) + ctx := context.Background() + fs, err := NewDSBackend(ctx, ds, config.TestPassphraseConfig(), TestPassword) assert.NoError(t, err) t.Log("can create new address") - addr, err := fs.NewAddress(address.SECP256K1) + addr, err := fs.NewAddress(ctx, address.SECP256K1) assert.NoError(t, err) t.Log("address is stored") - assert.True(t, fs.HasAddress(addr)) + assert.True(t, fs.HasAddress(ctx, addr)) t.Log("address references to a secret key") - ki, err := fs.GetKeyInfo(addr) + ki, err := fs.GetKeyInfo(ctx, addr) assert.NoError(t, err) dAddr, err := ki.Address() @@ -84,32 +87,34 @@ func TestDSBackendErrorsForUnknownAddress(t *testing.T) { defer func() { require.NoError(t, ds1.Close()) }() - fs1, err := NewDSBackend(ds1, config.TestPassphraseConfig(), TestPassword) + + ctx := context.Background() + fs1, err := NewDSBackend(ctx, ds1, config.TestPassphraseConfig(), TestPassword) assert.NoError(t, err) ds2 := datastore.NewMapDatastore() defer func() { require.NoError(t, ds2.Close()) }() - fs2, err := NewDSBackend(ds2, config.TestPassphraseConfig(), TestPassword) + fs2, err := NewDSBackend(ctx, ds2, config.TestPassphraseConfig(), TestPassword) assert.NoError(t, err) t.Log("can create new address in fs1") - addr, err := fs1.NewAddress(address.SECP256K1) + addr, err := fs1.NewAddress(ctx, address.SECP256K1) assert.NoError(t, err) t.Log("address is stored fs1") - assert.True(t, fs1.HasAddress(addr)) + assert.True(t, fs1.HasAddress(ctx, addr)) t.Log("address is not stored fs2") - assert.False(t, fs2.HasAddress(addr)) + assert.False(t, fs2.HasAddress(ctx, addr)) t.Log("address references to a secret key in fs1") - _, err = fs1.GetKeyInfo(addr) + _, err = fs1.GetKeyInfo(ctx, addr) assert.NoError(t, err) t.Log("address does not references to a secret key in fs2") - _, err = fs2.GetKeyInfo(addr) + _, err = fs2.GetKeyInfo(ctx, addr) assert.Error(t, err) assert.Contains(t, "backend does not contain address", err.Error()) @@ -123,7 +128,8 @@ func TestDSBackendParallel(t *testing.T) { require.NoError(t, ds.Close()) }() - fs, err := NewDSBackend(ds, config.TestPassphraseConfig(), TestPassword) + ctx := context.Background() + fs, err := NewDSBackend(ctx, ds, config.TestPassphraseConfig(), TestPassword) assert.NoError(t, err) var wg sync.WaitGroup @@ -131,14 +137,14 @@ func TestDSBackendParallel(t *testing.T) { wg.Add(count) for i := 0; i < count; i++ { go func() { - _, err := fs.NewAddress(address.SECP256K1) + _, err := fs.NewAddress(ctx, address.SECP256K1) assert.NoError(t, err) wg.Done() }() } wg.Wait() - assert.Len(t, fs.Addresses(), 10) + assert.Len(t, fs.Addresses(ctx), 10) } func BenchmarkDSBackendSimple(b *testing.B) { @@ -147,12 +153,13 @@ func BenchmarkDSBackendSimple(b *testing.B) { require.NoError(b, ds.Close()) }() - fs, err := NewDSBackend(ds, config.TestPassphraseConfig(), TestPassword) + ctx := context.Background() + fs, err := NewDSBackend(ctx, ds, config.TestPassphraseConfig(), TestPassword) assert.NoError(b, err) corruptData := make([]byte, 32) for i := 0; i < b.N; i++ { - addr, err := fs.NewAddress(address.SECP256K1) + addr, err := fs.NewAddress(ctx, address.SECP256K1) assert.NoError(b, err) data := make([]byte, 32) @@ -160,7 +167,7 @@ func BenchmarkDSBackendSimple(b *testing.B) { assert.NoError(b, err) copy(corruptData, data) - signature, err := fs.SignBytes(data, addr) + signature, err := fs.SignBytes(ctx, data, addr) if err != nil { b.Log(len(signature.Data), signature) } diff --git a/pkg/wallet/passphrase_test.go b/pkg/wallet/passphrase_test.go index e7eda39dd3..48e8dae507 100644 --- a/pkg/wallet/passphrase_test.go +++ b/pkg/wallet/passphrase_test.go @@ -1,6 +1,7 @@ package wallet import ( + "context" "testing" "time" @@ -22,12 +23,12 @@ func TestEncrypKeyAndDecryptKey(t *testing.T) { require.NoError(t, ds.Close()) }() - fs, err := NewDSBackend(ds, config.TestPassphraseConfig(), TestPassword) + fs, err := NewDSBackend(context.Background(), ds, config.TestPassphraseConfig(), TestPassword) assert.NoError(t, err) w := New(fs) - - ki, err := w.NewKeyInfo() + ctx := context.Background() + ki, err := w.NewKeyInfo(ctx) assert.NoError(t, err) addr, err := ki.Address() diff --git a/pkg/wallet/signature_test.go b/pkg/wallet/signature_test.go index 06f2f03783..f76da07d51 100644 --- a/pkg/wallet/signature_test.go +++ b/pkg/wallet/signature_test.go @@ -9,6 +9,7 @@ package wallet import ( + "context" "testing" "github.com/filecoin-project/go-address" @@ -25,10 +26,10 @@ import ( func requireSignerAddr(t *testing.T) (*DSBackend, address.Address) { ds := datastore.NewMapDatastore() - fs, err := NewDSBackend(ds, config.TestPassphraseConfig(), TestPassword) + fs, err := NewDSBackend(context.Background(), ds, config.TestPassphraseConfig(), TestPassword) require.NoError(t, err) - addr, err := fs.NewAddress(address.SECP256K1) + addr, err := fs.NewAddress(context.Background(), address.SECP256K1) require.NoError(t, err) return fs, addr @@ -42,7 +43,7 @@ func TestSignatureOk(t *testing.T) { fs, addr := requireSignerAddr(t) data := []byte("THESE BYTES WILL BE SIGNED") - sig, err := fs.SignBytes(data, addr) + sig, err := fs.SignBytes(context.Background(), data, addr) require.NoError(t, err) assert.NoError(t, crypto.Verify(sig, addr, data)) @@ -65,7 +66,7 @@ func TestDataCorrupted(t *testing.T) { fs, addr := requireSignerAddr(t) data := []byte("THESE BYTES ARE SIGNED") - sig, err := fs.SignBytes(data, addr) + sig, err := fs.SignBytes(context.Background(), data, addr) require.NoError(t, err) corruptData := []byte("THESE BYTEZ ARE SIGNED") @@ -80,10 +81,10 @@ func TestInvalidAddress(t *testing.T) { fs, addr := requireSignerAddr(t) data := []byte("THESE BYTES ARE SIGNED") - sig, err := fs.SignBytes(data, addr) + sig, err := fs.SignBytes(context.Background(), data, addr) require.NoError(t, err) - badAddr, err := fs.NewAddress(address.SECP256K1) + badAddr, err := fs.NewAddress(context.Background(), address.SECP256K1) require.NoError(t, err) assert.Error(t, crypto.Verify(sig, badAddr, data)) @@ -96,7 +97,7 @@ func TestSignatureCorrupted(t *testing.T) { fs, addr := requireSignerAddr(t) data := []byte("THESE BYTES ARE SIGNED") - sig, err := fs.SignBytes(data, addr) + sig, err := fs.SignBytes(context.Background(), data, addr) require.NoError(t, err) sig.Data[0] = sig.Data[0] ^ 0xFF // This operation ensures sig is modified diff --git a/pkg/wallet/wallet.go b/pkg/wallet/wallet.go index 0e0b0eefef..df9479e27f 100644 --- a/pkg/wallet/wallet.go +++ b/pkg/wallet/wallet.go @@ -2,6 +2,7 @@ package wallet import ( "bytes" + "context" "fmt" "reflect" "sort" @@ -23,13 +24,13 @@ var walletLog = logging.Logger("wallet") // WalletIntersection // nolint type WalletIntersection interface { - HasAddress(a address.Address) bool - Addresses() []address.Address - NewAddress(p address.Protocol) (address.Address, error) - Import(ki *crypto.KeyInfo) (address.Address, error) - Export(addr address.Address, password string) (*crypto.KeyInfo, error) - WalletSign(keyAddr address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) - HasPassword() bool + HasAddress(ctx context.Context, a address.Address) bool + Addresses(ctx context.Context) []address.Address + NewAddress(ctx context.Context, p address.Protocol) (address.Address, error) + Import(ctx context.Context, ki *crypto.KeyInfo) (address.Address, error) + Export(ctx context.Context, addr address.Address, password string) (*crypto.KeyInfo, error) + WalletSign(ctx context.Context, keyAddr address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) + HasPassword(ctx context.Context) bool } var _ WalletIntersection = &Wallet{} @@ -58,21 +59,21 @@ func New(backends ...Backend) *Wallet { // HasAddress checks if the given address is stored. // Safe for concurrent access. -func (w *Wallet) HasAddress(a address.Address) bool { - _, err := w.Find(a) +func (w *Wallet) HasAddress(ctx context.Context, a address.Address) bool { + _, err := w.Find(ctx, a) return err == nil } // Find searches through all backends and returns the one storing the passed // in address. // Safe for concurrent access. -func (w *Wallet) Find(addr address.Address) (Backend, error) { +func (w *Wallet) Find(ctx context.Context, addr address.Address) (Backend, error) { w.lk.Lock() defer w.lk.Unlock() for _, backends := range w.backends { for _, backend := range backends { - if backend.HasAddress(addr) { + if backend.HasAddress(ctx, addr) { return backend, nil } } @@ -84,14 +85,14 @@ func (w *Wallet) Find(addr address.Address) (Backend, error) { // Addresses retrieves all stored addresses. // Safe for concurrent access. // Always sorted in the same order. -func (w *Wallet) Addresses() []address.Address { +func (w *Wallet) Addresses(ctx context.Context) []address.Address { w.lk.Lock() defer w.lk.Unlock() var out []address.Address for _, backends := range w.backends { for _, backend := range backends { - out = append(out, backend.Addresses()...) + out = append(out, backend.Addresses(ctx)...) } } sort.Slice(out, func(i, j int) bool { @@ -113,28 +114,28 @@ func (w *Wallet) Backends(typ reflect.Type) []Backend { // SignBytes cryptographically signs `data` using the private key corresponding to // address `addr` -func (w *Wallet) SignBytes(data []byte, addr address.Address) (*crypto.Signature, error) { +func (w *Wallet) SignBytes(ctx context.Context, data []byte, addr address.Address) (*crypto.Signature, error) { // Check that we are storing the address to sign for. - backend, err := w.Find(addr) + backend, err := w.Find(ctx, addr) if err != nil { return nil, errors.Wrapf(err, "could not find address: %s", addr) } - return backend.SignBytes(data, addr) + return backend.SignBytes(ctx, data, addr) } // NewAddress creates a new account address on the default wallet backend. -func (w *Wallet) NewAddress(p address.Protocol) (address.Address, error) { +func (w *Wallet) NewAddress(ctx context.Context, p address.Protocol) (address.Address, error) { backend, err := w.DSBacked() if err != nil { return address.Undef, err } - return backend.NewAddress(p) + return backend.NewAddress(ctx, p) } // GetPubKeyForAddress returns the public key in the keystore associated with // the given address. -func (w *Wallet) GetPubKeyForAddress(addr address.Address) ([]byte, error) { - info, err := w.keyInfoForAddr(addr) +func (w *Wallet) GetPubKeyForAddress(ctx context.Context, addr address.Address) ([]byte, error) { + info, err := w.keyInfoForAddr(ctx, addr) if err != nil { return nil, err } @@ -143,22 +144,22 @@ func (w *Wallet) GetPubKeyForAddress(addr address.Address) ([]byte, error) { } // NewKeyInfo creates a new KeyInfo struct in the wallet backend and returns it -func (w *Wallet) NewKeyInfo() (*crypto.KeyInfo, error) { - newAddr, err := w.NewAddress(address.BLS) +func (w *Wallet) NewKeyInfo(ctx context.Context) (*crypto.KeyInfo, error) { + newAddr, err := w.NewAddress(ctx, address.BLS) if err != nil { return &crypto.KeyInfo{}, err } - return w.keyInfoForAddr(newAddr) + return w.keyInfoForAddr(ctx, newAddr) } -func (w *Wallet) keyInfoForAddr(addr address.Address) (*crypto.KeyInfo, error) { - backend, err := w.Find(addr) +func (w *Wallet) keyInfoForAddr(ctx context.Context, addr address.Address) (*crypto.KeyInfo, error) { + backend, err := w.Find(ctx, addr) if err != nil { return &crypto.KeyInfo{}, err } - info, err := backend.GetKeyInfo(addr) + info, err := backend.GetKeyInfo(ctx, addr) if err != nil { return &crypto.KeyInfo{}, err } @@ -166,7 +167,7 @@ func (w *Wallet) keyInfoForAddr(addr address.Address) (*crypto.KeyInfo, error) { } // Import adds the given keyinfo to the wallet -func (w *Wallet) Import(ki *crypto.KeyInfo) (address.Address, error) { +func (w *Wallet) Import(ctx context.Context, ki *crypto.KeyInfo) (address.Address, error) { dsb := w.Backends(DSBackendType) if len(dsb) != 1 { return address.Undef, fmt.Errorf("expected exactly one datastore wallet backend") @@ -177,7 +178,7 @@ func (w *Wallet) Import(ki *crypto.KeyInfo) (address.Address, error) { return address.Undef, fmt.Errorf("datastore backend wallets should implement importer") } - if err := imp.ImportKey(ki); err != nil { + if err := imp.ImportKey(ctx, ki); err != nil { return address.Undef, err } @@ -189,13 +190,13 @@ func (w *Wallet) Import(ki *crypto.KeyInfo) (address.Address, error) { } // Export returns the KeyInfos for the given wallet addresses -func (w *Wallet) Export(addr address.Address, password string) (*crypto.KeyInfo, error) { - bck, err := w.Find(addr) +func (w *Wallet) Export(ctx context.Context, addr address.Address, password string) (*crypto.KeyInfo, error) { + bck, err := w.Find(ctx, addr) if err != nil { return nil, err } - ki, err := bck.GetKeyInfoPassphrase(addr, []byte(password)) + ki, err := bck.GetKeyInfoPassphrase(ctx, addr, []byte(password)) if err != nil { return nil, err } @@ -204,8 +205,8 @@ func (w *Wallet) Export(addr address.Address, password string) (*crypto.KeyInfo, } //WalletSign used to sign message with private key -func (w *Wallet) WalletSign(addr address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) { - ki, err := w.Find(addr) +func (w *Wallet) WalletSign(ctx context.Context, addr address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) { + ki, err := w.Find(ctx, addr) if err != nil { return nil, err } @@ -213,7 +214,7 @@ func (w *Wallet) WalletSign(addr address.Address, msg []byte, meta types.MsgMeta return nil, errors.Errorf("signing using key '%s': %v", addr.String(), ErrKeyInfoNotFound) } - return ki.SignBytes(msg, addr) + return ki.SignBytes(ctx, msg, addr) } //DSBacked return the first wallet backend @@ -228,36 +229,36 @@ func (w *Wallet) DSBacked() (*DSBackend, error) { } //LockWallet lock lock wallet -func (w *Wallet) LockWallet() error { +func (w *Wallet) LockWallet(ctx context.Context) error { backend, err := w.DSBacked() if err != nil { return err } - return backend.LockWallet() + return backend.LockWallet(ctx) } //UnLockWallet unlock local wallet with password -func (w *Wallet) UnLockWallet(password []byte) error { +func (w *Wallet) UnLockWallet(ctx context.Context, password []byte) error { backend, err := w.DSBacked() if err != nil { return err } - return backend.UnLockWallet(password) + return backend.UnLockWallet(ctx, password) } //SetPassword -func (w *Wallet) SetPassword(password []byte) error { +func (w *Wallet) SetPassword(ctx context.Context, password []byte) error { backend, err := w.DSBacked() if err != nil { return err } - return backend.SetPassword(password) + return backend.SetPassword(ctx, password) } //HasPassword return whether the password has been set in the wallet -func (w *Wallet) HasPassword() bool { +func (w *Wallet) HasPassword(ctx context.Context) bool { backend, err := w.DSBacked() if err != nil { walletLog.Errorf("get DSBacked failed: %v", err) @@ -267,11 +268,11 @@ func (w *Wallet) HasPassword() bool { } //WalletState return wallet state(lock/unlock) -func (w *Wallet) WalletState() int { +func (w *Wallet) WalletState(ctx context.Context) int { backend, err := w.DSBacked() if err != nil { walletLog.Errorf("get DSBacked failed: %v", err) return undetermined } - return backend.WalletState() + return backend.WalletState(ctx) } diff --git a/pkg/wallet/wallet_test.go b/pkg/wallet/wallet_test.go index 03f0c27bac..4031635bd1 100644 --- a/pkg/wallet/wallet_test.go +++ b/pkg/wallet/wallet_test.go @@ -2,6 +2,7 @@ package wallet import ( "bytes" + "context" "testing" "github.com/filecoin-project/venus/pkg/testhelpers" @@ -20,7 +21,7 @@ import ( func newWalletAndDSBackend(t *testing.T) (*Wallet, *DSBackend) { t.Log("create a backend") ds := datastore.NewMapDatastore() - fs, err := NewDSBackend(ds, config.TestPassphraseConfig(), TestPassword) + fs, err := NewDSBackend(context.Background(), ds, config.TestPassphraseConfig(), TestPassword) assert.NoError(t, err) t.Log("create a wallet with a single backend") @@ -35,39 +36,40 @@ func newWalletAndDSBackend(t *testing.T) (*Wallet, *DSBackend) { func TestWalletSimple(t *testing.T) { tf.UnitTest(t) + ctx := context.Background() w, fs := newWalletAndDSBackend(t) t.Log("create a new address in the backend") - addr, err := fs.NewAddress(address.SECP256K1) + addr, err := fs.NewAddress(context.Background(), address.SECP256K1) assert.NoError(t, err) t.Log("test HasAddress") - assert.True(t, w.HasAddress(addr)) + assert.True(t, w.HasAddress(ctx, addr)) t.Log("find backend") - backend, err := w.Find(addr) + backend, err := w.Find(ctx, addr) assert.NoError(t, err) assert.Equal(t, fs, backend) t.Log("find unknown address") randomAddr := testhelpers.NewForTestGetter()() - assert.False(t, w.HasAddress(randomAddr)) + assert.False(t, w.HasAddress(ctx, randomAddr)) t.Log("list all addresses") - list := w.Addresses() + list := w.Addresses(ctx) assert.Len(t, list, 1) assert.Equal(t, list[0], addr) t.Log("addresses are sorted") - addr2, err := fs.NewAddress(address.SECP256K1) + addr2, err := fs.NewAddress(context.Background(), address.SECP256K1) assert.NoError(t, err) if bytes.Compare(addr2.Bytes(), addr.Bytes()) < 0 { addr, addr2 = addr2, addr } for i := 0; i < 16; i++ { - list := w.Addresses() + list := w.Addresses(ctx) assert.Len(t, list, 2) assert.Equal(t, list[0], addr) assert.Equal(t, list[1], addr2) @@ -79,11 +81,12 @@ func TestWalletBLSKeys(t *testing.T) { w, wb := newWalletAndDSBackend(t) - addr, err := w.NewAddress(address.BLS) + ctx := context.Background() + addr, err := w.NewAddress(ctx, address.BLS) require.NoError(t, err) data := []byte("data to be signed") - sig, err := w.SignBytes(data, addr) + sig, err := w.SignBytes(ctx, data, addr) require.NoError(t, err) t.Run("address is BLS protocol", func(t *testing.T) { @@ -91,7 +94,7 @@ func TestWalletBLSKeys(t *testing.T) { }) t.Run("key uses BLS cryptography", func(t *testing.T) { - ki, err := wb.GetKeyInfo(addr) + ki, err := wb.GetKeyInfo(context.Background(), addr) require.NoError(t, err) assert.Equal(t, crypto.SigTypeBLS, ki.SigType) }) @@ -119,24 +122,25 @@ func TestWalletBLSKeys(t *testing.T) { func TestSimpleSignAndVerify(t *testing.T) { tf.UnitTest(t) + ctx := context.Background() w, fs := newWalletAndDSBackend(t) t.Log("create a new address in the backend") - addr, err := fs.NewAddress(address.SECP256K1) + addr, err := fs.NewAddress(context.Background(), address.SECP256K1) assert.NoError(t, err) t.Log("test HasAddress") - assert.True(t, w.HasAddress(addr)) + assert.True(t, w.HasAddress(ctx, addr)) t.Log("find backend") - backend, err := w.Find(addr) + backend, err := w.Find(ctx, addr) assert.NoError(t, err) assert.Equal(t, fs, backend) // data to sign dataA := []byte("THIS IS A SIGNED SLICE OF DATA") t.Log("sign content") - sig, err := w.SignBytes(dataA, addr) + sig, err := w.SignBytes(ctx, dataA, addr) assert.NoError(t, err) t.Log("verify signed content") @@ -153,32 +157,33 @@ func TestSimpleSignAndVerify(t *testing.T) { func TestSignErrorCases(t *testing.T) { tf.UnitTest(t) + ctx := context.Background() w1, fs1 := newWalletAndDSBackend(t) _, fs2 := newWalletAndDSBackend(t) t.Log("create a new address each backend") - addr1, err := fs1.NewAddress(address.SECP256K1) + addr1, err := fs1.NewAddress(context.Background(), address.SECP256K1) assert.NoError(t, err) - addr2, err := fs2.NewAddress(address.SECP256K1) + addr2, err := fs2.NewAddress(context.Background(), address.SECP256K1) assert.NoError(t, err) t.Log("test HasAddress") - assert.True(t, w1.HasAddress(addr1)) - assert.False(t, w1.HasAddress(addr2)) + assert.True(t, w1.HasAddress(ctx, addr1)) + assert.False(t, w1.HasAddress(ctx, addr2)) t.Log("find backends") - backend1, err := w1.Find(addr1) + backend1, err := w1.Find(ctx, addr1) assert.NoError(t, err) assert.Equal(t, fs1, backend1) t.Log("find backend fails for unknown address") - _, err = w1.Find(addr2) + _, err = w1.Find(ctx, addr2) assert.Error(t, err) // data to sign dataA := []byte("Set tab width to '1' and make everyone happy") t.Log("sign content") - _, err = w1.SignBytes(dataA, addr2) + _, err = w1.SignBytes(ctx, dataA, addr2) assert.Error(t, err) assert.Contains(t, err.Error(), "could not find address:") } diff --git a/tools/conformance/driver.go b/tools/conformance/driver.go index ce644a7bd6..10491946ce 100644 --- a/tools/conformance/driver.go +++ b/tools/conformance/driver.go @@ -118,7 +118,7 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, chainDs ds.Batching, pr CircSupplyCalculator: func(context.Context, abi.ChainEpoch, tree.Tree) (abi.TokenAmount, error) { return big.Zero(), nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(chainStore, chainFork, nil), + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(context.TODO(), chainStore, chainFork, nil), NtwkVersionGetter: chainFork.GetNtwkVersion, Rnd: NewFixedRand(), BaseFee: big.NewFromGo(&tipset.BaseFee), @@ -250,17 +250,6 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP //chainstore chainStore := chain.NewStore(chainDs, bs, cid.Undef, chain.NewMockCirculatingSupplyCalculator()) //load genesis from car - //drand - /* genBlk, err := chainStore.GetGenesisBlock(context.TODO()) - if err != nil { - return nil, cid.Undef, err - } - - drand, err := beacon.DefaultDrandIfaceFromConfig(genBlk.Timestamp) - if err != nil { - return nil, cid.Undef, err - }*/ - //chain fork chainFork, err := fork.NewChainFork(context.TODO(), chainStore, ipldStore, bs, &mainNetParams.Network) faultChecker := consensusfault.NewFaultChecker(chainStore, chainFork) @@ -273,7 +262,7 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP CircSupplyCalculator: func(ctx context.Context, epoch abi.ChainEpoch, tree tree.Tree) (abi.TokenAmount, error) { return params.CircSupply, nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(chainStore, chainFork, nil), + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(context.TODO(), chainStore, chainFork, nil), NtwkVersionGetter: chainFork.GetNtwkVersion, Rnd: params.Rand, BaseFee: params.BaseFee, diff --git a/tools/conformance/runner.go b/tools/conformance/runner.go index 8655b25aeb..b8b824ad3f 100644 --- a/tools/conformance/runner.go +++ b/tools/conformance/runner.go @@ -224,7 +224,7 @@ func writeStateToTempCAR(bs blockstoreutil.Blockstore, roots ...cid.Cid) (string continue } // ignore things we don't have, the state tree is incomplete. - if has, err := bs.Has(link.Cid); err != nil { + if has, err := bs.Has(context.TODO(), link.Cid); err != nil { return nil, err } else if has { out = append(out, link) @@ -260,7 +260,7 @@ func LoadVectorCAR(vectorCAR schema.Base64EncodedBytes) (blockstoreutil.Blocksto defer r.Close() // nolint // Load the CAR embedded in the test vector into the blockstore. - _, err = car.LoadCar(bs, r) + _, err = car.LoadCar(context.TODO(), bs, r) if err != nil { return nil, fmt.Errorf("failed to load state tree car from test vector: %s", err) } diff --git a/tools/gengen/util/generator.go b/tools/gengen/util/generator.go index df7fd63574..ee1bf5128b 100644 --- a/tools/gengen/util/generator.go +++ b/tools/gengen/util/generator.go @@ -87,7 +87,7 @@ func NewGenesisGenerator(bs blockstore.Blockstore) *GenesisGenerator { NtwkVersionGetter: func(ctx context.Context, epoch abi.ChainEpoch) network.Version { return network.Version6 }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(chainStore, chainFork, nil), + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(context.TODO(), chainStore, chainFork, nil), Rnd: chainRand, BaseFee: abi.NewTokenAmount(InitialBaseFee), Epoch: 0, diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index d5ef15c0ac..835c3e7f7c 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -5,18 +5,19 @@ go 1.16 require ( github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 - github.com/filecoin-project/go-data-transfer v1.11.4 - github.com/filecoin-project/go-fil-markets v1.13.4 + github.com/filecoin-project/go-data-transfer v1.12.1 + github.com/filecoin-project/go-ds-versioning v0.1.0 // indirect + github.com/filecoin-project/go-fil-markets v1.14.1 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-state-types v0.1.1 - github.com/filecoin-project/lotus v1.13.2-0.20211213233817-8a4246227153 + github.com/filecoin-project/lotus v1.13.2-0.20220103185743-9b11c4b31932 github.com/filecoin-project/venus v0.0.0-00010101000000-000000000000 github.com/ipfs/go-cid v0.1.0 - github.com/ipfs/go-graphsync v0.10.6 + github.com/ipfs/go-graphsync v0.11.5 github.com/ipfs/go-ipfs-http-client v0.1.0 // indirect github.com/ipld/go-ipld-selector-text-lite v0.0.1 - github.com/libp2p/go-libp2p-core v0.9.0 - github.com/libp2p/go-libp2p-pubsub v0.5.6 + github.com/libp2p/go-libp2p-core v0.13.0 + github.com/libp2p/go-libp2p-pubsub v0.6.0 github.com/multiformats/go-multiaddr v0.4.1 github.com/urfave/cli/v2 v2.3.0 github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index 7f550ce677..cfe5b03408 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -182,7 +182,6 @@ github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRt github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20200211180108-c7c1fbc02894/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -205,11 +204,6 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/pebble v0.0.0-20200916222308-4e219a90ba5b/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= -github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= -github.com/cockroachdb/redact v0.0.0-20200622112456-cd282804bbd3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327 h1:7grrpcfCtbZLsjtB0DgMuzs1umsJmpzaHMZ6cO6iAWw= @@ -270,14 +264,15 @@ github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlN github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= -github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= -github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= +github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= +github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/badger/v3 v3.2011.1/go.mod h1:0rLLrQpKVQAL0or/lBLMQznhr6dWWX7h5AKnmnqx268= github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.4-0.20210122082011-bb5d392ed82d h1:eQYOG6A4td1tht0NdJB9Ls6DsXRGb2Ft6X9REU/MbbE= github.com/dgraph-io/ristretto v0.0.4-0.20210122082011-bb5d392ed82d/go.mod h1:tv2ec8nA7vRpSYX7/MbP52ihrUMXIHit54CQMq8npXQ= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= @@ -290,9 +285,11 @@ github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= github.com/drand/drand v1.2.1/go.mod h1:j0P7RGmVaY7E/OuO2yQOcQj7OgeZCuhgu2gdv0JAm+g= +github.com/drand/drand v1.3.0/go.mod h1:D6kAVlxufq1gi71YCGfzN455JrXF4Q272ZJEG975fzo= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw= github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U= +github.com/drand/kyber v1.1.7/go.mod h1:UkHLsI4W6+jT5PvNxmc0cvQAgppjTUpX+XCsN9TXmRo= github.com/drand/kyber-bls12381 v0.2.0/go.mod h1:zQip/bHdeEB6HFZSU3v+d3cQE0GaBVQw9aR2E7AdoeI= github.com/drand/kyber-bls12381 v0.2.1/go.mod h1:JwWn4nHO9Mp4F5qCie5sVIPQZ0X6cw8XAeMRvc/GXBE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -307,6 +304,7 @@ github.com/elastic/go-sysinfo v1.7.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6 github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elastic/gosigar v0.14.1 h1:T0aQ7n/n2ZA9W7DmAnj60v+qzqKERdBgJBO1CG2W6rc= github.com/elastic/gosigar v0.14.1/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= @@ -330,25 +328,21 @@ github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGE github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= -github.com/filecoin-project/dagstore v0.4.3 h1:yeFl6+2BRY1gOVp/hrZuFa24s7LY0Qqkqx/Gh8lidZs= -github.com/filecoin-project/dagstore v0.4.3/go.mod h1:dm/91AO5UaDd3bABFjg/5fmRH99vvpS7g1mykqvz6KQ= -github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200716204036-cddc56607e1d/go.mod h1:XE4rWG1P7zWPaC11Pkn1CVR20stqN52MnMkIrF4q6ZU= +github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= +github.com/filecoin-project/dagstore v0.4.4 h1:luolWahhzp3ulRsapGKE7raoLE3n2cFkQUJjPyqUmF4= +github.com/filecoin-project/dagstore v0.4.4/go.mod h1:7BlOvaTJrFJ1Qemt5jHlLJ4VhDIuSIzGS0IwO/0AXPA= github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f h1:vg/6KEAOBjICMaWj+xofJCp09HYRfpO3ZbJsnJo22pA= github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f/go.mod h1:+If3s2VxyjZn+KGGZIoRXBDSFQ9xL404JBJGf4WhEj0= -github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= -github.com/filecoin-project/go-amt-ipld/v2 v2.0.1-0.20200424220931-6263827e49f2/go.mod h1:boRtQhzmxNocrMxOXo1NYn4oUc1NGvR8tEa79wApNXg= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349 h1:pIuR0dnMD0i+as8wNnjjHyQrnhP5O5bmba/lmgQeRgU= github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349/go.mod h1:vgmwKBkx+ca5OIeEvstiQgzAZnb7R6QaqE1oEDSqa6g= github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= -github.com/filecoin-project/go-bitfield v0.0.1/go.mod h1:Ry9/iUlWSyjPUzlAvdnfy4Gtvrq4kWmWDztCU1yEgJY= github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= @@ -357,17 +351,15 @@ github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.m github.com/filecoin-project/go-cbor-util v0.0.0-20201016124514-d0bbec7bfcc4/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= -github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-commp-utils v0.1.3 h1:rTxbkNXZU7FLgdkBk8RsQIEOuPONHykEoX3xGk41Fkw= github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9ANQrY3fDFoXdqyX04J+dWpK30= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.10.1/go.mod h1:CSDMCrPK2lVGodNB1wPEogjFvM9nVGyiL1GNbBRTSdw= -github.com/filecoin-project/go-data-transfer v1.11.4 h1:jKvlx0/C8HSyLRn/G1P9TjtfBtFU9jbCvCVFmWbyYVQ= -github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= +github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= +github.com/filecoin-project/go-data-transfer v1.12.1 h1:gAznAZKySVs2FS6T/vDq7R3f0DewLnxeROe0oOE6bZU= +github.com/filecoin-project/go-data-transfer v1.12.1/go.mod h1:j3HL645YiQFxcM+q7uPlGApILSqeweDABNgZQP7pDYU= +github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -376,9 +368,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.13.4 h1:NAu+ACelR2mYsj+yJ4iLu8FGqWK50OnU5VF8axkLsSc= -github.com/filecoin-project/go-fil-markets v1.13.4/go.mod h1:aANjXD2XMHWnT2zWpyGWLsWLC24C4mHm0gRm85OpPWE= +github.com/filecoin-project/go-fil-markets v1.14.1 h1:Bx+TSbkAN8K97Hpjgu+MpeRFbXIKH/fNpNp1ZGAEH3I= +github.com/filecoin-project/go-fil-markets v1.14.1/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -387,7 +378,6 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGy github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543/go.mod h1:mjrHv1cDGJWDlGmC0eDc1E5VJr8DmL9XMUcaFwiuKg8= -github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= @@ -406,21 +396,18 @@ github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/g github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-statestore v0.1.1 h1:ufMFq00VqnT2CAuDpcGnwLnCX1I/c3OROw/kXVNSTZk= -github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= -github.com/filecoin-project/lotus v1.13.2-0.20211213233817-8a4246227153 h1:YDplDR4tT8a7cGAvUg5uhf9WschEMyt9aErAP5MjxBY= -github.com/filecoin-project/lotus v1.13.2-0.20211213233817-8a4246227153/go.mod h1:/gEkKgo2ms5Eycdoij8E5ye2J7ZFgdkJVgJ6Q+HljFA= -github.com/filecoin-project/specs-actors v0.6.1/go.mod h1:dRdy3cURykh2R8O/DKqy8olScl70rmIS7GrB4hB1IDY= +github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= +github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= +github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= +github.com/filecoin-project/lotus v1.13.2-0.20220103185743-9b11c4b31932 h1:TR3RU+f3pAILoV9p3qjsZqDiwKLgB3ED+MkYznJot1Y= +github.com/filecoin-project/lotus v1.13.2-0.20220103185743-9b11c4b31932/go.mod h1:3rpFD76CLqowX/0mmreiT3CohlmHsU4+CXFk9v9MrYM= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= -github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= -github.com/filecoin-project/specs-actors/v2 v2.0.1/go.mod h1:v2NZVYinNIKA9acEMBm5wWXxqv5+frFEbekBFemYghY= github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= -github.com/filecoin-project/specs-actors/v2 v2.3.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= -github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= +github.com/filecoin-project/specs-actors/v2 v2.3.6 h1:UxnWTfQd7JsOae39/aHCK0m1IBjdcyymCJfqxuSkn+g= +github.com/filecoin-project/specs-actors/v2 v2.3.6/go.mod h1:DJMpxVRXvev9t8P0XWA26RmTzN+MHiL9IlItVLT0zUc= github.com/filecoin-project/specs-actors/v3 v3.1.0/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= github.com/filecoin-project/specs-actors/v3 v3.1.1 h1:BE8fsns1GnEOxt1DTE5LxBK2FThXtWmCChgcJoHTg0E= github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= @@ -435,8 +422,8 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVi github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= -github.com/filecoin-project/specs-storage v0.1.1-0.20211202151826-2e51da61d454 h1:9II9Xf+jq5xAPQiS4rVoKIiALINa3loMC+ghyFYIrqQ= -github.com/filecoin-project/specs-storage v0.1.1-0.20211202151826-2e51da61d454/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff h1:JO62nquOGhjoDf9+JkAcV+wsD5yhoyIKOMj70ZNdD3Q= +github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578/go.mod h1:/cbLZYvQhinVFUG4TP2Uy1o7LtF+guT21qZIMTmKk0g= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -462,8 +449,6 @@ github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bG github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= github.com/getkin/kin-openapi v0.13.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s+pcEVXFuAjw= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= @@ -489,6 +474,11 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.1 h1:DX7uPQ4WgAWfoh+NGGlbJQswnYIVvz0SRlLS3rPZQDA= +github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.0 h1:j4LrlVXgrbIWO83mmQUnK0Hi+YnbD+vzrE1z/EphbFE= +github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -553,6 +543,8 @@ github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -631,7 +623,6 @@ github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+u github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= -github.com/google/gopacket v1.1.18/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -788,22 +779,16 @@ github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyq github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= -github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= -github.com/ipfs/go-bitswap v0.3.2/go.mod h1:AyWWfN3moBzQX0banEtfKOfbXb3ZeoOeXnZGNPV9S6w= -github.com/ipfs/go-bitswap v0.3.4 h1:AhJhRrG8xkxh6x87b4wWs+4U4y3DVB3doI8yFNqgQME= -github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= +github.com/ipfs/go-bitswap v0.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= +github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= -github.com/ipfs/go-blockservice v0.1.7 h1:yVe9te0M7ow8i+PPkx03YFSpxqzXx594d6h+34D6qMg= -github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= +github.com/ipfs/go-blockservice v0.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= +github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -813,7 +798,6 @@ github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67Fexh github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.0.8-0.20210716091050-de6c03deae1c/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cidutil v0.0.2 h1:CNOboQf1t7Qp0nuNh8QMmhJs0+Q//bRL1axtCnIB1Yo= @@ -822,15 +806,15 @@ github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAK github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.3.0/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= -github.com/ipfs/go-datastore v0.4.6 h1:zU2cmweykxJ+ziXnA2cPtsLe8rdR/vrthOipLPuf6kc= -github.com/ipfs/go-datastore v0.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7frtpHkyPFUc= +github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.5.1 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ= +github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -838,41 +822,34 @@ github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaH github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= -github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= +github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= github.com/ipfs/go-ds-badger2 v0.1.0/go.mod h1:pbR1p817OZbdId9EvLOhKBgUVTM3BMCSTan78lDDVaw= -github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e h1:Xi1nil8K2lBOorBS6Ys7+hmUCzH8fr3U9ipdL/IrcEI= -github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e/go.mod h1:lJnws7amT9Ehqzta0gwMrRsURU04caT0iRPr1W8AsOU= +github.com/ipfs/go-ds-badger2 v0.1.2 h1:sQc2q1gaXrv8YFNeUtxil0neuyDf9hnVHfLsi7lpXfE= +github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-leveldb v0.4.2 h1:QmQoAJ9WkPMUfBLnu1sBVy0xWWlJPg0m4kRAiJL9iaw= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-measure v0.1.0 h1:vE4TyY4aeLeVgnnPBC5QzKIjKrqzha0NCujTfgvVbVQ= -github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= -github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= -github.com/ipfs/go-filestore v1.0.0 h1:QR7ekKH+q2AGiWDc7W2Q0qHuYSRZGUJqUn0GsegEPb0= -github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= +github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= +github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= +github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= +github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= +github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= +github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= -github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= -github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= -github.com/ipfs/go-graphsync v0.9.1/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= -github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= -github.com/ipfs/go-graphsync v0.10.6 h1:GkYan4EoDslceHaqYo/hxktWtuZ7VmsyRXLdSmoCcBQ= -github.com/ipfs/go-graphsync v0.10.6/go.mod h1:tQMjWNDD/vSz80YLT/VvzrUmy58aF9lR1uCwSLzjWzI= -github.com/ipfs/go-hamt-ipld v0.0.15-0.20200131012125-dd88a59d3f2e/go.mod h1:9aQJu/i/TaRDW6jqB5U217dLIDopn50wxLdHXM2CTfE= +github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= +github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= +github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= -github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= -github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= -github.com/ipfs/go-ipfs-blockstore v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= -github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.4 h1:DZdeya9Vu4ttvlGheQPGrj6kWehXnYZRFCp9EsZQ1hI= -github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= +github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= +github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= +github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= +github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= +github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= @@ -886,12 +863,15 @@ github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1I github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= -github.com/ipfs/go-ipfs-ds-help v1.0.0 h1:bEQ8hMGs80h0sR8O4tfDgV6B01aaF9qeTrujrTLYV3g= github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE= -github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6rY30GUu7G6LUfpMvM= +github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= +github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= -github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= +github.com/ipfs/go-ipfs-exchange-interface v0.1.0 h1:TiMekCrOGQuWYtZO3mf4YJXDIdNgnKWZ9IE3fGlnWfo= +github.com/ipfs/go-ipfs-exchange-interface v0.1.0/go.mod h1:ych7WPlyHqFvCi/uQI48zLZuAWVP5iTQPXEfVaw5WEI= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1 h1:mEiXWdbMN6C7vtDG21Fphx8TGCbZPpQnz/496w/PL4g= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= @@ -906,17 +886,19 @@ github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7 github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= -github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= +github.com/ipfs/go-ipfs-routing v0.2.1 h1:E+whHWhJkdN9YeoHZNj5itzc+OR292AJ2uE9FFiW0BY= +github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5-0.20200204214505-252690b78669/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= +github.com/ipfs/go-ipld-cbor v0.0.6 h1:pYuWHyvSpIsOOLw4Jy7NbBkCyzLDcl64Bf/LZW7eBQ0= +github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= @@ -924,7 +906,6 @@ github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2cdcc= github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= -github.com/ipfs/go-ipns v0.0.2/go.mod h1:WChil4e0/m9cIINWLxZe1Jtf77oz5L05rO2ei/uKJ5U= github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= @@ -943,15 +924,15 @@ github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHn github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= -github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= +github.com/ipfs/go-log/v2 v2.4.0 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= +github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= -github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -github.com/ipfs/go-merkledag v0.4.1 h1:CEEQZnwRkszN06oezuasHwDD823Xcr4p4zluUN9vXqs= -github.com/ipfs/go-merkledag v0.4.1/go.mod h1:56biPaS6e+IS0eXkEt6A8tG+BUQaEIFqDqJuFfQDBoE= +github.com/ipfs/go-merkledag v0.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= +github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= @@ -959,10 +940,9 @@ github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= -github.com/ipfs/go-peertaskqueue v0.6.0 h1:BT1/PuNViVomiz1PnnP5+WmKsTNHrxIDvkZrkj4JhOg= -github.com/ipfs/go-peertaskqueue v0.6.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= +github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= +github.com/ipfs/go-peertaskqueue v0.7.1 h1:7PLjon3RZwRQMgOTvYccZ+mjzkmds/7YzSWKFlBAypE= +github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= @@ -977,35 +957,27 @@ github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdm github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= -github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= -github.com/ipld/go-car v0.3.1-0.20210601190600-f512dac51e8e/go.mod h1:wUxBdwOLA9/0HZBi3fnTBzla0MuwlqgJLyrhOg1XaKI= -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 h1:8JMSJ0k71fU9lIUrpVwEdoX4KoxiTEX8cZG97v/hTDw= -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= -github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.1.0 h1:t8R/WXUSkfu1K1gpPk76mytCxsEdMjGcMIgpOq3/Cnw= -github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= +github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= +github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= +github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= +github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= +github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= +github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= -github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= -github.com/ipld/go-ipld-prime v0.5.1-0.20200828233916-988837377a7f/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= -github.com/ipld/go-ipld-prime v0.5.1-0.20201021195245-109253e8a018/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.12.0/go.mod h1:hy8b93WleDMRKumOJnTIrr0MbbFbx9GD6Kzxa53Xppc= -github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -github.com/ipld/go-ipld-prime v0.14.2 h1:P5fO2usnisXwrN/1sR5exCgEvINg/w/27EuYPKB/zx8= -github.com/ipld/go-ipld-prime v0.14.2/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= +github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G/JsQ= +github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= -github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= @@ -1045,6 +1017,7 @@ github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -1091,7 +1064,6 @@ github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQ github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1132,13 +1104,15 @@ github.com/libp2p/go-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtT github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= -github.com/libp2p/go-conn-security-multistream v0.2.1 h1:ft6/POSK7F+vl/2qzegnHDaXFU0iWB4yVTYrioC6Zy0= github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= +github.com/libp2p/go-conn-security-multistream v0.3.0 h1:9UCIKlBL1hC9u7nkMXpD1nkc/T53PKMAn3/k9ivBAVc= +github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= @@ -1152,22 +1126,20 @@ github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68 github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= github.com/libp2p/go-libp2p v0.3.1/go.mod h1:e6bwxbdYH1HqWTz8faTChKGR0BjPc8p+6SyP8GTTR7Y= github.com/libp2p/go-libp2p v0.4.0/go.mod h1:9EsEIf9p2UDuwtPd0DwJsAl0qXVxgAnuDGRvHbfATfI= -github.com/libp2p/go-libp2p v0.6.0/go.mod h1:mfKWI7Soz3ABX+XEBR61lGbg+ewyMtJHVt043oWeqwg= github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= -github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= -github.com/libp2p/go-libp2p v0.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0= -github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= -github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= -github.com/libp2p/go-libp2p v0.14.2/go.mod h1:0PQMADQEjCM2l8cSMYDpTgsb8gr6Zq7i4LUgq1mlW2E= +github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= -github.com/libp2p/go-libp2p v0.15.0 h1:jbMbdmtizfpvl1+oQuGJzfGhttAtuxUCavF3enwFncg= -github.com/libp2p/go-libp2p v0.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= +github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= +github.com/libp2p/go-libp2p v0.17.0 h1:8l4GV401OSd4dFRyHDtIT/mEzdh/aQGoFC8xshYgm5M= +github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= +github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= +github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= @@ -1175,17 +1147,19 @@ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQ github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= -github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-autonat v0.4.2 h1:YMp7StMi2dof+baaxkbxaizXjY1RPvU71CXfxExzcUU= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= +github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= +github.com/libp2p/go-libp2p-autonat v0.7.0 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= +github.com/libp2p/go-libp2p-autonat v0.7.0/go.mod h1:uPvPn6J7cN+LCfFwW5tpOYvAz5NvPTc4iBamTV/WDMg= github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uLv+tlkGTAr3jC0S5cLg= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= -github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= +github.com/libp2p/go-libp2p-blankhost v0.3.0 h1:kTnLArltMabZlzY63pgGDA4kkUcLkBFSM98zBssn/IY= +github.com/libp2p/go-libp2p-blankhost v0.3.0/go.mod h1:urPC+7U01nCGgJ3ZsV8jdwTp6Ji9ID0dMTvq+aJ+nZU= github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= @@ -1193,12 +1167,12 @@ github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8 github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= -github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4= -github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= +github.com/libp2p/go-libp2p-connmgr v0.3.0 h1:yerFXrYa0oxpuVsLlndwm/bLulouHYDcvFrY/4H4fx8= +github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= @@ -1228,8 +1202,12 @@ github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= -github.com/libp2p/go-libp2p-core v0.9.0 h1:t97Mv0LIBZlP2FXVRNKKVzHJCIjbIWGxYptGId4+htU= github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= +github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.13.0 h1:IFG/s8dN6JN2OTrXX9eq2wNU/Zlz2KLdwZUp5FplgXI= +github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -1240,8 +1218,8 @@ github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfx github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-discovery v0.5.1 h1:CJylx+h2+4+s68GvrM4pGNyfNhOYviWBPtVv5PA7sfo= -github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= +github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= @@ -1249,8 +1227,7 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= -github.com/libp2p/go-libp2p-kad-dht v0.11.0/go.mod h1:5ojtR2acDPqh/jXf5orWy8YGb8bHQDS+qeDcoscL/PI= -github.com/libp2p/go-libp2p-kad-dht v0.13.0/go.mod h1:NkGf28RNhPrcsGYWJHm6EH8ULkiJ2qxsWmpE7VTL3LI= +github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk= @@ -1263,13 +1240,13 @@ github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3 github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= -github.com/libp2p/go-libp2p-mplex v0.3.0/go.mod h1:l9QWxRbbb5/hQMECEb908GbS9Sm2UAR2KFZKUJEynEs= github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= -github.com/libp2p/go-libp2p-nat v0.0.6 h1:wMWis3kYynCbHoyKLPBEMu4YRLltbm8Mk08HGSfvTkU= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= +github.com/libp2p/go-libp2p-nat v0.1.0 h1:vigUi2MEN+fwghe5ijpScxtbbDz+L/6y8XwlzYOJgSY= +github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= @@ -1277,7 +1254,7 @@ github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLK github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= -github.com/libp2p/go-libp2p-noise v0.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= @@ -1294,22 +1271,24 @@ github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= -github.com/libp2p/go-libp2p-peerstore v0.3.0 h1:wp/G0+37+GLr7tu+wE+4GWNrA3uxKg6IPRigIMSS5oQ= -github.com/libp2p/go-libp2p-peerstore v0.3.0/go.mod h1:fNX9WlOENMvdx/YD7YO/5Hkrn8+lQIk5A39BHa1HIrM= +github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= +github.com/libp2p/go-libp2p-peerstore v0.6.0 h1:HJminhQSGISBIRb93N6WK3t6Fa8OOTnHd/VBjL4mY5A= +github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= -github.com/libp2p/go-libp2p-pubsub v0.4.2-0.20210212194758-6c1addf493eb/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ= -github.com/libp2p/go-libp2p-pubsub v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= -github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= +github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= +github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= -github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= -github.com/libp2p/go-libp2p-quic-transport v0.11.2 h1:p1YQDZRHH4Cv2LPtHubqlQ9ggz4CKng/REZuXZbZMhM= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= +github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= +github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= +github.com/libp2p/go-libp2p-quic-transport v0.15.2 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= +github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= @@ -1330,14 +1309,13 @@ github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+ github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= -github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.3.1/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= -github.com/libp2p/go-libp2p-swarm v0.5.3 h1:hsYaD/y6+kZff1o1Mc56NcuwSg80lIphTS/zDk3mO4M= github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= +github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= +github.com/libp2p/go-libp2p-swarm v0.9.0 h1:LdWjHDVjPMYt3NCG2EHcQiIP8XzA8BHhHz8ZLAYol2Y= +github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1347,22 +1325,26 @@ github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eq github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.4.2 h1:IOiA5mMigi+eEjf4J+B7fepDhsjtsoWA9QbsCqbNp5U= github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= +github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= +github.com/libp2p/go-libp2p-testing v0.6.0 h1:tV/wz6mS1VoAYA/5DGTiyzw9TJ+eXMCMvzU5VPLJSgg= +github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-tls v0.2.0 h1:N8i5wPiHudA+02sfW85R2nUbybPm7agjAywZc6pd3xA= -github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= +github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= +github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= +github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.6 h1:SHt3g0FslnqIkEWF25YOB8UCOCTpGAVvHRWQYJ+veiI= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= +github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= +github.com/libp2p/go-libp2p-transport-upgrader v0.6.0 h1:GfMCU+2aGGEm1zW3UcOz6wYSn8tXQalFfVfcww99i5A= +github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= @@ -1374,10 +1356,10 @@ github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhL github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= -github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= -github.com/libp2p/go-libp2p-yamux v0.5.3/go.mod h1:Vy3TMonBAfTMXHWopsMc8iX/XGRYrRlpUaMzaeuHV/s= -github.com/libp2p/go-libp2p-yamux v0.5.4 h1:/UOPtT/6DHPtr3TtKXBHa6g0Le0szYuI33Xc/Xpd7fQ= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= +github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= +github.com/libp2p/go-libp2p-yamux v0.7.0 h1:bVXHbTj/XH4uBBsPrg26BlDABk5WYRlssY73P0SjhPc= +github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= @@ -1393,12 +1375,14 @@ github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.6 h1:lQ7Uc0kS1wb1EfRxO2Eir/RJoHkHn7t6o+EiwsYIKJA= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-msgio v0.1.0 h1:8Q7g/528ivAlfXTFWvWhVjTE8XG8sDTkRUKPYh9+5Q8= +github.com/libp2p/go-msgio v0.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= -github.com/libp2p/go-nat v0.0.5 h1:qxnwkco8RLKqVh1NmjQ+tJ8p8khNLFxuElYG/TwqW4Q= github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= +github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= @@ -1411,13 +1395,15 @@ github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport v0.0.2 h1:XSG94b1FJfGA01BUrT82imejHQyTxO4jEWqheyCXYvU= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= +github.com/libp2p/go-reuseport v0.1.0 h1:0ooKOx2iwyIkf339WCZ2HN3ujTDbkK0PjC7JVoP1AiM= +github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= -github.com/libp2p/go-reuseport-transport v0.0.5 h1:lJzi+vSYbyJj2faPKLxNGWEIBcaV/uJmyvsUxXy2mLw= github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= +github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7CyD1zuN7xQT8gc= +github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.1 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= @@ -1432,11 +1418,11 @@ github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19 github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= -github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M= +github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= -github.com/libp2p/go-tcp-transport v0.2.8 h1:aLjX+Nkz+kIz3uA56WtlGKRSAnKDvnqKmv1qF4EyyE4= -github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= +github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= +github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= @@ -1458,19 +1444,19 @@ github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= -github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/go-yamux/v2 v2.2.0 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWoAFU= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= +github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= +github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= +github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= -github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= -github.com/lucas-clemente/quic-go v0.21.2 h1:8LqqL7nBQFDUINadW0fHV/xSaCQJgmJC0Gv+qUnjd78= github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= +github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= +github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= +github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= @@ -1487,19 +1473,17 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= -github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= -github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-15 v0.1.5 h1:Ci4EIUN6Rlb+D6GmLdej/bCQ4nPYNtVXQB+xjiXE1nk= github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1 h1:/rpmWuGvceLwwWuaKPdjpR4JJEUH0tq64/I3hvzaNLM= github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/qtls-go1-17 v0.1.0 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= +github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= @@ -1549,7 +1533,6 @@ github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3N github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= @@ -1636,8 +1619,6 @@ github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= -github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.2.1-0.20210714093213-b2b5bd6fe68b/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= @@ -1655,11 +1636,9 @@ github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wS github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= -github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.2 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= -github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= @@ -1706,7 +1685,6 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= @@ -1718,7 +1696,6 @@ github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= @@ -1851,7 +1828,8 @@ github.com/quasilyte/go-ruleguard/rules v0.0.0-20210221215616-dfcc94e3dffd/go.mo github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= -github.com/raulk/go-watchdog v1.0.1/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= +github.com/raulk/go-watchdog v1.2.0 h1:konN75pw2BMmZ+AfuAm5rtFsWcJpKF3m02rKituuXNo= +github.com/raulk/go-watchdog v1.2.0/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -1976,7 +1954,6 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -2051,7 +2028,6 @@ github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIf github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/cbor-gen v0.0.0-20200402171437-3d27c146c105/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= github.com/whyrusleeping/cbor-gen v0.0.0-20200710004633-5379fc63235d/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= @@ -2136,6 +2112,8 @@ go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= +go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= +go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= go.opentelemetry.io/otel/bridge/opencensus v0.25.0/go.mod h1:dkZDdaNwLlIutxK2Kc2m3jwW2M1ISaNf8/rOYVwuVHs= go.opentelemetry.io/otel/exporters/jaeger v1.2.0/go.mod h1:KJLFbEMKTNPIfOxcg/WikIozEoKcPgJRz3Ce1vLlM8E= go.opentelemetry.io/otel/internal/metric v0.25.0/go.mod h1:Nhuw26QSX7d6n4duoqAFi5KOQR4AuzyMcl5eXOgwxtc= @@ -2143,11 +2121,14 @@ go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9deb go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk2s/F1Ju+TEEm8= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HMUYRvxXXCCnQCg2+ovdt2z8Pk= go.opentelemetry.io/otel/sdk/metric v0.25.0/go.mod h1:G4xzj4LvC6xDDSsVXpvRVclQCbofGGg4ZU2VKKtDRfg= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= +go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= +go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20190702223751-32f345186213/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -2214,7 +2195,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2253,7 +2233,6 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 h1:Jp57DBw4K7mimZNA3F9f7CndVcUt4kJjmyJf2rzJHoI= @@ -2302,7 +2281,6 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -2593,7 +2571,6 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= @@ -2609,7 +2586,6 @@ golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= diff --git a/venus-shared/api/api-document.md b/venus-shared/api/api-document.md index 60000c7e39..e33a55c10f 100644 --- a/venus-shared/api/api-document.md +++ b/venus-shared/api/api-document.md @@ -3104,7 +3104,12 @@ Inputs: ] ``` -Response: `"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"` +Response: +```json +[ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" +] +``` ### NetworkGetPeerAddresses @@ -5452,6 +5457,7 @@ Perms: admin Inputs: ```json [ + "t01234", "string value" ] ``` @@ -5483,7 +5489,15 @@ Response: `true` Perms: admin -Inputs: `null` +Inputs: +```json +[ + { + "Type": "bls", + "PrivateKey": "Ynl0ZSBhcnJheQ==" + } +] +``` Response: `"t01234"` @@ -5492,7 +5506,12 @@ Response: `"t01234"` Perms: write -Inputs: `null` +Inputs: +```json +[ + 7 +] +``` Response: `"t01234"` diff --git a/venus-shared/api/chain/v0/fullnode.go b/venus-shared/api/chain/v0/fullnode.go index 99e896b1e7..bd4498132a 100644 --- a/venus-shared/api/chain/v0/fullnode.go +++ b/venus-shared/api/chain/v0/fullnode.go @@ -2,7 +2,6 @@ package v0 //go:generate go run github.com/golang/mock/mockgen@v1.6.0 -destination=./mock/full.go -package=mock . FullNode - type FullNode interface { IBlockStore IChain diff --git a/venus-shared/api/chain/v0/mock/full.go b/venus-shared/api/chain/v0/mock/full.go index 4d488a0f64..051d499b14 100644 --- a/venus-shared/api/chain/v0/mock/full.go +++ b/venus-shared/api/chain/v0/mock/full.go @@ -1197,10 +1197,10 @@ func (mr *MockFullNodeMockRecorder) NetworkGetBandwidthStats(arg0 interface{}) * } // NetworkGetClosestPeers mocks base method. -func (m *MockFullNode) NetworkGetClosestPeers(arg0 context.Context, arg1 string) (<-chan peer.ID, error) { +func (m *MockFullNode) NetworkGetClosestPeers(arg0 context.Context, arg1 string) ([]peer.ID, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NetworkGetClosestPeers", arg0, arg1) - ret0, _ := ret[0].(<-chan peer.ID) + ret0, _ := ret[0].([]peer.ID) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/venus-shared/api/chain/v0/network.go b/venus-shared/api/chain/v0/network.go index 0c1bffb4ab..64c166c942 100644 --- a/venus-shared/api/chain/v0/network.go +++ b/venus-shared/api/chain/v0/network.go @@ -17,7 +17,7 @@ type INetwork interface { NetworkGetPeerAddresses(ctx context.Context) []ma.Multiaddr //perm:admin NetworkGetPeerID(ctx context.Context) peer.ID //perm:admin NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo //perm:read - NetworkGetClosestPeers(ctx context.Context, key string) (<-chan peer.ID, error) //perm:read + NetworkGetClosestPeers(ctx context.Context, key string) ([]peer.ID, error) //perm:read NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) //perm:read NetworkConnect(ctx context.Context, addrs []string) (<-chan net.ConnectionResult, error) //perm:read NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) //perm:read diff --git a/venus-shared/api/chain/v0/proxy_gen.go b/venus-shared/api/chain/v0/proxy_gen.go index d067bc9699..a5f38e9d93 100644 --- a/venus-shared/api/chain/v0/proxy_gen.go +++ b/venus-shared/api/chain/v0/proxy_gen.go @@ -782,7 +782,7 @@ type INetworkStruct struct { NetworkGetBandwidthStats func(p0 context.Context) metrics.Stats `perm:"admin"` - NetworkGetClosestPeers func(p0 context.Context, p1 string) (<-chan peer.ID, error) `perm:"read"` + NetworkGetClosestPeers func(p0 context.Context, p1 string) ([]peer.ID, error) `perm:"read"` NetworkGetPeerAddresses func(p0 context.Context) []ma.Multiaddr `perm:"admin"` @@ -814,7 +814,7 @@ func (s *INetworkStruct) NetworkGetBandwidthStats(p0 context.Context) metrics.St return s.Internal.NetworkGetBandwidthStats(p0) } -func (s *INetworkStruct) NetworkGetClosestPeers(p0 context.Context, p1 string) (<-chan peer.ID, error) { +func (s *INetworkStruct) NetworkGetClosestPeers(p0 context.Context, p1 string) ([]peer.ID, error) { return s.Internal.NetworkGetClosestPeers(p0, p1) } @@ -1002,13 +1002,13 @@ type IWalletStruct struct { WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"` - WalletExport func(p0 address.Address, p1 string) (*wallet.KeyInfo, error) `perm:"admin"` + WalletExport func(p0 context.Context, p1 address.Address, p2 string) (*wallet.KeyInfo, error) `perm:"admin"` WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` - WalletImport func(p0 *wallet.KeyInfo) (address.Address, error) `perm:"admin"` + WalletImport func(p0 context.Context, p1 *wallet.KeyInfo) (address.Address, error) `perm:"admin"` - WalletNewAddress func(p0 address.Protocol) (address.Address, error) `perm:"write"` + WalletNewAddress func(p0 context.Context, p1 address.Protocol) (address.Address, error) `perm:"write"` WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` @@ -1048,20 +1048,20 @@ func (s *IWalletStruct) WalletDefaultAddress(p0 context.Context) (address.Addres return s.Internal.WalletDefaultAddress(p0) } -func (s *IWalletStruct) WalletExport(p0 address.Address, p1 string) (*wallet.KeyInfo, error) { - return s.Internal.WalletExport(p0, p1) +func (s *IWalletStruct) WalletExport(p0 context.Context, p1 address.Address, p2 string) (*wallet.KeyInfo, error) { + return s.Internal.WalletExport(p0, p1, p2) } func (s *IWalletStruct) WalletHas(p0 context.Context, p1 address.Address) (bool, error) { return s.Internal.WalletHas(p0, p1) } -func (s *IWalletStruct) WalletImport(p0 *wallet.KeyInfo) (address.Address, error) { - return s.Internal.WalletImport(p0) +func (s *IWalletStruct) WalletImport(p0 context.Context, p1 *wallet.KeyInfo) (address.Address, error) { + return s.Internal.WalletImport(p0, p1) } -func (s *IWalletStruct) WalletNewAddress(p0 address.Protocol) (address.Address, error) { - return s.Internal.WalletNewAddress(p0) +func (s *IWalletStruct) WalletNewAddress(p0 context.Context, p1 address.Protocol) (address.Address, error) { + return s.Internal.WalletNewAddress(p0, p1) } func (s *IWalletStruct) WalletSetDefault(p0 context.Context, p1 address.Address) error { diff --git a/venus-shared/api/chain/v0/wallet.go b/venus-shared/api/chain/v0/wallet.go index bed48a5e50..0272b2d3bf 100644 --- a/venus-shared/api/chain/v0/wallet.go +++ b/venus-shared/api/chain/v0/wallet.go @@ -13,10 +13,10 @@ import ( type IWallet interface { WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) //perm:sign - WalletExport(addr address.Address, password string) (*wallet.KeyInfo, error) //perm:admin - WalletImport(key *wallet.KeyInfo) (address.Address, error) //perm:admin + WalletExport(ctx context.Context, addr address.Address, password string) (*wallet.KeyInfo, error) //perm:admin + WalletImport(ctx context.Context, key *wallet.KeyInfo) (address.Address, error) //perm:admin WalletHas(ctx context.Context, addr address.Address) (bool, error) //perm:write - WalletNewAddress(protocol address.Protocol) (address.Address, error) //perm:write + WalletNewAddress(ctx context.Context, protocol address.Protocol) (address.Address, error) //perm:write WalletBalance(ctx context.Context, addr address.Address) (abi.TokenAmount, error) //perm:read WalletDefaultAddress(ctx context.Context) (address.Address, error) //perm:write WalletAddresses(ctx context.Context) []address.Address //perm:admin @@ -24,7 +24,7 @@ type IWallet interface { WalletSignMessage(ctx context.Context, k address.Address, msg *chain.Message) (*chain.SignedMessage, error) //perm:sign LockWallet(ctx context.Context) error //perm:admin UnLockWallet(ctx context.Context, password []byte) error //perm:admin - SetPassword(Context context.Context, password []byte) error //perm:admin - HasPassword(Context context.Context) bool //perm:admin - WalletState(Context context.Context) int //perm:admin + SetPassword(ctx context.Context, password []byte) error //perm:admin + HasPassword(ctx context.Context) bool //perm:admin + WalletState(ctx context.Context) int //perm:admin } diff --git a/venus-shared/api/chain/v1/mock/full.go b/venus-shared/api/chain/v1/mock/full.go index c8d8646ad6..d7ca9b2ac5 100644 --- a/venus-shared/api/chain/v1/mock/full.go +++ b/venus-shared/api/chain/v1/mock/full.go @@ -1257,10 +1257,10 @@ func (mr *MockFullNodeMockRecorder) NetworkGetBandwidthStats(arg0 interface{}) * } // NetworkGetClosestPeers mocks base method. -func (m *MockFullNode) NetworkGetClosestPeers(arg0 context.Context, arg1 string) (<-chan peer.ID, error) { +func (m *MockFullNode) NetworkGetClosestPeers(arg0 context.Context, arg1 string) ([]peer.ID, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NetworkGetClosestPeers", arg0, arg1) - ret0, _ := ret[0].(<-chan peer.ID) + ret0, _ := ret[0].([]peer.ID) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/venus-shared/api/chain/v1/network.go b/venus-shared/api/chain/v1/network.go index 1b1d291491..27529b2470 100644 --- a/venus-shared/api/chain/v1/network.go +++ b/venus-shared/api/chain/v1/network.go @@ -17,7 +17,7 @@ type INetwork interface { NetworkGetPeerAddresses(ctx context.Context) []ma.Multiaddr //perm:admin NetworkGetPeerID(ctx context.Context) peer.ID //perm:admin NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo //perm:read - NetworkGetClosestPeers(ctx context.Context, key string) (<-chan peer.ID, error) //perm:read + NetworkGetClosestPeers(ctx context.Context, key string) ([]peer.ID, error) //perm:read NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) //perm:read NetworkConnect(ctx context.Context, addrs []string) (<-chan net.ConnectionResult, error) //perm:read NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) //perm:read diff --git a/venus-shared/api/chain/v1/proxy_gen.go b/venus-shared/api/chain/v1/proxy_gen.go index 860f7720ed..f129eee8bd 100644 --- a/venus-shared/api/chain/v1/proxy_gen.go +++ b/venus-shared/api/chain/v1/proxy_gen.go @@ -800,7 +800,7 @@ type INetworkStruct struct { NetworkGetBandwidthStats func(p0 context.Context) metrics.Stats `perm:"admin"` - NetworkGetClosestPeers func(p0 context.Context, p1 string) (<-chan peer.ID, error) `perm:"read"` + NetworkGetClosestPeers func(p0 context.Context, p1 string) ([]peer.ID, error) `perm:"read"` NetworkGetPeerAddresses func(p0 context.Context) []ma.Multiaddr `perm:"admin"` @@ -832,7 +832,7 @@ func (s *INetworkStruct) NetworkGetBandwidthStats(p0 context.Context) metrics.St return s.Internal.NetworkGetBandwidthStats(p0) } -func (s *INetworkStruct) NetworkGetClosestPeers(p0 context.Context, p1 string) (<-chan peer.ID, error) { +func (s *INetworkStruct) NetworkGetClosestPeers(p0 context.Context, p1 string) ([]peer.ID, error) { return s.Internal.NetworkGetClosestPeers(p0, p1) } @@ -1020,13 +1020,13 @@ type IWalletStruct struct { WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"` - WalletExport func(p0 address.Address, p1 string) (*wallet.KeyInfo, error) `perm:"admin"` + WalletExport func(p0 context.Context, p1 address.Address, p2 string) (*wallet.KeyInfo, error) `perm:"admin"` WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` - WalletImport func(p0 *wallet.KeyInfo) (address.Address, error) `perm:"admin"` + WalletImport func(p0 context.Context, p1 *wallet.KeyInfo) (address.Address, error) `perm:"admin"` - WalletNewAddress func(p0 address.Protocol) (address.Address, error) `perm:"write"` + WalletNewAddress func(p0 context.Context, p1 address.Protocol) (address.Address, error) `perm:"write"` WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` @@ -1066,20 +1066,20 @@ func (s *IWalletStruct) WalletDefaultAddress(p0 context.Context) (address.Addres return s.Internal.WalletDefaultAddress(p0) } -func (s *IWalletStruct) WalletExport(p0 address.Address, p1 string) (*wallet.KeyInfo, error) { - return s.Internal.WalletExport(p0, p1) +func (s *IWalletStruct) WalletExport(p0 context.Context, p1 address.Address, p2 string) (*wallet.KeyInfo, error) { + return s.Internal.WalletExport(p0, p1, p2) } func (s *IWalletStruct) WalletHas(p0 context.Context, p1 address.Address) (bool, error) { return s.Internal.WalletHas(p0, p1) } -func (s *IWalletStruct) WalletImport(p0 *wallet.KeyInfo) (address.Address, error) { - return s.Internal.WalletImport(p0) +func (s *IWalletStruct) WalletImport(p0 context.Context, p1 *wallet.KeyInfo) (address.Address, error) { + return s.Internal.WalletImport(p0, p1) } -func (s *IWalletStruct) WalletNewAddress(p0 address.Protocol) (address.Address, error) { - return s.Internal.WalletNewAddress(p0) +func (s *IWalletStruct) WalletNewAddress(p0 context.Context, p1 address.Protocol) (address.Address, error) { + return s.Internal.WalletNewAddress(p0, p1) } func (s *IWalletStruct) WalletSetDefault(p0 context.Context, p1 address.Address) error { diff --git a/venus-shared/api/chain/v1/wallet.go b/venus-shared/api/chain/v1/wallet.go index 42c1c5dd6e..20f47aad0e 100644 --- a/venus-shared/api/chain/v1/wallet.go +++ b/venus-shared/api/chain/v1/wallet.go @@ -13,10 +13,10 @@ import ( type IWallet interface { WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) //perm:sign - WalletExport(addr address.Address, password string) (*wallet.KeyInfo, error) //perm:admin - WalletImport(key *wallet.KeyInfo) (address.Address, error) //perm:admin + WalletExport(ctx context.Context, addr address.Address, password string) (*wallet.KeyInfo, error) //perm:admin + WalletImport(ctx context.Context, key *wallet.KeyInfo) (address.Address, error) //perm:admin WalletHas(ctx context.Context, addr address.Address) (bool, error) //perm:write - WalletNewAddress(protocol address.Protocol) (address.Address, error) //perm:write + WalletNewAddress(ctx context.Context, protocol address.Protocol) (address.Address, error) //perm:write WalletBalance(ctx context.Context, addr address.Address) (abi.TokenAmount, error) //perm:read WalletDefaultAddress(ctx context.Context) (address.Address, error) //perm:write WalletAddresses(ctx context.Context) []address.Address //perm:admin @@ -24,7 +24,7 @@ type IWallet interface { WalletSignMessage(ctx context.Context, k address.Address, msg *chain.Message) (*chain.SignedMessage, error) //perm:sign LockWallet(ctx context.Context) error //perm:admin UnLockWallet(ctx context.Context, password []byte) error //perm:admin - SetPassword(Context context.Context, password []byte) error //perm:admin - HasPassword(Context context.Context) bool //perm:admin - WalletState(Context context.Context) int //perm:admin + SetPassword(ctx context.Context, password []byte) error //perm:admin + HasPassword(ctx context.Context) bool //perm:admin + WalletState(ctx context.Context) int //perm:admin } diff --git a/venus-shared/chain/complex_provider_test.go b/venus-shared/chain/complex_provider_test.go index b237d4bdfd..7b645ec2ee 100644 --- a/venus-shared/chain/complex_provider_test.go +++ b/venus-shared/chain/complex_provider_test.go @@ -31,6 +31,7 @@ func TestBlockProvider(t *testing.T) { func TestComplexProvider(t *testing.T) { tf.UnitTest(t) + tests := map[string]func(*testing.T){ "Tipset": TestTipsetProvider, "Message": TestMessageProvider, diff --git a/venus-shared/chain/tipset_key.go b/venus-shared/chain/tipset_key.go index 3289b4807a..70838aa215 100644 --- a/venus-shared/chain/tipset_key.go +++ b/venus-shared/chain/tipset_key.go @@ -107,11 +107,11 @@ func (tsk TipSetKey) IsEmpty() bool { // We can assume that the relative order of members of one key is // maintained in the other since we assume that all ids are sorted // by corresponding newBlock ticket value. -func (tipsetKey TipSetKey) ContainsAll(other TipSetKey) bool { +func (tsk TipSetKey) ContainsAll(other TipSetKey) bool { // Since we assume the ids must have the same relative sorting we can // perform one pass over this set, advancing the other index whenever the // values match. - cids := tipsetKey.Cids() + cids := tsk.Cids() otherCids := other.Cids() otherIdx := 0 for i := 0; i < len(cids) && otherIdx < len(otherCids); i++ { @@ -124,9 +124,9 @@ func (tipsetKey TipSetKey) ContainsAll(other TipSetKey) bool { } // Has checks whether the set contains `id`. -func (tipsetKey TipSetKey) Has(id cid.Cid) bool { +func (tsk TipSetKey) Has(id cid.Cid) bool { // Find index of the first CID not less than id. - for _, cid := range tipsetKey.Cids() { + for _, cid := range tsk.Cids() { if cid == id { return true } @@ -135,11 +135,11 @@ func (tipsetKey TipSetKey) Has(id cid.Cid) bool { } // Equals checks whether the set contains exactly the same CIDs as another. -func (tipsetKey TipSetKey) Equals(other TipSetKey) bool { - return tipsetKey.value == other.value +func (tsk TipSetKey) Equals(other TipSetKey) bool { + return tsk.value == other.value } -func (tipsetKey *TipSetKey) UnmarshalCBOR(r io.Reader) error { +func (tsk *TipSetKey) UnmarshalCBOR(r io.Reader) error { br := cbg.GetPeeker(r) scratch := make([]byte, 8) maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) @@ -165,13 +165,13 @@ func (tipsetKey *TipSetKey) UnmarshalCBOR(r io.Reader) error { } cids[i] = c } - tipsetKey.value = string(encodeKey(cids)) + tsk.value = string(encodeKey(cids)) } return nil } -func (tipsetKey TipSetKey) MarshalCBOR(w io.Writer) error { - cids := tipsetKey.Cids() +func (tsk TipSetKey) MarshalCBOR(w io.Writer) error { + cids := tsk.Cids() if len(cids) > cbg.MaxLength { return xerrors.Errorf("Slice value in field t.Parents was too long") } From 513a53340ea4da059b1d8d1ffcddd87ff7538ca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E9=A1=B5=E7=B4=A0=E4=B9=A6?= <2931107265@qq.com> Date: Tue, 4 Jan 2022 17:28:35 +0800 Subject: [PATCH 094/167] fix func def for dsbackend --- pkg/wallet/dsbackend.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/wallet/dsbackend.go b/pkg/wallet/dsbackend.go index a53c64eaf3..a36a672178 100644 --- a/pkg/wallet/dsbackend.go +++ b/pkg/wallet/dsbackend.go @@ -120,7 +120,7 @@ func (backend *DSBackend) HasAddress(ctx context.Context, addr address.Address) // NewAddress creates a new address and stores it. // Safe for concurrent access. -func (backend *DSBackend) NewAddress(protocol address.Protocol) (address.Address, error) { +func (backend *DSBackend) NewAddress(ctx context.Context, protocol address.Protocol) (address.Address, error) { backend.lk.Lock() defer backend.lk.Unlock() @@ -180,7 +180,7 @@ func (backend *DSBackend) putKeyInfo(ctx context.Context, ki *crypto.KeyInfo) er return err } - if err := backend.ds.Put(ds.NewKey(key.Address.String()), keyJSON); err != nil { + if err := backend.ds.Put(ctx, ds.NewKey(key.Address.String()), keyJSON); err != nil { return errors.Wrapf(err, "failed to store new address: %s", key.Address.String()) } backend.cache[addr] = struct{}{} From 0b687b0053866e25ca741716612b39972aee1640 Mon Sep 17 00:00:00 2001 From: Susanoo <40375298+diwufeiwen@users.noreply.github.com> Date: Tue, 4 Jan 2022 17:47:42 +0800 Subject: [PATCH 095/167] Unify the definition of MessageReceipt (#4667) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 一页素书 <2931107265@qq.com> --- cmd/show_test.go | 8 ++++---- cmd/state.go | 2 +- pkg/types/internal/cbor_gen.go | 18 +++++++++--------- pkg/types/internal/message.go | 6 +++--- pkg/types/internal/testing_messages.go | 2 +- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/cmd/show_test.go b/cmd/show_test.go index e4f82f5ad3..d3e8ff1d74 100644 --- a/cmd/show_test.go +++ b/cmd/show_test.go @@ -24,10 +24,10 @@ import ( // Receipt is what is returned by executing a message on the vm. type Receipt struct { // control field for encoding struct as an array - _ struct{} `cbor:",toarray"` - ExitCode int64 `json:"exitCode"` - ReturnValue []byte `json:"return"` - GasUsed int64 `json:"gasUsed"` + _ struct{} `cbor:",toarray"` + ExitCode int64 `json:"exitCode"` + Return []byte `json:"return"` + GasUsed int64 `json:"gasUsed"` } func TestBlockDaemon(t *testing.T) { diff --git a/cmd/state.go b/cmd/state.go index 5bf26c5b19..9f5a2cc4c5 100644 --- a/cmd/state.go +++ b/cmd/state.go @@ -82,7 +82,7 @@ var stateWaitMsgCmd = &cmds.Command{ writer.Printf("message was executed in tipset: %s\n", mw.TipSet.Cids()) writer.Printf("Exit Code: %d\n", mw.Receipt.ExitCode) writer.Printf("Gas Used: %d\n", mw.Receipt.GasUsed) - writer.Printf("Return: %x\n", mw.Receipt.ReturnValue) + writer.Printf("Return: %x\n", mw.Receipt.Return) } else { writer.Printf("Unable to find message recepit of %s", cid) } diff --git a/pkg/types/internal/cbor_gen.go b/pkg/types/internal/cbor_gen.go index 822fc36726..c2cb312b5d 100644 --- a/pkg/types/internal/cbor_gen.go +++ b/pkg/types/internal/cbor_gen.go @@ -44,16 +44,16 @@ func (t *MessageReceipt) MarshalCBOR(w io.Writer) error { } } - // t.ReturnValue ([]uint8) (slice) - if len(t.ReturnValue) > cbg.ByteArrayMaxLen { - return xerrors.Errorf("Byte array in field t.ReturnValue was too long") + // t.Return ([]uint8) (slice) + if len(t.Return) > cbg.ByteArrayMaxLen { + return xerrors.Errorf("Byte array in field t.Return was too long") } - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.ReturnValue))); err != nil { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.Return))); err != nil { return err } - if _, err := w.Write(t.ReturnValue[:]); err != nil { + if _, err := w.Write(t.Return[:]); err != nil { return err } @@ -113,7 +113,7 @@ func (t *MessageReceipt) UnmarshalCBOR(r io.Reader) error { t.ExitCode = exitcode.ExitCode(extraI) } - // t.ReturnValue ([]uint8) (slice) + // t.Return ([]uint8) (slice) maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) if err != nil { @@ -121,17 +121,17 @@ func (t *MessageReceipt) UnmarshalCBOR(r io.Reader) error { } if extra > cbg.ByteArrayMaxLen { - return fmt.Errorf("t.ReturnValue: byte array too large (%d)", extra) + return fmt.Errorf("t.Return: byte array too large (%d)", extra) } if maj != cbg.MajByteString { return fmt.Errorf("expected byte array") } if extra > 0 { - t.ReturnValue = make([]uint8, extra) + t.Return = make([]uint8, extra) } - if _, err := io.ReadFull(br, t.ReturnValue[:]); err != nil { + if _, err := io.ReadFull(br, t.Return[:]); err != nil { return err } // t.GasUsed (int64) (int64) diff --git a/pkg/types/internal/message.go b/pkg/types/internal/message.go index 4b889707ae..4a047d7b4f 100644 --- a/pkg/types/internal/message.go +++ b/pkg/types/internal/message.go @@ -350,9 +350,9 @@ func (m *TxMeta) ToStorageBlock() (block.Block, error) { // MessageReceipt is what is returned by executing a message on the vm. type MessageReceipt struct { - ExitCode exitcode.ExitCode `json:"exitCode"` - ReturnValue []byte `json:"return"` - GasUsed int64 `json:"gasUsed"` + ExitCode exitcode.ExitCode `json:"exitCode"` + Return []byte `json:"return"` + GasUsed int64 `json:"gasUsed"` } func (r *MessageReceipt) String() string { diff --git a/pkg/types/internal/testing_messages.go b/pkg/types/internal/testing_messages.go index b4209244c1..57f470a57e 100644 --- a/pkg/types/internal/testing_messages.go +++ b/pkg/types/internal/testing_messages.go @@ -97,6 +97,6 @@ func (rm *ReceiptMaker) NewReceipt() MessageReceipt { seq := rm.seq rm.seq++ return MessageReceipt{ - ReturnValue: []byte(fmt.Sprintf("%d", seq)), + Return: []byte(fmt.Sprintf("%d", seq)), } } From 88c096a612c096c9a8541f51ccd1bb652653dbae Mon Sep 17 00:00:00 2001 From: Susanoo <40375298+diwufeiwen@users.noreply.github.com> Date: Tue, 4 Jan 2022 18:08:27 +0800 Subject: [PATCH 096/167] fix ci for select msg test (#4669) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 一页素书 <2931107265@qq.com> --- pkg/messagepool/selection_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/messagepool/selection_test.go b/pkg/messagepool/selection_test.go index 6440067f78..59145f6192 100644 --- a/pkg/messagepool/selection_test.go +++ b/pkg/messagepool/selection_test.go @@ -577,7 +577,7 @@ func TestMessageSelectionTrimmingMsgsBasic(t *testing.T) { // the actors w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } @@ -619,13 +619,13 @@ func TestMessageSelectionTrimmingMsgsTwoSendersBasic(t *testing.T) { // the actors w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } w2 := newWallet(t) - a2, err := w2.NewAddress(address.BLS) + a2, err := w2.NewAddress(context.Background(), address.BLS) if err != nil { t.Fatal(err) } @@ -677,13 +677,13 @@ func TestMessageSelectionTrimmingMsgsTwoSendersAdvanced(t *testing.T) { // the actors w1 := newWallet(t) - a1, err := w1.NewAddress(address.SECP256K1) + a1, err := w1.NewAddress(context.Background(), address.SECP256K1) if err != nil { t.Fatal(err) } w2 := newWallet(t) - a2, err := w2.NewAddress(address.BLS) + a2, err := w2.NewAddress(context.Background(), address.BLS) if err != nil { t.Fatal(err) } From e54464ddc1381a818c54dbbfc50319e9f5beb549 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Tue, 4 Jan 2022 19:53:05 +0800 Subject: [PATCH 097/167] disable mplex stream muxer (#4668) --- app/submodule/network/network_submodule.go | 32 ++-------------------- go.mod | 1 - pkg/messagepool/selection_test.go | 5 ++-- 3 files changed, 6 insertions(+), 32 deletions(-) diff --git a/app/submodule/network/network_submodule.go b/app/submodule/network/network_submodule.go index 5bf16d5b4f..f17c8f31c4 100644 --- a/app/submodule/network/network_submodule.go +++ b/app/submodule/network/network_submodule.go @@ -7,7 +7,6 @@ import ( "os" "path/filepath" "runtime" - "strings" "time" "github.com/ipfs/go-bitswap" @@ -27,10 +26,8 @@ import ( "github.com/libp2p/go-libp2p" "github.com/libp2p/go-libp2p-core/host" p2pmetrics "github.com/libp2p/go-libp2p-core/metrics" - smux "github.com/libp2p/go-libp2p-core/mux" "github.com/libp2p/go-libp2p-core/routing" dht "github.com/libp2p/go-libp2p-kad-dht" - mplex "github.com/libp2p/go-libp2p-mplex" libp2pps "github.com/libp2p/go-libp2p-pubsub" yamux "github.com/libp2p/go-libp2p-yamux" ma "github.com/multiformats/go-multiaddr" @@ -112,7 +109,7 @@ type networkConfig interface { // NewNetworkSubmodule creates a new network submodule. func NewNetworkSubmodule(ctx context.Context, config networkConfig) (*NetworkSubmodule, error) { bandwidthTracker := p2pmetrics.NewBandwidthCounter() - libP2pOpts := append(config.Libp2pOpts(), libp2p.BandwidthReporter(bandwidthTracker), makeSmuxTransportOption(true)) + libP2pOpts := append(config.Libp2pOpts(), libp2p.BandwidthReporter(bandwidthTracker), makeSmuxTransportOption()) var networkName string var err error @@ -400,9 +397,8 @@ func buildHost(ctx context.Context, config networkConfig, libP2pOpts []libp2p.Op return libp2p.New(opts...) } -func makeSmuxTransportOption(mplexExp bool) libp2p.Option { +func makeSmuxTransportOption() libp2p.Option { const yamuxID = "/yamux/1.0.0" - const mplexID = "/mplex/6.7.0" ymxtpt := *yamux.DefaultTransport ymxtpt.AcceptBacklog = 512 @@ -411,27 +407,5 @@ func makeSmuxTransportOption(mplexExp bool) libp2p.Option { ymxtpt.LogOutput = os.Stderr } - muxers := map[string]smux.Multiplexer{yamuxID: &ymxtpt} - if mplexExp { - muxers[mplexID] = mplex.DefaultTransport - } - - // Allow muxer preference order overriding - order := []string{yamuxID, mplexID} - if prefs := os.Getenv("LIBP2P_MUX_PREFS"); prefs != "" { - order = strings.Fields(prefs) - } - - opts := make([]libp2p.Option, 0, len(order)) - for _, id := range order { - tpt, ok := muxers[id] - if !ok { - networkLogger.Warnf("unknown or duplicate muxer in LIBP2P_MUX_PREFS: %s", id) - continue - } - delete(muxers, id) - opts = append(opts, libp2p.Muxer(id, tpt)) - } - - return libp2p.ChainOptions(opts...) + return libp2p.Muxer(yamuxID, &ymxtpt) } diff --git a/go.mod b/go.mod index 2f3c596ca6..ac8d08121e 100644 --- a/go.mod +++ b/go.mod @@ -92,7 +92,6 @@ require ( github.com/libp2p/go-libp2p v0.17.0 github.com/libp2p/go-libp2p-core v0.13.0 github.com/libp2p/go-libp2p-kad-dht v0.15.0 - github.com/libp2p/go-libp2p-mplex v0.4.1 github.com/libp2p/go-libp2p-peerstore v0.6.0 github.com/libp2p/go-libp2p-pubsub v0.6.0 github.com/libp2p/go-libp2p-swarm v0.9.0 diff --git a/pkg/messagepool/selection_test.go b/pkg/messagepool/selection_test.go index 59145f6192..dccda26322 100644 --- a/pkg/messagepool/selection_test.go +++ b/pkg/messagepool/selection_test.go @@ -5,8 +5,6 @@ import ( "context" "encoding/json" "fmt" - "github.com/stretchr/testify/require" - cbg "github.com/whyrusleeping/cbor-gen" "io" "math" "math/big" @@ -15,6 +13,9 @@ import ( "sort" "testing" + "github.com/stretchr/testify/require" + cbg "github.com/whyrusleeping/cbor-gen" + "github.com/filecoin-project/go-address" tbig "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/crypto" From 22a9f7abf6fc7165549b58ec891399006989e542 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Wed, 5 Jan 2022 10:39:30 +0800 Subject: [PATCH 098/167] fix test (#4670) * fix test --- app/submodule/network/network_submodule.go | 33 +++++++++++++--------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/app/submodule/network/network_submodule.go b/app/submodule/network/network_submodule.go index f17c8f31c4..6bd1bdbe4b 100644 --- a/app/submodule/network/network_submodule.go +++ b/app/submodule/network/network_submodule.go @@ -76,6 +76,9 @@ type NetworkSubmodule struct { //nolint //data transfer DataTransfer datatransfer.Manager DataTransferHost dtnet.DataTransferNetwork + + // fix datastore closed before flush + cancel context.CancelFunc } //API create a new network implement @@ -96,6 +99,7 @@ func (networkSubmodule *NetworkSubmodule) Stop(ctx context.Context) { if err := networkSubmodule.Host.Close(); err != nil { networkLogger.Errorf("error closing host: %s", err.Error()) } + networkSubmodule.cancel() } type networkConfig interface { @@ -134,7 +138,8 @@ func NewNetworkSubmodule(ctx context.Context, config networkConfig) (*NetworkSub var router routing.Routing var pubsubMessageSigning bool var peerMgr net.IPeerMgr - // if !config.OfflineMode() { + networkSubmodule := &NetworkSubmodule{} + ctx, networkSubmodule.cancel = context.WithCancel(ctx) makeDHT := func(h host.Host) (routing.Routing, error) { mode := dht.ModeAuto opts := []dht.Option{dht.Mode(mode), @@ -238,19 +243,19 @@ func NewNetworkSubmodule(ctx context.Context, config networkConfig) (*NetworkSub network := net.New(peerHost, net.NewRouter(router), bandwidthTracker) // build the network submdule - return &NetworkSubmodule{ - NetworkName: networkName, - Host: peerHost, - Router: router, - Pubsub: gsub, - Bitswap: bswap, - GraphExchange: gsync, - Network: network, - DataTransfer: dt, - DataTransferHost: dtNet, - PeerMgr: peerMgr, - Blockstore: config.Repo().Datastore(), - }, nil + networkSubmodule.NetworkName = networkName + networkSubmodule.Host = peerHost + networkSubmodule.Router = router + networkSubmodule.Pubsub = gsub + networkSubmodule.Bitswap = bswap + networkSubmodule.GraphExchange = gsync + networkSubmodule.Network = network + networkSubmodule.DataTransfer = dt + networkSubmodule.DataTransferHost = dtNet + networkSubmodule.PeerMgr = peerMgr + networkSubmodule.Blockstore = config.Repo().Datastore() + + return networkSubmodule, nil } func (networkSubmodule *NetworkSubmodule) FetchMessagesByCids( From 740e3c1453dea993955ffef163bdc653db3023f3 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Wed, 5 Jan 2022 14:32:06 +0800 Subject: [PATCH 099/167] close dht (#4672) --- app/submodule/network/network_submodule.go | 35 ++++++++++------------ 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/app/submodule/network/network_submodule.go b/app/submodule/network/network_submodule.go index 6bd1bdbe4b..0420787f38 100644 --- a/app/submodule/network/network_submodule.go +++ b/app/submodule/network/network_submodule.go @@ -76,9 +76,6 @@ type NetworkSubmodule struct { //nolint //data transfer DataTransfer datatransfer.Manager DataTransferHost dtnet.DataTransferNetwork - - // fix datastore closed before flush - cancel context.CancelFunc } //API create a new network implement @@ -99,7 +96,9 @@ func (networkSubmodule *NetworkSubmodule) Stop(ctx context.Context) { if err := networkSubmodule.Host.Close(); err != nil { networkLogger.Errorf("error closing host: %s", err.Error()) } - networkSubmodule.cancel() + if err := networkSubmodule.Router.(*dht.IpfsDHT).Close(); err != nil { + networkLogger.Errorf("error closing dht: %s", err.Error()) + } } type networkConfig interface { @@ -138,8 +137,6 @@ func NewNetworkSubmodule(ctx context.Context, config networkConfig) (*NetworkSub var router routing.Routing var pubsubMessageSigning bool var peerMgr net.IPeerMgr - networkSubmodule := &NetworkSubmodule{} - ctx, networkSubmodule.cancel = context.WithCancel(ctx) makeDHT := func(h host.Host) (routing.Routing, error) { mode := dht.ModeAuto opts := []dht.Option{dht.Mode(mode), @@ -243,19 +240,19 @@ func NewNetworkSubmodule(ctx context.Context, config networkConfig) (*NetworkSub network := net.New(peerHost, net.NewRouter(router), bandwidthTracker) // build the network submdule - networkSubmodule.NetworkName = networkName - networkSubmodule.Host = peerHost - networkSubmodule.Router = router - networkSubmodule.Pubsub = gsub - networkSubmodule.Bitswap = bswap - networkSubmodule.GraphExchange = gsync - networkSubmodule.Network = network - networkSubmodule.DataTransfer = dt - networkSubmodule.DataTransferHost = dtNet - networkSubmodule.PeerMgr = peerMgr - networkSubmodule.Blockstore = config.Repo().Datastore() - - return networkSubmodule, nil + return &NetworkSubmodule{ + NetworkName: networkName, + Host: peerHost, + Router: router, + Pubsub: gsub, + Bitswap: bswap, + GraphExchange: gsync, + Network: network, + DataTransfer: dt, + DataTransferHost: dtNet, + PeerMgr: peerMgr, + Blockstore: config.Repo().Datastore(), + }, nil } func (networkSubmodule *NetworkSubmodule) FetchMessagesByCids( From 570b12fcb61460d72fa1d9e2a7a14cd485bd307e Mon Sep 17 00:00:00 2001 From: zl Date: Wed, 5 Jan 2022 14:55:17 +0800 Subject: [PATCH 100/167] refactor: (#4673) 1: rename MsigCancel to MsigApproveTxnHash (compatible with lotus api) 2: the older MsigCancel inner invoke msigApproveOrCancelSimple. new feat: 1: add `msig cancel` command. others: the compatible check files was re-generated :make compatible-all api document is re-generated : make api-docs api structs is re-genreated: make v2-gen-api && make gen-api --- app/client/apiface/multisig.go | 9 +- app/client/apiface/v0api/multisig.go | 7 +- app/client/full.go | 43 ++++---- app/client/v0api/full.go | 34 +++---- app/submodule/multisig/multisig_api.go | 12 ++- .../multisig/v0api/multisig_v0api.go | 13 ++- cmd/multisig.go | 99 ++++++++++++++++++- tools/gen/api/stable_method_info.json | 8 +- venus-shared/api/api-document.md | 37 +++++++ venus-shared/api/chain/v0/mock/full.go | 47 ++++++--- venus-shared/api/chain/v0/multisig.go | 17 ++-- venus-shared/api/chain/v0/proxy_gen.go | 12 ++- venus-shared/api/chain/v1/mock/full.go | 47 ++++++--- venus-shared/api/chain/v1/multisig.go | 16 +-- venus-shared/api/chain/v1/proxy_gen.go | 12 ++- .../compatible-checks/api-checksum.txt | 20 ++-- venus-shared/compatible-checks/api-diff.txt | 9 +- .../compatible-checks/api-permission.json | 3 +- 18 files changed, 326 insertions(+), 119 deletions(-) diff --git a/app/client/apiface/multisig.go b/app/client/apiface/multisig.go index 62dc207d14..a1228b42ba 100644 --- a/app/client/apiface/multisig.go +++ b/app/client/apiface/multisig.go @@ -2,7 +2,6 @@ package apiface import ( "context" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" types "github.com/filecoin-project/venus/venus-shared/chain" @@ -20,6 +19,10 @@ type IMultiSig interface { MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) // Rule[perm:sign] MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) + // MsigCancel cancels a previously-proposed multisig message + // It takes the following params: , , , , + // , , + MsigCancelTxnHash(context.Context, address.Address, uint64, address.Address, types.BigInt, address.Address, uint64, []byte) (*messagepool.MessagePrototype, error) // Rule[perm:sign] MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) // Rule[perm:sign] @@ -29,9 +32,9 @@ type IMultiSig interface { // Rule[perm:sign] MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) // Rule[perm:sign] - MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) + MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) // Rule[perm:sign] - MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) + MsigCancel(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) // Rule[perm:sign] MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*messagepool.MessagePrototype, error) // Rule[perm:read] diff --git a/app/client/apiface/v0api/multisig.go b/app/client/apiface/v0api/multisig.go index db3731c032..8989bcb11c 100644 --- a/app/client/apiface/v0api/multisig.go +++ b/app/client/apiface/v0api/multisig.go @@ -32,10 +32,13 @@ type IMultiSig interface { MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) // Rule[perm:sign] MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (cid.Cid, error) + // MsigCancel cancels a previously-proposed multisig message + // It takes the following params: , , , , + // , , // Rule[perm:sign] - MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) + MsigCancelTxnHash(context.Context, address.Address, uint64, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error) // Rule[perm:sign] - MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) + MsigCancel(ctx context.Context, msig address.Address, txID uint64, src address.Address) (cid.Cid, error) // Rule[perm:sign] MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (cid.Cid, error) // Rule[perm:read] diff --git a/app/client/full.go b/app/client/full.go index cf00e83dfd..17e05be92b 100644 --- a/app/client/full.go +++ b/app/client/full.go @@ -666,19 +666,20 @@ func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, type IMultiSigStruct struct { Internal struct { - MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` - MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigCancelTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*messagepool.MessagePrototype, error) `perm:"read"` + MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` + MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` } } @@ -698,12 +699,16 @@ func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 return s.Internal.MsigApprove(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*messagepool.MessagePrototype, error) { - return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3, p4, p5, p6, p7, p8) +func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*messagepool.MessagePrototype, error) { - return s.Internal.MsigCancel(p0, p1, p2, p3, p4, p5, p6, p7) +func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigCancel(p0, p1, p2, p3) +} + +func (s *IMultiSigStruct) MsigCancelTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigCancelTxnHash(p0, p1, p2, p3, p4, p5, p6, p7) } func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*messagepool.MessagePrototype, error) { @@ -741,7 +746,7 @@ type INetworkStruct struct { NetworkFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` NetworkFindProvidersAsync func(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo `perm:"read"` NetworkGetBandwidthStats func(p0 context.Context) metrics.Stats `perm:"admin"` - NetworkGetClosestPeers func(p0 context.Context, p1 string) (<-chan peer.ID, error) `perm:"read"` + NetworkGetClosestPeers func(p0 context.Context, p1 string) ([]peer.ID, error) `perm:"read"` NetworkGetPeerAddresses func(p0 context.Context) []ma.Multiaddr `perm:"admin"` NetworkGetPeerID func(p0 context.Context) peer.ID `perm:"admin"` NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*net.SwarmConnInfos, error) `perm:"read"` @@ -769,7 +774,7 @@ func (s *INetworkStruct) NetworkGetBandwidthStats(p0 context.Context) metrics.St return s.Internal.NetworkGetBandwidthStats(p0) } -func (s *INetworkStruct) NetworkGetClosestPeers(p0 context.Context, p1 string) (<-chan peer.ID, error) { +func (s *INetworkStruct) NetworkGetClosestPeers(p0 context.Context, p1 string) ([]peer.ID, error) { return s.Internal.NetworkGetClosestPeers(p0, p1) } diff --git a/app/client/v0api/full.go b/app/client/v0api/full.go index a879cf51aa..d417c9198f 100644 --- a/app/client/v0api/full.go +++ b/app/client/v0api/full.go @@ -651,19 +651,19 @@ func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, type IMultiSigStruct struct { Internal struct { - MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) `perm:"sign"` - MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (cid.Cid, error) `perm:"sign"` - MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` - MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) `perm:"sign"` - MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) `perm:"sign"` - MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) `perm:"sign"` - MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) `perm:"sign"` - MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` - MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) `perm:"sign"` - MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` - MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (cid.Cid, error) `perm:"sign"` - MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (cid.Cid, error) `perm:"sign"` - MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (cid.Cid, error) `perm:"sign"` + MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) `perm:"sign"` + MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (cid.Cid, error) `perm:"sign"` + MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` + MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) `perm:"sign"` + MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) `perm:"sign"` + MsigCancelTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) `perm:"sign"` + MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) `perm:"sign"` + MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` + MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) `perm:"sign"` + MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` + MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (cid.Cid, error) `perm:"sign"` + MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (cid.Cid, error) `perm:"sign"` + MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (cid.Cid, error) `perm:"sign"` } } @@ -683,12 +683,12 @@ func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 return s.Internal.MsigApprove(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) { - return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3, p4, p5, p6, p7, p8) +func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) { + return s.Internal.MsigCancel(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) { - return s.Internal.MsigCancel(p0, p1, p2, p3, p4, p5, p6, p7) +func (s *IMultiSigStruct) MsigCancelTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) { + return s.Internal.MsigCancelTxnHash(p0, p1, p2, p3, p4, p5, p6, p7) } func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) { diff --git a/app/submodule/multisig/multisig_api.go b/app/submodule/multisig/multisig_api.go index 39a566426c..ee23469013 100644 --- a/app/submodule/multisig/multisig_api.go +++ b/app/submodule/multisig/multisig_api.go @@ -113,7 +113,11 @@ func (a *multiSig) MsigAddCancel(ctx context.Context, msig address.Address, src return nil, actErr } - return a.MsigCancel(ctx, msig, txID, msig, big.Zero(), src, uint64(multisig.Methods.AddSigner), enc) + return a.MsigCancelTxnHash(ctx, msig, txID, msig, big.Zero(), src, uint64(multisig.Methods.AddSigner), enc) +} + +func (a *multiSig) MsigCancelTxnHash(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) { + return a.msigApproveOrCancelTxnHash(ctx, MsigCancel, msig, txID, src, to, amt, src, method, params) } // MsigSwapPropose proposes swapping 2 signers in the multisig @@ -146,7 +150,7 @@ func (a *multiSig) MsigSwapCancel(ctx context.Context, msig address.Address, src return nil, actErr } - return a.MsigCancel(ctx, msig, txID, msig, big.Zero(), src, uint64(multisig.Methods.SwapSigner), enc) + return a.MsigCancelTxnHash(ctx, msig, txID, msig, big.Zero(), src, uint64(multisig.Methods.SwapSigner), enc) } // MsigSwapCancel cancels a previously proposed SwapSigner message @@ -169,8 +173,8 @@ func (a *multiSig) MsigApproveTxnHash(ctx context.Context, msig address.Address, // MsigCancel cancels a previously-proposed multisig message // It takes the following params: , , , , // , , -func (a *multiSig) MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) { - return a.msigApproveOrCancelTxnHash(ctx, MsigCancel, msig, txID, src, to, amt, src, method, params) +func (a *multiSig) MsigCancel(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) { + return a.msigApproveOrCancelSimple(ctx, MsigCancel, msig, txID, src) } // MsigRemoveSigner proposes the removal of a signer from the multisig. diff --git a/app/submodule/multisig/v0api/multisig_v0api.go b/app/submodule/multisig/v0api/multisig_v0api.go index ba44f01507..3620eb4e69 100644 --- a/app/submodule/multisig/v0api/multisig_v0api.go +++ b/app/submodule/multisig/v0api/multisig_v0api.go @@ -67,8 +67,17 @@ func (a *WrapperV1IMultiSig) MsigApproveTxnHash(ctx context.Context, msig addres return a.executePrototype(ctx, p) } -func (a *WrapperV1IMultiSig) MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) { - p, err := a.IMultiSig.MsigCancel(ctx, msig, txID, to, amt, src, method, params) +func (a *WrapperV1IMultiSig) MsigCancel(ctx context.Context, msig address.Address, txID uint64, src address.Address) (cid.Cid, error) { + p, err := a.IMultiSig.MsigCancel(ctx, msig, txID, src) + if err != nil { + return cid.Undef, xerrors.Errorf("creating prototype: %w", err) + } + + return a.executePrototype(ctx, p) +} + +func (a *WrapperV1IMultiSig) MsigCancelTxnHash(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) { + p, err := a.IMultiSig.MsigCancelTxnHash(ctx, msig, txID, to, amt, src, method, params) if err != nil { return cid.Undef, xerrors.Errorf("creating prototype: %w", err) } diff --git a/cmd/multisig.go b/cmd/multisig.go index 31575ff8c6..f75b4e8c74 100644 --- a/cmd/multisig.go +++ b/cmd/multisig.go @@ -5,6 +5,8 @@ import ( "encoding/hex" "encoding/json" "fmt" + init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" + msig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" "reflect" "sort" "strconv" @@ -14,8 +16,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" - msig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" "github.com/filecoin-project/venus/app/node" sbchain "github.com/filecoin-project/venus/app/submodule/chain" "github.com/filecoin-project/venus/pkg/chain" @@ -47,6 +47,7 @@ var multisigCmd = &cmds.Command{ "approve": msigApproveCmd, "add-propose": msigAddProposeCmd, "add-approve": msigAddApproveCmd, + "cancel": msigCancelCmd, "add-cancel": msigAddCancelCmd, "swap-propose": msigSwapProposeCmd, "swap-approve": msigSwapApproveCmd, @@ -752,6 +753,98 @@ var msigAddCancelCmd = &cmds.Command{ }, } +var msigCancelCmd = &cmds.Command{ + Helptext: cmds.HelpText{ + Tagline: "Cancel a multisig message", + Usage: " [destination value [methodId methodParams]]", + }, + Options: []cmds.Option{ + cmds.StringOption("from", "account to send the propose message from)"), + }, + Arguments: []cmds.Argument{ + cmds.StringArg("multisigAddress", false, false, "a multisig address which contains from"), + cmds.StringArg("txId", false, false, "msig transaction id"), + cmds.StringArg("destinationAddress", false, false, "recipient address"), + cmds.StringArg("value", false, false, "value to transfer"), + cmds.StringArg("methodId", false, false, "method to call in the proposed message"), + cmds.StringArg("methodParams", false, false, "params to include in the proposed message"), + }, + Run: func(req *cmds.Request, emitter cmds.ResponseEmitter, env cmds.Environment) error { + var argLen = len(req.Arguments) + if argLen < 2 { + return fmt.Errorf("must pass at least multisig address and message ID") + } + + if argLen > 2 && argLen < 4 { + return fmt.Errorf("usage: msig cancel ") + } + + if argLen > 4 && argLen < 6 { + return fmt.Errorf("usage: msig cancel [ ]") + } + + msig, err := address.NewFromString(req.Arguments[0]) + if err != nil { + return err + } + + txid, err := strconv.ParseUint(req.Arguments[1], 10, 64) + if err != nil { + return err + } + + from, err := reqFromWithDefault(req, env) + if err != nil { + return err + } + + api := env.(*node.Env) + ctx := ReqContext(req.Context) + var msgCid cid.Cid + if argLen == 2 { + if msgCid, err = api.MultiSigAPI.MsigCancel(ctx, msig, txid, from); err != nil { + return err + } + } else { + dest, err := address.NewFromString(req.Arguments[2]) + if err != nil { + return err + } + + value, err := types.ParseFIL(req.Arguments[3]) + if err != nil { + return err + } + + var method uint64 + var params []byte + if argLen == 6 { + if method, err = strconv.ParseUint(req.Arguments[4], 10, 64); err != nil { + return err + } + if params, err = hex.DecodeString(req.Arguments[5]); err != nil { + return err + } + } + if msgCid, err = api.MultiSigAPI.MsigCancelTxnHash(ctx, msig, txid, dest, types.BigInt(value), + from, method, params); err != nil { + return err + } + } + fmt.Println("sent cancel in message: ", msgCid.String()) + wait, err := api.ChainAPI.StateWaitMsg(ctx, msgCid, reqConfidence(req), constants.Finality, true) + if err != nil { + return err + } + + if wait.Receipt.ExitCode != 0 { + return fmt.Errorf("cancel returned exit %d:%s", wait.Receipt.ExitCode, + wait.Receipt.ExitCode.String()) + } + return nil + }, +} + var msigSwapProposeCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "Propose to swap signers", @@ -1164,7 +1257,7 @@ var msigLockCancelCmd = &cmds.Command{ return actErr } - msgCid, err := env.(*node.Env).MultiSigAPI.MsigCancel(ctx, msig, txid, msig, big.Zero(), from, uint64(multisig.Methods.LockBalance), params) + msgCid, err := env.(*node.Env).MultiSigAPI.MsigCancelTxnHash(ctx, msig, txid, msig, big.Zero(), from, uint64(multisig.Methods.LockBalance), params) if err != nil { return err } diff --git a/tools/gen/api/stable_method_info.json b/tools/gen/api/stable_method_info.json index de50e4bd25..0e00bd2003 100644 --- a/tools/gen/api/stable_method_info.json +++ b/tools/gen/api/stable_method_info.json @@ -46,7 +46,6 @@ "MsigAddCancel": "sign", "MsigAddPropose": "sign", "MsigApprove": "sign", - "MsigApproveTxnHash": "sign", "MsigCancel": "sign", "MsigCreate": "sign", "MsigGetVested": "read", @@ -150,6 +149,7 @@ "MpoolPublishByAddr": "write", "MpoolPublishMessage": "write", "MpoolSelects": "read", + "MsigCancelTxnHash": "sign", "NetworkConnect": "read", "NetworkFindPeer": "read", "NetworkFindProvidersAsync": "read", @@ -215,6 +215,7 @@ "MarketReleaseFunds": "sign", "MarketReserveFunds": "sign", "MarketWithdraw": "sign", + "MsigApproveTxnHash": "sign", "MsigGetAvailableBalance": "read", "MsigGetPending": "read", "MsigGetVestingSchedule": "read", @@ -481,7 +482,6 @@ "MarketReleaseFunds": "sign", "MarketReserveFunds": "sign", "MarketWithdraw": "sign", - "MsigCancelTxnHash": "sign", "MsigGetAvailableBalance": "read", "MsigGetPending": "read", "MsigGetVestingSchedule": "read", @@ -524,6 +524,8 @@ "WalletValidateAddress": "read", "WalletVerify": "read" }, - "Gap": {} + "Gap": { + "MsigCancelTxnHash": "venus:read lotus:sign" + } } } \ No newline at end of file diff --git a/venus-shared/api/api-document.md b/venus-shared/api/api-document.md index e33a55c10f..61e085eee7 100644 --- a/venus-shared/api/api-document.md +++ b/venus-shared/api/api-document.md @@ -83,6 +83,7 @@ * [MsigApprove](#MsigApprove) * [MsigApproveTxnHash](#MsigApproveTxnHash) * [MsigCancel](#MsigCancel) + * [MsigCancelTxnHash](#MsigCancelTxnHash) * [MsigCreate](#MsigCreate) * [MsigGetVested](#MsigGetVested) * [MsigPropose](#MsigPropose) @@ -2685,6 +2686,42 @@ Response: ### MsigCancel +Perms: sign + +Inputs: +```json +[ + "t01234", + 42, + "t01234" +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` + +### MsigCancelTxnHash + + Perms: sign Inputs: diff --git a/venus-shared/api/chain/v0/mock/full.go b/venus-shared/api/chain/v0/mock/full.go index 051d499b14..09d22e588f 100644 --- a/venus-shared/api/chain/v0/mock/full.go +++ b/venus-shared/api/chain/v0/mock/full.go @@ -1004,18 +1004,33 @@ func (mr *MockFullNodeMockRecorder) MsigApproveTxnHash(arg0, arg1, arg2, arg3, a } // MsigCancel mocks base method. -func (m *MockFullNode) MsigCancel(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address, arg4 big.Int, arg5 address.Address, arg6 uint64, arg7 []byte) (cid.Cid, error) { +func (m *MockFullNode) MsigCancel(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address) (cid.Cid, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "MsigCancel", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) + ret := m.ctrl.Call(m, "MsigCancel", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(cid.Cid) ret1, _ := ret[1].(error) return ret0, ret1 } // MsigCancel indicates an expected call of MsigCancel. -func (mr *MockFullNodeMockRecorder) MsigCancel(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 interface{}) *gomock.Call { +func (mr *MockFullNodeMockRecorder) MsigCancel(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigCancel", reflect.TypeOf((*MockFullNode)(nil).MsigCancel), arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigCancel", reflect.TypeOf((*MockFullNode)(nil).MsigCancel), arg0, arg1, arg2, arg3) +} + +// MsigCancelTxnHash mocks base method. +func (m *MockFullNode) MsigCancelTxnHash(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address, arg4 big.Int, arg5 address.Address, arg6 uint64, arg7 []byte) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigCancelTxnHash", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigCancelTxnHash indicates an expected call of MsigCancelTxnHash. +func (mr *MockFullNodeMockRecorder) MsigCancelTxnHash(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigCancelTxnHash", reflect.TypeOf((*MockFullNode)(nil).MsigCancelTxnHash), arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) } // MsigCreate mocks base method. @@ -2342,18 +2357,18 @@ func (mr *MockFullNodeMockRecorder) WalletDefaultAddress(arg0 interface{}) *gomo } // WalletExport mocks base method. -func (m *MockFullNode) WalletExport(arg0 address.Address, arg1 string) (*wallet.KeyInfo, error) { +func (m *MockFullNode) WalletExport(arg0 context.Context, arg1 address.Address, arg2 string) (*wallet.KeyInfo, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WalletExport", arg0, arg1) + ret := m.ctrl.Call(m, "WalletExport", arg0, arg1, arg2) ret0, _ := ret[0].(*wallet.KeyInfo) ret1, _ := ret[1].(error) return ret0, ret1 } // WalletExport indicates an expected call of WalletExport. -func (mr *MockFullNodeMockRecorder) WalletExport(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockFullNodeMockRecorder) WalletExport(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletExport", reflect.TypeOf((*MockFullNode)(nil).WalletExport), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletExport", reflect.TypeOf((*MockFullNode)(nil).WalletExport), arg0, arg1, arg2) } // WalletHas mocks base method. @@ -2372,33 +2387,33 @@ func (mr *MockFullNodeMockRecorder) WalletHas(arg0, arg1 interface{}) *gomock.Ca } // WalletImport mocks base method. -func (m *MockFullNode) WalletImport(arg0 *wallet.KeyInfo) (address.Address, error) { +func (m *MockFullNode) WalletImport(arg0 context.Context, arg1 *wallet.KeyInfo) (address.Address, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WalletImport", arg0) + ret := m.ctrl.Call(m, "WalletImport", arg0, arg1) ret0, _ := ret[0].(address.Address) ret1, _ := ret[1].(error) return ret0, ret1 } // WalletImport indicates an expected call of WalletImport. -func (mr *MockFullNodeMockRecorder) WalletImport(arg0 interface{}) *gomock.Call { +func (mr *MockFullNodeMockRecorder) WalletImport(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletImport", reflect.TypeOf((*MockFullNode)(nil).WalletImport), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletImport", reflect.TypeOf((*MockFullNode)(nil).WalletImport), arg0, arg1) } // WalletNewAddress mocks base method. -func (m *MockFullNode) WalletNewAddress(arg0 byte) (address.Address, error) { +func (m *MockFullNode) WalletNewAddress(arg0 context.Context, arg1 byte) (address.Address, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WalletNewAddress", arg0) + ret := m.ctrl.Call(m, "WalletNewAddress", arg0, arg1) ret0, _ := ret[0].(address.Address) ret1, _ := ret[1].(error) return ret0, ret1 } // WalletNewAddress indicates an expected call of WalletNewAddress. -func (mr *MockFullNodeMockRecorder) WalletNewAddress(arg0 interface{}) *gomock.Call { +func (mr *MockFullNodeMockRecorder) WalletNewAddress(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletNewAddress", reflect.TypeOf((*MockFullNode)(nil).WalletNewAddress), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletNewAddress", reflect.TypeOf((*MockFullNode)(nil).WalletNewAddress), arg0, arg1) } // WalletSetDefault mocks base method. diff --git a/venus-shared/api/chain/v0/multisig.go b/venus-shared/api/chain/v0/multisig.go index fbb98798a3..6cbf8dbe70 100644 --- a/venus-shared/api/chain/v0/multisig.go +++ b/venus-shared/api/chain/v0/multisig.go @@ -2,7 +2,6 @@ package v0 import ( "context" - "github.com/ipfs/go-cid" "github.com/filecoin-project/go-address" @@ -15,17 +14,21 @@ type IMultiSig interface { // MsigCreate creates a multisig wallet // It takes the following params: , , //, , - MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, chain.BigInt, address.Address, chain.BigInt) (cid.Cid, error) //perm:sign - MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) //perm:sign - MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (cid.Cid, error) //perm:sign - MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (cid.Cid, error) //perm:sign - MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (cid.Cid, error) //perm:sign + MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, chain.BigInt, address.Address, chain.BigInt) (cid.Cid, error) //perm:sign + MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) //perm:sign + MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (cid.Cid, error) //perm:sign + MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (cid.Cid, error) //perm:sign + MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (cid.Cid, error) //perm:sign + // MsigCancel cancels a previously-proposed multisig message + // It takes the following params: , , , , + // , , + MsigCancelTxnHash(context.Context, address.Address, uint64, address.Address, chain.BigInt, address.Address, uint64, []byte) (cid.Cid, error) //perm:sign MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) //perm:sign MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) //perm:sign MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) //perm:sign MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (cid.Cid, error) //perm:sign MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) //perm:sign - MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) //perm:sign + MsigCancel(ctx context.Context, msig address.Address, txID uint64, src address.Address) (cid.Cid, error) //perm:sign MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (cid.Cid, error) //perm:sign MsigGetVested(ctx context.Context, addr address.Address, start chain.TipSetKey, end chain.TipSetKey) (chain.BigInt, error) //perm:read } diff --git a/venus-shared/api/chain/v0/proxy_gen.go b/venus-shared/api/chain/v0/proxy_gen.go index a5f38e9d93..f54ca9a5db 100644 --- a/venus-shared/api/chain/v0/proxy_gen.go +++ b/venus-shared/api/chain/v0/proxy_gen.go @@ -700,7 +700,9 @@ type IMultiSigStruct struct { MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 chain.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) `perm:"sign"` - MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 chain.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) `perm:"sign"` + MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) `perm:"sign"` + + MsigCancelTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 chain.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) `perm:"sign"` MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 chain.BigInt, p5 address.Address, p6 chain.BigInt) (cid.Cid, error) `perm:"sign"` @@ -738,8 +740,12 @@ func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Addr return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3, p4, p5, p6, p7, p8) } -func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 chain.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) { - return s.Internal.MsigCancel(p0, p1, p2, p3, p4, p5, p6, p7) +func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) { + return s.Internal.MsigCancel(p0, p1, p2, p3) +} + +func (s *IMultiSigStruct) MsigCancelTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 chain.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) { + return s.Internal.MsigCancelTxnHash(p0, p1, p2, p3, p4, p5, p6, p7) } func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 chain.BigInt, p5 address.Address, p6 chain.BigInt) (cid.Cid, error) { diff --git a/venus-shared/api/chain/v1/mock/full.go b/venus-shared/api/chain/v1/mock/full.go index d7ca9b2ac5..a25825150b 100644 --- a/venus-shared/api/chain/v1/mock/full.go +++ b/venus-shared/api/chain/v1/mock/full.go @@ -1064,18 +1064,33 @@ func (mr *MockFullNodeMockRecorder) MsigApproveTxnHash(arg0, arg1, arg2, arg3, a } // MsigCancel mocks base method. -func (m *MockFullNode) MsigCancel(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address, arg4 big.Int, arg5 address.Address, arg6 uint64, arg7 []byte) (*messagepool.MessagePrototype, error) { +func (m *MockFullNode) MsigCancel(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address) (*messagepool.MessagePrototype, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "MsigCancel", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) + ret := m.ctrl.Call(m, "MsigCancel", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*messagepool.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } // MsigCancel indicates an expected call of MsigCancel. -func (mr *MockFullNodeMockRecorder) MsigCancel(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 interface{}) *gomock.Call { +func (mr *MockFullNodeMockRecorder) MsigCancel(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigCancel", reflect.TypeOf((*MockFullNode)(nil).MsigCancel), arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigCancel", reflect.TypeOf((*MockFullNode)(nil).MsigCancel), arg0, arg1, arg2, arg3) +} + +// MsigCancelTxnHash mocks base method. +func (m *MockFullNode) MsigCancelTxnHash(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address, arg4 big.Int, arg5 address.Address, arg6 uint64, arg7 []byte) (*messagepool.MessagePrototype, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigCancelTxnHash", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) + ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigCancelTxnHash indicates an expected call of MsigCancelTxnHash. +func (mr *MockFullNodeMockRecorder) MsigCancelTxnHash(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigCancelTxnHash", reflect.TypeOf((*MockFullNode)(nil).MsigCancelTxnHash), arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) } // MsigCreate mocks base method. @@ -2387,18 +2402,18 @@ func (mr *MockFullNodeMockRecorder) WalletDefaultAddress(arg0 interface{}) *gomo } // WalletExport mocks base method. -func (m *MockFullNode) WalletExport(arg0 address.Address, arg1 string) (*wallet.KeyInfo, error) { +func (m *MockFullNode) WalletExport(arg0 context.Context, arg1 address.Address, arg2 string) (*wallet.KeyInfo, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WalletExport", arg0, arg1) + ret := m.ctrl.Call(m, "WalletExport", arg0, arg1, arg2) ret0, _ := ret[0].(*wallet.KeyInfo) ret1, _ := ret[1].(error) return ret0, ret1 } // WalletExport indicates an expected call of WalletExport. -func (mr *MockFullNodeMockRecorder) WalletExport(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockFullNodeMockRecorder) WalletExport(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletExport", reflect.TypeOf((*MockFullNode)(nil).WalletExport), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletExport", reflect.TypeOf((*MockFullNode)(nil).WalletExport), arg0, arg1, arg2) } // WalletHas mocks base method. @@ -2417,33 +2432,33 @@ func (mr *MockFullNodeMockRecorder) WalletHas(arg0, arg1 interface{}) *gomock.Ca } // WalletImport mocks base method. -func (m *MockFullNode) WalletImport(arg0 *wallet.KeyInfo) (address.Address, error) { +func (m *MockFullNode) WalletImport(arg0 context.Context, arg1 *wallet.KeyInfo) (address.Address, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WalletImport", arg0) + ret := m.ctrl.Call(m, "WalletImport", arg0, arg1) ret0, _ := ret[0].(address.Address) ret1, _ := ret[1].(error) return ret0, ret1 } // WalletImport indicates an expected call of WalletImport. -func (mr *MockFullNodeMockRecorder) WalletImport(arg0 interface{}) *gomock.Call { +func (mr *MockFullNodeMockRecorder) WalletImport(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletImport", reflect.TypeOf((*MockFullNode)(nil).WalletImport), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletImport", reflect.TypeOf((*MockFullNode)(nil).WalletImport), arg0, arg1) } // WalletNewAddress mocks base method. -func (m *MockFullNode) WalletNewAddress(arg0 byte) (address.Address, error) { +func (m *MockFullNode) WalletNewAddress(arg0 context.Context, arg1 byte) (address.Address, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WalletNewAddress", arg0) + ret := m.ctrl.Call(m, "WalletNewAddress", arg0, arg1) ret0, _ := ret[0].(address.Address) ret1, _ := ret[1].(error) return ret0, ret1 } // WalletNewAddress indicates an expected call of WalletNewAddress. -func (mr *MockFullNodeMockRecorder) WalletNewAddress(arg0 interface{}) *gomock.Call { +func (mr *MockFullNodeMockRecorder) WalletNewAddress(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletNewAddress", reflect.TypeOf((*MockFullNode)(nil).WalletNewAddress), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletNewAddress", reflect.TypeOf((*MockFullNode)(nil).WalletNewAddress), arg0, arg1) } // WalletSetDefault mocks base method. diff --git a/venus-shared/api/chain/v1/multisig.go b/venus-shared/api/chain/v1/multisig.go index e72eac71fb..f65d7a9662 100644 --- a/venus-shared/api/chain/v1/multisig.go +++ b/venus-shared/api/chain/v1/multisig.go @@ -11,17 +11,21 @@ import ( ) type IMultiSig interface { - MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val chain.BigInt, src address.Address, gp chain.BigInt) (*messagepool.MessagePrototype, error) //perm:sign - MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) //perm:sign - MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) //perm:sign - MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) //perm:sign - MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) //perm:sign + MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val chain.BigInt, src address.Address, gp chain.BigInt) (*messagepool.MessagePrototype, error) //perm:sign + MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) //perm:sign + MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) //perm:sign + MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) //perm:sign + MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) //perm:sign + // MsigCancel cancels a previously-proposed multisig message + // It takes the following params: , , , , + // , , + MsigCancelTxnHash(context.Context, address.Address, uint64, address.Address, chain.BigInt, address.Address, uint64, []byte) (*messagepool.MessagePrototype, error) //perm:sign MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) //perm:sign MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) //perm:sign MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) //perm:sign MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) //perm:sign MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) //perm:sign - MsigCancel(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) //perm:sign + MsigCancel(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) //perm:sign MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*messagepool.MessagePrototype, error) //perm:sign MsigGetVested(ctx context.Context, addr address.Address, start chain.TipSetKey, end chain.TipSetKey) (chain.BigInt, error) //perm:read } diff --git a/venus-shared/api/chain/v1/proxy_gen.go b/venus-shared/api/chain/v1/proxy_gen.go index f129eee8bd..7fc673df04 100644 --- a/venus-shared/api/chain/v1/proxy_gen.go +++ b/venus-shared/api/chain/v1/proxy_gen.go @@ -718,7 +718,9 @@ type IMultiSigStruct struct { MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 chain.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 chain.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + + MsigCancelTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 chain.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 chain.BigInt, p5 address.Address, p6 chain.BigInt) (*messagepool.MessagePrototype, error) `perm:"sign"` @@ -756,8 +758,12 @@ func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Addr return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3, p4, p5, p6, p7, p8) } -func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 chain.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*messagepool.MessagePrototype, error) { - return s.Internal.MsigCancel(p0, p1, p2, p3, p4, p5, p6, p7) +func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigCancel(p0, p1, p2, p3) +} + +func (s *IMultiSigStruct) MsigCancelTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 chain.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*messagepool.MessagePrototype, error) { + return s.Internal.MsigCancelTxnHash(p0, p1, p2, p3, p4, p5, p6, p7) } func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 chain.BigInt, p5 address.Address, p6 chain.BigInt) (*messagepool.MessagePrototype, error) { diff --git a/venus-shared/compatible-checks/api-checksum.txt b/venus-shared/compatible-checks/api-checksum.txt index 4b076d1fcd..7ce0948a9d 100644 --- a/venus-shared/compatible-checks/api-checksum.txt +++ b/venus-shared/compatible-checks/api-checksum.txt @@ -1,6 +1,6 @@ v0api.FullNode: - AuthNew: In=2, Out=2, CheckSum=faeef9dc68d6f2533bdf7d8f22ef902d - AuthVerify: In=2, Out=2, CheckSum=3cb63db9d6f8869fd4e9da953cc9cdcb + AuthNew: In=2, Out=2, CheckSum=248fe5ed43f2e294ea5d71596b9272ac + AuthVerify: In=2, Out=2, CheckSum=c156d52455ed5f2d227e08a518d5f8a1 BeaconGetEntry: In=2, Out=2, CheckSum=c74f5c0f4039207ea45c11bfe3319c38 ChainDeleteObj: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 ChainExport: In=4, Out=2, CheckSum=aaf98926e0ba36ec808a96de76a3cd98 @@ -46,9 +46,9 @@ v0api.FullNode: ClientQueryAsk: In=3, Out=2, CheckSum=2d06866277cf890ee42baa4bacffb2fc ClientRemoveImport: In=2, Out=1, CheckSum=a3fcb78bf5bac553baac584941c1771f ClientRestartDataTransfer: In=4, Out=1, CheckSum=074398536c75e25946c7f709574e0cdc - ClientRetrieve: In=3, Out=1, CheckSum=33b5ec01d4c4b4a635ab1e7ba1db7387 + ClientRetrieve: In=3, Out=1, CheckSum=3b17e80e3a84f40959f87bff6359a49d ClientRetrieveTryRestartInsufficientFunds: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 - ClientRetrieveWithEvents: In=3, Out=2, CheckSum=c98dd52dccd96ec2fa8be621fa35a8a8 + ClientRetrieveWithEvents: In=3, Out=2, CheckSum=56e4fa49192938527c1f089b446f0860 ClientStartDeal: In=2, Out=2, CheckSum=85256e9ef86dbb8ebeb76097c3eea078 ClientStatelessDeal: In=2, Out=2, CheckSum=85256e9ef86dbb8ebeb76097c3eea078 Closing: In=1, Out=2, CheckSum=3e0dae65a2378c12be14cee8a60a3bfe @@ -207,8 +207,8 @@ v0api.FullNode: WalletVerify: In=4, Out=2, CheckSum=9b22231e95efdfb94d9d55038f500636 api.FullNode: - AuthNew: In=2, Out=2, CheckSum=faeef9dc68d6f2533bdf7d8f22ef902d - AuthVerify: In=2, Out=2, CheckSum=3cb63db9d6f8869fd4e9da953cc9cdcb + AuthNew: In=2, Out=2, CheckSum=248fe5ed43f2e294ea5d71596b9272ac + AuthVerify: In=2, Out=2, CheckSum=c156d52455ed5f2d227e08a518d5f8a1 BeaconGetEntry: In=2, Out=2, CheckSum=c74f5c0f4039207ea45c11bfe3319c38 ChainBlockstoreInfo: In=1, Out=2, CheckSum=09640e20c6d71c3e96c7a56c8698acc9 ChainCheckBlockstore: In=1, Out=1, CheckSum=c39be30cc5a8826024fcf4d23e7017d6 @@ -239,6 +239,7 @@ api.FullNode: ClientDataTransferUpdates: In=1, Out=2, CheckSum=2d33b419e4b215c06ab0e8b66b5f8430 ClientDealPieceCID: In=2, Out=2, CheckSum=93537a844ba6b74ec1ce82c887359a75 ClientDealSize: In=2, Out=2, CheckSum=cca1dd5f58136af28546bdbdef2f948a + ClientExport: In=3, Out=1, CheckSum=77c3a3632e06654aee2dade7aa467433 ClientFindData: In=3, Out=2, CheckSum=232da9eb987d92a76b37572c8f44bf53 ClientGenCar: In=3, Out=1, CheckSum=b8a0c89fc2c7c16464ac968865e9c156 ClientGetDealInfo: In=2, Out=2, CheckSum=e67f0e7b88aff099976b0f275b601c9c @@ -255,9 +256,9 @@ api.FullNode: ClientQueryAsk: In=3, Out=2, CheckSum=2d06866277cf890ee42baa4bacffb2fc ClientRemoveImport: In=2, Out=1, CheckSum=a3fcb78bf5bac553baac584941c1771f ClientRestartDataTransfer: In=4, Out=1, CheckSum=074398536c75e25946c7f709574e0cdc - ClientRetrieve: In=3, Out=1, CheckSum=33b5ec01d4c4b4a635ab1e7ba1db7387 + ClientRetrieve: In=2, Out=2, CheckSum=b941d6f05cbec209e2f347b6826717e1 ClientRetrieveTryRestartInsufficientFunds: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 - ClientRetrieveWithEvents: In=3, Out=2, CheckSum=c98dd52dccd96ec2fa8be621fa35a8a8 + ClientRetrieveWait: In=2, Out=1, CheckSum=d289f4c3758ed7d6ab991b2cf569c969 ClientStartDeal: In=2, Out=2, CheckSum=85256e9ef86dbb8ebeb76097c3eea078 ClientStatelessDeal: In=2, Out=2, CheckSum=85256e9ef86dbb8ebeb76097c3eea078 Closing: In=1, Out=2, CheckSum=3e0dae65a2378c12be14cee8a60a3bfe @@ -299,7 +300,8 @@ api.FullNode: MsigAddPropose: In=5, Out=2, CheckSum=801a2539853f3e7206fd87fc4171c40b MsigApprove: In=4, Out=2, CheckSum=3384d4133b5559461f919c3bdb1dac41 MsigApproveTxnHash: In=9, Out=2, CheckSum=9a7460af699e6aa82452157078046018 - MsigCancel: In=8, Out=2, CheckSum=912010a9da971230c20e5503503e33e2 + MsigCancel: In=4, Out=2, CheckSum=3384d4133b5559461f919c3bdb1dac41 + MsigCancelTxnHash: In=8, Out=2, CheckSum=912010a9da971230c20e5503503e33e2 MsigCreate: In=7, Out=2, CheckSum=3b8196718c58238e8579cd1e2b8368d9 MsigGetAvailableBalance: In=3, Out=2, CheckSum=a05010da3c73edfba49c3b5d28a216cd MsigGetPending: In=3, Out=2, CheckSum=895d889866adf330c83b8dffdbd27fac diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt index 1b0ed0315f..82ef5cd335 100644 --- a/venus-shared/compatible-checks/api-diff.txt +++ b/venus-shared/compatible-checks/api-diff.txt @@ -24,6 +24,7 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c - ClientDataTransferUpdates - ClientDealPieceCID - ClientDealSize + - ClientExport - ClientFindData - ClientGenCar - ClientGetDealInfo @@ -42,7 +43,7 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c - ClientRestartDataTransfer - ClientRetrieve - ClientRetrieveTryRestartInsufficientFunds - - ClientRetrieveWithEvents + - ClientRetrieveWait - ClientStartDeal - ClientStatelessDeal - Closing @@ -109,8 +110,6 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c + NetworkGetPeerID + NetworkPeers - NodeStatus - - PaychGetWaitReady - + PaychGetWaitsigny + ProtocolParameters + ResolveToKeyAddr - Session @@ -173,14 +172,14 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c - SyncUnmarkAllBad - SyncUnmarkBad - SyncValidateTipset + + SyncerTracker + UnLockWallet + Verify + VerifyEntry > Version {[func(context.Context) (chain.Version, error) <> func(context.Context) (api.APIVersion, error)] base=func out type: #0 input; nested={[chain.Version <> api.APIVersion] base=struct field; nested={[chain.Version <> api.APIVersion] base=exported fields count: 2 != 3; nested=nil}}} + WalletAddresses - WalletDelete - > WalletExport {[func(address.Address, string) (*wallet.KeyInfo, error) <> func(context.Context, address.Address) (*types.KeyInfo, error)] base=func in type: #0 input; nested={[address.Address <> context.Context] base=type kinds: struct != interface; nested=nil}} - > WalletImport {[func(*wallet.KeyInfo) (address.Address, error) <> func(context.Context, *types.KeyInfo) (address.Address, error)] base=func in num: 1 != 2; nested=nil} + > WalletExport {[func(context.Context, address.Address, string) (*wallet.KeyInfo, error) <> func(context.Context, address.Address) (*types.KeyInfo, error)] base=func in num: 3 != 2; nested=nil} - WalletList - WalletNew + WalletNewAddress diff --git a/venus-shared/compatible-checks/api-permission.json b/venus-shared/compatible-checks/api-permission.json index 5cfbc85f1a..180283f83c 100644 --- a/venus-shared/compatible-checks/api-permission.json +++ b/venus-shared/compatible-checks/api-permission.json @@ -144,6 +144,7 @@ "MpoolPublishByAddr": "admin", "MpoolPublishMessage": "admin", "MpoolSelects": "read", + "MsigCancelTxnHash": "sign", "NetworkConnect": "read", "NetworkFindPeer": "read", "NetworkFindProvidersAsync": "read", @@ -304,6 +305,7 @@ "MsigApprove": "sign", "MsigApproveTxnHash": "sign", "MsigCancel": "sign", + "MsigCancelTxnHash": "sign", "MsigCreate": "sign", "MsigGetVested": "read", "MsigPropose": "sign", @@ -469,7 +471,6 @@ "MarketReleaseFunds": "sign", "MarketReserveFunds": "sign", "MarketWithdraw": "sign", - "MsigCancelTxnHash": "sign", "MsigGetAvailableBalance": "read", "MsigGetPending": "read", "MsigGetVestingSchedule": "read", From c89f464b4c352e082f1e881a02db585f2b8d996e Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Thu, 6 Jan 2022 09:27:27 +0800 Subject: [PATCH 101/167] merge type pkg (#4674) --- app/client/apiface/blockstore.go | 6 +- app/client/apiface/chain.go | 39 +- app/client/apiface/market.go | 5 +- app/client/apiface/mining.go | 7 +- app/client/apiface/mpool.go | 24 +- app/client/apiface/multisig.go | 30 +- app/client/apiface/network.go | 11 +- app/client/apiface/paych.go | 17 +- app/client/apiface/syncer.go | 7 +- app/client/apiface/v0api/blockstore.go | 6 +- app/client/apiface/v0api/chain.go | 43 +- app/client/apiface/v0api/market.go | 5 +- app/client/apiface/v0api/mining.go | 7 +- app/client/apiface/v0api/mpool.go | 18 +- app/client/apiface/v0api/multisig.go | 2 +- app/client/apiface/v0api/network.go | 10 +- app/client/apiface/v0api/paych.go | 17 +- app/client/apiface/v0api/syncer.go | 7 +- app/client/apiface/v0api/wallet.go | 5 +- app/client/apiface/wallet.go | 5 +- app/client/full.go | 347 ++++++------ app/client/v0api/full.go | 289 +++++----- app/node/builder.go | 2 +- app/node/helpers.go | 2 +- app/node/test/node.go | 2 +- app/submodule/apitypes/chain.go | 2 +- app/submodule/apitypes/mining.go | 2 +- app/submodule/apitypes/mpool.go | 2 +- app/submodule/apitypes/syncer.go | 5 +- app/submodule/blockstore/blockstore_api.go | 11 +- app/submodule/chain/account_api.go | 2 +- app/submodule/chain/actor_api.go | 2 +- app/submodule/chain/beacon_api.go | 2 +- app/submodule/chain/chain_submodule.go | 2 +- app/submodule/chain/chaininfo_api.go | 51 +- app/submodule/chain/miner_api.go | 71 ++- app/submodule/chain/v0api/chaininfo_v0api.go | 11 +- .../discovery/discovery_submodule.go | 2 +- app/submodule/market/market_api.go | 9 +- app/submodule/mining/mining_api.go | 16 +- app/submodule/mpool/mpool_api.go | 28 +- app/submodule/mpool/mpool_submodule.go | 2 +- app/submodule/multisig/multisig_api.go | 41 +- .../multisig/v0api/multisig_v0api.go | 5 +- app/submodule/network/network_api.go | 12 +- app/submodule/network/network_submodule.go | 2 +- app/submodule/network/v0api/v1_wrapper.go | 7 +- app/submodule/paych/paych_api.go | 24 +- app/submodule/syncer/chain_sync.go | 2 +- app/submodule/syncer/syncer_api.go | 45 +- app/submodule/syncer/syncer_submodule.go | 2 +- app/submodule/wallet/remotewallet/api.go | 3 +- app/submodule/wallet/remotewallet/keymap.go | 3 +- app/submodule/wallet/remotewallet/remote.go | 3 +- app/submodule/wallet/wallet_api.go | 11 +- app/submodule/wallet/wallet_submodule.go | 2 +- cmd/address.go | 5 +- cmd/chain.go | 7 +- cmd/daemon.go | 2 +- cmd/dispute.go | 7 +- cmd/main.go | 2 +- cmd/message.go | 2 +- cmd/miner.go | 4 +- cmd/miner_actor.go | 2 +- cmd/miner_proving.go | 2 +- cmd/mpool.go | 10 +- cmd/multisig.go | 7 +- cmd/paych.go | 5 +- cmd/protocol.go | 4 +- cmd/seed.go | 2 +- cmd/show.go | 2 +- cmd/show_test.go | 2 +- cmd/state.go | 5 +- cmd/swarm.go | 6 +- cmd/sync.go | 9 +- pkg/beacon/beacon.go | 2 +- pkg/beacon/drand.go | 2 +- pkg/beacon/mock.go | 2 +- pkg/chain/chain_index.go | 2 +- pkg/chain/circulating_supply.go | 2 +- pkg/chain/circulating_supply_mock.go | 2 +- pkg/chain/coalescer.go | 2 +- pkg/chain/coalescer_test.go | 2 +- pkg/chain/message_store.go | 2 +- pkg/chain/message_store_test.go | 2 +- pkg/chain/randomness.go | 2 +- pkg/chain/reorg.go | 2 +- pkg/chain/reorg_test.go | 2 +- pkg/chain/store.go | 17 +- pkg/chain/store_test.go | 5 +- pkg/chain/testing.go | 2 +- pkg/chain/tip_index.go | 2 +- pkg/chain/traversal.go | 2 +- pkg/chain/traversal_test.go | 2 +- pkg/chain/utils.go | 3 +- pkg/chain/waiter.go | 23 +- pkg/chain/waiter_test.go | 6 +- pkg/chainsync/chainsync.go | 2 +- pkg/chainsync/dispatcher/dispatcher.go | 2 +- pkg/chainsync/dispatcher/dispatcher_test.go | 2 +- pkg/chainsync/exchange/cbor_gen.go | 2 +- pkg/chainsync/exchange/client.go | 2 +- pkg/chainsync/exchange/interfaces.go | 2 +- pkg/chainsync/exchange/protocol.go | 2 +- pkg/chainsync/exchange/server.go | 2 +- pkg/chainsync/slashfilter/mysqldb.go | 2 +- pkg/chainsync/slashfilter/slashfilter.go | 2 +- pkg/chainsync/syncer/syncer.go | 2 +- .../syncer/syncer_integration_test.go | 2 +- pkg/chainsync/syncer/syncer_test.go | 2 +- pkg/chainsync/types/bad_tipset_cache.go | 2 +- pkg/chainsync/types/target_tracker.go | 2 +- pkg/config/config.go | 2 +- pkg/consensus/block_validator.go | 2 +- pkg/consensus/chain_selector.go | 2 +- pkg/consensus/expected.go | 4 +- pkg/consensus/head_randomness.go | 2 +- pkg/consensus/message_validator.go | 2 +- pkg/consensus/message_validator_test.go | 2 +- pkg/consensus/processor.go | 2 +- pkg/consensus/protocol.go | 2 +- pkg/consensus/testing.go | 2 +- pkg/consensus/ticket.go | 2 +- pkg/consensus/ticket_test.go | 2 +- pkg/consensus/weight_test.go | 2 +- pkg/consensusfault/check.go | 2 +- pkg/discovery/hello_protocol.go | 2 +- pkg/discovery/hello_protocol_test.go | 2 +- pkg/discovery/peer_tracker.go | 2 +- pkg/discovery/peer_tracker_test.go | 2 +- pkg/events/cache.go | 9 +- pkg/events/eventAPI.go | 11 +- pkg/events/events.go | 2 +- pkg/events/events_called.go | 2 +- pkg/events/events_height.go | 2 +- pkg/events/events_test.go | 35 +- pkg/events/message_cache.go | 8 +- pkg/events/observer.go | 6 +- pkg/events/state/fastapi.go | 2 +- pkg/events/state/mock/api.go | 2 +- pkg/events/state/mock/tipset.go | 2 +- pkg/events/state/predicates.go | 2 +- pkg/events/state/predicates_test.go | 2 +- pkg/events/tscache.go | 2 +- pkg/events/tscache_test.go | 2 +- pkg/events/utils.go | 2 +- pkg/fork/fork.go | 5 +- pkg/fork/mock.go | 2 +- pkg/gen/genesis/f00_system.go | 2 +- pkg/gen/genesis/f01_init.go | 2 +- pkg/gen/genesis/f02_reward.go | 2 +- pkg/gen/genesis/f03_cron.go | 2 +- pkg/gen/genesis/f04_power.go | 2 +- pkg/gen/genesis/f05_market.go | 2 +- pkg/gen/genesis/f06_vreg.go | 2 +- pkg/gen/genesis/genesis.go | 2 +- pkg/gen/genesis/miners.go | 2 +- pkg/gen/genesis/util.go | 2 +- pkg/genesis/genesis.go | 2 +- pkg/genesis/init.go | 2 +- pkg/market/fmgr.go | 15 +- pkg/market/fundmanager.go | 2 +- pkg/market/fundmanager_test.go | 13 +- pkg/messagepool/check.go | 85 ++- pkg/messagepool/gas.go | 17 +- pkg/messagepool/gasguess/guessgas.go | 2 +- pkg/messagepool/messagepool.go | 20 +- pkg/messagepool/messagepool_test.go | 9 +- pkg/messagepool/messagesigner.go | 8 +- pkg/messagepool/messagesigner_test.go | 2 +- pkg/messagepool/provider.go | 2 +- pkg/messagepool/pruning.go | 2 +- pkg/messagepool/repub.go | 2 +- pkg/messagepool/selection.go | 2 +- pkg/messagepool/selection_test.go | 10 +- pkg/metrics/heartbeat.go | 2 +- pkg/metrics/heartbeat_test.go | 2 +- pkg/net/blocksub/validator.go | 2 +- pkg/net/blocksub/validator_test.go | 2 +- pkg/net/msgsub/validator.go | 2 +- pkg/net/network.go | 20 +- pkg/paychmgr/manager.go | 15 +- pkg/paychmgr/mock_test.go | 11 +- pkg/paychmgr/paych.go | 10 +- pkg/paychmgr/paych_test.go | 2 +- pkg/paychmgr/paychget_test.go | 2 +- pkg/paychmgr/paychvoucherfunds_test.go | 2 +- pkg/paychmgr/pcapi.go | 20 +- pkg/paychmgr/settler/settler.go | 6 +- pkg/paychmgr/settler/stl.go | 15 +- pkg/paychmgr/simple.go | 11 +- pkg/paychmgr/state.go | 2 +- pkg/state/power_table_view_test.go | 2 +- pkg/state/signer.go | 2 +- pkg/state/sigval.go | 2 +- pkg/state/sigval_test.go | 2 +- pkg/state/tree/snapshot.go | 2 +- pkg/state/tree/state.go | 2 +- pkg/state/tree/state_test.go | 2 +- pkg/state/tree/testing.go | 2 +- pkg/state/view.go | 13 +- pkg/statemanger/call.go | 2 +- pkg/statemanger/state_manger.go | 2 +- pkg/testhelpers/cid.go | 2 +- pkg/testhelpers/consensus.go | 2 +- pkg/testhelpers/core.go | 2 +- pkg/testhelpers/message.go | 2 +- pkg/testhelpers/net.go | 2 +- pkg/testhelpers/test_daemon.go | 2 +- pkg/testhelpers/tipset.go | 2 +- .../specactors/builtin/account/account.go | 5 +- pkg/types/specactors/builtin/account/v0.go | 4 +- pkg/types/specactors/builtin/account/v2.go | 4 +- pkg/types/specactors/builtin/account/v3.go | 4 +- pkg/types/specactors/builtin/account/v4.go | 4 +- pkg/types/specactors/builtin/account/v5.go | 4 +- pkg/types/specactors/builtin/account/v6.go | 4 +- pkg/types/specactors/builtin/account/v7.go | 4 +- pkg/types/specactors/builtin/builtin.go | 446 ++++++++------- pkg/types/specactors/builtin/cron/cron.go | 6 +- pkg/types/specactors/builtin/cron/v0.go | 2 +- pkg/types/specactors/builtin/cron/v2.go | 2 +- pkg/types/specactors/builtin/cron/v3.go | 2 +- pkg/types/specactors/builtin/cron/v4.go | 2 +- pkg/types/specactors/builtin/cron/v5.go | 2 +- pkg/types/specactors/builtin/cron/v6.go | 2 +- pkg/types/specactors/builtin/cron/v7.go | 2 +- pkg/types/specactors/builtin/init/init.go | 6 +- pkg/types/specactors/builtin/init/v0.go | 19 +- pkg/types/specactors/builtin/init/v2.go | 19 +- pkg/types/specactors/builtin/init/v3.go | 19 +- pkg/types/specactors/builtin/init/v4.go | 19 +- pkg/types/specactors/builtin/init/v5.go | 19 +- pkg/types/specactors/builtin/init/v6.go | 19 +- pkg/types/specactors/builtin/init/v7.go | 19 +- pkg/types/specactors/builtin/market/market.go | 65 ++- pkg/types/specactors/builtin/market/v0.go | 34 +- pkg/types/specactors/builtin/market/v2.go | 34 +- pkg/types/specactors/builtin/market/v3.go | 26 +- pkg/types/specactors/builtin/market/v4.go | 26 +- pkg/types/specactors/builtin/market/v5.go | 26 +- pkg/types/specactors/builtin/market/v6.go | 24 +- pkg/types/specactors/builtin/market/v7.go | 24 +- pkg/types/specactors/builtin/miner/miner.go | 11 +- pkg/types/specactors/builtin/miner/v0.go | 18 +- pkg/types/specactors/builtin/miner/v2.go | 62 +- pkg/types/specactors/builtin/miner/v3.go | 62 +- pkg/types/specactors/builtin/miner/v4.go | 62 +- pkg/types/specactors/builtin/miner/v5.go | 62 +- pkg/types/specactors/builtin/miner/v6.go | 62 +- pkg/types/specactors/builtin/miner/v7.go | 64 +-- .../specactors/builtin/multisig/message0.go | 5 +- .../specactors/builtin/multisig/message2.go | 4 +- .../specactors/builtin/multisig/message3.go | 4 +- .../specactors/builtin/multisig/message4.go | 4 +- .../specactors/builtin/multisig/message5.go | 4 +- .../specactors/builtin/multisig/message6.go | 4 +- .../specactors/builtin/multisig/message7.go | 4 +- .../specactors/builtin/multisig/multisig.go | 5 +- pkg/types/specactors/builtin/multisig/v0.go | 15 +- pkg/types/specactors/builtin/multisig/v2.go | 15 +- pkg/types/specactors/builtin/multisig/v3.go | 15 +- pkg/types/specactors/builtin/multisig/v4.go | 15 +- pkg/types/specactors/builtin/multisig/v5.go | 15 +- pkg/types/specactors/builtin/multisig/v6.go | 15 +- pkg/types/specactors/builtin/multisig/v7.go | 15 +- .../specactors/builtin/paych/message0.go | 2 +- .../specactors/builtin/paych/message2.go | 2 +- .../specactors/builtin/paych/message3.go | 2 +- .../specactors/builtin/paych/message4.go | 2 +- .../specactors/builtin/paych/message5.go | 2 +- .../specactors/builtin/paych/message6.go | 2 +- .../specactors/builtin/paych/message7.go | 2 +- pkg/types/specactors/builtin/paych/paych.go | 5 +- pkg/types/specactors/builtin/power/power.go | 5 +- pkg/types/specactors/builtin/power/v0.go | 22 +- pkg/types/specactors/builtin/power/v2.go | 22 +- pkg/types/specactors/builtin/power/v3.go | 14 +- pkg/types/specactors/builtin/power/v4.go | 14 +- pkg/types/specactors/builtin/power/v5.go | 14 +- pkg/types/specactors/builtin/power/v6.go | 14 +- pkg/types/specactors/builtin/power/v7.go | 14 +- pkg/types/specactors/builtin/reward/reward.go | 7 +- pkg/types/specactors/builtin/reward/v2.go | 2 +- pkg/types/specactors/builtin/reward/v3.go | 2 +- pkg/types/specactors/builtin/reward/v4.go | 2 +- pkg/types/specactors/builtin/reward/v5.go | 2 +- pkg/types/specactors/builtin/reward/v6.go | 2 +- pkg/types/specactors/builtin/reward/v7.go | 2 +- pkg/types/specactors/builtin/system/system.go | 8 +- pkg/types/specactors/builtin/system/v0.go | 2 +- pkg/types/specactors/builtin/system/v2.go | 2 +- pkg/types/specactors/builtin/system/v3.go | 2 +- pkg/types/specactors/builtin/system/v4.go | 2 +- pkg/types/specactors/builtin/system/v5.go | 2 +- pkg/types/specactors/builtin/system/v6.go | 2 +- pkg/types/specactors/builtin/system/v7.go | 2 +- pkg/types/specactors/builtin/verifreg/v0.go | 18 +- pkg/types/specactors/builtin/verifreg/v2.go | 18 +- pkg/types/specactors/builtin/verifreg/v3.go | 18 +- pkg/types/specactors/builtin/verifreg/v4.go | 18 +- pkg/types/specactors/builtin/verifreg/v5.go | 18 +- pkg/types/specactors/builtin/verifreg/v6.go | 18 +- pkg/types/specactors/builtin/verifreg/v7.go | 18 +- .../specactors/builtin/verifreg/verifreg.go | 8 +- pkg/vm/gas/gas_tracker.go | 3 +- pkg/vm/vmcontext/interpreter.go | 2 +- pkg/vm/vmcontext/invocation_context.go | 2 +- pkg/vm/vmcontext/runtime_adapter.go | 2 +- pkg/vm/vmcontext/types.go | 2 +- pkg/vm/vmcontext/vmcontext.go | 5 +- pkg/wallet/wallet.go | 3 +- tools/client/main.go | 2 +- tools/conformance/driver.go | 2 +- tools/conformance/rand_record.go | 2 +- tools/conformance/runner.go | 2 +- tools/fast/action_mpool.go | 2 +- tools/fast/action_protocol.go | 6 +- tools/fast/action_show.go | 2 +- tools/fast/action_swarm.go | 7 +- tools/fast/action_wallet.go | 2 +- tools/fast/series/wait_for_chain_message.go | 2 +- tools/gengen/util/generator.go | 2 +- tools/gengen/util/gengen.go | 2 +- tools/seed/seed.go | 2 +- venus-devtool/api-docs-gen/docgen.go | 70 ++- venus-devtool/cborgen/main.go | 37 +- venus-devtool/compatible/actors/templates.go | 2 +- venus-shared/actors/builtin/account/actor.go | 2 +- .../actors/builtin/account/actor.go.template | 2 +- venus-shared/actors/builtin/builtin.go | 2 +- .../actors/builtin/builtin.go.template | 2 +- venus-shared/actors/builtin/init/actor.go | 2 +- .../actors/builtin/init/actor.go.template | 2 +- venus-shared/actors/builtin/market/actor.go | 2 +- .../actors/builtin/market/actor.go.template | 2 +- .../builtin/market/state.sep.go.template | 2 +- .../actors/builtin/market/state.v0.go | 2 +- .../actors/builtin/market/state.v2.go | 2 +- .../actors/builtin/market/state.v3.go | 2 +- .../actors/builtin/market/state.v4.go | 2 +- .../actors/builtin/market/state.v5.go | 2 +- .../actors/builtin/market/state.v6.go | 2 +- .../actors/builtin/market/state.v7.go | 2 +- venus-shared/actors/builtin/miner/actor.go | 2 +- .../actors/builtin/miner/actor.go.template | 2 +- venus-shared/actors/builtin/multisig/actor.go | 2 +- .../actors/builtin/multisig/actor.go.template | 2 +- .../builtin/multisig/message.sep.go.template | 2 +- .../actors/builtin/multisig/message.v0.go | 2 +- .../actors/builtin/multisig/message.v2.go | 2 +- .../actors/builtin/multisig/message.v3.go | 2 +- .../actors/builtin/multisig/message.v4.go | 2 +- .../actors/builtin/multisig/message.v5.go | 2 +- .../actors/builtin/multisig/message.v6.go | 2 +- .../actors/builtin/multisig/message.v7.go | 2 +- venus-shared/actors/builtin/paych/actor.go | 2 +- .../actors/builtin/paych/actor.go.template | 2 +- .../builtin/paych/message.sep.go.template | 2 +- .../actors/builtin/paych/message.v0.go | 2 +- .../actors/builtin/paych/message.v2.go | 2 +- .../actors/builtin/paych/message.v3.go | 2 +- .../actors/builtin/paych/message.v4.go | 2 +- .../actors/builtin/paych/message.v5.go | 2 +- .../actors/builtin/paych/message.v6.go | 2 +- .../actors/builtin/paych/message.v7.go | 2 +- venus-shared/actors/builtin/power/actor.go | 2 +- .../actors/builtin/power/actor.go.template | 2 +- venus-shared/actors/builtin/reward/actor.go | 2 +- .../actors/builtin/reward/actor.go.template | 2 +- venus-shared/actors/builtin/verifreg/actor.go | 2 +- .../actors/builtin/verifreg/actor.go.template | 2 +- venus-shared/api/chain/v0/blockstore.go | 11 +- venus-shared/api/chain/v0/chain.go | 139 +++-- venus-shared/api/chain/v0/market.go | 5 +- venus-shared/api/chain/v0/mining.go | 7 +- venus-shared/api/chain/v0/mock/full.go | 178 +++--- venus-shared/api/chain/v0/mpool.go | 48 +- venus-shared/api/chain/v0/multisig.go | 13 +- venus-shared/api/chain/v0/network.go | 25 +- venus-shared/api/chain/v0/paych.go | 27 +- venus-shared/api/chain/v0/proxy_gen.go | 483 ++++++++-------- venus-shared/api/chain/v0/syncer.go | 19 +- venus-shared/api/chain/v0/wallet.go | 33 +- venus-shared/api/chain/v1/blockstore.go | 11 +- venus-shared/api/chain/v1/chain.go | 139 +++-- venus-shared/api/chain/v1/market.go | 5 +- venus-shared/api/chain/v1/mining.go | 7 +- venus-shared/api/chain/v1/mock/full.go | 234 ++++---- venus-shared/api/chain/v1/mpool.go | 54 +- venus-shared/api/chain/v1/multisig.go | 31 +- venus-shared/api/chain/v1/network.go | 25 +- venus-shared/api/chain/v1/paych.go | 27 +- venus-shared/api/chain/v1/proxy_gen.go | 531 +++++++++--------- venus-shared/api/chain/v1/syncer.go | 19 +- venus-shared/api/chain/v1/wallet.go | 33 +- venus-shared/{chain => internal}/actor.go | 2 +- venus-shared/internal/bigint.go | 59 ++ venus-shared/internal/bigint_fil.go | 147 +++++ venus-shared/internal/cbor_gen.go | 362 ++++++++++++ venus-shared/{chain => internal}/message.go | 4 +- .../{chain => internal}/message_marshal.go | 2 +- venus-shared/internal/param.go | 25 + venus-shared/libp2p/exchange/cbor_gen.go | 27 +- venus-shared/libp2p/exchange/client.go | 8 +- venus-shared/libp2p/exchange/exchange.go | 8 +- venus-shared/localstore/chain.go | 12 +- venus-shared/paych/cbor_gen.go | 131 ----- venus-shared/types/actor.go | 63 +++ venus-shared/{chain => types}/actor_test.go | 2 +- venus-shared/{chain => types}/beacon.go | 2 +- venus-shared/{chain => types}/beacon_test.go | 2 +- venus-shared/{chain => types}/bigint.go | 2 +- venus-shared/{chain => types}/bigint_fil.go | 4 +- .../{chain => types}/bigint_fil_test.go | 4 +- venus-shared/{chain => types}/bigint_test.go | 2 +- venus-shared/{chain => types}/bigint_unit.go | 2 +- .../{chain => types}/bigint_unit_test.go | 2 +- venus-shared/{chain => types}/block_header.go | 2 +- .../{chain => types}/block_header_test.go | 2 +- .../{chain => types}/block_message.go | 2 +- .../{chain => types}/block_message_test.go | 2 +- venus-shared/{chain => types}/block_msg.go | 2 +- .../{chain => types}/block_msg_test.go | 2 +- venus-shared/{chain => types}/cbor_gen.go | 488 +++++----------- venus-shared/{chain => types}/chain_info.go | 2 +- .../checkstatuscode_string.go | 2 +- .../{chain => types}/complex_provider.go | 9 +- .../{chain => types}/complex_provider_test.go | 2 +- .../{chain => types}/election_proof.go | 4 +- .../{chain => types}/election_proof_test.go | 4 +- venus-shared/{stmgr => types}/exec.go | 8 +- venus-shared/{chain => types}/full_block.go | 2 +- venus-shared/{chain => types}/full_tipset.go | 2 +- venus-shared/{wallet => types}/key_info.go | 2 +- venus-shared/types/message.go | 206 +++++++ venus-shared/types/message_marshal.go | 19 + .../{chain => types}/message_receipt.go | 2 +- .../{chain => types}/message_receipt_test.go | 2 +- venus-shared/{chain => types}/message_root.go | 2 +- .../{chain => types}/message_root_test.go | 2 +- venus-shared/{chain => types}/message_test.go | 4 +- venus-shared/{messagepool => types}/mpool.go | 7 +- .../config.go => types/mpool_config.go} | 2 +- venus-shared/{wallet => types}/msg_meta.go | 2 +- venus-shared/{libp2p/net => types}/net.go | 2 +- venus-shared/{chain => types}/param.go | 7 +- venus-shared/{chain => types}/params/chain.go | 0 .../{chain => types}/params/circulating.go | 0 venus-shared/{paych => types}/paych.go | 7 +- venus-shared/{chain => types}/shared_func.go | 2 +- .../{chain => types}/signed_message.go | 2 +- .../signed_message_marshal.go | 2 +- .../{chain => types}/signed_message_test.go | 2 +- venus-shared/{chain => types}/signer.go | 2 +- venus-shared/{chain => types}/supply.go | 2 +- venus-shared/{chain => types}/tipset.go | 2 +- .../tipset_exp_tipset_test.go | 2 +- venus-shared/{chain => types}/tipset_key.go | 2 +- .../{chain => types}/tipset_key_test.go | 2 +- .../{chain => types}/tipset_marshal.go | 2 +- .../{chain => types}/tipset_marshal_test.go | 2 +- venus-shared/{chain => types}/tipset_test.go | 2 +- venus-shared/{api/chain => types}/types.go | 68 ++- 464 files changed, 4103 insertions(+), 3793 deletions(-) rename venus-shared/{chain => internal}/actor.go (99%) create mode 100644 venus-shared/internal/bigint.go create mode 100644 venus-shared/internal/bigint_fil.go create mode 100644 venus-shared/internal/cbor_gen.go rename venus-shared/{chain => internal}/message.go (98%) rename venus-shared/{chain => internal}/message_marshal.go (94%) create mode 100644 venus-shared/internal/param.go delete mode 100644 venus-shared/paych/cbor_gen.go create mode 100644 venus-shared/types/actor.go rename venus-shared/{chain => types}/actor_test.go (98%) rename venus-shared/{chain => types}/beacon.go (80%) rename venus-shared/{chain => types}/beacon_test.go (98%) rename venus-shared/{chain => types}/bigint.go (98%) rename venus-shared/{chain => types}/bigint_fil.go (97%) rename venus-shared/{chain => types}/bigint_fil_test.go (98%) rename venus-shared/{chain => types}/bigint_test.go (99%) rename venus-shared/{chain => types}/bigint_unit.go (98%) rename venus-shared/{chain => types}/bigint_unit_test.go (98%) rename venus-shared/{chain => types}/block_header.go (99%) rename venus-shared/{chain => types}/block_header_test.go (99%) rename venus-shared/{chain => types}/block_message.go (93%) rename venus-shared/{chain => types}/block_message_test.go (91%) rename venus-shared/{chain => types}/block_msg.go (97%) rename venus-shared/{chain => types}/block_msg_test.go (99%) rename venus-shared/{chain => types}/cbor_gen.go (80%) rename venus-shared/{chain => types}/chain_info.go (98%) rename venus-shared/{messagepool => types}/checkstatuscode_string.go (98%) rename venus-shared/{chain => types}/complex_provider.go (96%) rename venus-shared/{chain => types}/complex_provider_test.go (98%) rename venus-shared/{chain => types}/election_proof.go (98%) rename venus-shared/{chain => types}/election_proof_test.go (97%) rename venus-shared/{stmgr => types}/exec.go (94%) rename venus-shared/{chain => types}/full_block.go (96%) rename venus-shared/{chain => types}/full_tipset.go (99%) rename venus-shared/{wallet => types}/key_info.go (99%) create mode 100644 venus-shared/types/message.go create mode 100644 venus-shared/types/message_marshal.go rename venus-shared/{chain => types}/message_receipt.go (97%) rename venus-shared/{chain => types}/message_receipt_test.go (99%) rename venus-shared/{chain => types}/message_root.go (98%) rename venus-shared/{chain => types}/message_root_test.go (98%) rename venus-shared/{chain => types}/message_test.go (98%) rename venus-shared/{messagepool => types}/mpool.go (87%) rename venus-shared/{messagepool/config.go => types/mpool_config.go} (93%) rename venus-shared/{wallet => types}/msg_meta.go (98%) rename venus-shared/{libp2p/net => types}/net.go (98%) rename venus-shared/{chain => types}/param.go (81%) rename venus-shared/{chain => types}/params/chain.go (100%) rename venus-shared/{chain => types}/params/circulating.go (100%) rename venus-shared/{paych => types}/paych.go (90%) rename venus-shared/{chain => types}/shared_func.go (97%) rename venus-shared/{chain => types}/signed_message.go (99%) rename venus-shared/{chain => types}/signed_message_marshal.go (95%) rename venus-shared/{chain => types}/signed_message_test.go (99%) rename venus-shared/{chain => types}/signer.go (96%) rename venus-shared/{chain => types}/supply.go (95%) rename venus-shared/{chain => types}/tipset.go (99%) rename venus-shared/{chain => types}/tipset_exp_tipset_test.go (98%) rename venus-shared/{chain => types}/tipset_key.go (99%) rename venus-shared/{chain => types}/tipset_key_test.go (98%) rename venus-shared/{chain => types}/tipset_marshal.go (98%) rename venus-shared/{chain => types}/tipset_marshal_test.go (99%) rename venus-shared/{chain => types}/tipset_test.go (99%) rename venus-shared/{api/chain => types}/types.go (83%) diff --git a/app/client/apiface/blockstore.go b/app/client/apiface/blockstore.go index 13a44327b3..ee62d5bc28 100644 --- a/app/client/apiface/blockstore.go +++ b/app/client/apiface/blockstore.go @@ -3,9 +3,9 @@ package apiface import ( "context" - "github.com/ipfs/go-cid" + "github.com/filecoin-project/venus/venus-shared/types" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + "github.com/ipfs/go-cid" ) type IBlockStore interface { @@ -16,5 +16,5 @@ type IBlockStore interface { // Rule[perm:read] ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) // Rule[perm:read] - ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (apitypes.ObjStat, error) + ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (types.ObjStat, error) } diff --git a/app/client/apiface/chain.go b/app/client/apiface/chain.go index 7494f2e0a3..a2f231b6c7 100644 --- a/app/client/apiface/chain.go +++ b/app/client/apiface/chain.go @@ -9,8 +9,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-state-types/big" acrypto "github.com/filecoin-project/go-state-types/crypto" @@ -71,13 +70,13 @@ type IChainInfo interface { // Rule[perm:read] ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.Message, error) // Rule[perm:read] - ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*apitypes.BlockMessages, error) + ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*types.BlockMessages, error) // Rule[perm:read] - ChainGetMessagesInTipset(ctx context.Context, key types.TipSetKey) ([]apitypes.Message, error) + ChainGetMessagesInTipset(ctx context.Context, key types.TipSetKey) ([]types.MessageCID, error) // Rule[perm:read] ChainGetReceipts(ctx context.Context, id cid.Cid) ([]types.MessageReceipt, error) // Rule[perm:read] - ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]apitypes.Message, error) + ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]types.MessageCID, error) // Rule[perm:read] ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) // Rule[perm:read] @@ -85,7 +84,7 @@ type IChainInfo interface { // Rule[perm:read] StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) // Rule[perm:read] - ChainNotify(ctx context.Context) <-chan []*apitypes.HeadChange + ChainNotify(ctx context.Context) <-chan []*types.HeadChange // Rule[perm:read] GetFullBlock(ctx context.Context, id cid.Cid) (*types.FullBlock, error) // Rule[perm:read] @@ -95,13 +94,13 @@ type IChainInfo interface { // Rule[perm:read] GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*types.BeaconEntry, error) // Rule[perm:read] - MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*apitypes.ChainMessage, error) + MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*types.ChainMessage, error) // Rule[perm:read] - ProtocolParameters(ctx context.Context) (*apitypes.ProtocolParams, error) + ProtocolParameters(ctx context.Context) (*types.ProtocolParams, error) // Rule[perm:read] ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) // Rule[perm:read] - StateNetworkName(ctx context.Context) (apitypes.NetworkName, error) + StateNetworkName(ctx context.Context) (types.NetworkName, error) // StateSearchMsg looks back up to limit epochs in the chain for a message, and returns its receipt and the tipset where it was executed // // NOTE: If a replacing message is found on chain, this method will return @@ -119,7 +118,7 @@ type IChainInfo interface { // different signature, but with all other parameters matching (source/destination, // nonce, params, etc.) // Rule[perm:read] - StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) + StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) // StateWaitMsg looks back up to limit epochs in the chain for a message. // If not found, it blocks until the message arrives on chain, and gets to the // indicated confidence depth. @@ -139,7 +138,7 @@ type IChainInfo interface { // different signature, but with all other parameters matching (source/destination, // nonce, params, etc.) // Rule[perm:read] - StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) + StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) // Rule[perm:read] StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) // Rule[perm:read] @@ -147,7 +146,7 @@ type IChainInfo interface { // Rule[perm:read] ChainExport(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []byte, error) // Rule[perm:read] - ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*apitypes.HeadChange, error) + ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*types.HeadChange, error) } type IMinerState interface { @@ -172,13 +171,13 @@ type IMinerState interface { // Rule[perm:read] StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) // Rule[perm:read] - StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]apitypes.Partition, error) + StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]types.Partition, error) // Rule[perm:read] - StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]apitypes.Deadline, error) + StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]types.Deadline, error) // Rule[perm:read] StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) // Rule[perm:read] - StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*apitypes.MarketDeal, error) + StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.MarketDeal, error) // Rule[perm:read] StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) // Rule[perm:read] @@ -188,7 +187,7 @@ type IMinerState interface { // Rule[perm:read] StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) // Rule[perm:read] - StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]apitypes.MarketDeal, error) + StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) // Rule[perm:read] StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) // Rule[perm:read] @@ -198,17 +197,17 @@ type IMinerState interface { // Rule[perm:read] StateListActors(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) // Rule[perm:read] - StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*apitypes.MinerPower, error) + StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.MinerPower, error) // Rule[perm:read] StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) // Rule[perm:read] StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorExpiration, error) // Rule[perm:read] - StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (apitypes.MinerSectors, error) + StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MinerSectors, error) // Rule[perm:read] - StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (apitypes.MarketBalance, error) + StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MarketBalance, error) // Rule[perm:read] - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (apitypes.DealCollateralBounds, error) + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (types.DealCollateralBounds, error) // Rule[perm:read] StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) } diff --git a/app/client/apiface/market.go b/app/client/apiface/market.go index 6adaa7494d..c663abc981 100644 --- a/app/client/apiface/market.go +++ b/app/client/apiface/market.go @@ -3,11 +3,10 @@ package apiface import ( "context" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type IMarket interface { // Rule[perm:read] - StateMarketParticipants(ctx context.Context, tsk types.TipSetKey) (map[string]apitypes.MarketBalance, error) //perm:admin + StateMarketParticipants(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketBalance, error) //perm:admin } diff --git a/app/client/apiface/mining.go b/app/client/apiface/mining.go index ee26fcf892..a0c457cb86 100644 --- a/app/client/apiface/mining.go +++ b/app/client/apiface/mining.go @@ -5,13 +5,12 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type IMining interface { // Rule[perm:read] - MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*apitypes.MiningBaseInfo, error) + MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*types.MiningBaseInfo, error) // Rule[perm:write] - MinerCreateBlock(ctx context.Context, bt *apitypes.BlockTemplate) (*types.BlockMsg, error) + MinerCreateBlock(ctx context.Context, bt *types.BlockTemplate) (*types.BlockMsg, error) } diff --git a/app/client/apiface/mpool.go b/app/client/apiface/mpool.go index ccc573b6ed..a3738559a4 100644 --- a/app/client/apiface/mpool.go +++ b/app/client/apiface/mpool.go @@ -5,9 +5,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/messagepool" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ) @@ -21,9 +19,9 @@ type IMessagePool interface { // Rule[perm:write] MpoolPush(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) // Rule[perm:read] - MpoolGetConfig(context.Context) (*messagepool.MpoolConfig, error) + MpoolGetConfig(context.Context) (*types.MpoolConfig, error) // Rule[perm:admin] - MpoolSetConfig(ctx context.Context, cfg *messagepool.MpoolConfig) error + MpoolSetConfig(ctx context.Context, cfg *types.MpoolConfig) error // Rule[perm:read] MpoolSelect(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) // Rule[perm:read] @@ -35,21 +33,21 @@ type IMessagePool interface { // Rule[perm:write] MpoolPushUntrusted(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) // Rule[perm:sign] - MpoolPushMessage(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec) (*types.SignedMessage, error) + MpoolPushMessage(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec) (*types.SignedMessage, error) // Rule[perm:write] MpoolBatchPush(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) // Rule[perm:write] MpoolBatchPushUntrusted(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) // Rule[perm:sign] - MpoolBatchPushMessage(ctx context.Context, msgs []*types.Message, spec *apitypes.MessageSendSpec) ([]*types.SignedMessage, error) + MpoolBatchPushMessage(ctx context.Context, msgs []*types.Message, spec *types.MessageSendSpec) ([]*types.SignedMessage, error) // Rule[perm:read] MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) // Rule[perm:read] - MpoolSub(ctx context.Context) (<-chan messagepool.MpoolUpdate, error) + MpoolSub(ctx context.Context) (<-chan types.MpoolUpdate, error) // Rule[perm:read] - GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) + GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) // Rule[perm:read] - GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*apitypes.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*apitypes.EstimateResult, error) + GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) // Rule[perm:read] GasEstimateFeeCap(ctx context.Context, msg *types.Message, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) // Rule[perm:read] @@ -58,11 +56,11 @@ type IMessagePool interface { GasEstimateGasLimit(ctx context.Context, msgIn *types.Message, tsk types.TipSetKey) (int64, error) // MpoolCheckMessages performs logical checks on a batch of messages // Rule[perm:read] - MpoolCheckMessages(ctx context.Context, protos []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) + MpoolCheckMessages(ctx context.Context, protos []*types.MessagePrototype) ([][]types.MessageCheckStatus, error) // MpoolCheckPendingMessages performs logical checks for all pending messages from a given address // Rule[perm:read] - MpoolCheckPendingMessages(ctx context.Context, addr address.Address) ([][]messagepool.MessageCheckStatus, error) + MpoolCheckPendingMessages(ctx context.Context, addr address.Address) ([][]types.MessageCheckStatus, error) // MpoolCheckReplaceMessages performs logical checks on pending messages with replacement // Rule[perm:read] - MpoolCheckReplaceMessages(ctx context.Context, msg []*types.Message) ([][]messagepool.MessageCheckStatus, error) + MpoolCheckReplaceMessages(ctx context.Context, msg []*types.Message) ([][]types.MessageCheckStatus, error) } diff --git a/app/client/apiface/multisig.go b/app/client/apiface/multisig.go index a1228b42ba..a22e4ee522 100644 --- a/app/client/apiface/multisig.go +++ b/app/client/apiface/multisig.go @@ -2,41 +2,41 @@ package apiface import ( "context" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - types "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/messagepool" + "github.com/filecoin-project/venus/venus-shared/types" ) type IMultiSig interface { // Rule[perm:sign] - MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (*messagepool.MessagePrototype, error) + MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (*types.MessagePrototype, error) // Rule[perm:sign] - MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) + MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*types.MessagePrototype, error) // Rule[perm:sign] - MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) + MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*types.MessagePrototype, error) // Rule[perm:sign] - MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) + MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*types.MessagePrototype, error) // Rule[perm:sign] - MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) + MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*types.MessagePrototype, error) // MsigCancel cancels a previously-proposed multisig message // It takes the following params: , , , , // , , - MsigCancelTxnHash(context.Context, address.Address, uint64, address.Address, types.BigInt, address.Address, uint64, []byte) (*messagepool.MessagePrototype, error) + MsigCancelTxnHash(context.Context, address.Address, uint64, address.Address, types.BigInt, address.Address, uint64, []byte) (*types.MessagePrototype, error) // Rule[perm:sign] - MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) + MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*types.MessagePrototype, error) // Rule[perm:sign] - MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) + MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*types.MessagePrototype, error) // Rule[perm:sign] - MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) + MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*types.MessagePrototype, error) // Rule[perm:sign] - MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) + MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*types.MessagePrototype, error) // Rule[perm:sign] - MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) + MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*types.MessagePrototype, error) // Rule[perm:sign] - MsigCancel(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) + MsigCancel(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*types.MessagePrototype, error) // Rule[perm:sign] - MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*messagepool.MessagePrototype, error) + MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*types.MessagePrototype, error) // Rule[perm:read] MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) } diff --git a/app/client/apiface/network.go b/app/client/apiface/network.go index d2251597dd..20b0784020 100644 --- a/app/client/apiface/network.go +++ b/app/client/apiface/network.go @@ -3,13 +3,12 @@ package apiface import ( "context" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" - - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/libp2p/net" ) type INetwork interface { @@ -26,11 +25,11 @@ type INetwork interface { // Rule[perm:read] NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) // Rule[perm:read] - NetworkConnect(ctx context.Context, addrs []string) (<-chan net.ConnectionResult, error) + NetworkConnect(ctx context.Context, addrs []string) (<-chan types.ConnectionResult, error) // Rule[perm:read] - NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) + NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*types.SwarmConnInfos, error) // Rule[perm:read] - Version(context.Context) (apitypes.Version, error) + Version(context.Context) (types.Version, error) // Rule[perm:read] NetAddrsListen(context.Context) (peer.AddrInfo, error) } diff --git a/app/client/apiface/paych.go b/app/client/apiface/paych.go index b886670033..0f644e3aef 100644 --- a/app/client/apiface/paych.go +++ b/app/client/apiface/paych.go @@ -3,13 +3,12 @@ package apiface import ( "context" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/specs-actors/actors/builtin/paych" "github.com/ipfs/go-cid" - - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - paychtypes "github.com/filecoin-project/venus/venus-shared/paych" ) type IPaychan interface { @@ -18,16 +17,16 @@ type IPaychan interface { // @to: the payment channel recipient // @amt: the deposits funds in the payment channel // Rule[perm:sign] - PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*paychtypes.ChannelInfo, error) + PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*types.ChannelInfo, error) // PaychAvailableFunds get the status of an outbound payment channel // @pch: payment channel address // Rule[perm:sign] - PaychAvailableFunds(ctx context.Context, ch address.Address) (*apitypes.ChannelAvailableFunds, error) + PaychAvailableFunds(ctx context.Context, ch address.Address) (*types.ChannelAvailableFunds, error) // PaychAvailableFundsByFromTo get the status of an outbound payment channel // @from: the payment channel sender // @to: he payment channel recipient // Rule[perm:sign] - PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*apitypes.ChannelAvailableFunds, error) + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*types.ChannelAvailableFunds, error) // PaychGetWaitReady waits until the create channel / add funds message with the sentinel // @sentinel: given message CID arrives. // @ch: the returned channel address can safely be used against the Manager methods. @@ -42,14 +41,14 @@ type IPaychan interface { // @to: the payment channel recipient // @vouchers: the outstanding (non-redeemed) vouchers // Rule[perm:sign] - PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []paychtypes.VoucherSpec) (*paychtypes.PaymentInfo, error) + PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []types.VoucherSpec) (*types.PaymentInfo, error) // PaychList list the addresses of all channels that have been created // Rule[perm:read] PaychList(ctx context.Context) ([]address.Address, error) // PaychStatus get the payment channel status // @pch: payment channel address // Rule[perm:read] - PaychStatus(ctx context.Context, pch address.Address) (*paychtypes.Status, error) + PaychStatus(ctx context.Context, pch address.Address) (*types.Status, error) // PaychSettle update payment channel status to settle // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain // @pch: payment channel address @@ -87,7 +86,7 @@ type IPaychan interface { // If there are insufficient funds in the channel to create the voucher, // returns a nil voucher and the shortfall. // Rule[perm:sign] - PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paychtypes.VoucherCreateResult, error) + PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*types.VoucherCreateResult, error) // PaychVoucherList list vouchers in payment channel // @pch: payment channel address // Rule[perm:write] diff --git a/app/client/apiface/syncer.go b/app/client/apiface/syncer.go index 0bc6539845..ac1dbb08a8 100644 --- a/app/client/apiface/syncer.go +++ b/app/client/apiface/syncer.go @@ -5,8 +5,7 @@ import ( "github.com/filecoin-project/go-state-types/big" syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type ISyncer interface { @@ -23,7 +22,7 @@ type ISyncer interface { // Rule[perm:write] SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error // Rule[perm:read] - StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*apitypes.InvocResult, error) + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*types.InvocResult, error) // Rule[perm:read] - SyncState(ctx context.Context) (*apitypes.SyncState, error) + SyncState(ctx context.Context) (*types.SyncState, error) } diff --git a/app/client/apiface/v0api/blockstore.go b/app/client/apiface/v0api/blockstore.go index fb70a90ac9..6daa240d5b 100644 --- a/app/client/apiface/v0api/blockstore.go +++ b/app/client/apiface/v0api/blockstore.go @@ -3,9 +3,9 @@ package v0api import ( "context" - "github.com/ipfs/go-cid" + "github.com/filecoin-project/venus/venus-shared/types" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + "github.com/ipfs/go-cid" ) type IBlockStore interface { @@ -16,5 +16,5 @@ type IBlockStore interface { // Rule[perm:read] ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) // Rule[perm:read] - ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (apitypes.ObjStat, error) + ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (types.ObjStat, error) } diff --git a/app/client/apiface/v0api/chain.go b/app/client/apiface/v0api/chain.go index 762112c77d..776e40fb35 100644 --- a/app/client/apiface/v0api/chain.go +++ b/app/client/apiface/v0api/chain.go @@ -14,8 +14,7 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type IChain interface { @@ -65,13 +64,13 @@ type IChainInfo interface { // Rule[perm:read] ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.Message, error) // Rule[perm:read] - ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*apitypes.BlockMessages, error) + ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*types.BlockMessages, error) // Rule[perm:read] - ChainGetMessagesInTipset(ctx context.Context, key types.TipSetKey) ([]apitypes.Message, error) + ChainGetMessagesInTipset(ctx context.Context, key types.TipSetKey) ([]types.Message, error) // Rule[perm:read] ChainGetReceipts(ctx context.Context, id cid.Cid) ([]types.MessageReceipt, error) // Rule[perm:read] - ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]apitypes.Message, error) + ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]types.Message, error) // Rule[perm:read] ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) //Rule[perm:read] @@ -79,7 +78,7 @@ type IChainInfo interface { // Rule[perm:read] StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) // Rule[perm:read] - ChainNotify(ctx context.Context) <-chan []*apitypes.HeadChange + ChainNotify(ctx context.Context) <-chan []*types.HeadChange // Rule[perm:read] GetFullBlock(ctx context.Context, id cid.Cid) (*types.FullBlock, error) // Rule[perm:read] @@ -89,23 +88,23 @@ type IChainInfo interface { // Rule[perm:read] GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*types.BeaconEntry, error) // Rule[perm:read] - MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*apitypes.ChainMessage, error) + MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*types.ChainMessage, error) // Rule[perm:read] - ProtocolParameters(ctx context.Context) (*apitypes.ProtocolParams, error) + ProtocolParameters(ctx context.Context) (*types.ProtocolParams, error) // Rule[perm:read] ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) // Rule[perm:read] - StateNetworkName(ctx context.Context) (apitypes.NetworkName, error) + StateNetworkName(ctx context.Context) (types.NetworkName, error) // Rule[perm:read] StateGetReceipt(ctx context.Context, msg cid.Cid, from types.TipSetKey) (*types.MessageReceipt, error) // Rule[perm:read] - StateSearchMsg(ctx context.Context, msg cid.Cid) (*apitypes.MsgLookup, error) + StateSearchMsg(ctx context.Context, msg cid.Cid) (*types.MsgLookup, error) // Rule[perm:read] - StateSearchMsgLimited(ctx context.Context, cid cid.Cid, limit abi.ChainEpoch) (*apitypes.MsgLookup, error) + StateSearchMsgLimited(ctx context.Context, cid cid.Cid, limit abi.ChainEpoch) (*types.MsgLookup, error) // Rule[perm:read] - StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64) (*apitypes.MsgLookup, error) + StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64) (*types.MsgLookup, error) // Rule[perm:read] - StateWaitMsgLimited(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch) (*apitypes.MsgLookup, error) + StateWaitMsgLimited(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch) (*types.MsgLookup, error) // Rule[perm:read] StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) // Rule[perm:read] @@ -113,7 +112,7 @@ type IChainInfo interface { // Rule[perm:read] ChainExport(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []byte, error) // Rule[perm:read] - ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*apitypes.HeadChange, error) + ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*types.HeadChange, error) } type IMinerState interface { @@ -138,13 +137,13 @@ type IMinerState interface { // Rule[perm:read] StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) // Rule[perm:read] - StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]apitypes.Partition, error) + StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]types.Partition, error) // Rule[perm:read] - StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]apitypes.Deadline, error) + StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]types.Deadline, error) // Rule[perm:read] StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) // Rule[perm:read] - StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*apitypes.MarketDeal, error) + StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.MarketDeal, error) // Rule[perm:read] StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) // Rule[perm:read] @@ -154,7 +153,7 @@ type IMinerState interface { // Rule[perm:read] StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) // Rule[perm:read] - StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]apitypes.MarketDeal, error) + StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) // Rule[perm:read] StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) // Rule[perm:read] @@ -164,17 +163,17 @@ type IMinerState interface { // Rule[perm:read] StateListActors(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) // Rule[perm:read] - StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*apitypes.MinerPower, error) + StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.MinerPower, error) // Rule[perm:read] StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) // Rule[perm:read] StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorExpiration, error) // Rule[perm:read] - StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (apitypes.MinerSectors, error) + StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MinerSectors, error) // Rule[perm:read] - StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (apitypes.MarketBalance, error) + StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MarketBalance, error) // Rule[perm:read] - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (apitypes.DealCollateralBounds, error) + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (types.DealCollateralBounds, error) // Rule[perm:read] StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) } diff --git a/app/client/apiface/v0api/market.go b/app/client/apiface/v0api/market.go index 8eff369c15..55b4373e47 100644 --- a/app/client/apiface/v0api/market.go +++ b/app/client/apiface/v0api/market.go @@ -3,11 +3,10 @@ package v0api import ( "context" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type IMarket interface { // Rule[perm:read] - StateMarketParticipants(ctx context.Context, tsk types.TipSetKey) (map[string]apitypes.MarketBalance, error) //perm:admin + StateMarketParticipants(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketBalance, error) //perm:admin } diff --git a/app/client/apiface/v0api/mining.go b/app/client/apiface/v0api/mining.go index 6f3fc2bcfe..5b86ded9e9 100644 --- a/app/client/apiface/v0api/mining.go +++ b/app/client/apiface/v0api/mining.go @@ -5,13 +5,12 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type IMining interface { // Rule[perm:read] - MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*apitypes.MiningBaseInfo, error) + MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*types.MiningBaseInfo, error) // Rule[perm:write] - MinerCreateBlock(ctx context.Context, bt *apitypes.BlockTemplate) (*types.BlockMsg, error) + MinerCreateBlock(ctx context.Context, bt *types.BlockTemplate) (*types.BlockMsg, error) } diff --git a/app/client/apiface/v0api/mpool.go b/app/client/apiface/v0api/mpool.go index 9db7446fec..aebcafc40b 100644 --- a/app/client/apiface/v0api/mpool.go +++ b/app/client/apiface/v0api/mpool.go @@ -5,9 +5,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/messagepool" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ) @@ -21,9 +19,9 @@ type IMessagePool interface { // Rule[perm:write] MpoolPush(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) // Rule[perm:read] - MpoolGetConfig(context.Context) (*messagepool.MpoolConfig, error) + MpoolGetConfig(context.Context) (*types.MpoolConfig, error) // Rule[perm:admin] - MpoolSetConfig(ctx context.Context, cfg *messagepool.MpoolConfig) error + MpoolSetConfig(ctx context.Context, cfg *types.MpoolConfig) error // Rule[perm:read] MpoolSelect(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) // Rule[perm:read] @@ -35,21 +33,21 @@ type IMessagePool interface { // Rule[perm:write] MpoolPushUntrusted(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) // Rule[perm:sign] - MpoolPushMessage(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec) (*types.SignedMessage, error) + MpoolPushMessage(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec) (*types.SignedMessage, error) // Rule[perm:write] MpoolBatchPush(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) // Rule[perm:write] MpoolBatchPushUntrusted(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) // Rule[perm:sign] - MpoolBatchPushMessage(ctx context.Context, msgs []*types.Message, spec *apitypes.MessageSendSpec) ([]*types.SignedMessage, error) + MpoolBatchPushMessage(ctx context.Context, msgs []*types.Message, spec *types.MessageSendSpec) ([]*types.SignedMessage, error) // Rule[perm:read] MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) // Rule[perm:read] - MpoolSub(ctx context.Context) (<-chan messagepool.MpoolUpdate, error) + MpoolSub(ctx context.Context) (<-chan types.MpoolUpdate, error) // Rule[perm:read] - GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) + GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) // Rule[perm:read] - GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*apitypes.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*apitypes.EstimateResult, error) + GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) // Rule[perm:read] GasEstimateFeeCap(ctx context.Context, msg *types.Message, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) // Rule[perm:read] diff --git a/app/client/apiface/v0api/multisig.go b/app/client/apiface/v0api/multisig.go index 8989bcb11c..1e6b56aa10 100644 --- a/app/client/apiface/v0api/multisig.go +++ b/app/client/apiface/v0api/multisig.go @@ -7,7 +7,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type IMultiSig interface { diff --git a/app/client/apiface/v0api/network.go b/app/client/apiface/v0api/network.go index b909ee2240..38f532ded6 100644 --- a/app/client/apiface/v0api/network.go +++ b/app/client/apiface/v0api/network.go @@ -3,8 +3,8 @@ package v0api import ( "context" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/libp2p/net" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/peer" @@ -25,11 +25,11 @@ type INetwork interface { // Rule[perm:read] NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) // Rule[perm:read] - NetworkConnect(ctx context.Context, addrs []string) (<-chan net.ConnectionResult, error) + NetworkConnect(ctx context.Context, addrs []string) (<-chan types.ConnectionResult, error) // Rule[perm:read] - NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) + NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*types.SwarmConnInfos, error) // Rule[perm:read] - Version(context.Context) (apitypes.Version, error) + Version(context.Context) (types.Version, error) // Rule[perm:read] NetAddrsListen(context.Context) (peer.AddrInfo, error) } diff --git a/app/client/apiface/v0api/paych.go b/app/client/apiface/v0api/paych.go index 30ec19f238..db4a687718 100644 --- a/app/client/apiface/v0api/paych.go +++ b/app/client/apiface/v0api/paych.go @@ -3,13 +3,12 @@ package v0api import ( "context" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/specs-actors/actors/builtin/paych" "github.com/ipfs/go-cid" - - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - paychtypes "github.com/filecoin-project/venus/venus-shared/paych" ) type IPaychan interface { @@ -18,16 +17,16 @@ type IPaychan interface { // @to: the payment channel recipient // @amt: the deposits funds in the payment channel // Rule[perm:sign] - PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*paychtypes.ChannelInfo, error) + PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*types.ChannelInfo, error) // PaychAvailableFunds get the status of an outbound payment channel // @pch: payment channel address // Rule[perm:sign] - PaychAvailableFunds(ctx context.Context, ch address.Address) (*apitypes.ChannelAvailableFunds, error) + PaychAvailableFunds(ctx context.Context, ch address.Address) (*types.ChannelAvailableFunds, error) // PaychAvailableFundsByFromTo get the status of an outbound payment channel // @from: the payment channel sender // @to: he payment channel recipient // Rule[perm:sign] - PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*apitypes.ChannelAvailableFunds, error) + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*types.ChannelAvailableFunds, error) // PaychGetWaitReady waits until the create channel / add funds message with the sentinel // @sentinel: given message CID arrives. // @ch: the returned channel address can safely be used against the Manager methods. @@ -42,14 +41,14 @@ type IPaychan interface { // @to: the payment channel recipient // @vouchers: the outstanding (non-redeemed) vouchers // Rule[perm:sign] - PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []paychtypes.VoucherSpec) (*paychtypes.PaymentInfo, error) + PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []types.VoucherSpec) (*types.PaymentInfo, error) // PaychList list the addresses of all channels that have been created // Rule[perm:read] PaychList(ctx context.Context) ([]address.Address, error) // PaychStatus get the payment channel status // @pch: payment channel address // Rule[perm:read] - PaychStatus(ctx context.Context, pch address.Address) (*paychtypes.Status, error) + PaychStatus(ctx context.Context, pch address.Address) (*types.Status, error) // PaychSettle update payment channel status to settle // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain // @pch: payment channel address @@ -87,7 +86,7 @@ type IPaychan interface { // If there are insufficient funds in the channel to create the voucher, // returns a nil voucher and the shortfall. // Rule[perm:sign] - PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paychtypes.VoucherCreateResult, error) + PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*types.VoucherCreateResult, error) // PaychVoucherList list vouchers in payment channel // @pch: payment channel address // Rule[perm:write] diff --git a/app/client/apiface/v0api/syncer.go b/app/client/apiface/v0api/syncer.go index 3967e8a59d..b683b2cdc0 100644 --- a/app/client/apiface/v0api/syncer.go +++ b/app/client/apiface/v0api/syncer.go @@ -5,8 +5,7 @@ import ( "github.com/filecoin-project/go-state-types/big" syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type ISyncer interface { @@ -23,7 +22,7 @@ type ISyncer interface { // Rule[perm:write] SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error // Rule[perm:read] - StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*apitypes.InvocResult, error) + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*types.InvocResult, error) // Rule[perm:read] - SyncState(ctx context.Context) (*apitypes.SyncState, error) + SyncState(ctx context.Context) (*types.SyncState, error) } diff --git a/app/client/apiface/v0api/wallet.go b/app/client/apiface/v0api/wallet.go index ea20b74f12..147e605579 100644 --- a/app/client/apiface/v0api/wallet.go +++ b/app/client/apiface/v0api/wallet.go @@ -6,13 +6,12 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/crypto" - types "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/filecoin-project/venus/venus-shared/types" ) type IWallet interface { // Rule[perm:sign] - WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) + WalletSign(ctx context.Context, k address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) // Rule[perm:admin] WalletExport(addr address.Address, password string) (*crypto.KeyInfo, error) // Rule[perm:admin] diff --git a/app/client/apiface/wallet.go b/app/client/apiface/wallet.go index 74b6217f50..719bb01333 100644 --- a/app/client/apiface/wallet.go +++ b/app/client/apiface/wallet.go @@ -7,13 +7,12 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/crypto" - types "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/filecoin-project/venus/venus-shared/types" ) type IWallet interface { // Rule[perm:sign] - WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) + WalletSign(ctx context.Context, k address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) // Rule[perm:admin] WalletExport(addr address.Address, password string) (*crypto.KeyInfo, error) // Rule[perm:admin] diff --git a/app/client/full.go b/app/client/full.go index 17e05be92b..ec781c11d9 100644 --- a/app/client/full.go +++ b/app/client/full.go @@ -16,12 +16,7 @@ import ( syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/libp2p/net" - "github.com/filecoin-project/venus/venus-shared/messagepool" - paychtypes "github.com/filecoin-project/venus/venus-shared/paych" - "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" "github.com/libp2p/go-libp2p-core/metrics" @@ -85,10 +80,10 @@ func (s *IBeaconStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (* type IBlockStoreStruct struct { Internal struct { - ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` - ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"` - ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` - ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (apitypes.ObjStat, error) `perm:"read"` + ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` + ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"` + ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` + ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) `perm:"read"` } } @@ -104,7 +99,7 @@ func (s *IBlockStoreStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte return s.Internal.ChainReadObj(p0, p1) } -func (s *IBlockStoreStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (apitypes.ObjStat, error) { +func (s *IBlockStoreStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) { return s.Internal.ChainStatObj(p0, p1, p2) } @@ -121,12 +116,12 @@ type IChainInfoStruct struct { BlockTime func(p0 context.Context) time.Duration `perm:"read"` ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) `perm:"read"` ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) `perm:"read"` - ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*apitypes.BlockMessages, error) `perm:"read"` + ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*types.BlockMessages, error) `perm:"read"` ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"` - ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]apitypes.Message, error) `perm:"read"` - ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]apitypes.Message, error) `perm:"read"` + ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]types.MessageCID, error) `perm:"read"` + ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]types.MessageCID, error) `perm:"read"` ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` - ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*apitypes.HeadChange, error) `perm:"read"` + ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*types.HeadChange, error) `perm:"read"` ChainGetRandomnessFromBeacon func(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` ChainGetRandomnessFromTickets func(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` ChainGetReceipts func(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) `perm:"read"` @@ -135,23 +130,23 @@ type IChainInfoStruct struct { ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"` ChainList func(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) `perm:"read"` - ChainNotify func(p0 context.Context) <-chan []*apitypes.HeadChange `perm:"read"` + ChainNotify func(p0 context.Context) <-chan []*types.HeadChange `perm:"read"` ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` GetActor func(p0 context.Context, p1 address.Address) (*types.Actor, error) `perm:"read"` GetEntry func(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) `perm:"read"` GetFullBlock func(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) `perm:"read"` GetParentStateRootActor func(p0 context.Context, p1 *types.TipSet, p2 address.Address) (*types.Actor, error) `perm:"read"` - MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*apitypes.ChainMessage, error) `perm:"read"` - ProtocolParameters func(p0 context.Context) (*apitypes.ProtocolParams, error) `perm:"read"` + MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*types.ChainMessage, error) `perm:"read"` + ProtocolParameters func(p0 context.Context) (*types.ProtocolParams, error) `perm:"read"` ResolveToKeyAddr func(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) `perm:"read"` StateGetRandomnessFromBeacon func(p0 context.Context, p1 acrypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) `perm:"read"` StateGetRandomnessFromTickets func(p0 context.Context, p1 acrypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) `perm:"read"` - StateNetworkName func(p0 context.Context) (apitypes.NetworkName, error) `perm:"read"` + StateNetworkName func(p0 context.Context) (types.NetworkName, error) `perm:"read"` StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (network.Version, error) `perm:"read"` - StateSearchMsg func(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*apitypes.MsgLookup, error) `perm:"read"` + StateSearchMsg func(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) `perm:"read"` StateVerifiedRegistryRootKey func(p0 context.Context, p1 types.TipSetKey) (address.Address, error) `perm:"read"` StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` - StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*apitypes.MsgLookup, error) `perm:"read"` + StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) `perm:"read"` VerifyEntry func(p0 *types.BeaconEntry, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool `perm:"read"` } } @@ -168,7 +163,7 @@ func (s *IChainInfoStruct) ChainGetBlock(p0 context.Context, p1 cid.Cid) (*types return s.Internal.ChainGetBlock(p0, p1) } -func (s *IChainInfoStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*apitypes.BlockMessages, error) { +func (s *IChainInfoStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*types.BlockMessages, error) { return s.Internal.ChainGetBlockMessages(p0, p1) } @@ -176,11 +171,11 @@ func (s *IChainInfoStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*typ return s.Internal.ChainGetMessage(p0, p1) } -func (s *IChainInfoStruct) ChainGetMessagesInTipset(p0 context.Context, p1 types.TipSetKey) ([]apitypes.Message, error) { +func (s *IChainInfoStruct) ChainGetMessagesInTipset(p0 context.Context, p1 types.TipSetKey) ([]types.MessageCID, error) { return s.Internal.ChainGetMessagesInTipset(p0, p1) } -func (s *IChainInfoStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]apitypes.Message, error) { +func (s *IChainInfoStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]types.MessageCID, error) { return s.Internal.ChainGetParentMessages(p0, p1) } @@ -188,7 +183,7 @@ func (s *IChainInfoStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid return s.Internal.ChainGetParentReceipts(p0, p1) } -func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*apitypes.HeadChange, error) { +func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*types.HeadChange, error) { return s.Internal.ChainGetPath(p0, p1, p2) } @@ -224,7 +219,7 @@ func (s *IChainInfoStruct) ChainList(p0 context.Context, p1 types.TipSetKey, p2 return s.Internal.ChainList(p0, p1, p2) } -func (s *IChainInfoStruct) ChainNotify(p0 context.Context) <-chan []*apitypes.HeadChange { +func (s *IChainInfoStruct) ChainNotify(p0 context.Context) <-chan []*types.HeadChange { return s.Internal.ChainNotify(p0) } @@ -248,11 +243,11 @@ func (s *IChainInfoStruct) GetParentStateRootActor(p0 context.Context, p1 *types return s.Internal.GetParentStateRootActor(p0, p1, p2) } -func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*apitypes.ChainMessage, error) { +func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*types.ChainMessage, error) { return s.Internal.MessageWait(p0, p1, p2, p3) } -func (s *IChainInfoStruct) ProtocolParameters(p0 context.Context) (*apitypes.ProtocolParams, error) { +func (s *IChainInfoStruct) ProtocolParameters(p0 context.Context) (*types.ProtocolParams, error) { return s.Internal.ProtocolParameters(p0) } @@ -268,7 +263,7 @@ func (s *IChainInfoStruct) StateGetRandomnessFromTickets(p0 context.Context, p1 return s.Internal.StateGetRandomnessFromTickets(p0, p1, p2, p3, p4) } -func (s *IChainInfoStruct) StateNetworkName(p0 context.Context) (apitypes.NetworkName, error) { +func (s *IChainInfoStruct) StateNetworkName(p0 context.Context) (types.NetworkName, error) { return s.Internal.StateNetworkName(p0) } @@ -276,7 +271,7 @@ func (s *IChainInfoStruct) StateNetworkVersion(p0 context.Context, p1 types.TipS return s.Internal.StateNetworkVersion(p0, p1) } -func (s *IChainInfoStruct) StateSearchMsg(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*apitypes.MsgLookup, error) { +func (s *IChainInfoStruct) StateSearchMsg(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) { return s.Internal.StateSearchMsg(p0, p1, p2, p3, p4) } @@ -288,7 +283,7 @@ func (s *IChainInfoStruct) StateVerifierStatus(p0 context.Context, p1 address.Ad return s.Internal.StateVerifierStatus(p0, p1, p2) } -func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*apitypes.MsgLookup, error) { +func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) { return s.Internal.StateWaitMsg(p0, p1, p2, p3, p4) } @@ -356,45 +351,45 @@ func (s *IJwtAuthAPIStruct) Verify(p0 context.Context, p1 string, p2 string) ([] type IMarketStruct struct { Internal struct { - StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]apitypes.MarketBalance, error) `perm:"read"` + StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) `perm:"read"` } } -func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]apitypes.MarketBalance, error) { +func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) { return s.Internal.StateMarketParticipants(p0, p1) } type IMessagePoolStruct struct { Internal struct { - GasBatchEstimateMessageGas func(p0 context.Context, p1 []*apitypes.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*apitypes.EstimateResult, error) `perm:"read"` - GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - GasEstimateGasLimit func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) `perm:"read"` - GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) `perm:"read"` - GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *apitypes.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"` - MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *apitypes.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` - MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolCheckMessages func(p0 context.Context, p1 []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) `perm:"read"` - MpoolCheckPendingMessages func(p0 context.Context, p1 address.Address) ([][]messagepool.MessageCheckStatus, error) `perm:"read"` - MpoolCheckReplaceMessages func(p0 context.Context, p1 []*types.Message) ([][]messagepool.MessageCheckStatus, error) `perm:"read"` - MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` - MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` - MpoolGetConfig func(p0 context.Context) (*messagepool.MpoolConfig, error) `perm:"read"` - MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` - MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` - MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"write"` - MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"write"` - MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *apitypes.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` - MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` - MpoolSelects func(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) `perm:"read"` - MpoolSetConfig func(p0 context.Context, p1 *messagepool.MpoolConfig) error `perm:"admin"` - MpoolSub func(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) `perm:"read"` + GasBatchEstimateMessageGas func(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) `perm:"read"` + GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) `perm:"read"` + GasEstimateGasLimit func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) `perm:"read"` + GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) `perm:"read"` + GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"` + MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` + MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolCheckMessages func(p0 context.Context, p1 []*types.MessagePrototype) ([][]types.MessageCheckStatus, error) `perm:"read"` + MpoolCheckPendingMessages func(p0 context.Context, p1 address.Address) ([][]types.MessageCheckStatus, error) `perm:"read"` + MpoolCheckReplaceMessages func(p0 context.Context, p1 []*types.Message) ([][]types.MessageCheckStatus, error) `perm:"read"` + MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` + MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` + MpoolGetConfig func(p0 context.Context) (*types.MpoolConfig, error) `perm:"read"` + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` + MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` + MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"write"` + MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"write"` + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` + MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` + MpoolSelects func(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) `perm:"read"` + MpoolSetConfig func(p0 context.Context, p1 *types.MpoolConfig) error `perm:"admin"` + MpoolSub func(p0 context.Context) (<-chan types.MpoolUpdate, error) `perm:"read"` } } -func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*apitypes.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*apitypes.EstimateResult, error) { +func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) { return s.Internal.GasBatchEstimateMessageGas(p0, p1, p2, p3) } @@ -410,7 +405,7 @@ func (s *IMessagePoolStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64 return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) } -func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *apitypes.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { +func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) } @@ -418,7 +413,7 @@ func (s *IMessagePoolStruct) MpoolBatchPush(p0 context.Context, p1 []*types.Sign return s.Internal.MpoolBatchPush(p0, p1) } -func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *apitypes.MessageSendSpec) ([]*types.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) { return s.Internal.MpoolBatchPushMessage(p0, p1, p2) } @@ -426,15 +421,15 @@ func (s *IMessagePoolStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*t return s.Internal.MpoolBatchPushUntrusted(p0, p1) } -func (s *IMessagePoolStruct) MpoolCheckMessages(p0 context.Context, p1 []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) { +func (s *IMessagePoolStruct) MpoolCheckMessages(p0 context.Context, p1 []*types.MessagePrototype) ([][]types.MessageCheckStatus, error) { return s.Internal.MpoolCheckMessages(p0, p1) } -func (s *IMessagePoolStruct) MpoolCheckPendingMessages(p0 context.Context, p1 address.Address) ([][]messagepool.MessageCheckStatus, error) { +func (s *IMessagePoolStruct) MpoolCheckPendingMessages(p0 context.Context, p1 address.Address) ([][]types.MessageCheckStatus, error) { return s.Internal.MpoolCheckPendingMessages(p0, p1) } -func (s *IMessagePoolStruct) MpoolCheckReplaceMessages(p0 context.Context, p1 []*types.Message) ([][]messagepool.MessageCheckStatus, error) { +func (s *IMessagePoolStruct) MpoolCheckReplaceMessages(p0 context.Context, p1 []*types.Message) ([][]types.MessageCheckStatus, error) { return s.Internal.MpoolCheckReplaceMessages(p0, p1) } @@ -446,7 +441,7 @@ func (s *IMessagePoolStruct) MpoolDeleteByAdress(p0 context.Context, p1 address. return s.Internal.MpoolDeleteByAdress(p0, p1) } -func (s *IMessagePoolStruct) MpoolGetConfig(p0 context.Context) (*messagepool.MpoolConfig, error) { +func (s *IMessagePoolStruct) MpoolGetConfig(p0 context.Context) (*types.MpoolConfig, error) { return s.Internal.MpoolGetConfig(p0) } @@ -470,7 +465,7 @@ func (s *IMessagePoolStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessa return s.Internal.MpoolPush(p0, p1) } -func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *apitypes.MessageSendSpec) (*types.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) { return s.Internal.MpoolPushMessage(p0, p1, p2) } @@ -486,37 +481,37 @@ func (s *IMessagePoolStruct) MpoolSelects(p0 context.Context, p1 types.TipSetKey return s.Internal.MpoolSelects(p0, p1, p2) } -func (s *IMessagePoolStruct) MpoolSetConfig(p0 context.Context, p1 *messagepool.MpoolConfig) error { +func (s *IMessagePoolStruct) MpoolSetConfig(p0 context.Context, p1 *types.MpoolConfig) error { return s.Internal.MpoolSetConfig(p0, p1) } -func (s *IMessagePoolStruct) MpoolSub(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) { +func (s *IMessagePoolStruct) MpoolSub(p0 context.Context) (<-chan types.MpoolUpdate, error) { return s.Internal.MpoolSub(p0) } type IMinerStateStruct struct { Internal struct { StateCirculatingSupply func(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` - StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (apitypes.DealCollateralBounds, error) `perm:"read"` + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) `perm:"read"` StateListActors func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (apitypes.MarketBalance, error) `perm:"read"` - StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]apitypes.MarketDeal, error) `perm:"read"` - StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*apitypes.MarketDeal, error) `perm:"read"` + StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) `perm:"read"` + StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) `perm:"read"` + StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) `perm:"read"` StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]apitypes.Deadline, error) `perm:"read"` + StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) `perm:"read"` StateMinerFaults func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` StateMinerInfo func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) `perm:"read"` StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]apitypes.Partition, error) `perm:"read"` - StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*apitypes.MinerPower, error) `perm:"read"` + StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) `perm:"read"` + StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) `perm:"read"` StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) `perm:"read"` StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `perm:"read"` StateMinerRecoveries func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) `perm:"read"` - StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (apitypes.MinerSectors, error) `perm:"read"` + StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) `perm:"read"` StateMinerSectorSize func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (abi.SectorSize, error) `perm:"read"` StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` StateMinerWorkerAddress func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` @@ -533,7 +528,7 @@ func (s *IMinerStateStruct) StateCirculatingSupply(p0 context.Context, p1 types. return s.Internal.StateCirculatingSupply(p0, p1) } -func (s *IMinerStateStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (apitypes.DealCollateralBounds, error) { +func (s *IMinerStateStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) { return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) } @@ -549,15 +544,15 @@ func (s *IMinerStateStruct) StateLookupID(p0 context.Context, p1 address.Address return s.Internal.StateLookupID(p0, p1, p2) } -func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (apitypes.MarketBalance, error) { +func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) { return s.Internal.StateMarketBalance(p0, p1, p2) } -func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]apitypes.MarketDeal, error) { +func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) { return s.Internal.StateMarketDeals(p0, p1) } -func (s *IMinerStateStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*apitypes.MarketDeal, error) { +func (s *IMinerStateStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) { return s.Internal.StateMarketStorageDeal(p0, p1, p2) } @@ -569,7 +564,7 @@ func (s *IMinerStateStruct) StateMinerAvailableBalance(p0 context.Context, p1 ad return s.Internal.StateMinerAvailableBalance(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]apitypes.Deadline, error) { +func (s *IMinerStateStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) { return s.Internal.StateMinerDeadlines(p0, p1, p2) } @@ -585,11 +580,11 @@ func (s *IMinerStateStruct) StateMinerInitialPledgeCollateral(p0 context.Context return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]apitypes.Partition, error) { +func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) { return s.Internal.StateMinerPartitions(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*apitypes.MinerPower, error) { +func (s *IMinerStateStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) { return s.Internal.StateMinerPower(p0, p1, p2) } @@ -609,7 +604,7 @@ func (s *IMinerStateStruct) StateMinerSectorAllocated(p0 context.Context, p1 add return s.Internal.StateMinerSectorAllocated(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (apitypes.MinerSectors, error) { +func (s *IMinerStateStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) { return s.Internal.StateMinerSectorCount(p0, p1, p2) } @@ -651,67 +646,67 @@ func (s *IMinerStateStruct) StateVerifiedClientStatus(p0 context.Context, p1 add type IMiningStruct struct { Internal struct { - MinerCreateBlock func(p0 context.Context, p1 *apitypes.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` - MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*apitypes.MiningBaseInfo, error) `perm:"read"` + MinerCreateBlock func(p0 context.Context, p1 *types.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` + MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*types.MiningBaseInfo, error) `perm:"read"` } } -func (s *IMiningStruct) MinerCreateBlock(p0 context.Context, p1 *apitypes.BlockTemplate) (*types.BlockMsg, error) { +func (s *IMiningStruct) MinerCreateBlock(p0 context.Context, p1 *types.BlockTemplate) (*types.BlockMsg, error) { return s.Internal.MinerCreateBlock(p0, p1) } -func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*apitypes.MiningBaseInfo, error) { +func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*types.MiningBaseInfo, error) { return s.Internal.MinerGetBaseInfo(p0, p1, p2, p3) } type IMultiSigStruct struct { Internal struct { - MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigCancelTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*messagepool.MessagePrototype, error) `perm:"read"` - MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` - MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` - MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*types.MessagePrototype, error) `perm:"sign"` + MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*types.MessagePrototype, error) `perm:"sign"` + MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*types.MessagePrototype, error) `perm:"sign"` + MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) `perm:"sign"` + MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) `perm:"sign"` + MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) `perm:"sign"` + MsigCancelTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*types.MessagePrototype, error) `perm:"read"` + MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*types.MessagePrototype, error) `perm:"sign"` + MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` + MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*types.MessagePrototype, error) `perm:"sign"` + MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*types.MessagePrototype, error) `perm:"sign"` + MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*types.MessagePrototype, error) `perm:"sign"` + MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*types.MessagePrototype, error) `perm:"sign"` + MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*types.MessagePrototype, error) `perm:"sign"` } } -func (s *IMultiSigStruct) MsigAddApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigAddApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*types.MessagePrototype, error) { return s.Internal.MsigAddApprove(p0, p1, p2, p3, p4, p5, p6) } -func (s *IMultiSigStruct) MsigAddCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigAddCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*types.MessagePrototype, error) { return s.Internal.MsigAddCancel(p0, p1, p2, p3, p4, p5) } -func (s *IMultiSigStruct) MsigAddPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigAddPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*types.MessagePrototype, error) { return s.Internal.MsigAddPropose(p0, p1, p2, p3, p4) } -func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) { return s.Internal.MsigApprove(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) { return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) { return s.Internal.MsigCancel(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigCancelTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigCancelTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*types.MessagePrototype, error) { return s.Internal.MsigCancelTxnHash(p0, p1, p2, p3, p4, p5, p6, p7) } -func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*types.MessagePrototype, error) { return s.Internal.MsigCreate(p0, p1, p2, p3, p4, p5, p6) } @@ -719,38 +714,38 @@ func (s *IMultiSigStruct) MsigGetVested(p0 context.Context, p1 address.Address, return s.Internal.MsigGetVested(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*types.MessagePrototype, error) { return s.Internal.MsigPropose(p0, p1, p2, p3, p4, p5, p6) } -func (s *IMultiSigStruct) MsigRemoveSigner(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigRemoveSigner(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*types.MessagePrototype, error) { return s.Internal.MsigRemoveSigner(p0, p1, p2, p3, p4) } -func (s *IMultiSigStruct) MsigSwapApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigSwapApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*types.MessagePrototype, error) { return s.Internal.MsigSwapApprove(p0, p1, p2, p3, p4, p5, p6) } -func (s *IMultiSigStruct) MsigSwapCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigSwapCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*types.MessagePrototype, error) { return s.Internal.MsigSwapCancel(p0, p1, p2, p3, p4, p5) } -func (s *IMultiSigStruct) MsigSwapPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigSwapPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*types.MessagePrototype, error) { return s.Internal.MsigSwapPropose(p0, p1, p2, p3, p4) } type INetworkStruct struct { Internal struct { - NetAddrsListen func(p0 context.Context) (peer.AddrInfo, error) `perm:"read"` - NetworkConnect func(p0 context.Context, p1 []string) (<-chan net.ConnectionResult, error) `perm:"read"` - NetworkFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` - NetworkFindProvidersAsync func(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo `perm:"read"` - NetworkGetBandwidthStats func(p0 context.Context) metrics.Stats `perm:"admin"` - NetworkGetClosestPeers func(p0 context.Context, p1 string) ([]peer.ID, error) `perm:"read"` - NetworkGetPeerAddresses func(p0 context.Context) []ma.Multiaddr `perm:"admin"` - NetworkGetPeerID func(p0 context.Context) peer.ID `perm:"admin"` - NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*net.SwarmConnInfos, error) `perm:"read"` - Version func(p0 context.Context) (apitypes.Version, error) `perm:"read"` + NetAddrsListen func(p0 context.Context) (peer.AddrInfo, error) `perm:"read"` + NetworkConnect func(p0 context.Context, p1 []string) (<-chan types.ConnectionResult, error) `perm:"read"` + NetworkFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` + NetworkFindProvidersAsync func(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo `perm:"read"` + NetworkGetBandwidthStats func(p0 context.Context) metrics.Stats `perm:"admin"` + NetworkGetClosestPeers func(p0 context.Context, p1 string) ([]peer.ID, error) `perm:"read"` + NetworkGetPeerAddresses func(p0 context.Context) []ma.Multiaddr `perm:"admin"` + NetworkGetPeerID func(p0 context.Context) peer.ID `perm:"admin"` + NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*types.SwarmConnInfos, error) `perm:"read"` + Version func(p0 context.Context) (types.Version, error) `perm:"read"` } } @@ -758,7 +753,7 @@ func (s *INetworkStruct) NetAddrsListen(p0 context.Context) (peer.AddrInfo, erro return s.Internal.NetAddrsListen(p0) } -func (s *INetworkStruct) NetworkConnect(p0 context.Context, p1 []string) (<-chan net.ConnectionResult, error) { +func (s *INetworkStruct) NetworkConnect(p0 context.Context, p1 []string) (<-chan types.ConnectionResult, error) { return s.Internal.NetworkConnect(p0, p1) } @@ -786,32 +781,32 @@ func (s *INetworkStruct) NetworkGetPeerID(p0 context.Context) peer.ID { return s.Internal.NetworkGetPeerID(p0) } -func (s *INetworkStruct) NetworkPeers(p0 context.Context, p1 bool, p2 bool, p3 bool) (*net.SwarmConnInfos, error) { +func (s *INetworkStruct) NetworkPeers(p0 context.Context, p1 bool, p2 bool, p3 bool) (*types.SwarmConnInfos, error) { return s.Internal.NetworkPeers(p0, p1, p2, p3) } -func (s *INetworkStruct) Version(p0 context.Context) (apitypes.Version, error) { +func (s *INetworkStruct) Version(p0 context.Context) (types.Version, error) { return s.Internal.Version(p0) } type IPaychanStruct struct { Internal struct { - PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` - PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*apitypes.ChannelAvailableFunds, error) `perm:"sign"` - PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*apitypes.ChannelAvailableFunds, error) `perm:"sign"` - PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paychtypes.ChannelInfo, error) `perm:"sign"` - PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` - PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` - PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []paychtypes.VoucherSpec) (*paychtypes.PaymentInfo, error) `perm:"sign"` - PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychStatus func(p0 context.Context, p1 address.Address) (*paychtypes.Status, error) `perm:"read"` - PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` - PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` - PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` - PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychtypes.VoucherCreateResult, error) `perm:"sign"` - PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` - PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` + PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` + PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` + PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) `perm:"sign"` + PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` + PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` + PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) `perm:"sign"` + PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + PaychStatus func(p0 context.Context, p1 address.Address) (*types.Status, error) `perm:"read"` + PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` + PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` + PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` + PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*types.VoucherCreateResult, error) `perm:"sign"` + PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` + PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` } } @@ -819,11 +814,11 @@ func (s *IPaychanStruct) PaychAllocateLane(p0 context.Context, p1 address.Addres return s.Internal.PaychAllocateLane(p0, p1) } -func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*apitypes.ChannelAvailableFunds, error) { +func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*types.ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFunds(p0, p1) } -func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*apitypes.ChannelAvailableFunds, error) { +func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*types.ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFundsByFromTo(p0, p1, p2) } @@ -831,7 +826,7 @@ func (s *IPaychanStruct) PaychCollect(p0 context.Context, p1 address.Address) (c return s.Internal.PaychCollect(p0, p1) } -func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paychtypes.ChannelInfo, error) { +func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) { return s.Internal.PaychGet(p0, p1, p2, p3) } @@ -843,7 +838,7 @@ func (s *IPaychanStruct) PaychList(p0 context.Context) ([]address.Address, error return s.Internal.PaychList(p0) } -func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []paychtypes.VoucherSpec) (*paychtypes.PaymentInfo, error) { +func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) { return s.Internal.PaychNewPayment(p0, p1, p2, p3) } @@ -851,7 +846,7 @@ func (s *IPaychanStruct) PaychSettle(p0 context.Context, p1 address.Address) (ci return s.Internal.PaychSettle(p0, p1) } -func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*paychtypes.Status, error) { +func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*types.Status, error) { return s.Internal.PaychStatus(p0, p1) } @@ -867,7 +862,7 @@ func (s *IPaychanStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.A return s.Internal.PaychVoucherCheckValid(p0, p1, p2) } -func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychtypes.VoucherCreateResult, error) { +func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*types.VoucherCreateResult, error) { return s.Internal.PaychVoucherCreate(p0, p1, p2, p3) } @@ -881,14 +876,14 @@ func (s *IPaychanStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Addre type ISyncerStruct struct { Internal struct { - ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"write"` - ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (big.Int, error) `perm:"read"` - Concurrent func(p0 context.Context) int64 `perm:"read"` - SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` - StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*apitypes.InvocResult, error) `perm:"read"` - SyncState func(p0 context.Context) (*apitypes.SyncState, error) `perm:"read"` - SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` - SyncerTracker func(p0 context.Context) *syncTypes.TargetTracker `perm:"read"` + ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"write"` + ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (big.Int, error) `perm:"read"` + Concurrent func(p0 context.Context) int64 `perm:"read"` + SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*types.InvocResult, error) `perm:"read"` + SyncState func(p0 context.Context) (*types.SyncState, error) `perm:"read"` + SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` + SyncerTracker func(p0 context.Context) *syncTypes.TargetTracker `perm:"read"` } } @@ -908,11 +903,11 @@ func (s *ISyncerStruct) SetConcurrent(p0 context.Context, p1 int64) error { return s.Internal.SetConcurrent(p0, p1) } -func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*apitypes.InvocResult, error) { +func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*types.InvocResult, error) { return s.Internal.StateCall(p0, p1, p2) } -func (s *ISyncerStruct) SyncState(p0 context.Context) (*apitypes.SyncState, error) { +func (s *ISyncerStruct) SyncState(p0 context.Context) (*types.SyncState, error) { return s.Internal.SyncState(p0) } @@ -926,21 +921,21 @@ func (s *ISyncerStruct) SyncerTracker(p0 context.Context) *syncTypes.TargetTrack type IWalletStruct struct { Internal struct { - HasPassword func(p0 context.Context) bool `perm:"admin"` - LockWallet func(p0 context.Context) error `perm:"admin"` - SetPassword func(p0 context.Context, p1 []byte) error `perm:"admin"` - UnLockWallet func(p0 context.Context, p1 []byte) error `perm:"admin"` - WalletAddresses func(p0 context.Context) []address.Address `perm:"admin"` - WalletBalance func(p0 context.Context, p1 address.Address) (abi.TokenAmount, error) `perm:"read"` - WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"` - WalletExport func(p0 address.Address, p1 string) (*crypto.KeyInfo, error) `perm:"admin"` - WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` - WalletImport func(p0 *crypto.KeyInfo) (address.Address, error) `perm:"admin"` - WalletNewAddress func(p0 address.Protocol) (address.Address, error) `perm:"write"` - WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` - WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) `perm:"sign"` - WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) `perm:"sign"` - WalletState func(p0 context.Context) int `perm:"admin"` + HasPassword func(p0 context.Context) bool `perm:"admin"` + LockWallet func(p0 context.Context) error `perm:"admin"` + SetPassword func(p0 context.Context, p1 []byte) error `perm:"admin"` + UnLockWallet func(p0 context.Context, p1 []byte) error `perm:"admin"` + WalletAddresses func(p0 context.Context) []address.Address `perm:"admin"` + WalletBalance func(p0 context.Context, p1 address.Address) (abi.TokenAmount, error) `perm:"read"` + WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"` + WalletExport func(p0 address.Address, p1 string) (*crypto.KeyInfo, error) `perm:"admin"` + WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` + WalletImport func(p0 *crypto.KeyInfo) (address.Address, error) `perm:"admin"` + WalletNewAddress func(p0 address.Protocol) (address.Address, error) `perm:"write"` + WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` + WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) `perm:"sign"` + WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) `perm:"sign"` + WalletState func(p0 context.Context) int `perm:"admin"` } } @@ -992,7 +987,7 @@ func (s *IWalletStruct) WalletSetDefault(p0 context.Context, p1 address.Address) return s.Internal.WalletSetDefault(p0, p1) } -func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) { +func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) { return s.Internal.WalletSign(p0, p1, p2, p3) } diff --git a/app/client/v0api/full.go b/app/client/v0api/full.go index d417c9198f..5cc5b3c6ca 100644 --- a/app/client/v0api/full.go +++ b/app/client/v0api/full.go @@ -16,12 +16,7 @@ import ( syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/libp2p/net" - "github.com/filecoin-project/venus/venus-shared/messagepool" - paychtypes "github.com/filecoin-project/venus/venus-shared/paych" - "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" "github.com/libp2p/go-libp2p-core/metrics" @@ -85,10 +80,10 @@ func (s *IBeaconStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (* type IBlockStoreStruct struct { Internal struct { - ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` - ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"` - ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` - ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (apitypes.ObjStat, error) `perm:"read"` + ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` + ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"` + ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` + ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) `perm:"read"` } } @@ -104,7 +99,7 @@ func (s *IBlockStoreStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte return s.Internal.ChainReadObj(p0, p1) } -func (s *IBlockStoreStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (apitypes.ObjStat, error) { +func (s *IBlockStoreStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) { return s.Internal.ChainStatObj(p0, p1, p2) } @@ -121,12 +116,12 @@ type IChainInfoStruct struct { BlockTime func(p0 context.Context) time.Duration `perm:"read"` ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) `perm:"read"` ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) `perm:"read"` - ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*apitypes.BlockMessages, error) `perm:"read"` + ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*types.BlockMessages, error) `perm:"read"` ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"` - ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]apitypes.Message, error) `perm:"read"` - ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]apitypes.Message, error) `perm:"read"` + ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]types.Message, error) `perm:"read"` + ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]types.Message, error) `perm:"read"` ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` - ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*apitypes.HeadChange, error) `perm:"read"` + ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*types.HeadChange, error) `perm:"read"` ChainGetRandomnessFromBeacon func(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` ChainGetRandomnessFromTickets func(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` ChainGetReceipts func(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) `perm:"read"` @@ -134,24 +129,24 @@ type IChainInfoStruct struct { ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"` ChainList func(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) `perm:"read"` - ChainNotify func(p0 context.Context) <-chan []*apitypes.HeadChange `perm:"read"` + ChainNotify func(p0 context.Context) <-chan []*types.HeadChange `perm:"read"` ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` GetActor func(p0 context.Context, p1 address.Address) (*types.Actor, error) `perm:"read"` GetEntry func(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) `perm:"read"` GetFullBlock func(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) `perm:"read"` GetParentStateRootActor func(p0 context.Context, p1 *types.TipSet, p2 address.Address) (*types.Actor, error) `perm:"read"` - MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*apitypes.ChainMessage, error) `perm:"read"` - ProtocolParameters func(p0 context.Context) (*apitypes.ProtocolParams, error) `perm:"read"` + MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*types.ChainMessage, error) `perm:"read"` + ProtocolParameters func(p0 context.Context) (*types.ProtocolParams, error) `perm:"read"` ResolveToKeyAddr func(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) `perm:"read"` StateGetReceipt func(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) `perm:"read"` - StateNetworkName func(p0 context.Context) (apitypes.NetworkName, error) `perm:"read"` + StateNetworkName func(p0 context.Context) (types.NetworkName, error) `perm:"read"` StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (network.Version, error) `perm:"read"` - StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*apitypes.MsgLookup, error) `perm:"read"` - StateSearchMsgLimited func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*apitypes.MsgLookup, error) `perm:"read"` + StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*types.MsgLookup, error) `perm:"read"` + StateSearchMsgLimited func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*types.MsgLookup, error) `perm:"read"` StateVerifiedRegistryRootKey func(p0 context.Context, p1 types.TipSetKey) (address.Address, error) `perm:"read"` StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` - StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*apitypes.MsgLookup, error) `perm:"read"` - StateWaitMsgLimited func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*apitypes.MsgLookup, error) `perm:"read"` + StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*types.MsgLookup, error) `perm:"read"` + StateWaitMsgLimited func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*types.MsgLookup, error) `perm:"read"` VerifyEntry func(p0 *types.BeaconEntry, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool `perm:"read"` } } @@ -168,7 +163,7 @@ func (s *IChainInfoStruct) ChainGetBlock(p0 context.Context, p1 cid.Cid) (*types return s.Internal.ChainGetBlock(p0, p1) } -func (s *IChainInfoStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*apitypes.BlockMessages, error) { +func (s *IChainInfoStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*types.BlockMessages, error) { return s.Internal.ChainGetBlockMessages(p0, p1) } @@ -176,11 +171,11 @@ func (s *IChainInfoStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*typ return s.Internal.ChainGetMessage(p0, p1) } -func (s *IChainInfoStruct) ChainGetMessagesInTipset(p0 context.Context, p1 types.TipSetKey) ([]apitypes.Message, error) { +func (s *IChainInfoStruct) ChainGetMessagesInTipset(p0 context.Context, p1 types.TipSetKey) ([]types.Message, error) { return s.Internal.ChainGetMessagesInTipset(p0, p1) } -func (s *IChainInfoStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]apitypes.Message, error) { +func (s *IChainInfoStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]types.Message, error) { return s.Internal.ChainGetParentMessages(p0, p1) } @@ -188,7 +183,7 @@ func (s *IChainInfoStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid return s.Internal.ChainGetParentReceipts(p0, p1) } -func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*apitypes.HeadChange, error) { +func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*types.HeadChange, error) { return s.Internal.ChainGetPath(p0, p1, p2) } @@ -220,7 +215,7 @@ func (s *IChainInfoStruct) ChainList(p0 context.Context, p1 types.TipSetKey, p2 return s.Internal.ChainList(p0, p1, p2) } -func (s *IChainInfoStruct) ChainNotify(p0 context.Context) <-chan []*apitypes.HeadChange { +func (s *IChainInfoStruct) ChainNotify(p0 context.Context) <-chan []*types.HeadChange { return s.Internal.ChainNotify(p0) } @@ -244,11 +239,11 @@ func (s *IChainInfoStruct) GetParentStateRootActor(p0 context.Context, p1 *types return s.Internal.GetParentStateRootActor(p0, p1, p2) } -func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*apitypes.ChainMessage, error) { +func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*types.ChainMessage, error) { return s.Internal.MessageWait(p0, p1, p2, p3) } -func (s *IChainInfoStruct) ProtocolParameters(p0 context.Context) (*apitypes.ProtocolParams, error) { +func (s *IChainInfoStruct) ProtocolParameters(p0 context.Context) (*types.ProtocolParams, error) { return s.Internal.ProtocolParameters(p0) } @@ -260,7 +255,7 @@ func (s *IChainInfoStruct) StateGetReceipt(p0 context.Context, p1 cid.Cid, p2 ty return s.Internal.StateGetReceipt(p0, p1, p2) } -func (s *IChainInfoStruct) StateNetworkName(p0 context.Context) (apitypes.NetworkName, error) { +func (s *IChainInfoStruct) StateNetworkName(p0 context.Context) (types.NetworkName, error) { return s.Internal.StateNetworkName(p0) } @@ -268,11 +263,11 @@ func (s *IChainInfoStruct) StateNetworkVersion(p0 context.Context, p1 types.TipS return s.Internal.StateNetworkVersion(p0, p1) } -func (s *IChainInfoStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*apitypes.MsgLookup, error) { +func (s *IChainInfoStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*types.MsgLookup, error) { return s.Internal.StateSearchMsg(p0, p1) } -func (s *IChainInfoStruct) StateSearchMsgLimited(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*apitypes.MsgLookup, error) { +func (s *IChainInfoStruct) StateSearchMsgLimited(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*types.MsgLookup, error) { return s.Internal.StateSearchMsgLimited(p0, p1, p2) } @@ -284,11 +279,11 @@ func (s *IChainInfoStruct) StateVerifierStatus(p0 context.Context, p1 address.Ad return s.Internal.StateVerifierStatus(p0, p1, p2) } -func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64) (*apitypes.MsgLookup, error) { +func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64) (*types.MsgLookup, error) { return s.Internal.StateWaitMsg(p0, p1, p2) } -func (s *IChainInfoStruct) StateWaitMsgLimited(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*apitypes.MsgLookup, error) { +func (s *IChainInfoStruct) StateWaitMsgLimited(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*types.MsgLookup, error) { return s.Internal.StateWaitMsgLimited(p0, p1, p2, p3) } @@ -356,42 +351,42 @@ func (s *IJwtAuthAPIStruct) Verify(p0 context.Context, p1 string, p2 string) ([] type IMarketStruct struct { Internal struct { - StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]apitypes.MarketBalance, error) `perm:"read"` + StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) `perm:"read"` } } -func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]apitypes.MarketBalance, error) { +func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) { return s.Internal.StateMarketParticipants(p0, p1) } type IMessagePoolStruct struct { Internal struct { - GasBatchEstimateMessageGas func(p0 context.Context, p1 []*apitypes.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*apitypes.EstimateResult, error) `perm:"read"` - GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - GasEstimateGasLimit func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) `perm:"read"` - GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) `perm:"read"` - GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *apitypes.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"` - MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *apitypes.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` - MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` - MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` - MpoolGetConfig func(p0 context.Context) (*messagepool.MpoolConfig, error) `perm:"read"` - MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` - MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` - MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"write"` - MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"write"` - MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *apitypes.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` - MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` - MpoolSelects func(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) `perm:"read"` - MpoolSetConfig func(p0 context.Context, p1 *messagepool.MpoolConfig) error `perm:"admin"` - MpoolSub func(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) `perm:"read"` + GasBatchEstimateMessageGas func(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) `perm:"read"` + GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) `perm:"read"` + GasEstimateGasLimit func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) `perm:"read"` + GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) `perm:"read"` + GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"` + MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` + MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` + MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` + MpoolGetConfig func(p0 context.Context) (*types.MpoolConfig, error) `perm:"read"` + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` + MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` + MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"write"` + MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"write"` + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` + MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` + MpoolSelects func(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) `perm:"read"` + MpoolSetConfig func(p0 context.Context, p1 *types.MpoolConfig) error `perm:"admin"` + MpoolSub func(p0 context.Context) (<-chan types.MpoolUpdate, error) `perm:"read"` } } -func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*apitypes.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*apitypes.EstimateResult, error) { +func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) { return s.Internal.GasBatchEstimateMessageGas(p0, p1, p2, p3) } @@ -407,7 +402,7 @@ func (s *IMessagePoolStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64 return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) } -func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *apitypes.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { +func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) } @@ -415,7 +410,7 @@ func (s *IMessagePoolStruct) MpoolBatchPush(p0 context.Context, p1 []*types.Sign return s.Internal.MpoolBatchPush(p0, p1) } -func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *apitypes.MessageSendSpec) ([]*types.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) { return s.Internal.MpoolBatchPushMessage(p0, p1, p2) } @@ -431,7 +426,7 @@ func (s *IMessagePoolStruct) MpoolDeleteByAdress(p0 context.Context, p1 address. return s.Internal.MpoolDeleteByAdress(p0, p1) } -func (s *IMessagePoolStruct) MpoolGetConfig(p0 context.Context) (*messagepool.MpoolConfig, error) { +func (s *IMessagePoolStruct) MpoolGetConfig(p0 context.Context) (*types.MpoolConfig, error) { return s.Internal.MpoolGetConfig(p0) } @@ -455,7 +450,7 @@ func (s *IMessagePoolStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessa return s.Internal.MpoolPush(p0, p1) } -func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *apitypes.MessageSendSpec) (*types.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) { return s.Internal.MpoolPushMessage(p0, p1, p2) } @@ -471,37 +466,37 @@ func (s *IMessagePoolStruct) MpoolSelects(p0 context.Context, p1 types.TipSetKey return s.Internal.MpoolSelects(p0, p1, p2) } -func (s *IMessagePoolStruct) MpoolSetConfig(p0 context.Context, p1 *messagepool.MpoolConfig) error { +func (s *IMessagePoolStruct) MpoolSetConfig(p0 context.Context, p1 *types.MpoolConfig) error { return s.Internal.MpoolSetConfig(p0, p1) } -func (s *IMessagePoolStruct) MpoolSub(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) { +func (s *IMessagePoolStruct) MpoolSub(p0 context.Context) (<-chan types.MpoolUpdate, error) { return s.Internal.MpoolSub(p0) } type IMinerStateStruct struct { Internal struct { StateCirculatingSupply func(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` - StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (apitypes.DealCollateralBounds, error) `perm:"read"` + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) `perm:"read"` StateListActors func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (apitypes.MarketBalance, error) `perm:"read"` - StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]apitypes.MarketDeal, error) `perm:"read"` - StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*apitypes.MarketDeal, error) `perm:"read"` + StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) `perm:"read"` + StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) `perm:"read"` + StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) `perm:"read"` StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]apitypes.Deadline, error) `perm:"read"` + StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) `perm:"read"` StateMinerFaults func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` StateMinerInfo func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) `perm:"read"` StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]apitypes.Partition, error) `perm:"read"` - StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*apitypes.MinerPower, error) `perm:"read"` + StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) `perm:"read"` + StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) `perm:"read"` StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) `perm:"read"` StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `perm:"read"` StateMinerRecoveries func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) `perm:"read"` - StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (apitypes.MinerSectors, error) `perm:"read"` + StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) `perm:"read"` StateMinerSectorSize func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (abi.SectorSize, error) `perm:"read"` StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` StateMinerWorkerAddress func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` @@ -518,7 +513,7 @@ func (s *IMinerStateStruct) StateCirculatingSupply(p0 context.Context, p1 types. return s.Internal.StateCirculatingSupply(p0, p1) } -func (s *IMinerStateStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (apitypes.DealCollateralBounds, error) { +func (s *IMinerStateStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) { return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) } @@ -534,15 +529,15 @@ func (s *IMinerStateStruct) StateLookupID(p0 context.Context, p1 address.Address return s.Internal.StateLookupID(p0, p1, p2) } -func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (apitypes.MarketBalance, error) { +func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) { return s.Internal.StateMarketBalance(p0, p1, p2) } -func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]apitypes.MarketDeal, error) { +func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) { return s.Internal.StateMarketDeals(p0, p1) } -func (s *IMinerStateStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*apitypes.MarketDeal, error) { +func (s *IMinerStateStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) { return s.Internal.StateMarketStorageDeal(p0, p1, p2) } @@ -554,7 +549,7 @@ func (s *IMinerStateStruct) StateMinerAvailableBalance(p0 context.Context, p1 ad return s.Internal.StateMinerAvailableBalance(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]apitypes.Deadline, error) { +func (s *IMinerStateStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) { return s.Internal.StateMinerDeadlines(p0, p1, p2) } @@ -570,11 +565,11 @@ func (s *IMinerStateStruct) StateMinerInitialPledgeCollateral(p0 context.Context return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]apitypes.Partition, error) { +func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) { return s.Internal.StateMinerPartitions(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*apitypes.MinerPower, error) { +func (s *IMinerStateStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) { return s.Internal.StateMinerPower(p0, p1, p2) } @@ -594,7 +589,7 @@ func (s *IMinerStateStruct) StateMinerSectorAllocated(p0 context.Context, p1 add return s.Internal.StateMinerSectorAllocated(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (apitypes.MinerSectors, error) { +func (s *IMinerStateStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) { return s.Internal.StateMinerSectorCount(p0, p1, p2) } @@ -636,16 +631,16 @@ func (s *IMinerStateStruct) StateVerifiedClientStatus(p0 context.Context, p1 add type IMiningStruct struct { Internal struct { - MinerCreateBlock func(p0 context.Context, p1 *apitypes.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` - MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*apitypes.MiningBaseInfo, error) `perm:"read"` + MinerCreateBlock func(p0 context.Context, p1 *types.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` + MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*types.MiningBaseInfo, error) `perm:"read"` } } -func (s *IMiningStruct) MinerCreateBlock(p0 context.Context, p1 *apitypes.BlockTemplate) (*types.BlockMsg, error) { +func (s *IMiningStruct) MinerCreateBlock(p0 context.Context, p1 *types.BlockTemplate) (*types.BlockMsg, error) { return s.Internal.MinerCreateBlock(p0, p1) } -func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*apitypes.MiningBaseInfo, error) { +func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*types.MiningBaseInfo, error) { return s.Internal.MinerGetBaseInfo(p0, p1, p2, p3) } @@ -721,16 +716,16 @@ func (s *IMultiSigStruct) MsigSwapPropose(p0 context.Context, p1 address.Address type INetworkStruct struct { Internal struct { - NetAddrsListen func(p0 context.Context) (peer.AddrInfo, error) `perm:"read"` - NetworkConnect func(p0 context.Context, p1 []string) (<-chan net.ConnectionResult, error) `perm:"read"` - NetworkFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` - NetworkFindProvidersAsync func(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo `perm:"read"` - NetworkGetBandwidthStats func(p0 context.Context) metrics.Stats `perm:"admin"` - NetworkGetClosestPeers func(p0 context.Context, p1 string) ([]peer.ID, error) `perm:"admin"` - NetworkGetPeerAddresses func(p0 context.Context) []ma.Multiaddr `perm:"admin"` - NetworkGetPeerID func(p0 context.Context) peer.ID `perm:"admin"` - NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*net.SwarmConnInfos, error) `perm:"read"` - Version func(p0 context.Context) (apitypes.Version, error) `perm:"read"` + NetAddrsListen func(p0 context.Context) (peer.AddrInfo, error) `perm:"read"` + NetworkConnect func(p0 context.Context, p1 []string) (<-chan types.ConnectionResult, error) `perm:"read"` + NetworkFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` + NetworkFindProvidersAsync func(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo `perm:"read"` + NetworkGetBandwidthStats func(p0 context.Context) metrics.Stats `perm:"admin"` + NetworkGetClosestPeers func(p0 context.Context, p1 string) ([]peer.ID, error) `perm:"admin"` + NetworkGetPeerAddresses func(p0 context.Context) []ma.Multiaddr `perm:"admin"` + NetworkGetPeerID func(p0 context.Context) peer.ID `perm:"admin"` + NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*types.SwarmConnInfos, error) `perm:"read"` + Version func(p0 context.Context) (types.Version, error) `perm:"read"` } } @@ -738,7 +733,7 @@ func (s *INetworkStruct) NetAddrsListen(p0 context.Context) (peer.AddrInfo, erro return s.Internal.NetAddrsListen(p0) } -func (s *INetworkStruct) NetworkConnect(p0 context.Context, p1 []string) (<-chan net.ConnectionResult, error) { +func (s *INetworkStruct) NetworkConnect(p0 context.Context, p1 []string) (<-chan types.ConnectionResult, error) { return s.Internal.NetworkConnect(p0, p1) } @@ -766,32 +761,32 @@ func (s *INetworkStruct) NetworkGetPeerID(p0 context.Context) peer.ID { return s.Internal.NetworkGetPeerID(p0) } -func (s *INetworkStruct) NetworkPeers(p0 context.Context, p1 bool, p2 bool, p3 bool) (*net.SwarmConnInfos, error) { +func (s *INetworkStruct) NetworkPeers(p0 context.Context, p1 bool, p2 bool, p3 bool) (*types.SwarmConnInfos, error) { return s.Internal.NetworkPeers(p0, p1, p2, p3) } -func (s *INetworkStruct) Version(p0 context.Context) (apitypes.Version, error) { +func (s *INetworkStruct) Version(p0 context.Context) (types.Version, error) { return s.Internal.Version(p0) } type IPaychanStruct struct { Internal struct { - PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` - PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*apitypes.ChannelAvailableFunds, error) `perm:"sign"` - PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*apitypes.ChannelAvailableFunds, error) `perm:"sign"` - PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paychtypes.ChannelInfo, error) `perm:"sign"` - PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` - PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` - PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []paychtypes.VoucherSpec) (*paychtypes.PaymentInfo, error) `perm:"sign"` - PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychStatus func(p0 context.Context, p1 address.Address) (*paychtypes.Status, error) `perm:"read"` - PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` - PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` - PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` - PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychtypes.VoucherCreateResult, error) `perm:"sign"` - PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` - PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` + PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` + PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` + PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) `perm:"sign"` + PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` + PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` + PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) `perm:"sign"` + PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + PaychStatus func(p0 context.Context, p1 address.Address) (*types.Status, error) `perm:"read"` + PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` + PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` + PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` + PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*types.VoucherCreateResult, error) `perm:"sign"` + PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` + PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` } } @@ -799,11 +794,11 @@ func (s *IPaychanStruct) PaychAllocateLane(p0 context.Context, p1 address.Addres return s.Internal.PaychAllocateLane(p0, p1) } -func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*apitypes.ChannelAvailableFunds, error) { +func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*types.ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFunds(p0, p1) } -func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*apitypes.ChannelAvailableFunds, error) { +func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*types.ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFundsByFromTo(p0, p1, p2) } @@ -811,7 +806,7 @@ func (s *IPaychanStruct) PaychCollect(p0 context.Context, p1 address.Address) (c return s.Internal.PaychCollect(p0, p1) } -func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paychtypes.ChannelInfo, error) { +func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) { return s.Internal.PaychGet(p0, p1, p2, p3) } @@ -823,7 +818,7 @@ func (s *IPaychanStruct) PaychList(p0 context.Context) ([]address.Address, error return s.Internal.PaychList(p0) } -func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []paychtypes.VoucherSpec) (*paychtypes.PaymentInfo, error) { +func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) { return s.Internal.PaychNewPayment(p0, p1, p2, p3) } @@ -831,7 +826,7 @@ func (s *IPaychanStruct) PaychSettle(p0 context.Context, p1 address.Address) (ci return s.Internal.PaychSettle(p0, p1) } -func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*paychtypes.Status, error) { +func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*types.Status, error) { return s.Internal.PaychStatus(p0, p1) } @@ -847,7 +842,7 @@ func (s *IPaychanStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.A return s.Internal.PaychVoucherCheckValid(p0, p1, p2) } -func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paychtypes.VoucherCreateResult, error) { +func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*types.VoucherCreateResult, error) { return s.Internal.PaychVoucherCreate(p0, p1, p2, p3) } @@ -861,14 +856,14 @@ func (s *IPaychanStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Addre type ISyncerStruct struct { Internal struct { - ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"write"` - ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (big.Int, error) `perm:"read"` - Concurrent func(p0 context.Context) int64 `perm:"read"` - SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` - StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*apitypes.InvocResult, error) `perm:"read"` - SyncState func(p0 context.Context) (*apitypes.SyncState, error) `perm:"read"` - SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` - SyncerTracker func(p0 context.Context) *syncTypes.TargetTracker `perm:"read"` + ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"write"` + ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (big.Int, error) `perm:"read"` + Concurrent func(p0 context.Context) int64 `perm:"read"` + SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*types.InvocResult, error) `perm:"read"` + SyncState func(p0 context.Context) (*types.SyncState, error) `perm:"read"` + SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` + SyncerTracker func(p0 context.Context) *syncTypes.TargetTracker `perm:"read"` } } @@ -888,11 +883,11 @@ func (s *ISyncerStruct) SetConcurrent(p0 context.Context, p1 int64) error { return s.Internal.SetConcurrent(p0, p1) } -func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*apitypes.InvocResult, error) { +func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*types.InvocResult, error) { return s.Internal.StateCall(p0, p1, p2) } -func (s *ISyncerStruct) SyncState(p0 context.Context) (*apitypes.SyncState, error) { +func (s *ISyncerStruct) SyncState(p0 context.Context) (*types.SyncState, error) { return s.Internal.SyncState(p0) } @@ -906,21 +901,21 @@ func (s *ISyncerStruct) SyncerTracker(p0 context.Context) *syncTypes.TargetTrack type IWalletStruct struct { Internal struct { - HasPassword func(p0 context.Context) bool `perm:"admin"` - LockWallet func(p0 context.Context) error `perm:"admin"` - SetPassword func(p0 context.Context, p1 []byte) error `perm:"admin"` - UnLockWallet func(p0 context.Context, p1 []byte) error `perm:"admin"` - WalletAddresses func(p0 context.Context) []address.Address `perm:"admin"` - WalletBalance func(p0 context.Context, p1 address.Address) (abi.TokenAmount, error) `perm:"read"` - WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"` - WalletExport func(p0 address.Address, p1 string) (*crypto.KeyInfo, error) `perm:"admin"` - WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` - WalletImport func(p0 *crypto.KeyInfo) (address.Address, error) `perm:"admin"` - WalletNewAddress func(p0 address.Protocol) (address.Address, error) `perm:"write"` - WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` - WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) `perm:"sign"` - WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) `perm:"sign"` - WalletState func(p0 context.Context) int `perm:"admin"` + HasPassword func(p0 context.Context) bool `perm:"admin"` + LockWallet func(p0 context.Context) error `perm:"admin"` + SetPassword func(p0 context.Context, p1 []byte) error `perm:"admin"` + UnLockWallet func(p0 context.Context, p1 []byte) error `perm:"admin"` + WalletAddresses func(p0 context.Context) []address.Address `perm:"admin"` + WalletBalance func(p0 context.Context, p1 address.Address) (abi.TokenAmount, error) `perm:"read"` + WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"` + WalletExport func(p0 address.Address, p1 string) (*crypto.KeyInfo, error) `perm:"admin"` + WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` + WalletImport func(p0 *crypto.KeyInfo) (address.Address, error) `perm:"admin"` + WalletNewAddress func(p0 address.Protocol) (address.Address, error) `perm:"write"` + WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` + WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) `perm:"sign"` + WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) `perm:"sign"` + WalletState func(p0 context.Context) int `perm:"admin"` } } @@ -972,7 +967,7 @@ func (s *IWalletStruct) WalletSetDefault(p0 context.Context, p1 address.Address) return s.Internal.WalletSetDefault(p0, p1) } -func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) { +func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) { return s.Internal.WalletSign(p0, p1, p2, p3) } diff --git a/app/node/builder.go b/app/node/builder.go index 0183ffb7aa..bb22701e5e 100644 --- a/app/node/builder.go +++ b/app/node/builder.go @@ -33,7 +33,7 @@ import ( "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/util/ffiwrapper" "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // Builder is a helper to aid in the construction of a filecoin node. diff --git a/app/node/helpers.go b/app/node/helpers.go index 9f8e49f8fc..3e04a5c1cc 100644 --- a/app/node/helpers.go +++ b/app/node/helpers.go @@ -11,7 +11,7 @@ import ( "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // readGenesisCid is a helper function that queries the provided datastore for diff --git a/app/node/test/node.go b/app/node/test/node.go index 1ecd417cc0..57150a206d 100644 --- a/app/node/test/node.go +++ b/app/node/test/node.go @@ -23,7 +23,7 @@ import ( "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" "github.com/filecoin-project/venus/pkg/wallet" gengen "github.com/filecoin-project/venus/tools/gengen/util" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // ChainSeed is a generalized struct for configuring node diff --git a/app/submodule/apitypes/chain.go b/app/submodule/apitypes/chain.go index 5a7b7205e4..7bb3eaab41 100644 --- a/app/submodule/apitypes/chain.go +++ b/app/submodule/apitypes/chain.go @@ -11,7 +11,7 @@ import ( "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type Partition struct { diff --git a/app/submodule/apitypes/mining.go b/app/submodule/apitypes/mining.go index aa8db82f9c..9da5868b29 100644 --- a/app/submodule/apitypes/mining.go +++ b/app/submodule/apitypes/mining.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type MiningBaseInfo struct { //nolint diff --git a/app/submodule/apitypes/mpool.go b/app/submodule/apitypes/mpool.go index a44bf2a665..f2a6465dbb 100644 --- a/app/submodule/apitypes/mpool.go +++ b/app/submodule/apitypes/mpool.go @@ -1,7 +1,7 @@ package apitypes import ( - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ) diff --git a/app/submodule/apitypes/syncer.go b/app/submodule/apitypes/syncer.go index 49452eb58b..06bbca1f0e 100644 --- a/app/submodule/apitypes/syncer.go +++ b/app/submodule/apitypes/syncer.go @@ -5,14 +5,13 @@ import ( "time" "github.com/filecoin-project/go-state-types/abi" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ) type ComputeStateOutput struct { Root cid.Cid - Trace []*apitypes.InvocResult + Trace []*types.InvocResult } type SyncState struct { diff --git a/app/submodule/blockstore/blockstore_api.go b/app/submodule/blockstore/blockstore_api.go index 1ed8e86d67..6021fff055 100644 --- a/app/submodule/blockstore/blockstore_api.go +++ b/app/submodule/blockstore/blockstore_api.go @@ -4,6 +4,8 @@ import ( "context" "sync" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" offline "github.com/ipfs/go-ipfs-exchange-offline" @@ -11,7 +13,6 @@ import ( "github.com/ipfs/go-merkledag" "golang.org/x/xerrors" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" ) @@ -38,7 +39,7 @@ func (blockstoreAPI *blockstoreAPI) ChainHasObj(ctx context.Context, obj cid.Cid return blockstoreAPI.blockstore.Blockstore.Has(ctx, obj) } -func (blockstoreAPI *blockstoreAPI) ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (apitypes.ObjStat, error) { +func (blockstoreAPI *blockstoreAPI) ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (types.ObjStat, error) { bs := blockstoreAPI.blockstore.Blockstore bsvc := blockservice.New(bs, offline.Exchange(bs)) @@ -47,7 +48,7 @@ func (blockstoreAPI *blockstoreAPI) ChainStatObj(ctx context.Context, obj cid.Ci seen := cid.NewSet() var statslk sync.Mutex - var stats apitypes.ObjStat + var stats types.ObjStat var collect = true walker := func(ctx context.Context, c cid.Cid) ([]*ipld.Link, error) { @@ -74,13 +75,13 @@ func (blockstoreAPI *blockstoreAPI) ChainStatObj(ctx context.Context, obj cid.Ci if base != cid.Undef { collect = false if err := merkledag.Walk(ctx, walker, base, seen.Visit, merkledag.Concurrent()); err != nil { - return apitypes.ObjStat{}, err + return types.ObjStat{}, err } collect = true } if err := merkledag.Walk(ctx, walker, obj, seen.Visit, merkledag.Concurrent()); err != nil { - return apitypes.ObjStat{}, err + return types.ObjStat{}, err } return stats, nil diff --git a/app/submodule/chain/account_api.go b/app/submodule/chain/account_api.go index a68cab971b..732881aa6c 100644 --- a/app/submodule/chain/account_api.go +++ b/app/submodule/chain/account_api.go @@ -4,7 +4,7 @@ import ( "context" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-address" "golang.org/x/xerrors" diff --git a/app/submodule/chain/actor_api.go b/app/submodule/chain/actor_api.go index b779685cb3..31766de332 100644 --- a/app/submodule/chain/actor_api.go +++ b/app/submodule/chain/actor_api.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-address" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var _ v1api.IActor = &actorAPI{} diff --git a/app/submodule/chain/beacon_api.go b/app/submodule/chain/beacon_api.go index a99b5b7850..8c33ee0b1e 100644 --- a/app/submodule/chain/beacon_api.go +++ b/app/submodule/chain/beacon_api.go @@ -6,7 +6,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" xerrors "github.com/pkg/errors" ) diff --git a/app/submodule/chain/chain_submodule.go b/app/submodule/chain/chain_submodule.go index fbd03e376b..015e63718e 100644 --- a/app/submodule/chain/chain_submodule.go +++ b/app/submodule/chain/chain_submodule.go @@ -20,7 +20,7 @@ import ( "github.com/filecoin-project/venus/pkg/vmsupport" v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // ChainSubmodule enhances the `Node` with chain capabilities. diff --git a/app/submodule/chain/chaininfo_api.go b/app/submodule/chain/chaininfo_api.go index 9f100b6444..3988785423 100644 --- a/app/submodule/chain/chaininfo_api.go +++ b/app/submodule/chain/chaininfo_api.go @@ -16,9 +16,8 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/chain" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var _ v1api.IChainInfo = &chainInfoAPI{} @@ -59,23 +58,23 @@ func (cia *chainInfoAPI) ChainList(ctx context.Context, tsKey types.TipSetKey, c } // ProtocolParameters return chain parameters -func (cia *chainInfoAPI) ProtocolParameters(ctx context.Context) (*apitypes.ProtocolParams, error) { +func (cia *chainInfoAPI) ProtocolParameters(ctx context.Context) (*types.ProtocolParams, error) { networkName, err := cia.getNetworkName(ctx) if err != nil { return nil, xerrors.Errorf("could not retrieve network name %w", err) } - var supportedSectors []apitypes.SectorInfo + var supportedSectors []types.SectorInfo for proof := range miner0.SupportedProofTypes { size, err := proof.SectorSize() if err != nil { return nil, xerrors.Errorf("could not retrieve network name %w", err) } maxUserBytes := abi.PaddedPieceSize(size).Unpadded() - supportedSectors = append(supportedSectors, apitypes.SectorInfo{Size: size, MaxPieceSize: maxUserBytes}) + supportedSectors = append(supportedSectors, types.SectorInfo{Size: size, MaxPieceSize: maxUserBytes}) } - return &apitypes.ProtocolParams{ + return &types.ProtocolParams{ Network: networkName, BlockTime: cia.chain.config.BlockTime(), SupportedSectors: supportedSectors, @@ -156,7 +155,7 @@ func (cia *chainInfoAPI) ChainGetMessage(ctx context.Context, msgID cid.Cid) (*t } // ChainGetMessages gets a message collection by CID -func (cia *chainInfoAPI) ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*apitypes.BlockMessages, error) { +func (cia *chainInfoAPI) ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*types.BlockMessages, error) { b, err := cia.chain.ChainReader.GetBlock(ctx, bid) if err != nil { return nil, err @@ -177,7 +176,7 @@ func (cia *chainInfoAPI) ChainGetBlockMessages(ctx context.Context, bid cid.Cid) cids[i+len(bmsgs)] = m.Cid() } - return &apitypes.BlockMessages{ + return &types.BlockMessages{ BlsMessages: bmsgs, SecpkMessages: smsgs, Cids: cids, @@ -207,7 +206,7 @@ func (cia *chainInfoAPI) GetFullBlock(ctx context.Context, id cid.Cid) (*types.F } // ChainGetMessagesInTipset returns message stores in current tipset -func (cia *chainInfoAPI) ChainGetMessagesInTipset(ctx context.Context, key types.TipSetKey) ([]apitypes.Message, error) { +func (cia *chainInfoAPI) ChainGetMessagesInTipset(ctx context.Context, key types.TipSetKey) ([]types.MessageCID, error) { ts, err := cia.chain.ChainReader.GetTipSet(ctx, key) if err != nil { return nil, err @@ -221,9 +220,9 @@ func (cia *chainInfoAPI) ChainGetMessagesInTipset(ctx context.Context, key types return nil, err } - var out []apitypes.Message + var out []types.MessageCID for _, m := range cm { - out = append(out, apitypes.Message{ + out = append(out, types.MessageCID{ Cid: m.Cid(), Message: m.VMMessage(), }) @@ -234,7 +233,7 @@ func (cia *chainInfoAPI) ChainGetMessagesInTipset(ctx context.Context, key types // ChainGetParentMessages returns messages stored in parent tipset of the // specified block. -func (cia *chainInfoAPI) ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]apitypes.Message, error) { +func (cia *chainInfoAPI) ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]types.MessageCID, error) { b, err := cia.ChainGetBlock(ctx, bcid) if err != nil { return nil, err @@ -256,9 +255,9 @@ func (cia *chainInfoAPI) ChainGetParentMessages(ctx context.Context, bcid cid.Ci return nil, err } - var out []apitypes.Message + var out []types.MessageCID for _, m := range cm { - out = append(out, apitypes.Message{ + out = append(out, types.MessageCID{ Cid: m.Cid(), Message: m.VMMessage(), }) @@ -313,7 +312,7 @@ func (cia *chainInfoAPI) ResolveToKeyAddr(ctx context.Context, addr address.Addr //************Drand****************// // ChainNotify subscribe to chain head change event -func (cia *chainInfoAPI) ChainNotify(ctx context.Context) (<-chan []*apitypes.HeadChange, error) { +func (cia *chainInfoAPI) ChainNotify(ctx context.Context) (<-chan []*types.HeadChange, error) { return cia.chain.ChainReader.SubHeadChanges(ctx), nil } @@ -340,10 +339,10 @@ func (cia *chainInfoAPI) VerifyEntry(parent, child *types.BeaconEntry, height ab } // StateNetworkName returns the name of the network the node is synced to -func (cia *chainInfoAPI) StateNetworkName(ctx context.Context) (apitypes.NetworkName, error) { +func (cia *chainInfoAPI) StateNetworkName(ctx context.Context) (types.NetworkName, error) { networkName, err := cia.getNetworkName(ctx) - return apitypes.NetworkName(networkName), err + return types.NetworkName(networkName), err } func (cia *chainInfoAPI) getNetworkName(ctx context.Context) (string, error) { @@ -464,7 +463,7 @@ func (cia *chainInfoAPI) StateVerifierStatus(ctx context.Context, addr address.A // the case that it appears in a newly mined block. An error is returned if one is // encountered or if the context is canceled. Otherwise, it waits forever for the message // to appear on chain. -func (cia *chainInfoAPI) MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*apitypes.ChainMessage, error) { +func (cia *chainInfoAPI) MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*types.ChainMessage, error) { chainMsg, err := cia.chain.MessageStore.LoadMessage(ctx, msgCid) if err != nil { return nil, err @@ -473,7 +472,7 @@ func (cia *chainInfoAPI) MessageWait(ctx context.Context, msgCid cid.Cid, confid } // StateSearchMsg searches for a message in the chain, and returns its receipt and the tipset where it was executed -func (cia *chainInfoAPI) StateSearchMsg(ctx context.Context, from types.TipSetKey, mCid cid.Cid, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) { +func (cia *chainInfoAPI) StateSearchMsg(ctx context.Context, from types.TipSetKey, mCid cid.Cid, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) { chainMsg, err := cia.chain.MessageStore.LoadMessage(ctx, mCid) if err != nil { return nil, err @@ -489,7 +488,7 @@ func (cia *chainInfoAPI) StateSearchMsg(ctx context.Context, from types.TipSetKe } if found { - return &apitypes.MsgLookup{ + return &types.MsgLookup{ Message: mCid, Receipt: *msgResult.Receipt, TipSet: msgResult.TS.Key(), @@ -501,7 +500,7 @@ func (cia *chainInfoAPI) StateSearchMsg(ctx context.Context, from types.TipSetKe // StateWaitMsg looks back in the chain for a message. If not found, it blocks until the // message arrives on chain, and gets to the indicated confidence depth. -func (cia *chainInfoAPI) StateWaitMsg(ctx context.Context, mCid cid.Cid, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) { +func (cia *chainInfoAPI) StateWaitMsg(ctx context.Context, mCid cid.Cid, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) { chainMsg, err := cia.chain.MessageStore.LoadMessage(ctx, mCid) if err != nil { return nil, err @@ -511,7 +510,7 @@ func (cia *chainInfoAPI) StateWaitMsg(ctx context.Context, mCid cid.Cid, confide return nil, err } if msgResult != nil { - return &apitypes.MsgLookup{ + return &types.MsgLookup{ Message: mCid, Receipt: *msgResult.Receipt, TipSet: msgResult.TS.Key(), @@ -583,7 +582,7 @@ func (cia *chainInfoAPI) ChainExport(ctx context.Context, nroots abi.ChainEpoch, // tRR //``` // Would return `[revert(tBA), apply(tAB), apply(tAA)]` -func (cia *chainInfoAPI) ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*apitypes.HeadChange, error) { +func (cia *chainInfoAPI) ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*types.HeadChange, error) { fts, err := cia.chain.ChainReader.GetTipSet(ctx, from) if err != nil { return nil, xerrors.Errorf("loading from tipset %s: %w", from, err) @@ -598,12 +597,12 @@ func (cia *chainInfoAPI) ChainGetPath(ctx context.Context, from types.TipSetKey, return nil, xerrors.Errorf("error getting tipset branches: %w", err) } - path := make([]*apitypes.HeadChange, len(revert)+len(apply)) + path := make([]*types.HeadChange, len(revert)+len(apply)) for i, r := range revert { - path[i] = &apitypes.HeadChange{Type: chain.HCRevert, Val: r} + path[i] = &types.HeadChange{Type: chain.HCRevert, Val: r} } for j, i := 0, len(apply)-1; i >= 0; j, i = j+1, i-1 { - path[j+len(revert)] = &apitypes.HeadChange{Type: chain.HCApply, Val: apply[i]} + path[j+len(revert)] = &types.HeadChange{Type: chain.HCApply, Val: apply[i]} } return path, nil } diff --git a/app/submodule/chain/miner_api.go b/app/submodule/chain/miner_api.go index f7bf7db661..e0a8ba64fd 100644 --- a/app/submodule/chain/miner_api.go +++ b/app/submodule/chain/miner_api.go @@ -17,9 +17,8 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" "github.com/filecoin-project/venus/venus-shared/actors/policy" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var _ v1api.IMinerState = &minerStateAPI{} @@ -175,7 +174,7 @@ func (msa *minerStateAPI) StateMinerProvingDeadline(ctx context.Context, maddr a } // StateMinerPartitions returns all partitions in the specified deadline -func (msa *minerStateAPI) StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]apitypes.Partition, error) { +func (msa *minerStateAPI) StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]types.Partition, error) { _, view, err := msa.Stmgr.ParentStateViewTsk(ctx, tsk) if err != nil { return nil, xerrors.Errorf("Stmgr.ParentStateViewTsk failed:%v", err) @@ -191,7 +190,7 @@ func (msa *minerStateAPI) StateMinerPartitions(ctx context.Context, maddr addres return nil, xerrors.Errorf("failed to load the deadline: %v", err) } - var out []apitypes.Partition + var out []types.Partition err = dl.ForEachPartition(func(_ uint64, part miner.Partition) error { allSectors, err := part.AllSectors() if err != nil { @@ -218,7 +217,7 @@ func (msa *minerStateAPI) StateMinerPartitions(ctx context.Context, maddr addres return xerrors.Errorf("getting ActiveSectors: %v", err) } - out = append(out, apitypes.Partition{ + out = append(out, types.Partition{ AllSectors: allSectors, FaultySectors: faultySectors, RecoveringSectors: recoveringSectors, @@ -232,7 +231,7 @@ func (msa *minerStateAPI) StateMinerPartitions(ctx context.Context, maddr addres } // StateMinerDeadlines returns all the proving deadlines for the given miner -func (msa *minerStateAPI) StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]apitypes.Deadline, error) { +func (msa *minerStateAPI) StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]types.Deadline, error) { _, view, err := msa.Stmgr.ParentStateViewTsk(ctx, tsk) if err != nil { return nil, xerrors.Errorf("Stmgr.ParentStateViewTsk failed:%v", err) @@ -248,7 +247,7 @@ func (msa *minerStateAPI) StateMinerDeadlines(ctx context.Context, maddr address return nil, xerrors.Errorf("getting deadline count: %v", err) } - out := make([]apitypes.Deadline, deadlines) + out := make([]types.Deadline, deadlines) if err := mas.ForEachDeadline(func(i uint64, dl miner.Deadline) error { ps, err := dl.PartitionsPoSted() if err != nil { @@ -260,7 +259,7 @@ func (msa *minerStateAPI) StateMinerDeadlines(ctx context.Context, maddr address return err } - out[i] = apitypes.Deadline{ + out[i] = types.Deadline{ PostSubmissions: ps, DisputableProofCount: l, } @@ -287,7 +286,7 @@ func (msa *minerStateAPI) StateMinerSectors(ctx context.Context, maddr address.A } // StateMarketStorageDeal returns information about the indicated deal -func (msa *minerStateAPI) StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*apitypes.MarketDeal, error) { +func (msa *minerStateAPI) StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.MarketDeal, error) { _, view, err := msa.Stmgr.ParentStateViewTsk(ctx, tsk) if err != nil { return nil, xerrors.Errorf("Stmgr.ParentStateViewTsk failed:%v", err) @@ -325,7 +324,7 @@ func (msa *minerStateAPI) StateMarketStorageDeal(ctx context.Context, dealID abi st = market.EmptyDealState() } - return &apitypes.MarketDeal{ + return &types.MarketDeal{ Proposal: *proposal, State: *st, }, nil @@ -501,7 +500,7 @@ func (msa *minerStateAPI) StateCirculatingSupply(ctx context.Context, tsk types. } // StateMarketDeals returns information about every deal in the Storage Market -func (msa *minerStateAPI) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]apitypes.MarketDeal, error) { +func (msa *minerStateAPI) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) { _, view, err := msa.Stmgr.ParentStateViewTsk(ctx, tsk) if err != nil { return nil, xerrors.Errorf("Stmgr.ParentStateViewTsk failed:%w", err) @@ -558,7 +557,7 @@ func (msa *minerStateAPI) StateListActors(ctx context.Context, tsk types.TipSetK } // StateMinerPower returns the power of the indicated miner -func (msa *minerStateAPI) StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*apitypes.MinerPower, error) { +func (msa *minerStateAPI) StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.MinerPower, error) { _, view, err := msa.Stmgr.ParentStateViewTsk(ctx, tsk) if err != nil { return nil, xerrors.Errorf("Stmgr.ParentStateViewTsk failed:%v", err) @@ -568,7 +567,7 @@ func (msa *minerStateAPI) StateMinerPower(ctx context.Context, addr address.Addr return nil, err } - return &apitypes.MinerPower{ + return &types.MinerPower{ MinerPower: mp, TotalPower: net, HasMinPower: hmp, @@ -600,15 +599,15 @@ func (msa *minerStateAPI) StateSectorExpiration(ctx context.Context, maddr addre } // StateMinerSectorCount returns the number of sectors in a miner's sector set and proving set -func (msa *minerStateAPI) StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (apitypes.MinerSectors, error) { +func (msa *minerStateAPI) StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MinerSectors, error) { _, view, err := msa.Stmgr.ParentStateViewTsk(ctx, tsk) if err != nil { - return apitypes.MinerSectors{}, xerrors.Errorf("Stmgr.ParentStateViewTsk failed:%v", err) + return types.MinerSectors{}, xerrors.Errorf("Stmgr.ParentStateViewTsk failed:%v", err) } mas, err := view.LoadMinerState(ctx, addr) if err != nil { - return apitypes.MinerSectors{}, err + return types.MinerSectors{}, err } var activeCount, liveCount, faultyCount uint64 @@ -638,46 +637,46 @@ func (msa *minerStateAPI) StateMinerSectorCount(ctx context.Context, addr addres return nil }) }); err != nil { - return apitypes.MinerSectors{}, err + return types.MinerSectors{}, err } - return apitypes.MinerSectors{Live: liveCount, Active: activeCount, Faulty: faultyCount}, nil + return types.MinerSectors{Live: liveCount, Active: activeCount, Faulty: faultyCount}, nil } // StateMarketBalance looks up the Escrow and Locked balances of the given address in the Storage Market -func (msa *minerStateAPI) StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (apitypes.MarketBalance, error) { +func (msa *minerStateAPI) StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MarketBalance, error) { _, view, err := msa.Stmgr.ParentStateViewTsk(ctx, tsk) if err != nil { - return apitypes.MarketBalanceNil, xerrors.Errorf("loading view %s: %v", tsk, err) + return types.MarketBalanceNil, xerrors.Errorf("loading view %s: %v", tsk, err) } mstate, err := view.LoadMarketState(ctx) if err != nil { - return apitypes.MarketBalanceNil, err + return types.MarketBalanceNil, err } addr, err = view.LookupID(ctx, addr) if err != nil { - return apitypes.MarketBalanceNil, err + return types.MarketBalanceNil, err } - var out apitypes.MarketBalance + var out types.MarketBalance et, err := mstate.EscrowTable() if err != nil { - return apitypes.MarketBalanceNil, err + return types.MarketBalanceNil, err } out.Escrow, err = et.Get(addr) if err != nil { - return apitypes.MarketBalanceNil, xerrors.Errorf("getting escrow balance: %v", err) + return types.MarketBalanceNil, xerrors.Errorf("getting escrow balance: %v", err) } lt, err := mstate.LockedTable() if err != nil { - return apitypes.MarketBalanceNil, err + return types.MarketBalanceNil, err } out.Locked, err = lt.Get(addr) if err != nil { - return apitypes.MarketBalanceNil, xerrors.Errorf("getting locked balance: %v", err) + return types.MarketBalanceNil, xerrors.Errorf("getting locked balance: %v", err) } return out, nil @@ -689,35 +688,35 @@ var dealProviderCollateralDen = types.NewInt(100) // StateDealProviderCollateralBounds returns the min and max collateral a storage provider // can issue. It takes the deal size and verified status as parameters. -func (msa *minerStateAPI) StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (apitypes.DealCollateralBounds, error) { +func (msa *minerStateAPI) StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (types.DealCollateralBounds, error) { ts, _, view, err := msa.Stmgr.StateViewTsk(ctx, tsk) if err != nil { - return apitypes.DealCollateralBounds{}, xerrors.Errorf("loading state view %s: %v", tsk, err) + return types.DealCollateralBounds{}, xerrors.Errorf("loading state view %s: %v", tsk, err) } pst, err := view.LoadPowerState(ctx) if err != nil { - return apitypes.DealCollateralBounds{}, xerrors.Errorf("failed to load power actor state: %v", err) + return types.DealCollateralBounds{}, xerrors.Errorf("failed to load power actor state: %v", err) } rst, err := view.LoadRewardState(ctx) if err != nil { - return apitypes.DealCollateralBounds{}, xerrors.Errorf("failed to load reward actor state: %v", err) + return types.DealCollateralBounds{}, xerrors.Errorf("failed to load reward actor state: %v", err) } circ, err := msa.StateVMCirculatingSupplyInternal(ctx, ts.Key()) if err != nil { - return apitypes.DealCollateralBounds{}, xerrors.Errorf("getting total circulating supply: %v", err) + return types.DealCollateralBounds{}, xerrors.Errorf("getting total circulating supply: %v", err) } powClaim, err := pst.TotalPower() if err != nil { - return apitypes.DealCollateralBounds{}, xerrors.Errorf("getting total power: %v", err) + return types.DealCollateralBounds{}, xerrors.Errorf("getting total power: %v", err) } rewPow, err := rst.ThisEpochBaselinePower() if err != nil { - return apitypes.DealCollateralBounds{}, xerrors.Errorf("getting reward baseline power: %v", err) + return types.DealCollateralBounds{}, xerrors.Errorf("getting reward baseline power: %v", err) } min, max, err := policy.DealProviderCollateralBounds(size, @@ -728,9 +727,9 @@ func (msa *minerStateAPI) StateDealProviderCollateralBounds(ctx context.Context, circ.FilCirculating, msa.Fork.GetNtwkVersion(ctx, ts.Height())) if err != nil { - return apitypes.DealCollateralBounds{}, xerrors.Errorf("getting deal provider coll bounds: %v", err) + return types.DealCollateralBounds{}, xerrors.Errorf("getting deal provider coll bounds: %v", err) } - return apitypes.DealCollateralBounds{ + return types.DealCollateralBounds{ Min: types.BigDiv(types.BigMul(min, dealProviderCollateralNum), dealProviderCollateralDen), Max: max, }, nil diff --git a/app/submodule/chain/v0api/chaininfo_v0api.go b/app/submodule/chain/v0api/chaininfo_v0api.go index db14183ced..af297284ac 100644 --- a/app/submodule/chain/v0api/chaininfo_v0api.go +++ b/app/submodule/chain/v0api/chaininfo_v0api.go @@ -10,8 +10,7 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/pkg/constants" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var _ v0api.IChain = &WrapperV1IChain{} @@ -20,19 +19,19 @@ type WrapperV1IChain struct { //nolint v1api.IChain } -func (a *WrapperV1IChain) StateSearchMsg(ctx context.Context, msg cid.Cid) (*apitypes.MsgLookup, error) { +func (a *WrapperV1IChain) StateSearchMsg(ctx context.Context, msg cid.Cid) (*types.MsgLookup, error) { return a.IChain.StateSearchMsg(ctx, types.EmptyTSK, msg, constants.LookbackNoLimit, true) } -func (a *WrapperV1IChain) StateSearchMsgLimited(ctx context.Context, msg cid.Cid, limit abi.ChainEpoch) (*apitypes.MsgLookup, error) { +func (a *WrapperV1IChain) StateSearchMsgLimited(ctx context.Context, msg cid.Cid, limit abi.ChainEpoch) (*types.MsgLookup, error) { return a.IChain.StateSearchMsg(ctx, types.EmptyTSK, msg, limit, true) } -func (a *WrapperV1IChain) StateWaitMsg(ctx context.Context, msg cid.Cid, confidence uint64) (*apitypes.MsgLookup, error) { +func (a *WrapperV1IChain) StateWaitMsg(ctx context.Context, msg cid.Cid, confidence uint64) (*types.MsgLookup, error) { return a.IChain.StateWaitMsg(ctx, msg, confidence, constants.LookbackNoLimit, true) } -func (a *WrapperV1IChain) StateWaitMsgLimited(ctx context.Context, msg cid.Cid, confidence uint64, limit abi.ChainEpoch) (*apitypes.MsgLookup, error) { +func (a *WrapperV1IChain) StateWaitMsgLimited(ctx context.Context, msg cid.Cid, confidence uint64, limit abi.ChainEpoch) (*types.MsgLookup, error) { return a.IChain.StateWaitMsg(ctx, msg, confidence, limit, true) } diff --git a/app/submodule/discovery/discovery_submodule.go b/app/submodule/discovery/discovery_submodule.go index d7408c201a..4e1d89cbdb 100644 --- a/app/submodule/discovery/discovery_submodule.go +++ b/app/submodule/discovery/discovery_submodule.go @@ -6,7 +6,7 @@ import ( "github.com/filecoin-project/venus/app/submodule/network" "github.com/filecoin-project/venus/pkg/repo" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/libp2p/go-libp2p-core/host" "github.com/ipfs/go-cid" diff --git a/app/submodule/market/market_api.go b/app/submodule/market/market_api.go index 870bb11033..5407de2d4a 100644 --- a/app/submodule/market/market_api.go +++ b/app/submodule/market/market_api.go @@ -6,9 +6,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/statemanger" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "golang.org/x/xerrors" ) @@ -22,8 +21,8 @@ func newMarketAPI(c v1api.IChain, stmgr statemanger.IStateManager) v1api.IMarket } // StateMarketParticipants returns the Escrow and Locked balances of every participant in the Storage Market -func (m *marketAPI) StateMarketParticipants(ctx context.Context, tsk types.TipSetKey) (map[string]apitypes.MarketBalance, error) { - out := map[string]apitypes.MarketBalance{} +func (m *marketAPI) StateMarketParticipants(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketBalance, error) { + out := map[string]types.MarketBalance{} ts, err := m.chain.ChainGetTipSet(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) @@ -49,7 +48,7 @@ func (m *marketAPI) StateMarketParticipants(ctx context.Context, tsk types.TipSe return err } - out[a.String()] = apitypes.MarketBalance{ + out[a.String()] = types.MarketBalance{ Escrow: es, Locked: lk, } diff --git a/app/submodule/mining/mining_api.go b/app/submodule/mining/mining_api.go index ad073205f7..5a51b31083 100644 --- a/app/submodule/mining/mining_api.go +++ b/app/submodule/mining/mining_api.go @@ -21,10 +21,8 @@ import ( "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" - wtypes "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/filecoin-project/venus/venus-shared/types" ) var _ v1api.IMining = &MiningAPI{} @@ -34,7 +32,7 @@ type MiningAPI struct { //nolint } //MinerGetBaseInfo get current miner information -func (miningAPI *MiningAPI) MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*apitypes.MiningBaseInfo, error) { +func (miningAPI *MiningAPI) MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*types.MiningBaseInfo, error) { chainStore := miningAPI.Ming.ChainModule.ChainReader ts, err := chainStore.GetTipSet(ctx, tsk) if err != nil { @@ -135,7 +133,7 @@ func (miningAPI *MiningAPI) MinerGetBaseInfo(ctx context.Context, maddr address. return nil, xerrors.Errorf("determining miner eligibility: %v", err) } - return &apitypes.MiningBaseInfo{ + return &types.MiningBaseInfo{ MinerPower: mpow.QualityAdjPower, NetworkPower: tpow.QualityAdjPower, Sectors: sectors, @@ -148,7 +146,7 @@ func (miningAPI *MiningAPI) MinerGetBaseInfo(ctx context.Context, maddr address. } //MinerCreateBlock create block base on template -func (miningAPI *MiningAPI) MinerCreateBlock(ctx context.Context, bt *apitypes.BlockTemplate) (*types.BlockMsg, error) { +func (miningAPI *MiningAPI) MinerCreateBlock(ctx context.Context, bt *types.BlockTemplate) (*types.BlockMsg, error) { fblk, err := miningAPI.minerCreateBlock(ctx, bt) if err != nil { return nil, err @@ -166,7 +164,7 @@ func (miningAPI *MiningAPI) MinerCreateBlock(ctx context.Context, bt *apitypes.B return &out, nil } -func (miningAPI *MiningAPI) minerCreateBlock(ctx context.Context, bt *apitypes.BlockTemplate) (*types.FullBlock, error) { +func (miningAPI *MiningAPI) minerCreateBlock(ctx context.Context, bt *types.BlockTemplate) (*types.FullBlock, error) { chainStore := miningAPI.Ming.ChainModule.ChainReader messageStore := miningAPI.Ming.ChainModule.MessageStore cfg := miningAPI.Ming.Config.Repo().Config() @@ -269,8 +267,8 @@ func (miningAPI *MiningAPI) minerCreateBlock(ctx context.Context, bt *apitypes.B if err != nil { return nil, err } - sig, err := miningAPI.Ming.Wallet.API().WalletSign(ctx, worker, nosigbytes, wtypes.MsgMeta{ - Type: wtypes.MTBlock, + sig, err := miningAPI.Ming.Wallet.API().WalletSign(ctx, worker, nosigbytes, types.MsgMeta{ + Type: types.MTBlock, }) if err != nil { return nil, xerrors.Errorf("failed to sign new block: %v", err) diff --git a/app/submodule/mpool/mpool_api.go b/app/submodule/mpool/mpool_api.go index 3a9857dc09..5957e9ed4c 100644 --- a/app/submodule/mpool/mpool_api.go +++ b/app/submodule/mpool/mpool_api.go @@ -7,10 +7,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/venus/pkg/messagepool" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" - mptypes "github.com/filecoin-project/venus/venus-shared/messagepool" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" "golang.org/x/xerrors" ) @@ -44,9 +42,9 @@ func (a *MessagePoolAPI) MpoolPush(ctx context.Context, smsg *types.SignedMessag } // MpoolGetConfig returns (a copy of) the current mpool config -func (a *MessagePoolAPI) MpoolGetConfig(context.Context) (*mptypes.MpoolConfig, error) { +func (a *MessagePoolAPI) MpoolGetConfig(context.Context) (*types.MpoolConfig, error) { cfg := a.mp.MPool.GetConfig() - return &mptypes.MpoolConfig{ + return &types.MpoolConfig{ PriorityAddrs: cfg.PriorityAddrs, SizeLimitHigh: cfg.SizeLimitHigh, SizeLimitLow: cfg.SizeLimitLow, @@ -57,7 +55,7 @@ func (a *MessagePoolAPI) MpoolGetConfig(context.Context) (*mptypes.MpoolConfig, } // MpoolSetConfig sets the mpool config to (a copy of) the supplied config -func (a *MessagePoolAPI) MpoolSetConfig(ctx context.Context, cfg *mptypes.MpoolConfig) error { +func (a *MessagePoolAPI) MpoolSetConfig(ctx context.Context, cfg *types.MpoolConfig) error { return a.mp.MPool.SetConfig(ctx, &messagepool.MpoolConfig{ PriorityAddrs: cfg.PriorityAddrs, SizeLimitHigh: cfg.SizeLimitHigh, @@ -181,7 +179,7 @@ func (a *MessagePoolAPI) MpoolPushUntrusted(ctx context.Context, smsg *types.Sig // // When maxFee is set to 0, MpoolPushMessage will guess appropriate fee // based on current chain conditions -func (a *MessagePoolAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec) (*types.SignedMessage, error) { +func (a *MessagePoolAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec) (*types.SignedMessage, error) { cp := *msg msg = &cp inMsg := *msg @@ -269,7 +267,7 @@ func (a *MessagePoolAPI) MpoolBatchPushUntrusted(ctx context.Context, smsgs []*t } // MpoolBatchPushMessage batch pushes a unsigned message to mempool. -func (a *MessagePoolAPI) MpoolBatchPushMessage(ctx context.Context, msgs []*types.Message, spec *apitypes.MessageSendSpec) ([]*types.SignedMessage, error) { +func (a *MessagePoolAPI) MpoolBatchPushMessage(ctx context.Context, msgs []*types.Message, spec *types.MessageSendSpec) ([]*types.SignedMessage, error) { var smsgs []*types.SignedMessage for _, msg := range msgs { smsg, err := a.MpoolPushMessage(ctx, msg, spec) @@ -287,16 +285,16 @@ func (a *MessagePoolAPI) MpoolGetNonce(ctx context.Context, addr address.Address return a.mp.MPool.GetNonce(ctx, addr, types.EmptyTSK) } -func (a *MessagePoolAPI) MpoolSub(ctx context.Context) (<-chan mptypes.MpoolUpdate, error) { +func (a *MessagePoolAPI) MpoolSub(ctx context.Context) (<-chan types.MpoolUpdate, error) { return a.mp.MPool.Updates(ctx) } // GasEstimateMessageGas estimates gas values for unset message gas fields -func (a *MessagePoolAPI) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) { - return a.mp.MPool.GasEstimateMessageGas(ctx, &apitypes.EstimateMessage{Msg: msg, Spec: spec}, tsk) +func (a *MessagePoolAPI) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) { + return a.mp.MPool.GasEstimateMessageGas(ctx, &types.EstimateMessage{Msg: msg, Spec: spec}, tsk) } -func (a *MessagePoolAPI) GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*apitypes.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*apitypes.EstimateResult, error) { +func (a *MessagePoolAPI) GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) { return a.mp.MPool.GasBatchEstimateMessageGas(ctx, estimateMessages, fromNonce, tsk) } @@ -315,15 +313,15 @@ func (a *MessagePoolAPI) GasEstimateGasPremium(ctx context.Context, nblocksincl return a.mp.MPool.GasEstimateGasPremium(ctx, nblocksincl, sender, gaslimit, tsk, a.mp.MPool.PriceCache) } -func (a *MessagePoolAPI) MpoolCheckMessages(ctx context.Context, protos []*mptypes.MessagePrototype) ([][]mptypes.MessageCheckStatus, error) { +func (a *MessagePoolAPI) MpoolCheckMessages(ctx context.Context, protos []*types.MessagePrototype) ([][]types.MessageCheckStatus, error) { return a.mp.MPool.CheckMessages(ctx, protos) } -func (a *MessagePoolAPI) MpoolCheckPendingMessages(ctx context.Context, addr address.Address) ([][]mptypes.MessageCheckStatus, error) { +func (a *MessagePoolAPI) MpoolCheckPendingMessages(ctx context.Context, addr address.Address) ([][]types.MessageCheckStatus, error) { return a.mp.MPool.CheckPendingMessages(ctx, addr) } -func (a *MessagePoolAPI) MpoolCheckReplaceMessages(ctx context.Context, msg []*types.Message) ([][]mptypes.MessageCheckStatus, error) { +func (a *MessagePoolAPI) MpoolCheckReplaceMessages(ctx context.Context, msg []*types.Message) ([][]types.MessageCheckStatus, error) { return a.mp.MPool.CheckReplaceMessages(ctx, msg) } diff --git a/app/submodule/mpool/mpool_submodule.go b/app/submodule/mpool/mpool_submodule.go index 32125fe19f..b6c370c79b 100644 --- a/app/submodule/mpool/mpool_submodule.go +++ b/app/submodule/mpool/mpool_submodule.go @@ -26,7 +26,7 @@ import ( "github.com/filecoin-project/venus/pkg/repo" v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var pubsubMsgsSyncEpochs = 10 diff --git a/app/submodule/multisig/multisig_api.go b/app/submodule/multisig/multisig_api.go index ee23469013..783324e3d3 100644 --- a/app/submodule/multisig/multisig_api.go +++ b/app/submodule/multisig/multisig_api.go @@ -12,8 +12,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/builtin/multisig" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/messagepool" + "github.com/filecoin-project/venus/venus-shared/types" ) var _ v1api.IMultiSig = &multiSig{} @@ -50,7 +49,7 @@ func (a *multiSig) messageBuilder(ctx context.Context, from address.Address) (mu // MsigCreate creates a multisig wallet // It takes the following params: , , //, , -func (a *multiSig) MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (*messagepool.MessagePrototype, error) { +func (a *multiSig) MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (*types.MessagePrototype, error) { mb, err := a.messageBuilder(ctx, src) if err != nil { @@ -62,13 +61,13 @@ func (a *multiSig) MsigCreate(ctx context.Context, req uint64, addrs []address.A return nil, err } - return &messagepool.MessagePrototype{ + return &types.MessagePrototype{ Message: *msg, ValidNonce: false, }, nil } -func (a *multiSig) MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) { +func (a *multiSig) MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*types.MessagePrototype, error) { mb, err := a.messageBuilder(ctx, src) if err != nil { @@ -80,13 +79,13 @@ func (a *multiSig) MsigPropose(ctx context.Context, msig address.Address, to add return nil, xerrors.Errorf("failed to create proposal: %w", err) } - return &messagepool.MessagePrototype{ + return &types.MessagePrototype{ Message: *msg, ValidNonce: false, }, nil } -func (a *multiSig) MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) { +func (a *multiSig) MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*types.MessagePrototype, error) { enc, actErr := serializeAddParams(newAdd, inc) if actErr != nil { return nil, actErr @@ -95,7 +94,7 @@ func (a *multiSig) MsigAddPropose(ctx context.Context, msig address.Address, src return a.MsigPropose(ctx, msig, msig, big.Zero(), src, uint64(multisig.Methods.AddSigner), enc) } -func (a *multiSig) MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) { +func (a *multiSig) MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*types.MessagePrototype, error) { enc, actErr := serializeAddParams(newAdd, inc) if actErr != nil { return nil, actErr @@ -107,7 +106,7 @@ func (a *multiSig) MsigAddApprove(ctx context.Context, msig address.Address, src // MsigAddApprove approves a previously proposed AddSigner message // It takes the following params: , , , // , , -func (a *multiSig) MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) { +func (a *multiSig) MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*types.MessagePrototype, error) { enc, actErr := serializeAddParams(newAdd, inc) if actErr != nil { return nil, actErr @@ -116,14 +115,14 @@ func (a *multiSig) MsigAddCancel(ctx context.Context, msig address.Address, src return a.MsigCancelTxnHash(ctx, msig, txID, msig, big.Zero(), src, uint64(multisig.Methods.AddSigner), enc) } -func (a *multiSig) MsigCancelTxnHash(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) { +func (a *multiSig) MsigCancelTxnHash(ctx context.Context, msig address.Address, txID uint64, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*types.MessagePrototype, error) { return a.msigApproveOrCancelTxnHash(ctx, MsigCancel, msig, txID, src, to, amt, src, method, params) } // MsigSwapPropose proposes swapping 2 signers in the multisig // It takes the following params: , , // , -func (a *multiSig) MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) { +func (a *multiSig) MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*types.MessagePrototype, error) { enc, actErr := serializeSwapParams(oldAdd, newAdd) if actErr != nil { return nil, actErr @@ -135,7 +134,7 @@ func (a *multiSig) MsigSwapPropose(ctx context.Context, msig address.Address, sr // MsigSwapApprove approves a previously proposed SwapSigner // It takes the following params: , , , // , , -func (a *multiSig) MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) { +func (a *multiSig) MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*types.MessagePrototype, error) { enc, actErr := serializeSwapParams(oldAdd, newAdd) if actErr != nil { return nil, actErr @@ -144,7 +143,7 @@ func (a *multiSig) MsigSwapApprove(ctx context.Context, msig address.Address, sr return a.MsigApproveTxnHash(ctx, msig, txID, proposer, msig, big.Zero(), src, uint64(multisig.Methods.SwapSigner), enc) } -func (a *multiSig) MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) { +func (a *multiSig) MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*types.MessagePrototype, error) { enc, actErr := serializeSwapParams(oldAdd, newAdd) if actErr != nil { return nil, actErr @@ -156,7 +155,7 @@ func (a *multiSig) MsigSwapCancel(ctx context.Context, msig address.Address, src // MsigSwapCancel cancels a previously proposed SwapSigner message // It takes the following params: , , , // , -func (a *multiSig) MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) { +func (a *multiSig) MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*types.MessagePrototype, error) { return a.msigApproveOrCancelSimple(ctx, MsigApprove, msig, txID, src) } @@ -166,14 +165,14 @@ func (a *multiSig) MsigApprove(ctx context.Context, msig address.Address, txID u // exactly the transaction you think you are. // It takes the following params: , , , , , // , , -func (a *multiSig) MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) { +func (a *multiSig) MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*types.MessagePrototype, error) { return a.msigApproveOrCancelTxnHash(ctx, MsigApprove, msig, txID, proposer, to, amt, src, method, params) } // MsigCancel cancels a previously-proposed multisig message // It takes the following params: , , , , // , , -func (a *multiSig) MsigCancel(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) { +func (a *multiSig) MsigCancel(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*types.MessagePrototype, error) { return a.msigApproveOrCancelSimple(ctx, MsigCancel, msig, txID, src) } @@ -182,7 +181,7 @@ func (a *multiSig) MsigCancel(ctx context.Context, msig address.Address, txID ui // send the message from, the address to be removed, and a boolean // indicating whether or not the signing threshold should be lowered by one // along with the address removal. -func (a *multiSig) MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*messagepool.MessagePrototype, error) { +func (a *multiSig) MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*types.MessagePrototype, error) { enc, actErr := serializeRemoveParams(toRemove, decrease) if actErr != nil { return nil, actErr @@ -234,7 +233,7 @@ func (a *multiSig) MsigGetVested(ctx context.Context, addr address.Address, star return types.BigSub(startLk, endLk), nil } -func (a *multiSig) msigApproveOrCancelSimple(ctx context.Context, operation MsigProposeResponse, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) { +func (a *multiSig) msigApproveOrCancelSimple(ctx context.Context, operation MsigProposeResponse, msig address.Address, txID uint64, src address.Address) (*types.MessagePrototype, error) { if msig == address.Undef { return nil, xerrors.Errorf("must provide multisig address") } @@ -261,10 +260,10 @@ func (a *multiSig) msigApproveOrCancelSimple(ctx context.Context, operation Msig return nil, err } - return &messagepool.MessagePrototype{Message: *msg, ValidNonce: false}, nil + return &types.MessagePrototype{Message: *msg, ValidNonce: false}, nil } -func (a *multiSig) msigApproveOrCancelTxnHash(ctx context.Context, operation MsigProposeResponse, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) { +func (a *multiSig) msigApproveOrCancelTxnHash(ctx context.Context, operation MsigProposeResponse, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*types.MessagePrototype, error) { if msig == address.Undef { return nil, xerrors.Errorf("must provide multisig address") } @@ -307,7 +306,7 @@ func (a *multiSig) msigApproveOrCancelTxnHash(ctx context.Context, operation Msi return nil, err } - return &messagepool.MessagePrototype{ + return &types.MessagePrototype{ Message: *msg, ValidNonce: false, }, nil diff --git a/app/submodule/multisig/v0api/multisig_v0api.go b/app/submodule/multisig/v0api/multisig_v0api.go index 3620eb4e69..b411af64c8 100644 --- a/app/submodule/multisig/v0api/multisig_v0api.go +++ b/app/submodule/multisig/v0api/multisig_v0api.go @@ -5,11 +5,10 @@ import ( v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/venus-shared/messagepool" "github.com/ipfs/go-cid" "golang.org/x/xerrors" ) @@ -21,7 +20,7 @@ type WrapperV1IMultiSig struct { var _ v0api.IMultiSig = (*WrapperV1IMultiSig)(nil) -func (a *WrapperV1IMultiSig) executePrototype(ctx context.Context, p *messagepool.MessagePrototype) (cid.Cid, error) { +func (a *WrapperV1IMultiSig) executePrototype(ctx context.Context, p *types.MessagePrototype) (cid.Cid, error) { sm, err := a.IMessagePool.MpoolPushMessage(ctx, &p.Message, nil) if err != nil { return cid.Undef, xerrors.Errorf("pushing message: %w", err) diff --git a/app/submodule/network/network_api.go b/app/submodule/network/network_api.go index 212626b8f3..af49be13dd 100644 --- a/app/submodule/network/network_api.go +++ b/app/submodule/network/network_api.go @@ -3,6 +3,8 @@ package network import ( "context" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/peer" @@ -10,9 +12,7 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/venus-shared/api" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - "github.com/filecoin-project/venus/venus-shared/libp2p/net" ) var _ v1api.INetwork = &networkAPI{} @@ -52,17 +52,17 @@ func (na *networkAPI) NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer } // NetworkConnect connects to peers at the given addresses -func (na *networkAPI) NetworkConnect(ctx context.Context, addrs []string) (<-chan net.ConnectionResult, error) { +func (na *networkAPI) NetworkConnect(ctx context.Context, addrs []string) (<-chan types.ConnectionResult, error) { return na.network.Network.Connect(ctx, addrs) } // NetworkPeers lists peers currently available on the network -func (na *networkAPI) NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) { +func (na *networkAPI) NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*types.SwarmConnInfos, error) { return na.network.Network.Peers(ctx, verbose, latency, streams) } -func (na *networkAPI) Version(context.Context) (apitypes.Version, error) { - return apitypes.Version{ +func (na *networkAPI) Version(context.Context) (types.Version, error) { + return types.Version{ Version: constants.UserVersion(), APIVersion: api.Version(constants.FullAPIVersion1), }, nil diff --git a/app/submodule/network/network_submodule.go b/app/submodule/network/network_submodule.go index 0420787f38..cd94adfa9e 100644 --- a/app/submodule/network/network_submodule.go +++ b/app/submodule/network/network_submodule.go @@ -45,7 +45,7 @@ import ( "github.com/filecoin-project/venus/pkg/repo" appstate "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" diff --git a/app/submodule/network/v0api/v1_wrapper.go b/app/submodule/network/v0api/v1_wrapper.go index 9eae5d9ff2..64b0797fdf 100644 --- a/app/submodule/network/v0api/v1_wrapper.go +++ b/app/submodule/network/v0api/v1_wrapper.go @@ -3,9 +3,10 @@ package v0api import ( "context" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/venus-shared/api" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" ) @@ -13,10 +14,10 @@ type WrapperV1INetwork struct { v1api.INetwork } -func (w *WrapperV1INetwork) Version(ctx context.Context) (apitypes.Version, error) { +func (w *WrapperV1INetwork) Version(ctx context.Context) (types.Version, error) { ver, err := w.INetwork.Version(ctx) if err != nil { - return apitypes.Version{}, err + return types.Version{}, err } ver.APIVersion = api.Version(constants.FullAPIVersion0) diff --git a/app/submodule/paych/paych_api.go b/app/submodule/paych/paych_api.go index 3135d61ab3..b083b35388 100644 --- a/app/submodule/paych/paych_api.go +++ b/app/submodule/paych/paych_api.go @@ -3,6 +3,8 @@ package paych import ( "context" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/ipfs/go-cid" "golang.org/x/xerrors" @@ -11,8 +13,6 @@ import ( "github.com/filecoin-project/specs-actors/actors/builtin/paych" "github.com/filecoin-project/venus/pkg/paychmgr" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - paychtypes "github.com/filecoin-project/venus/venus-shared/paych" ) type PaychAPI struct { @@ -23,23 +23,23 @@ func NewPaychAPI(p *paychmgr.Manager) *PaychAPI { return &PaychAPI{p} } -func (a *PaychAPI) PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*paychtypes.ChannelInfo, error) { +func (a *PaychAPI) PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*types.ChannelInfo, error) { ch, mcid, err := a.paychMgr.GetPaych(ctx, from, to, amt) if err != nil { return nil, err } - return &paychtypes.ChannelInfo{ + return &types.ChannelInfo{ Channel: ch, WaitSentinel: mcid, }, nil } -func (a *PaychAPI) PaychAvailableFunds(ctx context.Context, ch address.Address) (*apitypes.ChannelAvailableFunds, error) { +func (a *PaychAPI) PaychAvailableFunds(ctx context.Context, ch address.Address) (*types.ChannelAvailableFunds, error) { return a.paychMgr.AvailableFunds(ctx, ch) } -func (a *PaychAPI) PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*apitypes.ChannelAvailableFunds, error) { +func (a *PaychAPI) PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*types.ChannelAvailableFunds, error) { return a.paychMgr.AvailableFundsByFromTo(ctx, from, to) } @@ -51,7 +51,7 @@ func (a *PaychAPI) PaychAllocateLane(ctx context.Context, ch address.Address) (u return a.paychMgr.AllocateLane(ctx, ch) } -func (a *PaychAPI) PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []paychtypes.VoucherSpec) (*paychtypes.PaymentInfo, error) { +func (a *PaychAPI) PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []types.VoucherSpec) (*types.PaymentInfo, error) { amount := vouchers[len(vouchers)-1].Amount // TODO: Fix free fund tracking in PaychGet @@ -88,7 +88,7 @@ func (a *PaychAPI) PaychNewPayment(ctx context.Context, from, to address.Address svs[i] = sv.Voucher } - return &paychtypes.PaymentInfo{ + return &types.PaymentInfo{ Channel: ch.Channel, WaitSentinel: ch.WaitSentinel, Vouchers: svs, @@ -99,14 +99,14 @@ func (a *PaychAPI) PaychList(ctx context.Context) ([]address.Address, error) { return a.paychMgr.ListChannels(ctx) } -func (a *PaychAPI) PaychStatus(ctx context.Context, pch address.Address) (*paychtypes.Status, error) { +func (a *PaychAPI) PaychStatus(ctx context.Context, pch address.Address) (*types.Status, error) { ci, err := a.paychMgr.GetChannelInfo(ctx, pch) if err != nil { return nil, err } - return &paychtypes.Status{ + return &types.Status{ ControlAddr: ci.Control, - Direction: paychtypes.PCHDir(ci.Direction), + Direction: types.PCHDir(ci.Direction), }, nil } @@ -137,7 +137,7 @@ func (a *PaychAPI) PaychVoucherAdd(ctx context.Context, ch address.Address, sv * // the two. // If there are insufficient funds in the channel to create the voucher, // returns a nil voucher and the shortfall. -func (a *PaychAPI) PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paychtypes.VoucherCreateResult, error) { +func (a *PaychAPI) PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*types.VoucherCreateResult, error) { return a.paychMgr.CreateVoucher(ctx, pch, paych.SignedVoucher{Amount: amt, Lane: lane}) } diff --git a/app/submodule/syncer/chain_sync.go b/app/submodule/syncer/chain_sync.go index 6d540f67f1..a8b3faf2fd 100644 --- a/app/submodule/syncer/chain_sync.go +++ b/app/submodule/syncer/chain_sync.go @@ -4,7 +4,7 @@ import ( "time" "github.com/filecoin-project/venus/pkg/chainsync" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type chainSync interface { diff --git a/app/submodule/syncer/syncer_api.go b/app/submodule/syncer/syncer_api.go index d21be52400..afe86568ba 100644 --- a/app/submodule/syncer/syncer_api.go +++ b/app/submodule/syncer/syncer_api.go @@ -4,13 +4,10 @@ import ( "context" "time" + "github.com/filecoin-project/go-state-types/big" syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" - stmgrtypes "github.com/filecoin-project/venus/venus-shared/stmgr" - - "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/venus-shared/types" logging "github.com/ipfs/go-log/v2" xerrors "github.com/pkg/errors" ) @@ -24,14 +21,14 @@ type syncerAPI struct { //nolint } // SyncerStatus returns the current status of the active or last active chain sync operation. -func (sa *syncerAPI) SyncerTracker(ctx context.Context) *apitypes.TargetTracker { +func (sa *syncerAPI) SyncerTracker(ctx context.Context) *types.TargetTracker { tracker := sa.syncer.ChainSyncManager.BlockProposer().SyncTracker() - tt := &apitypes.TargetTracker{ - History: make([]*apitypes.Target, 0), - Buckets: make([]*apitypes.Target, 0), + tt := &types.TargetTracker{ + History: make([]*types.Target, 0), + Buckets: make([]*types.Target, 0), } - convertTarget := func(src *syncTypes.Target) *apitypes.Target { - return &apitypes.Target{ + convertTarget := func(src *syncTypes.Target) *types.Target { + return &types.Target{ State: convertSyncStateStage(src.State), Base: src.Base, Current: src.Current, @@ -51,17 +48,17 @@ func (sa *syncerAPI) SyncerTracker(ctx context.Context) *apitypes.TargetTracker return tt } -func convertSyncStateStage(srtState syncTypes.SyncStateStage) apitypes.SyncStateStage { - var state apitypes.SyncStateStage +func convertSyncStateStage(srtState syncTypes.SyncStateStage) types.SyncStateStage { + var state types.SyncStateStage switch srtState { case syncTypes.StageIdle: - state = apitypes.StageIdle + state = types.StageIdle case syncTypes.StageSyncErrored: - state = apitypes.StageSyncErrored + state = types.StageSyncErrored case syncTypes.StageSyncComplete: - state = apitypes.StageSyncComplete + state = types.StageSyncComplete case syncTypes.StateInSyncing: - state = apitypes.StageMessages + state = types.StageMessages } return state @@ -164,7 +161,7 @@ func (sa *syncerAPI) SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) e // StateCall applies the message to the tipset's parent state. The // message is not applied on-top-of the messages in the passed-in // tipset. -func (sa *syncerAPI) StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*apitypes.InvocResult, error) { +func (sa *syncerAPI) StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*types.InvocResult, error) { start := time.Now() ts, err := sa.syncer.ChainModule.ChainReader.GetTipSet(ctx, tsk) if err != nil { @@ -177,26 +174,26 @@ func (sa *syncerAPI) StateCall(ctx context.Context, msg *types.Message, tsk type duration := time.Since(start) mcid := msg.Cid() - return &apitypes.InvocResult{ + return &types.InvocResult{ MsgCid: mcid, Msg: msg, MsgRct: &ret.Receipt, - ExecutionTrace: stmgrtypes.ExecutionTrace{}, + ExecutionTrace: types.ExecutionTrace{}, Duration: duration, }, nil } //SyncState just compatible code lotus -func (sa *syncerAPI) SyncState(ctx context.Context) (*apitypes.SyncState, error) { +func (sa *syncerAPI) SyncState(ctx context.Context) (*types.SyncState, error) { tracker := sa.syncer.ChainSyncManager.BlockProposer().SyncTracker() tracker.History() - syncState := &apitypes.SyncState{ + syncState := &types.SyncState{ VMApplied: 0, } count := 0 - toActiveSync := func(t *syncTypes.Target) apitypes.ActiveSync { + toActiveSync := func(t *syncTypes.Target) types.ActiveSync { currentHeight := t.Base.Height() if t.Current != nil { currentHeight = t.Current.Height() @@ -208,7 +205,7 @@ func (sa *syncerAPI) SyncState(ctx context.Context) (*apitypes.SyncState, error) } count++ - activeSync := apitypes.ActiveSync{ + activeSync := types.ActiveSync{ WorkerID: uint64(count), Base: t.Base, Target: t.Head, diff --git a/app/submodule/syncer/syncer_submodule.go b/app/submodule/syncer/syncer_submodule.go index fd7070ccb9..a7ae4ded43 100644 --- a/app/submodule/syncer/syncer_submodule.go +++ b/app/submodule/syncer/syncer_submodule.go @@ -34,7 +34,7 @@ import ( "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/vm/gas" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-blockservice" ) diff --git a/app/submodule/wallet/remotewallet/api.go b/app/submodule/wallet/remotewallet/api.go index 88fc65a8aa..3d722f2456 100644 --- a/app/submodule/wallet/remotewallet/api.go +++ b/app/submodule/wallet/remotewallet/api.go @@ -6,11 +6,12 @@ import ( "context" "net/http" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/go-address" "github.com/filecoin-project/venus/pkg/wallet" - types "github.com/filecoin-project/venus/venus-shared/wallet" ) type IWallet interface { diff --git a/app/submodule/wallet/remotewallet/keymap.go b/app/submodule/wallet/remotewallet/keymap.go index 2d0fd6e521..2c41f17ba5 100644 --- a/app/submodule/wallet/remotewallet/keymap.go +++ b/app/submodule/wallet/remotewallet/keymap.go @@ -2,9 +2,8 @@ package remotewallet import ( "github.com/filecoin-project/go-address" - "github.com/filecoin-project/venus/pkg/crypto" - types "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/filecoin-project/venus/venus-shared/types" ) var keyMapper = map[address.Protocol]types.KeyType{ diff --git a/app/submodule/wallet/remotewallet/remote.go b/app/submodule/wallet/remotewallet/remote.go index 5f7a1bac32..ebb24083a1 100644 --- a/app/submodule/wallet/remotewallet/remote.go +++ b/app/submodule/wallet/remotewallet/remote.go @@ -3,13 +3,14 @@ package remotewallet import ( "context" + "github.com/filecoin-project/venus/venus-shared/types" + "golang.org/x/xerrors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/wallet" - types "github.com/filecoin-project/venus/venus-shared/wallet" ) var _ wallet.WalletIntersection = &remoteWallet{} diff --git a/app/submodule/wallet/wallet_api.go b/app/submodule/wallet/wallet_api.go index 781fc0f230..050241d79d 100644 --- a/app/submodule/wallet/wallet_api.go +++ b/app/submodule/wallet/wallet_api.go @@ -12,8 +12,7 @@ import ( "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/wallet" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" - wtypes "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/filecoin-project/venus/venus-shared/types" ) var _ v1api.IWallet = &WalletAPI{} @@ -91,7 +90,7 @@ func (walletAPI *WalletAPI) WalletNewAddress(ctx context.Context, protocol addre } // WalletImport adds a given set of KeyInfos to the walletModule -func (walletAPI *WalletAPI) WalletImport(ctx context.Context, key *wtypes.KeyInfo) (address.Address, error) { +func (walletAPI *WalletAPI) WalletImport(ctx context.Context, key *types.KeyInfo) (address.Address, error) { addr, err := walletAPI.adapter.Import(ctx, remotewallet.ConvertLocalKeyInfo(key)) if err != nil { return address.Undef, err @@ -100,7 +99,7 @@ func (walletAPI *WalletAPI) WalletImport(ctx context.Context, key *wtypes.KeyInf } // WalletExport returns the KeyInfos for the given walletModule addresses -func (walletAPI *WalletAPI) WalletExport(ctx context.Context, addr address.Address, password string) (*wtypes.KeyInfo, error) { +func (walletAPI *WalletAPI) WalletExport(ctx context.Context, addr address.Address, password string) (*types.KeyInfo, error) { ki, err := walletAPI.adapter.Export(ctx, addr, password) if err != nil { return nil, err @@ -109,7 +108,7 @@ func (walletAPI *WalletAPI) WalletExport(ctx context.Context, addr address.Addre } // WalletSign signs the given bytes using the given address. -func (walletAPI *WalletAPI) WalletSign(ctx context.Context, k address.Address, msg []byte, meta wtypes.MsgMeta) (*crypto.Signature, error) { +func (walletAPI *WalletAPI) WalletSign(ctx context.Context, k address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) { keyAddr, err := walletAPI.walletModule.Chain.Stmgr.ResolveToKeyAddress(ctx, k, nil) if err != nil { return nil, xerrors.Errorf("ResolveTokeyAddress failed:%v", err) @@ -124,7 +123,7 @@ func (walletAPI *WalletAPI) WalletSignMessage(ctx context.Context, k address.Add return nil, xerrors.Errorf("serializing message: %w", err) } - sign, err := walletAPI.WalletSign(ctx, k, mb.Cid().Bytes(), wtypes.MsgMeta{Type: wtypes.MTChainMsg}) + sign, err := walletAPI.WalletSign(ctx, k, mb.Cid().Bytes(), types.MsgMeta{Type: types.MTChainMsg}) if err != nil { return nil, xerrors.Errorf("failed to sign message: %w", err) } diff --git a/app/submodule/wallet/wallet_submodule.go b/app/submodule/wallet/wallet_submodule.go index 376547d204..dad6d4a284 100644 --- a/app/submodule/wallet/wallet_submodule.go +++ b/app/submodule/wallet/wallet_submodule.go @@ -16,7 +16,7 @@ import ( "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/wallet" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var log = logging.Logger("wallet") diff --git a/cmd/address.go b/cmd/address.go index ce33c2ea2a..8a3d4d7ce5 100644 --- a/cmd/address.go +++ b/cmd/address.go @@ -20,8 +20,7 @@ import ( "github.com/filecoin-project/venus/cmd/tablewriter" "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/wallet" - types "github.com/filecoin-project/venus/venus-shared/chain" - wtypes "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/filecoin-project/venus/venus-shared/types" ) var errMissPassword = errors.New("the wallet is missing password, please use command `venus wallet set-password` to set password") @@ -254,7 +253,7 @@ var walletImportCmd = &cmds.Command{ return fmt.Errorf("given file was not a files.File") } - var key wtypes.KeyInfo + var key types.KeyInfo err := json.NewDecoder(hex.NewDecoder(fi)).Decode(&key) if err != nil { return err diff --git a/cmd/chain.go b/cmd/chain.go index 436d80f31a..597af9e754 100644 --- a/cmd/chain.go +++ b/cmd/chain.go @@ -19,9 +19,8 @@ import ( "github.com/filecoin-project/venus/app/node" "github.com/filecoin-project/venus/pkg/constants" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var chainCmd = &cmds.Command{ @@ -280,7 +279,7 @@ var chainGetMessagesCmd = &cmds.Command{ return re.Emit(bmsg) }, - Type: &apitypes.BlockMessages{}, + Type: &types.BlockMessages{}, } var chainGetReceiptsCmd = &cmds.Command{ @@ -309,7 +308,7 @@ field of the filecoin block header.`, Type: []types.MessageReceipt{}, } -func apiMsgCids(in []apitypes.Message) []cid.Cid { +func apiMsgCids(in []types.MessageCID) []cid.Cid { out := make([]cid.Cid, len(in)) for k, v := range in { out[k] = v.Cid diff --git a/cmd/daemon.go b/cmd/daemon.go index 6f2de707b2..3f8ce268c7 100644 --- a/cmd/daemon.go +++ b/cmd/daemon.go @@ -13,7 +13,7 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/util/ulimit" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" paramfetch "github.com/filecoin-project/go-paramfetch" "github.com/filecoin-project/venus/fixtures/asset" diff --git a/cmd/dispute.go b/cmd/dispute.go index e5df4f273f..7cead51c26 100644 --- a/cmd/dispute.go +++ b/cmd/dispute.go @@ -21,9 +21,8 @@ import ( "github.com/filecoin-project/venus/app/node" chainpkg "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/venus-shared/actors" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var disputeLog = logging.Logger("disputer") @@ -417,13 +416,13 @@ func getSender(ctx context.Context, api v1api.IWallet, fromStr string) (address. return addr, nil } -func getMaxFee(maxStr string) (*apitypes.MessageSendSpec, error) { +func getMaxFee(maxStr string) (*types.MessageSendSpec, error) { if maxStr != "" { maxFee, err := types.ParseFIL(maxStr) if err != nil { return nil, xerrors.Errorf("parsing max-fee: %w", err) } - return &apitypes.MessageSendSpec{ + return &types.MessageSendSpec{ MaxFee: types.BigInt(maxFee), }, nil } diff --git a/cmd/main.go b/cmd/main.go index f654c3ca6a..cd8cb8bdbf 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -19,7 +19,7 @@ import ( "github.com/filecoin-project/venus/app/node" "github.com/filecoin-project/venus/app/paths" "github.com/filecoin-project/venus/pkg/repo" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) const ( diff --git a/cmd/message.go b/cmd/message.go index fa3b4b8db4..8c5a31d043 100644 --- a/cmd/message.go +++ b/cmd/message.go @@ -21,7 +21,7 @@ import ( "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // MessageSendResult is the return type for message send command diff --git a/cmd/miner.go b/cmd/miner.go index 721a876ae9..020b12ad87 100644 --- a/cmd/miner.go +++ b/cmd/miner.go @@ -25,8 +25,8 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" "github.com/filecoin-project/venus/venus-shared/actors/policy" - types "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/chain/params" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/venus/venus-shared/types/params" ) var minerCmdLog = logging.Logger("miner.cmd") diff --git a/cmd/miner_actor.go b/cmd/miner_actor.go index 3a5331433a..b51c8899ec 100644 --- a/cmd/miner_actor.go +++ b/cmd/miner_actor.go @@ -25,7 +25,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var minerActorCmd = &cmds.Command{ diff --git a/cmd/miner_proving.go b/cmd/miner_proving.go index 1eec0af374..69e132a94a 100644 --- a/cmd/miner_proving.go +++ b/cmd/miner_proving.go @@ -15,7 +15,7 @@ import ( "github.com/filecoin-project/venus/app/submodule/chain" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var minerProvingCmd = &cmds.Command{ diff --git a/cmd/mpool.go b/cmd/mpool.go index ac6c00c58d..8cfc85950a 100644 --- a/cmd/mpool.go +++ b/cmd/mpool.go @@ -20,9 +20,7 @@ import ( "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/messagepool" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" - mptypes "github.com/filecoin-project/venus/venus-shared/messagepool" + "github.com/filecoin-project/venus/venus-shared/types" ) var mpoolCmd = &cmds.Command{ @@ -296,13 +294,13 @@ var mpoolReplaceCmd = &cmds.Command{ if auto { minRBF := messagepool.ComputeMinRBF(msg.GasPremium) - var mss *apitypes.MessageSendSpec + var mss *types.MessageSendSpec if len(maxFee) > 0 { maxFee, err := big.FromString(maxFee) if err != nil { return fmt.Errorf("parsing max-spend: %w", err) } - mss = &apitypes.MessageSendSpec{ + mss = &types.MessageSendSpec{ MaxFee: maxFee, } } @@ -647,7 +645,7 @@ var mpoolConfig = &cmds.Command{ ctx := context.TODO() if len(req.Arguments) > 0 { - cfg := new(mptypes.MpoolConfig) + cfg := new(types.MpoolConfig) paras := req.Arguments[0] err := json.Unmarshal([]byte(paras), cfg) diff --git a/cmd/multisig.go b/cmd/multisig.go index f75b4e8c74..11a4f15d55 100644 --- a/cmd/multisig.go +++ b/cmd/multisig.go @@ -5,14 +5,15 @@ import ( "encoding/hex" "encoding/json" "fmt" - init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" - msig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" "reflect" "sort" "strconv" "strings" "text/tabwriter" + init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" + msig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -24,7 +25,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/actors/builtin/multisig" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" cmds "github.com/ipfs/go-ipfs-cmds" cbor "github.com/ipfs/go-ipld-cbor" diff --git a/cmd/paych.go b/cmd/paych.go index 460be6683e..aa89142b12 100644 --- a/cmd/paych.go +++ b/cmd/paych.go @@ -15,8 +15,7 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/paychmgr" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" cmds "github.com/ipfs/go-ipfs-cmds" "golang.org/x/xerrors" ) @@ -437,7 +436,7 @@ func sortVouchers(vouchers []*paych.SignedVoucher) []*paych.SignedVoucher { }) return vouchers } -func paychStatus(writer io.Writer, avail *apitypes.ChannelAvailableFunds) { +func paychStatus(writer io.Writer, avail *types.ChannelAvailableFunds) { if avail.Channel == nil { if avail.PendingWaitSentinel != nil { fmt.Fprint(writer, "Creating channel\n") diff --git a/cmd/protocol.go b/cmd/protocol.go index 6237999d95..6a44dcdbf9 100644 --- a/cmd/protocol.go +++ b/cmd/protocol.go @@ -2,7 +2,7 @@ package cmd import ( "github.com/filecoin-project/venus/app/node" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + "github.com/filecoin-project/venus/venus-shared/types" cmds "github.com/ipfs/go-ipfs-cmds" ) @@ -17,5 +17,5 @@ var protocolCmd = &cmds.Command{ } return re.Emit(params) }, - Type: apitypes.ProtocolParams{}, + Type: types.ProtocolParams{}, } diff --git a/cmd/seed.go b/cmd/seed.go index f9c6dbde32..49fc1099cf 100644 --- a/cmd/seed.go +++ b/cmd/seed.go @@ -27,7 +27,7 @@ import ( "github.com/filecoin-project/venus/pkg/gen/genesis" "github.com/filecoin-project/venus/tools/seed" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var seedCmd = &cmds.Command{ diff --git a/cmd/show.go b/cmd/show.go index b1059ae75c..9334e7bba6 100644 --- a/cmd/show.go +++ b/cmd/show.go @@ -2,7 +2,7 @@ package cmd import ( "github.com/filecoin-project/venus/app/node" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" cmds "github.com/ipfs/go-ipfs-cmds" diff --git a/cmd/show_test.go b/cmd/show_test.go index d3e8ff1d74..72ef0273c6 100644 --- a/cmd/show_test.go +++ b/cmd/show_test.go @@ -11,7 +11,7 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/venus/pkg/crypto" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/cmd/state.go b/cmd/state.go index 9f5a2cc4c5..79221365b9 100644 --- a/cmd/state.go +++ b/cmd/state.go @@ -23,8 +23,7 @@ import ( "github.com/filecoin-project/venus/app/node" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // ActorView represents a generic way to represent details about any actor to the user. @@ -455,7 +454,7 @@ var stateGetDealSetCmd = &cmds.Command{ return re.Emit(deal) }, - Type: apitypes.MarketDeal{}, + Type: types.MarketDeal{}, } var stateMinerInfo = &cmds.Command{ diff --git a/cmd/swarm.go b/cmd/swarm.go index 1851d1c6d8..05c32bc651 100644 --- a/cmd/swarm.go +++ b/cmd/swarm.go @@ -7,6 +7,8 @@ import ( "fmt" "time" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/venus/app/node" "github.com/ipfs/go-cid" cmds "github.com/ipfs/go-ipfs-cmds" @@ -14,8 +16,6 @@ import ( "github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/routing" ma "github.com/multiformats/go-multiaddr" - - "github.com/filecoin-project/venus/venus-shared/libp2p/net" ) const ( @@ -68,7 +68,7 @@ var swarmPeersCmd = &cmds.Command{ return re.Emit(&out) }, - Type: net.SwarmConnInfos{}, + Type: types.SwarmConnInfos{}, } var swarmConnectCmd = &cmds.Command{ diff --git a/cmd/sync.go b/cmd/sync.go index 8d49154391..88cf13fb85 100644 --- a/cmd/sync.go +++ b/cmd/sync.go @@ -5,11 +5,12 @@ import ( "bytes" "strconv" + "github.com/filecoin-project/venus/venus-shared/types" + cmds "github.com/ipfs/go-ipfs-cmds" "github.com/filecoin-project/venus/app/node" syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" ) var syncCmd = &cmds.Command{ @@ -63,11 +64,11 @@ var storeStatusCmd = &cmds.Command{ targets := tracker.Buckets w := bytes.NewBufferString("") writer := NewSilentWriter(w) - var inSyncing []*apitypes.Target - var waitTarget []*apitypes.Target + var inSyncing []*types.Target + var waitTarget []*types.Target for _, t := range targets { - if t.State == apitypes.SyncStateStage(syncTypes.StateInSyncing) { + if t.State == types.SyncStateStage(syncTypes.StateInSyncing) { inSyncing = append(inSyncing, t) } else { waitTarget = append(waitTarget, t) diff --git a/pkg/beacon/beacon.go b/pkg/beacon/beacon.go index 7b0b6df551..db35352756 100644 --- a/pkg/beacon/beacon.go +++ b/pkg/beacon/beacon.go @@ -5,7 +5,7 @@ import ( "time" "github.com/filecoin-project/go-state-types/abi" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" logging "github.com/ipfs/go-log" "golang.org/x/xerrors" ) diff --git a/pkg/beacon/drand.go b/pkg/beacon/drand.go index ce28fc08a3..cf84ca12ad 100644 --- a/pkg/beacon/drand.go +++ b/pkg/beacon/drand.go @@ -18,7 +18,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" cfg "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/constants" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // DrandBeacon connects Lotus with a drand network in order to provide diff --git a/pkg/beacon/mock.go b/pkg/beacon/mock.go index 4187c1400b..6164ffbf58 100644 --- a/pkg/beacon/mock.go +++ b/pkg/beacon/mock.go @@ -7,7 +7,7 @@ import ( "time" "github.com/filecoin-project/go-state-types/abi" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/minio/blake2b-simd" "golang.org/x/xerrors" ) diff --git a/pkg/chain/chain_index.go b/pkg/chain/chain_index.go index 381d1a6ed4..4fc81b4bef 100644 --- a/pkg/chain/chain_index.go +++ b/pkg/chain/chain_index.go @@ -4,7 +4,7 @@ import ( "context" "github.com/filecoin-project/go-state-types/abi" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" lru "github.com/hashicorp/golang-lru" xerrors "github.com/pkg/errors" ) diff --git a/pkg/chain/circulating_supply.go b/pkg/chain/circulating_supply.go index c94b6cbde9..44d4804a06 100644 --- a/pkg/chain/circulating_supply.go +++ b/pkg/chain/circulating_supply.go @@ -7,7 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/venus/pkg/constants" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" cbornode "github.com/ipfs/go-ipld-cbor" xerrors "github.com/pkg/errors" diff --git a/pkg/chain/circulating_supply_mock.go b/pkg/chain/circulating_supply_mock.go index af102e0c94..d732e71dc8 100644 --- a/pkg/chain/circulating_supply_mock.go +++ b/pkg/chain/circulating_supply_mock.go @@ -5,7 +5,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/state/tree" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var _ ICirculatingSupplyCalcualtor = (*MockCirculatingSupplyCalculator)(nil) diff --git a/pkg/chain/coalescer.go b/pkg/chain/coalescer.go index 380b4c6f9a..5e35961446 100644 --- a/pkg/chain/coalescer.go +++ b/pkg/chain/coalescer.go @@ -4,7 +4,7 @@ import ( "context" "time" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // WrapHeadChangeCoalescer wraps a ReorgNotifee with a head change coalescer. diff --git a/pkg/chain/coalescer_test.go b/pkg/chain/coalescer_test.go index 6d8f4e72ab..4224ef52ff 100644 --- a/pkg/chain/coalescer_test.go +++ b/pkg/chain/coalescer_test.go @@ -13,7 +13,7 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/crypto" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) func mkAddress(i uint64) address.Address { diff --git a/pkg/chain/message_store.go b/pkg/chain/message_store.go index 2b797ae64c..d7f25dc4f6 100644 --- a/pkg/chain/message_store.go +++ b/pkg/chain/message_store.go @@ -24,7 +24,7 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/state/tree" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // MessageProvider is an interface exposing the load methods of the diff --git a/pkg/chain/message_store_test.go b/pkg/chain/message_store_test.go index c40a62761b..6b15f54566 100644 --- a/pkg/chain/message_store_test.go +++ b/pkg/chain/message_store_test.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/testhelpers" "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) func TestMessageStoreMessagesHappy(t *testing.T) { diff --git a/pkg/chain/randomness.go b/pkg/chain/randomness.go index 48bfdbd1aa..edc2a60863 100644 --- a/pkg/chain/randomness.go +++ b/pkg/chain/randomness.go @@ -7,7 +7,7 @@ import ( "math/rand" "github.com/filecoin-project/venus/pkg/beacon" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/abi" diff --git a/pkg/chain/reorg.go b/pkg/chain/reorg.go index 45958159af..ec7e7785b4 100644 --- a/pkg/chain/reorg.go +++ b/pkg/chain/reorg.go @@ -2,7 +2,7 @@ package chain import ( "github.com/filecoin-project/go-state-types/abi" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/pkg/errors" ) diff --git a/pkg/chain/reorg_test.go b/pkg/chain/reorg_test.go index bc155c4ae5..72de577770 100644 --- a/pkg/chain/reorg_test.go +++ b/pkg/chain/reorg_test.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/venus/pkg/chain" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) func TestIsReorgFork(t *testing.T) { diff --git a/pkg/chain/store.go b/pkg/chain/store.go index d3ea6ece66..24e3f50ce3 100644 --- a/pkg/chain/store.go +++ b/pkg/chain/store.go @@ -46,8 +46,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" "github.com/filecoin-project/venus/venus-shared/actors/builtin/verifreg" "github.com/filecoin-project/venus/venus-shared/actors/policy" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // HeadChangeTopic is the topic used to publish new heads. @@ -614,16 +613,16 @@ func (store *Store) SetHead(ctx context.Context, newTS *types.TipSet) error { func (store *Store) reorgWorker(ctx context.Context) chan reorg { headChangeNotifee := func(rev, app []*types.TipSet) error { - notif := make([]*apitypes.HeadChange, len(rev)+len(app)) + notif := make([]*types.HeadChange, len(rev)+len(app)) for i, revert := range rev { - notif[i] = &apitypes.HeadChange{ + notif[i] = &types.HeadChange{ Type: HCRevert, Val: revert, } } for i, apply := range app { - notif[i+len(rev)] = &apitypes.HeadChange{ + notif[i+len(rev)] = &types.HeadChange{ Type: HCApply, Val: apply, } @@ -686,14 +685,14 @@ func (store *Store) reorgWorker(ctx context.Context) chan reorg { // SubHeadChanges returns channel with chain head updates. // First message is guaranteed to be of len == 1, and type == 'current'. // Then event in the message may be HCApply and HCRevert. -func (store *Store) SubHeadChanges(ctx context.Context) chan []*apitypes.HeadChange { +func (store *Store) SubHeadChanges(ctx context.Context) chan []*types.HeadChange { store.mu.RLock() subCh := store.headEvents.Sub(HeadChangeTopic) head := store.head store.mu.RUnlock() - out := make(chan []*apitypes.HeadChange, 16) - out <- []*apitypes.HeadChange{{ + out := make(chan []*types.HeadChange, 16) + out <- []*types.HeadChange{{ Type: HCCurrent, Val: head, }} @@ -711,7 +710,7 @@ func (store *Store) SubHeadChanges(ctx context.Context) chan []*apitypes.HeadCha } select { - case out <- val.([]*apitypes.HeadChange): + case out <- val.([]*types.HeadChange): default: log.Errorf("closing head change subscription due to slow reader") return diff --git a/pkg/chain/store_test.go b/pkg/chain/store_test.go index d9c5e159cf..57ce92f061 100644 --- a/pkg/chain/store_test.go +++ b/pkg/chain/store_test.go @@ -10,8 +10,7 @@ import ( "github.com/filecoin-project/venus/pkg/testhelpers" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/pkg/util/test" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" "github.com/stretchr/testify/assert" @@ -242,7 +241,7 @@ func TestHead(t *testing.T) { assert.ObjectsAreEqualValues(link1.Key(), cs.GetHead()) } -func assertEmptyCh(t *testing.T, ch <-chan []*apitypes.HeadChange) { +func assertEmptyCh(t *testing.T, ch <-chan []*types.HeadChange) { select { case <-ch: assert.True(t, false) diff --git a/pkg/chain/testing.go b/pkg/chain/testing.go index 5c2ec22cc7..4559cbf009 100644 --- a/pkg/chain/testing.go +++ b/pkg/chain/testing.go @@ -33,7 +33,7 @@ import ( "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/testhelpers" "github.com/filecoin-project/venus/pkg/util" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // Builder builds fake chains and acts as a provider and fetcher for the chain thus generated. diff --git a/pkg/chain/tip_index.go b/pkg/chain/tip_index.go index d1c0fbb99e..bf0b773f1e 100644 --- a/pkg/chain/tip_index.go +++ b/pkg/chain/tip_index.go @@ -6,7 +6,7 @@ import ( "sync" "github.com/filecoin-project/go-state-types/abi" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" "github.com/pkg/errors" "golang.org/x/xerrors" diff --git a/pkg/chain/traversal.go b/pkg/chain/traversal.go index e3580ca3a1..a434f3b81c 100644 --- a/pkg/chain/traversal.go +++ b/pkg/chain/traversal.go @@ -5,7 +5,7 @@ import ( "errors" "github.com/filecoin-project/go-state-types/abi" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ) diff --git a/pkg/chain/traversal_test.go b/pkg/chain/traversal_test.go index f2732921a7..71d79140fe 100644 --- a/pkg/chain/traversal_test.go +++ b/pkg/chain/traversal_test.go @@ -13,7 +13,7 @@ import ( "github.com/filecoin-project/venus/pkg/chain" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) func TestIterAncestors(t *testing.T) { diff --git a/pkg/chain/utils.go b/pkg/chain/utils.go index 8362cf6bd4..924fddee5a 100644 --- a/pkg/chain/utils.go +++ b/pkg/chain/utils.go @@ -7,7 +7,7 @@ import ( "strings" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/rt" @@ -26,6 +26,7 @@ import ( exported5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/exported" exported6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/exported" exported7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/exported" + /* inline-gen end */ "github.com/filecoin-project/venus/venus-shared/actors/builtin" diff --git a/pkg/chain/waiter.go b/pkg/chain/waiter.go index 50dc1b86d9..320144702a 100644 --- a/pkg/chain/waiter.go +++ b/pkg/chain/waiter.go @@ -7,8 +7,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/constants" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" bstore "github.com/ipfs/go-ipfs-blockstore" cbor "github.com/ipfs/go-ipld-cbor" @@ -31,7 +30,7 @@ type waiterChainReader interface { LookupID(context.Context, *types.TipSet, address.Address) (address.Address, error) GetActorAt(context.Context, *types.TipSet, address.Address) (*types.Actor, error) GetTipSetReceiptsRoot(context.Context, *types.TipSet) (cid.Cid, error) - SubHeadChanges(context.Context) chan []*apitypes.HeadChange + SubHeadChanges(context.Context) chan []*types.HeadChange } type IStmgr interface { @@ -62,7 +61,7 @@ func NewWaiter(chainStore waiterChainReader, messages MessageProvider, bs bstore } // Find searches the blockchain history (but doesn't wait). -func (w *Waiter) Find(ctx context.Context, msg types.ChainMsg, lookback abi.ChainEpoch, ts *types.TipSet, allowReplaced bool) (*apitypes.ChainMessage, bool, error) { +func (w *Waiter) Find(ctx context.Context, msg types.ChainMsg, lookback abi.ChainEpoch, ts *types.TipSet, allowReplaced bool) (*types.ChainMessage, bool, error) { if ts == nil { ts = w.chainReader.GetHead() } @@ -81,7 +80,7 @@ func (w *Waiter) Find(ctx context.Context, msg types.ChainMsg, lookback abi.Chai // This method will always check for the message in the current head tipset. // A lookback parameter > 1 will cause this method to check for the message in // up to that many previous tipsets on the chain of the current head. -func (w *Waiter) WaitPredicate(ctx context.Context, msg types.ChainMsg, confidence uint64, lookback abi.ChainEpoch, allowReplaced bool) (*apitypes.ChainMessage, error) { +func (w *Waiter) WaitPredicate(ctx context.Context, msg types.ChainMsg, confidence uint64, lookback abi.ChainEpoch, allowReplaced bool) (*types.ChainMessage, error) { ch := w.chainReader.SubHeadChanges(ctx) chainMsg, found, err := w.waitForMessage(ctx, ch, msg, confidence, lookback, allowReplaced) if err != nil { @@ -94,7 +93,7 @@ func (w *Waiter) WaitPredicate(ctx context.Context, msg types.ChainMsg, confiden } // Wait uses WaitPredicate to invoke the callback when a message with the given cid appears on chain. -func (w *Waiter) Wait(ctx context.Context, msg types.ChainMsg, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*apitypes.ChainMessage, error) { +func (w *Waiter) Wait(ctx context.Context, msg types.ChainMsg, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*types.ChainMessage, error) { mid := msg.VMMessage().Cid() log.Infof("Calling Waiter.Wait CID: %s", mid.String()) @@ -105,7 +104,7 @@ func (w *Waiter) Wait(ctx context.Context, msg types.ChainMsg, confidence uint64 // block and receipt, when it is found. Returns the found message/block or nil // if now block with the given CID exists in the chain. // The lookback parameter is the number of tipsets in the past this method will check before giving up. -func (w *Waiter) findMessage(ctx context.Context, from *types.TipSet, m types.ChainMsg, lookback abi.ChainEpoch, allowReplaced bool) (*apitypes.ChainMessage, bool, error) { +func (w *Waiter) findMessage(ctx context.Context, from *types.TipSet, m types.ChainMsg, lookback abi.ChainEpoch, allowReplaced bool) (*types.ChainMessage, bool, error) { limitHeight := from.Height() - lookback noLimit := lookback == constants.LookbackNoLimit @@ -176,7 +175,7 @@ func (w *Waiter) findMessage(ctx context.Context, from *types.TipSet, m types.Ch // channel closed without finding it), whether it was found, or an error. // notice matching mesage by message from and nonce. the return message may not be // expected, because there maybe another message have the same from and nonce value -func (w *Waiter) waitForMessage(ctx context.Context, ch <-chan []*apitypes.HeadChange, msg types.ChainMsg, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*apitypes.ChainMessage, bool, error) { +func (w *Waiter) waitForMessage(ctx context.Context, ch <-chan []*types.HeadChange, msg types.ChainMsg, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*types.ChainMessage, bool, error) { current, ok := <-ch if !ok { return nil, false, fmt.Errorf("SubHeadChanges stream was invalid") @@ -199,7 +198,7 @@ func (w *Waiter) waitForMessage(ctx context.Context, ch <-chan []*apitypes.HeadC return chainMsg, found, nil } - var backRcp *apitypes.ChainMessage + var backRcp *types.ChainMessage backSearchWait := make(chan struct{}) go func() { r, foundMsg, err := w.findMessage(ctx, currentHead, msg, lookbackLimit, allowReplaced) @@ -214,7 +213,7 @@ func (w *Waiter) waitForMessage(ctx context.Context, ch <-chan []*apitypes.HeadC }() var candidateTS *types.TipSet - var candidateRcp *apitypes.ChainMessage + var candidateRcp *types.ChainMessage heightOfHead := currentHead.Height() reverts := map[string]bool{} @@ -273,7 +272,7 @@ func (w *Waiter) waitForMessage(ctx context.Context, ch <-chan []*apitypes.HeadC } } -func (w *Waiter) receiptForTipset(ctx context.Context, ts *types.TipSet, msg types.ChainMsg, allowReplaced bool) (*apitypes.ChainMessage, bool, error) { +func (w *Waiter) receiptForTipset(ctx context.Context, ts *types.TipSet, msg types.ChainMsg, allowReplaced bool) (*types.ChainMessage, bool, error) { // The genesis block if ts.Height() == 0 { return nil, false, nil @@ -305,7 +304,7 @@ func (w *Waiter) receiptForTipset(ctx context.Context, ts *types.TipSet, msg typ if err != nil { return nil, false, errors.Wrap(err, "error retrieving receipt from tipset") } - return &apitypes.ChainMessage{TS: ts, Message: msg.VMMessage(), Block: bms.Block, Receipt: recpt}, true, nil + return &types.ChainMessage{TS: ts, Message: msg.VMMessage(), Block: bms.Block, Receipt: recpt}, true, nil } // this should be that message diff --git a/pkg/chain/waiter_test.go b/pkg/chain/waiter_test.go index 5e3826d5fb..8de19c8135 100644 --- a/pkg/chain/waiter_test.go +++ b/pkg/chain/waiter_test.go @@ -6,6 +6,8 @@ import ( "testing" "time" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/venus/pkg/testhelpers" "github.com/filecoin-project/venus/pkg/constants" @@ -16,8 +18,6 @@ import ( tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" cbor "github.com/ipfs/go-ipld-cbor" "github.com/stretchr/testify/assert" - - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" ) var mockSigner, _ = testhelpers.NewMockSignersAndKeyInfo(10) @@ -39,7 +39,7 @@ func TestWaitRespectsContextCancel(t *testing.T) { _, _, _, waiter := setupTest(t) var err error - var chainMessage *apitypes.ChainMessage + var chainMessage *types.ChainMessage doneCh := make(chan struct{}) go func() { defer close(doneCh) diff --git a/pkg/chainsync/chainsync.go b/pkg/chainsync/chainsync.go index 90ae44eb0a..59f7a9d911 100644 --- a/pkg/chainsync/chainsync.go +++ b/pkg/chainsync/chainsync.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/venus/pkg/chainsync/types" "github.com/filecoin-project/venus/pkg/consensus" "github.com/filecoin-project/venus/pkg/statemanger" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + types2 "github.com/filecoin-project/venus/venus-shared/types" blockstore "github.com/ipfs/go-ipfs-blockstore" diff --git a/pkg/chainsync/dispatcher/dispatcher.go b/pkg/chainsync/dispatcher/dispatcher.go index 4abc9d9bee..6cf3ae730f 100644 --- a/pkg/chainsync/dispatcher/dispatcher.go +++ b/pkg/chainsync/dispatcher/dispatcher.go @@ -9,7 +9,7 @@ import ( "time" "github.com/filecoin-project/venus/pkg/chainsync/types" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + types2 "github.com/filecoin-project/venus/venus-shared/types" "github.com/streadway/handy/atomic" logging "github.com/ipfs/go-log/v2" diff --git a/pkg/chainsync/dispatcher/dispatcher_test.go b/pkg/chainsync/dispatcher/dispatcher_test.go index ee0cd221e3..6784dc1e8b 100644 --- a/pkg/chainsync/dispatcher/dispatcher_test.go +++ b/pkg/chainsync/dispatcher/dispatcher_test.go @@ -13,7 +13,7 @@ import ( acrypto "github.com/filecoin-project/go-state-types/crypto" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/pkg/chainsync/exchange/cbor_gen.go b/pkg/chainsync/exchange/cbor_gen.go index 604aec8982..02af41f3f1 100644 --- a/pkg/chainsync/exchange/cbor_gen.go +++ b/pkg/chainsync/exchange/cbor_gen.go @@ -7,7 +7,7 @@ import ( "io" "sort" - chain "github.com/filecoin-project/venus/venus-shared/chain" + chain "github.com/filecoin-project/venus/venus-shared/types" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" diff --git a/pkg/chainsync/exchange/client.go b/pkg/chainsync/exchange/client.go index aa83a31035..b003655d5d 100644 --- a/pkg/chainsync/exchange/client.go +++ b/pkg/chainsync/exchange/client.go @@ -20,7 +20,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/net" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var exchangeClientLogger = logging.Logger("exchange.client") diff --git a/pkg/chainsync/exchange/interfaces.go b/pkg/chainsync/exchange/interfaces.go index 67d2919ec1..c0b58a1a44 100644 --- a/pkg/chainsync/exchange/interfaces.go +++ b/pkg/chainsync/exchange/interfaces.go @@ -5,7 +5,7 @@ import ( "github.com/libp2p/go-libp2p-core/peer" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // Server is the responder side of the ChainExchange protocol. It accepts diff --git a/pkg/chainsync/exchange/protocol.go b/pkg/chainsync/exchange/protocol.go index 357b599f66..441a6509a0 100644 --- a/pkg/chainsync/exchange/protocol.go +++ b/pkg/chainsync/exchange/protocol.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/venus-shared/actors/policy" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" logging "github.com/ipfs/go-log" "golang.org/x/xerrors" ) diff --git a/pkg/chainsync/exchange/server.go b/pkg/chainsync/exchange/server.go index 4ffd3d0305..097e7fc9d3 100644 --- a/pkg/chainsync/exchange/server.go +++ b/pkg/chainsync/exchange/server.go @@ -16,7 +16,7 @@ import ( "github.com/libp2p/go-libp2p-core/host" inet "github.com/libp2p/go-libp2p-core/network" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var exchangeServerLog = logging.Logger("exchange.server") diff --git a/pkg/chainsync/slashfilter/mysqldb.go b/pkg/chainsync/slashfilter/mysqldb.go index d0932e3d31..da50c5e617 100644 --- a/pkg/chainsync/slashfilter/mysqldb.go +++ b/pkg/chainsync/slashfilter/mysqldb.go @@ -13,7 +13,7 @@ import ( "gorm.io/gorm" "github.com/filecoin-project/venus/pkg/config" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var log = logging.Logger("mysql") diff --git a/pkg/chainsync/slashfilter/slashfilter.go b/pkg/chainsync/slashfilter/slashfilter.go index f25bf2f6b2..05631c602c 100644 --- a/pkg/chainsync/slashfilter/slashfilter.go +++ b/pkg/chainsync/slashfilter/slashfilter.go @@ -11,7 +11,7 @@ import ( "github.com/ipfs/go-datastore/namespace" "github.com/filecoin-project/go-state-types/abi" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) //ISlashFilter used to detect whether the miner mined a invalidated block , support local db and mysql storage diff --git a/pkg/chainsync/syncer/syncer.go b/pkg/chainsync/syncer/syncer.go index f5c0f49a00..917bf5e507 100644 --- a/pkg/chainsync/syncer/syncer.go +++ b/pkg/chainsync/syncer/syncer.go @@ -26,7 +26,7 @@ import ( "github.com/filecoin-project/venus/pkg/metrics/tracing" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/venus-shared/actors/policy" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" blockstore "github.com/ipfs/go-ipfs-blockstore" logging "github.com/ipfs/go-log/v2" diff --git a/pkg/chainsync/syncer/syncer_integration_test.go b/pkg/chainsync/syncer/syncer_integration_test.go index 85ab655006..8e51d930ac 100644 --- a/pkg/chainsync/syncer/syncer_integration_test.go +++ b/pkg/chainsync/syncer/syncer_integration_test.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/venus/pkg/statemanger" "github.com/filecoin-project/venus/pkg/chainsync/types" - types2 "github.com/filecoin-project/venus/venus-shared/chain" + types2 "github.com/filecoin-project/venus/venus-shared/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/pkg/chainsync/syncer/syncer_test.go b/pkg/chainsync/syncer/syncer_test.go index 559c15c8c5..dba9744c6a 100644 --- a/pkg/chainsync/syncer/syncer_test.go +++ b/pkg/chainsync/syncer/syncer_test.go @@ -20,7 +20,7 @@ import ( tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/pkg/util/test" "github.com/filecoin-project/venus/venus-shared/actors/policy" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" "github.com/pkg/errors" "github.com/stretchr/testify/assert" diff --git a/pkg/chainsync/types/bad_tipset_cache.go b/pkg/chainsync/types/bad_tipset_cache.go index a77771f0d3..00ef54ae3c 100644 --- a/pkg/chainsync/types/bad_tipset_cache.go +++ b/pkg/chainsync/types/bad_tipset_cache.go @@ -3,7 +3,7 @@ package types import ( "sync" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // BadTipSetCache keeps track of bad tipsets that the syncer should not try to diff --git a/pkg/chainsync/types/target_tracker.go b/pkg/chainsync/types/target_tracker.go index 6ad61e467e..26a04470ae 100644 --- a/pkg/chainsync/types/target_tracker.go +++ b/pkg/chainsync/types/target_tracker.go @@ -11,7 +11,7 @@ import ( "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var log = logging.Logger("chainsync.target") diff --git a/pkg/config/config.go b/pkg/config/config.go index 0a51017204..0c70d3fdd4 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -17,7 +17,7 @@ import ( "github.com/pkg/errors" "github.com/filecoin-project/venus/pkg/constants" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) const ( diff --git a/pkg/consensus/block_validator.go b/pkg/consensus/block_validator.go index e38c712679..3efda57c7f 100644 --- a/pkg/consensus/block_validator.go +++ b/pkg/consensus/block_validator.go @@ -36,7 +36,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/hashicorp/go-multierror" lru "github.com/hashicorp/golang-lru" "github.com/ipfs/go-cid" diff --git a/pkg/consensus/chain_selector.go b/pkg/consensus/chain_selector.go index a816df7ee8..b698c8b219 100644 --- a/pkg/consensus/chain_selector.go +++ b/pkg/consensus/chain_selector.go @@ -16,7 +16,7 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/state" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var log = logging.Logger("chain_selector") diff --git a/pkg/consensus/expected.go b/pkg/consensus/expected.go index f9718ac541..db54e7100e 100644 --- a/pkg/consensus/expected.go +++ b/pkg/consensus/expected.go @@ -24,7 +24,7 @@ import ( "github.com/filecoin-project/venus/pkg/state/tree" "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/pkg/vm/gas" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var ( @@ -135,8 +135,6 @@ type Expected struct { blockValidator *BlockValidator } - - // NewExpected is the constructor for the Expected consenus.Protocol module. func NewExpected(cs cbor.IpldStore, bs blockstore.Blockstore, diff --git a/pkg/consensus/head_randomness.go b/pkg/consensus/head_randomness.go index c16a7c4827..05aa548fd5 100644 --- a/pkg/consensus/head_randomness.go +++ b/pkg/consensus/head_randomness.go @@ -4,7 +4,7 @@ import ( "context" "github.com/filecoin-project/venus/pkg/vm/vmcontext" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-state-types/abi" acrypto "github.com/filecoin-project/go-state-types/crypto" diff --git a/pkg/consensus/message_validator.go b/pkg/consensus/message_validator.go index c1f7e1f0c7..34a082c43b 100644 --- a/pkg/consensus/message_validator.go +++ b/pkg/consensus/message_validator.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/metrics" "github.com/filecoin-project/venus/pkg/state" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var invReceiverUndefCt *metrics.Int64Counter diff --git a/pkg/consensus/message_validator_test.go b/pkg/consensus/message_validator_test.go index b08bbea75c..160333be05 100644 --- a/pkg/consensus/message_validator_test.go +++ b/pkg/consensus/message_validator_test.go @@ -7,7 +7,7 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/testhelpers" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" "github.com/stretchr/testify/assert" diff --git a/pkg/consensus/processor.go b/pkg/consensus/processor.go index bef5f6539c..f6545d64f5 100644 --- a/pkg/consensus/processor.go +++ b/pkg/consensus/processor.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/metrics/tracing" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/venus/pkg/vm" ) diff --git a/pkg/consensus/protocol.go b/pkg/consensus/protocol.go index 612878f864..678b4f4bfb 100644 --- a/pkg/consensus/protocol.go +++ b/pkg/consensus/protocol.go @@ -12,7 +12,7 @@ package consensus import ( "context" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ) diff --git a/pkg/consensus/testing.go b/pkg/consensus/testing.go index 1e0a8d9145..18861f747f 100644 --- a/pkg/consensus/testing.go +++ b/pkg/consensus/testing.go @@ -11,7 +11,7 @@ import ( "github.com/stretchr/testify/require" "github.com/filecoin-project/venus/pkg/state" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // RequireNewTipSet instantiates and returns a new tipset of the given blocks diff --git a/pkg/consensus/ticket.go b/pkg/consensus/ticket.go index a6d036178e..23484c6583 100644 --- a/pkg/consensus/ticket.go +++ b/pkg/consensus/ticket.go @@ -13,7 +13,7 @@ import ( "github.com/pkg/errors" "github.com/filecoin-project/venus/pkg/crypto" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type ChainSampler interface { diff --git a/pkg/consensus/ticket_test.go b/pkg/consensus/ticket_test.go index a8caa2d5a8..d2450e333f 100644 --- a/pkg/consensus/ticket_test.go +++ b/pkg/consensus/ticket_test.go @@ -7,7 +7,7 @@ import ( "github.com/filecoin-project/venus/pkg/testhelpers" "github.com/filecoin-project/venus/pkg/constants" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" fbig "github.com/filecoin-project/go-state-types/big" diff --git a/pkg/consensus/weight_test.go b/pkg/consensus/weight_test.go index ff299c7fdd..fcdb2fd97a 100644 --- a/pkg/consensus/weight_test.go +++ b/pkg/consensus/weight_test.go @@ -6,7 +6,7 @@ import ( "github.com/filecoin-project/venus/pkg/testhelpers" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-state-types/abi" fbig "github.com/filecoin-project/go-state-types/big" diff --git a/pkg/consensusfault/check.go b/pkg/consensusfault/check.go index 1e6a4eb57c..710575061d 100644 --- a/pkg/consensusfault/check.go +++ b/pkg/consensusfault/check.go @@ -21,7 +21,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/filecoin-project/venus/venus-shared/actors/policy" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type FaultStateView interface { diff --git a/pkg/discovery/hello_protocol.go b/pkg/discovery/hello_protocol.go index 25f46766af..74ca5eb87c 100644 --- a/pkg/discovery/hello_protocol.go +++ b/pkg/discovery/hello_protocol.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/chainsync/exchange" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/libp2p/go-libp2p-core/peer" "github.com/filecoin-project/go-state-types/abi" diff --git a/pkg/discovery/hello_protocol_test.go b/pkg/discovery/hello_protocol_test.go index a62c4db833..70110607b0 100644 --- a/pkg/discovery/hello_protocol_test.go +++ b/pkg/discovery/hello_protocol_test.go @@ -22,7 +22,7 @@ import ( "github.com/filecoin-project/venus/pkg/repo" th "github.com/filecoin-project/venus/pkg/testhelpers" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type mockHelloCallback struct { diff --git a/pkg/discovery/peer_tracker.go b/pkg/discovery/peer_tracker.go index b2b318392b..76b0ce96b7 100644 --- a/pkg/discovery/peer_tracker.go +++ b/pkg/discovery/peer_tracker.go @@ -4,7 +4,7 @@ import ( "sort" "sync" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" logging "github.com/ipfs/go-log/v2" "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" diff --git a/pkg/discovery/peer_tracker_test.go b/pkg/discovery/peer_tracker_test.go index 39134395e0..7686527b9a 100644 --- a/pkg/discovery/peer_tracker_test.go +++ b/pkg/discovery/peer_tracker_test.go @@ -6,7 +6,7 @@ import ( "time" "github.com/filecoin-project/venus/pkg/util/test" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/libp2p/go-libp2p-core/network" "github.com/filecoin-project/venus/pkg/discovery" diff --git a/pkg/events/cache.go b/pkg/events/cache.go index d9558f2d8e..33f2725fd8 100644 --- a/pkg/events/cache.go +++ b/pkg/events/cache.go @@ -8,14 +8,13 @@ import ( "github.com/ipfs/go-cid" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type uncachedAPI interface { - ChainNotify(context.Context) <-chan []*apitypes.HeadChange - ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*apitypes.HeadChange, error) - StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) + ChainNotify(context.Context) <-chan []*types.HeadChange + ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*types.HeadChange, error) + StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) // optional / for CalledMsg diff --git a/pkg/events/eventAPI.go b/pkg/events/eventAPI.go index 3b20bdb434..180edd91af 100644 --- a/pkg/events/eventAPI.go +++ b/pkg/events/eventAPI.go @@ -7,8 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // A TipSetObserver receives notifications of tipsets @@ -18,14 +17,14 @@ type TipSetObserver interface { } type IEvent interface { - ChainNotify(context.Context) <-chan []*apitypes.HeadChange - ChainGetBlockMessages(context.Context, cid.Cid) (*apitypes.BlockMessages, error) + ChainNotify(context.Context) <-chan []*types.HeadChange + ChainGetBlockMessages(context.Context, cid.Cid) (*types.BlockMessages, error) ChainGetTipSetByHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) ChainGetTipSetAfterHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) ChainHead(context.Context) (*types.TipSet, error) - StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) + StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) ChainGetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) - ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*apitypes.HeadChange, error) + ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*types.HeadChange, error) StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) // optional / for CalledMsg } diff --git a/pkg/events/events.go b/pkg/events/events.go index 5f3daf222e..b2c7523d98 100644 --- a/pkg/events/events.go +++ b/pkg/events/events.go @@ -7,7 +7,7 @@ import ( logging "github.com/ipfs/go-log/v2" "github.com/filecoin-project/venus/pkg/constants" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var log = logging.Logger("events") diff --git a/pkg/events/events_called.go b/pkg/events/events_called.go index b747dc35ac..debe31f747 100644 --- a/pkg/events/events_called.go +++ b/pkg/events/events_called.go @@ -10,7 +10,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/constants" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) const NoTimeout = math.MaxInt64 diff --git a/pkg/events/events_height.go b/pkg/events/events_height.go index 8099db498d..3d8ebb6d5c 100644 --- a/pkg/events/events_height.go +++ b/pkg/events/events_height.go @@ -5,7 +5,7 @@ import ( "sync" "github.com/filecoin-project/go-state-types/abi" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "go.opencensus.io/trace" "golang.org/x/xerrors" ) diff --git a/pkg/events/events_test.go b/pkg/events/events_test.go index 490046291a..1801b9b947 100644 --- a/pkg/events/events_test.go +++ b/pkg/events/events_test.go @@ -21,8 +21,7 @@ import ( "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/constants" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var dummyCid cid.Cid @@ -51,7 +50,7 @@ type fakeCS struct { mu sync.Mutex waitSub chan struct{} - subCh chan<- []*apitypes.HeadChange + subCh chan<- []*types.HeadChange callNumber map[string]int cancel context.CancelFunc @@ -104,7 +103,7 @@ func (fcs *fakeCS) ChainHead(ctx context.Context) (*types.TipSet, error) { return fcs.tsc.ChainHead(ctx) } -func (fcs *fakeCS) ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*apitypes.HeadChange, error) { +func (fcs *fakeCS) ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*types.HeadChange, error) { fcs.mu.Lock() fcs.callNumber["ChainGetPath"] = fcs.callNumber["ChainGetPath"] + 1 fcs.mu.Unlock() @@ -127,12 +126,12 @@ func (fcs *fakeCS) ChainGetPath(ctx context.Context, from, to types.TipSetKey) ( return nil, err } - path := make([]*apitypes.HeadChange, len(revert)+len(apply)) + path := make([]*types.HeadChange, len(revert)+len(apply)) for i, r := range revert { - path[i] = &apitypes.HeadChange{Type: chain.HCRevert, Val: r} + path[i] = &types.HeadChange{Type: chain.HCRevert, Val: r} } for j, i := 0, len(apply)-1; i >= 0; j, i = j+1, i-1 { - path[j+len(revert)] = &apitypes.HeadChange{Type: chain.HCApply, Val: apply[i]} + path[j+len(revert)] = &types.HeadChange{Type: chain.HCApply, Val: apply[i]} } return path, nil } @@ -144,7 +143,7 @@ func (fcs *fakeCS) ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*ty return fcs.tipsets[key], nil } -func (fcs *fakeCS) StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) { +func (fcs *fakeCS) StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) { fcs.mu.Lock() defer fcs.mu.Unlock() fcs.callNumber["StateSearchMsg"] = fcs.callNumber["StateSearchMsg"] + 1 @@ -219,12 +218,12 @@ func (fcs *fakeCS) makeTs(t *testing.T, parents []cid.Cid, h abi.ChainEpoch, msg return ts } -func (fcs *fakeCS) ChainNotify(ctx context.Context) <-chan []*apitypes.HeadChange { +func (fcs *fakeCS) ChainNotify(ctx context.Context) <-chan []*types.HeadChange { fcs.mu.Lock() defer fcs.mu.Unlock() fcs.callNumber["ChainNotify"] = fcs.callNumber["ChainNotify"] + 1 - out := make(chan []*apitypes.HeadChange, 1) + out := make(chan []*types.HeadChange, 1) if fcs.subCh != nil { close(out) fcs.t.Error("already subscribed to notifications") @@ -236,25 +235,25 @@ func (fcs *fakeCS) ChainNotify(ctx context.Context) <-chan []*apitypes.HeadChang panic(err) } - out <- []*apitypes.HeadChange{{Type: chain.HCCurrent, Val: best}} + out <- []*types.HeadChange{{Type: chain.HCCurrent, Val: best}} fcs.subCh = out close(fcs.waitSub) return out } -func (fcs *fakeCS) ChainGetBlockMessages(ctx context.Context, blk cid.Cid) (*apitypes.BlockMessages, error) { +func (fcs *fakeCS) ChainGetBlockMessages(ctx context.Context, blk cid.Cid) (*types.BlockMessages, error) { fcs.mu.Lock() defer fcs.mu.Unlock() fcs.callNumber["ChainGetBlockMessages"] = fcs.callNumber["ChainGetBlockMessages"] + 1 messages, ok := fcs.blkMsgs[blk] if !ok { - return &apitypes.BlockMessages{}, nil + return &types.BlockMessages{}, nil } ms, ok := fcs.msgs[messages] if !ok { - return &apitypes.BlockMessages{}, nil + return &types.BlockMessages{}, nil } cids := make([]cid.Cid, len(ms.bmsgs)+len(ms.smsgs)) @@ -265,7 +264,7 @@ func (fcs *fakeCS) ChainGetBlockMessages(ctx context.Context, blk cid.Cid) (*api cids[i+len(ms.bmsgs)] = m.Cid() } - return &apitypes.BlockMessages{BlsMessages: ms.bmsgs, SecpkMessages: ms.smsgs, Cids: cids}, nil + return &types.BlockMessages{BlsMessages: ms.bmsgs, SecpkMessages: ms.smsgs, Cids: cids}, nil } func (fcs *fakeCS) fakeMsgs(m fakeMsg) cid.Cid { @@ -301,16 +300,16 @@ func (fcs *fakeCS) dropSub() { func (fcs *fakeCS) sub(rev, app []*types.TipSet) { <-fcs.waitSub - notif := make([]*apitypes.HeadChange, len(rev)+len(app)) + notif := make([]*types.HeadChange, len(rev)+len(app)) for i, r := range rev { - notif[i] = &apitypes.HeadChange{ + notif[i] = &types.HeadChange{ Type: chain.HCRevert, Val: r, } } for i, r := range app { - notif[i+len(rev)] = &apitypes.HeadChange{ + notif[i+len(rev)] = &types.HeadChange{ Type: chain.HCApply, Val: r, } diff --git a/pkg/events/message_cache.go b/pkg/events/message_cache.go index 266fe390cb..fb8b33a0a2 100644 --- a/pkg/events/message_cache.go +++ b/pkg/events/message_cache.go @@ -4,10 +4,10 @@ import ( "context" "sync" + "github.com/filecoin-project/venus/venus-shared/types" + lru "github.com/hashicorp/golang-lru" "github.com/ipfs/go-cid" - - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" ) type messageCache struct { @@ -26,7 +26,7 @@ func newMessageCache(api IEvent) *messageCache { } } -func (c *messageCache) ChainGetBlockMessages(ctx context.Context, blkCid cid.Cid) (*apitypes.BlockMessages, error) { +func (c *messageCache) ChainGetBlockMessages(ctx context.Context, blkCid cid.Cid) (*types.BlockMessages, error) { c.blockMsgLk.Lock() defer c.blockMsgLk.Unlock() @@ -39,5 +39,5 @@ func (c *messageCache) ChainGetBlockMessages(ctx context.Context, blkCid cid.Cid } c.blockMsgCache.Add(blkCid, msgsI) } - return msgsI.(*apitypes.BlockMessages), nil + return msgsI.(*types.BlockMessages), nil } diff --git a/pkg/events/observer.go b/pkg/events/observer.go index 19b91a4d4b..eae73c68c6 100644 --- a/pkg/events/observer.go +++ b/pkg/events/observer.go @@ -5,14 +5,14 @@ import ( "sync" "time" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/go-state-types/abi" "go.opencensus.io/trace" "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/constants" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" ) var ObserveDuration = time.Second * 45 @@ -104,7 +104,7 @@ func (o *observer) listenHeadChangesOnce(ctx context.Context) error { return nil } -func (o *observer) applyChanges(ctx context.Context, changes []*apitypes.HeadChange) error { +func (o *observer) applyChanges(ctx context.Context, changes []*types.HeadChange) error { // Used to wait for a prior notification round to finish (by tests) if len(changes) == 0 { return nil diff --git a/pkg/events/state/fastapi.go b/pkg/events/state/fastapi.go index 622695ba65..a4a47f023d 100644 --- a/pkg/events/state/fastapi.go +++ b/pkg/events/state/fastapi.go @@ -4,7 +4,7 @@ import ( "context" "github.com/filecoin-project/go-address" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type FastChainAPI interface { diff --git a/pkg/events/state/mock/api.go b/pkg/events/state/mock/api.go index eda198b22a..04910289be 100644 --- a/pkg/events/state/mock/api.go +++ b/pkg/events/state/mock/api.go @@ -10,7 +10,7 @@ import ( "golang.org/x/xerrors" blockstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type MockAPI struct { diff --git a/pkg/events/state/mock/tipset.go b/pkg/events/state/mock/tipset.go index 1efda23e52..abfb1c68c8 100644 --- a/pkg/events/state/mock/tipset.go +++ b/pkg/events/state/mock/tipset.go @@ -3,7 +3,7 @@ package test import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/crypto" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ) diff --git a/pkg/events/state/predicates.go b/pkg/events/state/predicates.go index b83cdd08df..6cc121d773 100644 --- a/pkg/events/state/predicates.go +++ b/pkg/events/state/predicates.go @@ -15,7 +15,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // UserData is the data returned from the DiffTipSetKeyFunc diff --git a/pkg/events/state/predicates_test.go b/pkg/events/state/predicates_test.go index b30274bbf7..056efe485f 100644 --- a/pkg/events/state/predicates_test.go +++ b/pkg/events/state/predicates_test.go @@ -9,7 +9,7 @@ import ( bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" cbornode "github.com/ipfs/go-ipld-cbor" diff --git a/pkg/events/tscache.go b/pkg/events/tscache.go index d8cfaacd6f..8ae1e11da8 100644 --- a/pkg/events/tscache.go +++ b/pkg/events/tscache.go @@ -5,7 +5,7 @@ import ( "sync" "github.com/filecoin-project/go-state-types/abi" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "golang.org/x/xerrors" ) diff --git a/pkg/events/tscache_test.go b/pkg/events/tscache_test.go index 0c47f2a9b0..320acd64ee 100644 --- a/pkg/events/tscache_test.go +++ b/pkg/events/tscache_test.go @@ -11,7 +11,7 @@ import ( "github.com/stretchr/testify/require" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type tsCacheAPIFailOnStorageCall struct { diff --git a/pkg/events/utils.go b/pkg/events/utils.go index e9b62282f6..e98362ecaa 100644 --- a/pkg/events/utils.go +++ b/pkg/events/utils.go @@ -6,7 +6,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/constants" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // CheckMsg convenience function for checking and matching messages diff --git a/pkg/fork/fork.go b/pkg/fork/fork.go index 5bed606f3e..5961a5621e 100644 --- a/pkg/fork/fork.go +++ b/pkg/fork/fork.go @@ -50,8 +50,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" "github.com/filecoin-project/venus/venus-shared/actors/builtin/multisig" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var log = logging.Logger("fork") @@ -356,7 +355,7 @@ type chainReader interface { GetTipSetByHeight(context.Context, *types.TipSet, abi.ChainEpoch, bool) (*types.TipSet, error) GetTipSetState(context.Context, *types.TipSet) (vmstate.Tree, error) GetGenesisBlock(context.Context) (*types.BlockHeader, error) - SubHeadChanges(context.Context) chan []*apitypes.HeadChange + SubHeadChanges(context.Context) chan []*types.HeadChange } type IFork interface { diff --git a/pkg/fork/mock.go b/pkg/fork/mock.go index 55402b4320..2ce487e98e 100644 --- a/pkg/fork/mock.go +++ b/pkg/fork/mock.go @@ -4,7 +4,7 @@ import ( "context" "github.com/filecoin-project/venus/pkg/config" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" diff --git a/pkg/gen/genesis/f00_system.go b/pkg/gen/genesis/f00_system.go index eea94fcdb5..2f5150314a 100644 --- a/pkg/gen/genesis/f00_system.go +++ b/pkg/gen/genesis/f00_system.go @@ -12,7 +12,7 @@ import ( cbor "github.com/ipfs/go-ipld-cbor" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) func SetupSystemActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { diff --git a/pkg/gen/genesis/f01_init.go b/pkg/gen/genesis/f01_init.go index 27b5500886..b357ac464f 100644 --- a/pkg/gen/genesis/f01_init.go +++ b/pkg/gen/genesis/f01_init.go @@ -18,7 +18,7 @@ import ( bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) func SetupInitActor(ctx context.Context, bs bstore.Blockstore, netname string, initialActors []Actor, rootVerifier Actor, remainder Actor, av actors.Version) (int64, *types.Actor, map[address.Address]address.Address, error) { diff --git a/pkg/gen/genesis/f02_reward.go b/pkg/gen/genesis/f02_reward.go index adfe1deb47..060cf21a4a 100644 --- a/pkg/gen/genesis/f02_reward.go +++ b/pkg/gen/genesis/f02_reward.go @@ -7,7 +7,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-state-types/big" diff --git a/pkg/gen/genesis/f03_cron.go b/pkg/gen/genesis/f03_cron.go index 7c36d58e51..eedc9ae3ff 100644 --- a/pkg/gen/genesis/f03_cron.go +++ b/pkg/gen/genesis/f03_cron.go @@ -11,7 +11,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin/cron" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) func SetupCronActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { diff --git a/pkg/gen/genesis/f04_power.go b/pkg/gen/genesis/f04_power.go index 4a575d0390..275d3c6ea2 100644 --- a/pkg/gen/genesis/f04_power.go +++ b/pkg/gen/genesis/f04_power.go @@ -12,7 +12,7 @@ import ( cbor "github.com/ipfs/go-ipld-cbor" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) func SetupStoragePowerActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { diff --git a/pkg/gen/genesis/f05_market.go b/pkg/gen/genesis/f05_market.go index 0f470614be..92477d8341 100644 --- a/pkg/gen/genesis/f05_market.go +++ b/pkg/gen/genesis/f05_market.go @@ -11,7 +11,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) func SetupStorageMarketActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) { diff --git a/pkg/gen/genesis/f06_vreg.go b/pkg/gen/genesis/f06_vreg.go index 329c43b7e5..c4d16df34c 100644 --- a/pkg/gen/genesis/f06_vreg.go +++ b/pkg/gen/genesis/f06_vreg.go @@ -14,7 +14,7 @@ import ( "github.com/filecoin-project/specs-actors/actors/util/adt" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var RootVerifierID address.Address diff --git a/pkg/gen/genesis/genesis.go b/pkg/gen/genesis/genesis.go index 04735f4c9b..66a8389936 100644 --- a/pkg/gen/genesis/genesis.go +++ b/pkg/gen/genesis/genesis.go @@ -10,7 +10,7 @@ import ( "github.com/filecoin-project/venus/pkg/fork" "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" "github.com/filecoin-project/venus/pkg/vmsupport" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/vm/gas" diff --git a/pkg/gen/genesis/miners.go b/pkg/gen/genesis/miners.go index 9a2864b32f..eb41a13fb9 100644 --- a/pkg/gen/genesis/miners.go +++ b/pkg/gen/genesis/miners.go @@ -54,7 +54,7 @@ import ( "github.com/filecoin-project/venus/pkg/vm/gas" "github.com/filecoin-project/venus/pkg/vm/vmcontext" "github.com/filecoin-project/venus/pkg/vmsupport" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) func MinerAddress(genesisIndex uint64) address.Address { diff --git a/pkg/gen/genesis/util.go b/pkg/gen/genesis/util.go index 4fdf2ccffc..3fd362b69f 100644 --- a/pkg/gen/genesis/util.go +++ b/pkg/gen/genesis/util.go @@ -11,7 +11,7 @@ import ( "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/venus-shared/actors" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) func mustEnc(i cbg.CBORMarshaler) []byte { diff --git a/pkg/genesis/genesis.go b/pkg/genesis/genesis.go index 7987c86b1d..631ecb0806 100644 --- a/pkg/genesis/genesis.go +++ b/pkg/genesis/genesis.go @@ -30,7 +30,7 @@ import ( "github.com/filecoin-project/venus/pkg/state/tree" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/pkg/vm" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var glog = logging.Logger("genesis") diff --git a/pkg/genesis/init.go b/pkg/genesis/init.go index bf564664ec..7c83690662 100644 --- a/pkg/genesis/init.go +++ b/pkg/genesis/init.go @@ -6,7 +6,7 @@ import ( "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/config" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" bstore "github.com/ipfs/go-ipfs-blockstore" cbor "github.com/ipfs/go-ipld-cbor" diff --git a/pkg/market/fmgr.go b/pkg/market/fmgr.go index 61388bea22..3e80033828 100644 --- a/pkg/market/fmgr.go +++ b/pkg/market/fmgr.go @@ -4,20 +4,19 @@ import ( "context" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/ipfs/go-cid" ) // fundManagerAPI is the specific methods called by the FundManager // (used by the tests) type fundManager interface { - MpoolPushMessage(context.Context, *types.Message, *apitypes.MessageSendSpec) (*types.SignedMessage, error) - StateMarketBalance(context.Context, address.Address, types.TipSetKey) (apitypes.MarketBalance, error) - StateWaitMsg(ctx context.Context, c cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) + MpoolPushMessage(context.Context, *types.Message, *types.MessageSendSpec) (*types.SignedMessage, error) + StateMarketBalance(context.Context, address.Address, types.TipSetKey) (types.MarketBalance, error) + StateWaitMsg(ctx context.Context, c cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) } type fmgr struct { @@ -36,14 +35,14 @@ func newFundmanager(p *FundManagerParams) fundManager { return fmAPI } -func (o *fmgr) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec) (*types.SignedMessage, error) { +func (o *fmgr) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec) (*types.SignedMessage, error) { return o.MPoolAPI.MpoolPushMessage(ctx, msg, spec) } -func (o *fmgr) StateMarketBalance(ctx context.Context, address address.Address, tsk types.TipSetKey) (apitypes.MarketBalance, error) { +func (o *fmgr) StateMarketBalance(ctx context.Context, address address.Address, tsk types.TipSetKey) (types.MarketBalance, error) { return o.MinerStateAPI.StateMarketBalance(ctx, address, tsk) } -func (o *fmgr) StateWaitMsg(ctx context.Context, c cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) { +func (o *fmgr) StateWaitMsg(ctx context.Context, c cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) { return o.ChainInfoAPI.StateWaitMsg(ctx, c, confidence, limit, allowReplaced) } diff --git a/pkg/market/fundmanager.go b/pkg/market/fundmanager.go index d026d4b804..4c5323353b 100644 --- a/pkg/market/fundmanager.go +++ b/pkg/market/fundmanager.go @@ -11,7 +11,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" diff --git a/pkg/market/fundmanager_test.go b/pkg/market/fundmanager_test.go index 71d53f96f8..83fb785583 100644 --- a/pkg/market/fundmanager_test.go +++ b/pkg/market/fundmanager_test.go @@ -25,8 +25,7 @@ import ( _ "github.com/filecoin-project/venus/pkg/crypto/secp" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/pkg/wallet" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // TestFundManagerBasic verifies that the basic fund manager operations work @@ -705,7 +704,7 @@ func newMockFundManagerAPI(wallet address.Address) *mockFundManagerAPI { } } -func (mapi *mockFundManagerAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec) (*types.SignedMessage, error) { +func (mapi *mockFundManagerAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec) (*types.SignedMessage, error) { mapi.lk.Lock() defer mapi.lk.Unlock() @@ -780,11 +779,11 @@ func (mapi *mockFundManagerAPI) completeMsg(msgCid cid.Cid) { } } -func (mapi *mockFundManagerAPI) StateMarketBalance(ctx context.Context, address address.Address, tsk types.TipSetKey) (apitypes.MarketBalance, error) { +func (mapi *mockFundManagerAPI) StateMarketBalance(ctx context.Context, address address.Address, tsk types.TipSetKey) (types.MarketBalance, error) { mapi.lk.Lock() defer mapi.lk.Unlock() - return apitypes.MarketBalance{ + return types.MarketBalance{ Locked: abi.NewTokenAmount(0), Escrow: mapi.getEscrow(address), }, nil @@ -813,8 +812,8 @@ func (mapi *mockFundManagerAPI) publish(addr address.Address, amt abi.TokenAmoun mapi.escrow[addr] = escrow } -func (mapi *mockFundManagerAPI) StateWaitMsg(ctx context.Context, c cid.Cid, confidence uint64, limit abi.ChainEpoch, allwoReplaced bool) (*apitypes.MsgLookup, error) { - res := &apitypes.MsgLookup{ +func (mapi *mockFundManagerAPI) StateWaitMsg(ctx context.Context, c cid.Cid, confidence uint64, limit abi.ChainEpoch, allwoReplaced bool) (*types.MsgLookup, error) { + res := &types.MsgLookup{ Message: c, Receipt: types.MessageReceipt{ ExitCode: 0, diff --git a/pkg/messagepool/check.go b/pkg/messagepool/check.go index 718d6cab41..340ef37d0d 100644 --- a/pkg/messagepool/check.go +++ b/pkg/messagepool/check.go @@ -12,14 +12,13 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/vm/gas" - types "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/messagepool" + "github.com/filecoin-project/venus/venus-shared/types" ) var baseFeeUpperBoundFactor = types.NewInt(10) // CheckMessages performs a set of logic checks for a list of messages, prior to submitting it to the mpool -func (mp *MessagePool) CheckMessages(ctx context.Context, protos []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) { +func (mp *MessagePool) CheckMessages(ctx context.Context, protos []*types.MessagePrototype) ([][]types.MessageCheckStatus, error) { flex := make([]bool, len(protos)) msgs := make([]*types.Message, len(protos)) for i, p := range protos { @@ -30,7 +29,7 @@ func (mp *MessagePool) CheckMessages(ctx context.Context, protos []*messagepool. } // CheckPendingMessages performs a set of logical sets for all messages pending from a given actor -func (mp *MessagePool) CheckPendingMessages(ctx context.Context, from address.Address) ([][]messagepool.MessageCheckStatus, error) { +func (mp *MessagePool) CheckPendingMessages(ctx context.Context, from address.Address) ([][]types.MessageCheckStatus, error) { var msgs []*types.Message mp.lk.Lock() mset, ok := mp.pending[from] @@ -54,7 +53,7 @@ func (mp *MessagePool) CheckPendingMessages(ctx context.Context, from address.Ad // CheckReplaceMessages performs a set of logical checks for related messages while performing a // replacement. -func (mp *MessagePool) CheckReplaceMessages(ctx context.Context, replace []*types.Message) ([][]messagepool.MessageCheckStatus, error) { +func (mp *MessagePool) CheckReplaceMessages(ctx context.Context, replace []*types.Message) ([][]types.MessageCheckStatus, error) { msgMap := make(map[address.Address]map[uint64]*types.Message) count := 0 @@ -99,7 +98,7 @@ func (mp *MessagePool) CheckReplaceMessages(ctx context.Context, replace []*type // flexibleNonces should be either nil or of len(msgs), it signifies that message at given index // has non-determied nonce at this point -func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, interned bool, flexibleNonces []bool) (result [][]messagepool.MessageCheckStatus, err error) { +func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, interned bool, flexibleNonces []bool) (result [][]types.MessageCheckStatus, err error) { if mp.api.IsLite() { return nil, nil } @@ -130,14 +129,14 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, state := make(map[address.Address]*actorState) balances := make(map[address.Address]big.Int) - result = make([][]messagepool.MessageCheckStatus, len(msgs)) + result = make([][]types.MessageCheckStatus, len(msgs)) for i, m := range msgs { // pre-check: actor nonce - check := messagepool.MessageCheckStatus{ + check := types.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: messagepool.CheckStatus{ - Code: messagepool.CheckStatusMessageGetStateNonce, + CheckStatus: types.CheckStatus{ + Code: types.CheckStatusMessageGetStateNonce, }, } @@ -184,10 +183,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, } // pre-check: actor balance - check = messagepool.MessageCheckStatus{ + check = types.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: messagepool.CheckStatus{ - Code: messagepool.CheckStatusMessageGetStateBalance, + CheckStatus: types.CheckStatus{ + Code: types.CheckStatusMessageGetStateBalance, }, } @@ -218,10 +217,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, } // 1. Serialization - check = messagepool.MessageCheckStatus{ + check = types.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: messagepool.CheckStatus{ - Code: messagepool.CheckStatusMessageSerialize, + CheckStatus: types.CheckStatus{ + Code: types.CheckStatusMessageSerialize, }, } @@ -236,10 +235,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, result[i] = append(result[i], check) // 2. Message size - check = messagepool.MessageCheckStatus{ + check = types.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: messagepool.CheckStatus{ - Code: messagepool.CheckStatusMessageSize, + CheckStatus: types.CheckStatus{ + Code: types.CheckStatusMessageSize, }, } @@ -253,10 +252,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, result[i] = append(result[i], check) // 3. Syntactic validation - check = messagepool.MessageCheckStatus{ + check = types.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: messagepool.CheckStatus{ - Code: messagepool.CheckStatusMessageValidity, + CheckStatus: types.CheckStatus{ + Code: types.CheckStatusMessageValidity, }, } @@ -278,10 +277,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, // 4. Min Gas minGas := gas.NewPricesSchedule(mp.forkParams).PricelistByEpoch(epoch).OnChainMessage(m.ChainLength()) - check = messagepool.MessageCheckStatus{ + check = types.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: messagepool.CheckStatus{ - Code: messagepool.CheckStatusMessageMinGas, + CheckStatus: types.CheckStatus{ + Code: types.CheckStatusMessageMinGas, Hint: map[string]interface{}{ "minGas": minGas, }, @@ -298,10 +297,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, result[i] = append(result[i], check) // 5. Min Base Fee - check = messagepool.MessageCheckStatus{ + check = types.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: messagepool.CheckStatus{ - Code: messagepool.CheckStatusMessageMinBaseFee, + CheckStatus: types.CheckStatus{ + Code: types.CheckStatusMessageMinBaseFee, }, } @@ -318,10 +317,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, } // 6. Base Fee - check = messagepool.MessageCheckStatus{ + check = types.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: messagepool.CheckStatus{ - Code: messagepool.CheckStatusMessageBaseFee, + CheckStatus: types.CheckStatus{ + Code: types.CheckStatusMessageBaseFee, Hint: map[string]interface{}{ "baseFee": baseFee, }, @@ -338,10 +337,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, result[i] = append(result[i], check) // 7. Base Fee lower bound - check = messagepool.MessageCheckStatus{ + check = types.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: messagepool.CheckStatus{ - Code: messagepool.CheckStatusMessageBaseFeeLowerBound, + CheckStatus: types.CheckStatus{ + Code: types.CheckStatusMessageBaseFeeLowerBound, Hint: map[string]interface{}{ "baseFeeLowerBound": baseFeeLowerBound, "baseFee": baseFee, @@ -359,10 +358,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, result[i] = append(result[i], check) // 8. Base Fee upper bound - check = messagepool.MessageCheckStatus{ + check = types.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: messagepool.CheckStatus{ - Code: messagepool.CheckStatusMessageBaseFeeUpperBound, + CheckStatus: types.CheckStatus{ + Code: types.CheckStatusMessageBaseFeeUpperBound, Hint: map[string]interface{}{ "baseFeeUpperBound": baseFeeUpperBound, "baseFee": baseFee, @@ -382,10 +381,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, // stateful checks checkState: // 9. Message Nonce - check = messagepool.MessageCheckStatus{ + check = types.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: messagepool.CheckStatus{ - Code: messagepool.CheckStatusMessageNonce, + CheckStatus: types.CheckStatus{ + Code: types.CheckStatusMessageNonce, Hint: map[string]interface{}{ "nextNonce": st.nextNonce, }, @@ -407,10 +406,10 @@ func (mp *MessagePool) checkMessages(ctx context.Context, msgs []*types.Message, st.requiredFunds.Add(st.requiredFunds, m.Value.Int) // 10. Balance - check = messagepool.MessageCheckStatus{ + check = types.MessageCheckStatus{ Cid: m.Cid(), - CheckStatus: messagepool.CheckStatus{ - Code: messagepool.CheckStatusMessageBalance, + CheckStatus: types.CheckStatus{ + Code: types.CheckStatusMessageBalance, Hint: map[string]interface{}{ "requiredFunds": big.Int{Int: stdbig.NewInt(0).Set(st.requiredFunds)}, }, diff --git a/pkg/messagepool/gas.go b/pkg/messagepool/gas.go index f0675878da..0ea2fde0d1 100644 --- a/pkg/messagepool/gas.go +++ b/pkg/messagepool/gas.go @@ -19,8 +19,7 @@ import ( "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) const MinGasPremium = 100e3 @@ -273,7 +272,7 @@ func (mp *MessagePool) evalMessageGasLimit(ctx context.Context, msgIn *types.Mes return res.Receipt.GasUsed + 76e3, nil } -func (mp *MessagePool) GasEstimateMessageGas(ctx context.Context, estimateMessage *apitypes.EstimateMessage, _ types.TipSetKey) (*types.Message, error) { +func (mp *MessagePool) GasEstimateMessageGas(ctx context.Context, estimateMessage *types.EstimateMessage, _ types.TipSetKey) (*types.Message, error) { if estimateMessage == nil || estimateMessage.Msg == nil { return nil, xerrors.Errorf("estimate message is nil") } @@ -310,7 +309,7 @@ func (mp *MessagePool) GasEstimateMessageGas(ctx context.Context, estimateMessag return estimateMessage.Msg, nil } -func (mp *MessagePool) GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*apitypes.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*apitypes.EstimateResult, error) { +func (mp *MessagePool) GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) { if len(estimateMessages) == 0 { return nil, xerrors.New("estimate messages are empty") } @@ -332,7 +331,7 @@ func (mp *MessagePool) GasBatchEstimateMessageGas(ctx context.Context, estimateM priorMsgs = append(priorMsgs, m) } - var estimateResults []*apitypes.EstimateResult + var estimateResults []*types.EstimateResult for _, estimateMessage := range estimateMessages { estimateMsg := estimateMessage.Msg estimateMsg.Nonce = fromNonce @@ -346,7 +345,7 @@ func (mp *MessagePool) GasBatchEstimateMessageGas(ctx context.Context, estimateM gasUsed, err := mp.evalMessageGasLimit(ctx, estimateMsg, priorMsgs, ts) if err != nil { estimateMsg.Nonce = 0 - estimateResults = append(estimateResults, &apitypes.EstimateResult{ + estimateResults = append(estimateResults, &types.EstimateResult{ Msg: estimateMsg, Err: fmt.Sprintf("estimating gas limit: %v", err), }) @@ -359,7 +358,7 @@ func (mp *MessagePool) GasBatchEstimateMessageGas(ctx context.Context, estimateM gasPremium, err := mp.GasEstimateGasPremium(ctx, 10, estimateMsg.From, estimateMsg.GasLimit, types.TipSetKey{}, mp.PriceCache) if err != nil { estimateMsg.Nonce = 0 - estimateResults = append(estimateResults, &apitypes.EstimateResult{ + estimateResults = append(estimateResults, &types.EstimateResult{ Msg: estimateMsg, Err: fmt.Sprintf("estimating gas premium: %v", err), }) @@ -372,7 +371,7 @@ func (mp *MessagePool) GasBatchEstimateMessageGas(ctx context.Context, estimateM feeCap, err := mp.GasEstimateFeeCap(ctx, estimateMsg, 20, types.EmptyTSK) if err != nil { estimateMsg.Nonce = 0 - estimateResults = append(estimateResults, &apitypes.EstimateResult{ + estimateResults = append(estimateResults, &types.EstimateResult{ Msg: estimateMsg, Err: fmt.Sprintf("estimating fee cap: %v", err), }) @@ -383,7 +382,7 @@ func (mp *MessagePool) GasBatchEstimateMessageGas(ctx context.Context, estimateM CapGasFee(mp.GetMaxFee, estimateMsg, estimateMessage.Spec) - estimateResults = append(estimateResults, &apitypes.EstimateResult{ + estimateResults = append(estimateResults, &types.EstimateResult{ Msg: estimateMsg, }) priorMsgs = append(priorMsgs, estimateMsg) diff --git a/pkg/messagepool/gasguess/guessgas.go b/pkg/messagepool/gasguess/guessgas.go index 966b500691..0bce7242b3 100644 --- a/pkg/messagepool/gasguess/guessgas.go +++ b/pkg/messagepool/gasguess/guessgas.go @@ -7,7 +7,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" diff --git a/pkg/messagepool/messagepool.go b/pkg/messagepool/messagepool.go index d0ab1081b9..9ca914c3f0 100644 --- a/pkg/messagepool/messagepool.go +++ b/pkg/messagepool/messagepool.go @@ -39,9 +39,7 @@ import ( "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/statemanger" "github.com/filecoin-project/venus/pkg/vm/gas" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" - mptypes "github.com/filecoin-project/venus/venus-shared/messagepool" + "github.com/filecoin-project/venus/venus-shared/types" ) var log = logging.Logger("messagepool") @@ -206,7 +204,7 @@ func ComputeMinRBF(curPrem abi.TokenAmount) abi.TokenAmount { return big.Add(minPrice, big.NewInt(1)) } -func CapGasFee(mff DefaultMaxFeeFunc, msg *types.Message, sendSepc *apitypes.MessageSendSpec) { +func CapGasFee(mff DefaultMaxFeeFunc, msg *types.Message, sendSepc *types.MessageSendSpec) { var maxFee abi.TokenAmount if sendSepc != nil { maxFee = sendSepc.MaxFee @@ -1018,8 +1016,8 @@ func (mp *MessagePool) addLocked(ctx context.Context, m *types.SignedMessage, st } } - mp.changes.Pub(mptypes.MpoolUpdate{ - Type: mptypes.MpoolAdd, + mp.changes.Pub(types.MpoolUpdate{ + Type: types.MpoolAdd, Message: m, }, localUpdates) @@ -1154,8 +1152,8 @@ func (mp *MessagePool) remove(ctx context.Context, from address.Address, nonce u } if m, ok := mset.msgs[nonce]; ok { - mp.changes.Pub(mptypes.MpoolUpdate{ - Type: mptypes.MpoolRemove, + mp.changes.Pub(types.MpoolUpdate{ + Type: types.MpoolRemove, Message: m, }, localUpdates) @@ -1507,8 +1505,8 @@ func (mp *MessagePool) RecoverSig(msg *types.Message) *types.SignedMessage { } } -func (mp *MessagePool) Updates(ctx context.Context) (<-chan mptypes.MpoolUpdate, error) { - out := make(chan mptypes.MpoolUpdate, 20) +func (mp *MessagePool) Updates(ctx context.Context) (<-chan types.MpoolUpdate, error) { + out := make(chan types.MpoolUpdate, 20) sub := mp.changes.Sub(localUpdates) go func() { @@ -1519,7 +1517,7 @@ func (mp *MessagePool) Updates(ctx context.Context) (<-chan mptypes.MpoolUpdate, select { case u := <-sub: select { - case out <- u.(mptypes.MpoolUpdate): + case out <- u.(types.MpoolUpdate): case <-ctx.Done(): return case <-mp.closer: diff --git a/pkg/messagepool/messagepool_test.go b/pkg/messagepool/messagepool_test.go index f95e2ff30d..10dd0bcbbc 100644 --- a/pkg/messagepool/messagepool_test.go +++ b/pkg/messagepool/messagepool_test.go @@ -24,8 +24,7 @@ import ( "github.com/filecoin-project/venus/pkg/repo" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/pkg/wallet" - types "github.com/filecoin-project/venus/venus-shared/chain" - wtypes "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/filecoin-project/venus/venus-shared/types" ) func init() { @@ -66,7 +65,7 @@ func mkMessage(from, to address.Address, nonce uint64, w *wallet.Wallet) *types. } c := msg.Cid() - sig, err := w.WalletSign(context.Background(), from, c.Bytes(), wtypes.MsgMeta{}) + sig, err := w.WalletSign(context.Background(), from, c.Bytes(), types.MsgMeta{}) if err != nil { panic(err) } @@ -405,7 +404,7 @@ func TestCheckMessageBig(t *testing.T) { Params: make([]byte, 41<<10), // 41KiB payload } - sig, err := w.WalletSign(context.Background(), from, msg.Cid().Bytes(), wtypes.MsgMeta{}) + sig, err := w.WalletSign(context.Background(), from, msg.Cid().Bytes(), types.MsgMeta{}) if err != nil { panic(err) } @@ -428,7 +427,7 @@ func TestCheckMessageBig(t *testing.T) { Params: make([]byte, 64<<10), // 64KiB payload } - sig, err := w.WalletSign(context.Background(), from, msg.Cid().Bytes(), wtypes.MsgMeta{}) + sig, err := w.WalletSign(context.Background(), from, msg.Cid().Bytes(), types.MsgMeta{}) if err != nil { panic(err) } diff --git a/pkg/messagepool/messagesigner.go b/pkg/messagepool/messagesigner.go index 87953c873b..c03d92f323 100644 --- a/pkg/messagepool/messagesigner.go +++ b/pkg/messagepool/messagesigner.go @@ -6,9 +6,7 @@ import ( "sync" "github.com/filecoin-project/venus/pkg/wallet" - types "github.com/filecoin-project/venus/venus-shared/chain" - mptypes "github.com/filecoin-project/venus/venus-shared/wallet" - + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" cbg "github.com/whyrusleeping/cbor-gen" @@ -62,8 +60,8 @@ func (ms *MessageSigner) SignMessage(ctx context.Context, msg *types.Message, cb return nil, xerrors.Errorf("serializing message: %w", err) } - sig, err := ms.wallet.WalletSign(ctx, msg.From, mb.Cid().Bytes(), mptypes.MsgMeta{ - Type: mptypes.MTChainMsg, + sig, err := ms.wallet.WalletSign(ctx, msg.From, mb.Cid().Bytes(), types.MsgMeta{ + Type: types.MTChainMsg, Extra: mb.RawData(), }) if err != nil { diff --git a/pkg/messagepool/messagesigner_test.go b/pkg/messagepool/messagesigner_test.go index 15bd2db492..847d59e2fd 100644 --- a/pkg/messagepool/messagesigner_test.go +++ b/pkg/messagepool/messagesigner_test.go @@ -17,7 +17,7 @@ import ( _ "github.com/filecoin-project/venus/pkg/crypto/secp" "github.com/filecoin-project/venus/pkg/repo" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type mockMpool struct { diff --git a/pkg/messagepool/provider.go b/pkg/messagepool/provider.go index d6ba9ae8a4..3038cfcf0a 100644 --- a/pkg/messagepool/provider.go +++ b/pkg/messagepool/provider.go @@ -10,7 +10,7 @@ import ( "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/statemanger" "github.com/filecoin-project/venus/venus-shared/actors/policy" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" pubsub "github.com/libp2p/go-libp2p-pubsub" "golang.org/x/xerrors" diff --git a/pkg/messagepool/pruning.go b/pkg/messagepool/pruning.go index 373f715584..53cd51b4e2 100644 --- a/pkg/messagepool/pruning.go +++ b/pkg/messagepool/pruning.go @@ -6,7 +6,7 @@ import ( "time" "github.com/filecoin-project/go-address" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" "golang.org/x/xerrors" ) diff --git a/pkg/messagepool/repub.go b/pkg/messagepool/repub.go index 2d577bcd8e..ab35c9a6a0 100644 --- a/pkg/messagepool/repub.go +++ b/pkg/messagepool/repub.go @@ -13,7 +13,7 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/messagepool/gasguess" "github.com/filecoin-project/venus/pkg/net/msgsub" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) const repubMsgLimit = 30 diff --git a/pkg/messagepool/selection.go b/pkg/messagepool/selection.go index 52ea248eed..4d33707dcb 100644 --- a/pkg/messagepool/selection.go +++ b/pkg/messagepool/selection.go @@ -16,7 +16,7 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/messagepool/gasguess" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var bigBlockGasLimit = big.NewInt(constants.BlockGasLimit) diff --git a/pkg/messagepool/selection_test.go b/pkg/messagepool/selection_test.go index dccda26322..49e9a3b830 100644 --- a/pkg/messagepool/selection_test.go +++ b/pkg/messagepool/selection_test.go @@ -27,12 +27,10 @@ import ( "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/constants" + _ "github.com/filecoin-project/venus/pkg/crypto/secp" "github.com/filecoin-project/venus/pkg/messagepool/gasguess" "github.com/filecoin-project/venus/pkg/wallet" - types "github.com/filecoin-project/venus/venus-shared/chain" - mtypes "github.com/filecoin-project/venus/venus-shared/wallet" - - _ "github.com/filecoin-project/venus/pkg/crypto/secp" + "github.com/filecoin-project/venus/venus-shared/types" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" ) @@ -57,7 +55,7 @@ func makeTestMessage(w *wallet.Wallet, from, to address.Address, nonce uint64, g } c := msg.Cid() - sig, err := w.WalletSign(context.Background(), from, c.Bytes(), mtypes.MsgMeta{}) + sig, err := w.WalletSign(context.Background(), from, c.Bytes(), types.MsgMeta{}) if err != nil { panic(err) } @@ -1509,7 +1507,7 @@ readLoop: m.Message.Nonce -= baseNonce c := m.Message.Cid() - sig, err := w.WalletSign(context.Background(), localActor, c.Bytes(), mtypes.MsgMeta{}) + sig, err := w.WalletSign(context.Background(), localActor, c.Bytes(), types.MsgMeta{}) if err != nil { t.Fatal(err) } diff --git a/pkg/metrics/heartbeat.go b/pkg/metrics/heartbeat.go index 96425943ec..334a92b4f4 100644 --- a/pkg/metrics/heartbeat.go +++ b/pkg/metrics/heartbeat.go @@ -19,7 +19,7 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/pkg/config" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // HeartbeatProtocol is the libp2p protocol used for the heartbeat service diff --git a/pkg/metrics/heartbeat_test.go b/pkg/metrics/heartbeat_test.go index 091b72a781..ddebb4764e 100644 --- a/pkg/metrics/heartbeat_test.go +++ b/pkg/metrics/heartbeat_test.go @@ -9,7 +9,7 @@ import ( "github.com/filecoin-project/venus/pkg/testhelpers" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-state-types/abi" "github.com/stretchr/testify/assert" diff --git a/pkg/net/blocksub/validator.go b/pkg/net/blocksub/validator.go index 0107b06c40..b17da00590 100644 --- a/pkg/net/blocksub/validator.go +++ b/pkg/net/blocksub/validator.go @@ -9,7 +9,7 @@ import ( pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/filecoin-project/venus/pkg/metrics" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var blockTopicLogger = log.Logger("net/block_validator") diff --git a/pkg/net/blocksub/validator_test.go b/pkg/net/blocksub/validator_test.go index 8d898972ad..73c55f39ee 100644 --- a/pkg/net/blocksub/validator_test.go +++ b/pkg/net/blocksub/validator_test.go @@ -16,7 +16,7 @@ import ( "github.com/filecoin-project/venus/pkg/net/blocksub" th "github.com/filecoin-project/venus/pkg/testhelpers" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) func TestBlockTopicValidator(t *testing.T) { diff --git a/pkg/net/msgsub/validator.go b/pkg/net/msgsub/validator.go index f8e42f8d44..2bd8db022c 100644 --- a/pkg/net/msgsub/validator.go +++ b/pkg/net/msgsub/validator.go @@ -10,7 +10,7 @@ import ( "github.com/filecoin-project/venus/pkg/consensus" "github.com/filecoin-project/venus/pkg/metrics" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var messageTopicLogger = logging.Logger("net/message_validator") diff --git a/pkg/net/network.go b/pkg/net/network.go index 38d1cc3486..4fafdf0645 100644 --- a/pkg/net/network.go +++ b/pkg/net/network.go @@ -6,14 +6,14 @@ import ( "sort" "sync" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/peer" swarm "github.com/libp2p/go-libp2p-swarm" ma "github.com/multiformats/go-multiaddr" "github.com/pkg/errors" - - "github.com/filecoin-project/venus/venus-shared/libp2p/net" ) // Network is a unified interface for dealing with libp2p @@ -52,8 +52,8 @@ func (network *Network) GetBandwidthStats() metrics.Stats { } // Connect connects to peers at the given addresses. Does not retry. -func (network *Network) Connect(ctx context.Context, addrs []string) (<-chan net.ConnectionResult, error) { - outCh := make(chan net.ConnectionResult) +func (network *Network) Connect(ctx context.Context, addrs []string) (<-chan types.ConnectionResult, error) { + outCh := make(chan types.ConnectionResult) swrm, ok := network.host.Network().(*swarm.Swarm) if !ok { @@ -73,7 +73,7 @@ func (network *Network) Connect(ctx context.Context, addrs []string) (<-chan net go func(pi peer.AddrInfo) { swrm.Backoff().Clear(pi.ID) err := network.host.Connect(ctx, pi) - outCh <- net.ConnectionResult{ + outCh <- types.ConnectionResult{ PeerID: pi.ID, Err: err, } @@ -89,21 +89,21 @@ func (network *Network) Connect(ctx context.Context, addrs []string) (<-chan net } // Peers lists peers currently available on the network -func (network *Network) Peers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) { +func (network *Network) Peers(ctx context.Context, verbose, latency, streams bool) (*types.SwarmConnInfos, error) { if network.host == nil { return nil, errors.New("node must be online") } conns := network.host.Network().Conns() - out := net.SwarmConnInfos{ - Peers: []net.SwarmConnInfo{}, + out := types.SwarmConnInfos{ + Peers: []types.SwarmConnInfo{}, } for _, c := range conns { pid := c.RemotePeer() addr := c.RemoteMultiaddr() - ci := net.SwarmConnInfo{ + ci := types.SwarmConnInfo{ Addr: addr.String(), Peer: pid.Pretty(), } @@ -120,7 +120,7 @@ func (network *Network) Peers(ctx context.Context, verbose, latency, streams boo strs := c.GetStreams() for _, s := range strs { - ci.Streams = append(ci.Streams, net.SwarmStreamInfo{Protocol: string(s.Protocol())}) + ci.Streams = append(ci.Streams, types.SwarmStreamInfo{Protocol: string(s.Protocol())}) } } sort.Sort(&ci) diff --git a/pkg/paychmgr/manager.go b/pkg/paychmgr/manager.go index 64dcd620f1..5afb50a574 100644 --- a/pkg/paychmgr/manager.go +++ b/pkg/paychmgr/manager.go @@ -5,12 +5,9 @@ import ( "errors" "sync" - "github.com/filecoin-project/venus/pkg/statemanger" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" - paychtypes "github.com/filecoin-project/venus/venus-shared/paych" - "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/pkg/statemanger" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" logging "github.com/ipfs/go-log/v2" @@ -102,7 +99,7 @@ func (pm *Manager) GetPaych(ctx context.Context, from, to address.Address, amt b return chanAccessor.getPaych(ctx, amt) } -func (pm *Manager) AvailableFunds(ctx context.Context, ch address.Address) (*apitypes.ChannelAvailableFunds, error) { +func (pm *Manager) AvailableFunds(ctx context.Context, ch address.Address) (*types.ChannelAvailableFunds, error) { ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return nil, err @@ -116,7 +113,7 @@ func (pm *Manager) AvailableFunds(ctx context.Context, ch address.Address) (*api return ca.availableFunds(ctx, ci.ChannelID) } -func (pm *Manager) AvailableFundsByFromTo(ctx context.Context, from address.Address, to address.Address) (*apitypes.ChannelAvailableFunds, error) { +func (pm *Manager) AvailableFundsByFromTo(ctx context.Context, from address.Address, to address.Address) (*types.ChannelAvailableFunds, error) { ca, err := pm.accessorByFromTo(from, to) if err != nil { return nil, err @@ -128,7 +125,7 @@ func (pm *Manager) AvailableFundsByFromTo(ctx context.Context, from address.Addr // return an empty ChannelAvailableFunds, so that clients can check // for the existence of a channel between from / to without getting // an error. - return &apitypes.ChannelAvailableFunds{ + return &types.ChannelAvailableFunds{ Channel: nil, From: from, To: to, @@ -187,7 +184,7 @@ func (pm *Manager) GetChannelInfo(ctx context.Context, addr address.Address) (*C return ca.getChannelInfo(ctx, addr) } -func (pm *Manager) CreateVoucher(ctx context.Context, ch address.Address, voucher paych.SignedVoucher) (*paychtypes.VoucherCreateResult, error) { +func (pm *Manager) CreateVoucher(ctx context.Context, ch address.Address, voucher paych.SignedVoucher) (*types.VoucherCreateResult, error) { ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return nil, err diff --git a/pkg/paychmgr/mock_test.go b/pkg/paychmgr/mock_test.go index 0c765f252d..ee0cf5f577 100644 --- a/pkg/paychmgr/mock_test.go +++ b/pkg/paychmgr/mock_test.go @@ -7,8 +7,7 @@ import ( crypto2 "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/vm" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" @@ -140,7 +139,7 @@ func newMockPaychAPI() *mockPaychAPI { } } -func (pchapi *mockPaychAPI) StateWaitMsg(ctx context.Context, mcid cid.Cid, confidence uint64) (*apitypes.MsgLookup, error) { +func (pchapi *mockPaychAPI) StateWaitMsg(ctx context.Context, mcid cid.Cid, confidence uint64) (*types.MsgLookup, error) { pchapi.lk.Lock() response := make(chan types.MessageReceipt) @@ -151,14 +150,14 @@ func (pchapi *mockPaychAPI) StateWaitMsg(ctx context.Context, mcid cid.Cid, conf }() delete(pchapi.waitingResponses, mcid) - return &apitypes.MsgLookup{Receipt: response.receipt}, nil + return &types.MsgLookup{Receipt: response.receipt}, nil } pchapi.waitingCalls[mcid] = &waitingCall{response: response} pchapi.lk.Unlock() receipt := <-response - return &apitypes.MsgLookup{Receipt: receipt}, nil + return &types.MsgLookup{Receipt: receipt}, nil } func (pchapi *mockPaychAPI) receiveMsgResponse(mcid cid.Cid, receipt types.MessageReceipt) { @@ -195,7 +194,7 @@ func (pchapi *mockPaychAPI) close() { } } -func (pchapi *mockPaychAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec) (*types.SignedMessage, error) { +func (pchapi *mockPaychAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec) (*types.SignedMessage, error) { pchapi.lk.Lock() defer pchapi.lk.Unlock() diff --git a/pkg/paychmgr/paych.go b/pkg/paychmgr/paych.go index 74430ca3f8..699e8f61f1 100644 --- a/pkg/paychmgr/paych.go +++ b/pkg/paychmgr/paych.go @@ -5,9 +5,7 @@ import ( "fmt" "github.com/filecoin-project/venus/pkg/crypto" - types "github.com/filecoin-project/venus/venus-shared/chain" - paychtypes "github.com/filecoin-project/venus/venus-shared/paych" - + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" "golang.org/x/xerrors" @@ -114,7 +112,7 @@ func (ca *channelAccessor) outboundActiveByFromTo(ctx context.Context, from, to // nonce, signing the voucher and storing it in the local datastore. // If there are not enough funds in the channel to create the voucher, returns // the shortfall in funds. -func (ca *channelAccessor) createVoucher(ctx context.Context, ch address.Address, voucher paych.SignedVoucher) (*paychtypes.VoucherCreateResult, error) { +func (ca *channelAccessor) createVoucher(ctx context.Context, ch address.Address, voucher paych.SignedVoucher) (*types.VoucherCreateResult, error) { ca.lk.Lock() defer ca.lk.Unlock() @@ -149,7 +147,7 @@ func (ca *channelAccessor) createVoucher(ctx context.Context, ch address.Address // return a voucher create result with the shortfall var ife insufficientFundsErr if xerrors.As(err, &ife) { - return &paychtypes.VoucherCreateResult{ + return &types.VoucherCreateResult{ Shortfall: ife.Shortfall(), }, nil } @@ -157,7 +155,7 @@ func (ca *channelAccessor) createVoucher(ctx context.Context, ch address.Address return nil, xerrors.Errorf("failed to persist voucher: %w", err) } - return &paychtypes.VoucherCreateResult{Voucher: sv, Shortfall: big.NewInt(0)}, nil + return &types.VoucherCreateResult{Voucher: sv, Shortfall: big.NewInt(0)}, nil } func (ca *channelAccessor) nextNonceForLane(ci *ChannelInfo, lane uint64) uint64 { diff --git a/pkg/paychmgr/paych_test.go b/pkg/paychmgr/paych_test.go index fb690ab891..1129d71df0 100644 --- a/pkg/paychmgr/paych_test.go +++ b/pkg/paychmgr/paych_test.go @@ -8,7 +8,7 @@ import ( crypto2 "github.com/filecoin-project/venus/pkg/crypto" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" "github.com/filecoin-project/venus/pkg/vm" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" diff --git a/pkg/paychmgr/paychget_test.go b/pkg/paychmgr/paychget_test.go index 51ecdab7c1..eac453d8fb 100644 --- a/pkg/paychmgr/paychget_test.go +++ b/pkg/paychmgr/paychget_test.go @@ -7,7 +7,7 @@ import ( "time" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" cborrpc "github.com/filecoin-project/go-cbor-util" "github.com/ipfs/go-cid" diff --git a/pkg/paychmgr/paychvoucherfunds_test.go b/pkg/paychmgr/paychvoucherfunds_test.go index 1dbcb9478d..e92ed85e4a 100644 --- a/pkg/paychmgr/paychvoucherfunds_test.go +++ b/pkg/paychmgr/paychvoucherfunds_test.go @@ -5,7 +5,7 @@ import ( "testing" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" diff --git a/pkg/paychmgr/pcapi.go b/pkg/paychmgr/pcapi.go index 96bad8a6a7..a601d7969e 100644 --- a/pkg/paychmgr/pcapi.go +++ b/pkg/paychmgr/pcapi.go @@ -10,34 +10,32 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/crypto" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" - wallettypes "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/filecoin-project/venus/venus-shared/types" ) // paychDependencyAPI defines the API methods needed by the payment channel manager type paychDependencyAPI interface { StateAccountKey(context.Context, address.Address, types.TipSetKey) (address.Address, error) - StateWaitMsg(ctx context.Context, msg cid.Cid, confidence uint64) (*apitypes.MsgLookup, error) + StateWaitMsg(ctx context.Context, msg cid.Cid, confidence uint64) (*types.MsgLookup, error) WalletHas(ctx context.Context, addr address.Address) (bool, error) WalletSign(ctx context.Context, k address.Address, msg []byte) (*crypto.Signature, error) StateNetworkVersion(context.Context, types.TipSetKey) (network.Version, error) - MpoolPushMessage(ctx context.Context, msg *types.Message, maxFee *apitypes.MessageSendSpec) (*types.SignedMessage, error) + MpoolPushMessage(ctx context.Context, msg *types.Message, maxFee *types.MessageSendSpec) (*types.SignedMessage, error) } type IMessagePush interface { - MpoolPushMessage(ctx context.Context, msg *types.Message, spec *apitypes.MessageSendSpec) (*types.SignedMessage, error) + MpoolPushMessage(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec) (*types.SignedMessage, error) } type IChainInfo interface { StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) - StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) + StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) } type IWalletAPI interface { WalletHas(ctx context.Context, addr address.Address) (bool, error) - WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallettypes.MsgMeta) (*crypto.Signature, error) + WalletSign(ctx context.Context, k address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) } type pcAPI struct { mpAPI IMessagePush @@ -52,17 +50,17 @@ func newPaychDependencyAPI(mpAPI IMessagePush, c IChainInfo, w IWalletAPI) paych func (o *pcAPI) StateAccountKey(ctx context.Context, address address.Address, tsk types.TipSetKey) (address.Address, error) { return o.chainInfoAPI.StateAccountKey(ctx, address, tsk) } -func (o *pcAPI) StateWaitMsg(ctx context.Context, msg cid.Cid, confidence uint64) (*apitypes.MsgLookup, error) { +func (o *pcAPI) StateWaitMsg(ctx context.Context, msg cid.Cid, confidence uint64) (*types.MsgLookup, error) { return o.chainInfoAPI.StateWaitMsg(ctx, msg, confidence, constants.LookbackNoLimit, true) } -func (o *pcAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, maxFee *apitypes.MessageSendSpec) (*types.SignedMessage, error) { +func (o *pcAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, maxFee *types.MessageSendSpec) (*types.SignedMessage, error) { return o.mpAPI.MpoolPushMessage(ctx, msg, maxFee) } func (o *pcAPI) WalletHas(ctx context.Context, addr address.Address) (bool, error) { return o.walletAPI.WalletHas(ctx, addr) } func (o *pcAPI) WalletSign(ctx context.Context, k address.Address, msg []byte) (*crypto.Signature, error) { - return o.walletAPI.WalletSign(ctx, k, msg, wallettypes.MsgMeta{Type: wallettypes.MTSignedVoucher}) + return o.walletAPI.WalletSign(ctx, k, msg, types.MsgMeta{Type: types.MTSignedVoucher}) } func (o *pcAPI) StateNetworkVersion(ctx context.Context, ts types.TipSetKey) (network.Version, error) { return o.chainInfoAPI.StateNetworkVersion(ctx, ts) diff --git a/pkg/paychmgr/settler/settler.go b/pkg/paychmgr/settler/settler.go index 8e0eb74064..73dbf4b8a2 100644 --- a/pkg/paychmgr/settler/settler.go +++ b/pkg/paychmgr/settler/settler.go @@ -6,10 +6,8 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/events" - types "github.com/filecoin-project/venus/venus-shared/chain" - paychtypes "github.com/filecoin-project/venus/venus-shared/paych" - "github.com/filecoin-project/venus/pkg/paychmgr" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" @@ -98,7 +96,7 @@ func (pcs *paymentChannelSettler) matcher(msg *types.Message) (matched bool, err if err != nil { return false, err } - if status.Direction == paychtypes.PCHInbound { + if status.Direction == types.PCHInbound { return true, nil } } diff --git a/pkg/paychmgr/settler/stl.go b/pkg/paychmgr/settler/stl.go index ce37d4e547..df9074a534 100644 --- a/pkg/paychmgr/settler/stl.go +++ b/pkg/paychmgr/settler/stl.go @@ -3,8 +3,7 @@ package settler import ( "context" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - paychtypes "github.com/filecoin-project/venus/venus-shared/paych" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" @@ -15,11 +14,11 @@ import ( type Settler interface { PaychList(context.Context) ([]address.Address, error) - PaychStatus(ctx context.Context, pch address.Address) (*paychtypes.Status, error) + PaychStatus(ctx context.Context, pch address.Address) (*types.Status, error) PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (bool, error) PaychVoucherList(context.Context, address.Address) ([]*paych.SignedVoucher, error) PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) - StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) + StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) } type settler struct { @@ -35,14 +34,14 @@ func (o *settler) PaychList(ctx context.Context) ([]address.Address, error) { return o.mgr.ListChannels(ctx) } -func (o *settler) PaychStatus(ctx context.Context, pch address.Address) (*paychtypes.Status, error) { +func (o *settler) PaychStatus(ctx context.Context, pch address.Address) (*types.Status, error) { ci, err := o.mgr.GetChannelInfo(ctx, pch) if err != nil { return nil, err } - return &paychtypes.Status{ + return &types.Status{ ControlAddr: ci.Control, - Direction: paychtypes.PCHDir(ci.Direction), + Direction: types.PCHDir(ci.Direction), }, nil } func (o *settler) PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (bool, error) { @@ -63,6 +62,6 @@ func (o *settler) PaychVoucherList(ctx context.Context, pch address.Address) ([] func (o *settler) PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) { return o.mgr.SubmitVoucher(ctx, ch, sv, secret, proof) } -func (o *settler) StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*apitypes.MsgLookup, error) { +func (o *settler) StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) { return o.ciAPI.StateWaitMsg(ctx, cid, confidence, lookbackLimit, allowReplaced) } diff --git a/pkg/paychmgr/simple.go b/pkg/paychmgr/simple.go index ef1e9433c1..9c136530cc 100644 --- a/pkg/paychmgr/simple.go +++ b/pkg/paychmgr/simple.go @@ -16,8 +16,7 @@ import ( init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" "github.com/filecoin-project/venus/pkg/constants" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // paychFundsRes is the response to a create channel or add funds request @@ -180,7 +179,7 @@ func (ca *channelAccessor) enqueue(ctx context.Context, task *fundsReq) { } // Run the operations in the queue -func (ca *channelAccessor) processQueue(ctx context.Context, channelID string) (*apitypes.ChannelAvailableFunds, error) { +func (ca *channelAccessor) processQueue(ctx context.Context, channelID string) (*types.ChannelAvailableFunds, error) { ca.lk.Lock() defer ca.lk.Unlock() @@ -276,7 +275,7 @@ func (ca *channelAccessor) msgWaitComplete(ctx context.Context, mcid cid.Cid, er } } -func (ca *channelAccessor) currentAvailableFunds(ctx context.Context, channelID string, queuedAmt big.Int) (*apitypes.ChannelAvailableFunds, error) { +func (ca *channelAccessor) currentAvailableFunds(ctx context.Context, channelID string, queuedAmt big.Int) (*types.ChannelAvailableFunds, error) { if len(channelID) == 0 { return nil, nil } @@ -317,7 +316,7 @@ func (ca *channelAccessor) currentAvailableFunds(ctx context.Context, channelID } } - return &apitypes.ChannelAvailableFunds{ + return &types.ChannelAvailableFunds{ Channel: channelInfo.Channel, From: channelInfo.from(), To: channelInfo.to(), @@ -687,6 +686,6 @@ func (ca *channelAccessor) msgPromise(ctx context.Context, mcid cid.Cid) chan on return promise } -func (ca *channelAccessor) availableFunds(ctx context.Context, channelID string) (*apitypes.ChannelAvailableFunds, error) { +func (ca *channelAccessor) availableFunds(ctx context.Context, channelID string) (*types.ChannelAvailableFunds, error) { return ca.processQueue(ctx, channelID) } diff --git a/pkg/paychmgr/state.go b/pkg/paychmgr/state.go index e770595259..e4d367b1b2 100644 --- a/pkg/paychmgr/state.go +++ b/pkg/paychmgr/state.go @@ -4,7 +4,7 @@ import ( "context" "github.com/filecoin-project/venus/pkg/statemanger" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-address" diff --git a/pkg/state/power_table_view_test.go b/pkg/state/power_table_view_test.go index 2be1b96bc8..5b424516ce 100644 --- a/pkg/state/power_table_view_test.go +++ b/pkg/state/power_table_view_test.go @@ -21,7 +21,7 @@ import ( "github.com/filecoin-project/venus/pkg/state" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" gengen "github.com/filecoin-project/venus/tools/gengen/util" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) func TestTotal(t *testing.T) { diff --git a/pkg/state/signer.go b/pkg/state/signer.go index 882e65b728..b6a6a3dff4 100644 --- a/pkg/state/signer.go +++ b/pkg/state/signer.go @@ -6,7 +6,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/wallet" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) //todo remove Account view a nd headsignerview diff --git a/pkg/state/sigval.go b/pkg/state/sigval.go index dc2e32b5cc..8c3bb8191a 100644 --- a/pkg/state/sigval.go +++ b/pkg/state/sigval.go @@ -7,7 +7,7 @@ import ( "github.com/pkg/errors" "github.com/filecoin-project/venus/pkg/crypto" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // diff --git a/pkg/state/sigval_test.go b/pkg/state/sigval_test.go index e3ad14158b..963792c1c3 100644 --- a/pkg/state/sigval_test.go +++ b/pkg/state/sigval_test.go @@ -9,7 +9,7 @@ import ( "github.com/filecoin-project/venus/pkg/testhelpers" "github.com/filecoin-project/venus/pkg/state" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-address" "github.com/filecoin-project/specs-actors/actors/builtin" diff --git a/pkg/state/tree/snapshot.go b/pkg/state/tree/snapshot.go index 152c2c9c5c..de79f76d03 100644 --- a/pkg/state/tree/snapshot.go +++ b/pkg/state/tree/snapshot.go @@ -2,7 +2,7 @@ package tree import ( "github.com/filecoin-project/go-address" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type stateSnaps struct { diff --git a/pkg/state/tree/state.go b/pkg/state/tree/state.go index 3e324b48d6..8b7994d398 100644 --- a/pkg/state/tree/state.go +++ b/pkg/state/tree/state.go @@ -24,7 +24,7 @@ import ( states5 "github.com/filecoin-project/specs-actors/v5/actors/states" "github.com/filecoin-project/venus/venus-shared/actors/adt" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type StateTreeVersion uint64 //nolint diff --git a/pkg/state/tree/state_test.go b/pkg/state/tree/state_test.go index 936822a81e..a5188d431d 100644 --- a/pkg/state/tree/state_test.go +++ b/pkg/state/tree/state_test.go @@ -16,7 +16,7 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/repo" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) func TestStatePutGet(t *testing.T) { diff --git a/pkg/state/tree/testing.go b/pkg/state/tree/testing.go index 84d4826955..ab821ae5d1 100644 --- a/pkg/state/tree/testing.go +++ b/pkg/state/tree/testing.go @@ -9,7 +9,7 @@ import ( "github.com/filecoin-project/specs-actors/actors/builtin/account" init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" "github.com/filecoin-project/specs-actors/actors/util/adt" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" diff --git a/pkg/state/view.go b/pkg/state/view.go index 8947f59800..69fd9280f2 100644 --- a/pkg/state/view.go +++ b/pkg/state/view.go @@ -4,8 +4,7 @@ import ( "context" "strconv" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/dline" @@ -404,7 +403,7 @@ func (v *View) StateVerifiedClientStatus(ctx context.Context, addr addr.Address) } // StateMarketStorageDeal returns information about the indicated deal -func (v *View) StateMarketStorageDeal(ctx context.Context, dealID abi.DealID) (*apitypes.MarketDeal, error) { +func (v *View) StateMarketStorageDeal(ctx context.Context, dealID abi.DealID) (*types.MarketDeal, error) { state, err := v.LoadMarketState(ctx) if err != nil { return nil, err @@ -438,7 +437,7 @@ func (v *View) StateMarketStorageDeal(ctx context.Context, dealID abi.DealID) (* return nil, xerrors.New("deal state not found") } - return &apitypes.MarketDeal{ + return &types.MarketDeal{ Proposal: *dealProposal, State: *dealState, }, nil @@ -621,8 +620,8 @@ func (v *View) StateMinerPower(ctx context.Context, maddr addr.Address, tsk type } // StateMarketDeals returns information about every deal in the Storage Market -func (v *View) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]apitypes.MarketDeal, error) { - out := map[string]apitypes.MarketDeal{} +func (v *View) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) { + out := map[string]types.MarketDeal{} state, err := v.LoadMarketState(ctx) if err != nil { @@ -646,7 +645,7 @@ func (v *View) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[s } else if !found { s = market.EmptyDealState() } - out[strconv.FormatInt(int64(dealID), 10)] = apitypes.MarketDeal{ + out[strconv.FormatInt(int64(dealID), 10)] = types.MarketDeal{ Proposal: d, State: *s, } diff --git a/pkg/statemanger/call.go b/pkg/statemanger/call.go index 24851d44d5..ae83218225 100644 --- a/pkg/statemanger/call.go +++ b/pkg/statemanger/call.go @@ -7,7 +7,7 @@ import ( "github.com/filecoin-project/venus/pkg/consensus" "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/vm/vmcontext" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" diff --git a/pkg/statemanger/state_manger.go b/pkg/statemanger/state_manger.go index c8e7b2f0bc..6a7b6b0663 100644 --- a/pkg/statemanger/state_manger.go +++ b/pkg/statemanger/state_manger.go @@ -16,7 +16,7 @@ import ( "github.com/filecoin-project/venus/pkg/vm/gas" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" "go.opencensus.io/trace" diff --git a/pkg/testhelpers/cid.go b/pkg/testhelpers/cid.go index 5af7ca0203..f1d1159733 100644 --- a/pkg/testhelpers/cid.go +++ b/pkg/testhelpers/cid.go @@ -13,7 +13,7 @@ import ( "github.com/filecoin-project/specs-actors/actors/util/adt" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // EmptyMessagesCID is the cid of an empty collection of messages. diff --git a/pkg/testhelpers/consensus.go b/pkg/testhelpers/consensus.go index 243ca54f17..082de7d688 100644 --- a/pkg/testhelpers/consensus.go +++ b/pkg/testhelpers/consensus.go @@ -5,7 +5,7 @@ import ( pubsub "github.com/libp2p/go-libp2p-pubsub" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ) diff --git a/pkg/testhelpers/core.go b/pkg/testhelpers/core.go index 4811048d78..e725ba2064 100644 --- a/pkg/testhelpers/core.go +++ b/pkg/testhelpers/core.go @@ -14,7 +14,7 @@ import ( "github.com/libp2p/go-libp2p-core/peer" "github.com/stretchr/testify/require" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // RequireMakeStateTree takes a map of addresses to actors and stores them on diff --git a/pkg/testhelpers/message.go b/pkg/testhelpers/message.go index f11fc860c1..4c83fb02bc 100644 --- a/pkg/testhelpers/message.go +++ b/pkg/testhelpers/message.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/constants" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" ) diff --git a/pkg/testhelpers/net.go b/pkg/testhelpers/net.go index df376d124f..ee863e1ab3 100644 --- a/pkg/testhelpers/net.go +++ b/pkg/testhelpers/net.go @@ -9,7 +9,7 @@ import ( "time" "github.com/filecoin-project/venus/pkg/chainsync/exchange" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/connmgr" "github.com/libp2p/go-libp2p-core/event" diff --git a/pkg/testhelpers/test_daemon.go b/pkg/testhelpers/test_daemon.go index d741e01c36..749aaccd4f 100644 --- a/pkg/testhelpers/test_daemon.go +++ b/pkg/testhelpers/test_daemon.go @@ -30,7 +30,7 @@ import ( "github.com/filecoin-project/venus/build/project" "github.com/filecoin-project/venus/pkg/config" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) const ( diff --git a/pkg/testhelpers/tipset.go b/pkg/testhelpers/tipset.go index 7518420d18..040ced2f94 100644 --- a/pkg/testhelpers/tipset.go +++ b/pkg/testhelpers/tipset.go @@ -3,7 +3,7 @@ package testhelpers import ( "testing" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/stretchr/testify/require" ) diff --git a/pkg/types/specactors/builtin/account/account.go b/pkg/types/specactors/builtin/account/account.go index 1f42a62721..fe24a8aa5c 100644 --- a/pkg/types/specactors/builtin/account/account.go +++ b/pkg/types/specactors/builtin/account/account.go @@ -10,9 +10,9 @@ import ( "github.com/filecoin-project/go-state-types/cbor" "github.com/ipfs/go-cid" + types "github.com/filecoin-project/venus/pkg/types/internal" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - types "github.com/filecoin-project/venus/pkg/types/internal" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -27,7 +27,6 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - ) func init() { @@ -115,7 +114,7 @@ func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, case actors.Version7: return make7(store, addr) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/pkg/types/specactors/builtin/account/v0.go b/pkg/types/specactors/builtin/account/v0.go index aef9d0a802..b5e760d805 100644 --- a/pkg/types/specactors/builtin/account/v0.go +++ b/pkg/types/specactors/builtin/account/v0.go @@ -24,7 +24,7 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store, addr address.Address) (State, error) { out := state0{store: store} - out.State = account0.State{Address:addr} + out.State = account0.State{Address: addr} return &out, nil } @@ -39,4 +39,4 @@ func (s *state0) PubkeyAddress() (address.Address, error) { func (s *state0) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/account/v2.go b/pkg/types/specactors/builtin/account/v2.go index 1ac1633fb0..f3694d1662 100644 --- a/pkg/types/specactors/builtin/account/v2.go +++ b/pkg/types/specactors/builtin/account/v2.go @@ -24,7 +24,7 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store, addr address.Address) (State, error) { out := state2{store: store} - out.State = account2.State{Address:addr} + out.State = account2.State{Address: addr} return &out, nil } @@ -39,4 +39,4 @@ func (s *state2) PubkeyAddress() (address.Address, error) { func (s *state2) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/account/v3.go b/pkg/types/specactors/builtin/account/v3.go index 557c9a3b4b..c30dcc85f7 100644 --- a/pkg/types/specactors/builtin/account/v3.go +++ b/pkg/types/specactors/builtin/account/v3.go @@ -24,7 +24,7 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store, addr address.Address) (State, error) { out := state3{store: store} - out.State = account3.State{Address:addr} + out.State = account3.State{Address: addr} return &out, nil } @@ -39,4 +39,4 @@ func (s *state3) PubkeyAddress() (address.Address, error) { func (s *state3) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/account/v4.go b/pkg/types/specactors/builtin/account/v4.go index d52cb5dbad..89767f5385 100644 --- a/pkg/types/specactors/builtin/account/v4.go +++ b/pkg/types/specactors/builtin/account/v4.go @@ -24,7 +24,7 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store, addr address.Address) (State, error) { out := state4{store: store} - out.State = account4.State{Address:addr} + out.State = account4.State{Address: addr} return &out, nil } @@ -39,4 +39,4 @@ func (s *state4) PubkeyAddress() (address.Address, error) { func (s *state4) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/account/v5.go b/pkg/types/specactors/builtin/account/v5.go index 4af3320550..14f27dad43 100644 --- a/pkg/types/specactors/builtin/account/v5.go +++ b/pkg/types/specactors/builtin/account/v5.go @@ -24,7 +24,7 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store, addr address.Address) (State, error) { out := state5{store: store} - out.State = account5.State{Address:addr} + out.State = account5.State{Address: addr} return &out, nil } @@ -39,4 +39,4 @@ func (s *state5) PubkeyAddress() (address.Address, error) { func (s *state5) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/account/v6.go b/pkg/types/specactors/builtin/account/v6.go index 8a103d3b9e..0ff258cc53 100644 --- a/pkg/types/specactors/builtin/account/v6.go +++ b/pkg/types/specactors/builtin/account/v6.go @@ -24,7 +24,7 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store, addr address.Address) (State, error) { out := state6{store: store} - out.State = account6.State{Address:addr} + out.State = account6.State{Address: addr} return &out, nil } @@ -39,4 +39,4 @@ func (s *state6) PubkeyAddress() (address.Address, error) { func (s *state6) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/account/v7.go b/pkg/types/specactors/builtin/account/v7.go index 57b0aa7c57..667c8f0187 100644 --- a/pkg/types/specactors/builtin/account/v7.go +++ b/pkg/types/specactors/builtin/account/v7.go @@ -24,7 +24,7 @@ func load7(store adt.Store, root cid.Cid) (State, error) { func make7(store adt.Store, addr address.Address) (State, error) { out := state7{store: store} - out.State = account7.State{Address:addr} + out.State = account7.State{Address: addr} return &out, nil } @@ -39,4 +39,4 @@ func (s *state7) PubkeyAddress() (address.Address, error) { func (s *state7) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/builtin.go b/pkg/types/specactors/builtin/builtin.go index 91f888de05..fa0e49916b 100644 --- a/pkg/types/specactors/builtin/builtin.go +++ b/pkg/types/specactors/builtin/builtin.go @@ -7,34 +7,32 @@ import ( "github.com/ipfs/go-cid" "golang.org/x/xerrors" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - smoothing2 "github.com/filecoin-project/specs-actors/v2/actors/util/smoothing" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - smoothing3 "github.com/filecoin-project/specs-actors/v3/actors/util/smoothing" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - smoothing4 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - smoothing5 "github.com/filecoin-project/specs-actors/v5/actors/util/smoothing" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" - + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + smoothing2 "github.com/filecoin-project/specs-actors/v2/actors/util/smoothing" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + smoothing3 "github.com/filecoin-project/specs-actors/v3/actors/util/smoothing" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + smoothing4 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + smoothing5 "github.com/filecoin-project/specs-actors/v5/actors/util/smoothing" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/cbor" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" types "github.com/filecoin-project/venus/pkg/types/internal" + "github.com/filecoin-project/venus/pkg/types/specactors/adt" miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" @@ -72,49 +70,47 @@ func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, return miner7.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) } +func FromV0FilterEstimate(v0 smoothing0.FilterEstimate) FilterEstimate { - func FromV0FilterEstimate(v0 smoothing0.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v0) //nolint:unconvert - - } + return (FilterEstimate)(v0) //nolint:unconvert - func FromV2FilterEstimate(v2 smoothing2.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v2) - - } +} - func FromV3FilterEstimate(v3 smoothing3.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v3) - - } +func FromV2FilterEstimate(v2 smoothing2.FilterEstimate) FilterEstimate { - func FromV4FilterEstimate(v4 smoothing4.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v4) - - } + return (FilterEstimate)(v2) - func FromV5FilterEstimate(v5 smoothing5.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v5) - - } +} - func FromV6FilterEstimate(v6 smoothing6.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v6) - - } +func FromV3FilterEstimate(v3 smoothing3.FilterEstimate) FilterEstimate { - func FromV7FilterEstimate(v7 smoothing7.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v7) - - } + return (FilterEstimate)(v3) + +} +func FromV4FilterEstimate(v4 smoothing4.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v4) + +} + +func FromV5FilterEstimate(v5 smoothing5.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v5) + +} + +func FromV6FilterEstimate(v6 smoothing6.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v6) + +} + +func FromV7FilterEstimate(v7 smoothing7.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v7) + +} type ActorStateLoader func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) @@ -134,195 +130,195 @@ func Load(store adt.Store, act *types.Actor) (cbor.Marshaler, error) { func ActorNameByCode(c cid.Cid) string { switch { - - case builtin0.IsBuiltinActor(c): - return builtin0.ActorNameByCode(c) - - case builtin2.IsBuiltinActor(c): - return builtin2.ActorNameByCode(c) - - case builtin3.IsBuiltinActor(c): - return builtin3.ActorNameByCode(c) - - case builtin4.IsBuiltinActor(c): - return builtin4.ActorNameByCode(c) - - case builtin5.IsBuiltinActor(c): - return builtin5.ActorNameByCode(c) - - case builtin6.IsBuiltinActor(c): - return builtin6.ActorNameByCode(c) - - case builtin7.IsBuiltinActor(c): - return builtin7.ActorNameByCode(c) - + + case builtin0.IsBuiltinActor(c): + return builtin0.ActorNameByCode(c) + + case builtin2.IsBuiltinActor(c): + return builtin2.ActorNameByCode(c) + + case builtin3.IsBuiltinActor(c): + return builtin3.ActorNameByCode(c) + + case builtin4.IsBuiltinActor(c): + return builtin4.ActorNameByCode(c) + + case builtin5.IsBuiltinActor(c): + return builtin5.ActorNameByCode(c) + + case builtin6.IsBuiltinActor(c): + return builtin6.ActorNameByCode(c) + + case builtin7.IsBuiltinActor(c): + return builtin7.ActorNameByCode(c) + default: return "" } } func IsBuiltinActor(c cid.Cid) bool { - - if builtin0.IsBuiltinActor(c) { - return true - } - - if builtin2.IsBuiltinActor(c) { - return true - } - - if builtin3.IsBuiltinActor(c) { - return true - } - - if builtin4.IsBuiltinActor(c) { - return true - } - - if builtin5.IsBuiltinActor(c) { - return true - } - - if builtin6.IsBuiltinActor(c) { - return true - } - - if builtin7.IsBuiltinActor(c) { - return true - } - + + if builtin0.IsBuiltinActor(c) { + return true + } + + if builtin2.IsBuiltinActor(c) { + return true + } + + if builtin3.IsBuiltinActor(c) { + return true + } + + if builtin4.IsBuiltinActor(c) { + return true + } + + if builtin5.IsBuiltinActor(c) { + return true + } + + if builtin6.IsBuiltinActor(c) { + return true + } + + if builtin7.IsBuiltinActor(c) { + return true + } + return false } func IsAccountActor(c cid.Cid) bool { - - if c == builtin0.AccountActorCodeID { - return true - } - - if c == builtin2.AccountActorCodeID { - return true - } - - if c == builtin3.AccountActorCodeID { - return true - } - - if c == builtin4.AccountActorCodeID { - return true - } - - if c == builtin5.AccountActorCodeID { - return true - } - - if c == builtin6.AccountActorCodeID { - return true - } - - if c == builtin7.AccountActorCodeID { - return true - } - + + if c == builtin0.AccountActorCodeID { + return true + } + + if c == builtin2.AccountActorCodeID { + return true + } + + if c == builtin3.AccountActorCodeID { + return true + } + + if c == builtin4.AccountActorCodeID { + return true + } + + if c == builtin5.AccountActorCodeID { + return true + } + + if c == builtin6.AccountActorCodeID { + return true + } + + if c == builtin7.AccountActorCodeID { + return true + } + return false } func IsStorageMinerActor(c cid.Cid) bool { - - if c == builtin0.StorageMinerActorCodeID { - return true - } - - if c == builtin2.StorageMinerActorCodeID { - return true - } - - if c == builtin3.StorageMinerActorCodeID { - return true - } - - if c == builtin4.StorageMinerActorCodeID { - return true - } - - if c == builtin5.StorageMinerActorCodeID { - return true - } - - if c == builtin6.StorageMinerActorCodeID { - return true - } - - if c == builtin7.StorageMinerActorCodeID { - return true - } - + + if c == builtin0.StorageMinerActorCodeID { + return true + } + + if c == builtin2.StorageMinerActorCodeID { + return true + } + + if c == builtin3.StorageMinerActorCodeID { + return true + } + + if c == builtin4.StorageMinerActorCodeID { + return true + } + + if c == builtin5.StorageMinerActorCodeID { + return true + } + + if c == builtin6.StorageMinerActorCodeID { + return true + } + + if c == builtin7.StorageMinerActorCodeID { + return true + } + return false } func IsMultisigActor(c cid.Cid) bool { - - if c == builtin0.MultisigActorCodeID { - return true - } - - if c == builtin2.MultisigActorCodeID { - return true - } - - if c == builtin3.MultisigActorCodeID { - return true - } - - if c == builtin4.MultisigActorCodeID { - return true - } - - if c == builtin5.MultisigActorCodeID { - return true - } - - if c == builtin6.MultisigActorCodeID { - return true - } - - if c == builtin7.MultisigActorCodeID { - return true - } - + + if c == builtin0.MultisigActorCodeID { + return true + } + + if c == builtin2.MultisigActorCodeID { + return true + } + + if c == builtin3.MultisigActorCodeID { + return true + } + + if c == builtin4.MultisigActorCodeID { + return true + } + + if c == builtin5.MultisigActorCodeID { + return true + } + + if c == builtin6.MultisigActorCodeID { + return true + } + + if c == builtin7.MultisigActorCodeID { + return true + } + return false } func IsPaymentChannelActor(c cid.Cid) bool { - - if c == builtin0.PaymentChannelActorCodeID { - return true - } - - if c == builtin2.PaymentChannelActorCodeID { - return true - } - - if c == builtin3.PaymentChannelActorCodeID { - return true - } - - if c == builtin4.PaymentChannelActorCodeID { - return true - } - - if c == builtin5.PaymentChannelActorCodeID { - return true - } - - if c == builtin6.PaymentChannelActorCodeID { - return true - } - - if c == builtin7.PaymentChannelActorCodeID { - return true - } - + + if c == builtin0.PaymentChannelActorCodeID { + return true + } + + if c == builtin2.PaymentChannelActorCodeID { + return true + } + + if c == builtin3.PaymentChannelActorCodeID { + return true + } + + if c == builtin4.PaymentChannelActorCodeID { + return true + } + + if c == builtin5.PaymentChannelActorCodeID { + return true + } + + if c == builtin6.PaymentChannelActorCodeID { + return true + } + + if c == builtin7.PaymentChannelActorCodeID { + return true + } + return false } diff --git a/pkg/types/specactors/builtin/cron/cron.go b/pkg/types/specactors/builtin/cron/cron.go index 277152dd69..3f44ac994d 100644 --- a/pkg/types/specactors/builtin/cron/cron.go +++ b/pkg/types/specactors/builtin/cron/cron.go @@ -5,8 +5,8 @@ package cron import ( actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "golang.org/x/xerrors" "github.com/ipfs/go-cid" + "golang.org/x/xerrors" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -21,7 +21,6 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - ) func MakeState(store adt.Store, av actors.Version) (State, error) { @@ -48,7 +47,7 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version7: return make7(store) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -86,7 +85,6 @@ var ( Methods = builtin7.MethodsCron ) - type State interface { GetState() interface{} } diff --git a/pkg/types/specactors/builtin/cron/v0.go b/pkg/types/specactors/builtin/cron/v0.go index 4029ab15da..4b3cb07771 100644 --- a/pkg/types/specactors/builtin/cron/v0.go +++ b/pkg/types/specactors/builtin/cron/v0.go @@ -34,4 +34,4 @@ type state0 struct { func (s *state0) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/cron/v2.go b/pkg/types/specactors/builtin/cron/v2.go index 4a54b18506..db837da49a 100644 --- a/pkg/types/specactors/builtin/cron/v2.go +++ b/pkg/types/specactors/builtin/cron/v2.go @@ -34,4 +34,4 @@ type state2 struct { func (s *state2) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/cron/v3.go b/pkg/types/specactors/builtin/cron/v3.go index 799dec7e5f..28060e8e51 100644 --- a/pkg/types/specactors/builtin/cron/v3.go +++ b/pkg/types/specactors/builtin/cron/v3.go @@ -34,4 +34,4 @@ type state3 struct { func (s *state3) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/cron/v4.go b/pkg/types/specactors/builtin/cron/v4.go index 3e58e275d9..2d1eb49e48 100644 --- a/pkg/types/specactors/builtin/cron/v4.go +++ b/pkg/types/specactors/builtin/cron/v4.go @@ -34,4 +34,4 @@ type state4 struct { func (s *state4) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/cron/v5.go b/pkg/types/specactors/builtin/cron/v5.go index 0ba27a6e7a..be519e6b51 100644 --- a/pkg/types/specactors/builtin/cron/v5.go +++ b/pkg/types/specactors/builtin/cron/v5.go @@ -34,4 +34,4 @@ type state5 struct { func (s *state5) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/cron/v6.go b/pkg/types/specactors/builtin/cron/v6.go index 87c7e59195..aafcc78b20 100644 --- a/pkg/types/specactors/builtin/cron/v6.go +++ b/pkg/types/specactors/builtin/cron/v6.go @@ -34,4 +34,4 @@ type state6 struct { func (s *state6) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/cron/v7.go b/pkg/types/specactors/builtin/cron/v7.go index 35bbab5a96..284ff62350 100644 --- a/pkg/types/specactors/builtin/cron/v7.go +++ b/pkg/types/specactors/builtin/cron/v7.go @@ -34,4 +34,4 @@ type state7 struct { func (s *state7) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/init/init.go b/pkg/types/specactors/builtin/init/init.go index f59355f5a9..3cf84a8219 100644 --- a/pkg/types/specactors/builtin/init/init.go +++ b/pkg/types/specactors/builtin/init/init.go @@ -11,10 +11,9 @@ import ( "github.com/filecoin-project/go-state-types/cbor" "github.com/ipfs/go-cid" + types "github.com/filecoin-project/venus/pkg/types/internal" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - types "github.com/filecoin-project/venus/pkg/types/internal" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -29,7 +28,6 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - ) func init() { @@ -120,7 +118,7 @@ func MakeState(store adt.Store, av actors.Version, networkName string) (State, e case actors.Version7: return make7(store, networkName) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/pkg/types/specactors/builtin/init/v0.go b/pkg/types/specactors/builtin/init/v0.go index 6bc0b3f132..ebdd46fc69 100644 --- a/pkg/types/specactors/builtin/init/v0.go +++ b/pkg/types/specactors/builtin/init/v0.go @@ -10,9 +10,6 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - - init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" @@ -31,14 +28,14 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store, networkName string) (State, error) { out := state0{store: store} - - mr, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - out.State = *init0.ConstructState(mr, networkName) - + mr, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *init0.ConstructState(mr, networkName) + return &out, nil } @@ -113,4 +110,4 @@ func (s *state0) AddressMap() (adt.Map, error) { func (s *state0) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/init/v2.go b/pkg/types/specactors/builtin/init/v2.go index 6c7b143d1b..79767589ee 100644 --- a/pkg/types/specactors/builtin/init/v2.go +++ b/pkg/types/specactors/builtin/init/v2.go @@ -10,9 +10,6 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - - init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" @@ -31,14 +28,14 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store, networkName string) (State, error) { out := state2{store: store} - - mr, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - out.State = *init2.ConstructState(mr, networkName) - + mr, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *init2.ConstructState(mr, networkName) + return &out, nil } @@ -113,4 +110,4 @@ func (s *state2) AddressMap() (adt.Map, error) { func (s *state2) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/init/v3.go b/pkg/types/specactors/builtin/init/v3.go index 3fee0b227c..cd7582cb57 100644 --- a/pkg/types/specactors/builtin/init/v3.go +++ b/pkg/types/specactors/builtin/init/v3.go @@ -10,12 +10,9 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" ) @@ -33,14 +30,14 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store, networkName string) (State, error) { out := state3{store: store} - - s, err := init3.ConstructState(store, networkName) - if err != nil { - return nil, err - } - out.State = *s - + s, err := init3.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -115,4 +112,4 @@ func (s *state3) AddressMap() (adt.Map, error) { func (s *state3) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/init/v4.go b/pkg/types/specactors/builtin/init/v4.go index 6897447ed2..e7774e8bf2 100644 --- a/pkg/types/specactors/builtin/init/v4.go +++ b/pkg/types/specactors/builtin/init/v4.go @@ -10,12 +10,9 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" ) @@ -33,14 +30,14 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store, networkName string) (State, error) { out := state4{store: store} - - s, err := init4.ConstructState(store, networkName) - if err != nil { - return nil, err - } - out.State = *s - + s, err := init4.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -115,4 +112,4 @@ func (s *state4) AddressMap() (adt.Map, error) { func (s *state4) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/init/v5.go b/pkg/types/specactors/builtin/init/v5.go index 2804256ddf..51dc3999e9 100644 --- a/pkg/types/specactors/builtin/init/v5.go +++ b/pkg/types/specactors/builtin/init/v5.go @@ -10,12 +10,9 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" ) @@ -33,14 +30,14 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store, networkName string) (State, error) { out := state5{store: store} - - s, err := init5.ConstructState(store, networkName) - if err != nil { - return nil, err - } - out.State = *s - + s, err := init5.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -115,4 +112,4 @@ func (s *state5) AddressMap() (adt.Map, error) { func (s *state5) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/init/v6.go b/pkg/types/specactors/builtin/init/v6.go index 816d548210..0633fa831b 100644 --- a/pkg/types/specactors/builtin/init/v6.go +++ b/pkg/types/specactors/builtin/init/v6.go @@ -10,12 +10,9 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" ) @@ -33,14 +30,14 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store, networkName string) (State, error) { out := state6{store: store} - - s, err := init6.ConstructState(store, networkName) - if err != nil { - return nil, err - } - out.State = *s - + s, err := init6.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -115,4 +112,4 @@ func (s *state6) AddressMap() (adt.Map, error) { func (s *state6) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/init/v7.go b/pkg/types/specactors/builtin/init/v7.go index 51ac746de4..f9c7db4516 100644 --- a/pkg/types/specactors/builtin/init/v7.go +++ b/pkg/types/specactors/builtin/init/v7.go @@ -10,12 +10,9 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" ) @@ -33,14 +30,14 @@ func load7(store adt.Store, root cid.Cid) (State, error) { func make7(store adt.Store, networkName string) (State, error) { out := state7{store: store} - - s, err := init7.ConstructState(store, networkName) - if err != nil { - return nil, err - } - out.State = *s - + s, err := init7.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -115,4 +112,4 @@ func (s *state7) AddressMap() (adt.Map, error) { func (s *state7) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/market/market.go b/pkg/types/specactors/builtin/market/market.go index 77383ba8c8..8a57b87f0f 100644 --- a/pkg/types/specactors/builtin/market/market.go +++ b/pkg/types/specactors/builtin/market/market.go @@ -29,11 +29,10 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" + "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - types "github.com/filecoin-project/venus/pkg/types/internal" ) func init() { @@ -124,7 +123,7 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version7: return make7(store) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -198,7 +197,7 @@ type DealProposals interface { type PublishStorageDealsParams = market0.PublishStorageDealsParams type PublishStorageDealsReturn interface { - DealIDs() ([]abi.DealID, error) + DealIDs() ([]abi.DealID, error) // Note that this index is based on the batch of deals that were published, NOT the DealID IsDealValid(index uint64) (bool, error) } @@ -232,7 +231,7 @@ func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStora case actors.Version7: return decodePublishStorageDealsReturn7(b) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -248,67 +247,67 @@ type DealState struct { } type DealProposal struct { - PieceCID cid.Cid - PieceSize abi.PaddedPieceSize - VerifiedDeal bool - Client address.Address - Provider address.Address - Label string - StartEpoch abi.ChainEpoch - EndEpoch abi.ChainEpoch + PieceCID cid.Cid + PieceSize abi.PaddedPieceSize + VerifiedDeal bool + Client address.Address + Provider address.Address + Label string + StartEpoch abi.ChainEpoch + EndEpoch abi.ChainEpoch StoragePricePerEpoch abi.TokenAmount - ProviderCollateral abi.TokenAmount - ClientCollateral abi.TokenAmount + ProviderCollateral abi.TokenAmount + ClientCollateral abi.TokenAmount } type DealStateChanges struct { - Added []DealIDState + Added []DealIDState Modified []DealStateChange - Removed []DealIDState + Removed []DealIDState } type DealIDState struct { - ID abi.DealID + ID abi.DealID Deal DealState } // DealStateChange is a change in deal state from -> to type DealStateChange struct { - ID abi.DealID + ID abi.DealID From *DealState - To *DealState + To *DealState } type DealProposalChanges struct { - Added []ProposalIDState + Added []ProposalIDState Removed []ProposalIDState } type ProposalIDState struct { - ID abi.DealID + ID abi.DealID Proposal DealProposal } func EmptyDealState() *DealState { return &DealState{ SectorStartEpoch: -1, - SlashEpoch: -1, + SlashEpoch: -1, LastUpdatedEpoch: -1, } } // returns the earned fees and pending fees for a given deal func (deal DealProposal) GetDealFees(height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) { - tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch))) + tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch))) - ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch))) - if ef.LessThan(big.Zero()) { - ef = big.Zero() - } + ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch))) + if ef.LessThan(big.Zero()) { + ef = big.Zero() + } - if ef.GreaterThan(tf) { - ef = tf - } + if ef.GreaterThan(tf) { + ef = tf + } - return ef, big.Sub(tf, ef) + return ef, big.Sub(tf, ef) } diff --git a/pkg/types/specactors/builtin/market/v0.go b/pkg/types/specactors/builtin/market/v0.go index 25319e5790..519979ba1d 100644 --- a/pkg/types/specactors/builtin/market/v0.go +++ b/pkg/types/specactors/builtin/market/v0.go @@ -11,8 +11,8 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" types "github.com/filecoin-project/venus/pkg/types/internal" + "github.com/filecoin-project/venus/pkg/types/specactors/adt" market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" @@ -31,19 +31,19 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store) (State, error) { out := state0{store: store} - - ea, err := adt0.MakeEmptyArray(store).Root() - if err != nil { - return nil, err - } - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } + ea, err := adt0.MakeEmptyArray(store).Root() + if err != nil { + return nil, err + } + + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *market0.ConstructState(ea, em, em) - out.State = *market0.ConstructState(ea, em, em) - return &out, nil } @@ -249,12 +249,12 @@ type publishStorageDealsReturn0 struct { } func (r *publishStorageDealsReturn0) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn0) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/pkg/types/specactors/builtin/market/v2.go b/pkg/types/specactors/builtin/market/v2.go index 39b4cb8d77..9ac811b80d 100644 --- a/pkg/types/specactors/builtin/market/v2.go +++ b/pkg/types/specactors/builtin/market/v2.go @@ -11,8 +11,8 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" types "github.com/filecoin-project/venus/pkg/types/internal" + "github.com/filecoin-project/venus/pkg/types/specactors/adt" market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" @@ -31,19 +31,19 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store) (State, error) { out := state2{store: store} - - ea, err := adt2.MakeEmptyArray(store).Root() - if err != nil { - return nil, err - } - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } + ea, err := adt2.MakeEmptyArray(store).Root() + if err != nil { + return nil, err + } + + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *market2.ConstructState(ea, em, em) - out.State = *market2.ConstructState(ea, em, em) - return &out, nil } @@ -249,12 +249,12 @@ type publishStorageDealsReturn2 struct { } func (r *publishStorageDealsReturn2) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn2) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/pkg/types/specactors/builtin/market/v3.go b/pkg/types/specactors/builtin/market/v3.go index 7aa0916583..b8fe02c130 100644 --- a/pkg/types/specactors/builtin/market/v3.go +++ b/pkg/types/specactors/builtin/market/v3.go @@ -11,8 +11,8 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" types "github.com/filecoin-project/venus/pkg/types/internal" + "github.com/filecoin-project/venus/pkg/types/specactors/adt" market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" @@ -31,14 +31,14 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store) (State, error) { out := state3{store: store} - - s, err := market3.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := market3.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -244,12 +244,12 @@ type publishStorageDealsReturn3 struct { } func (r *publishStorageDealsReturn3) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn3) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/pkg/types/specactors/builtin/market/v4.go b/pkg/types/specactors/builtin/market/v4.go index 8256396d53..c63e387e7e 100644 --- a/pkg/types/specactors/builtin/market/v4.go +++ b/pkg/types/specactors/builtin/market/v4.go @@ -11,8 +11,8 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" types "github.com/filecoin-project/venus/pkg/types/internal" + "github.com/filecoin-project/venus/pkg/types/specactors/adt" market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" @@ -31,14 +31,14 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store) (State, error) { out := state4{store: store} - - s, err := market4.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := market4.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -244,12 +244,12 @@ type publishStorageDealsReturn4 struct { } func (r *publishStorageDealsReturn4) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn4) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/pkg/types/specactors/builtin/market/v5.go b/pkg/types/specactors/builtin/market/v5.go index d1440322a6..3c85a56891 100644 --- a/pkg/types/specactors/builtin/market/v5.go +++ b/pkg/types/specactors/builtin/market/v5.go @@ -11,8 +11,8 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" types "github.com/filecoin-project/venus/pkg/types/internal" + "github.com/filecoin-project/venus/pkg/types/specactors/adt" market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" @@ -31,14 +31,14 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store) (State, error) { out := state5{store: store} - - s, err := market5.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := market5.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -244,12 +244,12 @@ type publishStorageDealsReturn5 struct { } func (r *publishStorageDealsReturn5) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn5) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/pkg/types/specactors/builtin/market/v6.go b/pkg/types/specactors/builtin/market/v6.go index 4bb5ff9fe8..927cf08542 100644 --- a/pkg/types/specactors/builtin/market/v6.go +++ b/pkg/types/specactors/builtin/market/v6.go @@ -11,8 +11,8 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" types "github.com/filecoin-project/venus/pkg/types/internal" + "github.com/filecoin-project/venus/pkg/types/specactors/adt" market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" @@ -31,14 +31,14 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store) (State, error) { out := state6{store: store} - - s, err := market6.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := market6.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -244,11 +244,11 @@ type publishStorageDealsReturn6 struct { } func (r *publishStorageDealsReturn6) IsDealValid(index uint64) (bool, error) { - - return r.ValidDeals.IsSet(index) - + + return r.ValidDeals.IsSet(index) + } func (r *publishStorageDealsReturn6) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/pkg/types/specactors/builtin/market/v7.go b/pkg/types/specactors/builtin/market/v7.go index a9d32383be..6edbebb6e7 100644 --- a/pkg/types/specactors/builtin/market/v7.go +++ b/pkg/types/specactors/builtin/market/v7.go @@ -11,8 +11,8 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" types "github.com/filecoin-project/venus/pkg/types/internal" + "github.com/filecoin-project/venus/pkg/types/specactors/adt" market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" @@ -31,14 +31,14 @@ func load7(store adt.Store, root cid.Cid) (State, error) { func make7(store adt.Store) (State, error) { out := state7{store: store} - - s, err := market7.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := market7.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -244,11 +244,11 @@ type publishStorageDealsReturn7 struct { } func (r *publishStorageDealsReturn7) IsDealValid(index uint64) (bool, error) { - - return r.ValidDeals.IsSet(index) - + + return r.ValidDeals.IsSet(index) + } func (r *publishStorageDealsReturn7) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/pkg/types/specactors/builtin/miner/miner.go b/pkg/types/specactors/builtin/miner/miner.go index 8233c8669a..a539834108 100644 --- a/pkg/types/specactors/builtin/miner/miner.go +++ b/pkg/types/specactors/builtin/miner/miner.go @@ -17,9 +17,9 @@ import ( "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/go-state-types/dline" + types "github.com/filecoin-project/venus/pkg/types/internal" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - types "github.com/filecoin-project/venus/pkg/types/internal" miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" @@ -39,7 +39,6 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - ) func init() { @@ -114,7 +113,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin7.StorageMinerActorCodeID: return load7(store, act.Head) -} + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -142,7 +141,7 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version7: return make7(store) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -194,8 +193,8 @@ type State interface { LoadSectors(sectorNos *bitfield.BitField) ([]*SectorOnChainInfo, error) NumLiveSectors() (uint64, error) IsAllocated(abi.SectorNumber) (bool, error) - // UnallocatedSectorNumbers returns up to count unallocated sector numbers (or less than - // count if there aren't enough). + // UnallocatedSectorNumbers returns up to count unallocated sector numbers (or less than + // count if there aren't enough). UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) GetAllocatedSectors() (*bitfield.BitField, error) diff --git a/pkg/types/specactors/builtin/miner/v0.go b/pkg/types/specactors/builtin/miner/v0.go index 1d68b5a2d0..25be77637d 100644 --- a/pkg/types/specactors/builtin/miner/v0.go +++ b/pkg/types/specactors/builtin/miner/v0.go @@ -20,7 +20,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" - miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" ) @@ -138,10 +137,10 @@ func (s *state0) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. -// 1. If the sector is non-faulty, it will either expire on-time (can be + // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. -// 2. If it's faulty, it will expire early within the first 14 entries + // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. stopErr := errors.New("stop") @@ -212,7 +211,7 @@ func (s *state0) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state0) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { -precommitted, err := adt0.AsMap(s.store, s.State.PreCommittedSectors) + precommitted, err := adt0.AsMap(s.store, s.State.PreCommittedSectors) if err != nil { return err } @@ -291,7 +290,7 @@ func (s *state0) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, allocatedRuns, ) if err != nil { @@ -446,10 +445,10 @@ func (s *state0) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state0) EraseAllUnproven() error { - - // field doesn't exist until v2 - return nil - + + // field doesn't exist until v2 + return nil + } func (d *deadline0) LoadPartition(idx uint64) (Partition, error) { @@ -521,7 +520,6 @@ func fromV0SectorOnChainInfo(v0 miner0.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v0.InitialPledge, ExpectedDayReward: v0.ExpectedDayReward, ExpectedStoragePledge: v0.ExpectedStoragePledge, - } return info } diff --git a/pkg/types/specactors/builtin/miner/v2.go b/pkg/types/specactors/builtin/miner/v2.go index 1903441f29..a803caff7b 100644 --- a/pkg/types/specactors/builtin/miner/v2.go +++ b/pkg/types/specactors/builtin/miner/v2.go @@ -18,7 +18,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" - miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" ) @@ -136,10 +135,10 @@ func (s *state2) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. -// 1. If the sector is non-faulty, it will either expire on-time (can be + // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. -// 2. If it's faulty, it will expire early within the first 14 entries + // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. stopErr := errors.New("stop") @@ -210,7 +209,7 @@ func (s *state2) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state2) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { -precommitted, err := adt2.AsMap(s.store, s.State.PreCommittedSectors) + precommitted, err := adt2.AsMap(s.store, s.State.PreCommittedSectors) if err != nil { return err } @@ -289,7 +288,7 @@ func (s *state2) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, allocatedRuns, ) if err != nil { @@ -444,42 +443,42 @@ func (s *state2) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state2) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner2.Deadline) error { + ps, err := dl.PartitionsArray(s.store) if err != nil { return err } - err = dls.ForEach(s.store, func(dindx uint64, dl *miner2.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner2.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } + var part miner2.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) - dl.Partitions, err = ps.Root() - if err != nil { - return err - } + if err != nil { + return err + } - return dls.UpdateDeadline(s.store, dindx, dl) - }) + dl.Partitions, err = ps.Root() if err != nil { return err } - return s.State.SaveDeadlines(s.store, dls) - + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline2) LoadPartition(idx uint64) (Partition, error) { @@ -551,7 +550,6 @@ func fromV2SectorOnChainInfo(v2 miner2.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v2.InitialPledge, ExpectedDayReward: v2.ExpectedDayReward, ExpectedStoragePledge: v2.ExpectedStoragePledge, - } return info } diff --git a/pkg/types/specactors/builtin/miner/v3.go b/pkg/types/specactors/builtin/miner/v3.go index 4353b7206f..6cceac6d52 100644 --- a/pkg/types/specactors/builtin/miner/v3.go +++ b/pkg/types/specactors/builtin/miner/v3.go @@ -18,7 +18,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" @@ -138,10 +137,10 @@ func (s *state3) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. -// 1. If the sector is non-faulty, it will either expire on-time (can be + // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. -// 2. If it's faulty, it will expire early within the first 14 entries + // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. stopErr := errors.New("stop") @@ -212,7 +211,7 @@ func (s *state3) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state3) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { -precommitted, err := adt3.AsMap(s.store, s.State.PreCommittedSectors, builtin3.DefaultHamtBitwidth) + precommitted, err := adt3.AsMap(s.store, s.State.PreCommittedSectors, builtin3.DefaultHamtBitwidth) if err != nil { return err } @@ -291,7 +290,7 @@ func (s *state3) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, allocatedRuns, ) if err != nil { @@ -441,42 +440,42 @@ func (s *state3) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state3) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner3.Deadline) error { + ps, err := dl.PartitionsArray(s.store) if err != nil { return err } - err = dls.ForEach(s.store, func(dindx uint64, dl *miner3.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner3.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } + var part miner3.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) - dl.Partitions, err = ps.Root() - if err != nil { - return err - } + if err != nil { + return err + } - return dls.UpdateDeadline(s.store, dindx, dl) - }) + dl.Partitions, err = ps.Root() if err != nil { return err } - return s.State.SaveDeadlines(s.store, dls) - + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline3) LoadPartition(idx uint64) (Partition, error) { @@ -552,7 +551,6 @@ func fromV3SectorOnChainInfo(v3 miner3.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v3.InitialPledge, ExpectedDayReward: v3.ExpectedDayReward, ExpectedStoragePledge: v3.ExpectedStoragePledge, - } return info } diff --git a/pkg/types/specactors/builtin/miner/v4.go b/pkg/types/specactors/builtin/miner/v4.go index 67a3a5e55b..9e007a2067 100644 --- a/pkg/types/specactors/builtin/miner/v4.go +++ b/pkg/types/specactors/builtin/miner/v4.go @@ -18,7 +18,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" @@ -138,10 +137,10 @@ func (s *state4) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. -// 1. If the sector is non-faulty, it will either expire on-time (can be + // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. -// 2. If it's faulty, it will expire early within the first 14 entries + // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. stopErr := errors.New("stop") @@ -212,7 +211,7 @@ func (s *state4) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state4) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { -precommitted, err := adt4.AsMap(s.store, s.State.PreCommittedSectors, builtin4.DefaultHamtBitwidth) + precommitted, err := adt4.AsMap(s.store, s.State.PreCommittedSectors, builtin4.DefaultHamtBitwidth) if err != nil { return err } @@ -291,7 +290,7 @@ func (s *state4) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, allocatedRuns, ) if err != nil { @@ -441,42 +440,42 @@ func (s *state4) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state4) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner4.Deadline) error { + ps, err := dl.PartitionsArray(s.store) if err != nil { return err } - err = dls.ForEach(s.store, func(dindx uint64, dl *miner4.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner4.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } + var part miner4.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) - dl.Partitions, err = ps.Root() - if err != nil { - return err - } + if err != nil { + return err + } - return dls.UpdateDeadline(s.store, dindx, dl) - }) + dl.Partitions, err = ps.Root() if err != nil { return err } - return s.State.SaveDeadlines(s.store, dls) - + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline4) LoadPartition(idx uint64) (Partition, error) { @@ -552,7 +551,6 @@ func fromV4SectorOnChainInfo(v4 miner4.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v4.InitialPledge, ExpectedDayReward: v4.ExpectedDayReward, ExpectedStoragePledge: v4.ExpectedStoragePledge, - } return info } diff --git a/pkg/types/specactors/builtin/miner/v5.go b/pkg/types/specactors/builtin/miner/v5.go index 4a5ccd28c6..16962a7a51 100644 --- a/pkg/types/specactors/builtin/miner/v5.go +++ b/pkg/types/specactors/builtin/miner/v5.go @@ -18,7 +18,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" @@ -138,10 +137,10 @@ func (s *state5) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. -// 1. If the sector is non-faulty, it will either expire on-time (can be + // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. -// 2. If it's faulty, it will expire early within the first 14 entries + // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. stopErr := errors.New("stop") @@ -212,7 +211,7 @@ func (s *state5) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state5) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { -precommitted, err := adt5.AsMap(s.store, s.State.PreCommittedSectors, builtin5.DefaultHamtBitwidth) + precommitted, err := adt5.AsMap(s.store, s.State.PreCommittedSectors, builtin5.DefaultHamtBitwidth) if err != nil { return err } @@ -291,7 +290,7 @@ func (s *state5) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, allocatedRuns, ) if err != nil { @@ -441,42 +440,42 @@ func (s *state5) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state5) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner5.Deadline) error { + ps, err := dl.PartitionsArray(s.store) if err != nil { return err } - err = dls.ForEach(s.store, func(dindx uint64, dl *miner5.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner5.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } + var part miner5.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) - dl.Partitions, err = ps.Root() - if err != nil { - return err - } + if err != nil { + return err + } - return dls.UpdateDeadline(s.store, dindx, dl) - }) + dl.Partitions, err = ps.Root() if err != nil { return err } - return s.State.SaveDeadlines(s.store, dls) - + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline5) LoadPartition(idx uint64) (Partition, error) { @@ -552,7 +551,6 @@ func fromV5SectorOnChainInfo(v5 miner5.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v5.InitialPledge, ExpectedDayReward: v5.ExpectedDayReward, ExpectedStoragePledge: v5.ExpectedStoragePledge, - } return info } diff --git a/pkg/types/specactors/builtin/miner/v6.go b/pkg/types/specactors/builtin/miner/v6.go index f33d42cdba..bff57c27fa 100644 --- a/pkg/types/specactors/builtin/miner/v6.go +++ b/pkg/types/specactors/builtin/miner/v6.go @@ -18,7 +18,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" @@ -138,10 +137,10 @@ func (s *state6) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. -// 1. If the sector is non-faulty, it will either expire on-time (can be + // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. -// 2. If it's faulty, it will expire early within the first 42 entries + // 2. If it's faulty, it will expire early within the first 42 entries // of the expiration queue. stopErr := errors.New("stop") @@ -212,7 +211,7 @@ func (s *state6) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state6) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { -precommitted, err := adt6.AsMap(s.store, s.State.PreCommittedSectors, builtin6.DefaultHamtBitwidth) + precommitted, err := adt6.AsMap(s.store, s.State.PreCommittedSectors, builtin6.DefaultHamtBitwidth) if err != nil { return err } @@ -291,7 +290,7 @@ func (s *state6) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, allocatedRuns, ) if err != nil { @@ -441,42 +440,42 @@ func (s *state6) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state6) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner6.Deadline) error { + ps, err := dl.PartitionsArray(s.store) if err != nil { return err } - err = dls.ForEach(s.store, func(dindx uint64, dl *miner6.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner6.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } + var part miner6.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) - dl.Partitions, err = ps.Root() - if err != nil { - return err - } + if err != nil { + return err + } - return dls.UpdateDeadline(s.store, dindx, dl) - }) + dl.Partitions, err = ps.Root() if err != nil { return err } - return s.State.SaveDeadlines(s.store, dls) - + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline6) LoadPartition(idx uint64) (Partition, error) { @@ -552,7 +551,6 @@ func fromV6SectorOnChainInfo(v6 miner6.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v6.InitialPledge, ExpectedDayReward: v6.ExpectedDayReward, ExpectedStoragePledge: v6.ExpectedStoragePledge, - } return info } diff --git a/pkg/types/specactors/builtin/miner/v7.go b/pkg/types/specactors/builtin/miner/v7.go index 7902229e6c..3e5aa32a84 100644 --- a/pkg/types/specactors/builtin/miner/v7.go +++ b/pkg/types/specactors/builtin/miner/v7.go @@ -18,7 +18,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" @@ -138,9 +137,9 @@ func (s *state7) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. -// 1. If the sector is non-faulty, it will expire on-time (can be + // 1. If the sector is non-faulty, it will expire on-time (can be // learned from the sector info). -// 2. If it's faulty, it will expire early within the first 42 entries + // 2. If it's faulty, it will expire early within the first 42 entries // of the expiration queue. stopErr := errors.New("stop") @@ -211,7 +210,7 @@ func (s *state7) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state7) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { -precommitted, err := adt7.AsMap(s.store, s.State.PreCommittedSectors, builtin7.DefaultHamtBitwidth) + precommitted, err := adt7.AsMap(s.store, s.State.PreCommittedSectors, builtin7.DefaultHamtBitwidth) if err != nil { return err } @@ -290,7 +289,7 @@ func (s *state7) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, allocatedRuns, ) if err != nil { @@ -440,42 +439,42 @@ func (s *state7) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state7) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner7.Deadline) error { + ps, err := dl.PartitionsArray(s.store) if err != nil { return err } - err = dls.ForEach(s.store, func(dindx uint64, dl *miner7.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner7.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } + var part miner7.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) - dl.Partitions, err = ps.Root() - if err != nil { - return err - } + if err != nil { + return err + } - return dls.UpdateDeadline(s.store, dindx, dl) - }) + dl.Partitions, err = ps.Root() if err != nil { return err } - return s.State.SaveDeadlines(s.store, dls) - + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline7) LoadPartition(idx uint64) (Partition, error) { @@ -551,9 +550,8 @@ func fromV7SectorOnChainInfo(v7 miner7.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v7.InitialPledge, ExpectedDayReward: v7.ExpectedDayReward, ExpectedStoragePledge: v7.ExpectedStoragePledge, - + SectorKeyCID: v7.SectorKeyCID, - } return info } diff --git a/pkg/types/specactors/builtin/multisig/message0.go b/pkg/types/specactors/builtin/multisig/message0.go index cf032a58c6..448d784270 100644 --- a/pkg/types/specactors/builtin/multisig/message0.go +++ b/pkg/types/specactors/builtin/multisig/message0.go @@ -12,9 +12,9 @@ import ( init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" multisig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - types "github.com/filecoin-project/venus/pkg/types/internal" ) type message0 struct{ from address.Address } @@ -75,8 +75,6 @@ func (m message0) Create( }, nil } - - func (m message0) Propose(msig, to address.Address, amt abi.TokenAmount, method abi.MethodNum, params []byte) (*types.Message, error) { @@ -144,4 +142,3 @@ func (m message0) Cancel(msig address.Address, txID uint64, hashData *ProposalHa Params: enc, }, nil } - diff --git a/pkg/types/specactors/builtin/multisig/message2.go b/pkg/types/specactors/builtin/multisig/message2.go index 3eb6f616ad..11bf85810e 100644 --- a/pkg/types/specactors/builtin/multisig/message2.go +++ b/pkg/types/specactors/builtin/multisig/message2.go @@ -12,9 +12,9 @@ import ( init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" multisig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - types "github.com/filecoin-project/venus/pkg/types/internal" ) type message2 struct{ message0 } @@ -71,5 +71,3 @@ func (m message2) Create( Value: initialAmount, }, nil } - - diff --git a/pkg/types/specactors/builtin/multisig/message3.go b/pkg/types/specactors/builtin/multisig/message3.go index 8c18faf7bd..9ab55f1555 100644 --- a/pkg/types/specactors/builtin/multisig/message3.go +++ b/pkg/types/specactors/builtin/multisig/message3.go @@ -12,9 +12,9 @@ import ( init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" multisig3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/multisig" + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - types "github.com/filecoin-project/venus/pkg/types/internal" ) type message3 struct{ message0 } @@ -71,5 +71,3 @@ func (m message3) Create( Value: initialAmount, }, nil } - - diff --git a/pkg/types/specactors/builtin/multisig/message4.go b/pkg/types/specactors/builtin/multisig/message4.go index d1f69214b1..7ce37e444c 100644 --- a/pkg/types/specactors/builtin/multisig/message4.go +++ b/pkg/types/specactors/builtin/multisig/message4.go @@ -12,9 +12,9 @@ import ( init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" multisig4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig" + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - types "github.com/filecoin-project/venus/pkg/types/internal" ) type message4 struct{ message0 } @@ -71,5 +71,3 @@ func (m message4) Create( Value: initialAmount, }, nil } - - diff --git a/pkg/types/specactors/builtin/multisig/message5.go b/pkg/types/specactors/builtin/multisig/message5.go index a83021a2ec..d5cad48782 100644 --- a/pkg/types/specactors/builtin/multisig/message5.go +++ b/pkg/types/specactors/builtin/multisig/message5.go @@ -12,9 +12,9 @@ import ( init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" multisig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig" + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - types "github.com/filecoin-project/venus/pkg/types/internal" ) type message5 struct{ message0 } @@ -71,5 +71,3 @@ func (m message5) Create( Value: initialAmount, }, nil } - - diff --git a/pkg/types/specactors/builtin/multisig/message6.go b/pkg/types/specactors/builtin/multisig/message6.go index 79d0afc500..e28600c86b 100644 --- a/pkg/types/specactors/builtin/multisig/message6.go +++ b/pkg/types/specactors/builtin/multisig/message6.go @@ -12,9 +12,9 @@ import ( init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" multisig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - types "github.com/filecoin-project/venus/pkg/types/internal" ) type message6 struct{ message0 } @@ -71,5 +71,3 @@ func (m message6) Create( Value: initialAmount, }, nil } - - diff --git a/pkg/types/specactors/builtin/multisig/message7.go b/pkg/types/specactors/builtin/multisig/message7.go index 409754d1d8..7e8e6a0d67 100644 --- a/pkg/types/specactors/builtin/multisig/message7.go +++ b/pkg/types/specactors/builtin/multisig/message7.go @@ -12,9 +12,9 @@ import ( init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" multisig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - types "github.com/filecoin-project/venus/pkg/types/internal" ) type message7 struct{ message0 } @@ -71,5 +71,3 @@ func (m message7) Create( Value: initialAmount, }, nil } - - diff --git a/pkg/types/specactors/builtin/multisig/multisig.go b/pkg/types/specactors/builtin/multisig/multisig.go index 5c3740482f..4380954f9a 100644 --- a/pkg/types/specactors/builtin/multisig/multisig.go +++ b/pkg/types/specactors/builtin/multisig/multisig.go @@ -31,11 +31,10 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - types "github.com/filecoin-project/venus/pkg/types/internal" ) func init() { @@ -121,7 +120,7 @@ func MakeState(store adt.Store, av actors.Version, signers []address.Address, th case actors.Version7: return make7(store, signers, threshold, startEpoch, unlockDuration, initialBalance) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/pkg/types/specactors/builtin/multisig/v0.go b/pkg/types/specactors/builtin/multisig/v0.go index 4fce5992e8..3f736cdc80 100644 --- a/pkg/types/specactors/builtin/multisig/v0.go +++ b/pkg/types/specactors/builtin/multisig/v0.go @@ -16,7 +16,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" - msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" ) @@ -39,14 +38,14 @@ func make0(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance - - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - out.State.PendingTxns = em - + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + return &out, nil } diff --git a/pkg/types/specactors/builtin/multisig/v2.go b/pkg/types/specactors/builtin/multisig/v2.go index f091bf872f..b56bafd72f 100644 --- a/pkg/types/specactors/builtin/multisig/v2.go +++ b/pkg/types/specactors/builtin/multisig/v2.go @@ -16,7 +16,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" - msig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" ) @@ -39,14 +38,14 @@ func make2(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance - - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - out.State.PendingTxns = em - + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + return &out, nil } diff --git a/pkg/types/specactors/builtin/multisig/v3.go b/pkg/types/specactors/builtin/multisig/v3.go index 60d95149fd..ebe147d2ae 100644 --- a/pkg/types/specactors/builtin/multisig/v3.go +++ b/pkg/types/specactors/builtin/multisig/v3.go @@ -16,7 +16,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" msig3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/multisig" @@ -41,14 +40,14 @@ func make3(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance - - em, err := adt3.StoreEmptyMap(store, builtin3.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - out.State.PendingTxns = em - + em, err := adt3.StoreEmptyMap(store, builtin3.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + return &out, nil } diff --git a/pkg/types/specactors/builtin/multisig/v4.go b/pkg/types/specactors/builtin/multisig/v4.go index 31840e1a01..756ee7fcd0 100644 --- a/pkg/types/specactors/builtin/multisig/v4.go +++ b/pkg/types/specactors/builtin/multisig/v4.go @@ -16,7 +16,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" msig4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig" @@ -41,14 +40,14 @@ func make4(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance - - em, err := adt4.StoreEmptyMap(store, builtin4.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - out.State.PendingTxns = em - + em, err := adt4.StoreEmptyMap(store, builtin4.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + return &out, nil } diff --git a/pkg/types/specactors/builtin/multisig/v5.go b/pkg/types/specactors/builtin/multisig/v5.go index 6d461c3949..b8b0445406 100644 --- a/pkg/types/specactors/builtin/multisig/v5.go +++ b/pkg/types/specactors/builtin/multisig/v5.go @@ -16,7 +16,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" msig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig" @@ -41,14 +40,14 @@ func make5(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance - - em, err := adt5.StoreEmptyMap(store, builtin5.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - out.State.PendingTxns = em - + em, err := adt5.StoreEmptyMap(store, builtin5.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + return &out, nil } diff --git a/pkg/types/specactors/builtin/multisig/v6.go b/pkg/types/specactors/builtin/multisig/v6.go index 3df27e97d3..df6eaf5288 100644 --- a/pkg/types/specactors/builtin/multisig/v6.go +++ b/pkg/types/specactors/builtin/multisig/v6.go @@ -16,7 +16,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" msig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" @@ -41,14 +40,14 @@ func make6(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance - - em, err := adt6.StoreEmptyMap(store, builtin6.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - out.State.PendingTxns = em - + em, err := adt6.StoreEmptyMap(store, builtin6.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + return &out, nil } diff --git a/pkg/types/specactors/builtin/multisig/v7.go b/pkg/types/specactors/builtin/multisig/v7.go index c5dd025fba..b31be9be8a 100644 --- a/pkg/types/specactors/builtin/multisig/v7.go +++ b/pkg/types/specactors/builtin/multisig/v7.go @@ -16,7 +16,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" @@ -41,14 +40,14 @@ func make7(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance - - em, err := adt7.StoreEmptyMap(store, builtin7.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - out.State.PendingTxns = em - + em, err := adt7.StoreEmptyMap(store, builtin7.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + return &out, nil } diff --git a/pkg/types/specactors/builtin/paych/message0.go b/pkg/types/specactors/builtin/paych/message0.go index 2979d6870f..af6c388788 100644 --- a/pkg/types/specactors/builtin/paych/message0.go +++ b/pkg/types/specactors/builtin/paych/message0.go @@ -10,9 +10,9 @@ import ( init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - types "github.com/filecoin-project/venus/pkg/types/internal" ) type message0 struct{ from address.Address } diff --git a/pkg/types/specactors/builtin/paych/message2.go b/pkg/types/specactors/builtin/paych/message2.go index bbedf81c81..edd172ad5b 100644 --- a/pkg/types/specactors/builtin/paych/message2.go +++ b/pkg/types/specactors/builtin/paych/message2.go @@ -10,9 +10,9 @@ import ( init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" paych2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/paych" + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - types "github.com/filecoin-project/venus/pkg/types/internal" ) type message2 struct{ from address.Address } diff --git a/pkg/types/specactors/builtin/paych/message3.go b/pkg/types/specactors/builtin/paych/message3.go index 5179766423..181e3b3643 100644 --- a/pkg/types/specactors/builtin/paych/message3.go +++ b/pkg/types/specactors/builtin/paych/message3.go @@ -10,9 +10,9 @@ import ( init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" paych3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/paych" + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - types "github.com/filecoin-project/venus/pkg/types/internal" ) type message3 struct{ from address.Address } diff --git a/pkg/types/specactors/builtin/paych/message4.go b/pkg/types/specactors/builtin/paych/message4.go index d6478fecb9..e3d73448c3 100644 --- a/pkg/types/specactors/builtin/paych/message4.go +++ b/pkg/types/specactors/builtin/paych/message4.go @@ -10,9 +10,9 @@ import ( init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" paych4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/paych" + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - types "github.com/filecoin-project/venus/pkg/types/internal" ) type message4 struct{ from address.Address } diff --git a/pkg/types/specactors/builtin/paych/message5.go b/pkg/types/specactors/builtin/paych/message5.go index c7364383e7..5303857929 100644 --- a/pkg/types/specactors/builtin/paych/message5.go +++ b/pkg/types/specactors/builtin/paych/message5.go @@ -10,9 +10,9 @@ import ( init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" paych5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/paych" + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - types "github.com/filecoin-project/venus/pkg/types/internal" ) type message5 struct{ from address.Address } diff --git a/pkg/types/specactors/builtin/paych/message6.go b/pkg/types/specactors/builtin/paych/message6.go index f561103ec2..5103040bef 100644 --- a/pkg/types/specactors/builtin/paych/message6.go +++ b/pkg/types/specactors/builtin/paych/message6.go @@ -10,9 +10,9 @@ import ( init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych" + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - types "github.com/filecoin-project/venus/pkg/types/internal" ) type message6 struct{ from address.Address } diff --git a/pkg/types/specactors/builtin/paych/message7.go b/pkg/types/specactors/builtin/paych/message7.go index 59ae295c77..39ac6fe11a 100644 --- a/pkg/types/specactors/builtin/paych/message7.go +++ b/pkg/types/specactors/builtin/paych/message7.go @@ -10,9 +10,9 @@ import ( init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - types "github.com/filecoin-project/venus/pkg/types/internal" ) type message7 struct{ from address.Address } diff --git a/pkg/types/specactors/builtin/paych/paych.go b/pkg/types/specactors/builtin/paych/paych.go index e2db314594..f86165b431 100644 --- a/pkg/types/specactors/builtin/paych/paych.go +++ b/pkg/types/specactors/builtin/paych/paych.go @@ -31,11 +31,10 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - + types "github.com/filecoin-project/venus/pkg/types/internal" actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - types "github.com/filecoin-project/venus/pkg/types/internal" ) func init() { @@ -122,7 +121,7 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version7: return make7(store) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/pkg/types/specactors/builtin/power/power.go b/pkg/types/specactors/builtin/power/power.go index ac161d59d9..08bc58f3ce 100644 --- a/pkg/types/specactors/builtin/power/power.go +++ b/pkg/types/specactors/builtin/power/power.go @@ -13,9 +13,9 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/cbor" + types "github.com/filecoin-project/venus/pkg/types/internal" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - types "github.com/filecoin-project/venus/pkg/types/internal" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -30,7 +30,6 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - ) func init() { @@ -121,7 +120,7 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version7: return make7(store) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/pkg/types/specactors/builtin/power/v0.go b/pkg/types/specactors/builtin/power/v0.go index 36d80e5c79..6addda377c 100644 --- a/pkg/types/specactors/builtin/power/v0.go +++ b/pkg/types/specactors/builtin/power/v0.go @@ -13,7 +13,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" ) @@ -31,19 +30,18 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store) (State, error) { out := state0{store: store} - - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - emm, err := adt0.MakeEmptyMultimap(store).Root() - if err != nil { - return nil, err - } + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + emm, err := adt0.MakeEmptyMultimap(store).Root() + if err != nil { + return nil, err + } - out.State = *power0.ConstructState(em, emm) - + out.State = *power0.ConstructState(em, emm) return &out, nil } diff --git a/pkg/types/specactors/builtin/power/v2.go b/pkg/types/specactors/builtin/power/v2.go index 81e2cb9d56..dcedc20e11 100644 --- a/pkg/types/specactors/builtin/power/v2.go +++ b/pkg/types/specactors/builtin/power/v2.go @@ -13,7 +13,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - power2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/power" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" ) @@ -31,19 +30,18 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store) (State, error) { out := state2{store: store} - - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - emm, err := adt2.MakeEmptyMultimap(store).Root() - if err != nil { - return nil, err - } + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + emm, err := adt2.MakeEmptyMultimap(store).Root() + if err != nil { + return nil, err + } - out.State = *power2.ConstructState(em, emm) - + out.State = *power2.ConstructState(em, emm) return &out, nil } diff --git a/pkg/types/specactors/builtin/power/v3.go b/pkg/types/specactors/builtin/power/v3.go index c8ce1b7fe2..194c2437d8 100644 --- a/pkg/types/specactors/builtin/power/v3.go +++ b/pkg/types/specactors/builtin/power/v3.go @@ -13,7 +13,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" power3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/power" @@ -33,14 +32,13 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store) (State, error) { out := state3{store: store} - - s, err := power3.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := power3.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s return &out, nil } diff --git a/pkg/types/specactors/builtin/power/v4.go b/pkg/types/specactors/builtin/power/v4.go index c1ba984186..d8ef01d5f6 100644 --- a/pkg/types/specactors/builtin/power/v4.go +++ b/pkg/types/specactors/builtin/power/v4.go @@ -13,7 +13,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" power4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/power" @@ -33,14 +32,13 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store) (State, error) { out := state4{store: store} - - s, err := power4.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := power4.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s return &out, nil } diff --git a/pkg/types/specactors/builtin/power/v5.go b/pkg/types/specactors/builtin/power/v5.go index 20bb9b6f4d..b790013ce3 100644 --- a/pkg/types/specactors/builtin/power/v5.go +++ b/pkg/types/specactors/builtin/power/v5.go @@ -13,7 +13,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" power5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/power" @@ -33,14 +32,13 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store) (State, error) { out := state5{store: store} - - s, err := power5.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := power5.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s return &out, nil } diff --git a/pkg/types/specactors/builtin/power/v6.go b/pkg/types/specactors/builtin/power/v6.go index d52353e5f3..ba3baf944f 100644 --- a/pkg/types/specactors/builtin/power/v6.go +++ b/pkg/types/specactors/builtin/power/v6.go @@ -13,7 +13,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" power6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/power" @@ -33,14 +32,13 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store) (State, error) { out := state6{store: store} - - s, err := power6.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := power6.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s return &out, nil } diff --git a/pkg/types/specactors/builtin/power/v7.go b/pkg/types/specactors/builtin/power/v7.go index 106e780da7..de16016978 100644 --- a/pkg/types/specactors/builtin/power/v7.go +++ b/pkg/types/specactors/builtin/power/v7.go @@ -13,7 +13,6 @@ import ( "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" power7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/power" @@ -33,14 +32,13 @@ func load7(store adt.Store, root cid.Cid) (State, error) { func make7(store adt.Store) (State, error) { out := state7{store: store} - - s, err := power7.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := power7.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s return &out, nil } diff --git a/pkg/types/specactors/builtin/reward/reward.go b/pkg/types/specactors/builtin/reward/reward.go index 1607ad587c..db4340031f 100644 --- a/pkg/types/specactors/builtin/reward/reward.go +++ b/pkg/types/specactors/builtin/reward/reward.go @@ -5,8 +5,8 @@ package reward import ( "github.com/filecoin-project/go-state-types/abi" reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" - "github.com/ipfs/go-cid" actors "github.com/filecoin-project/venus/pkg/types/specactors" + "github.com/ipfs/go-cid" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/cbor" @@ -25,10 +25,9 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - + types "github.com/filecoin-project/venus/pkg/types/internal" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - types "github.com/filecoin-project/venus/pkg/types/internal" ) func init() { @@ -119,7 +118,7 @@ func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.Storage case actors.Version7: return make7(store, currRealizedPower) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/pkg/types/specactors/builtin/reward/v2.go b/pkg/types/specactors/builtin/reward/v2.go index 8c7a5cbb3d..dd999fcccf 100644 --- a/pkg/types/specactors/builtin/reward/v2.go +++ b/pkg/types/specactors/builtin/reward/v2.go @@ -42,7 +42,7 @@ func (s *state2) ThisEpochReward() (abi.TokenAmount, error) { func (s *state2) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/pkg/types/specactors/builtin/reward/v3.go b/pkg/types/specactors/builtin/reward/v3.go index 5c05a5f320..8c425298d9 100644 --- a/pkg/types/specactors/builtin/reward/v3.go +++ b/pkg/types/specactors/builtin/reward/v3.go @@ -42,7 +42,7 @@ func (s *state3) ThisEpochReward() (abi.TokenAmount, error) { func (s *state3) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/pkg/types/specactors/builtin/reward/v4.go b/pkg/types/specactors/builtin/reward/v4.go index c617676b89..b99eced828 100644 --- a/pkg/types/specactors/builtin/reward/v4.go +++ b/pkg/types/specactors/builtin/reward/v4.go @@ -42,7 +42,7 @@ func (s *state4) ThisEpochReward() (abi.TokenAmount, error) { func (s *state4) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/pkg/types/specactors/builtin/reward/v5.go b/pkg/types/specactors/builtin/reward/v5.go index da362a571d..2b34f00f6f 100644 --- a/pkg/types/specactors/builtin/reward/v5.go +++ b/pkg/types/specactors/builtin/reward/v5.go @@ -42,7 +42,7 @@ func (s *state5) ThisEpochReward() (abi.TokenAmount, error) { func (s *state5) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/pkg/types/specactors/builtin/reward/v6.go b/pkg/types/specactors/builtin/reward/v6.go index a088e0fd6d..eabfc68a34 100644 --- a/pkg/types/specactors/builtin/reward/v6.go +++ b/pkg/types/specactors/builtin/reward/v6.go @@ -42,7 +42,7 @@ func (s *state6) ThisEpochReward() (abi.TokenAmount, error) { func (s *state6) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/pkg/types/specactors/builtin/reward/v7.go b/pkg/types/specactors/builtin/reward/v7.go index aa381e9e18..82472f26de 100644 --- a/pkg/types/specactors/builtin/reward/v7.go +++ b/pkg/types/specactors/builtin/reward/v7.go @@ -42,7 +42,7 @@ func (s *state7) ThisEpochReward() (abi.TokenAmount, error) { func (s *state7) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/pkg/types/specactors/builtin/system/system.go b/pkg/types/specactors/builtin/system/system.go index 4196ef59a6..cd45b3208a 100644 --- a/pkg/types/specactors/builtin/system/system.go +++ b/pkg/types/specactors/builtin/system/system.go @@ -3,11 +3,10 @@ package system import ( - "github.com/filecoin-project/venus/pkg/types/specactors/adt" actors "github.com/filecoin-project/venus/pkg/types/specactors" - "golang.org/x/xerrors" + "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/ipfs/go-cid" - + "golang.org/x/xerrors" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -22,7 +21,6 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - ) var ( @@ -53,7 +51,7 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version7: return make7(store) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/pkg/types/specactors/builtin/system/v0.go b/pkg/types/specactors/builtin/system/v0.go index b690c9d0a4..97cd14ce86 100644 --- a/pkg/types/specactors/builtin/system/v0.go +++ b/pkg/types/specactors/builtin/system/v0.go @@ -34,4 +34,4 @@ type state0 struct { func (s *state0) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/system/v2.go b/pkg/types/specactors/builtin/system/v2.go index d2b244fcaf..9d5babb37e 100644 --- a/pkg/types/specactors/builtin/system/v2.go +++ b/pkg/types/specactors/builtin/system/v2.go @@ -34,4 +34,4 @@ type state2 struct { func (s *state2) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/system/v3.go b/pkg/types/specactors/builtin/system/v3.go index 13ad0716f7..931356e906 100644 --- a/pkg/types/specactors/builtin/system/v3.go +++ b/pkg/types/specactors/builtin/system/v3.go @@ -34,4 +34,4 @@ type state3 struct { func (s *state3) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/system/v4.go b/pkg/types/specactors/builtin/system/v4.go index 2266d9ccf0..0a7b547536 100644 --- a/pkg/types/specactors/builtin/system/v4.go +++ b/pkg/types/specactors/builtin/system/v4.go @@ -34,4 +34,4 @@ type state4 struct { func (s *state4) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/system/v5.go b/pkg/types/specactors/builtin/system/v5.go index eb1fdafecc..dce044cc27 100644 --- a/pkg/types/specactors/builtin/system/v5.go +++ b/pkg/types/specactors/builtin/system/v5.go @@ -34,4 +34,4 @@ type state5 struct { func (s *state5) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/system/v6.go b/pkg/types/specactors/builtin/system/v6.go index 0cc38d8c0a..82bdc3e47b 100644 --- a/pkg/types/specactors/builtin/system/v6.go +++ b/pkg/types/specactors/builtin/system/v6.go @@ -34,4 +34,4 @@ type state6 struct { func (s *state6) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/system/v7.go b/pkg/types/specactors/builtin/system/v7.go index a528763a8d..9e3bd9b486 100644 --- a/pkg/types/specactors/builtin/system/v7.go +++ b/pkg/types/specactors/builtin/system/v7.go @@ -34,4 +34,4 @@ type state7 struct { func (s *state7) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/verifreg/v0.go b/pkg/types/specactors/builtin/verifreg/v0.go index e7a51a72d8..02eb2e618c 100644 --- a/pkg/types/specactors/builtin/verifreg/v0.go +++ b/pkg/types/specactors/builtin/verifreg/v0.go @@ -27,14 +27,14 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state0{store: store} - - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *verifreg0.ConstructState(em, rootKeyAddress) - + + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *verifreg0.ConstructState(em, rootKeyAddress) + return &out, nil } @@ -73,4 +73,4 @@ func (s *state0) verifiers() (adt.Map, error) { func (s *state0) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/verifreg/v2.go b/pkg/types/specactors/builtin/verifreg/v2.go index 721493a2e3..d3c85f8e87 100644 --- a/pkg/types/specactors/builtin/verifreg/v2.go +++ b/pkg/types/specactors/builtin/verifreg/v2.go @@ -27,14 +27,14 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state2{store: store} - - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *verifreg2.ConstructState(em, rootKeyAddress) - + + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *verifreg2.ConstructState(em, rootKeyAddress) + return &out, nil } @@ -73,4 +73,4 @@ func (s *state2) verifiers() (adt.Map, error) { func (s *state2) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/verifreg/v3.go b/pkg/types/specactors/builtin/verifreg/v3.go index 819d809928..b1707382d4 100644 --- a/pkg/types/specactors/builtin/verifreg/v3.go +++ b/pkg/types/specactors/builtin/verifreg/v3.go @@ -28,14 +28,14 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state3{store: store} - - s, err := verifreg3.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - + + s, err := verifreg3.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -74,4 +74,4 @@ func (s *state3) verifiers() (adt.Map, error) { func (s *state3) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/verifreg/v4.go b/pkg/types/specactors/builtin/verifreg/v4.go index cc25d31954..c2baedce48 100644 --- a/pkg/types/specactors/builtin/verifreg/v4.go +++ b/pkg/types/specactors/builtin/verifreg/v4.go @@ -28,14 +28,14 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state4{store: store} - - s, err := verifreg4.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - + + s, err := verifreg4.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -74,4 +74,4 @@ func (s *state4) verifiers() (adt.Map, error) { func (s *state4) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/verifreg/v5.go b/pkg/types/specactors/builtin/verifreg/v5.go index 870dd17a3d..fd2e4c3067 100644 --- a/pkg/types/specactors/builtin/verifreg/v5.go +++ b/pkg/types/specactors/builtin/verifreg/v5.go @@ -28,14 +28,14 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state5{store: store} - - s, err := verifreg5.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - + + s, err := verifreg5.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -74,4 +74,4 @@ func (s *state5) verifiers() (adt.Map, error) { func (s *state5) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/verifreg/v6.go b/pkg/types/specactors/builtin/verifreg/v6.go index 917b6eed3c..66af78bbf5 100644 --- a/pkg/types/specactors/builtin/verifreg/v6.go +++ b/pkg/types/specactors/builtin/verifreg/v6.go @@ -28,14 +28,14 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state6{store: store} - - s, err := verifreg6.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - + + s, err := verifreg6.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -74,4 +74,4 @@ func (s *state6) verifiers() (adt.Map, error) { func (s *state6) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/verifreg/v7.go b/pkg/types/specactors/builtin/verifreg/v7.go index 88f284f28f..aeec739181 100644 --- a/pkg/types/specactors/builtin/verifreg/v7.go +++ b/pkg/types/specactors/builtin/verifreg/v7.go @@ -28,14 +28,14 @@ func load7(store adt.Store, root cid.Cid) (State, error) { func make7(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state7{store: store} - - s, err := verifreg7.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - + + s, err := verifreg7.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -74,4 +74,4 @@ func (s *state7) verifiers() (adt.Map, error) { func (s *state7) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/pkg/types/specactors/builtin/verifreg/verifreg.go b/pkg/types/specactors/builtin/verifreg/verifreg.go index 35de089433..acb2664f61 100644 --- a/pkg/types/specactors/builtin/verifreg/verifreg.go +++ b/pkg/types/specactors/builtin/verifreg/verifreg.go @@ -25,11 +25,10 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - + types "github.com/filecoin-project/venus/pkg/types/internal" + actors "github.com/filecoin-project/venus/pkg/types/specactors" "github.com/filecoin-project/venus/pkg/types/specactors/adt" "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - types "github.com/filecoin-project/venus/pkg/types/internal" ) func init() { @@ -121,7 +120,7 @@ func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Addres case actors.Version7: return make7(store, rootKeyAddress) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -154,7 +153,6 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { return cid.Undef, xerrors.Errorf("unknown actor version %d", av) } - type State interface { cbor.Marshaler diff --git a/pkg/vm/gas/gas_tracker.go b/pkg/vm/gas/gas_tracker.go index 155848d383..09a476c276 100644 --- a/pkg/vm/gas/gas_tracker.go +++ b/pkg/vm/gas/gas_tracker.go @@ -5,10 +5,11 @@ import ( "os" "time" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/venus/pkg/vm/runtime" - types "github.com/filecoin-project/venus/venus-shared/stmgr" ) // GasTracker maintains the stateView of gas usage throughout the execution of a message. diff --git a/pkg/vm/vmcontext/interpreter.go b/pkg/vm/vmcontext/interpreter.go index 3a802fda80..1cda384f89 100644 --- a/pkg/vm/vmcontext/interpreter.go +++ b/pkg/vm/vmcontext/interpreter.go @@ -4,7 +4,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/venus/pkg/state/tree" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ) diff --git a/pkg/vm/vmcontext/invocation_context.go b/pkg/vm/vmcontext/invocation_context.go index da7d6c3330..50b698b63b 100644 --- a/pkg/vm/vmcontext/invocation_context.go +++ b/pkg/vm/vmcontext/invocation_context.go @@ -25,7 +25,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/actors/builtin/account" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var gasOnActorExec = gas.NewGasCharge("OnActorExec", 0, 0) diff --git a/pkg/vm/vmcontext/runtime_adapter.go b/pkg/vm/vmcontext/runtime_adapter.go index a398a9e781..ace5ffc265 100644 --- a/pkg/vm/vmcontext/runtime_adapter.go +++ b/pkg/vm/vmcontext/runtime_adapter.go @@ -24,7 +24,7 @@ import ( rt5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" "github.com/filecoin-project/venus/pkg/vm/gas" "github.com/filecoin-project/venus/pkg/vm/runtime" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) var EmptyObjectCid cid.Cid diff --git a/pkg/vm/vmcontext/types.go b/pkg/vm/vmcontext/types.go index 6207519baf..8f9a339356 100644 --- a/pkg/vm/vmcontext/types.go +++ b/pkg/vm/vmcontext/types.go @@ -7,7 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" diff --git a/pkg/vm/vmcontext/vmcontext.go b/pkg/vm/vmcontext/vmcontext.go index 7749650a06..553358d24b 100644 --- a/pkg/vm/vmcontext/vmcontext.go +++ b/pkg/vm/vmcontext/vmcontext.go @@ -32,8 +32,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin/cron" initActor "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" - types "github.com/filecoin-project/venus/venus-shared/chain" - types2 "github.com/filecoin-project/venus/venus-shared/stmgr" + "github.com/filecoin-project/venus/venus-shared/types" ) const MaxCallDepth = 4096 @@ -294,7 +293,7 @@ func (vm *VM) ApplyTipSetMessages(blocks []types.BlockMessagesInfo, ts *types.Ti msgGasOutput, _ := json.MarshalIndent(ret.OutPuts, "", "\t") vm.debugger.Println(string(msgGasOutput)) - var valuedTraces []*types2.GasTrace + var valuedTraces []*types.GasTrace for _, trace := range ret.GasTracker.ExecutionTrace.GasCharges { if trace.TotalGas > 0 { valuedTraces = append(valuedTraces, trace) diff --git a/pkg/wallet/wallet.go b/pkg/wallet/wallet.go index df9479e27f..77670560f9 100644 --- a/pkg/wallet/wallet.go +++ b/pkg/wallet/wallet.go @@ -8,12 +8,13 @@ import ( "sort" "sync" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/go-address" logging "github.com/ipfs/go-log/v2" "github.com/pkg/errors" "github.com/filecoin-project/venus/pkg/crypto" - types "github.com/filecoin-project/venus/venus-shared/wallet" ) var TestPassword = []byte("test-password") diff --git a/tools/client/main.go b/tools/client/main.go index 0b59d5932f..e68272a494 100644 --- a/tools/client/main.go +++ b/tools/client/main.go @@ -15,7 +15,7 @@ import ( "github.com/filecoin-project/venus/app/client" "github.com/filecoin-project/venus/pkg/constants" v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) const Filecoin = "Filecoin" diff --git a/tools/conformance/driver.go b/tools/conformance/driver.go index 10491946ce..ccfce3107a 100644 --- a/tools/conformance/driver.go +++ b/tools/conformance/driver.go @@ -29,7 +29,7 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/test-vectors/schema" "github.com/filecoin-project/venus/tools/conformance/chaos" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" blockstore "github.com/ipfs/go-ipfs-blockstore" diff --git a/tools/conformance/rand_record.go b/tools/conformance/rand_record.go index bd0ebf00c1..59c798d2c1 100644 --- a/tools/conformance/rand_record.go +++ b/tools/conformance/rand_record.go @@ -7,7 +7,7 @@ import ( "github.com/filecoin-project/venus/pkg/vm/vmcontext" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" diff --git a/tools/conformance/runner.go b/tools/conformance/runner.go index b8b824ad3f..9e6c64f99b 100644 --- a/tools/conformance/runner.go +++ b/tools/conformance/runner.go @@ -12,7 +12,7 @@ import ( "strconv" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/fatih/color" "github.com/filecoin-project/go-state-types/abi" diff --git a/tools/fast/action_mpool.go b/tools/fast/action_mpool.go index ce7fc3af53..04eb8dea34 100644 --- a/tools/fast/action_mpool.go +++ b/tools/fast/action_mpool.go @@ -3,7 +3,7 @@ package fast import ( "context" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // MpoolLs runs the `mpool ls` command against the filecoin process. diff --git a/tools/fast/action_protocol.go b/tools/fast/action_protocol.go index 0278f7c6f8..1c032d61c6 100644 --- a/tools/fast/action_protocol.go +++ b/tools/fast/action_protocol.go @@ -3,12 +3,12 @@ package fast import ( "context" - apitypes "github.com/filecoin-project/venus/venus-shared/api/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // Protocol runs the `protocol` command against the filecoin process -func (f *Filecoin) Protocol(ctx context.Context) (*apitypes.ProtocolParams, error) { - var out apitypes.ProtocolParams +func (f *Filecoin) Protocol(ctx context.Context) (*types.ProtocolParams, error) { + var out types.ProtocolParams if err := f.RunCmdJSONWithStdin(ctx, nil, &out, "venus", "protocol"); err != nil { return nil, err diff --git a/tools/fast/action_show.go b/tools/fast/action_show.go index 207c6a956d..30938341c7 100644 --- a/tools/fast/action_show.go +++ b/tools/fast/action_show.go @@ -3,7 +3,7 @@ package fast import ( "context" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ) diff --git a/tools/fast/action_swarm.go b/tools/fast/action_swarm.go index c8d22a65b3..813d4aa71e 100644 --- a/tools/fast/action_swarm.go +++ b/tools/fast/action_swarm.go @@ -5,8 +5,9 @@ import ( "encoding/json" "io" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/venus/cmd" - "github.com/filecoin-project/venus/venus-shared/libp2p/net" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/peer" @@ -47,8 +48,8 @@ func (f *Filecoin) SwarmConnect(ctx context.Context, addrs ...multiaddr.Multiadd } // SwarmPeers runs the `swarm peers` command against the filecoin process -func (f *Filecoin) SwarmPeers(ctx context.Context, options ...ActionOption) ([]net.SwarmConnInfo, error) { - var out net.SwarmConnInfos +func (f *Filecoin) SwarmPeers(ctx context.Context, options ...ActionOption) ([]types.SwarmConnInfo, error) { + var out types.SwarmConnInfos args := []string{"venus", "swarm", "peers"} diff --git a/tools/fast/action_wallet.go b/tools/fast/action_wallet.go index 2eb64f2dee..d11b2a349d 100644 --- a/tools/fast/action_wallet.go +++ b/tools/fast/action_wallet.go @@ -12,7 +12,7 @@ import ( files "github.com/ipfs/go-ipfs-files" "github.com/filecoin-project/venus/pkg/crypto" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // AddressNew runs the address new command against the filecoin process. diff --git a/tools/fast/series/wait_for_chain_message.go b/tools/fast/series/wait_for_chain_message.go index 482d1d1886..2b40413e74 100644 --- a/tools/fast/series/wait_for_chain_message.go +++ b/tools/fast/series/wait_for_chain_message.go @@ -6,7 +6,7 @@ import ( "io" "github.com/filecoin-project/venus/tools/fast" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ) diff --git a/tools/gengen/util/generator.go b/tools/gengen/util/generator.go index ee1bf5128b..3b973e6436 100644 --- a/tools/gengen/util/generator.go +++ b/tools/gengen/util/generator.go @@ -45,7 +45,7 @@ import ( "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/pkg/vm/gas" "github.com/filecoin-project/venus/pkg/vmsupport" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) const InitialBaseFee = 100e6 diff --git a/tools/gengen/util/gengen.go b/tools/gengen/util/gengen.go index f32a02d405..35f2cfe1c0 100644 --- a/tools/gengen/util/gengen.go +++ b/tools/gengen/util/gengen.go @@ -19,7 +19,7 @@ import ( "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/genesis" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // CreateStorageMinerConfig holds configuration options used to create a storage diff --git a/tools/seed/seed.go b/tools/seed/seed.go index b9cd5b1605..a3307f9ed9 100644 --- a/tools/seed/seed.go +++ b/tools/seed/seed.go @@ -14,7 +14,7 @@ import ( "strings" "github.com/filecoin-project/venus/pkg/util/ffiwrapper/impl" - types "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ffi "github.com/filecoin-project/filecoin-ffi" "github.com/filecoin-project/go-address" diff --git a/venus-devtool/api-docs-gen/docgen.go b/venus-devtool/api-docs-gen/docgen.go index 6aaaee5372..d5e0e3ff78 100644 --- a/venus-devtool/api-docs-gen/docgen.go +++ b/venus-devtool/api-docs-gen/docgen.go @@ -2,16 +2,20 @@ package docgen import ( "fmt" + "go/ast" + "go/parser" + "go/token" + "os" + "path/filepath" + "reflect" + "strings" + "time" + "unicode" + network2 "github.com/filecoin-project/go-state-types/network" - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" v0 "github.com/filecoin-project/venus/venus-shared/api/chain/v0" v1 "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/messagepool" - "github.com/filecoin-project/venus/venus-shared/paych" - "github.com/filecoin-project/venus/venus-shared/stmgr" - "github.com/filecoin-project/venus/venus-shared/wallet" - "os" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" @@ -31,14 +35,6 @@ import ( "github.com/libp2p/go-libp2p-core/protocol" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/multiformats/go-multiaddr" - "go/ast" - "go/parser" - "go/token" - "path/filepath" - "reflect" - "strings" - "time" - "unicode" ) var ExampleValues = map[reflect.Type]interface{}{ @@ -66,7 +62,7 @@ func init() { panic(err) } - tsk := chain.NewTipSetKey(c, c2) + tsk := types.NewTipSetKey(c, c2) ExampleValues[reflect.TypeOf(tsk)] = tsk @@ -91,8 +87,8 @@ func init() { addExample(abi.RegisteredPoStProof_StackedDrgWindow32GiBV1) addExample(abi.ChainEpoch(10101)) addExample(crypto.SigTypeBLS) - addExample(wallet.KTBLS) - addExample(wallet.MTChainMsg) + addExample(types.KTBLS) + addExample(types.MTChainMsg) addExample(int64(9)) addExample(12.3) addExample(123) @@ -106,12 +102,12 @@ func init() { addExample(abi.DealID(5432)) addExample(abi.SectorNumber(9)) addExample(abi.SectorSize(32 * 1024 * 1024 * 1024)) - addExample(messagepool.MpoolChange(0)) + addExample(types.MpoolChange(0)) addExample(network.Connected) - addExample(chain2.NetworkName("mainnet")) - addExample(chain2.SyncStateStage(1)) + addExample(types.NetworkName("mainnet")) + addExample(types.SyncStateStage(1)) addExample(api.FullAPIVersion1) - addExample(paych.PCHInbound) + addExample(types.PCHInbound) addExample(time.Minute) addExample(graphsync.RequestID(4)) addExample(datatransfer.TransferID(3)) @@ -124,29 +120,29 @@ func init() { addExample(network.ReachabilityPublic) addExample(map[string]int{"name": 42}) addExample(map[string]time.Time{"name": time.Unix(1615243938, 0).UTC()}) - addExample(&stmgr.ExecutionTrace{ - Msg: ExampleValue("init", reflect.TypeOf(&chain.Message{}), nil).(*chain.Message), - MsgRct: ExampleValue("init", reflect.TypeOf(&chain.MessageReceipt{}), nil).(*chain.MessageReceipt), + addExample(&types.ExecutionTrace{ + Msg: ExampleValue("init", reflect.TypeOf(&types.Message{}), nil).(*types.Message), + MsgRct: ExampleValue("init", reflect.TypeOf(&types.MessageReceipt{}), nil).(*types.MessageReceipt), }) - addExample(map[string]chain.Actor{ - "t01236": ExampleValue("init", reflect.TypeOf(chain.Actor{}), nil).(chain.Actor), + addExample(map[string]types.Actor{ + "t01236": ExampleValue("init", reflect.TypeOf(types.Actor{}), nil).(types.Actor), }) - addExample(map[string]chain.Actor{ - "t01236": ExampleValue("init", reflect.TypeOf(chain.Actor{}), nil).(chain.Actor), + addExample(map[string]types.Actor{ + "t01236": ExampleValue("init", reflect.TypeOf(types.Actor{}), nil).(types.Actor), }) // todo: get an error on MarshalJSON ? // addExample(map[address.Address]*chain.Actor{ // "t01236": ExampleValue("init", reflect.TypeOf(*chain.Actor{}), nil).(*chain.Actor), // }) - addExample(map[string]chain2.MarketDeal{ - "t026363": ExampleValue("init", reflect.TypeOf(chain2.MarketDeal{}), nil).(chain2.MarketDeal), + addExample(map[string]types.MarketDeal{ + "t026363": ExampleValue("init", reflect.TypeOf(types.MarketDeal{}), nil).(types.MarketDeal), }) - addExample(map[string]chain2.MarketBalance{ - "t026363": ExampleValue("init", reflect.TypeOf(chain2.MarketBalance{}), nil).(chain2.MarketBalance), + addExample(map[string]types.MarketBalance{ + "t026363": ExampleValue("init", reflect.TypeOf(types.MarketBalance{}), nil).(types.MarketBalance), }) - addExample([]*chain2.EstimateMessage{ - {Msg: ExampleValue("init", reflect.TypeOf(&chain.Message{}), nil).(*chain.Message), - Spec: ExampleValue("init", reflect.TypeOf(&chain2.MessageSendSpec{}), nil).(*chain2.MessageSendSpec), + addExample([]*types.EstimateMessage{ + {Msg: ExampleValue("init", reflect.TypeOf(&types.Message{}), nil).(*types.Message), + Spec: ExampleValue("init", reflect.TypeOf(&types.MessageSendSpec{}), nil).(*types.MessageSendSpec), }}) addExample(map[string]*pubsub.TopicScoreSnapshot{ "/blocks": { @@ -194,7 +190,7 @@ func init() { // }, // "methods": []interface{}{}}, // ) - addExample(messagepool.CheckStatusCode(0)) + addExample(types.CheckStatusCode(0)) addExample(map[string]interface{}{"abc": 123}) } diff --git a/venus-devtool/cborgen/main.go b/venus-devtool/cborgen/main.go index b6e07b4ccd..ddbf6e6334 100644 --- a/venus-devtool/cborgen/main.go +++ b/venus-devtool/cborgen/main.go @@ -4,12 +4,11 @@ import ( "log" "path/filepath" - gen "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/venus/venus-shared/chain" "github.com/filecoin-project/venus/venus-shared/libp2p/exchange" "github.com/filecoin-project/venus/venus-shared/libp2p/hello" - "github.com/filecoin-project/venus/venus-shared/paych" + "github.com/filecoin-project/venus/venus-shared/types" + + gen "github.com/whyrusleeping/cbor-gen" ) type genTarget struct { @@ -37,25 +36,27 @@ func main() { }, }, { - dir: "../venus-shared/paych/", + dir: "../venus-shared/types/", types: []interface{}{ - paych.PaymentInfo{}, + types.BlockHeader{}, + types.Ticket{}, + types.ElectionProof{}, + types.BeaconEntry{}, + //types.Message{}, + types.SignedMessage{}, + //types.Actor{}, + types.MessageRoot{}, + types.MessageReceipt{}, + types.BlockMsg{}, + types.ExpTipSet{}, + types.PaymentInfo{}, }, }, { - dir: "../venus-shared/chain/", + dir: "../venus-shared/internal/", types: []interface{}{ - chain.BlockHeader{}, - chain.Ticket{}, - chain.ElectionProof{}, - chain.BeaconEntry{}, - chain.Message{}, - chain.SignedMessage{}, - chain.Actor{}, - chain.MessageRoot{}, - chain.MessageReceipt{}, - chain.BlockMsg{}, - chain.ExpTipSet{}, + types.Actor{}, + types.Message{}, }, }, } diff --git a/venus-devtool/compatible/actors/templates.go b/venus-devtool/compatible/actors/templates.go index b1a297bdee..42de005ee0 100644 --- a/venus-devtool/compatible/actors/templates.go +++ b/venus-devtool/compatible/actors/templates.go @@ -29,7 +29,7 @@ var separatedSuffixes = []string{ var replacers = [][2]string{ { "\"github.com/filecoin-project/lotus/chain/types\"", - "types \"github.com/filecoin-project/venus/venus-shared/chain\"", + "types \"github.com/filecoin-project/venus/venus-shared/internal\"", }, { "github.com/filecoin-project/lotus/chain/actors", diff --git a/venus-shared/actors/builtin/account/actor.go b/venus-shared/actors/builtin/account/actor.go index 1e1ecce9b8..4be33541d5 100644 --- a/venus-shared/actors/builtin/account/actor.go +++ b/venus-shared/actors/builtin/account/actor.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" diff --git a/venus-shared/actors/builtin/account/actor.go.template b/venus-shared/actors/builtin/account/actor.go.template index baf5e19a4b..e746e58ce3 100644 --- a/venus-shared/actors/builtin/account/actor.go.template +++ b/venus-shared/actors/builtin/account/actor.go.template @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" {{range .versions}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" {{end}} diff --git a/venus-shared/actors/builtin/builtin.go b/venus-shared/actors/builtin/builtin.go index 07d256662b..a4adeb8bbf 100644 --- a/venus-shared/actors/builtin/builtin.go +++ b/venus-shared/actors/builtin/builtin.go @@ -32,7 +32,7 @@ import ( "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/venus/venus-shared/actors/adt" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" diff --git a/venus-shared/actors/builtin/builtin.go.template b/venus-shared/actors/builtin/builtin.go.template index 95a7a22426..47ccb0217b 100644 --- a/venus-shared/actors/builtin/builtin.go.template +++ b/venus-shared/actors/builtin/builtin.go.template @@ -16,7 +16,7 @@ import ( "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/venus/venus-shared/actors/adt" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" miner{{.latestVersion}} "github.com/filecoin-project/specs-actors{{import .latestVersion}}actors/builtin/miner" proof{{.latestVersion}} "github.com/filecoin-project/specs-actors{{import .latestVersion}}actors/runtime/proof" diff --git a/venus-shared/actors/builtin/init/actor.go b/venus-shared/actors/builtin/init/actor.go index 0e28713421..b9220d50c2 100644 --- a/venus-shared/actors/builtin/init/actor.go +++ b/venus-shared/actors/builtin/init/actor.go @@ -13,7 +13,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" diff --git a/venus-shared/actors/builtin/init/actor.go.template b/venus-shared/actors/builtin/init/actor.go.template index 1e77072aef..b513c4f758 100644 --- a/venus-shared/actors/builtin/init/actor.go.template +++ b/venus-shared/actors/builtin/init/actor.go.template @@ -13,7 +13,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" {{range .versions}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" diff --git a/venus-shared/actors/builtin/market/actor.go b/venus-shared/actors/builtin/market/actor.go index a7aa665b48..bbfd553ca1 100644 --- a/venus-shared/actors/builtin/market/actor.go +++ b/venus-shared/actors/builtin/market/actor.go @@ -32,7 +32,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) func init() { diff --git a/venus-shared/actors/builtin/market/actor.go.template b/venus-shared/actors/builtin/market/actor.go.template index 06db86f169..d58c8de468 100644 --- a/venus-shared/actors/builtin/market/actor.go.template +++ b/venus-shared/actors/builtin/market/actor.go.template @@ -21,7 +21,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) func init() { diff --git a/venus-shared/actors/builtin/market/state.sep.go.template b/venus-shared/actors/builtin/market/state.sep.go.template index cb4dabb5d5..4559fd6978 100644 --- a/venus-shared/actors/builtin/market/state.sep.go.template +++ b/venus-shared/actors/builtin/market/state.sep.go.template @@ -12,7 +12,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/venus-shared/actors/adt" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" market{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/market" adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" diff --git a/venus-shared/actors/builtin/market/state.v0.go b/venus-shared/actors/builtin/market/state.v0.go index 3cdb209b1f..dfdd229d04 100644 --- a/venus-shared/actors/builtin/market/state.v0.go +++ b/venus-shared/actors/builtin/market/state.v0.go @@ -12,7 +12,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/venus-shared/actors/adt" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" diff --git a/venus-shared/actors/builtin/market/state.v2.go b/venus-shared/actors/builtin/market/state.v2.go index 2f1d4b4a25..150eece54e 100644 --- a/venus-shared/actors/builtin/market/state.v2.go +++ b/venus-shared/actors/builtin/market/state.v2.go @@ -12,7 +12,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/venus-shared/actors/adt" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" diff --git a/venus-shared/actors/builtin/market/state.v3.go b/venus-shared/actors/builtin/market/state.v3.go index 3c9c32a776..e83b33e7ca 100644 --- a/venus-shared/actors/builtin/market/state.v3.go +++ b/venus-shared/actors/builtin/market/state.v3.go @@ -12,7 +12,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/venus-shared/actors/adt" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" diff --git a/venus-shared/actors/builtin/market/state.v4.go b/venus-shared/actors/builtin/market/state.v4.go index 8dcad1a918..7e21a3a6ea 100644 --- a/venus-shared/actors/builtin/market/state.v4.go +++ b/venus-shared/actors/builtin/market/state.v4.go @@ -12,7 +12,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/venus-shared/actors/adt" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" diff --git a/venus-shared/actors/builtin/market/state.v5.go b/venus-shared/actors/builtin/market/state.v5.go index d5081e8ec4..3ac5c1941c 100644 --- a/venus-shared/actors/builtin/market/state.v5.go +++ b/venus-shared/actors/builtin/market/state.v5.go @@ -12,7 +12,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/venus-shared/actors/adt" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" diff --git a/venus-shared/actors/builtin/market/state.v6.go b/venus-shared/actors/builtin/market/state.v6.go index da5bec9b91..090e0c3787 100644 --- a/venus-shared/actors/builtin/market/state.v6.go +++ b/venus-shared/actors/builtin/market/state.v6.go @@ -12,7 +12,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/venus-shared/actors/adt" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" diff --git a/venus-shared/actors/builtin/market/state.v7.go b/venus-shared/actors/builtin/market/state.v7.go index d45c48c810..3915bb6e92 100644 --- a/venus-shared/actors/builtin/market/state.v7.go +++ b/venus-shared/actors/builtin/market/state.v7.go @@ -12,7 +12,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/venus/venus-shared/actors/adt" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" diff --git a/venus-shared/actors/builtin/miner/actor.go b/venus-shared/actors/builtin/miner/actor.go index 2938c896c7..eaa8256ed1 100644 --- a/venus-shared/actors/builtin/miner/actor.go +++ b/venus-shared/actors/builtin/miner/actor.go @@ -19,7 +19,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" diff --git a/venus-shared/actors/builtin/miner/actor.go.template b/venus-shared/actors/builtin/miner/actor.go.template index 1a8b1ce91f..0ac76d62ac 100644 --- a/venus-shared/actors/builtin/miner/actor.go.template +++ b/venus-shared/actors/builtin/miner/actor.go.template @@ -19,7 +19,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" diff --git a/venus-shared/actors/builtin/multisig/actor.go b/venus-shared/actors/builtin/multisig/actor.go index bb1d463043..dcd389ea19 100644 --- a/venus-shared/actors/builtin/multisig/actor.go +++ b/venus-shared/actors/builtin/multisig/actor.go @@ -34,7 +34,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) func init() { diff --git a/venus-shared/actors/builtin/multisig/actor.go.template b/venus-shared/actors/builtin/multisig/actor.go.template index 04c9bfaecb..19d92dfb4c 100644 --- a/venus-shared/actors/builtin/multisig/actor.go.template +++ b/venus-shared/actors/builtin/multisig/actor.go.template @@ -23,7 +23,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) func init() { diff --git a/venus-shared/actors/builtin/multisig/message.sep.go.template b/venus-shared/actors/builtin/multisig/message.sep.go.template index 8ccbe91a25..f53be6c8fe 100644 --- a/venus-shared/actors/builtin/multisig/message.sep.go.template +++ b/venus-shared/actors/builtin/multisig/message.sep.go.template @@ -14,7 +14,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) type message{{.v}} struct{ {{if (ge .v 2)}}message0{{else}}from address.Address{{end}} } diff --git a/venus-shared/actors/builtin/multisig/message.v0.go b/venus-shared/actors/builtin/multisig/message.v0.go index 5bdb018027..6f8be3e0ab 100644 --- a/venus-shared/actors/builtin/multisig/message.v0.go +++ b/venus-shared/actors/builtin/multisig/message.v0.go @@ -14,7 +14,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) type message0 struct{ from address.Address } diff --git a/venus-shared/actors/builtin/multisig/message.v2.go b/venus-shared/actors/builtin/multisig/message.v2.go index 43b781eb12..3457493434 100644 --- a/venus-shared/actors/builtin/multisig/message.v2.go +++ b/venus-shared/actors/builtin/multisig/message.v2.go @@ -14,7 +14,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) type message2 struct{ message0 } diff --git a/venus-shared/actors/builtin/multisig/message.v3.go b/venus-shared/actors/builtin/multisig/message.v3.go index b65de2c3e2..27b0d38110 100644 --- a/venus-shared/actors/builtin/multisig/message.v3.go +++ b/venus-shared/actors/builtin/multisig/message.v3.go @@ -14,7 +14,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) type message3 struct{ message0 } diff --git a/venus-shared/actors/builtin/multisig/message.v4.go b/venus-shared/actors/builtin/multisig/message.v4.go index c0421bad64..f0e70d492c 100644 --- a/venus-shared/actors/builtin/multisig/message.v4.go +++ b/venus-shared/actors/builtin/multisig/message.v4.go @@ -14,7 +14,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) type message4 struct{ message0 } diff --git a/venus-shared/actors/builtin/multisig/message.v5.go b/venus-shared/actors/builtin/multisig/message.v5.go index f4b0315a72..13fbdf8244 100644 --- a/venus-shared/actors/builtin/multisig/message.v5.go +++ b/venus-shared/actors/builtin/multisig/message.v5.go @@ -14,7 +14,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) type message5 struct{ message0 } diff --git a/venus-shared/actors/builtin/multisig/message.v6.go b/venus-shared/actors/builtin/multisig/message.v6.go index f298cf742b..d6af119c08 100644 --- a/venus-shared/actors/builtin/multisig/message.v6.go +++ b/venus-shared/actors/builtin/multisig/message.v6.go @@ -14,7 +14,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) type message6 struct{ message0 } diff --git a/venus-shared/actors/builtin/multisig/message.v7.go b/venus-shared/actors/builtin/multisig/message.v7.go index 770001d4cc..3036b422ed 100644 --- a/venus-shared/actors/builtin/multisig/message.v7.go +++ b/venus-shared/actors/builtin/multisig/message.v7.go @@ -14,7 +14,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) type message7 struct{ message0 } diff --git a/venus-shared/actors/builtin/paych/actor.go b/venus-shared/actors/builtin/paych/actor.go index af65881ddc..aea23f863e 100644 --- a/venus-shared/actors/builtin/paych/actor.go +++ b/venus-shared/actors/builtin/paych/actor.go @@ -34,7 +34,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) func init() { diff --git a/venus-shared/actors/builtin/paych/actor.go.template b/venus-shared/actors/builtin/paych/actor.go.template index f15c72919d..4c8ac0b53a 100644 --- a/venus-shared/actors/builtin/paych/actor.go.template +++ b/venus-shared/actors/builtin/paych/actor.go.template @@ -23,7 +23,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) func init() { diff --git a/venus-shared/actors/builtin/paych/message.sep.go.template b/venus-shared/actors/builtin/paych/message.sep.go.template index 563e3ef712..434534fab3 100644 --- a/venus-shared/actors/builtin/paych/message.sep.go.template +++ b/venus-shared/actors/builtin/paych/message.sep.go.template @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) type message{{.v}} struct{ from address.Address } diff --git a/venus-shared/actors/builtin/paych/message.v0.go b/venus-shared/actors/builtin/paych/message.v0.go index ddf035d5b6..fe24ed0326 100644 --- a/venus-shared/actors/builtin/paych/message.v0.go +++ b/venus-shared/actors/builtin/paych/message.v0.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) type message0 struct{ from address.Address } diff --git a/venus-shared/actors/builtin/paych/message.v2.go b/venus-shared/actors/builtin/paych/message.v2.go index ea168b9d63..18ef864b11 100644 --- a/venus-shared/actors/builtin/paych/message.v2.go +++ b/venus-shared/actors/builtin/paych/message.v2.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) type message2 struct{ from address.Address } diff --git a/venus-shared/actors/builtin/paych/message.v3.go b/venus-shared/actors/builtin/paych/message.v3.go index 6f7c5db2d8..11b7193393 100644 --- a/venus-shared/actors/builtin/paych/message.v3.go +++ b/venus-shared/actors/builtin/paych/message.v3.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) type message3 struct{ from address.Address } diff --git a/venus-shared/actors/builtin/paych/message.v4.go b/venus-shared/actors/builtin/paych/message.v4.go index d89ecda6b0..97fe20c670 100644 --- a/venus-shared/actors/builtin/paych/message.v4.go +++ b/venus-shared/actors/builtin/paych/message.v4.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) type message4 struct{ from address.Address } diff --git a/venus-shared/actors/builtin/paych/message.v5.go b/venus-shared/actors/builtin/paych/message.v5.go index 95046ffa0b..9a82f109a6 100644 --- a/venus-shared/actors/builtin/paych/message.v5.go +++ b/venus-shared/actors/builtin/paych/message.v5.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) type message5 struct{ from address.Address } diff --git a/venus-shared/actors/builtin/paych/message.v6.go b/venus-shared/actors/builtin/paych/message.v6.go index cfbcdf6cfe..8cbfcdf9de 100644 --- a/venus-shared/actors/builtin/paych/message.v6.go +++ b/venus-shared/actors/builtin/paych/message.v6.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) type message6 struct{ from address.Address } diff --git a/venus-shared/actors/builtin/paych/message.v7.go b/venus-shared/actors/builtin/paych/message.v7.go index 5d2f98f9cb..0ba9d72008 100644 --- a/venus-shared/actors/builtin/paych/message.v7.go +++ b/venus-shared/actors/builtin/paych/message.v7.go @@ -12,7 +12,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) type message7 struct{ from address.Address } diff --git a/venus-shared/actors/builtin/power/actor.go b/venus-shared/actors/builtin/power/actor.go index 65b351b038..6161eaa552 100644 --- a/venus-shared/actors/builtin/power/actor.go +++ b/venus-shared/actors/builtin/power/actor.go @@ -15,7 +15,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" diff --git a/venus-shared/actors/builtin/power/actor.go.template b/venus-shared/actors/builtin/power/actor.go.template index a35cd67d07..4d1757bd93 100644 --- a/venus-shared/actors/builtin/power/actor.go.template +++ b/venus-shared/actors/builtin/power/actor.go.template @@ -15,7 +15,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" {{range .versions}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" {{end}} diff --git a/venus-shared/actors/builtin/reward/actor.go b/venus-shared/actors/builtin/reward/actor.go index 528ca7a18d..fe77a1f9b4 100644 --- a/venus-shared/actors/builtin/reward/actor.go +++ b/venus-shared/actors/builtin/reward/actor.go @@ -27,7 +27,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) func init() { diff --git a/venus-shared/actors/builtin/reward/actor.go.template b/venus-shared/actors/builtin/reward/actor.go.template index 547814511c..4d5d41dedc 100644 --- a/venus-shared/actors/builtin/reward/actor.go.template +++ b/venus-shared/actors/builtin/reward/actor.go.template @@ -16,7 +16,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) func init() { diff --git a/venus-shared/actors/builtin/verifreg/actor.go b/venus-shared/actors/builtin/verifreg/actor.go index 190dd4d0ab..6a84337dd2 100644 --- a/venus-shared/actors/builtin/verifreg/actor.go +++ b/venus-shared/actors/builtin/verifreg/actor.go @@ -28,7 +28,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) func init() { diff --git a/venus-shared/actors/builtin/verifreg/actor.go.template b/venus-shared/actors/builtin/verifreg/actor.go.template index 422ada1838..9c096dc9bc 100644 --- a/venus-shared/actors/builtin/verifreg/actor.go.template +++ b/venus-shared/actors/builtin/verifreg/actor.go.template @@ -17,7 +17,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/actors" - types "github.com/filecoin-project/venus/venus-shared/chain" + types "github.com/filecoin-project/venus/venus-shared/internal" ) func init() { diff --git a/venus-shared/api/chain/v0/blockstore.go b/venus-shared/api/chain/v0/blockstore.go index 511e14852d..f8d2768ebf 100644 --- a/venus-shared/api/chain/v0/blockstore.go +++ b/venus-shared/api/chain/v0/blockstore.go @@ -3,14 +3,13 @@ package v0 import ( "context" - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ) type IBlockStore interface { - ChainReadObj(ctx context.Context, cid cid.Cid) ([]byte, error) //perm:read - ChainDeleteObj(ctx context.Context, obj cid.Cid) error //perm:admin - ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) //perm:read - ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (chain2.ObjStat, error) //perm:read + ChainReadObj(ctx context.Context, cid cid.Cid) ([]byte, error) //perm:read + ChainDeleteObj(ctx context.Context, obj cid.Cid) error //perm:admin + ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) //perm:read + ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (types.ObjStat, error) //perm:read } diff --git a/venus-shared/api/chain/v0/chain.go b/venus-shared/api/chain/v0/chain.go index 25b0c16677..29f2fc6f20 100644 --- a/venus-shared/api/chain/v0/chain.go +++ b/venus-shared/api/chain/v0/chain.go @@ -14,8 +14,7 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type IChain interface { @@ -27,85 +26,85 @@ type IChain interface { } type IAccount interface { - StateAccountKey(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (address.Address, error) //perm:read + StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) //perm:read } type IActor interface { - StateGetActor(ctx context.Context, actor address.Address, tsk chain.TipSetKey) (*chain.Actor, error) //perm:read - ListActor(ctx context.Context) (map[address.Address]*chain.Actor, error) //perm:read + StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) //perm:read + ListActor(ctx context.Context) (map[address.Address]*types.Actor, error) //perm:read } type IBeacon interface { - BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*chain.BeaconEntry, error) //perm:read + BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) //perm:read } type IChainInfo interface { BlockTime(ctx context.Context) time.Duration //perm:read - ChainList(ctx context.Context, tsKey chain.TipSetKey, count int) ([]chain.TipSetKey, error) //perm:read - ChainHead(ctx context.Context) (*chain.TipSet, error) //perm:read - ChainSetHead(ctx context.Context, key chain.TipSetKey) error //perm:admin - ChainGetTipSet(ctx context.Context, key chain.TipSetKey) (*chain.TipSet, error) //perm:read - ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk chain.TipSetKey) (*chain.TipSet, error) //perm:read - ChainGetRandomnessFromBeacon(ctx context.Context, key chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read - ChainGetRandomnessFromTickets(ctx context.Context, tsk chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read - ChainGetBlock(ctx context.Context, id cid.Cid) (*chain.BlockHeader, error) //perm:read - ChainGetMessage(ctx context.Context, msgID cid.Cid) (*chain.Message, error) //perm:read - ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*chain2.BlockMessages, error) //perm:read - ChainGetMessagesInTipset(ctx context.Context, key chain.TipSetKey) ([]chain2.Message, error) //perm:read - ChainGetReceipts(ctx context.Context, id cid.Cid) ([]chain.MessageReceipt, error) //perm:read - ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]chain2.Message, error) //perm:read - ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*chain.MessageReceipt, error) //perm:read - StateVerifiedRegistryRootKey(ctx context.Context, tsk chain.TipSetKey) (address.Address, error) //perm:read - StateVerifierStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) //perm:read - ChainNotify(ctx context.Context) (<-chan []*chain2.HeadChange, error) //perm:read - GetFullBlock(ctx context.Context, id cid.Cid) (*chain.FullBlock, error) //perm:read - GetActor(ctx context.Context, addr address.Address) (*chain.Actor, error) //perm:read - GetParentStateRootActor(ctx context.Context, ts *chain.TipSet, addr address.Address) (*chain.Actor, error) //perm:read - GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*chain.BeaconEntry, error) //perm:read - MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*chain2.ChainMessage, error) //perm:read - ProtocolParameters(ctx context.Context) (*chain2.ProtocolParams, error) //perm:read - ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *chain.TipSet) (address.Address, error) //perm:read - StateNetworkName(ctx context.Context) (chain2.NetworkName, error) //perm:read - StateGetReceipt(ctx context.Context, msg cid.Cid, from chain.TipSetKey) (*chain.MessageReceipt, error) //perm:read - StateSearchMsg(ctx context.Context, msg cid.Cid) (*chain2.MsgLookup, error) //perm:read - StateSearchMsgLimited(ctx context.Context, cid cid.Cid, limit abi.ChainEpoch) (*chain2.MsgLookup, error) //perm:read - StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64) (*chain2.MsgLookup, error) //perm:read - StateWaitMsgLimited(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch) (*chain2.MsgLookup, error) //perm:read - StateNetworkVersion(ctx context.Context, tsk chain.TipSetKey) (network.Version, error) //perm:read - VerifyEntry(parent, child *chain.BeaconEntry, height abi.ChainEpoch) bool //perm:read - ChainExport(context.Context, abi.ChainEpoch, bool, chain.TipSetKey) (<-chan []byte, error) //perm:read - ChainGetPath(ctx context.Context, from chain.TipSetKey, to chain.TipSetKey) ([]*chain2.HeadChange, error) //perm:read + ChainList(ctx context.Context, tsKey types.TipSetKey, count int) ([]types.TipSetKey, error) //perm:read + ChainHead(ctx context.Context) (*types.TipSet, error) //perm:read + ChainSetHead(ctx context.Context, key types.TipSetKey) error //perm:admin + ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) //perm:read + ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) //perm:read + ChainGetRandomnessFromBeacon(ctx context.Context, key types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read + ChainGetRandomnessFromTickets(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read + ChainGetBlock(ctx context.Context, id cid.Cid) (*types.BlockHeader, error) //perm:read + ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.Message, error) //perm:read + ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*types.BlockMessages, error) //perm:read + ChainGetMessagesInTipset(ctx context.Context, key types.TipSetKey) ([]types.MessageCID, error) //perm:read + ChainGetReceipts(ctx context.Context, id cid.Cid) ([]types.MessageReceipt, error) //perm:read + ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]types.MessageCID, error) //perm:read + ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) //perm:read + StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) //perm:read + StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) //perm:read + ChainNotify(ctx context.Context) (<-chan []*types.HeadChange, error) //perm:read + GetFullBlock(ctx context.Context, id cid.Cid) (*types.FullBlock, error) //perm:read + GetActor(ctx context.Context, addr address.Address) (*types.Actor, error) //perm:read + GetParentStateRootActor(ctx context.Context, ts *types.TipSet, addr address.Address) (*types.Actor, error) //perm:read + GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*types.BeaconEntry, error) //perm:read + MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*types.ChainMessage, error) //perm:read + ProtocolParameters(ctx context.Context) (*types.ProtocolParams, error) //perm:read + ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) //perm:read + StateNetworkName(ctx context.Context) (types.NetworkName, error) //perm:read + StateGetReceipt(ctx context.Context, msg cid.Cid, from types.TipSetKey) (*types.MessageReceipt, error) //perm:read + StateSearchMsg(ctx context.Context, msg cid.Cid) (*types.MsgLookup, error) //perm:read + StateSearchMsgLimited(ctx context.Context, cid cid.Cid, limit abi.ChainEpoch) (*types.MsgLookup, error) //perm:read + StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64) (*types.MsgLookup, error) //perm:read + StateWaitMsgLimited(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch) (*types.MsgLookup, error) //perm:read + StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) //perm:read + VerifyEntry(parent, child *types.BeaconEntry, height abi.ChainEpoch) bool //perm:read + ChainExport(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []byte, error) //perm:read + ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*types.HeadChange, error) //perm:read } type IMinerState interface { - StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk chain.TipSetKey) (bool, error) //perm:read - StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) //perm:read - StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorOnChainInfo, error) //perm:read - StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorLocation, error) //perm:read - StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (abi.SectorSize, error) //perm:read - StateMinerInfo(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (miner.MinerInfo, error) //perm:read - StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (address.Address, error) //perm:read - StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (bitfield.BitField, error) //perm:read - StateMinerFaults(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (bitfield.BitField, error) //perm:read - StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (*dline.Info, error) //perm:read - StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk chain.TipSetKey) ([]chain2.Partition, error) //perm:read - StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]chain2.Deadline, error) //perm:read - StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) //perm:read - StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk chain.TipSetKey) (*chain2.MarketDeal, error) //perm:read - StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) //perm:read - StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) //perm:read - StateVMCirculatingSupplyInternal(ctx context.Context, tsk chain.TipSetKey) (chain.CirculatingSupply, error) //perm:read - StateCirculatingSupply(ctx context.Context, tsk chain.TipSetKey) (abi.TokenAmount, error) //perm:read - StateMarketDeals(ctx context.Context, tsk chain.TipSetKey) (map[string]chain2.MarketDeal, error) //perm:read - StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) //perm:read - StateLookupID(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (address.Address, error) //perm:read - StateListMiners(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) //perm:read - StateListActors(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) //perm:read - StateMinerPower(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*chain2.MinerPower, error) //perm:read - StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (big.Int, error) //perm:read - StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorExpiration, error) //perm:read - StateMinerSectorCount(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (chain2.MinerSectors, error) //perm:read - StateMarketBalance(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (chain2.MarketBalance, error) //perm:read - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk chain.TipSetKey) (chain2.DealCollateralBounds, error) //perm:read - StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) //perm:read + StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) //perm:read + StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) //perm:read + StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) //perm:read + StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorLocation, error) //perm:read + StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (abi.SectorSize, error) //perm:read + StateMinerInfo(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) //perm:read + StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (address.Address, error) //perm:read + StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) //perm:read + StateMinerFaults(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) //perm:read + StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) //perm:read + StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]types.Partition, error) //perm:read + StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]types.Deadline, error) //perm:read + StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) //perm:read + StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.MarketDeal, error) //perm:read + StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) //perm:read + StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) //perm:read + StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) //perm:read + StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) //perm:read + StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) //perm:read + StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) //perm:read + StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) //perm:read + StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) //perm:read + StateListActors(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) //perm:read + StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.MinerPower, error) //perm:read + StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) //perm:read + StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorExpiration, error) //perm:read + StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MinerSectors, error) //perm:read + StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MarketBalance, error) //perm:read + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (types.DealCollateralBounds, error) //perm:read + StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) //perm:read } diff --git a/venus-shared/api/chain/v0/market.go b/venus-shared/api/chain/v0/market.go index 81c6eb75fb..cc83965a0f 100644 --- a/venus-shared/api/chain/v0/market.go +++ b/venus-shared/api/chain/v0/market.go @@ -3,10 +3,9 @@ package v0 import ( "context" - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type IMarket interface { - StateMarketParticipants(ctx context.Context, tsk chain.TipSetKey) (map[string]chain2.MarketBalance, error) //perm:read + StateMarketParticipants(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketBalance, error) //perm:read } diff --git a/venus-shared/api/chain/v0/mining.go b/venus-shared/api/chain/v0/mining.go index 99da702aa6..7bdd8caa52 100644 --- a/venus-shared/api/chain/v0/mining.go +++ b/venus-shared/api/chain/v0/mining.go @@ -6,11 +6,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type IMining interface { - MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk chain.TipSetKey) (*chain2.MiningBaseInfo, error) //perm:read - MinerCreateBlock(ctx context.Context, bt *chain2.BlockTemplate) (*chain.BlockMsg, error) //perm:write + MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*types.MiningBaseInfo, error) //perm:read + MinerCreateBlock(ctx context.Context, bt *types.BlockTemplate) (*types.BlockMsg, error) //perm:write } diff --git a/venus-shared/api/chain/v0/mock/full.go b/venus-shared/api/chain/v0/mock/full.go index 09d22e588f..76b5edc010 100644 --- a/venus-shared/api/chain/v0/mock/full.go +++ b/venus-shared/api/chain/v0/mock/full.go @@ -19,12 +19,8 @@ import ( miner "github.com/filecoin-project/specs-actors/actors/builtin/miner" paych "github.com/filecoin-project/specs-actors/actors/builtin/paych" miner0 "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - chain "github.com/filecoin-project/venus/venus-shared/api/chain" - chain0 "github.com/filecoin-project/venus/venus-shared/chain" - net "github.com/filecoin-project/venus/venus-shared/libp2p/net" - messagepool "github.com/filecoin-project/venus/venus-shared/messagepool" - paych0 "github.com/filecoin-project/venus/venus-shared/paych" - wallet "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/filecoin-project/venus/venus-shared/types" + chain0 "github.com/filecoin-project/venus/venus-shared/types" gomock "github.com/golang/mock/gomock" cid "github.com/ipfs/go-cid" metrics "github.com/libp2p/go-libp2p-core/metrics" @@ -144,10 +140,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetBlock(arg0, arg1 interface{}) *gomoc } // ChainGetBlockMessages mocks base method. -func (m *MockFullNode) ChainGetBlockMessages(arg0 context.Context, arg1 cid.Cid) (*chain.BlockMessages, error) { +func (m *MockFullNode) ChainGetBlockMessages(arg0 context.Context, arg1 cid.Cid) (*types.BlockMessages, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetBlockMessages", arg0, arg1) - ret0, _ := ret[0].(*chain.BlockMessages) + ret0, _ := ret[0].(*types.BlockMessages) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -174,10 +170,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetMessage(arg0, arg1 interface{}) *gom } // ChainGetMessagesInTipset mocks base method. -func (m *MockFullNode) ChainGetMessagesInTipset(arg0 context.Context, arg1 chain0.TipSetKey) ([]chain.Message, error) { +func (m *MockFullNode) ChainGetMessagesInTipset(arg0 context.Context, arg1 chain0.TipSetKey) ([]types.Message, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetMessagesInTipset", arg0, arg1) - ret0, _ := ret[0].([]chain.Message) + ret0, _ := ret[0].([]types.Message) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -189,10 +185,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetMessagesInTipset(arg0, arg1 interfac } // ChainGetParentMessages mocks base method. -func (m *MockFullNode) ChainGetParentMessages(arg0 context.Context, arg1 cid.Cid) ([]chain.Message, error) { +func (m *MockFullNode) ChainGetParentMessages(arg0 context.Context, arg1 cid.Cid) ([]types.Message, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetParentMessages", arg0, arg1) - ret0, _ := ret[0].([]chain.Message) + ret0, _ := ret[0].([]types.Message) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -219,10 +215,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetParentReceipts(arg0, arg1 interface{ } // ChainGetPath mocks base method. -func (m *MockFullNode) ChainGetPath(arg0 context.Context, arg1, arg2 chain0.TipSetKey) ([]*chain.HeadChange, error) { +func (m *MockFullNode) ChainGetPath(arg0 context.Context, arg1, arg2 chain0.TipSetKey) ([]*types.HeadChange, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetPath", arg0, arg1, arg2) - ret0, _ := ret[0].([]*chain.HeadChange) + ret0, _ := ret[0].([]*types.HeadChange) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -354,10 +350,10 @@ func (mr *MockFullNodeMockRecorder) ChainList(arg0, arg1, arg2 interface{}) *gom } // ChainNotify mocks base method. -func (m *MockFullNode) ChainNotify(arg0 context.Context) (<-chan []*chain.HeadChange, error) { +func (m *MockFullNode) ChainNotify(arg0 context.Context) (<-chan []*types.HeadChange, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainNotify", arg0) - ret0, _ := ret[0].(<-chan []*chain.HeadChange) + ret0, _ := ret[0].(<-chan []*types.HeadChange) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -398,10 +394,10 @@ func (mr *MockFullNodeMockRecorder) ChainSetHead(arg0, arg1 interface{}) *gomock } // ChainStatObj mocks base method. -func (m *MockFullNode) ChainStatObj(arg0 context.Context, arg1, arg2 cid.Cid) (chain.ObjStat, error) { +func (m *MockFullNode) ChainStatObj(arg0 context.Context, arg1, arg2 cid.Cid) (types.ObjStat, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainStatObj", arg0, arg1, arg2) - ret0, _ := ret[0].(chain.ObjStat) + ret0, _ := ret[0].(types.ObjStat) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -456,10 +452,10 @@ func (mr *MockFullNodeMockRecorder) Concurrent(arg0 interface{}) *gomock.Call { } // GasBatchEstimateMessageGas mocks base method. -func (m *MockFullNode) GasBatchEstimateMessageGas(arg0 context.Context, arg1 []*chain.EstimateMessage, arg2 uint64, arg3 chain0.TipSetKey) ([]*chain.EstimateResult, error) { +func (m *MockFullNode) GasBatchEstimateMessageGas(arg0 context.Context, arg1 []*types.EstimateMessage, arg2 uint64, arg3 chain0.TipSetKey) ([]*types.EstimateResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GasBatchEstimateMessageGas", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].([]*chain.EstimateResult) + ret0, _ := ret[0].([]*types.EstimateResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -516,7 +512,7 @@ func (mr *MockFullNodeMockRecorder) GasEstimateGasPremium(arg0, arg1, arg2, arg3 } // GasEstimateMessageGas mocks base method. -func (m *MockFullNode) GasEstimateMessageGas(arg0 context.Context, arg1 *chain0.Message, arg2 *chain.MessageSendSpec, arg3 chain0.TipSetKey) (*chain0.Message, error) { +func (m *MockFullNode) GasEstimateMessageGas(arg0 context.Context, arg1 *chain0.Message, arg2 *types.MessageSendSpec, arg3 chain0.TipSetKey) (*chain0.Message, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GasEstimateMessageGas", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*chain0.Message) @@ -634,10 +630,10 @@ func (mr *MockFullNodeMockRecorder) LockWallet(arg0 interface{}) *gomock.Call { } // MessageWait mocks base method. -func (m *MockFullNode) MessageWait(arg0 context.Context, arg1 cid.Cid, arg2, arg3 abi.ChainEpoch) (*chain.ChainMessage, error) { +func (m *MockFullNode) MessageWait(arg0 context.Context, arg1 cid.Cid, arg2, arg3 abi.ChainEpoch) (*types.ChainMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MessageWait", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain.ChainMessage) + ret0, _ := ret[0].(*types.ChainMessage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -649,7 +645,7 @@ func (mr *MockFullNodeMockRecorder) MessageWait(arg0, arg1, arg2, arg3 interface } // MinerCreateBlock mocks base method. -func (m *MockFullNode) MinerCreateBlock(arg0 context.Context, arg1 *chain.BlockTemplate) (*chain0.BlockMsg, error) { +func (m *MockFullNode) MinerCreateBlock(arg0 context.Context, arg1 *types.BlockTemplate) (*chain0.BlockMsg, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MinerCreateBlock", arg0, arg1) ret0, _ := ret[0].(*chain0.BlockMsg) @@ -664,10 +660,10 @@ func (mr *MockFullNodeMockRecorder) MinerCreateBlock(arg0, arg1 interface{}) *go } // MinerGetBaseInfo mocks base method. -func (m *MockFullNode) MinerGetBaseInfo(arg0 context.Context, arg1 address.Address, arg2 abi.ChainEpoch, arg3 chain0.TipSetKey) (*chain.MiningBaseInfo, error) { +func (m *MockFullNode) MinerGetBaseInfo(arg0 context.Context, arg1 address.Address, arg2 abi.ChainEpoch, arg3 chain0.TipSetKey) (*types.MiningBaseInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MinerGetBaseInfo", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain.MiningBaseInfo) + ret0, _ := ret[0].(*types.MiningBaseInfo) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -694,7 +690,7 @@ func (mr *MockFullNodeMockRecorder) MpoolBatchPush(arg0, arg1 interface{}) *gomo } // MpoolBatchPushMessage mocks base method. -func (m *MockFullNode) MpoolBatchPushMessage(arg0 context.Context, arg1 []*chain0.Message, arg2 *chain.MessageSendSpec) ([]*chain0.SignedMessage, error) { +func (m *MockFullNode) MpoolBatchPushMessage(arg0 context.Context, arg1 []*chain0.Message, arg2 *types.MessageSendSpec) ([]*chain0.SignedMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolBatchPushMessage", arg0, arg1, arg2) ret0, _ := ret[0].([]*chain0.SignedMessage) @@ -752,10 +748,10 @@ func (mr *MockFullNodeMockRecorder) MpoolDeleteByAdress(arg0, arg1 interface{}) } // MpoolGetConfig mocks base method. -func (m *MockFullNode) MpoolGetConfig(arg0 context.Context) (*messagepool.MpoolConfig, error) { +func (m *MockFullNode) MpoolGetConfig(arg0 context.Context) (*chain0.MpoolConfig, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolGetConfig", arg0) - ret0, _ := ret[0].(*messagepool.MpoolConfig) + ret0, _ := ret[0].(*chain0.MpoolConfig) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -840,7 +836,7 @@ func (mr *MockFullNodeMockRecorder) MpoolPush(arg0, arg1 interface{}) *gomock.Ca } // MpoolPushMessage mocks base method. -func (m *MockFullNode) MpoolPushMessage(arg0 context.Context, arg1 *chain0.Message, arg2 *chain.MessageSendSpec) (*chain0.SignedMessage, error) { +func (m *MockFullNode) MpoolPushMessage(arg0 context.Context, arg1 *chain0.Message, arg2 *types.MessageSendSpec) (*chain0.SignedMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolPushMessage", arg0, arg1, arg2) ret0, _ := ret[0].(*chain0.SignedMessage) @@ -900,7 +896,7 @@ func (mr *MockFullNodeMockRecorder) MpoolSelects(arg0, arg1, arg2 interface{}) * } // MpoolSetConfig mocks base method. -func (m *MockFullNode) MpoolSetConfig(arg0 context.Context, arg1 *messagepool.MpoolConfig) error { +func (m *MockFullNode) MpoolSetConfig(arg0 context.Context, arg1 *chain0.MpoolConfig) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolSetConfig", arg0, arg1) ret0, _ := ret[0].(error) @@ -914,10 +910,10 @@ func (mr *MockFullNodeMockRecorder) MpoolSetConfig(arg0, arg1 interface{}) *gomo } // MpoolSub mocks base method. -func (m *MockFullNode) MpoolSub(arg0 context.Context) (<-chan messagepool.MpoolUpdate, error) { +func (m *MockFullNode) MpoolSub(arg0 context.Context) (<-chan chain0.MpoolUpdate, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolSub", arg0) - ret0, _ := ret[0].(<-chan messagepool.MpoolUpdate) + ret0, _ := ret[0].(<-chan chain0.MpoolUpdate) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1154,10 +1150,10 @@ func (mr *MockFullNodeMockRecorder) NetAddrsListen(arg0 interface{}) *gomock.Cal } // NetworkConnect mocks base method. -func (m *MockFullNode) NetworkConnect(arg0 context.Context, arg1 []string) (<-chan net.ConnectionResult, error) { +func (m *MockFullNode) NetworkConnect(arg0 context.Context, arg1 []string) (<-chan chain0.ConnectionResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NetworkConnect", arg0, arg1) - ret0, _ := ret[0].(<-chan net.ConnectionResult) + ret0, _ := ret[0].(<-chan chain0.ConnectionResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1255,10 +1251,10 @@ func (mr *MockFullNodeMockRecorder) NetworkGetPeerID(arg0 interface{}) *gomock.C } // NetworkPeers mocks base method. -func (m *MockFullNode) NetworkPeers(arg0 context.Context, arg1, arg2, arg3 bool) (*net.SwarmConnInfos, error) { +func (m *MockFullNode) NetworkPeers(arg0 context.Context, arg1, arg2, arg3 bool) (*chain0.SwarmConnInfos, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NetworkPeers", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*net.SwarmConnInfos) + ret0, _ := ret[0].(*chain0.SwarmConnInfos) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1285,10 +1281,10 @@ func (mr *MockFullNodeMockRecorder) PaychAllocateLane(arg0, arg1 interface{}) *g } // PaychAvailableFunds mocks base method. -func (m *MockFullNode) PaychAvailableFunds(arg0 context.Context, arg1 address.Address) (*chain.ChannelAvailableFunds, error) { +func (m *MockFullNode) PaychAvailableFunds(arg0 context.Context, arg1 address.Address) (*types.ChannelAvailableFunds, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychAvailableFunds", arg0, arg1) - ret0, _ := ret[0].(*chain.ChannelAvailableFunds) + ret0, _ := ret[0].(*types.ChannelAvailableFunds) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1300,10 +1296,10 @@ func (mr *MockFullNodeMockRecorder) PaychAvailableFunds(arg0, arg1 interface{}) } // PaychAvailableFundsByFromTo mocks base method. -func (m *MockFullNode) PaychAvailableFundsByFromTo(arg0 context.Context, arg1, arg2 address.Address) (*chain.ChannelAvailableFunds, error) { +func (m *MockFullNode) PaychAvailableFundsByFromTo(arg0 context.Context, arg1, arg2 address.Address) (*types.ChannelAvailableFunds, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychAvailableFundsByFromTo", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain.ChannelAvailableFunds) + ret0, _ := ret[0].(*types.ChannelAvailableFunds) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1330,10 +1326,10 @@ func (mr *MockFullNodeMockRecorder) PaychCollect(arg0, arg1 interface{}) *gomock } // PaychGet mocks base method. -func (m *MockFullNode) PaychGet(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int) (*paych0.ChannelInfo, error) { +func (m *MockFullNode) PaychGet(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int) (*chain0.ChannelInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychGet", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*paych0.ChannelInfo) + ret0, _ := ret[0].(*chain0.ChannelInfo) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1375,10 +1371,10 @@ func (mr *MockFullNodeMockRecorder) PaychList(arg0 interface{}) *gomock.Call { } // PaychNewPayment mocks base method. -func (m *MockFullNode) PaychNewPayment(arg0 context.Context, arg1, arg2 address.Address, arg3 []paych0.VoucherSpec) (*paych0.PaymentInfo, error) { +func (m *MockFullNode) PaychNewPayment(arg0 context.Context, arg1, arg2 address.Address, arg3 []chain0.VoucherSpec) (*chain0.PaymentInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychNewPayment", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*paych0.PaymentInfo) + ret0, _ := ret[0].(*chain0.PaymentInfo) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1405,10 +1401,10 @@ func (mr *MockFullNodeMockRecorder) PaychSettle(arg0, arg1 interface{}) *gomock. } // PaychStatus mocks base method. -func (m *MockFullNode) PaychStatus(arg0 context.Context, arg1 address.Address) (*paych0.Status, error) { +func (m *MockFullNode) PaychStatus(arg0 context.Context, arg1 address.Address) (*chain0.Status, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychStatus", arg0, arg1) - ret0, _ := ret[0].(*paych0.Status) + ret0, _ := ret[0].(*chain0.Status) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1464,10 +1460,10 @@ func (mr *MockFullNodeMockRecorder) PaychVoucherCheckValid(arg0, arg1, arg2 inte } // PaychVoucherCreate mocks base method. -func (m *MockFullNode) PaychVoucherCreate(arg0 context.Context, arg1 address.Address, arg2 big.Int, arg3 uint64) (*paych0.VoucherCreateResult, error) { +func (m *MockFullNode) PaychVoucherCreate(arg0 context.Context, arg1 address.Address, arg2 big.Int, arg3 uint64) (*chain0.VoucherCreateResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychVoucherCreate", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*paych0.VoucherCreateResult) + ret0, _ := ret[0].(*chain0.VoucherCreateResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1509,10 +1505,10 @@ func (mr *MockFullNodeMockRecorder) PaychVoucherSubmit(arg0, arg1, arg2, arg3, a } // ProtocolParameters mocks base method. -func (m *MockFullNode) ProtocolParameters(arg0 context.Context) (*chain.ProtocolParams, error) { +func (m *MockFullNode) ProtocolParameters(arg0 context.Context) (*types.ProtocolParams, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ProtocolParameters", arg0) - ret0, _ := ret[0].(*chain.ProtocolParams) + ret0, _ := ret[0].(*types.ProtocolParams) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1582,10 +1578,10 @@ func (mr *MockFullNodeMockRecorder) StateAccountKey(arg0, arg1, arg2 interface{} } // StateCall mocks base method. -func (m *MockFullNode) StateCall(arg0 context.Context, arg1 *chain0.Message, arg2 chain0.TipSetKey) (*chain.InvocResult, error) { +func (m *MockFullNode) StateCall(arg0 context.Context, arg1 *chain0.Message, arg2 chain0.TipSetKey) (*types.InvocResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateCall", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain.InvocResult) + ret0, _ := ret[0].(*types.InvocResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1612,10 +1608,10 @@ func (mr *MockFullNodeMockRecorder) StateCirculatingSupply(arg0, arg1 interface{ } // StateDealProviderCollateralBounds mocks base method. -func (m *MockFullNode) StateDealProviderCollateralBounds(arg0 context.Context, arg1 abi.PaddedPieceSize, arg2 bool, arg3 chain0.TipSetKey) (chain.DealCollateralBounds, error) { +func (m *MockFullNode) StateDealProviderCollateralBounds(arg0 context.Context, arg1 abi.PaddedPieceSize, arg2 bool, arg3 chain0.TipSetKey) (types.DealCollateralBounds, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateDealProviderCollateralBounds", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(chain.DealCollateralBounds) + ret0, _ := ret[0].(types.DealCollateralBounds) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1702,10 +1698,10 @@ func (mr *MockFullNodeMockRecorder) StateLookupID(arg0, arg1, arg2 interface{}) } // StateMarketBalance mocks base method. -func (m *MockFullNode) StateMarketBalance(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (chain.MarketBalance, error) { +func (m *MockFullNode) StateMarketBalance(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (types.MarketBalance, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketBalance", arg0, arg1, arg2) - ret0, _ := ret[0].(chain.MarketBalance) + ret0, _ := ret[0].(types.MarketBalance) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1717,10 +1713,10 @@ func (mr *MockFullNodeMockRecorder) StateMarketBalance(arg0, arg1, arg2 interfac } // StateMarketDeals mocks base method. -func (m *MockFullNode) StateMarketDeals(arg0 context.Context, arg1 chain0.TipSetKey) (map[string]chain.MarketDeal, error) { +func (m *MockFullNode) StateMarketDeals(arg0 context.Context, arg1 chain0.TipSetKey) (map[string]types.MarketDeal, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketDeals", arg0, arg1) - ret0, _ := ret[0].(map[string]chain.MarketDeal) + ret0, _ := ret[0].(map[string]types.MarketDeal) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1732,10 +1728,10 @@ func (mr *MockFullNodeMockRecorder) StateMarketDeals(arg0, arg1 interface{}) *go } // StateMarketParticipants mocks base method. -func (m *MockFullNode) StateMarketParticipants(arg0 context.Context, arg1 chain0.TipSetKey) (map[string]chain.MarketBalance, error) { +func (m *MockFullNode) StateMarketParticipants(arg0 context.Context, arg1 chain0.TipSetKey) (map[string]types.MarketBalance, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketParticipants", arg0, arg1) - ret0, _ := ret[0].(map[string]chain.MarketBalance) + ret0, _ := ret[0].(map[string]types.MarketBalance) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1747,10 +1743,10 @@ func (mr *MockFullNodeMockRecorder) StateMarketParticipants(arg0, arg1 interface } // StateMarketStorageDeal mocks base method. -func (m *MockFullNode) StateMarketStorageDeal(arg0 context.Context, arg1 abi.DealID, arg2 chain0.TipSetKey) (*chain.MarketDeal, error) { +func (m *MockFullNode) StateMarketStorageDeal(arg0 context.Context, arg1 abi.DealID, arg2 chain0.TipSetKey) (*types.MarketDeal, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketStorageDeal", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain.MarketDeal) + ret0, _ := ret[0].(*types.MarketDeal) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1792,10 +1788,10 @@ func (mr *MockFullNodeMockRecorder) StateMinerAvailableBalance(arg0, arg1, arg2 } // StateMinerDeadlines mocks base method. -func (m *MockFullNode) StateMinerDeadlines(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) ([]chain.Deadline, error) { +func (m *MockFullNode) StateMinerDeadlines(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) ([]types.Deadline, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerDeadlines", arg0, arg1, arg2) - ret0, _ := ret[0].([]chain.Deadline) + ret0, _ := ret[0].([]types.Deadline) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1852,10 +1848,10 @@ func (mr *MockFullNodeMockRecorder) StateMinerInitialPledgeCollateral(arg0, arg1 } // StateMinerPartitions mocks base method. -func (m *MockFullNode) StateMinerPartitions(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 chain0.TipSetKey) ([]chain.Partition, error) { +func (m *MockFullNode) StateMinerPartitions(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 chain0.TipSetKey) ([]types.Partition, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerPartitions", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].([]chain.Partition) + ret0, _ := ret[0].([]types.Partition) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1867,10 +1863,10 @@ func (mr *MockFullNodeMockRecorder) StateMinerPartitions(arg0, arg1, arg2, arg3 } // StateMinerPower mocks base method. -func (m *MockFullNode) StateMinerPower(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*chain.MinerPower, error) { +func (m *MockFullNode) StateMinerPower(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*types.MinerPower, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerPower", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain.MinerPower) + ret0, _ := ret[0].(*types.MinerPower) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1942,10 +1938,10 @@ func (mr *MockFullNodeMockRecorder) StateMinerSectorAllocated(arg0, arg1, arg2, } // StateMinerSectorCount mocks base method. -func (m *MockFullNode) StateMinerSectorCount(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (chain.MinerSectors, error) { +func (m *MockFullNode) StateMinerSectorCount(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (types.MinerSectors, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerSectorCount", arg0, arg1, arg2) - ret0, _ := ret[0].(chain.MinerSectors) + ret0, _ := ret[0].(types.MinerSectors) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2002,10 +1998,10 @@ func (mr *MockFullNodeMockRecorder) StateMinerWorkerAddress(arg0, arg1, arg2 int } // StateNetworkName mocks base method. -func (m *MockFullNode) StateNetworkName(arg0 context.Context) (chain.NetworkName, error) { +func (m *MockFullNode) StateNetworkName(arg0 context.Context) (types.NetworkName, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateNetworkName", arg0) - ret0, _ := ret[0].(chain.NetworkName) + ret0, _ := ret[0].(types.NetworkName) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2032,10 +2028,10 @@ func (mr *MockFullNodeMockRecorder) StateNetworkVersion(arg0, arg1 interface{}) } // StateSearchMsg mocks base method. -func (m *MockFullNode) StateSearchMsg(arg0 context.Context, arg1 cid.Cid) (*chain.MsgLookup, error) { +func (m *MockFullNode) StateSearchMsg(arg0 context.Context, arg1 cid.Cid) (*types.MsgLookup, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateSearchMsg", arg0, arg1) - ret0, _ := ret[0].(*chain.MsgLookup) + ret0, _ := ret[0].(*types.MsgLookup) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2047,10 +2043,10 @@ func (mr *MockFullNodeMockRecorder) StateSearchMsg(arg0, arg1 interface{}) *gomo } // StateSearchMsgLimited mocks base method. -func (m *MockFullNode) StateSearchMsgLimited(arg0 context.Context, arg1 cid.Cid, arg2 abi.ChainEpoch) (*chain.MsgLookup, error) { +func (m *MockFullNode) StateSearchMsgLimited(arg0 context.Context, arg1 cid.Cid, arg2 abi.ChainEpoch) (*types.MsgLookup, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateSearchMsgLimited", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain.MsgLookup) + ret0, _ := ret[0].(*types.MsgLookup) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2182,10 +2178,10 @@ func (mr *MockFullNodeMockRecorder) StateVerifierStatus(arg0, arg1, arg2 interfa } // StateWaitMsg mocks base method. -func (m *MockFullNode) StateWaitMsg(arg0 context.Context, arg1 cid.Cid, arg2 uint64) (*chain.MsgLookup, error) { +func (m *MockFullNode) StateWaitMsg(arg0 context.Context, arg1 cid.Cid, arg2 uint64) (*types.MsgLookup, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateWaitMsg", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain.MsgLookup) + ret0, _ := ret[0].(*types.MsgLookup) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2197,10 +2193,10 @@ func (mr *MockFullNodeMockRecorder) StateWaitMsg(arg0, arg1, arg2 interface{}) * } // StateWaitMsgLimited mocks base method. -func (m *MockFullNode) StateWaitMsgLimited(arg0 context.Context, arg1 cid.Cid, arg2 uint64, arg3 abi.ChainEpoch) (*chain.MsgLookup, error) { +func (m *MockFullNode) StateWaitMsgLimited(arg0 context.Context, arg1 cid.Cid, arg2 uint64, arg3 abi.ChainEpoch) (*types.MsgLookup, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateWaitMsgLimited", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain.MsgLookup) + ret0, _ := ret[0].(*types.MsgLookup) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2212,10 +2208,10 @@ func (mr *MockFullNodeMockRecorder) StateWaitMsgLimited(arg0, arg1, arg2, arg3 i } // SyncState mocks base method. -func (m *MockFullNode) SyncState(arg0 context.Context) (*chain.SyncState, error) { +func (m *MockFullNode) SyncState(arg0 context.Context) (*types.SyncState, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SyncState", arg0) - ret0, _ := ret[0].(*chain.SyncState) + ret0, _ := ret[0].(*types.SyncState) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2241,10 +2237,10 @@ func (mr *MockFullNodeMockRecorder) SyncSubmitBlock(arg0, arg1 interface{}) *gom } // SyncerTracker mocks base method. -func (m *MockFullNode) SyncerTracker(arg0 context.Context) *chain.TargetTracker { +func (m *MockFullNode) SyncerTracker(arg0 context.Context) *types.TargetTracker { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SyncerTracker", arg0) - ret0, _ := ret[0].(*chain.TargetTracker) + ret0, _ := ret[0].(*types.TargetTracker) return ret0 } @@ -2298,10 +2294,10 @@ func (mr *MockFullNodeMockRecorder) VerifyEntry(arg0, arg1, arg2 interface{}) *g } // Version mocks base method. -func (m *MockFullNode) Version(arg0 context.Context) (chain.Version, error) { +func (m *MockFullNode) Version(arg0 context.Context) (types.Version, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Version", arg0) - ret0, _ := ret[0].(chain.Version) + ret0, _ := ret[0].(types.Version) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2357,10 +2353,10 @@ func (mr *MockFullNodeMockRecorder) WalletDefaultAddress(arg0 interface{}) *gomo } // WalletExport mocks base method. -func (m *MockFullNode) WalletExport(arg0 context.Context, arg1 address.Address, arg2 string) (*wallet.KeyInfo, error) { +func (m *MockFullNode) WalletExport(arg0 context.Context, arg1 address.Address, arg2 string) (*chain0.KeyInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WalletExport", arg0, arg1, arg2) - ret0, _ := ret[0].(*wallet.KeyInfo) + ret0, _ := ret[0].(*chain0.KeyInfo) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2387,7 +2383,7 @@ func (mr *MockFullNodeMockRecorder) WalletHas(arg0, arg1 interface{}) *gomock.Ca } // WalletImport mocks base method. -func (m *MockFullNode) WalletImport(arg0 context.Context, arg1 *wallet.KeyInfo) (address.Address, error) { +func (m *MockFullNode) WalletImport(arg0 context.Context, arg1 *chain0.KeyInfo) (address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WalletImport", arg0, arg1) ret0, _ := ret[0].(address.Address) @@ -2431,7 +2427,7 @@ func (mr *MockFullNodeMockRecorder) WalletSetDefault(arg0, arg1 interface{}) *go } // WalletSign mocks base method. -func (m *MockFullNode) WalletSign(arg0 context.Context, arg1 address.Address, arg2 []byte, arg3 wallet.MsgMeta) (*crypto.Signature, error) { +func (m *MockFullNode) WalletSign(arg0 context.Context, arg1 address.Address, arg2 []byte, arg3 chain0.MsgMeta) (*crypto.Signature, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WalletSign", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*crypto.Signature) diff --git a/venus-shared/api/chain/v0/mpool.go b/venus-shared/api/chain/v0/mpool.go index eb867dcc3f..911e72a9f4 100644 --- a/venus-shared/api/chain/v0/mpool.go +++ b/venus-shared/api/chain/v0/mpool.go @@ -7,32 +7,30 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/messagepool" + "github.com/filecoin-project/venus/venus-shared/types" ) type IMessagePool interface { - MpoolDeleteByAdress(ctx context.Context, addr address.Address) error //perm:admin - MpoolPublishByAddr(context.Context, address.Address) error //perm:admin - MpoolPublishMessage(ctx context.Context, smsg *chain.SignedMessage) error //perm:admin - MpoolPush(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) //perm:write - MpoolGetConfig(context.Context) (*messagepool.MpoolConfig, error) //perm:read - MpoolSetConfig(ctx context.Context, cfg *messagepool.MpoolConfig) error //perm:admin - MpoolSelect(context.Context, chain.TipSetKey, float64) ([]*chain.SignedMessage, error) //perm:read - MpoolSelects(context.Context, chain.TipSetKey, []float64) ([][]*chain.SignedMessage, error) //perm:read - MpoolPending(ctx context.Context, tsk chain.TipSetKey) ([]*chain.SignedMessage, error) //perm:read - MpoolClear(ctx context.Context, local bool) error //perm:write - MpoolPushUntrusted(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) //perm:write - MpoolPushMessage(ctx context.Context, msg *chain.Message, spec *chain2.MessageSendSpec) (*chain.SignedMessage, error) //perm:sign - MpoolBatchPush(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) //perm:write - MpoolBatchPushUntrusted(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) //perm:write - MpoolBatchPushMessage(ctx context.Context, msgs []*chain.Message, spec *chain2.MessageSendSpec) ([]*chain.SignedMessage, error) //perm:sign - MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) //perm:read - MpoolSub(ctx context.Context) (<-chan messagepool.MpoolUpdate, error) //perm:read - GasEstimateMessageGas(ctx context.Context, msg *chain.Message, spec *chain2.MessageSendSpec, tsk chain.TipSetKey) (*chain.Message, error) //perm:read - GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*chain2.EstimateMessage, fromNonce uint64, tsk chain.TipSetKey) ([]*chain2.EstimateResult, error) //perm:read - GasEstimateFeeCap(ctx context.Context, msg *chain.Message, maxqueueblks int64, tsk chain.TipSetKey) (big.Int, error) //perm:read - GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk chain.TipSetKey) (big.Int, error) //perm:read - GasEstimateGasLimit(ctx context.Context, msgIn *chain.Message, tsk chain.TipSetKey) (int64, error) //perm:read + MpoolDeleteByAdress(ctx context.Context, addr address.Address) error //perm:admin + MpoolPublishByAddr(context.Context, address.Address) error //perm:admin + MpoolPublishMessage(ctx context.Context, smsg *types.SignedMessage) error //perm:admin + MpoolPush(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) //perm:write + MpoolGetConfig(context.Context) (*types.MpoolConfig, error) //perm:read + MpoolSetConfig(ctx context.Context, cfg *types.MpoolConfig) error //perm:admin + MpoolSelect(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) //perm:read + MpoolSelects(context.Context, types.TipSetKey, []float64) ([][]*types.SignedMessage, error) //perm:read + MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*types.SignedMessage, error) //perm:read + MpoolClear(ctx context.Context, local bool) error //perm:write + MpoolPushUntrusted(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) //perm:write + MpoolPushMessage(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec) (*types.SignedMessage, error) //perm:sign + MpoolBatchPush(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) //perm:write + MpoolBatchPushUntrusted(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) //perm:write + MpoolBatchPushMessage(ctx context.Context, msgs []*types.Message, spec *types.MessageSendSpec) ([]*types.SignedMessage, error) //perm:sign + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) //perm:read + MpoolSub(ctx context.Context) (<-chan types.MpoolUpdate, error) //perm:read + GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) //perm:read + GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) //perm:read + GasEstimateFeeCap(ctx context.Context, msg *types.Message, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) //perm:read + GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk types.TipSetKey) (big.Int, error) //perm:read + GasEstimateGasLimit(ctx context.Context, msgIn *types.Message, tsk types.TipSetKey) (int64, error) //perm:read } diff --git a/venus-shared/api/chain/v0/multisig.go b/venus-shared/api/chain/v0/multisig.go index 6cbf8dbe70..324cd3846c 100644 --- a/venus-shared/api/chain/v0/multisig.go +++ b/venus-shared/api/chain/v0/multisig.go @@ -2,33 +2,34 @@ package v0 import ( "context" + "github.com/ipfs/go-cid" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type IMultiSig interface { // MsigCreate creates a multisig wallet // It takes the following params: , , //, , - MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, chain.BigInt, address.Address, chain.BigInt) (cid.Cid, error) //perm:sign - MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) //perm:sign + MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, types.BigInt, address.Address, types.BigInt) (cid.Cid, error) //perm:sign + MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) //perm:sign MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (cid.Cid, error) //perm:sign MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (cid.Cid, error) //perm:sign MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (cid.Cid, error) //perm:sign // MsigCancel cancels a previously-proposed multisig message // It takes the following params: , , , , // , , - MsigCancelTxnHash(context.Context, address.Address, uint64, address.Address, chain.BigInt, address.Address, uint64, []byte) (cid.Cid, error) //perm:sign + MsigCancelTxnHash(context.Context, address.Address, uint64, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error) //perm:sign MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) //perm:sign MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) //perm:sign MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) //perm:sign MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (cid.Cid, error) //perm:sign - MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) //perm:sign + MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) //perm:sign MsigCancel(ctx context.Context, msig address.Address, txID uint64, src address.Address) (cid.Cid, error) //perm:sign MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (cid.Cid, error) //perm:sign - MsigGetVested(ctx context.Context, addr address.Address, start chain.TipSetKey, end chain.TipSetKey) (chain.BigInt, error) //perm:read + MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) //perm:read } diff --git a/venus-shared/api/chain/v0/network.go b/venus-shared/api/chain/v0/network.go index 64c166c942..06320051c8 100644 --- a/venus-shared/api/chain/v0/network.go +++ b/venus-shared/api/chain/v0/network.go @@ -3,24 +3,23 @@ package v0 import ( "context" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" - - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/libp2p/net" ) type INetwork interface { - NetworkGetBandwidthStats(ctx context.Context) metrics.Stats //perm:admin - NetworkGetPeerAddresses(ctx context.Context) []ma.Multiaddr //perm:admin - NetworkGetPeerID(ctx context.Context) peer.ID //perm:admin - NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo //perm:read - NetworkGetClosestPeers(ctx context.Context, key string) ([]peer.ID, error) //perm:read - NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) //perm:read - NetworkConnect(ctx context.Context, addrs []string) (<-chan net.ConnectionResult, error) //perm:read - NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) //perm:read - Version(context.Context) (chain2.Version, error) //perm:read - NetAddrsListen(context.Context) (peer.AddrInfo, error) //perm:read + NetworkGetBandwidthStats(ctx context.Context) metrics.Stats //perm:admin + NetworkGetPeerAddresses(ctx context.Context) []ma.Multiaddr //perm:admin + NetworkGetPeerID(ctx context.Context) peer.ID //perm:admin + NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo //perm:read + NetworkGetClosestPeers(ctx context.Context, key string) ([]peer.ID, error) //perm:read + NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) //perm:read + NetworkConnect(ctx context.Context, addrs []string) (<-chan types.ConnectionResult, error) //perm:read + NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*types.SwarmConnInfos, error) //perm:read + Version(context.Context) (types.Version, error) //perm:read + NetAddrsListen(context.Context) (peer.AddrInfo, error) //perm:read } diff --git a/venus-shared/api/chain/v0/paych.go b/venus-shared/api/chain/v0/paych.go index 062ca411c9..0ad9d4d127 100644 --- a/venus-shared/api/chain/v0/paych.go +++ b/venus-shared/api/chain/v0/paych.go @@ -3,12 +3,11 @@ package v0 import ( "context" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" - - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/paych" ) type IPaychan interface { @@ -16,14 +15,14 @@ type IPaychan interface { // @from: the payment channel sender // @to: the payment channel recipient // @amt: the deposits funds in the payment channel - PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*paych.ChannelInfo, error) //perm:sign + PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*types.ChannelInfo, error) //perm:sign // PaychAvailableFunds get the status of an outbound payment channel // @pch: payment channel address - PaychAvailableFunds(ctx context.Context, ch address.Address) (*chain2.ChannelAvailableFunds, error) //perm:sign + PaychAvailableFunds(ctx context.Context, ch address.Address) (*types.ChannelAvailableFunds, error) //perm:sign // PaychAvailableFundsByFromTo get the status of an outbound payment channel // @from: the payment channel sender // @to: he payment channel recipient - PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*chain2.ChannelAvailableFunds, error) //perm:sign + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*types.ChannelAvailableFunds, error) //perm:sign // PaychGetWaitReady waits until the create channel / add funds message with the sentinel // @sentinel: given message CID arrives. // @ch: the returned channel address can safely be used against the Manager methods. @@ -35,12 +34,12 @@ type IPaychan interface { // @from: the payment channel sender // @to: the payment channel recipient // @vouchers: the outstanding (non-redeemed) vouchers - PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []paych.VoucherSpec) (*paych.PaymentInfo, error) //perm:sign + PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []types.VoucherSpec) (*types.PaymentInfo, error) //perm:sign // PaychList list the addresses of all channels that have been created PaychList(ctx context.Context) ([]address.Address, error) //perm:read // PaychStatus get the payment channel status // @pch: payment channel address - PaychStatus(ctx context.Context, pch address.Address) (*paych.Status, error) //perm:read + PaychStatus(ctx context.Context, pch address.Address) (*types.Status, error) //perm:read // PaychSettle update payment channel status to settle // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain // @pch: payment channel address @@ -56,15 +55,15 @@ type IPaychan interface { // the channel To address is owned by the wallet). // @pch: payment channel address // @sv: voucher - PaychVoucherCheckValid(ctx context.Context, ch address.Address, sv *paych.SignedVoucher) error //perm:read + PaychVoucherCheckValid(ctx context.Context, ch address.Address, sv *types.SignedVoucher) error //perm:read // PaychVoucherCheckSpendable checks if the given voucher is currently spendable // @pch: payment channel address // @sv: voucher - PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (bool, error) //perm:read + PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *types.SignedVoucher, secret []byte, proof []byte) (bool, error) //perm:read // PaychVoucherAdd adds a voucher for an inbound channel. // If the channel is not in the store, fetches the channel from state (and checks that // the channel To address is owned by the wallet). - PaychVoucherAdd(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) //perm:write + PaychVoucherAdd(ctx context.Context, ch address.Address, sv *types.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) //perm:write // PaychVoucherCreate creates a new signed voucher on the given payment channel // with the given lane and amount. The value passed in is exactly the value // that will be used to create the voucher, so if previous vouchers exist, the @@ -72,12 +71,12 @@ type IPaychan interface { // the two. // If there are insufficient funds in the channel to create the voucher, // returns a nil voucher and the shortfall. - PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paych.VoucherCreateResult, error) //perm:sign + PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*types.VoucherCreateResult, error) //perm:sign // PaychVoucherList list vouchers in payment channel // @pch: payment channel address - PaychVoucherList(ctx context.Context, pch address.Address) ([]*paych.SignedVoucher, error) //perm:write + PaychVoucherList(ctx context.Context, pch address.Address) ([]*types.SignedVoucher, error) //perm:write // PaychVoucherSubmit Submit voucher to chain to update payment channel state // @pch: payment channel address // @sv: voucher in payment channel - PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) //perm:sign + PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *types.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) //perm:sign } diff --git a/venus-shared/api/chain/v0/proxy_gen.go b/venus-shared/api/chain/v0/proxy_gen.go index f54ca9a5db..792485f109 100644 --- a/venus-shared/api/chain/v0/proxy_gen.go +++ b/venus-shared/api/chain/v0/proxy_gen.go @@ -13,12 +13,7 @@ import ( "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/libp2p/net" - "github.com/filecoin-project/venus/venus-shared/messagepool" - "github.com/filecoin-project/venus/venus-shared/paych" - "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/peer" @@ -42,37 +37,37 @@ type FullNodeStruct struct { type IAccountStruct struct { Internal struct { - StateAccountKey func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) `perm:"read"` + StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` } } -func (s *IAccountStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) { +func (s *IAccountStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { return s.Internal.StateAccountKey(p0, p1, p2) } type IActorStruct struct { Internal struct { - ListActor func(p0 context.Context) (map[address.Address]*chain.Actor, error) `perm:"read"` + ListActor func(p0 context.Context) (map[address.Address]*types.Actor, error) `perm:"read"` - StateGetActor func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*chain.Actor, error) `perm:"read"` + StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `perm:"read"` } } -func (s *IActorStruct) ListActor(p0 context.Context) (map[address.Address]*chain.Actor, error) { +func (s *IActorStruct) ListActor(p0 context.Context) (map[address.Address]*types.Actor, error) { return s.Internal.ListActor(p0) } -func (s *IActorStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*chain.Actor, error) { +func (s *IActorStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { return s.Internal.StateGetActor(p0, p1, p2) } type IBeaconStruct struct { Internal struct { - BeaconGetEntry func(p0 context.Context, p1 abi.ChainEpoch) (*chain.BeaconEntry, error) `perm:"read"` + BeaconGetEntry func(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) `perm:"read"` } } -func (s *IBeaconStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (*chain.BeaconEntry, error) { +func (s *IBeaconStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) { return s.Internal.BeaconGetEntry(p0, p1) } @@ -84,7 +79,7 @@ type IBlockStoreStruct struct { ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` - ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (chain2.ObjStat, error) `perm:"read"` + ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) `perm:"read"` } } @@ -100,7 +95,7 @@ func (s *IBlockStoreStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte return s.Internal.ChainReadObj(p0, p1) } -func (s *IBlockStoreStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (chain2.ObjStat, error) { +func (s *IBlockStoreStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) { return s.Internal.ChainStatObj(p0, p1, p2) } @@ -116,73 +111,73 @@ type IChainInfoStruct struct { Internal struct { BlockTime func(p0 context.Context) time.Duration `perm:"read"` - ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 chain.TipSetKey) (<-chan []byte, error) `perm:"read"` + ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) `perm:"read"` - ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*chain.BlockHeader, error) `perm:"read"` + ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) `perm:"read"` - ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*chain2.BlockMessages, error) `perm:"read"` + ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*types.BlockMessages, error) `perm:"read"` - ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*chain.Message, error) `perm:"read"` + ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"` - ChainGetMessagesInTipset func(p0 context.Context, p1 chain.TipSetKey) ([]chain2.Message, error) `perm:"read"` + ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]types.MessageCID, error) `perm:"read"` - ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]chain2.Message, error) `perm:"read"` + ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]types.MessageCID, error) `perm:"read"` - ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*chain.MessageReceipt, error) `perm:"read"` + ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` - ChainGetPath func(p0 context.Context, p1 chain.TipSetKey, p2 chain.TipSetKey) ([]*chain2.HeadChange, error) `perm:"read"` + ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*types.HeadChange, error) `perm:"read"` - ChainGetRandomnessFromBeacon func(p0 context.Context, p1 chain.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` + ChainGetRandomnessFromBeacon func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` - ChainGetRandomnessFromTickets func(p0 context.Context, p1 chain.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` + ChainGetRandomnessFromTickets func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` - ChainGetReceipts func(p0 context.Context, p1 cid.Cid) ([]chain.MessageReceipt, error) `perm:"read"` + ChainGetReceipts func(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) `perm:"read"` - ChainGetTipSet func(p0 context.Context, p1 chain.TipSetKey) (*chain.TipSet, error) `perm:"read"` + ChainGetTipSet func(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 chain.TipSetKey) (*chain.TipSet, error) `perm:"read"` + ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - ChainHead func(p0 context.Context) (*chain.TipSet, error) `perm:"read"` + ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"` - ChainList func(p0 context.Context, p1 chain.TipSetKey, p2 int) ([]chain.TipSetKey, error) `perm:"read"` + ChainList func(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) `perm:"read"` - ChainNotify func(p0 context.Context) (<-chan []*chain2.HeadChange, error) `perm:"read"` + ChainNotify func(p0 context.Context) (<-chan []*types.HeadChange, error) `perm:"read"` - ChainSetHead func(p0 context.Context, p1 chain.TipSetKey) error `perm:"admin"` + ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` - GetActor func(p0 context.Context, p1 address.Address) (*chain.Actor, error) `perm:"read"` + GetActor func(p0 context.Context, p1 address.Address) (*types.Actor, error) `perm:"read"` - GetEntry func(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*chain.BeaconEntry, error) `perm:"read"` + GetEntry func(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) `perm:"read"` - GetFullBlock func(p0 context.Context, p1 cid.Cid) (*chain.FullBlock, error) `perm:"read"` + GetFullBlock func(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) `perm:"read"` - GetParentStateRootActor func(p0 context.Context, p1 *chain.TipSet, p2 address.Address) (*chain.Actor, error) `perm:"read"` + GetParentStateRootActor func(p0 context.Context, p1 *types.TipSet, p2 address.Address) (*types.Actor, error) `perm:"read"` - MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*chain2.ChainMessage, error) `perm:"read"` + MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*types.ChainMessage, error) `perm:"read"` - ProtocolParameters func(p0 context.Context) (*chain2.ProtocolParams, error) `perm:"read"` + ProtocolParameters func(p0 context.Context) (*types.ProtocolParams, error) `perm:"read"` - ResolveToKeyAddr func(p0 context.Context, p1 address.Address, p2 *chain.TipSet) (address.Address, error) `perm:"read"` + ResolveToKeyAddr func(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) `perm:"read"` - StateGetReceipt func(p0 context.Context, p1 cid.Cid, p2 chain.TipSetKey) (*chain.MessageReceipt, error) `perm:"read"` + StateGetReceipt func(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) `perm:"read"` - StateNetworkName func(p0 context.Context) (chain2.NetworkName, error) `perm:"read"` + StateNetworkName func(p0 context.Context) (types.NetworkName, error) `perm:"read"` - StateNetworkVersion func(p0 context.Context, p1 chain.TipSetKey) (network.Version, error) `perm:"read"` + StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (network.Version, error) `perm:"read"` - StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*chain2.MsgLookup, error) `perm:"read"` + StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*types.MsgLookup, error) `perm:"read"` - StateSearchMsgLimited func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*chain2.MsgLookup, error) `perm:"read"` + StateSearchMsgLimited func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*types.MsgLookup, error) `perm:"read"` - StateVerifiedRegistryRootKey func(p0 context.Context, p1 chain.TipSetKey) (address.Address, error) `perm:"read"` + StateVerifiedRegistryRootKey func(p0 context.Context, p1 types.TipSetKey) (address.Address, error) `perm:"read"` - StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*abi.StoragePower, error) `perm:"read"` + StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` - StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*chain2.MsgLookup, error) `perm:"read"` + StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*types.MsgLookup, error) `perm:"read"` - StateWaitMsgLimited func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*chain2.MsgLookup, error) `perm:"read"` + StateWaitMsgLimited func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*types.MsgLookup, error) `perm:"read"` - VerifyEntry func(p0 *chain.BeaconEntry, p1 *chain.BeaconEntry, p2 abi.ChainEpoch) bool `perm:"read"` + VerifyEntry func(p0 *types.BeaconEntry, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool `perm:"read"` } } @@ -190,139 +185,139 @@ func (s *IChainInfoStruct) BlockTime(p0 context.Context) time.Duration { return s.Internal.BlockTime(p0) } -func (s *IChainInfoStruct) ChainExport(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 chain.TipSetKey) (<-chan []byte, error) { +func (s *IChainInfoStruct) ChainExport(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) { return s.Internal.ChainExport(p0, p1, p2, p3) } -func (s *IChainInfoStruct) ChainGetBlock(p0 context.Context, p1 cid.Cid) (*chain.BlockHeader, error) { +func (s *IChainInfoStruct) ChainGetBlock(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) { return s.Internal.ChainGetBlock(p0, p1) } -func (s *IChainInfoStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*chain2.BlockMessages, error) { +func (s *IChainInfoStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*types.BlockMessages, error) { return s.Internal.ChainGetBlockMessages(p0, p1) } -func (s *IChainInfoStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*chain.Message, error) { +func (s *IChainInfoStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*types.Message, error) { return s.Internal.ChainGetMessage(p0, p1) } -func (s *IChainInfoStruct) ChainGetMessagesInTipset(p0 context.Context, p1 chain.TipSetKey) ([]chain2.Message, error) { +func (s *IChainInfoStruct) ChainGetMessagesInTipset(p0 context.Context, p1 types.TipSetKey) ([]types.MessageCID, error) { return s.Internal.ChainGetMessagesInTipset(p0, p1) } -func (s *IChainInfoStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]chain2.Message, error) { +func (s *IChainInfoStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]types.MessageCID, error) { return s.Internal.ChainGetParentMessages(p0, p1) } -func (s *IChainInfoStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid) ([]*chain.MessageReceipt, error) { +func (s *IChainInfoStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) { return s.Internal.ChainGetParentReceipts(p0, p1) } -func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 chain.TipSetKey, p2 chain.TipSetKey) ([]*chain2.HeadChange, error) { +func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*types.HeadChange, error) { return s.Internal.ChainGetPath(p0, p1, p2) } -func (s *IChainInfoStruct) ChainGetRandomnessFromBeacon(p0 context.Context, p1 chain.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { +func (s *IChainInfoStruct) ChainGetRandomnessFromBeacon(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { return s.Internal.ChainGetRandomnessFromBeacon(p0, p1, p2, p3, p4) } -func (s *IChainInfoStruct) ChainGetRandomnessFromTickets(p0 context.Context, p1 chain.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { +func (s *IChainInfoStruct) ChainGetRandomnessFromTickets(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { return s.Internal.ChainGetRandomnessFromTickets(p0, p1, p2, p3, p4) } -func (s *IChainInfoStruct) ChainGetReceipts(p0 context.Context, p1 cid.Cid) ([]chain.MessageReceipt, error) { +func (s *IChainInfoStruct) ChainGetReceipts(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) { return s.Internal.ChainGetReceipts(p0, p1) } -func (s *IChainInfoStruct) ChainGetTipSet(p0 context.Context, p1 chain.TipSetKey) (*chain.TipSet, error) { +func (s *IChainInfoStruct) ChainGetTipSet(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) { return s.Internal.ChainGetTipSet(p0, p1) } -func (s *IChainInfoStruct) ChainGetTipSetByHeight(p0 context.Context, p1 abi.ChainEpoch, p2 chain.TipSetKey) (*chain.TipSet, error) { +func (s *IChainInfoStruct) ChainGetTipSetByHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { return s.Internal.ChainGetTipSetByHeight(p0, p1, p2) } -func (s *IChainInfoStruct) ChainHead(p0 context.Context) (*chain.TipSet, error) { +func (s *IChainInfoStruct) ChainHead(p0 context.Context) (*types.TipSet, error) { return s.Internal.ChainHead(p0) } -func (s *IChainInfoStruct) ChainList(p0 context.Context, p1 chain.TipSetKey, p2 int) ([]chain.TipSetKey, error) { +func (s *IChainInfoStruct) ChainList(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) { return s.Internal.ChainList(p0, p1, p2) } -func (s *IChainInfoStruct) ChainNotify(p0 context.Context) (<-chan []*chain2.HeadChange, error) { +func (s *IChainInfoStruct) ChainNotify(p0 context.Context) (<-chan []*types.HeadChange, error) { return s.Internal.ChainNotify(p0) } -func (s *IChainInfoStruct) ChainSetHead(p0 context.Context, p1 chain.TipSetKey) error { +func (s *IChainInfoStruct) ChainSetHead(p0 context.Context, p1 types.TipSetKey) error { return s.Internal.ChainSetHead(p0, p1) } -func (s *IChainInfoStruct) GetActor(p0 context.Context, p1 address.Address) (*chain.Actor, error) { +func (s *IChainInfoStruct) GetActor(p0 context.Context, p1 address.Address) (*types.Actor, error) { return s.Internal.GetActor(p0, p1) } -func (s *IChainInfoStruct) GetEntry(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*chain.BeaconEntry, error) { +func (s *IChainInfoStruct) GetEntry(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) { return s.Internal.GetEntry(p0, p1, p2) } -func (s *IChainInfoStruct) GetFullBlock(p0 context.Context, p1 cid.Cid) (*chain.FullBlock, error) { +func (s *IChainInfoStruct) GetFullBlock(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) { return s.Internal.GetFullBlock(p0, p1) } -func (s *IChainInfoStruct) GetParentStateRootActor(p0 context.Context, p1 *chain.TipSet, p2 address.Address) (*chain.Actor, error) { +func (s *IChainInfoStruct) GetParentStateRootActor(p0 context.Context, p1 *types.TipSet, p2 address.Address) (*types.Actor, error) { return s.Internal.GetParentStateRootActor(p0, p1, p2) } -func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*chain2.ChainMessage, error) { +func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*types.ChainMessage, error) { return s.Internal.MessageWait(p0, p1, p2, p3) } -func (s *IChainInfoStruct) ProtocolParameters(p0 context.Context) (*chain2.ProtocolParams, error) { +func (s *IChainInfoStruct) ProtocolParameters(p0 context.Context) (*types.ProtocolParams, error) { return s.Internal.ProtocolParameters(p0) } -func (s *IChainInfoStruct) ResolveToKeyAddr(p0 context.Context, p1 address.Address, p2 *chain.TipSet) (address.Address, error) { +func (s *IChainInfoStruct) ResolveToKeyAddr(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) { return s.Internal.ResolveToKeyAddr(p0, p1, p2) } -func (s *IChainInfoStruct) StateGetReceipt(p0 context.Context, p1 cid.Cid, p2 chain.TipSetKey) (*chain.MessageReceipt, error) { +func (s *IChainInfoStruct) StateGetReceipt(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) { return s.Internal.StateGetReceipt(p0, p1, p2) } -func (s *IChainInfoStruct) StateNetworkName(p0 context.Context) (chain2.NetworkName, error) { +func (s *IChainInfoStruct) StateNetworkName(p0 context.Context) (types.NetworkName, error) { return s.Internal.StateNetworkName(p0) } -func (s *IChainInfoStruct) StateNetworkVersion(p0 context.Context, p1 chain.TipSetKey) (network.Version, error) { +func (s *IChainInfoStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (network.Version, error) { return s.Internal.StateNetworkVersion(p0, p1) } -func (s *IChainInfoStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*chain2.MsgLookup, error) { +func (s *IChainInfoStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*types.MsgLookup, error) { return s.Internal.StateSearchMsg(p0, p1) } -func (s *IChainInfoStruct) StateSearchMsgLimited(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*chain2.MsgLookup, error) { +func (s *IChainInfoStruct) StateSearchMsgLimited(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*types.MsgLookup, error) { return s.Internal.StateSearchMsgLimited(p0, p1, p2) } -func (s *IChainInfoStruct) StateVerifiedRegistryRootKey(p0 context.Context, p1 chain.TipSetKey) (address.Address, error) { +func (s *IChainInfoStruct) StateVerifiedRegistryRootKey(p0 context.Context, p1 types.TipSetKey) (address.Address, error) { return s.Internal.StateVerifiedRegistryRootKey(p0, p1) } -func (s *IChainInfoStruct) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*abi.StoragePower, error) { +func (s *IChainInfoStruct) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { return s.Internal.StateVerifierStatus(p0, p1, p2) } -func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64) (*chain2.MsgLookup, error) { +func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64) (*types.MsgLookup, error) { return s.Internal.StateWaitMsg(p0, p1, p2) } -func (s *IChainInfoStruct) StateWaitMsgLimited(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*chain2.MsgLookup, error) { +func (s *IChainInfoStruct) StateWaitMsgLimited(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*types.MsgLookup, error) { return s.Internal.StateWaitMsgLimited(p0, p1, p2, p3) } -func (s *IChainInfoStruct) VerifyEntry(p0 *chain.BeaconEntry, p1 *chain.BeaconEntry, p2 abi.ChainEpoch) bool { +func (s *IChainInfoStruct) VerifyEntry(p0 *types.BeaconEntry, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool { return s.Internal.VerifyEntry(p0, p1, p2) } @@ -344,91 +339,91 @@ func (s *IJwtAuthAPIStruct) Verify(p0 context.Context, p1 string, p2 string) ([] type IMarketStruct struct { Internal struct { - StateMarketParticipants func(p0 context.Context, p1 chain.TipSetKey) (map[string]chain2.MarketBalance, error) `perm:"read"` + StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) `perm:"read"` } } -func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 chain.TipSetKey) (map[string]chain2.MarketBalance, error) { +func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) { return s.Internal.StateMarketParticipants(p0, p1) } type IMessagePoolStruct struct { Internal struct { - GasBatchEstimateMessageGas func(p0 context.Context, p1 []*chain2.EstimateMessage, p2 uint64, p3 chain.TipSetKey) ([]*chain2.EstimateResult, error) `perm:"read"` + GasBatchEstimateMessageGas func(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) `perm:"read"` - GasEstimateFeeCap func(p0 context.Context, p1 *chain.Message, p2 int64, p3 chain.TipSetKey) (big.Int, error) `perm:"read"` + GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - GasEstimateGasLimit func(p0 context.Context, p1 *chain.Message, p2 chain.TipSetKey) (int64, error) `perm:"read"` + GasEstimateGasLimit func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) `perm:"read"` - GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 chain.TipSetKey) (big.Int, error) `perm:"read"` + GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) `perm:"read"` - GasEstimateMessageGas func(p0 context.Context, p1 *chain.Message, p2 *chain2.MessageSendSpec, p3 chain.TipSetKey) (*chain.Message, error) `perm:"read"` + GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"` - MpoolBatchPush func(p0 context.Context, p1 []*chain.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolBatchPushMessage func(p0 context.Context, p1 []*chain.Message, p2 *chain2.MessageSendSpec) ([]*chain.SignedMessage, error) `perm:"sign"` + MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` - MpoolBatchPushUntrusted func(p0 context.Context, p1 []*chain.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` - MpoolGetConfig func(p0 context.Context) (*messagepool.MpoolConfig, error) `perm:"read"` + MpoolGetConfig func(p0 context.Context) (*types.MpoolConfig, error) `perm:"read"` MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` - MpoolPending func(p0 context.Context, p1 chain.TipSetKey) ([]*chain.SignedMessage, error) `perm:"read"` + MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"admin"` - MpoolPublishMessage func(p0 context.Context, p1 *chain.SignedMessage) error `perm:"admin"` + MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"admin"` - MpoolPush func(p0 context.Context, p1 *chain.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolPushMessage func(p0 context.Context, p1 *chain.Message, p2 *chain2.MessageSendSpec) (*chain.SignedMessage, error) `perm:"sign"` + MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` - MpoolPushUntrusted func(p0 context.Context, p1 *chain.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolSelect func(p0 context.Context, p1 chain.TipSetKey, p2 float64) ([]*chain.SignedMessage, error) `perm:"read"` + MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` - MpoolSelects func(p0 context.Context, p1 chain.TipSetKey, p2 []float64) ([][]*chain.SignedMessage, error) `perm:"read"` + MpoolSelects func(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) `perm:"read"` - MpoolSetConfig func(p0 context.Context, p1 *messagepool.MpoolConfig) error `perm:"admin"` + MpoolSetConfig func(p0 context.Context, p1 *types.MpoolConfig) error `perm:"admin"` - MpoolSub func(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) `perm:"read"` + MpoolSub func(p0 context.Context) (<-chan types.MpoolUpdate, error) `perm:"read"` } } -func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*chain2.EstimateMessage, p2 uint64, p3 chain.TipSetKey) ([]*chain2.EstimateResult, error) { +func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) { return s.Internal.GasBatchEstimateMessageGas(p0, p1, p2, p3) } -func (s *IMessagePoolStruct) GasEstimateFeeCap(p0 context.Context, p1 *chain.Message, p2 int64, p3 chain.TipSetKey) (big.Int, error) { +func (s *IMessagePoolStruct) GasEstimateFeeCap(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) { return s.Internal.GasEstimateFeeCap(p0, p1, p2, p3) } -func (s *IMessagePoolStruct) GasEstimateGasLimit(p0 context.Context, p1 *chain.Message, p2 chain.TipSetKey) (int64, error) { +func (s *IMessagePoolStruct) GasEstimateGasLimit(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) { return s.Internal.GasEstimateGasLimit(p0, p1, p2) } -func (s *IMessagePoolStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 chain.TipSetKey) (big.Int, error) { +func (s *IMessagePoolStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) { return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) } -func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *chain.Message, p2 *chain2.MessageSendSpec, p3 chain.TipSetKey) (*chain.Message, error) { +func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) } -func (s *IMessagePoolStruct) MpoolBatchPush(p0 context.Context, p1 []*chain.SignedMessage) ([]cid.Cid, error) { +func (s *IMessagePoolStruct) MpoolBatchPush(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { return s.Internal.MpoolBatchPush(p0, p1) } -func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*chain.Message, p2 *chain2.MessageSendSpec) ([]*chain.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) { return s.Internal.MpoolBatchPushMessage(p0, p1, p2) } -func (s *IMessagePoolStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*chain.SignedMessage) ([]cid.Cid, error) { +func (s *IMessagePoolStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { return s.Internal.MpoolBatchPushUntrusted(p0, p1) } @@ -440,7 +435,7 @@ func (s *IMessagePoolStruct) MpoolDeleteByAdress(p0 context.Context, p1 address. return s.Internal.MpoolDeleteByAdress(p0, p1) } -func (s *IMessagePoolStruct) MpoolGetConfig(p0 context.Context) (*messagepool.MpoolConfig, error) { +func (s *IMessagePoolStruct) MpoolGetConfig(p0 context.Context) (*types.MpoolConfig, error) { return s.Internal.MpoolGetConfig(p0) } @@ -448,7 +443,7 @@ func (s *IMessagePoolStruct) MpoolGetNonce(p0 context.Context, p1 address.Addres return s.Internal.MpoolGetNonce(p0, p1) } -func (s *IMessagePoolStruct) MpoolPending(p0 context.Context, p1 chain.TipSetKey) ([]*chain.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolPending(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) { return s.Internal.MpoolPending(p0, p1) } @@ -456,235 +451,235 @@ func (s *IMessagePoolStruct) MpoolPublishByAddr(p0 context.Context, p1 address.A return s.Internal.MpoolPublishByAddr(p0, p1) } -func (s *IMessagePoolStruct) MpoolPublishMessage(p0 context.Context, p1 *chain.SignedMessage) error { +func (s *IMessagePoolStruct) MpoolPublishMessage(p0 context.Context, p1 *types.SignedMessage) error { return s.Internal.MpoolPublishMessage(p0, p1) } -func (s *IMessagePoolStruct) MpoolPush(p0 context.Context, p1 *chain.SignedMessage) (cid.Cid, error) { +func (s *IMessagePoolStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { return s.Internal.MpoolPush(p0, p1) } -func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *chain.Message, p2 *chain2.MessageSendSpec) (*chain.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) { return s.Internal.MpoolPushMessage(p0, p1, p2) } -func (s *IMessagePoolStruct) MpoolPushUntrusted(p0 context.Context, p1 *chain.SignedMessage) (cid.Cid, error) { +func (s *IMessagePoolStruct) MpoolPushUntrusted(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { return s.Internal.MpoolPushUntrusted(p0, p1) } -func (s *IMessagePoolStruct) MpoolSelect(p0 context.Context, p1 chain.TipSetKey, p2 float64) ([]*chain.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolSelect(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) { return s.Internal.MpoolSelect(p0, p1, p2) } -func (s *IMessagePoolStruct) MpoolSelects(p0 context.Context, p1 chain.TipSetKey, p2 []float64) ([][]*chain.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolSelects(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) { return s.Internal.MpoolSelects(p0, p1, p2) } -func (s *IMessagePoolStruct) MpoolSetConfig(p0 context.Context, p1 *messagepool.MpoolConfig) error { +func (s *IMessagePoolStruct) MpoolSetConfig(p0 context.Context, p1 *types.MpoolConfig) error { return s.Internal.MpoolSetConfig(p0, p1) } -func (s *IMessagePoolStruct) MpoolSub(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) { +func (s *IMessagePoolStruct) MpoolSub(p0 context.Context) (<-chan types.MpoolUpdate, error) { return s.Internal.MpoolSub(p0) } type IMinerStateStruct struct { Internal struct { - StateCirculatingSupply func(p0 context.Context, p1 chain.TipSetKey) (abi.TokenAmount, error) `perm:"read"` + StateCirculatingSupply func(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` - StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 chain.TipSetKey) (chain2.DealCollateralBounds, error) `perm:"read"` + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) `perm:"read"` - StateListActors func(p0 context.Context, p1 chain.TipSetKey) ([]address.Address, error) `perm:"read"` + StateListActors func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` - StateListMiners func(p0 context.Context, p1 chain.TipSetKey) ([]address.Address, error) `perm:"read"` + StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` - StateLookupID func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) `perm:"read"` + StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - StateMarketBalance func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (chain2.MarketBalance, error) `perm:"read"` + StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) `perm:"read"` - StateMarketDeals func(p0 context.Context, p1 chain.TipSetKey) (map[string]chain2.MarketDeal, error) `perm:"read"` + StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) `perm:"read"` - StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 chain.TipSetKey) (*chain2.MarketDeal, error) `perm:"read"` + StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) `perm:"read"` - StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` - StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) ([]chain2.Deadline, error) `perm:"read"` + StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) `perm:"read"` - StateMinerFaults func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (bitfield.BitField, error) `perm:"read"` + StateMinerFaults func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - StateMinerInfo func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (miner.MinerInfo, error) `perm:"read"` + StateMinerInfo func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) `perm:"read"` - StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 chain.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 chain.TipSetKey) ([]chain2.Partition, error) `perm:"read"` + StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) `perm:"read"` - StateMinerPower func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*chain2.MinerPower, error) `perm:"read"` + StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) `perm:"read"` - StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 chain.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*dline.Info, error) `perm:"read"` + StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `perm:"read"` - StateMinerRecoveries func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (bitfield.BitField, error) `perm:"read"` + StateMinerRecoveries func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (bool, error) `perm:"read"` + StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) `perm:"read"` - StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (chain2.MinerSectors, error) `perm:"read"` + StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) `perm:"read"` - StateMinerSectorSize func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (abi.SectorSize, error) `perm:"read"` + StateMinerSectorSize func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (abi.SectorSize, error) `perm:"read"` - StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` - StateMinerWorkerAddress func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) `perm:"read"` + StateMinerWorkerAddress func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - StateSectorExpiration func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorExpiration, error) `perm:"read"` + StateSectorExpiration func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) `perm:"read"` - StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` + StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` - StateSectorPartition func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` + StateSectorPartition func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` - StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` + StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` - StateVMCirculatingSupplyInternal func(p0 context.Context, p1 chain.TipSetKey) (chain.CirculatingSupply, error) `perm:"read"` + StateVMCirculatingSupplyInternal func(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) `perm:"read"` - StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*abi.StoragePower, error) `perm:"read"` + StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` } } -func (s *IMinerStateStruct) StateCirculatingSupply(p0 context.Context, p1 chain.TipSetKey) (abi.TokenAmount, error) { +func (s *IMinerStateStruct) StateCirculatingSupply(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) { return s.Internal.StateCirculatingSupply(p0, p1) } -func (s *IMinerStateStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 chain.TipSetKey) (chain2.DealCollateralBounds, error) { +func (s *IMinerStateStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) { return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateListActors(p0 context.Context, p1 chain.TipSetKey) ([]address.Address, error) { +func (s *IMinerStateStruct) StateListActors(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { return s.Internal.StateListActors(p0, p1) } -func (s *IMinerStateStruct) StateListMiners(p0 context.Context, p1 chain.TipSetKey) ([]address.Address, error) { +func (s *IMinerStateStruct) StateListMiners(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { return s.Internal.StateListMiners(p0, p1) } -func (s *IMinerStateStruct) StateLookupID(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) { +func (s *IMinerStateStruct) StateLookupID(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { return s.Internal.StateLookupID(p0, p1, p2) } -func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (chain2.MarketBalance, error) { +func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) { return s.Internal.StateMarketBalance(p0, p1, p2) } -func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 chain.TipSetKey) (map[string]chain2.MarketDeal, error) { +func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) { return s.Internal.StateMarketDeals(p0, p1) } -func (s *IMinerStateStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 chain.TipSetKey) (*chain2.MarketDeal, error) { +func (s *IMinerStateStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) { return s.Internal.StateMarketStorageDeal(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerActiveSectors(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) { +func (s *IMinerStateStruct) StateMinerActiveSectors(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { return s.Internal.StateMinerActiveSectors(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerAvailableBalance(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (big.Int, error) { +func (s *IMinerStateStruct) StateMinerAvailableBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) { return s.Internal.StateMinerAvailableBalance(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) ([]chain2.Deadline, error) { +func (s *IMinerStateStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) { return s.Internal.StateMinerDeadlines(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerFaults(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (bitfield.BitField, error) { +func (s *IMinerStateStruct) StateMinerFaults(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { return s.Internal.StateMinerFaults(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerInfo(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (miner.MinerInfo, error) { +func (s *IMinerStateStruct) StateMinerInfo(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) { return s.Internal.StateMinerInfo(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 chain.TipSetKey) (big.Int, error) { +func (s *IMinerStateStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 chain.TipSetKey) ([]chain2.Partition, error) { +func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) { return s.Internal.StateMinerPartitions(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*chain2.MinerPower, error) { +func (s *IMinerStateStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) { return s.Internal.StateMinerPower(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerPreCommitDepositForPower(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 chain.TipSetKey) (big.Int, error) { +func (s *IMinerStateStruct) StateMinerPreCommitDepositForPower(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { return s.Internal.StateMinerPreCommitDepositForPower(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateMinerProvingDeadline(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*dline.Info, error) { +func (s *IMinerStateStruct) StateMinerProvingDeadline(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) { return s.Internal.StateMinerProvingDeadline(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerRecoveries(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (bitfield.BitField, error) { +func (s *IMinerStateStruct) StateMinerRecoveries(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { return s.Internal.StateMinerRecoveries(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerSectorAllocated(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (bool, error) { +func (s *IMinerStateStruct) StateMinerSectorAllocated(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) { return s.Internal.StateMinerSectorAllocated(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (chain2.MinerSectors, error) { +func (s *IMinerStateStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) { return s.Internal.StateMinerSectorCount(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerSectorSize(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (abi.SectorSize, error) { +func (s *IMinerStateStruct) StateMinerSectorSize(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (abi.SectorSize, error) { return s.Internal.StateMinerSectorSize(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerSectors(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) { +func (s *IMinerStateStruct) StateMinerSectors(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { return s.Internal.StateMinerSectors(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateMinerWorkerAddress(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) { +func (s *IMinerStateStruct) StateMinerWorkerAddress(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { return s.Internal.StateMinerWorkerAddress(p0, p1, p2) } -func (s *IMinerStateStruct) StateSectorExpiration(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorExpiration, error) { +func (s *IMinerStateStruct) StateSectorExpiration(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) { return s.Internal.StateSectorExpiration(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateSectorGetInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorOnChainInfo, error) { +func (s *IMinerStateStruct) StateSectorGetInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) { return s.Internal.StateSectorGetInfo(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateSectorPartition(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorLocation, error) { +func (s *IMinerStateStruct) StateSectorPartition(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) { return s.Internal.StateSectorPartition(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateSectorPreCommitInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { +func (s *IMinerStateStruct) StateSectorPreCommitInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { return s.Internal.StateSectorPreCommitInfo(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 chain.TipSetKey) (chain.CirculatingSupply, error) { +func (s *IMinerStateStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) { return s.Internal.StateVMCirculatingSupplyInternal(p0, p1) } -func (s *IMinerStateStruct) StateVerifiedClientStatus(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*abi.StoragePower, error) { +func (s *IMinerStateStruct) StateVerifiedClientStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { return s.Internal.StateVerifiedClientStatus(p0, p1, p2) } type IMiningStruct struct { Internal struct { - MinerCreateBlock func(p0 context.Context, p1 *chain2.BlockTemplate) (*chain.BlockMsg, error) `perm:"write"` + MinerCreateBlock func(p0 context.Context, p1 *types.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` - MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 chain.TipSetKey) (*chain2.MiningBaseInfo, error) `perm:"read"` + MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*types.MiningBaseInfo, error) `perm:"read"` } } -func (s *IMiningStruct) MinerCreateBlock(p0 context.Context, p1 *chain2.BlockTemplate) (*chain.BlockMsg, error) { +func (s *IMiningStruct) MinerCreateBlock(p0 context.Context, p1 *types.BlockTemplate) (*types.BlockMsg, error) { return s.Internal.MinerCreateBlock(p0, p1) } -func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 chain.TipSetKey) (*chain2.MiningBaseInfo, error) { +func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*types.MiningBaseInfo, error) { return s.Internal.MinerGetBaseInfo(p0, p1, p2, p3) } @@ -698,17 +693,17 @@ type IMultiSigStruct struct { MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) `perm:"sign"` - MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 chain.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) `perm:"sign"` + MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) `perm:"sign"` MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) `perm:"sign"` - MsigCancelTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 chain.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) `perm:"sign"` + MsigCancelTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) `perm:"sign"` - MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 chain.BigInt, p5 address.Address, p6 chain.BigInt) (cid.Cid, error) `perm:"sign"` + MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) `perm:"sign"` - MsigGetVested func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey, p3 chain.TipSetKey) (chain.BigInt, error) `perm:"read"` + MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` - MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 chain.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) `perm:"sign"` + MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) `perm:"sign"` MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` @@ -736,7 +731,7 @@ func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 return s.Internal.MsigApprove(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 chain.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) { +func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) { return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3, p4, p5, p6, p7, p8) } @@ -744,19 +739,19 @@ func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 return s.Internal.MsigCancel(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigCancelTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 chain.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) { +func (s *IMultiSigStruct) MsigCancelTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) { return s.Internal.MsigCancelTxnHash(p0, p1, p2, p3, p4, p5, p6, p7) } -func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 chain.BigInt, p5 address.Address, p6 chain.BigInt) (cid.Cid, error) { +func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) { return s.Internal.MsigCreate(p0, p1, p2, p3, p4, p5, p6) } -func (s *IMultiSigStruct) MsigGetVested(p0 context.Context, p1 address.Address, p2 chain.TipSetKey, p3 chain.TipSetKey) (chain.BigInt, error) { +func (s *IMultiSigStruct) MsigGetVested(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) { return s.Internal.MsigGetVested(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 chain.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) { +func (s *IMultiSigStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) { return s.Internal.MsigPropose(p0, p1, p2, p3, p4, p5, p6) } @@ -780,7 +775,7 @@ type INetworkStruct struct { Internal struct { NetAddrsListen func(p0 context.Context) (peer.AddrInfo, error) `perm:"read"` - NetworkConnect func(p0 context.Context, p1 []string) (<-chan net.ConnectionResult, error) `perm:"read"` + NetworkConnect func(p0 context.Context, p1 []string) (<-chan types.ConnectionResult, error) `perm:"read"` NetworkFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` @@ -794,9 +789,9 @@ type INetworkStruct struct { NetworkGetPeerID func(p0 context.Context) peer.ID `perm:"admin"` - NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*net.SwarmConnInfos, error) `perm:"read"` + NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*types.SwarmConnInfos, error) `perm:"read"` - Version func(p0 context.Context) (chain2.Version, error) `perm:"read"` + Version func(p0 context.Context) (types.Version, error) `perm:"read"` } } @@ -804,7 +799,7 @@ func (s *INetworkStruct) NetAddrsListen(p0 context.Context) (peer.AddrInfo, erro return s.Internal.NetAddrsListen(p0) } -func (s *INetworkStruct) NetworkConnect(p0 context.Context, p1 []string) (<-chan net.ConnectionResult, error) { +func (s *INetworkStruct) NetworkConnect(p0 context.Context, p1 []string) (<-chan types.ConnectionResult, error) { return s.Internal.NetworkConnect(p0, p1) } @@ -832,11 +827,11 @@ func (s *INetworkStruct) NetworkGetPeerID(p0 context.Context) peer.ID { return s.Internal.NetworkGetPeerID(p0) } -func (s *INetworkStruct) NetworkPeers(p0 context.Context, p1 bool, p2 bool, p3 bool) (*net.SwarmConnInfos, error) { +func (s *INetworkStruct) NetworkPeers(p0 context.Context, p1 bool, p2 bool, p3 bool) (*types.SwarmConnInfos, error) { return s.Internal.NetworkPeers(p0, p1, p2, p3) } -func (s *INetworkStruct) Version(p0 context.Context) (chain2.Version, error) { +func (s *INetworkStruct) Version(p0 context.Context) (types.Version, error) { return s.Internal.Version(p0) } @@ -844,35 +839,35 @@ type IPaychanStruct struct { Internal struct { PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` - PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*chain2.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` - PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*chain2.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paych.ChannelInfo, error) `perm:"sign"` + PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) `perm:"sign"` PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` - PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []paych.VoucherSpec) (*paych.PaymentInfo, error) `perm:"sign"` + PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) `perm:"sign"` PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychStatus func(p0 context.Context, p1 address.Address) (*paych.Status, error) `perm:"read"` + PaychStatus func(p0 context.Context, p1 address.Address) (*types.Status, error) `perm:"read"` - PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` + PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` - PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` + PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` - PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` + PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher) error `perm:"read"` - PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paych.VoucherCreateResult, error) `perm:"sign"` + PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*types.VoucherCreateResult, error) `perm:"sign"` - PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` + PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*types.SignedVoucher, error) `perm:"write"` - PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` + PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` } } @@ -880,11 +875,11 @@ func (s *IPaychanStruct) PaychAllocateLane(p0 context.Context, p1 address.Addres return s.Internal.PaychAllocateLane(p0, p1) } -func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*chain2.ChannelAvailableFunds, error) { +func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*types.ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFunds(p0, p1) } -func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*chain2.ChannelAvailableFunds, error) { +func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*types.ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFundsByFromTo(p0, p1, p2) } @@ -892,7 +887,7 @@ func (s *IPaychanStruct) PaychCollect(p0 context.Context, p1 address.Address) (c return s.Internal.PaychCollect(p0, p1) } -func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paych.ChannelInfo, error) { +func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) { return s.Internal.PaychGet(p0, p1, p2, p3) } @@ -904,7 +899,7 @@ func (s *IPaychanStruct) PaychList(p0 context.Context) ([]address.Address, error return s.Internal.PaychList(p0) } -func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []paych.VoucherSpec) (*paych.PaymentInfo, error) { +func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) { return s.Internal.PaychNewPayment(p0, p1, p2, p3) } @@ -912,59 +907,59 @@ func (s *IPaychanStruct) PaychSettle(p0 context.Context, p1 address.Address) (ci return s.Internal.PaychSettle(p0, p1) } -func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*paych.Status, error) { +func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*types.Status, error) { return s.Internal.PaychStatus(p0, p1) } -func (s *IPaychanStruct) PaychVoucherAdd(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) { +func (s *IPaychanStruct) PaychVoucherAdd(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) { return s.Internal.PaychVoucherAdd(p0, p1, p2, p3, p4) } -func (s *IPaychanStruct) PaychVoucherCheckSpendable(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) { +func (s *IPaychanStruct) PaychVoucherCheckSpendable(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 []byte) (bool, error) { return s.Internal.PaychVoucherCheckSpendable(p0, p1, p2, p3, p4) } -func (s *IPaychanStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error { +func (s *IPaychanStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher) error { return s.Internal.PaychVoucherCheckValid(p0, p1, p2) } -func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paych.VoucherCreateResult, error) { +func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*types.VoucherCreateResult, error) { return s.Internal.PaychVoucherCreate(p0, p1, p2, p3) } -func (s *IPaychanStruct) PaychVoucherList(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) { +func (s *IPaychanStruct) PaychVoucherList(p0 context.Context, p1 address.Address) ([]*types.SignedVoucher, error) { return s.Internal.PaychVoucherList(p0, p1) } -func (s *IPaychanStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) { +func (s *IPaychanStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) { return s.Internal.PaychVoucherSubmit(p0, p1, p2, p3, p4) } type ISyncerStruct struct { Internal struct { - ChainSyncHandleNewTipSet func(p0 context.Context, p1 *chain.ChainInfo) error `perm:"write"` + ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"write"` - ChainTipSetWeight func(p0 context.Context, p1 chain.TipSetKey) (big.Int, error) `perm:"read"` + ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (big.Int, error) `perm:"read"` Concurrent func(p0 context.Context) int64 `perm:"read"` SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` - StateCall func(p0 context.Context, p1 *chain.Message, p2 chain.TipSetKey) (*chain2.InvocResult, error) `perm:"read"` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*types.InvocResult, error) `perm:"read"` - SyncState func(p0 context.Context) (*chain2.SyncState, error) `perm:"read"` + SyncState func(p0 context.Context) (*types.SyncState, error) `perm:"read"` - SyncSubmitBlock func(p0 context.Context, p1 *chain.BlockMsg) error `perm:"write"` + SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` - SyncerTracker func(p0 context.Context) *chain2.TargetTracker `perm:"read"` + SyncerTracker func(p0 context.Context) *types.TargetTracker `perm:"read"` } } -func (s *ISyncerStruct) ChainSyncHandleNewTipSet(p0 context.Context, p1 *chain.ChainInfo) error { +func (s *ISyncerStruct) ChainSyncHandleNewTipSet(p0 context.Context, p1 *types.ChainInfo) error { return s.Internal.ChainSyncHandleNewTipSet(p0, p1) } -func (s *ISyncerStruct) ChainTipSetWeight(p0 context.Context, p1 chain.TipSetKey) (big.Int, error) { +func (s *ISyncerStruct) ChainTipSetWeight(p0 context.Context, p1 types.TipSetKey) (big.Int, error) { return s.Internal.ChainTipSetWeight(p0, p1) } @@ -976,19 +971,19 @@ func (s *ISyncerStruct) SetConcurrent(p0 context.Context, p1 int64) error { return s.Internal.SetConcurrent(p0, p1) } -func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *chain.Message, p2 chain.TipSetKey) (*chain2.InvocResult, error) { +func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*types.InvocResult, error) { return s.Internal.StateCall(p0, p1, p2) } -func (s *ISyncerStruct) SyncState(p0 context.Context) (*chain2.SyncState, error) { +func (s *ISyncerStruct) SyncState(p0 context.Context) (*types.SyncState, error) { return s.Internal.SyncState(p0) } -func (s *ISyncerStruct) SyncSubmitBlock(p0 context.Context, p1 *chain.BlockMsg) error { +func (s *ISyncerStruct) SyncSubmitBlock(p0 context.Context, p1 *types.BlockMsg) error { return s.Internal.SyncSubmitBlock(p0, p1) } -func (s *ISyncerStruct) SyncerTracker(p0 context.Context) *chain2.TargetTracker { +func (s *ISyncerStruct) SyncerTracker(p0 context.Context) *types.TargetTracker { return s.Internal.SyncerTracker(p0) } @@ -1008,19 +1003,19 @@ type IWalletStruct struct { WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"` - WalletExport func(p0 context.Context, p1 address.Address, p2 string) (*wallet.KeyInfo, error) `perm:"admin"` + WalletExport func(p0 context.Context, p1 address.Address, p2 string) (*types.KeyInfo, error) `perm:"admin"` WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` - WalletImport func(p0 context.Context, p1 *wallet.KeyInfo) (address.Address, error) `perm:"admin"` + WalletImport func(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) `perm:"admin"` WalletNewAddress func(p0 context.Context, p1 address.Protocol) (address.Address, error) `perm:"write"` WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` - WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) `perm:"sign"` + WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) `perm:"sign"` - WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *chain.Message) (*chain.SignedMessage, error) `perm:"sign"` + WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) `perm:"sign"` WalletState func(p0 context.Context) int `perm:"admin"` } @@ -1054,7 +1049,7 @@ func (s *IWalletStruct) WalletDefaultAddress(p0 context.Context) (address.Addres return s.Internal.WalletDefaultAddress(p0) } -func (s *IWalletStruct) WalletExport(p0 context.Context, p1 address.Address, p2 string) (*wallet.KeyInfo, error) { +func (s *IWalletStruct) WalletExport(p0 context.Context, p1 address.Address, p2 string) (*types.KeyInfo, error) { return s.Internal.WalletExport(p0, p1, p2) } @@ -1062,7 +1057,7 @@ func (s *IWalletStruct) WalletHas(p0 context.Context, p1 address.Address) (bool, return s.Internal.WalletHas(p0, p1) } -func (s *IWalletStruct) WalletImport(p0 context.Context, p1 *wallet.KeyInfo) (address.Address, error) { +func (s *IWalletStruct) WalletImport(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) { return s.Internal.WalletImport(p0, p1) } @@ -1074,11 +1069,11 @@ func (s *IWalletStruct) WalletSetDefault(p0 context.Context, p1 address.Address) return s.Internal.WalletSetDefault(p0, p1) } -func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) { +func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) { return s.Internal.WalletSign(p0, p1, p2, p3) } -func (s *IWalletStruct) WalletSignMessage(p0 context.Context, p1 address.Address, p2 *chain.Message) (*chain.SignedMessage, error) { +func (s *IWalletStruct) WalletSignMessage(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) { return s.Internal.WalletSignMessage(p0, p1, p2) } diff --git a/venus-shared/api/chain/v0/syncer.go b/venus-shared/api/chain/v0/syncer.go index 439b7f043b..75224c2795 100644 --- a/venus-shared/api/chain/v0/syncer.go +++ b/venus-shared/api/chain/v0/syncer.go @@ -5,17 +5,16 @@ import ( "github.com/filecoin-project/go-state-types/big" - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type ISyncer interface { - ChainSyncHandleNewTipSet(ctx context.Context, ci *chain.ChainInfo) error //perm:write - SetConcurrent(ctx context.Context, concurrent int64) error //perm:admin - SyncerTracker(ctx context.Context) *chain2.TargetTracker //perm:read - Concurrent(ctx context.Context) int64 //perm:read - ChainTipSetWeight(ctx context.Context, tsk chain.TipSetKey) (big.Int, error) //perm:read - SyncSubmitBlock(ctx context.Context, blk *chain.BlockMsg) error //perm:write - StateCall(ctx context.Context, msg *chain.Message, tsk chain.TipSetKey) (*chain2.InvocResult, error) //perm:read - SyncState(ctx context.Context) (*chain2.SyncState, error) //perm:read + ChainSyncHandleNewTipSet(ctx context.Context, ci *types.ChainInfo) error //perm:write + SetConcurrent(ctx context.Context, concurrent int64) error //perm:admin + SyncerTracker(ctx context.Context) *types.TargetTracker //perm:read + Concurrent(ctx context.Context) int64 //perm:read + ChainTipSetWeight(ctx context.Context, tsk types.TipSetKey) (big.Int, error) //perm:read + SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error //perm:write + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*types.InvocResult, error) //perm:read + SyncState(ctx context.Context) (*types.SyncState, error) //perm:read } diff --git a/venus-shared/api/chain/v0/wallet.go b/venus-shared/api/chain/v0/wallet.go index 0272b2d3bf..ae782d46f4 100644 --- a/venus-shared/api/chain/v0/wallet.go +++ b/venus-shared/api/chain/v0/wallet.go @@ -7,24 +7,23 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/filecoin-project/venus/venus-shared/types" ) type IWallet interface { - WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) //perm:sign - WalletExport(ctx context.Context, addr address.Address, password string) (*wallet.KeyInfo, error) //perm:admin - WalletImport(ctx context.Context, key *wallet.KeyInfo) (address.Address, error) //perm:admin - WalletHas(ctx context.Context, addr address.Address) (bool, error) //perm:write - WalletNewAddress(ctx context.Context, protocol address.Protocol) (address.Address, error) //perm:write - WalletBalance(ctx context.Context, addr address.Address) (abi.TokenAmount, error) //perm:read - WalletDefaultAddress(ctx context.Context) (address.Address, error) //perm:write - WalletAddresses(ctx context.Context) []address.Address //perm:admin - WalletSetDefault(ctx context.Context, addr address.Address) error //perm:write - WalletSignMessage(ctx context.Context, k address.Address, msg *chain.Message) (*chain.SignedMessage, error) //perm:sign - LockWallet(ctx context.Context) error //perm:admin - UnLockWallet(ctx context.Context, password []byte) error //perm:admin - SetPassword(ctx context.Context, password []byte) error //perm:admin - HasPassword(ctx context.Context) bool //perm:admin - WalletState(ctx context.Context) int //perm:admin + WalletSign(ctx context.Context, k address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) //perm:sign + WalletExport(ctx context.Context, addr address.Address, password string) (*types.KeyInfo, error) //perm:admin + WalletImport(ctx context.Context, key *types.KeyInfo) (address.Address, error) //perm:admin + WalletHas(ctx context.Context, addr address.Address) (bool, error) //perm:write + WalletNewAddress(ctx context.Context, protocol address.Protocol) (address.Address, error) //perm:write + WalletBalance(ctx context.Context, addr address.Address) (abi.TokenAmount, error) //perm:read + WalletDefaultAddress(ctx context.Context) (address.Address, error) //perm:write + WalletAddresses(ctx context.Context) []address.Address //perm:admin + WalletSetDefault(ctx context.Context, addr address.Address) error //perm:write + WalletSignMessage(ctx context.Context, k address.Address, msg *types.Message) (*types.SignedMessage, error) //perm:sign + LockWallet(ctx context.Context) error //perm:admin + UnLockWallet(ctx context.Context, password []byte) error //perm:admin + SetPassword(ctx context.Context, password []byte) error //perm:admin + HasPassword(ctx context.Context) bool //perm:admin + WalletState(ctx context.Context) int //perm:admin } diff --git a/venus-shared/api/chain/v1/blockstore.go b/venus-shared/api/chain/v1/blockstore.go index c96e3d04b0..3ffc5c88f4 100644 --- a/venus-shared/api/chain/v1/blockstore.go +++ b/venus-shared/api/chain/v1/blockstore.go @@ -3,14 +3,13 @@ package v1 import ( "context" - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ) type IBlockStore interface { - ChainReadObj(ctx context.Context, cid cid.Cid) ([]byte, error) //perm:read - ChainDeleteObj(ctx context.Context, obj cid.Cid) error //perm:admin - ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) //perm:read - ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (chain2.ObjStat, error) //perm:read + ChainReadObj(ctx context.Context, cid cid.Cid) ([]byte, error) //perm:read + ChainDeleteObj(ctx context.Context, obj cid.Cid) error //perm:admin + ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) //perm:read + ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (types.ObjStat, error) //perm:read } diff --git a/venus-shared/api/chain/v1/chain.go b/venus-shared/api/chain/v1/chain.go index 18629b99c7..28023d31be 100644 --- a/venus-shared/api/chain/v1/chain.go +++ b/venus-shared/api/chain/v1/chain.go @@ -14,8 +14,7 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type IChain interface { @@ -27,48 +26,48 @@ type IChain interface { } type IAccount interface { - StateAccountKey(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (address.Address, error) //perm:read + StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) //perm:read } type IActor interface { - StateGetActor(ctx context.Context, actor address.Address, tsk chain.TipSetKey) (*chain.Actor, error) //perm:read - ListActor(ctx context.Context) (map[address.Address]*chain.Actor, error) //perm:read + StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) //perm:read + ListActor(ctx context.Context) (map[address.Address]*types.Actor, error) //perm:read } type IBeacon interface { - BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*chain.BeaconEntry, error) //perm:read + BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) //perm:read } type IChainInfo interface { BlockTime(ctx context.Context) time.Duration //perm:read - ChainList(ctx context.Context, tsKey chain.TipSetKey, count int) ([]chain.TipSetKey, error) //perm:read - ChainHead(ctx context.Context) (*chain.TipSet, error) //perm:read - ChainSetHead(ctx context.Context, key chain.TipSetKey) error //perm:admin - ChainGetTipSet(ctx context.Context, key chain.TipSetKey) (*chain.TipSet, error) //perm:read - ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk chain.TipSetKey) (*chain.TipSet, error) //perm:read - ChainGetTipSetAfterHeight(ctx context.Context, height abi.ChainEpoch, tsk chain.TipSetKey) (*chain.TipSet, error) //perm:read - ChainGetRandomnessFromBeacon(ctx context.Context, key chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read - ChainGetRandomnessFromTickets(ctx context.Context, tsk chain.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read - StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk chain.TipSetKey) (abi.Randomness, error) //perm:read - StateGetRandomnessFromBeacon(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk chain.TipSetKey) (abi.Randomness, error) //perm:read - ChainGetBlock(ctx context.Context, id cid.Cid) (*chain.BlockHeader, error) //perm:read - ChainGetMessage(ctx context.Context, msgID cid.Cid) (*chain.Message, error) //perm:read - ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*chain2.BlockMessages, error) //perm:read - ChainGetMessagesInTipset(ctx context.Context, key chain.TipSetKey) ([]chain2.Message, error) //perm:read - ChainGetReceipts(ctx context.Context, id cid.Cid) ([]chain.MessageReceipt, error) //perm:read - ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]chain2.Message, error) //perm:read - ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*chain.MessageReceipt, error) //perm:read - StateVerifiedRegistryRootKey(ctx context.Context, tsk chain.TipSetKey) (address.Address, error) //perm:read - StateVerifierStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) //perm:read - ChainNotify(ctx context.Context) (<-chan []*chain2.HeadChange, error) //perm:read - GetFullBlock(ctx context.Context, id cid.Cid) (*chain.FullBlock, error) //perm:read - GetActor(ctx context.Context, addr address.Address) (*chain.Actor, error) //perm:read - GetParentStateRootActor(ctx context.Context, ts *chain.TipSet, addr address.Address) (*chain.Actor, error) //perm:read - GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*chain.BeaconEntry, error) //perm:read - MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*chain2.ChainMessage, error) //perm:read - ProtocolParameters(ctx context.Context) (*chain2.ProtocolParams, error) //perm:read - ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *chain.TipSet) (address.Address, error) //perm:read - StateNetworkName(ctx context.Context) (chain2.NetworkName, error) //perm:read + ChainList(ctx context.Context, tsKey types.TipSetKey, count int) ([]types.TipSetKey, error) //perm:read + ChainHead(ctx context.Context) (*types.TipSet, error) //perm:read + ChainSetHead(ctx context.Context, key types.TipSetKey) error //perm:admin + ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) //perm:read + ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) //perm:read + ChainGetTipSetAfterHeight(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) //perm:read + ChainGetRandomnessFromBeacon(ctx context.Context, key types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read + ChainGetRandomnessFromTickets(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read + StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) //perm:read + StateGetRandomnessFromBeacon(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) //perm:read + ChainGetBlock(ctx context.Context, id cid.Cid) (*types.BlockHeader, error) //perm:read + ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.Message, error) //perm:read + ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*types.BlockMessages, error) //perm:read + ChainGetMessagesInTipset(ctx context.Context, key types.TipSetKey) ([]types.MessageCID, error) //perm:read + ChainGetReceipts(ctx context.Context, id cid.Cid) ([]types.MessageReceipt, error) //perm:read + ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]types.MessageCID, error) //perm:read + ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) //perm:read + StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) //perm:read + StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) //perm:read + ChainNotify(ctx context.Context) (<-chan []*types.HeadChange, error) //perm:read + GetFullBlock(ctx context.Context, id cid.Cid) (*types.FullBlock, error) //perm:read + GetActor(ctx context.Context, addr address.Address) (*types.Actor, error) //perm:read + GetParentStateRootActor(ctx context.Context, ts *types.TipSet, addr address.Address) (*types.Actor, error) //perm:read + GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*types.BeaconEntry, error) //perm:read + MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*types.ChainMessage, error) //perm:read + ProtocolParameters(ctx context.Context) (*types.ProtocolParams, error) //perm:read + ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) //perm:read + StateNetworkName(ctx context.Context) (types.NetworkName, error) //perm:read // StateSearchMsg looks back up to limit epochs in the chain for a message, and returns its receipt and the tipset where it was executed // // NOTE: If a replacing message is found on chain, this method will return @@ -85,7 +84,7 @@ type IChainInfo interface { // A replacing message is a message with a different CID, any of Gas values, and // different signature, but with all other parameters matching (source/destination, // nonce, params, etc.) - StateSearchMsg(ctx context.Context, from chain.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*chain2.MsgLookup, error) //perm:read + StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) //perm:read // StateWaitMsg looks back up to limit epochs in the chain for a message. // If not found, it blocks until the message arrives on chain, and gets to the // indicated confidence depth. @@ -104,42 +103,42 @@ type IChainInfo interface { // A replacing message is a message with a different CID, any of Gas values, and // different signature, but with all other parameters matching (source/destination, // nonce, params, etc.) - StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*chain2.MsgLookup, error) //perm:read - StateNetworkVersion(ctx context.Context, tsk chain.TipSetKey) (network.Version, error) //perm:read - VerifyEntry(parent, child *chain.BeaconEntry, height abi.ChainEpoch) bool //perm:read - ChainExport(context.Context, abi.ChainEpoch, bool, chain.TipSetKey) (<-chan []byte, error) //perm:read - ChainGetPath(ctx context.Context, from chain.TipSetKey, to chain.TipSetKey) ([]*chain2.HeadChange, error) //perm:read + StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) //perm:read + StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) //perm:read + VerifyEntry(parent, child *types.BeaconEntry, height abi.ChainEpoch) bool //perm:read + ChainExport(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []byte, error) //perm:read + ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*types.HeadChange, error) //perm:read } type IMinerState interface { - StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk chain.TipSetKey) (bool, error) //perm:read - StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) //perm:read - StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorOnChainInfo, error) //perm:read - StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorLocation, error) //perm:read - StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (abi.SectorSize, error) //perm:read - StateMinerInfo(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (miner.MinerInfo, error) //perm:read - StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (address.Address, error) //perm:read - StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (bitfield.BitField, error) //perm:read - StateMinerFaults(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (bitfield.BitField, error) //perm:read - StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (*dline.Info, error) //perm:read - StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk chain.TipSetKey) ([]chain2.Partition, error) //perm:read - StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]chain2.Deadline, error) //perm:read - StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) //perm:read - StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk chain.TipSetKey) (*chain2.MarketDeal, error) //perm:read - StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) //perm:read - StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk chain.TipSetKey) (big.Int, error) //perm:read - StateVMCirculatingSupplyInternal(ctx context.Context, tsk chain.TipSetKey) (chain.CirculatingSupply, error) //perm:read - StateCirculatingSupply(ctx context.Context, tsk chain.TipSetKey) (abi.TokenAmount, error) //perm:read - StateMarketDeals(ctx context.Context, tsk chain.TipSetKey) (map[string]chain2.MarketDeal, error) //perm:read - StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) //perm:read - StateLookupID(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (address.Address, error) //perm:read - StateListMiners(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) //perm:read - StateListActors(ctx context.Context, tsk chain.TipSetKey) ([]address.Address, error) //perm:read - StateMinerPower(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*chain2.MinerPower, error) //perm:read - StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk chain.TipSetKey) (big.Int, error) //perm:read - StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk chain.TipSetKey) (*miner.SectorExpiration, error) //perm:read - StateMinerSectorCount(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (chain2.MinerSectors, error) //perm:read - StateMarketBalance(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (chain2.MarketBalance, error) //perm:read - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk chain.TipSetKey) (chain2.DealCollateralBounds, error) //perm:read - StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk chain.TipSetKey) (*abi.StoragePower, error) //perm:read + StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) //perm:read + StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) //perm:read + StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) //perm:read + StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorLocation, error) //perm:read + StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (abi.SectorSize, error) //perm:read + StateMinerInfo(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) //perm:read + StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (address.Address, error) //perm:read + StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) //perm:read + StateMinerFaults(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) //perm:read + StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) //perm:read + StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]types.Partition, error) //perm:read + StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]types.Deadline, error) //perm:read + StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) //perm:read + StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.MarketDeal, error) //perm:read + StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) //perm:read + StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) //perm:read + StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) //perm:read + StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) //perm:read + StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) //perm:read + StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) //perm:read + StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) //perm:read + StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) //perm:read + StateListActors(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) //perm:read + StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.MinerPower, error) //perm:read + StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) //perm:read + StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorExpiration, error) //perm:read + StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MinerSectors, error) //perm:read + StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MarketBalance, error) //perm:read + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (types.DealCollateralBounds, error) //perm:read + StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) //perm:read } diff --git a/venus-shared/api/chain/v1/market.go b/venus-shared/api/chain/v1/market.go index c6c3e0cee3..d3fd0cecf8 100644 --- a/venus-shared/api/chain/v1/market.go +++ b/venus-shared/api/chain/v1/market.go @@ -3,10 +3,9 @@ package v1 import ( "context" - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type IMarket interface { - StateMarketParticipants(ctx context.Context, tsk chain.TipSetKey) (map[string]chain2.MarketBalance, error) //perm:read + StateMarketParticipants(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketBalance, error) //perm:read } diff --git a/venus-shared/api/chain/v1/mining.go b/venus-shared/api/chain/v1/mining.go index d881a2d4a2..16fc35bd8f 100644 --- a/venus-shared/api/chain/v1/mining.go +++ b/venus-shared/api/chain/v1/mining.go @@ -6,11 +6,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type IMining interface { - MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk chain.TipSetKey) (*chain2.MiningBaseInfo, error) //perm:read - MinerCreateBlock(ctx context.Context, bt *chain2.BlockTemplate) (*chain.BlockMsg, error) //perm:write + MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*types.MiningBaseInfo, error) //perm:read + MinerCreateBlock(ctx context.Context, bt *types.BlockTemplate) (*types.BlockMsg, error) //perm:write } diff --git a/venus-shared/api/chain/v1/mock/full.go b/venus-shared/api/chain/v1/mock/full.go index a25825150b..a2a373c911 100644 --- a/venus-shared/api/chain/v1/mock/full.go +++ b/venus-shared/api/chain/v1/mock/full.go @@ -19,12 +19,8 @@ import ( miner "github.com/filecoin-project/specs-actors/actors/builtin/miner" paych "github.com/filecoin-project/specs-actors/actors/builtin/paych" miner0 "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - chain "github.com/filecoin-project/venus/venus-shared/api/chain" - chain0 "github.com/filecoin-project/venus/venus-shared/chain" - net "github.com/filecoin-project/venus/venus-shared/libp2p/net" - messagepool "github.com/filecoin-project/venus/venus-shared/messagepool" - paych0 "github.com/filecoin-project/venus/venus-shared/paych" - wallet "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/filecoin-project/venus/venus-shared/types" + chain0 "github.com/filecoin-project/venus/venus-shared/types" gomock "github.com/golang/mock/gomock" cid "github.com/ipfs/go-cid" metrics "github.com/libp2p/go-libp2p-core/metrics" @@ -144,10 +140,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetBlock(arg0, arg1 interface{}) *gomoc } // ChainGetBlockMessages mocks base method. -func (m *MockFullNode) ChainGetBlockMessages(arg0 context.Context, arg1 cid.Cid) (*chain.BlockMessages, error) { +func (m *MockFullNode) ChainGetBlockMessages(arg0 context.Context, arg1 cid.Cid) (*types.BlockMessages, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetBlockMessages", arg0, arg1) - ret0, _ := ret[0].(*chain.BlockMessages) + ret0, _ := ret[0].(*types.BlockMessages) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -174,10 +170,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetMessage(arg0, arg1 interface{}) *gom } // ChainGetMessagesInTipset mocks base method. -func (m *MockFullNode) ChainGetMessagesInTipset(arg0 context.Context, arg1 chain0.TipSetKey) ([]chain.Message, error) { +func (m *MockFullNode) ChainGetMessagesInTipset(arg0 context.Context, arg1 chain0.TipSetKey) ([]types.Message, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetMessagesInTipset", arg0, arg1) - ret0, _ := ret[0].([]chain.Message) + ret0, _ := ret[0].([]types.Message) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -189,10 +185,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetMessagesInTipset(arg0, arg1 interfac } // ChainGetParentMessages mocks base method. -func (m *MockFullNode) ChainGetParentMessages(arg0 context.Context, arg1 cid.Cid) ([]chain.Message, error) { +func (m *MockFullNode) ChainGetParentMessages(arg0 context.Context, arg1 cid.Cid) ([]types.Message, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetParentMessages", arg0, arg1) - ret0, _ := ret[0].([]chain.Message) + ret0, _ := ret[0].([]types.Message) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -219,10 +215,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetParentReceipts(arg0, arg1 interface{ } // ChainGetPath mocks base method. -func (m *MockFullNode) ChainGetPath(arg0 context.Context, arg1, arg2 chain0.TipSetKey) ([]*chain.HeadChange, error) { +func (m *MockFullNode) ChainGetPath(arg0 context.Context, arg1, arg2 chain0.TipSetKey) ([]*types.HeadChange, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetPath", arg0, arg1, arg2) - ret0, _ := ret[0].([]*chain.HeadChange) + ret0, _ := ret[0].([]*types.HeadChange) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -369,10 +365,10 @@ func (mr *MockFullNodeMockRecorder) ChainList(arg0, arg1, arg2 interface{}) *gom } // ChainNotify mocks base method. -func (m *MockFullNode) ChainNotify(arg0 context.Context) (<-chan []*chain.HeadChange, error) { +func (m *MockFullNode) ChainNotify(arg0 context.Context) (<-chan []*types.HeadChange, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainNotify", arg0) - ret0, _ := ret[0].(<-chan []*chain.HeadChange) + ret0, _ := ret[0].(<-chan []*types.HeadChange) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -413,10 +409,10 @@ func (mr *MockFullNodeMockRecorder) ChainSetHead(arg0, arg1 interface{}) *gomock } // ChainStatObj mocks base method. -func (m *MockFullNode) ChainStatObj(arg0 context.Context, arg1, arg2 cid.Cid) (chain.ObjStat, error) { +func (m *MockFullNode) ChainStatObj(arg0 context.Context, arg1, arg2 cid.Cid) (types.ObjStat, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainStatObj", arg0, arg1, arg2) - ret0, _ := ret[0].(chain.ObjStat) + ret0, _ := ret[0].(types.ObjStat) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -471,10 +467,10 @@ func (mr *MockFullNodeMockRecorder) Concurrent(arg0 interface{}) *gomock.Call { } // GasBatchEstimateMessageGas mocks base method. -func (m *MockFullNode) GasBatchEstimateMessageGas(arg0 context.Context, arg1 []*chain.EstimateMessage, arg2 uint64, arg3 chain0.TipSetKey) ([]*chain.EstimateResult, error) { +func (m *MockFullNode) GasBatchEstimateMessageGas(arg0 context.Context, arg1 []*types.EstimateMessage, arg2 uint64, arg3 chain0.TipSetKey) ([]*types.EstimateResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GasBatchEstimateMessageGas", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].([]*chain.EstimateResult) + ret0, _ := ret[0].([]*types.EstimateResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -531,7 +527,7 @@ func (mr *MockFullNodeMockRecorder) GasEstimateGasPremium(arg0, arg1, arg2, arg3 } // GasEstimateMessageGas mocks base method. -func (m *MockFullNode) GasEstimateMessageGas(arg0 context.Context, arg1 *chain0.Message, arg2 *chain.MessageSendSpec, arg3 chain0.TipSetKey) (*chain0.Message, error) { +func (m *MockFullNode) GasEstimateMessageGas(arg0 context.Context, arg1 *chain0.Message, arg2 *types.MessageSendSpec, arg3 chain0.TipSetKey) (*chain0.Message, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GasEstimateMessageGas", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*chain0.Message) @@ -649,10 +645,10 @@ func (mr *MockFullNodeMockRecorder) LockWallet(arg0 interface{}) *gomock.Call { } // MessageWait mocks base method. -func (m *MockFullNode) MessageWait(arg0 context.Context, arg1 cid.Cid, arg2, arg3 abi.ChainEpoch) (*chain.ChainMessage, error) { +func (m *MockFullNode) MessageWait(arg0 context.Context, arg1 cid.Cid, arg2, arg3 abi.ChainEpoch) (*types.ChainMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MessageWait", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain.ChainMessage) + ret0, _ := ret[0].(*types.ChainMessage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -664,7 +660,7 @@ func (mr *MockFullNodeMockRecorder) MessageWait(arg0, arg1, arg2, arg3 interface } // MinerCreateBlock mocks base method. -func (m *MockFullNode) MinerCreateBlock(arg0 context.Context, arg1 *chain.BlockTemplate) (*chain0.BlockMsg, error) { +func (m *MockFullNode) MinerCreateBlock(arg0 context.Context, arg1 *types.BlockTemplate) (*chain0.BlockMsg, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MinerCreateBlock", arg0, arg1) ret0, _ := ret[0].(*chain0.BlockMsg) @@ -679,10 +675,10 @@ func (mr *MockFullNodeMockRecorder) MinerCreateBlock(arg0, arg1 interface{}) *go } // MinerGetBaseInfo mocks base method. -func (m *MockFullNode) MinerGetBaseInfo(arg0 context.Context, arg1 address.Address, arg2 abi.ChainEpoch, arg3 chain0.TipSetKey) (*chain.MiningBaseInfo, error) { +func (m *MockFullNode) MinerGetBaseInfo(arg0 context.Context, arg1 address.Address, arg2 abi.ChainEpoch, arg3 chain0.TipSetKey) (*types.MiningBaseInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MinerGetBaseInfo", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain.MiningBaseInfo) + ret0, _ := ret[0].(*types.MiningBaseInfo) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -709,7 +705,7 @@ func (mr *MockFullNodeMockRecorder) MpoolBatchPush(arg0, arg1 interface{}) *gomo } // MpoolBatchPushMessage mocks base method. -func (m *MockFullNode) MpoolBatchPushMessage(arg0 context.Context, arg1 []*chain0.Message, arg2 *chain.MessageSendSpec) ([]*chain0.SignedMessage, error) { +func (m *MockFullNode) MpoolBatchPushMessage(arg0 context.Context, arg1 []*chain0.Message, arg2 *types.MessageSendSpec) ([]*chain0.SignedMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolBatchPushMessage", arg0, arg1, arg2) ret0, _ := ret[0].([]*chain0.SignedMessage) @@ -739,10 +735,10 @@ func (mr *MockFullNodeMockRecorder) MpoolBatchPushUntrusted(arg0, arg1 interface } // MpoolCheckMessages mocks base method. -func (m *MockFullNode) MpoolCheckMessages(arg0 context.Context, arg1 []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) { +func (m *MockFullNode) MpoolCheckMessages(arg0 context.Context, arg1 []*chain0.MessagePrototype) ([][]chain0.MessageCheckStatus, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolCheckMessages", arg0, arg1) - ret0, _ := ret[0].([][]messagepool.MessageCheckStatus) + ret0, _ := ret[0].([][]chain0.MessageCheckStatus) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -754,10 +750,10 @@ func (mr *MockFullNodeMockRecorder) MpoolCheckMessages(arg0, arg1 interface{}) * } // MpoolCheckPendingMessages mocks base method. -func (m *MockFullNode) MpoolCheckPendingMessages(arg0 context.Context, arg1 address.Address) ([][]messagepool.MessageCheckStatus, error) { +func (m *MockFullNode) MpoolCheckPendingMessages(arg0 context.Context, arg1 address.Address) ([][]chain0.MessageCheckStatus, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolCheckPendingMessages", arg0, arg1) - ret0, _ := ret[0].([][]messagepool.MessageCheckStatus) + ret0, _ := ret[0].([][]chain0.MessageCheckStatus) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -769,10 +765,10 @@ func (mr *MockFullNodeMockRecorder) MpoolCheckPendingMessages(arg0, arg1 interfa } // MpoolCheckReplaceMessages mocks base method. -func (m *MockFullNode) MpoolCheckReplaceMessages(arg0 context.Context, arg1 []*chain0.Message) ([][]messagepool.MessageCheckStatus, error) { +func (m *MockFullNode) MpoolCheckReplaceMessages(arg0 context.Context, arg1 []*chain0.Message) ([][]chain0.MessageCheckStatus, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolCheckReplaceMessages", arg0, arg1) - ret0, _ := ret[0].([][]messagepool.MessageCheckStatus) + ret0, _ := ret[0].([][]chain0.MessageCheckStatus) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -812,10 +808,10 @@ func (mr *MockFullNodeMockRecorder) MpoolDeleteByAdress(arg0, arg1 interface{}) } // MpoolGetConfig mocks base method. -func (m *MockFullNode) MpoolGetConfig(arg0 context.Context) (*messagepool.MpoolConfig, error) { +func (m *MockFullNode) MpoolGetConfig(arg0 context.Context) (*chain0.MpoolConfig, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolGetConfig", arg0) - ret0, _ := ret[0].(*messagepool.MpoolConfig) + ret0, _ := ret[0].(*chain0.MpoolConfig) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -900,7 +896,7 @@ func (mr *MockFullNodeMockRecorder) MpoolPush(arg0, arg1 interface{}) *gomock.Ca } // MpoolPushMessage mocks base method. -func (m *MockFullNode) MpoolPushMessage(arg0 context.Context, arg1 *chain0.Message, arg2 *chain.MessageSendSpec) (*chain0.SignedMessage, error) { +func (m *MockFullNode) MpoolPushMessage(arg0 context.Context, arg1 *chain0.Message, arg2 *types.MessageSendSpec) (*chain0.SignedMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolPushMessage", arg0, arg1, arg2) ret0, _ := ret[0].(*chain0.SignedMessage) @@ -960,7 +956,7 @@ func (mr *MockFullNodeMockRecorder) MpoolSelects(arg0, arg1, arg2 interface{}) * } // MpoolSetConfig mocks base method. -func (m *MockFullNode) MpoolSetConfig(arg0 context.Context, arg1 *messagepool.MpoolConfig) error { +func (m *MockFullNode) MpoolSetConfig(arg0 context.Context, arg1 *chain0.MpoolConfig) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolSetConfig", arg0, arg1) ret0, _ := ret[0].(error) @@ -974,10 +970,10 @@ func (mr *MockFullNodeMockRecorder) MpoolSetConfig(arg0, arg1 interface{}) *gomo } // MpoolSub mocks base method. -func (m *MockFullNode) MpoolSub(arg0 context.Context) (<-chan messagepool.MpoolUpdate, error) { +func (m *MockFullNode) MpoolSub(arg0 context.Context) (<-chan chain0.MpoolUpdate, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolSub", arg0) - ret0, _ := ret[0].(<-chan messagepool.MpoolUpdate) + ret0, _ := ret[0].(<-chan chain0.MpoolUpdate) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -989,10 +985,10 @@ func (mr *MockFullNodeMockRecorder) MpoolSub(arg0 interface{}) *gomock.Call { } // MsigAddApprove mocks base method. -func (m *MockFullNode) MsigAddApprove(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5 address.Address, arg6 bool) (*messagepool.MessagePrototype, error) { +func (m *MockFullNode) MsigAddApprove(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5 address.Address, arg6 bool) (*chain0.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigAddApprove", arg0, arg1, arg2, arg3, arg4, arg5, arg6) - ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret0, _ := ret[0].(*chain0.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1004,10 +1000,10 @@ func (mr *MockFullNodeMockRecorder) MsigAddApprove(arg0, arg1, arg2, arg3, arg4, } // MsigAddCancel mocks base method. -func (m *MockFullNode) MsigAddCancel(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4 address.Address, arg5 bool) (*messagepool.MessagePrototype, error) { +func (m *MockFullNode) MsigAddCancel(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4 address.Address, arg5 bool) (*chain0.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigAddCancel", arg0, arg1, arg2, arg3, arg4, arg5) - ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret0, _ := ret[0].(*chain0.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1019,10 +1015,10 @@ func (mr *MockFullNodeMockRecorder) MsigAddCancel(arg0, arg1, arg2, arg3, arg4, } // MsigAddPropose mocks base method. -func (m *MockFullNode) MsigAddPropose(arg0 context.Context, arg1, arg2, arg3 address.Address, arg4 bool) (*messagepool.MessagePrototype, error) { +func (m *MockFullNode) MsigAddPropose(arg0 context.Context, arg1, arg2, arg3 address.Address, arg4 bool) (*chain0.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigAddPropose", arg0, arg1, arg2, arg3, arg4) - ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret0, _ := ret[0].(*chain0.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1034,10 +1030,10 @@ func (mr *MockFullNodeMockRecorder) MsigAddPropose(arg0, arg1, arg2, arg3, arg4 } // MsigApprove mocks base method. -func (m *MockFullNode) MsigApprove(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address) (*messagepool.MessagePrototype, error) { +func (m *MockFullNode) MsigApprove(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address) (*chain0.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigApprove", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret0, _ := ret[0].(*chain0.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1049,10 +1045,10 @@ func (mr *MockFullNodeMockRecorder) MsigApprove(arg0, arg1, arg2, arg3 interface } // MsigApproveTxnHash mocks base method. -func (m *MockFullNode) MsigApproveTxnHash(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3, arg4 address.Address, arg5 big.Int, arg6 address.Address, arg7 uint64, arg8 []byte) (*messagepool.MessagePrototype, error) { +func (m *MockFullNode) MsigApproveTxnHash(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3, arg4 address.Address, arg5 big.Int, arg6 address.Address, arg7 uint64, arg8 []byte) (*chain0.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigApproveTxnHash", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) - ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret0, _ := ret[0].(*chain0.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1064,10 +1060,10 @@ func (mr *MockFullNodeMockRecorder) MsigApproveTxnHash(arg0, arg1, arg2, arg3, a } // MsigCancel mocks base method. -func (m *MockFullNode) MsigCancel(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address) (*messagepool.MessagePrototype, error) { +func (m *MockFullNode) MsigCancel(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address) (*chain0.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigCancel", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret0, _ := ret[0].(*chain0.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1079,10 +1075,10 @@ func (mr *MockFullNodeMockRecorder) MsigCancel(arg0, arg1, arg2, arg3 interface{ } // MsigCancelTxnHash mocks base method. -func (m *MockFullNode) MsigCancelTxnHash(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address, arg4 big.Int, arg5 address.Address, arg6 uint64, arg7 []byte) (*messagepool.MessagePrototype, error) { +func (m *MockFullNode) MsigCancelTxnHash(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address, arg4 big.Int, arg5 address.Address, arg6 uint64, arg7 []byte) (*chain0.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigCancelTxnHash", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) - ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret0, _ := ret[0].(*chain0.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1094,10 +1090,10 @@ func (mr *MockFullNodeMockRecorder) MsigCancelTxnHash(arg0, arg1, arg2, arg3, ar } // MsigCreate mocks base method. -func (m *MockFullNode) MsigCreate(arg0 context.Context, arg1 uint64, arg2 []address.Address, arg3 abi.ChainEpoch, arg4 big.Int, arg5 address.Address, arg6 big.Int) (*messagepool.MessagePrototype, error) { +func (m *MockFullNode) MsigCreate(arg0 context.Context, arg1 uint64, arg2 []address.Address, arg3 abi.ChainEpoch, arg4 big.Int, arg5 address.Address, arg6 big.Int) (*chain0.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigCreate", arg0, arg1, arg2, arg3, arg4, arg5, arg6) - ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret0, _ := ret[0].(*chain0.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1124,10 +1120,10 @@ func (mr *MockFullNodeMockRecorder) MsigGetVested(arg0, arg1, arg2, arg3 interfa } // MsigPropose mocks base method. -func (m *MockFullNode) MsigPropose(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int, arg4 address.Address, arg5 uint64, arg6 []byte) (*messagepool.MessagePrototype, error) { +func (m *MockFullNode) MsigPropose(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int, arg4 address.Address, arg5 uint64, arg6 []byte) (*chain0.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigPropose", arg0, arg1, arg2, arg3, arg4, arg5, arg6) - ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret0, _ := ret[0].(*chain0.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1139,10 +1135,10 @@ func (mr *MockFullNodeMockRecorder) MsigPropose(arg0, arg1, arg2, arg3, arg4, ar } // MsigRemoveSigner mocks base method. -func (m *MockFullNode) MsigRemoveSigner(arg0 context.Context, arg1, arg2, arg3 address.Address, arg4 bool) (*messagepool.MessagePrototype, error) { +func (m *MockFullNode) MsigRemoveSigner(arg0 context.Context, arg1, arg2, arg3 address.Address, arg4 bool) (*chain0.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigRemoveSigner", arg0, arg1, arg2, arg3, arg4) - ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret0, _ := ret[0].(*chain0.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1154,10 +1150,10 @@ func (mr *MockFullNodeMockRecorder) MsigRemoveSigner(arg0, arg1, arg2, arg3, arg } // MsigSwapApprove mocks base method. -func (m *MockFullNode) MsigSwapApprove(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5, arg6 address.Address) (*messagepool.MessagePrototype, error) { +func (m *MockFullNode) MsigSwapApprove(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5, arg6 address.Address) (*chain0.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigSwapApprove", arg0, arg1, arg2, arg3, arg4, arg5, arg6) - ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret0, _ := ret[0].(*chain0.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1169,10 +1165,10 @@ func (mr *MockFullNodeMockRecorder) MsigSwapApprove(arg0, arg1, arg2, arg3, arg4 } // MsigSwapCancel mocks base method. -func (m *MockFullNode) MsigSwapCancel(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5 address.Address) (*messagepool.MessagePrototype, error) { +func (m *MockFullNode) MsigSwapCancel(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5 address.Address) (*chain0.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigSwapCancel", arg0, arg1, arg2, arg3, arg4, arg5) - ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret0, _ := ret[0].(*chain0.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1184,10 +1180,10 @@ func (mr *MockFullNodeMockRecorder) MsigSwapCancel(arg0, arg1, arg2, arg3, arg4, } // MsigSwapPropose mocks base method. -func (m *MockFullNode) MsigSwapPropose(arg0 context.Context, arg1, arg2, arg3, arg4 address.Address) (*messagepool.MessagePrototype, error) { +func (m *MockFullNode) MsigSwapPropose(arg0 context.Context, arg1, arg2, arg3, arg4 address.Address) (*chain0.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigSwapPropose", arg0, arg1, arg2, arg3, arg4) - ret0, _ := ret[0].(*messagepool.MessagePrototype) + ret0, _ := ret[0].(*chain0.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1214,10 +1210,10 @@ func (mr *MockFullNodeMockRecorder) NetAddrsListen(arg0 interface{}) *gomock.Cal } // NetworkConnect mocks base method. -func (m *MockFullNode) NetworkConnect(arg0 context.Context, arg1 []string) (<-chan net.ConnectionResult, error) { +func (m *MockFullNode) NetworkConnect(arg0 context.Context, arg1 []string) (<-chan chain0.ConnectionResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NetworkConnect", arg0, arg1) - ret0, _ := ret[0].(<-chan net.ConnectionResult) + ret0, _ := ret[0].(<-chan chain0.ConnectionResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1315,10 +1311,10 @@ func (mr *MockFullNodeMockRecorder) NetworkGetPeerID(arg0 interface{}) *gomock.C } // NetworkPeers mocks base method. -func (m *MockFullNode) NetworkPeers(arg0 context.Context, arg1, arg2, arg3 bool) (*net.SwarmConnInfos, error) { +func (m *MockFullNode) NetworkPeers(arg0 context.Context, arg1, arg2, arg3 bool) (*chain0.SwarmConnInfos, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NetworkPeers", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*net.SwarmConnInfos) + ret0, _ := ret[0].(*chain0.SwarmConnInfos) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1345,10 +1341,10 @@ func (mr *MockFullNodeMockRecorder) PaychAllocateLane(arg0, arg1 interface{}) *g } // PaychAvailableFunds mocks base method. -func (m *MockFullNode) PaychAvailableFunds(arg0 context.Context, arg1 address.Address) (*chain.ChannelAvailableFunds, error) { +func (m *MockFullNode) PaychAvailableFunds(arg0 context.Context, arg1 address.Address) (*types.ChannelAvailableFunds, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychAvailableFunds", arg0, arg1) - ret0, _ := ret[0].(*chain.ChannelAvailableFunds) + ret0, _ := ret[0].(*types.ChannelAvailableFunds) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1360,10 +1356,10 @@ func (mr *MockFullNodeMockRecorder) PaychAvailableFunds(arg0, arg1 interface{}) } // PaychAvailableFundsByFromTo mocks base method. -func (m *MockFullNode) PaychAvailableFundsByFromTo(arg0 context.Context, arg1, arg2 address.Address) (*chain.ChannelAvailableFunds, error) { +func (m *MockFullNode) PaychAvailableFundsByFromTo(arg0 context.Context, arg1, arg2 address.Address) (*types.ChannelAvailableFunds, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychAvailableFundsByFromTo", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain.ChannelAvailableFunds) + ret0, _ := ret[0].(*types.ChannelAvailableFunds) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1390,10 +1386,10 @@ func (mr *MockFullNodeMockRecorder) PaychCollect(arg0, arg1 interface{}) *gomock } // PaychGet mocks base method. -func (m *MockFullNode) PaychGet(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int) (*paych0.ChannelInfo, error) { +func (m *MockFullNode) PaychGet(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int) (*chain0.ChannelInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychGet", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*paych0.ChannelInfo) + ret0, _ := ret[0].(*chain0.ChannelInfo) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1435,10 +1431,10 @@ func (mr *MockFullNodeMockRecorder) PaychList(arg0 interface{}) *gomock.Call { } // PaychNewPayment mocks base method. -func (m *MockFullNode) PaychNewPayment(arg0 context.Context, arg1, arg2 address.Address, arg3 []paych0.VoucherSpec) (*paych0.PaymentInfo, error) { +func (m *MockFullNode) PaychNewPayment(arg0 context.Context, arg1, arg2 address.Address, arg3 []chain0.VoucherSpec) (*chain0.PaymentInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychNewPayment", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*paych0.PaymentInfo) + ret0, _ := ret[0].(*chain0.PaymentInfo) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1465,10 +1461,10 @@ func (mr *MockFullNodeMockRecorder) PaychSettle(arg0, arg1 interface{}) *gomock. } // PaychStatus mocks base method. -func (m *MockFullNode) PaychStatus(arg0 context.Context, arg1 address.Address) (*paych0.Status, error) { +func (m *MockFullNode) PaychStatus(arg0 context.Context, arg1 address.Address) (*chain0.Status, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychStatus", arg0, arg1) - ret0, _ := ret[0].(*paych0.Status) + ret0, _ := ret[0].(*chain0.Status) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1524,10 +1520,10 @@ func (mr *MockFullNodeMockRecorder) PaychVoucherCheckValid(arg0, arg1, arg2 inte } // PaychVoucherCreate mocks base method. -func (m *MockFullNode) PaychVoucherCreate(arg0 context.Context, arg1 address.Address, arg2 big.Int, arg3 uint64) (*paych0.VoucherCreateResult, error) { +func (m *MockFullNode) PaychVoucherCreate(arg0 context.Context, arg1 address.Address, arg2 big.Int, arg3 uint64) (*chain0.VoucherCreateResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychVoucherCreate", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*paych0.VoucherCreateResult) + ret0, _ := ret[0].(*chain0.VoucherCreateResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1569,10 +1565,10 @@ func (mr *MockFullNodeMockRecorder) PaychVoucherSubmit(arg0, arg1, arg2, arg3, a } // ProtocolParameters mocks base method. -func (m *MockFullNode) ProtocolParameters(arg0 context.Context) (*chain.ProtocolParams, error) { +func (m *MockFullNode) ProtocolParameters(arg0 context.Context) (*types.ProtocolParams, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ProtocolParameters", arg0) - ret0, _ := ret[0].(*chain.ProtocolParams) + ret0, _ := ret[0].(*types.ProtocolParams) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1642,10 +1638,10 @@ func (mr *MockFullNodeMockRecorder) StateAccountKey(arg0, arg1, arg2 interface{} } // StateCall mocks base method. -func (m *MockFullNode) StateCall(arg0 context.Context, arg1 *chain0.Message, arg2 chain0.TipSetKey) (*chain.InvocResult, error) { +func (m *MockFullNode) StateCall(arg0 context.Context, arg1 *chain0.Message, arg2 chain0.TipSetKey) (*types.InvocResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateCall", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain.InvocResult) + ret0, _ := ret[0].(*types.InvocResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1672,10 +1668,10 @@ func (mr *MockFullNodeMockRecorder) StateCirculatingSupply(arg0, arg1 interface{ } // StateDealProviderCollateralBounds mocks base method. -func (m *MockFullNode) StateDealProviderCollateralBounds(arg0 context.Context, arg1 abi.PaddedPieceSize, arg2 bool, arg3 chain0.TipSetKey) (chain.DealCollateralBounds, error) { +func (m *MockFullNode) StateDealProviderCollateralBounds(arg0 context.Context, arg1 abi.PaddedPieceSize, arg2 bool, arg3 chain0.TipSetKey) (types.DealCollateralBounds, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateDealProviderCollateralBounds", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(chain.DealCollateralBounds) + ret0, _ := ret[0].(types.DealCollateralBounds) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1777,10 +1773,10 @@ func (mr *MockFullNodeMockRecorder) StateLookupID(arg0, arg1, arg2 interface{}) } // StateMarketBalance mocks base method. -func (m *MockFullNode) StateMarketBalance(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (chain.MarketBalance, error) { +func (m *MockFullNode) StateMarketBalance(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (types.MarketBalance, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketBalance", arg0, arg1, arg2) - ret0, _ := ret[0].(chain.MarketBalance) + ret0, _ := ret[0].(types.MarketBalance) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1792,10 +1788,10 @@ func (mr *MockFullNodeMockRecorder) StateMarketBalance(arg0, arg1, arg2 interfac } // StateMarketDeals mocks base method. -func (m *MockFullNode) StateMarketDeals(arg0 context.Context, arg1 chain0.TipSetKey) (map[string]chain.MarketDeal, error) { +func (m *MockFullNode) StateMarketDeals(arg0 context.Context, arg1 chain0.TipSetKey) (map[string]types.MarketDeal, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketDeals", arg0, arg1) - ret0, _ := ret[0].(map[string]chain.MarketDeal) + ret0, _ := ret[0].(map[string]types.MarketDeal) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1807,10 +1803,10 @@ func (mr *MockFullNodeMockRecorder) StateMarketDeals(arg0, arg1 interface{}) *go } // StateMarketParticipants mocks base method. -func (m *MockFullNode) StateMarketParticipants(arg0 context.Context, arg1 chain0.TipSetKey) (map[string]chain.MarketBalance, error) { +func (m *MockFullNode) StateMarketParticipants(arg0 context.Context, arg1 chain0.TipSetKey) (map[string]types.MarketBalance, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketParticipants", arg0, arg1) - ret0, _ := ret[0].(map[string]chain.MarketBalance) + ret0, _ := ret[0].(map[string]types.MarketBalance) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1822,10 +1818,10 @@ func (mr *MockFullNodeMockRecorder) StateMarketParticipants(arg0, arg1 interface } // StateMarketStorageDeal mocks base method. -func (m *MockFullNode) StateMarketStorageDeal(arg0 context.Context, arg1 abi.DealID, arg2 chain0.TipSetKey) (*chain.MarketDeal, error) { +func (m *MockFullNode) StateMarketStorageDeal(arg0 context.Context, arg1 abi.DealID, arg2 chain0.TipSetKey) (*types.MarketDeal, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketStorageDeal", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain.MarketDeal) + ret0, _ := ret[0].(*types.MarketDeal) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1867,10 +1863,10 @@ func (mr *MockFullNodeMockRecorder) StateMinerAvailableBalance(arg0, arg1, arg2 } // StateMinerDeadlines mocks base method. -func (m *MockFullNode) StateMinerDeadlines(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) ([]chain.Deadline, error) { +func (m *MockFullNode) StateMinerDeadlines(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) ([]types.Deadline, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerDeadlines", arg0, arg1, arg2) - ret0, _ := ret[0].([]chain.Deadline) + ret0, _ := ret[0].([]types.Deadline) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1927,10 +1923,10 @@ func (mr *MockFullNodeMockRecorder) StateMinerInitialPledgeCollateral(arg0, arg1 } // StateMinerPartitions mocks base method. -func (m *MockFullNode) StateMinerPartitions(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 chain0.TipSetKey) ([]chain.Partition, error) { +func (m *MockFullNode) StateMinerPartitions(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 chain0.TipSetKey) ([]types.Partition, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerPartitions", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].([]chain.Partition) + ret0, _ := ret[0].([]types.Partition) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1942,10 +1938,10 @@ func (mr *MockFullNodeMockRecorder) StateMinerPartitions(arg0, arg1, arg2, arg3 } // StateMinerPower mocks base method. -func (m *MockFullNode) StateMinerPower(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*chain.MinerPower, error) { +func (m *MockFullNode) StateMinerPower(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*types.MinerPower, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerPower", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain.MinerPower) + ret0, _ := ret[0].(*types.MinerPower) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2017,10 +2013,10 @@ func (mr *MockFullNodeMockRecorder) StateMinerSectorAllocated(arg0, arg1, arg2, } // StateMinerSectorCount mocks base method. -func (m *MockFullNode) StateMinerSectorCount(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (chain.MinerSectors, error) { +func (m *MockFullNode) StateMinerSectorCount(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (types.MinerSectors, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerSectorCount", arg0, arg1, arg2) - ret0, _ := ret[0].(chain.MinerSectors) + ret0, _ := ret[0].(types.MinerSectors) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2077,10 +2073,10 @@ func (mr *MockFullNodeMockRecorder) StateMinerWorkerAddress(arg0, arg1, arg2 int } // StateNetworkName mocks base method. -func (m *MockFullNode) StateNetworkName(arg0 context.Context) (chain.NetworkName, error) { +func (m *MockFullNode) StateNetworkName(arg0 context.Context) (types.NetworkName, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateNetworkName", arg0) - ret0, _ := ret[0].(chain.NetworkName) + ret0, _ := ret[0].(types.NetworkName) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2107,10 +2103,10 @@ func (mr *MockFullNodeMockRecorder) StateNetworkVersion(arg0, arg1 interface{}) } // StateSearchMsg mocks base method. -func (m *MockFullNode) StateSearchMsg(arg0 context.Context, arg1 chain0.TipSetKey, arg2 cid.Cid, arg3 abi.ChainEpoch, arg4 bool) (*chain.MsgLookup, error) { +func (m *MockFullNode) StateSearchMsg(arg0 context.Context, arg1 chain0.TipSetKey, arg2 cid.Cid, arg3 abi.ChainEpoch, arg4 bool) (*types.MsgLookup, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateSearchMsg", arg0, arg1, arg2, arg3, arg4) - ret0, _ := ret[0].(*chain.MsgLookup) + ret0, _ := ret[0].(*types.MsgLookup) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2242,10 +2238,10 @@ func (mr *MockFullNodeMockRecorder) StateVerifierStatus(arg0, arg1, arg2 interfa } // StateWaitMsg mocks base method. -func (m *MockFullNode) StateWaitMsg(arg0 context.Context, arg1 cid.Cid, arg2 uint64, arg3 abi.ChainEpoch, arg4 bool) (*chain.MsgLookup, error) { +func (m *MockFullNode) StateWaitMsg(arg0 context.Context, arg1 cid.Cid, arg2 uint64, arg3 abi.ChainEpoch, arg4 bool) (*types.MsgLookup, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateWaitMsg", arg0, arg1, arg2, arg3, arg4) - ret0, _ := ret[0].(*chain.MsgLookup) + ret0, _ := ret[0].(*types.MsgLookup) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2257,10 +2253,10 @@ func (mr *MockFullNodeMockRecorder) StateWaitMsg(arg0, arg1, arg2, arg3, arg4 in } // SyncState mocks base method. -func (m *MockFullNode) SyncState(arg0 context.Context) (*chain.SyncState, error) { +func (m *MockFullNode) SyncState(arg0 context.Context) (*types.SyncState, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SyncState", arg0) - ret0, _ := ret[0].(*chain.SyncState) + ret0, _ := ret[0].(*types.SyncState) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2286,10 +2282,10 @@ func (mr *MockFullNodeMockRecorder) SyncSubmitBlock(arg0, arg1 interface{}) *gom } // SyncerTracker mocks base method. -func (m *MockFullNode) SyncerTracker(arg0 context.Context) *chain.TargetTracker { +func (m *MockFullNode) SyncerTracker(arg0 context.Context) *types.TargetTracker { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SyncerTracker", arg0) - ret0, _ := ret[0].(*chain.TargetTracker) + ret0, _ := ret[0].(*types.TargetTracker) return ret0 } @@ -2343,10 +2339,10 @@ func (mr *MockFullNodeMockRecorder) VerifyEntry(arg0, arg1, arg2 interface{}) *g } // Version mocks base method. -func (m *MockFullNode) Version(arg0 context.Context) (chain.Version, error) { +func (m *MockFullNode) Version(arg0 context.Context) (types.Version, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Version", arg0) - ret0, _ := ret[0].(chain.Version) + ret0, _ := ret[0].(types.Version) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2402,10 +2398,10 @@ func (mr *MockFullNodeMockRecorder) WalletDefaultAddress(arg0 interface{}) *gomo } // WalletExport mocks base method. -func (m *MockFullNode) WalletExport(arg0 context.Context, arg1 address.Address, arg2 string) (*wallet.KeyInfo, error) { +func (m *MockFullNode) WalletExport(arg0 context.Context, arg1 address.Address, arg2 string) (*chain0.KeyInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WalletExport", arg0, arg1, arg2) - ret0, _ := ret[0].(*wallet.KeyInfo) + ret0, _ := ret[0].(*chain0.KeyInfo) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2432,7 +2428,7 @@ func (mr *MockFullNodeMockRecorder) WalletHas(arg0, arg1 interface{}) *gomock.Ca } // WalletImport mocks base method. -func (m *MockFullNode) WalletImport(arg0 context.Context, arg1 *wallet.KeyInfo) (address.Address, error) { +func (m *MockFullNode) WalletImport(arg0 context.Context, arg1 *chain0.KeyInfo) (address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WalletImport", arg0, arg1) ret0, _ := ret[0].(address.Address) @@ -2476,7 +2472,7 @@ func (mr *MockFullNodeMockRecorder) WalletSetDefault(arg0, arg1 interface{}) *go } // WalletSign mocks base method. -func (m *MockFullNode) WalletSign(arg0 context.Context, arg1 address.Address, arg2 []byte, arg3 wallet.MsgMeta) (*crypto.Signature, error) { +func (m *MockFullNode) WalletSign(arg0 context.Context, arg1 address.Address, arg2 []byte, arg3 chain0.MsgMeta) (*crypto.Signature, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WalletSign", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*crypto.Signature) diff --git a/venus-shared/api/chain/v1/mpool.go b/venus-shared/api/chain/v1/mpool.go index 584239f18f..945d8337e6 100644 --- a/venus-shared/api/chain/v1/mpool.go +++ b/venus-shared/api/chain/v1/mpool.go @@ -7,38 +7,36 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/messagepool" + "github.com/filecoin-project/venus/venus-shared/types" ) type IMessagePool interface { - MpoolDeleteByAdress(ctx context.Context, addr address.Address) error //perm:admin - MpoolPublishByAddr(context.Context, address.Address) error //perm:write - MpoolPublishMessage(ctx context.Context, smsg *chain.SignedMessage) error //perm:write - MpoolPush(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) //perm:write - MpoolGetConfig(context.Context) (*messagepool.MpoolConfig, error) //perm:read - MpoolSetConfig(ctx context.Context, cfg *messagepool.MpoolConfig) error //perm:admin - MpoolSelect(context.Context, chain.TipSetKey, float64) ([]*chain.SignedMessage, error) //perm:read - MpoolSelects(context.Context, chain.TipSetKey, []float64) ([][]*chain.SignedMessage, error) //perm:read - MpoolPending(ctx context.Context, tsk chain.TipSetKey) ([]*chain.SignedMessage, error) //perm:read - MpoolClear(ctx context.Context, local bool) error //perm:write - MpoolPushUntrusted(ctx context.Context, smsg *chain.SignedMessage) (cid.Cid, error) //perm:write - MpoolPushMessage(ctx context.Context, msg *chain.Message, spec *chain2.MessageSendSpec) (*chain.SignedMessage, error) //perm:sign - MpoolBatchPush(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) //perm:write - MpoolBatchPushUntrusted(ctx context.Context, smsgs []*chain.SignedMessage) ([]cid.Cid, error) //perm:write - MpoolBatchPushMessage(ctx context.Context, msgs []*chain.Message, spec *chain2.MessageSendSpec) ([]*chain.SignedMessage, error) //perm:sign - MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) //perm:read - MpoolSub(ctx context.Context) (<-chan messagepool.MpoolUpdate, error) //perm:read - GasEstimateMessageGas(ctx context.Context, msg *chain.Message, spec *chain2.MessageSendSpec, tsk chain.TipSetKey) (*chain.Message, error) //perm:read - GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*chain2.EstimateMessage, fromNonce uint64, tsk chain.TipSetKey) ([]*chain2.EstimateResult, error) //perm:read - GasEstimateFeeCap(ctx context.Context, msg *chain.Message, maxqueueblks int64, tsk chain.TipSetKey) (big.Int, error) //perm:read - GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk chain.TipSetKey) (big.Int, error) //perm:read - GasEstimateGasLimit(ctx context.Context, msgIn *chain.Message, tsk chain.TipSetKey) (int64, error) //perm:read + MpoolDeleteByAdress(ctx context.Context, addr address.Address) error //perm:admin + MpoolPublishByAddr(context.Context, address.Address) error //perm:write + MpoolPublishMessage(ctx context.Context, smsg *types.SignedMessage) error //perm:write + MpoolPush(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) //perm:write + MpoolGetConfig(context.Context) (*types.MpoolConfig, error) //perm:read + MpoolSetConfig(ctx context.Context, cfg *types.MpoolConfig) error //perm:admin + MpoolSelect(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) //perm:read + MpoolSelects(context.Context, types.TipSetKey, []float64) ([][]*types.SignedMessage, error) //perm:read + MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*types.SignedMessage, error) //perm:read + MpoolClear(ctx context.Context, local bool) error //perm:write + MpoolPushUntrusted(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) //perm:write + MpoolPushMessage(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec) (*types.SignedMessage, error) //perm:sign + MpoolBatchPush(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) //perm:write + MpoolBatchPushUntrusted(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) //perm:write + MpoolBatchPushMessage(ctx context.Context, msgs []*types.Message, spec *types.MessageSendSpec) ([]*types.SignedMessage, error) //perm:sign + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) //perm:read + MpoolSub(ctx context.Context) (<-chan types.MpoolUpdate, error) //perm:read + GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) //perm:read + GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) //perm:read + GasEstimateFeeCap(ctx context.Context, msg *types.Message, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) //perm:read + GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk types.TipSetKey) (big.Int, error) //perm:read + GasEstimateGasLimit(ctx context.Context, msgIn *types.Message, tsk types.TipSetKey) (int64, error) //perm:read // MpoolCheckMessages performs logical checks on a batch of messages - MpoolCheckMessages(ctx context.Context, protos []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) //perm:read + MpoolCheckMessages(ctx context.Context, protos []*types.MessagePrototype) ([][]types.MessageCheckStatus, error) //perm:read // MpoolCheckPendingMessages performs logical checks for all pending messages from a given address - MpoolCheckPendingMessages(ctx context.Context, addr address.Address) ([][]messagepool.MessageCheckStatus, error) //perm:read + MpoolCheckPendingMessages(ctx context.Context, addr address.Address) ([][]types.MessageCheckStatus, error) //perm:read // MpoolCheckReplaceMessages performs logical checks on pending messages with replacement - MpoolCheckReplaceMessages(ctx context.Context, msg []*chain.Message) ([][]messagepool.MessageCheckStatus, error) //perm:read + MpoolCheckReplaceMessages(ctx context.Context, msg []*types.Message) ([][]types.MessageCheckStatus, error) //perm:read } diff --git a/venus-shared/api/chain/v1/multisig.go b/venus-shared/api/chain/v1/multisig.go index f65d7a9662..48d145cbb6 100644 --- a/venus-shared/api/chain/v1/multisig.go +++ b/venus-shared/api/chain/v1/multisig.go @@ -6,26 +6,25 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/messagepool" + "github.com/filecoin-project/venus/venus-shared/types" ) type IMultiSig interface { - MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val chain.BigInt, src address.Address, gp chain.BigInt) (*messagepool.MessagePrototype, error) //perm:sign - MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) //perm:sign - MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) //perm:sign - MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) //perm:sign - MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*messagepool.MessagePrototype, error) //perm:sign + MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (*types.MessagePrototype, error) //perm:sign + MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*types.MessagePrototype, error) //perm:sign + MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*types.MessagePrototype, error) //perm:sign + MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*types.MessagePrototype, error) //perm:sign + MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*types.MessagePrototype, error) //perm:sign // MsigCancel cancels a previously-proposed multisig message // It takes the following params: , , , , // , , - MsigCancelTxnHash(context.Context, address.Address, uint64, address.Address, chain.BigInt, address.Address, uint64, []byte) (*messagepool.MessagePrototype, error) //perm:sign - MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) //perm:sign - MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) //perm:sign - MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*messagepool.MessagePrototype, error) //perm:sign - MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) //perm:sign - MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt chain.BigInt, src address.Address, method uint64, params []byte) (*messagepool.MessagePrototype, error) //perm:sign - MsigCancel(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*messagepool.MessagePrototype, error) //perm:sign - MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*messagepool.MessagePrototype, error) //perm:sign - MsigGetVested(ctx context.Context, addr address.Address, start chain.TipSetKey, end chain.TipSetKey) (chain.BigInt, error) //perm:read + MsigCancelTxnHash(context.Context, address.Address, uint64, address.Address, types.BigInt, address.Address, uint64, []byte) (*types.MessagePrototype, error) //perm:sign + MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*types.MessagePrototype, error) //perm:sign + MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*types.MessagePrototype, error) //perm:sign + MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*types.MessagePrototype, error) //perm:sign + MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*types.MessagePrototype, error) //perm:sign + MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*types.MessagePrototype, error) //perm:sign + MsigCancel(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*types.MessagePrototype, error) //perm:sign + MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*types.MessagePrototype, error) //perm:sign + MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) //perm:read } diff --git a/venus-shared/api/chain/v1/network.go b/venus-shared/api/chain/v1/network.go index 27529b2470..9cc506cc19 100644 --- a/venus-shared/api/chain/v1/network.go +++ b/venus-shared/api/chain/v1/network.go @@ -3,24 +3,23 @@ package v1 import ( "context" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" - - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/libp2p/net" ) type INetwork interface { - NetworkGetBandwidthStats(ctx context.Context) metrics.Stats //perm:admin - NetworkGetPeerAddresses(ctx context.Context) []ma.Multiaddr //perm:admin - NetworkGetPeerID(ctx context.Context) peer.ID //perm:admin - NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo //perm:read - NetworkGetClosestPeers(ctx context.Context, key string) ([]peer.ID, error) //perm:read - NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) //perm:read - NetworkConnect(ctx context.Context, addrs []string) (<-chan net.ConnectionResult, error) //perm:read - NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*net.SwarmConnInfos, error) //perm:read - Version(context.Context) (chain2.Version, error) //perm:read - NetAddrsListen(context.Context) (peer.AddrInfo, error) //perm:read + NetworkGetBandwidthStats(ctx context.Context) metrics.Stats //perm:admin + NetworkGetPeerAddresses(ctx context.Context) []ma.Multiaddr //perm:admin + NetworkGetPeerID(ctx context.Context) peer.ID //perm:admin + NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo //perm:read + NetworkGetClosestPeers(ctx context.Context, key string) ([]peer.ID, error) //perm:read + NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) //perm:read + NetworkConnect(ctx context.Context, addrs []string) (<-chan types.ConnectionResult, error) //perm:read + NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*types.SwarmConnInfos, error) //perm:read + Version(context.Context) (types.Version, error) //perm:read + NetAddrsListen(context.Context) (peer.AddrInfo, error) //perm:read } diff --git a/venus-shared/api/chain/v1/paych.go b/venus-shared/api/chain/v1/paych.go index f726bcc1b5..05baaccdc5 100644 --- a/venus-shared/api/chain/v1/paych.go +++ b/venus-shared/api/chain/v1/paych.go @@ -3,12 +3,11 @@ package v1 import ( "context" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" - - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/paych" ) type IPaychan interface { @@ -16,14 +15,14 @@ type IPaychan interface { // @from: the payment channel sender // @to: the payment channel recipient // @amt: the deposits funds in the payment channel - PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*paych.ChannelInfo, error) //perm:sign + PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*types.ChannelInfo, error) //perm:sign // PaychAvailableFunds get the status of an outbound payment channel // @pch: payment channel address - PaychAvailableFunds(ctx context.Context, ch address.Address) (*chain2.ChannelAvailableFunds, error) //perm:sign + PaychAvailableFunds(ctx context.Context, ch address.Address) (*types.ChannelAvailableFunds, error) //perm:sign // PaychAvailableFundsByFromTo get the status of an outbound payment channel // @from: the payment channel sender // @to: he payment channel recipient - PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*chain2.ChannelAvailableFunds, error) //perm:sign + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*types.ChannelAvailableFunds, error) //perm:sign // PaychGetWaitReady waits until the create channel / add funds message with the sentinel // @sentinel: given message CID arrives. // @ch: the returned channel address can safely be used against the Manager methods. @@ -35,12 +34,12 @@ type IPaychan interface { // @from: the payment channel sender // @to: the payment channel recipient // @vouchers: the outstanding (non-redeemed) vouchers - PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []paych.VoucherSpec) (*paych.PaymentInfo, error) //perm:sign + PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []types.VoucherSpec) (*types.PaymentInfo, error) //perm:sign // PaychList list the addresses of all channels that have been created PaychList(ctx context.Context) ([]address.Address, error) //perm:read // PaychStatus get the payment channel status // @pch: payment channel address - PaychStatus(ctx context.Context, pch address.Address) (*paych.Status, error) //perm:read + PaychStatus(ctx context.Context, pch address.Address) (*types.Status, error) //perm:read // PaychSettle update payment channel status to settle // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain // @pch: payment channel address @@ -56,15 +55,15 @@ type IPaychan interface { // the channel To address is owned by the wallet). // @pch: payment channel address // @sv: voucher - PaychVoucherCheckValid(ctx context.Context, ch address.Address, sv *paych.SignedVoucher) error //perm:read + PaychVoucherCheckValid(ctx context.Context, ch address.Address, sv *types.SignedVoucher) error //perm:read // PaychVoucherCheckSpendable checks if the given voucher is currently spendable // @pch: payment channel address // @sv: voucher - PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (bool, error) //perm:read + PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *types.SignedVoucher, secret []byte, proof []byte) (bool, error) //perm:read // PaychVoucherAdd adds a voucher for an inbound channel. // If the channel is not in the store, fetches the channel from state (and checks that // the channel To address is owned by the wallet). - PaychVoucherAdd(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) //perm:write + PaychVoucherAdd(ctx context.Context, ch address.Address, sv *types.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) //perm:write // PaychVoucherCreate creates a new signed voucher on the given payment channel // with the given lane and amount. The value passed in is exactly the value // that will be used to create the voucher, so if previous vouchers exist, the @@ -72,12 +71,12 @@ type IPaychan interface { // the two. // If there are insufficient funds in the channel to create the voucher, // returns a nil voucher and the shortfall. - PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*paych.VoucherCreateResult, error) //perm:sign + PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*types.VoucherCreateResult, error) //perm:sign // PaychVoucherList list vouchers in payment channel // @pch: payment channel address - PaychVoucherList(ctx context.Context, pch address.Address) ([]*paych.SignedVoucher, error) //perm:write + PaychVoucherList(ctx context.Context, pch address.Address) ([]*types.SignedVoucher, error) //perm:write // PaychVoucherSubmit Submit voucher to chain to update payment channel state // @pch: payment channel address // @sv: voucher in payment channel - PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) //perm:sign + PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *types.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) //perm:sign } diff --git a/venus-shared/api/chain/v1/proxy_gen.go b/venus-shared/api/chain/v1/proxy_gen.go index 7fc673df04..598daaebca 100644 --- a/venus-shared/api/chain/v1/proxy_gen.go +++ b/venus-shared/api/chain/v1/proxy_gen.go @@ -13,12 +13,7 @@ import ( "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/libp2p/net" - "github.com/filecoin-project/venus/venus-shared/messagepool" - "github.com/filecoin-project/venus/venus-shared/paych" - "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/peer" @@ -42,37 +37,37 @@ type FullNodeStruct struct { type IAccountStruct struct { Internal struct { - StateAccountKey func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) `perm:"read"` + StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` } } -func (s *IAccountStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) { +func (s *IAccountStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { return s.Internal.StateAccountKey(p0, p1, p2) } type IActorStruct struct { Internal struct { - ListActor func(p0 context.Context) (map[address.Address]*chain.Actor, error) `perm:"read"` + ListActor func(p0 context.Context) (map[address.Address]*types.Actor, error) `perm:"read"` - StateGetActor func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*chain.Actor, error) `perm:"read"` + StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `perm:"read"` } } -func (s *IActorStruct) ListActor(p0 context.Context) (map[address.Address]*chain.Actor, error) { +func (s *IActorStruct) ListActor(p0 context.Context) (map[address.Address]*types.Actor, error) { return s.Internal.ListActor(p0) } -func (s *IActorStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*chain.Actor, error) { +func (s *IActorStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { return s.Internal.StateGetActor(p0, p1, p2) } type IBeaconStruct struct { Internal struct { - BeaconGetEntry func(p0 context.Context, p1 abi.ChainEpoch) (*chain.BeaconEntry, error) `perm:"read"` + BeaconGetEntry func(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) `perm:"read"` } } -func (s *IBeaconStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (*chain.BeaconEntry, error) { +func (s *IBeaconStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) { return s.Internal.BeaconGetEntry(p0, p1) } @@ -84,7 +79,7 @@ type IBlockStoreStruct struct { ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` - ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (chain2.ObjStat, error) `perm:"read"` + ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) `perm:"read"` } } @@ -100,7 +95,7 @@ func (s *IBlockStoreStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte return s.Internal.ChainReadObj(p0, p1) } -func (s *IBlockStoreStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (chain2.ObjStat, error) { +func (s *IBlockStoreStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) { return s.Internal.ChainStatObj(p0, p1, p2) } @@ -116,73 +111,73 @@ type IChainInfoStruct struct { Internal struct { BlockTime func(p0 context.Context) time.Duration `perm:"read"` - ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 chain.TipSetKey) (<-chan []byte, error) `perm:"read"` + ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) `perm:"read"` - ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*chain.BlockHeader, error) `perm:"read"` + ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) `perm:"read"` - ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*chain2.BlockMessages, error) `perm:"read"` + ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*types.BlockMessages, error) `perm:"read"` - ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*chain.Message, error) `perm:"read"` + ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"` - ChainGetMessagesInTipset func(p0 context.Context, p1 chain.TipSetKey) ([]chain2.Message, error) `perm:"read"` + ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]types.MessageCID, error) `perm:"read"` - ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]chain2.Message, error) `perm:"read"` + ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]types.MessageCID, error) `perm:"read"` - ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*chain.MessageReceipt, error) `perm:"read"` + ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` - ChainGetPath func(p0 context.Context, p1 chain.TipSetKey, p2 chain.TipSetKey) ([]*chain2.HeadChange, error) `perm:"read"` + ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*types.HeadChange, error) `perm:"read"` - ChainGetRandomnessFromBeacon func(p0 context.Context, p1 chain.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` + ChainGetRandomnessFromBeacon func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` - ChainGetRandomnessFromTickets func(p0 context.Context, p1 chain.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` + ChainGetRandomnessFromTickets func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` - ChainGetReceipts func(p0 context.Context, p1 cid.Cid) ([]chain.MessageReceipt, error) `perm:"read"` + ChainGetReceipts func(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) `perm:"read"` - ChainGetTipSet func(p0 context.Context, p1 chain.TipSetKey) (*chain.TipSet, error) `perm:"read"` + ChainGetTipSet func(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - ChainGetTipSetAfterHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 chain.TipSetKey) (*chain.TipSet, error) `perm:"read"` + ChainGetTipSetAfterHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 chain.TipSetKey) (*chain.TipSet, error) `perm:"read"` + ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - ChainHead func(p0 context.Context) (*chain.TipSet, error) `perm:"read"` + ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"` - ChainList func(p0 context.Context, p1 chain.TipSetKey, p2 int) ([]chain.TipSetKey, error) `perm:"read"` + ChainList func(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) `perm:"read"` - ChainNotify func(p0 context.Context) (<-chan []*chain2.HeadChange, error) `perm:"read"` + ChainNotify func(p0 context.Context) (<-chan []*types.HeadChange, error) `perm:"read"` - ChainSetHead func(p0 context.Context, p1 chain.TipSetKey) error `perm:"admin"` + ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` - GetActor func(p0 context.Context, p1 address.Address) (*chain.Actor, error) `perm:"read"` + GetActor func(p0 context.Context, p1 address.Address) (*types.Actor, error) `perm:"read"` - GetEntry func(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*chain.BeaconEntry, error) `perm:"read"` + GetEntry func(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) `perm:"read"` - GetFullBlock func(p0 context.Context, p1 cid.Cid) (*chain.FullBlock, error) `perm:"read"` + GetFullBlock func(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) `perm:"read"` - GetParentStateRootActor func(p0 context.Context, p1 *chain.TipSet, p2 address.Address) (*chain.Actor, error) `perm:"read"` + GetParentStateRootActor func(p0 context.Context, p1 *types.TipSet, p2 address.Address) (*types.Actor, error) `perm:"read"` - MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*chain2.ChainMessage, error) `perm:"read"` + MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*types.ChainMessage, error) `perm:"read"` - ProtocolParameters func(p0 context.Context) (*chain2.ProtocolParams, error) `perm:"read"` + ProtocolParameters func(p0 context.Context) (*types.ProtocolParams, error) `perm:"read"` - ResolveToKeyAddr func(p0 context.Context, p1 address.Address, p2 *chain.TipSet) (address.Address, error) `perm:"read"` + ResolveToKeyAddr func(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) `perm:"read"` - StateGetRandomnessFromBeacon func(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 chain.TipSetKey) (abi.Randomness, error) `perm:"read"` + StateGetRandomnessFromBeacon func(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) `perm:"read"` - StateGetRandomnessFromTickets func(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 chain.TipSetKey) (abi.Randomness, error) `perm:"read"` + StateGetRandomnessFromTickets func(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) `perm:"read"` - StateNetworkName func(p0 context.Context) (chain2.NetworkName, error) `perm:"read"` + StateNetworkName func(p0 context.Context) (types.NetworkName, error) `perm:"read"` - StateNetworkVersion func(p0 context.Context, p1 chain.TipSetKey) (network.Version, error) `perm:"read"` + StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (network.Version, error) `perm:"read"` - StateSearchMsg func(p0 context.Context, p1 chain.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*chain2.MsgLookup, error) `perm:"read"` + StateSearchMsg func(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) `perm:"read"` - StateVerifiedRegistryRootKey func(p0 context.Context, p1 chain.TipSetKey) (address.Address, error) `perm:"read"` + StateVerifiedRegistryRootKey func(p0 context.Context, p1 types.TipSetKey) (address.Address, error) `perm:"read"` - StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*abi.StoragePower, error) `perm:"read"` + StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` - StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*chain2.MsgLookup, error) `perm:"read"` + StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) `perm:"read"` - VerifyEntry func(p0 *chain.BeaconEntry, p1 *chain.BeaconEntry, p2 abi.ChainEpoch) bool `perm:"read"` + VerifyEntry func(p0 *types.BeaconEntry, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool `perm:"read"` } } @@ -190,139 +185,139 @@ func (s *IChainInfoStruct) BlockTime(p0 context.Context) time.Duration { return s.Internal.BlockTime(p0) } -func (s *IChainInfoStruct) ChainExport(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 chain.TipSetKey) (<-chan []byte, error) { +func (s *IChainInfoStruct) ChainExport(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) { return s.Internal.ChainExport(p0, p1, p2, p3) } -func (s *IChainInfoStruct) ChainGetBlock(p0 context.Context, p1 cid.Cid) (*chain.BlockHeader, error) { +func (s *IChainInfoStruct) ChainGetBlock(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) { return s.Internal.ChainGetBlock(p0, p1) } -func (s *IChainInfoStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*chain2.BlockMessages, error) { +func (s *IChainInfoStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*types.BlockMessages, error) { return s.Internal.ChainGetBlockMessages(p0, p1) } -func (s *IChainInfoStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*chain.Message, error) { +func (s *IChainInfoStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*types.Message, error) { return s.Internal.ChainGetMessage(p0, p1) } -func (s *IChainInfoStruct) ChainGetMessagesInTipset(p0 context.Context, p1 chain.TipSetKey) ([]chain2.Message, error) { +func (s *IChainInfoStruct) ChainGetMessagesInTipset(p0 context.Context, p1 types.TipSetKey) ([]types.MessageCID, error) { return s.Internal.ChainGetMessagesInTipset(p0, p1) } -func (s *IChainInfoStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]chain2.Message, error) { +func (s *IChainInfoStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]types.MessageCID, error) { return s.Internal.ChainGetParentMessages(p0, p1) } -func (s *IChainInfoStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid) ([]*chain.MessageReceipt, error) { +func (s *IChainInfoStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) { return s.Internal.ChainGetParentReceipts(p0, p1) } -func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 chain.TipSetKey, p2 chain.TipSetKey) ([]*chain2.HeadChange, error) { +func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*types.HeadChange, error) { return s.Internal.ChainGetPath(p0, p1, p2) } -func (s *IChainInfoStruct) ChainGetRandomnessFromBeacon(p0 context.Context, p1 chain.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { +func (s *IChainInfoStruct) ChainGetRandomnessFromBeacon(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { return s.Internal.ChainGetRandomnessFromBeacon(p0, p1, p2, p3, p4) } -func (s *IChainInfoStruct) ChainGetRandomnessFromTickets(p0 context.Context, p1 chain.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { +func (s *IChainInfoStruct) ChainGetRandomnessFromTickets(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { return s.Internal.ChainGetRandomnessFromTickets(p0, p1, p2, p3, p4) } -func (s *IChainInfoStruct) ChainGetReceipts(p0 context.Context, p1 cid.Cid) ([]chain.MessageReceipt, error) { +func (s *IChainInfoStruct) ChainGetReceipts(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) { return s.Internal.ChainGetReceipts(p0, p1) } -func (s *IChainInfoStruct) ChainGetTipSet(p0 context.Context, p1 chain.TipSetKey) (*chain.TipSet, error) { +func (s *IChainInfoStruct) ChainGetTipSet(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) { return s.Internal.ChainGetTipSet(p0, p1) } -func (s *IChainInfoStruct) ChainGetTipSetAfterHeight(p0 context.Context, p1 abi.ChainEpoch, p2 chain.TipSetKey) (*chain.TipSet, error) { +func (s *IChainInfoStruct) ChainGetTipSetAfterHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { return s.Internal.ChainGetTipSetAfterHeight(p0, p1, p2) } -func (s *IChainInfoStruct) ChainGetTipSetByHeight(p0 context.Context, p1 abi.ChainEpoch, p2 chain.TipSetKey) (*chain.TipSet, error) { +func (s *IChainInfoStruct) ChainGetTipSetByHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { return s.Internal.ChainGetTipSetByHeight(p0, p1, p2) } -func (s *IChainInfoStruct) ChainHead(p0 context.Context) (*chain.TipSet, error) { +func (s *IChainInfoStruct) ChainHead(p0 context.Context) (*types.TipSet, error) { return s.Internal.ChainHead(p0) } -func (s *IChainInfoStruct) ChainList(p0 context.Context, p1 chain.TipSetKey, p2 int) ([]chain.TipSetKey, error) { +func (s *IChainInfoStruct) ChainList(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) { return s.Internal.ChainList(p0, p1, p2) } -func (s *IChainInfoStruct) ChainNotify(p0 context.Context) (<-chan []*chain2.HeadChange, error) { +func (s *IChainInfoStruct) ChainNotify(p0 context.Context) (<-chan []*types.HeadChange, error) { return s.Internal.ChainNotify(p0) } -func (s *IChainInfoStruct) ChainSetHead(p0 context.Context, p1 chain.TipSetKey) error { +func (s *IChainInfoStruct) ChainSetHead(p0 context.Context, p1 types.TipSetKey) error { return s.Internal.ChainSetHead(p0, p1) } -func (s *IChainInfoStruct) GetActor(p0 context.Context, p1 address.Address) (*chain.Actor, error) { +func (s *IChainInfoStruct) GetActor(p0 context.Context, p1 address.Address) (*types.Actor, error) { return s.Internal.GetActor(p0, p1) } -func (s *IChainInfoStruct) GetEntry(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*chain.BeaconEntry, error) { +func (s *IChainInfoStruct) GetEntry(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) { return s.Internal.GetEntry(p0, p1, p2) } -func (s *IChainInfoStruct) GetFullBlock(p0 context.Context, p1 cid.Cid) (*chain.FullBlock, error) { +func (s *IChainInfoStruct) GetFullBlock(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) { return s.Internal.GetFullBlock(p0, p1) } -func (s *IChainInfoStruct) GetParentStateRootActor(p0 context.Context, p1 *chain.TipSet, p2 address.Address) (*chain.Actor, error) { +func (s *IChainInfoStruct) GetParentStateRootActor(p0 context.Context, p1 *types.TipSet, p2 address.Address) (*types.Actor, error) { return s.Internal.GetParentStateRootActor(p0, p1, p2) } -func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*chain2.ChainMessage, error) { +func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*types.ChainMessage, error) { return s.Internal.MessageWait(p0, p1, p2, p3) } -func (s *IChainInfoStruct) ProtocolParameters(p0 context.Context) (*chain2.ProtocolParams, error) { +func (s *IChainInfoStruct) ProtocolParameters(p0 context.Context) (*types.ProtocolParams, error) { return s.Internal.ProtocolParameters(p0) } -func (s *IChainInfoStruct) ResolveToKeyAddr(p0 context.Context, p1 address.Address, p2 *chain.TipSet) (address.Address, error) { +func (s *IChainInfoStruct) ResolveToKeyAddr(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) { return s.Internal.ResolveToKeyAddr(p0, p1, p2) } -func (s *IChainInfoStruct) StateGetRandomnessFromBeacon(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 chain.TipSetKey) (abi.Randomness, error) { +func (s *IChainInfoStruct) StateGetRandomnessFromBeacon(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) { return s.Internal.StateGetRandomnessFromBeacon(p0, p1, p2, p3, p4) } -func (s *IChainInfoStruct) StateGetRandomnessFromTickets(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 chain.TipSetKey) (abi.Randomness, error) { +func (s *IChainInfoStruct) StateGetRandomnessFromTickets(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) { return s.Internal.StateGetRandomnessFromTickets(p0, p1, p2, p3, p4) } -func (s *IChainInfoStruct) StateNetworkName(p0 context.Context) (chain2.NetworkName, error) { +func (s *IChainInfoStruct) StateNetworkName(p0 context.Context) (types.NetworkName, error) { return s.Internal.StateNetworkName(p0) } -func (s *IChainInfoStruct) StateNetworkVersion(p0 context.Context, p1 chain.TipSetKey) (network.Version, error) { +func (s *IChainInfoStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (network.Version, error) { return s.Internal.StateNetworkVersion(p0, p1) } -func (s *IChainInfoStruct) StateSearchMsg(p0 context.Context, p1 chain.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*chain2.MsgLookup, error) { +func (s *IChainInfoStruct) StateSearchMsg(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) { return s.Internal.StateSearchMsg(p0, p1, p2, p3, p4) } -func (s *IChainInfoStruct) StateVerifiedRegistryRootKey(p0 context.Context, p1 chain.TipSetKey) (address.Address, error) { +func (s *IChainInfoStruct) StateVerifiedRegistryRootKey(p0 context.Context, p1 types.TipSetKey) (address.Address, error) { return s.Internal.StateVerifiedRegistryRootKey(p0, p1) } -func (s *IChainInfoStruct) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*abi.StoragePower, error) { +func (s *IChainInfoStruct) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { return s.Internal.StateVerifierStatus(p0, p1, p2) } -func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*chain2.MsgLookup, error) { +func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) { return s.Internal.StateWaitMsg(p0, p1, p2, p3, p4) } -func (s *IChainInfoStruct) VerifyEntry(p0 *chain.BeaconEntry, p1 *chain.BeaconEntry, p2 abi.ChainEpoch) bool { +func (s *IChainInfoStruct) VerifyEntry(p0 *types.BeaconEntry, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool { return s.Internal.VerifyEntry(p0, p1, p2) } @@ -344,109 +339,109 @@ func (s *IJwtAuthAPIStruct) Verify(p0 context.Context, p1 string, p2 string) ([] type IMarketStruct struct { Internal struct { - StateMarketParticipants func(p0 context.Context, p1 chain.TipSetKey) (map[string]chain2.MarketBalance, error) `perm:"read"` + StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) `perm:"read"` } } -func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 chain.TipSetKey) (map[string]chain2.MarketBalance, error) { +func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) { return s.Internal.StateMarketParticipants(p0, p1) } type IMessagePoolStruct struct { Internal struct { - GasBatchEstimateMessageGas func(p0 context.Context, p1 []*chain2.EstimateMessage, p2 uint64, p3 chain.TipSetKey) ([]*chain2.EstimateResult, error) `perm:"read"` + GasBatchEstimateMessageGas func(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) `perm:"read"` - GasEstimateFeeCap func(p0 context.Context, p1 *chain.Message, p2 int64, p3 chain.TipSetKey) (big.Int, error) `perm:"read"` + GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - GasEstimateGasLimit func(p0 context.Context, p1 *chain.Message, p2 chain.TipSetKey) (int64, error) `perm:"read"` + GasEstimateGasLimit func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) `perm:"read"` - GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 chain.TipSetKey) (big.Int, error) `perm:"read"` + GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) `perm:"read"` - GasEstimateMessageGas func(p0 context.Context, p1 *chain.Message, p2 *chain2.MessageSendSpec, p3 chain.TipSetKey) (*chain.Message, error) `perm:"read"` + GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"` - MpoolBatchPush func(p0 context.Context, p1 []*chain.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolBatchPushMessage func(p0 context.Context, p1 []*chain.Message, p2 *chain2.MessageSendSpec) ([]*chain.SignedMessage, error) `perm:"sign"` + MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` - MpoolBatchPushUntrusted func(p0 context.Context, p1 []*chain.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolCheckMessages func(p0 context.Context, p1 []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) `perm:"read"` + MpoolCheckMessages func(p0 context.Context, p1 []*types.MessagePrototype) ([][]types.MessageCheckStatus, error) `perm:"read"` - MpoolCheckPendingMessages func(p0 context.Context, p1 address.Address) ([][]messagepool.MessageCheckStatus, error) `perm:"read"` + MpoolCheckPendingMessages func(p0 context.Context, p1 address.Address) ([][]types.MessageCheckStatus, error) `perm:"read"` - MpoolCheckReplaceMessages func(p0 context.Context, p1 []*chain.Message) ([][]messagepool.MessageCheckStatus, error) `perm:"read"` + MpoolCheckReplaceMessages func(p0 context.Context, p1 []*types.Message) ([][]types.MessageCheckStatus, error) `perm:"read"` MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` - MpoolGetConfig func(p0 context.Context) (*messagepool.MpoolConfig, error) `perm:"read"` + MpoolGetConfig func(p0 context.Context) (*types.MpoolConfig, error) `perm:"read"` MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` - MpoolPending func(p0 context.Context, p1 chain.TipSetKey) ([]*chain.SignedMessage, error) `perm:"read"` + MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"write"` - MpoolPublishMessage func(p0 context.Context, p1 *chain.SignedMessage) error `perm:"write"` + MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"write"` - MpoolPush func(p0 context.Context, p1 *chain.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolPushMessage func(p0 context.Context, p1 *chain.Message, p2 *chain2.MessageSendSpec) (*chain.SignedMessage, error) `perm:"sign"` + MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` - MpoolPushUntrusted func(p0 context.Context, p1 *chain.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolSelect func(p0 context.Context, p1 chain.TipSetKey, p2 float64) ([]*chain.SignedMessage, error) `perm:"read"` + MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` - MpoolSelects func(p0 context.Context, p1 chain.TipSetKey, p2 []float64) ([][]*chain.SignedMessage, error) `perm:"read"` + MpoolSelects func(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) `perm:"read"` - MpoolSetConfig func(p0 context.Context, p1 *messagepool.MpoolConfig) error `perm:"admin"` + MpoolSetConfig func(p0 context.Context, p1 *types.MpoolConfig) error `perm:"admin"` - MpoolSub func(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) `perm:"read"` + MpoolSub func(p0 context.Context) (<-chan types.MpoolUpdate, error) `perm:"read"` } } -func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*chain2.EstimateMessage, p2 uint64, p3 chain.TipSetKey) ([]*chain2.EstimateResult, error) { +func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) { return s.Internal.GasBatchEstimateMessageGas(p0, p1, p2, p3) } -func (s *IMessagePoolStruct) GasEstimateFeeCap(p0 context.Context, p1 *chain.Message, p2 int64, p3 chain.TipSetKey) (big.Int, error) { +func (s *IMessagePoolStruct) GasEstimateFeeCap(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) { return s.Internal.GasEstimateFeeCap(p0, p1, p2, p3) } -func (s *IMessagePoolStruct) GasEstimateGasLimit(p0 context.Context, p1 *chain.Message, p2 chain.TipSetKey) (int64, error) { +func (s *IMessagePoolStruct) GasEstimateGasLimit(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) { return s.Internal.GasEstimateGasLimit(p0, p1, p2) } -func (s *IMessagePoolStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 chain.TipSetKey) (big.Int, error) { +func (s *IMessagePoolStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) { return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) } -func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *chain.Message, p2 *chain2.MessageSendSpec, p3 chain.TipSetKey) (*chain.Message, error) { +func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) } -func (s *IMessagePoolStruct) MpoolBatchPush(p0 context.Context, p1 []*chain.SignedMessage) ([]cid.Cid, error) { +func (s *IMessagePoolStruct) MpoolBatchPush(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { return s.Internal.MpoolBatchPush(p0, p1) } -func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*chain.Message, p2 *chain2.MessageSendSpec) ([]*chain.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) { return s.Internal.MpoolBatchPushMessage(p0, p1, p2) } -func (s *IMessagePoolStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*chain.SignedMessage) ([]cid.Cid, error) { +func (s *IMessagePoolStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { return s.Internal.MpoolBatchPushUntrusted(p0, p1) } -func (s *IMessagePoolStruct) MpoolCheckMessages(p0 context.Context, p1 []*messagepool.MessagePrototype) ([][]messagepool.MessageCheckStatus, error) { +func (s *IMessagePoolStruct) MpoolCheckMessages(p0 context.Context, p1 []*types.MessagePrototype) ([][]types.MessageCheckStatus, error) { return s.Internal.MpoolCheckMessages(p0, p1) } -func (s *IMessagePoolStruct) MpoolCheckPendingMessages(p0 context.Context, p1 address.Address) ([][]messagepool.MessageCheckStatus, error) { +func (s *IMessagePoolStruct) MpoolCheckPendingMessages(p0 context.Context, p1 address.Address) ([][]types.MessageCheckStatus, error) { return s.Internal.MpoolCheckPendingMessages(p0, p1) } -func (s *IMessagePoolStruct) MpoolCheckReplaceMessages(p0 context.Context, p1 []*chain.Message) ([][]messagepool.MessageCheckStatus, error) { +func (s *IMessagePoolStruct) MpoolCheckReplaceMessages(p0 context.Context, p1 []*types.Message) ([][]types.MessageCheckStatus, error) { return s.Internal.MpoolCheckReplaceMessages(p0, p1) } @@ -458,7 +453,7 @@ func (s *IMessagePoolStruct) MpoolDeleteByAdress(p0 context.Context, p1 address. return s.Internal.MpoolDeleteByAdress(p0, p1) } -func (s *IMessagePoolStruct) MpoolGetConfig(p0 context.Context) (*messagepool.MpoolConfig, error) { +func (s *IMessagePoolStruct) MpoolGetConfig(p0 context.Context) (*types.MpoolConfig, error) { return s.Internal.MpoolGetConfig(p0) } @@ -466,7 +461,7 @@ func (s *IMessagePoolStruct) MpoolGetNonce(p0 context.Context, p1 address.Addres return s.Internal.MpoolGetNonce(p0, p1) } -func (s *IMessagePoolStruct) MpoolPending(p0 context.Context, p1 chain.TipSetKey) ([]*chain.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolPending(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) { return s.Internal.MpoolPending(p0, p1) } @@ -474,323 +469,323 @@ func (s *IMessagePoolStruct) MpoolPublishByAddr(p0 context.Context, p1 address.A return s.Internal.MpoolPublishByAddr(p0, p1) } -func (s *IMessagePoolStruct) MpoolPublishMessage(p0 context.Context, p1 *chain.SignedMessage) error { +func (s *IMessagePoolStruct) MpoolPublishMessage(p0 context.Context, p1 *types.SignedMessage) error { return s.Internal.MpoolPublishMessage(p0, p1) } -func (s *IMessagePoolStruct) MpoolPush(p0 context.Context, p1 *chain.SignedMessage) (cid.Cid, error) { +func (s *IMessagePoolStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { return s.Internal.MpoolPush(p0, p1) } -func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *chain.Message, p2 *chain2.MessageSendSpec) (*chain.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) { return s.Internal.MpoolPushMessage(p0, p1, p2) } -func (s *IMessagePoolStruct) MpoolPushUntrusted(p0 context.Context, p1 *chain.SignedMessage) (cid.Cid, error) { +func (s *IMessagePoolStruct) MpoolPushUntrusted(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { return s.Internal.MpoolPushUntrusted(p0, p1) } -func (s *IMessagePoolStruct) MpoolSelect(p0 context.Context, p1 chain.TipSetKey, p2 float64) ([]*chain.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolSelect(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) { return s.Internal.MpoolSelect(p0, p1, p2) } -func (s *IMessagePoolStruct) MpoolSelects(p0 context.Context, p1 chain.TipSetKey, p2 []float64) ([][]*chain.SignedMessage, error) { +func (s *IMessagePoolStruct) MpoolSelects(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) { return s.Internal.MpoolSelects(p0, p1, p2) } -func (s *IMessagePoolStruct) MpoolSetConfig(p0 context.Context, p1 *messagepool.MpoolConfig) error { +func (s *IMessagePoolStruct) MpoolSetConfig(p0 context.Context, p1 *types.MpoolConfig) error { return s.Internal.MpoolSetConfig(p0, p1) } -func (s *IMessagePoolStruct) MpoolSub(p0 context.Context) (<-chan messagepool.MpoolUpdate, error) { +func (s *IMessagePoolStruct) MpoolSub(p0 context.Context) (<-chan types.MpoolUpdate, error) { return s.Internal.MpoolSub(p0) } type IMinerStateStruct struct { Internal struct { - StateCirculatingSupply func(p0 context.Context, p1 chain.TipSetKey) (abi.TokenAmount, error) `perm:"read"` + StateCirculatingSupply func(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` - StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 chain.TipSetKey) (chain2.DealCollateralBounds, error) `perm:"read"` + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) `perm:"read"` - StateListActors func(p0 context.Context, p1 chain.TipSetKey) ([]address.Address, error) `perm:"read"` + StateListActors func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` - StateListMiners func(p0 context.Context, p1 chain.TipSetKey) ([]address.Address, error) `perm:"read"` + StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` - StateLookupID func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) `perm:"read"` + StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - StateMarketBalance func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (chain2.MarketBalance, error) `perm:"read"` + StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) `perm:"read"` - StateMarketDeals func(p0 context.Context, p1 chain.TipSetKey) (map[string]chain2.MarketDeal, error) `perm:"read"` + StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) `perm:"read"` - StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 chain.TipSetKey) (*chain2.MarketDeal, error) `perm:"read"` + StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) `perm:"read"` - StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` - StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) ([]chain2.Deadline, error) `perm:"read"` + StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) `perm:"read"` - StateMinerFaults func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (bitfield.BitField, error) `perm:"read"` + StateMinerFaults func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - StateMinerInfo func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (miner.MinerInfo, error) `perm:"read"` + StateMinerInfo func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) `perm:"read"` - StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 chain.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 chain.TipSetKey) ([]chain2.Partition, error) `perm:"read"` + StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) `perm:"read"` - StateMinerPower func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*chain2.MinerPower, error) `perm:"read"` + StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) `perm:"read"` - StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 chain.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*dline.Info, error) `perm:"read"` + StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `perm:"read"` - StateMinerRecoveries func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (bitfield.BitField, error) `perm:"read"` + StateMinerRecoveries func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (bool, error) `perm:"read"` + StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) `perm:"read"` - StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (chain2.MinerSectors, error) `perm:"read"` + StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) `perm:"read"` - StateMinerSectorSize func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (abi.SectorSize, error) `perm:"read"` + StateMinerSectorSize func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (abi.SectorSize, error) `perm:"read"` - StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` - StateMinerWorkerAddress func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) `perm:"read"` + StateMinerWorkerAddress func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - StateSectorExpiration func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorExpiration, error) `perm:"read"` + StateSectorExpiration func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) `perm:"read"` - StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` + StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` - StateSectorPartition func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` + StateSectorPartition func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` - StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` + StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` - StateVMCirculatingSupplyInternal func(p0 context.Context, p1 chain.TipSetKey) (chain.CirculatingSupply, error) `perm:"read"` + StateVMCirculatingSupplyInternal func(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) `perm:"read"` - StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*abi.StoragePower, error) `perm:"read"` + StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` } } -func (s *IMinerStateStruct) StateCirculatingSupply(p0 context.Context, p1 chain.TipSetKey) (abi.TokenAmount, error) { +func (s *IMinerStateStruct) StateCirculatingSupply(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) { return s.Internal.StateCirculatingSupply(p0, p1) } -func (s *IMinerStateStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 chain.TipSetKey) (chain2.DealCollateralBounds, error) { +func (s *IMinerStateStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) { return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateListActors(p0 context.Context, p1 chain.TipSetKey) ([]address.Address, error) { +func (s *IMinerStateStruct) StateListActors(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { return s.Internal.StateListActors(p0, p1) } -func (s *IMinerStateStruct) StateListMiners(p0 context.Context, p1 chain.TipSetKey) ([]address.Address, error) { +func (s *IMinerStateStruct) StateListMiners(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { return s.Internal.StateListMiners(p0, p1) } -func (s *IMinerStateStruct) StateLookupID(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) { +func (s *IMinerStateStruct) StateLookupID(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { return s.Internal.StateLookupID(p0, p1, p2) } -func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (chain2.MarketBalance, error) { +func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) { return s.Internal.StateMarketBalance(p0, p1, p2) } -func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 chain.TipSetKey) (map[string]chain2.MarketDeal, error) { +func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) { return s.Internal.StateMarketDeals(p0, p1) } -func (s *IMinerStateStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 chain.TipSetKey) (*chain2.MarketDeal, error) { +func (s *IMinerStateStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) { return s.Internal.StateMarketStorageDeal(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerActiveSectors(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) { +func (s *IMinerStateStruct) StateMinerActiveSectors(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { return s.Internal.StateMinerActiveSectors(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerAvailableBalance(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (big.Int, error) { +func (s *IMinerStateStruct) StateMinerAvailableBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) { return s.Internal.StateMinerAvailableBalance(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) ([]chain2.Deadline, error) { +func (s *IMinerStateStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) { return s.Internal.StateMinerDeadlines(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerFaults(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (bitfield.BitField, error) { +func (s *IMinerStateStruct) StateMinerFaults(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { return s.Internal.StateMinerFaults(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerInfo(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (miner.MinerInfo, error) { +func (s *IMinerStateStruct) StateMinerInfo(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) { return s.Internal.StateMinerInfo(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 chain.TipSetKey) (big.Int, error) { +func (s *IMinerStateStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 chain.TipSetKey) ([]chain2.Partition, error) { +func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) { return s.Internal.StateMinerPartitions(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*chain2.MinerPower, error) { +func (s *IMinerStateStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) { return s.Internal.StateMinerPower(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerPreCommitDepositForPower(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 chain.TipSetKey) (big.Int, error) { +func (s *IMinerStateStruct) StateMinerPreCommitDepositForPower(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { return s.Internal.StateMinerPreCommitDepositForPower(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateMinerProvingDeadline(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*dline.Info, error) { +func (s *IMinerStateStruct) StateMinerProvingDeadline(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) { return s.Internal.StateMinerProvingDeadline(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerRecoveries(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (bitfield.BitField, error) { +func (s *IMinerStateStruct) StateMinerRecoveries(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { return s.Internal.StateMinerRecoveries(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerSectorAllocated(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (bool, error) { +func (s *IMinerStateStruct) StateMinerSectorAllocated(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) { return s.Internal.StateMinerSectorAllocated(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (chain2.MinerSectors, error) { +func (s *IMinerStateStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) { return s.Internal.StateMinerSectorCount(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerSectorSize(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (abi.SectorSize, error) { +func (s *IMinerStateStruct) StateMinerSectorSize(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (abi.SectorSize, error) { return s.Internal.StateMinerSectorSize(p0, p1, p2) } -func (s *IMinerStateStruct) StateMinerSectors(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) { +func (s *IMinerStateStruct) StateMinerSectors(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { return s.Internal.StateMinerSectors(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateMinerWorkerAddress(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (address.Address, error) { +func (s *IMinerStateStruct) StateMinerWorkerAddress(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { return s.Internal.StateMinerWorkerAddress(p0, p1, p2) } -func (s *IMinerStateStruct) StateSectorExpiration(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorExpiration, error) { +func (s *IMinerStateStruct) StateSectorExpiration(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) { return s.Internal.StateSectorExpiration(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateSectorGetInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorOnChainInfo, error) { +func (s *IMinerStateStruct) StateSectorGetInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) { return s.Internal.StateSectorGetInfo(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateSectorPartition(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (*miner.SectorLocation, error) { +func (s *IMinerStateStruct) StateSectorPartition(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) { return s.Internal.StateSectorPartition(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateSectorPreCommitInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { +func (s *IMinerStateStruct) StateSectorPreCommitInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { return s.Internal.StateSectorPreCommitInfo(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 chain.TipSetKey) (chain.CirculatingSupply, error) { +func (s *IMinerStateStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) { return s.Internal.StateVMCirculatingSupplyInternal(p0, p1) } -func (s *IMinerStateStruct) StateVerifiedClientStatus(p0 context.Context, p1 address.Address, p2 chain.TipSetKey) (*abi.StoragePower, error) { +func (s *IMinerStateStruct) StateVerifiedClientStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { return s.Internal.StateVerifiedClientStatus(p0, p1, p2) } type IMiningStruct struct { Internal struct { - MinerCreateBlock func(p0 context.Context, p1 *chain2.BlockTemplate) (*chain.BlockMsg, error) `perm:"write"` + MinerCreateBlock func(p0 context.Context, p1 *types.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` - MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 chain.TipSetKey) (*chain2.MiningBaseInfo, error) `perm:"read"` + MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*types.MiningBaseInfo, error) `perm:"read"` } } -func (s *IMiningStruct) MinerCreateBlock(p0 context.Context, p1 *chain2.BlockTemplate) (*chain.BlockMsg, error) { +func (s *IMiningStruct) MinerCreateBlock(p0 context.Context, p1 *types.BlockTemplate) (*types.BlockMsg, error) { return s.Internal.MinerCreateBlock(p0, p1) } -func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 chain.TipSetKey) (*chain2.MiningBaseInfo, error) { +func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*types.MiningBaseInfo, error) { return s.Internal.MinerGetBaseInfo(p0, p1, p2, p3) } type IMultiSigStruct struct { Internal struct { - MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*types.MessagePrototype, error) `perm:"sign"` - MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*types.MessagePrototype, error) `perm:"sign"` - MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*types.MessagePrototype, error) `perm:"sign"` - MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) `perm:"sign"` - MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 chain.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*types.MessagePrototype, error) `perm:"sign"` - MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) `perm:"sign"` - MsigCancelTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 chain.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigCancelTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*types.MessagePrototype, error) `perm:"sign"` - MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 chain.BigInt, p5 address.Address, p6 chain.BigInt) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*types.MessagePrototype, error) `perm:"sign"` - MsigGetVested func(p0 context.Context, p1 address.Address, p2 chain.TipSetKey, p3 chain.TipSetKey) (chain.BigInt, error) `perm:"read"` + MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` - MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 chain.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*types.MessagePrototype, error) `perm:"sign"` - MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*types.MessagePrototype, error) `perm:"sign"` - MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*types.MessagePrototype, error) `perm:"sign"` - MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*types.MessagePrototype, error) `perm:"sign"` - MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*messagepool.MessagePrototype, error) `perm:"sign"` + MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*types.MessagePrototype, error) `perm:"sign"` } } -func (s *IMultiSigStruct) MsigAddApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigAddApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*types.MessagePrototype, error) { return s.Internal.MsigAddApprove(p0, p1, p2, p3, p4, p5, p6) } -func (s *IMultiSigStruct) MsigAddCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigAddCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*types.MessagePrototype, error) { return s.Internal.MsigAddCancel(p0, p1, p2, p3, p4, p5) } -func (s *IMultiSigStruct) MsigAddPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigAddPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*types.MessagePrototype, error) { return s.Internal.MsigAddPropose(p0, p1, p2, p3, p4) } -func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) { return s.Internal.MsigApprove(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 chain.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*types.MessagePrototype, error) { return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3, p4, p5, p6, p7, p8) } -func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) { return s.Internal.MsigCancel(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigCancelTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 chain.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigCancelTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*types.MessagePrototype, error) { return s.Internal.MsigCancelTxnHash(p0, p1, p2, p3, p4, p5, p6, p7) } -func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 chain.BigInt, p5 address.Address, p6 chain.BigInt) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*types.MessagePrototype, error) { return s.Internal.MsigCreate(p0, p1, p2, p3, p4, p5, p6) } -func (s *IMultiSigStruct) MsigGetVested(p0 context.Context, p1 address.Address, p2 chain.TipSetKey, p3 chain.TipSetKey) (chain.BigInt, error) { +func (s *IMultiSigStruct) MsigGetVested(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) { return s.Internal.MsigGetVested(p0, p1, p2, p3) } -func (s *IMultiSigStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 chain.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*types.MessagePrototype, error) { return s.Internal.MsigPropose(p0, p1, p2, p3, p4, p5, p6) } -func (s *IMultiSigStruct) MsigRemoveSigner(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigRemoveSigner(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*types.MessagePrototype, error) { return s.Internal.MsigRemoveSigner(p0, p1, p2, p3, p4) } -func (s *IMultiSigStruct) MsigSwapApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigSwapApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*types.MessagePrototype, error) { return s.Internal.MsigSwapApprove(p0, p1, p2, p3, p4, p5, p6) } -func (s *IMultiSigStruct) MsigSwapCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigSwapCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*types.MessagePrototype, error) { return s.Internal.MsigSwapCancel(p0, p1, p2, p3, p4, p5) } -func (s *IMultiSigStruct) MsigSwapPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*messagepool.MessagePrototype, error) { +func (s *IMultiSigStruct) MsigSwapPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*types.MessagePrototype, error) { return s.Internal.MsigSwapPropose(p0, p1, p2, p3, p4) } @@ -798,7 +793,7 @@ type INetworkStruct struct { Internal struct { NetAddrsListen func(p0 context.Context) (peer.AddrInfo, error) `perm:"read"` - NetworkConnect func(p0 context.Context, p1 []string) (<-chan net.ConnectionResult, error) `perm:"read"` + NetworkConnect func(p0 context.Context, p1 []string) (<-chan types.ConnectionResult, error) `perm:"read"` NetworkFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` @@ -812,9 +807,9 @@ type INetworkStruct struct { NetworkGetPeerID func(p0 context.Context) peer.ID `perm:"admin"` - NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*net.SwarmConnInfos, error) `perm:"read"` + NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*types.SwarmConnInfos, error) `perm:"read"` - Version func(p0 context.Context) (chain2.Version, error) `perm:"read"` + Version func(p0 context.Context) (types.Version, error) `perm:"read"` } } @@ -822,7 +817,7 @@ func (s *INetworkStruct) NetAddrsListen(p0 context.Context) (peer.AddrInfo, erro return s.Internal.NetAddrsListen(p0) } -func (s *INetworkStruct) NetworkConnect(p0 context.Context, p1 []string) (<-chan net.ConnectionResult, error) { +func (s *INetworkStruct) NetworkConnect(p0 context.Context, p1 []string) (<-chan types.ConnectionResult, error) { return s.Internal.NetworkConnect(p0, p1) } @@ -850,11 +845,11 @@ func (s *INetworkStruct) NetworkGetPeerID(p0 context.Context) peer.ID { return s.Internal.NetworkGetPeerID(p0) } -func (s *INetworkStruct) NetworkPeers(p0 context.Context, p1 bool, p2 bool, p3 bool) (*net.SwarmConnInfos, error) { +func (s *INetworkStruct) NetworkPeers(p0 context.Context, p1 bool, p2 bool, p3 bool) (*types.SwarmConnInfos, error) { return s.Internal.NetworkPeers(p0, p1, p2, p3) } -func (s *INetworkStruct) Version(p0 context.Context) (chain2.Version, error) { +func (s *INetworkStruct) Version(p0 context.Context) (types.Version, error) { return s.Internal.Version(p0) } @@ -862,35 +857,35 @@ type IPaychanStruct struct { Internal struct { PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` - PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*chain2.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` - PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*chain2.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paych.ChannelInfo, error) `perm:"sign"` + PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) `perm:"sign"` PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` - PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []paych.VoucherSpec) (*paych.PaymentInfo, error) `perm:"sign"` + PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) `perm:"sign"` PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychStatus func(p0 context.Context, p1 address.Address) (*paych.Status, error) `perm:"read"` + PaychStatus func(p0 context.Context, p1 address.Address) (*types.Status, error) `perm:"read"` - PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` + PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` - PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` + PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` - PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` + PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher) error `perm:"read"` - PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paych.VoucherCreateResult, error) `perm:"sign"` + PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*types.VoucherCreateResult, error) `perm:"sign"` - PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` + PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*types.SignedVoucher, error) `perm:"write"` - PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` + PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` } } @@ -898,11 +893,11 @@ func (s *IPaychanStruct) PaychAllocateLane(p0 context.Context, p1 address.Addres return s.Internal.PaychAllocateLane(p0, p1) } -func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*chain2.ChannelAvailableFunds, error) { +func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*types.ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFunds(p0, p1) } -func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*chain2.ChannelAvailableFunds, error) { +func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*types.ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFundsByFromTo(p0, p1, p2) } @@ -910,7 +905,7 @@ func (s *IPaychanStruct) PaychCollect(p0 context.Context, p1 address.Address) (c return s.Internal.PaychCollect(p0, p1) } -func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*paych.ChannelInfo, error) { +func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) { return s.Internal.PaychGet(p0, p1, p2, p3) } @@ -922,7 +917,7 @@ func (s *IPaychanStruct) PaychList(p0 context.Context) ([]address.Address, error return s.Internal.PaychList(p0) } -func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []paych.VoucherSpec) (*paych.PaymentInfo, error) { +func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) { return s.Internal.PaychNewPayment(p0, p1, p2, p3) } @@ -930,59 +925,59 @@ func (s *IPaychanStruct) PaychSettle(p0 context.Context, p1 address.Address) (ci return s.Internal.PaychSettle(p0, p1) } -func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*paych.Status, error) { +func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*types.Status, error) { return s.Internal.PaychStatus(p0, p1) } -func (s *IPaychanStruct) PaychVoucherAdd(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) { +func (s *IPaychanStruct) PaychVoucherAdd(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) { return s.Internal.PaychVoucherAdd(p0, p1, p2, p3, p4) } -func (s *IPaychanStruct) PaychVoucherCheckSpendable(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) { +func (s *IPaychanStruct) PaychVoucherCheckSpendable(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 []byte) (bool, error) { return s.Internal.PaychVoucherCheckSpendable(p0, p1, p2, p3, p4) } -func (s *IPaychanStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error { +func (s *IPaychanStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher) error { return s.Internal.PaychVoucherCheckValid(p0, p1, p2) } -func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*paych.VoucherCreateResult, error) { +func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*types.VoucherCreateResult, error) { return s.Internal.PaychVoucherCreate(p0, p1, p2, p3) } -func (s *IPaychanStruct) PaychVoucherList(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) { +func (s *IPaychanStruct) PaychVoucherList(p0 context.Context, p1 address.Address) ([]*types.SignedVoucher, error) { return s.Internal.PaychVoucherList(p0, p1) } -func (s *IPaychanStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) { +func (s *IPaychanStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) { return s.Internal.PaychVoucherSubmit(p0, p1, p2, p3, p4) } type ISyncerStruct struct { Internal struct { - ChainSyncHandleNewTipSet func(p0 context.Context, p1 *chain.ChainInfo) error `perm:"write"` + ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"write"` - ChainTipSetWeight func(p0 context.Context, p1 chain.TipSetKey) (big.Int, error) `perm:"read"` + ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (big.Int, error) `perm:"read"` Concurrent func(p0 context.Context) int64 `perm:"read"` SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` - StateCall func(p0 context.Context, p1 *chain.Message, p2 chain.TipSetKey) (*chain2.InvocResult, error) `perm:"read"` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*types.InvocResult, error) `perm:"read"` - SyncState func(p0 context.Context) (*chain2.SyncState, error) `perm:"read"` + SyncState func(p0 context.Context) (*types.SyncState, error) `perm:"read"` - SyncSubmitBlock func(p0 context.Context, p1 *chain.BlockMsg) error `perm:"write"` + SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` - SyncerTracker func(p0 context.Context) *chain2.TargetTracker `perm:"read"` + SyncerTracker func(p0 context.Context) *types.TargetTracker `perm:"read"` } } -func (s *ISyncerStruct) ChainSyncHandleNewTipSet(p0 context.Context, p1 *chain.ChainInfo) error { +func (s *ISyncerStruct) ChainSyncHandleNewTipSet(p0 context.Context, p1 *types.ChainInfo) error { return s.Internal.ChainSyncHandleNewTipSet(p0, p1) } -func (s *ISyncerStruct) ChainTipSetWeight(p0 context.Context, p1 chain.TipSetKey) (big.Int, error) { +func (s *ISyncerStruct) ChainTipSetWeight(p0 context.Context, p1 types.TipSetKey) (big.Int, error) { return s.Internal.ChainTipSetWeight(p0, p1) } @@ -994,19 +989,19 @@ func (s *ISyncerStruct) SetConcurrent(p0 context.Context, p1 int64) error { return s.Internal.SetConcurrent(p0, p1) } -func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *chain.Message, p2 chain.TipSetKey) (*chain2.InvocResult, error) { +func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*types.InvocResult, error) { return s.Internal.StateCall(p0, p1, p2) } -func (s *ISyncerStruct) SyncState(p0 context.Context) (*chain2.SyncState, error) { +func (s *ISyncerStruct) SyncState(p0 context.Context) (*types.SyncState, error) { return s.Internal.SyncState(p0) } -func (s *ISyncerStruct) SyncSubmitBlock(p0 context.Context, p1 *chain.BlockMsg) error { +func (s *ISyncerStruct) SyncSubmitBlock(p0 context.Context, p1 *types.BlockMsg) error { return s.Internal.SyncSubmitBlock(p0, p1) } -func (s *ISyncerStruct) SyncerTracker(p0 context.Context) *chain2.TargetTracker { +func (s *ISyncerStruct) SyncerTracker(p0 context.Context) *types.TargetTracker { return s.Internal.SyncerTracker(p0) } @@ -1026,19 +1021,19 @@ type IWalletStruct struct { WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"` - WalletExport func(p0 context.Context, p1 address.Address, p2 string) (*wallet.KeyInfo, error) `perm:"admin"` + WalletExport func(p0 context.Context, p1 address.Address, p2 string) (*types.KeyInfo, error) `perm:"admin"` WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` - WalletImport func(p0 context.Context, p1 *wallet.KeyInfo) (address.Address, error) `perm:"admin"` + WalletImport func(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) `perm:"admin"` WalletNewAddress func(p0 context.Context, p1 address.Protocol) (address.Address, error) `perm:"write"` WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` - WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) `perm:"sign"` + WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) `perm:"sign"` - WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *chain.Message) (*chain.SignedMessage, error) `perm:"sign"` + WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) `perm:"sign"` WalletState func(p0 context.Context) int `perm:"admin"` } @@ -1072,7 +1067,7 @@ func (s *IWalletStruct) WalletDefaultAddress(p0 context.Context) (address.Addres return s.Internal.WalletDefaultAddress(p0) } -func (s *IWalletStruct) WalletExport(p0 context.Context, p1 address.Address, p2 string) (*wallet.KeyInfo, error) { +func (s *IWalletStruct) WalletExport(p0 context.Context, p1 address.Address, p2 string) (*types.KeyInfo, error) { return s.Internal.WalletExport(p0, p1, p2) } @@ -1080,7 +1075,7 @@ func (s *IWalletStruct) WalletHas(p0 context.Context, p1 address.Address) (bool, return s.Internal.WalletHas(p0, p1) } -func (s *IWalletStruct) WalletImport(p0 context.Context, p1 *wallet.KeyInfo) (address.Address, error) { +func (s *IWalletStruct) WalletImport(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) { return s.Internal.WalletImport(p0, p1) } @@ -1092,11 +1087,11 @@ func (s *IWalletStruct) WalletSetDefault(p0 context.Context, p1 address.Address) return s.Internal.WalletSetDefault(p0, p1) } -func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 wallet.MsgMeta) (*crypto.Signature, error) { +func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) { return s.Internal.WalletSign(p0, p1, p2, p3) } -func (s *IWalletStruct) WalletSignMessage(p0 context.Context, p1 address.Address, p2 *chain.Message) (*chain.SignedMessage, error) { +func (s *IWalletStruct) WalletSignMessage(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) { return s.Internal.WalletSignMessage(p0, p1, p2) } diff --git a/venus-shared/api/chain/v1/syncer.go b/venus-shared/api/chain/v1/syncer.go index 560e4ededa..2df413396f 100644 --- a/venus-shared/api/chain/v1/syncer.go +++ b/venus-shared/api/chain/v1/syncer.go @@ -5,17 +5,16 @@ import ( "github.com/filecoin-project/go-state-types/big" - chain2 "github.com/filecoin-project/venus/venus-shared/api/chain" - "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) type ISyncer interface { - ChainSyncHandleNewTipSet(ctx context.Context, ci *chain.ChainInfo) error //perm:write - SetConcurrent(ctx context.Context, concurrent int64) error //perm:admin - SyncerTracker(ctx context.Context) *chain2.TargetTracker //perm:read - Concurrent(ctx context.Context) int64 //perm:read - ChainTipSetWeight(ctx context.Context, tsk chain.TipSetKey) (big.Int, error) //perm:read - SyncSubmitBlock(ctx context.Context, blk *chain.BlockMsg) error //perm:write - StateCall(ctx context.Context, msg *chain.Message, tsk chain.TipSetKey) (*chain2.InvocResult, error) //perm:read - SyncState(ctx context.Context) (*chain2.SyncState, error) //perm:read + ChainSyncHandleNewTipSet(ctx context.Context, ci *types.ChainInfo) error //perm:write + SetConcurrent(ctx context.Context, concurrent int64) error //perm:admin + SyncerTracker(ctx context.Context) *types.TargetTracker //perm:read + Concurrent(ctx context.Context) int64 //perm:read + ChainTipSetWeight(ctx context.Context, tsk types.TipSetKey) (big.Int, error) //perm:read + SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error //perm:write + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*types.InvocResult, error) //perm:read + SyncState(ctx context.Context) (*types.SyncState, error) //perm:read } diff --git a/venus-shared/api/chain/v1/wallet.go b/venus-shared/api/chain/v1/wallet.go index 20f47aad0e..9b6203663f 100644 --- a/venus-shared/api/chain/v1/wallet.go +++ b/venus-shared/api/chain/v1/wallet.go @@ -7,24 +7,23 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/wallet" + "github.com/filecoin-project/venus/venus-shared/types" ) type IWallet interface { - WalletSign(ctx context.Context, k address.Address, msg []byte, meta wallet.MsgMeta) (*crypto.Signature, error) //perm:sign - WalletExport(ctx context.Context, addr address.Address, password string) (*wallet.KeyInfo, error) //perm:admin - WalletImport(ctx context.Context, key *wallet.KeyInfo) (address.Address, error) //perm:admin - WalletHas(ctx context.Context, addr address.Address) (bool, error) //perm:write - WalletNewAddress(ctx context.Context, protocol address.Protocol) (address.Address, error) //perm:write - WalletBalance(ctx context.Context, addr address.Address) (abi.TokenAmount, error) //perm:read - WalletDefaultAddress(ctx context.Context) (address.Address, error) //perm:write - WalletAddresses(ctx context.Context) []address.Address //perm:admin - WalletSetDefault(ctx context.Context, addr address.Address) error //perm:write - WalletSignMessage(ctx context.Context, k address.Address, msg *chain.Message) (*chain.SignedMessage, error) //perm:sign - LockWallet(ctx context.Context) error //perm:admin - UnLockWallet(ctx context.Context, password []byte) error //perm:admin - SetPassword(ctx context.Context, password []byte) error //perm:admin - HasPassword(ctx context.Context) bool //perm:admin - WalletState(ctx context.Context) int //perm:admin + WalletSign(ctx context.Context, k address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) //perm:sign + WalletExport(ctx context.Context, addr address.Address, password string) (*types.KeyInfo, error) //perm:admin + WalletImport(ctx context.Context, key *types.KeyInfo) (address.Address, error) //perm:admin + WalletHas(ctx context.Context, addr address.Address) (bool, error) //perm:write + WalletNewAddress(ctx context.Context, protocol address.Protocol) (address.Address, error) //perm:write + WalletBalance(ctx context.Context, addr address.Address) (abi.TokenAmount, error) //perm:read + WalletDefaultAddress(ctx context.Context) (address.Address, error) //perm:write + WalletAddresses(ctx context.Context) []address.Address //perm:admin + WalletSetDefault(ctx context.Context, addr address.Address) error //perm:write + WalletSignMessage(ctx context.Context, k address.Address, msg *types.Message) (*types.SignedMessage, error) //perm:sign + LockWallet(ctx context.Context) error //perm:admin + UnLockWallet(ctx context.Context, password []byte) error //perm:admin + SetPassword(ctx context.Context, password []byte) error //perm:admin + HasPassword(ctx context.Context) bool //perm:admin + WalletState(ctx context.Context) int //perm:admin } diff --git a/venus-shared/chain/actor.go b/venus-shared/internal/actor.go similarity index 99% rename from venus-shared/chain/actor.go rename to venus-shared/internal/actor.go index 2d20c6cfc1..12e53c521c 100644 --- a/venus-shared/chain/actor.go +++ b/venus-shared/internal/actor.go @@ -1,4 +1,4 @@ -package chain +package internal import ( "errors" diff --git a/venus-shared/internal/bigint.go b/venus-shared/internal/bigint.go new file mode 100644 index 0000000000..5b1a467ad5 --- /dev/null +++ b/venus-shared/internal/bigint.go @@ -0,0 +1,59 @@ +package internal + +import ( + "fmt" + "math/big" + + big2 "github.com/filecoin-project/go-state-types/big" +) + +var EmptyInt = BigInt{} + +type BigInt = big2.Int + +func NewInt(i uint64) BigInt { + return BigInt{Int: big.NewInt(0).SetUint64(i)} +} + +func BigFromBytes(b []byte) BigInt { + i := big.NewInt(0).SetBytes(b) + return BigInt{Int: i} +} + +func BigFromString(s string) (BigInt, error) { + v, ok := big.NewInt(0).SetString(s, 10) + if !ok { + return BigInt{}, fmt.Errorf("failed to parse string as a big int") + } + + return BigInt{Int: v}, nil +} + +func BigMul(a, b BigInt) BigInt { + return BigInt{Int: big.NewInt(0).Mul(a.Int, b.Int)} +} + +func BigDiv(a, b BigInt) BigInt { + return BigInt{Int: big.NewInt(0).Div(a.Int, b.Int)} +} + +func BigDivFloat(num, den BigInt) float64 { + res, _ := new(big.Rat).SetFrac(num.Int, den.Int).Float64() + return res +} + +func BigMod(a, b BigInt) BigInt { + return BigInt{Int: big.NewInt(0).Mod(a.Int, b.Int)} +} + +func BigAdd(a, b BigInt) BigInt { + return BigInt{Int: big.NewInt(0).Add(a.Int, b.Int)} +} + +func BigSub(a, b BigInt) BigInt { + return BigInt{Int: big.NewInt(0).Sub(a.Int, b.Int)} +} + +func BigCmp(a, b BigInt) int { + return a.Int.Cmp(b.Int) +} diff --git a/venus-shared/internal/bigint_fil.go b/venus-shared/internal/bigint_fil.go new file mode 100644 index 0000000000..efb11948c4 --- /dev/null +++ b/venus-shared/internal/bigint_fil.go @@ -0,0 +1,147 @@ +package internal + +import ( + "encoding" + "fmt" + "math/big" + "strings" + + fbig "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/venus/venus-shared/types/params" +) + +var ZeroFIL = fbig.NewInt(0) + +type FIL BigInt + +func (f FIL) String() string { + return f.Unitless() + " FIL" +} + +var AttoFil = NewInt(1) +var FemtoFil = BigMul(AttoFil, NewInt(1000)) +var PicoFil = BigMul(FemtoFil, NewInt(1000)) +var NanoFil = BigMul(PicoFil, NewInt(1000)) + +func (f FIL) Unitless() string { + r := new(big.Rat).SetFrac(f.Int, big.NewInt(int64(params.FilecoinPrecision))) + if r.Sign() == 0 { + return "0" + } + return strings.TrimRight(strings.TrimRight(r.FloatString(18), "0"), ".") +} + +var unitPrefixes = []string{"a", "f", "p", "n", "μ", "m"} + +func (f FIL) Short() string { + n := BigInt(f).Abs() + + dn := uint64(1) + var prefix string + for _, p := range unitPrefixes { + if n.LessThan(NewInt(dn * 1000)) { + prefix = p + break + } + dn *= 1000 + } + + r := new(big.Rat).SetFrac(f.Int, big.NewInt(int64(dn))) + if r.Sign() == 0 { + return "0" + } + + return strings.TrimRight(strings.TrimRight(r.FloatString(3), "0"), ".") + " " + prefix + "FIL" +} + +func (f FIL) Nano() string { + r := new(big.Rat).SetFrac(f.Int, big.NewInt(int64(1e9))) + if r.Sign() == 0 { + return "0" + } + + return strings.TrimRight(strings.TrimRight(r.FloatString(9), "0"), ".") + " nFIL" +} + +func (f FIL) Format(s fmt.State, ch rune) { + switch ch { + case 's', 'v': + fmt.Fprint(s, f.String()) + default: + f.Int.Format(s, ch) + } +} + +func (f FIL) MarshalText() (text []byte, err error) { + return []byte(f.String()), nil +} + +func (f FIL) UnmarshalText(text []byte) error { + p, err := ParseFIL(string(text)) + if err != nil { + return err + } + + if f.Int == nil { + f.Int = big.NewInt(0) + } + + f.Int.Set(p.Int) + return nil +} + +func ParseFIL(s string) (FIL, error) { + suffix := strings.TrimLeft(s, "-.1234567890") + s = s[:len(s)-len(suffix)] + var attofil bool + if suffix != "" { + norm := strings.ToLower(strings.TrimSpace(suffix)) + switch norm { + case "", "fil": + case "attofil", "afil": + attofil = true + default: + return FIL{}, fmt.Errorf("unrecognized suffix: %q", suffix) + } + } + + if len(s) > 50 { + return FIL{}, fmt.Errorf("string length too large: %d", len(s)) + } + + r, ok := new(big.Rat).SetString(s) + if !ok { + return FIL{}, fmt.Errorf("failed to parse %q as a decimal number", s) + } + + if !attofil { + r = r.Mul(r, big.NewRat(int64(params.FilecoinPrecision), 1)) + } + + if !r.IsInt() { + var pref string + if attofil { + pref = "atto" + } + return FIL{}, fmt.Errorf("invalid %sFIL value: %q", pref, s) + } + + return FIL{r.Num()}, nil +} + +func MustParseFIL(s string) FIL { + n, err := ParseFIL(s) + if err != nil { + panic(err) + } + + return n +} + +func FromFil(i uint64) BigInt { + return BigMul(NewInt(i), NewInt(params.FilecoinPrecision)) +} + +var _ encoding.TextMarshaler = (*FIL)(nil) +var _ encoding.TextUnmarshaler = (*FIL)(nil) diff --git a/venus-shared/internal/cbor_gen.go b/venus-shared/internal/cbor_gen.go new file mode 100644 index 0000000000..c3c47e9625 --- /dev/null +++ b/venus-shared/internal/cbor_gen.go @@ -0,0 +1,362 @@ +// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. + +package internal + +import ( + "fmt" + "io" + "math" + "sort" + + abi "github.com/filecoin-project/go-state-types/abi" + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" +) + +var _ = xerrors.Errorf +var _ = cid.Undef +var _ = math.E +var _ = sort.Sort + +var lengthBufActor = []byte{132} + +func (t *Actor) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufActor); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Code (cid.Cid) (struct) + + if err := cbg.WriteCidBuf(scratch, w, t.Code); err != nil { + return xerrors.Errorf("failed to write cid field t.Code: %w", err) + } + + // t.Head (cid.Cid) (struct) + + if err := cbg.WriteCidBuf(scratch, w, t.Head); err != nil { + return xerrors.Errorf("failed to write cid field t.Head: %w", err) + } + + // t.Nonce (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Nonce)); err != nil { + return err + } + + // t.Balance (big.Int) (struct) + if err := t.Balance.MarshalCBOR(w); err != nil { + return err + } + return nil +} + +func (t *Actor) UnmarshalCBOR(r io.Reader) error { + *t = Actor{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 4 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Code (cid.Cid) (struct) + + { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.Code: %w", err) + } + + t.Code = c + + } + // t.Head (cid.Cid) (struct) + + { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.Head: %w", err) + } + + t.Head = c + + } + // t.Nonce (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Nonce = uint64(extra) + + } + // t.Balance (big.Int) (struct) + + { + + if err := t.Balance.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Balance: %w", err) + } + + } + return nil +} + +var lengthBufMessage = []byte{138} + +func (t *Message) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufMessage); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Version (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Version)); err != nil { + return err + } + + // t.To (address.Address) (struct) + if err := t.To.MarshalCBOR(w); err != nil { + return err + } + + // t.From (address.Address) (struct) + if err := t.From.MarshalCBOR(w); err != nil { + return err + } + + // t.Nonce (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Nonce)); err != nil { + return err + } + + // t.Value (big.Int) (struct) + if err := t.Value.MarshalCBOR(w); err != nil { + return err + } + + // t.GasLimit (int64) (int64) + if t.GasLimit >= 0 { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.GasLimit)); err != nil { + return err + } + } else { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.GasLimit-1)); err != nil { + return err + } + } + + // t.GasFeeCap (big.Int) (struct) + if err := t.GasFeeCap.MarshalCBOR(w); err != nil { + return err + } + + // t.GasPremium (big.Int) (struct) + if err := t.GasPremium.MarshalCBOR(w); err != nil { + return err + } + + // t.Method (abi.MethodNum) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Method)); err != nil { + return err + } + + // t.Params ([]uint8) (slice) + if len(t.Params) > cbg.ByteArrayMaxLen { + return xerrors.Errorf("Byte array in field t.Params was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.Params))); err != nil { + return err + } + + if _, err := w.Write(t.Params[:]); err != nil { + return err + } + return nil +} + +func (t *Message) UnmarshalCBOR(r io.Reader) error { + *t = Message{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 10 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Version (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Version = uint64(extra) + + } + // t.To (address.Address) (struct) + + { + + if err := t.To.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.To: %w", err) + } + + } + // t.From (address.Address) (struct) + + { + + if err := t.From.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.From: %w", err) + } + + } + // t.Nonce (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Nonce = uint64(extra) + + } + // t.Value (big.Int) (struct) + + { + + if err := t.Value.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Value: %w", err) + } + + } + // t.GasLimit (int64) (int64) + { + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.GasLimit = int64(extraI) + } + // t.GasFeeCap (big.Int) (struct) + + { + + if err := t.GasFeeCap.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.GasFeeCap: %w", err) + } + + } + // t.GasPremium (big.Int) (struct) + + { + + if err := t.GasPremium.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.GasPremium: %w", err) + } + + } + // t.Method (abi.MethodNum) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Method = abi.MethodNum(extra) + + } + // t.Params ([]uint8) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.ByteArrayMaxLen { + return fmt.Errorf("t.Params: byte array too large (%d)", extra) + } + if maj != cbg.MajByteString { + return fmt.Errorf("expected byte array") + } + + if extra > 0 { + t.Params = make([]uint8, extra) + } + + if _, err := io.ReadFull(br, t.Params[:]); err != nil { + return err + } + return nil +} diff --git a/venus-shared/chain/message.go b/venus-shared/internal/message.go similarity index 98% rename from venus-shared/chain/message.go rename to venus-shared/internal/message.go index 6b072f350d..76edb48e8a 100644 --- a/venus-shared/chain/message.go +++ b/venus-shared/internal/message.go @@ -1,4 +1,4 @@ -package chain +package internal import ( "bytes" @@ -9,7 +9,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/venus/venus-shared/chain/params" + "github.com/filecoin-project/venus/venus-shared/types/params" blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" ) diff --git a/venus-shared/chain/message_marshal.go b/venus-shared/internal/message_marshal.go similarity index 94% rename from venus-shared/chain/message_marshal.go rename to venus-shared/internal/message_marshal.go index 50773b747d..8ea050f404 100644 --- a/venus-shared/chain/message_marshal.go +++ b/venus-shared/internal/message_marshal.go @@ -1,4 +1,4 @@ -package chain +package internal import ( "encoding/json" diff --git a/venus-shared/internal/param.go b/venus-shared/internal/param.go new file mode 100644 index 0000000000..4de72e2f86 --- /dev/null +++ b/venus-shared/internal/param.go @@ -0,0 +1,25 @@ +package internal + +import ( + "github.com/filecoin-project/go-address" + + big2 "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/venus-shared/types/params" +) + +var ( + bigZero = big2.Zero() +) + +var TotalFilecoinInt = FromFil(params.FilBase) + +var ZeroAddress = func() address.Address { + addr := "f3yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaby2smx7a" + + ret, err := address.NewFromString(addr) + if err != nil { + panic(err) + } + + return ret +}() diff --git a/venus-shared/libp2p/exchange/cbor_gen.go b/venus-shared/libp2p/exchange/cbor_gen.go index 829e6f3d60..afcd8774e8 100644 --- a/venus-shared/libp2p/exchange/cbor_gen.go +++ b/venus-shared/libp2p/exchange/cbor_gen.go @@ -8,7 +8,8 @@ import ( "math" "sort" - chain "github.com/filecoin-project/venus/venus-shared/chain" + internal "github.com/filecoin-project/venus/venus-shared/internal" + types "github.com/filecoin-project/venus/venus-shared/types" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" @@ -272,7 +273,7 @@ func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { scratch := make([]byte, 9) - // t.Bls ([]*chain.Message) (slice) + // t.Bls ([]*internal.Message) (slice) if len(t.Bls) > cbg.MaxLength { return xerrors.Errorf("Slice value in field t.Bls was too long") } @@ -309,7 +310,7 @@ func (t *CompactedMessages) MarshalCBOR(w io.Writer) error { } } - // t.Secpk ([]*chain.SignedMessage) (slice) + // t.Secpk ([]*types.SignedMessage) (slice) if len(t.Secpk) > cbg.MaxLength { return xerrors.Errorf("Slice value in field t.Secpk was too long") } @@ -366,7 +367,7 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) error { return fmt.Errorf("cbor input had wrong number of fields") } - // t.Bls ([]*chain.Message) (slice) + // t.Bls ([]*internal.Message) (slice) maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) if err != nil { @@ -382,12 +383,12 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) error { } if extra > 0 { - t.Bls = make([]*chain.Message, extra) + t.Bls = make([]*internal.Message, extra) } for i := 0; i < int(extra); i++ { - var v chain.Message + var v internal.Message if err := v.UnmarshalCBOR(br); err != nil { return err } @@ -454,7 +455,7 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) error { } } - // t.Secpk ([]*chain.SignedMessage) (slice) + // t.Secpk ([]*types.SignedMessage) (slice) maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) if err != nil { @@ -470,12 +471,12 @@ func (t *CompactedMessages) UnmarshalCBOR(r io.Reader) error { } if extra > 0 { - t.Secpk = make([]*chain.SignedMessage, extra) + t.Secpk = make([]*types.SignedMessage, extra) } for i := 0; i < int(extra); i++ { - var v chain.SignedMessage + var v types.SignedMessage if err := v.UnmarshalCBOR(br); err != nil { return err } @@ -558,7 +559,7 @@ func (t *BSTipSet) MarshalCBOR(w io.Writer) error { scratch := make([]byte, 9) - // t.Blocks ([]*chain.BlockHeader) (slice) + // t.Blocks ([]*types.BlockHeader) (slice) if len(t.Blocks) > cbg.MaxLength { return xerrors.Errorf("Slice value in field t.Blocks was too long") } @@ -597,7 +598,7 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error { return fmt.Errorf("cbor input had wrong number of fields") } - // t.Blocks ([]*chain.BlockHeader) (slice) + // t.Blocks ([]*types.BlockHeader) (slice) maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) if err != nil { @@ -613,12 +614,12 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error { } if extra > 0 { - t.Blocks = make([]*chain.BlockHeader, extra) + t.Blocks = make([]*types.BlockHeader, extra) } for i := 0; i < int(extra); i++ { - var v chain.BlockHeader + var v types.BlockHeader if err := v.UnmarshalCBOR(br); err != nil { return err } diff --git a/venus-shared/libp2p/exchange/client.go b/venus-shared/libp2p/exchange/client.go index e09a20c87f..94a4f7e56b 100644 --- a/venus-shared/libp2p/exchange/client.go +++ b/venus-shared/libp2p/exchange/client.go @@ -5,7 +5,7 @@ import ( "github.com/libp2p/go-libp2p-core/peer" - "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) // Client is the requesting side of the ChainExchange protocol. It acts as @@ -15,15 +15,15 @@ type Client interface { // GetBlocks fetches block headers from the network, from the provided // tipset *backwards*, returning as many tipsets as the count parameter, // or less. - GetBlocks(ctx context.Context, tsk chain.TipSetKey, count int) ([]*chain.TipSet, error) + GetBlocks(ctx context.Context, tsk types.TipSetKey, count int) ([]*types.TipSet, error) // GetChainMessages fetches messages from the network, starting from the first provided tipset // and returning messages from as many tipsets as requested or less. - GetChainMessages(ctx context.Context, tipsets []*chain.TipSet) ([]*CompactedMessages, error) + GetChainMessages(ctx context.Context, tipsets []*types.TipSet) ([]*CompactedMessages, error) // GetFullTipSet fetches a full tipset from a given peer. If successful, // the fetched object contains block headers and all messages in full form. - GetFullTipSet(ctx context.Context, peer peer.ID, tsk chain.TipSetKey) (*chain.FullTipSet, error) + GetFullTipSet(ctx context.Context, peer peer.ID, tsk types.TipSetKey) (*types.FullTipSet, error) // AddPeer adds a peer to the pool of peers that the Client requests // data from. diff --git a/venus-shared/libp2p/exchange/exchange.go b/venus-shared/libp2p/exchange/exchange.go index cd42eb162c..112be46128 100644 --- a/venus-shared/libp2p/exchange/exchange.go +++ b/venus-shared/libp2p/exchange/exchange.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/venus-shared/actors/policy" - "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" ) const ( @@ -126,7 +126,7 @@ func (res *Response) StatusToError() error { type BSTipSet struct { // List of blocks belonging to a single tipset to which the // `CompactedMessages` are linked. - Blocks []*chain.BlockHeader + Blocks []*types.BlockHeader Messages *CompactedMessages } @@ -143,9 +143,9 @@ type BSTipSet struct { // FIXME: The logic to decompress this structure should belong // to itself, not to the consumer. type CompactedMessages struct { - Bls []*chain.Message + Bls []*types.Message BlsIncludes [][]uint64 - Secpk []*chain.SignedMessage + Secpk []*types.SignedMessage SecpkIncludes [][]uint64 } diff --git a/venus-shared/localstore/chain.go b/venus-shared/localstore/chain.go index 7e668cbc2d..2c5b118138 100644 --- a/venus-shared/localstore/chain.go +++ b/venus-shared/localstore/chain.go @@ -3,19 +3,19 @@ package localstore import ( "context" - "github.com/filecoin-project/venus/venus-shared/chain" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ) type TipSetLoader interface { - GetTipSet(context.Context, chain.TipSetKey) (*chain.TipSet, error) + GetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) } type MessageLoader interface { ReadMsgMetaCids(ctx context.Context, mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) - LoadMessagesFromCids(ctx context.Context, cids []cid.Cid) ([]*chain.Message, error) - LoadSignedMessagesFromCids(ctx context.Context, cids []cid.Cid) ([]*chain.SignedMessage, error) + LoadMessagesFromCids(ctx context.Context, cids []cid.Cid) ([]*types.Message, error) + LoadSignedMessagesFromCids(ctx context.Context, cids []cid.Cid) ([]*types.SignedMessage, error) } type ChainLoader interface { @@ -24,9 +24,9 @@ type ChainLoader interface { } type FullTipSetLoader interface { - LoadFullTipSet(ctx context.Context, tsk chain.TipSetKey) (*chain.FullTipSet, error) + LoadFullTipSet(ctx context.Context, tsk types.TipSetKey) (*types.FullTipSet, error) } type FullTipSetStorer interface { - StoreFullTipSet(ctx context.Context, fb *chain.FullTipSet) error + StoreFullTipSet(ctx context.Context, fb *types.FullTipSet) error } diff --git a/venus-shared/paych/cbor_gen.go b/venus-shared/paych/cbor_gen.go deleted file mode 100644 index 3afd90051d..0000000000 --- a/venus-shared/paych/cbor_gen.go +++ /dev/null @@ -1,131 +0,0 @@ -// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. - -package paych - -import ( - "fmt" - "io" - "math" - "sort" - - paych "github.com/filecoin-project/specs-actors/actors/builtin/paych" - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" -) - -var _ = xerrors.Errorf -var _ = cid.Undef -var _ = math.E -var _ = sort.Sort - -var lengthBufPaymentInfo = []byte{131} - -func (t *PaymentInfo) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufPaymentInfo); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.Channel (address.Address) (struct) - if err := t.Channel.MarshalCBOR(w); err != nil { - return err - } - - // t.WaitSentinel (cid.Cid) (struct) - - if err := cbg.WriteCidBuf(scratch, w, t.WaitSentinel); err != nil { - return xerrors.Errorf("failed to write cid field t.WaitSentinel: %w", err) - } - - // t.Vouchers ([]*paych.SignedVoucher) (slice) - if len(t.Vouchers) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.Vouchers was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Vouchers))); err != nil { - return err - } - for _, v := range t.Vouchers { - if err := v.MarshalCBOR(w); err != nil { - return err - } - } - return nil -} - -func (t *PaymentInfo) UnmarshalCBOR(r io.Reader) error { - *t = PaymentInfo{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 3 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Channel (address.Address) (struct) - - { - - if err := t.Channel.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.Channel: %w", err) - } - - } - // t.WaitSentinel (cid.Cid) (struct) - - { - - c, err := cbg.ReadCid(br) - if err != nil { - return xerrors.Errorf("failed to read cid field t.WaitSentinel: %w", err) - } - - t.WaitSentinel = c - - } - // t.Vouchers ([]*paych.SignedVoucher) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.Vouchers: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.Vouchers = make([]*paych.SignedVoucher, extra) - } - - for i := 0; i < int(extra); i++ { - - var v paych.SignedVoucher - if err := v.UnmarshalCBOR(br); err != nil { - return err - } - - t.Vouchers[i] = &v - } - - return nil -} diff --git a/venus-shared/types/actor.go b/venus-shared/types/actor.go new file mode 100644 index 0000000000..842ae1924e --- /dev/null +++ b/venus-shared/types/actor.go @@ -0,0 +1,63 @@ +package types + +import ( + "errors" + + internal "github.com/filecoin-project/venus/venus-shared/internal" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" +) + +var ErrActorNotFound = errors.New("actor not found") + +// Actor is the central abstraction of entities in the system. +// +// Both individual accounts, as well as contracts (user & system level) are +// represented as actors. An actor has the following core functionality implemented on a system level: +// - track a Filecoin balance, using the `Balance` field +// - execute code stored in the `Code` field +// - read & write memory +// - replay protection, using the `Nonce` field +// +// Value sent to a non-existent address will be tracked as an empty actor that has a Balance but +// nil Code and Memory. You must nil check Code cids before comparing them. +// +// More specific capabilities for individual accounts or contract specific must be implemented +// inside the code. +// +// Not safe for concurrent access. +type Actor = internal.Actor + +//type Actor struct { +// // Code is a CID of the VM code for this actor's implementation (or a constant for actors implemented in Go code). +// // Code may be nil for an uninitialized actor (which exists because it has received a balance). +// Code cid.Cid +// // Head is the CID of the root of the actor's state tree. +// Head cid.Cid +// // Nonce is the number expected on the next message from this actor. +// // Messages are processed in strict, contiguous order. +// Nonce uint64 +// // Balance is the amount of attoFIL in the actor's account. +// Balance abi.TokenAmount +//} + +// NewActor constructs a new actor. +func NewActor(code cid.Cid, balance abi.TokenAmount, head cid.Cid) *Actor { + return &Actor{ + Code: code, + Nonce: 0, + Balance: balance, + Head: head, + } +} + +//// Empty tests whether the actor's code is defined. +//func (t *Actor) Empty() bool { +// return !t.Code.Defined() +//} +// +//// IncrementSeqNum increments the seq number. +//func (t *Actor) IncrementSeqNum() { +// t.Nonce = t.Nonce + 1 +//} diff --git a/venus-shared/chain/actor_test.go b/venus-shared/types/actor_test.go similarity index 98% rename from venus-shared/chain/actor_test.go rename to venus-shared/types/actor_test.go index dbeb099f0c..8725bb34bc 100644 --- a/venus-shared/chain/actor_test.go +++ b/venus-shared/types/actor_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" diff --git a/venus-shared/chain/beacon.go b/venus-shared/types/beacon.go similarity index 80% rename from venus-shared/chain/beacon.go rename to venus-shared/types/beacon.go index b7abe21233..51b07b0940 100644 --- a/venus-shared/chain/beacon.go +++ b/venus-shared/types/beacon.go @@ -1,4 +1,4 @@ -package chain +package types type BeaconEntry struct { Round uint64 diff --git a/venus-shared/chain/beacon_test.go b/venus-shared/types/beacon_test.go similarity index 98% rename from venus-shared/chain/beacon_test.go rename to venus-shared/types/beacon_test.go index 09be937ff2..b93a698b2e 100644 --- a/venus-shared/chain/beacon_test.go +++ b/venus-shared/types/beacon_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" diff --git a/venus-shared/chain/bigint.go b/venus-shared/types/bigint.go similarity index 98% rename from venus-shared/chain/bigint.go rename to venus-shared/types/bigint.go index 1baecc9d80..6174b5c580 100644 --- a/venus-shared/chain/bigint.go +++ b/venus-shared/types/bigint.go @@ -1,4 +1,4 @@ -package chain +package types import ( "fmt" diff --git a/venus-shared/chain/bigint_fil.go b/venus-shared/types/bigint_fil.go similarity index 97% rename from venus-shared/chain/bigint_fil.go rename to venus-shared/types/bigint_fil.go index 8831be37e5..1a51dc9c3b 100644 --- a/venus-shared/chain/bigint_fil.go +++ b/venus-shared/types/bigint_fil.go @@ -1,4 +1,4 @@ -package chain +package types import ( "encoding" @@ -8,7 +8,7 @@ import ( fbig "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/venus-shared/chain/params" + "github.com/filecoin-project/venus/venus-shared/types/params" ) var ZeroFIL = fbig.NewInt(0) diff --git a/venus-shared/chain/bigint_fil_test.go b/venus-shared/types/bigint_fil_test.go similarity index 98% rename from venus-shared/chain/bigint_fil_test.go rename to venus-shared/types/bigint_fil_test.go index c9ef06902b..947f20d53b 100644 --- a/venus-shared/chain/bigint_fil_test.go +++ b/venus-shared/types/bigint_fil_test.go @@ -1,12 +1,12 @@ -package chain +package types import ( "strings" "testing" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/venus-shared/chain/params" "github.com/filecoin-project/venus/venus-shared/testutil" + "github.com/filecoin-project/venus/venus-shared/types/params" "github.com/stretchr/testify/require" ) diff --git a/venus-shared/chain/bigint_test.go b/venus-shared/types/bigint_test.go similarity index 99% rename from venus-shared/chain/bigint_test.go rename to venus-shared/types/bigint_test.go index 5ae880d076..cb0e8efb4b 100644 --- a/venus-shared/chain/bigint_test.go +++ b/venus-shared/types/bigint_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" diff --git a/venus-shared/chain/bigint_unit.go b/venus-shared/types/bigint_unit.go similarity index 98% rename from venus-shared/chain/bigint_unit.go rename to venus-shared/types/bigint_unit.go index fe364acba3..f9687d42a4 100644 --- a/venus-shared/chain/bigint_unit.go +++ b/venus-shared/types/bigint_unit.go @@ -1,4 +1,4 @@ -package chain +package types import ( "fmt" diff --git a/venus-shared/chain/bigint_unit_test.go b/venus-shared/types/bigint_unit_test.go similarity index 98% rename from venus-shared/chain/bigint_unit_test.go rename to venus-shared/types/bigint_unit_test.go index 3b86094797..0c436be195 100644 --- a/venus-shared/chain/bigint_unit_test.go +++ b/venus-shared/types/bigint_unit_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "math/big" diff --git a/venus-shared/chain/block_header.go b/venus-shared/types/block_header.go similarity index 99% rename from venus-shared/chain/block_header.go rename to venus-shared/types/block_header.go index cc17a3d4e4..16a40062de 100644 --- a/venus-shared/chain/block_header.go +++ b/venus-shared/types/block_header.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" diff --git a/venus-shared/chain/block_header_test.go b/venus-shared/types/block_header_test.go similarity index 99% rename from venus-shared/chain/block_header_test.go rename to venus-shared/types/block_header_test.go index 7b5bf75175..470549d1cc 100644 --- a/venus-shared/chain/block_header_test.go +++ b/venus-shared/types/block_header_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" diff --git a/venus-shared/chain/block_message.go b/venus-shared/types/block_message.go similarity index 93% rename from venus-shared/chain/block_message.go rename to venus-shared/types/block_message.go index c631f35a81..36b5fa31b7 100644 --- a/venus-shared/chain/block_message.go +++ b/venus-shared/types/block_message.go @@ -1,4 +1,4 @@ -package chain +package types // BlockMessagesInfo contains messages for one newBlock in a tipset. type BlockMessagesInfo struct { //nolint diff --git a/venus-shared/chain/block_message_test.go b/venus-shared/types/block_message_test.go similarity index 91% rename from venus-shared/chain/block_message_test.go rename to venus-shared/types/block_message_test.go index be92e26733..5d24852c3d 100644 --- a/venus-shared/chain/block_message_test.go +++ b/venus-shared/types/block_message_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "testing" diff --git a/venus-shared/chain/block_msg.go b/venus-shared/types/block_msg.go similarity index 97% rename from venus-shared/chain/block_msg.go rename to venus-shared/types/block_msg.go index 078651998a..e884d03b9e 100644 --- a/venus-shared/chain/block_msg.go +++ b/venus-shared/types/block_msg.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" diff --git a/venus-shared/chain/block_msg_test.go b/venus-shared/types/block_msg_test.go similarity index 99% rename from venus-shared/chain/block_msg_test.go rename to venus-shared/types/block_msg_test.go index b18e6f7d37..d39a6cc922 100644 --- a/venus-shared/chain/block_msg_test.go +++ b/venus-shared/types/block_msg_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" diff --git a/venus-shared/chain/cbor_gen.go b/venus-shared/types/cbor_gen.go similarity index 80% rename from venus-shared/chain/cbor_gen.go rename to venus-shared/types/cbor_gen.go index f64c7e78d5..89e2ee85a6 100644 --- a/venus-shared/chain/cbor_gen.go +++ b/venus-shared/types/cbor_gen.go @@ -1,6 +1,6 @@ // Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. -package chain +package types import ( "fmt" @@ -11,6 +11,7 @@ import ( abi "github.com/filecoin-project/go-state-types/abi" crypto "github.com/filecoin-project/go-state-types/crypto" exitcode "github.com/filecoin-project/go-state-types/exitcode" + paych "github.com/filecoin-project/specs-actors/actors/builtin/paych" proof "github.com/filecoin-project/specs-actors/actors/runtime/proof" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" @@ -40,17 +41,17 @@ func (t *BlockHeader) MarshalCBOR(w io.Writer) error { return err } - // t.Ticket (chain.Ticket) (struct) + // t.Ticket (types.Ticket) (struct) if err := t.Ticket.MarshalCBOR(w); err != nil { return err } - // t.ElectionProof (chain.ElectionProof) (struct) + // t.ElectionProof (types.ElectionProof) (struct) if err := t.ElectionProof.MarshalCBOR(w); err != nil { return err } - // t.BeaconEntries ([]chain.BeaconEntry) (slice) + // t.BeaconEntries ([]types.BeaconEntry) (slice) if len(t.BeaconEntries) > cbg.MaxLength { return xerrors.Errorf("Slice value in field t.BeaconEntries was too long") } @@ -182,7 +183,7 @@ func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error { } } - // t.Ticket (chain.Ticket) (struct) + // t.Ticket (types.Ticket) (struct) { @@ -201,7 +202,7 @@ func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error { } } - // t.ElectionProof (chain.ElectionProof) (struct) + // t.ElectionProof (types.ElectionProof) (struct) { @@ -220,7 +221,7 @@ func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error { } } - // t.BeaconEntries ([]chain.BeaconEntry) (slice) + // t.BeaconEntries ([]types.BeaconEntry) (slice) maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) if err != nil { @@ -467,7 +468,7 @@ func (t *Ticket) MarshalCBOR(w io.Writer) error { scratch := make([]byte, 9) - // t.VRFProof (chain.VRFPi) (slice) + // t.VRFProof (types.VRFPi) (slice) if len(t.VRFProof) > cbg.ByteArrayMaxLen { return xerrors.Errorf("Byte array in field t.VRFProof was too long") } @@ -500,7 +501,7 @@ func (t *Ticket) UnmarshalCBOR(r io.Reader) error { return fmt.Errorf("cbor input had wrong number of fields") } - // t.VRFProof (chain.VRFPi) (slice) + // t.VRFProof (types.VRFPi) (slice) maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) if err != nil { @@ -548,7 +549,7 @@ func (t *ElectionProof) MarshalCBOR(w io.Writer) error { } } - // t.VRFProof (chain.VRFPi) (slice) + // t.VRFProof (types.VRFPi) (slice) if len(t.VRFProof) > cbg.ByteArrayMaxLen { return xerrors.Errorf("Byte array in field t.VRFProof was too long") } @@ -606,7 +607,7 @@ func (t *ElectionProof) UnmarshalCBOR(r io.Reader) error { t.WinCount = int64(extraI) } - // t.VRFProof (chain.VRFPi) (slice) + // t.VRFProof (types.VRFPi) (slice) maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) if err != nil { @@ -720,242 +721,6 @@ func (t *BeaconEntry) UnmarshalCBOR(r io.Reader) error { return nil } -var lengthBufMessage = []byte{138} - -func (t *Message) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufMessage); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.Version (uint64) (uint64) - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Version)); err != nil { - return err - } - - // t.To (address.Address) (struct) - if err := t.To.MarshalCBOR(w); err != nil { - return err - } - - // t.From (address.Address) (struct) - if err := t.From.MarshalCBOR(w); err != nil { - return err - } - - // t.Nonce (uint64) (uint64) - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Nonce)); err != nil { - return err - } - - // t.Value (big.Int) (struct) - if err := t.Value.MarshalCBOR(w); err != nil { - return err - } - - // t.GasLimit (int64) (int64) - if t.GasLimit >= 0 { - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.GasLimit)); err != nil { - return err - } - } else { - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.GasLimit-1)); err != nil { - return err - } - } - - // t.GasFeeCap (big.Int) (struct) - if err := t.GasFeeCap.MarshalCBOR(w); err != nil { - return err - } - - // t.GasPremium (big.Int) (struct) - if err := t.GasPremium.MarshalCBOR(w); err != nil { - return err - } - - // t.Method (abi.MethodNum) (uint64) - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Method)); err != nil { - return err - } - - // t.Params ([]uint8) (slice) - if len(t.Params) > cbg.ByteArrayMaxLen { - return xerrors.Errorf("Byte array in field t.Params was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.Params))); err != nil { - return err - } - - if _, err := w.Write(t.Params[:]); err != nil { - return err - } - return nil -} - -func (t *Message) UnmarshalCBOR(r io.Reader) error { - *t = Message{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 10 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Version (uint64) (uint64) - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Version = uint64(extra) - - } - // t.To (address.Address) (struct) - - { - - if err := t.To.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.To: %w", err) - } - - } - // t.From (address.Address) (struct) - - { - - if err := t.From.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.From: %w", err) - } - - } - // t.Nonce (uint64) (uint64) - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Nonce = uint64(extra) - - } - // t.Value (big.Int) (struct) - - { - - if err := t.Value.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.Value: %w", err) - } - - } - // t.GasLimit (int64) (int64) - { - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - var extraI int64 - if err != nil { - return err - } - switch maj { - case cbg.MajUnsignedInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 positive overflow") - } - case cbg.MajNegativeInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") - } - extraI = -1 - extraI - default: - return fmt.Errorf("wrong type for int64 field: %d", maj) - } - - t.GasLimit = int64(extraI) - } - // t.GasFeeCap (big.Int) (struct) - - { - - if err := t.GasFeeCap.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.GasFeeCap: %w", err) - } - - } - // t.GasPremium (big.Int) (struct) - - { - - if err := t.GasPremium.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.GasPremium: %w", err) - } - - } - // t.Method (abi.MethodNum) (uint64) - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Method = abi.MethodNum(extra) - - } - // t.Params ([]uint8) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.ByteArrayMaxLen { - return fmt.Errorf("t.Params: byte array too large (%d)", extra) - } - if maj != cbg.MajByteString { - return fmt.Errorf("expected byte array") - } - - if extra > 0 { - t.Params = make([]uint8, extra) - } - - if _, err := io.ReadFull(br, t.Params[:]); err != nil { - return err - } - return nil -} - var lengthBufSignedMessage = []byte{130} func (t *SignedMessage) MarshalCBOR(w io.Writer) error { @@ -967,7 +732,7 @@ func (t *SignedMessage) MarshalCBOR(w io.Writer) error { return err } - // t.Message (chain.Message) (struct) + // t.Message (internal.Message) (struct) if err := t.Message.MarshalCBOR(w); err != nil { return err } @@ -997,7 +762,7 @@ func (t *SignedMessage) UnmarshalCBOR(r io.Reader) error { return fmt.Errorf("cbor input had wrong number of fields") } - // t.Message (chain.Message) (struct) + // t.Message (internal.Message) (struct) { @@ -1018,112 +783,6 @@ func (t *SignedMessage) UnmarshalCBOR(r io.Reader) error { return nil } -var lengthBufActor = []byte{132} - -func (t *Actor) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufActor); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.Code (cid.Cid) (struct) - - if err := cbg.WriteCidBuf(scratch, w, t.Code); err != nil { - return xerrors.Errorf("failed to write cid field t.Code: %w", err) - } - - // t.Head (cid.Cid) (struct) - - if err := cbg.WriteCidBuf(scratch, w, t.Head); err != nil { - return xerrors.Errorf("failed to write cid field t.Head: %w", err) - } - - // t.Nonce (uint64) (uint64) - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Nonce)); err != nil { - return err - } - - // t.Balance (big.Int) (struct) - if err := t.Balance.MarshalCBOR(w); err != nil { - return err - } - return nil -} - -func (t *Actor) UnmarshalCBOR(r io.Reader) error { - *t = Actor{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 4 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Code (cid.Cid) (struct) - - { - - c, err := cbg.ReadCid(br) - if err != nil { - return xerrors.Errorf("failed to read cid field t.Code: %w", err) - } - - t.Code = c - - } - // t.Head (cid.Cid) (struct) - - { - - c, err := cbg.ReadCid(br) - if err != nil { - return xerrors.Errorf("failed to read cid field t.Head: %w", err) - } - - t.Head = c - - } - // t.Nonce (uint64) (uint64) - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Nonce = uint64(extra) - - } - // t.Balance (big.Int) (struct) - - { - - if err := t.Balance.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.Balance: %w", err) - } - - } - return nil -} - var lengthBufMessageRoot = []byte{130} func (t *MessageRoot) MarshalCBOR(w io.Writer) error { @@ -1352,7 +1011,7 @@ func (t *BlockMsg) MarshalCBOR(w io.Writer) error { scratch := make([]byte, 9) - // t.Header (chain.BlockHeader) (struct) + // t.Header (types.BlockHeader) (struct) if err := t.Header.MarshalCBOR(w); err != nil { return err } @@ -1405,7 +1064,7 @@ func (t *BlockMsg) UnmarshalCBOR(r io.Reader) error { return fmt.Errorf("cbor input had wrong number of fields") } - // t.Header (chain.BlockHeader) (struct) + // t.Header (types.BlockHeader) (struct) { @@ -1510,7 +1169,7 @@ func (t *ExpTipSet) MarshalCBOR(w io.Writer) error { } } - // t.Blocks ([]*chain.BlockHeader) (slice) + // t.Blocks ([]*types.BlockHeader) (slice) if len(t.Blocks) > cbg.MaxLength { return xerrors.Errorf("Slice value in field t.Blocks was too long") } @@ -1583,7 +1242,7 @@ func (t *ExpTipSet) UnmarshalCBOR(r io.Reader) error { t.Cids[i] = c } - // t.Blocks ([]*chain.BlockHeader) (slice) + // t.Blocks ([]*types.BlockHeader) (slice) maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) if err != nil { @@ -1639,3 +1298,114 @@ func (t *ExpTipSet) UnmarshalCBOR(r io.Reader) error { } return nil } + +var lengthBufPaymentInfo = []byte{131} + +func (t *PaymentInfo) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufPaymentInfo); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Channel (address.Address) (struct) + if err := t.Channel.MarshalCBOR(w); err != nil { + return err + } + + // t.WaitSentinel (cid.Cid) (struct) + + if err := cbg.WriteCidBuf(scratch, w, t.WaitSentinel); err != nil { + return xerrors.Errorf("failed to write cid field t.WaitSentinel: %w", err) + } + + // t.Vouchers ([]*paych.SignedVoucher) (slice) + if len(t.Vouchers) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Vouchers was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Vouchers))); err != nil { + return err + } + for _, v := range t.Vouchers { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + return nil +} + +func (t *PaymentInfo) UnmarshalCBOR(r io.Reader) error { + *t = PaymentInfo{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 3 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Channel (address.Address) (struct) + + { + + if err := t.Channel.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Channel: %w", err) + } + + } + // t.WaitSentinel (cid.Cid) (struct) + + { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.WaitSentinel: %w", err) + } + + t.WaitSentinel = c + + } + // t.Vouchers ([]*paych.SignedVoucher) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Vouchers: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Vouchers = make([]*paych.SignedVoucher, extra) + } + + for i := 0; i < int(extra); i++ { + + var v paych.SignedVoucher + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.Vouchers[i] = &v + } + + return nil +} diff --git a/venus-shared/chain/chain_info.go b/venus-shared/types/chain_info.go similarity index 98% rename from venus-shared/chain/chain_info.go rename to venus-shared/types/chain_info.go index e062c73e09..58c62bb50f 100644 --- a/venus-shared/chain/chain_info.go +++ b/venus-shared/types/chain_info.go @@ -1,4 +1,4 @@ -package chain +package types import ( "fmt" diff --git a/venus-shared/messagepool/checkstatuscode_string.go b/venus-shared/types/checkstatuscode_string.go similarity index 98% rename from venus-shared/messagepool/checkstatuscode_string.go rename to venus-shared/types/checkstatuscode_string.go index bb009d30fd..7cfc3785c9 100644 --- a/venus-shared/messagepool/checkstatuscode_string.go +++ b/venus-shared/types/checkstatuscode_string.go @@ -1,6 +1,6 @@ // Code generated by "stringer -type=CheckStatusCode -trimprefix=CheckStatus"; DO NOT EDIT. -package messagepool +package types import "strconv" diff --git a/venus-shared/chain/complex_provider.go b/venus-shared/types/complex_provider.go similarity index 96% rename from venus-shared/chain/complex_provider.go rename to venus-shared/types/complex_provider.go index 771183aaf9..d82aa1d9e3 100644 --- a/venus-shared/chain/complex_provider.go +++ b/venus-shared/types/complex_provider.go @@ -1,13 +1,14 @@ -package chain +package types import ( + "math" + "testing" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/venus-shared/chain/params" "github.com/filecoin-project/venus/venus-shared/testutil" + "github.com/filecoin-project/venus/venus-shared/types/params" "github.com/ipfs/go-cid" - "math" - "testing" ) func init() { diff --git a/venus-shared/chain/complex_provider_test.go b/venus-shared/types/complex_provider_test.go similarity index 98% rename from venus-shared/chain/complex_provider_test.go rename to venus-shared/types/complex_provider_test.go index 7b645ec2ee..47e06518be 100644 --- a/venus-shared/chain/complex_provider_test.go +++ b/venus-shared/types/complex_provider_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "testing" diff --git a/venus-shared/chain/election_proof.go b/venus-shared/types/election_proof.go similarity index 98% rename from venus-shared/chain/election_proof.go rename to venus-shared/types/election_proof.go index ee8a50c691..c853c6419a 100644 --- a/venus-shared/chain/election_proof.go +++ b/venus-shared/types/election_proof.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/minio/blake2b-simd" - "github.com/filecoin-project/venus/venus-shared/chain/params" + "github.com/filecoin-project/venus/venus-shared/types/params" ) // A Ticket is a marker of a tick of the blockchain's clock. It is the source diff --git a/venus-shared/chain/election_proof_test.go b/venus-shared/types/election_proof_test.go similarity index 97% rename from venus-shared/chain/election_proof_test.go rename to venus-shared/types/election_proof_test.go index ab30cfd0cc..b7920a7b8c 100644 --- a/venus-shared/chain/election_proof_test.go +++ b/venus-shared/types/election_proof_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" @@ -9,8 +9,8 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/venus-shared/chain/params" "github.com/filecoin-project/venus/venus-shared/testutil" + "github.com/filecoin-project/venus/venus-shared/types/params" ) func TestElectionProofBasic(t *testing.T) { diff --git a/venus-shared/stmgr/exec.go b/venus-shared/types/exec.go similarity index 94% rename from venus-shared/stmgr/exec.go rename to venus-shared/types/exec.go index 3d91870851..af1030a08d 100644 --- a/venus-shared/stmgr/exec.go +++ b/venus-shared/types/exec.go @@ -1,4 +1,4 @@ -package stmgr +package types import ( "encoding/json" @@ -7,13 +7,11 @@ import ( "runtime" "strings" "time" - - "github.com/filecoin-project/venus/venus-shared/chain" ) type ExecutionTrace struct { - Msg *chain.Message - MsgRct *chain.MessageReceipt + Msg *Message + MsgRct *MessageReceipt Error string Duration time.Duration GasCharges []*GasTrace diff --git a/venus-shared/chain/full_block.go b/venus-shared/types/full_block.go similarity index 96% rename from venus-shared/chain/full_block.go rename to venus-shared/types/full_block.go index fa0d9f5248..bb68723fa5 100644 --- a/venus-shared/chain/full_block.go +++ b/venus-shared/types/full_block.go @@ -1,4 +1,4 @@ -package chain +package types import ( "github.com/ipfs/go-cid" diff --git a/venus-shared/chain/full_tipset.go b/venus-shared/types/full_tipset.go similarity index 99% rename from venus-shared/chain/full_tipset.go rename to venus-shared/types/full_tipset.go index ab43a1aa7c..9c031b3861 100644 --- a/venus-shared/chain/full_tipset.go +++ b/venus-shared/types/full_tipset.go @@ -1,4 +1,4 @@ -package chain +package types import ( "github.com/ipfs/go-cid" diff --git a/venus-shared/wallet/key_info.go b/venus-shared/types/key_info.go similarity index 99% rename from venus-shared/wallet/key_info.go rename to venus-shared/types/key_info.go index 0945210227..66cb10a89f 100644 --- a/venus-shared/wallet/key_info.go +++ b/venus-shared/types/key_info.go @@ -1,4 +1,4 @@ -package wallet +package types import ( "encoding/json" diff --git a/venus-shared/types/message.go b/venus-shared/types/message.go new file mode 100644 index 0000000000..cff0bc80ca --- /dev/null +++ b/venus-shared/types/message.go @@ -0,0 +1,206 @@ +package types + +import ( + "github.com/filecoin-project/venus/venus-shared/internal" +) + +const MessageVersion = 0 + +type ChainMsg = internal.ChainMsg + +//type ChainMsg interface { +// Cid() cid.Cid +// VMMessage() *Message +// ToStorageBlock() (blocks.Block, error) +// // FIXME: This is the *message* length, this name is misleading. +// ChainLength() int +// cbor.Marshaler +// cbor.Unmarshaler +//} +var DecodeMessage = internal.DecodeMessage + +//func DecodeMessage(b []byte) (*Message, error) { +// var msg Message +// if err := msg.UnmarshalCBOR(bytes.NewReader(b)); err != nil { +// return nil, err +// } +// +// if msg.Version != MessageVersion { +// return nil, fmt.Errorf("decoded message had incorrect version (%d)", msg.Version) +// } +// +// return &msg, nil +//} + +type Message = internal.Message + +//type Message struct { +// Version uint64 +// +// To address.Address +// From address.Address +// // When receiving a message from a user account the nonce in +// // the message must match the expected nonce in the from actor. +// // This prevents replay attacks. +// Nonce uint64 +// +// Value abi.TokenAmount +// +// GasLimit int64 +// GasFeeCap abi.TokenAmount +// GasPremium abi.TokenAmount +// +// Method abi.MethodNum +// Params []byte +//} + +//func (m *Message) Serialize() ([]byte, error) { +// buf := new(bytes.Buffer) +// if err := m.MarshalCBOR(buf); err != nil { +// return nil, err +// } +// +// return buf.Bytes(), nil +//} +// +//func (m *Message) SerializeWithCid() (cid.Cid, []byte, error) { +// data, err := m.Serialize() +// if err != nil { +// return cid.Undef, nil, err +// } +// +// c, err := abi.CidBuilder.Sum(data) +// if err != nil { +// return cid.Undef, nil, err +// } +// +// return c, data, nil +//} +// +//func (m *Message) ToStorageBlock() (blocks.Block, error) { +// c, data, err := m.SerializeWithCid() +// if err != nil { +// return nil, err +// } +// +// return blocks.NewBlockWithCid(data, c) +//} +// +//func (m *Message) Cid() cid.Cid { +// c, _, err := m.SerializeWithCid() +// if err != nil { +// panic(err) +// } +// +// return c +//} +// +//func (m *Message) String() string { +// errStr := "(error encoding Message)" +// c, _, err := m.SerializeWithCid() +// if err != nil { +// return errStr +// } +// +// js, err := json.MarshalIndent(m, "", " ") +// if err != nil { +// return errStr +// } +// +// return fmt.Sprintf("Message cid=[%v]: %s", c, string(js)) +//} +// +//func (m *Message) ChainLength() int { +// ser, err := m.Serialize() +// if err != nil { +// panic(err) +// } +// +// return len(ser) +//} +// +//func (m *Message) Equals(o *Message) bool { +// return m.Cid() == o.Cid() +//} +// +//func (m *Message) EqualCall(o *Message) bool { +// m1 := *m +// m2 := *o +// +// m1.GasLimit, m2.GasLimit = 0, 0 +// m1.GasFeeCap, m2.GasFeeCap = bigZero, bigZero +// m1.GasPremium, m2.GasPremium = bigZero, bigZero +// +// return (&m1).Equals(&m2) +//} +// +//func (m *Message) ValidForBlockInclusion(minGas int64, version network.Version) error { +// if m.Version != 0 { +// return fmt.Errorf("'Version' unsupported") +// } +// +// if m.To == address.Undef { +// return fmt.Errorf("'To' address cannot be empty") +// } +// +// if m.To == ZeroAddress && version >= network.Version7 { +// return fmt.Errorf("invalid 'To' address") +// } +// +// if m.From == address.Undef { +// return fmt.Errorf("'From' address cannot be empty") +// } +// +// if m.Value.Int == nil { +// return fmt.Errorf("'Value' cannot be nil") +// } +// +// if m.Value.LessThan(bigZero) { +// return fmt.Errorf("'Value' field cannot be negative") +// } +// +// if m.Value.GreaterThan(TotalFilecoinInt) { +// return fmt.Errorf("'Value' field cannot be greater than total filecoin supply") +// } +// +// if m.GasFeeCap.Int == nil { +// return fmt.Errorf("'GasFeeCap' cannot be nil") +// } +// +// if m.GasFeeCap.LessThan(bigZero) { +// return fmt.Errorf("'GasFeeCap' field cannot be negative") +// } +// +// if m.GasPremium.Int == nil { +// return fmt.Errorf("'GasPremium' cannot be nil") +// } +// +// if m.GasPremium.LessThan(bigZero) { +// return fmt.Errorf("'GasPremium' field cannot be negative") +// } +// +// if m.GasPremium.GreaterThan(m.GasFeeCap) { +// return fmt.Errorf("'GasFeeCap' less than 'GasPremium'") +// } +// +// if m.GasLimit > params.BlockGasLimit { +// return fmt.Errorf("'GasLimit' field cannot be greater than a block's gas limit") +// } +// +// // since prices might vary with time, this is technically semantic validation +// if m.GasLimit < minGas { +// return fmt.Errorf("'GasLimit' field cannot be less than the cost of storing a message on chain %d < %d", m.GasLimit, minGas) +// } +// +// return nil +//} +// +//func (m *Message) VMMessage() *Message { +// return m +//} +// +//func (m *Message) RequiredFunds() abi.TokenAmount { +// return abi.TokenAmount{Int: BigMul(BigInt{Int: m.GasFeeCap.Int}, NewInt(uint64(m.GasLimit))).Int} +//} + +var _ ChainMsg = (*Message)(nil) diff --git a/venus-shared/types/message_marshal.go b/venus-shared/types/message_marshal.go new file mode 100644 index 0000000000..daf9a4d8ab --- /dev/null +++ b/venus-shared/types/message_marshal.go @@ -0,0 +1,19 @@ +package types + +import ( + "github.com/filecoin-project/venus/venus-shared/internal" +) + +type RawMessage = internal.Message + +//type mCid struct { +// CID cid.Cid +// *RawMessage +//} + +//func (m *Message) MarshalJSON() ([]byte, error) { +// return json.Marshal(&mCid{ +// RawMessage: (*RawMessage)(m), +// CID: m.Cid(), +// }) +//} diff --git a/venus-shared/chain/message_receipt.go b/venus-shared/types/message_receipt.go similarity index 97% rename from venus-shared/chain/message_receipt.go rename to venus-shared/types/message_receipt.go index 3d7f9a5982..8140272037 100644 --- a/venus-shared/chain/message_receipt.go +++ b/venus-shared/types/message_receipt.go @@ -1,4 +1,4 @@ -package chain +package types import ( "encoding/json" diff --git a/venus-shared/chain/message_receipt_test.go b/venus-shared/types/message_receipt_test.go similarity index 99% rename from venus-shared/chain/message_receipt_test.go rename to venus-shared/types/message_receipt_test.go index da9c223edb..546a29fe74 100644 --- a/venus-shared/chain/message_receipt_test.go +++ b/venus-shared/types/message_receipt_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" diff --git a/venus-shared/chain/message_root.go b/venus-shared/types/message_root.go similarity index 98% rename from venus-shared/chain/message_root.go rename to venus-shared/types/message_root.go index 39a0c30982..9211f1f9db 100644 --- a/venus-shared/chain/message_root.go +++ b/venus-shared/types/message_root.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" diff --git a/venus-shared/chain/message_root_test.go b/venus-shared/types/message_root_test.go similarity index 98% rename from venus-shared/chain/message_root_test.go rename to venus-shared/types/message_root_test.go index 3b5fb06527..a5de123ed2 100644 --- a/venus-shared/chain/message_root_test.go +++ b/venus-shared/types/message_root_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" diff --git a/venus-shared/chain/message_test.go b/venus-shared/types/message_test.go similarity index 98% rename from venus-shared/chain/message_test.go rename to venus-shared/types/message_test.go index 94349972fd..4eab547106 100644 --- a/venus-shared/chain/message_test.go +++ b/venus-shared/types/message_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" @@ -8,8 +8,8 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/network" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/venus-shared/chain/params" "github.com/filecoin-project/venus/venus-shared/testutil" + "github.com/filecoin-project/venus/venus-shared/types/params" blocks "github.com/ipfs/go-block-format" "github.com/stretchr/testify/require" ) diff --git a/venus-shared/messagepool/mpool.go b/venus-shared/types/mpool.go similarity index 87% rename from venus-shared/messagepool/mpool.go rename to venus-shared/types/mpool.go index c34958e666..1f071d84d8 100644 --- a/venus-shared/messagepool/mpool.go +++ b/venus-shared/types/mpool.go @@ -1,7 +1,6 @@ -package messagepool +package types import ( - "github.com/filecoin-project/venus/venus-shared/chain" "github.com/ipfs/go-cid" ) @@ -38,7 +37,7 @@ type MessageCheckStatus struct { } type MessagePrototype struct { - Message chain.Message + Message Message ValidNonce bool } @@ -51,5 +50,5 @@ const ( type MpoolUpdate struct { Type MpoolChange - Message *chain.SignedMessage + Message *SignedMessage } diff --git a/venus-shared/messagepool/config.go b/venus-shared/types/mpool_config.go similarity index 93% rename from venus-shared/messagepool/config.go rename to venus-shared/types/mpool_config.go index 8061b17ab9..b48112b847 100644 --- a/venus-shared/messagepool/config.go +++ b/venus-shared/types/mpool_config.go @@ -1,4 +1,4 @@ -package messagepool +package types import ( "time" diff --git a/venus-shared/wallet/msg_meta.go b/venus-shared/types/msg_meta.go similarity index 98% rename from venus-shared/wallet/msg_meta.go rename to venus-shared/types/msg_meta.go index 82a1bc8072..ee0193b489 100644 --- a/venus-shared/wallet/msg_meta.go +++ b/venus-shared/types/msg_meta.go @@ -1,4 +1,4 @@ -package wallet +package types type MsgType string diff --git a/venus-shared/libp2p/net/net.go b/venus-shared/types/net.go similarity index 98% rename from venus-shared/libp2p/net/net.go rename to venus-shared/types/net.go index 92d0adbec5..fef60fd6bb 100644 --- a/venus-shared/libp2p/net/net.go +++ b/venus-shared/types/net.go @@ -1,4 +1,4 @@ -package net +package types import "github.com/libp2p/go-libp2p-core/peer" diff --git a/venus-shared/chain/param.go b/venus-shared/types/param.go similarity index 81% rename from venus-shared/chain/param.go rename to venus-shared/types/param.go index 9a8e7f78f7..16ba4818aa 100644 --- a/venus-shared/chain/param.go +++ b/venus-shared/types/param.go @@ -1,19 +1,18 @@ -package chain +package types import ( "math/big" "github.com/filecoin-project/go-state-types/abi" - big2 "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" mh "github.com/multiformats/go-multihash" - "github.com/filecoin-project/venus/venus-shared/chain/params" + "github.com/filecoin-project/venus/venus-shared/types/params" ) var ( - bigZero = big2.Zero() + //bigZero = big2.Zero() blocksPerEpochBig = big.NewInt(0).SetUint64(params.BlocksPerEpoch) ) diff --git a/venus-shared/chain/params/chain.go b/venus-shared/types/params/chain.go similarity index 100% rename from venus-shared/chain/params/chain.go rename to venus-shared/types/params/chain.go diff --git a/venus-shared/chain/params/circulating.go b/venus-shared/types/params/circulating.go similarity index 100% rename from venus-shared/chain/params/circulating.go rename to venus-shared/types/params/circulating.go diff --git a/venus-shared/paych/paych.go b/venus-shared/types/paych.go similarity index 90% rename from venus-shared/paych/paych.go rename to venus-shared/types/paych.go index be966aeace..ac4b5a082f 100644 --- a/venus-shared/paych/paych.go +++ b/venus-shared/types/paych.go @@ -1,4 +1,4 @@ -package paych +package types import ( "github.com/filecoin-project/go-address" @@ -6,7 +6,6 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" - "github.com/filecoin-project/venus/venus-shared/chain" ) type SignedVoucher = paych.SignedVoucher @@ -36,7 +35,7 @@ type PaymentInfo struct { } type VoucherSpec struct { - Amount chain.BigInt + Amount BigInt TimeLockMin abi.ChainEpoch TimeLockMax abi.ChainEpoch MinSettle abi.ChainEpoch @@ -51,5 +50,5 @@ type VoucherCreateResult struct { Voucher *paych.SignedVoucher // Shortfall is the additional amount that would be needed in the channel // in order to be able to create the voucher - Shortfall chain.BigInt + Shortfall BigInt } diff --git a/venus-shared/chain/shared_func.go b/venus-shared/types/shared_func.go similarity index 97% rename from venus-shared/chain/shared_func.go rename to venus-shared/types/shared_func.go index 23d357e619..4745436b59 100644 --- a/venus-shared/chain/shared_func.go +++ b/venus-shared/types/shared_func.go @@ -1,4 +1,4 @@ -package chain +package types import ( "github.com/filecoin-project/go-address" diff --git a/venus-shared/chain/signed_message.go b/venus-shared/types/signed_message.go similarity index 99% rename from venus-shared/chain/signed_message.go rename to venus-shared/types/signed_message.go index c4e79e576f..f1797fe9e1 100644 --- a/venus-shared/chain/signed_message.go +++ b/venus-shared/types/signed_message.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" diff --git a/venus-shared/chain/signed_message_marshal.go b/venus-shared/types/signed_message_marshal.go similarity index 95% rename from venus-shared/chain/signed_message_marshal.go rename to venus-shared/types/signed_message_marshal.go index 059b1d03bb..8d14d6ede3 100644 --- a/venus-shared/chain/signed_message_marshal.go +++ b/venus-shared/types/signed_message_marshal.go @@ -1,4 +1,4 @@ -package chain +package types import ( "encoding/json" diff --git a/venus-shared/chain/signed_message_test.go b/venus-shared/types/signed_message_test.go similarity index 99% rename from venus-shared/chain/signed_message_test.go rename to venus-shared/types/signed_message_test.go index 49efb85e09..18995bb3dd 100644 --- a/venus-shared/chain/signed_message_test.go +++ b/venus-shared/types/signed_message_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" diff --git a/venus-shared/chain/signer.go b/venus-shared/types/signer.go similarity index 96% rename from venus-shared/chain/signer.go rename to venus-shared/types/signer.go index f50ad85457..4b7aeaf1e0 100644 --- a/venus-shared/chain/signer.go +++ b/venus-shared/types/signer.go @@ -1,4 +1,4 @@ -package chain +package types import ( "context" diff --git a/venus-shared/chain/supply.go b/venus-shared/types/supply.go similarity index 95% rename from venus-shared/chain/supply.go rename to venus-shared/types/supply.go index 32fd2c8cc6..8a43a9375d 100644 --- a/venus-shared/chain/supply.go +++ b/venus-shared/types/supply.go @@ -1,4 +1,4 @@ -package chain +package types import "github.com/filecoin-project/go-state-types/abi" diff --git a/venus-shared/chain/tipset.go b/venus-shared/types/tipset.go similarity index 99% rename from venus-shared/chain/tipset.go rename to venus-shared/types/tipset.go index f186337c8b..43e0a29cf0 100644 --- a/venus-shared/chain/tipset.go +++ b/venus-shared/types/tipset.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" diff --git a/venus-shared/chain/tipset_exp_tipset_test.go b/venus-shared/types/tipset_exp_tipset_test.go similarity index 98% rename from venus-shared/chain/tipset_exp_tipset_test.go rename to venus-shared/types/tipset_exp_tipset_test.go index ebd4096db7..ccc60e179e 100644 --- a/venus-shared/chain/tipset_exp_tipset_test.go +++ b/venus-shared/types/tipset_exp_tipset_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" diff --git a/venus-shared/chain/tipset_key.go b/venus-shared/types/tipset_key.go similarity index 99% rename from venus-shared/chain/tipset_key.go rename to venus-shared/types/tipset_key.go index 70838aa215..a4da72c09d 100644 --- a/venus-shared/chain/tipset_key.go +++ b/venus-shared/types/tipset_key.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" diff --git a/venus-shared/chain/tipset_key_test.go b/venus-shared/types/tipset_key_test.go similarity index 98% rename from venus-shared/chain/tipset_key_test.go rename to venus-shared/types/tipset_key_test.go index 00a8a3377d..c062d8130c 100644 --- a/venus-shared/chain/tipset_key_test.go +++ b/venus-shared/types/tipset_key_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "testing" diff --git a/venus-shared/chain/tipset_marshal.go b/venus-shared/types/tipset_marshal.go similarity index 98% rename from venus-shared/chain/tipset_marshal.go rename to venus-shared/types/tipset_marshal.go index 5d1c6bf965..a6d178fc57 100644 --- a/venus-shared/chain/tipset_marshal.go +++ b/venus-shared/types/tipset_marshal.go @@ -1,4 +1,4 @@ -package chain +package types import ( "encoding/json" diff --git a/venus-shared/chain/tipset_marshal_test.go b/venus-shared/types/tipset_marshal_test.go similarity index 99% rename from venus-shared/chain/tipset_marshal_test.go rename to venus-shared/types/tipset_marshal_test.go index 71d5545ddb..5aca1b218b 100644 --- a/venus-shared/chain/tipset_marshal_test.go +++ b/venus-shared/types/tipset_marshal_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "bytes" diff --git a/venus-shared/chain/tipset_test.go b/venus-shared/types/tipset_test.go similarity index 99% rename from venus-shared/chain/tipset_test.go rename to venus-shared/types/tipset_test.go index 1231a1a9f3..21497a90d4 100644 --- a/venus-shared/chain/tipset_test.go +++ b/venus-shared/types/tipset_test.go @@ -1,4 +1,4 @@ -package chain +package types import ( "testing" diff --git a/venus-shared/api/chain/types.go b/venus-shared/types/types.go similarity index 83% rename from venus-shared/api/chain/types.go rename to venus-shared/types/types.go index e41006e500..d64ef8c938 100644 --- a/venus-shared/api/chain/types.go +++ b/venus-shared/types/types.go @@ -1,4 +1,4 @@ -package chain +package types import ( "fmt" @@ -14,8 +14,6 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" "github.com/filecoin-project/venus/venus-shared/api" - "github.com/filecoin-project/venus/venus-shared/chain" - "github.com/filecoin-project/venus/venus-shared/stmgr" ) type ObjStat struct { @@ -25,28 +23,28 @@ type ObjStat struct { type HeadChange struct { Type string - Val *chain.TipSet + Val *TipSet } // ChainMessage is an on-chain message with its block and receipt. type ChainMessage struct { //nolint - TS *chain.TipSet - Message *chain.Message - Block *chain.BlockHeader - Receipt *chain.MessageReceipt + TS *TipSet + Message *Message + Block *BlockHeader + Receipt *MessageReceipt } // BlsMessages[x].cid = Cids[x] // SecpkMessages[y].cid = Cids[BlsMessages.length + y] type BlockMessages struct { - BlsMessages []*chain.Message - SecpkMessages []*chain.SignedMessage + BlsMessages []*Message + SecpkMessages []*SignedMessage Cids []cid.Cid } -type Message struct { +type MessageCID struct { Cid cid.Cid - Message *chain.Message + Message *Message } type NetworkName string @@ -110,9 +108,9 @@ type DealCollateralBounds struct { type MsgLookup struct { Message cid.Cid // Can be different than requested, in case it was replaced, but only gas values changed - Receipt chain.MessageReceipt + Receipt MessageReceipt ReturnDec interface{} - TipSet chain.TipSetKey + TipSet TipSetKey Height abi.ChainEpoch } @@ -122,30 +120,30 @@ type MiningBaseInfo struct { //nolint Sectors []builtin.SectorInfo WorkerKey address.Address SectorSize abi.SectorSize - PrevBeaconEntry chain.BeaconEntry - BeaconEntries []chain.BeaconEntry + PrevBeaconEntry BeaconEntry + BeaconEntries []BeaconEntry EligibleForMining bool } type BlockTemplate struct { Miner address.Address - Parents chain.TipSetKey - Ticket *chain.Ticket - Eproof *chain.ElectionProof - BeaconValues []chain.BeaconEntry - Messages []*chain.SignedMessage + Parents TipSetKey + Ticket *Ticket + Eproof *ElectionProof + BeaconValues []BeaconEntry + Messages []*SignedMessage Epoch abi.ChainEpoch Timestamp uint64 WinningPoStProof []builtin.PoStProof } type EstimateMessage struct { - Msg *chain.Message + Msg *Message Spec *MessageSendSpec } type EstimateResult struct { - Msg *chain.Message + Msg *Message Err string } @@ -173,17 +171,17 @@ type ChannelAvailableFunds struct { To address.Address // ConfirmedAmt is the amount of funds that have been confirmed on-chain // for the channel - ConfirmedAmt chain.BigInt + ConfirmedAmt BigInt // PendingAmt is the amount of funds that are pending confirmation on-chain - PendingAmt chain.BigInt + PendingAmt BigInt // PendingWaitSentinel can be used with PaychGetWaitReady to wait for // confirmation of pending funds PendingWaitSentinel *cid.Cid // QueuedAmt is the amount that is queued up behind a pending request - QueuedAmt chain.BigInt + QueuedAmt BigInt // VoucherRedeemedAmt is the amount that is redeemed by vouchers on-chain // and in the local datastore - VoucherReedeemedAmt chain.BigInt + VoucherReedeemedAmt BigInt } type SyncState struct { @@ -226,8 +224,8 @@ func (v SyncStateStage) String() string { type ActiveSync struct { WorkerID uint64 - Base *chain.TipSet - Target *chain.TipSet + Base *TipSet + Target *TipSet Stage SyncStateStage Height abi.ChainEpoch @@ -240,12 +238,12 @@ type ActiveSync struct { // sync type Target struct { State SyncStateStage - Base *chain.TipSet - Current *chain.TipSet + Base *TipSet + Current *TipSet Start time.Time End time.Time Err error - chain.ChainInfo + ChainInfo } type TargetTracker struct { @@ -266,10 +264,10 @@ type MsgGasCost struct { type InvocResult struct { MsgCid cid.Cid - Msg *chain.Message - MsgRct *chain.MessageReceipt + Msg *Message + MsgRct *MessageReceipt GasCost MsgGasCost - ExecutionTrace stmgr.ExecutionTrace + ExecutionTrace ExecutionTrace Error string Duration time.Duration } From c2bed02a513ec457654ff138053215b8a4d73c1a Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Thu, 6 Jan 2022 14:40:18 +0800 Subject: [PATCH 102/167] Feat/simplify storage interface (#4676) * to simplify storage interface * add method: TipSetKeyFromBytes --- go.mod | 2 +- go.sum | 4 +- pkg/util/ffiwrapper/impl/sealer_cgo.go | 327 ++++------------------ pkg/util/ffiwrapper/impl/types.go | 14 +- pkg/util/ffiwrapper/impl/unseal_ranges.go | 1 + pkg/util/storiface/filetype.go | 91 +++++- venus-shared/types/msg_meta.go | 2 + venus-shared/types/tipset_key.go | 9 + 8 files changed, 157 insertions(+), 293 deletions(-) diff --git a/go.mod b/go.mod index ac8d08121e..ceeef6bb22 100644 --- a/go.mod +++ b/go.mod @@ -40,7 +40,7 @@ require ( github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec - github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 + github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578 github.com/gbrlsnchs/jwt/v3 v3.0.0 diff --git a/go.sum b/go.sum index 4c3327a8d5..302db32f34 100644 --- a/go.sum +++ b/go.sum @@ -372,8 +372,8 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVi github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= -github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff h1:JO62nquOGhjoDf9+JkAcV+wsD5yhoyIKOMj70ZNdD3Q= +github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578 h1:RpiHYKzuEnWoPhp2HO7sVC8QY78TZIpO4dhbp0g/g+A= diff --git a/pkg/util/ffiwrapper/impl/sealer_cgo.go b/pkg/util/ffiwrapper/impl/sealer_cgo.go index beb572a7ac..edca94d8f5 100644 --- a/pkg/util/ffiwrapper/impl/sealer_cgo.go +++ b/pkg/util/ffiwrapper/impl/sealer_cgo.go @@ -3,21 +3,24 @@ package impl import ( - "bufio" "bytes" "context" + "crypto/rand" + "encoding/base64" + "encoding/json" "io" "math/bits" "os" "runtime" + "github.com/filecoin-project/go-commp-utils/zerocomm" + "github.com/ipfs/go-cid" "golang.org/x/xerrors" ffi "github.com/filecoin-project/filecoin-ffi" rlepluslazy "github.com/filecoin-project/go-bitfield/rle" commpffi "github.com/filecoin-project/go-commp-utils/ffiwrapper" - "github.com/filecoin-project/go-commp-utils/zerocomm" commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/specs-storage/storage" @@ -235,228 +238,6 @@ func (sb *Sealer) pieceCid(spt abi.RegisteredSealProof, in []byte) (cid.Cid, err return pieceCID, werr() } -func (sb *Sealer) UnsealPiece(ctx context.Context, sector storage.SectorRef, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, randomness abi.SealRandomness, commd cid.Cid) error { - ssize, err := sector.ProofType.SectorSize() - if err != nil { - return err - } - maxPieceSize := abi.PaddedPieceSize(ssize) - - // try finding existing - unsealedPath, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTUnsealed, storiface.FTNone, storiface.PathStorage) - var pf *partialFile - - switch { - case xerrors.Is(err, storiface.ErrSectorNotFound): - unsealedPath, done, err = sb.sectors.AcquireSector(ctx, sector, storiface.FTNone, storiface.FTUnsealed, storiface.PathStorage) - if err != nil { - return xerrors.Errorf("acquire unsealed sector path (allocate): %w", err) - } - defer done() - - pf, err = createPartialFile(maxPieceSize, unsealedPath.Unsealed) - if err != nil { - return xerrors.Errorf("create unsealed file: %w", err) - } - - case err == nil: - defer done() - - pf, err = openPartialFile(maxPieceSize, unsealedPath.Unsealed) - if err != nil { - return xerrors.Errorf("opening partial file: %w", err) - } - default: - return xerrors.Errorf("acquire unsealed sector path (existing): %w", err) - } - defer pf.Close() // nolint - - allocated, err := pf.Allocated() - if err != nil { - return xerrors.Errorf("getting bitruns of allocated data: %w", err) - } - - toUnseal, err := computeUnsealRanges(allocated, offset, size) - if err != nil { - return xerrors.Errorf("computing unseal ranges: %w", err) - } - - if !toUnseal.HasNext() { - return nil - } - - srcPaths, srcDone, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTCache|storiface.FTSealed, storiface.FTNone, storiface.PathStorage) - if err != nil { - return xerrors.Errorf("acquire sealed sector paths: %w", err) - } - defer srcDone() - - sealed, err := os.OpenFile(srcPaths.Sealed, os.O_RDONLY, 0644) // nolint:gosec - if err != nil { - return xerrors.Errorf("opening sealed file: %w", err) - } - defer sealed.Close() // nolint - - var at, nextat abi.PaddedPieceSize - first := true - for first || toUnseal.HasNext() { - first = false - - piece, err := toUnseal.NextRun() - if err != nil { - return xerrors.Errorf("getting next range to unseal: %w", err) - } - - at = nextat - nextat += abi.PaddedPieceSize(piece.Len) - - if !piece.Val { - continue - } - - out, err := pf.Writer(offset.Padded(), size.Padded()) - if err != nil { - return xerrors.Errorf("getting partial file writer: %w", err) - } - - // - opr, opw, err := os.Pipe() - if err != nil { - return xerrors.Errorf("creating out pipe: %w", err) - } - - var perr error - outWait := make(chan struct{}) - - { - go func() { - defer close(outWait) - defer opr.Close() // nolint - - padwriter := fr32.NewPadWriter(out) - - bsize := uint64(size.Padded()) - if bsize > uint64(runtime.NumCPU())*fr32.MTTresh { - bsize = uint64(runtime.NumCPU()) * fr32.MTTresh - } - - bw := bufio.NewWriterSize(padwriter, int(abi.PaddedPieceSize(bsize).Unpadded())) - - _, err := io.CopyN(bw, opr, int64(size)) - if err != nil { - perr = xerrors.Errorf("copying data: %w", err) - return - } - - if err := bw.Flush(); err != nil { - perr = xerrors.Errorf("flushing unpadded data: %w", err) - return - } - - if err := padwriter.Close(); err != nil { - perr = xerrors.Errorf("closing padwriter: %w", err) - return - } - }() - } - // - - // TODO: This may be possible to do in parallel - err = ffi.UnsealRange(sector.ProofType, - srcPaths.Cache, - sealed, - opw, - sector.ID.Number, - sector.ID.Miner, - randomness, - commd, - uint64(at.Unpadded()), - uint64(abi.PaddedPieceSize(piece.Len).Unpadded())) - - _ = opw.Close() - - if err != nil { - return xerrors.Errorf("unseal range: %w", err) - } - - select { - case <-outWait: - case <-ctx.Done(): - return ctx.Err() - } - - if perr != nil { - return xerrors.Errorf("piping output to unsealed file: %w", perr) - } - - if err := pf.MarkAllocated(storiface.PaddedByteIndex(at), abi.PaddedPieceSize(piece.Len)); err != nil { - return xerrors.Errorf("marking unsealed range as allocated: %w", err) - } - - if !toUnseal.HasNext() { - break - } - } - - return nil -} - -func (sb *Sealer) ReadPiece(ctx context.Context, writer io.Writer, sector storage.SectorRef, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize) (bool, error) { - path, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTUnsealed, storiface.FTNone, storiface.PathStorage) - if err != nil { - return false, xerrors.Errorf("acquire unsealed sector path: %w", err) - } - defer done() - - ssize, err := sector.ProofType.SectorSize() - if err != nil { - return false, err - } - maxPieceSize := abi.PaddedPieceSize(ssize) - - pf, err := openPartialFile(maxPieceSize, path.Unsealed) - if err != nil { - if xerrors.Is(err, os.ErrNotExist) { - return false, nil - } - - return false, xerrors.Errorf("opening partial file: %w", err) - } - - ok, err := pf.HasAllocated(offset, size) - if err != nil { - _ = pf.Close() - return false, err - } - - if !ok { - _ = pf.Close() - return false, nil - } - - f, err := pf.Reader(offset.Padded(), size.Padded()) - if err != nil { - _ = pf.Close() - return false, xerrors.Errorf("getting partial file reader: %w", err) - } - - upr, err := fr32.NewUnpadReader(f, size.Padded()) - if err != nil { - return false, xerrors.Errorf("creating unpadded reader: %w", err) - } - - if _, err := io.CopyN(writer, upr, int64(size)); err != nil { - _ = pf.Close() - return false, xerrors.Errorf("reading unsealed file: %w", err) - } - - if err := pf.Close(); err != nil { - return false, xerrors.Errorf("closing partial file: %w", err) - } - - return true, nil -} - func (sb *Sealer) SealPreCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, pieces []abi.PieceInfo) (out storage.PreCommit1Out, err error) { paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTUnsealed, storiface.FTSealed|storiface.FTCache, storiface.PathSealing) if err != nil { @@ -515,9 +296,18 @@ func (sb *Sealer) SealPreCommit1(ctx context.Context, sector storage.SectorRef, if err != nil { return nil, xerrors.Errorf("presealing sector %d (%s): %w", sector.ID.Number, paths.Unsealed, err) } - return p1o, nil + p1odec := map[string]interface{}{} + if err := json.Unmarshal(p1o, &p1odec); err != nil { + return nil, xerrors.Errorf("unmarshaling pc1 output: %w", err) + } + + p1odec["_lotus_SealRandomness"] = ticket + + return json.Marshal(&p1odec) } +var PC2CheckRounds = 3 + func (sb *Sealer) SealPreCommit2(ctx context.Context, sector storage.SectorRef, phase1Out storage.PreCommit1Out) (storage.SectorCids, error) { paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTSealed|storiface.FTCache, 0, storiface.PathSealing) if err != nil { @@ -530,41 +320,54 @@ func (sb *Sealer) SealPreCommit2(ctx context.Context, sector storage.SectorRef, return storage.SectorCids{}, xerrors.Errorf("presealing sector %d (%s): %w", sector.ID.Number, paths.Unsealed, err) } - return storage.SectorCids{ - Unsealed: unsealedCID, - Sealed: sealedCID, - }, nil -} - -func (sb *Sealer) SealCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, seed abi.InteractiveSealRandomness, pieces []abi.PieceInfo, cids storage.SectorCids) (storage.Commit1Out, error) { - paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTSealed|storiface.FTCache, 0, storiface.PathSealing) + ssize, err := sector.ProofType.SectorSize() if err != nil { - return nil, xerrors.Errorf("acquire sector paths: %w", err) + return storage.SectorCids{}, xerrors.Errorf("get ssize: %w", err) } - defer done() - output, err := ffi.SealCommitPhase1( - sector.ProofType, - cids.Sealed, - cids.Unsealed, - paths.Cache, - paths.Sealed, - sector.ID.Number, - sector.ID.Miner, - ticket, - seed, - pieces, - ) - if err != nil { - log.Warn("StandaloneSealCommit error: ", err) - log.Warnf("num:%d tkt:%v seed:%v, pi:%v sealedCID:%v, unsealedCID:%v", sector.ID.Number, ticket, seed, pieces, cids.Sealed, cids.Unsealed) - return nil, xerrors.Errorf("StandaloneSealCommit: %w", err) + p1odec := map[string]interface{}{} + if err := json.Unmarshal(phase1Out, &p1odec); err != nil { + return storage.SectorCids{}, xerrors.Errorf("unmarshaling pc1 output: %w", err) } - return output, nil -} -func (sb *Sealer) SealCommit2(ctx context.Context, sector storage.SectorRef, phase1Out storage.Commit1Out) (storage.Proof, error) { - return ffi.SealCommitPhase2(phase1Out, sector.ID.Number, sector.ID.Miner) + var ticket abi.SealRandomness + ti, found := p1odec["_lotus_SealRandomness"] + + if found { + ticket, err = base64.StdEncoding.DecodeString(ti.(string)) + if err != nil { + return storage.SectorCids{}, xerrors.Errorf("decoding ticket: %w", err) + } + + for i := 0; i < PC2CheckRounds; i++ { + var sd [32]byte + _, _ = rand.Read(sd[:]) + + _, err := ffi.SealCommitPhase1( + sector.ProofType, + sealedCID, + unsealedCID, + paths.Cache, + paths.Sealed, + sector.ID.Number, + sector.ID.Miner, + ticket, + sd[:], + []abi.PieceInfo{{Size: abi.PaddedPieceSize(ssize), PieceCID: unsealedCID}}, + ) + if err != nil { + log.Warn("checking PreCommit failed: ", err) + log.Warnf("num:%d tkt:%v seed:%v sealedCID:%v, unsealedCID:%v", sector.ID.Number, ticket, sd[:], sealedCID, unsealedCID) + + return storage.SectorCids{}, xerrors.Errorf("checking PreCommit failed: %w", err) + } + } + } + + return storage.SectorCids{ + Unsealed: unsealedCID, + Sealed: sealedCID, + }, nil } func (sb *Sealer) FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) error { @@ -641,20 +444,6 @@ func (sb *Sealer) FinalizeSector(ctx context.Context, sector storage.SectorRef, return ffi.ClearCache(uint64(ssize), paths.Cache) } -func (sb *Sealer) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, safeToFree []storage.Range) error { - // This call is meant to mark storage as 'freeable'. Given that unsealing is - // very expensive, we don't remove data as soon as we can - instead we only - // do that when we don't have free space for data that really needs it - - // This function should not be called at this layer, everything should be - // handled in localworker - return xerrors.Errorf("not supported at this layer") -} - -func (sb *Sealer) Remove(ctx context.Context, sector storage.SectorRef) error { - return xerrors.Errorf("not supported at this layer") // happens in localworker -} - func GetRequiredPadding(oldLength abi.PaddedPieceSize, newPieceLength abi.PaddedPieceSize) ([]abi.PaddedPieceSize, abi.PaddedPieceSize) { padPieces := make([]abi.PaddedPieceSize, 0) diff --git a/pkg/util/ffiwrapper/impl/types.go b/pkg/util/ffiwrapper/impl/types.go index 4a93a5312e..454d9d7506 100644 --- a/pkg/util/ffiwrapper/impl/types.go +++ b/pkg/util/ffiwrapper/impl/types.go @@ -2,27 +2,19 @@ package impl import ( "context" - "io" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/specs-storage/storage" - "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/pkg/util/ffiwrapper/basicfs" "github.com/filecoin-project/venus/pkg/util/storiface" ) -type StorageSealer interface { - storage.Sealer - storage.Storage -} - type Storage interface { - storage.Prover - StorageSealer + SealPreCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, pieces []abi.PieceInfo) (storage.PreCommit1Out, error) + SealPreCommit2(ctx context.Context, sector storage.SectorRef, pc1o storage.PreCommit1Out) (storage.SectorCids, error) - UnsealPiece(ctx context.Context, sector storage.SectorRef, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, randomness abi.SealRandomness, commd cid.Cid) error - ReadPiece(ctx context.Context, writer io.Writer, sector storage.SectorRef, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize) (bool, error) + FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) error } type SectorProvider interface { diff --git a/pkg/util/ffiwrapper/impl/unseal_ranges.go b/pkg/util/ffiwrapper/impl/unseal_ranges.go index 10fd071df0..e48be1ea04 100644 --- a/pkg/util/ffiwrapper/impl/unseal_ranges.go +++ b/pkg/util/ffiwrapper/impl/unseal_ranges.go @@ -15,6 +15,7 @@ const mergeGaps = 32 << 20 // TODO const expandRuns = 16 << 20 // unseal more than requested for future requests +// nolint func computeUnsealRanges(unsealed rlepluslazy.RunIterator, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize) (rlepluslazy.RunIterator, error) { todo := pieceRun(offset.Padded(), size.Padded()) todo, err := rlepluslazy.Subtract(todo, unsealed) diff --git a/pkg/util/storiface/filetype.go b/pkg/util/storiface/filetype.go index 3661a5488b..83fcadc90e 100644 --- a/pkg/util/storiface/filetype.go +++ b/pkg/util/storiface/filetype.go @@ -12,11 +12,13 @@ const ( FTUnsealed SectorFileType = 1 << iota FTSealed FTCache + FTUpdate + FTUpdateCache FileTypes = iota ) -var PathTypes = []SectorFileType{FTUnsealed, FTSealed, FTCache} +var PathTypes = []SectorFileType{FTUnsealed, FTSealed, FTCache, FTUpdate, FTUpdateCache} const ( FTNone SectorFileType = 0 @@ -25,15 +27,21 @@ const ( const FSOverheadDen = 10 var FSOverheadSeal = map[SectorFileType]int{ // 10x overheads - FTUnsealed: FSOverheadDen, - FTSealed: FSOverheadDen, - FTCache: 141, // 11 layers + D(2x ssize) + C + R + FTUnsealed: FSOverheadDen, + FTSealed: FSOverheadDen, + FTUpdate: FSOverheadDen, + FTUpdateCache: FSOverheadDen * 2, + FTCache: 141, // 11 layers + D(2x ssize) + C + R' } +// sector size * disk / fs overhead. FSOverheadDen is like the unit of sector size + var FsOverheadFinalized = map[SectorFileType]int{ - FTUnsealed: FSOverheadDen, - FTSealed: FSOverheadDen, - FTCache: 2, + FTUnsealed: FSOverheadDen, + FTSealed: FSOverheadDen, + FTUpdate: FSOverheadDen * 2, // XXX: we should clear the update cache on Finalize??? + FTUpdateCache: FSOverheadDen, + FTCache: 2, } type SectorFileType int @@ -46,6 +54,10 @@ func (t SectorFileType) String() string { return "sealed" case FTCache: return "cache" + case FTUpdate: + return "update" + case FTUpdateCache: + return "update-cache" default: return fmt.Sprintf("", t) } @@ -73,6 +85,24 @@ func (t SectorFileType) SealSpaceUse(ssize abi.SectorSize) (uint64, error) { return need, nil } +func (t SectorFileType) StoreSpaceUse(ssize abi.SectorSize) (uint64, error) { + var need uint64 + for _, pathType := range PathTypes { + if !t.Has(pathType) { + continue + } + + oh, ok := FsOverheadFinalized[pathType] + if !ok { + return 0, xerrors.Errorf("no finalized overhead info for %s", pathType) + } + + need += uint64(oh) * uint64(ssize) / FSOverheadDen + } + + return need, nil +} + func (t SectorFileType) All() [FileTypes]bool { var out [FileTypes]bool @@ -86,15 +116,52 @@ func (t SectorFileType) All() [FileTypes]bool { type SectorPaths struct { ID abi.SectorID - Unsealed string - Sealed string - Cache string + Unsealed string + Sealed string + Cache string + Update string + UpdateCache string +} + +func ParseSectorID(baseName string) (abi.SectorID, error) { + var n abi.SectorNumber + var mid abi.ActorID + read, err := fmt.Sscanf(baseName, "s-t0%d-%d", &mid, &n) + if err != nil { + return abi.SectorID{}, xerrors.Errorf("sscanf sector name ('%s'): %w", baseName, err) + } + + if read != 2 { + return abi.SectorID{}, xerrors.Errorf("parseSectorID expected to scan 2 values, got %d", read) + } + + return abi.SectorID{ + Miner: mid, + Number: n, + }, nil } func SectorName(sid abi.SectorID) string { return fmt.Sprintf("s-t0%d-%d", sid.Miner, sid.Number) } +func PathByType(sps SectorPaths, fileType SectorFileType) string { + switch fileType { + case FTUnsealed: + return sps.Unsealed + case FTSealed: + return sps.Sealed + case FTCache: + return sps.Cache + case FTUpdate: + return sps.Update + case FTUpdateCache: + return sps.UpdateCache + } + + panic("requested unknown path type") +} + func SetPathByType(sps *SectorPaths, fileType SectorFileType, p string) { switch fileType { case FTUnsealed: @@ -103,5 +170,9 @@ func SetPathByType(sps *SectorPaths, fileType SectorFileType, p string) { sps.Sealed = p case FTCache: sps.Cache = p + case FTUpdate: + sps.Update = p + case FTUpdateCache: + sps.UpdateCache = p } } diff --git a/venus-shared/types/msg_meta.go b/venus-shared/types/msg_meta.go index ee0193b489..2efb4e7e8a 100644 --- a/venus-shared/types/msg_meta.go +++ b/venus-shared/types/msg_meta.go @@ -28,6 +28,8 @@ const ( MTClientDeal = MsgType("clientdeal") MTProviderDealState = MsgType("providerdealstate") + + MTVerifyAddress = MsgType("verifyaddress") ) type MsgMeta struct { diff --git a/venus-shared/types/tipset_key.go b/venus-shared/types/tipset_key.go index a4da72c09d..711eca353a 100644 --- a/venus-shared/types/tipset_key.go +++ b/venus-shared/types/tipset_key.go @@ -139,6 +139,15 @@ func (tsk TipSetKey) Equals(other TipSetKey) bool { return tsk.value == other.value } +// TipSetKeyFromBytes wraps an encoded key, validating correct decoding. +func TipSetKeyFromBytes(encoded []byte) (TipSetKey, error) { + _, err := decodeKey(encoded) + if err != nil { + return TipSetKey{}, err + } + return TipSetKey{string(encoded)}, nil +} + func (tsk *TipSetKey) UnmarshalCBOR(r io.Reader) error { br := cbg.GetPeeker(r) scratch := make([]byte, 8) From 878026a16c2dbcfd9fc52d94b6577a66b697bddd Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Thu, 6 Jan 2022 15:26:41 +0800 Subject: [PATCH 103/167] chain notify return error (#4677) --- Makefile | 4 +--- pkg/events/cache.go | 2 +- pkg/events/eventAPI.go | 2 +- pkg/events/events_test.go | 20 +++++++++++++------- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index fe8e0ec1f5..183f3e5d6b 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ deps: lint: go run ./build/*.go lint -test: +test: test-venus-shared go run ./build/*.go test -timeout=30m # WARNING THIS BUILDS A GO PLUGIN AND PLUGINS *DO NOT* WORK ON WINDOWS SYSTEMS @@ -64,8 +64,6 @@ inline-gen: test-venus-shared: cd venus-shared && go test -covermode=set ./... -test: gogen test-venus-shared - compatible-all: compatible-api compatible-actor compatible-api: api-checksum api-diff diff --git a/pkg/events/cache.go b/pkg/events/cache.go index 33f2725fd8..bf50bb2cdd 100644 --- a/pkg/events/cache.go +++ b/pkg/events/cache.go @@ -12,7 +12,7 @@ import ( ) type uncachedAPI interface { - ChainNotify(context.Context) <-chan []*types.HeadChange + ChainNotify(context.Context) (<-chan []*types.HeadChange, error) ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*types.HeadChange, error) StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) diff --git a/pkg/events/eventAPI.go b/pkg/events/eventAPI.go index 180edd91af..4492e92044 100644 --- a/pkg/events/eventAPI.go +++ b/pkg/events/eventAPI.go @@ -17,7 +17,7 @@ type TipSetObserver interface { } type IEvent interface { - ChainNotify(context.Context) <-chan []*types.HeadChange + ChainNotify(context.Context) (<-chan []*types.HeadChange, error) ChainGetBlockMessages(context.Context, cid.Cid) (*types.BlockMessages, error) ChainGetTipSetByHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) ChainGetTipSetAfterHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) diff --git a/pkg/events/events_test.go b/pkg/events/events_test.go index 1801b9b947..4b270a747b 100644 --- a/pkg/events/events_test.go +++ b/pkg/events/events_test.go @@ -5,6 +5,8 @@ import ( "fmt" "time" + "golang.org/x/xerrors" + "sync" "testing" @@ -70,7 +72,7 @@ func newFakeCS(t *testing.T) *fakeCS { cancel: cancel, } require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid))) - fcs.loopNotify(ctx) + require.NoError(t, fcs.loopNotify(ctx)) return fcs } @@ -83,8 +85,11 @@ func (fcs *fakeCS) stop() { // our observe use a timer and call 'chainhead' to observe chain head change // to 'PASS' these tests, we must call 'ChainNotify' to start 'waitSub' -func (fcs *fakeCS) loopNotify(ctx context.Context) { - head := fcs.ChainNotify(ctx) +func (fcs *fakeCS) loopNotify(ctx context.Context) error { + head, err := fcs.ChainNotify(ctx) + if err != nil { + return err + } go func() { for { select { @@ -94,6 +99,8 @@ func (fcs *fakeCS) loopNotify(ctx context.Context) { } } }() + + return nil } func (fcs *fakeCS) ChainHead(ctx context.Context) (*types.TipSet, error) { @@ -218,7 +225,7 @@ func (fcs *fakeCS) makeTs(t *testing.T, parents []cid.Cid, h abi.ChainEpoch, msg return ts } -func (fcs *fakeCS) ChainNotify(ctx context.Context) <-chan []*types.HeadChange { +func (fcs *fakeCS) ChainNotify(ctx context.Context) (<-chan []*types.HeadChange, error) { fcs.mu.Lock() defer fcs.mu.Unlock() fcs.callNumber["ChainNotify"] = fcs.callNumber["ChainNotify"] + 1 @@ -226,8 +233,7 @@ func (fcs *fakeCS) ChainNotify(ctx context.Context) <-chan []*types.HeadChange { out := make(chan []*types.HeadChange, 1) if fcs.subCh != nil { close(out) - fcs.t.Error("already subscribed to notifications") - return out + return out, xerrors.Errorf("already subscribed to notifications") } best, err := fcs.tsc.ChainHead(ctx) @@ -239,7 +245,7 @@ func (fcs *fakeCS) ChainNotify(ctx context.Context) <-chan []*types.HeadChange { fcs.subCh = out close(fcs.waitSub) - return out + return out, nil } func (fcs *fakeCS) ChainGetBlockMessages(ctx context.Context, blk cid.Cid) (*types.BlockMessages, error) { From e7d0e4b0576f2dd7556996f54c9bc885cec75d2f Mon Sep 17 00:00:00 2001 From: zl Date: Thu, 6 Jan 2022 16:09:51 +0800 Subject: [PATCH 104/167] fix un-consunsus api StateMinerPreCommitDepositForPower (#4678) --- app/submodule/chain/miner_api.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/submodule/chain/miner_api.go b/app/submodule/chain/miner_api.go index e0a8ba64fd..21f6756e48 100644 --- a/app/submodule/chain/miner_api.go +++ b/app/submodule/chain/miner_api.go @@ -341,7 +341,7 @@ func (msa *minerStateAPI) StateMinerPreCommitDepositForPower(ctx context.Context } var sTree *tree.State - ts, sTree, err = msa.Stmgr.ParentState(ctx, ts) + _, sTree, err = msa.Stmgr.ParentState(ctx, ts) if err != nil { return big.Int{}, xerrors.Errorf("ParentState failed:%v", err) } From 5499a39b1a588e9c37e99e0b845ac72c4e8c573d Mon Sep 17 00:00:00 2001 From: zl Date: Fri, 7 Jan 2022 11:44:56 +0800 Subject: [PATCH 105/167] fix (#4679) --- .github/workflows/tag-workflow.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/tag-workflow.yml b/.github/workflows/tag-workflow.yml index 4f221355e2..5531653f81 100644 --- a/.github/workflows/tag-workflow.yml +++ b/.github/workflows/tag-workflow.yml @@ -102,8 +102,7 @@ jobs: run: sudo apt-get install make ncftp mesa-opencl-icd ocl-icd-opencl-dev gcc git bzr jq pkg-config curl clang build-essential hwloc libhwloc-dev wget -y && sudo apt upgrade -y - name: Build run: | - sudo make deps - sudo make + go clean --modcache && make deps && make mkdir ./release && mv ./venus ./release - name: Zip Release From 60cf0d714401659bc4679300d3997c3080c104e6 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Fri, 7 Jan 2022 15:46:17 +0800 Subject: [PATCH 106/167] Feat/generate v0 api doc (#4685) * clean code * generate v0 api doc --- Makefile | 12 +- venus-devtool/api-docs-gen/cmd/docgen.go | 43 +- venus-devtool/api-docs-gen/docgen.go | 18 +- venus-devtool/go.mod | 1 + venus-devtool/go.sum | 23 +- venus-shared/api/v0-api-document.md | 5376 +++++++++++++++++ .../{api-document.md => v1-api-document.md} | 24 + venus-shared/internal/param.go | 5 +- venus-shared/types/actor.go | 46 +- venus-shared/types/{types.go => api_types.go} | 0 venus-shared/types/bigint.go | 65 +- venus-shared/types/bigint_fil.go | 149 +- venus-shared/types/message.go | 195 +- venus-shared/types/message_marshal.go | 14 +- venus-shared/types/param.go | 7 +- 15 files changed, 5493 insertions(+), 485 deletions(-) create mode 100644 venus-shared/api/v0-api-document.md rename venus-shared/api/{api-document.md => v1-api-document.md} (99%) rename venus-shared/types/{types.go => api_types.go} (100%) diff --git a/Makefile b/Makefile index 183f3e5d6b..27939fa5b8 100644 --- a/Makefile +++ b/Makefile @@ -34,15 +34,11 @@ v2-gen-api: gofmt -s -l -w ./venus-shared/api/chain/v0/proxy_gen.go; gofmt -s -l -w ./venus-shared/api/chain/v1/proxy_gen.go -docfile = ./venus-shared/api/api-document.md +v0APIFile = ../venus-shared/api/v0-api-document.md +v1APIFile = ../venus-shared/api/v1-api-document.md api-docs: - cd ./venus-devtool/ && \ - go run ./api-docs-gen/cmd \ - ../venus-shared/api/chain/v1/fullnode.go \ - FullNode v1 \ - ../venus-shared/api/chain/v1 > \ - .$(docfile) - echo json-rpc-doc-file : $(docfile) + cd ./venus-devtool/ && go run ./api-docs-gen/cmd ../venus-shared/api/chain/v0/fullnode.go FullNode v0 ../venus-shared/api/chain/v0 $(v0APIFile) + cd ./venus-devtool/ && go run ./api-docs-gen/cmd ../venus-shared/api/chain/v1/fullnode.go FullNode v1 ../venus-shared/api/chain/v1 $(v1APIFile) compare-api: go run ./tools/gen/api/proxygen.go compare diff --git a/venus-devtool/api-docs-gen/cmd/docgen.go b/venus-devtool/api-docs-gen/cmd/docgen.go index 370007de3e..68ea1b7a57 100644 --- a/venus-devtool/api-docs-gen/cmd/docgen.go +++ b/venus-devtool/api-docs-gen/cmd/docgen.go @@ -1,14 +1,18 @@ package main import ( + "bytes" "encoding/json" "fmt" + "io/ioutil" "os" "reflect" "sort" "strings" - "github.com/filecoin-project/venus/venus-devtool/api-docs-gen" + "github.com/filecoin-project/go-address" + docgen "github.com/filecoin-project/venus/venus-devtool/api-docs-gen" + "github.com/filecoin-project/venus/venus-shared/types" ) func main() { @@ -47,6 +51,14 @@ func main() { _, _ = fmt.Fprintf(os.Stderr, "ExampleValue for %s get nil\n", ft.Out(0).String()) continue } + // json: unsupported type: map[address.Address]*types.Actor, so use map[string]*types.Actor instead + if actors, ok := outv.(map[address.Address]*types.Actor); ok { + newActors := make(map[string]*types.Actor, len(actors)) + for addr, a := range actors { + newActors[addr.String()] = a + } + outv = newActors + } ov, err := json.MarshalIndent(outv, "", " ") if err != nil { @@ -70,27 +82,28 @@ func main() { return groupslice[i].GroupName < groupslice[j].GroupName }) - fmt.Printf("# Groups\n") + buf := &bytes.Buffer{} + fmt.Fprint(buf, "# Groups\n") for _, g := range groupslice { - fmt.Printf("* [%s](#%s)\n", g.GroupName, g.GroupName) + fmt.Fprintf(buf, "* [%s](#%s)\n", g.GroupName, g.GroupName) for _, method := range g.Methods { - fmt.Printf(" * [%s](#%s)\n", method.Name, method.Name) + fmt.Fprintf(buf, " * [%s](#%s)\n", method.Name, method.Name) } } for _, g := range groupslice { g := g - fmt.Printf("## %s\n", g.GroupName) - fmt.Printf("%s\n\n", g.Header) + fmt.Fprintf(buf, "## %s\n", g.GroupName) + fmt.Fprintf(buf, "%s\n\n", g.Header) sort.Slice(g.Methods, func(i, j int) bool { return g.Methods[i].Name < g.Methods[j].Name }) for _, m := range g.Methods { - fmt.Printf("### %s\n", m.Name) - fmt.Printf("%s\n\n", m.Comment) + fmt.Fprintf(buf, "### %s\n", m.Name) + fmt.Fprintf(buf, "%s\n\n", m.Comment) var meth reflect.StructField var ok bool @@ -106,19 +119,23 @@ func main() { perms := meth.Tag.Get("perm") - fmt.Printf("Perms: %s\n\n", perms) + fmt.Fprintf(buf, "Perms: %s\n\n", perms) if strings.Count(m.InputExample, "\n") > 0 { - fmt.Printf("Inputs:\n```json\n%s\n```\n\n", m.InputExample) + fmt.Fprintf(buf, "Inputs:\n```json\n%s\n```\n\n", m.InputExample) } else { - fmt.Printf("Inputs: `%s`\n\n", m.InputExample) + fmt.Fprintf(buf, "Inputs: `%s`\n\n", m.InputExample) } if strings.Count(m.ResponseExample, "\n") > 0 { - fmt.Printf("Response:\n```json\n%s\n```\n\n", m.ResponseExample) + fmt.Fprintf(buf, "Response:\n```json\n%s\n```\n\n", m.ResponseExample) } else { - fmt.Printf("Response: `%s`\n\n", m.ResponseExample) + fmt.Fprintf(buf, "Response: `%s`\n\n", m.ResponseExample) } } } + + if err := ioutil.WriteFile(os.Args[5], buf.Bytes(), 0644); err != nil { + panic(err) + } } diff --git a/venus-devtool/api-docs-gen/docgen.go b/venus-devtool/api-docs-gen/docgen.go index d5e0e3ff78..698a188b0e 100644 --- a/venus-devtool/api-docs-gen/docgen.go +++ b/venus-devtool/api-docs-gen/docgen.go @@ -124,16 +124,14 @@ func init() { Msg: ExampleValue("init", reflect.TypeOf(&types.Message{}), nil).(*types.Message), MsgRct: ExampleValue("init", reflect.TypeOf(&types.MessageReceipt{}), nil).(*types.MessageReceipt), }) - addExample(map[string]types.Actor{ - "t01236": ExampleValue("init", reflect.TypeOf(types.Actor{}), nil).(types.Actor), - }) - addExample(map[string]types.Actor{ - "t01236": ExampleValue("init", reflect.TypeOf(types.Actor{}), nil).(types.Actor), + addExample(map[address.Address]*types.Actor{ + addr: { + Code: c, + Head: c2, + Nonce: 10, + Balance: abi.NewTokenAmount(100), + }, }) - // todo: get an error on MarshalJSON ? - // addExample(map[address.Address]*chain.Actor{ - // "t01236": ExampleValue("init", reflect.TypeOf(*chain.Actor{}), nil).(*chain.Actor), - // }) addExample(map[string]types.MarketDeal{ "t026363": ExampleValue("init", reflect.TypeOf(types.MarketDeal{}), nil).(types.MarketDeal), }) @@ -332,7 +330,7 @@ func (v *Visitor) Visit(node ast.Node) ast.Visitor { const NoComment = "There are not yet any comments for this method." -func ParseApiASTInfo(apiFile, iface, pkg, dir string) (comments map[string]string, groupDocs map[string]string) { //nolint:golint +func ParseApiASTInfo(apiFile, iface, pkg, dir string) (comments map[string]string, groupDocs map[string]string) { fset := token.NewFileSet() apiDir, err := filepath.Abs(dir) if err != nil { diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index 835c3e7f7c..edbd5b1588 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -25,6 +25,7 @@ require ( ) replace ( + github.com/filecoin-project/filecoin-ffi => .././extern/filecoin-ffi github.com/filecoin-project/go-jsonrpc => github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc github.com/filecoin-project/venus => ../ github.com/ipfs/go-ipfs-cmds => github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index cfe5b03408..9d4c9b973e 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -122,7 +122,9 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkY github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/ashanbrown/forbidigo v1.1.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= github.com/ashanbrown/makezero v0.0.0-20210308000810-4155955488a0/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= +github.com/awnumar/memcall v0.0.0-20191004114545-73db50fd9f80 h1:8kObYoBO4LNmQ+fLiScBfxEdxF1w2MHlvH/lr9MLaTg= github.com/awnumar/memcall v0.0.0-20191004114545-73db50fd9f80/go.mod h1:S911igBPR9CThzd/hYQQmTc9SWNu3ZHIlCGaWsWsoJo= +github.com/awnumar/memguard v0.22.2 h1:tMxcq1WamhG13gigK8Yaj9i/CHNUO3fFlpS9ABBQAxw= github.com/awnumar/memguard v0.22.2/go.mod h1:33OwJBHC+T4eEfFcDrQb78TMlBMBvcOPCXWU9xE34gM= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -331,8 +333,6 @@ github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4 github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= github.com/filecoin-project/dagstore v0.4.4 h1:luolWahhzp3ulRsapGKE7raoLE3n2cFkQUJjPyqUmF4= github.com/filecoin-project/dagstore v0.4.4/go.mod h1:7BlOvaTJrFJ1Qemt5jHlLJ4VhDIuSIzGS0IwO/0AXPA= -github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f h1:vg/6KEAOBjICMaWj+xofJCp09HYRfpO3ZbJsnJo22pA= -github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f/go.mod h1:+If3s2VxyjZn+KGGZIoRXBDSFQ9xL404JBJGf4WhEj0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -382,6 +382,7 @@ github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.m github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= +github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= @@ -419,9 +420,9 @@ github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4U github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff h1:JO62nquOGhjoDf9+JkAcV+wsD5yhoyIKOMj70ZNdD3Q= github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= @@ -1512,6 +1513,7 @@ github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= @@ -1833,6 +1835,7 @@ github.com/raulk/go-watchdog v1.2.0/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6R github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -2062,8 +2065,8 @@ github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSv github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/c-for-go v0.0.0-20200718154222-87b0065af829 h1:wb7xrDzfkLgPHsSEBm+VSx6aDdi64VtV0xvP0E6j8bk= -github.com/xlab/c-for-go v0.0.0-20200718154222-87b0065af829/go.mod h1:h/1PEBwj7Ym/8kOuMWvO2ujZ6Lt+TMbySEXNhjjR87I= +github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb h1:/7/dQyiKnxAOj9L69FhST7uMe17U015XPzX7cy+5ykM= +github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb/go.mod h1:pbNsDSxn1ICiNn9Ct4ZGNrwzfkkwYbx/lw8VuyutFIg= github.com/xlab/pkgconfig v0.0.0-20170226114623-cea12a0fd245 h1:Sw125DKxZhPUI4JLlWugkzsrlB50jR9v2khiD9FxuSo= github.com/xlab/pkgconfig v0.0.0-20170226114623-cea12a0fd245/go.mod h1:C+diUUz7pxhNY6KAoLgrTYARGWnt82zWTylZlxT92vk= github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= @@ -2220,6 +2223,7 @@ golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b h1:QAqMVf3pSa6eeTsuklijuk golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2578,6 +2582,7 @@ golang.org/x/tools v0.0.0-20201011145850-ed2f50202694/go.mod h1:z6u4i615ZeAfBE4X golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201105001634-bc3cf281b174/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -2728,6 +2733,7 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -2757,6 +2763,7 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gorm.io/driver/mysql v1.1.1/go.mod h1:KdrTanmfLPPyAOeYGyG+UpDys7/7eeWT1zCq+oekYnU= gorm.io/gorm v1.21.9/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= gorm.io/gorm v1.21.12/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2775,8 +2782,12 @@ lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= -modernc.org/golex v1.0.0 h1:wWpDlbK8ejRfSyi0frMyhilD3JBvtcx2AdGDnU+JtsE= +modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/golex v1.0.1 h1:EYKY1a3wStt0RzHaH8mdSRNg78Ub0OHxYfCRWw35YtM= +modernc.org/golex v1.0.1/go.mod h1:QCA53QtsT1NdGkaZZkF5ezFwk4IXh4BGNafAARTC254= +modernc.org/lex v1.0.0/go.mod h1:G6rxMTy3cH2iA0iXL/HRRv4Znu8MK4higxph/lE7ypk= +modernc.org/lexer v1.0.0/go.mod h1:F/Dld0YKYdZCLQ7bD0USbWL4YKCyTDRDHiDTOs0q0vk= modernc.org/mathutil v1.1.1 h1:FeylZSVX8S+58VsyJlkEj2bcpdytmp9MmDKZkKx8OIE= modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/strutil v1.1.0 h1:+1/yCzZxY2pZwwrsbH+4T7BQMoLQ9QiBshRC9eicYsc= diff --git a/venus-shared/api/v0-api-document.md b/venus-shared/api/v0-api-document.md new file mode 100644 index 0000000000..8f18b3b3a7 --- /dev/null +++ b/venus-shared/api/v0-api-document.md @@ -0,0 +1,5376 @@ +# Groups +* [](#) + * [Concurrent](#Concurrent) + * [Verify](#Verify) + * [Version](#Version) +* [Auth](#Auth) + * [AuthNew](#AuthNew) +* [Beacon](#Beacon) + * [BeaconGetEntry](#BeaconGetEntry) +* [Block](#Block) + * [BlockTime](#BlockTime) +* [Chain](#Chain) + * [ChainDeleteObj](#ChainDeleteObj) + * [ChainExport](#ChainExport) + * [ChainGetBlock](#ChainGetBlock) + * [ChainGetBlockMessages](#ChainGetBlockMessages) + * [ChainGetMessage](#ChainGetMessage) + * [ChainGetMessagesInTipset](#ChainGetMessagesInTipset) + * [ChainGetParentMessages](#ChainGetParentMessages) + * [ChainGetParentReceipts](#ChainGetParentReceipts) + * [ChainGetPath](#ChainGetPath) + * [ChainGetRandomnessFromBeacon](#ChainGetRandomnessFromBeacon) + * [ChainGetRandomnessFromTickets](#ChainGetRandomnessFromTickets) + * [ChainGetReceipts](#ChainGetReceipts) + * [ChainGetTipSet](#ChainGetTipSet) + * [ChainGetTipSetByHeight](#ChainGetTipSetByHeight) + * [ChainHasObj](#ChainHasObj) + * [ChainHead](#ChainHead) + * [ChainList](#ChainList) + * [ChainNotify](#ChainNotify) + * [ChainReadObj](#ChainReadObj) + * [ChainSetHead](#ChainSetHead) + * [ChainStatObj](#ChainStatObj) + * [ChainSyncHandleNewTipSet](#ChainSyncHandleNewTipSet) + * [ChainTipSetWeight](#ChainTipSetWeight) +* [Gas](#Gas) + * [GasBatchEstimateMessageGas](#GasBatchEstimateMessageGas) + * [GasEstimateFeeCap](#GasEstimateFeeCap) + * [GasEstimateGasLimit](#GasEstimateGasLimit) + * [GasEstimateGasPremium](#GasEstimateGasPremium) + * [GasEstimateMessageGas](#GasEstimateMessageGas) +* [Get](#Get) + * [GetActor](#GetActor) + * [GetEntry](#GetEntry) + * [GetFullBlock](#GetFullBlock) + * [GetParentStateRootActor](#GetParentStateRootActor) +* [Has](#Has) + * [HasPassword](#HasPassword) +* [List](#List) + * [ListActor](#ListActor) +* [Lock](#Lock) + * [LockWallet](#LockWallet) +* [Message](#Message) + * [MessageWait](#MessageWait) +* [Miner](#Miner) + * [MinerCreateBlock](#MinerCreateBlock) + * [MinerGetBaseInfo](#MinerGetBaseInfo) +* [Mpool](#Mpool) + * [MpoolBatchPush](#MpoolBatchPush) + * [MpoolBatchPushMessage](#MpoolBatchPushMessage) + * [MpoolBatchPushUntrusted](#MpoolBatchPushUntrusted) + * [MpoolClear](#MpoolClear) + * [MpoolDeleteByAdress](#MpoolDeleteByAdress) + * [MpoolGetConfig](#MpoolGetConfig) + * [MpoolGetNonce](#MpoolGetNonce) + * [MpoolPending](#MpoolPending) + * [MpoolPublishByAddr](#MpoolPublishByAddr) + * [MpoolPublishMessage](#MpoolPublishMessage) + * [MpoolPush](#MpoolPush) + * [MpoolPushMessage](#MpoolPushMessage) + * [MpoolPushUntrusted](#MpoolPushUntrusted) + * [MpoolSelect](#MpoolSelect) + * [MpoolSelects](#MpoolSelects) + * [MpoolSetConfig](#MpoolSetConfig) + * [MpoolSub](#MpoolSub) +* [Msig](#Msig) + * [MsigAddApprove](#MsigAddApprove) + * [MsigAddCancel](#MsigAddCancel) + * [MsigAddPropose](#MsigAddPropose) + * [MsigApprove](#MsigApprove) + * [MsigApproveTxnHash](#MsigApproveTxnHash) + * [MsigCancel](#MsigCancel) + * [MsigCancelTxnHash](#MsigCancelTxnHash) + * [MsigCreate](#MsigCreate) + * [MsigGetVested](#MsigGetVested) + * [MsigPropose](#MsigPropose) + * [MsigRemoveSigner](#MsigRemoveSigner) + * [MsigSwapApprove](#MsigSwapApprove) + * [MsigSwapCancel](#MsigSwapCancel) + * [MsigSwapPropose](#MsigSwapPropose) +* [Net](#Net) + * [NetAddrsListen](#NetAddrsListen) +* [Network](#Network) + * [NetworkConnect](#NetworkConnect) + * [NetworkFindPeer](#NetworkFindPeer) + * [NetworkFindProvidersAsync](#NetworkFindProvidersAsync) + * [NetworkGetBandwidthStats](#NetworkGetBandwidthStats) + * [NetworkGetClosestPeers](#NetworkGetClosestPeers) + * [NetworkGetPeerAddresses](#NetworkGetPeerAddresses) + * [NetworkGetPeerID](#NetworkGetPeerID) + * [NetworkPeers](#NetworkPeers) +* [Paych](#Paych) + * [PaychAllocateLane](#PaychAllocateLane) + * [PaychAvailableFunds](#PaychAvailableFunds) + * [PaychAvailableFundsByFromTo](#PaychAvailableFundsByFromTo) + * [PaychCollect](#PaychCollect) + * [PaychGet](#PaychGet) + * [PaychGetWaitReady](#PaychGetWaitReady) + * [PaychList](#PaychList) + * [PaychNewPayment](#PaychNewPayment) + * [PaychSettle](#PaychSettle) + * [PaychStatus](#PaychStatus) + * [PaychVoucherAdd](#PaychVoucherAdd) + * [PaychVoucherCheckSpendable](#PaychVoucherCheckSpendable) + * [PaychVoucherCheckValid](#PaychVoucherCheckValid) + * [PaychVoucherCreate](#PaychVoucherCreate) + * [PaychVoucherList](#PaychVoucherList) + * [PaychVoucherSubmit](#PaychVoucherSubmit) +* [Protocol](#Protocol) + * [ProtocolParameters](#ProtocolParameters) +* [Resolve](#Resolve) + * [ResolveToKeyAddr](#ResolveToKeyAddr) +* [Set](#Set) + * [SetConcurrent](#SetConcurrent) + * [SetPassword](#SetPassword) +* [State](#State) + * [StateAccountKey](#StateAccountKey) + * [StateCall](#StateCall) + * [StateCirculatingSupply](#StateCirculatingSupply) + * [StateDealProviderCollateralBounds](#StateDealProviderCollateralBounds) + * [StateGetActor](#StateGetActor) + * [StateGetReceipt](#StateGetReceipt) + * [StateListActors](#StateListActors) + * [StateListMiners](#StateListMiners) + * [StateLookupID](#StateLookupID) + * [StateMarketBalance](#StateMarketBalance) + * [StateMarketDeals](#StateMarketDeals) + * [StateMarketParticipants](#StateMarketParticipants) + * [StateMarketStorageDeal](#StateMarketStorageDeal) + * [StateMinerActiveSectors](#StateMinerActiveSectors) + * [StateMinerAvailableBalance](#StateMinerAvailableBalance) + * [StateMinerDeadlines](#StateMinerDeadlines) + * [StateMinerFaults](#StateMinerFaults) + * [StateMinerInfo](#StateMinerInfo) + * [StateMinerInitialPledgeCollateral](#StateMinerInitialPledgeCollateral) + * [StateMinerPartitions](#StateMinerPartitions) + * [StateMinerPower](#StateMinerPower) + * [StateMinerPreCommitDepositForPower](#StateMinerPreCommitDepositForPower) + * [StateMinerProvingDeadline](#StateMinerProvingDeadline) + * [StateMinerRecoveries](#StateMinerRecoveries) + * [StateMinerSectorAllocated](#StateMinerSectorAllocated) + * [StateMinerSectorCount](#StateMinerSectorCount) + * [StateMinerSectorSize](#StateMinerSectorSize) + * [StateMinerSectors](#StateMinerSectors) + * [StateMinerWorkerAddress](#StateMinerWorkerAddress) + * [StateNetworkName](#StateNetworkName) + * [StateNetworkVersion](#StateNetworkVersion) + * [StateSearchMsg](#StateSearchMsg) + * [StateSearchMsgLimited](#StateSearchMsgLimited) + * [StateSectorExpiration](#StateSectorExpiration) + * [StateSectorGetInfo](#StateSectorGetInfo) + * [StateSectorPartition](#StateSectorPartition) + * [StateSectorPreCommitInfo](#StateSectorPreCommitInfo) + * [StateVMCirculatingSupplyInternal](#StateVMCirculatingSupplyInternal) + * [StateVerifiedClientStatus](#StateVerifiedClientStatus) + * [StateVerifiedRegistryRootKey](#StateVerifiedRegistryRootKey) + * [StateVerifierStatus](#StateVerifierStatus) + * [StateWaitMsg](#StateWaitMsg) + * [StateWaitMsgLimited](#StateWaitMsgLimited) +* [Sync](#Sync) + * [SyncState](#SyncState) + * [SyncSubmitBlock](#SyncSubmitBlock) +* [Syncer](#Syncer) + * [SyncerTracker](#SyncerTracker) +* [Un](#Un) + * [UnLockWallet](#UnLockWallet) +* [Verify](#Verify) + * [VerifyEntry](#VerifyEntry) +* [Wallet](#Wallet) + * [WalletAddresses](#WalletAddresses) + * [WalletBalance](#WalletBalance) + * [WalletDefaultAddress](#WalletDefaultAddress) + * [WalletExport](#WalletExport) + * [WalletHas](#WalletHas) + * [WalletImport](#WalletImport) + * [WalletNewAddress](#WalletNewAddress) + * [WalletSetDefault](#WalletSetDefault) + * [WalletSign](#WalletSign) + * [WalletSignMessage](#WalletSignMessage) + * [WalletState](#WalletState) +## + + +### Concurrent + + +Perms: read + +Inputs: `null` + +Response: `9` + +### Verify + + +Perms: read + +Inputs: +```json +[ + "string value", + "string value" +] +``` + +Response: +```json +[ + "string value" +] +``` + +### Version + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "Version": "string value", + "APIVersion": 131328 +} +``` + +## Auth + + +### AuthNew + + +Perms: admin + +Inputs: +```json +[ + [ + "string value" + ] +] +``` + +Response: `"Ynl0ZSBhcnJheQ=="` + +## Beacon + + +### BeaconGetEntry + + +Perms: read + +Inputs: +```json +[ + 10101 +] +``` + +Response: +```json +{ + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" +} +``` + +## Block + + +### BlockTime + + +Perms: read + +Inputs: `null` + +Response: `60000000000` + +## Chain + + +### ChainDeleteObj + + +Perms: admin + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `{}` + +### ChainExport + + +Perms: read + +Inputs: +```json +[ + 10101, + true, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"Ynl0ZSBhcnJheQ=="` + +### ChainGetBlock + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Miner": "t01234", + "Ticket": { + "VRFProof": "Bw==" + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Bw==" + }, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" +} +``` + +### ChainGetBlockMessages + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "BlsMessages": [ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + } + ], + "SecpkMessages": [ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], + "Cids": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] +} +``` + +### ChainGetMessage + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" +} +``` + +### ChainGetMessagesInTipset + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + } + } +] +``` + +### ChainGetParentMessages + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +[ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + } + } +] +``` + +### ChainGetParentReceipts + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +[ + { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + } +] +``` + +### ChainGetPath + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + { + "Type": "string value", + "Val": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } +] +``` + +### ChainGetRandomnessFromBeacon + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + 2, + 10101, + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: `"Bw=="` + +### ChainGetRandomnessFromTickets + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + 2, + 10101, + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: `"Bw=="` + +### ChainGetReceipts + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +[ + { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + } +] +``` + +### ChainGetTipSet + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Cids": null, + "Blocks": null, + "Height": 0 +} +``` + +### ChainGetTipSetByHeight + + +Perms: read + +Inputs: +```json +[ + 10101, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Cids": null, + "Blocks": null, + "Height": 0 +} +``` + +### ChainHasObj + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `true` + +### ChainHead + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "Cids": null, + "Blocks": null, + "Height": 0 +} +``` + +### ChainList + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + 123 +] +``` + +Response: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +### ChainNotify + + +Perms: read + +Inputs: `null` + +Response: +```json +[ + { + "Type": "string value", + "Val": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } +] +``` + +### ChainReadObj + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `"Ynl0ZSBhcnJheQ=="` + +### ChainSetHead + + +Perms: admin + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `{}` + +### ChainStatObj + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Size": 42, + "Links": 42 +} +``` + +### ChainSyncHandleNewTipSet + + +Perms: write + +Inputs: +```json +[ + { + "Source": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Sender": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Head": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } +] +``` + +Response: `{}` + +### ChainTipSetWeight + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +## Gas + + +### GasBatchEstimateMessageGas + + +Perms: read + +Inputs: +```json +[ + [ + { + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Spec": { + "MaxFee": "0", + "GasOverEstimation": 12.3 + } + } + ], + 42, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + { + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Err": "string value" + } +] +``` + +### GasEstimateFeeCap + + +Perms: read + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### GasEstimateGasLimit + + +Perms: read + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `9` + +### GasEstimateGasPremium + + +Perms: read + +Inputs: +```json +[ + 42, + "t01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### GasEstimateMessageGas + + +Perms: read + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + { + "MaxFee": "0", + "GasOverEstimation": 12.3 + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" +} +``` + +## Get + + +### GetActor + + +Perms: read + +Inputs: +```json +[ + "t01234" +] +``` + +Response: +```json +{ + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Head": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Nonce": 42, + "Balance": "0" +} +``` + +### GetEntry + + +Perms: read + +Inputs: +```json +[ + 10101, + 42 +] +``` + +Response: +```json +{ + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" +} +``` + +### GetFullBlock + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Header": { + "Miner": "t01234", + "Ticket": { + "VRFProof": "Bw==" + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Bw==" + }, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" + }, + "BLSMessages": [ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + } + ], + "SECPMessages": [ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] +} +``` + +### GetParentStateRootActor + + +Perms: read + +Inputs: +```json +[ + { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "t01234" +] +``` + +Response: +```json +{ + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Head": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Nonce": 42, + "Balance": "0" +} +``` + +## Has + + +### HasPassword + + +Perms: admin + +Inputs: `null` + +Response: `true` + +## List + + +### ListActor + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "t01234": { + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Head": { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + }, + "Nonce": 10, + "Balance": "100" + } +} +``` + +## Lock + + +### LockWallet + + +Perms: admin + +Inputs: `null` + +Response: `{}` + +## Message + + +### MessageWait + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 10101, + 10101 +] +``` + +Response: +```json +{ + "TS": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Block": { + "Miner": "t01234", + "Ticket": { + "VRFProof": "Bw==" + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Bw==" + }, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + } +} +``` + +## Miner + + +### MinerCreateBlock + + +Perms: write + +Inputs: +```json +[ + { + "Miner": "t01234", + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Ticket": { + "VRFProof": "Bw==" + }, + "Eproof": { + "WinCount": 9, + "VRFProof": "Bw==" + }, + "BeaconValues": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "Messages": [ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], + "Epoch": 10101, + "Timestamp": 42, + "WinningPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ] + } +] +``` + +Response: +```json +{ + "Header": { + "Miner": "t01234", + "Ticket": { + "VRFProof": "Bw==" + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Bw==" + }, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" + }, + "BlsMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "SecpkMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] +} +``` + +### MinerGetBaseInfo + + +Perms: read + +Inputs: +```json +[ + "t01234", + 10101, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "MinerPower": "0", + "NetworkPower": "0", + "Sectors": [ + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ], + "WorkerKey": "t01234", + "SectorSize": 34359738368, + "PrevBeaconEntry": { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "EligibleForMining": true +} +``` + +## Mpool + + +### MpoolBatchPush + + +Perms: write + +Inputs: +```json +[ + [ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] +] +``` + +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +### MpoolBatchPushMessage + + +Perms: sign + +Inputs: +```json +[ + [ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + } + ], + { + "MaxFee": "0", + "GasOverEstimation": 12.3 + } +] +``` + +Response: +```json +[ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` + +### MpoolBatchPushUntrusted + + +Perms: write + +Inputs: +```json +[ + [ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] +] +``` + +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +### MpoolClear + + +Perms: write + +Inputs: +```json +[ + true +] +``` + +Response: `{}` + +### MpoolDeleteByAdress + + +Perms: admin + +Inputs: +```json +[ + "t01234" +] +``` + +Response: `{}` + +### MpoolGetConfig + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "PriorityAddrs": [ + "t01234" + ], + "SizeLimitHigh": 123, + "SizeLimitLow": 123, + "ReplaceByFeeRatio": 12.3, + "PruneCooldown": 60000000000, + "GasLimitOverestimation": 12.3 +} +``` + +### MpoolGetNonce + + +Perms: read + +Inputs: +```json +[ + "t01234" +] +``` + +Response: `42` + +### MpoolPending + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` + +### MpoolPublishByAddr + + +Perms: admin + +Inputs: +```json +[ + "t01234" +] +``` + +Response: `{}` + +### MpoolPublishMessage + + +Perms: admin + +Inputs: +```json +[ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` + +Response: `{}` + +### MpoolPush + + +Perms: write + +Inputs: +```json +[ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MpoolPushMessage + + +Perms: sign + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + { + "MaxFee": "0", + "GasOverEstimation": 12.3 + } +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } +} +``` + +### MpoolPushUntrusted + + +Perms: write + +Inputs: +```json +[ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MpoolSelect + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + 12.3 +] +``` + +Response: +```json +[ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` + +### MpoolSelects + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + [ + 12.3 + ] +] +``` + +Response: +```json +[ + [ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] +] +``` + +### MpoolSetConfig + + +Perms: admin + +Inputs: +```json +[ + { + "PriorityAddrs": [ + "t01234" + ], + "SizeLimitHigh": 123, + "SizeLimitLow": 123, + "ReplaceByFeeRatio": 12.3, + "PruneCooldown": 60000000000, + "GasLimitOverestimation": 12.3 + } +] +``` + +Response: `{}` + +### MpoolSub + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "Type": 0, + "Message": { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +} +``` + +## Msig + + +### MsigAddApprove + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + 42, + "t01234", + "t01234", + true +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigAddCancel + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + 42, + "t01234", + true +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigAddPropose + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + "t01234", + true +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigApprove + + +Perms: sign + +Inputs: +```json +[ + "t01234", + 42, + "t01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigApproveTxnHash + + +Perms: sign + +Inputs: +```json +[ + "t01234", + 42, + "t01234", + "t01234", + "0", + "t01234", + 42, + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigCancel + + +Perms: sign + +Inputs: +```json +[ + "t01234", + 42, + "t01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigCancelTxnHash + + +Perms: sign + +Inputs: +```json +[ + "t01234", + 42, + "t01234", + "0", + "t01234", + 42, + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigCreate + + +Perms: sign + +Inputs: +```json +[ + 42, + [ + "t01234" + ], + 10101, + "0", + "t01234", + "0" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigGetVested + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### MsigPropose + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + "0", + "t01234", + 42, + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigRemoveSigner + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + "t01234", + true +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigSwapApprove + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + 42, + "t01234", + "t01234", + "t01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigSwapCancel + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + 42, + "t01234", + "t01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigSwapPropose + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + "t01234", + "t01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +## Net + + +### NetAddrsListen + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] +} +``` + +## Network + + +### NetworkConnect + + +Perms: read + +Inputs: +```json +[ + [ + "string value" + ] +] +``` + +Response: +```json +{ + "PeerID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Err": {} +} +``` + +### NetworkFindPeer + + +Perms: read + +Inputs: +```json +[ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" +] +``` + +Response: +```json +{ + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] +} +``` + +### NetworkFindProvidersAsync + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 123 +] +``` + +Response: +```json +{ + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] +} +``` + +### NetworkGetBandwidthStats + + +Perms: admin + +Inputs: `null` + +Response: +```json +{ + "TotalIn": 9, + "TotalOut": 9, + "RateIn": 12.3, + "RateOut": 12.3 +} +``` + +### NetworkGetClosestPeers + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +[ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" +] +``` + +### NetworkGetPeerAddresses + + +Perms: admin + +Inputs: `null` + +Response: +```json +[ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" +] +``` + +### NetworkGetPeerID + + +Perms: admin + +Inputs: `null` + +Response: `"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"` + +### NetworkPeers + + +Perms: read + +Inputs: +```json +[ + true, + true, + true +] +``` + +Response: +```json +{ + "Peers": [ + { + "Addr": "string value", + "Peer": "string value", + "Latency": "string value", + "Muxer": "string value", + "Streams": [ + { + "Protocol": "string value" + } + ] + } + ] +} +``` + +## Paych + + +### PaychAllocateLane + + +Perms: sign + +Inputs: +```json +[ + "t01234" +] +``` + +Response: `42` + +### PaychAvailableFunds + + +Perms: sign + +Inputs: +```json +[ + "t01234" +] +``` + +Response: +```json +{ + "Channel": "\u003cempty\u003e", + "From": "t01234", + "To": "t01234", + "ConfirmedAmt": "0", + "PendingAmt": "0", + "PendingWaitSentinel": null, + "QueuedAmt": "0", + "VoucherReedeemedAmt": "0" +} +``` + +### PaychAvailableFundsByFromTo + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234" +] +``` + +Response: +```json +{ + "Channel": "\u003cempty\u003e", + "From": "t01234", + "To": "t01234", + "ConfirmedAmt": "0", + "PendingAmt": "0", + "PendingWaitSentinel": null, + "QueuedAmt": "0", + "VoucherReedeemedAmt": "0" +} +``` + +### PaychCollect + + +Perms: sign + +Inputs: +```json +[ + "t01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### PaychGet + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + "0" +] +``` + +Response: +```json +{ + "Channel": "t01234", + "WaitSentinel": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +} +``` + +### PaychGetWaitReady + + +Perms: sign + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `"t01234"` + +### PaychList + + +Perms: read + +Inputs: `null` + +Response: +```json +[ + "t01234" +] +``` + +### PaychNewPayment + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "t01234", + [ + { + "Amount": "0", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "MinSettle": 10101, + "Extra": { + "Actor": "t01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + } + } + ] +] +``` + +Response: +```json +{ + "Channel": "t01234", + "WaitSentinel": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Vouchers": [ + { + "ChannelAddr": "t01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "t01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } + ] +} +``` + +### PaychSettle + + +Perms: sign + +Inputs: +```json +[ + "t01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### PaychStatus + + +Perms: read + +Inputs: +```json +[ + "t01234" +] +``` + +Response: +```json +{ + "ControlAddr": "t01234", + "Direction": 1 +} +``` + +### PaychVoucherAdd + + +Perms: write + +Inputs: +```json +[ + "t01234", + { + "ChannelAddr": "t01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "t01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + }, + "Ynl0ZSBhcnJheQ==", + "0" +] +``` + +Response: `"0"` + +### PaychVoucherCheckSpendable + + +Perms: read + +Inputs: +```json +[ + "t01234", + { + "ChannelAddr": "t01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "t01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + }, + "Ynl0ZSBhcnJheQ==", + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: `true` + +### PaychVoucherCheckValid + + +Perms: read + +Inputs: +```json +[ + "t01234", + { + "ChannelAddr": "t01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "t01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } +] +``` + +Response: `{}` + +### PaychVoucherCreate + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "0", + 42 +] +``` + +Response: +```json +{ + "Voucher": { + "ChannelAddr": "t01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "t01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + }, + "Shortfall": "0" +} +``` + +### PaychVoucherList + + +Perms: write + +Inputs: +```json +[ + "t01234" +] +``` + +Response: +```json +[ + { + "ChannelAddr": "t01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "t01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } +] +``` + +### PaychVoucherSubmit + + +Perms: sign + +Inputs: +```json +[ + "t01234", + { + "ChannelAddr": "t01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "t01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + }, + "Ynl0ZSBhcnJheQ==", + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +## Protocol + + +### ProtocolParameters + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "Network": "string value", + "BlockTime": 60000000000, + "SupportedSectors": [ + { + "Size": 34359738368, + "MaxPieceSize": 1024 + } + ] +} +``` + +## Resolve + + +### ResolveToKeyAddr + + +Perms: read + +Inputs: +```json +[ + "t01234", + { + "Cids": null, + "Blocks": null, + "Height": 0 + } +] +``` + +Response: `"t01234"` + +## Set + + +### SetConcurrent + + +Perms: admin + +Inputs: +```json +[ + 9 +] +``` + +Response: `{}` + +### SetPassword + + +Perms: admin + +Inputs: +```json +[ + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: `{}` + +## State + + +### StateAccountKey + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"t01234"` + +### StateCall + + +Perms: read + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "MsgCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "GasCost": { + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "GasUsed": "0", + "BaseFeeBurn": "0", + "OverEstimationBurn": "0", + "MinerPenalty": "0", + "MinerTip": "0", + "Refund": "0", + "TotalCost": "0" + }, + "ExecutionTrace": { + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": [ + { + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": null + } + ] + }, + "Error": "string value", + "Duration": 60000000000 +} +``` + +### StateCirculatingSupply + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateDealProviderCollateralBounds + + +Perms: read + +Inputs: +```json +[ + 1032, + true, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Min": "0", + "Max": "0" +} +``` + +### StateGetActor + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Head": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Nonce": 42, + "Balance": "0" +} +``` + +### StateGetReceipt + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 +} +``` + +### StateListActors + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + "t01234" +] +``` + +### StateListMiners + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + "t01234" +] +``` + +### StateLookupID + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"t01234"` + +### StateMarketBalance + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Escrow": "0", + "Locked": "0" +} +``` + +### StateMarketDeals + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "t026363": { + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "t01234", + "Provider": "t01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "State": { + "SectorStartEpoch": 10101, + "LastUpdatedEpoch": 10101, + "SlashEpoch": 10101 + } + } +} +``` + +### StateMarketParticipants + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "t026363": { + "Escrow": "0", + "Locked": "0" + } +} +``` + +### StateMarketStorageDeal + + +Perms: read + +Inputs: +```json +[ + 5432, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "t01234", + "Provider": "t01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "State": { + "SectorStartEpoch": 10101, + "LastUpdatedEpoch": 10101, + "SlashEpoch": 10101 + } +} +``` + +### StateMinerActiveSectors + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null + } +] +``` + +### StateMinerAvailableBalance + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateMinerDeadlines + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + { + "PostSubmissions": [ + 5, + 1 + ], + "DisputableProofCount": 42 + } +] +``` + +### StateMinerFaults + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + 5, + 1 +] +``` + +### StateMinerInfo + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Owner": "t01234", + "Worker": "t01234", + "NewWorker": "t01234", + "ControlAddresses": [ + "t01234" + ], + "WorkerChangeEpoch": 10101, + "PeerId": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Multiaddrs": [ + "Ynl0ZSBhcnJheQ==" + ], + "WindowPoStProofType": 8, + "SectorSize": 34359738368, + "WindowPoStPartitionSectors": 42, + "ConsensusFaultElapsed": 10101 +} +``` + +### StateMinerInitialPledgeCollateral + + +Perms: read + +Inputs: +```json +[ + "t01234", + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SealRandEpoch": 10101, + "DealIDs": [ + 5432 + ], + "Expiration": 10101, + "ReplaceCapacity": true, + "ReplaceSectorDeadline": 42, + "ReplaceSectorPartition": 42, + "ReplaceSectorNumber": 9 + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateMinerPartitions + + +Perms: read + +Inputs: +```json +[ + "t01234", + 42, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + { + "AllSectors": [ + 5, + 1 + ], + "FaultySectors": [ + 5, + 1 + ], + "RecoveringSectors": [ + 5, + 1 + ], + "LiveSectors": [ + 5, + 1 + ], + "ActiveSectors": [ + 5, + 1 + ] + } +] +``` + +### StateMinerPower + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "MinerPower": { + "RawBytePower": "0", + "QualityAdjPower": "0" + }, + "TotalPower": { + "RawBytePower": "0", + "QualityAdjPower": "0" + }, + "HasMinPower": true +} +``` + +### StateMinerPreCommitDepositForPower + + +Perms: read + +Inputs: +```json +[ + "t01234", + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SealRandEpoch": 10101, + "DealIDs": [ + 5432 + ], + "Expiration": 10101, + "ReplaceCapacity": true, + "ReplaceSectorDeadline": 42, + "ReplaceSectorPartition": 42, + "ReplaceSectorNumber": 9 + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateMinerProvingDeadline + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "CurrentEpoch": 10101, + "PeriodStart": 10101, + "Index": 42, + "Open": 10101, + "Close": 10101, + "Challenge": 10101, + "FaultCutoff": 10101, + "WPoStPeriodDeadlines": 42, + "WPoStProvingPeriod": 10101, + "WPoStChallengeWindow": 10101, + "WPoStChallengeLookback": 10101, + "FaultDeclarationCutoff": 10101 +} +``` + +### StateMinerRecoveries + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + 5, + 1 +] +``` + +### StateMinerSectorAllocated + + +Perms: read + +Inputs: +```json +[ + "t01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `true` + +### StateMinerSectorCount + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Live": 42, + "Active": 42, + "Faulty": 42 +} +``` + +### StateMinerSectorSize + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `34359738368` + +### StateMinerSectors + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + 0 + ], + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null + } +] +``` + +### StateMinerWorkerAddress + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"t01234"` + +### StateNetworkName + + +Perms: read + +Inputs: `null` + +Response: `"mainnet"` + +### StateNetworkVersion + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `14` + +### StateSearchMsg + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "ReturnDec": {}, + "TipSet": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 +} +``` + +### StateSearchMsgLimited + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 10101 +] +``` + +Response: +```json +{ + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "ReturnDec": {}, + "TipSet": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 +} +``` + +### StateSectorExpiration + + +Perms: read + +Inputs: +```json +[ + "t01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "OnTime": 10101, + "Early": 10101 +} +``` + +### StateSectorGetInfo + + +Perms: read + +Inputs: +```json +[ + "t01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null +} +``` + +### StateSectorPartition + + +Perms: read + +Inputs: +```json +[ + "t01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Deadline": 42, + "Partition": 42 +} +``` + +### StateSectorPreCommitInfo + + +Perms: read + +Inputs: +```json +[ + "t01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Info": { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SealRandEpoch": 10101, + "DealIDs": [ + 5432 + ], + "Expiration": 10101, + "ReplaceCapacity": true, + "ReplaceSectorDeadline": 42, + "ReplaceSectorPartition": 42, + "ReplaceSectorNumber": 9 + }, + "PreCommitDeposit": "0", + "PreCommitEpoch": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0" +} +``` + +### StateVMCirculatingSupplyInternal + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "FilVested": "0", + "FilMined": "0", + "FilBurnt": "0", + "FilLocked": "0", + "FilCirculating": "0", + "FilReserveDisbursed": "0" +} +``` + +### StateVerifiedClientStatus + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateVerifiedRegistryRootKey + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"t01234"` + +### StateVerifierStatus + + +Perms: read + +Inputs: +```json +[ + "t01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateWaitMsg + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 42 +] +``` + +Response: +```json +{ + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "ReturnDec": {}, + "TipSet": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 +} +``` + +### StateWaitMsgLimited + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 42, + 10101 +] +``` + +Response: +```json +{ + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "ReturnDec": {}, + "TipSet": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 +} +``` + +## Sync + + +### SyncState + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "ActiveSyncs": [ + { + "WorkerID": 42, + "Base": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Target": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Stage": 1, + "Height": 10101, + "Start": "0001-01-01T00:00:00Z", + "End": "0001-01-01T00:00:00Z", + "Message": "string value" + } + ], + "VMApplied": 42 +} +``` + +### SyncSubmitBlock + + +Perms: write + +Inputs: +```json +[ + { + "Header": { + "Miner": "t01234", + "Ticket": { + "VRFProof": "Bw==" + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Bw==" + }, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" + }, + "BlsMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "SecpkMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] + } +] +``` + +Response: `{}` + +## Syncer + + +### SyncerTracker + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "History": [ + { + "State": 1, + "Base": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Current": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Start": "0001-01-01T00:00:00Z", + "End": "0001-01-01T00:00:00Z", + "Err": {}, + "Source": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Sender": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Head": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } + ], + "Buckets": [ + { + "State": 1, + "Base": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Current": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Start": "0001-01-01T00:00:00Z", + "End": "0001-01-01T00:00:00Z", + "Err": {}, + "Source": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Sender": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Head": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } + ] +} +``` + +## Un + + +### UnLockWallet + + +Perms: admin + +Inputs: +```json +[ + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: `{}` + +## Verify + + +### VerifyEntry + + +Perms: read + +Inputs: +```json +[ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + }, + 10101 +] +``` + +Response: `true` + +## Wallet + + +### WalletAddresses + + +Perms: admin + +Inputs: `null` + +Response: +```json +[ + "t01234" +] +``` + +### WalletBalance + + +Perms: read + +Inputs: +```json +[ + "t01234" +] +``` + +Response: `"0"` + +### WalletDefaultAddress + + +Perms: write + +Inputs: `null` + +Response: `"t01234"` + +### WalletExport + + +Perms: admin + +Inputs: +```json +[ + "t01234", + "string value" +] +``` + +Response: +```json +{ + "Type": "bls", + "PrivateKey": "Ynl0ZSBhcnJheQ==" +} +``` + +### WalletHas + + +Perms: write + +Inputs: +```json +[ + "t01234" +] +``` + +Response: `true` + +### WalletImport + + +Perms: admin + +Inputs: +```json +[ + { + "Type": "bls", + "PrivateKey": "Ynl0ZSBhcnJheQ==" + } +] +``` + +Response: `"t01234"` + +### WalletNewAddress + + +Perms: write + +Inputs: +```json +[ + 7 +] +``` + +Response: `"t01234"` + +### WalletSetDefault + + +Perms: write + +Inputs: +```json +[ + "t01234" +] +``` + +Response: `{}` + +### WalletSign + + +Perms: sign + +Inputs: +```json +[ + "t01234", + "Ynl0ZSBhcnJheQ==", + { + "Type": "message", + "Extra": "Ynl0ZSBhcnJheQ==" + } +] +``` + +Response: +```json +{ + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" +} +``` + +### WalletSignMessage + + +Perms: sign + +Inputs: +```json +[ + "t01234", + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + } +] +``` + +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "t01234", + "From": "t01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } +} +``` + +### WalletState + + +Perms: admin + +Inputs: `null` + +Response: `123` + diff --git a/venus-shared/api/api-document.md b/venus-shared/api/v1-api-document.md similarity index 99% rename from venus-shared/api/api-document.md rename to venus-shared/api/v1-api-document.md index 61e085eee7..9467afd29c 100644 --- a/venus-shared/api/api-document.md +++ b/venus-shared/api/v1-api-document.md @@ -48,6 +48,7 @@ * [Has](#Has) * [HasPassword](#HasPassword) * [List](#List) + * [ListActor](#ListActor) * [Lock](#Lock) * [LockWallet](#LockWallet) * [Message](#Message) @@ -1435,6 +1436,29 @@ Response: `true` ## List +### ListActor + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "t01234": { + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Head": { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + }, + "Nonce": 10, + "Balance": "100" + } +} +``` + ## Lock diff --git a/venus-shared/internal/param.go b/venus-shared/internal/param.go index 4de72e2f86..36ea0acc8f 100644 --- a/venus-shared/internal/param.go +++ b/venus-shared/internal/param.go @@ -2,13 +2,12 @@ package internal import ( "github.com/filecoin-project/go-address" - - big2 "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/venus/venus-shared/types/params" ) var ( - bigZero = big2.Zero() + bigZero = big.Zero() ) var TotalFilecoinInt = FromFil(params.FilBase) diff --git a/venus-shared/types/actor.go b/venus-shared/types/actor.go index 842ae1924e..5bda98e101 100644 --- a/venus-shared/types/actor.go +++ b/venus-shared/types/actor.go @@ -1,47 +1,15 @@ package types import ( - "errors" - - internal "github.com/filecoin-project/venus/venus-shared/internal" - "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/venus/venus-shared/internal" "github.com/ipfs/go-cid" ) -var ErrActorNotFound = errors.New("actor not found") +var ErrActorNotFound = internal.ErrActorNotFound -// Actor is the central abstraction of entities in the system. -// -// Both individual accounts, as well as contracts (user & system level) are -// represented as actors. An actor has the following core functionality implemented on a system level: -// - track a Filecoin balance, using the `Balance` field -// - execute code stored in the `Code` field -// - read & write memory -// - replay protection, using the `Nonce` field -// -// Value sent to a non-existent address will be tracked as an empty actor that has a Balance but -// nil Code and Memory. You must nil check Code cids before comparing them. -// -// More specific capabilities for individual accounts or contract specific must be implemented -// inside the code. -// -// Not safe for concurrent access. type Actor = internal.Actor -//type Actor struct { -// // Code is a CID of the VM code for this actor's implementation (or a constant for actors implemented in Go code). -// // Code may be nil for an uninitialized actor (which exists because it has received a balance). -// Code cid.Cid -// // Head is the CID of the root of the actor's state tree. -// Head cid.Cid -// // Nonce is the number expected on the next message from this actor. -// // Messages are processed in strict, contiguous order. -// Nonce uint64 -// // Balance is the amount of attoFIL in the actor's account. -// Balance abi.TokenAmount -//} - // NewActor constructs a new actor. func NewActor(code cid.Cid, balance abi.TokenAmount, head cid.Cid) *Actor { return &Actor{ @@ -51,13 +19,3 @@ func NewActor(code cid.Cid, balance abi.TokenAmount, head cid.Cid) *Actor { Head: head, } } - -//// Empty tests whether the actor's code is defined. -//func (t *Actor) Empty() bool { -// return !t.Code.Defined() -//} -// -//// IncrementSeqNum increments the seq number. -//func (t *Actor) IncrementSeqNum() { -// t.Nonce = t.Nonce + 1 -//} diff --git a/venus-shared/types/types.go b/venus-shared/types/api_types.go similarity index 100% rename from venus-shared/types/types.go rename to venus-shared/types/api_types.go diff --git a/venus-shared/types/bigint.go b/venus-shared/types/bigint.go index 6174b5c580..10b0554d3e 100644 --- a/venus-shared/types/bigint.go +++ b/venus-shared/types/bigint.go @@ -1,59 +1,20 @@ package types import ( - "fmt" - "math/big" - - big2 "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/venus-shared/internal" ) -var EmptyInt = BigInt{} - -type BigInt = big2.Int - -func NewInt(i uint64) BigInt { - return BigInt{Int: big.NewInt(0).SetUint64(i)} -} - -func BigFromBytes(b []byte) BigInt { - i := big.NewInt(0).SetBytes(b) - return BigInt{Int: i} -} - -func BigFromString(s string) (BigInt, error) { - v, ok := big.NewInt(0).SetString(s, 10) - if !ok { - return BigInt{}, fmt.Errorf("failed to parse string as a big int") - } - - return BigInt{Int: v}, nil -} - -func BigMul(a, b BigInt) BigInt { - return BigInt{Int: big.NewInt(0).Mul(a.Int, b.Int)} -} - -func BigDiv(a, b BigInt) BigInt { - return BigInt{Int: big.NewInt(0).Div(a.Int, b.Int)} -} - -func BigDivFloat(num, den BigInt) float64 { - res, _ := new(big.Rat).SetFrac(num.Int, den.Int).Float64() - return res -} - -func BigMod(a, b BigInt) BigInt { - return BigInt{Int: big.NewInt(0).Mod(a.Int, b.Int)} -} - -func BigAdd(a, b BigInt) BigInt { - return BigInt{Int: big.NewInt(0).Add(a.Int, b.Int)} -} +var EmptyInt = internal.EmptyInt -func BigSub(a, b BigInt) BigInt { - return BigInt{Int: big.NewInt(0).Sub(a.Int, b.Int)} -} +type BigInt = internal.BigInt -func BigCmp(a, b BigInt) int { - return a.Int.Cmp(b.Int) -} +var NewInt = internal.NewInt +var BigFromBytes = internal.BigFromBytes +var BigFromString = internal.BigFromString +var BigMul = internal.BigMul +var BigDiv = internal.BigDiv +var BigDivFloat = internal.BigDivFloat +var BigMod = internal.BigMod +var BigAdd = internal.BigAdd +var BigSub = internal.BigSub +var BigCmp = internal.BigCmp diff --git a/venus-shared/types/bigint_fil.go b/venus-shared/types/bigint_fil.go index 1a51dc9c3b..73249aa545 100644 --- a/venus-shared/types/bigint_fil.go +++ b/venus-shared/types/bigint_fil.go @@ -1,147 +1,18 @@ package types import ( - "encoding" - "fmt" - "math/big" - "strings" - - fbig "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/venus/venus-shared/types/params" + "github.com/filecoin-project/venus/venus-shared/internal" ) -var ZeroFIL = fbig.NewInt(0) - -type FIL BigInt - -func (f FIL) String() string { - return f.Unitless() + " FIL" -} - -var AttoFil = NewInt(1) -var FemtoFil = BigMul(AttoFil, NewInt(1000)) -var PicoFil = BigMul(FemtoFil, NewInt(1000)) -var NanoFil = BigMul(PicoFil, NewInt(1000)) - -func (f FIL) Unitless() string { - r := new(big.Rat).SetFrac(f.Int, big.NewInt(int64(params.FilecoinPrecision))) - if r.Sign() == 0 { - return "0" - } - return strings.TrimRight(strings.TrimRight(r.FloatString(18), "0"), ".") -} - -var unitPrefixes = []string{"a", "f", "p", "n", "μ", "m"} - -func (f FIL) Short() string { - n := BigInt(f).Abs() - - dn := uint64(1) - var prefix string - for _, p := range unitPrefixes { - if n.LessThan(NewInt(dn * 1000)) { - prefix = p - break - } - dn *= 1000 - } - - r := new(big.Rat).SetFrac(f.Int, big.NewInt(int64(dn))) - if r.Sign() == 0 { - return "0" - } - - return strings.TrimRight(strings.TrimRight(r.FloatString(3), "0"), ".") + " " + prefix + "FIL" -} - -func (f FIL) Nano() string { - r := new(big.Rat).SetFrac(f.Int, big.NewInt(int64(1e9))) - if r.Sign() == 0 { - return "0" - } - - return strings.TrimRight(strings.TrimRight(r.FloatString(9), "0"), ".") + " nFIL" -} - -func (f FIL) Format(s fmt.State, ch rune) { - switch ch { - case 's', 'v': - fmt.Fprint(s, f.String()) - default: - f.Int.Format(s, ch) - } -} - -func (f FIL) MarshalText() (text []byte, err error) { - return []byte(f.String()), nil -} - -func (f FIL) UnmarshalText(text []byte) error { - p, err := ParseFIL(string(text)) - if err != nil { - return err - } - - if f.Int == nil { - f.Int = big.NewInt(0) - } - - f.Int.Set(p.Int) - return nil -} - -func ParseFIL(s string) (FIL, error) { - suffix := strings.TrimLeft(s, "-.1234567890") - s = s[:len(s)-len(suffix)] - var attofil bool - if suffix != "" { - norm := strings.ToLower(strings.TrimSpace(suffix)) - switch norm { - case "", "fil": - case "attofil", "afil": - attofil = true - default: - return FIL{}, fmt.Errorf("unrecognized suffix: %q", suffix) - } - } - - if len(s) > 50 { - return FIL{}, fmt.Errorf("string length too large: %d", len(s)) - } - - r, ok := new(big.Rat).SetString(s) - if !ok { - return FIL{}, fmt.Errorf("failed to parse %q as a decimal number", s) - } - - if !attofil { - r = r.Mul(r, big.NewRat(int64(params.FilecoinPrecision), 1)) - } - - if !r.IsInt() { - var pref string - if attofil { - pref = "atto" - } - return FIL{}, fmt.Errorf("invalid %sFIL value: %q", pref, s) - } - - return FIL{r.Num()}, nil -} - -func MustParseFIL(s string) FIL { - n, err := ParseFIL(s) - if err != nil { - panic(err) - } +var ZeroFIL = internal.ZeroFIL - return n -} +type FIL = internal.FIL -func FromFil(i uint64) BigInt { - return BigMul(NewInt(i), NewInt(params.FilecoinPrecision)) -} +var AttoFil = internal.AttoFil +var FemtoFil = internal.FemtoFil +var PicoFil = internal.PicoFil +var NanoFil = internal.NanoFil -var _ encoding.TextMarshaler = (*FIL)(nil) -var _ encoding.TextUnmarshaler = (*FIL)(nil) +var ParseFIL = internal.ParseFIL +var MustParseFIL = internal.MustParseFIL +var FromFil = internal.FromFil diff --git a/venus-shared/types/message.go b/venus-shared/types/message.go index cff0bc80ca..e419ad5ff5 100644 --- a/venus-shared/types/message.go +++ b/venus-shared/types/message.go @@ -4,203 +4,10 @@ import ( "github.com/filecoin-project/venus/venus-shared/internal" ) -const MessageVersion = 0 +const MessageVersion = internal.MessageVersion type ChainMsg = internal.ChainMsg -//type ChainMsg interface { -// Cid() cid.Cid -// VMMessage() *Message -// ToStorageBlock() (blocks.Block, error) -// // FIXME: This is the *message* length, this name is misleading. -// ChainLength() int -// cbor.Marshaler -// cbor.Unmarshaler -//} var DecodeMessage = internal.DecodeMessage -//func DecodeMessage(b []byte) (*Message, error) { -// var msg Message -// if err := msg.UnmarshalCBOR(bytes.NewReader(b)); err != nil { -// return nil, err -// } -// -// if msg.Version != MessageVersion { -// return nil, fmt.Errorf("decoded message had incorrect version (%d)", msg.Version) -// } -// -// return &msg, nil -//} - type Message = internal.Message - -//type Message struct { -// Version uint64 -// -// To address.Address -// From address.Address -// // When receiving a message from a user account the nonce in -// // the message must match the expected nonce in the from actor. -// // This prevents replay attacks. -// Nonce uint64 -// -// Value abi.TokenAmount -// -// GasLimit int64 -// GasFeeCap abi.TokenAmount -// GasPremium abi.TokenAmount -// -// Method abi.MethodNum -// Params []byte -//} - -//func (m *Message) Serialize() ([]byte, error) { -// buf := new(bytes.Buffer) -// if err := m.MarshalCBOR(buf); err != nil { -// return nil, err -// } -// -// return buf.Bytes(), nil -//} -// -//func (m *Message) SerializeWithCid() (cid.Cid, []byte, error) { -// data, err := m.Serialize() -// if err != nil { -// return cid.Undef, nil, err -// } -// -// c, err := abi.CidBuilder.Sum(data) -// if err != nil { -// return cid.Undef, nil, err -// } -// -// return c, data, nil -//} -// -//func (m *Message) ToStorageBlock() (blocks.Block, error) { -// c, data, err := m.SerializeWithCid() -// if err != nil { -// return nil, err -// } -// -// return blocks.NewBlockWithCid(data, c) -//} -// -//func (m *Message) Cid() cid.Cid { -// c, _, err := m.SerializeWithCid() -// if err != nil { -// panic(err) -// } -// -// return c -//} -// -//func (m *Message) String() string { -// errStr := "(error encoding Message)" -// c, _, err := m.SerializeWithCid() -// if err != nil { -// return errStr -// } -// -// js, err := json.MarshalIndent(m, "", " ") -// if err != nil { -// return errStr -// } -// -// return fmt.Sprintf("Message cid=[%v]: %s", c, string(js)) -//} -// -//func (m *Message) ChainLength() int { -// ser, err := m.Serialize() -// if err != nil { -// panic(err) -// } -// -// return len(ser) -//} -// -//func (m *Message) Equals(o *Message) bool { -// return m.Cid() == o.Cid() -//} -// -//func (m *Message) EqualCall(o *Message) bool { -// m1 := *m -// m2 := *o -// -// m1.GasLimit, m2.GasLimit = 0, 0 -// m1.GasFeeCap, m2.GasFeeCap = bigZero, bigZero -// m1.GasPremium, m2.GasPremium = bigZero, bigZero -// -// return (&m1).Equals(&m2) -//} -// -//func (m *Message) ValidForBlockInclusion(minGas int64, version network.Version) error { -// if m.Version != 0 { -// return fmt.Errorf("'Version' unsupported") -// } -// -// if m.To == address.Undef { -// return fmt.Errorf("'To' address cannot be empty") -// } -// -// if m.To == ZeroAddress && version >= network.Version7 { -// return fmt.Errorf("invalid 'To' address") -// } -// -// if m.From == address.Undef { -// return fmt.Errorf("'From' address cannot be empty") -// } -// -// if m.Value.Int == nil { -// return fmt.Errorf("'Value' cannot be nil") -// } -// -// if m.Value.LessThan(bigZero) { -// return fmt.Errorf("'Value' field cannot be negative") -// } -// -// if m.Value.GreaterThan(TotalFilecoinInt) { -// return fmt.Errorf("'Value' field cannot be greater than total filecoin supply") -// } -// -// if m.GasFeeCap.Int == nil { -// return fmt.Errorf("'GasFeeCap' cannot be nil") -// } -// -// if m.GasFeeCap.LessThan(bigZero) { -// return fmt.Errorf("'GasFeeCap' field cannot be negative") -// } -// -// if m.GasPremium.Int == nil { -// return fmt.Errorf("'GasPremium' cannot be nil") -// } -// -// if m.GasPremium.LessThan(bigZero) { -// return fmt.Errorf("'GasPremium' field cannot be negative") -// } -// -// if m.GasPremium.GreaterThan(m.GasFeeCap) { -// return fmt.Errorf("'GasFeeCap' less than 'GasPremium'") -// } -// -// if m.GasLimit > params.BlockGasLimit { -// return fmt.Errorf("'GasLimit' field cannot be greater than a block's gas limit") -// } -// -// // since prices might vary with time, this is technically semantic validation -// if m.GasLimit < minGas { -// return fmt.Errorf("'GasLimit' field cannot be less than the cost of storing a message on chain %d < %d", m.GasLimit, minGas) -// } -// -// return nil -//} -// -//func (m *Message) VMMessage() *Message { -// return m -//} -// -//func (m *Message) RequiredFunds() abi.TokenAmount { -// return abi.TokenAmount{Int: BigMul(BigInt{Int: m.GasFeeCap.Int}, NewInt(uint64(m.GasLimit))).Int} -//} - -var _ ChainMsg = (*Message)(nil) diff --git a/venus-shared/types/message_marshal.go b/venus-shared/types/message_marshal.go index daf9a4d8ab..05aba47cb6 100644 --- a/venus-shared/types/message_marshal.go +++ b/venus-shared/types/message_marshal.go @@ -4,16 +4,4 @@ import ( "github.com/filecoin-project/venus/venus-shared/internal" ) -type RawMessage = internal.Message - -//type mCid struct { -// CID cid.Cid -// *RawMessage -//} - -//func (m *Message) MarshalJSON() ([]byte, error) { -// return json.Marshal(&mCid{ -// RawMessage: (*RawMessage)(m), -// CID: m.Cid(), -// }) -//} +type RawMessage = internal.RawMessage diff --git a/venus-shared/types/param.go b/venus-shared/types/param.go index 16ba4818aa..53a4f19dba 100644 --- a/venus-shared/types/param.go +++ b/venus-shared/types/param.go @@ -3,6 +3,8 @@ package types import ( "math/big" + "github.com/filecoin-project/venus/venus-shared/internal" + "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" @@ -12,13 +14,12 @@ import ( ) var ( - //bigZero = big2.Zero() blocksPerEpochBig = big.NewInt(0).SetUint64(params.BlocksPerEpoch) ) -var TotalFilecoinInt = FromFil(params.FilBase) +var TotalFilecoinInt = internal.TotalFilecoinInt -var ZeroAddress = MustParseAddress("f3yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaby2smx7a") +var ZeroAddress = internal.ZeroAddress var EmptyTokenAmount = abi.TokenAmount{} From 08d633ec0bd9272c49bca7328197eeb10de7b45c Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Fri, 7 Jan 2022 16:41:01 +0800 Subject: [PATCH 107/167] circsuypply calc around null blocks (#4687) --- Makefile | 8 ++++---- go.mod | 4 ++-- go.sum | 30 +++++++++++++++++++++++------- pkg/statemanger/call.go | 2 +- pkg/vm/vmcontext/vmcontext.go | 28 ++++++++++++++++++++++------ 5 files changed, 52 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index 27939fa5b8..36460767a2 100644 --- a/Makefile +++ b/Makefile @@ -34,11 +34,11 @@ v2-gen-api: gofmt -s -l -w ./venus-shared/api/chain/v0/proxy_gen.go; gofmt -s -l -w ./venus-shared/api/chain/v1/proxy_gen.go -v0APIFile = ../venus-shared/api/v0-api-document.md -v1APIFile = ../venus-shared/api/v1-api-document.md +v0APIDoc = ../venus-shared/api/v0-api-document.md +v1APIDoc = ../venus-shared/api/v1-api-document.md api-docs: - cd ./venus-devtool/ && go run ./api-docs-gen/cmd ../venus-shared/api/chain/v0/fullnode.go FullNode v0 ../venus-shared/api/chain/v0 $(v0APIFile) - cd ./venus-devtool/ && go run ./api-docs-gen/cmd ../venus-shared/api/chain/v1/fullnode.go FullNode v1 ../venus-shared/api/chain/v1 $(v1APIFile) + cd ./venus-devtool/ && go run ./api-docs-gen/cmd ../venus-shared/api/chain/v0/fullnode.go FullNode v0 ../venus-shared/api/chain/v0 $(v0APIDoc) + cd ./venus-devtool/ && go run ./api-docs-gen/cmd ../venus-shared/api/chain/v1/fullnode.go FullNode v1 ../venus-shared/api/chain/v1 $(v1APIDoc) compare-api: go run ./tools/gen/api/proxygen.go compare diff --git a/go.mod b/go.mod index ceeef6bb22..31c20e750d 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.0-20201016124514-d0bbec7bfcc4 github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 - github.com/filecoin-project/go-data-transfer v1.12.0 + github.com/filecoin-project/go-data-transfer v1.12.1 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543 @@ -67,7 +67,7 @@ require ( github.com/ipfs/go-datastore v0.5.1 github.com/ipfs/go-ds-badger2 v0.1.2 github.com/ipfs/go-fs-lock v0.0.6 - github.com/ipfs/go-graphsync v0.11.0 + github.com/ipfs/go-graphsync v0.11.5 github.com/ipfs/go-ipfs-blockstore v1.1.2 github.com/ipfs/go-ipfs-chunker v0.0.5 github.com/ipfs/go-ipfs-cmdkit v0.0.1 diff --git a/go.sum b/go.sum index 302db32f34..db5d1ec517 100644 --- a/go.sum +++ b/go.sum @@ -319,8 +319,8 @@ github.com/filecoin-project/go-commp-utils v0.1.3 h1:rTxbkNXZU7FLgdkBk8RsQIEOuPO github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9ANQrY3fDFoXdqyX04J+dWpK30= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.12.0 h1:y44x35JvB93kezahMURKizIa/aizGTPSHqi5cbAfTEo= -github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= +github.com/filecoin-project/go-data-transfer v1.12.1 h1:gAznAZKySVs2FS6T/vDq7R3f0DewLnxeROe0oOE6bZU= +github.com/filecoin-project/go-data-transfer v1.12.1/go.mod h1:j3HL645YiQFxcM+q7uPlGApILSqeweDABNgZQP7pDYU= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -424,6 +424,11 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.1 h1:DX7uPQ4WgAWfoh+NGGlbJQswnYIVvz0SRlLS3rPZQDA= +github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.0 h1:j4LrlVXgrbIWO83mmQUnK0Hi+YnbD+vzrE1z/EphbFE= +github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= @@ -784,8 +789,8 @@ github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1 github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-graphsync v0.11.0 h1:PiiD5CnoC3xEHMW8d6uBGqGcoTwiMB5d9CORIEyF6iA= -github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= +github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= +github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= @@ -874,8 +879,9 @@ github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.7.0 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= +github.com/ipfs/go-peertaskqueue v0.7.1 h1:7PLjon3RZwRQMgOTvYccZ+mjzkmds/7YzSWKFlBAypE= +github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4 h1:6NwppOXefWIyysZ4LR/qUBPvXd5//8J3jiMdvpbw6Lo= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= @@ -892,9 +898,9 @@ github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDD github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 h1:olscE5Sv+ts+N9YLQsIL9k6eS6y6CXMGRl5RCr2Cn/E= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G/JsQ= +github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= @@ -2021,9 +2027,17 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= +go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= +go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= +go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= +go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= +go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20190702223751-32f345186213/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -2110,6 +2124,7 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5 h1:FR+oGxGfbQu1d+jglI3rCkjAjUnhRSZcUxr+DqlDLNo= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -2314,6 +2329,7 @@ golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/pkg/statemanger/call.go b/pkg/statemanger/call.go index ae83218225..94b3e7aed8 100644 --- a/pkg/statemanger/call.go +++ b/pkg/statemanger/call.go @@ -68,7 +68,7 @@ func (s *Stmgr) CallWithGas(ctx context.Context, msg *types.Message, priorMsgs [ NtwkVersionGetter: s.fork.GetNtwkVersion, Rnd: consensus.NewHeadRandomness(s.rnd, ts.Key()), BaseFee: ts.At(0).ParentBaseFee, - Epoch: ts.Height(), + Epoch: ts.Height() + 1, GasPriceSchedule: s.gasSchedule, PRoot: stateRoot, Bsstore: s.cs.Blockstore(), diff --git a/pkg/vm/vmcontext/vmcontext.go b/pkg/vm/vmcontext/vmcontext.go index 553358d24b..cab3d8503e 100644 --- a/pkg/vm/vmcontext/vmcontext.go +++ b/pkg/vm/vmcontext/vmcontext.go @@ -68,7 +68,9 @@ func (vm *VM) ApplyImplicitMessage(msg types.ChainMsg) (*Ret, error) { Method: unsignedMsg.Method, Params: unsignedMsg.Params, } - vm.SetCurrentEpoch(vm.vmOption.Epoch) + if err := vm.SetCurrentEpoch(vm.vmOption.Epoch); err != nil { + return nil, xerrors.Errorf("error advancing vm an epoch: %w", err) + } return vm.applyImplicitMessage(imsg) } @@ -116,7 +118,7 @@ func NewVM(ctx context.Context, actorImpls ActorImplLookup, vmOption VmOption) ( } return &VM{ - context: context.Background(), + context: ctx, actorImpls: actorImpls, bsstore: buf, store: cst, @@ -153,7 +155,9 @@ func (vm *VM) ApplyGenesisMessage(from address.Address, to address.Address, meth Params: params, } - vm.SetCurrentEpoch(0) + if err := vm.SetCurrentEpoch(0); err != nil { + return nil, xerrors.Errorf("error advancing vm an epoch: %w", err) + } ret, err := vm.applyImplicitMessage(imsg) if err != nil { return ret, err @@ -241,7 +245,9 @@ func (vm *VM) ApplyTipSetMessages(blocks []types.BlockMessagesInfo, ts *types.Ti return cid.Undef, nil, xerrors.Errorf("load fork cid error: %v", err) } } - vm.SetCurrentEpoch(i + 1) + if err := vm.SetCurrentEpoch(i + 1); err != nil { + return cid.Undef, nil, xerrors.Errorf("error advancing vm an epoch: %w", err) + } } vmlog.Debugf("process tipset fork: %v\n", time.Since(toProcessTipset).Milliseconds()) // create message tracker @@ -422,7 +428,9 @@ func (vm *VM) ApplyMessage(msg types.ChainMsg) (*Ret, error) { // applyMessage applies the message To the current stateView. func (vm *VM) applyMessage(msg *types.Message, onChainMsgSize int) (*Ret, error) { - vm.SetCurrentEpoch(vm.vmOption.Epoch) + if err := vm.SetCurrentEpoch(vm.vmOption.Epoch); err != nil { + return nil, xerrors.Errorf("error advancing vm an epoch: %w", err) + } // This Method does not actually execute the message itself, // but rather deals with the pre/post processing of a message. // (see: `invocationContext.invoke()` for the dispatch and execution) @@ -727,9 +735,17 @@ func (vm *VM) CurrentEpoch() abi.ChainEpoch { return vm.currentEpoch } -func (vm *VM) SetCurrentEpoch(current abi.ChainEpoch) { +func (vm *VM) SetCurrentEpoch(current abi.ChainEpoch) error { vm.currentEpoch = current vm.pricelist = vm.vmOption.GasPriceSchedule.PricelistByEpoch(current) + + ncirc, err := vm.vmOption.CircSupplyCalculator(vm.context, vm.currentEpoch, vm.State) + if err != nil { + return err + } + vm.baseCircSupply = ncirc + + return nil } func (vm *VM) NtwkVersion() network.Version { From 70c69a27584d84f1e7b3fb0b634fa47f3f4c5875 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Mon, 10 Jan 2022 17:40:51 +0800 Subject: [PATCH 108/167] remove the NtwkVersionGetter (#4690) * remove the NtwkVersionGetter * syscalls add method: VerifyReplicaUpdate --- app/submodule/chain/chaininfo_api.go | 6 ++-- app/submodule/chain/miner_api.go | 4 +-- app/submodule/mining/mining_api.go | 6 ++-- pkg/consensus/block_validator.go | 14 +++++----- pkg/consensus/expected.go | 2 +- pkg/consensusfault/check.go | 4 +-- pkg/fork/fork.go | 4 +-- pkg/fork/mock.go | 2 +- pkg/gen/genesis/genesis.go | 5 +--- pkg/gen/genesis/miners.go | 6 +--- pkg/statemanger/call.go | 4 +-- pkg/vm/dispatch/loader.go | 2 +- pkg/vm/runtime/runtime.go | 2 +- pkg/vm/vmcontext/invocation_context.go | 16 +++++------ pkg/vm/vmcontext/runtime_adapter.go | 21 ++++++++++---- pkg/vm/vmcontext/syscalls.go | 38 +++++++++++++++----------- pkg/vm/vmcontext/syscallsStateView.go | 8 +++--- pkg/vm/vmcontext/types.go | 5 ++-- pkg/vm/vmcontext/vmcontext.go | 8 +++--- tools/conformance/driver.go | 14 ++++++---- tools/gengen/util/generator.go | 22 +++++++-------- 21 files changed, 100 insertions(+), 93 deletions(-) diff --git a/app/submodule/chain/chaininfo_api.go b/app/submodule/chain/chaininfo_api.go index 3988785423..8218296b67 100644 --- a/app/submodule/chain/chaininfo_api.go +++ b/app/submodule/chain/chaininfo_api.go @@ -372,7 +372,7 @@ func (cia *chainInfoAPI) StateGetRandomnessFromTickets(ctx context.Context, pers } r := chain.NewChainRandomnessSource(cia.chain.ChainReader, ts.Key(), cia.chain.Drand) - rnv := cia.chain.Fork.GetNtwkVersion(ctx, randEpoch) + rnv := cia.chain.Fork.GetNetworkVersion(ctx, randEpoch) if rnv >= network.Version13 { return r.GetChainRandomnessV2(ctx, personalization, randEpoch, entropy) @@ -388,7 +388,7 @@ func (cia *chainInfoAPI) StateGetRandomnessFromBeacon(ctx context.Context, perso return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } r := chain.NewChainRandomnessSource(cia.chain.ChainReader, ts.Key(), cia.chain.Drand) - rnv := cia.chain.Fork.GetNtwkVersion(ctx, randEpoch) + rnv := cia.chain.Fork.GetNetworkVersion(ctx, randEpoch) if rnv >= network.Version14 { return r.GetBeaconRandomnessV3(ctx, personalization, randEpoch, entropy) @@ -405,7 +405,7 @@ func (cia *chainInfoAPI) StateNetworkVersion(ctx context.Context, tsk types.TipS if err != nil { return network.VersionMax, xerrors.Errorf("loading tipset %s: %v", tsk, err) } - return cia.chain.Fork.GetNtwkVersion(ctx, ts.Height()), nil + return cia.chain.Fork.GetNetworkVersion(ctx, ts.Height()), nil } func (cia *chainInfoAPI) StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) { diff --git a/app/submodule/chain/miner_api.go b/app/submodule/chain/miner_api.go index 21f6756e48..b9f50a8dfd 100644 --- a/app/submodule/chain/miner_api.go +++ b/app/submodule/chain/miner_api.go @@ -100,7 +100,7 @@ func (msa *minerStateAPI) StateMinerInfo(ctx context.Context, maddr address.Addr return miner.MinerInfo{}, xerrors.Errorf("loading view %s: %v", tsk, err) } - nv := msa.Fork.GetNtwkVersion(ctx, ts.Height()) + nv := msa.Fork.GetNetworkVersion(ctx, ts.Height()) minfo, err := view.MinerInfo(ctx, maddr, nv) if err != nil { return miner.MinerInfo{}, err @@ -725,7 +725,7 @@ func (msa *minerStateAPI) StateDealProviderCollateralBounds(ctx context.Context, powClaim.QualityAdjPower, rewPow, circ.FilCirculating, - msa.Fork.GetNtwkVersion(ctx, ts.Height())) + msa.Fork.GetNetworkVersion(ctx, ts.Height())) if err != nil { return types.DealCollateralBounds{}, xerrors.Errorf("getting deal provider coll bounds: %v", err) } diff --git a/app/submodule/mining/mining_api.go b/app/submodule/mining/mining_api.go index 5a51b31083..b5d5bb07e9 100644 --- a/app/submodule/mining/mining_api.go +++ b/app/submodule/mining/mining_api.go @@ -60,7 +60,7 @@ func (miningAPI *MiningAPI) MinerGetBaseInfo(ctx context.Context, maddr address. if len(entries) > 0 { rbase = entries[len(entries)-1] } - version := miningAPI.Ming.ChainModule.Fork.GetNtwkVersion(ctx, round) + version := miningAPI.Ming.ChainModule.Fork.GetNetworkVersion(ctx, round) lbts, lbst, err := miningAPI.Ming.ChainModule.ChainReader.GetLookbackTipSetForRound(ctx, ts, round, version) if err != nil { return nil, xerrors.Errorf("getting lookback miner actor state: %v", err) @@ -96,7 +96,7 @@ func (miningAPI *MiningAPI) MinerGetBaseInfo(ctx context.Context, maddr address. return nil, xerrors.Errorf("failed to get randomness for winning post: %v", err) } - nv := miningAPI.Ming.ChainModule.Fork.GetNtwkVersion(ctx, ts.Height()) + nv := miningAPI.Ming.ChainModule.Fork.GetNetworkVersion(ctx, ts.Height()) pv := miningAPI.Ming.proofVerifier sectors, err := view.GetSectorsForWinningPoSt(ctx, nv, pv, maddr, prand) @@ -178,7 +178,7 @@ func (miningAPI *MiningAPI) minerCreateBlock(ctx context.Context, bt *types.Bloc return nil, xerrors.Errorf("failed to load tipset state: %v", err) } - version := miningAPI.Ming.ChainModule.Fork.GetNtwkVersion(ctx, bt.Epoch) + version := miningAPI.Ming.ChainModule.Fork.GetNetworkVersion(ctx, bt.Epoch) _, lbst, err := miningAPI.Ming.ChainModule.ChainReader.GetLookbackTipSetForRound(ctx, pts, bt.Epoch, version) if err != nil { return nil, xerrors.Errorf("getting lookback miner actor state: %v", err) diff --git a/pkg/consensus/block_validator.go b/pkg/consensus/block_validator.go index 3efda57c7f..b7342d7201 100644 --- a/pkg/consensus/block_validator.go +++ b/pkg/consensus/block_validator.go @@ -178,7 +178,7 @@ func (bv *BlockValidator) validateBlock(ctx context.Context, blk *types.BlockHea } // get worker address - version := bv.fork.GetNtwkVersion(ctx, blk.Height) + version := bv.fork.GetNetworkVersion(ctx, blk.Height) lbTS, lbStateRoot, err := bv.chainState.GetLookbackTipSetForRound(ctx, parent, blk.Height, version) if err != nil { return xerrors.Errorf("failed to get lookback tipset for block: %w", err) @@ -255,7 +255,7 @@ func (bv *BlockValidator) validateBlock(ctx context.Context, blk *types.BlockHea return nil }) - winPoStNv := bv.fork.GetNtwkVersion(ctx, baseHeight) + winPoStNv := bv.fork.GetNetworkVersion(ctx, baseHeight) wproofCheck := async.Err(func() error { if err := bv.VerifyWinningPoStProof(ctx, winPoStNv, blk, prevBeacon, lbStateRoot); err != nil { return xerrors.Errorf("invalid election post: %w", err) @@ -437,7 +437,7 @@ func (bv *BlockValidator) checkPowerAndGetWorkerKey(ctx context.Context, bh *typ // we check that the miner met the minimum power at the lookback tipset baseTS := bv.chainState.GetHead() - version := bv.fork.GetNtwkVersion(ctx, bh.Height) + version := bv.fork.GetNetworkVersion(ctx, bh.Height) lbts, lbst, err := bv.chainState.GetLookbackTipSetForRound(ctx, baseTS, bh.Height, version) if err != nil { log.Warnf("failed to load lookback tipset for incoming block: %s", err) @@ -582,7 +582,7 @@ func (bv *BlockValidator) MinerEligibleToMine(ctx context.Context, addr address. hmp, err := bv.minerHasMinPower(ctx, addr, lookbackTS) // TODO: We're blurring the lines between a "runtime network version" and a "Lotus upgrade epoch", is that unavoidable? - if bv.fork.GetNtwkVersion(ctx, parentHeight) <= network.Version3 { + if bv.fork.GetNetworkVersion(ctx, parentHeight) <= network.Version3 { return hmp, err } @@ -784,7 +784,7 @@ func (bv *BlockValidator) checkBlockMessages(ctx context.Context, sigValidator * // Phase 1: syntactic validation, as defined in the spec minGas := pl.OnChainMessage(msg.ChainLength()) - if err := m.ValidForBlockInclusion(minGas.Total(), bv.fork.GetNtwkVersion(ctx, blk.Height)); err != nil { + if err := m.ValidForBlockInclusion(minGas.Total(), bv.fork.GetNetworkVersion(ctx, blk.Height)); err != nil { return err } @@ -798,7 +798,7 @@ func (bv *BlockValidator) checkBlockMessages(ctx context.Context, sigValidator * // Phase 2: (Partial) semantic validation: // the sender exists and is an account actor, and the nonces make sense var sender address.Address - if bv.fork.GetNtwkVersion(ctx, blk.Height) >= network.Version13 { + if bv.fork.GetNetworkVersion(ctx, blk.Height) >= network.Version13 { sender, err = st.LookupID(m.From) if err != nil { return err @@ -844,7 +844,7 @@ func (bv *BlockValidator) checkBlockMessages(ctx context.Context, sigValidator * secpMsgs := make([]types.ChainMsg, len(blksecpMsgs)) for i, m := range blksecpMsgs { - if bv.fork.GetNtwkVersion(ctx, blk.Height) >= network.Version14 { + if bv.fork.GetNetworkVersion(ctx, blk.Height) >= network.Version14 { if m.Signature.Type != crypto.SigTypeSecp256k1 { return xerrors.Errorf("block had invalid secpk message at index %d: %w", i, err) } diff --git a/pkg/consensus/expected.go b/pkg/consensus/expected.go index db54e7100e..b97fb89950 100644 --- a/pkg/consensus/expected.go +++ b/pkg/consensus/expected.go @@ -208,7 +208,7 @@ func (c *Expected) RunStateTransition(ctx context.Context, ts *types.TipSet) (ci return dertail.FilCirculating, nil }, LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, c.chainState, c.fork, ts), - NtwkVersionGetter: c.fork.GetNtwkVersion, + NetworkVersion: c.fork.GetNetworkVersion(ctx, ts.At(0).Height), Rnd: NewHeadRandomness(c.rnd, ts.Key()), BaseFee: ts.At(0).ParentBaseFee, Fork: c.fork, diff --git a/pkg/consensusfault/check.go b/pkg/consensusfault/check.go index 710575061d..a02ef8426d 100644 --- a/pkg/consensusfault/check.go +++ b/pkg/consensusfault/check.go @@ -131,12 +131,12 @@ func (s *ConsensusFaultChecker) VerifyConsensusFault(ctx context.Context, h1, h2 } // Expensive validation: signatures. - b1Version := s.fork.GetNtwkVersion(ctx, b1.Height) + b1Version := s.fork.GetNetworkVersion(ctx, b1.Height) err := verifyBlockSignature(ctx, b1, b1Version, curEpoch, msg.To, gasIpld, view, getter) if err != nil { return nil, err } - b2Version := s.fork.GetNtwkVersion(ctx, b2.Height) + b2Version := s.fork.GetNetworkVersion(ctx, b2.Height) err = verifyBlockSignature(ctx, b2, b2Version, curEpoch, msg.To, gasIpld, view, getter) if err != nil { return nil, err diff --git a/pkg/fork/fork.go b/pkg/fork/fork.go index 5961a5621e..04075f701e 100644 --- a/pkg/fork/fork.go +++ b/pkg/fork/fork.go @@ -360,7 +360,7 @@ type chainReader interface { type IFork interface { HandleStateForks(ctx context.Context, root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) - GetNtwkVersion(ctx context.Context, height abi.ChainEpoch) network.Version + GetNetworkVersion(ctx context.Context, height abi.ChainEpoch) network.Version HasExpensiveFork(ctx context.Context, height abi.ChainEpoch) bool GetForkUpgrade() *config.ForkUpgradeConfig Start(ctx context.Context) error @@ -496,7 +496,7 @@ func (c *ChainFork) HasExpensiveFork(ctx context.Context, height abi.ChainEpoch) return ok } -func (c *ChainFork) GetNtwkVersion(ctx context.Context, height abi.ChainEpoch) network.Version { +func (c *ChainFork) GetNetworkVersion(ctx context.Context, height abi.ChainEpoch) network.Version { // The epochs here are the _last_ epoch for every version, or -1 if the // version is disabled. for _, spec := range c.networkVersions { diff --git a/pkg/fork/mock.go b/pkg/fork/mock.go index 2ce487e98e..b4eb2fa7a7 100644 --- a/pkg/fork/mock.go +++ b/pkg/fork/mock.go @@ -24,7 +24,7 @@ func (mockFork *MockFork) HandleStateForks(ctx context.Context, root cid.Cid, he return root, nil } -func (mockFork *MockFork) GetNtwkVersion(ctx context.Context, height abi.ChainEpoch) network.Version { +func (mockFork *MockFork) GetNetworkVersion(ctx context.Context, height abi.ChainEpoch) network.Version { return network.Version0 } diff --git a/pkg/gen/genesis/genesis.go b/pkg/gen/genesis/genesis.go index 66a8389936..cd90b3c545 100644 --- a/pkg/gen/genesis/genesis.go +++ b/pkg/gen/genesis/genesis.go @@ -484,9 +484,6 @@ func VerifyPreSealedData(ctx context.Context, cs *chain.Store, stateroot cid.Cid faultChecker := consensusfault.NewFaultChecker(cs, fork.NewMockFork()) syscalls := vmsupport.NewSyscalls(faultChecker, impl.ProofVerifier) - genesisNetworkVersion := func(context.Context, abi.ChainEpoch) network.Version { - return nv - } csc := func(context.Context, abi.ChainEpoch, tree.Tree) (abi.TokenAmount, error) { return big.Zero(), nil @@ -495,7 +492,7 @@ func VerifyPreSealedData(ctx context.Context, cs *chain.Store, stateroot cid.Cid gasPriceSchedule := gas.NewPricesSchedule(para) vmopt := vm.VmOption{ CircSupplyCalculator: csc, - NtwkVersionGetter: genesisNetworkVersion, + NetworkVersion: nv, Rnd: &fakeRand{}, BaseFee: big.NewInt(0), Epoch: 0, diff --git a/pkg/gen/genesis/miners.go b/pkg/gen/genesis/miners.go index eb41a13fb9..1b560849d5 100644 --- a/pkg/gen/genesis/miners.go +++ b/pkg/gen/genesis/miners.go @@ -92,16 +92,12 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min return big.Zero(), nil } - genesisNetworkVersion := func(context.Context, abi.ChainEpoch) network.Version { - return nv - } - faultChecker := consensusfault.NewFaultChecker(cs, fork.NewMockFork()) syscalls := vmsupport.NewSyscalls(faultChecker, impl.ProofVerifier) gasPirceSchedule := gas.NewPricesSchedule(para) vmopt := vm.VmOption{ CircSupplyCalculator: csc, - NtwkVersionGetter: genesisNetworkVersion, + NetworkVersion: nv, Rnd: &fakeRand{}, BaseFee: big.NewInt(0), Epoch: 0, diff --git a/pkg/statemanger/call.go b/pkg/statemanger/call.go index 94b3e7aed8..103b364b8d 100644 --- a/pkg/statemanger/call.go +++ b/pkg/statemanger/call.go @@ -65,7 +65,7 @@ func (s *Stmgr) CallWithGas(ctx context.Context, msg *types.Message, priorMsgs [ return cs.FilCirculating, nil }, LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, s.cs, s.fork, ts), - NtwkVersionGetter: s.fork.GetNtwkVersion, + NetworkVersion: s.fork.GetNetworkVersion(ctx, ts.Height()+1), Rnd: consensus.NewHeadRandomness(s.rnd, ts.Key()), BaseFee: ts.At(0).ParentBaseFee, Epoch: ts.Height() + 1, @@ -197,7 +197,7 @@ func (s *Stmgr) Call(ctx context.Context, msg *types.Message, ts *types.TipSet) return dertail.FilCirculating, nil }, LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, s.cs, s.fork, ts), - NtwkVersionGetter: s.fork.GetNtwkVersion, + NetworkVersion: s.fork.GetNetworkVersion(ctx, pheight+1), Rnd: consensus.NewHeadRandomness(s.rnd, ts.Key()), BaseFee: ts.At(0).ParentBaseFee, Epoch: pheight + 1, diff --git a/pkg/vm/dispatch/loader.go b/pkg/vm/dispatch/loader.go index 5014f2e517..61429686cc 100644 --- a/pkg/vm/dispatch/loader.go +++ b/pkg/vm/dispatch/loader.go @@ -89,7 +89,7 @@ type ActorPredicate func(vmr.Runtime, rtt.VMActor) error //ActorsVersionPredicate get actor predicate base on actor version and network version func ActorsVersionPredicate(ver actors.Version) ActorPredicate { return func(rt vmr.Runtime, v rtt.VMActor) error { - nver, err := actors.VersionForNetwork(rt.NtwkVersion()) + nver, err := actors.VersionForNetwork(rt.NetworkVersion()) if err != nil { return xerrors.Errorf("version for network %w", err) } diff --git a/pkg/vm/runtime/runtime.go b/pkg/vm/runtime/runtime.go index de68bf48f7..0cb3e5486f 100644 --- a/pkg/vm/runtime/runtime.go +++ b/pkg/vm/runtime/runtime.go @@ -18,7 +18,7 @@ type Runtime interface { // CurrentEpoch is the current chain epoch. CurrentEpoch() abi.ChainEpoch - NtwkVersion() network.Version + NetworkVersion() network.Version } // InvocationContext is passed to the actors on each method call. diff --git a/pkg/vm/vmcontext/invocation_context.go b/pkg/vm/vmcontext/invocation_context.go index 50b698b63b..97e312ef23 100644 --- a/pkg/vm/vmcontext/invocation_context.go +++ b/pkg/vm/vmcontext/invocation_context.go @@ -74,7 +74,7 @@ func newInvocationContext(rt *VM, gasIpld ipfscbor.IpldStore, topLevel *topLevel if parent != nil { // TODO: The version check here should be unnecessary, but we can wait to take it out - if !parent.allowSideEffects && rt.NtwkVersion() >= network.Version7 { + if !parent.allowSideEffects && rt.NetworkVersion() >= network.Version7 { runtime.Abortf(exitcode.SysErrForbidden, "internal calls currently disabled") } //ctx.gasUsed = parent.gasUsed @@ -84,7 +84,7 @@ func newInvocationContext(rt *VM, gasIpld ipfscbor.IpldStore, topLevel *topLevel ctx.depth = parent.depth + 1 } - if ctx.depth > MaxCallDepth && rt.NtwkVersion() >= network.Version6 { + if ctx.depth > MaxCallDepth && rt.NetworkVersion() >= network.Version6 { runtime.Abortf(exitcode.SysErrForbidden, "message execution exceeds call depth") } @@ -95,7 +95,7 @@ func newInvocationContext(rt *VM, gasIpld ipfscbor.IpldStore, topLevel *topLevel } msg.From = resF - if rt.NtwkVersion() > network.Version3 { + if rt.NetworkVersion() > network.Version3 { resT, _ := rt.normalizeAddress(msg.To) // may be set to undef if recipient doesn't exist yet msg.To = resT @@ -228,7 +228,7 @@ func (ctx *invocationContext) invoke() (ret []byte, errcode exitcode.ExitCode) { // 1. load target actor // Note: we replace the "To" address with the normalized version _, toIDAddr := ctx.resolveTarget(ctx.originMsg.To) - if ctx.vm.NtwkVersion() > network.Version3 { + if ctx.vm.NetworkVersion() > network.Version3 { ctx.msg.To = toIDAddr } @@ -261,7 +261,7 @@ func (ctx *invocationContext) invoke() (ret []byte, errcode exitcode.ExitCode) { // dispatch adapter := newRuntimeAdapter(ctx) //runtimeAdapter{ctx: ctx} var extErr *dispatch.ExcuteError - ret, extErr = actorImpl.Dispatch(ctx.originMsg.Method, ctx.vm.NtwkVersion(), adapter, ctx.originMsg.Params) + ret, extErr = actorImpl.Dispatch(ctx.originMsg.Method, ctx.vm.NetworkVersion(), adapter, ctx.originMsg.Params) if extErr != nil { runtime.Abortf(extErr.ExitCode(), extErr.Error()) } @@ -331,7 +331,7 @@ func (ctx *invocationContext) resolveTarget(target address.Address) (*types.Acto // Don't implicitly create an account actor for an address without an associated key. runtime.Abort(exitcode.SysErrInvalidReceiver) } - ver, err := actors.VersionForNetwork(ctx.vm.NtwkVersion()) + ver, err := actors.VersionForNetwork(ctx.vm.NetworkVersion()) if err != nil { panic(err) } @@ -527,7 +527,7 @@ func (ctx *invocationContext) NewActorAddress() address.Address { // CreateActor implements runtime.ExtendedInvocationContext. func (ctx *invocationContext) CreateActor(codeID cid.Cid, addr address.Address) { - if addr == address.Undef && ctx.vm.NtwkVersion() >= network.Version7 { + if addr == address.Undef && ctx.vm.NetworkVersion() >= network.Version7 { runtime.Abortf(exitcode.SysErrorIllegalArgument, "CreateActor with Undef address") } @@ -576,7 +576,7 @@ func (ctx *invocationContext) DeleteActor(beneficiary address.Address) { if !receiverActor.Balance.IsZero() { // TODO: Should be safe to drop the version-check, // since only the paych actor called this pre-version 7, but let's leave it for now - if ctx.vm.NtwkVersion() >= network.Version7 { + if ctx.vm.NetworkVersion() >= network.Version7 { beneficiaryID, found := ctx.vm.normalizeAddress(beneficiary) if !found { runtime.Abortf(exitcode.SysErrorIllegalArgument, "beneficiary doesn't exist") diff --git a/pkg/vm/vmcontext/runtime_adapter.go b/pkg/vm/vmcontext/runtime_adapter.go index ace5ffc265..2f01cb2c88 100644 --- a/pkg/vm/vmcontext/runtime_adapter.go +++ b/pkg/vm/vmcontext/runtime_adapter.go @@ -4,10 +4,6 @@ import ( "context" "fmt" - "github.com/filecoin-project/venus/venus-shared/actors/aerrors" - - "github.com/filecoin-project/venus/venus-shared/actors/builtin" - "github.com/ipfs/go-cid" cbor2 "github.com/ipfs/go-ipld-cbor" logging "github.com/ipfs/go-log/v2" @@ -21,9 +17,17 @@ import ( "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/rt" rt0 "github.com/filecoin-project/specs-actors/actors/runtime" + rt2 "github.com/filecoin-project/specs-actors/v2/actors/runtime" + rt3 "github.com/filecoin-project/specs-actors/v3/actors/runtime" + rt4 "github.com/filecoin-project/specs-actors/v4/actors/runtime" rt5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" + rt6 "github.com/filecoin-project/specs-actors/v6/actors/runtime" + rt7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" + "github.com/filecoin-project/venus/pkg/vm/gas" "github.com/filecoin-project/venus/pkg/vm/runtime" + "github.com/filecoin-project/venus/venus-shared/actors/aerrors" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/types" ) @@ -41,8 +45,13 @@ func init() { var actorLog = logging.Logger("vm.actors") -var _ rt5.Runtime = (*runtimeAdapter)(nil) var _ rt0.Runtime = (*runtimeAdapter)(nil) +var _ rt2.Runtime = (*runtimeAdapter)(nil) +var _ rt3.Runtime = (*runtimeAdapter)(nil) +var _ rt4.Runtime = (*runtimeAdapter)(nil) +var _ rt5.Runtime = (*runtimeAdapter)(nil) +var _ rt6.Runtime = (*runtimeAdapter)(nil) +var _ rt7.Runtime = (*runtimeAdapter)(nil) type runtimeAdapter struct { ctx *invocationContext @@ -149,7 +158,7 @@ func (a *runtimeAdapter) StorePut(x cbor.Marshaler) cid.Cid { } func (a *runtimeAdapter) NetworkVersion() network.Version { - return a.stateView.GetNtwkVersion(a.Context(), a.CurrEpoch()) + return a.stateView.GetNetworkVersion(a.Context(), a.CurrEpoch()) } func (a *runtimeAdapter) GetRandomnessFromBeacon(personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) abi.Randomness { diff --git a/pkg/vm/vmcontext/syscalls.go b/pkg/vm/vmcontext/syscalls.go index b710783fa8..e3ca994c94 100644 --- a/pkg/vm/vmcontext/syscalls.go +++ b/pkg/vm/vmcontext/syscalls.go @@ -10,8 +10,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" - rt5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + rt7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/pkg/crypto" @@ -24,7 +24,7 @@ type SyscallsStateView interface { ResolveToKeyAddr(ctx context.Context, address address.Address) (address.Address, error) MinerInfo(ctx context.Context, maddr address.Address, nv network.Version) (*miner.MinerInfo, error) TotalFilCircSupply(height abi.ChainEpoch, st vmState.Tree) (abi.TokenAmount, error) - GetNtwkVersion(ctx context.Context, ce abi.ChainEpoch) network.Version + GetNetworkVersion(ctx context.Context, ce abi.ChainEpoch) network.Version } // Syscall implementation interface. @@ -32,12 +32,13 @@ type SyscallsStateView interface { type SyscallsImpl interface { VerifySignature(ctx context.Context, view SyscallsStateView, signature crypto.Signature, signer address.Address, plaintext []byte) error HashBlake2b(data []byte) [32]byte - ComputeUnsealedSectorCID(ctx context.Context, proof5 abi.RegisteredSealProof, pieces []abi.PieceInfo) (cid.Cid, error) - VerifySeal(ctx context.Context, info proof5.SealVerifyInfo) error - BatchVerifySeals(ctx context.Context, vis map[address.Address][]proof5.SealVerifyInfo) (map[address.Address][]bool, error) - VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) error - VerifyPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) error - VerifyConsensusFault(ctx context.Context, h1, h2, extra []byte, curEpoch abi.ChainEpoch, msg VmMessage, gasIpld cbornode.IpldStore, view SyscallsStateView, getter LookbackStateGetter) (*rt5.ConsensusFault, error) + ComputeUnsealedSectorCID(ctx context.Context, proof7 abi.RegisteredSealProof, pieces []abi.PieceInfo) (cid.Cid, error) + VerifySeal(ctx context.Context, info proof7.SealVerifyInfo) error + BatchVerifySeals(ctx context.Context, vis map[address.Address][]proof7.SealVerifyInfo) (map[address.Address][]bool, error) + VerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) error + VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) error + VerifyPoSt(ctx context.Context, info proof7.WindowPoStVerifyInfo) error + VerifyConsensusFault(ctx context.Context, h1, h2, extra []byte, curEpoch abi.ChainEpoch, msg VmMessage, gasIpld cbornode.IpldStore, view SyscallsStateView, getter LookbackStateGetter) (*rt7.ConsensusFault, error) } type syscalls struct { @@ -50,7 +51,7 @@ type syscalls struct { stateView SyscallsStateView } -var _ rt5.Syscalls = (*syscalls)(nil) +var _ rt7.Syscalls = (*syscalls)(nil) func (sys syscalls) VerifySignature(signature crypto.Signature, signer address.Address, plaintext []byte) error { charge, err := sys.pricelist.OnVerifySignature(signature.Type, len(plaintext)) @@ -71,24 +72,24 @@ func (sys syscalls) ComputeUnsealedSectorCID(proof abi.RegisteredSealProof, piec return sys.impl.ComputeUnsealedSectorCID(sys.vm.context, proof, pieces) } -func (sys syscalls) VerifySeal(info proof5.SealVerifyInfo) error { +func (sys syscalls) VerifySeal(info proof7.SealVerifyInfo) error { sys.gasTank.Charge(sys.pricelist.OnVerifySeal(info), "VerifySeal") return sys.impl.VerifySeal(sys.vm.context, info) } -func (sys syscalls) VerifyPoSt(info proof5.WindowPoStVerifyInfo) error { +func (sys syscalls) VerifyPoSt(info proof7.WindowPoStVerifyInfo) error { sys.gasTank.Charge(sys.pricelist.OnVerifyPost(info), "VerifyWindowPoSt") return sys.impl.VerifyPoSt(sys.vm.context, info) } -func (sys syscalls) VerifyConsensusFault(h1, h2, extra []byte) (*rt5.ConsensusFault, error) { +func (sys syscalls) VerifyConsensusFault(h1, h2, extra []byte) (*rt7.ConsensusFault, error) { sys.gasTank.Charge(sys.pricelist.OnVerifyConsensusFault(), "VerifyConsensusFault") return sys.impl.VerifyConsensusFault(sys.vm.context, h1, h2, extra, sys.vm.currentEpoch, sys.vmMsg, sys.gasBlockStore, sys.stateView, sys.vm.vmOption.LookbackStateGetter) } var BatchSealVerifyParallelism = 2 * goruntime.NumCPU() -func (sys syscalls) BatchVerifySeals(vis map[address.Address][]proof5.SealVerifyInfo) (map[address.Address][]bool, error) { +func (sys syscalls) BatchVerifySeals(vis map[address.Address][]proof7.SealVerifyInfo) (map[address.Address][]bool, error) { out := make(map[address.Address][]bool) sema := make(chan struct{}, BatchSealVerifyParallelism) @@ -100,7 +101,7 @@ func (sys syscalls) BatchVerifySeals(vis map[address.Address][]proof5.SealVerify for i, s := range seals { wg.Add(1) - go func(ma address.Address, ix int, svi proof5.SealVerifyInfo, res []bool) { + go func(ma address.Address, ix int, svi proof7.SealVerifyInfo, res []bool) { defer wg.Done() sema <- struct{}{} @@ -120,7 +121,12 @@ func (sys syscalls) BatchVerifySeals(vis map[address.Address][]proof5.SealVerify return out, nil } -func (sys *syscalls) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) error { +func (sys *syscalls) VerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) error { sys.gasTank.Charge(sys.pricelist.OnVerifyAggregateSeals(aggregate), "VerifyAggregateSeals") return sys.impl.VerifyAggregateSeals(aggregate) } + +func (sys *syscalls) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) error { + sys.gasTank.Charge(sys.pricelist.OnVerifyReplicaUpdate(update), "OnVerifyReplicaUpdate") + return sys.impl.VerifyReplicaUpdate(update) +} diff --git a/pkg/vm/vmcontext/syscallsStateView.go b/pkg/vm/vmcontext/syscallsStateView.go index bff43c698d..6712039915 100644 --- a/pkg/vm/vmcontext/syscallsStateView.go +++ b/pkg/vm/vmcontext/syscallsStateView.go @@ -71,12 +71,12 @@ func (vm *syscallsStateView) MinerInfo(ctx context.Context, maddr address.Addres return &minerInfo, nil } -//GetNtwkVersion get network version -func (vm *syscallsStateView) GetNtwkVersion(ctx context.Context, ce abi.ChainEpoch) network.Version { - return vm.vmOption.NtwkVersionGetter(ctx, ce) +//GetNetworkVersion get network version +func (vm *syscallsStateView) GetNetworkVersion(ctx context.Context, ce abi.ChainEpoch) network.Version { + return vm.vmOption.NetworkVersion } -//GetNtwkVersion get network version +//GetNetworkVersion get network version func (vm *syscallsStateView) TotalFilCircSupply(height abi.ChainEpoch, st tree.Tree) (abi.TokenAmount, error) { return vm.GetCircSupply(context.TODO()) } diff --git a/pkg/vm/vmcontext/types.go b/pkg/vm/vmcontext/types.go index 8f9a339356..e94c152546 100644 --- a/pkg/vm/vmcontext/types.go +++ b/pkg/vm/vmcontext/types.go @@ -21,13 +21,12 @@ import ( type ExecCallBack func(cid.Cid, VmMessage, *Ret) error type CircSupplyCalculator func(context.Context, abi.ChainEpoch, tree.Tree) (abi.TokenAmount, error) -type NtwkVersionGetter func(context.Context, abi.ChainEpoch) network.Version type LookbackStateGetter func(context.Context, abi.ChainEpoch) (*state.View, error) type VmOption struct { //nolint CircSupplyCalculator CircSupplyCalculator LookbackStateGetter LookbackStateGetter - NtwkVersionGetter NtwkVersionGetter + NetworkVersion network.Version Rnd HeadChainRandomness BaseFee abi.TokenAmount Fork fork.IFork @@ -47,7 +46,7 @@ type ILookBack interface { func LookbackStateGetterForTipset(ctx context.Context, backer ILookBack, fork fork.IFork, ts *types.TipSet) LookbackStateGetter { return func(ctx context.Context, round abi.ChainEpoch) (*state.View, error) { - ver := fork.GetNtwkVersion(ctx, round) + ver := fork.GetNetworkVersion(ctx, round) ts, _, err := backer.GetLookbackTipSetForRound(ctx, ts, round, ver) if err != nil { return nil, err diff --git a/pkg/vm/vmcontext/vmcontext.go b/pkg/vm/vmcontext/vmcontext.go index cab3d8503e..924a4ee0b8 100644 --- a/pkg/vm/vmcontext/vmcontext.go +++ b/pkg/vm/vmcontext/vmcontext.go @@ -642,7 +642,7 @@ func (vm *VM) applyMessage(msg *types.Message, onChainMsgSize int) (*Ret, error) } func (vm *VM) shouldBurn(ctx context.Context, msg *types.Message, errcode exitcode.ExitCode) (bool, error) { - if vm.NtwkVersion() <= network.Version12 { + if vm.NetworkVersion() <= network.Version12 { // Check to see if we should burn funds. We avoid burning on successful // window post. This won't catch _indirect_ window post calls, but this // is the best we can get for now. @@ -748,8 +748,8 @@ func (vm *VM) SetCurrentEpoch(current abi.ChainEpoch) error { return nil } -func (vm *VM) NtwkVersion() network.Version { - return vm.vmOption.NtwkVersionGetter(context.TODO(), vm.currentEpoch) +func (vm *VM) NetworkVersion() network.Version { + return vm.vmOption.NetworkVersion } func (vm *VM) transferToGasHolder(addr address.Address, gasHolder *types.Actor, amt abi.TokenAmount) error { @@ -789,7 +789,7 @@ func (vm *VM) StateTree() tree.Tree { func (vm *VM) GetCircSupply(ctx context.Context) (abi.TokenAmount, error) { // Before v15, this was recalculated on each invocation as the state tree was mutated - if vm.vmOption.NtwkVersionGetter(ctx, vm.vmOption.Epoch) <= network.Version14 { + if vm.vmOption.NetworkVersion <= network.Version14 { return vm.vmOption.CircSupplyCalculator(ctx, vm.vmOption.Epoch, vm.State) } diff --git a/tools/conformance/driver.go b/tools/conformance/driver.go index ccfce3107a..e78331989e 100644 --- a/tools/conformance/driver.go +++ b/tools/conformance/driver.go @@ -114,12 +114,13 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, chainDs ds.Batching, pr return nil, err } var ( + ctx = context.Background() vmOption = vm.VmOption{ CircSupplyCalculator: func(context.Context, abi.ChainEpoch, tree.Tree) (abi.TokenAmount, error) { return big.Zero(), nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(context.TODO(), chainStore, chainFork, nil), - NtwkVersionGetter: chainFork.GetNtwkVersion, + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, chainStore, chainFork, nil), + NetworkVersion: chainFork.GetNetworkVersion(ctx, execEpoch), Rnd: NewFixedRand(), BaseFee: big.NewFromGo(&tipset.BaseFee), Fork: chainFork, @@ -131,7 +132,7 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, chainDs ds.Batching, pr } ) - lvm, err := vm.NewVM(context.Background(), vmOption) + lvm, err := vm.NewVM(ctx, vmOption) if err != nil { return nil, err } @@ -258,12 +259,13 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP return nil, cid.Undef, err } var ( + ctx = context.Background() vmOption = vm.VmOption{ CircSupplyCalculator: func(ctx context.Context, epoch abi.ChainEpoch, tree tree.Tree) (abi.TokenAmount, error) { return params.CircSupply, nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(context.TODO(), chainStore, chainFork, nil), - NtwkVersionGetter: chainFork.GetNtwkVersion, + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, chainStore, chainFork, nil), + NetworkVersion: chainFork.GetNetworkVersion(ctx, params.Epoch), Rnd: params.Rand, BaseFee: params.BaseFee, Fork: chainFork, @@ -276,7 +278,7 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP } ) - lvm, err := vm.NewVM(context.TODO(), vmOption) + lvm, err := vm.NewVM(ctx, vmOption) if err != nil { return nil, cid.Undef, err } diff --git a/tools/gengen/util/generator.go b/tools/gengen/util/generator.go index 3b973e6436..9dd19f3887 100644 --- a/tools/gengen/util/generator.go +++ b/tools/gengen/util/generator.go @@ -84,18 +84,16 @@ func NewGenesisGenerator(bs blockstore.Blockstore) *GenesisGenerator { vmOption := vm.VmOption{ CircSupplyCalculator: csc, - NtwkVersionGetter: func(ctx context.Context, epoch abi.ChainEpoch) network.Version { - return network.Version6 - }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(context.TODO(), chainStore, chainFork, nil), - Rnd: chainRand, - BaseFee: abi.NewTokenAmount(InitialBaseFee), - Epoch: 0, - GasPriceSchedule: gas.NewPricesSchedule(config.DefaultForkUpgradeParam), - Bsstore: bs, - PRoot: cid.Undef, - SysCallsImpl: syscallImpl, - Fork: chainFork, + NetworkVersion: network.Version6, + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(context.TODO(), chainStore, chainFork, nil), + Rnd: chainRand, + BaseFee: abi.NewTokenAmount(InitialBaseFee), + Epoch: 0, + GasPriceSchedule: gas.NewPricesSchedule(config.DefaultForkUpgradeParam), + Bsstore: bs, + PRoot: cid.Undef, + SysCallsImpl: syscallImpl, + Fork: chainFork, } vm, err := vm.NewVM(context.Background(), vmOption) if err != nil { From 72ee5c6a13af8187d2a63ca650375a71c258b163 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Mon, 10 Jan 2022 18:02:31 +0800 Subject: [PATCH 109/167] more inline template (#4691) --- pkg/chain/utils.go | 1 - pkg/vm/vmcontext/runtime_adapter.go | 14 ++++++++++++++ pkg/vm/vmcontext/syscalls.go | 28 +++++++++++++++++++++++++++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/pkg/chain/utils.go b/pkg/chain/utils.go index 924fddee5a..533f6318f7 100644 --- a/pkg/chain/utils.go +++ b/pkg/chain/utils.go @@ -26,7 +26,6 @@ import ( exported5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/exported" exported6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/exported" exported7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/exported" - /* inline-gen end */ "github.com/filecoin-project/venus/venus-shared/actors/builtin" diff --git a/pkg/vm/vmcontext/runtime_adapter.go b/pkg/vm/vmcontext/runtime_adapter.go index 2f01cb2c88..fb28259254 100644 --- a/pkg/vm/vmcontext/runtime_adapter.go +++ b/pkg/vm/vmcontext/runtime_adapter.go @@ -16,6 +16,12 @@ import ( "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/rt" + + /* inline-gen template + {{range .actorVersions}} + rt{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/runtime"{{end}} + /* inline-gen start */ + rt0 "github.com/filecoin-project/specs-actors/actors/runtime" rt2 "github.com/filecoin-project/specs-actors/v2/actors/runtime" rt3 "github.com/filecoin-project/specs-actors/v3/actors/runtime" @@ -23,6 +29,7 @@ import ( rt5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" rt6 "github.com/filecoin-project/specs-actors/v6/actors/runtime" rt7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" + /* inline-gen end */ "github.com/filecoin-project/venus/pkg/vm/gas" "github.com/filecoin-project/venus/pkg/vm/runtime" @@ -45,6 +52,11 @@ func init() { var actorLog = logging.Logger("vm.actors") +/* inline-gen template +{{range .actorVersions}} +var _ rt{{.}}.Runtime = (*runtimeAdapter)(nil){{end}} +/* inline-gen start */ + var _ rt0.Runtime = (*runtimeAdapter)(nil) var _ rt2.Runtime = (*runtimeAdapter)(nil) var _ rt3.Runtime = (*runtimeAdapter)(nil) @@ -53,6 +65,8 @@ var _ rt5.Runtime = (*runtimeAdapter)(nil) var _ rt6.Runtime = (*runtimeAdapter)(nil) var _ rt7.Runtime = (*runtimeAdapter)(nil) +/* inline-gen end */ + type runtimeAdapter struct { ctx *invocationContext syscalls diff --git a/pkg/vm/vmcontext/syscalls.go b/pkg/vm/vmcontext/syscalls.go index e3ca994c94..400c951ded 100644 --- a/pkg/vm/vmcontext/syscalls.go +++ b/pkg/vm/vmcontext/syscalls.go @@ -10,10 +10,23 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" - rt7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/ipfs/go-cid" + /* inline-gen template + {{range .actorVersions}} + rt{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/runtime"{{end}} + /* inline-gen start */ + + rt0 "github.com/filecoin-project/specs-actors/actors/runtime" + rt2 "github.com/filecoin-project/specs-actors/v2/actors/runtime" + rt3 "github.com/filecoin-project/specs-actors/v3/actors/runtime" + rt4 "github.com/filecoin-project/specs-actors/v4/actors/runtime" + rt5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" + rt6 "github.com/filecoin-project/specs-actors/v6/actors/runtime" + rt7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" + /* inline-gen end */ + "github.com/filecoin-project/venus/pkg/crypto" vmState "github.com/filecoin-project/venus/pkg/state/tree" "github.com/filecoin-project/venus/pkg/vm/gas" @@ -51,8 +64,21 @@ type syscalls struct { stateView SyscallsStateView } +/* inline-gen template +{{range .actorVersions}} +var _ rt{{.}}.Syscalls = (*syscalls)(nil){{end}} +/* inline-gen start */ + +var _ rt0.Syscalls = (*syscalls)(nil) +var _ rt2.Syscalls = (*syscalls)(nil) +var _ rt3.Syscalls = (*syscalls)(nil) +var _ rt4.Syscalls = (*syscalls)(nil) +var _ rt5.Syscalls = (*syscalls)(nil) +var _ rt6.Syscalls = (*syscalls)(nil) var _ rt7.Syscalls = (*syscalls)(nil) +/* inline-gen end */ + func (sys syscalls) VerifySignature(signature crypto.Signature, signer address.Address, plaintext []byte) error { charge, err := sys.pricelist.OnVerifySignature(signature.Type, len(plaintext)) if err != nil { From 97bf1fb9dbb3d36b13ae3977f3113e0a0154b2cc Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Tue, 11 Jan 2022 09:41:50 +0800 Subject: [PATCH 110/167] test vector runner fixes for v6 vectors (#4692) --- pkg/fork/fork.go | 4 +-- pkg/vm/gas/gascost.go | 5 ++++ tools/conformance/driver.go | 53 ++++++++++++++++++++++++++++++++----- tools/conformance/runner.go | 15 ++++++----- 4 files changed, 63 insertions(+), 14 deletions(-) diff --git a/pkg/fork/fork.go b/pkg/fork/fork.go index 04075f701e..433251cf3f 100644 --- a/pkg/fork/fork.go +++ b/pkg/fork/fork.go @@ -142,7 +142,7 @@ func (ml migrationLogger) Log(level rt.LogLevel, msg string, args ...interface{} } } -func defaultUpgradeSchedule(cf *ChainFork, upgradeHeight *config.ForkUpgradeConfig) UpgradeSchedule { +func DefaultUpgradeSchedule(cf *ChainFork, upgradeHeight *config.ForkUpgradeConfig) UpgradeSchedule { var us UpgradeSchedule updates := []Upgrade{{ @@ -411,7 +411,7 @@ func NewChainFork(ctx context.Context, cr chainReader, ipldstore cbor.IpldStore, } // If we have upgrades, make sure they're in-order and make sense. - us := defaultUpgradeSchedule(fork, networkParams.ForkUpgradeParam) + us := DefaultUpgradeSchedule(fork, networkParams.ForkUpgradeParam) if err := us.Validate(); err != nil { return nil, err } diff --git a/pkg/vm/gas/gascost.go b/pkg/vm/gas/gascost.go index b8f85f3ba9..f5e8f5181b 100644 --- a/pkg/vm/gas/gascost.go +++ b/pkg/vm/gas/gascost.go @@ -218,6 +218,11 @@ func NewPricesSchedule(forkParams *config.ForkUpgradeConfig) *PricesSchedule { return &PricesSchedule{prices: prices} } +// SetPricelist set new prices, for test +func (schedule *PricesSchedule) SetPricelist(newPrices map[abi.ChainEpoch]Pricelist) { + schedule.prices = newPrices +} + // PricelistByEpoch finds the latest prices for the given epoch func (schedule *PricesSchedule) PricelistByEpoch(epoch abi.ChainEpoch) Pricelist { // since we are storing the prices as map or epoch to price diff --git a/tools/conformance/driver.go b/tools/conformance/driver.go index e78331989e..82640298c5 100644 --- a/tools/conformance/driver.go +++ b/tools/conformance/driver.go @@ -2,6 +2,8 @@ package conformance import ( "context" + "fmt" + "math" gobig "math/big" "os" @@ -27,6 +29,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/test-vectors/schema" "github.com/filecoin-project/venus/tools/conformance/chaos" "github.com/filecoin-project/venus/venus-shared/types" @@ -216,15 +219,50 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, chainDs ds.Batching, pr } type ExecuteMessageParams struct { - Preroot cid.Cid - Epoch abi.ChainEpoch - Message *types.Message - CircSupply abi.TokenAmount - BaseFee abi.TokenAmount + Preroot cid.Cid + Epoch abi.ChainEpoch + Message *types.Message + CircSupply abi.TokenAmount + BaseFee abi.TokenAmount + NetworkVersion network.Version Rand vmcontext.HeadChainRandomness } +// adjustGasPricing adjusts the global gas price mapping to make sure that the +// gas pricelist for vector's network version is used at the vector's epoch. +// Because it manipulates a global, it returns a function that reverts the +// change. The caller MUST invoke this function or the test vector runner will +// become invalid. +func adjustGasPricing(vectorEpoch abi.ChainEpoch, vectorNv network.Version, priceSchedule *gas.PricesSchedule, upgradeSchedule fork.UpgradeSchedule) { + // Resolve the epoch at which the vector network version kicks in. + var epoch abi.ChainEpoch = math.MaxInt64 + if vectorNv == network.Version0 { + // genesis is not an upgrade. + epoch = 0 + } else { + for _, u := range upgradeSchedule { + if u.Network == vectorNv { + epoch = u.Height + break + } + } + } + + if epoch == math.MaxInt64 { + panic(fmt.Sprintf("could not resolve network version %d to height", vectorNv)) + } + + // Find the right pricelist for this network version. + pricelist := priceSchedule.PricelistByEpoch(epoch) + + // Override the pricing mapping by setting the relevant pricelist for the + // network version at the epoch where the vector runs. + priceSchedule.SetPricelist(map[abi.ChainEpoch]gas.Pricelist{ + vectorEpoch: pricelist, + }) +} + // ExecuteMessage executes a conformance test vector message in a temporary VM. func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageParams) (*vm.Ret, cid.Cid, error) { if !d.vmFlush { @@ -265,7 +303,7 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP return params.CircSupply, nil }, LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, chainStore, chainFork, nil), - NetworkVersion: chainFork.GetNetworkVersion(ctx, params.Epoch), + NetworkVersion: params.NetworkVersion, Rnd: params.Rand, BaseFee: params.BaseFee, Fork: chainFork, @@ -278,6 +316,9 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP } ) + // Monkey patch the gas pricing. + adjustGasPricing(params.Epoch, params.NetworkVersion, vmOption.GasPriceSchedule, fork.DefaultUpgradeSchedule(chainFork, mainNetParams.Network.ForkUpgradeParam)) + lvm, err := vm.NewVM(ctx, vmOption) if err != nil { return nil, cid.Undef, err diff --git a/tools/conformance/runner.go b/tools/conformance/runner.go index 9e6c64f99b..88d09348f0 100644 --- a/tools/conformance/runner.go +++ b/tools/conformance/runner.go @@ -11,6 +11,7 @@ import ( "os/exec" "strconv" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/venus-shared/types" @@ -34,6 +35,7 @@ func ExecuteMessageVector(r Reporter, v string, vector *schema.TestVector, varia var ( ctx = context.Background() baseEpoch = variant.Epoch + nv = network.Version(variant.NetworkVersion) root = vector.Pre.StateTree.RootCID ) @@ -60,12 +62,13 @@ func ExecuteMessageVector(r Reporter, v string, vector *schema.TestVector, varia // Execute the message. var ret *vm.Ret ret, root, err = driver.ExecuteMessage(bs, ExecuteMessageParams{ - Preroot: root, - Epoch: abi.ChainEpoch(baseEpoch), - Message: msg, - BaseFee: BaseFeeOrDefault(vector.Pre.BaseFee), - CircSupply: CircSupplyOrDefault(vector.Pre.CircSupply), - Rand: NewReplayingRand(r, vector.Randomness), + Preroot: root, + Epoch: abi.ChainEpoch(baseEpoch), + Message: msg, + BaseFee: BaseFeeOrDefault(vector.Pre.BaseFee), + CircSupply: CircSupplyOrDefault(vector.Pre.CircSupply), + Rand: NewReplayingRand(r, vector.Randomness), + NetworkVersion: nv, }) if err != nil { r.Fatalf("fatal failure when executing message: %s", err) From eba7c82e4b1bc136d001ebb37c6dcc9f98c0be73 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Tue, 11 Jan 2022 10:04:22 +0800 Subject: [PATCH 111/167] add gas charge for VerifyReplicaUpdate (#4693) --- pkg/vm/gas/gascost.go | 1 + pkg/vm/gas/pricelistV0.go | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/vm/gas/gascost.go b/pkg/vm/gas/gascost.go index f5e8f5181b..6c2cee8ffa 100644 --- a/pkg/vm/gas/gascost.go +++ b/pkg/vm/gas/gascost.go @@ -213,6 +213,7 @@ func NewPricesSchedule(forkParams *config.ForkUpgradeConfig) *PricesSchedule { }, verifyPostDiscount: false, verifyConsensusFault: 495422, + verifyReplicaUpdate: 36316136, }, } return &PricesSchedule{prices: prices} diff --git a/pkg/vm/gas/pricelistV0.go b/pkg/vm/gas/pricelistV0.go index a8acbb1cf9..8edc7e9711 100644 --- a/pkg/vm/gas/pricelistV0.go +++ b/pkg/vm/gas/pricelistV0.go @@ -120,6 +120,7 @@ type pricelistV0 struct { verifyPostLookup map[abi.RegisteredPoStProof]scalingCost verifyPostDiscount bool verifyConsensusFault int64 + verifyReplicaUpdate int64 } var _ Pricelist = (*pricelistV0)(nil) @@ -229,8 +230,7 @@ func (pl *pricelistV0) OnVerifyAggregateSeals(aggregate proof7.AggregateSealVeri // OnVerifyReplicaUpdate func (pl *pricelistV0) OnVerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) GasCharge { - // TODO: do the thing - return GasCharge{} + return NewGasCharge("OnVerifyReplicaUpdate", pl.verifyReplicaUpdate, 0) } // OnVerifyPost From 2a450369e02ab46017d0ca3df0418da441eeef45 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Tue, 11 Jan 2022 10:30:53 +0800 Subject: [PATCH 112/167] mod: update go-paramfetch (#4694) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 31c20e750d..10ad230244 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543 - github.com/filecoin-project/go-paramfetch v0.0.2 + github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 diff --git a/go.sum b/go.sum index db5d1ec517..1b0a249088 100644 --- a/go.sum +++ b/go.sum @@ -336,8 +336,8 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBw github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543 h1:aMJGfgqe1QDhAVwxRg5fjCRF533xHidiKsugk7Vvzug= github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543/go.mod h1:mjrHv1cDGJWDlGmC0eDc1E5VJr8DmL9XMUcaFwiuKg8= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= -github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= -github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 h1:+nripp+UI/rhl01w9Gs4V0XDGaVPYPMGU/D/gNVLue0= +github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= From 09a81f69b3f4e61249ec595095acc3c4c0723f9d Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Wed, 12 Jan 2022 10:51:58 +0800 Subject: [PATCH 113/167] add temp snap params (#4697) --- Makefile | 4 +- fixtures/_assets/proof-params/parameters.json | 50 ++++++++++++++++ fixtures/asset/asset.go | 59 ++++++++----------- 3 files changed, 77 insertions(+), 36 deletions(-) diff --git a/Makefile b/Makefile index 36460767a2..82e262ea1b 100644 --- a/Makefile +++ b/Makefile @@ -45,9 +45,9 @@ compare-api: gen-asset: go-bindata -pkg=asset -o ./fixtures/asset/asset.go ./fixtures/_assets/car/ ./fixtures/_assets/proof-params/ ./fixtures/_assets/arch-diagram.monopic + gofmt -s -l -w ./fixtures/asset/asset.go - -### shared module ### +### devtool ### cborgen: cd venus-devtool && go run ./cborgen/*.go diff --git a/fixtures/_assets/proof-params/parameters.json b/fixtures/_assets/proof-params/parameters.json index 1d45844545..c991c7e184 100644 --- a/fixtures/_assets/proof-params/parameters.json +++ b/fixtures/_assets/proof-params/parameters.json @@ -1,4 +1,54 @@ { + "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-61fa69f38b9cc771ba27b670124714b4ea77fbeae05e377fb859c4a43b73a30c.params": { + "cid": "Qma5WL6abSqYg9uUQAZ3EHS286bsNsha7oAGsJBD48Bq2q", + "digest": "c3ad7bb549470b82ad52ed070aebb4f4", + "sector_size": 536870912 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-61fa69f38b9cc771ba27b670124714b4ea77fbeae05e377fb859c4a43b73a30c.vk": { + "cid": "QmUa7f9JtJMsqJJ3s3ZXk6WyF4xJLE8FiqYskZGgk8GCDv", + "digest": "994c5b7d450ca9da348c910689f2dc7f", + "sector_size": 536870912 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-92180959e1918d26350b8e6cfe217bbdd0a2d8de51ebec269078b364b715ad63.params": { + "cid": "QmQiT4qBGodrVNEgVTDXxBNDdPbaD8Ag7Sx3ZTq1zHX79S", + "digest": "5aedd2cf3e5c0a15623d56a1b43110ad", + "sector_size": 8388608 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-92180959e1918d26350b8e6cfe217bbdd0a2d8de51ebec269078b364b715ad63.vk": { + "cid": "QmdcpKUQvHM8RFRVKbk1yHfEqMcBzhtFWKRp9SNEmWq37i", + "digest": "abd80269054d391a734febdac0d2e687", + "sector_size": 8388608 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-fb9e095bebdd77511c0269b967b4d87ba8b8a525edaa0e165de23ba454510194.params": { + "cid": "QmYM6Hg7mjmvA3ZHTsqkss1fkdyDju5dDmLiBZGJ5pz9y9", + "digest": "311f92a3e75036ced01b1c0025f1fa0c", + "sector_size": 2048 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-fb9e095bebdd77511c0269b967b4d87ba8b8a525edaa0e165de23ba454510194.vk": { + "cid": "QmaQsTLL3nc5dw6wAvaioJSBfd1jhQrA2o6ucFf7XeV74P", + "digest": "eadad9784969890d30f2749708c79771", + "sector_size": 2048 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-0-3b7f44a9362e3985369454947bc94022e118211e49fd672d52bec1cbfd599d18.params": { + "cid": "QmeNqDvsvyam4vqwCkstbxgb9S7RZEUeBDrJvBWKcpFKr6", + "digest": "532b53883ed4f794cb9d0db583d0df59", + "sector_size": 34359738368 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-0-3b7f44a9362e3985369454947bc94022e118211e49fd672d52bec1cbfd599d18.vk": { + "cid": "QmdLWr6moLUPScJZwoBckWqAeJkrBPAJPNLz8mWAfTdmXH", + "digest": "46990eb1bf5159c394a10309f269c1b6", + "sector_size": 34359738368 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-2-102e1444a7e9a97ebf1e3d6855dcc77e66c011ea66f936d9b2c508f87f2f83a7.params": { + "cid": "QmdQsi9uFhxK9cGwuK4rHuwKQoHkz6upYTCz4UdLiy1vA2", + "digest": "4223c63dbd94de1538006a14f37179e3", + "sector_size": 68719476736 + }, + "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-2-102e1444a7e9a97ebf1e3d6855dcc77e66c011ea66f936d9b2c508f87f2f83a7.vk": { + "cid": "QmPirFX9wX99iMGA6zFY2CvcrdcDkj73X4MP6DLduvpbk9", + "digest": "ce39b614d788d3aef26bac1b28521d94", + "sector_size": 68719476736 + }, "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0170db1f394b35d995252228ee359194b13199d259380541dc529fb0099096b0.params": { "cid": "QmVxjFRyhmyQaZEtCh7nk2abc7LhFkzhnRX4rcHqCCpikR", "digest": "7610b9f82bfc88405b7a832b651ce2f6", diff --git a/fixtures/asset/asset.go b/fixtures/asset/asset.go index 2470e0d40e..22dda1ded4 100644 --- a/fixtures/asset/asset.go +++ b/fixtures/asset/asset.go @@ -1,4 +1,4 @@ -// Code generated for package asset by go-bindata DO NOT EDIT. (@generated) +// Code generated by go-bindata. // sources: // fixtures/_assets/car/calibnet.car // fixtures/_assets/car/devnet.car @@ -8,6 +8,8 @@ // fixtures/_assets/proof-params/parameters.json // fixtures/_assets/proof-params/srs-inner-product.json // fixtures/_assets/arch-diagram.monopic +// DO NOT EDIT! + package asset import ( @@ -54,32 +56,21 @@ type bindataFileInfo struct { modTime time.Time } -// Name return file name func (fi bindataFileInfo) Name() string { return fi.name } - -// Size return file size func (fi bindataFileInfo) Size() int64 { return fi.size } - -// Mode return file mode func (fi bindataFileInfo) Mode() os.FileMode { return fi.mode } - -// Mode return file modify time func (fi bindataFileInfo) ModTime() time.Time { return fi.modTime } - -// IsDir return file whether a directory func (fi bindataFileInfo) IsDir() bool { - return fi.mode&os.ModeDir != 0 + return false } - -// Sys return file is sys mode func (fi bindataFileInfo) Sys() interface{} { return nil } @@ -99,7 +90,7 @@ func fixtures_assetsCarCalibnetCar() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/car/calibnet.car", size: 1101076, mode: os.FileMode(420), modTime: time.Unix(1626679099, 0)} + info := bindataFileInfo{name: "fixtures/_assets/car/calibnet.car", size: 1101076, mode: os.FileMode(420), modTime: time.Unix(1624848219, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -119,7 +110,7 @@ func fixtures_assetsCarDevnetCar() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/car/devnet.car", size: 1104195, mode: os.FileMode(420), modTime: time.Unix(1624501759, 0)} + info := bindataFileInfo{name: "fixtures/_assets/car/devnet.car", size: 1104195, mode: os.FileMode(420), modTime: time.Unix(1612507520, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -139,7 +130,7 @@ func fixtures_assetsCarForcenetCar() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/car/forcenet.car", size: 1050831, mode: os.FileMode(420), modTime: time.Unix(1636009448, 0)} + info := bindataFileInfo{name: "fixtures/_assets/car/forcenet.car", size: 1050831, mode: os.FileMode(420), modTime: time.Unix(1636425432, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -159,7 +150,7 @@ func fixtures_assetsCarInteropnetCar() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/car/interopnet.car", size: 1000900, mode: os.FileMode(420), modTime: time.Unix(1626679099, 0)} + info := bindataFileInfo{name: "fixtures/_assets/car/interopnet.car", size: 1000900, mode: os.FileMode(420), modTime: time.Unix(1624848219, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -179,12 +170,12 @@ func fixtures_assetsCarNerpanetCar() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/car/nerpanet.car", size: 2637671, mode: os.FileMode(420), modTime: time.Unix(1633763138, 0)} + info := bindataFileInfo{name: "fixtures/_assets/car/nerpanet.car", size: 2637671, mode: os.FileMode(420), modTime: time.Unix(1617015079, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _fixtures_assetsProofParamsParametersJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\xd9\x49\x6f\x6a\x4b\x92\x07\xf0\xfd\xfb\x14\x57\x77\x5d\xb7\x95\x19\x39\x45\xbc\x1d\x60\x03\xc2\x80\x98\xc1\x6c\x4a\x39\x44\x9a\xe1\x31\x1e\xc0\x98\x56\x7d\xf7\x96\xab\x55\x6a\xa9\x7c\xb8\xad\x52\xbd\xeb\x76\xcb\x3b\x4b\x47\xb6\x7e\xe7\x9f\x11\x91\x71\xfe\xf3\xb7\x6f\xdf\xbe\x5f\x00\x7f\xec\x8f\xbb\x5d\xfe\xb1\xcb\x3f\x8a\xbd\x8f\x7c\x5a\x6e\xf8\x47\xf6\x7f\xfc\x11\x7c\x5c\xff\xd8\xf0\x71\xfd\x07\x9f\x8e\xcc\x3f\xf6\xbb\x82\x97\x69\xb7\xfd\xeb\xc2\x17\x0b\x3e\xfe\xc0\x1f\xe2\xfd\x47\x3a\x91\x82\xcc\x8a\x74\x50\x26\x11\x19\x30\x00\x80\xcc\xca\x90\x24\x1d\xa4\x92\x44\x09\x0c\x29\x14\x46\xcb\x14\x0d\x50\x0e\x42\x10\x09\xb2\x41\xfc\xc7\xde\x1f\xfd\xa6\xf8\xfe\xfb\xb7\xf7\xff\xe7\xdb\xb7\xef\x71\x99\xbe\xff\xfe\xed\x7b\x7f\x33\xb9\xae\xea\x83\xb7\xc5\xe6\xad\xef\xe7\x8f\xa7\xda\xc2\x6d\xd7\xe0\x43\x74\xed\x45\x7d\x7d\x5b\x6c\x07\x33\x7d\x8c\xcd\x43\xad\xb6\x5f\xae\x07\xdf\xff\xf2\xdf\x0f\xa7\xe5\x0b\x17\xa7\xf7\xe7\x9d\x95\x22\x50\x46\x08\x39\x22\x6a\x61\x82\xf3\xa8\x20\x58\x23\x23\x43\xb6\xff\x78\xa2\xe0\x78\xda\x1d\xff\x5a\x2c\x6f\xfc\xfd\xf7\x6f\x20\x34\xfe\xf6\xed\xdb\xdf\xfe\xf2\x35\x6c\x2e\xeb\x12\x97\x38\x34\xad\x79\x81\x33\x35\x4a\xa7\xf5\x63\x75\xdf\xac\xa4\xf1\xf3\x2a\x75\x1f\x0e\xb1\xed\xf2\xb4\x5f\x3f\xf5\x6f\x96\x36\xfb\xed\x19\x66\x1f\x5d\x04\x0b\x32\xf8\xfe\x27\x94\x0d\x94\x0c\x1b\x69\x38\x92\x0b\x18\x83\x23\x48\x9f\xe2\x12\x73\xd0\x59\x3a\x0c\x21\x38\x19\x33\x70\xcc\x31\x69\xf0\x31\x46\x36\x06\x03\x38\x49\xe4\x83\xce\xc1\x50\x0c\x0e\x33\x68\x54\x99\x41\x72\x56\x36\xd1\xfd\xcc\x8c\x97\x83\xab\x93\xe7\x6b\xde\x8c\x1f\x71\xa2\x9a\x54\x4c\x2b\x45\x65\xb6\xeb\x20\x3e\x0d\x34\xef\x64\xf5\xed\x72\x89\xf5\x2e\x8f\xda\x25\x99\x91\xde\x25\xed\x29\xa2\x37\x02\xbc\x26\xc7\x89\xc0\x1b\xad\xac\xf5\x59\xa9\x5c\x6e\x63\x94\x45\x27\x48\xc2\x17\x02\x2a\x0d\x4e\xae\x71\x4a\xab\xfa\x7e\x7a\xf2\x97\x5b\x7e\xbc\xcd\xf7\xad\x7c\x1b\xfa\x55\xa3\xfb\x9a\xdb\x7a\xb0\xaa\xcf\xa6\x95\x4b\x85\x46\xc3\xed\x68\xf2\x11\x47\x27\xcf\xe4\x4c\x62\x9d\x85\x94\x59\x0a\x99\x8d\x87\x8c\x36\xc9\xe4\x7d\xf0\x9f\x86\xa3\xd8\x0b\xa3\x01\x23\x25\x29\x2d\x52\x06\x65\x80\x62\x62\x05\x39\x29\xe1\x7d\x48\x46\x64\x97\x20\x92\xb2\xc6\x45\x99\x94\x35\x22\x44\xaf\x18\xd9\x13\xdf\x4f\x4f\x1c\x8e\x0e\x0f\xb1\x3e\x69\x37\x1a\x93\xe7\x9b\xdc\xae\x16\xe3\xb9\xab\xda\xbc\x7e\x3a\x55\xcf\x9b\xa2\x3d\x7e\xbd\xea\xed\x7a\x01\x30\xba\x0d\x3f\x02\x21\x44\x44\x61\x6d\x60\xb2\x18\x82\x31\xc2\x0b\xc3\x4a\xe4\x6c\x23\x68\xa9\x3e\xe3\x64\xfd\xdb\x36\xa5\xc1\x19\x8e\x6a\xb3\x3a\x2c\xf7\x8d\x8a\xca\x76\x73\x9e\xec\xec\xba\x19\x61\x3c\x18\x5e\x6d\xef\x36\xbf\x36\xc6\x87\xb3\x3b\xbf\xad\x7d\xd3\x3c\x8d\x3f\xba\xe4\x9c\x1c\x39\xc4\x64\xa5\x4e\xe0\x48\x92\x67\x13\x12\x24\xd2\xec\x63\xf8\x94\x4a\x6c\x44\x74\xca\x62\x62\x4f\x86\x14\x27\x41\x48\xec\x04\x39\x9d\x00\x05\x68\xce\x9e\x92\x34\x36\x19\x34\xc1\x31\x7b\x19\x18\x20\x00\x3b\xa3\xb2\x52\xf2\x27\x15\x87\x86\xd5\x5b\xab\x7b\x8c\xab\x41\xfd\x61\x59\x8f\xba\x11\x2b\xfb\x43\xaa\xec\xbb\xf6\x46\x33\xd7\xd9\x8f\x8f\xd6\x6e\x5a\xb0\xae\xb4\x7a\x25\x5d\x4a\x08\xe9\x24\xc7\xec\x94\xd2\xfc\xde\x0d\xb4\x72\x91\x94\xb0\xce\xfa\x8c\x50\x6e\x83\x0a\xd1\x8a\xaf\xc4\x53\x1a\x9b\xb0\x19\x77\xbc\x1a\x85\x30\x55\x33\xb3\xae\x2f\x1e\xaf\x85\x9d\xbe\xd4\xf4\x13\x4f\x47\x12\x9f\x97\x17\x3f\xd9\xcc\x1e\xd6\x55\x5b\xe9\x36\x4a\x68\x88\xdf\x0f\x51\x36\x36\x27\xaf\xc1\x39\xad\x58\x19\x61\x14\x27\x9f\x30\xc7\xcf\xa2\x01\xd2\xda\x99\x14\x0c\x28\xe7\x81\x51\x45\xc5\x06\x72\xb2\x11\x82\x50\x68\xc8\x4b\x54\x32\x69\xc3\x49\x60\xd4\x59\x99\x14\x32\x79\x14\x4a\x5a\xe3\x7f\xd2\xab\x52\xf7\xb1\x0d\x83\xd3\xa1\x6d\xa0\xd1\xef\x9e\x57\x78\xbe\xd9\xcd\x64\x65\xe6\x4a\x77\x27\xdb\xe0\x5b\xf2\xad\xf3\xb6\x90\xbb\xd9\xa9\x7a\xfd\xc8\x13\x35\x69\xa2\x10\x9c\xf5\xc2\x59\x40\xd4\x48\x36\x93\x45\xa5\x85\xca\xc6\xfc\x7f\xe1\x29\x4d\xce\x78\x39\x79\xae\xf5\xc7\x2f\x47\xfb\x2c\xd5\x7e\x5e\x3f\xa2\x8f\xd3\xfd\xb0\xa3\xaf\x97\xd1\x6c\x9c\xe2\xa5\xb1\xb9\xbe\x9d\x9b\xe1\x69\x51\xc4\x8f\x34\x4a\x27\x9d\x99\x7d\x4c\xe4\x43\xfe\x7b\xe5\x21\xce\x32\x04\x9d\x30\x27\x21\x3e\x89\xc6\x25\xa7\x28\x60\xcc\x56\x64\x19\x84\x13\xc4\xcc\x81\xd9\x39\x25\x18\xc8\x59\x54\xc6\x00\xeb\x60\x29\xfa\x60\x09\x35\x47\x01\x68\xac\x55\xd1\x38\xfc\x49\xcd\x99\xbc\xd4\x8a\x56\x7d\x30\x7b\x6a\x9f\xcf\xe3\xc5\x48\xf9\xce\xf3\xeb\xd3\xa4\xd1\xad\xd0\xf1\x81\x07\xf6\xa1\x76\x2c\x5c\xac\x30\x1e\x97\xd5\x51\x59\x9f\x72\xca\x90\xd6\x42\x69\xca\x8c\xd9\x78\x21\x2d\x3b\x43\x48\xa4\x82\xa3\x4f\x6b\xe4\xff\x36\x50\xf9\x94\x53\x51\x32\x87\xda\x74\xb7\x1a\x6e\x16\xc3\xc6\xe5\x92\xaf\x9b\xab\x7f\xae\xed\x3b\xbb\x59\x8f\xcc\xed\xb1\x4f\x45\xfb\x52\x6d\x34\xbb\xbe\xfb\x11\x27\x24\x88\xc9\x42\xb6\x26\x4a\x1f\x50\x67\x49\xd1\x83\x63\x72\xc1\x45\xa7\xe4\xa7\xe0\xfc\x9d\x47\x39\x97\x38\x59\x63\xa3\xcd\x06\x74\x96\x56\xa2\xb3\x22\xe4\xcc\x9a\x85\x97\xd1\xc8\x64\xbc\x13\x51\x9b\x77\xb8\xe4\x19\x3d\x38\x63\x8c\x53\x8a\x53\xbc\x9f\x1e\x3f\xde\xe4\xd8\x3a\xd9\xfd\xee\xb6\xc5\x6d\x3a\xc8\xd6\xa4\x7a\x6b\x0f\x56\x83\x56\x6a\x76\x46\xbd\xa4\xf3\xce\xe3\xf2\xd5\x14\xab\xea\xfc\x23\x10\xc4\xac\x89\x03\xd8\x2c\x33\x33\xe9\x88\xef\xaf\xc2\x2b\x12\x29\x05\x1d\xb1\x1c\x48\x69\x65\xc8\x29\x54\xf6\x4f\x3a\x60\x7f\x0a\x51\x69\x7e\x06\xb4\xa4\xa7\xb6\xba\x2c\x16\x95\xc3\xa8\xda\x58\xc9\xd0\xeb\xd5\x5c\xfb\xb2\xde\x9f\xae\xc7\x26\x0d\x2e\xd7\xd6\xb5\xdd\x95\x97\x4b\x51\x7d\x2c\xb9\x5e\x65\xe4\x68\x34\x68\x34\xc6\x62\xf6\x4a\x5b\x8c\xc2\x5a\xa6\xcc\x09\x21\x7c\x22\x8f\x31\xc4\x06\x65\x16\x00\x21\x68\xd6\x1c\x2d\x3b\x49\x6c\xac\x0a\x59\xb0\x00\xeb\x93\x4d\xac\x81\x8d\x8d\x12\x9d\xd4\x1e\xa2\x25\x08\x32\x20\x26\xf7\x93\x39\x39\x9d\xe2\x6d\xef\xf6\xfa\xf5\x18\x1e\x76\x79\xd3\x4c\x8d\xc5\x72\x79\xdd\xd2\xf2\x58\x89\x5d\xe7\x36\x13\xaa\x3c\x36\xe7\x55\x3f\x3a\xc9\xe5\x47\xa2\x84\x3a\x3b\xf2\xd2\x66\xd6\x82\x89\xc1\x78\x65\x19\xa4\x70\x21\xc8\xe0\xef\x94\xe7\xaf\x49\x54\x9a\xa0\x79\xed\x72\x7d\x8a\x4f\x3d\x72\x97\x87\xca\x1a\xbb\xd7\x82\x06\x32\x4f\x4f\x87\xfd\xaa\x7f\xac\x2c\x16\x79\xd6\xdb\xd5\x96\x72\xbb\x7e\xd8\xd5\x4b\xc6\xe5\x28\x80\xb4\xb2\x0e\x53\x92\x92\xd8\x12\xbb\xfc\x5e\x8a\x40\x30\xa2\xbc\x53\x9e\x7f\x01\x0f\xfc\x00\x0b\x8e\xb5\x10\x36\x58\x97\x89\x22\x67\x22\x11\x85\xd7\x2e\x19\x0d\x36\x06\xe7\x83\xf0\xc2\x27\x83\x39\x4a\x61\xa5\xd1\x2e\x64\x48\x80\x41\x50\xe2\x7c\x3f\x41\x5c\xe9\xea\xcb\xb9\xd2\x5d\xcc\x8a\x3a\x5e\x7b\xd0\xbe\x9a\x15\xb4\xed\x5b\x67\x98\x76\x2f\xed\xdb\x3e\x5e\x0e\xb5\xd6\x68\x31\x68\x3c\xc9\x92\xab\xa8\x42\x29\x82\x73\x28\x7c\x7c\x6f\x14\x14\x00\x3c\x3b\x91\x65\x26\x1d\x29\xdc\x19\x0d\x2d\x3a\x49\xda\x59\xa7\xec\x17\x22\x2a\x4d\xd0\x74\x82\xc7\xc3\xbc\x7d\x2d\xe4\xae\xdf\xa5\xd5\xb5\x3b\xdd\x6c\x47\xf2\x39\xbd\xb4\x5f\x6b\xb1\x88\x17\xd2\x93\xca\xe0\xb8\x68\x66\x39\x72\x1f\x79\x0c\x25\x08\x59\xa2\x71\x3e\x45\x43\x5e\x67\x81\x39\x66\xf0\xd9\x7b\x92\xf6\x4e\x0d\xfa\x25\x3c\xc1\x82\x20\xb4\x40\x49\x38\xd2\x96\x49\x00\x4a\x70\xec\x04\x90\xe1\x44\x64\x33\x2b\x4e\x60\x82\xc8\x94\x11\x39\x58\xf9\xce\x15\xb4\x42\xe3\xd5\x4f\xba\xd8\x64\x7d\x9c\x45\x39\x6c\xc7\xfd\x4b\x3c\xa7\x27\xd3\x02\xd3\x6c\x92\xea\x5f\x06\x74\xea\x16\x93\xc5\x64\xf4\xdc\xdc\x98\xf1\xdb\x66\x56\xb9\x95\x74\x31\xe9\x84\x27\xe9\x93\x09\x9e\x01\xd8\x5b\x99\x81\xbd\xb3\xd6\x2a\xa1\xe0\xce\xbd\xeb\x6b\x12\x95\xdf\xbd\x72\x7f\xd5\x7b\x70\x8f\xfb\xdb\x6a\x31\x6d\x6c\x2e\xd3\x4a\xf1\xd6\x85\x4d\x65\xae\x7b\xf1\x79\x51\x64\x75\x5e\x9d\x17\x63\xaa\x0d\xcf\xd5\xcd\x47\x1e\x9b\x94\x43\x92\x1a\x73\xb0\xda\xda\x24\x1c\xb3\x64\xd0\xc9\x02\xbd\xcf\xf6\xff\x1a\x4f\x71\xf2\x71\xcd\xe9\x7f\x98\x8e\xbc\xff\x63\x19\xfd\x69\xb9\xdb\xfe\xef\x53\x62\xb1\xf0\x60\xec\x3f\x7e\x27\x14\x24\x25\x15\x26\x00\x23\x2c\x47\x21\x10\x38\x39\x08\x90\x62\xf0\x12\x53\x96\xa8\x9d\x23\xa1\x59\x99\xe0\x33\x33\x42\x50\x8e\x54\x10\x16\x15\xfc\xa4\x24\x4d\x23\x77\x5e\xb6\xd3\xe7\xf6\x6e\xdf\x39\x77\x74\x65\xd7\xe8\x5c\x1a\x8f\xfe\xec\x4e\x5d\x36\xe3\x27\x54\xb3\xfa\xaa\x69\x26\x54\x95\x6e\x51\xb2\x1d\x53\x3a\x07\xa9\x14\x72\xcc\x3e\x8b\x6c\x08\x8c\xcd\x4a\xa4\xc4\x9a\x2c\xde\x59\x1d\x7e\x58\x72\x7c\x29\xaa\xd2\x60\xf9\x8d\x5f\xec\xeb\xb5\xe2\xd4\x19\x1f\x9a\x4b\x38\x34\x4e\x93\xdd\xc3\x76\x70\x2c\x66\x8b\x65\x42\x7b\x28\xf2\x65\xf7\x56\x1b\x3d\xb5\x0e\xcd\x63\x49\xef\x8f\xd2\x27\x26\x02\xf2\x89\xa5\x13\x08\x0a\xb3\x34\x46\x69\x25\xb4\xf6\x77\x2a\xf7\x2f\x65\xb2\xc1\x87\xac\x6d\x64\xa5\xb5\x67\x4d\x26\x19\x83\xec\x9c\x13\xde\xa0\x09\xa0\x10\x92\xd1\x19\xc0\xf8\x8c\x9c\x84\x22\x17\x30\xb0\x8b\x2a\xc7\xa4\x1d\xdc\x4f\xd4\x73\x75\x3f\x3a\xb9\xf6\xb4\x5b\x99\x1e\x65\x6b\x36\x5a\x4c\xcc\xe4\x3a\x73\xaf\x45\xbf\xde\x4e\xb2\xd7\x3c\x36\x9e\x27\xe1\x38\x96\x8f\xf3\x55\xad\xe4\x0c\x46\xe7\x0c\x39\x0e\x24\x7d\x20\x65\xa3\x8c\x9c\x75\xcc\x92\x38\x78\x19\xee\xac\x13\xcb\x6f\x22\x5f\xca\xab\xbc\xe3\x2d\x77\xdb\xf5\xa1\x09\x55\x3b\x9a\x2d\x2f\xb7\xea\xb0\xcf\xc3\xb7\xea\x75\xb7\xf2\xcb\x4a\x3d\xdc\x16\xab\xd3\xeb\xf3\xe0\x98\x5f\x13\x6e\x9b\x25\x53\xb7\x35\xd2\x51\xf2\x92\x72\x60\x23\x8d\x11\x0e\xac\xb3\xce\x65\x01\x08\x8a\xff\xaf\xac\x38\x26\x8b\xca\x6a\x34\x12\x7c\x90\xce\x9a\xec\x3d\x78\x93\xa5\x0e\x3e\x68\xcc\xd6\x59\xb6\x4a\x69\xeb\xb2\xf0\x1e\xbd\x4f\x3a\x18\x93\x62\x10\xd6\x40\x08\xf7\xb3\xd5\x9b\x55\x7a\xbd\x73\xff\x74\xee\xdf\xdc\xfc\xa6\x3a\xcd\x4e\xa5\xf3\x78\x2a\x9e\x5f\x0f\x1d\xb9\xa3\xa6\x8c\x45\xaf\xcd\xcb\xce\xb8\xff\x3a\x2f\xf3\x22\xb6\x12\x58\x33\x07\xe7\x05\x07\x32\xd6\x91\x47\xd4\x42\x67\xb2\xe2\x5f\xd8\xad\x7d\x29\xad\xd2\x64\x3d\xd7\xce\xcb\x7d\xfd\xed\x32\x99\xca\xc6\x6e\x95\x3a\xc7\xd5\x93\x6c\x6d\x3b\xbb\x30\x3b\x8d\xf4\x6d\x50\x9b\x17\xb2\xd6\xb8\xae\x96\xb7\x82\xa8\x64\x1f\x60\xd1\x05\x0e\xe4\x53\x48\x94\x7c\x60\xb0\xc6\x3b\x56\x16\x04\x4a\xc5\xfa\x33\xa4\xf0\x83\x14\x82\x57\xc6\x25\xc8\x10\x3d\xca\x14\xad\x0c\x41\x9b\xac\xbd\xb3\x80\xc2\x79\x4e\xcc\x32\x08\x6f\x54\x4e\x36\x6a\x76\x2e\x68\xeb\x85\x0c\x99\xb3\x43\xf8\xc9\x47\x57\xde\xbe\xec\x3b\x16\xf5\xac\xdd\xcf\x0d\x74\x46\x8f\x76\xbb\x6d\x71\x7b\x79\x7c\x81\xd0\xe7\x4a\x63\xec\xb7\xe6\x3c\x1b\x35\xc7\xfd\x5b\xab\xa4\x66\x79\x85\x28\x1c\x78\x23\x31\x66\x6d\x39\x24\x6b\x65\x36\x31\x6a\x4b\x42\xdc\xf9\x46\x74\xef\xee\xf2\xa5\xc4\xca\x77\x4d\xa4\x1e\x3b\xc7\xca\xc3\xac\xf2\x64\x6b\x6f\xcb\x61\x7e\xc4\xeb\x55\x9b\xbc\xee\xe4\x81\x3a\xdf\x9e\x1e\x7b\xb5\xcb\xbc\x26\xb7\xb0\xbe\x85\x92\x53\x18\x5d\xd0\xde\x47\x19\xb5\xc8\x29\x38\x0e\x08\x21\x2a\x63\x82\x96\x3e\xa5\x3b\x33\xc3\xaf\xd0\x82\x7f\xd2\x22\x9b\x65\xd0\x5e\xe8\x68\xa2\x91\xac\x9d\xa1\x10\x32\x80\x0e\x21\x02\x67\xe3\x35\x44\x27\x85\xc8\xf2\x7d\xae\xb0\xca\x49\x50\x59\x5a\x8f\xda\xa4\x94\xc3\x4f\x7a\xe2\xd0\xbd\xb1\x1d\x2c\xa1\x93\xeb\xb7\xda\x3a\x8e\x5b\xae\xde\xb7\xb7\xeb\xc3\xd3\xb9\x65\x5b\xb6\x8a\x6b\xd3\xeb\xba\xd7\xdb\x70\x40\x45\xc9\xc7\x6b\x89\x42\x66\xf4\xf6\xfd\x55\x89\x10\x39\x08\x11\x23\x38\x25\x75\x08\x26\xf2\x9d\x9e\xf8\xe7\xcf\xa5\xbf\x40\xac\x34\x5f\xbc\x18\x6e\x6a\xb6\xba\x38\xbe\x0c\xe6\x7e\xdd\x7b\x38\x79\xe0\xd7\x5d\x93\xb6\xbb\xa2\x7b\x4b\xab\xda\xa1\x3f\x98\x15\xdd\x7a\x77\xbc\x6e\x97\xec\x32\x3d\x12\xa2\x06\x03\x51\xe8\x08\x84\x49\x04\x15\x51\x86\x9c\x10\xb5\xb4\x77\x6a\xd7\x3f\x69\xfd\xf6\xb7\xdf\xfe\x2b\x00\x00\xff\xff\x9b\x45\x46\xd6\x29\x22\x00\x00") +var _fixtures_assetsProofParamsParametersJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x9a\x49\x6f\x23\x49\x92\x85\xef\xf5\x2b\x12\x79\x6e\x0d\x7c\x37\xb7\xbe\x91\x94\x48\x82\x1b\xc4\x9d\xe2\xa5\xe1\xe6\x6e\x2e\x2e\xc5\x35\x48\x8a\xe2\xa0\xff\xfb\x40\xd5\x68\x0c\x30\x0a\x66\x77\xa1\x33\xab\x72\x6e\x82\x80\x40\x04\xbf\x78\x6e\xcf\xec\x59\xfc\xf7\x2f\x5f\xbe\x7c\xbd\x28\xff\xc0\x9b\xfd\xe9\xfd\xa1\xe0\x78\xda\x1d\x1f\xce\xfb\x14\x4e\xfc\xb0\xe1\xe3\xfa\x57\x3e\x1d\x99\x1f\xf6\xbb\x82\x97\x69\xb7\xfd\xdb\x22\x14\x0b\x3e\x3e\xf8\x07\xf1\x20\x1e\x9c\xcc\xc1\x61\xd6\x9e\x30\x46\x00\x49\x41\x01\x39\x10\x52\x19\x90\x86\x0c\x07\x80\x4c\x1c\x58\x58\xd6\x1f\x7f\x7a\x8b\xd1\x04\xa3\x09\x74\xd0\x22\xfe\xd7\x3e\x1c\xc3\xa6\xf8\xfa\xd7\x2f\x1f\xcf\xf1\xe5\xcb\xd7\xb8\x4c\x5f\xff\xfa\xe5\x6b\x7f\x13\xec\xb4\xe3\x02\x0d\x0f\x2f\xaf\x78\x1e\xf7\x2b\x73\xfd\xd4\x1c\x2a\xef\xa8\xe8\x15\x8b\x00\xbb\x4a\xa3\x68\x55\x1f\x8d\xaf\x1e\xd4\xe1\xeb\x5f\xfe\x71\x71\x5a\xbe\x72\x71\xfa\xb8\x3e\xea\x90\x80\xc8\x1a\x34\x20\xc8\xab\x90\xac\xe2\x24\x40\x04\x26\x32\xd9\xfc\xf3\x8a\x7f\xfc\xdc\xbf\x15\xcb\x1b\x7f\xfd\xeb\x17\xab\x9d\x07\x81\x52\xfd\xf2\xe5\xcb\xdf\xff\xf2\xe7\x82\xb9\xac\x4b\xa0\x8c\x03\x64\x6c\x9d\x5a\xdd\xe2\xd0\x6a\xe9\x42\xcf\x67\x6b\x37\x7d\xaf\x9b\x6b\xab\xf3\xe4\xeb\xcb\xc3\x4b\xb1\x9e\x37\x5e\xd7\xbe\x51\x7b\xbc\x7c\x86\x82\x68\xa2\x25\x48\xc6\x8a\x18\x30\x05\x6d\x7c\x44\x29\x9c\xc7\xac\x52\x84\xfc\xc3\xa1\xa0\x92\x5e\xa0\x45\x96\x28\x7d\x52\x4e\x5b\x41\x9e\x5d\xcc\xac\x24\x10\xa5\x24\x82\x4a\x3e\xb1\x95\x4c\x1c\x95\x43\x01\x9e\xb4\x33\x04\xd2\x86\xe4\xf4\x7d\xb5\xf4\x97\x23\x73\xa8\x36\x76\xe9\x38\xe9\x3d\xbd\x4e\x46\x8f\xb3\x6b\xb5\xf7\x98\x9e\x29\x3c\xfa\xca\x2b\x0c\xaf\x7a\x3e\x3a\xc8\x5b\x73\x06\x38\xfc\x0c\xc6\x06\x4e\x49\xc5\xac\xd9\x46\x11\xa4\x75\x4a\x27\xeb\x82\x24\xa3\xa5\x14\x21\x95\x83\xf1\xda\x7b\x27\xfc\x4f\x80\xa5\x54\x2b\x29\xee\xdb\xe3\xfe\xa5\xd9\xf5\x83\xfa\x60\xd2\xa6\xb5\x7c\x6f\xe6\xa7\x43\x37\x56\x6f\x8b\x53\x7d\xda\x1e\xec\x71\xd8\x7b\xda\x4c\x0f\x1a\x96\x9f\x91\x04\x4a\x5e\x7c\xdc\xca\x9a\xa4\x51\x06\xd0\x26\x33\xa5\x10\x45\x52\xec\x3c\xfc\x60\x24\x99\x90\x05\x5a\x62\x4a\x09\xc0\x4a\x19\x3f\x1e\x86\xd0\x01\x99\xe4\x81\x82\x27\x1f\xac\xb2\x9c\x42\x10\x2c\x9d\x4d\xac\x34\x05\x63\x8d\x95\x42\xa2\xb9\xaf\x94\x97\xae\x6b\xbe\xc2\x66\xb5\xb9\x54\xf4\xbc\x39\x2a\x0e\xeb\xa2\x90\x79\x9d\xde\x1f\x57\x67\x9b\x1e\x37\x9d\x65\x75\xde\x68\xd9\xfd\x0d\xdf\xf1\x33\x16\x2d\x65\x46\x15\x34\x83\x15\xda\x45\x4e\x42\x92\x8c\x42\x28\x9b\x65\x0e\x22\x96\x63\x51\xc2\xfc\x0c\x4c\x4a\x65\x12\xfa\xc5\xa8\xd3\xd1\xdb\x68\xd3\x9b\x7b\xab\x5c\xc2\x72\xd7\x1a\x56\x73\x92\xab\x45\xff\x58\x51\x3b\x77\x8e\xf5\x0c\x33\x9e\x80\x79\xfe\xcc\x83\x43\x0a\x09\xc1\x1b\x74\xe8\x51\x24\x2d\xb2\x02\x83\x20\x7c\x04\x04\x90\x3f\x8a\xc7\x07\x11\x4d\x90\x8d\x09\xa8\x9d\x62\x8d\xde\x6a\x87\xe6\xb7\x82\x4f\x11\x8d\x50\x8a\xa5\xf4\x4a\x4a\x36\x98\x93\x03\x95\xac\x22\x8e\x32\x52\x4e\x16\x31\x49\x7f\x5f\x23\xdc\x3b\x3c\x5e\x8a\xcb\x7b\xd8\x98\xcb\xe1\xad\xb6\x2e\x4e\x74\x7d\x25\x1c\xc2\x60\xfe\x34\xe6\xea\xe3\xb1\x75\xa9\x4e\xdb\x71\x5f\x6f\x1f\x5d\x49\x35\xd1\x8a\xac\xf6\x5e\x73\x32\x19\xd0\x44\xc2\x24\x12\x59\xaf\x93\x48\xd9\x62\x39\x13\x6d\xb4\x45\xd0\x5e\xbb\x9f\x01\x4d\x79\x45\xe9\x4c\x8f\x6e\xb3\xeb\x8c\x9f\x87\xb1\x35\x7f\xdb\x55\xe3\x7a\x7a\xa8\x70\x6b\x7d\xac\x3e\x57\x5a\xcf\xbd\xce\xcd\x6f\xa6\x95\x3c\x4a\x9b\x59\xf3\x33\x16\xe3\x10\x05\x93\xa4\x6c\xa5\xc5\xa8\xd1\x04\x29\xb4\xc0\xac\x1c\x46\x49\xee\x87\x63\x51\x0f\x52\x28\x96\xc6\x98\x00\x8c\x01\x81\x29\x4b\xd6\xc9\x79\x6b\xd3\x87\x49\xb3\x73\x51\x48\xc9\xc1\xb9\x8c\xda\x25\x24\x15\xad\xf0\xd9\x43\x56\xd9\xeb\x00\xf7\x15\x93\xfa\xc5\x12\xcf\xf5\xc5\xb5\x8d\xb1\xf1\x76\x6e\x9b\x63\xf3\xfc\xd6\xee\xef\x9a\xeb\x9b\x3b\xef\x5f\x46\xb5\x9b\x19\xa7\xce\xf2\x5d\x5e\x2a\xaa\x04\x8d\x52\x3a\x3a\x9d\x28\xa1\x49\x2c\xad\xf6\x42\xb8\x20\x4d\xd6\x20\x01\x59\x97\xa3\x71\x1e\x24\x1a\x70\xa0\xdd\x4f\x80\xa6\x54\x31\xcf\xcb\x63\x7d\x86\x6f\x33\xc4\x65\xb7\x51\x71\xb7\xfa\x8b\xaa\x5d\xe2\x31\xc5\xc7\xf5\x0a\xf4\xcc\x74\x9f\xdd\x63\x27\x9d\x2f\x7b\x5a\x97\x14\xdb\xc8\x1a\xc9\x49\x93\xc0\xfb\xa4\x03\x67\xe5\x28\x44\x49\xca\x5b\x25\x13\xde\x69\xe2\xee\x61\xd9\x1f\x77\xbb\xfc\xb0\xcb\x0f\xc5\x3e\x44\x3e\x2d\x37\xfc\x90\xc3\xaf\xbf\x52\x88\xeb\x7f\x5d\x7b\x85\x04\x91\x48\x66\x8d\x86\xb4\x4d\x88\x56\x59\xa5\x94\x67\xd6\x16\x25\x1a\x92\x5a\x22\x26\x65\x51\x7b\x61\x8d\x4c\xd1\x2a\xcc\x24\x04\xa2\x40\x47\xe2\xbe\x72\x26\xd7\x55\x7d\xf0\xbe\xd8\xbc\xf7\xc3\xfc\xe9\x54\x5b\xc0\x76\xad\x02\x45\xe8\x2c\xea\xeb\xdb\x62\x3b\x98\x99\x63\x6c\x1e\x6a\xb5\xfd\x72\x3d\xf8\x8c\x08\x9c\x14\x84\xd9\x2b\xca\xd1\x7b\x23\x2c\x41\xf0\x5a\x91\xb3\x32\xb2\xca\x77\x0e\xd5\xa7\xfa\xfb\xe7\xb2\x29\x95\x4e\x1c\xda\xd6\xbc\xf0\x33\x3d\x4a\xa7\xf5\x53\x75\xdf\xac\xa4\xf1\xcb\x2a\xf5\x1e\x0f\xb1\x03\x79\xda\xaf\x9f\xfa\x37\x87\x9b\xfd\xf6\xac\x66\x9f\xb9\x88\x0f\xa7\xf4\x1f\xb7\xd0\x8e\x30\x59\xb6\xd2\x72\x44\x20\x1f\x09\x50\xdd\xe9\xe8\xbe\x33\x97\x98\xc9\x64\x09\x9e\x88\x40\xc6\xac\x38\xe6\x98\x8c\x0a\x31\x46\xb6\xd6\x93\x02\x89\x18\xc8\x64\xb2\x18\x09\x7c\x56\xc6\xeb\x8f\xa6\x8f\xf3\xc7\x11\xbb\xaf\x99\xf1\x72\x70\x05\x79\xbe\xe6\xcd\xf8\xc9\x4f\x74\x13\x8b\x69\xa5\xa8\xcc\x76\x5d\xef\xdb\x03\xc3\x3b\x59\x7d\xbf\x5c\x62\xbd\xc7\xa3\x4e\x89\x66\x64\x80\x64\x02\x46\x1f\xac\x50\xc1\x20\x70\x42\x15\xac\xd1\xce\x85\xac\xf5\xef\x1a\x03\xfe\x5c\x40\xa5\xc2\xc9\x35\x4e\x69\x55\xdf\x4f\x4f\xe1\x72\xcb\x4f\xb7\xf9\xbe\x95\x6f\xc3\xb0\x6a\xf4\xde\x72\xc7\x0c\x56\xf5\xd9\xb4\x72\xa9\xe0\x68\xb8\x1d\x4d\x4a\x4a\x71\x0a\x8c\x60\x13\x9b\x2c\xa4\xcc\x52\xc8\x6c\x83\xca\xde\x25\x99\x42\xa0\xf0\x87\xc1\xd1\x1c\x84\x35\xca\x47\x4c\x52\xfe\x36\xa2\x69\xab\x30\x26\xd6\x2a\x27\x2d\x42\xa0\x64\x45\x86\xa4\x22\x6a\x67\x21\xca\xa4\x9d\x15\x14\x83\x66\xcf\x01\xf9\xbe\x7a\xe2\x70\x74\x78\x8c\xf5\x49\xa7\xd1\x98\xbc\xdc\xe4\x76\xb5\x18\xcf\xa1\xea\xf2\xba\x7d\xaa\x9e\x37\x45\x67\xfc\x76\x35\xdb\xf5\x42\xa9\xd1\xad\x64\x56\xf2\x2a\x7a\x2f\x9c\x23\x46\xe7\x89\xac\x15\xe1\x63\x84\x15\x39\xbb\xa8\x8c\xbc\xe3\x55\xdf\xf7\x64\xfd\xc7\x6c\x4a\x85\x33\x1c\xd5\x66\x75\xb5\xdc\x37\x2a\x3a\xbb\xcd\x79\xb2\x73\xeb\x66\x54\xe3\xc1\xf0\xea\x9e\x6f\xf3\x6b\x63\x7c\x38\xc3\xf9\x7d\x1d\x9a\xb6\x3d\xfe\xcc\x25\xe7\x04\xf8\x61\x54\x1f\x86\xa5\x00\x25\x06\xb6\x94\x54\x42\xc3\x21\xde\x6b\x6f\xbe\x2f\x17\x2b\x22\x68\xe7\x13\x07\xb4\xa8\x39\x09\xf4\xc8\x20\x10\x4c\x52\x5e\x28\xc3\x39\x60\x92\xd6\x25\xeb\x2d\x01\x73\x90\xc4\x4a\x91\x62\xb0\x3a\x6b\x2d\xbf\x51\x71\x70\x58\xbd\xb5\x7a\xc7\xb8\x1a\xd4\x1f\x97\xf5\x68\x1a\xb1\xb2\x3f\xa4\xca\xbe\xe7\x6e\x38\x83\xee\x7e\x7c\x74\x6e\xd3\x52\xeb\x4a\xab\x64\x4a\x00\x21\x24\x48\x8e\x19\xb4\x36\xfc\xe1\x06\x46\x43\x44\x2d\x1c\xb8\x90\xbd\xfa\xf7\x87\xc9\x3f\x17\x4f\xa9\x6c\x68\x33\xee\x06\x3d\x22\x9a\xea\x99\x5d\xd7\x17\x4f\xd7\xc2\x4d\x5f\x6b\xa6\xcd\xd3\x91\xf4\x2f\xcb\x4b\x98\x6c\x66\x8f\xeb\xaa\xab\xf4\x1a\x25\x68\x90\x3f\x0e\x51\xb6\x2e\xa7\x60\x14\x80\xd1\xac\xad\xb0\x9a\x53\x48\x3e\xdf\x19\x28\xbf\x3f\x1a\x85\xc6\x80\x4d\x64\x95\x86\xa0\xd8\xeb\xa8\xd9\xaa\x9c\x5c\x54\x24\xb4\xb7\x18\xa4\xd7\x32\x19\xcb\x49\xf8\x68\xb2\xb6\x89\x32\x06\x2f\xb4\x74\x36\x7c\xc3\xab\x52\xef\xa9\xa3\x06\xa7\x43\xc7\xaa\x46\xbf\x77\x5e\xf9\xf3\xcd\x6d\x26\x2b\x3b\xd7\xa6\x37\xd9\x52\x68\xc9\xf7\xee\xfb\x42\xee\x66\xa7\xea\xb5\xa4\x05\x34\x68\x10\x89\xc0\x05\x01\x4e\x79\x6f\x3c\xba\x8c\xce\x6b\x23\x74\xb6\xf6\xff\x0b\x9e\xf2\x34\x6f\x39\x79\xa9\xf5\xc7\xaf\x47\xf7\x22\xf5\x7e\x5e\x3f\xfa\x10\xa7\xfb\x61\xd7\x5c\x2f\xa3\xd9\x38\xc5\x4b\x63\x73\x7d\x3f\x37\xa9\xbd\x28\x62\x49\x14\x61\x92\xc9\xcc\x21\x26\x0c\x94\x7f\xab\x3c\xc8\x59\x12\x99\xe4\x73\x12\xe2\x0f\x42\x03\x09\x34\x92\x8f\xd9\x89\x2c\x49\x80\x40\x66\x26\x66\x00\x2d\x58\x21\x38\xaf\xad\x55\x6c\xc8\x61\x0c\xe4\xd0\x1b\x8e\x42\x79\xeb\x9c\x8e\x16\xfc\x37\x6a\xce\xe4\xb5\x56\xb4\xea\x83\x59\xbb\x73\x3e\x8f\x17\x23\x1d\xba\x2f\x6f\xed\x49\xa3\x57\xc1\xe3\x23\x0f\xdc\x63\xed\x58\x40\xac\xb0\x3f\x2e\xab\xa3\x32\x9f\x02\x6d\xd1\x18\xa1\x0d\x66\xf6\xd9\x06\x21\x1d\x83\x45\x8f\xa8\x09\xee\x4c\xe1\x3f\xc0\xc8\xff\x63\x40\xe5\x5d\x4e\x45\xcb\x4c\xb5\xe9\x6e\x35\xdc\x2c\x86\x8d\xcb\x25\x5f\x37\xd7\xf0\x52\xdb\x77\x77\xb3\x67\xb4\xb7\xa7\x3e\x16\x9d\x4b\xb5\xd1\xec\x85\xde\x67\x38\x94\x54\x4c\x4e\x65\x67\xa3\x0c\xe4\x4d\x96\x18\x83\x02\x46\x20\x88\xa0\xef\xc4\x36\xdf\x19\xce\x6f\x78\x34\x40\xe2\xe4\xac\x8b\x2e\x5b\x65\xb2\x74\xd2\x83\x13\x94\x33\x1b\x16\x41\x46\x2b\x93\x0d\x20\xa2\xb1\x1f\xe0\x52\x60\x1f\x14\x58\x6b\x41\x6b\x4e\xdf\xda\x1f\x8c\x37\x39\xb6\x4e\x6e\xbf\xbb\x6d\xfd\x36\x1d\x64\x6b\x52\xbd\x75\x06\xab\x41\x2b\x35\xbb\xa3\xe7\x64\xf2\x2e\xf8\xe5\x9b\x2d\x56\xd5\xf9\x67\x40\x2a\x66\x83\x4c\xca\x65\x99\x99\xd1\x44\xff\xf1\x2a\x82\x46\x91\x12\x99\xe8\x7f\x5f\x58\xf1\xe7\x22\x2a\xd5\xcf\x00\x97\xd8\xee\xe8\xcb\x62\x51\x39\x8c\xaa\x8d\x95\xa4\xe7\xe7\x1a\x74\x2e\xeb\xfd\xe9\x7a\x6c\xe2\xe0\x72\x6d\x5d\x3b\x3d\x79\xb9\x14\xd5\xa7\x92\xf1\x2a\x7b\x8e\xd6\x28\xe3\xad\x75\x3e\x07\x6d\x9c\x8f\xc2\x39\xc6\xcc\xc9\x2b\xfa\x03\xf1\x58\x8b\x6c\xbd\xcc\x42\x29\x22\xc3\x86\xa3\x63\x90\xc8\xd6\x69\xca\x82\x85\x72\x21\xb9\xc4\x46\xb1\x75\x51\x7a\x90\x26\xa8\xe8\x50\x91\x24\xef\x13\x7c\xa3\x4f\x4e\xa7\x78\xdb\xc3\xde\xbc\x1d\xe9\x71\x97\x37\xcd\xd4\x58\x2c\x97\xd7\x2d\x2e\x8f\x95\xd8\x03\xd8\x4c\xb0\xf2\xd4\x9c\x57\xc3\xe8\x24\x4b\x02\xf4\xe4\x4d\x06\x0c\xd2\x65\x36\x82\x91\x95\x0d\xda\xb1\x92\x02\x88\x24\x85\x3b\xe5\xf9\xe7\x44\x54\xaa\xa0\x79\xed\x72\x6d\xc7\xf6\x33\xc2\xe5\xb1\xb2\xf6\xbd\x6b\x81\x03\x99\xa7\xa7\xc3\x7e\xd5\x3f\x56\x16\x8b\x3c\x7b\xde\xd5\x96\x72\xbb\x7e\xdc\xd5\x4b\xda\xe5\x28\x14\x1a\xed\xc0\xa7\x24\x25\xb2\x43\x86\xfc\x51\x8a\x94\x60\xef\xe5\xef\x0c\x49\xff\x03\x3c\xea\x41\x39\x05\x6c\x84\x70\xe4\x20\x23\x46\xce\x88\x22\x8a\x60\x20\x59\xa3\x5c\x24\x08\x24\x82\x08\xc9\xfa\x1c\xa5\x70\xd2\x1a\xa0\xac\x92\xf2\x24\x30\x71\xfe\x46\x8e\x5c\xe9\x99\xcb\xb9\xd2\x5b\xcc\x8a\xba\xbf\x3e\xab\xce\xd5\xae\x54\xc7\xbd\x77\x87\x69\xf7\xda\xb9\xed\xe3\xe5\x50\x6b\x8d\x16\x83\x46\x5b\x96\x8c\xa2\xda\x4b\x41\x00\x5e\x84\xf8\x61\x14\x48\x4a\x05\x06\x91\x65\x46\x13\x91\xee\xb4\x86\xdf\x3d\xfe\xfa\x2e\x88\x4a\x15\x34\x9d\xf8\xe3\x61\xde\xb9\x16\x72\xd7\xef\xe1\xea\xda\x9b\x6e\xb6\x23\xf9\x92\x5e\x3b\x6f\xb5\x58\xc4\x0b\x9a\x49\x65\x70\x5c\x34\xb3\x1c\x41\x49\xcc\x8e\x49\x51\x96\xde\x42\x48\xd1\x62\x30\x59\xf8\x1c\xb3\x0a\x39\x04\x94\xee\x4e\x0d\xfa\x21\x78\xc8\x29\x81\xde\x29\x4c\x02\xd0\x38\x46\xa1\xbc\x54\xc0\x20\x14\x5a\x4e\x88\x2e\xb3\xe6\xa4\x2c\x89\x8c\xd9\x7b\x26\x27\x3f\x70\x91\xd1\xde\x06\xfd\x0d\x17\x9b\xac\x8f\xb3\x28\x87\x9d\xb8\x7f\x8d\xe7\xd4\xb6\x2d\x65\x9b\x4d\xd4\xfd\xcb\x00\x4f\xbd\x62\xb2\x98\x8c\x5e\x9a\x1b\x3b\x7e\xdf\xcc\x2a\xb7\x12\x17\x93\x20\x02\xca\x90\x2c\x05\x56\x8a\x83\x93\x59\x71\x00\xe7\x9c\x16\x5a\xdd\x99\xbb\x7e\x4e\x44\xe5\xb3\x57\xee\xaf\x9e\x1f\xe1\x69\x7f\x5b\x2d\xa6\x8d\xcd\x65\x5a\x29\xde\x7b\x6a\x53\x99\x9b\xe7\xf8\xb2\x28\xb2\x3e\xaf\xce\x8b\x31\xd6\x86\xe7\xea\xe6\x33\x1e\x97\x34\x78\x94\xc6\x67\x72\xc6\xb9\x24\x80\x59\xb2\x32\xc9\x29\xfc\xe8\xed\x7f\x1f\x9e\xe2\x14\xe2\x9a\xd3\xff\x62\x3a\xf2\xfe\xd7\x65\x0c\xa7\xe5\x6e\xfb\xaf\xbb\xc4\x62\x11\x94\x75\xff\xfc\x9f\xd0\x2a\x69\xa9\x7d\x52\xca\x0a\xc7\x51\x08\xaf\x38\x81\x22\x95\x22\x05\xe9\x53\x96\xde\x00\xa0\x30\xac\x2d\x85\xcc\xec\x15\x69\x40\x4d\xc2\x79\xad\xbe\x51\x92\xa6\x91\xbb\xaf\xdb\xe9\x4b\x67\xb7\xef\x9e\xbb\xa6\xb2\x6b\x74\x2f\x8d\xa7\x70\x86\x53\x8f\xed\xb8\xed\xf5\xac\xbe\x6a\xda\x09\x56\x25\x2c\x4a\xd2\x31\x6d\x32\x49\xad\x3d\xc7\x1c\xb2\xc8\x16\x95\x75\x59\x8b\x94\xd8\xa0\xf3\x77\xa2\xc3\x4f\x21\xc7\x4f\x85\xaa\x7c\x2b\xba\x09\x8b\x7d\xbd\x56\x9c\xba\xe3\x43\x73\xa9\x0e\x8d\xd3\x64\xf7\xb8\x1d\x1c\x8b\xd9\x62\x99\xbc\x3b\x14\xf9\xb2\x7b\xaf\x8d\xda\xad\x43\xf3\x58\xe2\xfd\x51\x86\xc4\x88\x0a\x43\x62\x09\xc2\x2b\xed\xb3\xb4\x56\x1b\x2d\x8c\x09\xff\xee\x96\xf8\x7b\x62\x72\x14\x28\x1b\x17\x59\x1b\x13\xd8\xa0\x4d\xd6\x7a\x06\x00\x11\xac\xb7\xa4\xb4\x57\xc9\x9a\xac\x94\x0d\xd9\x73\x12\x1a\x81\x3c\x31\x44\x9d\x63\x32\xa0\xbe\xb1\x50\xaf\xee\x47\x27\xe8\x4c\x7b\x95\xe9\x51\xb6\x66\xa3\xc5\xc4\x4e\xae\x33\x78\x2b\xfa\xf5\x4e\x92\xcf\xcd\x63\xe3\x65\x42\xc7\xb1\x7c\x9a\xaf\x6a\x25\x67\x30\x02\x58\x04\x26\x94\x81\x50\xbb\x28\x23\x67\x13\xb3\x44\xa6\x20\xe9\x4e\x9c\x58\x3e\x89\xfc\x54\xbc\xca\x1d\x6f\xb9\xdb\xae\x0f\x4d\x55\x75\xa3\xd9\xf2\x72\xab\x0e\xfb\x3c\x7c\xaf\x5e\x77\xab\xb0\xac\xd4\xe9\xb6\x58\x9d\xde\x5e\x06\xc7\xfc\x96\xfc\xb6\x64\x83\x2a\x9c\x95\x80\x29\x48\xcc\xc4\x56\x5a\x2b\x40\x39\x70\x00\x59\x28\xaf\x34\xff\x59\xac\x38\x26\xe7\xb5\x33\xde\x4a\x15\x48\x82\xb3\x39\x04\x15\x6c\x96\x86\x02\x19\x9f\x1d\x38\x76\x5a\x1b\x07\x59\x84\xe0\x43\x48\x86\xac\x4d\x91\x84\xb3\x8a\xe8\xbe\xb6\x9e\x67\x95\xe7\xe7\x73\xff\x74\xee\xdf\x60\x7e\xd3\xdd\x66\xb7\xd2\x7d\x3a\x15\x2f\x6f\x87\xae\xdc\x61\x53\xc6\xe2\xb9\xc3\xcb\xee\xb8\xff\x36\x2f\xe3\x85\xec\xa4\x62\xc3\x4c\x10\x04\x13\x5a\x07\x18\xbc\x37\xc2\x64\x74\xf7\x3e\xd6\x28\x4b\x48\x7e\x2a\x5a\xa5\xca\x7a\xa9\x9d\x97\xfb\xfa\xfb\x65\x32\x95\x8d\xdd\x2a\x75\x8f\xab\xb6\x6c\x6d\xbb\x3b\x9a\x9d\x46\xe6\x36\xa8\xcd\x0b\x59\x6b\x5c\x57\xcb\x5b\x81\x25\x9b\x56\x72\x1e\x88\x09\x43\xa2\x84\x29\x10\x2b\x67\x03\xb0\x76\x4a\x78\xa9\xf9\xce\xa6\xf5\xfb\x92\xf2\x9f\x48\x79\x15\xb4\x85\xa4\xb2\x8a\xc1\xcb\x14\x9d\x24\x32\x36\x9b\x00\x4e\x79\x01\x81\x13\xb3\x24\x11\xac\xce\xc9\x45\xc3\x00\x64\x5c\x10\x92\x32\x67\xf0\xea\x1b\x4b\x57\xde\xbe\xee\xbb\xce\x9b\x59\xa7\x9f\x1b\x1e\xac\x19\xed\x76\xdb\xe2\xf6\xfa\xf4\xaa\xa8\xcf\x95\xc6\x38\x6c\xed\x79\x36\x6a\x8e\xfb\xb7\x56\x49\xcd\x0a\xda\x7b\x01\x2a\x58\xe9\x63\x36\x8e\x29\x39\x27\xb3\x8d\xd1\x38\x14\xe2\xce\x8e\xe8\xde\xec\xf2\x53\x11\x2b\xcf\x9a\x50\x3f\x75\x8f\x95\xc7\x59\xa5\xed\x6a\xef\xcb\x61\x7e\xf2\xd7\xab\xb1\x79\xdd\xcd\x03\x7d\xbe\xb5\x9f\x9e\x6b\x97\x79\x4d\x6e\xd5\xfa\x46\x25\xa7\x30\x02\x99\x10\xa2\x8c\x46\xe4\x44\xc0\xe4\x15\x45\x6d\x2d\x19\x19\x52\xba\xd3\x33\xfc\x08\x5a\xea\xff\xd0\x42\x97\x25\x99\x20\x4c\xb4\xd1\x4a\x36\x60\x91\x28\x2b\x65\x88\xa2\xe2\x6c\x83\x51\x11\xa4\x10\x59\x7e\xf4\x15\x4e\x83\x54\x3a\x4b\x17\xbc\xb1\x29\x65\xfa\x86\x27\x0e\xe1\x9d\xdd\x60\xa9\xba\xb9\x7e\xab\xad\xe3\xb8\x05\xf5\xbe\xbb\x5d\x1f\xdb\xe7\x96\x6b\xb9\xaa\x5f\xdb\xe7\x1e\xbc\xdd\x86\x03\x2c\x4a\x96\xd7\xd2\x0b\x99\x7d\x70\x1f\xaf\x4a\x50\x64\x12\x22\x46\x05\x5a\x1a\x22\x1b\x7f\xef\xe7\x20\x3f\x15\xb1\x52\x7d\xf1\x62\xb8\xa9\xb9\xea\xe2\xf8\x3a\x98\x87\xf5\xf3\xe3\x29\x28\x7e\xdb\x35\x71\xbb\x2b\x7a\xb7\xb4\xaa\x1d\xfa\x83\x59\xd1\xab\xf7\xc6\xeb\x4e\x49\x96\x19\x3c\x7a\x6f\x94\x55\x51\x98\xa8\xd0\x27\x41\x3a\x7a\x49\x39\x79\x6f\xa4\xfb\xf7\xbe\x12\xf9\xe5\xef\xbf\xfc\x4f\x00\x00\x00\xff\xff\x2f\x4a\x9a\x61\x09\x2d\x00\x00") func fixtures_assetsProofParamsParametersJsonBytes() ([]byte, error) { return bindataRead( @@ -199,7 +190,7 @@ func fixtures_assetsProofParamsParametersJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/proof-params/parameters.json", size: 8745, mode: os.FileMode(420), modTime: time.Unix(1624501759, 0)} + info := bindataFileInfo{name: "fixtures/_assets/proof-params/parameters.json", size: 11529, mode: os.FileMode(420), modTime: time.Unix(1641951643, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -219,7 +210,7 @@ func fixtures_assetsProofParamsSrsInnerProductJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/proof-params/srs-inner-product.json", size: 176, mode: os.FileMode(420), modTime: time.Unix(1626679099, 0)} + info := bindataFileInfo{name: "fixtures/_assets/proof-params/srs-inner-product.json", size: 176, mode: os.FileMode(420), modTime: time.Unix(1624848219, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -239,7 +230,7 @@ func fixtures_assetsArchDiagramMonopic() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/arch-diagram.monopic", size: 4340, mode: os.FileMode(420), modTime: time.Unix(1624501759, 0)} + info := bindataFileInfo{name: "fixtures/_assets/arch-diagram.monopic", size: 4340, mode: os.FileMode(420), modTime: time.Unix(1612507520, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -347,19 +338,19 @@ type bintree struct { } var _bintree = &bintree{nil, map[string]*bintree{ - "fixtures": &bintree{nil, map[string]*bintree{ - "_assets": &bintree{nil, map[string]*bintree{ - "arch-diagram.monopic": &bintree{fixtures_assetsArchDiagramMonopic, map[string]*bintree{}}, - "car": &bintree{nil, map[string]*bintree{ - "calibnet.car": &bintree{fixtures_assetsCarCalibnetCar, map[string]*bintree{}}, - "devnet.car": &bintree{fixtures_assetsCarDevnetCar, map[string]*bintree{}}, - "forcenet.car": &bintree{fixtures_assetsCarForcenetCar, map[string]*bintree{}}, - "interopnet.car": &bintree{fixtures_assetsCarInteropnetCar, map[string]*bintree{}}, - "nerpanet.car": &bintree{fixtures_assetsCarNerpanetCar, map[string]*bintree{}}, + "fixtures": {nil, map[string]*bintree{ + "_assets": {nil, map[string]*bintree{ + "arch-diagram.monopic": {fixtures_assetsArchDiagramMonopic, map[string]*bintree{}}, + "car": {nil, map[string]*bintree{ + "calibnet.car": {fixtures_assetsCarCalibnetCar, map[string]*bintree{}}, + "devnet.car": {fixtures_assetsCarDevnetCar, map[string]*bintree{}}, + "forcenet.car": {fixtures_assetsCarForcenetCar, map[string]*bintree{}}, + "interopnet.car": {fixtures_assetsCarInteropnetCar, map[string]*bintree{}}, + "nerpanet.car": {fixtures_assetsCarNerpanetCar, map[string]*bintree{}}, }}, - "proof-params": &bintree{nil, map[string]*bintree{ - "parameters.json": &bintree{fixtures_assetsProofParamsParametersJson, map[string]*bintree{}}, - "srs-inner-product.json": &bintree{fixtures_assetsProofParamsSrsInnerProductJson, map[string]*bintree{}}, + "proof-params": {nil, map[string]*bintree{ + "parameters.json": {fixtures_assetsProofParamsParametersJson, map[string]*bintree{}}, + "srs-inner-product.json": {fixtures_assetsProofParamsSrsInnerProductJson, map[string]*bintree{}}, }}, }}, }}, From 049c87c573621afdde57e4deb9d5289e570a59ec Mon Sep 17 00:00:00 2001 From: Susanoo <40375298+diwufeiwen@users.noreply.github.com> Date: Wed, 12 Jan 2022 13:28:52 +0800 Subject: [PATCH 114/167] support snap deals (#4696) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 一页素书 <2931107265@qq.com> --- app/submodule/apitypes/mining.go | 3 +- app/submodule/mining/mining_api.go | 6 +- fixtures/networks/net_2k.go | 2 +- go.mod | 4 +- go.sum | 12 +- pkg/consensus/block_validator.go | 43 +- pkg/consensus/proof_verifier.go | 10 +- pkg/consensus/proof_verifier_mock.go | 11 +- pkg/constants/version.go | 4 +- pkg/state/power_table_view.go | 2 +- pkg/state/testing.go | 4 +- pkg/state/view.go | 7 +- pkg/util/ffiwrapper/impl/testing.go | 11 +- pkg/util/ffiwrapper/impl/verifier_cgo.go | 77 ++-- pkg/util/ffiwrapper/verifier.go | 11 +- pkg/vm/vmcontext/testing_syscalls.go | 18 +- venus-devtool/compatible/actors/main.go | 15 +- venus-devtool/go.mod | 2 +- venus-devtool/go.sum | 24 +- venus-shared/actors/builtin/builtin.go | 1 + .../actors/builtin/builtin.go.template | 1 + venus-shared/actors/builtin/miner/actor.go | 3 + .../actors/builtin/miner/actor.go.template | 3 + .../actors/builtin/paych/mock/mock.go | 15 +- .../compatible-checks/api-checksum.txt | 421 ------------------ venus-shared/compatible-checks/api-diff.txt | 190 -------- venus-shared/types/api_types.go | 2 +- 27 files changed, 167 insertions(+), 735 deletions(-) diff --git a/app/submodule/apitypes/mining.go b/app/submodule/apitypes/mining.go index 9da5868b29..fd87d15cf0 100644 --- a/app/submodule/apitypes/mining.go +++ b/app/submodule/apitypes/mining.go @@ -4,6 +4,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/types" ) @@ -11,7 +12,7 @@ import ( type MiningBaseInfo struct { //nolint MinerPower abi.StoragePower NetworkPower abi.StoragePower - Sectors []builtin.SectorInfo + Sectors []builtin.ExtendedSectorInfo WorkerKey address.Address SectorSize abi.SectorSize PrevBeaconEntry types.BeaconEntry diff --git a/app/submodule/mining/mining_api.go b/app/submodule/mining/mining_api.go index b5d5bb07e9..28d63965aa 100644 --- a/app/submodule/mining/mining_api.go +++ b/app/submodule/mining/mining_api.go @@ -99,12 +99,12 @@ func (miningAPI *MiningAPI) MinerGetBaseInfo(ctx context.Context, maddr address. nv := miningAPI.Ming.ChainModule.Fork.GetNetworkVersion(ctx, ts.Height()) pv := miningAPI.Ming.proofVerifier - sectors, err := view.GetSectorsForWinningPoSt(ctx, nv, pv, maddr, prand) + xsectors, err := view.GetSectorsForWinningPoSt(ctx, nv, pv, maddr, prand) if err != nil { return nil, xerrors.Errorf("getting winning post proving set: %v", err) } - if len(sectors) == 0 { + if len(xsectors) == 0 { return nil, nil } @@ -136,7 +136,7 @@ func (miningAPI *MiningAPI) MinerGetBaseInfo(ctx context.Context, maddr address. return &types.MiningBaseInfo{ MinerPower: mpow.QualityAdjPower, NetworkPower: tpow.QualityAdjPower, - Sectors: sectors, + Sectors: xsectors, WorkerKey: worker, SectorSize: info.SectorSize, PrevBeaconEntry: *prev, diff --git a/fixtures/networks/net_2k.go b/fixtures/networks/net_2k.go index 33e626851e..a7c4ac145c 100644 --- a/fixtures/networks/net_2k.go +++ b/fixtures/networks/net_2k.go @@ -17,7 +17,7 @@ func Net2k() *NetworkConf { }, Network: config.NetworkParamsConfig{ NetworkType: constants.Network2k, - GenesisNetworkVersion: network.Version14, + GenesisNetworkVersion: network.Version15, BlockDelay: 4, ConsensusMinerMinPower: 2048, MinVerifiedDealSize: 256, diff --git a/go.mod b/go.mod index 10ad230244..19e58e845f 100644 --- a/go.mod +++ b/go.mod @@ -39,8 +39,8 @@ require ( github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 - github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec - github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff + github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a + github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578 github.com/gbrlsnchs/jwt/v3 v3.0.0 diff --git a/go.sum b/go.sum index 1b0a249088..89babf2460 100644 --- a/go.sum +++ b/go.sum @@ -339,7 +339,6 @@ github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.m github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 h1:+nripp+UI/rhl01w9Gs4V0XDGaVPYPMGU/D/gNVLue0= github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= -github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= @@ -351,7 +350,6 @@ github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/g github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= -github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -370,10 +368,11 @@ github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVi github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff h1:JO62nquOGhjoDf9+JkAcV+wsD5yhoyIKOMj70ZNdD3Q= -github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h1:MS1mtAhZh0iSE7OxP1bb6+UNyYKsxg8n51FpHlX1d54= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= +github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578 h1:RpiHYKzuEnWoPhp2HO7sVC8QY78TZIpO4dhbp0g/g+A= @@ -791,7 +790,6 @@ github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0 github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= -github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= diff --git a/pkg/consensus/block_validator.go b/pkg/consensus/block_validator.go index b7342d7201..d951d68a11 100644 --- a/pkg/consensus/block_validator.go +++ b/pkg/consensus/block_validator.go @@ -9,19 +9,26 @@ import ( "strings" "time" - "go.opencensus.io/trace" - - blockadt "github.com/filecoin-project/specs-actors/actors/util/adt" + "github.com/Gurpartap/async" + "github.com/hashicorp/go-multierror" + lru "github.com/hashicorp/golang-lru" + "github.com/ipfs/go-cid" + blockstore "github.com/ipfs/go-ipfs-blockstore" + cbor "github.com/ipfs/go-ipld-cbor" pubsub "github.com/libp2p/go-libp2p-pubsub" cbg "github.com/whyrusleeping/cbor-gen" + "go.opencensus.io/trace" + "golang.org/x/xerrors" - "github.com/Gurpartap/async" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" acrypto "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + + blockadt "github.com/filecoin-project/specs-actors/actors/util/adt" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + "github.com/filecoin-project/venus/pkg/beacon" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/config" @@ -32,17 +39,12 @@ import ( "github.com/filecoin-project/venus/pkg/state/tree" bstore "github.com/filecoin-project/venus/pkg/util/blockstoreutil" "github.com/filecoin-project/venus/pkg/vm/gas" + "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" "github.com/filecoin-project/venus/venus-shared/types" - "github.com/hashicorp/go-multierror" - lru "github.com/hashicorp/golang-lru" - "github.com/ipfs/go-cid" - blockstore "github.com/ipfs/go-ipfs-blockstore" - cbor "github.com/ipfs/go-ipld-cbor" - "golang.org/x/xerrors" ) var ErrTemporal = errors.New("temporal error") @@ -719,25 +721,28 @@ func (bv *BlockValidator) VerifyWinningPoStProof(ctx context.Context, nv network return xerrors.New("power state view is null") } - sectors, err := view.GetSectorsForWinningPoSt(ctx, nv, bv.proofVerifier, blk.Miner, rand) + xsectors, err := view.GetSectorsForWinningPoSt(ctx, nv, bv.proofVerifier, blk.Miner, rand) if err != nil { return xerrors.Errorf("getting winning post sector set: %v", err) } - proofs := make([]proof2.PoStProof, len(blk.WinPoStProof)) - for idx, pf := range blk.WinPoStProof { - proofs[idx] = proof2.PoStProof{PoStProof: pf.PoStProof, ProofBytes: pf.ProofBytes} + sectors := make([]proof.SectorInfo, len(xsectors)) + for i, xsi := range xsectors { + sectors[i] = proof.SectorInfo{ + SealProof: xsi.SealProof, + SectorNumber: xsi.SectorNumber, + SealedCID: xsi.SealedCID, + } } - ok, err := bv.proofVerifier.VerifyWinningPoSt(ctx, proof2.WinningPoStVerifyInfo{ + ok, err := bv.proofVerifier.VerifyWinningPoSt(ctx, proof.WinningPoStVerifyInfo{ Randomness: rand, - Proofs: proofs, + Proofs: blk.WinPoStProof, ChallengedSectors: sectors, Prover: abi.ActorID(mid), }) - if err != nil { - return xerrors.Errorf("failed to verify election post: %v", err) + return xerrors.Errorf("failed to verify election post: %w", err) } if !ok { diff --git a/pkg/consensus/proof_verifier.go b/pkg/consensus/proof_verifier.go index e47ef85831..be439cb746 100644 --- a/pkg/consensus/proof_verifier.go +++ b/pkg/consensus/proof_verifier.go @@ -10,7 +10,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/venus/pkg/constants" @@ -19,11 +18,12 @@ import ( // Interface to PoSt verification, modify by force EPoStVerifier -> ProofVerifier type ProofVerifier interface { - VerifySeal(info proof5.SealVerifyInfo) (bool, error) - VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) + VerifySeal(proof7.SealVerifyInfo) (bool, error) + VerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) (bool, error) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) - VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) - VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) + VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo) (bool, error) + VerifyWindowPoSt(ctx context.Context, info proof7.WindowPoStVerifyInfo) (bool, error) + GenerateWinningPoStSectorChallenge(ctx context.Context, proofType abi.RegisteredPoStProof, minerID abi.ActorID, randomness abi.PoStRandomness, eligibleSectorCount uint64) ([]uint64, error) } diff --git a/pkg/consensus/proof_verifier_mock.go b/pkg/consensus/proof_verifier_mock.go index 1a712d315b..56c5bff261 100644 --- a/pkg/consensus/proof_verifier_mock.go +++ b/pkg/consensus/proof_verifier_mock.go @@ -5,7 +5,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/venus/pkg/util/ffiwrapper" @@ -15,11 +14,11 @@ type genFakeVerifier struct{} var _ ffiwrapper.Verifier = (*genFakeVerifier)(nil) -func (m genFakeVerifier) VerifySeal(svi proof5.SealVerifyInfo) (bool, error) { +func (m genFakeVerifier) VerifySeal(proof7.SealVerifyInfo) (bool, error) { return true, nil } -func (m genFakeVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) { +func (m genFakeVerifier) VerifyAggregateSeals(proof7.AggregateSealVerifyProofAndInfos) (bool, error) { panic("implement me") } @@ -27,14 +26,14 @@ func (m genFakeVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (b panic("not supported") } -func (m genFakeVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { +func (m genFakeVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo) (bool, error) { panic("not supported") } -func (m genFakeVerifier) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) { +func (m genFakeVerifier) VerifyWindowPoSt(ctx context.Context, info proof7.WindowPoStVerifyInfo) (bool, error) { panic("not supported") } -func (m genFakeVerifier) GenerateWinningPoStSectorChallenge(ctx context.Context, proof abi.RegisteredPoStProof, id abi.ActorID, randomness abi.PoStRandomness, u uint64) ([]uint64, error) { +func (m genFakeVerifier) GenerateWinningPoStSectorChallenge(ctx context.Context, proofType abi.RegisteredPoStProof, minerID abi.ActorID, randomness abi.PoStRandomness, eligibleSectorCount uint64) ([]uint64, error) { panic("not supported") } diff --git a/pkg/constants/version.go b/pkg/constants/version.go index 3e5dd09833..50bf830c0e 100644 --- a/pkg/constants/version.go +++ b/pkg/constants/version.go @@ -26,6 +26,6 @@ func newVer(major, minor, patch uint8) Version { // semver versions of the rpc api exposed var ( - FullAPIVersion0 = newVer(1, 4, 0) - FullAPIVersion1 = newVer(2, 1, 0) + FullAPIVersion0 = newVer(1, 5, 0) + FullAPIVersion1 = newVer(2, 2, 0) ) diff --git a/pkg/state/power_table_view.go b/pkg/state/power_table_view.go index fc26648f99..07d73892db 100644 --- a/pkg/state/power_table_view.go +++ b/pkg/state/power_table_view.go @@ -22,7 +22,7 @@ type PowerStateView interface { MinerSectorInfo(ctx context.Context, maddr address.Address, sectorNum abi.SectorNumber) (*miner.SectorOnChainInfo, error) PowerNetworkTotal(ctx context.Context) (*NetworkPower, error) MinerClaimedPower(ctx context.Context, miner address.Address) (raw, qa abi.StoragePower, err error) - GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, pv ffiwrapper.Verifier, maddr address.Address, rand abi.PoStRandomness) ([]builtin.SectorInfo, error) + GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, pv ffiwrapper.Verifier, maddr address.Address, rand abi.PoStRandomness) ([]builtin.ExtendedSectorInfo, error) } type NetworkPower struct { diff --git a/pkg/state/testing.go b/pkg/state/testing.go index dabda1c15d..849aa7b654 100644 --- a/pkg/state/testing.go +++ b/pkg/state/testing.go @@ -110,12 +110,12 @@ func (v *FakeStateView) MinerClaimedPower(ctx context.Context, miner address.Add return m.ClaimedRawPower, m.ClaimedQAPower, nil } -func (v *FakeStateView) GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, pv ffiwrapper.Verifier, maddr address.Address, rand abi.PoStRandomness) ([]builtin.SectorInfo, error) { +func (v *FakeStateView) GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, pv ffiwrapper.Verifier, maddr address.Address, rand abi.PoStRandomness) ([]builtin.ExtendedSectorInfo, error) { _, ok := v.Miners[maddr] if !ok { return nil, errors.Errorf("no miner %s", maddr) } - return []builtin.SectorInfo{}, nil + return []builtin.ExtendedSectorInfo{}, nil } func (v *FakeStateView) MinerPledgeCollateral(_ context.Context, maddr address.Address) (locked abi.TokenAmount, total abi.TokenAmount, err error) { diff --git a/pkg/state/view.go b/pkg/state/view.go index 69fd9280f2..c00fc7f454 100644 --- a/pkg/state/view.go +++ b/pkg/state/view.go @@ -140,7 +140,7 @@ func (v *View) MinerSectorInfo(ctx context.Context, maddr addr.Address, sectorNu } //GetSectorsForWinningPoSt return sector of winning post challenge result -func (v *View) GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, pv ffiwrapper.Verifier, maddr addr.Address, rand abi.PoStRandomness) ([]builtin.SectorInfo, error) { +func (v *View) GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, pv ffiwrapper.Verifier, maddr addr.Address, rand abi.PoStRandomness) ([]builtin.ExtendedSectorInfo, error) { mas, err := v.LoadMinerState(ctx, maddr) if err != nil { return nil, xerrors.Errorf("failed to load miner actor state: %s", err) @@ -221,12 +221,13 @@ func (v *View) GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, return nil, xerrors.Errorf("loading proving sectors: %s", err) } - out := make([]builtin.SectorInfo, len(sectors)) + out := make([]builtin.ExtendedSectorInfo, len(sectors)) for i, sinfo := range sectors { - out[i] = builtin.SectorInfo{ + out[i] = builtin.ExtendedSectorInfo{ SealProof: sinfo.SealProof, SectorNumber: sinfo.SectorNumber, SealedCID: sinfo.SealedCID, + SectorKey: sinfo.SectorKeyCID, } } diff --git a/pkg/util/ffiwrapper/impl/testing.go b/pkg/util/ffiwrapper/impl/testing.go index e0be647b69..243c865b79 100644 --- a/pkg/util/ffiwrapper/impl/testing.go +++ b/pkg/util/ffiwrapper/impl/testing.go @@ -5,7 +5,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/venus/pkg/util/ffiwrapper" @@ -17,11 +16,11 @@ type FakeVerifier struct { var _ ffiwrapper.Verifier = (*FakeVerifier)(nil) -func (f *FakeVerifier) VerifySeal(proof5.SealVerifyInfo) (bool, error) { +func (f *FakeVerifier) VerifySeal(proof7.SealVerifyInfo) (bool, error) { return true, nil } -func (f *FakeVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) { +func (f *FakeVerifier) VerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) (bool, error) { return true, nil } @@ -29,14 +28,14 @@ func (f *FakeVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (boo return true, nil } -func (f *FakeVerifier) VerifyWinningPoSt(context.Context, proof5.WinningPoStVerifyInfo) (bool, error) { +func (f *FakeVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo) (bool, error) { return true, nil } -func (f *FakeVerifier) VerifyWindowPoSt(context.Context, proof5.WindowPoStVerifyInfo) (bool, error) { +func (f *FakeVerifier) VerifyWindowPoSt(context.Context, proof7.WindowPoStVerifyInfo) (bool, error) { return true, nil } -func (f *FakeVerifier) GenerateWinningPoStSectorChallenge(context.Context, abi.RegisteredPoStProof, abi.ActorID, abi.PoStRandomness, uint64) ([]uint64, error) { +func (f *FakeVerifier) GenerateWinningPoStSectorChallenge(ctx context.Context, proofType abi.RegisteredPoStProof, minerID abi.ActorID, randomness abi.PoStRandomness, eligibleSectorCount uint64) ([]uint64, error) { return []uint64{}, nil } diff --git a/pkg/util/ffiwrapper/impl/verifier_cgo.go b/pkg/util/ffiwrapper/impl/verifier_cgo.go index c7b19d2cee..93d41ea389 100644 --- a/pkg/util/ffiwrapper/impl/verifier_cgo.go +++ b/pkg/util/ffiwrapper/impl/verifier_cgo.go @@ -4,22 +4,24 @@ package impl import ( "context" - "github.com/filecoin-project/venus/pkg/util/ffiwrapper" + + "go.opencensus.io/trace" + "golang.org/x/xerrors" ffi "github.com/filecoin-project/filecoin-ffi" "github.com/filecoin-project/go-state-types/abi" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" - proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/specs-storage/storage" - "go.opencensus.io/trace" - "golang.org/x/xerrors" + ffiproof "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + + "github.com/filecoin-project/venus/pkg/util/ffiwrapper" "github.com/filecoin-project/venus/pkg/util/storiface" ) -func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) ([]proof5.PoStProof, error) { +func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, error) { randomness[31] &= 0x3f - privsectors, skipped, done, err := sb.pubSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWinningPoStProof) // TODO: FAULTS? + privsectors, skipped, done, err := sb.pubExtendedSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWinningPoStProof) // TODO: FAULTS? if err != nil { return nil, err } @@ -31,12 +33,13 @@ func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, return ffi.GenerateWinningPoSt(minerID, privsectors, randomness) } -func (sb *Sealer) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) ([]proof5.PoStProof, []abi.SectorID, error) { +func (sb *Sealer) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, []abi.SectorID, error) { randomness[31] &= 0x3f - privsectors, skipped, done, err := sb.pubSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWindowPoStProof) + privsectors, skipped, done, err := sb.pubExtendedSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWindowPoStProof) if err != nil { return nil, nil, xerrors.Errorf("gathering sector info: %w", err) } + defer done() if len(skipped) > 0 { @@ -52,11 +55,10 @@ func (sb *Sealer) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, s Number: f, }) } - return proof, faultyIDs, err } -func (sb *Sealer) pubSectorToPriv(ctx context.Context, mid abi.ActorID, sectorInfo []proof5.SectorInfo, faults []abi.SectorNumber, rpt func(abi.RegisteredSealProof) (abi.RegisteredPoStProof, error)) (ffi.SortedPrivateSectorInfo, []abi.SectorID, func(), error) { +func (sb *Sealer) pubExtendedSectorToPriv(ctx context.Context, mid abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, faults []abi.SectorNumber, rpt func(abi.RegisteredSealProof) (abi.RegisteredPoStProof, error)) (ffi.SortedPrivateSectorInfo, []abi.SectorID, func(), error) { fmap := map[abi.SectorNumber]struct{}{} for _, fault := range faults { fmap[fault] = struct{}{} @@ -80,14 +82,32 @@ func (sb *Sealer) pubSectorToPriv(ctx context.Context, mid abi.ActorID, sectorIn ID: abi.SectorID{Miner: mid, Number: s.SectorNumber}, ProofType: s.SealProof, } - - paths, d, err := sb.sectors.AcquireSector(ctx, sid, storiface.FTCache|storiface.FTSealed, 0, storiface.PathStorage) - if err != nil { - log.Warnw("failed to acquire sector, skipping", "sector", sid.ID, "error", err) - skipped = append(skipped, sid.ID) - continue + proveUpdate := s.SectorKey != nil + var cache string + var sealed string + if proveUpdate { + log.Debugf("Posting over updated sector for sector id: %d", s.SectorNumber) + paths, d, err := sb.sectors.AcquireSector(ctx, sid, storiface.FTUpdateCache|storiface.FTUpdate, 0, storiface.PathStorage) + if err != nil { + log.Warnw("failed to acquire FTUpdateCache and FTUpdate of sector, skipping", "sector", sid.ID, "error", err) + skipped = append(skipped, sid.ID) + continue + } + doneFuncs = append(doneFuncs, d) + cache = paths.UpdateCache + sealed = paths.Update + } else { + log.Debugf("Posting over sector key sector for sector id: %d", s.SectorNumber) + paths, d, err := sb.sectors.AcquireSector(ctx, sid, storiface.FTCache|storiface.FTSealed, 0, storiface.PathStorage) + if err != nil { + log.Warnw("failed to acquire FTCache and FTSealed of sector, skipping", "sector", sid.ID, "error", err) + skipped = append(skipped, sid.ID) + continue + } + doneFuncs = append(doneFuncs, d) + cache = paths.Cache + sealed = paths.Sealed } - doneFuncs = append(doneFuncs, d) postProofType, err := rpt(s.SealProof) if err != nil { @@ -95,11 +115,16 @@ func (sb *Sealer) pubSectorToPriv(ctx context.Context, mid abi.ActorID, sectorIn return ffi.SortedPrivateSectorInfo{}, nil, nil, xerrors.Errorf("acquiring registered PoSt proof from sector info %+v: %w", s, err) } + ffiInfo := ffiproof.SectorInfo{ + SealProof: s.SealProof, + SectorNumber: s.SectorNumber, + SealedCID: s.SealedCID, + } out = append(out, ffi.PrivateSectorInfo{ - CacheDirPath: paths.Cache, + CacheDirPath: cache, PoStProofType: postProofType, - SealedSectorPath: paths.Sealed, - SectorInfo: s, + SealedSectorPath: sealed, + SectorInfo: ffiInfo, }) } @@ -112,19 +137,19 @@ type proofVerifier struct{} var ProofVerifier = proofVerifier{} -func (proofVerifier) VerifySeal(info proof5.SealVerifyInfo) (bool, error) { +func (proofVerifier) VerifySeal(info proof.SealVerifyInfo) (bool, error) { return ffi.VerifySeal(info) } -func (verifier proofVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) { +func (proofVerifier) VerifyAggregateSeals(aggregate proof.AggregateSealVerifyProofAndInfos) (bool, error) { return ffi.VerifyAggregateSeals(aggregate) } -func (proofVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { +func (proofVerifier) VerifyReplicaUpdate(update proof.ReplicaUpdateInfo) (bool, error) { return ffi.SectorUpdate.VerifyUpdateProof(update) } -func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { +func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo) (bool, error) { info.Randomness[31] &= 0x3f _, span := trace.StartSpan(ctx, "VerifyWinningPoSt") defer span.End() @@ -132,7 +157,7 @@ func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningP return ffi.VerifyWinningPoSt(info) } -func (proofVerifier) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) { +func (proofVerifier) VerifyWindowPoSt(ctx context.Context, info proof.WindowPoStVerifyInfo) (bool, error) { info.Randomness[31] &= 0x3f _, span := trace.StartSpan(ctx, "VerifyWindowPoSt") defer span.End() diff --git a/pkg/util/ffiwrapper/verifier.go b/pkg/util/ffiwrapper/verifier.go index 6633b5eea9..60bf1be9c6 100644 --- a/pkg/util/ffiwrapper/verifier.go +++ b/pkg/util/ffiwrapper/verifier.go @@ -5,16 +5,15 @@ import ( "github.com/filecoin-project/go-state-types/abi" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" ) type Verifier interface { - VerifySeal(proof5.SealVerifyInfo) (bool, error) - VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) + VerifySeal(proof7.SealVerifyInfo) (bool, error) + VerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) (bool, error) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) - VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) - VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) + VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo) (bool, error) + VerifyWindowPoSt(ctx context.Context, info proof7.WindowPoStVerifyInfo) (bool, error) - GenerateWinningPoStSectorChallenge(context.Context, abi.RegisteredPoStProof, abi.ActorID, abi.PoStRandomness, uint64) ([]uint64, error) + GenerateWinningPoStSectorChallenge(ctx context.Context, proofType abi.RegisteredPoStProof, minerID abi.ActorID, randomness abi.PoStRandomness, eligibleSectorCount uint64) ([]uint64, error) } diff --git a/pkg/vm/vmcontext/testing_syscalls.go b/pkg/vm/vmcontext/testing_syscalls.go index 00c2bc6002..0dfaba7db3 100644 --- a/pkg/vm/vmcontext/testing_syscalls.go +++ b/pkg/vm/vmcontext/testing_syscalls.go @@ -5,8 +5,10 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - rt5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + + rt7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + "github.com/ipfs/go-cid" "github.com/minio/blake2b-simd" @@ -25,26 +27,26 @@ func (f FakeSyscalls) HashBlake2b(data []byte) [32]byte { return blake2b.Sum256(data) } -func (f FakeSyscalls) ComputeUnsealedSectorCID(ctx context.Context, proof5 abi.RegisteredSealProof, pieces []abi.PieceInfo) (cid.Cid, error) { +func (f FakeSyscalls) ComputeUnsealedSectorCID(context.Context, abi.RegisteredSealProof, []abi.PieceInfo) (cid.Cid, error) { panic("implement me") } -func (f FakeSyscalls) VerifySeal(ctx context.Context, info proof5.SealVerifyInfo) error { +func (f FakeSyscalls) VerifySeal(ctx context.Context, info proof7.SealVerifyInfo) error { panic("implement me") } -func (f FakeSyscalls) BatchVerifySeals(ctx context.Context, vis map[address.Address][]proof5.SealVerifyInfo) (map[address.Address][]bool, error) { +func (f FakeSyscalls) BatchVerifySeals(ctx context.Context, vis map[address.Address][]proof7.SealVerifyInfo) (map[address.Address][]bool, error) { panic("implement me") } -func (f FakeSyscalls) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) error { +func (f FakeSyscalls) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo) error { panic("implement me") } -func (f FakeSyscalls) VerifyPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) error { +func (f FakeSyscalls) VerifyWindowPoSt(ctx context.Context, info proof7.WindowPoStVerifyInfo) error { panic("implement me") } -func (f FakeSyscalls) VerifyConsensusFault(ctx context.Context, h1, h2, extra []byte, view SyscallsStateView) (*rt5.ConsensusFault, error) { +func (f FakeSyscalls) VerifyConsensusFault(ctx context.Context, h1, h2, extra []byte, view SyscallsStateView) (*rt7.ConsensusFault, error) { panic("implement me") } diff --git a/venus-devtool/compatible/actors/main.go b/venus-devtool/compatible/actors/main.go index 8ae1746842..1d283a9e61 100644 --- a/venus-devtool/compatible/actors/main.go +++ b/venus-devtool/compatible/actors/main.go @@ -153,6 +153,16 @@ var replicaCmd = &cli.Command{ return true } + // exclude like builtin/[dir]/dir.go(replaced by actor.go) + dir, file := filepath.Split(path) + if strings.Contains(dir, "builtin") && strings.HasSuffix(file, ".go") { + pf := file[:strings.LastIndex(file, ".go")] + if strings.Contains(dir, pf) { + fmt.Println("path:", path) + return true + } + } + // need adt.go diff_adt.go if strings.Contains(path, "adt.go") { return false @@ -168,7 +178,7 @@ var replicaCmd = &cli.Command{ return true } - dir := filepath.Dir(path) + dir = filepath.Dir(path) arr := strings.Split(dir, "/") if strings.HasSuffix(path, fmt.Sprintf("%s.go", arr[len(arr)-1])) { return true @@ -194,6 +204,9 @@ var replicaCmd = &cli.Command{ {"github.com/filecoin-project/lotus/chain/actors", "github.com/filecoin-project/venus/venus-shared/actors"}, {"github.com/filecoin-project/lotus/chain/actors/adt", "github.com/filecoin-project/venus/venus-shared/actors/adt"}, {"github.com/filecoin-project/lotus/chain/actors/aerrors", "github.com/filecoin-project/venus/venus-shared/actors/aerrors"}, + {"dtypes.NetworkName", "string"}, + {"\"github.com/filecoin-project/lotus/node/modules/dtypes\"", ""}, + {"\"github.com/filecoin-project/lotus/chain/types\"", "types \"github.com/filecoin-project/venus/venus-shared/internal\""}, } for _, file := range files { diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index edbd5b1588..eda32456e5 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -10,7 +10,7 @@ require ( github.com/filecoin-project/go-fil-markets v1.14.1 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-state-types v0.1.1 - github.com/filecoin-project/lotus v1.13.2-0.20220103185743-9b11c4b31932 + github.com/filecoin-project/lotus v1.13.2-0.20220110101720-d16c5d0e9394 github.com/filecoin-project/venus v0.0.0-00010101000000-000000000000 github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-graphsync v0.11.5 diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index 9d4c9b973e..933d75f89c 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -122,9 +122,7 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkY github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/ashanbrown/forbidigo v1.1.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= github.com/ashanbrown/makezero v0.0.0-20210308000810-4155955488a0/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= -github.com/awnumar/memcall v0.0.0-20191004114545-73db50fd9f80 h1:8kObYoBO4LNmQ+fLiScBfxEdxF1w2MHlvH/lr9MLaTg= github.com/awnumar/memcall v0.0.0-20191004114545-73db50fd9f80/go.mod h1:S911igBPR9CThzd/hYQQmTc9SWNu3ZHIlCGaWsWsoJo= -github.com/awnumar/memguard v0.22.2 h1:tMxcq1WamhG13gigK8Yaj9i/CHNUO3fFlpS9ABBQAxw= github.com/awnumar/memguard v0.22.2/go.mod h1:33OwJBHC+T4eEfFcDrQb78TMlBMBvcOPCXWU9xE34gM= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -382,10 +380,9 @@ github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.m github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= -github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= @@ -400,9 +397,8 @@ github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZO github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/lotus v1.13.2-0.20220103185743-9b11c4b31932 h1:TR3RU+f3pAILoV9p3qjsZqDiwKLgB3ED+MkYznJot1Y= -github.com/filecoin-project/lotus v1.13.2-0.20220103185743-9b11c4b31932/go.mod h1:3rpFD76CLqowX/0mmreiT3CohlmHsU4+CXFk9v9MrYM= -github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= +github.com/filecoin-project/lotus v1.13.2-0.20220110101720-d16c5d0e9394 h1:F2D6TOf/fcqUDbtifXX7VoIjCzQ4DlxwwIAXNuT1jT4= +github.com/filecoin-project/lotus v1.13.2-0.20220110101720-d16c5d0e9394/go.mod h1:8pVJ+56YXhhNWifggmHLlDtf/IReRrZn6O4069/sSmA= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -421,10 +417,11 @@ github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVi github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff h1:JO62nquOGhjoDf9+JkAcV+wsD5yhoyIKOMj70ZNdD3Q= -github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h1:MS1mtAhZh0iSE7OxP1bb6+UNyYKsxg8n51FpHlX1d54= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= +github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578/go.mod h1:/cbLZYvQhinVFUG4TP2Uy1o7LtF+guT21qZIMTmKk0g= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -843,7 +840,6 @@ github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28 github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= -github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= @@ -1513,7 +1509,6 @@ github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= @@ -1835,7 +1830,6 @@ github.com/raulk/go-watchdog v1.2.0/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6R github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -2733,7 +2727,6 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -2763,7 +2756,6 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gorm.io/driver/mysql v1.1.1/go.mod h1:KdrTanmfLPPyAOeYGyG+UpDys7/7eeWT1zCq+oekYnU= gorm.io/gorm v1.21.9/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= gorm.io/gorm v1.21.12/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/venus-shared/actors/builtin/builtin.go b/venus-shared/actors/builtin/builtin.go index a4adeb8bbf..ce35e4b0d4 100644 --- a/venus-shared/actors/builtin/builtin.go +++ b/venus-shared/actors/builtin/builtin.go @@ -63,6 +63,7 @@ const ( // These are all just type aliases across actor versions. In the future, that might change // and we might need to do something fancier. type SectorInfo = proof7.SectorInfo +type ExtendedSectorInfo = proof7.ExtendedSectorInfo type PoStProof = proof7.PoStProof type FilterEstimate = smoothing0.FilterEstimate diff --git a/venus-shared/actors/builtin/builtin.go.template b/venus-shared/actors/builtin/builtin.go.template index 47ccb0217b..2bf1032771 100644 --- a/venus-shared/actors/builtin/builtin.go.template +++ b/venus-shared/actors/builtin/builtin.go.template @@ -47,6 +47,7 @@ const ( // These are all just type aliases across actor versions. In the future, that might change // and we might need to do something fancier. type SectorInfo = proof{{.latestVersion}}.SectorInfo +type ExtendedSectorInfo = proof{{.latestVersion}}.ExtendedSectorInfo type PoStProof = proof{{.latestVersion}}.PoStProof type FilterEstimate = smoothing0.FilterEstimate diff --git a/venus-shared/actors/builtin/miner/actor.go b/venus-shared/actors/builtin/miner/actor.go index eaa8256ed1..a76f4e822c 100644 --- a/venus-shared/actors/builtin/miner/actor.go +++ b/venus-shared/actors/builtin/miner/actor.go @@ -25,6 +25,7 @@ import ( miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -284,6 +285,7 @@ type SectorPreCommitOnChainInfo struct { type PoStPartition = miner0.PoStPartition type RecoveryDeclaration = miner0.RecoveryDeclaration type FaultDeclaration = miner0.FaultDeclaration +type ReplicaUpdate = miner7.ReplicaUpdate // Params type DeclareFaultsParams = miner0.DeclareFaultsParams @@ -292,6 +294,7 @@ type SubmitWindowedPoStParams = miner0.SubmitWindowedPoStParams type ProveCommitSectorParams = miner0.ProveCommitSectorParams type DisputeWindowedPoStParams = miner3.DisputeWindowedPoStParams type ProveCommitAggregateParams = miner5.ProveCommitAggregateParams +type ProveReplicaUpdatesParams = miner7.ProveReplicaUpdatesParams func PreferredSealProofTypeFromWindowPoStType(nver network.Version, proof abi.RegisteredPoStProof) (abi.RegisteredSealProof, error) { // We added support for the new proofs in network version 7, and removed support for the old diff --git a/venus-shared/actors/builtin/miner/actor.go.template b/venus-shared/actors/builtin/miner/actor.go.template index 0ac76d62ac..caf3b3919c 100644 --- a/venus-shared/actors/builtin/miner/actor.go.template +++ b/venus-shared/actors/builtin/miner/actor.go.template @@ -25,6 +25,7 @@ import ( miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" {{range .versions}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" {{end}} @@ -195,6 +196,7 @@ type SectorPreCommitOnChainInfo struct { type PoStPartition = miner0.PoStPartition type RecoveryDeclaration = miner0.RecoveryDeclaration type FaultDeclaration = miner0.FaultDeclaration +type ReplicaUpdate = miner7.ReplicaUpdate // Params type DeclareFaultsParams = miner0.DeclareFaultsParams @@ -203,6 +205,7 @@ type SubmitWindowedPoStParams = miner0.SubmitWindowedPoStParams type ProveCommitSectorParams = miner0.ProveCommitSectorParams type DisputeWindowedPoStParams = miner3.DisputeWindowedPoStParams type ProveCommitAggregateParams = miner5.ProveCommitAggregateParams +type ProveReplicaUpdatesParams = miner7.ProveReplicaUpdatesParams func PreferredSealProofTypeFromWindowPoStType(nver network.Version, proof abi.RegisteredPoStProof) (abi.RegisteredSealProof, error) { // We added support for the new proofs in network version 7, and removed support for the old diff --git a/venus-shared/actors/builtin/paych/mock/mock.go b/venus-shared/actors/builtin/paych/mock/mock.go index 0f4d744180..087c34e4a4 100644 --- a/venus-shared/actors/builtin/paych/mock/mock.go +++ b/venus-shared/actors/builtin/paych/mock/mock.go @@ -1,13 +1,14 @@ +// FETCHED FROM LOTUS: builtin/paych/mock/mock.go + package mock import ( "io" - paych2 "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" ) type mockState struct { @@ -15,7 +16,7 @@ type mockState struct { to address.Address settlingAt abi.ChainEpoch toSend abi.TokenAmount - lanes map[uint64]paych2.LaneState + lanes map[uint64]paych.LaneState } func (ms *mockState) GetState() interface{} { @@ -32,15 +33,15 @@ type mockLaneState struct { func NewMockPayChState(from address.Address, to address.Address, settlingAt abi.ChainEpoch, - lanes map[uint64]paych2.LaneState, -) paych2.State { + lanes map[uint64]paych.LaneState, +) paych.State { return &mockState{from: from, to: to, settlingAt: settlingAt, toSend: big.NewInt(0), lanes: lanes} } // NewMockLaneState constructs a state for a payment channel lane with the set fixed values // that satisfies the paych.LaneState interface. Useful for populating lanes when // calling NewMockPayChState -func NewMockLaneState(redeemed big.Int, nonce uint64) paych2.LaneState { +func NewMockLaneState(redeemed big.Int, nonce uint64) paych.LaneState { return &mockLaneState{redeemed, nonce} } @@ -74,7 +75,7 @@ func (ms *mockState) LaneCount() (uint64, error) { } // Iterate lane states -func (ms *mockState) ForEachLaneState(cb func(idx uint64, dl paych2.LaneState) error) error { +func (ms *mockState) ForEachLaneState(cb func(idx uint64, dl paych.LaneState) error) error { var lastErr error for lane, state := range ms.lanes { if err := cb(lane, state); err != nil { diff --git a/venus-shared/compatible-checks/api-checksum.txt b/venus-shared/compatible-checks/api-checksum.txt index 7ce0948a9d..e69de29bb2 100644 --- a/venus-shared/compatible-checks/api-checksum.txt +++ b/venus-shared/compatible-checks/api-checksum.txt @@ -1,421 +0,0 @@ -v0api.FullNode: - AuthNew: In=2, Out=2, CheckSum=248fe5ed43f2e294ea5d71596b9272ac - AuthVerify: In=2, Out=2, CheckSum=c156d52455ed5f2d227e08a518d5f8a1 - BeaconGetEntry: In=2, Out=2, CheckSum=c74f5c0f4039207ea45c11bfe3319c38 - ChainDeleteObj: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 - ChainExport: In=4, Out=2, CheckSum=aaf98926e0ba36ec808a96de76a3cd98 - ChainGetBlock: In=2, Out=2, CheckSum=0d2bba23d84a51413bbbebe218dcbcf9 - ChainGetBlockMessages: In=2, Out=2, CheckSum=944437b34bb952bf3d50aa6415c9e0d3 - ChainGetGenesis: In=1, Out=2, CheckSum=6d1e4c4d8184dc8d645a56278f14cfad - ChainGetMessage: In=2, Out=2, CheckSum=d1c0ae931458a2a7b07de152ca3de558 - ChainGetMessagesInTipset: In=2, Out=2, CheckSum=6c0bfa48ffcacdfa9dbed1b9e23ad88e - ChainGetNode: In=2, Out=2, CheckSum=66a718f5dbb8b0fcddcf761b58744e38 - ChainGetParentMessages: In=2, Out=2, CheckSum=e659caaae75cd643a7100b1c8cc3125a - ChainGetParentReceipts: In=2, Out=2, CheckSum=de820c5da3d8d036d854ce42ea9d85a3 - ChainGetPath: In=3, Out=2, CheckSum=a745af1a69b379493504c432b15839e7 - ChainGetRandomnessFromBeacon: In=5, Out=2, CheckSum=555559ae8c2c861ff4a73cd5f5955b25 - ChainGetRandomnessFromTickets: In=5, Out=2, CheckSum=555559ae8c2c861ff4a73cd5f5955b25 - ChainGetTipSet: In=2, Out=2, CheckSum=854d79b3a35822ab54e7459ad95816ad - ChainGetTipSetByHeight: In=3, Out=2, CheckSum=9831731a08357a0247d802268b57a497 - ChainHasObj: In=2, Out=2, CheckSum=7fe71bcffa1b110db106e0104e98a32f - ChainHead: In=1, Out=2, CheckSum=6d1e4c4d8184dc8d645a56278f14cfad - ChainNotify: In=1, Out=2, CheckSum=9525148e93a5b83600ebfbde4d24f3e9 - ChainReadObj: In=2, Out=2, CheckSum=6fd9244d87bf5d14fb5e79b0dbc0940d - ChainSetHead: In=2, Out=1, CheckSum=cdfe593ac791e823186abb77bfad49a0 - ChainStatObj: In=3, Out=2, CheckSum=9db2a0d97998daaf9c15e7c3d6ffe82d - ChainTipSetWeight: In=2, Out=2, CheckSum=22ac180fa0c583b4036666bfc155fd63 - ClientCalcCommP: In=2, Out=2, CheckSum=f83c6f3b9d823d22dfcd13e5aee9fb6b - ClientCancelDataTransfer: In=4, Out=1, CheckSum=074398536c75e25946c7f709574e0cdc - ClientCancelRetrievalDeal: In=2, Out=1, CheckSum=d289f4c3758ed7d6ab991b2cf569c969 - ClientDataTransferUpdates: In=1, Out=2, CheckSum=2d33b419e4b215c06ab0e8b66b5f8430 - ClientDealPieceCID: In=2, Out=2, CheckSum=93537a844ba6b74ec1ce82c887359a75 - ClientDealSize: In=2, Out=2, CheckSum=cca1dd5f58136af28546bdbdef2f948a - ClientFindData: In=3, Out=2, CheckSum=232da9eb987d92a76b37572c8f44bf53 - ClientGenCar: In=3, Out=1, CheckSum=b8a0c89fc2c7c16464ac968865e9c156 - ClientGetDealInfo: In=2, Out=2, CheckSum=e67f0e7b88aff099976b0f275b601c9c - ClientGetDealStatus: In=2, Out=2, CheckSum=1297eb9ae9a9ed209cfcb5899910f415 - ClientGetDealUpdates: In=1, Out=2, CheckSum=459cb2faa373d8dcf4cf8e33a2854366 - ClientGetRetrievalUpdates: In=1, Out=2, CheckSum=9390e4328ba9fe6c034341d574fd6f3d - ClientHasLocal: In=2, Out=2, CheckSum=7fe71bcffa1b110db106e0104e98a32f - ClientImport: In=2, Out=2, CheckSum=8c5886f6f2eb7b5db886d639c62e5808 - ClientListDataTransfers: In=1, Out=2, CheckSum=aa113d3aaf47f5b34fc947d26d58d001 - ClientListDeals: In=1, Out=2, CheckSum=fddf5a2bf3dd94a5aec97248ff7db918 - ClientListImports: In=1, Out=2, CheckSum=1966c3c721d57e0a728d3b51ba3a61d4 - ClientListRetrievals: In=1, Out=2, CheckSum=d5485e62b97cf31e1880d54808968895 - ClientMinerQueryOffer: In=4, Out=2, CheckSum=f57fabb5f04c1086302b43bd5087b9e2 - ClientQueryAsk: In=3, Out=2, CheckSum=2d06866277cf890ee42baa4bacffb2fc - ClientRemoveImport: In=2, Out=1, CheckSum=a3fcb78bf5bac553baac584941c1771f - ClientRestartDataTransfer: In=4, Out=1, CheckSum=074398536c75e25946c7f709574e0cdc - ClientRetrieve: In=3, Out=1, CheckSum=3b17e80e3a84f40959f87bff6359a49d - ClientRetrieveTryRestartInsufficientFunds: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 - ClientRetrieveWithEvents: In=3, Out=2, CheckSum=56e4fa49192938527c1f089b446f0860 - ClientStartDeal: In=2, Out=2, CheckSum=85256e9ef86dbb8ebeb76097c3eea078 - ClientStatelessDeal: In=2, Out=2, CheckSum=85256e9ef86dbb8ebeb76097c3eea078 - Closing: In=1, Out=2, CheckSum=3e0dae65a2378c12be14cee8a60a3bfe - CreateBackup: In=2, Out=1, CheckSum=7b0679c2c73ab9606a7da21c5251ad19 - Discover: In=1, Out=2, CheckSum=09640e20c6d71c3e96c7a56c8698acc9 - GasEstimateFeeCap: In=4, Out=2, CheckSum=0fcac02de1d21c9ac6e10696a6499eba - GasEstimateGasLimit: In=3, Out=2, CheckSum=4d1bd57eef0ee90d4c2e89f097d0604d - GasEstimateGasPremium: In=5, Out=2, CheckSum=550724ed37e2fdaa64e55147e82214b1 - GasEstimateMessageGas: In=4, Out=2, CheckSum=6ff6179b579feed33897d96429504624 - ID: In=1, Out=2, CheckSum=1695f00523f88afb55c5df6053bf9ee4 - LogAlerts: In=1, Out=2, CheckSum=c9262fa7c93e891ec80868e0b83a2222 - LogList: In=1, Out=2, CheckSum=c6d763b6ec7190283b7c648e735725c0 - LogSetLevel: In=3, Out=1, CheckSum=ffdc3b95db02b9026a12c29d899e0059 - MarketAddBalance: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 - MarketGetReserved: In=2, Out=2, CheckSum=f1426bf8d7a1afdeaae0cd561fbbfbb0 - MarketReleaseFunds: In=3, Out=1, CheckSum=c20c4060f72c1a1ab8176a4936292a1e - MarketReserveFunds: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 - MarketWithdraw: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 - MinerCreateBlock: In=2, Out=2, CheckSum=c8749e2acc2143226c34fdf3965fd4b9 - MinerGetBaseInfo: In=4, Out=2, CheckSum=a9ead3443999aba71e9444c0cd9730a2 - MpoolBatchPush: In=2, Out=2, CheckSum=4f34d25c5ddbe15922545c0c28c40830 - MpoolBatchPushMessage: In=3, Out=2, CheckSum=66b4628bc63c8ca4bc31db0393ade01b - MpoolBatchPushUntrusted: In=2, Out=2, CheckSum=4f34d25c5ddbe15922545c0c28c40830 - MpoolClear: In=2, Out=1, CheckSum=790632b52ba8d2fb863afad93556528c - MpoolGetConfig: In=1, Out=2, CheckSum=b28b0828ec4c43c705feb84536e66aa8 - MpoolGetNonce: In=2, Out=2, CheckSum=2f0992ed1f0be8ff9bee0c3f0a39e1e1 - MpoolPending: In=2, Out=2, CheckSum=867ae9cbeb080683492ec76cc0c1ea7f - MpoolPush: In=2, Out=2, CheckSum=3b29294f39a940d77be58a07e30e8d4b - MpoolPushMessage: In=3, Out=2, CheckSum=97e029b4d408862c42035318e3c21d05 - MpoolPushUntrusted: In=2, Out=2, CheckSum=3b29294f39a940d77be58a07e30e8d4b - MpoolSelect: In=3, Out=2, CheckSum=a524ad1b1c0d7d27b21c69c62e926f9c - MpoolSetConfig: In=2, Out=1, CheckSum=f1ed0cdb9842cfb5176188c281577fba - MpoolSub: In=1, Out=2, CheckSum=337ebc027637bda66141bad6af2f6cc4 - MsigAddApprove: In=7, Out=2, CheckSum=4dbd86148df51d0975f2f5c6adac7c00 - MsigAddCancel: In=6, Out=2, CheckSum=afb744caa58c307fffa99d052c97e9c7 - MsigAddPropose: In=5, Out=2, CheckSum=6d40bd8a8f2563f75402a23915a23000 - MsigApprove: In=4, Out=2, CheckSum=09bc2481f1717ddc5147c1e8eb76bbbc - MsigApproveTxnHash: In=9, Out=2, CheckSum=7715b69bd67ece799d3da978457a2915 - MsigCancel: In=8, Out=2, CheckSum=6a9360010be0849bd6c588dd6759af41 - MsigCreate: In=7, Out=2, CheckSum=ef93a3c107e73884b4073f01da738bce - MsigGetAvailableBalance: In=3, Out=2, CheckSum=a05010da3c73edfba49c3b5d28a216cd - MsigGetPending: In=3, Out=2, CheckSum=895d889866adf330c83b8dffdbd27fac - MsigGetVested: In=4, Out=2, CheckSum=33d14f7f35b833b5b9dd6b2188c84324 - MsigGetVestingSchedule: In=3, Out=2, CheckSum=b9caf183f11d2a8e611b1daea98ad69e - MsigPropose: In=7, Out=2, CheckSum=f297212379eac659948e303e5be88c0b - MsigRemoveSigner: In=5, Out=2, CheckSum=6d40bd8a8f2563f75402a23915a23000 - MsigSwapApprove: In=7, Out=2, CheckSum=17c75be766c59016bc4a4d583b297d2f - MsigSwapCancel: In=6, Out=2, CheckSum=e2222a10bb1cf80d1fdb56be22b07800 - MsigSwapPropose: In=5, Out=2, CheckSum=f207e1bd168bfd4258481aacf03b4ed4 - NetAddrsListen: In=1, Out=2, CheckSum=edb8238a53eb0480f852309ccee11c23 - NetAgentVersion: In=2, Out=2, CheckSum=21c48e39a45af1b545fa3612c5e8d20d - NetAutoNatStatus: In=1, Out=2, CheckSum=05d1ab4460587ed623f3ce1e1f193a83 - NetBandwidthStats: In=1, Out=2, CheckSum=8309e47349b264349eb41a1105c36f14 - NetBandwidthStatsByPeer: In=1, Out=2, CheckSum=c58b4378b7d5bd90ba6e1725b717fade - NetBandwidthStatsByProtocol: In=1, Out=2, CheckSum=53627d49fb1ca70ca88666f0c4764250 - NetBlockAdd: In=2, Out=1, CheckSum=bb826402a0a2406da30862a2c08af435 - NetBlockList: In=1, Out=2, CheckSum=174b57557c7d7487b5b204f961e33abc - NetBlockRemove: In=2, Out=1, CheckSum=bb826402a0a2406da30862a2c08af435 - NetConnect: In=2, Out=1, CheckSum=5258b1ca3f00aec9c2a0d53bb9e78ef7 - NetConnectedness: In=2, Out=2, CheckSum=e489a3544ead801c9121171bdf1f3971 - NetDisconnect: In=2, Out=1, CheckSum=814e6b52918db98c4883832a38cd222b - NetFindPeer: In=2, Out=2, CheckSum=2ffcd1ed349f87c3cc0e2bb1ee2d68c6 - NetPeerInfo: In=2, Out=2, CheckSum=1c030faf779524a321fe8cec305b9f25 - NetPeers: In=1, Out=2, CheckSum=487043eee4cf0ea002d7a6d0a7ff793b - NetPubsubScores: In=1, Out=2, CheckSum=66c7a1061de3d6e11d39ce90692aa885 - PaychAllocateLane: In=2, Out=2, CheckSum=2f0992ed1f0be8ff9bee0c3f0a39e1e1 - PaychAvailableFunds: In=2, Out=2, CheckSum=f40942f65ce181601e7bc49e6378a89c - PaychAvailableFundsByFromTo: In=3, Out=2, CheckSum=829ff29d78db755f3c13ab3259adb32b - PaychCollect: In=2, Out=2, CheckSum=fdb746bab5f269b63dc0256d50570d81 - PaychGet: In=4, Out=2, CheckSum=f7fb571ad0461c404a0789f6b8c38501 - PaychGetWaitReady: In=2, Out=2, CheckSum=59546a25118c9e0dbb3ad569d3ec0c6f - PaychList: In=1, Out=2, CheckSum=566d37a33889023f9f73c632fa4e8279 - PaychNewPayment: In=4, Out=2, CheckSum=8bb33e38d75917df1357fcf071335ba9 - PaychSettle: In=2, Out=2, CheckSum=fdb746bab5f269b63dc0256d50570d81 - PaychStatus: In=2, Out=2, CheckSum=ae911e02219f1412acb95e95a4065478 - PaychVoucherAdd: In=5, Out=2, CheckSum=8abddd426fa4de6362414384cdec101c - PaychVoucherCheckSpendable: In=5, Out=2, CheckSum=ab5f887200e92223e9adb9573f32e23f - PaychVoucherCheckValid: In=3, Out=1, CheckSum=52e8d077109b5410e1dead7e9bf696b0 - PaychVoucherCreate: In=4, Out=2, CheckSum=e5113a58d351abf5cadd77b46f690c2d - PaychVoucherList: In=2, Out=2, CheckSum=55450ef559b971b6894fb3865003b7b4 - PaychVoucherSubmit: In=5, Out=2, CheckSum=158150e9cb2e2d176ee9ba4674d382d9 - Session: In=1, Out=2, CheckSum=cdb04ef6a97114c8f24f456a2e70f1cd - Shutdown: In=1, Out=1, CheckSum=c39be30cc5a8826024fcf4d23e7017d6 - StateAccountKey: In=3, Out=2, CheckSum=9b6f9fdaea5bb22c60772266c418d98f - StateAllMinerFaults: In=3, Out=2, CheckSum=a17e05b21e1ecc8da867e2f76df6c46c - StateCall: In=3, Out=2, CheckSum=b33ab6c7df31d805c256c8ab6691b085 - StateChangedActors: In=3, Out=2, CheckSum=cbc0cd36e495552a6672caab9f839468 - StateCirculatingSupply: In=2, Out=2, CheckSum=22ac180fa0c583b4036666bfc155fd63 - StateCompute: In=4, Out=2, CheckSum=1d429c389354255c7f865f00a59e3888 - StateDealProviderCollateralBounds: In=4, Out=2, CheckSum=5231e44843c0b74a04371e1e7170d4b2 - StateDecodeParams: In=5, Out=2, CheckSum=8c6311be4dc064a657368516c33e1307 - StateGetActor: In=3, Out=2, CheckSum=adcd0bbd36e3ab94f777c7cb3df1fb34 - StateGetRandomnessFromBeacon: In=5, Out=2, CheckSum=b98225c36bf011979dbcad0fb938e659 - StateGetRandomnessFromTickets: In=5, Out=2, CheckSum=b98225c36bf011979dbcad0fb938e659 - StateGetReceipt: In=3, Out=2, CheckSum=03f4f567eaa55a6ccad8b4a4c95b590a - StateListActors: In=2, Out=2, CheckSum=57bcc4526adaf4b0582c0b117d39b042 - StateListMessages: In=4, Out=2, CheckSum=f12ce9e8a127bf320fb0b289a19b4ea6 - StateListMiners: In=2, Out=2, CheckSum=57bcc4526adaf4b0582c0b117d39b042 - StateLookupID: In=3, Out=2, CheckSum=9b6f9fdaea5bb22c60772266c418d98f - StateMarketBalance: In=3, Out=2, CheckSum=bbab976bd25166200f737c94fc970bc7 - StateMarketDeals: In=2, Out=2, CheckSum=38821c8f592f6f56eb985973ac1ffd36 - StateMarketParticipants: In=2, Out=2, CheckSum=acc9019d0b6e389743c6f992350f407c - StateMarketStorageDeal: In=3, Out=2, CheckSum=94af302d39beba9f0ce7648f4118b6aa - StateMinerActiveSectors: In=3, Out=2, CheckSum=bac211cd5a37bfadf156b636ad7b9381 - StateMinerAvailableBalance: In=3, Out=2, CheckSum=a05010da3c73edfba49c3b5d28a216cd - StateMinerDeadlines: In=3, Out=2, CheckSum=5b128c75ba4953740906520cca96b962 - StateMinerFaults: In=3, Out=2, CheckSum=9d26d848f93597964f751b43edd3d476 - StateMinerInfo: In=3, Out=2, CheckSum=0782a05b506c86bcfb47082a6f8e37fc - StateMinerInitialPledgeCollateral: In=4, Out=2, CheckSum=d87787cc5072c480ed580099fc926668 - StateMinerPartitions: In=4, Out=2, CheckSum=b3cba1da3bd87c433cb8f9df7f7edc09 - StateMinerPower: In=3, Out=2, CheckSum=0e70a6360616c25624118181f764d7df - StateMinerPreCommitDepositForPower: In=4, Out=2, CheckSum=d87787cc5072c480ed580099fc926668 - StateMinerProvingDeadline: In=3, Out=2, CheckSum=8c6037a054ad720ecfb3d0c3f4f90fe6 - StateMinerRecoveries: In=3, Out=2, CheckSum=9d26d848f93597964f751b43edd3d476 - StateMinerSectorAllocated: In=4, Out=2, CheckSum=2accd56a9e9196fa1ca85a1d60e19fc2 - StateMinerSectorCount: In=3, Out=2, CheckSum=573483cbcf3ccdd38063b9ce16453dc2 - StateMinerSectors: In=4, Out=2, CheckSum=c04491aa9e0e6e9a743046c60e13683d - StateNetworkName: In=1, Out=2, CheckSum=afb82130640a26dcd9d7010f31c69572 - StateNetworkVersion: In=2, Out=2, CheckSum=47de92e3b59793ade53abd96c347bace - StateReadState: In=3, Out=2, CheckSum=f53f39943eea93d5f3dd64f1389e4c64 - StateReplay: In=3, Out=2, CheckSum=ec89143eb01290212c3ce0032f62c5fc - StateSearchMsg: In=2, Out=2, CheckSum=e4186ab56a9d2e3c99174110e3f697dc - StateSearchMsgLimited: In=3, Out=2, CheckSum=8990ed018d033c44ebb38c0d077bc6d0 - StateSectorExpiration: In=4, Out=2, CheckSum=bb669c8b66b6f74c681b4345c9e4cc8f - StateSectorGetInfo: In=4, Out=2, CheckSum=27a4e36a319274aca9597f105bc438ff - StateSectorPartition: In=4, Out=2, CheckSum=e3743df55a360243a32ac64ce1282c53 - StateSectorPreCommitInfo: In=4, Out=2, CheckSum=40e05fc7142ce524b9a58e8655ce5a01 - StateVMCirculatingSupplyInternal: In=2, Out=2, CheckSum=05c2114e08be095cece55db19e214d2c - StateVerifiedClientStatus: In=3, Out=2, CheckSum=e33ae4cd2315832f2d6f2aa74b68c34e - StateVerifiedRegistryRootKey: In=2, Out=2, CheckSum=5ad3a497ee24e321c780a69b8d2f0936 - StateVerifierStatus: In=3, Out=2, CheckSum=e33ae4cd2315832f2d6f2aa74b68c34e - StateWaitMsg: In=3, Out=2, CheckSum=f997714e2214b7122462163c5e7bc9a2 - StateWaitMsgLimited: In=4, Out=2, CheckSum=0b59c44082d62b85343ca111441315a1 - SyncCheckBad: In=2, Out=2, CheckSum=ba06470da0ca1d6cc2f9ada7f0288a6c - SyncCheckpoint: In=2, Out=1, CheckSum=cdfe593ac791e823186abb77bfad49a0 - SyncIncomingBlocks: In=1, Out=2, CheckSum=f6ad051ba2ce73511f74f9c08032acc3 - SyncMarkBad: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 - SyncState: In=1, Out=2, CheckSum=7004fd3e7bf60990cb1695fa5883d08f - SyncSubmitBlock: In=2, Out=1, CheckSum=04cdc7641df5628e2ef8c90584936142 - SyncUnmarkAllBad: In=1, Out=1, CheckSum=c39be30cc5a8826024fcf4d23e7017d6 - SyncUnmarkBad: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 - SyncValidateTipset: In=2, Out=2, CheckSum=a244b60fe32e540879ec4eeded71136b - Version: In=1, Out=2, CheckSum=0e78a1023c652297e66079f521e11624 - WalletBalance: In=2, Out=2, CheckSum=f1426bf8d7a1afdeaae0cd561fbbfbb0 - WalletDefaultAddress: In=1, Out=2, CheckSum=5591bbacb9b8345a4a07a149c963df55 - WalletDelete: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 - WalletExport: In=2, Out=2, CheckSum=5db217de8a3ec9ecbed4cc583e473991 - WalletHas: In=2, Out=2, CheckSum=9ad76c8c583af5b5a5d0202c0a3fe7f4 - WalletImport: In=2, Out=2, CheckSum=617245aaab0381dc634a2ad50dd440b3 - WalletList: In=1, Out=2, CheckSum=566d37a33889023f9f73c632fa4e8279 - WalletNew: In=2, Out=2, CheckSum=266c59d3ee6f0b3a66e8dbdec099ef06 - WalletSetDefault: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 - WalletSign: In=3, Out=2, CheckSum=b5a8800f8b60b92c4d99e9cb0fcff086 - WalletSignMessage: In=3, Out=2, CheckSum=c9f0ea6123a189cfeab06ce6bdeda7b3 - WalletValidateAddress: In=2, Out=2, CheckSum=610b35f7aa87b32463e5c2a9b4bd3f55 - WalletVerify: In=4, Out=2, CheckSum=9b22231e95efdfb94d9d55038f500636 - -api.FullNode: - AuthNew: In=2, Out=2, CheckSum=248fe5ed43f2e294ea5d71596b9272ac - AuthVerify: In=2, Out=2, CheckSum=c156d52455ed5f2d227e08a518d5f8a1 - BeaconGetEntry: In=2, Out=2, CheckSum=c74f5c0f4039207ea45c11bfe3319c38 - ChainBlockstoreInfo: In=1, Out=2, CheckSum=09640e20c6d71c3e96c7a56c8698acc9 - ChainCheckBlockstore: In=1, Out=1, CheckSum=c39be30cc5a8826024fcf4d23e7017d6 - ChainDeleteObj: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 - ChainExport: In=4, Out=2, CheckSum=aaf98926e0ba36ec808a96de76a3cd98 - ChainGetBlock: In=2, Out=2, CheckSum=0d2bba23d84a51413bbbebe218dcbcf9 - ChainGetBlockMessages: In=2, Out=2, CheckSum=944437b34bb952bf3d50aa6415c9e0d3 - ChainGetGenesis: In=1, Out=2, CheckSum=6d1e4c4d8184dc8d645a56278f14cfad - ChainGetMessage: In=2, Out=2, CheckSum=d1c0ae931458a2a7b07de152ca3de558 - ChainGetMessagesInTipset: In=2, Out=2, CheckSum=6c0bfa48ffcacdfa9dbed1b9e23ad88e - ChainGetNode: In=2, Out=2, CheckSum=66a718f5dbb8b0fcddcf761b58744e38 - ChainGetParentMessages: In=2, Out=2, CheckSum=e659caaae75cd643a7100b1c8cc3125a - ChainGetParentReceipts: In=2, Out=2, CheckSum=de820c5da3d8d036d854ce42ea9d85a3 - ChainGetPath: In=3, Out=2, CheckSum=a745af1a69b379493504c432b15839e7 - ChainGetTipSet: In=2, Out=2, CheckSum=854d79b3a35822ab54e7459ad95816ad - ChainGetTipSetAfterHeight: In=3, Out=2, CheckSum=9831731a08357a0247d802268b57a497 - ChainGetTipSetByHeight: In=3, Out=2, CheckSum=9831731a08357a0247d802268b57a497 - ChainHasObj: In=2, Out=2, CheckSum=7fe71bcffa1b110db106e0104e98a32f - ChainHead: In=1, Out=2, CheckSum=6d1e4c4d8184dc8d645a56278f14cfad - ChainNotify: In=1, Out=2, CheckSum=9525148e93a5b83600ebfbde4d24f3e9 - ChainReadObj: In=2, Out=2, CheckSum=6fd9244d87bf5d14fb5e79b0dbc0940d - ChainSetHead: In=2, Out=1, CheckSum=cdfe593ac791e823186abb77bfad49a0 - ChainStatObj: In=3, Out=2, CheckSum=9db2a0d97998daaf9c15e7c3d6ffe82d - ChainTipSetWeight: In=2, Out=2, CheckSum=22ac180fa0c583b4036666bfc155fd63 - ClientCalcCommP: In=2, Out=2, CheckSum=f83c6f3b9d823d22dfcd13e5aee9fb6b - ClientCancelDataTransfer: In=4, Out=1, CheckSum=074398536c75e25946c7f709574e0cdc - ClientCancelRetrievalDeal: In=2, Out=1, CheckSum=d289f4c3758ed7d6ab991b2cf569c969 - ClientDataTransferUpdates: In=1, Out=2, CheckSum=2d33b419e4b215c06ab0e8b66b5f8430 - ClientDealPieceCID: In=2, Out=2, CheckSum=93537a844ba6b74ec1ce82c887359a75 - ClientDealSize: In=2, Out=2, CheckSum=cca1dd5f58136af28546bdbdef2f948a - ClientExport: In=3, Out=1, CheckSum=77c3a3632e06654aee2dade7aa467433 - ClientFindData: In=3, Out=2, CheckSum=232da9eb987d92a76b37572c8f44bf53 - ClientGenCar: In=3, Out=1, CheckSum=b8a0c89fc2c7c16464ac968865e9c156 - ClientGetDealInfo: In=2, Out=2, CheckSum=e67f0e7b88aff099976b0f275b601c9c - ClientGetDealStatus: In=2, Out=2, CheckSum=1297eb9ae9a9ed209cfcb5899910f415 - ClientGetDealUpdates: In=1, Out=2, CheckSum=459cb2faa373d8dcf4cf8e33a2854366 - ClientGetRetrievalUpdates: In=1, Out=2, CheckSum=9390e4328ba9fe6c034341d574fd6f3d - ClientHasLocal: In=2, Out=2, CheckSum=7fe71bcffa1b110db106e0104e98a32f - ClientImport: In=2, Out=2, CheckSum=8c5886f6f2eb7b5db886d639c62e5808 - ClientListDataTransfers: In=1, Out=2, CheckSum=aa113d3aaf47f5b34fc947d26d58d001 - ClientListDeals: In=1, Out=2, CheckSum=fddf5a2bf3dd94a5aec97248ff7db918 - ClientListImports: In=1, Out=2, CheckSum=1966c3c721d57e0a728d3b51ba3a61d4 - ClientListRetrievals: In=1, Out=2, CheckSum=d5485e62b97cf31e1880d54808968895 - ClientMinerQueryOffer: In=4, Out=2, CheckSum=f57fabb5f04c1086302b43bd5087b9e2 - ClientQueryAsk: In=3, Out=2, CheckSum=2d06866277cf890ee42baa4bacffb2fc - ClientRemoveImport: In=2, Out=1, CheckSum=a3fcb78bf5bac553baac584941c1771f - ClientRestartDataTransfer: In=4, Out=1, CheckSum=074398536c75e25946c7f709574e0cdc - ClientRetrieve: In=2, Out=2, CheckSum=b941d6f05cbec209e2f347b6826717e1 - ClientRetrieveTryRestartInsufficientFunds: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 - ClientRetrieveWait: In=2, Out=1, CheckSum=d289f4c3758ed7d6ab991b2cf569c969 - ClientStartDeal: In=2, Out=2, CheckSum=85256e9ef86dbb8ebeb76097c3eea078 - ClientStatelessDeal: In=2, Out=2, CheckSum=85256e9ef86dbb8ebeb76097c3eea078 - Closing: In=1, Out=2, CheckSum=3e0dae65a2378c12be14cee8a60a3bfe - CreateBackup: In=2, Out=1, CheckSum=7b0679c2c73ab9606a7da21c5251ad19 - Discover: In=1, Out=2, CheckSum=09640e20c6d71c3e96c7a56c8698acc9 - GasEstimateFeeCap: In=4, Out=2, CheckSum=0fcac02de1d21c9ac6e10696a6499eba - GasEstimateGasLimit: In=3, Out=2, CheckSum=4d1bd57eef0ee90d4c2e89f097d0604d - GasEstimateGasPremium: In=5, Out=2, CheckSum=550724ed37e2fdaa64e55147e82214b1 - GasEstimateMessageGas: In=4, Out=2, CheckSum=6ff6179b579feed33897d96429504624 - ID: In=1, Out=2, CheckSum=1695f00523f88afb55c5df6053bf9ee4 - LogAlerts: In=1, Out=2, CheckSum=c9262fa7c93e891ec80868e0b83a2222 - LogList: In=1, Out=2, CheckSum=c6d763b6ec7190283b7c648e735725c0 - LogSetLevel: In=3, Out=1, CheckSum=ffdc3b95db02b9026a12c29d899e0059 - MarketAddBalance: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 - MarketGetReserved: In=2, Out=2, CheckSum=f1426bf8d7a1afdeaae0cd561fbbfbb0 - MarketReleaseFunds: In=3, Out=1, CheckSum=c20c4060f72c1a1ab8176a4936292a1e - MarketReserveFunds: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 - MarketWithdraw: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 - MinerCreateBlock: In=2, Out=2, CheckSum=c8749e2acc2143226c34fdf3965fd4b9 - MinerGetBaseInfo: In=4, Out=2, CheckSum=a9ead3443999aba71e9444c0cd9730a2 - MpoolBatchPush: In=2, Out=2, CheckSum=4f34d25c5ddbe15922545c0c28c40830 - MpoolBatchPushMessage: In=3, Out=2, CheckSum=66b4628bc63c8ca4bc31db0393ade01b - MpoolBatchPushUntrusted: In=2, Out=2, CheckSum=4f34d25c5ddbe15922545c0c28c40830 - MpoolCheckMessages: In=2, Out=2, CheckSum=4bf8491c98028f49b05ff0f1d6e3eaf7 - MpoolCheckPendingMessages: In=2, Out=2, CheckSum=f4a139f9278ea6fb2158a05c24c769fb - MpoolCheckReplaceMessages: In=2, Out=2, CheckSum=d8312bb585f0696c77b4d02c84293cdd - MpoolClear: In=2, Out=1, CheckSum=790632b52ba8d2fb863afad93556528c - MpoolGetConfig: In=1, Out=2, CheckSum=b28b0828ec4c43c705feb84536e66aa8 - MpoolGetNonce: In=2, Out=2, CheckSum=2f0992ed1f0be8ff9bee0c3f0a39e1e1 - MpoolPending: In=2, Out=2, CheckSum=867ae9cbeb080683492ec76cc0c1ea7f - MpoolPush: In=2, Out=2, CheckSum=3b29294f39a940d77be58a07e30e8d4b - MpoolPushMessage: In=3, Out=2, CheckSum=97e029b4d408862c42035318e3c21d05 - MpoolPushUntrusted: In=2, Out=2, CheckSum=3b29294f39a940d77be58a07e30e8d4b - MpoolSelect: In=3, Out=2, CheckSum=a524ad1b1c0d7d27b21c69c62e926f9c - MpoolSetConfig: In=2, Out=1, CheckSum=f1ed0cdb9842cfb5176188c281577fba - MpoolSub: In=1, Out=2, CheckSum=337ebc027637bda66141bad6af2f6cc4 - MsigAddApprove: In=7, Out=2, CheckSum=f622ab6c302078342d7834f0c32ddbdb - MsigAddCancel: In=6, Out=2, CheckSum=31b5b364ddd3e12c9d310a9868c6fda2 - MsigAddPropose: In=5, Out=2, CheckSum=801a2539853f3e7206fd87fc4171c40b - MsigApprove: In=4, Out=2, CheckSum=3384d4133b5559461f919c3bdb1dac41 - MsigApproveTxnHash: In=9, Out=2, CheckSum=9a7460af699e6aa82452157078046018 - MsigCancel: In=4, Out=2, CheckSum=3384d4133b5559461f919c3bdb1dac41 - MsigCancelTxnHash: In=8, Out=2, CheckSum=912010a9da971230c20e5503503e33e2 - MsigCreate: In=7, Out=2, CheckSum=3b8196718c58238e8579cd1e2b8368d9 - MsigGetAvailableBalance: In=3, Out=2, CheckSum=a05010da3c73edfba49c3b5d28a216cd - MsigGetPending: In=3, Out=2, CheckSum=895d889866adf330c83b8dffdbd27fac - MsigGetVested: In=4, Out=2, CheckSum=33d14f7f35b833b5b9dd6b2188c84324 - MsigGetVestingSchedule: In=3, Out=2, CheckSum=b9caf183f11d2a8e611b1daea98ad69e - MsigPropose: In=7, Out=2, CheckSum=22d693fea428a547510ddd48222c5f7a - MsigRemoveSigner: In=5, Out=2, CheckSum=801a2539853f3e7206fd87fc4171c40b - MsigSwapApprove: In=7, Out=2, CheckSum=15b73f7c86aa2009ab368b43d96b5485 - MsigSwapCancel: In=6, Out=2, CheckSum=47441127af7eaa6580d48b2daa13fd1d - MsigSwapPropose: In=5, Out=2, CheckSum=2766f47b61843d276e20ab487ac9849a - NetAddrsListen: In=1, Out=2, CheckSum=edb8238a53eb0480f852309ccee11c23 - NetAgentVersion: In=2, Out=2, CheckSum=21c48e39a45af1b545fa3612c5e8d20d - NetAutoNatStatus: In=1, Out=2, CheckSum=05d1ab4460587ed623f3ce1e1f193a83 - NetBandwidthStats: In=1, Out=2, CheckSum=8309e47349b264349eb41a1105c36f14 - NetBandwidthStatsByPeer: In=1, Out=2, CheckSum=c58b4378b7d5bd90ba6e1725b717fade - NetBandwidthStatsByProtocol: In=1, Out=2, CheckSum=53627d49fb1ca70ca88666f0c4764250 - NetBlockAdd: In=2, Out=1, CheckSum=bb826402a0a2406da30862a2c08af435 - NetBlockList: In=1, Out=2, CheckSum=174b57557c7d7487b5b204f961e33abc - NetBlockRemove: In=2, Out=1, CheckSum=bb826402a0a2406da30862a2c08af435 - NetConnect: In=2, Out=1, CheckSum=5258b1ca3f00aec9c2a0d53bb9e78ef7 - NetConnectedness: In=2, Out=2, CheckSum=e489a3544ead801c9121171bdf1f3971 - NetDisconnect: In=2, Out=1, CheckSum=814e6b52918db98c4883832a38cd222b - NetFindPeer: In=2, Out=2, CheckSum=2ffcd1ed349f87c3cc0e2bb1ee2d68c6 - NetPeerInfo: In=2, Out=2, CheckSum=1c030faf779524a321fe8cec305b9f25 - NetPeers: In=1, Out=2, CheckSum=487043eee4cf0ea002d7a6d0a7ff793b - NetPubsubScores: In=1, Out=2, CheckSum=66c7a1061de3d6e11d39ce90692aa885 - NodeStatus: In=2, Out=2, CheckSum=b46530b68171c85301db86c1b7c19824 - PaychAllocateLane: In=2, Out=2, CheckSum=2f0992ed1f0be8ff9bee0c3f0a39e1e1 - PaychAvailableFunds: In=2, Out=2, CheckSum=f40942f65ce181601e7bc49e6378a89c - PaychAvailableFundsByFromTo: In=3, Out=2, CheckSum=829ff29d78db755f3c13ab3259adb32b - PaychCollect: In=2, Out=2, CheckSum=fdb746bab5f269b63dc0256d50570d81 - PaychGet: In=4, Out=2, CheckSum=f7fb571ad0461c404a0789f6b8c38501 - PaychGetWaitReady: In=2, Out=2, CheckSum=59546a25118c9e0dbb3ad569d3ec0c6f - PaychList: In=1, Out=2, CheckSum=566d37a33889023f9f73c632fa4e8279 - PaychNewPayment: In=4, Out=2, CheckSum=8bb33e38d75917df1357fcf071335ba9 - PaychSettle: In=2, Out=2, CheckSum=fdb746bab5f269b63dc0256d50570d81 - PaychStatus: In=2, Out=2, CheckSum=ae911e02219f1412acb95e95a4065478 - PaychVoucherAdd: In=5, Out=2, CheckSum=8abddd426fa4de6362414384cdec101c - PaychVoucherCheckSpendable: In=5, Out=2, CheckSum=ab5f887200e92223e9adb9573f32e23f - PaychVoucherCheckValid: In=3, Out=1, CheckSum=52e8d077109b5410e1dead7e9bf696b0 - PaychVoucherCreate: In=4, Out=2, CheckSum=e5113a58d351abf5cadd77b46f690c2d - PaychVoucherList: In=2, Out=2, CheckSum=55450ef559b971b6894fb3865003b7b4 - PaychVoucherSubmit: In=5, Out=2, CheckSum=158150e9cb2e2d176ee9ba4674d382d9 - Session: In=1, Out=2, CheckSum=cdb04ef6a97114c8f24f456a2e70f1cd - Shutdown: In=1, Out=1, CheckSum=c39be30cc5a8826024fcf4d23e7017d6 - StateAccountKey: In=3, Out=2, CheckSum=9b6f9fdaea5bb22c60772266c418d98f - StateAllMinerFaults: In=3, Out=2, CheckSum=a17e05b21e1ecc8da867e2f76df6c46c - StateCall: In=3, Out=2, CheckSum=b33ab6c7df31d805c256c8ab6691b085 - StateChangedActors: In=3, Out=2, CheckSum=cbc0cd36e495552a6672caab9f839468 - StateCirculatingSupply: In=2, Out=2, CheckSum=22ac180fa0c583b4036666bfc155fd63 - StateCompute: In=4, Out=2, CheckSum=1d429c389354255c7f865f00a59e3888 - StateDealProviderCollateralBounds: In=4, Out=2, CheckSum=5231e44843c0b74a04371e1e7170d4b2 - StateDecodeParams: In=5, Out=2, CheckSum=8c6311be4dc064a657368516c33e1307 - StateEncodeParams: In=4, Out=2, CheckSum=3e1a5390b92b1b69f9be038cd7400e38 - StateGetActor: In=3, Out=2, CheckSum=adcd0bbd36e3ab94f777c7cb3df1fb34 - StateGetRandomnessFromBeacon: In=5, Out=2, CheckSum=b98225c36bf011979dbcad0fb938e659 - StateGetRandomnessFromTickets: In=5, Out=2, CheckSum=b98225c36bf011979dbcad0fb938e659 - StateListActors: In=2, Out=2, CheckSum=57bcc4526adaf4b0582c0b117d39b042 - StateListMessages: In=4, Out=2, CheckSum=f12ce9e8a127bf320fb0b289a19b4ea6 - StateListMiners: In=2, Out=2, CheckSum=57bcc4526adaf4b0582c0b117d39b042 - StateLookupID: In=3, Out=2, CheckSum=9b6f9fdaea5bb22c60772266c418d98f - StateMarketBalance: In=3, Out=2, CheckSum=bbab976bd25166200f737c94fc970bc7 - StateMarketDeals: In=2, Out=2, CheckSum=38821c8f592f6f56eb985973ac1ffd36 - StateMarketParticipants: In=2, Out=2, CheckSum=acc9019d0b6e389743c6f992350f407c - StateMarketStorageDeal: In=3, Out=2, CheckSum=94af302d39beba9f0ce7648f4118b6aa - StateMinerActiveSectors: In=3, Out=2, CheckSum=bac211cd5a37bfadf156b636ad7b9381 - StateMinerAvailableBalance: In=3, Out=2, CheckSum=a05010da3c73edfba49c3b5d28a216cd - StateMinerDeadlines: In=3, Out=2, CheckSum=5b128c75ba4953740906520cca96b962 - StateMinerFaults: In=3, Out=2, CheckSum=9d26d848f93597964f751b43edd3d476 - StateMinerInfo: In=3, Out=2, CheckSum=0782a05b506c86bcfb47082a6f8e37fc - StateMinerInitialPledgeCollateral: In=4, Out=2, CheckSum=d87787cc5072c480ed580099fc926668 - StateMinerPartitions: In=4, Out=2, CheckSum=b3cba1da3bd87c433cb8f9df7f7edc09 - StateMinerPower: In=3, Out=2, CheckSum=0e70a6360616c25624118181f764d7df - StateMinerPreCommitDepositForPower: In=4, Out=2, CheckSum=d87787cc5072c480ed580099fc926668 - StateMinerProvingDeadline: In=3, Out=2, CheckSum=8c6037a054ad720ecfb3d0c3f4f90fe6 - StateMinerRecoveries: In=3, Out=2, CheckSum=9d26d848f93597964f751b43edd3d476 - StateMinerSectorAllocated: In=4, Out=2, CheckSum=2accd56a9e9196fa1ca85a1d60e19fc2 - StateMinerSectorCount: In=3, Out=2, CheckSum=573483cbcf3ccdd38063b9ce16453dc2 - StateMinerSectors: In=4, Out=2, CheckSum=c04491aa9e0e6e9a743046c60e13683d - StateNetworkName: In=1, Out=2, CheckSum=afb82130640a26dcd9d7010f31c69572 - StateNetworkVersion: In=2, Out=2, CheckSum=47de92e3b59793ade53abd96c347bace - StateReadState: In=3, Out=2, CheckSum=f53f39943eea93d5f3dd64f1389e4c64 - StateReplay: In=3, Out=2, CheckSum=ec89143eb01290212c3ce0032f62c5fc - StateSearchMsg: In=5, Out=2, CheckSum=05ad20588933ea6ffa941f47b826708a - StateSectorExpiration: In=4, Out=2, CheckSum=bb669c8b66b6f74c681b4345c9e4cc8f - StateSectorGetInfo: In=4, Out=2, CheckSum=27a4e36a319274aca9597f105bc438ff - StateSectorPartition: In=4, Out=2, CheckSum=e3743df55a360243a32ac64ce1282c53 - StateSectorPreCommitInfo: In=4, Out=2, CheckSum=40e05fc7142ce524b9a58e8655ce5a01 - StateVMCirculatingSupplyInternal: In=2, Out=2, CheckSum=05c2114e08be095cece55db19e214d2c - StateVerifiedClientStatus: In=3, Out=2, CheckSum=e33ae4cd2315832f2d6f2aa74b68c34e - StateVerifiedRegistryRootKey: In=2, Out=2, CheckSum=5ad3a497ee24e321c780a69b8d2f0936 - StateVerifierStatus: In=3, Out=2, CheckSum=e33ae4cd2315832f2d6f2aa74b68c34e - StateWaitMsg: In=5, Out=2, CheckSum=561c18d1417310b5cd35cfffb0b75a00 - SyncCheckBad: In=2, Out=2, CheckSum=ba06470da0ca1d6cc2f9ada7f0288a6c - SyncCheckpoint: In=2, Out=1, CheckSum=cdfe593ac791e823186abb77bfad49a0 - SyncIncomingBlocks: In=1, Out=2, CheckSum=f6ad051ba2ce73511f74f9c08032acc3 - SyncMarkBad: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 - SyncState: In=1, Out=2, CheckSum=7004fd3e7bf60990cb1695fa5883d08f - SyncSubmitBlock: In=2, Out=1, CheckSum=04cdc7641df5628e2ef8c90584936142 - SyncUnmarkAllBad: In=1, Out=1, CheckSum=c39be30cc5a8826024fcf4d23e7017d6 - SyncUnmarkBad: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 - SyncValidateTipset: In=2, Out=2, CheckSum=a244b60fe32e540879ec4eeded71136b - Version: In=1, Out=2, CheckSum=0e78a1023c652297e66079f521e11624 - WalletBalance: In=2, Out=2, CheckSum=f1426bf8d7a1afdeaae0cd561fbbfbb0 - WalletDefaultAddress: In=1, Out=2, CheckSum=5591bbacb9b8345a4a07a149c963df55 - WalletDelete: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 - WalletExport: In=2, Out=2, CheckSum=5db217de8a3ec9ecbed4cc583e473991 - WalletHas: In=2, Out=2, CheckSum=9ad76c8c583af5b5a5d0202c0a3fe7f4 - WalletImport: In=2, Out=2, CheckSum=617245aaab0381dc634a2ad50dd440b3 - WalletList: In=1, Out=2, CheckSum=566d37a33889023f9f73c632fa4e8279 - WalletNew: In=2, Out=2, CheckSum=266c59d3ee6f0b3a66e8dbdec099ef06 - WalletSetDefault: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 - WalletSign: In=3, Out=2, CheckSum=b5a8800f8b60b92c4d99e9cb0fcff086 - WalletSignMessage: In=3, Out=2, CheckSum=c9f0ea6123a189cfeab06ce6bdeda7b3 - WalletValidateAddress: In=2, Out=2, CheckSum=610b35f7aa87b32463e5c2a9b4bd3f55 - WalletVerify: In=4, Out=2, CheckSum=9b22231e95efdfb94d9d55038f500636 - diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt index 82ef5cd335..e69de29bb2 100644 --- a/venus-shared/compatible-checks/api-diff.txt +++ b/venus-shared/compatible-checks/api-diff.txt @@ -1,190 +0,0 @@ -github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.com/filecoin-project/lotus/api.FullNode: - - AuthVerify - + BlockTime - - ChainBlockstoreInfo - - ChainCheckBlockstore - > ChainExport {[func(context.Context, abi.ChainEpoch, bool, chain.TipSetKey) (<-chan []uint8, error) <> func(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []uint8, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - - ChainGetGenesis - > ChainGetMessagesInTipset {[func(context.Context, chain.TipSetKey) ([]chain.Message, error) <> func(context.Context, types.TipSetKey) ([]api.Message, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - - ChainGetNode - > ChainGetPath {[func(context.Context, chain.TipSetKey, chain.TipSetKey) ([]*chain.HeadChange, error) <> func(context.Context, types.TipSetKey, types.TipSetKey) ([]*api.HeadChange, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - + ChainGetRandomnessFromBeacon - + ChainGetRandomnessFromTickets - + ChainGetReceipts - > ChainGetTipSet {[func(context.Context, chain.TipSetKey) (*chain.TipSet, error) <> func(context.Context, types.TipSetKey) (*types.TipSet, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > ChainGetTipSetAfterHeight {[func(context.Context, abi.ChainEpoch, chain.TipSetKey) (*chain.TipSet, error) <> func(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > ChainGetTipSetByHeight {[func(context.Context, abi.ChainEpoch, chain.TipSetKey) (*chain.TipSet, error) <> func(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - + ChainList - > ChainSetHead {[func(context.Context, chain.TipSetKey) error <> func(context.Context, types.TipSetKey) error] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - + ChainSyncHandleNewTipSet - > ChainTipSetWeight {[func(context.Context, chain.TipSetKey) (big.Int, error) <> func(context.Context, types.TipSetKey) (big.Int, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - - ClientCalcCommP - - ClientCancelDataTransfer - - ClientCancelRetrievalDeal - - ClientDataTransferUpdates - - ClientDealPieceCID - - ClientDealSize - - ClientExport - - ClientFindData - - ClientGenCar - - ClientGetDealInfo - - ClientGetDealStatus - - ClientGetDealUpdates - - ClientGetRetrievalUpdates - - ClientHasLocal - - ClientImport - - ClientListDataTransfers - - ClientListDeals - - ClientListImports - - ClientListRetrievals - - ClientMinerQueryOffer - - ClientQueryAsk - - ClientRemoveImport - - ClientRestartDataTransfer - - ClientRetrieve - - ClientRetrieveTryRestartInsufficientFunds - - ClientRetrieveWait - - ClientStartDeal - - ClientStatelessDeal - - Closing - + Concurrent - - CreateBackup - - Discover - + GasBatchEstimateMessageGas - > GasEstimateFeeCap {[func(context.Context, *chain.Message, int64, chain.TipSetKey) (big.Int, error) <> func(context.Context, *types.Message, int64, types.TipSetKey) (big.Int, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > GasEstimateGasLimit {[func(context.Context, *chain.Message, chain.TipSetKey) (int64, error) <> func(context.Context, *types.Message, types.TipSetKey) (int64, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > GasEstimateGasPremium {[func(context.Context, uint64, address.Address, int64, chain.TipSetKey) (big.Int, error) <> func(context.Context, uint64, address.Address, int64, types.TipSetKey) (big.Int, error)] base=func in type: #4 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > GasEstimateMessageGas {[func(context.Context, *chain.Message, *chain.MessageSendSpec, chain.TipSetKey) (*chain.Message, error) <> func(context.Context, *types.Message, *api.MessageSendSpec, types.TipSetKey) (*types.Message, error)] base=func in type: #2 input; nested={[*chain.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[chain.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[chain.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} - + GetActor - + GetEntry - + GetFullBlock - + GetParentStateRootActor - + HasPassword - - ID - + ListActor - + LockWallet - - LogAlerts - - LogList - - LogSetLevel - - MarketAddBalance - - MarketGetReserved - - MarketReleaseFunds - - MarketReserveFunds - - MarketWithdraw - + MessageWait - > MinerCreateBlock {[func(context.Context, *chain.BlockTemplate) (*chain.BlockMsg, error) <> func(context.Context, *api.BlockTemplate) (*types.BlockMsg, error)] base=func in type: #1 input; nested={[*chain.BlockTemplate <> *api.BlockTemplate] base=pointed type; nested={[chain.BlockTemplate <> api.BlockTemplate] base=struct field; nested={[chain.BlockTemplate <> api.BlockTemplate] base=exported field type: #1 field named Parents; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}}}}} - > MinerGetBaseInfo {[func(context.Context, address.Address, abi.ChainEpoch, chain.TipSetKey) (*chain.MiningBaseInfo, error) <> func(context.Context, address.Address, abi.ChainEpoch, types.TipSetKey) (*api.MiningBaseInfo, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > MpoolBatchPushMessage {[func(context.Context, []*chain.Message, *chain.MessageSendSpec) ([]*chain.SignedMessage, error) <> func(context.Context, []*types.Message, *api.MessageSendSpec) ([]*types.SignedMessage, error)] base=func in type: #2 input; nested={[*chain.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[chain.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[chain.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} - + MpoolDeleteByAdress - > MpoolPending {[func(context.Context, chain.TipSetKey) ([]*chain.SignedMessage, error) <> func(context.Context, types.TipSetKey) ([]*types.SignedMessage, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - + MpoolPublishByAddr - + MpoolPublishMessage - > MpoolPushMessage {[func(context.Context, *chain.Message, *chain.MessageSendSpec) (*chain.SignedMessage, error) <> func(context.Context, *types.Message, *api.MessageSendSpec) (*types.SignedMessage, error)] base=func in type: #2 input; nested={[*chain.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[chain.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[chain.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} - > MpoolSelect {[func(context.Context, chain.TipSetKey, float64) ([]*chain.SignedMessage, error) <> func(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - + MpoolSelects - - MsigGetAvailableBalance - - MsigGetPending - > MsigGetVested {[func(context.Context, address.Address, chain.TipSetKey, chain.TipSetKey) (big.Int, error) <> func(context.Context, address.Address, types.TipSetKey, types.TipSetKey) (big.Int, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - - MsigGetVestingSchedule - - NetAgentVersion - - NetAutoNatStatus - - NetBandwidthStats - - NetBandwidthStatsByPeer - - NetBandwidthStatsByProtocol - - NetBlockAdd - - NetBlockList - - NetBlockRemove - - NetConnect - - NetConnectedness - - NetDisconnect - - NetFindPeer - - NetPeerInfo - - NetPeers - - NetPubsubScores - + NetworkConnect - + NetworkFindPeer - + NetworkFindProvidersAsync - + NetworkGetBandwidthStats - + NetworkGetClosestPeers - + NetworkGetPeerAddresses - + NetworkGetPeerID - + NetworkPeers - - NodeStatus - + ProtocolParameters - + ResolveToKeyAddr - - Session - + SetConcurrent - + SetPassword - - Shutdown - > StateAccountKey {[func(context.Context, address.Address, chain.TipSetKey) (address.Address, error) <> func(context.Context, address.Address, types.TipSetKey) (address.Address, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - - StateAllMinerFaults - > StateCall {[func(context.Context, *chain.Message, chain.TipSetKey) (*chain.InvocResult, error) <> func(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - - StateChangedActors - > StateCirculatingSupply {[func(context.Context, chain.TipSetKey) (big.Int, error) <> func(context.Context, types.TipSetKey) (big.Int, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - - StateCompute - > StateDealProviderCollateralBounds {[func(context.Context, abi.PaddedPieceSize, bool, chain.TipSetKey) (chain.DealCollateralBounds, error) <> func(context.Context, abi.PaddedPieceSize, bool, types.TipSetKey) (api.DealCollateralBounds, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - - StateDecodeParams - - StateEncodeParams - > StateGetActor {[func(context.Context, address.Address, chain.TipSetKey) (*chain.Actor, error) <> func(context.Context, address.Address, types.TipSetKey) (*types.Actor, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateGetRandomnessFromBeacon {[func(context.Context, crypto.DomainSeparationTag, abi.ChainEpoch, []uint8, chain.TipSetKey) (abi.Randomness, error) <> func(context.Context, crypto.DomainSeparationTag, abi.ChainEpoch, []uint8, types.TipSetKey) (abi.Randomness, error)] base=func in type: #4 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateGetRandomnessFromTickets {[func(context.Context, crypto.DomainSeparationTag, abi.ChainEpoch, []uint8, chain.TipSetKey) (abi.Randomness, error) <> func(context.Context, crypto.DomainSeparationTag, abi.ChainEpoch, []uint8, types.TipSetKey) (abi.Randomness, error)] base=func in type: #4 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateListActors {[func(context.Context, chain.TipSetKey) ([]address.Address, error) <> func(context.Context, types.TipSetKey) ([]address.Address, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - - StateListMessages - > StateListMiners {[func(context.Context, chain.TipSetKey) ([]address.Address, error) <> func(context.Context, types.TipSetKey) ([]address.Address, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateLookupID {[func(context.Context, address.Address, chain.TipSetKey) (address.Address, error) <> func(context.Context, address.Address, types.TipSetKey) (address.Address, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMarketBalance {[func(context.Context, address.Address, chain.TipSetKey) (chain.MarketBalance, error) <> func(context.Context, address.Address, types.TipSetKey) (api.MarketBalance, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMarketDeals {[func(context.Context, chain.TipSetKey) (map[string]chain.MarketDeal, error) <> func(context.Context, types.TipSetKey) (map[string]api.MarketDeal, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMarketParticipants {[func(context.Context, chain.TipSetKey) (map[string]chain.MarketBalance, error) <> func(context.Context, types.TipSetKey) (map[string]api.MarketBalance, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMarketStorageDeal {[func(context.Context, abi.DealID, chain.TipSetKey) (*chain.MarketDeal, error) <> func(context.Context, abi.DealID, types.TipSetKey) (*api.MarketDeal, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMinerActiveSectors {[func(context.Context, address.Address, chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) <> func(context.Context, address.Address, types.TipSetKey) ([]*miner.SectorOnChainInfo, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMinerAvailableBalance {[func(context.Context, address.Address, chain.TipSetKey) (big.Int, error) <> func(context.Context, address.Address, types.TipSetKey) (big.Int, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMinerDeadlines {[func(context.Context, address.Address, chain.TipSetKey) ([]chain.Deadline, error) <> func(context.Context, address.Address, types.TipSetKey) ([]api.Deadline, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMinerFaults {[func(context.Context, address.Address, chain.TipSetKey) (bitfield.BitField, error) <> func(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMinerInfo {[func(context.Context, address.Address, chain.TipSetKey) (miner.MinerInfo, error) <> func(context.Context, address.Address, types.TipSetKey) (miner.MinerInfo, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMinerInitialPledgeCollateral {[func(context.Context, address.Address, miner.SectorPreCommitInfo, chain.TipSetKey) (big.Int, error) <> func(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (big.Int, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMinerPartitions {[func(context.Context, address.Address, uint64, chain.TipSetKey) ([]chain.Partition, error) <> func(context.Context, address.Address, uint64, types.TipSetKey) ([]api.Partition, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMinerPower {[func(context.Context, address.Address, chain.TipSetKey) (*chain.MinerPower, error) <> func(context.Context, address.Address, types.TipSetKey) (*api.MinerPower, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMinerPreCommitDepositForPower {[func(context.Context, address.Address, miner.SectorPreCommitInfo, chain.TipSetKey) (big.Int, error) <> func(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (big.Int, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMinerProvingDeadline {[func(context.Context, address.Address, chain.TipSetKey) (*dline.Info, error) <> func(context.Context, address.Address, types.TipSetKey) (*dline.Info, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMinerRecoveries {[func(context.Context, address.Address, chain.TipSetKey) (bitfield.BitField, error) <> func(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMinerSectorAllocated {[func(context.Context, address.Address, abi.SectorNumber, chain.TipSetKey) (bool, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (bool, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateMinerSectorCount {[func(context.Context, address.Address, chain.TipSetKey) (chain.MinerSectors, error) <> func(context.Context, address.Address, types.TipSetKey) (api.MinerSectors, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - + StateMinerSectorSize - > StateMinerSectors {[func(context.Context, address.Address, *bitfield.BitField, chain.TipSetKey) ([]*miner.SectorOnChainInfo, error) <> func(context.Context, address.Address, *bitfield.BitField, types.TipSetKey) ([]*miner.SectorOnChainInfo, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - + StateMinerWorkerAddress - > StateNetworkVersion {[func(context.Context, chain.TipSetKey) (network.Version, error) <> func(context.Context, types.TipSetKey) (network.Version, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - - StateReadState - - StateReplay - > StateSearchMsg {[func(context.Context, chain.TipSetKey, cid.Cid, abi.ChainEpoch, bool) (*chain.MsgLookup, error) <> func(context.Context, types.TipSetKey, cid.Cid, abi.ChainEpoch, bool) (*api.MsgLookup, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateSectorExpiration {[func(context.Context, address.Address, abi.SectorNumber, chain.TipSetKey) (*miner.SectorExpiration, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorExpiration, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateSectorGetInfo {[func(context.Context, address.Address, abi.SectorNumber, chain.TipSetKey) (*miner.SectorOnChainInfo, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorOnChainInfo, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateSectorPartition {[func(context.Context, address.Address, abi.SectorNumber, chain.TipSetKey) (*miner.SectorLocation, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorLocation, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateSectorPreCommitInfo {[func(context.Context, address.Address, abi.SectorNumber, chain.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error)] base=func in type: #3 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateVMCirculatingSupplyInternal {[func(context.Context, chain.TipSetKey) (chain.CirculatingSupply, error) <> func(context.Context, types.TipSetKey) (api.CirculatingSupply, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateVerifiedClientStatus {[func(context.Context, address.Address, chain.TipSetKey) (*big.Int, error) <> func(context.Context, address.Address, types.TipSetKey) (*big.Int, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateVerifiedRegistryRootKey {[func(context.Context, chain.TipSetKey) (address.Address, error) <> func(context.Context, types.TipSetKey) (address.Address, error)] base=func in type: #1 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateVerifierStatus {[func(context.Context, address.Address, chain.TipSetKey) (*big.Int, error) <> func(context.Context, address.Address, types.TipSetKey) (*big.Int, error)] base=func in type: #2 input; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} - > StateWaitMsg {[func(context.Context, cid.Cid, uint64, abi.ChainEpoch, bool) (*chain.MsgLookup, error) <> func(context.Context, cid.Cid, uint64, abi.ChainEpoch, bool) (*api.MsgLookup, error)] base=func out type: #0 input; nested={[*chain.MsgLookup <> *api.MsgLookup] base=pointed type; nested={[chain.MsgLookup <> api.MsgLookup] base=struct field; nested={[chain.MsgLookup <> api.MsgLookup] base=exported field type: #3 field named TipSet; nested={[chain.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}}}}} - - SyncCheckBad - - SyncCheckpoint - - SyncIncomingBlocks - - SyncMarkBad - - SyncUnmarkAllBad - - SyncUnmarkBad - - SyncValidateTipset - + SyncerTracker - + UnLockWallet - + Verify - + VerifyEntry - > Version {[func(context.Context) (chain.Version, error) <> func(context.Context) (api.APIVersion, error)] base=func out type: #0 input; nested={[chain.Version <> api.APIVersion] base=struct field; nested={[chain.Version <> api.APIVersion] base=exported fields count: 2 != 3; nested=nil}}} - + WalletAddresses - - WalletDelete - > WalletExport {[func(context.Context, address.Address, string) (*wallet.KeyInfo, error) <> func(context.Context, address.Address) (*types.KeyInfo, error)] base=func in num: 3 != 2; nested=nil} - - WalletList - - WalletNew - + WalletNewAddress - > WalletSign {[func(context.Context, address.Address, []uint8, wallet.MsgMeta) (*crypto.Signature, error) <> func(context.Context, address.Address, []uint8) (*crypto.Signature, error)] base=func in num: 4 != 3; nested=nil} - + WalletState - - WalletValidateAddress - - WalletVerify - diff --git a/venus-shared/types/api_types.go b/venus-shared/types/api_types.go index d64ef8c938..d7640eee6f 100644 --- a/venus-shared/types/api_types.go +++ b/venus-shared/types/api_types.go @@ -117,7 +117,7 @@ type MsgLookup struct { type MiningBaseInfo struct { //nolint MinerPower abi.StoragePower NetworkPower abi.StoragePower - Sectors []builtin.SectorInfo + Sectors []builtin.ExtendedSectorInfo WorkerKey address.Address SectorSize abi.SectorSize PrevBeaconEntry BeaconEntry From 35256b956730ecd13562ab6bb3e754c4bc84255b Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Wed, 12 Jan 2022 17:16:15 +0800 Subject: [PATCH 115/167] fix sender and receiver are the same (#4703) --- pkg/vm/vmcontext/invocation_context.go | 4 +- pkg/vm/vmcontext/vmcontext.go | 99 +++++++++++++++++++++----- 2 files changed, 83 insertions(+), 20 deletions(-) diff --git a/pkg/vm/vmcontext/invocation_context.go b/pkg/vm/vmcontext/invocation_context.go index 97e312ef23..f7f2b2dd0a 100644 --- a/pkg/vm/vmcontext/invocation_context.go +++ b/pkg/vm/vmcontext/invocation_context.go @@ -238,7 +238,7 @@ func (ctx *invocationContext) invoke() (ret []byte, errcode exitcode.ExitCode) { // 3. transfer funds carried by the msg if !ctx.originMsg.Value.Nil() && !ctx.originMsg.Value.IsZero() { if ctx.msg.From != toIDAddr { - ctx.vm.transfer(ctx.msg.From, toIDAddr, ctx.originMsg.Value) + ctx.vm.transfer(ctx.msg.From, toIDAddr, ctx.originMsg.Value, ctx.vm.NetworkVersion()) } } @@ -588,7 +588,7 @@ func (ctx *invocationContext) DeleteActor(beneficiary address.Address) { } // Transfer the executing actor's balance to the beneficiary - ctx.vm.transfer(receiver, beneficiary, receiverActor.Balance) + ctx.vm.transfer(receiver, beneficiary, receiverActor.Balance, ctx.vm.NetworkVersion()) } if err := ctx.vm.State.DeleteActor(ctx.vm.context, receiver); err != nil { diff --git a/pkg/vm/vmcontext/vmcontext.go b/pkg/vm/vmcontext/vmcontext.go index 924a4ee0b8..edd301a785 100644 --- a/pkg/vm/vmcontext/vmcontext.go +++ b/pkg/vm/vmcontext/vmcontext.go @@ -675,22 +675,85 @@ func (vm *VM) shouldBurn(ctx context.Context, msg *types.Message, errcode exitco // WARNING: this Method will panic if the the amount is negative, accounts dont exist, or have inssuficient funds. // // Note: this is not idiomatic, it follows the Spec expectations for this Method. -func (vm *VM) transfer(debitFrom address.Address, creditTo address.Address, amount abi.TokenAmount) { - if amount.LessThan(big.Zero()) { - runtime.Abortf(exitcode.SysErrForbidden, "attempt To transfer negative Value %s From %s To %s", amount, debitFrom, creditTo) - } +func (vm *VM) transfer(from address.Address, to address.Address, amount abi.TokenAmount, networkVersion network.Version) { + var fromActor *types.Actor + var fromID, toID address.Address + var err error + var found bool + // switching the order around so that transactions for more than the balance sent to self fail + if networkVersion >= network.Version15 { + if amount.LessThan(big.Zero()) { + runtime.Abortf(exitcode.SysErrForbidden, "attempt To transfer negative Value %s From %s To %s", amount, from, to) + } - // retrieve debit account - fromActor, found, err := vm.State.GetActor(vm.context, debitFrom) - if err != nil { - panic(err) - } - if !found { - panic(fmt.Errorf("unreachable: debit account not found. %s", err)) + fromID, err = vm.State.LookupID(from) + if err != nil { + panic(fmt.Errorf("transfer failed when resolving sender address: %s", err)) + } + + // retrieve sender account + fromActor, found, err = vm.State.GetActor(vm.context, fromID) + if err != nil { + panic(err) + } + if !found { + panic(fmt.Errorf("unreachable: sender account not found. %s", err)) + } + + // check that account has enough balance for transfer + if fromActor.Balance.LessThan(amount) { + runtime.Abortf(exitcode.SysErrInsufficientFunds, "sender %s insufficient balance %s To transfer %s To %s", amount, fromActor.Balance, from, to) + } + + if from == to { + vmlog.Infow("sending to same address: noop", "from/to addr", from) + return + } + + toID, err = vm.State.LookupID(to) + if err != nil { + panic(fmt.Errorf("transfer failed when resolving receiver address: %s", err)) + } + + if fromID == toID { + vmlog.Infow("sending to same actor ID: noop", "from/to actor", fromID) + return + } + } else { + if from == to { + return + } + + fromID, err = vm.State.LookupID(from) + if err != nil { + panic(fmt.Errorf("transfer failed when resolving sender address: %s", err)) + } + + toID, err = vm.State.LookupID(to) + if err != nil { + panic(fmt.Errorf("transfer failed when resolving receiver address: %s", err)) + } + + if fromID == toID { + return + } + + if amount.LessThan(types.NewInt(0)) { + runtime.Abortf(exitcode.SysErrForbidden, "attempt To transfer negative Value %s From %s To %s", amount, from, to) + } + + // retrieve sender account + fromActor, found, err = vm.State.GetActor(vm.context, fromID) + if err != nil { + panic(err) + } + if !found { + panic(fmt.Errorf("unreachable: sender account not found. %s", err)) + } } - // retrieve credit account - toActor, found, err := vm.State.GetActor(vm.context, creditTo) + // retrieve receiver account + toActor, found, err := vm.State.GetActor(vm.context, toID) if err != nil { panic(err) } @@ -700,18 +763,18 @@ func (vm *VM) transfer(debitFrom address.Address, creditTo address.Address, amou // check that account has enough balance for transfer if fromActor.Balance.LessThan(amount) { - runtime.Abortf(exitcode.SysErrInsufficientFunds, "sender %s insufficient balance %s To transfer %s To %s", amount, fromActor.Balance, debitFrom, creditTo) + runtime.Abortf(exitcode.SysErrInsufficientFunds, "sender %s insufficient balance %s To transfer %s To %s", amount, fromActor.Balance, from, to) } - // debit funds + // deduct funds fromActor.Balance = big.Sub(fromActor.Balance, amount) - if err := vm.State.SetActor(vm.context, debitFrom, fromActor); err != nil { + if err := vm.State.SetActor(vm.context, from, fromActor); err != nil { panic(err) } - // credit funds + // deposit funds toActor.Balance = big.Add(toActor.Balance, amount) - if err := vm.State.SetActor(vm.context, creditTo, toActor); err != nil { + if err := vm.State.SetActor(vm.context, to, toActor); err != nil { panic(err) } } From ea6b6839396a3f017993b99d436b923b67b7305a Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Thu, 13 Jan 2022 09:15:30 +0800 Subject: [PATCH 116/167] Integrate proof v11.0.0 (#4705) --- extern/filecoin-ffi | 2 +- go.mod | 4 ++-- go.sum | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 52d80081bf..e660df5616 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 52d80081bfdd8a30bc44bcfe44cb0f299615b9f3 +Subproject commit e660df5616e397b2d8ac316f45ddfa7a44637971 diff --git a/go.mod b/go.mod index 19e58e845f..f6b919ed09 100644 --- a/go.mod +++ b/go.mod @@ -17,8 +17,8 @@ require ( github.com/docker/docker v0.7.3-0.20190315170154-87d593639c77 github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.4.0 - github.com/drand/drand v1.2.1 - github.com/drand/kyber v1.1.4 + github.com/drand/drand v1.3.0 + github.com/drand/kyber v1.1.7 github.com/fatih/color v1.10.0 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.5 diff --git a/go.sum b/go.sum index 89babf2460..1b97b9a2ee 100644 --- a/go.sum +++ b/go.sum @@ -146,6 +146,7 @@ github.com/bluele/gcache v0.0.0-20190518031135-bc40bd653833/go.mod h1:8c4/i2Vlov github.com/bombsimon/wsl/v3 v3.2.0 h1:x3QUbwW7tPGcCNridvqmhSRthZMTALnkg5/1J+vaUas= github.com/bombsimon/wsl/v3 v3.2.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/briandowns/spinner v1.11.1 h1:OixPqDEcX3juo5AjQZAnFPbeUA0jvkp2qzB5gOZJ/L0= github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= @@ -182,6 +183,7 @@ github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wX github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -189,6 +191,7 @@ github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnht github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -202,6 +205,7 @@ github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosiner/argv v0.1.0/go.mod h1:EusR6TucWKX+zFgtdUsKT2Cvg45K5rtpCcWz4hK06d8= @@ -267,10 +271,14 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= github.com/drand/drand v1.2.1 h1:KB7z+69YbnQ5z22AH/LMi0ObDR8DzYmrkS6vZXTR9jI= github.com/drand/drand v1.2.1/go.mod h1:j0P7RGmVaY7E/OuO2yQOcQj7OgeZCuhgu2gdv0JAm+g= +github.com/drand/drand v1.3.0 h1:k/w/PtHzmlU6OmfoAqgirWyrJ4FZH8ESlJrsKF20UkM= +github.com/drand/drand v1.3.0/go.mod h1:D6kAVlxufq1gi71YCGfzN455JrXF4Q272ZJEG975fzo= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw= github.com/drand/kyber v1.1.4 h1:YvKM03QWGvLrdTnYmxxP5iURAX+Gdb6qRDUOgg8i60Q= github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U= +github.com/drand/kyber v1.1.7 h1:YnOshFoGYSOdhf4K8BiDw4XL/l6caL92vsodAsVQbJI= +github.com/drand/kyber v1.1.7/go.mod h1:UkHLsI4W6+jT5PvNxmc0cvQAgppjTUpX+XCsN9TXmRo= github.com/drand/kyber-bls12381 v0.2.0/go.mod h1:zQip/bHdeEB6HFZSU3v+d3cQE0GaBVQw9aR2E7AdoeI= github.com/drand/kyber-bls12381 v0.2.1 h1:/d5/YAdaCmHpYjF1NZevOEcKGaq6LBbyvkCTIdGqDjs= github.com/drand/kyber-bls12381 v0.2.1/go.mod h1:JwWn4nHO9Mp4F5qCie5sVIPQZ0X6cw8XAeMRvc/GXBE= @@ -281,6 +289,7 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -478,6 +487,7 @@ github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzz github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY= github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -1090,6 +1100,7 @@ github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANh github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4= github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= +github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= @@ -1622,6 +1633,7 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df h1:vdYtBU6zvL7v+Tr+0xFM/qhahw/EvY8DMMunZHKH6eE= github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= @@ -1739,6 +1751,7 @@ github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= +github.com/raulk/go-watchdog v1.2.0/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -1920,6 +1933,8 @@ github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89 github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= @@ -2240,6 +2255,7 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= From b7ada76ee1634fee3bc1c5120e6d46f2f3b34460 Mon Sep 17 00:00:00 2001 From: Mike <41407352+hunjixin@users.noreply.github.com> Date: Thu, 13 Jan 2022 09:45:13 +0800 Subject: [PATCH 117/167] support snapnet (#4702) * support snapnet * fix butterfly network params --- cmd/daemon.go | 143 +------------- fixtures/_assets/car/butterflynet.car | Bin 0 -> 2185801 bytes .../_assets/car/{devnet.car => mainnet.car} | Bin fixtures/asset/asset.go | 94 +++++++--- fixtures/networks/butterfly.go | 58 ++++++ fixtures/networks/calibration.go | 33 ++-- fixtures/networks/forcenet.go | 33 ++-- fixtures/networks/genesis.go | 176 ++++++++++++++++++ fixtures/networks/integrationtestnet.go | 35 ++-- fixtures/networks/interopnet.go | 35 ++-- fixtures/networks/mainnet.go | 21 +-- fixtures/networks/net_2k.go | 35 ++-- pkg/config/config.go | 43 +++-- pkg/constants/network.go | 21 ++- pkg/fork/fork.go | 4 +- pkg/migration/migrate.go | 2 + 16 files changed, 433 insertions(+), 300 deletions(-) create mode 100644 fixtures/_assets/car/butterflynet.car rename fixtures/_assets/car/{devnet.car => mainnet.car} (100%) create mode 100644 fixtures/networks/butterfly.go create mode 100644 fixtures/networks/genesis.go diff --git a/cmd/daemon.go b/cmd/daemon.go index 3f8ce268c7..def0e9435e 100644 --- a/cmd/daemon.go +++ b/cmd/daemon.go @@ -1,43 +1,32 @@ package cmd import ( - "bytes" - "context" "encoding/json" "fmt" - "io" + "github.com/filecoin-project/venus/fixtures/networks" "io/ioutil" - "net/http" - "net/url" "os" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/util/ulimit" - "github.com/filecoin-project/venus/venus-shared/types" paramfetch "github.com/filecoin-project/go-paramfetch" "github.com/filecoin-project/venus/fixtures/asset" "golang.org/x/xerrors" - _ "net/http/pprof" // nolint: golint - - blockstore "github.com/ipfs/go-ipfs-blockstore" cmds "github.com/ipfs/go-ipfs-cmds" - cbor "github.com/ipfs/go-ipld-cbor" logging "github.com/ipfs/go-log/v2" - "github.com/ipld/go-car" "github.com/libp2p/go-libp2p-core/crypto" + _ "net/http/pprof" // nolint: golint "github.com/filecoin-project/venus/app/node" "github.com/filecoin-project/venus/app/paths" - "github.com/filecoin-project/venus/fixtures/networks" "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/genesis" "github.com/filecoin-project/venus/pkg/journal" "github.com/filecoin-project/venus/pkg/migration" "github.com/filecoin-project/venus/pkg/repo" - gengen "github.com/filecoin-project/venus/tools/gengen/util" ) var log = logging.Logger("daemon") @@ -65,7 +54,7 @@ var daemonCmd = &cmds.Command{ cmds.StringOption(GenesisFile, "path of file or HTTP(S) URL containing archive of genesis block DAG data"), cmds.StringOption(PeerKeyFile, "path of file containing key to use for new node's libp2p identity"), cmds.StringOption(WalletKeyFile, "path of file containing keys to import into the wallet on initialization"), - cmds.StringOption(Network, "when set, populates config with network specific parameters, eg. 2k,cali,interop,mainnet").WithDefault("mainnet"), + cmds.StringOption(Network, "when set, populates config with network specific parameters, eg. mainnet,2k,cali,interop,butterfly").WithDefault("mainnet"), cmds.StringOption(Password, "set wallet password"), }, Run: func(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment) error { @@ -143,7 +132,7 @@ func initRun(req *cmds.Request) error { var genesisFunc genesis.InitFunc cfg := rep.Config() network, _ := req.Options[Network].(string) - if err := setConfigFromOptions(cfg, network); err != nil { + if err := networks.SetConfigFromOptions(cfg, network); err != nil { log.Errorf("Error setting config %s", err) return err } @@ -158,7 +147,7 @@ func initRun(req *cmds.Request) error { genesisFunc = genesis.MakeGenesis(req.Context, rep, mkGen, preTp.(string), cfg.NetworkParams.ForkUpgradeParam) } else { genesisFileSource, _ := req.Options[GenesisFile].(string) - genesisFunc, err = loadGenesis(req.Context, rep, genesisFileSource, network) + genesisFunc, err = networks.LoadGenesis(req.Context, rep, genesisFileSource, network) if err != nil { return err } @@ -305,82 +294,6 @@ func getRepo(req *cmds.Request) (repo.Repo, error) { return repo.OpenFSRepo(repoDir, repo.LatestVersion) } -func setConfigFromOptions(cfg *config.Config, network string) error { - // Setup specific config options. - var netcfg *networks.NetworkConf - switch network { - case "mainnet": - netcfg = networks.Mainnet() - case "force": - netcfg = networks.ForceNet() - case "integrationnet": - netcfg = networks.IntegrationNet() - case "2k": - netcfg = networks.Net2k() - case "cali": - netcfg = networks.Calibration() - case "interop": - netcfg = networks.InteropNet() - default: - return fmt.Errorf("unknown network name %s", network) - } - - if netcfg != nil { - cfg.Bootstrap = &netcfg.Bootstrap - cfg.NetworkParams = &netcfg.Network - } - - return nil -} - -func loadGenesis(ctx context.Context, rep repo.Repo, sourceName string, network string) (genesis.InitFunc, error) { - var ( - source io.ReadCloser - err error - ) - - if sourceName == "" { - var bs []byte - var err error - switch network { - case "nerpa": - bs, err = asset.Asset("fixtures/_assets/car/nerpanet.car") - case "cali": - bs, err = asset.Asset("fixtures/_assets/car/calibnet.car") - case "interop": - bs, err = asset.Asset("fixtures/_assets/car/interopnet.car") - case "force": - bs, err = asset.Asset("fixtures/_assets/car/forcenet.car") - default: - bs, err = asset.Asset("fixtures/_assets/car/devnet.car") - } - if err != nil { - return gengen.MakeGenesisFunc(), nil - } - source = ioutil.NopCloser(bytes.NewReader(bs)) - // return gengen.MakeGenesisFunc(), nil - } else { - source, err = openGenesisSource(sourceName) - if err != nil { - return nil, err - } - } - - defer func() { _ = source.Close() }() - - genesisBlk, err := extractGenesisBlock(ctx, source, rep) - if err != nil { - return nil, err - } - - gif := func(cst cbor.IpldStore, bs blockstore.Blockstore) (*types.BlockHeader, error) { - return genesisBlk, err - } - - return gif, nil - -} - func getNodeInitOpts(peerKeyFile string, walletKeyFile string) ([]node.InitOpt, error) { var initOpts []node.InitOpt if peerKeyFile != "" { @@ -417,49 +330,3 @@ func getNodeInitOpts(peerKeyFile string, walletKeyFile string) ([]node.InitOpt, return initOpts, nil } - -func openGenesisSource(sourceName string) (io.ReadCloser, error) { - sourceURL, err := url.Parse(sourceName) - if err != nil { - return nil, fmt.Errorf("invalid filepath or URL for genesis file: %s", sourceURL) - } - var source io.ReadCloser - if sourceURL.Scheme == "http" || sourceURL.Scheme == "https" { - // NOTE: This code is temporary. It allows downloading a genesis block via HTTP(S) to be able to join a - // recently deployed staging devnet. - response, err := http.Get(sourceName) - if err != nil { - return nil, err - } - source = response.Body - } else if sourceURL.Scheme != "" { - return nil, fmt.Errorf("unsupported protocol for genesis file: %s", sourceURL.Scheme) - } else { - file, err := os.Open(sourceName) - if err != nil { - return nil, err - } - source = file - } - return source, nil -} - -func extractGenesisBlock(ctx context.Context, source io.ReadCloser, rep repo.Repo) (*types.BlockHeader, error) { - bs := rep.Datastore() - ch, err := car.LoadCar(ctx, bs, source) - if err != nil { - return nil, err - } - - // need to check if we are being handed a car file with a single genesis block or an entire chain. - bsBlk, err := bs.Get(ctx, ch.Roots[0]) - if err != nil { - return nil, err - } - cur, err := types.DecodeBlock(bsBlk.RawData()) - if err != nil { - return nil, err - } - - return cur, nil -} diff --git a/fixtures/_assets/car/butterflynet.car b/fixtures/_assets/car/butterflynet.car new file mode 100644 index 0000000000000000000000000000000000000000..c79eab38eb96c401356d80105c4479513ddf4e2f GIT binary patch literal 2185801 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

{UX01N+qv_Ve0J73&}6;7q!$VmHJD$u~;A6 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

->$NapcmhF!~p64r<+{ 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

}myF+)a= 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

%(};2WZg1V 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 =S?eL%$97)mSW-;XoA%_Jg5Co8^Da|WRoMqh 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%0AW?;dZU^EgPjL+I8mxB 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 Date: Thu, 13 Jan 2022 11:03:34 +0800 Subject: [PATCH 118/167] Feat/migration autobatch (#4704) * Fast migration for v15 * fix autobatch Co-authored-by: simlecode --- go.mod | 4 +- go.sum | 9 +- pkg/fork/fork.go | 42 +-- .../specactors/builtin/paych/message7.go | 2 +- pkg/types/specactors/builtin/paych/v7.go | 16 ++ pkg/util/blockstoreutil/autobatch.go | 262 ++++++++++++++++++ pkg/util/blockstoreutil/autobatch_test.go | 45 +++ pkg/util/blockstoreutil/mem.go | 102 +++++++ venus-devtool/go.mod | 4 +- venus-devtool/go.sum | 13 +- .../builtin/paych/message.sep.go.template | 4 + .../actors/builtin/paych/message.v0.go | 4 +- .../actors/builtin/paych/message.v2.go | 4 +- .../actors/builtin/paych/message.v3.go | 4 +- .../actors/builtin/paych/message.v4.go | 4 +- .../actors/builtin/paych/message.v5.go | 4 +- .../actors/builtin/paych/message.v6.go | 4 +- .../actors/builtin/paych/message.v7.go | 4 +- .../builtin/paych/state.sep.go.template | 18 ++ venus-shared/actors/builtin/paych/state.v7.go | 16 ++ 20 files changed, 528 insertions(+), 37 deletions(-) create mode 100644 pkg/util/blockstoreutil/autobatch.go create mode 100644 pkg/util/blockstoreutil/autobatch_test.go create mode 100644 pkg/util/blockstoreutil/mem.go diff --git a/go.mod b/go.mod index f6b919ed09..f2d5c70165 100644 --- a/go.mod +++ b/go.mod @@ -32,14 +32,14 @@ require ( github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543 github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 - github.com/filecoin-project/go-state-types v0.1.1 + github.com/filecoin-project/go-state-types v0.1.3 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 - github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a + github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578 diff --git a/go.sum b/go.sum index 1b97b9a2ee..dd35aa1ef7 100644 --- a/go.sum +++ b/go.sum @@ -317,6 +317,8 @@ github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349/ github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= +github.com/filecoin-project/go-amt-ipld/v4 v4.0.0 h1:XM81BJ4/6h3FV0WfFjh74cIDIgqMbJsMBLM0fIuLUUk= +github.com/filecoin-project/go-amt-ipld/v4 v4.0.0/go.mod h1:gF053YQ4BIpzTNDoEwHZas7U3oAwncDVGvOHyY8oDpE= github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= @@ -352,8 +354,9 @@ github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.3 h1:rzIJyQo5HO2ptc8Jcu8P0qTutnI7NWwTle54eAHoNO0= +github.com/filecoin-project/go-state-types v0.1.3/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe h1:dF8u+LEWeIcTcfUcCf3WFVlc81Fr2JKg8zPzIbBDKDw= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= @@ -378,8 +381,8 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3 github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h1:MS1mtAhZh0iSE7OxP1bb6+UNyYKsxg8n51FpHlX1d54= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsGGCE+NumpF6aiBoU/2X5W4= +github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= diff --git a/pkg/fork/fork.go b/pkg/fork/fork.go index 11e11fa777..004a248822 100644 --- a/pkg/fork/fork.go +++ b/pkg/fork/fork.go @@ -5,6 +5,7 @@ import ( "context" "encoding/binary" "errors" + "github.com/docker/go-units" "runtime" "sort" "sync" @@ -355,6 +356,7 @@ type chainReader interface { GetTipSetByHeight(context.Context, *types.TipSet, abi.ChainEpoch, bool) (*types.TipSet, error) GetTipSetState(context.Context, *types.TipSet) (vmstate.Tree, error) GetGenesisBlock(context.Context) (*types.BlockHeader, error) + GetLookbackTipSetForRound(ctx context.Context, ts *types.TipSet, round abi.ChainEpoch, version network.Version) (*types.TipSet, cid.Cid, error) SubHeadChanges(context.Context) chan []*types.HeadChange } @@ -376,7 +378,7 @@ type versionSpec struct { type migration struct { upgrade MigrationFunc preMigrations []PreMigration - cache *nv10.MemMigrationCache + cache *nv15.MemMigrationCache } type ChainFork struct { @@ -427,7 +429,7 @@ func NewChainFork(ctx context.Context, cr chainReader, ipldstore cbor.IpldStore, migration := &migration{ upgrade: upgrade.Migration, preMigrations: upgrade.PreMigrations, - cache: nv10.NewMemMigrationCache(), + cache: nv15.NewMemMigrationCache(), } stateMigrations[upgrade.Height] = migration } @@ -507,7 +509,7 @@ func (c *ChainFork) GetNetworkVersion(ctx context.Context, height abi.ChainEpoch return c.latestVersion } -func runPreMigration(ctx context.Context, fn PreMigrationFunc, cache *nv10.MemMigrationCache, ts *types.TipSet) { +func runPreMigration(ctx context.Context, fn PreMigrationFunc, cache *nv15.MemMigrationCache, ts *types.TipSet) { height := ts.Height() parent := ts.Blocks()[0].ParentStateRoot @@ -1930,8 +1932,16 @@ func (c *ChainFork) PreUpgradeActorsV7(ctx context.Context, cache MigrationCache workerCount /= 2 } - config := nv15.Config{MaxWorkers: uint(workerCount)} - _, err := c.upgradeActorsV7Common(ctx, cache, root, epoch, ts, config) + ver := c.GetNetworkVersion(ctx, epoch) + lbts, lbRoot, err := c.cr.GetLookbackTipSetForRound(ctx, ts, epoch, ver) + if err != nil { + return xerrors.Errorf("error getting lookback ts for premigration: %w", err) + } + + config := nv15.Config{MaxWorkers: uint(workerCount), + ProgressLogPeriod: time.Minute * 5} + + _, err = c.upgradeActorsV7Common(ctx, cache, lbRoot, epoch, lbts, config) return err } @@ -1942,9 +1952,10 @@ func (c *ChainFork) upgradeActorsV7Common( ts *types.TipSet, config nv15.Config, ) (cid.Cid, error) { - buf := blockstoreutil.NewTieredBstore(c.bs, blockstoreutil.NewTemporarySync()) - store := chain.ActorStore(ctx, buf) - + writeStore := blockstoreutil.NewAutobatch(ctx, c.bs, units.GiB) + // TODO: pretty sure we'd achieve nothing by doing this, confirm in review + //buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), writeStore) + store := chain.ActorStore(ctx, writeStore) // Load the state root. var stateRoot vmstate.StateRoot if err := store.Get(ctx, root, &stateRoot); err != nil { @@ -1974,17 +1985,14 @@ func (c *ChainFork) upgradeActorsV7Common( return cid.Undef, xerrors.Errorf("failed to persist new state root: %w", err) } - // Persist the new tree. - - { - from := buf - to := buf.Read() - - if err := Copy(ctx, from, to, newRoot); err != nil { - return cid.Undef, xerrors.Errorf("copying migrated tree: %w", err) - } + // Persists the new tree and shuts down the flush worker + if err := writeStore.Flush(ctx); err != nil { + return cid.Undef, xerrors.Errorf("writeStore flush failed: %w", err) } + if err := writeStore.Shutdown(ctx); err != nil { + return cid.Undef, xerrors.Errorf("writeStore shutdown failed: %w", err) + } return newRoot, nil } diff --git a/pkg/types/specactors/builtin/paych/message7.go b/pkg/types/specactors/builtin/paych/message7.go index 39ac6fe11a..d8f8e9e131 100644 --- a/pkg/types/specactors/builtin/paych/message7.go +++ b/pkg/types/specactors/builtin/paych/message7.go @@ -41,7 +41,7 @@ func (m message7) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message7) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych7.UpdateChannelStateParams{ - Sv: *sv, + Sv: toV7SignedVoucher(*sv), Secret: secret, }) if aerr != nil { diff --git a/pkg/types/specactors/builtin/paych/v7.go b/pkg/types/specactors/builtin/paych/v7.go index bbad7a4e32..7a64f0b742 100644 --- a/pkg/types/specactors/builtin/paych/v7.go +++ b/pkg/types/specactors/builtin/paych/v7.go @@ -114,3 +114,19 @@ func (ls *laneState7) Redeemed() (big.Int, error) { func (ls *laneState7) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } + +func toV7SignedVoucher(sv SignedVoucher) paych7.SignedVoucher { + return paych7.SignedVoucher{ + ChannelAddr: sv.ChannelAddr, + TimeLockMin: sv.TimeLockMin, + TimeLockMax: sv.TimeLockMax, + SecretHash: sv.SecretPreimage, + Extra: sv.Extra, + Lane: sv.Lane, + Nonce: sv.Nonce, + Amount: sv.Amount, + MinSettleHeight: sv.MinSettleHeight, + Merges: sv.Merges, + Signature: sv.Signature, + } +} diff --git a/pkg/util/blockstoreutil/autobatch.go b/pkg/util/blockstoreutil/autobatch.go new file mode 100644 index 0000000000..043f53bc83 --- /dev/null +++ b/pkg/util/blockstoreutil/autobatch.go @@ -0,0 +1,262 @@ +package blockstoreutil + +import ( + "context" + "sync" + "time" + + "golang.org/x/xerrors" + + block "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" +) + +// autolog is a logger for the autobatching blockstore. It is subscoped from the +// blockstore logger. +var autolog = log.Named("auto") + +// contains the same set of blocks twice, once as an ordered list for flushing, and as a map for fast access +type blockBatch struct { + blockList []block.Block + blockMap map[cid.Cid]block.Block +} + +type AutobatchBlockstore struct { + // TODO: drop if memory consumption is too high + addedCids map[cid.Cid]struct{} + + stateLock sync.Mutex + bufferedBatch blockBatch + + flushingBatch blockBatch + flushErr error + + flushCh chan struct{} + + doFlushLock sync.Mutex + flushRetryDelay time.Duration + doneCh chan struct{} + shutdown context.CancelFunc + + backingBs Blockstore + + bufferCapacity int + bufferSize int +} + +func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) *AutobatchBlockstore { + ctx, cancel := context.WithCancel(ctx) + bs := &AutobatchBlockstore{ + addedCids: make(map[cid.Cid]struct{}), + backingBs: backingBs, + bufferCapacity: bufferCapacity, + flushCh: make(chan struct{}, 1), + doneCh: make(chan struct{}), + // could be made configable + flushRetryDelay: time.Millisecond * 100, + shutdown: cancel, + } + + bs.bufferedBatch.blockMap = make(map[cid.Cid]block.Block) + + go bs.flushWorker(ctx) + + return bs +} + +func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { + bs.stateLock.Lock() + defer bs.stateLock.Unlock() + + _, ok := bs.addedCids[blk.Cid()] + if !ok { + bs.addedCids[blk.Cid()] = struct{}{} + bs.bufferedBatch.blockList = append(bs.bufferedBatch.blockList, blk) + bs.bufferedBatch.blockMap[blk.Cid()] = blk + bs.bufferSize += len(blk.RawData()) + if bs.bufferSize >= bs.bufferCapacity { + // signal that a flush is appropriate, may be ignored + select { + case bs.flushCh <- struct{}{}: + default: + // do nothing + } + } + } + + return nil +} + +func (bs *AutobatchBlockstore) flushWorker(ctx context.Context) { + defer close(bs.doneCh) + for { + select { + case <-bs.flushCh: + // TODO: check if we _should_ actually flush. We could get a spurious wakeup + // here. + putErr := bs.doFlush(ctx, false) + for putErr != nil { + select { + case <-ctx.Done(): + return + case <-time.After(bs.flushRetryDelay): + autolog.Errorf("FLUSH ERRORED: %w, retrying after %v", putErr, bs.flushRetryDelay) + putErr = bs.doFlush(ctx, true) + } + } + case <-ctx.Done(): + // Do one last flush. + _ = bs.doFlush(ctx, false) + return + } + } +} + +// caller must NOT hold stateLock +// set retryOnly to true to only retry a failed flush and not flush anything new. +func (bs *AutobatchBlockstore) doFlush(ctx context.Context, retryOnly bool) error { + bs.doFlushLock.Lock() + defer bs.doFlushLock.Unlock() + + // If we failed to flush last time, try flushing again. + if bs.flushErr != nil { + bs.flushErr = bs.backingBs.PutMany(ctx, bs.flushingBatch.blockList) + } + + // If we failed, or we're _only_ retrying, bail. + if retryOnly || bs.flushErr != nil { + return bs.flushErr + } + + // Then take the current batch... + bs.stateLock.Lock() + // We do NOT clear addedCids here, because its purpose is to expedite Puts + bs.flushingBatch = bs.bufferedBatch + bs.bufferedBatch.blockList = make([]block.Block, 0, len(bs.flushingBatch.blockList)) + bs.bufferedBatch.blockMap = make(map[cid.Cid]block.Block, len(bs.flushingBatch.blockMap)) + bs.stateLock.Unlock() + + // And try to flush it. + bs.flushErr = bs.backingBs.PutMany(ctx, bs.flushingBatch.blockList) + + // If we succeeded, reset the batch. Otherwise, we'll try again next time. + if bs.flushErr == nil { + bs.stateLock.Lock() + bs.flushingBatch = blockBatch{} + bs.stateLock.Unlock() + } + + return bs.flushErr +} + +// caller must NOT hold stateLock +func (bs *AutobatchBlockstore) Flush(ctx context.Context) error { + return bs.doFlush(ctx, false) +} + +func (bs *AutobatchBlockstore) Shutdown(ctx context.Context) error { + // TODO: Prevent puts after we call this to avoid losing data. + bs.shutdown() + select { + case <-bs.doneCh: + case <-ctx.Done(): + return ctx.Err() + } + + bs.doFlushLock.Lock() + defer bs.doFlushLock.Unlock() + + return bs.flushErr +} + +func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { + // may seem backward to check the backingBs first, but that is the likeliest case + blk, err := bs.backingBs.Get(ctx, c) + if err == nil { + return blk, nil + } + + if err != ErrNotFound { + return blk, err + } + + bs.stateLock.Lock() + defer bs.stateLock.Unlock() + v, ok := bs.flushingBatch.blockMap[c] + if ok { + return v, nil + } + + v, ok = bs.bufferedBatch.blockMap[c] + if ok { + return v, nil + } + + return bs.Get(ctx, c) +} + +func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error { + // if we wanted to support this, we would have to: + // - flush + // - delete from the backingBs (if present) + // - remove from addedCids (if present) + // - if present in addedCids, also walk the ordered lists and remove if present + return xerrors.New("deletion is unsupported") +} + +func (bs *AutobatchBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { + // see note in DeleteBlock() + return xerrors.New("deletion is unsupported") +} + +func (bs *AutobatchBlockstore) Has(ctx context.Context, c cid.Cid) (bool, error) { + _, err := bs.Get(ctx, c) + if err == nil { + return true, nil + } + if err == ErrNotFound { + return false, nil + } + + return false, err +} + +func (bs *AutobatchBlockstore) GetSize(ctx context.Context, c cid.Cid) (int, error) { + blk, err := bs.Get(ctx, c) + if err != nil { + return 0, err + } + + return len(blk.RawData()), nil +} + +func (bs *AutobatchBlockstore) PutMany(ctx context.Context, blks []block.Block) error { + for _, blk := range blks { + if err := bs.Put(ctx, blk); err != nil { + return err + } + } + + return nil +} + +func (bs *AutobatchBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { + if err := bs.Flush(ctx); err != nil { + return nil, err + } + + return bs.backingBs.AllKeysChan(ctx) +} + +func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { + bs.backingBs.HashOnRead(enabled) +} + +func (bs *AutobatchBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error { + blk, err := bs.Get(ctx, cid) + if err != nil { + return err + } + + return callback(blk.RawData()) +} diff --git a/pkg/util/blockstoreutil/autobatch_test.go b/pkg/util/blockstoreutil/autobatch_test.go new file mode 100644 index 0000000000..7dc6a27402 --- /dev/null +++ b/pkg/util/blockstoreutil/autobatch_test.go @@ -0,0 +1,45 @@ +package blockstoreutil + +import ( + "context" + "testing" + + blocks "github.com/ipfs/go-block-format" + + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + "github.com/stretchr/testify/require" +) + +var ( + b0 = blocks.NewBlock([]byte("abc")) + b1 = blocks.NewBlock([]byte("foo")) + b2 = blocks.NewBlock([]byte("bar")) +) + +func TestAutobatchBlockstore(t *testing.T) { + tf.UnitTest(t) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ab := NewAutobatch(ctx, NewMemory(), len(b0.RawData())+len(b1.RawData())-1) + + require.NoError(t, ab.Put(ctx, b0)) + require.NoError(t, ab.Put(ctx, b1)) + require.NoError(t, ab.Put(ctx, b2)) + + err := ab.Flush(ctx) + require.NoError(t, err) + + v0, err := ab.Get(ctx, b0.Cid()) + require.NoError(t, err) + require.Equal(t, b0.RawData(), v0.RawData()) + + v1, err := ab.Get(ctx, b1.Cid()) + require.NoError(t, err) + require.Equal(t, b1.RawData(), v1.RawData()) + + v2, err := ab.Get(ctx, b2.Cid()) + require.NoError(t, err) + require.Equal(t, b2.RawData(), v2.RawData()) +} diff --git a/pkg/util/blockstoreutil/mem.go b/pkg/util/blockstoreutil/mem.go new file mode 100644 index 0000000000..ae578ca8db --- /dev/null +++ b/pkg/util/blockstoreutil/mem.go @@ -0,0 +1,102 @@ +package blockstoreutil + +import ( + "context" + + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" +) + +// NewMemory returns a temporary memory-backed blockstore. +func NewMemory() MemBlockstore { + return make(MemBlockstore) +} + +// MemBlockstore is a terminal blockstore that keeps blocks in memory. +type MemBlockstore map[cid.Cid]blocks.Block + +func (m MemBlockstore) DeleteBlock(ctx context.Context, k cid.Cid) error { + delete(m, k) + return nil +} + +func (m MemBlockstore) DeleteMany(ctx context.Context, ks []cid.Cid) error { + for _, k := range ks { + delete(m, k) + } + return nil +} + +func (m MemBlockstore) Has(ctx context.Context, k cid.Cid) (bool, error) { + _, ok := m[k] + return ok, nil +} + +func (m MemBlockstore) View(ctx context.Context, k cid.Cid, callback func([]byte) error) error { + b, ok := m[k] + if !ok { + return ErrNotFound + } + return callback(b.RawData()) +} + +func (m MemBlockstore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { + b, ok := m[k] + if !ok { + return nil, ErrNotFound + } + return b, nil +} + +// GetSize returns the CIDs mapped BlockSize +func (m MemBlockstore) GetSize(ctx context.Context, k cid.Cid) (int, error) { + b, ok := m[k] + if !ok { + return 0, ErrNotFound + } + return len(b.RawData()), nil +} + +// Put puts a given block to the underlying datastore +func (m MemBlockstore) Put(ctx context.Context, b blocks.Block) error { + // Convert to a basic block for safety, but try to reuse the existing + // block if it's already a basic block. + k := b.Cid() + if _, ok := b.(*blocks.BasicBlock); !ok { + // If we already have the block, abort. + if _, ok := m[k]; ok { + return nil + } + // the error is only for debugging. + b, _ = blocks.NewBlockWithCid(b.RawData(), b.Cid()) + } + m[b.Cid()] = b + return nil +} + +// PutMany puts a slice of blocks at the same time using batching +// capabilities of the underlying datastore whenever possible. +func (m MemBlockstore) PutMany(ctx context.Context, bs []blocks.Block) error { + for _, b := range bs { + _ = m.Put(ctx, b) // can't fail + } + return nil +} + +// AllKeysChan returns a channel from which +// the CIDs in the Blockstore can be read. It should respect +// the given context, closing the channel if it becomes Done. +func (m MemBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { + ch := make(chan cid.Cid, len(m)) + for k := range m { + ch <- k + } + close(ch) + return ch, nil +} + +// HashOnRead specifies if every read block should be +// rehashed to make sure it matches its CID. +func (m MemBlockstore) HashOnRead(enabled bool) { + // no-op +} diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index eda32456e5..91bbb9c4b7 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -9,8 +9,8 @@ require ( github.com/filecoin-project/go-ds-versioning v0.1.0 // indirect github.com/filecoin-project/go-fil-markets v1.14.1 github.com/filecoin-project/go-jsonrpc v0.1.5 - github.com/filecoin-project/go-state-types v0.1.1 - github.com/filecoin-project/lotus v1.13.2-0.20220110101720-d16c5d0e9394 + github.com/filecoin-project/go-state-types v0.1.3 + github.com/filecoin-project/lotus v1.13.3-0.20220112013034-7559e4311ea0 github.com/filecoin-project/venus v0.0.0-00010101000000-000000000000 github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-graphsync v0.11.5 diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index 933d75f89c..dd9a752d4c 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -341,6 +341,8 @@ github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349/ github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= +github.com/filecoin-project/go-amt-ipld/v4 v4.0.0 h1:XM81BJ4/6h3FV0WfFjh74cIDIgqMbJsMBLM0fIuLUUk= +github.com/filecoin-project/go-amt-ipld/v4 v4.0.0/go.mod h1:gF053YQ4BIpzTNDoEwHZas7U3oAwncDVGvOHyY8oDpE= github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= @@ -380,7 +382,6 @@ github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.m github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= @@ -388,8 +389,9 @@ github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.3 h1:rzIJyQo5HO2ptc8Jcu8P0qTutnI7NWwTle54eAHoNO0= +github.com/filecoin-project/go-state-types v0.1.3/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= @@ -397,8 +399,8 @@ github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZO github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/lotus v1.13.2-0.20220110101720-d16c5d0e9394 h1:F2D6TOf/fcqUDbtifXX7VoIjCzQ4DlxwwIAXNuT1jT4= -github.com/filecoin-project/lotus v1.13.2-0.20220110101720-d16c5d0e9394/go.mod h1:8pVJ+56YXhhNWifggmHLlDtf/IReRrZn6O4069/sSmA= +github.com/filecoin-project/lotus v1.13.3-0.20220112013034-7559e4311ea0 h1:++7ma8Z4DNpC6QDWwGHuaqcDEFIYMo7CPXtaSzeeTNE= +github.com/filecoin-project/lotus v1.13.3-0.20220112013034-7559e4311ea0/go.mod h1:MUgwmFOQQ4isBZzNIvUWXf9tyPNeiRbn6ELJYQq0oYc= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -418,8 +420,9 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3 github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h1:MS1mtAhZh0iSE7OxP1bb6+UNyYKsxg8n51FpHlX1d54= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsGGCE+NumpF6aiBoU/2X5W4= +github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= diff --git a/venus-shared/actors/builtin/paych/message.sep.go.template b/venus-shared/actors/builtin/paych/message.sep.go.template index 434534fab3..885487637a 100644 --- a/venus-shared/actors/builtin/paych/message.sep.go.template +++ b/venus-shared/actors/builtin/paych/message.sep.go.template @@ -41,7 +41,11 @@ func (m message{{.v}}) Create(to address.Address, initialAmount abi.TokenAmount) func (m message{{.v}}) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych{{.v}}.UpdateChannelStateParams{ + {{if (ge .v 7)}} + Sv: toV{{.v}}SignedVoucher(*sv), + {{else}} Sv: *sv, + {{end}} Secret: secret, }) if aerr != nil { diff --git a/venus-shared/actors/builtin/paych/message.v0.go b/venus-shared/actors/builtin/paych/message.v0.go index fe24ed0326..62b0f3e774 100644 --- a/venus-shared/actors/builtin/paych/message.v0.go +++ b/venus-shared/actors/builtin/paych/message.v0.go @@ -41,7 +41,9 @@ func (m message0) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message0) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych0.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/venus-shared/actors/builtin/paych/message.v2.go b/venus-shared/actors/builtin/paych/message.v2.go index 18ef864b11..89c3b227ae 100644 --- a/venus-shared/actors/builtin/paych/message.v2.go +++ b/venus-shared/actors/builtin/paych/message.v2.go @@ -41,7 +41,9 @@ func (m message2) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message2) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych2.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/venus-shared/actors/builtin/paych/message.v3.go b/venus-shared/actors/builtin/paych/message.v3.go index 11b7193393..c3748b61aa 100644 --- a/venus-shared/actors/builtin/paych/message.v3.go +++ b/venus-shared/actors/builtin/paych/message.v3.go @@ -41,7 +41,9 @@ func (m message3) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message3) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych3.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/venus-shared/actors/builtin/paych/message.v4.go b/venus-shared/actors/builtin/paych/message.v4.go index 97fe20c670..7dd17f1411 100644 --- a/venus-shared/actors/builtin/paych/message.v4.go +++ b/venus-shared/actors/builtin/paych/message.v4.go @@ -41,7 +41,9 @@ func (m message4) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message4) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych4.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/venus-shared/actors/builtin/paych/message.v5.go b/venus-shared/actors/builtin/paych/message.v5.go index 9a82f109a6..e3c2e3ad66 100644 --- a/venus-shared/actors/builtin/paych/message.v5.go +++ b/venus-shared/actors/builtin/paych/message.v5.go @@ -41,7 +41,9 @@ func (m message5) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message5) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych5.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/venus-shared/actors/builtin/paych/message.v6.go b/venus-shared/actors/builtin/paych/message.v6.go index 8cbfcdf9de..4c461d58f1 100644 --- a/venus-shared/actors/builtin/paych/message.v6.go +++ b/venus-shared/actors/builtin/paych/message.v6.go @@ -41,7 +41,9 @@ func (m message6) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message6) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych6.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/venus-shared/actors/builtin/paych/message.v7.go b/venus-shared/actors/builtin/paych/message.v7.go index 0ba9d72008..fee580be81 100644 --- a/venus-shared/actors/builtin/paych/message.v7.go +++ b/venus-shared/actors/builtin/paych/message.v7.go @@ -41,7 +41,9 @@ func (m message7) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message7) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych7.UpdateChannelStateParams{ - Sv: *sv, + + Sv: toV7SignedVoucher(*sv), + Secret: secret, }) if aerr != nil { diff --git a/venus-shared/actors/builtin/paych/state.sep.go.template b/venus-shared/actors/builtin/paych/state.sep.go.template index 08e4e36b2f..0ec08b95af 100644 --- a/venus-shared/actors/builtin/paych/state.sep.go.template +++ b/venus-shared/actors/builtin/paych/state.sep.go.template @@ -114,3 +114,21 @@ func (ls *laneState{{.v}}) Redeemed() (big.Int, error) { func (ls *laneState{{.v}}) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } + +{{if (ge .v 7)}} +func toV{{.v}}SignedVoucher(sv SignedVoucher) paych{{.v}}.SignedVoucher { + return paych{{.v}}.SignedVoucher{ + ChannelAddr: sv.ChannelAddr, + TimeLockMin: sv.TimeLockMin, + TimeLockMax: sv.TimeLockMax, + SecretHash: sv.SecretPreimage, + Extra: sv.Extra, + Lane: sv.Lane, + Nonce: sv.Nonce, + Amount: sv.Amount, + MinSettleHeight: sv.MinSettleHeight, + Merges: sv.Merges, + Signature: sv.Signature, + } +} +{{end}} \ No newline at end of file diff --git a/venus-shared/actors/builtin/paych/state.v7.go b/venus-shared/actors/builtin/paych/state.v7.go index eca0c46fb6..43270a6368 100644 --- a/venus-shared/actors/builtin/paych/state.v7.go +++ b/venus-shared/actors/builtin/paych/state.v7.go @@ -114,3 +114,19 @@ func (ls *laneState7) Redeemed() (big.Int, error) { func (ls *laneState7) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } + +func toV7SignedVoucher(sv SignedVoucher) paych7.SignedVoucher { + return paych7.SignedVoucher{ + ChannelAddr: sv.ChannelAddr, + TimeLockMin: sv.TimeLockMin, + TimeLockMax: sv.TimeLockMax, + SecretHash: sv.SecretPreimage, + Extra: sv.Extra, + Lane: sv.Lane, + Nonce: sv.Nonce, + Amount: sv.Amount, + MinSettleHeight: sv.MinSettleHeight, + Merges: sv.Merges, + Signature: sv.Signature, + } +} From 41c5da8d937e9989ed0b85372fae9320f7e3eb9c Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Thu, 13 Jan 2022 11:24:34 +0800 Subject: [PATCH 119/167] opt version cmd (#4707) --- build/main.go | 1 - cmd/version.go | 5 +++-- cmd/version_daemon_test.go | 20 ++++---------------- 3 files changed, 7 insertions(+), 19 deletions(-) diff --git a/build/main.go b/build/main.go index 2f62d010ae..9d42656360 100644 --- a/build/main.go +++ b/build/main.go @@ -210,7 +210,6 @@ func flags() string { return fmt.Sprintf("-ldflags=github.com/filecoin-project/venus=\"%s\"", strings.Join([]string{ fmt.Sprintf("-X github.com/filecoin-project/venus/build/flags.GitRoot=%s", helpers.GetGitRoot()), fmt.Sprintf("-X github.com/filecoin-project/venus/build/flags.GitCommit=%s", helpers.GetCommitSha()), - fmt.Sprintf("-X github.com/filecoin-project/venus/build/flags.GitTag=%s", helpers.GetLastTag()), }, " ")) } diff --git a/cmd/version.go b/cmd/version.go index 1fdb07a961..b0d8e40dbf 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -2,9 +2,10 @@ package cmd import ( "fmt" - cmds "github.com/ipfs/go-ipfs-cmds" "github.com/filecoin-project/venus/build/flags" + "github.com/filecoin-project/venus/pkg/constants" + cmds "github.com/ipfs/go-ipfs-cmds" ) type versionInfo struct { @@ -18,7 +19,7 @@ var versionCmd = &cmds.Command{ }, Run: func(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment) error { return re.Emit(&versionInfo{ - Commit: fmt.Sprintf("%s %s", flags.GitTag, flags.GitCommit), + Commit: fmt.Sprintf("%s %s", constants.BuildVersion, flags.GitCommit), }) }, Type: versionInfo{}, diff --git a/cmd/version_daemon_test.go b/cmd/version_daemon_test.go index 3c2f9d4b58..3cafac0de0 100644 --- a/cmd/version_daemon_test.go +++ b/cmd/version_daemon_test.go @@ -8,6 +8,8 @@ import ( "strings" "testing" + "github.com/filecoin-project/venus/pkg/constants" + th "github.com/filecoin-project/venus/pkg/testhelpers" tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" manet "github.com/multiformats/go-multiaddr/net" @@ -20,7 +22,7 @@ func TestVersion(t *testing.T) { tf.IntegrationTest(t) commit := getCodeCommit(t) - tag := getLastTag(t) + tag := constants.BuildVersion verOut, err := exec.Command(th.MustGetFilecoinBinary(), "version").Output() require.NoError(t, err) @@ -52,7 +54,7 @@ func TestVersionOverHttp(t *testing.T) { require.Equal(t, http.StatusOK, res.StatusCode) commit := strings.Trim(getCodeCommit(t), "\n ") - tag := getLastTag(t) + tag := constants.BuildVersion expected := fmt.Sprintf("{\"Commit\":\"%s %s\"}\n", tag, commit) defer res.Body.Close() // nolint: errcheck @@ -70,17 +72,3 @@ func getCodeCommit(t *testing.T) string { } return strings.TrimSpace(string(gitOut)) } - -func getLastTag(t *testing.T) string { - var gitOut []byte - var err error - gitArgs := []string{"rev-list", "--tags", "--max-count=1"} - if gitOut, err = exec.Command("git", gitArgs...).Output(); err != nil { - assert.NoError(t, err) - } - gitArgs = []string{"describe", "--tags", strings.TrimSpace(string(gitOut))} - if gitOut, err = exec.Command("git", gitArgs...).Output(); err != nil { - assert.NoError(t, err) - } - return strings.TrimSpace(string(gitOut)) -} From 02a96faf3fb543e51b4126764e0f92e03f07f39b Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Thu, 13 Jan 2022 11:29:49 +0800 Subject: [PATCH 120/167] bump version to v1.2.0-rc1 (#4708) --- pkg/constants/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/constants/version.go b/pkg/constants/version.go index 50bf830c0e..fb2133284f 100644 --- a/pkg/constants/version.go +++ b/pkg/constants/version.go @@ -7,7 +7,7 @@ import ( ) // BuildVersion is the local build version, set by build system -const BuildVersion = "1.1.2" +const BuildVersion = "1.2.0-rc1" // software version func UserVersion() string { From ec8c2247da12ec9d2f7a8c59076763423d79d276 Mon Sep 17 00:00:00 2001 From: zl Date: Thu, 13 Jan 2022 12:48:56 +0800 Subject: [PATCH 121/167] use expresion pattern maching version --- .github/workflows/tag-workflow.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tag-workflow.yml b/.github/workflows/tag-workflow.yml index 5531653f81..21fbc12284 100644 --- a/.github/workflows/tag-workflow.yml +++ b/.github/workflows/tag-workflow.yml @@ -36,7 +36,8 @@ jobs: export job_url=$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID export oss_exists=0 export ftp_exists=0 - if [[ "${{github.event_name}}" == "create" ]] && ([[ "$github_tag" =~ "v1." ]] || [[ "$github_tag" =~ "v2." ]]); then + export rx='^v([0-9]+\.){0,2}(\*|[0-9]+)(-rc[0-9]*){0,1}$' + if [[ "${{github.ref_type}}" == "tag" ]] && [[ "${{github.event_name}}" == "create" ]] && [[ "$github_tag" =~ $rx ]]; then export pub_method=pushRelease fi if [[ "$branch" == "" ]]; then From a0df25b907b57a11ff56cb8d3b57cdda3c6bb116 Mon Sep 17 00:00:00 2001 From: simlecode Date: Thu, 13 Jan 2022 16:18:43 +0800 Subject: [PATCH 122/167] fix api client --- go.sum | 43 +++++---------------- venus-shared/api/client/client.go | 8 ++-- venus-shared/api/client/client_test.go | 53 ++++++++++++++++++++++++++ venus-shared/api/proxy_util.go | 10 ++--- venus-shared/api/proxy_util_test.go | 16 +++++--- 5 files changed, 82 insertions(+), 48 deletions(-) create mode 100644 venus-shared/api/client/client_test.go diff --git a/go.sum b/go.sum index dd35aa1ef7..aa4ff1855f 100644 --- a/go.sum +++ b/go.sum @@ -126,7 +126,6 @@ github.com/aws/aws-sdk-go v1.32.11/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZve github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= -github.com/benbjohnson/clock v1.0.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= @@ -146,7 +145,6 @@ github.com/bluele/gcache v0.0.0-20190518031135-bc40bd653833/go.mod h1:8c4/i2Vlov github.com/bombsimon/wsl/v3 v3.2.0 h1:x3QUbwW7tPGcCNridvqmhSRthZMTALnkg5/1J+vaUas= github.com/bombsimon/wsl/v3 v3.2.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= -github.com/briandowns/spinner v1.11.1 h1:OixPqDEcX3juo5AjQZAnFPbeUA0jvkp2qzB5gOZJ/L0= github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= @@ -191,6 +189,7 @@ github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnht github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327 h1:7grrpcfCtbZLsjtB0DgMuzs1umsJmpzaHMZ6cO6iAWw= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -204,7 +203,9 @@ github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.1.0 h1:kq/SbG2BCKLkDKkjQf5OWwKWUKj1lgs3lFI4PxnR5lg= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= @@ -229,7 +230,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= -github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= @@ -245,12 +245,10 @@ github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6ps github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= -github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/badger/v3 v3.2011.1 h1:Hmyof0WMEF/QtutX5SQHzIMnJQxb/IrSzhjckV2SD6g= github.com/dgraph-io/badger/v3 v3.2011.1/go.mod h1:0rLLrQpKVQAL0or/lBLMQznhr6dWWX7h5AKnmnqx268= -github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.4-0.20210122082011-bb5d392ed82d h1:eQYOG6A4td1tht0NdJB9Ls6DsXRGb2Ft6X9REU/MbbE= @@ -269,13 +267,10 @@ github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5Xh github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= -github.com/drand/drand v1.2.1 h1:KB7z+69YbnQ5z22AH/LMi0ObDR8DzYmrkS6vZXTR9jI= -github.com/drand/drand v1.2.1/go.mod h1:j0P7RGmVaY7E/OuO2yQOcQj7OgeZCuhgu2gdv0JAm+g= github.com/drand/drand v1.3.0 h1:k/w/PtHzmlU6OmfoAqgirWyrJ4FZH8ESlJrsKF20UkM= github.com/drand/drand v1.3.0/go.mod h1:D6kAVlxufq1gi71YCGfzN455JrXF4Q272ZJEG975fzo= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw= -github.com/drand/kyber v1.1.4 h1:YvKM03QWGvLrdTnYmxxP5iURAX+Gdb6qRDUOgg8i60Q= github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U= github.com/drand/kyber v1.1.7 h1:YnOshFoGYSOdhf4K8BiDw4XL/l6caL92vsodAsVQbJI= github.com/drand/kyber v1.1.7/go.mod h1:UkHLsI4W6+jT5PvNxmc0cvQAgppjTUpX+XCsN9TXmRo= @@ -289,6 +284,7 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elastic/gosigar v0.12.0 h1:AsdhYCJlTudhfOYQyFNgx+fIVTfrDO0V1ST0vHgiapU= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= @@ -390,7 +386,6 @@ github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7wa github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578 h1:RpiHYKzuEnWoPhp2HO7sVC8QY78TZIpO4dhbp0g/g+A= github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578/go.mod h1:/cbLZYvQhinVFUG4TP2Uy1o7LtF+guT21qZIMTmKk0g= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= @@ -489,7 +484,9 @@ github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4 github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968 h1:s+PDl6lozQ+dEUtUtQnO7+A2iPG3sK1pI4liU+jxn90= github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY= github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= @@ -670,7 +667,6 @@ github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpg github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= @@ -791,7 +787,6 @@ github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9Dr github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= -github.com/ipfs/go-ds-badger2 v0.1.0/go.mod h1:pbR1p817OZbdId9EvLOhKBgUVTM3BMCSTan78lDDVaw= github.com/ipfs/go-ds-badger2 v0.1.2 h1:sQc2q1gaXrv8YFNeUtxil0neuyDf9hnVHfLsi7lpXfE= github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= @@ -1065,8 +1060,6 @@ github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZk github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= -github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= -github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= @@ -1081,7 +1074,6 @@ github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= -github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= github.com/libp2p/go-libp2p-autonat v0.7.0 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= @@ -1089,7 +1081,6 @@ github.com/libp2p/go-libp2p-autonat v0.7.0/go.mod h1:uPvPn6J7cN+LCfFwW5tpOYvAz5N github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= -github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= github.com/libp2p/go-libp2p-blankhost v0.3.0 h1:kTnLArltMabZlzY63pgGDA4kkUcLkBFSM98zBssn/IY= github.com/libp2p/go-libp2p-blankhost v0.3.0/go.mod h1:urPC+7U01nCGgJ3ZsV8jdwTp6Ji9ID0dMTvq+aJ+nZU= @@ -1097,12 +1088,10 @@ github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0 github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= -github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= -github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4= -github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= +github.com/libp2p/go-libp2p-connmgr v0.3.0 h1:yerFXrYa0oxpuVsLlndwm/bLulouHYDcvFrY/4H4fx8= github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= @@ -1117,7 +1106,6 @@ github.com/libp2p/go-libp2p-core v0.3.1/go.mod h1:thvWy0hvaSBhnVBaW37BvzgVV68OUh github.com/libp2p/go-libp2p-core v0.4.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= github.com/libp2p/go-libp2p-core v0.5.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= github.com/libp2p/go-libp2p-core v0.5.1/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.2/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= github.com/libp2p/go-libp2p-core v0.5.3/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= github.com/libp2p/go-libp2p-core v0.5.4/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= github.com/libp2p/go-libp2p-core v0.5.5/go.mod h1:vj3awlOr9+GMZJFH9s4mpt9RHHgGqeHCopzbYKZdRjM= @@ -1144,7 +1132,6 @@ github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2T github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= -github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= @@ -1181,7 +1168,6 @@ github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8 github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= github.com/libp2p/go-libp2p-noise v0.3.0 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= @@ -1196,8 +1182,6 @@ github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVd github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.3/go.mod h1:K8ljLdFn590GMttg/luh4caB/3g0vKuY01psze0upRw= -github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= @@ -1208,7 +1192,6 @@ github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6n github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= -github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= @@ -1234,7 +1217,6 @@ github.com/libp2p/go-libp2p-swarm v0.0.6/go.mod h1:s5GZvzg9xXe8sbeESuFpjt8CJPTCa github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= -github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= @@ -1356,7 +1338,6 @@ github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9t github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= -github.com/libp2p/go-ws-transport v0.3.1/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= github.com/libp2p/go-ws-transport v0.5.0 h1:cO6x4P0v6PfxbKnxmf5cY2Ny4OPDGYkUqNvZzp/zdlo= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= @@ -1366,7 +1347,6 @@ github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.6/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= @@ -1547,7 +1527,6 @@ github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysj github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= @@ -1636,6 +1615,7 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df h1:vdYtBU6zvL7v+Tr+0xFM/qhahw/EvY8DMMunZHKH6eE= @@ -1729,7 +1709,6 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7z github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.1.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= @@ -1754,6 +1733,7 @@ github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= +github.com/raulk/go-watchdog v1.2.0 h1:konN75pw2BMmZ+AfuAm5rtFsWcJpKF3m02rKituuXNo= github.com/raulk/go-watchdog v1.2.0/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= @@ -1934,7 +1914,6 @@ github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lP github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg= github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -2116,7 +2095,6 @@ golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2213,7 +2191,6 @@ golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200519113804-d87ec0cfa476/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -2321,7 +2298,6 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2546,7 +2522,6 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= diff --git a/venus-shared/api/client/client.go b/venus-shared/api/client/client.go index 922013238f..9d6817db26 100644 --- a/venus-shared/api/client/client.go +++ b/venus-shared/api/client/client.go @@ -2,7 +2,9 @@ package client import ( "context" + "github.com/filecoin-project/go-jsonrpc" + "github.com/filecoin-project/venus/venus-shared/api" v0 "github.com/filecoin-project/venus/venus-shared/api/chain/v0" v1 "github.com/filecoin-project/venus/venus-shared/api/chain/v1" @@ -11,20 +13,20 @@ import ( func NewFullRPCV0(ctx context.Context, addr string, header http.Header) (v0.FullNode, jsonrpc.ClientCloser, error) { var full v0.FullNodeStruct - closer, err := jsonrpc.NewClient(ctx, addr, "Filecoin", &full, + closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&full), header) return &full, closer, err } func NewFullRPCV1(ctx context.Context, addr string, header http.Header) (v1.FullNode, jsonrpc.ClientCloser, error) { var full v1.FullNodeStruct - closer, err := jsonrpc.NewClient(ctx, addr, "Filecoin", &full, + closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&full), header) return &full, closer, err } func NewWalletRPC(ctx context.Context, addr string, header http.Header) (v1.IWallet, jsonrpc.ClientCloser, error) { var wallet v1.IWalletStruct - closer, err := jsonrpc.NewClient(ctx, addr, "Filecoin", &wallet, header) + closer, err := jsonrpc.NewClient(ctx, addr, "Filecoin", &wallet.Internal, header) return &wallet, closer, err } diff --git a/venus-shared/api/client/client_test.go b/venus-shared/api/client/client_test.go new file mode 100644 index 0000000000..579c47998a --- /dev/null +++ b/venus-shared/api/client/client_test.go @@ -0,0 +1,53 @@ +package client + +import ( + "context" + "net/http" + "testing" + + "github.com/stretchr/testify/assert" + + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" +) + +func TestAPIClient(t *testing.T) { + t.SkipNow() + tf.UnitTest(t) + token := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBbGxvdyI6WyJyZWFkIiwid3JpdGUiLCJzaWduIiwiYWRtaW4iXX0.J9r8fhNJpf1bD4G4_tqT9UR81S5CNJHS6fD86rqxfpQ" + addr := "ws://127.0.0.1:3453/rpc/v0" + + ctx := context.Background() + header := http.Header{} + header.Add("Authorization", "Bearer "+token) + + v0cli, v0close, err := NewFullRPCV0(ctx, addr, header) + assert.Nil(t, err) + defer v0close() + + v1cli, v1close, err := NewFullRPCV1(ctx, addr, header) + assert.Nil(t, err) + defer v1close() + + head, err := v0cli.ChainHead(context.Background()) + assert.Nil(t, err) + head2, err := v1cli.ChainHead(context.Background()) + assert.Nil(t, err) + assert.Equal(t, head, head2) + + v0version, err := v0cli.Version(context.Background()) + assert.Nil(t, err) + t.Log(v0version) + + v1version, err := v1cli.Version(context.Background()) + assert.Nil(t, err) + t.Log(v1version) + + wcli, wclose, err := NewWalletRPC(ctx, addr, header) + if err != nil { + t.Fatal(err) + } + defer wclose() + + addrs := wcli.WalletAddresses(context.Background()) + t.Log(addrs) +} diff --git a/venus-shared/api/proxy_util.go b/venus-shared/api/proxy_util.go index ba94a9e5dc..9eb8e5ee25 100644 --- a/venus-shared/api/proxy_util.go +++ b/venus-shared/api/proxy_util.go @@ -12,12 +12,12 @@ func GetInternalStructs(in interface{}) []interface{} { func getInternalStructs(rv reflect.Value) []interface{} { var out []interface{} - internal := rv.FieldByName(_internalField) - ii := internal.Addr().Interface() - out = append(out, ii) - for i := 0; i < rv.NumField(); i++ { - if rv.Type().Field(i).Name == _internalField { + filedValue := rv.Field(i) + filedType := rv.Type().Field(i) + if filedType.Name == _internalField { + ii := filedValue.Addr().Interface() + out = append(out, ii) continue } diff --git a/venus-shared/api/proxy_util_test.go b/venus-shared/api/proxy_util_test.go index bf9a4c0c06..a57d44ff21 100644 --- a/venus-shared/api/proxy_util_test.go +++ b/venus-shared/api/proxy_util_test.go @@ -29,6 +29,10 @@ type StrC struct { } } +type StrD struct { + StrA +} + func TestGetInternalStructs(t *testing.T) { tf.UnitTest(t) var proxy StrA @@ -36,13 +40,13 @@ func TestGetInternalStructs(t *testing.T) { sts := GetInternalStructs(&proxy) require.Len(t, sts, 2) - sa := sts[0].(*struct{ A int }) - sa.A = 3 - sb := sts[1].(*struct{ B int }) - sb.B = 4 + sa := sts[0].(*struct{ B int }) + sa.B = 3 + sb := sts[1].(*struct{ A int }) + sb.A = 4 - require.Equal(t, 3, proxy.Internal.A) - require.Equal(t, 4, proxy.StrB.Internal.B) + require.Equal(t, 4, proxy.Internal.A) + require.Equal(t, 3, proxy.StrB.Internal.B) } func TestNestedInternalStructs(t *testing.T) { From 5985b8275768821a9d5d36ce00a79fe27b8754f7 Mon Sep 17 00:00:00 2001 From: hunjixin <1084400399@qq.com> Date: Thu, 13 Jan 2022 16:36:53 +0800 Subject: [PATCH 123/167] fix search msg --- pkg/chain/waiter.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/pkg/chain/waiter.go b/pkg/chain/waiter.go index 320144702a..028b20fc57 100644 --- a/pkg/chain/waiter.go +++ b/pkg/chain/waiter.go @@ -141,12 +141,7 @@ func (w *Waiter) findMessage(ctx context.Context, from *types.TipSet, m types.Ch return nil, false, xerrors.Errorf("failed to load tipset during msg wait searchback: %w", err) } - grandParent, err := w.chainReader.GetTipSet(ctx, pts.Parents()) - if err != nil { - return nil, false, xerrors.Errorf("failed to load tipset during msg wait searchback: %w", err) - } - - act, err := w.Stmgr.GetActorAt(ctx, m.VMMessage().From, grandParent) + act, err := w.Stmgr.GetActorAt(ctx, m.VMMessage().From, pts) actorNoExist := errors.Is(err, types.ErrActorNotFound) if err != nil && !actorNoExist { return nil, false, xerrors.Errorf("failed to load the actor: %w", err) From dbb2f0bcfb16ffe287724ba8feccc0795c1ae629 Mon Sep 17 00:00:00 2001 From: simlecode Date: Thu, 13 Jan 2022 16:56:16 +0800 Subject: [PATCH 124/167] update api version --- app/submodule/apitypes/network.go | 4 ++-- app/submodule/network/network_api.go | 2 +- app/submodule/network/v0api/v1_wrapper.go | 3 +-- pkg/constants/version.go | 12 ------------ venus-shared/api/version.go | 5 +++-- 5 files changed, 7 insertions(+), 19 deletions(-) diff --git a/app/submodule/apitypes/network.go b/app/submodule/apitypes/network.go index 30dd7ee616..9be3773b2d 100644 --- a/app/submodule/apitypes/network.go +++ b/app/submodule/apitypes/network.go @@ -1,6 +1,6 @@ package apitypes -import "github.com/filecoin-project/venus/pkg/constants" +import "github.com/filecoin-project/venus/venus-shared/api" // Version provides various build-time information type Version struct { @@ -10,5 +10,5 @@ type Version struct { // this api // // See APIVersion in build/version.go - APIVersion constants.Version + APIVersion api.Version } diff --git a/app/submodule/network/network_api.go b/app/submodule/network/network_api.go index af49be13dd..54b6b501e7 100644 --- a/app/submodule/network/network_api.go +++ b/app/submodule/network/network_api.go @@ -64,7 +64,7 @@ func (na *networkAPI) NetworkPeers(ctx context.Context, verbose, latency, stream func (na *networkAPI) Version(context.Context) (types.Version, error) { return types.Version{ Version: constants.UserVersion(), - APIVersion: api.Version(constants.FullAPIVersion1), + APIVersion: api.FullAPIVersion1, }, nil } diff --git a/app/submodule/network/v0api/v1_wrapper.go b/app/submodule/network/v0api/v1_wrapper.go index 64b0797fdf..aefa9d46d2 100644 --- a/app/submodule/network/v0api/v1_wrapper.go +++ b/app/submodule/network/v0api/v1_wrapper.go @@ -5,7 +5,6 @@ import ( "github.com/filecoin-project/venus/venus-shared/types" - "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/venus-shared/api" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" ) @@ -20,7 +19,7 @@ func (w *WrapperV1INetwork) Version(ctx context.Context) (types.Version, error) return types.Version{}, err } - ver.APIVersion = api.Version(constants.FullAPIVersion0) + ver.APIVersion = api.FullAPIVersion0 return ver, nil } diff --git a/pkg/constants/version.go b/pkg/constants/version.go index fb2133284f..abc41a9eeb 100644 --- a/pkg/constants/version.go +++ b/pkg/constants/version.go @@ -17,15 +17,3 @@ func UserVersion() string { return BuildVersion + flags.GitCommit } - -type Version uint32 - -func newVer(major, minor, patch uint8) Version { - return Version(uint32(major)<<16 | uint32(minor)<<8 | uint32(patch)) -} - -// semver versions of the rpc api exposed -var ( - FullAPIVersion0 = newVer(1, 5, 0) - FullAPIVersion1 = newVer(2, 2, 0) -) diff --git a/venus-shared/api/version.go b/venus-shared/api/version.go index b80a222e21..ff1f525d0a 100644 --- a/venus-shared/api/version.go +++ b/venus-shared/api/version.go @@ -2,6 +2,7 @@ package api import ( "fmt" + "golang.org/x/xerrors" ) @@ -53,8 +54,8 @@ func VersionForType(nodeType NodeType) (Version, error) { // semver versions of the rpc api exposed var ( - FullAPIVersion0 = NewVer(1, 4, 0) - FullAPIVersion1 = NewVer(2, 1, 0) + FullAPIVersion0 = NewVer(1, 5, 0) + FullAPIVersion1 = NewVer(2, 2, 0) MinerAPIVersion0 = NewVer(1, 2, 0) WorkerAPIVersion0 = NewVer(1, 5, 0) From f1ef79325a452f2a6a4f0302d438a999e600136a Mon Sep 17 00:00:00 2001 From: simlecode Date: Thu, 13 Jan 2022 21:19:44 +0800 Subject: [PATCH 125/167] bump version to v1.2.0-rc2 --- pkg/constants/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/constants/version.go b/pkg/constants/version.go index abc41a9eeb..e121dcc0b6 100644 --- a/pkg/constants/version.go +++ b/pkg/constants/version.go @@ -7,7 +7,7 @@ import ( ) // BuildVersion is the local build version, set by build system -const BuildVersion = "1.2.0-rc1" +const BuildVersion = "1.2.0-rc2" // software version func UserVersion() string { From a12ac0b16724a7f8c7da3e3e3ecef5b8dda3eb79 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Tue, 18 Jan 2022 19:11:57 +0800 Subject: [PATCH 126/167] vm: fix network version not correct (#4712) --- pkg/consensus/expected.go | 21 ++++++++-------- pkg/fork/fork.go | 2 +- pkg/gen/genesis/genesis.go | 17 +++++++------ pkg/gen/genesis/miners.go | 17 +++++++------ pkg/state/tree/state.go | 4 +--- pkg/statemanger/call.go | 42 ++++++++++++++++---------------- pkg/vm/vmcontext/types.go | 2 ++ pkg/vm/vmcontext/vmcontext.go | 8 +++++-- tools/conformance/driver.go | 44 ++++++++++++++++++---------------- tools/gengen/util/generator.go | 3 +++ 10 files changed, 89 insertions(+), 71 deletions(-) diff --git a/pkg/consensus/expected.go b/pkg/consensus/expected.go index b97fb89950..17cdc8913f 100644 --- a/pkg/consensus/expected.go +++ b/pkg/consensus/expected.go @@ -207,16 +207,17 @@ func (c *Expected) RunStateTransition(ctx context.Context, ts *types.TipSet) (ci } return dertail.FilCirculating, nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, c.chainState, c.fork, ts), - NetworkVersion: c.fork.GetNetworkVersion(ctx, ts.At(0).Height), - Rnd: NewHeadRandomness(c.rnd, ts.Key()), - BaseFee: ts.At(0).ParentBaseFee, - Fork: c.fork, - Epoch: ts.At(0).Height, - GasPriceSchedule: c.gasPirceSchedule, - Bsstore: c.bstore, - PRoot: ts.At(0).ParentStateRoot, - SysCallsImpl: c.syscallsImpl, + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, c.chainState, c.fork, ts), + NetworkVersion: c.fork.GetNetworkVersion(ctx, ts.At(0).Height), + NetworkVersionGetter: c.fork.GetNetworkVersion, + Rnd: NewHeadRandomness(c.rnd, ts.Key()), + BaseFee: ts.At(0).ParentBaseFee, + Fork: c.fork, + Epoch: ts.At(0).Height, + GasPriceSchedule: c.gasPirceSchedule, + Bsstore: c.bstore, + PRoot: ts.At(0).ParentStateRoot, + SysCallsImpl: c.syscallsImpl, } root, receipts, err := c.processor.ProcessTipSet(ctx, pts, ts, blockMessageInfo, vmOption) if err != nil { diff --git a/pkg/fork/fork.go b/pkg/fork/fork.go index 004a248822..b3186322d5 100644 --- a/pkg/fork/fork.go +++ b/pkg/fork/fork.go @@ -5,12 +5,12 @@ import ( "context" "encoding/binary" "errors" - "github.com/docker/go-units" "runtime" "sort" "sync" "time" + "github.com/docker/go-units" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" diff --git a/pkg/gen/genesis/genesis.go b/pkg/gen/genesis/genesis.go index cd90b3c545..362a7ca5a1 100644 --- a/pkg/gen/genesis/genesis.go +++ b/pkg/gen/genesis/genesis.go @@ -493,13 +493,16 @@ func VerifyPreSealedData(ctx context.Context, cs *chain.Store, stateroot cid.Cid vmopt := vm.VmOption{ CircSupplyCalculator: csc, NetworkVersion: nv, - Rnd: &fakeRand{}, - BaseFee: big.NewInt(0), - Epoch: 0, - PRoot: stateroot, - Bsstore: cs.Blockstore(), - SysCallsImpl: mkFakedSigSyscalls(syscalls), - GasPriceSchedule: gasPriceSchedule, + NetworkVersionGetter: func(ctx context.Context, height abi.ChainEpoch) network.Version { + return nv + }, + Rnd: &fakeRand{}, + BaseFee: big.NewInt(0), + Epoch: 0, + PRoot: stateroot, + Bsstore: cs.Blockstore(), + SysCallsImpl: mkFakedSigSyscalls(syscalls), + GasPriceSchedule: gasPriceSchedule, } vm, err := vm.NewVM(ctx, vmopt) diff --git a/pkg/gen/genesis/miners.go b/pkg/gen/genesis/miners.go index 1b560849d5..dd04bed5be 100644 --- a/pkg/gen/genesis/miners.go +++ b/pkg/gen/genesis/miners.go @@ -98,13 +98,16 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min vmopt := vm.VmOption{ CircSupplyCalculator: csc, NetworkVersion: nv, - Rnd: &fakeRand{}, - BaseFee: big.NewInt(0), - Epoch: 0, - PRoot: sroot, - Bsstore: cs.Blockstore(), - SysCallsImpl: mkFakedSigSyscalls(syscalls), - GasPriceSchedule: gasPirceSchedule, + NetworkVersionGetter: func(ctx context.Context, height abi.ChainEpoch) network.Version { + return nv + }, + Rnd: &fakeRand{}, + BaseFee: big.NewInt(0), + Epoch: 0, + PRoot: sroot, + Bsstore: cs.Blockstore(), + SysCallsImpl: mkFakedSigSyscalls(syscalls), + GasPriceSchedule: gasPirceSchedule, } vmi, err := vm.NewVM(ctx, vmopt) diff --git a/pkg/state/tree/state.go b/pkg/state/tree/state.go index 8b7994d398..2eea797fa5 100644 --- a/pkg/state/tree/state.go +++ b/pkg/state/tree/state.go @@ -553,9 +553,7 @@ func (st *State) At(root Root) error { return err } - st.root = newState.root - st.version = newState.version - st.info = newState.info + *st = *newState return nil } func Diff(oldTree, newTree *State) (map[string]types.Actor, error) { diff --git a/pkg/statemanger/call.go b/pkg/statemanger/call.go index 103b364b8d..3f7e597dd7 100644 --- a/pkg/statemanger/call.go +++ b/pkg/statemanger/call.go @@ -64,16 +64,17 @@ func (s *Stmgr) CallWithGas(ctx context.Context, msg *types.Message, priorMsgs [ } return cs.FilCirculating, nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, s.cs, s.fork, ts), - NetworkVersion: s.fork.GetNetworkVersion(ctx, ts.Height()+1), - Rnd: consensus.NewHeadRandomness(s.rnd, ts.Key()), - BaseFee: ts.At(0).ParentBaseFee, - Epoch: ts.Height() + 1, - GasPriceSchedule: s.gasSchedule, - PRoot: stateRoot, - Bsstore: s.cs.Blockstore(), - SysCallsImpl: s.syscallsImpl, - Fork: s.fork, + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, s.cs, s.fork, ts), + NetworkVersion: s.fork.GetNetworkVersion(ctx, ts.Height()+1), + NetworkVersionGetter: s.fork.GetNetworkVersion, + Rnd: consensus.NewHeadRandomness(s.rnd, ts.Key()), + BaseFee: ts.At(0).ParentBaseFee, + Epoch: ts.Height() + 1, + GasPriceSchedule: s.gasSchedule, + PRoot: stateRoot, + Bsstore: s.cs.Blockstore(), + SysCallsImpl: s.syscallsImpl, + Fork: s.fork, } vmi, err := vm.NewVM(ctx, vmOption) @@ -196,16 +197,17 @@ func (s *Stmgr) Call(ctx context.Context, msg *types.Message, ts *types.TipSet) } return dertail.FilCirculating, nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, s.cs, s.fork, ts), - NetworkVersion: s.fork.GetNetworkVersion(ctx, pheight+1), - Rnd: consensus.NewHeadRandomness(s.rnd, ts.Key()), - BaseFee: ts.At(0).ParentBaseFee, - Epoch: pheight + 1, - GasPriceSchedule: s.gasSchedule, - Fork: s.fork, - PRoot: ts.At(0).ParentStateRoot, - Bsstore: s.cs.Blockstore(), - SysCallsImpl: s.syscallsImpl, + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, s.cs, s.fork, ts), + NetworkVersion: s.fork.GetNetworkVersion(ctx, pheight+1), + NetworkVersionGetter: s.fork.GetNetworkVersion, + Rnd: consensus.NewHeadRandomness(s.rnd, ts.Key()), + BaseFee: ts.At(0).ParentBaseFee, + Epoch: pheight + 1, + GasPriceSchedule: s.gasSchedule, + Fork: s.fork, + PRoot: ts.At(0).ParentStateRoot, + Bsstore: s.cs.Blockstore(), + SysCallsImpl: s.syscallsImpl, } v, err := vm.NewVM(ctx, vmOption) diff --git a/pkg/vm/vmcontext/types.go b/pkg/vm/vmcontext/types.go index e94c152546..a7d9b6f7a5 100644 --- a/pkg/vm/vmcontext/types.go +++ b/pkg/vm/vmcontext/types.go @@ -22,11 +22,13 @@ import ( type ExecCallBack func(cid.Cid, VmMessage, *Ret) error type CircSupplyCalculator func(context.Context, abi.ChainEpoch, tree.Tree) (abi.TokenAmount, error) type LookbackStateGetter func(context.Context, abi.ChainEpoch) (*state.View, error) +type NetworkVersionGetter func(ctx context.Context, height abi.ChainEpoch) network.Version type VmOption struct { //nolint CircSupplyCalculator CircSupplyCalculator LookbackStateGetter LookbackStateGetter NetworkVersion network.Version + NetworkVersionGetter NetworkVersionGetter Rnd HeadChainRandomness BaseFee abi.TokenAmount Fork fork.IFork diff --git a/pkg/vm/vmcontext/vmcontext.go b/pkg/vm/vmcontext/vmcontext.go index edd301a785..05bd139b7c 100644 --- a/pkg/vm/vmcontext/vmcontext.go +++ b/pkg/vm/vmcontext/vmcontext.go @@ -216,6 +216,8 @@ func (vm *VM) ApplyTipSetMessages(blocks []types.BlockMessagesInfo, ts *types.Ti pstate, _ := vm.State.Flush(vm.context) for i := parentEpoch; i < epoch; i++ { if i > parentEpoch { + // fix: https://github.com/filecoin-project/lotus/pull/7966 + vm.vmOption.NetworkVersion = vm.vmOption.NetworkVersionGetter(vm.context, i) // run cron for null rounds if any cronMessage := makeCronTickMessage() ret, err := vm.applyImplicitMessage(cronMessage) @@ -249,6 +251,9 @@ func (vm *VM) ApplyTipSetMessages(blocks []types.BlockMessagesInfo, ts *types.Ti return cid.Undef, nil, xerrors.Errorf("error advancing vm an epoch: %w", err) } } + // as above + vm.vmOption.NetworkVersion = vm.vmOption.NetworkVersionGetter(vm.context, epoch) + vmlog.Debugf("process tipset fork: %v\n", time.Since(toProcessTipset).Milliseconds()) // create message tracker // Note: the same message could have been included by more than one miner @@ -309,7 +314,6 @@ func (vm *VM) ApplyTipSetMessages(blocks []types.BlockMessagesInfo, ts *types.Ti vm.debugger.Println(string(tracesBytes)) } } - // Pay block reward. // Dragons: missing final protocol design on if/how To determine the nominal power rewardMessage := makeBlockRewardMessage(blkInfo.Block.Miner, minerPenaltyTotal, minerGasRewardTotal, blkInfo.Block.ElectionProof.WinCount) @@ -853,7 +857,7 @@ func (vm *VM) StateTree() tree.Tree { func (vm *VM) GetCircSupply(ctx context.Context) (abi.TokenAmount, error) { // Before v15, this was recalculated on each invocation as the state tree was mutated if vm.vmOption.NetworkVersion <= network.Version14 { - return vm.vmOption.CircSupplyCalculator(ctx, vm.vmOption.Epoch, vm.State) + return vm.vmOption.CircSupplyCalculator(ctx, vm.currentEpoch, vm.State) } return vm.baseCircSupply, nil diff --git a/tools/conformance/driver.go b/tools/conformance/driver.go index 82640298c5..95d12cee31 100644 --- a/tools/conformance/driver.go +++ b/tools/conformance/driver.go @@ -122,16 +122,17 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, chainDs ds.Batching, pr CircSupplyCalculator: func(context.Context, abi.ChainEpoch, tree.Tree) (abi.TokenAmount, error) { return big.Zero(), nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, chainStore, chainFork, nil), - NetworkVersion: chainFork.GetNetworkVersion(ctx, execEpoch), - Rnd: NewFixedRand(), - BaseFee: big.NewFromGo(&tipset.BaseFee), - Fork: chainFork, - Epoch: execEpoch, - GasPriceSchedule: gas.NewPricesSchedule(mainNetParams.Network.ForkUpgradeParam), - PRoot: preroot, - Bsstore: bs, - SysCallsImpl: syscalls, + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, chainStore, chainFork, nil), + NetworkVersion: chainFork.GetNetworkVersion(ctx, execEpoch), + NetworkVersionGetter: chainFork.GetNetworkVersion, + Rnd: NewFixedRand(), + BaseFee: big.NewFromGo(&tipset.BaseFee), + Fork: chainFork, + Epoch: execEpoch, + GasPriceSchedule: gas.NewPricesSchedule(mainNetParams.Network.ForkUpgradeParam), + PRoot: preroot, + Bsstore: bs, + SysCallsImpl: syscalls, } ) @@ -302,17 +303,18 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP CircSupplyCalculator: func(ctx context.Context, epoch abi.ChainEpoch, tree tree.Tree) (abi.TokenAmount, error) { return params.CircSupply, nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, chainStore, chainFork, nil), - NetworkVersion: params.NetworkVersion, - Rnd: params.Rand, - BaseFee: params.BaseFee, - Fork: chainFork, - ActorCodeLoader: &coderLoader, - Epoch: params.Epoch, - GasPriceSchedule: gas.NewPricesSchedule(mainNetParams.Network.ForkUpgradeParam), - PRoot: params.Preroot, - Bsstore: bs, - SysCallsImpl: syscalls, + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, chainStore, chainFork, nil), + NetworkVersion: params.NetworkVersion, + NetworkVersionGetter: chainFork.GetNetworkVersion, + Rnd: params.Rand, + BaseFee: params.BaseFee, + Fork: chainFork, + ActorCodeLoader: &coderLoader, + Epoch: params.Epoch, + GasPriceSchedule: gas.NewPricesSchedule(mainNetParams.Network.ForkUpgradeParam), + PRoot: params.Preroot, + Bsstore: bs, + SysCallsImpl: syscalls, } ) diff --git a/tools/gengen/util/generator.go b/tools/gengen/util/generator.go index 9dd19f3887..803769f4cd 100644 --- a/tools/gengen/util/generator.go +++ b/tools/gengen/util/generator.go @@ -95,6 +95,9 @@ func NewGenesisGenerator(bs blockstore.Blockstore) *GenesisGenerator { SysCallsImpl: syscallImpl, Fork: chainFork, } + vmOption.NetworkVersionGetter = func(ctx context.Context, height abi.ChainEpoch) network.Version { + return vmOption.NetworkVersion + } vm, err := vm.NewVM(context.Background(), vmOption) if err != nil { panic(xerrors.Errorf("create state error, should never come here")) From 96f29dadf54a1d08d066ee4d34834344cf59535e Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Tue, 18 Jan 2022 19:15:23 +0800 Subject: [PATCH 127/167] bump version to v1.2.0-rc3 (#4713) --- pkg/constants/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/constants/version.go b/pkg/constants/version.go index e121dcc0b6..c1dd53ce64 100644 --- a/pkg/constants/version.go +++ b/pkg/constants/version.go @@ -7,7 +7,7 @@ import ( ) // BuildVersion is the local build version, set by build system -const BuildVersion = "1.2.0-rc2" +const BuildVersion = "1.2.0-rc3" // software version func UserVersion() string { From a886f66e61cb9ebbc6256910e6888d0124201194 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Wed, 19 Jan 2022 16:21:44 +0800 Subject: [PATCH 128/167] No need to compare from address and to address (#4716) * No need to compare from address and to address * vmoption remove NetworkVersionGetter --- pkg/consensus/expected.go | 21 ++++++------ pkg/gen/genesis/genesis.go | 17 ++++------ pkg/gen/genesis/miners.go | 18 ++++------- pkg/statemanger/call.go | 42 ++++++++++++------------ pkg/vm/vmcontext/invocation_context.go | 16 +++------- pkg/vm/vmcontext/types.go | 2 -- pkg/vm/vmcontext/vmcontext.go | 4 +-- tools/conformance/driver.go | 44 ++++++++++++-------------- tools/gengen/util/generator.go | 3 -- 9 files changed, 71 insertions(+), 96 deletions(-) diff --git a/pkg/consensus/expected.go b/pkg/consensus/expected.go index 17cdc8913f..b97fb89950 100644 --- a/pkg/consensus/expected.go +++ b/pkg/consensus/expected.go @@ -207,17 +207,16 @@ func (c *Expected) RunStateTransition(ctx context.Context, ts *types.TipSet) (ci } return dertail.FilCirculating, nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, c.chainState, c.fork, ts), - NetworkVersion: c.fork.GetNetworkVersion(ctx, ts.At(0).Height), - NetworkVersionGetter: c.fork.GetNetworkVersion, - Rnd: NewHeadRandomness(c.rnd, ts.Key()), - BaseFee: ts.At(0).ParentBaseFee, - Fork: c.fork, - Epoch: ts.At(0).Height, - GasPriceSchedule: c.gasPirceSchedule, - Bsstore: c.bstore, - PRoot: ts.At(0).ParentStateRoot, - SysCallsImpl: c.syscallsImpl, + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, c.chainState, c.fork, ts), + NetworkVersion: c.fork.GetNetworkVersion(ctx, ts.At(0).Height), + Rnd: NewHeadRandomness(c.rnd, ts.Key()), + BaseFee: ts.At(0).ParentBaseFee, + Fork: c.fork, + Epoch: ts.At(0).Height, + GasPriceSchedule: c.gasPirceSchedule, + Bsstore: c.bstore, + PRoot: ts.At(0).ParentStateRoot, + SysCallsImpl: c.syscallsImpl, } root, receipts, err := c.processor.ProcessTipSet(ctx, pts, ts, blockMessageInfo, vmOption) if err != nil { diff --git a/pkg/gen/genesis/genesis.go b/pkg/gen/genesis/genesis.go index 362a7ca5a1..cd90b3c545 100644 --- a/pkg/gen/genesis/genesis.go +++ b/pkg/gen/genesis/genesis.go @@ -493,16 +493,13 @@ func VerifyPreSealedData(ctx context.Context, cs *chain.Store, stateroot cid.Cid vmopt := vm.VmOption{ CircSupplyCalculator: csc, NetworkVersion: nv, - NetworkVersionGetter: func(ctx context.Context, height abi.ChainEpoch) network.Version { - return nv - }, - Rnd: &fakeRand{}, - BaseFee: big.NewInt(0), - Epoch: 0, - PRoot: stateroot, - Bsstore: cs.Blockstore(), - SysCallsImpl: mkFakedSigSyscalls(syscalls), - GasPriceSchedule: gasPriceSchedule, + Rnd: &fakeRand{}, + BaseFee: big.NewInt(0), + Epoch: 0, + PRoot: stateroot, + Bsstore: cs.Blockstore(), + SysCallsImpl: mkFakedSigSyscalls(syscalls), + GasPriceSchedule: gasPriceSchedule, } vm, err := vm.NewVM(ctx, vmopt) diff --git a/pkg/gen/genesis/miners.go b/pkg/gen/genesis/miners.go index dd04bed5be..eed90c7589 100644 --- a/pkg/gen/genesis/miners.go +++ b/pkg/gen/genesis/miners.go @@ -97,17 +97,13 @@ func SetupStorageMiners(ctx context.Context, cs *chain.Store, sroot cid.Cid, min gasPirceSchedule := gas.NewPricesSchedule(para) vmopt := vm.VmOption{ CircSupplyCalculator: csc, - NetworkVersion: nv, - NetworkVersionGetter: func(ctx context.Context, height abi.ChainEpoch) network.Version { - return nv - }, - Rnd: &fakeRand{}, - BaseFee: big.NewInt(0), - Epoch: 0, - PRoot: sroot, - Bsstore: cs.Blockstore(), - SysCallsImpl: mkFakedSigSyscalls(syscalls), - GasPriceSchedule: gasPirceSchedule, + Rnd: &fakeRand{}, + BaseFee: big.NewInt(0), + Epoch: 0, + PRoot: sroot, + Bsstore: cs.Blockstore(), + SysCallsImpl: mkFakedSigSyscalls(syscalls), + GasPriceSchedule: gasPirceSchedule, } vmi, err := vm.NewVM(ctx, vmopt) diff --git a/pkg/statemanger/call.go b/pkg/statemanger/call.go index 3f7e597dd7..103b364b8d 100644 --- a/pkg/statemanger/call.go +++ b/pkg/statemanger/call.go @@ -64,17 +64,16 @@ func (s *Stmgr) CallWithGas(ctx context.Context, msg *types.Message, priorMsgs [ } return cs.FilCirculating, nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, s.cs, s.fork, ts), - NetworkVersion: s.fork.GetNetworkVersion(ctx, ts.Height()+1), - NetworkVersionGetter: s.fork.GetNetworkVersion, - Rnd: consensus.NewHeadRandomness(s.rnd, ts.Key()), - BaseFee: ts.At(0).ParentBaseFee, - Epoch: ts.Height() + 1, - GasPriceSchedule: s.gasSchedule, - PRoot: stateRoot, - Bsstore: s.cs.Blockstore(), - SysCallsImpl: s.syscallsImpl, - Fork: s.fork, + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, s.cs, s.fork, ts), + NetworkVersion: s.fork.GetNetworkVersion(ctx, ts.Height()+1), + Rnd: consensus.NewHeadRandomness(s.rnd, ts.Key()), + BaseFee: ts.At(0).ParentBaseFee, + Epoch: ts.Height() + 1, + GasPriceSchedule: s.gasSchedule, + PRoot: stateRoot, + Bsstore: s.cs.Blockstore(), + SysCallsImpl: s.syscallsImpl, + Fork: s.fork, } vmi, err := vm.NewVM(ctx, vmOption) @@ -197,17 +196,16 @@ func (s *Stmgr) Call(ctx context.Context, msg *types.Message, ts *types.TipSet) } return dertail.FilCirculating, nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, s.cs, s.fork, ts), - NetworkVersion: s.fork.GetNetworkVersion(ctx, pheight+1), - NetworkVersionGetter: s.fork.GetNetworkVersion, - Rnd: consensus.NewHeadRandomness(s.rnd, ts.Key()), - BaseFee: ts.At(0).ParentBaseFee, - Epoch: pheight + 1, - GasPriceSchedule: s.gasSchedule, - Fork: s.fork, - PRoot: ts.At(0).ParentStateRoot, - Bsstore: s.cs.Blockstore(), - SysCallsImpl: s.syscallsImpl, + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, s.cs, s.fork, ts), + NetworkVersion: s.fork.GetNetworkVersion(ctx, pheight+1), + Rnd: consensus.NewHeadRandomness(s.rnd, ts.Key()), + BaseFee: ts.At(0).ParentBaseFee, + Epoch: pheight + 1, + GasPriceSchedule: s.gasSchedule, + Fork: s.fork, + PRoot: ts.At(0).ParentStateRoot, + Bsstore: s.cs.Blockstore(), + SysCallsImpl: s.syscallsImpl, } v, err := vm.NewVM(ctx, vmOption) diff --git a/pkg/vm/vmcontext/invocation_context.go b/pkg/vm/vmcontext/invocation_context.go index f7f2b2dd0a..127c9c8032 100644 --- a/pkg/vm/vmcontext/invocation_context.go +++ b/pkg/vm/vmcontext/invocation_context.go @@ -218,8 +218,7 @@ func (ctx *invocationContext) invoke() (ret []byte, errcode exitcode.ExitCode) { // 2. load target actor // 3. transfer optional funds // 4. short-circuit _Send_ Method - // 5. load target actor code - // 6. create target stateView handle + // 5. create target stateView handle // assert From address is an ID address. if ctx.msg.From.Protocol() != address.ID { panic("bad code: sender address MUST be an ID address at invocation time") @@ -227,7 +226,7 @@ func (ctx *invocationContext) invoke() (ret []byte, errcode exitcode.ExitCode) { // 1. load target actor // Note: we replace the "To" address with the normalized version - _, toIDAddr := ctx.resolveTarget(ctx.originMsg.To) + toActor, toIDAddr := ctx.resolveTarget(ctx.originMsg.To) if ctx.vm.NetworkVersion() > network.Version3 { ctx.msg.To = toIDAddr } @@ -237,9 +236,7 @@ func (ctx *invocationContext) invoke() (ret []byte, errcode exitcode.ExitCode) { // 3. transfer funds carried by the msg if !ctx.originMsg.Value.Nil() && !ctx.originMsg.Value.IsZero() { - if ctx.msg.From != toIDAddr { - ctx.vm.transfer(ctx.msg.From, toIDAddr, ctx.originMsg.Value, ctx.vm.NetworkVersion()) - } + ctx.vm.transfer(ctx.msg.From, toIDAddr, ctx.originMsg.Value, ctx.vm.NetworkVersion()) } // 4. if we are just sending funds, there is nothing else To do. @@ -247,14 +244,9 @@ func (ctx *invocationContext) invoke() (ret []byte, errcode exitcode.ExitCode) { return nil, exitcode.Ok } - // 5. load target actor code - toActor, found, err := ctx.vm.State.GetActor(ctx.vm.context, ctx.originMsg.To) - if err != nil || !found { - panic(xerrors.Errorf("cannt find to actor %v", err)) - } actorImpl := ctx.vm.getActorImpl(toActor.Code, ctx.Runtime()) - // 6. create target stateView handle + // 5. create target stateView handle stateHandle := newActorStateHandle((*stateHandleContext)(ctx)) ctx.stateHandle = &stateHandle diff --git a/pkg/vm/vmcontext/types.go b/pkg/vm/vmcontext/types.go index a7d9b6f7a5..e94c152546 100644 --- a/pkg/vm/vmcontext/types.go +++ b/pkg/vm/vmcontext/types.go @@ -22,13 +22,11 @@ import ( type ExecCallBack func(cid.Cid, VmMessage, *Ret) error type CircSupplyCalculator func(context.Context, abi.ChainEpoch, tree.Tree) (abi.TokenAmount, error) type LookbackStateGetter func(context.Context, abi.ChainEpoch) (*state.View, error) -type NetworkVersionGetter func(ctx context.Context, height abi.ChainEpoch) network.Version type VmOption struct { //nolint CircSupplyCalculator CircSupplyCalculator LookbackStateGetter LookbackStateGetter NetworkVersion network.Version - NetworkVersionGetter NetworkVersionGetter Rnd HeadChainRandomness BaseFee abi.TokenAmount Fork fork.IFork diff --git a/pkg/vm/vmcontext/vmcontext.go b/pkg/vm/vmcontext/vmcontext.go index 05bd139b7c..1d542506ee 100644 --- a/pkg/vm/vmcontext/vmcontext.go +++ b/pkg/vm/vmcontext/vmcontext.go @@ -217,7 +217,7 @@ func (vm *VM) ApplyTipSetMessages(blocks []types.BlockMessagesInfo, ts *types.Ti for i := parentEpoch; i < epoch; i++ { if i > parentEpoch { // fix: https://github.com/filecoin-project/lotus/pull/7966 - vm.vmOption.NetworkVersion = vm.vmOption.NetworkVersionGetter(vm.context, i) + vm.vmOption.NetworkVersion = vm.vmOption.Fork.GetNetworkVersion(vm.context, i) // run cron for null rounds if any cronMessage := makeCronTickMessage() ret, err := vm.applyImplicitMessage(cronMessage) @@ -252,7 +252,7 @@ func (vm *VM) ApplyTipSetMessages(blocks []types.BlockMessagesInfo, ts *types.Ti } } // as above - vm.vmOption.NetworkVersion = vm.vmOption.NetworkVersionGetter(vm.context, epoch) + vm.vmOption.NetworkVersion = vm.vmOption.Fork.GetNetworkVersion(vm.context, epoch) vmlog.Debugf("process tipset fork: %v\n", time.Since(toProcessTipset).Milliseconds()) // create message tracker diff --git a/tools/conformance/driver.go b/tools/conformance/driver.go index 95d12cee31..82640298c5 100644 --- a/tools/conformance/driver.go +++ b/tools/conformance/driver.go @@ -122,17 +122,16 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, chainDs ds.Batching, pr CircSupplyCalculator: func(context.Context, abi.ChainEpoch, tree.Tree) (abi.TokenAmount, error) { return big.Zero(), nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, chainStore, chainFork, nil), - NetworkVersion: chainFork.GetNetworkVersion(ctx, execEpoch), - NetworkVersionGetter: chainFork.GetNetworkVersion, - Rnd: NewFixedRand(), - BaseFee: big.NewFromGo(&tipset.BaseFee), - Fork: chainFork, - Epoch: execEpoch, - GasPriceSchedule: gas.NewPricesSchedule(mainNetParams.Network.ForkUpgradeParam), - PRoot: preroot, - Bsstore: bs, - SysCallsImpl: syscalls, + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, chainStore, chainFork, nil), + NetworkVersion: chainFork.GetNetworkVersion(ctx, execEpoch), + Rnd: NewFixedRand(), + BaseFee: big.NewFromGo(&tipset.BaseFee), + Fork: chainFork, + Epoch: execEpoch, + GasPriceSchedule: gas.NewPricesSchedule(mainNetParams.Network.ForkUpgradeParam), + PRoot: preroot, + Bsstore: bs, + SysCallsImpl: syscalls, } ) @@ -303,18 +302,17 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP CircSupplyCalculator: func(ctx context.Context, epoch abi.ChainEpoch, tree tree.Tree) (abi.TokenAmount, error) { return params.CircSupply, nil }, - LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, chainStore, chainFork, nil), - NetworkVersion: params.NetworkVersion, - NetworkVersionGetter: chainFork.GetNetworkVersion, - Rnd: params.Rand, - BaseFee: params.BaseFee, - Fork: chainFork, - ActorCodeLoader: &coderLoader, - Epoch: params.Epoch, - GasPriceSchedule: gas.NewPricesSchedule(mainNetParams.Network.ForkUpgradeParam), - PRoot: params.Preroot, - Bsstore: bs, - SysCallsImpl: syscalls, + LookbackStateGetter: vmcontext.LookbackStateGetterForTipset(ctx, chainStore, chainFork, nil), + NetworkVersion: params.NetworkVersion, + Rnd: params.Rand, + BaseFee: params.BaseFee, + Fork: chainFork, + ActorCodeLoader: &coderLoader, + Epoch: params.Epoch, + GasPriceSchedule: gas.NewPricesSchedule(mainNetParams.Network.ForkUpgradeParam), + PRoot: params.Preroot, + Bsstore: bs, + SysCallsImpl: syscalls, } ) diff --git a/tools/gengen/util/generator.go b/tools/gengen/util/generator.go index 803769f4cd..9dd19f3887 100644 --- a/tools/gengen/util/generator.go +++ b/tools/gengen/util/generator.go @@ -95,9 +95,6 @@ func NewGenesisGenerator(bs blockstore.Blockstore) *GenesisGenerator { SysCallsImpl: syscallImpl, Fork: chainFork, } - vmOption.NetworkVersionGetter = func(ctx context.Context, height abi.ChainEpoch) network.Version { - return vmOption.NetworkVersion - } vm, err := vm.NewVM(context.Background(), vmOption) if err != nil { panic(xerrors.Errorf("create state error, should never come here")) From 41f4ea73dd973fbd520ff76466a271b91c0de4f3 Mon Sep 17 00:00:00 2001 From: Caesar Wang Date: Wed, 19 Jan 2022 17:30:17 +0800 Subject: [PATCH 129/167] Feat/dtynn/compatible check for api perms (#4730) * feat: compatible check for api perms * add github-action: basic checks --- .github/workflows/baisc_checks.yml | 36 ++ Makefile | 3 + venus-devtool/compatible/apis/main.go | 1 + venus-devtool/compatible/apis/perm.go | 112 +++++ venus-devtool/util/import.go | 14 + venus-devtool/util/interface.go | 127 ++++++ .../compatible-checks/api-checksum.txt | 421 ++++++++++++++++++ venus-shared/compatible-checks/api-diff.txt | 190 ++++++++ venus-shared/compatible-checks/api-perm.txt | 45 ++ 9 files changed, 949 insertions(+) create mode 100644 .github/workflows/baisc_checks.yml create mode 100644 venus-devtool/compatible/apis/perm.go create mode 100644 venus-devtool/util/import.go create mode 100644 venus-devtool/util/interface.go create mode 100644 venus-shared/compatible-checks/api-perm.txt diff --git a/.github/workflows/baisc_checks.yml b/.github/workflows/baisc_checks.yml new file mode 100644 index 0000000000..d9205d36c0 --- /dev/null +++ b/.github/workflows/baisc_checks.yml @@ -0,0 +1,36 @@ +name: basic checks + +on: ["push", "pull_request"] + +jobs: + check: + runs-on: ubuntu-latest + steps: + - name: dependencies + run: sudo apt install mesa-opencl-icd ocl-icd-opencl-dev gcc git bzr jq pkg-config curl clang build-essential hwloc libhwloc-dev wget -y + + - uses: actions/checkout@v2 + with: + submodules: 'true' + + - name: setup go + uses: actions/setup-go@v2 + with: + go-version: '1.16' + + - name: deps + run: make deps + + - name: build + run: make all + + - name: tests-shared + run: make test-venus-shared + + - name: compatible-checks + run: make compatible-all + + - name: show git status + run: | + git status --porcelain + test -z "$(git status --porcelain)" diff --git a/Makefile b/Makefile index 82e262ea1b..55b0707b30 100644 --- a/Makefile +++ b/Makefile @@ -70,6 +70,9 @@ api-checksum: api-diff: cd venus-devtool && go run ./compatible/apis/*.go diff > ../venus-shared/compatible-checks/api-diff.txt +api-perm: + cd venus-devtool && go run ./compatible/apis/*.go perm > ../venus-shared/compatible-checks/api-perm.txt + compatible-actor: actor-templates actor-sources actor-render actor-templates: diff --git a/venus-devtool/compatible/apis/main.go b/venus-devtool/compatible/apis/main.go index df23ef34c8..5b0fc4cd39 100644 --- a/venus-devtool/compatible/apis/main.go +++ b/venus-devtool/compatible/apis/main.go @@ -16,6 +16,7 @@ func main() { Commands: []*cli.Command{ checksumCmd, diffCmd, + permCmd, }, } diff --git a/venus-devtool/compatible/apis/perm.go b/venus-devtool/compatible/apis/perm.go new file mode 100644 index 0000000000..ebd8232b50 --- /dev/null +++ b/venus-devtool/compatible/apis/perm.go @@ -0,0 +1,112 @@ +package main + +import ( + "fmt" + "log" + "strings" + + "github.com/urfave/cli/v2" + + "github.com/filecoin-project/venus/venus-devtool/util" +) + +var permCmd = &cli.Command{ + Name: "perm", + Flags: []cli.Flag{}, + Action: func(cctx *cli.Context) error { + originMetas, err := parsePermMetas(permOption{ + importPath: "github.com/filecoin-project/lotus/api", + }) + if err != nil { + log.Fatalln("parse lotus api interfaces:", err) + } + + targetMetas, err := parsePermMetas(permOption{ + importPath: "github.com/filecoin-project/venus/venus-shared/api/chain/v1", + }) + if err != nil { + log.Fatalln("parse venus chain api interfaces:", err) + } + + originMap := map[string]permMeta{} + for _, om := range originMetas { + if om.perm != "" { + originMap[om.meth] = om + } + } + + for _, tm := range targetMetas { + om, has := originMap[tm.meth] + if !has { + fmt.Printf("%s.%s: %s <> N/A\n", tm.iface, tm.meth, tm.perm) + continue + } + + if tm.perm != om.perm { + fmt.Printf("%s.%s: %s <> %s.%s: %s\n", tm.iface, tm.meth, tm.perm, om.iface, om.meth, om.perm) + } + } + + fmt.Println() + + return nil + }, +} + +type permOption struct { + importPath string + excluded map[string]struct{} +} + +type permMeta struct { + pkg string + iface string + meth string + perm string +} + +func parsePermMetas(opt permOption) ([]permMeta, error) { + ifaceMetas, err := util.ParseInterfaceMetas(opt.importPath) + if err != nil { + return nil, err + } + + var permMetas []permMeta + for _, iface := range ifaceMetas { + if _, yes := opt.excluded[iface.Name]; yes { + continue + } + + for _, ifMeth := range iface.Defined { + permMetas = append(permMetas, permMeta{ + pkg: opt.importPath, + iface: iface.Name, + meth: ifMeth.Name, + perm: getPerms(ifMeth), + }) + } + } + + return permMetas, nil +} + +func getPerms(m util.InterfaceMethodMeta) string { + permStr := "" + + if cmtNum := len(m.Comments); cmtNum > 0 { + if itemNum := len(m.Comments[cmtNum-1].List); itemNum > 0 { + if strings.HasPrefix(m.Comments[cmtNum-1].List[0].Text, "//") { + permStr = m.Comments[cmtNum-1].List[0].Text[2:] + } + } + } + + for _, piece := range strings.Split(permStr, " ") { + trimmed := strings.TrimSpace(piece) + if strings.HasPrefix(trimmed, "perm:") { + return trimmed[5:] + } + } + + return "" +} diff --git a/venus-devtool/util/import.go b/venus-devtool/util/import.go new file mode 100644 index 0000000000..cbcd115ef8 --- /dev/null +++ b/venus-devtool/util/import.go @@ -0,0 +1,14 @@ +package util + +import ( + "go/build" +) + +func FindLocationForImportPath(path string) (string, error) { + pkg, err := build.Import(path, ".", build.FindOnly) + if err != nil { + return "", err + } + + return pkg.Dir, nil +} diff --git a/venus-devtool/util/interface.go b/venus-devtool/util/interface.go new file mode 100644 index 0000000000..d7ffce6384 --- /dev/null +++ b/venus-devtool/util/interface.go @@ -0,0 +1,127 @@ +package util + +import ( + "go/ast" + "go/parser" + "go/token" + "sort" + "strings" +) + +type InterfaceMeta struct { + Pkg string + File string + Name string + Defined []InterfaceMethodMeta + Included []string +} + +type InterfaceMethodMeta struct { + Name string + Node ast.Node + FuncType *ast.FuncType + Comments []*ast.CommentGroup +} + +type ifaceMetaVisitor struct { + pname string + fname string + comments ast.CommentMap + ifaces []*InterfaceMeta + ifaceIdxes map[string]int +} + +func (iv *ifaceMetaVisitor) Visit(node ast.Node) ast.Visitor { + st, ok := node.(*ast.TypeSpec) + if !ok { + return iv + } + + iface, ok := st.Type.(*ast.InterfaceType) + if !ok { + return iv + } + + ifaceIdx, ok := iv.ifaceIdxes[st.Name.Name] + if !ok { + ifaceIdx = len(iv.ifaces) + iv.ifaces = append(iv.ifaces, &InterfaceMeta{ + Pkg: iv.pname, + File: iv.fname, + Name: st.Name.Name, + }) + } + + ifaceMeta := iv.ifaces[ifaceIdx] + + for _, m := range iface.Methods.List { + switch meth := m.Type.(type) { + case *ast.Ident: + ifaceMeta.Included = append(ifaceMeta.Included, meth.Name) + + case *ast.FuncType: + ifaceMeta.Defined = append(ifaceMeta.Defined, InterfaceMethodMeta{ + Name: m.Names[0].Name, + Node: m, + FuncType: meth, + Comments: iv.comments.Filter(m).Comments(), + }) + } + } + + return iv +} + +func ParseInterfaceMetas(importPath string) ([]*InterfaceMeta, error) { + location, err := FindLocationForImportPath(importPath) + if err != nil { + return nil, err + } + + fset := token.NewFileSet() + pkgs, err := parser.ParseDir(fset, location, nil, parser.AllErrors|parser.ParseComments) + if err != nil { + return nil, err + } + + var metas []*InterfaceMeta + + for pname, pkg := range pkgs { + if strings.HasSuffix(pname, "_test") { + continue + } + + visitor := &ifaceMetaVisitor{ + pname: pname, + ifaceIdxes: map[string]int{}, + } + + for fname, file := range pkg.Files { + visitor.fname = fname + visitor.comments = ast.NewCommentMap(fset, file, file.Comments) + ast.Walk(visitor, file) + } + + metas = append(metas, visitor.ifaces...) + } + + sort.Slice(metas, func(i, j int) bool { + if metas[i].Pkg != metas[j].Pkg { + return metas[i].Pkg < metas[j].Pkg + } + + if metas[i].File != metas[j].File { + return metas[i].File < metas[j].File + } + + return metas[i].Name < metas[j].Name + }) + + for mi := range metas { + sort.Slice(metas[mi].Defined, func(i, j int) bool { + return metas[mi].Defined[i].Name < metas[mi].Defined[j].Name + }) + } + + return metas, nil +} diff --git a/venus-shared/compatible-checks/api-checksum.txt b/venus-shared/compatible-checks/api-checksum.txt index e69de29bb2..7ce0948a9d 100644 --- a/venus-shared/compatible-checks/api-checksum.txt +++ b/venus-shared/compatible-checks/api-checksum.txt @@ -0,0 +1,421 @@ +v0api.FullNode: + AuthNew: In=2, Out=2, CheckSum=248fe5ed43f2e294ea5d71596b9272ac + AuthVerify: In=2, Out=2, CheckSum=c156d52455ed5f2d227e08a518d5f8a1 + BeaconGetEntry: In=2, Out=2, CheckSum=c74f5c0f4039207ea45c11bfe3319c38 + ChainDeleteObj: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 + ChainExport: In=4, Out=2, CheckSum=aaf98926e0ba36ec808a96de76a3cd98 + ChainGetBlock: In=2, Out=2, CheckSum=0d2bba23d84a51413bbbebe218dcbcf9 + ChainGetBlockMessages: In=2, Out=2, CheckSum=944437b34bb952bf3d50aa6415c9e0d3 + ChainGetGenesis: In=1, Out=2, CheckSum=6d1e4c4d8184dc8d645a56278f14cfad + ChainGetMessage: In=2, Out=2, CheckSum=d1c0ae931458a2a7b07de152ca3de558 + ChainGetMessagesInTipset: In=2, Out=2, CheckSum=6c0bfa48ffcacdfa9dbed1b9e23ad88e + ChainGetNode: In=2, Out=2, CheckSum=66a718f5dbb8b0fcddcf761b58744e38 + ChainGetParentMessages: In=2, Out=2, CheckSum=e659caaae75cd643a7100b1c8cc3125a + ChainGetParentReceipts: In=2, Out=2, CheckSum=de820c5da3d8d036d854ce42ea9d85a3 + ChainGetPath: In=3, Out=2, CheckSum=a745af1a69b379493504c432b15839e7 + ChainGetRandomnessFromBeacon: In=5, Out=2, CheckSum=555559ae8c2c861ff4a73cd5f5955b25 + ChainGetRandomnessFromTickets: In=5, Out=2, CheckSum=555559ae8c2c861ff4a73cd5f5955b25 + ChainGetTipSet: In=2, Out=2, CheckSum=854d79b3a35822ab54e7459ad95816ad + ChainGetTipSetByHeight: In=3, Out=2, CheckSum=9831731a08357a0247d802268b57a497 + ChainHasObj: In=2, Out=2, CheckSum=7fe71bcffa1b110db106e0104e98a32f + ChainHead: In=1, Out=2, CheckSum=6d1e4c4d8184dc8d645a56278f14cfad + ChainNotify: In=1, Out=2, CheckSum=9525148e93a5b83600ebfbde4d24f3e9 + ChainReadObj: In=2, Out=2, CheckSum=6fd9244d87bf5d14fb5e79b0dbc0940d + ChainSetHead: In=2, Out=1, CheckSum=cdfe593ac791e823186abb77bfad49a0 + ChainStatObj: In=3, Out=2, CheckSum=9db2a0d97998daaf9c15e7c3d6ffe82d + ChainTipSetWeight: In=2, Out=2, CheckSum=22ac180fa0c583b4036666bfc155fd63 + ClientCalcCommP: In=2, Out=2, CheckSum=f83c6f3b9d823d22dfcd13e5aee9fb6b + ClientCancelDataTransfer: In=4, Out=1, CheckSum=074398536c75e25946c7f709574e0cdc + ClientCancelRetrievalDeal: In=2, Out=1, CheckSum=d289f4c3758ed7d6ab991b2cf569c969 + ClientDataTransferUpdates: In=1, Out=2, CheckSum=2d33b419e4b215c06ab0e8b66b5f8430 + ClientDealPieceCID: In=2, Out=2, CheckSum=93537a844ba6b74ec1ce82c887359a75 + ClientDealSize: In=2, Out=2, CheckSum=cca1dd5f58136af28546bdbdef2f948a + ClientFindData: In=3, Out=2, CheckSum=232da9eb987d92a76b37572c8f44bf53 + ClientGenCar: In=3, Out=1, CheckSum=b8a0c89fc2c7c16464ac968865e9c156 + ClientGetDealInfo: In=2, Out=2, CheckSum=e67f0e7b88aff099976b0f275b601c9c + ClientGetDealStatus: In=2, Out=2, CheckSum=1297eb9ae9a9ed209cfcb5899910f415 + ClientGetDealUpdates: In=1, Out=2, CheckSum=459cb2faa373d8dcf4cf8e33a2854366 + ClientGetRetrievalUpdates: In=1, Out=2, CheckSum=9390e4328ba9fe6c034341d574fd6f3d + ClientHasLocal: In=2, Out=2, CheckSum=7fe71bcffa1b110db106e0104e98a32f + ClientImport: In=2, Out=2, CheckSum=8c5886f6f2eb7b5db886d639c62e5808 + ClientListDataTransfers: In=1, Out=2, CheckSum=aa113d3aaf47f5b34fc947d26d58d001 + ClientListDeals: In=1, Out=2, CheckSum=fddf5a2bf3dd94a5aec97248ff7db918 + ClientListImports: In=1, Out=2, CheckSum=1966c3c721d57e0a728d3b51ba3a61d4 + ClientListRetrievals: In=1, Out=2, CheckSum=d5485e62b97cf31e1880d54808968895 + ClientMinerQueryOffer: In=4, Out=2, CheckSum=f57fabb5f04c1086302b43bd5087b9e2 + ClientQueryAsk: In=3, Out=2, CheckSum=2d06866277cf890ee42baa4bacffb2fc + ClientRemoveImport: In=2, Out=1, CheckSum=a3fcb78bf5bac553baac584941c1771f + ClientRestartDataTransfer: In=4, Out=1, CheckSum=074398536c75e25946c7f709574e0cdc + ClientRetrieve: In=3, Out=1, CheckSum=3b17e80e3a84f40959f87bff6359a49d + ClientRetrieveTryRestartInsufficientFunds: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 + ClientRetrieveWithEvents: In=3, Out=2, CheckSum=56e4fa49192938527c1f089b446f0860 + ClientStartDeal: In=2, Out=2, CheckSum=85256e9ef86dbb8ebeb76097c3eea078 + ClientStatelessDeal: In=2, Out=2, CheckSum=85256e9ef86dbb8ebeb76097c3eea078 + Closing: In=1, Out=2, CheckSum=3e0dae65a2378c12be14cee8a60a3bfe + CreateBackup: In=2, Out=1, CheckSum=7b0679c2c73ab9606a7da21c5251ad19 + Discover: In=1, Out=2, CheckSum=09640e20c6d71c3e96c7a56c8698acc9 + GasEstimateFeeCap: In=4, Out=2, CheckSum=0fcac02de1d21c9ac6e10696a6499eba + GasEstimateGasLimit: In=3, Out=2, CheckSum=4d1bd57eef0ee90d4c2e89f097d0604d + GasEstimateGasPremium: In=5, Out=2, CheckSum=550724ed37e2fdaa64e55147e82214b1 + GasEstimateMessageGas: In=4, Out=2, CheckSum=6ff6179b579feed33897d96429504624 + ID: In=1, Out=2, CheckSum=1695f00523f88afb55c5df6053bf9ee4 + LogAlerts: In=1, Out=2, CheckSum=c9262fa7c93e891ec80868e0b83a2222 + LogList: In=1, Out=2, CheckSum=c6d763b6ec7190283b7c648e735725c0 + LogSetLevel: In=3, Out=1, CheckSum=ffdc3b95db02b9026a12c29d899e0059 + MarketAddBalance: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 + MarketGetReserved: In=2, Out=2, CheckSum=f1426bf8d7a1afdeaae0cd561fbbfbb0 + MarketReleaseFunds: In=3, Out=1, CheckSum=c20c4060f72c1a1ab8176a4936292a1e + MarketReserveFunds: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 + MarketWithdraw: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 + MinerCreateBlock: In=2, Out=2, CheckSum=c8749e2acc2143226c34fdf3965fd4b9 + MinerGetBaseInfo: In=4, Out=2, CheckSum=a9ead3443999aba71e9444c0cd9730a2 + MpoolBatchPush: In=2, Out=2, CheckSum=4f34d25c5ddbe15922545c0c28c40830 + MpoolBatchPushMessage: In=3, Out=2, CheckSum=66b4628bc63c8ca4bc31db0393ade01b + MpoolBatchPushUntrusted: In=2, Out=2, CheckSum=4f34d25c5ddbe15922545c0c28c40830 + MpoolClear: In=2, Out=1, CheckSum=790632b52ba8d2fb863afad93556528c + MpoolGetConfig: In=1, Out=2, CheckSum=b28b0828ec4c43c705feb84536e66aa8 + MpoolGetNonce: In=2, Out=2, CheckSum=2f0992ed1f0be8ff9bee0c3f0a39e1e1 + MpoolPending: In=2, Out=2, CheckSum=867ae9cbeb080683492ec76cc0c1ea7f + MpoolPush: In=2, Out=2, CheckSum=3b29294f39a940d77be58a07e30e8d4b + MpoolPushMessage: In=3, Out=2, CheckSum=97e029b4d408862c42035318e3c21d05 + MpoolPushUntrusted: In=2, Out=2, CheckSum=3b29294f39a940d77be58a07e30e8d4b + MpoolSelect: In=3, Out=2, CheckSum=a524ad1b1c0d7d27b21c69c62e926f9c + MpoolSetConfig: In=2, Out=1, CheckSum=f1ed0cdb9842cfb5176188c281577fba + MpoolSub: In=1, Out=2, CheckSum=337ebc027637bda66141bad6af2f6cc4 + MsigAddApprove: In=7, Out=2, CheckSum=4dbd86148df51d0975f2f5c6adac7c00 + MsigAddCancel: In=6, Out=2, CheckSum=afb744caa58c307fffa99d052c97e9c7 + MsigAddPropose: In=5, Out=2, CheckSum=6d40bd8a8f2563f75402a23915a23000 + MsigApprove: In=4, Out=2, CheckSum=09bc2481f1717ddc5147c1e8eb76bbbc + MsigApproveTxnHash: In=9, Out=2, CheckSum=7715b69bd67ece799d3da978457a2915 + MsigCancel: In=8, Out=2, CheckSum=6a9360010be0849bd6c588dd6759af41 + MsigCreate: In=7, Out=2, CheckSum=ef93a3c107e73884b4073f01da738bce + MsigGetAvailableBalance: In=3, Out=2, CheckSum=a05010da3c73edfba49c3b5d28a216cd + MsigGetPending: In=3, Out=2, CheckSum=895d889866adf330c83b8dffdbd27fac + MsigGetVested: In=4, Out=2, CheckSum=33d14f7f35b833b5b9dd6b2188c84324 + MsigGetVestingSchedule: In=3, Out=2, CheckSum=b9caf183f11d2a8e611b1daea98ad69e + MsigPropose: In=7, Out=2, CheckSum=f297212379eac659948e303e5be88c0b + MsigRemoveSigner: In=5, Out=2, CheckSum=6d40bd8a8f2563f75402a23915a23000 + MsigSwapApprove: In=7, Out=2, CheckSum=17c75be766c59016bc4a4d583b297d2f + MsigSwapCancel: In=6, Out=2, CheckSum=e2222a10bb1cf80d1fdb56be22b07800 + MsigSwapPropose: In=5, Out=2, CheckSum=f207e1bd168bfd4258481aacf03b4ed4 + NetAddrsListen: In=1, Out=2, CheckSum=edb8238a53eb0480f852309ccee11c23 + NetAgentVersion: In=2, Out=2, CheckSum=21c48e39a45af1b545fa3612c5e8d20d + NetAutoNatStatus: In=1, Out=2, CheckSum=05d1ab4460587ed623f3ce1e1f193a83 + NetBandwidthStats: In=1, Out=2, CheckSum=8309e47349b264349eb41a1105c36f14 + NetBandwidthStatsByPeer: In=1, Out=2, CheckSum=c58b4378b7d5bd90ba6e1725b717fade + NetBandwidthStatsByProtocol: In=1, Out=2, CheckSum=53627d49fb1ca70ca88666f0c4764250 + NetBlockAdd: In=2, Out=1, CheckSum=bb826402a0a2406da30862a2c08af435 + NetBlockList: In=1, Out=2, CheckSum=174b57557c7d7487b5b204f961e33abc + NetBlockRemove: In=2, Out=1, CheckSum=bb826402a0a2406da30862a2c08af435 + NetConnect: In=2, Out=1, CheckSum=5258b1ca3f00aec9c2a0d53bb9e78ef7 + NetConnectedness: In=2, Out=2, CheckSum=e489a3544ead801c9121171bdf1f3971 + NetDisconnect: In=2, Out=1, CheckSum=814e6b52918db98c4883832a38cd222b + NetFindPeer: In=2, Out=2, CheckSum=2ffcd1ed349f87c3cc0e2bb1ee2d68c6 + NetPeerInfo: In=2, Out=2, CheckSum=1c030faf779524a321fe8cec305b9f25 + NetPeers: In=1, Out=2, CheckSum=487043eee4cf0ea002d7a6d0a7ff793b + NetPubsubScores: In=1, Out=2, CheckSum=66c7a1061de3d6e11d39ce90692aa885 + PaychAllocateLane: In=2, Out=2, CheckSum=2f0992ed1f0be8ff9bee0c3f0a39e1e1 + PaychAvailableFunds: In=2, Out=2, CheckSum=f40942f65ce181601e7bc49e6378a89c + PaychAvailableFundsByFromTo: In=3, Out=2, CheckSum=829ff29d78db755f3c13ab3259adb32b + PaychCollect: In=2, Out=2, CheckSum=fdb746bab5f269b63dc0256d50570d81 + PaychGet: In=4, Out=2, CheckSum=f7fb571ad0461c404a0789f6b8c38501 + PaychGetWaitReady: In=2, Out=2, CheckSum=59546a25118c9e0dbb3ad569d3ec0c6f + PaychList: In=1, Out=2, CheckSum=566d37a33889023f9f73c632fa4e8279 + PaychNewPayment: In=4, Out=2, CheckSum=8bb33e38d75917df1357fcf071335ba9 + PaychSettle: In=2, Out=2, CheckSum=fdb746bab5f269b63dc0256d50570d81 + PaychStatus: In=2, Out=2, CheckSum=ae911e02219f1412acb95e95a4065478 + PaychVoucherAdd: In=5, Out=2, CheckSum=8abddd426fa4de6362414384cdec101c + PaychVoucherCheckSpendable: In=5, Out=2, CheckSum=ab5f887200e92223e9adb9573f32e23f + PaychVoucherCheckValid: In=3, Out=1, CheckSum=52e8d077109b5410e1dead7e9bf696b0 + PaychVoucherCreate: In=4, Out=2, CheckSum=e5113a58d351abf5cadd77b46f690c2d + PaychVoucherList: In=2, Out=2, CheckSum=55450ef559b971b6894fb3865003b7b4 + PaychVoucherSubmit: In=5, Out=2, CheckSum=158150e9cb2e2d176ee9ba4674d382d9 + Session: In=1, Out=2, CheckSum=cdb04ef6a97114c8f24f456a2e70f1cd + Shutdown: In=1, Out=1, CheckSum=c39be30cc5a8826024fcf4d23e7017d6 + StateAccountKey: In=3, Out=2, CheckSum=9b6f9fdaea5bb22c60772266c418d98f + StateAllMinerFaults: In=3, Out=2, CheckSum=a17e05b21e1ecc8da867e2f76df6c46c + StateCall: In=3, Out=2, CheckSum=b33ab6c7df31d805c256c8ab6691b085 + StateChangedActors: In=3, Out=2, CheckSum=cbc0cd36e495552a6672caab9f839468 + StateCirculatingSupply: In=2, Out=2, CheckSum=22ac180fa0c583b4036666bfc155fd63 + StateCompute: In=4, Out=2, CheckSum=1d429c389354255c7f865f00a59e3888 + StateDealProviderCollateralBounds: In=4, Out=2, CheckSum=5231e44843c0b74a04371e1e7170d4b2 + StateDecodeParams: In=5, Out=2, CheckSum=8c6311be4dc064a657368516c33e1307 + StateGetActor: In=3, Out=2, CheckSum=adcd0bbd36e3ab94f777c7cb3df1fb34 + StateGetRandomnessFromBeacon: In=5, Out=2, CheckSum=b98225c36bf011979dbcad0fb938e659 + StateGetRandomnessFromTickets: In=5, Out=2, CheckSum=b98225c36bf011979dbcad0fb938e659 + StateGetReceipt: In=3, Out=2, CheckSum=03f4f567eaa55a6ccad8b4a4c95b590a + StateListActors: In=2, Out=2, CheckSum=57bcc4526adaf4b0582c0b117d39b042 + StateListMessages: In=4, Out=2, CheckSum=f12ce9e8a127bf320fb0b289a19b4ea6 + StateListMiners: In=2, Out=2, CheckSum=57bcc4526adaf4b0582c0b117d39b042 + StateLookupID: In=3, Out=2, CheckSum=9b6f9fdaea5bb22c60772266c418d98f + StateMarketBalance: In=3, Out=2, CheckSum=bbab976bd25166200f737c94fc970bc7 + StateMarketDeals: In=2, Out=2, CheckSum=38821c8f592f6f56eb985973ac1ffd36 + StateMarketParticipants: In=2, Out=2, CheckSum=acc9019d0b6e389743c6f992350f407c + StateMarketStorageDeal: In=3, Out=2, CheckSum=94af302d39beba9f0ce7648f4118b6aa + StateMinerActiveSectors: In=3, Out=2, CheckSum=bac211cd5a37bfadf156b636ad7b9381 + StateMinerAvailableBalance: In=3, Out=2, CheckSum=a05010da3c73edfba49c3b5d28a216cd + StateMinerDeadlines: In=3, Out=2, CheckSum=5b128c75ba4953740906520cca96b962 + StateMinerFaults: In=3, Out=2, CheckSum=9d26d848f93597964f751b43edd3d476 + StateMinerInfo: In=3, Out=2, CheckSum=0782a05b506c86bcfb47082a6f8e37fc + StateMinerInitialPledgeCollateral: In=4, Out=2, CheckSum=d87787cc5072c480ed580099fc926668 + StateMinerPartitions: In=4, Out=2, CheckSum=b3cba1da3bd87c433cb8f9df7f7edc09 + StateMinerPower: In=3, Out=2, CheckSum=0e70a6360616c25624118181f764d7df + StateMinerPreCommitDepositForPower: In=4, Out=2, CheckSum=d87787cc5072c480ed580099fc926668 + StateMinerProvingDeadline: In=3, Out=2, CheckSum=8c6037a054ad720ecfb3d0c3f4f90fe6 + StateMinerRecoveries: In=3, Out=2, CheckSum=9d26d848f93597964f751b43edd3d476 + StateMinerSectorAllocated: In=4, Out=2, CheckSum=2accd56a9e9196fa1ca85a1d60e19fc2 + StateMinerSectorCount: In=3, Out=2, CheckSum=573483cbcf3ccdd38063b9ce16453dc2 + StateMinerSectors: In=4, Out=2, CheckSum=c04491aa9e0e6e9a743046c60e13683d + StateNetworkName: In=1, Out=2, CheckSum=afb82130640a26dcd9d7010f31c69572 + StateNetworkVersion: In=2, Out=2, CheckSum=47de92e3b59793ade53abd96c347bace + StateReadState: In=3, Out=2, CheckSum=f53f39943eea93d5f3dd64f1389e4c64 + StateReplay: In=3, Out=2, CheckSum=ec89143eb01290212c3ce0032f62c5fc + StateSearchMsg: In=2, Out=2, CheckSum=e4186ab56a9d2e3c99174110e3f697dc + StateSearchMsgLimited: In=3, Out=2, CheckSum=8990ed018d033c44ebb38c0d077bc6d0 + StateSectorExpiration: In=4, Out=2, CheckSum=bb669c8b66b6f74c681b4345c9e4cc8f + StateSectorGetInfo: In=4, Out=2, CheckSum=27a4e36a319274aca9597f105bc438ff + StateSectorPartition: In=4, Out=2, CheckSum=e3743df55a360243a32ac64ce1282c53 + StateSectorPreCommitInfo: In=4, Out=2, CheckSum=40e05fc7142ce524b9a58e8655ce5a01 + StateVMCirculatingSupplyInternal: In=2, Out=2, CheckSum=05c2114e08be095cece55db19e214d2c + StateVerifiedClientStatus: In=3, Out=2, CheckSum=e33ae4cd2315832f2d6f2aa74b68c34e + StateVerifiedRegistryRootKey: In=2, Out=2, CheckSum=5ad3a497ee24e321c780a69b8d2f0936 + StateVerifierStatus: In=3, Out=2, CheckSum=e33ae4cd2315832f2d6f2aa74b68c34e + StateWaitMsg: In=3, Out=2, CheckSum=f997714e2214b7122462163c5e7bc9a2 + StateWaitMsgLimited: In=4, Out=2, CheckSum=0b59c44082d62b85343ca111441315a1 + SyncCheckBad: In=2, Out=2, CheckSum=ba06470da0ca1d6cc2f9ada7f0288a6c + SyncCheckpoint: In=2, Out=1, CheckSum=cdfe593ac791e823186abb77bfad49a0 + SyncIncomingBlocks: In=1, Out=2, CheckSum=f6ad051ba2ce73511f74f9c08032acc3 + SyncMarkBad: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 + SyncState: In=1, Out=2, CheckSum=7004fd3e7bf60990cb1695fa5883d08f + SyncSubmitBlock: In=2, Out=1, CheckSum=04cdc7641df5628e2ef8c90584936142 + SyncUnmarkAllBad: In=1, Out=1, CheckSum=c39be30cc5a8826024fcf4d23e7017d6 + SyncUnmarkBad: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 + SyncValidateTipset: In=2, Out=2, CheckSum=a244b60fe32e540879ec4eeded71136b + Version: In=1, Out=2, CheckSum=0e78a1023c652297e66079f521e11624 + WalletBalance: In=2, Out=2, CheckSum=f1426bf8d7a1afdeaae0cd561fbbfbb0 + WalletDefaultAddress: In=1, Out=2, CheckSum=5591bbacb9b8345a4a07a149c963df55 + WalletDelete: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 + WalletExport: In=2, Out=2, CheckSum=5db217de8a3ec9ecbed4cc583e473991 + WalletHas: In=2, Out=2, CheckSum=9ad76c8c583af5b5a5d0202c0a3fe7f4 + WalletImport: In=2, Out=2, CheckSum=617245aaab0381dc634a2ad50dd440b3 + WalletList: In=1, Out=2, CheckSum=566d37a33889023f9f73c632fa4e8279 + WalletNew: In=2, Out=2, CheckSum=266c59d3ee6f0b3a66e8dbdec099ef06 + WalletSetDefault: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 + WalletSign: In=3, Out=2, CheckSum=b5a8800f8b60b92c4d99e9cb0fcff086 + WalletSignMessage: In=3, Out=2, CheckSum=c9f0ea6123a189cfeab06ce6bdeda7b3 + WalletValidateAddress: In=2, Out=2, CheckSum=610b35f7aa87b32463e5c2a9b4bd3f55 + WalletVerify: In=4, Out=2, CheckSum=9b22231e95efdfb94d9d55038f500636 + +api.FullNode: + AuthNew: In=2, Out=2, CheckSum=248fe5ed43f2e294ea5d71596b9272ac + AuthVerify: In=2, Out=2, CheckSum=c156d52455ed5f2d227e08a518d5f8a1 + BeaconGetEntry: In=2, Out=2, CheckSum=c74f5c0f4039207ea45c11bfe3319c38 + ChainBlockstoreInfo: In=1, Out=2, CheckSum=09640e20c6d71c3e96c7a56c8698acc9 + ChainCheckBlockstore: In=1, Out=1, CheckSum=c39be30cc5a8826024fcf4d23e7017d6 + ChainDeleteObj: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 + ChainExport: In=4, Out=2, CheckSum=aaf98926e0ba36ec808a96de76a3cd98 + ChainGetBlock: In=2, Out=2, CheckSum=0d2bba23d84a51413bbbebe218dcbcf9 + ChainGetBlockMessages: In=2, Out=2, CheckSum=944437b34bb952bf3d50aa6415c9e0d3 + ChainGetGenesis: In=1, Out=2, CheckSum=6d1e4c4d8184dc8d645a56278f14cfad + ChainGetMessage: In=2, Out=2, CheckSum=d1c0ae931458a2a7b07de152ca3de558 + ChainGetMessagesInTipset: In=2, Out=2, CheckSum=6c0bfa48ffcacdfa9dbed1b9e23ad88e + ChainGetNode: In=2, Out=2, CheckSum=66a718f5dbb8b0fcddcf761b58744e38 + ChainGetParentMessages: In=2, Out=2, CheckSum=e659caaae75cd643a7100b1c8cc3125a + ChainGetParentReceipts: In=2, Out=2, CheckSum=de820c5da3d8d036d854ce42ea9d85a3 + ChainGetPath: In=3, Out=2, CheckSum=a745af1a69b379493504c432b15839e7 + ChainGetTipSet: In=2, Out=2, CheckSum=854d79b3a35822ab54e7459ad95816ad + ChainGetTipSetAfterHeight: In=3, Out=2, CheckSum=9831731a08357a0247d802268b57a497 + ChainGetTipSetByHeight: In=3, Out=2, CheckSum=9831731a08357a0247d802268b57a497 + ChainHasObj: In=2, Out=2, CheckSum=7fe71bcffa1b110db106e0104e98a32f + ChainHead: In=1, Out=2, CheckSum=6d1e4c4d8184dc8d645a56278f14cfad + ChainNotify: In=1, Out=2, CheckSum=9525148e93a5b83600ebfbde4d24f3e9 + ChainReadObj: In=2, Out=2, CheckSum=6fd9244d87bf5d14fb5e79b0dbc0940d + ChainSetHead: In=2, Out=1, CheckSum=cdfe593ac791e823186abb77bfad49a0 + ChainStatObj: In=3, Out=2, CheckSum=9db2a0d97998daaf9c15e7c3d6ffe82d + ChainTipSetWeight: In=2, Out=2, CheckSum=22ac180fa0c583b4036666bfc155fd63 + ClientCalcCommP: In=2, Out=2, CheckSum=f83c6f3b9d823d22dfcd13e5aee9fb6b + ClientCancelDataTransfer: In=4, Out=1, CheckSum=074398536c75e25946c7f709574e0cdc + ClientCancelRetrievalDeal: In=2, Out=1, CheckSum=d289f4c3758ed7d6ab991b2cf569c969 + ClientDataTransferUpdates: In=1, Out=2, CheckSum=2d33b419e4b215c06ab0e8b66b5f8430 + ClientDealPieceCID: In=2, Out=2, CheckSum=93537a844ba6b74ec1ce82c887359a75 + ClientDealSize: In=2, Out=2, CheckSum=cca1dd5f58136af28546bdbdef2f948a + ClientExport: In=3, Out=1, CheckSum=77c3a3632e06654aee2dade7aa467433 + ClientFindData: In=3, Out=2, CheckSum=232da9eb987d92a76b37572c8f44bf53 + ClientGenCar: In=3, Out=1, CheckSum=b8a0c89fc2c7c16464ac968865e9c156 + ClientGetDealInfo: In=2, Out=2, CheckSum=e67f0e7b88aff099976b0f275b601c9c + ClientGetDealStatus: In=2, Out=2, CheckSum=1297eb9ae9a9ed209cfcb5899910f415 + ClientGetDealUpdates: In=1, Out=2, CheckSum=459cb2faa373d8dcf4cf8e33a2854366 + ClientGetRetrievalUpdates: In=1, Out=2, CheckSum=9390e4328ba9fe6c034341d574fd6f3d + ClientHasLocal: In=2, Out=2, CheckSum=7fe71bcffa1b110db106e0104e98a32f + ClientImport: In=2, Out=2, CheckSum=8c5886f6f2eb7b5db886d639c62e5808 + ClientListDataTransfers: In=1, Out=2, CheckSum=aa113d3aaf47f5b34fc947d26d58d001 + ClientListDeals: In=1, Out=2, CheckSum=fddf5a2bf3dd94a5aec97248ff7db918 + ClientListImports: In=1, Out=2, CheckSum=1966c3c721d57e0a728d3b51ba3a61d4 + ClientListRetrievals: In=1, Out=2, CheckSum=d5485e62b97cf31e1880d54808968895 + ClientMinerQueryOffer: In=4, Out=2, CheckSum=f57fabb5f04c1086302b43bd5087b9e2 + ClientQueryAsk: In=3, Out=2, CheckSum=2d06866277cf890ee42baa4bacffb2fc + ClientRemoveImport: In=2, Out=1, CheckSum=a3fcb78bf5bac553baac584941c1771f + ClientRestartDataTransfer: In=4, Out=1, CheckSum=074398536c75e25946c7f709574e0cdc + ClientRetrieve: In=2, Out=2, CheckSum=b941d6f05cbec209e2f347b6826717e1 + ClientRetrieveTryRestartInsufficientFunds: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 + ClientRetrieveWait: In=2, Out=1, CheckSum=d289f4c3758ed7d6ab991b2cf569c969 + ClientStartDeal: In=2, Out=2, CheckSum=85256e9ef86dbb8ebeb76097c3eea078 + ClientStatelessDeal: In=2, Out=2, CheckSum=85256e9ef86dbb8ebeb76097c3eea078 + Closing: In=1, Out=2, CheckSum=3e0dae65a2378c12be14cee8a60a3bfe + CreateBackup: In=2, Out=1, CheckSum=7b0679c2c73ab9606a7da21c5251ad19 + Discover: In=1, Out=2, CheckSum=09640e20c6d71c3e96c7a56c8698acc9 + GasEstimateFeeCap: In=4, Out=2, CheckSum=0fcac02de1d21c9ac6e10696a6499eba + GasEstimateGasLimit: In=3, Out=2, CheckSum=4d1bd57eef0ee90d4c2e89f097d0604d + GasEstimateGasPremium: In=5, Out=2, CheckSum=550724ed37e2fdaa64e55147e82214b1 + GasEstimateMessageGas: In=4, Out=2, CheckSum=6ff6179b579feed33897d96429504624 + ID: In=1, Out=2, CheckSum=1695f00523f88afb55c5df6053bf9ee4 + LogAlerts: In=1, Out=2, CheckSum=c9262fa7c93e891ec80868e0b83a2222 + LogList: In=1, Out=2, CheckSum=c6d763b6ec7190283b7c648e735725c0 + LogSetLevel: In=3, Out=1, CheckSum=ffdc3b95db02b9026a12c29d899e0059 + MarketAddBalance: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 + MarketGetReserved: In=2, Out=2, CheckSum=f1426bf8d7a1afdeaae0cd561fbbfbb0 + MarketReleaseFunds: In=3, Out=1, CheckSum=c20c4060f72c1a1ab8176a4936292a1e + MarketReserveFunds: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 + MarketWithdraw: In=4, Out=2, CheckSum=a8810156a1b234f90924c1f966f44538 + MinerCreateBlock: In=2, Out=2, CheckSum=c8749e2acc2143226c34fdf3965fd4b9 + MinerGetBaseInfo: In=4, Out=2, CheckSum=a9ead3443999aba71e9444c0cd9730a2 + MpoolBatchPush: In=2, Out=2, CheckSum=4f34d25c5ddbe15922545c0c28c40830 + MpoolBatchPushMessage: In=3, Out=2, CheckSum=66b4628bc63c8ca4bc31db0393ade01b + MpoolBatchPushUntrusted: In=2, Out=2, CheckSum=4f34d25c5ddbe15922545c0c28c40830 + MpoolCheckMessages: In=2, Out=2, CheckSum=4bf8491c98028f49b05ff0f1d6e3eaf7 + MpoolCheckPendingMessages: In=2, Out=2, CheckSum=f4a139f9278ea6fb2158a05c24c769fb + MpoolCheckReplaceMessages: In=2, Out=2, CheckSum=d8312bb585f0696c77b4d02c84293cdd + MpoolClear: In=2, Out=1, CheckSum=790632b52ba8d2fb863afad93556528c + MpoolGetConfig: In=1, Out=2, CheckSum=b28b0828ec4c43c705feb84536e66aa8 + MpoolGetNonce: In=2, Out=2, CheckSum=2f0992ed1f0be8ff9bee0c3f0a39e1e1 + MpoolPending: In=2, Out=2, CheckSum=867ae9cbeb080683492ec76cc0c1ea7f + MpoolPush: In=2, Out=2, CheckSum=3b29294f39a940d77be58a07e30e8d4b + MpoolPushMessage: In=3, Out=2, CheckSum=97e029b4d408862c42035318e3c21d05 + MpoolPushUntrusted: In=2, Out=2, CheckSum=3b29294f39a940d77be58a07e30e8d4b + MpoolSelect: In=3, Out=2, CheckSum=a524ad1b1c0d7d27b21c69c62e926f9c + MpoolSetConfig: In=2, Out=1, CheckSum=f1ed0cdb9842cfb5176188c281577fba + MpoolSub: In=1, Out=2, CheckSum=337ebc027637bda66141bad6af2f6cc4 + MsigAddApprove: In=7, Out=2, CheckSum=f622ab6c302078342d7834f0c32ddbdb + MsigAddCancel: In=6, Out=2, CheckSum=31b5b364ddd3e12c9d310a9868c6fda2 + MsigAddPropose: In=5, Out=2, CheckSum=801a2539853f3e7206fd87fc4171c40b + MsigApprove: In=4, Out=2, CheckSum=3384d4133b5559461f919c3bdb1dac41 + MsigApproveTxnHash: In=9, Out=2, CheckSum=9a7460af699e6aa82452157078046018 + MsigCancel: In=4, Out=2, CheckSum=3384d4133b5559461f919c3bdb1dac41 + MsigCancelTxnHash: In=8, Out=2, CheckSum=912010a9da971230c20e5503503e33e2 + MsigCreate: In=7, Out=2, CheckSum=3b8196718c58238e8579cd1e2b8368d9 + MsigGetAvailableBalance: In=3, Out=2, CheckSum=a05010da3c73edfba49c3b5d28a216cd + MsigGetPending: In=3, Out=2, CheckSum=895d889866adf330c83b8dffdbd27fac + MsigGetVested: In=4, Out=2, CheckSum=33d14f7f35b833b5b9dd6b2188c84324 + MsigGetVestingSchedule: In=3, Out=2, CheckSum=b9caf183f11d2a8e611b1daea98ad69e + MsigPropose: In=7, Out=2, CheckSum=22d693fea428a547510ddd48222c5f7a + MsigRemoveSigner: In=5, Out=2, CheckSum=801a2539853f3e7206fd87fc4171c40b + MsigSwapApprove: In=7, Out=2, CheckSum=15b73f7c86aa2009ab368b43d96b5485 + MsigSwapCancel: In=6, Out=2, CheckSum=47441127af7eaa6580d48b2daa13fd1d + MsigSwapPropose: In=5, Out=2, CheckSum=2766f47b61843d276e20ab487ac9849a + NetAddrsListen: In=1, Out=2, CheckSum=edb8238a53eb0480f852309ccee11c23 + NetAgentVersion: In=2, Out=2, CheckSum=21c48e39a45af1b545fa3612c5e8d20d + NetAutoNatStatus: In=1, Out=2, CheckSum=05d1ab4460587ed623f3ce1e1f193a83 + NetBandwidthStats: In=1, Out=2, CheckSum=8309e47349b264349eb41a1105c36f14 + NetBandwidthStatsByPeer: In=1, Out=2, CheckSum=c58b4378b7d5bd90ba6e1725b717fade + NetBandwidthStatsByProtocol: In=1, Out=2, CheckSum=53627d49fb1ca70ca88666f0c4764250 + NetBlockAdd: In=2, Out=1, CheckSum=bb826402a0a2406da30862a2c08af435 + NetBlockList: In=1, Out=2, CheckSum=174b57557c7d7487b5b204f961e33abc + NetBlockRemove: In=2, Out=1, CheckSum=bb826402a0a2406da30862a2c08af435 + NetConnect: In=2, Out=1, CheckSum=5258b1ca3f00aec9c2a0d53bb9e78ef7 + NetConnectedness: In=2, Out=2, CheckSum=e489a3544ead801c9121171bdf1f3971 + NetDisconnect: In=2, Out=1, CheckSum=814e6b52918db98c4883832a38cd222b + NetFindPeer: In=2, Out=2, CheckSum=2ffcd1ed349f87c3cc0e2bb1ee2d68c6 + NetPeerInfo: In=2, Out=2, CheckSum=1c030faf779524a321fe8cec305b9f25 + NetPeers: In=1, Out=2, CheckSum=487043eee4cf0ea002d7a6d0a7ff793b + NetPubsubScores: In=1, Out=2, CheckSum=66c7a1061de3d6e11d39ce90692aa885 + NodeStatus: In=2, Out=2, CheckSum=b46530b68171c85301db86c1b7c19824 + PaychAllocateLane: In=2, Out=2, CheckSum=2f0992ed1f0be8ff9bee0c3f0a39e1e1 + PaychAvailableFunds: In=2, Out=2, CheckSum=f40942f65ce181601e7bc49e6378a89c + PaychAvailableFundsByFromTo: In=3, Out=2, CheckSum=829ff29d78db755f3c13ab3259adb32b + PaychCollect: In=2, Out=2, CheckSum=fdb746bab5f269b63dc0256d50570d81 + PaychGet: In=4, Out=2, CheckSum=f7fb571ad0461c404a0789f6b8c38501 + PaychGetWaitReady: In=2, Out=2, CheckSum=59546a25118c9e0dbb3ad569d3ec0c6f + PaychList: In=1, Out=2, CheckSum=566d37a33889023f9f73c632fa4e8279 + PaychNewPayment: In=4, Out=2, CheckSum=8bb33e38d75917df1357fcf071335ba9 + PaychSettle: In=2, Out=2, CheckSum=fdb746bab5f269b63dc0256d50570d81 + PaychStatus: In=2, Out=2, CheckSum=ae911e02219f1412acb95e95a4065478 + PaychVoucherAdd: In=5, Out=2, CheckSum=8abddd426fa4de6362414384cdec101c + PaychVoucherCheckSpendable: In=5, Out=2, CheckSum=ab5f887200e92223e9adb9573f32e23f + PaychVoucherCheckValid: In=3, Out=1, CheckSum=52e8d077109b5410e1dead7e9bf696b0 + PaychVoucherCreate: In=4, Out=2, CheckSum=e5113a58d351abf5cadd77b46f690c2d + PaychVoucherList: In=2, Out=2, CheckSum=55450ef559b971b6894fb3865003b7b4 + PaychVoucherSubmit: In=5, Out=2, CheckSum=158150e9cb2e2d176ee9ba4674d382d9 + Session: In=1, Out=2, CheckSum=cdb04ef6a97114c8f24f456a2e70f1cd + Shutdown: In=1, Out=1, CheckSum=c39be30cc5a8826024fcf4d23e7017d6 + StateAccountKey: In=3, Out=2, CheckSum=9b6f9fdaea5bb22c60772266c418d98f + StateAllMinerFaults: In=3, Out=2, CheckSum=a17e05b21e1ecc8da867e2f76df6c46c + StateCall: In=3, Out=2, CheckSum=b33ab6c7df31d805c256c8ab6691b085 + StateChangedActors: In=3, Out=2, CheckSum=cbc0cd36e495552a6672caab9f839468 + StateCirculatingSupply: In=2, Out=2, CheckSum=22ac180fa0c583b4036666bfc155fd63 + StateCompute: In=4, Out=2, CheckSum=1d429c389354255c7f865f00a59e3888 + StateDealProviderCollateralBounds: In=4, Out=2, CheckSum=5231e44843c0b74a04371e1e7170d4b2 + StateDecodeParams: In=5, Out=2, CheckSum=8c6311be4dc064a657368516c33e1307 + StateEncodeParams: In=4, Out=2, CheckSum=3e1a5390b92b1b69f9be038cd7400e38 + StateGetActor: In=3, Out=2, CheckSum=adcd0bbd36e3ab94f777c7cb3df1fb34 + StateGetRandomnessFromBeacon: In=5, Out=2, CheckSum=b98225c36bf011979dbcad0fb938e659 + StateGetRandomnessFromTickets: In=5, Out=2, CheckSum=b98225c36bf011979dbcad0fb938e659 + StateListActors: In=2, Out=2, CheckSum=57bcc4526adaf4b0582c0b117d39b042 + StateListMessages: In=4, Out=2, CheckSum=f12ce9e8a127bf320fb0b289a19b4ea6 + StateListMiners: In=2, Out=2, CheckSum=57bcc4526adaf4b0582c0b117d39b042 + StateLookupID: In=3, Out=2, CheckSum=9b6f9fdaea5bb22c60772266c418d98f + StateMarketBalance: In=3, Out=2, CheckSum=bbab976bd25166200f737c94fc970bc7 + StateMarketDeals: In=2, Out=2, CheckSum=38821c8f592f6f56eb985973ac1ffd36 + StateMarketParticipants: In=2, Out=2, CheckSum=acc9019d0b6e389743c6f992350f407c + StateMarketStorageDeal: In=3, Out=2, CheckSum=94af302d39beba9f0ce7648f4118b6aa + StateMinerActiveSectors: In=3, Out=2, CheckSum=bac211cd5a37bfadf156b636ad7b9381 + StateMinerAvailableBalance: In=3, Out=2, CheckSum=a05010da3c73edfba49c3b5d28a216cd + StateMinerDeadlines: In=3, Out=2, CheckSum=5b128c75ba4953740906520cca96b962 + StateMinerFaults: In=3, Out=2, CheckSum=9d26d848f93597964f751b43edd3d476 + StateMinerInfo: In=3, Out=2, CheckSum=0782a05b506c86bcfb47082a6f8e37fc + StateMinerInitialPledgeCollateral: In=4, Out=2, CheckSum=d87787cc5072c480ed580099fc926668 + StateMinerPartitions: In=4, Out=2, CheckSum=b3cba1da3bd87c433cb8f9df7f7edc09 + StateMinerPower: In=3, Out=2, CheckSum=0e70a6360616c25624118181f764d7df + StateMinerPreCommitDepositForPower: In=4, Out=2, CheckSum=d87787cc5072c480ed580099fc926668 + StateMinerProvingDeadline: In=3, Out=2, CheckSum=8c6037a054ad720ecfb3d0c3f4f90fe6 + StateMinerRecoveries: In=3, Out=2, CheckSum=9d26d848f93597964f751b43edd3d476 + StateMinerSectorAllocated: In=4, Out=2, CheckSum=2accd56a9e9196fa1ca85a1d60e19fc2 + StateMinerSectorCount: In=3, Out=2, CheckSum=573483cbcf3ccdd38063b9ce16453dc2 + StateMinerSectors: In=4, Out=2, CheckSum=c04491aa9e0e6e9a743046c60e13683d + StateNetworkName: In=1, Out=2, CheckSum=afb82130640a26dcd9d7010f31c69572 + StateNetworkVersion: In=2, Out=2, CheckSum=47de92e3b59793ade53abd96c347bace + StateReadState: In=3, Out=2, CheckSum=f53f39943eea93d5f3dd64f1389e4c64 + StateReplay: In=3, Out=2, CheckSum=ec89143eb01290212c3ce0032f62c5fc + StateSearchMsg: In=5, Out=2, CheckSum=05ad20588933ea6ffa941f47b826708a + StateSectorExpiration: In=4, Out=2, CheckSum=bb669c8b66b6f74c681b4345c9e4cc8f + StateSectorGetInfo: In=4, Out=2, CheckSum=27a4e36a319274aca9597f105bc438ff + StateSectorPartition: In=4, Out=2, CheckSum=e3743df55a360243a32ac64ce1282c53 + StateSectorPreCommitInfo: In=4, Out=2, CheckSum=40e05fc7142ce524b9a58e8655ce5a01 + StateVMCirculatingSupplyInternal: In=2, Out=2, CheckSum=05c2114e08be095cece55db19e214d2c + StateVerifiedClientStatus: In=3, Out=2, CheckSum=e33ae4cd2315832f2d6f2aa74b68c34e + StateVerifiedRegistryRootKey: In=2, Out=2, CheckSum=5ad3a497ee24e321c780a69b8d2f0936 + StateVerifierStatus: In=3, Out=2, CheckSum=e33ae4cd2315832f2d6f2aa74b68c34e + StateWaitMsg: In=5, Out=2, CheckSum=561c18d1417310b5cd35cfffb0b75a00 + SyncCheckBad: In=2, Out=2, CheckSum=ba06470da0ca1d6cc2f9ada7f0288a6c + SyncCheckpoint: In=2, Out=1, CheckSum=cdfe593ac791e823186abb77bfad49a0 + SyncIncomingBlocks: In=1, Out=2, CheckSum=f6ad051ba2ce73511f74f9c08032acc3 + SyncMarkBad: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 + SyncState: In=1, Out=2, CheckSum=7004fd3e7bf60990cb1695fa5883d08f + SyncSubmitBlock: In=2, Out=1, CheckSum=04cdc7641df5628e2ef8c90584936142 + SyncUnmarkAllBad: In=1, Out=1, CheckSum=c39be30cc5a8826024fcf4d23e7017d6 + SyncUnmarkBad: In=2, Out=1, CheckSum=50d40a0afa31dabb8a61693aabea61b7 + SyncValidateTipset: In=2, Out=2, CheckSum=a244b60fe32e540879ec4eeded71136b + Version: In=1, Out=2, CheckSum=0e78a1023c652297e66079f521e11624 + WalletBalance: In=2, Out=2, CheckSum=f1426bf8d7a1afdeaae0cd561fbbfbb0 + WalletDefaultAddress: In=1, Out=2, CheckSum=5591bbacb9b8345a4a07a149c963df55 + WalletDelete: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 + WalletExport: In=2, Out=2, CheckSum=5db217de8a3ec9ecbed4cc583e473991 + WalletHas: In=2, Out=2, CheckSum=9ad76c8c583af5b5a5d0202c0a3fe7f4 + WalletImport: In=2, Out=2, CheckSum=617245aaab0381dc634a2ad50dd440b3 + WalletList: In=1, Out=2, CheckSum=566d37a33889023f9f73c632fa4e8279 + WalletNew: In=2, Out=2, CheckSum=266c59d3ee6f0b3a66e8dbdec099ef06 + WalletSetDefault: In=2, Out=1, CheckSum=98613e8d41d3a2e52b37f97908560bd9 + WalletSign: In=3, Out=2, CheckSum=b5a8800f8b60b92c4d99e9cb0fcff086 + WalletSignMessage: In=3, Out=2, CheckSum=c9f0ea6123a189cfeab06ce6bdeda7b3 + WalletValidateAddress: In=2, Out=2, CheckSum=610b35f7aa87b32463e5c2a9b4bd3f55 + WalletVerify: In=4, Out=2, CheckSum=9b22231e95efdfb94d9d55038f500636 + diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt index e69de29bb2..55da15f9cf 100644 --- a/venus-shared/compatible-checks/api-diff.txt +++ b/venus-shared/compatible-checks/api-diff.txt @@ -0,0 +1,190 @@ +github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.com/filecoin-project/lotus/api.FullNode: + - AuthVerify + + BlockTime + - ChainBlockstoreInfo + - ChainCheckBlockstore + > ChainExport {[func(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []uint8, error) <> func(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []uint8, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - ChainGetGenesis + > ChainGetMessagesInTipset {[func(context.Context, types.TipSetKey) ([]types.MessageCID, error) <> func(context.Context, types.TipSetKey) ([]api.Message, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - ChainGetNode + > ChainGetPath {[func(context.Context, types.TipSetKey, types.TipSetKey) ([]*types.HeadChange, error) <> func(context.Context, types.TipSetKey, types.TipSetKey) ([]*api.HeadChange, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + ChainGetRandomnessFromBeacon + + ChainGetRandomnessFromTickets + + ChainGetReceipts + > ChainGetTipSet {[func(context.Context, types.TipSetKey) (*types.TipSet, error) <> func(context.Context, types.TipSetKey) (*types.TipSet, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > ChainGetTipSetAfterHeight {[func(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) <> func(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > ChainGetTipSetByHeight {[func(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) <> func(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + ChainList + > ChainSetHead {[func(context.Context, types.TipSetKey) error <> func(context.Context, types.TipSetKey) error] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + ChainSyncHandleNewTipSet + > ChainTipSetWeight {[func(context.Context, types.TipSetKey) (big.Int, error) <> func(context.Context, types.TipSetKey) (big.Int, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - ClientCalcCommP + - ClientCancelDataTransfer + - ClientCancelRetrievalDeal + - ClientDataTransferUpdates + - ClientDealPieceCID + - ClientDealSize + - ClientExport + - ClientFindData + - ClientGenCar + - ClientGetDealInfo + - ClientGetDealStatus + - ClientGetDealUpdates + - ClientGetRetrievalUpdates + - ClientHasLocal + - ClientImport + - ClientListDataTransfers + - ClientListDeals + - ClientListImports + - ClientListRetrievals + - ClientMinerQueryOffer + - ClientQueryAsk + - ClientRemoveImport + - ClientRestartDataTransfer + - ClientRetrieve + - ClientRetrieveTryRestartInsufficientFunds + - ClientRetrieveWait + - ClientStartDeal + - ClientStatelessDeal + - Closing + + Concurrent + - CreateBackup + - Discover + + GasBatchEstimateMessageGas + > GasEstimateFeeCap {[func(context.Context, *internal.Message, int64, types.TipSetKey) (big.Int, error) <> func(context.Context, *types.Message, int64, types.TipSetKey) (big.Int, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > GasEstimateGasLimit {[func(context.Context, *internal.Message, types.TipSetKey) (int64, error) <> func(context.Context, *types.Message, types.TipSetKey) (int64, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > GasEstimateGasPremium {[func(context.Context, uint64, address.Address, int64, types.TipSetKey) (big.Int, error) <> func(context.Context, uint64, address.Address, int64, types.TipSetKey) (big.Int, error)] base=func in type: #4 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > GasEstimateMessageGas {[func(context.Context, *internal.Message, *types.MessageSendSpec, types.TipSetKey) (*internal.Message, error) <> func(context.Context, *types.Message, *api.MessageSendSpec, types.TipSetKey) (*types.Message, error)] base=func in type: #2 input; nested={[*types.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[types.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[types.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} + + GetActor + + GetEntry + + GetFullBlock + + GetParentStateRootActor + + HasPassword + - ID + + ListActor + + LockWallet + - LogAlerts + - LogList + - LogSetLevel + - MarketAddBalance + - MarketGetReserved + - MarketReleaseFunds + - MarketReserveFunds + - MarketWithdraw + + MessageWait + > MinerCreateBlock {[func(context.Context, *types.BlockTemplate) (*types.BlockMsg, error) <> func(context.Context, *api.BlockTemplate) (*types.BlockMsg, error)] base=func in type: #1 input; nested={[*types.BlockTemplate <> *api.BlockTemplate] base=pointed type; nested={[types.BlockTemplate <> api.BlockTemplate] base=struct field; nested={[types.BlockTemplate <> api.BlockTemplate] base=exported field type: #1 field named Parents; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}}}}} + > MinerGetBaseInfo {[func(context.Context, address.Address, abi.ChainEpoch, types.TipSetKey) (*types.MiningBaseInfo, error) <> func(context.Context, address.Address, abi.ChainEpoch, types.TipSetKey) (*api.MiningBaseInfo, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > MpoolBatchPushMessage {[func(context.Context, []*internal.Message, *types.MessageSendSpec) ([]*types.SignedMessage, error) <> func(context.Context, []*types.Message, *api.MessageSendSpec) ([]*types.SignedMessage, error)] base=func in type: #2 input; nested={[*types.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[types.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[types.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} + + MpoolDeleteByAdress + > MpoolPending {[func(context.Context, types.TipSetKey) ([]*types.SignedMessage, error) <> func(context.Context, types.TipSetKey) ([]*types.SignedMessage, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + MpoolPublishByAddr + + MpoolPublishMessage + > MpoolPushMessage {[func(context.Context, *internal.Message, *types.MessageSendSpec) (*types.SignedMessage, error) <> func(context.Context, *types.Message, *api.MessageSendSpec) (*types.SignedMessage, error)] base=func in type: #2 input; nested={[*types.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[types.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[types.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} + > MpoolSelect {[func(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) <> func(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + MpoolSelects + - MsigGetAvailableBalance + - MsigGetPending + > MsigGetVested {[func(context.Context, address.Address, types.TipSetKey, types.TipSetKey) (big.Int, error) <> func(context.Context, address.Address, types.TipSetKey, types.TipSetKey) (big.Int, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - MsigGetVestingSchedule + - NetAgentVersion + - NetAutoNatStatus + - NetBandwidthStats + - NetBandwidthStatsByPeer + - NetBandwidthStatsByProtocol + - NetBlockAdd + - NetBlockList + - NetBlockRemove + - NetConnect + - NetConnectedness + - NetDisconnect + - NetFindPeer + - NetPeerInfo + - NetPeers + - NetPubsubScores + + NetworkConnect + + NetworkFindPeer + + NetworkFindProvidersAsync + + NetworkGetBandwidthStats + + NetworkGetClosestPeers + + NetworkGetPeerAddresses + + NetworkGetPeerID + + NetworkPeers + - NodeStatus + + ProtocolParameters + + ResolveToKeyAddr + - Session + + SetConcurrent + + SetPassword + - Shutdown + > StateAccountKey {[func(context.Context, address.Address, types.TipSetKey) (address.Address, error) <> func(context.Context, address.Address, types.TipSetKey) (address.Address, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateAllMinerFaults + > StateCall {[func(context.Context, *internal.Message, types.TipSetKey) (*types.InvocResult, error) <> func(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateChangedActors + > StateCirculatingSupply {[func(context.Context, types.TipSetKey) (big.Int, error) <> func(context.Context, types.TipSetKey) (big.Int, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateCompute + > StateDealProviderCollateralBounds {[func(context.Context, abi.PaddedPieceSize, bool, types.TipSetKey) (types.DealCollateralBounds, error) <> func(context.Context, abi.PaddedPieceSize, bool, types.TipSetKey) (api.DealCollateralBounds, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateDecodeParams + - StateEncodeParams + > StateGetActor {[func(context.Context, address.Address, types.TipSetKey) (*internal.Actor, error) <> func(context.Context, address.Address, types.TipSetKey) (*types.Actor, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateGetRandomnessFromBeacon {[func(context.Context, crypto.DomainSeparationTag, abi.ChainEpoch, []uint8, types.TipSetKey) (abi.Randomness, error) <> func(context.Context, crypto.DomainSeparationTag, abi.ChainEpoch, []uint8, types.TipSetKey) (abi.Randomness, error)] base=func in type: #4 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateGetRandomnessFromTickets {[func(context.Context, crypto.DomainSeparationTag, abi.ChainEpoch, []uint8, types.TipSetKey) (abi.Randomness, error) <> func(context.Context, crypto.DomainSeparationTag, abi.ChainEpoch, []uint8, types.TipSetKey) (abi.Randomness, error)] base=func in type: #4 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateListActors {[func(context.Context, types.TipSetKey) ([]address.Address, error) <> func(context.Context, types.TipSetKey) ([]address.Address, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateListMessages + > StateListMiners {[func(context.Context, types.TipSetKey) ([]address.Address, error) <> func(context.Context, types.TipSetKey) ([]address.Address, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateLookupID {[func(context.Context, address.Address, types.TipSetKey) (address.Address, error) <> func(context.Context, address.Address, types.TipSetKey) (address.Address, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMarketBalance {[func(context.Context, address.Address, types.TipSetKey) (types.MarketBalance, error) <> func(context.Context, address.Address, types.TipSetKey) (api.MarketBalance, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMarketDeals {[func(context.Context, types.TipSetKey) (map[string]types.MarketDeal, error) <> func(context.Context, types.TipSetKey) (map[string]api.MarketDeal, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMarketParticipants {[func(context.Context, types.TipSetKey) (map[string]types.MarketBalance, error) <> func(context.Context, types.TipSetKey) (map[string]api.MarketBalance, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMarketStorageDeal {[func(context.Context, abi.DealID, types.TipSetKey) (*types.MarketDeal, error) <> func(context.Context, abi.DealID, types.TipSetKey) (*api.MarketDeal, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerActiveSectors {[func(context.Context, address.Address, types.TipSetKey) ([]*miner.SectorOnChainInfo, error) <> func(context.Context, address.Address, types.TipSetKey) ([]*miner.SectorOnChainInfo, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerAvailableBalance {[func(context.Context, address.Address, types.TipSetKey) (big.Int, error) <> func(context.Context, address.Address, types.TipSetKey) (big.Int, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerDeadlines {[func(context.Context, address.Address, types.TipSetKey) ([]types.Deadline, error) <> func(context.Context, address.Address, types.TipSetKey) ([]api.Deadline, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerFaults {[func(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error) <> func(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerInfo {[func(context.Context, address.Address, types.TipSetKey) (miner.MinerInfo, error) <> func(context.Context, address.Address, types.TipSetKey) (miner.MinerInfo, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerInitialPledgeCollateral {[func(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (big.Int, error) <> func(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (big.Int, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerPartitions {[func(context.Context, address.Address, uint64, types.TipSetKey) ([]types.Partition, error) <> func(context.Context, address.Address, uint64, types.TipSetKey) ([]api.Partition, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerPower {[func(context.Context, address.Address, types.TipSetKey) (*types.MinerPower, error) <> func(context.Context, address.Address, types.TipSetKey) (*api.MinerPower, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerPreCommitDepositForPower {[func(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (big.Int, error) <> func(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (big.Int, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerProvingDeadline {[func(context.Context, address.Address, types.TipSetKey) (*dline.Info, error) <> func(context.Context, address.Address, types.TipSetKey) (*dline.Info, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerRecoveries {[func(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error) <> func(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerSectorAllocated {[func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (bool, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (bool, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerSectorCount {[func(context.Context, address.Address, types.TipSetKey) (types.MinerSectors, error) <> func(context.Context, address.Address, types.TipSetKey) (api.MinerSectors, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + StateMinerSectorSize + > StateMinerSectors {[func(context.Context, address.Address, *bitfield.BitField, types.TipSetKey) ([]*miner.SectorOnChainInfo, error) <> func(context.Context, address.Address, *bitfield.BitField, types.TipSetKey) ([]*miner.SectorOnChainInfo, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + StateMinerWorkerAddress + > StateNetworkVersion {[func(context.Context, types.TipSetKey) (network.Version, error) <> func(context.Context, types.TipSetKey) (network.Version, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateReadState + - StateReplay + > StateSearchMsg {[func(context.Context, types.TipSetKey, cid.Cid, abi.ChainEpoch, bool) (*types.MsgLookup, error) <> func(context.Context, types.TipSetKey, cid.Cid, abi.ChainEpoch, bool) (*api.MsgLookup, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateSectorExpiration {[func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorExpiration, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorExpiration, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateSectorGetInfo {[func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorOnChainInfo, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorOnChainInfo, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateSectorPartition {[func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorLocation, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorLocation, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateSectorPreCommitInfo {[func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateVMCirculatingSupplyInternal {[func(context.Context, types.TipSetKey) (types.CirculatingSupply, error) <> func(context.Context, types.TipSetKey) (api.CirculatingSupply, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateVerifiedClientStatus {[func(context.Context, address.Address, types.TipSetKey) (*big.Int, error) <> func(context.Context, address.Address, types.TipSetKey) (*big.Int, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateVerifiedRegistryRootKey {[func(context.Context, types.TipSetKey) (address.Address, error) <> func(context.Context, types.TipSetKey) (address.Address, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateVerifierStatus {[func(context.Context, address.Address, types.TipSetKey) (*big.Int, error) <> func(context.Context, address.Address, types.TipSetKey) (*big.Int, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateWaitMsg {[func(context.Context, cid.Cid, uint64, abi.ChainEpoch, bool) (*types.MsgLookup, error) <> func(context.Context, cid.Cid, uint64, abi.ChainEpoch, bool) (*api.MsgLookup, error)] base=func out type: #0 input; nested={[*types.MsgLookup <> *api.MsgLookup] base=pointed type; nested={[types.MsgLookup <> api.MsgLookup] base=struct field; nested={[types.MsgLookup <> api.MsgLookup] base=exported field type: #3 field named TipSet; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}}}}} + - SyncCheckBad + - SyncCheckpoint + - SyncIncomingBlocks + - SyncMarkBad + - SyncUnmarkAllBad + - SyncUnmarkBad + - SyncValidateTipset + + SyncerTracker + + UnLockWallet + + Verify + + VerifyEntry + > Version {[func(context.Context) (types.Version, error) <> func(context.Context) (api.APIVersion, error)] base=func out type: #0 input; nested={[types.Version <> api.APIVersion] base=struct field; nested={[types.Version <> api.APIVersion] base=exported fields count: 2 != 3; nested=nil}}} + + WalletAddresses + - WalletDelete + > WalletExport {[func(context.Context, address.Address, string) (*types.KeyInfo, error) <> func(context.Context, address.Address) (*types.KeyInfo, error)] base=func in num: 3 != 2; nested=nil} + - WalletList + - WalletNew + + WalletNewAddress + > WalletSign {[func(context.Context, address.Address, []uint8, types.MsgMeta) (*crypto.Signature, error) <> func(context.Context, address.Address, []uint8) (*crypto.Signature, error)] base=func in num: 4 != 3; nested=nil} + + WalletState + - WalletValidateAddress + - WalletVerify + diff --git a/venus-shared/compatible-checks/api-perm.txt b/venus-shared/compatible-checks/api-perm.txt new file mode 100644 index 0000000000..18dff3a899 --- /dev/null +++ b/venus-shared/compatible-checks/api-perm.txt @@ -0,0 +1,45 @@ +IActor.ListActor: read <> N/A +IChainInfo.BlockTime: read <> N/A +IChainInfo.ChainGetRandomnessFromBeacon: read <> N/A +IChainInfo.ChainGetRandomnessFromTickets: read <> N/A +IChainInfo.ChainGetReceipts: read <> N/A +IChainInfo.ChainList: read <> N/A +IChainInfo.GetActor: read <> N/A +IChainInfo.GetEntry: read <> N/A +IChainInfo.GetFullBlock: read <> N/A +IChainInfo.GetParentStateRootActor: read <> N/A +IChainInfo.MessageWait: read <> N/A +IChainInfo.ProtocolParameters: read <> N/A +IChainInfo.ResolveToKeyAddr: read <> N/A +IChainInfo.VerifyEntry: read <> N/A +IMinerState.StateMinerSectorSize: read <> N/A +IMinerState.StateMinerWorkerAddress: read <> N/A +IJwtAuthAPI.Verify: read <> N/A +IMessagePool.GasBatchEstimateMessageGas: read <> N/A +IMessagePool.MpoolDeleteByAdress: admin <> N/A +IMessagePool.MpoolPublishByAddr: write <> N/A +IMessagePool.MpoolPublishMessage: write <> N/A +IMessagePool.MpoolSelects: read <> N/A +INetwork.NetworkConnect: read <> N/A +INetwork.NetworkFindPeer: read <> N/A +INetwork.NetworkFindProvidersAsync: read <> N/A +INetwork.NetworkGetBandwidthStats: admin <> N/A +INetwork.NetworkGetClosestPeers: read <> N/A +INetwork.NetworkGetPeerAddresses: admin <> N/A +INetwork.NetworkGetPeerID: admin <> N/A +INetwork.NetworkPeers: read <> N/A +INetwork.Version: read <> Worker.Version: admin +ISyncer.ChainSyncHandleNewTipSet: write <> N/A +ISyncer.Concurrent: read <> N/A +ISyncer.SetConcurrent: admin <> N/A +ISyncer.SyncerTracker: read <> N/A +IWallet.HasPassword: admin <> N/A +IWallet.LockWallet: admin <> N/A +IWallet.SetPassword: admin <> N/A +IWallet.UnLockWallet: admin <> N/A +IWallet.WalletAddresses: admin <> N/A +IWallet.WalletHas: write <> Wallet.WalletHas: admin +IWallet.WalletNewAddress: write <> N/A +IWallet.WalletSign: sign <> Wallet.WalletSign: admin +IWallet.WalletState: admin <> N/A + From 28b90dff54370f8030a16573ece238d03171835e Mon Sep 17 00:00:00 2001 From: zl Date: Wed, 19 Jan 2022 18:35:03 +0800 Subject: [PATCH 130/167] add ci checks for type comtatilble, api/mock api generation, (#4731) and documents generation. --- .github/workflows/baisc_checks.yml | 24 +- Makefile | 4 + venus-shared/api/chain/v0/mock/full.go | 266 ++++++++++---------- venus-shared/api/chain/v1/mock/full.go | 336 ++++++++++++------------- venus-shared/api/v0-api-document.md | 3 +- venus-shared/api/v1-api-document.md | 3 +- 6 files changed, 329 insertions(+), 307 deletions(-) diff --git a/.github/workflows/baisc_checks.yml b/.github/workflows/baisc_checks.yml index d9205d36c0..5379d51a28 100644 --- a/.github/workflows/baisc_checks.yml +++ b/.github/workflows/baisc_checks.yml @@ -28,9 +28,25 @@ jobs: run: make test-venus-shared - name: compatible-checks - run: make compatible-all + run: | + make compatible-all + git --no-pager diff + git --no-pager diff --quiet + + - name: check api docs + run: | + make api-docs + git --no-pager diff + git --no-pager diff --quiet + + - name: check cbor-gen + run: | + make cborgen + git --no-pager diff + git --no-pager diff --quiet - - name: show git status + - name: check mock pai run: | - git status --porcelain - test -z "$(git status --porcelain)" + make mock-api-gen + git --no-pager diff + git --no-pager diff --quiet diff --git a/Makefile b/Makefile index 55b0707b30..06c1439c42 100644 --- a/Makefile +++ b/Makefile @@ -54,6 +54,10 @@ cborgen: gogen: cd venus-shared && go generate ./... +mock-api-gen: + cd ./venus-shared/api/chain/v0 && go run github.com/golang/mock/mockgen -destination=./mock/full.go -package=mock . FullNode + cd ./venus-shared/api/chain/v1 && go run github.com/golang/mock/mockgen -destination=./mock/full.go -package=mock . FullNode + inline-gen: cd venus-devtool && go run ./inline-gen/main.go ../ ./inline-gen/inlinegen-data.json diff --git a/venus-shared/api/chain/v0/mock/full.go b/venus-shared/api/chain/v0/mock/full.go index 76b5edc010..2770abd6d2 100644 --- a/venus-shared/api/chain/v0/mock/full.go +++ b/venus-shared/api/chain/v0/mock/full.go @@ -19,8 +19,8 @@ import ( miner "github.com/filecoin-project/specs-actors/actors/builtin/miner" paych "github.com/filecoin-project/specs-actors/actors/builtin/paych" miner0 "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - "github.com/filecoin-project/venus/venus-shared/types" - chain0 "github.com/filecoin-project/venus/venus-shared/types" + internal "github.com/filecoin-project/venus/venus-shared/internal" + types "github.com/filecoin-project/venus/venus-shared/types" gomock "github.com/golang/mock/gomock" cid "github.com/ipfs/go-cid" metrics "github.com/libp2p/go-libp2p-core/metrics" @@ -67,10 +67,10 @@ func (mr *MockFullNodeMockRecorder) AuthNew(arg0, arg1 interface{}) *gomock.Call } // BeaconGetEntry mocks base method. -func (m *MockFullNode) BeaconGetEntry(arg0 context.Context, arg1 abi.ChainEpoch) (*chain0.BeaconEntry, error) { +func (m *MockFullNode) BeaconGetEntry(arg0 context.Context, arg1 abi.ChainEpoch) (*types.BeaconEntry, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BeaconGetEntry", arg0, arg1) - ret0, _ := ret[0].(*chain0.BeaconEntry) + ret0, _ := ret[0].(*types.BeaconEntry) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -110,7 +110,7 @@ func (mr *MockFullNodeMockRecorder) ChainDeleteObj(arg0, arg1 interface{}) *gomo } // ChainExport mocks base method. -func (m *MockFullNode) ChainExport(arg0 context.Context, arg1 abi.ChainEpoch, arg2 bool, arg3 chain0.TipSetKey) (<-chan []byte, error) { +func (m *MockFullNode) ChainExport(arg0 context.Context, arg1 abi.ChainEpoch, arg2 bool, arg3 types.TipSetKey) (<-chan []byte, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainExport", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(<-chan []byte) @@ -125,10 +125,10 @@ func (mr *MockFullNodeMockRecorder) ChainExport(arg0, arg1, arg2, arg3 interface } // ChainGetBlock mocks base method. -func (m *MockFullNode) ChainGetBlock(arg0 context.Context, arg1 cid.Cid) (*chain0.BlockHeader, error) { +func (m *MockFullNode) ChainGetBlock(arg0 context.Context, arg1 cid.Cid) (*types.BlockHeader, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetBlock", arg0, arg1) - ret0, _ := ret[0].(*chain0.BlockHeader) + ret0, _ := ret[0].(*types.BlockHeader) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -155,10 +155,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetBlockMessages(arg0, arg1 interface{} } // ChainGetMessage mocks base method. -func (m *MockFullNode) ChainGetMessage(arg0 context.Context, arg1 cid.Cid) (*chain0.Message, error) { +func (m *MockFullNode) ChainGetMessage(arg0 context.Context, arg1 cid.Cid) (*internal.Message, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetMessage", arg0, arg1) - ret0, _ := ret[0].(*chain0.Message) + ret0, _ := ret[0].(*internal.Message) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -170,10 +170,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetMessage(arg0, arg1 interface{}) *gom } // ChainGetMessagesInTipset mocks base method. -func (m *MockFullNode) ChainGetMessagesInTipset(arg0 context.Context, arg1 chain0.TipSetKey) ([]types.Message, error) { +func (m *MockFullNode) ChainGetMessagesInTipset(arg0 context.Context, arg1 types.TipSetKey) ([]types.MessageCID, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetMessagesInTipset", arg0, arg1) - ret0, _ := ret[0].([]types.Message) + ret0, _ := ret[0].([]types.MessageCID) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -185,10 +185,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetMessagesInTipset(arg0, arg1 interfac } // ChainGetParentMessages mocks base method. -func (m *MockFullNode) ChainGetParentMessages(arg0 context.Context, arg1 cid.Cid) ([]types.Message, error) { +func (m *MockFullNode) ChainGetParentMessages(arg0 context.Context, arg1 cid.Cid) ([]types.MessageCID, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetParentMessages", arg0, arg1) - ret0, _ := ret[0].([]types.Message) + ret0, _ := ret[0].([]types.MessageCID) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -200,10 +200,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetParentMessages(arg0, arg1 interface{ } // ChainGetParentReceipts mocks base method. -func (m *MockFullNode) ChainGetParentReceipts(arg0 context.Context, arg1 cid.Cid) ([]*chain0.MessageReceipt, error) { +func (m *MockFullNode) ChainGetParentReceipts(arg0 context.Context, arg1 cid.Cid) ([]*types.MessageReceipt, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetParentReceipts", arg0, arg1) - ret0, _ := ret[0].([]*chain0.MessageReceipt) + ret0, _ := ret[0].([]*types.MessageReceipt) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -215,7 +215,7 @@ func (mr *MockFullNodeMockRecorder) ChainGetParentReceipts(arg0, arg1 interface{ } // ChainGetPath mocks base method. -func (m *MockFullNode) ChainGetPath(arg0 context.Context, arg1, arg2 chain0.TipSetKey) ([]*types.HeadChange, error) { +func (m *MockFullNode) ChainGetPath(arg0 context.Context, arg1, arg2 types.TipSetKey) ([]*types.HeadChange, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetPath", arg0, arg1, arg2) ret0, _ := ret[0].([]*types.HeadChange) @@ -230,7 +230,7 @@ func (mr *MockFullNodeMockRecorder) ChainGetPath(arg0, arg1, arg2 interface{}) * } // ChainGetRandomnessFromBeacon mocks base method. -func (m *MockFullNode) ChainGetRandomnessFromBeacon(arg0 context.Context, arg1 chain0.TipSetKey, arg2 crypto.DomainSeparationTag, arg3 abi.ChainEpoch, arg4 []byte) (abi.Randomness, error) { +func (m *MockFullNode) ChainGetRandomnessFromBeacon(arg0 context.Context, arg1 types.TipSetKey, arg2 crypto.DomainSeparationTag, arg3 abi.ChainEpoch, arg4 []byte) (abi.Randomness, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetRandomnessFromBeacon", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(abi.Randomness) @@ -245,7 +245,7 @@ func (mr *MockFullNodeMockRecorder) ChainGetRandomnessFromBeacon(arg0, arg1, arg } // ChainGetRandomnessFromTickets mocks base method. -func (m *MockFullNode) ChainGetRandomnessFromTickets(arg0 context.Context, arg1 chain0.TipSetKey, arg2 crypto.DomainSeparationTag, arg3 abi.ChainEpoch, arg4 []byte) (abi.Randomness, error) { +func (m *MockFullNode) ChainGetRandomnessFromTickets(arg0 context.Context, arg1 types.TipSetKey, arg2 crypto.DomainSeparationTag, arg3 abi.ChainEpoch, arg4 []byte) (abi.Randomness, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetRandomnessFromTickets", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(abi.Randomness) @@ -260,10 +260,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetRandomnessFromTickets(arg0, arg1, ar } // ChainGetReceipts mocks base method. -func (m *MockFullNode) ChainGetReceipts(arg0 context.Context, arg1 cid.Cid) ([]chain0.MessageReceipt, error) { +func (m *MockFullNode) ChainGetReceipts(arg0 context.Context, arg1 cid.Cid) ([]types.MessageReceipt, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetReceipts", arg0, arg1) - ret0, _ := ret[0].([]chain0.MessageReceipt) + ret0, _ := ret[0].([]types.MessageReceipt) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -275,10 +275,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetReceipts(arg0, arg1 interface{}) *go } // ChainGetTipSet mocks base method. -func (m *MockFullNode) ChainGetTipSet(arg0 context.Context, arg1 chain0.TipSetKey) (*chain0.TipSet, error) { +func (m *MockFullNode) ChainGetTipSet(arg0 context.Context, arg1 types.TipSetKey) (*types.TipSet, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetTipSet", arg0, arg1) - ret0, _ := ret[0].(*chain0.TipSet) + ret0, _ := ret[0].(*types.TipSet) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -290,10 +290,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetTipSet(arg0, arg1 interface{}) *gomo } // ChainGetTipSetByHeight mocks base method. -func (m *MockFullNode) ChainGetTipSetByHeight(arg0 context.Context, arg1 abi.ChainEpoch, arg2 chain0.TipSetKey) (*chain0.TipSet, error) { +func (m *MockFullNode) ChainGetTipSetByHeight(arg0 context.Context, arg1 abi.ChainEpoch, arg2 types.TipSetKey) (*types.TipSet, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetTipSetByHeight", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain0.TipSet) + ret0, _ := ret[0].(*types.TipSet) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -320,10 +320,10 @@ func (mr *MockFullNodeMockRecorder) ChainHasObj(arg0, arg1 interface{}) *gomock. } // ChainHead mocks base method. -func (m *MockFullNode) ChainHead(arg0 context.Context) (*chain0.TipSet, error) { +func (m *MockFullNode) ChainHead(arg0 context.Context) (*types.TipSet, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainHead", arg0) - ret0, _ := ret[0].(*chain0.TipSet) + ret0, _ := ret[0].(*types.TipSet) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -335,10 +335,10 @@ func (mr *MockFullNodeMockRecorder) ChainHead(arg0 interface{}) *gomock.Call { } // ChainList mocks base method. -func (m *MockFullNode) ChainList(arg0 context.Context, arg1 chain0.TipSetKey, arg2 int) ([]chain0.TipSetKey, error) { +func (m *MockFullNode) ChainList(arg0 context.Context, arg1 types.TipSetKey, arg2 int) ([]types.TipSetKey, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainList", arg0, arg1, arg2) - ret0, _ := ret[0].([]chain0.TipSetKey) + ret0, _ := ret[0].([]types.TipSetKey) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -380,7 +380,7 @@ func (mr *MockFullNodeMockRecorder) ChainReadObj(arg0, arg1 interface{}) *gomock } // ChainSetHead mocks base method. -func (m *MockFullNode) ChainSetHead(arg0 context.Context, arg1 chain0.TipSetKey) error { +func (m *MockFullNode) ChainSetHead(arg0 context.Context, arg1 types.TipSetKey) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainSetHead", arg0, arg1) ret0, _ := ret[0].(error) @@ -409,7 +409,7 @@ func (mr *MockFullNodeMockRecorder) ChainStatObj(arg0, arg1, arg2 interface{}) * } // ChainSyncHandleNewTipSet mocks base method. -func (m *MockFullNode) ChainSyncHandleNewTipSet(arg0 context.Context, arg1 *chain0.ChainInfo) error { +func (m *MockFullNode) ChainSyncHandleNewTipSet(arg0 context.Context, arg1 *types.ChainInfo) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainSyncHandleNewTipSet", arg0, arg1) ret0, _ := ret[0].(error) @@ -423,7 +423,7 @@ func (mr *MockFullNodeMockRecorder) ChainSyncHandleNewTipSet(arg0, arg1 interfac } // ChainTipSetWeight mocks base method. -func (m *MockFullNode) ChainTipSetWeight(arg0 context.Context, arg1 chain0.TipSetKey) (big.Int, error) { +func (m *MockFullNode) ChainTipSetWeight(arg0 context.Context, arg1 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainTipSetWeight", arg0, arg1) ret0, _ := ret[0].(big.Int) @@ -452,7 +452,7 @@ func (mr *MockFullNodeMockRecorder) Concurrent(arg0 interface{}) *gomock.Call { } // GasBatchEstimateMessageGas mocks base method. -func (m *MockFullNode) GasBatchEstimateMessageGas(arg0 context.Context, arg1 []*types.EstimateMessage, arg2 uint64, arg3 chain0.TipSetKey) ([]*types.EstimateResult, error) { +func (m *MockFullNode) GasBatchEstimateMessageGas(arg0 context.Context, arg1 []*types.EstimateMessage, arg2 uint64, arg3 types.TipSetKey) ([]*types.EstimateResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GasBatchEstimateMessageGas", arg0, arg1, arg2, arg3) ret0, _ := ret[0].([]*types.EstimateResult) @@ -467,7 +467,7 @@ func (mr *MockFullNodeMockRecorder) GasBatchEstimateMessageGas(arg0, arg1, arg2, } // GasEstimateFeeCap mocks base method. -func (m *MockFullNode) GasEstimateFeeCap(arg0 context.Context, arg1 *chain0.Message, arg2 int64, arg3 chain0.TipSetKey) (big.Int, error) { +func (m *MockFullNode) GasEstimateFeeCap(arg0 context.Context, arg1 *internal.Message, arg2 int64, arg3 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GasEstimateFeeCap", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(big.Int) @@ -482,7 +482,7 @@ func (mr *MockFullNodeMockRecorder) GasEstimateFeeCap(arg0, arg1, arg2, arg3 int } // GasEstimateGasLimit mocks base method. -func (m *MockFullNode) GasEstimateGasLimit(arg0 context.Context, arg1 *chain0.Message, arg2 chain0.TipSetKey) (int64, error) { +func (m *MockFullNode) GasEstimateGasLimit(arg0 context.Context, arg1 *internal.Message, arg2 types.TipSetKey) (int64, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GasEstimateGasLimit", arg0, arg1, arg2) ret0, _ := ret[0].(int64) @@ -497,7 +497,7 @@ func (mr *MockFullNodeMockRecorder) GasEstimateGasLimit(arg0, arg1, arg2 interfa } // GasEstimateGasPremium mocks base method. -func (m *MockFullNode) GasEstimateGasPremium(arg0 context.Context, arg1 uint64, arg2 address.Address, arg3 int64, arg4 chain0.TipSetKey) (big.Int, error) { +func (m *MockFullNode) GasEstimateGasPremium(arg0 context.Context, arg1 uint64, arg2 address.Address, arg3 int64, arg4 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GasEstimateGasPremium", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(big.Int) @@ -512,10 +512,10 @@ func (mr *MockFullNodeMockRecorder) GasEstimateGasPremium(arg0, arg1, arg2, arg3 } // GasEstimateMessageGas mocks base method. -func (m *MockFullNode) GasEstimateMessageGas(arg0 context.Context, arg1 *chain0.Message, arg2 *types.MessageSendSpec, arg3 chain0.TipSetKey) (*chain0.Message, error) { +func (m *MockFullNode) GasEstimateMessageGas(arg0 context.Context, arg1 *internal.Message, arg2 *types.MessageSendSpec, arg3 types.TipSetKey) (*internal.Message, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GasEstimateMessageGas", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain0.Message) + ret0, _ := ret[0].(*internal.Message) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -527,10 +527,10 @@ func (mr *MockFullNodeMockRecorder) GasEstimateMessageGas(arg0, arg1, arg2, arg3 } // GetActor mocks base method. -func (m *MockFullNode) GetActor(arg0 context.Context, arg1 address.Address) (*chain0.Actor, error) { +func (m *MockFullNode) GetActor(arg0 context.Context, arg1 address.Address) (*internal.Actor, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetActor", arg0, arg1) - ret0, _ := ret[0].(*chain0.Actor) + ret0, _ := ret[0].(*internal.Actor) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -542,10 +542,10 @@ func (mr *MockFullNodeMockRecorder) GetActor(arg0, arg1 interface{}) *gomock.Cal } // GetEntry mocks base method. -func (m *MockFullNode) GetEntry(arg0 context.Context, arg1 abi.ChainEpoch, arg2 uint64) (*chain0.BeaconEntry, error) { +func (m *MockFullNode) GetEntry(arg0 context.Context, arg1 abi.ChainEpoch, arg2 uint64) (*types.BeaconEntry, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetEntry", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain0.BeaconEntry) + ret0, _ := ret[0].(*types.BeaconEntry) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -557,10 +557,10 @@ func (mr *MockFullNodeMockRecorder) GetEntry(arg0, arg1, arg2 interface{}) *gomo } // GetFullBlock mocks base method. -func (m *MockFullNode) GetFullBlock(arg0 context.Context, arg1 cid.Cid) (*chain0.FullBlock, error) { +func (m *MockFullNode) GetFullBlock(arg0 context.Context, arg1 cid.Cid) (*types.FullBlock, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetFullBlock", arg0, arg1) - ret0, _ := ret[0].(*chain0.FullBlock) + ret0, _ := ret[0].(*types.FullBlock) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -572,10 +572,10 @@ func (mr *MockFullNodeMockRecorder) GetFullBlock(arg0, arg1 interface{}) *gomock } // GetParentStateRootActor mocks base method. -func (m *MockFullNode) GetParentStateRootActor(arg0 context.Context, arg1 *chain0.TipSet, arg2 address.Address) (*chain0.Actor, error) { +func (m *MockFullNode) GetParentStateRootActor(arg0 context.Context, arg1 *types.TipSet, arg2 address.Address) (*internal.Actor, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetParentStateRootActor", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain0.Actor) + ret0, _ := ret[0].(*internal.Actor) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -601,10 +601,10 @@ func (mr *MockFullNodeMockRecorder) HasPassword(arg0 interface{}) *gomock.Call { } // ListActor mocks base method. -func (m *MockFullNode) ListActor(arg0 context.Context) (map[address.Address]*chain0.Actor, error) { +func (m *MockFullNode) ListActor(arg0 context.Context) (map[address.Address]*internal.Actor, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListActor", arg0) - ret0, _ := ret[0].(map[address.Address]*chain0.Actor) + ret0, _ := ret[0].(map[address.Address]*internal.Actor) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -645,10 +645,10 @@ func (mr *MockFullNodeMockRecorder) MessageWait(arg0, arg1, arg2, arg3 interface } // MinerCreateBlock mocks base method. -func (m *MockFullNode) MinerCreateBlock(arg0 context.Context, arg1 *types.BlockTemplate) (*chain0.BlockMsg, error) { +func (m *MockFullNode) MinerCreateBlock(arg0 context.Context, arg1 *types.BlockTemplate) (*types.BlockMsg, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MinerCreateBlock", arg0, arg1) - ret0, _ := ret[0].(*chain0.BlockMsg) + ret0, _ := ret[0].(*types.BlockMsg) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -660,7 +660,7 @@ func (mr *MockFullNodeMockRecorder) MinerCreateBlock(arg0, arg1 interface{}) *go } // MinerGetBaseInfo mocks base method. -func (m *MockFullNode) MinerGetBaseInfo(arg0 context.Context, arg1 address.Address, arg2 abi.ChainEpoch, arg3 chain0.TipSetKey) (*types.MiningBaseInfo, error) { +func (m *MockFullNode) MinerGetBaseInfo(arg0 context.Context, arg1 address.Address, arg2 abi.ChainEpoch, arg3 types.TipSetKey) (*types.MiningBaseInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MinerGetBaseInfo", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*types.MiningBaseInfo) @@ -675,7 +675,7 @@ func (mr *MockFullNodeMockRecorder) MinerGetBaseInfo(arg0, arg1, arg2, arg3 inte } // MpoolBatchPush mocks base method. -func (m *MockFullNode) MpoolBatchPush(arg0 context.Context, arg1 []*chain0.SignedMessage) ([]cid.Cid, error) { +func (m *MockFullNode) MpoolBatchPush(arg0 context.Context, arg1 []*types.SignedMessage) ([]cid.Cid, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolBatchPush", arg0, arg1) ret0, _ := ret[0].([]cid.Cid) @@ -690,10 +690,10 @@ func (mr *MockFullNodeMockRecorder) MpoolBatchPush(arg0, arg1 interface{}) *gomo } // MpoolBatchPushMessage mocks base method. -func (m *MockFullNode) MpoolBatchPushMessage(arg0 context.Context, arg1 []*chain0.Message, arg2 *types.MessageSendSpec) ([]*chain0.SignedMessage, error) { +func (m *MockFullNode) MpoolBatchPushMessage(arg0 context.Context, arg1 []*internal.Message, arg2 *types.MessageSendSpec) ([]*types.SignedMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolBatchPushMessage", arg0, arg1, arg2) - ret0, _ := ret[0].([]*chain0.SignedMessage) + ret0, _ := ret[0].([]*types.SignedMessage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -705,7 +705,7 @@ func (mr *MockFullNodeMockRecorder) MpoolBatchPushMessage(arg0, arg1, arg2 inter } // MpoolBatchPushUntrusted mocks base method. -func (m *MockFullNode) MpoolBatchPushUntrusted(arg0 context.Context, arg1 []*chain0.SignedMessage) ([]cid.Cid, error) { +func (m *MockFullNode) MpoolBatchPushUntrusted(arg0 context.Context, arg1 []*types.SignedMessage) ([]cid.Cid, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolBatchPushUntrusted", arg0, arg1) ret0, _ := ret[0].([]cid.Cid) @@ -748,10 +748,10 @@ func (mr *MockFullNodeMockRecorder) MpoolDeleteByAdress(arg0, arg1 interface{}) } // MpoolGetConfig mocks base method. -func (m *MockFullNode) MpoolGetConfig(arg0 context.Context) (*chain0.MpoolConfig, error) { +func (m *MockFullNode) MpoolGetConfig(arg0 context.Context) (*types.MpoolConfig, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolGetConfig", arg0) - ret0, _ := ret[0].(*chain0.MpoolConfig) + ret0, _ := ret[0].(*types.MpoolConfig) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -778,10 +778,10 @@ func (mr *MockFullNodeMockRecorder) MpoolGetNonce(arg0, arg1 interface{}) *gomoc } // MpoolPending mocks base method. -func (m *MockFullNode) MpoolPending(arg0 context.Context, arg1 chain0.TipSetKey) ([]*chain0.SignedMessage, error) { +func (m *MockFullNode) MpoolPending(arg0 context.Context, arg1 types.TipSetKey) ([]*types.SignedMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolPending", arg0, arg1) - ret0, _ := ret[0].([]*chain0.SignedMessage) + ret0, _ := ret[0].([]*types.SignedMessage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -807,7 +807,7 @@ func (mr *MockFullNodeMockRecorder) MpoolPublishByAddr(arg0, arg1 interface{}) * } // MpoolPublishMessage mocks base method. -func (m *MockFullNode) MpoolPublishMessage(arg0 context.Context, arg1 *chain0.SignedMessage) error { +func (m *MockFullNode) MpoolPublishMessage(arg0 context.Context, arg1 *types.SignedMessage) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolPublishMessage", arg0, arg1) ret0, _ := ret[0].(error) @@ -821,7 +821,7 @@ func (mr *MockFullNodeMockRecorder) MpoolPublishMessage(arg0, arg1 interface{}) } // MpoolPush mocks base method. -func (m *MockFullNode) MpoolPush(arg0 context.Context, arg1 *chain0.SignedMessage) (cid.Cid, error) { +func (m *MockFullNode) MpoolPush(arg0 context.Context, arg1 *types.SignedMessage) (cid.Cid, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolPush", arg0, arg1) ret0, _ := ret[0].(cid.Cid) @@ -836,10 +836,10 @@ func (mr *MockFullNodeMockRecorder) MpoolPush(arg0, arg1 interface{}) *gomock.Ca } // MpoolPushMessage mocks base method. -func (m *MockFullNode) MpoolPushMessage(arg0 context.Context, arg1 *chain0.Message, arg2 *types.MessageSendSpec) (*chain0.SignedMessage, error) { +func (m *MockFullNode) MpoolPushMessage(arg0 context.Context, arg1 *internal.Message, arg2 *types.MessageSendSpec) (*types.SignedMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolPushMessage", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain0.SignedMessage) + ret0, _ := ret[0].(*types.SignedMessage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -851,7 +851,7 @@ func (mr *MockFullNodeMockRecorder) MpoolPushMessage(arg0, arg1, arg2 interface{ } // MpoolPushUntrusted mocks base method. -func (m *MockFullNode) MpoolPushUntrusted(arg0 context.Context, arg1 *chain0.SignedMessage) (cid.Cid, error) { +func (m *MockFullNode) MpoolPushUntrusted(arg0 context.Context, arg1 *types.SignedMessage) (cid.Cid, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolPushUntrusted", arg0, arg1) ret0, _ := ret[0].(cid.Cid) @@ -866,10 +866,10 @@ func (mr *MockFullNodeMockRecorder) MpoolPushUntrusted(arg0, arg1 interface{}) * } // MpoolSelect mocks base method. -func (m *MockFullNode) MpoolSelect(arg0 context.Context, arg1 chain0.TipSetKey, arg2 float64) ([]*chain0.SignedMessage, error) { +func (m *MockFullNode) MpoolSelect(arg0 context.Context, arg1 types.TipSetKey, arg2 float64) ([]*types.SignedMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolSelect", arg0, arg1, arg2) - ret0, _ := ret[0].([]*chain0.SignedMessage) + ret0, _ := ret[0].([]*types.SignedMessage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -881,10 +881,10 @@ func (mr *MockFullNodeMockRecorder) MpoolSelect(arg0, arg1, arg2 interface{}) *g } // MpoolSelects mocks base method. -func (m *MockFullNode) MpoolSelects(arg0 context.Context, arg1 chain0.TipSetKey, arg2 []float64) ([][]*chain0.SignedMessage, error) { +func (m *MockFullNode) MpoolSelects(arg0 context.Context, arg1 types.TipSetKey, arg2 []float64) ([][]*types.SignedMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolSelects", arg0, arg1, arg2) - ret0, _ := ret[0].([][]*chain0.SignedMessage) + ret0, _ := ret[0].([][]*types.SignedMessage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -896,7 +896,7 @@ func (mr *MockFullNodeMockRecorder) MpoolSelects(arg0, arg1, arg2 interface{}) * } // MpoolSetConfig mocks base method. -func (m *MockFullNode) MpoolSetConfig(arg0 context.Context, arg1 *chain0.MpoolConfig) error { +func (m *MockFullNode) MpoolSetConfig(arg0 context.Context, arg1 *types.MpoolConfig) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolSetConfig", arg0, arg1) ret0, _ := ret[0].(error) @@ -910,10 +910,10 @@ func (mr *MockFullNodeMockRecorder) MpoolSetConfig(arg0, arg1 interface{}) *gomo } // MpoolSub mocks base method. -func (m *MockFullNode) MpoolSub(arg0 context.Context) (<-chan chain0.MpoolUpdate, error) { +func (m *MockFullNode) MpoolSub(arg0 context.Context) (<-chan types.MpoolUpdate, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolSub", arg0) - ret0, _ := ret[0].(<-chan chain0.MpoolUpdate) + ret0, _ := ret[0].(<-chan types.MpoolUpdate) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1045,7 +1045,7 @@ func (mr *MockFullNodeMockRecorder) MsigCreate(arg0, arg1, arg2, arg3, arg4, arg } // MsigGetVested mocks base method. -func (m *MockFullNode) MsigGetVested(arg0 context.Context, arg1 address.Address, arg2, arg3 chain0.TipSetKey) (big.Int, error) { +func (m *MockFullNode) MsigGetVested(arg0 context.Context, arg1 address.Address, arg2, arg3 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigGetVested", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(big.Int) @@ -1150,10 +1150,10 @@ func (mr *MockFullNodeMockRecorder) NetAddrsListen(arg0 interface{}) *gomock.Cal } // NetworkConnect mocks base method. -func (m *MockFullNode) NetworkConnect(arg0 context.Context, arg1 []string) (<-chan chain0.ConnectionResult, error) { +func (m *MockFullNode) NetworkConnect(arg0 context.Context, arg1 []string) (<-chan types.ConnectionResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NetworkConnect", arg0, arg1) - ret0, _ := ret[0].(<-chan chain0.ConnectionResult) + ret0, _ := ret[0].(<-chan types.ConnectionResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1251,10 +1251,10 @@ func (mr *MockFullNodeMockRecorder) NetworkGetPeerID(arg0 interface{}) *gomock.C } // NetworkPeers mocks base method. -func (m *MockFullNode) NetworkPeers(arg0 context.Context, arg1, arg2, arg3 bool) (*chain0.SwarmConnInfos, error) { +func (m *MockFullNode) NetworkPeers(arg0 context.Context, arg1, arg2, arg3 bool) (*types.SwarmConnInfos, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NetworkPeers", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain0.SwarmConnInfos) + ret0, _ := ret[0].(*types.SwarmConnInfos) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1326,10 +1326,10 @@ func (mr *MockFullNodeMockRecorder) PaychCollect(arg0, arg1 interface{}) *gomock } // PaychGet mocks base method. -func (m *MockFullNode) PaychGet(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int) (*chain0.ChannelInfo, error) { +func (m *MockFullNode) PaychGet(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int) (*types.ChannelInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychGet", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain0.ChannelInfo) + ret0, _ := ret[0].(*types.ChannelInfo) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1371,10 +1371,10 @@ func (mr *MockFullNodeMockRecorder) PaychList(arg0 interface{}) *gomock.Call { } // PaychNewPayment mocks base method. -func (m *MockFullNode) PaychNewPayment(arg0 context.Context, arg1, arg2 address.Address, arg3 []chain0.VoucherSpec) (*chain0.PaymentInfo, error) { +func (m *MockFullNode) PaychNewPayment(arg0 context.Context, arg1, arg2 address.Address, arg3 []types.VoucherSpec) (*types.PaymentInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychNewPayment", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain0.PaymentInfo) + ret0, _ := ret[0].(*types.PaymentInfo) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1401,10 +1401,10 @@ func (mr *MockFullNodeMockRecorder) PaychSettle(arg0, arg1 interface{}) *gomock. } // PaychStatus mocks base method. -func (m *MockFullNode) PaychStatus(arg0 context.Context, arg1 address.Address) (*chain0.Status, error) { +func (m *MockFullNode) PaychStatus(arg0 context.Context, arg1 address.Address) (*types.Status, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychStatus", arg0, arg1) - ret0, _ := ret[0].(*chain0.Status) + ret0, _ := ret[0].(*types.Status) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1460,10 +1460,10 @@ func (mr *MockFullNodeMockRecorder) PaychVoucherCheckValid(arg0, arg1, arg2 inte } // PaychVoucherCreate mocks base method. -func (m *MockFullNode) PaychVoucherCreate(arg0 context.Context, arg1 address.Address, arg2 big.Int, arg3 uint64) (*chain0.VoucherCreateResult, error) { +func (m *MockFullNode) PaychVoucherCreate(arg0 context.Context, arg1 address.Address, arg2 big.Int, arg3 uint64) (*types.VoucherCreateResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychVoucherCreate", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain0.VoucherCreateResult) + ret0, _ := ret[0].(*types.VoucherCreateResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1520,7 +1520,7 @@ func (mr *MockFullNodeMockRecorder) ProtocolParameters(arg0 interface{}) *gomock } // ResolveToKeyAddr mocks base method. -func (m *MockFullNode) ResolveToKeyAddr(arg0 context.Context, arg1 address.Address, arg2 *chain0.TipSet) (address.Address, error) { +func (m *MockFullNode) ResolveToKeyAddr(arg0 context.Context, arg1 address.Address, arg2 *types.TipSet) (address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ResolveToKeyAddr", arg0, arg1, arg2) ret0, _ := ret[0].(address.Address) @@ -1563,7 +1563,7 @@ func (mr *MockFullNodeMockRecorder) SetPassword(arg0, arg1 interface{}) *gomock. } // StateAccountKey mocks base method. -func (m *MockFullNode) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (address.Address, error) { +func (m *MockFullNode) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateAccountKey", arg0, arg1, arg2) ret0, _ := ret[0].(address.Address) @@ -1578,7 +1578,7 @@ func (mr *MockFullNodeMockRecorder) StateAccountKey(arg0, arg1, arg2 interface{} } // StateCall mocks base method. -func (m *MockFullNode) StateCall(arg0 context.Context, arg1 *chain0.Message, arg2 chain0.TipSetKey) (*types.InvocResult, error) { +func (m *MockFullNode) StateCall(arg0 context.Context, arg1 *internal.Message, arg2 types.TipSetKey) (*types.InvocResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateCall", arg0, arg1, arg2) ret0, _ := ret[0].(*types.InvocResult) @@ -1593,7 +1593,7 @@ func (mr *MockFullNodeMockRecorder) StateCall(arg0, arg1, arg2 interface{}) *gom } // StateCirculatingSupply mocks base method. -func (m *MockFullNode) StateCirculatingSupply(arg0 context.Context, arg1 chain0.TipSetKey) (big.Int, error) { +func (m *MockFullNode) StateCirculatingSupply(arg0 context.Context, arg1 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateCirculatingSupply", arg0, arg1) ret0, _ := ret[0].(big.Int) @@ -1608,7 +1608,7 @@ func (mr *MockFullNodeMockRecorder) StateCirculatingSupply(arg0, arg1 interface{ } // StateDealProviderCollateralBounds mocks base method. -func (m *MockFullNode) StateDealProviderCollateralBounds(arg0 context.Context, arg1 abi.PaddedPieceSize, arg2 bool, arg3 chain0.TipSetKey) (types.DealCollateralBounds, error) { +func (m *MockFullNode) StateDealProviderCollateralBounds(arg0 context.Context, arg1 abi.PaddedPieceSize, arg2 bool, arg3 types.TipSetKey) (types.DealCollateralBounds, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateDealProviderCollateralBounds", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(types.DealCollateralBounds) @@ -1623,10 +1623,10 @@ func (mr *MockFullNodeMockRecorder) StateDealProviderCollateralBounds(arg0, arg1 } // StateGetActor mocks base method. -func (m *MockFullNode) StateGetActor(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*chain0.Actor, error) { +func (m *MockFullNode) StateGetActor(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*internal.Actor, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateGetActor", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain0.Actor) + ret0, _ := ret[0].(*internal.Actor) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1638,10 +1638,10 @@ func (mr *MockFullNodeMockRecorder) StateGetActor(arg0, arg1, arg2 interface{}) } // StateGetReceipt mocks base method. -func (m *MockFullNode) StateGetReceipt(arg0 context.Context, arg1 cid.Cid, arg2 chain0.TipSetKey) (*chain0.MessageReceipt, error) { +func (m *MockFullNode) StateGetReceipt(arg0 context.Context, arg1 cid.Cid, arg2 types.TipSetKey) (*types.MessageReceipt, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateGetReceipt", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain0.MessageReceipt) + ret0, _ := ret[0].(*types.MessageReceipt) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1653,7 +1653,7 @@ func (mr *MockFullNodeMockRecorder) StateGetReceipt(arg0, arg1, arg2 interface{} } // StateListActors mocks base method. -func (m *MockFullNode) StateListActors(arg0 context.Context, arg1 chain0.TipSetKey) ([]address.Address, error) { +func (m *MockFullNode) StateListActors(arg0 context.Context, arg1 types.TipSetKey) ([]address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateListActors", arg0, arg1) ret0, _ := ret[0].([]address.Address) @@ -1668,7 +1668,7 @@ func (mr *MockFullNodeMockRecorder) StateListActors(arg0, arg1 interface{}) *gom } // StateListMiners mocks base method. -func (m *MockFullNode) StateListMiners(arg0 context.Context, arg1 chain0.TipSetKey) ([]address.Address, error) { +func (m *MockFullNode) StateListMiners(arg0 context.Context, arg1 types.TipSetKey) ([]address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateListMiners", arg0, arg1) ret0, _ := ret[0].([]address.Address) @@ -1683,7 +1683,7 @@ func (mr *MockFullNodeMockRecorder) StateListMiners(arg0, arg1 interface{}) *gom } // StateLookupID mocks base method. -func (m *MockFullNode) StateLookupID(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (address.Address, error) { +func (m *MockFullNode) StateLookupID(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateLookupID", arg0, arg1, arg2) ret0, _ := ret[0].(address.Address) @@ -1698,7 +1698,7 @@ func (mr *MockFullNodeMockRecorder) StateLookupID(arg0, arg1, arg2 interface{}) } // StateMarketBalance mocks base method. -func (m *MockFullNode) StateMarketBalance(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (types.MarketBalance, error) { +func (m *MockFullNode) StateMarketBalance(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (types.MarketBalance, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketBalance", arg0, arg1, arg2) ret0, _ := ret[0].(types.MarketBalance) @@ -1713,7 +1713,7 @@ func (mr *MockFullNodeMockRecorder) StateMarketBalance(arg0, arg1, arg2 interfac } // StateMarketDeals mocks base method. -func (m *MockFullNode) StateMarketDeals(arg0 context.Context, arg1 chain0.TipSetKey) (map[string]types.MarketDeal, error) { +func (m *MockFullNode) StateMarketDeals(arg0 context.Context, arg1 types.TipSetKey) (map[string]types.MarketDeal, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketDeals", arg0, arg1) ret0, _ := ret[0].(map[string]types.MarketDeal) @@ -1728,7 +1728,7 @@ func (mr *MockFullNodeMockRecorder) StateMarketDeals(arg0, arg1 interface{}) *go } // StateMarketParticipants mocks base method. -func (m *MockFullNode) StateMarketParticipants(arg0 context.Context, arg1 chain0.TipSetKey) (map[string]types.MarketBalance, error) { +func (m *MockFullNode) StateMarketParticipants(arg0 context.Context, arg1 types.TipSetKey) (map[string]types.MarketBalance, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketParticipants", arg0, arg1) ret0, _ := ret[0].(map[string]types.MarketBalance) @@ -1743,7 +1743,7 @@ func (mr *MockFullNodeMockRecorder) StateMarketParticipants(arg0, arg1 interface } // StateMarketStorageDeal mocks base method. -func (m *MockFullNode) StateMarketStorageDeal(arg0 context.Context, arg1 abi.DealID, arg2 chain0.TipSetKey) (*types.MarketDeal, error) { +func (m *MockFullNode) StateMarketStorageDeal(arg0 context.Context, arg1 abi.DealID, arg2 types.TipSetKey) (*types.MarketDeal, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketStorageDeal", arg0, arg1, arg2) ret0, _ := ret[0].(*types.MarketDeal) @@ -1758,7 +1758,7 @@ func (mr *MockFullNodeMockRecorder) StateMarketStorageDeal(arg0, arg1, arg2 inte } // StateMinerActiveSectors mocks base method. -func (m *MockFullNode) StateMinerActiveSectors(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) ([]*miner0.SectorOnChainInfo, error) { +func (m *MockFullNode) StateMinerActiveSectors(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) ([]*miner0.SectorOnChainInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerActiveSectors", arg0, arg1, arg2) ret0, _ := ret[0].([]*miner0.SectorOnChainInfo) @@ -1773,7 +1773,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerActiveSectors(arg0, arg1, arg2 int } // StateMinerAvailableBalance mocks base method. -func (m *MockFullNode) StateMinerAvailableBalance(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (big.Int, error) { +func (m *MockFullNode) StateMinerAvailableBalance(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerAvailableBalance", arg0, arg1, arg2) ret0, _ := ret[0].(big.Int) @@ -1788,7 +1788,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerAvailableBalance(arg0, arg1, arg2 } // StateMinerDeadlines mocks base method. -func (m *MockFullNode) StateMinerDeadlines(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) ([]types.Deadline, error) { +func (m *MockFullNode) StateMinerDeadlines(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) ([]types.Deadline, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerDeadlines", arg0, arg1, arg2) ret0, _ := ret[0].([]types.Deadline) @@ -1803,7 +1803,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerDeadlines(arg0, arg1, arg2 interfa } // StateMinerFaults mocks base method. -func (m *MockFullNode) StateMinerFaults(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (bitfield.BitField, error) { +func (m *MockFullNode) StateMinerFaults(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (bitfield.BitField, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerFaults", arg0, arg1, arg2) ret0, _ := ret[0].(bitfield.BitField) @@ -1818,7 +1818,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerFaults(arg0, arg1, arg2 interface{ } // StateMinerInfo mocks base method. -func (m *MockFullNode) StateMinerInfo(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (miner0.MinerInfo, error) { +func (m *MockFullNode) StateMinerInfo(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (miner0.MinerInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerInfo", arg0, arg1, arg2) ret0, _ := ret[0].(miner0.MinerInfo) @@ -1833,7 +1833,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerInfo(arg0, arg1, arg2 interface{}) } // StateMinerInitialPledgeCollateral mocks base method. -func (m *MockFullNode) StateMinerInitialPledgeCollateral(arg0 context.Context, arg1 address.Address, arg2 miner.SectorPreCommitInfo, arg3 chain0.TipSetKey) (big.Int, error) { +func (m *MockFullNode) StateMinerInitialPledgeCollateral(arg0 context.Context, arg1 address.Address, arg2 miner.SectorPreCommitInfo, arg3 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerInitialPledgeCollateral", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(big.Int) @@ -1848,7 +1848,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerInitialPledgeCollateral(arg0, arg1 } // StateMinerPartitions mocks base method. -func (m *MockFullNode) StateMinerPartitions(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 chain0.TipSetKey) ([]types.Partition, error) { +func (m *MockFullNode) StateMinerPartitions(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 types.TipSetKey) ([]types.Partition, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerPartitions", arg0, arg1, arg2, arg3) ret0, _ := ret[0].([]types.Partition) @@ -1863,7 +1863,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerPartitions(arg0, arg1, arg2, arg3 } // StateMinerPower mocks base method. -func (m *MockFullNode) StateMinerPower(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*types.MinerPower, error) { +func (m *MockFullNode) StateMinerPower(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*types.MinerPower, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerPower", arg0, arg1, arg2) ret0, _ := ret[0].(*types.MinerPower) @@ -1878,7 +1878,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerPower(arg0, arg1, arg2 interface{} } // StateMinerPreCommitDepositForPower mocks base method. -func (m *MockFullNode) StateMinerPreCommitDepositForPower(arg0 context.Context, arg1 address.Address, arg2 miner.SectorPreCommitInfo, arg3 chain0.TipSetKey) (big.Int, error) { +func (m *MockFullNode) StateMinerPreCommitDepositForPower(arg0 context.Context, arg1 address.Address, arg2 miner.SectorPreCommitInfo, arg3 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerPreCommitDepositForPower", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(big.Int) @@ -1893,7 +1893,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerPreCommitDepositForPower(arg0, arg } // StateMinerProvingDeadline mocks base method. -func (m *MockFullNode) StateMinerProvingDeadline(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*dline.Info, error) { +func (m *MockFullNode) StateMinerProvingDeadline(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*dline.Info, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerProvingDeadline", arg0, arg1, arg2) ret0, _ := ret[0].(*dline.Info) @@ -1908,7 +1908,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerProvingDeadline(arg0, arg1, arg2 i } // StateMinerRecoveries mocks base method. -func (m *MockFullNode) StateMinerRecoveries(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (bitfield.BitField, error) { +func (m *MockFullNode) StateMinerRecoveries(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (bitfield.BitField, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerRecoveries", arg0, arg1, arg2) ret0, _ := ret[0].(bitfield.BitField) @@ -1923,7 +1923,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerRecoveries(arg0, arg1, arg2 interf } // StateMinerSectorAllocated mocks base method. -func (m *MockFullNode) StateMinerSectorAllocated(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (bool, error) { +func (m *MockFullNode) StateMinerSectorAllocated(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 types.TipSetKey) (bool, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerSectorAllocated", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(bool) @@ -1938,7 +1938,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerSectorAllocated(arg0, arg1, arg2, } // StateMinerSectorCount mocks base method. -func (m *MockFullNode) StateMinerSectorCount(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (types.MinerSectors, error) { +func (m *MockFullNode) StateMinerSectorCount(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (types.MinerSectors, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerSectorCount", arg0, arg1, arg2) ret0, _ := ret[0].(types.MinerSectors) @@ -1953,7 +1953,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerSectorCount(arg0, arg1, arg2 inter } // StateMinerSectorSize mocks base method. -func (m *MockFullNode) StateMinerSectorSize(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (abi.SectorSize, error) { +func (m *MockFullNode) StateMinerSectorSize(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (abi.SectorSize, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerSectorSize", arg0, arg1, arg2) ret0, _ := ret[0].(abi.SectorSize) @@ -1968,7 +1968,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerSectorSize(arg0, arg1, arg2 interf } // StateMinerSectors mocks base method. -func (m *MockFullNode) StateMinerSectors(arg0 context.Context, arg1 address.Address, arg2 *bitfield.BitField, arg3 chain0.TipSetKey) ([]*miner0.SectorOnChainInfo, error) { +func (m *MockFullNode) StateMinerSectors(arg0 context.Context, arg1 address.Address, arg2 *bitfield.BitField, arg3 types.TipSetKey) ([]*miner0.SectorOnChainInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerSectors", arg0, arg1, arg2, arg3) ret0, _ := ret[0].([]*miner0.SectorOnChainInfo) @@ -1983,7 +1983,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerSectors(arg0, arg1, arg2, arg3 int } // StateMinerWorkerAddress mocks base method. -func (m *MockFullNode) StateMinerWorkerAddress(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (address.Address, error) { +func (m *MockFullNode) StateMinerWorkerAddress(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerWorkerAddress", arg0, arg1, arg2) ret0, _ := ret[0].(address.Address) @@ -2013,7 +2013,7 @@ func (mr *MockFullNodeMockRecorder) StateNetworkName(arg0 interface{}) *gomock.C } // StateNetworkVersion mocks base method. -func (m *MockFullNode) StateNetworkVersion(arg0 context.Context, arg1 chain0.TipSetKey) (network.Version, error) { +func (m *MockFullNode) StateNetworkVersion(arg0 context.Context, arg1 types.TipSetKey) (network.Version, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateNetworkVersion", arg0, arg1) ret0, _ := ret[0].(network.Version) @@ -2058,7 +2058,7 @@ func (mr *MockFullNodeMockRecorder) StateSearchMsgLimited(arg0, arg1, arg2 inter } // StateSectorExpiration mocks base method. -func (m *MockFullNode) StateSectorExpiration(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (*miner0.SectorExpiration, error) { +func (m *MockFullNode) StateSectorExpiration(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 types.TipSetKey) (*miner0.SectorExpiration, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateSectorExpiration", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*miner0.SectorExpiration) @@ -2073,7 +2073,7 @@ func (mr *MockFullNodeMockRecorder) StateSectorExpiration(arg0, arg1, arg2, arg3 } // StateSectorGetInfo mocks base method. -func (m *MockFullNode) StateSectorGetInfo(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (*miner0.SectorOnChainInfo, error) { +func (m *MockFullNode) StateSectorGetInfo(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 types.TipSetKey) (*miner0.SectorOnChainInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateSectorGetInfo", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*miner0.SectorOnChainInfo) @@ -2088,7 +2088,7 @@ func (mr *MockFullNodeMockRecorder) StateSectorGetInfo(arg0, arg1, arg2, arg3 in } // StateSectorPartition mocks base method. -func (m *MockFullNode) StateSectorPartition(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (*miner0.SectorLocation, error) { +func (m *MockFullNode) StateSectorPartition(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 types.TipSetKey) (*miner0.SectorLocation, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateSectorPartition", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*miner0.SectorLocation) @@ -2103,7 +2103,7 @@ func (mr *MockFullNodeMockRecorder) StateSectorPartition(arg0, arg1, arg2, arg3 } // StateSectorPreCommitInfo mocks base method. -func (m *MockFullNode) StateSectorPreCommitInfo(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (miner0.SectorPreCommitOnChainInfo, error) { +func (m *MockFullNode) StateSectorPreCommitInfo(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 types.TipSetKey) (miner0.SectorPreCommitOnChainInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateSectorPreCommitInfo", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(miner0.SectorPreCommitOnChainInfo) @@ -2118,10 +2118,10 @@ func (mr *MockFullNodeMockRecorder) StateSectorPreCommitInfo(arg0, arg1, arg2, a } // StateVMCirculatingSupplyInternal mocks base method. -func (m *MockFullNode) StateVMCirculatingSupplyInternal(arg0 context.Context, arg1 chain0.TipSetKey) (chain0.CirculatingSupply, error) { +func (m *MockFullNode) StateVMCirculatingSupplyInternal(arg0 context.Context, arg1 types.TipSetKey) (types.CirculatingSupply, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateVMCirculatingSupplyInternal", arg0, arg1) - ret0, _ := ret[0].(chain0.CirculatingSupply) + ret0, _ := ret[0].(types.CirculatingSupply) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2133,7 +2133,7 @@ func (mr *MockFullNodeMockRecorder) StateVMCirculatingSupplyInternal(arg0, arg1 } // StateVerifiedClientStatus mocks base method. -func (m *MockFullNode) StateVerifiedClientStatus(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*big.Int, error) { +func (m *MockFullNode) StateVerifiedClientStatus(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateVerifiedClientStatus", arg0, arg1, arg2) ret0, _ := ret[0].(*big.Int) @@ -2148,7 +2148,7 @@ func (mr *MockFullNodeMockRecorder) StateVerifiedClientStatus(arg0, arg1, arg2 i } // StateVerifiedRegistryRootKey mocks base method. -func (m *MockFullNode) StateVerifiedRegistryRootKey(arg0 context.Context, arg1 chain0.TipSetKey) (address.Address, error) { +func (m *MockFullNode) StateVerifiedRegistryRootKey(arg0 context.Context, arg1 types.TipSetKey) (address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateVerifiedRegistryRootKey", arg0, arg1) ret0, _ := ret[0].(address.Address) @@ -2163,7 +2163,7 @@ func (mr *MockFullNodeMockRecorder) StateVerifiedRegistryRootKey(arg0, arg1 inte } // StateVerifierStatus mocks base method. -func (m *MockFullNode) StateVerifierStatus(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*big.Int, error) { +func (m *MockFullNode) StateVerifierStatus(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateVerifierStatus", arg0, arg1, arg2) ret0, _ := ret[0].(*big.Int) @@ -2223,7 +2223,7 @@ func (mr *MockFullNodeMockRecorder) SyncState(arg0 interface{}) *gomock.Call { } // SyncSubmitBlock mocks base method. -func (m *MockFullNode) SyncSubmitBlock(arg0 context.Context, arg1 *chain0.BlockMsg) error { +func (m *MockFullNode) SyncSubmitBlock(arg0 context.Context, arg1 *types.BlockMsg) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SyncSubmitBlock", arg0, arg1) ret0, _ := ret[0].(error) @@ -2280,7 +2280,7 @@ func (mr *MockFullNodeMockRecorder) Verify(arg0, arg1, arg2 interface{}) *gomock } // VerifyEntry mocks base method. -func (m *MockFullNode) VerifyEntry(arg0, arg1 *chain0.BeaconEntry, arg2 abi.ChainEpoch) bool { +func (m *MockFullNode) VerifyEntry(arg0, arg1 *types.BeaconEntry, arg2 abi.ChainEpoch) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "VerifyEntry", arg0, arg1, arg2) ret0, _ := ret[0].(bool) @@ -2353,10 +2353,10 @@ func (mr *MockFullNodeMockRecorder) WalletDefaultAddress(arg0 interface{}) *gomo } // WalletExport mocks base method. -func (m *MockFullNode) WalletExport(arg0 context.Context, arg1 address.Address, arg2 string) (*chain0.KeyInfo, error) { +func (m *MockFullNode) WalletExport(arg0 context.Context, arg1 address.Address, arg2 string) (*types.KeyInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WalletExport", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain0.KeyInfo) + ret0, _ := ret[0].(*types.KeyInfo) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2383,7 +2383,7 @@ func (mr *MockFullNodeMockRecorder) WalletHas(arg0, arg1 interface{}) *gomock.Ca } // WalletImport mocks base method. -func (m *MockFullNode) WalletImport(arg0 context.Context, arg1 *chain0.KeyInfo) (address.Address, error) { +func (m *MockFullNode) WalletImport(arg0 context.Context, arg1 *types.KeyInfo) (address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WalletImport", arg0, arg1) ret0, _ := ret[0].(address.Address) @@ -2427,7 +2427,7 @@ func (mr *MockFullNodeMockRecorder) WalletSetDefault(arg0, arg1 interface{}) *go } // WalletSign mocks base method. -func (m *MockFullNode) WalletSign(arg0 context.Context, arg1 address.Address, arg2 []byte, arg3 chain0.MsgMeta) (*crypto.Signature, error) { +func (m *MockFullNode) WalletSign(arg0 context.Context, arg1 address.Address, arg2 []byte, arg3 types.MsgMeta) (*crypto.Signature, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WalletSign", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*crypto.Signature) @@ -2442,10 +2442,10 @@ func (mr *MockFullNodeMockRecorder) WalletSign(arg0, arg1, arg2, arg3 interface{ } // WalletSignMessage mocks base method. -func (m *MockFullNode) WalletSignMessage(arg0 context.Context, arg1 address.Address, arg2 *chain0.Message) (*chain0.SignedMessage, error) { +func (m *MockFullNode) WalletSignMessage(arg0 context.Context, arg1 address.Address, arg2 *internal.Message) (*types.SignedMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WalletSignMessage", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain0.SignedMessage) + ret0, _ := ret[0].(*types.SignedMessage) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/venus-shared/api/chain/v1/mock/full.go b/venus-shared/api/chain/v1/mock/full.go index a2a373c911..9f31a985df 100644 --- a/venus-shared/api/chain/v1/mock/full.go +++ b/venus-shared/api/chain/v1/mock/full.go @@ -19,8 +19,8 @@ import ( miner "github.com/filecoin-project/specs-actors/actors/builtin/miner" paych "github.com/filecoin-project/specs-actors/actors/builtin/paych" miner0 "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - "github.com/filecoin-project/venus/venus-shared/types" - chain0 "github.com/filecoin-project/venus/venus-shared/types" + internal "github.com/filecoin-project/venus/venus-shared/internal" + types "github.com/filecoin-project/venus/venus-shared/types" gomock "github.com/golang/mock/gomock" cid "github.com/ipfs/go-cid" metrics "github.com/libp2p/go-libp2p-core/metrics" @@ -67,10 +67,10 @@ func (mr *MockFullNodeMockRecorder) AuthNew(arg0, arg1 interface{}) *gomock.Call } // BeaconGetEntry mocks base method. -func (m *MockFullNode) BeaconGetEntry(arg0 context.Context, arg1 abi.ChainEpoch) (*chain0.BeaconEntry, error) { +func (m *MockFullNode) BeaconGetEntry(arg0 context.Context, arg1 abi.ChainEpoch) (*types.BeaconEntry, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BeaconGetEntry", arg0, arg1) - ret0, _ := ret[0].(*chain0.BeaconEntry) + ret0, _ := ret[0].(*types.BeaconEntry) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -110,7 +110,7 @@ func (mr *MockFullNodeMockRecorder) ChainDeleteObj(arg0, arg1 interface{}) *gomo } // ChainExport mocks base method. -func (m *MockFullNode) ChainExport(arg0 context.Context, arg1 abi.ChainEpoch, arg2 bool, arg3 chain0.TipSetKey) (<-chan []byte, error) { +func (m *MockFullNode) ChainExport(arg0 context.Context, arg1 abi.ChainEpoch, arg2 bool, arg3 types.TipSetKey) (<-chan []byte, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainExport", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(<-chan []byte) @@ -125,10 +125,10 @@ func (mr *MockFullNodeMockRecorder) ChainExport(arg0, arg1, arg2, arg3 interface } // ChainGetBlock mocks base method. -func (m *MockFullNode) ChainGetBlock(arg0 context.Context, arg1 cid.Cid) (*chain0.BlockHeader, error) { +func (m *MockFullNode) ChainGetBlock(arg0 context.Context, arg1 cid.Cid) (*types.BlockHeader, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetBlock", arg0, arg1) - ret0, _ := ret[0].(*chain0.BlockHeader) + ret0, _ := ret[0].(*types.BlockHeader) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -155,10 +155,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetBlockMessages(arg0, arg1 interface{} } // ChainGetMessage mocks base method. -func (m *MockFullNode) ChainGetMessage(arg0 context.Context, arg1 cid.Cid) (*chain0.Message, error) { +func (m *MockFullNode) ChainGetMessage(arg0 context.Context, arg1 cid.Cid) (*internal.Message, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetMessage", arg0, arg1) - ret0, _ := ret[0].(*chain0.Message) + ret0, _ := ret[0].(*internal.Message) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -170,10 +170,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetMessage(arg0, arg1 interface{}) *gom } // ChainGetMessagesInTipset mocks base method. -func (m *MockFullNode) ChainGetMessagesInTipset(arg0 context.Context, arg1 chain0.TipSetKey) ([]types.Message, error) { +func (m *MockFullNode) ChainGetMessagesInTipset(arg0 context.Context, arg1 types.TipSetKey) ([]types.MessageCID, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetMessagesInTipset", arg0, arg1) - ret0, _ := ret[0].([]types.Message) + ret0, _ := ret[0].([]types.MessageCID) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -185,10 +185,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetMessagesInTipset(arg0, arg1 interfac } // ChainGetParentMessages mocks base method. -func (m *MockFullNode) ChainGetParentMessages(arg0 context.Context, arg1 cid.Cid) ([]types.Message, error) { +func (m *MockFullNode) ChainGetParentMessages(arg0 context.Context, arg1 cid.Cid) ([]types.MessageCID, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetParentMessages", arg0, arg1) - ret0, _ := ret[0].([]types.Message) + ret0, _ := ret[0].([]types.MessageCID) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -200,10 +200,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetParentMessages(arg0, arg1 interface{ } // ChainGetParentReceipts mocks base method. -func (m *MockFullNode) ChainGetParentReceipts(arg0 context.Context, arg1 cid.Cid) ([]*chain0.MessageReceipt, error) { +func (m *MockFullNode) ChainGetParentReceipts(arg0 context.Context, arg1 cid.Cid) ([]*types.MessageReceipt, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetParentReceipts", arg0, arg1) - ret0, _ := ret[0].([]*chain0.MessageReceipt) + ret0, _ := ret[0].([]*types.MessageReceipt) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -215,7 +215,7 @@ func (mr *MockFullNodeMockRecorder) ChainGetParentReceipts(arg0, arg1 interface{ } // ChainGetPath mocks base method. -func (m *MockFullNode) ChainGetPath(arg0 context.Context, arg1, arg2 chain0.TipSetKey) ([]*types.HeadChange, error) { +func (m *MockFullNode) ChainGetPath(arg0 context.Context, arg1, arg2 types.TipSetKey) ([]*types.HeadChange, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetPath", arg0, arg1, arg2) ret0, _ := ret[0].([]*types.HeadChange) @@ -230,7 +230,7 @@ func (mr *MockFullNodeMockRecorder) ChainGetPath(arg0, arg1, arg2 interface{}) * } // ChainGetRandomnessFromBeacon mocks base method. -func (m *MockFullNode) ChainGetRandomnessFromBeacon(arg0 context.Context, arg1 chain0.TipSetKey, arg2 crypto.DomainSeparationTag, arg3 abi.ChainEpoch, arg4 []byte) (abi.Randomness, error) { +func (m *MockFullNode) ChainGetRandomnessFromBeacon(arg0 context.Context, arg1 types.TipSetKey, arg2 crypto.DomainSeparationTag, arg3 abi.ChainEpoch, arg4 []byte) (abi.Randomness, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetRandomnessFromBeacon", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(abi.Randomness) @@ -245,7 +245,7 @@ func (mr *MockFullNodeMockRecorder) ChainGetRandomnessFromBeacon(arg0, arg1, arg } // ChainGetRandomnessFromTickets mocks base method. -func (m *MockFullNode) ChainGetRandomnessFromTickets(arg0 context.Context, arg1 chain0.TipSetKey, arg2 crypto.DomainSeparationTag, arg3 abi.ChainEpoch, arg4 []byte) (abi.Randomness, error) { +func (m *MockFullNode) ChainGetRandomnessFromTickets(arg0 context.Context, arg1 types.TipSetKey, arg2 crypto.DomainSeparationTag, arg3 abi.ChainEpoch, arg4 []byte) (abi.Randomness, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetRandomnessFromTickets", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(abi.Randomness) @@ -260,10 +260,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetRandomnessFromTickets(arg0, arg1, ar } // ChainGetReceipts mocks base method. -func (m *MockFullNode) ChainGetReceipts(arg0 context.Context, arg1 cid.Cid) ([]chain0.MessageReceipt, error) { +func (m *MockFullNode) ChainGetReceipts(arg0 context.Context, arg1 cid.Cid) ([]types.MessageReceipt, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetReceipts", arg0, arg1) - ret0, _ := ret[0].([]chain0.MessageReceipt) + ret0, _ := ret[0].([]types.MessageReceipt) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -275,10 +275,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetReceipts(arg0, arg1 interface{}) *go } // ChainGetTipSet mocks base method. -func (m *MockFullNode) ChainGetTipSet(arg0 context.Context, arg1 chain0.TipSetKey) (*chain0.TipSet, error) { +func (m *MockFullNode) ChainGetTipSet(arg0 context.Context, arg1 types.TipSetKey) (*types.TipSet, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetTipSet", arg0, arg1) - ret0, _ := ret[0].(*chain0.TipSet) + ret0, _ := ret[0].(*types.TipSet) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -290,10 +290,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetTipSet(arg0, arg1 interface{}) *gomo } // ChainGetTipSetAfterHeight mocks base method. -func (m *MockFullNode) ChainGetTipSetAfterHeight(arg0 context.Context, arg1 abi.ChainEpoch, arg2 chain0.TipSetKey) (*chain0.TipSet, error) { +func (m *MockFullNode) ChainGetTipSetAfterHeight(arg0 context.Context, arg1 abi.ChainEpoch, arg2 types.TipSetKey) (*types.TipSet, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetTipSetAfterHeight", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain0.TipSet) + ret0, _ := ret[0].(*types.TipSet) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -305,10 +305,10 @@ func (mr *MockFullNodeMockRecorder) ChainGetTipSetAfterHeight(arg0, arg1, arg2 i } // ChainGetTipSetByHeight mocks base method. -func (m *MockFullNode) ChainGetTipSetByHeight(arg0 context.Context, arg1 abi.ChainEpoch, arg2 chain0.TipSetKey) (*chain0.TipSet, error) { +func (m *MockFullNode) ChainGetTipSetByHeight(arg0 context.Context, arg1 abi.ChainEpoch, arg2 types.TipSetKey) (*types.TipSet, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainGetTipSetByHeight", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain0.TipSet) + ret0, _ := ret[0].(*types.TipSet) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -335,10 +335,10 @@ func (mr *MockFullNodeMockRecorder) ChainHasObj(arg0, arg1 interface{}) *gomock. } // ChainHead mocks base method. -func (m *MockFullNode) ChainHead(arg0 context.Context) (*chain0.TipSet, error) { +func (m *MockFullNode) ChainHead(arg0 context.Context) (*types.TipSet, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainHead", arg0) - ret0, _ := ret[0].(*chain0.TipSet) + ret0, _ := ret[0].(*types.TipSet) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -350,10 +350,10 @@ func (mr *MockFullNodeMockRecorder) ChainHead(arg0 interface{}) *gomock.Call { } // ChainList mocks base method. -func (m *MockFullNode) ChainList(arg0 context.Context, arg1 chain0.TipSetKey, arg2 int) ([]chain0.TipSetKey, error) { +func (m *MockFullNode) ChainList(arg0 context.Context, arg1 types.TipSetKey, arg2 int) ([]types.TipSetKey, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainList", arg0, arg1, arg2) - ret0, _ := ret[0].([]chain0.TipSetKey) + ret0, _ := ret[0].([]types.TipSetKey) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -395,7 +395,7 @@ func (mr *MockFullNodeMockRecorder) ChainReadObj(arg0, arg1 interface{}) *gomock } // ChainSetHead mocks base method. -func (m *MockFullNode) ChainSetHead(arg0 context.Context, arg1 chain0.TipSetKey) error { +func (m *MockFullNode) ChainSetHead(arg0 context.Context, arg1 types.TipSetKey) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainSetHead", arg0, arg1) ret0, _ := ret[0].(error) @@ -424,7 +424,7 @@ func (mr *MockFullNodeMockRecorder) ChainStatObj(arg0, arg1, arg2 interface{}) * } // ChainSyncHandleNewTipSet mocks base method. -func (m *MockFullNode) ChainSyncHandleNewTipSet(arg0 context.Context, arg1 *chain0.ChainInfo) error { +func (m *MockFullNode) ChainSyncHandleNewTipSet(arg0 context.Context, arg1 *types.ChainInfo) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainSyncHandleNewTipSet", arg0, arg1) ret0, _ := ret[0].(error) @@ -438,7 +438,7 @@ func (mr *MockFullNodeMockRecorder) ChainSyncHandleNewTipSet(arg0, arg1 interfac } // ChainTipSetWeight mocks base method. -func (m *MockFullNode) ChainTipSetWeight(arg0 context.Context, arg1 chain0.TipSetKey) (big.Int, error) { +func (m *MockFullNode) ChainTipSetWeight(arg0 context.Context, arg1 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChainTipSetWeight", arg0, arg1) ret0, _ := ret[0].(big.Int) @@ -467,7 +467,7 @@ func (mr *MockFullNodeMockRecorder) Concurrent(arg0 interface{}) *gomock.Call { } // GasBatchEstimateMessageGas mocks base method. -func (m *MockFullNode) GasBatchEstimateMessageGas(arg0 context.Context, arg1 []*types.EstimateMessage, arg2 uint64, arg3 chain0.TipSetKey) ([]*types.EstimateResult, error) { +func (m *MockFullNode) GasBatchEstimateMessageGas(arg0 context.Context, arg1 []*types.EstimateMessage, arg2 uint64, arg3 types.TipSetKey) ([]*types.EstimateResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GasBatchEstimateMessageGas", arg0, arg1, arg2, arg3) ret0, _ := ret[0].([]*types.EstimateResult) @@ -482,7 +482,7 @@ func (mr *MockFullNodeMockRecorder) GasBatchEstimateMessageGas(arg0, arg1, arg2, } // GasEstimateFeeCap mocks base method. -func (m *MockFullNode) GasEstimateFeeCap(arg0 context.Context, arg1 *chain0.Message, arg2 int64, arg3 chain0.TipSetKey) (big.Int, error) { +func (m *MockFullNode) GasEstimateFeeCap(arg0 context.Context, arg1 *internal.Message, arg2 int64, arg3 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GasEstimateFeeCap", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(big.Int) @@ -497,7 +497,7 @@ func (mr *MockFullNodeMockRecorder) GasEstimateFeeCap(arg0, arg1, arg2, arg3 int } // GasEstimateGasLimit mocks base method. -func (m *MockFullNode) GasEstimateGasLimit(arg0 context.Context, arg1 *chain0.Message, arg2 chain0.TipSetKey) (int64, error) { +func (m *MockFullNode) GasEstimateGasLimit(arg0 context.Context, arg1 *internal.Message, arg2 types.TipSetKey) (int64, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GasEstimateGasLimit", arg0, arg1, arg2) ret0, _ := ret[0].(int64) @@ -512,7 +512,7 @@ func (mr *MockFullNodeMockRecorder) GasEstimateGasLimit(arg0, arg1, arg2 interfa } // GasEstimateGasPremium mocks base method. -func (m *MockFullNode) GasEstimateGasPremium(arg0 context.Context, arg1 uint64, arg2 address.Address, arg3 int64, arg4 chain0.TipSetKey) (big.Int, error) { +func (m *MockFullNode) GasEstimateGasPremium(arg0 context.Context, arg1 uint64, arg2 address.Address, arg3 int64, arg4 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GasEstimateGasPremium", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(big.Int) @@ -527,10 +527,10 @@ func (mr *MockFullNodeMockRecorder) GasEstimateGasPremium(arg0, arg1, arg2, arg3 } // GasEstimateMessageGas mocks base method. -func (m *MockFullNode) GasEstimateMessageGas(arg0 context.Context, arg1 *chain0.Message, arg2 *types.MessageSendSpec, arg3 chain0.TipSetKey) (*chain0.Message, error) { +func (m *MockFullNode) GasEstimateMessageGas(arg0 context.Context, arg1 *internal.Message, arg2 *types.MessageSendSpec, arg3 types.TipSetKey) (*internal.Message, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GasEstimateMessageGas", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain0.Message) + ret0, _ := ret[0].(*internal.Message) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -542,10 +542,10 @@ func (mr *MockFullNodeMockRecorder) GasEstimateMessageGas(arg0, arg1, arg2, arg3 } // GetActor mocks base method. -func (m *MockFullNode) GetActor(arg0 context.Context, arg1 address.Address) (*chain0.Actor, error) { +func (m *MockFullNode) GetActor(arg0 context.Context, arg1 address.Address) (*internal.Actor, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetActor", arg0, arg1) - ret0, _ := ret[0].(*chain0.Actor) + ret0, _ := ret[0].(*internal.Actor) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -557,10 +557,10 @@ func (mr *MockFullNodeMockRecorder) GetActor(arg0, arg1 interface{}) *gomock.Cal } // GetEntry mocks base method. -func (m *MockFullNode) GetEntry(arg0 context.Context, arg1 abi.ChainEpoch, arg2 uint64) (*chain0.BeaconEntry, error) { +func (m *MockFullNode) GetEntry(arg0 context.Context, arg1 abi.ChainEpoch, arg2 uint64) (*types.BeaconEntry, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetEntry", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain0.BeaconEntry) + ret0, _ := ret[0].(*types.BeaconEntry) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -572,10 +572,10 @@ func (mr *MockFullNodeMockRecorder) GetEntry(arg0, arg1, arg2 interface{}) *gomo } // GetFullBlock mocks base method. -func (m *MockFullNode) GetFullBlock(arg0 context.Context, arg1 cid.Cid) (*chain0.FullBlock, error) { +func (m *MockFullNode) GetFullBlock(arg0 context.Context, arg1 cid.Cid) (*types.FullBlock, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetFullBlock", arg0, arg1) - ret0, _ := ret[0].(*chain0.FullBlock) + ret0, _ := ret[0].(*types.FullBlock) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -587,10 +587,10 @@ func (mr *MockFullNodeMockRecorder) GetFullBlock(arg0, arg1 interface{}) *gomock } // GetParentStateRootActor mocks base method. -func (m *MockFullNode) GetParentStateRootActor(arg0 context.Context, arg1 *chain0.TipSet, arg2 address.Address) (*chain0.Actor, error) { +func (m *MockFullNode) GetParentStateRootActor(arg0 context.Context, arg1 *types.TipSet, arg2 address.Address) (*internal.Actor, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetParentStateRootActor", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain0.Actor) + ret0, _ := ret[0].(*internal.Actor) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -616,10 +616,10 @@ func (mr *MockFullNodeMockRecorder) HasPassword(arg0 interface{}) *gomock.Call { } // ListActor mocks base method. -func (m *MockFullNode) ListActor(arg0 context.Context) (map[address.Address]*chain0.Actor, error) { +func (m *MockFullNode) ListActor(arg0 context.Context) (map[address.Address]*internal.Actor, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListActor", arg0) - ret0, _ := ret[0].(map[address.Address]*chain0.Actor) + ret0, _ := ret[0].(map[address.Address]*internal.Actor) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -660,10 +660,10 @@ func (mr *MockFullNodeMockRecorder) MessageWait(arg0, arg1, arg2, arg3 interface } // MinerCreateBlock mocks base method. -func (m *MockFullNode) MinerCreateBlock(arg0 context.Context, arg1 *types.BlockTemplate) (*chain0.BlockMsg, error) { +func (m *MockFullNode) MinerCreateBlock(arg0 context.Context, arg1 *types.BlockTemplate) (*types.BlockMsg, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MinerCreateBlock", arg0, arg1) - ret0, _ := ret[0].(*chain0.BlockMsg) + ret0, _ := ret[0].(*types.BlockMsg) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -675,7 +675,7 @@ func (mr *MockFullNodeMockRecorder) MinerCreateBlock(arg0, arg1 interface{}) *go } // MinerGetBaseInfo mocks base method. -func (m *MockFullNode) MinerGetBaseInfo(arg0 context.Context, arg1 address.Address, arg2 abi.ChainEpoch, arg3 chain0.TipSetKey) (*types.MiningBaseInfo, error) { +func (m *MockFullNode) MinerGetBaseInfo(arg0 context.Context, arg1 address.Address, arg2 abi.ChainEpoch, arg3 types.TipSetKey) (*types.MiningBaseInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MinerGetBaseInfo", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*types.MiningBaseInfo) @@ -690,7 +690,7 @@ func (mr *MockFullNodeMockRecorder) MinerGetBaseInfo(arg0, arg1, arg2, arg3 inte } // MpoolBatchPush mocks base method. -func (m *MockFullNode) MpoolBatchPush(arg0 context.Context, arg1 []*chain0.SignedMessage) ([]cid.Cid, error) { +func (m *MockFullNode) MpoolBatchPush(arg0 context.Context, arg1 []*types.SignedMessage) ([]cid.Cid, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolBatchPush", arg0, arg1) ret0, _ := ret[0].([]cid.Cid) @@ -705,10 +705,10 @@ func (mr *MockFullNodeMockRecorder) MpoolBatchPush(arg0, arg1 interface{}) *gomo } // MpoolBatchPushMessage mocks base method. -func (m *MockFullNode) MpoolBatchPushMessage(arg0 context.Context, arg1 []*chain0.Message, arg2 *types.MessageSendSpec) ([]*chain0.SignedMessage, error) { +func (m *MockFullNode) MpoolBatchPushMessage(arg0 context.Context, arg1 []*internal.Message, arg2 *types.MessageSendSpec) ([]*types.SignedMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolBatchPushMessage", arg0, arg1, arg2) - ret0, _ := ret[0].([]*chain0.SignedMessage) + ret0, _ := ret[0].([]*types.SignedMessage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -720,7 +720,7 @@ func (mr *MockFullNodeMockRecorder) MpoolBatchPushMessage(arg0, arg1, arg2 inter } // MpoolBatchPushUntrusted mocks base method. -func (m *MockFullNode) MpoolBatchPushUntrusted(arg0 context.Context, arg1 []*chain0.SignedMessage) ([]cid.Cid, error) { +func (m *MockFullNode) MpoolBatchPushUntrusted(arg0 context.Context, arg1 []*types.SignedMessage) ([]cid.Cid, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolBatchPushUntrusted", arg0, arg1) ret0, _ := ret[0].([]cid.Cid) @@ -735,10 +735,10 @@ func (mr *MockFullNodeMockRecorder) MpoolBatchPushUntrusted(arg0, arg1 interface } // MpoolCheckMessages mocks base method. -func (m *MockFullNode) MpoolCheckMessages(arg0 context.Context, arg1 []*chain0.MessagePrototype) ([][]chain0.MessageCheckStatus, error) { +func (m *MockFullNode) MpoolCheckMessages(arg0 context.Context, arg1 []*types.MessagePrototype) ([][]types.MessageCheckStatus, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolCheckMessages", arg0, arg1) - ret0, _ := ret[0].([][]chain0.MessageCheckStatus) + ret0, _ := ret[0].([][]types.MessageCheckStatus) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -750,10 +750,10 @@ func (mr *MockFullNodeMockRecorder) MpoolCheckMessages(arg0, arg1 interface{}) * } // MpoolCheckPendingMessages mocks base method. -func (m *MockFullNode) MpoolCheckPendingMessages(arg0 context.Context, arg1 address.Address) ([][]chain0.MessageCheckStatus, error) { +func (m *MockFullNode) MpoolCheckPendingMessages(arg0 context.Context, arg1 address.Address) ([][]types.MessageCheckStatus, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolCheckPendingMessages", arg0, arg1) - ret0, _ := ret[0].([][]chain0.MessageCheckStatus) + ret0, _ := ret[0].([][]types.MessageCheckStatus) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -765,10 +765,10 @@ func (mr *MockFullNodeMockRecorder) MpoolCheckPendingMessages(arg0, arg1 interfa } // MpoolCheckReplaceMessages mocks base method. -func (m *MockFullNode) MpoolCheckReplaceMessages(arg0 context.Context, arg1 []*chain0.Message) ([][]chain0.MessageCheckStatus, error) { +func (m *MockFullNode) MpoolCheckReplaceMessages(arg0 context.Context, arg1 []*internal.Message) ([][]types.MessageCheckStatus, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolCheckReplaceMessages", arg0, arg1) - ret0, _ := ret[0].([][]chain0.MessageCheckStatus) + ret0, _ := ret[0].([][]types.MessageCheckStatus) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -808,10 +808,10 @@ func (mr *MockFullNodeMockRecorder) MpoolDeleteByAdress(arg0, arg1 interface{}) } // MpoolGetConfig mocks base method. -func (m *MockFullNode) MpoolGetConfig(arg0 context.Context) (*chain0.MpoolConfig, error) { +func (m *MockFullNode) MpoolGetConfig(arg0 context.Context) (*types.MpoolConfig, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolGetConfig", arg0) - ret0, _ := ret[0].(*chain0.MpoolConfig) + ret0, _ := ret[0].(*types.MpoolConfig) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -838,10 +838,10 @@ func (mr *MockFullNodeMockRecorder) MpoolGetNonce(arg0, arg1 interface{}) *gomoc } // MpoolPending mocks base method. -func (m *MockFullNode) MpoolPending(arg0 context.Context, arg1 chain0.TipSetKey) ([]*chain0.SignedMessage, error) { +func (m *MockFullNode) MpoolPending(arg0 context.Context, arg1 types.TipSetKey) ([]*types.SignedMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolPending", arg0, arg1) - ret0, _ := ret[0].([]*chain0.SignedMessage) + ret0, _ := ret[0].([]*types.SignedMessage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -867,7 +867,7 @@ func (mr *MockFullNodeMockRecorder) MpoolPublishByAddr(arg0, arg1 interface{}) * } // MpoolPublishMessage mocks base method. -func (m *MockFullNode) MpoolPublishMessage(arg0 context.Context, arg1 *chain0.SignedMessage) error { +func (m *MockFullNode) MpoolPublishMessage(arg0 context.Context, arg1 *types.SignedMessage) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolPublishMessage", arg0, arg1) ret0, _ := ret[0].(error) @@ -881,7 +881,7 @@ func (mr *MockFullNodeMockRecorder) MpoolPublishMessage(arg0, arg1 interface{}) } // MpoolPush mocks base method. -func (m *MockFullNode) MpoolPush(arg0 context.Context, arg1 *chain0.SignedMessage) (cid.Cid, error) { +func (m *MockFullNode) MpoolPush(arg0 context.Context, arg1 *types.SignedMessage) (cid.Cid, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolPush", arg0, arg1) ret0, _ := ret[0].(cid.Cid) @@ -896,10 +896,10 @@ func (mr *MockFullNodeMockRecorder) MpoolPush(arg0, arg1 interface{}) *gomock.Ca } // MpoolPushMessage mocks base method. -func (m *MockFullNode) MpoolPushMessage(arg0 context.Context, arg1 *chain0.Message, arg2 *types.MessageSendSpec) (*chain0.SignedMessage, error) { +func (m *MockFullNode) MpoolPushMessage(arg0 context.Context, arg1 *internal.Message, arg2 *types.MessageSendSpec) (*types.SignedMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolPushMessage", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain0.SignedMessage) + ret0, _ := ret[0].(*types.SignedMessage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -911,7 +911,7 @@ func (mr *MockFullNodeMockRecorder) MpoolPushMessage(arg0, arg1, arg2 interface{ } // MpoolPushUntrusted mocks base method. -func (m *MockFullNode) MpoolPushUntrusted(arg0 context.Context, arg1 *chain0.SignedMessage) (cid.Cid, error) { +func (m *MockFullNode) MpoolPushUntrusted(arg0 context.Context, arg1 *types.SignedMessage) (cid.Cid, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolPushUntrusted", arg0, arg1) ret0, _ := ret[0].(cid.Cid) @@ -926,10 +926,10 @@ func (mr *MockFullNodeMockRecorder) MpoolPushUntrusted(arg0, arg1 interface{}) * } // MpoolSelect mocks base method. -func (m *MockFullNode) MpoolSelect(arg0 context.Context, arg1 chain0.TipSetKey, arg2 float64) ([]*chain0.SignedMessage, error) { +func (m *MockFullNode) MpoolSelect(arg0 context.Context, arg1 types.TipSetKey, arg2 float64) ([]*types.SignedMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolSelect", arg0, arg1, arg2) - ret0, _ := ret[0].([]*chain0.SignedMessage) + ret0, _ := ret[0].([]*types.SignedMessage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -941,10 +941,10 @@ func (mr *MockFullNodeMockRecorder) MpoolSelect(arg0, arg1, arg2 interface{}) *g } // MpoolSelects mocks base method. -func (m *MockFullNode) MpoolSelects(arg0 context.Context, arg1 chain0.TipSetKey, arg2 []float64) ([][]*chain0.SignedMessage, error) { +func (m *MockFullNode) MpoolSelects(arg0 context.Context, arg1 types.TipSetKey, arg2 []float64) ([][]*types.SignedMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolSelects", arg0, arg1, arg2) - ret0, _ := ret[0].([][]*chain0.SignedMessage) + ret0, _ := ret[0].([][]*types.SignedMessage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -956,7 +956,7 @@ func (mr *MockFullNodeMockRecorder) MpoolSelects(arg0, arg1, arg2 interface{}) * } // MpoolSetConfig mocks base method. -func (m *MockFullNode) MpoolSetConfig(arg0 context.Context, arg1 *chain0.MpoolConfig) error { +func (m *MockFullNode) MpoolSetConfig(arg0 context.Context, arg1 *types.MpoolConfig) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolSetConfig", arg0, arg1) ret0, _ := ret[0].(error) @@ -970,10 +970,10 @@ func (mr *MockFullNodeMockRecorder) MpoolSetConfig(arg0, arg1 interface{}) *gomo } // MpoolSub mocks base method. -func (m *MockFullNode) MpoolSub(arg0 context.Context) (<-chan chain0.MpoolUpdate, error) { +func (m *MockFullNode) MpoolSub(arg0 context.Context) (<-chan types.MpoolUpdate, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MpoolSub", arg0) - ret0, _ := ret[0].(<-chan chain0.MpoolUpdate) + ret0, _ := ret[0].(<-chan types.MpoolUpdate) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -985,10 +985,10 @@ func (mr *MockFullNodeMockRecorder) MpoolSub(arg0 interface{}) *gomock.Call { } // MsigAddApprove mocks base method. -func (m *MockFullNode) MsigAddApprove(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5 address.Address, arg6 bool) (*chain0.MessagePrototype, error) { +func (m *MockFullNode) MsigAddApprove(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5 address.Address, arg6 bool) (*types.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigAddApprove", arg0, arg1, arg2, arg3, arg4, arg5, arg6) - ret0, _ := ret[0].(*chain0.MessagePrototype) + ret0, _ := ret[0].(*types.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1000,10 +1000,10 @@ func (mr *MockFullNodeMockRecorder) MsigAddApprove(arg0, arg1, arg2, arg3, arg4, } // MsigAddCancel mocks base method. -func (m *MockFullNode) MsigAddCancel(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4 address.Address, arg5 bool) (*chain0.MessagePrototype, error) { +func (m *MockFullNode) MsigAddCancel(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4 address.Address, arg5 bool) (*types.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigAddCancel", arg0, arg1, arg2, arg3, arg4, arg5) - ret0, _ := ret[0].(*chain0.MessagePrototype) + ret0, _ := ret[0].(*types.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1015,10 +1015,10 @@ func (mr *MockFullNodeMockRecorder) MsigAddCancel(arg0, arg1, arg2, arg3, arg4, } // MsigAddPropose mocks base method. -func (m *MockFullNode) MsigAddPropose(arg0 context.Context, arg1, arg2, arg3 address.Address, arg4 bool) (*chain0.MessagePrototype, error) { +func (m *MockFullNode) MsigAddPropose(arg0 context.Context, arg1, arg2, arg3 address.Address, arg4 bool) (*types.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigAddPropose", arg0, arg1, arg2, arg3, arg4) - ret0, _ := ret[0].(*chain0.MessagePrototype) + ret0, _ := ret[0].(*types.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1030,10 +1030,10 @@ func (mr *MockFullNodeMockRecorder) MsigAddPropose(arg0, arg1, arg2, arg3, arg4 } // MsigApprove mocks base method. -func (m *MockFullNode) MsigApprove(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address) (*chain0.MessagePrototype, error) { +func (m *MockFullNode) MsigApprove(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address) (*types.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigApprove", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain0.MessagePrototype) + ret0, _ := ret[0].(*types.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1045,10 +1045,10 @@ func (mr *MockFullNodeMockRecorder) MsigApprove(arg0, arg1, arg2, arg3 interface } // MsigApproveTxnHash mocks base method. -func (m *MockFullNode) MsigApproveTxnHash(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3, arg4 address.Address, arg5 big.Int, arg6 address.Address, arg7 uint64, arg8 []byte) (*chain0.MessagePrototype, error) { +func (m *MockFullNode) MsigApproveTxnHash(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3, arg4 address.Address, arg5 big.Int, arg6 address.Address, arg7 uint64, arg8 []byte) (*types.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigApproveTxnHash", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) - ret0, _ := ret[0].(*chain0.MessagePrototype) + ret0, _ := ret[0].(*types.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1060,10 +1060,10 @@ func (mr *MockFullNodeMockRecorder) MsigApproveTxnHash(arg0, arg1, arg2, arg3, a } // MsigCancel mocks base method. -func (m *MockFullNode) MsigCancel(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address) (*chain0.MessagePrototype, error) { +func (m *MockFullNode) MsigCancel(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address) (*types.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigCancel", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain0.MessagePrototype) + ret0, _ := ret[0].(*types.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1075,10 +1075,10 @@ func (mr *MockFullNodeMockRecorder) MsigCancel(arg0, arg1, arg2, arg3 interface{ } // MsigCancelTxnHash mocks base method. -func (m *MockFullNode) MsigCancelTxnHash(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address, arg4 big.Int, arg5 address.Address, arg6 uint64, arg7 []byte) (*chain0.MessagePrototype, error) { +func (m *MockFullNode) MsigCancelTxnHash(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address, arg4 big.Int, arg5 address.Address, arg6 uint64, arg7 []byte) (*types.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigCancelTxnHash", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) - ret0, _ := ret[0].(*chain0.MessagePrototype) + ret0, _ := ret[0].(*types.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1090,10 +1090,10 @@ func (mr *MockFullNodeMockRecorder) MsigCancelTxnHash(arg0, arg1, arg2, arg3, ar } // MsigCreate mocks base method. -func (m *MockFullNode) MsigCreate(arg0 context.Context, arg1 uint64, arg2 []address.Address, arg3 abi.ChainEpoch, arg4 big.Int, arg5 address.Address, arg6 big.Int) (*chain0.MessagePrototype, error) { +func (m *MockFullNode) MsigCreate(arg0 context.Context, arg1 uint64, arg2 []address.Address, arg3 abi.ChainEpoch, arg4 big.Int, arg5 address.Address, arg6 big.Int) (*types.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigCreate", arg0, arg1, arg2, arg3, arg4, arg5, arg6) - ret0, _ := ret[0].(*chain0.MessagePrototype) + ret0, _ := ret[0].(*types.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1105,7 +1105,7 @@ func (mr *MockFullNodeMockRecorder) MsigCreate(arg0, arg1, arg2, arg3, arg4, arg } // MsigGetVested mocks base method. -func (m *MockFullNode) MsigGetVested(arg0 context.Context, arg1 address.Address, arg2, arg3 chain0.TipSetKey) (big.Int, error) { +func (m *MockFullNode) MsigGetVested(arg0 context.Context, arg1 address.Address, arg2, arg3 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigGetVested", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(big.Int) @@ -1120,10 +1120,10 @@ func (mr *MockFullNodeMockRecorder) MsigGetVested(arg0, arg1, arg2, arg3 interfa } // MsigPropose mocks base method. -func (m *MockFullNode) MsigPropose(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int, arg4 address.Address, arg5 uint64, arg6 []byte) (*chain0.MessagePrototype, error) { +func (m *MockFullNode) MsigPropose(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int, arg4 address.Address, arg5 uint64, arg6 []byte) (*types.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigPropose", arg0, arg1, arg2, arg3, arg4, arg5, arg6) - ret0, _ := ret[0].(*chain0.MessagePrototype) + ret0, _ := ret[0].(*types.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1135,10 +1135,10 @@ func (mr *MockFullNodeMockRecorder) MsigPropose(arg0, arg1, arg2, arg3, arg4, ar } // MsigRemoveSigner mocks base method. -func (m *MockFullNode) MsigRemoveSigner(arg0 context.Context, arg1, arg2, arg3 address.Address, arg4 bool) (*chain0.MessagePrototype, error) { +func (m *MockFullNode) MsigRemoveSigner(arg0 context.Context, arg1, arg2, arg3 address.Address, arg4 bool) (*types.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigRemoveSigner", arg0, arg1, arg2, arg3, arg4) - ret0, _ := ret[0].(*chain0.MessagePrototype) + ret0, _ := ret[0].(*types.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1150,10 +1150,10 @@ func (mr *MockFullNodeMockRecorder) MsigRemoveSigner(arg0, arg1, arg2, arg3, arg } // MsigSwapApprove mocks base method. -func (m *MockFullNode) MsigSwapApprove(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5, arg6 address.Address) (*chain0.MessagePrototype, error) { +func (m *MockFullNode) MsigSwapApprove(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5, arg6 address.Address) (*types.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigSwapApprove", arg0, arg1, arg2, arg3, arg4, arg5, arg6) - ret0, _ := ret[0].(*chain0.MessagePrototype) + ret0, _ := ret[0].(*types.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1165,10 +1165,10 @@ func (mr *MockFullNodeMockRecorder) MsigSwapApprove(arg0, arg1, arg2, arg3, arg4 } // MsigSwapCancel mocks base method. -func (m *MockFullNode) MsigSwapCancel(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5 address.Address) (*chain0.MessagePrototype, error) { +func (m *MockFullNode) MsigSwapCancel(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5 address.Address) (*types.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigSwapCancel", arg0, arg1, arg2, arg3, arg4, arg5) - ret0, _ := ret[0].(*chain0.MessagePrototype) + ret0, _ := ret[0].(*types.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1180,10 +1180,10 @@ func (mr *MockFullNodeMockRecorder) MsigSwapCancel(arg0, arg1, arg2, arg3, arg4, } // MsigSwapPropose mocks base method. -func (m *MockFullNode) MsigSwapPropose(arg0 context.Context, arg1, arg2, arg3, arg4 address.Address) (*chain0.MessagePrototype, error) { +func (m *MockFullNode) MsigSwapPropose(arg0 context.Context, arg1, arg2, arg3, arg4 address.Address) (*types.MessagePrototype, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MsigSwapPropose", arg0, arg1, arg2, arg3, arg4) - ret0, _ := ret[0].(*chain0.MessagePrototype) + ret0, _ := ret[0].(*types.MessagePrototype) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1210,10 +1210,10 @@ func (mr *MockFullNodeMockRecorder) NetAddrsListen(arg0 interface{}) *gomock.Cal } // NetworkConnect mocks base method. -func (m *MockFullNode) NetworkConnect(arg0 context.Context, arg1 []string) (<-chan chain0.ConnectionResult, error) { +func (m *MockFullNode) NetworkConnect(arg0 context.Context, arg1 []string) (<-chan types.ConnectionResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NetworkConnect", arg0, arg1) - ret0, _ := ret[0].(<-chan chain0.ConnectionResult) + ret0, _ := ret[0].(<-chan types.ConnectionResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1311,10 +1311,10 @@ func (mr *MockFullNodeMockRecorder) NetworkGetPeerID(arg0 interface{}) *gomock.C } // NetworkPeers mocks base method. -func (m *MockFullNode) NetworkPeers(arg0 context.Context, arg1, arg2, arg3 bool) (*chain0.SwarmConnInfos, error) { +func (m *MockFullNode) NetworkPeers(arg0 context.Context, arg1, arg2, arg3 bool) (*types.SwarmConnInfos, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NetworkPeers", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain0.SwarmConnInfos) + ret0, _ := ret[0].(*types.SwarmConnInfos) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1386,10 +1386,10 @@ func (mr *MockFullNodeMockRecorder) PaychCollect(arg0, arg1 interface{}) *gomock } // PaychGet mocks base method. -func (m *MockFullNode) PaychGet(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int) (*chain0.ChannelInfo, error) { +func (m *MockFullNode) PaychGet(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int) (*types.ChannelInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychGet", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain0.ChannelInfo) + ret0, _ := ret[0].(*types.ChannelInfo) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1431,10 +1431,10 @@ func (mr *MockFullNodeMockRecorder) PaychList(arg0 interface{}) *gomock.Call { } // PaychNewPayment mocks base method. -func (m *MockFullNode) PaychNewPayment(arg0 context.Context, arg1, arg2 address.Address, arg3 []chain0.VoucherSpec) (*chain0.PaymentInfo, error) { +func (m *MockFullNode) PaychNewPayment(arg0 context.Context, arg1, arg2 address.Address, arg3 []types.VoucherSpec) (*types.PaymentInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychNewPayment", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain0.PaymentInfo) + ret0, _ := ret[0].(*types.PaymentInfo) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1461,10 +1461,10 @@ func (mr *MockFullNodeMockRecorder) PaychSettle(arg0, arg1 interface{}) *gomock. } // PaychStatus mocks base method. -func (m *MockFullNode) PaychStatus(arg0 context.Context, arg1 address.Address) (*chain0.Status, error) { +func (m *MockFullNode) PaychStatus(arg0 context.Context, arg1 address.Address) (*types.Status, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychStatus", arg0, arg1) - ret0, _ := ret[0].(*chain0.Status) + ret0, _ := ret[0].(*types.Status) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1520,10 +1520,10 @@ func (mr *MockFullNodeMockRecorder) PaychVoucherCheckValid(arg0, arg1, arg2 inte } // PaychVoucherCreate mocks base method. -func (m *MockFullNode) PaychVoucherCreate(arg0 context.Context, arg1 address.Address, arg2 big.Int, arg3 uint64) (*chain0.VoucherCreateResult, error) { +func (m *MockFullNode) PaychVoucherCreate(arg0 context.Context, arg1 address.Address, arg2 big.Int, arg3 uint64) (*types.VoucherCreateResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PaychVoucherCreate", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*chain0.VoucherCreateResult) + ret0, _ := ret[0].(*types.VoucherCreateResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1580,7 +1580,7 @@ func (mr *MockFullNodeMockRecorder) ProtocolParameters(arg0 interface{}) *gomock } // ResolveToKeyAddr mocks base method. -func (m *MockFullNode) ResolveToKeyAddr(arg0 context.Context, arg1 address.Address, arg2 *chain0.TipSet) (address.Address, error) { +func (m *MockFullNode) ResolveToKeyAddr(arg0 context.Context, arg1 address.Address, arg2 *types.TipSet) (address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ResolveToKeyAddr", arg0, arg1, arg2) ret0, _ := ret[0].(address.Address) @@ -1623,7 +1623,7 @@ func (mr *MockFullNodeMockRecorder) SetPassword(arg0, arg1 interface{}) *gomock. } // StateAccountKey mocks base method. -func (m *MockFullNode) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (address.Address, error) { +func (m *MockFullNode) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateAccountKey", arg0, arg1, arg2) ret0, _ := ret[0].(address.Address) @@ -1638,7 +1638,7 @@ func (mr *MockFullNodeMockRecorder) StateAccountKey(arg0, arg1, arg2 interface{} } // StateCall mocks base method. -func (m *MockFullNode) StateCall(arg0 context.Context, arg1 *chain0.Message, arg2 chain0.TipSetKey) (*types.InvocResult, error) { +func (m *MockFullNode) StateCall(arg0 context.Context, arg1 *internal.Message, arg2 types.TipSetKey) (*types.InvocResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateCall", arg0, arg1, arg2) ret0, _ := ret[0].(*types.InvocResult) @@ -1653,7 +1653,7 @@ func (mr *MockFullNodeMockRecorder) StateCall(arg0, arg1, arg2 interface{}) *gom } // StateCirculatingSupply mocks base method. -func (m *MockFullNode) StateCirculatingSupply(arg0 context.Context, arg1 chain0.TipSetKey) (big.Int, error) { +func (m *MockFullNode) StateCirculatingSupply(arg0 context.Context, arg1 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateCirculatingSupply", arg0, arg1) ret0, _ := ret[0].(big.Int) @@ -1668,7 +1668,7 @@ func (mr *MockFullNodeMockRecorder) StateCirculatingSupply(arg0, arg1 interface{ } // StateDealProviderCollateralBounds mocks base method. -func (m *MockFullNode) StateDealProviderCollateralBounds(arg0 context.Context, arg1 abi.PaddedPieceSize, arg2 bool, arg3 chain0.TipSetKey) (types.DealCollateralBounds, error) { +func (m *MockFullNode) StateDealProviderCollateralBounds(arg0 context.Context, arg1 abi.PaddedPieceSize, arg2 bool, arg3 types.TipSetKey) (types.DealCollateralBounds, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateDealProviderCollateralBounds", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(types.DealCollateralBounds) @@ -1683,10 +1683,10 @@ func (mr *MockFullNodeMockRecorder) StateDealProviderCollateralBounds(arg0, arg1 } // StateGetActor mocks base method. -func (m *MockFullNode) StateGetActor(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*chain0.Actor, error) { +func (m *MockFullNode) StateGetActor(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*internal.Actor, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateGetActor", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain0.Actor) + ret0, _ := ret[0].(*internal.Actor) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1698,7 +1698,7 @@ func (mr *MockFullNodeMockRecorder) StateGetActor(arg0, arg1, arg2 interface{}) } // StateGetRandomnessFromBeacon mocks base method. -func (m *MockFullNode) StateGetRandomnessFromBeacon(arg0 context.Context, arg1 crypto.DomainSeparationTag, arg2 abi.ChainEpoch, arg3 []byte, arg4 chain0.TipSetKey) (abi.Randomness, error) { +func (m *MockFullNode) StateGetRandomnessFromBeacon(arg0 context.Context, arg1 crypto.DomainSeparationTag, arg2 abi.ChainEpoch, arg3 []byte, arg4 types.TipSetKey) (abi.Randomness, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateGetRandomnessFromBeacon", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(abi.Randomness) @@ -1713,7 +1713,7 @@ func (mr *MockFullNodeMockRecorder) StateGetRandomnessFromBeacon(arg0, arg1, arg } // StateGetRandomnessFromTickets mocks base method. -func (m *MockFullNode) StateGetRandomnessFromTickets(arg0 context.Context, arg1 crypto.DomainSeparationTag, arg2 abi.ChainEpoch, arg3 []byte, arg4 chain0.TipSetKey) (abi.Randomness, error) { +func (m *MockFullNode) StateGetRandomnessFromTickets(arg0 context.Context, arg1 crypto.DomainSeparationTag, arg2 abi.ChainEpoch, arg3 []byte, arg4 types.TipSetKey) (abi.Randomness, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateGetRandomnessFromTickets", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(abi.Randomness) @@ -1728,7 +1728,7 @@ func (mr *MockFullNodeMockRecorder) StateGetRandomnessFromTickets(arg0, arg1, ar } // StateListActors mocks base method. -func (m *MockFullNode) StateListActors(arg0 context.Context, arg1 chain0.TipSetKey) ([]address.Address, error) { +func (m *MockFullNode) StateListActors(arg0 context.Context, arg1 types.TipSetKey) ([]address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateListActors", arg0, arg1) ret0, _ := ret[0].([]address.Address) @@ -1743,7 +1743,7 @@ func (mr *MockFullNodeMockRecorder) StateListActors(arg0, arg1 interface{}) *gom } // StateListMiners mocks base method. -func (m *MockFullNode) StateListMiners(arg0 context.Context, arg1 chain0.TipSetKey) ([]address.Address, error) { +func (m *MockFullNode) StateListMiners(arg0 context.Context, arg1 types.TipSetKey) ([]address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateListMiners", arg0, arg1) ret0, _ := ret[0].([]address.Address) @@ -1758,7 +1758,7 @@ func (mr *MockFullNodeMockRecorder) StateListMiners(arg0, arg1 interface{}) *gom } // StateLookupID mocks base method. -func (m *MockFullNode) StateLookupID(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (address.Address, error) { +func (m *MockFullNode) StateLookupID(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateLookupID", arg0, arg1, arg2) ret0, _ := ret[0].(address.Address) @@ -1773,7 +1773,7 @@ func (mr *MockFullNodeMockRecorder) StateLookupID(arg0, arg1, arg2 interface{}) } // StateMarketBalance mocks base method. -func (m *MockFullNode) StateMarketBalance(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (types.MarketBalance, error) { +func (m *MockFullNode) StateMarketBalance(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (types.MarketBalance, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketBalance", arg0, arg1, arg2) ret0, _ := ret[0].(types.MarketBalance) @@ -1788,7 +1788,7 @@ func (mr *MockFullNodeMockRecorder) StateMarketBalance(arg0, arg1, arg2 interfac } // StateMarketDeals mocks base method. -func (m *MockFullNode) StateMarketDeals(arg0 context.Context, arg1 chain0.TipSetKey) (map[string]types.MarketDeal, error) { +func (m *MockFullNode) StateMarketDeals(arg0 context.Context, arg1 types.TipSetKey) (map[string]types.MarketDeal, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketDeals", arg0, arg1) ret0, _ := ret[0].(map[string]types.MarketDeal) @@ -1803,7 +1803,7 @@ func (mr *MockFullNodeMockRecorder) StateMarketDeals(arg0, arg1 interface{}) *go } // StateMarketParticipants mocks base method. -func (m *MockFullNode) StateMarketParticipants(arg0 context.Context, arg1 chain0.TipSetKey) (map[string]types.MarketBalance, error) { +func (m *MockFullNode) StateMarketParticipants(arg0 context.Context, arg1 types.TipSetKey) (map[string]types.MarketBalance, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketParticipants", arg0, arg1) ret0, _ := ret[0].(map[string]types.MarketBalance) @@ -1818,7 +1818,7 @@ func (mr *MockFullNodeMockRecorder) StateMarketParticipants(arg0, arg1 interface } // StateMarketStorageDeal mocks base method. -func (m *MockFullNode) StateMarketStorageDeal(arg0 context.Context, arg1 abi.DealID, arg2 chain0.TipSetKey) (*types.MarketDeal, error) { +func (m *MockFullNode) StateMarketStorageDeal(arg0 context.Context, arg1 abi.DealID, arg2 types.TipSetKey) (*types.MarketDeal, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketStorageDeal", arg0, arg1, arg2) ret0, _ := ret[0].(*types.MarketDeal) @@ -1833,7 +1833,7 @@ func (mr *MockFullNodeMockRecorder) StateMarketStorageDeal(arg0, arg1, arg2 inte } // StateMinerActiveSectors mocks base method. -func (m *MockFullNode) StateMinerActiveSectors(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) ([]*miner0.SectorOnChainInfo, error) { +func (m *MockFullNode) StateMinerActiveSectors(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) ([]*miner0.SectorOnChainInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerActiveSectors", arg0, arg1, arg2) ret0, _ := ret[0].([]*miner0.SectorOnChainInfo) @@ -1848,7 +1848,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerActiveSectors(arg0, arg1, arg2 int } // StateMinerAvailableBalance mocks base method. -func (m *MockFullNode) StateMinerAvailableBalance(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (big.Int, error) { +func (m *MockFullNode) StateMinerAvailableBalance(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerAvailableBalance", arg0, arg1, arg2) ret0, _ := ret[0].(big.Int) @@ -1863,7 +1863,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerAvailableBalance(arg0, arg1, arg2 } // StateMinerDeadlines mocks base method. -func (m *MockFullNode) StateMinerDeadlines(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) ([]types.Deadline, error) { +func (m *MockFullNode) StateMinerDeadlines(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) ([]types.Deadline, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerDeadlines", arg0, arg1, arg2) ret0, _ := ret[0].([]types.Deadline) @@ -1878,7 +1878,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerDeadlines(arg0, arg1, arg2 interfa } // StateMinerFaults mocks base method. -func (m *MockFullNode) StateMinerFaults(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (bitfield.BitField, error) { +func (m *MockFullNode) StateMinerFaults(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (bitfield.BitField, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerFaults", arg0, arg1, arg2) ret0, _ := ret[0].(bitfield.BitField) @@ -1893,7 +1893,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerFaults(arg0, arg1, arg2 interface{ } // StateMinerInfo mocks base method. -func (m *MockFullNode) StateMinerInfo(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (miner0.MinerInfo, error) { +func (m *MockFullNode) StateMinerInfo(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (miner0.MinerInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerInfo", arg0, arg1, arg2) ret0, _ := ret[0].(miner0.MinerInfo) @@ -1908,7 +1908,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerInfo(arg0, arg1, arg2 interface{}) } // StateMinerInitialPledgeCollateral mocks base method. -func (m *MockFullNode) StateMinerInitialPledgeCollateral(arg0 context.Context, arg1 address.Address, arg2 miner.SectorPreCommitInfo, arg3 chain0.TipSetKey) (big.Int, error) { +func (m *MockFullNode) StateMinerInitialPledgeCollateral(arg0 context.Context, arg1 address.Address, arg2 miner.SectorPreCommitInfo, arg3 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerInitialPledgeCollateral", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(big.Int) @@ -1923,7 +1923,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerInitialPledgeCollateral(arg0, arg1 } // StateMinerPartitions mocks base method. -func (m *MockFullNode) StateMinerPartitions(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 chain0.TipSetKey) ([]types.Partition, error) { +func (m *MockFullNode) StateMinerPartitions(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 types.TipSetKey) ([]types.Partition, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerPartitions", arg0, arg1, arg2, arg3) ret0, _ := ret[0].([]types.Partition) @@ -1938,7 +1938,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerPartitions(arg0, arg1, arg2, arg3 } // StateMinerPower mocks base method. -func (m *MockFullNode) StateMinerPower(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*types.MinerPower, error) { +func (m *MockFullNode) StateMinerPower(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*types.MinerPower, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerPower", arg0, arg1, arg2) ret0, _ := ret[0].(*types.MinerPower) @@ -1953,7 +1953,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerPower(arg0, arg1, arg2 interface{} } // StateMinerPreCommitDepositForPower mocks base method. -func (m *MockFullNode) StateMinerPreCommitDepositForPower(arg0 context.Context, arg1 address.Address, arg2 miner.SectorPreCommitInfo, arg3 chain0.TipSetKey) (big.Int, error) { +func (m *MockFullNode) StateMinerPreCommitDepositForPower(arg0 context.Context, arg1 address.Address, arg2 miner.SectorPreCommitInfo, arg3 types.TipSetKey) (big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerPreCommitDepositForPower", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(big.Int) @@ -1968,7 +1968,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerPreCommitDepositForPower(arg0, arg } // StateMinerProvingDeadline mocks base method. -func (m *MockFullNode) StateMinerProvingDeadline(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*dline.Info, error) { +func (m *MockFullNode) StateMinerProvingDeadline(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*dline.Info, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerProvingDeadline", arg0, arg1, arg2) ret0, _ := ret[0].(*dline.Info) @@ -1983,7 +1983,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerProvingDeadline(arg0, arg1, arg2 i } // StateMinerRecoveries mocks base method. -func (m *MockFullNode) StateMinerRecoveries(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (bitfield.BitField, error) { +func (m *MockFullNode) StateMinerRecoveries(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (bitfield.BitField, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerRecoveries", arg0, arg1, arg2) ret0, _ := ret[0].(bitfield.BitField) @@ -1998,7 +1998,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerRecoveries(arg0, arg1, arg2 interf } // StateMinerSectorAllocated mocks base method. -func (m *MockFullNode) StateMinerSectorAllocated(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (bool, error) { +func (m *MockFullNode) StateMinerSectorAllocated(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 types.TipSetKey) (bool, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerSectorAllocated", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(bool) @@ -2013,7 +2013,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerSectorAllocated(arg0, arg1, arg2, } // StateMinerSectorCount mocks base method. -func (m *MockFullNode) StateMinerSectorCount(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (types.MinerSectors, error) { +func (m *MockFullNode) StateMinerSectorCount(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (types.MinerSectors, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerSectorCount", arg0, arg1, arg2) ret0, _ := ret[0].(types.MinerSectors) @@ -2028,7 +2028,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerSectorCount(arg0, arg1, arg2 inter } // StateMinerSectorSize mocks base method. -func (m *MockFullNode) StateMinerSectorSize(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (abi.SectorSize, error) { +func (m *MockFullNode) StateMinerSectorSize(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (abi.SectorSize, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerSectorSize", arg0, arg1, arg2) ret0, _ := ret[0].(abi.SectorSize) @@ -2043,7 +2043,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerSectorSize(arg0, arg1, arg2 interf } // StateMinerSectors mocks base method. -func (m *MockFullNode) StateMinerSectors(arg0 context.Context, arg1 address.Address, arg2 *bitfield.BitField, arg3 chain0.TipSetKey) ([]*miner0.SectorOnChainInfo, error) { +func (m *MockFullNode) StateMinerSectors(arg0 context.Context, arg1 address.Address, arg2 *bitfield.BitField, arg3 types.TipSetKey) ([]*miner0.SectorOnChainInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerSectors", arg0, arg1, arg2, arg3) ret0, _ := ret[0].([]*miner0.SectorOnChainInfo) @@ -2058,7 +2058,7 @@ func (mr *MockFullNodeMockRecorder) StateMinerSectors(arg0, arg1, arg2, arg3 int } // StateMinerWorkerAddress mocks base method. -func (m *MockFullNode) StateMinerWorkerAddress(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (address.Address, error) { +func (m *MockFullNode) StateMinerWorkerAddress(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerWorkerAddress", arg0, arg1, arg2) ret0, _ := ret[0].(address.Address) @@ -2088,7 +2088,7 @@ func (mr *MockFullNodeMockRecorder) StateNetworkName(arg0 interface{}) *gomock.C } // StateNetworkVersion mocks base method. -func (m *MockFullNode) StateNetworkVersion(arg0 context.Context, arg1 chain0.TipSetKey) (network.Version, error) { +func (m *MockFullNode) StateNetworkVersion(arg0 context.Context, arg1 types.TipSetKey) (network.Version, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateNetworkVersion", arg0, arg1) ret0, _ := ret[0].(network.Version) @@ -2103,7 +2103,7 @@ func (mr *MockFullNodeMockRecorder) StateNetworkVersion(arg0, arg1 interface{}) } // StateSearchMsg mocks base method. -func (m *MockFullNode) StateSearchMsg(arg0 context.Context, arg1 chain0.TipSetKey, arg2 cid.Cid, arg3 abi.ChainEpoch, arg4 bool) (*types.MsgLookup, error) { +func (m *MockFullNode) StateSearchMsg(arg0 context.Context, arg1 types.TipSetKey, arg2 cid.Cid, arg3 abi.ChainEpoch, arg4 bool) (*types.MsgLookup, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateSearchMsg", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(*types.MsgLookup) @@ -2118,7 +2118,7 @@ func (mr *MockFullNodeMockRecorder) StateSearchMsg(arg0, arg1, arg2, arg3, arg4 } // StateSectorExpiration mocks base method. -func (m *MockFullNode) StateSectorExpiration(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (*miner0.SectorExpiration, error) { +func (m *MockFullNode) StateSectorExpiration(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 types.TipSetKey) (*miner0.SectorExpiration, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateSectorExpiration", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*miner0.SectorExpiration) @@ -2133,7 +2133,7 @@ func (mr *MockFullNodeMockRecorder) StateSectorExpiration(arg0, arg1, arg2, arg3 } // StateSectorGetInfo mocks base method. -func (m *MockFullNode) StateSectorGetInfo(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (*miner0.SectorOnChainInfo, error) { +func (m *MockFullNode) StateSectorGetInfo(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 types.TipSetKey) (*miner0.SectorOnChainInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateSectorGetInfo", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*miner0.SectorOnChainInfo) @@ -2148,7 +2148,7 @@ func (mr *MockFullNodeMockRecorder) StateSectorGetInfo(arg0, arg1, arg2, arg3 in } // StateSectorPartition mocks base method. -func (m *MockFullNode) StateSectorPartition(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (*miner0.SectorLocation, error) { +func (m *MockFullNode) StateSectorPartition(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 types.TipSetKey) (*miner0.SectorLocation, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateSectorPartition", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*miner0.SectorLocation) @@ -2163,7 +2163,7 @@ func (mr *MockFullNodeMockRecorder) StateSectorPartition(arg0, arg1, arg2, arg3 } // StateSectorPreCommitInfo mocks base method. -func (m *MockFullNode) StateSectorPreCommitInfo(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 chain0.TipSetKey) (miner0.SectorPreCommitOnChainInfo, error) { +func (m *MockFullNode) StateSectorPreCommitInfo(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 types.TipSetKey) (miner0.SectorPreCommitOnChainInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateSectorPreCommitInfo", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(miner0.SectorPreCommitOnChainInfo) @@ -2178,10 +2178,10 @@ func (mr *MockFullNodeMockRecorder) StateSectorPreCommitInfo(arg0, arg1, arg2, a } // StateVMCirculatingSupplyInternal mocks base method. -func (m *MockFullNode) StateVMCirculatingSupplyInternal(arg0 context.Context, arg1 chain0.TipSetKey) (chain0.CirculatingSupply, error) { +func (m *MockFullNode) StateVMCirculatingSupplyInternal(arg0 context.Context, arg1 types.TipSetKey) (types.CirculatingSupply, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateVMCirculatingSupplyInternal", arg0, arg1) - ret0, _ := ret[0].(chain0.CirculatingSupply) + ret0, _ := ret[0].(types.CirculatingSupply) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2193,7 +2193,7 @@ func (mr *MockFullNodeMockRecorder) StateVMCirculatingSupplyInternal(arg0, arg1 } // StateVerifiedClientStatus mocks base method. -func (m *MockFullNode) StateVerifiedClientStatus(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*big.Int, error) { +func (m *MockFullNode) StateVerifiedClientStatus(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateVerifiedClientStatus", arg0, arg1, arg2) ret0, _ := ret[0].(*big.Int) @@ -2208,7 +2208,7 @@ func (mr *MockFullNodeMockRecorder) StateVerifiedClientStatus(arg0, arg1, arg2 i } // StateVerifiedRegistryRootKey mocks base method. -func (m *MockFullNode) StateVerifiedRegistryRootKey(arg0 context.Context, arg1 chain0.TipSetKey) (address.Address, error) { +func (m *MockFullNode) StateVerifiedRegistryRootKey(arg0 context.Context, arg1 types.TipSetKey) (address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateVerifiedRegistryRootKey", arg0, arg1) ret0, _ := ret[0].(address.Address) @@ -2223,7 +2223,7 @@ func (mr *MockFullNodeMockRecorder) StateVerifiedRegistryRootKey(arg0, arg1 inte } // StateVerifierStatus mocks base method. -func (m *MockFullNode) StateVerifierStatus(arg0 context.Context, arg1 address.Address, arg2 chain0.TipSetKey) (*big.Int, error) { +func (m *MockFullNode) StateVerifierStatus(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*big.Int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateVerifierStatus", arg0, arg1, arg2) ret0, _ := ret[0].(*big.Int) @@ -2268,7 +2268,7 @@ func (mr *MockFullNodeMockRecorder) SyncState(arg0 interface{}) *gomock.Call { } // SyncSubmitBlock mocks base method. -func (m *MockFullNode) SyncSubmitBlock(arg0 context.Context, arg1 *chain0.BlockMsg) error { +func (m *MockFullNode) SyncSubmitBlock(arg0 context.Context, arg1 *types.BlockMsg) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SyncSubmitBlock", arg0, arg1) ret0, _ := ret[0].(error) @@ -2325,7 +2325,7 @@ func (mr *MockFullNodeMockRecorder) Verify(arg0, arg1, arg2 interface{}) *gomock } // VerifyEntry mocks base method. -func (m *MockFullNode) VerifyEntry(arg0, arg1 *chain0.BeaconEntry, arg2 abi.ChainEpoch) bool { +func (m *MockFullNode) VerifyEntry(arg0, arg1 *types.BeaconEntry, arg2 abi.ChainEpoch) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "VerifyEntry", arg0, arg1, arg2) ret0, _ := ret[0].(bool) @@ -2398,10 +2398,10 @@ func (mr *MockFullNodeMockRecorder) WalletDefaultAddress(arg0 interface{}) *gomo } // WalletExport mocks base method. -func (m *MockFullNode) WalletExport(arg0 context.Context, arg1 address.Address, arg2 string) (*chain0.KeyInfo, error) { +func (m *MockFullNode) WalletExport(arg0 context.Context, arg1 address.Address, arg2 string) (*types.KeyInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WalletExport", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain0.KeyInfo) + ret0, _ := ret[0].(*types.KeyInfo) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -2428,7 +2428,7 @@ func (mr *MockFullNodeMockRecorder) WalletHas(arg0, arg1 interface{}) *gomock.Ca } // WalletImport mocks base method. -func (m *MockFullNode) WalletImport(arg0 context.Context, arg1 *chain0.KeyInfo) (address.Address, error) { +func (m *MockFullNode) WalletImport(arg0 context.Context, arg1 *types.KeyInfo) (address.Address, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WalletImport", arg0, arg1) ret0, _ := ret[0].(address.Address) @@ -2472,7 +2472,7 @@ func (mr *MockFullNodeMockRecorder) WalletSetDefault(arg0, arg1 interface{}) *go } // WalletSign mocks base method. -func (m *MockFullNode) WalletSign(arg0 context.Context, arg1 address.Address, arg2 []byte, arg3 chain0.MsgMeta) (*crypto.Signature, error) { +func (m *MockFullNode) WalletSign(arg0 context.Context, arg1 address.Address, arg2 []byte, arg3 types.MsgMeta) (*crypto.Signature, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WalletSign", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*crypto.Signature) @@ -2487,10 +2487,10 @@ func (mr *MockFullNodeMockRecorder) WalletSign(arg0, arg1, arg2, arg3 interface{ } // WalletSignMessage mocks base method. -func (m *MockFullNode) WalletSignMessage(arg0 context.Context, arg1 address.Address, arg2 *chain0.Message) (*chain0.SignedMessage, error) { +func (m *MockFullNode) WalletSignMessage(arg0 context.Context, arg1 address.Address, arg2 *internal.Message) (*types.SignedMessage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WalletSignMessage", arg0, arg1, arg2) - ret0, _ := ret[0].(*chain0.SignedMessage) + ret0, _ := ret[0].(*types.SignedMessage) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/venus-shared/api/v0-api-document.md b/venus-shared/api/v0-api-document.md index 8f18b3b3a7..0ac610966f 100644 --- a/venus-shared/api/v0-api-document.md +++ b/venus-shared/api/v0-api-document.md @@ -231,7 +231,7 @@ Response: ```json { "Version": "string value", - "APIVersion": 131328 + "APIVersion": 131584 } ``` @@ -1705,6 +1705,7 @@ Response: { "SealProof": 8, "SectorNumber": 9, + "SectorKey": null, "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } diff --git a/venus-shared/api/v1-api-document.md b/venus-shared/api/v1-api-document.md index 9467afd29c..bed3048ee5 100644 --- a/venus-shared/api/v1-api-document.md +++ b/venus-shared/api/v1-api-document.md @@ -234,7 +234,7 @@ Response: ```json { "Version": "string value", - "APIVersion": 131328 + "APIVersion": 131584 } ``` @@ -1737,6 +1737,7 @@ Response: { "SealProof": 8, "SectorNumber": 9, + "SectorKey": null, "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } From 6aa06dbb2453afa63a6d47715b446b9235686c32 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Thu, 20 Jan 2022 10:09:00 +0800 Subject: [PATCH 131/167] bump version to v1.2.0-rc4 (#4733) --- pkg/constants/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/constants/version.go b/pkg/constants/version.go index c1dd53ce64..a7e7304e79 100644 --- a/pkg/constants/version.go +++ b/pkg/constants/version.go @@ -7,7 +7,7 @@ import ( ) // BuildVersion is the local build version, set by build system -const BuildVersion = "1.2.0-rc3" +const BuildVersion = "1.2.0-rc4" // software version func UserVersion() string { From 8f0a0cf37b7b925337ffcc8dc76565fd6f2b67f1 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Thu, 20 Jan 2022 10:15:18 +0800 Subject: [PATCH 132/167] Remove unused code (#4732) * remove fixtures/proof-params/parameters.json * remove unused api code * remove pkg/types --- .circleci/config.yml | 19 - CODEWALK.md | 9 +- Makefile | 30 +- app/client/apiface/blockservice.go | 20 - app/client/apiface/blockstore.go | 20 - app/client/apiface/chain.go | 213 --- app/client/apiface/config.go | 10 - app/client/apiface/discovery.go | 4 - app/client/apiface/fullnode.go | 31 - app/client/apiface/jwtauth.go | 14 - app/client/apiface/market.go | 12 - app/client/apiface/mining.go | 16 - app/client/apiface/mpool.go | 66 - app/client/apiface/multisig.go | 42 - app/client/apiface/network.go | 35 - app/client/apiface/paych.go | 99 -- app/client/apiface/syncer.go | 28 - app/client/apiface/v0api/blockservice.go | 20 - app/client/apiface/v0api/blockstore.go | 20 - app/client/apiface/v0api/chain.go | 179 -- app/client/apiface/v0api/config.go | 10 - app/client/apiface/v0api/discovery.go | 4 - app/client/apiface/v0api/fullnode.go | 31 - app/client/apiface/v0api/jwtauth.go | 14 - app/client/apiface/v0api/market.go | 12 - app/client/apiface/v0api/mining.go | 16 - app/client/apiface/v0api/mpool.go | 57 - app/client/apiface/v0api/multisig.go | 46 - app/client/apiface/v0api/network.go | 35 - app/client/apiface/v0api/paych.go | 99 -- app/client/apiface/v0api/syncer.go | 28 - app/client/apiface/v0api/wallet.go | 43 - app/client/apiface/wallet.go | 44 - app/client/client_test.go | 119 -- app/client/full.go | 1000 ------------ app/client/node.go | 12 +- app/client/v0api/full.go | 980 ----------- app/node/rpc.go | 6 +- app/submodule/apitypes/blockstore.go | 6 - app/submodule/apitypes/chain.go | 90 - .../apitypes/checkstatuscode_string.go | 35 - app/submodule/apitypes/mining.go | 33 - app/submodule/apitypes/mpool.go | 43 - app/submodule/apitypes/network.go | 14 - app/submodule/apitypes/paych.go | 29 - app/submodule/apitypes/syncer.go | 66 - build/main.go | 10 - fixtures/proof-params/parameters.json | 152 -- pkg/types/chain_info.go | 32 - pkg/types/gas_trace.go | 102 -- pkg/types/gen/main.go | 105 -- pkg/types/internal/actor.go | 59 - pkg/types/internal/actor_test.go | 71 - pkg/types/internal/address.go | 15 - pkg/types/internal/atto_fil.go | 53 - pkg/types/internal/atto_fil_test.go | 206 --- pkg/types/internal/beacon.go | 6 - pkg/types/internal/bigint.go | 99 -- pkg/types/internal/bigint_test.go | 103 -- pkg/types/internal/block.go | 218 --- pkg/types/internal/block_message.go | 9 - pkg/types/internal/block_test.go | 471 ------ pkg/types/internal/blockmsg.go | 28 - pkg/types/internal/cbor_gen.go | 1444 ----------------- pkg/types/internal/fil.go | 137 -- pkg/types/internal/fil_test.go | 114 -- pkg/types/internal/full_block.go | 18 - pkg/types/internal/fulltipset.go | 71 - pkg/types/internal/message.go | 366 ----- pkg/types/internal/message_test.go | 102 -- pkg/types/internal/not_found.go | 6 - pkg/types/internal/signed_message.go | 155 -- pkg/types/internal/signed_message_test.go | 99 -- pkg/types/internal/signer.go | 14 - pkg/types/internal/testing.go | 363 ----- pkg/types/internal/testing_messages.go | 102 -- pkg/types/internal/testing_test.go | 30 - pkg/types/internal/ticket.go | 42 - pkg/types/internal/tipset.go | 289 ---- pkg/types/internal/tipset_key.go | 218 --- pkg/types/internal/tipset_key_test.go | 74 - pkg/types/internal/tipset_test.go | 221 --- pkg/types/internal/vrf.go | 223 --- pkg/types/keystore.go | 58 - pkg/types/paych.go | 42 - pkg/types/specactors/adt/adt.go | 29 - pkg/types/specactors/adt/diff_adt.go | 122 -- pkg/types/specactors/adt/diff_adt_test.go | 304 ---- pkg/types/specactors/adt/store.go | 17 - pkg/types/specactors/aerrors/error.go | 69 - pkg/types/specactors/aerrors/error_test.go | 39 - pkg/types/specactors/aerrors/wrap.go | 203 --- pkg/types/specactors/agen/main.go | 223 --- pkg/types/specactors/builtin/README.md | 29 - .../specactors/builtin/account/account.go | 155 -- .../builtin/account/actor.go.template | 66 - .../builtin/account/state.go.template | 42 - pkg/types/specactors/builtin/account/v0.go | 42 - pkg/types/specactors/builtin/account/v2.go | 42 - pkg/types/specactors/builtin/account/v3.go | 42 - pkg/types/specactors/builtin/account/v4.go | 42 - pkg/types/specactors/builtin/account/v5.go | 42 - pkg/types/specactors/builtin/account/v6.go | 42 - pkg/types/specactors/builtin/account/v7.go | 42 - pkg/types/specactors/builtin/builtin.go | 361 ----- .../specactors/builtin/builtin.go.template | 146 -- .../specactors/builtin/cron/actor.go.template | 44 - pkg/types/specactors/builtin/cron/cron.go | 90 - .../specactors/builtin/cron/state.go.template | 37 - pkg/types/specactors/builtin/cron/v0.go | 37 - pkg/types/specactors/builtin/cron/v2.go | 37 - pkg/types/specactors/builtin/cron/v3.go | 37 - pkg/types/specactors/builtin/cron/v4.go | 37 - pkg/types/specactors/builtin/cron/v5.go | 37 - pkg/types/specactors/builtin/cron/v6.go | 37 - pkg/types/specactors/builtin/cron/v7.go | 37 - .../specactors/builtin/init/actor.go.template | 91 -- pkg/types/specactors/builtin/init/diff.go | 152 -- pkg/types/specactors/builtin/init/init.go | 179 -- .../specactors/builtin/init/state.go.template | 125 -- pkg/types/specactors/builtin/init/v0.go | 113 -- pkg/types/specactors/builtin/init/v2.go | 113 -- pkg/types/specactors/builtin/init/v3.go | 115 -- pkg/types/specactors/builtin/init/v4.go | 115 -- pkg/types/specactors/builtin/init/v5.go | 115 -- pkg/types/specactors/builtin/init/v6.go | 115 -- pkg/types/specactors/builtin/init/v7.go | 115 -- .../builtin/market/actor.go.template | 206 --- pkg/types/specactors/builtin/market/diff.go | 91 -- pkg/types/specactors/builtin/market/market.go | 313 ---- .../builtin/market/state.go.template | 269 --- pkg/types/specactors/builtin/market/v0.go | 260 --- pkg/types/specactors/builtin/market/v2.go | 260 --- pkg/types/specactors/builtin/market/v3.go | 255 --- pkg/types/specactors/builtin/market/v4.go | 255 --- pkg/types/specactors/builtin/market/v5.go | 255 --- pkg/types/specactors/builtin/market/v6.go | 254 --- pkg/types/specactors/builtin/market/v7.go | 254 --- .../builtin/miner/actor.go.template | 325 ---- pkg/types/specactors/builtin/miner/diff.go | 127 -- .../builtin/miner/diff_deadlines.go | 176 -- pkg/types/specactors/builtin/miner/miner.go | 414 ----- .../builtin/miner/state.go.template | 605 ------- pkg/types/specactors/builtin/miner/util.go | 88 - pkg/types/specactors/builtin/miner/v0.go | 535 ------ pkg/types/specactors/builtin/miner/v2.go | 571 ------- pkg/types/specactors/builtin/miner/v3.go | 572 ------- pkg/types/specactors/builtin/miner/v4.go | 572 ------- pkg/types/specactors/builtin/miner/v5.go | 572 ------- pkg/types/specactors/builtin/miner/v6.go | 572 ------- pkg/types/specactors/builtin/miner/v7.go | 573 ------- .../builtin/multisig/actor.go.template | 143 -- pkg/types/specactors/builtin/multisig/diff.go | 134 -- .../builtin/multisig/message.go.template | 148 -- .../specactors/builtin/multisig/message0.go | 144 -- .../specactors/builtin/multisig/message2.go | 73 - .../specactors/builtin/multisig/message3.go | 73 - .../specactors/builtin/multisig/message4.go | 73 - .../specactors/builtin/multisig/message5.go | 73 - .../specactors/builtin/multisig/message6.go | 73 - .../specactors/builtin/multisig/message7.go | 73 - .../specactors/builtin/multisig/multisig.go | 250 --- .../builtin/multisig/state.go.template | 129 -- pkg/types/specactors/builtin/multisig/v0.go | 119 -- pkg/types/specactors/builtin/multisig/v2.go | 119 -- pkg/types/specactors/builtin/multisig/v3.go | 121 -- pkg/types/specactors/builtin/multisig/v4.go | 121 -- pkg/types/specactors/builtin/multisig/v5.go | 121 -- pkg/types/specactors/builtin/multisig/v6.go | 121 -- pkg/types/specactors/builtin/multisig/v7.go | 121 -- .../builtin/paych/actor.go.template | 134 -- .../builtin/paych/message.go.template | 76 - .../specactors/builtin/paych/message0.go | 76 - .../specactors/builtin/paych/message2.go | 76 - .../specactors/builtin/paych/message3.go | 76 - .../specactors/builtin/paych/message4.go | 76 - .../specactors/builtin/paych/message5.go | 76 - .../specactors/builtin/paych/message6.go | 76 - .../specactors/builtin/paych/message7.go | 76 - .../specactors/builtin/paych/mock/mock.go | 93 -- pkg/types/specactors/builtin/paych/paych.go | 241 --- .../builtin/paych/state.go.template | 116 -- pkg/types/specactors/builtin/paych/v0.go | 116 -- pkg/types/specactors/builtin/paych/v2.go | 116 -- pkg/types/specactors/builtin/paych/v3.go | 116 -- pkg/types/specactors/builtin/paych/v4.go | 116 -- pkg/types/specactors/builtin/paych/v5.go | 116 -- pkg/types/specactors/builtin/paych/v6.go | 116 -- pkg/types/specactors/builtin/paych/v7.go | 132 -- .../builtin/power/actor.go.template | 109 -- pkg/types/specactors/builtin/power/diff.go | 117 -- pkg/types/specactors/builtin/power/power.go | 198 --- .../builtin/power/state.go.template | 203 --- pkg/types/specactors/builtin/power/v0.go | 192 --- pkg/types/specactors/builtin/power/v2.go | 192 --- pkg/types/specactors/builtin/power/v3.go | 189 --- pkg/types/specactors/builtin/power/v4.go | 189 --- pkg/types/specactors/builtin/power/v5.go | 189 --- pkg/types/specactors/builtin/power/v6.go | 189 --- pkg/types/specactors/builtin/power/v7.go | 189 --- .../builtin/reward/actor.go.template | 85 - pkg/types/specactors/builtin/reward/reward.go | 174 -- .../builtin/reward/state.go.template | 115 -- pkg/types/specactors/builtin/reward/v0.go | 97 -- pkg/types/specactors/builtin/reward/v2.go | 100 -- pkg/types/specactors/builtin/reward/v3.go | 100 -- pkg/types/specactors/builtin/reward/v4.go | 100 -- pkg/types/specactors/builtin/reward/v5.go | 100 -- pkg/types/specactors/builtin/reward/v6.go | 100 -- pkg/types/specactors/builtin/reward/v7.go | 100 -- .../builtin/system/actor.go.template | 43 - .../builtin/system/state.go.template | 37 - pkg/types/specactors/builtin/system/system.go | 89 - pkg/types/specactors/builtin/system/v0.go | 37 - pkg/types/specactors/builtin/system/v2.go | 37 - pkg/types/specactors/builtin/system/v3.go | 37 - pkg/types/specactors/builtin/system/v4.go | 37 - pkg/types/specactors/builtin/system/v5.go | 37 - pkg/types/specactors/builtin/system/v6.go | 37 - pkg/types/specactors/builtin/system/v7.go | 37 - .../builtin/verifreg/actor.go.template | 77 - .../builtin/verifreg/state.go.template | 84 - pkg/types/specactors/builtin/verifreg/util.go | 54 - pkg/types/specactors/builtin/verifreg/v0.go | 76 - pkg/types/specactors/builtin/verifreg/v2.go | 76 - pkg/types/specactors/builtin/verifreg/v3.go | 77 - pkg/types/specactors/builtin/verifreg/v4.go | 77 - pkg/types/specactors/builtin/verifreg/v5.go | 77 - pkg/types/specactors/builtin/verifreg/v6.go | 77 - pkg/types/specactors/builtin/verifreg/v7.go | 77 - .../specactors/builtin/verifreg/verifreg.go | 165 -- pkg/types/specactors/params.go | 19 - pkg/types/specactors/policy/policy.go | 609 ------- .../specactors/policy/policy.go.template | 337 ---- pkg/types/specactors/policy/policy_test.go | 86 - pkg/types/specactors/version.go | 59 - pkg/types/testing.go | 1 - pkg/types/types.go | 67 - pkg/types/types_gen.go | 107 -- scripts/check_api_file_change.sh | 25 - tools/client/main.go | 133 -- tools/gen/api/proxygen.go | 537 ------ tools/gen/api/stable_method_info.json | 531 ------ tools/gen_cbor/main.go | 21 - 244 files changed, 25 insertions(+), 33065 deletions(-) delete mode 100644 app/client/apiface/blockservice.go delete mode 100644 app/client/apiface/blockstore.go delete mode 100644 app/client/apiface/chain.go delete mode 100644 app/client/apiface/config.go delete mode 100644 app/client/apiface/discovery.go delete mode 100644 app/client/apiface/fullnode.go delete mode 100644 app/client/apiface/jwtauth.go delete mode 100644 app/client/apiface/market.go delete mode 100644 app/client/apiface/mining.go delete mode 100644 app/client/apiface/mpool.go delete mode 100644 app/client/apiface/multisig.go delete mode 100644 app/client/apiface/network.go delete mode 100644 app/client/apiface/paych.go delete mode 100644 app/client/apiface/syncer.go delete mode 100644 app/client/apiface/v0api/blockservice.go delete mode 100644 app/client/apiface/v0api/blockstore.go delete mode 100644 app/client/apiface/v0api/chain.go delete mode 100644 app/client/apiface/v0api/config.go delete mode 100644 app/client/apiface/v0api/discovery.go delete mode 100644 app/client/apiface/v0api/fullnode.go delete mode 100644 app/client/apiface/v0api/jwtauth.go delete mode 100644 app/client/apiface/v0api/market.go delete mode 100644 app/client/apiface/v0api/mining.go delete mode 100644 app/client/apiface/v0api/mpool.go delete mode 100644 app/client/apiface/v0api/multisig.go delete mode 100644 app/client/apiface/v0api/network.go delete mode 100644 app/client/apiface/v0api/paych.go delete mode 100644 app/client/apiface/v0api/syncer.go delete mode 100644 app/client/apiface/v0api/wallet.go delete mode 100644 app/client/apiface/wallet.go delete mode 100644 app/client/client_test.go delete mode 100644 app/client/full.go delete mode 100644 app/client/v0api/full.go delete mode 100644 app/submodule/apitypes/blockstore.go delete mode 100644 app/submodule/apitypes/chain.go delete mode 100644 app/submodule/apitypes/checkstatuscode_string.go delete mode 100644 app/submodule/apitypes/mining.go delete mode 100644 app/submodule/apitypes/mpool.go delete mode 100644 app/submodule/apitypes/network.go delete mode 100644 app/submodule/apitypes/paych.go delete mode 100644 app/submodule/apitypes/syncer.go delete mode 100644 fixtures/proof-params/parameters.json delete mode 100644 pkg/types/chain_info.go delete mode 100644 pkg/types/gas_trace.go delete mode 100644 pkg/types/gen/main.go delete mode 100644 pkg/types/internal/actor.go delete mode 100644 pkg/types/internal/actor_test.go delete mode 100644 pkg/types/internal/address.go delete mode 100644 pkg/types/internal/atto_fil.go delete mode 100644 pkg/types/internal/atto_fil_test.go delete mode 100644 pkg/types/internal/beacon.go delete mode 100644 pkg/types/internal/bigint.go delete mode 100644 pkg/types/internal/bigint_test.go delete mode 100644 pkg/types/internal/block.go delete mode 100644 pkg/types/internal/block_message.go delete mode 100644 pkg/types/internal/block_test.go delete mode 100644 pkg/types/internal/blockmsg.go delete mode 100644 pkg/types/internal/cbor_gen.go delete mode 100644 pkg/types/internal/fil.go delete mode 100644 pkg/types/internal/fil_test.go delete mode 100644 pkg/types/internal/full_block.go delete mode 100644 pkg/types/internal/fulltipset.go delete mode 100644 pkg/types/internal/message.go delete mode 100644 pkg/types/internal/message_test.go delete mode 100644 pkg/types/internal/not_found.go delete mode 100644 pkg/types/internal/signed_message.go delete mode 100644 pkg/types/internal/signed_message_test.go delete mode 100644 pkg/types/internal/signer.go delete mode 100644 pkg/types/internal/testing.go delete mode 100644 pkg/types/internal/testing_messages.go delete mode 100644 pkg/types/internal/testing_test.go delete mode 100644 pkg/types/internal/ticket.go delete mode 100644 pkg/types/internal/tipset.go delete mode 100644 pkg/types/internal/tipset_key.go delete mode 100644 pkg/types/internal/tipset_key_test.go delete mode 100644 pkg/types/internal/tipset_test.go delete mode 100644 pkg/types/internal/vrf.go delete mode 100644 pkg/types/keystore.go delete mode 100644 pkg/types/paych.go delete mode 100644 pkg/types/specactors/adt/adt.go delete mode 100644 pkg/types/specactors/adt/diff_adt.go delete mode 100644 pkg/types/specactors/adt/diff_adt_test.go delete mode 100644 pkg/types/specactors/adt/store.go delete mode 100644 pkg/types/specactors/aerrors/error.go delete mode 100644 pkg/types/specactors/aerrors/error_test.go delete mode 100644 pkg/types/specactors/aerrors/wrap.go delete mode 100644 pkg/types/specactors/agen/main.go delete mode 100644 pkg/types/specactors/builtin/README.md delete mode 100644 pkg/types/specactors/builtin/account/account.go delete mode 100644 pkg/types/specactors/builtin/account/actor.go.template delete mode 100644 pkg/types/specactors/builtin/account/state.go.template delete mode 100644 pkg/types/specactors/builtin/account/v0.go delete mode 100644 pkg/types/specactors/builtin/account/v2.go delete mode 100644 pkg/types/specactors/builtin/account/v3.go delete mode 100644 pkg/types/specactors/builtin/account/v4.go delete mode 100644 pkg/types/specactors/builtin/account/v5.go delete mode 100644 pkg/types/specactors/builtin/account/v6.go delete mode 100644 pkg/types/specactors/builtin/account/v7.go delete mode 100644 pkg/types/specactors/builtin/builtin.go delete mode 100644 pkg/types/specactors/builtin/builtin.go.template delete mode 100644 pkg/types/specactors/builtin/cron/actor.go.template delete mode 100644 pkg/types/specactors/builtin/cron/cron.go delete mode 100644 pkg/types/specactors/builtin/cron/state.go.template delete mode 100644 pkg/types/specactors/builtin/cron/v0.go delete mode 100644 pkg/types/specactors/builtin/cron/v2.go delete mode 100644 pkg/types/specactors/builtin/cron/v3.go delete mode 100644 pkg/types/specactors/builtin/cron/v4.go delete mode 100644 pkg/types/specactors/builtin/cron/v5.go delete mode 100644 pkg/types/specactors/builtin/cron/v6.go delete mode 100644 pkg/types/specactors/builtin/cron/v7.go delete mode 100644 pkg/types/specactors/builtin/init/actor.go.template delete mode 100644 pkg/types/specactors/builtin/init/diff.go delete mode 100644 pkg/types/specactors/builtin/init/init.go delete mode 100644 pkg/types/specactors/builtin/init/state.go.template delete mode 100644 pkg/types/specactors/builtin/init/v0.go delete mode 100644 pkg/types/specactors/builtin/init/v2.go delete mode 100644 pkg/types/specactors/builtin/init/v3.go delete mode 100644 pkg/types/specactors/builtin/init/v4.go delete mode 100644 pkg/types/specactors/builtin/init/v5.go delete mode 100644 pkg/types/specactors/builtin/init/v6.go delete mode 100644 pkg/types/specactors/builtin/init/v7.go delete mode 100644 pkg/types/specactors/builtin/market/actor.go.template delete mode 100644 pkg/types/specactors/builtin/market/diff.go delete mode 100644 pkg/types/specactors/builtin/market/market.go delete mode 100644 pkg/types/specactors/builtin/market/state.go.template delete mode 100644 pkg/types/specactors/builtin/market/v0.go delete mode 100644 pkg/types/specactors/builtin/market/v2.go delete mode 100644 pkg/types/specactors/builtin/market/v3.go delete mode 100644 pkg/types/specactors/builtin/market/v4.go delete mode 100644 pkg/types/specactors/builtin/market/v5.go delete mode 100644 pkg/types/specactors/builtin/market/v6.go delete mode 100644 pkg/types/specactors/builtin/market/v7.go delete mode 100644 pkg/types/specactors/builtin/miner/actor.go.template delete mode 100644 pkg/types/specactors/builtin/miner/diff.go delete mode 100644 pkg/types/specactors/builtin/miner/diff_deadlines.go delete mode 100644 pkg/types/specactors/builtin/miner/miner.go delete mode 100644 pkg/types/specactors/builtin/miner/state.go.template delete mode 100644 pkg/types/specactors/builtin/miner/util.go delete mode 100644 pkg/types/specactors/builtin/miner/v0.go delete mode 100644 pkg/types/specactors/builtin/miner/v2.go delete mode 100644 pkg/types/specactors/builtin/miner/v3.go delete mode 100644 pkg/types/specactors/builtin/miner/v4.go delete mode 100644 pkg/types/specactors/builtin/miner/v5.go delete mode 100644 pkg/types/specactors/builtin/miner/v6.go delete mode 100644 pkg/types/specactors/builtin/miner/v7.go delete mode 100644 pkg/types/specactors/builtin/multisig/actor.go.template delete mode 100644 pkg/types/specactors/builtin/multisig/diff.go delete mode 100644 pkg/types/specactors/builtin/multisig/message.go.template delete mode 100644 pkg/types/specactors/builtin/multisig/message0.go delete mode 100644 pkg/types/specactors/builtin/multisig/message2.go delete mode 100644 pkg/types/specactors/builtin/multisig/message3.go delete mode 100644 pkg/types/specactors/builtin/multisig/message4.go delete mode 100644 pkg/types/specactors/builtin/multisig/message5.go delete mode 100644 pkg/types/specactors/builtin/multisig/message6.go delete mode 100644 pkg/types/specactors/builtin/multisig/message7.go delete mode 100644 pkg/types/specactors/builtin/multisig/multisig.go delete mode 100644 pkg/types/specactors/builtin/multisig/state.go.template delete mode 100644 pkg/types/specactors/builtin/multisig/v0.go delete mode 100644 pkg/types/specactors/builtin/multisig/v2.go delete mode 100644 pkg/types/specactors/builtin/multisig/v3.go delete mode 100644 pkg/types/specactors/builtin/multisig/v4.go delete mode 100644 pkg/types/specactors/builtin/multisig/v5.go delete mode 100644 pkg/types/specactors/builtin/multisig/v6.go delete mode 100644 pkg/types/specactors/builtin/multisig/v7.go delete mode 100644 pkg/types/specactors/builtin/paych/actor.go.template delete mode 100644 pkg/types/specactors/builtin/paych/message.go.template delete mode 100644 pkg/types/specactors/builtin/paych/message0.go delete mode 100644 pkg/types/specactors/builtin/paych/message2.go delete mode 100644 pkg/types/specactors/builtin/paych/message3.go delete mode 100644 pkg/types/specactors/builtin/paych/message4.go delete mode 100644 pkg/types/specactors/builtin/paych/message5.go delete mode 100644 pkg/types/specactors/builtin/paych/message6.go delete mode 100644 pkg/types/specactors/builtin/paych/message7.go delete mode 100644 pkg/types/specactors/builtin/paych/mock/mock.go delete mode 100644 pkg/types/specactors/builtin/paych/paych.go delete mode 100644 pkg/types/specactors/builtin/paych/state.go.template delete mode 100644 pkg/types/specactors/builtin/paych/v0.go delete mode 100644 pkg/types/specactors/builtin/paych/v2.go delete mode 100644 pkg/types/specactors/builtin/paych/v3.go delete mode 100644 pkg/types/specactors/builtin/paych/v4.go delete mode 100644 pkg/types/specactors/builtin/paych/v5.go delete mode 100644 pkg/types/specactors/builtin/paych/v6.go delete mode 100644 pkg/types/specactors/builtin/paych/v7.go delete mode 100644 pkg/types/specactors/builtin/power/actor.go.template delete mode 100644 pkg/types/specactors/builtin/power/diff.go delete mode 100644 pkg/types/specactors/builtin/power/power.go delete mode 100644 pkg/types/specactors/builtin/power/state.go.template delete mode 100644 pkg/types/specactors/builtin/power/v0.go delete mode 100644 pkg/types/specactors/builtin/power/v2.go delete mode 100644 pkg/types/specactors/builtin/power/v3.go delete mode 100644 pkg/types/specactors/builtin/power/v4.go delete mode 100644 pkg/types/specactors/builtin/power/v5.go delete mode 100644 pkg/types/specactors/builtin/power/v6.go delete mode 100644 pkg/types/specactors/builtin/power/v7.go delete mode 100644 pkg/types/specactors/builtin/reward/actor.go.template delete mode 100644 pkg/types/specactors/builtin/reward/reward.go delete mode 100644 pkg/types/specactors/builtin/reward/state.go.template delete mode 100644 pkg/types/specactors/builtin/reward/v0.go delete mode 100644 pkg/types/specactors/builtin/reward/v2.go delete mode 100644 pkg/types/specactors/builtin/reward/v3.go delete mode 100644 pkg/types/specactors/builtin/reward/v4.go delete mode 100644 pkg/types/specactors/builtin/reward/v5.go delete mode 100644 pkg/types/specactors/builtin/reward/v6.go delete mode 100644 pkg/types/specactors/builtin/reward/v7.go delete mode 100644 pkg/types/specactors/builtin/system/actor.go.template delete mode 100644 pkg/types/specactors/builtin/system/state.go.template delete mode 100644 pkg/types/specactors/builtin/system/system.go delete mode 100644 pkg/types/specactors/builtin/system/v0.go delete mode 100644 pkg/types/specactors/builtin/system/v2.go delete mode 100644 pkg/types/specactors/builtin/system/v3.go delete mode 100644 pkg/types/specactors/builtin/system/v4.go delete mode 100644 pkg/types/specactors/builtin/system/v5.go delete mode 100644 pkg/types/specactors/builtin/system/v6.go delete mode 100644 pkg/types/specactors/builtin/system/v7.go delete mode 100644 pkg/types/specactors/builtin/verifreg/actor.go.template delete mode 100644 pkg/types/specactors/builtin/verifreg/state.go.template delete mode 100644 pkg/types/specactors/builtin/verifreg/util.go delete mode 100644 pkg/types/specactors/builtin/verifreg/v0.go delete mode 100644 pkg/types/specactors/builtin/verifreg/v2.go delete mode 100644 pkg/types/specactors/builtin/verifreg/v3.go delete mode 100644 pkg/types/specactors/builtin/verifreg/v4.go delete mode 100644 pkg/types/specactors/builtin/verifreg/v5.go delete mode 100644 pkg/types/specactors/builtin/verifreg/v6.go delete mode 100644 pkg/types/specactors/builtin/verifreg/v7.go delete mode 100644 pkg/types/specactors/builtin/verifreg/verifreg.go delete mode 100644 pkg/types/specactors/params.go delete mode 100644 pkg/types/specactors/policy/policy.go delete mode 100644 pkg/types/specactors/policy/policy.go.template delete mode 100644 pkg/types/specactors/policy/policy_test.go delete mode 100644 pkg/types/specactors/version.go delete mode 100644 pkg/types/testing.go delete mode 100644 pkg/types/types.go delete mode 100755 pkg/types/types_gen.go delete mode 100644 scripts/check_api_file_change.sh delete mode 100644 tools/client/main.go delete mode 100644 tools/gen/api/proxygen.go delete mode 100644 tools/gen/api/stable_method_info.json diff --git a/.circleci/config.yml b/.circleci/config.yml index da9392ecff..b4d405241c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -184,7 +184,6 @@ jobs: fingerprints: - "1e:73:c5:15:75:e0:e4:98:54:3c:2b:9e:e8:94:14:2e" - checkout - - clone_lotus - update_submodules # Save the Git SHA of the rust-fil-proofs submodule so that we can use it when creating a cache key - generate_rust_submodules_checksums @@ -200,9 +199,6 @@ jobs: cmd: "lint" - go_build: cmd: "build" - #- go_build: - # cmd: "gen-api" - #- check_file_change # place the filecoin binary in PATH for IPTB - go_build: cmd: "install" @@ -753,21 +749,6 @@ commands: name: fetch all tags command: | git fetch --all - clone_lotus: - steps: - - run: - name: Clone lotus - command: | - mkdir -p ${GOPATH}/pkg/mod/github.com/filecoin-project - cd ${GOPATH}/pkg/mod/github.com/filecoin-project - git clone -b v1.12.0 https://github.com/filecoin-project/lotus.git - check_file_change: - steps: - - run: - name: Check api file change - command: | - cd /go/src/github.com/filecoin-project/venus - bash ./scripts/check_api_file_change.sh go_build: parameters: cmd: diff --git a/CODEWALK.md b/CODEWALK.md index 9ebc6ce6f8..71f862a404 100644 --- a/CODEWALK.md +++ b/CODEWALK.md @@ -71,8 +71,8 @@ Other patterns, we've evolving for our needs: - go-ipfs relies heavily on shell-based integration testing; we aim to rely heavily on unit testing and Go-based integration tests. - The go-ipfs package structure involves a deep hierarchy of dependent implementations; we're moving towards a more Go-idiomatic approach with narrow interfaces defined in consuming packages (see [Patterns](#patterns). -- The term "block" is heavily overloaded: a blockchain block ([`types/block.go`](https://github.com/filecoin-project/venus/tree/master/pkg/types/block.go)), -but also content-id-addressed blocks in the block service. +- The term "block" is heavily overloaded: a blockchain block ([`types/block.go`](https://github.com/filecoin-project/venus/tree/master/venus-shared/types/block_header.go)), +but also content-id-addressed blocks in the block service. Blockchain blocks are stored in block service blocks, but are not the same thing. ## Architecture overview @@ -178,7 +178,7 @@ It is expected that other implementations will match the behaviour of the Go act An ABI describes how inputs and outputs to the VM are encoded. Future work will replace this implementation with a "real" VM. -The [Actor](https://github.com/filecoin-project/venus/blob/master/pkg/types/actor.go) struct is the base implementation of actors, with fields common to all of them. +The [Actor](https://github.com/filecoin-project/venus/blob/master/venus-shared/internal/actor.go) struct is the base implementation of actors, with fields common to all of them. - `Code` is a CID identifying the actor code, but since these actors are implemented in Go, is actually some fixed bytes acting as an identifier. This identifier selects the kind of actor implementation when a message is sent to its address. @@ -252,7 +252,7 @@ If a miner is elected, they have the right to mine a block in that round. Given the probabilistic nature of mining new blocks, more than one block may be mined in any given round. Hence, a new block might have more than one parent block. -The parents form a set, which we call a [tipset](https://github.com/filecoin-project/venus/blob/master/pkg/types/tipset.go). +The parents form a set, which we call a [tipset](https://github.com/filecoin-project/venus/blob/master/venus-shared/types/tipset.go). All the blocks in a tipset are at the same height and share the same parents. Tipsets contain one or more blocks. A null block count indicates the absence of any blocks mined in a previous round. @@ -374,7 +374,6 @@ The `functional-tests` directory contains some Go and Bash scripts which perform These are not daemon tests, but run separately. Some packages have a `testing.go` file with helpers for setting up tests involving that package’s types. -The [`types/testing.go`](https://github.com/filecoin-project/venus/blob/master/pkg/types/testing.go) file has some more generally useful constructors. There is also a top-level [`testhelpers`](https://github.com/filecoin-project/venus/blob/master/pkg/testhelpers) package with higher level helpers, often used by daemon tests. We’re in process of creating the venus Automation and Systems Toolkit (FAST) [library](https://github.com/filecoin-project/venus/tree/master/tools/fast). diff --git a/Makefile b/Makefile index 06c1439c42..4538388885 100644 --- a/Makefile +++ b/Makefile @@ -24,25 +24,6 @@ clean: rm -rf ./extern/filecoin-ffi rm -rf ./extern/test-vectors -gen-api: - go run ./tools/gen/api/proxygen.go - gofmt -s -l -w ./app/client/full.go - gofmt -s -l -w ./app/client/v0api/full.go - -v2-gen-api: - cd ./venus-devtool/ && go run ./api-gen/ - gofmt -s -l -w ./venus-shared/api/chain/v0/proxy_gen.go; - gofmt -s -l -w ./venus-shared/api/chain/v1/proxy_gen.go - -v0APIDoc = ../venus-shared/api/v0-api-document.md -v1APIDoc = ../venus-shared/api/v1-api-document.md -api-docs: - cd ./venus-devtool/ && go run ./api-docs-gen/cmd ../venus-shared/api/chain/v0/fullnode.go FullNode v0 ../venus-shared/api/chain/v0 $(v0APIDoc) - cd ./venus-devtool/ && go run ./api-docs-gen/cmd ../venus-shared/api/chain/v1/fullnode.go FullNode v1 ../venus-shared/api/chain/v1 $(v1APIDoc) - -compare-api: - go run ./tools/gen/api/proxygen.go compare - gen-asset: go-bindata -pkg=asset -o ./fixtures/asset/asset.go ./fixtures/_assets/car/ ./fixtures/_assets/proof-params/ ./fixtures/_assets/arch-diagram.monopic gofmt -s -l -w ./fixtures/asset/asset.go @@ -64,6 +45,17 @@ inline-gen: test-venus-shared: cd venus-shared && go test -covermode=set ./... +gen-api: + cd ./venus-devtool/ && go run ./api-gen/ + gofmt -s -l -w ./venus-shared/api/chain/v0/proxy_gen.go; + gofmt -s -l -w ./venus-shared/api/chain/v1/proxy_gen.go + +v0APIDoc = ../venus-shared/api/v0-api-document.md +v1APIDoc = ../venus-shared/api/v1-api-document.md +api-docs: + cd ./venus-devtool/ && go run ./api-docs-gen/cmd ../venus-shared/api/chain/v0/fullnode.go FullNode v0 ../venus-shared/api/chain/v0 $(v0APIDoc) + cd ./venus-devtool/ && go run ./api-docs-gen/cmd ../venus-shared/api/chain/v1/fullnode.go FullNode v1 ../venus-shared/api/chain/v1 $(v1APIDoc) + compatible-all: compatible-api compatible-actor compatible-api: api-checksum api-diff diff --git a/app/client/apiface/blockservice.go b/app/client/apiface/blockservice.go deleted file mode 100644 index 63f25ffcd3..0000000000 --- a/app/client/apiface/blockservice.go +++ /dev/null @@ -1,20 +0,0 @@ -package apiface - -import ( - "context" - "io" - - "github.com/ipfs/go-cid" - ipld "github.com/ipfs/go-ipld-format" -) - -type IDagService interface { - // Rule[perm:read] - DAGGetNode(ctx context.Context, ref string) (interface{}, error) - // Rule[perm:read] - DAGGetFileSize(ctx context.Context, c cid.Cid) (uint64, error) - // Rule[perm:read] - DAGCat(ctx context.Context, c cid.Cid) (io.Reader, error) - // Rule[perm:write] - DAGImportData(ctx context.Context, data io.Reader) (ipld.Node, error) -} diff --git a/app/client/apiface/blockstore.go b/app/client/apiface/blockstore.go deleted file mode 100644 index ee62d5bc28..0000000000 --- a/app/client/apiface/blockstore.go +++ /dev/null @@ -1,20 +0,0 @@ -package apiface - -import ( - "context" - - "github.com/filecoin-project/venus/venus-shared/types" - - "github.com/ipfs/go-cid" -) - -type IBlockStore interface { - // Rule[perm:read] - ChainReadObj(ctx context.Context, ocid cid.Cid) ([]byte, error) - // Rule[perm:admin] - ChainDeleteObj(ctx context.Context, obj cid.Cid) error - // Rule[perm:read] - ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) - // Rule[perm:read] - ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (types.ObjStat, error) -} diff --git a/app/client/apiface/chain.go b/app/client/apiface/chain.go deleted file mode 100644 index a2f231b6c7..0000000000 --- a/app/client/apiface/chain.go +++ /dev/null @@ -1,213 +0,0 @@ -package apiface - -import ( - "context" - "time" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - "github.com/filecoin-project/venus/venus-shared/types" - - "github.com/filecoin-project/go-state-types/big" - acrypto "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/go-state-types/network" - "github.com/ipfs/go-cid" -) - -type IChain interface { - IAccount - IActor - IBeacon - IMinerState - IChainInfo -} - -type IAccount interface { - // Rule[perm:read] - StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) -} - -type IActor interface { - // Rule[perm:read] - StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) - // Rule[perm:read] - ListActor(ctx context.Context) (map[address.Address]*types.Actor, error) -} - -type IBeacon interface { - // Rule[perm:read] - BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) -} - -type IChainInfo interface { - // Rule[perm:read] - BlockTime(ctx context.Context) time.Duration - // Rule[perm:read] - ChainList(ctx context.Context, tsKey types.TipSetKey, count int) ([]types.TipSetKey, error) - // Rule[perm:read] - ChainHead(ctx context.Context) (*types.TipSet, error) - // Rule[perm:admin] - ChainSetHead(ctx context.Context, key types.TipSetKey) error - // Rule[perm:read] - ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) - // Rule[perm:read] - ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) - // Rule[perm:read] - ChainGetTipSetAfterHeight(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) - // Rule[perm:read] - ChainGetRandomnessFromBeacon(ctx context.Context, key types.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) - // Rule[perm:read] - ChainGetRandomnessFromTickets(ctx context.Context, tsk types.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) - // Rule[perm:read] - StateGetRandomnessFromTickets(ctx context.Context, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) - // Rule[perm:read] - StateGetRandomnessFromBeacon(ctx context.Context, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) - // Rule[perm:read] - ChainGetBlock(ctx context.Context, id cid.Cid) (*types.BlockHeader, error) - // Rule[perm:read] - ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.Message, error) - // Rule[perm:read] - ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*types.BlockMessages, error) - // Rule[perm:read] - ChainGetMessagesInTipset(ctx context.Context, key types.TipSetKey) ([]types.MessageCID, error) - // Rule[perm:read] - ChainGetReceipts(ctx context.Context, id cid.Cid) ([]types.MessageReceipt, error) - // Rule[perm:read] - ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]types.MessageCID, error) - // Rule[perm:read] - ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) - // Rule[perm:read] - StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) - // Rule[perm:read] - StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) - // Rule[perm:read] - ChainNotify(ctx context.Context) <-chan []*types.HeadChange - // Rule[perm:read] - GetFullBlock(ctx context.Context, id cid.Cid) (*types.FullBlock, error) - // Rule[perm:read] - GetActor(ctx context.Context, addr address.Address) (*types.Actor, error) - // Rule[perm:read] - GetParentStateRootActor(ctx context.Context, ts *types.TipSet, addr address.Address) (*types.Actor, error) - // Rule[perm:read] - GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*types.BeaconEntry, error) - // Rule[perm:read] - MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*types.ChainMessage, error) - // Rule[perm:read] - ProtocolParameters(ctx context.Context) (*types.ProtocolParams, error) - // Rule[perm:read] - ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) - // Rule[perm:read] - StateNetworkName(ctx context.Context) (types.NetworkName, error) - // StateSearchMsg looks back up to limit epochs in the chain for a message, and returns its receipt and the tipset where it was executed - // - // NOTE: If a replacing message is found on chain, this method will return - // a MsgLookup for the replacing message - the MsgLookup.Message will be a different - // CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the - // result of the execution of the replacing message. - // - // If the caller wants to ensure that exactly the requested message was executed, - // they must check that MsgLookup.Message is equal to the provided 'cid', or set the - // `allowReplaced` parameter to false. Without this check, and with `allowReplaced` - // set to true, both the requested and original message may appear as - // successfully executed on-chain, which may look like a double-spend. - // - // A replacing message is a message with a different CID, any of Gas values, and - // different signature, but with all other parameters matching (source/destination, - // nonce, params, etc.) - // Rule[perm:read] - StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) - // StateWaitMsg looks back up to limit epochs in the chain for a message. - // If not found, it blocks until the message arrives on chain, and gets to the - // indicated confidence depth. - // - // NOTE: If a replacing message is found on chain, this method will return - // a MsgLookup for the replacing message - the MsgLookup.Message will be a different - // CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the - // result of the execution of the replacing message. - // - // If the caller wants to ensure that exactly the requested message was executed, - // they must check that MsgLookup.Message is equal to the provided 'cid', or set the - // `allowReplaced` parameter to false. Without this check, and with `allowReplaced` - // set to true, both the requested and original message may appear as - // successfully executed on-chain, which may look like a double-spend. - // - // A replacing message is a message with a different CID, any of Gas values, and - // different signature, but with all other parameters matching (source/destination, - // nonce, params, etc.) - // Rule[perm:read] - StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) - // Rule[perm:read] - StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) - // Rule[perm:read] - VerifyEntry(parent, child *types.BeaconEntry, height abi.ChainEpoch) bool - // Rule[perm:read] - ChainExport(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []byte, error) - // Rule[perm:read] - ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*types.HeadChange, error) -} - -type IMinerState interface { - // Rule[perm:read] - StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) - // Rule[perm:read] - StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) - // Rule[perm:read] - StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) - // Rule[perm:read] - StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorLocation, error) - // Rule[perm:read] - StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (abi.SectorSize, error) - // Rule[perm:read] - StateMinerInfo(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) - // Rule[perm:read] - StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (address.Address, error) - // Rule[perm:read] - StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) - // Rule[perm:read] - StateMinerFaults(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) - // Rule[perm:read] - StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) - // Rule[perm:read] - StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]types.Partition, error) - // Rule[perm:read] - StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]types.Deadline, error) - // Rule[perm:read] - StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) - // Rule[perm:read] - StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.MarketDeal, error) - // Rule[perm:read] - StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) - // Rule[perm:read] - StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) - // Rule[perm:read] - StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) - // Rule[perm:read] - StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) - // Rule[perm:read] - StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) - // Rule[perm:read] - StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) - // Rule[perm:read] - StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) - // Rule[perm:read] - StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) - // Rule[perm:read] - StateListActors(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) - // Rule[perm:read] - StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.MinerPower, error) - // Rule[perm:read] - StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) - // Rule[perm:read] - StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorExpiration, error) - // Rule[perm:read] - StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MinerSectors, error) - // Rule[perm:read] - StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MarketBalance, error) - // Rule[perm:read] - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (types.DealCollateralBounds, error) - // Rule[perm:read] - StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) -} diff --git a/app/client/apiface/config.go b/app/client/apiface/config.go deleted file mode 100644 index ccf748d36d..0000000000 --- a/app/client/apiface/config.go +++ /dev/null @@ -1,10 +0,0 @@ -package apiface - -import "context" - -type IConfig interface { - // Rule[perm:admin] - ConfigSet(ctx context.Context, dottedPath string, paramJSON string) error - // Rule[perm:read] - ConfigGet(ctx context.Context, dottedPath string) (interface{}, error) -} diff --git a/app/client/apiface/discovery.go b/app/client/apiface/discovery.go deleted file mode 100644 index 8a22c380e2..0000000000 --- a/app/client/apiface/discovery.go +++ /dev/null @@ -1,4 +0,0 @@ -package apiface - -type IDiscovery interface { -} diff --git a/app/client/apiface/fullnode.go b/app/client/apiface/fullnode.go deleted file mode 100644 index 7e1e1c1f99..0000000000 --- a/app/client/apiface/fullnode.go +++ /dev/null @@ -1,31 +0,0 @@ -/* -in api interface, you can add comment tags to the function -Note: -Rule[perm:admin,ignore:true] -perm: read,write,sign,admin -jwt token permission check -ignore: bool -the func in the api whether needs to be added to the client for external exposure - -TODO: -1. Support global FUNC injection - -*/ -package apiface - -type FullNode interface { - IDagService - IBlockStore - IChain - IConfig - IDiscovery - IMarket - IMining - IMessagePool - IMultiSig - INetwork - IPaychan - ISyncer - IWallet - IJwtAuthAPI -} diff --git a/app/client/apiface/jwtauth.go b/app/client/apiface/jwtauth.go deleted file mode 100644 index fc5210c943..0000000000 --- a/app/client/apiface/jwtauth.go +++ /dev/null @@ -1,14 +0,0 @@ -package apiface - -import ( - "context" - - "github.com/filecoin-project/go-jsonrpc/auth" -) - -type IJwtAuthAPI interface { - // Rule[perm:read] - Verify(ctx context.Context, host, token string) ([]auth.Permission, error) - // Rule[perm:admin] - AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) -} diff --git a/app/client/apiface/market.go b/app/client/apiface/market.go deleted file mode 100644 index c663abc981..0000000000 --- a/app/client/apiface/market.go +++ /dev/null @@ -1,12 +0,0 @@ -package apiface - -import ( - "context" - - "github.com/filecoin-project/venus/venus-shared/types" -) - -type IMarket interface { - // Rule[perm:read] - StateMarketParticipants(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketBalance, error) //perm:admin -} diff --git a/app/client/apiface/mining.go b/app/client/apiface/mining.go deleted file mode 100644 index a0c457cb86..0000000000 --- a/app/client/apiface/mining.go +++ /dev/null @@ -1,16 +0,0 @@ -package apiface - -import ( - "context" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/venus-shared/types" -) - -type IMining interface { - // Rule[perm:read] - MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*types.MiningBaseInfo, error) - // Rule[perm:write] - MinerCreateBlock(ctx context.Context, bt *types.BlockTemplate) (*types.BlockMsg, error) -} diff --git a/app/client/apiface/mpool.go b/app/client/apiface/mpool.go deleted file mode 100644 index a3738559a4..0000000000 --- a/app/client/apiface/mpool.go +++ /dev/null @@ -1,66 +0,0 @@ -package apiface - -import ( - "context" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/venus-shared/types" - "github.com/ipfs/go-cid" -) - -type IMessagePool interface { - // Rule[perm:admin] - MpoolDeleteByAdress(ctx context.Context, addr address.Address) error - // Rule[perm:write] - MpoolPublishByAddr(context.Context, address.Address) error - // Rule[perm:write] - MpoolPublishMessage(ctx context.Context, smsg *types.SignedMessage) error - // Rule[perm:write] - MpoolPush(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) - // Rule[perm:read] - MpoolGetConfig(context.Context) (*types.MpoolConfig, error) - // Rule[perm:admin] - MpoolSetConfig(ctx context.Context, cfg *types.MpoolConfig) error - // Rule[perm:read] - MpoolSelect(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) - // Rule[perm:read] - MpoolSelects(context.Context, types.TipSetKey, []float64) ([][]*types.SignedMessage, error) - // Rule[perm:read] - MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*types.SignedMessage, error) - // Rule[perm:write] - MpoolClear(ctx context.Context, local bool) error - // Rule[perm:write] - MpoolPushUntrusted(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) - // Rule[perm:sign] - MpoolPushMessage(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec) (*types.SignedMessage, error) - // Rule[perm:write] - MpoolBatchPush(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) - // Rule[perm:write] - MpoolBatchPushUntrusted(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) - // Rule[perm:sign] - MpoolBatchPushMessage(ctx context.Context, msgs []*types.Message, spec *types.MessageSendSpec) ([]*types.SignedMessage, error) - // Rule[perm:read] - MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) - // Rule[perm:read] - MpoolSub(ctx context.Context) (<-chan types.MpoolUpdate, error) - // Rule[perm:read] - GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) - // Rule[perm:read] - GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) - // Rule[perm:read] - GasEstimateFeeCap(ctx context.Context, msg *types.Message, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) - // Rule[perm:read] - GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk types.TipSetKey) (big.Int, error) - // Rule[perm:read] - GasEstimateGasLimit(ctx context.Context, msgIn *types.Message, tsk types.TipSetKey) (int64, error) - // MpoolCheckMessages performs logical checks on a batch of messages - // Rule[perm:read] - MpoolCheckMessages(ctx context.Context, protos []*types.MessagePrototype) ([][]types.MessageCheckStatus, error) - // MpoolCheckPendingMessages performs logical checks for all pending messages from a given address - // Rule[perm:read] - MpoolCheckPendingMessages(ctx context.Context, addr address.Address) ([][]types.MessageCheckStatus, error) - // MpoolCheckReplaceMessages performs logical checks on pending messages with replacement - // Rule[perm:read] - MpoolCheckReplaceMessages(ctx context.Context, msg []*types.Message) ([][]types.MessageCheckStatus, error) -} diff --git a/app/client/apiface/multisig.go b/app/client/apiface/multisig.go deleted file mode 100644 index a22e4ee522..0000000000 --- a/app/client/apiface/multisig.go +++ /dev/null @@ -1,42 +0,0 @@ -package apiface - -import ( - "context" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/venus-shared/types" -) - -type IMultiSig interface { - // Rule[perm:sign] - MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (*types.MessagePrototype, error) - // Rule[perm:sign] - MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*types.MessagePrototype, error) - // Rule[perm:sign] - MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*types.MessagePrototype, error) - // Rule[perm:sign] - MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*types.MessagePrototype, error) - // Rule[perm:sign] - MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*types.MessagePrototype, error) - // MsigCancel cancels a previously-proposed multisig message - // It takes the following params: , , , , - // , , - MsigCancelTxnHash(context.Context, address.Address, uint64, address.Address, types.BigInt, address.Address, uint64, []byte) (*types.MessagePrototype, error) - // Rule[perm:sign] - MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*types.MessagePrototype, error) - // Rule[perm:sign] - MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*types.MessagePrototype, error) - // Rule[perm:sign] - MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*types.MessagePrototype, error) - // Rule[perm:sign] - MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*types.MessagePrototype, error) - // Rule[perm:sign] - MsigApproveTxnHash(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*types.MessagePrototype, error) - // Rule[perm:sign] - MsigCancel(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*types.MessagePrototype, error) - // Rule[perm:sign] - MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*types.MessagePrototype, error) - // Rule[perm:read] - MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) -} diff --git a/app/client/apiface/network.go b/app/client/apiface/network.go deleted file mode 100644 index 20b0784020..0000000000 --- a/app/client/apiface/network.go +++ /dev/null @@ -1,35 +0,0 @@ -package apiface - -import ( - "context" - - "github.com/filecoin-project/venus/venus-shared/types" - - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/metrics" - "github.com/libp2p/go-libp2p-core/peer" - ma "github.com/multiformats/go-multiaddr" -) - -type INetwork interface { - // Rule[perm:admin] - NetworkGetBandwidthStats(ctx context.Context) metrics.Stats - // Rule[perm:admin] - NetworkGetPeerAddresses(ctx context.Context) []ma.Multiaddr - // Rule[perm:admin] - NetworkGetPeerID(ctx context.Context) peer.ID - // Rule[perm:read] - NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo - // Rule[perm:read] - NetworkGetClosestPeers(ctx context.Context, key string) ([]peer.ID, error) - // Rule[perm:read] - NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) - // Rule[perm:read] - NetworkConnect(ctx context.Context, addrs []string) (<-chan types.ConnectionResult, error) - // Rule[perm:read] - NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*types.SwarmConnInfos, error) - // Rule[perm:read] - Version(context.Context) (types.Version, error) - // Rule[perm:read] - NetAddrsListen(context.Context) (peer.AddrInfo, error) -} diff --git a/app/client/apiface/paych.go b/app/client/apiface/paych.go deleted file mode 100644 index 0f644e3aef..0000000000 --- a/app/client/apiface/paych.go +++ /dev/null @@ -1,99 +0,0 @@ -package apiface - -import ( - "context" - - "github.com/filecoin-project/venus/venus-shared/types" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/specs-actors/actors/builtin/paych" - "github.com/ipfs/go-cid" -) - -type IPaychan interface { - // PaychGet creates a payment channel to a provider with a amount of FIL - // @from: the payment channel sender - // @to: the payment channel recipient - // @amt: the deposits funds in the payment channel - // Rule[perm:sign] - PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*types.ChannelInfo, error) - // PaychAvailableFunds get the status of an outbound payment channel - // @pch: payment channel address - // Rule[perm:sign] - PaychAvailableFunds(ctx context.Context, ch address.Address) (*types.ChannelAvailableFunds, error) - // PaychAvailableFundsByFromTo get the status of an outbound payment channel - // @from: the payment channel sender - // @to: he payment channel recipient - // Rule[perm:sign] - PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*types.ChannelAvailableFunds, error) - // PaychGetWaitReady waits until the create channel / add funds message with the sentinel - // @sentinel: given message CID arrives. - // @ch: the returned channel address can safely be used against the Manager methods. - // Rule[perm:sign] - PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (address.Address, error) - // PaychAllocateLane Allocate late creates a lane within a payment channel so that calls to - // CreatePaymentVoucher will automatically make vouchers only for the difference in total - // Rule[perm:sign] - PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) - // PaychNewPayment aggregate vouchers into a new lane - // @from: the payment channel sender - // @to: the payment channel recipient - // @vouchers: the outstanding (non-redeemed) vouchers - // Rule[perm:sign] - PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []types.VoucherSpec) (*types.PaymentInfo, error) - // PaychList list the addresses of all channels that have been created - // Rule[perm:read] - PaychList(ctx context.Context) ([]address.Address, error) - // PaychStatus get the payment channel status - // @pch: payment channel address - // Rule[perm:read] - PaychStatus(ctx context.Context, pch address.Address) (*types.Status, error) - // PaychSettle update payment channel status to settle - // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain - // @pch: payment channel address - // Rule[perm:sign] - PaychSettle(ctx context.Context, addr address.Address) (cid.Cid, error) - // PaychCollect update payment channel status to collect - // Collect sends the value of submitted vouchers to the channel recipient (the provider), - // and refunds the remaining channel balance to the channel creator (the client). - // @pch: payment channel address - // Rule[perm:sign] - PaychCollect(ctx context.Context, addr address.Address) (cid.Cid, error) - - // PaychVoucherCheckValid checks if the given voucher is valid (is or could become spendable at some point). - // If the channel is not in the store, fetches the channel from state (and checks that - // the channel To address is owned by the wallet). - // @pch: payment channel address - // @sv: voucher - // Rule[perm:read] - PaychVoucherCheckValid(ctx context.Context, ch address.Address, sv *paych.SignedVoucher) error - // PaychVoucherCheckSpendable checks if the given voucher is currently spendable - // @pch: payment channel address - // @sv: voucher - // Rule[perm:read] - PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (bool, error) - // PaychVoucherAdd adds a voucher for an inbound channel. - // If the channel is not in the store, fetches the channel from state (and checks that - // the channel To address is owned by the wallet). - // Rule[perm:write] - PaychVoucherAdd(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) - // PaychVoucherCreate creates a new signed voucher on the given payment channel - // with the given lane and amount. The value passed in is exactly the value - // that will be used to create the voucher, so if previous vouchers exist, the - // actual additional value of this voucher will only be the difference between - // the two. - // If there are insufficient funds in the channel to create the voucher, - // returns a nil voucher and the shortfall. - // Rule[perm:sign] - PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*types.VoucherCreateResult, error) - // PaychVoucherList list vouchers in payment channel - // @pch: payment channel address - // Rule[perm:write] - PaychVoucherList(ctx context.Context, pch address.Address) ([]*paych.SignedVoucher, error) - // PaychVoucherSubmit Submit voucher to chain to update payment channel state - // @pch: payment channel address - // @sv: voucher in payment channel - // Rule[perm:sign] - PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) -} diff --git a/app/client/apiface/syncer.go b/app/client/apiface/syncer.go deleted file mode 100644 index ac1dbb08a8..0000000000 --- a/app/client/apiface/syncer.go +++ /dev/null @@ -1,28 +0,0 @@ -package apiface - -import ( - "context" - - "github.com/filecoin-project/go-state-types/big" - syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" - "github.com/filecoin-project/venus/venus-shared/types" -) - -type ISyncer interface { - // Rule[perm:write] - ChainSyncHandleNewTipSet(ctx context.Context, ci *types.ChainInfo) error - // Rule[perm:admin] - SetConcurrent(ctx context.Context, concurrent int64) error - // Rule[perm:read] - SyncerTracker(ctx context.Context) *syncTypes.TargetTracker - // Rule[perm:read] - Concurrent(ctx context.Context) int64 - // Rule[perm:read] - ChainTipSetWeight(ctx context.Context, tsk types.TipSetKey) (big.Int, error) - // Rule[perm:write] - SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error - // Rule[perm:read] - StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*types.InvocResult, error) - // Rule[perm:read] - SyncState(ctx context.Context) (*types.SyncState, error) -} diff --git a/app/client/apiface/v0api/blockservice.go b/app/client/apiface/v0api/blockservice.go deleted file mode 100644 index 4e00b3db93..0000000000 --- a/app/client/apiface/v0api/blockservice.go +++ /dev/null @@ -1,20 +0,0 @@ -package v0api - -import ( - "context" - "io" - - "github.com/ipfs/go-cid" - ipld "github.com/ipfs/go-ipld-format" -) - -type IDagService interface { - // Rule[perm:read] - DAGGetNode(ctx context.Context, ref string) (interface{}, error) - // Rule[perm:read] - DAGGetFileSize(ctx context.Context, c cid.Cid) (uint64, error) - // Rule[perm:read] - DAGCat(ctx context.Context, c cid.Cid) (io.Reader, error) - // Rule[perm:write] - DAGImportData(ctx context.Context, data io.Reader) (ipld.Node, error) -} diff --git a/app/client/apiface/v0api/blockstore.go b/app/client/apiface/v0api/blockstore.go deleted file mode 100644 index 6daa240d5b..0000000000 --- a/app/client/apiface/v0api/blockstore.go +++ /dev/null @@ -1,20 +0,0 @@ -package v0api - -import ( - "context" - - "github.com/filecoin-project/venus/venus-shared/types" - - "github.com/ipfs/go-cid" -) - -type IBlockStore interface { - // Rule[perm:read] - ChainReadObj(ctx context.Context, ocid cid.Cid) ([]byte, error) - // Rule[perm:admin] - ChainDeleteObj(ctx context.Context, obj cid.Cid) error - // Rule[perm:read] - ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) - // Rule[perm:read] - ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (types.ObjStat, error) -} diff --git a/app/client/apiface/v0api/chain.go b/app/client/apiface/v0api/chain.go deleted file mode 100644 index 776e40fb35..0000000000 --- a/app/client/apiface/v0api/chain.go +++ /dev/null @@ -1,179 +0,0 @@ -package v0api - -import ( - "context" - "time" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - acrypto "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/go-state-types/network" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - "github.com/filecoin-project/venus/venus-shared/types" -) - -type IChain interface { - IAccount - IActor - IBeacon - IMinerState - IChainInfo -} - -type IAccount interface { - // Rule[perm:read] - StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) -} - -type IActor interface { - // Rule[perm:read] - StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) - // Rule[perm:read] - ListActor(ctx context.Context) (map[address.Address]*types.Actor, error) -} - -type IBeacon interface { - // Rule[perm:read] - BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) -} - -type IChainInfo interface { - // Rule[perm:read] - BlockTime(ctx context.Context) time.Duration - // Rule[perm:read] - ChainList(ctx context.Context, tsKey types.TipSetKey, count int) ([]types.TipSetKey, error) - // Rule[perm:read] - ChainHead(ctx context.Context) (*types.TipSet, error) - // Rule[perm:admin] - ChainSetHead(ctx context.Context, key types.TipSetKey) error - // Rule[perm:read] - ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) - // Rule[perm:read] - ChainGetTipSetByHeight(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) - // Rule[perm:read] - ChainGetRandomnessFromBeacon(ctx context.Context, key types.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) - // Rule[perm:read] - ChainGetRandomnessFromTickets(ctx context.Context, tsk types.TipSetKey, personalization acrypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) - // Rule[perm:read] - ChainGetBlock(ctx context.Context, id cid.Cid) (*types.BlockHeader, error) - // Rule[perm:read] - ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.Message, error) - // Rule[perm:read] - ChainGetBlockMessages(ctx context.Context, bid cid.Cid) (*types.BlockMessages, error) - // Rule[perm:read] - ChainGetMessagesInTipset(ctx context.Context, key types.TipSetKey) ([]types.Message, error) - // Rule[perm:read] - ChainGetReceipts(ctx context.Context, id cid.Cid) ([]types.MessageReceipt, error) - // Rule[perm:read] - ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]types.Message, error) - // Rule[perm:read] - ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) - //Rule[perm:read] - StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) - // Rule[perm:read] - StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) - // Rule[perm:read] - ChainNotify(ctx context.Context) <-chan []*types.HeadChange - // Rule[perm:read] - GetFullBlock(ctx context.Context, id cid.Cid) (*types.FullBlock, error) - // Rule[perm:read] - GetActor(ctx context.Context, addr address.Address) (*types.Actor, error) - // Rule[perm:read] - GetParentStateRootActor(ctx context.Context, ts *types.TipSet, addr address.Address) (*types.Actor, error) - // Rule[perm:read] - GetEntry(ctx context.Context, height abi.ChainEpoch, round uint64) (*types.BeaconEntry, error) - // Rule[perm:read] - MessageWait(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*types.ChainMessage, error) - // Rule[perm:read] - ProtocolParameters(ctx context.Context) (*types.ProtocolParams, error) - // Rule[perm:read] - ResolveToKeyAddr(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) - // Rule[perm:read] - StateNetworkName(ctx context.Context) (types.NetworkName, error) - // Rule[perm:read] - StateGetReceipt(ctx context.Context, msg cid.Cid, from types.TipSetKey) (*types.MessageReceipt, error) - // Rule[perm:read] - StateSearchMsg(ctx context.Context, msg cid.Cid) (*types.MsgLookup, error) - // Rule[perm:read] - StateSearchMsgLimited(ctx context.Context, cid cid.Cid, limit abi.ChainEpoch) (*types.MsgLookup, error) - // Rule[perm:read] - StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64) (*types.MsgLookup, error) - // Rule[perm:read] - StateWaitMsgLimited(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch) (*types.MsgLookup, error) - // Rule[perm:read] - StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) - // Rule[perm:read] - VerifyEntry(parent, child *types.BeaconEntry, height abi.ChainEpoch) bool - // Rule[perm:read] - ChainExport(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []byte, error) - // Rule[perm:read] - ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*types.HeadChange, error) -} - -type IMinerState interface { - // Rule[perm:read] - StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) - // Rule[perm:read] - StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) - // Rule[perm:read] - StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) - // Rule[perm:read] - StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorLocation, error) - // Rule[perm:read] - StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (abi.SectorSize, error) - // Rule[perm:read] - StateMinerInfo(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) - // Rule[perm:read] - StateMinerWorkerAddress(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (address.Address, error) - // Rule[perm:read] - StateMinerRecoveries(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) - // Rule[perm:read] - StateMinerFaults(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) - // Rule[perm:read] - StateMinerProvingDeadline(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) - // Rule[perm:read] - StateMinerPartitions(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]types.Partition, error) - // Rule[perm:read] - StateMinerDeadlines(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]types.Deadline, error) - // Rule[perm:read] - StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) - // Rule[perm:read] - StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.MarketDeal, error) - // Rule[perm:read] - StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) - // Rule[perm:read] - StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) - // Rule[perm:read] - StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) - // Rule[perm:read] - StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) - // Rule[perm:read] - StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) - // Rule[perm:read] - StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) - // Rule[perm:read] - StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) - // Rule[perm:read] - StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) - // Rule[perm:read] - StateListActors(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) - // Rule[perm:read] - StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.MinerPower, error) - // Rule[perm:read] - StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) - // Rule[perm:read] - StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorExpiration, error) - // Rule[perm:read] - StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MinerSectors, error) - // Rule[perm:read] - StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MarketBalance, error) - // Rule[perm:read] - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (types.DealCollateralBounds, error) - // Rule[perm:read] - StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) -} diff --git a/app/client/apiface/v0api/config.go b/app/client/apiface/v0api/config.go deleted file mode 100644 index 576b3cc7cf..0000000000 --- a/app/client/apiface/v0api/config.go +++ /dev/null @@ -1,10 +0,0 @@ -package v0api - -import "context" - -type IConfig interface { - // Rule[perm:admin] - ConfigSet(ctx context.Context, dottedPath string, paramJSON string) error - // Rule[perm:read] - ConfigGet(ctx context.Context, dottedPath string) (interface{}, error) -} diff --git a/app/client/apiface/v0api/discovery.go b/app/client/apiface/v0api/discovery.go deleted file mode 100644 index 2e92f5579e..0000000000 --- a/app/client/apiface/v0api/discovery.go +++ /dev/null @@ -1,4 +0,0 @@ -package v0api - -type IDiscovery interface { -} diff --git a/app/client/apiface/v0api/fullnode.go b/app/client/apiface/v0api/fullnode.go deleted file mode 100644 index 3395b64e41..0000000000 --- a/app/client/apiface/v0api/fullnode.go +++ /dev/null @@ -1,31 +0,0 @@ -/* -in api interface, you can add comment tags to the function -Note: -Rule[perm:admin,ignore:true] -perm: read,write,sign,admin -jwt token permission check -ignore: bool -the func in the api whether needs to be added to the client for external exposure - -TODO: -1. Support global FUNC injection - -*/ -package v0api - -type FullNode interface { - IDagService - IBlockStore - IChain - IConfig - IDiscovery - IMarket - IMining - IMessagePool - IMultiSig - INetwork - IPaychan - ISyncer - IWallet - IJwtAuthAPI -} diff --git a/app/client/apiface/v0api/jwtauth.go b/app/client/apiface/v0api/jwtauth.go deleted file mode 100644 index 6c52109f92..0000000000 --- a/app/client/apiface/v0api/jwtauth.go +++ /dev/null @@ -1,14 +0,0 @@ -package v0api - -import ( - "context" - - "github.com/filecoin-project/go-jsonrpc/auth" -) - -type IJwtAuthAPI interface { - // Rule[perm:read] - Verify(ctx context.Context, host, token string) ([]auth.Permission, error) - // Rule[perm:admin] - AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) -} diff --git a/app/client/apiface/v0api/market.go b/app/client/apiface/v0api/market.go deleted file mode 100644 index 55b4373e47..0000000000 --- a/app/client/apiface/v0api/market.go +++ /dev/null @@ -1,12 +0,0 @@ -package v0api - -import ( - "context" - - "github.com/filecoin-project/venus/venus-shared/types" -) - -type IMarket interface { - // Rule[perm:read] - StateMarketParticipants(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketBalance, error) //perm:admin -} diff --git a/app/client/apiface/v0api/mining.go b/app/client/apiface/v0api/mining.go deleted file mode 100644 index 5b86ded9e9..0000000000 --- a/app/client/apiface/v0api/mining.go +++ /dev/null @@ -1,16 +0,0 @@ -package v0api - -import ( - "context" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/venus-shared/types" -) - -type IMining interface { - // Rule[perm:read] - MinerGetBaseInfo(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*types.MiningBaseInfo, error) - // Rule[perm:write] - MinerCreateBlock(ctx context.Context, bt *types.BlockTemplate) (*types.BlockMsg, error) -} diff --git a/app/client/apiface/v0api/mpool.go b/app/client/apiface/v0api/mpool.go deleted file mode 100644 index aebcafc40b..0000000000 --- a/app/client/apiface/v0api/mpool.go +++ /dev/null @@ -1,57 +0,0 @@ -package v0api - -import ( - "context" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/venus-shared/types" - "github.com/ipfs/go-cid" -) - -type IMessagePool interface { - // Rule[perm:admin] - MpoolDeleteByAdress(ctx context.Context, addr address.Address) error - // Rule[perm:write] - MpoolPublishByAddr(context.Context, address.Address) error - // Rule[perm:write] - MpoolPublishMessage(ctx context.Context, smsg *types.SignedMessage) error - // Rule[perm:write] - MpoolPush(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) - // Rule[perm:read] - MpoolGetConfig(context.Context) (*types.MpoolConfig, error) - // Rule[perm:admin] - MpoolSetConfig(ctx context.Context, cfg *types.MpoolConfig) error - // Rule[perm:read] - MpoolSelect(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) - // Rule[perm:read] - MpoolSelects(context.Context, types.TipSetKey, []float64) ([][]*types.SignedMessage, error) - // Rule[perm:read] - MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*types.SignedMessage, error) - // Rule[perm:write] - MpoolClear(ctx context.Context, local bool) error - // Rule[perm:write] - MpoolPushUntrusted(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) - // Rule[perm:sign] - MpoolPushMessage(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec) (*types.SignedMessage, error) - // Rule[perm:write] - MpoolBatchPush(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) - // Rule[perm:write] - MpoolBatchPushUntrusted(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) - // Rule[perm:sign] - MpoolBatchPushMessage(ctx context.Context, msgs []*types.Message, spec *types.MessageSendSpec) ([]*types.SignedMessage, error) - // Rule[perm:read] - MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) - // Rule[perm:read] - MpoolSub(ctx context.Context) (<-chan types.MpoolUpdate, error) - // Rule[perm:read] - GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) - // Rule[perm:read] - GasBatchEstimateMessageGas(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) - // Rule[perm:read] - GasEstimateFeeCap(ctx context.Context, msg *types.Message, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) - // Rule[perm:read] - GasEstimateGasPremium(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk types.TipSetKey) (big.Int, error) - // Rule[perm:read] - GasEstimateGasLimit(ctx context.Context, msgIn *types.Message, tsk types.TipSetKey) (int64, error) -} diff --git a/app/client/apiface/v0api/multisig.go b/app/client/apiface/v0api/multisig.go deleted file mode 100644 index 1e6b56aa10..0000000000 --- a/app/client/apiface/v0api/multisig.go +++ /dev/null @@ -1,46 +0,0 @@ -package v0api - -import ( - "context" - - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/venus-shared/types" -) - -type IMultiSig interface { - // MsigCreate creates a multisig wallet - // It takes the following params: , , - //, , - // Rule[perm:sign] - MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, types.BigInt, address.Address, types.BigInt) (cid.Cid, error) - // Rule[perm:sign] - MsigPropose(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) - // Rule[perm:sign] - MsigAddPropose(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (cid.Cid, error) - // Rule[perm:sign] - MsigAddApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (cid.Cid, error) - // Rule[perm:sign] - MsigAddCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (cid.Cid, error) - // Rule[perm:sign] - MsigSwapPropose(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) - // Rule[perm:sign] - MsigSwapApprove(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) - // Rule[perm:sign] - MsigSwapCancel(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) - // Rule[perm:sign] - MsigApprove(ctx context.Context, msig address.Address, txID uint64, src address.Address) (cid.Cid, error) - // MsigCancel cancels a previously-proposed multisig message - // It takes the following params: , , , , - // , , - // Rule[perm:sign] - MsigCancelTxnHash(context.Context, address.Address, uint64, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error) - // Rule[perm:sign] - MsigCancel(ctx context.Context, msig address.Address, txID uint64, src address.Address) (cid.Cid, error) - // Rule[perm:sign] - MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (cid.Cid, error) - // Rule[perm:read] - MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) -} diff --git a/app/client/apiface/v0api/network.go b/app/client/apiface/v0api/network.go deleted file mode 100644 index 38f532ded6..0000000000 --- a/app/client/apiface/v0api/network.go +++ /dev/null @@ -1,35 +0,0 @@ -package v0api - -import ( - "context" - - "github.com/filecoin-project/venus/venus-shared/types" - - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/metrics" - "github.com/libp2p/go-libp2p-core/peer" - ma "github.com/multiformats/go-multiaddr" -) - -type INetwork interface { - // Rule[perm:admin] - NetworkGetBandwidthStats(ctx context.Context) metrics.Stats - // Rule[perm:admin] - NetworkGetPeerAddresses(ctx context.Context) []ma.Multiaddr - // Rule[perm:admin] - NetworkGetPeerID(ctx context.Context) peer.ID - // Rule[perm:read] - NetworkFindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo - // Rule[perm:admin] - NetworkGetClosestPeers(ctx context.Context, key string) ([]peer.ID, error) - // Rule[perm:read] - NetworkFindPeer(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) - // Rule[perm:read] - NetworkConnect(ctx context.Context, addrs []string) (<-chan types.ConnectionResult, error) - // Rule[perm:read] - NetworkPeers(ctx context.Context, verbose, latency, streams bool) (*types.SwarmConnInfos, error) - // Rule[perm:read] - Version(context.Context) (types.Version, error) - // Rule[perm:read] - NetAddrsListen(context.Context) (peer.AddrInfo, error) -} diff --git a/app/client/apiface/v0api/paych.go b/app/client/apiface/v0api/paych.go deleted file mode 100644 index db4a687718..0000000000 --- a/app/client/apiface/v0api/paych.go +++ /dev/null @@ -1,99 +0,0 @@ -package v0api - -import ( - "context" - - "github.com/filecoin-project/venus/venus-shared/types" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/specs-actors/actors/builtin/paych" - "github.com/ipfs/go-cid" -) - -type IPaychan interface { - // PaychGet creates a payment channel to a provider with a amount of FIL - // @from: the payment channel sender - // @to: the payment channel recipient - // @amt: the deposits funds in the payment channel - // Rule[perm:sign] - PaychGet(ctx context.Context, from, to address.Address, amt big.Int) (*types.ChannelInfo, error) - // PaychAvailableFunds get the status of an outbound payment channel - // @pch: payment channel address - // Rule[perm:sign] - PaychAvailableFunds(ctx context.Context, ch address.Address) (*types.ChannelAvailableFunds, error) - // PaychAvailableFundsByFromTo get the status of an outbound payment channel - // @from: the payment channel sender - // @to: he payment channel recipient - // Rule[perm:sign] - PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*types.ChannelAvailableFunds, error) - // PaychGetWaitReady waits until the create channel / add funds message with the sentinel - // @sentinel: given message CID arrives. - // @ch: the returned channel address can safely be used against the Manager methods. - // Rule[perm:sign] - PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (address.Address, error) - // PaychAllocateLane Allocate late creates a lane within a payment channel so that calls to - // CreatePaymentVoucher will automatically make vouchers only for the difference in total - // Rule[perm:sign] - PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) - // PaychNewPayment aggregate vouchers into a new lane - // @from: the payment channel sender - // @to: the payment channel recipient - // @vouchers: the outstanding (non-redeemed) vouchers - // Rule[perm:sign] - PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []types.VoucherSpec) (*types.PaymentInfo, error) - // PaychList list the addresses of all channels that have been created - // Rule[perm:read] - PaychList(ctx context.Context) ([]address.Address, error) - // PaychStatus get the payment channel status - // @pch: payment channel address - // Rule[perm:read] - PaychStatus(ctx context.Context, pch address.Address) (*types.Status, error) - // PaychSettle update payment channel status to settle - // After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain - // @pch: payment channel address - // Rule[perm:sign] - PaychSettle(ctx context.Context, addr address.Address) (cid.Cid, error) - // PaychCollect update payment channel status to collect - // Collect sends the value of submitted vouchers to the channel recipient (the provider), - // and refunds the remaining channel balance to the channel creator (the client). - // @pch: payment channel address - // Rule[perm:sign] - PaychCollect(ctx context.Context, addr address.Address) (cid.Cid, error) - - // PaychVoucherCheckValid checks if the given voucher is valid (is or could become spendable at some point). - // If the channel is not in the store, fetches the channel from state (and checks that - // the channel To address is owned by the wallet). - // @pch: payment channel address - // @sv: voucher - // Rule[perm:read] - PaychVoucherCheckValid(ctx context.Context, ch address.Address, sv *paych.SignedVoucher) error - // PaychVoucherCheckSpendable checks if the given voucher is currently spendable - // @pch: payment channel address - // @sv: voucher - // Rule[perm:read] - PaychVoucherCheckSpendable(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (bool, error) - // PaychVoucherAdd adds a voucher for an inbound channel. - // If the channel is not in the store, fetches the channel from state (and checks that - // the channel To address is owned by the wallet). - // Rule[perm:write] - PaychVoucherAdd(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) - // PaychVoucherCreate creates a new signed voucher on the given payment channel - // with the given lane and amount. The value passed in is exactly the value - // that will be used to create the voucher, so if previous vouchers exist, the - // actual additional value of this voucher will only be the difference between - // the two. - // If there are insufficient funds in the channel to create the voucher, - // returns a nil voucher and the shortfall. - // Rule[perm:sign] - PaychVoucherCreate(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*types.VoucherCreateResult, error) - // PaychVoucherList list vouchers in payment channel - // @pch: payment channel address - // Rule[perm:write] - PaychVoucherList(ctx context.Context, pch address.Address) ([]*paych.SignedVoucher, error) - // PaychVoucherSubmit Submit voucher to chain to update payment channel state - // @pch: payment channel address - // @sv: voucher in payment channel - // Rule[perm:sign] - PaychVoucherSubmit(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) -} diff --git a/app/client/apiface/v0api/syncer.go b/app/client/apiface/v0api/syncer.go deleted file mode 100644 index b683b2cdc0..0000000000 --- a/app/client/apiface/v0api/syncer.go +++ /dev/null @@ -1,28 +0,0 @@ -package v0api - -import ( - "context" - - "github.com/filecoin-project/go-state-types/big" - syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" - "github.com/filecoin-project/venus/venus-shared/types" -) - -type ISyncer interface { - // Rule[perm:write] - ChainSyncHandleNewTipSet(ctx context.Context, ci *types.ChainInfo) error - // Rule[perm:admin] - SetConcurrent(ctx context.Context, concurrent int64) error - // Rule[perm:read] - SyncerTracker(ctx context.Context) *syncTypes.TargetTracker - // Rule[perm:read] - Concurrent(ctx context.Context) int64 - // Rule[perm:read] - ChainTipSetWeight(ctx context.Context, tsk types.TipSetKey) (big.Int, error) - // Rule[perm:write] - SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error - // Rule[perm:read] - StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*types.InvocResult, error) - // Rule[perm:read] - SyncState(ctx context.Context) (*types.SyncState, error) -} diff --git a/app/client/apiface/v0api/wallet.go b/app/client/apiface/v0api/wallet.go deleted file mode 100644 index 147e605579..0000000000 --- a/app/client/apiface/v0api/wallet.go +++ /dev/null @@ -1,43 +0,0 @@ -package v0api - -import ( - "context" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/venus-shared/types" -) - -type IWallet interface { - // Rule[perm:sign] - WalletSign(ctx context.Context, k address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) - // Rule[perm:admin] - WalletExport(addr address.Address, password string) (*crypto.KeyInfo, error) - // Rule[perm:admin] - WalletImport(key *crypto.KeyInfo) (address.Address, error) - // Rule[perm:write] - WalletHas(ctx context.Context, addr address.Address) (bool, error) - // Rule[perm:write] - WalletNewAddress(protocol address.Protocol) (address.Address, error) - // Rule[perm:read] - WalletBalance(ctx context.Context, addr address.Address) (abi.TokenAmount, error) //not exists in remote - // Rule[perm:write] - WalletDefaultAddress(ctx context.Context) (address.Address, error) //not exists in remote - // Rule[perm:admin] - WalletAddresses(ctx context.Context) []address.Address - // Rule[perm:write] - WalletSetDefault(ctx context.Context, addr address.Address) error //not exists in remote - // Rule[perm:sign] - WalletSignMessage(ctx context.Context, k address.Address, msg *types.Message) (*types.SignedMessage, error) - // Rule[perm:admin] - LockWallet(ctx context.Context) error - // Rule[perm:admin] - UnLockWallet(ctx context.Context, password []byte) error - // Rule[perm:admin] - SetPassword(Context context.Context, password []byte) error - // Rule[perm:admin] - HasPassword(Context context.Context) bool - // Rule[perm:admin] - WalletState(Context context.Context) int -} diff --git a/app/client/apiface/wallet.go b/app/client/apiface/wallet.go deleted file mode 100644 index 719bb01333..0000000000 --- a/app/client/apiface/wallet.go +++ /dev/null @@ -1,44 +0,0 @@ -package apiface - -import ( - "context" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/venus-shared/types" -) - -type IWallet interface { - // Rule[perm:sign] - WalletSign(ctx context.Context, k address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) - // Rule[perm:admin] - WalletExport(addr address.Address, password string) (*crypto.KeyInfo, error) - // Rule[perm:admin] - WalletImport(key *crypto.KeyInfo) (address.Address, error) - // Rule[perm:write] - WalletHas(ctx context.Context, addr address.Address) (bool, error) - // Rule[perm:write] - WalletNewAddress(protocol address.Protocol) (address.Address, error) - // Rule[perm:read] - WalletBalance(ctx context.Context, addr address.Address) (abi.TokenAmount, error) //not exists in remote - // Rule[perm:write] - WalletDefaultAddress(ctx context.Context) (address.Address, error) //not exists in remote - // Rule[perm:admin] - WalletAddresses(ctx context.Context) []address.Address - // Rule[perm:write] - WalletSetDefault(ctx context.Context, addr address.Address) error //not exists in remote - // Rule[perm:sign] - WalletSignMessage(ctx context.Context, k address.Address, msg *types.Message) (*types.SignedMessage, error) - // Rule[perm:admin] - LockWallet(ctx context.Context) error - // Rule[perm:admin] - UnLockWallet(ctx context.Context, password []byte) error - // Rule[perm:admin] - SetPassword(Context context.Context, password []byte) error - // Rule[perm:admin] - HasPassword(Context context.Context) bool - // Rule[perm:admin] - WalletState(Context context.Context) int -} diff --git a/app/client/client_test.go b/app/client/client_test.go deleted file mode 100644 index 92f85dbe02..0000000000 --- a/app/client/client_test.go +++ /dev/null @@ -1,119 +0,0 @@ -package client - -import ( - "context" - "contrib.go.opencensus.io/exporter/jaeger" - "fmt" - "github.com/filecoin-project/go-jsonrpc" - "github.com/filecoin-project/venus/pkg/config" - "github.com/filecoin-project/venus/pkg/metrics" - "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/ipfs/go-cid" - "go.opencensus.io/trace" - "net/http" - "os" - "testing" - "time" -) - -func TestMain(m *testing.M) { - if err := setup(); err != nil { - fmt.Printf("setup failed:%s\n", err.Error()) - return - } - - code := m.Run() - - shutdown() - - os.Exit(code) -} - -var clt *FullNodeStruct -var closer jsonrpc.ClientCloser - -var endpoint = "http://localhost:3453/rpc/v0" -var token = "" -var jaegerProxyEndpoint = "192.168.1.125:6831" -var jaegerExporter *jaeger.Exporter - -func setup() error { - var err error - - if err = initClient(); err != nil { - return err - } - - if jaegerExporter, err = metrics.RegisterJaeger("", &config.TraceConfig{ - JaegerTracingEnabled: true, - ProbabilitySampler: 1.0, - JaegerEndpoint: jaegerProxyEndpoint, - ServerName: "venus-client", - }); err != nil { - fmt.Printf("failed registerjaeger(%s), message:%s\n", - jaegerProxyEndpoint, err.Error()) - return err - } - return nil -} - -func TestAPIs(t *testing.T) { - testflags.UnitTest(t) - t.Skip("local test") - cid, _ := cid.Decode("bafy2bzacedylucvhzggupihcqjfvv7s4mthgetphb2zzlp7kpjpykmiklfzt4") - - ctx, span := trace.StartSpan(context.TODO(), "test_api") - defer span.End() - - sctx := span.SpanContext() - span.AddAttributes(trace.StringAttribute("user", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBbGxvdyI6WyJhZG1pbiJdfQ.8KBg6HE9KZFxaPogQhYCAN2HNcK5lSR37NMRrem5aVY")) - - fmt.Printf("tracid:%s, spanid:%s\n", sctx.TraceID, sctx.SpanID) - - if _, err := clt.ChainGetBlock(ctx, cid); err != nil { - fmt.Printf("call chainhead failed:%s\n", err.Error()) - } -} - -func TestRatelimit(t *testing.T) { - testflags.UnitTest(t) - t.Skip("local test") - ctx := context.TODO() - - for j := 0; j < 5; j++ { - for i := 0; i < 10; i++ { - if _, err := clt.ChainHead(ctx); err != nil { - fmt.Printf("call chainhead failed:%s\n", err.Error()) - } else { - fmt.Printf("index:%d, call chainhead success\n", i) - } - } - fmt.Printf("\n") - time.Sleep(time.Second * 10) - } -} - -func initClient() error { - node := FullNodeStruct{} - headers := http.Header{} - - if len(token) != 0 { - headers.Add("Authorization", "Bearer "+token) - } - - var err error - if closer, err = jsonrpc.NewClient(context.TODO(), endpoint, "Filecoin", &node, headers); err == nil { - clt = &node - } - return err -} - -func shutdown() { - if jaegerExporter != nil { - jaegerExporter.Flush() - } - - if closer != nil { - closer() - } -} diff --git a/app/client/full.go b/app/client/full.go deleted file mode 100644 index ec781c11d9..0000000000 --- a/app/client/full.go +++ /dev/null @@ -1,1000 +0,0 @@ -// Code generated by github.com/filecoin-project/tools/gen/api. DO NOT EDIT. - -package client - -import ( - "context" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - "github.com/filecoin-project/go-jsonrpc/auth" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - acrypto "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/specs-actors/actors/builtin/paych" - syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" - "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - "github.com/filecoin-project/venus/venus-shared/types" - "github.com/ipfs/go-cid" - ipld "github.com/ipfs/go-ipld-format" - "github.com/libp2p/go-libp2p-core/metrics" - "github.com/libp2p/go-libp2p-core/peer" - ma "github.com/multiformats/go-multiaddr" - "io" - "time" -) - -type FullNodeStruct struct { - IDagServiceStruct - IBlockStoreStruct - IChainStruct - IConfigStruct - IDiscoveryStruct - IMarketStruct - IMiningStruct - IMessagePoolStruct - IMultiSigStruct - INetworkStruct - IPaychanStruct - ISyncerStruct - IWalletStruct - IJwtAuthAPIStruct -} - -type IAccountStruct struct { - Internal struct { - StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - } -} - -func (s *IAccountStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { - return s.Internal.StateAccountKey(p0, p1, p2) -} - -type IActorStruct struct { - Internal struct { - ListActor func(p0 context.Context) (map[address.Address]*types.Actor, error) `perm:"read"` - StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `perm:"read"` - } -} - -func (s *IActorStruct) ListActor(p0 context.Context) (map[address.Address]*types.Actor, error) { - return s.Internal.ListActor(p0) -} - -func (s *IActorStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { - return s.Internal.StateGetActor(p0, p1, p2) -} - -type IBeaconStruct struct { - Internal struct { - BeaconGetEntry func(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) `perm:"read"` - } -} - -func (s *IBeaconStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) { - return s.Internal.BeaconGetEntry(p0, p1) -} - -type IBlockStoreStruct struct { - Internal struct { - ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` - ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"` - ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` - ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) `perm:"read"` - } -} - -func (s *IBlockStoreStruct) ChainDeleteObj(p0 context.Context, p1 cid.Cid) error { - return s.Internal.ChainDeleteObj(p0, p1) -} - -func (s *IBlockStoreStruct) ChainHasObj(p0 context.Context, p1 cid.Cid) (bool, error) { - return s.Internal.ChainHasObj(p0, p1) -} - -func (s *IBlockStoreStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { - return s.Internal.ChainReadObj(p0, p1) -} - -func (s *IBlockStoreStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) { - return s.Internal.ChainStatObj(p0, p1, p2) -} - -type IChainStruct struct { - IAccountStruct - IActorStruct - IBeaconStruct - IMinerStateStruct - IChainInfoStruct -} - -type IChainInfoStruct struct { - Internal struct { - BlockTime func(p0 context.Context) time.Duration `perm:"read"` - ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) `perm:"read"` - ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) `perm:"read"` - ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*types.BlockMessages, error) `perm:"read"` - ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"` - ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]types.MessageCID, error) `perm:"read"` - ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]types.MessageCID, error) `perm:"read"` - ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` - ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*types.HeadChange, error) `perm:"read"` - ChainGetRandomnessFromBeacon func(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` - ChainGetRandomnessFromTickets func(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` - ChainGetReceipts func(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) `perm:"read"` - ChainGetTipSet func(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - ChainGetTipSetAfterHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"` - ChainList func(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) `perm:"read"` - ChainNotify func(p0 context.Context) <-chan []*types.HeadChange `perm:"read"` - ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` - GetActor func(p0 context.Context, p1 address.Address) (*types.Actor, error) `perm:"read"` - GetEntry func(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) `perm:"read"` - GetFullBlock func(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) `perm:"read"` - GetParentStateRootActor func(p0 context.Context, p1 *types.TipSet, p2 address.Address) (*types.Actor, error) `perm:"read"` - MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*types.ChainMessage, error) `perm:"read"` - ProtocolParameters func(p0 context.Context) (*types.ProtocolParams, error) `perm:"read"` - ResolveToKeyAddr func(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) `perm:"read"` - StateGetRandomnessFromBeacon func(p0 context.Context, p1 acrypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) `perm:"read"` - StateGetRandomnessFromTickets func(p0 context.Context, p1 acrypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) `perm:"read"` - StateNetworkName func(p0 context.Context) (types.NetworkName, error) `perm:"read"` - StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (network.Version, error) `perm:"read"` - StateSearchMsg func(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) `perm:"read"` - StateVerifiedRegistryRootKey func(p0 context.Context, p1 types.TipSetKey) (address.Address, error) `perm:"read"` - StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` - StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) `perm:"read"` - VerifyEntry func(p0 *types.BeaconEntry, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool `perm:"read"` - } -} - -func (s *IChainInfoStruct) BlockTime(p0 context.Context) time.Duration { - return s.Internal.BlockTime(p0) -} - -func (s *IChainInfoStruct) ChainExport(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) { - return s.Internal.ChainExport(p0, p1, p2, p3) -} - -func (s *IChainInfoStruct) ChainGetBlock(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) { - return s.Internal.ChainGetBlock(p0, p1) -} - -func (s *IChainInfoStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*types.BlockMessages, error) { - return s.Internal.ChainGetBlockMessages(p0, p1) -} - -func (s *IChainInfoStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*types.Message, error) { - return s.Internal.ChainGetMessage(p0, p1) -} - -func (s *IChainInfoStruct) ChainGetMessagesInTipset(p0 context.Context, p1 types.TipSetKey) ([]types.MessageCID, error) { - return s.Internal.ChainGetMessagesInTipset(p0, p1) -} - -func (s *IChainInfoStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]types.MessageCID, error) { - return s.Internal.ChainGetParentMessages(p0, p1) -} - -func (s *IChainInfoStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) { - return s.Internal.ChainGetParentReceipts(p0, p1) -} - -func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*types.HeadChange, error) { - return s.Internal.ChainGetPath(p0, p1, p2) -} - -func (s *IChainInfoStruct) ChainGetRandomnessFromBeacon(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { - return s.Internal.ChainGetRandomnessFromBeacon(p0, p1, p2, p3, p4) -} - -func (s *IChainInfoStruct) ChainGetRandomnessFromTickets(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { - return s.Internal.ChainGetRandomnessFromTickets(p0, p1, p2, p3, p4) -} - -func (s *IChainInfoStruct) ChainGetReceipts(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) { - return s.Internal.ChainGetReceipts(p0, p1) -} - -func (s *IChainInfoStruct) ChainGetTipSet(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) { - return s.Internal.ChainGetTipSet(p0, p1) -} - -func (s *IChainInfoStruct) ChainGetTipSetAfterHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { - return s.Internal.ChainGetTipSetAfterHeight(p0, p1, p2) -} - -func (s *IChainInfoStruct) ChainGetTipSetByHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { - return s.Internal.ChainGetTipSetByHeight(p0, p1, p2) -} - -func (s *IChainInfoStruct) ChainHead(p0 context.Context) (*types.TipSet, error) { - return s.Internal.ChainHead(p0) -} - -func (s *IChainInfoStruct) ChainList(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) { - return s.Internal.ChainList(p0, p1, p2) -} - -func (s *IChainInfoStruct) ChainNotify(p0 context.Context) <-chan []*types.HeadChange { - return s.Internal.ChainNotify(p0) -} - -func (s *IChainInfoStruct) ChainSetHead(p0 context.Context, p1 types.TipSetKey) error { - return s.Internal.ChainSetHead(p0, p1) -} - -func (s *IChainInfoStruct) GetActor(p0 context.Context, p1 address.Address) (*types.Actor, error) { - return s.Internal.GetActor(p0, p1) -} - -func (s *IChainInfoStruct) GetEntry(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) { - return s.Internal.GetEntry(p0, p1, p2) -} - -func (s *IChainInfoStruct) GetFullBlock(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) { - return s.Internal.GetFullBlock(p0, p1) -} - -func (s *IChainInfoStruct) GetParentStateRootActor(p0 context.Context, p1 *types.TipSet, p2 address.Address) (*types.Actor, error) { - return s.Internal.GetParentStateRootActor(p0, p1, p2) -} - -func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*types.ChainMessage, error) { - return s.Internal.MessageWait(p0, p1, p2, p3) -} - -func (s *IChainInfoStruct) ProtocolParameters(p0 context.Context) (*types.ProtocolParams, error) { - return s.Internal.ProtocolParameters(p0) -} - -func (s *IChainInfoStruct) ResolveToKeyAddr(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) { - return s.Internal.ResolveToKeyAddr(p0, p1, p2) -} - -func (s *IChainInfoStruct) StateGetRandomnessFromBeacon(p0 context.Context, p1 acrypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) { - return s.Internal.StateGetRandomnessFromBeacon(p0, p1, p2, p3, p4) -} - -func (s *IChainInfoStruct) StateGetRandomnessFromTickets(p0 context.Context, p1 acrypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) { - return s.Internal.StateGetRandomnessFromTickets(p0, p1, p2, p3, p4) -} - -func (s *IChainInfoStruct) StateNetworkName(p0 context.Context) (types.NetworkName, error) { - return s.Internal.StateNetworkName(p0) -} - -func (s *IChainInfoStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (network.Version, error) { - return s.Internal.StateNetworkVersion(p0, p1) -} - -func (s *IChainInfoStruct) StateSearchMsg(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) { - return s.Internal.StateSearchMsg(p0, p1, p2, p3, p4) -} - -func (s *IChainInfoStruct) StateVerifiedRegistryRootKey(p0 context.Context, p1 types.TipSetKey) (address.Address, error) { - return s.Internal.StateVerifiedRegistryRootKey(p0, p1) -} - -func (s *IChainInfoStruct) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { - return s.Internal.StateVerifierStatus(p0, p1, p2) -} - -func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) { - return s.Internal.StateWaitMsg(p0, p1, p2, p3, p4) -} - -func (s *IChainInfoStruct) VerifyEntry(p0 *types.BeaconEntry, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool { - return s.Internal.VerifyEntry(p0, p1, p2) -} - -type IConfigStruct struct { - Internal struct { - ConfigGet func(p0 context.Context, p1 string) (interface{}, error) `perm:"read"` - ConfigSet func(p0 context.Context, p1 string, p2 string) error `perm:"admin"` - } -} - -func (s *IConfigStruct) ConfigGet(p0 context.Context, p1 string) (interface{}, error) { - return s.Internal.ConfigGet(p0, p1) -} - -func (s *IConfigStruct) ConfigSet(p0 context.Context, p1 string, p2 string) error { - return s.Internal.ConfigSet(p0, p1, p2) -} - -type IDagServiceStruct struct { - Internal struct { - DAGCat func(p0 context.Context, p1 cid.Cid) (io.Reader, error) `perm:"read"` - DAGGetFileSize func(p0 context.Context, p1 cid.Cid) (uint64, error) `perm:"read"` - DAGGetNode func(p0 context.Context, p1 string) (interface{}, error) `perm:"read"` - DAGImportData func(p0 context.Context, p1 io.Reader) (ipld.Node, error) `perm:"write"` - } -} - -func (s *IDagServiceStruct) DAGCat(p0 context.Context, p1 cid.Cid) (io.Reader, error) { - return s.Internal.DAGCat(p0, p1) -} - -func (s *IDagServiceStruct) DAGGetFileSize(p0 context.Context, p1 cid.Cid) (uint64, error) { - return s.Internal.DAGGetFileSize(p0, p1) -} - -func (s *IDagServiceStruct) DAGGetNode(p0 context.Context, p1 string) (interface{}, error) { - return s.Internal.DAGGetNode(p0, p1) -} - -func (s *IDagServiceStruct) DAGImportData(p0 context.Context, p1 io.Reader) (ipld.Node, error) { - return s.Internal.DAGImportData(p0, p1) -} - -type IDiscoveryStruct struct { -} - -type IJwtAuthAPIStruct struct { - Internal struct { - AuthNew func(p0 context.Context, p1 []auth.Permission) ([]byte, error) `perm:"admin"` - Verify func(p0 context.Context, p1 string, p2 string) ([]auth.Permission, error) `perm:"read"` - } -} - -func (s *IJwtAuthAPIStruct) AuthNew(p0 context.Context, p1 []auth.Permission) ([]byte, error) { - return s.Internal.AuthNew(p0, p1) -} - -func (s *IJwtAuthAPIStruct) Verify(p0 context.Context, p1 string, p2 string) ([]auth.Permission, error) { - return s.Internal.Verify(p0, p1, p2) -} - -type IMarketStruct struct { - Internal struct { - StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) `perm:"read"` - } -} - -func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) { - return s.Internal.StateMarketParticipants(p0, p1) -} - -type IMessagePoolStruct struct { - Internal struct { - GasBatchEstimateMessageGas func(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) `perm:"read"` - GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - GasEstimateGasLimit func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) `perm:"read"` - GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) `perm:"read"` - GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"` - MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` - MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolCheckMessages func(p0 context.Context, p1 []*types.MessagePrototype) ([][]types.MessageCheckStatus, error) `perm:"read"` - MpoolCheckPendingMessages func(p0 context.Context, p1 address.Address) ([][]types.MessageCheckStatus, error) `perm:"read"` - MpoolCheckReplaceMessages func(p0 context.Context, p1 []*types.Message) ([][]types.MessageCheckStatus, error) `perm:"read"` - MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` - MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` - MpoolGetConfig func(p0 context.Context) (*types.MpoolConfig, error) `perm:"read"` - MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` - MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` - MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"write"` - MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"write"` - MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` - MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` - MpoolSelects func(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) `perm:"read"` - MpoolSetConfig func(p0 context.Context, p1 *types.MpoolConfig) error `perm:"admin"` - MpoolSub func(p0 context.Context) (<-chan types.MpoolUpdate, error) `perm:"read"` - } -} - -func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) { - return s.Internal.GasBatchEstimateMessageGas(p0, p1, p2, p3) -} - -func (s *IMessagePoolStruct) GasEstimateFeeCap(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) { - return s.Internal.GasEstimateFeeCap(p0, p1, p2, p3) -} - -func (s *IMessagePoolStruct) GasEstimateGasLimit(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) { - return s.Internal.GasEstimateGasLimit(p0, p1, p2) -} - -func (s *IMessagePoolStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) { - return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) -} - -func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { - return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) -} - -func (s *IMessagePoolStruct) MpoolBatchPush(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { - return s.Internal.MpoolBatchPush(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) { - return s.Internal.MpoolBatchPushMessage(p0, p1, p2) -} - -func (s *IMessagePoolStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { - return s.Internal.MpoolBatchPushUntrusted(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolCheckMessages(p0 context.Context, p1 []*types.MessagePrototype) ([][]types.MessageCheckStatus, error) { - return s.Internal.MpoolCheckMessages(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolCheckPendingMessages(p0 context.Context, p1 address.Address) ([][]types.MessageCheckStatus, error) { - return s.Internal.MpoolCheckPendingMessages(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolCheckReplaceMessages(p0 context.Context, p1 []*types.Message) ([][]types.MessageCheckStatus, error) { - return s.Internal.MpoolCheckReplaceMessages(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolClear(p0 context.Context, p1 bool) error { - return s.Internal.MpoolClear(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolDeleteByAdress(p0 context.Context, p1 address.Address) error { - return s.Internal.MpoolDeleteByAdress(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolGetConfig(p0 context.Context) (*types.MpoolConfig, error) { - return s.Internal.MpoolGetConfig(p0) -} - -func (s *IMessagePoolStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { - return s.Internal.MpoolGetNonce(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPending(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) { - return s.Internal.MpoolPending(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPublishByAddr(p0 context.Context, p1 address.Address) error { - return s.Internal.MpoolPublishByAddr(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPublishMessage(p0 context.Context, p1 *types.SignedMessage) error { - return s.Internal.MpoolPublishMessage(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { - return s.Internal.MpoolPush(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) { - return s.Internal.MpoolPushMessage(p0, p1, p2) -} - -func (s *IMessagePoolStruct) MpoolPushUntrusted(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { - return s.Internal.MpoolPushUntrusted(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolSelect(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) { - return s.Internal.MpoolSelect(p0, p1, p2) -} - -func (s *IMessagePoolStruct) MpoolSelects(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) { - return s.Internal.MpoolSelects(p0, p1, p2) -} - -func (s *IMessagePoolStruct) MpoolSetConfig(p0 context.Context, p1 *types.MpoolConfig) error { - return s.Internal.MpoolSetConfig(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolSub(p0 context.Context) (<-chan types.MpoolUpdate, error) { - return s.Internal.MpoolSub(p0) -} - -type IMinerStateStruct struct { - Internal struct { - StateCirculatingSupply func(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` - StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) `perm:"read"` - StateListActors func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` - StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` - StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) `perm:"read"` - StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) `perm:"read"` - StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) `perm:"read"` - StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` - StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) `perm:"read"` - StateMinerFaults func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - StateMinerInfo func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) `perm:"read"` - StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) `perm:"read"` - StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) `perm:"read"` - StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `perm:"read"` - StateMinerRecoveries func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) `perm:"read"` - StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) `perm:"read"` - StateMinerSectorSize func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (abi.SectorSize, error) `perm:"read"` - StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` - StateMinerWorkerAddress func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - StateSectorExpiration func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) `perm:"read"` - StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` - StateSectorPartition func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` - StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` - StateVMCirculatingSupplyInternal func(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) `perm:"read"` - StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` - } -} - -func (s *IMinerStateStruct) StateCirculatingSupply(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) { - return s.Internal.StateCirculatingSupply(p0, p1) -} - -func (s *IMinerStateStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) { - return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateListActors(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { - return s.Internal.StateListActors(p0, p1) -} - -func (s *IMinerStateStruct) StateListMiners(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { - return s.Internal.StateListMiners(p0, p1) -} - -func (s *IMinerStateStruct) StateLookupID(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { - return s.Internal.StateLookupID(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) { - return s.Internal.StateMarketBalance(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) { - return s.Internal.StateMarketDeals(p0, p1) -} - -func (s *IMinerStateStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) { - return s.Internal.StateMarketStorageDeal(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerActiveSectors(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { - return s.Internal.StateMinerActiveSectors(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerAvailableBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) { - return s.Internal.StateMinerAvailableBalance(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) { - return s.Internal.StateMinerDeadlines(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerFaults(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { - return s.Internal.StateMinerFaults(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerInfo(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) { - return s.Internal.StateMinerInfo(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { - return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) { - return s.Internal.StateMinerPartitions(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) { - return s.Internal.StateMinerPower(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerPreCommitDepositForPower(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { - return s.Internal.StateMinerPreCommitDepositForPower(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerProvingDeadline(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) { - return s.Internal.StateMinerProvingDeadline(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerRecoveries(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { - return s.Internal.StateMinerRecoveries(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerSectorAllocated(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) { - return s.Internal.StateMinerSectorAllocated(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) { - return s.Internal.StateMinerSectorCount(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerSectorSize(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (abi.SectorSize, error) { - return s.Internal.StateMinerSectorSize(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerSectors(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { - return s.Internal.StateMinerSectors(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerWorkerAddress(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { - return s.Internal.StateMinerWorkerAddress(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateSectorExpiration(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) { - return s.Internal.StateSectorExpiration(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateSectorGetInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) { - return s.Internal.StateSectorGetInfo(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateSectorPartition(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) { - return s.Internal.StateSectorPartition(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateSectorPreCommitInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { - return s.Internal.StateSectorPreCommitInfo(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) { - return s.Internal.StateVMCirculatingSupplyInternal(p0, p1) -} - -func (s *IMinerStateStruct) StateVerifiedClientStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { - return s.Internal.StateVerifiedClientStatus(p0, p1, p2) -} - -type IMiningStruct struct { - Internal struct { - MinerCreateBlock func(p0 context.Context, p1 *types.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` - MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*types.MiningBaseInfo, error) `perm:"read"` - } -} - -func (s *IMiningStruct) MinerCreateBlock(p0 context.Context, p1 *types.BlockTemplate) (*types.BlockMsg, error) { - return s.Internal.MinerCreateBlock(p0, p1) -} - -func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*types.MiningBaseInfo, error) { - return s.Internal.MinerGetBaseInfo(p0, p1, p2, p3) -} - -type IMultiSigStruct struct { - Internal struct { - MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*types.MessagePrototype, error) `perm:"sign"` - MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*types.MessagePrototype, error) `perm:"sign"` - MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*types.MessagePrototype, error) `perm:"sign"` - MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) `perm:"sign"` - MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) `perm:"sign"` - MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) `perm:"sign"` - MsigCancelTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*types.MessagePrototype, error) `perm:"read"` - MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*types.MessagePrototype, error) `perm:"sign"` - MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` - MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*types.MessagePrototype, error) `perm:"sign"` - MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*types.MessagePrototype, error) `perm:"sign"` - MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*types.MessagePrototype, error) `perm:"sign"` - MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*types.MessagePrototype, error) `perm:"sign"` - MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*types.MessagePrototype, error) `perm:"sign"` - } -} - -func (s *IMultiSigStruct) MsigAddApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*types.MessagePrototype, error) { - return s.Internal.MsigAddApprove(p0, p1, p2, p3, p4, p5, p6) -} - -func (s *IMultiSigStruct) MsigAddCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*types.MessagePrototype, error) { - return s.Internal.MsigAddCancel(p0, p1, p2, p3, p4, p5) -} - -func (s *IMultiSigStruct) MsigAddPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*types.MessagePrototype, error) { - return s.Internal.MsigAddPropose(p0, p1, p2, p3, p4) -} - -func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) { - return s.Internal.MsigApprove(p0, p1, p2, p3) -} - -func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) { - return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3) -} - -func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) { - return s.Internal.MsigCancel(p0, p1, p2, p3) -} - -func (s *IMultiSigStruct) MsigCancelTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*types.MessagePrototype, error) { - return s.Internal.MsigCancelTxnHash(p0, p1, p2, p3, p4, p5, p6, p7) -} - -func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*types.MessagePrototype, error) { - return s.Internal.MsigCreate(p0, p1, p2, p3, p4, p5, p6) -} - -func (s *IMultiSigStruct) MsigGetVested(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) { - return s.Internal.MsigGetVested(p0, p1, p2, p3) -} - -func (s *IMultiSigStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*types.MessagePrototype, error) { - return s.Internal.MsigPropose(p0, p1, p2, p3, p4, p5, p6) -} - -func (s *IMultiSigStruct) MsigRemoveSigner(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*types.MessagePrototype, error) { - return s.Internal.MsigRemoveSigner(p0, p1, p2, p3, p4) -} - -func (s *IMultiSigStruct) MsigSwapApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*types.MessagePrototype, error) { - return s.Internal.MsigSwapApprove(p0, p1, p2, p3, p4, p5, p6) -} - -func (s *IMultiSigStruct) MsigSwapCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*types.MessagePrototype, error) { - return s.Internal.MsigSwapCancel(p0, p1, p2, p3, p4, p5) -} - -func (s *IMultiSigStruct) MsigSwapPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*types.MessagePrototype, error) { - return s.Internal.MsigSwapPropose(p0, p1, p2, p3, p4) -} - -type INetworkStruct struct { - Internal struct { - NetAddrsListen func(p0 context.Context) (peer.AddrInfo, error) `perm:"read"` - NetworkConnect func(p0 context.Context, p1 []string) (<-chan types.ConnectionResult, error) `perm:"read"` - NetworkFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` - NetworkFindProvidersAsync func(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo `perm:"read"` - NetworkGetBandwidthStats func(p0 context.Context) metrics.Stats `perm:"admin"` - NetworkGetClosestPeers func(p0 context.Context, p1 string) ([]peer.ID, error) `perm:"read"` - NetworkGetPeerAddresses func(p0 context.Context) []ma.Multiaddr `perm:"admin"` - NetworkGetPeerID func(p0 context.Context) peer.ID `perm:"admin"` - NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*types.SwarmConnInfos, error) `perm:"read"` - Version func(p0 context.Context) (types.Version, error) `perm:"read"` - } -} - -func (s *INetworkStruct) NetAddrsListen(p0 context.Context) (peer.AddrInfo, error) { - return s.Internal.NetAddrsListen(p0) -} - -func (s *INetworkStruct) NetworkConnect(p0 context.Context, p1 []string) (<-chan types.ConnectionResult, error) { - return s.Internal.NetworkConnect(p0, p1) -} - -func (s *INetworkStruct) NetworkFindPeer(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) { - return s.Internal.NetworkFindPeer(p0, p1) -} - -func (s *INetworkStruct) NetworkFindProvidersAsync(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo { - return s.Internal.NetworkFindProvidersAsync(p0, p1, p2) -} - -func (s *INetworkStruct) NetworkGetBandwidthStats(p0 context.Context) metrics.Stats { - return s.Internal.NetworkGetBandwidthStats(p0) -} - -func (s *INetworkStruct) NetworkGetClosestPeers(p0 context.Context, p1 string) ([]peer.ID, error) { - return s.Internal.NetworkGetClosestPeers(p0, p1) -} - -func (s *INetworkStruct) NetworkGetPeerAddresses(p0 context.Context) []ma.Multiaddr { - return s.Internal.NetworkGetPeerAddresses(p0) -} - -func (s *INetworkStruct) NetworkGetPeerID(p0 context.Context) peer.ID { - return s.Internal.NetworkGetPeerID(p0) -} - -func (s *INetworkStruct) NetworkPeers(p0 context.Context, p1 bool, p2 bool, p3 bool) (*types.SwarmConnInfos, error) { - return s.Internal.NetworkPeers(p0, p1, p2, p3) -} - -func (s *INetworkStruct) Version(p0 context.Context) (types.Version, error) { - return s.Internal.Version(p0) -} - -type IPaychanStruct struct { - Internal struct { - PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` - PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` - PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` - PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) `perm:"sign"` - PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` - PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` - PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) `perm:"sign"` - PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychStatus func(p0 context.Context, p1 address.Address) (*types.Status, error) `perm:"read"` - PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` - PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` - PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` - PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*types.VoucherCreateResult, error) `perm:"sign"` - PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` - PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` - } -} - -func (s *IPaychanStruct) PaychAllocateLane(p0 context.Context, p1 address.Address) (uint64, error) { - return s.Internal.PaychAllocateLane(p0, p1) -} - -func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*types.ChannelAvailableFunds, error) { - return s.Internal.PaychAvailableFunds(p0, p1) -} - -func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*types.ChannelAvailableFunds, error) { - return s.Internal.PaychAvailableFundsByFromTo(p0, p1, p2) -} - -func (s *IPaychanStruct) PaychCollect(p0 context.Context, p1 address.Address) (cid.Cid, error) { - return s.Internal.PaychCollect(p0, p1) -} - -func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) { - return s.Internal.PaychGet(p0, p1, p2, p3) -} - -func (s *IPaychanStruct) PaychGetWaitReady(p0 context.Context, p1 cid.Cid) (address.Address, error) { - return s.Internal.PaychGetWaitReady(p0, p1) -} - -func (s *IPaychanStruct) PaychList(p0 context.Context) ([]address.Address, error) { - return s.Internal.PaychList(p0) -} - -func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) { - return s.Internal.PaychNewPayment(p0, p1, p2, p3) -} - -func (s *IPaychanStruct) PaychSettle(p0 context.Context, p1 address.Address) (cid.Cid, error) { - return s.Internal.PaychSettle(p0, p1) -} - -func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*types.Status, error) { - return s.Internal.PaychStatus(p0, p1) -} - -func (s *IPaychanStruct) PaychVoucherAdd(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) { - return s.Internal.PaychVoucherAdd(p0, p1, p2, p3, p4) -} - -func (s *IPaychanStruct) PaychVoucherCheckSpendable(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) { - return s.Internal.PaychVoucherCheckSpendable(p0, p1, p2, p3, p4) -} - -func (s *IPaychanStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error { - return s.Internal.PaychVoucherCheckValid(p0, p1, p2) -} - -func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*types.VoucherCreateResult, error) { - return s.Internal.PaychVoucherCreate(p0, p1, p2, p3) -} - -func (s *IPaychanStruct) PaychVoucherList(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) { - return s.Internal.PaychVoucherList(p0, p1) -} - -func (s *IPaychanStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) { - return s.Internal.PaychVoucherSubmit(p0, p1, p2, p3, p4) -} - -type ISyncerStruct struct { - Internal struct { - ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"write"` - ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (big.Int, error) `perm:"read"` - Concurrent func(p0 context.Context) int64 `perm:"read"` - SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` - StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*types.InvocResult, error) `perm:"read"` - SyncState func(p0 context.Context) (*types.SyncState, error) `perm:"read"` - SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` - SyncerTracker func(p0 context.Context) *syncTypes.TargetTracker `perm:"read"` - } -} - -func (s *ISyncerStruct) ChainSyncHandleNewTipSet(p0 context.Context, p1 *types.ChainInfo) error { - return s.Internal.ChainSyncHandleNewTipSet(p0, p1) -} - -func (s *ISyncerStruct) ChainTipSetWeight(p0 context.Context, p1 types.TipSetKey) (big.Int, error) { - return s.Internal.ChainTipSetWeight(p0, p1) -} - -func (s *ISyncerStruct) Concurrent(p0 context.Context) int64 { - return s.Internal.Concurrent(p0) -} - -func (s *ISyncerStruct) SetConcurrent(p0 context.Context, p1 int64) error { - return s.Internal.SetConcurrent(p0, p1) -} - -func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*types.InvocResult, error) { - return s.Internal.StateCall(p0, p1, p2) -} - -func (s *ISyncerStruct) SyncState(p0 context.Context) (*types.SyncState, error) { - return s.Internal.SyncState(p0) -} - -func (s *ISyncerStruct) SyncSubmitBlock(p0 context.Context, p1 *types.BlockMsg) error { - return s.Internal.SyncSubmitBlock(p0, p1) -} - -func (s *ISyncerStruct) SyncerTracker(p0 context.Context) *syncTypes.TargetTracker { - return s.Internal.SyncerTracker(p0) -} - -type IWalletStruct struct { - Internal struct { - HasPassword func(p0 context.Context) bool `perm:"admin"` - LockWallet func(p0 context.Context) error `perm:"admin"` - SetPassword func(p0 context.Context, p1 []byte) error `perm:"admin"` - UnLockWallet func(p0 context.Context, p1 []byte) error `perm:"admin"` - WalletAddresses func(p0 context.Context) []address.Address `perm:"admin"` - WalletBalance func(p0 context.Context, p1 address.Address) (abi.TokenAmount, error) `perm:"read"` - WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"` - WalletExport func(p0 address.Address, p1 string) (*crypto.KeyInfo, error) `perm:"admin"` - WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` - WalletImport func(p0 *crypto.KeyInfo) (address.Address, error) `perm:"admin"` - WalletNewAddress func(p0 address.Protocol) (address.Address, error) `perm:"write"` - WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` - WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) `perm:"sign"` - WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) `perm:"sign"` - WalletState func(p0 context.Context) int `perm:"admin"` - } -} - -func (s *IWalletStruct) HasPassword(p0 context.Context) bool { - return s.Internal.HasPassword(p0) -} - -func (s *IWalletStruct) LockWallet(p0 context.Context) error { - return s.Internal.LockWallet(p0) -} - -func (s *IWalletStruct) SetPassword(p0 context.Context, p1 []byte) error { - return s.Internal.SetPassword(p0, p1) -} - -func (s *IWalletStruct) UnLockWallet(p0 context.Context, p1 []byte) error { - return s.Internal.UnLockWallet(p0, p1) -} - -func (s *IWalletStruct) WalletAddresses(p0 context.Context) []address.Address { - return s.Internal.WalletAddresses(p0) -} - -func (s *IWalletStruct) WalletBalance(p0 context.Context, p1 address.Address) (abi.TokenAmount, error) { - return s.Internal.WalletBalance(p0, p1) -} - -func (s *IWalletStruct) WalletDefaultAddress(p0 context.Context) (address.Address, error) { - return s.Internal.WalletDefaultAddress(p0) -} - -func (s *IWalletStruct) WalletExport(p0 address.Address, p1 string) (*crypto.KeyInfo, error) { - return s.Internal.WalletExport(p0, p1) -} - -func (s *IWalletStruct) WalletHas(p0 context.Context, p1 address.Address) (bool, error) { - return s.Internal.WalletHas(p0, p1) -} - -func (s *IWalletStruct) WalletImport(p0 *crypto.KeyInfo) (address.Address, error) { - return s.Internal.WalletImport(p0) -} - -func (s *IWalletStruct) WalletNewAddress(p0 address.Protocol) (address.Address, error) { - return s.Internal.WalletNewAddress(p0) -} - -func (s *IWalletStruct) WalletSetDefault(p0 context.Context, p1 address.Address) error { - return s.Internal.WalletSetDefault(p0, p1) -} - -func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) { - return s.Internal.WalletSign(p0, p1, p2, p3) -} - -func (s *IWalletStruct) WalletSignMessage(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) { - return s.Internal.WalletSignMessage(p0, p1, p2) -} - -func (s *IWalletStruct) WalletState(p0 context.Context) int { - return s.Internal.WalletState(p0) -} diff --git a/app/client/node.go b/app/client/node.go index 94169428ff..67eded6d47 100644 --- a/app/client/node.go +++ b/app/client/node.go @@ -2,11 +2,13 @@ package client import ( "context" - "github.com/ipfs-force-community/venus-common-utils/apiinfo" "io/ioutil" "net/http" "path" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" + "github.com/ipfs-force-community/venus-common-utils/apiinfo" + "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/venus/app/paths" ) @@ -40,16 +42,16 @@ func getVenusClientInfo(version string) (string, http.Header, error) { //NewFullNode It is used to construct a full node access client. //The API can be obtained from ~ /. Venus / API file, read from ~ /. Venus / token in local JWT mode, //and obtained from Venus auth service in central authorization mode. -func GetFullNodeAPI(ctx context.Context, version string) (FullNodeStruct, jsonrpc.ClientCloser, error) { +func GetFullNodeAPI(ctx context.Context, version string) (v1api.FullNodeStruct, jsonrpc.ClientCloser, error) { addr, headers, err := getVenusClientInfo(version) if err != nil { - return FullNodeStruct{}, nil, err + return v1api.FullNodeStruct{}, nil, err } - node := FullNodeStruct{} + node := v1api.FullNodeStruct{} closer, err := jsonrpc.NewClient(ctx, addr, "Filecoin", &node, headers) if err != nil { - return FullNodeStruct{}, nil, err + return v1api.FullNodeStruct{}, nil, err } return node, closer, nil diff --git a/app/client/v0api/full.go b/app/client/v0api/full.go deleted file mode 100644 index 5cc5b3c6ca..0000000000 --- a/app/client/v0api/full.go +++ /dev/null @@ -1,980 +0,0 @@ -// Code generated by github.com/filecoin-project/tools/gen/api. DO NOT EDIT. - -package v0api - -import ( - "context" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - "github.com/filecoin-project/go-jsonrpc/auth" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - acrypto "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/specs-actors/actors/builtin/paych" - syncTypes "github.com/filecoin-project/venus/pkg/chainsync/types" - "github.com/filecoin-project/venus/pkg/crypto" - "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - "github.com/filecoin-project/venus/venus-shared/types" - "github.com/ipfs/go-cid" - ipld "github.com/ipfs/go-ipld-format" - "github.com/libp2p/go-libp2p-core/metrics" - "github.com/libp2p/go-libp2p-core/peer" - ma "github.com/multiformats/go-multiaddr" - "io" - "time" -) - -type FullNodeStruct struct { - IDagServiceStruct - IBlockStoreStruct - IChainStruct - IConfigStruct - IDiscoveryStruct - IMarketStruct - IMiningStruct - IMessagePoolStruct - IMultiSigStruct - INetworkStruct - IPaychanStruct - ISyncerStruct - IWalletStruct - IJwtAuthAPIStruct -} - -type IAccountStruct struct { - Internal struct { - StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - } -} - -func (s *IAccountStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { - return s.Internal.StateAccountKey(p0, p1, p2) -} - -type IActorStruct struct { - Internal struct { - ListActor func(p0 context.Context) (map[address.Address]*types.Actor, error) `perm:"read"` - StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `perm:"read"` - } -} - -func (s *IActorStruct) ListActor(p0 context.Context) (map[address.Address]*types.Actor, error) { - return s.Internal.ListActor(p0) -} - -func (s *IActorStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { - return s.Internal.StateGetActor(p0, p1, p2) -} - -type IBeaconStruct struct { - Internal struct { - BeaconGetEntry func(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) `perm:"read"` - } -} - -func (s *IBeaconStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) { - return s.Internal.BeaconGetEntry(p0, p1) -} - -type IBlockStoreStruct struct { - Internal struct { - ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` - ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"` - ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` - ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) `perm:"read"` - } -} - -func (s *IBlockStoreStruct) ChainDeleteObj(p0 context.Context, p1 cid.Cid) error { - return s.Internal.ChainDeleteObj(p0, p1) -} - -func (s *IBlockStoreStruct) ChainHasObj(p0 context.Context, p1 cid.Cid) (bool, error) { - return s.Internal.ChainHasObj(p0, p1) -} - -func (s *IBlockStoreStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { - return s.Internal.ChainReadObj(p0, p1) -} - -func (s *IBlockStoreStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) { - return s.Internal.ChainStatObj(p0, p1, p2) -} - -type IChainStruct struct { - IAccountStruct - IActorStruct - IBeaconStruct - IMinerStateStruct - IChainInfoStruct -} - -type IChainInfoStruct struct { - Internal struct { - BlockTime func(p0 context.Context) time.Duration `perm:"read"` - ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) `perm:"read"` - ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) `perm:"read"` - ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*types.BlockMessages, error) `perm:"read"` - ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"` - ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]types.Message, error) `perm:"read"` - ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]types.Message, error) `perm:"read"` - ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` - ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*types.HeadChange, error) `perm:"read"` - ChainGetRandomnessFromBeacon func(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` - ChainGetRandomnessFromTickets func(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` - ChainGetReceipts func(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) `perm:"read"` - ChainGetTipSet func(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"` - ChainList func(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) `perm:"read"` - ChainNotify func(p0 context.Context) <-chan []*types.HeadChange `perm:"read"` - ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` - GetActor func(p0 context.Context, p1 address.Address) (*types.Actor, error) `perm:"read"` - GetEntry func(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) `perm:"read"` - GetFullBlock func(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) `perm:"read"` - GetParentStateRootActor func(p0 context.Context, p1 *types.TipSet, p2 address.Address) (*types.Actor, error) `perm:"read"` - MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*types.ChainMessage, error) `perm:"read"` - ProtocolParameters func(p0 context.Context) (*types.ProtocolParams, error) `perm:"read"` - ResolveToKeyAddr func(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) `perm:"read"` - StateGetReceipt func(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) `perm:"read"` - StateNetworkName func(p0 context.Context) (types.NetworkName, error) `perm:"read"` - StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (network.Version, error) `perm:"read"` - StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*types.MsgLookup, error) `perm:"read"` - StateSearchMsgLimited func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*types.MsgLookup, error) `perm:"read"` - StateVerifiedRegistryRootKey func(p0 context.Context, p1 types.TipSetKey) (address.Address, error) `perm:"read"` - StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` - StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*types.MsgLookup, error) `perm:"read"` - StateWaitMsgLimited func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*types.MsgLookup, error) `perm:"read"` - VerifyEntry func(p0 *types.BeaconEntry, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool `perm:"read"` - } -} - -func (s *IChainInfoStruct) BlockTime(p0 context.Context) time.Duration { - return s.Internal.BlockTime(p0) -} - -func (s *IChainInfoStruct) ChainExport(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) { - return s.Internal.ChainExport(p0, p1, p2, p3) -} - -func (s *IChainInfoStruct) ChainGetBlock(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) { - return s.Internal.ChainGetBlock(p0, p1) -} - -func (s *IChainInfoStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*types.BlockMessages, error) { - return s.Internal.ChainGetBlockMessages(p0, p1) -} - -func (s *IChainInfoStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*types.Message, error) { - return s.Internal.ChainGetMessage(p0, p1) -} - -func (s *IChainInfoStruct) ChainGetMessagesInTipset(p0 context.Context, p1 types.TipSetKey) ([]types.Message, error) { - return s.Internal.ChainGetMessagesInTipset(p0, p1) -} - -func (s *IChainInfoStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]types.Message, error) { - return s.Internal.ChainGetParentMessages(p0, p1) -} - -func (s *IChainInfoStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) { - return s.Internal.ChainGetParentReceipts(p0, p1) -} - -func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*types.HeadChange, error) { - return s.Internal.ChainGetPath(p0, p1, p2) -} - -func (s *IChainInfoStruct) ChainGetRandomnessFromBeacon(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { - return s.Internal.ChainGetRandomnessFromBeacon(p0, p1, p2, p3, p4) -} - -func (s *IChainInfoStruct) ChainGetRandomnessFromTickets(p0 context.Context, p1 types.TipSetKey, p2 acrypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { - return s.Internal.ChainGetRandomnessFromTickets(p0, p1, p2, p3, p4) -} - -func (s *IChainInfoStruct) ChainGetReceipts(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) { - return s.Internal.ChainGetReceipts(p0, p1) -} - -func (s *IChainInfoStruct) ChainGetTipSet(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) { - return s.Internal.ChainGetTipSet(p0, p1) -} - -func (s *IChainInfoStruct) ChainGetTipSetByHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { - return s.Internal.ChainGetTipSetByHeight(p0, p1, p2) -} - -func (s *IChainInfoStruct) ChainHead(p0 context.Context) (*types.TipSet, error) { - return s.Internal.ChainHead(p0) -} - -func (s *IChainInfoStruct) ChainList(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) { - return s.Internal.ChainList(p0, p1, p2) -} - -func (s *IChainInfoStruct) ChainNotify(p0 context.Context) <-chan []*types.HeadChange { - return s.Internal.ChainNotify(p0) -} - -func (s *IChainInfoStruct) ChainSetHead(p0 context.Context, p1 types.TipSetKey) error { - return s.Internal.ChainSetHead(p0, p1) -} - -func (s *IChainInfoStruct) GetActor(p0 context.Context, p1 address.Address) (*types.Actor, error) { - return s.Internal.GetActor(p0, p1) -} - -func (s *IChainInfoStruct) GetEntry(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) { - return s.Internal.GetEntry(p0, p1, p2) -} - -func (s *IChainInfoStruct) GetFullBlock(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) { - return s.Internal.GetFullBlock(p0, p1) -} - -func (s *IChainInfoStruct) GetParentStateRootActor(p0 context.Context, p1 *types.TipSet, p2 address.Address) (*types.Actor, error) { - return s.Internal.GetParentStateRootActor(p0, p1, p2) -} - -func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*types.ChainMessage, error) { - return s.Internal.MessageWait(p0, p1, p2, p3) -} - -func (s *IChainInfoStruct) ProtocolParameters(p0 context.Context) (*types.ProtocolParams, error) { - return s.Internal.ProtocolParameters(p0) -} - -func (s *IChainInfoStruct) ResolveToKeyAddr(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) { - return s.Internal.ResolveToKeyAddr(p0, p1, p2) -} - -func (s *IChainInfoStruct) StateGetReceipt(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) { - return s.Internal.StateGetReceipt(p0, p1, p2) -} - -func (s *IChainInfoStruct) StateNetworkName(p0 context.Context) (types.NetworkName, error) { - return s.Internal.StateNetworkName(p0) -} - -func (s *IChainInfoStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (network.Version, error) { - return s.Internal.StateNetworkVersion(p0, p1) -} - -func (s *IChainInfoStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*types.MsgLookup, error) { - return s.Internal.StateSearchMsg(p0, p1) -} - -func (s *IChainInfoStruct) StateSearchMsgLimited(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*types.MsgLookup, error) { - return s.Internal.StateSearchMsgLimited(p0, p1, p2) -} - -func (s *IChainInfoStruct) StateVerifiedRegistryRootKey(p0 context.Context, p1 types.TipSetKey) (address.Address, error) { - return s.Internal.StateVerifiedRegistryRootKey(p0, p1) -} - -func (s *IChainInfoStruct) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { - return s.Internal.StateVerifierStatus(p0, p1, p2) -} - -func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64) (*types.MsgLookup, error) { - return s.Internal.StateWaitMsg(p0, p1, p2) -} - -func (s *IChainInfoStruct) StateWaitMsgLimited(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*types.MsgLookup, error) { - return s.Internal.StateWaitMsgLimited(p0, p1, p2, p3) -} - -func (s *IChainInfoStruct) VerifyEntry(p0 *types.BeaconEntry, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool { - return s.Internal.VerifyEntry(p0, p1, p2) -} - -type IConfigStruct struct { - Internal struct { - ConfigGet func(p0 context.Context, p1 string) (interface{}, error) `perm:"read"` - ConfigSet func(p0 context.Context, p1 string, p2 string) error `perm:"admin"` - } -} - -func (s *IConfigStruct) ConfigGet(p0 context.Context, p1 string) (interface{}, error) { - return s.Internal.ConfigGet(p0, p1) -} - -func (s *IConfigStruct) ConfigSet(p0 context.Context, p1 string, p2 string) error { - return s.Internal.ConfigSet(p0, p1, p2) -} - -type IDagServiceStruct struct { - Internal struct { - DAGCat func(p0 context.Context, p1 cid.Cid) (io.Reader, error) `perm:"read"` - DAGGetFileSize func(p0 context.Context, p1 cid.Cid) (uint64, error) `perm:"read"` - DAGGetNode func(p0 context.Context, p1 string) (interface{}, error) `perm:"read"` - DAGImportData func(p0 context.Context, p1 io.Reader) (ipld.Node, error) `perm:"write"` - } -} - -func (s *IDagServiceStruct) DAGCat(p0 context.Context, p1 cid.Cid) (io.Reader, error) { - return s.Internal.DAGCat(p0, p1) -} - -func (s *IDagServiceStruct) DAGGetFileSize(p0 context.Context, p1 cid.Cid) (uint64, error) { - return s.Internal.DAGGetFileSize(p0, p1) -} - -func (s *IDagServiceStruct) DAGGetNode(p0 context.Context, p1 string) (interface{}, error) { - return s.Internal.DAGGetNode(p0, p1) -} - -func (s *IDagServiceStruct) DAGImportData(p0 context.Context, p1 io.Reader) (ipld.Node, error) { - return s.Internal.DAGImportData(p0, p1) -} - -type IDiscoveryStruct struct { -} - -type IJwtAuthAPIStruct struct { - Internal struct { - AuthNew func(p0 context.Context, p1 []auth.Permission) ([]byte, error) `perm:"admin"` - Verify func(p0 context.Context, p1 string, p2 string) ([]auth.Permission, error) `perm:"read"` - } -} - -func (s *IJwtAuthAPIStruct) AuthNew(p0 context.Context, p1 []auth.Permission) ([]byte, error) { - return s.Internal.AuthNew(p0, p1) -} - -func (s *IJwtAuthAPIStruct) Verify(p0 context.Context, p1 string, p2 string) ([]auth.Permission, error) { - return s.Internal.Verify(p0, p1, p2) -} - -type IMarketStruct struct { - Internal struct { - StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) `perm:"read"` - } -} - -func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) { - return s.Internal.StateMarketParticipants(p0, p1) -} - -type IMessagePoolStruct struct { - Internal struct { - GasBatchEstimateMessageGas func(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) `perm:"read"` - GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - GasEstimateGasLimit func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) `perm:"read"` - GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) `perm:"read"` - GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"` - MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` - MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` - MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` - MpoolGetConfig func(p0 context.Context) (*types.MpoolConfig, error) `perm:"read"` - MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` - MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` - MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"write"` - MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"write"` - MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` - MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` - MpoolSelects func(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) `perm:"read"` - MpoolSetConfig func(p0 context.Context, p1 *types.MpoolConfig) error `perm:"admin"` - MpoolSub func(p0 context.Context) (<-chan types.MpoolUpdate, error) `perm:"read"` - } -} - -func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) { - return s.Internal.GasBatchEstimateMessageGas(p0, p1, p2, p3) -} - -func (s *IMessagePoolStruct) GasEstimateFeeCap(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) { - return s.Internal.GasEstimateFeeCap(p0, p1, p2, p3) -} - -func (s *IMessagePoolStruct) GasEstimateGasLimit(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) { - return s.Internal.GasEstimateGasLimit(p0, p1, p2) -} - -func (s *IMessagePoolStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) { - return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) -} - -func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { - return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) -} - -func (s *IMessagePoolStruct) MpoolBatchPush(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { - return s.Internal.MpoolBatchPush(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) { - return s.Internal.MpoolBatchPushMessage(p0, p1, p2) -} - -func (s *IMessagePoolStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { - return s.Internal.MpoolBatchPushUntrusted(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolClear(p0 context.Context, p1 bool) error { - return s.Internal.MpoolClear(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolDeleteByAdress(p0 context.Context, p1 address.Address) error { - return s.Internal.MpoolDeleteByAdress(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolGetConfig(p0 context.Context) (*types.MpoolConfig, error) { - return s.Internal.MpoolGetConfig(p0) -} - -func (s *IMessagePoolStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { - return s.Internal.MpoolGetNonce(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPending(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) { - return s.Internal.MpoolPending(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPublishByAddr(p0 context.Context, p1 address.Address) error { - return s.Internal.MpoolPublishByAddr(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPublishMessage(p0 context.Context, p1 *types.SignedMessage) error { - return s.Internal.MpoolPublishMessage(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { - return s.Internal.MpoolPush(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) { - return s.Internal.MpoolPushMessage(p0, p1, p2) -} - -func (s *IMessagePoolStruct) MpoolPushUntrusted(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { - return s.Internal.MpoolPushUntrusted(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolSelect(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) { - return s.Internal.MpoolSelect(p0, p1, p2) -} - -func (s *IMessagePoolStruct) MpoolSelects(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) { - return s.Internal.MpoolSelects(p0, p1, p2) -} - -func (s *IMessagePoolStruct) MpoolSetConfig(p0 context.Context, p1 *types.MpoolConfig) error { - return s.Internal.MpoolSetConfig(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolSub(p0 context.Context) (<-chan types.MpoolUpdate, error) { - return s.Internal.MpoolSub(p0) -} - -type IMinerStateStruct struct { - Internal struct { - StateCirculatingSupply func(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` - StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) `perm:"read"` - StateListActors func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` - StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` - StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) `perm:"read"` - StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) `perm:"read"` - StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) `perm:"read"` - StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` - StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) `perm:"read"` - StateMinerFaults func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - StateMinerInfo func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) `perm:"read"` - StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) `perm:"read"` - StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) `perm:"read"` - StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `perm:"read"` - StateMinerRecoveries func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) `perm:"read"` - StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) `perm:"read"` - StateMinerSectorSize func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (abi.SectorSize, error) `perm:"read"` - StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` - StateMinerWorkerAddress func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - StateSectorExpiration func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) `perm:"read"` - StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` - StateSectorPartition func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` - StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` - StateVMCirculatingSupplyInternal func(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) `perm:"read"` - StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` - } -} - -func (s *IMinerStateStruct) StateCirculatingSupply(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) { - return s.Internal.StateCirculatingSupply(p0, p1) -} - -func (s *IMinerStateStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) { - return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateListActors(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { - return s.Internal.StateListActors(p0, p1) -} - -func (s *IMinerStateStruct) StateListMiners(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { - return s.Internal.StateListMiners(p0, p1) -} - -func (s *IMinerStateStruct) StateLookupID(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { - return s.Internal.StateLookupID(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) { - return s.Internal.StateMarketBalance(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) { - return s.Internal.StateMarketDeals(p0, p1) -} - -func (s *IMinerStateStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) { - return s.Internal.StateMarketStorageDeal(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerActiveSectors(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { - return s.Internal.StateMinerActiveSectors(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerAvailableBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) { - return s.Internal.StateMinerAvailableBalance(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) { - return s.Internal.StateMinerDeadlines(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerFaults(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { - return s.Internal.StateMinerFaults(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerInfo(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) { - return s.Internal.StateMinerInfo(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { - return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) { - return s.Internal.StateMinerPartitions(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) { - return s.Internal.StateMinerPower(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerPreCommitDepositForPower(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { - return s.Internal.StateMinerPreCommitDepositForPower(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerProvingDeadline(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) { - return s.Internal.StateMinerProvingDeadline(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerRecoveries(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { - return s.Internal.StateMinerRecoveries(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerSectorAllocated(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) { - return s.Internal.StateMinerSectorAllocated(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) { - return s.Internal.StateMinerSectorCount(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerSectorSize(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (abi.SectorSize, error) { - return s.Internal.StateMinerSectorSize(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerSectors(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { - return s.Internal.StateMinerSectors(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerWorkerAddress(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { - return s.Internal.StateMinerWorkerAddress(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateSectorExpiration(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) { - return s.Internal.StateSectorExpiration(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateSectorGetInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) { - return s.Internal.StateSectorGetInfo(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateSectorPartition(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) { - return s.Internal.StateSectorPartition(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateSectorPreCommitInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { - return s.Internal.StateSectorPreCommitInfo(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) { - return s.Internal.StateVMCirculatingSupplyInternal(p0, p1) -} - -func (s *IMinerStateStruct) StateVerifiedClientStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { - return s.Internal.StateVerifiedClientStatus(p0, p1, p2) -} - -type IMiningStruct struct { - Internal struct { - MinerCreateBlock func(p0 context.Context, p1 *types.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` - MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*types.MiningBaseInfo, error) `perm:"read"` - } -} - -func (s *IMiningStruct) MinerCreateBlock(p0 context.Context, p1 *types.BlockTemplate) (*types.BlockMsg, error) { - return s.Internal.MinerCreateBlock(p0, p1) -} - -func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*types.MiningBaseInfo, error) { - return s.Internal.MinerGetBaseInfo(p0, p1, p2, p3) -} - -type IMultiSigStruct struct { - Internal struct { - MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) `perm:"sign"` - MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (cid.Cid, error) `perm:"sign"` - MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` - MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) `perm:"sign"` - MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) `perm:"sign"` - MsigCancelTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) `perm:"sign"` - MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) `perm:"sign"` - MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` - MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) `perm:"sign"` - MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` - MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (cid.Cid, error) `perm:"sign"` - MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (cid.Cid, error) `perm:"sign"` - MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (cid.Cid, error) `perm:"sign"` - } -} - -func (s *IMultiSigStruct) MsigAddApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) { - return s.Internal.MsigAddApprove(p0, p1, p2, p3, p4, p5, p6) -} - -func (s *IMultiSigStruct) MsigAddCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (cid.Cid, error) { - return s.Internal.MsigAddCancel(p0, p1, p2, p3, p4, p5) -} - -func (s *IMultiSigStruct) MsigAddPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) { - return s.Internal.MsigAddPropose(p0, p1, p2, p3, p4) -} - -func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) { - return s.Internal.MsigApprove(p0, p1, p2, p3) -} - -func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) { - return s.Internal.MsigCancel(p0, p1, p2, p3) -} - -func (s *IMultiSigStruct) MsigCancelTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) { - return s.Internal.MsigCancelTxnHash(p0, p1, p2, p3, p4, p5, p6, p7) -} - -func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) { - return s.Internal.MsigCreate(p0, p1, p2, p3, p4, p5, p6) -} - -func (s *IMultiSigStruct) MsigGetVested(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) { - return s.Internal.MsigGetVested(p0, p1, p2, p3) -} - -func (s *IMultiSigStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) { - return s.Internal.MsigPropose(p0, p1, p2, p3, p4, p5, p6) -} - -func (s *IMultiSigStruct) MsigRemoveSigner(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) { - return s.Internal.MsigRemoveSigner(p0, p1, p2, p3, p4) -} - -func (s *IMultiSigStruct) MsigSwapApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (cid.Cid, error) { - return s.Internal.MsigSwapApprove(p0, p1, p2, p3, p4, p5, p6) -} - -func (s *IMultiSigStruct) MsigSwapCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (cid.Cid, error) { - return s.Internal.MsigSwapCancel(p0, p1, p2, p3, p4, p5) -} - -func (s *IMultiSigStruct) MsigSwapPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (cid.Cid, error) { - return s.Internal.MsigSwapPropose(p0, p1, p2, p3, p4) -} - -type INetworkStruct struct { - Internal struct { - NetAddrsListen func(p0 context.Context) (peer.AddrInfo, error) `perm:"read"` - NetworkConnect func(p0 context.Context, p1 []string) (<-chan types.ConnectionResult, error) `perm:"read"` - NetworkFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` - NetworkFindProvidersAsync func(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo `perm:"read"` - NetworkGetBandwidthStats func(p0 context.Context) metrics.Stats `perm:"admin"` - NetworkGetClosestPeers func(p0 context.Context, p1 string) ([]peer.ID, error) `perm:"admin"` - NetworkGetPeerAddresses func(p0 context.Context) []ma.Multiaddr `perm:"admin"` - NetworkGetPeerID func(p0 context.Context) peer.ID `perm:"admin"` - NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*types.SwarmConnInfos, error) `perm:"read"` - Version func(p0 context.Context) (types.Version, error) `perm:"read"` - } -} - -func (s *INetworkStruct) NetAddrsListen(p0 context.Context) (peer.AddrInfo, error) { - return s.Internal.NetAddrsListen(p0) -} - -func (s *INetworkStruct) NetworkConnect(p0 context.Context, p1 []string) (<-chan types.ConnectionResult, error) { - return s.Internal.NetworkConnect(p0, p1) -} - -func (s *INetworkStruct) NetworkFindPeer(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) { - return s.Internal.NetworkFindPeer(p0, p1) -} - -func (s *INetworkStruct) NetworkFindProvidersAsync(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo { - return s.Internal.NetworkFindProvidersAsync(p0, p1, p2) -} - -func (s *INetworkStruct) NetworkGetBandwidthStats(p0 context.Context) metrics.Stats { - return s.Internal.NetworkGetBandwidthStats(p0) -} - -func (s *INetworkStruct) NetworkGetClosestPeers(p0 context.Context, p1 string) ([]peer.ID, error) { - return s.Internal.NetworkGetClosestPeers(p0, p1) -} - -func (s *INetworkStruct) NetworkGetPeerAddresses(p0 context.Context) []ma.Multiaddr { - return s.Internal.NetworkGetPeerAddresses(p0) -} - -func (s *INetworkStruct) NetworkGetPeerID(p0 context.Context) peer.ID { - return s.Internal.NetworkGetPeerID(p0) -} - -func (s *INetworkStruct) NetworkPeers(p0 context.Context, p1 bool, p2 bool, p3 bool) (*types.SwarmConnInfos, error) { - return s.Internal.NetworkPeers(p0, p1, p2, p3) -} - -func (s *INetworkStruct) Version(p0 context.Context) (types.Version, error) { - return s.Internal.Version(p0) -} - -type IPaychanStruct struct { - Internal struct { - PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` - PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` - PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` - PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) `perm:"sign"` - PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` - PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` - PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) `perm:"sign"` - PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychStatus func(p0 context.Context, p1 address.Address) (*types.Status, error) `perm:"read"` - PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` - PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` - PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` - PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*types.VoucherCreateResult, error) `perm:"sign"` - PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` - PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` - } -} - -func (s *IPaychanStruct) PaychAllocateLane(p0 context.Context, p1 address.Address) (uint64, error) { - return s.Internal.PaychAllocateLane(p0, p1) -} - -func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*types.ChannelAvailableFunds, error) { - return s.Internal.PaychAvailableFunds(p0, p1) -} - -func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*types.ChannelAvailableFunds, error) { - return s.Internal.PaychAvailableFundsByFromTo(p0, p1, p2) -} - -func (s *IPaychanStruct) PaychCollect(p0 context.Context, p1 address.Address) (cid.Cid, error) { - return s.Internal.PaychCollect(p0, p1) -} - -func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) { - return s.Internal.PaychGet(p0, p1, p2, p3) -} - -func (s *IPaychanStruct) PaychGetWaitReady(p0 context.Context, p1 cid.Cid) (address.Address, error) { - return s.Internal.PaychGetWaitReady(p0, p1) -} - -func (s *IPaychanStruct) PaychList(p0 context.Context) ([]address.Address, error) { - return s.Internal.PaychList(p0) -} - -func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) { - return s.Internal.PaychNewPayment(p0, p1, p2, p3) -} - -func (s *IPaychanStruct) PaychSettle(p0 context.Context, p1 address.Address) (cid.Cid, error) { - return s.Internal.PaychSettle(p0, p1) -} - -func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*types.Status, error) { - return s.Internal.PaychStatus(p0, p1) -} - -func (s *IPaychanStruct) PaychVoucherAdd(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) { - return s.Internal.PaychVoucherAdd(p0, p1, p2, p3, p4) -} - -func (s *IPaychanStruct) PaychVoucherCheckSpendable(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) { - return s.Internal.PaychVoucherCheckSpendable(p0, p1, p2, p3, p4) -} - -func (s *IPaychanStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error { - return s.Internal.PaychVoucherCheckValid(p0, p1, p2) -} - -func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*types.VoucherCreateResult, error) { - return s.Internal.PaychVoucherCreate(p0, p1, p2, p3) -} - -func (s *IPaychanStruct) PaychVoucherList(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) { - return s.Internal.PaychVoucherList(p0, p1) -} - -func (s *IPaychanStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) { - return s.Internal.PaychVoucherSubmit(p0, p1, p2, p3, p4) -} - -type ISyncerStruct struct { - Internal struct { - ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"write"` - ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (big.Int, error) `perm:"read"` - Concurrent func(p0 context.Context) int64 `perm:"read"` - SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` - StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*types.InvocResult, error) `perm:"read"` - SyncState func(p0 context.Context) (*types.SyncState, error) `perm:"read"` - SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` - SyncerTracker func(p0 context.Context) *syncTypes.TargetTracker `perm:"read"` - } -} - -func (s *ISyncerStruct) ChainSyncHandleNewTipSet(p0 context.Context, p1 *types.ChainInfo) error { - return s.Internal.ChainSyncHandleNewTipSet(p0, p1) -} - -func (s *ISyncerStruct) ChainTipSetWeight(p0 context.Context, p1 types.TipSetKey) (big.Int, error) { - return s.Internal.ChainTipSetWeight(p0, p1) -} - -func (s *ISyncerStruct) Concurrent(p0 context.Context) int64 { - return s.Internal.Concurrent(p0) -} - -func (s *ISyncerStruct) SetConcurrent(p0 context.Context, p1 int64) error { - return s.Internal.SetConcurrent(p0, p1) -} - -func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*types.InvocResult, error) { - return s.Internal.StateCall(p0, p1, p2) -} - -func (s *ISyncerStruct) SyncState(p0 context.Context) (*types.SyncState, error) { - return s.Internal.SyncState(p0) -} - -func (s *ISyncerStruct) SyncSubmitBlock(p0 context.Context, p1 *types.BlockMsg) error { - return s.Internal.SyncSubmitBlock(p0, p1) -} - -func (s *ISyncerStruct) SyncerTracker(p0 context.Context) *syncTypes.TargetTracker { - return s.Internal.SyncerTracker(p0) -} - -type IWalletStruct struct { - Internal struct { - HasPassword func(p0 context.Context) bool `perm:"admin"` - LockWallet func(p0 context.Context) error `perm:"admin"` - SetPassword func(p0 context.Context, p1 []byte) error `perm:"admin"` - UnLockWallet func(p0 context.Context, p1 []byte) error `perm:"admin"` - WalletAddresses func(p0 context.Context) []address.Address `perm:"admin"` - WalletBalance func(p0 context.Context, p1 address.Address) (abi.TokenAmount, error) `perm:"read"` - WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"` - WalletExport func(p0 address.Address, p1 string) (*crypto.KeyInfo, error) `perm:"admin"` - WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` - WalletImport func(p0 *crypto.KeyInfo) (address.Address, error) `perm:"admin"` - WalletNewAddress func(p0 address.Protocol) (address.Address, error) `perm:"write"` - WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` - WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) `perm:"sign"` - WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) `perm:"sign"` - WalletState func(p0 context.Context) int `perm:"admin"` - } -} - -func (s *IWalletStruct) HasPassword(p0 context.Context) bool { - return s.Internal.HasPassword(p0) -} - -func (s *IWalletStruct) LockWallet(p0 context.Context) error { - return s.Internal.LockWallet(p0) -} - -func (s *IWalletStruct) SetPassword(p0 context.Context, p1 []byte) error { - return s.Internal.SetPassword(p0, p1) -} - -func (s *IWalletStruct) UnLockWallet(p0 context.Context, p1 []byte) error { - return s.Internal.UnLockWallet(p0, p1) -} - -func (s *IWalletStruct) WalletAddresses(p0 context.Context) []address.Address { - return s.Internal.WalletAddresses(p0) -} - -func (s *IWalletStruct) WalletBalance(p0 context.Context, p1 address.Address) (abi.TokenAmount, error) { - return s.Internal.WalletBalance(p0, p1) -} - -func (s *IWalletStruct) WalletDefaultAddress(p0 context.Context) (address.Address, error) { - return s.Internal.WalletDefaultAddress(p0) -} - -func (s *IWalletStruct) WalletExport(p0 address.Address, p1 string) (*crypto.KeyInfo, error) { - return s.Internal.WalletExport(p0, p1) -} - -func (s *IWalletStruct) WalletHas(p0 context.Context, p1 address.Address) (bool, error) { - return s.Internal.WalletHas(p0, p1) -} - -func (s *IWalletStruct) WalletImport(p0 *crypto.KeyInfo) (address.Address, error) { - return s.Internal.WalletImport(p0) -} - -func (s *IWalletStruct) WalletNewAddress(p0 address.Protocol) (address.Address, error) { - return s.Internal.WalletNewAddress(p0) -} - -func (s *IWalletStruct) WalletSetDefault(p0 context.Context, p1 address.Address) error { - return s.Internal.WalletSetDefault(p0, p1) -} - -func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) { - return s.Internal.WalletSign(p0, p1, p2, p3) -} - -func (s *IWalletStruct) WalletSignMessage(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) { - return s.Internal.WalletSignMessage(p0, p1, p2) -} - -func (s *IWalletStruct) WalletState(p0 context.Context) int { - return s.Internal.WalletState(p0) -} diff --git a/app/node/rpc.go b/app/node/rpc.go index b4af905ba5..5fc3663486 100644 --- a/app/node/rpc.go +++ b/app/node/rpc.go @@ -4,9 +4,9 @@ import ( "reflect" "github.com/filecoin-project/go-jsonrpc" - "github.com/filecoin-project/venus/app/client" "github.com/filecoin-project/venus/app/client/funcrule" v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" "github.com/ipfs-force-community/metrics/ratelimit" "golang.org/x/xerrors" ) @@ -113,13 +113,13 @@ func (builder *RPCBuilder) Build(version string, limiter *ratelimit.RateLimiter) server.Register(nameSpace, &fullNodeV0) } case "v1": - var fullNode client.FullNodeStruct + var fullNode v1api.FullNodeStruct for _, apiStruct := range builder.v1APIStruct { funcrule.PermissionProxy(apiStruct, &fullNode) } if limiter != nil { - var rateLimitAPI client.FullNodeStruct + var rateLimitAPI v1api.FullNodeStruct limiter.WraperLimiter(fullNode, &rateLimitAPI) fullNode = rateLimitAPI } diff --git a/app/submodule/apitypes/blockstore.go b/app/submodule/apitypes/blockstore.go deleted file mode 100644 index 96bb394be7..0000000000 --- a/app/submodule/apitypes/blockstore.go +++ /dev/null @@ -1,6 +0,0 @@ -package apitypes - -type ObjStat struct { - Size uint64 - Links uint64 -} diff --git a/app/submodule/apitypes/chain.go b/app/submodule/apitypes/chain.go deleted file mode 100644 index 7bb3eaab41..0000000000 --- a/app/submodule/apitypes/chain.go +++ /dev/null @@ -1,90 +0,0 @@ -package apitypes - -import ( - "time" - - "github.com/filecoin-project/go-bitfield" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/chain" - "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" - "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" - "github.com/filecoin-project/venus/venus-shared/types" -) - -type Partition struct { - AllSectors bitfield.BitField - FaultySectors bitfield.BitField - RecoveringSectors bitfield.BitField - LiveSectors bitfield.BitField - ActiveSectors bitfield.BitField -} - -// SectorInfo provides information about a sector construction -type SectorInfo struct { - Size abi.SectorSize - MaxPieceSize abi.UnpaddedPieceSize -} - -// ProtocolParams contains parameters that modify the filecoin nodes protocol -type ProtocolParams struct { - Network string - BlockTime time.Duration - SupportedSectors []SectorInfo -} - -type Deadline struct { - PostSubmissions bitfield.BitField - DisputableProofCount uint64 -} - -// BlsMessages[x].cid = Cids[x] -// SecpkMessages[y].cid = Cids[BlsMessages.length + y] -type BlockMessages struct { - BlsMessages []*types.Message - SecpkMessages []*types.SignedMessage - Cids []cid.Cid -} - -type MarketDeal struct { - Proposal market.DealProposal - State market.DealState -} - -type NetworkName string - -type MinerSectors struct { - // Live sectors that should be proven. - Live uint64 - // Sectors actively contributing to power. - Active uint64 - // Sectors with failed proofs. - Faulty uint64 -} - -type MarketBalance struct { - Escrow big.Int - Locked big.Int -} - -var MarketBalanceNil = MarketBalance{} - -type Message struct { - Cid cid.Cid - Message *types.Message -} - -type MinerPower struct { - MinerPower power.Claim - TotalPower power.Claim - HasMinPower bool -} - -type DealCollateralBounds struct { - Min abi.TokenAmount - Max abi.TokenAmount -} - -type MsgLookup = chain.MsgLookup diff --git a/app/submodule/apitypes/checkstatuscode_string.go b/app/submodule/apitypes/checkstatuscode_string.go deleted file mode 100644 index afd2cf5734..0000000000 --- a/app/submodule/apitypes/checkstatuscode_string.go +++ /dev/null @@ -1,35 +0,0 @@ -// Code generated by "stringer -type=CheckStatusCode -trimprefix=CheckStatus"; DO NOT EDIT. - -package apitypes - -import "strconv" - -func _() { - // An "invalid array index" compiler error signifies that the constant values have changed. - // Re-run the stringer command to generate them again. - var x [1]struct{} - _ = x[CheckStatusMessageSerialize-1] - _ = x[CheckStatusMessageSize-2] - _ = x[CheckStatusMessageValidity-3] - _ = x[CheckStatusMessageMinGas-4] - _ = x[CheckStatusMessageMinBaseFee-5] - _ = x[CheckStatusMessageBaseFee-6] - _ = x[CheckStatusMessageBaseFeeLowerBound-7] - _ = x[CheckStatusMessageBaseFeeUpperBound-8] - _ = x[CheckStatusMessageGetStateNonce-9] - _ = x[CheckStatusMessageNonce-10] - _ = x[CheckStatusMessageGetStateBalance-11] - _ = x[CheckStatusMessageBalance-12] -} - -const _CheckStatusCode_name = "MessageSerializeMessageSizeMessageValidityMessageMinGasMessageMinBaseFeeMessageBaseFeeMessageBaseFeeLowerBoundMessageBaseFeeUpperBoundMessageGetStateNonceMessageNonceMessageGetStateBalanceMessageBalance" - -var _CheckStatusCode_index = [...]uint8{0, 16, 27, 42, 55, 72, 86, 110, 134, 154, 166, 188, 202} - -func (i CheckStatusCode) String() string { - i -= 1 - if i < 0 || i >= CheckStatusCode(len(_CheckStatusCode_index)-1) { - return "CheckStatusCode(" + strconv.FormatInt(int64(i+1), 10) + ")" - } - return _CheckStatusCode_name[_CheckStatusCode_index[i]:_CheckStatusCode_index[i+1]] -} diff --git a/app/submodule/apitypes/mining.go b/app/submodule/apitypes/mining.go deleted file mode 100644 index fd87d15cf0..0000000000 --- a/app/submodule/apitypes/mining.go +++ /dev/null @@ -1,33 +0,0 @@ -package apitypes - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" - - "github.com/filecoin-project/venus/venus-shared/actors/builtin" - "github.com/filecoin-project/venus/venus-shared/types" -) - -type MiningBaseInfo struct { //nolint - MinerPower abi.StoragePower - NetworkPower abi.StoragePower - Sectors []builtin.ExtendedSectorInfo - WorkerKey address.Address - SectorSize abi.SectorSize - PrevBeaconEntry types.BeaconEntry - BeaconEntries []types.BeaconEntry - EligibleForMining bool -} - -type BlockTemplate struct { - Miner address.Address - Parents types.TipSetKey - Ticket types.Ticket - Eproof *types.ElectionProof - BeaconValues []*types.BeaconEntry - Messages []*types.SignedMessage - Epoch abi.ChainEpoch - Timestamp uint64 - WinningPoStProof []proof2.PoStProof -} diff --git a/app/submodule/apitypes/mpool.go b/app/submodule/apitypes/mpool.go deleted file mode 100644 index f2a6465dbb..0000000000 --- a/app/submodule/apitypes/mpool.go +++ /dev/null @@ -1,43 +0,0 @@ -package apitypes - -import ( - "github.com/filecoin-project/venus/venus-shared/types" - "github.com/ipfs/go-cid" -) - -type CheckStatusCode int - -//go:generate go run golang.org/x/tools/cmd/stringer -type=CheckStatusCode -trimprefix=CheckStatus -const ( - _ CheckStatusCode = iota - // Message Checks - CheckStatusMessageSerialize - CheckStatusMessageSize - CheckStatusMessageValidity - CheckStatusMessageMinGas - CheckStatusMessageMinBaseFee - CheckStatusMessageBaseFee - CheckStatusMessageBaseFeeLowerBound - CheckStatusMessageBaseFeeUpperBound - CheckStatusMessageGetStateNonce - CheckStatusMessageNonce - CheckStatusMessageGetStateBalance - CheckStatusMessageBalance -) - -type CheckStatus struct { - Code CheckStatusCode - OK bool - Err string - Hint map[string]interface{} -} - -type MessageCheckStatus struct { - Cid cid.Cid - CheckStatus -} - -type MessagePrototype struct { - Message types.Message - ValidNonce bool -} diff --git a/app/submodule/apitypes/network.go b/app/submodule/apitypes/network.go deleted file mode 100644 index 9be3773b2d..0000000000 --- a/app/submodule/apitypes/network.go +++ /dev/null @@ -1,14 +0,0 @@ -package apitypes - -import "github.com/filecoin-project/venus/venus-shared/api" - -// Version provides various build-time information -type Version struct { - Version string - - // APIVersion is a binary encoded semver version of the remote implementing - // this api - // - // See APIVersion in build/version.go - APIVersion api.Version -} diff --git a/app/submodule/apitypes/paych.go b/app/submodule/apitypes/paych.go deleted file mode 100644 index bc0dc3a2d4..0000000000 --- a/app/submodule/apitypes/paych.go +++ /dev/null @@ -1,29 +0,0 @@ -package apitypes - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/specs-actors/actors/builtin/paych" - "github.com/ipfs/go-cid" -) - -type ChannelInfo struct { - Channel address.Address - WaitSentinel cid.Cid -} - -type PaymentInfo struct { - Channel address.Address - WaitSentinel cid.Cid - Vouchers []*paych.SignedVoucher -} - -type VoucherSpec struct { - Amount big.Int - TimeLockMin abi.ChainEpoch - TimeLockMax abi.ChainEpoch - MinSettle abi.ChainEpoch - - Extra *paych.ModVerifyParams -} diff --git a/app/submodule/apitypes/syncer.go b/app/submodule/apitypes/syncer.go deleted file mode 100644 index 06bbca1f0e..0000000000 --- a/app/submodule/apitypes/syncer.go +++ /dev/null @@ -1,66 +0,0 @@ -package apitypes - -import ( - "fmt" - "time" - - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/venus-shared/types" - "github.com/ipfs/go-cid" -) - -type ComputeStateOutput struct { - Root cid.Cid - Trace []*types.InvocResult -} - -type SyncState struct { - ActiveSyncs []ActiveSync - - VMApplied uint64 -} - -//just compatible code lotus -type SyncStateStage int - -const ( - StageIdle = SyncStateStage(iota) - StageHeaders - StagePersistHeaders - StageMessages - StageSyncComplete - StageSyncErrored - StageFetchingMessages -) - -func (v SyncStateStage) String() string { - switch v { - case StageHeaders: - return "header sync" - case StagePersistHeaders: - return "persisting headers" - case StageMessages: - return "message sync" - case StageSyncComplete: - return "complete" - case StageSyncErrored: - return "error" - case StageFetchingMessages: - return "fetching messages" - default: - return fmt.Sprintf("", v) - } -} - -type ActiveSync struct { - WorkerID uint64 - Base *types.TipSet - Target *types.TipSet - - Stage SyncStateStage - Height abi.ChainEpoch - - Start time.Time - End time.Time - Message string -} diff --git a/build/main.go b/build/main.go index 9d42656360..a415e65dfb 100644 --- a/build/main.go +++ b/build/main.go @@ -266,14 +266,6 @@ func test(userArgs ...string) { log.Printf("Tests finished in %.1f seconds\n", end.Sub(begin).Seconds()) } -func genAPI() { - log.Println("generate api...") - - runCmd(cmd("go run ./tools/gen/api/proxygen.go")) - runCmd(cmd("gofmt -s -l -w ./app/client/v0api/full.go")) - runCmd(cmd("gofmt -s -l -w ./app/client/full.go")) -} - func main() { args := os.Args[1:] @@ -309,8 +301,6 @@ func main() { case "best": build() test(args[1:]...) - case "gen-api": - genAPI() case "all": deps() lint() diff --git a/fixtures/proof-params/parameters.json b/fixtures/proof-params/parameters.json deleted file mode 100644 index 1d45844545..0000000000 --- a/fixtures/proof-params/parameters.json +++ /dev/null @@ -1,152 +0,0 @@ -{ - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0170db1f394b35d995252228ee359194b13199d259380541dc529fb0099096b0.params": { - "cid": "QmVxjFRyhmyQaZEtCh7nk2abc7LhFkzhnRX4rcHqCCpikR", - "digest": "7610b9f82bfc88405b7a832b651ce2f6", - "sector_size": 2048 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0170db1f394b35d995252228ee359194b13199d259380541dc529fb0099096b0.vk": { - "cid": "QmcS5JZs8X3TdtkEBpHAdUYjdNDqcL7fWQFtQz69mpnu2X", - "digest": "0e0958009936b9d5e515ec97b8cb792d", - "sector_size": 2048 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0cfb4f178bbb71cf2ecfcd42accce558b27199ab4fb59cb78f2483fe21ef36d9.params": { - "cid": "QmUiRx71uxfmUE8V3H9sWAsAXoM88KR4eo1ByvvcFNeTLR", - "digest": "1a7d4a9c8a502a497ed92a54366af33f", - "sector_size": 536870912 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0cfb4f178bbb71cf2ecfcd42accce558b27199ab4fb59cb78f2483fe21ef36d9.vk": { - "cid": "QmfCeddjFpWtavzfEzZpJfzSajGNwfL4RjFXWAvA9TSnTV", - "digest": "4dae975de4f011f101f5a2f86d1daaba", - "sector_size": 536870912 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-3ea05428c9d11689f23529cde32fd30aabd50f7d2c93657c1d3650bca3e8ea9e.params": { - "cid": "QmcSTqDcFVLGGVYz1njhUZ7B6fkKtBumsLUwx4nkh22TzS", - "digest": "82c88066be968bb550a05e30ff6c2413", - "sector_size": 2048 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-3ea05428c9d11689f23529cde32fd30aabd50f7d2c93657c1d3650bca3e8ea9e.vk": { - "cid": "QmSTCXF2ipGA3f6muVo6kHc2URSx6PzZxGUqu7uykaH5KU", - "digest": "ffd79788d614d27919ae5bd2d94eacb6", - "sector_size": 2048 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-50c7368dea9593ed0989e70974d28024efa9d156d585b7eea1be22b2e753f331.params": { - "cid": "QmU9SBzJNrcjRFDiFc4GcApqdApN6z9X7MpUr66mJ2kAJP", - "digest": "700171ecf7334e3199437c930676af82", - "sector_size": 8388608 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-50c7368dea9593ed0989e70974d28024efa9d156d585b7eea1be22b2e753f331.vk": { - "cid": "QmbmUMa3TbbW3X5kFhExs6WgC4KeWT18YivaVmXDkB6ANG", - "digest": "79ebb55f56fda427743e35053edad8fc", - "sector_size": 8388608 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-5294475db5237a2e83c3e52fd6c2b03859a1831d45ed08c4f35dbf9a803165a9.params": { - "cid": "QmdNEL2RtqL52GQNuj8uz6mVj5Z34NVnbaJ1yMyh1oXtBx", - "digest": "c49499bb76a0762884896f9683403f55", - "sector_size": 8388608 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-5294475db5237a2e83c3e52fd6c2b03859a1831d45ed08c4f35dbf9a803165a9.vk": { - "cid": "QmUiVYCQUgr6Y13pZFr8acWpSM4xvTXUdcvGmxyuHbKhsc", - "digest": "34d4feeacd9abf788d69ef1bb4d8fd00", - "sector_size": 8388608 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-7d739b8cf60f1b0709eeebee7730e297683552e4b69cab6984ec0285663c5781.params": { - "cid": "QmVgCsJFRXKLuuUhT3aMYwKVGNA9rDeR6DCrs7cAe8riBT", - "digest": "827359440349fe8f5a016e7598993b79", - "sector_size": 536870912 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-7d739b8cf60f1b0709eeebee7730e297683552e4b69cab6984ec0285663c5781.vk": { - "cid": "QmfA31fbCWojSmhSGvvfxmxaYCpMoXP95zEQ9sLvBGHNaN", - "digest": "bd2cd62f65c1ab84f19ca27e97b7c731", - "sector_size": 536870912 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-0-0377ded656c6f524f1618760bffe4e0a1c51d5a70c4509eedae8a27555733edc.params": { - "cid": "QmaUmfcJt6pozn8ndq1JVBzLRjRJdHMTPd4foa8iw5sjBZ", - "digest": "2cf49eb26f1fee94c85781a390ddb4c8", - "sector_size": 34359738368 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-0-0377ded656c6f524f1618760bffe4e0a1c51d5a70c4509eedae8a27555733edc.vk": { - "cid": "QmR9i9KL3vhhAqTBGj1bPPC7LvkptxrH9RvxJxLN1vvsBE", - "digest": "0f8ec542485568fa3468c066e9fed82b", - "sector_size": 34359738368 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-0-559e581f022bb4e4ec6e719e563bf0e026ad6de42e56c18714a2c692b1b88d7e.params": { - "cid": "Qmdtczp7p4wrbDofmHdGhiixn9irAcN77mV9AEHZBaTt1i", - "digest": "d84f79a16fe40e9e25a36e2107bb1ba0", - "sector_size": 34359738368 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-0-559e581f022bb4e4ec6e719e563bf0e026ad6de42e56c18714a2c692b1b88d7e.vk": { - "cid": "QmZCvxKcKP97vDAk8Nxs9R1fWtqpjQrAhhfXPoCi1nkDoF", - "digest": "fc02943678dd119e69e7fab8420e8819", - "sector_size": 34359738368 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-2-2627e4006b67f99cef990c0a47d5426cb7ab0a0ad58fc1061547bf2d28b09def.params": { - "cid": "QmeAN4vuANhXsF8xP2Lx5j2L6yMSdogLzpcvqCJThRGK1V", - "digest": "3810b7780ac0e299b22ae70f1f94c9bc", - "sector_size": 68719476736 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-2-2627e4006b67f99cef990c0a47d5426cb7ab0a0ad58fc1061547bf2d28b09def.vk": { - "cid": "QmWV8rqZLxs1oQN9jxNWmnT1YdgLwCcscv94VARrhHf1T7", - "digest": "59d2bf1857adc59a4f08fcf2afaa916b", - "sector_size": 68719476736 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-2-b62098629d07946e9028127e70295ed996fe3ed25b0f9f88eb610a0ab4385a3c.params": { - "cid": "QmVkrXc1SLcpgcudK5J25HH93QvR9tNsVhVTYHm5UymXAz", - "digest": "2170a91ad5bae22ea61f2ea766630322", - "sector_size": 68719476736 - }, - "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-2-b62098629d07946e9028127e70295ed996fe3ed25b0f9f88eb610a0ab4385a3c.vk": { - "cid": "QmbfQjPD7EpzjhWGmvWAsyN2mAZ4PcYhsf3ujuhU9CSuBm", - "digest": "6d3789148fb6466d07ee1e24d6292fd6", - "sector_size": 68719476736 - }, - "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-032d3138d22506ec0082ed72b2dcba18df18477904e35bafee82b3793b06832f.params": { - "cid": "QmWceMgnWYLopMuM4AoGMvGEau7tNe5UK83XFjH5V9B17h", - "digest": "434fb1338ecfaf0f59256f30dde4968f", - "sector_size": 2048 - }, - "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-032d3138d22506ec0082ed72b2dcba18df18477904e35bafee82b3793b06832f.vk": { - "cid": "QmamahpFCstMUqHi2qGtVoDnRrsXhid86qsfvoyCTKJqHr", - "digest": "dc1ade9929ade1708238f155343044ac", - "sector_size": 2048 - }, - "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-6babf46ce344ae495d558e7770a585b2382d54f225af8ed0397b8be7c3fcd472.params": { - "cid": "QmYBpTt7LWNAWr1JXThV5VxX7wsQFLd1PHrGYVbrU1EZjC", - "digest": "6c77597eb91ab936c1cef4cf19eba1b3", - "sector_size": 536870912 - }, - "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-6babf46ce344ae495d558e7770a585b2382d54f225af8ed0397b8be7c3fcd472.vk": { - "cid": "QmWionkqH2B6TXivzBSQeSyBxojaiAFbzhjtwYRrfwd8nH", - "digest": "065179da19fbe515507267677f02823e", - "sector_size": 536870912 - }, - "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-ecd683648512ab1765faa2a5f14bab48f676e633467f0aa8aad4b55dcb0652bb.params": { - "cid": "QmPXAPPuQtuQz7Zz3MHMAMEtsYwqM1o9H1csPLeiMUQwZH", - "digest": "09e612e4eeb7a0eb95679a88404f960c", - "sector_size": 8388608 - }, - "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-ecd683648512ab1765faa2a5f14bab48f676e633467f0aa8aad4b55dcb0652bb.vk": { - "cid": "QmYCuipFyvVW1GojdMrjK1JnMobXtT4zRCZs1CGxjizs99", - "digest": "b687beb9adbd9dabe265a7e3620813e4", - "sector_size": 8388608 - }, - "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-8-0-sha256_hasher-82a357d2f2ca81dc61bb45f4a762807aedee1b0a53fd6c4e77b46a01bfef7820.params": { - "cid": "QmengpM684XLQfG8754ToonszgEg2bQeAGUan5uXTHUQzJ", - "digest": "6a388072a518cf46ebd661f5cc46900a", - "sector_size": 34359738368 - }, - "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-8-0-sha256_hasher-82a357d2f2ca81dc61bb45f4a762807aedee1b0a53fd6c4e77b46a01bfef7820.vk": { - "cid": "Qmf93EMrADXAK6CyiSfE8xx45fkMfR3uzKEPCvZC1n2kzb", - "digest": "0c7b4aac1c40fdb7eb82bc355b41addf", - "sector_size": 34359738368 - }, - "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-8-2-sha256_hasher-96f1b4a04c5c51e4759bbf224bbc2ef5a42c7100f16ec0637123f16a845ddfb2.params": { - "cid": "QmS7ye6Ri2MfFzCkcUJ7FQ6zxDKuJ6J6B8k5PN7wzSR9sX", - "digest": "1801f8a6e1b00bceb00cc27314bb5ce3", - "sector_size": 68719476736 - }, - "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-8-2-sha256_hasher-96f1b4a04c5c51e4759bbf224bbc2ef5a42c7100f16ec0637123f16a845ddfb2.vk": { - "cid": "QmehSmC6BhrgRZakPDta2ewoH9nosNzdjCqQRXsNFNUkLN", - "digest": "a89884252c04c298d0b3c81bfd884164", - "sector_size": 68719476736 - } -} diff --git a/pkg/types/chain_info.go b/pkg/types/chain_info.go deleted file mode 100644 index c5c95b30c9..0000000000 --- a/pkg/types/chain_info.go +++ /dev/null @@ -1,32 +0,0 @@ -package types - -import ( - "fmt" - "github.com/filecoin-project/venus/pkg/types/internal" - - "github.com/libp2p/go-libp2p-core/peer" -) - -// ChainInfo is used to track metadata about a peer and its chain. -type ChainInfo struct { - // The originator of the TipSetKey propagation wave. - Source peer.ID - // The peer that sent us the TipSetKey message. - Sender peer.ID - Head *internal.TipSet -} - -// NewChainInfo creates a chain info from a peer id a head tipset key and a -// chain height. -func NewChainInfo(source peer.ID, sender peer.ID, head *internal.TipSet) *ChainInfo { - return &ChainInfo{ - Source: source, - Sender: sender, - Head: head, - } -} - -// String returns a human-readable string representation of a chain info -func (i *ChainInfo) String() string { - return fmt.Sprintf("{source=%s sender:%s height=%d head=%s}", i.Source, i.Sender, i.Head.Height(), i.Head.Key()) -} diff --git a/pkg/types/gas_trace.go b/pkg/types/gas_trace.go deleted file mode 100644 index 60aff167c6..0000000000 --- a/pkg/types/gas_trace.go +++ /dev/null @@ -1,102 +0,0 @@ -package types - -import ( - "encoding/json" - "fmt" - "github.com/filecoin-project/venus/pkg/types/internal" - "runtime" - "strings" - "time" -) - -type ExecutionTrace struct { - Msg *internal.UnsignedMessage - MsgRct *internal.MessageReceipt - Error string - Duration time.Duration - GasCharges []*GasTrace - - Subcalls []ExecutionTrace -} - -type GasTrace struct { - Name string - - Location []Loc `json:"loc"` - TotalGas int64 `json:"tg"` - ComputeGas int64 `json:"cg"` - StorageGas int64 `json:"sg"` - TotalVirtualGas int64 `json:"vtg"` - VirtualComputeGas int64 `json:"vcg"` - VirtualStorageGas int64 `json:"vsg"` - - TimeTaken time.Duration `json:"tt"` - Extra interface{} `json:"ex,omitempty"` - - Callers []uintptr `json:"-"` -} - -type Loc struct { - File string - Line int - Function string -} - -func (l Loc) Show() bool { - ignorePrefix := []string{ - "reflect.", - "github.com/filecoin-project/lotus/chain/vm.(*Invoker).transform", - "github.com/filecoin-project/go-amt-ipld/", - "github.com/filecoin-project/go-amt-ipld/v2", - } - for _, pre := range ignorePrefix { - if strings.HasPrefix(l.Function, pre) { - return false - } - } - return true -} -func (l Loc) String() string { - file := strings.Split(l.File, "/") - - fn := strings.Split(l.Function, "/") - var fnpkg string - if len(fn) > 2 { - fnpkg = strings.Join(fn[len(fn)-2:], "/") - } else { - fnpkg = l.Function - } - - return fmt.Sprintf("%s@%s:%d", fnpkg, file[len(file)-1], l.Line) -} - -func (l Loc) Important() bool { - return strings.HasPrefix(l.Function, "github.com/filecoin-project/specs-actors/actors/builtin") -} - -func (gt *GasTrace) MarshalJSON() ([]byte, error) { - type gasTraceCopy GasTrace - if len(gt.Location) == 0 { - if len(gt.Callers) != 0 { - frames := runtime.CallersFrames(gt.Callers) - for { - frame, more := frames.Next() - if frame.Function == "github.com/filecoin-project/lotus/chain/vm.(*VM).ApplyMessage" { - break - } - l := Loc{ - File: frame.File, - Line: frame.Line, - Function: frame.Function, - } - gt.Location = append(gt.Location, l) - if !more { - break - } - } - } - } - - cpy := (*gasTraceCopy)(gt) - return json.Marshal(cpy) -} diff --git a/pkg/types/gen/main.go b/pkg/types/gen/main.go deleted file mode 100644 index 3d07513f5a..0000000000 --- a/pkg/types/gen/main.go +++ /dev/null @@ -1,105 +0,0 @@ -package main - -import ( - "bytes" - "fmt" - "github.com/golangci/gofmt/gofmt" - "go/ast" - "go/parser" - "go/token" - "io" - "io/fs" - "io/ioutil" - "log" - "strings" - "text/template" -) - -func main() { - if err := gen("./pkg/types/internal", "./pkg/types/types_gen.go"); err != nil { - log.Fatal(err) - } -} - -func gen(from, out string) error { - fset := token.NewFileSet() - pkgs, err := parser.ParseDir(fset, from, func(info fs.FileInfo) bool { - return !strings.HasSuffix(info.Name(), "_test.go") - }, parser.AllErrors|parser.ParseComments) - if err != nil { - return err - } - visitor := &Visitor{} - for _, pkg := range pkgs { - for _, f := range pkg.Files { - ast.Walk(visitor, f) - } - - } - - buff := bytes.NewBufferString("") - err = doTemplate(buff, visitor, `// Code generated by github.com/filecoin-project/tools/gen/api. DO NOT EDIT. - -package types -import "github.com/filecoin-project/venus/pkg/types/internal" - -//type redefine -{{range .Types}}type {{.}} = internal.{{.}} -{{end}} -//func redefine -{{range .Funcs}}var {{.}} = internal.{{.}} -{{end}} -//value redefine -{{range .Values}}var {{.}} = internal.{{.}} -{{end}} -`) - if err != nil { - return err - } - err = ioutil.WriteFile(out, buff.Bytes(), 0777) - if err != nil { - return err - } - - dff, err := gofmt.Run(out, true) - if err != nil { - return err - } - fmt.Println(string(dff)) - return nil -} - -type Visitor struct { - Types []string - Funcs []string - Values []string -} - -func (v *Visitor) Visit(node ast.Node) ast.Visitor { - switch t := node.(type) { - case *ast.TypeSpec: - if t.Name.IsExported() { - v.Types = append(v.Types, t.Name.String()) - } - - case *ast.FuncDecl: - if t.Name.IsExported() && t.Recv == nil && !isTest(t.Name.String()) { - v.Funcs = append(v.Funcs, t.Name.String()) - } - case *ast.ValueSpec: - if t.Names[0].IsExported() { - v.Values = append(v.Values, t.Names[0].String()) - } - } - - return v -} - -func isTest(str string) bool { - return strings.HasPrefix(str, "Test") -} -func doTemplate(w io.Writer, info interface{}, templ string) error { - t := template.Must(template.New(""). - Funcs(template.FuncMap{}).Parse(templ)) - return t.Execute(w, info) -} diff --git a/pkg/types/internal/actor.go b/pkg/types/internal/actor.go deleted file mode 100644 index 3d34c754df..0000000000 --- a/pkg/types/internal/actor.go +++ /dev/null @@ -1,59 +0,0 @@ -package internal - -import ( - "github.com/ipfs/go-cid" - "github.com/pkg/errors" - - "github.com/filecoin-project/go-state-types/abi" -) - -var ErrActorNotFound = errors.New("actor not found") - -// Actor is the central abstraction of entities in the system. -// -// Both individual accounts, as well as contracts (user & system level) are -// represented as actors. An actor has the following core functionality implemented on a system level: -// - track a Filecoin balance, using the `Balance` field -// - execute code stored in the `Code` field -// - read & write memory -// - replay protection, using the `Nonce` field -// -// Value sent to a non-existent address will be tracked as an empty actor that has a Balance but -// nil Code and Memory. You must nil check Code cids before comparing them. -// -// More specific capabilities for individual accounts or contract specific must be implemented -// inside the code. -// -// Not safe for concurrent access. -type Actor struct { - // Code is a CID of the VM code for this actor's implementation (or a constant for actors implemented in Go code). - // Code may be nil for an uninitialized actor (which exists because it has received a balance). - Code cid.Cid - // Head is the CID of the root of the actor's state tree. - Head cid.Cid - // Nonce is the number expected on the next message from this actor. - // Messages are processed in strict, contiguous order. - Nonce uint64 - // Balance is the amount of attoFIL in the actor's account. - Balance abi.TokenAmount -} - -// NewActor constructs a new actor. -func NewActor(code cid.Cid, balance abi.TokenAmount, head cid.Cid) *Actor { - return &Actor{ - Code: code, - Nonce: 0, - Balance: balance, - Head: head, - } -} - -// Empty tests whether the actor's code is defined. -func (t *Actor) Empty() bool { - return !t.Code.Defined() -} - -// IncrementSeqNum increments the seq number. -func (t *Actor) IncrementSeqNum() { - t.Nonce = t.Nonce + 1 -} diff --git a/pkg/types/internal/actor_test.go b/pkg/types/internal/actor_test.go deleted file mode 100644 index 928f642924..0000000000 --- a/pkg/types/internal/actor_test.go +++ /dev/null @@ -1,71 +0,0 @@ -package internal - -import ( - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - "github.com/stretchr/testify/require" - "testing" -) - -func TestActor_Empty(t *testing.T) { - nCid, err := cid.Decode("bafy2bzaceakzxxsce5w6vnv77kkcon4lcotvbcym5dfz2jwxxsy5wva3u2kzc") - require.NoError(t, err) - type fields struct { - Code cid.Cid - Head cid.Cid - Nonce uint64 - Balance abi.TokenAmount - } - tests := []struct { - name string - fields fields - want bool - }{ - { - "empty", - fields{ - Code: cid.Undef, - Head: cid.Undef, - Nonce: 0, - Balance: abi.TokenAmount{}, - }, - true, - }, - { - "not empry", - fields{ - Code: nCid, - Head: nCid, - Nonce: 0, - Balance: abi.TokenAmount{}, - }, - false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - a := &Actor{ - Code: tt.fields.Code, - Head: tt.fields.Head, - Nonce: tt.fields.Nonce, - Balance: tt.fields.Balance, - } - if got := a.Empty(); got != tt.want { - t.Errorf("Empty() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestActor_IncrementSeqNum(t *testing.T) { - actor := Actor{ - Code: cid.Undef, - Head: cid.Undef, - Nonce: 0, - Balance: abi.TokenAmount{}, - } - for i := 0; i < 10; i++ { - actor.IncrementSeqNum() - } - require.Equal(t, int(actor.Nonce), 10) -} diff --git a/pkg/types/internal/address.go b/pkg/types/internal/address.go deleted file mode 100644 index c9bf5040e0..0000000000 --- a/pkg/types/internal/address.go +++ /dev/null @@ -1,15 +0,0 @@ -package internal - -import "github.com/filecoin-project/go-address" - -// ZeroAddress the 'f' prefix doesn't matter -var ZeroAddress = mustParseAddress("f3yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaby2smx7a") - -func mustParseAddress(addr string) address.Address { - ret, err := address.NewFromString(addr) - if err != nil { - panic(err) - } - - return ret -} diff --git a/pkg/types/internal/atto_fil.go b/pkg/types/internal/atto_fil.go deleted file mode 100644 index 4684c9e25e..0000000000 --- a/pkg/types/internal/atto_fil.go +++ /dev/null @@ -1,53 +0,0 @@ -package internal - -import ( - "math/big" - "strings" - - specsbig "github.com/filecoin-project/go-state-types/big" -) - -var attoPower = 18 -var tenToTheEighteen = specsbig.Exp(specsbig.NewInt(10), specsbig.NewInt(18)) - -// NewAttoFIL allocates and returns a new AttoFIL set to x. -func NewAttoFIL(x *big.Int) specsbig.Int { - return specsbig.Int{Int: x} -} - -// NewAttoFILFromFIL returns a new AttoFIL representing a quantity -// of attofilecoin equal to x filecoin. -func NewAttoFILFromFIL(x uint64) specsbig.Int { - xAsBigInt := specsbig.NewIntUnsigned(x) - return specsbig.Mul(xAsBigInt, tenToTheEighteen) -} - -// NewAttoFILFromFILString allocates a new AttoFIL set to the value of s filecoin, -// interpreted as a decimal in base 10, and returns it and a boolean indicating success. -func NewAttoFILFromFILString(s string) (specsbig.Int, bool) { - splitNumber := strings.Split(s, ".") - // If '.' is absent from string, add an empty string to become the decimal part - if len(splitNumber) == 1 { - splitNumber = append(splitNumber, "") - } - intPart := splitNumber[0] - decPart := splitNumber[1] - // A decimal part longer than 18 digits should be an error - if len(decPart) > attoPower || len(splitNumber) > 2 { - return ZeroFIL, false - } - // The decimal is right padded with 0's if it less than 18 digits long - for len(decPart) < attoPower { - decPart += "0" - } - - return NewAttoFILFromString(intPart+decPart, 10) -} - -// NewAttoFILFromString allocates a new AttoFIL set to the value of s attofilecoin, -// interpreted in the given base, and returns it and a boolean indicating success. -func NewAttoFILFromString(s string, base int) (specsbig.Int, bool) { - out := specsbig.NewInt(0) - _, isErr := out.Int.SetString(s, base) - return out, isErr -} diff --git a/pkg/types/internal/atto_fil_test.go b/pkg/types/internal/atto_fil_test.go deleted file mode 100644 index f4f6eec969..0000000000 --- a/pkg/types/internal/atto_fil_test.go +++ /dev/null @@ -1,206 +0,0 @@ -package internal - -import ( - "math/big" - "testing" - - specsbig "github.com/filecoin-project/go-state-types/big" - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/stretchr/testify/assert" -) - -func mustParseBigInt(s string) big.Int { - bigInt, _ := new(big.Int).SetString(s, 10) - return *bigInt -} - -func TestFILToAttoFIL(t *testing.T) { - tf.UnitTest(t) - - x := NewAttoFILFromFIL(2) - v := big.NewInt(10) - v = v.Exp(v, big.NewInt(18), nil) - v = v.Mul(v, big.NewInt(2)) - assert.True(t, NewAttoFIL(v).Equals(x)) -} - -func TestZeroAttoFIL(t *testing.T) { - tf.UnitTest(t) - - z := NewAttoFILFromFIL(0) - assert.True(t, ZeroFIL.Equals(z)) -} - -func TestAttoFILComparison(t *testing.T) { - tf.UnitTest(t) - - a := NewAttoFILFromFIL(123) - b := NewAttoFILFromFIL(123) - c := NewAttoFILFromFIL(456) - - t.Run("handles comparison", func(t *testing.T) { - assert.True(t, a.Equals(b)) - assert.True(t, b.Equals(a)) - - assert.False(t, a.Equals(c)) - assert.False(t, c.Equals(a)) - - assert.True(t, a.LessThan(c)) - assert.True(t, a.LessThanEqual(c)) - assert.True(t, c.GreaterThan(a)) - assert.True(t, c.GreaterThanEqual(a)) - assert.True(t, a.GreaterThanEqual(b)) - assert.True(t, a.LessThanEqual(b)) - }) - - t.Run("treats ZeroFIL as zero", func(t *testing.T) { - d := specsbig.Sub(ZeroFIL, a) - zeroValue := NewAttoFILFromFIL(0) - - assert.True(t, zeroValue.Equals(ZeroFIL)) - assert.True(t, ZeroFIL.Equals(zeroValue)) - assert.True(t, d.LessThan(zeroValue)) - assert.True(t, zeroValue.GreaterThan(d)) - assert.True(t, c.GreaterThan(zeroValue)) - assert.True(t, zeroValue.LessThan(c)) - }) -} - -func TestAttoFILAddition(t *testing.T) { - tf.UnitTest(t) - - a := NewAttoFILFromFIL(123) - b := NewAttoFILFromFIL(456) - - t.Run("handles addition", func(t *testing.T) { - aStr := a.String() - bStr := b.String() - sum := specsbig.Add(a, b) - - assert.Equal(t, NewAttoFILFromFIL(579), sum) - - // Storage is not reused - assert.NotEqual(t, &a, &sum) - assert.NotEqual(t, &b, &sum) - - // Values have not changed. - assert.Equal(t, aStr, a.String()) - assert.Equal(t, bStr, b.String()) - }) - - t.Run("treats ZeroFIL as zero", func(t *testing.T) { - assert.True(t, specsbig.Add(ZeroFIL, a).Equals(a)) - assert.True(t, specsbig.Add(a, ZeroFIL).Equals(a)) - }) -} - -func TestAttoFILSubtraction(t *testing.T) { - tf.UnitTest(t) - - a := NewAttoFILFromFIL(456) - b := NewAttoFILFromFIL(123) - - t.Run("handles subtraction", func(t *testing.T) { - aStr := a.String() - bStr := b.String() - delta := specsbig.Sub(a, b) - - assert.Equal(t, delta, NewAttoFILFromFIL(333)) - - // Storage is not reused - assert.NotEqual(t, &a, &delta) - assert.NotEqual(t, &b, &delta) - - // Values have not changed. - assert.Equal(t, aStr, a.String()) - assert.Equal(t, bStr, b.String()) - }) - - t.Run("treats ZeroFIL as zero", func(t *testing.T) { - assert.True(t, specsbig.Sub(a, ZeroFIL).Equals(a)) - assert.True(t, specsbig.Sub(ZeroFIL, ZeroFIL).Equals(ZeroFIL)) - }) -} - -func TestAttoFILIsZero(t *testing.T) { - tf.UnitTest(t) - - p := NewAttoFILFromFIL(100) // positive - z := NewAttoFILFromFIL(0) // zero - n := specsbig.Sub(NewAttoFILFromFIL(0), p) // negative - - t.Run("returns true if zero token", func(t *testing.T) { - assert.True(t, z.IsZero()) - assert.True(t, ZeroFIL.IsZero()) - }) - - t.Run("returns false if greater than zero token", func(t *testing.T) { - assert.False(t, p.IsZero()) - }) - - t.Run("returns false if less than zero token", func(t *testing.T) { - assert.False(t, n.IsZero()) - }) -} - -func TestString(t *testing.T) { - tf.UnitTest(t) - - // A very large number of attoFIL - attoFIL, _ := new(big.Int).SetString("912129289198393123456789012345678", 10) - assert.Equal(t, "912129289198393123456789012345678", NewAttoFIL(attoFIL).String()) - - // A multiple of 1000 attoFIL - attoFIL, _ = new(big.Int).SetString("9123372036854775000", 10) - assert.Equal(t, "9123372036854775000", NewAttoFIL(attoFIL).String()) - - // Less than 10^18 attoFIL - attoFIL, _ = new(big.Int).SetString("36854775878", 10) - assert.Equal(t, "36854775878", NewAttoFIL(attoFIL).String()) - - // A multiple of 100 attFIL that is less than 10^18 - attoFIL, _ = new(big.Int).SetString("36854775800", 10) - assert.Equal(t, "36854775800", NewAttoFIL(attoFIL).String()) - - // A number of attFIL that is an integer number of FIL - attoFIL, _ = new(big.Int).SetString("123000000000000000000", 10) - assert.Equal(t, "123000000000000000000", NewAttoFIL(attoFIL).String()) -} - -func TestNewAttoFILFromFILString(t *testing.T) { - tf.UnitTest(t) - - t.Run("parses legitimate values correctly", func(t *testing.T) { - attoFIL, _ := NewAttoFILFromFILString(".12345") - assert.Equal(t, mustParseBigInt("123450000000000000"), *attoFIL.Int) - - attoFIL, _ = NewAttoFILFromFILString("000000.000000") - assert.Equal(t, mustParseBigInt("0"), *attoFIL.Int) - - attoFIL, _ = NewAttoFILFromFILString("0000.12345") - assert.Equal(t, mustParseBigInt("123450000000000000"), *attoFIL.Int) - - attoFIL, _ = NewAttoFILFromFILString("12345.0") - assert.Equal(t, mustParseBigInt("12345000000000000000000"), *attoFIL.Int) - - attoFIL, _ = NewAttoFILFromFILString("12345") - assert.Equal(t, mustParseBigInt("12345000000000000000000"), *attoFIL.Int) - }) - - t.Run("rejects nonsense values", func(t *testing.T) { - _, ok := NewAttoFILFromFILString("notanumber") - assert.False(t, ok) - - _, ok = NewAttoFILFromFILString("384042.wat") - assert.False(t, ok) - - _, ok = NewAttoFILFromFILString("78wat") - assert.False(t, ok) - - _, ok = NewAttoFILFromFILString("1234567890abcde") - assert.False(t, ok) - - _, ok = NewAttoFILFromFILString("127.0.0.1") - assert.False(t, ok) - }) -} diff --git a/pkg/types/internal/beacon.go b/pkg/types/internal/beacon.go deleted file mode 100644 index 9ac02d6a8d..0000000000 --- a/pkg/types/internal/beacon.go +++ /dev/null @@ -1,6 +0,0 @@ -package internal - -type BeaconEntry struct { - Round uint64 - Data []byte -} diff --git a/pkg/types/internal/bigint.go b/pkg/types/internal/bigint.go deleted file mode 100644 index 88d6fbb772..0000000000 --- a/pkg/types/internal/bigint.go +++ /dev/null @@ -1,99 +0,0 @@ -package internal - -import ( - "fmt" - "math/big" - - big2 "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/venus/pkg/constants" -) - -var TotalFilecoinInt = FromFil(constants.FilBase) - -var EmptyInt = BigInt{} - -type BigInt = big2.Int - -func NewInt(i uint64) BigInt { - return BigInt{Int: big.NewInt(0).SetUint64(i)} -} - -func FromFil(i uint64) BigInt { - return BigMul(NewInt(i), NewInt(constants.FilecoinPrecision)) -} - -func BigFromBytes(b []byte) BigInt { - i := big.NewInt(0).SetBytes(b) - return BigInt{Int: i} -} - -func BigFromString(s string) (BigInt, error) { - v, ok := big.NewInt(0).SetString(s, 10) - if !ok { - return BigInt{}, fmt.Errorf("failed to parse string as a big int") - } - - return BigInt{Int: v}, nil -} - -func BigMul(a, b BigInt) BigInt { - return BigInt{Int: big.NewInt(0).Mul(a.Int, b.Int)} -} - -func BigDiv(a, b BigInt) BigInt { - return BigInt{Int: big.NewInt(0).Div(a.Int, b.Int)} -} - -func BigDivFloat(num, den BigInt) float64 { - res, _ := new(big.Rat).SetFrac(num.Int, den.Int).Float64() - return res -} - -func BigMod(a, b BigInt) BigInt { - return BigInt{Int: big.NewInt(0).Mod(a.Int, b.Int)} -} - -func BigAdd(a, b BigInt) BigInt { - return BigInt{Int: big.NewInt(0).Add(a.Int, b.Int)} -} - -func BigSub(a, b BigInt) BigInt { - return BigInt{Int: big.NewInt(0).Sub(a.Int, b.Int)} -} - -func BigCmp(a, b BigInt) int { - return a.Int.Cmp(b.Int) -} - -var byteSizeUnits = []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB"} - -func SizeStr(bi BigInt) string { - r := new(big.Rat).SetInt(bi.Int) - den := big.NewRat(1, 1024) - - var i int - for f, _ := r.Float64(); f >= 1024 && i+1 < len(byteSizeUnits); f, _ = r.Float64() { - i++ - r = r.Mul(r, den) - } - - f, _ := r.Float64() - return fmt.Sprintf("%.4g %s", f, byteSizeUnits[i]) -} - -var deciUnits = []string{"", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"} - -func DeciStr(bi BigInt) string { - r := new(big.Rat).SetInt(bi.Int) - den := big.NewRat(1, 1024) - - var i int - for f, _ := r.Float64(); f >= 1024 && i+1 < len(deciUnits); f, _ = r.Float64() { - i++ - r = r.Mul(r, den) - } - - f, _ := r.Float64() - return fmt.Sprintf("%.3g %s", f, deciUnits[i]) -} diff --git a/pkg/types/internal/bigint_test.go b/pkg/types/internal/bigint_test.go deleted file mode 100644 index 7ca8acb27a..0000000000 --- a/pkg/types/internal/bigint_test.go +++ /dev/null @@ -1,103 +0,0 @@ -package internal - -import ( - "bytes" - "math/big" - "math/rand" - "strings" - "testing" - "time" - - "github.com/docker/go-units" - - "github.com/stretchr/testify/assert" -) - -func TestBigIntSerializationRoundTrip(t *testing.T) { - testValues := []string{ - "0", "1", "10", "-10", "9999", "12345678901234567891234567890123456789012345678901234567890", - } - - for _, v := range testValues { - bi, err := BigFromString(v) - if err != nil { - t.Fatal(err) - } - - buf := new(bytes.Buffer) - if err := bi.MarshalCBOR(buf); err != nil { - t.Fatal(err) - } - - var out BigInt - if err := out.UnmarshalCBOR(buf); err != nil { - t.Fatal(err) - } - - if BigCmp(out, bi) != 0 { - t.Fatal("failed to round trip BigInt through cbor") - } - - } -} - -func TestFilRoundTrip(t *testing.T) { - testValues := []string{ - "0 FIL", "1 FIL", "1.001 FIL", "100.10001 FIL", "101100 FIL", "5000.01 FIL", "5000 FIL", - } - - for _, v := range testValues { - fval, err := ParseFIL(v) - if err != nil { - t.Fatal(err) - } - - if fval.String() != v { - t.Fatal("mismatch in values!", v, fval.String()) - } - } -} - -func TestSizeStr(t *testing.T) { - cases := []struct { - in uint64 - out string - }{ - {0, "0 B"}, - {1, "1 B"}, - {1016, "1016 B"}, - {1024, "1 KiB"}, - {1000 * 1024, "1000 KiB"}, - {2000, "1.953 KiB"}, - {5 << 20, "5 MiB"}, - {11 << 60, "11 EiB"}, - } - - for _, c := range cases { - assert.Equal(t, c.out, SizeStr(NewInt(c.in)), "input %+v, produced wrong result", c) - } -} - -func TestSizeStrUnitsSymmetry(t *testing.T) { - s := rand.NewSource(time.Now().UnixNano()) - r := rand.New(s) - - for i := 0; i < 10000; i++ { - n := r.Uint64() - l := strings.ReplaceAll(units.BytesSize(float64(n)), " ", "") - r := strings.ReplaceAll(SizeStr(NewInt(n)), " ", "") - - assert.NotContains(t, l, "e+") - assert.NotContains(t, r, "e+") - - assert.Equal(t, l, r, "wrong formatting for %d", n) - } -} - -func TestSizeStrBig(t *testing.T) { - ZiB := big.NewInt(50000) - ZiB = ZiB.Lsh(ZiB, 70) - - assert.Equal(t, "5e+04 ZiB", SizeStr(BigInt{Int: ZiB}), "inout %+v, produced wrong result", ZiB) - -} diff --git a/pkg/types/internal/block.go b/pkg/types/internal/block.go deleted file mode 100644 index 10cb154831..0000000000 --- a/pkg/types/internal/block.go +++ /dev/null @@ -1,218 +0,0 @@ -package internal - -import ( - "bytes" - "encoding/json" - "fmt" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - fbig "github.com/filecoin-project/go-state-types/big" - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" - blocks "github.com/ipfs/go-block-format" - "github.com/ipfs/go-cid" - cbor "github.com/ipfs/go-ipld-cbor" - node "github.com/ipfs/go-ipld-format" - - "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/crypto" -) - -// BlockHeader is a newBlock in the blockchain. -type BlockHeader struct { - // Miner is the address of the miner actor that mined this newBlock. - Miner address.Address `json:"miner"` - - // Ticket is the ticket submitted with this newBlock. - Ticket Ticket `json:"ticket"` - - // ElectionProof is the vrf proof giving this newBlock's miner authoring rights - ElectionProof *ElectionProof `json:"electionProof"` - - // BeaconEntries contain the verifiable oracle randomness used to elect - // this newBlock's author leader - BeaconEntries []*BeaconEntry `json:"beaconEntries"` - - // WinPoStProof are the winning post proofs - WinPoStProof []proof2.PoStProof `json:"winPoStProof"` - - // Parents is the set of parents this newBlock was based on. Typically one, - // but can be several in the case where there were multiple winning ticket- - // holders for an epoch. - Parents TipSetKey `json:"parents"` - - // ParentWeight is the aggregate chain weight of the parent set. - ParentWeight fbig.Int `json:"parentWeight"` - - // Height is the chain height of this newBlock. - Height abi.ChainEpoch `json:"height"` - - // ParentStateRoot is the CID of the root of the state tree after application of the messages in the parent tipset - // to the parent tipset's state root. - ParentStateRoot cid.Cid `json:"parentStateRoot,omitempty"` - - // ParentMessageReceipts is a list of receipts corresponding to the application of the messages in the parent tipset - // to the parent tipset's state root (corresponding to this newBlock's ParentStateRoot). - ParentMessageReceipts cid.Cid `json:"parentMessageReceipts,omitempty"` - - // Messages is the set of messages included in this newBlock - Messages cid.Cid `json:"messages,omitempty"` - - // The aggregate signature of all BLS signed messages in the newBlock - BLSAggregate *crypto.Signature `json:"BLSAggregate"` - - // The timestamp, in seconds since the Unix epoch, at which this newBlock was created. - Timestamp uint64 `json:"timestamp"` - - // The signature of the miner's worker key over the newBlock - BlockSig *crypto.Signature `json:"blocksig"` - - // ForkSignaling is extra data used by miners to communicate - ForkSignaling uint64 `json:"forkSignaling"` - - //identical for all blocks in same tipset: the base fee after executing parent tipset - ParentBaseFee abi.TokenAmount `json:"parentBaseFee"` - - cachedCid cid.Cid - - cachedBytes []byte - - validated bool // internal, true if the signature has been validated -} - -// Cid returns the content id of this newBlock. -func (b *BlockHeader) Cid() cid.Cid { - if b.cachedCid == cid.Undef { - if b.cachedBytes == nil { - buf := new(bytes.Buffer) - err := b.MarshalCBOR(buf) - if err != nil { - panic(err) - } - b.cachedBytes = buf.Bytes() - } - c, err := constants.DefaultCidBuilder.Sum(b.cachedBytes) - if err != nil { - panic(err) - } - - b.cachedCid = c - } - - return b.cachedCid -} - -// ToNode converts the BlockHeader to an IPLD node. -func (b *BlockHeader) ToNode() node.Node { - buf := new(bytes.Buffer) - err := b.MarshalCBOR(buf) - if err != nil { - panic(err) - } - data := buf.Bytes() - c, err := constants.DefaultCidBuilder.Sum(data) - if err != nil { - panic(err) - } - - blk, err := blocks.NewBlockWithCid(data, c) - if err != nil { - panic(err) - } - n, err := cbor.DecodeBlock(blk) - if err != nil { - panic(err) - } - return n -} - -func (b *BlockHeader) String() string { - errStr := "(error encoding BlockHeader)" - c := b.Cid() - js, err := json.MarshalIndent(b, "", " ") - if err != nil { - return errStr - } - return fmt.Sprintf("BlockHeader cid=[%v]: %s", c, string(js)) -} - -// DecodeBlock decodes raw cbor bytes into a BlockHeader. -func DecodeBlock(b []byte) (*BlockHeader, error) { - var out BlockHeader - if err := out.UnmarshalCBOR(bytes.NewReader(b)); err != nil { - return nil, err - } - - out.cachedBytes = b - - return &out, nil -} - -// Equals returns true if the BlockHeader is equal to other. -func (b *BlockHeader) Equals(other *BlockHeader) bool { - return b.Cid().Equals(other.Cid()) -} - -// SignatureData returns the newBlock's bytes with a null signature field for -// signature creation and verification -func (b *BlockHeader) SignatureData() []byte { - tmp := &BlockHeader{ - Miner: b.Miner, - Ticket: b.Ticket, - ElectionProof: b.ElectionProof, - Parents: b.Parents, - ParentWeight: b.ParentWeight, - Height: b.Height, - Messages: b.Messages, - ParentStateRoot: b.ParentStateRoot, - ParentMessageReceipts: b.ParentMessageReceipts, - WinPoStProof: b.WinPoStProof, - BeaconEntries: b.BeaconEntries, - Timestamp: b.Timestamp, - BLSAggregate: b.BLSAggregate, - ForkSignaling: b.ForkSignaling, - ParentBaseFee: b.ParentBaseFee, - // BlockSig omitted - } - - return tmp.ToNode().RawData() -} - -// Serialize serialize blockheader to binary -func (b *BlockHeader) Serialize() ([]byte, error) { - buf := new(bytes.Buffer) - if err := b.MarshalCBOR(buf); err != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -// ToStorageBlock convert blockheader to data block with cid -func (b *BlockHeader) ToStorageBlock() (blocks.Block, error) { - data, err := b.Serialize() - if err != nil { - return nil, err - } - - c, err := abi.CidBuilder.Sum(data) - if err != nil { - return nil, err - } - - return blocks.NewBlockWithCid(data, c) -} - -// LastTicket get ticket in block -func (b *BlockHeader) LastTicket() *Ticket { - return &b.Ticket -} - -// SetValidated set block signature is valid after checkout blocksig -func (b *BlockHeader) SetValidated() { - b.validated = true -} - -// IsValidated check whether block signature is valid from memory -func (b *BlockHeader) IsValidated() bool { - return b.validated -} diff --git a/pkg/types/internal/block_message.go b/pkg/types/internal/block_message.go deleted file mode 100644 index e097d18f30..0000000000 --- a/pkg/types/internal/block_message.go +++ /dev/null @@ -1,9 +0,0 @@ -package internal - -// BlockMessagesInfo contains messages for one newBlock in a tipset. -type BlockMessagesInfo struct { //nolint - BlsMessages []ChainMsg - SecpkMessages []ChainMsg - - Block *BlockHeader -} diff --git a/pkg/types/internal/block_test.go b/pkg/types/internal/block_test.go deleted file mode 100644 index b86fbcd6bc..0000000000 --- a/pkg/types/internal/block_test.go +++ /dev/null @@ -1,471 +0,0 @@ -package internal - -import ( - "bytes" - "encoding/json" - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" - "reflect" - "testing" - - "github.com/filecoin-project/go-state-types/abi" - fbig "github.com/filecoin-project/go-state-types/big" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/filecoin-project/venus/pkg/crypto" - - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" -) - -func TestTriangleEncoding(t *testing.T) { - tf.UnitTest(t) - - // We want to be sure that: - // BlockHeader => json => BlockHeader - // yields exactly the same thing as: - // BlockHeader => IPLD node => CBOR => IPLD node => json => IPLD node => BlockHeader (!) - // because we want the output encoding of a BlockHeader directly from memory - // (first case) to be exactly the same as the output encoding of a BlockHeader from - // storage (second case). WTF you might say, and you would not be wrong. The - // use case is machine-parsing command output. For example dag_daemon_test - // dumps the newBlock from memory as json (first case). It then dag gets - // the newBlock by cid which yeilds a json-encoded ipld node (first half of - // the second case). It json decodes this ipld node and then decodes the node - // into a newBlock (second half of the second case). I don't claim this is ideal, - // see: https://github.com/filecoin-project/venus/issues/599 - - newAddress := NewForTestGetter() - - testRoundTrip := func(t *testing.T, exp *BlockHeader) { - jb, err := json.Marshal(exp) - require.NoError(t, err) - var jsonRoundTrip BlockHeader - err = json.Unmarshal(jb, &jsonRoundTrip) - require.NoError(t, err) - AssertHaveSameCid(t, exp, &jsonRoundTrip) - - buf := new(bytes.Buffer) - err = jsonRoundTrip.MarshalCBOR(buf) - assert.NoError(t, err) - var cborJSONRoundTrip BlockHeader - err = cborJSONRoundTrip.UnmarshalCBOR(buf) - assert.NoError(t, err) - AssertHaveSameCid(t, exp, &cborJSONRoundTrip) - } - - // // TODO: to make this test pass. - // // This will fail with output: "varints malformed, could not reach the end" - // // which is from go-varint package, need to check. - // t.Run("encoding newBlock with zero fields works", func(t *testing.T) { - // testRoundTrip(t, &blk.BlockHeader{}) - // }) - - t.Run("encoding newBlock with nonzero fields works", func(t *testing.T) { - // We should ensure that every field is set -- zero values might - // pass when non-zero values do not due to nil/null encoding. - // posts := []blk.PoStProof{blk.NewPoStProof(constants.DevRegisteredWinningPoStProof, []byte{0x07})} - b := &BlockHeader{ - Miner: newAddress(), - Ticket: Ticket{VRFProof: []byte{0x01, 0x02, 0x03}}, - ElectionProof: &ElectionProof{VRFProof: []byte{0x0a, 0x0b}}, - Height: 2, - BeaconEntries: []*BeaconEntry{ - { - Round: 1, - Data: []byte{0x3}, - }, - }, - Messages: CidFromString(t, "somecid"), - ParentMessageReceipts: CidFromString(t, "somecid"), - Parents: NewTipSetKey(CidFromString(t, "somecid")), - ParentWeight: fbig.NewInt(1000), - ParentStateRoot: CidFromString(t, "somecid"), - Timestamp: 1, - BlockSig: &crypto.Signature{ - Type: crypto.SigTypeBLS, - Data: []byte{0x3}, - }, - BLSAggregate: &crypto.Signature{ - Type: crypto.SigTypeBLS, - Data: []byte{0x3}, - }, - // PoStProofs: posts, - ForkSignaling: 6, - } - s := reflect.TypeOf(*b) - // This check is here to request that you add a non-zero value for new fields - // to the above (and update the field count below). - // Also please add non zero fields to "b" and "diff" in TestSignatureData - // and add a new check that different values of the new field result in - // different output data. - require.Equal(t, 19, s.NumField()) // Note: this also counts private fields - testRoundTrip(t, b) - }) -} - -func TestBlockString(t *testing.T) { - tf.UnitTest(t) - - addrGetter := NewForTestGetter() - c1 := CidFromString(t, "a") - c2 := CidFromString(t, "b") - cM := CidFromString(t, "messages") - cR := CidFromString(t, "receipts") - - b := &BlockHeader{ - Miner: addrGetter(), - Ticket: Ticket{VRFProof: []uint8{}}, - Parents: NewTipSetKey(c1), - Height: 2, - ParentWeight: fbig.Zero(), - Messages: cM, - ParentStateRoot: c2, - ParentMessageReceipts: cR, - BlockSig: &crypto.Signature{Type: crypto.SigTypeSecp256k1, Data: []byte{}}, - BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS, Data: []byte{}}, - ParentBaseFee: abi.NewTokenAmount(1), - } - - cid := b.Cid() - - got := b.String() - assert.Contains(t, got, cid.String()) -} - -func TestDecodeBlock(t *testing.T) { - tf.UnitTest(t) - - t.Run("successfully decodes raw bytes to a Filecoin newBlock", func(t *testing.T) { - addrGetter := NewForTestGetter() - - c1 := CidFromString(t, "a") - c2 := CidFromString(t, "b") - cM := CidFromString(t, "messages") - cR := CidFromString(t, "receipts") - - before := &BlockHeader{ - Miner: addrGetter(), - Ticket: Ticket{VRFProof: nil}, - Parents: NewTipSetKey(c1), - Height: 2, - ParentWeight: fbig.Zero(), - Messages: cM, - ParentStateRoot: c2, - ParentMessageReceipts: cR, - BlockSig: &crypto.Signature{Type: crypto.SigTypeSecp256k1, Data: []byte{}}, - BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS, Data: []byte{}}, - ParentBaseFee: abi.NewTokenAmount(1), - } - - after, err := DecodeBlock(before.ToNode().RawData()) - require.NoError(t, err) - assert.Equal(t, after.Cid(), before.Cid()) - assert.Equal(t, before, after) - }) - - t.Run("decode failure results in an error", func(t *testing.T) { - _, err := DecodeBlock([]byte{1, 2, 3}) - assert.Error(t, err) - assert.Contains(t, err.Error(), "cbor input should be of type array") - }) -} - -func TestEquals(t *testing.T) { - tf.UnitTest(t) - addrGetter := NewForTestGetter() - minerAddr := addrGetter() - mockCid := CidFromString(t, "mock") - c1 := CidFromString(t, "a") - c2 := CidFromString(t, "b") - - s1 := CidFromString(t, "state1") - s2 := CidFromString(t, "state2") - - var h1 abi.ChainEpoch = 1 - var h2 abi.ChainEpoch = 2 - - b1 := &BlockHeader{Miner: minerAddr, Messages: mockCid, ParentMessageReceipts: mockCid, Parents: NewTipSetKey(c1), ParentStateRoot: s1, Height: h1} - b2 := &BlockHeader{Miner: minerAddr, Messages: mockCid, ParentMessageReceipts: mockCid, Parents: NewTipSetKey(c1), ParentStateRoot: s1, Height: h1} - b3 := &BlockHeader{Miner: minerAddr, Messages: mockCid, ParentMessageReceipts: mockCid, Parents: NewTipSetKey(c1), ParentStateRoot: s2, Height: h1} - b4 := &BlockHeader{Miner: minerAddr, Messages: mockCid, ParentMessageReceipts: mockCid, Parents: NewTipSetKey(c2), ParentStateRoot: s1, Height: h1} - b5 := &BlockHeader{Miner: minerAddr, Messages: mockCid, ParentMessageReceipts: mockCid, Parents: NewTipSetKey(c1), ParentStateRoot: s1, Height: h2} - b6 := &BlockHeader{Miner: minerAddr, Messages: mockCid, ParentMessageReceipts: mockCid, Parents: NewTipSetKey(c2), ParentStateRoot: s1, Height: h2} - b7 := &BlockHeader{Miner: minerAddr, Messages: mockCid, ParentMessageReceipts: mockCid, Parents: NewTipSetKey(c1), ParentStateRoot: s2, Height: h2} - b8 := &BlockHeader{Miner: minerAddr, Messages: mockCid, ParentMessageReceipts: mockCid, Parents: NewTipSetKey(c2), ParentStateRoot: s2, Height: h1} - b9 := &BlockHeader{Miner: minerAddr, Messages: mockCid, ParentMessageReceipts: mockCid, Parents: NewTipSetKey(c2), ParentStateRoot: s2, Height: h2} - assert.True(t, b1.Equals(b1)) - assert.True(t, b1.Equals(b2)) - assert.False(t, b1.Equals(b3)) - assert.False(t, b1.Equals(b4)) - assert.False(t, b1.Equals(b5)) - assert.False(t, b1.Equals(b6)) - assert.False(t, b1.Equals(b7)) - assert.False(t, b1.Equals(b8)) - assert.False(t, b1.Equals(b9)) - assert.True(t, b3.Equals(b3)) - assert.False(t, b3.Equals(b4)) - assert.False(t, b3.Equals(b6)) - assert.False(t, b3.Equals(b9)) - assert.False(t, b4.Equals(b5)) - assert.False(t, b5.Equals(b6)) - assert.False(t, b6.Equals(b7)) - assert.False(t, b7.Equals(b8)) - assert.False(t, b8.Equals(b9)) - assert.True(t, b9.Equals(b9)) -} - -func TestBlockJsonMarshal(t *testing.T) { - tf.UnitTest(t) - - proot := CidFromString(t, "mock") - var child BlockHeader - child.Miner = NewForTestGetter()() - child.Height = 1 - child.ParentWeight = fbig.Zero() - child.Parents = NewTipSetKey(proot) - child.ParentStateRoot = proot - - child.Messages = CidFromString(t, "somecid") - child.ParentMessageReceipts = CidFromString(t, "somecid") - - child.ParentBaseFee = abi.NewTokenAmount(1) - - marshalled, e1 := json.Marshal(&child) - assert.NoError(t, e1) - str := string(marshalled) - - assert.Contains(t, str, child.Miner.String()) - assert.Contains(t, str, proot.String()) - assert.Contains(t, str, child.Messages.String()) - assert.Contains(t, str, child.ParentMessageReceipts.String()) - - // marshal/unmarshal symmetry - var unmarshalled BlockHeader - e2 := json.Unmarshal(marshalled, &unmarshalled) - assert.NoError(t, e2) - - assert.Equal(t, child, unmarshalled) - AssertHaveSameCid(t, &child, &unmarshalled) - assert.True(t, child.Equals(&unmarshalled)) -} - -func TestSignatureData(t *testing.T) { - tf.UnitTest(t) - newAddress := NewForTestGetter() - posts := []proof2.PoStProof{{PoStProof: abi.RegisteredPoStProof_StackedDrgWinning32GiBV1, ProofBytes: []byte{0x07}}} - - b := &BlockHeader{ - Miner: newAddress(), - Ticket: Ticket{VRFProof: []byte{0x01, 0x02, 0x03}}, - ElectionProof: &ElectionProof{VRFProof: []byte{0x0a, 0x0b}}, - BeaconEntries: []*BeaconEntry{ - { - Round: 5, - Data: []byte{0x0c}, - }, - }, - Height: 2, - Messages: CidFromString(t, "somecid"), - ParentMessageReceipts: CidFromString(t, "somecid"), - Parents: NewTipSetKey(CidFromString(t, "somecid")), - ParentWeight: fbig.NewInt(1000), - ForkSignaling: 3, - ParentStateRoot: CidFromString(t, "somecid"), - Timestamp: 1, - ParentBaseFee: abi.NewTokenAmount(10), - WinPoStProof: posts, - BlockSig: &crypto.Signature{ - Type: crypto.SigTypeBLS, - Data: []byte{0x3}, - }, - } - - diffposts := []proof2.PoStProof{{PoStProof: abi.RegisteredPoStProof_StackedDrgWinning32GiBV1, ProofBytes: []byte{0x07, 0x08}}} - - diff := &BlockHeader{ - Miner: newAddress(), - Ticket: Ticket{VRFProof: []byte{0x03, 0x01, 0x02}}, - ElectionProof: &ElectionProof{VRFProof: []byte{0x0c, 0x0d}}, - BeaconEntries: []*BeaconEntry{ - { - Round: 44, - Data: []byte{0xc0}, - }, - }, - Height: 3, - Messages: CidFromString(t, "someothercid"), - ParentMessageReceipts: CidFromString(t, "someothercid"), - Parents: NewTipSetKey(CidFromString(t, "someothercid")), - ParentWeight: fbig.NewInt(1001), - ForkSignaling: 2, - ParentStateRoot: CidFromString(t, "someothercid"), - Timestamp: 4, - ParentBaseFee: abi.NewTokenAmount(20), - WinPoStProof: diffposts, - BlockSig: &crypto.Signature{ - Type: crypto.SigTypeBLS, - Data: []byte{0x4}, - }, - } - - // Changing BlockSig does not affect output - func() { - before := b.SignatureData() - - cpy := b.BlockSig - defer func() { b.BlockSig = cpy }() - - b.BlockSig = diff.BlockSig - after := b.SignatureData() - assert.True(t, bytes.Equal(before, after)) - }() - - // Changing all other fields does affect output - // Note: using reflectors doesn't seem to make this much less tedious - // because it appears that there is no generic field setting function. - func() { - before := b.SignatureData() - - cpy := b.Miner - defer func() { b.Miner = cpy }() - - b.Miner = diff.Miner - after := b.SignatureData() - assert.False(t, bytes.Equal(before, after)) - }() - - func() { - before := b.SignatureData() - - cpy := b.Ticket - defer func() { b.Ticket = cpy }() - - b.Ticket = diff.Ticket - after := b.SignatureData() - assert.False(t, bytes.Equal(before, after)) - }() - - func() { - before := b.SignatureData() - - cpy := b.ElectionProof - defer func() { b.ElectionProof = cpy }() - - b.ElectionProof = diff.ElectionProof - after := b.SignatureData() - assert.False(t, bytes.Equal(before, after)) - }() - - func() { - before := b.SignatureData() - - cpy := b.Height - defer func() { b.Height = cpy }() - - b.Height = diff.Height - after := b.SignatureData() - assert.False(t, bytes.Equal(before, after)) - }() - - func() { - before := b.SignatureData() - - cpy := b.Messages - defer func() { b.Messages = cpy }() - - b.Messages = diff.Messages - after := b.SignatureData() - assert.False(t, bytes.Equal(before, after)) - }() - - func() { - before := b.SignatureData() - - cpy := b.ParentMessageReceipts - defer func() { b.ParentMessageReceipts = cpy }() - - b.ParentMessageReceipts = diff.ParentMessageReceipts - after := b.SignatureData() - assert.False(t, bytes.Equal(before, after)) - }() - - func() { - before := b.SignatureData() - - cpy := b.Parents - defer func() { b.Parents = cpy }() - - b.Parents = diff.Parents - after := b.SignatureData() - assert.False(t, bytes.Equal(before, after)) - }() - - func() { - before := b.SignatureData() - - cpy := b.ParentWeight - defer func() { b.ParentWeight = cpy }() - - b.ParentWeight = diff.ParentWeight - after := b.SignatureData() - assert.False(t, bytes.Equal(before, after)) - }() - - func() { - before := b.SignatureData() - - cpy := b.ForkSignaling - defer func() { b.ForkSignaling = cpy }() - - b.ForkSignaling = diff.ForkSignaling - after := b.SignatureData() - assert.False(t, bytes.Equal(before, after)) - }() - - func() { - before := b.SignatureData() - - cpy := b.ParentStateRoot - defer func() { b.ParentStateRoot = cpy }() - - b.ParentStateRoot = diff.ParentStateRoot - after := b.SignatureData() - assert.False(t, bytes.Equal(before, after)) - }() - - func() { - before := b.SignatureData() - - cpy := b.Timestamp - defer func() { b.Timestamp = cpy }() - - b.Timestamp = diff.Timestamp - after := b.SignatureData() - assert.False(t, bytes.Equal(before, after)) - }() - - func() { - before := b.SignatureData() - - cpy := b.WinPoStProof - defer func() { b.WinPoStProof = cpy }() - - b.WinPoStProof = diff.WinPoStProof - after := b.SignatureData() - assert.False(t, bytes.Equal(before, after)) - }() - - func() { - before := b.SignatureData() - cpy := b.BeaconEntries - defer func() { - b.BeaconEntries = cpy - }() - - b.BeaconEntries = diff.BeaconEntries - after := b.SignatureData() - - assert.False(t, bytes.Equal(before, after)) - }() - -} diff --git a/pkg/types/internal/blockmsg.go b/pkg/types/internal/blockmsg.go deleted file mode 100644 index 8bc24b0b73..0000000000 --- a/pkg/types/internal/blockmsg.go +++ /dev/null @@ -1,28 +0,0 @@ -package internal - -import ( - "bytes" - - "github.com/ipfs/go-cid" -) - -type BlockMsg struct { // nolint: golint - Header *BlockHeader - BlsMessages []cid.Cid - SecpkMessages []cid.Cid -} - -// Cid return block cid -func (bm *BlockMsg) Cid() cid.Cid { - return bm.Header.Cid() -} - -// Serialize return blockmsg binary -func (bm *BlockMsg) Serialize() ([]byte, error) { - buf := new(bytes.Buffer) - if err := bm.MarshalCBOR(buf); err != nil { - return nil, err - } - - return buf.Bytes(), nil -} diff --git a/pkg/types/internal/cbor_gen.go b/pkg/types/internal/cbor_gen.go deleted file mode 100644 index c2cb312b5d..0000000000 --- a/pkg/types/internal/cbor_gen.go +++ /dev/null @@ -1,1444 +0,0 @@ -// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. - -package internal - -import ( - "fmt" - "io" - "sort" - - abi "github.com/filecoin-project/go-state-types/abi" - crypto "github.com/filecoin-project/go-state-types/crypto" - exitcode "github.com/filecoin-project/go-state-types/exitcode" - proof "github.com/filecoin-project/specs-actors/actors/runtime/proof" - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" -) - -var _ = xerrors.Errorf -var _ = cid.Undef -var _ = sort.Sort - -var lengthBufMessageReceipt = []byte{131} - -func (t *MessageReceipt) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufMessageReceipt); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.ExitCode (exitcode.ExitCode) (int64) - if t.ExitCode >= 0 { - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.ExitCode)); err != nil { - return err - } - } else { - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.ExitCode-1)); err != nil { - return err - } - } - - // t.Return ([]uint8) (slice) - if len(t.Return) > cbg.ByteArrayMaxLen { - return xerrors.Errorf("Byte array in field t.Return was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.Return))); err != nil { - return err - } - - if _, err := w.Write(t.Return[:]); err != nil { - return err - } - - // t.GasUsed (int64) (int64) - if t.GasUsed >= 0 { - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.GasUsed)); err != nil { - return err - } - } else { - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.GasUsed-1)); err != nil { - return err - } - } - return nil -} - -func (t *MessageReceipt) UnmarshalCBOR(r io.Reader) error { - *t = MessageReceipt{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 3 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.ExitCode (exitcode.ExitCode) (int64) - { - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - var extraI int64 - if err != nil { - return err - } - switch maj { - case cbg.MajUnsignedInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 positive overflow") - } - case cbg.MajNegativeInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") - } - extraI = -1 - extraI - default: - return fmt.Errorf("wrong type for int64 field: %d", maj) - } - - t.ExitCode = exitcode.ExitCode(extraI) - } - // t.Return ([]uint8) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.ByteArrayMaxLen { - return fmt.Errorf("t.Return: byte array too large (%d)", extra) - } - if maj != cbg.MajByteString { - return fmt.Errorf("expected byte array") - } - - if extra > 0 { - t.Return = make([]uint8, extra) - } - - if _, err := io.ReadFull(br, t.Return[:]); err != nil { - return err - } - // t.GasUsed (int64) (int64) - { - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - var extraI int64 - if err != nil { - return err - } - switch maj { - case cbg.MajUnsignedInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 positive overflow") - } - case cbg.MajNegativeInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") - } - extraI = -1 - extraI - default: - return fmt.Errorf("wrong type for int64 field: %d", maj) - } - - t.GasUsed = int64(extraI) - } - return nil -} - -var lengthBufSignedMessage = []byte{130} - -func (t *SignedMessage) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufSignedMessage); err != nil { - return err - } - - // t.Message (internal.UnsignedMessage) (struct) - if err := t.Message.MarshalCBOR(w); err != nil { - return err - } - - // t.Signature (crypto.Signature) (struct) - if err := t.Signature.MarshalCBOR(w); err != nil { - return err - } - return nil -} - -func (t *SignedMessage) UnmarshalCBOR(r io.Reader) error { - *t = SignedMessage{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 2 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Message (internal.UnsignedMessage) (struct) - - { - - if err := t.Message.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.Message: %w", err) - } - - } - // t.Signature (crypto.Signature) (struct) - - { - - if err := t.Signature.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.Signature: %w", err) - } - - } - return nil -} - -var lengthBufUnsignedMessage = []byte{138} - -func (t *UnsignedMessage) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufUnsignedMessage); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.Version (uint64) (uint64) - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Version)); err != nil { - return err - } - - // t.To (address.Address) (struct) - if err := t.To.MarshalCBOR(w); err != nil { - return err - } - - // t.From (address.Address) (struct) - if err := t.From.MarshalCBOR(w); err != nil { - return err - } - - // t.Nonce (uint64) (uint64) - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Nonce)); err != nil { - return err - } - - // t.Value (big.Int) (struct) - if err := t.Value.MarshalCBOR(w); err != nil { - return err - } - - // t.GasLimit (int64) (int64) - if t.GasLimit >= 0 { - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.GasLimit)); err != nil { - return err - } - } else { - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.GasLimit-1)); err != nil { - return err - } - } - - // t.GasFeeCap (big.Int) (struct) - if err := t.GasFeeCap.MarshalCBOR(w); err != nil { - return err - } - - // t.GasPremium (big.Int) (struct) - if err := t.GasPremium.MarshalCBOR(w); err != nil { - return err - } - - // t.Method (abi.MethodNum) (uint64) - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Method)); err != nil { - return err - } - - // t.Params ([]uint8) (slice) - if len(t.Params) > cbg.ByteArrayMaxLen { - return xerrors.Errorf("Byte array in field t.Params was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.Params))); err != nil { - return err - } - - if _, err := w.Write(t.Params[:]); err != nil { - return err - } - return nil -} - -func (t *UnsignedMessage) UnmarshalCBOR(r io.Reader) error { - *t = UnsignedMessage{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 10 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Version (uint64) (uint64) - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Version = uint64(extra) - - } - // t.To (address.Address) (struct) - - { - - if err := t.To.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.To: %w", err) - } - - } - // t.From (address.Address) (struct) - - { - - if err := t.From.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.From: %w", err) - } - - } - // t.Nonce (uint64) (uint64) - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Nonce = uint64(extra) - - } - // t.Value (big.Int) (struct) - - { - - if err := t.Value.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.Value: %w", err) - } - - } - // t.GasLimit (int64) (int64) - { - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - var extraI int64 - if err != nil { - return err - } - switch maj { - case cbg.MajUnsignedInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 positive overflow") - } - case cbg.MajNegativeInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") - } - extraI = -1 - extraI - default: - return fmt.Errorf("wrong type for int64 field: %d", maj) - } - - t.GasLimit = int64(extraI) - } - // t.GasFeeCap (big.Int) (struct) - - { - - if err := t.GasFeeCap.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.GasFeeCap: %w", err) - } - - } - // t.GasPremium (big.Int) (struct) - - { - - if err := t.GasPremium.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.GasPremium: %w", err) - } - - } - // t.Method (abi.MethodNum) (uint64) - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Method = abi.MethodNum(extra) - - } - // t.Params ([]uint8) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.ByteArrayMaxLen { - return fmt.Errorf("t.Params: byte array too large (%d)", extra) - } - if maj != cbg.MajByteString { - return fmt.Errorf("expected byte array") - } - - if extra > 0 { - t.Params = make([]uint8, extra) - } - - if _, err := io.ReadFull(br, t.Params[:]); err != nil { - return err - } - return nil -} - -var lengthBufTxMeta = []byte{130} - -func (t *TxMeta) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufTxMeta); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.BLSRoot (cid.Cid) (struct) - - if err := cbg.WriteCidBuf(scratch, w, t.BLSRoot); err != nil { - return xerrors.Errorf("failed to write cid field t.BLSRoot: %w", err) - } - - // t.SecpRoot (cid.Cid) (struct) - - if err := cbg.WriteCidBuf(scratch, w, t.SecpRoot); err != nil { - return xerrors.Errorf("failed to write cid field t.SecpRoot: %w", err) - } - - return nil -} - -func (t *TxMeta) UnmarshalCBOR(r io.Reader) error { - *t = TxMeta{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 2 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.BLSRoot (cid.Cid) (struct) - - { - - c, err := cbg.ReadCid(br) - if err != nil { - return xerrors.Errorf("failed to read cid field t.BLSRoot: %w", err) - } - - t.BLSRoot = c - - } - // t.SecpRoot (cid.Cid) (struct) - - { - - c, err := cbg.ReadCid(br) - if err != nil { - return xerrors.Errorf("failed to read cid field t.SecpRoot: %w", err) - } - - t.SecpRoot = c - - } - return nil -} - -var lengthBufActor = []byte{132} - -func (t *Actor) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufActor); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.Code (cid.Cid) (struct) - - if err := cbg.WriteCidBuf(scratch, w, t.Code); err != nil { - return xerrors.Errorf("failed to write cid field t.Code: %w", err) - } - - // t.Head (cid.Cid) (struct) - - if err := cbg.WriteCidBuf(scratch, w, t.Head); err != nil { - return xerrors.Errorf("failed to write cid field t.Head: %w", err) - } - - // t.Nonce (uint64) (uint64) - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Nonce)); err != nil { - return err - } - - // t.Balance (big.Int) (struct) - if err := t.Balance.MarshalCBOR(w); err != nil { - return err - } - return nil -} - -func (t *Actor) UnmarshalCBOR(r io.Reader) error { - *t = Actor{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 4 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Code (cid.Cid) (struct) - - { - - c, err := cbg.ReadCid(br) - if err != nil { - return xerrors.Errorf("failed to read cid field t.Code: %w", err) - } - - t.Code = c - - } - // t.Head (cid.Cid) (struct) - - { - - c, err := cbg.ReadCid(br) - if err != nil { - return xerrors.Errorf("failed to read cid field t.Head: %w", err) - } - - t.Head = c - - } - // t.Nonce (uint64) (uint64) - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Nonce = uint64(extra) - - } - // t.Balance (big.Int) (struct) - - { - - if err := t.Balance.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.Balance: %w", err) - } - - } - return nil -} - -var lengthBufBeaconEntry = []byte{130} - -func (t *BeaconEntry) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufBeaconEntry); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.Round (uint64) (uint64) - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Round)); err != nil { - return err - } - - // t.Data ([]uint8) (slice) - if len(t.Data) > cbg.ByteArrayMaxLen { - return xerrors.Errorf("Byte array in field t.Data was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.Data))); err != nil { - return err - } - - if _, err := w.Write(t.Data[:]); err != nil { - return err - } - return nil -} - -func (t *BeaconEntry) UnmarshalCBOR(r io.Reader) error { - *t = BeaconEntry{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 2 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Round (uint64) (uint64) - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Round = uint64(extra) - - } - // t.Data ([]uint8) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.ByteArrayMaxLen { - return fmt.Errorf("t.Data: byte array too large (%d)", extra) - } - if maj != cbg.MajByteString { - return fmt.Errorf("expected byte array") - } - - if extra > 0 { - t.Data = make([]uint8, extra) - } - - if _, err := io.ReadFull(br, t.Data[:]); err != nil { - return err - } - return nil -} - -var lengthBufBlockHeader = []byte{144} - -func (t *BlockHeader) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufBlockHeader); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.Miner (address.Address) (struct) - if err := t.Miner.MarshalCBOR(w); err != nil { - return err - } - - // t.Ticket (internal.Ticket) (struct) - if err := t.Ticket.MarshalCBOR(w); err != nil { - return err - } - - // t.ElectionProof (internal.ElectionProof) (struct) - if err := t.ElectionProof.MarshalCBOR(w); err != nil { - return err - } - - // t.BeaconEntries ([]*internal.BeaconEntry) (slice) - if len(t.BeaconEntries) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.BeaconEntries was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.BeaconEntries))); err != nil { - return err - } - for _, v := range t.BeaconEntries { - if err := v.MarshalCBOR(w); err != nil { - return err - } - } - - // t.WinPoStProof ([]proof.PoStProof) (slice) - if len(t.WinPoStProof) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.WinPoStProof was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.WinPoStProof))); err != nil { - return err - } - for _, v := range t.WinPoStProof { - if err := v.MarshalCBOR(w); err != nil { - return err - } - } - - // t.Parents (internal.TipSetKey) (struct) - if err := t.Parents.MarshalCBOR(w); err != nil { - return err - } - - // t.ParentWeight (big.Int) (struct) - if err := t.ParentWeight.MarshalCBOR(w); err != nil { - return err - } - - // t.Height (abi.ChainEpoch) (int64) - if t.Height >= 0 { - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Height)); err != nil { - return err - } - } else { - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.Height-1)); err != nil { - return err - } - } - - // t.ParentStateRoot (cid.Cid) (struct) - - if err := cbg.WriteCidBuf(scratch, w, t.ParentStateRoot); err != nil { - return xerrors.Errorf("failed to write cid field t.ParentStateRoot: %w", err) - } - - // t.ParentMessageReceipts (cid.Cid) (struct) - - if err := cbg.WriteCidBuf(scratch, w, t.ParentMessageReceipts); err != nil { - return xerrors.Errorf("failed to write cid field t.ParentMessageReceipts: %w", err) - } - - // t.Messages (cid.Cid) (struct) - - if err := cbg.WriteCidBuf(scratch, w, t.Messages); err != nil { - return xerrors.Errorf("failed to write cid field t.Messages: %w", err) - } - - // t.BLSAggregate (crypto.Signature) (struct) - if err := t.BLSAggregate.MarshalCBOR(w); err != nil { - return err - } - - // t.Timestamp (uint64) (uint64) - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Timestamp)); err != nil { - return err - } - - // t.BlockSig (crypto.Signature) (struct) - if err := t.BlockSig.MarshalCBOR(w); err != nil { - return err - } - - // t.ForkSignaling (uint64) (uint64) - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.ForkSignaling)); err != nil { - return err - } - - // t.ParentBaseFee (big.Int) (struct) - if err := t.ParentBaseFee.MarshalCBOR(w); err != nil { - return err - } - return nil -} - -func (t *BlockHeader) UnmarshalCBOR(r io.Reader) error { - *t = BlockHeader{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 16 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Miner (address.Address) (struct) - - { - - if err := t.Miner.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.Miner: %w", err) - } - - } - // t.Ticket (internal.Ticket) (struct) - - { - - if err := t.Ticket.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.Ticket: %w", err) - } - - } - // t.ElectionProof (internal.ElectionProof) (struct) - - { - - b, err := br.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := br.UnreadByte(); err != nil { - return err - } - t.ElectionProof = new(ElectionProof) - if err := t.ElectionProof.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.ElectionProof pointer: %w", err) - } - } - - } - // t.BeaconEntries ([]*internal.BeaconEntry) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.BeaconEntries: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.BeaconEntries = make([]*BeaconEntry, extra) - } - - for i := 0; i < int(extra); i++ { - - var v BeaconEntry - if err := v.UnmarshalCBOR(br); err != nil { - return err - } - - t.BeaconEntries[i] = &v - } - - // t.WinPoStProof ([]proof.PoStProof) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.WinPoStProof: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.WinPoStProof = make([]proof.PoStProof, extra) - } - - for i := 0; i < int(extra); i++ { - - var v proof.PoStProof - if err := v.UnmarshalCBOR(br); err != nil { - return err - } - - t.WinPoStProof[i] = v - } - - // t.Parents (internal.TipSetKey) (struct) - - { - - if err := t.Parents.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.Parents: %w", err) - } - - } - // t.ParentWeight (big.Int) (struct) - - { - - if err := t.ParentWeight.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.ParentWeight: %w", err) - } - - } - // t.Height (abi.ChainEpoch) (int64) - { - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - var extraI int64 - if err != nil { - return err - } - switch maj { - case cbg.MajUnsignedInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 positive overflow") - } - case cbg.MajNegativeInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") - } - extraI = -1 - extraI - default: - return fmt.Errorf("wrong type for int64 field: %d", maj) - } - - t.Height = abi.ChainEpoch(extraI) - } - // t.ParentStateRoot (cid.Cid) (struct) - - { - - c, err := cbg.ReadCid(br) - if err != nil { - return xerrors.Errorf("failed to read cid field t.ParentStateRoot: %w", err) - } - - t.ParentStateRoot = c - - } - // t.ParentMessageReceipts (cid.Cid) (struct) - - { - - c, err := cbg.ReadCid(br) - if err != nil { - return xerrors.Errorf("failed to read cid field t.ParentMessageReceipts: %w", err) - } - - t.ParentMessageReceipts = c - - } - // t.Messages (cid.Cid) (struct) - - { - - c, err := cbg.ReadCid(br) - if err != nil { - return xerrors.Errorf("failed to read cid field t.Messages: %w", err) - } - - t.Messages = c - - } - // t.BLSAggregate (crypto.Signature) (struct) - - { - - b, err := br.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := br.UnreadByte(); err != nil { - return err - } - t.BLSAggregate = new(crypto.Signature) - if err := t.BLSAggregate.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.BLSAggregate pointer: %w", err) - } - } - - } - // t.Timestamp (uint64) (uint64) - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.Timestamp = uint64(extra) - - } - // t.BlockSig (crypto.Signature) (struct) - - { - - b, err := br.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := br.UnreadByte(); err != nil { - return err - } - t.BlockSig = new(crypto.Signature) - if err := t.BlockSig.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.BlockSig pointer: %w", err) - } - } - - } - // t.ForkSignaling (uint64) (uint64) - - { - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajUnsignedInt { - return fmt.Errorf("wrong type for uint64 field") - } - t.ForkSignaling = uint64(extra) - - } - // t.ParentBaseFee (big.Int) (struct) - - { - - if err := t.ParentBaseFee.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.ParentBaseFee: %w", err) - } - - } - return nil -} - -var lengthBufTicket = []byte{129} - -func (t *Ticket) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufTicket); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.VRFProof (internal.VRFPi) (slice) - if len(t.VRFProof) > cbg.ByteArrayMaxLen { - return xerrors.Errorf("Byte array in field t.VRFProof was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.VRFProof))); err != nil { - return err - } - - if _, err := w.Write(t.VRFProof[:]); err != nil { - return err - } - return nil -} - -func (t *Ticket) UnmarshalCBOR(r io.Reader) error { - *t = Ticket{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 1 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.VRFProof (internal.VRFPi) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.ByteArrayMaxLen { - return fmt.Errorf("t.VRFProof: byte array too large (%d)", extra) - } - if maj != cbg.MajByteString { - return fmt.Errorf("expected byte array") - } - - if extra > 0 { - t.VRFProof = make([]uint8, extra) - } - - if _, err := io.ReadFull(br, t.VRFProof[:]); err != nil { - return err - } - return nil -} - -var lengthBufElectionProof = []byte{130} - -func (t *ElectionProof) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufElectionProof); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.WinCount (int64) (int64) - if t.WinCount >= 0 { - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.WinCount)); err != nil { - return err - } - } else { - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.WinCount-1)); err != nil { - return err - } - } - - // t.VRFProof (internal.VRFPi) (slice) - if len(t.VRFProof) > cbg.ByteArrayMaxLen { - return xerrors.Errorf("Byte array in field t.VRFProof was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.VRFProof))); err != nil { - return err - } - - if _, err := w.Write(t.VRFProof[:]); err != nil { - return err - } - return nil -} - -func (t *ElectionProof) UnmarshalCBOR(r io.Reader) error { - *t = ElectionProof{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 2 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.WinCount (int64) (int64) - { - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - var extraI int64 - if err != nil { - return err - } - switch maj { - case cbg.MajUnsignedInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 positive overflow") - } - case cbg.MajNegativeInt: - extraI = int64(extra) - if extraI < 0 { - return fmt.Errorf("int64 negative oveflow") - } - extraI = -1 - extraI - default: - return fmt.Errorf("wrong type for int64 field: %d", maj) - } - - t.WinCount = int64(extraI) - } - // t.VRFProof (internal.VRFPi) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.ByteArrayMaxLen { - return fmt.Errorf("t.VRFProof: byte array too large (%d)", extra) - } - if maj != cbg.MajByteString { - return fmt.Errorf("expected byte array") - } - - if extra > 0 { - t.VRFProof = make([]uint8, extra) - } - - if _, err := io.ReadFull(br, t.VRFProof[:]); err != nil { - return err - } - return nil -} - -var lengthBufBlockMsg = []byte{131} - -func (t *BlockMsg) MarshalCBOR(w io.Writer) error { - if t == nil { - _, err := w.Write(cbg.CborNull) - return err - } - if _, err := w.Write(lengthBufBlockMsg); err != nil { - return err - } - - scratch := make([]byte, 9) - - // t.Header (internal.BlockHeader) (struct) - if err := t.Header.MarshalCBOR(w); err != nil { - return err - } - - // t.BlsMessages ([]cid.Cid) (slice) - if len(t.BlsMessages) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.BlsMessages was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.BlsMessages))); err != nil { - return err - } - for _, v := range t.BlsMessages { - if err := cbg.WriteCidBuf(scratch, w, v); err != nil { - return xerrors.Errorf("failed writing cid field t.BlsMessages: %w", err) - } - } - - // t.SecpkMessages ([]cid.Cid) (slice) - if len(t.SecpkMessages) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.SecpkMessages was too long") - } - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.SecpkMessages))); err != nil { - return err - } - for _, v := range t.SecpkMessages { - if err := cbg.WriteCidBuf(scratch, w, v); err != nil { - return xerrors.Errorf("failed writing cid field t.SecpkMessages: %w", err) - } - } - return nil -} - -func (t *BlockMsg) UnmarshalCBOR(r io.Reader) error { - *t = BlockMsg{} - - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - if maj != cbg.MajArray { - return fmt.Errorf("cbor input should be of type array") - } - - if extra != 3 { - return fmt.Errorf("cbor input had wrong number of fields") - } - - // t.Header (internal.BlockHeader) (struct) - - { - - b, err := br.ReadByte() - if err != nil { - return err - } - if b != cbg.CborNull[0] { - if err := br.UnreadByte(); err != nil { - return err - } - t.Header = new(BlockHeader) - if err := t.Header.UnmarshalCBOR(br); err != nil { - return xerrors.Errorf("unmarshaling t.Header pointer: %w", err) - } - } - - } - // t.BlsMessages ([]cid.Cid) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.BlsMessages: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.BlsMessages = make([]cid.Cid, extra) - } - - for i := 0; i < int(extra); i++ { - - c, err := cbg.ReadCid(br) - if err != nil { - return xerrors.Errorf("reading cid field t.BlsMessages failed: %w", err) - } - t.BlsMessages[i] = c - } - - // t.SecpkMessages ([]cid.Cid) (slice) - - maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.SecpkMessages: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - t.SecpkMessages = make([]cid.Cid, extra) - } - - for i := 0; i < int(extra); i++ { - - c, err := cbg.ReadCid(br) - if err != nil { - return xerrors.Errorf("reading cid field t.SecpkMessages failed: %w", err) - } - t.SecpkMessages[i] = c - } - - return nil -} diff --git a/pkg/types/internal/fil.go b/pkg/types/internal/fil.go deleted file mode 100644 index 3270a30eef..0000000000 --- a/pkg/types/internal/fil.go +++ /dev/null @@ -1,137 +0,0 @@ -package internal - -import ( - "encoding" - "fmt" - fbig "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/venus/pkg/constants" - "math/big" - "strings" -) - -var ZeroFIL = fbig.NewInt(0) - -type FIL BigInt - -func (f FIL) String() string { - return f.Unitless() + " FIL" -} - -var AttoFil = NewInt(1) -var FemtoFil = BigMul(AttoFil, NewInt(1000)) -var PicoFil = BigMul(FemtoFil, NewInt(1000)) -var NanoFil = BigMul(PicoFil, NewInt(1000)) - -func (f FIL) Unitless() string { - r := new(big.Rat).SetFrac(f.Int, big.NewInt(int64(constants.FilecoinPrecision))) - if r.Sign() == 0 { - return "0" - } - return strings.TrimRight(strings.TrimRight(r.FloatString(18), "0"), ".") -} - -var unitPrefixes = []string{"a", "f", "p", "n", "μ", "m"} - -func (f FIL) Short() string { - n := BigInt(f).Abs() - - dn := uint64(1) - var prefix string - for _, p := range unitPrefixes { - if n.LessThan(NewInt(dn * 1000)) { - prefix = p - break - } - dn *= 1000 - } - - r := new(big.Rat).SetFrac(f.Int, big.NewInt(int64(dn))) - if r.Sign() == 0 { - return "0" - } - - return strings.TrimRight(strings.TrimRight(r.FloatString(3), "0"), ".") + " " + prefix + "FIL" -} - -func (f FIL) Nano() string { - r := new(big.Rat).SetFrac(f.Int, big.NewInt(int64(1e9))) - if r.Sign() == 0 { - return "0" - } - - return strings.TrimRight(strings.TrimRight(r.FloatString(9), "0"), ".") + " nFIL" -} - -func (f FIL) Format(s fmt.State, ch rune) { - switch ch { - case 's', 'v': - fmt.Fprint(s, f.String()) - default: - f.Int.Format(s, ch) - } -} - -func (f FIL) MarshalText() (text []byte, err error) { - return []byte(f.String()), nil -} - -func (f FIL) UnmarshalText(text []byte) error { - p, err := ParseFIL(string(text)) - if err != nil { - return err - } - - f.Int.Set(p.Int) - return nil -} - -func ParseFIL(s string) (FIL, error) { - suffix := strings.TrimLeft(s, "-.1234567890") - s = s[:len(s)-len(suffix)] - var attofil bool - if suffix != "" { - norm := strings.ToLower(strings.TrimSpace(suffix)) - switch norm { - case "", "fil": - case "attofil", "afil": - attofil = true - default: - return FIL{}, fmt.Errorf("unrecognized suffix: %q", suffix) - } - } - - if len(s) > 50 { - return FIL{}, fmt.Errorf("string length too large: %d", len(s)) - } - - r, ok := new(big.Rat).SetString(s) - if !ok { - return FIL{}, fmt.Errorf("failed to parse %q as a decimal number", s) - } - - if !attofil { - r = r.Mul(r, big.NewRat(int64(constants.FilecoinPrecision), 1)) - } - - if !r.IsInt() { - var pref string - if attofil { - pref = "atto" - } - return FIL{}, fmt.Errorf("invalid %sFIL value: %q", pref, s) - } - - return FIL{r.Num()}, nil -} - -func MustParseFIL(s string) FIL { - n, err := ParseFIL(s) - if err != nil { - panic(err) - } - - return n -} - -var _ encoding.TextMarshaler = (*FIL)(nil) -var _ encoding.TextUnmarshaler = (*FIL)(nil) diff --git a/pkg/types/internal/fil_test.go b/pkg/types/internal/fil_test.go deleted file mode 100644 index 95630a8a64..0000000000 --- a/pkg/types/internal/fil_test.go +++ /dev/null @@ -1,114 +0,0 @@ -package internal - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestFilShort(t *testing.T) { - for _, s := range []struct { - fil string - expect string - }{ - - {fil: "1", expect: "1 FIL"}, - {fil: "1.1", expect: "1.1 FIL"}, - {fil: "12", expect: "12 FIL"}, - {fil: "123", expect: "123 FIL"}, - {fil: "123456", expect: "123456 FIL"}, - {fil: "123.23", expect: "123.23 FIL"}, - {fil: "123456.234", expect: "123456.234 FIL"}, - {fil: "123456.2341234", expect: "123456.234 FIL"}, - {fil: "123456.234123445", expect: "123456.234 FIL"}, - - {fil: "0.1", expect: "100 mFIL"}, - {fil: "0.01", expect: "10 mFIL"}, - {fil: "0.001", expect: "1 mFIL"}, - - {fil: "0.0001", expect: "100 μFIL"}, - {fil: "0.00001", expect: "10 μFIL"}, - {fil: "0.000001", expect: "1 μFIL"}, - - {fil: "0.0000001", expect: "100 nFIL"}, - {fil: "0.00000001", expect: "10 nFIL"}, - {fil: "0.000000001", expect: "1 nFIL"}, - - {fil: "0.0000000001", expect: "100 pFIL"}, - {fil: "0.00000000001", expect: "10 pFIL"}, - {fil: "0.000000000001", expect: "1 pFIL"}, - - {fil: "0.0000000000001", expect: "100 fFIL"}, - {fil: "0.00000000000001", expect: "10 fFIL"}, - {fil: "0.000000000000001", expect: "1 fFIL"}, - - {fil: "0.0000000000000001", expect: "100 aFIL"}, - {fil: "0.00000000000000001", expect: "10 aFIL"}, - {fil: "0.000000000000000001", expect: "1 aFIL"}, - - {fil: "0.0000012", expect: "1.2 μFIL"}, - {fil: "0.00000123", expect: "1.23 μFIL"}, - {fil: "0.000001234", expect: "1.234 μFIL"}, - {fil: "0.0000012344", expect: "1.234 μFIL"}, - {fil: "0.00000123444", expect: "1.234 μFIL"}, - - {fil: "0.0002212", expect: "221.2 μFIL"}, - {fil: "0.00022123", expect: "221.23 μFIL"}, - {fil: "0.000221234", expect: "221.234 μFIL"}, - {fil: "0.0002212344", expect: "221.234 μFIL"}, - {fil: "0.00022123444", expect: "221.234 μFIL"}, - - {fil: "-1", expect: "-1 FIL"}, - {fil: "-1.1", expect: "-1.1 FIL"}, - {fil: "-12", expect: "-12 FIL"}, - {fil: "-123", expect: "-123 FIL"}, - {fil: "-123456", expect: "-123456 FIL"}, - {fil: "-123.23", expect: "-123.23 FIL"}, - {fil: "-123456.234", expect: "-123456.234 FIL"}, - {fil: "-123456.2341234", expect: "-123456.234 FIL"}, - {fil: "-123456.234123445", expect: "-123456.234 FIL"}, - - {fil: "-0.1", expect: "-100 mFIL"}, - {fil: "-0.01", expect: "-10 mFIL"}, - {fil: "-0.001", expect: "-1 mFIL"}, - - {fil: "-0.0001", expect: "-100 μFIL"}, - {fil: "-0.00001", expect: "-10 μFIL"}, - {fil: "-0.000001", expect: "-1 μFIL"}, - - {fil: "-0.0000001", expect: "-100 nFIL"}, - {fil: "-0.00000001", expect: "-10 nFIL"}, - {fil: "-0.000000001", expect: "-1 nFIL"}, - - {fil: "-0.0000000001", expect: "-100 pFIL"}, - {fil: "-0.00000000001", expect: "-10 pFIL"}, - {fil: "-0.000000000001", expect: "-1 pFIL"}, - - {fil: "-0.0000000000001", expect: "-100 fFIL"}, - {fil: "-0.00000000000001", expect: "-10 fFIL"}, - {fil: "-0.000000000000001", expect: "-1 fFIL"}, - - {fil: "-0.0000000000000001", expect: "-100 aFIL"}, - {fil: "-0.00000000000000001", expect: "-10 aFIL"}, - {fil: "-0.000000000000000001", expect: "-1 aFIL"}, - - {fil: "-0.0000012", expect: "-1.2 μFIL"}, - {fil: "-0.00000123", expect: "-1.23 μFIL"}, - {fil: "-0.000001234", expect: "-1.234 μFIL"}, - {fil: "-0.0000012344", expect: "-1.234 μFIL"}, - {fil: "-0.00000123444", expect: "-1.234 μFIL"}, - - {fil: "-0.0002212", expect: "-221.2 μFIL"}, - {fil: "-0.00022123", expect: "-221.23 μFIL"}, - {fil: "-0.000221234", expect: "-221.234 μFIL"}, - {fil: "-0.0002212344", expect: "-221.234 μFIL"}, - {fil: "-0.00022123444", expect: "-221.234 μFIL"}, - } { - s := s - t.Run(s.fil, func(t *testing.T) { - f, err := ParseFIL(s.fil) - require.NoError(t, err) - require.Equal(t, s.expect, f.Short()) - }) - } -} diff --git a/pkg/types/internal/full_block.go b/pkg/types/internal/full_block.go deleted file mode 100644 index 1277e94cb9..0000000000 --- a/pkg/types/internal/full_block.go +++ /dev/null @@ -1,18 +0,0 @@ -package internal - -import ( - "github.com/ipfs/go-cid" -) - -// FullBlock carries a newBlock header and the message and receipt collections -// referenced from the header. -type FullBlock struct { - Header *BlockHeader - BLSMessages []*UnsignedMessage - SECPMessages []*SignedMessage -} - -// Cid returns the FullBlock's header's Cid -func (fb *FullBlock) Cid() cid.Cid { - return fb.Header.Cid() -} diff --git a/pkg/types/internal/fulltipset.go b/pkg/types/internal/fulltipset.go deleted file mode 100644 index b2b274a6a9..0000000000 --- a/pkg/types/internal/fulltipset.go +++ /dev/null @@ -1,71 +0,0 @@ -package internal - -import ( - "github.com/ipfs/go-cid" -) - -// FullTipSet is an expanded version of the TipSet that contains all the blocks and messages -type FullTipSet struct { - Blocks []*FullBlock - tipset *TipSet - cids []cid.Cid -} - -func NewFullTipSet(blks []*FullBlock) *FullTipSet { - return &FullTipSet{ - Blocks: blks, - } -} - -func (fts *FullTipSet) Cids() []cid.Cid { - if fts.cids != nil { - return fts.cids - } - - var cids []cid.Cid - for _, b := range fts.Blocks { - cids = append(cids, b.Cid()) - } - fts.cids = cids - - return cids -} - -// TipSet returns a narrower view of this FullTipSet elliding the newBlock -// messages. -func (fts *FullTipSet) TipSet() *TipSet { - if fts.tipset != nil { - // FIXME: fts.tipset is actually never set. Should it memoize? - return fts.tipset - } - - var headers []*BlockHeader - for _, b := range fts.Blocks { - headers = append(headers, b.Header) - } - - ts, err := NewTipSet(headers...) - if err != nil { - panic(err) - } - - return ts -} - -// Reverse reverses the order of the slice `chain`. -func ReverseFullBlock(chain []*FullTipSet) { - // https://github.com/golang/go/wiki/SliceTricks#reversing - for i := len(chain)/2 - 1; i >= 0; i-- { - opp := len(chain) - 1 - i - chain[i], chain[opp] = chain[opp], chain[i] - } -} - -// Reverse reverses the order of the slice `chain`. -func ReverseTipSet(chain []*TipSet) { - // https://github.com/golang/go/wiki/SliceTricks#reversing - for i := len(chain)/2 - 1; i >= 0; i-- { - opp := len(chain) - 1 - i - chain[i], chain[opp] = chain[opp], chain[i] - } -} diff --git a/pkg/types/internal/message.go b/pkg/types/internal/message.go deleted file mode 100644 index 4a047d7b4f..0000000000 --- a/pkg/types/internal/message.go +++ /dev/null @@ -1,366 +0,0 @@ -package internal - -import ( - "bytes" - "encoding/json" - "fmt" - "math/big" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - specsbig "github.com/filecoin-project/go-state-types/big" - cbor2 "github.com/filecoin-project/go-state-types/cbor" - "github.com/filecoin-project/go-state-types/exitcode" - "github.com/filecoin-project/go-state-types/network" - block "github.com/ipfs/go-block-format" - "github.com/ipfs/go-cid" - cbor "github.com/ipfs/go-ipld-cbor" - ipld "github.com/ipfs/go-ipld-format" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/constants" -) - -type EstimateMessage struct { - Msg *Message - Spec *MessageSendSpec -} - -type EstimateResult struct { - Msg *Message - Err string -} - -const DefaultGasOverEstimation = 1.25 -const MinGasOverEsitimation = 1.0 - -type MessageSendSpec struct { - MaxFee abi.TokenAmount - GasOverEstimation float64 -} - -var DefaultMessageSendSpec = MessageSendSpec{ - // MaxFee of 0.1FIL - MaxFee: abi.NewTokenAmount(int64(constants.FilecoinPrecision) / 10), -} - -func (ms *MessageSendSpec) Get() MessageSendSpec { - if ms == nil { - return DefaultMessageSendSpec - } - - return *ms -} - -const MessageVersion = uint64(0) - -var EmptyTokenAmount = abi.TokenAmount{} - -type ChainMsg interface { - Cid() cid.Cid - VMMessage() *UnsignedMessage - ToStorageBlock() (block.Block, error) - // FIXME: This is the *message* length, this name is misleading. - ChainLength() int - cbor2.Marshaler - cbor2.Unmarshaler -} - -var _ ChainMsg = &UnsignedMessage{} - -type Message = UnsignedMessage - -// UnsignedMessage is an exchange of information between two actors modeled -// as a function call. -type UnsignedMessage struct { - Version uint64 `json:"version"` - - To address.Address `json:"to"` - From address.Address `json:"from"` - // When receiving a message from a user account the nonce in - // the message must match the expected nonce in the from actor. - // This prevents replay attacks. - Nonce uint64 `json:"nonce"` - - Value abi.TokenAmount `json:"value"` - - GasLimit int64 `json:"gasLimit"` - GasFeeCap abi.TokenAmount `json:"gasFeeCap"` - GasPremium abi.TokenAmount `json:"gasPremium"` - - Method abi.MethodNum `json:"method"` - Params []byte `json:"params"` -} - -// NewUnsignedMessage creates a new message. -func NewUnsignedMessage(from, to address.Address, nonce uint64, value abi.TokenAmount, method abi.MethodNum, params []byte) *UnsignedMessage { - return &UnsignedMessage{ - Version: MessageVersion, - To: to, - From: from, - Nonce: nonce, - Value: value, - Method: method, - Params: params, - } -} - -// NewMeteredMessage adds gas price and gas limit to the message -func NewMeteredMessage(from, to address.Address, nonce uint64, value abi.TokenAmount, method abi.MethodNum, params []byte, gasFeeCap, gasPremium abi.TokenAmount, limit int64) *UnsignedMessage { - return &UnsignedMessage{ - Version: MessageVersion, - To: to, - From: from, - Nonce: nonce, - Value: value, - GasFeeCap: gasFeeCap, - GasPremium: gasPremium, - GasLimit: limit, - Method: method, - Params: params, - } -} - -func (msg *UnsignedMessage) RequiredFunds() abi.TokenAmount { - return specsbig.Mul(msg.GasFeeCap, specsbig.NewInt(msg.GasLimit)) -} - -// ToNode converts the Message to an IPLD node. -func (msg *UnsignedMessage) ToNode() (ipld.Node, error) { - buf := new(bytes.Buffer) - err := msg.MarshalCBOR(buf) - if err != nil { - return nil, err - } - data := buf.Bytes() - c, err := constants.DefaultCidBuilder.Sum(data) - if err != nil { - return nil, err - } - - blk, err := block.NewBlockWithCid(data, c) - if err != nil { - return nil, err - } - obj, err := cbor.DecodeBlock(blk) - if err != nil { - return nil, err - } - - return obj, nil -} - -// Cid returns the canonical CID for the message. -// TODO: can we avoid returning an error? -func (msg *UnsignedMessage) Cid() cid.Cid { - obj, err := msg.ToNode() - if err != nil { - panic(fmt.Sprintf("failed to marshal to marshal unsigned message:%s", err)) - } - - return obj.Cid() -} - -func (msg *UnsignedMessage) String() string { - errStr := "(error encoding Message)" - cid := msg.Cid() - js, err := json.MarshalIndent(msg, "", " ") - if err != nil { - return errStr - } - return fmt.Sprintf("Message cid=[%v]: %s", cid, string(js)) -} - -// Equals tests whether two messages are equal -func (msg *UnsignedMessage) Equals(other *UnsignedMessage) bool { - return msg.To == other.To && - msg.From == other.From && - msg.Nonce == other.Nonce && - msg.Value.Equals(other.Value) && - msg.GasPremium.Equals(other.GasPremium) && - msg.GasFeeCap.Equals(other.GasFeeCap) && - msg.GasLimit == other.GasLimit && - msg.Method == other.Method && - bytes.Equal(msg.Params, other.Params) -} - -func (msg *UnsignedMessage) EqualCall(o *Message) bool { - m1 := *msg - m2 := *o - - m1.GasLimit, m2.GasLimit = 0, 0 - m1.GasFeeCap, m2.GasFeeCap = specsbig.Zero(), specsbig.Zero() - m1.GasPremium, m2.GasPremium = specsbig.Zero(), specsbig.Zero() - - return (&m1).Equals(&m2) -} - -func (msg *UnsignedMessage) Serialize() ([]byte, error) { - buf := new(bytes.Buffer) - if err := msg.MarshalCBOR(buf); err != nil { - return nil, err - } - return buf.Bytes(), nil -} - -func (msg *UnsignedMessage) ChainLength() int { - buf := new(bytes.Buffer) - err := msg.MarshalCBOR(buf) - if err != nil { - panic(err) - } - - return buf.Len() -} - -func (msg *UnsignedMessage) VMMessage() *UnsignedMessage { - return msg -} - -func (msg *UnsignedMessage) ToStorageBlock() (block.Block, error) { - buf := new(bytes.Buffer) - err := msg.MarshalCBOR(buf) - if err != nil { - return nil, err - } - data := buf.Bytes() - c, err := abi.CidBuilder.Sum(data) - if err != nil { - return nil, err - } - - return block.NewBlockWithCid(data, c) -} - -func (msg *UnsignedMessage) ValidForBlockInclusion(minGas int64, version network.Version) error { - if msg.Version != 0 { - return xerrors.New("'Version' unsupported") - } - - if msg.To == address.Undef { - return xerrors.New("'To' address cannot be empty") - } - - if msg.To == ZeroAddress && version >= network.Version7 { - return xerrors.New("invalid 'To' address") - } - - if msg.From == address.Undef { - return xerrors.New("'From' address cannot be empty") - } - - if msg.Value.Int == nil { - return xerrors.New("'Value' cannot be nil") - } - - if msg.Value.LessThan(ZeroFIL) { - return xerrors.New("'Value' field cannot be negative") - } - - if msg.Value.GreaterThan(TotalFilecoinInt) { - return xerrors.New("'Value' field cannot be greater than total filecoin supply") - } - - if msg.GasFeeCap.Int == nil { - return xerrors.New("'GasFeeCap' cannot be nil") - } - - if msg.GasFeeCap.LessThan(specsbig.Zero()) { - return xerrors.New("'GasFeeCap' field cannot be negative") - } - - if msg.GasPremium.Int == nil { - return xerrors.New("'GasPremium' cannot be nil") - } - - if msg.GasPremium.LessThan(specsbig.Zero()) { - return xerrors.New("'GasPremium' field cannot be negative") - } - - if msg.GasPremium.GreaterThan(msg.GasFeeCap) { - return xerrors.New("'GasFeeCap' less than 'GasPremium'") - } - - if msg.GasLimit > constants.BlockGasLimit { - return xerrors.New("'GasLimit' field cannot be greater than a newBlock's gas limit") - } - - // since prices might vary with time, this is technically semantic validation - if msg.GasLimit < minGas { - return xerrors.New("'GasLimit' field cannot be less than the cost of storing a message on chain") - } - - return nil -} - -func DecodeMessage(b []byte) (*UnsignedMessage, error) { - var msg UnsignedMessage - - if err := msg.UnmarshalCBOR(bytes.NewReader(b)); err != nil { - return nil, err - } - - if msg.Version != MessageVersion { - return nil, fmt.Errorf("decoded message had incorrect version (%d)", msg.Version) - } - - return &msg, nil -} - -func NewGasFeeCap(price int64) abi.TokenAmount { - return NewAttoFIL(big.NewInt(price)) -} - -func NewGasPremium(price int64) abi.TokenAmount { - return NewAttoFIL(big.NewInt(price)) -} - -// TxMeta tracks the merkleroots of both secp and bls messages separately -type TxMeta struct { - BLSRoot cid.Cid `json:"blsRoot"` - SecpRoot cid.Cid `json:"secpRoot"` -} - -// String returns a readable printing string of TxMeta -func (m TxMeta) String() string { - return fmt.Sprintf("secp: %s, bls: %s", m.SecpRoot.String(), m.BLSRoot.String()) -} - -func (m *TxMeta) Cid() cid.Cid { - b, err := m.ToStorageBlock() - if err != nil { - panic(err) // also maybe sketchy - } - return b.Cid() -} - -func (m *TxMeta) ToStorageBlock() (block.Block, error) { - var buf bytes.Buffer - if err := m.MarshalCBOR(&buf); err != nil { - return nil, xerrors.Errorf("failed to marshal MsgMeta: %w", err) - } - - c, err := abi.CidBuilder.Sum(buf.Bytes()) - if err != nil { - return nil, err - } - - return block.NewBlockWithCid(buf.Bytes(), c) -} - -// MessageReceipt is what is returned by executing a message on the vm. -type MessageReceipt struct { - ExitCode exitcode.ExitCode `json:"exitCode"` - Return []byte `json:"return"` - GasUsed int64 `json:"gasUsed"` -} - -func (r *MessageReceipt) String() string { - errStr := "(error encoding MessageReceipt)" - - js, err := json.MarshalIndent(r, "", " ") - if err != nil { - return errStr - } - return fmt.Sprintf("MessageReceipt: %s", string(js)) -} diff --git a/pkg/types/internal/message_test.go b/pkg/types/internal/message_test.go deleted file mode 100644 index 03ad1f9c52..0000000000 --- a/pkg/types/internal/message_test.go +++ /dev/null @@ -1,102 +0,0 @@ -package internal - -import ( - "bytes" - "reflect" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" -) - -func TestMessageMarshal(t *testing.T) { - tf.UnitTest(t) - - addrGetter := NewForTestGetter() - msg := NewMeteredMessage( - addrGetter(), - addrGetter(), - 42, - NewAttoFILFromFIL(17777), - 0, - []byte("foobar"), - NewAttoFILFromFIL(3), - NewAttoFILFromFIL(3), - 4, - ) - - // This check requests that you add a non-zero value for new fields above, - // then update the field count below. - require.Equal(t, 10, reflect.TypeOf(*msg).NumField()) - - buf := new(bytes.Buffer) - err := msg.MarshalCBOR(buf) - assert.NoError(t, err) - - msgBack := UnsignedMessage{} - assert.False(t, msg.Equals(&msgBack)) - - err = msgBack.UnmarshalCBOR(buf) - assert.NoError(t, err) - - assert.Equal(t, msg.Version, msgBack.Version) - assert.Equal(t, msg.To, msgBack.To) - assert.Equal(t, msg.From, msgBack.From) - assert.Equal(t, msg.Value, msgBack.Value) - assert.Equal(t, msg.Method, msgBack.Method) - assert.Equal(t, msg.Params, msgBack.Params) - assert.Equal(t, msg.GasLimit, msgBack.GasLimit) - assert.Equal(t, msg.GasFeeCap, msgBack.GasFeeCap) - assert.Equal(t, msg.GasPremium, msgBack.GasPremium) - assert.True(t, msg.Equals(&msgBack)) -} - -func TestMessageCid(t *testing.T) { - tf.UnitTest(t) - - addrGetter := NewForTestGetter() - - msg1 := NewUnsignedMessage( - addrGetter(), - addrGetter(), - 0, - NewAttoFILFromFIL(999), - 0, - nil, - ) - - msg2 := NewUnsignedMessage( - addrGetter(), - addrGetter(), - 0, - NewAttoFILFromFIL(4004), - 0, - nil, - ) - - c1 := msg1.Cid() - c2 := msg2.Cid() - - assert.NotEqual(t, c1.String(), c2.String()) -} - -func TestMessageString(t *testing.T) { - tf.UnitTest(t) - - addrGetter := NewForTestGetter() - - msg := NewUnsignedMessage( - addrGetter(), - addrGetter(), - 0, - NewAttoFILFromFIL(999), - 0, - nil, - ) - - cid := msg.Cid() - got := msg.String() - assert.Contains(t, got, cid.String()) -} diff --git a/pkg/types/internal/not_found.go b/pkg/types/internal/not_found.go deleted file mode 100644 index 1d12e91e99..0000000000 --- a/pkg/types/internal/not_found.go +++ /dev/null @@ -1,6 +0,0 @@ -package internal - -import "fmt" - -// ErrNotFound is not the error you are looking for. -var ErrNotFound = fmt.Errorf("not found") diff --git a/pkg/types/internal/signed_message.go b/pkg/types/internal/signed_message.go deleted file mode 100644 index 2b263f176b..0000000000 --- a/pkg/types/internal/signed_message.go +++ /dev/null @@ -1,155 +0,0 @@ -package internal - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - - "github.com/filecoin-project/go-state-types/abi" - blocks "github.com/ipfs/go-block-format" - "github.com/ipfs/go-cid" - cbor "github.com/ipfs/go-ipld-cbor" - ipld "github.com/ipfs/go-ipld-format" - - "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/crypto" -) - -// SignedMessage contains a message and its signature -type SignedMessage struct { - Message UnsignedMessage `json:"message"` - Signature crypto.Signature `json:"signature"` -} - -// NewSignedMessage accepts a message `msg` and a signer `s`. NewSignedMessage returns a `SignedMessage` containing -// a signature derived from the serialized `msg` and `msg.From` -// NOTE: this method can only sign message with From being a public-key type address, not an ID address. -// We should deprecate this and move to more explicit signing via an address resolver. -func NewSignedMessage(ctx context.Context, msg UnsignedMessage, s Signer) (*SignedMessage, error) { - msgCid := msg.Cid() - - sig, err := s.SignBytes(ctx, msgCid.Bytes(), msg.From) - if err != nil { - return nil, err - } - - return &SignedMessage{ - Message: msg, - Signature: *sig, - }, nil -} - -// Cid returns the canonical CID for the SignedMessage. -func (smsg *SignedMessage) Cid() cid.Cid { - if smsg.Signature.Type == crypto.SigTypeBLS { - return smsg.Message.Cid() - } - - obj, err := smsg.ToNode() - if err != nil { - panic(fmt.Sprintf("failed to marshal to marshal message:%s", err)) - } - - return obj.Cid() -} - -// ToNode converts the SignedMessage to an IPLD node. -func (smsg *SignedMessage) ToNode() (ipld.Node, error) { - if smsg.Signature.Type == crypto.SigTypeBLS { - return smsg.Message.ToNode() - } - - buf := new(bytes.Buffer) - err := smsg.MarshalCBOR(buf) - if err != nil { - return nil, err - } - data := buf.Bytes() - c, err := constants.DefaultCidBuilder.Sum(data) - if err != nil { - return nil, err - } - - blk, err := blocks.NewBlockWithCid(data, c) - if err != nil { - return nil, err - } - obj, err := cbor.DecodeBlock(blk) - if err != nil { - return nil, err - } - - return obj, nil - -} - -// String return message json string -func (smsg *SignedMessage) String() string { - errStr := "(error encoding SignedMessage)" - cid := smsg.Cid() - js, err := json.MarshalIndent(smsg, "", " ") - if err != nil { - return errStr - } - return fmt.Sprintf("SignedMessage cid=[%v]: %s", cid, string(js)) -} - -// Equals tests whether two signed messages are equal. -func (smsg *SignedMessage) Equals(other *SignedMessage) bool { - return smsg.Message.Equals(&other.Message) && - smsg.Signature.Equals(&other.Signature) -} - -//ChainLength return length of message binary -func (smsg *SignedMessage) ChainLength() int { - var err error - buf := new(bytes.Buffer) - - if smsg.Signature.Type == crypto.SigTypeBLS { - // BLS chain message length doesn't include signature - err = smsg.Message.MarshalCBOR(buf) - } else { - err = smsg.MarshalCBOR(buf) - } - if err != nil { - panic(err) - } - return buf.Len() -} - -// ToStorageBlock return db block of message binary -func (smsg *SignedMessage) ToStorageBlock() (blocks.Block, error) { - if smsg.Signature.Type == crypto.SigTypeBLS { - return smsg.Message.ToStorageBlock() - } - - buf := new(bytes.Buffer) - err := smsg.MarshalCBOR(buf) - if err != nil { - return nil, err - } - data := buf.Bytes() - - c, err := abi.CidBuilder.Sum(data) - if err != nil { - return nil, err - } - - return blocks.NewBlockWithCid(data, c) -} - -// Serialize return message binary -func (smsg *SignedMessage) Serialize() ([]byte, error) { - buf := new(bytes.Buffer) - if err := smsg.MarshalCBOR(buf); err != nil { - return nil, err - } - return buf.Bytes(), nil -} - -func (smsg *SignedMessage) VMMessage() *UnsignedMessage { - return &smsg.Message -} - -var _ ChainMsg = &SignedMessage{} diff --git a/pkg/types/internal/signed_message_test.go b/pkg/types/internal/signed_message_test.go deleted file mode 100644 index 7ced27ae45..0000000000 --- a/pkg/types/internal/signed_message_test.go +++ /dev/null @@ -1,99 +0,0 @@ -package internal - -import ( - "bytes" - "context" - "reflect" - "testing" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - - _ "github.com/filecoin-project/venus/pkg/crypto/bls" - _ "github.com/filecoin-project/venus/pkg/crypto/secp" -) - -var mockSigner = NewMockSigner(MustGenerateKeyInfo(1, 42)) - -func TestSignedMessageString(t *testing.T) { - tf.UnitTest(t) - - smsg := makeMessage(t, mockSigner, 42) - cid := smsg.Cid() - got := smsg.String() - assert.Contains(t, got, cid.String()) -} - -func TestSignedMessageMarshal(t *testing.T) { - tf.UnitTest(t) - - smsg := makeMessage(t, mockSigner, 42) - - marshalled := new(bytes.Buffer) - err := smsg.MarshalCBOR(marshalled) - assert.NoError(t, err) - - smsgBack := SignedMessage{} - assert.False(t, smsg.Equals(&smsgBack)) - - err = smsgBack.UnmarshalCBOR(marshalled) - assert.NoError(t, err) - - assert.Equal(t, smsg.Message, smsgBack.Message) - assert.Equal(t, smsg.Signature, smsgBack.Signature) - assert.True(t, smsg.Equals(&smsgBack)) -} - -func TestSignedMessageCid(t *testing.T) { - tf.UnitTest(t) - - smsg1 := makeMessage(t, mockSigner, 41) - smsg2 := makeMessage(t, mockSigner, 42) - - c1 := smsg1.Cid() - c2 := smsg2.Cid() - - assert.NotEqual(t, c1.String(), c2.String()) - -} - -func TestSignedMessageCidToNode(t *testing.T) { - tf.UnitTest(t) - - smsg := makeMessage(t, mockSigner, 41) - - c := smsg.Cid() - n, err := smsg.ToNode() - require.NoError(t, err) - - assert.Equal(t, c, n.Cid()) - -} - -func makeMessage(t *testing.T, signer MockSigner, nonce uint64) *SignedMessage { - newAddr, err := address.NewSecp256k1Address([]byte("receiver")) - require.NoError(t, err) - - msg := NewMeteredMessage( - signer.Addresses[0], - newAddr, - nonce, - NewAttoFILFromFIL(2), - abi.MethodNum(2352), - []byte("params"), - NewGasFeeCap(1000), - NewGasPremium(100), - 100) - smsg, err := NewSignedMessage(context.TODO(), *msg, &signer) - require.NoError(t, err) - - // This check requests that you add a non-zero value for new fields above, - // then update the field count below. - require.Equal(t, 2, reflect.TypeOf(*smsg).NumField()) - - return smsg -} diff --git a/pkg/types/internal/signer.go b/pkg/types/internal/signer.go deleted file mode 100644 index 407d1b64ae..0000000000 --- a/pkg/types/internal/signer.go +++ /dev/null @@ -1,14 +0,0 @@ -package internal - -import ( - "context" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/crypto" -) - -// Signer signs data with a private key obtained internally from a provided address. -type Signer interface { - SignBytes(ctx context.Context, data []byte, addr address.Address) (*crypto.Signature, error) - HasAddress(ctx context.Context, addr address.Address) (bool, error) -} diff --git a/pkg/types/internal/testing.go b/pkg/types/internal/testing.go deleted file mode 100644 index 2b9a293197..0000000000 --- a/pkg/types/internal/testing.go +++ /dev/null @@ -1,363 +0,0 @@ -package internal - -import ( - "bytes" - "context" - "crypto/rand" - "fmt" - "testing" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbor "github.com/ipfs/go-ipld-cbor" - "github.com/pkg/errors" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/pkg/crypto" -) - -// MockSigner implements the Signer interface -type MockSigner struct { - AddrKeyInfo map[address.Address]crypto.KeyInfo - Addresses []address.Address - PubKeys [][]byte -} - -// NewMockSigner returns a new mock signer, capable of signing data with -// keys (addresses derived from) in keyinfo -func NewMockSigner(kis []crypto.KeyInfo) MockSigner { - var ms MockSigner - ms.AddrKeyInfo = make(map[address.Address]crypto.KeyInfo) - for _, k := range kis { - // extract public key - pub, err := k.PublicKey() - if err != nil { - panic(err) - } - - var newAddr address.Address - if k.SigType == crypto.SigTypeSecp256k1 { - newAddr, err = address.NewSecp256k1Address(pub) - } else if k.SigType == crypto.SigTypeBLS { - newAddr, err = address.NewBLSAddress(pub) - } - if err != nil { - panic(err) - } - ms.Addresses = append(ms.Addresses, newAddr) - ms.AddrKeyInfo[newAddr] = k - ms.PubKeys = append(ms.PubKeys, pub) - } - return ms -} - -// NewMockSignersAndKeyInfo is a convenience function to generate a mock -// signers with some keys. -func NewMockSignersAndKeyInfo(numSigners int) (MockSigner, []crypto.KeyInfo) { - ki := MustGenerateKeyInfo(numSigners, 42) - signer := NewMockSigner(ki) - return signer, ki -} - -// MustGenerateMixedKeyInfo produces m bls keys and n secp keys. -// BLS and Secp will be interleaved. The keys will be valid, but not deterministic. -func MustGenerateMixedKeyInfo(m int, n int) []crypto.KeyInfo { - info := []crypto.KeyInfo{} - for m > 0 && n > 0 { - if m > 0 { - ki, err := crypto.NewBLSKeyFromSeed(rand.Reader) - if err != nil { - panic(err) - } - info = append(info, ki) - m-- - } - - if n > 0 { - ki, err := crypto.NewSecpKeyFromSeed(rand.Reader) - if err != nil { - panic(err) - } - info = append(info, ki) - n-- - } - } - return info -} - -// MustGenerateBLSKeyInfo produces n distinct BLS keyinfos. -func MustGenerateBLSKeyInfo(n int, seed byte) []crypto.KeyInfo { - token := bytes.Repeat([]byte{seed}, 512) - var keyinfos []crypto.KeyInfo - for i := 0; i < n; i++ { - token[0] = byte(i) - ki, err := crypto.NewBLSKeyFromSeed(bytes.NewReader(token)) - if err != nil { - panic(err) - } - keyinfos = append(keyinfos, ki) - } - return keyinfos -} - -// MustGenerateKeyInfo generates `n` distinct keyinfos using seed `seed`. -// The result is deterministic (for stable tests), don't use this for real keys! -func MustGenerateKeyInfo(n int, seed byte) []crypto.KeyInfo { - token := bytes.Repeat([]byte{seed}, 512) - var keyinfos []crypto.KeyInfo - for i := 0; i < n; i++ { - token[0] = byte(i) - ki, err := crypto.NewSecpKeyFromSeed(bytes.NewReader(token)) - if err != nil { - panic(err) - } - keyinfos = append(keyinfos, ki) - } - return keyinfos -} - -// SignBytes cryptographically signs `data` using the `addr`. -func (ms MockSigner) SignBytes(_ context.Context, data []byte, addr address.Address) (*crypto.Signature, error) { - ki, ok := ms.AddrKeyInfo[addr] - if !ok { - return nil, errors.New("unknown address") - } - var sig *crypto.Signature - err := ki.UsePrivateKey(func(privateKey []byte) error { - var err error - sig, err = crypto.Sign(data, privateKey, ki.SigType) - - return err - }) - return sig, err -} - -// HasAddress returns whether the signer can sign with this address -func (ms MockSigner) HasAddress(_ context.Context, addr address.Address) (bool, error) { - return true, nil -} - -// GetAddressForPubKey looks up a KeyInfo address associated with a given PublicKeyForSecpSecretKey for a MockSigner -func (ms MockSigner) GetAddressForPubKey(pk []byte) (address.Address, error) { - var addr address.Address - - for _, ki := range ms.AddrKeyInfo { - testPk, err := ki.PublicKey() - if err != nil { - return address.Undef, err - } - - if bytes.Equal(testPk, pk) { - addr, err := ki.Address() - if err != nil { - return addr, errors.New("could not fetch address") - } - return addr, nil - } - } - return addr, errors.New("public key not found in wallet") -} - -// NewSignedMessageForTestGetter returns a closure that returns a SignedMessage unique to that invocation. -// The message is unique wrt the closure returned, not globally. You can use this function -// in tests instead of manually creating messages -- it both reduces duplication and gives us -// exactly one place to create valid messages for tests if messages require validation in the -// future. -// TODO support chosing from address -func NewSignedMessageForTestGetter(ms MockSigner) func(uint64) *SignedMessage { - i := 0 - return func(nonce uint64) *SignedMessage { - s := fmt.Sprintf("smsg%d", i) - i++ - newAddr, err := address.NewSecp256k1Address([]byte(s + "-to")) - if err != nil { - panic(err) - } - msg := NewMeteredMessage( - ms.Addresses[0], // from needs to be an address from the signer - newAddr, - nonce, - ZeroFIL, - 0, - []byte("params"), - ZeroFIL, - ZeroFIL, - 0, - ) - smsg, err := NewSignedMessage(context.TODO(), *msg, &ms) - if err != nil { - panic(err) - } - return smsg - } -} - -// Type-related test helpers. - -// CidFromString generates Cid from string input -func CidFromString(t *testing.T, input string) cid.Cid { - c, err := constants.DefaultCidBuilder.Sum([]byte(input)) - require.NoError(t, err) - return c -} - -// NewCidForTestGetter returns a closure that returns a Cid unique to that invocation. -// The Cid is unique wrt the closure returned, not globally. You can use this function -// in tests. -func NewCidForTestGetter() func() cid.Cid { - i := 31337 - return func() cid.Cid { - obj, err := cbor.WrapObject([]int{i}, constants.DefaultHashFunction, -1) - if err != nil { - panic(err) - } - i++ - return obj.Cid() - } -} - -// NewMessageForTestGetter returns a closure that returns a message unique to that invocation. -// The message is unique wrt the closure returned, not globally. You can use this function -// in tests instead of manually creating messages -- it both reduces duplication and gives us -// exactly one place to create valid messages for tests if messages require validation in the -// future. -func NewMessageForTestGetter() func() *UnsignedMessage { - i := 0 - return func() *UnsignedMessage { - s := fmt.Sprintf("msg%d", i) - i++ - from, err := address.NewSecp256k1Address([]byte(s + "-from")) - if err != nil { - panic(err) - } - to, err := address.NewSecp256k1Address([]byte(s + "-to")) - if err != nil { - panic(err) - } - return NewUnsignedMessage( - from, - to, - 0, - ZeroFIL, - abi.MethodNum(10000+i), - nil) - } -} - -// NewMsgs returns n messages. The messages returned are unique to this invocation -// but are not unique globally (ie, a second call to NewMsgs will return the same -// set of messages). -func NewMsgs(n int) []*UnsignedMessage { - newMsg := NewMessageForTestGetter() - msgs := make([]*UnsignedMessage, n) - for i := 0; i < n; i++ { - msgs[i] = newMsg() - msgs[i].Nonce = uint64(i) - } - return msgs -} - -// NewSignedMsgs returns n signed messages. The messages returned are unique to this invocation -// but are not unique globally (ie, a second call to NewSignedMsgs will return the same -// set of messages). -func NewSignedMsgs(n uint, ms MockSigner) []*SignedMessage { - var err error - newMsg := NewMessageForTestGetter() - smsgs := make([]*SignedMessage, n) - for i := uint(0); i < n; i++ { - msg := newMsg() - msg.From = ms.Addresses[0] - msg.Nonce = uint64(i) - msg.GasFeeCap = ZeroFIL - msg.GasPremium = ZeroFIL - msg.GasLimit = 0 - smsgs[i], err = NewSignedMessage(context.TODO(), *msg, ms) - if err != nil { - panic(err) - } - } - return smsgs -} - -// SignMsgs returns a slice of signed messages where the original messages -// are `msgs`, if signing one of the `msgs` fails an error is returned -func SignMsgs(ms MockSigner, msgs []*UnsignedMessage) ([]*SignedMessage, error) { - var smsgs []*SignedMessage - for _, m := range msgs { - s, err := NewSignedMessage(context.TODO(), *m, ms) - if err != nil { - return nil, err - } - smsgs = append(smsgs, s) - } - return smsgs, nil -} - -// NewMsgsWithAddrs returns a slice of `n` messages who's `From` field's are pulled -// from `a`. This method should be used when the addresses returned are to be signed -// at a later point. -func NewMsgsWithAddrs(n int, a []address.Address) []*UnsignedMessage { - if n > len(a) { - panic("cannot create more messages than there are addresess for") - } - newMsg := NewMessageForTestGetter() - msgs := make([]*UnsignedMessage, n) - for i := 0; i < n; i++ { - msgs[i] = newMsg() - msgs[i].From = a[i] - } - return msgs -} - -// HasCid allows two values with CIDs to be compared. -type HasCid interface { - Cid() cid.Cid -} - -// AssertHaveSameCid asserts that two values have identical CIDs. -func AssertHaveSameCid(t *testing.T, m HasCid, n HasCid) { - if !m.Cid().Equals(n.Cid()) { - assert.Fail(t, "CIDs don't match", "not equal %v %v", m.Cid(), n.Cid()) - } -} - -// AssertCidsEqual asserts that two CIDS are identical. -func AssertCidsEqual(t *testing.T, m cid.Cid, n cid.Cid) { - if !m.Equals(n) { - assert.Fail(t, "CIDs don't match", "not equal %v %v", m, n) - } -} - -func RequireIDAddress(t *testing.T, i int) address.Address { - a, err := address.NewIDAddress(uint64(i)) - if err != nil { - t.Fatalf("failed to make address: %v", err) - } - return a -} - -// NewForTestGetter returns a closure that returns an address unique to that invocation. -// The address is unique wrt the closure returned, not globally. -func NewForTestGetter() func() address.Address { - i := 0 - return func() address.Address { - s := fmt.Sprintf("address%d", i) - i++ - newAddr, err := address.NewSecp256k1Address([]byte(s)) - if err != nil { - panic(err) - } - return newAddr - } -} - -// RequireNewTipSet instantiates and returns a new tipset of the given blocks -// and requires that the setup validation succeed. -func RequireNewTipSet(t *testing.T, blks ...*BlockHeader) *TipSet { - ts, err := NewTipSet(blks...) - require.NoError(t, err) - return ts -} diff --git a/pkg/types/internal/testing_messages.go b/pkg/types/internal/testing_messages.go deleted file mode 100644 index 57f470a57e..0000000000 --- a/pkg/types/internal/testing_messages.go +++ /dev/null @@ -1,102 +0,0 @@ -package internal - -import ( - "context" - "fmt" - specsbig "github.com/filecoin-project/go-state-types/big" - "testing" - - address "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/stretchr/testify/require" - - "github.com/filecoin-project/venus/pkg/crypto" -) - -// MessageMaker creates unique, signed messages for use in tests. -type MessageMaker struct { - DefaultGasFeeCap specsbig.Int - DefaultGasPremium specsbig.Int - DefaultGasUnits int64 - - signer *MockSigner - seq uint - t *testing.T -} - -// NewMessageMaker creates a new message maker with a set of signing keys. -func NewMessageMaker(t *testing.T, keys []crypto.KeyInfo) *MessageMaker { - addresses := make([]address.Address, len(keys)) - signer := NewMockSigner(keys) - - for i, key := range keys { - addr, _ := key.Address() - addresses[i] = addr - } - - return &MessageMaker{ZeroFIL, ZeroFIL, 0, &signer, 0, t} -} - -// Addresses returns the addresses for which this maker can sign messages. -func (mm *MessageMaker) Addresses() []address.Address { - return mm.signer.Addresses -} - -// Signer returns the signer with which this maker signs messages. -func (mm *MessageMaker) Signer() *MockSigner { - return mm.signer -} - -// NewUnsignedMessage creates a new message. -func (mm *MessageMaker) NewUnsignedMessage(from address.Address, nonce uint64) *UnsignedMessage { - seq := mm.seq - mm.seq++ - to, err := address.NewSecp256k1Address([]byte("destination")) - require.NoError(mm.t, err) - return NewMeteredMessage( - from, - to, - nonce, - ZeroFIL, - abi.MethodNum(9000+seq), - []byte("params"), - mm.DefaultGasFeeCap, - mm.DefaultGasPremium, - mm.DefaultGasUnits) -} - -// NewSignedMessage creates a new signed message. -func (mm *MessageMaker) NewSignedMessage(from address.Address, nonce uint64) *SignedMessage { - msg := mm.NewUnsignedMessage(from, nonce) - signed, err := NewSignedMessage(context.TODO(), *msg, mm.signer) - require.NoError(mm.t, err) - return signed -} - -// EmptyReceipts returns a slice of n empty receipts. -func EmptyReceipts(n int) []*MessageReceipt { - out := make([]*MessageReceipt, n) - for i := 0; i < n; i++ { - out[i] = &MessageReceipt{} - } - return out -} - -// ReceiptMaker generates unique receipts -type ReceiptMaker struct { - seq uint -} - -// NewReceiptMaker creates a new receipt maker -func NewReceiptMaker() *ReceiptMaker { - return &ReceiptMaker{0} -} - -// NewReceipt creates a new distinct receipt. -func (rm *ReceiptMaker) NewReceipt() MessageReceipt { - seq := rm.seq - rm.seq++ - return MessageReceipt{ - Return: []byte(fmt.Sprintf("%d", seq)), - } -} diff --git a/pkg/types/internal/testing_test.go b/pkg/types/internal/testing_test.go deleted file mode 100644 index 4c8914e86a..0000000000 --- a/pkg/types/internal/testing_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package internal - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" -) - -func TestCidForTestGetter(t *testing.T) { - tf.UnitTest(t) - - newCid := NewCidForTestGetter() - c1 := newCid() - c2 := newCid() - assert.False(t, c1.Equals(c2)) - assert.False(t, c1.Equals(CidFromString(t, "somecid"))) // Just in case. -} - -func TestNewMessageForTestGetter(t *testing.T) { - tf.UnitTest(t) - - newMsg := NewMessageForTestGetter() - m1 := newMsg() - c1 := m1.Cid() - m2 := newMsg() - c2 := m2.Cid() - assert.False(t, c1.Equals(c2)) -} diff --git a/pkg/types/internal/ticket.go b/pkg/types/internal/ticket.go deleted file mode 100644 index eda9af33e9..0000000000 --- a/pkg/types/internal/ticket.go +++ /dev/null @@ -1,42 +0,0 @@ -package internal - -import ( - "bytes" - "fmt" - "math/big" - - "github.com/minio/blake2b-simd" -) - -// A Ticket is a marker of a tick of the blockchain's clock. It is the source -// of randomness for proofs of storage and leader election. It is generated -// by the miner of a newBlock using a VRF. -type Ticket struct { - // A proof output by running a VRF on the VRFProof of the parent ticket - VRFProof VRFPi -} - -// String returns the string representation of the VRFProof of the ticket -func (t Ticket) String() string { - return fmt.Sprintf("%x", t.VRFProof) -} - -func (t *Ticket) Compare(o *Ticket) int { - tDigest := t.VRFProof.Digest() - oDigest := o.VRFProof.Digest() - return bytes.Compare(tDigest[:], oDigest[:]) -} - -func (t *Ticket) Less(o *Ticket) bool { - return t.Compare(o) < 0 -} - -func (t *Ticket) Quality() float64 { - ticketHash := blake2b.Sum256(t.VRFProof) - ticketNum := BigFromBytes(ticketHash[:]).Int - ticketDenu := big.NewInt(1) - ticketDenu.Lsh(ticketDenu, 256) - tv, _ := new(big.Rat).SetFrac(ticketNum, ticketDenu).Float64() - tq := 1 - tv - return tq -} diff --git a/pkg/types/internal/tipset.go b/pkg/types/internal/tipset.go deleted file mode 100644 index 9783cbaada..0000000000 --- a/pkg/types/internal/tipset.go +++ /dev/null @@ -1,289 +0,0 @@ -package internal - -import ( - "bytes" - "encoding/json" - "sort" - - "github.com/filecoin-project/go-state-types/abi" - fbig "github.com/filecoin-project/go-state-types/big" - "github.com/ipfs/go-cid" - "github.com/pkg/errors" -) - -// TipSet is a non-empty, immutable set of blocks at the same height with the same parent set. -// Blocks in a tipset are canonically ordered by ticket. Blocks may be iterated either via -// ToSlice() (which involves a shallow copy) or efficiently by index with At(). -// TipSet is a lightweight value type; passing by pointer is usually unnecessary. -// -// Canonical tipset newBlock ordering does not match the order of CIDs in a TipSetKey used as -// a tipset "key". -type TipSet struct { - // This slice is wrapped in a struct to enforce immutability. - blocks []*BlockHeader - // Key is computed at construction and cached. - key TipSetKey -} - -var ( - // errNoBlocks is returned from the tipset constructor when given no blocks. - errNoBlocks = errors.New("no blocks for tipset") -) - -// UndefTipSet is a singleton representing a nil or undefined tipset. -var UndefTipSet = &TipSet{} - -// NewTipSet builds a new TipSet from a collection of blocks. -// The blocks must be distinct (different CIDs), have the same height, and same parent set. -func NewTipSet(blocks ...*BlockHeader) (*TipSet, error) { - if len(blocks) == 0 { - return nil, errNoBlocks - } - - first := blocks[0] - height := first.Height - parents := first.Parents - weight := first.ParentWeight - cids := make([]cid.Cid, len(blocks)) - - sorted := make([]*BlockHeader, len(blocks)) - seen := make(map[cid.Cid]struct{}) - for i, blk := range blocks { - if i > 0 { // Skip redundant checks for first newBlock - if blk.Height != height { - return nil, errors.Errorf("Inconsistent newBlock heights %d and %d", height, blk.Height) - } - if !blk.Parents.Equals(parents) { - return nil, errors.Errorf("Inconsistent newBlock parents %s and %s", parents.String(), blk.Parents.String()) - } - if !blk.ParentWeight.Equals(weight) { - return nil, errors.Errorf("Inconsistent newBlock parent weights %d and %d", weight, blk.ParentWeight) - } - } - if _, ok := seen[blk.Cid()]; ok { - return nil, errors.New("duplicate newBlock") - } - seen[blk.Cid()] = struct{}{} - sorted[i] = blk - } - - // Sort blocks by ticket - sort.Slice(sorted, func(i, j int) bool { - cmp := sorted[i].Ticket.Compare(&sorted[j].Ticket) - if cmp == 0 { - // Break ticket ties with the newBlock CIDs, which are distinct. - cmp = bytes.Compare(sorted[i].Cid().Bytes(), sorted[j].Cid().Bytes()) - } - return cmp < 0 - }) - for i, blk := range sorted { - cids[i] = blk.Cid() - } - // Duplicate blocks (CIDs) are rejected here, pass that error through. - key := NewTipSetKey(cids...) - return &TipSet{sorted, key}, nil -} - -// Defined checks whether the tipset is defined. -// Invoking any other methods on an undefined tipset will result in undefined behaviour (c.f. cid.Undef) -func (ts *TipSet) Defined() bool { - if ts == nil { - return false - } - return len(ts.blocks) > 0 -} - -// Len returns the number of blocks in the tipset. -func (ts *TipSet) Len() int { - if ts == nil { - return 0 - } - return len(ts.blocks) -} - -// At returns the i'th newBlock in the tipset. -// An index outside the half-open range [0, Len()) will panic. -func (ts *TipSet) At(i int) *BlockHeader { - return ts.blocks[i] -} - -// Key returns a key for the tipset. -func (ts *TipSet) Key() TipSetKey { - if ts == nil { - return EmptyTSK - } - return ts.key -} - -// ToSlice returns an ordered slice of pointers to the tipset's blocks. -func (ts *TipSet) ToSlice() []*BlockHeader { - slice := make([]*BlockHeader, len(ts.blocks)) - copy(slice, ts.blocks) - return slice -} - -// MinTicket returns the smallest ticket of all blocks in the tipset. -func (ts *TipSet) MinTicket() Ticket { - blks := ts.Blocks() - - min := blks[0] - - for _, b := range blks[1:] { - if b.Ticket.Less(&min.Ticket) { - min = b - } - } - return min.Ticket -} - -func (ts *TipSet) Cids() []cid.Cid { - var cids []cid.Cid - if ts.Defined() { - for _, b := range ts.blocks { - cids = append(cids, b.Cid()) - } - return cids - } - return []cid.Cid{} -} - -// Height returns the height of a tipset. -func (ts *TipSet) Height() abi.ChainEpoch { - if ts.Defined() { - return ts.blocks[0].Height - } - return 0 -} - -// Parents returns the CIDs of the parents of the blocks in the tipset. -func (ts *TipSet) Parents() TipSetKey { - if ts.Defined() { - return ts.blocks[0].Parents - } - return TipSetKey{} -} - -// Parents returns the CIDs of the parents of the blocks in the tipset. -func (ts *TipSet) ParentState() cid.Cid { - if ts.Defined() { - return ts.blocks[0].ParentStateRoot - } - return cid.Undef -} - -// ParentWeight returns the tipset's ParentWeight in fixed point form. -func (ts *TipSet) ParentWeight() fbig.Int { - if ts.Defined() { - return ts.blocks[0].ParentWeight - } - return fbig.Zero() -} - -// Equals tests whether the tipset contains the same blocks as another. -// Equality is not tested deeply: two tipsets are considered equal if their keys (ordered newBlock CIDs) are equal. -func (ts *TipSet) Equals(ts2 *TipSet) bool { - if ts == nil && ts2 == nil { - return true - } - if ts == nil || ts2 == nil { - return false - } - - return ts.Key().Equals(ts2.Key()) -} - -// String returns a formatted string of the CIDs in the TipSet. -// "{ }" -// Note: existing callers use this as a unique key for the tipset. We should change them -// to use the TipSetKey explicitly -func (ts TipSet) String() string { - return ts.Key().String() -} - -func (ts *TipSet) Blocks() []*BlockHeader { - return ts.blocks -} - -func (ts *TipSet) MinTimestamp() uint64 { - minTS := ts.blocks[0].Timestamp - for _, bh := range ts.Blocks()[1:] { - if bh.Timestamp < minTS { - minTS = bh.Timestamp - } - } - return minTS -} - -func (ts *TipSet) IsChildOf(parent *TipSet) bool { - return CidArrsEqual(ts.Parents().Cids(), parent.key.Cids()) && - // FIXME: The height check might go beyond what is meant by - // "parent", but many parts of the code rely on the tipset's - // height for their processing logic at the moment to obviate it. - ts.Height() > parent.Height() -} - -//this types just for marshal -type expTipSet struct { - // This slice is wrapped in a struct to enforce immutability. - Blocks []*BlockHeader - // Key is computed at construction and cached. - Key TipSetKey -} - -func (ts *TipSet) MarshalJSON() ([]byte, error) { - // why didnt i just export the fields? Because the struct has methods with the - // same names already - return json.Marshal(expTipSet{ - Blocks: ts.blocks, - Key: ts.key, - }) -} - -func (ts *TipSet) UnmarshalJSON(b []byte) error { - var ets expTipSet - if err := json.Unmarshal(b, &ets); err != nil { - return err - } - - ots, err := NewTipSet(ets.Blocks...) - if err != nil { - return err - } - - *ts = *ots - - return nil -} - -func (ts *TipSet) MinTicketBlock() *BlockHeader { - blks := ts.Blocks() - - min := blks[0] - - for _, b := range blks[1:] { - if b.LastTicket().Less(min.LastTicket()) { - min = b - } - } - - return min -} - -func CidArrsEqual(a, b []cid.Cid) bool { - if len(a) != len(b) { - return false - } - - // order ignoring compare... - s := make(map[cid.Cid]bool) - for _, c := range a { - s[c] = true - } - - for _, c := range b { - if !s[c] { - return false - } - } - return true -} diff --git a/pkg/types/internal/tipset_key.go b/pkg/types/internal/tipset_key.go deleted file mode 100644 index 96c1ac4402..0000000000 --- a/pkg/types/internal/tipset_key.go +++ /dev/null @@ -1,218 +0,0 @@ -package internal - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "strings" - - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - xerrors "github.com/pkg/errors" - cbg "github.com/whyrusleeping/cbor-gen" -) - -// TipSetKey is an immutable set of CIDs forming a unique key for a TipSet. -// Equal keys will have equivalent iteration order. CIDs are maintained in -// the same order as the canonical iteration order of blocks in a tipset (which is by ticket). -// This convention is maintained by the caller. The order of input cids to the constructor -// must be the same as this canonical order. It is the caller's responsibility to not -// construct a key with duplicate ids -// TipSetKey is a lightweight value type; passing by pointer is usually unnecessary. - -var EmptyTSK = TipSetKey{} - -// The length of a newBlock header CID in bytes. -var blockHeaderCIDLen int - -func init() { - // hash a large string of zeros so we don't estimate based on inlined CIDs. - var buf [256]byte - c, err := abi.CidBuilder.Sum(buf[:]) - if err != nil { - panic(err) - } - blockHeaderCIDLen = len(c.Bytes()) -} - -// A TipSetKey is an immutable collection of CIDs forming a unique key for a tipset. -// The CIDs are assumed to be distinct and in canonical order. Two keys with the same -// CIDs in a different order are not considered equal. -// TipSetKey is a lightweight value type, and may be compared for equality with ==. -type TipSetKey struct { - // The internal representation is a concatenation of the bytes of the CIDs, which are - // self-describing, wrapped as a string. - // These gymnastics make the a TipSetKey usable as a map key. - // The empty key has value "". - value string -} - -// NewTipSetKey builds a new key from a slice of CIDs. -// The CIDs are assumed to be ordered correctly. -func NewTipSetKey(cids ...cid.Cid) TipSetKey { - encoded := encodeKey(cids) - return TipSetKey{string(encoded)} -} - -// TipSetKeyFromBytes wraps an encoded key, validating correct decoding. -func TipSetKeyFromBytes(encoded []byte) (TipSetKey, error) { - _, err := decodeKey(encoded) - if err != nil { - return TipSetKey{}, err - } - return TipSetKey{string(encoded)}, nil -} - -// Cids returns a slice of the CIDs comprising this key. -func (tipsetKey TipSetKey) Cids() []cid.Cid { - cids, err := decodeKey([]byte(tipsetKey.value)) - if err != nil { - panic("invalid tipset key: " + err.Error()) - } - return cids -} - -// String returns a human-readable representation of the key. -func (tipsetKey TipSetKey) String() string { - b := strings.Builder{} - b.WriteString("{") - for _, c := range tipsetKey.Cids() { - b.Write([]byte(fmt.Sprintf(" %s", c.String()))) - } - b.WriteString(" }") - return b.String() -} - -// Bytes returns a binary representation of the key. -func (tipsetKey TipSetKey) Bytes() []byte { - return []byte(tipsetKey.value) -} - -func (tipsetKey TipSetKey) MarshalJSON() ([]byte, error) { - return json.Marshal(tipsetKey.Cids()) -} - -func (tipsetKey *TipSetKey) UnmarshalJSON(b []byte) error { - var cids []cid.Cid - if err := json.Unmarshal(b, &cids); err != nil { - return err - } - tipsetKey.value = string(encodeKey(cids)) - return nil -} - -func (tipsetKey TipSetKey) IsEmpty() bool { - return len(tipsetKey.value) == 0 -} - -// Equals checks whether the set contains exactly the same CIDs as another. -func (tipsetKey TipSetKey) Equals(other TipSetKey) bool { - return tipsetKey.value == other.value -} - -func (tipsetKey *TipSetKey) UnmarshalCBOR(r io.Reader) error { - br := cbg.GetPeeker(r) - scratch := make([]byte, 8) - maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) - if err != nil { - return err - } - - if extra > cbg.MaxLength { - return fmt.Errorf("t.Parents: array too large (%d)", extra) - } - - if maj != cbg.MajArray { - return fmt.Errorf("expected cbor array") - } - - if extra > 0 { - cids := make([]cid.Cid, extra) - for i := 0; i < int(extra); i++ { - - c, err := cbg.ReadCid(br) - if err != nil { - return xerrors.Errorf("reading cid field t.Parents failed: %v", err) - } - cids[i] = c - } - tipsetKey.value = string(encodeKey(cids)) - } - return nil -} - -func (tipsetKey TipSetKey) MarshalCBOR(w io.Writer) error { - cids := tipsetKey.Cids() - if len(cids) > cbg.MaxLength { - return xerrors.Errorf("Slice value in field t.Parents was too long") - } - scratch := make([]byte, 9) - - if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(cids))); err != nil { - return err - } - for _, v := range cids { - if err := cbg.WriteCidBuf(scratch, w, v); err != nil { - return xerrors.Errorf("failed writing cid field t.Parents: %v", err) - } - } - return nil -} - -// ContainsAll checks if another set is a subset of this one. -// We can assume that the relative order of members of one key is -// maintained in the other since we assume that all ids are sorted -// by corresponding newBlock ticket value. -func (tipsetKey TipSetKey) ContainsAll(other TipSetKey) bool { - // Since we assume the ids must have the same relative sorting we can - // perform one pass over this set, advancing the other index whenever the - // values match. - cids := tipsetKey.Cids() - otherCids := other.Cids() - otherIdx := 0 - for i := 0; i < len(cids) && otherIdx < len(otherCids); i++ { - if cids[i].Equals(otherCids[otherIdx]) { - otherIdx++ - } - } - // otherIdx is advanced the full length only if every element was found in this set. - return otherIdx == len(otherCids) -} - -// Has checks whether the set contains `id`. -func (tipsetKey TipSetKey) Has(id cid.Cid) bool { - // Find index of the first CID not less than id. - for _, cid := range tipsetKey.Cids() { - if cid == id { - return true - } - } - return false -} - -func encodeKey(cids []cid.Cid) []byte { - buffer := new(bytes.Buffer) - for _, c := range cids { - // bytes.Buffer.Write() err is documented to be always nil. - _, _ = buffer.Write(c.Bytes()) - } - return buffer.Bytes() -} - -func decodeKey(encoded []byte) ([]cid.Cid, error) { - // To avoid reallocation of the underlying array, estimate the number of CIDs to be extracted - // by dividing the encoded length by the expected CID length. - estimatedCount := len(encoded) / blockHeaderCIDLen - cids := make([]cid.Cid, 0, estimatedCount) - nextIdx := 0 - for nextIdx < len(encoded) { - nr, c, err := cid.CidFromBytes(encoded[nextIdx:]) - if err != nil { - return nil, err - } - cids = append(cids, c) - nextIdx += nr - } - return cids, nil -} diff --git a/pkg/types/internal/tipset_key_test.go b/pkg/types/internal/tipset_key_test.go deleted file mode 100644 index b536883637..0000000000 --- a/pkg/types/internal/tipset_key_test.go +++ /dev/null @@ -1,74 +0,0 @@ -package internal - -import ( - "bytes" - "encoding/json" - "testing" - - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/ipfs/go-cid" - "github.com/stretchr/testify/assert" -) - -func TestTipSetKey(t *testing.T) { - tf.UnitTest(t) - - c1, _ := cid.Parse("zDPWYqFD4b5HLFuPfhkjJJkfvm4r8KLi1V9e2ahJX6Ab16Ay24pJ") - c2, _ := cid.Parse("zDPWYqFD4b5HLFuPfhkjJJkfvm4r8KLi1V9e2ahJX6Ab16Ay24pK") - c3, _ := cid.Parse("zDPWYqFD4b5HLFuPfhkjJJkfvm4r8KLi1V9e2ahJX6Ab16Ay24pL") - c4, _ := cid.Parse("zDPWYqFD4b5HLFuPfhkjJJkfvm4r8KLi1V9e2ahJX6Ab16Ay24pM") - - t.Run("contains", func(t *testing.T) { - empty := NewTipSetKey() - s := NewTipSetKey(c1, c2, c3) - - assert.False(t, empty.Has(c1)) - assert.True(t, s.Has(c1)) - assert.True(t, s.Has(c2)) - assert.True(t, s.Has(c3)) - assert.False(t, s.Has(c4)) - - assert.True(t, s.ContainsAll(empty)) - assert.True(t, s.ContainsAll(NewTipSetKey(c1))) - assert.True(t, s.ContainsAll(s)) - assert.False(t, s.ContainsAll(NewTipSetKey(c4))) - assert.False(t, s.ContainsAll(NewTipSetKey(c1, c4))) - - assert.True(t, empty.ContainsAll(empty)) - assert.False(t, empty.ContainsAll(s)) - }) -} - -func TestTipSetKeyCborRoundtrip(t *testing.T) { - tf.UnitTest(t) - - makeCid := NewCidForTestGetter() - exp := NewTipSetKey(makeCid(), makeCid(), makeCid()) - buf := new(bytes.Buffer) - err := exp.MarshalCBOR(buf) - assert.NoError(t, err) - - var act TipSetKey - err = act.UnmarshalCBOR(buf) - assert.NoError(t, err) - - assert.Equal(t, 3, len(act.Cids())) - assert.True(t, act.Equals(exp)) -} - -func TestTipSetKeyJSONRoundtrip(t *testing.T) { - tf.UnitTest(t) - - makeCid := NewCidForTestGetter() - exp := NewTipSetKey(makeCid(), makeCid(), makeCid()) - - buf, err := json.Marshal(exp) - assert.NoError(t, err) - - var act TipSetKey - err = json.Unmarshal(buf, &act) - assert.NoError(t, err) - - assert.Equal(t, 3, len(act.Cids())) - assert.True(t, act.Equals(exp)) -} diff --git a/pkg/types/internal/tipset_test.go b/pkg/types/internal/tipset_test.go deleted file mode 100644 index 61223ca97c..0000000000 --- a/pkg/types/internal/tipset_test.go +++ /dev/null @@ -1,221 +0,0 @@ -package internal - -import ( - "bytes" - "encoding/json" - "testing" - - "github.com/filecoin-project/venus/pkg/util/test" - - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - "github.com/stretchr/testify/require" - - "github.com/stretchr/testify/assert" - - fbig "github.com/filecoin-project/go-state-types/big" - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" -) - -const parentWeight = uint64(1337000) - -var ( - cid1, cid2 cid.Cid - mockSignerForTest MockSigner - cidGetter func() cid.Cid -) - -func init() { - cidGetter = NewCidForTestGetter() - cid1 = cidGetter() - cid2 = cidGetter() - - mockSignerForTest, _ = NewMockSignersAndKeyInfo(2) -} - -func newBlock(t *testing.T, ticket []byte, height int, parentCid cid.Cid, parentWeight, timestamp uint64, msg string) *BlockHeader { - cidGetter := NewCidForTestGetter() - addrGetter := NewForTestGetter() - return &BlockHeader{ - Miner: addrGetter(), - Ticket: Ticket{VRFProof: ticket}, - Parents: NewTipSetKey(parentCid), - ParentWeight: fbig.NewInt(int64(parentWeight)), - Height: 42 + abi.ChainEpoch(height), - Messages: cidGetter(), - ParentStateRoot: cidGetter(), - ParentMessageReceipts: cidGetter(), - Timestamp: timestamp, - } -} - -func TestTipsetJson(t *testing.T) { - tf.UnitTest(t) - b1, b2, b3 := makeTestBlocks(t) - ts := RequireNewTipSet(t, b3, b2, b1) - jsonBytes, err := json.Marshal(ts) - require.NoError(t, err) - - unmarshalTS := &TipSet{} - err = json.Unmarshal(jsonBytes, unmarshalTS) - require.NoError(t, err) - assert.Equal(t, unmarshalTS.Len(), ts.Len()) - for i := 0; i < ts.Len(); i++ { - test.Equal(t, unmarshalTS.At(i), ts.At(i)) - } -} - -func TestTipSet(t *testing.T) { - tf.UnitTest(t) - - b1, b2, b3 := makeTestBlocks(t) - - t.Run("ordered by ticket digest", func(t *testing.T) { - ts := RequireNewTipSet(t, b3, b2, b1) // Presented in reverse order - assert.True(t, ts.Defined()) - assert.Equal(t, b1, ts.At(0)) - assert.Equal(t, b2, ts.At(1)) - assert.Equal(t, b3, ts.At(2)) - assert.Equal(t, []*BlockHeader{b1, b2, b3}, ts.ToSlice()) - }) - - t.Run("order breaks ties with CID", func(t *testing.T) { - b1 := newBlock(t, []byte{1}, 1, cid1, parentWeight, 1, "1") - b2 := newBlock(t, []byte{1}, 1, cid1, parentWeight, 2, "2") - - ts := RequireNewTipSet(t, b1, b2) - if bytes.Compare(b1.Cid().Bytes(), b2.Cid().Bytes()) < 0 { - assert.Equal(t, []*BlockHeader{b1, b2}, ts.ToSlice()) - } else { - assert.Equal(t, []*BlockHeader{b2, b1}, ts.ToSlice()) - } - }) - - t.Run("len", func(t *testing.T) { - t1 := RequireNewTipSet(t, b1) - assert.True(t, t1.Defined()) - assert.Equal(t, 1, t1.Len()) - - t3 := RequireNewTipSet(t, b1, b2, b3) - assert.True(t, t3.Defined()) - assert.Equal(t, 3, t3.Len()) - }) - - t.Run("key", func(t *testing.T) { - assert.Equal(t, NewTipSetKey(b1.Cid()), RequireNewTipSet(t, b1).Key()) - // sorted ticket order is b1, b2, b3 - assert.Equal(t, NewTipSetKey(b1.Cid(), b2.Cid(), b3.Cid()), - RequireNewTipSet(t, b2, b3, b1).Key()) - }) - - t.Run("height", func(t *testing.T) { - tsHeight := RequireNewTipSet(t, b1).Height() - assert.Equal(t, b1.Height, tsHeight) - }) - - t.Run("parents", func(t *testing.T) { - tsParents := RequireNewTipSet(t, b1).Parents() - assert.Equal(t, b1.Parents, tsParents) - }) - - t.Run("parent weight", func(t *testing.T) { - tsParentWeight := RequireNewTipSet(t, b1).ParentWeight() - assert.Equal(t, fbig.NewInt(int64(parentWeight)), tsParentWeight) - }) - - t.Run("min ticket", func(t *testing.T) { - tsTicket := RequireNewTipSet(t, b1).MinTicket() - assert.Equal(t, b1.Ticket, tsTicket) - - tsTicket = RequireNewTipSet(t, b2).MinTicket() - assert.Equal(t, b2.Ticket, tsTicket) - - tsTicket = RequireNewTipSet(t, b3, b2, b1).MinTicket() - assert.Equal(t, b1.Ticket, tsTicket) - }) - - t.Run("equality", func(t *testing.T) { - ts1a := RequireNewTipSet(t, b3, b2, b1) - ts1b := RequireNewTipSet(t, b1, b2, b3) - ts2 := RequireNewTipSet(t, b1, b2) - ts3 := RequireNewTipSet(t, b2) - - assert.Equal(t, ts1a, ts1a) - assert.Equal(t, ts1a, ts1b) - assert.NotEqual(t, ts1a, ts2) - assert.NotEqual(t, ts1a, ts3) - assert.NotEqual(t, ts1a, nil) - assert.NotEqual(t, ts2, nil) - assert.NotEqual(t, ts3, nil) - }) - - t.Run("slice", func(t *testing.T) { - assert.Equal(t, []*BlockHeader{b1}, RequireNewTipSet(t, b1).ToSlice()) - - ts := RequireNewTipSet(t, b3, b2, b1) // Presented in reverse order - slice := ts.ToSlice() - assert.Equal(t, []*BlockHeader{b1, b2, b3}, slice) - - slice[1] = b1 - slice[2] = b2 - assert.NotEqual(t, slice, ts.ToSlice()) - assert.Equal(t, []*BlockHeader{b1, b2, b3}, ts.ToSlice()) // tipset is immutable - }) - - t.Run("string", func(t *testing.T) { - // String shouldn't really need testing, but some existing code uses the string as a - // datastore key and depends on the format exactly. - assert.Equal(t, "{ "+b1.Cid().String()+" }", RequireNewTipSet(t, b1).String()) - - expected := NewTipSetKey(b1.Cid(), b2.Cid(), b3.Cid()).String() - assert.Equal(t, expected, RequireNewTipSet(t, b3, b2, b1).String()) - }) - - t.Run("empty new tipset fails", func(t *testing.T) { - _, err := NewTipSet() - require.Error(t, err) - assert.Contains(t, err.Error(), "no blocks for tipset") - }) - - t.Run("duplicate newBlock fails new tipset", func(t *testing.T) { - b1, b2, b3 = makeTestBlocks(t) - ts, err := NewTipSet(b1, b2, b1) - assert.Error(t, err) - assert.False(t, ts.Defined()) - }) - - t.Run("mismatched height fails new tipset", func(t *testing.T) { - b1, b2, b3 = makeTestBlocks(t) - b1.Height = 3 - ts, err := NewTipSet(b1, b2, b3) - assert.Error(t, err) - assert.False(t, ts.Defined()) - }) - - t.Run("mismatched parents fails new tipset", func(t *testing.T) { - b1, b2, b3 = makeTestBlocks(t) - b1.Parents = NewTipSetKey(cid1, cid2) - ts, err := NewTipSet(b1, b2, b3) - assert.Error(t, err) - assert.False(t, ts.Defined()) - }) - - t.Run("mismatched parent weight fails new tipset", func(t *testing.T) { - b1, b2, b3 = makeTestBlocks(t) - b1.ParentWeight = fbig.NewInt(3000) - ts, err := NewTipSet(b1, b2, b3) - assert.Error(t, err) - assert.False(t, ts.Defined()) - }) -} - -func makeTestBlocks(t *testing.T) (*BlockHeader, *BlockHeader, *BlockHeader) { - b1 := newBlock(t, []byte{2}, 1, cid1, parentWeight, 1, "1") - b2 := newBlock(t, []byte{3}, 1, cid1, parentWeight, 2, "2") - b3 := newBlock(t, []byte{1}, 1, cid1, parentWeight, 3, "3") - - // The tickets are constructed such that their digests are ordered. - require.True(t, b1.Ticket.Compare(&b2.Ticket) < 0) - require.True(t, b2.Ticket.Compare(&b3.Ticket) < 0) - return b1, b2, b3 -} diff --git a/pkg/types/internal/vrf.go b/pkg/types/internal/vrf.go deleted file mode 100644 index dc8dc2b45c..0000000000 --- a/pkg/types/internal/vrf.go +++ /dev/null @@ -1,223 +0,0 @@ -package internal - -import ( - "github.com/filecoin-project/go-state-types/abi" - "math/big" - - "github.com/minio/blake2b-simd" - - "github.com/filecoin-project/venus/pkg/constants" -) - -// VRFPi is the proof output from running a VRF. -type VRFPi []byte - -// Digest returns the digest (hash) of a proof, for use generating challenges etc. -func (p VRFPi) Digest() [32]byte { - proofDigest := blake2b.Sum256(p) - return proofDigest -} - -type ElectionProof struct { - WinCount int64 - - // A proof output by running a VRF on the VRFProof of the parent ticket - VRFProof VRFPi -} - -const precision = 256 - -// Blocks (e) -var BlocksPerEpoch = uint64(constants.ExpectedLeadersPerEpoch) - -var blocksPerEpoch = big.NewInt(0).SetUint64(BlocksPerEpoch) - -var ( - expNumCoef []*big.Int - expDenoCoef []*big.Int -) - -func init() { - parse := func(coefs []string) []*big.Int { - out := make([]*big.Int, len(coefs)) - for i, coef := range coefs { - c, ok := new(big.Int).SetString(coef, 10) - if !ok { - panic("could not parse exp paramemter") - } - // << 256 (Q.0 to Q.256), >> 128 to transform integer params to coefficients - c = c.Lsh(c, precision-128) - out[i] = c - } - return out - } - - // parameters are in integer format, - // coefficients are *2^-128 of that - num := []string{ - "-648770010757830093818553637600", - "67469480939593786226847644286976", - "-3197587544499098424029388939001856", - "89244641121992890118377641805348864", - "-1579656163641440567800982336819953664", - "17685496037279256458459817590917169152", - "-115682590513835356866803355398940131328", - "340282366920938463463374607431768211456", - } - expNumCoef = parse(num) - - deno := []string{ - "1225524182432722209606361", - "114095592300906098243859450", - "5665570424063336070530214243", - "194450132448609991765137938448", - "5068267641632683791026134915072", - "104716890604972796896895427629056", - "1748338658439454459487681798864896", - "23704654329841312470660182937960448", - "259380097567996910282699886670381056", - "2250336698853390384720606936038375424", - "14978272436876548034486263159246028800", - "72144088983913131323343765784380833792", - "224599776407103106596571252037123047424", - "340282366920938463463374607431768211456", - } - expDenoCoef = parse(deno) -} - -// expneg accepts x in Q.256 format and computes e^-x. -// It is most precise within [0, 1.725) range, where error is less than 3.4e-30. -// Over the [0, 5) range its error is less than 4.6e-15. -// Output is in Q.256 format. -func expneg(x *big.Int) *big.Int { - // exp is approximated by rational function - // polynomials of the rational function are evaluated using Horner's method - num := polyval(expNumCoef, x) // Q.256 - deno := polyval(expDenoCoef, x) // Q.256 - - num = num.Lsh(num, precision) // Q.512 - return num.Div(num, deno) // Q.512 / Q.256 => Q.256 -} - -// polyval evaluates a polynomial given by coefficients `p` in Q.256 format -// at point `x` in Q.256 format. Output is in Q.256. -// Coefficients should be ordered from the highest order coefficient to the lowest. -func polyval(p []*big.Int, x *big.Int) *big.Int { - // evaluation using Horner's method - res := new(big.Int).Set(p[0]) // Q.256 - tmp := new(big.Int) // big.Int.Mul doesn't like when input is reused as output - for _, c := range p[1:] { - tmp = tmp.Mul(res, x) // Q.256 * Q.256 => Q.512 - res = res.Rsh(tmp, precision) // Q.512 >> 256 => Q.256 - res = res.Add(res, c) - } - - return res -} - -// computes lambda in Q.256 -func lambda(power, totalPower *big.Int) *big.Int { - lam := new(big.Int).Mul(power, blocksPerEpoch) // Q.0 - lam = lam.Lsh(lam, precision) // Q.256 - lam = lam.Div(lam /* Q.256 */, totalPower /* Q.0 */) // Q.256 - return lam -} - -var MaxWinCount = 3 * int64(BlocksPerEpoch) - -type poiss struct { - lam *big.Int - pmf *big.Int - icdf *big.Int - - tmp *big.Int // temporary variable for optimization - - k uint64 -} - -// newPoiss starts poisson inverted CDF -// lambda is in Q.256 format -// returns (instance, `1-poisscdf(0, lambda)`) -// CDF value returend is reused when calling `next` -func newPoiss(lambda *big.Int) (*poiss, *big.Int) { - - // pmf(k) = (lambda^k)*(e^lambda) / k! - // k = 0 here, so it simplifies to just e^-lambda - elam := expneg(lambda) // Q.256 - pmf := new(big.Int).Set(elam) - - // icdf(k) = 1 - ∑ᵏᵢ₌₀ pmf(i) - // icdf(0) = 1 - pmf(0) - icdf := big.NewInt(1) - icdf = icdf.Lsh(icdf, precision) // Q.256 - icdf = icdf.Sub(icdf, pmf) // Q.256 - - k := uint64(0) - - p := &poiss{ - lam: lambda, - pmf: pmf, - - tmp: elam, - icdf: icdf, - - k: k, - } - - return p, icdf -} - -// next computes `k++, 1-poisscdf(k, lam)` -// return is in Q.256 format -func (p *poiss) next() *big.Int { - // incrementally compute next pmf and icdf - - // pmf(k) = (lambda^k)*(e^lambda) / k! - // so pmf(k) = pmf(k-1) * lambda / k - p.k++ - p.tmp.SetUint64(p.k) // Q.0 - - // calculate pmf for k - p.pmf = p.pmf.Div(p.pmf, p.tmp) // Q.256 / Q.0 => Q.256 - // we are using `tmp` as target for multiplication as using an input as output - // for Int.Mul causes allocations - p.tmp = p.tmp.Mul(p.pmf, p.lam) // Q.256 * Q.256 => Q.512 - p.pmf = p.pmf.Rsh(p.tmp, precision) // Q.512 >> 256 => Q.256 - - // calculate output - // icdf(k) = icdf(k-1) - pmf(k) - p.icdf = p.icdf.Sub(p.icdf, p.pmf) // Q.256 - return p.icdf -} - -// ComputeWinCount uses VRFProof to compute number of wins -// The algorithm is based on Algorand's Sortition with Binomial distribution -// replaced by Poisson distribution. -func (ep *ElectionProof) ComputeWinCount(power abi.StoragePower, totalPower abi.StoragePower) int64 { - h := blake2b.Sum256(ep.VRFProof) - - lhs := big.NewInt(0).SetBytes(h[:]) // 256bits, assume Q.256 so [0, 1) - - // We are calculating upside-down CDF of Poisson distribution with - // rate λ=power*E/totalPower - // Steps: - // 1. calculate λ=power*E/totalPower - // 2. calculate elam = exp(-λ) - // 3. Check how many times we win: - // j = 0 - // pmf = elam - // rhs = 1 - pmf - // for h(vrf) < rhs: j++; pmf = pmf * lam / j; rhs = rhs - pmf - - lam := lambda(power.Int, totalPower.Int) // Q.256 - - p, rhs := newPoiss(lam) - - var j int64 - for lhs.Cmp(rhs) < 0 && j < MaxWinCount { - rhs = p.next() - j++ - } - - return j -} diff --git a/pkg/types/keystore.go b/pkg/types/keystore.go deleted file mode 100644 index 181a7513f3..0000000000 --- a/pkg/types/keystore.go +++ /dev/null @@ -1,58 +0,0 @@ -package types - -import ( - "encoding/json" - "fmt" - - logging "github.com/ipfs/go-log/v2" - - "github.com/filecoin-project/venus/pkg/crypto" -) - -var log = logging.Logger("types") - -var ( - ErrKeyInfoNotFound = fmt.Errorf("key info not found") - ErrKeyExists = fmt.Errorf("key already exists") -) - -// KeyType defines a type of a key -type KeyType string - -func (kt *KeyType) UnmarshalJSON(bb []byte) error { - { - // first option, try unmarshaling as string - var s string - err := json.Unmarshal(bb, &s) - if err == nil { - *kt = KeyType(s) - return nil - } - } - - { - var b byte - err := json.Unmarshal(bb, &b) - if err != nil { - return fmt.Errorf("could not unmarshal KeyType either as string nor integer: %w", err) - } - bst := crypto.SigType(b) - - switch bst { - case crypto.SigTypeBLS: - *kt = KTBLS - case crypto.SigTypeSecp256k1: - *kt = KTSecp256k1 - default: - return fmt.Errorf("unknown sigtype: %d", bst) - } - log.Warnf("deprecation: integer style 'KeyType' is deprecated, switch to string style") - return nil - } -} - -const ( - KTBLS KeyType = "bls" - KTSecp256k1 KeyType = "secp256k1" - KTSecp256k1Ledger KeyType = "secp256k1-ledger" -) diff --git a/pkg/types/paych.go b/pkg/types/paych.go deleted file mode 100644 index 39b49383ee..0000000000 --- a/pkg/types/paych.go +++ /dev/null @@ -1,42 +0,0 @@ -package types - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/ipfs/go-cid" - "time" -) - -type PaychStatus struct { - ControlAddr address.Address - Direction PCHDir -} -type PCHDir int - -const ( - PCHUndef PCHDir = iota - PCHInbound - PCHOutbound -) - -type InvocResult struct { - MsgCid cid.Cid - Msg *internal.UnsignedMessage - MsgRct *internal.MessageReceipt - GasCost *MsgGasCost - ExecutionTrace *ExecutionTrace - Error string - Duration time.Duration -} - -type MsgGasCost struct { - Message cid.Cid // Can be different than requested, in case it was replaced, but only gas values changed - GasUsed abi.TokenAmount - BaseFeeBurn abi.TokenAmount - OverEstimationBurn abi.TokenAmount - MinerPenalty abi.TokenAmount - MinerTip abi.TokenAmount - Refund abi.TokenAmount - TotalCost abi.TokenAmount -} diff --git a/pkg/types/specactors/adt/adt.go b/pkg/types/specactors/adt/adt.go deleted file mode 100644 index 084471bb8f..0000000000 --- a/pkg/types/specactors/adt/adt.go +++ /dev/null @@ -1,29 +0,0 @@ -package adt - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/cbor" -) - -type Map interface { - Root() (cid.Cid, error) - - Put(k abi.Keyer, v cbor.Marshaler) error - Get(k abi.Keyer, v cbor.Unmarshaler) (bool, error) - Delete(k abi.Keyer) error - - ForEach(v cbor.Unmarshaler, fn func(key string) error) error -} - -type Array interface { - Root() (cid.Cid, error) - - Set(idx uint64, v cbor.Marshaler) error - Get(idx uint64, v cbor.Unmarshaler) (bool, error) - Delete(idx uint64) error - Length() uint64 - - ForEach(v cbor.Unmarshaler, fn func(idx int64) error) error -} diff --git a/pkg/types/specactors/adt/diff_adt.go b/pkg/types/specactors/adt/diff_adt.go deleted file mode 100644 index 76a881a95e..0000000000 --- a/pkg/types/specactors/adt/diff_adt.go +++ /dev/null @@ -1,122 +0,0 @@ -package adt - -import ( - "bytes" - - "github.com/filecoin-project/go-state-types/abi" - typegen "github.com/whyrusleeping/cbor-gen" -) - -// AdtArrayDiff generalizes adt.Array diffing by accepting a Deferred type that can unmarshalled to its corresponding struct -// in an interface implantation. -// Add should be called when a new k,v is added to the array -// Modify should be called when a value is modified in the array -// Remove should be called when a value is removed from the array -type AdtArrayDiff interface { //nolint - Add(key uint64, val *typegen.Deferred) error - Modify(key uint64, from, to *typegen.Deferred) error - Remove(key uint64, val *typegen.Deferred) error -} - -// TODO Performance can be improved by diffing the underlying IPLD graph, e.g. https://github.com/ipfs/go-merkledag/blob/749fd8717d46b4f34c9ce08253070079c89bc56d/dagutils/diff.go#L104 -// CBOR Marshaling will likely be the largest performance bottleneck here. - -// DiffAdtArray accepts two *adt.Array's and an AdtArrayDiff implementation. It does the following: -// - All values that exist in preArr and not in curArr are passed to AdtArrayDiff.Remove() -// - All values that exist in curArr nnd not in prevArr are passed to adtArrayDiff.Add() -// - All values that exist in preArr and in curArr are passed to AdtArrayDiff.Modify() -// - It is the responsibility of AdtArrayDiff.Modify() to determine if the values it was passed have been modified. -func DiffAdtArray(preArr, curArr Array, out AdtArrayDiff) error { - notNew := make(map[int64]struct{}, curArr.Length()) - prevVal := new(typegen.Deferred) - if err := preArr.ForEach(prevVal, func(i int64) error { - curVal := new(typegen.Deferred) - found, err := curArr.Get(uint64(i), curVal) - if err != nil { - return err - } - if !found { - if err := out.Remove(uint64(i), prevVal); err != nil { - return err - } - return nil - } - - // no modification - if !bytes.Equal(prevVal.Raw, curVal.Raw) { - if err := out.Modify(uint64(i), prevVal, curVal); err != nil { - return err - } - } - notNew[i] = struct{}{} - return nil - }); err != nil { - return err - } - - curVal := new(typegen.Deferred) - return curArr.ForEach(curVal, func(i int64) error { - if _, ok := notNew[i]; ok { - return nil - } - return out.Add(uint64(i), curVal) - }) -} - -// TODO Performance can be improved by diffing the underlying IPLD graph, e.g. https://github.com/ipfs/go-merkledag/blob/749fd8717d46b4f34c9ce08253070079c89bc56d/dagutils/diff.go#L104 -// CBOR Marshaling will likely be the largest performance bottleneck here. - -// AdtMapDiff generalizes adt.Map diffing by accepting a Deferred type that can unmarshalled to its corresponding struct -// in an interface implantation. -// AsKey should return the Keyer implementation specific to the map -// Add should be called when a new k,v is added to the map -// Modify should be called when a value is modified in the map -// Remove should be called when a value is removed from the map -type AdtMapDiff interface { //nolint - AsKey(key string) (abi.Keyer, error) - Add(key string, val *typegen.Deferred) error - Modify(key string, from, to *typegen.Deferred) error - Remove(key string, val *typegen.Deferred) error -} - -func DiffAdtMap(preMap, curMap Map, out AdtMapDiff) error { - notNew := make(map[string]struct{}) - prevVal := new(typegen.Deferred) - if err := preMap.ForEach(prevVal, func(key string) error { - curVal := new(typegen.Deferred) - k, err := out.AsKey(key) - if err != nil { - return err - } - - found, err := curMap.Get(k, curVal) - if err != nil { - return err - } - if !found { - if err := out.Remove(key, prevVal); err != nil { - return err - } - return nil - } - - // no modification - if !bytes.Equal(prevVal.Raw, curVal.Raw) { - if err := out.Modify(key, prevVal, curVal); err != nil { - return err - } - } - notNew[key] = struct{}{} - return nil - }); err != nil { - return err - } - - curVal := new(typegen.Deferred) - return curMap.ForEach(curVal, func(key string) error { - if _, ok := notNew[key]; ok { - return nil - } - return out.Add(key, curVal) - }) -} diff --git a/pkg/types/specactors/adt/diff_adt_test.go b/pkg/types/specactors/adt/diff_adt_test.go deleted file mode 100644 index 09b2301dbd..0000000000 --- a/pkg/types/specactors/adt/diff_adt_test.go +++ /dev/null @@ -1,304 +0,0 @@ -package adt - -import ( - "bytes" - "context" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - cbornode "github.com/ipfs/go-ipld-cbor" - typegen "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/go-state-types/abi" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" - - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/filecoin-project/venus/pkg/util/blockstoreutil" -) - -func TestDiffAdtArray(t *testing.T) { - tf.UnitTest(t) - ctxstoreA := newContextStore() - ctxstoreB := newContextStore() - - arrA := adt2.MakeEmptyArray(ctxstoreA) - arrB := adt2.MakeEmptyArray(ctxstoreB) - - require.NoError(t, arrA.Set(0, builtin2.CBORBytes([]byte{0}))) // delete - - require.NoError(t, arrA.Set(1, builtin2.CBORBytes([]byte{0}))) // modify - require.NoError(t, arrB.Set(1, builtin2.CBORBytes([]byte{1}))) - - require.NoError(t, arrA.Set(2, builtin2.CBORBytes([]byte{1}))) // delete - - require.NoError(t, arrA.Set(3, builtin2.CBORBytes([]byte{0}))) // noop - require.NoError(t, arrB.Set(3, builtin2.CBORBytes([]byte{0}))) - - require.NoError(t, arrA.Set(4, builtin2.CBORBytes([]byte{0}))) // modify - require.NoError(t, arrB.Set(4, builtin2.CBORBytes([]byte{6}))) - - require.NoError(t, arrB.Set(5, builtin2.CBORBytes{8})) // add - require.NoError(t, arrB.Set(6, builtin2.CBORBytes{9})) // add - - changes := new(TestDiffArray) - - assert.NoError(t, DiffAdtArray(arrA, arrB, changes)) - assert.NotNil(t, changes) - - assert.Equal(t, 2, len(changes.Added)) - // keys 5 and 6 were added - assert.EqualValues(t, uint64(5), changes.Added[0].key) - assert.EqualValues(t, []byte{8}, changes.Added[0].val) - assert.EqualValues(t, uint64(6), changes.Added[1].key) - assert.EqualValues(t, []byte{9}, changes.Added[1].val) - - assert.Equal(t, 2, len(changes.Modified)) - // keys 1 and 4 were modified - assert.EqualValues(t, uint64(1), changes.Modified[0].From.key) - assert.EqualValues(t, []byte{0}, changes.Modified[0].From.val) - assert.EqualValues(t, uint64(1), changes.Modified[0].To.key) - assert.EqualValues(t, []byte{1}, changes.Modified[0].To.val) - assert.EqualValues(t, uint64(4), changes.Modified[1].From.key) - assert.EqualValues(t, []byte{0}, changes.Modified[1].From.val) - assert.EqualValues(t, uint64(4), changes.Modified[1].To.key) - assert.EqualValues(t, []byte{6}, changes.Modified[1].To.val) - - assert.Equal(t, 2, len(changes.Removed)) - // keys 0 and 2 were deleted - assert.EqualValues(t, uint64(0), changes.Removed[0].key) - assert.EqualValues(t, []byte{0}, changes.Removed[0].val) - assert.EqualValues(t, uint64(2), changes.Removed[1].key) - assert.EqualValues(t, []byte{1}, changes.Removed[1].val) -} - -func TestDiffAdtMap(t *testing.T) { - tf.UnitTest(t) - ctxstoreA := newContextStore() - ctxstoreB := newContextStore() - - mapA := adt2.MakeEmptyMap(ctxstoreA) - mapB := adt2.MakeEmptyMap(ctxstoreB) - - require.NoError(t, mapA.Put(abi.UIntKey(0), builtin2.CBORBytes([]byte{0}))) // delete - - require.NoError(t, mapA.Put(abi.UIntKey(1), builtin2.CBORBytes([]byte{0}))) // modify - require.NoError(t, mapB.Put(abi.UIntKey(1), builtin2.CBORBytes([]byte{1}))) - - require.NoError(t, mapA.Put(abi.UIntKey(2), builtin2.CBORBytes([]byte{1}))) // delete - - require.NoError(t, mapA.Put(abi.UIntKey(3), builtin2.CBORBytes([]byte{0}))) // noop - require.NoError(t, mapB.Put(abi.UIntKey(3), builtin2.CBORBytes([]byte{0}))) - - require.NoError(t, mapA.Put(abi.UIntKey(4), builtin2.CBORBytes([]byte{0}))) // modify - require.NoError(t, mapB.Put(abi.UIntKey(4), builtin2.CBORBytes([]byte{6}))) - - require.NoError(t, mapB.Put(abi.UIntKey(5), builtin2.CBORBytes{8})) // add - require.NoError(t, mapB.Put(abi.UIntKey(6), builtin2.CBORBytes{9})) // add - - changes := new(TestDiffMap) - - assert.NoError(t, DiffAdtMap(mapA, mapB, changes)) - assert.NotNil(t, changes) - - assert.Equal(t, 2, len(changes.Added)) - // keys 5 and 6 were added - assert.EqualValues(t, uint64(6), changes.Added[0].key) - assert.EqualValues(t, []byte{9}, changes.Added[0].val) - assert.EqualValues(t, uint64(5), changes.Added[1].key) - assert.EqualValues(t, []byte{8}, changes.Added[1].val) - - assert.Equal(t, 2, len(changes.Modified)) - // keys 1 and 4 were modified - assert.EqualValues(t, uint64(1), changes.Modified[0].From.key) - assert.EqualValues(t, []byte{0}, changes.Modified[0].From.val) - assert.EqualValues(t, uint64(1), changes.Modified[0].To.key) - assert.EqualValues(t, []byte{1}, changes.Modified[0].To.val) - assert.EqualValues(t, uint64(4), changes.Modified[1].From.key) - assert.EqualValues(t, []byte{0}, changes.Modified[1].From.val) - assert.EqualValues(t, uint64(4), changes.Modified[1].To.key) - assert.EqualValues(t, []byte{6}, changes.Modified[1].To.val) - - assert.Equal(t, 2, len(changes.Removed)) - // keys 0 and 2 were deleted - assert.EqualValues(t, uint64(0), changes.Removed[0].key) - assert.EqualValues(t, []byte{0}, changes.Removed[0].val) - assert.EqualValues(t, uint64(2), changes.Removed[1].key) - assert.EqualValues(t, []byte{1}, changes.Removed[1].val) - -} - -type TestDiffMap struct { - Added []adtMapDiffResult - Modified []TestAdtMapDiffModified - Removed []adtMapDiffResult -} - -var _ AdtMapDiff = &TestDiffMap{} - -func (t *TestDiffMap) AsKey(key string) (abi.Keyer, error) { - k, err := abi.ParseUIntKey(key) - if err != nil { - return nil, err - } - return abi.UIntKey(k), nil -} - -func (t *TestDiffMap) Add(key string, val *typegen.Deferred) error { - v := new(builtin2.CBORBytes) - err := v.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return err - } - k, err := abi.ParseUIntKey(key) - if err != nil { - return err - } - t.Added = append(t.Added, adtMapDiffResult{ - key: k, - val: *v, - }) - return nil -} - -func (t *TestDiffMap) Modify(key string, from, to *typegen.Deferred) error { - vFrom := new(builtin2.CBORBytes) - err := vFrom.UnmarshalCBOR(bytes.NewReader(from.Raw)) - if err != nil { - return err - } - - vTo := new(builtin2.CBORBytes) - err = vTo.UnmarshalCBOR(bytes.NewReader(to.Raw)) - if err != nil { - return err - } - - k, err := abi.ParseUIntKey(key) - if err != nil { - return err - } - - if !bytes.Equal(*vFrom, *vTo) { - t.Modified = append(t.Modified, TestAdtMapDiffModified{ - From: adtMapDiffResult{ - key: k, - val: *vFrom, - }, - To: adtMapDiffResult{ - key: k, - val: *vTo, - }, - }) - } - return nil -} - -func (t *TestDiffMap) Remove(key string, val *typegen.Deferred) error { - v := new(builtin2.CBORBytes) - err := v.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return err - } - k, err := abi.ParseUIntKey(key) - if err != nil { - return err - } - t.Removed = append(t.Removed, adtMapDiffResult{ - key: k, - val: *v, - }) - return nil -} - -type adtMapDiffResult struct { - key uint64 - val builtin2.CBORBytes -} - -type TestAdtMapDiffModified struct { - From adtMapDiffResult - To adtMapDiffResult -} - -type adtArrayDiffResult struct { - key uint64 - val builtin2.CBORBytes -} - -type TestDiffArray struct { - Added []adtArrayDiffResult - Modified []TestAdtArrayDiffModified - Removed []adtArrayDiffResult -} - -var _ AdtArrayDiff = &TestDiffArray{} - -type TestAdtArrayDiffModified struct { - From adtArrayDiffResult - To adtArrayDiffResult -} - -func (t *TestDiffArray) Add(key uint64, val *typegen.Deferred) error { - v := new(builtin2.CBORBytes) - err := v.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return err - } - t.Added = append(t.Added, adtArrayDiffResult{ - key: key, - val: *v, - }) - return nil -} - -func (t *TestDiffArray) Modify(key uint64, from, to *typegen.Deferred) error { - vFrom := new(builtin2.CBORBytes) - err := vFrom.UnmarshalCBOR(bytes.NewReader(from.Raw)) - if err != nil { - return err - } - - vTo := new(builtin2.CBORBytes) - err = vTo.UnmarshalCBOR(bytes.NewReader(to.Raw)) - if err != nil { - return err - } - - if !bytes.Equal(*vFrom, *vTo) { - t.Modified = append(t.Modified, TestAdtArrayDiffModified{ - From: adtArrayDiffResult{ - key: key, - val: *vFrom, - }, - To: adtArrayDiffResult{ - key: key, - val: *vTo, - }, - }) - } - return nil -} - -func (t *TestDiffArray) Remove(key uint64, val *typegen.Deferred) error { - v := new(builtin2.CBORBytes) - err := v.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return err - } - t.Removed = append(t.Removed, adtArrayDiffResult{ - key: key, - val: *v, - }) - return nil -} - -func newContextStore() Store { - ctx := context.Background() - bs := blockstoreutil.NewTemporarySync() - store := cbornode.NewCborStore(bs) - return WrapStore(ctx, store) -} diff --git a/pkg/types/specactors/adt/store.go b/pkg/types/specactors/adt/store.go deleted file mode 100644 index 8dd9841a15..0000000000 --- a/pkg/types/specactors/adt/store.go +++ /dev/null @@ -1,17 +0,0 @@ -package adt - -import ( - "context" - - adt "github.com/filecoin-project/specs-actors/actors/util/adt" - cbor "github.com/ipfs/go-ipld-cbor" -) - -type Store interface { - Context() context.Context - cbor.IpldStore -} - -func WrapStore(ctx context.Context, store cbor.IpldStore) Store { - return adt.WrapStore(ctx, store) -} diff --git a/pkg/types/specactors/aerrors/error.go b/pkg/types/specactors/aerrors/error.go deleted file mode 100644 index 12f802c8fc..0000000000 --- a/pkg/types/specactors/aerrors/error.go +++ /dev/null @@ -1,69 +0,0 @@ -package aerrors - -import ( - "fmt" - - "github.com/filecoin-project/go-state-types/exitcode" - "golang.org/x/xerrors" -) - -func IsFatal(err ActorError) bool { - return err != nil && err.IsFatal() -} -func RetCode(err ActorError) exitcode.ExitCode { - if err == nil { - return 0 - } - return err.RetCode() -} - -type internalActorError interface { - ActorError - FormatError(p xerrors.Printer) (next error) - Unwrap() error -} - -type ActorError interface { - error - IsFatal() bool - RetCode() exitcode.ExitCode -} - -type actorError struct { - fatal bool - retCode exitcode.ExitCode - - msg string - frame xerrors.Frame - err error -} - -func (e *actorError) IsFatal() bool { - return e.fatal -} - -func (e *actorError) RetCode() exitcode.ExitCode { - return e.retCode -} - -func (e *actorError) Error() string { - return fmt.Sprint(e) -} -func (e *actorError) Format(s fmt.State, v rune) { xerrors.FormatError(e, s, v) } -func (e *actorError) FormatError(p xerrors.Printer) (next error) { - p.Print(e.msg) - if e.fatal { - p.Print(" (FATAL)") - } else { - p.Printf(" (RetCode=%d)", e.retCode) - } - - e.frame.Format(p) - return e.err -} - -func (e *actorError) Unwrap() error { - return e.err -} - -var _ internalActorError = (*actorError)(nil) diff --git a/pkg/types/specactors/aerrors/error_test.go b/pkg/types/specactors/aerrors/error_test.go deleted file mode 100644 index 4fcca59834..0000000000 --- a/pkg/types/specactors/aerrors/error_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package aerrors_test - -import ( - "testing" - - "github.com/filecoin-project/go-state-types/exitcode" - "github.com/stretchr/testify/assert" - "golang.org/x/xerrors" - - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - . "github.com/filecoin-project/venus/pkg/types/specactors/aerrors" -) - -func TestFatalError(t *testing.T) { - tf.UnitTest(t) - e1 := xerrors.New("out of disk space") - e2 := xerrors.Errorf("could not put node: %w", e1) - e3 := xerrors.Errorf("could not save head: %w", e2) - ae := Escalate(e3, "failed to save the head") - aw1 := Wrap(ae, "saving head of new miner actor") - aw2 := Absorb(aw1, 1, "try to absorb fatal error") - aw3 := Wrap(aw2, "initializing actor") - aw4 := Wrap(aw3, "creating miner in storage market") - t.Logf("Verbose error: %+v", aw4) - t.Logf("Normal error: %v", aw4) - assert.True(t, IsFatal(aw4), "should be fatal") -} -func TestAbsorbeError(t *testing.T) { - tf.UnitTest(t) - e1 := xerrors.New("EOF") - e2 := xerrors.Errorf("could not decode: %w", e1) - ae := Absorb(e2, 35, "failed to decode CBOR") - aw1 := Wrap(ae, "saving head of new miner actor") - aw2 := Wrap(aw1, "initializing actor") - aw3 := Wrap(aw2, "creating miner in storage market") - t.Logf("Verbose error: %+v", aw3) - t.Logf("Normal error: %v", aw3) - assert.Equal(t, exitcode.ExitCode(35), RetCode(aw3)) -} diff --git a/pkg/types/specactors/aerrors/wrap.go b/pkg/types/specactors/aerrors/wrap.go deleted file mode 100644 index 0552829f91..0000000000 --- a/pkg/types/specactors/aerrors/wrap.go +++ /dev/null @@ -1,203 +0,0 @@ -package aerrors - -import ( - "errors" - "fmt" - - "github.com/filecoin-project/go-state-types/exitcode" - cbor "github.com/ipfs/go-ipld-cbor" - "golang.org/x/xerrors" -) - -// New creates a new non-fatal error -func New(retCode exitcode.ExitCode, message string) ActorError { - if retCode == 0 { - return &actorError{ - fatal: true, - retCode: 0, - - msg: "tried creating an error and setting RetCode to 0", - frame: xerrors.Caller(1), - err: errors.New(message), - } - } - return &actorError{ - retCode: retCode, - - msg: message, - frame: xerrors.Caller(1), - } -} - -// Newf creates a new non-fatal error -func Newf(retCode exitcode.ExitCode, format string, args ...interface{}) ActorError { - if retCode == 0 { - return &actorError{ - fatal: true, - retCode: 0, - - msg: "tried creating an error and setting RetCode to 0", - frame: xerrors.Caller(1), - err: fmt.Errorf(format, args...), - } - } - return &actorError{ - retCode: retCode, - - msg: fmt.Sprintf(format, args...), - frame: xerrors.Caller(1), - } -} - -// todo: bit hacky - -func NewfSkip(skip int, retCode exitcode.ExitCode, format string, args ...interface{}) ActorError { - if retCode == 0 { - return &actorError{ - fatal: true, - retCode: 0, - - msg: "tried creating an error and setting RetCode to 0", - frame: xerrors.Caller(skip), - err: fmt.Errorf(format, args...), - } - } - return &actorError{ - retCode: retCode, - - msg: fmt.Sprintf(format, args...), - frame: xerrors.Caller(skip), - } -} - -func Fatal(message string, args ...interface{}) ActorError { - return &actorError{ - fatal: true, - msg: message, - frame: xerrors.Caller(1), - } -} - -func Fatalf(format string, args ...interface{}) ActorError { - return &actorError{ - fatal: true, - msg: fmt.Sprintf(format, args...), - frame: xerrors.Caller(1), - } -} - -// Wrap extens chain of errors with a message -func Wrap(err ActorError, message string) ActorError { - if err == nil { - return nil - } - return &actorError{ - fatal: IsFatal(err), - retCode: RetCode(err), - - msg: message, - frame: xerrors.Caller(1), - err: err, - } -} - -// Wrapf extens chain of errors with a message -func Wrapf(err ActorError, format string, args ...interface{}) ActorError { - if err == nil { - return nil - } - return &actorError{ - fatal: IsFatal(err), - retCode: RetCode(err), - - msg: fmt.Sprintf(format, args...), - frame: xerrors.Caller(1), - err: err, - } -} - -// Absorb takes and error and makes in not fatal ActorError -func Absorb(err error, retCode exitcode.ExitCode, msg string) ActorError { - if err == nil { - return nil - } - if aerr, ok := err.(ActorError); ok && IsFatal(aerr) { - return &actorError{ - fatal: true, - retCode: 0, - - msg: "tried absorbing an error that is already a fatal error", - frame: xerrors.Caller(1), - err: err, - } - } - if retCode == 0 { - return &actorError{ - fatal: true, - retCode: 0, - - msg: "tried absorbing an error and setting RetCode to 0", - frame: xerrors.Caller(1), - err: err, - } - } - - return &actorError{ - fatal: false, - retCode: retCode, - - msg: msg, - frame: xerrors.Caller(1), - err: err, - } -} - -// Escalate takes and error and escalates it into a fatal error -func Escalate(err error, msg string) ActorError { - if err == nil { - return nil - } - return &actorError{ - fatal: true, - - msg: msg, - frame: xerrors.Caller(1), - err: err, - } -} - -func HandleExternalError(err error, msg string) ActorError { - if err == nil { - return nil - } - - if aerr, ok := err.(ActorError); ok { - return &actorError{ - fatal: IsFatal(aerr), - retCode: RetCode(aerr), - - msg: msg, - frame: xerrors.Caller(1), - err: aerr, - } - } - - if xerrors.Is(err, &cbor.SerializationError{}) { - return &actorError{ - fatal: false, - retCode: 253, - msg: msg, - frame: xerrors.Caller(1), - err: err, - } - } - - return &actorError{ - fatal: false, - retCode: 219, - - msg: msg, - frame: xerrors.Caller(1), - err: err, - } -} diff --git a/pkg/types/specactors/agen/main.go b/pkg/types/specactors/agen/main.go deleted file mode 100644 index fc553a19f9..0000000000 --- a/pkg/types/specactors/agen/main.go +++ /dev/null @@ -1,223 +0,0 @@ -package main - -import ( - "bytes" - "fmt" - "github.com/filecoin-project/venus/pkg/types/specactors" - "io/ioutil" - "os" - "path/filepath" - "strconv" - "text/template" - - "golang.org/x/xerrors" -) - -var actors = map[string][]int{ - "account": specactors.Versions, - "cron": specactors.Versions, - "init": specactors.Versions, - "market": specactors.Versions, - "miner": specactors.Versions, - "multisig": specactors.Versions, - "paych": specactors.Versions, - "power": specactors.Versions, - "system": specactors.Versions, - "reward": specactors.Versions, - "verifreg": specactors.Versions, -} - -func main() { - if err := generateAdapters(); err != nil { - fmt.Println(err) - return - } - - if err := generatePolicy("pkg/types/specactors/policy/policy.go"); err != nil { - fmt.Println(err) - return - } - - if err := generateBuiltin("pkg/types/specactors/builtin/builtin.go"); err != nil { - fmt.Println(err) - return - } -} - -func generateAdapters() error { - for act, versions := range actors { - actDir := filepath.Join("pkg/types/specactors/builtin", act) - - if err := generateState(actDir); err != nil { - return err - } - - if err := generateMessages(actDir); err != nil { - return err - } - - { - af, err := ioutil.ReadFile(filepath.Join(actDir, "actor.go.template")) - if err != nil { - return xerrors.Errorf("loading actor template: %w", err) - } - - tpl := template.Must(template.New("").Funcs(template.FuncMap{ - "import": func(v int) string { return getVersionImports()[v] }, - }).Parse(string(af))) - - var b bytes.Buffer - - err = tpl.Execute(&b, map[string]interface{}{ - "versions": versions, - "latestVersion": specactors.LatestVersion, - }) - if err != nil { - return err - } - - if err := ioutil.WriteFile(filepath.Join(actDir, fmt.Sprintf("%s.go", act)), b.Bytes(), 0666); err != nil { - return err - } - } - } - - return nil -} - -func generateState(actDir string) error { - af, err := ioutil.ReadFile(filepath.Join(actDir, "state.go.template")) - if err != nil { - if os.IsNotExist(err) { - return nil // skip - } - - return xerrors.Errorf("loading state adapter template: %w", err) - } - - for _, version := range specactors.Versions { - tpl := template.Must(template.New("").Funcs(template.FuncMap{}).Parse(string(af))) - - var b bytes.Buffer - - err := tpl.Execute(&b, map[string]interface{}{ - "v": version, - "import": getVersionImports()[version], - }) - if err != nil { - return err - } - - if err := ioutil.WriteFile(filepath.Join(actDir, fmt.Sprintf("v%d.go", version)), b.Bytes(), 0666); err != nil { - return err - } - } - - return nil -} - -func generateMessages(actDir string) error { - af, err := ioutil.ReadFile(filepath.Join(actDir, "message.go.template")) - if err != nil { - if os.IsNotExist(err) { - return nil // skip - } - - return xerrors.Errorf("loading message adapter template: %w", err) - } - - for _, version := range specactors.Versions { - tpl := template.Must(template.New("").Funcs(template.FuncMap{}).Parse(string(af))) - - var b bytes.Buffer - - err := tpl.Execute(&b, map[string]interface{}{ - "v": version, - "import": getVersionImports()[version], - }) - if err != nil { - return err - } - - if err := ioutil.WriteFile(filepath.Join(actDir, fmt.Sprintf("message%d.go", version)), b.Bytes(), 0666); err != nil { - return err - } - } - - return nil -} - -func generatePolicy(policyPath string) error { - - pf, err := ioutil.ReadFile(policyPath + ".template") - if err != nil { - if os.IsNotExist(err) { - return nil // skip - } - - return xerrors.Errorf("loading policy template file: %w", err) - } - - tpl := template.Must(template.New("").Funcs(template.FuncMap{ - "import": func(v int) string { return getVersionImports()[v] }, - }).Parse(string(pf))) - var b bytes.Buffer - - err = tpl.Execute(&b, map[string]interface{}{ - "versions": specactors.Versions, - "latestVersion": specactors.LatestVersion, - }) - if err != nil { - return err - } - - if err := ioutil.WriteFile(policyPath, b.Bytes(), 0666); err != nil { - return err - } - - return nil -} - -func generateBuiltin(builtinPath string) error { - - bf, err := ioutil.ReadFile(builtinPath + ".template") - if err != nil { - if os.IsNotExist(err) { - return nil // skip - } - - return xerrors.Errorf("loading builtin template file: %w", err) - } - - tpl := template.Must(template.New("").Funcs(template.FuncMap{ - "import": func(v int) string { return getVersionImports()[v] }, - }).Parse(string(bf))) - var b bytes.Buffer - - err = tpl.Execute(&b, map[string]interface{}{ - "versions": specactors.Versions, - "latestVersion": specactors.LatestVersion, - }) - if err != nil { - return err - } - - if err := ioutil.WriteFile(builtinPath, b.Bytes(), 0666); err != nil { - return err - } - - return nil -} - -func getVersionImports() map[int]string { - versionImports := make(map[int]string, specactors.LatestVersion) - for _, v := range specactors.Versions { - if v == 0 { - versionImports[v] = "/" - } else { - versionImports[v] = "/v" + strconv.Itoa(v) + "/" - } - } - - return versionImports -} diff --git a/pkg/types/specactors/builtin/README.md b/pkg/types/specactors/builtin/README.md deleted file mode 100644 index 21b3fd38f1..0000000000 --- a/pkg/types/specactors/builtin/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Actors - -This package contains shims for abstracting over different actor versions. - -## Design - -Shims in this package follow a few common design principles. - -### Structure Agnostic - -Shims interfaces defined in this package should (ideally) not change even if the -structure of the underlying data changes. For example: - -* All shims store an internal "store" object. That way, state can be moved into - a separate object without needing to add a store to the function signature. -* All functions must return an error, even if unused for now. - -### Minimal - -These interfaces should be expanded only as necessary to reduce maintenance burden. - -### Queries, not field assessors. - -When possible, functions should query the state instead of simply acting as -field assessors. These queries are more likely to remain stable across -specs-actor upgrades than specific state fields. - -Note: there is a trade-off here. Avoid implementing _complicated_ query logic -inside these shims, as it will need to be replicated in every shim. diff --git a/pkg/types/specactors/builtin/account/account.go b/pkg/types/specactors/builtin/account/account.go deleted file mode 100644 index fe24a8aa5c..0000000000 --- a/pkg/types/specactors/builtin/account/account.go +++ /dev/null @@ -1,155 +0,0 @@ -// FETCHED FROM LOTUS: builtin/account/actor.go.template - -package account - -import ( - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/cbor" - "github.com/ipfs/go-cid" - - types "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" -) - -func init() { - - builtin.RegisterActorState(builtin0.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - - builtin.RegisterActorState(builtin2.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - - builtin.RegisterActorState(builtin3.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - - builtin.RegisterActorState(builtin4.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - - builtin.RegisterActorState(builtin5.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - - builtin.RegisterActorState(builtin6.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - - builtin.RegisterActorState(builtin7.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) -} - -var Methods = builtin4.MethodsAccount - -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { - - case builtin0.AccountActorCodeID: - return load0(store, act.Head) - - case builtin2.AccountActorCodeID: - return load2(store, act.Head) - - case builtin3.AccountActorCodeID: - return load3(store, act.Head) - - case builtin4.AccountActorCodeID: - return load4(store, act.Head) - - case builtin5.AccountActorCodeID: - return load5(store, act.Head) - - case builtin6.AccountActorCodeID: - return load6(store, act.Head) - - case builtin7.AccountActorCodeID: - return load7(store, act.Head) - - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, error) { - switch av { - - case actors.Version0: - return make0(store, addr) - - case actors.Version2: - return make2(store, addr) - - case actors.Version3: - return make3(store, addr) - - case actors.Version4: - return make4(store, addr) - - case actors.Version5: - return make5(store, addr) - - case actors.Version6: - return make6(store, addr) - - case actors.Version7: - return make7(store, addr) - - } - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { - - case actors.Version0: - return builtin0.AccountActorCodeID, nil - - case actors.Version2: - return builtin2.AccountActorCodeID, nil - - case actors.Version3: - return builtin3.AccountActorCodeID, nil - - case actors.Version4: - return builtin4.AccountActorCodeID, nil - - case actors.Version5: - return builtin5.AccountActorCodeID, nil - - case actors.Version6: - return builtin6.AccountActorCodeID, nil - - case actors.Version7: - return builtin7.AccountActorCodeID, nil - - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - cbor.Marshaler - - PubkeyAddress() (address.Address, error) - GetState() interface{} -} diff --git a/pkg/types/specactors/builtin/account/actor.go.template b/pkg/types/specactors/builtin/account/actor.go.template deleted file mode 100644 index 5797647df6..0000000000 --- a/pkg/types/specactors/builtin/account/actor.go.template +++ /dev/null @@ -1,66 +0,0 @@ -// FETCHED FROM LOTUS: builtin/account/actor.go.template - -package account - -import ( - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/cbor" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - types "github.com/filecoin-project/venus/pkg/types/internal" -{{range .versions}} - builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" -{{end}} -) - -func init() { -{{range .versions}} - builtin.RegisterActorState(builtin{{.}}.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) -{{end}}} - -var Methods = builtin4.MethodsAccount - -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { -{{range .versions}} - case builtin{{.}}.AccountActorCodeID: - return load{{.}}(store, act.Head) -{{end}} - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return make{{.}}(store, addr) -{{end}} -} - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return builtin{{.}}.AccountActorCodeID, nil -{{end}} - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - cbor.Marshaler - - PubkeyAddress() (address.Address, error) - GetState() interface{} -} diff --git a/pkg/types/specactors/builtin/account/state.go.template b/pkg/types/specactors/builtin/account/state.go.template deleted file mode 100644 index 24ccf80682..0000000000 --- a/pkg/types/specactors/builtin/account/state.go.template +++ /dev/null @@ -1,42 +0,0 @@ -// FETCHED FROM LOTUS: builtin/account/state.go.template - -package account - -import ( - "github.com/filecoin-project/go-address" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - account{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/account" -) - -var _ State = (*state{{.v}})(nil) - -func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { - out := state{{.v}}{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make{{.v}}(store adt.Store, addr address.Address) (State, error) { - out := state{{.v}}{store: store} - out.State = account{{.v}}.State{Address:addr} - return &out, nil -} - -type state{{.v}} struct { - account{{.v}}.State - store adt.Store -} - -func (s *state{{.v}}) PubkeyAddress() (address.Address, error) { - return s.Address, nil -} - -func (s *state{{.v}}) GetState() interface{} { - return &s.State -} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/account/v0.go b/pkg/types/specactors/builtin/account/v0.go deleted file mode 100644 index b5e760d805..0000000000 --- a/pkg/types/specactors/builtin/account/v0.go +++ /dev/null @@ -1,42 +0,0 @@ -// FETCHED FROM LOTUS: builtin/account/state.go.template - -package account - -import ( - "github.com/filecoin-project/go-address" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - account0 "github.com/filecoin-project/specs-actors/actors/builtin/account" -) - -var _ State = (*state0)(nil) - -func load0(store adt.Store, root cid.Cid) (State, error) { - out := state0{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make0(store adt.Store, addr address.Address) (State, error) { - out := state0{store: store} - out.State = account0.State{Address: addr} - return &out, nil -} - -type state0 struct { - account0.State - store adt.Store -} - -func (s *state0) PubkeyAddress() (address.Address, error) { - return s.Address, nil -} - -func (s *state0) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/account/v2.go b/pkg/types/specactors/builtin/account/v2.go deleted file mode 100644 index f3694d1662..0000000000 --- a/pkg/types/specactors/builtin/account/v2.go +++ /dev/null @@ -1,42 +0,0 @@ -// FETCHED FROM LOTUS: builtin/account/state.go.template - -package account - -import ( - "github.com/filecoin-project/go-address" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - account2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/account" -) - -var _ State = (*state2)(nil) - -func load2(store adt.Store, root cid.Cid) (State, error) { - out := state2{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make2(store adt.Store, addr address.Address) (State, error) { - out := state2{store: store} - out.State = account2.State{Address: addr} - return &out, nil -} - -type state2 struct { - account2.State - store adt.Store -} - -func (s *state2) PubkeyAddress() (address.Address, error) { - return s.Address, nil -} - -func (s *state2) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/account/v3.go b/pkg/types/specactors/builtin/account/v3.go deleted file mode 100644 index c30dcc85f7..0000000000 --- a/pkg/types/specactors/builtin/account/v3.go +++ /dev/null @@ -1,42 +0,0 @@ -// FETCHED FROM LOTUS: builtin/account/state.go.template - -package account - -import ( - "github.com/filecoin-project/go-address" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - account3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/account" -) - -var _ State = (*state3)(nil) - -func load3(store adt.Store, root cid.Cid) (State, error) { - out := state3{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make3(store adt.Store, addr address.Address) (State, error) { - out := state3{store: store} - out.State = account3.State{Address: addr} - return &out, nil -} - -type state3 struct { - account3.State - store adt.Store -} - -func (s *state3) PubkeyAddress() (address.Address, error) { - return s.Address, nil -} - -func (s *state3) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/account/v4.go b/pkg/types/specactors/builtin/account/v4.go deleted file mode 100644 index 89767f5385..0000000000 --- a/pkg/types/specactors/builtin/account/v4.go +++ /dev/null @@ -1,42 +0,0 @@ -// FETCHED FROM LOTUS: builtin/account/state.go.template - -package account - -import ( - "github.com/filecoin-project/go-address" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - account4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/account" -) - -var _ State = (*state4)(nil) - -func load4(store adt.Store, root cid.Cid) (State, error) { - out := state4{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make4(store adt.Store, addr address.Address) (State, error) { - out := state4{store: store} - out.State = account4.State{Address: addr} - return &out, nil -} - -type state4 struct { - account4.State - store adt.Store -} - -func (s *state4) PubkeyAddress() (address.Address, error) { - return s.Address, nil -} - -func (s *state4) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/account/v5.go b/pkg/types/specactors/builtin/account/v5.go deleted file mode 100644 index 14f27dad43..0000000000 --- a/pkg/types/specactors/builtin/account/v5.go +++ /dev/null @@ -1,42 +0,0 @@ -// FETCHED FROM LOTUS: builtin/account/state.go.template - -package account - -import ( - "github.com/filecoin-project/go-address" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - account5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/account" -) - -var _ State = (*state5)(nil) - -func load5(store adt.Store, root cid.Cid) (State, error) { - out := state5{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make5(store adt.Store, addr address.Address) (State, error) { - out := state5{store: store} - out.State = account5.State{Address: addr} - return &out, nil -} - -type state5 struct { - account5.State - store adt.Store -} - -func (s *state5) PubkeyAddress() (address.Address, error) { - return s.Address, nil -} - -func (s *state5) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/account/v6.go b/pkg/types/specactors/builtin/account/v6.go deleted file mode 100644 index 0ff258cc53..0000000000 --- a/pkg/types/specactors/builtin/account/v6.go +++ /dev/null @@ -1,42 +0,0 @@ -// FETCHED FROM LOTUS: builtin/account/state.go.template - -package account - -import ( - "github.com/filecoin-project/go-address" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - account6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/account" -) - -var _ State = (*state6)(nil) - -func load6(store adt.Store, root cid.Cid) (State, error) { - out := state6{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make6(store adt.Store, addr address.Address) (State, error) { - out := state6{store: store} - out.State = account6.State{Address: addr} - return &out, nil -} - -type state6 struct { - account6.State - store adt.Store -} - -func (s *state6) PubkeyAddress() (address.Address, error) { - return s.Address, nil -} - -func (s *state6) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/account/v7.go b/pkg/types/specactors/builtin/account/v7.go deleted file mode 100644 index 667c8f0187..0000000000 --- a/pkg/types/specactors/builtin/account/v7.go +++ /dev/null @@ -1,42 +0,0 @@ -// FETCHED FROM LOTUS: builtin/account/state.go.template - -package account - -import ( - "github.com/filecoin-project/go-address" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - account7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/account" -) - -var _ State = (*state7)(nil) - -func load7(store adt.Store, root cid.Cid) (State, error) { - out := state7{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make7(store adt.Store, addr address.Address) (State, error) { - out := state7{store: store} - out.State = account7.State{Address: addr} - return &out, nil -} - -type state7 struct { - account7.State - store adt.Store -} - -func (s *state7) PubkeyAddress() (address.Address, error) { - return s.Address, nil -} - -func (s *state7) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/builtin.go b/pkg/types/specactors/builtin/builtin.go deleted file mode 100644 index fa0e49916b..0000000000 --- a/pkg/types/specactors/builtin/builtin.go +++ /dev/null @@ -1,361 +0,0 @@ -// FETCHED FROM LOTUS: builtin/builtin.go.template - -package builtin - -import ( - "github.com/filecoin-project/go-address" - "github.com/ipfs/go-cid" - "golang.org/x/xerrors" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - smoothing2 "github.com/filecoin-project/specs-actors/v2/actors/util/smoothing" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - smoothing3 "github.com/filecoin-project/specs-actors/v3/actors/util/smoothing" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - smoothing4 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - smoothing5 "github.com/filecoin-project/specs-actors/v5/actors/util/smoothing" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" - - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/cbor" - - types "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" - proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" -) - -var SystemActorAddr = builtin7.SystemActorAddr -var BurntFundsActorAddr = builtin7.BurntFundsActorAddr -var CronActorAddr = builtin7.CronActorAddr -var SaftAddress = makeAddress("t0122") -var ReserveAddress = makeAddress("t090") -var RootVerifierAddress = makeAddress("t080") - -var ( - ExpectedLeadersPerEpoch = builtin7.ExpectedLeadersPerEpoch -) - -const ( - EpochDurationSeconds = builtin7.EpochDurationSeconds - EpochsInDay = builtin7.EpochsInDay - SecondsInDay = builtin7.SecondsInDay -) - -const ( - MethodSend = builtin7.MethodSend - MethodConstructor = builtin7.MethodConstructor -) - -// These are all just type aliases across actor versions. In the future, that might change -// and we might need to do something fancier. -type SectorInfo = proof7.SectorInfo -type PoStProof = proof7.PoStProof -type FilterEstimate = smoothing0.FilterEstimate - -func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, verifiedWeight abi.DealWeight) abi.StoragePower { - return miner7.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) -} - -func FromV0FilterEstimate(v0 smoothing0.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v0) //nolint:unconvert - -} - -func FromV2FilterEstimate(v2 smoothing2.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v2) - -} - -func FromV3FilterEstimate(v3 smoothing3.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v3) - -} - -func FromV4FilterEstimate(v4 smoothing4.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v4) - -} - -func FromV5FilterEstimate(v5 smoothing5.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v5) - -} - -func FromV6FilterEstimate(v6 smoothing6.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v6) - -} - -func FromV7FilterEstimate(v7 smoothing7.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v7) - -} - -type ActorStateLoader func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) - -var ActorStateLoaders = make(map[cid.Cid]ActorStateLoader) - -func RegisterActorState(code cid.Cid, loader ActorStateLoader) { - ActorStateLoaders[code] = loader -} - -func Load(store adt.Store, act *types.Actor) (cbor.Marshaler, error) { - loader, found := ActorStateLoaders[act.Code] - if !found { - return nil, xerrors.Errorf("unknown actor code %s", act.Code) - } - return loader(store, act.Head) -} - -func ActorNameByCode(c cid.Cid) string { - switch { - - case builtin0.IsBuiltinActor(c): - return builtin0.ActorNameByCode(c) - - case builtin2.IsBuiltinActor(c): - return builtin2.ActorNameByCode(c) - - case builtin3.IsBuiltinActor(c): - return builtin3.ActorNameByCode(c) - - case builtin4.IsBuiltinActor(c): - return builtin4.ActorNameByCode(c) - - case builtin5.IsBuiltinActor(c): - return builtin5.ActorNameByCode(c) - - case builtin6.IsBuiltinActor(c): - return builtin6.ActorNameByCode(c) - - case builtin7.IsBuiltinActor(c): - return builtin7.ActorNameByCode(c) - - default: - return "" - } -} - -func IsBuiltinActor(c cid.Cid) bool { - - if builtin0.IsBuiltinActor(c) { - return true - } - - if builtin2.IsBuiltinActor(c) { - return true - } - - if builtin3.IsBuiltinActor(c) { - return true - } - - if builtin4.IsBuiltinActor(c) { - return true - } - - if builtin5.IsBuiltinActor(c) { - return true - } - - if builtin6.IsBuiltinActor(c) { - return true - } - - if builtin7.IsBuiltinActor(c) { - return true - } - - return false -} - -func IsAccountActor(c cid.Cid) bool { - - if c == builtin0.AccountActorCodeID { - return true - } - - if c == builtin2.AccountActorCodeID { - return true - } - - if c == builtin3.AccountActorCodeID { - return true - } - - if c == builtin4.AccountActorCodeID { - return true - } - - if c == builtin5.AccountActorCodeID { - return true - } - - if c == builtin6.AccountActorCodeID { - return true - } - - if c == builtin7.AccountActorCodeID { - return true - } - - return false -} - -func IsStorageMinerActor(c cid.Cid) bool { - - if c == builtin0.StorageMinerActorCodeID { - return true - } - - if c == builtin2.StorageMinerActorCodeID { - return true - } - - if c == builtin3.StorageMinerActorCodeID { - return true - } - - if c == builtin4.StorageMinerActorCodeID { - return true - } - - if c == builtin5.StorageMinerActorCodeID { - return true - } - - if c == builtin6.StorageMinerActorCodeID { - return true - } - - if c == builtin7.StorageMinerActorCodeID { - return true - } - - return false -} - -func IsMultisigActor(c cid.Cid) bool { - - if c == builtin0.MultisigActorCodeID { - return true - } - - if c == builtin2.MultisigActorCodeID { - return true - } - - if c == builtin3.MultisigActorCodeID { - return true - } - - if c == builtin4.MultisigActorCodeID { - return true - } - - if c == builtin5.MultisigActorCodeID { - return true - } - - if c == builtin6.MultisigActorCodeID { - return true - } - - if c == builtin7.MultisigActorCodeID { - return true - } - - return false -} - -func IsPaymentChannelActor(c cid.Cid) bool { - - if c == builtin0.PaymentChannelActorCodeID { - return true - } - - if c == builtin2.PaymentChannelActorCodeID { - return true - } - - if c == builtin3.PaymentChannelActorCodeID { - return true - } - - if c == builtin4.PaymentChannelActorCodeID { - return true - } - - if c == builtin5.PaymentChannelActorCodeID { - return true - } - - if c == builtin6.PaymentChannelActorCodeID { - return true - } - - if c == builtin7.PaymentChannelActorCodeID { - return true - } - - return false -} - -func IsInitActor(c cid.Cid) bool { - - if c == builtin0.InitActorCodeID { - return true - } - - if c == builtin2.InitActorCodeID { - return true - } - - if c == builtin3.InitActorCodeID { - return true - } - - if c == builtin4.InitActorCodeID { - return true - } - - if c == builtin5.InitActorCodeID { - return true - } - - if c == builtin6.InitActorCodeID { - return true - } - - return false -} - -func makeAddress(addr string) address.Address { - ret, err := address.NewFromString(addr) - if err != nil { - panic(err) - } - - return ret -} diff --git a/pkg/types/specactors/builtin/builtin.go.template b/pkg/types/specactors/builtin/builtin.go.template deleted file mode 100644 index 3a6eb5f890..0000000000 --- a/pkg/types/specactors/builtin/builtin.go.template +++ /dev/null @@ -1,146 +0,0 @@ -// FETCHED FROM LOTUS: builtin/builtin.go.template - -package builtin - -import ( - "github.com/filecoin-project/go-address" - "github.com/ipfs/go-cid" - "golang.org/x/xerrors" - - {{range .versions}} - builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" - smoothing{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/util/smoothing" - {{end}} - - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/cbor" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - types "github.com/filecoin-project/venus/pkg/types/internal" - - miner{{.latestVersion}} "github.com/filecoin-project/specs-actors{{import .latestVersion}}actors/builtin/miner" - proof{{.latestVersion}} "github.com/filecoin-project/specs-actors{{import .latestVersion}}actors/runtime/proof" -) - -var SystemActorAddr = builtin{{.latestVersion}}.SystemActorAddr -var BurntFundsActorAddr = builtin{{.latestVersion}}.BurntFundsActorAddr -var CronActorAddr = builtin{{.latestVersion}}.CronActorAddr -var SaftAddress = makeAddress("t0122") -var ReserveAddress = makeAddress("t090") -var RootVerifierAddress = makeAddress("t080") - -var ( - ExpectedLeadersPerEpoch = builtin{{.latestVersion}}.ExpectedLeadersPerEpoch -) - -const ( - EpochDurationSeconds = builtin{{.latestVersion}}.EpochDurationSeconds - EpochsInDay = builtin{{.latestVersion}}.EpochsInDay - SecondsInDay = builtin{{.latestVersion}}.SecondsInDay -) - -const ( - MethodSend = builtin{{.latestVersion}}.MethodSend - MethodConstructor = builtin{{.latestVersion}}.MethodConstructor -) - -// These are all just type aliases across actor versions. In the future, that might change -// and we might need to do something fancier. -type SectorInfo = proof{{.latestVersion}}.SectorInfo -type PoStProof = proof{{.latestVersion}}.PoStProof -type FilterEstimate = smoothing0.FilterEstimate - -func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, verifiedWeight abi.DealWeight) abi.StoragePower { - return miner{{.latestVersion}}.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) -} - -{{range .versions}} - func FromV{{.}}FilterEstimate(v{{.}} smoothing{{.}}.FilterEstimate) FilterEstimate { - {{if (eq . 0)}} - return (FilterEstimate)(v{{.}}) //nolint:unconvert - {{else}} - return (FilterEstimate)(v{{.}}) - {{end}} - } -{{end}} - -type ActorStateLoader func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) - -var ActorStateLoaders = make(map[cid.Cid]ActorStateLoader) - -func RegisterActorState(code cid.Cid, loader ActorStateLoader) { - ActorStateLoaders[code] = loader -} - -func Load(store adt.Store, act *types.Actor) (cbor.Marshaler, error) { - loader, found := ActorStateLoaders[act.Code] - if !found { - return nil, xerrors.Errorf("unknown actor code %s", act.Code) - } - return loader(store, act.Head) -} - -func ActorNameByCode(c cid.Cid) string { - switch { - {{range .versions}} - case builtin{{.}}.IsBuiltinActor(c): - return builtin{{.}}.ActorNameByCode(c) - {{end}} - default: - return "" - } -} - -func IsBuiltinActor(c cid.Cid) bool { - {{range .versions}} - if builtin{{.}}.IsBuiltinActor(c) { - return true - } - {{end}} - return false -} - -func IsAccountActor(c cid.Cid) bool { - {{range .versions}} - if c == builtin{{.}}.AccountActorCodeID { - return true - } - {{end}} - return false -} - -func IsStorageMinerActor(c cid.Cid) bool { - {{range .versions}} - if c == builtin{{.}}.StorageMinerActorCodeID { - return true - } - {{end}} - return false -} - -func IsMultisigActor(c cid.Cid) bool { - {{range .versions}} - if c == builtin{{.}}.MultisigActorCodeID { - return true - } - {{end}} - return false -} - -func IsPaymentChannelActor(c cid.Cid) bool { - {{range .versions}} - if c == builtin{{.}}.PaymentChannelActorCodeID { - return true - } - {{end}} - return false -} - -func makeAddress(addr string) address.Address { - ret, err := address.NewFromString(addr) - if err != nil { - panic(err) - } - - return ret -} diff --git a/pkg/types/specactors/builtin/cron/actor.go.template b/pkg/types/specactors/builtin/cron/actor.go.template deleted file mode 100644 index c8a8759821..0000000000 --- a/pkg/types/specactors/builtin/cron/actor.go.template +++ /dev/null @@ -1,44 +0,0 @@ -// FETCHED FROM LOTUS: builtin/cron/actor.go.template - -package cron - -import ( - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "golang.org/x/xerrors" - "github.com/ipfs/go-cid" -{{range .versions}} - builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" -{{end}} -) - -func MakeState(store adt.Store, av actors.Version) (State, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return make{{.}}(store) -{{end}} -} - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return builtin{{.}}.CronActorCodeID, nil -{{end}} - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -var ( - Address = builtin{{.latestVersion}}.CronActorAddr - Methods = builtin{{.latestVersion}}.MethodsCron -) - - -type State interface { - GetState() interface{} -} diff --git a/pkg/types/specactors/builtin/cron/cron.go b/pkg/types/specactors/builtin/cron/cron.go deleted file mode 100644 index 3f44ac994d..0000000000 --- a/pkg/types/specactors/builtin/cron/cron.go +++ /dev/null @@ -1,90 +0,0 @@ -// FETCHED FROM LOTUS: builtin/cron/actor.go.template - -package cron - -import ( - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/ipfs/go-cid" - "golang.org/x/xerrors" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" -) - -func MakeState(store adt.Store, av actors.Version) (State, error) { - switch av { - - case actors.Version0: - return make0(store) - - case actors.Version2: - return make2(store) - - case actors.Version3: - return make3(store) - - case actors.Version4: - return make4(store) - - case actors.Version5: - return make5(store) - - case actors.Version6: - return make6(store) - - case actors.Version7: - return make7(store) - - } - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { - - case actors.Version0: - return builtin0.CronActorCodeID, nil - - case actors.Version2: - return builtin2.CronActorCodeID, nil - - case actors.Version3: - return builtin3.CronActorCodeID, nil - - case actors.Version4: - return builtin4.CronActorCodeID, nil - - case actors.Version5: - return builtin5.CronActorCodeID, nil - - case actors.Version6: - return builtin6.CronActorCodeID, nil - - case actors.Version7: - return builtin7.CronActorCodeID, nil - - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -var ( - Address = builtin7.CronActorAddr - Methods = builtin7.MethodsCron -) - -type State interface { - GetState() interface{} -} diff --git a/pkg/types/specactors/builtin/cron/state.go.template b/pkg/types/specactors/builtin/cron/state.go.template deleted file mode 100644 index a06a777b27..0000000000 --- a/pkg/types/specactors/builtin/cron/state.go.template +++ /dev/null @@ -1,37 +0,0 @@ -// FETCHED FROM LOTUS: builtin/cron/state.go.template - -package cron - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - cron{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/cron" -) - -var _ State = (*state{{.v}})(nil) - -func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { - out := state{{.v}}{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make{{.v}}(store adt.Store) (State, error) { - out := state{{.v}}{store: store} - out.State = *cron{{.v}}.ConstructState(cron{{.v}}.BuiltInEntries()) - return &out, nil -} - -type state{{.v}} struct { - cron{{.v}}.State - store adt.Store -} - -func (s *state{{.v}}) GetState() interface{} { - return &s.State -} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/cron/v0.go b/pkg/types/specactors/builtin/cron/v0.go deleted file mode 100644 index 4b3cb07771..0000000000 --- a/pkg/types/specactors/builtin/cron/v0.go +++ /dev/null @@ -1,37 +0,0 @@ -// FETCHED FROM LOTUS: builtin/cron/state.go.template - -package cron - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - cron0 "github.com/filecoin-project/specs-actors/actors/builtin/cron" -) - -var _ State = (*state0)(nil) - -func load0(store adt.Store, root cid.Cid) (State, error) { - out := state0{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make0(store adt.Store) (State, error) { - out := state0{store: store} - out.State = *cron0.ConstructState(cron0.BuiltInEntries()) - return &out, nil -} - -type state0 struct { - cron0.State - store adt.Store -} - -func (s *state0) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/cron/v2.go b/pkg/types/specactors/builtin/cron/v2.go deleted file mode 100644 index db837da49a..0000000000 --- a/pkg/types/specactors/builtin/cron/v2.go +++ /dev/null @@ -1,37 +0,0 @@ -// FETCHED FROM LOTUS: builtin/cron/state.go.template - -package cron - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - cron2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/cron" -) - -var _ State = (*state2)(nil) - -func load2(store adt.Store, root cid.Cid) (State, error) { - out := state2{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make2(store adt.Store) (State, error) { - out := state2{store: store} - out.State = *cron2.ConstructState(cron2.BuiltInEntries()) - return &out, nil -} - -type state2 struct { - cron2.State - store adt.Store -} - -func (s *state2) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/cron/v3.go b/pkg/types/specactors/builtin/cron/v3.go deleted file mode 100644 index 28060e8e51..0000000000 --- a/pkg/types/specactors/builtin/cron/v3.go +++ /dev/null @@ -1,37 +0,0 @@ -// FETCHED FROM LOTUS: builtin/cron/state.go.template - -package cron - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - cron3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/cron" -) - -var _ State = (*state3)(nil) - -func load3(store adt.Store, root cid.Cid) (State, error) { - out := state3{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make3(store adt.Store) (State, error) { - out := state3{store: store} - out.State = *cron3.ConstructState(cron3.BuiltInEntries()) - return &out, nil -} - -type state3 struct { - cron3.State - store adt.Store -} - -func (s *state3) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/cron/v4.go b/pkg/types/specactors/builtin/cron/v4.go deleted file mode 100644 index 2d1eb49e48..0000000000 --- a/pkg/types/specactors/builtin/cron/v4.go +++ /dev/null @@ -1,37 +0,0 @@ -// FETCHED FROM LOTUS: builtin/cron/state.go.template - -package cron - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - cron4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/cron" -) - -var _ State = (*state4)(nil) - -func load4(store adt.Store, root cid.Cid) (State, error) { - out := state4{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make4(store adt.Store) (State, error) { - out := state4{store: store} - out.State = *cron4.ConstructState(cron4.BuiltInEntries()) - return &out, nil -} - -type state4 struct { - cron4.State - store adt.Store -} - -func (s *state4) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/cron/v5.go b/pkg/types/specactors/builtin/cron/v5.go deleted file mode 100644 index be519e6b51..0000000000 --- a/pkg/types/specactors/builtin/cron/v5.go +++ /dev/null @@ -1,37 +0,0 @@ -// FETCHED FROM LOTUS: builtin/cron/state.go.template - -package cron - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - cron5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/cron" -) - -var _ State = (*state5)(nil) - -func load5(store adt.Store, root cid.Cid) (State, error) { - out := state5{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make5(store adt.Store) (State, error) { - out := state5{store: store} - out.State = *cron5.ConstructState(cron5.BuiltInEntries()) - return &out, nil -} - -type state5 struct { - cron5.State - store adt.Store -} - -func (s *state5) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/cron/v6.go b/pkg/types/specactors/builtin/cron/v6.go deleted file mode 100644 index aafcc78b20..0000000000 --- a/pkg/types/specactors/builtin/cron/v6.go +++ /dev/null @@ -1,37 +0,0 @@ -// FETCHED FROM LOTUS: builtin/cron/state.go.template - -package cron - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - cron6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/cron" -) - -var _ State = (*state6)(nil) - -func load6(store adt.Store, root cid.Cid) (State, error) { - out := state6{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make6(store adt.Store) (State, error) { - out := state6{store: store} - out.State = *cron6.ConstructState(cron6.BuiltInEntries()) - return &out, nil -} - -type state6 struct { - cron6.State - store adt.Store -} - -func (s *state6) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/cron/v7.go b/pkg/types/specactors/builtin/cron/v7.go deleted file mode 100644 index 284ff62350..0000000000 --- a/pkg/types/specactors/builtin/cron/v7.go +++ /dev/null @@ -1,37 +0,0 @@ -// FETCHED FROM LOTUS: builtin/cron/state.go.template - -package cron - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - cron7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/cron" -) - -var _ State = (*state7)(nil) - -func load7(store adt.Store, root cid.Cid) (State, error) { - out := state7{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make7(store adt.Store) (State, error) { - out := state7{store: store} - out.State = *cron7.ConstructState(cron7.BuiltInEntries()) - return &out, nil -} - -type state7 struct { - cron7.State - store adt.Store -} - -func (s *state7) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/init/actor.go.template b/pkg/types/specactors/builtin/init/actor.go.template deleted file mode 100644 index 8a257f85d4..0000000000 --- a/pkg/types/specactors/builtin/init/actor.go.template +++ /dev/null @@ -1,91 +0,0 @@ -// FETCHED FROM LOTUS: builtin/init/actor.go.template - -package init - -import ( - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/cbor" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - types "github.com/filecoin-project/venus/pkg/types/internal" - -{{range .versions}} - builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" -{{end}} -) - -func init() { -{{range .versions}} - builtin.RegisterActorState(builtin{{.}}.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) -{{end}}} - -var ( - Address = builtin{{.latestVersion}}.InitActorAddr - Methods = builtin{{.latestVersion}}.MethodsInit -) - -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { -{{range .versions}} - case builtin{{.}}.InitActorCodeID: - return load{{.}}(store, act.Head) -{{end}} - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version, networkName string) (State, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return make{{.}}(store, networkName) -{{end}} -} - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return builtin{{.}}.InitActorCodeID, nil -{{end}} - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - cbor.Marshaler - - ResolveAddress(address address.Address) (address.Address, bool, error) - MapAddressToNewID(address address.Address) (address.Address, error) - NetworkName() (string, error) - - ForEachActor(func(id abi.ActorID, address address.Address) error) error - - // Remove exists to support tooling that manipulates state for testing. - // It should not be used in production code, as init actor entries are - // immutable. - Remove(addrs ...address.Address) error - - // Sets the network's name. This should only be used on upgrade/fork. - SetNetworkName(name string) error - - // Sets the next ID for the init actor. This should only be used for testing. - SetNextID(id abi.ActorID) error - - // Sets the address map for the init actor. This should only be used for testing. - SetAddressMap(mcid cid.Cid) error - - AddressMap() (adt.Map, error) - GetState() interface{} -} diff --git a/pkg/types/specactors/builtin/init/diff.go b/pkg/types/specactors/builtin/init/diff.go deleted file mode 100644 index 37a6979098..0000000000 --- a/pkg/types/specactors/builtin/init/diff.go +++ /dev/null @@ -1,152 +0,0 @@ -package init - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - typegen "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" -) - -func DiffAddressMap(pre, cur State) (*AddressMapChanges, error) { - prem, err := pre.AddressMap() - if err != nil { - return nil, err - } - - curm, err := cur.AddressMap() - if err != nil { - return nil, err - } - - preRoot, err := prem.Root() - if err != nil { - return nil, err - } - - curRoot, err := curm.Root() - if err != nil { - return nil, err - } - - results := new(AddressMapChanges) - // no change. - if curRoot.Equals(preRoot) { - return results, nil - } - - err = adt.DiffAdtMap(prem, curm, &addressMapDiffer{results, pre, cur}) - if err != nil { - return nil, err - } - - return results, nil -} - -type addressMapDiffer struct { - Results *AddressMapChanges - pre, adter State -} - -type AddressMapChanges struct { - Added []AddressPair - Modified []AddressChange - Removed []AddressPair -} - -func (i *addressMapDiffer) AsKey(key string) (abi.Keyer, error) { - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return nil, err - } - return abi.AddrKey(addr), nil -} - -func (i *addressMapDiffer) Add(key string, val *typegen.Deferred) error { - pkAddr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - id := new(typegen.CborInt) - if err := id.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return err - } - idAddr, err := address.NewIDAddress(uint64(*id)) - if err != nil { - return err - } - i.Results.Added = append(i.Results.Added, AddressPair{ - ID: idAddr, - PK: pkAddr, - }) - return nil -} - -func (i *addressMapDiffer) Modify(key string, from, to *typegen.Deferred) error { - pkAddr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - - fromID := new(typegen.CborInt) - if err := fromID.UnmarshalCBOR(bytes.NewReader(from.Raw)); err != nil { - return err - } - fromIDAddr, err := address.NewIDAddress(uint64(*fromID)) - if err != nil { - return err - } - - toID := new(typegen.CborInt) - if err := toID.UnmarshalCBOR(bytes.NewReader(to.Raw)); err != nil { - return err - } - toIDAddr, err := address.NewIDAddress(uint64(*toID)) - if err != nil { - return err - } - - i.Results.Modified = append(i.Results.Modified, AddressChange{ - From: AddressPair{ - ID: fromIDAddr, - PK: pkAddr, - }, - To: AddressPair{ - ID: toIDAddr, - PK: pkAddr, - }, - }) - return nil -} - -func (i *addressMapDiffer) Remove(key string, val *typegen.Deferred) error { - pkAddr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - id := new(typegen.CborInt) - if err := id.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return err - } - idAddr, err := address.NewIDAddress(uint64(*id)) - if err != nil { - return err - } - i.Results.Removed = append(i.Results.Removed, AddressPair{ - ID: idAddr, - PK: pkAddr, - }) - return nil -} - -type AddressChange struct { - From AddressPair - To AddressPair -} - -type AddressPair struct { - ID address.Address - PK address.Address -} diff --git a/pkg/types/specactors/builtin/init/init.go b/pkg/types/specactors/builtin/init/init.go deleted file mode 100644 index 3cf84a8219..0000000000 --- a/pkg/types/specactors/builtin/init/init.go +++ /dev/null @@ -1,179 +0,0 @@ -// FETCHED FROM LOTUS: builtin/init/actor.go.template - -package init - -import ( - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/cbor" - "github.com/ipfs/go-cid" - - types "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" -) - -func init() { - - builtin.RegisterActorState(builtin0.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - - builtin.RegisterActorState(builtin2.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - - builtin.RegisterActorState(builtin3.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - - builtin.RegisterActorState(builtin4.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - - builtin.RegisterActorState(builtin5.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - - builtin.RegisterActorState(builtin6.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - - builtin.RegisterActorState(builtin7.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) -} - -var ( - Address = builtin7.InitActorAddr - Methods = builtin7.MethodsInit -) - -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { - - case builtin0.InitActorCodeID: - return load0(store, act.Head) - - case builtin2.InitActorCodeID: - return load2(store, act.Head) - - case builtin3.InitActorCodeID: - return load3(store, act.Head) - - case builtin4.InitActorCodeID: - return load4(store, act.Head) - - case builtin5.InitActorCodeID: - return load5(store, act.Head) - - case builtin6.InitActorCodeID: - return load6(store, act.Head) - - case builtin7.InitActorCodeID: - return load7(store, act.Head) - - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version, networkName string) (State, error) { - switch av { - - case actors.Version0: - return make0(store, networkName) - - case actors.Version2: - return make2(store, networkName) - - case actors.Version3: - return make3(store, networkName) - - case actors.Version4: - return make4(store, networkName) - - case actors.Version5: - return make5(store, networkName) - - case actors.Version6: - return make6(store, networkName) - - case actors.Version7: - return make7(store, networkName) - - } - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { - - case actors.Version0: - return builtin0.InitActorCodeID, nil - - case actors.Version2: - return builtin2.InitActorCodeID, nil - - case actors.Version3: - return builtin3.InitActorCodeID, nil - - case actors.Version4: - return builtin4.InitActorCodeID, nil - - case actors.Version5: - return builtin5.InitActorCodeID, nil - - case actors.Version6: - return builtin6.InitActorCodeID, nil - - case actors.Version7: - return builtin7.InitActorCodeID, nil - - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - cbor.Marshaler - - ResolveAddress(address address.Address) (address.Address, bool, error) - MapAddressToNewID(address address.Address) (address.Address, error) - NetworkName() (string, error) - - ForEachActor(func(id abi.ActorID, address address.Address) error) error - - // Remove exists to support tooling that manipulates state for testing. - // It should not be used in production code, as init actor entries are - // immutable. - Remove(addrs ...address.Address) error - - // Sets the network's name. This should only be used on upgrade/fork. - SetNetworkName(name string) error - - // Sets the next ID for the init actor. This should only be used for testing. - SetNextID(id abi.ActorID) error - - // Sets the address map for the init actor. This should only be used for testing. - SetAddressMap(mcid cid.Cid) error - - AddressMap() (adt.Map, error) - GetState() interface{} -} diff --git a/pkg/types/specactors/builtin/init/state.go.template b/pkg/types/specactors/builtin/init/state.go.template deleted file mode 100644 index 6a2e33452e..0000000000 --- a/pkg/types/specactors/builtin/init/state.go.template +++ /dev/null @@ -1,125 +0,0 @@ -// FETCHED FROM LOTUS: builtin/init/state.go.template - -package init - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - -{{if (ge .v 3)}} - builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" -{{end}} - - init{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/init" - adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" -) - -var _ State = (*state{{.v}})(nil) - -func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { - out := state{{.v}}{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make{{.v}}(store adt.Store, networkName string) (State, error) { - out := state{{.v}}{store: store} - {{if (le .v 2)}} - mr, err := adt{{.v}}.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *init{{.v}}.ConstructState(mr, networkName) - {{else}} - s, err := init{{.v}}.ConstructState(store, networkName) - if err != nil { - return nil, err - } - - out.State = *s - {{end}} - return &out, nil -} - -type state{{.v}} struct { - init{{.v}}.State - store adt.Store -} - -func (s *state{{.v}}) ResolveAddress(address address.Address) (address.Address, bool, error) { - return s.State.ResolveAddress(s.store, address) -} - -func (s *state{{.v}}) MapAddressToNewID(address address.Address) (address.Address, error) { - return s.State.MapAddressToNewID(s.store, address) -} - -func (s *state{{.v}}) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { - addrs, err := adt{{.v}}.AsMap(s.store, s.State.AddressMap{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) - if err != nil { - return err - } - var actorID cbg.CborInt - return addrs.ForEach(&actorID, func(key string) error { - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(abi.ActorID(actorID), addr) - }) -} - -func (s *state{{.v}}) NetworkName() (string, error) { - return string(s.State.NetworkName), nil -} - -func (s *state{{.v}}) SetNetworkName(name string) error { - s.State.NetworkName = name - return nil -} - -func (s *state{{.v}}) SetNextID(id abi.ActorID) error { - s.State.NextID = id - return nil -} - -func (s *state{{.v}}) Remove(addrs ...address.Address) (err error) { - m, err := adt{{.v}}.AsMap(s.store, s.State.AddressMap{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) - if err != nil { - return err - } - for _, addr := range addrs { - if err = m.Delete(abi.AddrKey(addr)); err != nil { - return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) - } - } - amr, err := m.Root() - if err != nil { - return xerrors.Errorf("failed to get address map root: %w", err) - } - s.State.AddressMap = amr - return nil -} - -func (s *state{{.v}}) SetAddressMap(mcid cid.Cid) error { - s.State.AddressMap = mcid - return nil -} - -func (s *state{{.v}}) AddressMap() (adt.Map, error) { - return adt{{.v}}.AsMap(s.store, s.State.AddressMap{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) -} - -func (s *state{{.v}}) GetState() interface{} { - return &s.State -} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/init/v0.go b/pkg/types/specactors/builtin/init/v0.go deleted file mode 100644 index ebdd46fc69..0000000000 --- a/pkg/types/specactors/builtin/init/v0.go +++ /dev/null @@ -1,113 +0,0 @@ -// FETCHED FROM LOTUS: builtin/init/state.go.template - -package init - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" - adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" -) - -var _ State = (*state0)(nil) - -func load0(store adt.Store, root cid.Cid) (State, error) { - out := state0{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make0(store adt.Store, networkName string) (State, error) { - out := state0{store: store} - - mr, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *init0.ConstructState(mr, networkName) - - return &out, nil -} - -type state0 struct { - init0.State - store adt.Store -} - -func (s *state0) ResolveAddress(address address.Address) (address.Address, bool, error) { - return s.State.ResolveAddress(s.store, address) -} - -func (s *state0) MapAddressToNewID(address address.Address) (address.Address, error) { - return s.State.MapAddressToNewID(s.store, address) -} - -func (s *state0) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { - addrs, err := adt0.AsMap(s.store, s.State.AddressMap) - if err != nil { - return err - } - var actorID cbg.CborInt - return addrs.ForEach(&actorID, func(key string) error { - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(abi.ActorID(actorID), addr) - }) -} - -func (s *state0) NetworkName() (string, error) { - return string(s.State.NetworkName), nil -} - -func (s *state0) SetNetworkName(name string) error { - s.State.NetworkName = name - return nil -} - -func (s *state0) SetNextID(id abi.ActorID) error { - s.State.NextID = id - return nil -} - -func (s *state0) Remove(addrs ...address.Address) (err error) { - m, err := adt0.AsMap(s.store, s.State.AddressMap) - if err != nil { - return err - } - for _, addr := range addrs { - if err = m.Delete(abi.AddrKey(addr)); err != nil { - return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) - } - } - amr, err := m.Root() - if err != nil { - return xerrors.Errorf("failed to get address map root: %w", err) - } - s.State.AddressMap = amr - return nil -} - -func (s *state0) SetAddressMap(mcid cid.Cid) error { - s.State.AddressMap = mcid - return nil -} - -func (s *state0) AddressMap() (adt.Map, error) { - return adt0.AsMap(s.store, s.State.AddressMap) -} - -func (s *state0) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/init/v2.go b/pkg/types/specactors/builtin/init/v2.go deleted file mode 100644 index 79767589ee..0000000000 --- a/pkg/types/specactors/builtin/init/v2.go +++ /dev/null @@ -1,113 +0,0 @@ -// FETCHED FROM LOTUS: builtin/init/state.go.template - -package init - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" - adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" -) - -var _ State = (*state2)(nil) - -func load2(store adt.Store, root cid.Cid) (State, error) { - out := state2{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make2(store adt.Store, networkName string) (State, error) { - out := state2{store: store} - - mr, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *init2.ConstructState(mr, networkName) - - return &out, nil -} - -type state2 struct { - init2.State - store adt.Store -} - -func (s *state2) ResolveAddress(address address.Address) (address.Address, bool, error) { - return s.State.ResolveAddress(s.store, address) -} - -func (s *state2) MapAddressToNewID(address address.Address) (address.Address, error) { - return s.State.MapAddressToNewID(s.store, address) -} - -func (s *state2) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { - addrs, err := adt2.AsMap(s.store, s.State.AddressMap) - if err != nil { - return err - } - var actorID cbg.CborInt - return addrs.ForEach(&actorID, func(key string) error { - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(abi.ActorID(actorID), addr) - }) -} - -func (s *state2) NetworkName() (string, error) { - return string(s.State.NetworkName), nil -} - -func (s *state2) SetNetworkName(name string) error { - s.State.NetworkName = name - return nil -} - -func (s *state2) SetNextID(id abi.ActorID) error { - s.State.NextID = id - return nil -} - -func (s *state2) Remove(addrs ...address.Address) (err error) { - m, err := adt2.AsMap(s.store, s.State.AddressMap) - if err != nil { - return err - } - for _, addr := range addrs { - if err = m.Delete(abi.AddrKey(addr)); err != nil { - return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) - } - } - amr, err := m.Root() - if err != nil { - return xerrors.Errorf("failed to get address map root: %w", err) - } - s.State.AddressMap = amr - return nil -} - -func (s *state2) SetAddressMap(mcid cid.Cid) error { - s.State.AddressMap = mcid - return nil -} - -func (s *state2) AddressMap() (adt.Map, error) { - return adt2.AsMap(s.store, s.State.AddressMap) -} - -func (s *state2) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/init/v3.go b/pkg/types/specactors/builtin/init/v3.go deleted file mode 100644 index cd7582cb57..0000000000 --- a/pkg/types/specactors/builtin/init/v3.go +++ /dev/null @@ -1,115 +0,0 @@ -// FETCHED FROM LOTUS: builtin/init/state.go.template - -package init - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" - adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" -) - -var _ State = (*state3)(nil) - -func load3(store adt.Store, root cid.Cid) (State, error) { - out := state3{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make3(store adt.Store, networkName string) (State, error) { - out := state3{store: store} - - s, err := init3.ConstructState(store, networkName) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state3 struct { - init3.State - store adt.Store -} - -func (s *state3) ResolveAddress(address address.Address) (address.Address, bool, error) { - return s.State.ResolveAddress(s.store, address) -} - -func (s *state3) MapAddressToNewID(address address.Address) (address.Address, error) { - return s.State.MapAddressToNewID(s.store, address) -} - -func (s *state3) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { - addrs, err := adt3.AsMap(s.store, s.State.AddressMap, builtin3.DefaultHamtBitwidth) - if err != nil { - return err - } - var actorID cbg.CborInt - return addrs.ForEach(&actorID, func(key string) error { - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(abi.ActorID(actorID), addr) - }) -} - -func (s *state3) NetworkName() (string, error) { - return string(s.State.NetworkName), nil -} - -func (s *state3) SetNetworkName(name string) error { - s.State.NetworkName = name - return nil -} - -func (s *state3) SetNextID(id abi.ActorID) error { - s.State.NextID = id - return nil -} - -func (s *state3) Remove(addrs ...address.Address) (err error) { - m, err := adt3.AsMap(s.store, s.State.AddressMap, builtin3.DefaultHamtBitwidth) - if err != nil { - return err - } - for _, addr := range addrs { - if err = m.Delete(abi.AddrKey(addr)); err != nil { - return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) - } - } - amr, err := m.Root() - if err != nil { - return xerrors.Errorf("failed to get address map root: %w", err) - } - s.State.AddressMap = amr - return nil -} - -func (s *state3) SetAddressMap(mcid cid.Cid) error { - s.State.AddressMap = mcid - return nil -} - -func (s *state3) AddressMap() (adt.Map, error) { - return adt3.AsMap(s.store, s.State.AddressMap, builtin3.DefaultHamtBitwidth) -} - -func (s *state3) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/init/v4.go b/pkg/types/specactors/builtin/init/v4.go deleted file mode 100644 index e7774e8bf2..0000000000 --- a/pkg/types/specactors/builtin/init/v4.go +++ /dev/null @@ -1,115 +0,0 @@ -// FETCHED FROM LOTUS: builtin/init/state.go.template - -package init - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" - adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" -) - -var _ State = (*state4)(nil) - -func load4(store adt.Store, root cid.Cid) (State, error) { - out := state4{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make4(store adt.Store, networkName string) (State, error) { - out := state4{store: store} - - s, err := init4.ConstructState(store, networkName) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state4 struct { - init4.State - store adt.Store -} - -func (s *state4) ResolveAddress(address address.Address) (address.Address, bool, error) { - return s.State.ResolveAddress(s.store, address) -} - -func (s *state4) MapAddressToNewID(address address.Address) (address.Address, error) { - return s.State.MapAddressToNewID(s.store, address) -} - -func (s *state4) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { - addrs, err := adt4.AsMap(s.store, s.State.AddressMap, builtin4.DefaultHamtBitwidth) - if err != nil { - return err - } - var actorID cbg.CborInt - return addrs.ForEach(&actorID, func(key string) error { - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(abi.ActorID(actorID), addr) - }) -} - -func (s *state4) NetworkName() (string, error) { - return string(s.State.NetworkName), nil -} - -func (s *state4) SetNetworkName(name string) error { - s.State.NetworkName = name - return nil -} - -func (s *state4) SetNextID(id abi.ActorID) error { - s.State.NextID = id - return nil -} - -func (s *state4) Remove(addrs ...address.Address) (err error) { - m, err := adt4.AsMap(s.store, s.State.AddressMap, builtin4.DefaultHamtBitwidth) - if err != nil { - return err - } - for _, addr := range addrs { - if err = m.Delete(abi.AddrKey(addr)); err != nil { - return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) - } - } - amr, err := m.Root() - if err != nil { - return xerrors.Errorf("failed to get address map root: %w", err) - } - s.State.AddressMap = amr - return nil -} - -func (s *state4) SetAddressMap(mcid cid.Cid) error { - s.State.AddressMap = mcid - return nil -} - -func (s *state4) AddressMap() (adt.Map, error) { - return adt4.AsMap(s.store, s.State.AddressMap, builtin4.DefaultHamtBitwidth) -} - -func (s *state4) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/init/v5.go b/pkg/types/specactors/builtin/init/v5.go deleted file mode 100644 index 51dc3999e9..0000000000 --- a/pkg/types/specactors/builtin/init/v5.go +++ /dev/null @@ -1,115 +0,0 @@ -// FETCHED FROM LOTUS: builtin/init/state.go.template - -package init - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" - adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" -) - -var _ State = (*state5)(nil) - -func load5(store adt.Store, root cid.Cid) (State, error) { - out := state5{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make5(store adt.Store, networkName string) (State, error) { - out := state5{store: store} - - s, err := init5.ConstructState(store, networkName) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state5 struct { - init5.State - store adt.Store -} - -func (s *state5) ResolveAddress(address address.Address) (address.Address, bool, error) { - return s.State.ResolveAddress(s.store, address) -} - -func (s *state5) MapAddressToNewID(address address.Address) (address.Address, error) { - return s.State.MapAddressToNewID(s.store, address) -} - -func (s *state5) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { - addrs, err := adt5.AsMap(s.store, s.State.AddressMap, builtin5.DefaultHamtBitwidth) - if err != nil { - return err - } - var actorID cbg.CborInt - return addrs.ForEach(&actorID, func(key string) error { - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(abi.ActorID(actorID), addr) - }) -} - -func (s *state5) NetworkName() (string, error) { - return string(s.State.NetworkName), nil -} - -func (s *state5) SetNetworkName(name string) error { - s.State.NetworkName = name - return nil -} - -func (s *state5) SetNextID(id abi.ActorID) error { - s.State.NextID = id - return nil -} - -func (s *state5) Remove(addrs ...address.Address) (err error) { - m, err := adt5.AsMap(s.store, s.State.AddressMap, builtin5.DefaultHamtBitwidth) - if err != nil { - return err - } - for _, addr := range addrs { - if err = m.Delete(abi.AddrKey(addr)); err != nil { - return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) - } - } - amr, err := m.Root() - if err != nil { - return xerrors.Errorf("failed to get address map root: %w", err) - } - s.State.AddressMap = amr - return nil -} - -func (s *state5) SetAddressMap(mcid cid.Cid) error { - s.State.AddressMap = mcid - return nil -} - -func (s *state5) AddressMap() (adt.Map, error) { - return adt5.AsMap(s.store, s.State.AddressMap, builtin5.DefaultHamtBitwidth) -} - -func (s *state5) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/init/v6.go b/pkg/types/specactors/builtin/init/v6.go deleted file mode 100644 index 0633fa831b..0000000000 --- a/pkg/types/specactors/builtin/init/v6.go +++ /dev/null @@ -1,115 +0,0 @@ -// FETCHED FROM LOTUS: builtin/init/state.go.template - -package init - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" - adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" -) - -var _ State = (*state6)(nil) - -func load6(store adt.Store, root cid.Cid) (State, error) { - out := state6{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make6(store adt.Store, networkName string) (State, error) { - out := state6{store: store} - - s, err := init6.ConstructState(store, networkName) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state6 struct { - init6.State - store adt.Store -} - -func (s *state6) ResolveAddress(address address.Address) (address.Address, bool, error) { - return s.State.ResolveAddress(s.store, address) -} - -func (s *state6) MapAddressToNewID(address address.Address) (address.Address, error) { - return s.State.MapAddressToNewID(s.store, address) -} - -func (s *state6) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { - addrs, err := adt6.AsMap(s.store, s.State.AddressMap, builtin6.DefaultHamtBitwidth) - if err != nil { - return err - } - var actorID cbg.CborInt - return addrs.ForEach(&actorID, func(key string) error { - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(abi.ActorID(actorID), addr) - }) -} - -func (s *state6) NetworkName() (string, error) { - return string(s.State.NetworkName), nil -} - -func (s *state6) SetNetworkName(name string) error { - s.State.NetworkName = name - return nil -} - -func (s *state6) SetNextID(id abi.ActorID) error { - s.State.NextID = id - return nil -} - -func (s *state6) Remove(addrs ...address.Address) (err error) { - m, err := adt6.AsMap(s.store, s.State.AddressMap, builtin6.DefaultHamtBitwidth) - if err != nil { - return err - } - for _, addr := range addrs { - if err = m.Delete(abi.AddrKey(addr)); err != nil { - return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) - } - } - amr, err := m.Root() - if err != nil { - return xerrors.Errorf("failed to get address map root: %w", err) - } - s.State.AddressMap = amr - return nil -} - -func (s *state6) SetAddressMap(mcid cid.Cid) error { - s.State.AddressMap = mcid - return nil -} - -func (s *state6) AddressMap() (adt.Map, error) { - return adt6.AsMap(s.store, s.State.AddressMap, builtin6.DefaultHamtBitwidth) -} - -func (s *state6) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/init/v7.go b/pkg/types/specactors/builtin/init/v7.go deleted file mode 100644 index f9c7db4516..0000000000 --- a/pkg/types/specactors/builtin/init/v7.go +++ /dev/null @@ -1,115 +0,0 @@ -// FETCHED FROM LOTUS: builtin/init/state.go.template - -package init - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - - init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" - adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" -) - -var _ State = (*state7)(nil) - -func load7(store adt.Store, root cid.Cid) (State, error) { - out := state7{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make7(store adt.Store, networkName string) (State, error) { - out := state7{store: store} - - s, err := init7.ConstructState(store, networkName) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state7 struct { - init7.State - store adt.Store -} - -func (s *state7) ResolveAddress(address address.Address) (address.Address, bool, error) { - return s.State.ResolveAddress(s.store, address) -} - -func (s *state7) MapAddressToNewID(address address.Address) (address.Address, error) { - return s.State.MapAddressToNewID(s.store, address) -} - -func (s *state7) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { - addrs, err := adt7.AsMap(s.store, s.State.AddressMap, builtin7.DefaultHamtBitwidth) - if err != nil { - return err - } - var actorID cbg.CborInt - return addrs.ForEach(&actorID, func(key string) error { - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(abi.ActorID(actorID), addr) - }) -} - -func (s *state7) NetworkName() (string, error) { - return string(s.State.NetworkName), nil -} - -func (s *state7) SetNetworkName(name string) error { - s.State.NetworkName = name - return nil -} - -func (s *state7) SetNextID(id abi.ActorID) error { - s.State.NextID = id - return nil -} - -func (s *state7) Remove(addrs ...address.Address) (err error) { - m, err := adt7.AsMap(s.store, s.State.AddressMap, builtin7.DefaultHamtBitwidth) - if err != nil { - return err - } - for _, addr := range addrs { - if err = m.Delete(abi.AddrKey(addr)); err != nil { - return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) - } - } - amr, err := m.Root() - if err != nil { - return xerrors.Errorf("failed to get address map root: %w", err) - } - s.State.AddressMap = amr - return nil -} - -func (s *state7) SetAddressMap(mcid cid.Cid) error { - s.State.AddressMap = mcid - return nil -} - -func (s *state7) AddressMap() (adt.Map, error) { - return adt7.AsMap(s.store, s.State.AddressMap, builtin7.DefaultHamtBitwidth) -} - -func (s *state7) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/market/actor.go.template b/pkg/types/specactors/builtin/market/actor.go.template deleted file mode 100644 index a7d31d43e1..0000000000 --- a/pkg/types/specactors/builtin/market/actor.go.template +++ /dev/null @@ -1,206 +0,0 @@ -// FETCHED FROM LOTUS: builtin/market/actor.go.template - -package market - -import ( - "github.com/filecoin-project/go-state-types/network" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/cbor" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - - market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" -{{range .versions}} - builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" -{{end}} - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - types "github.com/filecoin-project/venus/pkg/types/internal" -) - -func init() { -{{range .versions}} - builtin.RegisterActorState(builtin{{.}}.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) -{{end}}} - -var ( - Address = builtin{{.latestVersion}}.StorageMarketActorAddr - Methods = builtin{{.latestVersion}}.MethodsMarket -) - -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { -{{range .versions}} - case builtin{{.}}.StorageMarketActorCodeID: - return load{{.}}(store, act.Head) -{{end}} - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version) (State, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return make{{.}}(store) -{{end}} -} - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return builtin{{.}}.StorageMarketActorCodeID, nil -{{end}} - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - cbor.Marshaler - BalancesChanged(State) (bool, error) - EscrowTable() (BalanceTable, error) - LockedTable() (BalanceTable, error) - TotalLocked() (abi.TokenAmount, error) - StatesChanged(State) (bool, error) - States() (DealStates, error) - ProposalsChanged(State) (bool, error) - Proposals() (DealProposals, error) - VerifyDealsForActivation( - minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, - ) (weight, verifiedWeight abi.DealWeight, err error) - NextID() (abi.DealID, error) - GetState() interface{} -} - -type BalanceTable interface { - ForEach(cb func(address.Address, abi.TokenAmount) error) error - Get(key address.Address) (abi.TokenAmount, error) -} - -type DealStates interface { - ForEach(cb func(id abi.DealID, ds DealState) error) error - Get(id abi.DealID) (*DealState, bool, error) - - array() adt.Array - decode(*cbg.Deferred) (*DealState, error) -} - -type DealProposals interface { - ForEach(cb func(id abi.DealID, dp DealProposal) error) error - Get(id abi.DealID) (*DealProposal, bool, error) - - array() adt.Array - decode(*cbg.Deferred) (*DealProposal, error) -} - -type PublishStorageDealsParams = market0.PublishStorageDealsParams - -type PublishStorageDealsReturn interface { - DealIDs() ([]abi.DealID, error) - // Note that this index is based on the batch of deals that were published, NOT the DealID - IsDealValid(index uint64) (bool, error) -} - -func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStorageDealsReturn, error) { - av, err := actors.VersionForNetwork(nv) - if err != nil { - return nil, err - } - - switch av { -{{range .versions}} - case actors.Version{{.}}: - return decodePublishStorageDealsReturn{{.}}(b) -{{end}} -} - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -type VerifyDealsForActivationParams = market0.VerifyDealsForActivationParams -type WithdrawBalanceParams = market0.WithdrawBalanceParams - -type ClientDealProposal = market0.ClientDealProposal - -type DealState struct { - SectorStartEpoch abi.ChainEpoch // -1 if not yet included in proven sector - LastUpdatedEpoch abi.ChainEpoch // -1 if deal state never updated - SlashEpoch abi.ChainEpoch // -1 if deal never slashed -} - -type DealProposal struct { - PieceCID cid.Cid - PieceSize abi.PaddedPieceSize - VerifiedDeal bool - Client address.Address - Provider address.Address - Label string - StartEpoch abi.ChainEpoch - EndEpoch abi.ChainEpoch - StoragePricePerEpoch abi.TokenAmount - ProviderCollateral abi.TokenAmount - ClientCollateral abi.TokenAmount -} - -type DealStateChanges struct { - Added []DealIDState - Modified []DealStateChange - Removed []DealIDState -} - -type DealIDState struct { - ID abi.DealID - Deal DealState -} - -// DealStateChange is a change in deal state from -> to -type DealStateChange struct { - ID abi.DealID - From *DealState - To *DealState -} - -type DealProposalChanges struct { - Added []ProposalIDState - Removed []ProposalIDState -} - -type ProposalIDState struct { - ID abi.DealID - Proposal DealProposal -} - -func EmptyDealState() *DealState { - return &DealState{ - SectorStartEpoch: -1, - SlashEpoch: -1, - LastUpdatedEpoch: -1, - } -} - -// returns the earned fees and pending fees for a given deal -func (deal DealProposal) GetDealFees(height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) { - tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch))) - - ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch))) - if ef.LessThan(big.Zero()) { - ef = big.Zero() - } - - if ef.GreaterThan(tf) { - ef = tf - } - - return ef, big.Sub(tf, ef) -} diff --git a/pkg/types/specactors/builtin/market/diff.go b/pkg/types/specactors/builtin/market/diff.go deleted file mode 100644 index 90c4e75cad..0000000000 --- a/pkg/types/specactors/builtin/market/diff.go +++ /dev/null @@ -1,91 +0,0 @@ -package market - -import ( - "fmt" - - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - cbg "github.com/whyrusleeping/cbor-gen" -) - -func DiffDealProposals(pre, cur DealProposals) (*DealProposalChanges, error) { - results := new(DealProposalChanges) - if err := adt.DiffAdtArray(pre.array(), cur.array(), &marketProposalsDiffer{results, pre, cur}); err != nil { - return nil, fmt.Errorf("diffing deal states: %w", err) - } - return results, nil -} - -type marketProposalsDiffer struct { - Results *DealProposalChanges - pre, cur DealProposals -} - -func (d *marketProposalsDiffer) Add(key uint64, val *cbg.Deferred) error { - dp, err := d.cur.decode(val) - if err != nil { - return err - } - d.Results.Added = append(d.Results.Added, ProposalIDState{abi.DealID(key), *dp}) - return nil -} - -func (d *marketProposalsDiffer) Modify(key uint64, from, to *cbg.Deferred) error { - // short circuit, DealProposals are static - return nil -} - -func (d *marketProposalsDiffer) Remove(key uint64, val *cbg.Deferred) error { - dp, err := d.pre.decode(val) - if err != nil { - return err - } - d.Results.Removed = append(d.Results.Removed, ProposalIDState{abi.DealID(key), *dp}) - return nil -} - -func DiffDealStates(pre, cur DealStates) (*DealStateChanges, error) { - results := new(DealStateChanges) - if err := adt.DiffAdtArray(pre.array(), cur.array(), &marketStatesDiffer{results, pre, cur}); err != nil { - return nil, fmt.Errorf("diffing deal states: %w", err) - } - return results, nil -} - -type marketStatesDiffer struct { - Results *DealStateChanges - pre, cur DealStates -} - -func (d *marketStatesDiffer) Add(key uint64, val *cbg.Deferred) error { - ds, err := d.cur.decode(val) - if err != nil { - return err - } - d.Results.Added = append(d.Results.Added, DealIDState{abi.DealID(key), *ds}) - return nil -} - -func (d *marketStatesDiffer) Modify(key uint64, from, to *cbg.Deferred) error { - dsFrom, err := d.pre.decode(from) - if err != nil { - return err - } - dsTo, err := d.cur.decode(to) - if err != nil { - return err - } - if *dsFrom != *dsTo { - d.Results.Modified = append(d.Results.Modified, DealStateChange{abi.DealID(key), dsFrom, dsTo}) - } - return nil -} - -func (d *marketStatesDiffer) Remove(key uint64, val *cbg.Deferred) error { - ds, err := d.pre.decode(val) - if err != nil { - return err - } - d.Results.Removed = append(d.Results.Removed, DealIDState{abi.DealID(key), *ds}) - return nil -} diff --git a/pkg/types/specactors/builtin/market/market.go b/pkg/types/specactors/builtin/market/market.go deleted file mode 100644 index 8a57b87f0f..0000000000 --- a/pkg/types/specactors/builtin/market/market.go +++ /dev/null @@ -1,313 +0,0 @@ -// FETCHED FROM LOTUS: builtin/market/actor.go.template - -package market - -import ( - "github.com/filecoin-project/go-state-types/network" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/cbor" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - - market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" -) - -func init() { - - builtin.RegisterActorState(builtin0.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - - builtin.RegisterActorState(builtin2.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - - builtin.RegisterActorState(builtin3.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - - builtin.RegisterActorState(builtin4.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - - builtin.RegisterActorState(builtin5.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - - builtin.RegisterActorState(builtin6.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - - builtin.RegisterActorState(builtin7.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) -} - -var ( - Address = builtin7.StorageMarketActorAddr - Methods = builtin7.MethodsMarket -) - -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { - - case builtin0.StorageMarketActorCodeID: - return load0(store, act.Head) - - case builtin2.StorageMarketActorCodeID: - return load2(store, act.Head) - - case builtin3.StorageMarketActorCodeID: - return load3(store, act.Head) - - case builtin4.StorageMarketActorCodeID: - return load4(store, act.Head) - - case builtin5.StorageMarketActorCodeID: - return load5(store, act.Head) - - case builtin6.StorageMarketActorCodeID: - return load6(store, act.Head) - - case builtin7.StorageMarketActorCodeID: - return load7(store, act.Head) - - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version) (State, error) { - switch av { - - case actors.Version0: - return make0(store) - - case actors.Version2: - return make2(store) - - case actors.Version3: - return make3(store) - - case actors.Version4: - return make4(store) - - case actors.Version5: - return make5(store) - - case actors.Version6: - return make6(store) - - case actors.Version7: - return make7(store) - - } - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { - - case actors.Version0: - return builtin0.StorageMarketActorCodeID, nil - - case actors.Version2: - return builtin2.StorageMarketActorCodeID, nil - - case actors.Version3: - return builtin3.StorageMarketActorCodeID, nil - - case actors.Version4: - return builtin4.StorageMarketActorCodeID, nil - - case actors.Version5: - return builtin5.StorageMarketActorCodeID, nil - - case actors.Version6: - return builtin6.StorageMarketActorCodeID, nil - - case actors.Version7: - return builtin7.StorageMarketActorCodeID, nil - - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - cbor.Marshaler - BalancesChanged(State) (bool, error) - EscrowTable() (BalanceTable, error) - LockedTable() (BalanceTable, error) - TotalLocked() (abi.TokenAmount, error) - StatesChanged(State) (bool, error) - States() (DealStates, error) - ProposalsChanged(State) (bool, error) - Proposals() (DealProposals, error) - VerifyDealsForActivation( - minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, - ) (weight, verifiedWeight abi.DealWeight, err error) - NextID() (abi.DealID, error) - GetState() interface{} -} - -type BalanceTable interface { - ForEach(cb func(address.Address, abi.TokenAmount) error) error - Get(key address.Address) (abi.TokenAmount, error) -} - -type DealStates interface { - ForEach(cb func(id abi.DealID, ds DealState) error) error - Get(id abi.DealID) (*DealState, bool, error) - - array() adt.Array - decode(*cbg.Deferred) (*DealState, error) -} - -type DealProposals interface { - ForEach(cb func(id abi.DealID, dp DealProposal) error) error - Get(id abi.DealID) (*DealProposal, bool, error) - - array() adt.Array - decode(*cbg.Deferred) (*DealProposal, error) -} - -type PublishStorageDealsParams = market0.PublishStorageDealsParams - -type PublishStorageDealsReturn interface { - DealIDs() ([]abi.DealID, error) - // Note that this index is based on the batch of deals that were published, NOT the DealID - IsDealValid(index uint64) (bool, error) -} - -func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStorageDealsReturn, error) { - av, err := actors.VersionForNetwork(nv) - if err != nil { - return nil, err - } - - switch av { - - case actors.Version0: - return decodePublishStorageDealsReturn0(b) - - case actors.Version2: - return decodePublishStorageDealsReturn2(b) - - case actors.Version3: - return decodePublishStorageDealsReturn3(b) - - case actors.Version4: - return decodePublishStorageDealsReturn4(b) - - case actors.Version5: - return decodePublishStorageDealsReturn5(b) - - case actors.Version6: - return decodePublishStorageDealsReturn6(b) - - case actors.Version7: - return decodePublishStorageDealsReturn7(b) - - } - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -type VerifyDealsForActivationParams = market0.VerifyDealsForActivationParams -type WithdrawBalanceParams = market0.WithdrawBalanceParams - -type ClientDealProposal = market0.ClientDealProposal - -type DealState struct { - SectorStartEpoch abi.ChainEpoch // -1 if not yet included in proven sector - LastUpdatedEpoch abi.ChainEpoch // -1 if deal state never updated - SlashEpoch abi.ChainEpoch // -1 if deal never slashed -} - -type DealProposal struct { - PieceCID cid.Cid - PieceSize abi.PaddedPieceSize - VerifiedDeal bool - Client address.Address - Provider address.Address - Label string - StartEpoch abi.ChainEpoch - EndEpoch abi.ChainEpoch - StoragePricePerEpoch abi.TokenAmount - ProviderCollateral abi.TokenAmount - ClientCollateral abi.TokenAmount -} - -type DealStateChanges struct { - Added []DealIDState - Modified []DealStateChange - Removed []DealIDState -} - -type DealIDState struct { - ID abi.DealID - Deal DealState -} - -// DealStateChange is a change in deal state from -> to -type DealStateChange struct { - ID abi.DealID - From *DealState - To *DealState -} - -type DealProposalChanges struct { - Added []ProposalIDState - Removed []ProposalIDState -} - -type ProposalIDState struct { - ID abi.DealID - Proposal DealProposal -} - -func EmptyDealState() *DealState { - return &DealState{ - SectorStartEpoch: -1, - SlashEpoch: -1, - LastUpdatedEpoch: -1, - } -} - -// returns the earned fees and pending fees for a given deal -func (deal DealProposal) GetDealFees(height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) { - tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch))) - - ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch))) - if ef.LessThan(big.Zero()) { - ef = big.Zero() - } - - if ef.GreaterThan(tf) { - ef = tf - } - - return ef, big.Sub(tf, ef) -} diff --git a/pkg/types/specactors/builtin/market/state.go.template b/pkg/types/specactors/builtin/market/state.go.template deleted file mode 100644 index 291fa4f631..0000000000 --- a/pkg/types/specactors/builtin/market/state.go.template +++ /dev/null @@ -1,269 +0,0 @@ -// FETCHED FROM LOTUS: builtin/market/state.go.template - -package market - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - types "github.com/filecoin-project/venus/pkg/types/internal" - - market{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/market" - adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" -) - -var _ State = (*state{{.v}})(nil) - -func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { - out := state{{.v}}{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make{{.v}}(store adt.Store) (State, error) { - out := state{{.v}}{store: store} - {{if (le .v 2)}} - ea, err := adt{{.v}}.MakeEmptyArray(store).Root() - if err != nil { - return nil, err - } - - em, err := adt{{.v}}.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *market{{.v}}.ConstructState(ea, em, em) - {{else}} - s, err := market{{.v}}.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - {{end}} - return &out, nil -} - -type state{{.v}} struct { - market{{.v}}.State - store adt.Store -} - -func (s *state{{.v}}) TotalLocked() (abi.TokenAmount, error) { - fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) - fml = types.BigAdd(fml, s.TotalClientStorageFee) - return fml, nil -} - -func (s *state{{.v}}) BalancesChanged(otherState State) (bool, error) { - otherState{{.v}}, ok := otherState.(*state{{.v}}) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.EscrowTable.Equals(otherState{{.v}}.State.EscrowTable) || !s.State.LockedTable.Equals(otherState{{.v}}.State.LockedTable), nil -} - -func (s *state{{.v}}) StatesChanged(otherState State) (bool, error) { - otherState{{.v}}, ok := otherState.(*state{{.v}}) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.States.Equals(otherState{{.v}}.State.States), nil -} - -func (s *state{{.v}}) States() (DealStates, error) { - stateArray, err := adt{{.v}}.AsArray(s.store, s.State.States{{if (ge .v 3)}}, market{{.v}}.StatesAmtBitwidth{{end}}) - if err != nil { - return nil, err - } - return &dealStates{{.v}}{stateArray}, nil -} - -func (s *state{{.v}}) ProposalsChanged(otherState State) (bool, error) { - otherState{{.v}}, ok := otherState.(*state{{.v}}) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.Proposals.Equals(otherState{{.v}}.State.Proposals), nil -} - -func (s *state{{.v}}) Proposals() (DealProposals, error) { - proposalArray, err := adt{{.v}}.AsArray(s.store, s.State.Proposals{{if (ge .v 3)}}, market{{.v}}.ProposalsAmtBitwidth{{end}}) - if err != nil { - return nil, err - } - return &dealProposals{{.v}}{proposalArray}, nil -} - -func (s *state{{.v}}) EscrowTable() (BalanceTable, error) { - bt, err := adt{{.v}}.AsBalanceTable(s.store, s.State.EscrowTable) - if err != nil { - return nil, err - } - return &balanceTable{{.v}}{bt}, nil -} - -func (s *state{{.v}}) LockedTable() (BalanceTable, error) { - bt, err := adt{{.v}}.AsBalanceTable(s.store, s.State.LockedTable) - if err != nil { - return nil, err - } - return &balanceTable{{.v}}{bt}, nil -} - -func (s *state{{.v}}) VerifyDealsForActivation( - minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, -) (weight, verifiedWeight abi.DealWeight, err error) { - w, vw{{if (ge .v 2)}}, _{{end}}, err := market{{.v}}.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) - return w, vw, err -} - -func (s *state{{.v}}) NextID() (abi.DealID, error) { - return s.State.NextID, nil -} - -type balanceTable{{.v}} struct { - *adt{{.v}}.BalanceTable -} - -func (bt *balanceTable{{.v}}) ForEach(cb func(address.Address, abi.TokenAmount) error) error { - asMap := (*adt{{.v}}.Map)(bt.BalanceTable) - var ta abi.TokenAmount - return asMap.ForEach(&ta, func(key string) error { - a, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(a, ta) - }) -} - -type dealStates{{.v}} struct { - adt.Array -} - -func (s *dealStates{{.v}}) Get(dealID abi.DealID) (*DealState, bool, error) { - var deal{{.v}} market{{.v}}.DealState - found, err := s.Array.Get(uint64(dealID), &deal{{.v}}) - if err != nil { - return nil, false, err - } - if !found { - return nil, false, nil - } - deal := fromV{{.v}}DealState(deal{{.v}}) - return &deal, true, nil -} - -func (s *dealStates{{.v}}) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { - var ds{{.v}} market{{.v}}.DealState - return s.Array.ForEach(&ds{{.v}}, func(idx int64) error { - return cb(abi.DealID(idx), fromV{{.v}}DealState(ds{{.v}})) - }) -} - -func (s *dealStates{{.v}}) decode(val *cbg.Deferred) (*DealState, error) { - var ds{{.v}} market{{.v}}.DealState - if err := ds{{.v}}.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return nil, err - } - ds := fromV{{.v}}DealState(ds{{.v}}) - return &ds, nil -} - -func (s *dealStates{{.v}}) array() adt.Array { - return s.Array -} - -func fromV{{.v}}DealState(v{{.v}} market{{.v}}.DealState) DealState { - return (DealState)(v{{.v}}) -} - -type dealProposals{{.v}} struct { - adt.Array -} - -func (s *dealProposals{{.v}}) Get(dealID abi.DealID) (*DealProposal, bool, error) { - var proposal{{.v}} market{{.v}}.DealProposal - found, err := s.Array.Get(uint64(dealID), &proposal{{.v}}) - if err != nil { - return nil, false, err - } - if !found { - return nil, false, nil - } - proposal := fromV{{.v}}DealProposal(proposal{{.v}}) - return &proposal, true, nil -} - -func (s *dealProposals{{.v}}) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { - var dp{{.v}} market{{.v}}.DealProposal - return s.Array.ForEach(&dp{{.v}}, func(idx int64) error { - return cb(abi.DealID(idx), fromV{{.v}}DealProposal(dp{{.v}})) - }) -} - -func (s *dealProposals{{.v}}) decode(val *cbg.Deferred) (*DealProposal, error) { - var dp{{.v}} market{{.v}}.DealProposal - if err := dp{{.v}}.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return nil, err - } - dp := fromV{{.v}}DealProposal(dp{{.v}}) - return &dp, nil -} - -func (s *dealProposals{{.v}}) array() adt.Array { - return s.Array -} - -func fromV{{.v}}DealProposal(v{{.v}} market{{.v}}.DealProposal) DealProposal { - return (DealProposal)(v{{.v}}) -} - -func (s *state{{.v}}) GetState() interface{} { - return &s.State -} - -var _ PublishStorageDealsReturn = (*publishStorageDealsReturn{{.v}})(nil) - -func decodePublishStorageDealsReturn{{.v}}(b []byte) (PublishStorageDealsReturn, error) { - var retval market{{.v}}.PublishStorageDealsReturn - if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { - return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) - } - - return &publishStorageDealsReturn{{.v}}{retval}, nil -} - -type publishStorageDealsReturn{{.v}} struct { - market{{.v}}.PublishStorageDealsReturn -} - -func (r *publishStorageDealsReturn{{.v}}) IsDealValid(index uint64) (bool, error) { - {{if (ge .v 6)}} - return r.ValidDeals.IsSet(index) - {{else}} - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - {{end}} -} - -func (r *publishStorageDealsReturn{{.v}}) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil -} diff --git a/pkg/types/specactors/builtin/market/v0.go b/pkg/types/specactors/builtin/market/v0.go deleted file mode 100644 index 519979ba1d..0000000000 --- a/pkg/types/specactors/builtin/market/v0.go +++ /dev/null @@ -1,260 +0,0 @@ -// FETCHED FROM LOTUS: builtin/market/state.go.template - -package market - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - types "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" - adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" -) - -var _ State = (*state0)(nil) - -func load0(store adt.Store, root cid.Cid) (State, error) { - out := state0{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make0(store adt.Store) (State, error) { - out := state0{store: store} - - ea, err := adt0.MakeEmptyArray(store).Root() - if err != nil { - return nil, err - } - - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *market0.ConstructState(ea, em, em) - - return &out, nil -} - -type state0 struct { - market0.State - store adt.Store -} - -func (s *state0) TotalLocked() (abi.TokenAmount, error) { - fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) - fml = types.BigAdd(fml, s.TotalClientStorageFee) - return fml, nil -} - -func (s *state0) BalancesChanged(otherState State) (bool, error) { - otherState0, ok := otherState.(*state0) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.EscrowTable.Equals(otherState0.State.EscrowTable) || !s.State.LockedTable.Equals(otherState0.State.LockedTable), nil -} - -func (s *state0) StatesChanged(otherState State) (bool, error) { - otherState0, ok := otherState.(*state0) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.States.Equals(otherState0.State.States), nil -} - -func (s *state0) States() (DealStates, error) { - stateArray, err := adt0.AsArray(s.store, s.State.States) - if err != nil { - return nil, err - } - return &dealStates0{stateArray}, nil -} - -func (s *state0) ProposalsChanged(otherState State) (bool, error) { - otherState0, ok := otherState.(*state0) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.Proposals.Equals(otherState0.State.Proposals), nil -} - -func (s *state0) Proposals() (DealProposals, error) { - proposalArray, err := adt0.AsArray(s.store, s.State.Proposals) - if err != nil { - return nil, err - } - return &dealProposals0{proposalArray}, nil -} - -func (s *state0) EscrowTable() (BalanceTable, error) { - bt, err := adt0.AsBalanceTable(s.store, s.State.EscrowTable) - if err != nil { - return nil, err - } - return &balanceTable0{bt}, nil -} - -func (s *state0) LockedTable() (BalanceTable, error) { - bt, err := adt0.AsBalanceTable(s.store, s.State.LockedTable) - if err != nil { - return nil, err - } - return &balanceTable0{bt}, nil -} - -func (s *state0) VerifyDealsForActivation( - minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, -) (weight, verifiedWeight abi.DealWeight, err error) { - w, vw, err := market0.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) - return w, vw, err -} - -func (s *state0) NextID() (abi.DealID, error) { - return s.State.NextID, nil -} - -type balanceTable0 struct { - *adt0.BalanceTable -} - -func (bt *balanceTable0) ForEach(cb func(address.Address, abi.TokenAmount) error) error { - asMap := (*adt0.Map)(bt.BalanceTable) - var ta abi.TokenAmount - return asMap.ForEach(&ta, func(key string) error { - a, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(a, ta) - }) -} - -type dealStates0 struct { - adt.Array -} - -func (s *dealStates0) Get(dealID abi.DealID) (*DealState, bool, error) { - var deal0 market0.DealState - found, err := s.Array.Get(uint64(dealID), &deal0) - if err != nil { - return nil, false, err - } - if !found { - return nil, false, nil - } - deal := fromV0DealState(deal0) - return &deal, true, nil -} - -func (s *dealStates0) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { - var ds0 market0.DealState - return s.Array.ForEach(&ds0, func(idx int64) error { - return cb(abi.DealID(idx), fromV0DealState(ds0)) - }) -} - -func (s *dealStates0) decode(val *cbg.Deferred) (*DealState, error) { - var ds0 market0.DealState - if err := ds0.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return nil, err - } - ds := fromV0DealState(ds0) - return &ds, nil -} - -func (s *dealStates0) array() adt.Array { - return s.Array -} - -func fromV0DealState(v0 market0.DealState) DealState { - return (DealState)(v0) -} - -type dealProposals0 struct { - adt.Array -} - -func (s *dealProposals0) Get(dealID abi.DealID) (*DealProposal, bool, error) { - var proposal0 market0.DealProposal - found, err := s.Array.Get(uint64(dealID), &proposal0) - if err != nil { - return nil, false, err - } - if !found { - return nil, false, nil - } - proposal := fromV0DealProposal(proposal0) - return &proposal, true, nil -} - -func (s *dealProposals0) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { - var dp0 market0.DealProposal - return s.Array.ForEach(&dp0, func(idx int64) error { - return cb(abi.DealID(idx), fromV0DealProposal(dp0)) - }) -} - -func (s *dealProposals0) decode(val *cbg.Deferred) (*DealProposal, error) { - var dp0 market0.DealProposal - if err := dp0.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return nil, err - } - dp := fromV0DealProposal(dp0) - return &dp, nil -} - -func (s *dealProposals0) array() adt.Array { - return s.Array -} - -func fromV0DealProposal(v0 market0.DealProposal) DealProposal { - return (DealProposal)(v0) -} - -func (s *state0) GetState() interface{} { - return &s.State -} - -var _ PublishStorageDealsReturn = (*publishStorageDealsReturn0)(nil) - -func decodePublishStorageDealsReturn0(b []byte) (PublishStorageDealsReturn, error) { - var retval market0.PublishStorageDealsReturn - if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { - return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) - } - - return &publishStorageDealsReturn0{retval}, nil -} - -type publishStorageDealsReturn0 struct { - market0.PublishStorageDealsReturn -} - -func (r *publishStorageDealsReturn0) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - -} - -func (r *publishStorageDealsReturn0) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil -} diff --git a/pkg/types/specactors/builtin/market/v2.go b/pkg/types/specactors/builtin/market/v2.go deleted file mode 100644 index 9ac811b80d..0000000000 --- a/pkg/types/specactors/builtin/market/v2.go +++ /dev/null @@ -1,260 +0,0 @@ -// FETCHED FROM LOTUS: builtin/market/state.go.template - -package market - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - types "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" - adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" -) - -var _ State = (*state2)(nil) - -func load2(store adt.Store, root cid.Cid) (State, error) { - out := state2{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make2(store adt.Store) (State, error) { - out := state2{store: store} - - ea, err := adt2.MakeEmptyArray(store).Root() - if err != nil { - return nil, err - } - - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *market2.ConstructState(ea, em, em) - - return &out, nil -} - -type state2 struct { - market2.State - store adt.Store -} - -func (s *state2) TotalLocked() (abi.TokenAmount, error) { - fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) - fml = types.BigAdd(fml, s.TotalClientStorageFee) - return fml, nil -} - -func (s *state2) BalancesChanged(otherState State) (bool, error) { - otherState2, ok := otherState.(*state2) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.EscrowTable.Equals(otherState2.State.EscrowTable) || !s.State.LockedTable.Equals(otherState2.State.LockedTable), nil -} - -func (s *state2) StatesChanged(otherState State) (bool, error) { - otherState2, ok := otherState.(*state2) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.States.Equals(otherState2.State.States), nil -} - -func (s *state2) States() (DealStates, error) { - stateArray, err := adt2.AsArray(s.store, s.State.States) - if err != nil { - return nil, err - } - return &dealStates2{stateArray}, nil -} - -func (s *state2) ProposalsChanged(otherState State) (bool, error) { - otherState2, ok := otherState.(*state2) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.Proposals.Equals(otherState2.State.Proposals), nil -} - -func (s *state2) Proposals() (DealProposals, error) { - proposalArray, err := adt2.AsArray(s.store, s.State.Proposals) - if err != nil { - return nil, err - } - return &dealProposals2{proposalArray}, nil -} - -func (s *state2) EscrowTable() (BalanceTable, error) { - bt, err := adt2.AsBalanceTable(s.store, s.State.EscrowTable) - if err != nil { - return nil, err - } - return &balanceTable2{bt}, nil -} - -func (s *state2) LockedTable() (BalanceTable, error) { - bt, err := adt2.AsBalanceTable(s.store, s.State.LockedTable) - if err != nil { - return nil, err - } - return &balanceTable2{bt}, nil -} - -func (s *state2) VerifyDealsForActivation( - minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, -) (weight, verifiedWeight abi.DealWeight, err error) { - w, vw, _, err := market2.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) - return w, vw, err -} - -func (s *state2) NextID() (abi.DealID, error) { - return s.State.NextID, nil -} - -type balanceTable2 struct { - *adt2.BalanceTable -} - -func (bt *balanceTable2) ForEach(cb func(address.Address, abi.TokenAmount) error) error { - asMap := (*adt2.Map)(bt.BalanceTable) - var ta abi.TokenAmount - return asMap.ForEach(&ta, func(key string) error { - a, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(a, ta) - }) -} - -type dealStates2 struct { - adt.Array -} - -func (s *dealStates2) Get(dealID abi.DealID) (*DealState, bool, error) { - var deal2 market2.DealState - found, err := s.Array.Get(uint64(dealID), &deal2) - if err != nil { - return nil, false, err - } - if !found { - return nil, false, nil - } - deal := fromV2DealState(deal2) - return &deal, true, nil -} - -func (s *dealStates2) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { - var ds2 market2.DealState - return s.Array.ForEach(&ds2, func(idx int64) error { - return cb(abi.DealID(idx), fromV2DealState(ds2)) - }) -} - -func (s *dealStates2) decode(val *cbg.Deferred) (*DealState, error) { - var ds2 market2.DealState - if err := ds2.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return nil, err - } - ds := fromV2DealState(ds2) - return &ds, nil -} - -func (s *dealStates2) array() adt.Array { - return s.Array -} - -func fromV2DealState(v2 market2.DealState) DealState { - return (DealState)(v2) -} - -type dealProposals2 struct { - adt.Array -} - -func (s *dealProposals2) Get(dealID abi.DealID) (*DealProposal, bool, error) { - var proposal2 market2.DealProposal - found, err := s.Array.Get(uint64(dealID), &proposal2) - if err != nil { - return nil, false, err - } - if !found { - return nil, false, nil - } - proposal := fromV2DealProposal(proposal2) - return &proposal, true, nil -} - -func (s *dealProposals2) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { - var dp2 market2.DealProposal - return s.Array.ForEach(&dp2, func(idx int64) error { - return cb(abi.DealID(idx), fromV2DealProposal(dp2)) - }) -} - -func (s *dealProposals2) decode(val *cbg.Deferred) (*DealProposal, error) { - var dp2 market2.DealProposal - if err := dp2.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return nil, err - } - dp := fromV2DealProposal(dp2) - return &dp, nil -} - -func (s *dealProposals2) array() adt.Array { - return s.Array -} - -func fromV2DealProposal(v2 market2.DealProposal) DealProposal { - return (DealProposal)(v2) -} - -func (s *state2) GetState() interface{} { - return &s.State -} - -var _ PublishStorageDealsReturn = (*publishStorageDealsReturn2)(nil) - -func decodePublishStorageDealsReturn2(b []byte) (PublishStorageDealsReturn, error) { - var retval market2.PublishStorageDealsReturn - if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { - return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) - } - - return &publishStorageDealsReturn2{retval}, nil -} - -type publishStorageDealsReturn2 struct { - market2.PublishStorageDealsReturn -} - -func (r *publishStorageDealsReturn2) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - -} - -func (r *publishStorageDealsReturn2) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil -} diff --git a/pkg/types/specactors/builtin/market/v3.go b/pkg/types/specactors/builtin/market/v3.go deleted file mode 100644 index b8fe02c130..0000000000 --- a/pkg/types/specactors/builtin/market/v3.go +++ /dev/null @@ -1,255 +0,0 @@ -// FETCHED FROM LOTUS: builtin/market/state.go.template - -package market - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - types "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" - adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" -) - -var _ State = (*state3)(nil) - -func load3(store adt.Store, root cid.Cid) (State, error) { - out := state3{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make3(store adt.Store) (State, error) { - out := state3{store: store} - - s, err := market3.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state3 struct { - market3.State - store adt.Store -} - -func (s *state3) TotalLocked() (abi.TokenAmount, error) { - fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) - fml = types.BigAdd(fml, s.TotalClientStorageFee) - return fml, nil -} - -func (s *state3) BalancesChanged(otherState State) (bool, error) { - otherState3, ok := otherState.(*state3) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.EscrowTable.Equals(otherState3.State.EscrowTable) || !s.State.LockedTable.Equals(otherState3.State.LockedTable), nil -} - -func (s *state3) StatesChanged(otherState State) (bool, error) { - otherState3, ok := otherState.(*state3) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.States.Equals(otherState3.State.States), nil -} - -func (s *state3) States() (DealStates, error) { - stateArray, err := adt3.AsArray(s.store, s.State.States, market3.StatesAmtBitwidth) - if err != nil { - return nil, err - } - return &dealStates3{stateArray}, nil -} - -func (s *state3) ProposalsChanged(otherState State) (bool, error) { - otherState3, ok := otherState.(*state3) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.Proposals.Equals(otherState3.State.Proposals), nil -} - -func (s *state3) Proposals() (DealProposals, error) { - proposalArray, err := adt3.AsArray(s.store, s.State.Proposals, market3.ProposalsAmtBitwidth) - if err != nil { - return nil, err - } - return &dealProposals3{proposalArray}, nil -} - -func (s *state3) EscrowTable() (BalanceTable, error) { - bt, err := adt3.AsBalanceTable(s.store, s.State.EscrowTable) - if err != nil { - return nil, err - } - return &balanceTable3{bt}, nil -} - -func (s *state3) LockedTable() (BalanceTable, error) { - bt, err := adt3.AsBalanceTable(s.store, s.State.LockedTable) - if err != nil { - return nil, err - } - return &balanceTable3{bt}, nil -} - -func (s *state3) VerifyDealsForActivation( - minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, -) (weight, verifiedWeight abi.DealWeight, err error) { - w, vw, _, err := market3.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) - return w, vw, err -} - -func (s *state3) NextID() (abi.DealID, error) { - return s.State.NextID, nil -} - -type balanceTable3 struct { - *adt3.BalanceTable -} - -func (bt *balanceTable3) ForEach(cb func(address.Address, abi.TokenAmount) error) error { - asMap := (*adt3.Map)(bt.BalanceTable) - var ta abi.TokenAmount - return asMap.ForEach(&ta, func(key string) error { - a, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(a, ta) - }) -} - -type dealStates3 struct { - adt.Array -} - -func (s *dealStates3) Get(dealID abi.DealID) (*DealState, bool, error) { - var deal3 market3.DealState - found, err := s.Array.Get(uint64(dealID), &deal3) - if err != nil { - return nil, false, err - } - if !found { - return nil, false, nil - } - deal := fromV3DealState(deal3) - return &deal, true, nil -} - -func (s *dealStates3) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { - var ds3 market3.DealState - return s.Array.ForEach(&ds3, func(idx int64) error { - return cb(abi.DealID(idx), fromV3DealState(ds3)) - }) -} - -func (s *dealStates3) decode(val *cbg.Deferred) (*DealState, error) { - var ds3 market3.DealState - if err := ds3.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return nil, err - } - ds := fromV3DealState(ds3) - return &ds, nil -} - -func (s *dealStates3) array() adt.Array { - return s.Array -} - -func fromV3DealState(v3 market3.DealState) DealState { - return (DealState)(v3) -} - -type dealProposals3 struct { - adt.Array -} - -func (s *dealProposals3) Get(dealID abi.DealID) (*DealProposal, bool, error) { - var proposal3 market3.DealProposal - found, err := s.Array.Get(uint64(dealID), &proposal3) - if err != nil { - return nil, false, err - } - if !found { - return nil, false, nil - } - proposal := fromV3DealProposal(proposal3) - return &proposal, true, nil -} - -func (s *dealProposals3) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { - var dp3 market3.DealProposal - return s.Array.ForEach(&dp3, func(idx int64) error { - return cb(abi.DealID(idx), fromV3DealProposal(dp3)) - }) -} - -func (s *dealProposals3) decode(val *cbg.Deferred) (*DealProposal, error) { - var dp3 market3.DealProposal - if err := dp3.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return nil, err - } - dp := fromV3DealProposal(dp3) - return &dp, nil -} - -func (s *dealProposals3) array() adt.Array { - return s.Array -} - -func fromV3DealProposal(v3 market3.DealProposal) DealProposal { - return (DealProposal)(v3) -} - -func (s *state3) GetState() interface{} { - return &s.State -} - -var _ PublishStorageDealsReturn = (*publishStorageDealsReturn3)(nil) - -func decodePublishStorageDealsReturn3(b []byte) (PublishStorageDealsReturn, error) { - var retval market3.PublishStorageDealsReturn - if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { - return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) - } - - return &publishStorageDealsReturn3{retval}, nil -} - -type publishStorageDealsReturn3 struct { - market3.PublishStorageDealsReturn -} - -func (r *publishStorageDealsReturn3) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - -} - -func (r *publishStorageDealsReturn3) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil -} diff --git a/pkg/types/specactors/builtin/market/v4.go b/pkg/types/specactors/builtin/market/v4.go deleted file mode 100644 index c63e387e7e..0000000000 --- a/pkg/types/specactors/builtin/market/v4.go +++ /dev/null @@ -1,255 +0,0 @@ -// FETCHED FROM LOTUS: builtin/market/state.go.template - -package market - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - types "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" - adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" -) - -var _ State = (*state4)(nil) - -func load4(store adt.Store, root cid.Cid) (State, error) { - out := state4{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make4(store adt.Store) (State, error) { - out := state4{store: store} - - s, err := market4.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state4 struct { - market4.State - store adt.Store -} - -func (s *state4) TotalLocked() (abi.TokenAmount, error) { - fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) - fml = types.BigAdd(fml, s.TotalClientStorageFee) - return fml, nil -} - -func (s *state4) BalancesChanged(otherState State) (bool, error) { - otherState4, ok := otherState.(*state4) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.EscrowTable.Equals(otherState4.State.EscrowTable) || !s.State.LockedTable.Equals(otherState4.State.LockedTable), nil -} - -func (s *state4) StatesChanged(otherState State) (bool, error) { - otherState4, ok := otherState.(*state4) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.States.Equals(otherState4.State.States), nil -} - -func (s *state4) States() (DealStates, error) { - stateArray, err := adt4.AsArray(s.store, s.State.States, market4.StatesAmtBitwidth) - if err != nil { - return nil, err - } - return &dealStates4{stateArray}, nil -} - -func (s *state4) ProposalsChanged(otherState State) (bool, error) { - otherState4, ok := otherState.(*state4) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.Proposals.Equals(otherState4.State.Proposals), nil -} - -func (s *state4) Proposals() (DealProposals, error) { - proposalArray, err := adt4.AsArray(s.store, s.State.Proposals, market4.ProposalsAmtBitwidth) - if err != nil { - return nil, err - } - return &dealProposals4{proposalArray}, nil -} - -func (s *state4) EscrowTable() (BalanceTable, error) { - bt, err := adt4.AsBalanceTable(s.store, s.State.EscrowTable) - if err != nil { - return nil, err - } - return &balanceTable4{bt}, nil -} - -func (s *state4) LockedTable() (BalanceTable, error) { - bt, err := adt4.AsBalanceTable(s.store, s.State.LockedTable) - if err != nil { - return nil, err - } - return &balanceTable4{bt}, nil -} - -func (s *state4) VerifyDealsForActivation( - minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, -) (weight, verifiedWeight abi.DealWeight, err error) { - w, vw, _, err := market4.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) - return w, vw, err -} - -func (s *state4) NextID() (abi.DealID, error) { - return s.State.NextID, nil -} - -type balanceTable4 struct { - *adt4.BalanceTable -} - -func (bt *balanceTable4) ForEach(cb func(address.Address, abi.TokenAmount) error) error { - asMap := (*adt4.Map)(bt.BalanceTable) - var ta abi.TokenAmount - return asMap.ForEach(&ta, func(key string) error { - a, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(a, ta) - }) -} - -type dealStates4 struct { - adt.Array -} - -func (s *dealStates4) Get(dealID abi.DealID) (*DealState, bool, error) { - var deal4 market4.DealState - found, err := s.Array.Get(uint64(dealID), &deal4) - if err != nil { - return nil, false, err - } - if !found { - return nil, false, nil - } - deal := fromV4DealState(deal4) - return &deal, true, nil -} - -func (s *dealStates4) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { - var ds4 market4.DealState - return s.Array.ForEach(&ds4, func(idx int64) error { - return cb(abi.DealID(idx), fromV4DealState(ds4)) - }) -} - -func (s *dealStates4) decode(val *cbg.Deferred) (*DealState, error) { - var ds4 market4.DealState - if err := ds4.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return nil, err - } - ds := fromV4DealState(ds4) - return &ds, nil -} - -func (s *dealStates4) array() adt.Array { - return s.Array -} - -func fromV4DealState(v4 market4.DealState) DealState { - return (DealState)(v4) -} - -type dealProposals4 struct { - adt.Array -} - -func (s *dealProposals4) Get(dealID abi.DealID) (*DealProposal, bool, error) { - var proposal4 market4.DealProposal - found, err := s.Array.Get(uint64(dealID), &proposal4) - if err != nil { - return nil, false, err - } - if !found { - return nil, false, nil - } - proposal := fromV4DealProposal(proposal4) - return &proposal, true, nil -} - -func (s *dealProposals4) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { - var dp4 market4.DealProposal - return s.Array.ForEach(&dp4, func(idx int64) error { - return cb(abi.DealID(idx), fromV4DealProposal(dp4)) - }) -} - -func (s *dealProposals4) decode(val *cbg.Deferred) (*DealProposal, error) { - var dp4 market4.DealProposal - if err := dp4.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return nil, err - } - dp := fromV4DealProposal(dp4) - return &dp, nil -} - -func (s *dealProposals4) array() adt.Array { - return s.Array -} - -func fromV4DealProposal(v4 market4.DealProposal) DealProposal { - return (DealProposal)(v4) -} - -func (s *state4) GetState() interface{} { - return &s.State -} - -var _ PublishStorageDealsReturn = (*publishStorageDealsReturn4)(nil) - -func decodePublishStorageDealsReturn4(b []byte) (PublishStorageDealsReturn, error) { - var retval market4.PublishStorageDealsReturn - if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { - return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) - } - - return &publishStorageDealsReturn4{retval}, nil -} - -type publishStorageDealsReturn4 struct { - market4.PublishStorageDealsReturn -} - -func (r *publishStorageDealsReturn4) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - -} - -func (r *publishStorageDealsReturn4) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil -} diff --git a/pkg/types/specactors/builtin/market/v5.go b/pkg/types/specactors/builtin/market/v5.go deleted file mode 100644 index 3c85a56891..0000000000 --- a/pkg/types/specactors/builtin/market/v5.go +++ /dev/null @@ -1,255 +0,0 @@ -// FETCHED FROM LOTUS: builtin/market/state.go.template - -package market - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - types "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" - adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" -) - -var _ State = (*state5)(nil) - -func load5(store adt.Store, root cid.Cid) (State, error) { - out := state5{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make5(store adt.Store) (State, error) { - out := state5{store: store} - - s, err := market5.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state5 struct { - market5.State - store adt.Store -} - -func (s *state5) TotalLocked() (abi.TokenAmount, error) { - fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) - fml = types.BigAdd(fml, s.TotalClientStorageFee) - return fml, nil -} - -func (s *state5) BalancesChanged(otherState State) (bool, error) { - otherState5, ok := otherState.(*state5) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.EscrowTable.Equals(otherState5.State.EscrowTable) || !s.State.LockedTable.Equals(otherState5.State.LockedTable), nil -} - -func (s *state5) StatesChanged(otherState State) (bool, error) { - otherState5, ok := otherState.(*state5) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.States.Equals(otherState5.State.States), nil -} - -func (s *state5) States() (DealStates, error) { - stateArray, err := adt5.AsArray(s.store, s.State.States, market5.StatesAmtBitwidth) - if err != nil { - return nil, err - } - return &dealStates5{stateArray}, nil -} - -func (s *state5) ProposalsChanged(otherState State) (bool, error) { - otherState5, ok := otherState.(*state5) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.Proposals.Equals(otherState5.State.Proposals), nil -} - -func (s *state5) Proposals() (DealProposals, error) { - proposalArray, err := adt5.AsArray(s.store, s.State.Proposals, market5.ProposalsAmtBitwidth) - if err != nil { - return nil, err - } - return &dealProposals5{proposalArray}, nil -} - -func (s *state5) EscrowTable() (BalanceTable, error) { - bt, err := adt5.AsBalanceTable(s.store, s.State.EscrowTable) - if err != nil { - return nil, err - } - return &balanceTable5{bt}, nil -} - -func (s *state5) LockedTable() (BalanceTable, error) { - bt, err := adt5.AsBalanceTable(s.store, s.State.LockedTable) - if err != nil { - return nil, err - } - return &balanceTable5{bt}, nil -} - -func (s *state5) VerifyDealsForActivation( - minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, -) (weight, verifiedWeight abi.DealWeight, err error) { - w, vw, _, err := market5.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) - return w, vw, err -} - -func (s *state5) NextID() (abi.DealID, error) { - return s.State.NextID, nil -} - -type balanceTable5 struct { - *adt5.BalanceTable -} - -func (bt *balanceTable5) ForEach(cb func(address.Address, abi.TokenAmount) error) error { - asMap := (*adt5.Map)(bt.BalanceTable) - var ta abi.TokenAmount - return asMap.ForEach(&ta, func(key string) error { - a, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(a, ta) - }) -} - -type dealStates5 struct { - adt.Array -} - -func (s *dealStates5) Get(dealID abi.DealID) (*DealState, bool, error) { - var deal5 market5.DealState - found, err := s.Array.Get(uint64(dealID), &deal5) - if err != nil { - return nil, false, err - } - if !found { - return nil, false, nil - } - deal := fromV5DealState(deal5) - return &deal, true, nil -} - -func (s *dealStates5) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { - var ds5 market5.DealState - return s.Array.ForEach(&ds5, func(idx int64) error { - return cb(abi.DealID(idx), fromV5DealState(ds5)) - }) -} - -func (s *dealStates5) decode(val *cbg.Deferred) (*DealState, error) { - var ds5 market5.DealState - if err := ds5.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return nil, err - } - ds := fromV5DealState(ds5) - return &ds, nil -} - -func (s *dealStates5) array() adt.Array { - return s.Array -} - -func fromV5DealState(v5 market5.DealState) DealState { - return (DealState)(v5) -} - -type dealProposals5 struct { - adt.Array -} - -func (s *dealProposals5) Get(dealID abi.DealID) (*DealProposal, bool, error) { - var proposal5 market5.DealProposal - found, err := s.Array.Get(uint64(dealID), &proposal5) - if err != nil { - return nil, false, err - } - if !found { - return nil, false, nil - } - proposal := fromV5DealProposal(proposal5) - return &proposal, true, nil -} - -func (s *dealProposals5) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { - var dp5 market5.DealProposal - return s.Array.ForEach(&dp5, func(idx int64) error { - return cb(abi.DealID(idx), fromV5DealProposal(dp5)) - }) -} - -func (s *dealProposals5) decode(val *cbg.Deferred) (*DealProposal, error) { - var dp5 market5.DealProposal - if err := dp5.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return nil, err - } - dp := fromV5DealProposal(dp5) - return &dp, nil -} - -func (s *dealProposals5) array() adt.Array { - return s.Array -} - -func fromV5DealProposal(v5 market5.DealProposal) DealProposal { - return (DealProposal)(v5) -} - -func (s *state5) GetState() interface{} { - return &s.State -} - -var _ PublishStorageDealsReturn = (*publishStorageDealsReturn5)(nil) - -func decodePublishStorageDealsReturn5(b []byte) (PublishStorageDealsReturn, error) { - var retval market5.PublishStorageDealsReturn - if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { - return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) - } - - return &publishStorageDealsReturn5{retval}, nil -} - -type publishStorageDealsReturn5 struct { - market5.PublishStorageDealsReturn -} - -func (r *publishStorageDealsReturn5) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - -} - -func (r *publishStorageDealsReturn5) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil -} diff --git a/pkg/types/specactors/builtin/market/v6.go b/pkg/types/specactors/builtin/market/v6.go deleted file mode 100644 index 927cf08542..0000000000 --- a/pkg/types/specactors/builtin/market/v6.go +++ /dev/null @@ -1,254 +0,0 @@ -// FETCHED FROM LOTUS: builtin/market/state.go.template - -package market - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - types "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" - adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" -) - -var _ State = (*state6)(nil) - -func load6(store adt.Store, root cid.Cid) (State, error) { - out := state6{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make6(store adt.Store) (State, error) { - out := state6{store: store} - - s, err := market6.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state6 struct { - market6.State - store adt.Store -} - -func (s *state6) TotalLocked() (abi.TokenAmount, error) { - fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) - fml = types.BigAdd(fml, s.TotalClientStorageFee) - return fml, nil -} - -func (s *state6) BalancesChanged(otherState State) (bool, error) { - otherState6, ok := otherState.(*state6) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.EscrowTable.Equals(otherState6.State.EscrowTable) || !s.State.LockedTable.Equals(otherState6.State.LockedTable), nil -} - -func (s *state6) StatesChanged(otherState State) (bool, error) { - otherState6, ok := otherState.(*state6) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.States.Equals(otherState6.State.States), nil -} - -func (s *state6) States() (DealStates, error) { - stateArray, err := adt6.AsArray(s.store, s.State.States, market6.StatesAmtBitwidth) - if err != nil { - return nil, err - } - return &dealStates6{stateArray}, nil -} - -func (s *state6) ProposalsChanged(otherState State) (bool, error) { - otherState6, ok := otherState.(*state6) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.Proposals.Equals(otherState6.State.Proposals), nil -} - -func (s *state6) Proposals() (DealProposals, error) { - proposalArray, err := adt6.AsArray(s.store, s.State.Proposals, market6.ProposalsAmtBitwidth) - if err != nil { - return nil, err - } - return &dealProposals6{proposalArray}, nil -} - -func (s *state6) EscrowTable() (BalanceTable, error) { - bt, err := adt6.AsBalanceTable(s.store, s.State.EscrowTable) - if err != nil { - return nil, err - } - return &balanceTable6{bt}, nil -} - -func (s *state6) LockedTable() (BalanceTable, error) { - bt, err := adt6.AsBalanceTable(s.store, s.State.LockedTable) - if err != nil { - return nil, err - } - return &balanceTable6{bt}, nil -} - -func (s *state6) VerifyDealsForActivation( - minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, -) (weight, verifiedWeight abi.DealWeight, err error) { - w, vw, _, err := market6.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) - return w, vw, err -} - -func (s *state6) NextID() (abi.DealID, error) { - return s.State.NextID, nil -} - -type balanceTable6 struct { - *adt6.BalanceTable -} - -func (bt *balanceTable6) ForEach(cb func(address.Address, abi.TokenAmount) error) error { - asMap := (*adt6.Map)(bt.BalanceTable) - var ta abi.TokenAmount - return asMap.ForEach(&ta, func(key string) error { - a, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(a, ta) - }) -} - -type dealStates6 struct { - adt.Array -} - -func (s *dealStates6) Get(dealID abi.DealID) (*DealState, bool, error) { - var deal6 market6.DealState - found, err := s.Array.Get(uint64(dealID), &deal6) - if err != nil { - return nil, false, err - } - if !found { - return nil, false, nil - } - deal := fromV6DealState(deal6) - return &deal, true, nil -} - -func (s *dealStates6) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { - var ds6 market6.DealState - return s.Array.ForEach(&ds6, func(idx int64) error { - return cb(abi.DealID(idx), fromV6DealState(ds6)) - }) -} - -func (s *dealStates6) decode(val *cbg.Deferred) (*DealState, error) { - var ds6 market6.DealState - if err := ds6.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return nil, err - } - ds := fromV6DealState(ds6) - return &ds, nil -} - -func (s *dealStates6) array() adt.Array { - return s.Array -} - -func fromV6DealState(v6 market6.DealState) DealState { - return (DealState)(v6) -} - -type dealProposals6 struct { - adt.Array -} - -func (s *dealProposals6) Get(dealID abi.DealID) (*DealProposal, bool, error) { - var proposal6 market6.DealProposal - found, err := s.Array.Get(uint64(dealID), &proposal6) - if err != nil { - return nil, false, err - } - if !found { - return nil, false, nil - } - proposal := fromV6DealProposal(proposal6) - return &proposal, true, nil -} - -func (s *dealProposals6) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { - var dp6 market6.DealProposal - return s.Array.ForEach(&dp6, func(idx int64) error { - return cb(abi.DealID(idx), fromV6DealProposal(dp6)) - }) -} - -func (s *dealProposals6) decode(val *cbg.Deferred) (*DealProposal, error) { - var dp6 market6.DealProposal - if err := dp6.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return nil, err - } - dp := fromV6DealProposal(dp6) - return &dp, nil -} - -func (s *dealProposals6) array() adt.Array { - return s.Array -} - -func fromV6DealProposal(v6 market6.DealProposal) DealProposal { - return (DealProposal)(v6) -} - -func (s *state6) GetState() interface{} { - return &s.State -} - -var _ PublishStorageDealsReturn = (*publishStorageDealsReturn6)(nil) - -func decodePublishStorageDealsReturn6(b []byte) (PublishStorageDealsReturn, error) { - var retval market6.PublishStorageDealsReturn - if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { - return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) - } - - return &publishStorageDealsReturn6{retval}, nil -} - -type publishStorageDealsReturn6 struct { - market6.PublishStorageDealsReturn -} - -func (r *publishStorageDealsReturn6) IsDealValid(index uint64) (bool, error) { - - return r.ValidDeals.IsSet(index) - -} - -func (r *publishStorageDealsReturn6) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil -} diff --git a/pkg/types/specactors/builtin/market/v7.go b/pkg/types/specactors/builtin/market/v7.go deleted file mode 100644 index 6edbebb6e7..0000000000 --- a/pkg/types/specactors/builtin/market/v7.go +++ /dev/null @@ -1,254 +0,0 @@ -// FETCHED FROM LOTUS: builtin/market/state.go.template - -package market - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - types "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" - adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" -) - -var _ State = (*state7)(nil) - -func load7(store adt.Store, root cid.Cid) (State, error) { - out := state7{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make7(store adt.Store) (State, error) { - out := state7{store: store} - - s, err := market7.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state7 struct { - market7.State - store adt.Store -} - -func (s *state7) TotalLocked() (abi.TokenAmount, error) { - fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) - fml = types.BigAdd(fml, s.TotalClientStorageFee) - return fml, nil -} - -func (s *state7) BalancesChanged(otherState State) (bool, error) { - otherState7, ok := otherState.(*state7) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.EscrowTable.Equals(otherState7.State.EscrowTable) || !s.State.LockedTable.Equals(otherState7.State.LockedTable), nil -} - -func (s *state7) StatesChanged(otherState State) (bool, error) { - otherState7, ok := otherState.(*state7) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.States.Equals(otherState7.State.States), nil -} - -func (s *state7) States() (DealStates, error) { - stateArray, err := adt7.AsArray(s.store, s.State.States, market7.StatesAmtBitwidth) - if err != nil { - return nil, err - } - return &dealStates7{stateArray}, nil -} - -func (s *state7) ProposalsChanged(otherState State) (bool, error) { - otherState7, ok := otherState.(*state7) - if !ok { - // there's no way to compare different versions of the state, so let's - // just say that means the state of balances has changed - return true, nil - } - return !s.State.Proposals.Equals(otherState7.State.Proposals), nil -} - -func (s *state7) Proposals() (DealProposals, error) { - proposalArray, err := adt7.AsArray(s.store, s.State.Proposals, market7.ProposalsAmtBitwidth) - if err != nil { - return nil, err - } - return &dealProposals7{proposalArray}, nil -} - -func (s *state7) EscrowTable() (BalanceTable, error) { - bt, err := adt7.AsBalanceTable(s.store, s.State.EscrowTable) - if err != nil { - return nil, err - } - return &balanceTable7{bt}, nil -} - -func (s *state7) LockedTable() (BalanceTable, error) { - bt, err := adt7.AsBalanceTable(s.store, s.State.LockedTable) - if err != nil { - return nil, err - } - return &balanceTable7{bt}, nil -} - -func (s *state7) VerifyDealsForActivation( - minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, -) (weight, verifiedWeight abi.DealWeight, err error) { - w, vw, _, err := market7.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) - return w, vw, err -} - -func (s *state7) NextID() (abi.DealID, error) { - return s.State.NextID, nil -} - -type balanceTable7 struct { - *adt7.BalanceTable -} - -func (bt *balanceTable7) ForEach(cb func(address.Address, abi.TokenAmount) error) error { - asMap := (*adt7.Map)(bt.BalanceTable) - var ta abi.TokenAmount - return asMap.ForEach(&ta, func(key string) error { - a, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(a, ta) - }) -} - -type dealStates7 struct { - adt.Array -} - -func (s *dealStates7) Get(dealID abi.DealID) (*DealState, bool, error) { - var deal7 market7.DealState - found, err := s.Array.Get(uint64(dealID), &deal7) - if err != nil { - return nil, false, err - } - if !found { - return nil, false, nil - } - deal := fromV7DealState(deal7) - return &deal, true, nil -} - -func (s *dealStates7) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { - var ds7 market7.DealState - return s.Array.ForEach(&ds7, func(idx int64) error { - return cb(abi.DealID(idx), fromV7DealState(ds7)) - }) -} - -func (s *dealStates7) decode(val *cbg.Deferred) (*DealState, error) { - var ds7 market7.DealState - if err := ds7.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return nil, err - } - ds := fromV7DealState(ds7) - return &ds, nil -} - -func (s *dealStates7) array() adt.Array { - return s.Array -} - -func fromV7DealState(v7 market7.DealState) DealState { - return (DealState)(v7) -} - -type dealProposals7 struct { - adt.Array -} - -func (s *dealProposals7) Get(dealID abi.DealID) (*DealProposal, bool, error) { - var proposal7 market7.DealProposal - found, err := s.Array.Get(uint64(dealID), &proposal7) - if err != nil { - return nil, false, err - } - if !found { - return nil, false, nil - } - proposal := fromV7DealProposal(proposal7) - return &proposal, true, nil -} - -func (s *dealProposals7) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { - var dp7 market7.DealProposal - return s.Array.ForEach(&dp7, func(idx int64) error { - return cb(abi.DealID(idx), fromV7DealProposal(dp7)) - }) -} - -func (s *dealProposals7) decode(val *cbg.Deferred) (*DealProposal, error) { - var dp7 market7.DealProposal - if err := dp7.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return nil, err - } - dp := fromV7DealProposal(dp7) - return &dp, nil -} - -func (s *dealProposals7) array() adt.Array { - return s.Array -} - -func fromV7DealProposal(v7 market7.DealProposal) DealProposal { - return (DealProposal)(v7) -} - -func (s *state7) GetState() interface{} { - return &s.State -} - -var _ PublishStorageDealsReturn = (*publishStorageDealsReturn7)(nil) - -func decodePublishStorageDealsReturn7(b []byte) (PublishStorageDealsReturn, error) { - var retval market7.PublishStorageDealsReturn - if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { - return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) - } - - return &publishStorageDealsReturn7{retval}, nil -} - -type publishStorageDealsReturn7 struct { - market7.PublishStorageDealsReturn -} - -func (r *publishStorageDealsReturn7) IsDealValid(index uint64) (bool, error) { - - return r.ValidDeals.IsSet(index) - -} - -func (r *publishStorageDealsReturn7) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil -} diff --git a/pkg/types/specactors/builtin/miner/actor.go.template b/pkg/types/specactors/builtin/miner/actor.go.template deleted file mode 100644 index b58e5d82d3..0000000000 --- a/pkg/types/specactors/builtin/miner/actor.go.template +++ /dev/null @@ -1,325 +0,0 @@ -// FETCHED FROM LOTUS: builtin/miner/actor.go.template - -package miner - -import ( - "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/network" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/cbor" - "github.com/filecoin-project/go-state-types/dline" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - types "github.com/filecoin-project/venus/pkg/types/internal" - - miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" - miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" - miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" - miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" -{{range .versions}} - builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" -{{end}} -) - -func init() { -{{range .versions}} - builtin.RegisterActorState(builtin{{.}}.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) -{{end}} -} - -var Methods = builtin{{.latestVersion}}.MethodsMiner - -// Unchanged between v0, v2, v3, v4, and v5 actors -var WPoStProvingPeriod = miner0.WPoStProvingPeriod -var WPoStPeriodDeadlines = miner0.WPoStPeriodDeadlines -var WPoStChallengeWindow = miner0.WPoStChallengeWindow -var WPoStChallengeLookback = miner0.WPoStChallengeLookback -var FaultDeclarationCutoff = miner0.FaultDeclarationCutoff - -const MinSectorExpiration = miner0.MinSectorExpiration - -// Not used / checked in v0 -// TODO: Abstract over network versions -var DeclarationsMax = miner2.DeclarationsMax -var AddressedSectorsMax = miner2.AddressedSectorsMax - -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { -{{range .versions}} - case builtin{{.}}.StorageMinerActorCodeID: - return load{{.}}(store, act.Head) -{{end}} -} - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version) (State, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return make{{.}}(store) -{{end}} -} - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return builtin{{.}}.StorageMinerActorCodeID, nil -{{end}} - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - cbor.Marshaler - - // Total available balance to spend. - AvailableBalance(abi.TokenAmount) (abi.TokenAmount, error) - // Funds that will vest by the given epoch. - VestedFunds(abi.ChainEpoch) (abi.TokenAmount, error) - // Funds locked for various reasons. - LockedFunds() (LockedFunds, error) - FeeDebt() (abi.TokenAmount, error) - - GetSector(abi.SectorNumber) (*SectorOnChainInfo, error) - FindSector(abi.SectorNumber) (*SectorLocation, error) - GetSectorExpiration(abi.SectorNumber) (*SectorExpiration, error) - GetPrecommittedSector(abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) - ForEachPrecommittedSector(func(SectorPreCommitOnChainInfo) error) error - LoadSectors(sectorNos *bitfield.BitField) ([]*SectorOnChainInfo, error) - NumLiveSectors() (uint64, error) - IsAllocated(abi.SectorNumber) (bool, error) - // UnallocatedSectorNumbers returns up to count unallocated sector numbers (or less than - // count if there aren't enough). - UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) - GetAllocatedSectors() (*bitfield.BitField, error) - - // Note that ProvingPeriodStart is deprecated and will be renamed / removed in a future version of actors - GetProvingPeriodStart() (abi.ChainEpoch, error) - // Testing only - EraseAllUnproven() error - - LoadDeadline(idx uint64) (Deadline, error) - ForEachDeadline(cb func(idx uint64, dl Deadline) error) error - NumDeadlines() (uint64, error) - DeadlinesChanged(State) (bool, error) - - Info() (MinerInfo, error) - MinerInfoChanged(State) (bool, error) - - DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) - DeadlineCronActive() (bool, error) - - // Diff helpers. Used by Diff* functions internally. - sectors() (adt.Array, error) - decodeSectorOnChainInfo(*cbg.Deferred) (SectorOnChainInfo, error) - precommits() (adt.Map, error) - decodeSectorPreCommitOnChainInfo(*cbg.Deferred) (SectorPreCommitOnChainInfo, error) - GetState() interface{} -} - -type Deadline interface { - LoadPartition(idx uint64) (Partition, error) - ForEachPartition(cb func(idx uint64, part Partition) error) error - PartitionsPoSted() (bitfield.BitField, error) - - PartitionsChanged(Deadline) (bool, error) - DisputableProofCount() (uint64, error) -} - -type Partition interface { - // AllSectors returns all sector numbers in this partition, including faulty, unproven, and terminated sectors - AllSectors() (bitfield.BitField, error) - - // Subset of sectors detected/declared faulty and not yet recovered (excl. from PoSt). - // Faults ∩ Terminated = ∅ - FaultySectors() (bitfield.BitField, error) - - // Subset of faulty sectors expected to recover on next PoSt - // Recoveries ∩ Terminated = ∅ - RecoveringSectors() (bitfield.BitField, error) - - // Live sectors are those that are not terminated (but may be faulty). - LiveSectors() (bitfield.BitField, error) - - // Active sectors are those that are neither terminated nor faulty nor unproven, i.e. actively contributing power. - ActiveSectors() (bitfield.BitField, error) - - // Unproven sectors in this partition. This bitfield will be cleared on - // a successful window post (or at the end of the partition's next - // deadline). At that time, any still unproven sectors will be added to - // the faulty sector bitfield. - UnprovenSectors() (bitfield.BitField, error) -} - -type SectorOnChainInfo struct { - SectorNumber abi.SectorNumber - SealProof abi.RegisteredSealProof - SealedCID cid.Cid - DealIDs []abi.DealID - Activation abi.ChainEpoch - Expiration abi.ChainEpoch - DealWeight abi.DealWeight - VerifiedDealWeight abi.DealWeight - InitialPledge abi.TokenAmount - ExpectedDayReward abi.TokenAmount - ExpectedStoragePledge abi.TokenAmount - SectorKeyCID *cid.Cid -} - -type SectorPreCommitInfo = miner0.SectorPreCommitInfo - -type SectorPreCommitOnChainInfo struct { - Info SectorPreCommitInfo - PreCommitDeposit abi.TokenAmount - PreCommitEpoch abi.ChainEpoch - DealWeight abi.DealWeight - VerifiedDealWeight abi.DealWeight -} - -type PoStPartition = miner0.PoStPartition -type RecoveryDeclaration = miner0.RecoveryDeclaration -type FaultDeclaration = miner0.FaultDeclaration - -// Params -type DeclareFaultsParams = miner0.DeclareFaultsParams -type DeclareFaultsRecoveredParams = miner0.DeclareFaultsRecoveredParams -type SubmitWindowedPoStParams = miner0.SubmitWindowedPoStParams -type ProveCommitSectorParams = miner0.ProveCommitSectorParams -type DisputeWindowedPoStParams = miner3.DisputeWindowedPoStParams -type ProveCommitAggregateParams = miner5.ProveCommitAggregateParams - -func PreferredSealProofTypeFromWindowPoStType(nver network.Version, proof abi.RegisteredPoStProof) (abi.RegisteredSealProof, error) { - // We added support for the new proofs in network version 7, and removed support for the old - // ones in network version 8. - if nver < network.Version7 { - switch proof { - case abi.RegisteredPoStProof_StackedDrgWindow2KiBV1: - return abi.RegisteredSealProof_StackedDrg2KiBV1, nil - case abi.RegisteredPoStProof_StackedDrgWindow8MiBV1: - return abi.RegisteredSealProof_StackedDrg8MiBV1, nil - case abi.RegisteredPoStProof_StackedDrgWindow512MiBV1: - return abi.RegisteredSealProof_StackedDrg512MiBV1, nil - case abi.RegisteredPoStProof_StackedDrgWindow32GiBV1: - return abi.RegisteredSealProof_StackedDrg32GiBV1, nil - case abi.RegisteredPoStProof_StackedDrgWindow64GiBV1: - return abi.RegisteredSealProof_StackedDrg64GiBV1, nil - default: - return -1, xerrors.Errorf("unrecognized window post type: %d", proof) - } - } - - switch proof { - case abi.RegisteredPoStProof_StackedDrgWindow2KiBV1: - return abi.RegisteredSealProof_StackedDrg2KiBV1_1, nil - case abi.RegisteredPoStProof_StackedDrgWindow8MiBV1: - return abi.RegisteredSealProof_StackedDrg8MiBV1_1, nil - case abi.RegisteredPoStProof_StackedDrgWindow512MiBV1: - return abi.RegisteredSealProof_StackedDrg512MiBV1_1, nil - case abi.RegisteredPoStProof_StackedDrgWindow32GiBV1: - return abi.RegisteredSealProof_StackedDrg32GiBV1_1, nil - case abi.RegisteredPoStProof_StackedDrgWindow64GiBV1: - return abi.RegisteredSealProof_StackedDrg64GiBV1_1, nil - default: - return -1, xerrors.Errorf("unrecognized window post type: %d", proof) - } -} - -func WinningPoStProofTypeFromWindowPoStProofType(nver network.Version, proof abi.RegisteredPoStProof) (abi.RegisteredPoStProof, error) { - switch proof { - case abi.RegisteredPoStProof_StackedDrgWindow2KiBV1: - return abi.RegisteredPoStProof_StackedDrgWinning2KiBV1, nil - case abi.RegisteredPoStProof_StackedDrgWindow8MiBV1: - return abi.RegisteredPoStProof_StackedDrgWinning8MiBV1, nil - case abi.RegisteredPoStProof_StackedDrgWindow512MiBV1: - return abi.RegisteredPoStProof_StackedDrgWinning512MiBV1, nil - case abi.RegisteredPoStProof_StackedDrgWindow32GiBV1: - return abi.RegisteredPoStProof_StackedDrgWinning32GiBV1, nil - case abi.RegisteredPoStProof_StackedDrgWindow64GiBV1: - return abi.RegisteredPoStProof_StackedDrgWinning64GiBV1, nil - default: - return -1, xerrors.Errorf("unknown proof type %d", proof) - } -} - -type MinerInfo struct { - Owner address.Address // Must be an ID-address. - Worker address.Address // Must be an ID-address. - NewWorker address.Address // Must be an ID-address. - ControlAddresses []address.Address // Must be an ID-addresses. - WorkerChangeEpoch abi.ChainEpoch - PeerId *peer.ID - Multiaddrs []abi.Multiaddrs - WindowPoStProofType abi.RegisteredPoStProof - SectorSize abi.SectorSize - WindowPoStPartitionSectors uint64 - ConsensusFaultElapsed abi.ChainEpoch -} - -func (mi MinerInfo) IsController(addr address.Address) bool { - if addr == mi.Owner || addr == mi.Worker { - return true - } - - for _, ca := range mi.ControlAddresses { - if addr == ca { - return true - } - } - - return false -} - -type SectorExpiration struct { - OnTime abi.ChainEpoch - - // non-zero if sector is faulty, epoch at which it will be permanently - // removed if it doesn't recover - Early abi.ChainEpoch -} - -type SectorLocation struct { - Deadline uint64 - Partition uint64 -} - -type SectorChanges struct { - Added []SectorOnChainInfo - Extended []SectorExtensions - Removed []SectorOnChainInfo -} - -type SectorExtensions struct { - From SectorOnChainInfo - To SectorOnChainInfo -} - -type PreCommitChanges struct { - Added []SectorPreCommitOnChainInfo - Removed []SectorPreCommitOnChainInfo -} - -type LockedFunds struct { - VestingFunds abi.TokenAmount - InitialPledgeRequirement abi.TokenAmount - PreCommitDeposits abi.TokenAmount -} - -func (lf LockedFunds) TotalLockedFunds() abi.TokenAmount { - return big.Add(lf.VestingFunds, big.Add(lf.InitialPledgeRequirement, lf.PreCommitDeposits)) -} diff --git a/pkg/types/specactors/builtin/miner/diff.go b/pkg/types/specactors/builtin/miner/diff.go deleted file mode 100644 index 617090976a..0000000000 --- a/pkg/types/specactors/builtin/miner/diff.go +++ /dev/null @@ -1,127 +0,0 @@ -package miner - -import ( - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - cbg "github.com/whyrusleeping/cbor-gen" -) - -func DiffPreCommits(pre, cur State) (*PreCommitChanges, error) { - results := new(PreCommitChanges) - - prep, err := pre.precommits() - if err != nil { - return nil, err - } - - curp, err := cur.precommits() - if err != nil { - return nil, err - } - - err = adt.DiffAdtMap(prep, curp, &preCommitDiffer{results, pre, cur}) - if err != nil { - return nil, err - } - - return results, nil -} - -type preCommitDiffer struct { - Results *PreCommitChanges - pre, after State -} - -func (m *preCommitDiffer) AsKey(key string) (abi.Keyer, error) { - sector, err := abi.ParseUIntKey(key) - if err != nil { - return nil, err - } - return abi.UIntKey(sector), nil -} - -func (m *preCommitDiffer) Add(key string, val *cbg.Deferred) error { - sp, err := m.after.decodeSectorPreCommitOnChainInfo(val) - if err != nil { - return err - } - m.Results.Added = append(m.Results.Added, sp) - return nil -} - -func (m *preCommitDiffer) Modify(key string, from, to *cbg.Deferred) error { - return nil -} - -func (m *preCommitDiffer) Remove(key string, val *cbg.Deferred) error { - sp, err := m.pre.decodeSectorPreCommitOnChainInfo(val) - if err != nil { - return err - } - m.Results.Removed = append(m.Results.Removed, sp) - return nil -} - -func DiffSectors(pre, cur State) (*SectorChanges, error) { - results := new(SectorChanges) - - pres, err := pre.sectors() - if err != nil { - return nil, err - } - - curs, err := cur.sectors() - if err != nil { - return nil, err - } - - err = adt.DiffAdtArray(pres, curs, §orDiffer{results, pre, cur}) - if err != nil { - return nil, err - } - - return results, nil -} - -type sectorDiffer struct { - Results *SectorChanges - pre, after State -} - -func (m *sectorDiffer) Add(key uint64, val *cbg.Deferred) error { - si, err := m.after.decodeSectorOnChainInfo(val) - if err != nil { - return err - } - m.Results.Added = append(m.Results.Added, si) - return nil -} - -func (m *sectorDiffer) Modify(key uint64, from, to *cbg.Deferred) error { - siFrom, err := m.pre.decodeSectorOnChainInfo(from) - if err != nil { - return err - } - - siTo, err := m.after.decodeSectorOnChainInfo(to) - if err != nil { - return err - } - - if siFrom.Expiration != siTo.Expiration { - m.Results.Extended = append(m.Results.Extended, SectorExtensions{ - From: siFrom, - To: siTo, - }) - } - return nil -} - -func (m *sectorDiffer) Remove(key uint64, val *cbg.Deferred) error { - si, err := m.pre.decodeSectorOnChainInfo(val) - if err != nil { - return err - } - m.Results.Removed = append(m.Results.Removed, si) - return nil -} diff --git a/pkg/types/specactors/builtin/miner/diff_deadlines.go b/pkg/types/specactors/builtin/miner/diff_deadlines.go deleted file mode 100644 index 7d686ece5b..0000000000 --- a/pkg/types/specactors/builtin/miner/diff_deadlines.go +++ /dev/null @@ -1,176 +0,0 @@ -package miner - -import ( - "errors" - - "github.com/filecoin-project/go-bitfield" - "github.com/filecoin-project/go-state-types/exitcode" -) - -type DeadlinesDiff map[uint64]DeadlineDiff - -func DiffDeadlines(pre, cur State) (DeadlinesDiff, error) { - changed, err := pre.DeadlinesChanged(cur) - if err != nil { - return nil, err - } - if !changed { - return nil, nil - } - - dlDiff := make(DeadlinesDiff) - if err := pre.ForEachDeadline(func(idx uint64, preDl Deadline) error { - curDl, err := cur.LoadDeadline(idx) - if err != nil { - return err - } - - diff, err := DiffDeadline(preDl, curDl) - if err != nil { - return err - } - - dlDiff[idx] = diff - return nil - }); err != nil { - return nil, err - } - return dlDiff, nil -} - -type DeadlineDiff map[uint64]*PartitionDiff - -func DiffDeadline(pre, cur Deadline) (DeadlineDiff, error) { - changed, err := pre.PartitionsChanged(cur) - if err != nil { - return nil, err - } - if !changed { - return nil, nil - } - - partDiff := make(DeadlineDiff) - if err := pre.ForEachPartition(func(idx uint64, prePart Partition) error { - // try loading current partition at this index - curPart, err := cur.LoadPartition(idx) - if err != nil { - if errors.Is(err, exitcode.ErrNotFound) { - // TODO correctness? - return nil // the partition was removed. - } - return err - } - - // compare it with the previous partition - diff, err := DiffPartition(prePart, curPart) - if err != nil { - return err - } - - partDiff[idx] = diff - return nil - }); err != nil { - return nil, err - } - - // all previous partitions have been walked. - // all partitions in cur and not in prev are new... can they be faulty already? - // TODO is this correct? - if err := cur.ForEachPartition(func(idx uint64, curPart Partition) error { - if _, found := partDiff[idx]; found { - return nil - } - faults, err := curPart.FaultySectors() - if err != nil { - return err - } - recovering, err := curPart.RecoveringSectors() - if err != nil { - return err - } - partDiff[idx] = &PartitionDiff{ - Removed: bitfield.New(), - Recovered: bitfield.New(), - Faulted: faults, - Recovering: recovering, - } - - return nil - }); err != nil { - return nil, err - } - - return partDiff, nil -} - -type PartitionDiff struct { - Removed bitfield.BitField - Recovered bitfield.BitField - Faulted bitfield.BitField - Recovering bitfield.BitField -} - -func DiffPartition(pre, cur Partition) (*PartitionDiff, error) { - prevLiveSectors, err := pre.LiveSectors() - if err != nil { - return nil, err - } - curLiveSectors, err := cur.LiveSectors() - if err != nil { - return nil, err - } - - removed, err := bitfield.SubtractBitField(prevLiveSectors, curLiveSectors) - if err != nil { - return nil, err - } - - prevRecoveries, err := pre.RecoveringSectors() - if err != nil { - return nil, err - } - - curRecoveries, err := cur.RecoveringSectors() - if err != nil { - return nil, err - } - - recovering, err := bitfield.SubtractBitField(curRecoveries, prevRecoveries) - if err != nil { - return nil, err - } - - prevFaults, err := pre.FaultySectors() - if err != nil { - return nil, err - } - - curFaults, err := cur.FaultySectors() - if err != nil { - return nil, err - } - - faulted, err := bitfield.SubtractBitField(curFaults, prevFaults) - if err != nil { - return nil, err - } - - // all current good sectors - curActiveSectors, err := cur.ActiveSectors() - if err != nil { - return nil, err - } - - // sectors that were previously fault and are now currently active are considered recovered. - recovered, err := bitfield.IntersectBitField(prevFaults, curActiveSectors) - if err != nil { - return nil, err - } - - return &PartitionDiff{ - Removed: removed, - Recovered: recovered, - Faulted: faulted, - Recovering: recovering, - }, nil -} diff --git a/pkg/types/specactors/builtin/miner/miner.go b/pkg/types/specactors/builtin/miner/miner.go deleted file mode 100644 index a539834108..0000000000 --- a/pkg/types/specactors/builtin/miner/miner.go +++ /dev/null @@ -1,414 +0,0 @@ -// FETCHED FROM LOTUS: builtin/miner/actor.go.template - -package miner - -import ( - "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/network" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/cbor" - "github.com/filecoin-project/go-state-types/dline" - - types "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" - miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" - miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" - miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" -) - -func init() { - - builtin.RegisterActorState(builtin0.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - - builtin.RegisterActorState(builtin2.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - - builtin.RegisterActorState(builtin3.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - - builtin.RegisterActorState(builtin4.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - - builtin.RegisterActorState(builtin5.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - - builtin.RegisterActorState(builtin6.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - - builtin.RegisterActorState(builtin7.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) - -} - -var Methods = builtin7.MethodsMiner - -// Unchanged between v0, v2, v3, v4, and v5 actors -var WPoStProvingPeriod = miner0.WPoStProvingPeriod -var WPoStPeriodDeadlines = miner0.WPoStPeriodDeadlines -var WPoStChallengeWindow = miner0.WPoStChallengeWindow -var WPoStChallengeLookback = miner0.WPoStChallengeLookback -var FaultDeclarationCutoff = miner0.FaultDeclarationCutoff - -const MinSectorExpiration = miner0.MinSectorExpiration - -// Not used / checked in v0 -// TODO: Abstract over network versions -var DeclarationsMax = miner2.DeclarationsMax -var AddressedSectorsMax = miner2.AddressedSectorsMax - -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { - - case builtin0.StorageMinerActorCodeID: - return load0(store, act.Head) - - case builtin2.StorageMinerActorCodeID: - return load2(store, act.Head) - - case builtin3.StorageMinerActorCodeID: - return load3(store, act.Head) - - case builtin4.StorageMinerActorCodeID: - return load4(store, act.Head) - - case builtin5.StorageMinerActorCodeID: - return load5(store, act.Head) - - case builtin6.StorageMinerActorCodeID: - return load6(store, act.Head) - - case builtin7.StorageMinerActorCodeID: - return load7(store, act.Head) - - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version) (State, error) { - switch av { - - case actors.Version0: - return make0(store) - - case actors.Version2: - return make2(store) - - case actors.Version3: - return make3(store) - - case actors.Version4: - return make4(store) - - case actors.Version5: - return make5(store) - - case actors.Version6: - return make6(store) - - case actors.Version7: - return make7(store) - - } - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { - - case actors.Version0: - return builtin0.StorageMinerActorCodeID, nil - - case actors.Version2: - return builtin2.StorageMinerActorCodeID, nil - - case actors.Version3: - return builtin3.StorageMinerActorCodeID, nil - - case actors.Version4: - return builtin4.StorageMinerActorCodeID, nil - - case actors.Version5: - return builtin5.StorageMinerActorCodeID, nil - - case actors.Version6: - return builtin6.StorageMinerActorCodeID, nil - - case actors.Version7: - return builtin7.StorageMinerActorCodeID, nil - - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - cbor.Marshaler - - // Total available balance to spend. - AvailableBalance(abi.TokenAmount) (abi.TokenAmount, error) - // Funds that will vest by the given epoch. - VestedFunds(abi.ChainEpoch) (abi.TokenAmount, error) - // Funds locked for various reasons. - LockedFunds() (LockedFunds, error) - FeeDebt() (abi.TokenAmount, error) - - GetSector(abi.SectorNumber) (*SectorOnChainInfo, error) - FindSector(abi.SectorNumber) (*SectorLocation, error) - GetSectorExpiration(abi.SectorNumber) (*SectorExpiration, error) - GetPrecommittedSector(abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) - ForEachPrecommittedSector(func(SectorPreCommitOnChainInfo) error) error - LoadSectors(sectorNos *bitfield.BitField) ([]*SectorOnChainInfo, error) - NumLiveSectors() (uint64, error) - IsAllocated(abi.SectorNumber) (bool, error) - // UnallocatedSectorNumbers returns up to count unallocated sector numbers (or less than - // count if there aren't enough). - UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) - GetAllocatedSectors() (*bitfield.BitField, error) - - // Note that ProvingPeriodStart is deprecated and will be renamed / removed in a future version of actors - GetProvingPeriodStart() (abi.ChainEpoch, error) - // Testing only - EraseAllUnproven() error - - LoadDeadline(idx uint64) (Deadline, error) - ForEachDeadline(cb func(idx uint64, dl Deadline) error) error - NumDeadlines() (uint64, error) - DeadlinesChanged(State) (bool, error) - - Info() (MinerInfo, error) - MinerInfoChanged(State) (bool, error) - - DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) - DeadlineCronActive() (bool, error) - - // Diff helpers. Used by Diff* functions internally. - sectors() (adt.Array, error) - decodeSectorOnChainInfo(*cbg.Deferred) (SectorOnChainInfo, error) - precommits() (adt.Map, error) - decodeSectorPreCommitOnChainInfo(*cbg.Deferred) (SectorPreCommitOnChainInfo, error) - GetState() interface{} -} - -type Deadline interface { - LoadPartition(idx uint64) (Partition, error) - ForEachPartition(cb func(idx uint64, part Partition) error) error - PartitionsPoSted() (bitfield.BitField, error) - - PartitionsChanged(Deadline) (bool, error) - DisputableProofCount() (uint64, error) -} - -type Partition interface { - // AllSectors returns all sector numbers in this partition, including faulty, unproven, and terminated sectors - AllSectors() (bitfield.BitField, error) - - // Subset of sectors detected/declared faulty and not yet recovered (excl. from PoSt). - // Faults ∩ Terminated = ∅ - FaultySectors() (bitfield.BitField, error) - - // Subset of faulty sectors expected to recover on next PoSt - // Recoveries ∩ Terminated = ∅ - RecoveringSectors() (bitfield.BitField, error) - - // Live sectors are those that are not terminated (but may be faulty). - LiveSectors() (bitfield.BitField, error) - - // Active sectors are those that are neither terminated nor faulty nor unproven, i.e. actively contributing power. - ActiveSectors() (bitfield.BitField, error) - - // Unproven sectors in this partition. This bitfield will be cleared on - // a successful window post (or at the end of the partition's next - // deadline). At that time, any still unproven sectors will be added to - // the faulty sector bitfield. - UnprovenSectors() (bitfield.BitField, error) -} - -type SectorOnChainInfo struct { - SectorNumber abi.SectorNumber - SealProof abi.RegisteredSealProof - SealedCID cid.Cid - DealIDs []abi.DealID - Activation abi.ChainEpoch - Expiration abi.ChainEpoch - DealWeight abi.DealWeight - VerifiedDealWeight abi.DealWeight - InitialPledge abi.TokenAmount - ExpectedDayReward abi.TokenAmount - ExpectedStoragePledge abi.TokenAmount - SectorKeyCID *cid.Cid -} - -type SectorPreCommitInfo = miner0.SectorPreCommitInfo - -type SectorPreCommitOnChainInfo struct { - Info SectorPreCommitInfo - PreCommitDeposit abi.TokenAmount - PreCommitEpoch abi.ChainEpoch - DealWeight abi.DealWeight - VerifiedDealWeight abi.DealWeight -} - -type PoStPartition = miner0.PoStPartition -type RecoveryDeclaration = miner0.RecoveryDeclaration -type FaultDeclaration = miner0.FaultDeclaration - -// Params -type DeclareFaultsParams = miner0.DeclareFaultsParams -type DeclareFaultsRecoveredParams = miner0.DeclareFaultsRecoveredParams -type SubmitWindowedPoStParams = miner0.SubmitWindowedPoStParams -type ProveCommitSectorParams = miner0.ProveCommitSectorParams -type DisputeWindowedPoStParams = miner3.DisputeWindowedPoStParams -type ProveCommitAggregateParams = miner5.ProveCommitAggregateParams - -func PreferredSealProofTypeFromWindowPoStType(nver network.Version, proof abi.RegisteredPoStProof) (abi.RegisteredSealProof, error) { - // We added support for the new proofs in network version 7, and removed support for the old - // ones in network version 8. - if nver < network.Version7 { - switch proof { - case abi.RegisteredPoStProof_StackedDrgWindow2KiBV1: - return abi.RegisteredSealProof_StackedDrg2KiBV1, nil - case abi.RegisteredPoStProof_StackedDrgWindow8MiBV1: - return abi.RegisteredSealProof_StackedDrg8MiBV1, nil - case abi.RegisteredPoStProof_StackedDrgWindow512MiBV1: - return abi.RegisteredSealProof_StackedDrg512MiBV1, nil - case abi.RegisteredPoStProof_StackedDrgWindow32GiBV1: - return abi.RegisteredSealProof_StackedDrg32GiBV1, nil - case abi.RegisteredPoStProof_StackedDrgWindow64GiBV1: - return abi.RegisteredSealProof_StackedDrg64GiBV1, nil - default: - return -1, xerrors.Errorf("unrecognized window post type: %d", proof) - } - } - - switch proof { - case abi.RegisteredPoStProof_StackedDrgWindow2KiBV1: - return abi.RegisteredSealProof_StackedDrg2KiBV1_1, nil - case abi.RegisteredPoStProof_StackedDrgWindow8MiBV1: - return abi.RegisteredSealProof_StackedDrg8MiBV1_1, nil - case abi.RegisteredPoStProof_StackedDrgWindow512MiBV1: - return abi.RegisteredSealProof_StackedDrg512MiBV1_1, nil - case abi.RegisteredPoStProof_StackedDrgWindow32GiBV1: - return abi.RegisteredSealProof_StackedDrg32GiBV1_1, nil - case abi.RegisteredPoStProof_StackedDrgWindow64GiBV1: - return abi.RegisteredSealProof_StackedDrg64GiBV1_1, nil - default: - return -1, xerrors.Errorf("unrecognized window post type: %d", proof) - } -} - -func WinningPoStProofTypeFromWindowPoStProofType(nver network.Version, proof abi.RegisteredPoStProof) (abi.RegisteredPoStProof, error) { - switch proof { - case abi.RegisteredPoStProof_StackedDrgWindow2KiBV1: - return abi.RegisteredPoStProof_StackedDrgWinning2KiBV1, nil - case abi.RegisteredPoStProof_StackedDrgWindow8MiBV1: - return abi.RegisteredPoStProof_StackedDrgWinning8MiBV1, nil - case abi.RegisteredPoStProof_StackedDrgWindow512MiBV1: - return abi.RegisteredPoStProof_StackedDrgWinning512MiBV1, nil - case abi.RegisteredPoStProof_StackedDrgWindow32GiBV1: - return abi.RegisteredPoStProof_StackedDrgWinning32GiBV1, nil - case abi.RegisteredPoStProof_StackedDrgWindow64GiBV1: - return abi.RegisteredPoStProof_StackedDrgWinning64GiBV1, nil - default: - return -1, xerrors.Errorf("unknown proof type %d", proof) - } -} - -type MinerInfo struct { - Owner address.Address // Must be an ID-address. - Worker address.Address // Must be an ID-address. - NewWorker address.Address // Must be an ID-address. - ControlAddresses []address.Address // Must be an ID-addresses. - WorkerChangeEpoch abi.ChainEpoch - PeerId *peer.ID - Multiaddrs []abi.Multiaddrs - WindowPoStProofType abi.RegisteredPoStProof - SectorSize abi.SectorSize - WindowPoStPartitionSectors uint64 - ConsensusFaultElapsed abi.ChainEpoch -} - -func (mi MinerInfo) IsController(addr address.Address) bool { - if addr == mi.Owner || addr == mi.Worker { - return true - } - - for _, ca := range mi.ControlAddresses { - if addr == ca { - return true - } - } - - return false -} - -type SectorExpiration struct { - OnTime abi.ChainEpoch - - // non-zero if sector is faulty, epoch at which it will be permanently - // removed if it doesn't recover - Early abi.ChainEpoch -} - -type SectorLocation struct { - Deadline uint64 - Partition uint64 -} - -type SectorChanges struct { - Added []SectorOnChainInfo - Extended []SectorExtensions - Removed []SectorOnChainInfo -} - -type SectorExtensions struct { - From SectorOnChainInfo - To SectorOnChainInfo -} - -type PreCommitChanges struct { - Added []SectorPreCommitOnChainInfo - Removed []SectorPreCommitOnChainInfo -} - -type LockedFunds struct { - VestingFunds abi.TokenAmount - InitialPledgeRequirement abi.TokenAmount - PreCommitDeposits abi.TokenAmount -} - -func (lf LockedFunds) TotalLockedFunds() abi.TokenAmount { - return big.Add(lf.VestingFunds, big.Add(lf.InitialPledgeRequirement, lf.PreCommitDeposits)) -} diff --git a/pkg/types/specactors/builtin/miner/state.go.template b/pkg/types/specactors/builtin/miner/state.go.template deleted file mode 100644 index 76e96fc345..0000000000 --- a/pkg/types/specactors/builtin/miner/state.go.template +++ /dev/null @@ -1,605 +0,0 @@ -// FETCHED FROM LOTUS: builtin/miner/state.go.template - -package miner - -import ( - "bytes" - "errors" -{{if (le .v 1)}} - "github.com/filecoin-project/go-state-types/big" -{{end}} - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - -{{if (ge .v 3)}} - builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" -{{end}} - miner{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/miner" - adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" -) - -var _ State = (*state{{.v}})(nil) - -func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { - out := state{{.v}}{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make{{.v}}(store adt.Store) (State, error) { - out := state{{.v}}{store: store} - out.State = miner{{.v}}.State{} - return &out, nil -} - -type state{{.v}} struct { - miner{{.v}}.State - store adt.Store -} - -type deadline{{.v}} struct { - miner{{.v}}.Deadline - store adt.Store -} - -type partition{{.v}} struct { - miner{{.v}}.Partition - store adt.Store -} - -func (s *state{{.v}}) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { - defer func() { - if r := recover(); r != nil { - err = xerrors.Errorf("failed to get available balance: %w", r) - available = abi.NewTokenAmount(0) - } - }() - // this panics if the miner doesnt have enough funds to cover their locked pledge - available{{if (ge .v 2)}}, err{{end}} = s.GetAvailableBalance(bal) - return available, err -} - -func (s *state{{.v}}) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { - return s.CheckVestedFunds(s.store, epoch) -} - -func (s *state{{.v}}) LockedFunds() (LockedFunds, error) { - return LockedFunds{ - VestingFunds: s.State.LockedFunds, - InitialPledgeRequirement: s.State.InitialPledge{{if (le .v 1)}}Requirement{{end}}, - PreCommitDeposits: s.State.PreCommitDeposits, - }, nil -} - -func (s *state{{.v}}) FeeDebt() (abi.TokenAmount, error) { - return {{if (ge .v 2)}}s.State.FeeDebt{{else}}big.Zero(){{end}}, nil -} - -func (s *state{{.v}}) InitialPledge() (abi.TokenAmount, error) { - return s.State.InitialPledge{{if (le .v 1)}}Requirement{{end}}, nil -} - -func (s *state{{.v}}) PreCommitDeposits() (abi.TokenAmount, error) { - return s.State.PreCommitDeposits, nil -} - -func (s *state{{.v}}) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { - info, ok, err := s.State.GetSector(s.store, num) - if !ok || err != nil { - return nil, err - } - - ret := fromV{{.v}}SectorOnChainInfo(*info) - return &ret, nil -} - -func (s *state{{.v}}) FindSector(num abi.SectorNumber) (*SectorLocation, error) { - dlIdx, partIdx, err := s.State.FindSector(s.store, num) - if err != nil { - return nil, err - } - return &SectorLocation{ - Deadline: dlIdx, - Partition: partIdx, - }, nil -} - -func (s *state{{.v}}) NumLiveSectors() (uint64, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return 0, err - } - var total uint64 - if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner{{.v}}.Deadline) error { - total += dl.LiveSectors - return nil - }); err != nil { - return 0, err - } - return total, nil -} - -// GetSectorExpiration returns the effective expiration of the given sector. -// -// If the sector does not expire early, the Early expiration field is 0. -func (s *state{{.v}}) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return nil, err - } - // NOTE: this can be optimized significantly. -{{if (ge .v 7) -}} - // 1. If the sector is non-faulty, it will expire on-time (can be - // learned from the sector info). -{{- else -}} - // 1. If the sector is non-faulty, it will either expire on-time (can be - // learned from the sector info), or in the next quantized expiration - // epoch (i.e., the first element in the partition's expiration queue. -{{- end}} -{{if (ge .v 6) -}} - // 2. If it's faulty, it will expire early within the first 42 entries - // of the expiration queue. -{{- else -}} - // 2. If it's faulty, it will expire early within the first 14 entries - // of the expiration queue. -{{- end}} - - stopErr := errors.New("stop") - out := SectorExpiration{} - err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner{{.v}}.Deadline) error { - partitions, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - quant := s.State.QuantSpecForDeadline(dlIdx) - var part miner{{.v}}.Partition - return partitions.ForEach(&part, func(partIdx int64) error { - if found, err := part.Sectors.IsSet(uint64(num)); err != nil { - return err - } else if !found { - return nil - } - if found, err := part.Terminated.IsSet(uint64(num)); err != nil { - return err - } else if found { - // already terminated - return stopErr - } - - q, err := miner{{.v}}.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant{{if (ge .v 3)}}, miner{{.v}}.PartitionExpirationAmtBitwidth{{end}}) - if err != nil { - return err - } - var exp miner{{.v}}.ExpirationSet - return q.ForEach(&exp, func(epoch int64) error { - if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { - return err - } else if early { - out.Early = abi.ChainEpoch(epoch) - return nil - } - if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { - return err - } else if onTime { - out.OnTime = abi.ChainEpoch(epoch) - return stopErr - } - return nil - }) - }) - }) - if err == stopErr { - err = nil - } - if err != nil { - return nil, err - } - if out.Early == 0 && out.OnTime == 0 { - return nil, xerrors.Errorf("failed to find sector %d", num) - } - return &out, nil -} - -func (s *state{{.v}}) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { - info, ok, err := s.State.GetPrecommittedSector(s.store, num) - if !ok || err != nil { - return nil, err - } - - ret := fromV{{.v}}SectorPreCommitOnChainInfo(*info) - - return &ret, nil -} - -func (s *state{{.v}}) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { -{{if (ge .v 3) -}} - precommitted, err := adt{{.v}}.AsMap(s.store, s.State.PreCommittedSectors, builtin{{.v}}.DefaultHamtBitwidth) -{{- else -}} - precommitted, err := adt{{.v}}.AsMap(s.store, s.State.PreCommittedSectors) -{{- end}} - if err != nil { - return err - } - - var info miner{{.v}}.SectorPreCommitOnChainInfo - if err := precommitted.ForEach(&info, func(_ string) error { - return cb(fromV{{.v}}SectorPreCommitOnChainInfo(info)) - }); err != nil { - return err - } - - return nil -} - -func (s *state{{.v}}) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { - sectors, err := miner{{.v}}.LoadSectors(s.store, s.State.Sectors) - if err != nil { - return nil, err - } - - // If no sector numbers are specified, load all. - if snos == nil { - infos := make([]*SectorOnChainInfo, 0, sectors.Length()) - var info{{.v}} miner{{.v}}.SectorOnChainInfo - if err := sectors.ForEach(&info{{.v}}, func(_ int64) error { - info := fromV{{.v}}SectorOnChainInfo(info{{.v}}) - infos = append(infos, &info) - return nil - }); err != nil { - return nil, err - } - return infos, nil - } - - // Otherwise, load selected. - infos{{.v}}, err := sectors.Load(*snos) - if err != nil { - return nil, err - } - infos := make([]*SectorOnChainInfo, len(infos{{.v}})) - for i, info{{.v}} := range infos{{.v}} { - info := fromV{{.v}}SectorOnChainInfo(*info{{.v}}) - infos[i] = &info - } - return infos, nil -} - -func (s *state{{.v}}) loadAllocatedSectorNumbers() (bitfield.BitField, error) { - var allocatedSectors bitfield.BitField - err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) - return allocatedSectors, err -} - -func (s *state{{.v}}) IsAllocated(num abi.SectorNumber) (bool, error) { - allocatedSectors, err := s.loadAllocatedSectorNumbers() - if err != nil { - return false, err - } - - return allocatedSectors.IsSet(uint64(num)) -} - -func (s *state{{.v}}) GetProvingPeriodStart() (abi.ChainEpoch, error) { - return s.State.ProvingPeriodStart, nil -} - -func (s *state{{.v}}) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { - allocatedSectors, err := s.loadAllocatedSectorNumbers() - if err != nil { - return nil, err - } - - allocatedRuns, err := allocatedSectors.RunIterator() - if err != nil { - return nil, err - } - - unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, - allocatedRuns, - ) - if err != nil { - return nil, err - } - - iter, err := rle.BitsFromRuns(unallocatedRuns) - if err != nil { - return nil, err - } - - sectors := make([]abi.SectorNumber, 0, count) - for iter.HasNext() && len(sectors) < count { - nextNo, err := iter.Next() - if err != nil { - return nil, err - } - sectors = append(sectors, abi.SectorNumber(nextNo)) - } - - return sectors, nil -} - -func (s *state{{.v}}) GetAllocatedSectors() (*bitfield.BitField, error) { - var allocatedSectors bitfield.BitField - if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { - return nil, err - } - - return &allocatedSectors, nil -} - -func (s *state{{.v}}) LoadDeadline(idx uint64) (Deadline, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return nil, err - } - dl, err := dls.LoadDeadline(s.store, idx) - if err != nil { - return nil, err - } - return &deadline{{.v}}{*dl, s.store}, nil -} - -func (s *state{{.v}}) ForEachDeadline(cb func(uint64, Deadline) error) error { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - return dls.ForEach(s.store, func(i uint64, dl *miner{{.v}}.Deadline) error { - return cb(i, &deadline{{.v}}{*dl, s.store}) - }) -} - -func (s *state{{.v}}) NumDeadlines() (uint64, error) { - return miner{{.v}}.WPoStPeriodDeadlines, nil -} - -func (s *state{{.v}}) DeadlinesChanged(other State) (bool, error) { - other{{.v}}, ok := other.(*state{{.v}}) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - - return !s.State.Deadlines.Equals(other{{.v}}.Deadlines), nil -} - -func (s *state{{.v}}) MinerInfoChanged(other State) (bool, error) { - other0, ok := other.(*state{{.v}}) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.Info.Equals(other0.State.Info), nil -} - -func (s *state{{.v}}) Info() (MinerInfo, error) { - info, err := s.State.GetInfo(s.store) - if err != nil { - return MinerInfo{}, err - } - - var pid *peer.ID - if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { - pid = &peerID - } -{{if (le .v 2)}} - wpp, err := info.SealProofType.RegisteredWindowPoStProof() - if err != nil { - return MinerInfo{}, err - } -{{end}} - mi := MinerInfo{ - Owner: info.Owner, - Worker: info.Worker, - ControlAddresses: info.ControlAddresses, - - NewWorker: address.Undef, - WorkerChangeEpoch: -1, - - PeerId: pid, - Multiaddrs: info.Multiaddrs, - WindowPoStProofType: {{if (ge .v 3)}}info.WindowPoStProofType{{else}}wpp{{end}}, - SectorSize: info.SectorSize, - WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, - ConsensusFaultElapsed: {{if (ge .v 2)}}info.ConsensusFaultElapsed{{else}}-1{{end}}, - } - - if info.PendingWorkerKey != nil { - mi.NewWorker = info.PendingWorkerKey.NewWorker - mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt - } - - return mi, nil -} - -func (s *state{{.v}}) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { - return s.State.{{if (ge .v 4)}}Recorded{{end}}DeadlineInfo(epoch), nil -} - -func (s *state{{.v}}) DeadlineCronActive() (bool, error) { - return {{if (ge .v 4)}}s.State.DeadlineCronActive{{else}}true{{end}}, nil{{if (lt .v 4)}} // always active in this version{{end}} -} - -func (s *state{{.v}}) sectors() (adt.Array, error) { - return adt{{.v}}.AsArray(s.store, s.Sectors{{if (ge .v 3)}}, miner{{.v}}.SectorsAmtBitwidth{{end}}) -} - -func (s *state{{.v}}) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { - var si miner{{.v}}.SectorOnChainInfo - err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return SectorOnChainInfo{}, err - } - - return fromV{{.v}}SectorOnChainInfo(si), nil -} - -func (s *state{{.v}}) precommits() (adt.Map, error) { - return adt{{.v}}.AsMap(s.store, s.PreCommittedSectors{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) -} - -func (s *state{{.v}}) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { - var sp miner{{.v}}.SectorPreCommitOnChainInfo - err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return SectorPreCommitOnChainInfo{}, err - } - - return fromV{{.v}}SectorPreCommitOnChainInfo(sp), nil -} - -func (s *state{{.v}}) EraseAllUnproven() error { - {{if (ge .v 2)}} - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner{{.v}}.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner{{.v}}.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } - - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - {{else}} - // field doesn't exist until v2 - return nil - {{end}} -} - -func (d *deadline{{.v}}) LoadPartition(idx uint64) (Partition, error) { - p, err := d.Deadline.LoadPartition(d.store, idx) - if err != nil { - return nil, err - } - return &partition{{.v}}{*p, d.store}, nil -} - -func (d *deadline{{.v}}) ForEachPartition(cb func(uint64, Partition) error) error { - ps, err := d.Deadline.PartitionsArray(d.store) - if err != nil { - return err - } - var part miner{{.v}}.Partition - return ps.ForEach(&part, func(i int64) error { - return cb(uint64(i), &partition{{.v}}{part, d.store}) - }) -} - -func (d *deadline{{.v}}) PartitionsChanged(other Deadline) (bool, error) { - other{{.v}}, ok := other.(*deadline{{.v}}) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - - return !d.Deadline.Partitions.Equals(other{{.v}}.Deadline.Partitions), nil -} - -func (d *deadline{{.v}}) PartitionsPoSted() (bitfield.BitField, error) { - return d.Deadline.{{if (ge .v 3)}}PartitionsPoSted{{else}}PostSubmissions{{end}}, nil -} - -func (d *deadline{{.v}}) DisputableProofCount() (uint64, error) { -{{if (ge .v 3)}} - ops, err := d.OptimisticProofsSnapshotArray(d.store) - if err != nil { - return 0, err - } - - return ops.Length(), nil -{{else}} - // field doesn't exist until v3 - return 0, nil -{{end}} -} - -func (p *partition{{.v}}) AllSectors() (bitfield.BitField, error) { - return p.Partition.Sectors, nil -} - -func (p *partition{{.v}}) FaultySectors() (bitfield.BitField, error) { - return p.Partition.Faults, nil -} - -func (p *partition{{.v}}) RecoveringSectors() (bitfield.BitField, error) { - return p.Partition.Recoveries, nil -} - -func (p *partition{{.v}}) UnprovenSectors() (bitfield.BitField, error) { - return {{if (ge .v 2)}}p.Partition.Unproven{{else}}bitfield.New(){{end}}, nil -} - -func fromV{{.v}}SectorOnChainInfo(v{{.v}} miner{{.v}}.SectorOnChainInfo) SectorOnChainInfo { - info := SectorOnChainInfo{ - SectorNumber: v{{.v}}.SectorNumber, - SealProof: v{{.v}}.SealProof, - SealedCID: v{{.v}}.SealedCID, - DealIDs: v{{.v}}.DealIDs, - Activation: v{{.v}}.Activation, - Expiration: v{{.v}}.Expiration, - DealWeight: v{{.v}}.DealWeight, - VerifiedDealWeight: v{{.v}}.VerifiedDealWeight, - InitialPledge: v{{.v}}.InitialPledge, - ExpectedDayReward: v{{.v}}.ExpectedDayReward, - ExpectedStoragePledge: v{{.v}}.ExpectedStoragePledge, - {{if (ge .v 7)}} - SectorKeyCID: v{{.v}}.SectorKeyCID, - {{end}} - } - return info -} - -func fromV{{.v}}SectorPreCommitOnChainInfo(v{{.v}} miner{{.v}}.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { -{{if (ge .v 2)}} - return SectorPreCommitOnChainInfo{ - Info: (SectorPreCommitInfo)(v{{.v}}.Info), - PreCommitDeposit: v{{.v}}.PreCommitDeposit, - PreCommitEpoch: v{{.v}}.PreCommitEpoch, - DealWeight: v{{.v}}.DealWeight, - VerifiedDealWeight: v{{.v}}.VerifiedDealWeight, - } -{{else}} - return (SectorPreCommitOnChainInfo)(v0) -{{end}} -} - -func (s *state{{.v}}) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/miner/util.go b/pkg/types/specactors/builtin/miner/util.go deleted file mode 100644 index 5fafc31ef7..0000000000 --- a/pkg/types/specactors/builtin/miner/util.go +++ /dev/null @@ -1,88 +0,0 @@ -package miner - -import ( - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-bitfield" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" -) - -func AllPartSectors(mas State, sget func(Partition) (bitfield.BitField, error)) (bitfield.BitField, error) { - var parts []bitfield.BitField - - err := mas.ForEachDeadline(func(dlidx uint64, dl Deadline) error { - return dl.ForEachPartition(func(partidx uint64, part Partition) error { - s, err := sget(part) - if err != nil { - return xerrors.Errorf("getting sector list (dl: %d, part %d): %w", dlidx, partidx, err) - } - - parts = append(parts, s) - return nil - }) - }) - if err != nil { - return bitfield.BitField{}, err - } - - return bitfield.MultiMerge(parts...) -} - -// SealProofTypeFromSectorSize returns preferred seal proof type for creating -// new miner actors and new sectors -func SealProofTypeFromSectorSize(ssize abi.SectorSize, nv network.Version) (abi.RegisteredSealProof, error) { - switch { - case nv < network.Version7: - switch ssize { - case 2 << 10: - return abi.RegisteredSealProof_StackedDrg2KiBV1, nil - case 8 << 20: - return abi.RegisteredSealProof_StackedDrg8MiBV1, nil - case 512 << 20: - return abi.RegisteredSealProof_StackedDrg512MiBV1, nil - case 32 << 30: - return abi.RegisteredSealProof_StackedDrg32GiBV1, nil - case 64 << 30: - return abi.RegisteredSealProof_StackedDrg64GiBV1, nil - default: - return 0, xerrors.Errorf("unsupported sector size for miner: %v", ssize) - } - case nv >= network.Version7: - switch ssize { - case 2 << 10: - return abi.RegisteredSealProof_StackedDrg2KiBV1_1, nil - case 8 << 20: - return abi.RegisteredSealProof_StackedDrg8MiBV1_1, nil - case 512 << 20: - return abi.RegisteredSealProof_StackedDrg512MiBV1_1, nil - case 32 << 30: - return abi.RegisteredSealProof_StackedDrg32GiBV1_1, nil - case 64 << 30: - return abi.RegisteredSealProof_StackedDrg64GiBV1_1, nil - default: - return 0, xerrors.Errorf("unsupported sector size for miner: %v", ssize) - } - } - - return 0, xerrors.Errorf("unsupported network version") -} - -// WindowPoStProofTypeFromSectorSize returns preferred post proof type for creating -// new miner actors and new sectors -func WindowPoStProofTypeFromSectorSize(ssize abi.SectorSize) (abi.RegisteredPoStProof, error) { - switch ssize { - case 2 << 10: - return abi.RegisteredPoStProof_StackedDrgWindow2KiBV1, nil - case 8 << 20: - return abi.RegisteredPoStProof_StackedDrgWindow8MiBV1, nil - case 512 << 20: - return abi.RegisteredPoStProof_StackedDrgWindow512MiBV1, nil - case 32 << 30: - return abi.RegisteredPoStProof_StackedDrgWindow32GiBV1, nil - case 64 << 30: - return abi.RegisteredPoStProof_StackedDrgWindow64GiBV1, nil - default: - return 0, xerrors.Errorf("unsupported sector size for miner: %v", ssize) - } -} diff --git a/pkg/types/specactors/builtin/miner/v0.go b/pkg/types/specactors/builtin/miner/v0.go deleted file mode 100644 index 25be77637d..0000000000 --- a/pkg/types/specactors/builtin/miner/v0.go +++ /dev/null @@ -1,535 +0,0 @@ -// FETCHED FROM LOTUS: builtin/miner/state.go.template - -package miner - -import ( - "bytes" - "errors" - - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" - adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" -) - -var _ State = (*state0)(nil) - -func load0(store adt.Store, root cid.Cid) (State, error) { - out := state0{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make0(store adt.Store) (State, error) { - out := state0{store: store} - out.State = miner0.State{} - return &out, nil -} - -type state0 struct { - miner0.State - store adt.Store -} - -type deadline0 struct { - miner0.Deadline - store adt.Store -} - -type partition0 struct { - miner0.Partition - store adt.Store -} - -func (s *state0) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { - defer func() { - if r := recover(); r != nil { - err = xerrors.Errorf("failed to get available balance: %w", r) - available = abi.NewTokenAmount(0) - } - }() - // this panics if the miner doesnt have enough funds to cover their locked pledge - available = s.GetAvailableBalance(bal) - return available, err -} - -func (s *state0) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { - return s.CheckVestedFunds(s.store, epoch) -} - -func (s *state0) LockedFunds() (LockedFunds, error) { - return LockedFunds{ - VestingFunds: s.State.LockedFunds, - InitialPledgeRequirement: s.State.InitialPledgeRequirement, - PreCommitDeposits: s.State.PreCommitDeposits, - }, nil -} - -func (s *state0) FeeDebt() (abi.TokenAmount, error) { - return big.Zero(), nil -} - -func (s *state0) InitialPledge() (abi.TokenAmount, error) { - return s.State.InitialPledgeRequirement, nil -} - -func (s *state0) PreCommitDeposits() (abi.TokenAmount, error) { - return s.State.PreCommitDeposits, nil -} - -func (s *state0) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { - info, ok, err := s.State.GetSector(s.store, num) - if !ok || err != nil { - return nil, err - } - - ret := fromV0SectorOnChainInfo(*info) - return &ret, nil -} - -func (s *state0) FindSector(num abi.SectorNumber) (*SectorLocation, error) { - dlIdx, partIdx, err := s.State.FindSector(s.store, num) - if err != nil { - return nil, err - } - return &SectorLocation{ - Deadline: dlIdx, - Partition: partIdx, - }, nil -} - -func (s *state0) NumLiveSectors() (uint64, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return 0, err - } - var total uint64 - if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner0.Deadline) error { - total += dl.LiveSectors - return nil - }); err != nil { - return 0, err - } - return total, nil -} - -// GetSectorExpiration returns the effective expiration of the given sector. -// -// If the sector does not expire early, the Early expiration field is 0. -func (s *state0) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return nil, err - } - // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be - // learned from the sector info), or in the next quantized expiration - // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries - // of the expiration queue. - - stopErr := errors.New("stop") - out := SectorExpiration{} - err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner0.Deadline) error { - partitions, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - quant := s.State.QuantSpecForDeadline(dlIdx) - var part miner0.Partition - return partitions.ForEach(&part, func(partIdx int64) error { - if found, err := part.Sectors.IsSet(uint64(num)); err != nil { - return err - } else if !found { - return nil - } - if found, err := part.Terminated.IsSet(uint64(num)); err != nil { - return err - } else if found { - // already terminated - return stopErr - } - - q, err := miner0.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant) - if err != nil { - return err - } - var exp miner0.ExpirationSet - return q.ForEach(&exp, func(epoch int64) error { - if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { - return err - } else if early { - out.Early = abi.ChainEpoch(epoch) - return nil - } - if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { - return err - } else if onTime { - out.OnTime = abi.ChainEpoch(epoch) - return stopErr - } - return nil - }) - }) - }) - if err == stopErr { - err = nil - } - if err != nil { - return nil, err - } - if out.Early == 0 && out.OnTime == 0 { - return nil, xerrors.Errorf("failed to find sector %d", num) - } - return &out, nil -} - -func (s *state0) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { - info, ok, err := s.State.GetPrecommittedSector(s.store, num) - if !ok || err != nil { - return nil, err - } - - ret := fromV0SectorPreCommitOnChainInfo(*info) - - return &ret, nil -} - -func (s *state0) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt0.AsMap(s.store, s.State.PreCommittedSectors) - if err != nil { - return err - } - - var info miner0.SectorPreCommitOnChainInfo - if err := precommitted.ForEach(&info, func(_ string) error { - return cb(fromV0SectorPreCommitOnChainInfo(info)) - }); err != nil { - return err - } - - return nil -} - -func (s *state0) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { - sectors, err := miner0.LoadSectors(s.store, s.State.Sectors) - if err != nil { - return nil, err - } - - // If no sector numbers are specified, load all. - if snos == nil { - infos := make([]*SectorOnChainInfo, 0, sectors.Length()) - var info0 miner0.SectorOnChainInfo - if err := sectors.ForEach(&info0, func(_ int64) error { - info := fromV0SectorOnChainInfo(info0) - infos = append(infos, &info) - return nil - }); err != nil { - return nil, err - } - return infos, nil - } - - // Otherwise, load selected. - infos0, err := sectors.Load(*snos) - if err != nil { - return nil, err - } - infos := make([]*SectorOnChainInfo, len(infos0)) - for i, info0 := range infos0 { - info := fromV0SectorOnChainInfo(*info0) - infos[i] = &info - } - return infos, nil -} - -func (s *state0) loadAllocatedSectorNumbers() (bitfield.BitField, error) { - var allocatedSectors bitfield.BitField - err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) - return allocatedSectors, err -} - -func (s *state0) IsAllocated(num abi.SectorNumber) (bool, error) { - allocatedSectors, err := s.loadAllocatedSectorNumbers() - if err != nil { - return false, err - } - - return allocatedSectors.IsSet(uint64(num)) -} - -func (s *state0) GetProvingPeriodStart() (abi.ChainEpoch, error) { - return s.State.ProvingPeriodStart, nil -} - -func (s *state0) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { - allocatedSectors, err := s.loadAllocatedSectorNumbers() - if err != nil { - return nil, err - } - - allocatedRuns, err := allocatedSectors.RunIterator() - if err != nil { - return nil, err - } - - unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, - allocatedRuns, - ) - if err != nil { - return nil, err - } - - iter, err := rle.BitsFromRuns(unallocatedRuns) - if err != nil { - return nil, err - } - - sectors := make([]abi.SectorNumber, 0, count) - for iter.HasNext() && len(sectors) < count { - nextNo, err := iter.Next() - if err != nil { - return nil, err - } - sectors = append(sectors, abi.SectorNumber(nextNo)) - } - - return sectors, nil -} - -func (s *state0) GetAllocatedSectors() (*bitfield.BitField, error) { - var allocatedSectors bitfield.BitField - if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { - return nil, err - } - - return &allocatedSectors, nil -} - -func (s *state0) LoadDeadline(idx uint64) (Deadline, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return nil, err - } - dl, err := dls.LoadDeadline(s.store, idx) - if err != nil { - return nil, err - } - return &deadline0{*dl, s.store}, nil -} - -func (s *state0) ForEachDeadline(cb func(uint64, Deadline) error) error { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - return dls.ForEach(s.store, func(i uint64, dl *miner0.Deadline) error { - return cb(i, &deadline0{*dl, s.store}) - }) -} - -func (s *state0) NumDeadlines() (uint64, error) { - return miner0.WPoStPeriodDeadlines, nil -} - -func (s *state0) DeadlinesChanged(other State) (bool, error) { - other0, ok := other.(*state0) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - - return !s.State.Deadlines.Equals(other0.Deadlines), nil -} - -func (s *state0) MinerInfoChanged(other State) (bool, error) { - other0, ok := other.(*state0) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.Info.Equals(other0.State.Info), nil -} - -func (s *state0) Info() (MinerInfo, error) { - info, err := s.State.GetInfo(s.store) - if err != nil { - return MinerInfo{}, err - } - - var pid *peer.ID - if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { - pid = &peerID - } - - wpp, err := info.SealProofType.RegisteredWindowPoStProof() - if err != nil { - return MinerInfo{}, err - } - - mi := MinerInfo{ - Owner: info.Owner, - Worker: info.Worker, - ControlAddresses: info.ControlAddresses, - - NewWorker: address.Undef, - WorkerChangeEpoch: -1, - - PeerId: pid, - Multiaddrs: info.Multiaddrs, - WindowPoStProofType: wpp, - SectorSize: info.SectorSize, - WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, - ConsensusFaultElapsed: -1, - } - - if info.PendingWorkerKey != nil { - mi.NewWorker = info.PendingWorkerKey.NewWorker - mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt - } - - return mi, nil -} - -func (s *state0) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { - return s.State.DeadlineInfo(epoch), nil -} - -func (s *state0) DeadlineCronActive() (bool, error) { - return true, nil // always active in this version -} - -func (s *state0) sectors() (adt.Array, error) { - return adt0.AsArray(s.store, s.Sectors) -} - -func (s *state0) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { - var si miner0.SectorOnChainInfo - err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return SectorOnChainInfo{}, err - } - - return fromV0SectorOnChainInfo(si), nil -} - -func (s *state0) precommits() (adt.Map, error) { - return adt0.AsMap(s.store, s.PreCommittedSectors) -} - -func (s *state0) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { - var sp miner0.SectorPreCommitOnChainInfo - err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return SectorPreCommitOnChainInfo{}, err - } - - return fromV0SectorPreCommitOnChainInfo(sp), nil -} - -func (s *state0) EraseAllUnproven() error { - - // field doesn't exist until v2 - return nil - -} - -func (d *deadline0) LoadPartition(idx uint64) (Partition, error) { - p, err := d.Deadline.LoadPartition(d.store, idx) - if err != nil { - return nil, err - } - return &partition0{*p, d.store}, nil -} - -func (d *deadline0) ForEachPartition(cb func(uint64, Partition) error) error { - ps, err := d.Deadline.PartitionsArray(d.store) - if err != nil { - return err - } - var part miner0.Partition - return ps.ForEach(&part, func(i int64) error { - return cb(uint64(i), &partition0{part, d.store}) - }) -} - -func (d *deadline0) PartitionsChanged(other Deadline) (bool, error) { - other0, ok := other.(*deadline0) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - - return !d.Deadline.Partitions.Equals(other0.Deadline.Partitions), nil -} - -func (d *deadline0) PartitionsPoSted() (bitfield.BitField, error) { - return d.Deadline.PostSubmissions, nil -} - -func (d *deadline0) DisputableProofCount() (uint64, error) { - - // field doesn't exist until v3 - return 0, nil - -} - -func (p *partition0) AllSectors() (bitfield.BitField, error) { - return p.Partition.Sectors, nil -} - -func (p *partition0) FaultySectors() (bitfield.BitField, error) { - return p.Partition.Faults, nil -} - -func (p *partition0) RecoveringSectors() (bitfield.BitField, error) { - return p.Partition.Recoveries, nil -} - -func (p *partition0) UnprovenSectors() (bitfield.BitField, error) { - return bitfield.New(), nil -} - -func fromV0SectorOnChainInfo(v0 miner0.SectorOnChainInfo) SectorOnChainInfo { - info := SectorOnChainInfo{ - SectorNumber: v0.SectorNumber, - SealProof: v0.SealProof, - SealedCID: v0.SealedCID, - DealIDs: v0.DealIDs, - Activation: v0.Activation, - Expiration: v0.Expiration, - DealWeight: v0.DealWeight, - VerifiedDealWeight: v0.VerifiedDealWeight, - InitialPledge: v0.InitialPledge, - ExpectedDayReward: v0.ExpectedDayReward, - ExpectedStoragePledge: v0.ExpectedStoragePledge, - } - return info -} - -func fromV0SectorPreCommitOnChainInfo(v0 miner0.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { - - return (SectorPreCommitOnChainInfo)(v0) - -} - -func (s *state0) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/miner/v2.go b/pkg/types/specactors/builtin/miner/v2.go deleted file mode 100644 index a803caff7b..0000000000 --- a/pkg/types/specactors/builtin/miner/v2.go +++ /dev/null @@ -1,571 +0,0 @@ -// FETCHED FROM LOTUS: builtin/miner/state.go.template - -package miner - -import ( - "bytes" - "errors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" - adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" -) - -var _ State = (*state2)(nil) - -func load2(store adt.Store, root cid.Cid) (State, error) { - out := state2{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make2(store adt.Store) (State, error) { - out := state2{store: store} - out.State = miner2.State{} - return &out, nil -} - -type state2 struct { - miner2.State - store adt.Store -} - -type deadline2 struct { - miner2.Deadline - store adt.Store -} - -type partition2 struct { - miner2.Partition - store adt.Store -} - -func (s *state2) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { - defer func() { - if r := recover(); r != nil { - err = xerrors.Errorf("failed to get available balance: %w", r) - available = abi.NewTokenAmount(0) - } - }() - // this panics if the miner doesnt have enough funds to cover their locked pledge - available, err = s.GetAvailableBalance(bal) - return available, err -} - -func (s *state2) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { - return s.CheckVestedFunds(s.store, epoch) -} - -func (s *state2) LockedFunds() (LockedFunds, error) { - return LockedFunds{ - VestingFunds: s.State.LockedFunds, - InitialPledgeRequirement: s.State.InitialPledge, - PreCommitDeposits: s.State.PreCommitDeposits, - }, nil -} - -func (s *state2) FeeDebt() (abi.TokenAmount, error) { - return s.State.FeeDebt, nil -} - -func (s *state2) InitialPledge() (abi.TokenAmount, error) { - return s.State.InitialPledge, nil -} - -func (s *state2) PreCommitDeposits() (abi.TokenAmount, error) { - return s.State.PreCommitDeposits, nil -} - -func (s *state2) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { - info, ok, err := s.State.GetSector(s.store, num) - if !ok || err != nil { - return nil, err - } - - ret := fromV2SectorOnChainInfo(*info) - return &ret, nil -} - -func (s *state2) FindSector(num abi.SectorNumber) (*SectorLocation, error) { - dlIdx, partIdx, err := s.State.FindSector(s.store, num) - if err != nil { - return nil, err - } - return &SectorLocation{ - Deadline: dlIdx, - Partition: partIdx, - }, nil -} - -func (s *state2) NumLiveSectors() (uint64, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return 0, err - } - var total uint64 - if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner2.Deadline) error { - total += dl.LiveSectors - return nil - }); err != nil { - return 0, err - } - return total, nil -} - -// GetSectorExpiration returns the effective expiration of the given sector. -// -// If the sector does not expire early, the Early expiration field is 0. -func (s *state2) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return nil, err - } - // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be - // learned from the sector info), or in the next quantized expiration - // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries - // of the expiration queue. - - stopErr := errors.New("stop") - out := SectorExpiration{} - err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner2.Deadline) error { - partitions, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - quant := s.State.QuantSpecForDeadline(dlIdx) - var part miner2.Partition - return partitions.ForEach(&part, func(partIdx int64) error { - if found, err := part.Sectors.IsSet(uint64(num)); err != nil { - return err - } else if !found { - return nil - } - if found, err := part.Terminated.IsSet(uint64(num)); err != nil { - return err - } else if found { - // already terminated - return stopErr - } - - q, err := miner2.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant) - if err != nil { - return err - } - var exp miner2.ExpirationSet - return q.ForEach(&exp, func(epoch int64) error { - if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { - return err - } else if early { - out.Early = abi.ChainEpoch(epoch) - return nil - } - if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { - return err - } else if onTime { - out.OnTime = abi.ChainEpoch(epoch) - return stopErr - } - return nil - }) - }) - }) - if err == stopErr { - err = nil - } - if err != nil { - return nil, err - } - if out.Early == 0 && out.OnTime == 0 { - return nil, xerrors.Errorf("failed to find sector %d", num) - } - return &out, nil -} - -func (s *state2) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { - info, ok, err := s.State.GetPrecommittedSector(s.store, num) - if !ok || err != nil { - return nil, err - } - - ret := fromV2SectorPreCommitOnChainInfo(*info) - - return &ret, nil -} - -func (s *state2) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt2.AsMap(s.store, s.State.PreCommittedSectors) - if err != nil { - return err - } - - var info miner2.SectorPreCommitOnChainInfo - if err := precommitted.ForEach(&info, func(_ string) error { - return cb(fromV2SectorPreCommitOnChainInfo(info)) - }); err != nil { - return err - } - - return nil -} - -func (s *state2) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { - sectors, err := miner2.LoadSectors(s.store, s.State.Sectors) - if err != nil { - return nil, err - } - - // If no sector numbers are specified, load all. - if snos == nil { - infos := make([]*SectorOnChainInfo, 0, sectors.Length()) - var info2 miner2.SectorOnChainInfo - if err := sectors.ForEach(&info2, func(_ int64) error { - info := fromV2SectorOnChainInfo(info2) - infos = append(infos, &info) - return nil - }); err != nil { - return nil, err - } - return infos, nil - } - - // Otherwise, load selected. - infos2, err := sectors.Load(*snos) - if err != nil { - return nil, err - } - infos := make([]*SectorOnChainInfo, len(infos2)) - for i, info2 := range infos2 { - info := fromV2SectorOnChainInfo(*info2) - infos[i] = &info - } - return infos, nil -} - -func (s *state2) loadAllocatedSectorNumbers() (bitfield.BitField, error) { - var allocatedSectors bitfield.BitField - err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) - return allocatedSectors, err -} - -func (s *state2) IsAllocated(num abi.SectorNumber) (bool, error) { - allocatedSectors, err := s.loadAllocatedSectorNumbers() - if err != nil { - return false, err - } - - return allocatedSectors.IsSet(uint64(num)) -} - -func (s *state2) GetProvingPeriodStart() (abi.ChainEpoch, error) { - return s.State.ProvingPeriodStart, nil -} - -func (s *state2) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { - allocatedSectors, err := s.loadAllocatedSectorNumbers() - if err != nil { - return nil, err - } - - allocatedRuns, err := allocatedSectors.RunIterator() - if err != nil { - return nil, err - } - - unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, - allocatedRuns, - ) - if err != nil { - return nil, err - } - - iter, err := rle.BitsFromRuns(unallocatedRuns) - if err != nil { - return nil, err - } - - sectors := make([]abi.SectorNumber, 0, count) - for iter.HasNext() && len(sectors) < count { - nextNo, err := iter.Next() - if err != nil { - return nil, err - } - sectors = append(sectors, abi.SectorNumber(nextNo)) - } - - return sectors, nil -} - -func (s *state2) GetAllocatedSectors() (*bitfield.BitField, error) { - var allocatedSectors bitfield.BitField - if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { - return nil, err - } - - return &allocatedSectors, nil -} - -func (s *state2) LoadDeadline(idx uint64) (Deadline, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return nil, err - } - dl, err := dls.LoadDeadline(s.store, idx) - if err != nil { - return nil, err - } - return &deadline2{*dl, s.store}, nil -} - -func (s *state2) ForEachDeadline(cb func(uint64, Deadline) error) error { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - return dls.ForEach(s.store, func(i uint64, dl *miner2.Deadline) error { - return cb(i, &deadline2{*dl, s.store}) - }) -} - -func (s *state2) NumDeadlines() (uint64, error) { - return miner2.WPoStPeriodDeadlines, nil -} - -func (s *state2) DeadlinesChanged(other State) (bool, error) { - other2, ok := other.(*state2) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - - return !s.State.Deadlines.Equals(other2.Deadlines), nil -} - -func (s *state2) MinerInfoChanged(other State) (bool, error) { - other0, ok := other.(*state2) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.Info.Equals(other0.State.Info), nil -} - -func (s *state2) Info() (MinerInfo, error) { - info, err := s.State.GetInfo(s.store) - if err != nil { - return MinerInfo{}, err - } - - var pid *peer.ID - if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { - pid = &peerID - } - - wpp, err := info.SealProofType.RegisteredWindowPoStProof() - if err != nil { - return MinerInfo{}, err - } - - mi := MinerInfo{ - Owner: info.Owner, - Worker: info.Worker, - ControlAddresses: info.ControlAddresses, - - NewWorker: address.Undef, - WorkerChangeEpoch: -1, - - PeerId: pid, - Multiaddrs: info.Multiaddrs, - WindowPoStProofType: wpp, - SectorSize: info.SectorSize, - WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, - ConsensusFaultElapsed: info.ConsensusFaultElapsed, - } - - if info.PendingWorkerKey != nil { - mi.NewWorker = info.PendingWorkerKey.NewWorker - mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt - } - - return mi, nil -} - -func (s *state2) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { - return s.State.DeadlineInfo(epoch), nil -} - -func (s *state2) DeadlineCronActive() (bool, error) { - return true, nil // always active in this version -} - -func (s *state2) sectors() (adt.Array, error) { - return adt2.AsArray(s.store, s.Sectors) -} - -func (s *state2) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { - var si miner2.SectorOnChainInfo - err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return SectorOnChainInfo{}, err - } - - return fromV2SectorOnChainInfo(si), nil -} - -func (s *state2) precommits() (adt.Map, error) { - return adt2.AsMap(s.store, s.PreCommittedSectors) -} - -func (s *state2) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { - var sp miner2.SectorPreCommitOnChainInfo - err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return SectorPreCommitOnChainInfo{}, err - } - - return fromV2SectorPreCommitOnChainInfo(sp), nil -} - -func (s *state2) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner2.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner2.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } - - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - -} - -func (d *deadline2) LoadPartition(idx uint64) (Partition, error) { - p, err := d.Deadline.LoadPartition(d.store, idx) - if err != nil { - return nil, err - } - return &partition2{*p, d.store}, nil -} - -func (d *deadline2) ForEachPartition(cb func(uint64, Partition) error) error { - ps, err := d.Deadline.PartitionsArray(d.store) - if err != nil { - return err - } - var part miner2.Partition - return ps.ForEach(&part, func(i int64) error { - return cb(uint64(i), &partition2{part, d.store}) - }) -} - -func (d *deadline2) PartitionsChanged(other Deadline) (bool, error) { - other2, ok := other.(*deadline2) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - - return !d.Deadline.Partitions.Equals(other2.Deadline.Partitions), nil -} - -func (d *deadline2) PartitionsPoSted() (bitfield.BitField, error) { - return d.Deadline.PostSubmissions, nil -} - -func (d *deadline2) DisputableProofCount() (uint64, error) { - - // field doesn't exist until v3 - return 0, nil - -} - -func (p *partition2) AllSectors() (bitfield.BitField, error) { - return p.Partition.Sectors, nil -} - -func (p *partition2) FaultySectors() (bitfield.BitField, error) { - return p.Partition.Faults, nil -} - -func (p *partition2) RecoveringSectors() (bitfield.BitField, error) { - return p.Partition.Recoveries, nil -} - -func (p *partition2) UnprovenSectors() (bitfield.BitField, error) { - return p.Partition.Unproven, nil -} - -func fromV2SectorOnChainInfo(v2 miner2.SectorOnChainInfo) SectorOnChainInfo { - info := SectorOnChainInfo{ - SectorNumber: v2.SectorNumber, - SealProof: v2.SealProof, - SealedCID: v2.SealedCID, - DealIDs: v2.DealIDs, - Activation: v2.Activation, - Expiration: v2.Expiration, - DealWeight: v2.DealWeight, - VerifiedDealWeight: v2.VerifiedDealWeight, - InitialPledge: v2.InitialPledge, - ExpectedDayReward: v2.ExpectedDayReward, - ExpectedStoragePledge: v2.ExpectedStoragePledge, - } - return info -} - -func fromV2SectorPreCommitOnChainInfo(v2 miner2.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { - - return SectorPreCommitOnChainInfo{ - Info: (SectorPreCommitInfo)(v2.Info), - PreCommitDeposit: v2.PreCommitDeposit, - PreCommitEpoch: v2.PreCommitEpoch, - DealWeight: v2.DealWeight, - VerifiedDealWeight: v2.VerifiedDealWeight, - } - -} - -func (s *state2) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/miner/v3.go b/pkg/types/specactors/builtin/miner/v3.go deleted file mode 100644 index 6cceac6d52..0000000000 --- a/pkg/types/specactors/builtin/miner/v3.go +++ /dev/null @@ -1,572 +0,0 @@ -// FETCHED FROM LOTUS: builtin/miner/state.go.template - -package miner - -import ( - "bytes" - "errors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" - adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" -) - -var _ State = (*state3)(nil) - -func load3(store adt.Store, root cid.Cid) (State, error) { - out := state3{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make3(store adt.Store) (State, error) { - out := state3{store: store} - out.State = miner3.State{} - return &out, nil -} - -type state3 struct { - miner3.State - store adt.Store -} - -type deadline3 struct { - miner3.Deadline - store adt.Store -} - -type partition3 struct { - miner3.Partition - store adt.Store -} - -func (s *state3) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { - defer func() { - if r := recover(); r != nil { - err = xerrors.Errorf("failed to get available balance: %w", r) - available = abi.NewTokenAmount(0) - } - }() - // this panics if the miner doesnt have enough funds to cover their locked pledge - available, err = s.GetAvailableBalance(bal) - return available, err -} - -func (s *state3) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { - return s.CheckVestedFunds(s.store, epoch) -} - -func (s *state3) LockedFunds() (LockedFunds, error) { - return LockedFunds{ - VestingFunds: s.State.LockedFunds, - InitialPledgeRequirement: s.State.InitialPledge, - PreCommitDeposits: s.State.PreCommitDeposits, - }, nil -} - -func (s *state3) FeeDebt() (abi.TokenAmount, error) { - return s.State.FeeDebt, nil -} - -func (s *state3) InitialPledge() (abi.TokenAmount, error) { - return s.State.InitialPledge, nil -} - -func (s *state3) PreCommitDeposits() (abi.TokenAmount, error) { - return s.State.PreCommitDeposits, nil -} - -func (s *state3) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { - info, ok, err := s.State.GetSector(s.store, num) - if !ok || err != nil { - return nil, err - } - - ret := fromV3SectorOnChainInfo(*info) - return &ret, nil -} - -func (s *state3) FindSector(num abi.SectorNumber) (*SectorLocation, error) { - dlIdx, partIdx, err := s.State.FindSector(s.store, num) - if err != nil { - return nil, err - } - return &SectorLocation{ - Deadline: dlIdx, - Partition: partIdx, - }, nil -} - -func (s *state3) NumLiveSectors() (uint64, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return 0, err - } - var total uint64 - if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner3.Deadline) error { - total += dl.LiveSectors - return nil - }); err != nil { - return 0, err - } - return total, nil -} - -// GetSectorExpiration returns the effective expiration of the given sector. -// -// If the sector does not expire early, the Early expiration field is 0. -func (s *state3) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return nil, err - } - // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be - // learned from the sector info), or in the next quantized expiration - // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries - // of the expiration queue. - - stopErr := errors.New("stop") - out := SectorExpiration{} - err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner3.Deadline) error { - partitions, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - quant := s.State.QuantSpecForDeadline(dlIdx) - var part miner3.Partition - return partitions.ForEach(&part, func(partIdx int64) error { - if found, err := part.Sectors.IsSet(uint64(num)); err != nil { - return err - } else if !found { - return nil - } - if found, err := part.Terminated.IsSet(uint64(num)); err != nil { - return err - } else if found { - // already terminated - return stopErr - } - - q, err := miner3.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner3.PartitionExpirationAmtBitwidth) - if err != nil { - return err - } - var exp miner3.ExpirationSet - return q.ForEach(&exp, func(epoch int64) error { - if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { - return err - } else if early { - out.Early = abi.ChainEpoch(epoch) - return nil - } - if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { - return err - } else if onTime { - out.OnTime = abi.ChainEpoch(epoch) - return stopErr - } - return nil - }) - }) - }) - if err == stopErr { - err = nil - } - if err != nil { - return nil, err - } - if out.Early == 0 && out.OnTime == 0 { - return nil, xerrors.Errorf("failed to find sector %d", num) - } - return &out, nil -} - -func (s *state3) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { - info, ok, err := s.State.GetPrecommittedSector(s.store, num) - if !ok || err != nil { - return nil, err - } - - ret := fromV3SectorPreCommitOnChainInfo(*info) - - return &ret, nil -} - -func (s *state3) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt3.AsMap(s.store, s.State.PreCommittedSectors, builtin3.DefaultHamtBitwidth) - if err != nil { - return err - } - - var info miner3.SectorPreCommitOnChainInfo - if err := precommitted.ForEach(&info, func(_ string) error { - return cb(fromV3SectorPreCommitOnChainInfo(info)) - }); err != nil { - return err - } - - return nil -} - -func (s *state3) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { - sectors, err := miner3.LoadSectors(s.store, s.State.Sectors) - if err != nil { - return nil, err - } - - // If no sector numbers are specified, load all. - if snos == nil { - infos := make([]*SectorOnChainInfo, 0, sectors.Length()) - var info3 miner3.SectorOnChainInfo - if err := sectors.ForEach(&info3, func(_ int64) error { - info := fromV3SectorOnChainInfo(info3) - infos = append(infos, &info) - return nil - }); err != nil { - return nil, err - } - return infos, nil - } - - // Otherwise, load selected. - infos3, err := sectors.Load(*snos) - if err != nil { - return nil, err - } - infos := make([]*SectorOnChainInfo, len(infos3)) - for i, info3 := range infos3 { - info := fromV3SectorOnChainInfo(*info3) - infos[i] = &info - } - return infos, nil -} - -func (s *state3) loadAllocatedSectorNumbers() (bitfield.BitField, error) { - var allocatedSectors bitfield.BitField - err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) - return allocatedSectors, err -} - -func (s *state3) IsAllocated(num abi.SectorNumber) (bool, error) { - allocatedSectors, err := s.loadAllocatedSectorNumbers() - if err != nil { - return false, err - } - - return allocatedSectors.IsSet(uint64(num)) -} - -func (s *state3) GetProvingPeriodStart() (abi.ChainEpoch, error) { - return s.State.ProvingPeriodStart, nil -} - -func (s *state3) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { - allocatedSectors, err := s.loadAllocatedSectorNumbers() - if err != nil { - return nil, err - } - - allocatedRuns, err := allocatedSectors.RunIterator() - if err != nil { - return nil, err - } - - unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, - allocatedRuns, - ) - if err != nil { - return nil, err - } - - iter, err := rle.BitsFromRuns(unallocatedRuns) - if err != nil { - return nil, err - } - - sectors := make([]abi.SectorNumber, 0, count) - for iter.HasNext() && len(sectors) < count { - nextNo, err := iter.Next() - if err != nil { - return nil, err - } - sectors = append(sectors, abi.SectorNumber(nextNo)) - } - - return sectors, nil -} - -func (s *state3) GetAllocatedSectors() (*bitfield.BitField, error) { - var allocatedSectors bitfield.BitField - if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { - return nil, err - } - - return &allocatedSectors, nil -} - -func (s *state3) LoadDeadline(idx uint64) (Deadline, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return nil, err - } - dl, err := dls.LoadDeadline(s.store, idx) - if err != nil { - return nil, err - } - return &deadline3{*dl, s.store}, nil -} - -func (s *state3) ForEachDeadline(cb func(uint64, Deadline) error) error { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - return dls.ForEach(s.store, func(i uint64, dl *miner3.Deadline) error { - return cb(i, &deadline3{*dl, s.store}) - }) -} - -func (s *state3) NumDeadlines() (uint64, error) { - return miner3.WPoStPeriodDeadlines, nil -} - -func (s *state3) DeadlinesChanged(other State) (bool, error) { - other3, ok := other.(*state3) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - - return !s.State.Deadlines.Equals(other3.Deadlines), nil -} - -func (s *state3) MinerInfoChanged(other State) (bool, error) { - other0, ok := other.(*state3) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.Info.Equals(other0.State.Info), nil -} - -func (s *state3) Info() (MinerInfo, error) { - info, err := s.State.GetInfo(s.store) - if err != nil { - return MinerInfo{}, err - } - - var pid *peer.ID - if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { - pid = &peerID - } - - mi := MinerInfo{ - Owner: info.Owner, - Worker: info.Worker, - ControlAddresses: info.ControlAddresses, - - NewWorker: address.Undef, - WorkerChangeEpoch: -1, - - PeerId: pid, - Multiaddrs: info.Multiaddrs, - WindowPoStProofType: info.WindowPoStProofType, - SectorSize: info.SectorSize, - WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, - ConsensusFaultElapsed: info.ConsensusFaultElapsed, - } - - if info.PendingWorkerKey != nil { - mi.NewWorker = info.PendingWorkerKey.NewWorker - mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt - } - - return mi, nil -} - -func (s *state3) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { - return s.State.DeadlineInfo(epoch), nil -} - -func (s *state3) DeadlineCronActive() (bool, error) { - return true, nil // always active in this version -} - -func (s *state3) sectors() (adt.Array, error) { - return adt3.AsArray(s.store, s.Sectors, miner3.SectorsAmtBitwidth) -} - -func (s *state3) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { - var si miner3.SectorOnChainInfo - err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return SectorOnChainInfo{}, err - } - - return fromV3SectorOnChainInfo(si), nil -} - -func (s *state3) precommits() (adt.Map, error) { - return adt3.AsMap(s.store, s.PreCommittedSectors, builtin3.DefaultHamtBitwidth) -} - -func (s *state3) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { - var sp miner3.SectorPreCommitOnChainInfo - err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return SectorPreCommitOnChainInfo{}, err - } - - return fromV3SectorPreCommitOnChainInfo(sp), nil -} - -func (s *state3) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner3.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner3.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } - - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - -} - -func (d *deadline3) LoadPartition(idx uint64) (Partition, error) { - p, err := d.Deadline.LoadPartition(d.store, idx) - if err != nil { - return nil, err - } - return &partition3{*p, d.store}, nil -} - -func (d *deadline3) ForEachPartition(cb func(uint64, Partition) error) error { - ps, err := d.Deadline.PartitionsArray(d.store) - if err != nil { - return err - } - var part miner3.Partition - return ps.ForEach(&part, func(i int64) error { - return cb(uint64(i), &partition3{part, d.store}) - }) -} - -func (d *deadline3) PartitionsChanged(other Deadline) (bool, error) { - other3, ok := other.(*deadline3) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - - return !d.Deadline.Partitions.Equals(other3.Deadline.Partitions), nil -} - -func (d *deadline3) PartitionsPoSted() (bitfield.BitField, error) { - return d.Deadline.PartitionsPoSted, nil -} - -func (d *deadline3) DisputableProofCount() (uint64, error) { - - ops, err := d.OptimisticProofsSnapshotArray(d.store) - if err != nil { - return 0, err - } - - return ops.Length(), nil - -} - -func (p *partition3) AllSectors() (bitfield.BitField, error) { - return p.Partition.Sectors, nil -} - -func (p *partition3) FaultySectors() (bitfield.BitField, error) { - return p.Partition.Faults, nil -} - -func (p *partition3) RecoveringSectors() (bitfield.BitField, error) { - return p.Partition.Recoveries, nil -} - -func (p *partition3) UnprovenSectors() (bitfield.BitField, error) { - return p.Partition.Unproven, nil -} - -func fromV3SectorOnChainInfo(v3 miner3.SectorOnChainInfo) SectorOnChainInfo { - info := SectorOnChainInfo{ - SectorNumber: v3.SectorNumber, - SealProof: v3.SealProof, - SealedCID: v3.SealedCID, - DealIDs: v3.DealIDs, - Activation: v3.Activation, - Expiration: v3.Expiration, - DealWeight: v3.DealWeight, - VerifiedDealWeight: v3.VerifiedDealWeight, - InitialPledge: v3.InitialPledge, - ExpectedDayReward: v3.ExpectedDayReward, - ExpectedStoragePledge: v3.ExpectedStoragePledge, - } - return info -} - -func fromV3SectorPreCommitOnChainInfo(v3 miner3.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { - - return SectorPreCommitOnChainInfo{ - Info: (SectorPreCommitInfo)(v3.Info), - PreCommitDeposit: v3.PreCommitDeposit, - PreCommitEpoch: v3.PreCommitEpoch, - DealWeight: v3.DealWeight, - VerifiedDealWeight: v3.VerifiedDealWeight, - } - -} - -func (s *state3) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/miner/v4.go b/pkg/types/specactors/builtin/miner/v4.go deleted file mode 100644 index 9e007a2067..0000000000 --- a/pkg/types/specactors/builtin/miner/v4.go +++ /dev/null @@ -1,572 +0,0 @@ -// FETCHED FROM LOTUS: builtin/miner/state.go.template - -package miner - -import ( - "bytes" - "errors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" - adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" -) - -var _ State = (*state4)(nil) - -func load4(store adt.Store, root cid.Cid) (State, error) { - out := state4{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make4(store adt.Store) (State, error) { - out := state4{store: store} - out.State = miner4.State{} - return &out, nil -} - -type state4 struct { - miner4.State - store adt.Store -} - -type deadline4 struct { - miner4.Deadline - store adt.Store -} - -type partition4 struct { - miner4.Partition - store adt.Store -} - -func (s *state4) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { - defer func() { - if r := recover(); r != nil { - err = xerrors.Errorf("failed to get available balance: %w", r) - available = abi.NewTokenAmount(0) - } - }() - // this panics if the miner doesnt have enough funds to cover their locked pledge - available, err = s.GetAvailableBalance(bal) - return available, err -} - -func (s *state4) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { - return s.CheckVestedFunds(s.store, epoch) -} - -func (s *state4) LockedFunds() (LockedFunds, error) { - return LockedFunds{ - VestingFunds: s.State.LockedFunds, - InitialPledgeRequirement: s.State.InitialPledge, - PreCommitDeposits: s.State.PreCommitDeposits, - }, nil -} - -func (s *state4) FeeDebt() (abi.TokenAmount, error) { - return s.State.FeeDebt, nil -} - -func (s *state4) InitialPledge() (abi.TokenAmount, error) { - return s.State.InitialPledge, nil -} - -func (s *state4) PreCommitDeposits() (abi.TokenAmount, error) { - return s.State.PreCommitDeposits, nil -} - -func (s *state4) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { - info, ok, err := s.State.GetSector(s.store, num) - if !ok || err != nil { - return nil, err - } - - ret := fromV4SectorOnChainInfo(*info) - return &ret, nil -} - -func (s *state4) FindSector(num abi.SectorNumber) (*SectorLocation, error) { - dlIdx, partIdx, err := s.State.FindSector(s.store, num) - if err != nil { - return nil, err - } - return &SectorLocation{ - Deadline: dlIdx, - Partition: partIdx, - }, nil -} - -func (s *state4) NumLiveSectors() (uint64, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return 0, err - } - var total uint64 - if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner4.Deadline) error { - total += dl.LiveSectors - return nil - }); err != nil { - return 0, err - } - return total, nil -} - -// GetSectorExpiration returns the effective expiration of the given sector. -// -// If the sector does not expire early, the Early expiration field is 0. -func (s *state4) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return nil, err - } - // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be - // learned from the sector info), or in the next quantized expiration - // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries - // of the expiration queue. - - stopErr := errors.New("stop") - out := SectorExpiration{} - err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner4.Deadline) error { - partitions, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - quant := s.State.QuantSpecForDeadline(dlIdx) - var part miner4.Partition - return partitions.ForEach(&part, func(partIdx int64) error { - if found, err := part.Sectors.IsSet(uint64(num)); err != nil { - return err - } else if !found { - return nil - } - if found, err := part.Terminated.IsSet(uint64(num)); err != nil { - return err - } else if found { - // already terminated - return stopErr - } - - q, err := miner4.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner4.PartitionExpirationAmtBitwidth) - if err != nil { - return err - } - var exp miner4.ExpirationSet - return q.ForEach(&exp, func(epoch int64) error { - if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { - return err - } else if early { - out.Early = abi.ChainEpoch(epoch) - return nil - } - if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { - return err - } else if onTime { - out.OnTime = abi.ChainEpoch(epoch) - return stopErr - } - return nil - }) - }) - }) - if err == stopErr { - err = nil - } - if err != nil { - return nil, err - } - if out.Early == 0 && out.OnTime == 0 { - return nil, xerrors.Errorf("failed to find sector %d", num) - } - return &out, nil -} - -func (s *state4) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { - info, ok, err := s.State.GetPrecommittedSector(s.store, num) - if !ok || err != nil { - return nil, err - } - - ret := fromV4SectorPreCommitOnChainInfo(*info) - - return &ret, nil -} - -func (s *state4) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt4.AsMap(s.store, s.State.PreCommittedSectors, builtin4.DefaultHamtBitwidth) - if err != nil { - return err - } - - var info miner4.SectorPreCommitOnChainInfo - if err := precommitted.ForEach(&info, func(_ string) error { - return cb(fromV4SectorPreCommitOnChainInfo(info)) - }); err != nil { - return err - } - - return nil -} - -func (s *state4) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { - sectors, err := miner4.LoadSectors(s.store, s.State.Sectors) - if err != nil { - return nil, err - } - - // If no sector numbers are specified, load all. - if snos == nil { - infos := make([]*SectorOnChainInfo, 0, sectors.Length()) - var info4 miner4.SectorOnChainInfo - if err := sectors.ForEach(&info4, func(_ int64) error { - info := fromV4SectorOnChainInfo(info4) - infos = append(infos, &info) - return nil - }); err != nil { - return nil, err - } - return infos, nil - } - - // Otherwise, load selected. - infos4, err := sectors.Load(*snos) - if err != nil { - return nil, err - } - infos := make([]*SectorOnChainInfo, len(infos4)) - for i, info4 := range infos4 { - info := fromV4SectorOnChainInfo(*info4) - infos[i] = &info - } - return infos, nil -} - -func (s *state4) loadAllocatedSectorNumbers() (bitfield.BitField, error) { - var allocatedSectors bitfield.BitField - err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) - return allocatedSectors, err -} - -func (s *state4) IsAllocated(num abi.SectorNumber) (bool, error) { - allocatedSectors, err := s.loadAllocatedSectorNumbers() - if err != nil { - return false, err - } - - return allocatedSectors.IsSet(uint64(num)) -} - -func (s *state4) GetProvingPeriodStart() (abi.ChainEpoch, error) { - return s.State.ProvingPeriodStart, nil -} - -func (s *state4) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { - allocatedSectors, err := s.loadAllocatedSectorNumbers() - if err != nil { - return nil, err - } - - allocatedRuns, err := allocatedSectors.RunIterator() - if err != nil { - return nil, err - } - - unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, - allocatedRuns, - ) - if err != nil { - return nil, err - } - - iter, err := rle.BitsFromRuns(unallocatedRuns) - if err != nil { - return nil, err - } - - sectors := make([]abi.SectorNumber, 0, count) - for iter.HasNext() && len(sectors) < count { - nextNo, err := iter.Next() - if err != nil { - return nil, err - } - sectors = append(sectors, abi.SectorNumber(nextNo)) - } - - return sectors, nil -} - -func (s *state4) GetAllocatedSectors() (*bitfield.BitField, error) { - var allocatedSectors bitfield.BitField - if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { - return nil, err - } - - return &allocatedSectors, nil -} - -func (s *state4) LoadDeadline(idx uint64) (Deadline, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return nil, err - } - dl, err := dls.LoadDeadline(s.store, idx) - if err != nil { - return nil, err - } - return &deadline4{*dl, s.store}, nil -} - -func (s *state4) ForEachDeadline(cb func(uint64, Deadline) error) error { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - return dls.ForEach(s.store, func(i uint64, dl *miner4.Deadline) error { - return cb(i, &deadline4{*dl, s.store}) - }) -} - -func (s *state4) NumDeadlines() (uint64, error) { - return miner4.WPoStPeriodDeadlines, nil -} - -func (s *state4) DeadlinesChanged(other State) (bool, error) { - other4, ok := other.(*state4) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - - return !s.State.Deadlines.Equals(other4.Deadlines), nil -} - -func (s *state4) MinerInfoChanged(other State) (bool, error) { - other0, ok := other.(*state4) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.Info.Equals(other0.State.Info), nil -} - -func (s *state4) Info() (MinerInfo, error) { - info, err := s.State.GetInfo(s.store) - if err != nil { - return MinerInfo{}, err - } - - var pid *peer.ID - if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { - pid = &peerID - } - - mi := MinerInfo{ - Owner: info.Owner, - Worker: info.Worker, - ControlAddresses: info.ControlAddresses, - - NewWorker: address.Undef, - WorkerChangeEpoch: -1, - - PeerId: pid, - Multiaddrs: info.Multiaddrs, - WindowPoStProofType: info.WindowPoStProofType, - SectorSize: info.SectorSize, - WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, - ConsensusFaultElapsed: info.ConsensusFaultElapsed, - } - - if info.PendingWorkerKey != nil { - mi.NewWorker = info.PendingWorkerKey.NewWorker - mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt - } - - return mi, nil -} - -func (s *state4) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { - return s.State.RecordedDeadlineInfo(epoch), nil -} - -func (s *state4) DeadlineCronActive() (bool, error) { - return s.State.DeadlineCronActive, nil -} - -func (s *state4) sectors() (adt.Array, error) { - return adt4.AsArray(s.store, s.Sectors, miner4.SectorsAmtBitwidth) -} - -func (s *state4) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { - var si miner4.SectorOnChainInfo - err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return SectorOnChainInfo{}, err - } - - return fromV4SectorOnChainInfo(si), nil -} - -func (s *state4) precommits() (adt.Map, error) { - return adt4.AsMap(s.store, s.PreCommittedSectors, builtin4.DefaultHamtBitwidth) -} - -func (s *state4) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { - var sp miner4.SectorPreCommitOnChainInfo - err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return SectorPreCommitOnChainInfo{}, err - } - - return fromV4SectorPreCommitOnChainInfo(sp), nil -} - -func (s *state4) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner4.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner4.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } - - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - -} - -func (d *deadline4) LoadPartition(idx uint64) (Partition, error) { - p, err := d.Deadline.LoadPartition(d.store, idx) - if err != nil { - return nil, err - } - return &partition4{*p, d.store}, nil -} - -func (d *deadline4) ForEachPartition(cb func(uint64, Partition) error) error { - ps, err := d.Deadline.PartitionsArray(d.store) - if err != nil { - return err - } - var part miner4.Partition - return ps.ForEach(&part, func(i int64) error { - return cb(uint64(i), &partition4{part, d.store}) - }) -} - -func (d *deadline4) PartitionsChanged(other Deadline) (bool, error) { - other4, ok := other.(*deadline4) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - - return !d.Deadline.Partitions.Equals(other4.Deadline.Partitions), nil -} - -func (d *deadline4) PartitionsPoSted() (bitfield.BitField, error) { - return d.Deadline.PartitionsPoSted, nil -} - -func (d *deadline4) DisputableProofCount() (uint64, error) { - - ops, err := d.OptimisticProofsSnapshotArray(d.store) - if err != nil { - return 0, err - } - - return ops.Length(), nil - -} - -func (p *partition4) AllSectors() (bitfield.BitField, error) { - return p.Partition.Sectors, nil -} - -func (p *partition4) FaultySectors() (bitfield.BitField, error) { - return p.Partition.Faults, nil -} - -func (p *partition4) RecoveringSectors() (bitfield.BitField, error) { - return p.Partition.Recoveries, nil -} - -func (p *partition4) UnprovenSectors() (bitfield.BitField, error) { - return p.Partition.Unproven, nil -} - -func fromV4SectorOnChainInfo(v4 miner4.SectorOnChainInfo) SectorOnChainInfo { - info := SectorOnChainInfo{ - SectorNumber: v4.SectorNumber, - SealProof: v4.SealProof, - SealedCID: v4.SealedCID, - DealIDs: v4.DealIDs, - Activation: v4.Activation, - Expiration: v4.Expiration, - DealWeight: v4.DealWeight, - VerifiedDealWeight: v4.VerifiedDealWeight, - InitialPledge: v4.InitialPledge, - ExpectedDayReward: v4.ExpectedDayReward, - ExpectedStoragePledge: v4.ExpectedStoragePledge, - } - return info -} - -func fromV4SectorPreCommitOnChainInfo(v4 miner4.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { - - return SectorPreCommitOnChainInfo{ - Info: (SectorPreCommitInfo)(v4.Info), - PreCommitDeposit: v4.PreCommitDeposit, - PreCommitEpoch: v4.PreCommitEpoch, - DealWeight: v4.DealWeight, - VerifiedDealWeight: v4.VerifiedDealWeight, - } - -} - -func (s *state4) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/miner/v5.go b/pkg/types/specactors/builtin/miner/v5.go deleted file mode 100644 index 16962a7a51..0000000000 --- a/pkg/types/specactors/builtin/miner/v5.go +++ /dev/null @@ -1,572 +0,0 @@ -// FETCHED FROM LOTUS: builtin/miner/state.go.template - -package miner - -import ( - "bytes" - "errors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" - adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" -) - -var _ State = (*state5)(nil) - -func load5(store adt.Store, root cid.Cid) (State, error) { - out := state5{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make5(store adt.Store) (State, error) { - out := state5{store: store} - out.State = miner5.State{} - return &out, nil -} - -type state5 struct { - miner5.State - store adt.Store -} - -type deadline5 struct { - miner5.Deadline - store adt.Store -} - -type partition5 struct { - miner5.Partition - store adt.Store -} - -func (s *state5) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { - defer func() { - if r := recover(); r != nil { - err = xerrors.Errorf("failed to get available balance: %w", r) - available = abi.NewTokenAmount(0) - } - }() - // this panics if the miner doesnt have enough funds to cover their locked pledge - available, err = s.GetAvailableBalance(bal) - return available, err -} - -func (s *state5) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { - return s.CheckVestedFunds(s.store, epoch) -} - -func (s *state5) LockedFunds() (LockedFunds, error) { - return LockedFunds{ - VestingFunds: s.State.LockedFunds, - InitialPledgeRequirement: s.State.InitialPledge, - PreCommitDeposits: s.State.PreCommitDeposits, - }, nil -} - -func (s *state5) FeeDebt() (abi.TokenAmount, error) { - return s.State.FeeDebt, nil -} - -func (s *state5) InitialPledge() (abi.TokenAmount, error) { - return s.State.InitialPledge, nil -} - -func (s *state5) PreCommitDeposits() (abi.TokenAmount, error) { - return s.State.PreCommitDeposits, nil -} - -func (s *state5) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { - info, ok, err := s.State.GetSector(s.store, num) - if !ok || err != nil { - return nil, err - } - - ret := fromV5SectorOnChainInfo(*info) - return &ret, nil -} - -func (s *state5) FindSector(num abi.SectorNumber) (*SectorLocation, error) { - dlIdx, partIdx, err := s.State.FindSector(s.store, num) - if err != nil { - return nil, err - } - return &SectorLocation{ - Deadline: dlIdx, - Partition: partIdx, - }, nil -} - -func (s *state5) NumLiveSectors() (uint64, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return 0, err - } - var total uint64 - if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner5.Deadline) error { - total += dl.LiveSectors - return nil - }); err != nil { - return 0, err - } - return total, nil -} - -// GetSectorExpiration returns the effective expiration of the given sector. -// -// If the sector does not expire early, the Early expiration field is 0. -func (s *state5) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return nil, err - } - // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be - // learned from the sector info), or in the next quantized expiration - // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries - // of the expiration queue. - - stopErr := errors.New("stop") - out := SectorExpiration{} - err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner5.Deadline) error { - partitions, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - quant := s.State.QuantSpecForDeadline(dlIdx) - var part miner5.Partition - return partitions.ForEach(&part, func(partIdx int64) error { - if found, err := part.Sectors.IsSet(uint64(num)); err != nil { - return err - } else if !found { - return nil - } - if found, err := part.Terminated.IsSet(uint64(num)); err != nil { - return err - } else if found { - // already terminated - return stopErr - } - - q, err := miner5.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner5.PartitionExpirationAmtBitwidth) - if err != nil { - return err - } - var exp miner5.ExpirationSet - return q.ForEach(&exp, func(epoch int64) error { - if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { - return err - } else if early { - out.Early = abi.ChainEpoch(epoch) - return nil - } - if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { - return err - } else if onTime { - out.OnTime = abi.ChainEpoch(epoch) - return stopErr - } - return nil - }) - }) - }) - if err == stopErr { - err = nil - } - if err != nil { - return nil, err - } - if out.Early == 0 && out.OnTime == 0 { - return nil, xerrors.Errorf("failed to find sector %d", num) - } - return &out, nil -} - -func (s *state5) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { - info, ok, err := s.State.GetPrecommittedSector(s.store, num) - if !ok || err != nil { - return nil, err - } - - ret := fromV5SectorPreCommitOnChainInfo(*info) - - return &ret, nil -} - -func (s *state5) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt5.AsMap(s.store, s.State.PreCommittedSectors, builtin5.DefaultHamtBitwidth) - if err != nil { - return err - } - - var info miner5.SectorPreCommitOnChainInfo - if err := precommitted.ForEach(&info, func(_ string) error { - return cb(fromV5SectorPreCommitOnChainInfo(info)) - }); err != nil { - return err - } - - return nil -} - -func (s *state5) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { - sectors, err := miner5.LoadSectors(s.store, s.State.Sectors) - if err != nil { - return nil, err - } - - // If no sector numbers are specified, load all. - if snos == nil { - infos := make([]*SectorOnChainInfo, 0, sectors.Length()) - var info5 miner5.SectorOnChainInfo - if err := sectors.ForEach(&info5, func(_ int64) error { - info := fromV5SectorOnChainInfo(info5) - infos = append(infos, &info) - return nil - }); err != nil { - return nil, err - } - return infos, nil - } - - // Otherwise, load selected. - infos5, err := sectors.Load(*snos) - if err != nil { - return nil, err - } - infos := make([]*SectorOnChainInfo, len(infos5)) - for i, info5 := range infos5 { - info := fromV5SectorOnChainInfo(*info5) - infos[i] = &info - } - return infos, nil -} - -func (s *state5) loadAllocatedSectorNumbers() (bitfield.BitField, error) { - var allocatedSectors bitfield.BitField - err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) - return allocatedSectors, err -} - -func (s *state5) IsAllocated(num abi.SectorNumber) (bool, error) { - allocatedSectors, err := s.loadAllocatedSectorNumbers() - if err != nil { - return false, err - } - - return allocatedSectors.IsSet(uint64(num)) -} - -func (s *state5) GetProvingPeriodStart() (abi.ChainEpoch, error) { - return s.State.ProvingPeriodStart, nil -} - -func (s *state5) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { - allocatedSectors, err := s.loadAllocatedSectorNumbers() - if err != nil { - return nil, err - } - - allocatedRuns, err := allocatedSectors.RunIterator() - if err != nil { - return nil, err - } - - unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, - allocatedRuns, - ) - if err != nil { - return nil, err - } - - iter, err := rle.BitsFromRuns(unallocatedRuns) - if err != nil { - return nil, err - } - - sectors := make([]abi.SectorNumber, 0, count) - for iter.HasNext() && len(sectors) < count { - nextNo, err := iter.Next() - if err != nil { - return nil, err - } - sectors = append(sectors, abi.SectorNumber(nextNo)) - } - - return sectors, nil -} - -func (s *state5) GetAllocatedSectors() (*bitfield.BitField, error) { - var allocatedSectors bitfield.BitField - if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { - return nil, err - } - - return &allocatedSectors, nil -} - -func (s *state5) LoadDeadline(idx uint64) (Deadline, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return nil, err - } - dl, err := dls.LoadDeadline(s.store, idx) - if err != nil { - return nil, err - } - return &deadline5{*dl, s.store}, nil -} - -func (s *state5) ForEachDeadline(cb func(uint64, Deadline) error) error { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - return dls.ForEach(s.store, func(i uint64, dl *miner5.Deadline) error { - return cb(i, &deadline5{*dl, s.store}) - }) -} - -func (s *state5) NumDeadlines() (uint64, error) { - return miner5.WPoStPeriodDeadlines, nil -} - -func (s *state5) DeadlinesChanged(other State) (bool, error) { - other5, ok := other.(*state5) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - - return !s.State.Deadlines.Equals(other5.Deadlines), nil -} - -func (s *state5) MinerInfoChanged(other State) (bool, error) { - other0, ok := other.(*state5) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.Info.Equals(other0.State.Info), nil -} - -func (s *state5) Info() (MinerInfo, error) { - info, err := s.State.GetInfo(s.store) - if err != nil { - return MinerInfo{}, err - } - - var pid *peer.ID - if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { - pid = &peerID - } - - mi := MinerInfo{ - Owner: info.Owner, - Worker: info.Worker, - ControlAddresses: info.ControlAddresses, - - NewWorker: address.Undef, - WorkerChangeEpoch: -1, - - PeerId: pid, - Multiaddrs: info.Multiaddrs, - WindowPoStProofType: info.WindowPoStProofType, - SectorSize: info.SectorSize, - WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, - ConsensusFaultElapsed: info.ConsensusFaultElapsed, - } - - if info.PendingWorkerKey != nil { - mi.NewWorker = info.PendingWorkerKey.NewWorker - mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt - } - - return mi, nil -} - -func (s *state5) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { - return s.State.RecordedDeadlineInfo(epoch), nil -} - -func (s *state5) DeadlineCronActive() (bool, error) { - return s.State.DeadlineCronActive, nil -} - -func (s *state5) sectors() (adt.Array, error) { - return adt5.AsArray(s.store, s.Sectors, miner5.SectorsAmtBitwidth) -} - -func (s *state5) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { - var si miner5.SectorOnChainInfo - err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return SectorOnChainInfo{}, err - } - - return fromV5SectorOnChainInfo(si), nil -} - -func (s *state5) precommits() (adt.Map, error) { - return adt5.AsMap(s.store, s.PreCommittedSectors, builtin5.DefaultHamtBitwidth) -} - -func (s *state5) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { - var sp miner5.SectorPreCommitOnChainInfo - err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return SectorPreCommitOnChainInfo{}, err - } - - return fromV5SectorPreCommitOnChainInfo(sp), nil -} - -func (s *state5) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner5.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner5.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } - - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - -} - -func (d *deadline5) LoadPartition(idx uint64) (Partition, error) { - p, err := d.Deadline.LoadPartition(d.store, idx) - if err != nil { - return nil, err - } - return &partition5{*p, d.store}, nil -} - -func (d *deadline5) ForEachPartition(cb func(uint64, Partition) error) error { - ps, err := d.Deadline.PartitionsArray(d.store) - if err != nil { - return err - } - var part miner5.Partition - return ps.ForEach(&part, func(i int64) error { - return cb(uint64(i), &partition5{part, d.store}) - }) -} - -func (d *deadline5) PartitionsChanged(other Deadline) (bool, error) { - other5, ok := other.(*deadline5) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - - return !d.Deadline.Partitions.Equals(other5.Deadline.Partitions), nil -} - -func (d *deadline5) PartitionsPoSted() (bitfield.BitField, error) { - return d.Deadline.PartitionsPoSted, nil -} - -func (d *deadline5) DisputableProofCount() (uint64, error) { - - ops, err := d.OptimisticProofsSnapshotArray(d.store) - if err != nil { - return 0, err - } - - return ops.Length(), nil - -} - -func (p *partition5) AllSectors() (bitfield.BitField, error) { - return p.Partition.Sectors, nil -} - -func (p *partition5) FaultySectors() (bitfield.BitField, error) { - return p.Partition.Faults, nil -} - -func (p *partition5) RecoveringSectors() (bitfield.BitField, error) { - return p.Partition.Recoveries, nil -} - -func (p *partition5) UnprovenSectors() (bitfield.BitField, error) { - return p.Partition.Unproven, nil -} - -func fromV5SectorOnChainInfo(v5 miner5.SectorOnChainInfo) SectorOnChainInfo { - info := SectorOnChainInfo{ - SectorNumber: v5.SectorNumber, - SealProof: v5.SealProof, - SealedCID: v5.SealedCID, - DealIDs: v5.DealIDs, - Activation: v5.Activation, - Expiration: v5.Expiration, - DealWeight: v5.DealWeight, - VerifiedDealWeight: v5.VerifiedDealWeight, - InitialPledge: v5.InitialPledge, - ExpectedDayReward: v5.ExpectedDayReward, - ExpectedStoragePledge: v5.ExpectedStoragePledge, - } - return info -} - -func fromV5SectorPreCommitOnChainInfo(v5 miner5.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { - - return SectorPreCommitOnChainInfo{ - Info: (SectorPreCommitInfo)(v5.Info), - PreCommitDeposit: v5.PreCommitDeposit, - PreCommitEpoch: v5.PreCommitEpoch, - DealWeight: v5.DealWeight, - VerifiedDealWeight: v5.VerifiedDealWeight, - } - -} - -func (s *state5) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/miner/v6.go b/pkg/types/specactors/builtin/miner/v6.go deleted file mode 100644 index bff57c27fa..0000000000 --- a/pkg/types/specactors/builtin/miner/v6.go +++ /dev/null @@ -1,572 +0,0 @@ -// FETCHED FROM LOTUS: builtin/miner/state.go.template - -package miner - -import ( - "bytes" - "errors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" - adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" -) - -var _ State = (*state6)(nil) - -func load6(store adt.Store, root cid.Cid) (State, error) { - out := state6{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make6(store adt.Store) (State, error) { - out := state6{store: store} - out.State = miner6.State{} - return &out, nil -} - -type state6 struct { - miner6.State - store adt.Store -} - -type deadline6 struct { - miner6.Deadline - store adt.Store -} - -type partition6 struct { - miner6.Partition - store adt.Store -} - -func (s *state6) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { - defer func() { - if r := recover(); r != nil { - err = xerrors.Errorf("failed to get available balance: %w", r) - available = abi.NewTokenAmount(0) - } - }() - // this panics if the miner doesnt have enough funds to cover their locked pledge - available, err = s.GetAvailableBalance(bal) - return available, err -} - -func (s *state6) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { - return s.CheckVestedFunds(s.store, epoch) -} - -func (s *state6) LockedFunds() (LockedFunds, error) { - return LockedFunds{ - VestingFunds: s.State.LockedFunds, - InitialPledgeRequirement: s.State.InitialPledge, - PreCommitDeposits: s.State.PreCommitDeposits, - }, nil -} - -func (s *state6) FeeDebt() (abi.TokenAmount, error) { - return s.State.FeeDebt, nil -} - -func (s *state6) InitialPledge() (abi.TokenAmount, error) { - return s.State.InitialPledge, nil -} - -func (s *state6) PreCommitDeposits() (abi.TokenAmount, error) { - return s.State.PreCommitDeposits, nil -} - -func (s *state6) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { - info, ok, err := s.State.GetSector(s.store, num) - if !ok || err != nil { - return nil, err - } - - ret := fromV6SectorOnChainInfo(*info) - return &ret, nil -} - -func (s *state6) FindSector(num abi.SectorNumber) (*SectorLocation, error) { - dlIdx, partIdx, err := s.State.FindSector(s.store, num) - if err != nil { - return nil, err - } - return &SectorLocation{ - Deadline: dlIdx, - Partition: partIdx, - }, nil -} - -func (s *state6) NumLiveSectors() (uint64, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return 0, err - } - var total uint64 - if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner6.Deadline) error { - total += dl.LiveSectors - return nil - }); err != nil { - return 0, err - } - return total, nil -} - -// GetSectorExpiration returns the effective expiration of the given sector. -// -// If the sector does not expire early, the Early expiration field is 0. -func (s *state6) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return nil, err - } - // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be - // learned from the sector info), or in the next quantized expiration - // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 42 entries - // of the expiration queue. - - stopErr := errors.New("stop") - out := SectorExpiration{} - err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner6.Deadline) error { - partitions, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - quant := s.State.QuantSpecForDeadline(dlIdx) - var part miner6.Partition - return partitions.ForEach(&part, func(partIdx int64) error { - if found, err := part.Sectors.IsSet(uint64(num)); err != nil { - return err - } else if !found { - return nil - } - if found, err := part.Terminated.IsSet(uint64(num)); err != nil { - return err - } else if found { - // already terminated - return stopErr - } - - q, err := miner6.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner6.PartitionExpirationAmtBitwidth) - if err != nil { - return err - } - var exp miner6.ExpirationSet - return q.ForEach(&exp, func(epoch int64) error { - if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { - return err - } else if early { - out.Early = abi.ChainEpoch(epoch) - return nil - } - if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { - return err - } else if onTime { - out.OnTime = abi.ChainEpoch(epoch) - return stopErr - } - return nil - }) - }) - }) - if err == stopErr { - err = nil - } - if err != nil { - return nil, err - } - if out.Early == 0 && out.OnTime == 0 { - return nil, xerrors.Errorf("failed to find sector %d", num) - } - return &out, nil -} - -func (s *state6) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { - info, ok, err := s.State.GetPrecommittedSector(s.store, num) - if !ok || err != nil { - return nil, err - } - - ret := fromV6SectorPreCommitOnChainInfo(*info) - - return &ret, nil -} - -func (s *state6) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt6.AsMap(s.store, s.State.PreCommittedSectors, builtin6.DefaultHamtBitwidth) - if err != nil { - return err - } - - var info miner6.SectorPreCommitOnChainInfo - if err := precommitted.ForEach(&info, func(_ string) error { - return cb(fromV6SectorPreCommitOnChainInfo(info)) - }); err != nil { - return err - } - - return nil -} - -func (s *state6) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { - sectors, err := miner6.LoadSectors(s.store, s.State.Sectors) - if err != nil { - return nil, err - } - - // If no sector numbers are specified, load all. - if snos == nil { - infos := make([]*SectorOnChainInfo, 0, sectors.Length()) - var info6 miner6.SectorOnChainInfo - if err := sectors.ForEach(&info6, func(_ int64) error { - info := fromV6SectorOnChainInfo(info6) - infos = append(infos, &info) - return nil - }); err != nil { - return nil, err - } - return infos, nil - } - - // Otherwise, load selected. - infos6, err := sectors.Load(*snos) - if err != nil { - return nil, err - } - infos := make([]*SectorOnChainInfo, len(infos6)) - for i, info6 := range infos6 { - info := fromV6SectorOnChainInfo(*info6) - infos[i] = &info - } - return infos, nil -} - -func (s *state6) loadAllocatedSectorNumbers() (bitfield.BitField, error) { - var allocatedSectors bitfield.BitField - err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) - return allocatedSectors, err -} - -func (s *state6) IsAllocated(num abi.SectorNumber) (bool, error) { - allocatedSectors, err := s.loadAllocatedSectorNumbers() - if err != nil { - return false, err - } - - return allocatedSectors.IsSet(uint64(num)) -} - -func (s *state6) GetProvingPeriodStart() (abi.ChainEpoch, error) { - return s.State.ProvingPeriodStart, nil -} - -func (s *state6) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { - allocatedSectors, err := s.loadAllocatedSectorNumbers() - if err != nil { - return nil, err - } - - allocatedRuns, err := allocatedSectors.RunIterator() - if err != nil { - return nil, err - } - - unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, - allocatedRuns, - ) - if err != nil { - return nil, err - } - - iter, err := rle.BitsFromRuns(unallocatedRuns) - if err != nil { - return nil, err - } - - sectors := make([]abi.SectorNumber, 0, count) - for iter.HasNext() && len(sectors) < count { - nextNo, err := iter.Next() - if err != nil { - return nil, err - } - sectors = append(sectors, abi.SectorNumber(nextNo)) - } - - return sectors, nil -} - -func (s *state6) GetAllocatedSectors() (*bitfield.BitField, error) { - var allocatedSectors bitfield.BitField - if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { - return nil, err - } - - return &allocatedSectors, nil -} - -func (s *state6) LoadDeadline(idx uint64) (Deadline, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return nil, err - } - dl, err := dls.LoadDeadline(s.store, idx) - if err != nil { - return nil, err - } - return &deadline6{*dl, s.store}, nil -} - -func (s *state6) ForEachDeadline(cb func(uint64, Deadline) error) error { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - return dls.ForEach(s.store, func(i uint64, dl *miner6.Deadline) error { - return cb(i, &deadline6{*dl, s.store}) - }) -} - -func (s *state6) NumDeadlines() (uint64, error) { - return miner6.WPoStPeriodDeadlines, nil -} - -func (s *state6) DeadlinesChanged(other State) (bool, error) { - other6, ok := other.(*state6) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - - return !s.State.Deadlines.Equals(other6.Deadlines), nil -} - -func (s *state6) MinerInfoChanged(other State) (bool, error) { - other0, ok := other.(*state6) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.Info.Equals(other0.State.Info), nil -} - -func (s *state6) Info() (MinerInfo, error) { - info, err := s.State.GetInfo(s.store) - if err != nil { - return MinerInfo{}, err - } - - var pid *peer.ID - if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { - pid = &peerID - } - - mi := MinerInfo{ - Owner: info.Owner, - Worker: info.Worker, - ControlAddresses: info.ControlAddresses, - - NewWorker: address.Undef, - WorkerChangeEpoch: -1, - - PeerId: pid, - Multiaddrs: info.Multiaddrs, - WindowPoStProofType: info.WindowPoStProofType, - SectorSize: info.SectorSize, - WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, - ConsensusFaultElapsed: info.ConsensusFaultElapsed, - } - - if info.PendingWorkerKey != nil { - mi.NewWorker = info.PendingWorkerKey.NewWorker - mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt - } - - return mi, nil -} - -func (s *state6) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { - return s.State.RecordedDeadlineInfo(epoch), nil -} - -func (s *state6) DeadlineCronActive() (bool, error) { - return s.State.DeadlineCronActive, nil -} - -func (s *state6) sectors() (adt.Array, error) { - return adt6.AsArray(s.store, s.Sectors, miner6.SectorsAmtBitwidth) -} - -func (s *state6) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { - var si miner6.SectorOnChainInfo - err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return SectorOnChainInfo{}, err - } - - return fromV6SectorOnChainInfo(si), nil -} - -func (s *state6) precommits() (adt.Map, error) { - return adt6.AsMap(s.store, s.PreCommittedSectors, builtin6.DefaultHamtBitwidth) -} - -func (s *state6) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { - var sp miner6.SectorPreCommitOnChainInfo - err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return SectorPreCommitOnChainInfo{}, err - } - - return fromV6SectorPreCommitOnChainInfo(sp), nil -} - -func (s *state6) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner6.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner6.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } - - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - -} - -func (d *deadline6) LoadPartition(idx uint64) (Partition, error) { - p, err := d.Deadline.LoadPartition(d.store, idx) - if err != nil { - return nil, err - } - return &partition6{*p, d.store}, nil -} - -func (d *deadline6) ForEachPartition(cb func(uint64, Partition) error) error { - ps, err := d.Deadline.PartitionsArray(d.store) - if err != nil { - return err - } - var part miner6.Partition - return ps.ForEach(&part, func(i int64) error { - return cb(uint64(i), &partition6{part, d.store}) - }) -} - -func (d *deadline6) PartitionsChanged(other Deadline) (bool, error) { - other6, ok := other.(*deadline6) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - - return !d.Deadline.Partitions.Equals(other6.Deadline.Partitions), nil -} - -func (d *deadline6) PartitionsPoSted() (bitfield.BitField, error) { - return d.Deadline.PartitionsPoSted, nil -} - -func (d *deadline6) DisputableProofCount() (uint64, error) { - - ops, err := d.OptimisticProofsSnapshotArray(d.store) - if err != nil { - return 0, err - } - - return ops.Length(), nil - -} - -func (p *partition6) AllSectors() (bitfield.BitField, error) { - return p.Partition.Sectors, nil -} - -func (p *partition6) FaultySectors() (bitfield.BitField, error) { - return p.Partition.Faults, nil -} - -func (p *partition6) RecoveringSectors() (bitfield.BitField, error) { - return p.Partition.Recoveries, nil -} - -func (p *partition6) UnprovenSectors() (bitfield.BitField, error) { - return p.Partition.Unproven, nil -} - -func fromV6SectorOnChainInfo(v6 miner6.SectorOnChainInfo) SectorOnChainInfo { - info := SectorOnChainInfo{ - SectorNumber: v6.SectorNumber, - SealProof: v6.SealProof, - SealedCID: v6.SealedCID, - DealIDs: v6.DealIDs, - Activation: v6.Activation, - Expiration: v6.Expiration, - DealWeight: v6.DealWeight, - VerifiedDealWeight: v6.VerifiedDealWeight, - InitialPledge: v6.InitialPledge, - ExpectedDayReward: v6.ExpectedDayReward, - ExpectedStoragePledge: v6.ExpectedStoragePledge, - } - return info -} - -func fromV6SectorPreCommitOnChainInfo(v6 miner6.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { - - return SectorPreCommitOnChainInfo{ - Info: (SectorPreCommitInfo)(v6.Info), - PreCommitDeposit: v6.PreCommitDeposit, - PreCommitEpoch: v6.PreCommitEpoch, - DealWeight: v6.DealWeight, - VerifiedDealWeight: v6.VerifiedDealWeight, - } - -} - -func (s *state6) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/miner/v7.go b/pkg/types/specactors/builtin/miner/v7.go deleted file mode 100644 index 3e5aa32a84..0000000000 --- a/pkg/types/specactors/builtin/miner/v7.go +++ /dev/null @@ -1,573 +0,0 @@ -// FETCHED FROM LOTUS: builtin/miner/state.go.template - -package miner - -import ( - "bytes" - "errors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" - rle "github.com/filecoin-project/go-bitfield/rle" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/dline" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/peer" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - - miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" - adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" -) - -var _ State = (*state7)(nil) - -func load7(store adt.Store, root cid.Cid) (State, error) { - out := state7{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make7(store adt.Store) (State, error) { - out := state7{store: store} - out.State = miner7.State{} - return &out, nil -} - -type state7 struct { - miner7.State - store adt.Store -} - -type deadline7 struct { - miner7.Deadline - store adt.Store -} - -type partition7 struct { - miner7.Partition - store adt.Store -} - -func (s *state7) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { - defer func() { - if r := recover(); r != nil { - err = xerrors.Errorf("failed to get available balance: %w", r) - available = abi.NewTokenAmount(0) - } - }() - // this panics if the miner doesnt have enough funds to cover their locked pledge - available, err = s.GetAvailableBalance(bal) - return available, err -} - -func (s *state7) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { - return s.CheckVestedFunds(s.store, epoch) -} - -func (s *state7) LockedFunds() (LockedFunds, error) { - return LockedFunds{ - VestingFunds: s.State.LockedFunds, - InitialPledgeRequirement: s.State.InitialPledge, - PreCommitDeposits: s.State.PreCommitDeposits, - }, nil -} - -func (s *state7) FeeDebt() (abi.TokenAmount, error) { - return s.State.FeeDebt, nil -} - -func (s *state7) InitialPledge() (abi.TokenAmount, error) { - return s.State.InitialPledge, nil -} - -func (s *state7) PreCommitDeposits() (abi.TokenAmount, error) { - return s.State.PreCommitDeposits, nil -} - -func (s *state7) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { - info, ok, err := s.State.GetSector(s.store, num) - if !ok || err != nil { - return nil, err - } - - ret := fromV7SectorOnChainInfo(*info) - return &ret, nil -} - -func (s *state7) FindSector(num abi.SectorNumber) (*SectorLocation, error) { - dlIdx, partIdx, err := s.State.FindSector(s.store, num) - if err != nil { - return nil, err - } - return &SectorLocation{ - Deadline: dlIdx, - Partition: partIdx, - }, nil -} - -func (s *state7) NumLiveSectors() (uint64, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return 0, err - } - var total uint64 - if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner7.Deadline) error { - total += dl.LiveSectors - return nil - }); err != nil { - return 0, err - } - return total, nil -} - -// GetSectorExpiration returns the effective expiration of the given sector. -// -// If the sector does not expire early, the Early expiration field is 0. -func (s *state7) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return nil, err - } - // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will expire on-time (can be - // learned from the sector info). - // 2. If it's faulty, it will expire early within the first 42 entries - // of the expiration queue. - - stopErr := errors.New("stop") - out := SectorExpiration{} - err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner7.Deadline) error { - partitions, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - quant := s.State.QuantSpecForDeadline(dlIdx) - var part miner7.Partition - return partitions.ForEach(&part, func(partIdx int64) error { - if found, err := part.Sectors.IsSet(uint64(num)); err != nil { - return err - } else if !found { - return nil - } - if found, err := part.Terminated.IsSet(uint64(num)); err != nil { - return err - } else if found { - // already terminated - return stopErr - } - - q, err := miner7.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner7.PartitionExpirationAmtBitwidth) - if err != nil { - return err - } - var exp miner7.ExpirationSet - return q.ForEach(&exp, func(epoch int64) error { - if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { - return err - } else if early { - out.Early = abi.ChainEpoch(epoch) - return nil - } - if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { - return err - } else if onTime { - out.OnTime = abi.ChainEpoch(epoch) - return stopErr - } - return nil - }) - }) - }) - if err == stopErr { - err = nil - } - if err != nil { - return nil, err - } - if out.Early == 0 && out.OnTime == 0 { - return nil, xerrors.Errorf("failed to find sector %d", num) - } - return &out, nil -} - -func (s *state7) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { - info, ok, err := s.State.GetPrecommittedSector(s.store, num) - if !ok || err != nil { - return nil, err - } - - ret := fromV7SectorPreCommitOnChainInfo(*info) - - return &ret, nil -} - -func (s *state7) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt7.AsMap(s.store, s.State.PreCommittedSectors, builtin7.DefaultHamtBitwidth) - if err != nil { - return err - } - - var info miner7.SectorPreCommitOnChainInfo - if err := precommitted.ForEach(&info, func(_ string) error { - return cb(fromV7SectorPreCommitOnChainInfo(info)) - }); err != nil { - return err - } - - return nil -} - -func (s *state7) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { - sectors, err := miner7.LoadSectors(s.store, s.State.Sectors) - if err != nil { - return nil, err - } - - // If no sector numbers are specified, load all. - if snos == nil { - infos := make([]*SectorOnChainInfo, 0, sectors.Length()) - var info7 miner7.SectorOnChainInfo - if err := sectors.ForEach(&info7, func(_ int64) error { - info := fromV7SectorOnChainInfo(info7) - infos = append(infos, &info) - return nil - }); err != nil { - return nil, err - } - return infos, nil - } - - // Otherwise, load selected. - infos7, err := sectors.Load(*snos) - if err != nil { - return nil, err - } - infos := make([]*SectorOnChainInfo, len(infos7)) - for i, info7 := range infos7 { - info := fromV7SectorOnChainInfo(*info7) - infos[i] = &info - } - return infos, nil -} - -func (s *state7) loadAllocatedSectorNumbers() (bitfield.BitField, error) { - var allocatedSectors bitfield.BitField - err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) - return allocatedSectors, err -} - -func (s *state7) IsAllocated(num abi.SectorNumber) (bool, error) { - allocatedSectors, err := s.loadAllocatedSectorNumbers() - if err != nil { - return false, err - } - - return allocatedSectors.IsSet(uint64(num)) -} - -func (s *state7) GetProvingPeriodStart() (abi.ChainEpoch, error) { - return s.State.ProvingPeriodStart, nil -} - -func (s *state7) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { - allocatedSectors, err := s.loadAllocatedSectorNumbers() - if err != nil { - return nil, err - } - - allocatedRuns, err := allocatedSectors.RunIterator() - if err != nil { - return nil, err - } - - unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, - allocatedRuns, - ) - if err != nil { - return nil, err - } - - iter, err := rle.BitsFromRuns(unallocatedRuns) - if err != nil { - return nil, err - } - - sectors := make([]abi.SectorNumber, 0, count) - for iter.HasNext() && len(sectors) < count { - nextNo, err := iter.Next() - if err != nil { - return nil, err - } - sectors = append(sectors, abi.SectorNumber(nextNo)) - } - - return sectors, nil -} - -func (s *state7) GetAllocatedSectors() (*bitfield.BitField, error) { - var allocatedSectors bitfield.BitField - if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { - return nil, err - } - - return &allocatedSectors, nil -} - -func (s *state7) LoadDeadline(idx uint64) (Deadline, error) { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return nil, err - } - dl, err := dls.LoadDeadline(s.store, idx) - if err != nil { - return nil, err - } - return &deadline7{*dl, s.store}, nil -} - -func (s *state7) ForEachDeadline(cb func(uint64, Deadline) error) error { - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - return dls.ForEach(s.store, func(i uint64, dl *miner7.Deadline) error { - return cb(i, &deadline7{*dl, s.store}) - }) -} - -func (s *state7) NumDeadlines() (uint64, error) { - return miner7.WPoStPeriodDeadlines, nil -} - -func (s *state7) DeadlinesChanged(other State) (bool, error) { - other7, ok := other.(*state7) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - - return !s.State.Deadlines.Equals(other7.Deadlines), nil -} - -func (s *state7) MinerInfoChanged(other State) (bool, error) { - other0, ok := other.(*state7) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.Info.Equals(other0.State.Info), nil -} - -func (s *state7) Info() (MinerInfo, error) { - info, err := s.State.GetInfo(s.store) - if err != nil { - return MinerInfo{}, err - } - - var pid *peer.ID - if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { - pid = &peerID - } - - mi := MinerInfo{ - Owner: info.Owner, - Worker: info.Worker, - ControlAddresses: info.ControlAddresses, - - NewWorker: address.Undef, - WorkerChangeEpoch: -1, - - PeerId: pid, - Multiaddrs: info.Multiaddrs, - WindowPoStProofType: info.WindowPoStProofType, - SectorSize: info.SectorSize, - WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, - ConsensusFaultElapsed: info.ConsensusFaultElapsed, - } - - if info.PendingWorkerKey != nil { - mi.NewWorker = info.PendingWorkerKey.NewWorker - mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt - } - - return mi, nil -} - -func (s *state7) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { - return s.State.RecordedDeadlineInfo(epoch), nil -} - -func (s *state7) DeadlineCronActive() (bool, error) { - return s.State.DeadlineCronActive, nil -} - -func (s *state7) sectors() (adt.Array, error) { - return adt7.AsArray(s.store, s.Sectors, miner7.SectorsAmtBitwidth) -} - -func (s *state7) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { - var si miner7.SectorOnChainInfo - err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return SectorOnChainInfo{}, err - } - - return fromV7SectorOnChainInfo(si), nil -} - -func (s *state7) precommits() (adt.Map, error) { - return adt7.AsMap(s.store, s.PreCommittedSectors, builtin7.DefaultHamtBitwidth) -} - -func (s *state7) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { - var sp miner7.SectorPreCommitOnChainInfo - err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) - if err != nil { - return SectorPreCommitOnChainInfo{}, err - } - - return fromV7SectorPreCommitOnChainInfo(sp), nil -} - -func (s *state7) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner7.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner7.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } - - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - -} - -func (d *deadline7) LoadPartition(idx uint64) (Partition, error) { - p, err := d.Deadline.LoadPartition(d.store, idx) - if err != nil { - return nil, err - } - return &partition7{*p, d.store}, nil -} - -func (d *deadline7) ForEachPartition(cb func(uint64, Partition) error) error { - ps, err := d.Deadline.PartitionsArray(d.store) - if err != nil { - return err - } - var part miner7.Partition - return ps.ForEach(&part, func(i int64) error { - return cb(uint64(i), &partition7{part, d.store}) - }) -} - -func (d *deadline7) PartitionsChanged(other Deadline) (bool, error) { - other7, ok := other.(*deadline7) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - - return !d.Deadline.Partitions.Equals(other7.Deadline.Partitions), nil -} - -func (d *deadline7) PartitionsPoSted() (bitfield.BitField, error) { - return d.Deadline.PartitionsPoSted, nil -} - -func (d *deadline7) DisputableProofCount() (uint64, error) { - - ops, err := d.OptimisticProofsSnapshotArray(d.store) - if err != nil { - return 0, err - } - - return ops.Length(), nil - -} - -func (p *partition7) AllSectors() (bitfield.BitField, error) { - return p.Partition.Sectors, nil -} - -func (p *partition7) FaultySectors() (bitfield.BitField, error) { - return p.Partition.Faults, nil -} - -func (p *partition7) RecoveringSectors() (bitfield.BitField, error) { - return p.Partition.Recoveries, nil -} - -func (p *partition7) UnprovenSectors() (bitfield.BitField, error) { - return p.Partition.Unproven, nil -} - -func fromV7SectorOnChainInfo(v7 miner7.SectorOnChainInfo) SectorOnChainInfo { - info := SectorOnChainInfo{ - SectorNumber: v7.SectorNumber, - SealProof: v7.SealProof, - SealedCID: v7.SealedCID, - DealIDs: v7.DealIDs, - Activation: v7.Activation, - Expiration: v7.Expiration, - DealWeight: v7.DealWeight, - VerifiedDealWeight: v7.VerifiedDealWeight, - InitialPledge: v7.InitialPledge, - ExpectedDayReward: v7.ExpectedDayReward, - ExpectedStoragePledge: v7.ExpectedStoragePledge, - - SectorKeyCID: v7.SectorKeyCID, - } - return info -} - -func fromV7SectorPreCommitOnChainInfo(v7 miner7.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { - - return SectorPreCommitOnChainInfo{ - Info: (SectorPreCommitInfo)(v7.Info), - PreCommitDeposit: v7.PreCommitDeposit, - PreCommitEpoch: v7.PreCommitEpoch, - DealWeight: v7.DealWeight, - VerifiedDealWeight: v7.VerifiedDealWeight, - } - -} - -func (s *state7) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/multisig/actor.go.template b/pkg/types/specactors/builtin/multisig/actor.go.template deleted file mode 100644 index 411afa16ee..0000000000 --- a/pkg/types/specactors/builtin/multisig/actor.go.template +++ /dev/null @@ -1,143 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/actor.go.template - -package multisig - -import ( - "fmt" - - "github.com/minio/blake2b-simd" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/cbor" - "github.com/ipfs/go-cid" - - msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" - msig{{.latestVersion}} "github.com/filecoin-project/specs-actors{{import .latestVersion}}actors/builtin/multisig" -{{range .versions}} - builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" -{{end}} - - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - types "github.com/filecoin-project/venus/pkg/types/internal" -) - -func init() { -{{range .versions}} - builtin.RegisterActorState(builtin{{.}}.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) -{{end}}} - -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { -{{range .versions}} - case builtin{{.}}.MultisigActorCodeID: - return load{{.}}(store, act.Head) -{{end}} - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return make{{.}}(store, signers, threshold, startEpoch, unlockDuration, initialBalance) -{{end}} -} - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return builtin{{.}}.MultisigActorCodeID, nil -{{end}} - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - cbor.Marshaler - - LockedBalance(epoch abi.ChainEpoch) (abi.TokenAmount, error) - StartEpoch() (abi.ChainEpoch, error) - UnlockDuration() (abi.ChainEpoch, error) - InitialBalance() (abi.TokenAmount, error) - Threshold() (uint64, error) - Signers() ([]address.Address, error) - - ForEachPendingTxn(func(id int64, txn Transaction) error) error - PendingTxnChanged(State) (bool, error) - - transactions() (adt.Map, error) - decodeTransaction(val *cbg.Deferred) (Transaction, error) - GetState() interface{} -} - -type Transaction = msig0.Transaction - -var Methods = builtin{{.latestVersion}}.MethodsMultisig - -func Message(version actors.Version, from address.Address) MessageBuilder { - switch version { -{{range .versions}} - case actors.Version{{.}}: - return message{{.}}{{"{"}}{{if (ge . 2)}}message0{from}{{else}}from{{end}}} -{{end}} default: - panic(fmt.Sprintf("unsupported actors version: %d", version)) - } -} - -type MessageBuilder interface { - // Create a new multisig with the specified parameters. - Create(signers []address.Address, threshold uint64, - vestingStart, vestingDuration abi.ChainEpoch, - initialAmount abi.TokenAmount) (*types.Message, error) - - // Propose a transaction to the given multisig. - Propose(msig, target address.Address, amt abi.TokenAmount, - method abi.MethodNum, params []byte) (*types.Message, error) - - // Approve a multisig transaction. The "hash" is optional. - Approve(msig address.Address, txID uint64, hash *ProposalHashData) (*types.Message, error) - - // Cancel a multisig transaction. The "hash" is optional. - Cancel(msig address.Address, txID uint64, hash *ProposalHashData) (*types.Message, error) -} - -// this type is the same between v0 and v2 -type ProposalHashData = msig{{.latestVersion}}.ProposalHashData -type ProposeReturn = msig{{.latestVersion}}.ProposeReturn -type ProposeParams = msig{{.latestVersion}}.ProposeParams -type ApproveReturn = msig{{.latestVersion}}.ApproveReturn - -func txnParams(id uint64, data *ProposalHashData) ([]byte, error) { - params := msig{{.latestVersion}}.TxnIDParams{ID: msig{{.latestVersion}}.TxnID(id)} - if data != nil { - if data.Requester.Protocol() != address.ID { - return nil, xerrors.Errorf("proposer address must be an ID address, was %s", data.Requester) - } - if data.Value.Sign() == -1 { - return nil, xerrors.Errorf("proposal value must be non-negative, was %s", data.Value) - } - if data.To == address.Undef { - return nil, xerrors.Errorf("proposed destination address must be set") - } - pser, err := data.Serialize() - if err != nil { - return nil, err - } - hash := blake2b.Sum256(pser) - params.ProposalHash = hash[:] - } - - return actors.SerializeParams(¶ms) -} diff --git a/pkg/types/specactors/builtin/multisig/diff.go b/pkg/types/specactors/builtin/multisig/diff.go deleted file mode 100644 index 4d0c4639a4..0000000000 --- a/pkg/types/specactors/builtin/multisig/diff.go +++ /dev/null @@ -1,134 +0,0 @@ -package multisig - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - cbg "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" -) - -type PendingTransactionChanges struct { - Added []TransactionChange - Modified []TransactionModification - Removed []TransactionChange -} - -type TransactionChange struct { - TxID int64 - Tx Transaction -} - -type TransactionModification struct { - TxID int64 - From Transaction - To Transaction -} - -func DiffPendingTransactions(pre, cur State) (*PendingTransactionChanges, error) { - results := new(PendingTransactionChanges) - if changed, err := pre.PendingTxnChanged(cur); err != nil { - return nil, err - } else if !changed { // if nothing has changed then return an empty result and bail. - return results, nil - } - - pret, err := pre.transactions() - if err != nil { - return nil, err - } - - curt, err := cur.transactions() - if err != nil { - return nil, err - } - - if err := adt.DiffAdtMap(pret, curt, &transactionDiffer{results, pre, cur}); err != nil { - return nil, err - } - return results, nil -} - -type transactionDiffer struct { - Results *PendingTransactionChanges - pre, after State -} - -func (t *transactionDiffer) AsKey(key string) (abi.Keyer, error) { - txID, err := abi.ParseIntKey(key) - if err != nil { - return nil, err - } - return abi.IntKey(txID), nil -} - -func (t *transactionDiffer) Add(key string, val *cbg.Deferred) error { - txID, err := abi.ParseIntKey(key) - if err != nil { - return err - } - tx, err := t.after.decodeTransaction(val) - if err != nil { - return err - } - t.Results.Added = append(t.Results.Added, TransactionChange{ - TxID: txID, - Tx: tx, - }) - return nil -} - -func (t *transactionDiffer) Modify(key string, from, to *cbg.Deferred) error { - txID, err := abi.ParseIntKey(key) - if err != nil { - return err - } - - txFrom, err := t.pre.decodeTransaction(from) - if err != nil { - return err - } - - txTo, err := t.after.decodeTransaction(to) - if err != nil { - return err - } - - if approvalsChanged(txFrom.Approved, txTo.Approved) { - t.Results.Modified = append(t.Results.Modified, TransactionModification{ - TxID: txID, - From: txFrom, - To: txTo, - }) - } - - return nil -} - -func approvalsChanged(from, to []address.Address) bool { - if len(from) != len(to) { - return true - } - for idx := range from { - if from[idx] != to[idx] { - return true - } - } - return false -} - -func (t *transactionDiffer) Remove(key string, val *cbg.Deferred) error { - txID, err := abi.ParseIntKey(key) - if err != nil { - return err - } - tx, err := t.pre.decodeTransaction(val) - if err != nil { - return err - } - t.Results.Removed = append(t.Results.Removed, TransactionChange{ - TxID: txID, - Tx: tx, - }) - return nil -} diff --git a/pkg/types/specactors/builtin/multisig/message.go.template b/pkg/types/specactors/builtin/multisig/message.go.template deleted file mode 100644 index 2aab87e4d1..0000000000 --- a/pkg/types/specactors/builtin/multisig/message.go.template +++ /dev/null @@ -1,148 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/message.go.template - -package multisig - -import ( - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" - init{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/init" - multisig{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/multisig" - - actors "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - types "github.com/filecoin-project/venus/pkg/types/internal" -) - -type message{{.v}} struct{ {{if (ge .v 2)}}message0{{else}}from address.Address{{end}} } - -func (m message{{.v}}) Create( - signers []address.Address, threshold uint64, - unlockStart, unlockDuration abi.ChainEpoch, - initialAmount abi.TokenAmount, -) (*types.Message, error) { - - lenAddrs := uint64(len(signers)) - - if lenAddrs < threshold { - return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") - } - - if threshold == 0 { - threshold = lenAddrs - } - - if m.from == address.Undef { - return nil, xerrors.Errorf("must provide source address") - } -{{if (le .v 1)}} - if unlockStart != 0 { - return nil, xerrors.Errorf("actors v0 does not support a non-zero vesting start time") - } -{{end}} - // Set up constructor parameters for multisig - msigParams := &multisig{{.v}}.ConstructorParams{ - Signers: signers, - NumApprovalsThreshold: threshold, - UnlockDuration: unlockDuration,{{if (ge .v 2)}} - StartEpoch: unlockStart,{{end}} - } - - enc, actErr := actors.SerializeParams(msigParams) - if actErr != nil { - return nil, actErr - } - - // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init{{.v}}.ExecParams{ - CodeCID: builtin{{.v}}.MultisigActorCodeID, - ConstructorParams: enc, - } - - enc, actErr = actors.SerializeParams(execParams) - if actErr != nil { - return nil, actErr - } - - return &types.Message{ - To: init_.Address, - From: m.from, - Method: builtin{{.v}}.MethodsInit.Exec, - Params: enc, - Value: initialAmount, - }, nil -} - -{{if (le .v 1)}} - -func (m message0) Propose(msig, to address.Address, amt abi.TokenAmount, - method abi.MethodNum, params []byte) (*types.Message, error) { - - if msig == address.Undef { - return nil, xerrors.Errorf("must provide a multisig address for proposal") - } - - if to == address.Undef { - return nil, xerrors.Errorf("must provide a target address for proposal") - } - - if amt.Sign() == -1 { - return nil, xerrors.Errorf("must provide a non-negative amount for proposed send") - } - - if m.from == address.Undef { - return nil, xerrors.Errorf("must provide source address") - } - - enc, actErr := actors.SerializeParams(&multisig0.ProposeParams{ - To: to, - Value: amt, - Method: method, - Params: params, - }) - if actErr != nil { - return nil, xerrors.Errorf("failed to serialize parameters: %w", actErr) - } - - return &types.Message{ - To: msig, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin0.MethodsMultisig.Propose, - Params: enc, - }, nil -} - -func (m message0) Approve(msig address.Address, txID uint64, hashData *ProposalHashData) (*types.Message, error) { - enc, err := txnParams(txID, hashData) - if err != nil { - return nil, err - } - - return &types.Message{ - To: msig, - From: m.from, - Value: types.NewInt(0), - Method: builtin0.MethodsMultisig.Approve, - Params: enc, - }, nil -} - -func (m message0) Cancel(msig address.Address, txID uint64, hashData *ProposalHashData) (*types.Message, error) { - enc, err := txnParams(txID, hashData) - if err != nil { - return nil, err - } - - return &types.Message{ - To: msig, - From: m.from, - Value: types.NewInt(0), - Method: builtin0.MethodsMultisig.Cancel, - Params: enc, - }, nil -} -{{end}} diff --git a/pkg/types/specactors/builtin/multisig/message0.go b/pkg/types/specactors/builtin/multisig/message0.go deleted file mode 100644 index 448d784270..0000000000 --- a/pkg/types/specactors/builtin/multisig/message0.go +++ /dev/null @@ -1,144 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/message.go.template - -package multisig - -import ( - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" - multisig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" -) - -type message0 struct{ from address.Address } - -func (m message0) Create( - signers []address.Address, threshold uint64, - unlockStart, unlockDuration abi.ChainEpoch, - initialAmount abi.TokenAmount, -) (*types.Message, error) { - - lenAddrs := uint64(len(signers)) - - if lenAddrs < threshold { - return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") - } - - if threshold == 0 { - threshold = lenAddrs - } - - if m.from == address.Undef { - return nil, xerrors.Errorf("must provide source address") - } - - if unlockStart != 0 { - return nil, xerrors.Errorf("actors v0 does not support a non-zero vesting start time") - } - - // Set up constructor parameters for multisig - msigParams := &multisig0.ConstructorParams{ - Signers: signers, - NumApprovalsThreshold: threshold, - UnlockDuration: unlockDuration, - } - - enc, actErr := actors.SerializeParams(msigParams) - if actErr != nil { - return nil, actErr - } - - // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init0.ExecParams{ - CodeCID: builtin0.MultisigActorCodeID, - ConstructorParams: enc, - } - - enc, actErr = actors.SerializeParams(execParams) - if actErr != nil { - return nil, actErr - } - - return &types.Message{ - To: init_.Address, - From: m.from, - Method: builtin0.MethodsInit.Exec, - Params: enc, - Value: initialAmount, - }, nil -} - -func (m message0) Propose(msig, to address.Address, amt abi.TokenAmount, - method abi.MethodNum, params []byte) (*types.Message, error) { - - if msig == address.Undef { - return nil, xerrors.Errorf("must provide a multisig address for proposal") - } - - if to == address.Undef { - return nil, xerrors.Errorf("must provide a target address for proposal") - } - - if amt.Sign() == -1 { - return nil, xerrors.Errorf("must provide a non-negative amount for proposed send") - } - - if m.from == address.Undef { - return nil, xerrors.Errorf("must provide source address") - } - - enc, actErr := actors.SerializeParams(&multisig0.ProposeParams{ - To: to, - Value: amt, - Method: method, - Params: params, - }) - if actErr != nil { - return nil, xerrors.Errorf("failed to serialize parameters: %w", actErr) - } - - return &types.Message{ - To: msig, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin0.MethodsMultisig.Propose, - Params: enc, - }, nil -} - -func (m message0) Approve(msig address.Address, txID uint64, hashData *ProposalHashData) (*types.Message, error) { - enc, err := txnParams(txID, hashData) - if err != nil { - return nil, err - } - - return &types.Message{ - To: msig, - From: m.from, - Value: types.NewInt(0), - Method: builtin0.MethodsMultisig.Approve, - Params: enc, - }, nil -} - -func (m message0) Cancel(msig address.Address, txID uint64, hashData *ProposalHashData) (*types.Message, error) { - enc, err := txnParams(txID, hashData) - if err != nil { - return nil, err - } - - return &types.Message{ - To: msig, - From: m.from, - Value: types.NewInt(0), - Method: builtin0.MethodsMultisig.Cancel, - Params: enc, - }, nil -} diff --git a/pkg/types/specactors/builtin/multisig/message2.go b/pkg/types/specactors/builtin/multisig/message2.go deleted file mode 100644 index 11bf85810e..0000000000 --- a/pkg/types/specactors/builtin/multisig/message2.go +++ /dev/null @@ -1,73 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/message.go.template - -package multisig - -import ( - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" - multisig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" -) - -type message2 struct{ message0 } - -func (m message2) Create( - signers []address.Address, threshold uint64, - unlockStart, unlockDuration abi.ChainEpoch, - initialAmount abi.TokenAmount, -) (*types.Message, error) { - - lenAddrs := uint64(len(signers)) - - if lenAddrs < threshold { - return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") - } - - if threshold == 0 { - threshold = lenAddrs - } - - if m.from == address.Undef { - return nil, xerrors.Errorf("must provide source address") - } - - // Set up constructor parameters for multisig - msigParams := &multisig2.ConstructorParams{ - Signers: signers, - NumApprovalsThreshold: threshold, - UnlockDuration: unlockDuration, - StartEpoch: unlockStart, - } - - enc, actErr := actors.SerializeParams(msigParams) - if actErr != nil { - return nil, actErr - } - - // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init2.ExecParams{ - CodeCID: builtin2.MultisigActorCodeID, - ConstructorParams: enc, - } - - enc, actErr = actors.SerializeParams(execParams) - if actErr != nil { - return nil, actErr - } - - return &types.Message{ - To: init_.Address, - From: m.from, - Method: builtin2.MethodsInit.Exec, - Params: enc, - Value: initialAmount, - }, nil -} diff --git a/pkg/types/specactors/builtin/multisig/message3.go b/pkg/types/specactors/builtin/multisig/message3.go deleted file mode 100644 index 9ab55f1555..0000000000 --- a/pkg/types/specactors/builtin/multisig/message3.go +++ /dev/null @@ -1,73 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/message.go.template - -package multisig - -import ( - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" - multisig3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/multisig" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" -) - -type message3 struct{ message0 } - -func (m message3) Create( - signers []address.Address, threshold uint64, - unlockStart, unlockDuration abi.ChainEpoch, - initialAmount abi.TokenAmount, -) (*types.Message, error) { - - lenAddrs := uint64(len(signers)) - - if lenAddrs < threshold { - return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") - } - - if threshold == 0 { - threshold = lenAddrs - } - - if m.from == address.Undef { - return nil, xerrors.Errorf("must provide source address") - } - - // Set up constructor parameters for multisig - msigParams := &multisig3.ConstructorParams{ - Signers: signers, - NumApprovalsThreshold: threshold, - UnlockDuration: unlockDuration, - StartEpoch: unlockStart, - } - - enc, actErr := actors.SerializeParams(msigParams) - if actErr != nil { - return nil, actErr - } - - // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init3.ExecParams{ - CodeCID: builtin3.MultisigActorCodeID, - ConstructorParams: enc, - } - - enc, actErr = actors.SerializeParams(execParams) - if actErr != nil { - return nil, actErr - } - - return &types.Message{ - To: init_.Address, - From: m.from, - Method: builtin3.MethodsInit.Exec, - Params: enc, - Value: initialAmount, - }, nil -} diff --git a/pkg/types/specactors/builtin/multisig/message4.go b/pkg/types/specactors/builtin/multisig/message4.go deleted file mode 100644 index 7ce37e444c..0000000000 --- a/pkg/types/specactors/builtin/multisig/message4.go +++ /dev/null @@ -1,73 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/message.go.template - -package multisig - -import ( - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" - multisig4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" -) - -type message4 struct{ message0 } - -func (m message4) Create( - signers []address.Address, threshold uint64, - unlockStart, unlockDuration abi.ChainEpoch, - initialAmount abi.TokenAmount, -) (*types.Message, error) { - - lenAddrs := uint64(len(signers)) - - if lenAddrs < threshold { - return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") - } - - if threshold == 0 { - threshold = lenAddrs - } - - if m.from == address.Undef { - return nil, xerrors.Errorf("must provide source address") - } - - // Set up constructor parameters for multisig - msigParams := &multisig4.ConstructorParams{ - Signers: signers, - NumApprovalsThreshold: threshold, - UnlockDuration: unlockDuration, - StartEpoch: unlockStart, - } - - enc, actErr := actors.SerializeParams(msigParams) - if actErr != nil { - return nil, actErr - } - - // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init4.ExecParams{ - CodeCID: builtin4.MultisigActorCodeID, - ConstructorParams: enc, - } - - enc, actErr = actors.SerializeParams(execParams) - if actErr != nil { - return nil, actErr - } - - return &types.Message{ - To: init_.Address, - From: m.from, - Method: builtin4.MethodsInit.Exec, - Params: enc, - Value: initialAmount, - }, nil -} diff --git a/pkg/types/specactors/builtin/multisig/message5.go b/pkg/types/specactors/builtin/multisig/message5.go deleted file mode 100644 index d5cad48782..0000000000 --- a/pkg/types/specactors/builtin/multisig/message5.go +++ /dev/null @@ -1,73 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/message.go.template - -package multisig - -import ( - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" - multisig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" -) - -type message5 struct{ message0 } - -func (m message5) Create( - signers []address.Address, threshold uint64, - unlockStart, unlockDuration abi.ChainEpoch, - initialAmount abi.TokenAmount, -) (*types.Message, error) { - - lenAddrs := uint64(len(signers)) - - if lenAddrs < threshold { - return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") - } - - if threshold == 0 { - threshold = lenAddrs - } - - if m.from == address.Undef { - return nil, xerrors.Errorf("must provide source address") - } - - // Set up constructor parameters for multisig - msigParams := &multisig5.ConstructorParams{ - Signers: signers, - NumApprovalsThreshold: threshold, - UnlockDuration: unlockDuration, - StartEpoch: unlockStart, - } - - enc, actErr := actors.SerializeParams(msigParams) - if actErr != nil { - return nil, actErr - } - - // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init5.ExecParams{ - CodeCID: builtin5.MultisigActorCodeID, - ConstructorParams: enc, - } - - enc, actErr = actors.SerializeParams(execParams) - if actErr != nil { - return nil, actErr - } - - return &types.Message{ - To: init_.Address, - From: m.from, - Method: builtin5.MethodsInit.Exec, - Params: enc, - Value: initialAmount, - }, nil -} diff --git a/pkg/types/specactors/builtin/multisig/message6.go b/pkg/types/specactors/builtin/multisig/message6.go deleted file mode 100644 index e28600c86b..0000000000 --- a/pkg/types/specactors/builtin/multisig/message6.go +++ /dev/null @@ -1,73 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/message.go.template - -package multisig - -import ( - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" - multisig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" -) - -type message6 struct{ message0 } - -func (m message6) Create( - signers []address.Address, threshold uint64, - unlockStart, unlockDuration abi.ChainEpoch, - initialAmount abi.TokenAmount, -) (*types.Message, error) { - - lenAddrs := uint64(len(signers)) - - if lenAddrs < threshold { - return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") - } - - if threshold == 0 { - threshold = lenAddrs - } - - if m.from == address.Undef { - return nil, xerrors.Errorf("must provide source address") - } - - // Set up constructor parameters for multisig - msigParams := &multisig6.ConstructorParams{ - Signers: signers, - NumApprovalsThreshold: threshold, - UnlockDuration: unlockDuration, - StartEpoch: unlockStart, - } - - enc, actErr := actors.SerializeParams(msigParams) - if actErr != nil { - return nil, actErr - } - - // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init6.ExecParams{ - CodeCID: builtin6.MultisigActorCodeID, - ConstructorParams: enc, - } - - enc, actErr = actors.SerializeParams(execParams) - if actErr != nil { - return nil, actErr - } - - return &types.Message{ - To: init_.Address, - From: m.from, - Method: builtin6.MethodsInit.Exec, - Params: enc, - Value: initialAmount, - }, nil -} diff --git a/pkg/types/specactors/builtin/multisig/message7.go b/pkg/types/specactors/builtin/multisig/message7.go deleted file mode 100644 index 7e8e6a0d67..0000000000 --- a/pkg/types/specactors/builtin/multisig/message7.go +++ /dev/null @@ -1,73 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/message.go.template - -package multisig - -import ( - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" - multisig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" -) - -type message7 struct{ message0 } - -func (m message7) Create( - signers []address.Address, threshold uint64, - unlockStart, unlockDuration abi.ChainEpoch, - initialAmount abi.TokenAmount, -) (*types.Message, error) { - - lenAddrs := uint64(len(signers)) - - if lenAddrs < threshold { - return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") - } - - if threshold == 0 { - threshold = lenAddrs - } - - if m.from == address.Undef { - return nil, xerrors.Errorf("must provide source address") - } - - // Set up constructor parameters for multisig - msigParams := &multisig7.ConstructorParams{ - Signers: signers, - NumApprovalsThreshold: threshold, - UnlockDuration: unlockDuration, - StartEpoch: unlockStart, - } - - enc, actErr := actors.SerializeParams(msigParams) - if actErr != nil { - return nil, actErr - } - - // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init7.ExecParams{ - CodeCID: builtin7.MultisigActorCodeID, - ConstructorParams: enc, - } - - enc, actErr = actors.SerializeParams(execParams) - if actErr != nil { - return nil, actErr - } - - return &types.Message{ - To: init_.Address, - From: m.from, - Method: builtin7.MethodsInit.Exec, - Params: enc, - Value: initialAmount, - }, nil -} diff --git a/pkg/types/specactors/builtin/multisig/multisig.go b/pkg/types/specactors/builtin/multisig/multisig.go deleted file mode 100644 index 4380954f9a..0000000000 --- a/pkg/types/specactors/builtin/multisig/multisig.go +++ /dev/null @@ -1,250 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/actor.go.template - -package multisig - -import ( - "fmt" - - "github.com/minio/blake2b-simd" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/cbor" - "github.com/ipfs/go-cid" - - msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" - msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" -) - -func init() { - - builtin.RegisterActorState(builtin0.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - - builtin.RegisterActorState(builtin2.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - - builtin.RegisterActorState(builtin3.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - - builtin.RegisterActorState(builtin4.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - - builtin.RegisterActorState(builtin5.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - - builtin.RegisterActorState(builtin6.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - - builtin.RegisterActorState(builtin7.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) -} - -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { - - case builtin0.MultisigActorCodeID: - return load0(store, act.Head) - - case builtin2.MultisigActorCodeID: - return load2(store, act.Head) - - case builtin3.MultisigActorCodeID: - return load3(store, act.Head) - - case builtin4.MultisigActorCodeID: - return load4(store, act.Head) - - case builtin5.MultisigActorCodeID: - return load5(store, act.Head) - - case builtin6.MultisigActorCodeID: - return load6(store, act.Head) - - case builtin7.MultisigActorCodeID: - return load7(store, act.Head) - - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { - switch av { - - case actors.Version0: - return make0(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - - case actors.Version2: - return make2(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - - case actors.Version3: - return make3(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - - case actors.Version4: - return make4(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - - case actors.Version5: - return make5(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - - case actors.Version6: - return make6(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - - case actors.Version7: - return make7(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - - } - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { - - case actors.Version0: - return builtin0.MultisigActorCodeID, nil - - case actors.Version2: - return builtin2.MultisigActorCodeID, nil - - case actors.Version3: - return builtin3.MultisigActorCodeID, nil - - case actors.Version4: - return builtin4.MultisigActorCodeID, nil - - case actors.Version5: - return builtin5.MultisigActorCodeID, nil - - case actors.Version6: - return builtin6.MultisigActorCodeID, nil - - case actors.Version7: - return builtin7.MultisigActorCodeID, nil - - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - cbor.Marshaler - - LockedBalance(epoch abi.ChainEpoch) (abi.TokenAmount, error) - StartEpoch() (abi.ChainEpoch, error) - UnlockDuration() (abi.ChainEpoch, error) - InitialBalance() (abi.TokenAmount, error) - Threshold() (uint64, error) - Signers() ([]address.Address, error) - - ForEachPendingTxn(func(id int64, txn Transaction) error) error - PendingTxnChanged(State) (bool, error) - - transactions() (adt.Map, error) - decodeTransaction(val *cbg.Deferred) (Transaction, error) - GetState() interface{} -} - -type Transaction = msig0.Transaction - -var Methods = builtin7.MethodsMultisig - -func Message(version actors.Version, from address.Address) MessageBuilder { - switch version { - - case actors.Version0: - return message0{from} - - case actors.Version2: - return message2{message0{from}} - - case actors.Version3: - return message3{message0{from}} - - case actors.Version4: - return message4{message0{from}} - - case actors.Version5: - return message5{message0{from}} - - case actors.Version6: - return message6{message0{from}} - - case actors.Version7: - return message7{message0{from}} - default: - panic(fmt.Sprintf("unsupported actors version: %d", version)) - } -} - -type MessageBuilder interface { - // Create a new multisig with the specified parameters. - Create(signers []address.Address, threshold uint64, - vestingStart, vestingDuration abi.ChainEpoch, - initialAmount abi.TokenAmount) (*types.Message, error) - - // Propose a transaction to the given multisig. - Propose(msig, target address.Address, amt abi.TokenAmount, - method abi.MethodNum, params []byte) (*types.Message, error) - - // Approve a multisig transaction. The "hash" is optional. - Approve(msig address.Address, txID uint64, hash *ProposalHashData) (*types.Message, error) - - // Cancel a multisig transaction. The "hash" is optional. - Cancel(msig address.Address, txID uint64, hash *ProposalHashData) (*types.Message, error) -} - -// this type is the same between v0 and v2 -type ProposalHashData = msig7.ProposalHashData -type ProposeReturn = msig7.ProposeReturn -type ProposeParams = msig7.ProposeParams -type ApproveReturn = msig7.ApproveReturn - -func txnParams(id uint64, data *ProposalHashData) ([]byte, error) { - params := msig7.TxnIDParams{ID: msig7.TxnID(id)} - if data != nil { - if data.Requester.Protocol() != address.ID { - return nil, xerrors.Errorf("proposer address must be an ID address, was %s", data.Requester) - } - if data.Value.Sign() == -1 { - return nil, xerrors.Errorf("proposal value must be non-negative, was %s", data.Value) - } - if data.To == address.Undef { - return nil, xerrors.Errorf("proposed destination address must be set") - } - pser, err := data.Serialize() - if err != nil { - return nil, err - } - hash := blake2b.Sum256(pser) - params.ProposalHash = hash[:] - } - - return actors.SerializeParams(¶ms) -} diff --git a/pkg/types/specactors/builtin/multisig/state.go.template b/pkg/types/specactors/builtin/multisig/state.go.template deleted file mode 100644 index b3d6122fc3..0000000000 --- a/pkg/types/specactors/builtin/multisig/state.go.template +++ /dev/null @@ -1,129 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/state.go.template - -package multisig - -import ( - "bytes" - "encoding/binary" - - adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - -{{if (ge .v 3)}} - builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" -{{end}} - msig{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/multisig" -) - -var _ State = (*state{{.v}})(nil) - -func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { - out := state{{.v}}{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make{{.v}}(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { - out := state{{.v}}{store: store} - out.State = msig{{.v}}.State{} - out.State.Signers = signers - out.State.NumApprovalsThreshold = threshold - out.State.StartEpoch = startEpoch - out.State.UnlockDuration = unlockDuration - out.State.InitialBalance = initialBalance - {{if (le .v 2)}} - em, err := adt{{.v}}.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - {{else}} - em, err := adt{{.v}}.StoreEmptyMap(store, builtin{{.v}}.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - {{end}} - return &out, nil -} - -type state{{.v}} struct { - msig{{.v}}.State - store adt.Store -} - -func (s *state{{.v}}) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { - return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil -} - -func (s *state{{.v}}) StartEpoch() (abi.ChainEpoch, error) { - return s.State.StartEpoch, nil -} - -func (s *state{{.v}}) UnlockDuration() (abi.ChainEpoch, error) { - return s.State.UnlockDuration, nil -} - -func (s *state{{.v}}) InitialBalance() (abi.TokenAmount, error) { - return s.State.InitialBalance, nil -} - -func (s *state{{.v}}) Threshold() (uint64, error) { - return s.State.NumApprovalsThreshold, nil -} - -func (s *state{{.v}}) Signers() ([]address.Address, error) { - return s.State.Signers, nil -} - -func (s *state{{.v}}) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { - arr, err := adt{{.v}}.AsMap(s.store, s.State.PendingTxns{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) - if err != nil { - return err - } - var out msig{{.v}}.Transaction - return arr.ForEach(&out, func(key string) error { - txid, n := binary.Varint([]byte(key)) - if n <= 0 { - return xerrors.Errorf("invalid pending transaction key: %v", key) - } - return cb(txid, (Transaction)(out)) //nolint:unconvert - }) -} - -func (s *state{{.v}}) PendingTxnChanged(other State) (bool, error) { - other{{.v}}, ok := other.(*state{{.v}}) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.PendingTxns.Equals(other{{.v}}.PendingTxns), nil -} - -func (s *state{{.v}}) transactions() (adt.Map, error) { - return adt{{.v}}.AsMap(s.store, s.PendingTxns{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) -} - -func (s *state{{.v}}) decodeTransaction(val *cbg.Deferred) (Transaction, error) { - var tx msig{{.v}}.Transaction - if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return Transaction{}, err - } - return tx, nil -} - -func (s *state{{.v}}) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/multisig/v0.go b/pkg/types/specactors/builtin/multisig/v0.go deleted file mode 100644 index 3f736cdc80..0000000000 --- a/pkg/types/specactors/builtin/multisig/v0.go +++ /dev/null @@ -1,119 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/state.go.template - -package multisig - -import ( - "bytes" - "encoding/binary" - - adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" -) - -var _ State = (*state0)(nil) - -func load0(store adt.Store, root cid.Cid) (State, error) { - out := state0{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make0(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { - out := state0{store: store} - out.State = msig0.State{} - out.State.Signers = signers - out.State.NumApprovalsThreshold = threshold - out.State.StartEpoch = startEpoch - out.State.UnlockDuration = unlockDuration - out.State.InitialBalance = initialBalance - - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - - return &out, nil -} - -type state0 struct { - msig0.State - store adt.Store -} - -func (s *state0) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { - return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil -} - -func (s *state0) StartEpoch() (abi.ChainEpoch, error) { - return s.State.StartEpoch, nil -} - -func (s *state0) UnlockDuration() (abi.ChainEpoch, error) { - return s.State.UnlockDuration, nil -} - -func (s *state0) InitialBalance() (abi.TokenAmount, error) { - return s.State.InitialBalance, nil -} - -func (s *state0) Threshold() (uint64, error) { - return s.State.NumApprovalsThreshold, nil -} - -func (s *state0) Signers() ([]address.Address, error) { - return s.State.Signers, nil -} - -func (s *state0) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { - arr, err := adt0.AsMap(s.store, s.State.PendingTxns) - if err != nil { - return err - } - var out msig0.Transaction - return arr.ForEach(&out, func(key string) error { - txid, n := binary.Varint([]byte(key)) - if n <= 0 { - return xerrors.Errorf("invalid pending transaction key: %v", key) - } - return cb(txid, (Transaction)(out)) //nolint:unconvert - }) -} - -func (s *state0) PendingTxnChanged(other State) (bool, error) { - other0, ok := other.(*state0) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.PendingTxns.Equals(other0.PendingTxns), nil -} - -func (s *state0) transactions() (adt.Map, error) { - return adt0.AsMap(s.store, s.PendingTxns) -} - -func (s *state0) decodeTransaction(val *cbg.Deferred) (Transaction, error) { - var tx msig0.Transaction - if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return Transaction{}, err - } - return tx, nil -} - -func (s *state0) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/multisig/v2.go b/pkg/types/specactors/builtin/multisig/v2.go deleted file mode 100644 index b56bafd72f..0000000000 --- a/pkg/types/specactors/builtin/multisig/v2.go +++ /dev/null @@ -1,119 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/state.go.template - -package multisig - -import ( - "bytes" - "encoding/binary" - - adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - msig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" -) - -var _ State = (*state2)(nil) - -func load2(store adt.Store, root cid.Cid) (State, error) { - out := state2{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make2(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { - out := state2{store: store} - out.State = msig2.State{} - out.State.Signers = signers - out.State.NumApprovalsThreshold = threshold - out.State.StartEpoch = startEpoch - out.State.UnlockDuration = unlockDuration - out.State.InitialBalance = initialBalance - - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - - return &out, nil -} - -type state2 struct { - msig2.State - store adt.Store -} - -func (s *state2) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { - return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil -} - -func (s *state2) StartEpoch() (abi.ChainEpoch, error) { - return s.State.StartEpoch, nil -} - -func (s *state2) UnlockDuration() (abi.ChainEpoch, error) { - return s.State.UnlockDuration, nil -} - -func (s *state2) InitialBalance() (abi.TokenAmount, error) { - return s.State.InitialBalance, nil -} - -func (s *state2) Threshold() (uint64, error) { - return s.State.NumApprovalsThreshold, nil -} - -func (s *state2) Signers() ([]address.Address, error) { - return s.State.Signers, nil -} - -func (s *state2) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { - arr, err := adt2.AsMap(s.store, s.State.PendingTxns) - if err != nil { - return err - } - var out msig2.Transaction - return arr.ForEach(&out, func(key string) error { - txid, n := binary.Varint([]byte(key)) - if n <= 0 { - return xerrors.Errorf("invalid pending transaction key: %v", key) - } - return cb(txid, (Transaction)(out)) //nolint:unconvert - }) -} - -func (s *state2) PendingTxnChanged(other State) (bool, error) { - other2, ok := other.(*state2) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.PendingTxns.Equals(other2.PendingTxns), nil -} - -func (s *state2) transactions() (adt.Map, error) { - return adt2.AsMap(s.store, s.PendingTxns) -} - -func (s *state2) decodeTransaction(val *cbg.Deferred) (Transaction, error) { - var tx msig2.Transaction - if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return Transaction{}, err - } - return tx, nil -} - -func (s *state2) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/multisig/v3.go b/pkg/types/specactors/builtin/multisig/v3.go deleted file mode 100644 index ebe147d2ae..0000000000 --- a/pkg/types/specactors/builtin/multisig/v3.go +++ /dev/null @@ -1,121 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/state.go.template - -package multisig - -import ( - "bytes" - "encoding/binary" - - adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - msig3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/multisig" -) - -var _ State = (*state3)(nil) - -func load3(store adt.Store, root cid.Cid) (State, error) { - out := state3{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make3(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { - out := state3{store: store} - out.State = msig3.State{} - out.State.Signers = signers - out.State.NumApprovalsThreshold = threshold - out.State.StartEpoch = startEpoch - out.State.UnlockDuration = unlockDuration - out.State.InitialBalance = initialBalance - - em, err := adt3.StoreEmptyMap(store, builtin3.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - - return &out, nil -} - -type state3 struct { - msig3.State - store adt.Store -} - -func (s *state3) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { - return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil -} - -func (s *state3) StartEpoch() (abi.ChainEpoch, error) { - return s.State.StartEpoch, nil -} - -func (s *state3) UnlockDuration() (abi.ChainEpoch, error) { - return s.State.UnlockDuration, nil -} - -func (s *state3) InitialBalance() (abi.TokenAmount, error) { - return s.State.InitialBalance, nil -} - -func (s *state3) Threshold() (uint64, error) { - return s.State.NumApprovalsThreshold, nil -} - -func (s *state3) Signers() ([]address.Address, error) { - return s.State.Signers, nil -} - -func (s *state3) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { - arr, err := adt3.AsMap(s.store, s.State.PendingTxns, builtin3.DefaultHamtBitwidth) - if err != nil { - return err - } - var out msig3.Transaction - return arr.ForEach(&out, func(key string) error { - txid, n := binary.Varint([]byte(key)) - if n <= 0 { - return xerrors.Errorf("invalid pending transaction key: %v", key) - } - return cb(txid, (Transaction)(out)) //nolint:unconvert - }) -} - -func (s *state3) PendingTxnChanged(other State) (bool, error) { - other3, ok := other.(*state3) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.PendingTxns.Equals(other3.PendingTxns), nil -} - -func (s *state3) transactions() (adt.Map, error) { - return adt3.AsMap(s.store, s.PendingTxns, builtin3.DefaultHamtBitwidth) -} - -func (s *state3) decodeTransaction(val *cbg.Deferred) (Transaction, error) { - var tx msig3.Transaction - if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return Transaction{}, err - } - return tx, nil -} - -func (s *state3) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/multisig/v4.go b/pkg/types/specactors/builtin/multisig/v4.go deleted file mode 100644 index 756ee7fcd0..0000000000 --- a/pkg/types/specactors/builtin/multisig/v4.go +++ /dev/null @@ -1,121 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/state.go.template - -package multisig - -import ( - "bytes" - "encoding/binary" - - adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - msig4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig" -) - -var _ State = (*state4)(nil) - -func load4(store adt.Store, root cid.Cid) (State, error) { - out := state4{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make4(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { - out := state4{store: store} - out.State = msig4.State{} - out.State.Signers = signers - out.State.NumApprovalsThreshold = threshold - out.State.StartEpoch = startEpoch - out.State.UnlockDuration = unlockDuration - out.State.InitialBalance = initialBalance - - em, err := adt4.StoreEmptyMap(store, builtin4.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - - return &out, nil -} - -type state4 struct { - msig4.State - store adt.Store -} - -func (s *state4) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { - return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil -} - -func (s *state4) StartEpoch() (abi.ChainEpoch, error) { - return s.State.StartEpoch, nil -} - -func (s *state4) UnlockDuration() (abi.ChainEpoch, error) { - return s.State.UnlockDuration, nil -} - -func (s *state4) InitialBalance() (abi.TokenAmount, error) { - return s.State.InitialBalance, nil -} - -func (s *state4) Threshold() (uint64, error) { - return s.State.NumApprovalsThreshold, nil -} - -func (s *state4) Signers() ([]address.Address, error) { - return s.State.Signers, nil -} - -func (s *state4) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { - arr, err := adt4.AsMap(s.store, s.State.PendingTxns, builtin4.DefaultHamtBitwidth) - if err != nil { - return err - } - var out msig4.Transaction - return arr.ForEach(&out, func(key string) error { - txid, n := binary.Varint([]byte(key)) - if n <= 0 { - return xerrors.Errorf("invalid pending transaction key: %v", key) - } - return cb(txid, (Transaction)(out)) //nolint:unconvert - }) -} - -func (s *state4) PendingTxnChanged(other State) (bool, error) { - other4, ok := other.(*state4) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.PendingTxns.Equals(other4.PendingTxns), nil -} - -func (s *state4) transactions() (adt.Map, error) { - return adt4.AsMap(s.store, s.PendingTxns, builtin4.DefaultHamtBitwidth) -} - -func (s *state4) decodeTransaction(val *cbg.Deferred) (Transaction, error) { - var tx msig4.Transaction - if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return Transaction{}, err - } - return tx, nil -} - -func (s *state4) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/multisig/v5.go b/pkg/types/specactors/builtin/multisig/v5.go deleted file mode 100644 index b8b0445406..0000000000 --- a/pkg/types/specactors/builtin/multisig/v5.go +++ /dev/null @@ -1,121 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/state.go.template - -package multisig - -import ( - "bytes" - "encoding/binary" - - adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - msig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig" -) - -var _ State = (*state5)(nil) - -func load5(store adt.Store, root cid.Cid) (State, error) { - out := state5{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make5(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { - out := state5{store: store} - out.State = msig5.State{} - out.State.Signers = signers - out.State.NumApprovalsThreshold = threshold - out.State.StartEpoch = startEpoch - out.State.UnlockDuration = unlockDuration - out.State.InitialBalance = initialBalance - - em, err := adt5.StoreEmptyMap(store, builtin5.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - - return &out, nil -} - -type state5 struct { - msig5.State - store adt.Store -} - -func (s *state5) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { - return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil -} - -func (s *state5) StartEpoch() (abi.ChainEpoch, error) { - return s.State.StartEpoch, nil -} - -func (s *state5) UnlockDuration() (abi.ChainEpoch, error) { - return s.State.UnlockDuration, nil -} - -func (s *state5) InitialBalance() (abi.TokenAmount, error) { - return s.State.InitialBalance, nil -} - -func (s *state5) Threshold() (uint64, error) { - return s.State.NumApprovalsThreshold, nil -} - -func (s *state5) Signers() ([]address.Address, error) { - return s.State.Signers, nil -} - -func (s *state5) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { - arr, err := adt5.AsMap(s.store, s.State.PendingTxns, builtin5.DefaultHamtBitwidth) - if err != nil { - return err - } - var out msig5.Transaction - return arr.ForEach(&out, func(key string) error { - txid, n := binary.Varint([]byte(key)) - if n <= 0 { - return xerrors.Errorf("invalid pending transaction key: %v", key) - } - return cb(txid, (Transaction)(out)) //nolint:unconvert - }) -} - -func (s *state5) PendingTxnChanged(other State) (bool, error) { - other5, ok := other.(*state5) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.PendingTxns.Equals(other5.PendingTxns), nil -} - -func (s *state5) transactions() (adt.Map, error) { - return adt5.AsMap(s.store, s.PendingTxns, builtin5.DefaultHamtBitwidth) -} - -func (s *state5) decodeTransaction(val *cbg.Deferred) (Transaction, error) { - var tx msig5.Transaction - if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return Transaction{}, err - } - return tx, nil -} - -func (s *state5) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/multisig/v6.go b/pkg/types/specactors/builtin/multisig/v6.go deleted file mode 100644 index df6eaf5288..0000000000 --- a/pkg/types/specactors/builtin/multisig/v6.go +++ /dev/null @@ -1,121 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/state.go.template - -package multisig - -import ( - "bytes" - "encoding/binary" - - adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - msig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" -) - -var _ State = (*state6)(nil) - -func load6(store adt.Store, root cid.Cid) (State, error) { - out := state6{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make6(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { - out := state6{store: store} - out.State = msig6.State{} - out.State.Signers = signers - out.State.NumApprovalsThreshold = threshold - out.State.StartEpoch = startEpoch - out.State.UnlockDuration = unlockDuration - out.State.InitialBalance = initialBalance - - em, err := adt6.StoreEmptyMap(store, builtin6.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - - return &out, nil -} - -type state6 struct { - msig6.State - store adt.Store -} - -func (s *state6) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { - return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil -} - -func (s *state6) StartEpoch() (abi.ChainEpoch, error) { - return s.State.StartEpoch, nil -} - -func (s *state6) UnlockDuration() (abi.ChainEpoch, error) { - return s.State.UnlockDuration, nil -} - -func (s *state6) InitialBalance() (abi.TokenAmount, error) { - return s.State.InitialBalance, nil -} - -func (s *state6) Threshold() (uint64, error) { - return s.State.NumApprovalsThreshold, nil -} - -func (s *state6) Signers() ([]address.Address, error) { - return s.State.Signers, nil -} - -func (s *state6) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { - arr, err := adt6.AsMap(s.store, s.State.PendingTxns, builtin6.DefaultHamtBitwidth) - if err != nil { - return err - } - var out msig6.Transaction - return arr.ForEach(&out, func(key string) error { - txid, n := binary.Varint([]byte(key)) - if n <= 0 { - return xerrors.Errorf("invalid pending transaction key: %v", key) - } - return cb(txid, (Transaction)(out)) //nolint:unconvert - }) -} - -func (s *state6) PendingTxnChanged(other State) (bool, error) { - other6, ok := other.(*state6) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.PendingTxns.Equals(other6.PendingTxns), nil -} - -func (s *state6) transactions() (adt.Map, error) { - return adt6.AsMap(s.store, s.PendingTxns, builtin6.DefaultHamtBitwidth) -} - -func (s *state6) decodeTransaction(val *cbg.Deferred) (Transaction, error) { - var tx msig6.Transaction - if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return Transaction{}, err - } - return tx, nil -} - -func (s *state6) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/multisig/v7.go b/pkg/types/specactors/builtin/multisig/v7.go deleted file mode 100644 index b31be9be8a..0000000000 --- a/pkg/types/specactors/builtin/multisig/v7.go +++ /dev/null @@ -1,121 +0,0 @@ -// FETCHED FROM LOTUS: builtin/multisig/state.go.template - -package multisig - -import ( - "bytes" - "encoding/binary" - - adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - - msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" -) - -var _ State = (*state7)(nil) - -func load7(store adt.Store, root cid.Cid) (State, error) { - out := state7{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make7(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { - out := state7{store: store} - out.State = msig7.State{} - out.State.Signers = signers - out.State.NumApprovalsThreshold = threshold - out.State.StartEpoch = startEpoch - out.State.UnlockDuration = unlockDuration - out.State.InitialBalance = initialBalance - - em, err := adt7.StoreEmptyMap(store, builtin7.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - - return &out, nil -} - -type state7 struct { - msig7.State - store adt.Store -} - -func (s *state7) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { - return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil -} - -func (s *state7) StartEpoch() (abi.ChainEpoch, error) { - return s.State.StartEpoch, nil -} - -func (s *state7) UnlockDuration() (abi.ChainEpoch, error) { - return s.State.UnlockDuration, nil -} - -func (s *state7) InitialBalance() (abi.TokenAmount, error) { - return s.State.InitialBalance, nil -} - -func (s *state7) Threshold() (uint64, error) { - return s.State.NumApprovalsThreshold, nil -} - -func (s *state7) Signers() ([]address.Address, error) { - return s.State.Signers, nil -} - -func (s *state7) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { - arr, err := adt7.AsMap(s.store, s.State.PendingTxns, builtin7.DefaultHamtBitwidth) - if err != nil { - return err - } - var out msig7.Transaction - return arr.ForEach(&out, func(key string) error { - txid, n := binary.Varint([]byte(key)) - if n <= 0 { - return xerrors.Errorf("invalid pending transaction key: %v", key) - } - return cb(txid, (Transaction)(out)) //nolint:unconvert - }) -} - -func (s *state7) PendingTxnChanged(other State) (bool, error) { - other7, ok := other.(*state7) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.PendingTxns.Equals(other7.PendingTxns), nil -} - -func (s *state7) transactions() (adt.Map, error) { - return adt7.AsMap(s.store, s.PendingTxns, builtin7.DefaultHamtBitwidth) -} - -func (s *state7) decodeTransaction(val *cbg.Deferred) (Transaction, error) { - var tx msig7.Transaction - if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return Transaction{}, err - } - return tx, nil -} - -func (s *state7) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/paych/actor.go.template b/pkg/types/specactors/builtin/paych/actor.go.template deleted file mode 100644 index 0c84ec4c59..0000000000 --- a/pkg/types/specactors/builtin/paych/actor.go.template +++ /dev/null @@ -1,134 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/actor.go.template - -package paych - -import ( - "encoding/base64" - "fmt" - - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - big "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/cbor" - "github.com/ipfs/go-cid" - ipldcbor "github.com/ipfs/go-ipld-cbor" - - paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" -{{range .versions}} - builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" -{{end}} - - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - types "github.com/filecoin-project/venus/pkg/types/internal" -) - -func init() { -{{range .versions}} - builtin.RegisterActorState(builtin{{.}}.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) -{{end}}} - -// Load returns an abstract copy of payment channel state, irregardless of actor version -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { -{{range .versions}} - case builtin{{.}}.PaymentChannelActorCodeID: - return load{{.}}(store, act.Head) -{{end}} - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version) (State, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return make{{.}}(store) -{{end}} -} - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return builtin{{.}}.PaymentChannelActorCodeID, nil -{{end}} - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -// State is an abstract version of payment channel state that works across -// versions -type State interface { - cbor.Marshaler - // Channel owner, who has funded the actor - From() (address.Address, error) - // Recipient of payouts from channel - To() (address.Address, error) - - // Height at which the channel can be `Collected` - SettlingAt() (abi.ChainEpoch, error) - - // Amount successfully redeemed through the payment channel, paid out on `Collect()` - ToSend() (abi.TokenAmount, error) - - // Get total number of lanes - LaneCount() (uint64, error) - - // Iterate lane states - ForEachLaneState(cb func(idx uint64, dl LaneState) error) error - - GetState() interface{} -} - -// LaneState is an abstract copy of the state of a single lane -type LaneState interface { - Redeemed() (big.Int, error) - Nonce() (uint64, error) -} - -type SignedVoucher = paych0.SignedVoucher -type ModVerifyParams = paych0.ModVerifyParams - -// DecodeSignedVoucher decodes base64 encoded signed voucher. -func DecodeSignedVoucher(s string) (*SignedVoucher, error) { - data, err := base64.RawURLEncoding.DecodeString(s) - if err != nil { - return nil, err - } - - var sv SignedVoucher - if err := ipldcbor.DecodeInto(data, &sv); err != nil { - return nil, err - } - - return &sv, nil -} - -var Methods = builtin{{.latestVersion}}.MethodsPaych - -func Message(version actors.Version, from address.Address) MessageBuilder { - switch version { -{{range .versions}} - case actors.Version{{.}}: - return message{{.}}{from} -{{end}} - default: - panic(fmt.Sprintf("unsupported actors version: %d", version)) - } -} - -type MessageBuilder interface { - Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) - Update(paych address.Address, voucher *SignedVoucher, secret []byte) (*types.Message, error) - Settle(paych address.Address) (*types.Message, error) - Collect(paych address.Address) (*types.Message, error) -} diff --git a/pkg/types/specactors/builtin/paych/message.go.template b/pkg/types/specactors/builtin/paych/message.go.template deleted file mode 100644 index 23091d71fc..0000000000 --- a/pkg/types/specactors/builtin/paych/message.go.template +++ /dev/null @@ -1,76 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/message.go.template - -package paych - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" - init{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/init" - paych{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/paych" - - actors "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" - types "github.com/filecoin-project/venus/pkg/types/internal" -) - -type message{{.v}} struct{ from address.Address } - -func (m message{{.v}}) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { - params, aerr := actors.SerializeParams(&paych{{.v}}.ConstructorParams{From: m.from, To: to}) - if aerr != nil { - return nil, aerr - } - enc, aerr := actors.SerializeParams(&init{{.v}}.ExecParams{ - CodeCID: builtin{{.v}}.PaymentChannelActorCodeID, - ConstructorParams: params, - }) - if aerr != nil { - return nil, aerr - } - - return &types.Message{ - To: init_.Address, - From: m.from, - Value: initialAmount, - Method: builtin{{.v}}.MethodsInit.Exec, - Params: enc, - }, nil -} - -func (m message{{.v}}) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { - params, aerr := actors.SerializeParams(&paych{{.v}}.UpdateChannelStateParams{ - Sv: *sv, - Secret: secret, - }) - if aerr != nil { - return nil, aerr - } - - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin{{.v}}.MethodsPaych.UpdateChannelState, - Params: params, - }, nil -} - -func (m message{{.v}}) Settle(paych address.Address) (*types.Message, error) { - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin{{.v}}.MethodsPaych.Settle, - }, nil -} - -func (m message{{.v}}) Collect(paych address.Address) (*types.Message, error) { - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin{{.v}}.MethodsPaych.Collect, - }, nil -} diff --git a/pkg/types/specactors/builtin/paych/message0.go b/pkg/types/specactors/builtin/paych/message0.go deleted file mode 100644 index af6c388788..0000000000 --- a/pkg/types/specactors/builtin/paych/message0.go +++ /dev/null @@ -1,76 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/message.go.template - -package paych - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" - paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" -) - -type message0 struct{ from address.Address } - -func (m message0) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { - params, aerr := actors.SerializeParams(&paych0.ConstructorParams{From: m.from, To: to}) - if aerr != nil { - return nil, aerr - } - enc, aerr := actors.SerializeParams(&init0.ExecParams{ - CodeCID: builtin0.PaymentChannelActorCodeID, - ConstructorParams: params, - }) - if aerr != nil { - return nil, aerr - } - - return &types.Message{ - To: init_.Address, - From: m.from, - Value: initialAmount, - Method: builtin0.MethodsInit.Exec, - Params: enc, - }, nil -} - -func (m message0) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { - params, aerr := actors.SerializeParams(&paych0.UpdateChannelStateParams{ - Sv: *sv, - Secret: secret, - }) - if aerr != nil { - return nil, aerr - } - - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin0.MethodsPaych.UpdateChannelState, - Params: params, - }, nil -} - -func (m message0) Settle(paych address.Address) (*types.Message, error) { - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin0.MethodsPaych.Settle, - }, nil -} - -func (m message0) Collect(paych address.Address) (*types.Message, error) { - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin0.MethodsPaych.Collect, - }, nil -} diff --git a/pkg/types/specactors/builtin/paych/message2.go b/pkg/types/specactors/builtin/paych/message2.go deleted file mode 100644 index edd172ad5b..0000000000 --- a/pkg/types/specactors/builtin/paych/message2.go +++ /dev/null @@ -1,76 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/message.go.template - -package paych - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" - paych2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/paych" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" -) - -type message2 struct{ from address.Address } - -func (m message2) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { - params, aerr := actors.SerializeParams(&paych2.ConstructorParams{From: m.from, To: to}) - if aerr != nil { - return nil, aerr - } - enc, aerr := actors.SerializeParams(&init2.ExecParams{ - CodeCID: builtin2.PaymentChannelActorCodeID, - ConstructorParams: params, - }) - if aerr != nil { - return nil, aerr - } - - return &types.Message{ - To: init_.Address, - From: m.from, - Value: initialAmount, - Method: builtin2.MethodsInit.Exec, - Params: enc, - }, nil -} - -func (m message2) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { - params, aerr := actors.SerializeParams(&paych2.UpdateChannelStateParams{ - Sv: *sv, - Secret: secret, - }) - if aerr != nil { - return nil, aerr - } - - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin2.MethodsPaych.UpdateChannelState, - Params: params, - }, nil -} - -func (m message2) Settle(paych address.Address) (*types.Message, error) { - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin2.MethodsPaych.Settle, - }, nil -} - -func (m message2) Collect(paych address.Address) (*types.Message, error) { - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin2.MethodsPaych.Collect, - }, nil -} diff --git a/pkg/types/specactors/builtin/paych/message3.go b/pkg/types/specactors/builtin/paych/message3.go deleted file mode 100644 index 181e3b3643..0000000000 --- a/pkg/types/specactors/builtin/paych/message3.go +++ /dev/null @@ -1,76 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/message.go.template - -package paych - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" - paych3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/paych" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" -) - -type message3 struct{ from address.Address } - -func (m message3) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { - params, aerr := actors.SerializeParams(&paych3.ConstructorParams{From: m.from, To: to}) - if aerr != nil { - return nil, aerr - } - enc, aerr := actors.SerializeParams(&init3.ExecParams{ - CodeCID: builtin3.PaymentChannelActorCodeID, - ConstructorParams: params, - }) - if aerr != nil { - return nil, aerr - } - - return &types.Message{ - To: init_.Address, - From: m.from, - Value: initialAmount, - Method: builtin3.MethodsInit.Exec, - Params: enc, - }, nil -} - -func (m message3) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { - params, aerr := actors.SerializeParams(&paych3.UpdateChannelStateParams{ - Sv: *sv, - Secret: secret, - }) - if aerr != nil { - return nil, aerr - } - - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin3.MethodsPaych.UpdateChannelState, - Params: params, - }, nil -} - -func (m message3) Settle(paych address.Address) (*types.Message, error) { - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin3.MethodsPaych.Settle, - }, nil -} - -func (m message3) Collect(paych address.Address) (*types.Message, error) { - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin3.MethodsPaych.Collect, - }, nil -} diff --git a/pkg/types/specactors/builtin/paych/message4.go b/pkg/types/specactors/builtin/paych/message4.go deleted file mode 100644 index e3d73448c3..0000000000 --- a/pkg/types/specactors/builtin/paych/message4.go +++ /dev/null @@ -1,76 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/message.go.template - -package paych - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" - paych4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/paych" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" -) - -type message4 struct{ from address.Address } - -func (m message4) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { - params, aerr := actors.SerializeParams(&paych4.ConstructorParams{From: m.from, To: to}) - if aerr != nil { - return nil, aerr - } - enc, aerr := actors.SerializeParams(&init4.ExecParams{ - CodeCID: builtin4.PaymentChannelActorCodeID, - ConstructorParams: params, - }) - if aerr != nil { - return nil, aerr - } - - return &types.Message{ - To: init_.Address, - From: m.from, - Value: initialAmount, - Method: builtin4.MethodsInit.Exec, - Params: enc, - }, nil -} - -func (m message4) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { - params, aerr := actors.SerializeParams(&paych4.UpdateChannelStateParams{ - Sv: *sv, - Secret: secret, - }) - if aerr != nil { - return nil, aerr - } - - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin4.MethodsPaych.UpdateChannelState, - Params: params, - }, nil -} - -func (m message4) Settle(paych address.Address) (*types.Message, error) { - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin4.MethodsPaych.Settle, - }, nil -} - -func (m message4) Collect(paych address.Address) (*types.Message, error) { - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin4.MethodsPaych.Collect, - }, nil -} diff --git a/pkg/types/specactors/builtin/paych/message5.go b/pkg/types/specactors/builtin/paych/message5.go deleted file mode 100644 index 5303857929..0000000000 --- a/pkg/types/specactors/builtin/paych/message5.go +++ /dev/null @@ -1,76 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/message.go.template - -package paych - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" - paych5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/paych" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" -) - -type message5 struct{ from address.Address } - -func (m message5) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { - params, aerr := actors.SerializeParams(&paych5.ConstructorParams{From: m.from, To: to}) - if aerr != nil { - return nil, aerr - } - enc, aerr := actors.SerializeParams(&init5.ExecParams{ - CodeCID: builtin5.PaymentChannelActorCodeID, - ConstructorParams: params, - }) - if aerr != nil { - return nil, aerr - } - - return &types.Message{ - To: init_.Address, - From: m.from, - Value: initialAmount, - Method: builtin5.MethodsInit.Exec, - Params: enc, - }, nil -} - -func (m message5) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { - params, aerr := actors.SerializeParams(&paych5.UpdateChannelStateParams{ - Sv: *sv, - Secret: secret, - }) - if aerr != nil { - return nil, aerr - } - - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin5.MethodsPaych.UpdateChannelState, - Params: params, - }, nil -} - -func (m message5) Settle(paych address.Address) (*types.Message, error) { - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin5.MethodsPaych.Settle, - }, nil -} - -func (m message5) Collect(paych address.Address) (*types.Message, error) { - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin5.MethodsPaych.Collect, - }, nil -} diff --git a/pkg/types/specactors/builtin/paych/message6.go b/pkg/types/specactors/builtin/paych/message6.go deleted file mode 100644 index 5103040bef..0000000000 --- a/pkg/types/specactors/builtin/paych/message6.go +++ /dev/null @@ -1,76 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/message.go.template - -package paych - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" - paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" -) - -type message6 struct{ from address.Address } - -func (m message6) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { - params, aerr := actors.SerializeParams(&paych6.ConstructorParams{From: m.from, To: to}) - if aerr != nil { - return nil, aerr - } - enc, aerr := actors.SerializeParams(&init6.ExecParams{ - CodeCID: builtin6.PaymentChannelActorCodeID, - ConstructorParams: params, - }) - if aerr != nil { - return nil, aerr - } - - return &types.Message{ - To: init_.Address, - From: m.from, - Value: initialAmount, - Method: builtin6.MethodsInit.Exec, - Params: enc, - }, nil -} - -func (m message6) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { - params, aerr := actors.SerializeParams(&paych6.UpdateChannelStateParams{ - Sv: *sv, - Secret: secret, - }) - if aerr != nil { - return nil, aerr - } - - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin6.MethodsPaych.UpdateChannelState, - Params: params, - }, nil -} - -func (m message6) Settle(paych address.Address) (*types.Message, error) { - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin6.MethodsPaych.Settle, - }, nil -} - -func (m message6) Collect(paych address.Address) (*types.Message, error) { - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin6.MethodsPaych.Collect, - }, nil -} diff --git a/pkg/types/specactors/builtin/paych/message7.go b/pkg/types/specactors/builtin/paych/message7.go deleted file mode 100644 index d8f8e9e131..0000000000 --- a/pkg/types/specactors/builtin/paych/message7.go +++ /dev/null @@ -1,76 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/message.go.template - -package paych - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" - paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - init_ "github.com/filecoin-project/venus/pkg/types/specactors/builtin/init" -) - -type message7 struct{ from address.Address } - -func (m message7) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { - params, aerr := actors.SerializeParams(&paych7.ConstructorParams{From: m.from, To: to}) - if aerr != nil { - return nil, aerr - } - enc, aerr := actors.SerializeParams(&init7.ExecParams{ - CodeCID: builtin7.PaymentChannelActorCodeID, - ConstructorParams: params, - }) - if aerr != nil { - return nil, aerr - } - - return &types.Message{ - To: init_.Address, - From: m.from, - Value: initialAmount, - Method: builtin7.MethodsInit.Exec, - Params: enc, - }, nil -} - -func (m message7) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { - params, aerr := actors.SerializeParams(&paych7.UpdateChannelStateParams{ - Sv: toV7SignedVoucher(*sv), - Secret: secret, - }) - if aerr != nil { - return nil, aerr - } - - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin7.MethodsPaych.UpdateChannelState, - Params: params, - }, nil -} - -func (m message7) Settle(paych address.Address) (*types.Message, error) { - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin7.MethodsPaych.Settle, - }, nil -} - -func (m message7) Collect(paych address.Address) (*types.Message, error) { - return &types.Message{ - To: paych, - From: m.from, - Value: abi.NewTokenAmount(0), - Method: builtin7.MethodsPaych.Collect, - }, nil -} diff --git a/pkg/types/specactors/builtin/paych/mock/mock.go b/pkg/types/specactors/builtin/paych/mock/mock.go deleted file mode 100644 index 2b4d4898d7..0000000000 --- a/pkg/types/specactors/builtin/paych/mock/mock.go +++ /dev/null @@ -1,93 +0,0 @@ -package mock - -import ( - "io" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/venus/pkg/types/specactors/builtin/paych" -) - -type mockState struct { - from address.Address - to address.Address - settlingAt abi.ChainEpoch - toSend abi.TokenAmount - lanes map[uint64]paych.LaneState -} - -func (ms *mockState) GetState() interface{} { - panic("implement me") -} - -type mockLaneState struct { - redeemed big.Int - nonce uint64 -} - -// NewMockPayChState constructs a state for a payment channel with the set fixed values -// that satisfies the paych.State interface. -func NewMockPayChState(from address.Address, - to address.Address, - settlingAt abi.ChainEpoch, - lanes map[uint64]paych.LaneState, -) paych.State { - return &mockState{from: from, to: to, settlingAt: settlingAt, toSend: big.NewInt(0), lanes: lanes} -} - -// NewMockLaneState constructs a state for a payment channel lane with the set fixed values -// that satisfies the paych.LaneState interface. Useful for populating lanes when -// calling NewMockPayChState -func NewMockLaneState(redeemed big.Int, nonce uint64) paych.LaneState { - return &mockLaneState{redeemed, nonce} -} - -func (ms *mockState) MarshalCBOR(io.Writer) error { - panic("not implemented") -} - -// Channel owner, who has funded the actor -func (ms *mockState) From() (address.Address, error) { - return ms.from, nil -} - -// Recipient of payouts from channel -func (ms *mockState) To() (address.Address, error) { - return ms.to, nil -} - -// Height at which the channel can be `Collected` -func (ms *mockState) SettlingAt() (abi.ChainEpoch, error) { - return ms.settlingAt, nil -} - -// Amount successfully redeemed through the payment channel, paid out on `Collect()` -func (ms *mockState) ToSend() (abi.TokenAmount, error) { - return ms.toSend, nil -} - -// Get total number of lanes -func (ms *mockState) LaneCount() (uint64, error) { - return uint64(len(ms.lanes)), nil -} - -// Iterate lane states -func (ms *mockState) ForEachLaneState(cb func(idx uint64, dl paych.LaneState) error) error { - var lastErr error - for lane, state := range ms.lanes { - if err := cb(lane, state); err != nil { - lastErr = err - } - } - return lastErr -} - -func (mls *mockLaneState) Redeemed() (big.Int, error) { - return mls.redeemed, nil -} - -func (mls *mockLaneState) Nonce() (uint64, error) { - return mls.nonce, nil -} diff --git a/pkg/types/specactors/builtin/paych/paych.go b/pkg/types/specactors/builtin/paych/paych.go deleted file mode 100644 index f86165b431..0000000000 --- a/pkg/types/specactors/builtin/paych/paych.go +++ /dev/null @@ -1,241 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/actor.go.template - -package paych - -import ( - "encoding/base64" - "fmt" - - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - big "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/cbor" - "github.com/ipfs/go-cid" - ipldcbor "github.com/ipfs/go-ipld-cbor" - - paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" -) - -func init() { - - builtin.RegisterActorState(builtin0.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - - builtin.RegisterActorState(builtin2.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - - builtin.RegisterActorState(builtin3.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - - builtin.RegisterActorState(builtin4.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - - builtin.RegisterActorState(builtin5.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - - builtin.RegisterActorState(builtin6.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - - builtin.RegisterActorState(builtin7.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) -} - -// Load returns an abstract copy of payment channel state, irregardless of actor version -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { - - case builtin0.PaymentChannelActorCodeID: - return load0(store, act.Head) - - case builtin2.PaymentChannelActorCodeID: - return load2(store, act.Head) - - case builtin3.PaymentChannelActorCodeID: - return load3(store, act.Head) - - case builtin4.PaymentChannelActorCodeID: - return load4(store, act.Head) - - case builtin5.PaymentChannelActorCodeID: - return load5(store, act.Head) - - case builtin6.PaymentChannelActorCodeID: - return load6(store, act.Head) - - case builtin7.PaymentChannelActorCodeID: - return load7(store, act.Head) - - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version) (State, error) { - switch av { - - case actors.Version0: - return make0(store) - - case actors.Version2: - return make2(store) - - case actors.Version3: - return make3(store) - - case actors.Version4: - return make4(store) - - case actors.Version5: - return make5(store) - - case actors.Version6: - return make6(store) - - case actors.Version7: - return make7(store) - - } - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { - - case actors.Version0: - return builtin0.PaymentChannelActorCodeID, nil - - case actors.Version2: - return builtin2.PaymentChannelActorCodeID, nil - - case actors.Version3: - return builtin3.PaymentChannelActorCodeID, nil - - case actors.Version4: - return builtin4.PaymentChannelActorCodeID, nil - - case actors.Version5: - return builtin5.PaymentChannelActorCodeID, nil - - case actors.Version6: - return builtin6.PaymentChannelActorCodeID, nil - - case actors.Version7: - return builtin7.PaymentChannelActorCodeID, nil - - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -// State is an abstract version of payment channel state that works across -// versions -type State interface { - cbor.Marshaler - // Channel owner, who has funded the actor - From() (address.Address, error) - // Recipient of payouts from channel - To() (address.Address, error) - - // Height at which the channel can be `Collected` - SettlingAt() (abi.ChainEpoch, error) - - // Amount successfully redeemed through the payment channel, paid out on `Collect()` - ToSend() (abi.TokenAmount, error) - - // Get total number of lanes - LaneCount() (uint64, error) - - // Iterate lane states - ForEachLaneState(cb func(idx uint64, dl LaneState) error) error - - GetState() interface{} -} - -// LaneState is an abstract copy of the state of a single lane -type LaneState interface { - Redeemed() (big.Int, error) - Nonce() (uint64, error) -} - -type SignedVoucher = paych0.SignedVoucher -type ModVerifyParams = paych0.ModVerifyParams - -// DecodeSignedVoucher decodes base64 encoded signed voucher. -func DecodeSignedVoucher(s string) (*SignedVoucher, error) { - data, err := base64.RawURLEncoding.DecodeString(s) - if err != nil { - return nil, err - } - - var sv SignedVoucher - if err := ipldcbor.DecodeInto(data, &sv); err != nil { - return nil, err - } - - return &sv, nil -} - -var Methods = builtin7.MethodsPaych - -func Message(version actors.Version, from address.Address) MessageBuilder { - switch version { - - case actors.Version0: - return message0{from} - - case actors.Version2: - return message2{from} - - case actors.Version3: - return message3{from} - - case actors.Version4: - return message4{from} - - case actors.Version5: - return message5{from} - - case actors.Version6: - return message6{from} - - case actors.Version7: - return message7{from} - - default: - panic(fmt.Sprintf("unsupported actors version: %d", version)) - } -} - -type MessageBuilder interface { - Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) - Update(paych address.Address, voucher *SignedVoucher, secret []byte) (*types.Message, error) - Settle(paych address.Address) (*types.Message, error) - Collect(paych address.Address) (*types.Message, error) -} diff --git a/pkg/types/specactors/builtin/paych/state.go.template b/pkg/types/specactors/builtin/paych/state.go.template deleted file mode 100644 index 75dde50bdf..0000000000 --- a/pkg/types/specactors/builtin/paych/state.go.template +++ /dev/null @@ -1,116 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/state.go.template - -package paych - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - paych{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/paych" - adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" -) - -var _ State = (*state{{.v}})(nil) - -func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { - out := state{{.v}}{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make{{.v}}(store adt.Store) (State, error) { - out := state{{.v}}{store: store} - out.State = paych{{.v}}.State{} - return &out, nil -} - -type state{{.v}} struct { - paych{{.v}}.State - store adt.Store - lsAmt *adt{{.v}}.Array -} - -// Channel owner, who has funded the actor -func (s *state{{.v}}) From() (address.Address, error) { - return s.State.From, nil -} - -// Recipient of payouts from channel -func (s *state{{.v}}) To() (address.Address, error) { - return s.State.To, nil -} - -// Height at which the channel can be `Collected` -func (s *state{{.v}}) SettlingAt() (abi.ChainEpoch, error) { - return s.State.SettlingAt, nil -} - -// Amount successfully redeemed through the payment channel, paid out on `Collect()` -func (s *state{{.v}}) ToSend() (abi.TokenAmount, error) { - return s.State.ToSend, nil -} - -func (s *state{{.v}}) getOrLoadLsAmt() (*adt{{.v}}.Array, error) { - if s.lsAmt != nil { - return s.lsAmt, nil - } - - // Get the lane state from the chain - lsamt, err := adt{{.v}}.AsArray(s.store, s.State.LaneStates{{if (ge .v 3)}}, paych{{.v}}.LaneStatesAmtBitwidth{{end}}) - if err != nil { - return nil, err - } - - s.lsAmt = lsamt - return lsamt, nil -} - -// Get total number of lanes -func (s *state{{.v}}) LaneCount() (uint64, error) { - lsamt, err := s.getOrLoadLsAmt() - if err != nil { - return 0, err - } - return lsamt.Length(), nil -} - -func (s *state{{.v}}) GetState() interface{} { - return &s.State -} - -// Iterate lane states -func (s *state{{.v}}) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { - // Get the lane state from the chain - lsamt, err := s.getOrLoadLsAmt() - if err != nil { - return err - } - - // Note: we use a map instead of an array to store laneStates because the - // client sets the lane ID (the index) and potentially they could use a - // very large index. - var ls paych{{.v}}.LaneState - return lsamt.ForEach(&ls, func(i int64) error { - return cb(uint64(i), &laneState{{.v}}{ls}) - }) -} - -type laneState{{.v}} struct { - paych{{.v}}.LaneState -} - -func (ls *laneState{{.v}}) Redeemed() (big.Int, error) { - return ls.LaneState.Redeemed, nil -} - -func (ls *laneState{{.v}}) Nonce() (uint64, error) { - return ls.LaneState.Nonce, nil -} diff --git a/pkg/types/specactors/builtin/paych/v0.go b/pkg/types/specactors/builtin/paych/v0.go deleted file mode 100644 index 09a9dd7adc..0000000000 --- a/pkg/types/specactors/builtin/paych/v0.go +++ /dev/null @@ -1,116 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/state.go.template - -package paych - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" - adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" -) - -var _ State = (*state0)(nil) - -func load0(store adt.Store, root cid.Cid) (State, error) { - out := state0{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make0(store adt.Store) (State, error) { - out := state0{store: store} - out.State = paych0.State{} - return &out, nil -} - -type state0 struct { - paych0.State - store adt.Store - lsAmt *adt0.Array -} - -// Channel owner, who has funded the actor -func (s *state0) From() (address.Address, error) { - return s.State.From, nil -} - -// Recipient of payouts from channel -func (s *state0) To() (address.Address, error) { - return s.State.To, nil -} - -// Height at which the channel can be `Collected` -func (s *state0) SettlingAt() (abi.ChainEpoch, error) { - return s.State.SettlingAt, nil -} - -// Amount successfully redeemed through the payment channel, paid out on `Collect()` -func (s *state0) ToSend() (abi.TokenAmount, error) { - return s.State.ToSend, nil -} - -func (s *state0) getOrLoadLsAmt() (*adt0.Array, error) { - if s.lsAmt != nil { - return s.lsAmt, nil - } - - // Get the lane state from the chain - lsamt, err := adt0.AsArray(s.store, s.State.LaneStates) - if err != nil { - return nil, err - } - - s.lsAmt = lsamt - return lsamt, nil -} - -// Get total number of lanes -func (s *state0) LaneCount() (uint64, error) { - lsamt, err := s.getOrLoadLsAmt() - if err != nil { - return 0, err - } - return lsamt.Length(), nil -} - -func (s *state0) GetState() interface{} { - return &s.State -} - -// Iterate lane states -func (s *state0) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { - // Get the lane state from the chain - lsamt, err := s.getOrLoadLsAmt() - if err != nil { - return err - } - - // Note: we use a map instead of an array to store laneStates because the - // client sets the lane ID (the index) and potentially they could use a - // very large index. - var ls paych0.LaneState - return lsamt.ForEach(&ls, func(i int64) error { - return cb(uint64(i), &laneState0{ls}) - }) -} - -type laneState0 struct { - paych0.LaneState -} - -func (ls *laneState0) Redeemed() (big.Int, error) { - return ls.LaneState.Redeemed, nil -} - -func (ls *laneState0) Nonce() (uint64, error) { - return ls.LaneState.Nonce, nil -} diff --git a/pkg/types/specactors/builtin/paych/v2.go b/pkg/types/specactors/builtin/paych/v2.go deleted file mode 100644 index 07fafb1e97..0000000000 --- a/pkg/types/specactors/builtin/paych/v2.go +++ /dev/null @@ -1,116 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/state.go.template - -package paych - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - paych2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/paych" - adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" -) - -var _ State = (*state2)(nil) - -func load2(store adt.Store, root cid.Cid) (State, error) { - out := state2{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make2(store adt.Store) (State, error) { - out := state2{store: store} - out.State = paych2.State{} - return &out, nil -} - -type state2 struct { - paych2.State - store adt.Store - lsAmt *adt2.Array -} - -// Channel owner, who has funded the actor -func (s *state2) From() (address.Address, error) { - return s.State.From, nil -} - -// Recipient of payouts from channel -func (s *state2) To() (address.Address, error) { - return s.State.To, nil -} - -// Height at which the channel can be `Collected` -func (s *state2) SettlingAt() (abi.ChainEpoch, error) { - return s.State.SettlingAt, nil -} - -// Amount successfully redeemed through the payment channel, paid out on `Collect()` -func (s *state2) ToSend() (abi.TokenAmount, error) { - return s.State.ToSend, nil -} - -func (s *state2) getOrLoadLsAmt() (*adt2.Array, error) { - if s.lsAmt != nil { - return s.lsAmt, nil - } - - // Get the lane state from the chain - lsamt, err := adt2.AsArray(s.store, s.State.LaneStates) - if err != nil { - return nil, err - } - - s.lsAmt = lsamt - return lsamt, nil -} - -// Get total number of lanes -func (s *state2) LaneCount() (uint64, error) { - lsamt, err := s.getOrLoadLsAmt() - if err != nil { - return 0, err - } - return lsamt.Length(), nil -} - -func (s *state2) GetState() interface{} { - return &s.State -} - -// Iterate lane states -func (s *state2) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { - // Get the lane state from the chain - lsamt, err := s.getOrLoadLsAmt() - if err != nil { - return err - } - - // Note: we use a map instead of an array to store laneStates because the - // client sets the lane ID (the index) and potentially they could use a - // very large index. - var ls paych2.LaneState - return lsamt.ForEach(&ls, func(i int64) error { - return cb(uint64(i), &laneState2{ls}) - }) -} - -type laneState2 struct { - paych2.LaneState -} - -func (ls *laneState2) Redeemed() (big.Int, error) { - return ls.LaneState.Redeemed, nil -} - -func (ls *laneState2) Nonce() (uint64, error) { - return ls.LaneState.Nonce, nil -} diff --git a/pkg/types/specactors/builtin/paych/v3.go b/pkg/types/specactors/builtin/paych/v3.go deleted file mode 100644 index 7145277826..0000000000 --- a/pkg/types/specactors/builtin/paych/v3.go +++ /dev/null @@ -1,116 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/state.go.template - -package paych - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - paych3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/paych" - adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" -) - -var _ State = (*state3)(nil) - -func load3(store adt.Store, root cid.Cid) (State, error) { - out := state3{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make3(store adt.Store) (State, error) { - out := state3{store: store} - out.State = paych3.State{} - return &out, nil -} - -type state3 struct { - paych3.State - store adt.Store - lsAmt *adt3.Array -} - -// Channel owner, who has funded the actor -func (s *state3) From() (address.Address, error) { - return s.State.From, nil -} - -// Recipient of payouts from channel -func (s *state3) To() (address.Address, error) { - return s.State.To, nil -} - -// Height at which the channel can be `Collected` -func (s *state3) SettlingAt() (abi.ChainEpoch, error) { - return s.State.SettlingAt, nil -} - -// Amount successfully redeemed through the payment channel, paid out on `Collect()` -func (s *state3) ToSend() (abi.TokenAmount, error) { - return s.State.ToSend, nil -} - -func (s *state3) getOrLoadLsAmt() (*adt3.Array, error) { - if s.lsAmt != nil { - return s.lsAmt, nil - } - - // Get the lane state from the chain - lsamt, err := adt3.AsArray(s.store, s.State.LaneStates, paych3.LaneStatesAmtBitwidth) - if err != nil { - return nil, err - } - - s.lsAmt = lsamt - return lsamt, nil -} - -// Get total number of lanes -func (s *state3) LaneCount() (uint64, error) { - lsamt, err := s.getOrLoadLsAmt() - if err != nil { - return 0, err - } - return lsamt.Length(), nil -} - -func (s *state3) GetState() interface{} { - return &s.State -} - -// Iterate lane states -func (s *state3) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { - // Get the lane state from the chain - lsamt, err := s.getOrLoadLsAmt() - if err != nil { - return err - } - - // Note: we use a map instead of an array to store laneStates because the - // client sets the lane ID (the index) and potentially they could use a - // very large index. - var ls paych3.LaneState - return lsamt.ForEach(&ls, func(i int64) error { - return cb(uint64(i), &laneState3{ls}) - }) -} - -type laneState3 struct { - paych3.LaneState -} - -func (ls *laneState3) Redeemed() (big.Int, error) { - return ls.LaneState.Redeemed, nil -} - -func (ls *laneState3) Nonce() (uint64, error) { - return ls.LaneState.Nonce, nil -} diff --git a/pkg/types/specactors/builtin/paych/v4.go b/pkg/types/specactors/builtin/paych/v4.go deleted file mode 100644 index 901a714c2d..0000000000 --- a/pkg/types/specactors/builtin/paych/v4.go +++ /dev/null @@ -1,116 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/state.go.template - -package paych - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - paych4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/paych" - adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" -) - -var _ State = (*state4)(nil) - -func load4(store adt.Store, root cid.Cid) (State, error) { - out := state4{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make4(store adt.Store) (State, error) { - out := state4{store: store} - out.State = paych4.State{} - return &out, nil -} - -type state4 struct { - paych4.State - store adt.Store - lsAmt *adt4.Array -} - -// Channel owner, who has funded the actor -func (s *state4) From() (address.Address, error) { - return s.State.From, nil -} - -// Recipient of payouts from channel -func (s *state4) To() (address.Address, error) { - return s.State.To, nil -} - -// Height at which the channel can be `Collected` -func (s *state4) SettlingAt() (abi.ChainEpoch, error) { - return s.State.SettlingAt, nil -} - -// Amount successfully redeemed through the payment channel, paid out on `Collect()` -func (s *state4) ToSend() (abi.TokenAmount, error) { - return s.State.ToSend, nil -} - -func (s *state4) getOrLoadLsAmt() (*adt4.Array, error) { - if s.lsAmt != nil { - return s.lsAmt, nil - } - - // Get the lane state from the chain - lsamt, err := adt4.AsArray(s.store, s.State.LaneStates, paych4.LaneStatesAmtBitwidth) - if err != nil { - return nil, err - } - - s.lsAmt = lsamt - return lsamt, nil -} - -// Get total number of lanes -func (s *state4) LaneCount() (uint64, error) { - lsamt, err := s.getOrLoadLsAmt() - if err != nil { - return 0, err - } - return lsamt.Length(), nil -} - -func (s *state4) GetState() interface{} { - return &s.State -} - -// Iterate lane states -func (s *state4) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { - // Get the lane state from the chain - lsamt, err := s.getOrLoadLsAmt() - if err != nil { - return err - } - - // Note: we use a map instead of an array to store laneStates because the - // client sets the lane ID (the index) and potentially they could use a - // very large index. - var ls paych4.LaneState - return lsamt.ForEach(&ls, func(i int64) error { - return cb(uint64(i), &laneState4{ls}) - }) -} - -type laneState4 struct { - paych4.LaneState -} - -func (ls *laneState4) Redeemed() (big.Int, error) { - return ls.LaneState.Redeemed, nil -} - -func (ls *laneState4) Nonce() (uint64, error) { - return ls.LaneState.Nonce, nil -} diff --git a/pkg/types/specactors/builtin/paych/v5.go b/pkg/types/specactors/builtin/paych/v5.go deleted file mode 100644 index 7bab8e2407..0000000000 --- a/pkg/types/specactors/builtin/paych/v5.go +++ /dev/null @@ -1,116 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/state.go.template - -package paych - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - paych5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/paych" - adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" -) - -var _ State = (*state5)(nil) - -func load5(store adt.Store, root cid.Cid) (State, error) { - out := state5{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make5(store adt.Store) (State, error) { - out := state5{store: store} - out.State = paych5.State{} - return &out, nil -} - -type state5 struct { - paych5.State - store adt.Store - lsAmt *adt5.Array -} - -// Channel owner, who has funded the actor -func (s *state5) From() (address.Address, error) { - return s.State.From, nil -} - -// Recipient of payouts from channel -func (s *state5) To() (address.Address, error) { - return s.State.To, nil -} - -// Height at which the channel can be `Collected` -func (s *state5) SettlingAt() (abi.ChainEpoch, error) { - return s.State.SettlingAt, nil -} - -// Amount successfully redeemed through the payment channel, paid out on `Collect()` -func (s *state5) ToSend() (abi.TokenAmount, error) { - return s.State.ToSend, nil -} - -func (s *state5) getOrLoadLsAmt() (*adt5.Array, error) { - if s.lsAmt != nil { - return s.lsAmt, nil - } - - // Get the lane state from the chain - lsamt, err := adt5.AsArray(s.store, s.State.LaneStates, paych5.LaneStatesAmtBitwidth) - if err != nil { - return nil, err - } - - s.lsAmt = lsamt - return lsamt, nil -} - -// Get total number of lanes -func (s *state5) LaneCount() (uint64, error) { - lsamt, err := s.getOrLoadLsAmt() - if err != nil { - return 0, err - } - return lsamt.Length(), nil -} - -func (s *state5) GetState() interface{} { - return &s.State -} - -// Iterate lane states -func (s *state5) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { - // Get the lane state from the chain - lsamt, err := s.getOrLoadLsAmt() - if err != nil { - return err - } - - // Note: we use a map instead of an array to store laneStates because the - // client sets the lane ID (the index) and potentially they could use a - // very large index. - var ls paych5.LaneState - return lsamt.ForEach(&ls, func(i int64) error { - return cb(uint64(i), &laneState5{ls}) - }) -} - -type laneState5 struct { - paych5.LaneState -} - -func (ls *laneState5) Redeemed() (big.Int, error) { - return ls.LaneState.Redeemed, nil -} - -func (ls *laneState5) Nonce() (uint64, error) { - return ls.LaneState.Nonce, nil -} diff --git a/pkg/types/specactors/builtin/paych/v6.go b/pkg/types/specactors/builtin/paych/v6.go deleted file mode 100644 index 322e0478e9..0000000000 --- a/pkg/types/specactors/builtin/paych/v6.go +++ /dev/null @@ -1,116 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/state.go.template - -package paych - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych" - adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" -) - -var _ State = (*state6)(nil) - -func load6(store adt.Store, root cid.Cid) (State, error) { - out := state6{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make6(store adt.Store) (State, error) { - out := state6{store: store} - out.State = paych6.State{} - return &out, nil -} - -type state6 struct { - paych6.State - store adt.Store - lsAmt *adt6.Array -} - -// Channel owner, who has funded the actor -func (s *state6) From() (address.Address, error) { - return s.State.From, nil -} - -// Recipient of payouts from channel -func (s *state6) To() (address.Address, error) { - return s.State.To, nil -} - -// Height at which the channel can be `Collected` -func (s *state6) SettlingAt() (abi.ChainEpoch, error) { - return s.State.SettlingAt, nil -} - -// Amount successfully redeemed through the payment channel, paid out on `Collect()` -func (s *state6) ToSend() (abi.TokenAmount, error) { - return s.State.ToSend, nil -} - -func (s *state6) getOrLoadLsAmt() (*adt6.Array, error) { - if s.lsAmt != nil { - return s.lsAmt, nil - } - - // Get the lane state from the chain - lsamt, err := adt6.AsArray(s.store, s.State.LaneStates, paych6.LaneStatesAmtBitwidth) - if err != nil { - return nil, err - } - - s.lsAmt = lsamt - return lsamt, nil -} - -// Get total number of lanes -func (s *state6) LaneCount() (uint64, error) { - lsamt, err := s.getOrLoadLsAmt() - if err != nil { - return 0, err - } - return lsamt.Length(), nil -} - -func (s *state6) GetState() interface{} { - return &s.State -} - -// Iterate lane states -func (s *state6) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { - // Get the lane state from the chain - lsamt, err := s.getOrLoadLsAmt() - if err != nil { - return err - } - - // Note: we use a map instead of an array to store laneStates because the - // client sets the lane ID (the index) and potentially they could use a - // very large index. - var ls paych6.LaneState - return lsamt.ForEach(&ls, func(i int64) error { - return cb(uint64(i), &laneState6{ls}) - }) -} - -type laneState6 struct { - paych6.LaneState -} - -func (ls *laneState6) Redeemed() (big.Int, error) { - return ls.LaneState.Redeemed, nil -} - -func (ls *laneState6) Nonce() (uint64, error) { - return ls.LaneState.Nonce, nil -} diff --git a/pkg/types/specactors/builtin/paych/v7.go b/pkg/types/specactors/builtin/paych/v7.go deleted file mode 100644 index 7a64f0b742..0000000000 --- a/pkg/types/specactors/builtin/paych/v7.go +++ /dev/null @@ -1,132 +0,0 @@ -// FETCHED FROM LOTUS: builtin/paych/state.go.template - -package paych - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" - adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" -) - -var _ State = (*state7)(nil) - -func load7(store adt.Store, root cid.Cid) (State, error) { - out := state7{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make7(store adt.Store) (State, error) { - out := state7{store: store} - out.State = paych7.State{} - return &out, nil -} - -type state7 struct { - paych7.State - store adt.Store - lsAmt *adt7.Array -} - -// Channel owner, who has funded the actor -func (s *state7) From() (address.Address, error) { - return s.State.From, nil -} - -// Recipient of payouts from channel -func (s *state7) To() (address.Address, error) { - return s.State.To, nil -} - -// Height at which the channel can be `Collected` -func (s *state7) SettlingAt() (abi.ChainEpoch, error) { - return s.State.SettlingAt, nil -} - -// Amount successfully redeemed through the payment channel, paid out on `Collect()` -func (s *state7) ToSend() (abi.TokenAmount, error) { - return s.State.ToSend, nil -} - -func (s *state7) getOrLoadLsAmt() (*adt7.Array, error) { - if s.lsAmt != nil { - return s.lsAmt, nil - } - - // Get the lane state from the chain - lsamt, err := adt7.AsArray(s.store, s.State.LaneStates, paych7.LaneStatesAmtBitwidth) - if err != nil { - return nil, err - } - - s.lsAmt = lsamt - return lsamt, nil -} - -// Get total number of lanes -func (s *state7) LaneCount() (uint64, error) { - lsamt, err := s.getOrLoadLsAmt() - if err != nil { - return 0, err - } - return lsamt.Length(), nil -} - -func (s *state7) GetState() interface{} { - return &s.State -} - -// Iterate lane states -func (s *state7) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { - // Get the lane state from the chain - lsamt, err := s.getOrLoadLsAmt() - if err != nil { - return err - } - - // Note: we use a map instead of an array to store laneStates because the - // client sets the lane ID (the index) and potentially they could use a - // very large index. - var ls paych7.LaneState - return lsamt.ForEach(&ls, func(i int64) error { - return cb(uint64(i), &laneState7{ls}) - }) -} - -type laneState7 struct { - paych7.LaneState -} - -func (ls *laneState7) Redeemed() (big.Int, error) { - return ls.LaneState.Redeemed, nil -} - -func (ls *laneState7) Nonce() (uint64, error) { - return ls.LaneState.Nonce, nil -} - -func toV7SignedVoucher(sv SignedVoucher) paych7.SignedVoucher { - return paych7.SignedVoucher{ - ChannelAddr: sv.ChannelAddr, - TimeLockMin: sv.TimeLockMin, - TimeLockMax: sv.TimeLockMax, - SecretHash: sv.SecretPreimage, - Extra: sv.Extra, - Lane: sv.Lane, - Nonce: sv.Nonce, - Amount: sv.Amount, - MinSettleHeight: sv.MinSettleHeight, - Merges: sv.Merges, - Signature: sv.Signature, - } -} diff --git a/pkg/types/specactors/builtin/power/actor.go.template b/pkg/types/specactors/builtin/power/actor.go.template deleted file mode 100644 index 7d1ffd2693..0000000000 --- a/pkg/types/specactors/builtin/power/actor.go.template +++ /dev/null @@ -1,109 +0,0 @@ -// FETCHED FROM LOTUS: builtin/power/actor.go.template - -package power - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/big" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/cbor" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - types "github.com/filecoin-project/venus/pkg/types/internal" -{{range .versions}} - builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" -{{end}} -) - -func init() { -{{range .versions}} - builtin.RegisterActorState(builtin{{.}}.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) -{{end}}} - -var ( - Address = builtin{{.latestVersion}}.StoragePowerActorAddr - Methods = builtin{{.latestVersion}}.MethodsPower -) - -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { -{{range .versions}} - case builtin{{.}}.StoragePowerActorCodeID: - return load{{.}}(store, act.Head) -{{end}} - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version) (State, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return make{{.}}(store) -{{end}} -} - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return builtin{{.}}.StoragePowerActorCodeID, nil -{{end}} - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - cbor.Marshaler - - TotalLocked() (abi.TokenAmount, error) - TotalPower() (Claim, error) - TotalCommitted() (Claim, error) - TotalPowerSmoothed() (builtin.FilterEstimate, error) - GetState() interface{} - - // MinerCounts returns the number of miners. Participating is the number - // with power above the minimum miner threshold. - MinerCounts() (participating, total uint64, err error) - MinerPower(address.Address) (Claim, bool, error) - MinerNominalPowerMeetsConsensusMinimum(address.Address) (bool, error) - ListAllMiners() ([]address.Address, error) - ForEachClaim(func(miner address.Address, claim Claim) error) error - ClaimsChanged(State) (bool, error) - - // Testing or genesis setup only - SetTotalQualityAdjPower(abi.StoragePower) error - SetTotalRawBytePower(abi.StoragePower) error - SetThisEpochQualityAdjPower(abi.StoragePower) error - SetThisEpochRawBytePower(abi.StoragePower) error - - // Diff helpers. Used by Diff* functions internally. - claims() (adt.Map, error) - decodeClaim(*cbg.Deferred) (Claim, error) -} - -type Claim struct { - // Sum of raw byte power for a miner's sectors. - RawBytePower abi.StoragePower - - // Sum of quality adjusted power for a miner's sectors. - QualityAdjPower abi.StoragePower -} - -func AddClaims(a Claim, b Claim) Claim { - return Claim{ - RawBytePower: big.Add(a.RawBytePower, b.RawBytePower), - QualityAdjPower: big.Add(a.QualityAdjPower, b.QualityAdjPower), - } -} diff --git a/pkg/types/specactors/builtin/power/diff.go b/pkg/types/specactors/builtin/power/diff.go deleted file mode 100644 index 07d8768390..0000000000 --- a/pkg/types/specactors/builtin/power/diff.go +++ /dev/null @@ -1,117 +0,0 @@ -package power - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - cbg "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" -) - -type ClaimChanges struct { - Added []ClaimInfo - Modified []ClaimModification - Removed []ClaimInfo -} - -type ClaimModification struct { - Miner address.Address - From Claim - To Claim -} - -type ClaimInfo struct { - Miner address.Address - Claim Claim -} - -func DiffClaims(pre, cur State) (*ClaimChanges, error) { - results := new(ClaimChanges) - - prec, err := pre.claims() - if err != nil { - return nil, err - } - - curc, err := cur.claims() - if err != nil { - return nil, err - } - - if err := adt.DiffAdtMap(prec, curc, &claimDiffer{results, pre, cur}); err != nil { - return nil, err - } - - return results, nil -} - -type claimDiffer struct { - Results *ClaimChanges - pre, after State -} - -func (c *claimDiffer) AsKey(key string) (abi.Keyer, error) { - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return nil, err - } - return abi.AddrKey(addr), nil -} - -func (c *claimDiffer) Add(key string, val *cbg.Deferred) error { - ci, err := c.after.decodeClaim(val) - if err != nil { - return err - } - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - c.Results.Added = append(c.Results.Added, ClaimInfo{ - Miner: addr, - Claim: ci, - }) - return nil -} - -func (c *claimDiffer) Modify(key string, from, to *cbg.Deferred) error { - ciFrom, err := c.pre.decodeClaim(from) - if err != nil { - return err - } - - ciTo, err := c.after.decodeClaim(to) - if err != nil { - return err - } - - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - - if ciFrom != ciTo { - c.Results.Modified = append(c.Results.Modified, ClaimModification{ - Miner: addr, - From: ciFrom, - To: ciTo, - }) - } - return nil -} - -func (c *claimDiffer) Remove(key string, val *cbg.Deferred) error { - ci, err := c.after.decodeClaim(val) - if err != nil { - return err - } - addr, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - c.Results.Removed = append(c.Results.Removed, ClaimInfo{ - Miner: addr, - Claim: ci, - }) - return nil -} diff --git a/pkg/types/specactors/builtin/power/power.go b/pkg/types/specactors/builtin/power/power.go deleted file mode 100644 index 08bc58f3ce..0000000000 --- a/pkg/types/specactors/builtin/power/power.go +++ /dev/null @@ -1,198 +0,0 @@ -// FETCHED FROM LOTUS: builtin/power/actor.go.template - -package power - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/big" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/cbor" - - types "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" -) - -func init() { - - builtin.RegisterActorState(builtin0.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - - builtin.RegisterActorState(builtin2.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - - builtin.RegisterActorState(builtin3.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - - builtin.RegisterActorState(builtin4.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - - builtin.RegisterActorState(builtin5.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - - builtin.RegisterActorState(builtin6.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - - builtin.RegisterActorState(builtin7.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) -} - -var ( - Address = builtin7.StoragePowerActorAddr - Methods = builtin7.MethodsPower -) - -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { - - case builtin0.StoragePowerActorCodeID: - return load0(store, act.Head) - - case builtin2.StoragePowerActorCodeID: - return load2(store, act.Head) - - case builtin3.StoragePowerActorCodeID: - return load3(store, act.Head) - - case builtin4.StoragePowerActorCodeID: - return load4(store, act.Head) - - case builtin5.StoragePowerActorCodeID: - return load5(store, act.Head) - - case builtin6.StoragePowerActorCodeID: - return load6(store, act.Head) - - case builtin7.StoragePowerActorCodeID: - return load7(store, act.Head) - - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version) (State, error) { - switch av { - - case actors.Version0: - return make0(store) - - case actors.Version2: - return make2(store) - - case actors.Version3: - return make3(store) - - case actors.Version4: - return make4(store) - - case actors.Version5: - return make5(store) - - case actors.Version6: - return make6(store) - - case actors.Version7: - return make7(store) - - } - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { - - case actors.Version0: - return builtin0.StoragePowerActorCodeID, nil - - case actors.Version2: - return builtin2.StoragePowerActorCodeID, nil - - case actors.Version3: - return builtin3.StoragePowerActorCodeID, nil - - case actors.Version4: - return builtin4.StoragePowerActorCodeID, nil - - case actors.Version5: - return builtin5.StoragePowerActorCodeID, nil - - case actors.Version6: - return builtin6.StoragePowerActorCodeID, nil - - case actors.Version7: - return builtin7.StoragePowerActorCodeID, nil - - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - cbor.Marshaler - - TotalLocked() (abi.TokenAmount, error) - TotalPower() (Claim, error) - TotalCommitted() (Claim, error) - TotalPowerSmoothed() (builtin.FilterEstimate, error) - GetState() interface{} - - // MinerCounts returns the number of miners. Participating is the number - // with power above the minimum miner threshold. - MinerCounts() (participating, total uint64, err error) - MinerPower(address.Address) (Claim, bool, error) - MinerNominalPowerMeetsConsensusMinimum(address.Address) (bool, error) - ListAllMiners() ([]address.Address, error) - ForEachClaim(func(miner address.Address, claim Claim) error) error - ClaimsChanged(State) (bool, error) - - // Testing or genesis setup only - SetTotalQualityAdjPower(abi.StoragePower) error - SetTotalRawBytePower(abi.StoragePower) error - SetThisEpochQualityAdjPower(abi.StoragePower) error - SetThisEpochRawBytePower(abi.StoragePower) error - - // Diff helpers. Used by Diff* functions internally. - claims() (adt.Map, error) - decodeClaim(*cbg.Deferred) (Claim, error) -} - -type Claim struct { - // Sum of raw byte power for a miner's sectors. - RawBytePower abi.StoragePower - - // Sum of quality adjusted power for a miner's sectors. - QualityAdjPower abi.StoragePower -} - -func AddClaims(a Claim, b Claim) Claim { - return Claim{ - RawBytePower: big.Add(a.RawBytePower, b.RawBytePower), - QualityAdjPower: big.Add(a.QualityAdjPower, b.QualityAdjPower), - } -} diff --git a/pkg/types/specactors/builtin/power/state.go.template b/pkg/types/specactors/builtin/power/state.go.template deleted file mode 100644 index e8a5a5f5cc..0000000000 --- a/pkg/types/specactors/builtin/power/state.go.template +++ /dev/null @@ -1,203 +0,0 @@ -// FETCHED FROM LOTUS: builtin/power/state.go.template - -package power - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - -{{if (ge .v 3)}} - builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" -{{end}} - power{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/power" - adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" -) - -var _ State = (*state{{.v}})(nil) - -func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { - out := state{{.v}}{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make{{.v}}(store adt.Store) (State, error) { - out := state{{.v}}{store: store} - {{if (le .v 2)}} - em, err := adt{{.v}}.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - emm, err := adt{{.v}}.MakeEmptyMultimap(store).Root() - if err != nil { - return nil, err - } - - out.State = *power{{.v}}.ConstructState(em, emm) - {{else}} - s, err := power{{.v}}.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - {{end}} - - return &out, nil -} - -type state{{.v}} struct { - power{{.v}}.State - store adt.Store -} - -func (s *state{{.v}}) TotalLocked() (abi.TokenAmount, error) { - return s.TotalPledgeCollateral, nil -} - -func (s *state{{.v}}) TotalPower() (Claim, error) { - return Claim{ - RawBytePower: s.TotalRawBytePower, - QualityAdjPower: s.TotalQualityAdjPower, - }, nil -} - -// Committed power to the network. Includes miners below the minimum threshold. -func (s *state{{.v}}) TotalCommitted() (Claim, error) { - return Claim{ - RawBytePower: s.TotalBytesCommitted, - QualityAdjPower: s.TotalQABytesCommitted, - }, nil -} - -func (s *state{{.v}}) MinerPower(addr address.Address) (Claim, bool, error) { - claims, err := s.claims() - if err != nil { - return Claim{}, false, err - } - var claim power{{.v}}.Claim - ok, err := claims.Get(abi.AddrKey(addr), &claim) - if err != nil { - return Claim{}, false, err - } - return Claim{ - RawBytePower: claim.RawBytePower, - QualityAdjPower: claim.QualityAdjPower, - }, ok, nil -} - -func (s *state{{.v}}) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { - return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) -} - -func (s *state{{.v}}) TotalPowerSmoothed() (builtin.FilterEstimate, error) { - return builtin.FromV{{.v}}FilterEstimate({{if (le .v 1)}}*{{end}}s.State.ThisEpochQAPowerSmoothed), nil -} - -func (s *state{{.v}}) MinerCounts() (uint64, uint64, error) { - return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil -} - -func (s *state{{.v}}) ListAllMiners() ([]address.Address, error) { - claims, err := s.claims() - if err != nil { - return nil, err - } - - var miners []address.Address - err = claims.ForEach(nil, func(k string) error { - a, err := address.NewFromBytes([]byte(k)) - if err != nil { - return err - } - miners = append(miners, a) - return nil - }) - if err != nil { - return nil, err - } - - return miners, nil -} - -func (s *state{{.v}}) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { - claims, err := s.claims() - if err != nil { - return err - } - - var claim power{{.v}}.Claim - return claims.ForEach(&claim, func(k string) error { - a, err := address.NewFromBytes([]byte(k)) - if err != nil { - return err - } - return cb(a, Claim{ - RawBytePower: claim.RawBytePower, - QualityAdjPower: claim.QualityAdjPower, - }) - }) -} - -func (s *state{{.v}}) ClaimsChanged(other State) (bool, error) { - other{{.v}}, ok := other.(*state{{.v}}) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.Claims.Equals(other{{.v}}.State.Claims), nil -} - -func (s *state{{.v}}) SetTotalQualityAdjPower(p abi.StoragePower) error { - s.State.TotalQualityAdjPower = p - return nil -} - -func (s *state{{.v}}) SetTotalRawBytePower(p abi.StoragePower) error { - s.State.TotalRawBytePower = p - return nil -} - -func (s *state{{.v}}) SetThisEpochQualityAdjPower(p abi.StoragePower) error { - s.State.ThisEpochQualityAdjPower = p - return nil -} - -func (s *state{{.v}}) SetThisEpochRawBytePower(p abi.StoragePower) error { - s.State.ThisEpochRawBytePower = p - return nil -} - -func (s *state{{.v}}) GetState() interface{} { - return &s.State -} - -func (s *state{{.v}}) claims() (adt.Map, error) { - return adt{{.v}}.AsMap(s.store, s.Claims{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) -} - -func (s *state{{.v}}) decodeClaim(val *cbg.Deferred) (Claim, error) { - var ci power{{.v}}.Claim - if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return Claim{}, err - } - return fromV{{.v}}Claim(ci), nil -} - -func fromV{{.v}}Claim(v{{.v}} power{{.v}}.Claim) Claim { - return Claim{ - RawBytePower: v{{.v}}.RawBytePower, - QualityAdjPower: v{{.v}}.QualityAdjPower, - } -} diff --git a/pkg/types/specactors/builtin/power/v0.go b/pkg/types/specactors/builtin/power/v0.go deleted file mode 100644 index 6addda377c..0000000000 --- a/pkg/types/specactors/builtin/power/v0.go +++ /dev/null @@ -1,192 +0,0 @@ -// FETCHED FROM LOTUS: builtin/power/state.go.template - -package power - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" - adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" -) - -var _ State = (*state0)(nil) - -func load0(store adt.Store, root cid.Cid) (State, error) { - out := state0{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make0(store adt.Store) (State, error) { - out := state0{store: store} - - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - emm, err := adt0.MakeEmptyMultimap(store).Root() - if err != nil { - return nil, err - } - - out.State = *power0.ConstructState(em, emm) - - return &out, nil -} - -type state0 struct { - power0.State - store adt.Store -} - -func (s *state0) TotalLocked() (abi.TokenAmount, error) { - return s.TotalPledgeCollateral, nil -} - -func (s *state0) TotalPower() (Claim, error) { - return Claim{ - RawBytePower: s.TotalRawBytePower, - QualityAdjPower: s.TotalQualityAdjPower, - }, nil -} - -// Committed power to the network. Includes miners below the minimum threshold. -func (s *state0) TotalCommitted() (Claim, error) { - return Claim{ - RawBytePower: s.TotalBytesCommitted, - QualityAdjPower: s.TotalQABytesCommitted, - }, nil -} - -func (s *state0) MinerPower(addr address.Address) (Claim, bool, error) { - claims, err := s.claims() - if err != nil { - return Claim{}, false, err - } - var claim power0.Claim - ok, err := claims.Get(abi.AddrKey(addr), &claim) - if err != nil { - return Claim{}, false, err - } - return Claim{ - RawBytePower: claim.RawBytePower, - QualityAdjPower: claim.QualityAdjPower, - }, ok, nil -} - -func (s *state0) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { - return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) -} - -func (s *state0) TotalPowerSmoothed() (builtin.FilterEstimate, error) { - return builtin.FromV0FilterEstimate(*s.State.ThisEpochQAPowerSmoothed), nil -} - -func (s *state0) MinerCounts() (uint64, uint64, error) { - return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil -} - -func (s *state0) ListAllMiners() ([]address.Address, error) { - claims, err := s.claims() - if err != nil { - return nil, err - } - - var miners []address.Address - err = claims.ForEach(nil, func(k string) error { - a, err := address.NewFromBytes([]byte(k)) - if err != nil { - return err - } - miners = append(miners, a) - return nil - }) - if err != nil { - return nil, err - } - - return miners, nil -} - -func (s *state0) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { - claims, err := s.claims() - if err != nil { - return err - } - - var claim power0.Claim - return claims.ForEach(&claim, func(k string) error { - a, err := address.NewFromBytes([]byte(k)) - if err != nil { - return err - } - return cb(a, Claim{ - RawBytePower: claim.RawBytePower, - QualityAdjPower: claim.QualityAdjPower, - }) - }) -} - -func (s *state0) ClaimsChanged(other State) (bool, error) { - other0, ok := other.(*state0) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.Claims.Equals(other0.State.Claims), nil -} - -func (s *state0) SetTotalQualityAdjPower(p abi.StoragePower) error { - s.State.TotalQualityAdjPower = p - return nil -} - -func (s *state0) SetTotalRawBytePower(p abi.StoragePower) error { - s.State.TotalRawBytePower = p - return nil -} - -func (s *state0) SetThisEpochQualityAdjPower(p abi.StoragePower) error { - s.State.ThisEpochQualityAdjPower = p - return nil -} - -func (s *state0) SetThisEpochRawBytePower(p abi.StoragePower) error { - s.State.ThisEpochRawBytePower = p - return nil -} - -func (s *state0) GetState() interface{} { - return &s.State -} - -func (s *state0) claims() (adt.Map, error) { - return adt0.AsMap(s.store, s.Claims) -} - -func (s *state0) decodeClaim(val *cbg.Deferred) (Claim, error) { - var ci power0.Claim - if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return Claim{}, err - } - return fromV0Claim(ci), nil -} - -func fromV0Claim(v0 power0.Claim) Claim { - return Claim{ - RawBytePower: v0.RawBytePower, - QualityAdjPower: v0.QualityAdjPower, - } -} diff --git a/pkg/types/specactors/builtin/power/v2.go b/pkg/types/specactors/builtin/power/v2.go deleted file mode 100644 index dcedc20e11..0000000000 --- a/pkg/types/specactors/builtin/power/v2.go +++ /dev/null @@ -1,192 +0,0 @@ -// FETCHED FROM LOTUS: builtin/power/state.go.template - -package power - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - power2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/power" - adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" -) - -var _ State = (*state2)(nil) - -func load2(store adt.Store, root cid.Cid) (State, error) { - out := state2{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make2(store adt.Store) (State, error) { - out := state2{store: store} - - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - emm, err := adt2.MakeEmptyMultimap(store).Root() - if err != nil { - return nil, err - } - - out.State = *power2.ConstructState(em, emm) - - return &out, nil -} - -type state2 struct { - power2.State - store adt.Store -} - -func (s *state2) TotalLocked() (abi.TokenAmount, error) { - return s.TotalPledgeCollateral, nil -} - -func (s *state2) TotalPower() (Claim, error) { - return Claim{ - RawBytePower: s.TotalRawBytePower, - QualityAdjPower: s.TotalQualityAdjPower, - }, nil -} - -// Committed power to the network. Includes miners below the minimum threshold. -func (s *state2) TotalCommitted() (Claim, error) { - return Claim{ - RawBytePower: s.TotalBytesCommitted, - QualityAdjPower: s.TotalQABytesCommitted, - }, nil -} - -func (s *state2) MinerPower(addr address.Address) (Claim, bool, error) { - claims, err := s.claims() - if err != nil { - return Claim{}, false, err - } - var claim power2.Claim - ok, err := claims.Get(abi.AddrKey(addr), &claim) - if err != nil { - return Claim{}, false, err - } - return Claim{ - RawBytePower: claim.RawBytePower, - QualityAdjPower: claim.QualityAdjPower, - }, ok, nil -} - -func (s *state2) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { - return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) -} - -func (s *state2) TotalPowerSmoothed() (builtin.FilterEstimate, error) { - return builtin.FromV2FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil -} - -func (s *state2) MinerCounts() (uint64, uint64, error) { - return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil -} - -func (s *state2) ListAllMiners() ([]address.Address, error) { - claims, err := s.claims() - if err != nil { - return nil, err - } - - var miners []address.Address - err = claims.ForEach(nil, func(k string) error { - a, err := address.NewFromBytes([]byte(k)) - if err != nil { - return err - } - miners = append(miners, a) - return nil - }) - if err != nil { - return nil, err - } - - return miners, nil -} - -func (s *state2) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { - claims, err := s.claims() - if err != nil { - return err - } - - var claim power2.Claim - return claims.ForEach(&claim, func(k string) error { - a, err := address.NewFromBytes([]byte(k)) - if err != nil { - return err - } - return cb(a, Claim{ - RawBytePower: claim.RawBytePower, - QualityAdjPower: claim.QualityAdjPower, - }) - }) -} - -func (s *state2) ClaimsChanged(other State) (bool, error) { - other2, ok := other.(*state2) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.Claims.Equals(other2.State.Claims), nil -} - -func (s *state2) SetTotalQualityAdjPower(p abi.StoragePower) error { - s.State.TotalQualityAdjPower = p - return nil -} - -func (s *state2) SetTotalRawBytePower(p abi.StoragePower) error { - s.State.TotalRawBytePower = p - return nil -} - -func (s *state2) SetThisEpochQualityAdjPower(p abi.StoragePower) error { - s.State.ThisEpochQualityAdjPower = p - return nil -} - -func (s *state2) SetThisEpochRawBytePower(p abi.StoragePower) error { - s.State.ThisEpochRawBytePower = p - return nil -} - -func (s *state2) GetState() interface{} { - return &s.State -} - -func (s *state2) claims() (adt.Map, error) { - return adt2.AsMap(s.store, s.Claims) -} - -func (s *state2) decodeClaim(val *cbg.Deferred) (Claim, error) { - var ci power2.Claim - if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return Claim{}, err - } - return fromV2Claim(ci), nil -} - -func fromV2Claim(v2 power2.Claim) Claim { - return Claim{ - RawBytePower: v2.RawBytePower, - QualityAdjPower: v2.QualityAdjPower, - } -} diff --git a/pkg/types/specactors/builtin/power/v3.go b/pkg/types/specactors/builtin/power/v3.go deleted file mode 100644 index 194c2437d8..0000000000 --- a/pkg/types/specactors/builtin/power/v3.go +++ /dev/null @@ -1,189 +0,0 @@ -// FETCHED FROM LOTUS: builtin/power/state.go.template - -package power - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - power3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/power" - adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" -) - -var _ State = (*state3)(nil) - -func load3(store adt.Store, root cid.Cid) (State, error) { - out := state3{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make3(store adt.Store) (State, error) { - out := state3{store: store} - - s, err := power3.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state3 struct { - power3.State - store adt.Store -} - -func (s *state3) TotalLocked() (abi.TokenAmount, error) { - return s.TotalPledgeCollateral, nil -} - -func (s *state3) TotalPower() (Claim, error) { - return Claim{ - RawBytePower: s.TotalRawBytePower, - QualityAdjPower: s.TotalQualityAdjPower, - }, nil -} - -// Committed power to the network. Includes miners below the minimum threshold. -func (s *state3) TotalCommitted() (Claim, error) { - return Claim{ - RawBytePower: s.TotalBytesCommitted, - QualityAdjPower: s.TotalQABytesCommitted, - }, nil -} - -func (s *state3) MinerPower(addr address.Address) (Claim, bool, error) { - claims, err := s.claims() - if err != nil { - return Claim{}, false, err - } - var claim power3.Claim - ok, err := claims.Get(abi.AddrKey(addr), &claim) - if err != nil { - return Claim{}, false, err - } - return Claim{ - RawBytePower: claim.RawBytePower, - QualityAdjPower: claim.QualityAdjPower, - }, ok, nil -} - -func (s *state3) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { - return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) -} - -func (s *state3) TotalPowerSmoothed() (builtin.FilterEstimate, error) { - return builtin.FromV3FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil -} - -func (s *state3) MinerCounts() (uint64, uint64, error) { - return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil -} - -func (s *state3) ListAllMiners() ([]address.Address, error) { - claims, err := s.claims() - if err != nil { - return nil, err - } - - var miners []address.Address - err = claims.ForEach(nil, func(k string) error { - a, err := address.NewFromBytes([]byte(k)) - if err != nil { - return err - } - miners = append(miners, a) - return nil - }) - if err != nil { - return nil, err - } - - return miners, nil -} - -func (s *state3) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { - claims, err := s.claims() - if err != nil { - return err - } - - var claim power3.Claim - return claims.ForEach(&claim, func(k string) error { - a, err := address.NewFromBytes([]byte(k)) - if err != nil { - return err - } - return cb(a, Claim{ - RawBytePower: claim.RawBytePower, - QualityAdjPower: claim.QualityAdjPower, - }) - }) -} - -func (s *state3) ClaimsChanged(other State) (bool, error) { - other3, ok := other.(*state3) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.Claims.Equals(other3.State.Claims), nil -} - -func (s *state3) SetTotalQualityAdjPower(p abi.StoragePower) error { - s.State.TotalQualityAdjPower = p - return nil -} - -func (s *state3) SetTotalRawBytePower(p abi.StoragePower) error { - s.State.TotalRawBytePower = p - return nil -} - -func (s *state3) SetThisEpochQualityAdjPower(p abi.StoragePower) error { - s.State.ThisEpochQualityAdjPower = p - return nil -} - -func (s *state3) SetThisEpochRawBytePower(p abi.StoragePower) error { - s.State.ThisEpochRawBytePower = p - return nil -} - -func (s *state3) GetState() interface{} { - return &s.State -} - -func (s *state3) claims() (adt.Map, error) { - return adt3.AsMap(s.store, s.Claims, builtin3.DefaultHamtBitwidth) -} - -func (s *state3) decodeClaim(val *cbg.Deferred) (Claim, error) { - var ci power3.Claim - if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return Claim{}, err - } - return fromV3Claim(ci), nil -} - -func fromV3Claim(v3 power3.Claim) Claim { - return Claim{ - RawBytePower: v3.RawBytePower, - QualityAdjPower: v3.QualityAdjPower, - } -} diff --git a/pkg/types/specactors/builtin/power/v4.go b/pkg/types/specactors/builtin/power/v4.go deleted file mode 100644 index d8ef01d5f6..0000000000 --- a/pkg/types/specactors/builtin/power/v4.go +++ /dev/null @@ -1,189 +0,0 @@ -// FETCHED FROM LOTUS: builtin/power/state.go.template - -package power - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - power4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/power" - adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" -) - -var _ State = (*state4)(nil) - -func load4(store adt.Store, root cid.Cid) (State, error) { - out := state4{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make4(store adt.Store) (State, error) { - out := state4{store: store} - - s, err := power4.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state4 struct { - power4.State - store adt.Store -} - -func (s *state4) TotalLocked() (abi.TokenAmount, error) { - return s.TotalPledgeCollateral, nil -} - -func (s *state4) TotalPower() (Claim, error) { - return Claim{ - RawBytePower: s.TotalRawBytePower, - QualityAdjPower: s.TotalQualityAdjPower, - }, nil -} - -// Committed power to the network. Includes miners below the minimum threshold. -func (s *state4) TotalCommitted() (Claim, error) { - return Claim{ - RawBytePower: s.TotalBytesCommitted, - QualityAdjPower: s.TotalQABytesCommitted, - }, nil -} - -func (s *state4) MinerPower(addr address.Address) (Claim, bool, error) { - claims, err := s.claims() - if err != nil { - return Claim{}, false, err - } - var claim power4.Claim - ok, err := claims.Get(abi.AddrKey(addr), &claim) - if err != nil { - return Claim{}, false, err - } - return Claim{ - RawBytePower: claim.RawBytePower, - QualityAdjPower: claim.QualityAdjPower, - }, ok, nil -} - -func (s *state4) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { - return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) -} - -func (s *state4) TotalPowerSmoothed() (builtin.FilterEstimate, error) { - return builtin.FromV4FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil -} - -func (s *state4) MinerCounts() (uint64, uint64, error) { - return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil -} - -func (s *state4) ListAllMiners() ([]address.Address, error) { - claims, err := s.claims() - if err != nil { - return nil, err - } - - var miners []address.Address - err = claims.ForEach(nil, func(k string) error { - a, err := address.NewFromBytes([]byte(k)) - if err != nil { - return err - } - miners = append(miners, a) - return nil - }) - if err != nil { - return nil, err - } - - return miners, nil -} - -func (s *state4) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { - claims, err := s.claims() - if err != nil { - return err - } - - var claim power4.Claim - return claims.ForEach(&claim, func(k string) error { - a, err := address.NewFromBytes([]byte(k)) - if err != nil { - return err - } - return cb(a, Claim{ - RawBytePower: claim.RawBytePower, - QualityAdjPower: claim.QualityAdjPower, - }) - }) -} - -func (s *state4) ClaimsChanged(other State) (bool, error) { - other4, ok := other.(*state4) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.Claims.Equals(other4.State.Claims), nil -} - -func (s *state4) SetTotalQualityAdjPower(p abi.StoragePower) error { - s.State.TotalQualityAdjPower = p - return nil -} - -func (s *state4) SetTotalRawBytePower(p abi.StoragePower) error { - s.State.TotalRawBytePower = p - return nil -} - -func (s *state4) SetThisEpochQualityAdjPower(p abi.StoragePower) error { - s.State.ThisEpochQualityAdjPower = p - return nil -} - -func (s *state4) SetThisEpochRawBytePower(p abi.StoragePower) error { - s.State.ThisEpochRawBytePower = p - return nil -} - -func (s *state4) GetState() interface{} { - return &s.State -} - -func (s *state4) claims() (adt.Map, error) { - return adt4.AsMap(s.store, s.Claims, builtin4.DefaultHamtBitwidth) -} - -func (s *state4) decodeClaim(val *cbg.Deferred) (Claim, error) { - var ci power4.Claim - if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return Claim{}, err - } - return fromV4Claim(ci), nil -} - -func fromV4Claim(v4 power4.Claim) Claim { - return Claim{ - RawBytePower: v4.RawBytePower, - QualityAdjPower: v4.QualityAdjPower, - } -} diff --git a/pkg/types/specactors/builtin/power/v5.go b/pkg/types/specactors/builtin/power/v5.go deleted file mode 100644 index b790013ce3..0000000000 --- a/pkg/types/specactors/builtin/power/v5.go +++ /dev/null @@ -1,189 +0,0 @@ -// FETCHED FROM LOTUS: builtin/power/state.go.template - -package power - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - power5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/power" - adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" -) - -var _ State = (*state5)(nil) - -func load5(store adt.Store, root cid.Cid) (State, error) { - out := state5{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make5(store adt.Store) (State, error) { - out := state5{store: store} - - s, err := power5.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state5 struct { - power5.State - store adt.Store -} - -func (s *state5) TotalLocked() (abi.TokenAmount, error) { - return s.TotalPledgeCollateral, nil -} - -func (s *state5) TotalPower() (Claim, error) { - return Claim{ - RawBytePower: s.TotalRawBytePower, - QualityAdjPower: s.TotalQualityAdjPower, - }, nil -} - -// Committed power to the network. Includes miners below the minimum threshold. -func (s *state5) TotalCommitted() (Claim, error) { - return Claim{ - RawBytePower: s.TotalBytesCommitted, - QualityAdjPower: s.TotalQABytesCommitted, - }, nil -} - -func (s *state5) MinerPower(addr address.Address) (Claim, bool, error) { - claims, err := s.claims() - if err != nil { - return Claim{}, false, err - } - var claim power5.Claim - ok, err := claims.Get(abi.AddrKey(addr), &claim) - if err != nil { - return Claim{}, false, err - } - return Claim{ - RawBytePower: claim.RawBytePower, - QualityAdjPower: claim.QualityAdjPower, - }, ok, nil -} - -func (s *state5) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { - return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) -} - -func (s *state5) TotalPowerSmoothed() (builtin.FilterEstimate, error) { - return builtin.FromV5FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil -} - -func (s *state5) MinerCounts() (uint64, uint64, error) { - return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil -} - -func (s *state5) ListAllMiners() ([]address.Address, error) { - claims, err := s.claims() - if err != nil { - return nil, err - } - - var miners []address.Address - err = claims.ForEach(nil, func(k string) error { - a, err := address.NewFromBytes([]byte(k)) - if err != nil { - return err - } - miners = append(miners, a) - return nil - }) - if err != nil { - return nil, err - } - - return miners, nil -} - -func (s *state5) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { - claims, err := s.claims() - if err != nil { - return err - } - - var claim power5.Claim - return claims.ForEach(&claim, func(k string) error { - a, err := address.NewFromBytes([]byte(k)) - if err != nil { - return err - } - return cb(a, Claim{ - RawBytePower: claim.RawBytePower, - QualityAdjPower: claim.QualityAdjPower, - }) - }) -} - -func (s *state5) ClaimsChanged(other State) (bool, error) { - other5, ok := other.(*state5) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.Claims.Equals(other5.State.Claims), nil -} - -func (s *state5) SetTotalQualityAdjPower(p abi.StoragePower) error { - s.State.TotalQualityAdjPower = p - return nil -} - -func (s *state5) SetTotalRawBytePower(p abi.StoragePower) error { - s.State.TotalRawBytePower = p - return nil -} - -func (s *state5) SetThisEpochQualityAdjPower(p abi.StoragePower) error { - s.State.ThisEpochQualityAdjPower = p - return nil -} - -func (s *state5) SetThisEpochRawBytePower(p abi.StoragePower) error { - s.State.ThisEpochRawBytePower = p - return nil -} - -func (s *state5) GetState() interface{} { - return &s.State -} - -func (s *state5) claims() (adt.Map, error) { - return adt5.AsMap(s.store, s.Claims, builtin5.DefaultHamtBitwidth) -} - -func (s *state5) decodeClaim(val *cbg.Deferred) (Claim, error) { - var ci power5.Claim - if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return Claim{}, err - } - return fromV5Claim(ci), nil -} - -func fromV5Claim(v5 power5.Claim) Claim { - return Claim{ - RawBytePower: v5.RawBytePower, - QualityAdjPower: v5.QualityAdjPower, - } -} diff --git a/pkg/types/specactors/builtin/power/v6.go b/pkg/types/specactors/builtin/power/v6.go deleted file mode 100644 index ba3baf944f..0000000000 --- a/pkg/types/specactors/builtin/power/v6.go +++ /dev/null @@ -1,189 +0,0 @@ -// FETCHED FROM LOTUS: builtin/power/state.go.template - -package power - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - power6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/power" - adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" -) - -var _ State = (*state6)(nil) - -func load6(store adt.Store, root cid.Cid) (State, error) { - out := state6{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make6(store adt.Store) (State, error) { - out := state6{store: store} - - s, err := power6.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state6 struct { - power6.State - store adt.Store -} - -func (s *state6) TotalLocked() (abi.TokenAmount, error) { - return s.TotalPledgeCollateral, nil -} - -func (s *state6) TotalPower() (Claim, error) { - return Claim{ - RawBytePower: s.TotalRawBytePower, - QualityAdjPower: s.TotalQualityAdjPower, - }, nil -} - -// Committed power to the network. Includes miners below the minimum threshold. -func (s *state6) TotalCommitted() (Claim, error) { - return Claim{ - RawBytePower: s.TotalBytesCommitted, - QualityAdjPower: s.TotalQABytesCommitted, - }, nil -} - -func (s *state6) MinerPower(addr address.Address) (Claim, bool, error) { - claims, err := s.claims() - if err != nil { - return Claim{}, false, err - } - var claim power6.Claim - ok, err := claims.Get(abi.AddrKey(addr), &claim) - if err != nil { - return Claim{}, false, err - } - return Claim{ - RawBytePower: claim.RawBytePower, - QualityAdjPower: claim.QualityAdjPower, - }, ok, nil -} - -func (s *state6) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { - return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) -} - -func (s *state6) TotalPowerSmoothed() (builtin.FilterEstimate, error) { - return builtin.FromV6FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil -} - -func (s *state6) MinerCounts() (uint64, uint64, error) { - return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil -} - -func (s *state6) ListAllMiners() ([]address.Address, error) { - claims, err := s.claims() - if err != nil { - return nil, err - } - - var miners []address.Address - err = claims.ForEach(nil, func(k string) error { - a, err := address.NewFromBytes([]byte(k)) - if err != nil { - return err - } - miners = append(miners, a) - return nil - }) - if err != nil { - return nil, err - } - - return miners, nil -} - -func (s *state6) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { - claims, err := s.claims() - if err != nil { - return err - } - - var claim power6.Claim - return claims.ForEach(&claim, func(k string) error { - a, err := address.NewFromBytes([]byte(k)) - if err != nil { - return err - } - return cb(a, Claim{ - RawBytePower: claim.RawBytePower, - QualityAdjPower: claim.QualityAdjPower, - }) - }) -} - -func (s *state6) ClaimsChanged(other State) (bool, error) { - other6, ok := other.(*state6) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.Claims.Equals(other6.State.Claims), nil -} - -func (s *state6) SetTotalQualityAdjPower(p abi.StoragePower) error { - s.State.TotalQualityAdjPower = p - return nil -} - -func (s *state6) SetTotalRawBytePower(p abi.StoragePower) error { - s.State.TotalRawBytePower = p - return nil -} - -func (s *state6) SetThisEpochQualityAdjPower(p abi.StoragePower) error { - s.State.ThisEpochQualityAdjPower = p - return nil -} - -func (s *state6) SetThisEpochRawBytePower(p abi.StoragePower) error { - s.State.ThisEpochRawBytePower = p - return nil -} - -func (s *state6) GetState() interface{} { - return &s.State -} - -func (s *state6) claims() (adt.Map, error) { - return adt6.AsMap(s.store, s.Claims, builtin6.DefaultHamtBitwidth) -} - -func (s *state6) decodeClaim(val *cbg.Deferred) (Claim, error) { - var ci power6.Claim - if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return Claim{}, err - } - return fromV6Claim(ci), nil -} - -func fromV6Claim(v6 power6.Claim) Claim { - return Claim{ - RawBytePower: v6.RawBytePower, - QualityAdjPower: v6.QualityAdjPower, - } -} diff --git a/pkg/types/specactors/builtin/power/v7.go b/pkg/types/specactors/builtin/power/v7.go deleted file mode 100644 index de16016978..0000000000 --- a/pkg/types/specactors/builtin/power/v7.go +++ /dev/null @@ -1,189 +0,0 @@ -// FETCHED FROM LOTUS: builtin/power/state.go.template - -package power - -import ( - "bytes" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - - power7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/power" - adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" -) - -var _ State = (*state7)(nil) - -func load7(store adt.Store, root cid.Cid) (State, error) { - out := state7{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make7(store adt.Store) (State, error) { - out := state7{store: store} - - s, err := power7.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state7 struct { - power7.State - store adt.Store -} - -func (s *state7) TotalLocked() (abi.TokenAmount, error) { - return s.TotalPledgeCollateral, nil -} - -func (s *state7) TotalPower() (Claim, error) { - return Claim{ - RawBytePower: s.TotalRawBytePower, - QualityAdjPower: s.TotalQualityAdjPower, - }, nil -} - -// Committed power to the network. Includes miners below the minimum threshold. -func (s *state7) TotalCommitted() (Claim, error) { - return Claim{ - RawBytePower: s.TotalBytesCommitted, - QualityAdjPower: s.TotalQABytesCommitted, - }, nil -} - -func (s *state7) MinerPower(addr address.Address) (Claim, bool, error) { - claims, err := s.claims() - if err != nil { - return Claim{}, false, err - } - var claim power7.Claim - ok, err := claims.Get(abi.AddrKey(addr), &claim) - if err != nil { - return Claim{}, false, err - } - return Claim{ - RawBytePower: claim.RawBytePower, - QualityAdjPower: claim.QualityAdjPower, - }, ok, nil -} - -func (s *state7) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { - return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) -} - -func (s *state7) TotalPowerSmoothed() (builtin.FilterEstimate, error) { - return builtin.FromV7FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil -} - -func (s *state7) MinerCounts() (uint64, uint64, error) { - return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil -} - -func (s *state7) ListAllMiners() ([]address.Address, error) { - claims, err := s.claims() - if err != nil { - return nil, err - } - - var miners []address.Address - err = claims.ForEach(nil, func(k string) error { - a, err := address.NewFromBytes([]byte(k)) - if err != nil { - return err - } - miners = append(miners, a) - return nil - }) - if err != nil { - return nil, err - } - - return miners, nil -} - -func (s *state7) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { - claims, err := s.claims() - if err != nil { - return err - } - - var claim power7.Claim - return claims.ForEach(&claim, func(k string) error { - a, err := address.NewFromBytes([]byte(k)) - if err != nil { - return err - } - return cb(a, Claim{ - RawBytePower: claim.RawBytePower, - QualityAdjPower: claim.QualityAdjPower, - }) - }) -} - -func (s *state7) ClaimsChanged(other State) (bool, error) { - other7, ok := other.(*state7) - if !ok { - // treat an upgrade as a change, always - return true, nil - } - return !s.State.Claims.Equals(other7.State.Claims), nil -} - -func (s *state7) SetTotalQualityAdjPower(p abi.StoragePower) error { - s.State.TotalQualityAdjPower = p - return nil -} - -func (s *state7) SetTotalRawBytePower(p abi.StoragePower) error { - s.State.TotalRawBytePower = p - return nil -} - -func (s *state7) SetThisEpochQualityAdjPower(p abi.StoragePower) error { - s.State.ThisEpochQualityAdjPower = p - return nil -} - -func (s *state7) SetThisEpochRawBytePower(p abi.StoragePower) error { - s.State.ThisEpochRawBytePower = p - return nil -} - -func (s *state7) GetState() interface{} { - return &s.State -} - -func (s *state7) claims() (adt.Map, error) { - return adt7.AsMap(s.store, s.Claims, builtin7.DefaultHamtBitwidth) -} - -func (s *state7) decodeClaim(val *cbg.Deferred) (Claim, error) { - var ci power7.Claim - if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { - return Claim{}, err - } - return fromV7Claim(ci), nil -} - -func fromV7Claim(v7 power7.Claim) Claim { - return Claim{ - RawBytePower: v7.RawBytePower, - QualityAdjPower: v7.QualityAdjPower, - } -} diff --git a/pkg/types/specactors/builtin/reward/actor.go.template b/pkg/types/specactors/builtin/reward/actor.go.template deleted file mode 100644 index 27d969b11e..0000000000 --- a/pkg/types/specactors/builtin/reward/actor.go.template +++ /dev/null @@ -1,85 +0,0 @@ -// FETCHED FROM LOTUS: builtin/reward/actor.go.template - -package reward - -import ( - "github.com/filecoin-project/go-state-types/abi" - reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" - "github.com/ipfs/go-cid" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-state-types/cbor" -{{range .versions}} - builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" -{{end}} - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - types "github.com/filecoin-project/venus/pkg/types/internal" -) - -func init() { -{{range .versions}} - builtin.RegisterActorState(builtin{{.}}.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) -{{end}}} - -var ( - Address = builtin{{.latestVersion}}.RewardActorAddr - Methods = builtin{{.latestVersion}}.MethodsReward -) - -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { -{{range .versions}} - case builtin{{.}}.RewardActorCodeID: - return load{{.}}(store, act.Head) -{{end}} - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.StoragePower) (State, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return make{{.}}(store, currRealizedPower) -{{end}} -} - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return builtin{{.}}.RewardActorCodeID, nil -{{end}} - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - cbor.Marshaler - - ThisEpochBaselinePower() (abi.StoragePower, error) - ThisEpochReward() (abi.StoragePower, error) - ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) - - EffectiveBaselinePower() (abi.StoragePower, error) - EffectiveNetworkTime() (abi.ChainEpoch, error) - - TotalStoragePowerReward() (abi.TokenAmount, error) - - CumsumBaseline() (abi.StoragePower, error) - CumsumRealized() (abi.StoragePower, error) - - InitialPledgeForPower(abi.StoragePower, abi.TokenAmount, *builtin.FilterEstimate, abi.TokenAmount) (abi.TokenAmount, error) - PreCommitDepositForPower(builtin.FilterEstimate, abi.StoragePower) (abi.TokenAmount, error) - GetState() interface{} -} - -type AwardBlockRewardParams = reward0.AwardBlockRewardParams diff --git a/pkg/types/specactors/builtin/reward/reward.go b/pkg/types/specactors/builtin/reward/reward.go deleted file mode 100644 index db4340031f..0000000000 --- a/pkg/types/specactors/builtin/reward/reward.go +++ /dev/null @@ -1,174 +0,0 @@ -// FETCHED FROM LOTUS: builtin/reward/actor.go.template - -package reward - -import ( - "github.com/filecoin-project/go-state-types/abi" - reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/ipfs/go-cid" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-state-types/cbor" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - - types "github.com/filecoin-project/venus/pkg/types/internal" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" -) - -func init() { - - builtin.RegisterActorState(builtin0.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - - builtin.RegisterActorState(builtin2.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - - builtin.RegisterActorState(builtin3.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - - builtin.RegisterActorState(builtin4.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - - builtin.RegisterActorState(builtin5.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - - builtin.RegisterActorState(builtin6.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - - builtin.RegisterActorState(builtin7.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) -} - -var ( - Address = builtin7.RewardActorAddr - Methods = builtin7.MethodsReward -) - -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { - - case builtin0.RewardActorCodeID: - return load0(store, act.Head) - - case builtin2.RewardActorCodeID: - return load2(store, act.Head) - - case builtin3.RewardActorCodeID: - return load3(store, act.Head) - - case builtin4.RewardActorCodeID: - return load4(store, act.Head) - - case builtin5.RewardActorCodeID: - return load5(store, act.Head) - - case builtin6.RewardActorCodeID: - return load6(store, act.Head) - - case builtin7.RewardActorCodeID: - return load7(store, act.Head) - - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.StoragePower) (State, error) { - switch av { - - case actors.Version0: - return make0(store, currRealizedPower) - - case actors.Version2: - return make2(store, currRealizedPower) - - case actors.Version3: - return make3(store, currRealizedPower) - - case actors.Version4: - return make4(store, currRealizedPower) - - case actors.Version5: - return make5(store, currRealizedPower) - - case actors.Version6: - return make6(store, currRealizedPower) - - case actors.Version7: - return make7(store, currRealizedPower) - - } - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { - - case actors.Version0: - return builtin0.RewardActorCodeID, nil - - case actors.Version2: - return builtin2.RewardActorCodeID, nil - - case actors.Version3: - return builtin3.RewardActorCodeID, nil - - case actors.Version4: - return builtin4.RewardActorCodeID, nil - - case actors.Version5: - return builtin5.RewardActorCodeID, nil - - case actors.Version6: - return builtin6.RewardActorCodeID, nil - - case actors.Version7: - return builtin7.RewardActorCodeID, nil - - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - cbor.Marshaler - - ThisEpochBaselinePower() (abi.StoragePower, error) - ThisEpochReward() (abi.StoragePower, error) - ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) - - EffectiveBaselinePower() (abi.StoragePower, error) - EffectiveNetworkTime() (abi.ChainEpoch, error) - - TotalStoragePowerReward() (abi.TokenAmount, error) - - CumsumBaseline() (abi.StoragePower, error) - CumsumRealized() (abi.StoragePower, error) - - InitialPledgeForPower(abi.StoragePower, abi.TokenAmount, *builtin.FilterEstimate, abi.TokenAmount) (abi.TokenAmount, error) - PreCommitDepositForPower(builtin.FilterEstimate, abi.StoragePower) (abi.TokenAmount, error) - GetState() interface{} -} - -type AwardBlockRewardParams = reward0.AwardBlockRewardParams diff --git a/pkg/types/specactors/builtin/reward/state.go.template b/pkg/types/specactors/builtin/reward/state.go.template deleted file mode 100644 index 397a861c77..0000000000 --- a/pkg/types/specactors/builtin/reward/state.go.template +++ /dev/null @@ -1,115 +0,0 @@ -// FETCHED FROM LOTUS: builtin/reward/state.go.template - -package reward - -import ( - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - miner{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/miner" - reward{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/reward" - smoothing{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/smoothing" -) - -var _ State = (*state{{.v}})(nil) - -func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { - out := state{{.v}}{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make{{.v}}(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { - out := state{{.v}}{store: store} - out.State = *reward{{.v}}.ConstructState(currRealizedPower) - return &out, nil -} - -type state{{.v}} struct { - reward{{.v}}.State - store adt.Store -} - -func (s *state{{.v}}) ThisEpochReward() (abi.TokenAmount, error) { - return s.State.ThisEpochReward, nil -} - -func (s *state{{.v}}) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { -{{if (ge .v 2)}} - return builtin.FilterEstimate{ - PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, - VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, - }, nil -{{else}} - return builtin.FromV0FilterEstimate(*s.State.ThisEpochRewardSmoothed), nil -{{end}} -} - -func (s *state{{.v}}) ThisEpochBaselinePower() (abi.StoragePower, error) { - return s.State.ThisEpochBaselinePower, nil -} - -func (s *state{{.v}}) TotalStoragePowerReward() (abi.TokenAmount, error) { - return s.State.{{if (ge .v 2)}}TotalStoragePowerReward{{else}}TotalMined{{end}}, nil -} - -func (s *state{{.v}}) EffectiveBaselinePower() (abi.StoragePower, error) { - return s.State.EffectiveBaselinePower, nil -} - -func (s *state{{.v}}) EffectiveNetworkTime() (abi.ChainEpoch, error) { - return s.State.EffectiveNetworkTime, nil -} - -func (s *state{{.v}}) CumsumBaseline() (reward{{.v}}.Spacetime, error) { - return s.State.CumsumBaseline, nil -} - -func (s *state{{.v}}) CumsumRealized() (reward{{.v}}.Spacetime, error) { - return s.State.CumsumRealized, nil -} -{{if (ge .v 2)}} -func (s *state{{.v}}) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { - return miner{{.v}}.InitialPledgeForPower( - qaPower, - s.State.ThisEpochBaselinePower, - s.State.ThisEpochRewardSmoothed, - smoothing{{.v}}.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - circSupply, - ), nil -} -{{else}} -func (s *state0) InitialPledgeForPower(sectorWeight abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { - return miner0.InitialPledgeForPower( - sectorWeight, - s.State.ThisEpochBaselinePower, - networkTotalPledge, - s.State.ThisEpochRewardSmoothed, - &smoothing0.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - circSupply), nil -} -{{end}} -func (s *state{{.v}}) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { - return miner{{.v}}.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, - {{if (le .v 0)}}&{{end}}smoothing{{.v}}.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - sectorWeight), nil -} - -func (s *state{{.v}}) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/reward/v0.go b/pkg/types/specactors/builtin/reward/v0.go deleted file mode 100644 index dd83b4dee4..0000000000 --- a/pkg/types/specactors/builtin/reward/v0.go +++ /dev/null @@ -1,97 +0,0 @@ -// FETCHED FROM LOTUS: builtin/reward/state.go.template - -package reward - -import ( - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" - reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" - smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing" -) - -var _ State = (*state0)(nil) - -func load0(store adt.Store, root cid.Cid) (State, error) { - out := state0{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make0(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { - out := state0{store: store} - out.State = *reward0.ConstructState(currRealizedPower) - return &out, nil -} - -type state0 struct { - reward0.State - store adt.Store -} - -func (s *state0) ThisEpochReward() (abi.TokenAmount, error) { - return s.State.ThisEpochReward, nil -} - -func (s *state0) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - - return builtin.FromV0FilterEstimate(*s.State.ThisEpochRewardSmoothed), nil - -} - -func (s *state0) ThisEpochBaselinePower() (abi.StoragePower, error) { - return s.State.ThisEpochBaselinePower, nil -} - -func (s *state0) TotalStoragePowerReward() (abi.TokenAmount, error) { - return s.State.TotalMined, nil -} - -func (s *state0) EffectiveBaselinePower() (abi.StoragePower, error) { - return s.State.EffectiveBaselinePower, nil -} - -func (s *state0) EffectiveNetworkTime() (abi.ChainEpoch, error) { - return s.State.EffectiveNetworkTime, nil -} - -func (s *state0) CumsumBaseline() (reward0.Spacetime, error) { - return s.State.CumsumBaseline, nil -} - -func (s *state0) CumsumRealized() (reward0.Spacetime, error) { - return s.State.CumsumRealized, nil -} - -func (s *state0) InitialPledgeForPower(sectorWeight abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { - return miner0.InitialPledgeForPower( - sectorWeight, - s.State.ThisEpochBaselinePower, - networkTotalPledge, - s.State.ThisEpochRewardSmoothed, - &smoothing0.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - circSupply), nil -} - -func (s *state0) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { - return miner0.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, - &smoothing0.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - sectorWeight), nil -} - -func (s *state0) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/reward/v2.go b/pkg/types/specactors/builtin/reward/v2.go deleted file mode 100644 index dd999fcccf..0000000000 --- a/pkg/types/specactors/builtin/reward/v2.go +++ /dev/null @@ -1,100 +0,0 @@ -// FETCHED FROM LOTUS: builtin/reward/state.go.template - -package reward - -import ( - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" - reward2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/reward" - smoothing2 "github.com/filecoin-project/specs-actors/v2/actors/util/smoothing" -) - -var _ State = (*state2)(nil) - -func load2(store adt.Store, root cid.Cid) (State, error) { - out := state2{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make2(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { - out := state2{store: store} - out.State = *reward2.ConstructState(currRealizedPower) - return &out, nil -} - -type state2 struct { - reward2.State - store adt.Store -} - -func (s *state2) ThisEpochReward() (abi.TokenAmount, error) { - return s.State.ThisEpochReward, nil -} - -func (s *state2) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - - return builtin.FilterEstimate{ - PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, - VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, - }, nil - -} - -func (s *state2) ThisEpochBaselinePower() (abi.StoragePower, error) { - return s.State.ThisEpochBaselinePower, nil -} - -func (s *state2) TotalStoragePowerReward() (abi.TokenAmount, error) { - return s.State.TotalStoragePowerReward, nil -} - -func (s *state2) EffectiveBaselinePower() (abi.StoragePower, error) { - return s.State.EffectiveBaselinePower, nil -} - -func (s *state2) EffectiveNetworkTime() (abi.ChainEpoch, error) { - return s.State.EffectiveNetworkTime, nil -} - -func (s *state2) CumsumBaseline() (reward2.Spacetime, error) { - return s.State.CumsumBaseline, nil -} - -func (s *state2) CumsumRealized() (reward2.Spacetime, error) { - return s.State.CumsumRealized, nil -} - -func (s *state2) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { - return miner2.InitialPledgeForPower( - qaPower, - s.State.ThisEpochBaselinePower, - s.State.ThisEpochRewardSmoothed, - smoothing2.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - circSupply, - ), nil -} - -func (s *state2) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { - return miner2.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, - smoothing2.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - sectorWeight), nil -} - -func (s *state2) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/reward/v3.go b/pkg/types/specactors/builtin/reward/v3.go deleted file mode 100644 index 8c425298d9..0000000000 --- a/pkg/types/specactors/builtin/reward/v3.go +++ /dev/null @@ -1,100 +0,0 @@ -// FETCHED FROM LOTUS: builtin/reward/state.go.template - -package reward - -import ( - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" - reward3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/reward" - smoothing3 "github.com/filecoin-project/specs-actors/v3/actors/util/smoothing" -) - -var _ State = (*state3)(nil) - -func load3(store adt.Store, root cid.Cid) (State, error) { - out := state3{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make3(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { - out := state3{store: store} - out.State = *reward3.ConstructState(currRealizedPower) - return &out, nil -} - -type state3 struct { - reward3.State - store adt.Store -} - -func (s *state3) ThisEpochReward() (abi.TokenAmount, error) { - return s.State.ThisEpochReward, nil -} - -func (s *state3) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - - return builtin.FilterEstimate{ - PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, - VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, - }, nil - -} - -func (s *state3) ThisEpochBaselinePower() (abi.StoragePower, error) { - return s.State.ThisEpochBaselinePower, nil -} - -func (s *state3) TotalStoragePowerReward() (abi.TokenAmount, error) { - return s.State.TotalStoragePowerReward, nil -} - -func (s *state3) EffectiveBaselinePower() (abi.StoragePower, error) { - return s.State.EffectiveBaselinePower, nil -} - -func (s *state3) EffectiveNetworkTime() (abi.ChainEpoch, error) { - return s.State.EffectiveNetworkTime, nil -} - -func (s *state3) CumsumBaseline() (reward3.Spacetime, error) { - return s.State.CumsumBaseline, nil -} - -func (s *state3) CumsumRealized() (reward3.Spacetime, error) { - return s.State.CumsumRealized, nil -} - -func (s *state3) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { - return miner3.InitialPledgeForPower( - qaPower, - s.State.ThisEpochBaselinePower, - s.State.ThisEpochRewardSmoothed, - smoothing3.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - circSupply, - ), nil -} - -func (s *state3) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { - return miner3.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, - smoothing3.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - sectorWeight), nil -} - -func (s *state3) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/reward/v4.go b/pkg/types/specactors/builtin/reward/v4.go deleted file mode 100644 index b99eced828..0000000000 --- a/pkg/types/specactors/builtin/reward/v4.go +++ /dev/null @@ -1,100 +0,0 @@ -// FETCHED FROM LOTUS: builtin/reward/state.go.template - -package reward - -import ( - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" - reward4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/reward" - smoothing4 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing" -) - -var _ State = (*state4)(nil) - -func load4(store adt.Store, root cid.Cid) (State, error) { - out := state4{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make4(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { - out := state4{store: store} - out.State = *reward4.ConstructState(currRealizedPower) - return &out, nil -} - -type state4 struct { - reward4.State - store adt.Store -} - -func (s *state4) ThisEpochReward() (abi.TokenAmount, error) { - return s.State.ThisEpochReward, nil -} - -func (s *state4) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - - return builtin.FilterEstimate{ - PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, - VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, - }, nil - -} - -func (s *state4) ThisEpochBaselinePower() (abi.StoragePower, error) { - return s.State.ThisEpochBaselinePower, nil -} - -func (s *state4) TotalStoragePowerReward() (abi.TokenAmount, error) { - return s.State.TotalStoragePowerReward, nil -} - -func (s *state4) EffectiveBaselinePower() (abi.StoragePower, error) { - return s.State.EffectiveBaselinePower, nil -} - -func (s *state4) EffectiveNetworkTime() (abi.ChainEpoch, error) { - return s.State.EffectiveNetworkTime, nil -} - -func (s *state4) CumsumBaseline() (reward4.Spacetime, error) { - return s.State.CumsumBaseline, nil -} - -func (s *state4) CumsumRealized() (reward4.Spacetime, error) { - return s.State.CumsumRealized, nil -} - -func (s *state4) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { - return miner4.InitialPledgeForPower( - qaPower, - s.State.ThisEpochBaselinePower, - s.State.ThisEpochRewardSmoothed, - smoothing4.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - circSupply, - ), nil -} - -func (s *state4) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { - return miner4.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, - smoothing4.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - sectorWeight), nil -} - -func (s *state4) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/reward/v5.go b/pkg/types/specactors/builtin/reward/v5.go deleted file mode 100644 index 2b34f00f6f..0000000000 --- a/pkg/types/specactors/builtin/reward/v5.go +++ /dev/null @@ -1,100 +0,0 @@ -// FETCHED FROM LOTUS: builtin/reward/state.go.template - -package reward - -import ( - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" - reward5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/reward" - smoothing5 "github.com/filecoin-project/specs-actors/v5/actors/util/smoothing" -) - -var _ State = (*state5)(nil) - -func load5(store adt.Store, root cid.Cid) (State, error) { - out := state5{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make5(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { - out := state5{store: store} - out.State = *reward5.ConstructState(currRealizedPower) - return &out, nil -} - -type state5 struct { - reward5.State - store adt.Store -} - -func (s *state5) ThisEpochReward() (abi.TokenAmount, error) { - return s.State.ThisEpochReward, nil -} - -func (s *state5) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - - return builtin.FilterEstimate{ - PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, - VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, - }, nil - -} - -func (s *state5) ThisEpochBaselinePower() (abi.StoragePower, error) { - return s.State.ThisEpochBaselinePower, nil -} - -func (s *state5) TotalStoragePowerReward() (abi.TokenAmount, error) { - return s.State.TotalStoragePowerReward, nil -} - -func (s *state5) EffectiveBaselinePower() (abi.StoragePower, error) { - return s.State.EffectiveBaselinePower, nil -} - -func (s *state5) EffectiveNetworkTime() (abi.ChainEpoch, error) { - return s.State.EffectiveNetworkTime, nil -} - -func (s *state5) CumsumBaseline() (reward5.Spacetime, error) { - return s.State.CumsumBaseline, nil -} - -func (s *state5) CumsumRealized() (reward5.Spacetime, error) { - return s.State.CumsumRealized, nil -} - -func (s *state5) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { - return miner5.InitialPledgeForPower( - qaPower, - s.State.ThisEpochBaselinePower, - s.State.ThisEpochRewardSmoothed, - smoothing5.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - circSupply, - ), nil -} - -func (s *state5) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { - return miner5.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, - smoothing5.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - sectorWeight), nil -} - -func (s *state5) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/reward/v6.go b/pkg/types/specactors/builtin/reward/v6.go deleted file mode 100644 index eabfc68a34..0000000000 --- a/pkg/types/specactors/builtin/reward/v6.go +++ /dev/null @@ -1,100 +0,0 @@ -// FETCHED FROM LOTUS: builtin/reward/state.go.template - -package reward - -import ( - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" - reward6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/reward" - smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" -) - -var _ State = (*state6)(nil) - -func load6(store adt.Store, root cid.Cid) (State, error) { - out := state6{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make6(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { - out := state6{store: store} - out.State = *reward6.ConstructState(currRealizedPower) - return &out, nil -} - -type state6 struct { - reward6.State - store adt.Store -} - -func (s *state6) ThisEpochReward() (abi.TokenAmount, error) { - return s.State.ThisEpochReward, nil -} - -func (s *state6) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - - return builtin.FilterEstimate{ - PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, - VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, - }, nil - -} - -func (s *state6) ThisEpochBaselinePower() (abi.StoragePower, error) { - return s.State.ThisEpochBaselinePower, nil -} - -func (s *state6) TotalStoragePowerReward() (abi.TokenAmount, error) { - return s.State.TotalStoragePowerReward, nil -} - -func (s *state6) EffectiveBaselinePower() (abi.StoragePower, error) { - return s.State.EffectiveBaselinePower, nil -} - -func (s *state6) EffectiveNetworkTime() (abi.ChainEpoch, error) { - return s.State.EffectiveNetworkTime, nil -} - -func (s *state6) CumsumBaseline() (reward6.Spacetime, error) { - return s.State.CumsumBaseline, nil -} - -func (s *state6) CumsumRealized() (reward6.Spacetime, error) { - return s.State.CumsumRealized, nil -} - -func (s *state6) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { - return miner6.InitialPledgeForPower( - qaPower, - s.State.ThisEpochBaselinePower, - s.State.ThisEpochRewardSmoothed, - smoothing6.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - circSupply, - ), nil -} - -func (s *state6) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { - return miner6.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, - smoothing6.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - sectorWeight), nil -} - -func (s *state6) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/reward/v7.go b/pkg/types/specactors/builtin/reward/v7.go deleted file mode 100644 index 82472f26de..0000000000 --- a/pkg/types/specactors/builtin/reward/v7.go +++ /dev/null @@ -1,100 +0,0 @@ -// FETCHED FROM LOTUS: builtin/reward/state.go.template - -package reward - -import ( - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - - miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" - reward7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/reward" - smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" -) - -var _ State = (*state7)(nil) - -func load7(store adt.Store, root cid.Cid) (State, error) { - out := state7{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make7(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { - out := state7{store: store} - out.State = *reward7.ConstructState(currRealizedPower) - return &out, nil -} - -type state7 struct { - reward7.State - store adt.Store -} - -func (s *state7) ThisEpochReward() (abi.TokenAmount, error) { - return s.State.ThisEpochReward, nil -} - -func (s *state7) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - - return builtin.FilterEstimate{ - PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, - VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, - }, nil - -} - -func (s *state7) ThisEpochBaselinePower() (abi.StoragePower, error) { - return s.State.ThisEpochBaselinePower, nil -} - -func (s *state7) TotalStoragePowerReward() (abi.TokenAmount, error) { - return s.State.TotalStoragePowerReward, nil -} - -func (s *state7) EffectiveBaselinePower() (abi.StoragePower, error) { - return s.State.EffectiveBaselinePower, nil -} - -func (s *state7) EffectiveNetworkTime() (abi.ChainEpoch, error) { - return s.State.EffectiveNetworkTime, nil -} - -func (s *state7) CumsumBaseline() (reward7.Spacetime, error) { - return s.State.CumsumBaseline, nil -} - -func (s *state7) CumsumRealized() (reward7.Spacetime, error) { - return s.State.CumsumRealized, nil -} - -func (s *state7) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { - return miner7.InitialPledgeForPower( - qaPower, - s.State.ThisEpochBaselinePower, - s.State.ThisEpochRewardSmoothed, - smoothing7.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - circSupply, - ), nil -} - -func (s *state7) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { - return miner7.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, - smoothing7.FilterEstimate{ - PositionEstimate: networkQAPower.PositionEstimate, - VelocityEstimate: networkQAPower.VelocityEstimate, - }, - sectorWeight), nil -} - -func (s *state7) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/system/actor.go.template b/pkg/types/specactors/builtin/system/actor.go.template deleted file mode 100644 index 14c30b0075..0000000000 --- a/pkg/types/specactors/builtin/system/actor.go.template +++ /dev/null @@ -1,43 +0,0 @@ -// FETCHED FROM LOTUS: builtin/system/actor.go.template - -package system - -import ( - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "golang.org/x/xerrors" - "github.com/ipfs/go-cid" - -{{range .versions}} - builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" -{{end}} -) - -var ( - Address = builtin{{.latestVersion}}.SystemActorAddr -) - -func MakeState(store adt.Store, av actors.Version) (State, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return make{{.}}(store) -{{end}} -} - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return builtin{{.}}.SystemActorCodeID, nil -{{end}} - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - GetState() interface{} -} diff --git a/pkg/types/specactors/builtin/system/state.go.template b/pkg/types/specactors/builtin/system/state.go.template deleted file mode 100644 index a02a7e939b..0000000000 --- a/pkg/types/specactors/builtin/system/state.go.template +++ /dev/null @@ -1,37 +0,0 @@ -// FETCHED FROM LOTUS: builtin/system/state.go.template - -package system - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - system{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/system" -) - -var _ State = (*state{{.v}})(nil) - -func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { - out := state{{.v}}{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make{{.v}}(store adt.Store) (State, error) { - out := state{{.v}}{store: store} - out.State = system{{.v}}.State{} - return &out, nil -} - -type state{{.v}} struct { - system{{.v}}.State - store adt.Store -} - -func (s *state{{.v}}) GetState() interface{} { - return &s.State -} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/system/system.go b/pkg/types/specactors/builtin/system/system.go deleted file mode 100644 index cd45b3208a..0000000000 --- a/pkg/types/specactors/builtin/system/system.go +++ /dev/null @@ -1,89 +0,0 @@ -// FETCHED FROM LOTUS: builtin/system/actor.go.template - -package system - -import ( - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/ipfs/go-cid" - "golang.org/x/xerrors" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" -) - -var ( - Address = builtin7.SystemActorAddr -) - -func MakeState(store adt.Store, av actors.Version) (State, error) { - switch av { - - case actors.Version0: - return make0(store) - - case actors.Version2: - return make2(store) - - case actors.Version3: - return make3(store) - - case actors.Version4: - return make4(store) - - case actors.Version5: - return make5(store) - - case actors.Version6: - return make6(store) - - case actors.Version7: - return make7(store) - - } - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { - - case actors.Version0: - return builtin0.SystemActorCodeID, nil - - case actors.Version2: - return builtin2.SystemActorCodeID, nil - - case actors.Version3: - return builtin3.SystemActorCodeID, nil - - case actors.Version4: - return builtin4.SystemActorCodeID, nil - - case actors.Version5: - return builtin5.SystemActorCodeID, nil - - case actors.Version6: - return builtin6.SystemActorCodeID, nil - - case actors.Version7: - return builtin7.SystemActorCodeID, nil - - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - GetState() interface{} -} diff --git a/pkg/types/specactors/builtin/system/v0.go b/pkg/types/specactors/builtin/system/v0.go deleted file mode 100644 index 97cd14ce86..0000000000 --- a/pkg/types/specactors/builtin/system/v0.go +++ /dev/null @@ -1,37 +0,0 @@ -// FETCHED FROM LOTUS: builtin/system/state.go.template - -package system - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - system0 "github.com/filecoin-project/specs-actors/actors/builtin/system" -) - -var _ State = (*state0)(nil) - -func load0(store adt.Store, root cid.Cid) (State, error) { - out := state0{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make0(store adt.Store) (State, error) { - out := state0{store: store} - out.State = system0.State{} - return &out, nil -} - -type state0 struct { - system0.State - store adt.Store -} - -func (s *state0) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/system/v2.go b/pkg/types/specactors/builtin/system/v2.go deleted file mode 100644 index 9d5babb37e..0000000000 --- a/pkg/types/specactors/builtin/system/v2.go +++ /dev/null @@ -1,37 +0,0 @@ -// FETCHED FROM LOTUS: builtin/system/state.go.template - -package system - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - system2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/system" -) - -var _ State = (*state2)(nil) - -func load2(store adt.Store, root cid.Cid) (State, error) { - out := state2{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make2(store adt.Store) (State, error) { - out := state2{store: store} - out.State = system2.State{} - return &out, nil -} - -type state2 struct { - system2.State - store adt.Store -} - -func (s *state2) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/system/v3.go b/pkg/types/specactors/builtin/system/v3.go deleted file mode 100644 index 931356e906..0000000000 --- a/pkg/types/specactors/builtin/system/v3.go +++ /dev/null @@ -1,37 +0,0 @@ -// FETCHED FROM LOTUS: builtin/system/state.go.template - -package system - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - system3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/system" -) - -var _ State = (*state3)(nil) - -func load3(store adt.Store, root cid.Cid) (State, error) { - out := state3{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make3(store adt.Store) (State, error) { - out := state3{store: store} - out.State = system3.State{} - return &out, nil -} - -type state3 struct { - system3.State - store adt.Store -} - -func (s *state3) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/system/v4.go b/pkg/types/specactors/builtin/system/v4.go deleted file mode 100644 index 0a7b547536..0000000000 --- a/pkg/types/specactors/builtin/system/v4.go +++ /dev/null @@ -1,37 +0,0 @@ -// FETCHED FROM LOTUS: builtin/system/state.go.template - -package system - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - system4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/system" -) - -var _ State = (*state4)(nil) - -func load4(store adt.Store, root cid.Cid) (State, error) { - out := state4{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make4(store adt.Store) (State, error) { - out := state4{store: store} - out.State = system4.State{} - return &out, nil -} - -type state4 struct { - system4.State - store adt.Store -} - -func (s *state4) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/system/v5.go b/pkg/types/specactors/builtin/system/v5.go deleted file mode 100644 index dce044cc27..0000000000 --- a/pkg/types/specactors/builtin/system/v5.go +++ /dev/null @@ -1,37 +0,0 @@ -// FETCHED FROM LOTUS: builtin/system/state.go.template - -package system - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - system5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/system" -) - -var _ State = (*state5)(nil) - -func load5(store adt.Store, root cid.Cid) (State, error) { - out := state5{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make5(store adt.Store) (State, error) { - out := state5{store: store} - out.State = system5.State{} - return &out, nil -} - -type state5 struct { - system5.State - store adt.Store -} - -func (s *state5) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/system/v6.go b/pkg/types/specactors/builtin/system/v6.go deleted file mode 100644 index 82bdc3e47b..0000000000 --- a/pkg/types/specactors/builtin/system/v6.go +++ /dev/null @@ -1,37 +0,0 @@ -// FETCHED FROM LOTUS: builtin/system/state.go.template - -package system - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - system6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/system" -) - -var _ State = (*state6)(nil) - -func load6(store adt.Store, root cid.Cid) (State, error) { - out := state6{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make6(store adt.Store) (State, error) { - out := state6{store: store} - out.State = system6.State{} - return &out, nil -} - -type state6 struct { - system6.State - store adt.Store -} - -func (s *state6) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/system/v7.go b/pkg/types/specactors/builtin/system/v7.go deleted file mode 100644 index 9e3bd9b486..0000000000 --- a/pkg/types/specactors/builtin/system/v7.go +++ /dev/null @@ -1,37 +0,0 @@ -// FETCHED FROM LOTUS: builtin/system/state.go.template - -package system - -import ( - "github.com/ipfs/go-cid" - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - system7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/system" -) - -var _ State = (*state7)(nil) - -func load7(store adt.Store, root cid.Cid) (State, error) { - out := state7{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make7(store adt.Store) (State, error) { - out := state7{store: store} - out.State = system7.State{} - return &out, nil -} - -type state7 struct { - system7.State - store adt.Store -} - -func (s *state7) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/verifreg/actor.go.template b/pkg/types/specactors/builtin/verifreg/actor.go.template deleted file mode 100644 index 2112fad3ee..0000000000 --- a/pkg/types/specactors/builtin/verifreg/actor.go.template +++ /dev/null @@ -1,77 +0,0 @@ -// FETCHED FROM LOTUS: builtin/verifreg/actor.go.template - -package verifreg - -import ( - "github.com/ipfs/go-cid" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - "github.com/filecoin-project/go-state-types/cbor" -{{range .versions}} - builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" -{{end}} - - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - types "github.com/filecoin-project/venus/pkg/types/internal" -) - -func init() { -{{range .versions}} - builtin.RegisterActorState(builtin{{.}}.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) -{{end}} -} - -var ( - Address = builtin{{.latestVersion}}.VerifiedRegistryActorAddr - Methods = builtin{{.latestVersion}}.MethodsVerifiedRegistry -) - -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { -{{range .versions}} - case builtin{{.}}.VerifiedRegistryActorCodeID: - return load{{.}}(store, act.Head) -{{end}} - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Address) (State, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return make{{.}}(store, rootKeyAddress) -{{end}} -} - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { -{{range .versions}} - case actors.Version{{.}}: - return builtin{{.}}.VerifiedRegistryActorCodeID, nil -{{end}} - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - - -type State interface { - cbor.Marshaler - - RootKey() (address.Address, error) - VerifiedClientDataCap(address.Address) (bool, abi.StoragePower, error) - VerifierDataCap(address.Address) (bool, abi.StoragePower, error) - ForEachVerifier(func(addr address.Address, dcap abi.StoragePower) error) error - ForEachClient(func(addr address.Address, dcap abi.StoragePower) error) error - GetState() interface{} -} diff --git a/pkg/types/specactors/builtin/verifreg/state.go.template b/pkg/types/specactors/builtin/verifreg/state.go.template deleted file mode 100644 index 507b8530bc..0000000000 --- a/pkg/types/specactors/builtin/verifreg/state.go.template +++ /dev/null @@ -1,84 +0,0 @@ -// FETCHED FROM LOTUS: builtin/verifreg/state.go.template - -package verifreg - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - -{{if (ge .v 3)}} builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" -{{end}} verifreg{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/verifreg" - adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt" -) - -var _ State = (*state{{.v}})(nil) - -func load{{.v}}(store adt.Store, root cid.Cid) (State, error) { - out := state{{.v}}{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make{{.v}}(store adt.Store, rootKeyAddress address.Address) (State, error) { - out := state{{.v}}{store: store} - {{if (le .v 2)}} - em, err := adt{{.v}}.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *verifreg{{.v}}.ConstructState(em, rootKeyAddress) - {{else}} - s, err := verifreg{{.v}}.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - {{end}} - return &out, nil -} - -type state{{.v}} struct { - verifreg{{.v}}.State - store adt.Store -} - -func (s *state{{.v}}) RootKey() (address.Address, error) { - return s.State.RootKey, nil -} - -func (s *state{{.v}}) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, actors.Version{{.v}}, s.verifiedClients, addr) -} - -func (s *state{{.v}}) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, actors.Version{{.v}}, s.verifiers, addr) -} - -func (s *state{{.v}}) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, actors.Version{{.v}}, s.verifiers, cb) -} - -func (s *state{{.v}}) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, actors.Version{{.v}}, s.verifiedClients, cb) -} - -func (s *state{{.v}}) verifiedClients() (adt.Map, error) { - return adt{{.v}}.AsMap(s.store, s.VerifiedClients{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) -} - -func (s *state{{.v}}) verifiers() (adt.Map, error) { - return adt{{.v}}.AsMap(s.store, s.Verifiers{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}}) -} - -func (s *state{{.v}}) GetState() interface{} { - return &s.State -} \ No newline at end of file diff --git a/pkg/types/specactors/builtin/verifreg/util.go b/pkg/types/specactors/builtin/verifreg/util.go deleted file mode 100644 index 6cd78fac24..0000000000 --- a/pkg/types/specactors/builtin/verifreg/util.go +++ /dev/null @@ -1,54 +0,0 @@ -package verifreg - -import ( - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/big" - - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" -) - -// taking this as a function instead of asking the caller to call it helps reduce some of the error -// checking boilerplate. -// -// "go made me do it" -type rootFunc func() (adt.Map, error) - -// Assumes that the bitwidth for v3 HAMTs is the DefaultHamtBitwidth -func getDataCap(store adt.Store, ver actors.Version, root rootFunc, addr address.Address) (bool, abi.StoragePower, error) { - if addr.Protocol() != address.ID { - return false, big.Zero(), xerrors.Errorf("can only look up ID addresses") - } - vh, err := root() - if err != nil { - return false, big.Zero(), xerrors.Errorf("loading verifreg: %w", err) - } - - var dcap abi.StoragePower - if found, err := vh.Get(abi.AddrKey(addr), &dcap); err != nil { - return false, big.Zero(), xerrors.Errorf("looking up addr: %w", err) - } else if !found { - return false, big.Zero(), nil - } - - return true, dcap, nil -} - -// Assumes that the bitwidth for v3 HAMTs is the DefaultHamtBitwidth -func forEachCap(store adt.Store, ver actors.Version, root rootFunc, cb func(addr address.Address, dcap abi.StoragePower) error) error { - vh, err := root() - if err != nil { - return xerrors.Errorf("loading verified clients: %w", err) - } - var dcap abi.StoragePower - return vh.ForEach(&dcap, func(key string) error { - a, err := address.NewFromBytes([]byte(key)) - if err != nil { - return err - } - return cb(a, dcap) - }) -} diff --git a/pkg/types/specactors/builtin/verifreg/v0.go b/pkg/types/specactors/builtin/verifreg/v0.go deleted file mode 100644 index 02eb2e618c..0000000000 --- a/pkg/types/specactors/builtin/verifreg/v0.go +++ /dev/null @@ -1,76 +0,0 @@ -// FETCHED FROM LOTUS: builtin/verifreg/state.go.template - -package verifreg - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" - adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" -) - -var _ State = (*state0)(nil) - -func load0(store adt.Store, root cid.Cid) (State, error) { - out := state0{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make0(store adt.Store, rootKeyAddress address.Address) (State, error) { - out := state0{store: store} - - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *verifreg0.ConstructState(em, rootKeyAddress) - - return &out, nil -} - -type state0 struct { - verifreg0.State - store adt.Store -} - -func (s *state0) RootKey() (address.Address, error) { - return s.State.RootKey, nil -} - -func (s *state0) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, actors.Version0, s.verifiedClients, addr) -} - -func (s *state0) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, actors.Version0, s.verifiers, addr) -} - -func (s *state0) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, actors.Version0, s.verifiers, cb) -} - -func (s *state0) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, actors.Version0, s.verifiedClients, cb) -} - -func (s *state0) verifiedClients() (adt.Map, error) { - return adt0.AsMap(s.store, s.VerifiedClients) -} - -func (s *state0) verifiers() (adt.Map, error) { - return adt0.AsMap(s.store, s.Verifiers) -} - -func (s *state0) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/verifreg/v2.go b/pkg/types/specactors/builtin/verifreg/v2.go deleted file mode 100644 index d3c85f8e87..0000000000 --- a/pkg/types/specactors/builtin/verifreg/v2.go +++ /dev/null @@ -1,76 +0,0 @@ -// FETCHED FROM LOTUS: builtin/verifreg/state.go.template - -package verifreg - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" - adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" -) - -var _ State = (*state2)(nil) - -func load2(store adt.Store, root cid.Cid) (State, error) { - out := state2{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make2(store adt.Store, rootKeyAddress address.Address) (State, error) { - out := state2{store: store} - - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *verifreg2.ConstructState(em, rootKeyAddress) - - return &out, nil -} - -type state2 struct { - verifreg2.State - store adt.Store -} - -func (s *state2) RootKey() (address.Address, error) { - return s.State.RootKey, nil -} - -func (s *state2) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, actors.Version2, s.verifiedClients, addr) -} - -func (s *state2) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, actors.Version2, s.verifiers, addr) -} - -func (s *state2) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, actors.Version2, s.verifiers, cb) -} - -func (s *state2) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, actors.Version2, s.verifiedClients, cb) -} - -func (s *state2) verifiedClients() (adt.Map, error) { - return adt2.AsMap(s.store, s.VerifiedClients) -} - -func (s *state2) verifiers() (adt.Map, error) { - return adt2.AsMap(s.store, s.Verifiers) -} - -func (s *state2) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/verifreg/v3.go b/pkg/types/specactors/builtin/verifreg/v3.go deleted file mode 100644 index b1707382d4..0000000000 --- a/pkg/types/specactors/builtin/verifreg/v3.go +++ /dev/null @@ -1,77 +0,0 @@ -// FETCHED FROM LOTUS: builtin/verifreg/state.go.template - -package verifreg - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - verifreg3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/verifreg" - adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" -) - -var _ State = (*state3)(nil) - -func load3(store adt.Store, root cid.Cid) (State, error) { - out := state3{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make3(store adt.Store, rootKeyAddress address.Address) (State, error) { - out := state3{store: store} - - s, err := verifreg3.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state3 struct { - verifreg3.State - store adt.Store -} - -func (s *state3) RootKey() (address.Address, error) { - return s.State.RootKey, nil -} - -func (s *state3) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, actors.Version3, s.verifiedClients, addr) -} - -func (s *state3) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, actors.Version3, s.verifiers, addr) -} - -func (s *state3) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, actors.Version3, s.verifiers, cb) -} - -func (s *state3) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, actors.Version3, s.verifiedClients, cb) -} - -func (s *state3) verifiedClients() (adt.Map, error) { - return adt3.AsMap(s.store, s.VerifiedClients, builtin3.DefaultHamtBitwidth) -} - -func (s *state3) verifiers() (adt.Map, error) { - return adt3.AsMap(s.store, s.Verifiers, builtin3.DefaultHamtBitwidth) -} - -func (s *state3) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/verifreg/v4.go b/pkg/types/specactors/builtin/verifreg/v4.go deleted file mode 100644 index c2baedce48..0000000000 --- a/pkg/types/specactors/builtin/verifreg/v4.go +++ /dev/null @@ -1,77 +0,0 @@ -// FETCHED FROM LOTUS: builtin/verifreg/state.go.template - -package verifreg - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" - adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" -) - -var _ State = (*state4)(nil) - -func load4(store adt.Store, root cid.Cid) (State, error) { - out := state4{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make4(store adt.Store, rootKeyAddress address.Address) (State, error) { - out := state4{store: store} - - s, err := verifreg4.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state4 struct { - verifreg4.State - store adt.Store -} - -func (s *state4) RootKey() (address.Address, error) { - return s.State.RootKey, nil -} - -func (s *state4) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, actors.Version4, s.verifiedClients, addr) -} - -func (s *state4) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, actors.Version4, s.verifiers, addr) -} - -func (s *state4) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, actors.Version4, s.verifiers, cb) -} - -func (s *state4) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, actors.Version4, s.verifiedClients, cb) -} - -func (s *state4) verifiedClients() (adt.Map, error) { - return adt4.AsMap(s.store, s.VerifiedClients, builtin4.DefaultHamtBitwidth) -} - -func (s *state4) verifiers() (adt.Map, error) { - return adt4.AsMap(s.store, s.Verifiers, builtin4.DefaultHamtBitwidth) -} - -func (s *state4) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/verifreg/v5.go b/pkg/types/specactors/builtin/verifreg/v5.go deleted file mode 100644 index fd2e4c3067..0000000000 --- a/pkg/types/specactors/builtin/verifreg/v5.go +++ /dev/null @@ -1,77 +0,0 @@ -// FETCHED FROM LOTUS: builtin/verifreg/state.go.template - -package verifreg - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - verifreg5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/verifreg" - adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" -) - -var _ State = (*state5)(nil) - -func load5(store adt.Store, root cid.Cid) (State, error) { - out := state5{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make5(store adt.Store, rootKeyAddress address.Address) (State, error) { - out := state5{store: store} - - s, err := verifreg5.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state5 struct { - verifreg5.State - store adt.Store -} - -func (s *state5) RootKey() (address.Address, error) { - return s.State.RootKey, nil -} - -func (s *state5) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, actors.Version5, s.verifiedClients, addr) -} - -func (s *state5) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, actors.Version5, s.verifiers, addr) -} - -func (s *state5) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, actors.Version5, s.verifiers, cb) -} - -func (s *state5) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, actors.Version5, s.verifiedClients, cb) -} - -func (s *state5) verifiedClients() (adt.Map, error) { - return adt5.AsMap(s.store, s.VerifiedClients, builtin5.DefaultHamtBitwidth) -} - -func (s *state5) verifiers() (adt.Map, error) { - return adt5.AsMap(s.store, s.Verifiers, builtin5.DefaultHamtBitwidth) -} - -func (s *state5) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/verifreg/v6.go b/pkg/types/specactors/builtin/verifreg/v6.go deleted file mode 100644 index 66af78bbf5..0000000000 --- a/pkg/types/specactors/builtin/verifreg/v6.go +++ /dev/null @@ -1,77 +0,0 @@ -// FETCHED FROM LOTUS: builtin/verifreg/state.go.template - -package verifreg - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" - adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" -) - -var _ State = (*state6)(nil) - -func load6(store adt.Store, root cid.Cid) (State, error) { - out := state6{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make6(store adt.Store, rootKeyAddress address.Address) (State, error) { - out := state6{store: store} - - s, err := verifreg6.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state6 struct { - verifreg6.State - store adt.Store -} - -func (s *state6) RootKey() (address.Address, error) { - return s.State.RootKey, nil -} - -func (s *state6) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, actors.Version6, s.verifiedClients, addr) -} - -func (s *state6) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, actors.Version6, s.verifiers, addr) -} - -func (s *state6) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, actors.Version6, s.verifiers, cb) -} - -func (s *state6) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, actors.Version6, s.verifiedClients, cb) -} - -func (s *state6) verifiedClients() (adt.Map, error) { - return adt6.AsMap(s.store, s.VerifiedClients, builtin6.DefaultHamtBitwidth) -} - -func (s *state6) verifiers() (adt.Map, error) { - return adt6.AsMap(s.store, s.Verifiers, builtin6.DefaultHamtBitwidth) -} - -func (s *state6) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/verifreg/v7.go b/pkg/types/specactors/builtin/verifreg/v7.go deleted file mode 100644 index aeec739181..0000000000 --- a/pkg/types/specactors/builtin/verifreg/v7.go +++ /dev/null @@ -1,77 +0,0 @@ -// FETCHED FROM LOTUS: builtin/verifreg/state.go.template - -package verifreg - -import ( - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - "github.com/ipfs/go-cid" - - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" - adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" -) - -var _ State = (*state7)(nil) - -func load7(store adt.Store, root cid.Cid) (State, error) { - out := state7{store: store} - err := store.Get(store.Context(), root, &out) - if err != nil { - return nil, err - } - return &out, nil -} - -func make7(store adt.Store, rootKeyAddress address.Address) (State, error) { - out := state7{store: store} - - s, err := verifreg7.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - - return &out, nil -} - -type state7 struct { - verifreg7.State - store adt.Store -} - -func (s *state7) RootKey() (address.Address, error) { - return s.State.RootKey, nil -} - -func (s *state7) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, actors.Version7, s.verifiedClients, addr) -} - -func (s *state7) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { - return getDataCap(s.store, actors.Version7, s.verifiers, addr) -} - -func (s *state7) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, actors.Version7, s.verifiers, cb) -} - -func (s *state7) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { - return forEachCap(s.store, actors.Version7, s.verifiedClients, cb) -} - -func (s *state7) verifiedClients() (adt.Map, error) { - return adt7.AsMap(s.store, s.VerifiedClients, builtin7.DefaultHamtBitwidth) -} - -func (s *state7) verifiers() (adt.Map, error) { - return adt7.AsMap(s.store, s.Verifiers, builtin7.DefaultHamtBitwidth) -} - -func (s *state7) GetState() interface{} { - return &s.State -} diff --git a/pkg/types/specactors/builtin/verifreg/verifreg.go b/pkg/types/specactors/builtin/verifreg/verifreg.go deleted file mode 100644 index acb2664f61..0000000000 --- a/pkg/types/specactors/builtin/verifreg/verifreg.go +++ /dev/null @@ -1,165 +0,0 @@ -// FETCHED FROM LOTUS: builtin/verifreg/actor.go.template - -package verifreg - -import ( - "github.com/ipfs/go-cid" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - - "github.com/filecoin-project/go-state-types/cbor" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - - types "github.com/filecoin-project/venus/pkg/types/internal" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - "github.com/filecoin-project/venus/pkg/types/specactors/adt" - "github.com/filecoin-project/venus/pkg/types/specactors/builtin" -) - -func init() { - - builtin.RegisterActorState(builtin0.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - - builtin.RegisterActorState(builtin2.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - - builtin.RegisterActorState(builtin3.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - - builtin.RegisterActorState(builtin4.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - - builtin.RegisterActorState(builtin5.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - - builtin.RegisterActorState(builtin6.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - - builtin.RegisterActorState(builtin7.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) - -} - -var ( - Address = builtin7.VerifiedRegistryActorAddr - Methods = builtin7.MethodsVerifiedRegistry -) - -func Load(store adt.Store, act *types.Actor) (State, error) { - switch act.Code { - - case builtin0.VerifiedRegistryActorCodeID: - return load0(store, act.Head) - - case builtin2.VerifiedRegistryActorCodeID: - return load2(store, act.Head) - - case builtin3.VerifiedRegistryActorCodeID: - return load3(store, act.Head) - - case builtin4.VerifiedRegistryActorCodeID: - return load4(store, act.Head) - - case builtin5.VerifiedRegistryActorCodeID: - return load5(store, act.Head) - - case builtin6.VerifiedRegistryActorCodeID: - return load6(store, act.Head) - - case builtin7.VerifiedRegistryActorCodeID: - return load7(store, act.Head) - - } - return nil, xerrors.Errorf("unknown actor code %s", act.Code) -} - -func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Address) (State, error) { - switch av { - - case actors.Version0: - return make0(store, rootKeyAddress) - - case actors.Version2: - return make2(store, rootKeyAddress) - - case actors.Version3: - return make3(store, rootKeyAddress) - - case actors.Version4: - return make4(store, rootKeyAddress) - - case actors.Version5: - return make5(store, rootKeyAddress) - - case actors.Version6: - return make6(store, rootKeyAddress) - - case actors.Version7: - return make7(store, rootKeyAddress) - - } - return nil, xerrors.Errorf("unknown actor version %d", av) -} - -func GetActorCodeID(av actors.Version) (cid.Cid, error) { - switch av { - - case actors.Version0: - return builtin0.VerifiedRegistryActorCodeID, nil - - case actors.Version2: - return builtin2.VerifiedRegistryActorCodeID, nil - - case actors.Version3: - return builtin3.VerifiedRegistryActorCodeID, nil - - case actors.Version4: - return builtin4.VerifiedRegistryActorCodeID, nil - - case actors.Version5: - return builtin5.VerifiedRegistryActorCodeID, nil - - case actors.Version6: - return builtin6.VerifiedRegistryActorCodeID, nil - - case actors.Version7: - return builtin7.VerifiedRegistryActorCodeID, nil - - } - - return cid.Undef, xerrors.Errorf("unknown actor version %d", av) -} - -type State interface { - cbor.Marshaler - - RootKey() (address.Address, error) - VerifiedClientDataCap(address.Address) (bool, abi.StoragePower, error) - VerifierDataCap(address.Address) (bool, abi.StoragePower, error) - ForEachVerifier(func(addr address.Address, dcap abi.StoragePower) error) error - ForEachClient(func(addr address.Address, dcap abi.StoragePower) error) error - GetState() interface{} -} diff --git a/pkg/types/specactors/params.go b/pkg/types/specactors/params.go deleted file mode 100644 index f933ce33de..0000000000 --- a/pkg/types/specactors/params.go +++ /dev/null @@ -1,19 +0,0 @@ -package specactors - -import ( - "bytes" - - "github.com/filecoin-project/go-state-types/exitcode" - cbg "github.com/whyrusleeping/cbor-gen" - - "github.com/filecoin-project/venus/pkg/types/specactors/aerrors" -) - -func SerializeParams(i cbg.CBORMarshaler) ([]byte, aerrors.ActorError) { - buf := new(bytes.Buffer) - if err := i.MarshalCBOR(buf); err != nil { - // TODO: shouldnt this be a fatal error? - return nil, aerrors.Absorb(err, exitcode.ErrSerialization, "failed to encode parameter") - } - return buf.Bytes(), nil -} diff --git a/pkg/types/specactors/policy/policy.go b/pkg/types/specactors/policy/policy.go deleted file mode 100644 index ecc0e004a8..0000000000 --- a/pkg/types/specactors/policy/policy.go +++ /dev/null @@ -1,609 +0,0 @@ -// FETCHED FROM LOTUS: policy/policy.go.template - -package policy - -import ( - "sort" - - "github.com/filecoin-project/go-state-types/big" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - - market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" - miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" - power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" - verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" - miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" - verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" - miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" - verifreg3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/verifreg" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" - miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" - verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" - miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" - verifreg5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/verifreg" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" - miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" - verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" - miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" - verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" - - paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" -) - -const ( - ChainFinality = miner7.ChainFinality - SealRandomnessLookback = ChainFinality - PaychSettleDelay = paych7.SettleDelay - MaxPreCommitRandomnessLookback = builtin7.EpochsInDay + SealRandomnessLookback -) - -// SetSupportedProofTypes sets supported proof types, across all actor versions. -// This should only be used for testing. -func SetSupportedProofTypes(types ...abi.RegisteredSealProof) { - - miner0.SupportedProofTypes = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner2.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner2.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) - miner2.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner3.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner3.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) - miner3.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner4.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner4.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) - miner4.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner5.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner6.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner7.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - AddSupportedProofTypes(types...) -} - -// AddSupportedProofTypes sets supported proof types, across all actor versions. -// This should only be used for testing. -func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { - for _, t := range types { - if t >= abi.RegisteredSealProof_StackedDrg2KiBV1_1 { - panic("must specify v1 proof types only") - } - // Set for all miner versions. - - miner0.SupportedProofTypes[t] = struct{}{} - - miner2.PreCommitSealProofTypesV0[t] = struct{}{} - miner2.PreCommitSealProofTypesV7[t] = struct{}{} - miner2.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner2.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - - miner3.PreCommitSealProofTypesV0[t] = struct{}{} - miner3.PreCommitSealProofTypesV7[t] = struct{}{} - miner3.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner3.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - - miner4.PreCommitSealProofTypesV0[t] = struct{}{} - miner4.PreCommitSealProofTypesV7[t] = struct{}{} - miner4.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner4.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - - miner5.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err := t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } - - miner5.WindowPoStProofTypes[wpp] = struct{}{} - - miner6.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err = t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } - - miner6.WindowPoStProofTypes[wpp] = struct{}{} - - miner7.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err = t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } - - miner7.WindowPoStProofTypes[wpp] = struct{}{} - - } -} - -// SetPreCommitChallengeDelay sets the pre-commit challenge delay across all -// actors versions. Use for testing. -func SetPreCommitChallengeDelay(delay abi.ChainEpoch) { - // Set for all miner versions. - - miner0.PreCommitChallengeDelay = delay - - miner2.PreCommitChallengeDelay = delay - - miner3.PreCommitChallengeDelay = delay - - miner4.PreCommitChallengeDelay = delay - - miner5.PreCommitChallengeDelay = delay - - miner6.PreCommitChallengeDelay = delay - - miner7.PreCommitChallengeDelay = delay - -} - -// TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. -func GetPreCommitChallengeDelay() abi.ChainEpoch { - return miner7.PreCommitChallengeDelay -} - -// SetConsensusMinerMinPower sets the minimum power of an individual miner must -// meet for leader election, across all actor versions. This should only be used -// for testing. -func SetConsensusMinerMinPower(p abi.StoragePower) { - - power0.ConsensusMinerMinPower = p - - for _, policy := range builtin2.SealProofPolicies { - policy.ConsensusMinerMinPower = p - } - - for _, policy := range builtin3.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - for _, policy := range builtin4.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - for _, policy := range builtin5.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - for _, policy := range builtin6.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - for _, policy := range builtin7.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - -} - -// SetMinVerifiedDealSize sets the minimum size of a verified deal. This should -// only be used for testing. -func SetMinVerifiedDealSize(size abi.StoragePower) { - - verifreg0.MinVerifiedDealSize = size - - verifreg2.MinVerifiedDealSize = size - - verifreg3.MinVerifiedDealSize = size - - verifreg4.MinVerifiedDealSize = size - - verifreg5.MinVerifiedDealSize = size - - verifreg6.MinVerifiedDealSize = size - - verifreg7.MinVerifiedDealSize = size - -} - -func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { - switch ver { - - case actors.Version0: - - return miner0.MaxSealDuration[t], nil - - case actors.Version2: - - return miner2.MaxProveCommitDuration[t], nil - - case actors.Version3: - - return miner3.MaxProveCommitDuration[t], nil - - case actors.Version4: - - return miner4.MaxProveCommitDuration[t], nil - - case actors.Version5: - - return miner5.MaxProveCommitDuration[t], nil - - case actors.Version6: - - return miner6.MaxProveCommitDuration[t], nil - - case actors.Version7: - - return miner7.MaxProveCommitDuration[t], nil - - default: - return 0, xerrors.Errorf("unsupported actors version") - } -} - -// SetProviderCollateralSupplyTarget sets the percentage of normalized circulating -// supply that must be covered by provider collateral in a deal. This should -// only be used for testing. -func SetProviderCollateralSupplyTarget(num, denom big.Int) { - - market2.ProviderCollateralSupplyTarget = builtin2.BigFrac{ - Numerator: num, - Denominator: denom, - } - - market3.ProviderCollateralSupplyTarget = builtin3.BigFrac{ - Numerator: num, - Denominator: denom, - } - - market4.ProviderCollateralSupplyTarget = builtin4.BigFrac{ - Numerator: num, - Denominator: denom, - } - - market5.ProviderCollateralSupplyTarget = builtin5.BigFrac{ - Numerator: num, - Denominator: denom, - } - - market6.ProviderCollateralSupplyTarget = builtin6.BigFrac{ - Numerator: num, - Denominator: denom, - } - - market7.ProviderCollateralSupplyTarget = builtin7.BigFrac{ - Numerator: num, - Denominator: denom, - } - -} - -func DealProviderCollateralBounds( - size abi.PaddedPieceSize, verified bool, - rawBytePower, qaPower, baselinePower abi.StoragePower, - circulatingFil abi.TokenAmount, nwVer network.Version, -) (min, max abi.TokenAmount, err error) { - v, err := actors.VersionForNetwork(nwVer) - if err != nil { - return big.Zero(), big.Zero(), err - } - switch v { - - case actors.Version0: - - min, max := market0.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil, nwVer) - return min, max, nil - - case actors.Version2: - - min, max := market2.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - case actors.Version3: - - min, max := market3.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - case actors.Version4: - - min, max := market4.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - case actors.Version5: - - min, max := market5.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - case actors.Version6: - - min, max := market6.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - case actors.Version7: - - min, max := market7.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - default: - return big.Zero(), big.Zero(), xerrors.Errorf("unsupported actors version") - } -} - -func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) { - return market7.DealDurationBounds(pieceSize) -} - -// Sets the challenge window and scales the proving period to match (such that -// there are always 48 challenge windows in a proving period). -func SetWPoStChallengeWindow(period abi.ChainEpoch) { - - miner0.WPoStChallengeWindow = period - miner0.WPoStProvingPeriod = period * abi.ChainEpoch(miner0.WPoStPeriodDeadlines) - - miner2.WPoStChallengeWindow = period - miner2.WPoStProvingPeriod = period * abi.ChainEpoch(miner2.WPoStPeriodDeadlines) - - miner3.WPoStChallengeWindow = period - miner3.WPoStProvingPeriod = period * abi.ChainEpoch(miner3.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner3.WPoStDisputeWindow = period * 30 - - miner4.WPoStChallengeWindow = period - miner4.WPoStProvingPeriod = period * abi.ChainEpoch(miner4.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner4.WPoStDisputeWindow = period * 30 - - miner5.WPoStChallengeWindow = period - miner5.WPoStProvingPeriod = period * abi.ChainEpoch(miner5.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner5.WPoStDisputeWindow = period * 30 - - miner6.WPoStChallengeWindow = period - miner6.WPoStProvingPeriod = period * abi.ChainEpoch(miner6.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner6.WPoStDisputeWindow = period * 30 - - miner7.WPoStChallengeWindow = period - miner7.WPoStProvingPeriod = period * abi.ChainEpoch(miner7.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner7.WPoStDisputeWindow = period * 30 - -} - -func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { - if nwVer <= network.Version3 { - return 10 - } - - // NOTE: if this ever changes, adjust it in a (*Miner).mineOne() logline as well - return ChainFinality -} - -func GetMaxSectorExpirationExtension() abi.ChainEpoch { - return miner7.MaxSectorExpirationExtension -} - -func GetMinSectorExpiration() abi.ChainEpoch { - return miner7.MinSectorExpiration -} - -func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, error) { - sectorsPerPart, err := builtin7.PoStProofWindowPoStPartitionSectors(p) - if err != nil { - return 0, err - } - maxSectors, err := GetAddressedSectorsMax(nv) - if err != nil { - return 0, err - } - return int(uint64(maxSectors) / sectorsPerPart), nil -} - -func GetDefaultSectorSize() abi.SectorSize { - // supported sector sizes are the same across versions. - szs := make([]abi.SectorSize, 0, len(miner7.PreCommitSealProofTypesV8)) - for spt := range miner7.PreCommitSealProofTypesV8 { - ss, err := spt.SectorSize() - if err != nil { - panic(err) - } - - szs = append(szs, ss) - } - - sort.Slice(szs, func(i, j int) bool { - return szs[i] < szs[j] - }) - - return szs[0] -} - -func GetDefaultAggregationProof() abi.RegisteredAggregationProof { - return abi.RegisteredAggregationProof_SnarkPackV1 -} - -func GetSectorMaxLifetime(proof abi.RegisteredSealProof, nwVer network.Version) abi.ChainEpoch { - if nwVer <= network.Version10 { - return builtin4.SealProofPoliciesV0[proof].SectorMaxLifetime - } - - return builtin7.SealProofPoliciesV11[proof].SectorMaxLifetime -} - -func GetAddressedSectorsMax(nwVer network.Version) (int, error) { - v, err := actors.VersionForNetwork(nwVer) - if err != nil { - return 0, err - } - switch v { - - case actors.Version0: - return miner0.AddressedSectorsMax, nil - - case actors.Version2: - return miner2.AddressedSectorsMax, nil - - case actors.Version3: - return miner3.AddressedSectorsMax, nil - - case actors.Version4: - return miner4.AddressedSectorsMax, nil - - case actors.Version5: - return miner5.AddressedSectorsMax, nil - - case actors.Version6: - return miner6.AddressedSectorsMax, nil - - case actors.Version7: - return miner7.AddressedSectorsMax, nil - - default: - return 0, xerrors.Errorf("unsupported network version") - } -} - -func GetDeclarationsMax(nwVer network.Version) (int, error) { - v, err := actors.VersionForNetwork(nwVer) - if err != nil { - return 0, err - } - switch v { - - case actors.Version0: - - // TODO: Should we instead error here since the concept doesn't exist yet? - return miner0.AddressedPartitionsMax, nil - - case actors.Version2: - - return miner2.DeclarationsMax, nil - - case actors.Version3: - - return miner3.DeclarationsMax, nil - - case actors.Version4: - - return miner4.DeclarationsMax, nil - - case actors.Version5: - - return miner5.DeclarationsMax, nil - - case actors.Version6: - - return miner6.DeclarationsMax, nil - - case actors.Version7: - - return miner7.DeclarationsMax, nil - - default: - return 0, xerrors.Errorf("unsupported network version") - } -} - -func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { - v, err := actors.VersionForNetwork(nwVer) - if err != nil { - return big.Zero(), err - } - switch v { - - case actors.Version0: - - return big.Zero(), nil - - case actors.Version2: - - return big.Zero(), nil - - case actors.Version3: - - return big.Zero(), nil - - case actors.Version4: - - return big.Zero(), nil - - case actors.Version5: - - return miner5.AggregateNetworkFee(aggregateSize, baseFee), nil - - case actors.Version6: - - return miner6.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil - - case actors.Version7: - - return miner7.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil - - default: - return big.Zero(), xerrors.Errorf("unsupported network version") - } -} - -func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { - v, err := actors.VersionForNetwork(nwVer) - if err != nil { - return big.Zero(), err - } - switch v { - - case actors.Version0: - - return big.Zero(), nil - - case actors.Version2: - - return big.Zero(), nil - - case actors.Version3: - - return big.Zero(), nil - - case actors.Version4: - - return big.Zero(), nil - - case actors.Version5: - - return big.Zero(), nil - - case actors.Version6: - - return miner6.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil - - case actors.Version7: - - return miner7.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil - - default: - return big.Zero(), xerrors.Errorf("unsupported network version") - } -} diff --git a/pkg/types/specactors/policy/policy.go.template b/pkg/types/specactors/policy/policy.go.template deleted file mode 100644 index 1654671e61..0000000000 --- a/pkg/types/specactors/policy/policy.go.template +++ /dev/null @@ -1,337 +0,0 @@ -// FETCHED FROM LOTUS: policy/policy.go.template - -package policy - -import ( - "sort" - - "github.com/filecoin-project/go-state-types/big" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" - actors "github.com/filecoin-project/venus/pkg/types/specactors" - - {{range .versions}} - {{if (ge . 2)}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" {{end}} - market{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin/market" - miner{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin/miner" - verifreg{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin/verifreg" - {{if (eq . 0)}} power{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin/power" {{end}} - {{end}} - - paych{{.latestVersion}} "github.com/filecoin-project/specs-actors{{import .latestVersion}}actors/builtin/paych" -) - -const ( - ChainFinality = miner{{.latestVersion}}.ChainFinality - SealRandomnessLookback = ChainFinality - PaychSettleDelay = paych{{.latestVersion}}.SettleDelay - MaxPreCommitRandomnessLookback = builtin{{.latestVersion}}.EpochsInDay + SealRandomnessLookback -) - -// SetSupportedProofTypes sets supported proof types, across all actor versions. -// This should only be used for testing. -func SetSupportedProofTypes(types ...abi.RegisteredSealProof) { - {{range .versions}} - {{if (eq . 0)}} - miner{{.}}.SupportedProofTypes = make(map[abi.RegisteredSealProof]struct{}, len(types)) - {{else if (le . 4)}} - miner{{.}}.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner{{.}}.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) - miner{{.}}.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - {{else}} - miner{{.}}.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - {{end}} - {{end}} - - AddSupportedProofTypes(types...) -} - -// AddSupportedProofTypes sets supported proof types, across all actor versions. -// This should only be used for testing. -func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { - for _, t := range types { - if t >= abi.RegisteredSealProof_StackedDrg2KiBV1_1 { - panic("must specify v1 proof types only") - } - // Set for all miner versions. - - {{range .versions}} - {{if (eq . 0)}} - miner{{.}}.SupportedProofTypes[t] = struct{}{} - {{else if (le . 4)}} - miner{{.}}.PreCommitSealProofTypesV0[t] = struct{}{} - miner{{.}}.PreCommitSealProofTypesV7[t] = struct{}{} - miner{{.}}.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner{{.}}.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - {{else if (eq . 5)}} - miner{{.}}.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err := t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } - - miner{{.}}.WindowPoStProofTypes[wpp] = struct{}{} - {{else}} - miner{{.}}.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err = t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } - - miner{{.}}.WindowPoStProofTypes[wpp] = struct{}{} - {{end}} - {{end}} - } -} - -// SetPreCommitChallengeDelay sets the pre-commit challenge delay across all -// actors versions. Use for testing. -func SetPreCommitChallengeDelay(delay abi.ChainEpoch) { - // Set for all miner versions. - {{range .versions}} - miner{{.}}.PreCommitChallengeDelay = delay - {{end}} -} - -// TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. -func GetPreCommitChallengeDelay() abi.ChainEpoch { - return miner{{.latestVersion}}.PreCommitChallengeDelay -} - -// SetConsensusMinerMinPower sets the minimum power of an individual miner must -// meet for leader election, across all actor versions. This should only be used -// for testing. -func SetConsensusMinerMinPower(p abi.StoragePower) { - {{range .versions}} - {{if (eq . 0)}} - power{{.}}.ConsensusMinerMinPower = p - {{else if (eq . 2)}} - for _, policy := range builtin{{.}}.SealProofPolicies { - policy.ConsensusMinerMinPower = p - } - {{else}} - for _, policy := range builtin{{.}}.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - {{end}} - {{end}} -} - -// SetMinVerifiedDealSize sets the minimum size of a verified deal. This should -// only be used for testing. -func SetMinVerifiedDealSize(size abi.StoragePower) { - {{range .versions}} - verifreg{{.}}.MinVerifiedDealSize = size - {{end}} -} - -func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { - switch ver { - {{range .versions}} - case actors.Version{{.}}: - {{if (eq . 0)}} - return miner{{.}}.MaxSealDuration[t], nil - {{else}} - return miner{{.}}.MaxProveCommitDuration[t], nil - {{end}} - {{end}} - default: - return 0, xerrors.Errorf("unsupported actors version") - } -} - -// SetProviderCollateralSupplyTarget sets the percentage of normalized circulating -// supply that must be covered by provider collateral in a deal. This should -// only be used for testing. -func SetProviderCollateralSupplyTarget(num, denom big.Int) { -{{range .versions}} - {{if (ge . 2)}} - market{{.}}.ProviderCollateralSupplyTarget = builtin{{.}}.BigFrac{ - Numerator: num, - Denominator: denom, - } - {{end}} -{{end}} -} - -func DealProviderCollateralBounds( - size abi.PaddedPieceSize, verified bool, - rawBytePower, qaPower, baselinePower abi.StoragePower, - circulatingFil abi.TokenAmount, nwVer network.Version, -) (min, max abi.TokenAmount, err error) { - v, err := actors.VersionForNetwork(nwVer) - if err != nil { - return big.Zero(), big.Zero(), err - } - switch v { - {{range .versions}} - case actors.Version{{.}}: - {{if (eq . 0)}} - min, max := market{{.}}.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil, nwVer) - return min, max, nil - {{else}} - min, max := market{{.}}.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - {{end}} - {{end}} - default: - return big.Zero(), big.Zero(), xerrors.Errorf("unsupported actors version") - } -} - -func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) { - return market{{.latestVersion}}.DealDurationBounds(pieceSize) -} - -// Sets the challenge window and scales the proving period to match (such that -// there are always 48 challenge windows in a proving period). -func SetWPoStChallengeWindow(period abi.ChainEpoch) { - {{range .versions}} - miner{{.}}.WPoStChallengeWindow = period - miner{{.}}.WPoStProvingPeriod = period * abi.ChainEpoch(miner{{.}}.WPoStPeriodDeadlines) - {{if (ge . 3)}} - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner{{.}}.WPoStDisputeWindow = period * 30 - {{end}} - {{end}} -} - -func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { - if nwVer <= network.Version3 { - return 10 - } - - // NOTE: if this ever changes, adjust it in a (*Miner).mineOne() logline as well - return ChainFinality -} - -func GetMaxSectorExpirationExtension() abi.ChainEpoch { - return miner{{.latestVersion}}.MaxSectorExpirationExtension -} - -func GetMinSectorExpiration() abi.ChainEpoch { - return miner{{.latestVersion}}.MinSectorExpiration -} - -func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, error) { - sectorsPerPart, err := builtin{{.latestVersion}}.PoStProofWindowPoStPartitionSectors(p) - if err != nil { - return 0, err - } - maxSectors, err := GetAddressedSectorsMax(nv) - if err != nil { - return 0, err - } - return int(uint64(maxSectors) / sectorsPerPart), nil -} - -func GetDefaultSectorSize() abi.SectorSize { - // supported sector sizes are the same across versions. - szs := make([]abi.SectorSize, 0, len(miner{{.latestVersion}}.PreCommitSealProofTypesV8)) - for spt := range miner{{.latestVersion}}.PreCommitSealProofTypesV8 { - ss, err := spt.SectorSize() - if err != nil { - panic(err) - } - - szs = append(szs, ss) - } - - sort.Slice(szs, func(i, j int) bool { - return szs[i] < szs[j] - }) - - return szs[0] -} - -func GetDefaultAggregationProof() abi.RegisteredAggregationProof { - return abi.RegisteredAggregationProof_SnarkPackV1 -} - -func GetSectorMaxLifetime(proof abi.RegisteredSealProof, nwVer network.Version) abi.ChainEpoch { - if nwVer <= network.Version10 { - return builtin4.SealProofPoliciesV0[proof].SectorMaxLifetime - } - - return builtin{{.latestVersion}}.SealProofPoliciesV11[proof].SectorMaxLifetime -} - -func GetAddressedSectorsMax(nwVer network.Version) (int, error) { - v, err := actors.VersionForNetwork(nwVer) - if err != nil { - return 0, err - } - switch v { - {{range .versions}} - case actors.Version{{.}}: - return miner{{.}}.AddressedSectorsMax, nil - {{end}} - default: - return 0, xerrors.Errorf("unsupported network version") - } -} - -func GetDeclarationsMax(nwVer network.Version) (int, error) { - v, err := actors.VersionForNetwork(nwVer) - if err != nil { - return 0, err - } - switch v { - {{range .versions}} - case actors.Version{{.}}: - {{if (eq . 0)}} - // TODO: Should we instead error here since the concept doesn't exist yet? - return miner{{.}}.AddressedPartitionsMax, nil - {{else}} - return miner{{.}}.DeclarationsMax, nil - {{end}} - {{end}} - default: - return 0, xerrors.Errorf("unsupported network version") - } -} - -func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { - v, err := actors.VersionForNetwork(nwVer) - if err != nil { - return big.Zero(), err - } - switch v { - {{range .versions}} - case actors.Version{{.}}: - {{if (ge . 6)}} - return miner{{.}}.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil - {{else if (eq . 5)}} - return miner{{.}}.AggregateNetworkFee(aggregateSize, baseFee), nil - {{else}} - return big.Zero(), nil - {{end}} - {{end}} - default: - return big.Zero(), xerrors.Errorf("unsupported network version") - } -} - -func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { - v, err := actors.VersionForNetwork(nwVer) - if err != nil { - return big.Zero(), err - } - switch v { - {{range .versions}} - case actors.Version{{.}}: - {{if (ge . 6)}} - return miner{{.}}.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil - {{else}} - return big.Zero(), nil - {{end}} - {{end}} - default: - return big.Zero(), xerrors.Errorf("unsupported network version") - } -} diff --git a/pkg/types/specactors/policy/policy_test.go b/pkg/types/specactors/policy/policy_test.go deleted file mode 100644 index fd644f1e07..0000000000 --- a/pkg/types/specactors/policy/policy_test.go +++ /dev/null @@ -1,86 +0,0 @@ -package policy - -import ( - "testing" - - "github.com/stretchr/testify/require" - - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" - paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" - verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" - paych2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/paych" - verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" - - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" -) - -func TestSupportedProofTypes(t *testing.T) { - tf.UnitTest(t) - var oldTypes []abi.RegisteredSealProof - for t := range miner0.SupportedProofTypes { - oldTypes = append(oldTypes, t) - } - t.Cleanup(func() { - SetSupportedProofTypes(oldTypes...) - }) - - SetSupportedProofTypes(abi.RegisteredSealProof_StackedDrg2KiBV1) - require.EqualValues(t, - miner0.SupportedProofTypes, - map[abi.RegisteredSealProof]struct{}{ - abi.RegisteredSealProof_StackedDrg2KiBV1: {}, - }, - ) - AddSupportedProofTypes(abi.RegisteredSealProof_StackedDrg8MiBV1) - require.EqualValues(t, - miner0.SupportedProofTypes, - map[abi.RegisteredSealProof]struct{}{ - abi.RegisteredSealProof_StackedDrg2KiBV1: {}, - abi.RegisteredSealProof_StackedDrg8MiBV1: {}, - }, - ) -} - -// Tests assumptions about policies being the same between actor versions. -func TestAssumptions(t *testing.T) { - tf.UnitTest(t) - require.EqualValues(t, miner0.SupportedProofTypes, miner2.PreCommitSealProofTypesV0) - require.Equal(t, miner0.PreCommitChallengeDelay, miner2.PreCommitChallengeDelay) - require.Equal(t, miner0.MaxSectorExpirationExtension, miner2.MaxSectorExpirationExtension) - require.Equal(t, miner0.ChainFinality, miner2.ChainFinality) - require.Equal(t, miner0.WPoStChallengeWindow, miner2.WPoStChallengeWindow) - require.Equal(t, miner0.WPoStProvingPeriod, miner2.WPoStProvingPeriod) - require.Equal(t, miner0.WPoStPeriodDeadlines, miner2.WPoStPeriodDeadlines) - require.Equal(t, miner0.AddressedSectorsMax, miner2.AddressedSectorsMax) - require.Equal(t, paych0.SettleDelay, paych2.SettleDelay) - require.True(t, verifreg0.MinVerifiedDealSize.Equals(verifreg2.MinVerifiedDealSize)) -} - -func TestPartitionSizes(t *testing.T) { - tf.UnitTest(t) - for _, p := range abi.SealProofInfos { - sizeNew, err := builtin2.PoStProofWindowPoStPartitionSectors(p.WindowPoStProof) - require.NoError(t, err) - sizeOld, err := builtin0.PoStProofWindowPoStPartitionSectors(p.WindowPoStProof) - if err != nil { - // new proof type. - continue - } - require.Equal(t, sizeOld, sizeNew) - } -} - -func TestPoStSize(t *testing.T) { - tf.UnitTest(t) - v12PoStSize, err := GetMaxPoStPartitions(network.Version12, abi.RegisteredPoStProof_StackedDrgWindow64GiBV1) - require.Equal(t, 4, v12PoStSize) - require.NoError(t, err) - v13PoStSize, err := GetMaxPoStPartitions(network.Version13, abi.RegisteredPoStProof_StackedDrgWindow64GiBV1) - require.NoError(t, err) - require.Equal(t, 10, v13PoStSize) -} diff --git a/pkg/types/specactors/version.go b/pkg/types/specactors/version.go deleted file mode 100644 index 3db0af5841..0000000000 --- a/pkg/types/specactors/version.go +++ /dev/null @@ -1,59 +0,0 @@ -package specactors - -import ( - "fmt" - - "github.com/filecoin-project/go-state-types/network" -) - -type Version int - -/* inline-gen template - -var LatestVersion = {{.latestActorsVersion}} - -var Versions = []int{ {{range .actorVersions}} {{.}}, {{end}} } - -const ({{range .actorVersions}} - Version{{.}} Version = {{.}}{{end}} -) - -/* inline-gen start */ - -var LatestVersion = 7 - -var Versions = []int{0, 2, 3, 4, 5, 6, 7} - -const ( - Version0 Version = 0 - Version2 Version = 2 - Version3 Version = 3 - Version4 Version = 4 - Version5 Version = 5 - Version6 Version = 6 - Version7 Version = 7 -) - -/* inline-gen end */ - -// Converts a network version into an actors adt version. -func VersionForNetwork(version network.Version) (Version, error) { - switch version { - case network.Version0, network.Version1, network.Version2, network.Version3: - return Version0, nil - case network.Version4, network.Version5, network.Version6, network.Version7, network.Version8, network.Version9: - return Version2, nil - case network.Version10, network.Version11: - return Version3, nil - case network.Version12: - return Version4, nil - case network.Version13: - return Version5, nil - case network.Version14: - return Version6, nil - case network.Version15: - return Version7, nil - default: - return -1, fmt.Errorf("unsupported network version %d", version) - } -} diff --git a/pkg/types/testing.go b/pkg/types/testing.go deleted file mode 100644 index ab1254f4c2..0000000000 --- a/pkg/types/testing.go +++ /dev/null @@ -1 +0,0 @@ -package types diff --git a/pkg/types/types.go b/pkg/types/types.go deleted file mode 100644 index 5bc4080394..0000000000 --- a/pkg/types/types.go +++ /dev/null @@ -1,67 +0,0 @@ -package types - -import ( - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/venus/pkg/constants" - - "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" - "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" -) - -type EstimateMessage struct { - Msg *Message - Spec *MessageSendSpec -} - -type EstimateResult struct { - Msg *Message - Err string -} - -type MessageSendSpec struct { - MaxFee abi.TokenAmount - GasOverEstimation float64 -} - -var DefaultMessageSendSpec = MessageSendSpec{ - // MaxFee of 0.1FIL - MaxFee: abi.NewTokenAmount(int64(constants.FilecoinPrecision) / 10), -} - -func (ms *MessageSendSpec) Get() MessageSendSpec { - if ms == nil { - return DefaultMessageSendSpec - } - - return *ms -} - -type ChainSectorInfo struct { - Info miner.SectorOnChainInfo - ID abi.SectorNumber -} - -type DealCollateralBounds struct { - Min abi.TokenAmount - Max abi.TokenAmount -} - -type MarketDeal struct { - Proposal market.DealProposal - State market.DealState -} - -type CirculatingSupply struct { - FilVested abi.TokenAmount - FilMined abi.TokenAmount - FilBurnt abi.TokenAmount - FilLocked abi.TokenAmount - FilCirculating abi.TokenAmount -} - -type NetworkPower struct { - RawBytePower abi.StoragePower - QualityAdjustedPower abi.StoragePower - MinerCount int64 - MinPowerMinerCount int64 -} diff --git a/pkg/types/types_gen.go b/pkg/types/types_gen.go deleted file mode 100755 index b263950a03..0000000000 --- a/pkg/types/types_gen.go +++ /dev/null @@ -1,107 +0,0 @@ -// Code generated by github.com/filecoin-project/tools/gen/api. DO NOT EDIT. - -package types - -import "github.com/filecoin-project/venus/pkg/types/internal" - -//type redefine -type BlockMessagesInfo = internal.BlockMessagesInfo -type FIL = internal.FIL -type Ticket = internal.Ticket -type TipSetKey = internal.TipSetKey -type BlockHeader = internal.BlockHeader -type MessageMaker = internal.MessageMaker -type ReceiptMaker = internal.ReceiptMaker -type Actor = internal.Actor -type VRFPi = internal.VRFPi -type ElectionProof = internal.ElectionProof -type BigInt = internal.BigInt -type BlockMsg = internal.BlockMsg -type Signer = internal.Signer -type BeaconEntry = internal.BeaconEntry -type MockSigner = internal.MockSigner -type HasCid = internal.HasCid -type TipSet = internal.TipSet -type FullBlock = internal.FullBlock -type FullTipSet = internal.FullTipSet -type SignedMessage = internal.SignedMessage -type ChainMsg = internal.ChainMsg -type Message = internal.Message -type UnsignedMessage = internal.UnsignedMessage -type TxMeta = internal.TxMeta -type MessageReceipt = internal.MessageReceipt - -//func redefine -var ParseFIL = internal.ParseFIL -var MustParseFIL = internal.MustParseFIL -var NewTipSetKey = internal.NewTipSetKey -var TipSetKeyFromBytes = internal.TipSetKeyFromBytes -var DecodeBlock = internal.DecodeBlock -var NewMessageMaker = internal.NewMessageMaker -var EmptyReceipts = internal.EmptyReceipts -var NewReceiptMaker = internal.NewReceiptMaker -var NewActor = internal.NewActor -var NewInt = internal.NewInt -var FromFil = internal.FromFil -var BigFromBytes = internal.BigFromBytes -var BigFromString = internal.BigFromString -var BigMul = internal.BigMul -var BigDiv = internal.BigDiv -var BigDivFloat = internal.BigDivFloat -var BigMod = internal.BigMod -var BigAdd = internal.BigAdd -var BigSub = internal.BigSub -var BigCmp = internal.BigCmp -var SizeStr = internal.SizeStr -var DeciStr = internal.DeciStr -var NewMockSigner = internal.NewMockSigner -var NewMockSignersAndKeyInfo = internal.NewMockSignersAndKeyInfo -var MustGenerateMixedKeyInfo = internal.MustGenerateMixedKeyInfo -var MustGenerateBLSKeyInfo = internal.MustGenerateBLSKeyInfo -var MustGenerateKeyInfo = internal.MustGenerateKeyInfo -var NewSignedMessageForTestGetter = internal.NewSignedMessageForTestGetter -var CidFromString = internal.CidFromString -var NewCidForTestGetter = internal.NewCidForTestGetter -var NewMessageForTestGetter = internal.NewMessageForTestGetter -var NewMsgs = internal.NewMsgs -var NewSignedMsgs = internal.NewSignedMsgs -var SignMsgs = internal.SignMsgs -var NewMsgsWithAddrs = internal.NewMsgsWithAddrs -var AssertHaveSameCid = internal.AssertHaveSameCid -var AssertCidsEqual = internal.AssertCidsEqual -var RequireIDAddress = internal.RequireIDAddress -var NewForTestGetter = internal.NewForTestGetter -var RequireNewTipSet = internal.RequireNewTipSet -var NewTipSet = internal.NewTipSet -var CidArrsEqual = internal.CidArrsEqual -var NewFullTipSet = internal.NewFullTipSet -var ReverseFullBlock = internal.ReverseFullBlock -var ReverseTipSet = internal.ReverseTipSet -var NewSignedMessage = internal.NewSignedMessage -var NewAttoFIL = internal.NewAttoFIL -var NewAttoFILFromFIL = internal.NewAttoFILFromFIL -var NewAttoFILFromFILString = internal.NewAttoFILFromFILString -var NewAttoFILFromString = internal.NewAttoFILFromString -var NewUnsignedMessage = internal.NewUnsignedMessage -var NewMeteredMessage = internal.NewMeteredMessage -var DecodeMessage = internal.DecodeMessage -var NewGasFeeCap = internal.NewGasFeeCap -var NewGasPremium = internal.NewGasPremium - -//value redefine -var ZeroFIL = internal.ZeroFIL -var AttoFil = internal.AttoFil -var FemtoFil = internal.FemtoFil -var PicoFil = internal.PicoFil -var NanoFil = internal.NanoFil -var ErrNotFound = internal.ErrNotFound -var EmptyTSK = internal.EmptyTSK -var ErrActorNotFound = internal.ErrActorNotFound -var BlocksPerEpoch = internal.BlocksPerEpoch -var MaxWinCount = internal.MaxWinCount -var ZeroAddress = internal.ZeroAddress -var TotalFilecoinInt = internal.TotalFilecoinInt -var EmptyInt = internal.EmptyInt -var UndefTipSet = internal.UndefTipSet -var MessageVersion = internal.MessageVersion -var EmptyTokenAmount = internal.EmptyTokenAmount diff --git a/scripts/check_api_file_change.sh b/scripts/check_api_file_change.sh deleted file mode 100644 index 0d424c91ea..0000000000 --- a/scripts/check_api_file_change.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -change=$(git status | grep full.go); -change2=$(git status | grep stable_method_info.json); - -echo "$change" -echo "$change2" -echo "" - -if [[ "$change" = "" ]] -then - if [[ "$change2" == "" ]] - then - # api file not change, eixt - echo "full.go not change" - echo "stable_method_info.json not change" - exit 0 - else - echo "$change2" - exit 1 - fi -else - echo "$change" - exit 1 -fi diff --git a/tools/client/main.go b/tools/client/main.go deleted file mode 100644 index e68272a494..0000000000 --- a/tools/client/main.go +++ /dev/null @@ -1,133 +0,0 @@ -package main - -import ( - "context" - "fmt" - "net/http" - "net/url" - "runtime/debug" - - "github.com/filecoin-project/go-jsonrpc" - "github.com/ipfs/go-cid" - "github.com/multiformats/go-multiaddr" - manet "github.com/multiformats/go-multiaddr/net" - - "github.com/filecoin-project/venus/app/client" - "github.com/filecoin-project/venus/pkg/constants" - v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" - "github.com/filecoin-project/venus/venus-shared/types" -) - -const Filecoin = "Filecoin" - -func main() { - defer func() { - if r := recover(); r != nil { - fmt.Println(r) - fmt.Println(string(debug.Stack())) - } - }() - - ctx := context.Background() - - addrBase := "/ip4/127.0.0.1/tcp/3453" - addr, err := dialArgs(addrBase, "v0") - checkErr(err) - addr2, err := dialArgs(addrBase, "v1") - checkErr(err) - - handler := http.Header{} - var cliV0 v0api.FullNodeStruct - var cliV1 client.FullNodeStruct - - closeV0, err := jsonrpc.NewClient(ctx, addr, Filecoin, &cliV0, handler) - checkErr(err) - defer closeV0() - - closeV1, err := jsonrpc.NewClient(ctx, addr2, Filecoin, &cliV1, handler) - checkErr(err) - defer closeV1() - - v, err := cliV0.Version(ctx) - checkErr(err) - fmt.Println("Version", v) - - head, err := cliV0.ChainHead(ctx) - checkErr(err) - fmt.Println(head) - - var checkOver bool - var i int - for ; !checkOver; i++ { - fullBlock, err := cliV0.GetFullBlock(ctx, head.Blocks()[0].Cid()) - checkErr(err) - fmt.Println("GetFullBlock ", fullBlock.Header) - - for _, m := range fullBlock.BLSMessages { - checkOver = true - msgLookup, err := cliV0.StateWaitMsg(ctx, m.Cid(), constants.DefaultConfidence) - checkErr(err) - fmt.Println("StateWaitMsg ", msgLookup) - - msgLookup, err = cliV0.StateSearchMsg(ctx, m.Cid()) - checkErr(err) - fmt.Println("StateSearchMsg ", msgLookup) - - receipt, err := cliV0.StateGetReceipt(ctx, m.Cid(), types.TipSetKey{}) - checkErr(err) - fmt.Println("StateGetReceipt ", receipt) - - break - } - - for _, m := range fullBlock.BLSMessages { - checkOver = true - msgLookup, err := cliV1.StateWaitMsg(ctx, m.Cid(), constants.DefaultConfidence, constants.LookbackNoLimit, true) - checkErr(err) - fmt.Println("StateWaitMsg ", msgLookup) - - msgLookup, err = cliV1.StateSearchMsg(ctx, types.TipSetKey{}, m.Cid(), constants.LookbackNoLimit, true) - checkErr(err) - fmt.Println("StateSearchMsg ", msgLookup) - - break - } - - pt, err := cliV0.ChainGetTipSet(ctx, head.Parents()) - checkErr(err) - fmt.Println("parent ", pt, "height ", pt.Height()) - head = pt - } - -} - -func checkErr(err error) { - if err != nil { - panic(err) - } -} - -// eg. "bafy2bzaceb2ff6egw54sjcarqvl22mkitmr7q5rmlinza6nnhk6p44t5eee24" -func toCid(cidStr string) cid.Cid { // nolint - cid, err := cid.Decode(cidStr) - checkErr(err) - return cid -} - -func dialArgs(addr string, version string) (string, error) { - ma, err := multiaddr.NewMultiaddr(addr) - if err == nil { - _, addr, err := manet.DialArgs(ma) - if err != nil { - return "", err - } - - return "ws://" + addr + "/rpc/" + version, nil - } - - _, err = url.Parse(addr) - if err != nil { - return "", err - } - return addr + "/rpc/" + version, nil -} diff --git a/tools/gen/api/proxygen.go b/tools/gen/api/proxygen.go deleted file mode 100644 index 2042e87cd4..0000000000 --- a/tools/gen/api/proxygen.go +++ /dev/null @@ -1,537 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "go/ast" - "go/parser" - "go/token" - "io/ioutil" - "os" - "path" - "path/filepath" - "regexp" - "strconv" - "strings" - "text/template" - "unicode" - - "github.com/filecoin-project/venus/app/client/funcrule" - "golang.org/x/xerrors" -) - -// Rule[perm:read,ignore:true] -var rulePattern = `Rule\[(?P.*)\]` - -type ruleKey = string - -const ( - rkPerm ruleKey = "perm" - rkIgnore ruleKey = "ignore" -) - -var defaultPerm = []string{"perm", "read"} - -var regRule, _ = regexp.Compile(rulePattern) - -func parseRule(comment string) (*funcrule.Rule, map[string][]string) { - rule := new(funcrule.Rule) - match := regRule.FindStringSubmatch(comment) - tags := map[string][]string{} - if len(match) == 2 { - pairs := strings.Split(match[1], ",") - for _, v := range pairs { - pair := strings.Split(v, ":") - if len(pair) != 2 { - continue - } - switch pair[0] { - case rkPerm: - tags[rkPerm] = pair - rule.Perm = pair[1] - case rkIgnore: - ig, err := strconv.ParseBool(pair[1]) - if err != nil { - panic("the rule tag is invalid format") - } - rule.Ignore = ig - } - } - } else { - rule.Perm = "read" - tags[rkPerm] = defaultPerm - } - return rule, tags -} - -type methodMeta struct { - node ast.Node - ftype *ast.FuncType -} - -type Visitor struct { - Methods map[string]map[string]*methodMeta - Include map[string][]string -} - -func (v *Visitor) Visit(node ast.Node) ast.Visitor { - st, ok := node.(*ast.TypeSpec) - if !ok { - return v - } - - iface, ok := st.Type.(*ast.InterfaceType) - if !ok { - return v - } - if v.Methods[st.Name.Name] == nil { - v.Methods[st.Name.Name] = map[string]*methodMeta{} - } - for _, m := range iface.Methods.List { - switch ft := m.Type.(type) { - case *ast.Ident: - v.Include[st.Name.Name] = append(v.Include[st.Name.Name], ft.Name) - case *ast.FuncType: - v.Methods[st.Name.Name][m.Names[0].Name] = &methodMeta{ - node: m, - ftype: ft, - } - } - } - - return v -} - -func main() { - var arg string - if len(os.Args) > 1 { - arg = os.Args[1] - } - - onlyCompare := arg == "compare" - lpath := lotusPath() - - infos := struct { - V0 *stableMethodInfo - V1 *stableMethodInfo - }{ - V0: v0API(lpath, onlyCompare), - V1: v1API(lpath, onlyCompare), - } - - data, err := json.MarshalIndent(infos, "", "\t") - checkError(err) - err = ioutil.WriteFile("./tools/gen/api/stable_method_info.json", data, 0666) - checkError(err) -} - -func v0API(lpath string, onlyCompare bool) *stableMethodInfo { - apiFilePaths := []string{ - path.Join(lpath, "api/v0api/full.go"), - path.Join(lpath, "api/api_common.go"), - path.Join(lpath, "api/api_net.go"), - } - fmt.Println("v0 lotus api file: ", apiFilePaths) - - bmp, err := benchmarkMethodPerm(apiFilePaths) - checkError(err) - //outputWithJSON(bmp, "v0 benchmarkMethodPerm: ") - - mm, err := methodMetaFromInterface("./app/client/apiface", "v0api", "v0api") - checkError(err) - - smi := check(bmp, mm) - outputWithJSON(smi, "v0 api StableMethodInfo: ") - - if !onlyCompare { - outfile := "./app/client/v0api/full.go" - checkError(doTemplate(outfile, mm, templ)) - } - - return smi -} - -func v1API(lpath string, onlyCompare bool) *stableMethodInfo { - apiFilePaths := []string{ - path.Join(lpath, "api/api_full.go"), - path.Join(lpath, "api/api_common.go"), - path.Join(lpath, "api/api_net.go"), - } - fmt.Println("v1 lotus api file: ", apiFilePaths) - - bmp, err := benchmarkMethodPerm(apiFilePaths) - checkError(err) - //outputWithJSON(bmp, "v1 benchmarkMethodPerm: ") - - mm, err := methodMetaFromInterface("./app/client", "apiface", "client") - checkError(err) - - smi := check(bmp, mm) - outputWithJSON(smi, "v1 api StableMethodInfo: ") - - if !onlyCompare { - outfile := "./app/client/full.go" - checkError(doTemplate(outfile, mm, templ)) - } - - return smi -} - -func lotusPath() string { - currPath := "../lotus" - rootPath := path.Join(os.Getenv("GOPATH"), "pkg/mod/github.com/filecoin-project") - dirs, err := os.ReadDir(rootPath) - if err == nil { - // Select the latest version of Lotus - for _, dir := range dirs { - if strings.Contains(dir.Name(), "lotus") { - fmt.Println(dir.Name()) - currPath = path.Join(rootPath, dir.Name()) - } - } - } - fmt.Println("lotus path:", currPath) - - return currPath -} - -func benchmarkMethodPerm(apiFilePaths []string) (map[string]string, error) { - fset := token.NewFileSet() - files := make([]*ast.File, 0, len(apiFilePaths)) - visitor := &Visitor{make(map[string]map[string]*methodMeta), map[string][]string{}} - - for _, fpath := range apiFilePaths { - f, err := parser.ParseFile(fset, fpath, nil, parser.AllErrors|parser.ParseComments) - if err != nil { - return nil, err - } - files = append(files, f) - ast.Walk(visitor, f) - } - - perms := make(map[string]string) - for _, f := range files { - cmap := ast.NewCommentMap(fset, f, f.Comments) - for _, methods := range visitor.Methods { - for mname, node := range methods { - filteredComments := cmap.Filter(node.node).Comments() - if len(filteredComments) > 0 { - cmt := filteredComments[len(filteredComments)-1].List[0].Text - if !strings.Contains(cmt, "perm:") { - fmt.Println("lotus method not found perm: ", mname) - continue - } - pairs := strings.Split(cmt, ":") - if len(pairs) != 2 { - continue - } - perms[mname] = pairs[1] - } - } - } - } - - return perms, nil -} - -type methodInfo struct { - Name string - node ast.Node - Tags map[string][]string - NamedParams, ParamNames, Results, DefRes string -} -type strinfo struct { - Name string - Methods map[string]*methodInfo - Include []string -} -type meta struct { - Infos map[string]*strinfo - Imports map[string]string - OutPkg string -} - -func methodMetaFromInterface(rootPath string, pkg, outpkg string) (*meta, error) { - fset := token.NewFileSet() - apiDir, err := filepath.Abs(rootPath) - if err != nil { - return nil, err - } - - visitor := &Visitor{make(map[string]map[string]*methodMeta), map[string][]string{}} - m := &meta{ - OutPkg: outpkg, - Infos: map[string]*strinfo{}, - Imports: map[string]string{}, - } - //filter := isGoFile - pkgs, err := parser.ParseDir(fset, path.Join(apiDir, pkg), nil, parser.AllErrors|parser.ParseComments) - if err != nil { - return nil, err - } - ap := pkgs[pkg] - - ast.Walk(visitor, ap) - ignoreMethods := map[string][]string{} - for _, f := range ap.Files { - cmap := ast.NewCommentMap(fset, f, f.Comments) - for _, im := range f.Imports { - m.Imports[im.Path.Value] = im.Path.Value - if im.Name != nil { - m.Imports[im.Path.Value] = im.Name.Name + " " + m.Imports[im.Path.Value] - } - } - - for ifname, methods := range visitor.Methods { - if _, ok := m.Infos[ifname]; !ok { - m.Infos[ifname] = &strinfo{ - Name: ifname, - Methods: map[string]*methodInfo{}, - Include: visitor.Include[ifname], - } - } - info := m.Infos[ifname] - for mname, node := range methods { - filteredComments := cmap.Filter(node.node).Comments() - if _, ok := info.Methods[mname]; !ok { - var params, pnames []string - for _, param := range node.ftype.Params.List { - pstr, err := typeName(param.Type, outpkg) - if err != nil { - return nil, err - } - - c := len(param.Names) - if c == 0 { - c = 1 - } - - for i := 0; i < c; i++ { - pname := fmt.Sprintf("p%d", len(params)) - pnames = append(pnames, pname) - params = append(params, pname+" "+pstr) - } - } - - var results []string - for _, result := range node.ftype.Results.List { - rs, err := typeName(result.Type, outpkg) - if err != nil { - return nil, err - } - results = append(results, rs) - } - - defRes := "" - if len(results) > 1 { - defRes = results[0] - switch { - case defRes[0] == '*' || defRes[0] == '<', defRes == "interface{}": - defRes = "nil" - case defRes == "bool": - defRes = "false" - case defRes == "string": - defRes = `""` - case defRes == "int", defRes == "int64", defRes == "uint64", defRes == "uint": - defRes = "0" - default: - defRes = "*new(" + defRes + ")" - } - defRes += ", " - } - - info.Methods[mname] = &methodInfo{ - Name: mname, - node: node.node, - Tags: map[string][]string{}, - NamedParams: strings.Join(params, ", "), - ParamNames: strings.Join(pnames, ", "), - Results: strings.Join(results, ", "), - DefRes: defRes, - } - } - - // try to parse tag info - if len(filteredComments) > 0 { - cmt := filteredComments[0].List[len(filteredComments[0].List)-1].Text - rule, tags := parseRule(cmt) - info.Methods[mname].Tags[rkPerm] = tags[rkPerm] - // remove ignore method - if rule.Ignore { - ignoreMethods[ifname] = append(ignoreMethods[ifname], mname) - } - } - } - } - } - for ifname, mnames := range ignoreMethods { - for _, mname := range mnames { - delete(m.Infos[ifname].Methods, mname) - } - } - - return m, nil -} - -func typeName(e ast.Expr, pkg string) (string, error) { - switch t := e.(type) { - case *ast.SelectorExpr: - return t.X.(*ast.Ident).Name + "." + t.Sel.Name, nil - case *ast.Ident: - pstr := t.Name - if !unicode.IsLower(rune(pstr[0])) && pkg != "client" { - pstr = "client." + pstr // todo src pkg name - } - return pstr, nil - case *ast.ArrayType: - subt, err := typeName(t.Elt, pkg) - if err != nil { - return "", err - } - return "[]" + subt, nil - case *ast.StarExpr: - subt, err := typeName(t.X, pkg) - if err != nil { - return "", err - } - return "*" + subt, nil - case *ast.MapType: - k, err := typeName(t.Key, pkg) - if err != nil { - return "", err - } - v, err := typeName(t.Value, pkg) - if err != nil { - return "", err - } - return "map[" + k + "]" + v, nil - case *ast.StructType: - if len(t.Fields.List) != 0 { - return "", xerrors.Errorf("can't struct") - } - return "struct{}", nil - case *ast.InterfaceType: - if len(t.Methods.List) != 0 { - return "", xerrors.Errorf("can't interface") - } - return "interface{}", nil - case *ast.ChanType: - subt, err := typeName(t.Value, pkg) - if err != nil { - return "", err - } - if t.Dir == ast.SEND { - subt = "->chan " + subt - } else { - subt = "<-chan " + subt - } - return subt, nil - default: - return "", xerrors.Errorf("unknown type") - } -} - -type stableMethodInfo struct { - // Lotus and Venus both have functions and the same permissions - Common map[string]string - // Venus has functions that Lotus does not - Extend map[string]string - // Lotus has functions that Venus does not - Loss map[string]string - // Both Lotus and venus has functions but the permissions are different - Gap map[string]string -} - -func newStableMethodInfo() *stableMethodInfo { - return &stableMethodInfo{ - Common: make(map[string]string), - Extend: make(map[string]string), - Loss: make(map[string]string), - Gap: make(map[string]string), - } -} - -func check(bmp map[string]string, m *meta) *stableMethodInfo { - smi := newStableMethodInfo() - vMethodPerms := make(map[string]string) - for _, info := range m.Infos { - for _, one := range info.Methods { - mperm := one.Tags[rkPerm][1] - vMethodPerms[one.Name] = mperm - if perm, ok := bmp[one.Name]; ok { - if mperm != perm { - smi.Gap[one.Name] = fmt.Sprintf("venus:%s lotus:%s", mperm, perm) - continue - } - smi.Common[one.Name] = mperm - } else { - smi.Extend[one.Name] = mperm - } - } - } - for m, p := range bmp { - if _, ok := vMethodPerms[m]; !ok { - smi.Loss[m] = p - } - } - - return smi -} - -func doTemplate(outfile string, info interface{}, templ string) error { - w, err := os.OpenFile(outfile, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) - if err != nil { - return err - } - t := template.Must(template.New(""). - Funcs(template.FuncMap{}).Parse(templ)) - - return t.Execute(w, info) -} - -var templ = `// Code generated by github.com/filecoin-project/tools/gen/api. DO NOT EDIT. - -package {{.OutPkg}} - -import ( -{{range .Imports}} {{.}} -{{end}} -) - -{{range .Infos}} - -{{$name := .Name}} -type {{.Name}}Struct struct { -{{range .Include}} {{.}}Struct -{{end}} - -{{ if gt (len .Methods) 0 }} - Internal struct { - {{range .Methods}} {{.Name}} func({{.NamedParams}}) ({{.Results}}) ` + "`" + `{{range .Tags}}{{index . 0}}:"{{index . 1}}"{{end}}` + "`" + ` - {{end}} - } -{{ end }} -} - -{{range .Methods}} func(s *{{$name}}Struct) {{.Name}} ({{.NamedParams}}) ({{.Results}}){ - return s.Internal.{{.Name}}({{.ParamNames}}) -} - -{{end}} - -{{end}} -` - -func checkError(err error) { - if err != nil { - panic(err) - } -} - -func outputWithJSON(obj interface{}, comment string) { - b, err := json.MarshalIndent(obj, "", "\t") - if err != nil { - fmt.Println("json marshal error: ", err) - } - fmt.Println(comment, "\n", string(b)) -} diff --git a/tools/gen/api/stable_method_info.json b/tools/gen/api/stable_method_info.json deleted file mode 100644 index 0e00bd2003..0000000000 --- a/tools/gen/api/stable_method_info.json +++ /dev/null @@ -1,531 +0,0 @@ -{ - "V0": { - "Common": { - "AuthNew": "admin", - "BeaconGetEntry": "read", - "ChainDeleteObj": "admin", - "ChainExport": "read", - "ChainGetBlock": "read", - "ChainGetBlockMessages": "read", - "ChainGetMessage": "read", - "ChainGetMessagesInTipset": "read", - "ChainGetParentMessages": "read", - "ChainGetParentReceipts": "read", - "ChainGetPath": "read", - "ChainGetRandomnessFromBeacon": "read", - "ChainGetRandomnessFromTickets": "read", - "ChainGetTipSet": "read", - "ChainGetTipSetByHeight": "read", - "ChainHasObj": "read", - "ChainHead": "read", - "ChainNotify": "read", - "ChainReadObj": "read", - "ChainSetHead": "admin", - "ChainStatObj": "read", - "ChainTipSetWeight": "read", - "GasEstimateFeeCap": "read", - "GasEstimateGasLimit": "read", - "GasEstimateGasPremium": "read", - "GasEstimateMessageGas": "read", - "MinerCreateBlock": "write", - "MinerGetBaseInfo": "read", - "MpoolBatchPush": "write", - "MpoolBatchPushMessage": "sign", - "MpoolBatchPushUntrusted": "write", - "MpoolClear": "write", - "MpoolGetConfig": "read", - "MpoolGetNonce": "read", - "MpoolPending": "read", - "MpoolPush": "write", - "MpoolPushMessage": "sign", - "MpoolPushUntrusted": "write", - "MpoolSelect": "read", - "MpoolSetConfig": "admin", - "MpoolSub": "read", - "MsigAddApprove": "sign", - "MsigAddCancel": "sign", - "MsigAddPropose": "sign", - "MsigApprove": "sign", - "MsigCancel": "sign", - "MsigCreate": "sign", - "MsigGetVested": "read", - "MsigPropose": "sign", - "MsigRemoveSigner": "sign", - "MsigSwapApprove": "sign", - "MsigSwapCancel": "sign", - "MsigSwapPropose": "sign", - "NetAddrsListen": "read", - "PaychAllocateLane": "sign", - "PaychAvailableFunds": "sign", - "PaychAvailableFundsByFromTo": "sign", - "PaychCollect": "sign", - "PaychGet": "sign", - "PaychGetWaitReady": "sign", - "PaychList": "read", - "PaychNewPayment": "sign", - "PaychSettle": "sign", - "PaychStatus": "read", - "PaychVoucherAdd": "write", - "PaychVoucherCheckSpendable": "read", - "PaychVoucherCheckValid": "read", - "PaychVoucherCreate": "sign", - "PaychVoucherList": "write", - "PaychVoucherSubmit": "sign", - "StateAccountKey": "read", - "StateCall": "read", - "StateCirculatingSupply": "read", - "StateDealProviderCollateralBounds": "read", - "StateGetActor": "read", - "StateGetReceipt": "read", - "StateListActors": "read", - "StateListMiners": "read", - "StateLookupID": "read", - "StateMarketBalance": "read", - "StateMarketDeals": "read", - "StateMarketParticipants": "read", - "StateMarketStorageDeal": "read", - "StateMinerActiveSectors": "read", - "StateMinerAvailableBalance": "read", - "StateMinerDeadlines": "read", - "StateMinerFaults": "read", - "StateMinerInfo": "read", - "StateMinerInitialPledgeCollateral": "read", - "StateMinerPartitions": "read", - "StateMinerPower": "read", - "StateMinerPreCommitDepositForPower": "read", - "StateMinerProvingDeadline": "read", - "StateMinerRecoveries": "read", - "StateMinerSectorAllocated": "read", - "StateMinerSectorCount": "read", - "StateMinerSectors": "read", - "StateNetworkName": "read", - "StateNetworkVersion": "read", - "StateSearchMsg": "read", - "StateSearchMsgLimited": "read", - "StateSectorExpiration": "read", - "StateSectorGetInfo": "read", - "StateSectorPartition": "read", - "StateSectorPreCommitInfo": "read", - "StateVMCirculatingSupplyInternal": "read", - "StateVerifiedClientStatus": "read", - "StateVerifiedRegistryRootKey": "read", - "StateVerifierStatus": "read", - "StateWaitMsg": "read", - "StateWaitMsgLimited": "read", - "SyncState": "read", - "SyncSubmitBlock": "write", - "Version": "read", - "WalletBalance": "read", - "WalletDefaultAddress": "write", - "WalletExport": "admin", - "WalletHas": "write", - "WalletImport": "admin", - "WalletSetDefault": "write", - "WalletSign": "sign", - "WalletSignMessage": "sign" - }, - "Extend": { - "BlockTime": "read", - "ChainGetReceipts": "read", - "ChainList": "read", - "ChainSyncHandleNewTipSet": "write", - "Concurrent": "read", - "ConfigGet": "read", - "ConfigSet": "admin", - "DAGCat": "read", - "DAGGetFileSize": "read", - "DAGGetNode": "read", - "DAGImportData": "write", - "GasBatchEstimateMessageGas": "read", - "GetActor": "read", - "GetEntry": "read", - "GetFullBlock": "read", - "GetParentStateRootActor": "read", - "HasPassword": "admin", - "ListActor": "read", - "LockWallet": "admin", - "MessageWait": "read", - "MpoolDeleteByAdress": "admin", - "MpoolPublishByAddr": "write", - "MpoolPublishMessage": "write", - "MpoolSelects": "read", - "MsigCancelTxnHash": "sign", - "NetworkConnect": "read", - "NetworkFindPeer": "read", - "NetworkFindProvidersAsync": "read", - "NetworkGetBandwidthStats": "admin", - "NetworkGetClosestPeers": "admin", - "NetworkGetPeerAddresses": "admin", - "NetworkGetPeerID": "admin", - "NetworkPeers": "read", - "ProtocolParameters": "read", - "ResolveToKeyAddr": "read", - "SetConcurrent": "admin", - "SetPassword": "admin", - "StateMinerSectorSize": "read", - "StateMinerWorkerAddress": "read", - "SyncerTracker": "read", - "UnLockWallet": "admin", - "Verify": "read", - "VerifyEntry": "read", - "WalletAddresses": "admin", - "WalletNewAddress": "write", - "WalletState": "admin" - }, - "Loss": { - "AuthVerify": "read", - "ChainGetGenesis": "read", - "ChainGetNode": "read", - "ClientCalcCommP": "write", - "ClientCancelDataTransfer": "write", - "ClientCancelRetrievalDeal": "write", - "ClientDataTransferUpdates": "write", - "ClientDealPieceCID": "read", - "ClientDealSize": "read", - "ClientFindData": "read", - "ClientGenCar": "write", - "ClientGetDealInfo": "read", - "ClientGetDealStatus": "read", - "ClientGetDealUpdates": "write", - "ClientGetRetrievalUpdates": "write", - "ClientHasLocal": "write", - "ClientImport": "admin", - "ClientListDataTransfers": "write", - "ClientListDeals": "write", - "ClientListImports": "write", - "ClientListRetrievals": "write", - "ClientMinerQueryOffer": "read", - "ClientQueryAsk": "read", - "ClientRemoveImport": "admin", - "ClientRestartDataTransfer": "write", - "ClientRetrieve": "admin", - "ClientRetrieveTryRestartInsufficientFunds": "write", - "ClientRetrieveWithEvents": "admin", - "ClientStartDeal": "admin", - "ClientStatelessDeal": "write", - "Closing": "read", - "CreateBackup": "admin", - "Discover": "read", - "ID": "read", - "LogAlerts": "admin", - "LogList": "write", - "LogSetLevel": "write", - "MarketAddBalance": "sign", - "MarketGetReserved": "sign", - "MarketReleaseFunds": "sign", - "MarketReserveFunds": "sign", - "MarketWithdraw": "sign", - "MsigApproveTxnHash": "sign", - "MsigGetAvailableBalance": "read", - "MsigGetPending": "read", - "MsigGetVestingSchedule": "read", - "NetAgentVersion": "read", - "NetAutoNatStatus": "read", - "NetBandwidthStats": "read", - "NetBandwidthStatsByPeer": "read", - "NetBandwidthStatsByProtocol": "read", - "NetBlockAdd": "admin", - "NetBlockList": "read", - "NetBlockRemove": "admin", - "NetConnect": "write", - "NetConnectedness": "read", - "NetDisconnect": "write", - "NetFindPeer": "read", - "NetPeerInfo": "read", - "NetPeers": "read", - "NetPubsubScores": "read", - "Session": "read", - "Shutdown": "admin", - "StateAllMinerFaults": "read", - "StateChangedActors": "read", - "StateCompute": "read", - "StateDecodeParams": "read", - "StateGetRandomnessFromBeacon": "read", - "StateGetRandomnessFromTickets": "read", - "StateListMessages": "read", - "StateReadState": "read", - "StateReplay": "read", - "SyncCheckBad": "read", - "SyncCheckpoint": "admin", - "SyncIncomingBlocks": "read", - "SyncMarkBad": "admin", - "SyncUnmarkAllBad": "admin", - "SyncUnmarkBad": "admin", - "SyncValidateTipset": "read", - "WalletDelete": "admin", - "WalletList": "write", - "WalletNew": "write", - "WalletValidateAddress": "read", - "WalletVerify": "read" - }, - "Gap": {} - }, - "V1": { - "Common": { - "AuthNew": "admin", - "BeaconGetEntry": "read", - "ChainDeleteObj": "admin", - "ChainExport": "read", - "ChainGetBlock": "read", - "ChainGetBlockMessages": "read", - "ChainGetMessage": "read", - "ChainGetMessagesInTipset": "read", - "ChainGetParentMessages": "read", - "ChainGetParentReceipts": "read", - "ChainGetPath": "read", - "ChainGetTipSet": "read", - "ChainGetTipSetAfterHeight": "read", - "ChainGetTipSetByHeight": "read", - "ChainHasObj": "read", - "ChainHead": "read", - "ChainNotify": "read", - "ChainReadObj": "read", - "ChainSetHead": "admin", - "ChainStatObj": "read", - "ChainTipSetWeight": "read", - "GasEstimateFeeCap": "read", - "GasEstimateGasLimit": "read", - "GasEstimateGasPremium": "read", - "GasEstimateMessageGas": "read", - "MinerCreateBlock": "write", - "MinerGetBaseInfo": "read", - "MpoolBatchPush": "write", - "MpoolBatchPushMessage": "sign", - "MpoolBatchPushUntrusted": "write", - "MpoolCheckMessages": "read", - "MpoolCheckPendingMessages": "read", - "MpoolCheckReplaceMessages": "read", - "MpoolClear": "write", - "MpoolGetConfig": "read", - "MpoolGetNonce": "read", - "MpoolPending": "read", - "MpoolPush": "write", - "MpoolPushMessage": "sign", - "MpoolPushUntrusted": "write", - "MpoolSelect": "read", - "MpoolSetConfig": "admin", - "MpoolSub": "read", - "MsigAddApprove": "sign", - "MsigAddCancel": "sign", - "MsigAddPropose": "sign", - "MsigApprove": "sign", - "MsigApproveTxnHash": "sign", - "MsigCancel": "sign", - "MsigCreate": "sign", - "MsigGetVested": "read", - "MsigPropose": "sign", - "MsigRemoveSigner": "sign", - "MsigSwapApprove": "sign", - "MsigSwapCancel": "sign", - "MsigSwapPropose": "sign", - "NetAddrsListen": "read", - "PaychAllocateLane": "sign", - "PaychAvailableFunds": "sign", - "PaychAvailableFundsByFromTo": "sign", - "PaychCollect": "sign", - "PaychGet": "sign", - "PaychGetWaitReady": "sign", - "PaychList": "read", - "PaychNewPayment": "sign", - "PaychSettle": "sign", - "PaychStatus": "read", - "PaychVoucherAdd": "write", - "PaychVoucherCheckSpendable": "read", - "PaychVoucherCheckValid": "read", - "PaychVoucherCreate": "sign", - "PaychVoucherList": "write", - "PaychVoucherSubmit": "sign", - "StateAccountKey": "read", - "StateCall": "read", - "StateCirculatingSupply": "read", - "StateDealProviderCollateralBounds": "read", - "StateGetActor": "read", - "StateGetRandomnessFromBeacon": "read", - "StateGetRandomnessFromTickets": "read", - "StateListActors": "read", - "StateListMiners": "read", - "StateLookupID": "read", - "StateMarketBalance": "read", - "StateMarketDeals": "read", - "StateMarketParticipants": "read", - "StateMarketStorageDeal": "read", - "StateMinerActiveSectors": "read", - "StateMinerAvailableBalance": "read", - "StateMinerDeadlines": "read", - "StateMinerFaults": "read", - "StateMinerInfo": "read", - "StateMinerInitialPledgeCollateral": "read", - "StateMinerPartitions": "read", - "StateMinerPower": "read", - "StateMinerPreCommitDepositForPower": "read", - "StateMinerProvingDeadline": "read", - "StateMinerRecoveries": "read", - "StateMinerSectorAllocated": "read", - "StateMinerSectorCount": "read", - "StateMinerSectors": "read", - "StateNetworkName": "read", - "StateNetworkVersion": "read", - "StateSearchMsg": "read", - "StateSectorExpiration": "read", - "StateSectorGetInfo": "read", - "StateSectorPartition": "read", - "StateSectorPreCommitInfo": "read", - "StateVMCirculatingSupplyInternal": "read", - "StateVerifiedClientStatus": "read", - "StateVerifiedRegistryRootKey": "read", - "StateVerifierStatus": "read", - "StateWaitMsg": "read", - "SyncState": "read", - "SyncSubmitBlock": "write", - "Version": "read", - "WalletBalance": "read", - "WalletDefaultAddress": "write", - "WalletExport": "admin", - "WalletHas": "write", - "WalletImport": "admin", - "WalletSetDefault": "write", - "WalletSign": "sign", - "WalletSignMessage": "sign" - }, - "Extend": { - "BlockTime": "read", - "ChainGetRandomnessFromBeacon": "read", - "ChainGetRandomnessFromTickets": "read", - "ChainGetReceipts": "read", - "ChainList": "read", - "ChainSyncHandleNewTipSet": "write", - "Concurrent": "read", - "ConfigGet": "read", - "ConfigSet": "admin", - "DAGCat": "read", - "DAGGetFileSize": "read", - "DAGGetNode": "read", - "DAGImportData": "write", - "GasBatchEstimateMessageGas": "read", - "GetActor": "read", - "GetEntry": "read", - "GetFullBlock": "read", - "GetParentStateRootActor": "read", - "HasPassword": "admin", - "ListActor": "read", - "LockWallet": "admin", - "MessageWait": "read", - "MpoolDeleteByAdress": "admin", - "MpoolPublishByAddr": "write", - "MpoolPublishMessage": "write", - "MpoolSelects": "read", - "NetworkConnect": "read", - "NetworkFindPeer": "read", - "NetworkFindProvidersAsync": "read", - "NetworkGetBandwidthStats": "admin", - "NetworkGetClosestPeers": "read", - "NetworkGetPeerAddresses": "admin", - "NetworkGetPeerID": "admin", - "NetworkPeers": "read", - "ProtocolParameters": "read", - "ResolveToKeyAddr": "read", - "SetConcurrent": "admin", - "SetPassword": "admin", - "StateMinerSectorSize": "read", - "StateMinerWorkerAddress": "read", - "SyncerTracker": "read", - "UnLockWallet": "admin", - "Verify": "read", - "VerifyEntry": "read", - "WalletAddresses": "admin", - "WalletNewAddress": "write", - "WalletState": "admin" - }, - "Loss": { - "AuthVerify": "read", - "ChainBlockstoreInfo": "read", - "ChainCheckBlockstore": "admin", - "ChainGetGenesis": "read", - "ChainGetNode": "read", - "ClientCalcCommP": "write", - "ClientCancelDataTransfer": "write", - "ClientCancelRetrievalDeal": "write", - "ClientDataTransferUpdates": "write", - "ClientDealPieceCID": "read", - "ClientDealSize": "read", - "ClientExport": "admin", - "ClientFindData": "read", - "ClientGenCar": "write", - "ClientGetDealInfo": "read", - "ClientGetDealStatus": "read", - "ClientGetDealUpdates": "write", - "ClientGetRetrievalUpdates": "write", - "ClientHasLocal": "write", - "ClientImport": "admin", - "ClientListDataTransfers": "write", - "ClientListDeals": "write", - "ClientListImports": "write", - "ClientListRetrievals": "write", - "ClientMinerQueryOffer": "read", - "ClientQueryAsk": "read", - "ClientRemoveImport": "admin", - "ClientRestartDataTransfer": "write", - "ClientRetrieve": "admin", - "ClientRetrieveTryRestartInsufficientFunds": "write", - "ClientRetrieveWait": "admin", - "ClientStartDeal": "admin", - "ClientStatelessDeal": "write", - "Closing": "read", - "CreateBackup": "admin", - "Discover": "read", - "ID": "read", - "LogAlerts": "admin", - "LogList": "write", - "LogSetLevel": "write", - "MarketAddBalance": "sign", - "MarketGetReserved": "sign", - "MarketReleaseFunds": "sign", - "MarketReserveFunds": "sign", - "MarketWithdraw": "sign", - "MsigGetAvailableBalance": "read", - "MsigGetPending": "read", - "MsigGetVestingSchedule": "read", - "NetAgentVersion": "read", - "NetAutoNatStatus": "read", - "NetBandwidthStats": "read", - "NetBandwidthStatsByPeer": "read", - "NetBandwidthStatsByProtocol": "read", - "NetBlockAdd": "admin", - "NetBlockList": "read", - "NetBlockRemove": "admin", - "NetConnect": "write", - "NetConnectedness": "read", - "NetDisconnect": "write", - "NetFindPeer": "read", - "NetPeerInfo": "read", - "NetPeers": "read", - "NetPubsubScores": "read", - "NodeStatus": "read", - "Session": "read", - "Shutdown": "admin", - "StateAllMinerFaults": "read", - "StateChangedActors": "read", - "StateCompute": "read", - "StateDecodeParams": "read", - "StateEncodeParams": "read", - "StateListMessages": "read", - "StateReadState": "read", - "StateReplay": "read", - "SyncCheckBad": "read", - "SyncCheckpoint": "admin", - "SyncIncomingBlocks": "read", - "SyncMarkBad": "admin", - "SyncUnmarkAllBad": "admin", - "SyncUnmarkBad": "admin", - "SyncValidateTipset": "read", - "WalletDelete": "admin", - "WalletList": "write", - "WalletNew": "write", - "WalletValidateAddress": "read", - "WalletVerify": "read" - }, - "Gap": { - "MsigCancelTxnHash": "venus:read lotus:sign" - } - } -} \ No newline at end of file diff --git a/tools/gen_cbor/main.go b/tools/gen_cbor/main.go index 66c4de6828..10024b970a 100644 --- a/tools/gen_cbor/main.go +++ b/tools/gen_cbor/main.go @@ -26,21 +26,6 @@ func main() { panic(err) } - //if err := gen.WriteTupleEncodersToFile("./pkg/types/internal/cbor_gen.go", "internal", - // types.MessageReceipt{}, - // types.SignedMessage{}, - // types.TxMeta{}, - // types.UnsignedMessage{}, - // types.Actor{}, - // types.BeaconEntry{}, - // types.BlockHeader{}, - // types.Ticket{}, - // types.ElectionProof{}, - // types.BlockMsg{}, - //); err != nil { - // panic(err) - //} - if err := gen.WriteTupleEncodersToFile("./pkg/discovery/cbor_gen.go", "discovery", discovery.HelloMessage{}, discovery.LatencyMessage{}, @@ -48,12 +33,6 @@ func main() { panic(err) } - //if err := gen.WriteTupleEncodersToFile("./pkg/crypto/cbor_gen.go", "crypto", - // crypto.KeyInfo{}, - //); err != nil { - // panic(err) - //} - if err := gen.WriteTupleEncodersToFile("./pkg/vm/dispatch/cbor_gen.go", "dispatch", dispatch.SimpleParams{}, ); err != nil { From 347645aec90e64cf23951cbdeb2e7e866996cfec Mon Sep 17 00:00:00 2001 From: Caesar Wang Date: Thu, 20 Jan 2022 13:52:45 +0800 Subject: [PATCH 133/167] Feat/dtynn/refactor parts of the api compatible checks (#4734) --- Makefile | 2 +- venus-devtool/compatible/apis/checksum.go | 12 +- venus-devtool/compatible/apis/diff.go | 15 +- venus-devtool/compatible/apis/perm.go | 68 +++---- venus-devtool/util/api_meta.go | 59 ++++++ venus-devtool/util/interface.go | 23 ++- venus-shared/compatible-checks/api-diff.txt | 189 ++++++++++++++++++++ venus-shared/compatible-checks/api-perm.txt | 131 +++++++++----- 8 files changed, 394 insertions(+), 105 deletions(-) create mode 100644 venus-devtool/util/api_meta.go diff --git a/Makefile b/Makefile index 4538388885..cd061ebeb4 100644 --- a/Makefile +++ b/Makefile @@ -58,7 +58,7 @@ api-docs: compatible-all: compatible-api compatible-actor -compatible-api: api-checksum api-diff +compatible-api: api-checksum api-diff api-perm api-checksum: cd venus-devtool && go run ./compatible/apis/*.go checksum > ../venus-shared/compatible-checks/api-checksum.txt diff --git a/venus-devtool/compatible/apis/checksum.go b/venus-devtool/compatible/apis/checksum.go index 40c1051e0a..3ca79dcb3b 100644 --- a/venus-devtool/compatible/apis/checksum.go +++ b/venus-devtool/compatible/apis/checksum.go @@ -7,22 +7,18 @@ import ( "reflect" "strings" - "github.com/filecoin-project/lotus/api/v0api" - "github.com/filecoin-project/lotus/api/v1api" "github.com/urfave/cli/v2" + + "github.com/filecoin-project/venus/venus-devtool/util" ) var checksumCmd = &cli.Command{ Name: "checksum", Flags: []cli.Flag{}, Action: func(cctx *cli.Context) error { - wants := []reflect.Type{ - reflect.TypeOf((*v0api.FullNode)(nil)).Elem(), - reflect.TypeOf((*v1api.FullNode)(nil)).Elem(), - } - var buf bytes.Buffer - for _, rt := range wants { + for _, pair := range util.APIPairs { + rt := pair.Lotus.Type fmt.Printf("%s:\n", rt) for mi := 0; mi < rt.NumMethod(); mi++ { buf.Reset() diff --git a/venus-devtool/compatible/apis/diff.go b/venus-devtool/compatible/apis/diff.go index 5fd2782c30..a45a2a4114 100644 --- a/venus-devtool/compatible/apis/diff.go +++ b/venus-devtool/compatible/apis/diff.go @@ -5,26 +5,19 @@ import ( "reflect" "sort" - "github.com/filecoin-project/lotus/api/v1api" "github.com/urfave/cli/v2" - "github.com/filecoin-project/venus/venus-shared/api/chain/v1" "github.com/filecoin-project/venus/venus-shared/typeutil" + + "github.com/filecoin-project/venus/venus-devtool/util" ) var diffCmd = &cli.Command{ Name: "diff", Flags: []cli.Flag{}, Action: func(cctx *cli.Context) error { - pairs := [][2]reflect.Type{ - { - reflect.TypeOf((*v1.FullNode)(nil)).Elem(), - reflect.TypeOf((*v1api.FullNode)(nil)).Elem(), - }, - } - - for _, pair := range pairs { - showDiff(pair[0], pair[1]) + for _, pair := range util.APIPairs { + showDiff(pair.Venus.Type, pair.Lotus.Type) } return nil }, diff --git a/venus-devtool/compatible/apis/perm.go b/venus-devtool/compatible/apis/perm.go index ebd8232b50..9db33ca20d 100644 --- a/venus-devtool/compatible/apis/perm.go +++ b/venus-devtool/compatible/apis/perm.go @@ -14,50 +14,44 @@ var permCmd = &cli.Command{ Name: "perm", Flags: []cli.Flag{}, Action: func(cctx *cli.Context) error { - originMetas, err := parsePermMetas(permOption{ - importPath: "github.com/filecoin-project/lotus/api", - }) - if err != nil { - log.Fatalln("parse lotus api interfaces:", err) - } - - targetMetas, err := parsePermMetas(permOption{ - importPath: "github.com/filecoin-project/venus/venus-shared/api/chain/v1", - }) - if err != nil { - log.Fatalln("parse venus chain api interfaces:", err) - } + for _, pair := range util.APIPairs { + originMetas, err := parsePermMetas(pair.Lotus.ParseOpt) + if err != nil { + log.Fatalln("parse lotus api interfaces:", err) + } - originMap := map[string]permMeta{} - for _, om := range originMetas { - if om.perm != "" { - originMap[om.meth] = om + targetMetas, err := parsePermMetas(pair.Venus.ParseOpt) + if err != nil { + log.Fatalln("parse venus chain api interfaces:", err) } - } - for _, tm := range targetMetas { - om, has := originMap[tm.meth] - if !has { - fmt.Printf("%s.%s: %s <> N/A\n", tm.iface, tm.meth, tm.perm) - continue + originMap := map[string]permMeta{} + for _, om := range originMetas { + if om.perm != "" { + originMap[om.meth] = om + } } - if tm.perm != om.perm { - fmt.Printf("%s.%s: %s <> %s.%s: %s\n", tm.iface, tm.meth, tm.perm, om.iface, om.meth, om.perm) + fmt.Printf("v%d: %s <> %s\n", pair.Ver, pair.Venus.ParseOpt.ImportPath, pair.Lotus.ParseOpt.ImportPath) + for _, tm := range targetMetas { + om, has := originMap[tm.meth] + if !has { + fmt.Printf("\t- %s.%s\n", tm.iface, tm.meth) + continue + } + + if tm.perm != om.perm { + fmt.Printf("\t> %s.%s: %s <> %s.%s: %s\n", tm.iface, tm.meth, tm.perm, om.iface, om.meth, om.perm) + } } - } - fmt.Println() + fmt.Println() + } return nil }, } -type permOption struct { - importPath string - excluded map[string]struct{} -} - type permMeta struct { pkg string iface string @@ -65,21 +59,17 @@ type permMeta struct { perm string } -func parsePermMetas(opt permOption) ([]permMeta, error) { - ifaceMetas, err := util.ParseInterfaceMetas(opt.importPath) +func parsePermMetas(opt util.InterfaceParseOption) ([]permMeta, error) { + ifaceMetas, err := util.ParseInterfaceMetas(opt) if err != nil { return nil, err } var permMetas []permMeta for _, iface := range ifaceMetas { - if _, yes := opt.excluded[iface.Name]; yes { - continue - } - for _, ifMeth := range iface.Defined { permMetas = append(permMetas, permMeta{ - pkg: opt.importPath, + pkg: opt.ImportPath, iface: iface.Name, meth: ifMeth.Name, perm: getPerms(ifMeth), diff --git a/venus-devtool/util/api_meta.go b/venus-devtool/util/api_meta.go new file mode 100644 index 0000000000..5c7a5bed15 --- /dev/null +++ b/venus-devtool/util/api_meta.go @@ -0,0 +1,59 @@ +package util + +import ( + "reflect" + + "github.com/filecoin-project/lotus/api/v0api" + "github.com/filecoin-project/lotus/api/v1api" + + "github.com/filecoin-project/venus/venus-shared/api/chain/v0" + "github.com/filecoin-project/venus/venus-shared/api/chain/v1" +) + +var APIPairs = []struct { + Ver int + Lotus APIMeta + Venus APIMeta +}{ + { + Ver: 0, + Lotus: APIMeta{ + Type: reflect.TypeOf((*v0api.FullNode)(nil)).Elem(), + ParseOpt: InterfaceParseOption{ + ImportPath: "github.com/filecoin-project/lotus/api/v0api", + Included: []string{"FullNode", "Common", "Net"}, + }, + }, + Venus: APIMeta{ + Type: reflect.TypeOf((*v0.FullNode)(nil)).Elem(), + ParseOpt: InterfaceParseOption{ + ImportPath: "github.com/filecoin-project/venus/venus-shared/api/chain/v0", + IncludeAll: true, + }, + }, + }, + { + Ver: 1, + Lotus: APIMeta{ + Type: reflect.TypeOf((*v1api.FullNode)(nil)).Elem(), + ParseOpt: InterfaceParseOption{ + ImportPath: "github.com/filecoin-project/lotus/api", + Included: []string{"FullNode", "Common", "Net"}, + }, + }, + Venus: APIMeta{ + Type: reflect.TypeOf((*v1.FullNode)(nil)).Elem(), + ParseOpt: InterfaceParseOption{ + ImportPath: "github.com/filecoin-project/venus/venus-shared/api/chain/v1", + IncludeAll: true, + }, + }, + }, +} + +var LatestAPIPair = APIPairs[len(APIPairs)-1] + +type APIMeta struct { + Type reflect.Type + ParseOpt InterfaceParseOption +} diff --git a/venus-devtool/util/interface.go b/venus-devtool/util/interface.go index d7ffce6384..0c836a24a7 100644 --- a/venus-devtool/util/interface.go +++ b/venus-devtool/util/interface.go @@ -8,6 +8,12 @@ import ( "strings" ) +type InterfaceParseOption struct { + ImportPath string + IncludeAll bool + Included []string +} + type InterfaceMeta struct { Pkg string File string @@ -26,6 +32,8 @@ type InterfaceMethodMeta struct { type ifaceMetaVisitor struct { pname string fname string + included map[string]struct{} + includAll bool comments ast.CommentMap ifaces []*InterfaceMeta ifaceIdxes map[string]int @@ -42,6 +50,10 @@ func (iv *ifaceMetaVisitor) Visit(node ast.Node) ast.Visitor { return iv } + if _, yes := iv.included[st.Name.Name]; !yes && !iv.includAll { + return iv + } + ifaceIdx, ok := iv.ifaceIdxes[st.Name.Name] if !ok { ifaceIdx = len(iv.ifaces) @@ -72,8 +84,8 @@ func (iv *ifaceMetaVisitor) Visit(node ast.Node) ast.Visitor { return iv } -func ParseInterfaceMetas(importPath string) ([]*InterfaceMeta, error) { - location, err := FindLocationForImportPath(importPath) +func ParseInterfaceMetas(opt InterfaceParseOption) ([]*InterfaceMeta, error) { + location, err := FindLocationForImportPath(opt.ImportPath) if err != nil { return nil, err } @@ -86,6 +98,11 @@ func ParseInterfaceMetas(importPath string) ([]*InterfaceMeta, error) { var metas []*InterfaceMeta + included := map[string]struct{}{} + for _, one := range opt.Included { + included[one] = struct{}{} + } + for pname, pkg := range pkgs { if strings.HasSuffix(pname, "_test") { continue @@ -93,6 +110,8 @@ func ParseInterfaceMetas(importPath string) ([]*InterfaceMeta, error) { visitor := &ifaceMetaVisitor{ pname: pname, + included: included, + includAll: opt.IncludeAll, ifaceIdxes: map[string]int{}, } diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt index 55da15f9cf..65ccda5a44 100644 --- a/venus-shared/compatible-checks/api-diff.txt +++ b/venus-shared/compatible-checks/api-diff.txt @@ -1,3 +1,192 @@ +github.com/filecoin-project/venus/venus-shared/api/chain/v0.FullNode <> github.com/filecoin-project/lotus/api/v0api.FullNode: + - AuthVerify + + BlockTime + > ChainExport {[func(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []uint8, error) <> func(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []uint8, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - ChainGetGenesis + > ChainGetMessagesInTipset {[func(context.Context, types.TipSetKey) ([]types.MessageCID, error) <> func(context.Context, types.TipSetKey) ([]api.Message, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - ChainGetNode + > ChainGetPath {[func(context.Context, types.TipSetKey, types.TipSetKey) ([]*types.HeadChange, error) <> func(context.Context, types.TipSetKey, types.TipSetKey) ([]*api.HeadChange, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > ChainGetRandomnessFromBeacon {[func(context.Context, types.TipSetKey, crypto.DomainSeparationTag, abi.ChainEpoch, []uint8) (abi.Randomness, error) <> func(context.Context, types.TipSetKey, crypto.DomainSeparationTag, abi.ChainEpoch, []uint8) (abi.Randomness, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > ChainGetRandomnessFromTickets {[func(context.Context, types.TipSetKey, crypto.DomainSeparationTag, abi.ChainEpoch, []uint8) (abi.Randomness, error) <> func(context.Context, types.TipSetKey, crypto.DomainSeparationTag, abi.ChainEpoch, []uint8) (abi.Randomness, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + ChainGetReceipts + > ChainGetTipSet {[func(context.Context, types.TipSetKey) (*types.TipSet, error) <> func(context.Context, types.TipSetKey) (*types.TipSet, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > ChainGetTipSetByHeight {[func(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) <> func(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + ChainList + > ChainSetHead {[func(context.Context, types.TipSetKey) error <> func(context.Context, types.TipSetKey) error] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + ChainSyncHandleNewTipSet + > ChainTipSetWeight {[func(context.Context, types.TipSetKey) (big.Int, error) <> func(context.Context, types.TipSetKey) (big.Int, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - ClientCalcCommP + - ClientCancelDataTransfer + - ClientCancelRetrievalDeal + - ClientDataTransferUpdates + - ClientDealPieceCID + - ClientDealSize + - ClientFindData + - ClientGenCar + - ClientGetDealInfo + - ClientGetDealStatus + - ClientGetDealUpdates + - ClientGetRetrievalUpdates + - ClientHasLocal + - ClientImport + - ClientListDataTransfers + - ClientListDeals + - ClientListImports + - ClientListRetrievals + - ClientMinerQueryOffer + - ClientQueryAsk + - ClientRemoveImport + - ClientRestartDataTransfer + - ClientRetrieve + - ClientRetrieveTryRestartInsufficientFunds + - ClientRetrieveWithEvents + - ClientStartDeal + - ClientStatelessDeal + - Closing + + Concurrent + - CreateBackup + - Discover + + GasBatchEstimateMessageGas + > GasEstimateFeeCap {[func(context.Context, *internal.Message, int64, types.TipSetKey) (big.Int, error) <> func(context.Context, *types.Message, int64, types.TipSetKey) (big.Int, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > GasEstimateGasLimit {[func(context.Context, *internal.Message, types.TipSetKey) (int64, error) <> func(context.Context, *types.Message, types.TipSetKey) (int64, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > GasEstimateGasPremium {[func(context.Context, uint64, address.Address, int64, types.TipSetKey) (big.Int, error) <> func(context.Context, uint64, address.Address, int64, types.TipSetKey) (big.Int, error)] base=func in type: #4 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > GasEstimateMessageGas {[func(context.Context, *internal.Message, *types.MessageSendSpec, types.TipSetKey) (*internal.Message, error) <> func(context.Context, *types.Message, *api.MessageSendSpec, types.TipSetKey) (*types.Message, error)] base=func in type: #2 input; nested={[*types.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[types.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[types.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} + + GetActor + + GetEntry + + GetFullBlock + + GetParentStateRootActor + + HasPassword + - ID + + ListActor + + LockWallet + - LogAlerts + - LogList + - LogSetLevel + - MarketAddBalance + - MarketGetReserved + - MarketReleaseFunds + - MarketReserveFunds + - MarketWithdraw + + MessageWait + > MinerCreateBlock {[func(context.Context, *types.BlockTemplate) (*types.BlockMsg, error) <> func(context.Context, *api.BlockTemplate) (*types.BlockMsg, error)] base=func in type: #1 input; nested={[*types.BlockTemplate <> *api.BlockTemplate] base=pointed type; nested={[types.BlockTemplate <> api.BlockTemplate] base=struct field; nested={[types.BlockTemplate <> api.BlockTemplate] base=exported field type: #1 field named Parents; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}}}}} + > MinerGetBaseInfo {[func(context.Context, address.Address, abi.ChainEpoch, types.TipSetKey) (*types.MiningBaseInfo, error) <> func(context.Context, address.Address, abi.ChainEpoch, types.TipSetKey) (*api.MiningBaseInfo, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > MpoolBatchPushMessage {[func(context.Context, []*internal.Message, *types.MessageSendSpec) ([]*types.SignedMessage, error) <> func(context.Context, []*types.Message, *api.MessageSendSpec) ([]*types.SignedMessage, error)] base=func in type: #2 input; nested={[*types.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[types.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[types.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} + + MpoolDeleteByAdress + > MpoolPending {[func(context.Context, types.TipSetKey) ([]*types.SignedMessage, error) <> func(context.Context, types.TipSetKey) ([]*types.SignedMessage, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + MpoolPublishByAddr + + MpoolPublishMessage + > MpoolPushMessage {[func(context.Context, *internal.Message, *types.MessageSendSpec) (*types.SignedMessage, error) <> func(context.Context, *types.Message, *api.MessageSendSpec) (*types.SignedMessage, error)] base=func in type: #2 input; nested={[*types.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[types.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[types.MessageSendSpec <> api.MessageSendSpec] base=exported fields count: 2 != 1; nested=nil}}}} + > MpoolSelect {[func(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) <> func(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + MpoolSelects + > MsigCancel {[func(context.Context, address.Address, uint64, address.Address) (cid.Cid, error) <> func(context.Context, address.Address, uint64, address.Address, big.Int, address.Address, uint64, []uint8) (cid.Cid, error)] base=func in num: 4 != 8; nested=nil} + + MsigCancelTxnHash + - MsigGetAvailableBalance + - MsigGetPending + > MsigGetVested {[func(context.Context, address.Address, types.TipSetKey, types.TipSetKey) (big.Int, error) <> func(context.Context, address.Address, types.TipSetKey, types.TipSetKey) (big.Int, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - MsigGetVestingSchedule + - NetAgentVersion + - NetAutoNatStatus + - NetBandwidthStats + - NetBandwidthStatsByPeer + - NetBandwidthStatsByProtocol + - NetBlockAdd + - NetBlockList + - NetBlockRemove + - NetConnect + - NetConnectedness + - NetDisconnect + - NetFindPeer + - NetPeerInfo + - NetPeers + - NetPubsubScores + + NetworkConnect + + NetworkFindPeer + + NetworkFindProvidersAsync + + NetworkGetBandwidthStats + + NetworkGetClosestPeers + + NetworkGetPeerAddresses + + NetworkGetPeerID + + NetworkPeers + + ProtocolParameters + + ResolveToKeyAddr + - Session + + SetConcurrent + + SetPassword + - Shutdown + > StateAccountKey {[func(context.Context, address.Address, types.TipSetKey) (address.Address, error) <> func(context.Context, address.Address, types.TipSetKey) (address.Address, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateAllMinerFaults + > StateCall {[func(context.Context, *internal.Message, types.TipSetKey) (*types.InvocResult, error) <> func(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateChangedActors + > StateCirculatingSupply {[func(context.Context, types.TipSetKey) (big.Int, error) <> func(context.Context, types.TipSetKey) (big.Int, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateCompute + > StateDealProviderCollateralBounds {[func(context.Context, abi.PaddedPieceSize, bool, types.TipSetKey) (types.DealCollateralBounds, error) <> func(context.Context, abi.PaddedPieceSize, bool, types.TipSetKey) (api.DealCollateralBounds, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateDecodeParams + > StateGetActor {[func(context.Context, address.Address, types.TipSetKey) (*internal.Actor, error) <> func(context.Context, address.Address, types.TipSetKey) (*types.Actor, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateGetRandomnessFromBeacon + - StateGetRandomnessFromTickets + > StateGetReceipt {[func(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error) <> func(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateListActors {[func(context.Context, types.TipSetKey) ([]address.Address, error) <> func(context.Context, types.TipSetKey) ([]address.Address, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateListMessages + > StateListMiners {[func(context.Context, types.TipSetKey) ([]address.Address, error) <> func(context.Context, types.TipSetKey) ([]address.Address, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateLookupID {[func(context.Context, address.Address, types.TipSetKey) (address.Address, error) <> func(context.Context, address.Address, types.TipSetKey) (address.Address, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMarketBalance {[func(context.Context, address.Address, types.TipSetKey) (types.MarketBalance, error) <> func(context.Context, address.Address, types.TipSetKey) (api.MarketBalance, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMarketDeals {[func(context.Context, types.TipSetKey) (map[string]types.MarketDeal, error) <> func(context.Context, types.TipSetKey) (map[string]api.MarketDeal, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMarketParticipants {[func(context.Context, types.TipSetKey) (map[string]types.MarketBalance, error) <> func(context.Context, types.TipSetKey) (map[string]api.MarketBalance, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMarketStorageDeal {[func(context.Context, abi.DealID, types.TipSetKey) (*types.MarketDeal, error) <> func(context.Context, abi.DealID, types.TipSetKey) (*api.MarketDeal, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerActiveSectors {[func(context.Context, address.Address, types.TipSetKey) ([]*miner.SectorOnChainInfo, error) <> func(context.Context, address.Address, types.TipSetKey) ([]*miner.SectorOnChainInfo, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerAvailableBalance {[func(context.Context, address.Address, types.TipSetKey) (big.Int, error) <> func(context.Context, address.Address, types.TipSetKey) (big.Int, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerDeadlines {[func(context.Context, address.Address, types.TipSetKey) ([]types.Deadline, error) <> func(context.Context, address.Address, types.TipSetKey) ([]api.Deadline, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerFaults {[func(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error) <> func(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerInfo {[func(context.Context, address.Address, types.TipSetKey) (miner.MinerInfo, error) <> func(context.Context, address.Address, types.TipSetKey) (miner.MinerInfo, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerInitialPledgeCollateral {[func(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (big.Int, error) <> func(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (big.Int, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerPartitions {[func(context.Context, address.Address, uint64, types.TipSetKey) ([]types.Partition, error) <> func(context.Context, address.Address, uint64, types.TipSetKey) ([]api.Partition, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerPower {[func(context.Context, address.Address, types.TipSetKey) (*types.MinerPower, error) <> func(context.Context, address.Address, types.TipSetKey) (*api.MinerPower, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerPreCommitDepositForPower {[func(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (big.Int, error) <> func(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (big.Int, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerProvingDeadline {[func(context.Context, address.Address, types.TipSetKey) (*dline.Info, error) <> func(context.Context, address.Address, types.TipSetKey) (*dline.Info, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerRecoveries {[func(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error) <> func(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerSectorAllocated {[func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (bool, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (bool, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateMinerSectorCount {[func(context.Context, address.Address, types.TipSetKey) (types.MinerSectors, error) <> func(context.Context, address.Address, types.TipSetKey) (api.MinerSectors, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + StateMinerSectorSize + > StateMinerSectors {[func(context.Context, address.Address, *bitfield.BitField, types.TipSetKey) ([]*miner.SectorOnChainInfo, error) <> func(context.Context, address.Address, *bitfield.BitField, types.TipSetKey) ([]*miner.SectorOnChainInfo, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + + StateMinerWorkerAddress + > StateNetworkVersion {[func(context.Context, types.TipSetKey) (network.Version, error) <> func(context.Context, types.TipSetKey) (network.Version, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + - StateReadState + - StateReplay + > StateSearchMsg {[func(context.Context, cid.Cid) (*types.MsgLookup, error) <> func(context.Context, cid.Cid) (*api.MsgLookup, error)] base=func out type: #0 input; nested={[*types.MsgLookup <> *api.MsgLookup] base=pointed type; nested={[types.MsgLookup <> api.MsgLookup] base=struct field; nested={[types.MsgLookup <> api.MsgLookup] base=exported field type: #3 field named TipSet; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}}}}} + > StateSearchMsgLimited {[func(context.Context, cid.Cid, abi.ChainEpoch) (*types.MsgLookup, error) <> func(context.Context, cid.Cid, abi.ChainEpoch) (*api.MsgLookup, error)] base=func out type: #0 input; nested={[*types.MsgLookup <> *api.MsgLookup] base=pointed type; nested={[types.MsgLookup <> api.MsgLookup] base=struct field; nested={[types.MsgLookup <> api.MsgLookup] base=exported field type: #3 field named TipSet; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}}}}} + > StateSectorExpiration {[func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorExpiration, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorExpiration, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateSectorGetInfo {[func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorOnChainInfo, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorOnChainInfo, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateSectorPartition {[func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorLocation, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorLocation, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateSectorPreCommitInfo {[func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) <> func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error)] base=func in type: #3 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateVMCirculatingSupplyInternal {[func(context.Context, types.TipSetKey) (types.CirculatingSupply, error) <> func(context.Context, types.TipSetKey) (api.CirculatingSupply, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateVerifiedClientStatus {[func(context.Context, address.Address, types.TipSetKey) (*big.Int, error) <> func(context.Context, address.Address, types.TipSetKey) (*big.Int, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateVerifiedRegistryRootKey {[func(context.Context, types.TipSetKey) (address.Address, error) <> func(context.Context, types.TipSetKey) (address.Address, error)] base=func in type: #1 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateVerifierStatus {[func(context.Context, address.Address, types.TipSetKey) (*big.Int, error) <> func(context.Context, address.Address, types.TipSetKey) (*big.Int, error)] base=func in type: #2 input; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}} + > StateWaitMsg {[func(context.Context, cid.Cid, uint64) (*types.MsgLookup, error) <> func(context.Context, cid.Cid, uint64) (*api.MsgLookup, error)] base=func out type: #0 input; nested={[*types.MsgLookup <> *api.MsgLookup] base=pointed type; nested={[types.MsgLookup <> api.MsgLookup] base=struct field; nested={[types.MsgLookup <> api.MsgLookup] base=exported field type: #3 field named TipSet; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}}}}} + > StateWaitMsgLimited {[func(context.Context, cid.Cid, uint64, abi.ChainEpoch) (*types.MsgLookup, error) <> func(context.Context, cid.Cid, uint64, abi.ChainEpoch) (*api.MsgLookup, error)] base=func out type: #0 input; nested={[*types.MsgLookup <> *api.MsgLookup] base=pointed type; nested={[types.MsgLookup <> api.MsgLookup] base=struct field; nested={[types.MsgLookup <> api.MsgLookup] base=exported field type: #3 field named TipSet; nested={[types.TipSetKey <> types.TipSetKey] base=codec marshaler implementations for codec Cbor: true != false; nested=nil}}}}} + - SyncCheckBad + - SyncCheckpoint + - SyncIncomingBlocks + - SyncMarkBad + - SyncUnmarkAllBad + - SyncUnmarkBad + - SyncValidateTipset + + SyncerTracker + + UnLockWallet + + Verify + + VerifyEntry + > Version {[func(context.Context) (types.Version, error) <> func(context.Context) (api.APIVersion, error)] base=func out type: #0 input; nested={[types.Version <> api.APIVersion] base=struct field; nested={[types.Version <> api.APIVersion] base=exported fields count: 2 != 3; nested=nil}}} + + WalletAddresses + - WalletDelete + > WalletExport {[func(context.Context, address.Address, string) (*types.KeyInfo, error) <> func(context.Context, address.Address) (*types.KeyInfo, error)] base=func in num: 3 != 2; nested=nil} + - WalletList + - WalletNew + + WalletNewAddress + > WalletSign {[func(context.Context, address.Address, []uint8, types.MsgMeta) (*crypto.Signature, error) <> func(context.Context, address.Address, []uint8) (*crypto.Signature, error)] base=func in num: 4 != 3; nested=nil} + + WalletState + - WalletValidateAddress + - WalletVerify + github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.com/filecoin-project/lotus/api.FullNode: - AuthVerify + BlockTime diff --git a/venus-shared/compatible-checks/api-perm.txt b/venus-shared/compatible-checks/api-perm.txt index 18dff3a899..323f77896e 100644 --- a/venus-shared/compatible-checks/api-perm.txt +++ b/venus-shared/compatible-checks/api-perm.txt @@ -1,45 +1,88 @@ -IActor.ListActor: read <> N/A -IChainInfo.BlockTime: read <> N/A -IChainInfo.ChainGetRandomnessFromBeacon: read <> N/A -IChainInfo.ChainGetRandomnessFromTickets: read <> N/A -IChainInfo.ChainGetReceipts: read <> N/A -IChainInfo.ChainList: read <> N/A -IChainInfo.GetActor: read <> N/A -IChainInfo.GetEntry: read <> N/A -IChainInfo.GetFullBlock: read <> N/A -IChainInfo.GetParentStateRootActor: read <> N/A -IChainInfo.MessageWait: read <> N/A -IChainInfo.ProtocolParameters: read <> N/A -IChainInfo.ResolveToKeyAddr: read <> N/A -IChainInfo.VerifyEntry: read <> N/A -IMinerState.StateMinerSectorSize: read <> N/A -IMinerState.StateMinerWorkerAddress: read <> N/A -IJwtAuthAPI.Verify: read <> N/A -IMessagePool.GasBatchEstimateMessageGas: read <> N/A -IMessagePool.MpoolDeleteByAdress: admin <> N/A -IMessagePool.MpoolPublishByAddr: write <> N/A -IMessagePool.MpoolPublishMessage: write <> N/A -IMessagePool.MpoolSelects: read <> N/A -INetwork.NetworkConnect: read <> N/A -INetwork.NetworkFindPeer: read <> N/A -INetwork.NetworkFindProvidersAsync: read <> N/A -INetwork.NetworkGetBandwidthStats: admin <> N/A -INetwork.NetworkGetClosestPeers: read <> N/A -INetwork.NetworkGetPeerAddresses: admin <> N/A -INetwork.NetworkGetPeerID: admin <> N/A -INetwork.NetworkPeers: read <> N/A -INetwork.Version: read <> Worker.Version: admin -ISyncer.ChainSyncHandleNewTipSet: write <> N/A -ISyncer.Concurrent: read <> N/A -ISyncer.SetConcurrent: admin <> N/A -ISyncer.SyncerTracker: read <> N/A -IWallet.HasPassword: admin <> N/A -IWallet.LockWallet: admin <> N/A -IWallet.SetPassword: admin <> N/A -IWallet.UnLockWallet: admin <> N/A -IWallet.WalletAddresses: admin <> N/A -IWallet.WalletHas: write <> Wallet.WalletHas: admin -IWallet.WalletNewAddress: write <> N/A -IWallet.WalletSign: sign <> Wallet.WalletSign: admin -IWallet.WalletState: admin <> N/A +v0: github.com/filecoin-project/venus/venus-shared/api/chain/v0 <> github.com/filecoin-project/lotus/api/v0api + - IActor.ListActor + - IChainInfo.BlockTime + - IChainInfo.ChainGetReceipts + - IChainInfo.ChainList + - IChainInfo.GetActor + - IChainInfo.GetEntry + - IChainInfo.GetFullBlock + - IChainInfo.GetParentStateRootActor + - IChainInfo.MessageWait + - IChainInfo.ProtocolParameters + - IChainInfo.ResolveToKeyAddr + - IChainInfo.VerifyEntry + - IMinerState.StateMinerSectorSize + - IMinerState.StateMinerWorkerAddress + - IJwtAuthAPI.AuthNew + - IJwtAuthAPI.Verify + - IMessagePool.GasBatchEstimateMessageGas + - IMessagePool.MpoolDeleteByAdress + - IMessagePool.MpoolPublishByAddr + - IMessagePool.MpoolPublishMessage + - IMessagePool.MpoolSelects + - IMultiSig.MsigCancelTxnHash + - INetwork.NetAddrsListen + - INetwork.NetworkConnect + - INetwork.NetworkFindPeer + - INetwork.NetworkFindProvidersAsync + - INetwork.NetworkGetBandwidthStats + - INetwork.NetworkGetClosestPeers + - INetwork.NetworkGetPeerAddresses + - INetwork.NetworkGetPeerID + - INetwork.NetworkPeers + - INetwork.Version + - ISyncer.ChainSyncHandleNewTipSet + - ISyncer.Concurrent + - ISyncer.SetConcurrent + - ISyncer.SyncerTracker + - IWallet.HasPassword + - IWallet.LockWallet + - IWallet.SetPassword + - IWallet.UnLockWallet + - IWallet.WalletAddresses + - IWallet.WalletNewAddress + - IWallet.WalletState + +v1: github.com/filecoin-project/venus/venus-shared/api/chain/v1 <> github.com/filecoin-project/lotus/api + - IActor.ListActor + - IChainInfo.BlockTime + - IChainInfo.ChainGetRandomnessFromBeacon + - IChainInfo.ChainGetRandomnessFromTickets + - IChainInfo.ChainGetReceipts + - IChainInfo.ChainList + - IChainInfo.GetActor + - IChainInfo.GetEntry + - IChainInfo.GetFullBlock + - IChainInfo.GetParentStateRootActor + - IChainInfo.MessageWait + - IChainInfo.ProtocolParameters + - IChainInfo.ResolveToKeyAddr + - IChainInfo.VerifyEntry + - IMinerState.StateMinerSectorSize + - IMinerState.StateMinerWorkerAddress + - IJwtAuthAPI.Verify + - IMessagePool.GasBatchEstimateMessageGas + - IMessagePool.MpoolDeleteByAdress + - IMessagePool.MpoolPublishByAddr + - IMessagePool.MpoolPublishMessage + - IMessagePool.MpoolSelects + - INetwork.NetworkConnect + - INetwork.NetworkFindPeer + - INetwork.NetworkFindProvidersAsync + - INetwork.NetworkGetBandwidthStats + - INetwork.NetworkGetClosestPeers + - INetwork.NetworkGetPeerAddresses + - INetwork.NetworkGetPeerID + - INetwork.NetworkPeers + - ISyncer.ChainSyncHandleNewTipSet + - ISyncer.Concurrent + - ISyncer.SetConcurrent + - ISyncer.SyncerTracker + - IWallet.HasPassword + - IWallet.LockWallet + - IWallet.SetPassword + - IWallet.UnLockWallet + - IWallet.WalletAddresses + - IWallet.WalletNewAddress + - IWallet.WalletState From cd70951f4d8dad93e4ca07506dba454fc0214f0c Mon Sep 17 00:00:00 2001 From: Caesar Wang Date: Sat, 22 Jan 2022 11:15:11 +0800 Subject: [PATCH 134/167] refactor: devtool: refactor api-gen & re-generate related codes (#4737) --- .github/workflows/baisc_checks.yml | 23 +- Makefile | 10 +- venus-devtool/api-gen/main.go | 26 + venus-devtool/api-gen/proxy.go | 364 +++++++ venus-devtool/api-gen/proxygen.go | 502 --------- venus-devtool/compatible/apis/checksum.go | 2 +- venus-devtool/compatible/apis/diff.go | 2 +- venus-devtool/compatible/apis/perm.go | 28 +- venus-devtool/util/api_meta.go | 26 +- venus-devtool/util/import.go | 44 +- venus-devtool/util/interface.go | 111 +- venus-shared/api/chain/v0/fullnode.go | 2 - venus-shared/api/chain/v0/proxy_gen.go | 1105 ++++++++------------ venus-shared/api/chain/v1/fullnode.go | 2 - venus-shared/api/chain/v1/proxy_gen.go | 1129 ++++++++------------- 15 files changed, 1368 insertions(+), 2008 deletions(-) create mode 100644 venus-devtool/api-gen/main.go create mode 100644 venus-devtool/api-gen/proxy.go delete mode 100644 venus-devtool/api-gen/proxygen.go diff --git a/.github/workflows/baisc_checks.yml b/.github/workflows/baisc_checks.yml index 5379d51a28..7c25ad1405 100644 --- a/.github/workflows/baisc_checks.yml +++ b/.github/workflows/baisc_checks.yml @@ -27,26 +27,15 @@ jobs: - name: tests-shared run: make test-venus-shared - - name: compatible-checks + - name: compatible all run: | make compatible-all - git --no-pager diff - git --no-pager diff --quiet - - name: check api docs + - name: gen all run: | - make api-docs - git --no-pager diff - git --no-pager diff --quiet + make gen-all - - name: check cbor-gen + - name: detect changes run: | - make cborgen - git --no-pager diff - git --no-pager diff --quiet - - - name: check mock pai - run: | - make mock-api-gen - git --no-pager diff - git --no-pager diff --quiet + git status --porcelain + test -z "$(git status --porcelain)" diff --git a/Makefile b/Makefile index cd061ebeb4..b6ac10a97b 100644 --- a/Makefile +++ b/Makefile @@ -24,6 +24,8 @@ clean: rm -rf ./extern/filecoin-ffi rm -rf ./extern/test-vectors +gen-all: cborgen gogen inline-gen api-gen api-docs-gen + gen-asset: go-bindata -pkg=asset -o ./fixtures/asset/asset.go ./fixtures/_assets/car/ ./fixtures/_assets/proof-params/ ./fixtures/_assets/arch-diagram.monopic gofmt -s -l -w ./fixtures/asset/asset.go @@ -45,14 +47,12 @@ inline-gen: test-venus-shared: cd venus-shared && go test -covermode=set ./... -gen-api: - cd ./venus-devtool/ && go run ./api-gen/ - gofmt -s -l -w ./venus-shared/api/chain/v0/proxy_gen.go; - gofmt -s -l -w ./venus-shared/api/chain/v1/proxy_gen.go +api-gen: + cd ./venus-devtool/ && go run ./api-gen/ proxy v0APIDoc = ../venus-shared/api/v0-api-document.md v1APIDoc = ../venus-shared/api/v1-api-document.md -api-docs: +api-docs-gen: cd ./venus-devtool/ && go run ./api-docs-gen/cmd ../venus-shared/api/chain/v0/fullnode.go FullNode v0 ../venus-shared/api/chain/v0 $(v0APIDoc) cd ./venus-devtool/ && go run ./api-docs-gen/cmd ../venus-shared/api/chain/v1/fullnode.go FullNode v1 ../venus-shared/api/chain/v1 $(v1APIDoc) diff --git a/venus-devtool/api-gen/main.go b/venus-devtool/api-gen/main.go new file mode 100644 index 0000000000..21ed0d0df7 --- /dev/null +++ b/venus-devtool/api-gen/main.go @@ -0,0 +1,26 @@ +package main + +import ( + "fmt" + "os" + + "github.com/urfave/cli/v2" +) + +func main() { + app := &cli.App{ + Name: "api-gen", + Usage: "generate api related codes for venus-shared", + EnableBashCompletion: true, + Flags: []cli.Flag{}, + Commands: []*cli.Command{ + proxyCmd, + }, + } + + app.Setup() + + if err := app.Run(os.Args); err != nil { + fmt.Fprintf(os.Stderr, "ERR: %v\n", err) // nolint: errcheck + } +} diff --git a/venus-devtool/api-gen/proxy.go b/venus-devtool/api-gen/proxy.go new file mode 100644 index 0000000000..b1f92a7cbd --- /dev/null +++ b/venus-devtool/api-gen/proxy.go @@ -0,0 +1,364 @@ +package main + +import ( + "bytes" + "fmt" + "go/ast" + "go/format" + "go/printer" + "io" + "io/ioutil" + "log" + "path/filepath" + "strings" + + "github.com/urfave/cli/v2" + + "github.com/filecoin-project/venus/venus-devtool/util" +) + +func init() { + for _, capi := range util.ChainAPIPairs { + proxyTargets = append(proxyTargets, capi.Venus) + } +} + +var proxyTargets []util.APIMeta + +var proxyCmd = &cli.Command{ + Name: "proxy", + Flags: []cli.Flag{}, + Action: func(cctx *cli.Context) error { + for _, target := range proxyTargets { + err := genProxyForAPI(target) + if err != nil { + log.Fatalf("got error while generating proxy codes for %s: %s", target.Type, err) + } + } + return nil + }, +} + +func genProxyForAPI(t util.APIMeta) error { + opt := t.ParseOpt + opt.ResolveImports = true + ifaceMetas, astMeta, err := util.ParseInterfaceMetas(opt) + if err != nil { + return err + } + + ifaceMap := map[string]*util.InterfaceMeta{} + done := map[string]struct{}{} + deps := map[string]util.ImportMeta{} + + for i := range ifaceMetas { + ifaceMeta := ifaceMetas[i] + ifaceMap[ifaceMeta.Name] = ifaceMeta + } + + apiName := t.Type.Name() + api, has := ifaceMap[apiName] + if !has { + return fmt.Errorf("api %s not found", apiName) + } + + var contentBuffer bytes.Buffer + + err = writeForInterface(apiName, astMeta, ifaceMap, deps, done, &contentBuffer) + if err != nil { + return fmt.Errorf("gen for api interface %s: %w", apiName, err) + } + + var fileBuffer bytes.Buffer + + fmt.Fprintf(&fileBuffer, "// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT.\npackage %s\n\n", api.Pkg.Name) + + err = writeImports(deps, &fileBuffer) + if err != nil { + return fmt.Errorf("gen imports: %w", err) + } + + _, err = io.Copy(&fileBuffer, &contentBuffer) + if err != nil { + return fmt.Errorf("copy contents into output: %w", err) + } + + formatted, err := format.Source(fileBuffer.Bytes()) + if err != nil { + return fmt.Errorf("format source content: %w", err) + } + + outputFile := filepath.Join(astMeta.Location, "proxy_gen.go") + err = ioutil.WriteFile(outputFile, formatted, 0644) + if err != nil { + return fmt.Errorf("write to output %s: %w", outputFile, err) + } + + return nil +} + +func writeImports(deps map[string]util.ImportMeta, dst *bytes.Buffer) error { + imports := [3][][2]string{} + + for iname, imeta := range deps { + alias := "" + base := filepath.Base(imeta.Path) + if iname != base { + alias = iname + } + + imp := [2]string{alias, imeta.Path} + idx := 0 + if !imeta.IsStd { + idx++ + if strings.HasPrefix(imeta.Path, "github.com/filecoin-project/venus/") { + idx++ + } + } + + imports[idx] = append(imports[idx], imp) + + } + + fmt.Fprintln(dst, "import (") + for _, impGroup := range imports { + for _, imp := range impGroup { + _, err := fmt.Fprintf(dst, "\t%s \"%s\"\n", imp[0], imp[1]) + if err != nil { + return fmt.Errorf("write import for %#v: %w", imp, err) + } + } + + fmt.Fprintln(dst, "") + } + + fmt.Fprintln(dst, ")") + return nil +} + +func writeForInterface(name string, astMeta *util.ASTMeta, ifaces map[string]*util.InterfaceMeta, deps map[string]util.ImportMeta, done map[string]struct{}, dst *bytes.Buffer) error { + if _, has := done[name]; has { + return nil + } + + iface, has := ifaces[name] + if !has { + return fmt.Errorf("%s not found", name) + } + + for _, nested := range iface.Nested { + if err := writeForInterface(nested, astMeta, ifaces, deps, done, dst); err != nil { + return fmt.Errorf("gen nested interface for %s: %w", name, err) + } + } + + if err := writeStruct(dst, iface, astMeta); err != nil { + return fmt.Errorf("gen struct for %s: %w", name, err) + } + + if err := writeMethods(dst, iface, astMeta, deps); err != nil { + return fmt.Errorf("gen methods for %s: %w", name, err) + } + + done[name] = struct{}{} + return nil +} + +const ( + structHeadFormat = ` +type %s struct { +` + + structTail = ` +} + +` + + structInternalHead = ` + Internal struct { +` + + structInternalTail = ` + } +` +) + +func structName(ifaceName string) string { + return ifaceName + "Struct" +} + +func writeStruct(dst *bytes.Buffer, ifaceMeta *util.InterfaceMeta, astMeta *util.ASTMeta) error { + fmt.Fprintf(dst, structHeadFormat, structName(ifaceMeta.Name)) + + for _, nested := range ifaceMeta.Nested { + fmt.Fprintf(dst, "\t%s\n", structName(nested)) + } + + if len(ifaceMeta.Defined) > 0 { + fmt.Fprint(dst, structInternalHead) + + for _, meth := range ifaceMeta.Defined { + fmt.Fprintf(dst, "\t\t%s ", meth.Name) + + err := printer.Fprint(dst, astMeta.FileSet, meth.FuncType) + if err != nil { + return fmt.Errorf("write func %s: %w", meth.Name, err) + } + + fmt.Fprintf(dst, " `perm:\"%s\"`\n", util.GetAPIMethodPerm(meth)) + } + + fmt.Fprint(dst, structInternalTail) + } + + fmt.Fprint(dst, structTail) + return nil +} + +func writeMethods(dst *bytes.Buffer, ifaceMeta *util.InterfaceMeta, astMeta *util.ASTMeta, deps map[string]util.ImportMeta) error { + var typBuf bytes.Buffer + for _, meth := range ifaceMeta.Defined { + err := writeMethodBody(dst, &typBuf, ifaceMeta, meth, astMeta, deps) + if err != nil { + return fmt.Errorf("write method for %s.%s: %w", ifaceMeta.Name, meth.Name, err) + } + } + fmt.Fprintln(dst, "") + return nil +} + +func resolveDep(typ ast.Expr, ifaceMeta *util.InterfaceMeta, deps map[string]util.ImportMeta) error { + var selector *ast.SelectorExpr + + switch t := typ.(type) { + case *ast.Ident: + return nil + + case *ast.SelectorExpr: + selector = t + + case *ast.MapType: + if err := resolveDep(t.Key, ifaceMeta, deps); err != nil { + return fmt.Errorf("resolve key dep for type %T: %w", typ, err) + } + + if err := resolveDep(t.Value, ifaceMeta, deps); err != nil { + return fmt.Errorf("resolve value dep for type %T: %w", typ, err) + } + + return nil + + case *ast.ArrayType: + if err := resolveDep(t.Elt, ifaceMeta, deps); err != nil { + return fmt.Errorf("resolve element dep for type %T: %w", typ, err) + } + + return nil + + case *ast.ChanType: + if err := resolveDep(t.Value, ifaceMeta, deps); err != nil { + return fmt.Errorf("resolve chan value dep for type %T: %w", typ, err) + } + + return nil + + case *ast.StarExpr: + if err := resolveDep(t.X, ifaceMeta, deps); err != nil { + return fmt.Errorf("resolve ptr dep for type %T: %w", typ, err) + } + + return nil + + default: + return fmt.Errorf("found unexpected type: %T", typ) + } + + if selector == nil { + return fmt.Errorf("should be a *ast.SelectorExpr, found %T", typ) + } + + selector, ok := typ.(*ast.SelectorExpr) + if !ok { + return nil + } + + xident, ok := selector.X.(*ast.Ident) + if !ok || xident.Name == "" { + return nil + + } + + importMeta, has := ifaceMeta.File.Imports[xident.Name] + if !has { + return fmt.Errorf("package for selector %s not found in file %s", xident.Name, ifaceMeta.File.Name) + } + + prev, has := deps[xident.Name] + if !has { + deps[xident.Name] = importMeta + return nil + } + + if prev.Path != importMeta.Path { + return fmt.Errorf("found duplicate package name %s for %s and %s", xident.Name, prev.Path, importMeta.Path) + } + + return nil +} + +func writeMethodBody(dst *bytes.Buffer, typBuf *bytes.Buffer, ifaceMeta *util.InterfaceMeta, methMeta util.InterfaceMethodMeta, astMeta *util.ASTMeta, deps map[string]util.ImportMeta) error { + paramNum := 0 + callNames := []string{} + params := []string{} + for pi, paramList := range methMeta.FuncType.Params.List { + if err := resolveDep(paramList.Type, ifaceMeta, deps); err != nil { + return fmt.Errorf("resolve dep for #%d param: %w", pi, err) + } + + typBuf.Reset() + err := printer.Fprint(typBuf, astMeta.FileSet, paramList.Type) + if err != nil { + return fmt.Errorf("write #%d param type: %w", pi, err) + } + + nameCount := len(paramList.Names) + if nameCount == 0 { + nameCount = 1 + } + + names := make([]string, nameCount) + for i := range names { + names[i] = fmt.Sprintf("p%d", paramNum) + paramNum++ + } + + callNames = append(callNames, names...) + params = append(params, strings.Join(names, ", ")+" "+typBuf.String()) + } + + results := []string{} + for ri, resultList := range methMeta.FuncType.Results.List { + if err := resolveDep(resultList.Type, ifaceMeta, deps); err != nil { + return fmt.Errorf("resolve dep for #%d result: %w", ri, err) + } + + typBuf.Reset() + err := printer.Fprint(typBuf, astMeta.FileSet, resultList.Type) + if err != nil { + return fmt.Errorf("write #%d result type: %w", ri, err) + } + + count := len(resultList.Names) + if count == 0 { + count = 1 + } + + for i := 0; i < count; i++ { + results = append(results, typBuf.String()) + } + } + + sname := structName(ifaceMeta.Name) + fmt.Fprintf(dst, "func(s *%s) %s(%s) (%s) { return s.Internal.%s(%s) }\n", sname, methMeta.Name, strings.Join(params, ", "), strings.Join(results, ", "), methMeta.Name, strings.Join(callNames, ", ")) + return nil +} diff --git a/venus-devtool/api-gen/proxygen.go b/venus-devtool/api-gen/proxygen.go deleted file mode 100644 index a5d05e3b00..0000000000 --- a/venus-devtool/api-gen/proxygen.go +++ /dev/null @@ -1,502 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "go/ast" - "go/build" - "go/parser" - "go/token" - "io/fs" - "io/ioutil" - "os" - "path" - "path/filepath" - "strings" - "text/template" - "unicode" - - _ "github.com/filecoin-project/lotus/api" - "golang.org/x/xerrors" -) - -const ( - VenusSharedPath = "../venus-shared" - GenAPIFileName = "proxy_gen.go" -) - -var ( - VenusAPIPath = path.Join("../venus-shared", "api") - VenusCompatibleCheckFile = path.Join(VenusSharedPath, "compatible-checks/api-permission.json") - VenusV0APiFile = path.Join(VenusAPIPath, "chain/v0", GenAPIFileName) - VenusV1ApiFile = path.Join(VenusAPIPath, "chain/v1", GenAPIFileName) -) - -type ruleKey = string - -const ( - rkPerm ruleKey = "perm" -) - -type methodMeta struct { - node ast.Node - ftype *ast.FuncType -} - -type Visitor struct { - Methods map[string]map[string]*methodMeta - Include map[string][]string -} - -func (v *Visitor) Visit(node ast.Node) ast.Visitor { - st, ok := node.(*ast.TypeSpec) - if !ok { - return v - } - - iface, ok := st.Type.(*ast.InterfaceType) - if !ok { - return v - } - if v.Methods[st.Name.Name] == nil { - v.Methods[st.Name.Name] = map[string]*methodMeta{} - } - for _, m := range iface.Methods.List { - switch ft := m.Type.(type) { - case *ast.Ident: - v.Include[st.Name.Name] = append(v.Include[st.Name.Name], ft.Name) - case *ast.FuncType: - v.Methods[st.Name.Name][m.Names[0].Name] = &methodMeta{ - node: m, - ftype: ft, - } - } - } - - return v -} - -func main() { - var arg string - if len(os.Args) > 1 { - arg = os.Args[1] - } - - onlyCompare := arg == "compare" - lpath := lotusAPIPath() - - infos := struct { - V0 *stableMethodInfo - V1 *stableMethodInfo - }{ - V0: v0API(lpath, onlyCompare), - V1: v1API(lpath, onlyCompare), - } - - data, err := json.MarshalIndent(infos, "", "\t") - checkError(err) - err = ioutil.WriteFile(VenusCompatibleCheckFile, data, 0666) - checkError(err) -} - -func v0API(lpath string, onlyCompare bool) *stableMethodInfo { - apiFilePaths := []string{ - path.Join(lpath, "v0api/full.go"), - path.Join(lpath, "api_common.go"), - path.Join(lpath, "api_net.go"), - } - fmt.Println("v0 lotus api file: ", apiFilePaths) - - bmp, err := benchmarkMethodPerm(apiFilePaths) - checkError(err) - // outputWithJSON(bmp, "v0 benchmarkMethodPerm: ") - - mm, err := methodMetaFromInterface(path.Join(VenusAPIPath, "chain/v0"), "v0", "v0") - checkError(err) - - smi := check(bmp, mm) - outputWithJSON(smi, "v0 api StableMethodInfo: ") - - if !onlyCompare { - checkError(doTemplate(VenusV0APiFile, mm, templ)) - } - - return smi -} - -func v1API(lpath string, onlyCompare bool) *stableMethodInfo { - apiFilePaths := []string{ - path.Join(lpath, "api_full.go"), - path.Join(lpath, "api_common.go"), - path.Join(lpath, "api_net.go"), - } - fmt.Println("v1 lotus api file: ", apiFilePaths) - - bmp, err := benchmarkMethodPerm(apiFilePaths) - checkError(err) - // outputWithJSON(bmp, "v1 benchmarkMethodPerm: ") - - mm, err := methodMetaFromInterface(path.Join(VenusAPIPath, "/chain/v1"), "v1", "v1") - checkError(err) - - smi := check(bmp, mm) - outputWithJSON(smi, "v1 api StableMethodInfo: ") - - if !onlyCompare { - checkError(doTemplate(VenusV1ApiFile, mm, templ)) - } - - return smi -} - -func lotusAPIPath() string { - lAPIPath := "../lotus/api" - pkg, err := build.Import("github.com/filecoin-project/lotus/api", ".", build.FindOnly) - if err == nil { - lAPIPath = pkg.Dir - } - return lAPIPath -} - -func benchmarkMethodPerm(apiFilePaths []string) (map[string]string, error) { - fset := token.NewFileSet() - files := make([]*ast.File, 0, len(apiFilePaths)) - visitor := &Visitor{make(map[string]map[string]*methodMeta), map[string][]string{}} - - for _, fpath := range apiFilePaths { - f, err := parser.ParseFile(fset, fpath, nil, parser.AllErrors|parser.ParseComments) - if err != nil { - return nil, err - } - files = append(files, f) - ast.Walk(visitor, f) - } - - perms := make(map[string]string) - for _, f := range files { - cmap := ast.NewCommentMap(fset, f, f.Comments) - for _, methods := range visitor.Methods { - for mname, node := range methods { - filteredComments := cmap.Filter(node.node).Comments() - if len(filteredComments) > 0 { - cmt := filteredComments[len(filteredComments)-1].List[0].Text - if !strings.Contains(cmt, "perm:") { - fmt.Println("lotus method not found perm: ", mname) - continue - } - pairs := strings.Split(cmt, ":") - if len(pairs) != 2 { - continue - } - perms[mname] = pairs[1] - } - } - } - } - - return perms, nil -} - -type methodInfo struct { - Name string - node ast.Node - Tags map[string][]string - NamedParams, ParamNames, Results, DefRes string -} -type strinfo struct { - Name string - Methods map[string]*methodInfo - Include []string -} -type meta struct { - Infos map[string]*strinfo - Imports map[string]string - OutPkg string -} - -func filter(f fs.FileInfo) bool { - return f.Name() != GenAPIFileName -} - -func methodMetaFromInterface(rootPath string, pkg, outpkg string) (*meta, error) { - fset := token.NewFileSet() - apiDir, err := filepath.Abs(rootPath) - if err != nil { - return nil, err - } - - visitor := &Visitor{make(map[string]map[string]*methodMeta), map[string][]string{}} - m := &meta{ - OutPkg: outpkg, - Infos: map[string]*strinfo{}, - Imports: map[string]string{}, - } - // filter := isGoFile - pkgs, err := parser.ParseDir(fset, apiDir, filter, parser.AllErrors|parser.ParseComments) - if err != nil { - return nil, err - } - ap := pkgs[pkg] - - ast.Walk(visitor, ap) - ignoreMethods := map[string][]string{} - for k, f := range ap.Files { - if strings.HasSuffix(k, "blockstore.go") { - fmt.Println(k) - } - - var replacedPkgName = make(map[string]string) - - cmap := ast.NewCommentMap(fset, f, f.Comments) - for _, im := range f.Imports { - m.Imports[im.Path.Value] = im.Path.Value - if im.Name != nil { - replacedPkgName[im.Name.Name] = "x" - m.Imports[im.Path.Value] = im.Name.Name + " " + m.Imports[im.Path.Value] - } - } - - for ifname, methods := range visitor.Methods { - if _, ok := m.Infos[ifname]; !ok { - m.Infos[ifname] = &strinfo{ - Name: ifname, - Methods: map[string]*methodInfo{}, - Include: visitor.Include[ifname], - } - } - info := m.Infos[ifname] - for mname, node := range methods { - filteredComments := cmap.Filter(node.node).Comments() - if _, ok := info.Methods[mname]; !ok { - var params, pnames []string - for _, param := range node.ftype.Params.List { - pstr, err := typeName(param.Type, outpkg) - if err != nil { - return nil, err - } - - c := len(param.Names) - if c == 0 { - c = 1 - } - - for i := 0; i < c; i++ { - pname := fmt.Sprintf("p%d", len(params)) - pnames = append(pnames, pname) - params = append(params, pname+" "+pstr) - } - } - - var results []string - for _, result := range node.ftype.Results.List { - if exp, isok := result.Type.(*ast.SelectorExpr); isok && mname == "ChainStatObj" { - x, _ := json.MarshalIndent(exp, "", " ") - fmt.Printf("%s\n", string(x)) - } - rs, err := typeName(result.Type, outpkg) - if err != nil { - return nil, err - } - results = append(results, rs) - } - - defRes := "" - if len(results) > 1 { - defRes = results[0] - switch { - case defRes[0] == '*' || defRes[0] == '<', defRes == "interface{}": - defRes = "nil" - case defRes == "bool": - defRes = "false" - case defRes == "string": - defRes = `""` - case defRes == "int", defRes == "int64", defRes == "uint64", defRes == "uint": - defRes = "0" - default: - defRes = "*new(" + defRes + ")" - } - defRes += ", " - } - - info.Methods[mname] = &methodInfo{ - Name: mname, - node: node.node, - Tags: map[string][]string{}, - NamedParams: strings.Join(params, ", "), - ParamNames: strings.Join(pnames, ", "), - Results: strings.Join(results, ", "), - DefRes: defRes, - } - } - - // try to parse tag info - if len(filteredComments) > 0 { - lastComment := filteredComments[len(filteredComments)-1] - // eg. cmt = `//perm:read` - cmt := lastComment.List[len(lastComment.List)-1].Text - cmt = strings.Replace(cmt, "//", "", 1) - info.Methods[mname].Tags[rkPerm] = strings.Split(cmt, ":") - } - } - } - } - for ifname, mnames := range ignoreMethods { - for _, mname := range mnames { - delete(m.Infos[ifname].Methods, mname) - } - } - - return m, nil -} - -func typeName(e ast.Expr, pkg string) (string, error) { - switch t := e.(type) { - case *ast.SelectorExpr: - return t.X.(*ast.Ident).Name + "." + t.Sel.Name, nil - case *ast.Ident: - pstr := t.Name - if !unicode.IsLower(rune(pstr[0])) && pkg != "client" { - pstr = "client." + pstr // todo src pkg name - } - return pstr, nil - case *ast.ArrayType: - subt, err := typeName(t.Elt, pkg) - if err != nil { - return "", err - } - return "[]" + subt, nil - case *ast.StarExpr: - subt, err := typeName(t.X, pkg) - if err != nil { - return "", err - } - return "*" + subt, nil - case *ast.MapType: - k, err := typeName(t.Key, pkg) - if err != nil { - return "", err - } - v, err := typeName(t.Value, pkg) - if err != nil { - return "", err - } - return "map[" + k + "]" + v, nil - case *ast.StructType: - if len(t.Fields.List) != 0 { - return "", xerrors.Errorf("can't struct") - } - return "struct{}", nil - case *ast.InterfaceType: - if len(t.Methods.List) != 0 { - return "", xerrors.Errorf("can't interface") - } - return "interface{}", nil - case *ast.ChanType: - subt, err := typeName(t.Value, pkg) - if err != nil { - return "", err - } - if t.Dir == ast.SEND { - subt = "->chan " + subt - } else { - subt = "<-chan " + subt - } - return subt, nil - default: - return "", xerrors.Errorf("unknown type") - } -} - -type stableMethodInfo struct { - // Lotus and Venus both have functions and the same permissions - Common map[string]string - // Venus has functions that Lotus does not - Extend map[string]string - // Lotus has functions that Venus does not - Loss map[string]string - // Both Lotus and venus has functions but the permissions are different - Gap map[string]string -} - -func newStableMethodInfo() *stableMethodInfo { - return &stableMethodInfo{ - Common: make(map[string]string), - Extend: make(map[string]string), - Loss: make(map[string]string), - Gap: make(map[string]string), - } -} - -func check(bmp map[string]string, m *meta) *stableMethodInfo { - smi := newStableMethodInfo() - vMethodPerms := make(map[string]string) - for _, info := range m.Infos { - for _, one := range info.Methods { - mperm := one.Tags[rkPerm][1] - vMethodPerms[one.Name] = mperm - if perm, ok := bmp[one.Name]; ok { - if mperm != perm { - smi.Gap[one.Name] = fmt.Sprintf("venus:%s lotus:%s", mperm, perm) - continue - } - smi.Common[one.Name] = mperm - } else { - smi.Extend[one.Name] = mperm - } - } - } - for m, p := range bmp { - if _, ok := vMethodPerms[m]; !ok { - smi.Loss[m] = p - } - } - - return smi -} - -func doTemplate(outfile string, info interface{}, templ string) error { - w, err := os.OpenFile(outfile, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) - if err != nil { - return err - } - t := template.Must(template.New(""). - Funcs(template.FuncMap{}).Parse(templ)) - - return t.Execute(w, info) -} - -var templ = `// Code generated by github.com/filecoin-project/tools/gen/api. DO NOT EDIT. - -package {{.OutPkg}} - -import ( -{{range .Imports}} {{.}} -{{end}}) -{{range .Infos}} {{$name := .Name}} -type {{.Name}}Struct struct { -{{range .Include}} {{.}}Struct -{{end}}{{ if gt (len .Methods) 0 }} Internal struct { {{range .Methods}} - {{.Name}} func({{.NamedParams}}) ({{.Results}}) ` + "`" + `{{range .Tags}}{{index . 0}}:"{{index . 1}}"{{end}}` + "`" + ` -{{end}} } -{{end}}} - -{{range .Methods}}func(s *{{$name}}Struct) {{.Name}} ({{.NamedParams}}) ({{.Results}}){ - return s.Internal.{{.Name}}({{.ParamNames}}) -} - -{{end}} {{end}} -` - -func checkError(err error) { - if err != nil { - panic(err) - } -} - -func outputWithJSON(obj interface{}, comment string) { - b, err := json.MarshalIndent(obj, "", "\t") - if err != nil { - fmt.Println("json marshal error: ", err) - } - fmt.Println(comment, "\n", string(b)) -} diff --git a/venus-devtool/compatible/apis/checksum.go b/venus-devtool/compatible/apis/checksum.go index 3ca79dcb3b..0f97a50925 100644 --- a/venus-devtool/compatible/apis/checksum.go +++ b/venus-devtool/compatible/apis/checksum.go @@ -17,7 +17,7 @@ var checksumCmd = &cli.Command{ Flags: []cli.Flag{}, Action: func(cctx *cli.Context) error { var buf bytes.Buffer - for _, pair := range util.APIPairs { + for _, pair := range util.ChainAPIPairs { rt := pair.Lotus.Type fmt.Printf("%s:\n", rt) for mi := 0; mi < rt.NumMethod(); mi++ { diff --git a/venus-devtool/compatible/apis/diff.go b/venus-devtool/compatible/apis/diff.go index a45a2a4114..0b26bdb61b 100644 --- a/venus-devtool/compatible/apis/diff.go +++ b/venus-devtool/compatible/apis/diff.go @@ -16,7 +16,7 @@ var diffCmd = &cli.Command{ Name: "diff", Flags: []cli.Flag{}, Action: func(cctx *cli.Context) error { - for _, pair := range util.APIPairs { + for _, pair := range util.ChainAPIPairs { showDiff(pair.Venus.Type, pair.Lotus.Type) } return nil diff --git a/venus-devtool/compatible/apis/perm.go b/venus-devtool/compatible/apis/perm.go index 9db33ca20d..ba85e16f12 100644 --- a/venus-devtool/compatible/apis/perm.go +++ b/venus-devtool/compatible/apis/perm.go @@ -3,7 +3,6 @@ package main import ( "fmt" "log" - "strings" "github.com/urfave/cli/v2" @@ -14,7 +13,7 @@ var permCmd = &cli.Command{ Name: "perm", Flags: []cli.Flag{}, Action: func(cctx *cli.Context) error { - for _, pair := range util.APIPairs { + for _, pair := range util.ChainAPIPairs { originMetas, err := parsePermMetas(pair.Lotus.ParseOpt) if err != nil { log.Fatalln("parse lotus api interfaces:", err) @@ -60,7 +59,7 @@ type permMeta struct { } func parsePermMetas(opt util.InterfaceParseOption) ([]permMeta, error) { - ifaceMetas, err := util.ParseInterfaceMetas(opt) + ifaceMetas, _, err := util.ParseInterfaceMetas(opt) if err != nil { return nil, err } @@ -72,31 +71,10 @@ func parsePermMetas(opt util.InterfaceParseOption) ([]permMeta, error) { pkg: opt.ImportPath, iface: iface.Name, meth: ifMeth.Name, - perm: getPerms(ifMeth), + perm: util.GetAPIMethodPerm(ifMeth), }) } } return permMetas, nil } - -func getPerms(m util.InterfaceMethodMeta) string { - permStr := "" - - if cmtNum := len(m.Comments); cmtNum > 0 { - if itemNum := len(m.Comments[cmtNum-1].List); itemNum > 0 { - if strings.HasPrefix(m.Comments[cmtNum-1].List[0].Text, "//") { - permStr = m.Comments[cmtNum-1].List[0].Text[2:] - } - } - } - - for _, piece := range strings.Split(permStr, " ") { - trimmed := strings.TrimSpace(piece) - if strings.HasPrefix(trimmed, "perm:") { - return trimmed[5:] - } - } - - return "" -} diff --git a/venus-devtool/util/api_meta.go b/venus-devtool/util/api_meta.go index 5c7a5bed15..cbbb00b334 100644 --- a/venus-devtool/util/api_meta.go +++ b/venus-devtool/util/api_meta.go @@ -2,6 +2,7 @@ package util import ( "reflect" + "strings" "github.com/filecoin-project/lotus/api/v0api" "github.com/filecoin-project/lotus/api/v1api" @@ -10,7 +11,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/api/chain/v1" ) -var APIPairs = []struct { +var ChainAPIPairs = []struct { Ver int Lotus APIMeta Venus APIMeta @@ -51,9 +52,30 @@ var APIPairs = []struct { }, } -var LatestAPIPair = APIPairs[len(APIPairs)-1] +var LatestChainAPIPair = ChainAPIPairs[len(ChainAPIPairs)-1] type APIMeta struct { Type reflect.Type ParseOpt InterfaceParseOption } + +func GetAPIMethodPerm(m InterfaceMethodMeta) string { + permStr := "" + + if cmtNum := len(m.Comments); cmtNum > 0 { + if itemNum := len(m.Comments[cmtNum-1].List); itemNum > 0 { + if strings.HasPrefix(m.Comments[cmtNum-1].List[0].Text, "//") { + permStr = m.Comments[cmtNum-1].List[0].Text[2:] + } + } + } + + for _, piece := range strings.Split(permStr, " ") { + trimmed := strings.TrimSpace(piece) + if strings.HasPrefix(trimmed, "perm:") { + return trimmed[5:] + } + } + + return "" +} diff --git a/venus-devtool/util/import.go b/venus-devtool/util/import.go index cbcd115ef8..906c73b795 100644 --- a/venus-devtool/util/import.go +++ b/venus-devtool/util/import.go @@ -2,13 +2,47 @@ package util import ( "go/build" + "sync" ) -func FindLocationForImportPath(path string) (string, error) { - pkg, err := build.Import(path, ".", build.FindOnly) - if err != nil { - return "", err +type PackageBuildInfo struct { + *build.Package + Err error +} + +var pkgCache = struct { + sync.RWMutex + found map[string]PackageBuildInfo +}{ + found: map[string]PackageBuildInfo{}, +} + +func FindPackage(importPath string) PackageBuildInfo { + pkgCache.RLock() + found, ok := pkgCache.found[importPath] + pkgCache.RUnlock() + + if !ok { + pkgCache.Lock() + pkg, err := build.Import(importPath, ".", 0) + + found = PackageBuildInfo{ + Package: pkg, + Err: err, + } + + pkgCache.found[importPath] = found + pkgCache.Unlock() + } + + return found +} + +func FindPackageLocation(importPath string) (string, error) { + found := FindPackage(importPath) + if found.Err != nil { + return "", found.Err } - return pkg.Dir, nil + return found.Dir, nil } diff --git a/venus-devtool/util/interface.go b/venus-devtool/util/interface.go index 0c836a24a7..35d28a6aeb 100644 --- a/venus-devtool/util/interface.go +++ b/venus-devtool/util/interface.go @@ -1,6 +1,7 @@ package util import ( + "fmt" "go/ast" "go/parser" "go/token" @@ -8,18 +9,40 @@ import ( "strings" ) +type ASTMeta struct { + Location string + *token.FileSet +} + type InterfaceParseOption struct { - ImportPath string - IncludeAll bool - Included []string + ImportPath string + IncludeAll bool + Included []string + ResolveImports bool +} + +type PackageMeta struct { + Name string + *ast.Package +} + +type ImportMeta struct { + Path string + IsStd bool +} + +type FileMeta struct { + Name string + *ast.File + Imports map[string]ImportMeta } type InterfaceMeta struct { - Pkg string - File string - Name string - Defined []InterfaceMethodMeta - Included []string + Pkg PackageMeta + File FileMeta + Name string + Defined []InterfaceMethodMeta + Nested []string } type InterfaceMethodMeta struct { @@ -30,8 +53,8 @@ type InterfaceMethodMeta struct { } type ifaceMetaVisitor struct { - pname string - fname string + pkg PackageMeta + file FileMeta included map[string]struct{} includAll bool comments ast.CommentMap @@ -58,8 +81,8 @@ func (iv *ifaceMetaVisitor) Visit(node ast.Node) ast.Visitor { if !ok { ifaceIdx = len(iv.ifaces) iv.ifaces = append(iv.ifaces, &InterfaceMeta{ - Pkg: iv.pname, - File: iv.fname, + Pkg: iv.pkg, + File: iv.file, Name: st.Name.Name, }) } @@ -69,7 +92,7 @@ func (iv *ifaceMetaVisitor) Visit(node ast.Node) ast.Visitor { for _, m := range iface.Methods.List { switch meth := m.Type.(type) { case *ast.Ident: - ifaceMeta.Included = append(ifaceMeta.Included, meth.Name) + ifaceMeta.Nested = append(ifaceMeta.Nested, meth.Name) case *ast.FuncType: ifaceMeta.Defined = append(ifaceMeta.Defined, InterfaceMethodMeta{ @@ -84,16 +107,47 @@ func (iv *ifaceMetaVisitor) Visit(node ast.Node) ast.Visitor { return iv } -func ParseInterfaceMetas(opt InterfaceParseOption) ([]*InterfaceMeta, error) { - location, err := FindLocationForImportPath(opt.ImportPath) +func genFileMeta(name string, file *ast.File, resolveImports bool) (FileMeta, error) { + imports := map[string]ImportMeta{} + if resolveImports { + + for _, imp := range file.Imports { + importPath := imp.Path.Value[1 : len(imp.Path.Value)-1] + found := FindPackage(importPath) + if found.Err != nil { + return FileMeta{}, fmt.Errorf("find package for %s: %w", importPath, found.Err) + } + + importMeta := ImportMeta{ + Path: importPath, + IsStd: strings.HasPrefix(found.Dir, found.SrcRoot), + } + + if imp.Name != nil && imp.Name.Name != "" { + imports[imp.Name.Name] = importMeta + } else { + imports[found.Name] = importMeta + } + } + } + + return FileMeta{ + Name: name, + File: file, + Imports: imports, + }, nil +} + +func ParseInterfaceMetas(opt InterfaceParseOption) ([]*InterfaceMeta, *ASTMeta, error) { + location, err := FindPackageLocation(opt.ImportPath) if err != nil { - return nil, err + return nil, nil, err } fset := token.NewFileSet() pkgs, err := parser.ParseDir(fset, location, nil, parser.AllErrors|parser.ParseComments) if err != nil { - return nil, err + return nil, nil, err } var metas []*InterfaceMeta @@ -109,14 +163,22 @@ func ParseInterfaceMetas(opt InterfaceParseOption) ([]*InterfaceMeta, error) { } visitor := &ifaceMetaVisitor{ - pname: pname, + pkg: PackageMeta{ + Name: pname, + Package: pkg, + }, included: included, includAll: opt.IncludeAll, ifaceIdxes: map[string]int{}, } for fname, file := range pkg.Files { - visitor.fname = fname + fileMeta, err := genFileMeta(fname, file, opt.ResolveImports) + if err != nil { + return nil, nil, fmt.Errorf("gen file meta for %s: %w", fname, err) + } + + visitor.file = fileMeta visitor.comments = ast.NewCommentMap(fset, file, file.Comments) ast.Walk(visitor, file) } @@ -126,11 +188,11 @@ func ParseInterfaceMetas(opt InterfaceParseOption) ([]*InterfaceMeta, error) { sort.Slice(metas, func(i, j int) bool { if metas[i].Pkg != metas[j].Pkg { - return metas[i].Pkg < metas[j].Pkg + return metas[i].Pkg.Name < metas[j].Pkg.Name } - if metas[i].File != metas[j].File { - return metas[i].File < metas[j].File + if metas[i].File.Name != metas[j].File.Name { + return metas[i].File.Name < metas[j].File.Name } return metas[i].Name < metas[j].Name @@ -142,5 +204,8 @@ func ParseInterfaceMetas(opt InterfaceParseOption) ([]*InterfaceMeta, error) { }) } - return metas, nil + return metas, &ASTMeta{ + Location: location, + FileSet: fset, + }, nil } diff --git a/venus-shared/api/chain/v0/fullnode.go b/venus-shared/api/chain/v0/fullnode.go index bd4498132a..031e0ca1e9 100644 --- a/venus-shared/api/chain/v0/fullnode.go +++ b/venus-shared/api/chain/v0/fullnode.go @@ -1,7 +1,5 @@ package v0 -//go:generate go run github.com/golang/mock/mockgen@v1.6.0 -destination=./mock/full.go -package=mock . FullNode - type FullNode interface { IBlockStore IChain diff --git a/venus-shared/api/chain/v0/proxy_gen.go b/venus-shared/api/chain/v0/proxy_gen.go index 792485f109..26110abff0 100644 --- a/venus-shared/api/chain/v0/proxy_gen.go +++ b/venus-shared/api/chain/v0/proxy_gen.go @@ -1,43 +1,52 @@ -// Code generated by github.com/filecoin-project/tools/gen/api. DO NOT EDIT. - +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. package v0 import ( "context" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" + "time" + + address "github.com/filecoin-project/go-address" + bitfield "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - "github.com/filecoin-project/venus/venus-shared/types" - "github.com/ipfs/go-cid" + cid "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" - "time" + + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/types" ) -type FullNodeStruct struct { - IBlockStoreStruct - IChainStruct - IMarketStruct - IMiningStruct - IMessagePoolStruct - IMultiSigStruct - INetworkStruct - IPaychanStruct - ISyncerStruct - IWalletStruct - IJwtAuthAPIStruct +type IBlockStoreStruct struct { + Internal struct { + ChainDeleteObj func(ctx context.Context, obj cid.Cid) error `perm:"admin"` + ChainHasObj func(ctx context.Context, obj cid.Cid) (bool, error) `perm:"read"` + ChainReadObj func(ctx context.Context, cid cid.Cid) ([]byte, error) `perm:"read"` + ChainStatObj func(ctx context.Context, obj cid.Cid, base cid.Cid) (types.ObjStat, error) `perm:"read"` + } +} + +func (s *IBlockStoreStruct) ChainDeleteObj(p0 context.Context, p1 cid.Cid) error { + return s.Internal.ChainDeleteObj(p0, p1) +} +func (s *IBlockStoreStruct) ChainHasObj(p0 context.Context, p1 cid.Cid) (bool, error) { + return s.Internal.ChainHasObj(p0, p1) +} +func (s *IBlockStoreStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { + return s.Internal.ChainReadObj(p0, p1) +} +func (s *IBlockStoreStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) { + return s.Internal.ChainStatObj(p0, p1, p2) } type IAccountStruct struct { Internal struct { - StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` + StateAccountKey func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) `perm:"read"` } } @@ -47,23 +56,21 @@ func (s *IAccountStruct) StateAccountKey(p0 context.Context, p1 address.Address, type IActorStruct struct { Internal struct { - ListActor func(p0 context.Context) (map[address.Address]*types.Actor, error) `perm:"read"` - - StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `perm:"read"` + ListActor func(ctx context.Context) (map[address.Address]*types.Actor, error) `perm:"read"` + StateGetActor func(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) `perm:"read"` } } func (s *IActorStruct) ListActor(p0 context.Context) (map[address.Address]*types.Actor, error) { return s.Internal.ListActor(p0) } - func (s *IActorStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { return s.Internal.StateGetActor(p0, p1, p2) } type IBeaconStruct struct { Internal struct { - BeaconGetEntry func(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) `perm:"read"` + BeaconGetEntry func(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) `perm:"read"` } } @@ -71,1012 +78,702 @@ func (s *IBeaconStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (* return s.Internal.BeaconGetEntry(p0, p1) } -type IBlockStoreStruct struct { +type IMinerStateStruct struct { Internal struct { - ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` - - ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"` - - ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` - - ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) `perm:"read"` + StateCirculatingSupply func(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` + StateDealProviderCollateralBounds func(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (types.DealCollateralBounds, error) `perm:"read"` + StateListActors func(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) `perm:"read"` + StateListMiners func(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) `perm:"read"` + StateLookupID func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) `perm:"read"` + StateMarketBalance func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MarketBalance, error) `perm:"read"` + StateMarketDeals func(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) `perm:"read"` + StateMarketStorageDeal func(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.MarketDeal, error) `perm:"read"` + StateMinerActiveSectors func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + StateMinerAvailableBalance func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerDeadlines func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]types.Deadline, error) `perm:"read"` + StateMinerFaults func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) `perm:"read"` + StateMinerInfo func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) `perm:"read"` + StateMinerInitialPledgeCollateral func(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerPartitions func(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]types.Partition, error) `perm:"read"` + StateMinerPower func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.MinerPower, error) `perm:"read"` + StateMinerPreCommitDepositForPower func(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerProvingDeadline func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) `perm:"read"` + StateMinerRecoveries func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) `perm:"read"` + StateMinerSectorAllocated func(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) `perm:"read"` + StateMinerSectorCount func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MinerSectors, error) `perm:"read"` + StateMinerSectorSize func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (abi.SectorSize, error) `perm:"read"` + StateMinerSectors func(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + StateMinerWorkerAddress func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (address.Address, error) `perm:"read"` + StateSectorExpiration func(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorExpiration, error) `perm:"read"` + StateSectorGetInfo func(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` + StateSectorPartition func(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` + StateSectorPreCommitInfo func(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` + StateVMCirculatingSupplyInternal func(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) `perm:"read"` + StateVerifiedClientStatus func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` } } -func (s *IBlockStoreStruct) ChainDeleteObj(p0 context.Context, p1 cid.Cid) error { - return s.Internal.ChainDeleteObj(p0, p1) +func (s *IMinerStateStruct) StateCirculatingSupply(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) { + return s.Internal.StateCirculatingSupply(p0, p1) } - -func (s *IBlockStoreStruct) ChainHasObj(p0 context.Context, p1 cid.Cid) (bool, error) { - return s.Internal.ChainHasObj(p0, p1) +func (s *IMinerStateStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) { + return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) } - -func (s *IBlockStoreStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { - return s.Internal.ChainReadObj(p0, p1) +func (s *IMinerStateStruct) StateListActors(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { + return s.Internal.StateListActors(p0, p1) } - -func (s *IBlockStoreStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) { - return s.Internal.ChainStatObj(p0, p1, p2) +func (s *IMinerStateStruct) StateListMiners(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { + return s.Internal.StateListMiners(p0, p1) } - -type IChainStruct struct { - IAccountStruct - IActorStruct - IBeaconStruct - IMinerStateStruct - IChainInfoStruct +func (s *IMinerStateStruct) StateLookupID(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { + return s.Internal.StateLookupID(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) { + return s.Internal.StateMarketBalance(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) { + return s.Internal.StateMarketDeals(p0, p1) +} +func (s *IMinerStateStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) { + return s.Internal.StateMarketStorageDeal(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerActiveSectors(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { + return s.Internal.StateMinerActiveSectors(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerAvailableBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) { + return s.Internal.StateMinerAvailableBalance(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) { + return s.Internal.StateMinerDeadlines(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerFaults(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { + return s.Internal.StateMinerFaults(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerInfo(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) { + return s.Internal.StateMinerInfo(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { + return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) { + return s.Internal.StateMinerPartitions(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) { + return s.Internal.StateMinerPower(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerPreCommitDepositForPower(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { + return s.Internal.StateMinerPreCommitDepositForPower(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateMinerProvingDeadline(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) { + return s.Internal.StateMinerProvingDeadline(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerRecoveries(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { + return s.Internal.StateMinerRecoveries(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerSectorAllocated(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) { + return s.Internal.StateMinerSectorAllocated(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) { + return s.Internal.StateMinerSectorCount(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerSectorSize(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (abi.SectorSize, error) { + return s.Internal.StateMinerSectorSize(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerSectors(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { + return s.Internal.StateMinerSectors(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateMinerWorkerAddress(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { + return s.Internal.StateMinerWorkerAddress(p0, p1, p2) +} +func (s *IMinerStateStruct) StateSectorExpiration(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) { + return s.Internal.StateSectorExpiration(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateSectorGetInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) { + return s.Internal.StateSectorGetInfo(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateSectorPartition(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) { + return s.Internal.StateSectorPartition(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateSectorPreCommitInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { + return s.Internal.StateSectorPreCommitInfo(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) { + return s.Internal.StateVMCirculatingSupplyInternal(p0, p1) +} +func (s *IMinerStateStruct) StateVerifiedClientStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { + return s.Internal.StateVerifiedClientStatus(p0, p1, p2) } type IChainInfoStruct struct { Internal struct { - BlockTime func(p0 context.Context) time.Duration `perm:"read"` - - ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) `perm:"read"` - - ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) `perm:"read"` - - ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*types.BlockMessages, error) `perm:"read"` - - ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"` - - ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]types.MessageCID, error) `perm:"read"` - - ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]types.MessageCID, error) `perm:"read"` - - ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` - - ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*types.HeadChange, error) `perm:"read"` - - ChainGetRandomnessFromBeacon func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` - - ChainGetRandomnessFromTickets func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` - - ChainGetReceipts func(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) `perm:"read"` - - ChainGetTipSet func(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - - ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - - ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"` - - ChainList func(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) `perm:"read"` - - ChainNotify func(p0 context.Context) (<-chan []*types.HeadChange, error) `perm:"read"` - - ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` - - GetActor func(p0 context.Context, p1 address.Address) (*types.Actor, error) `perm:"read"` - - GetEntry func(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) `perm:"read"` - - GetFullBlock func(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) `perm:"read"` - - GetParentStateRootActor func(p0 context.Context, p1 *types.TipSet, p2 address.Address) (*types.Actor, error) `perm:"read"` - - MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*types.ChainMessage, error) `perm:"read"` - - ProtocolParameters func(p0 context.Context) (*types.ProtocolParams, error) `perm:"read"` - - ResolveToKeyAddr func(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) `perm:"read"` - - StateGetReceipt func(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) `perm:"read"` - - StateNetworkName func(p0 context.Context) (types.NetworkName, error) `perm:"read"` - - StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (network.Version, error) `perm:"read"` - - StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*types.MsgLookup, error) `perm:"read"` - - StateSearchMsgLimited func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*types.MsgLookup, error) `perm:"read"` - - StateVerifiedRegistryRootKey func(p0 context.Context, p1 types.TipSetKey) (address.Address, error) `perm:"read"` - - StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` - - StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*types.MsgLookup, error) `perm:"read"` - - StateWaitMsgLimited func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*types.MsgLookup, error) `perm:"read"` - - VerifyEntry func(p0 *types.BeaconEntry, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool `perm:"read"` + BlockTime func(ctx context.Context) time.Duration `perm:"read"` + ChainExport func(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []byte, error) `perm:"read"` + ChainGetBlock func(ctx context.Context, id cid.Cid) (*types.BlockHeader, error) `perm:"read"` + ChainGetBlockMessages func(ctx context.Context, bid cid.Cid) (*types.BlockMessages, error) `perm:"read"` + ChainGetMessage func(ctx context.Context, msgID cid.Cid) (*types.Message, error) `perm:"read"` + ChainGetMessagesInTipset func(ctx context.Context, key types.TipSetKey) ([]types.MessageCID, error) `perm:"read"` + ChainGetParentMessages func(ctx context.Context, bcid cid.Cid) ([]types.MessageCID, error) `perm:"read"` + ChainGetParentReceipts func(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` + ChainGetPath func(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*types.HeadChange, error) `perm:"read"` + ChainGetRandomnessFromBeacon func(ctx context.Context, key types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) `perm:"read"` + ChainGetRandomnessFromTickets func(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) `perm:"read"` + ChainGetReceipts func(ctx context.Context, id cid.Cid) ([]types.MessageReceipt, error) `perm:"read"` + ChainGetTipSet func(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) `perm:"read"` + ChainGetTipSetByHeight func(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) `perm:"read"` + ChainHead func(ctx context.Context) (*types.TipSet, error) `perm:"read"` + ChainList func(ctx context.Context, tsKey types.TipSetKey, count int) ([]types.TipSetKey, error) `perm:"read"` + ChainNotify func(ctx context.Context) (<-chan []*types.HeadChange, error) `perm:"read"` + ChainSetHead func(ctx context.Context, key types.TipSetKey) error `perm:"admin"` + GetActor func(ctx context.Context, addr address.Address) (*types.Actor, error) `perm:"read"` + GetEntry func(ctx context.Context, height abi.ChainEpoch, round uint64) (*types.BeaconEntry, error) `perm:"read"` + GetFullBlock func(ctx context.Context, id cid.Cid) (*types.FullBlock, error) `perm:"read"` + GetParentStateRootActor func(ctx context.Context, ts *types.TipSet, addr address.Address) (*types.Actor, error) `perm:"read"` + MessageWait func(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*types.ChainMessage, error) `perm:"read"` + ProtocolParameters func(ctx context.Context) (*types.ProtocolParams, error) `perm:"read"` + ResolveToKeyAddr func(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) `perm:"read"` + StateGetReceipt func(ctx context.Context, msg cid.Cid, from types.TipSetKey) (*types.MessageReceipt, error) `perm:"read"` + StateNetworkName func(ctx context.Context) (types.NetworkName, error) `perm:"read"` + StateNetworkVersion func(ctx context.Context, tsk types.TipSetKey) (network.Version, error) `perm:"read"` + StateSearchMsg func(ctx context.Context, msg cid.Cid) (*types.MsgLookup, error) `perm:"read"` + StateSearchMsgLimited func(ctx context.Context, cid cid.Cid, limit abi.ChainEpoch) (*types.MsgLookup, error) `perm:"read"` + StateVerifiedRegistryRootKey func(ctx context.Context, tsk types.TipSetKey) (address.Address, error) `perm:"read"` + StateVerifierStatus func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` + StateWaitMsg func(ctx context.Context, cid cid.Cid, confidence uint64) (*types.MsgLookup, error) `perm:"read"` + StateWaitMsgLimited func(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch) (*types.MsgLookup, error) `perm:"read"` + VerifyEntry func(parent, child *types.BeaconEntry, height abi.ChainEpoch) bool `perm:"read"` } } func (s *IChainInfoStruct) BlockTime(p0 context.Context) time.Duration { return s.Internal.BlockTime(p0) } - func (s *IChainInfoStruct) ChainExport(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) { return s.Internal.ChainExport(p0, p1, p2, p3) } - func (s *IChainInfoStruct) ChainGetBlock(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) { return s.Internal.ChainGetBlock(p0, p1) } - func (s *IChainInfoStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*types.BlockMessages, error) { return s.Internal.ChainGetBlockMessages(p0, p1) } - func (s *IChainInfoStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*types.Message, error) { return s.Internal.ChainGetMessage(p0, p1) } - func (s *IChainInfoStruct) ChainGetMessagesInTipset(p0 context.Context, p1 types.TipSetKey) ([]types.MessageCID, error) { return s.Internal.ChainGetMessagesInTipset(p0, p1) } - func (s *IChainInfoStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]types.MessageCID, error) { return s.Internal.ChainGetParentMessages(p0, p1) } - func (s *IChainInfoStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) { return s.Internal.ChainGetParentReceipts(p0, p1) } - func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*types.HeadChange, error) { return s.Internal.ChainGetPath(p0, p1, p2) } - func (s *IChainInfoStruct) ChainGetRandomnessFromBeacon(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { return s.Internal.ChainGetRandomnessFromBeacon(p0, p1, p2, p3, p4) } - func (s *IChainInfoStruct) ChainGetRandomnessFromTickets(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { return s.Internal.ChainGetRandomnessFromTickets(p0, p1, p2, p3, p4) } - func (s *IChainInfoStruct) ChainGetReceipts(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) { return s.Internal.ChainGetReceipts(p0, p1) } - func (s *IChainInfoStruct) ChainGetTipSet(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) { return s.Internal.ChainGetTipSet(p0, p1) } - func (s *IChainInfoStruct) ChainGetTipSetByHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { return s.Internal.ChainGetTipSetByHeight(p0, p1, p2) } - func (s *IChainInfoStruct) ChainHead(p0 context.Context) (*types.TipSet, error) { return s.Internal.ChainHead(p0) } - func (s *IChainInfoStruct) ChainList(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) { return s.Internal.ChainList(p0, p1, p2) } - func (s *IChainInfoStruct) ChainNotify(p0 context.Context) (<-chan []*types.HeadChange, error) { return s.Internal.ChainNotify(p0) } - func (s *IChainInfoStruct) ChainSetHead(p0 context.Context, p1 types.TipSetKey) error { return s.Internal.ChainSetHead(p0, p1) } - func (s *IChainInfoStruct) GetActor(p0 context.Context, p1 address.Address) (*types.Actor, error) { return s.Internal.GetActor(p0, p1) } - func (s *IChainInfoStruct) GetEntry(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) { return s.Internal.GetEntry(p0, p1, p2) } - func (s *IChainInfoStruct) GetFullBlock(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) { return s.Internal.GetFullBlock(p0, p1) } - func (s *IChainInfoStruct) GetParentStateRootActor(p0 context.Context, p1 *types.TipSet, p2 address.Address) (*types.Actor, error) { return s.Internal.GetParentStateRootActor(p0, p1, p2) } - -func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*types.ChainMessage, error) { +func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2, p3 abi.ChainEpoch) (*types.ChainMessage, error) { return s.Internal.MessageWait(p0, p1, p2, p3) } - func (s *IChainInfoStruct) ProtocolParameters(p0 context.Context) (*types.ProtocolParams, error) { return s.Internal.ProtocolParameters(p0) } - func (s *IChainInfoStruct) ResolveToKeyAddr(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) { return s.Internal.ResolveToKeyAddr(p0, p1, p2) } - func (s *IChainInfoStruct) StateGetReceipt(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) { return s.Internal.StateGetReceipt(p0, p1, p2) } - func (s *IChainInfoStruct) StateNetworkName(p0 context.Context) (types.NetworkName, error) { return s.Internal.StateNetworkName(p0) } - func (s *IChainInfoStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (network.Version, error) { return s.Internal.StateNetworkVersion(p0, p1) } - func (s *IChainInfoStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*types.MsgLookup, error) { return s.Internal.StateSearchMsg(p0, p1) } - -func (s *IChainInfoStruct) StateSearchMsgLimited(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*types.MsgLookup, error) { - return s.Internal.StateSearchMsgLimited(p0, p1, p2) -} - -func (s *IChainInfoStruct) StateVerifiedRegistryRootKey(p0 context.Context, p1 types.TipSetKey) (address.Address, error) { - return s.Internal.StateVerifiedRegistryRootKey(p0, p1) -} - -func (s *IChainInfoStruct) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { - return s.Internal.StateVerifierStatus(p0, p1, p2) -} - -func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64) (*types.MsgLookup, error) { - return s.Internal.StateWaitMsg(p0, p1, p2) -} - -func (s *IChainInfoStruct) StateWaitMsgLimited(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*types.MsgLookup, error) { - return s.Internal.StateWaitMsgLimited(p0, p1, p2, p3) -} - -func (s *IChainInfoStruct) VerifyEntry(p0 *types.BeaconEntry, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool { - return s.Internal.VerifyEntry(p0, p1, p2) -} - -type IJwtAuthAPIStruct struct { - Internal struct { - AuthNew func(p0 context.Context, p1 []auth.Permission) ([]byte, error) `perm:"admin"` - - Verify func(p0 context.Context, p1 string, p2 string) ([]auth.Permission, error) `perm:"read"` - } -} - -func (s *IJwtAuthAPIStruct) AuthNew(p0 context.Context, p1 []auth.Permission) ([]byte, error) { - return s.Internal.AuthNew(p0, p1) -} - -func (s *IJwtAuthAPIStruct) Verify(p0 context.Context, p1 string, p2 string) ([]auth.Permission, error) { - return s.Internal.Verify(p0, p1, p2) -} - -type IMarketStruct struct { - Internal struct { - StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) `perm:"read"` - } -} - -func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) { - return s.Internal.StateMarketParticipants(p0, p1) -} - -type IMessagePoolStruct struct { - Internal struct { - GasBatchEstimateMessageGas func(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) `perm:"read"` - - GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - - GasEstimateGasLimit func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) `perm:"read"` - - GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) `perm:"read"` - - GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"` - - MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - - MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` - - MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - - MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` - - MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` - - MpoolGetConfig func(p0 context.Context) (*types.MpoolConfig, error) `perm:"read"` - - MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` - - MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` - - MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"admin"` - - MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"admin"` - - MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - - MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` - - MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - - MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` - - MpoolSelects func(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) `perm:"read"` - - MpoolSetConfig func(p0 context.Context, p1 *types.MpoolConfig) error `perm:"admin"` - - MpoolSub func(p0 context.Context) (<-chan types.MpoolUpdate, error) `perm:"read"` - } -} - -func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) { - return s.Internal.GasBatchEstimateMessageGas(p0, p1, p2, p3) -} - -func (s *IMessagePoolStruct) GasEstimateFeeCap(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) { - return s.Internal.GasEstimateFeeCap(p0, p1, p2, p3) -} - -func (s *IMessagePoolStruct) GasEstimateGasLimit(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) { - return s.Internal.GasEstimateGasLimit(p0, p1, p2) -} - -func (s *IMessagePoolStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) { - return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) -} - -func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { - return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) -} - -func (s *IMessagePoolStruct) MpoolBatchPush(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { - return s.Internal.MpoolBatchPush(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) { - return s.Internal.MpoolBatchPushMessage(p0, p1, p2) -} - -func (s *IMessagePoolStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { - return s.Internal.MpoolBatchPushUntrusted(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolClear(p0 context.Context, p1 bool) error { - return s.Internal.MpoolClear(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolDeleteByAdress(p0 context.Context, p1 address.Address) error { - return s.Internal.MpoolDeleteByAdress(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolGetConfig(p0 context.Context) (*types.MpoolConfig, error) { - return s.Internal.MpoolGetConfig(p0) -} - -func (s *IMessagePoolStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { - return s.Internal.MpoolGetNonce(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPending(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) { - return s.Internal.MpoolPending(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPublishByAddr(p0 context.Context, p1 address.Address) error { - return s.Internal.MpoolPublishByAddr(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPublishMessage(p0 context.Context, p1 *types.SignedMessage) error { - return s.Internal.MpoolPublishMessage(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { - return s.Internal.MpoolPush(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) { - return s.Internal.MpoolPushMessage(p0, p1, p2) -} - -func (s *IMessagePoolStruct) MpoolPushUntrusted(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { - return s.Internal.MpoolPushUntrusted(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolSelect(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) { - return s.Internal.MpoolSelect(p0, p1, p2) -} - -func (s *IMessagePoolStruct) MpoolSelects(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) { - return s.Internal.MpoolSelects(p0, p1, p2) -} - -func (s *IMessagePoolStruct) MpoolSetConfig(p0 context.Context, p1 *types.MpoolConfig) error { - return s.Internal.MpoolSetConfig(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolSub(p0 context.Context) (<-chan types.MpoolUpdate, error) { - return s.Internal.MpoolSub(p0) -} - -type IMinerStateStruct struct { - Internal struct { - StateCirculatingSupply func(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` - - StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) `perm:"read"` - - StateListActors func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` - - StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` - - StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - - StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) `perm:"read"` - - StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) `perm:"read"` - - StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) `perm:"read"` - - StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` - - StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) `perm:"read"` - - StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) `perm:"read"` - - StateMinerFaults func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - - StateMinerInfo func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) `perm:"read"` - - StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - - StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) `perm:"read"` - - StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) `perm:"read"` - - StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - - StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `perm:"read"` - - StateMinerRecoveries func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - - StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) `perm:"read"` - - StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) `perm:"read"` - - StateMinerSectorSize func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (abi.SectorSize, error) `perm:"read"` - - StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` - - StateMinerWorkerAddress func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - - StateSectorExpiration func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) `perm:"read"` - - StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` - - StateSectorPartition func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` - - StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` - - StateVMCirculatingSupplyInternal func(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) `perm:"read"` - - StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` - } -} - -func (s *IMinerStateStruct) StateCirculatingSupply(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) { - return s.Internal.StateCirculatingSupply(p0, p1) -} - -func (s *IMinerStateStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) { - return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateListActors(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { - return s.Internal.StateListActors(p0, p1) -} - -func (s *IMinerStateStruct) StateListMiners(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { - return s.Internal.StateListMiners(p0, p1) -} - -func (s *IMinerStateStruct) StateLookupID(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { - return s.Internal.StateLookupID(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) { - return s.Internal.StateMarketBalance(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) { - return s.Internal.StateMarketDeals(p0, p1) -} - -func (s *IMinerStateStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) { - return s.Internal.StateMarketStorageDeal(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerActiveSectors(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { - return s.Internal.StateMinerActiveSectors(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerAvailableBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) { - return s.Internal.StateMinerAvailableBalance(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) { - return s.Internal.StateMinerDeadlines(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerFaults(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { - return s.Internal.StateMinerFaults(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerInfo(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) { - return s.Internal.StateMinerInfo(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { - return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) { - return s.Internal.StateMinerPartitions(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) { - return s.Internal.StateMinerPower(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerPreCommitDepositForPower(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { - return s.Internal.StateMinerPreCommitDepositForPower(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerProvingDeadline(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) { - return s.Internal.StateMinerProvingDeadline(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerRecoveries(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { - return s.Internal.StateMinerRecoveries(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerSectorAllocated(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) { - return s.Internal.StateMinerSectorAllocated(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) { - return s.Internal.StateMinerSectorCount(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerSectorSize(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (abi.SectorSize, error) { - return s.Internal.StateMinerSectorSize(p0, p1, p2) +func (s *IChainInfoStruct) StateSearchMsgLimited(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*types.MsgLookup, error) { + return s.Internal.StateSearchMsgLimited(p0, p1, p2) } - -func (s *IMinerStateStruct) StateMinerSectors(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { - return s.Internal.StateMinerSectors(p0, p1, p2, p3) +func (s *IChainInfoStruct) StateVerifiedRegistryRootKey(p0 context.Context, p1 types.TipSetKey) (address.Address, error) { + return s.Internal.StateVerifiedRegistryRootKey(p0, p1) } - -func (s *IMinerStateStruct) StateMinerWorkerAddress(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { - return s.Internal.StateMinerWorkerAddress(p0, p1, p2) +func (s *IChainInfoStruct) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { + return s.Internal.StateVerifierStatus(p0, p1, p2) } - -func (s *IMinerStateStruct) StateSectorExpiration(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) { - return s.Internal.StateSectorExpiration(p0, p1, p2, p3) +func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64) (*types.MsgLookup, error) { + return s.Internal.StateWaitMsg(p0, p1, p2) } - -func (s *IMinerStateStruct) StateSectorGetInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) { - return s.Internal.StateSectorGetInfo(p0, p1, p2, p3) +func (s *IChainInfoStruct) StateWaitMsgLimited(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*types.MsgLookup, error) { + return s.Internal.StateWaitMsgLimited(p0, p1, p2, p3) } - -func (s *IMinerStateStruct) StateSectorPartition(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) { - return s.Internal.StateSectorPartition(p0, p1, p2, p3) +func (s *IChainInfoStruct) VerifyEntry(p0, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool { + return s.Internal.VerifyEntry(p0, p1, p2) } -func (s *IMinerStateStruct) StateSectorPreCommitInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { - return s.Internal.StateSectorPreCommitInfo(p0, p1, p2, p3) +type IChainStruct struct { + IAccountStruct + IActorStruct + IBeaconStruct + IMinerStateStruct + IChainInfoStruct } -func (s *IMinerStateStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) { - return s.Internal.StateVMCirculatingSupplyInternal(p0, p1) +type IMarketStruct struct { + Internal struct { + StateMarketParticipants func(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketBalance, error) `perm:"read"` + } } -func (s *IMinerStateStruct) StateVerifiedClientStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { - return s.Internal.StateVerifiedClientStatus(p0, p1, p2) +func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) { + return s.Internal.StateMarketParticipants(p0, p1) } type IMiningStruct struct { Internal struct { - MinerCreateBlock func(p0 context.Context, p1 *types.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` - - MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*types.MiningBaseInfo, error) `perm:"read"` + MinerCreateBlock func(ctx context.Context, bt *types.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` + MinerGetBaseInfo func(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*types.MiningBaseInfo, error) `perm:"read"` } } func (s *IMiningStruct) MinerCreateBlock(p0 context.Context, p1 *types.BlockTemplate) (*types.BlockMsg, error) { return s.Internal.MinerCreateBlock(p0, p1) } - func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*types.MiningBaseInfo, error) { return s.Internal.MinerGetBaseInfo(p0, p1, p2, p3) } -type IMultiSigStruct struct { +type IMessagePoolStruct struct { Internal struct { - MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) `perm:"sign"` - - MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (cid.Cid, error) `perm:"sign"` - - MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` - - MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) `perm:"sign"` - - MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) `perm:"sign"` - - MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) `perm:"sign"` - - MsigCancelTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) `perm:"sign"` - - MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) `perm:"sign"` - - MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` - - MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) `perm:"sign"` - - MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` - - MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (cid.Cid, error) `perm:"sign"` + GasBatchEstimateMessageGas func(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) `perm:"read"` + GasEstimateFeeCap func(ctx context.Context, msg *types.Message, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + GasEstimateGasLimit func(ctx context.Context, msgIn *types.Message, tsk types.TipSetKey) (int64, error) `perm:"read"` + GasEstimateGasPremium func(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + GasEstimateMessageGas func(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) `perm:"read"` + MpoolBatchPush func(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolBatchPushMessage func(ctx context.Context, msgs []*types.Message, spec *types.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` + MpoolBatchPushUntrusted func(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolClear func(ctx context.Context, local bool) error `perm:"write"` + MpoolDeleteByAdress func(ctx context.Context, addr address.Address) error `perm:"admin"` + MpoolGetConfig func(context.Context) (*types.MpoolConfig, error) `perm:"read"` + MpoolGetNonce func(ctx context.Context, addr address.Address) (uint64, error) `perm:"read"` + MpoolPending func(ctx context.Context, tsk types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` + MpoolPublishByAddr func(context.Context, address.Address) error `perm:"admin"` + MpoolPublishMessage func(ctx context.Context, smsg *types.SignedMessage) error `perm:"admin"` + MpoolPush func(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolPushMessage func(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` + MpoolPushUntrusted func(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolSelect func(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) `perm:"read"` + MpoolSelects func(context.Context, types.TipSetKey, []float64) ([][]*types.SignedMessage, error) `perm:"read"` + MpoolSetConfig func(ctx context.Context, cfg *types.MpoolConfig) error `perm:"admin"` + MpoolSub func(ctx context.Context) (<-chan types.MpoolUpdate, error) `perm:"read"` + } +} - MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (cid.Cid, error) `perm:"sign"` +func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) { + return s.Internal.GasBatchEstimateMessageGas(p0, p1, p2, p3) +} +func (s *IMessagePoolStruct) GasEstimateFeeCap(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) { + return s.Internal.GasEstimateFeeCap(p0, p1, p2, p3) +} +func (s *IMessagePoolStruct) GasEstimateGasLimit(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) { + return s.Internal.GasEstimateGasLimit(p0, p1, p2) +} +func (s *IMessagePoolStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) { + return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) +} +func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { + return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) +} +func (s *IMessagePoolStruct) MpoolBatchPush(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { + return s.Internal.MpoolBatchPush(p0, p1) +} +func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) { + return s.Internal.MpoolBatchPushMessage(p0, p1, p2) +} +func (s *IMessagePoolStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { + return s.Internal.MpoolBatchPushUntrusted(p0, p1) +} +func (s *IMessagePoolStruct) MpoolClear(p0 context.Context, p1 bool) error { + return s.Internal.MpoolClear(p0, p1) +} +func (s *IMessagePoolStruct) MpoolDeleteByAdress(p0 context.Context, p1 address.Address) error { + return s.Internal.MpoolDeleteByAdress(p0, p1) +} +func (s *IMessagePoolStruct) MpoolGetConfig(p0 context.Context) (*types.MpoolConfig, error) { + return s.Internal.MpoolGetConfig(p0) +} +func (s *IMessagePoolStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + return s.Internal.MpoolGetNonce(p0, p1) +} +func (s *IMessagePoolStruct) MpoolPending(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) { + return s.Internal.MpoolPending(p0, p1) +} +func (s *IMessagePoolStruct) MpoolPublishByAddr(p0 context.Context, p1 address.Address) error { + return s.Internal.MpoolPublishByAddr(p0, p1) +} +func (s *IMessagePoolStruct) MpoolPublishMessage(p0 context.Context, p1 *types.SignedMessage) error { + return s.Internal.MpoolPublishMessage(p0, p1) +} +func (s *IMessagePoolStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { + return s.Internal.MpoolPush(p0, p1) +} +func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) { + return s.Internal.MpoolPushMessage(p0, p1, p2) +} +func (s *IMessagePoolStruct) MpoolPushUntrusted(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { + return s.Internal.MpoolPushUntrusted(p0, p1) +} +func (s *IMessagePoolStruct) MpoolSelect(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) { + return s.Internal.MpoolSelect(p0, p1, p2) +} +func (s *IMessagePoolStruct) MpoolSelects(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) { + return s.Internal.MpoolSelects(p0, p1, p2) +} +func (s *IMessagePoolStruct) MpoolSetConfig(p0 context.Context, p1 *types.MpoolConfig) error { + return s.Internal.MpoolSetConfig(p0, p1) +} +func (s *IMessagePoolStruct) MpoolSub(p0 context.Context) (<-chan types.MpoolUpdate, error) { + return s.Internal.MpoolSub(p0) +} - MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (cid.Cid, error) `perm:"sign"` +type IMultiSigStruct struct { + Internal struct { + MsigAddApprove func(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (cid.Cid, error) `perm:"sign"` + MsigAddCancel func(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (cid.Cid, error) `perm:"sign"` + MsigAddPropose func(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (cid.Cid, error) `perm:"sign"` + MsigApprove func(ctx context.Context, msig address.Address, txID uint64, src address.Address) (cid.Cid, error) `perm:"sign"` + MsigApproveTxnHash func(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) `perm:"sign"` + MsigCancel func(ctx context.Context, msig address.Address, txID uint64, src address.Address) (cid.Cid, error) `perm:"sign"` + MsigCancelTxnHash func(context.Context, address.Address, uint64, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error) `perm:"sign"` + MsigCreate func(context.Context, uint64, []address.Address, abi.ChainEpoch, types.BigInt, address.Address, types.BigInt) (cid.Cid, error) `perm:"sign"` + MsigGetVested func(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) `perm:"read"` + MsigPropose func(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (cid.Cid, error) `perm:"sign"` + MsigRemoveSigner func(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (cid.Cid, error) `perm:"sign"` + MsigSwapApprove func(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) `perm:"sign"` + MsigSwapCancel func(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) `perm:"sign"` + MsigSwapPropose func(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (cid.Cid, error) `perm:"sign"` } } func (s *IMultiSigStruct) MsigAddApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) { return s.Internal.MsigAddApprove(p0, p1, p2, p3, p4, p5, p6) } - func (s *IMultiSigStruct) MsigAddCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (cid.Cid, error) { return s.Internal.MsigAddCancel(p0, p1, p2, p3, p4, p5) } - func (s *IMultiSigStruct) MsigAddPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) { return s.Internal.MsigAddPropose(p0, p1, p2, p3, p4) } - func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) { return s.Internal.MsigApprove(p0, p1, p2, p3) } - func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) { return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3, p4, p5, p6, p7, p8) } - func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) { return s.Internal.MsigCancel(p0, p1, p2, p3) } - func (s *IMultiSigStruct) MsigCancelTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) { return s.Internal.MsigCancelTxnHash(p0, p1, p2, p3, p4, p5, p6, p7) } - func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) { return s.Internal.MsigCreate(p0, p1, p2, p3, p4, p5, p6) } - func (s *IMultiSigStruct) MsigGetVested(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) { return s.Internal.MsigGetVested(p0, p1, p2, p3) } - func (s *IMultiSigStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) { return s.Internal.MsigPropose(p0, p1, p2, p3, p4, p5, p6) } - func (s *IMultiSigStruct) MsigRemoveSigner(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) { return s.Internal.MsigRemoveSigner(p0, p1, p2, p3, p4) } - func (s *IMultiSigStruct) MsigSwapApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (cid.Cid, error) { return s.Internal.MsigSwapApprove(p0, p1, p2, p3, p4, p5, p6) } - func (s *IMultiSigStruct) MsigSwapCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (cid.Cid, error) { return s.Internal.MsigSwapCancel(p0, p1, p2, p3, p4, p5) } - func (s *IMultiSigStruct) MsigSwapPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (cid.Cid, error) { return s.Internal.MsigSwapPropose(p0, p1, p2, p3, p4) } type INetworkStruct struct { Internal struct { - NetAddrsListen func(p0 context.Context) (peer.AddrInfo, error) `perm:"read"` - - NetworkConnect func(p0 context.Context, p1 []string) (<-chan types.ConnectionResult, error) `perm:"read"` - - NetworkFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` - - NetworkFindProvidersAsync func(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo `perm:"read"` - - NetworkGetBandwidthStats func(p0 context.Context) metrics.Stats `perm:"admin"` - - NetworkGetClosestPeers func(p0 context.Context, p1 string) ([]peer.ID, error) `perm:"read"` - - NetworkGetPeerAddresses func(p0 context.Context) []ma.Multiaddr `perm:"admin"` - - NetworkGetPeerID func(p0 context.Context) peer.ID `perm:"admin"` - - NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*types.SwarmConnInfos, error) `perm:"read"` - - Version func(p0 context.Context) (types.Version, error) `perm:"read"` + NetAddrsListen func(context.Context) (peer.AddrInfo, error) `perm:"read"` + NetworkConnect func(ctx context.Context, addrs []string) (<-chan types.ConnectionResult, error) `perm:"read"` + NetworkFindPeer func(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) `perm:"read"` + NetworkFindProvidersAsync func(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo `perm:"read"` + NetworkGetBandwidthStats func(ctx context.Context) metrics.Stats `perm:"admin"` + NetworkGetClosestPeers func(ctx context.Context, key string) ([]peer.ID, error) `perm:"read"` + NetworkGetPeerAddresses func(ctx context.Context) []ma.Multiaddr `perm:"admin"` + NetworkGetPeerID func(ctx context.Context) peer.ID `perm:"admin"` + NetworkPeers func(ctx context.Context, verbose, latency, streams bool) (*types.SwarmConnInfos, error) `perm:"read"` + Version func(context.Context) (types.Version, error) `perm:"read"` } } func (s *INetworkStruct) NetAddrsListen(p0 context.Context) (peer.AddrInfo, error) { return s.Internal.NetAddrsListen(p0) } - func (s *INetworkStruct) NetworkConnect(p0 context.Context, p1 []string) (<-chan types.ConnectionResult, error) { return s.Internal.NetworkConnect(p0, p1) } - func (s *INetworkStruct) NetworkFindPeer(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) { return s.Internal.NetworkFindPeer(p0, p1) } - func (s *INetworkStruct) NetworkFindProvidersAsync(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo { return s.Internal.NetworkFindProvidersAsync(p0, p1, p2) } - func (s *INetworkStruct) NetworkGetBandwidthStats(p0 context.Context) metrics.Stats { return s.Internal.NetworkGetBandwidthStats(p0) } - func (s *INetworkStruct) NetworkGetClosestPeers(p0 context.Context, p1 string) ([]peer.ID, error) { return s.Internal.NetworkGetClosestPeers(p0, p1) } - func (s *INetworkStruct) NetworkGetPeerAddresses(p0 context.Context) []ma.Multiaddr { return s.Internal.NetworkGetPeerAddresses(p0) } - func (s *INetworkStruct) NetworkGetPeerID(p0 context.Context) peer.ID { return s.Internal.NetworkGetPeerID(p0) } - -func (s *INetworkStruct) NetworkPeers(p0 context.Context, p1 bool, p2 bool, p3 bool) (*types.SwarmConnInfos, error) { +func (s *INetworkStruct) NetworkPeers(p0 context.Context, p1, p2, p3 bool) (*types.SwarmConnInfos, error) { return s.Internal.NetworkPeers(p0, p1, p2, p3) } - func (s *INetworkStruct) Version(p0 context.Context) (types.Version, error) { return s.Internal.Version(p0) } type IPaychanStruct struct { Internal struct { - PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` - - PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` - - PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` - - PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - - PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) `perm:"sign"` - - PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` - - PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` - - PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) `perm:"sign"` - - PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - - PaychStatus func(p0 context.Context, p1 address.Address) (*types.Status, error) `perm:"read"` - - PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` - - PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` - - PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher) error `perm:"read"` - - PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*types.VoucherCreateResult, error) `perm:"sign"` - - PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*types.SignedVoucher, error) `perm:"write"` - - PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` + PaychAllocateLane func(ctx context.Context, ch address.Address) (uint64, error) `perm:"sign"` + PaychAvailableFunds func(ctx context.Context, ch address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFundsByFromTo func(ctx context.Context, from, to address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` + PaychCollect func(ctx context.Context, addr address.Address) (cid.Cid, error) `perm:"sign"` + PaychGet func(ctx context.Context, from, to address.Address, amt big.Int) (*types.ChannelInfo, error) `perm:"sign"` + PaychGetWaitReady func(ctx context.Context, sentinel cid.Cid) (address.Address, error) `perm:"sign"` + PaychList func(ctx context.Context) ([]address.Address, error) `perm:"read"` + PaychNewPayment func(ctx context.Context, from, to address.Address, vouchers []types.VoucherSpec) (*types.PaymentInfo, error) `perm:"sign"` + PaychSettle func(ctx context.Context, addr address.Address) (cid.Cid, error) `perm:"sign"` + PaychStatus func(ctx context.Context, pch address.Address) (*types.Status, error) `perm:"read"` + PaychVoucherAdd func(ctx context.Context, ch address.Address, sv *types.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) `perm:"write"` + PaychVoucherCheckSpendable func(ctx context.Context, ch address.Address, sv *types.SignedVoucher, secret []byte, proof []byte) (bool, error) `perm:"read"` + PaychVoucherCheckValid func(ctx context.Context, ch address.Address, sv *types.SignedVoucher) error `perm:"read"` + PaychVoucherCreate func(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*types.VoucherCreateResult, error) `perm:"sign"` + PaychVoucherList func(ctx context.Context, pch address.Address) ([]*types.SignedVoucher, error) `perm:"write"` + PaychVoucherSubmit func(ctx context.Context, ch address.Address, sv *types.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) `perm:"sign"` } } func (s *IPaychanStruct) PaychAllocateLane(p0 context.Context, p1 address.Address) (uint64, error) { return s.Internal.PaychAllocateLane(p0, p1) } - func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*types.ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFunds(p0, p1) } - -func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*types.ChannelAvailableFunds, error) { +func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1, p2 address.Address) (*types.ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFundsByFromTo(p0, p1, p2) } - func (s *IPaychanStruct) PaychCollect(p0 context.Context, p1 address.Address) (cid.Cid, error) { return s.Internal.PaychCollect(p0, p1) } - -func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) { +func (s *IPaychanStruct) PaychGet(p0 context.Context, p1, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) { return s.Internal.PaychGet(p0, p1, p2, p3) } - func (s *IPaychanStruct) PaychGetWaitReady(p0 context.Context, p1 cid.Cid) (address.Address, error) { return s.Internal.PaychGetWaitReady(p0, p1) } - func (s *IPaychanStruct) PaychList(p0 context.Context) ([]address.Address, error) { return s.Internal.PaychList(p0) } - -func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) { +func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) { return s.Internal.PaychNewPayment(p0, p1, p2, p3) } - func (s *IPaychanStruct) PaychSettle(p0 context.Context, p1 address.Address) (cid.Cid, error) { return s.Internal.PaychSettle(p0, p1) } - func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*types.Status, error) { return s.Internal.PaychStatus(p0, p1) } - func (s *IPaychanStruct) PaychVoucherAdd(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) { return s.Internal.PaychVoucherAdd(p0, p1, p2, p3, p4) } - func (s *IPaychanStruct) PaychVoucherCheckSpendable(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 []byte) (bool, error) { return s.Internal.PaychVoucherCheckSpendable(p0, p1, p2, p3, p4) } - func (s *IPaychanStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher) error { return s.Internal.PaychVoucherCheckValid(p0, p1, p2) } - func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*types.VoucherCreateResult, error) { return s.Internal.PaychVoucherCreate(p0, p1, p2, p3) } - func (s *IPaychanStruct) PaychVoucherList(p0 context.Context, p1 address.Address) ([]*types.SignedVoucher, error) { return s.Internal.PaychVoucherList(p0, p1) } - func (s *IPaychanStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) { return s.Internal.PaychVoucherSubmit(p0, p1, p2, p3, p4) } type ISyncerStruct struct { Internal struct { - ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"write"` - - ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (big.Int, error) `perm:"read"` - - Concurrent func(p0 context.Context) int64 `perm:"read"` - - SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` - - StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*types.InvocResult, error) `perm:"read"` - - SyncState func(p0 context.Context) (*types.SyncState, error) `perm:"read"` - - SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` - - SyncerTracker func(p0 context.Context) *types.TargetTracker `perm:"read"` + ChainSyncHandleNewTipSet func(ctx context.Context, ci *types.ChainInfo) error `perm:"write"` + ChainTipSetWeight func(ctx context.Context, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + Concurrent func(ctx context.Context) int64 `perm:"read"` + SetConcurrent func(ctx context.Context, concurrent int64) error `perm:"admin"` + StateCall func(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*types.InvocResult, error) `perm:"read"` + SyncState func(ctx context.Context) (*types.SyncState, error) `perm:"read"` + SyncSubmitBlock func(ctx context.Context, blk *types.BlockMsg) error `perm:"write"` + SyncerTracker func(ctx context.Context) *types.TargetTracker `perm:"read"` } } func (s *ISyncerStruct) ChainSyncHandleNewTipSet(p0 context.Context, p1 *types.ChainInfo) error { return s.Internal.ChainSyncHandleNewTipSet(p0, p1) } - func (s *ISyncerStruct) ChainTipSetWeight(p0 context.Context, p1 types.TipSetKey) (big.Int, error) { return s.Internal.ChainTipSetWeight(p0, p1) } - -func (s *ISyncerStruct) Concurrent(p0 context.Context) int64 { - return s.Internal.Concurrent(p0) -} - +func (s *ISyncerStruct) Concurrent(p0 context.Context) int64 { return s.Internal.Concurrent(p0) } func (s *ISyncerStruct) SetConcurrent(p0 context.Context, p1 int64) error { return s.Internal.SetConcurrent(p0, p1) } - func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*types.InvocResult, error) { return s.Internal.StateCall(p0, p1, p2) } - func (s *ISyncerStruct) SyncState(p0 context.Context) (*types.SyncState, error) { return s.Internal.SyncState(p0) } - func (s *ISyncerStruct) SyncSubmitBlock(p0 context.Context, p1 *types.BlockMsg) error { return s.Internal.SyncSubmitBlock(p0, p1) } - func (s *ISyncerStruct) SyncerTracker(p0 context.Context) *types.TargetTracker { return s.Internal.SyncerTracker(p0) } type IWalletStruct struct { Internal struct { - HasPassword func(p0 context.Context) bool `perm:"admin"` - - LockWallet func(p0 context.Context) error `perm:"admin"` - - SetPassword func(p0 context.Context, p1 []byte) error `perm:"admin"` - - UnLockWallet func(p0 context.Context, p1 []byte) error `perm:"admin"` - - WalletAddresses func(p0 context.Context) []address.Address `perm:"admin"` - - WalletBalance func(p0 context.Context, p1 address.Address) (abi.TokenAmount, error) `perm:"read"` - - WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"` - - WalletExport func(p0 context.Context, p1 address.Address, p2 string) (*types.KeyInfo, error) `perm:"admin"` - - WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` - - WalletImport func(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) `perm:"admin"` - - WalletNewAddress func(p0 context.Context, p1 address.Protocol) (address.Address, error) `perm:"write"` - - WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` - - WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) `perm:"sign"` - - WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) `perm:"sign"` - - WalletState func(p0 context.Context) int `perm:"admin"` + HasPassword func(ctx context.Context) bool `perm:"admin"` + LockWallet func(ctx context.Context) error `perm:"admin"` + SetPassword func(ctx context.Context, password []byte) error `perm:"admin"` + UnLockWallet func(ctx context.Context, password []byte) error `perm:"admin"` + WalletAddresses func(ctx context.Context) []address.Address `perm:"admin"` + WalletBalance func(ctx context.Context, addr address.Address) (abi.TokenAmount, error) `perm:"read"` + WalletDefaultAddress func(ctx context.Context) (address.Address, error) `perm:"write"` + WalletExport func(ctx context.Context, addr address.Address, password string) (*types.KeyInfo, error) `perm:"admin"` + WalletHas func(ctx context.Context, addr address.Address) (bool, error) `perm:"write"` + WalletImport func(ctx context.Context, key *types.KeyInfo) (address.Address, error) `perm:"admin"` + WalletNewAddress func(ctx context.Context, protocol address.Protocol) (address.Address, error) `perm:"write"` + WalletSetDefault func(ctx context.Context, addr address.Address) error `perm:"write"` + WalletSign func(ctx context.Context, k address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) `perm:"sign"` + WalletSignMessage func(ctx context.Context, k address.Address, msg *types.Message) (*types.SignedMessage, error) `perm:"sign"` + WalletState func(ctx context.Context) int `perm:"admin"` } } -func (s *IWalletStruct) HasPassword(p0 context.Context) bool { - return s.Internal.HasPassword(p0) -} - -func (s *IWalletStruct) LockWallet(p0 context.Context) error { - return s.Internal.LockWallet(p0) -} - +func (s *IWalletStruct) HasPassword(p0 context.Context) bool { return s.Internal.HasPassword(p0) } +func (s *IWalletStruct) LockWallet(p0 context.Context) error { return s.Internal.LockWallet(p0) } func (s *IWalletStruct) SetPassword(p0 context.Context, p1 []byte) error { return s.Internal.SetPassword(p0, p1) } - func (s *IWalletStruct) UnLockWallet(p0 context.Context, p1 []byte) error { return s.Internal.UnLockWallet(p0, p1) } - func (s *IWalletStruct) WalletAddresses(p0 context.Context) []address.Address { return s.Internal.WalletAddresses(p0) } - func (s *IWalletStruct) WalletBalance(p0 context.Context, p1 address.Address) (abi.TokenAmount, error) { return s.Internal.WalletBalance(p0, p1) } - func (s *IWalletStruct) WalletDefaultAddress(p0 context.Context) (address.Address, error) { return s.Internal.WalletDefaultAddress(p0) } - func (s *IWalletStruct) WalletExport(p0 context.Context, p1 address.Address, p2 string) (*types.KeyInfo, error) { return s.Internal.WalletExport(p0, p1, p2) } - func (s *IWalletStruct) WalletHas(p0 context.Context, p1 address.Address) (bool, error) { return s.Internal.WalletHas(p0, p1) } - func (s *IWalletStruct) WalletImport(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) { return s.Internal.WalletImport(p0, p1) } - func (s *IWalletStruct) WalletNewAddress(p0 context.Context, p1 address.Protocol) (address.Address, error) { return s.Internal.WalletNewAddress(p0, p1) } - func (s *IWalletStruct) WalletSetDefault(p0 context.Context, p1 address.Address) error { return s.Internal.WalletSetDefault(p0, p1) } - func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) { return s.Internal.WalletSign(p0, p1, p2, p3) } - func (s *IWalletStruct) WalletSignMessage(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) { return s.Internal.WalletSignMessage(p0, p1, p2) } +func (s *IWalletStruct) WalletState(p0 context.Context) int { return s.Internal.WalletState(p0) } + +type IJwtAuthAPIStruct struct { + Internal struct { + AuthNew func(ctx context.Context, perms []auth.Permission) ([]byte, error) `perm:"admin"` + Verify func(ctx context.Context, host, token string) ([]auth.Permission, error) `perm:"read"` + } +} + +func (s *IJwtAuthAPIStruct) AuthNew(p0 context.Context, p1 []auth.Permission) ([]byte, error) { + return s.Internal.AuthNew(p0, p1) +} +func (s *IJwtAuthAPIStruct) Verify(p0 context.Context, p1, p2 string) ([]auth.Permission, error) { + return s.Internal.Verify(p0, p1, p2) +} -func (s *IWalletStruct) WalletState(p0 context.Context) int { - return s.Internal.WalletState(p0) +type FullNodeStruct struct { + IBlockStoreStruct + IChainStruct + IMarketStruct + IMiningStruct + IMessagePoolStruct + IMultiSigStruct + INetworkStruct + IPaychanStruct + ISyncerStruct + IWalletStruct + IJwtAuthAPIStruct } diff --git a/venus-shared/api/chain/v1/fullnode.go b/venus-shared/api/chain/v1/fullnode.go index aad482dd0a..d38225a0f8 100644 --- a/venus-shared/api/chain/v1/fullnode.go +++ b/venus-shared/api/chain/v1/fullnode.go @@ -1,7 +1,5 @@ package v1 -//go:generate go run github.com/golang/mock/mockgen@v1.6.0 -destination=./mock/full.go -package=mock . FullNode - type FullNode interface { IBlockStore IChain diff --git a/venus-shared/api/chain/v1/proxy_gen.go b/venus-shared/api/chain/v1/proxy_gen.go index 598daaebca..f63f0cbfe5 100644 --- a/venus-shared/api/chain/v1/proxy_gen.go +++ b/venus-shared/api/chain/v1/proxy_gen.go @@ -1,43 +1,52 @@ -// Code generated by github.com/filecoin-project/tools/gen/api. DO NOT EDIT. - +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. package v1 import ( "context" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-bitfield" + "time" + + address "github.com/filecoin-project/go-address" + bitfield "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" - "github.com/filecoin-project/venus/venus-shared/types" - "github.com/ipfs/go-cid" + cid "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" - "time" + + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/types" ) -type FullNodeStruct struct { - IBlockStoreStruct - IChainStruct - IMarketStruct - IMiningStruct - IMessagePoolStruct - IMultiSigStruct - INetworkStruct - IPaychanStruct - ISyncerStruct - IWalletStruct - IJwtAuthAPIStruct +type IBlockStoreStruct struct { + Internal struct { + ChainDeleteObj func(ctx context.Context, obj cid.Cid) error `perm:"admin"` + ChainHasObj func(ctx context.Context, obj cid.Cid) (bool, error) `perm:"read"` + ChainReadObj func(ctx context.Context, cid cid.Cid) ([]byte, error) `perm:"read"` + ChainStatObj func(ctx context.Context, obj cid.Cid, base cid.Cid) (types.ObjStat, error) `perm:"read"` + } +} + +func (s *IBlockStoreStruct) ChainDeleteObj(p0 context.Context, p1 cid.Cid) error { + return s.Internal.ChainDeleteObj(p0, p1) +} +func (s *IBlockStoreStruct) ChainHasObj(p0 context.Context, p1 cid.Cid) (bool, error) { + return s.Internal.ChainHasObj(p0, p1) +} +func (s *IBlockStoreStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { + return s.Internal.ChainReadObj(p0, p1) +} +func (s *IBlockStoreStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) { + return s.Internal.ChainStatObj(p0, p1, p2) } type IAccountStruct struct { Internal struct { - StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` + StateAccountKey func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) `perm:"read"` } } @@ -47,23 +56,21 @@ func (s *IAccountStruct) StateAccountKey(p0 context.Context, p1 address.Address, type IActorStruct struct { Internal struct { - ListActor func(p0 context.Context) (map[address.Address]*types.Actor, error) `perm:"read"` - - StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `perm:"read"` + ListActor func(ctx context.Context) (map[address.Address]*types.Actor, error) `perm:"read"` + StateGetActor func(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) `perm:"read"` } } func (s *IActorStruct) ListActor(p0 context.Context) (map[address.Address]*types.Actor, error) { return s.Internal.ListActor(p0) } - func (s *IActorStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { return s.Internal.StateGetActor(p0, p1, p2) } type IBeaconStruct struct { Internal struct { - BeaconGetEntry func(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) `perm:"read"` + BeaconGetEntry func(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) `perm:"read"` } } @@ -71,1030 +78,714 @@ func (s *IBeaconStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (* return s.Internal.BeaconGetEntry(p0, p1) } -type IBlockStoreStruct struct { +type IMinerStateStruct struct { Internal struct { - ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` - - ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"` - - ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` - - ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) `perm:"read"` + StateCirculatingSupply func(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` + StateDealProviderCollateralBounds func(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (types.DealCollateralBounds, error) `perm:"read"` + StateListActors func(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) `perm:"read"` + StateListMiners func(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) `perm:"read"` + StateLookupID func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) `perm:"read"` + StateMarketBalance func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MarketBalance, error) `perm:"read"` + StateMarketDeals func(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketDeal, error) `perm:"read"` + StateMarketStorageDeal func(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.MarketDeal, error) `perm:"read"` + StateMinerActiveSectors func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + StateMinerAvailableBalance func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerDeadlines func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]types.Deadline, error) `perm:"read"` + StateMinerFaults func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) `perm:"read"` + StateMinerInfo func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) `perm:"read"` + StateMinerInitialPledgeCollateral func(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerPartitions func(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]types.Partition, error) `perm:"read"` + StateMinerPower func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.MinerPower, error) `perm:"read"` + StateMinerPreCommitDepositForPower func(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerProvingDeadline func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) `perm:"read"` + StateMinerRecoveries func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) `perm:"read"` + StateMinerSectorAllocated func(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) `perm:"read"` + StateMinerSectorCount func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MinerSectors, error) `perm:"read"` + StateMinerSectorSize func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (abi.SectorSize, error) `perm:"read"` + StateMinerSectors func(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + StateMinerWorkerAddress func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (address.Address, error) `perm:"read"` + StateSectorExpiration func(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorExpiration, error) `perm:"read"` + StateSectorGetInfo func(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` + StateSectorPartition func(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` + StateSectorPreCommitInfo func(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` + StateVMCirculatingSupplyInternal func(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) `perm:"read"` + StateVerifiedClientStatus func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` } } -func (s *IBlockStoreStruct) ChainDeleteObj(p0 context.Context, p1 cid.Cid) error { - return s.Internal.ChainDeleteObj(p0, p1) +func (s *IMinerStateStruct) StateCirculatingSupply(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) { + return s.Internal.StateCirculatingSupply(p0, p1) } - -func (s *IBlockStoreStruct) ChainHasObj(p0 context.Context, p1 cid.Cid) (bool, error) { - return s.Internal.ChainHasObj(p0, p1) +func (s *IMinerStateStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) { + return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) } - -func (s *IBlockStoreStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { - return s.Internal.ChainReadObj(p0, p1) +func (s *IMinerStateStruct) StateListActors(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { + return s.Internal.StateListActors(p0, p1) } - -func (s *IBlockStoreStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (types.ObjStat, error) { - return s.Internal.ChainStatObj(p0, p1, p2) +func (s *IMinerStateStruct) StateListMiners(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { + return s.Internal.StateListMiners(p0, p1) } - -type IChainStruct struct { - IAccountStruct - IActorStruct - IBeaconStruct - IMinerStateStruct - IChainInfoStruct +func (s *IMinerStateStruct) StateLookupID(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { + return s.Internal.StateLookupID(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) { + return s.Internal.StateMarketBalance(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) { + return s.Internal.StateMarketDeals(p0, p1) +} +func (s *IMinerStateStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) { + return s.Internal.StateMarketStorageDeal(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerActiveSectors(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { + return s.Internal.StateMinerActiveSectors(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerAvailableBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) { + return s.Internal.StateMinerAvailableBalance(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) { + return s.Internal.StateMinerDeadlines(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerFaults(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { + return s.Internal.StateMinerFaults(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerInfo(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) { + return s.Internal.StateMinerInfo(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { + return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) { + return s.Internal.StateMinerPartitions(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) { + return s.Internal.StateMinerPower(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerPreCommitDepositForPower(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { + return s.Internal.StateMinerPreCommitDepositForPower(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateMinerProvingDeadline(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) { + return s.Internal.StateMinerProvingDeadline(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerRecoveries(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { + return s.Internal.StateMinerRecoveries(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerSectorAllocated(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) { + return s.Internal.StateMinerSectorAllocated(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) { + return s.Internal.StateMinerSectorCount(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerSectorSize(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (abi.SectorSize, error) { + return s.Internal.StateMinerSectorSize(p0, p1, p2) +} +func (s *IMinerStateStruct) StateMinerSectors(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { + return s.Internal.StateMinerSectors(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateMinerWorkerAddress(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { + return s.Internal.StateMinerWorkerAddress(p0, p1, p2) +} +func (s *IMinerStateStruct) StateSectorExpiration(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) { + return s.Internal.StateSectorExpiration(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateSectorGetInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) { + return s.Internal.StateSectorGetInfo(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateSectorPartition(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) { + return s.Internal.StateSectorPartition(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateSectorPreCommitInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { + return s.Internal.StateSectorPreCommitInfo(p0, p1, p2, p3) +} +func (s *IMinerStateStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) { + return s.Internal.StateVMCirculatingSupplyInternal(p0, p1) +} +func (s *IMinerStateStruct) StateVerifiedClientStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { + return s.Internal.StateVerifiedClientStatus(p0, p1, p2) } type IChainInfoStruct struct { Internal struct { - BlockTime func(p0 context.Context) time.Duration `perm:"read"` - - ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) `perm:"read"` - - ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) `perm:"read"` - - ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*types.BlockMessages, error) `perm:"read"` - - ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"` - - ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]types.MessageCID, error) `perm:"read"` - - ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]types.MessageCID, error) `perm:"read"` - - ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` - - ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*types.HeadChange, error) `perm:"read"` - - ChainGetRandomnessFromBeacon func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` - - ChainGetRandomnessFromTickets func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` - - ChainGetReceipts func(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) `perm:"read"` - - ChainGetTipSet func(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - - ChainGetTipSetAfterHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - - ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` - - ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"` - - ChainList func(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) `perm:"read"` - - ChainNotify func(p0 context.Context) (<-chan []*types.HeadChange, error) `perm:"read"` - - ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` - - GetActor func(p0 context.Context, p1 address.Address) (*types.Actor, error) `perm:"read"` - - GetEntry func(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) `perm:"read"` - - GetFullBlock func(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) `perm:"read"` - - GetParentStateRootActor func(p0 context.Context, p1 *types.TipSet, p2 address.Address) (*types.Actor, error) `perm:"read"` - - MessageWait func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*types.ChainMessage, error) `perm:"read"` - - ProtocolParameters func(p0 context.Context) (*types.ProtocolParams, error) `perm:"read"` - - ResolveToKeyAddr func(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) `perm:"read"` - - StateGetRandomnessFromBeacon func(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) `perm:"read"` - - StateGetRandomnessFromTickets func(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) `perm:"read"` - - StateNetworkName func(p0 context.Context) (types.NetworkName, error) `perm:"read"` - - StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (network.Version, error) `perm:"read"` - - StateSearchMsg func(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) `perm:"read"` - - StateVerifiedRegistryRootKey func(p0 context.Context, p1 types.TipSetKey) (address.Address, error) `perm:"read"` - - StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` - - StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) `perm:"read"` - - VerifyEntry func(p0 *types.BeaconEntry, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool `perm:"read"` + BlockTime func(ctx context.Context) time.Duration `perm:"read"` + ChainExport func(context.Context, abi.ChainEpoch, bool, types.TipSetKey) (<-chan []byte, error) `perm:"read"` + ChainGetBlock func(ctx context.Context, id cid.Cid) (*types.BlockHeader, error) `perm:"read"` + ChainGetBlockMessages func(ctx context.Context, bid cid.Cid) (*types.BlockMessages, error) `perm:"read"` + ChainGetMessage func(ctx context.Context, msgID cid.Cid) (*types.Message, error) `perm:"read"` + ChainGetMessagesInTipset func(ctx context.Context, key types.TipSetKey) ([]types.MessageCID, error) `perm:"read"` + ChainGetParentMessages func(ctx context.Context, bcid cid.Cid) ([]types.MessageCID, error) `perm:"read"` + ChainGetParentReceipts func(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` + ChainGetPath func(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*types.HeadChange, error) `perm:"read"` + ChainGetRandomnessFromBeacon func(ctx context.Context, key types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) `perm:"read"` + ChainGetRandomnessFromTickets func(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) `perm:"read"` + ChainGetReceipts func(ctx context.Context, id cid.Cid) ([]types.MessageReceipt, error) `perm:"read"` + ChainGetTipSet func(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) `perm:"read"` + ChainGetTipSetAfterHeight func(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) `perm:"read"` + ChainGetTipSetByHeight func(ctx context.Context, height abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) `perm:"read"` + ChainHead func(ctx context.Context) (*types.TipSet, error) `perm:"read"` + ChainList func(ctx context.Context, tsKey types.TipSetKey, count int) ([]types.TipSetKey, error) `perm:"read"` + ChainNotify func(ctx context.Context) (<-chan []*types.HeadChange, error) `perm:"read"` + ChainSetHead func(ctx context.Context, key types.TipSetKey) error `perm:"admin"` + GetActor func(ctx context.Context, addr address.Address) (*types.Actor, error) `perm:"read"` + GetEntry func(ctx context.Context, height abi.ChainEpoch, round uint64) (*types.BeaconEntry, error) `perm:"read"` + GetFullBlock func(ctx context.Context, id cid.Cid) (*types.FullBlock, error) `perm:"read"` + GetParentStateRootActor func(ctx context.Context, ts *types.TipSet, addr address.Address) (*types.Actor, error) `perm:"read"` + MessageWait func(ctx context.Context, msgCid cid.Cid, confidence, lookback abi.ChainEpoch) (*types.ChainMessage, error) `perm:"read"` + ProtocolParameters func(ctx context.Context) (*types.ProtocolParams, error) `perm:"read"` + ResolveToKeyAddr func(ctx context.Context, addr address.Address, ts *types.TipSet) (address.Address, error) `perm:"read"` + StateGetRandomnessFromBeacon func(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) `perm:"read"` + StateGetRandomnessFromTickets func(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) `perm:"read"` + StateNetworkName func(ctx context.Context) (types.NetworkName, error) `perm:"read"` + StateNetworkVersion func(ctx context.Context, tsk types.TipSetKey) (network.Version, error) `perm:"read"` + StateSearchMsg func(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) `perm:"read"` + StateVerifiedRegistryRootKey func(ctx context.Context, tsk types.TipSetKey) (address.Address, error) `perm:"read"` + StateVerifierStatus func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` + StateWaitMsg func(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*types.MsgLookup, error) `perm:"read"` + VerifyEntry func(parent, child *types.BeaconEntry, height abi.ChainEpoch) bool `perm:"read"` } } func (s *IChainInfoStruct) BlockTime(p0 context.Context) time.Duration { return s.Internal.BlockTime(p0) } - func (s *IChainInfoStruct) ChainExport(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) { return s.Internal.ChainExport(p0, p1, p2, p3) } - func (s *IChainInfoStruct) ChainGetBlock(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) { return s.Internal.ChainGetBlock(p0, p1) } - func (s *IChainInfoStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*types.BlockMessages, error) { return s.Internal.ChainGetBlockMessages(p0, p1) } - func (s *IChainInfoStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*types.Message, error) { return s.Internal.ChainGetMessage(p0, p1) } - func (s *IChainInfoStruct) ChainGetMessagesInTipset(p0 context.Context, p1 types.TipSetKey) ([]types.MessageCID, error) { return s.Internal.ChainGetMessagesInTipset(p0, p1) } - func (s *IChainInfoStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]types.MessageCID, error) { return s.Internal.ChainGetParentMessages(p0, p1) } - func (s *IChainInfoStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) { return s.Internal.ChainGetParentReceipts(p0, p1) } - func (s *IChainInfoStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*types.HeadChange, error) { return s.Internal.ChainGetPath(p0, p1, p2) } - func (s *IChainInfoStruct) ChainGetRandomnessFromBeacon(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { return s.Internal.ChainGetRandomnessFromBeacon(p0, p1, p2, p3, p4) } - func (s *IChainInfoStruct) ChainGetRandomnessFromTickets(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { return s.Internal.ChainGetRandomnessFromTickets(p0, p1, p2, p3, p4) } - func (s *IChainInfoStruct) ChainGetReceipts(p0 context.Context, p1 cid.Cid) ([]types.MessageReceipt, error) { return s.Internal.ChainGetReceipts(p0, p1) } - func (s *IChainInfoStruct) ChainGetTipSet(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) { return s.Internal.ChainGetTipSet(p0, p1) } - func (s *IChainInfoStruct) ChainGetTipSetAfterHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { return s.Internal.ChainGetTipSetAfterHeight(p0, p1, p2) } - func (s *IChainInfoStruct) ChainGetTipSetByHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { return s.Internal.ChainGetTipSetByHeight(p0, p1, p2) } - func (s *IChainInfoStruct) ChainHead(p0 context.Context) (*types.TipSet, error) { return s.Internal.ChainHead(p0) } - func (s *IChainInfoStruct) ChainList(p0 context.Context, p1 types.TipSetKey, p2 int) ([]types.TipSetKey, error) { return s.Internal.ChainList(p0, p1, p2) } - func (s *IChainInfoStruct) ChainNotify(p0 context.Context) (<-chan []*types.HeadChange, error) { return s.Internal.ChainNotify(p0) } - func (s *IChainInfoStruct) ChainSetHead(p0 context.Context, p1 types.TipSetKey) error { return s.Internal.ChainSetHead(p0, p1) } - func (s *IChainInfoStruct) GetActor(p0 context.Context, p1 address.Address) (*types.Actor, error) { return s.Internal.GetActor(p0, p1) } - func (s *IChainInfoStruct) GetEntry(p0 context.Context, p1 abi.ChainEpoch, p2 uint64) (*types.BeaconEntry, error) { return s.Internal.GetEntry(p0, p1, p2) } - func (s *IChainInfoStruct) GetFullBlock(p0 context.Context, p1 cid.Cid) (*types.FullBlock, error) { return s.Internal.GetFullBlock(p0, p1) } - func (s *IChainInfoStruct) GetParentStateRootActor(p0 context.Context, p1 *types.TipSet, p2 address.Address) (*types.Actor, error) { return s.Internal.GetParentStateRootActor(p0, p1, p2) } - -func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch, p3 abi.ChainEpoch) (*types.ChainMessage, error) { +func (s *IChainInfoStruct) MessageWait(p0 context.Context, p1 cid.Cid, p2, p3 abi.ChainEpoch) (*types.ChainMessage, error) { return s.Internal.MessageWait(p0, p1, p2, p3) } - func (s *IChainInfoStruct) ProtocolParameters(p0 context.Context) (*types.ProtocolParams, error) { return s.Internal.ProtocolParameters(p0) } - func (s *IChainInfoStruct) ResolveToKeyAddr(p0 context.Context, p1 address.Address, p2 *types.TipSet) (address.Address, error) { return s.Internal.ResolveToKeyAddr(p0, p1, p2) } - func (s *IChainInfoStruct) StateGetRandomnessFromBeacon(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) { return s.Internal.StateGetRandomnessFromBeacon(p0, p1, p2, p3, p4) } - func (s *IChainInfoStruct) StateGetRandomnessFromTickets(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) { return s.Internal.StateGetRandomnessFromTickets(p0, p1, p2, p3, p4) } - func (s *IChainInfoStruct) StateNetworkName(p0 context.Context) (types.NetworkName, error) { return s.Internal.StateNetworkName(p0) } - func (s *IChainInfoStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (network.Version, error) { return s.Internal.StateNetworkVersion(p0, p1) } - func (s *IChainInfoStruct) StateSearchMsg(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) { return s.Internal.StateSearchMsg(p0, p1, p2, p3, p4) } - -func (s *IChainInfoStruct) StateVerifiedRegistryRootKey(p0 context.Context, p1 types.TipSetKey) (address.Address, error) { - return s.Internal.StateVerifiedRegistryRootKey(p0, p1) -} - -func (s *IChainInfoStruct) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { - return s.Internal.StateVerifierStatus(p0, p1, p2) -} - -func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) { - return s.Internal.StateWaitMsg(p0, p1, p2, p3, p4) -} - -func (s *IChainInfoStruct) VerifyEntry(p0 *types.BeaconEntry, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool { - return s.Internal.VerifyEntry(p0, p1, p2) -} - -type IJwtAuthAPIStruct struct { - Internal struct { - AuthNew func(p0 context.Context, p1 []auth.Permission) ([]byte, error) `perm:"admin"` - - Verify func(p0 context.Context, p1 string, p2 string) ([]auth.Permission, error) `perm:"read"` - } -} - -func (s *IJwtAuthAPIStruct) AuthNew(p0 context.Context, p1 []auth.Permission) ([]byte, error) { - return s.Internal.AuthNew(p0, p1) -} - -func (s *IJwtAuthAPIStruct) Verify(p0 context.Context, p1 string, p2 string) ([]auth.Permission, error) { - return s.Internal.Verify(p0, p1, p2) -} - -type IMarketStruct struct { - Internal struct { - StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) `perm:"read"` - } -} - -func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) { - return s.Internal.StateMarketParticipants(p0, p1) -} - -type IMessagePoolStruct struct { - Internal struct { - GasBatchEstimateMessageGas func(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) `perm:"read"` - - GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - - GasEstimateGasLimit func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) `perm:"read"` - - GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) `perm:"read"` - - GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"` - - MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - - MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` - - MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - - MpoolCheckMessages func(p0 context.Context, p1 []*types.MessagePrototype) ([][]types.MessageCheckStatus, error) `perm:"read"` - - MpoolCheckPendingMessages func(p0 context.Context, p1 address.Address) ([][]types.MessageCheckStatus, error) `perm:"read"` - - MpoolCheckReplaceMessages func(p0 context.Context, p1 []*types.Message) ([][]types.MessageCheckStatus, error) `perm:"read"` - - MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` - - MpoolDeleteByAdress func(p0 context.Context, p1 address.Address) error `perm:"admin"` - - MpoolGetConfig func(p0 context.Context) (*types.MpoolConfig, error) `perm:"read"` - - MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` - - MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` - - MpoolPublishByAddr func(p0 context.Context, p1 address.Address) error `perm:"write"` - - MpoolPublishMessage func(p0 context.Context, p1 *types.SignedMessage) error `perm:"write"` - - MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - - MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` - - MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - - MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` - - MpoolSelects func(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) `perm:"read"` - - MpoolSetConfig func(p0 context.Context, p1 *types.MpoolConfig) error `perm:"admin"` - - MpoolSub func(p0 context.Context) (<-chan types.MpoolUpdate, error) `perm:"read"` - } -} - -func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) { - return s.Internal.GasBatchEstimateMessageGas(p0, p1, p2, p3) -} - -func (s *IMessagePoolStruct) GasEstimateFeeCap(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) { - return s.Internal.GasEstimateFeeCap(p0, p1, p2, p3) -} - -func (s *IMessagePoolStruct) GasEstimateGasLimit(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) { - return s.Internal.GasEstimateGasLimit(p0, p1, p2) -} - -func (s *IMessagePoolStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) { - return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) -} - -func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { - return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) -} - -func (s *IMessagePoolStruct) MpoolBatchPush(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { - return s.Internal.MpoolBatchPush(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) { - return s.Internal.MpoolBatchPushMessage(p0, p1, p2) -} - -func (s *IMessagePoolStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { - return s.Internal.MpoolBatchPushUntrusted(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolCheckMessages(p0 context.Context, p1 []*types.MessagePrototype) ([][]types.MessageCheckStatus, error) { - return s.Internal.MpoolCheckMessages(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolCheckPendingMessages(p0 context.Context, p1 address.Address) ([][]types.MessageCheckStatus, error) { - return s.Internal.MpoolCheckPendingMessages(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolCheckReplaceMessages(p0 context.Context, p1 []*types.Message) ([][]types.MessageCheckStatus, error) { - return s.Internal.MpoolCheckReplaceMessages(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolClear(p0 context.Context, p1 bool) error { - return s.Internal.MpoolClear(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolDeleteByAdress(p0 context.Context, p1 address.Address) error { - return s.Internal.MpoolDeleteByAdress(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolGetConfig(p0 context.Context) (*types.MpoolConfig, error) { - return s.Internal.MpoolGetConfig(p0) -} - -func (s *IMessagePoolStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { - return s.Internal.MpoolGetNonce(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPending(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) { - return s.Internal.MpoolPending(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPublishByAddr(p0 context.Context, p1 address.Address) error { - return s.Internal.MpoolPublishByAddr(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPublishMessage(p0 context.Context, p1 *types.SignedMessage) error { - return s.Internal.MpoolPublishMessage(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { - return s.Internal.MpoolPush(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) { - return s.Internal.MpoolPushMessage(p0, p1, p2) -} - -func (s *IMessagePoolStruct) MpoolPushUntrusted(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { - return s.Internal.MpoolPushUntrusted(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolSelect(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) { - return s.Internal.MpoolSelect(p0, p1, p2) -} - -func (s *IMessagePoolStruct) MpoolSelects(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) { - return s.Internal.MpoolSelects(p0, p1, p2) -} - -func (s *IMessagePoolStruct) MpoolSetConfig(p0 context.Context, p1 *types.MpoolConfig) error { - return s.Internal.MpoolSetConfig(p0, p1) -} - -func (s *IMessagePoolStruct) MpoolSub(p0 context.Context) (<-chan types.MpoolUpdate, error) { - return s.Internal.MpoolSub(p0) -} - -type IMinerStateStruct struct { - Internal struct { - StateCirculatingSupply func(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` - - StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) `perm:"read"` - - StateListActors func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` - - StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` - - StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - - StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) `perm:"read"` - - StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) `perm:"read"` - - StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) `perm:"read"` - - StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` - - StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) `perm:"read"` - - StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) `perm:"read"` - - StateMinerFaults func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - - StateMinerInfo func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) `perm:"read"` - - StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - - StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) `perm:"read"` - - StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) `perm:"read"` - - StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) `perm:"read"` - - StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `perm:"read"` - - StateMinerRecoveries func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - - StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) `perm:"read"` - - StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) `perm:"read"` - - StateMinerSectorSize func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (abi.SectorSize, error) `perm:"read"` - - StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` - - StateMinerWorkerAddress func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - - StateSectorExpiration func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) `perm:"read"` - - StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` - - StateSectorPartition func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` - - StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` - - StateVMCirculatingSupplyInternal func(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) `perm:"read"` - - StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` - } -} - -func (s *IMinerStateStruct) StateCirculatingSupply(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) { - return s.Internal.StateCirculatingSupply(p0, p1) -} - -func (s *IMinerStateStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (types.DealCollateralBounds, error) { - return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateListActors(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { - return s.Internal.StateListActors(p0, p1) -} - -func (s *IMinerStateStruct) StateListMiners(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { - return s.Internal.StateListMiners(p0, p1) -} - -func (s *IMinerStateStruct) StateLookupID(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { - return s.Internal.StateLookupID(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MarketBalance, error) { - return s.Internal.StateMarketBalance(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketDeal, error) { - return s.Internal.StateMarketDeals(p0, p1) -} - -func (s *IMinerStateStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.MarketDeal, error) { - return s.Internal.StateMarketStorageDeal(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerActiveSectors(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { - return s.Internal.StateMinerActiveSectors(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerAvailableBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (big.Int, error) { - return s.Internal.StateMinerAvailableBalance(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]types.Deadline, error) { - return s.Internal.StateMinerDeadlines(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerFaults(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { - return s.Internal.StateMinerFaults(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerInfo(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) { - return s.Internal.StateMinerInfo(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { - return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) { - return s.Internal.StateMinerPartitions(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.MinerPower, error) { - return s.Internal.StateMinerPower(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerPreCommitDepositForPower(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { - return s.Internal.StateMinerPreCommitDepositForPower(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerProvingDeadline(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) { - return s.Internal.StateMinerProvingDeadline(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerRecoveries(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { - return s.Internal.StateMinerRecoveries(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerSectorAllocated(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) { - return s.Internal.StateMinerSectorAllocated(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.MinerSectors, error) { - return s.Internal.StateMinerSectorCount(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerSectorSize(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (abi.SectorSize, error) { - return s.Internal.StateMinerSectorSize(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateMinerSectors(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { - return s.Internal.StateMinerSectors(p0, p1, p2, p3) -} - -func (s *IMinerStateStruct) StateMinerWorkerAddress(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { - return s.Internal.StateMinerWorkerAddress(p0, p1, p2) -} - -func (s *IMinerStateStruct) StateSectorExpiration(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) { - return s.Internal.StateSectorExpiration(p0, p1, p2, p3) +func (s *IChainInfoStruct) StateVerifiedRegistryRootKey(p0 context.Context, p1 types.TipSetKey) (address.Address, error) { + return s.Internal.StateVerifiedRegistryRootKey(p0, p1) } - -func (s *IMinerStateStruct) StateSectorGetInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) { - return s.Internal.StateSectorGetInfo(p0, p1, p2, p3) +func (s *IChainInfoStruct) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { + return s.Internal.StateVerifierStatus(p0, p1, p2) } - -func (s *IMinerStateStruct) StateSectorPartition(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) { - return s.Internal.StateSectorPartition(p0, p1, p2, p3) +func (s *IChainInfoStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch, p4 bool) (*types.MsgLookup, error) { + return s.Internal.StateWaitMsg(p0, p1, p2, p3, p4) +} +func (s *IChainInfoStruct) VerifyEntry(p0, p1 *types.BeaconEntry, p2 abi.ChainEpoch) bool { + return s.Internal.VerifyEntry(p0, p1, p2) } -func (s *IMinerStateStruct) StateSectorPreCommitInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { - return s.Internal.StateSectorPreCommitInfo(p0, p1, p2, p3) +type IChainStruct struct { + IAccountStruct + IActorStruct + IBeaconStruct + IMinerStateStruct + IChainInfoStruct } -func (s *IMinerStateStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 types.TipSetKey) (types.CirculatingSupply, error) { - return s.Internal.StateVMCirculatingSupplyInternal(p0, p1) +type IMarketStruct struct { + Internal struct { + StateMarketParticipants func(ctx context.Context, tsk types.TipSetKey) (map[string]types.MarketBalance, error) `perm:"read"` + } } -func (s *IMinerStateStruct) StateVerifiedClientStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { - return s.Internal.StateVerifiedClientStatus(p0, p1, p2) +func (s *IMarketStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]types.MarketBalance, error) { + return s.Internal.StateMarketParticipants(p0, p1) } type IMiningStruct struct { Internal struct { - MinerCreateBlock func(p0 context.Context, p1 *types.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` - - MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*types.MiningBaseInfo, error) `perm:"read"` + MinerCreateBlock func(ctx context.Context, bt *types.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` + MinerGetBaseInfo func(ctx context.Context, maddr address.Address, round abi.ChainEpoch, tsk types.TipSetKey) (*types.MiningBaseInfo, error) `perm:"read"` } } func (s *IMiningStruct) MinerCreateBlock(p0 context.Context, p1 *types.BlockTemplate) (*types.BlockMsg, error) { return s.Internal.MinerCreateBlock(p0, p1) } - func (s *IMiningStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*types.MiningBaseInfo, error) { return s.Internal.MinerGetBaseInfo(p0, p1, p2, p3) } -type IMultiSigStruct struct { +type IMessagePoolStruct struct { Internal struct { - MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*types.MessagePrototype, error) `perm:"sign"` - - MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*types.MessagePrototype, error) `perm:"sign"` - - MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*types.MessagePrototype, error) `perm:"sign"` - - MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) `perm:"sign"` - - MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*types.MessagePrototype, error) `perm:"sign"` - - MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) `perm:"sign"` - - MsigCancelTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*types.MessagePrototype, error) `perm:"sign"` - - MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*types.MessagePrototype, error) `perm:"sign"` - - MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` - - MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*types.MessagePrototype, error) `perm:"sign"` - - MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*types.MessagePrototype, error) `perm:"sign"` - - MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*types.MessagePrototype, error) `perm:"sign"` + GasBatchEstimateMessageGas func(ctx context.Context, estimateMessages []*types.EstimateMessage, fromNonce uint64, tsk types.TipSetKey) ([]*types.EstimateResult, error) `perm:"read"` + GasEstimateFeeCap func(ctx context.Context, msg *types.Message, maxqueueblks int64, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + GasEstimateGasLimit func(ctx context.Context, msgIn *types.Message, tsk types.TipSetKey) (int64, error) `perm:"read"` + GasEstimateGasPremium func(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + GasEstimateMessageGas func(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) `perm:"read"` + MpoolBatchPush func(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolBatchPushMessage func(ctx context.Context, msgs []*types.Message, spec *types.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` + MpoolBatchPushUntrusted func(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + MpoolCheckMessages func(ctx context.Context, protos []*types.MessagePrototype) ([][]types.MessageCheckStatus, error) `perm:"read"` + MpoolCheckPendingMessages func(ctx context.Context, addr address.Address) ([][]types.MessageCheckStatus, error) `perm:"read"` + MpoolCheckReplaceMessages func(ctx context.Context, msg []*types.Message) ([][]types.MessageCheckStatus, error) `perm:"read"` + MpoolClear func(ctx context.Context, local bool) error `perm:"write"` + MpoolDeleteByAdress func(ctx context.Context, addr address.Address) error `perm:"admin"` + MpoolGetConfig func(context.Context) (*types.MpoolConfig, error) `perm:"read"` + MpoolGetNonce func(ctx context.Context, addr address.Address) (uint64, error) `perm:"read"` + MpoolPending func(ctx context.Context, tsk types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` + MpoolPublishByAddr func(context.Context, address.Address) error `perm:"write"` + MpoolPublishMessage func(ctx context.Context, smsg *types.SignedMessage) error `perm:"write"` + MpoolPush func(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolPushMessage func(ctx context.Context, msg *types.Message, spec *types.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` + MpoolPushUntrusted func(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) `perm:"write"` + MpoolSelect func(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) `perm:"read"` + MpoolSelects func(context.Context, types.TipSetKey, []float64) ([][]*types.SignedMessage, error) `perm:"read"` + MpoolSetConfig func(ctx context.Context, cfg *types.MpoolConfig) error `perm:"admin"` + MpoolSub func(ctx context.Context) (<-chan types.MpoolUpdate, error) `perm:"read"` + } +} - MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*types.MessagePrototype, error) `perm:"sign"` +func (s *IMessagePoolStruct) GasBatchEstimateMessageGas(p0 context.Context, p1 []*types.EstimateMessage, p2 uint64, p3 types.TipSetKey) ([]*types.EstimateResult, error) { + return s.Internal.GasBatchEstimateMessageGas(p0, p1, p2, p3) +} +func (s *IMessagePoolStruct) GasEstimateFeeCap(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (big.Int, error) { + return s.Internal.GasEstimateFeeCap(p0, p1, p2, p3) +} +func (s *IMessagePoolStruct) GasEstimateGasLimit(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) { + return s.Internal.GasEstimateGasLimit(p0, p1, p2) +} +func (s *IMessagePoolStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (big.Int, error) { + return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) +} +func (s *IMessagePoolStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { + return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) +} +func (s *IMessagePoolStruct) MpoolBatchPush(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { + return s.Internal.MpoolBatchPush(p0, p1) +} +func (s *IMessagePoolStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *types.MessageSendSpec) ([]*types.SignedMessage, error) { + return s.Internal.MpoolBatchPushMessage(p0, p1, p2) +} +func (s *IMessagePoolStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { + return s.Internal.MpoolBatchPushUntrusted(p0, p1) +} +func (s *IMessagePoolStruct) MpoolCheckMessages(p0 context.Context, p1 []*types.MessagePrototype) ([][]types.MessageCheckStatus, error) { + return s.Internal.MpoolCheckMessages(p0, p1) +} +func (s *IMessagePoolStruct) MpoolCheckPendingMessages(p0 context.Context, p1 address.Address) ([][]types.MessageCheckStatus, error) { + return s.Internal.MpoolCheckPendingMessages(p0, p1) +} +func (s *IMessagePoolStruct) MpoolCheckReplaceMessages(p0 context.Context, p1 []*types.Message) ([][]types.MessageCheckStatus, error) { + return s.Internal.MpoolCheckReplaceMessages(p0, p1) +} +func (s *IMessagePoolStruct) MpoolClear(p0 context.Context, p1 bool) error { + return s.Internal.MpoolClear(p0, p1) +} +func (s *IMessagePoolStruct) MpoolDeleteByAdress(p0 context.Context, p1 address.Address) error { + return s.Internal.MpoolDeleteByAdress(p0, p1) +} +func (s *IMessagePoolStruct) MpoolGetConfig(p0 context.Context) (*types.MpoolConfig, error) { + return s.Internal.MpoolGetConfig(p0) +} +func (s *IMessagePoolStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + return s.Internal.MpoolGetNonce(p0, p1) +} +func (s *IMessagePoolStruct) MpoolPending(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) { + return s.Internal.MpoolPending(p0, p1) +} +func (s *IMessagePoolStruct) MpoolPublishByAddr(p0 context.Context, p1 address.Address) error { + return s.Internal.MpoolPublishByAddr(p0, p1) +} +func (s *IMessagePoolStruct) MpoolPublishMessage(p0 context.Context, p1 *types.SignedMessage) error { + return s.Internal.MpoolPublishMessage(p0, p1) +} +func (s *IMessagePoolStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { + return s.Internal.MpoolPush(p0, p1) +} +func (s *IMessagePoolStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (*types.SignedMessage, error) { + return s.Internal.MpoolPushMessage(p0, p1, p2) +} +func (s *IMessagePoolStruct) MpoolPushUntrusted(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { + return s.Internal.MpoolPushUntrusted(p0, p1) +} +func (s *IMessagePoolStruct) MpoolSelect(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) { + return s.Internal.MpoolSelect(p0, p1, p2) +} +func (s *IMessagePoolStruct) MpoolSelects(p0 context.Context, p1 types.TipSetKey, p2 []float64) ([][]*types.SignedMessage, error) { + return s.Internal.MpoolSelects(p0, p1, p2) +} +func (s *IMessagePoolStruct) MpoolSetConfig(p0 context.Context, p1 *types.MpoolConfig) error { + return s.Internal.MpoolSetConfig(p0, p1) +} +func (s *IMessagePoolStruct) MpoolSub(p0 context.Context) (<-chan types.MpoolUpdate, error) { + return s.Internal.MpoolSub(p0) +} - MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*types.MessagePrototype, error) `perm:"sign"` +type IMultiSigStruct struct { + Internal struct { + MsigAddApprove func(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, newAdd address.Address, inc bool) (*types.MessagePrototype, error) `perm:"sign"` + MsigAddCancel func(ctx context.Context, msig address.Address, src address.Address, txID uint64, newAdd address.Address, inc bool) (*types.MessagePrototype, error) `perm:"sign"` + MsigAddPropose func(ctx context.Context, msig address.Address, src address.Address, newAdd address.Address, inc bool) (*types.MessagePrototype, error) `perm:"sign"` + MsigApprove func(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*types.MessagePrototype, error) `perm:"sign"` + MsigApproveTxnHash func(ctx context.Context, msig address.Address, txID uint64, proposer address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*types.MessagePrototype, error) `perm:"sign"` + MsigCancel func(ctx context.Context, msig address.Address, txID uint64, src address.Address) (*types.MessagePrototype, error) `perm:"sign"` + MsigCancelTxnHash func(context.Context, address.Address, uint64, address.Address, types.BigInt, address.Address, uint64, []byte) (*types.MessagePrototype, error) `perm:"sign"` + MsigCreate func(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (*types.MessagePrototype, error) `perm:"sign"` + MsigGetVested func(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) `perm:"read"` + MsigPropose func(ctx context.Context, msig address.Address, to address.Address, amt types.BigInt, src address.Address, method uint64, params []byte) (*types.MessagePrototype, error) `perm:"sign"` + MsigRemoveSigner func(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (*types.MessagePrototype, error) `perm:"sign"` + MsigSwapApprove func(ctx context.Context, msig address.Address, src address.Address, txID uint64, proposer address.Address, oldAdd address.Address, newAdd address.Address) (*types.MessagePrototype, error) `perm:"sign"` + MsigSwapCancel func(ctx context.Context, msig address.Address, src address.Address, txID uint64, oldAdd address.Address, newAdd address.Address) (*types.MessagePrototype, error) `perm:"sign"` + MsigSwapPropose func(ctx context.Context, msig address.Address, src address.Address, oldAdd address.Address, newAdd address.Address) (*types.MessagePrototype, error) `perm:"sign"` } } func (s *IMultiSigStruct) MsigAddApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (*types.MessagePrototype, error) { return s.Internal.MsigAddApprove(p0, p1, p2, p3, p4, p5, p6) } - func (s *IMultiSigStruct) MsigAddCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (*types.MessagePrototype, error) { return s.Internal.MsigAddCancel(p0, p1, p2, p3, p4, p5) } - func (s *IMultiSigStruct) MsigAddPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*types.MessagePrototype, error) { return s.Internal.MsigAddPropose(p0, p1, p2, p3, p4) } - func (s *IMultiSigStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) { return s.Internal.MsigApprove(p0, p1, p2, p3) } - func (s *IMultiSigStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (*types.MessagePrototype, error) { return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3, p4, p5, p6, p7, p8) } - func (s *IMultiSigStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (*types.MessagePrototype, error) { return s.Internal.MsigCancel(p0, p1, p2, p3) } - func (s *IMultiSigStruct) MsigCancelTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (*types.MessagePrototype, error) { return s.Internal.MsigCancelTxnHash(p0, p1, p2, p3, p4, p5, p6, p7) } - func (s *IMultiSigStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (*types.MessagePrototype, error) { return s.Internal.MsigCreate(p0, p1, p2, p3, p4, p5, p6) } - func (s *IMultiSigStruct) MsigGetVested(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) { return s.Internal.MsigGetVested(p0, p1, p2, p3) } - func (s *IMultiSigStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (*types.MessagePrototype, error) { return s.Internal.MsigPropose(p0, p1, p2, p3, p4, p5, p6) } - func (s *IMultiSigStruct) MsigRemoveSigner(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (*types.MessagePrototype, error) { return s.Internal.MsigRemoveSigner(p0, p1, p2, p3, p4) } - func (s *IMultiSigStruct) MsigSwapApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (*types.MessagePrototype, error) { return s.Internal.MsigSwapApprove(p0, p1, p2, p3, p4, p5, p6) } - func (s *IMultiSigStruct) MsigSwapCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (*types.MessagePrototype, error) { return s.Internal.MsigSwapCancel(p0, p1, p2, p3, p4, p5) } - func (s *IMultiSigStruct) MsigSwapPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (*types.MessagePrototype, error) { return s.Internal.MsigSwapPropose(p0, p1, p2, p3, p4) } type INetworkStruct struct { Internal struct { - NetAddrsListen func(p0 context.Context) (peer.AddrInfo, error) `perm:"read"` - - NetworkConnect func(p0 context.Context, p1 []string) (<-chan types.ConnectionResult, error) `perm:"read"` - - NetworkFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` - - NetworkFindProvidersAsync func(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo `perm:"read"` - - NetworkGetBandwidthStats func(p0 context.Context) metrics.Stats `perm:"admin"` - - NetworkGetClosestPeers func(p0 context.Context, p1 string) ([]peer.ID, error) `perm:"read"` - - NetworkGetPeerAddresses func(p0 context.Context) []ma.Multiaddr `perm:"admin"` - - NetworkGetPeerID func(p0 context.Context) peer.ID `perm:"admin"` - - NetworkPeers func(p0 context.Context, p1 bool, p2 bool, p3 bool) (*types.SwarmConnInfos, error) `perm:"read"` - - Version func(p0 context.Context) (types.Version, error) `perm:"read"` + NetAddrsListen func(context.Context) (peer.AddrInfo, error) `perm:"read"` + NetworkConnect func(ctx context.Context, addrs []string) (<-chan types.ConnectionResult, error) `perm:"read"` + NetworkFindPeer func(ctx context.Context, peerID peer.ID) (peer.AddrInfo, error) `perm:"read"` + NetworkFindProvidersAsync func(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo `perm:"read"` + NetworkGetBandwidthStats func(ctx context.Context) metrics.Stats `perm:"admin"` + NetworkGetClosestPeers func(ctx context.Context, key string) ([]peer.ID, error) `perm:"read"` + NetworkGetPeerAddresses func(ctx context.Context) []ma.Multiaddr `perm:"admin"` + NetworkGetPeerID func(ctx context.Context) peer.ID `perm:"admin"` + NetworkPeers func(ctx context.Context, verbose, latency, streams bool) (*types.SwarmConnInfos, error) `perm:"read"` + Version func(context.Context) (types.Version, error) `perm:"read"` } } func (s *INetworkStruct) NetAddrsListen(p0 context.Context) (peer.AddrInfo, error) { return s.Internal.NetAddrsListen(p0) } - func (s *INetworkStruct) NetworkConnect(p0 context.Context, p1 []string) (<-chan types.ConnectionResult, error) { return s.Internal.NetworkConnect(p0, p1) } - func (s *INetworkStruct) NetworkFindPeer(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) { return s.Internal.NetworkFindPeer(p0, p1) } - func (s *INetworkStruct) NetworkFindProvidersAsync(p0 context.Context, p1 cid.Cid, p2 int) <-chan peer.AddrInfo { return s.Internal.NetworkFindProvidersAsync(p0, p1, p2) } - func (s *INetworkStruct) NetworkGetBandwidthStats(p0 context.Context) metrics.Stats { return s.Internal.NetworkGetBandwidthStats(p0) } - func (s *INetworkStruct) NetworkGetClosestPeers(p0 context.Context, p1 string) ([]peer.ID, error) { return s.Internal.NetworkGetClosestPeers(p0, p1) } - func (s *INetworkStruct) NetworkGetPeerAddresses(p0 context.Context) []ma.Multiaddr { return s.Internal.NetworkGetPeerAddresses(p0) } - func (s *INetworkStruct) NetworkGetPeerID(p0 context.Context) peer.ID { return s.Internal.NetworkGetPeerID(p0) } - -func (s *INetworkStruct) NetworkPeers(p0 context.Context, p1 bool, p2 bool, p3 bool) (*types.SwarmConnInfos, error) { +func (s *INetworkStruct) NetworkPeers(p0 context.Context, p1, p2, p3 bool) (*types.SwarmConnInfos, error) { return s.Internal.NetworkPeers(p0, p1, p2, p3) } - func (s *INetworkStruct) Version(p0 context.Context) (types.Version, error) { return s.Internal.Version(p0) } type IPaychanStruct struct { Internal struct { - PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` - - PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` - - PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` - - PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - - PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) `perm:"sign"` - - PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` - - PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` - - PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) `perm:"sign"` - - PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - - PaychStatus func(p0 context.Context, p1 address.Address) (*types.Status, error) `perm:"read"` - - PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) `perm:"write"` - - PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` - - PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher) error `perm:"read"` - - PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*types.VoucherCreateResult, error) `perm:"sign"` - - PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*types.SignedVoucher, error) `perm:"write"` - - PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` + PaychAllocateLane func(ctx context.Context, ch address.Address) (uint64, error) `perm:"sign"` + PaychAvailableFunds func(ctx context.Context, ch address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFundsByFromTo func(ctx context.Context, from, to address.Address) (*types.ChannelAvailableFunds, error) `perm:"sign"` + PaychCollect func(ctx context.Context, addr address.Address) (cid.Cid, error) `perm:"sign"` + PaychGet func(ctx context.Context, from, to address.Address, amt big.Int) (*types.ChannelInfo, error) `perm:"sign"` + PaychGetWaitReady func(ctx context.Context, sentinel cid.Cid) (address.Address, error) `perm:"sign"` + PaychList func(ctx context.Context) ([]address.Address, error) `perm:"read"` + PaychNewPayment func(ctx context.Context, from, to address.Address, vouchers []types.VoucherSpec) (*types.PaymentInfo, error) `perm:"sign"` + PaychSettle func(ctx context.Context, addr address.Address) (cid.Cid, error) `perm:"sign"` + PaychStatus func(ctx context.Context, pch address.Address) (*types.Status, error) `perm:"read"` + PaychVoucherAdd func(ctx context.Context, ch address.Address, sv *types.SignedVoucher, proof []byte, minDelta big.Int) (big.Int, error) `perm:"write"` + PaychVoucherCheckSpendable func(ctx context.Context, ch address.Address, sv *types.SignedVoucher, secret []byte, proof []byte) (bool, error) `perm:"read"` + PaychVoucherCheckValid func(ctx context.Context, ch address.Address, sv *types.SignedVoucher) error `perm:"read"` + PaychVoucherCreate func(ctx context.Context, pch address.Address, amt big.Int, lane uint64) (*types.VoucherCreateResult, error) `perm:"sign"` + PaychVoucherList func(ctx context.Context, pch address.Address) ([]*types.SignedVoucher, error) `perm:"write"` + PaychVoucherSubmit func(ctx context.Context, ch address.Address, sv *types.SignedVoucher, secret []byte, proof []byte) (cid.Cid, error) `perm:"sign"` } } func (s *IPaychanStruct) PaychAllocateLane(p0 context.Context, p1 address.Address) (uint64, error) { return s.Internal.PaychAllocateLane(p0, p1) } - func (s *IPaychanStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*types.ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFunds(p0, p1) } - -func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*types.ChannelAvailableFunds, error) { +func (s *IPaychanStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1, p2 address.Address) (*types.ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFundsByFromTo(p0, p1, p2) } - func (s *IPaychanStruct) PaychCollect(p0 context.Context, p1 address.Address) (cid.Cid, error) { return s.Internal.PaychCollect(p0, p1) } - -func (s *IPaychanStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) { +func (s *IPaychanStruct) PaychGet(p0 context.Context, p1, p2 address.Address, p3 big.Int) (*types.ChannelInfo, error) { return s.Internal.PaychGet(p0, p1, p2, p3) } - func (s *IPaychanStruct) PaychGetWaitReady(p0 context.Context, p1 cid.Cid) (address.Address, error) { return s.Internal.PaychGetWaitReady(p0, p1) } - func (s *IPaychanStruct) PaychList(p0 context.Context) ([]address.Address, error) { return s.Internal.PaychList(p0) } - -func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) { +func (s *IPaychanStruct) PaychNewPayment(p0 context.Context, p1, p2 address.Address, p3 []types.VoucherSpec) (*types.PaymentInfo, error) { return s.Internal.PaychNewPayment(p0, p1, p2, p3) } - func (s *IPaychanStruct) PaychSettle(p0 context.Context, p1 address.Address) (cid.Cid, error) { return s.Internal.PaychSettle(p0, p1) } - func (s *IPaychanStruct) PaychStatus(p0 context.Context, p1 address.Address) (*types.Status, error) { return s.Internal.PaychStatus(p0, p1) } - func (s *IPaychanStruct) PaychVoucherAdd(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 big.Int) (big.Int, error) { return s.Internal.PaychVoucherAdd(p0, p1, p2, p3, p4) } - func (s *IPaychanStruct) PaychVoucherCheckSpendable(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 []byte) (bool, error) { return s.Internal.PaychVoucherCheckSpendable(p0, p1, p2, p3, p4) } - func (s *IPaychanStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher) error { return s.Internal.PaychVoucherCheckValid(p0, p1, p2) } - func (s *IPaychanStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 big.Int, p3 uint64) (*types.VoucherCreateResult, error) { return s.Internal.PaychVoucherCreate(p0, p1, p2, p3) } - func (s *IPaychanStruct) PaychVoucherList(p0 context.Context, p1 address.Address) ([]*types.SignedVoucher, error) { return s.Internal.PaychVoucherList(p0, p1) } - func (s *IPaychanStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Address, p2 *types.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) { return s.Internal.PaychVoucherSubmit(p0, p1, p2, p3, p4) } type ISyncerStruct struct { Internal struct { - ChainSyncHandleNewTipSet func(p0 context.Context, p1 *types.ChainInfo) error `perm:"write"` - - ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (big.Int, error) `perm:"read"` - - Concurrent func(p0 context.Context) int64 `perm:"read"` - - SetConcurrent func(p0 context.Context, p1 int64) error `perm:"admin"` - - StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*types.InvocResult, error) `perm:"read"` - - SyncState func(p0 context.Context) (*types.SyncState, error) `perm:"read"` - - SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` - - SyncerTracker func(p0 context.Context) *types.TargetTracker `perm:"read"` + ChainSyncHandleNewTipSet func(ctx context.Context, ci *types.ChainInfo) error `perm:"write"` + ChainTipSetWeight func(ctx context.Context, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + Concurrent func(ctx context.Context) int64 `perm:"read"` + SetConcurrent func(ctx context.Context, concurrent int64) error `perm:"admin"` + StateCall func(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*types.InvocResult, error) `perm:"read"` + SyncState func(ctx context.Context) (*types.SyncState, error) `perm:"read"` + SyncSubmitBlock func(ctx context.Context, blk *types.BlockMsg) error `perm:"write"` + SyncerTracker func(ctx context.Context) *types.TargetTracker `perm:"read"` } } func (s *ISyncerStruct) ChainSyncHandleNewTipSet(p0 context.Context, p1 *types.ChainInfo) error { return s.Internal.ChainSyncHandleNewTipSet(p0, p1) } - func (s *ISyncerStruct) ChainTipSetWeight(p0 context.Context, p1 types.TipSetKey) (big.Int, error) { return s.Internal.ChainTipSetWeight(p0, p1) } - -func (s *ISyncerStruct) Concurrent(p0 context.Context) int64 { - return s.Internal.Concurrent(p0) -} - +func (s *ISyncerStruct) Concurrent(p0 context.Context) int64 { return s.Internal.Concurrent(p0) } func (s *ISyncerStruct) SetConcurrent(p0 context.Context, p1 int64) error { return s.Internal.SetConcurrent(p0, p1) } - func (s *ISyncerStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*types.InvocResult, error) { return s.Internal.StateCall(p0, p1, p2) } - func (s *ISyncerStruct) SyncState(p0 context.Context) (*types.SyncState, error) { return s.Internal.SyncState(p0) } - func (s *ISyncerStruct) SyncSubmitBlock(p0 context.Context, p1 *types.BlockMsg) error { return s.Internal.SyncSubmitBlock(p0, p1) } - func (s *ISyncerStruct) SyncerTracker(p0 context.Context) *types.TargetTracker { return s.Internal.SyncerTracker(p0) } type IWalletStruct struct { Internal struct { - HasPassword func(p0 context.Context) bool `perm:"admin"` - - LockWallet func(p0 context.Context) error `perm:"admin"` - - SetPassword func(p0 context.Context, p1 []byte) error `perm:"admin"` - - UnLockWallet func(p0 context.Context, p1 []byte) error `perm:"admin"` - - WalletAddresses func(p0 context.Context) []address.Address `perm:"admin"` - - WalletBalance func(p0 context.Context, p1 address.Address) (abi.TokenAmount, error) `perm:"read"` - - WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"` - - WalletExport func(p0 context.Context, p1 address.Address, p2 string) (*types.KeyInfo, error) `perm:"admin"` - - WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` - - WalletImport func(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) `perm:"admin"` - - WalletNewAddress func(p0 context.Context, p1 address.Protocol) (address.Address, error) `perm:"write"` - - WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` - - WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) `perm:"sign"` - - WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) `perm:"sign"` - - WalletState func(p0 context.Context) int `perm:"admin"` + HasPassword func(ctx context.Context) bool `perm:"admin"` + LockWallet func(ctx context.Context) error `perm:"admin"` + SetPassword func(ctx context.Context, password []byte) error `perm:"admin"` + UnLockWallet func(ctx context.Context, password []byte) error `perm:"admin"` + WalletAddresses func(ctx context.Context) []address.Address `perm:"admin"` + WalletBalance func(ctx context.Context, addr address.Address) (abi.TokenAmount, error) `perm:"read"` + WalletDefaultAddress func(ctx context.Context) (address.Address, error) `perm:"write"` + WalletExport func(ctx context.Context, addr address.Address, password string) (*types.KeyInfo, error) `perm:"admin"` + WalletHas func(ctx context.Context, addr address.Address) (bool, error) `perm:"write"` + WalletImport func(ctx context.Context, key *types.KeyInfo) (address.Address, error) `perm:"admin"` + WalletNewAddress func(ctx context.Context, protocol address.Protocol) (address.Address, error) `perm:"write"` + WalletSetDefault func(ctx context.Context, addr address.Address) error `perm:"write"` + WalletSign func(ctx context.Context, k address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) `perm:"sign"` + WalletSignMessage func(ctx context.Context, k address.Address, msg *types.Message) (*types.SignedMessage, error) `perm:"sign"` + WalletState func(ctx context.Context) int `perm:"admin"` } } -func (s *IWalletStruct) HasPassword(p0 context.Context) bool { - return s.Internal.HasPassword(p0) -} - -func (s *IWalletStruct) LockWallet(p0 context.Context) error { - return s.Internal.LockWallet(p0) -} - +func (s *IWalletStruct) HasPassword(p0 context.Context) bool { return s.Internal.HasPassword(p0) } +func (s *IWalletStruct) LockWallet(p0 context.Context) error { return s.Internal.LockWallet(p0) } func (s *IWalletStruct) SetPassword(p0 context.Context, p1 []byte) error { return s.Internal.SetPassword(p0, p1) } - func (s *IWalletStruct) UnLockWallet(p0 context.Context, p1 []byte) error { return s.Internal.UnLockWallet(p0, p1) } - func (s *IWalletStruct) WalletAddresses(p0 context.Context) []address.Address { return s.Internal.WalletAddresses(p0) } - func (s *IWalletStruct) WalletBalance(p0 context.Context, p1 address.Address) (abi.TokenAmount, error) { return s.Internal.WalletBalance(p0, p1) } - func (s *IWalletStruct) WalletDefaultAddress(p0 context.Context) (address.Address, error) { return s.Internal.WalletDefaultAddress(p0) } - func (s *IWalletStruct) WalletExport(p0 context.Context, p1 address.Address, p2 string) (*types.KeyInfo, error) { return s.Internal.WalletExport(p0, p1, p2) } - func (s *IWalletStruct) WalletHas(p0 context.Context, p1 address.Address) (bool, error) { return s.Internal.WalletHas(p0, p1) } - func (s *IWalletStruct) WalletImport(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) { return s.Internal.WalletImport(p0, p1) } - func (s *IWalletStruct) WalletNewAddress(p0 context.Context, p1 address.Protocol) (address.Address, error) { return s.Internal.WalletNewAddress(p0, p1) } - func (s *IWalletStruct) WalletSetDefault(p0 context.Context, p1 address.Address) error { return s.Internal.WalletSetDefault(p0, p1) } - func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) { return s.Internal.WalletSign(p0, p1, p2, p3) } - func (s *IWalletStruct) WalletSignMessage(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) { return s.Internal.WalletSignMessage(p0, p1, p2) } +func (s *IWalletStruct) WalletState(p0 context.Context) int { return s.Internal.WalletState(p0) } + +type IJwtAuthAPIStruct struct { + Internal struct { + AuthNew func(ctx context.Context, perms []auth.Permission) ([]byte, error) `perm:"admin"` + Verify func(ctx context.Context, host, token string) ([]auth.Permission, error) `perm:"read"` + } +} + +func (s *IJwtAuthAPIStruct) AuthNew(p0 context.Context, p1 []auth.Permission) ([]byte, error) { + return s.Internal.AuthNew(p0, p1) +} +func (s *IJwtAuthAPIStruct) Verify(p0 context.Context, p1, p2 string) ([]auth.Permission, error) { + return s.Internal.Verify(p0, p1, p2) +} -func (s *IWalletStruct) WalletState(p0 context.Context) int { - return s.Internal.WalletState(p0) +type FullNodeStruct struct { + IBlockStoreStruct + IChainStruct + IMarketStruct + IMiningStruct + IMessagePoolStruct + IMultiSigStruct + INetworkStruct + IPaychanStruct + ISyncerStruct + IWalletStruct + IJwtAuthAPIStruct } From 371fc68dd427c8f1ab6da16c379cd1a2d3f4a934 Mon Sep 17 00:00:00 2001 From: Caesar Wang Date: Mon, 24 Jan 2022 09:56:21 +0800 Subject: [PATCH 135/167] feat: venus-shared: pick types & api def from venus-messager (#4738) * feat: shared types from venus-messager * feat: add api defs for venus-messager * feat: generate proxy_gen.go for venus-messager --- venus-devtool/api-gen/proxy.go | 10 ++ venus-shared/api/messager/api.go | 63 +++++++ venus-shared/api/messager/proxy_gen.go | 191 ++++++++++++++++++++++ venus-shared/types/messager/address.go | 58 +++++++ venus-shared/types/messager/message.go | 153 +++++++++++++++++ venus-shared/types/messager/node.go | 22 +++ venus-shared/types/messager/quick_send.go | 28 ++++ venus-shared/types/messager/spec.go | 35 ++++ venus-shared/types/uuid.go | 79 +++++++++ venus-shared/types/uuid_test.go | 56 +++++++ 10 files changed, 695 insertions(+) create mode 100644 venus-shared/api/messager/api.go create mode 100644 venus-shared/api/messager/proxy_gen.go create mode 100644 venus-shared/types/messager/address.go create mode 100644 venus-shared/types/messager/message.go create mode 100644 venus-shared/types/messager/node.go create mode 100644 venus-shared/types/messager/quick_send.go create mode 100644 venus-shared/types/messager/spec.go create mode 100644 venus-shared/types/uuid.go create mode 100644 venus-shared/types/uuid_test.go diff --git a/venus-devtool/api-gen/proxy.go b/venus-devtool/api-gen/proxy.go index b1f92a7cbd..efd494a14e 100644 --- a/venus-devtool/api-gen/proxy.go +++ b/venus-devtool/api-gen/proxy.go @@ -10,17 +10,27 @@ import ( "io/ioutil" "log" "path/filepath" + "reflect" "strings" "github.com/urfave/cli/v2" "github.com/filecoin-project/venus/venus-devtool/util" + "github.com/filecoin-project/venus/venus-shared/api/messager" ) func init() { for _, capi := range util.ChainAPIPairs { proxyTargets = append(proxyTargets, capi.Venus) } + + proxyTargets = append(proxyTargets, util.APIMeta{ + Type: reflect.TypeOf((*messager.IMessager)(nil)).Elem(), + ParseOpt: util.InterfaceParseOption{ + ImportPath: "github.com/filecoin-project/venus/venus-shared/api/messager", + IncludeAll: true, + }, + }) } var proxyTargets []util.APIMeta diff --git a/venus-shared/api/messager/api.go b/venus-shared/api/messager/api.go new file mode 100644 index 0000000000..93588a3983 --- /dev/null +++ b/venus-shared/api/messager/api.go @@ -0,0 +1,63 @@ +package messager + +import ( + "context" + "time" + + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + + shared "github.com/filecoin-project/venus/venus-shared/types" + types "github.com/filecoin-project/venus/venus-shared/types/messager" +) + +type IMessager interface { + HasMessageByUid(ctx context.Context, id string) (bool, error) //perm:read + WaitMessage(ctx context.Context, id string, confidence uint64) (*types.Message, error) //perm:read + ForcePushMessage(ctx context.Context, account string, msg *shared.Message, meta *types.SendSpec) (string, error) //perm:admin + ForcePushMessageWithId(ctx context.Context, id string, account string, msg *shared.Message, meta *types.SendSpec) (string, error) //perm:write + PushMessage(ctx context.Context, msg *shared.Message, meta *types.SendSpec) (string, error) //perm:write + PushMessageWithId(ctx context.Context, id string, msg *shared.Message, meta *types.SendSpec) (string, error) //perm:write + GetMessageByUid(ctx context.Context, id string) (*types.Message, error) //perm:read + GetMessageBySignedCid(ctx context.Context, cid cid.Cid) (*types.Message, error) //perm:read + GetMessageByUnsignedCid(ctx context.Context, cid cid.Cid) (*types.Message, error) //perm:read + GetMessageByFromAndNonce(ctx context.Context, from address.Address, nonce uint64) (*types.Message, error) //perm:read + ListMessage(ctx context.Context) ([]*types.Message, error) //perm:admin + ListMessageByFromState(ctx context.Context, from address.Address, state types.MessageState, isAsc bool, pageIndex, pageSize int) ([]*types.Message, error) //perm:admin + ListMessageByAddress(ctx context.Context, addr address.Address) ([]*types.Message, error) //perm:admin + ListFailedMessage(ctx context.Context) ([]*types.Message, error) //perm:admin + ListBlockedMessage(ctx context.Context, addr address.Address, d time.Duration) ([]*types.Message, error) //perm:admin + UpdateMessageStateByID(ctx context.Context, id string, state types.MessageState) error //perm:admin + UpdateAllFilledMessage(ctx context.Context) (int, error) //perm:admin + UpdateFilledMessageByID(ctx context.Context, id string) (string, error) //perm:admin + ReplaceMessage(ctx context.Context, id string, auto bool, maxFee string, gasLimit int64, gasPremium string, gasFeecap string) (cid.Cid, error) //perm:admin + RepublishMessage(ctx context.Context, id string) error //perm:admin + MarkBadMessage(ctx context.Context, id string) error //perm:admin + RecoverFailedMsg(ctx context.Context, addr address.Address) ([]string, error) //perm:admin + + GetAddress(ctx context.Context, addr address.Address) (*types.Address, error) //perm:admin + HasAddress(ctx context.Context, addr address.Address) (bool, error) //perm:read + WalletHas(ctx context.Context, addr address.Address) (bool, error) //perm:read + ListAddress(ctx context.Context) ([]*types.Address, error) //perm:admin + UpdateNonce(ctx context.Context, addr address.Address, nonce uint64) error //perm:admin + DeleteAddress(ctx context.Context, addr address.Address) error //perm:admin + ForbiddenAddress(ctx context.Context, addr address.Address) error //perm:admin + ActiveAddress(ctx context.Context, addr address.Address) error //perm:admin + SetSelectMsgNum(ctx context.Context, addr address.Address, num uint64) error //perm:admin + SetFeeParams(ctx context.Context, addr address.Address, gasOverEstimation float64, maxFee, maxFeeCap string) error //perm:admin + ClearUnFillMessage(ctx context.Context, addr address.Address) (int, error) //perm:admin + + GetSharedParams(ctx context.Context) (*types.SharedSpec, error) //perm:admin + SetSharedParams(ctx context.Context, params *types.SharedSpec) error //perm:admin + RefreshSharedParams(ctx context.Context) error //perm:admin + + SaveNode(ctx context.Context, node *types.Node) error //perm:admin + GetNode(ctx context.Context, name string) (*types.Node, error) //perm:admin + HasNode(ctx context.Context, name string) (bool, error) //perm:admin + ListNode(ctx context.Context) ([]*types.Node, error) //perm:admin + DeleteNode(ctx context.Context, name string) error //perm:admin + + SetLogLevel(ctx context.Context, level string) error //perm:admin + + Send(ctx context.Context, params types.QuickSendParams) (string, error) //perm:admin +} diff --git a/venus-shared/api/messager/proxy_gen.go b/venus-shared/api/messager/proxy_gen.go new file mode 100644 index 0000000000..35519cacd1 --- /dev/null +++ b/venus-shared/api/messager/proxy_gen.go @@ -0,0 +1,191 @@ +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package messager + +import ( + "context" + "time" + + address "github.com/filecoin-project/go-address" + cid "github.com/ipfs/go-cid" + + shared "github.com/filecoin-project/venus/venus-shared/types" + types "github.com/filecoin-project/venus/venus-shared/types/messager" +) + +type IMessagerStruct struct { + Internal struct { + ActiveAddress func(ctx context.Context, addr address.Address) error `perm:"admin"` + ClearUnFillMessage func(ctx context.Context, addr address.Address) (int, error) `perm:"admin"` + DeleteAddress func(ctx context.Context, addr address.Address) error `perm:"admin"` + DeleteNode func(ctx context.Context, name string) error `perm:"admin"` + ForbiddenAddress func(ctx context.Context, addr address.Address) error `perm:"admin"` + ForcePushMessage func(ctx context.Context, account string, msg *shared.Message, meta *types.SendSpec) (string, error) `perm:"admin"` + ForcePushMessageWithId func(ctx context.Context, id string, account string, msg *shared.Message, meta *types.SendSpec) (string, error) `perm:"write"` + GetAddress func(ctx context.Context, addr address.Address) (*types.Address, error) `perm:"admin"` + GetMessageByFromAndNonce func(ctx context.Context, from address.Address, nonce uint64) (*types.Message, error) `perm:"read"` + GetMessageBySignedCid func(ctx context.Context, cid cid.Cid) (*types.Message, error) `perm:"read"` + GetMessageByUid func(ctx context.Context, id string) (*types.Message, error) `perm:"read"` + GetMessageByUnsignedCid func(ctx context.Context, cid cid.Cid) (*types.Message, error) `perm:"read"` + GetNode func(ctx context.Context, name string) (*types.Node, error) `perm:"admin"` + GetSharedParams func(ctx context.Context) (*types.SharedSpec, error) `perm:"admin"` + HasAddress func(ctx context.Context, addr address.Address) (bool, error) `perm:"read"` + HasMessageByUid func(ctx context.Context, id string) (bool, error) `perm:"read"` + HasNode func(ctx context.Context, name string) (bool, error) `perm:"admin"` + ListAddress func(ctx context.Context) ([]*types.Address, error) `perm:"admin"` + ListBlockedMessage func(ctx context.Context, addr address.Address, d time.Duration) ([]*types.Message, error) `perm:"admin"` + ListFailedMessage func(ctx context.Context) ([]*types.Message, error) `perm:"admin"` + ListMessage func(ctx context.Context) ([]*types.Message, error) `perm:"admin"` + ListMessageByAddress func(ctx context.Context, addr address.Address) ([]*types.Message, error) `perm:"admin"` + ListMessageByFromState func(ctx context.Context, from address.Address, state types.MessageState, isAsc bool, pageIndex, pageSize int) ([]*types.Message, error) `perm:"admin"` + ListNode func(ctx context.Context) ([]*types.Node, error) `perm:"admin"` + MarkBadMessage func(ctx context.Context, id string) error `perm:"admin"` + PushMessage func(ctx context.Context, msg *shared.Message, meta *types.SendSpec) (string, error) `perm:"write"` + PushMessageWithId func(ctx context.Context, id string, msg *shared.Message, meta *types.SendSpec) (string, error) `perm:"write"` + RecoverFailedMsg func(ctx context.Context, addr address.Address) ([]string, error) `perm:"admin"` + RefreshSharedParams func(ctx context.Context) error `perm:"admin"` + ReplaceMessage func(ctx context.Context, id string, auto bool, maxFee string, gasLimit int64, gasPremium string, gasFeecap string) (cid.Cid, error) `perm:"admin"` + RepublishMessage func(ctx context.Context, id string) error `perm:"admin"` + SaveNode func(ctx context.Context, node *types.Node) error `perm:"admin"` + Send func(ctx context.Context, params types.QuickSendParams) (string, error) `perm:"admin"` + SetFeeParams func(ctx context.Context, addr address.Address, gasOverEstimation float64, maxFee, maxFeeCap string) error `perm:"admin"` + SetLogLevel func(ctx context.Context, level string) error `perm:"admin"` + SetSelectMsgNum func(ctx context.Context, addr address.Address, num uint64) error `perm:"admin"` + SetSharedParams func(ctx context.Context, params *types.SharedSpec) error `perm:"admin"` + UpdateAllFilledMessage func(ctx context.Context) (int, error) `perm:"admin"` + UpdateFilledMessageByID func(ctx context.Context, id string) (string, error) `perm:"admin"` + UpdateMessageStateByID func(ctx context.Context, id string, state types.MessageState) error `perm:"admin"` + UpdateNonce func(ctx context.Context, addr address.Address, nonce uint64) error `perm:"admin"` + WaitMessage func(ctx context.Context, id string, confidence uint64) (*types.Message, error) `perm:"read"` + WalletHas func(ctx context.Context, addr address.Address) (bool, error) `perm:"read"` + } +} + +func (s *IMessagerStruct) ActiveAddress(p0 context.Context, p1 address.Address) error { + return s.Internal.ActiveAddress(p0, p1) +} +func (s *IMessagerStruct) ClearUnFillMessage(p0 context.Context, p1 address.Address) (int, error) { + return s.Internal.ClearUnFillMessage(p0, p1) +} +func (s *IMessagerStruct) DeleteAddress(p0 context.Context, p1 address.Address) error { + return s.Internal.DeleteAddress(p0, p1) +} +func (s *IMessagerStruct) DeleteNode(p0 context.Context, p1 string) error { + return s.Internal.DeleteNode(p0, p1) +} +func (s *IMessagerStruct) ForbiddenAddress(p0 context.Context, p1 address.Address) error { + return s.Internal.ForbiddenAddress(p0, p1) +} +func (s *IMessagerStruct) ForcePushMessage(p0 context.Context, p1 string, p2 *shared.Message, p3 *types.SendSpec) (string, error) { + return s.Internal.ForcePushMessage(p0, p1, p2, p3) +} +func (s *IMessagerStruct) ForcePushMessageWithId(p0 context.Context, p1 string, p2 string, p3 *shared.Message, p4 *types.SendSpec) (string, error) { + return s.Internal.ForcePushMessageWithId(p0, p1, p2, p3, p4) +} +func (s *IMessagerStruct) GetAddress(p0 context.Context, p1 address.Address) (*types.Address, error) { + return s.Internal.GetAddress(p0, p1) +} +func (s *IMessagerStruct) GetMessageByFromAndNonce(p0 context.Context, p1 address.Address, p2 uint64) (*types.Message, error) { + return s.Internal.GetMessageByFromAndNonce(p0, p1, p2) +} +func (s *IMessagerStruct) GetMessageBySignedCid(p0 context.Context, p1 cid.Cid) (*types.Message, error) { + return s.Internal.GetMessageBySignedCid(p0, p1) +} +func (s *IMessagerStruct) GetMessageByUid(p0 context.Context, p1 string) (*types.Message, error) { + return s.Internal.GetMessageByUid(p0, p1) +} +func (s *IMessagerStruct) GetMessageByUnsignedCid(p0 context.Context, p1 cid.Cid) (*types.Message, error) { + return s.Internal.GetMessageByUnsignedCid(p0, p1) +} +func (s *IMessagerStruct) GetNode(p0 context.Context, p1 string) (*types.Node, error) { + return s.Internal.GetNode(p0, p1) +} +func (s *IMessagerStruct) GetSharedParams(p0 context.Context) (*types.SharedSpec, error) { + return s.Internal.GetSharedParams(p0) +} +func (s *IMessagerStruct) HasAddress(p0 context.Context, p1 address.Address) (bool, error) { + return s.Internal.HasAddress(p0, p1) +} +func (s *IMessagerStruct) HasMessageByUid(p0 context.Context, p1 string) (bool, error) { + return s.Internal.HasMessageByUid(p0, p1) +} +func (s *IMessagerStruct) HasNode(p0 context.Context, p1 string) (bool, error) { + return s.Internal.HasNode(p0, p1) +} +func (s *IMessagerStruct) ListAddress(p0 context.Context) ([]*types.Address, error) { + return s.Internal.ListAddress(p0) +} +func (s *IMessagerStruct) ListBlockedMessage(p0 context.Context, p1 address.Address, p2 time.Duration) ([]*types.Message, error) { + return s.Internal.ListBlockedMessage(p0, p1, p2) +} +func (s *IMessagerStruct) ListFailedMessage(p0 context.Context) ([]*types.Message, error) { + return s.Internal.ListFailedMessage(p0) +} +func (s *IMessagerStruct) ListMessage(p0 context.Context) ([]*types.Message, error) { + return s.Internal.ListMessage(p0) +} +func (s *IMessagerStruct) ListMessageByAddress(p0 context.Context, p1 address.Address) ([]*types.Message, error) { + return s.Internal.ListMessageByAddress(p0, p1) +} +func (s *IMessagerStruct) ListMessageByFromState(p0 context.Context, p1 address.Address, p2 types.MessageState, p3 bool, p4, p5 int) ([]*types.Message, error) { + return s.Internal.ListMessageByFromState(p0, p1, p2, p3, p4, p5) +} +func (s *IMessagerStruct) ListNode(p0 context.Context) ([]*types.Node, error) { + return s.Internal.ListNode(p0) +} +func (s *IMessagerStruct) MarkBadMessage(p0 context.Context, p1 string) error { + return s.Internal.MarkBadMessage(p0, p1) +} +func (s *IMessagerStruct) PushMessage(p0 context.Context, p1 *shared.Message, p2 *types.SendSpec) (string, error) { + return s.Internal.PushMessage(p0, p1, p2) +} +func (s *IMessagerStruct) PushMessageWithId(p0 context.Context, p1 string, p2 *shared.Message, p3 *types.SendSpec) (string, error) { + return s.Internal.PushMessageWithId(p0, p1, p2, p3) +} +func (s *IMessagerStruct) RecoverFailedMsg(p0 context.Context, p1 address.Address) ([]string, error) { + return s.Internal.RecoverFailedMsg(p0, p1) +} +func (s *IMessagerStruct) RefreshSharedParams(p0 context.Context) error { + return s.Internal.RefreshSharedParams(p0) +} +func (s *IMessagerStruct) ReplaceMessage(p0 context.Context, p1 string, p2 bool, p3 string, p4 int64, p5 string, p6 string) (cid.Cid, error) { + return s.Internal.ReplaceMessage(p0, p1, p2, p3, p4, p5, p6) +} +func (s *IMessagerStruct) RepublishMessage(p0 context.Context, p1 string) error { + return s.Internal.RepublishMessage(p0, p1) +} +func (s *IMessagerStruct) SaveNode(p0 context.Context, p1 *types.Node) error { + return s.Internal.SaveNode(p0, p1) +} +func (s *IMessagerStruct) Send(p0 context.Context, p1 types.QuickSendParams) (string, error) { + return s.Internal.Send(p0, p1) +} +func (s *IMessagerStruct) SetFeeParams(p0 context.Context, p1 address.Address, p2 float64, p3, p4 string) error { + return s.Internal.SetFeeParams(p0, p1, p2, p3, p4) +} +func (s *IMessagerStruct) SetLogLevel(p0 context.Context, p1 string) error { + return s.Internal.SetLogLevel(p0, p1) +} +func (s *IMessagerStruct) SetSelectMsgNum(p0 context.Context, p1 address.Address, p2 uint64) error { + return s.Internal.SetSelectMsgNum(p0, p1, p2) +} +func (s *IMessagerStruct) SetSharedParams(p0 context.Context, p1 *types.SharedSpec) error { + return s.Internal.SetSharedParams(p0, p1) +} +func (s *IMessagerStruct) UpdateAllFilledMessage(p0 context.Context) (int, error) { + return s.Internal.UpdateAllFilledMessage(p0) +} +func (s *IMessagerStruct) UpdateFilledMessageByID(p0 context.Context, p1 string) (string, error) { + return s.Internal.UpdateFilledMessageByID(p0, p1) +} +func (s *IMessagerStruct) UpdateMessageStateByID(p0 context.Context, p1 string, p2 types.MessageState) error { + return s.Internal.UpdateMessageStateByID(p0, p1, p2) +} +func (s *IMessagerStruct) UpdateNonce(p0 context.Context, p1 address.Address, p2 uint64) error { + return s.Internal.UpdateNonce(p0, p1, p2) +} +func (s *IMessagerStruct) WaitMessage(p0 context.Context, p1 string, p2 uint64) (*types.Message, error) { + return s.Internal.WaitMessage(p0, p1, p2) +} +func (s *IMessagerStruct) WalletHas(p0 context.Context, p1 address.Address) (bool, error) { + return s.Internal.WalletHas(p0, p1) +} diff --git a/venus-shared/types/messager/address.go b/venus-shared/types/messager/address.go new file mode 100644 index 0000000000..44bf3d2a19 --- /dev/null +++ b/venus-shared/types/messager/address.go @@ -0,0 +1,58 @@ +package messager + +import ( + "fmt" + "time" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/venus/venus-shared/types" +) + +type AddressState int + +const ( + _ AddressState = iota + AddressStateAlive + AddressStateRemoving + AddressStateRemoved + AddressStateForbbiden // forbbiden received message +) + +func (as AddressState) String() string { + switch as { + case AddressStateAlive: + return "Alive" + case AddressStateRemoving: + return "Removing" + case AddressStateRemoved: + return "Removed" + case AddressStateForbbiden: + return "Forbbiden" + default: + return fmt.Sprintf("unknow state %d", as) + } +} + +func AddressStateToString(state AddressState) string { + return state.String() +} + +type Address struct { + ID types.UUID `json:"id"` + Addr address.Address `json:"addr"` + //max for current, use nonce and +1 + Nonce uint64 `json:"nonce"` + Weight int64 `json:"weight"` + // number of address selection messages + SelMsgNum uint64 `json:"selMsgNum"` + State AddressState `json:"state"` + GasOverEstimation float64 `json:"gasOverEstimation"` + MaxFee big.Int `json:"maxFee,omitempty"` + MaxFeeCap big.Int `json:"maxFeeCap"` + + IsDeleted int `json:"isDeleted"` // 是否删除 1:是 -1:否 + CreatedAt time.Time `json:"createAt"` // 创建时间 + UpdatedAt time.Time `json:"updateAt"` // 更新时间 +} diff --git a/venus-shared/types/messager/message.go b/venus-shared/types/messager/message.go new file mode 100644 index 0000000000..92e2552ef5 --- /dev/null +++ b/venus-shared/types/messager/message.go @@ -0,0 +1,153 @@ +package messager + +import ( + "encoding/json" + "time" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/crypto" + "github.com/ipfs/go-cid" + + shared "github.com/filecoin-project/venus/venus-shared/types" +) + +// ---> FailedMsg <------ +// | | +// UnFillMsg ---------------> FillMsg --------> OnChainMsg +// | | +// NoWalletMsg <--- ---->ReplacedMsg +// + +type MessageState int + +const ( + UnKnown MessageState = iota + UnFillMsg + FillMsg + OnChainMsg + FailedMsg + ReplacedMsg + NoWalletMsg +) + +func (mst MessageState) String() string { + switch mst { + case UnFillMsg: + return "UnFillMsg" + case FillMsg: + return "FillMsg" + case OnChainMsg: + return "OnChainMsg" + case FailedMsg: + return "Failed" + case ReplacedMsg: + return "ReplacedMsg" + case NoWalletMsg: + return "NoWalletMsg" + default: + return "UnKnown" + } +} + +func MessageStateToString(state MessageState) string { + return state.String() +} + +type MessageWithUID struct { + UnsignedMessage shared.Message + ID string +} + +func FromUnsignedMessage(unsignedMsg shared.Message) *Message { + return &Message{ + Message: unsignedMsg, + } +} + +type Message struct { + ID string + + UnsignedCid *cid.Cid + SignedCid *cid.Cid + shared.Message + Signature *crypto.Signature + + Height int64 + Confidence int64 + Receipt *shared.MessageReceipt + TipSetKey shared.TipSetKey + Meta *SendSpec + WalletName string + FromUser string + + State MessageState + + CreatedAt time.Time + UpdatedAt time.Time +} + +//todo ignore use message MarshalJSON method +func (m *Message) MarshalJSON() ([]byte, error) { + type msg struct { + Version uint64 + To address.Address + From address.Address + Nonce uint64 + Value abi.TokenAmount + GasLimit int64 + GasFeeCap abi.TokenAmount + GasPremium abi.TokenAmount + Method abi.MethodNum + Params []byte + } + type fMsg struct { + ID string + + UnsignedCid *cid.Cid + SignedCid *cid.Cid + msg + Signature *crypto.Signature + + Height int64 + Confidence int64 + Receipt *shared.MessageReceipt + TipSetKey shared.TipSetKey + Meta *SendSpec + WalletName string + FromUser string + + State MessageState + + CreatedAt time.Time + UpdatedAt time.Time + } + return json.Marshal(fMsg{ + ID: m.ID, + UnsignedCid: m.UnsignedCid, + SignedCid: m.SignedCid, + msg: msg{ + Version: m.Message.Version, + To: m.Message.To, + From: m.Message.From, + Nonce: m.Message.Nonce, + Value: m.Message.Value, + GasLimit: m.Message.GasLimit, + GasFeeCap: m.Message.GasFeeCap, + GasPremium: m.Message.GasPremium, + Method: m.Message.Method, + Params: m.Message.Params, + }, + Signature: m.Signature, + Height: m.Height, + Confidence: m.Confidence, + Receipt: m.Receipt, + TipSetKey: m.TipSetKey, + Meta: m.Meta, + WalletName: m.WalletName, + FromUser: m.FromUser, + State: m.State, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + }) +} diff --git a/venus-shared/types/messager/node.go b/venus-shared/types/messager/node.go new file mode 100644 index 0000000000..9ad468a386 --- /dev/null +++ b/venus-shared/types/messager/node.go @@ -0,0 +1,22 @@ +package messager + +import ( + "github.com/filecoin-project/venus/venus-shared/types" +) + +type NodeType int + +const ( + _ NodeType = iota + FullNode + LightNode +) + +type Node struct { + ID types.UUID + + Name string + URL string + Token string + Type NodeType +} diff --git a/venus-shared/types/messager/quick_send.go b/venus-shared/types/messager/quick_send.go new file mode 100644 index 0000000000..9d3d7b3a49 --- /dev/null +++ b/venus-shared/types/messager/quick_send.go @@ -0,0 +1,28 @@ +package messager + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" +) + +type QuickSendParamsCodec string + +const ( + QuickSendParamsCodecJSON QuickSendParamsCodec = "json" + QuickSendParamsCodecHex QuickSendParamsCodec = "hex" +) + +type QuickSendParams struct { + To address.Address + From address.Address + Val abi.TokenAmount + Account string + + GasPremium *abi.TokenAmount + GasFeeCap *abi.TokenAmount + GasLimit *int64 + + Method abi.MethodNum + Params string + ParamsType QuickSendParamsCodec // json or hex +} diff --git a/venus-shared/types/messager/spec.go b/venus-shared/types/messager/spec.go new file mode 100644 index 0000000000..63e7e55992 --- /dev/null +++ b/venus-shared/types/messager/spec.go @@ -0,0 +1,35 @@ +package messager + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" +) + +type SendSpec struct { + ExpireEpoch abi.ChainEpoch `json:"expireEpoch"` + GasOverEstimation float64 `json:"gasOverEstimation"` + MaxFee big.Int `json:"maxFee,omitempty"` + MaxFeeCap big.Int `json:"maxFeeCap"` +} + +type SharedSpec struct { + ID uint `json:"id"` + + GasOverEstimation float64 `json:"gasOverEstimation"` + MaxFee big.Int `json:"maxFee,omitempty"` + MaxFeeCap big.Int `json:"maxFeeCap"` + + SelMsgNum uint64 `json:"selMsgNum"` +} + +func (ss *SharedSpec) GetSendSpec() *SendSpec { + if ss == nil { + return nil + } + + return &SendSpec{ + GasOverEstimation: ss.GasOverEstimation, + MaxFee: ss.MaxFee, + MaxFeeCap: ss.MaxFeeCap, + } +} diff --git a/venus-shared/types/uuid.go b/venus-shared/types/uuid.go new file mode 100644 index 0000000000..6a9972b963 --- /dev/null +++ b/venus-shared/types/uuid.go @@ -0,0 +1,79 @@ +package types + +import ( + "bytes" + "database/sql/driver" + + "golang.org/x/xerrors" + + "github.com/google/uuid" +) + +type UUID uuid.UUID + +func NewUUID() UUID { + return UUID(uuid.New()) +} + +func ParseUUID(uid string) (UUID, error) { + id, err := uuid.Parse(uid) + if err != nil { + return UUID{}, nil + } + + return UUID(id), nil +} + +// Value implement sql.Scanner +func (uid UUID) IsEmpty() bool { + return uid == UUID{} +} + +// Value implement sql.Scanner +func (uid UUID) String() string { + return uuid.UUID(uid).String() +} + +// Value implement sql.Scanner +func (uid UUID) Value() (driver.Value, error) { + return uuid.UUID(uid).String(), nil +} + +// Scan assigns a value from a database driver. +// An error should be returned if the value cannot be stored +// without loss of information. +// +// Reference types such as []byte are only valid until the next call to Scan +// and should not be retained. Their underlying memory is owned by the driver. +// If retention is necessary, copy their values before the next call to Scan. +func (uid *UUID) Scan(value interface{}) error { + var id uuid.UUID + var err error + switch value := value.(type) { + case string: + id, err = uuid.Parse(value) + case []byte: + id, err = uuid.ParseBytes(value) + default: + return xerrors.Errorf("unsupport %t type for uuid", value) + } + if err != nil { + return err + } + *uid = (UUID)(id) + return nil +} + +func (uid UUID) MarshalJSON() ([]byte, error) { + return []byte("\"" + uid.String() + "\""), nil +} + +func (uid *UUID) UnmarshalJSON(b []byte) error { + b = bytes.Trim(b, "\"") + id, err := uuid.ParseBytes(b) + if err != nil { + return err + } + *uid = (UUID)(id) + return nil +} diff --git a/venus-shared/types/uuid_test.go b/venus-shared/types/uuid_test.go new file mode 100644 index 0000000000..94f755a2e9 --- /dev/null +++ b/venus-shared/types/uuid_test.go @@ -0,0 +1,56 @@ +package types + +import ( + "encoding/json" + "github.com/google/uuid" + "testing" +) + +func TestUUID_Scan(t *testing.T) { + uid := uuid.New() + newID := UUID{} + err := newID.Scan(uid.String()) + if err != nil { + t.Error(err) + } + + if newID.String() != uid.String() { + t.Errorf("convert value failed") + } +} + +func TestUUID_Value(t *testing.T) { + uid := uuid.New() + newID := UUID(uid) + + val, err := newID.Value() + if err != nil { + t.Error(err) + } + if val.(string) != uid.String() { + t.Errorf("convert value failed") + } +} + +func TestUUID_JsonMarshal(t *testing.T) { + type T struct { + ID UUID + } + + val := T{ID: NewUUID()} + + marsahlBytes, err := json.Marshal(&val) + if err != nil { + t.Error(err) + } + + var val2 T + err = json.Unmarshal(marsahlBytes, &val2) + if err != nil { + t.Error(err) + } + + if val2.ID != val.ID { + t.Errorf("UUID json marshal fail") + } +} From 3914774e311e848d3c2121cdbfae548d6553ec02 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Tue, 25 Jan 2022 14:09:51 +0800 Subject: [PATCH 136/167] feat: venus-shared: pick types & api def from venus-wallet (#4746) * feat: venus-shared: pick types & api def from venus-wallet * rename GroupId|BindId to GroupID|BindID * remove blank line * move DrawRandomParams to a separate file --- go.mod | 3 +- go.sum | 6 + venus-devtool/api-gen/proxy.go | 7 + venus-devtool/go.mod | 1 - venus-devtool/go.sum | 36 +-- venus-shared/api/client/client.go | 3 +- venus-shared/api/permission/permission.go | 82 ++++++ venus-shared/api/wallet/common.go | 20 ++ venus-shared/api/wallet/full.go | 8 + venus-shared/api/wallet/proxy_gen.go | 256 ++++++++++++++++++ venus-shared/api/wallet/strategy.go | 82 ++++++ venus-shared/api/wallet/wallet.go | 42 +++ .../types/wallet/draw_random_params.go | 63 +++++ venus-shared/types/wallet/msg_enum.go | 132 +++++++++ venus-shared/types/wallet/msg_enum_test.go | 44 +++ venus-shared/types/wallet/wallet.go | 74 +++++ 16 files changed, 826 insertions(+), 33 deletions(-) create mode 100644 venus-shared/api/permission/permission.go create mode 100644 venus-shared/api/wallet/common.go create mode 100644 venus-shared/api/wallet/full.go create mode 100644 venus-shared/api/wallet/proxy_gen.go create mode 100644 venus-shared/api/wallet/strategy.go create mode 100644 venus-shared/api/wallet/wallet.go create mode 100644 venus-shared/types/wallet/draw_random_params.go create mode 100644 venus-shared/types/wallet/msg_enum.go create mode 100644 venus-shared/types/wallet/msg_enum_test.go create mode 100644 venus-shared/types/wallet/wallet.go diff --git a/go.mod b/go.mod index f2d5c70165..d836ff58d6 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee github.com/Microsoft/go-winio v0.4.14 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d + github.com/ahmetb/go-linq/v3 v3.2.0 github.com/awnumar/memguard v0.22.2 github.com/bluele/gcache v0.0.0-20190518031135-bc40bd653833 github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e @@ -43,12 +44,12 @@ require ( github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578 + github.com/fxamacker/cbor/v2 v2.4.0 github.com/gbrlsnchs/jwt/v3 v3.0.0 github.com/go-errors/errors v1.0.1 github.com/go-kit/kit v0.10.0 github.com/golang/mock v1.6.0 github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf // indirect - github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a github.com/golangci/golangci-lint v1.39.0 github.com/google/flatbuffers v2.0.0+incompatible // indirect github.com/google/go-github v17.0.0+incompatible diff --git a/go.sum b/go.sum index aa4ff1855f..57d560e646 100644 --- a/go.sum +++ b/go.sum @@ -90,6 +90,8 @@ github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpH github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ahmetb/go-linq/v3 v3.2.0 h1:BEuMfp+b59io8g5wYzNoFe9pWPalRklhlhbiU3hYZDE= +github.com/ahmetb/go-linq/v3 v3.2.0/go.mod h1:haQ3JfOeWK8HpVxMtHHEMPVgBKiYyQ+f1/kLZh/cj9U= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -399,6 +401,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= +github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= +github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/fzipp/gocyclo v0.3.1 h1:A9UeX3HJSXTBzvHzhqoYVuE0eAhe+aM8XBCCwsPMZOc= github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= github.com/gbrlsnchs/jwt/v3 v3.0.0 h1:gtPjdT3gAbBLjVckJsgNf+a46sqrCBfRebg2r/NysIo= @@ -1977,6 +1981,8 @@ github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325/go.mod h1:g7c github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb h1:/7/dQyiKnxAOj9L69FhST7uMe17U015XPzX7cy+5ykM= github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb/go.mod h1:pbNsDSxn1ICiNn9Ct4ZGNrwzfkkwYbx/lw8VuyutFIg= diff --git a/venus-devtool/api-gen/proxy.go b/venus-devtool/api-gen/proxy.go index efd494a14e..4e5e75ed6c 100644 --- a/venus-devtool/api-gen/proxy.go +++ b/venus-devtool/api-gen/proxy.go @@ -17,6 +17,7 @@ import ( "github.com/filecoin-project/venus/venus-devtool/util" "github.com/filecoin-project/venus/venus-shared/api/messager" + "github.com/filecoin-project/venus/venus-shared/api/wallet" ) func init() { @@ -30,6 +31,12 @@ func init() { ImportPath: "github.com/filecoin-project/venus/venus-shared/api/messager", IncludeAll: true, }, + }, util.APIMeta{ + Type: reflect.TypeOf((*wallet.IFullAPI)(nil)).Elem(), + ParseOpt: util.InterfaceParseOption{ + ImportPath: "github.com/filecoin-project/venus/venus-shared/api/wallet", + IncludeAll: true, + }, }) } diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index 91bbb9c4b7..5dc015c249 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -21,7 +21,6 @@ require ( github.com/multiformats/go-multiaddr v0.4.1 github.com/urfave/cli/v2 v2.3.0 github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 ) replace ( diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index dd9a752d4c..82520d3aa7 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -95,6 +95,8 @@ github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/ github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ahmetb/go-linq/v3 v3.2.0 h1:BEuMfp+b59io8g5wYzNoFe9pWPalRklhlhbiU3hYZDE= +github.com/ahmetb/go-linq/v3 v3.2.0/go.mod h1:haQ3JfOeWK8HpVxMtHHEMPVgBKiYyQ+f1/kLZh/cj9U= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= @@ -136,7 +138,6 @@ github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVj github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= -github.com/benbjohnson/clock v1.0.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -249,7 +250,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= -github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= @@ -263,11 +263,9 @@ github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6ps github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= -github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/badger/v3 v3.2011.1/go.mod h1:0rLLrQpKVQAL0or/lBLMQznhr6dWWX7h5AKnmnqx268= -github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.4-0.20210122082011-bb5d392ed82d/go.mod h1:tv2ec8nA7vRpSYX7/MbP52ihrUMXIHit54CQMq8npXQ= @@ -284,7 +282,6 @@ github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5Xh github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= -github.com/drand/drand v1.2.1/go.mod h1:j0P7RGmVaY7E/OuO2yQOcQj7OgeZCuhgu2gdv0JAm+g= github.com/drand/drand v1.3.0/go.mod h1:D6kAVlxufq1gi71YCGfzN455JrXF4Q272ZJEG975fzo= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw= @@ -420,7 +417,6 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3 github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsGGCE+NumpF6aiBoU/2X5W4= github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= @@ -428,7 +424,6 @@ github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/g github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578/go.mod h1:/cbLZYvQhinVFUG4TP2Uy1o7LtF+guT21qZIMTmKk0g= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= @@ -443,6 +438,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= +github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= +github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= github.com/gbrlsnchs/jwt/v3 v3.0.0/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= @@ -688,7 +685,6 @@ github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpg github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/gxed/go-shellwords v1.0.3/go.mod h1:N7paucT91ByIjmVJHhvoarjoQnmsi3Jd3vH7VqgtMxQ= @@ -825,7 +821,6 @@ github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9Dr github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= -github.com/ipfs/go-ds-badger2 v0.1.0/go.mod h1:pbR1p817OZbdId9EvLOhKBgUVTM3BMCSTan78lDDVaw= github.com/ipfs/go-ds-badger2 v0.1.2 h1:sQc2q1gaXrv8YFNeUtxil0neuyDf9hnVHfLsi7lpXfE= github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= @@ -1130,8 +1125,6 @@ github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZk github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= -github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= -github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= @@ -1146,7 +1139,6 @@ github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= -github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= github.com/libp2p/go-libp2p-autonat v0.7.0 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= @@ -1156,7 +1148,6 @@ github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uLv+tlkGTAr3jC0S5cLg= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= -github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= github.com/libp2p/go-libp2p-blankhost v0.3.0 h1:kTnLArltMabZlzY63pgGDA4kkUcLkBFSM98zBssn/IY= github.com/libp2p/go-libp2p-blankhost v0.3.0/go.mod h1:urPC+7U01nCGgJ3ZsV8jdwTp6Ji9ID0dMTvq+aJ+nZU= @@ -1166,10 +1157,8 @@ github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFk github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8OTBGoV1AWbWor3qM= github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= -github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= -github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= github.com/libp2p/go-libp2p-connmgr v0.3.0 h1:yerFXrYa0oxpuVsLlndwm/bLulouHYDcvFrY/4H4fx8= github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= @@ -1216,7 +1205,6 @@ github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2T github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= -github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= @@ -1252,7 +1240,6 @@ github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8 github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= @@ -1266,8 +1253,6 @@ github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVd github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.3/go.mod h1:K8ljLdFn590GMttg/luh4caB/3g0vKuY01psze0upRw= -github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= @@ -1279,7 +1264,6 @@ github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYc github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= -github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= @@ -1308,7 +1292,6 @@ github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evl github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU= github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= -github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= @@ -1430,7 +1413,6 @@ github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw github.com/libp2p/go-ws-transport v0.1.2/go.mod h1:dsh2Ld8F+XNmzpkaAijmg5Is+e9l6/1tK/6VFOdN69Y= github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= -github.com/libp2p/go-ws-transport v0.3.1/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= @@ -1439,7 +1421,6 @@ github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.6/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= @@ -1615,7 +1596,6 @@ github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysj github.com/multiformats/go-multiaddr-net v0.2.0 h1:MSXRGN0mFymt6B1yo/6BPnIRpLPEnKgQNvVfCX5VDJk= github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= @@ -1805,7 +1785,6 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.1.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= @@ -2061,6 +2040,8 @@ github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325/go.mod h1:g7c github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb h1:/7/dQyiKnxAOj9L69FhST7uMe17U015XPzX7cy+5ykM= github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb/go.mod h1:pbNsDSxn1ICiNn9Ct4ZGNrwzfkkwYbx/lw8VuyutFIg= @@ -2199,7 +2180,6 @@ golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2312,7 +2292,6 @@ golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200519113804-d87ec0cfa476/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -2429,7 +2408,6 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2668,7 +2646,6 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -2759,6 +2736,7 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gorm.io/driver/mysql v1.1.1/go.mod h1:KdrTanmfLPPyAOeYGyG+UpDys7/7eeWT1zCq+oekYnU= gorm.io/gorm v1.21.9/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= gorm.io/gorm v1.21.12/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/venus-shared/api/client/client.go b/venus-shared/api/client/client.go index 9d6817db26..93328500fd 100644 --- a/venus-shared/api/client/client.go +++ b/venus-shared/api/client/client.go @@ -2,13 +2,12 @@ package client import ( "context" + "net/http" "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/venus/venus-shared/api" v0 "github.com/filecoin-project/venus/venus-shared/api/chain/v0" v1 "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - - "net/http" ) func NewFullRPCV0(ctx context.Context, addr string, header http.Header) (v0.FullNode, jsonrpc.ClientCloser, error) { diff --git a/venus-shared/api/permission/permission.go b/venus-shared/api/permission/permission.go new file mode 100644 index 0000000000..5fdd08db36 --- /dev/null +++ b/venus-shared/api/permission/permission.go @@ -0,0 +1,82 @@ +package permission + +import ( + "context" + "reflect" + + "github.com/filecoin-project/venus/venus-shared/api" + + "github.com/filecoin-project/go-jsonrpc/auth" + "golang.org/x/xerrors" +) + +type permission = auth.Permission + +const ( + // When changing these, update docs/API.md too + + PermRead permission = "read" // default + PermWrite permission = "write" + PermSign permission = "sign" // Use wallet keys for signing + PermAdmin permission = "admin" // Manage permissions + +) + +var AllPermissions = []auth.Permission{PermRead, PermWrite, PermSign, PermAdmin} +var DefaultPerms = []auth.Permission{PermRead} + +// permissionVerify the scheduler between API and internal business +func PermissionProxy(in interface{}, out interface{}) { + ra := reflect.ValueOf(in) + outs := api.GetInternalStructs(out) + for _, out := range outs { + rint := reflect.ValueOf(out).Elem() + for i := 0; i < ra.NumMethod(); i++ { + methodName := ra.Type().Method(i).Name + field, exists := rint.Type().FieldByName(methodName) + if !exists { + continue + } + + requiredPerm := field.Tag.Get("perm") + if requiredPerm == "" { + panic("missing 'perm' tag on " + field.Name) // ok + } + + var found bool + for _, perm := range AllPermissions { + if perm == requiredPerm { + found = true + } + } + if !found { + panic("unknown 'perm' tag on " + field.Name) + } + + fn := ra.Method(i) + rint.FieldByName(methodName).Set(reflect.MakeFunc(field.Type, func(args []reflect.Value) (results []reflect.Value) { + ctx := args[0].Interface().(context.Context) + errNum := 0 + if !auth.HasPerm(ctx, DefaultPerms, requiredPerm) { + errNum++ + goto ABORT + } + return fn.Call(args) + ABORT: + err := xerrors.Errorf("missing permission to invoke '%s'", methodName) + if errNum&1 == 1 { + err = xerrors.Errorf("%s (need '%s')", err, requiredPerm) + } + rerr := reflect.ValueOf(&err).Elem() + if fn.Type().NumOut() == 2 { + return []reflect.Value{ + reflect.Zero(fn.Type().Out(0)), + rerr, + } + } + return []reflect.Value{rerr} + })) + } + } + +} diff --git a/venus-shared/api/wallet/common.go b/venus-shared/api/wallet/common.go new file mode 100644 index 0000000000..d539b5e7ea --- /dev/null +++ b/venus-shared/api/wallet/common.go @@ -0,0 +1,20 @@ +package wallet + +import ( + "context" + + "github.com/filecoin-project/go-jsonrpc/auth" + "github.com/filecoin-project/venus/venus-shared/types" +) + +type ICommon interface { + // Auth + AuthVerify(ctx context.Context, token string) ([]auth.Permission, error) //perm:read + AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) //perm:admin + + // Version provides information about API provider + Version(context.Context) (types.Version, error) //perm:read + + LogList(context.Context) ([]string, error) //perm:read + LogSetLevel(context.Context, string, string) error //perm:write +} diff --git a/venus-shared/api/wallet/full.go b/venus-shared/api/wallet/full.go new file mode 100644 index 0000000000..27b2ee99ef --- /dev/null +++ b/venus-shared/api/wallet/full.go @@ -0,0 +1,8 @@ +package wallet + +type IFullAPI interface { + ILocalStrategy + ILocalWallet + ICommon + IWalletEvent +} diff --git a/venus-shared/api/wallet/proxy_gen.go b/venus-shared/api/wallet/proxy_gen.go new file mode 100644 index 0000000000..c7a7c78f90 --- /dev/null +++ b/venus-shared/api/wallet/proxy_gen.go @@ -0,0 +1,256 @@ +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package wallet + +import ( + "context" + + address "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-jsonrpc/auth" + "github.com/filecoin-project/go-state-types/crypto" + + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/venus/venus-shared/types/wallet" +) + +type IStrategyVerifyStruct struct { + Internal struct { + ContainWallet func(ctx context.Context, address address.Address) bool `perm:"admin"` + ScopeWallet func(ctx context.Context) (*wallet.AddressScope, error) `perm:"admin"` + Verify func(ctx context.Context, address address.Address, msgType types.MsgType, msg *types.Message) error `perm:"admin"` + } +} + +func (s *IStrategyVerifyStruct) ContainWallet(p0 context.Context, p1 address.Address) bool { + return s.Internal.ContainWallet(p0, p1) +} +func (s *IStrategyVerifyStruct) ScopeWallet(p0 context.Context) (*wallet.AddressScope, error) { + return s.Internal.ScopeWallet(p0) +} +func (s *IStrategyVerifyStruct) Verify(p0 context.Context, p1 address.Address, p2 types.MsgType, p3 *types.Message) error { + return s.Internal.Verify(p0, p1, p2, p3) +} + +type IStrategyStruct struct { + Internal struct { + AddMethodIntoKeyBind func(ctx context.Context, name string, methods []string) (*wallet.KeyBind, error) `perm:"admin"` + AddMsgTypeIntoKeyBind func(ctx context.Context, name string, codes []int) (*wallet.KeyBind, error) `perm:"admin"` + GetGroupByName func(ctx context.Context, name string) (*wallet.Group, error) `perm:"admin"` + GetKeyBindByName func(ctx context.Context, name string) (*wallet.KeyBind, error) `perm:"admin"` + GetKeyBinds func(ctx context.Context, address address.Address) ([]*wallet.KeyBind, error) `perm:"admin"` + GetMethodTemplateByName func(ctx context.Context, name string) (*wallet.MethodTemplate, error) `perm:"admin"` + GetMsgTypeTemplate func(ctx context.Context, name string) (*wallet.MsgTypeTemplate, error) `perm:"admin"` + GetWalletTokenInfo func(ctx context.Context, token string) (*wallet.GroupAuth, error) `perm:"admin"` + GetWalletTokensByGroup func(ctx context.Context, groupName string) ([]string, error) `perm:"admin"` + ListGroups func(ctx context.Context, fromIndex, toIndex int) ([]*wallet.Group, error) `perm:"admin"` + ListKeyBinds func(ctx context.Context, fromIndex, toIndex int) ([]*wallet.KeyBind, error) `perm:"admin"` + ListMethodTemplates func(ctx context.Context, fromIndex, toIndex int) ([]*wallet.MethodTemplate, error) `perm:"admin"` + ListMsgTypeTemplates func(ctx context.Context, fromIndex, toIndex int) ([]*wallet.MsgTypeTemplate, error) `perm:"admin"` + NewGroup func(ctx context.Context, name string, keyBindNames []string) error `perm:"admin"` + NewKeyBindCustom func(ctx context.Context, name string, address address.Address, codes []int, methods []wallet.MethodName) error `perm:"admin"` + NewKeyBindFromTemplate func(ctx context.Context, name string, address address.Address, mttName, mtName string) error `perm:"admin"` + NewMethodTemplate func(ctx context.Context, name string, methods []string) error `perm:"admin"` + NewMsgTypeTemplate func(ctx context.Context, name string, codes []int) error `perm:"admin"` + NewStToken func(ctx context.Context, groupName string) (token string, err error) `perm:"admin"` + RemoveGroup func(ctx context.Context, name string) error `perm:"admin"` + RemoveKeyBind func(ctx context.Context, name string) error `perm:"admin"` + RemoveKeyBindByAddress func(ctx context.Context, address address.Address) (int64, error) `perm:"admin"` + RemoveMethodFromKeyBind func(ctx context.Context, name string, methods []string) (*wallet.KeyBind, error) `perm:"admin"` + RemoveMethodTemplate func(ctx context.Context, name string) error `perm:"admin"` + RemoveMsgTypeFromKeyBind func(ctx context.Context, name string, codes []int) (*wallet.KeyBind, error) `perm:"admin"` + RemoveMsgTypeTemplate func(ctx context.Context, name string) error `perm:"admin"` + RemoveStToken func(ctx context.Context, token string) error `perm:"admin"` + } +} + +func (s *IStrategyStruct) AddMethodIntoKeyBind(p0 context.Context, p1 string, p2 []string) (*wallet.KeyBind, error) { + return s.Internal.AddMethodIntoKeyBind(p0, p1, p2) +} +func (s *IStrategyStruct) AddMsgTypeIntoKeyBind(p0 context.Context, p1 string, p2 []int) (*wallet.KeyBind, error) { + return s.Internal.AddMsgTypeIntoKeyBind(p0, p1, p2) +} +func (s *IStrategyStruct) GetGroupByName(p0 context.Context, p1 string) (*wallet.Group, error) { + return s.Internal.GetGroupByName(p0, p1) +} +func (s *IStrategyStruct) GetKeyBindByName(p0 context.Context, p1 string) (*wallet.KeyBind, error) { + return s.Internal.GetKeyBindByName(p0, p1) +} +func (s *IStrategyStruct) GetKeyBinds(p0 context.Context, p1 address.Address) ([]*wallet.KeyBind, error) { + return s.Internal.GetKeyBinds(p0, p1) +} +func (s *IStrategyStruct) GetMethodTemplateByName(p0 context.Context, p1 string) (*wallet.MethodTemplate, error) { + return s.Internal.GetMethodTemplateByName(p0, p1) +} +func (s *IStrategyStruct) GetMsgTypeTemplate(p0 context.Context, p1 string) (*wallet.MsgTypeTemplate, error) { + return s.Internal.GetMsgTypeTemplate(p0, p1) +} +func (s *IStrategyStruct) GetWalletTokenInfo(p0 context.Context, p1 string) (*wallet.GroupAuth, error) { + return s.Internal.GetWalletTokenInfo(p0, p1) +} +func (s *IStrategyStruct) GetWalletTokensByGroup(p0 context.Context, p1 string) ([]string, error) { + return s.Internal.GetWalletTokensByGroup(p0, p1) +} +func (s *IStrategyStruct) ListGroups(p0 context.Context, p1, p2 int) ([]*wallet.Group, error) { + return s.Internal.ListGroups(p0, p1, p2) +} +func (s *IStrategyStruct) ListKeyBinds(p0 context.Context, p1, p2 int) ([]*wallet.KeyBind, error) { + return s.Internal.ListKeyBinds(p0, p1, p2) +} +func (s *IStrategyStruct) ListMethodTemplates(p0 context.Context, p1, p2 int) ([]*wallet.MethodTemplate, error) { + return s.Internal.ListMethodTemplates(p0, p1, p2) +} +func (s *IStrategyStruct) ListMsgTypeTemplates(p0 context.Context, p1, p2 int) ([]*wallet.MsgTypeTemplate, error) { + return s.Internal.ListMsgTypeTemplates(p0, p1, p2) +} +func (s *IStrategyStruct) NewGroup(p0 context.Context, p1 string, p2 []string) error { + return s.Internal.NewGroup(p0, p1, p2) +} +func (s *IStrategyStruct) NewKeyBindCustom(p0 context.Context, p1 string, p2 address.Address, p3 []int, p4 []wallet.MethodName) error { + return s.Internal.NewKeyBindCustom(p0, p1, p2, p3, p4) +} +func (s *IStrategyStruct) NewKeyBindFromTemplate(p0 context.Context, p1 string, p2 address.Address, p3, p4 string) error { + return s.Internal.NewKeyBindFromTemplate(p0, p1, p2, p3, p4) +} +func (s *IStrategyStruct) NewMethodTemplate(p0 context.Context, p1 string, p2 []string) error { + return s.Internal.NewMethodTemplate(p0, p1, p2) +} +func (s *IStrategyStruct) NewMsgTypeTemplate(p0 context.Context, p1 string, p2 []int) error { + return s.Internal.NewMsgTypeTemplate(p0, p1, p2) +} +func (s *IStrategyStruct) NewStToken(p0 context.Context, p1 string) (string, error) { + return s.Internal.NewStToken(p0, p1) +} +func (s *IStrategyStruct) RemoveGroup(p0 context.Context, p1 string) error { + return s.Internal.RemoveGroup(p0, p1) +} +func (s *IStrategyStruct) RemoveKeyBind(p0 context.Context, p1 string) error { + return s.Internal.RemoveKeyBind(p0, p1) +} +func (s *IStrategyStruct) RemoveKeyBindByAddress(p0 context.Context, p1 address.Address) (int64, error) { + return s.Internal.RemoveKeyBindByAddress(p0, p1) +} +func (s *IStrategyStruct) RemoveMethodFromKeyBind(p0 context.Context, p1 string, p2 []string) (*wallet.KeyBind, error) { + return s.Internal.RemoveMethodFromKeyBind(p0, p1, p2) +} +func (s *IStrategyStruct) RemoveMethodTemplate(p0 context.Context, p1 string) error { + return s.Internal.RemoveMethodTemplate(p0, p1) +} +func (s *IStrategyStruct) RemoveMsgTypeFromKeyBind(p0 context.Context, p1 string, p2 []int) (*wallet.KeyBind, error) { + return s.Internal.RemoveMsgTypeFromKeyBind(p0, p1, p2) +} +func (s *IStrategyStruct) RemoveMsgTypeTemplate(p0 context.Context, p1 string) error { + return s.Internal.RemoveMsgTypeTemplate(p0, p1) +} +func (s *IStrategyStruct) RemoveStToken(p0 context.Context, p1 string) error { + return s.Internal.RemoveStToken(p0, p1) +} + +type ILocalStrategyStruct struct { + IStrategyVerifyStruct + IStrategyStruct +} + +type IWalletStruct struct { + Internal struct { + WalletDelete func(ctx context.Context, addr address.Address) error `perm:"admin"` + WalletExport func(ctx context.Context, addr address.Address) (*types.KeyInfo, error) `perm:"admin"` + WalletHas func(ctx context.Context, address address.Address) (bool, error) `perm:"read"` + WalletImport func(ctx context.Context, ki *types.KeyInfo) (address.Address, error) `perm:"admin"` + WalletList func(ctx context.Context) ([]address.Address, error) `perm:"read"` + WalletNew func(ctx context.Context, kt types.KeyType) (address.Address, error) `perm:"admin"` + WalletSign func(ctx context.Context, signer address.Address, toSign []byte, meta types.MsgMeta) (*crypto.Signature, error) `perm:"sign"` + } +} + +func (s *IWalletStruct) WalletDelete(p0 context.Context, p1 address.Address) error { + return s.Internal.WalletDelete(p0, p1) +} +func (s *IWalletStruct) WalletExport(p0 context.Context, p1 address.Address) (*types.KeyInfo, error) { + return s.Internal.WalletExport(p0, p1) +} +func (s *IWalletStruct) WalletHas(p0 context.Context, p1 address.Address) (bool, error) { + return s.Internal.WalletHas(p0, p1) +} +func (s *IWalletStruct) WalletImport(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) { + return s.Internal.WalletImport(p0, p1) +} +func (s *IWalletStruct) WalletList(p0 context.Context) ([]address.Address, error) { + return s.Internal.WalletList(p0) +} +func (s *IWalletStruct) WalletNew(p0 context.Context, p1 types.KeyType) (address.Address, error) { + return s.Internal.WalletNew(p0, p1) +} +func (s *IWalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 types.MsgMeta) (*crypto.Signature, error) { + return s.Internal.WalletSign(p0, p1, p2, p3) +} + +type IWalletLockStruct struct { + Internal struct { + Lock func(ctx context.Context, password string) error `perm:"admin"` + LockState func(ctx context.Context) bool `perm:"admin"` + SetPassword func(ctx context.Context, password string) error `perm:"admin"` + Unlock func(ctx context.Context, password string) error `perm:"admin"` + VerifyPassword func(ctx context.Context, password string) error `perm:"admin"` + } +} + +func (s *IWalletLockStruct) Lock(p0 context.Context, p1 string) error { return s.Internal.Lock(p0, p1) } +func (s *IWalletLockStruct) LockState(p0 context.Context) bool { return s.Internal.LockState(p0) } +func (s *IWalletLockStruct) SetPassword(p0 context.Context, p1 string) error { + return s.Internal.SetPassword(p0, p1) +} +func (s *IWalletLockStruct) Unlock(p0 context.Context, p1 string) error { + return s.Internal.Unlock(p0, p1) +} +func (s *IWalletLockStruct) VerifyPassword(p0 context.Context, p1 string) error { + return s.Internal.VerifyPassword(p0, p1) +} + +type ILocalWalletStruct struct { + IWalletStruct + IWalletLockStruct +} + +type ICommonStruct struct { + Internal struct { + AuthNew func(ctx context.Context, perms []auth.Permission) ([]byte, error) `perm:"admin"` + AuthVerify func(ctx context.Context, token string) ([]auth.Permission, error) `perm:"read"` + LogList func(context.Context) ([]string, error) `perm:"read"` + LogSetLevel func(context.Context, string, string) error `perm:"write"` + Version func(context.Context) (types.Version, error) `perm:"read"` + } +} + +func (s *ICommonStruct) AuthNew(p0 context.Context, p1 []auth.Permission) ([]byte, error) { + return s.Internal.AuthNew(p0, p1) +} +func (s *ICommonStruct) AuthVerify(p0 context.Context, p1 string) ([]auth.Permission, error) { + return s.Internal.AuthVerify(p0, p1) +} +func (s *ICommonStruct) LogList(p0 context.Context) ([]string, error) { return s.Internal.LogList(p0) } +func (s *ICommonStruct) LogSetLevel(p0 context.Context, p1 string, p2 string) error { + return s.Internal.LogSetLevel(p0, p1, p2) +} +func (s *ICommonStruct) Version(p0 context.Context) (types.Version, error) { + return s.Internal.Version(p0) +} + +type IWalletEventStruct struct { + Internal struct { + AddNewAddress func(ctx context.Context, newAddrs []address.Address) error `perm:"admin"` + AddSupportAccount func(ctx context.Context, supportAccount string) error `perm:"admin"` + } +} + +func (s *IWalletEventStruct) AddNewAddress(p0 context.Context, p1 []address.Address) error { + return s.Internal.AddNewAddress(p0, p1) +} +func (s *IWalletEventStruct) AddSupportAccount(p0 context.Context, p1 string) error { + return s.Internal.AddSupportAccount(p0, p1) +} + +type IFullAPIStruct struct { + ILocalStrategyStruct + ILocalWalletStruct + ICommonStruct + IWalletEventStruct +} diff --git a/venus-shared/api/wallet/strategy.go b/venus-shared/api/wallet/strategy.go new file mode 100644 index 0000000000..b19f643fdb --- /dev/null +++ b/venus-shared/api/wallet/strategy.go @@ -0,0 +1,82 @@ +package wallet + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/venus/venus-shared/types/wallet" +) + +type ILocalStrategy interface { + IStrategyVerify + IStrategy +} + +type IStrategyVerify interface { + // Verify verify the address strategy permissions + Verify(ctx context.Context, address address.Address, msgType types.MsgType, msg *types.Message) error //perm:admin + // ScopeWallet get the wallet scope + ScopeWallet(ctx context.Context) (*wallet.AddressScope, error) //perm:admin + // ContainWallet Check if it is visible to the wallet + ContainWallet(ctx context.Context, address address.Address) bool //perm:admin +} + +type IStrategy interface { + // NewMsgTypeTemplate create a msgType template + NewMsgTypeTemplate(ctx context.Context, name string, codes []int) error //perm:admin + // NewMethodTemplate create a method template + NewMethodTemplate(ctx context.Context, name string, methods []string) error //perm:admin + // NewKeyBindCustom create a keyBind with custom msyTypes and methods + NewKeyBindCustom(ctx context.Context, name string, address address.Address, codes []int, methods []wallet.MethodName) error //perm:admin + // NewKeyBindFromTemplate create a keyBind form msgType template and method template + NewKeyBindFromTemplate(ctx context.Context, name string, address address.Address, mttName, mtName string) error //perm:admin + // NewGroup create a group to group multiple keyBinds together + NewGroup(ctx context.Context, name string, keyBindNames []string) error //perm:admin + // NewStToken generate a random token from group + NewStToken(ctx context.Context, groupName string) (token string, err error) //perm:admin + // GetMsgTypeTemplate get a msgType template by name + GetMsgTypeTemplate(ctx context.Context, name string) (*wallet.MsgTypeTemplate, error) //perm:admin + // GetMethodTemplateByName get a method template by name + GetMethodTemplateByName(ctx context.Context, name string) (*wallet.MethodTemplate, error) //perm:admin + // GetKeyBindByName get a keyBind by name + GetKeyBindByName(ctx context.Context, name string) (*wallet.KeyBind, error) //perm:admin + // GetKeyBinds list keyBinds by address + GetKeyBinds(ctx context.Context, address address.Address) ([]*wallet.KeyBind, error) //perm:admin + // GetGroupByName get a group by name + GetGroupByName(ctx context.Context, name string) (*wallet.Group, error) //perm:admin + // GetWalletTokensByGroup list strategy tokens under the group + GetWalletTokensByGroup(ctx context.Context, groupName string) ([]string, error) //perm:admin + // GetWalletTokenInfo get group details by token + GetWalletTokenInfo(ctx context.Context, token string) (*wallet.GroupAuth, error) //perm:admin + // ListGroups list groups' simple information + ListGroups(ctx context.Context, fromIndex, toIndex int) ([]*wallet.Group, error) //perm:admin + // ListKeyBinds list keyBinds' details + ListKeyBinds(ctx context.Context, fromIndex, toIndex int) ([]*wallet.KeyBind, error) //perm:admin + // ListMethodTemplates list method templates' details + ListMethodTemplates(ctx context.Context, fromIndex, toIndex int) ([]*wallet.MethodTemplate, error) //perm:admin + // ListMsgTypeTemplates list msgType templates' details + ListMsgTypeTemplates(ctx context.Context, fromIndex, toIndex int) ([]*wallet.MsgTypeTemplate, error) //perm:admin + + // AddMsgTypeIntoKeyBind append msgTypes into keyBind + AddMsgTypeIntoKeyBind(ctx context.Context, name string, codes []int) (*wallet.KeyBind, error) //perm:admin + // AddMethodIntoKeyBind append methods into keyBind + AddMethodIntoKeyBind(ctx context.Context, name string, methods []string) (*wallet.KeyBind, error) //perm:admin + // RemoveMsgTypeFromKeyBind remove msgTypes form keyBind + RemoveMsgTypeFromKeyBind(ctx context.Context, name string, codes []int) (*wallet.KeyBind, error) //perm:admin + // RemoveMethodFromKeyBind remove methods from keyBind + RemoveMethodFromKeyBind(ctx context.Context, name string, methods []string) (*wallet.KeyBind, error) //perm:admin + + // RemoveMsgTypeTemplate delete msgType template by name + RemoveMsgTypeTemplate(ctx context.Context, name string) error //perm:admin + // RemoveGroup delete group by name + RemoveGroup(ctx context.Context, name string) error //perm:admin + // RemoveMethodTemplate delete method template by name + RemoveMethodTemplate(ctx context.Context, name string) error //perm:admin + // RemoveKeyBind delete keyBind by name + RemoveKeyBind(ctx context.Context, name string) error //perm:admin + // RemoveKeyBindByAddress delete some keyBinds by address + RemoveKeyBindByAddress(ctx context.Context, address address.Address) (int64, error) //perm:admin + // RemoveStToken delete strategy token + RemoveStToken(ctx context.Context, token string) error //perm:admin +} diff --git a/venus-shared/api/wallet/wallet.go b/venus-shared/api/wallet/wallet.go new file mode 100644 index 0000000000..120f9036f2 --- /dev/null +++ b/venus-shared/api/wallet/wallet.go @@ -0,0 +1,42 @@ +package wallet + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/venus/venus-shared/types" +) + +type ILocalWallet interface { + IWallet + IWalletLock +} + +type IWalletLock interface { + // SetPassword do it first after program setup + SetPassword(ctx context.Context, password string) error //perm:admin + // unlock the wallet and enable IWallet logic + Unlock(ctx context.Context, password string) error //perm:admin + // lock the wallet and disable IWallet logic + Lock(ctx context.Context, password string) error //perm:admin + // show lock state + LockState(ctx context.Context) bool //perm:admin + // VerifyPassword verify that the passwords are consistent + VerifyPassword(ctx context.Context, password string) error //perm:admin +} + +type IWallet interface { + WalletNew(ctx context.Context, kt types.KeyType) (address.Address, error) //perm:admin + WalletHas(ctx context.Context, address address.Address) (bool, error) //perm:read + WalletList(ctx context.Context) ([]address.Address, error) //perm:read + WalletSign(ctx context.Context, signer address.Address, toSign []byte, meta types.MsgMeta) (*crypto.Signature, error) //perm:sign + WalletExport(ctx context.Context, addr address.Address) (*types.KeyInfo, error) //perm:admin + WalletImport(ctx context.Context, ki *types.KeyInfo) (address.Address, error) //perm:admin + WalletDelete(ctx context.Context, addr address.Address) error //perm:admin +} + +type IWalletEvent interface { + AddSupportAccount(ctx context.Context, supportAccount string) error //perm:admin + AddNewAddress(ctx context.Context, newAddrs []address.Address) error //perm:admin +} diff --git a/venus-shared/types/wallet/draw_random_params.go b/venus-shared/types/wallet/draw_random_params.go new file mode 100644 index 0000000000..8110f4c429 --- /dev/null +++ b/venus-shared/types/wallet/draw_random_params.go @@ -0,0 +1,63 @@ +package wallet + +import ( + "encoding/binary" + "io" + "io/ioutil" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/cbor" + "github.com/filecoin-project/go-state-types/crypto" + fcbor "github.com/fxamacker/cbor/v2" + "github.com/minio/blake2b-simd" + "golang.org/x/xerrors" +) + +type DrawRandomParams struct { + Rbase []byte + Pers crypto.DomainSeparationTag + Round abi.ChainEpoch + Entropy []byte +} + +// return store.DrawRandomness(dr.Rbase, dr.Pers, dr.Round, dr.Entropy) +func (dr *DrawRandomParams) SignBytes() ([]byte, error) { + h := blake2b.New256() + if err := binary.Write(h, binary.BigEndian, int64(dr.Pers)); err != nil { + return nil, xerrors.Errorf("deriving randomness: %w", err) + } + VRFDigest := blake2b.Sum256(dr.Rbase) + _, err := h.Write(VRFDigest[:]) + if err != nil { + return nil, xerrors.Errorf("hashing VRFDigest: %w", err) + } + if err := binary.Write(h, binary.BigEndian, dr.Round); err != nil { + return nil, xerrors.Errorf("deriving randomness: %w", err) + } + _, err = h.Write(dr.Entropy) + if err != nil { + return nil, xerrors.Errorf("hashing entropy: %w", err) + } + + return h.Sum(nil), nil +} + +func (dr *DrawRandomParams) MarshalCBOR(w io.Writer) error { + data, err := fcbor.Marshal(dr) + if err != nil { + return err + } + _, err = w.Write(data) + return err +} + +func (dr *DrawRandomParams) UnmarshalCBOR(r io.Reader) error { + data, err := ioutil.ReadAll(r) + if err != nil { + return err + } + return fcbor.Unmarshal(data, dr) +} + +var _ = cbor.Unmarshaler((*DrawRandomParams)(nil)) +var _ = cbor.Marshaler((*DrawRandomParams)(nil)) diff --git a/venus-shared/types/wallet/msg_enum.go b/venus-shared/types/wallet/msg_enum.go new file mode 100644 index 0000000000..5fceef0f3b --- /dev/null +++ b/venus-shared/types/wallet/msg_enum.go @@ -0,0 +1,132 @@ +package wallet + +import ( + "errors" + "math" + + "golang.org/x/xerrors" + + "github.com/ahmetb/go-linq/v3" + "github.com/filecoin-project/venus/venus-shared/types" +) + +var ( + ErrCodeOverflow = errors.New("code over flow") +) + +type MsgEnum = uint32 + +const ( + MEUnknown MsgEnum = 1 << iota + MEChainMsg + MEBlock + MEDealProposal + MEDrawRandomParam + MESignedVoucher + MEStorageAsk + MEAskResponse + MENetWorkResponse + MEProviderDealState + MEClientDeal + MEVerifyAddress +) + +var MsgEnumPool = []struct { + Code int + Name string +}{ + {Code: MsgEnumCode(MEUnknown), Name: "unknown"}, + {Code: MsgEnumCode(MEChainMsg), Name: "chainMsg"}, + {Code: MsgEnumCode(MEBlock), Name: "block"}, + {Code: MsgEnumCode(MEDealProposal), Name: "dealProposal"}, + {Code: MsgEnumCode(MEDrawRandomParam), Name: "drawRandomParam"}, + {Code: MsgEnumCode(MESignedVoucher), Name: "signedVoucher"}, + {Code: MsgEnumCode(MEStorageAsk), Name: "storageAsk"}, + {Code: MsgEnumCode(MEAskResponse), Name: "askResponse"}, + {Code: MsgEnumCode(MENetWorkResponse), Name: "netWorkResponse"}, + {Code: MsgEnumCode(MEProviderDealState), Name: "providerDealState"}, + {Code: MsgEnumCode(MEClientDeal), Name: "clientDeal"}, +} +var MaxMsgEnumCode = len(MsgEnumPool) - 1 + +func CheckMsgEnum(me MsgEnum) error { + max := 1 << MaxMsgEnumCode + if me > uint32(max) { + return ErrCodeOverflow + } + return nil +} +func FindCode(enum MsgEnum) []int { + var codes []int + for power := 0; enum > 0; power++ { + var digit = enum % 2 + if digit == 1 { + codes = append(codes, power) + } + enum /= 2 + } + return codes +} + +func AggregateMsgEnumCode(codes []int) (MsgEnum, error) { + if len(codes) == 0 { + return 0, xerrors.New("nil reference") + } + linq.From(codes).Distinct().ToSlice(&codes) + em := MsgEnum(0) + for _, v := range codes { + me, err := MsgEnumFromInt(v) + if err != nil { + return 0, err + } + em += me + } + return em, nil +} + +func MsgEnumFromInt(code int) (MsgEnum, error) { + if code < 0 || code > MaxMsgEnumCode { + return 0, ErrCodeOverflow + } + return 1 << code, nil +} + +func MsgEnumCode(me MsgEnum) int { + code := math.Log2(float64(me)) + return int(code) +} +func ContainMsgType(multiME MsgEnum, mt types.MsgType) bool { + me := convertToMsgEnum(mt) + return multiME&me == me +} + +func convertToMsgEnum(mt types.MsgType) MsgEnum { + switch mt { + case types.MTUnknown: + return MEUnknown + case types.MTChainMsg: + return MEChainMsg + case types.MTBlock: + return MEBlock + case types.MTDealProposal: + return MEDealProposal + case types.MTDrawRandomParam: + return MEDrawRandomParam + case types.MTSignedVoucher: + return MESignedVoucher + case types.MTStorageAsk: + return MEStorageAsk + case types.MTAskResponse: + return MEAskResponse + case types.MTNetWorkResponse: + return MENetWorkResponse + case types.MTProviderDealState: + return MEProviderDealState + case types.MTClientDeal: + return MEClientDeal + case types.MTVerifyAddress: + return MEVerifyAddress + default: + return MEUnknown + } +} diff --git a/venus-shared/types/wallet/msg_enum_test.go b/venus-shared/types/wallet/msg_enum_test.go new file mode 100644 index 0000000000..72b970fac3 --- /dev/null +++ b/venus-shared/types/wallet/msg_enum_test.go @@ -0,0 +1,44 @@ +package wallet + +import ( + "testing" + + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + "github.com/filecoin-project/venus/venus-shared/types" + "gotest.tools/assert" +) + +func TestContainMsgType(t *testing.T) { + tf.UnitTest(t) + multiME := MEUnknown + MEChainMsg + MEStorageAsk + MEProviderDealState + MEVerifyAddress + assert.Equal(t, ContainMsgType(multiME, types.MTChainMsg), true) + assert.Equal(t, ContainMsgType(multiME, types.MTStorageAsk), true) + assert.Equal(t, ContainMsgType(multiME, types.MTProviderDealState), true) + assert.Equal(t, ContainMsgType(multiME, types.MTUnknown), true) + assert.Equal(t, ContainMsgType(multiME, types.MTBlock), false) + assert.Equal(t, ContainMsgType(multiME, types.MTDealProposal), false) + assert.Equal(t, ContainMsgType(multiME, types.MTDrawRandomParam), false) + assert.Equal(t, ContainMsgType(multiME, types.MTSignedVoucher), false) + assert.Equal(t, ContainMsgType(multiME, types.MTAskResponse), false) + assert.Equal(t, ContainMsgType(multiME, types.MTNetWorkResponse), false) + assert.Equal(t, ContainMsgType(multiME, types.MTClientDeal), false) + assert.Equal(t, ContainMsgType(multiME, types.MTVerifyAddress), true) +} + +func TestFindCode(t *testing.T) { + tf.UnitTest(t) + ids := FindCode(38) + assert.DeepEqual(t, []int{1, 2, 5}, ids) + + ids2 := FindCode(8392) + assert.DeepEqual(t, []int{3, 6, 7, 13}, ids2) +} + +func TestAggregateMsgEnumCode(t *testing.T) { + tf.UnitTest(t) + me, err := AggregateMsgEnumCode([]int{1, 2, 3, 4, 5, 6, 7}) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, me, uint32(254)) +} diff --git a/venus-shared/types/wallet/wallet.go b/venus-shared/types/wallet/wallet.go new file mode 100644 index 0000000000..912c47ef79 --- /dev/null +++ b/venus-shared/types/wallet/wallet.go @@ -0,0 +1,74 @@ +package wallet + +import ( + linq "github.com/ahmetb/go-linq/v3" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/venus/venus-shared/types" +) + +type AddressScope struct { + Root bool // is root auth, true : can get all addresses in the wallet + Addresses []address.Address // when root==false, should fill a scope of wallet addresses +} + +type MethodName = string + +// KeyStrategy a uint of wallet strategy +type KeyStrategy struct { + Address address.Address // wallet address + MetaTypes MsgEnum // sum MsgEnum + Methods []MethodName // msg method array +} + +// GroupAuth relation with Group and generate a token for external invocation +type GroupAuth struct { + Token string + GroupID uint + Name string + KeyBinds []*KeyBind +} + +// KeyBind bind wallet usage strategy +// allow designated rule to pass +type KeyBind struct { + BindID uint + Name string + Address string + // source from MsgTypeTemplate or temporary create + MetaTypes MsgEnum + // source from MethodTemplate + Methods []MethodName +} + +func (kb *KeyBind) ContainMsgType(m types.MsgType) bool { + return ContainMsgType(kb.MetaTypes, m) +} + +func (kb *KeyBind) ContainMethod(m string) bool { + return linq.From(kb.Methods).Contains(m) +} + +// Group multi KeyBind +type Group struct { + GroupID uint + Name string + // NOTE: not fill data when query groups + KeyBinds []*KeyBind +} + +// MethodTemplate to quickly create a private key usage strategy +// msg actor and methodNum agg to method name +// NOTE: routeType 4 +type MethodTemplate struct { + MTId uint + Name string + // method name join with ',' + Methods []MethodName +} + +// MsgTypeTemplate to quickly create a private key usage strategy +type MsgTypeTemplate struct { + MTTId uint + Name string + MetaTypes MsgEnum +} From 002ee9b8e171dd582ab9e0253d2dc8b68995d256 Mon Sep 17 00:00:00 2001 From: Caesar Wang Date: Wed, 26 Jan 2022 09:21:46 +0800 Subject: [PATCH 137/167] feat: generate client constructor for apis in venus-shared (#4747) --- Makefile | 1 + venus-devtool/api-gen/client.go | 102 ++++++++++++++++++++++++ venus-devtool/api-gen/common.go | 61 ++++++++++++++ venus-devtool/api-gen/main.go | 1 + venus-devtool/api-gen/proxy.go | 46 +---------- venus-devtool/go.sum | 1 + venus-devtool/util/api_meta.go | 6 ++ venus-shared/api/chain/v0/client_gen.go | 24 ++++++ venus-shared/api/chain/v1/client_gen.go | 24 ++++++ venus-shared/api/messager/client_gen.go | 24 ++++++ venus-shared/api/request_header.go | 3 + venus-shared/api/wallet/client_gen.go | 24 ++++++ 12 files changed, 273 insertions(+), 44 deletions(-) create mode 100644 venus-devtool/api-gen/client.go create mode 100644 venus-devtool/api-gen/common.go create mode 100644 venus-shared/api/chain/v0/client_gen.go create mode 100644 venus-shared/api/chain/v1/client_gen.go create mode 100644 venus-shared/api/messager/client_gen.go create mode 100644 venus-shared/api/request_header.go create mode 100644 venus-shared/api/wallet/client_gen.go diff --git a/Makefile b/Makefile index b6ac10a97b..e01350ec01 100644 --- a/Makefile +++ b/Makefile @@ -49,6 +49,7 @@ test-venus-shared: api-gen: cd ./venus-devtool/ && go run ./api-gen/ proxy + cd ./venus-devtool/ && go run ./api-gen/ client v0APIDoc = ../venus-shared/api/v0-api-document.md v1APIDoc = ../venus-shared/api/v1-api-document.md diff --git a/venus-devtool/api-gen/client.go b/venus-devtool/api-gen/client.go new file mode 100644 index 0000000000..b200213772 --- /dev/null +++ b/venus-devtool/api-gen/client.go @@ -0,0 +1,102 @@ +package main + +import ( + "bytes" + "fmt" + "log" + "text/template" + + "github.com/filecoin-project/venus/venus-devtool/util" + "github.com/urfave/cli/v2" +) + +var clientCmd = &cli.Command{ + Name: "client", + Flags: []cli.Flag{}, + Action: func(cctx *cli.Context) error { + for _, target := range apiTargets { + err := genClientForAPI(target) + if err != nil { + log.Fatalf("got error while generating client codes for %s: %s", target.Type, err) + } + } + return nil + }, +} + +const clientGenTemplate = ` +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package {{ .PkgName }} + +import ( + "context" + "net/http" + + "github.com/filecoin-project/go-jsonrpc" + + "github.com/filecoin-project/venus/venus-shared/api" +) + +// New{{ .APIName }}RPC creates a new httpparse jsonrpc remotecli. +func New{{ .APIName }}RPC(ctx context.Context, addr string, requestHeader http.Header) ({{ .APIName }}, jsonrpc.ClientCloser, error) { + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, "{{ .APINs }}") + + var res {{ .APIStruct }} + closer, err := jsonrpc.NewMergeClient(ctx, addr, "{{ .MethNs }}", api.GetInternalStructs(&res), requestHeader) + + return &res, closer, err +} +` + +func genClientForAPI(t util.APIMeta) error { + ifaceMetas, astMeta, err := util.ParseInterfaceMetas(t.ParseOpt) + if err != nil { + return err + } + + apiName := t.Type.Name() + + var apiIface *util.InterfaceMeta + for i := range ifaceMetas { + if ifaceMetas[i].Name == apiName { + apiIface = ifaceMetas[i] + break + } + } + + if apiIface == nil { + return fmt.Errorf("api %s not found", apiName) + } + + tmpl, err := template.New("client").Parse(clientGenTemplate) + if err != nil { + return fmt.Errorf("parse template: %w", err) + } + + ns := t.RPCMeta.Namespace + if ns == "" { + ns = fmt.Sprintf("%s.%s", apiIface.Pkg.Name, apiIface.Name) + } + + methNs := t.RPCMeta.MethodNamespace + if methNs == "" { + methNs = "Filecoin" + } + + var buf bytes.Buffer + err = tmpl.Execute(&buf, map[string]interface{}{ + "PkgName": apiIface.Pkg.Name, + "APIName": apiName, + "APIStruct": structName(apiName), + "APINs": ns, + "MethNs": methNs, + }) + if err != nil { + return fmt.Errorf("exec template: %w", err) + } + + return outputSourceFile(astMeta.Location, "client_gen.go", &buf) +} diff --git a/venus-devtool/api-gen/common.go b/venus-devtool/api-gen/common.go new file mode 100644 index 0000000000..aa68f1395f --- /dev/null +++ b/venus-devtool/api-gen/common.go @@ -0,0 +1,61 @@ +package main + +import ( + "bytes" + "fmt" + "go/format" + "io/ioutil" + "path/filepath" + "reflect" + + "github.com/filecoin-project/venus/venus-devtool/util" + "github.com/filecoin-project/venus/venus-shared/api/messager" + "github.com/filecoin-project/venus/venus-shared/api/wallet" +) + +func init() { + for _, capi := range util.ChainAPIPairs { + apiTargets = append(apiTargets, capi.Venus) + } + + apiTargets = append(apiTargets, + util.APIMeta{ + Type: reflect.TypeOf((*messager.IMessager)(nil)).Elem(), + ParseOpt: util.InterfaceParseOption{ + ImportPath: "github.com/filecoin-project/venus/venus-shared/api/messager", + IncludeAll: true, + }, + RPCMeta: util.RPCMeta{ + MethodNamespace: "Message", + }, + }, + util.APIMeta{ + Type: reflect.TypeOf((*wallet.IFullAPI)(nil)).Elem(), + ParseOpt: util.InterfaceParseOption{ + ImportPath: "github.com/filecoin-project/venus/venus-shared/api/wallet", + IncludeAll: true, + }, + }, + ) +} + +var apiTargets []util.APIMeta + +func structName(ifaceName string) string { + return ifaceName + "Struct" +} + +func outputSourceFile(location, fname string, buf *bytes.Buffer) error { + formatted, err := format.Source(buf.Bytes()) + if err != nil { + return fmt.Errorf("format source content: %w", err) + } + + outputFile := filepath.Join(location, fname) + err = ioutil.WriteFile(outputFile, formatted, 0644) + if err != nil { + return fmt.Errorf("write to output %s: %w", outputFile, err) + } + + return nil +} diff --git a/venus-devtool/api-gen/main.go b/venus-devtool/api-gen/main.go index 21ed0d0df7..fef0eea243 100644 --- a/venus-devtool/api-gen/main.go +++ b/venus-devtool/api-gen/main.go @@ -15,6 +15,7 @@ func main() { Flags: []cli.Flag{}, Commands: []*cli.Command{ proxyCmd, + clientCmd, }, } diff --git a/venus-devtool/api-gen/proxy.go b/venus-devtool/api-gen/proxy.go index 4e5e75ed6c..5f5a239674 100644 --- a/venus-devtool/api-gen/proxy.go +++ b/venus-devtool/api-gen/proxy.go @@ -4,49 +4,22 @@ import ( "bytes" "fmt" "go/ast" - "go/format" "go/printer" "io" - "io/ioutil" "log" "path/filepath" - "reflect" "strings" "github.com/urfave/cli/v2" "github.com/filecoin-project/venus/venus-devtool/util" - "github.com/filecoin-project/venus/venus-shared/api/messager" - "github.com/filecoin-project/venus/venus-shared/api/wallet" ) -func init() { - for _, capi := range util.ChainAPIPairs { - proxyTargets = append(proxyTargets, capi.Venus) - } - - proxyTargets = append(proxyTargets, util.APIMeta{ - Type: reflect.TypeOf((*messager.IMessager)(nil)).Elem(), - ParseOpt: util.InterfaceParseOption{ - ImportPath: "github.com/filecoin-project/venus/venus-shared/api/messager", - IncludeAll: true, - }, - }, util.APIMeta{ - Type: reflect.TypeOf((*wallet.IFullAPI)(nil)).Elem(), - ParseOpt: util.InterfaceParseOption{ - ImportPath: "github.com/filecoin-project/venus/venus-shared/api/wallet", - IncludeAll: true, - }, - }) -} - -var proxyTargets []util.APIMeta - var proxyCmd = &cli.Command{ Name: "proxy", Flags: []cli.Flag{}, Action: func(cctx *cli.Context) error { - for _, target := range proxyTargets { + for _, target := range apiTargets { err := genProxyForAPI(target) if err != nil { log.Fatalf("got error while generating proxy codes for %s: %s", target.Type, err) @@ -100,18 +73,7 @@ func genProxyForAPI(t util.APIMeta) error { return fmt.Errorf("copy contents into output: %w", err) } - formatted, err := format.Source(fileBuffer.Bytes()) - if err != nil { - return fmt.Errorf("format source content: %w", err) - } - - outputFile := filepath.Join(astMeta.Location, "proxy_gen.go") - err = ioutil.WriteFile(outputFile, formatted, 0644) - if err != nil { - return fmt.Errorf("write to output %s: %w", outputFile, err) - } - - return nil + return outputSourceFile(astMeta.Location, "proxy_gen.go", &fileBuffer) } func writeImports(deps map[string]util.ImportMeta, dst *bytes.Buffer) error { @@ -200,10 +162,6 @@ type %s struct { ` ) -func structName(ifaceName string) string { - return ifaceName + "Struct" -} - func writeStruct(dst *bytes.Buffer, ifaceMeta *util.InterfaceMeta, astMeta *util.ASTMeta) error { fmt.Fprintf(dst, structHeadFormat, structName(ifaceMeta.Name)) diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index 82520d3aa7..84de1abfde 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -664,6 +664,7 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= diff --git a/venus-devtool/util/api_meta.go b/venus-devtool/util/api_meta.go index cbbb00b334..ea29649708 100644 --- a/venus-devtool/util/api_meta.go +++ b/venus-devtool/util/api_meta.go @@ -54,9 +54,15 @@ var ChainAPIPairs = []struct { var LatestChainAPIPair = ChainAPIPairs[len(ChainAPIPairs)-1] +type RPCMeta struct { + Namespace string + MethodNamespace string +} + type APIMeta struct { Type reflect.Type ParseOpt InterfaceParseOption + RPCMeta } func GetAPIMethodPerm(m InterfaceMethodMeta) string { diff --git a/venus-shared/api/chain/v0/client_gen.go b/venus-shared/api/chain/v0/client_gen.go new file mode 100644 index 0000000000..bbb39e63f8 --- /dev/null +++ b/venus-shared/api/chain/v0/client_gen.go @@ -0,0 +1,24 @@ +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package v0 + +import ( + "context" + "net/http" + + "github.com/filecoin-project/go-jsonrpc" + + "github.com/filecoin-project/venus/venus-shared/api" +) + +// NewFullNodeRPC creates a new httpparse jsonrpc remotecli. +func NewFullNodeRPC(ctx context.Context, addr string, requestHeader http.Header) (FullNode, jsonrpc.ClientCloser, error) { + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, "v0.FullNode") + + var res FullNodeStruct + closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&res), requestHeader) + + return &res, closer, err +} diff --git a/venus-shared/api/chain/v1/client_gen.go b/venus-shared/api/chain/v1/client_gen.go new file mode 100644 index 0000000000..1813606a5f --- /dev/null +++ b/venus-shared/api/chain/v1/client_gen.go @@ -0,0 +1,24 @@ +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package v1 + +import ( + "context" + "net/http" + + "github.com/filecoin-project/go-jsonrpc" + + "github.com/filecoin-project/venus/venus-shared/api" +) + +// NewFullNodeRPC creates a new httpparse jsonrpc remotecli. +func NewFullNodeRPC(ctx context.Context, addr string, requestHeader http.Header) (FullNode, jsonrpc.ClientCloser, error) { + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, "v1.FullNode") + + var res FullNodeStruct + closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&res), requestHeader) + + return &res, closer, err +} diff --git a/venus-shared/api/messager/client_gen.go b/venus-shared/api/messager/client_gen.go new file mode 100644 index 0000000000..837950b80d --- /dev/null +++ b/venus-shared/api/messager/client_gen.go @@ -0,0 +1,24 @@ +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package messager + +import ( + "context" + "net/http" + + "github.com/filecoin-project/go-jsonrpc" + + "github.com/filecoin-project/venus/venus-shared/api" +) + +// NewIMessagerRPC creates a new httpparse jsonrpc remotecli. +func NewIMessagerRPC(ctx context.Context, addr string, requestHeader http.Header) (IMessager, jsonrpc.ClientCloser, error) { + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, "messager.IMessager") + + var res IMessagerStruct + closer, err := jsonrpc.NewMergeClient(ctx, addr, "Message", api.GetInternalStructs(&res), requestHeader) + + return &res, closer, err +} diff --git a/venus-shared/api/request_header.go b/venus-shared/api/request_header.go new file mode 100644 index 0000000000..8906a56788 --- /dev/null +++ b/venus-shared/api/request_header.go @@ -0,0 +1,3 @@ +package api + +const VenusAPINamespaceHeader = "X-VENUS-API-NAMESPACE" diff --git a/venus-shared/api/wallet/client_gen.go b/venus-shared/api/wallet/client_gen.go new file mode 100644 index 0000000000..cc8f767295 --- /dev/null +++ b/venus-shared/api/wallet/client_gen.go @@ -0,0 +1,24 @@ +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package wallet + +import ( + "context" + "net/http" + + "github.com/filecoin-project/go-jsonrpc" + + "github.com/filecoin-project/venus/venus-shared/api" +) + +// NewIFullAPIRPC creates a new httpparse jsonrpc remotecli. +func NewIFullAPIRPC(ctx context.Context, addr string, requestHeader http.Header) (IFullAPI, jsonrpc.ClientCloser, error) { + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, "wallet.IFullAPI") + + var res IFullAPIStruct + closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&res), requestHeader) + + return &res, closer, err +} From 6c31bf203de222bdab3efd6b31c5135db11fb0e0 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Wed, 26 Jan 2022 17:24:06 +0800 Subject: [PATCH 138/167] upgrade ffi (#4748) --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index e660df5616..9e55c9a85e 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit e660df5616e397b2d8ac316f45ddfa7a44637971 +Subproject commit 9e55c9a85eaeb15775114eae1252ef6ac67edf13 From 644a6acfab128a2a8ffa6352fa39e5096fe3b34e Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Fri, 28 Jan 2022 21:03:02 +0800 Subject: [PATCH 139/167] fix wallet unlock failed (#4736) --- pkg/wallet/dsbackend.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pkg/wallet/dsbackend.go b/pkg/wallet/dsbackend.go index a36a672178..9cfc35c100 100644 --- a/pkg/wallet/dsbackend.go +++ b/pkg/wallet/dsbackend.go @@ -229,11 +229,6 @@ func (backend *DSBackend) GetKeyInfo(ctx context.Context, addr address.Address) //GetKeyInfoPassphrase get private private key from wallet, get encrypt byte from db and decrypto it with password func (backend *DSBackend) GetKeyInfoPassphrase(ctx context.Context, addr address.Address, password []byte) (*crypto.KeyInfo, error) { - defer func() { - for i := range password { - password[i] = 0 - } - }() if !backend.HasAddress(ctx, addr) { return nil, errors.New("backend does not contain address") } From 4bc1e2378262c6fc371a70009d3feb8fb5c87cf4 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Tue, 8 Feb 2022 16:38:04 +0800 Subject: [PATCH 140/167] build: release: v1.2.0-rc5 (#4751) * reset butterfly network * update ffi * udpate version to v1.2.0-rc5 --- extern/filecoin-ffi | 2 +- fixtures/_assets/car/butterflynet.car | Bin 2185801 -> 2185803 bytes fixtures/_assets/proof-params/parameters.json | 36 ++++++++++++---- fixtures/asset/asset.go | 39 +++++++----------- fixtures/networks/butterfly.go | 6 +-- fixtures/networks/calibration.go | 2 +- pkg/constants/version.go | 2 +- 7 files changed, 49 insertions(+), 38 deletions(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 9e55c9a85e..f66026bd3d 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 9e55c9a85eaeb15775114eae1252ef6ac67edf13 +Subproject commit f66026bd3d165e009b11172c82b44204197a7666 diff --git a/fixtures/_assets/car/butterflynet.car b/fixtures/_assets/car/butterflynet.car index c79eab38eb96c401356d80105c4479513ddf4e2f..6ef5243beb1f3416cba583f129a3944535cd3338 100644 GIT binary patch delta 2184 zcmb7^do+}J7{})>gG_ESgVAWzv|VV&B_X%P<}!vdZfObQ(pqv$MNKne zopNj3a&n8=A*zjHLYNqXLb|ZncjWBZKRV6&PoZs*HzR&wS&-dX~B!T$=87lPa z!hRSRqTFN^5Wc}AqBu_7spIjN`=4mV{m&>LjSoBxK1Pd*4vh#0mqNgig(DEWw15n2 z5QyQ4-n}0~gQpwpoNw>xv$TxlC!aR6YG;Bh8BCBTo8yHyRo_+T zsNm!>+AP9F-Q-)d86H1Fi!+opFAymX9VqIq<;X+z@lr4OLX+@t zL?WeY+b}x&uS%p&_?&dA*cP8G*8ipWc3JcHA znz_x=#RN>?bmPF6&SPnu5||-=kCxrr9?Q=*xI-eiLoU+sO`pR0&vRq$heW#i&fEjS zawz;77>}`^ozqG0^&6Tb=g1mrF6X`uQFe+2?d@wBav(hK|Fygo5d_BX_EG1{4JM5@ z&HGtcw77Epsr46d$UF6W(#?aykg2^K^12>;sdZ7cZ6v={SoVduVA4isqBV{qDqQ!Q zz9Jbd)h;G*Y-IKEM3IsK`qpi>|6(fIUoWqSATM)D7*Z7gFW4-D)}6NCWCNF$BL2KG z;eo)4=;Z_F>MQ3g5sRQ_(eYWchuMYis(h)OaoMeS6OtiZ%a$58o~7GSzO$3)Pgu^# z8+%$qjn16I#gI=Xl8`JC5)1(0l9157QSQ=e%kcaW%7)+8w}N#saAW~}=978a+icy0 zA#zjA$429X$k?T+!A28RENI#6-bIaQH4;nZ4TNI^+rknjKmlL?aIQE3u^3L5)*}WL zT$}bB8?2?vdvx|*vVG-{+wUD#0`IQ_C9QdqR2d5%mRq#<=GYC@6m;o$A9N!;y1zME zP}=VDo?)ZR>gcqsqT z!`Ke}MLzNNGL@COJM>Qt#_Uw#mE?v+JLaTNF7~A!31=D4AOK_l)&a-@AOYk6A~H z9^k&oh`*2!X5HplLJ= zY8=fHgvvQhw{D8?!$L(2CQzaWb$?{#8;mQgt1#A1xq4#;#Jt8#(zIn?eBprd!I$y#myC>*ks||g5R33&>z) z`Hn_3pUA&H5I^f0o{WW#Nj}E(I`OcKHW_aSuHJYqpVN~zk=fI8sqOu+PRJcWaPQPU z1yo3!VYvfuNw8C3{t|%+T1nrp%g(~!d4aP>WD2sv+^^f0%*R5-lA}OlIEq~Msv22c z!alaiah5a^e+6p_9bfsiwRRs9%wT4_Oe4_rBP;PGOu-q&h5^*Bijj;-mPgI?(id%= z`?>C!t?Alu8Vbd~)xda?6IUHt$5yYkHY>mcN>X~aVOf~+le`{UM`Toew4rRFC*uwl zI=Q0wKW*vruP-s7D{3UY3om7 ztF;zpbsI=qni6UHTIX?9TiULbXcrHN)jpLyY$IwLZ4MxjNxhK=>g-yS>ab_ia>fdZ z#}+g+@6x?2DWngo^QVQ4w?t delta 2186 zcmbW1c{tR09LMJ}ra_Y<%}DwYiJqLTqaq<}SS_hBWi4x*<7Ojc$IM_PLPI1W<%r18 zt}AD0LOCWiIXWnIFldn!vA@9|`$tdnw12#Q&+mDD-_QH|{(Y{_yRp!AkQ5n8TzkbA zNU_xFAF>Ch=_uvqfjjyvvQ^7@@`An|)33h6^LJu!h*S$<%l1EO8e4cZEM9V-W_SE4+ipE!W5VuadETBxe;f^sb8VOiJ;od09mIM45HpfhsoA0}60c0at|?WU6|U?d4Z1 zOT2<-{Pxu1#NL8SaqXzmKYwQ0qPW0n+K+GFwKOH;CI>u?tTGoZx0F~Nb?Kb!D$;f6 z+Bdq$G~c8PRE%N{ubB47KtAg%?&T(=m>J-qGnn5@uoCtf zuJcLh@jLdD3=U#SGIb*BlNSFt>c*P!W=?F{1H9f}6R~qn{7d{pzWUs5&YOXXf_a%I zDV90!uhO0OQakB7Xoe0N3IeOvLBoxLPYTN|6|W6X@%yVT(vbSmYdp!ANu^nj0V*j| zVI?PK4>Cvj0aM|n-KMHM{-s?Zca>hXlH)svVN5;5ZpI`T4uSv?sh%VwzxY#x)rjf{ zwJzHi&{VE`r2nen-+Avu*efJ#8DYJlgcVO`d zZ;-uLJ0snYgLb-$xld`u!(I-!h{>@ozo zvoij5^HUN^uBAUcI8^kB^M2ZGDxOm}9&Od5v?@KOImR%UMS_Tepg=Z(ph3hy#6cuL zHiKY5wtz^2NP$R$$bf9EHkg$i4WtO`Gx~pK?vTkHmTGCjFDjhOMxU$h5iy2S_4u7DzLPCMcc0K&AbUcEEbmXpS&M z!>;FP+A;%k2MpWdXJsQkk=h$^aGpT0=rhlHdoGOI(B_xsJpELZ!OA+a_^6k0emc7F zI)%ltS&TbQZ3sOvl->F`p{Syw2@5?J_F5}>Q!6#qq zoAZ{1*Bs>*UicCKjbs&L4KWH1J}K}&5cApcPSK2hQ$V`%=}2VStp$fA9DH2h|9cw) z>$xVFQsKqs$5St(&pamkz2(?i*iGT!Q{YuIQKgwH5?n?7^hIw|v-|}9Si*5V9DHIu z`!2nY^lSZc*-Odc$Fx7h%tb{p#%fa@H95rI-fddM!u0s%MyUpM_Zd4IymZtdV!f!e zjN|_xx7quEzxdVp!V=b$zd1W!867NbI zuatgc7YJLK0%=OhccyAXTiB)*XeZJNZd|h?Xw~c&Y0MtJ71kT--I*zwIs$usu8o)9 z=qazO7DDj}&rr@k+$Lk8T(M_ETiAjYXn${8%R?O@;vU{4O+C$E;#t>V_lL~ diff --git a/fixtures/_assets/proof-params/parameters.json b/fixtures/_assets/proof-params/parameters.json index c991c7e184..e67e640b86 100644 --- a/fixtures/_assets/proof-params/parameters.json +++ b/fixtures/_assets/proof-params/parameters.json @@ -30,23 +30,43 @@ "sector_size": 2048 }, "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-0-3b7f44a9362e3985369454947bc94022e118211e49fd672d52bec1cbfd599d18.params": { - "cid": "QmeNqDvsvyam4vqwCkstbxgb9S7RZEUeBDrJvBWKcpFKr6", - "digest": "532b53883ed4f794cb9d0db583d0df59", + "cid": "QmNPc75iEfcahCwNKdqnWLtxnjspUGGR4iscjiz3wP3RtS", + "digest": "1b3cfd761a961543f9eb273e435a06a2", "sector_size": 34359738368 }, "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-0-3b7f44a9362e3985369454947bc94022e118211e49fd672d52bec1cbfd599d18.vk": { - "cid": "QmdLWr6moLUPScJZwoBckWqAeJkrBPAJPNLz8mWAfTdmXH", - "digest": "46990eb1bf5159c394a10309f269c1b6", + "cid": "QmdFFUe1gcz9MMHc6YW8aoV48w4ckvcERjt7PkydQAMfCN", + "digest": "3a6941983754737fde880d29c7094905", "sector_size": 34359738368 }, "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-2-102e1444a7e9a97ebf1e3d6855dcc77e66c011ea66f936d9b2c508f87f2f83a7.params": { - "cid": "QmdQsi9uFhxK9cGwuK4rHuwKQoHkz6upYTCz4UdLiy1vA2", - "digest": "4223c63dbd94de1538006a14f37179e3", + "cid": "QmUB6xTVjzBQGuDNeyJMrrJ1byk58vhPm8eY2Lv9pgwanp", + "digest": "1a392e7b759fb18e036c7559b5ece816", "sector_size": 68719476736 }, "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-2-102e1444a7e9a97ebf1e3d6855dcc77e66c011ea66f936d9b2c508f87f2f83a7.vk": { - "cid": "QmPirFX9wX99iMGA6zFY2CvcrdcDkj73X4MP6DLduvpbk9", - "digest": "ce39b614d788d3aef26bac1b28521d94", + "cid": "Qmd794Jty7k26XJ8Eg4NDEks65Qk8G4GVfGkwqvymv8HAg", + "digest": "80e366df2f1011953c2d01c7b7c9ee8e", + "sector_size": 68719476736 + }, + "v28-empty-sector-update-poseidon-merkletree-poseidon_hasher-8-8-0-3b7f44a9362e3985369454947bc94022e118211e49fd672d52bec1cbfd599d18.params": { + "cid": "QmfK4tonETepL6F4kDFdJ3fr72fzRWoRPf3XGMhV3RLX1S", + "digest": "b69983b5d7a97a20f43b3d5ff2a4ed04", + "sector_size": 34359738368 + }, + "v28-empty-sector-update-poseidon-merkletree-poseidon_hasher-8-8-0-3b7f44a9362e3985369454947bc94022e118211e49fd672d52bec1cbfd599d18.vk": { + "cid": "QmYCTYJQPu8wgtB2rMZ7HJC9nDx8c1fzYRPdCUiErK4q5a", + "digest": "1ac05784f304129f74c5184190c1ec78", + "sector_size": 34359738368 + }, + "v28-empty-sector-update-poseidon-merkletree-poseidon_hasher-8-8-2-102e1444a7e9a97ebf1e3d6855dcc77e66c011ea66f936d9b2c508f87f2f83a7.params": { + "cid": "QmNaaQXfm2NveN2Hf7bJ3udnQB2Qa4moMcUoJYJS6oWL6w", + "digest": "a6d4f96e2b641a6d7a1a8e6dc1155c8a", + "sector_size": 68719476736 + }, + "v28-empty-sector-update-poseidon-merkletree-poseidon_hasher-8-8-2-102e1444a7e9a97ebf1e3d6855dcc77e66c011ea66f936d9b2c508f87f2f83a7.vk": { + "cid": "QmXyeg9hbM7x9dGuUuAS68ozhiFEez4UkPTgwSDCVYKHBw", + "digest": "8e8fb9e2c56eb5d740d0de135305a7b8", "sector_size": 68719476736 }, "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0170db1f394b35d995252228ee359194b13199d259380541dc529fb0099096b0.params": { diff --git a/fixtures/asset/asset.go b/fixtures/asset/asset.go index 676c6b6a75..29768e4447 100644 --- a/fixtures/asset/asset.go +++ b/fixtures/asset/asset.go @@ -1,4 +1,4 @@ -// Code generated for package asset by go-bindata DO NOT EDIT. (@generated) +// Code generated by go-bindata. // sources: // fixtures/_assets/car/butterflynet.car // fixtures/_assets/car/calibnet.car @@ -9,6 +9,8 @@ // fixtures/_assets/proof-params/parameters.json // fixtures/_assets/proof-params/srs-inner-product.json // fixtures/_assets/arch-diagram.monopic +// DO NOT EDIT! + package asset import ( @@ -55,37 +57,26 @@ type bindataFileInfo struct { modTime time.Time } -// Name return file name func (fi bindataFileInfo) Name() string { return fi.name } - -// Size return file size func (fi bindataFileInfo) Size() int64 { return fi.size } - -// Mode return file mode func (fi bindataFileInfo) Mode() os.FileMode { return fi.mode } - -// Mode return file modify time func (fi bindataFileInfo) ModTime() time.Time { return fi.modTime } - -// IsDir return file whether a directory func (fi bindataFileInfo) IsDir() bool { - return fi.mode&os.ModeDir != 0 + return false } - -// Sys return file is sys mode func (fi bindataFileInfo) Sys() interface{} { return nil } -var _fixtures_assetsCarButterflynetCar = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\xfd\x79\x38\x55\x7d\xdf\xc0\xfd\xef\x6d\x2f\x43\xc8\x3c\x7d\x85\x94\x8c\x25\x99\x32\x0f\x99\x67\x12\x32\xcf\xf3\x3c\x56\x86\x62\xa1\x28\x99\x89\x8c\x19\xca\x10\x29\xb3\x94\xc8\x2c\xb3\x84\x92\x59\x92\xa4\xc8\x1c\x7e\xc7\xbe\xae\xe7\xfe\xdd\xed\x7d\x3f\xeb\x38\xcf\xe7\x3a\x8e\xeb\x8f\x1c\xeb\x7c\xd9\x6b\xed\x35\x7c\xd6\x5e\xbb\x77\xd2\xf9\x0e\xbe\x5e\x5e\xfe\x7e\xf0\x38\x9f\x31\x37\x0a\xed\xf3\x68\x81\x80\xfd\x4e\xf7\xf3\x03\x54\x31\xcd\xd1\x2d\x06\xa9\x1f\x11\x24\x67\x9a\x3f\x56\x88\xbd\x08\x51\x6b\xb9\x1b\xb2\x25\x76\x31\xd9\xa3\xb1\xc7\xe9\x9a\x83\xaf\x9f\x8b\x97\x27\xfa\x05\xc1\xbf\xfb\x0f\x12\x14\x50\x28\xd8\x98\x9d\xf1\xad\x55\x2c\xb5\xa3\x53\x9c\xe9\x40\xd4\x1f\x18\x7a\x6a\xd1\x6c\xcc\x90\xf2\x52\x7f\xcc\x84\xf4\x33\xaf\x55\xa4\x62\x71\x63\x38\x4a\x1e\x0e\x47\x19\xb3\xa3\xfe\xe1\x7f\x61\xd8\x17\xcb\x89\x42\xfb\xd0\xb0\x53\xdd\x0c\x67\xe1\x9c\x24\x16\x65\x27\x50\x9f\x4e\x29\x6e\x7a\x95\x15\xa7\x96\xa6\xb4\xe3\xaa\x55\x9c\x98\x03\xff\xca\xee\xf3\x95\x47\xfd\xb5\x5e\xc6\x1b\x3d\x93\x67\x0d\x3b\xfb\xbf\x35\x34\xa8\x8e\xf9\x85\xa6\xd1\xb4\x90\xdc\xcd\x0a\xd2\x7a\x5d\x7e\xbc\x8e\xa6\xdb\x8f\x68\xf0\xaf\x45\x17\x1d\x62\x64\x98\xfa\x88\x66\x3f\x25\xd0\x57\x3f\xff\x6e\xd8\xc2\x91\xaf\x6d\x36\xfb\xed\xcc\xb8\x84\x78\x7b\xbd\x44\xb0\xae\xc0\x5f\x8b\xa6\x5f\x08\x7d\xf6\xf4\x33\xfb\x7d\xda\x53\x4d\x5a\x6c\x5d\xba\x8d\xa9\xe7\xc6\x15\xb4\xce\x7c\x3a\x6e\xfa\xa0\x0b\x23\x50\xd9\x4f\xb5\xc5\x6c\x33\x36\x67\xbe\x85\x52\x46\x11\x6e\xce\xa2\x3a\x08\xfe\xcd\xcb\x7e\xec\xac\x64\xe3\xef\xe0\xef\xe2\xe1\xe0\x27\x74\x41\x50\x8c\xff\x82\x28\xff\x05\x51\xf6\x0b\x82\x92\x42\x62\x92\xa2\x82\x4e\x3a\x0e\xfe\xd7\xbd\x7c\xdd\x9c\x55\x5c\xdc\x1d\xec\xbc\x5c\x3c\x1d\x0c\xbc\xdc\x1c\x3c\xff\xff\x7f\x74\xff\xcf\x1f\x2f\x79\x78\x05\x78\xfa\xfb\x15\xb8\x19\x78\xf9\xdb\xb8\x5f\x09\xf0\xf6\x76\x0f\xf4\x10\x3a\x77\xe1\xc2\x85\xff\xf9\xbf\xa3\xb6\x8b\xa7\x83\xaf\x9f\x87\xe0\x39\x91\xff\xfd\xa1\xbb\x9e\xaf\x97\xbf\x97\x9d\x97\xbb\x96\x8d\xad\x5f\x81\x9b\x92\xc3\x35\x07\x77\x2f\x6f\x0f\x07\x4f\x7f\x37\xe1\xff\x5d\xca\x4d\x25\xc0\xd3\xde\xd7\xc6\xc5\xcf\xc5\xd3\xc9\x4d\xe8\x7f\x7f\xee\xaa\xe2\x15\xe0\x69\x6f\xe3\xef\xe2\xe5\xe9\x26\xf8\xbf\x3f\x76\xd2\x76\xf0\xf3\xb3\x71\x72\xb8\xa1\x66\xe0\xec\xe2\xc7\xee\xe2\xc7\xee\xef\xec\xc0\xae\xea\xe0\xe9\xe0\xe7\xe2\xc7\xae\xe0\xee\x65\xe7\xc6\xee\xe5\xf8\x9f\x1f\xfe\xcf\x4a\xb0\x2b\x39\xd8\x39\x78\xfa\xfb\xda\xb8\xbb\x04\x39\xd8\xb3\x5f\xf1\xf7\xf2\xb5\x71\x72\x60\xff\x7f\x56\xfd\xfc\xad\x7f\xf7\x96\x46\x40\x7f\xbd\x53\xdf\x31\xdb\xcd\xe1\x94\xee\x13\xa0\xf2\x06\xf5\x27\x37\xcf\x18\x07\xf7\x8c\x64\xdb\x6c\x36\x39\x49\xfa\xdf\x57\xe6\x08\x09\x69\xff\x5a\x54\xf9\xf9\xc0\x5b\xf6\xfe\xef\x66\x21\x2c\xb6\x6d\xef\x81\x8c\xf8\xc2\x4a\x61\x5c\x34\xbd\x6f\xd6\x92\x55\x16\xe9\xf3\x85\x96\xe6\x17\x94\xff\x8e\x0c\x57\xda\xd2\x26\xe3\x4e\x84\xc3\x15\x51\xdf\x88\x23\xc7\xf9\xae\xa2\xd0\x86\x28\x1a\x47\x17\x77\x81\x8b\x02\x7e\xff\x5d\x25\x0f\xec\x9b\xf0\xd7\xaf\x8e\x22\x2e\x63\x18\x2c\xa5\x53\xfb\xd5\x1e\xe7\x5c\x32\x71\x5a\xa8\x3f\x97\xe6\x6d\x97\x7b\x93\xa6\xfd\xdc\xde\xac\xd3\xb6\x76\x01\x4a\x03\x45\x46\x51\xf8\x43\x24\xe7\x12\x7d\x73\x78\xb8\x02\xca\x25\x72\x9c\x4f\x1f\xcb\x1e\xff\x2f\x6b\x63\x67\x87\x7d\xe3\xff\x12\x9d\x31\x8f\xc2\x7e\x8c\x59\x90\xce\x38\x25\x7d\x52\x0c\x56\x59\xcc\x88\x7e\xff\x2c\x2e\x3d\xb8\x45\xcb\x98\x24\x9f\x77\xa4\x4f\x13\xa5\x89\x1a\xa9\x3b\xce\x3b\xd5\x40\xd0\xf4\x4d\x3e\x5c\x11\xb5\xfa\x2f\x5f\xe9\xa8\x53\x30\xfd\x7b\x8e\x0e\xc9\x08\xdb\xed\x38\x21\x29\x89\x11\x5e\x7a\x97\x5b\x82\xcd\x73\xd7\xd5\xbc\x5a\x95\x16\xe7\x8d\xda\xfe\x7e\xa5\x70\xb8\x02\xca\xf4\x1f\x5f\xe9\x7a\xf2\x33\x87\x90\x57\xf2\x3e\x59\x2d\x9f\xc6\xbc\xdd\xf8\xda\xeb\xb5\xd0\xd6\x86\x74\xee\xce\xef\x75\x73\xf3\xc9\x58\x72\x48\x50\xda\x28\x82\xf9\xd0\xcf\x2c\x02\x8f\xc7\x65\x51\x28\x14\x16\x75\xf8\x47\xb4\x52\xff\x69\xb1\xa0\xe6\xa9\x87\x2e\x3d\x29\x24\x9b\xe2\x2c\x54\x01\x6c\xc9\x8e\x77\xee\xac\xc7\xe7\x06\x3e\x99\xf6\x46\xbd\xcd\xc5\x59\x7d\x2c\x49\x14\x39\xce\x67\x7c\x02\x6b\x32\xfc\xd7\xbc\xe6\xe0\xeb\xe2\xe8\xe2\x60\xef\xeb\xe0\xe4\xe2\xe7\xef\x1b\xf8\x17\xee\x53\x91\x42\x36\xa3\x95\x47\x67\xd8\xce\xe0\xd3\xed\xe1\xb4\xbd\xc9\x6d\xe3\xdb\xa6\xc3\xec\xf8\x65\x34\x31\x59\x83\x66\x83\x06\x25\x8f\x7d\x8f\xa0\xff\xf7\x0d\xea\xed\x75\x1d\x67\x83\x42\x37\x68\xae\x84\x9a\x97\xe4\x35\xde\x91\x2d\xbe\xa4\xfb\xb3\xa0\x1c\xdd\x25\x6e\x72\xff\xb8\xf8\x2e\x63\x88\xf6\xf2\x9f\xa1\x21\x94\x7c\xb8\x02\xca\xf5\x1f\x57\x58\xb3\xf9\x5b\x38\x33\xa3\xc5\xd2\xe6\x09\xb4\x99\x66\x59\xf5\x1d\x02\xdf\xc5\x6d\x9f\x17\xf4\xbf\x7d\xc2\xc7\x36\x75\x69\x68\xc7\x51\xf2\x11\xe1\x0a\x28\x4c\xe4\x38\x9f\x2e\xd6\x21\xfd\xaf\x63\xe7\xeb\xe5\xf9\x17\xe2\x30\xf4\x71\xcc\x3e\xa9\x77\x74\x90\x0a\xdc\x7c\xeb\x36\xba\x4f\xdc\x3c\x70\xbb\x77\xb2\x62\x9d\x2a\xb2\xf9\x7d\xf0\x01\xa3\xc9\x7f\x5e\x8b\xdd\x3f\xbe\x96\x69\x65\xff\x8e\xaa\xbc\x06\xd7\xae\x57\xcf\x53\xaa\xd3\x42\x92\x79\x63\x6f\xb8\x0f\xae\xed\x55\x0e\x2f\x15\x8e\x9d\xb8\x9e\x4e\xfa\x1f\xc6\xe9\x1f\x19\x55\x23\x16\x0b\x87\x77\xcb\xc2\x60\x58\x46\xf7\xfd\x4f\xf6\xa1\x23\xc2\xaf\xf2\x4f\x8d\x13\x1f\x65\x38\x44\x7c\x2b\xd7\x7c\x2f\x89\xf7\x1e\x2a\xa2\xbe\xfe\xcb\x7d\xf8\x5e\x79\xea\xd7\xef\x6f\x7c\xd3\x16\x5e\x1e\x05\x94\xcf\x36\xa5\x7a\x93\xdd\x83\xda\x47\x33\x77\x93\x8d\x1b\x21\x73\xca\x9b\xed\xf8\xfb\x30\x2a\x72\x9c\xef\x32\x96\x25\xff\x7f\xd8\x40\x3f\x7f\x07\x8f\xff\x0f\x67\x8e\xff\xee\x10\x84\xd8\x5d\x8c\x09\xeb\xd0\xe2\xbe\x3c\x1b\x5f\x37\x87\xbf\x57\x3c\x66\x6a\x97\xbe\xc1\x60\xba\x52\xd3\x7e\x5e\x57\x99\x87\xab\xf8\xa1\x4a\x0e\xaf\x18\x6b\x76\x67\xab\x84\x71\x94\x4f\x78\x76\xd8\x7f\xb6\x9f\x5e\xe4\x38\xdf\x15\x2c\x46\xf1\x5f\xcc\x23\xc0\xdd\xdf\xc5\xcf\xc5\xe9\x2f\x47\xd8\x95\x4d\x39\xb5\x5e\xc1\x6a\x0d\x7e\xce\x31\xff\x70\x89\xe9\xc4\xd0\x82\x4a\xa8\x86\x82\xe5\xba\x42\x4d\x23\xd5\x87\x8c\xa3\xff\xbe\x2c\x34\xde\x3e\xe1\xe2\xe9\xf2\xf7\x8b\x19\x4b\x64\xb7\x61\x5b\x23\x4a\xe4\xbb\xa9\xfd\x60\xea\x70\xff\xeb\xe3\xd1\xef\xdd\x89\xc5\xf7\x87\x1e\x27\xdd\xe9\x26\x79\x5a\x73\x19\x85\x3d\x7b\xac\xfc\xcb\x2d\x5f\x43\x4c\xf4\xf8\xc7\x87\x6f\xb6\xde\x75\x1f\xe3\x3c\x73\x79\x38\x5a\x5b\x8d\x38\x08\x82\x2d\x7b\x30\xf3\x5d\x0f\x5f\x66\x47\x29\xe0\x6e\x79\x45\xd4\xf7\x7f\xe9\xda\x37\x1f\xdf\x3f\xfc\xe9\xfa\xc6\xc8\x43\x52\x4c\x39\xce\xd3\xd4\x6a\xb0\xdc\xed\x5d\x6e\x49\xbb\xce\xc7\xb9\x91\xec\xa3\x09\x42\xfc\x77\xd4\xfe\x1f\x77\xbe\xa3\x14\xf5\xf9\x85\x96\x37\xf1\x60\xe5\xa3\x93\x8c\x5a\xfa\x8e\x2a\x55\xa9\x9a\xb2\xd5\xbb\x95\xfe\x22\xe1\x2b\xfd\xfc\x8b\x3b\xff\xe7\x04\xe2\xfc\x8f\xe4\xf3\x45\x4a\xb9\x43\x85\x89\x48\xd4\x9e\xd0\x1f\xd6\x62\x1f\x79\xca\x89\x32\xde\x8f\xe7\xc3\xfa\x8a\xe0\xca\x8d\x9e\x9c\x88\xaf\xff\x87\xbc\xfc\x8f\xa4\x39\xa5\x9d\x3c\xd3\x71\xfd\xf3\x36\xbf\x63\x53\xa3\x59\x45\xdc\xc5\xa5\x28\x4b\xd3\x85\x82\x1b\x63\x77\x6e\x29\xdb\xbe\x58\x73\x41\xfd\xc7\x71\xfc\xe7\x23\x56\xa4\x3e\xf0\xe4\x06\xf9\x41\x74\xc7\x77\xbe\x0d\xae\xe1\x99\x8f\xcf\x1f\xff\xa6\xeb\x4b\x50\xcd\xf9\x99\x19\x61\x71\x16\x7e\x87\x7b\xb5\x08\x57\x40\x11\xe0\x1d\x12\xbe\x0e\xd7\x6d\x7c\xed\xff\x12\xcf\x3c\xaf\x54\xb1\x49\x37\x08\x5c\x1d\x79\x6c\x4c\x52\x1d\xce\x4c\x7a\x85\x76\x7b\x3d\xbc\xfa\x76\xa1\xce\xa6\x9f\x18\xdb\xbd\x65\x94\x36\x0a\x13\xfb\x85\x32\x24\x3d\x96\xb2\x17\x85\x42\x85\x2b\xa2\x96\xff\xe5\x7b\x9d\xb5\xfa\x84\xfb\x44\xd2\x8d\xae\x06\x4e\xe6\xdc\x4b\x3c\x9f\x69\x3c\x57\xbf\x48\xf8\x36\x05\x19\x48\x5f\xdc\xe8\x9c\x07\x64\x64\x7f\xbf\xd7\x3c\xff\xef\xda\xff\xfd\xc9\x1c\xc1\xbf\xbb\x10\xc7\xff\xf5\x42\x5e\x9c\x73\xb1\xbf\x45\x63\x6c\xf7\xae\x59\xa6\xc1\x32\xad\x7c\xe6\x8a\xde\x0f\x9f\x23\x3b\xfd\xfe\xef\x35\x62\xd7\x28\x89\x9e\x7b\xc9\xcb\xff\xb5\x30\x03\x53\x90\x55\x48\xe7\xa5\x9d\xd1\x1b\x35\xf7\xb6\xe3\x6e\x66\x5f\xbc\x7b\x36\xdc\xb3\x37\x4a\xef\xbd\x69\xe6\xd8\xc1\xa4\xbb\xa0\xbc\x22\x0a\x3d\xf3\xd7\xf2\x4c\x87\xae\xbd\x36\x05\x05\x6e\xe4\x62\xd2\x1a\x92\x71\x4f\x34\xe1\xb3\xeb\x3d\x99\xfa\x61\x7a\x09\x59\x37\xde\x93\x18\xde\x23\xff\x6b\x51\x13\x07\x8f\xb5\xa8\x16\x81\xaf\x13\x21\xa3\xeb\xda\xda\x06\xf4\xd3\x91\xed\xa3\xfa\x96\x84\xee\x2a\x12\xdf\x24\xc9\x4b\xcc\xf5\xfe\x3e\x51\xa5\xe8\x8d\xff\xce\x51\xde\xa9\x95\x59\x8b\x19\xcb\x93\xe9\x60\x8e\x52\x27\x1e\xff\xf4\x94\x75\xd2\xac\xd8\x30\x29\xfd\x88\xeb\xaf\x45\xf7\x7a\x17\x9e\xb2\x3a\xe9\x28\xf2\xce\xa1\x88\x37\x53\x18\x49\xee\x47\xbe\x7c\xdd\x1b\xd8\x3b\x20\x7e\xe8\x31\xcc\x5a\x21\xf2\x49\x82\x70\x8d\x09\xfc\xbd\x2b\xea\xb8\x8b\xe5\x60\xd2\xf5\x92\x75\x87\x39\x55\xf6\xa4\xcd\xcd\x5f\xd6\x26\xa3\xff\xd0\x4d\x6e\x7f\x4d\x15\xc9\x28\xc9\x7f\x23\xbf\x69\xf3\xef\x36\x5b\x8c\x02\xca\x51\x01\xe5\x18\xb6\x65\xcc\x85\x3a\x43\x82\xa6\x61\xaf\x38\x6b\xd8\xd2\x1b\xc6\x96\x7f\xdf\xe9\x59\x6a\x78\x84\x43\xdb\xe2\xd2\x49\x76\x74\xd7\x97\x2b\xbe\xfd\x9d\x45\xfa\xee\xf6\xb1\x61\xc4\xcc\xd8\xdb\x07\x02\xf6\x2d\x9e\x7f\xb7\xad\xe1\x30\xde\x7f\xb7\x91\xc3\xe5\xc3\x6c\xfe\xdd\x36\x8e\x24\x22\x40\x47\xa8\xa1\x50\xff\xbd\x8f\xf9\xfb\xc6\x8a\xa3\x3c\x4f\xea\x99\x5c\x65\xd9\x58\x35\x4d\x90\x9b\x62\xf8\xb2\x35\x26\x5d\xd2\x6f\xb4\x93\xd1\x27\x70\x99\xd0\x7c\x4e\x80\x32\xcc\xe2\xdf\x2d\x87\xd5\xc3\xfe\x8f\x7e\xfe\xf3\x73\xd4\xa4\x4b\xb5\x8b\xd3\x8b\x9f\xae\x9b\x47\x06\xcb\x67\x0b\x31\x4f\x74\xdd\x33\x6a\x2e\xd8\x0b\x35\x2a\xed\x36\xfc\x0a\x13\xfd\x77\xcb\x61\x75\x14\x0a\xfd\x9f\x1b\x2d\x05\x28\x84\xf7\xdf\xed\x2e\x0a\x50\x48\x03\xe1\xbf\xdb\x5d\x22\x09\xd1\x00\x3d\x13\xa1\x74\x14\x8a\x42\xfd\x7d\x10\xd9\x58\x6c\x58\xd6\x9c\x14\x59\xb2\x1d\xcf\x96\x3b\xcd\xc4\x1c\x4b\xdc\x32\x48\x66\x77\x8a\x5d\xbb\x40\x7f\x85\xb1\xca\xe7\xe4\xfc\xdf\x33\xdd\xa7\x54\x54\x7b\xb7\x24\xb5\x8d\xe7\xd8\xb3\x3a\x13\x1a\xc6\x40\x9b\xc0\x37\x5f\x0a\x65\x33\x87\x2e\xee\x79\x5e\x5d\xb4\xb7\xfc\x6b\xd1\x71\xde\xf3\x5e\x1f\xa4\x2e\x79\x11\x51\x2b\x6c\xe8\x9c\x2d\xa1\xd7\xca\x48\x08\xc9\x59\x0e\x5c\xdc\x2e\xb2\xd5\xbf\xbb\x65\x6f\xf7\xd7\xa2\xdc\xce\xf2\xe9\xa7\x59\xcc\x2f\x34\xca\x5d\xfe\xa3\xb4\x75\xa2\xeb\x91\x2b\x01\xe6\xc9\xc9\x90\x5b\x56\xcb\xcf\xcf\x15\x89\x33\xbb\xfd\xb5\x68\x9d\xf4\xb1\x82\xe2\x61\x72\xb5\x48\xf2\x4b\xc4\xe1\xc1\xbb\xb4\x64\x27\xcf\x4e\x94\xd5\x0d\xda\x92\x27\x86\x76\x2c\xd4\x74\xc8\xfd\xb5\xa8\x4c\xcc\xc1\x81\xf9\x45\xe3\xf2\xcd\x06\xf3\x16\xc2\xca\x46\xf9\xdd\x77\x2c\xdb\xc3\xa4\x91\xbd\xc3\xe9\x71\x09\xd5\xb7\x26\xfe\x3e\x26\x21\x4a\x32\x7d\xa5\xfb\x57\x79\x66\xbc\x63\x26\x6d\x7f\xfd\xb9\x29\x16\x22\x54\x7f\xc1\x87\xf6\xc0\xab\x49\x71\x65\x95\xee\xe6\xb9\xbf\x6f\x13\x14\x32\xc2\x56\xee\x4b\x02\xfe\x31\x8b\x8f\x9d\x0d\x67\xbc\xdf\x73\x75\x72\x11\x4a\xb7\x05\x17\x3f\x08\x38\x7d\xe7\xfd\x07\xf1\xbf\x16\x75\xd4\x18\x63\x6f\x6b\xbe\x57\x14\xea\x28\xc2\x98\x62\x75\xae\x0f\xd3\x0a\xab\x2e\xbc\xd3\x62\x0b\x1c\x64\x2d\x60\x7c\xa7\xea\xf0\xf7\x3e\x94\xf8\xb6\x5b\xdb\x96\x4f\x59\x96\xb8\x75\xa5\xa8\x7d\xf0\xd8\x73\x67\x39\x22\x91\x69\x11\xf9\xe9\x1a\x37\xe3\x46\xf5\xaa\xd3\x7f\x2d\x5a\xe0\xd9\xee\x72\xba\xe1\x1e\x4a\xea\x44\xf8\x70\x97\x8c\x4f\xec\x04\xb7\xd0\xd5\xf8\x55\x93\x0b\xf7\x7f\xdf\xbb\xe2\x2a\x9e\xf3\xf7\x6b\x6d\x4e\x3b\xb8\xda\xba\xa6\x7a\x92\xe7\x8c\x76\xc2\xfa\x8f\x59\xe6\x1a\x34\x7f\xc8\x22\x27\x99\x8c\x76\x65\xf5\xcc\x51\x9d\x43\xf6\xdf\x57\x1f\x25\xc6\xf7\xaa\xbc\x55\x5f\x3f\xdd\x1a\xbc\xf3\x4e\x36\xc3\xd1\x6f\xcf\x7a\x6f\xe9\x43\xde\x2c\x67\x7b\xc2\x87\x3e\x56\x46\x86\xbf\x16\x25\x13\xe5\x60\xb9\xf9\x9a\xda\x9e\xe2\x4d\x8f\x53\xd3\xc6\xf7\xaa\xa4\x91\x96\xce\xca\x0a\x36\xd1\xc0\xb6\x69\xdf\x14\x36\xfa\xa1\xbf\x55\x40\x7e\x83\xab\xfd\x50\xcb\xf1\x56\x9d\x81\xaf\xf1\xd1\xd9\xc1\xf0\x0a\x53\xe8\xb0\xae\x8e\x30\xf3\xca\x7b\x19\x81\x0b\x8a\x61\x69\xb4\xff\x6e\x17\x8c\x50\x3a\x3a\x3a\x3a\x0a\x4b\x67\x8f\x45\x11\x8f\xf3\x19\xf3\xa2\xd0\xe1\x73\x18\xf8\x2b\x01\xbb\xd9\xa4\xfb\xec\x6f\xf2\x34\x3e\x01\xce\x3a\x47\x1b\xb6\x6a\x07\xc6\xae\x08\x02\x3a\xd5\xf1\x0b\xd1\x4c\x4f\x9b\x5d\x74\x2e\x79\xc2\x00\xd3\x8c\x62\x46\x31\x96\x0c\xc8\xab\xa1\x08\x36\x25\x66\x50\x28\x94\x02\x0a\x2d\x2f\x8f\x92\x8f\x45\xe3\x52\xc7\x95\xd6\x2c\x7f\x8f\x36\xe5\x45\xcb\x07\x9a\x55\x52\xeb\xfa\x73\xd7\x6c\x67\x52\x10\x35\xba\xf5\xb7\x29\x15\x32\x05\xaa\x68\xc1\x00\xd3\x82\x44\x11\xe0\x52\x57\x53\x9c\xa3\xd7\x49\xe3\x76\x8e\x3d\x21\x51\x5e\xb4\x8b\x4c\x78\x74\xff\x30\xbb\x4b\x2e\x42\x8e\x81\x20\x70\xc4\xea\xca\x17\x4e\x18\x60\xde\x22\x51\x18\x5c\xea\x2e\x99\x6f\x88\x72\xf1\xbc\x4d\x09\xc3\x19\x1e\x83\x7c\x7e\xb7\xc0\x7b\x05\x49\xeb\xdd\xd1\x14\x17\xd6\xd9\x9d\x7d\x86\x73\x35\x61\x80\x69\x45\xa2\x20\x5c\x8a\x94\x66\xdd\xed\xd0\x96\xe3\xb8\xc3\x99\xe5\x87\x32\x65\xe5\xb4\x04\xba\x44\xc5\xa6\xf1\x67\x0d\xfa\xd6\x49\xb8\xb8\x31\x77\x2d\x61\x80\x69\x43\xa2\x08\xf1\xb6\xd5\xe9\x6d\x49\xa3\x60\xdf\xd8\x91\xa3\xbe\x9b\xb9\xf9\x85\x47\xd1\x56\x07\x9f\x2b\xc2\xa2\x26\x07\x13\x34\x38\xf6\xdf\xb8\x3a\xc2\x00\xd3\x8e\x44\x11\xe1\x52\x0a\x9f\x7e\x97\x15\x69\x2d\x58\x5a\x6e\x1d\x73\x19\x8b\x6e\x26\x4a\xf3\xf7\x93\xf3\x8c\x6f\xb9\xdd\xf4\x73\xe2\xc6\x27\xc9\x66\x6f\x18\x60\x3a\x90\x28\x62\x5c\x8a\x0d\xe3\xa5\xf7\x35\x5c\xf7\x09\x37\x73\xf7\xe5\xba\x2b\xb6\xbf\xf4\x6e\xe6\xc6\x4d\x3a\x8a\x93\x54\x25\x6b\xc7\xc4\x2c\x6b\x33\xc2\x00\xd3\x89\x44\x91\xe0\x52\xa3\x67\x9d\xfb\x5d\x0d\xee\xee\xf3\xc5\x45\xed\x54\x72\x27\xca\x50\x5b\x3d\x62\xea\x59\xec\xbd\x57\x36\x17\x3f\x29\xb2\x69\x41\x0f\x03\x4c\x17\x12\x75\x0c\x97\x3a\x21\x1e\xac\xf9\x6d\xf8\xd4\x49\xbd\x1b\x14\x3f\xf5\x6a\x2d\xee\x7d\x99\x54\xb2\x5a\x28\xf2\xff\x71\x95\xbd\xa0\x35\x97\x7b\x83\x07\x06\x98\x6e\x24\x8a\x14\x97\xba\xe1\xc3\xa6\x1d\x24\x37\x5b\xf2\x26\xc7\xe1\xc1\x8c\x07\xb9\x4b\xfa\x73\x55\x2b\xa9\xac\x43\xe2\xee\x87\xa6\xe7\x52\x02\xde\xd1\xc1\x00\xd3\x83\x44\x91\xe1\x52\xef\x0d\xbf\x08\x3c\xd9\x96\x99\x38\xd5\xf4\x70\xb1\xc8\xab\xe1\x5c\x1e\x2d\x4b\x91\xbd\xf5\x2c\x69\x1e\x1b\xdf\xc3\xd0\x4d\x8c\x0a\x0c\x30\xef\x90\x28\x72\x5c\xaa\xf9\xf5\xa3\x37\x8b\x73\x11\x3f\xfb\x42\x2f\x99\xb3\xdd\x0f\xb9\x37\xef\x31\x7c\x47\x53\xa0\x9d\xb4\x4f\x8d\x32\xe7\x7e\xdb\x21\x0d\x0c\x30\xbd\x48\xd4\x71\x5c\x6a\xf2\x95\x53\xc7\x37\x6b\x3a\x15\x83\xef\x84\x79\x5d\x37\x9a\x30\xdc\x6a\x79\x25\x7c\x8c\xfb\x74\xd0\x17\x37\xbd\xe6\x47\x41\xe7\x61\x80\xe9\x43\xa2\x28\x70\xa9\x97\x15\xab\xf2\xbc\x35\x61\x5e\xb2\x5d\x28\x72\x59\x22\x66\xe6\xcf\x17\x77\x30\x23\xd1\xb6\x67\xbc\x97\x98\xab\xd7\xef\x9b\xc8\xc3\x00\xd3\x8f\x44\x51\xe2\x52\x2c\x7b\x7d\xeb\xe1\x92\x04\x52\x6f\x5f\xa9\x4a\xe7\x3d\xca\xaa\xcc\x0e\xfc\xd0\xcb\xb1\xa7\x53\x77\xf4\x60\x6b\xea\xf3\x91\xa3\x2a\x0c\x30\x03\x48\x14\x15\x2e\xf5\x53\x91\xaa\xc6\xab\xe5\x63\x49\x4b\x63\x4c\xd0\x01\xc9\xcf\x80\x9d\xd8\x43\x25\x89\x33\x72\xcb\xc1\x32\x3e\x14\x0c\x92\x4b\x76\x30\xc0\x0c\x22\x51\xd4\xb8\x94\x67\x88\x67\xdd\x83\xd7\xe1\xb3\x42\x8f\x35\x93\xbf\x06\xb9\x12\x76\x1e\xd8\xa7\xae\xbc\xce\x76\xba\xf6\xf3\xbe\xac\xd8\xa9\x14\x26\x18\x60\x86\x90\x28\x1a\x5c\xca\x45\xf6\xb3\x0b\x41\x6a\xa0\xd2\xc6\x97\x57\x33\xf2\xf5\x65\x3d\x75\xcd\x6d\xd9\xd7\x6f\xf2\xa2\xb2\x17\xbc\x65\x06\xd4\x3e\x9d\x86\x01\x66\x18\x89\xa2\xc5\xa5\x22\xf4\x66\xeb\x47\xfa\xd8\x28\x56\xdc\xf2\x54\xe8\xba\xee\x5c\x61\x90\x4e\xac\x7a\xcb\x20\xd7\xaa\x55\xf3\xac\x9e\xec\x94\x2e\x76\xb3\x8f\x20\x51\x74\xb8\x54\xbb\x72\x6a\xc9\xf9\x1a\xfb\xf3\xea\x71\x0b\xad\x25\xc2\xb6\xaf\xfc\x3f\x93\xdd\x95\x3f\x75\xfe\xb7\x99\x23\xa5\x02\xc5\x9d\x5d\xec\x49\xe6\x3d\x12\x45\x8f\x77\xea\x3b\x10\xde\xf5\x30\xff\x13\xc4\x5e\x22\x9d\xbb\xc7\x55\x3b\x12\xc5\xc6\x1f\x6e\xd5\xb7\x1f\x70\x4b\xe0\x46\x8d\xab\x85\x91\x0d\x0c\x30\xa3\x48\x14\x03\xde\x15\x67\xd3\x32\x45\xfa\xd5\x0a\xfa\xd6\xef\x4d\xdf\xd5\xa1\xc0\x5c\x57\xfe\xaf\xf2\xc9\x77\x69\xac\x6c\xbc\x98\xe5\x85\x38\xbf\x98\xc1\x00\xf3\x01\x89\x62\xc4\xa5\x74\xf3\x5a\x6f\x2e\x56\xf1\xae\x29\x1c\x92\x66\x4d\xa7\xbf\x54\x2b\x9c\xf5\x86\x82\x43\xbe\xc4\x29\x3c\x18\xdf\x39\x77\x63\x07\xfb\x0e\x8e\x21\x51\x4c\x4c\xb8\xd6\x99\xc6\xe2\x9d\x77\x03\x86\x67\x3b\xea\x78\xa8\xdf\x26\xef\x4d\x8e\x0f\x64\x16\xca\x68\x6c\xf4\x4c\xee\x4e\xc4\xb5\xea\x56\x60\xd7\x70\x1c\xd1\x02\xb8\x56\x06\xa5\xde\x2a\x8a\xd8\x6b\x21\xf0\x1e\x5b\x3f\x39\x39\x20\x7c\x15\xfb\xf0\x8a\x33\xd5\xeb\x3f\xa9\xa9\x75\x56\xe7\x93\x58\xf4\x60\x80\x99\x40\xb4\x98\x71\x2d\x8e\x87\x90\xeb\xf2\xce\x4b\x36\xe2\x09\x56\xce\x32\x1a\xee\xa9\x57\xdb\xef\x57\xb6\x89\xc4\x13\x9d\x7a\x54\x88\x1f\xbe\x6c\x95\x83\x01\xe6\x23\xa2\x75\x02\xd7\x8a\x8e\xd4\x62\xfb\x92\x5f\xd5\xbd\x3a\xb8\x4f\x68\x67\x9e\xb4\x76\xda\x83\x8f\xff\xce\xb4\x7b\xc8\x0f\xa5\x93\x57\x5f\x3e\x8b\x26\x86\x01\xe6\x13\xa2\xc5\x82\x6b\x89\x1b\x8e\x19\xf4\x27\xfd\xa8\xcf\xaa\x17\x1f\x3b\xf7\xf8\x0a\xf7\x60\xa8\x5e\xc5\xa7\x61\xb1\x1d\xe5\xd8\x42\x5f\xe0\x26\x82\x3d\x69\x4d\x22\x5a\xac\xb8\xd6\xcd\x27\x7d\x74\x7d\x0c\xda\x52\x69\xd4\xb7\x48\x3a\x5d\xad\xf9\x07\xbc\x77\xec\xbe\xa6\x45\xce\x74\x1d\xdf\xb8\xb7\x40\x13\x2f\x05\x03\xcc\x67\x44\x8b\x0d\xd7\xea\xba\x3b\xa9\x0d\x16\x24\xde\x1a\x13\xbc\x66\x3a\xfa\x45\xe8\xff\xa3\x91\xa2\xfe\xc1\x12\xe9\x9f\x66\x19\x37\xae\x0f\x26\x97\x00\x0c\x30\x53\x88\xd6\x49\x5c\xcb\xaa\x71\xf4\x3b\x9b\x22\xa1\x5c\x4f\x26\xf5\x62\xd8\x8f\x83\x4b\x45\x26\xdb\x4e\x61\x1d\xc7\x51\xcf\xf6\x31\x07\x33\x68\x07\x1d\x18\x60\xa6\x11\xac\x0a\xda\x7f\x37\xf0\xff\xef\x60\xc6\xc4\x8e\xfb\xcb\x63\xb4\x2b\x4b\x67\xb6\x43\xab\x8b\x74\x79\x48\x2c\xc2\xbd\x7b\xd8\x14\x3f\x5b\xd5\x86\xf4\xbb\xed\x47\x32\x7d\xd6\x99\x3e\xa1\x08\x03\xcc\x0c\xe2\x8a\x9c\xc2\xb5\xd6\x2b\x02\x03\xd2\x86\x4e\x57\x12\x96\x53\x7c\x5c\x6d\xa8\xf0\xb2\x39\x14\x12\x2a\x39\x1d\xa2\x93\xe4\x68\xfc\xda\x8f\x6c\x56\x19\x06\x98\x59\x44\xeb\x34\xae\x45\x02\xb7\xbe\x7c\x93\x51\x75\xaa\x92\x30\x41\xc2\xf0\xcf\x48\x41\x9c\x57\x93\x4f\x90\xcf\xaf\xd2\x85\x87\xf3\x16\x32\xca\xcf\x3d\x60\x80\x99\x43\xb4\x38\x70\x2d\xfe\x41\x8a\xec\x55\x0b\xcc\x21\x2f\x0f\xcb\xd3\x53\xa3\x23\x7a\x8c\x8d\xa1\x53\xe3\x93\x51\x1e\xa9\xbf\x94\x3e\x65\x62\x26\xb0\x07\xdd\x3c\xa2\x75\x06\xd7\xd2\x6a\x6f\x76\x1f\xd7\x4c\x54\x72\x7c\xc0\x56\xaa\xb8\x7f\x9e\x59\x25\xeb\x78\x9e\x0e\xc9\xe0\x2d\x83\x8e\x45\xb4\xae\x9d\xd0\x29\x18\x60\x16\x10\x2d\x4e\x5c\xcb\xef\x83\xf0\xa6\xa3\x8b\x03\x27\x23\xe3\x5e\x2c\xff\x51\x07\xe5\xc5\x6f\x5b\x41\xb2\x43\xe8\x11\x65\xe1\x15\xc1\x82\xd2\x46\x7d\x18\x60\x16\x11\x2d\x2e\x5c\x6b\xb3\xe2\x3b\xff\x46\x41\xf1\x70\x83\x80\x2a\x7d\xfe\xe5\xf0\x40\x9b\x62\x30\xc3\x5c\xf1\x00\x53\xfb\xb3\x49\xdd\xe4\x20\x54\x04\x06\x98\x2f\x88\x16\x37\xae\x55\x42\xc6\x7d\x10\xb7\x43\x5f\xd1\xd7\xe6\xfe\xa8\xae\x63\x2d\x50\xa7\x96\xdf\x98\xfd\xbc\xce\x5e\xc7\xd3\x47\x97\xc2\x4b\xb7\xd5\x60\x80\x59\x42\xb4\x78\xf0\xd6\x31\x38\x08\x3c\xcd\xaf\x56\xfe\x4e\xfa\xbc\x48\x88\x7c\xfe\x62\x03\xd3\xe0\xe8\xf2\xdd\x07\x69\x71\x35\x3a\x52\x4f\x3e\x1e\x88\xc3\x00\xf3\x15\xd1\xe2\xc5\xb5\xfe\x9c\xd6\xdf\xa6\x5a\x4b\x3e\x63\x1c\xd8\x34\x64\x65\xb0\x31\xa0\x78\x73\xc6\x73\x9a\x36\x4d\xe1\xa1\x2e\xdb\xc8\xd3\x70\xc2\x8b\x30\xc0\x2c\x23\x5a\x7c\xb8\x96\xa6\xbd\xdd\xe0\x73\x59\x6e\xea\x31\x20\x36\x8b\x36\x4f\xe9\x16\x52\xd2\x49\x0a\x9a\x2d\x72\xa1\x39\x9f\xea\xf3\x50\xa2\x1f\x3b\x65\x7f\x43\xb4\xce\xe2\x5a\x1e\xa1\x4f\xd4\xc6\x73\xee\x0f\x3e\x0d\x3a\x15\x6f\xba\xb8\x4f\x7d\xf6\x49\x76\xa3\xf6\xcc\x53\xd3\x60\x0b\xe9\xb9\xa8\xc7\x89\xd8\x63\x68\x05\xd1\x3a\x87\x6b\x71\x7e\x97\x50\x68\x3d\x65\x5c\x94\xa1\x79\x62\xa3\xe8\xfa\x8e\x25\xe6\x82\x94\xf5\x62\x6f\x3b\x71\x79\xaf\xe6\x12\x30\xea\xc7\x1e\x43\xdf\x11\x2d\x7e\x5c\x2b\xd1\x98\x97\xec\x7e\x88\xef\x18\x3b\x6b\x50\xe9\x39\xaf\x37\x4c\x14\x3d\x13\xd2\x64\x5a\xa1\xe6\xf4\xdc\x7a\xa2\x59\xde\x39\xd8\x6b\xe0\x2a\xa2\x75\x1e\xd7\xe2\x7b\x21\x4d\xfc\xe1\x2d\xac\x6e\xfc\xfe\x0b\x9f\xc4\xa6\x23\xc7\x99\xd4\x6b\x1a\x84\xe3\xaf\x35\x14\xc9\x0b\xdc\xd6\x45\xb3\xb1\xc3\xd5\x0f\x44\x4b\x00\xd7\xca\x57\x3a\x78\xc8\xc9\xe3\xc5\x57\xb5\xec\xc5\x6f\xf9\xbc\x4d\xf2\x77\xb4\xc3\xcc\xb4\x9c\xd5\xb4\xbf\x4c\xfe\xed\x07\x51\x36\xd8\x8b\xcd\x1a\xa2\x75\x01\xd7\x3a\x79\x9f\x71\x8e\x3e\x83\xec\x9e\x14\xc1\x23\x37\x0d\x79\xc5\x76\x7b\x75\x10\x44\x53\xad\x0f\xc3\x2f\xe0\x78\x43\xc2\xfe\xcb\x30\xc0\xfc\x44\xb4\x04\x71\x2d\x48\xd2\xda\xe8\x4f\x31\xd7\xb1\xdb\x1c\x43\x9b\xd4\xd7\x0b\x3e\xf2\x94\xf4\x4e\xb6\xde\x23\x12\x98\x4a\x77\xa4\x05\x64\x3d\x04\x30\xc0\xfc\x42\xb4\x84\xf0\xce\x5f\xeb\x83\x29\x25\xe6\xbe\xfc\xf7\x54\xf5\xce\x57\x3c\xad\x1d\xee\x76\x45\xa5\x95\x78\xb7\x26\x4b\x36\xb9\xd9\xcb\x79\xd5\xba\xc2\x00\xb3\x8e\x68\x09\xe3\x5a\x77\x7a\xc4\x9e\x25\xb0\x85\x3e\x6f\xbd\x7d\x87\x9b\x06\x65\xfb\xa4\x3d\xf1\xc1\xf2\x6a\x64\x5f\x1a\x0f\x09\x2c\xc4\xba\x7a\x9f\x1c\x06\x98\x0d\x44\x4b\x04\xd7\x7a\x13\x98\x56\x01\x2b\x8a\xb4\xa8\x09\x66\xb4\x55\x5b\x7f\x36\xe0\x95\x31\xe2\x93\x09\xd7\x08\x14\x2f\xa6\xd8\x9f\xff\x41\x89\x3d\x1e\x7f\x23\x5a\xa2\x78\x83\x91\x5b\x1c\xbf\xe7\x3e\x1d\x91\x38\xf7\xeb\xdb\xbf\xed\x9f\x2e\x51\x69\xa7\x3f\xa8\xdb\x7d\xf9\x86\x54\xc1\x25\xec\x09\xf7\x20\xf6\x18\xda\x44\xb4\x2e\xe2\x5a\x15\x22\x57\x5c\x24\x8e\xb5\x7f\x9d\x2a\xe6\x73\x0d\xe6\x77\x17\x91\xe4\x9f\xcc\x7c\xa4\x79\x3c\xda\x4b\x75\x3c\x9c\xfc\xee\x82\x21\x0c\x30\x5b\x88\x96\x18\xae\xa5\x54\xdd\x52\x56\xe6\xb9\x7c\x6b\xf5\xf3\xab\x27\xf6\xb4\x0e\xec\x4a\x7f\x36\x78\x48\xbd\x46\xbd\xb7\x6d\x1b\xad\x83\xd9\x44\xa8\x60\x80\xd9\x46\xb4\xc4\x71\x2d\xb2\xf2\xf0\x98\xa3\xf0\x94\x4b\x94\xfe\x8c\x5a\xdb\xab\x14\x2a\x0e\xae\x67\x2f\x6a\x92\x0e\xbc\x0e\xbf\xba\x73\x56\x75\x27\xf2\x1c\x0c\x30\x3b\x88\x96\x04\xae\x55\xdd\xc2\xf4\xec\x5c\x4d\x3e\xdd\x8d\x27\xec\x56\x57\x75\x29\x37\x19\xbc\xed\xbb\x69\x2d\xf6\x2b\x4d\xa9\xfd\x7b\x63\x0d\x42\x8c\x61\x80\xd9\x45\xb4\x24\x71\xad\xe9\x7d\xda\x6b\xe3\x2d\x9a\x4f\x9f\x0d\x6b\x5c\xbe\x6a\xd6\xf3\x86\xb6\x55\x9f\x3e\xb4\x31\x6c\x54\xb6\xcb\xab\x3a\xb8\xa0\x80\x1f\x06\x98\x3d\x44\x4b\x0a\xd7\x1a\xb9\x5d\xb0\x9a\x56\x2b\xee\x10\x6d\x70\xbd\x74\x14\xc5\xbd\x36\xb8\x72\xb3\x3a\x34\xd1\xd7\x2e\xcb\x2b\x4d\x3f\xf8\x4f\xb4\x2d\x0c\x30\xfb\x88\x96\x34\xae\x15\x50\xef\x3b\xc5\xb6\xb1\xd0\xa8\x19\x39\x3b\x74\xca\x90\x8b\x95\x6a\xdf\xcf\x81\x3c\x2d\xe4\x9c\xb5\x07\x81\x7d\xd1\x81\xce\x59\x18\x60\xfe\x20\x5a\x32\xb8\xd6\x54\x90\xcf\x31\xb9\x9a\xdd\x6f\x2a\x93\xc1\xf7\xce\xc4\xb9\x32\xb4\x35\x76\x55\x0b\x16\x6a\xaf\xd2\xb5\xb4\x39\xab\xfa\x6d\x69\xc1\x00\x73\x80\x68\xc9\xe2\x5a\x0c\x14\x33\x91\x64\xf1\x9a\x39\x47\x13\xa1\x4c\xf4\x66\x8e\xd5\x3b\x8e\x2b\x4a\x5c\x85\x7e\x07\x0c\x40\xfe\xf2\x66\xf0\x27\xec\xbe\x7a\x88\x68\xc9\xe1\x5a\x45\xa1\xae\x33\xde\x7a\x71\x96\xce\x7d\xe2\x2e\x64\x2c\x8b\x77\x48\x9a\x6a\xfa\x77\xbf\xe6\x15\x73\x0f\xd4\x2e\x9f\x5c\xee\xe7\x86\x01\xe6\xe8\x1f\x06\xb6\x7f\xfa\xd8\xf5\xaf\x81\x4d\x1e\xf7\x97\xdb\xac\x5e\xf1\xd2\xa4\xfc\x1c\x4e\xf4\x6d\xa0\x8d\x26\x77\xb1\x99\xdc\x39\x18\xc5\xf1\x53\x35\x27\xa6\x60\xea\xcd\xc8\x20\x99\x3b\x0c\x20\x14\xe2\x8a\x5c\xc2\xb5\x76\x54\xe8\xc9\xce\xde\x1c\x8b\xf3\x9d\xce\xdb\xb4\x5a\x22\x74\xbd\xf6\xd4\x22\x8b\xda\xe8\xc6\x48\x41\x3c\x15\xcb\xb8\xf4\x26\x3f\x0c\x20\x34\xa2\xa5\x80\x6b\x19\x09\xe4\x11\x97\x51\xd0\x9f\x35\x9c\xd0\xcc\x28\xbd\x7f\xf2\xba\xf3\x05\x9b\x8e\x17\xb4\x85\xe4\x5d\x29\x8c\x3d\xa6\x9e\x13\xea\x30\x80\x08\x10\x2d\x45\x5c\xab\x57\x39\x9b\x6f\x8c\xff\x61\x0d\x49\xf4\xa6\x1b\x2b\xb9\x54\xf8\x4f\xd0\x27\xa5\xc5\xc4\xc7\x9b\xf9\xeb\x6c\xd4\xa8\xf7\x29\x3b\x18\x40\x18\x44\x4b\x09\xd7\x9a\xcd\xa4\x4a\x6a\x9b\x0e\x2f\xe2\x4c\xb5\xaf\x5c\x6c\x37\x9f\xfb\x90\x18\xdf\xe9\xf6\xf8\xf8\xaf\xeb\x05\x11\x1f\x28\xa9\x07\x3c\x61\x00\x41\x88\x96\x32\xae\x65\x7b\xa3\x70\x4c\x6b\x87\xe8\xc4\x0d\x2e\x02\x9d\x5f\x77\x3e\xa5\x08\x1c\xd4\x61\x9a\xfe\x2c\x06\x37\xb9\x45\x06\xe7\x5f\x60\xf6\x81\x01\x44\x88\x68\xa9\xe0\x7d\xf8\x98\xc1\xcc\xfb\x33\x29\xcd\xda\xa2\x28\x3f\xd1\xaf\xf7\x1d\x77\x77\xe7\x6f\x2d\x3a\x0a\x97\xf3\xee\x41\xcf\x25\x0f\xcb\x94\x94\x61\x00\x11\x21\x5a\xaa\xb8\xd6\xbd\x46\xc3\x0a\xa5\x27\x97\x07\x1d\xaf\xf0\xde\xee\x7e\x33\xec\xdd\x3b\xe5\x65\xf0\xa0\xd0\xbf\xaa\xff\x43\x98\x7d\x4d\x65\x8b\x13\x0c\x20\x62\x44\x4b\x0d\xd7\xca\x93\x1f\x52\xf4\x3c\xd7\x4d\x33\xa4\x7d\xf3\xc1\xd5\x6a\x41\x57\x33\x4a\x5e\xb5\xb4\x1b\x8d\xef\x1f\x15\xb6\xf2\x86\xf2\xa8\x8a\xc2\x00\x22\x41\xb4\xd4\xf1\xde\xc7\xa4\x08\xf5\xe9\x81\x00\x5e\xaa\xc0\x87\x8c\x8d\x2b\xcc\x49\xec\x7d\x49\xaf\x8e\x8d\x97\x1d\x5a\x4d\xca\x9d\x68\xe0\x56\x90\x87\x01\x74\x0c\xd1\xd2\xc0\xb5\x44\x5e\x67\xae\x6c\x26\xac\x2c\xbb\xd9\x90\x54\x91\x9d\x14\xd7\x4f\x7a\x4c\x73\x3c\x87\xab\x88\xff\x53\x6f\xee\xf6\xfe\xd4\x8a\x10\x0c\x20\x52\x44\x4b\x13\xef\x42\x2f\xd4\xe7\x9f\x8c\x2a\x7e\xe5\x2a\xbd\x78\xff\x88\xc6\x88\xe3\xd1\x27\x3b\xa9\x16\x87\x0e\x33\xff\x17\x54\xc6\x56\x3e\x57\x44\x60\x00\x91\x21\x5a\x5a\x78\x1f\x41\x8a\x63\x9a\x78\x62\xe9\xfa\x03\xb7\x35\x85\x83\x5f\x06\x0b\xf5\x9b\x71\x04\xf6\xf3\x94\x87\x10\xdf\xfe\xe9\xce\x77\x62\x41\x01\x06\x10\x39\xa2\xa5\x8d\x6b\x75\x4a\xce\xce\xc6\x26\x19\x74\xdd\x76\x20\x53\xfc\x16\xb2\x3c\xc6\x61\x1a\x2f\xee\xc6\x78\x8b\xf7\x97\x72\x14\x15\xb1\x31\x25\x04\x03\xe8\x38\xa2\xa5\x83\x6b\x0d\x9e\x0e\xf5\xbe\x15\xc6\xcc\xea\xec\x20\xcc\xfe\xea\x72\x8f\x6b\x53\xc6\x8f\x5f\x9c\xcc\xbf\x2e\xc8\x18\xb2\xc7\x71\x69\x98\x61\x8f\x47\x0a\x44\x4b\x17\xd7\xba\xe6\x06\xcf\xdc\xbf\x10\x85\x4a\x65\x4f\xe6\x27\x2a\x0a\x05\x84\x8a\x5d\x6f\x03\x1c\x4e\x4a\xdd\xca\xf0\xf2\xdb\xac\x78\xe4\x0b\x03\x88\x12\xd1\xd2\xc3\xb5\x7c\xa8\xa9\xe6\xbf\x16\x8d\xbc\x48\xda\xe4\xb9\xf8\x53\xac\x94\xbe\xa2\xd7\xd9\x81\x67\xc8\x7b\xa9\xa1\xb0\x2c\x6d\xa9\xaa\x88\x04\x06\x10\x15\xa2\x75\x19\x6f\x88\xb7\xf9\xbe\xd4\x55\xff\x5a\x0f\x98\x0d\x39\xbb\x15\x15\xae\xf6\x84\xbb\x15\xba\x65\x08\x4b\xe6\x6f\xc2\xd9\xcd\xf4\xa2\x2a\x30\x80\xa8\x11\x2d\x7d\x5c\xab\xa3\xac\xb6\x4a\x02\x6e\x49\xcb\xd9\x4d\xb9\xfb\xa2\x57\x57\x8b\xe4\xad\x45\xb0\x84\xf8\x9a\xf9\xad\x45\x83\x2b\x22\xd3\x96\xc7\x60\x00\xd1\x20\x5a\x57\x70\xad\xac\xf7\xe9\x5b\xdf\x25\x4a\xba\xaf\x11\x73\x45\x2b\xd5\x0b\xd6\x96\x5e\xb5\x4d\xbf\x62\xc8\x62\x91\xa9\xb1\x32\xa7\x68\xad\x7d\x02\x06\x10\x2d\xa2\x65\x80\x6b\x4d\x0c\x7a\xda\xa5\x72\x1e\xbb\xa7\x42\x78\xaf\x83\x30\x23\xa0\x58\x93\xa9\x59\xd6\x76\x72\xb7\xad\xfc\x6d\xe3\xd4\x0b\xcd\x6a\xec\xb6\xa7\x43\xb4\x0c\xf1\xce\xd1\xab\xb2\xe1\x93\x3a\x7e\xe9\x4e\xc7\xc9\xd6\x75\x4c\x0c\x24\x64\x42\x9a\x4e\xaf\xb2\xea\x73\x7f\xfe\x9e\xa0\x8e\x72\xd4\xf1\x83\x01\x44\x8f\x68\x19\xe1\x5a\x2f\xe4\x4e\x7d\x31\x8b\x4e\xb9\x16\x99\x2d\x59\xf6\x2b\xc6\x41\xb1\xdd\x1c\x86\x54\x2c\x05\x54\x88\x7a\x97\xa2\x24\x2e\x5f\x71\x86\x01\xc4\x80\x68\x5d\xc5\xdb\x57\x0f\x25\xde\x07\x46\xfb\xb5\x68\x39\x33\x9a\x2d\x3d\x3c\x6e\xe6\x4d\xd8\xc6\x6c\xe4\x6d\x73\x47\x9b\xb6\xe4\x6a\xc8\x93\x47\x0c\x30\x80\x18\x11\x2d\x63\x5c\x4b\x39\xf2\xb5\x90\xba\x46\xe8\x78\x7d\x3f\xb7\x52\x13\x75\xad\xff\x11\x86\xfe\x4c\xae\x5d\x74\xcd\x8a\xdb\x35\x65\x2d\x1f\x2a\xec\x39\x87\x09\xd1\x32\xc1\xb5\x8e\x82\x6b\x16\x87\x62\x5a\xe7\x2d\x3c\x8e\x04\x31\xc5\x1a\x29\xb4\x82\x76\x05\x68\x9a\x6b\xbf\xd6\x72\x0f\x16\x58\x6e\x81\x2b\x30\x80\x00\xa2\x65\x8a\x6b\xa1\x3e\x5c\x1c\xaf\xfc\xfe\x23\xf7\x8c\x87\x15\x2b\x8b\x4f\x94\x37\xa9\x00\xdd\x94\x91\x88\x23\x23\x75\x2b\xf7\x0c\x2d\xaa\xe8\x0c\x0c\x20\x66\x44\xcb\x0c\xd7\xa2\x5b\x58\xe0\x5c\x0e\x1f\x54\x3e\x8f\xb1\xe2\xed\xcf\x67\x4f\xe1\x67\x3a\xfb\x30\x55\x70\xbf\x32\x48\x3f\xef\xeb\xa5\x08\x34\x17\x0c\xa0\x13\x88\x96\x39\xae\xe5\x7b\xc3\x9b\x89\x5b\x56\xff\x31\x58\x1c\xf8\xf0\xbd\x07\xe4\xe5\xbd\xa1\xfd\x54\x79\x4b\xd8\xaa\xe8\x04\xdd\xd4\x4a\x55\x1e\x33\x0c\x20\x16\x44\xcb\x02\xd7\x1a\xbe\xff\x9a\xa1\xd2\x40\xdb\xea\x43\x9d\xc3\x6b\x6f\x0b\x6f\x3b\xe5\x7e\xee\x8f\xbb\x86\xb4\xcd\xb4\x3f\x37\xea\x5b\xda\xac\x31\x30\x80\x58\x11\x2d\x4b\xbc\x27\x1f\xeb\xb3\xa9\x6f\xfa\xc6\x2a\x3d\xcf\xbe\x77\x9b\xba\x12\xfb\x2e\xa0\xa9\x87\xac\xd5\xe2\x6e\xe3\x87\xd8\x58\x0e\xb1\x33\x61\xd8\x73\x34\x1b\xa2\x65\x85\x6b\x95\xb6\xef\xd2\x10\x24\x8b\x5c\x94\x00\xd7\x88\xbd\xaa\x1c\xd7\x73\x8c\x7e\x91\x5f\x7d\xb7\xa3\x41\x2a\xcd\xb6\xc2\xd9\xa0\x77\x1a\x06\xd0\xc9\x7f\x18\xd8\xfe\xe9\xe1\xf7\x5f\x03\x9b\x35\xee\x2f\x37\xbf\x60\xc2\xad\x7f\xdf\xd2\x48\xdf\xfa\xcb\xcb\xe8\x93\x66\x44\xdb\xa4\x3f\x0a\xf4\x1b\x35\x55\xcf\xb4\xa8\x46\xf5\x08\x28\xb8\xc2\x00\x62\x47\x5c\x11\x1b\x5c\x4b\xe8\xc5\x83\xf9\x9f\xf5\xb7\xbf\x6f\x88\x1c\xe4\xd5\x4a\xb3\x09\xd3\x93\xb5\x3a\x17\xd1\xdd\xf2\x35\x1f\xb2\xb3\xb1\xea\x8c\xc6\x1e\x28\xa7\x10\x2d\x5b\x5c\xab\xa9\x88\x7d\x6b\x89\x54\x33\xe2\x68\x35\x0f\xe5\x13\x6a\xb9\x2e\xf9\xee\x69\x7d\x82\xc3\xdd\x0f\x5f\xe8\x27\x03\xbf\x47\x2e\x0a\xc3\x00\x3a\x8d\x68\xd9\xe1\x5a\xb4\xa9\x74\xe6\x41\xeb\xca\x6a\x67\x5b\xc3\xc4\xc4\x58\x5c\xa6\xfc\xbe\x2b\x1b\x5e\x0d\x08\x2d\xba\x45\x79\x45\x2e\xc4\x9a\x8e\x1c\x06\x10\x07\xa2\x65\x8f\xf7\xc9\xfd\x54\x87\xac\xca\x97\x01\xe3\xdf\x0e\x87\xab\x53\x9e\x2a\xfe\xeb\xe2\xcc\xf4\x32\xd7\x6b\xd3\x68\x83\xea\xd3\x6d\x96\xe2\xd9\x60\x00\x9d\x41\xb4\x1c\x70\x2d\x35\x0d\x20\xbe\x79\x2b\x3d\x34\x23\xe5\xa5\xdf\x42\x46\xb2\x93\xa7\x47\xd7\xcc\x34\xd9\x4b\x1e\x68\xeb\x5b\xda\xa5\x5b\xaf\xb1\xeb\xc8\x89\x68\x39\xe2\x0d\x20\xcd\x05\x49\xc2\x0a\xd1\xf6\xcf\xdc\xeb\x48\xbe\x8d\xbe\x55\x7a\xc1\x6f\x93\x19\x99\xf7\xed\xcc\x7a\x94\xb1\x84\xff\xc4\x1e\x0b\x0c\x20\x2e\x44\xcb\x09\xef\x69\x2a\xcf\x50\x95\xb6\xa2\x2e\xa7\xd2\xdb\x31\xcd\xeb\x53\xcc\xbe\x63\xc9\xdf\xb3\x94\x05\x9f\xad\x05\xc7\x59\x18\x60\x64\x4e\x63\x2f\x5c\xdc\x88\x96\x33\xae\xe5\x3e\x66\xd3\xb3\xd9\x7e\xeb\xfd\xf9\xcf\x41\x6f\x1b\x9c\x49\xfe\xe4\x74\x6f\x6b\x8f\xc4\xae\x12\xdb\xa3\xd9\x52\x6c\x58\x5f\xd3\xc1\x00\xe2\x41\xb4\x5c\x70\xad\x50\xd0\x7d\xb1\x58\x5b\x8c\xa0\xa7\x44\xe0\x22\xcb\x25\xb3\xec\x98\xf7\x8d\x3f\xd1\x91\x45\x27\xca\x18\xf2\x9e\x26\xb8\xb1\x62\x07\x6f\x5e\x44\xcb\x15\xd7\x22\x5a\x9e\x76\x49\x5f\x9a\x3c\xcd\xaf\xd4\xb9\x6e\xbe\x6f\x30\x9a\xb3\xec\xf6\x9e\xe9\xb7\x8b\xb7\xbe\x6b\x0e\xc9\x73\x09\x5e\x55\x18\x40\x7c\x88\x96\x1b\xae\x05\x48\xdf\x00\xb2\x2a\x81\x0a\x41\x12\x27\x81\x75\xf7\x8f\x51\xe4\x3d\xac\x1f\x0d\xce\x31\x7f\x3d\x9e\x5f\x54\x56\x46\x1b\x46\x01\x03\xe8\x2c\xa2\xe5\x8e\x6b\x11\x9c\x29\x9d\xf3\x9d\xae\xab\x7b\x19\x9f\xb7\x6a\xe8\xe2\xab\x1a\x26\x7f\xb9\xec\x23\xef\xde\xed\xdf\x23\xe6\x55\x94\xa3\x3a\xd8\xc1\xe8\x1c\xa2\xe5\x81\x6b\x3d\xbf\x15\xdc\xd6\xdf\x7a\x77\x78\xfa\x5d\x65\xa2\x7a\x92\x13\x93\x44\x07\x8b\x87\x4d\x2e\x0b\xbd\x90\x8b\xc9\xd9\xd0\x66\x07\xec\x49\x9d\x1f\xd1\xf2\xc4\xbb\x51\x49\xfb\x79\x33\x24\xe8\xf6\xf5\xb3\xd9\x3a\x02\x4d\x16\x5b\xdf\x2b\x45\x3f\x06\x1f\x2e\xe9\xf0\xbe\x5c\x94\x14\x93\x57\x95\xbf\x00\x03\xe8\x3c\xa2\xe5\x85\x6b\x2d\xbe\xbc\x65\xc6\xa9\x81\x2e\xf5\xa6\x3c\x78\x4b\xb0\xa4\x53\x23\xd3\x36\x54\xa1\xee\x7b\x51\xbe\x3e\x9b\xb7\xd6\xb0\x8d\x87\x03\x06\x90\x00\xa2\xe5\x8d\x6b\xfd\x96\x5a\x3a\x5b\x4e\xe9\xf5\xa2\xa0\xb6\x8a\x6b\xc0\x2b\x2c\x33\xb8\x3b\x82\x6c\x20\xad\x52\x81\x31\xad\x57\xbf\xd8\xf3\x3b\x13\x0c\xa0\x0b\x88\x96\x0f\xae\x25\xc8\xf9\x95\xd2\x56\x2f\xef\x99\xfc\xa2\x1e\xef\x41\xa2\x98\xb3\x5a\xa7\xbf\xda\xcb\xab\x3a\x21\x5d\xb3\x93\x77\xde\x3d\xf4\x91\x85\x01\x24\x88\x68\xf9\xe2\x5a\x5e\xca\xbe\x73\xe5\x25\xd4\x3a\x0c\x09\xea\x75\xb7\xe0\x30\x63\x5a\x63\x33\x2e\x9d\x1c\xde\x87\x44\x27\x78\x99\x47\xbc\x75\xb0\x83\xa4\x10\xa2\xe5\x87\x6b\xa9\xae\xbd\x24\xd7\x3f\xb5\xf4\x7a\x2b\x7e\x56\xd8\x43\x85\x5f\x20\xbc\x65\xff\x2d\xfb\xca\x22\x45\x38\xfd\xbb\x2d\x1d\x4a\x19\x3d\x18\x40\xc2\x88\x96\x3f\xae\xe5\x60\x69\xab\xf6\x40\xce\x4f\x68\xd0\x48\x7c\xc3\xf8\x3e\x35\x61\x76\x95\x78\x54\xdb\x67\xbf\x50\xd7\xf4\xe0\x94\xbe\xa2\xd3\x57\x61\x00\x89\x20\x5a\x01\xb8\x56\xae\xce\xdd\xd3\x5f\xe9\xad\x5e\x4d\x8f\x38\x56\xb3\x7a\x6b\x13\x66\xf6\x0a\xcd\x54\x29\x71\x7d\x9b\xf0\xd8\xff\x19\xfe\x65\x80\x0a\x06\x90\x28\xa2\x75\x0d\xd7\xd2\x5f\x3f\xe1\x5a\x94\xdc\x6e\x5c\x7b\x7d\xdf\x20\xbf\x63\x20\x76\x2a\x21\xee\x84\x65\x89\x31\x49\x00\xcb\xb7\xda\xcc\xcd\x09\x0f\x18\x40\x17\x11\xad\xeb\x78\xd7\xa1\xd7\x87\xd1\xe7\xa8\xb9\x8a\xeb\x2b\x06\xbf\x5c\x78\x7a\xcc\x87\xda\x02\xba\x61\xb2\x09\x26\xb3\x44\x3d\x5f\x58\x97\x93\x89\xc3\x00\x12\x43\xb4\x6e\xe0\x59\xca\xe7\xda\x1b\xb8\xea\x4e\xf0\x78\x7e\x09\x8a\x3f\x33\xf4\x9a\xa8\x08\xfd\xa4\xc4\x45\x76\xff\x9d\xe8\xbd\x79\x52\x86\x5d\xec\x39\x5a\x1c\xd1\x0a\xc4\xb5\xb2\x63\x95\x15\x05\xb4\x43\x42\x46\x3b\x98\x56\x9c\xaa\x0d\x4b\xba\x53\xe9\xa3\x9e\x60\x5c\x03\x5f\x5e\xf5\x18\xbf\xd9\x7a\x68\x09\x03\x48\x02\xd1\x0a\xc2\xb5\xb6\x4f\x53\xbb\xc7\x33\x87\xd1\x9c\x80\x12\x63\xcd\x38\xd3\x22\x89\x02\xee\x95\x32\xb6\x84\x29\xa6\x30\x5c\x84\x98\x83\x68\xb5\x60\x00\x49\x22\x5a\xc1\x78\x8f\x7d\x63\x2c\x2b\x92\x54\xc3\x9d\x36\x67\x9f\x1c\x58\x76\xef\x66\x1c\xbf\xe4\x30\xa4\xbe\xb4\x23\x76\x9c\x28\x87\xf6\xe7\x7e\x34\xf6\x5c\x28\x85\x68\x85\xe0\x7d\x12\xbf\xa0\x16\x2f\x49\x79\x22\x66\xd1\x22\x5b\xf4\x32\x0a\xdd\x78\xd5\x71\x05\x2e\xf8\x42\x9a\xa1\x5b\x56\xfc\xb9\x77\x46\x00\x7b\x9e\x90\x46\xb4\x6e\xe2\x7d\x53\x25\x91\x4d\x5c\x78\xc6\x02\xce\xfb\x76\xfe\x7c\xcc\xf8\x60\xd7\x4c\xf8\xef\xbb\x7d\x29\x51\xf7\x9f\x34\x3a\x99\x43\x59\xa6\x28\x18\x40\x32\x88\xd6\x2d\xbc\x4f\xe2\x8f\xa6\x9e\xa6\x2d\x28\x4f\xb4\x45\x2d\x0a\x3d\xa1\x65\x06\xda\xac\x8f\x06\xca\xc8\x7f\xc8\x0d\x0f\x32\x3f\x48\xe7\x75\xf7\x81\x01\x24\x8b\x68\x85\xe2\x5a\xc4\xe4\x95\x95\x33\x75\xce\x7a\x81\x85\x2b\xcc\x09\x35\xb7\xbf\xab\xec\x0f\xe5\xde\xec\xcd\x66\x7b\x78\xa4\x60\x7b\xc6\xb3\x0c\xfb\xba\xe4\xfe\x61\x60\xfb\xa7\xaf\x20\xfe\x35\xb0\x85\xe1\xfe\x72\x31\x4a\x27\xfb\xd6\xf2\xee\x6d\xf2\xd5\xa4\xdc\x1d\xa1\x2c\xb1\x00\x81\x27\x51\xba\x86\x62\xda\xb2\x81\xbb\x23\xad\xfa\xcc\x9c\x30\x80\xe4\x11\x57\x04\xc6\xb5\xfc\xb9\x7b\xea\xab\xe9\xe0\x5c\x66\xe2\xc1\x4f\x1e\xab\x6d\x15\x2d\xbd\x15\xfc\x93\x5c\xcf\x2d\xa2\x29\x33\x8e\x48\x23\xbf\x6b\xc0\x00\xba\x84\x68\x85\xe3\x7d\xec\x78\x86\x9c\xdb\x91\x4b\x49\x3d\x7c\xf9\x55\x85\x78\x57\x96\xfe\x03\xcb\x41\x4e\xab\x53\xc2\xf3\xfc\xc0\x9f\xa8\x91\xf3\xa9\x13\x0c\x20\x05\x44\x2b\x02\xef\xe3\x50\x6f\x19\xcf\xc7\xc7\x1a\x76\xdd\xc2\x3c\xbf\x79\xdf\x47\xe9\x3f\xfa\xb3\xa8\x70\xe5\xaa\xed\xf0\x05\xff\x89\xb7\xe9\x22\xc3\xc6\x30\x80\x14\x11\xad\x48\x5c\x8b\xd1\x6a\xf0\x4d\xa1\xca\xe6\x53\xfd\x3b\x12\xf2\x37\x1f\x87\xb8\xca\xcb\x66\xe4\x6a\x44\xf4\xff\x7e\xfa\xc3\x87\x3d\x9a\xc6\x43\x06\x06\x90\x12\xa2\x75\x1b\x6f\x28\x95\xd6\x08\x6d\x9a\x8f\xe5\x25\xd1\x35\x8e\xe9\x21\x8f\x52\x29\x96\x08\x21\xd7\xbc\x7e\xe5\x56\x22\x5b\x44\xec\xc7\xe0\x71\xec\x1d\xaa\x32\xa2\x75\x07\xd7\x32\xa5\xbd\x39\x3d\x50\x49\xbd\xbd\xc8\x4c\xa0\xb6\x94\xe0\x69\x48\xe0\x75\xdf\xb0\xf8\xb3\xd2\xa6\x5a\xd6\xed\xcd\xd6\xd7\xfd\xac\x30\x80\x54\x10\xad\x28\x5c\x8b\xf2\xa2\x98\x32\x69\xb2\xc0\x79\xfd\x27\x0b\xda\x87\xa6\x26\x2f\x39\x20\x09\x0b\xa5\xd4\x8d\xe5\x3b\xd2\x3f\x33\xca\xba\x64\xb0\x3b\xb7\x2a\xa2\x15\x8d\x6b\x45\x99\xf3\xe8\x94\xf3\x98\x6d\xe9\xb0\x5d\x8b\xd0\x18\x1d\x40\x1f\x3e\x92\xa7\xdd\x3c\x4e\x3a\x3f\x75\x70\x9b\x55\xd2\xe9\x84\x03\x0c\x20\x35\x44\xeb\x2e\xde\xa7\x03\xb3\x5c\x0f\xd4\x2e\xab\xd4\x3d\xb9\xa3\xf2\x8b\x60\x7d\x44\xc0\x7c\x9f\x86\x9b\x2c\x22\x76\xad\x72\x70\x37\xee\x89\x4b\x0c\x76\x00\x51\x47\xb4\xee\xe1\x3d\x26\xf7\xe7\xd7\x0a\x1f\x7b\xec\x6b\x7a\x9d\x4f\xdc\x70\xa9\x7d\x7f\x70\x42\x50\xf1\x72\x7e\x6e\xaf\x24\xdd\xa7\xcb\xd4\xcb\x37\xb1\xfb\xbd\x06\xa2\x15\x83\x6b\x85\x50\xb9\x1f\x2a\x8d\x93\x3c\xfa\x4a\xbb\xfc\x34\xc1\x48\xfd\x55\x64\xc1\xcf\xb8\x70\x6b\x67\xbf\x58\x8e\x74\xa1\x3b\xd0\x4b\xec\x85\x4b\x13\xd1\xba\x8f\xf7\x15\x31\xb6\x93\x14\x6f\xe7\xde\x62\xe6\xdb\x2b\x84\x3e\xb3\xd5\x37\x5d\x89\xde\x4c\xff\xdc\x81\xd6\x92\x11\x71\x62\x2e\x29\xa6\xc2\xee\x5f\x5a\x88\x56\x2c\xde\xc0\x96\x11\x90\xb9\x03\xb4\xa6\x8e\xda\x7a\xe3\xb7\x95\x6f\x56\x55\x25\x47\x2c\x24\x1f\xdc\xec\xca\x91\xf5\x78\x76\x33\x73\x14\x7b\xe7\xac\x8d\x68\xc5\xe1\x5a\x4f\xfa\xba\x8d\x23\xad\xbe\xe8\x7f\xd3\x6c\xb6\xab\x7d\x32\xfc\x82\xcf\xe8\x7d\x19\x8a\x88\xd9\x83\x8b\x55\xce\xca\xb6\xaf\x0c\x3b\x80\xe8\x20\x5a\xf1\x78\x03\xee\x69\x0f\xa7\x9c\xad\xd1\x9a\xe0\x6f\xfb\x01\x47\x4e\x98\x45\x51\xf4\x9c\xcb\x78\x8a\xbb\x35\xf5\xa2\x17\x0f\xc7\x25\x56\xec\xd0\xa0\x8b\x68\x25\xe0\x0d\x6c\xf7\x6d\xc8\xa8\x33\xb5\x88\x02\xc6\xa7\xc2\x96\x08\xe9\x0e\x07\xe2\x2f\x1c\x7c\xda\xec\x7c\xe9\xfd\xa8\xc9\xe7\x66\xbe\x0f\x35\x0c\x20\x3d\x44\x2b\x11\xef\x93\x2c\x42\x39\x38\x48\x3e\xc4\xa4\x8c\x6e\x79\xfc\x2e\xad\x7a\x89\x99\xf9\xc6\x5a\x78\x80\xb2\x37\xd3\x4c\xf0\xed\x2d\xbe\x55\x6b\x18\x40\x97\x11\xad\x24\xbc\xc7\x85\x96\x41\x37\x80\x89\xff\xb5\x90\x05\x71\x82\xae\x2b\xb1\xad\xa7\xb8\xcb\xf8\xf9\xe7\x9a\x9e\x71\xb7\x72\x1b\xfe\x20\xf6\x34\x83\x01\xa4\x8f\x68\x25\xe3\x5a\xf6\x14\x33\x7b\x23\x1f\xea\x05\x6c\x5d\xfb\xc3\x5a\x5e\x84\x58\xca\x50\x4f\x7b\x54\x78\xf6\xd2\xaf\x52\x19\xbc\x5f\x4d\xda\xc2\xee\xf7\x57\x10\xad\x14\xbc\x47\x56\x57\x7f\x9e\x9e\x21\x60\x1d\xf1\xb6\x2b\x75\x7e\x26\x75\xa1\xe7\xe2\x59\xf6\xd3\xea\xbf\xb4\x92\x54\x83\xc3\x28\x14\xf6\x4a\x05\x61\x00\x19\x20\x5a\xa9\xb8\xd6\x67\x6d\x19\x65\xae\x06\x29\xce\x25\xd7\xd2\xef\x95\x9a\x2b\x7b\x4f\x8d\xac\x6f\x50\xfe\xe9\x9e\xe2\x09\xbb\x33\x27\xad\x73\x19\x3b\x80\x18\x22\x5a\x0f\xf0\xae\x43\x2b\x5b\x3c\x26\x7d\x7c\x26\x13\x53\x3b\xc9\x55\x30\xcd\x42\x47\x55\x5e\xde\x33\x91\x89\xcf\x97\xc2\x15\x8f\x58\xc9\x7b\x2f\xc3\x00\x32\x42\xb4\xd2\x70\xad\x0b\x6b\x0a\x55\x27\xde\xd2\x9c\x81\x3e\x95\x79\x3b\x8d\x29\xe4\x25\xf6\x6c\x76\xf7\xd3\xce\x0f\x91\xb5\xb0\x50\xea\x5e\x71\x56\x80\x01\x74\x15\xd1\x4a\xc7\xb5\x12\xb8\xbf\x1b\x37\x61\x7e\xe6\x3c\xbe\x93\x23\x9a\xb7\x2b\x43\x8d\x19\x29\xb9\xe5\x23\x5e\xf6\xfd\xf0\xd9\xed\xe2\xaa\x82\x54\x29\x18\x40\xc6\x88\xd6\x43\x5c\xeb\x5c\x99\x2d\xcf\xa3\xeb\x76\x27\x5e\xf0\xa8\xab\x94\xde\x7e\xc3\x74\x5c\x82\xd2\xe9\x24\xc3\x3a\xc9\xc7\x0e\x2a\x66\xbb\x4b\x2c\xd8\x1b\x15\x13\x44\x2b\x03\xd7\x12\x26\x7a\x17\x34\xf4\x47\x70\x4d\x6f\x8a\x1a\x53\xd5\xa8\x7e\xfb\x4b\xad\x8e\x35\x71\xf7\x85\x1e\x47\x96\xe7\x54\x89\xe3\xa1\xd8\xfd\xcb\x14\xd1\xca\xc4\xb5\xdc\xa6\xae\xdc\x69\xf8\xd9\x79\xf6\xda\xf5\xaf\xe7\xee\x3e\xd6\x67\x7b\xf1\x99\x78\x27\xd7\x94\x9e\x2c\x7a\xac\x3b\xb3\x5a\x98\x16\xfb\x3e\x9a\x21\x5a\x59\xb8\xd6\xb7\xd8\x37\x52\x8f\x04\xce\xf2\xe6\x8e\x52\x8f\x92\x47\x3d\x97\xbf\x6e\x6b\xb6\xa6\x40\x6b\x65\x31\xa1\xf1\x7e\x9a\x4b\xc6\x9f\x1b\x06\x90\x39\xa2\x95\x8d\x6b\x5d\xa1\x6f\xfc\x42\xfa\xe1\xd8\x88\x18\xe6\xc1\xc8\x73\x89\xeb\xf6\x7d\xa2\xd7\x62\x69\xd6\x64\x18\xed\xd9\xf3\x6b\x6c\x5d\x0a\xcc\x61\x00\x59\x20\x5a\x39\xb8\x16\xba\xa5\xdf\x2d\x6c\x5d\xd8\x38\xb8\xd6\xaf\x2d\xe1\xf4\x25\x72\x05\xa0\x4e\x3f\xe6\x23\x19\x7e\xeb\x46\xd2\xf0\xad\x03\x3a\xec\xfe\x65\x89\x68\xe5\xe2\xdd\xd8\x15\x07\xb2\x3f\xbd\x54\x23\xb3\x95\x4c\x5f\xf5\x47\x2d\xd3\xae\x0c\x56\xe6\x52\x52\x22\x7e\xbf\xe0\x36\xa5\x21\x47\xc3\x4d\x0a\x03\xc8\xea\x1f\x06\xb6\x7f\xfa\x8b\x20\x7f\x0d\x6c\x8f\x70\x7f\x79\x8d\x46\x75\xba\xed\xcb\xc0\xe9\xaa\x39\x94\x0b\x07\xd7\x80\xae\xec\xc6\xd5\xa7\xea\x2c\x0b\x1e\x94\xf5\x8f\xa2\x19\x75\xae\xda\xc1\x00\xb2\x46\x5c\x91\x3c\x5c\x6b\x37\x49\xf5\xfb\x86\x70\xfc\x87\x34\x8a\x4f\x67\x5b\x18\x4c\x35\x64\x19\x2a\xf7\x8c\x53\x7b\xfc\x37\xe4\x37\x42\x43\x42\x89\xb1\xd3\xb5\x0d\xa2\x95\x8f\xb7\x13\xf1\xef\xee\x29\x5b\x33\x61\x7a\xcb\x9a\xaa\xee\x1c\x4a\x30\x33\xd2\xa4\xa7\x85\x0d\x8f\x2c\x04\xdc\x31\xd4\xce\xfe\x65\xa8\x04\x03\xc8\x16\xd1\x2a\xc0\xbb\xab\x9c\x6f\x24\x65\x63\x82\x2d\xaf\x6d\x10\xc5\xf3\xeb\x69\xa4\x19\x16\x97\x73\x04\xc7\x7d\x72\xf6\x15\xd8\xb7\xa9\xd1\x61\xc5\xde\xa1\xda\x21\x5a\x85\x78\x1f\xd3\x26\x49\xbd\x2f\xde\x5d\x88\x09\xf8\xa1\xd8\x2f\xc0\x3d\x4f\xab\xdf\x26\x78\x78\xe5\xa3\x3e\xbd\x8f\xf5\xbc\x1c\xeb\xcb\x7e\x17\x18\x40\xf6\x88\xd6\x63\x5c\xeb\x22\xf1\x81\xbf\xfc\x7a\xe0\x54\xed\xcb\xc1\x1c\x1f\xd3\x51\x14\x87\x6f\xcc\x17\x3b\xf2\xb7\x09\x33\x64\x04\xb9\x95\x6a\x0b\x7c\x30\x80\x1c\x10\xad\x27\xb8\x96\xd4\x9f\xa4\x85\xce\x85\x94\x6c\xe9\x4b\xad\xef\x0c\x17\x54\xc4\xc9\x76\x30\xe5\x24\x61\x66\xd2\xce\x6c\xaa\xb7\xab\x6b\xb4\xb0\x3b\x91\x23\xa2\x55\x84\x77\x62\xc9\xf0\xf9\xb4\x4a\xf4\xea\xc5\x71\x83\x5e\x0b\xb8\x63\xb0\x99\xe7\x3d\x63\xbf\x90\x59\x49\x74\x4a\x4d\xef\xae\x4b\xb8\x95\x05\x0c\x20\x27\x44\xab\x18\xef\x75\x15\x90\x9a\x1c\x55\x38\xcf\x33\x96\xdb\x58\x15\x27\x16\xc2\x7b\x1d\x37\xc3\x02\x68\x67\x77\xb4\xa9\x1d\x03\xbc\x43\xa9\xbc\x60\x00\x39\x23\x5a\x25\xb8\x56\x66\xe5\xf6\x65\xd2\x9b\x4b\x4a\x06\xa9\x55\x2f\x35\x6f\xdb\xf1\x3d\x24\xa4\x3c\xc5\x31\x64\xb3\xd3\x19\xdf\x19\xff\x2b\xd4\x87\x0e\x06\x90\x0b\xa2\x55\x8a\xf7\x78\xe2\x05\x5f\x1b\xc4\x3c\xc4\xec\xc7\x3c\xa9\xbc\x99\x47\x2e\xd3\xc9\x7c\x5a\xa9\x68\xd3\xc1\xb1\x45\xe3\x8f\x8b\xc3\x85\x10\xec\x49\xdd\x15\xd1\x7a\x8a\xf7\x1d\x36\xd1\x53\xbf\x6d\x95\x3e\x7f\xd7\x09\x10\x68\x39\xef\x79\xd2\x83\xe3\x0b\x60\x3f\x18\x71\x2c\xdf\xc9\x61\xa5\x3a\x2e\x42\xc2\x0c\x03\xc8\x0d\xd1\x2a\xc3\xfb\x64\x46\x5b\xa2\x16\xb5\x33\x20\xa4\x7e\xbd\xc6\x3c\xd9\x82\x29\x74\x8d\x60\xa6\xc1\x8a\x2f\x30\xeb\xd4\xfb\x9a\xab\xd4\x4f\x7a\xb1\x17\x08\x77\x44\xab\x1c\xef\xd8\x56\xe3\x68\x78\x72\xfb\xea\x06\x9d\xb6\x56\xe5\xa4\x82\xf1\x03\xcd\x7d\xc5\x6b\x9b\x73\x3f\x2d\x7e\x48\x8b\xa2\x1f\xf8\x1c\xb9\xc3\x00\xf2\x40\xb4\x9e\xe1\x5a\x69\x8f\x8f\x5c\x64\x4e\xb3\x9c\x95\xc9\x99\xa4\xf7\xf8\xde\xbf\x92\xa5\xe3\x9c\xd2\x7a\xf5\x31\x6b\xd4\x1f\xc7\x08\x77\xd4\xfd\x93\x30\x80\x3c\x11\xad\x0a\xbc\x13\x5e\xc2\x62\x62\x00\xbc\x45\xd6\xdb\x14\x36\x3b\x22\xfa\x55\xdc\xe7\x88\xe5\x95\x5d\xb3\x51\x72\x6c\x04\xb7\x2e\xb7\x54\x32\x11\x0c\x20\x2f\x44\xeb\x39\xae\xc5\x49\xe1\x2b\xd2\xaf\x31\xc1\xbd\x5c\x10\xaf\x5c\x4a\x70\x97\xfd\xbe\xa8\xf4\x31\x87\xd3\x6e\xae\xc3\x75\xc7\x3c\x39\x50\xb7\xb0\xfb\x97\x37\xa2\xf5\x02\xef\x13\xef\x59\xbd\xc0\x5f\xd7\x42\xfa\x89\x7c\x6e\x54\x19\xab\x7a\x2c\x25\x4e\x30\x89\x73\x3c\x98\x16\x20\xf0\xd0\x9f\xd5\x7a\x74\x0a\x7b\x63\xe7\x83\x68\x55\xe2\xdd\xbc\x5e\xf4\xd7\xa1\x1e\xce\x19\xa9\x56\x24\xaa\xa3\xf2\x39\xba\xcf\xff\x51\x60\x2c\x4d\x3d\xeb\x2b\xef\x7d\xf5\x12\x8f\xc5\x3b\xd8\x8b\xa0\x2f\xa2\x55\x85\x6b\x85\x99\x3f\xe7\x71\xb4\x6f\xe2\xac\x25\x91\x7f\x3b\xff\x53\x38\x68\x56\x6a\x4d\xc4\x50\x74\x59\xff\x60\xea\x2e\xbf\x76\x74\x39\x0b\x0c\x20\x3f\x44\xab\x1a\xd7\x32\x49\xf0\xaa\xfa\xfe\xec\xd8\xdc\x77\x8f\xce\xa1\x3f\xd6\x55\x44\xe5\xf1\x6b\xbf\x06\xc7\xbb\xb8\x9c\x3a\xc9\xf8\xf5\x64\xcd\x65\x61\x00\xf9\x23\x5a\x35\xb8\x96\xe1\x57\x0e\x5f\x33\x32\x01\x59\x15\x4e\x41\xd2\x8a\x2f\xed\x2f\x7e\x3f\xfa\xe8\x5c\x55\xba\xf1\x8d\xcf\xf9\xbe\x56\xb3\x17\xe7\x59\x18\x40\x01\x88\x56\x2d\xae\x95\x32\xa1\x34\x6b\x68\x4d\x56\xea\xce\x52\x5d\x14\x43\x3a\xcb\xfb\xce\x79\xff\xa7\x73\xb4\xc0\xe7\xb9\xaa\xf3\x01\x15\x1d\x85\x04\x30\x80\xae\x21\x5a\x75\x78\x4f\x1b\xea\x7c\x24\xf8\xea\x73\xe4\x9a\x66\xd8\xaf\xe5\x1b\x3e\xb8\x54\x74\xe1\xd0\x2c\xab\xbf\xee\x45\xeb\x9a\xf9\x64\xef\x8a\x25\xd6\xba\x8e\x68\xd5\xe3\xed\x5f\x09\xeb\x0a\x2e\x57\x9a\xcf\x2a\x52\xb1\x93\x32\x92\x3e\x3b\x16\x45\x40\x30\xb1\x2f\xc2\xfa\xa7\xc4\x29\xd5\xfd\x4c\x94\x16\x80\x01\x74\x03\xd1\x6a\xc0\xb5\x66\x0e\xd6\x65\x76\x92\xd0\xba\x9b\x1c\x1d\xe6\xd3\x75\xa2\x1b\x4d\x2d\x9d\xd2\x2c\x7a\xcb\x81\x80\xbd\xff\xcf\x81\xca\x7f\x1e\xfb\x06\x22\x5a\x2f\x71\x2d\xcb\x42\x85\xb8\xb3\x6f\xab\x47\x9f\x05\xa9\xd8\xde\x0c\x18\x2b\x7c\xa6\x56\x30\x40\x3b\xd3\xbe\x65\xb3\x61\x91\xc3\xf3\x2a\x17\x82\x01\x14\x84\x68\x35\xe2\x5a\x5b\xe3\xd3\x8d\xad\x81\x9d\x63\x5b\xe9\x67\x52\x5d\x7f\xf5\x55\x09\x9f\x6d\x3c\xad\xe0\xbf\xdf\x68\xb1\xb2\xe6\xbd\xde\x1c\xe8\x09\x03\x28\x18\xd1\x7a\x85\x6b\xbd\xba\x57\x46\x70\x99\xec\x49\x76\x95\x05\xd7\xb1\x60\x0b\xd7\x4b\x12\xab\x0f\xcf\x71\xf7\x95\x06\x2b\xcc\x1d\xf6\x3b\x5c\x38\xa3\x0e\x03\x28\x04\xd1\x7a\x8d\x77\xbe\xf7\xaa\xb9\x28\x9b\x75\xd2\xef\xe0\x78\xf8\xee\x2f\x71\xd5\x9a\x6b\xde\x8b\xe6\xee\xfa\xdf\x8b\x8c\xe6\x3e\xc6\x52\xb7\xad\xf3\xc2\x00\xba\x89\x68\x35\xe1\x5a\x76\x5c\xd3\x7f\xb6\x4c\x82\xa1\xd8\x0f\x45\x81\xb1\x2f\x74\x0b\xba\x3f\x6d\x7a\x30\xae\xc8\xaa\x33\x55\xbb\x12\xf9\xf9\xfa\x52\xc0\x00\xba\x85\x68\xbd\xc1\xb5\x68\xbe\xf0\x79\x27\x0a\x25\x3c\xa3\xaa\xb7\x3a\x8a\x97\xde\x68\x9b\x35\xca\x57\x8b\x1a\x71\x10\x7f\xb9\xfd\x2b\x49\x37\x34\x8d\x11\x06\x50\xe8\x3f\x0c\x6c\xff\xf4\xd7\x71\xff\x1a\xd8\x9a\xf1\xbe\x33\xe3\x46\xdf\x94\x20\xf3\xdd\x86\x67\x77\xff\x97\x60\x2d\x8c\x66\x68\xb6\x88\x89\xe6\x5d\x2c\x8d\xb6\xb0\x08\x40\x09\xb0\x48\xc2\x00\x0a\x43\x5c\x91\x16\xbc\xc7\x26\x50\x79\x44\x09\x87\x2e\x4a\x2c\x80\xe8\xe4\xa0\x4e\xd6\xa7\x07\x3b\x4d\x5d\x8d\xac\xbc\xb4\x3a\xf2\x2f\xd7\x9b\xbb\x99\x6c\x61\x00\xc1\x88\xd6\x5b\x5c\x8b\x23\x3d\x91\x21\x77\x12\x7d\x67\xeb\x78\x62\x0e\x11\x95\x46\xad\xfd\x65\x51\xd2\x86\xb2\xf0\x3b\xde\x70\x0e\xb1\xe8\xd6\x20\x15\x0c\xa0\x70\x44\xab\x15\xd7\x3a\xdf\x5b\xb4\x62\xb8\xd0\x44\xfb\xe1\x9b\xc8\xa2\xda\x53\x26\x11\xe9\x70\xa1\x21\xb3\xe6\x32\x76\xcd\x6b\xe1\xaf\x4e\x37\x4d\xd0\xc3\x00\x8a\x40\xb4\xda\x70\x2d\x59\xe1\x9c\xa6\xa0\xb0\x97\x36\x1a\x69\xba\x4a\xdd\xce\x30\x13\x01\xc3\x8b\x53\x56\xbd\x9d\x6f\x63\x77\x43\x3b\xa5\xb6\xd5\x51\x30\x80\x22\x11\xad\x76\xbc\xef\xb0\x89\xee\x55\xef\xbe\xe5\x30\xbd\x63\x29\xfd\x6b\x79\x43\x63\x82\x39\x91\xef\x7c\x41\x4c\x05\xc9\x8d\xce\x8a\xcb\xaf\x31\xe1\xd8\x03\xe5\x36\xa2\xd5\x81\x6b\xed\x3c\x6e\x65\xb4\x8b\x52\xac\x7b\xff\x2c\x3d\xc1\x58\xae\x65\x60\xae\x0f\xb5\x4e\xa7\x26\x63\xfd\x22\x7b\xb5\x53\xe3\xd1\x0c\xf6\x8e\xeb\x0e\xa2\xd5\x89\x6b\xb5\x5c\x0e\x2f\x6f\xb0\x2f\x0c\xb0\xa5\xb8\xb4\xd5\x9a\xbb\xd5\xd0\x73\x49\xbd\x9d\x80\xa4\x37\x4d\x77\xfd\x5c\x7e\xe4\x48\x3f\x76\x90\x8c\x42\xb4\xba\xf0\x9e\xf7\x7b\x69\xf0\x12\x1a\x55\x3a\xe9\x90\xf4\xbf\x20\x0f\xa9\x11\xdb\x2e\x7a\x4a\x5d\x4f\x0b\x9e\xea\x53\xf2\xaf\xdc\xda\x6a\x3f\x07\x03\x28\x1a\xd1\xea\xc6\x7b\x6c\xb2\xf9\x5e\x70\xe0\x7a\x36\x6a\xb4\x8f\x15\xa3\xa8\xc8\xd3\xdb\xc7\x50\x59\xe5\x7c\xdd\x4c\x70\xfc\x9d\xf1\xac\x44\xdf\x53\xec\xb0\x7c\x17\xd1\xea\xc1\xb5\x24\xe3\x4e\x54\x84\xa3\x52\xec\x25\x25\x57\x3e\x1c\x34\xc9\xb5\x26\xdd\xf3\xe5\xcd\x0c\xb6\xc9\x55\x3a\xfd\x95\x91\x7c\x46\xd5\x0f\x06\xd0\x3d\x44\xeb\x1d\xde\x8d\x4a\x31\x7b\x78\x65\x32\x5a\xc5\x42\x99\x2a\x82\xfe\xb7\x30\x4f\x78\xd8\x50\xf2\xd6\x27\x8d\xe5\x0b\x42\xe6\x31\xa7\xf7\xdb\xb0\x17\x88\x18\x44\xab\x17\xef\xfb\x24\x1b\x46\xa6\x76\x1b\x9d\xb4\x17\x3d\xbd\xbd\x42\xb8\x47\x46\x4b\x57\x62\x1a\x83\x0d\x1d\x3d\x1e\x27\x0a\xa9\x8e\xa4\x45\x89\xc3\x00\xba\x8f\x68\xf5\xe1\x5a\x67\xaf\xdb\x94\xdc\x21\x53\xfa\x50\x31\x25\x4e\x6e\x3d\xfe\xc0\xf4\x7a\x8c\x2c\xac\xb4\xd4\xdd\x4b\x5f\xd9\x49\xb5\x57\x5e\x4a\x0d\x03\x28\x16\xd1\xea\xc7\xb5\x0e\x94\x63\x89\x6b\x46\x2f\x92\x3c\xee\x0f\xdb\xe2\xf8\x2c\x40\x41\x6e\x93\xe0\x6a\xed\xfd\x44\xd5\xa8\xbc\x6e\xde\x8d\x89\x50\x14\x06\x50\x1c\xa2\x35\x80\x6b\xfd\x29\x9c\xb6\xca\x0c\xf1\xa0\x51\x6d\x98\x06\x9f\x6e\x18\xd9\x06\x7d\x22\x31\xb1\x69\x35\xa2\x48\x96\x77\xf9\xfd\x4c\xea\x36\xf6\x62\x13\x8f\x68\x0d\xe2\x5a\xdd\x0b\xd1\x61\xb5\x9a\x07\xae\x7b\xa6\xca\xab\x0a\x67\x1a\xe6\x5f\xf5\xd3\x97\x25\x49\xf3\xcb\x72\x49\xbf\x4e\x73\x3b\x75\x01\x3b\x34\x24\x20\x5a\x43\x78\x43\xc3\x4e\xaa\xd2\x77\xf1\x4b\x79\xf1\xf7\x77\x09\x12\x3d\xb8\x39\x18\xe5\xab\xac\xac\xc4\xab\xe3\xaf\x3c\x03\x12\x42\xf6\x99\xe7\x61\x00\x25\x22\x5a\xc3\xb8\x96\xc1\x3d\xc6\xcc\x08\x97\x53\x97\x32\x26\xf9\x0e\x9e\x9c\x16\x7c\xf3\x40\xff\x6c\x94\xe3\xf5\xa1\xcc\x5e\x5d\x01\xad\xf3\xf5\xec\x4e\x30\x80\x92\x10\xad\x11\x5c\x8b\x29\x8e\xaf\x20\xfb\x81\x4f\x87\xc4\xb9\x30\xbb\x2d\x94\x81\xf5\xa5\xfe\xaf\x0a\x0d\x27\xa9\x64\xd6\x4f\xd9\x14\x15\x6d\x8e\x98\xc2\x00\x4a\x46\xb4\xde\xe3\xdd\x5c\xbc\x32\xcd\x61\x9f\x17\x4d\x66\xab\xcc\x5e\xdf\xfc\xc8\xba\x4b\xca\xfd\x7c\x56\x28\xc5\x7a\xe3\xac\xb7\x72\xeb\xf7\x68\x75\xec\x20\x99\x82\x68\x8d\xe2\x5a\x8d\xdc\x5c\xf2\xcc\x34\x0a\x86\xd9\x43\x2a\xf5\x6f\xfc\x9e\x8b\xff\x29\xe7\x18\x84\x69\x55\x98\xfb\x48\xac\xfb\x86\xca\xdc\x4e\xc1\x00\x4a\x45\xb4\x3e\xe0\x5a\x31\xaf\x42\xe4\xf9\x2a\xa4\xf3\xc5\x86\x58\x84\x0a\x9b\xec\x3e\x6a\x56\x75\x6d\x84\x9b\x7f\x7f\xcc\x5f\x1b\x75\x55\x9b\xb9\xfd\x12\x0c\xa0\x07\x88\xd6\x18\xae\xd5\x9a\x12\xac\x0d\xc5\x6e\x59\x70\x89\xde\xec\xe1\xb2\xaa\xbe\xcf\x9b\x76\x92\xde\xd7\x7c\xe5\xfc\x65\x67\x06\xf6\xc4\x23\x03\xec\xb5\x23\x0d\xd1\x1a\xc7\xb5\x4a\xde\xa3\xae\xae\xad\x1d\xfb\x36\xc7\x99\xa8\x71\x8e\xa7\x64\xed\x13\x8b\xf9\xca\x7d\xc9\xbc\x10\x3d\x93\x72\x3b\x35\x23\x6b\xec\x3a\xa6\x23\x5a\x13\x78\xe7\x55\xef\x3f\x1d\x2b\x57\xa4\x31\x8b\x81\x25\x62\x4e\x54\x5b\xdf\x18\x6d\x75\x09\x02\x7f\xcd\x34\x4a\xfe\xca\x4c\x07\x17\xa5\xc8\x61\x00\x3d\x44\xb4\x3e\xe2\x5a\x3f\xaf\xd5\x4d\xb5\x76\xd5\x97\x2d\xf9\xf9\x14\x44\x69\x68\x9b\x90\x4b\x2c\x6d\xca\x74\x3f\x3e\xf5\x69\x25\xfb\x90\x8c\xdb\x0c\xbb\xaf\x66\x20\x5a\x9f\x70\xad\x8e\x47\xfd\xc4\xb6\x27\x5e\x72\x56\x37\x5d\x74\xbb\x48\xc4\xf2\x4e\x99\xf0\x84\xb4\x71\xbf\x7c\xc2\x93\x8c\xb9\x5c\xb2\x2e\x45\x31\x18\x40\x99\x88\xd6\x24\xae\x45\x1e\xd4\xae\xf3\xeb\x9d\xd1\xb0\xce\xe7\x2c\x35\xb9\xf3\x26\xc7\x75\xac\x3a\x0a\xc5\x56\x84\x0f\xfb\x5e\x73\xba\x52\x9e\x58\x26\x83\x01\x94\x85\x68\x7d\xc6\xfb\xe0\xa0\xde\xa0\x43\x2e\x57\x41\x38\x0b\x38\x05\x49\xfb\xa5\xd7\x25\x05\xd5\x1f\x92\x5d\x5f\xfb\xe4\xd0\xb3\x28\x9c\x77\x9a\xda\x1b\x06\x50\x36\xa2\x35\x85\x77\xad\x4d\x14\x50\xbe\xee\xc0\xff\x20\xdd\x94\x90\x55\x9e\xec\xa2\x76\x8e\x3d\x65\xfb\x9f\x87\xdb\xe2\x6e\x27\x53\xd6\x3a\x87\x2d\xb1\xc3\x5f\x0e\xa2\x35\x8d\x6b\x69\xf9\x92\x93\xce\x0a\xdb\xdc\x3b\x1d\x45\x5d\x92\xe6\x68\xb3\x97\x03\xd1\x59\x77\xd8\x7a\x49\xed\x86\xfa\x2c\x1b\xdd\x5d\xc6\xee\x13\xb9\xff\x30\xb0\xfd\x53\x14\xe5\xaf\x81\x6d\x06\xf7\x97\x73\x4b\x72\xbc\x94\x3f\x3b\x73\xed\x77\x8b\xa7\x69\xab\x44\x7d\xd7\x1d\xcd\xea\xfd\x6b\xbb\x3c\x06\x36\x1b\xe7\xee\x6d\xea\x15\x63\x27\xcf\x47\x88\x2b\x32\x8b\x6b\x05\x86\x31\x95\xeb\x68\x0a\xde\x1a\xfc\xf2\xb9\x33\x4b\xfd\xa1\x41\x5e\xad\xe1\x23\xc3\x4f\x62\xbc\x73\x2d\x34\x61\x57\x8d\x88\xb1\x17\x9b\x3c\x44\x6b\x0e\xef\xae\x52\x4a\x7d\xe0\xcf\x01\xf4\xe4\x49\xf9\x46\x61\x88\x15\x03\xc5\x32\x30\xb8\x5a\x5f\x5e\x53\x58\x3f\xae\x5d\x4b\x7c\xa3\x4e\x0e\x06\x50\x3e\xa2\x35\x8f\x77\x32\x70\xd3\xba\xfc\x18\x3d\xf2\x2c\x44\x94\x6d\xbc\x8a\x69\x22\xab\xb9\x28\xf4\xdb\xaf\x93\x92\xcb\x1a\x75\x11\x9f\x28\x4c\x18\x3c\x60\x00\x15\x20\x5a\x0b\x78\x3b\x11\x4a\x87\x52\xb3\x50\x56\xcc\x8d\x61\x8b\x04\xa4\xbd\xde\xf5\xeb\x55\x3b\x4f\x4d\xbf\xa0\x7a\x69\x55\x44\x37\xe7\xc8\xc7\x08\x06\x50\x21\xa2\xb5\x88\x77\x71\x6e\xf2\x4c\xdb\x7b\xb7\x4c\xc0\x71\xf9\x0e\xc5\xc2\x28\xb3\x98\xcb\x66\x36\xd1\xb5\xf1\x57\x6d\x02\x84\x16\x0d\x26\x25\x76\x9a\x30\x80\x1e\x23\x5a\x5f\x70\xad\xfa\xd3\x84\xb5\x37\x5f\xb8\xa8\xd3\xdc\x1d\x16\x17\xa4\x4e\x9f\xfa\xc3\x30\xdd\x7f\x46\xe4\xd9\x9d\xc6\x1a\x8e\x0f\x20\x5d\x15\x6b\x3d\x41\xb4\x96\x70\x2d\xde\x9c\xe4\x44\x66\x5f\x6f\x6d\x27\x7a\xf1\x47\x5c\x3e\xe7\x2f\x1b\x09\x48\x04\x4c\xdb\x2f\x27\xc7\xbc\xfc\x2d\xf6\x7a\xa3\xc8\x07\x06\x50\x11\xa2\xf5\x15\xd7\x12\xcf\xcb\xca\x89\xa6\x37\x77\xc6\x04\x05\x56\xc3\x4d\x4b\x49\x67\x7c\xbc\x65\x18\xfa\x74\x32\xb6\xf6\xec\x2d\xea\x69\xc6\x19\x60\x00\x15\x23\x5a\xcb\x78\xeb\x48\x1d\x19\xab\x5a\x9f\xf2\x2b\xb9\xf1\x5e\x41\xcc\xc8\x49\xbe\xc8\xdb\x57\xab\x3c\xa3\x45\x6c\x55\x2e\xa0\x8e\x25\x8a\xd3\x60\x4f\xea\x25\x88\xd6\x37\x5c\xcb\x9d\xb8\x7f\x8b\xe4\x61\x17\xba\x8d\xf8\x6c\xf5\xf8\x7a\x68\xa8\x2d\x14\x95\xa1\xf1\x42\xaf\x59\xd8\x28\xba\x99\x65\xb9\x09\x7b\x92\x2a\x45\xb4\x56\xf0\xbe\xcb\xd3\x9f\x71\x4c\x48\xf8\xfa\xfd\x63\x0b\x04\x9e\x67\xb6\x2f\x99\x19\x8d\x96\x6b\x88\x0c\x7f\xcc\xfb\xda\x3c\x69\x16\xaf\xc8\xce\x0a\x03\xe8\x29\xa2\xf5\x1d\xef\x46\x45\x80\xa2\xfd\xf6\xe5\xa1\x30\xbf\x03\x57\xd3\x01\xdd\xba\x48\xaa\x6b\x7c\x25\xc7\x3d\x32\xe3\xbb\x92\xec\x8d\x26\x8f\xf6\x64\x61\x00\x95\x21\x5a\xab\x78\x8f\x73\x7c\xe3\x4f\xdb\xdb\x72\xf3\x7a\x93\xb3\x3f\xa4\xb6\xed\xb5\xcf\x20\x0e\xba\x51\xdd\xef\x0c\x9d\xd9\x0b\x98\xb8\xf1\x0d\x73\x1a\x06\x50\x39\xa2\xf5\x03\xd7\x7a\xa7\x12\xff\x06\xda\x27\x8b\x34\x0b\xf8\xe8\xdd\xa4\x91\x7d\xf0\x9a\x2e\xd5\x99\xcb\x49\x66\x84\x6b\x20\xfc\x8c\xb6\x75\x8e\x1b\x0c\xa0\x67\x88\xd6\x1a\xae\xf5\x28\xe8\xdb\x8b\xb7\xba\xbc\xf3\xf5\xab\xc6\x26\x89\x45\x82\x12\x4f\xbb\x04\xcb\xed\x43\x1e\x66\xb2\x7e\xa5\x8a\xf0\xe2\xcc\x54\x82\x01\x54\x81\x68\xfd\xc4\xb5\xba\x28\xba\x44\x87\x31\x0f\x29\x7c\x4d\x69\x9b\x1c\x19\xed\x3f\x9c\xa3\xd0\x8f\xcf\x28\xb3\xf9\xe3\x12\xa1\xc1\x98\x4c\x21\x81\x3d\x11\x3f\x47\xb4\x7e\xe1\x5a\x0b\x64\xf3\x95\x6f\xde\x25\x0f\x33\x0b\x08\xa6\x38\x71\xc7\x07\x0f\x49\x3c\x54\xe3\x0b\xbe\xab\xdc\xde\x12\x20\x74\x31\x98\x94\x05\x06\xd0\x0b\x44\x6b\x1d\xef\x11\x32\xa5\xd0\x1d\x96\x81\x1f\xc5\x33\x13\xf4\x97\x85\xee\x26\xf4\xcd\xaa\xb9\x24\x6c\x52\x2c\xd4\xe8\x4f\x6a\x1d\x66\x55\x8f\x3a\xc2\x00\xaa\x44\xb4\x36\x70\x2d\xdf\xc7\x96\x70\x4b\x14\xa9\x1d\x67\x85\xa9\x93\x60\xe6\xec\xed\x01\x3d\xa1\xc9\xcf\xa6\x51\xde\x76\xba\x63\x6a\xaf\x6a\x03\x24\x60\x00\x55\x21\x5a\xbf\x71\x2d\xed\xe4\xe5\x4b\xa6\x51\x15\x77\xab\xc2\x19\x5b\x6a\xc5\x84\x05\x53\x31\x39\x89\xe2\x21\x51\x3b\xc1\xf3\x59\x3d\x9b\x57\x3b\xb0\x37\x17\xd5\x88\xd6\x26\xde\xcd\xab\x10\xe3\x8b\xfb\xc9\x4f\x0b\xa2\x13\x0f\x2a\x2d\x5d\xda\x24\x38\x09\x1e\xb4\xbd\xa6\x89\x5e\x05\x74\x7d\x74\x17\x26\xbe\x61\x07\xc9\x1a\x44\x6b\x0b\xd7\xca\x70\x1a\xfd\x76\xc2\xe6\xdb\xdb\xdf\x63\xaf\xa2\xfa\x77\x23\x1f\xcb\x04\xf4\x18\xa6\x49\xf2\xc3\x65\xfd\xbc\x61\xf4\x8e\xfc\xd8\x9b\x8b\x5a\x44\x6b\x1b\xd7\x5a\xca\x7a\xd4\x42\xb7\xee\x2e\xf7\xc3\x98\x81\x07\xb3\x1c\x51\x65\xfb\xf4\xfc\x50\xdf\x54\x66\xf8\x39\x69\x4c\xcc\xc1\xe2\xac\x17\x0c\xa0\x3a\x44\x6b\x07\xd7\x9a\xba\xae\xcc\x75\x2b\x20\x9a\xe5\x5e\xdf\x89\xd8\x93\x4d\x56\x11\xbe\xe3\xcd\x0d\xc4\xb3\x4b\x49\x07\xb2\x89\xdd\x5c\xc7\xf2\xb1\xe7\xaf\x7a\x44\x6b\x17\xd7\x8a\x7e\x1c\xb1\xcb\xf0\xb4\x69\xaa\xf3\x81\xb8\x01\xef\x53\xfb\x98\x59\x69\xc3\xa0\x68\xca\x03\xe2\x1f\x54\x37\x6e\x39\x33\x57\xab\xc0\x00\x6a\x40\xb4\xf6\xf0\x1e\x21\x93\xad\xb6\xf5\x0d\x47\x9a\x1d\x4e\x2f\x58\x11\x4f\x46\x7d\x27\x68\x74\xd4\x0b\xcc\x5b\xea\x9e\x8a\x08\x60\x7b\x5c\x1c\x89\x1d\x1a\x5e\x22\x5a\xfb\xb8\x96\xc4\x8e\x7f\xac\xc6\x95\x03\x67\x43\x27\x07\xa9\xe3\xa6\xa9\xca\xd6\x04\xbc\x64\xa9\xe9\xb7\x9b\x4c\xad\x9e\xf3\x5d\x14\x4d\xb7\x85\x01\xd4\x88\x68\xfd\xc1\x7b\x02\xa5\xe0\x93\xb4\xdc\x55\x14\xef\x72\x63\xa0\xfa\xc9\xc5\x14\xaf\xc3\x3b\x5f\x0b\xd4\x94\x93\xe4\x44\x86\x05\x3d\x5c\x29\xda\x75\x60\x00\xbd\x42\xb4\x0e\x70\x2d\xa5\x81\x36\xb6\x33\x65\xf2\x14\xd5\xc5\x74\xe5\xb3\xae\x49\x22\xaa\x97\xb8\xee\xed\x57\x36\xce\x12\x88\x9f\x12\x67\x1d\xd0\xc6\x0e\xa5\xaf\x11\xad\x43\xbc\x21\x5e\xfe\x30\x2c\xa7\x9e\x61\xf5\x75\xbf\xc6\xd5\xe3\x65\x16\x62\x0c\xd4\x6e\x34\x4a\xd4\xe3\x0c\x73\xe9\x5b\x43\x4e\x55\xba\xa4\x30\x80\x9a\x10\xad\x23\x5c\xab\xa1\x01\x76\xbf\x3e\x69\x77\xaa\x8d\x0e\x25\xd2\x7e\x86\x24\x91\xe6\xe3\xfb\xab\xc9\x4e\x72\xc6\x01\xae\x30\x49\x7f\x83\x87\x27\x0c\xa0\x37\x08\xd6\x00\xed\xbf\x4b\xd3\xfd\xef\xc0\x06\xd0\x78\xc5\x35\x12\xed\xd8\xc6\xc4\x61\xba\x93\x60\x5e\x22\xc3\xc2\xbb\x31\x94\x88\x4b\x5a\x2f\x66\x56\xda\x51\xf7\x30\x35\xaa\xb3\x1c\xc5\x01\x03\x08\xb1\xb8\x06\xd0\x78\xcd\xb5\xab\xa5\x68\xbf\x3d\x8f\xa5\x9b\xc4\x0f\xe2\x5e\x49\x5c\x3b\x31\x97\x7c\x55\x64\xf1\xa2\xf4\x7b\xcd\x52\x59\x7f\xbb\x90\x83\x7e\x05\x18\x40\x88\xcd\x35\x80\xc6\xab\xae\x01\xad\x85\xdd\x12\xab\x39\x87\xb7\x5a\xbb\xc7\x14\x93\x97\x27\xd3\xf7\xb8\xb4\x0b\x96\x48\xfc\x28\x22\x47\x5f\xde\xca\xe5\x62\x84\x01\x84\x58\x5d\x03\x68\xbc\xee\x1a\x4f\x59\x3d\xab\x3c\xdd\x0b\x31\x15\x35\x7d\xa7\x0c\x9d\xfd\x98\xea\x6c\x6f\x79\x32\x41\xc6\xd4\x33\xfe\x7a\x59\x62\xab\xaf\x09\x61\x00\x21\x76\xd7\x00\x1a\xaf\xbc\x36\xc5\xfe\x3d\xb3\x61\x6e\x23\x88\x6d\x2b\x81\x57\xd0\xfb\xf8\x54\xb9\x9b\xf9\x65\xcd\x86\x24\x96\x6f\x91\xed\x57\x99\x04\x6b\xb0\xdb\x0c\xb1\xbc\x06\xd0\x78\xed\xb5\x11\xd2\x74\x19\xfd\x14\x65\x42\x2a\x2d\x3b\xd1\x74\x9f\x0f\xe6\x16\x2f\x3b\xaa\x18\x4b\x4d\xaa\x3b\x46\x52\x3a\x64\xec\x6e\x5a\xc0\x00\x42\x6c\xaf\x01\x34\x5e\x7d\xcd\x31\x9b\x41\x64\x3e\xc0\xfc\xd4\x73\x16\x79\xb5\x85\x4f\xc5\x2b\xe9\xf6\xaa\x21\x7d\xe3\xb6\xd4\x66\x5b\xa3\x9f\xb3\x0c\xbb\x15\x61\x00\x21\xd6\xd7\x00\x1a\xaf\xbf\x36\x5d\xe1\x13\xff\x61\xde\xe8\x72\xd2\x6e\x54\x53\xd8\x8a\xab\xc4\xe7\x46\x6b\xcf\xba\x84\x94\xf0\x24\x9f\x4d\xd3\x76\xc9\x5d\x51\x18\x40\x88\xfd\x35\x80\xc6\x2b\xb0\xb1\xbe\xb2\x22\x79\x3e\xd3\x83\x79\x53\x9c\xff\x70\x82\x45\x98\x6d\x45\x64\x32\x83\xf3\xc3\xd6\xa3\x30\xb0\xf2\x23\xc1\x5d\x51\x1d\x06\x10\x62\x81\x0d\xa0\xf1\x1a\x6c\x4d\xcf\x34\x5e\xd0\x5a\x73\x9e\xbc\xda\x44\xe0\x21\x71\xc3\xb7\xe6\x4d\xe1\x9e\x2b\xdb\xb3\x4e\xdd\x96\x12\x66\xf6\x49\xc6\x44\x35\x18\x40\x88\x0d\x36\x80\xc6\xab\xb0\x3d\x2b\x08\xfb\x4c\x8b\xea\xe0\x8a\x2a\x7f\x54\x7f\xa2\xc5\x76\x93\x32\xe2\x9b\x78\x82\x8a\x28\x79\x70\x46\x3f\x6a\xad\xd2\xfc\x04\x0c\x20\xc4\x0a\x1b\x40\xe3\x75\xd8\x04\x1e\xcd\x0d\xd5\x4a\xc4\x2e\x0e\xbf\xfc\xbe\x66\xd0\x52\x14\x47\x3e\x36\x68\xb8\xe6\xb4\xb7\x68\x3e\x57\xb3\x27\xfd\x9e\x08\x0d\x03\x08\xb1\xc3\x06\xd0\x78\x25\x36\x16\x4b\x49\x37\x61\xeb\x66\xe6\x2d\x2f\xbf\x88\xf1\x8c\xcf\xfb\xdb\x99\x1a\x84\xaf\x12\x78\x6d\x6d\x50\x03\xc2\x56\xde\x17\x4c\x60\x00\x21\x96\xd8\x00\x1a\xaf\xc5\x36\x21\x61\x2d\x5c\x7e\x42\x28\x64\xce\x68\xb8\xc6\x5b\xbf\x4b\x65\xc8\x23\xf6\x03\x5b\x3a\x8b\xe1\xf4\xb7\x11\x12\x74\xf3\xda\x45\x18\x40\x88\x2d\x36\x80\xc6\xab\xb1\xc9\x3f\xf3\x50\x3e\xca\x7a\xdb\xd6\x98\x9b\xd7\xdf\xde\x50\x9a\xab\xd5\xfa\x89\xe9\x8f\xc3\xc5\x6e\x86\x36\xb7\x9b\xc3\xb6\x6e\xd8\xfd\x0c\xb1\xc6\x06\xd0\x78\x3d\x36\xbd\x89\x18\x42\x4b\xaf\xd4\xd0\x2a\x6e\x3f\x76\x13\xee\x10\x72\xa3\x21\x76\x1b\xf9\xe2\x86\xb4\x9a\x68\x72\x1d\xe9\xf5\x5e\x1a\x18\x40\x88\x3d\x36\x80\xc6\x2b\xb2\xad\xd9\x95\xdf\x0e\x7f\xc7\xe2\x77\xa7\xa8\x3a\x66\xe7\xf7\x9d\x6b\xe5\x37\xcb\x2b\xed\x7d\xdc\x83\x5c\xf5\x0b\xac\x27\x9c\x3e\xa0\x60\x00\x21\x16\xd9\x00\x1a\xaf\xc9\xc6\xca\x3f\x6d\x40\x58\x26\xaf\x8c\xe1\x6a\x59\x2e\x69\xea\xf7\xe7\x1c\x2a\xe4\x6b\x35\xec\x64\xb2\x51\x39\xbe\x63\x90\x57\x74\x15\x06\x10\x62\x93\x0d\xa0\xf1\xaa\x6c\xb9\xe1\x82\xc3\xf7\x2d\xff\x94\x7a\xd2\x61\xa2\x5f\x77\x0e\x86\x05\xf0\x84\xbb\xa4\xb8\x41\xf1\xec\x7f\x16\x1a\x08\x19\x1c\xb0\xd7\x7e\xc4\x2a\x1b\x40\xe3\x75\xd9\x5e\x7c\x93\x1c\x14\xe5\x66\xb5\x0d\xf8\x70\x82\xab\xf9\xd6\xcd\x6f\x8e\xbc\x99\x87\x31\xd1\x72\xb6\x7a\xef\xd3\x67\x73\x9a\x47\xe8\x61\x00\x21\x76\xd9\x00\x1a\xaf\xcc\x16\x7e\xf2\xc5\x31\x6e\x3d\x55\x01\xcc\xcc\xe6\xd9\xb5\x52\xca\x91\xe9\x21\xe1\xf3\x2e\x42\x22\x6a\xda\x3a\x09\xd0\x4a\xe1\x1d\xec\xdd\x0b\x62\x99\x0d\xa0\xf1\xda\x6c\x47\x0f\x7f\xda\xdf\xce\x6f\xe2\xfc\x29\x6a\xfb\x4e\xf4\xa3\x14\x9f\xdf\xa1\xe2\x85\x8b\x97\x82\xd0\x85\x06\xf0\xea\xc1\xa7\x22\xec\x2d\x07\x62\x9b\x0d\xa0\xf1\xea\x6c\xa6\x5e\x51\xad\x15\xb7\xd5\x62\x9a\x5e\xa3\x7f\x86\xb2\x0e\x6f\xff\x9c\x2c\x3f\x35\x6b\x14\xc9\x32\xc8\x63\x6f\xae\xdb\x4d\x8a\x3d\x36\x11\xeb\x6c\x00\x8d\xd7\x67\x0b\xab\x50\x22\x09\xf1\x7a\x8e\xb9\x60\x76\x28\x3c\xc2\xad\x45\x5d\xb7\xd0\x27\x7d\xcb\x5a\xee\x43\xfd\xf8\x73\xad\xc4\x16\x5a\xec\x1b\x80\xd8\x67\x03\x68\xbc\x40\x9b\x8d\x48\xba\x06\x07\x8b\x88\xfa\xcd\x5f\x6f\x3f\x15\xdf\x07\xca\x2f\xc8\xba\xbd\x26\xab\xdf\xf2\xc0\xa2\x52\x69\xc1\x3a\xe7\x84\x61\x00\x21\x06\xda\x00\x1a\xaf\xd0\x76\x43\x2f\xac\x37\x5d\xb0\xb2\x71\x29\xe9\x4d\xbb\xf9\xee\x6f\x09\x0d\x8f\x54\x0f\x9e\x69\xc1\x25\x8c\x8e\xa2\xac\x3c\x2a\x18\xc0\x00\x42\x2c\xb4\x01\x34\x5e\xa2\x2d\xca\x06\x1d\x11\xdf\xe1\xaa\xf8\x5e\xf3\xc3\x6e\x36\xb5\x94\xd5\x4f\xbe\xa1\x3f\x55\xab\x5c\x6c\x26\xdc\x9e\x19\xa0\x2b\xe9\x32\x0c\x20\xc4\x44\x1b\x40\xe3\x35\xda\x7e\x8a\xab\xca\x3e\x52\x73\x23\xe2\xca\xd7\x4b\x5f\xe0\x2d\x13\xd6\xbf\xa5\x5f\xde\x10\xcf\xa0\xd6\xb8\xc4\x16\xf4\x85\xa4\x04\x3b\xcc\x21\x36\xda\x00\x1a\x2f\xd2\xe6\x62\x72\xff\xca\x92\xe9\x31\xe1\xb6\x1e\x9f\xe8\x72\x15\x0d\xcf\x5a\x96\x30\xb7\xc9\xc4\x6f\xf7\x24\xb6\xfa\x09\x8e\x8f\x72\x31\xc1\x00\x42\x8c\xb4\x01\x34\x5e\xa5\xed\xf2\xe4\x87\x7b\x44\x76\x2f\xd0\xbf\xa9\x54\xd5\xfd\x4e\x68\xed\xee\x5f\xa3\x99\x8a\xf0\x56\x6d\xa9\x59\xe0\x48\xd8\xe2\x8d\x38\x03\x03\x08\xb1\xd2\x06\xd0\x78\x99\x36\xaf\x06\x7d\xa9\x03\x71\xb1\x01\xca\xfe\xed\x89\x9e\xba\x63\x61\x5c\x72\x52\x9a\xc2\x06\xc9\x43\x16\x87\x93\xfe\x6e\x95\xe1\xd8\xc3\x09\x31\xd3\x06\xd0\x78\x9d\x36\xc3\xef\x13\xa7\xf4\x52\x2c\x47\xdf\xbe\xb1\x3e\xb9\xc1\xf1\x51\xec\xf1\x97\xfd\xaf\xf7\xd4\x9b\xe9\xed\xe2\x8b\xd2\x9f\xdd\x1d\xc5\x0e\xad\x48\x9d\xb6\xff\x19\xe8\xfe\x29\x20\xfc\xf7\x40\x87\x17\x6a\x3b\x4d\x2d\x73\x43\xf4\x6c\xd4\x2c\x35\xe5\x2c\x11\xcf\x83\x37\x1f\x53\x5d\x02\x6f\xf2\xb5\xa7\xde\x9c\x98\xfc\x96\x71\x77\xb6\x9d\x0d\x06\x10\x62\xa8\x0d\xa0\xf1\x4a\x6d\x2b\xf4\xa2\x71\xca\xaf\x3f\xbf\x0c\x71\x52\x6e\x74\x6f\x4b\xbe\xa2\xf6\x3a\xc9\xe1\xf4\x2f\x09\x78\x95\xbe\xab\x8e\x5f\xb2\xcf\x12\x06\x10\x62\xa9\x0d\xa0\xf1\x52\x6d\x13\xd6\xce\x3b\x3b\x81\x11\x4d\x57\x14\x0b\x14\xc4\xc2\x09\x9b\x66\xde\x6c\xb8\x8a\x9a\x5d\xef\xfc\x9d\x74\xff\xdd\xec\x84\xb3\x2b\x0c\x20\xc4\x54\x1b\x40\xe3\xb5\xda\x98\xa7\xec\x6e\x1a\xed\xda\x45\xc5\x3d\x30\xaa\xf8\x78\x18\x62\xa4\x52\x39\x68\x66\xe2\xcb\x59\x9a\x72\xe9\xd7\xc4\xe5\x87\xff\x19\x9b\x10\x5b\x6d\x00\x8d\x17\x6b\x6b\x78\x34\x46\xe1\x3c\xfc\xf8\xd1\xda\xf2\xa1\x73\xf9\x62\xfe\x37\x1f\x29\x5d\x8e\x3a\x67\x7d\x98\xdf\xd7\x26\x64\xb5\xc0\x13\x3b\xe9\x20\xc6\xda\x00\x1a\xaf\xd6\x66\xd9\x50\x33\xee\x58\xc9\x70\x82\x71\xe8\xba\xc3\x74\xee\xc7\x94\xab\x3d\xed\x75\xf3\x4a\x10\xbd\x96\x3e\xdf\xdd\x60\xa3\x21\x2e\x18\x40\x88\xb5\x36\x80\xc6\xcb\xb5\x4d\xad\x1e\xcf\xcf\xbe\x28\x79\xeb\xe1\x50\xc4\xe7\x9b\xe7\x4a\x37\x78\x3e\x4b\xb1\x4d\x28\x9f\x36\x18\xcd\xd7\xcc\x87\x55\x6a\x20\x18\x40\x88\xb9\x36\x80\xc6\xeb\xb5\x2d\x07\x2a\x26\xd7\x6f\x0a\x71\xdb\x93\xad\x4e\xdc\x74\xdd\x1c\xba\xd7\x34\x4b\xbf\xd8\xfd\x30\xd0\xc4\x6c\x0e\x63\xf8\x99\x0d\xbb\x6b\x20\xf6\xda\x00\x1a\x2f\xd8\x36\x63\x27\x7c\xe0\x3c\xa3\xfa\x74\xd8\x4c\x7c\xd4\xc4\xdc\x3c\x5e\xfe\x12\xb5\x5b\xa6\xf6\x1b\x02\xd6\x52\xf5\xfb\x93\x8e\xb2\xfc\x30\x80\x10\x83\x6d\x00\x8d\x57\x6c\xd3\x41\xf3\xf2\xe5\x4d\x63\xa4\xcb\x7e\x0d\x8e\xca\x15\xd2\x25\x5c\xb8\xf7\x86\xfd\x8e\xac\xd7\x46\x19\x55\xca\xbd\x5e\x0d\x19\x0f\x18\x40\x88\xc5\x36\x80\xc6\x4b\xb6\x1d\xe8\xc6\x7f\xac\xe1\x0f\x3c\x88\x5b\xf4\xc8\x6b\x25\xd2\x09\x6e\x0d\x91\x30\x37\x9c\xbe\xa5\xa0\xb2\x84\xd9\x2c\x2c\xb3\xc7\xbe\x32\xc4\x64\x1b\x40\xe3\x35\xdb\x68\xea\x5f\xa9\xca\x51\x61\x0a\xa7\xe3\x52\xec\x0e\xec\xad\xf4\x38\x03\xc8\x7f\x87\x33\x09\x94\x77\x70\x65\xda\xa6\x78\x95\xd3\xc2\x00\x42\x6c\xb6\x01\x34\x5e\xb4\x2d\xbc\x3b\x55\xda\xcd\xf9\x50\x23\xe6\x36\x27\x1c\xa5\xb8\xab\xf5\xca\x4e\xa7\x56\x53\x81\x3b\x6a\xcb\x8d\xa2\xc4\xa1\x57\xe0\x2c\x0c\x20\xc4\x68\x1b\x40\xe3\x55\xdb\xbe\xee\x7f\x35\xb7\x60\x2c\xda\x9b\x38\x7c\x18\x50\xeb\x79\x67\x74\x65\x38\x80\x70\x74\xf1\x41\x7f\xc2\xce\x91\x11\x33\xef\x38\xf6\xd4\x8c\x58\x6d\x03\x68\xbc\x6c\xdb\xcb\x53\xf2\xbb\xa3\xef\x2c\xc2\x1e\xd5\xf1\xec\xd9\xd0\x12\x81\x48\xf2\x67\x1f\x1d\xad\x0b\x86\xe6\x5b\xff\x38\xc8\x85\x68\xeb\xc1\x00\x42\xcc\xb6\x01\x34\x5e\xb7\xcd\xe8\x60\xf8\x28\x97\xe2\x03\x53\x63\xf5\x1d\xd3\x3e\x75\xaf\xfa\xa5\x8d\x9c\x85\xea\xdb\x3d\x2c\xd4\x7e\xae\x47\x8f\x3f\xc6\xf2\xc1\x00\x42\xec\xb6\x01\x34\x5e\xb8\xed\x54\x4b\x46\x0c\x39\xc4\x57\xe8\xc2\xee\x59\x7b\xd5\x43\x48\x86\x65\xf9\xf3\xdc\xac\xe0\xba\xc4\x31\x9a\xbc\x07\x7d\x8e\x17\x34\x60\x00\x21\x86\xdb\x00\x1a\xaf\xdc\x36\x89\x61\xf8\xb3\xe1\xb0\x03\x09\x38\x06\x7f\x3d\xae\xc9\x3d\xbf\x2d\x6b\x64\xaf\x26\xd1\xb1\xc6\x13\x71\xa5\x7f\x10\x0e\xc7\x5e\x34\x10\xcb\x6d\x00\x8d\x97\x6e\x93\xf6\x50\xf7\xf9\x20\x48\x2e\x31\x77\xe6\xbd\xaa\xe9\xcd\xf2\x78\x29\xa9\x96\x0a\x4d\x4e\x33\x8d\x2a\x2a\x4f\x0a\x8a\xfe\x6b\xc6\x30\x80\x10\xd3\x6d\x00\x8d\xd7\x6e\x93\x2e\x2c\x36\xa4\x67\xd4\xb8\xfb\xe3\x4b\xab\x4e\x86\x5b\x0c\x7a\x8d\xae\x81\x88\x74\x47\x26\xc2\xf2\x91\x39\xdd\xc8\x37\x4d\x5e\x18\x40\x88\xed\x36\x80\xc6\x8b\xb7\x7d\x59\x75\x8f\x0b\xcc\xbf\x7b\xe9\xc3\x78\x7f\x29\x4d\x08\xa5\x7d\x1f\x9f\x76\xee\xcd\xd5\x85\x57\xf6\xf5\xed\x85\x61\xda\x33\xe6\x30\x80\x10\xe3\x6d\x00\x8d\x57\x6f\x7b\xbc\x57\x18\x45\xfc\x7e\x93\xa4\x5c\x34\xdd\xf4\x60\xe7\xb1\x9b\x47\xb3\x93\xb8\xf6\x17\x8b\xd2\x9d\xae\x97\x6f\x12\x53\x87\xb1\x37\x0e\x88\xf5\x36\x80\xc6\xcb\xb7\x3d\x1b\xf2\x3f\xac\xd5\x5f\xf1\x29\xc8\x79\xf2\xe4\x5e\x66\x1c\xb3\xab\x45\xeb\x8f\x20\xa1\xd4\x65\xce\x02\xef\x18\x36\xd3\xd3\xd8\x93\x23\x62\xbe\x0d\xa0\xf1\xfa\x6d\x24\x9f\xd2\xfb\xea\xfd\xec\xbb\x95\xb2\xa0\x65\xc1\xfa\x84\xf3\x32\x9d\xb3\xd7\x54\x9e\xfb\x53\x34\xcd\x5b\xb4\xa2\xb3\xef\x62\xc7\x26\xc4\x7e\x1b\x40\xe3\x05\xdc\x84\xe4\xc4\x75\x9c\x03\x24\x28\x0b\x1a\x3b\x1b\x92\x14\x23\xe5\x0d\xb6\x73\x34\x74\x46\x74\xb9\xa2\x16\xa5\xb8\xef\x9f\xb7\xc4\x62\x88\x01\x37\x80\xc6\x2b\xb8\x71\xcd\x5b\x57\x37\x18\xf9\x06\x9e\xde\x8e\xa8\xa4\x2d\x24\x79\x96\xee\x66\xc0\x8e\x96\x1c\xd6\x06\xe9\x71\xd7\xe3\x9b\x88\xe5\x61\x00\x21\x16\xdc\x00\x1a\x2f\xe1\x46\xe4\x7c\xed\x5c\x82\x71\x41\x2c\x6f\xaf\xe6\xde\xd6\xa4\xa5\xad\x8c\xca\x9c\xd5\x1b\x3d\xab\xc4\x56\x8b\xdf\xf3\xab\x6f\x4b\xae\xc0\x00\x42\x4c\xb8\x01\x34\x5e\xc3\x6d\xda\xac\xfb\xd9\xb1\x3e\x2b\xa2\x7e\x4a\x23\x89\xf4\xce\x82\x1c\x99\x94\xe0\xf5\x13\x34\x62\x4d\x1b\xbd\xa8\xad\x82\xe5\x9e\x4b\x30\x80\x10\x1b\x6e\x00\x8d\x17\x71\x2b\x09\x9a\x1f\x34\x93\xd5\xcb\x3a\x35\x4b\x15\x7f\x43\xf9\xba\x2d\xdb\xcf\x9c\x7e\xd1\x7a\x75\x0e\x0b\x07\xea\x4e\xa7\x96\xff\x7c\xe9\x16\x31\xe2\x06\xd0\x78\x15\x37\x8b\xd2\xb5\x3f\xce\xb2\xc9\xf1\x53\x4b\x8e\x7c\x63\x94\x17\xae\x06\x09\x9b\x0f\xa9\x74\x7f\x66\x9a\xb0\x74\x97\xf2\x58\x59\xc3\x5e\xd1\x11\x2b\x6e\x00\x8d\x97\x71\x6b\x25\xd8\x89\x14\x73\x9d\x7f\xe5\x3d\xce\x04\x13\xea\xe4\xba\xee\xf3\x8b\x4e\x37\x1e\xf7\x7b\xa2\x46\x57\xf4\x7c\xc4\xc6\x02\x3b\x83\x21\x66\xdc\x00\x1a\xaf\xe3\x66\x43\x47\x7a\x6c\xef\xdd\xf1\x37\x63\xcc\xbd\xb9\x5f\xdf\x7d\xb1\x6c\xf5\x7a\xf0\x78\x71\x24\x6b\xee\xab\xcd\xf7\xdd\x2f\xb7\xed\xb4\x60\x00\x21\x75\xdc\xfe\x67\xa0\xfb\xa7\x7f\xe6\xe1\xef\x81\x0e\x2f\xe4\x96\xe3\xbc\xfd\xca\x48\xf9\x77\x8a\xe7\x6d\xd6\x94\x07\xd2\xca\x05\x5e\x92\xe8\x67\x27\x33\x34\x2e\x08\xba\x46\xaa\xcb\xf7\x7b\x91\xc3\x80\x10\x31\xe4\x06\xd0\x78\x25\xb7\x53\x24\x67\x5a\xd5\xab\xac\x1a\xd3\x86\xbd\x4b\x98\xfa\x4f\xf7\x8d\xb3\x3c\x29\x77\x31\x74\x7d\x2e\xd6\xcb\x1f\x52\x02\x97\xb1\xc1\x80\x10\xb1\xe4\x06\xd0\x78\x29\xb7\x77\x66\x26\x55\x2c\xab\xc6\x6e\xbb\x76\x26\xb9\x3c\x19\x5b\xb0\x56\x06\x3d\x8f\x5c\xdf\x9b\x86\xc4\x37\x4d\x1d\x7b\x7f\xd4\x00\x0c\x08\x11\x53\x6e\x00\x8d\xd7\x72\xf3\x61\x15\x1d\x53\x91\x32\x21\x4b\x49\x2c\x2f\x76\x50\x5a\xbf\xeb\x5b\xbf\xcd\xbe\xc3\x78\xca\x9d\xe4\x76\xc0\x5e\xed\xd2\xac\x28\x0c\x08\x11\x5b\x6e\x00\x8d\x17\x73\xbb\x4e\xe4\x57\xa4\x39\xb5\x69\xe3\x99\xb5\xe4\x6e\x22\x33\x76\xd5\x40\xa4\x92\x43\x28\xc3\x5b\xdb\x84\xb4\xf6\xd3\xe3\xfe\x29\xec\x6a\x22\xc6\xdc\x00\x1a\xaf\xe6\xe6\x40\x7b\x2d\xec\xc8\x69\x3c\x95\x30\xae\xe1\x54\xaf\x09\x4b\x4c\x60\x7e\xc6\x57\x53\x88\x67\xef\x2b\xf9\xc9\x00\x0d\xaf\x3f\x04\x30\x20\x44\xac\xb9\x01\x34\x5e\xce\x6d\xcb\x3b\x6b\xa4\xac\x44\x72\xfc\x82\xcc\xf5\xbd\xd4\xac\xfc\xa0\x16\x52\x82\xe7\xb7\x47\xbe\xfd\x9a\xa6\x12\x99\x08\xe8\x48\x23\x86\x01\x21\x62\xce\x0d\xa0\xf1\x7a\x6e\x43\x95\xa5\xcd\x17\x7f\xf4\xdb\x54\x7e\x42\x53\x99\xbc\x2e\xee\xaa\x6e\x84\x4c\x42\x3c\xea\x51\xc1\xa5\x36\x39\x85\xbc\xb7\x5d\x60\x40\x88\xd8\x73\x03\x68\xbc\xa0\x5b\x61\x54\x9c\xc6\x73\x5b\x2b\xd3\x29\x36\xc1\xb9\x9f\x9d\xdb\x19\x35\x4e\xb6\x2e\x64\xab\xe9\xce\xd9\xad\xa6\xab\x55\x55\x17\x04\x61\x40\x88\x18\x74\x03\x68\xbc\xa2\xdb\x17\x85\x7e\xfa\xea\x46\x69\xb5\x8d\x7e\xc9\x19\xfb\x6e\xf7\xab\xba\x77\x73\x61\x5f\x35\xd9\x0b\x4e\x51\x7f\xd8\x1f\xef\x65\x93\xc0\x80\x10\xb1\xe8\x06\xd0\x78\x49\xb7\x10\xc3\x0b\x6f\x7a\x18\xcb\x21\xa5\xb3\xce\x63\xaf\xe3\x2d\xb8\x50\x42\xdc\xb3\x6b\xd3\x53\x47\xaf\x3e\x8b\xc6\xef\x77\x36\x52\xc1\x80\x10\x31\xe9\x06\xd0\x78\x4d\x37\xeb\xb3\x5b\x53\x23\xce\x02\x45\xf7\xde\x3b\x7d\x52\x28\x5f\x3b\xe3\x3f\xd9\x78\x7e\x42\x3d\x74\x2a\x91\xcf\xd6\xfc\x57\xfe\xd0\x59\x18\x10\x22\x36\xdd\x00\x1a\x2f\xea\x16\xee\xe9\xc6\x1d\xdd\x28\x9a\x4c\xf1\x5e\xe4\xac\x51\xa6\x05\xdb\xa8\x66\x6d\x90\xd5\x9d\x43\x92\xcf\x1d\x5b\xea\xfb\x15\xf9\x0a\x30\x20\x44\x8c\xba\x01\x34\x5e\xd5\xed\xf0\x4a\x71\xad\xbb\x7b\x8e\x08\xf3\xc5\xd9\xe8\x69\x72\xf3\xed\x2a\x27\x67\x6a\x0b\x66\x2d\x93\xfc\xc7\x8e\x37\x58\xbe\xda\x62\x0f\x27\xc4\xaa\x1b\x40\xe3\x65\xdd\x2a\xa2\x4d\xa8\xc3\x1e\xa2\x4e\xac\xa7\xbe\x99\xe5\x61\xbc\xbb\x2e\x9a\x09\x77\x24\x8f\xbc\x58\xe6\xd6\x77\x7d\x19\xcb\x54\x4a\x0d\x03\x42\xc4\xac\x1b\x40\xe3\x75\xdd\x7a\xbf\xcf\x54\x33\xf4\x99\x33\x9a\xf4\x9d\x5f\x15\x84\x9f\xc7\xc5\x7e\x59\xb9\xee\xf5\x56\x82\x5e\xd3\x5c\x37\xf6\xd7\xf8\xa6\x18\x0c\x08\x11\xbb\x6e\x00\x8d\x17\x76\x83\x8a\xae\xb2\x49\x96\x8d\x44\xf8\xd6\xb7\x0f\x19\xf1\xa9\x83\xee\xd8\x0f\x1f\x30\x3c\x92\xf3\x93\x47\x07\xf9\x0a\xe0\xd5\x19\x18\x10\x22\x86\xdd\x00\x1a\xaf\xec\x56\x6d\x9c\x99\xde\x2f\x17\xa6\x2e\x59\xea\xec\x1c\xd1\xa4\xe0\x7e\x62\xd3\xeb\x5b\xc5\x76\x20\x55\x90\xd7\x13\xb9\xf0\x5f\xcd\x56\x30\x20\x44\x2c\xbb\x01\x34\x5e\xda\x8d\xd3\x03\x7a\xf3\xe4\xdc\xf5\xa1\x76\x96\x06\x6d\x83\x30\x55\x55\x9b\x83\x54\xb1\x81\xe0\xb0\x20\xb7\xa3\x91\xf7\xe5\x22\xb7\xb0\xdb\x0c\x31\xed\x06\xd0\x78\x6d\xb7\x58\x96\xf7\xf1\x02\xb1\x44\x44\x9c\x2c\x7b\xa2\x76\xeb\x2e\xdb\xbd\x79\x2c\xdb\xb2\x2a\x97\xd8\x29\x56\x89\xee\xb1\x8a\xac\xb2\xc0\x80\x10\xb1\xed\x06\xd0\x78\x71\xb7\x54\xab\x46\xee\xc2\x53\x0a\x3d\x02\xbe\xde\xcf\x0a\x7a\x6c\x0c\x28\xc3\x84\x2e\x19\xc4\x3a\x3d\x7f\xfd\x2b\x4b\x51\xbc\x36\x98\x1f\x06\x84\x88\x71\x37\x80\xc6\xab\xbb\x91\xdd\xd2\x51\x4b\xd4\x4e\x02\xc6\x2f\x69\x61\xd9\xbb\xf9\xb2\xa5\xe6\x4b\xb6\xfc\xf1\xa6\x49\x96\x9a\x72\x67\x5c\x32\xda\x7c\x60\x40\x88\x58\x77\x03\x68\xbc\xbc\xdb\x18\x17\xe7\x0f\x2b\xf2\x47\x24\xb3\xcf\x2c\x1c\xd7\xc7\x9d\xc4\x29\x9b\xcf\x51\x18\x6e\xf1\x0a\x69\xaf\x07\x5c\x54\x10\x7e\x8e\xbd\x3a\x21\xe6\xdd\x00\x1a\xaf\xef\x96\x80\xbe\x1b\xb9\xff\xe8\xcc\x34\xd3\xe2\x81\x86\xa3\x7f\xbe\x4d\x8f\x24\x9f\x67\xbe\x8d\x8e\x55\x9b\x19\x64\x68\x11\x38\x80\xc5\x10\xfb\x6e\x00\x8d\x17\x78\xb3\xb3\x0e\xcc\xa8\x1c\xf1\xbc\x41\x20\x18\xc3\xb7\x7a\x2e\x3a\x82\x8b\xe4\x86\xff\xe9\x00\xce\xe4\xa0\xfd\xb2\x6b\x8f\x88\x7f\xcb\xc2\x80\x10\x31\xf0\x06\xd0\x78\x85\xb7\xea\xa2\x9f\x2b\x8f\xb6\x31\x5b\x61\x0b\x66\x14\x9c\xee\x02\x81\x83\xd7\xde\x64\x5d\x9c\x0b\xec\xd4\x8a\xf0\x97\x79\x64\x6a\x73\x0e\x06\x84\x88\x85\x37\x80\xc6\x4b\xbc\xa5\x9f\xd3\x4b\xd4\x91\x6a\xfe\x91\x36\xd7\x6f\xf3\x46\x6d\xd5\xfe\xed\xd4\x3d\x78\x91\x09\xd2\x49\xf7\x5b\x9e\x48\xbb\x18\x7d\x15\x06\x84\x88\x89\x37\x80\xc6\x6b\xbc\x69\xec\xe7\xd8\x5c\xcb\x5f\x77\x26\x94\x36\x72\x76\x61\x02\x14\xf7\x5a\x35\xe7\x3d\x3c\x6e\xbc\x33\x29\xef\xec\x3f\x78\x13\xc4\x0e\x03\x42\xc4\xc6\x1b\x40\xe3\x45\xde\xfe\xa4\xe9\xdf\x64\x63\x85\x6e\x74\x5a\x09\xb6\x9a\xfa\xf1\x9b\x45\x58\x7e\x1c\x33\xac\x01\x2f\x76\xa9\x8a\xa4\xe8\x2c\xcb\xdd\x60\x40\x88\x18\x79\x03\x68\xbc\xca\x5b\x33\xf1\xa8\x45\xd9\xf6\x40\x6c\xa9\x7f\x3f\x9b\xc7\xf3\x14\xaa\xeb\x52\xb5\xa1\xea\x0c\x9c\x74\x02\xe7\x73\xa7\x4b\xdf\xd6\x4b\xc0\x80\x10\xb1\xf2\x06\xd0\x78\x99\xb7\xf3\x3a\xbf\x0d\xf7\xeb\x5f\xf5\x52\x17\xfa\xb4\xc4\x5f\x39\x6c\x7c\x73\x8e\x60\xdd\x2f\xd3\x0b\x38\xd5\xfa\x07\x49\xd6\xed\x31\xc2\x80\x10\x31\xf3\x06\xd0\x78\x9d\xb7\x7c\x89\xdb\xdc\x65\xb5\xbf\xed\xb4\x1e\x4b\xc8\x56\x3b\x28\x2a\x85\x5b\xee\xea\x36\x3f\x3f\x17\x6c\x96\x90\x03\x6a\x4d\x4e\xd8\xc1\x80\x10\xa9\xf3\xf6\x3f\x03\xdd\x3f\xfd\x63\x5c\x7f\x0f\x74\x78\xa1\x37\x97\xcd\x81\x3f\xbd\xd9\x3f\x9e\x7e\x55\xb7\x17\xdb\x33\x50\x47\xdd\x29\xaa\x1b\xbb\xe4\x79\xf1\x87\xf0\x5c\x69\x75\x70\xee\x47\xec\x08\x80\x18\x7a\x03\x68\xbc\xd2\xdb\xcb\xf6\x13\x26\x06\x2d\x41\x4c\x81\xe4\x4f\x05\xb6\x5e\x3a\x07\x9f\x2c\xf3\xd7\x1e\xec\x95\x6d\x78\x9c\xc8\x46\x45\xcc\xce\x7c\x12\x06\x84\x88\xa5\x37\x80\xc6\x4b\xbd\x71\x1b\x7b\x0f\xd5\xeb\x5f\x33\x33\xfb\xaa\x12\xa0\xf9\x58\xaa\x2a\xe4\x63\x5d\xbe\xaa\x30\xc7\xa6\xcc\x0d\x57\x3d\x85\x2f\xb9\x18\x18\x10\x22\xa6\xde\x00\x1a\xaf\xf5\xd6\xcb\xd4\x13\xdf\x65\x4b\xa9\xfa\x6b\x24\x21\x97\x5b\xf7\xc5\x5b\x0d\x2d\x12\x5b\x05\x73\xc7\x96\xc7\x34\x49\x03\x17\xdf\xd6\xca\xc0\x80\x10\xb1\xf5\x06\xd0\x78\xb1\xb7\xbc\x84\xce\x58\xf5\x5e\x87\xa6\x9e\x65\x1a\xb5\xcd\xc1\x0e\x71\x1e\xca\x56\x0e\x06\xa0\xf2\xa9\x37\x48\xf2\x41\x35\x6a\xd6\x09\x06\x84\x88\xb1\x37\x80\xc6\xab\xbd\x15\xfd\xe6\x7d\xba\x27\x7c\x7c\x61\x0d\x56\x11\x37\x1f\xb7\xa2\x54\x0b\x5e\x4c\xd3\x98\x19\xb4\x92\xd6\x66\x2d\xec\x7c\x63\xa9\x04\x03\x42\xc4\xda\x1b\x40\xe3\xe5\xde\x52\x48\xf7\x9d\xdd\xd7\xe9\xae\x9d\xe2\xaf\x56\x75\x8b\xec\x64\x31\x55\x24\x32\xb0\x22\xa4\x5f\xbe\xcf\xc1\x1f\x11\x07\xf5\x5a\xc0\x80\x10\x31\xf7\x06\xd0\x78\xbd\x37\xca\x5f\xba\xe5\x31\xb1\x6b\x87\x14\x8d\x6b\x64\xea\xf9\xef\x85\x62\xd6\xe3\xb2\x6a\x4f\x7f\x6e\x3d\x2c\xad\x99\xd1\x24\xce\xbc\x08\x03\x42\xc4\xde\x1b\x40\xe3\x05\xdf\xf4\xa2\x1a\xde\x3d\x70\x8d\x98\x52\x3f\x0e\xd3\x2f\x9f\x9b\x8d\x70\x90\xd8\x4e\x49\x6e\x6c\xcb\x7b\xf2\xaa\xe3\xc3\xe5\x0d\x33\xec\x36\x43\x0c\xbe\x01\x34\x5e\xf1\xad\xee\xfa\x4e\xea\x35\x6a\x72\x60\xb7\xb2\x38\x45\xa9\x9b\xfd\x21\x2b\xe5\x77\x99\x41\x66\xe9\x11\xb9\x42\x08\xcf\xf1\x92\x1f\x72\x30\x20\x44\x2c\xbe\x01\x34\x5e\xf2\x8d\xfa\x53\x21\x79\xf6\xd8\xb3\x86\x87\xf1\x8e\x1b\xcc\x36\x09\x3a\x87\xb1\xba\xdc\xdb\x6c\xa6\xa2\xcc\x86\x81\xb7\xbf\xbe\x24\xbd\x02\x03\x42\xc4\xe4\x1b\x40\xe3\x35\xdf\xd2\xcb\xcb\x03\xd3\xbf\xf8\x58\xed\x7b\x6a\x4b\x1d\xde\x53\xbc\xce\xa2\x99\x9e\xe4\xfe\x82\x8d\x34\xe6\xde\x00\xd1\xf6\xe2\x69\xec\xac\x8f\xd8\x7c\x03\x68\xbc\xe8\xdb\xee\x07\xaf\x33\xd7\x7e\x1b\xcf\xc7\xa5\xf5\x4b\xc6\x1d\xbe\x94\x0a\x7e\x2b\x96\x71\x82\xf9\xff\xc7\xdc\x7b\xc7\x53\xdd\xff\xf1\xff\x0e\x0e\x19\xd9\xd2\xdb\x96\xd1\xb0\x67\xf6\xce\xc8\xc8\xc8\x56\x56\x48\x11\x49\x42\xc8\xb1\xf7\x88\x32\xb3\xca\xcc\x88\xec\xad\xc8\x0a\xd9\x44\x42\xf6\x8e\x6c\xf2\xbb\xf5\xf9\x5c\xc7\xd7\xf5\xd6\xb9\xde\xd7\xf7\xf7\xed\x8f\xcf\xed\x76\xfd\x79\xbf\x3d\x4f\xaf\xf3\x7e\x5c\xef\xd7\xeb\x3c\xce\xfb\xdc\xf9\xd2\x85\x7d\xc6\xde\x7c\x51\x1e\xf7\xeb\x70\x82\x52\xfa\x06\xc0\x40\xd6\xb7\x4e\xca\xa7\x56\xf9\x3d\xb8\x24\x39\x8e\x45\xbd\xe9\x51\x9f\x39\x3d\xaa\xc2\xc5\xac\x5b\xd7\x65\x69\xb6\xe1\x59\xac\x5b\xf2\xb7\x10\x00\x1c\xa5\xf5\x0d\x80\x81\xb4\x6f\x22\x67\x0d\xef\xf2\x3a\x18\xf7\xe6\xcb\x7f\xf3\xab\x84\xed\x7d\x06\xf4\x25\x0c\x4c\x5a\x3a\x42\xab\x92\xee\x46\xdb\x74\x56\xd8\x21\x00\x38\x4a\xed\x1b\x00\x03\x79\xdf\xae\x64\xbe\xbb\x2d\xbd\x6a\xea\xbf\xad\x5e\x1a\x9a\xb2\xfc\x2d\xd0\x79\x1a\x31\x15\x65\x9e\x78\xf5\xb3\x5e\x6d\xc7\xa8\xcf\xcb\x5f\xc7\x26\x94\xde\x37\x00\x06\x12\xbf\x19\x5e\xa4\x27\x70\xa3\x3f\x23\xfc\xc4\xda\xca\x67\xa3\xd6\x87\x7d\xf3\xbe\xf2\x8c\x81\xe9\x55\x9a\x55\xb7\x11\x11\xd5\x37\x4a\x9c\x08\x00\x8e\x52\xfc\x06\xc0\x40\xe6\xb7\x9b\xb8\x56\xee\x77\xaa\x36\xeb\xc7\x57\xa7\xd0\xdb\xad\x42\x65\x2b\x70\xfb\x74\x1b\x24\x5c\xbf\xbf\xbc\x41\xd5\xbe\x22\x9b\x6e\x8f\x00\xe0\x28\xcd\x6f\x00\x0c\xa4\x7e\x5b\xfd\x80\xe1\xf6\x82\xb5\xa1\x7e\xa3\x86\x4d\xf9\x6c\xf5\x0e\x06\x33\x7e\xbe\xbe\xf8\x0b\xfa\x57\xc9\x7b\x6f\x99\xaf\x6a\xac\x08\x23\x00\x38\x4a\xf5\x1b\x00\x03\xb9\xdf\xea\x68\xea\xdd\x7a\xb7\xa2\xf7\x9d\x6f\xf9\xaa\x74\x9a\x3b\xdd\xf8\x2a\xec\x33\xd4\xdc\x57\x87\xa3\x9b\x18\x9b\xc3\xb4\xf4\xf4\x26\x02\x80\xa3\x74\xbf\x01\x30\x90\xfc\x8d\x7f\xfc\x3e\x5f\x9a\x8c\xff\xed\x76\x58\x82\xb0\x48\xa6\x1e\x6e\x20\x83\xa0\x74\xa8\x7d\x8a\x64\xf9\x86\x13\xa7\x67\xf3\x08\x0b\x02\x80\xa3\x94\xbf\x01\x30\x90\xfd\x4d\x3d\x5d\x3a\xcb\xc6\x83\xd1\x7a\x98\xab\xfd\xe1\x14\x63\xc0\x4d\xb7\x1b\x81\xce\xd6\xdf\xd5\xae\xce\x04\x7d\xa3\xf0\xb2\xc0\xc5\x41\x00\x70\x94\xf6\x37\x00\x06\xd2\xbf\x9d\xbf\xb0\x9f\xef\xdd\xcd\xf8\x08\xe7\xd5\x96\x72\x2d\x65\xd4\xb7\x02\xe7\xbb\x76\x0b\x56\x76\xe4\xe1\x82\xba\x8d\x0e\x5d\xad\xbf\x2e\x00\x4a\xfd\x1b\x00\x03\xf9\xdf\xe6\x76\x4c\x6b\x44\xde\xd1\x99\x39\x65\xaf\x94\x9d\x77\x0d\xc8\xd0\xaf\x0d\xac\x68\xeb\x61\x79\x0b\x90\x96\x17\x3e\x14\x41\x33\x41\x00\x70\x94\xfe\x37\x00\x06\x12\xc0\xf1\xda\x28\x29\xcf\xb8\x65\xe5\x6a\x50\x73\x77\x78\x04\xf3\x09\x49\x9b\x6e\x0e\x5f\x95\x6e\xd6\xc6\xf0\xa2\xe0\x4f\x9c\xf2\xe7\x41\x00\x70\x94\x02\x38\x00\x06\x32\xc0\xb5\xde\xce\x9c\x12\xa7\xa7\xb5\x62\x7a\xc5\x6d\x6b\x52\xfa\x61\xc7\xc7\x92\x99\x28\xa6\xcc\x9e\x66\xd4\x9d\xaf\xcc\xe5\x53\x15\x1c\x01\xc0\x51\x1a\xe0\x00\x18\x48\x01\x37\xcd\x2b\x96\x31\xc9\xff\xfd\xf5\xeb\xaf\x07\x84\xd7\xa2\x67\x17\xba\x55\x2b\x0d\x7c\x2c\xc5\x9f\x4d\xa0\xe9\xb4\xd5\x4c\x7b\xfd\xba\x9f\xa1\x54\xc0\x01\x30\x90\x03\x4e\xa4\xf4\xdc\x50\x31\xf7\x39\xcc\x5b\x1f\x77\x1e\x64\xee\xeb\xac\x96\xc3\x5f\x09\xdd\x2f\x1f\xeb\xb8\xb8\x4f\xea\xf9\x96\xf9\x1c\x01\x02\x80\xa3\x74\xc0\x01\x30\x90\x04\x8e\x93\x30\x65\xee\x00\x56\x43\xb2\x13\x61\x2d\x46\x74\xbf\x03\xa3\x52\xce\xb0\xbe\x4b\x5c\xc1\x3c\xe4\x7e\x55\x8f\x4d\xa1\xb4\x16\x02\x80\xa3\x94\xc0\x01\x30\x90\x05\x2e\x8e\x41\xb2\x0e\xed\xeb\xed\xb6\x9c\x27\x80\x5e\x57\xeb\xbd\x1f\x19\x95\x5c\xc4\xdb\xfe\x8a\x2a\x82\x84\x11\xa4\xbb\xb7\x5d\x7e\xed\x01\x28\x2d\x70\x00\x0c\xa4\x81\xd3\x66\xf6\x81\x35\xc2\x85\x66\x9b\x62\xdb\x66\x3e\x6d\xd7\xcf\xdd\x3c\x75\x31\xff\x8d\xc8\xa7\x6c\x1f\x57\x3a\x63\xf9\xa8\xfe\xeb\x08\x00\x8e\x52\x03\x07\xc0\x40\x1e\x38\x26\xe1\x9b\xfc\x77\x58\xeb\x6b\x14\x8c\xcf\xdd\x7f\x75\x59\xa0\x46\x2b\xfb\x3b\x7a\x93\x6f\x76\xb6\x0d\xcf\x66\x0b\xc2\x3d\xfb\x1c\x02\x80\xa3\xf2\xc0\x21\x0f\x74\x50\x7f\x32\xf5\xf8\x81\x0e\x24\x82\x73\xdd\xc9\x31\xb2\xf0\x17\xbe\x1b\x2f\xef\xe0\x54\x19\xd5\x41\xf2\x45\x17\x9d\x1f\xd8\x74\x6e\x72\x82\xeb\xe7\x59\x57\xd9\xab\x21\x00\x38\x4a\x11\x1c\x00\x03\x99\xe0\x42\x4f\xad\xd3\xeb\x79\x8d\x94\x17\x66\xa9\x95\x3b\x3f\x7a\xe8\x98\x3e\x39\xbc\xf2\xf9\xb2\xdd\x93\x10\xb5\x8b\x61\xf6\x56\xef\xa5\x10\x00\x1c\xa5\x09\x0e\x80\x81\x54\x70\x6d\x1b\x5a\x81\x72\x3c\x37\xf5\x67\xe9\xd0\x49\xf0\x0e\x95\x64\xd2\xb4\x87\xb6\xb3\xae\xab\xab\x8e\x3a\xf6\x47\x93\xef\x6b\xfe\x3a\x02\xa0\x54\xc1\x01\x30\x90\x0b\xee\x12\x7a\x25\xe1\x7b\x8a\x0c\x66\x9a\xb5\x3a\x0d\x35\xd8\xd9\xa5\xb7\xde\xa5\xb9\x6c\x72\xf2\x9e\x06\x2d\xd3\x91\x7d\x25\x64\x30\x04\x00\x47\xe9\x82\x03\x60\x20\x19\xdc\xb4\xd4\x26\x59\x39\x93\x19\x4e\xfb\xa3\xb9\x50\x4a\x4d\x57\x73\x22\x6d\xd2\xc2\x69\xa5\xa6\x85\x80\x9a\x53\x3c\x5a\x92\xf9\x0c\x08\x00\x8e\x52\x06\x07\xc0\x40\x36\x38\x21\x6f\x2e\x79\x34\x67\x6d\x69\x4d\x8d\xe1\x5b\x6a\xfc\x77\xf0\xde\xd5\xa5\xd9\x7c\xe2\xac\xcb\x9d\x61\x54\x8f\xbf\x60\x87\x45\x8a\x00\xe0\x28\x6d\x70\x00\x0c\xa4\x83\x6b\xfb\x49\x8c\xfe\xb9\xb7\xd7\xa6\xaf\x4d\x4e\x8d\x6e\x4a\xb1\xfd\x65\x42\x1a\x7f\x14\x3e\x2e\x27\xfc\x42\x97\x83\xbc\xe6\x81\x3a\x02\x80\xa3\xd4\xc1\x01\x30\x90\x0f\x4e\xa2\x72\x2c\x2e\x02\x2f\x59\xf0\x6e\x5b\xb5\x4c\xe5\xd0\xe6\xb7\x05\x0f\x77\x63\xd8\xae\xe1\x0e\x35\xe1\xab\x9f\x6b\xf1\x96\x68\x08\x00\x8e\xd2\x07\x07\xc0\x40\x42\xb8\x73\x2b\x62\x24\xb5\x8c\xe7\x49\x84\xcf\x26\x07\x4f\xea\xa4\xa5\xad\x4f\x31\xed\x6e\x1e\x54\xf6\x2a\x44\x47\x99\xdb\xd3\x74\x2a\x23\x00\x38\x4a\x21\x1c\x00\x03\x19\xe1\xae\x55\x9c\x2b\xc2\xbc\xb1\x51\x25\xc7\xf3\xc2\x90\x35\x1e\x93\xfc\xe0\xd6\xd0\x7a\xbc\x58\xda\x0e\x87\xf2\xa2\x58\xe8\xb0\x84\x39\x02\x80\xa3\x34\xc2\x01\x30\x90\x12\xce\x25\xb7\xae\x7e\x69\x21\x5d\x3e\x53\xcb\x42\x6c\x69\x76\x86\xfe\xec\x9c\xc7\xfa\x45\xb1\x4a\x8d\xdc\x6e\x81\x20\xe5\xc6\x70\x6a\x04\x00\x47\xa9\x84\x03\x60\x20\x27\x9c\xef\x9a\xf5\x9d\xd7\x22\x03\x92\x34\x97\xce\xc8\x3c\x08\x0a\x17\x85\x45\x0e\x58\x17\x34\xbd\x21\xe3\xec\x70\xef\xc9\x6f\x7a\xcb\x8c\x00\xe0\x28\x9d\x70\x00\x0c\x24\x85\xa3\x2f\xa2\x8f\xba\xe7\xfc\x75\xa8\x57\x27\xe5\xfe\xb6\xdf\x93\x67\x6d\x74\xde\xa5\xa4\x6f\x87\xe2\x46\xe9\xe5\x08\xd9\x32\xae\xd2\x20\x00\x38\x4a\x29\x1c\x00\x03\x59\xe1\x6e\x23\xba\xeb\xee\x31\x99\x75\x46\x68\xdf\xbb\x6b\x83\x03\xf7\x7f\x74\xdb\x72\xcc\x28\x54\xf3\x46\x23\xab\x8e\xa9\xf8\xd3\x27\x4a\x08\x00\x8e\xd2\x0a\x07\xc0\x40\x5a\xb8\x78\xba\x87\x4a\xa5\x3a\x9d\x25\xdc\xf3\x1a\x8f\x37\x32\xb4\xe9\x12\xcf\xab\x73\xc6\x2a\x7e\xc2\x1a\xc0\xbd\x62\xeb\x72\xf1\xfb\xaf\x61\x28\xb5\x70\x00\x0c\xe4\x85\xfb\x84\xfb\x1d\x46\x31\xd5\x35\x7a\x97\xa0\xda\x50\xc9\x8f\x7b\xc6\x32\xf7\x89\x0b\x3d\x3a\xfa\xc5\x84\xf1\x4c\xf2\x36\x2e\x2a\x19\x04\x00\x47\xe9\x85\x03\x60\x20\x31\xdc\xf9\x2b\xef\x5b\xc3\x18\x5e\xf3\xdd\x28\x5a\x60\x4d\x35\x38\xc3\xaa\xb1\x36\x16\x32\xdc\x43\xb3\x3e\x4f\xf2\x0a\x1d\xaf\xaf\x9c\x11\x01\xc0\x51\x8a\xe1\x00\x18\xc8\x0c\xb7\x49\x37\xfb\x5c\x8f\x62\x76\xef\x7c\x25\xbd\xfb\x4e\xdf\x27\xf4\x12\x3b\x96\xb1\xa8\x8c\x56\xbe\x06\xae\x61\x8b\x94\xe1\x33\x3a\x08\x00\x8e\xd2\x0c\x07\xc0\x40\x6a\xb8\xb3\xc2\xea\xb9\x22\xc2\x2b\xcd\x91\x59\x78\x5c\x58\x2e\x40\x43\xa0\x92\x92\x3f\x1f\x2d\x5b\xfd\xbb\x8f\x61\xb3\xcc\xea\xb4\xfa\x08\x00\x8e\x52\x0d\x07\xc0\x40\x6e\xb8\xc2\x75\xb1\xf7\x7d\x17\x77\x05\x62\x5d\x2d\x94\x3e\x4f\xc8\x2c\xa7\xcd\x4f\x53\xc5\xcd\x60\x5b\xdf\x70\xed\xb5\xa0\x11\x63\xb2\x46\x00\x70\x94\x6e\x38\x00\x06\x92\xc3\xdd\x7e\xfa\x9a\xce\xcc\xec\xe1\xa3\x49\xd2\x8f\xcf\x4f\xc1\x18\x39\x67\x38\x4f\x6d\x9e\xf6\xa6\xf4\x75\x3f\x27\x7a\xe7\xbd\x83\xcc\xaf\xd0\xa2\x94\xc3\x01\x30\x90\x1d\xee\x7a\x6c\x2b\x3a\xae\x17\xa7\x7e\x46\x65\xb2\x44\x6e\x50\x77\xe5\xee\xac\xd1\x38\x36\x81\xc5\x26\x46\x17\xde\x8b\xc8\x55\x9c\x5f\x9f\x42\x50\xda\xe1\x00\x18\x48\x0f\x77\x96\x1d\x33\x3d\xba\x8d\xcc\xab\x8b\xe8\x79\x12\x3a\xd7\xf7\xe2\x43\x47\xc3\xfa\x88\x4d\x49\x7d\xf3\xcd\xb0\xf1\x71\x47\x06\x4a\x04\x00\x47\xa9\x87\x03\x60\x20\x3f\xdc\xe0\xfd\x41\xaa\x35\x3e\x09\x55\xd2\xc0\x1c\xfe\x7c\x67\xf7\xde\xf4\x09\x66\x0d\x4b\xdd\xd3\x2f\x66\x96\x0c\x8d\x2d\x4f\xdf\x92\x46\x00\x70\x94\x7e\x38\x00\x06\x12\xc4\x91\x2b\x1a\x4b\xbf\x8d\x5b\x50\x94\xcc\xd7\x1b\x18\x70\x3c\x14\x30\xb0\xce\x2d\x63\x93\x5b\x33\x64\x22\xc1\x16\xc0\xbf\xb7\xf4\xeb\xa3\x33\x4a\x41\x1c\x00\x03\x19\xe2\xf0\x30\x6e\xdd\x66\x9d\xa6\x1b\x0f\x24\xf1\x76\x7d\x90\x4f\x5b\xfd\x2d\xff\x89\x00\x89\x25\xe3\x85\x1c\x9e\x49\xae\x74\x26\x8d\x5f\xbb\x13\x4a\x43\x1c\x00\x03\x29\xe2\xec\x7e\x16\xbd\xdd\xa7\xbb\x66\x25\x2d\xc9\x3d\xa2\xfc\xfc\xb4\x04\x7b\x86\xf0\x6e\xdb\xb7\x0b\x1f\x82\xa4\x28\x35\x63\xcc\x4a\x2c\x10\x00\x1c\xa5\x22\x0e\x80\x81\x1c\x71\xc6\x3d\xdc\xb8\xf5\x77\x0b\x34\x7f\x36\x77\x8b\xb0\x75\x3d\xd2\x56\xbf\xf4\xb4\x46\xd2\xaa\xca\xf7\x9d\x3d\x86\x5b\x49\xc2\x7f\xee\xb4\x28\x1d\x71\x00\x0c\x24\x89\xeb\x40\xe4\xab\xef\x8c\x7d\x4a\x89\x79\x61\xf4\x3a\x6f\x84\x55\x38\x24\x74\x19\x01\xf0\x3c\xfc\x39\xe7\x30\x87\x45\x5f\x43\xcc\x8b\x00\xe0\x28\x25\x71\x00\x0c\x64\x89\xb3\x83\x0f\x99\x2e\x0a\x0a\x9d\xa5\x69\x12\x5a\xbb\xbe\xfb\x40\x44\xf3\x7c\xc6\xd9\xfd\xe5\x73\x0e\x8d\x07\x3e\xb9\x5c\x77\xb7\x7e\x9d\xa8\x51\x5a\xe2\x00\x18\x48\x13\xa7\x52\x29\xfa\xbc\x3d\xd0\x28\x11\x67\xdd\x49\x3f\xd0\x22\x7d\x30\xb3\xd4\x2f\x70\x27\xbb\xd0\xb4\xf4\x92\xb4\x60\x24\x8d\xd1\xaf\x5b\x10\x4a\x4d\x1c\x00\x03\x79\xe2\xdc\xac\x85\x3f\xac\x91\xad\xa8\xbe\xa2\x54\xcc\x60\x74\x54\x9d\x79\xfb\xed\x5d\xf9\xfd\x0f\x24\xc9\x52\x26\x97\xe6\x02\x94\x53\x6c\x10\x00\x1c\x95\x27\x0e\x79\xa0\x83\xfa\xc3\xf6\xc7\x0f\x74\x20\x51\x1c\xbb\x3d\x69\xf7\x7a\x99\xe0\x39\xbd\x28\x46\x37\xbe\xf9\x86\x17\xd9\x15\xf3\x0b\xf6\x77\xfd\x33\xba\x30\x06\x5c\x59\xf8\x64\x4e\x23\x00\x38\x4a\x51\x1c\x00\x03\x99\xe2\x80\xd4\xeb\x59\x19\x6b\x05\x06\x41\x43\x75\x8e\xed\x43\x59\x02\x0f\x1e\x4c\x7f\x50\x93\xff\x52\x83\xbe\xa7\x52\x83\xb8\x5d\xfe\xeb\x0c\x86\xd2\x14\x07\xc0\x40\xaa\x38\x2f\x7b\xda\x64\x45\xdf\x57\x1f\x23\xb8\x27\xb9\x5b\xc6\xd8\xbe\x44\xbe\x1c\x77\xf4\xfc\x76\x67\x90\xb0\xda\x48\x80\x15\x9d\xe0\x57\x96\x50\xaa\xe2\x00\x18\xc8\x15\x27\x54\xae\x66\x9a\xcc\xf0\x70\x18\xf3\xdb\xf7\x7a\xdc\xbe\x38\x6a\xef\xef\xed\x39\xfe\x1a\x15\x7a\x64\x92\x05\x4e\x9d\x44\xb7\x7e\x9d\x5b\x51\xba\xe2\x00\x18\x48\x16\xb7\x60\x9c\xfa\x12\x1f\x23\x67\xe1\xa6\x73\xb1\xc4\x5c\xe8\x19\x43\xb1\xf4\x18\x04\xc7\xf3\x33\x66\x93\x8f\xf9\xc6\x6f\x48\x3b\x63\x23\x00\x38\x4a\x59\x1c\x00\x03\xd9\xe2\x14\xc4\xcf\x39\x2e\x50\xe9\xcb\x49\x6a\x0e\xfa\xa6\x92\x97\xea\x9e\x2a\x9b\xe3\x18\x7c\xdf\x25\xc4\xa9\xa0\x4c\xbb\x3f\x30\x48\x87\x00\xe0\x28\x6d\x71\x00\x0c\xa4\x8b\x03\xd2\x84\x16\xf3\x60\x1f\x12\x96\x34\x59\xce\x3e\x2c\x7e\x19\x92\x8d\xf6\xd3\x95\x9e\xf4\x1e\xdf\x9d\x98\x17\x8c\x92\x0a\xdf\x7e\x6d\x67\x28\x75\x71\x00\x0c\xe4\x8b\xbb\xfe\xf5\x76\x9c\x6d\x03\xfb\xd3\xe0\x11\x42\x26\xdf\xe0\x80\x80\x68\xf5\xba\xe8\x67\xe8\xba\x9d\x3a\x86\xef\xa4\x3d\xf2\x09\x7f\x7d\xa2\x45\xe9\x8b\x03\x60\x20\x61\x5c\x40\x7f\x9a\xae\x4d\xc1\xab\xfd\xa1\x1d\x03\xdd\xc1\x91\x0a\xa5\x81\x73\xce\x25\x83\xf8\x58\x0b\xaa\xc4\xa2\x93\xe8\x8c\xaa\xbf\x4e\x87\x28\x85\x71\x00\x0c\x64\x8c\x2b\x9d\x24\xa0\x86\xd3\xdd\x2c\x42\x2c\x62\x05\xa5\xe9\xd5\x1f\x48\xdd\xfb\x41\xc9\xea\x2f\xcc\xb0\x2d\x7a\xae\xa7\xdf\x11\xf7\x22\x02\x80\xa3\x34\xc6\x01\x30\x90\x32\x6e\x4f\x35\x83\xac\x5c\xfc\x7e\x51\x39\xd3\x92\x83\x96\x1b\x15\x66\xa8\x1b\x69\x4d\xd2\xfb\x82\x2b\xe9\x97\x62\xbf\x39\xde\x6d\x91\x47\x00\x70\x94\xca\x38\x00\x06\x72\xc6\x8d\x2b\xa8\x16\xde\x64\x26\x10\xfd\xc4\xfb\xb4\x55\x9a\x4f\xde\x5b\x97\x9f\xec\x49\xc1\xb4\x65\xf8\x4d\xdb\xa4\x91\xa8\xba\x5e\x3b\x04\x00\x47\xe9\x8c\x03\x60\x20\x69\x5c\x03\x67\x77\xfb\x75\x87\x5b\xe4\xcf\xf7\xf6\x2b\xaa\xbd\x37\x4a\x2c\x8a\x78\x12\x04\x10\xdb\x2d\x39\x8f\x63\xfa\x1b\xb8\x5d\x7f\x7d\x6e\x44\x29\x8d\x03\x60\x20\x6b\xdc\x67\xed\xe6\x74\x6e\x1f\xd6\x27\x2e\x91\x49\xbe\x4f\x65\xe6\x6b\xe3\xb8\x08\xa8\x76\x9c\xe6\x5d\x68\x2e\x8f\xa1\x9f\xb5\x94\x3f\x8b\x00\xe0\x28\xad\x71\x00\x0c\xa4\x8d\xc3\x3b\xcb\xa8\x54\xa5\x4e\x6e\xbd\xdc\xaf\xd4\x18\xaa\x92\x9e\x18\xb2\x98\x7e\xea\xaa\x52\xb9\x04\x61\x9c\xa0\xee\x4f\xbb\x1a\x03\x04\x00\x47\xa9\x8d\x03\x60\x20\x6f\xdc\x77\x2f\x23\xed\x7c\xcc\x7b\x93\x18\x41\xdf\x47\x56\xab\xd5\x85\x52\xab\x2b\x56\xae\xae\x1b\x3b\xd5\xad\xc8\xe6\x06\xf9\xba\x70\x21\x00\x38\x4a\x6f\x1c\x00\x03\x89\xe3\xac\xdb\x15\x94\x9c\xdb\x19\x94\xbe\x72\xa6\x4a\xe1\xba\x11\xcc\xec\xb8\x49\xba\x12\x64\x99\xbd\x45\x78\x56\x2b\x28\xb1\x58\xfd\xfa\x1f\x1d\xa5\x38\x0e\x80\x81\xcc\x71\xee\x3c\x4c\x87\x4e\xd1\x17\xbf\xb3\xd2\x8b\xd4\xaf\x17\xdc\x0f\x7f\x34\x66\xc7\xc6\x60\x2d\xee\xe6\x2e\xa8\x9d\xe0\x48\x5e\xf9\x6b\x6f\x44\x69\x8e\x03\x60\x20\x75\x9c\x00\xb7\xaf\x45\xf8\x1d\x04\x61\x39\xef\xcf\x05\xe1\x1f\xbc\x0f\xc7\x38\xed\xf7\x34\xc4\xee\x1b\x30\x92\xb5\x7a\x9d\xa7\x79\x77\x05\x01\xc0\x51\xaa\xe3\x00\x18\xc8\x1d\x67\x55\xa5\xd6\x47\x1a\xbf\xb2\xfd\xe1\x71\x99\x39\x93\x92\x00\xfe\xf6\xbb\x4c\x53\xb9\xfe\x1b\x2d\xfa\x4b\x66\xf7\x82\x88\x0f\x7e\x7d\x74\x46\xe9\x8e\x03\x60\x20\x79\xdc\xd7\x4c\x84\x42\x39\x8f\xae\xac\x13\x76\x57\x40\x70\xc8\x41\xb1\x23\x71\xa7\x0a\x3e\x7f\x29\xf6\xe1\x40\xa4\xfb\x47\x1e\xfc\x5f\x67\x30\x94\xf2\x38\x00\x06\xb2\xc7\xed\x86\xb8\x5e\xed\xd5\x8e\x7c\xc1\x7e\x75\xbb\x33\xe4\x3b\xa1\x6b\xde\x6e\x96\x57\xab\x64\xd1\x42\xca\x21\x7c\x5f\xa8\xf5\x2e\x2e\x02\x80\xa3\xb4\xc7\x01\x30\x90\x3e\xee\x6d\x5e\x6b\x83\x44\x3e\x26\x76\xcd\xed\xd6\xa8\xfe\xe7\x61\xdb\x35\x3a\xd7\x9e\x2d\x7c\xa3\xda\x1b\x9d\x1e\xdb\x7f\xc0\xf2\x51\x18\x01\xc0\x51\xea\xe3\x00\x18\xc8\x1f\xf7\x24\xee\xdd\x86\xc8\x57\x46\xad\xaa\x1f\x18\xb6\xd9\x4c\x64\xd7\xde\xc0\x18\xc8\x3c\x77\x12\x97\x5f\xd2\x59\x39\x04\x96\x27\x52\x20\x00\x38\x4a\x7f\x1c\x00\x03\x09\xe4\x94\xab\xc5\x03\x84\x89\xb4\xee\x54\x9c\xb1\x41\xd8\x17\xc4\x06\xb9\x71\x67\x59\x18\x2a\x60\x6b\xe1\x5d\xa4\x0f\x0a\x7e\x48\xfd\x00\x01\xc0\x51\x0a\xe4\x00\x18\xc8\x20\x67\xdc\x1d\x65\xdb\x64\xdb\x12\x26\x72\x2b\x70\xe3\x16\xed\x61\x50\xa1\xba\x1d\x97\x51\xea\x83\x4d\x62\x17\x4d\x85\x30\x07\xe7\x5f\xe7\x09\x94\x06\x39\x00\x06\x52\xc8\x19\x25\x53\xd5\x7f\xde\xf9\x81\x50\xce\x10\x4a\xb5\x67\xf0\x44\xb3\xf5\x7b\x4f\x34\x91\xf2\xf1\x65\x17\x61\xe0\x7b\x7b\x20\x9d\x05\x01\xc0\x51\x2a\xe4\x00\x18\xc8\x21\x37\xa3\xf1\x0a\x9d\xcf\x75\xac\x29\xe4\x15\x76\x70\x2e\x4e\xea\xba\x88\x20\xcd\x87\xc8\x7d\x21\x5f\x2a\x7a\xff\xe8\xc4\xab\x9d\xbf\x0e\xc1\x28\x1d\x72\x00\x0c\x24\x91\x7b\x14\x62\xf3\xfc\xd6\x53\xd9\x84\x80\xa0\x37\x9a\x8e\xe6\xf7\x48\x82\x67\x0e\x6f\x30\x9a\x9c\x8e\x30\x2d\xb5\x59\xcb\x12\x3e\xf8\x75\x3f\x43\x29\x91\x03\x60\x20\x8b\x1c\x67\xb5\xec\xa5\xae\xa9\xe2\x76\xa1\xfa\x88\xf3\x52\x05\xc1\x95\x74\xee\x41\xd7\xe5\x2e\xdd\x5b\x7b\x8f\xf7\x72\x31\x61\xa1\xeb\xd7\xe7\x70\x94\x16\x39\x00\x06\xd2\xc8\x35\xc6\x33\x3c\x16\xc7\x54\x96\x59\xd5\x70\xb7\x64\xa7\xbd\x93\x15\x28\xe6\x95\xbd\x14\x54\x3c\x12\x24\x4a\xf5\x3d\xf5\x53\x0d\x2b\x02\x80\xa3\xd4\xc8\x01\x30\x90\x47\xae\xc1\x8d\xaf\x5c\x77\x96\x66\xb2\xae\xbe\x16\x3e\xa0\x18\x90\x37\x99\xfa\x7c\xb5\x5a\x4c\xa6\xc3\x8f\x4b\x55\xce\x98\x77\xe2\xd7\x2d\x08\x95\x47\xee\xa8\xa1\x03\xf0\x9d\x58\x1a\x7f\x2a\x5b\xb8\x97\x5e\xb7\xd7\x3d\x64\xfd\xe4\x99\xaf\x8f\xf9\xb3\xb4\x14\x1e\xaf\xd9\x2b\xc6\xc9\x25\x73\xfc\x40\x07\x12\xc9\x4d\xed\xe2\x56\x2c\x32\x73\x24\x88\x44\x4b\xca\x91\x75\x14\xbc\x51\x3e\xed\xb8\x61\xa9\xc0\x64\xdb\xc8\xd9\x3f\xa2\x14\xa8\xa9\x82\x00\xe0\x28\x45\x72\x00\x0c\x64\x92\x4b\xde\x7d\x19\xc4\x70\x95\xfe\x4e\xc0\xbb\xa5\x0a\xb9\xdd\x00\x8e\xfe\xca\xeb\x2d\xf7\x0f\xde\x3f\xe8\xd5\xa3\x8e\x62\xd3\x69\xbf\x8d\x00\xe0\x28\x4d\x72\x00\x0c\xa4\x92\x7b\xa8\xd6\x7e\x65\x5e\x99\xa2\xe7\xf2\xf7\x2b\x33\x8b\x42\x5a\x1b\x42\x9a\x6b\xad\x4b\xfd\xa5\x37\x9a\x57\xc7\xc4\xa3\x9e\xf1\xfd\x3a\x02\xa0\x54\xc9\x01\x30\x90\x4b\xee\xc3\xfb\x8b\x68\x69\xfc\xa2\xa6\xcf\x22\x62\xab\xc8\x09\x1f\x68\x1a\x2d\xd2\x0b\xcb\x73\x8f\x67\x52\xbd\xd6\x2f\x56\xc9\xb4\xc2\x47\x00\x70\x94\x2e\x39\x00\x06\x92\xc9\xbd\x97\xde\x8c\x5a\xa6\x4a\xfd\xc1\xaa\xef\xd4\xba\x42\xc8\xf2\x60\x25\xc9\xb6\x32\xeb\x8a\xf3\x41\xd5\x9b\xc3\xf1\xf7\x1d\x93\xd7\x10\x00\x1c\xa5\x4c\x0e\x80\x81\x6c\x72\x09\xa3\x1f\x73\x16\x83\x2e\x6e\x32\xdc\x09\x77\x32\xf5\x45\xc3\xd0\x20\xef\xd5\xe8\x52\x19\xb7\x6d\x3f\x85\x5e\x1f\xea\x52\x7a\x1e\x01\xc0\x51\xda\xe4\x00\x18\x48\x27\xf7\x85\xe4\x60\xc4\x7c\x83\x4b\x86\x06\x7f\xfb\xee\x45\x0f\xd5\x8b\x7b\xee\x6f\xa9\x3f\xde\x9b\xba\x16\xa8\xe1\x12\x61\xae\x95\xfd\xeb\x0c\x86\x52\x27\x07\xc0\x40\x3e\xb9\xbb\xf0\x02\x17\x36\x0c\x18\x66\x6e\xc4\x8c\x8d\x59\xec\x4e\x2d\xa6\x3c\x83\x7f\x9d\xff\xf7\x28\xa7\x6d\x62\x0f\x8c\x60\x2d\x42\x04\x00\x47\xe9\x93\x03\x60\x20\xa1\xdc\x23\x40\x3f\x32\xf1\x1e\x3b\x62\xe2\x13\xda\xf3\x09\xbe\x52\xa7\x67\x86\xb7\x7e\x0a\x5d\x3b\x84\x1d\x60\x0a\xfd\xec\x7d\x63\xf6\x6b\x99\x28\x85\x72\x00\x0c\x64\x94\xf3\xfc\x7e\x8d\xe5\x82\x05\x8f\x9f\x02\xf7\xac\x83\xeb\xbb\xab\x7e\xbc\x3c\xca\x2f\x63\x05\x2e\xb4\x5e\xea\xf5\x4e\xa7\x76\x3f\xa5\x88\x00\xe0\x28\x8d\x72\x00\x0c\xa4\x94\xe3\xb1\x57\xe6\x52\xd4\xdc\x4e\xe4\x15\xb0\xff\xaa\xc5\x48\x15\xb3\x3d\xad\x81\x4d\x7f\x80\xc8\x98\xf2\x09\xe4\x6a\x47\x33\xa7\x45\x00\x70\x94\x4a\x39\x00\x06\x72\xca\xbd\x5c\xbf\xa4\xe2\xed\x50\x20\x59\x15\xc5\xfa\xc1\xa9\x82\x56\x96\xb8\x89\x5f\x5f\x56\x9e\x39\xeb\x0c\x73\xdd\x85\x52\x0a\x93\x5f\x1b\x2d\x4a\xa7\x1c\x00\x03\x49\xe5\x5a\x30\x1e\x24\xeb\xd4\x86\x64\x97\x78\x90\x0a\xc9\xef\x5a\x05\x8e\x76\x7d\x92\xa0\x09\x8d\x01\x0a\xd1\xbe\x4a\x0e\xd4\xc7\x63\x21\x00\x38\x4a\xa9\x1c\x00\x03\x59\xe5\x34\x3e\xb9\x69\x67\x9c\xea\x28\xba\xd9\xf4\x5d\xef\xcb\xa9\xf0\x8f\x8f\x6b\x16\xde\xa4\xbe\xb3\xcd\x2c\xa6\xe5\x3d\xdf\xd2\x49\xf5\xeb\x83\x03\x4a\xab\x1c\x00\x03\x69\xe5\xf6\x7a\x48\xbd\xd5\xba\xc3\x5f\x9f\x17\x35\xec\x62\xc9\x6d\xd3\x78\x74\x61\xa3\x57\x5f\xb7\xec\xcb\xa6\x20\x3e\x6d\xd2\xb8\xcd\xaf\xd3\x21\x4a\xad\x1c\x00\x03\x79\xe5\xf4\x24\x2b\xaa\xed\x13\x65\xc6\x2d\x66\xce\x63\xe0\xbb\x8d\xeb\x4b\x1a\x72\x34\x79\xef\x4b\x49\x0c\xbd\x5d\xfa\x70\x7f\x0a\xdd\x1e\x01\xc0\x51\x7a\xe5\x00\x18\x48\x2c\xf7\xa3\xd2\x9e\xec\xda\x68\xaf\xef\x63\x31\xaa\xbc\xbd\x35\x0b\x47\xef\xd7\xb1\xd1\x91\xe5\x8b\x12\xe7\x45\x47\x69\x4a\xa4\xdf\x9b\x21\x00\x38\x4a\xb1\x1c\x00\x03\x99\xe5\x1a\xa7\x60\xd4\xea\x4d\xe3\xb2\xbc\xc9\xee\xc4\x3e\x0f\x0c\xa4\x3c\xdf\xcc\xc0\x35\x2f\x64\xb6\x62\xed\x59\x99\x09\xd1\x3c\x3a\x87\x00\xe0\x28\xcd\x72\x00\x0c\xa4\x96\x63\x16\xb5\xac\x51\xcd\x93\x77\x67\xd9\x1d\x12\xee\xde\xda\x50\x54\xf1\xb6\xbf\x5c\xad\x2c\x99\x75\x75\x37\x44\x97\xbf\xb8\x50\x0b\x01\xc0\x51\xaa\xe5\x00\x18\xc8\x2d\x97\x7e\x0d\x9b\x84\xe9\xe1\x8e\xcb\x1b\x81\x25\xbd\x0e\xb4\x3c\xfe\x99\x29\xa5\x72\xac\xdb\x95\xdb\x21\x03\x2e\xf2\x8c\xc1\x83\xda\x08\x00\x8e\xd2\x2d\x07\xc0\x40\x72\xb9\xc1\xf8\x18\x5f\x87\xcf\xc2\x8f\x2a\x1d\x47\x89\xdf\xe7\x35\x49\x5e\x32\x7b\x87\xf9\x8c\x52\x52\xfd\x8a\x6d\x83\x9c\x99\xc7\x7f\x9e\xfa\x40\x29\x97\x03\x60\x20\xbb\x5c\x34\x89\x83\xc8\x9d\x9f\x0b\xdb\xdd\x11\x67\x82\xde\x69\xa1\x1b\x28\xcd\x88\xd1\x38\xb0\xed\x7a\x7d\x33\x56\x52\xa7\xdc\x32\xd1\x45\x00\x70\x94\x76\x39\x00\x06\xd2\xcb\x95\xc6\x14\xce\x39\xd0\x49\x73\xf4\x30\xe6\xd0\x47\xdf\x3d\x43\xda\xf4\x36\x3e\x8b\x6f\x93\xef\xb4\xe6\x41\x99\xfd\xa9\xf3\x42\x42\x08\x00\x8e\x52\x2f\x07\xc0\x40\x7e\xb9\xcd\x0d\x77\xa1\xdc\x97\x7d\xfb\x3f\x71\x1c\x38\xba\x58\xe9\x95\xe1\x1d\x0c\xed\xd6\x41\x03\x1e\xb2\xd2\x85\xd5\xa2\x33\x3f\x7f\xdd\x1c\x51\xfa\xe5\x00\x18\x48\x30\x77\x4d\x75\x43\xb6\x15\x43\x22\x9d\xc4\x27\xf9\xfb\xdb\xed\x78\xca\x88\xc2\x48\xf3\xd1\xe7\x97\xd4\xe3\x42\xad\x4d\xec\xaf\x0f\x6a\x20\x00\x38\x4a\xc1\x1c\x00\x03\x19\xe6\xc2\x8c\xa8\x9e\x70\xe4\x8b\xd9\x19\x24\x87\xd6\xc9\xea\x33\x66\x24\xe2\x65\x45\xbe\x00\x94\x2c\x45\xbe\x0c\x15\x95\xdd\x8e\xfd\x75\x0b\x42\x69\x98\x03\x60\x20\xc5\xdc\xe1\xd0\x87\x01\xae\x0b\x18\x14\xe4\x3a\xa9\x3e\xd5\x0e\x97\xa2\x16\x17\x6c\xba\x0a\x8b\x47\x4b\xc3\x0b\x2f\x45\x74\x30\x59\xfc\xda\x37\x51\x2a\xe6\x00\x18\xc8\x31\x67\x5b\xdb\x0a\x53\x8d\x35\xfc\xb8\xea\x52\x97\x3f\x5f\xeb\x77\xaf\xca\x77\xa3\xbb\xab\x80\x9e\x51\x91\x41\x2f\xe3\xd5\xbd\x21\x4c\x04\x00\x47\xe9\x98\x03\x60\x20\xc9\x1c\xc6\x55\x51\xe7\xeb\x36\x92\x3f\xea\xce\xd5\x91\xd7\xe5\xf7\xbb\x9a\x54\x64\x51\x13\x84\xb7\x51\x70\xc6\xd3\x29\xf5\xd7\x5a\x5a\x22\x00\x38\x4a\xc9\x1c\x00\x03\x59\xe6\xb8\x83\xe1\x09\xf7\x2a\x45\x3e\xd2\x07\x88\x53\x2f\x39\x25\x26\x04\xe8\xe7\xbf\x4f\xb5\x89\xdc\x12\xe7\x9c\x0b\xc1\xbb\x64\xc3\x8f\x00\xe0\x28\x2d\x73\x00\x0c\xa4\x99\xc3\x68\x13\x59\x77\x29\xa1\x6e\x27\xca\x30\xbe\xb8\x32\x33\x7b\xdd\x1e\xff\x22\x57\xd3\x99\x9a\x9f\x58\x2a\xea\x03\x3c\xe1\x36\xbf\x3e\x85\xa0\xd4\xcc\x01\x30\x90\x67\x2e\x51\xee\x4a\xaf\x25\x6b\x9a\x3c\xdb\x15\x07\xe1\x0e\x16\x6c\x65\xb1\x6a\x4e\xbe\x52\xab\xab\x05\xd4\x67\x78\xe6\xd3\x9b\x73\x7e\xed\x9b\xa8\x3c\x73\xe5\x44\xff\x3d\xd0\x19\xaa\x5a\x5f\x4e\xc4\x88\x51\x8b\xbc\xd6\xcd\x2c\xb7\x2b\x6a\x68\x58\x51\x12\x09\xdb\x27\x1b\xd9\x9a\x7d\xc6\x17\x97\x95\x5a\x8b\x88\xe1\x1a\xbc\xa4\x7b\x1e\xed\x2f\xc9\xc9\x95\xfa\x96\x79\x33\xf6\x3e\x07\x33\xad\x8f\x53\xeb\x69\x26\x93\xe6\x7a\xb7\x2f\xda\xa4\xd1\x84\x9b\xe2\x73\xe8\xbf\xcf\xc7\x3d\x86\xae\x4e\xbd\x0d\x90\xbc\x32\x3c\x1c\x69\xdd\x61\x41\xe6\x35\x6e\xfb\x85\x55\xe1\x42\x77\x07\x79\xd9\x15\xf5\xc3\xda\xd1\xaa\x2b\xba\xc7\x50\xfc\xb0\xe1\x05\xb3\x67\xa7\x9f\x2a\xab\x64\x3e\xd9\xc8\xe4\x96\xaf\xb3\xe8\x36\x0e\x84\xd1\x9d\x55\xf7\xe2\xc8\x6f\xbd\xe0\x77\xf5\x18\xba\x12\xff\xe5\xe9\xd7\x1b\x21\x79\x34\x72\xb7\xf5\x56\xba\xb8\xa9\x52\x1f\x16\x8f\x69\x4b\xbe\x5b\x0c\xbc\x5a\xd2\x28\xfd\x26\xb2\xf5\x18\x1a\x86\xf3\x74\x8c\x3c\xd5\x86\xe5\x4b\xe8\xbb\xdd\x2f\xe3\xd4\x02\x4e\xc3\x5c\xca\xcf\xf4\xcd\xc8\x9b\x2e\xda\x2c\xd3\xb7\x07\xcc\x1e\x43\x93\xef\xcc\xff\x68\x1f\x47\xb7\x38\x18\x63\xa6\x72\x14\x49\xd9\xf0\x5a\xb3\x11\x6b\xb8\x85\x55\xdc\xa1\xee\xc7\x4f\x3d\x1f\x5b\x7c\x0c\x55\x09\xe5\xad\x5c\x7a\xf5\xc5\xe4\xfe\xb3\xd8\xf7\x64\x77\x48\xfc\x63\x0b\xa8\xf8\x53\x79\x2f\xbe\x8b\x21\xfc\xc9\xa9\xfa\xfd\x87\xea\x31\x94\xe6\x09\xf0\x52\xc0\xbe\xa5\xc4\xea\x95\xbd\x1f\x35\xe1\x43\x29\x91\x7d\x56\xe7\xca\x56\x86\xaf\x71\x91\x36\xaf\x8d\x5f\x0d\xb6\x1d\x43\xe5\x48\x38\x76\xb3\xe9\x60\x51\xad\x3f\x68\x1b\x0b\x48\xae\x7e\xac\x37\x28\x96\xb2\x13\x28\x36\x95\xc5\x76\xbb\x9f\xc6\x3d\x78\xfc\xcd\x52\x8e\xd5\x12\x2c\xe7\x4b\x9d\x8d\x13\x7b\xb5\xfd\x21\x28\xbf\x91\xc1\x62\x06\xfd\xe9\x10\x71\x54\x51\x79\xff\x59\xd5\xa4\xdc\x82\x63\xe8\x74\x6e\x96\xaf\xda\x1d\x3d\x2d\xc4\x01\x69\x8a\xca\x88\xd6\x22\x89\xaa\x22\xd6\x35\x47\x4e\x74\x2b\x2e\x8e\x9e\xec\x57\x2b\x8b\xc7\x50\xfb\xc8\x64\xfa\xcd\xbc\x0b\x89\x4d\x05\x74\x6a\x8f\x0a\x25\x86\xae\x5e\xd5\x98\x18\xa7\x94\xfa\xc0\xa6\x2f\xa1\x2f\x62\x56\x1e\x74\x0c\x35\x77\xde\xf1\xbd\xd4\x80\x7e\xb7\x9f\xff\xad\x9c\x4c\xb1\x22\x6c\x1e\x9f\x57\x76\x83\x39\x0b\xd6\xd9\x6f\xf0\x9e\xd5\xc0\x0f\x71\x0c\x8d\x43\x77\xd9\xbf\x86\x2e\xf6\x06\x9b\xa0\x52\xe9\x09\x76\xf6\x2d\xf7\xd7\x22\x33\x3c\x26\x08\x1b\xb9\xec\x82\xc6\x0b\xe6\x25\xc7\xdf\x2c\xf4\x1d\xe7\x62\xbb\xa4\x1f\x1d\xfa\xdd\x77\x5e\x4c\x6a\x53\xa7\x96\x3f\x88\x21\x24\x88\x2b\x90\x71\x3d\xc3\xb9\xa2\x18\xfd\x82\xe2\x18\xea\x30\x65\x32\xff\x39\x64\xea\x7c\x85\xb6\x74\x3c\x0d\xd0\x79\x83\x28\xdf\xe8\xf4\x4b\x09\xe2\xec\x22\xec\x61\x51\xef\xa8\xe1\x8a\x63\xe8\x17\x42\xc1\x62\x7d\x57\xaa\x64\x52\x04\xc9\xe6\x62\x28\xe1\xf4\xab\x35\x95\x4c\x2f\x44\x01\x9b\xd3\xab\xe0\xfc\xda\xc6\x20\x9e\x63\x28\x26\xeb\xbd\x18\xdd\x57\x59\x5e\xea\x0c\x84\xaa\xf9\x6a\xb3\xf6\x42\x40\xcc\x95\xf2\xb2\xe7\x0f\xda\x7a\x47\xa4\x76\xda\x5d\xdf\x1d\x43\x6f\x66\x45\x08\xd2\x77\x3e\xcc\xf4\xd7\x95\xd1\x71\xa1\xea\xb8\x75\xe9\x76\x61\xf9\x86\x81\xc1\x05\xfc\x31\x0d\xa3\xb9\xf3\x98\x04\xc7\x50\x7e\x49\xcf\x17\xf7\x85\xde\xbd\xcf\xb5\xac\xba\xb4\x12\xca\x9e\xf0\x4e\x0c\xc7\xe4\x45\x99\x29\xf6\x94\xba\xe3\x67\x57\x9e\xa7\x1f\x8e\xa1\xba\xb6\xaa\x01\xbe\xae\x6c\x0a\x6b\x3f\xae\x36\x7e\x0d\xd4\x99\x8c\x5a\x66\x9b\xf4\xbe\x37\x9f\xd2\x68\xf7\x78\x84\xf1\xfd\x30\xeb\x31\x34\xd8\x33\xce\xd5\x11\xd7\xc7\xfe\xec\xfe\x10\x69\xf9\xc7\x3c\x3e\xa9\xac\x86\xb3\x69\xb6\x17\x07\xa4\xbe\x5d\xf4\xe3\xcb\x34\x39\xfe\x66\xb1\x30\x53\x96\xce\x59\x28\x93\xb4\x65\x3e\x58\xc9\x1f\xb3\xea\xc1\x6a\xf6\xcf\x2f\xa1\x3c\xc4\xa0\xbc\x92\xab\x74\x55\xb8\xf6\xf8\xff\xb1\x58\x68\x35\x57\xfd\x84\x75\x43\xac\x8c\xd6\x8b\x55\x84\x7a\x46\x08\x63\xef\x89\x1b\x7c\xdc\x5d\xce\xb2\x52\x4e\x41\x68\x8a\x3f\x3e\x86\xfa\x0e\x7d\xb1\x26\x11\xde\xa2\x8f\x1e\x4d\xac\x39\x14\xed\x75\x1f\xe1\x4c\xdc\xd8\x76\x5f\xd9\x0f\x3a\x67\xa7\xe3\x85\x23\xb1\x7c\x0c\x5d\xb6\xd4\x24\xcf\xfa\x58\x69\x22\xd6\x22\xd3\x7f\x7d\xf3\x47\xd9\x0d\x56\xce\x8c\x84\xb4\xed\x32\xec\xb4\xac\xad\xf1\xa6\xf3\x71\xff\xff\xd0\xe2\xc3\x27\x92\x4c\x7e\x1a\x1c\x52\x92\xcf\xdd\xb6\xbd\x9e\x19\x35\x87\xe4\xf7\x19\x06\x52\x89\xa6\xb5\x8e\x56\x4c\xcd\x35\x65\x1f\x43\x5f\x9e\x59\x66\xbf\x42\x29\x5e\xb1\x3a\x5b\xb7\xa9\xe0\x9e\x7f\xb3\x7d\x5a\x55\xb9\xe6\x0a\xa9\xcb\xc4\xe6\xeb\xe5\x70\xec\x24\xa2\x63\xa8\x2a\xaf\xc3\x43\xbf\xb3\x75\xd7\x3e\xe7\xff\x54\xfd\x54\x9b\xa4\x3d\x5e\xf9\xb9\xcd\x2d\xbb\x9d\x8f\x6a\x69\x5f\x56\xb0\x3b\x91\xe9\x18\x9a\x2e\xe3\x6d\xbd\xec\x7a\x33\xa9\xbf\x3d\x65\x1f\x7d\x53\xf0\x9d\xf6\x2a\xfa\x68\x1e\xad\xb0\x18\xcd\xb2\xaa\xc7\xa0\xbc\xe2\xcf\x63\xe8\xd9\xea\xab\x0e\x89\x87\x43\x2f\x56\xc4\xdb\x36\xd5\x28\x18\x2f\x61\x70\x86\x2e\x84\x95\x10\x39\x76\x51\x50\xa7\x71\xa9\x94\x68\x1e\x43\x9d\xdc\x10\x33\x44\xc4\xf6\x7e\xcd\xaf\x55\x3c\x14\xed\x8a\x25\xfa\x94\x83\xe1\xbe\xf4\xca\x09\xe7\xe3\xcd\x64\x39\x92\x63\xd2\x8f\xa1\x5b\x3d\xe1\xf5\x17\x6a\x78\xbb\x8d\x83\x86\xcc\xbb\x43\x0d\xc7\x10\x26\xb2\x0f\xbe\xa9\x44\x85\x35\x7b\xc5\x87\x97\x6b\xca\x3b\x1f\xbf\x15\x67\x3c\x9c\xcd\xf9\x9c\xbd\xba\xe0\xe3\xd3\xde\xd0\x91\x5c\xbe\x94\xb3\xb3\x23\x19\x72\x1a\x03\x9b\x58\x24\x8f\xce\x21\xa4\xef\x18\x5a\x15\x66\x9d\x6e\x14\xf6\xcc\xac\x36\xd7\xe1\xa9\x99\x0a\x75\xf7\x93\xb2\x2e\xcf\xf5\x59\xdd\x37\x73\xaf\x8d\xa6\x98\xc3\x67\x0c\x8f\xa1\xcd\xe4\xbd\x8a\x21\xaf\x2a\xc7\x12\xf1\x8a\x8b\x57\x0b\x0d\xd0\x87\x54\xaa\x3b\x32\x4e\x6d\xf2\x7d\x9d\x2b\xa1\xb8\xe9\x8d\x1f\x7f\x0c\x15\x11\x54\x26\x65\xcb\xb2\x5d\xcf\x7f\xfb\x74\x81\x5f\xe1\xe6\x8c\x5e\x7a\x88\xd7\xae\x3f\x29\xf1\xb0\x6f\x28\x5b\x3e\x47\xc8\x8b\x63\xe8\x22\x4d\x4b\x1b\xf5\x0b\x95\x10\xbc\x2d\x75\xbd\x0d\xd9\xc7\xf9\xfb\x0e\xb2\x74\x8f\x4c\xee\x08\x51\x78\xc8\x52\xa4\xf8\x91\xe4\x1e\x43\x09\x17\x86\x14\xce\xce\x30\x0a\xa6\xaf\x11\x98\xe8\xc6\xd7\x7e\xbc\x73\x27\x6e\x55\xf7\x6c\xc9\x05\x9d\xd0\xf5\x42\x1c\xac\x97\x4e\xc7\xd0\xd7\x02\xfc\x14\x92\x3c\xcf\x98\x5c\xa9\x1e\x92\xe7\xba\x79\x2d\xa8\xb2\x2a\x71\x7b\x70\x99\x29\xaf\xc4\xb8\xd5\x5e\xa7\xd5\xba\x74\x0c\x6d\xba\x6b\xf1\xba\x98\x13\xcd\xd5\xb4\xf3\x6a\x27\x7e\x01\xcb\x15\x8d\x97\xb7\x14\x5f\xcd\x75\xf9\x99\x0a\xaa\x16\x5f\xb8\xd6\xf0\xf9\x18\x7a\xeb\x79\xa0\x4e\x37\x99\x8f\x2d\x06\xd1\xae\x94\x90\xc1\xfc\x0e\x53\xff\xa7\xd9\xd7\x29\xef\xd5\x6c\xb1\x4c\xec\x70\x1c\xb8\xf9\x8e\xa1\x74\xaf\xc9\xb2\x46\xe4\xd6\x85\xce\xd9\x4e\x71\x16\x3d\x6e\x6e\x99\x51\x54\x17\x32\x6d\x0a\x33\xa4\x53\xf8\x0a\x2b\xa2\x1c\x94\x38\x86\x8e\xbf\xda\xe3\x7f\xfe\x90\x3e\x8d\xa1\xb7\x6a\xf9\x2b\xb3\xa3\x1c\x4f\x66\x53\xc3\xf7\xf0\x05\x4d\xef\x27\x87\x39\xc9\xdf\xc7\x04\x8f\xa1\x69\xe6\xa4\x02\x06\x14\x6c\x3a\x1f\xe7\x04\x25\x36\xe0\xdc\x2b\xdb\xac\x8f\x1e\x77\x2a\x0c\x7c\x4d\x24\xfb\xfc\xf0\xdd\x28\x5b\xfd\x31\x54\xa7\x0c\xbd\xba\x3c\xef\x55\xf6\x0f\x92\xa7\xe3\x16\xb3\x9b\x45\xee\x4f\x2f\x52\xf3\x72\x0e\x5f\x2e\xe9\x37\x91\x7f\x4c\x63\x75\xfc\x4e\xa8\xb8\xdc\xbc\x66\x36\x40\x35\x85\xb3\x6a\x29\xf4\xc3\x58\xf2\xd4\x2c\xc0\xee\x6f\x2c\xbe\x93\x38\xab\x69\xd6\x43\x67\xa6\xe1\xe1\x83\xfe\xef\x0e\x03\x81\xc7\x66\xbe\x61\x26\xac\xcc\xad\x5a\x65\x14\x0d\xdd\xd8\xbb\x78\x59\x6b\x4c\x7d\xa0\x9e\xd1\xcd\x71\x97\x87\xe3\x83\xe0\xbe\xe6\x36\xdb\xcd\xe3\x69\x0d\x69\x1b\xed\x00\x6e\xe3\xd2\xe2\xaa\x9d\x67\xa2\x9c\xe7\xc1\xb2\x53\x9c\xe2\x90\x8a\xd6\xfc\x59\x71\xed\x52\x03\x90\x6a\x2d\x29\x89\x8f\xef\x29\x29\x79\xfc\x7e\x4c\x7e\xf0\xf4\x72\x2c\x97\x5d\xcb\x87\xe5\x0f\x1f\xef\xfd\x98\xd9\x63\xc0\xcd\xcc\xb0\x6a\xbc\xae\xe1\xdf\x91\x5d\x32\x6b\xf3\xea\x18\xfa\x29\xfe\x49\x4c\xaa\xf8\x5c\xdf\xe8\xf0\xd5\xea\x04\xbb\x3e\xf9\x38\xb3\xcd\x9a\xf4\x81\x8e\x06\xba\xc2\xc6\xb5\xe2\xce\x45\xe9\xff\x8b\xa9\x1b\xf0\x7f\xb7\x34\x6f\x0c\x34\x2c\x2f\x29\x09\x0f\xdf\x20\xa9\xeb\x92\x92\x7f\xfb\x87\x9b\xf4\xb4\x7e\x8e\x9d\xf5\xf4\xbc\xc9\xf0\x71\xb9\xb2\xad\xe0\x3c\x82\x42\xe5\x05\x41\xc4\x5e\x52\x14\x6d\xad\xa6\x91\x7e\xcc\x83\xff\x8b\x7f\xb8\xe7\x15\x34\x49\x34\x34\x34\x39\x34\x74\x0f\x34\x34\x34\x4f\x49\xc9\xff\xfe\x17\x24\xe3\xa1\x04\x03\xbd\xaa\x51\xec\x52\xe6\x40\x15\xe6\x3a\x55\x42\x31\x03\x83\xdc\x55\x2c\xc5\x54\x53\xaf\x40\x4e\xed\x37\xcd\x93\x83\xbd\x0a\xf6\xe7\x18\xfe\xc0\xab\xca\xa2\x5d\x96\x04\xbf\x6c\xfc\x95\xe7\xdf\x19\xe8\xf9\x6e\xe4\xac\x57\x50\x85\x73\x0b\xc9\x5e\xdd\x99\xec\x74\x9a\xb9\x75\x67\x64\xcd\x9d\xed\x34\x3e\x86\xc7\x9f\x78\x59\x0f\x8d\x13\x2f\xcb\x36\xe9\xa7\x49\x92\x71\x65\x69\xee\x5e\x6d\xc8\x30\xcb\x9a\x55\x5f\x4f\xdc\xdb\xfa\xb7\xa3\x0d\xfd\x41\x88\x1b\x8f\x63\xbe\xf4\xfe\x91\xd5\xde\x3c\xf1\xb2\xce\x7e\x2b\xcb\x4b\x9e\x1c\x46\xfe\x2a\x7b\x26\x40\xef\xd8\x02\x99\xd2\xa3\x01\x11\x7a\x19\x25\x8f\xa8\x8f\xa4\x4a\x2c\x18\x4b\x7f\x64\xb5\xce\x27\x5e\xb6\xd0\xed\xa9\xcb\x70\xb8\xe8\xc1\x23\x6b\x3f\xce\xfe\x96\xc9\x64\x36\x7a\xa1\x4b\xec\xab\x67\x15\x3d\x8a\x23\x13\x06\xeb\xab\x9f\xff\xbf\xbf\xac\xc1\xbf\x8b\xae\x37\x26\x1c\xe6\x25\x8d\x8e\x76\xfc\x38\x78\x06\x57\xe8\xdd\x3b\xaf\x9f\xd4\xfd\x86\x64\x23\x22\x42\xac\x15\x4a\x59\xee\x72\x84\x0d\x62\x69\x1f\x9c\xcb\xc6\x94\x23\x26\x34\x3c\x74\xfe\x1d\xe7\x25\xed\xf1\xb7\xb9\xdc\x80\x15\x22\xe9\xb1\x9a\x8e\xe5\x84\x88\x7f\x01\x0d\x77\x94\x2c\x85\x73\xf2\x02\xd9\x41\x56\x65\xf9\x90\x8a\x5e\x05\xfc\x39\x72\x2e\x14\xe7\x25\x8d\x86\x79\x7c\xae\xd4\xa4\x3f\xd5\xed\x82\x14\xd6\xa2\x4b\x2d\x0d\xe1\x95\x4f\x0b\x0d\x6a\x18\xe4\x1f\x14\x26\x29\xc7\x7f\x71\x4a\x24\xf9\x91\xe6\x8b\x9c\x0b\xc5\x81\xe7\x52\x2c\xe4\x6f\x9c\x3f\x9b\xdd\xfb\xd6\xcd\x39\xaa\x94\x14\x38\xad\x19\xb3\x4b\x83\xd7\xa8\x9e\xf0\x3d\xad\xb0\x8c\x3d\x97\x36\x16\x39\x17\x8a\xf3\x92\x86\xfd\xed\x7d\xf8\xb1\x35\xfe\xfc\xdb\x2d\xee\xfb\x68\xc9\x77\xbf\x5a\xf8\xbf\xb6\x39\xc7\x74\x87\xc4\xe6\xd2\x59\xfd\xaa\x85\xeb\x1e\x3f\xec\x2c\xb6\x3c\x64\xff\x1d\xe7\x25\x8d\x76\xca\x03\xe1\x23\x75\x5d\x52\x1a\x0d\xfd\x44\x0c\x38\xff\x5d\x7c\xbc\x31\xd0\xd0\xbc\xa4\xd0\x3c\x3c\x0c\xfe\xdd\x5d\xe7\x77\x81\xa1\x9a\x9f\x27\xd1\xa0\x1b\x26\x1b\xc4\xa8\xaa\xb9\xb7\xf3\xcc\xbb\xbc\xc6\x46\xf1\xb0\xa6\x5e\xb4\xac\xe0\x39\xdf\x95\x4b\x43\xae\xc8\x37\x0a\x8a\x03\x07\x26\x6e\xc8\xbd\x28\x65\x00\x46\x68\x22\xee\x9c\x87\x8d\x47\x99\xc8\x32\x10\x6c\xce\x7e\x76\xb1\xa5\xae\x6e\x72\x3f\x65\xf8\x9d\x01\x72\x2e\x14\x07\xbe\xb0\x6e\x84\xf7\x48\x9c\x11\x1f\x43\x0e\x30\x2a\x9f\x72\x67\x27\xfe\xc0\xba\x37\xf7\xaa\x7e\x93\xbd\x54\xfb\x2e\x57\x66\x46\x25\x8e\x3c\x72\x2e\x14\x07\x9e\xfb\x3c\x6d\xe0\x89\xad\xf6\xeb\x01\x1e\xb2\xb6\xc9\x61\xe3\xf3\x3b\x37\xa9\xc3\x5e\x8c\xb6\x8e\x3c\x6c\x7f\xf3\xac\x6f\x89\x50\x90\x02\x39\x17\x8a\x03\x07\x06\x23\xf1\xdd\x4f\x40\xbf\x6f\xfb\xe5\x0c\x5e\x35\x01\x9e\x50\x07\xad\x13\x83\xfc\xf5\x66\xeb\xa9\xa5\xe2\x50\x09\x9a\xe5\x94\x58\x0f\xb9\x7f\xc7\xfd\x15\x98\xff\xec\x35\xbf\x8b\x8c\xc1\xbf\xdb\x01\x7e\x17\x81\x65\xb4\x64\xde\xe0\x98\x5b\xf9\x9c\x31\x0e\x4d\xad\x9b\x66\x43\x44\x70\xcb\xb0\x36\xbb\xd7\xc1\x53\xf6\xf2\xda\x8b\xae\x1f\x6f\x21\x97\x0e\xc5\x81\x23\xc0\x25\xc7\x43\xb0\x99\x3d\x24\xcf\xe4\xb9\x38\xb9\xce\x41\x9b\xfd\x69\x70\x33\x84\xe4\xb1\x89\x67\xc4\x05\x9f\x71\x29\xe9\x50\x49\xe4\x5c\x28\x0e\x7c\xa9\xc8\xc9\x26\x33\x3e\x12\xc4\xb6\x66\x46\x63\xee\xa9\x33\x53\xa5\x77\x09\xd3\x98\x0d\xbf\xf8\x58\xd7\x14\x70\xc7\xa3\x50\x45\x39\x0d\x39\x17\x8a\x03\xcf\xad\xd6\x7e\x48\x95\x41\x50\x21\xbb\x1c\x79\x18\xf8\xe5\x9c\x30\xb3\xbb\xd3\xfd\x2f\x95\xed\x4f\x5e\x4e\x3e\x23\xaf\xa9\xba\xdf\x17\x88\x9c\x0b\xc5\x81\x23\x10\xf2\xb8\xd2\xb8\x45\x85\xef\xd0\x51\xa9\x86\x3e\x99\x61\x83\x53\xaf\x4f\xf9\x29\xda\xd9\x27\xaa\x2b\x49\xe5\xf6\x0a\x85\x39\xa4\x1e\xf2\xff\x8e\xfb\x2b\x02\xff\xdd\xf8\xff\x21\x03\x50\xdb\xf1\xef\x32\x90\xf5\x3a\xfd\x85\xbd\x35\xd7\xce\xf5\x4d\x2e\xfb\xfb\xd8\x23\x5f\xf6\x6d\xbc\x33\xdd\xcc\xd4\x4d\xd3\x3f\xd9\xcf\x46\x70\xe0\xca\x21\xd7\x0e\xc5\x81\x33\x10\x58\x5f\xee\x37\xc2\x7d\x68\x11\x37\x96\x14\xda\x84\x53\x22\x3e\x2b\x11\xa2\xf5\xcc\xc0\x77\x35\xe5\xae\xd7\xc5\x0f\x2d\xef\x2f\x22\xe7\x42\x71\xe0\x6b\x25\x3b\xe4\x6e\xa1\x58\x64\x51\x2a\xd0\xf0\xb9\xab\xb6\x89\xb5\x2d\xf2\x9b\xf9\xa3\x28\xef\x32\xb4\x27\x2f\xc7\x01\xa2\xba\xcd\x25\xe4\x5c\x28\x0e\x3c\xf7\x76\x7c\x6b\x45\xd1\x6a\x17\xe1\xc4\x38\x4e\xb8\xa6\xb7\xd5\xd4\xcc\x3b\x55\xbd\x0e\x47\x83\x1f\x8f\x1a\x03\x26\x2b\xbe\x54\xb3\x22\xe7\x42\x71\xe0\x0c\x9c\xda\x4e\xb9\x51\x78\xc5\x7c\xb2\x59\xd5\xfb\x93\x76\x40\x3a\xa1\xc3\xa9\x7b\xab\x52\x3c\xe6\xa2\x0d\x5b\xeb\xa2\x51\x9b\xb5\x19\xc8\x0c\x40\x71\xc8\x0c\xfc\xe7\x14\xf6\x0f\x19\x80\x3a\x1b\xfd\x2e\x03\x81\x9e\x7b\x24\xeb\x1e\x23\x16\x2c\x97\x5a\xd9\x69\xb1\x3b\x58\x98\xde\xf4\xd5\x32\xfb\x48\x0c\x47\xb6\x72\x97\x5b\xde\xa7\x56\x3d\xba\x56\x10\x1c\x38\x03\xfb\x29\x6c\xb0\x67\x15\x6a\x2a\x11\xab\x36\x57\xde\x04\xa4\x4c\x75\x97\x97\x71\x95\x5f\x97\xca\x9d\xeb\xb1\x69\xbb\x72\x36\x47\x1a\x39\x17\x8a\x03\x5f\xab\xd7\x31\xce\x39\xdf\x99\xac\xe2\xcd\x57\x2e\x7c\x08\x6e\x95\xa1\xa2\x94\xe9\x7a\x7e\x5f\x4c\x10\x87\x1f\x4b\xf1\x9c\x37\x16\x2e\x31\x72\x2e\x14\x07\x9e\x9b\x77\xe8\x4a\xfb\xa2\x75\xa4\x83\x80\x24\x34\x76\xf2\x93\x2d\x9b\xc0\xcb\xbb\x41\x05\x68\x0a\xa5\xec\xdf\x72\x4e\xbf\x78\x61\x84\x8b\x9c\x0b\xc5\x81\x33\x60\x44\x1a\xca\x31\x10\xf4\x0d\xad\x75\xd8\x55\xef\xf2\xdd\x80\xbe\xe4\xb3\xb4\x63\x8c\xe1\xe1\xfa\xa4\xab\xaa\xb7\xf5\x03\x26\x9e\x22\x33\x00\xc5\x1d\xdd\x07\x6e\xfe\x73\x06\xa0\x0e\xaa\xbf\xcb\x80\xdb\xa9\x67\xf7\xe8\x67\x54\x1d\xad\x7d\xbb\xa9\xaa\x1a\x07\x53\x17\x78\xd1\xd2\xf1\xbe\x52\xc7\xe2\x7a\xac\x6d\x76\xe2\x14\x56\x1e\x6d\xaf\x10\x1c\x38\x03\x09\x94\x37\x35\x49\x84\xfa\x4a\x55\x96\x45\xd5\xb9\xe1\xa3\x23\x95\x12\x6d\xf8\xbb\xd9\xb8\x9d\x16\xf7\xf4\xd9\xb0\xf0\x23\x3e\x20\xe7\x42\x71\xe0\x6b\xf5\x41\x8f\x66\x56\x77\x26\x66\x9a\x73\xaa\x73\xd0\x36\xed\x1a\x19\x7f\xf1\xcf\x88\xa2\xe8\xc1\xc5\x24\xb1\x0b\xca\xfc\xc3\x95\x67\x90\x73\xa1\x38\xf0\xdc\x2d\xeb\x65\x26\xe3\x80\xc8\x90\x48\x77\x5b\x29\x1f\xc9\xb5\x34\xad\x70\x0f\xe9\x9d\x6d\x1b\x55\xd3\x4a\x72\x8f\x54\xbc\x67\x67\x91\x73\xa1\x38\x70\x06\xc2\x48\xa9\x59\x1e\xd5\x98\x23\xf0\xbf\x7d\x55\x3e\x2d\x33\xf5\x6e\x77\xcf\x63\x4e\x86\xa0\xb6\x0e\x9f\xd5\xb9\x5a\x0d\x28\x99\x41\x66\x00\x8a\x3b\xba\x0f\x38\xa3\xc8\xc0\x8d\x7f\xf7\x49\xdf\x1b\x8e\x09\xf3\x92\x45\x47\x43\xfb\xdb\xbf\xd2\xea\xa2\x9a\xcc\xcf\x7e\xaf\x3b\x4c\x16\x93\x43\x3f\x88\x77\xd7\x3e\x92\xaf\x58\x64\x2a\x27\x4d\xef\xe4\x34\x7f\x54\xb9\x6c\xf9\xd4\x43\xef\xdf\x71\x5e\xb2\x68\x1e\x7f\x9f\x4c\xa9\x9d\xc3\xa3\x3f\xca\xbf\xf0\x21\x91\x6a\x37\x8f\x7e\x9b\x5d\xcb\x8f\xf5\x6a\xff\xdd\xfe\x4b\x12\xa1\xbe\xf9\x4d\xcc\xf6\x0e\xc8\xc9\x50\x9c\x97\x2c\x1a\xe6\xdf\x27\x1b\xcc\x91\xd9\xeb\xfc\x34\x66\x52\x6a\x9f\x10\xb8\x11\x33\x68\x79\xd9\xa8\x2f\x94\x12\x51\x72\xfe\x93\xfc\x47\x9a\x98\xc0\x52\x7a\xe4\x64\x28\xce\x4b\x16\x0d\xed\xef\xd7\xac\xa5\x44\x22\x5c\xc5\xba\x9f\x67\x2a\xf5\xeb\xaa\xc1\x2d\x84\x0b\x1f\xfe\xb6\xec\x76\xba\x61\x63\xa9\x34\x46\x6f\xb6\x7c\x77\x80\x07\xd7\xbf\xe3\xbc\x64\xd1\x4e\xa1\xa1\x79\x20\xa4\x7a\x39\xff\x5d\xfd\xe1\x8d\xfe\xd7\xf9\x1e\x59\x07\x41\x7d\xe1\x73\xbc\x0e\x62\x62\xd3\x68\xb9\x8b\x7d\xb3\x7f\xfe\x65\x2d\xb1\x93\x03\xed\xf5\xdc\x26\x96\x01\x4c\x52\x55\xbe\x46\x7e\x29\x3f\x34\xa5\xc7\x17\x8f\xa1\xdf\xf8\x23\x4e\xf1\x9a\xd1\x4e\x3c\x9b\xcd\x52\xb0\x7d\xfb\xc5\xd3\x08\x07\xd6\x07\xd3\x12\x96\xbd\xfb\xf8\xcb\xc5\xdb\x76\x07\x9c\xff\x2b\x75\xd0\x26\xfc\xdf\x2d\xed\xff\xd4\x41\xd2\x6a\x64\xa0\x4f\xef\x32\x49\x41\x0d\xd7\x9f\x52\x04\x11\x8d\xc9\xbd\xbd\x9d\x7a\x68\xad\xb1\x89\x5d\xc5\x32\x4e\xdb\x87\x1e\x98\x3c\x2c\xc7\x3f\xae\xfd\x27\xfa\xa0\xba\x13\x7d\xd0\x57\x73\x31\x61\x65\x2e\x5e\xce\x99\x1d\xf2\x72\x61\xd1\x99\x79\x23\x53\x4e\x63\x13\xce\xc6\xd8\xf0\xfc\xef\xcb\xd6\xcd\x7b\x72\x7f\xa2\xaa\x90\x3c\xd9\x07\x25\xbf\xb6\x6f\x6a\xa8\xda\x2a\x7e\x15\xf6\xad\x9b\x67\x75\x3f\x17\xdd\x4f\x49\xd0\x28\x1a\x10\x18\xb9\xc1\xf0\xc2\xeb\x5d\xb5\xc6\x9f\x78\xd9\xba\x93\x7d\xd0\xb9\xea\x11\x36\x31\xfe\x79\x11\x18\xf1\x4f\xbe\x69\x92\xce\x1a\xfa\xbc\xc3\x8e\x8a\x68\x6e\xc2\x8c\x22\xcd\xd4\xdb\x91\x3d\x3b\x7f\x64\xb5\x27\xfb\xa0\xbb\x42\x61\xc6\x5e\xc2\x95\xb6\xcc\x9a\x17\x44\x42\x65\xc3\xed\x8c\xbd\x9e\x05\x92\xe3\xe5\x75\x68\x93\xe9\xbf\x90\x09\xbe\x99\xfb\x47\x56\x7b\xb2\x0f\x7a\xc1\xaa\x7a\x57\x7f\xdf\xf0\xc9\xe9\x53\xcb\xf9\xc0\x0a\xeb\x1b\x4d\xbc\xad\x32\x1f\xdc\xe2\x6e\xa5\x51\xee\x76\x9d\xad\x5a\xa6\x3f\xd6\x07\x41\x45\xf7\x77\xfb\xb9\x69\xdf\xe1\x78\x48\xae\x0e\xd5\x9b\x52\x09\xc3\x36\x1e\x55\x2a\xad\xa5\x08\xd5\xd5\x0b\xd7\x4c\x79\x5f\x0a\x88\x2b\x97\x12\x1c\x9d\xbf\xa1\x38\xf0\x7e\xce\x4a\xae\xd7\x14\x90\xc1\x38\x19\xa7\x72\x8a\x72\xb8\xc2\x5a\x98\x4e\x33\x84\xc5\x97\x6a\xef\xdc\xd3\xda\xf6\xd4\x10\x9a\x44\x45\xe4\x5c\x28\x0e\xbc\xef\x9e\xa9\x38\x25\x75\xb6\x78\xf6\x62\x8a\xed\xde\x0b\xd1\xdc\xde\x40\x8d\x4f\x82\x9b\xb2\x4e\x59\x8c\xb3\xb7\x30\x3c\xcc\x16\xde\xc3\x8e\xfa\x2b\x08\x0e\x3c\x57\x34\x31\xf4\xc6\xc6\x58\x10\xf0\x59\x7e\x49\xd4\x7f\x48\x97\x37\xd8\xac\x8f\xa1\x5a\xa1\x39\x98\x39\x40\x8d\x45\x90\xaa\xc7\x01\x39\x17\x8a\xf3\x92\x26\xfa\x7b\xdf\x36\xb1\xc9\xd7\xc7\xd6\x74\x86\xd9\xdf\xda\x53\xdc\xaf\xa8\x8a\x39\x52\x71\xe8\x5b\xb1\xc3\x39\x35\x92\x78\x82\x68\xb9\xba\x79\x8f\x2b\xff\x8e\xfb\xf5\xfe\x7a\x20\x7c\x7e\xdd\xaf\xfe\xe1\x44\x07\x75\x1b\xf9\x5d\x02\xb2\x3f\x4a\x74\xcb\xb7\xdc\x29\xcf\xbd\x73\xcb\xd6\xf3\xa5\x64\xe9\x25\x9d\xed\x3d\x1f\xdc\x47\xec\x17\x37\x8a\x39\x6f\x52\x50\x1c\x35\x6c\x50\x1c\x38\x01\xb7\x46\x93\x7a\xa4\x1e\x60\xaf\xe8\x12\x4c\x93\x88\x4a\xab\xaf\x0e\x78\x59\x8e\xa9\x18\x6b\x17\x85\xfe\x28\x49\xaa\xcd\x49\x49\x41\xce\x85\xe2\xc0\x57\x0a\x7f\xce\x32\x58\x4e\x91\x40\x5f\x5d\xe9\xcc\x8d\x9b\x4b\x0a\xe8\x9e\xf9\x8c\x13\x6f\x2f\xde\x28\xbd\xe6\x23\x06\x77\x48\x3c\x1f\x80\x9c\x0b\xc5\x81\xe7\xa6\x57\x5c\xcb\x98\xc8\xf6\x3b\xe0\x2e\x1d\x64\xb9\x31\x54\x3b\x80\xbf\xf1\xe6\xa5\x05\xef\xd3\x0c\x5a\xdf\x40\x37\x27\xa7\xf4\x2e\xe4\x5c\x28\x0e\x9c\x80\x9d\x6a\xfa\xc0\x5d\x6f\x23\xbb\x21\x41\x11\xad\x97\x5e\x79\x5f\x70\x0d\xd9\x6d\x79\x09\x99\xbe\xe7\xc5\x98\x98\x52\xe1\x1e\x24\x21\x0b\x1e\x28\xee\xaf\x04\xfc\x67\xf3\xf8\x87\x08\x40\xdd\xd2\x7f\x7b\x13\x90\xbf\xd0\x4d\x55\x49\xda\x94\x32\x38\x98\xc1\x2b\x7f\x98\x72\xa1\x4e\x28\xa5\xe7\x67\x53\xdc\xb4\xfd\x1b\x7b\x9c\xe4\x07\xb2\x47\x37\x01\x08\x0e\x1c\x81\xfb\x11\x2a\x89\x3b\xd7\xdf\x87\x3e\x4b\x54\x16\xd5\xe1\x5f\xba\x69\x50\xf5\xf9\xfd\xea\x17\xb5\x33\xb0\xa7\x43\x0b\x9b\x86\x4b\x68\xc8\xb9\x50\x1c\xf8\x52\x29\xa6\x4e\x60\x70\x87\x3e\x5f\x90\xfe\xa8\xc7\x1a\xd6\xfc\x31\xcb\x7f\x6a\xf4\x82\x88\x68\x2c\x4d\xdc\xb5\xe1\xc2\xe5\x28\xd7\xa3\xff\x59\xa1\x38\xf0\x5c\xca\x66\xe5\xc2\xb8\xf4\x6a\xd7\xe8\xa9\x81\xfb\x95\x13\xaa\x1e\xc5\x4a\xea\x8b\xc4\x39\x93\x8b\x96\x4d\x05\x9a\xe9\x1f\xd8\x5e\x20\xe7\x42\x71\xe0\x08\x98\x13\x2b\x18\x3f\xc3\xe6\xbb\xf4\xfd\x61\x35\x0c\x2b\xc3\xb9\xd6\x8f\xf0\x32\xd5\x2b\x97\x96\x8b\xdd\xbe\x61\xa3\xec\x5f\x7f\x8e\x22\x0f\xf5\x50\xdc\x5f\x11\xf8\xef\x4e\xfe\x0f\x19\x80\xda\x5f\x7f\x97\x81\x8d\xac\xd3\x7a\x15\xd7\x66\xc7\x18\xac\xf7\x9a\x9b\x9f\x33\xc4\x4e\xf2\xac\x7a\xda\x8e\x5d\xc6\xce\x81\x99\xe8\x92\xd0\x66\x7d\x47\xae\x1d\x8a\x03\x67\x20\x1e\x97\x16\x87\x62\xe7\x81\xad\xaa\x60\xc2\x80\x17\x81\xf9\xf5\x14\xa7\x55\x22\xcd\xb8\x1a\xa1\xce\x66\xfc\xc1\x7d\xac\xca\x6c\xe4\x5c\x28\x0e\x7c\xad\xb8\xd0\xba\x0b\xf9\x38\xb4\x23\xb1\x8d\x02\x88\xa4\x44\x87\x63\x0f\x9e\x58\x96\x12\x10\xf5\x55\x57\xdc\x20\xb1\x99\x24\x0d\x59\x3f\x2a\x0f\x21\x38\xf0\x5c\x56\x21\x81\x1d\x19\xcd\xc0\xeb\x61\x4d\x79\x94\xc4\x43\xef\x32\xb4\x80\xe4\x0f\x33\x5e\xa7\x72\x28\xf0\xb1\xf1\x22\x26\x1e\xe7\x1c\x6d\x5c\x10\x1c\x38\x03\x1b\x11\x0e\x41\xd7\xb8\xb9\xfc\xeb\x53\x02\x3e\xb1\xe1\xa4\xc7\x3b\x4e\x14\xcb\xfa\x26\x74\xd4\xcd\x5b\x79\x06\x4a\xbb\xf0\x6a\x23\x33\x00\xc5\x21\x33\x50\x07\x51\xf0\x40\x1d\x76\x7e\x97\x81\x72\x3f\xfd\x14\xfd\xcc\xa4\x44\x99\x31\x19\x01\x3c\x83\x1d\x79\x27\xcd\x22\xbe\x3a\xc1\x45\x52\x83\xeb\xc4\x12\x89\x94\xde\x33\xc8\xb5\x43\x71\xe0\x0c\x1c\x3e\x6a\x55\xf6\x0a\x0e\x60\x96\xb9\xfa\xc5\x64\x4d\x93\xc3\xfc\x79\x8c\xe6\x55\x79\xf1\x9e\x20\x27\x29\xe2\x15\xca\x25\x67\x35\xe4\x5c\x28\x0e\x7c\xad\xbe\x6b\xe6\x58\x28\x2a\xe2\x19\x24\x3c\xda\xe3\x0f\xc5\x8b\x29\xc3\x5a\x8e\xa5\x9a\x21\x39\x55\x85\xbb\x97\xaa\x22\x96\xf1\x23\x0f\x39\x17\x8a\x03\xcf\xcd\x62\x4f\xbb\x2b\xc0\x22\x2c\x6c\x88\xc9\xbc\xd8\xac\x4d\x55\xb5\x4a\xa6\x46\x94\xf9\xf8\xa3\x86\x94\xce\x67\x41\x4c\x98\x7e\xff\x51\xd9\x09\xc1\x81\x33\x10\xc1\xa4\xf4\x02\xed\x26\xdf\xe0\x28\x99\xb0\x8f\x88\x5f\x98\xbe\xe8\x58\xcf\x1b\x3b\xb3\x3c\xd1\x19\xd7\x61\xe1\x88\xc2\xce\x45\x64\x06\xa0\xb8\xa3\xfb\x00\x44\xc1\x03\x75\xf2\xfc\x5d\x06\xee\x9a\xde\x09\xb1\x9f\xa6\xef\x97\xaa\xb8\x23\xf7\xa4\xdd\x05\xde\x62\x65\xec\xae\xe5\xcb\xec\xac\xa3\x8a\x37\x24\x1f\xab\xac\x87\x5c\x3b\x14\x07\xce\x40\x44\xbb\xfb\xd7\x9a\x67\x51\xf7\xf3\x86\x35\x67\x24\xe9\x0c\x5f\xf0\xdb\xfb\xb5\xe6\xe1\x4d\x16\xae\xe7\x8d\xbd\xf7\x61\xe1\x31\x43\xce\x85\xe2\xc0\xd7\x0a\xe8\xb0\x54\x0a\x7f\xbf\xef\x4a\x6e\x14\x1f\x51\x3a\x7c\x2b\x92\xc1\xa3\x39\xd4\x7a\xb8\x24\xb1\x69\xf7\x14\xa0\x9c\xc4\x79\x54\xf0\x40\x71\xe0\xb9\xd9\xdd\xf5\x76\x9c\x11\x64\x2f\x25\xea\x31\x12\x03\x30\xf5\x3b\xe1\x9e\x25\x31\x6b\x3e\x8f\x4a\xf4\xe5\x5f\xb3\x7d\x69\x3d\x38\xfa\x82\x10\x8a\x03\x67\xc0\xd5\xfd\xad\x33\x3f\x99\xb3\xfa\xba\x6c\xc9\x27\xff\x3b\x4b\x0c\xe2\xce\xf3\x3a\x0b\xbc\x52\xe3\x11\x15\x39\x35\xd7\x5d\x27\x64\x91\x19\x80\xe2\x8e\xee\x03\x10\x05\x0f\xd4\x67\xf7\xdf\x17\x3c\xa7\x72\x71\xea\x17\xe2\xa8\x68\x7e\xb8\x24\x31\x38\x61\x6c\x2d\x45\x6e\xad\x58\x09\xda\xa5\x5c\x92\x77\x7f\x4f\x1e\x5b\xa0\xd3\x80\x2c\x4b\xa0\xb8\x93\x05\xcf\x03\x3c\xa5\xa1\xb8\x09\x4b\xdc\x90\xb1\x56\xc6\x6a\xb9\xac\x9b\x4b\x5d\xbe\x96\x0a\x57\x82\x89\x78\x53\x64\x89\xb5\x07\x6b\x25\x90\x93\xa1\xb8\x93\x05\x4f\xfb\xe3\xfa\xc5\xea\xad\xcb\xf7\xb7\x9a\xf7\x22\xed\x63\x45\x12\xaa\xd2\xad\xa2\x5f\x1a\x5d\x81\x3f\x38\xe4\x25\x96\x80\x6d\x92\x20\x27\x43\x71\x5e\xb2\x68\x68\x98\x7f\x9b\xec\x21\x34\x2a\x27\x2e\x89\x49\xa1\x7d\xaf\x48\x37\x91\xb8\x74\xfc\x6c\x3b\x5e\x57\xb2\x78\x63\x3f\xa3\x83\xcc\x08\x1b\x56\xa7\x2c\xb2\xe0\x81\xe2\xbc\x64\x7f\x5d\x1b\x0f\x84\x54\x2f\xb2\xb0\x81\x7a\xec\xf6\x78\x61\x73\x97\x69\x7d\x8a\xf0\xa6\x97\x84\x94\x9a\xbd\x2a\x86\xfe\x99\x97\x81\xb3\x39\xc5\x59\x0e\xdd\x61\x04\x5f\xfc\x1e\x27\xa2\x3f\xfd\x7a\x0c\x9d\x14\x9f\x12\x48\x6c\x2b\x7a\x6c\xb0\x21\x3e\xfe\x24\xd4\x35\x82\xc8\x5c\x0c\x2b\x75\x1f\x56\x21\x7c\xfa\x4e\x03\xc7\x19\x9f\x17\xff\x6b\x85\x0d\xd4\xd2\x8e\x15\x36\xe1\xe0\xc2\x66\x75\xc1\x7b\x17\x8d\x8e\xce\x25\x65\x1a\x31\xdd\x91\xeb\xc1\xfe\x7d\x5f\xa3\x70\x33\x5f\x9a\x44\xff\x03\x51\x59\x52\xc4\x34\xe7\x9f\x28\x6c\xd0\x94\x4f\x74\x09\x14\x57\x31\x0c\x97\x87\x94\x53\xbc\xa4\xe7\xf7\x8c\xd9\x0f\xc2\xd6\x78\x7b\x16\x12\x49\x0b\x71\x3e\x0d\x93\xdc\xdf\x49\xe3\xfb\x23\xcf\x96\x9c\x2c\x6c\xd6\xce\x3e\x11\x7d\x10\xf5\xc4\xa2\x52\x9c\xd7\x5c\x41\xbc\x63\x85\x62\x87\x4d\xf1\xd0\x26\xe9\x33\x50\x83\x99\x8a\xe5\xc7\xfd\xf4\x8f\x3c\x49\xa3\x79\xe2\x65\x45\x8b\xf8\xda\x62\xd2\x6f\x49\xbe\x72\xbd\x94\xef\xb0\x3a\xf3\xc8\x30\xf6\xfb\x96\x18\x63\x23\x4f\x5e\xd7\xab\xe2\xb8\x05\x9e\xaf\x7f\x64\xb5\x27\x0b\x1b\xbe\xa7\x54\x8a\xa7\xba\x2c\x17\xdf\x45\x34\x11\x2e\xb2\x62\x93\x3b\x67\x25\xcd\xf7\x0b\x49\xbd\x1c\xaa\xb5\xb2\x17\xe3\x57\xa8\xfe\x23\xab\x75\x39\xf1\xb2\x3a\xb4\xcb\x8c\x1c\x6d\x0a\x73\xfb\x17\x82\x83\xb9\x09\xb0\x6d\x09\xd1\xbb\x1a\x27\x0d\x92\x48\xe4\x27\xd3\x70\x6e\x06\xf1\x1c\xfc\xb1\xc2\x06\x2a\xba\xbf\xdb\x9f\x8b\xa2\xdb\x75\x70\x3d\xdf\x6a\xcc\x35\xd6\x92\x7e\xe3\x2c\xf6\xa5\xea\x1e\x13\x5c\x17\xba\x9f\xd0\xa4\x56\x58\xf4\xcd\x82\xf0\xe8\x3c\x0d\xc5\x81\xf7\xe7\x83\xc7\x03\xfc\x09\x2f\x37\x3f\x3d\xb8\xe9\x9b\x6e\x9a\x86\x4d\x49\xf3\xfc\x0e\x63\x44\x88\x84\x71\xef\xbc\x6c\x1b\x8d\xdb\xfd\xdb\xc8\xb9\x50\x1c\x78\x1f\x5d\xa9\x90\xd9\xb5\x79\x8f\x75\xef\xd9\x26\xe6\xdc\x4d\x29\x58\x44\x9d\xb8\x64\x5f\xe7\x65\xa3\x45\x09\xfb\xcb\xda\xc9\x0f\xc4\x8b\x90\x73\xa1\x38\xf0\xdc\x37\xbd\x23\xf9\xe4\xa7\x43\x29\x4d\xdb\x37\xcf\xe9\x7a\x84\xf9\x75\x95\x0b\x7e\x32\xf6\xe2\xf3\x2f\x3e\xcb\xd8\xda\x3b\xb7\xd5\x80\x9c\x0b\xc5\x79\x49\xa3\xc1\x8e\xcf\xfd\x8c\x2d\xab\x3e\xa1\x98\xce\xfd\xb5\x53\x42\xac\xcc\xe9\xd2\x64\x9c\x65\x7c\x36\x2f\x8c\x78\xdb\xd4\x85\xe1\xaa\xc6\x62\x14\x35\xb2\xb0\x81\xe2\xbc\xa4\x4f\xfd\xa7\xb0\x09\xff\xc7\xc2\x06\xea\x36\xf2\xbb\x04\xbc\xb5\xd3\xe3\x29\xa3\xdd\xe5\xee\x16\x88\xca\x60\x0d\xbe\xa2\x88\x1d\x3f\xa6\xf2\xb1\x54\x91\xc9\x7f\xec\xd9\xdc\x6b\xee\xb6\x29\xe4\xca\xa1\xb8\x13\x95\xdd\xd0\xbb\x67\x85\x8f\x14\x38\xec\xcb\xa6\x89\x16\xe7\x4b\xb2\x9d\x85\x79\x6f\x2c\xc2\xd5\xfc\x68\x55\xc7\x2e\x8e\x9c\x7e\x78\xf4\x69\x1d\x8a\x03\x5f\xa9\xe6\x8b\xf5\x53\x8c\xad\x4e\x38\x97\x31\xf9\x86\x97\xb8\xe3\x59\xe7\x6e\xb7\x0e\x36\x08\x9f\x15\x09\xa9\xbe\xc2\x61\x91\xbe\x57\x8f\x9c\x0b\xc5\x81\xe7\x5a\xb0\x7f\xa5\xc5\x99\xc1\xb1\x7e\x40\xe0\x72\xad\xea\x12\x5a\x15\xb1\xec\x80\x06\xc0\xdb\xc8\x1c\x4e\x6a\xec\xbd\xea\xb6\x32\x84\x9c\x0b\xc5\x81\x13\x80\xc0\x60\x3a\x0b\x4f\xc4\xb9\xf0\x39\x7b\xff\x99\x59\x6e\xe1\xe6\xe5\xc2\xfc\x9f\xa9\x11\x95\x22\x51\xdf\xc7\xb0\x08\x61\x2c\x41\xc8\xc2\x06\x8a\xfb\x2b\x01\xff\xd9\x3c\xfe\x21\x02\x50\xb7\xf4\xdf\x45\x00\x0b\x57\xb1\x3d\x39\x66\x6e\x34\x3f\x34\x32\x87\xc3\x10\x6b\xd7\xc0\x12\xfb\x0b\x23\x22\x7f\x42\xc4\x64\x98\x45\x3c\x80\xe4\x09\x72\xe9\x50\x1c\x38\x02\x4c\x4f\x80\x42\x27\x97\x6a\x42\x0d\x17\xb4\x6f\x79\xf5\x34\xc1\xd4\x22\x53\x57\xbb\xf4\x24\x5d\x61\xe7\xd4\xef\x2e\xa6\x5f\x20\x40\xce\x85\xe2\xc0\x97\xaa\x93\x5b\x23\x44\x46\x6a\x8e\xf4\x9a\xa6\xbd\x08\x1d\xae\xa6\xac\x16\xae\xd0\x66\x91\x20\x05\xd7\x3c\x57\x4a\xaa\xfc\x99\xd7\xba\xc8\xb9\x50\x1c\x78\xae\x2e\xf5\x61\xc1\x3c\x45\x63\x05\xcb\x0c\xad\xf9\xf5\xd9\xc7\xaa\xd2\xcc\x9e\x55\x45\x81\x25\xa2\x31\x15\x12\xde\xdc\x68\x7a\x77\x90\x73\xa1\x38\x70\x04\x30\xe9\xdd\x76\x29\x6e\x0c\xc5\xf0\x76\xcf\x96\x98\xa6\x16\x7f\x4b\x8b\x3c\xb4\xc8\xa1\xee\xa8\x97\xa2\x55\x6c\x23\x4e\x7c\x5c\x87\x3c\xa4\x43\x71\x7f\x45\xe0\xbf\x3b\xf9\x3f\x64\x00\x6a\x7f\xfd\x5d\x06\x14\x0b\x73\x15\x06\x68\xb2\x5a\xc2\x18\x34\xc9\x84\x59\x28\x25\x0f\x10\xae\x53\xf6\xce\xd5\x4f\x26\xd7\x3d\x14\x70\x6e\x08\xed\x1e\x95\x60\x10\x1c\x38\x03\x02\x4e\x65\x6b\x35\x5a\x86\x8f\xdd\xcc\x7a\xce\x12\xb1\x5a\x39\x50\x2e\xbf\xbe\xfb\x1c\x9f\x72\x73\x7f\xf5\xa3\x36\x6b\xcb\x47\x0c\xe4\x5c\x28\x0e\x7c\xad\x24\x5f\x14\xf8\xbf\xab\x26\x34\x93\x2b\xd6\xf5\x4c\x23\x7a\x1a\x3e\xd3\x3d\x1e\x74\xe8\xbd\xf4\x9c\x93\xf2\x31\x06\x83\x7a\xf7\x38\x72\x2e\x14\x07\x9e\x7b\x51\x66\x44\x8f\x99\x68\x71\x7d\xe9\x8a\xa2\x72\xcb\x77\xe3\x2a\x79\x5a\xb2\xbb\x87\xe1\xa7\x2c\x2d\x9a\x31\xd8\x3f\x0d\x27\x9d\x43\xce\x85\xe2\xc0\x19\xf0\x0d\x23\x28\x4f\xa1\x0a\x18\x93\xf1\xa9\xc7\xa3\x26\xeb\x62\xc9\x86\xcb\x0a\x3d\x96\xfa\x16\x6e\x67\x75\x50\xd6\xbd\x6d\x55\x84\xcc\x00\x14\x87\xcc\xc0\x7f\x8e\x55\xff\x90\x01\xa8\xc3\xce\xef\x32\x80\xa9\xb0\xdf\xe0\x95\xeb\xef\x40\xdd\xee\xe2\xfc\xde\x35\x55\xef\x95\xe3\xcd\xa7\xc6\x5b\x0e\x99\x82\x18\x34\xbe\x04\xc9\xc6\x31\xc8\xb5\x43\x71\xe0\x0c\xc4\xe0\x6a\xba\x33\xf2\x3d\xbc\x8a\x75\xcf\x45\xf2\xfe\x62\x5c\x4d\xc4\x16\x42\x47\xb3\x3c\x5a\xe9\x9e\x8c\x43\xca\xf5\x90\xc1\x51\xe4\x5c\x28\x0e\x7c\xad\x94\xf7\xfa\x3b\x94\x3b\x6a\xaa\xae\xc7\xd5\xa5\xd2\x3c\x0e\xfa\xdc\xf5\xa0\x6e\x0c\x3d\xda\x50\x24\x4b\xb4\x0e\x4f\x37\x45\xe8\x28\x03\x50\x1c\x78\xae\xb8\x52\xea\xc3\x36\x6e\xa3\x4d\xc9\x4f\x37\x2d\x7b\x96\xd8\x6d\x48\x59\x18\xdf\xb2\xdf\xab\xda\x46\x7f\x93\x28\xb6\x61\x10\x30\x88\x9c\x0b\xc5\x81\x33\xa0\x1a\xf4\x25\x20\x54\xf4\x2e\x51\xba\x94\xef\xee\x65\xdd\x7d\x39\x01\x3f\xea\x8b\x16\xf2\xd9\x49\xf0\xb1\x4f\x26\xdd\x7a\x71\x84\xc8\x0c\x40\x71\x47\xf7\x01\x88\xc2\x06\xea\xe4\xf9\xbb\x0c\xac\xd0\x5a\x50\x20\x46\x84\xdc\x23\x62\x55\xf6\x9a\x0d\xb7\x0d\x34\x71\x5e\x69\x9b\x93\x8d\xb1\xcf\xe4\x01\xa3\x83\x3e\xb7\x8e\x9e\x48\x83\xe2\xc0\x19\xd0\x34\x48\x08\x53\x10\x1b\xbe\xb1\x71\xa7\x3c\x82\x48\x28\xa9\x36\xfc\x1c\x42\x3b\xb0\x77\x3d\x84\x4f\x67\xcf\xa8\x6e\x05\x71\x1f\x39\x17\x8a\x03\x5f\x2b\x5b\xa7\x38\x99\x1c\xab\x25\x52\x75\x6a\xff\x6a\xa7\x94\xf5\x07\x66\xeb\x6a\x62\x19\x66\xad\x52\x4c\xe8\xbd\x43\xfd\xa5\xae\xed\xc8\xb9\x50\x1c\x78\xae\xe5\xb2\x0d\xba\x6a\xff\x7d\x52\xcb\xd3\x2d\x55\x7d\x85\x8d\x0e\x63\x1b\x77\xe3\x7f\x9c\xc9\x24\xb3\xd3\x8a\x39\x9f\xcd\xde\xe7\x81\x9c\x0b\xc5\x81\x33\xc0\xb2\x39\xe0\xa2\x19\xef\xf4\x29\xb1\xd2\xa4\x6f\x2d\xf2\xf4\xce\xce\x27\x9d\xe0\xf2\x0f\x09\x39\xef\xe6\x19\xb1\xb1\xc4\x76\x56\x90\x19\x80\xe2\x8e\xee\x03\x2e\xff\x5c\xd8\x40\x7d\x76\xff\x7d\x61\x43\x79\xfd\x0a\x47\x0e\x31\x4b\x34\x25\x71\x9c\xac\xec\xf0\xf8\x36\x27\x86\x1e\x63\xb7\x47\xcf\x44\x71\xd9\xbd\x0a\xdf\x87\x59\x26\x47\xcf\xcd\x40\x70\x27\x0b\x9b\xce\x1e\xa5\x8b\x1d\x0d\xc1\x09\x49\x6c\x0a\x42\x6c\xe1\x55\xc6\x3b\x2e\xbb\x33\x8f\xf4\x23\x7e\xde\xac\x68\x93\xb9\x84\xb5\x24\x8f\x9c\x0c\xc5\x9d\x2c\x6c\x32\x13\xce\x32\x5c\x35\x6c\xbe\x50\xd3\x01\xc7\x59\x0e\x0f\x51\x54\xf8\xa8\xd7\x06\x17\x4b\x3b\xb8\xf6\xbd\xe8\xdb\x52\x06\xf9\x04\x72\x32\x14\xe7\x25\x8b\x86\xf6\xf7\x92\x4d\x25\xfe\xf4\x5a\x9a\x3a\x49\xed\x59\xde\xcf\x82\xfc\x29\x1a\x5f\x98\x83\x2a\xbe\x0e\x7d\xa5\xc9\xdf\x79\x7f\x4a\xc4\x8f\x33\xd7\x0a\x59\xd8\x40\x71\x5e\xb2\xa7\x40\x85\x0d\xd4\x8f\x9f\x8f\x17\x36\x3c\xfd\x15\xed\xa3\xbb\x92\x77\x74\x58\xb9\x0b\xaa\x0e\x3b\xb2\x9a\xe7\xf3\x36\xd7\xbe\x99\x19\xe9\x01\xdc\xe7\xf1\xef\x94\x0d\x1c\xdf\x1c\x61\x8f\x70\x7d\x0a\x36\xe8\x7f\x12\x51\x0e\xcd\x56\xd3\x5e\x16\xfa\xe1\x3f\x8d\x7b\x4f\xf7\x81\xe7\xe7\x3e\xae\x2f\x73\x22\xff\x73\x4f\xd8\x40\x2d\xed\x58\x61\xf3\x09\x5c\xd8\xec\xed\x1f\x66\x52\x92\x65\x7c\xc2\x51\xef\x5b\x50\x5d\xb5\x68\xaa\x15\x54\xcb\x93\x22\xe1\x52\xb4\xe2\x38\x7d\x06\x4d\xab\x2e\xfa\x4f\x14\x36\x92\x27\x0a\x1b\x4f\x8c\xa9\x76\x9a\x5b\x4f\xaa\x31\xbe\x31\xe7\xdf\xbf\x69\x1c\xd8\xfe\xed\x4b\x8f\x7c\x0e\x8e\x73\xf8\x6d\x41\xd8\xe3\x15\xd3\x9e\x3f\xf2\xf0\xc7\x6f\x0a\x1b\xab\x97\xed\xaf\x5c\xb9\x45\xf5\xe4\xcb\x10\xf7\xb2\x62\x48\x96\xe7\xbf\x96\xab\x4a\xc7\xdd\xa9\x4a\x2a\xea\x53\xf2\x9c\x94\xfd\x23\x8f\xba\x9c\x2c\x6c\xee\x6c\x3c\x8f\xad\xc5\xbf\x65\x7a\xd9\xb5\xde\x39\xd8\xa7\x25\x9f\x2b\x16\x2d\xf2\x35\x5b\x4d\x00\x7b\xf3\xf7\xda\x91\xd8\x5c\xbb\x3f\xb2\xda\x93\x85\xcd\x25\x3e\x4a\xa6\xf5\x49\xdf\x85\xcd\x17\x53\x86\xfa\xe5\x58\x31\x2a\x6c\x46\xcc\xfb\x49\x2f\x1c\xdf\x3b\x45\xc6\xf8\x0a\xc0\x8b\xff\xc8\x6a\x4f\x16\x36\x67\x1c\x03\x3d\x96\x48\x8c\x55\x95\xb5\xf8\x22\x72\x37\xa2\xe0\xb7\x67\x16\xad\x8d\x47\x9f\xf6\x7c\x56\x6a\x9d\x9a\xb2\xff\x2c\xfe\xc7\x0a\x1b\xa8\xe8\xfe\x6e\x7f\x6e\x4a\x18\xf7\x4c\x0d\xd4\xce\x0e\x0e\x1e\xdb\x91\xca\xc8\xf7\x99\xd9\xbd\x4b\xf1\x76\x89\x80\x33\xf3\x06\x8d\x44\x7e\x8c\x4d\x35\x72\x5f\x82\xe2\xc0\xfb\x73\x58\xd8\x39\xe3\x4e\xd3\x5c\x1f\xfc\xb7\x81\xda\x0d\x38\x5d\xc3\xc3\x57\x12\xcf\xf3\x0d\xbe\xf7\xad\xd0\xd8\xb2\x32\xde\x6d\xdd\x47\xce\x85\xe2\xc0\xfb\x68\x61\x08\xf1\x90\x84\x1e\xa7\xcb\xee\xb6\xd4\x3e\xf6\xc2\xcf\x20\xcc\x4a\xe3\xd3\x8c\xea\xba\x8d\x6e\xdd\x29\x1f\x5f\xc6\xf9\x1f\xd5\x0b\x50\x1c\x78\x2e\xdf\x78\x28\x85\xba\x41\x6b\x28\x3f\xce\x15\xff\x02\xf5\x09\x6a\x80\xce\x38\x95\xad\x62\x7d\xa8\x89\x7c\xbe\x8b\xe5\xea\x34\x80\x9c\x0b\xc5\x79\x49\xa3\x9d\xfa\xdb\xd3\xe3\xc1\x3b\x65\xcf\x97\xae\x7c\x3f\x9f\x7f\xd5\x98\x63\x96\xeb\x62\x27\x93\x64\x33\xed\x44\x72\xd3\xfa\x68\x45\x83\xeb\x75\x71\x67\x64\x61\x03\xc5\x79\x49\xa3\x79\x78\x20\x7c\x7e\xdd\xaf\xfe\xe1\x84\x06\x75\x1b\xf9\x5d\x02\xea\xc8\xaf\xb2\x2b\x7e\xe5\xbc\xe1\xc8\xd4\x36\x26\x66\x7a\xed\xa6\x59\x6b\x1b\x9f\xff\x8a\x31\xc1\xf2\xd8\xa2\x5f\xa3\x10\xaf\x12\x72\xe5\x50\x1c\x38\x01\x14\x98\x61\xf6\xd9\xb6\x17\x7b\x9b\x46\xee\xd1\x69\x39\xd0\x8d\x72\x8e\xce\x3c\x1d\xdd\x2b\xf3\xca\x6b\x26\xba\x53\x7b\xf8\xf0\x28\x59\x50\x1c\xf8\x4a\xf9\x5f\x67\x31\x7a\xd0\x43\x74\xdd\x22\x00\x17\xe6\x14\x24\xd1\x50\xec\xf8\x30\xd9\x23\xe7\x4e\xab\xf5\x96\x9d\xdf\xa8\x8e\x5b\x0f\x72\x2e\x14\x07\x9e\x4b\x23\x66\x30\x65\x4d\x71\x4d\x83\x25\xd3\x34\xff\x9d\x13\xdd\xb4\x65\x47\xe7\xac\xba\xd3\x0d\xfb\xa7\x70\x0e\x5e\xea\xd6\x4e\x6d\xe4\x5c\x28\x0e\x9c\x80\x24\xf4\xf8\x5b\xc3\x5a\x2c\x24\x6f\xc3\xee\x9d\x56\x64\x23\xb7\x57\x22\x5e\xdf\x74\x9a\x96\x23\xa0\x89\x2f\xdc\x6e\xb2\xb6\x09\x44\x16\x36\x50\xdc\x5f\x09\xf8\xcf\xe6\xf1\x4f\x85\x0d\xc4\x2d\xfd\x77\x11\xf0\x28\xb7\x3a\x4d\xc7\x08\x5f\x4e\x0a\x57\x12\x23\xde\x18\xf7\x30\x09\x22\x2b\x8e\x3a\xaf\x33\x94\xf0\x49\x90\xc3\xdc\x17\x9f\x13\xb9\x74\x28\x0e\x1c\x81\x4d\xa3\x6d\x2c\x1f\xf9\x42\x45\x75\xf8\xa1\x6f\x39\x46\x86\x73\x28\x27\x6c\xde\x9c\x7d\x4d\x61\xf9\xdb\x93\x79\x97\x33\xbc\x5e\xc8\xb9\x50\xdc\x89\x6f\xd6\x9d\x35\xe5\x6e\x47\x71\xd9\xbf\xce\x1d\x2d\x27\xb7\x51\x8a\x57\x4e\xf8\xf6\x10\x3d\xca\xc3\x2e\xf7\x47\x51\xa5\x6c\x88\xc4\x51\x1b\x0c\xc5\x81\xe7\x06\xc6\x14\xbf\x1f\xc5\x61\xaa\xca\x55\x2c\x6c\x33\xb8\x7e\xcb\x49\x55\x88\x9e\xaa\xc5\xd0\xfb\x05\xc5\x33\xfe\x83\xaf\x9f\xf5\x73\x8f\x7e\x42\x02\xc1\x81\x23\x70\x3f\x65\x9e\x54\x70\x00\xbd\x5f\x16\x0f\x66\xe5\x7e\x40\x77\x17\x6d\x8d\xe7\x5b\xee\xa4\xe1\xde\xfd\x97\xb9\xd1\xa9\x0f\xb8\x77\x90\x87\x74\x28\xee\xaf\x08\xfc\x77\x27\xff\x87\x0c\x40\xed\xaf\xbf\xcb\x00\xf9\x77\xba\xcc\xf3\x17\x70\x43\x1a\xd2\xdd\x0f\x68\xf6\x9a\x37\x88\x7e\xd2\x74\x94\x7d\x29\x78\x6f\xe8\x78\x50\xd8\xf7\xc9\x6d\xf3\xe8\x67\x69\x10\x1c\x38\x03\x6d\x9c\x14\x1a\x76\x83\xb3\x81\x59\x87\x58\xa2\x05\x68\xa3\x58\x17\x3e\xe5\x28\x2b\xba\x08\xdd\xc2\xb9\x30\x8a\x86\x39\xd8\xe0\x8e\x9c\x0b\xc5\x81\xaf\xd5\x28\x45\x54\xf1\xd7\x1b\x1d\xeb\xb2\x9b\xd9\x9f\x25\x33\x1b\x8a\x9f\xd4\x26\xf2\x51\x77\xb3\x85\x93\x47\x2d\x26\x68\x2b\xeb\xb6\x21\xe7\x42\x71\x27\x4a\xbb\x12\x1e\xcc\x9e\xf6\xc4\xf0\x3a\xa7\x06\x4a\x4f\x7a\xd1\x14\xb7\xd7\x4f\x78\x37\xe9\xc8\xc6\xc3\xdf\xc7\xb9\x21\x72\x0d\xdf\x1d\x95\x76\x10\x1c\x38\x03\x5e\xd2\xa7\x4c\xb9\x59\xfc\x48\x29\x3f\x44\x85\xa2\x3d\x9d\x76\x91\x75\x79\x6c\x40\xe3\xa0\xd5\x54\x5a\x39\xe3\x12\x6f\x7d\x4a\x18\x99\x01\x28\x0e\x99\x01\x49\x88\xc2\x06\xea\xb0\xf3\xbb\x0c\xc0\x5f\x0c\x60\x95\x58\x7c\x51\x86\xcf\xb6\x46\x55\xbc\xf6\x34\x33\x3c\xdd\xd8\x42\x5f\xdb\x58\xf6\xa2\x68\x6b\x20\x8a\x37\x30\x04\xb9\x76\x28\x0e\x9c\x81\x0e\x66\x31\x72\x15\x2d\xed\xf5\x8a\xa0\xec\xc7\x84\x86\x4b\xed\x69\xda\x0b\xb6\x6a\xf0\xf6\x70\xfd\x88\xf8\x03\x7a\x2d\xab\xa3\xa7\xb7\xa0\x38\xf0\xb5\x3a\xbc\x91\xd3\x1d\x53\x76\x47\x2c\x95\xc9\x59\x00\x6f\xea\x3d\xdf\xab\x29\x22\x03\x27\x79\x05\xbb\x96\x7b\xb6\xdf\xf5\x98\xf7\x9d\x8f\x9e\xdc\x81\xe0\xc0\x73\x15\xb6\x45\x7b\x57\xf5\x31\xb0\xd3\x3d\x73\xd4\x93\xef\xdb\x9c\xf1\xed\xec\xaa\x46\xff\x18\x9b\x8d\x28\x90\xbb\x3d\xec\xa1\xf0\x14\x39\x17\x8a\x03\x67\xa0\xf8\xcc\xb7\x57\x35\xdf\xd1\x96\xd0\x9d\x9f\x19\x8d\x12\x77\x3c\x29\xbb\xe6\xd2\x62\x33\xfc\x0d\xa7\x43\x20\x73\x94\xae\x94\x5f\x15\x99\x01\x28\xee\xe8\x3e\x00\x51\xd8\x40\x9d\x3c\x7f\x97\x01\x9e\x15\x4f\x74\xf3\xdc\x05\x2a\xee\xdb\xac\xe9\xd7\x1a\xd3\xc2\xe8\x72\xe4\x6f\x63\xeb\x24\xb3\x9f\x47\xa8\x12\xb6\x20\x54\xcd\x91\x6b\x87\xe2\xc0\x19\xf8\x94\x96\x64\x5d\x38\x8b\x4f\x71\x81\x27\xa4\x93\xe1\x30\x7d\xef\x86\x77\x74\x6e\x64\x5d\xba\xd6\xb7\xa7\x34\x4b\x31\xdf\x0a\xef\x22\xe7\x42\x71\xe0\x6b\x15\x02\x3c\x0d\xdf\xd3\xb6\xc9\xb2\x73\x21\x5e\x94\xc5\xc5\xb6\xa1\x11\x0c\x19\xb2\xef\x53\x2b\x69\x7a\x58\x66\x28\x4b\x70\x3e\x08\x39\x17\x8a\x03\xcf\x1d\x64\x92\xec\x36\xc7\xc6\x2c\xc1\x35\xb1\x90\x94\xd2\x61\x88\x07\xbc\x2e\x67\xa7\x5e\xb8\xc2\x12\xe5\x90\x58\x1f\x24\xa2\x7f\xf4\x93\x52\x28\x0e\x9c\x81\x6b\xcd\x33\x31\xac\x89\xa4\xd9\xa6\xdb\x5f\x03\xac\x49\x15\x22\xaa\xb0\xc9\x1f\x19\xbc\xb3\x2a\xa3\xc4\x1c\xda\x52\x57\x8b\x28\x43\x66\x00\x8a\x3b\xba\x0f\x40\x14\x36\x50\x9f\xdd\x7f\x5f\xd8\xf4\x89\x08\xf8\xbb\x75\x9b\xda\x9d\xb9\xc3\xe7\xb4\xa5\x1e\xfa\x61\x52\x7b\x9f\xed\x35\x29\xe5\x75\xf6\x02\xc1\x09\x0d\xa7\x5a\x00\x59\x7e\x40\x71\x27\x0b\x9b\xf0\x50\x2f\xdd\x79\xf3\x82\xb3\x93\x8c\xe7\xe3\xd8\x3d\x5a\x65\x12\x0e\x27\xc4\x4b\xb5\x2c\x9e\x59\x11\xba\x38\xe8\xf9\xe0\xbe\x47\x4e\x86\xe2\x4e\x16\x36\x2d\xed\xa7\x73\xf0\x0b\xec\x1c\x7b\x31\x58\x59\x2e\xdc\xa9\x01\x8c\xcf\x70\x56\x91\xf6\x7b\x3a\x76\xca\x87\xb0\xf5\xdc\x4d\x18\x40\x4e\x86\xe2\xbc\x64\xd1\xd0\xe8\xff\xfe\xbc\x51\xfc\xe9\xe7\xf8\x51\xb7\x4d\xe0\x3a\x42\x95\xe2\x80\x92\xeb\xd2\xb3\xdb\x2f\xac\x9d\x05\xce\x37\x3d\xd7\x75\xc6\x14\x4b\x29\x41\x16\x36\x50\xdc\xaf\xc9\xbf\xae\xda\xff\x29\x6c\xa0\x14\x74\xc7\x0b\x1b\x1f\x59\x92\x84\x12\xac\x12\x4f\x46\x79\x71\x57\x4a\xf7\xd9\xf4\x1c\xae\x7b\x91\x4e\xc9\xe7\xe7\xe6\x72\xd9\x9c\x5a\xfa\xfc\xbc\x8f\x7f\x4b\x52\x5e\x64\x30\x2f\x60\x68\x66\x3e\x1a\xbf\x62\x3b\xfb\x76\xc2\x54\x72\x42\xec\x27\xcc\xa5\xb1\x4a\xc5\xe7\xd0\x35\xb3\x2a\xe6\x7f\xad\xb0\x81\x5a\xda\xb1\xc2\x86\x88\x1c\xf4\xf1\xda\xb8\x06\xd8\x18\x7a\x9c\x5a\x4d\xf0\x2d\x21\x76\x75\x97\x72\x2b\xae\xc3\xe7\x7a\x5a\xf6\xb9\x2c\xdb\x17\x52\x45\x4a\xf9\x11\x79\x7f\xa2\xb0\xf1\x38\x51\xd8\xcc\x3f\x76\x06\xe8\x5e\x96\xb0\xcc\x8d\xf5\x87\x60\x30\xaa\x0f\x93\xd6\x50\x4e\xb8\x9b\xa5\xaa\x8b\xc3\x6d\xe0\x29\xca\x97\xb9\xfe\xc8\xc3\x1f\x82\x27\xba\x84\xaa\xe6\xac\x9b\xd9\x6d\x34\xa7\x69\x85\x4e\x59\x16\xd9\xd1\x3d\x90\xcd\xa6\x96\xc5\xbf\x22\x6c\x34\xf1\xe9\x5a\x89\x21\x7e\xfc\x1f\x79\xe6\xc4\xe3\x64\x61\x83\xd7\xa3\x92\x73\x3a\x57\x8a\xb1\x99\x58\xde\x84\x4e\x55\x39\xc9\xdd\x8b\x3c\x2e\x2e\xec\x19\x6f\x50\xd6\xe5\x2f\x29\x97\xde\x66\xfd\x91\xd5\x1a\x9d\x78\xd9\x3d\x36\x9d\xe7\xcb\x3f\x87\x4b\xaa\xea\x5f\x9a\xe3\x27\xa3\xbd\xde\x39\x4d\x03\x3c\xf2\xa7\xf4\xbe\x2f\x70\x96\xa7\x41\xbf\x26\xf2\x8f\xac\xf6\x64\x61\x93\x95\xc1\x3c\x21\xc8\xde\xb4\x2f\x4e\xa8\x10\x40\x31\x2d\x33\x29\xfe\x16\x3f\x93\x9c\x76\xd7\x96\xfb\x73\xe4\x90\x2f\x5c\xe3\xfd\x1f\x2b\x6c\xa0\xa2\xfb\xbb\xfd\xf9\x55\x49\xf6\x9a\x6f\x8c\x2f\xd3\xf6\xf8\x17\xe3\x2d\x86\x73\x81\xdb\x9b\xdb\xe7\xd9\x78\x67\x93\xc2\x27\x0a\x19\xf9\x4c\xf2\x0a\x90\xfb\x12\x14\x07\xde\x9f\x37\x68\x5e\x7d\x9c\x9a\xac\xe6\xa3\xa3\x73\x24\xd6\x79\x44\x28\x99\xec\xb8\xeb\x46\x55\x61\x44\x8b\x3d\xbd\x75\x9e\x56\x47\x7b\xeb\xe8\x09\x7b\x08\x0e\xbc\x8f\xfa\xaa\x6d\xa8\xcd\x60\x2e\xda\x9d\x59\x8e\x77\x67\x2a\xe0\x0d\x78\xa3\x1c\xc6\xd9\xa1\x32\x3e\xc9\x7f\x86\x88\xed\x29\xa6\xdd\x55\xe4\x5c\x28\x0e\x3c\x77\x23\x35\x25\x27\xc5\xd7\xcd\xd4\x66\xb1\x56\x2c\x66\xb3\x34\x71\x44\xcb\x51\xce\x6e\x77\xbd\x84\x77\x78\xe2\x92\x91\xdf\xb9\xd5\xa3\x7f\x2f\x04\xf7\x6b\x1f\xfd\xdb\x53\xe6\x1b\x9d\x65\x79\xac\xc9\x57\x14\xca\xc9\x0c\x9c\x69\x1e\xdc\xaa\x78\x42\xf0\x76\x1f\x71\x70\x6e\x3a\xb2\x27\x48\xc8\x2b\xd1\x04\x59\xd8\x40\x71\x7f\xfd\xc4\xf9\xd7\xfd\xea\x1f\x4e\x68\x50\xb7\x91\xdf\x25\xa0\x26\xb7\xac\xe8\x62\xf3\x90\xc6\x9b\x9a\xf1\x7b\x03\x0e\x8d\x1f\x2d\x31\x52\xdf\xf8\x89\xb1\xef\xcd\xb2\xf2\x37\xa3\xb5\xf9\x28\x23\x57\x0e\xc5\x81\x13\x90\x5a\x93\xbc\x3c\x23\xb1\xfa\xe3\x0b\x37\x47\xef\xcb\x19\x1c\x4b\x22\x0a\xd1\x21\xbb\xc2\x53\x06\x11\x39\xd7\x62\x82\xb1\x44\x8e\x9e\x84\x81\xe2\xc0\x57\xea\xe7\xb8\x5e\xf4\xe6\xa0\x0e\xbf\xde\x7e\x73\x4c\x67\x68\x8f\xe4\xd7\x01\xcf\xce\x28\x53\x23\x7d\x09\xab\x37\x57\x8b\x0b\x32\x49\x91\x73\xa1\x38\xf0\xdc\x1b\xc5\xc4\xb2\x6f\x8c\xcf\x0b\x44\x62\x6c\x1d\xae\x26\x5b\xdc\xa1\x7f\xfc\x94\x67\x24\x6d\xd8\xbf\x50\x02\x11\x0e\x17\x8e\x3c\x2a\x82\xa0\x38\x70\x02\xd2\x97\xf7\x3a\x35\x2f\xd8\xe6\x37\x9b\xe0\x97\xae\x5b\x8d\xcc\xba\x6c\x2c\xa3\xa7\xf3\x4b\xc7\x6a\x24\xb1\xb3\x7f\x7c\x1e\x53\x8c\x2c\x6c\xa0\xb8\x23\xe7\xcd\x3f\x17\x36\x50\xb7\xf4\xdf\x45\x80\x66\xa1\x8d\x21\xfa\x1b\x43\x27\xf1\x64\xdd\xcb\x1f\x4e\x9c\x4b\x4d\x3f\x05\x69\x14\xae\x10\x4e\xc7\x98\xcc\xf6\x5c\x77\xf3\x34\x3d\xea\xaa\x20\x38\x70\x04\x9c\x4c\x2e\x88\xd1\xcd\xb4\x57\xb2\x7f\x98\x2f\xa4\xe1\xef\x29\xa2\x7e\x18\xb1\xc6\xab\xd9\x40\x1f\xa2\x5b\x2c\x72\xe9\x26\x56\x2b\x72\x2e\x14\x77\xe2\x71\xb8\xd5\x5a\x36\xcc\x18\xad\x1b\xaf\xc4\xc3\x6e\x59\xad\xf8\x25\x74\xcd\xdc\x2f\xea\x9b\xab\x9f\xc6\x18\xb4\x68\x91\x8c\x95\x1f\x38\x7a\x1c\x0e\x82\x03\xcf\x2d\x9a\x7f\x5f\xff\x76\x8c\x7b\x21\xd0\x19\x27\xa7\x21\x34\xf5\xaa\x81\xdb\x8a\x5f\x0d\xaf\xf6\x80\x90\x00\xf0\x0d\xcd\xde\xe8\xc6\xd1\xe3\x86\x10\x1c\x38\x02\xfc\xf8\xef\xcd\x98\xd8\xb1\x17\x87\xed\x64\x64\x5c\xe9\xbd\x1d\x5b\x14\xbc\x0a\x2e\x48\x3e\xd5\xbe\x76\x8d\x86\xe3\xd9\x8d\xec\x36\xe4\x21\x1d\x8a\x3b\x72\x5d\x08\xfe\xf3\x07\x35\xa8\xfd\xf5\x77\x19\xa8\x27\x5c\x2f\xdf\x35\xf0\xf1\xb5\x19\x21\xb4\xf4\x01\xce\x6c\xe3\x89\x7a\xbe\xba\xf3\xdc\x3d\xc4\xce\x89\x11\xfb\x35\x1d\x53\x3e\x72\xed\x50\x1c\x38\x03\x01\x2d\x70\x8f\x3b\x02\x0f\x5e\x73\x0d\x09\x9c\xe3\x2c\x5e\xe7\x6f\xc8\x7b\x45\x91\xae\x97\xae\x4e\xde\x63\xcf\x14\x76\x5b\xf5\xa8\x08\x82\xe2\xc0\xd7\xea\x7a\x01\x8c\x7f\xb0\xb8\x63\xea\xbe\x0d\x87\x4b\x4f\xd8\x63\xf3\x42\xb4\x29\xe3\x0b\x9a\x9a\xbd\x5f\xd7\x27\x2c\x45\xe9\xf2\x54\x90\x73\xa1\x38\xf0\xdc\xf1\xaf\xd3\x2d\x5a\x6a\xbe\x93\xfe\x02\x74\xe2\x2c\xdd\x1c\x33\x3a\x67\xcf\x09\x6b\xe4\x59\x3a\x06\x68\x64\x3e\x1c\x6e\x58\x27\x42\xce\x85\xe2\xc0\x19\x58\x0b\x65\x92\x96\xfd\x22\x6f\xfa\xec\xdd\x5a\xe8\xdd\xce\xef\x65\xfc\xc2\xae\xb6\x1e\xa9\x2c\x35\x05\x30\xa2\xd2\x4c\x61\xf6\x7e\x64\x06\xa0\xb8\x23\xd7\x05\x44\x61\x03\x75\xd8\xf9\x5d\x06\x30\xa6\x44\x54\xa2\xfd\xa6\x6a\x26\x61\xcf\x0b\xd4\x18\x15\x06\x92\xaf\x7e\x13\xf7\x4d\x65\xc7\x4d\x77\xdb\x07\xd2\x7f\xca\x9d\x47\xae\x1d\x8a\x03\x67\x60\xdd\x2a\xf0\x2c\xd3\xba\xcf\xcc\x58\x06\x11\xde\xed\x4e\xed\xec\xd2\x36\x1c\xc5\xdc\xaf\xec\xd8\x5b\x87\x3a\xfb\x5e\x26\xf4\x78\xc8\xb9\x50\x1c\xf8\x5a\x31\xf5\x33\xf7\x08\x05\xfc\x14\x9e\x9e\xef\xa5\xb3\x70\xf3\x51\x23\x1d\x9f\xab\xe3\xf5\x88\xee\x37\xad\xee\xba\x51\xfd\x9d\xf0\xe8\xd7\xb1\x50\x1c\x78\x2e\xed\xc6\x4b\xe6\xbe\x7e\xfb\xc9\x07\x7e\x25\x1d\x1e\x7b\xa7\x3f\x31\x30\xd5\xdf\xf4\xe5\x4a\xa3\x7b\x3c\xed\xcd\x19\xbc\x61\xac\x8f\x9c\x0b\xc5\x81\x33\xc0\x2d\x90\x4f\xd2\xb8\xee\xa4\xc7\x2a\x55\x16\xbf\xba\xb6\x7e\x65\xe9\x47\x42\xc1\x43\x32\x93\x7b\x05\x16\xd4\x66\x13\x85\x1d\x47\xee\x2b\x28\xee\xe8\x3e\x60\xf4\xcf\x19\x80\x3a\x79\xfe\x2e\x03\x9b\x4f\x25\xab\xfb\x4d\x1d\xcf\x9f\xbd\xf8\xce\x78\x46\xc8\x50\x91\x25\x7d\x34\x77\x38\x5b\x02\xe7\xeb\x17\x21\x09\xfc\x14\x74\xc4\x51\xc9\x0e\xc1\x9d\xf0\x1e\x45\xb3\x2c\x31\x05\x97\x3f\x04\x30\x0f\x52\x2a\x5e\xbd\xf1\x12\x52\xbf\xaa\xf5\x3e\xb8\x39\xf1\x92\x9f\x8c\xea\x92\x0b\xff\x91\x9f\x08\x8a\x03\x5f\x2b\xd5\x26\x7f\xb9\xbc\x9f\xa3\x1f\x3e\xfb\x55\xe7\xbc\x7d\x54\xdb\xe2\xc5\x44\x1e\xc2\x7f\x91\x66\x05\xd3\xe8\x59\xea\x65\xfd\x87\x89\xc8\xb9\x50\xdc\x89\xef\x6f\x1c\x06\x99\xd9\x5b\x0e\xb2\x8b\xc8\x08\x42\xa5\x98\x83\x7b\xd2\xa8\x11\xfb\x33\x24\xdf\xbc\x42\x92\x36\xf9\xe7\xb0\x78\x2f\x1d\xed\x89\x10\x1c\x38\x03\x0e\xf1\x74\x0d\x0e\xeb\xad\xf0\x1b\x11\x91\x6d\x2b\xe7\x2f\xeb\xbe\xcb\x83\xa7\x93\xf9\x8f\xe4\xf1\xf7\x31\x7d\xfd\xdc\x54\x79\xe4\xbc\x81\xe2\x8e\xee\x03\x10\x85\x0d\xd4\x67\xf7\xdf\x17\x36\x0f\xa5\xe4\xc4\xf5\x29\x1a\xd4\xb4\x53\xd8\x18\xd0\x9c\x66\xaf\x25\x99\x04\x38\x3d\xf1\xe1\x3e\x33\x69\x42\x26\x3c\x4b\x22\xea\x86\x2c\x3f\xa0\xb8\x93\x85\x4d\x19\xb6\xa0\x41\xc6\x67\xd5\x18\x99\x0b\xaf\x25\xb0\x9f\x15\x7a\x8b\xd2\xa9\x8e\x84\xc5\x39\xa1\x95\xd8\xce\xb6\x29\x75\x3c\x66\x42\x4e\x86\xe2\x4e\x16\x36\xc2\x08\xf6\x9d\xdb\x14\x0f\x77\xee\x7f\xaa\x39\xb4\xc6\xf3\xf2\xdc\xaa\xa2\xa9\x18\xd5\x69\xd9\xfe\x44\x4b\x8c\xcb\x48\xf0\x19\x0d\x39\x19\x8a\xf3\x92\x45\x43\xfb\x7b\x76\x07\x18\x86\x59\xa3\xe3\xf0\xd5\xd1\x39\x2c\xd0\xa7\x6d\xf3\xca\x94\xde\xd8\x8e\xea\x52\x1c\x3a\xad\xc5\x64\xae\x62\x96\xd5\x6c\x22\x0b\x1b\x28\xee\x3f\x85\xcd\xa9\xe3\x85\x0d\xd4\x1f\x02\x38\x5e\xd8\xdc\x7e\x44\xb9\x60\x98\x24\x7e\xa5\x74\x36\x17\x2f\xfa\xa0\x73\x14\x7e\xf9\x47\x81\x05\x0f\xf5\x96\x42\x1e\x46\x74\x86\xb1\xe5\x71\x87\xcd\x13\x26\x63\xdf\x2f\xd1\x25\xd9\x42\x76\xb3\xc1\x4d\x37\x54\x59\xc7\xec\xf9\xed\x70\x49\xd2\x68\xc3\x88\xe8\xab\x1f\xc6\x76\xc5\xfe\xaf\x15\x36\x50\x4b\x3b\xee\xb0\x01\x17\x36\xd5\xb2\x81\x31\x67\x1b\x95\x18\x64\x55\xf4\xe4\x44\xd9\xd0\x59\x9d\x8d\xbb\x59\xf2\x65\x16\xf4\xe2\xae\x30\xc2\xdb\x86\x06\x16\xff\x44\x61\x53\x77\xa2\xb0\x51\x6b\xc5\x95\x71\x16\x4f\x5f\xd5\x29\xe4\xa0\xeb\xfe\xe8\xf8\xec\xb4\xc7\x5b\x1e\xa5\xcc\x2b\xbe\xb6\x99\x73\xd8\x5d\x07\xe2\xc2\x7f\xe4\xe1\x8f\x93\x85\xcd\xc3\xa9\xa1\x70\xcd\x66\xda\x87\x31\xb0\x99\x49\x15\xdb\x58\xb6\x92\x2d\xca\xe5\xeb\x33\x23\x30\x3c\x96\x73\xa3\xc1\x8e\xbc\xbc\x7f\xe4\x51\x97\x93\x85\x8d\x94\x83\x67\x63\x57\x75\x66\xf4\xac\x85\x52\x1e\xcf\xa1\x35\x7c\x08\xd3\xe3\xba\x31\xf5\x61\x74\x5e\x18\x3e\x65\xb1\x53\xde\xe4\x1f\x59\xed\xc9\xc2\xa6\xf6\x52\xc5\xc3\x1a\x5a\x6b\x18\x9a\xf6\xcb\x0b\xe1\x6d\x95\xec\xdd\xe6\x0d\x01\xe4\x9f\x16\xa9\x8b\xbc\xda\x5f\x67\xb4\xb0\x3f\xfa\x23\xab\x3d\x59\xd8\x50\x54\xad\x54\x68\xec\x72\x94\x4b\xe4\x05\xf1\xca\x0c\x4a\x26\x16\xa7\x7e\xbc\x5b\xec\x79\x3f\xb7\xef\x92\xb4\x5b\xbd\xad\x32\xe5\x1f\x2b\x6c\xa0\xa2\xfb\xdb\xfd\x99\x15\xa0\xd4\x7c\x5b\x4d\x5f\xcb\xf8\x58\x5e\x96\x27\x6b\x03\xf6\xd4\x7d\x87\xe1\x6b\x97\x5f\xf0\xd5\x1b\x43\xf6\x97\xd3\x3d\x8f\xf6\x67\x08\x0e\xbc\x3f\x9f\x2e\x61\x38\x17\xb8\x15\xb9\x87\x55\x47\x21\xeb\x2f\x50\x62\x98\xa9\xff\x4a\xf6\x89\x9f\xe3\x87\x4f\x37\x6f\xdd\x57\x62\x99\x64\x44\xce\x85\xe2\x4e\x38\xe9\x5e\x9a\x24\x2a\x97\x34\xb7\x6c\x2d\x45\xaf\xbd\x54\x13\xe9\xed\x6e\xab\xaf\x9e\xb0\x95\x5f\xeb\x93\xaa\x52\xc0\x5a\x4c\xb9\x76\xe4\xa4\x83\xe0\xc0\x5f\x7c\xb8\xd8\x46\x72\x06\xb6\xcc\x36\xe9\x35\x45\xe4\xbe\x16\x5f\x33\x19\x9b\xf1\x37\x3d\x4f\x7e\x5a\xc7\xfc\xf3\xc4\xe4\x0c\xe7\x26\x21\x72\x2e\x14\xe7\x25\x7d\xea\xef\x5f\x5c\xfb\xf7\xeb\x9d\xe5\x61\x90\x3e\x8d\x1f\x6d\x49\x86\xf7\x02\x97\x3d\xec\x19\xd9\x7e\x47\xf4\x84\x73\x77\x7a\x34\xbe\x15\x09\x0b\xb2\xb0\x81\xe2\x8e\x1c\x36\xff\x58\xd8\x40\xdd\x46\x7e\xeb\xb0\x69\x64\x24\x1a\x20\x8f\xfe\xa0\xc9\xb8\xcb\x78\x2d\xe2\x07\x95\xd7\xca\x80\xbd\x41\x7f\x63\x5e\xf6\x4b\xaf\x92\x3d\x84\xde\xdb\xa3\x1f\x6b\x43\x70\xe0\x04\xbc\x9d\x36\x49\xc2\x1b\x18\x4f\x18\x4a\x6d\xd4\x2e\x26\x5a\x6a\x7b\x1c\xff\x70\xf2\x59\x9e\xa3\x2a\x9e\x72\xdb\xe7\x04\xd9\x49\x92\xa3\x9f\x5a\x41\x70\xe0\x04\x10\x09\xdc\xe4\xba\x83\xef\xfa\xee\x5e\x8c\xfc\x0f\x3c\x13\xd1\xe1\xa5\x47\xb3\xd9\xf0\xbb\x17\x67\x15\x3c\x06\xb0\xc8\x89\xf5\x8e\x7e\xba\x04\xc5\x81\x13\x30\xf2\xce\x97\x9d\x88\xd2\x32\xd1\xe4\x8d\x94\x71\x98\xb5\xf4\xcb\x1f\xbb\x58\x68\x81\xf3\x13\xd2\x1a\x2e\xf7\x12\xe4\x9f\x4d\x1e\x9d\x54\xa1\x38\x70\x02\xc4\xd7\xd0\x9c\x02\xe9\xe3\x28\x18\x07\xdf\xbc\xfe\x6a\x45\xc0\xfc\x59\x5b\x79\xdb\xfa\xaa\x78\xe2\x18\xeb\xf3\xc5\x3b\xfa\x2e\xc6\xc8\xc2\x06\x8a\x3b\x72\xd8\xfc\x73\x61\x03\x75\x4b\xff\x5d\x04\xba\xf0\x3c\x88\x37\xad\xd1\x7b\xfd\x07\x75\xf7\x9b\xee\x60\x14\xb5\x4f\x16\x5f\x96\xbc\x97\xb1\xc5\x56\xa9\x23\x3e\x4f\x28\x76\xe4\x67\x86\xe2\xc0\x11\x60\x4c\x58\xcc\x7d\x60\xc8\xaa\x9d\x91\x2d\x5b\xf1\x05\xcd\x3b\x99\x10\xa3\x46\x6b\xaa\xc1\x9d\xfc\xb4\x86\x9d\xe2\xf9\xf3\xc5\x47\x1f\xa8\xa0\x38\x70\x04\x46\x5e\x2b\x7f\xb5\x3a\x73\xef\x94\xd2\x6c\x8d\xff\xf0\xb6\xd9\x93\x4e\x79\x52\xe3\xbb\x39\xe1\xb1\x77\x3c\xab\xae\x74\x1c\xe0\x1e\x49\x8a\xa1\x38\x70\x04\x7c\x19\x88\x5e\x4c\x70\xb8\xdd\x16\x98\x1a\xbb\x24\xee\x38\xb8\xd2\xcc\xcf\xcf\xbe\x37\xdd\x43\x3d\x2e\x00\xc7\xbe\x55\x67\x5e\x78\xd4\x06\x43\x70\xe0\x08\x9c\xd2\xe3\x22\x16\x35\x4d\x18\x4d\x6b\xde\xb2\xeb\x3a\x7d\x4a\x67\x61\xed\x61\x02\x07\x5b\xfa\x38\xe7\xa7\x9b\x55\x0a\xb5\x33\x4d\x47\x82\x5a\x08\xee\xc8\x5d\x01\x51\xd8\x40\xed\xaf\xbf\xcb\x00\xa2\xb6\xeb\x61\xcf\x3d\xd2\x1c\x76\xff\x0b\x4d\x73\x19\xf5\x25\xb4\x0f\x32\x71\xde\x17\x33\xda\x4f\x95\xf7\x22\xcc\x9f\x74\xd6\x20\xd7\x0e\xc5\x81\x33\x60\xae\xec\x63\x1e\x91\xec\x2b\xe7\x59\x16\xff\xc4\xed\xe3\x97\x27\xdd\x59\xfb\xb0\x5e\x39\x2d\xe5\xc8\x9a\x2f\x6f\x8a\xe7\xd3\x0f\x90\x73\xa1\x38\x70\x06\x4e\xf1\xc0\xda\xa2\xb1\xc2\x74\x47\x59\xeb\x8b\x86\xde\xb1\x89\x0e\x2c\xc0\xad\x30\x67\x3a\x6c\x97\x96\xc4\xa9\xdd\x08\x94\xe3\x91\x73\xa1\x38\x70\x06\xe6\x2d\x07\x4a\x56\x04\xaa\xbd\xa9\xb6\x13\x85\x9e\xd7\x30\xfa\x29\xd8\x3c\xd9\x55\xc0\x59\x89\xb1\xfc\x84\xa7\x9e\x3f\x91\x7a\x24\x69\x85\xe2\xc0\x19\x68\x65\xb9\x36\x1c\xf3\xc4\xe5\xd1\x94\xc7\xc6\xb9\x35\xea\xea\xd7\x08\xf6\x7b\x2c\x4a\xf6\x1e\xe3\xf4\x67\xb4\x52\x5b\x2e\x9a\x7c\x47\x66\x00\x8a\x3b\x72\x57\x40\x14\x36\x50\x87\x9d\xdf\x65\xe0\x69\xf2\x5b\x81\xfb\xd7\xf0\xdd\x6d\x0c\x9e\x35\xeb\xe4\x27\x29\x52\x9c\x6e\xb0\xb9\x52\xa0\xd0\x09\x9b\x99\xb5\x0c\xef\x5f\x25\x43\xae\x1d\x8a\x03\x67\x00\xbf\xe0\xb5\x81\x3d\x61\xa0\xdf\xe1\xab\x2d\x53\x81\x71\xad\xad\x57\x64\x84\x6c\x2f\xde\x48\x54\x70\x5e\x34\x28\xa0\xbd\x8d\x7b\xa4\x49\x83\xe2\xc0\x19\xa8\x49\x51\x31\x19\x9f\x0b\xe1\x2c\x71\x16\x4e\xde\x95\x34\xd2\x2e\x23\xa6\xa6\x67\xa1\x33\xe0\x96\xd8\x94\x58\x2d\x40\x44\xcf\x1e\x7d\xd7\x00\xc1\x81\x33\xd0\x5d\xd0\xd8\xc9\x61\xe2\xec\xad\x6b\xd5\xe9\x3e\x4c\x61\x74\x33\x39\x52\xbf\x74\xd2\xee\x79\x13\x99\xe5\x4c\xa9\x8e\xab\x02\x17\x72\x2e\x14\x07\xce\x40\x82\x03\x25\x8d\x83\x5c\x70\x84\xe7\xb0\x39\x20\x6a\x4a\x9d\xc0\x68\x23\xec\x5a\xb1\xde\x05\xeb\xf1\xa7\x25\x36\x8d\x3a\x57\x81\xcc\x00\x14\x77\x74\x1f\x80\x28\x6c\xa0\x4e\x9e\xbf\xfd\x23\x17\xca\xd4\x38\xc4\x3f\xb5\x28\x29\x98\x73\xe9\x14\x99\xeb\x04\x76\x70\xd3\xe6\xc3\xd1\xbe\xdb\xaf\x58\x0f\x9b\x75\xfa\x0d\x0b\x1f\x49\x02\x21\x38\x70\x06\xf2\x35\x06\xcc\x69\xbe\x85\xd9\x7d\x57\xbd\x8b\x70\xbc\x4b\xc8\x7d\x60\xe1\xb1\xea\xc5\xb9\x5b\x72\x06\x68\x3d\xd3\xbf\xb1\x72\x54\x86\x43\x71\xe0\x0c\x5c\xe5\x6d\x48\x37\x95\x09\x6b\xe1\xbe\xd5\x74\x3b\x5a\x77\xfb\x87\x57\x92\x4d\xb2\x96\x8e\x72\x8b\xea\x6b\x1f\x16\xfe\xdd\x84\xa3\x72\x0d\x8a\x03\x67\xa0\x2e\x5f\x68\x89\xac\x23\x59\x09\xcb\x7f\xdc\x4e\x8a\xf2\x6b\xad\xc4\x15\xae\x37\xd3\xdd\x58\xcf\x9c\x46\x1e\xd0\xf5\x37\xfa\x1e\x7d\x7f\x03\xc5\x81\x33\x30\xb0\xfc\xa0\x87\x7e\x8b\xa3\x6d\x58\xe1\xf9\xba\x52\xe2\xd7\xe7\x24\x1e\x72\x6f\xe4\x07\x19\x15\xae\xcd\x63\x7a\xde\x1e\xa2\xe3\x40\x66\x00\x8a\x3b\xba\x0f\x40\x14\x36\x50\x9f\xdd\x7f\x5f\xd8\x74\x29\x48\x3d\x98\xb2\x96\x63\xf8\xdc\x56\xbf\xd8\x4f\x4f\xcf\xa3\x19\x91\x57\x51\xed\x31\x73\x1a\x3f\xbc\xbc\x45\x48\x9f\x6c\x1a\x59\x7e\x40\x71\x27\x0b\x9b\xa7\xcb\x5c\x0f\xd2\x83\x37\x9a\x39\x3b\xd9\xed\xc5\x48\xd7\xf6\xef\x6d\x6c\x5c\xa7\x9c\x4e\x78\xb1\xfc\x65\x4f\xb5\xec\xcb\xe7\x2d\xe4\x64\x28\xee\x64\x61\x93\xf2\xf0\x3d\xed\xb5\xd5\x69\x0f\x39\xab\x02\xb2\x8f\x8e\x3c\x6a\x86\x29\xc3\x88\x6a\x4e\xa3\x4d\x97\x98\x49\x82\xb2\x0a\xc5\x6d\xe4\x64\x28\xee\x3f\xb5\x0a\xfa\xf1\xc9\xf4\x66\x37\x98\x93\x3f\x62\xa0\x89\x7f\xa4\xd7\xb8\x5d\xef\x3c\x21\xeb\x67\xad\x7e\x79\x49\xbc\x3d\x5b\x28\xc0\xd9\x1e\xef\xc3\x07\x64\x61\x03\xc5\xfd\xb7\x0a\x3a\x5e\xd8\x40\xfd\x39\xc6\xe3\x85\xcd\x8b\x43\x35\xfd\x70\x8b\x3d\x56\xb5\xeb\xaf\xae\x64\x3d\x18\xac\x49\x96\x73\x61\x3d\x2d\x56\x79\xae\xa2\x85\x19\x63\xe5\x7a\x34\xfb\x31\xb4\x77\x80\x29\xfb\x74\x9a\x2e\xb1\x7a\xe4\x99\x43\x6f\x31\x5e\x97\x16\x29\x7b\x51\x3a\x82\xbb\x01\xfd\x63\x73\xe3\xa1\xe3\x53\xb8\xff\x6b\x85\x0d\xd4\xd2\x8e\x3b\x6c\xc0\x85\x0d\xe1\xa8\x88\xcd\x10\x5b\xce\xf2\xcf\x99\x67\x2a\x67\x6c\x1b\x6d\x98\x27\xd6\xfc\x14\xce\x7b\x7e\xe0\x48\xf9\x52\xe2\x8a\x93\x64\xf8\x27\x0a\x1b\x34\x15\xf0\x87\x7a\x1f\x8a\xda\xeb\x04\x0f\x4e\x0d\xbc\x0d\xee\x79\xdd\x3a\x92\xb7\x2b\xf5\x59\x31\xd7\x89\xb9\x44\x54\x3c\xa1\x2b\x79\xb4\x71\x7f\xfe\x8f\x3c\xfc\x71\xb2\xb0\x29\x4d\xe3\x30\xdf\x2a\x52\x0d\x13\xd1\x8c\xe2\x37\x95\xca\xea\x25\xe8\xb3\x81\x9d\x2d\x5f\x40\xbb\x9b\x4f\x69\x6d\x43\xd4\x65\xf3\x47\x1e\x75\xb9\x7e\xe2\x65\x0b\xac\xe7\x43\x79\x30\xfa\x8b\x72\xb4\x60\x21\x3b\x23\x2f\x3c\xb7\xce\xdc\x18\x7f\xa5\xf6\x6d\x5a\x3e\x22\x9f\x69\xe5\xdb\xce\xad\x3f\xb2\xda\x93\x85\x8d\x5a\xf4\x9c\xd4\xea\x63\xf9\x44\x52\x39\xca\x99\x02\x72\x7e\x7b\xf4\xd2\x69\x8b\x8b\xb2\x83\x3d\x0f\x88\xf3\x2f\xbf\xd6\x49\x09\xf8\x23\xab\x7d\x7c\xe2\x65\x79\x9b\xf5\x36\x39\x35\x63\x3b\x81\x3c\x8e\xd5\xc0\xde\x6d\xe3\x43\x83\xc1\xf4\x15\xdb\x31\x57\xcd\x0f\xa7\xf0\xad\xd9\xd1\xbe\xfc\xb1\xc2\x06\x2a\xba\xbf\xdb\x9f\x39\x62\x56\x7d\x56\x75\x42\xcb\x3e\x00\x04\xb1\x5b\x9b\x9a\x49\xcb\xf2\x7b\xcf\xfd\x9b\x79\x05\x6e\x28\x5c\xbd\x86\xcf\xff\x5d\x02\xb9\x2f\x41\x71\x27\x94\xb3\x0d\x9c\x46\xa2\xd3\x69\xf6\x9a\x83\x55\x17\xbc\xb7\xa6\xd0\x54\x15\xcf\x12\xae\x18\xa5\xf9\x3d\xf4\x78\xcf\x13\x3f\x3c\x7d\xf9\x48\x39\x0b\xc1\x81\xf7\x67\x16\x57\xc5\xb4\x75\x9a\xe0\xca\x51\x5d\xab\xd5\xb8\xc1\x4e\xa5\xc2\xe1\x2c\x97\xad\xc4\x9f\x07\xc2\x56\x51\x23\x6c\xd4\x37\x8f\xbe\xb4\x87\xe2\xc0\xfb\xf3\x6b\xea\xd4\xa8\x4b\x41\x2e\xc9\x31\xc6\x08\xb8\x55\x54\xc4\xc8\xeb\xc4\x73\xd3\x7b\x78\x45\x8e\xaf\x66\x22\xfc\x37\xe5\xd9\x98\x91\x73\xa1\x38\xf0\xfb\xf0\xac\x0f\x27\x44\x4b\x68\xf6\x73\xdc\x07\xf4\xf8\x39\x12\xe1\x7d\x02\x1f\x6a\xae\xe5\x89\x81\xb1\xb7\xee\x6b\xc6\xa2\xb2\xe6\x75\xc8\xc2\x06\x8a\x3b\x72\xd8\xfc\x63\x61\x03\x75\x1b\xf9\xed\xe3\x15\x4f\xee\x18\x04\xeb\x0c\xe5\x8c\xc1\x05\xee\xa7\x72\xcc\xfe\x6c\xa3\x38\xff\x6e\xdd\xcb\x57\xd9\xb5\x48\xba\x80\x13\xad\xf7\xe8\xa7\x4b\x50\x1c\x78\xe5\xb1\xd5\x52\x5f\xaa\xbf\x2d\x06\xd3\xbf\x20\xbf\x51\xdb\xaa\x7a\xdb\xe9\x09\x51\x2e\xf7\x4c\x30\xce\x9b\x4b\x7d\x07\xb7\x14\x3c\x8f\x7e\x5b\x00\xc5\x9d\xf8\x0a\xfc\x4b\x77\xa8\x60\xa2\x6e\x0e\x3e\x86\x3a\x5a\xc7\xe5\xae\xcc\xd3\x05\xec\x70\x9d\x25\x3e\xbd\x73\xb2\x37\xdf\x7f\x7f\x4c\xfd\xe9\xe8\x2b\x70\x08\x0e\x9c\x00\xa1\xc0\xc0\x01\x5a\xfe\x9c\x03\x4e\xf1\x85\xd1\xd9\xe0\xcb\x73\xf9\x09\xf2\x97\xc3\x1e\x56\x18\xe0\xe1\xa4\xa2\x19\xe9\x32\xb4\x20\xe7\x42\x71\xe0\xf7\xc1\x00\x53\xd3\x6d\x32\x65\x21\x53\xe4\x51\x95\x09\xcb\x46\x54\xa2\xb7\x1d\x49\x43\xa4\xc9\xb9\xa1\x83\xc7\x33\xdb\x54\x73\xbb\x31\xc8\xc2\x06\x8a\x3b\x72\xd8\xa8\xfc\xe3\x21\x1d\xea\x96\xfe\xbb\x08\xa4\x54\xd2\x72\x00\x18\xd7\xce\x54\xbd\xbc\xb9\xed\xc1\xfb\x28\x48\x7b\x49\xe8\x9c\xbc\x87\x0b\xad\xb9\xf5\x2b\xbe\x7a\x02\x86\xa3\xc7\xe0\xa1\x38\xf0\xd2\x9d\xcf\x5d\x30\x8a\x92\x25\x78\x35\xb0\xac\xd8\x83\xc3\xf5\x84\xa8\xfe\x69\xb9\xcd\x9a\x2a\x2e\x77\x59\xfa\x4e\x50\x4d\x82\xa3\x2d\x72\x2e\x14\x07\x8e\x00\x8f\xda\xc5\x2f\xa1\xe3\xef\xe2\x5a\xd7\x2a\x82\x7d\x4e\x5d\xee\x51\xa8\xdc\xa4\xb0\x37\x34\x0f\x90\xe5\xf8\xd0\x72\x2d\xb6\xaf\xe2\xe8\xb1\x7d\x08\x0e\x1c\x81\x5b\x79\x82\x44\x23\xa5\x2f\x36\x29\xbf\x36\x9f\x59\xab\x57\x4d\xfd\x38\x79\xbd\xca\x77\xde\x32\x9b\xb8\x94\xff\x99\x69\xa9\xf0\xf0\xd1\x4d\x0b\x82\x03\xbf\x0f\x0e\x04\x45\x6f\x18\x83\x2e\x4e\xf8\x7f\xf2\xdd\x76\x9d\x86\x93\x1e\xc2\x87\x99\x5e\xbd\xdc\x59\x88\x97\x59\x4b\xd3\xa2\x2b\xb7\x3c\xfa\x56\x15\x82\x3b\x72\x57\x40\x14\x36\x50\xfb\xeb\xef\x32\x30\xfc\x61\x31\xe3\x9a\x6c\x09\x4e\x49\xbc\xd6\x23\x9a\xeb\x8d\x43\x33\x5d\xd1\x97\x31\xc7\x95\x4d\x09\xe8\x1a\x74\xaa\x33\x8a\x22\x91\x6b\x87\xe2\xc0\x6b\x2f\x08\x5e\xbf\x27\xd2\xcb\xd4\x9e\x33\xa8\xeb\x14\x53\x9f\xa5\x98\xa9\x92\xee\xea\x4f\x4d\xd2\x19\xec\x69\x6f\xdc\x32\xc1\x76\xf4\x48\x24\x14\x07\xce\x00\x5e\xca\xb6\x6e\x9f\x16\xd6\xe9\xc6\xa5\x01\x91\x36\xef\xcf\xee\xe7\xd9\xfb\x2e\x8c\x17\xd4\x3a\x90\xf7\x7e\xc6\xb2\x6d\x4a\xb6\x43\xce\x85\xe2\x4e\xfc\x86\x35\x55\x7d\xcb\xf7\x87\x1a\xbe\x72\x45\x57\xeb\xdb\x71\xda\x3b\x84\x92\x9f\x9f\x64\x2d\x98\xdd\x1e\x08\x1a\x11\xb4\x5d\x20\xa1\x3f\x7a\x12\x00\x82\x03\xbf\x0f\x00\xd7\xd9\x5a\xfc\x6f\x0a\x67\x0c\xcd\xcf\x53\xe5\x93\x8a\x17\xe4\x7c\x1e\x39\x27\x43\xc3\x29\x6b\xf8\x19\xb3\x7e\xdb\xd2\x7d\x0c\x99\x01\x28\xee\xc8\x5d\x71\xfd\x9f\x33\x00\x75\xd8\xf9\x5d\x06\xb8\x9c\xd7\xcd\x52\xee\x6e\xca\x26\x05\xf4\x8d\xd7\x37\x66\x61\x78\x6f\x0d\xfc\xc0\x2c\xe4\x08\xeb\xb6\x94\x51\x0d\x52\xdc\x8a\x3a\x12\x39\x43\x70\xe0\xb5\xcb\xee\x5c\xb9\x36\xe0\x68\x61\x94\xbd\x09\x7f\xf1\xa9\xe9\x60\xdc\x8f\x5c\x13\x07\xaf\x9b\x6f\xe0\xa2\x6b\xf3\xa5\x5c\xe9\x47\xcb\xc8\xb9\x50\x1c\x38\x03\x4d\x0f\xe8\xcf\xa8\xa1\xf1\x53\xcb\x5d\xe2\xd6\xd8\x17\xc0\xcf\xac\x4d\xb3\xc5\x9e\xbb\x4f\x38\xc6\x35\xb9\x9a\xaa\x38\xab\x78\x24\x9e\x83\xe2\xc0\x19\x88\x6d\x0c\xc4\x1f\x0c\xb8\xe9\x4a\x6b\x40\xdd\x9c\xe2\x36\x85\xa1\x28\x59\xa7\x47\xdf\xba\x18\xb1\xd5\xf7\x8e\x6b\x85\xfd\x27\xce\xd1\xd6\x05\xc1\x81\xdf\x07\x33\xf5\x9a\x0b\xf5\x43\xcc\x78\xb4\xb6\x7a\xf8\x1c\x38\x6a\x63\xc4\x86\xca\x86\x7e\x36\xa5\xc2\x43\x82\xf5\x5b\x1d\x5a\x38\x42\xc8\x0c\x40\x71\x47\xf7\x01\x88\xc2\x06\xea\xe4\xf9\xbb\x0c\xc8\x5d\xe9\xa6\xb9\xe0\x8f\x65\x97\x74\x01\xdb\x11\xe1\x85\x7b\x5b\x07\xcd\x50\x88\xb5\x29\x91\x7c\x73\x4f\xcb\xa6\xc8\xa3\x81\x09\xb9\x76\x28\xee\xc4\x03\xb7\x59\x4f\x7d\x14\xe6\x06\xb0\xa6\xbf\xd4\xa5\xb0\xbd\x55\x1a\xd4\x73\xb4\xa8\x75\x4f\xcc\xa9\x8a\xb4\x67\xdc\x5c\x95\xb2\x3f\xba\xb7\x42\x71\xe0\x0c\xfc\x7f\xcc\xbd\x65\x58\x56\x4d\xf7\xff\x4d\x97\x22\x48\x48\x4b\x8a\x82\xa4\xb4\xa4\x94\x74\x49\x4b\xa7\xa4\x80\x28\x21\x48\x87\xd2\x4a\x83\x94\x84\x82\xa0\xa4\x80\x52\xd2\x8d\x20\x29\x21\x29\x28\x21\x29\x20\xf1\x1c\xf7\x73\x1f\xe7\xfe\x79\xed\x93\xbf\x73\xbf\xe0\xc5\xf5\xfe\x73\x2c\xce\xd9\x7c\xf7\xcc\x7c\xd7\x9e\xb5\xe6\xa3\x8e\x7f\xc8\xeb\xcd\x59\x61\x66\xc7\xcc\xe9\x95\x1f\xdd\x76\xce\x61\xf1\xf9\x13\xc1\xe7\xd3\xef\x3d\x56\xcd\xf7\xa8\xa3\xc6\x46\xc4\x05\x71\x70\x0d\x88\x7b\x56\xd9\xdc\xbf\x71\xf1\xf9\x8b\x40\x73\xc3\x56\x6a\x5c\x36\x1a\xec\x8c\x84\x35\x51\x81\x63\x9c\x96\x97\x54\x5a\x68\x24\x56\x88\xb8\x20\x0e\xfe\x1c\x2e\x4b\x6c\xd5\xb2\xce\x9c\x33\x77\x52\xb5\xfa\x40\xb3\x7c\x4c\x56\x6f\xf3\xf2\xc1\xf6\xa1\x31\xee\x60\x1b\x97\xf7\xb8\xfa\x6f\x1c\x84\x06\x40\x1c\x34\x0f\x3c\xfc\x7b\xc2\x06\xe4\xdd\x4f\x4e\xd8\x9c\x39\xaa\x6d\x33\x6e\x42\x47\x6f\x55\xe8\x3a\xda\x6f\x3c\xce\xed\xa5\x1a\x7d\x4b\xbb\x80\xd2\xea\x93\xaa\xc4\x67\x6f\xfc\xbe\x12\x91\xfc\x00\x71\xc8\x09\x9b\xa6\x0a\xac\x07\x46\x2c\xd6\xd3\xcf\x89\xad\x87\xfc\xea\x03\x1d\x9a\x9b\x74\xbf\xf8\xb9\xc4\x46\x71\xec\x4b\xc9\x4d\x85\xff\x30\x43\x44\x06\x71\xc8\x09\x9b\x4f\x6f\x9d\x94\xd2\xd7\x29\x89\x30\x3e\xc5\xce\x0b\xae\x1d\x1a\xa6\x31\x61\xf2\x5e\x59\xf0\x0b\xe5\x09\x7b\x78\x7f\x9e\xda\xee\x2b\x94\x64\x02\x70\xff\x3d\x07\xf3\x67\x64\x93\xd2\xe2\xe9\xb8\x6f\x24\x81\x0a\xc7\x0c\x61\x52\x72\x78\xb3\x56\xd7\x58\xd1\x42\xce\x73\xc8\x5a\x07\x27\x13\x62\xe7\x5d\x5b\x40\x24\x6c\x40\xdc\x7f\x22\xe3\xfc\x23\x61\x43\xe3\x43\xf1\x82\xdf\xa5\xbd\xc2\x26\xdb\x25\x84\x9a\xe0\xfe\x0d\xe1\x83\xab\x1e\xef\x3b\xe8\xa7\x92\x9f\x39\x14\x98\x64\x8f\x74\xfe\x99\xb0\x31\x24\x6a\x17\x19\x59\x41\xe5\x1d\x6f\x98\xf2\x3d\x7a\xfa\x53\x19\x2d\x9b\x43\xe7\xdb\xd6\xcc\xa5\xd2\xfc\x47\x9b\x78\x4e\x44\xdc\x7f\x1e\x15\x3e\x13\x27\xcd\x52\x4f\xb8\x7d\x39\xe4\x1a\x8d\xad\xd6\x79\xf2\x34\xc1\x5b\x78\x56\xc4\x23\x3f\xd5\xf3\xde\x06\x48\xd5\x4b\x5d\xfd\xb7\x25\x6c\x40\x43\xfb\xb3\x87\x0d\x3c\x61\x53\x16\x93\x53\x50\x14\x4e\xc8\xb4\xf1\x00\x6b\x3a\x91\x99\xd7\xf1\x51\x53\xd2\x0e\x36\x5d\x53\x64\x6e\x92\xca\x33\xda\x0b\x38\xed\xa7\x91\xb0\x91\x40\x4a\xd8\xc4\xed\xb6\x9b\x89\x51\xd4\xe5\xfe\x4a\x32\xe9\xb2\xa5\x60\x32\xf2\x1b\xb3\xcc\xf7\x6b\xc1\xf9\xae\xdf\x96\xe8\xf7\xf4\x7a\xeb\xe6\xa9\x1c\xfe\x40\x4e\xd8\x24\x7b\x3b\xbc\x9e\x1a\x7f\x4c\x7c\xc3\x70\x07\x23\x0b\xe5\xda\x3d\x29\x02\x0b\x5f\x36\xf7\x90\x88\xf7\x91\x41\x33\xd3\x81\x8f\xcc\x4e\xe5\xa8\x0b\x72\xc2\xc6\x7f\x87\x62\xb7\x57\x3e\xc5\xb0\x3a\xf0\x7a\x83\xa2\x73\x95\x5c\xd0\x1c\x8f\xf5\x96\x0d\x89\x21\x97\xf7\x3b\x87\x94\x50\x39\xaa\x53\x19\x2d\x72\xc2\x66\x34\x9b\xef\x07\xf3\xb7\xf3\x5f\x32\xdb\xd1\x3e\x7f\x0b\x7d\x98\x73\x75\xa1\xa1\xb8\x8d\x4c\xbd\xf7\xf8\x73\x51\x49\x65\x06\x6f\xd4\xa9\x8c\x16\x39\x61\x13\x4e\xc9\xe6\xd3\x92\x15\xe1\x46\xd0\x89\xc6\x53\xc2\x48\x7b\x33\xfd\x99\xf5\xb0\x93\x44\x3a\x5a\xad\x41\x90\x2a\xaa\x86\x5c\xf1\xa9\x25\x6c\x40\xd2\x3d\x69\x7d\x6e\x39\x60\x33\x40\xd3\xa1\x5a\x33\xb9\xd6\x72\x9b\xc5\x23\x38\x93\x8f\x40\x53\x53\x6c\x46\xaa\xf0\xd6\xaa\xb2\xd1\x6b\x43\x81\x0c\xe8\xc4\x0a\x80\x83\xaf\x4b\x75\x99\x83\xab\x02\xee\xf6\x59\xa1\x66\x19\xf7\x96\x92\x82\xa2\xb9\x50\xa5\x5c\xc3\x3c\x5b\xb7\x45\xdf\x29\xb2\xa1\x3c\x3a\xa2\x45\xc4\x05\x71\xf0\xf5\x39\x15\xef\x9e\x86\xf5\x8e\x57\x49\x51\x5b\xfd\xd9\x9b\xca\x24\x26\xd4\xc3\x9c\x57\x49\x45\xc5\x24\x09\xdd\xc7\xfc\x69\x83\x62\x3e\x23\xe2\x82\x38\xf8\xfa\x4c\x95\xb2\x40\x8a\xfd\x6b\x46\x32\x5c\x52\x42\xfb\xf1\xd7\x56\x7b\xf3\x56\xfb\x18\xf9\x60\xd9\xaf\xf5\x8b\x3f\x5c\x4b\xa9\xf1\x5e\x20\xe2\x82\x38\xf8\xef\x0d\x0a\x12\x67\x4c\xda\xdf\x14\xd5\xaa\x8e\x42\x63\xce\x25\x10\x0d\xf8\x8e\xf6\xe2\x4c\xb6\xcf\x72\xab\x7e\xe8\x56\x07\x3d\x56\x36\x22\x61\x03\xe2\xa0\x1e\x36\x7f\x4d\xd8\x80\xa6\x91\x93\x14\xe0\x5a\x40\x5c\x45\x38\x3b\xa6\xe1\x31\x4c\xdd\x42\x43\x2f\xe9\x88\x26\xf7\x51\x88\x86\xc3\x5c\xc8\xc3\x96\xfa\xee\x86\xc1\x13\xa8\x39\x30\x88\x83\x2b\x80\x74\x5e\x2b\xe3\x82\x33\xe9\x6f\xeb\x34\x14\x74\xfc\xea\x19\x15\x3f\x94\xe5\x40\x31\xb2\x91\xe3\x1f\x7c\x2b\x83\x8f\x02\x08\xa1\x6e\x80\x20\x0e\xfe\x44\x7b\xd6\xd4\xac\xd0\x2a\x96\x43\xed\xfd\x6c\x2b\xf6\xb8\x0e\x70\xaa\x4b\x37\xe3\x2f\x7c\xb9\x35\xce\x35\xfd\xa6\xd4\xab\xd7\x0c\xea\x64\x0b\xe2\xe0\x0a\x20\xff\x1d\xd7\xab\x8d\xbe\x65\x48\x4d\xcd\x2d\xec\x39\xb2\x75\x5d\x69\x28\xf2\xf9\x7a\xd5\x96\xce\x23\x97\x5b\x43\xaf\x06\x59\xd8\x10\x71\x41\x1c\xfc\xf7\x62\xed\xf1\x7d\xb1\xa3\xc6\x18\x9c\x5e\x5f\x79\xfd\x66\x9f\xe3\x78\xc5\x85\x20\xcd\x30\xb5\x34\xfe\x89\x92\x71\x15\xcf\x6b\x07\x56\x44\xc2\x06\xc4\x41\x3d\x6c\xfe\x9e\xb0\x01\x4d\xe9\x27\x49\xe0\x79\xcd\xc1\x3d\x3b\x83\x8e\xfe\x17\x16\x61\x2b\xe4\x47\x59\x0c\x92\x19\x7b\xa3\x65\x4d\x8a\x8a\xc7\x74\xb2\x1a\x72\x4e\x95\x46\x88\xa1\x83\x38\xb8\x04\x8c\xd5\x86\x82\xd6\x26\x2e\x99\x10\xe1\x1a\xad\x15\x6d\xbf\xc5\x8b\x9d\x7d\x92\x67\x18\xa8\x7f\xa3\x74\x82\x75\x82\xd2\xeb\x1e\x74\x83\x07\x88\x83\x3f\x52\x0b\xa1\x2c\xfe\x8d\x42\x92\x02\x4e\x76\xca\x8a\xbb\x02\x56\xf1\x25\x13\x1c\x1e\x1d\x67\xc9\x6c\x07\x62\x29\x99\x19\xa3\xeb\xba\xa0\xc4\x0a\x80\x83\x4b\xa0\x10\x27\x45\xdc\xa5\xc0\x8c\xdd\x2b\x32\xb0\x44\x51\x0e\x47\xd9\x54\x55\x01\xef\x8a\xab\x68\x47\x6b\xb2\x07\x26\x46\x25\xef\x20\x22\x2e\x88\x43\xba\xd1\x68\x53\xba\xef\xe6\x20\x99\x2b\x9e\x3c\x61\xff\xd2\x53\xf1\xef\xbc\x24\x76\x11\x92\x11\x22\x78\x77\xca\x29\xc3\x28\x2e\xd1\x11\x22\x36\xe9\x20\x0e\xea\x5d\x01\x48\xd8\x80\xd6\xd7\x93\x34\x80\x73\x54\xbc\xf3\xa8\xfe\xfc\xe2\x47\x6e\x36\xad\xb4\xa8\x0e\x65\x5e\xd3\x55\xc2\xb5\x81\x54\xaa\x71\xd3\x8f\x71\xf1\xfa\x3d\x50\x72\x0d\xc4\xc1\x35\xb0\x44\xb7\x56\x90\xde\x5e\x75\x97\xeb\x1b\x27\x7a\x4a\x8e\xcc\x59\x43\xf6\x41\x71\xce\x6b\x01\x9b\xcb\xc7\x7b\x01\x63\x0b\xd2\x50\xff\x12\x10\x07\x7f\xa6\xc5\x4c\xb7\x65\x6a\x45\xf3\xf7\x1f\x0d\x7a\xf8\xfb\xdc\xc3\xcb\xc2\x25\xf2\x8c\x0b\x76\x6e\x62\x94\x31\xe0\xbd\x3f\xea\xbc\x06\x35\x47\x05\x71\x70\x0d\x38\xe6\xc4\xb6\x18\x84\x75\xab\xa8\x1d\x3f\x27\x8c\x6f\x4c\x5d\xb6\xe5\xa8\xb2\xfe\x6d\x92\x82\x35\xd8\x20\x41\xa4\xde\x92\xb1\x81\x88\x0b\xe2\xe0\xbf\xf7\xfb\xca\x8b\x66\xd7\x37\xfc\x41\x49\xea\x2b\x0f\x14\x2e\xf7\x48\xbf\xca\x3d\x63\x34\x45\x29\xdb\x44\x15\x71\xb8\xd1\x74\x59\x89\x11\xa1\x01\x10\x07\xf5\xae\x00\x24\x6c\x40\x9b\x9d\x93\x34\x90\xb7\x11\x33\xe2\x59\xd9\x40\x86\xeb\x5f\x75\x63\x5b\xdf\xcc\x27\x58\xcc\x6d\x82\x3f\x32\x2a\x8b\x4d\xef\x9e\x91\x03\xb6\x33\xd4\x6c\x17\xc4\xc1\x35\xe0\xdd\x86\xe9\xaa\xb7\x11\x72\x4d\xde\xc6\x41\xc7\xfe\x96\x44\x4e\x56\x3d\x06\x79\xb2\x2e\xf1\xec\x11\x35\xca\x47\x8d\x24\xf1\x78\x44\x5c\x10\x07\x7f\xa6\x3f\xd1\x79\x1e\xf7\xd0\x90\x4c\xfe\xae\x44\x9b\xc6\x39\x73\xe3\xf1\x42\xf6\x08\xb9\xab\x8e\x76\xe9\x91\xa2\x21\xdf\xb5\xe2\x74\xe8\x56\x2b\x10\x07\xd7\x00\x53\xee\xf0\x0d\x2b\x2c\xf7\x73\xcb\x67\x59\x8d\x5e\x94\x1e\x8a\x35\x30\xd6\xbe\x2a\x1d\xb1\xec\x6d\xa6\x1c\x92\x50\x73\x2b\x85\xde\x05\x10\x07\xff\xbd\x91\x4a\x01\xa3\xa6\x99\x75\xeb\x86\x74\xc3\xe7\xab\x65\xb9\x2a\xd6\x15\xc9\xc4\x34\xe2\xaf\xa7\x44\xbf\x2b\xbc\x71\xa5\xe8\x51\x3c\x42\x03\x20\x0e\x9a\x07\x00\x09\x1b\xd0\xce\xf3\x24\x0d\xbc\xd1\x1f\xa2\xdd\x2f\x7d\xbb\x31\x6b\x72\x21\xb3\x8a\x02\xd5\x86\x6a\xe7\xdd\xa5\xe0\x9c\x73\x3f\x71\xed\xc4\x1f\x77\x09\x6f\x42\x1a\x00\x71\x48\xdb\x81\x52\x3f\x19\x43\x0e\x3a\x6c\x43\x91\x9c\x82\xae\x10\x06\x81\x1f\xef\x7e\x2c\xbe\x7a\xec\x13\x1f\x7b\x55\xc0\x17\x05\x2b\x00\x9a\xb3\x41\x1c\xfc\x99\x5e\xa6\xc6\xc3\x29\xb4\x36\x2b\xa8\x22\x25\xe3\x60\xed\xfc\xf2\xec\x5d\x9d\xcc\x05\x06\xd3\xc3\xcf\xa4\xc9\x39\x4e\x06\x89\xb4\xd0\xe9\x2d\x10\x07\xd7\xc0\xee\xf3\x46\x31\x77\xdd\x63\xb6\xd2\x6d\x57\xe7\xd5\x8f\x64\x6e\x9c\xb7\x9e\x0d\x6c\xde\x2e\xa5\x65\xd4\xe3\x9a\x3a\xb6\xb6\x84\x6e\x20\x03\x71\x48\x27\x82\x6a\x16\x35\x68\x14\x22\xc7\x47\x3f\x8b\xe9\xb8\x5b\x8f\x1d\x76\x37\x7b\xf6\xa6\x5e\x72\x38\x83\x65\x37\x2c\x44\x2b\xe9\xe3\x82\xd0\x00\x88\x83\xe6\x01\x40\xc2\x06\xe4\xdd\x4f\x4e\xd8\xec\xe1\x7d\xa7\x72\x16\x2c\xae\xeb\x5a\xd7\xb5\xcb\xe1\xaf\x62\xa9\x74\xf7\x5d\xbd\xe1\xf0\x00\x7f\x6c\x07\x4f\x34\xaa\x82\xae\x1a\x91\xfc\x00\x71\xc8\x09\x9b\x2e\x86\xbb\x7d\xf6\x26\x1f\x9e\x5e\x98\xbc\x8c\x8a\x56\x10\x54\x59\x53\x94\xf7\xb2\x4d\x3d\xa2\xfb\xa1\xee\x42\xe3\xc0\xdb\xe3\x41\x44\x64\x10\x87\x9c\xb0\xb1\xaf\x17\x32\xd7\xbc\xaa\x78\xed\x62\x3f\xe3\x93\x2f\xf2\xc7\x41\x1f\x7a\xe8\x45\x87\x96\x4a\xdf\x8d\x0a\xa5\x2a\xd4\x4d\x7d\xc7\x45\x44\x06\x71\xff\x7f\xc2\x86\xee\xcf\xc8\x35\x65\xc6\x8e\x56\x7e\xa6\xfb\x34\x97\x1e\x98\x16\x37\xcf\x08\x29\xa6\x31\x65\x6a\xcc\xa1\x84\xa0\x9d\xa3\x8c\x7f\x18\xeb\x77\x1b\x91\xb0\x01\x71\xff\x7d\x1a\x7f\x26\x6c\x64\x89\x38\xf6\xf3\x69\x51\x63\x3b\xb6\x2e\x36\x17\x13\x29\x74\x35\xdc\x2e\xbf\xe1\xc4\x5f\x6e\x26\x8d\xed\xed\x9c\xc3\x3d\xf2\x8f\x6b\xbd\xaf\x37\xfa\x39\x46\xda\x8c\xb4\x3e\xdb\xd2\xa9\xd5\xd6\x68\xa0\x99\x7d\xf5\x1b\xfb\x25\x8a\xc0\xdb\xad\x45\xc6\x68\x83\xd9\xa2\xb4\x3f\x50\xfd\x3e\xd6\x92\x31\x8b\x4f\x4c\x1d\x3a\x4d\x93\xf2\xfe\xc9\xe2\x9d\xbc\x13\xe3\x7e\x04\x5c\x5e\x47\xef\x73\x28\xb7\x96\x4c\x86\xff\x2d\x09\x9b\x5f\x98\xff\xdb\xd0\xfe\x2f\x61\x23\x85\x22\x09\xf7\xd7\x2b\xed\xa3\xb9\xaa\x15\x2d\xd8\xf5\xb8\xc2\xaf\x6b\x6f\xbe\xad\x52\xde\xbd\x88\x57\x66\x34\x9e\x76\xb1\xcb\x9c\xc3\xf4\xf9\x95\xcc\xd3\xc8\xd8\xf8\x22\x65\x6c\x7c\x7a\x1c\xbe\x6d\xfb\x98\x79\x92\x0d\x65\x3d\xc7\xdc\xa3\x25\x37\xd0\xe1\x94\xb1\x9b\xca\x72\x5b\x8f\x61\x57\x45\xe5\xee\xbf\x76\x2a\xa7\x3f\x84\x90\x9b\xd8\x24\xde\x5e\x51\xe3\xbf\xe0\x8c\x33\x4c\xae\xf1\xe2\x31\x8a\xb8\x0e\x59\x78\xb5\x55\xb1\x67\x56\x4c\xa3\x57\x50\x8b\xd0\xdc\xf8\xa9\x9c\x75\x41\xce\xd8\x90\x49\x7d\x1b\x5c\x91\xc4\x5e\x0d\x6e\x1a\xba\x6c\x94\x51\x60\xee\x21\x97\x39\x78\x7b\x99\x44\x47\x6d\x91\xf0\xb1\xb4\xf9\x39\xef\x53\x19\xad\x13\xd2\x9f\x6d\xb3\xcc\xfb\x52\xcb\x35\xf8\x6b\xe9\xbe\x5e\xca\x7c\xec\x07\x5a\xc5\xca\x10\xe5\x23\x0a\x71\xfa\x22\xe3\x38\x8f\xbb\xa1\xa9\x6d\xa7\x32\x5a\xe4\x8c\x4d\x52\xf9\x25\x1e\xec\x4f\x0e\x0b\xfd\xb3\x49\x2b\xfe\x8b\x75\xbb\xa9\x02\xb9\xe3\xc2\x29\x94\x26\x0c\xe1\x1f\x89\x1b\x82\x16\x73\x4e\x2d\x63\x03\x92\xee\x49\x0b\xf4\x2b\x8b\x77\xcc\x5e\xb5\x1f\x5b\xa8\xa7\x0d\x0b\x07\xbe\xf5\x6e\x15\x7d\x66\x6c\x78\x45\xab\x58\xb2\x76\xfc\x34\xc7\x5c\xf0\x1c\xd4\x63\x00\xc4\xc1\x17\x68\x66\xd5\x77\xb5\xd1\x39\xfc\x81\x63\xdf\x62\x88\x02\x15\x6b\xa2\x0e\x9d\xc8\xb1\xd0\x62\xa9\xf2\x50\x75\xaa\xe8\xbe\xe5\x26\x49\x42\x47\x61\x00\x1c\x7c\xc1\xbb\xf5\xc1\xfb\xca\x4f\x9d\x10\x01\x8f\x9b\x75\x93\x2f\xc2\xf3\xb7\xeb\x13\x14\x39\x69\xbb\xd6\x51\x79\xf9\x2f\x0a\xf8\xc7\xe1\x42\x3d\x72\x41\x1c\x7c\x81\x6e\x1a\xc0\x8f\xb4\x18\x5f\xf3\x27\xde\x76\xb4\x0c\x61\xa7\xb3\x56\x5b\x45\x0d\xc3\x0d\xf4\x3c\xfe\xd0\xf8\x4d\xd7\xe9\xa1\x02\xf4\x75\x11\xc4\x05\x48\xa2\x48\xfc\x19\x37\xc4\xd8\xda\xe4\xe3\x5e\x16\x05\xfb\x83\x8c\xc5\x8e\x84\xd9\xfc\x5e\xcf\xc9\xbe\xf4\x4e\x92\xbb\x53\x5c\x85\x2f\xb1\x0b\x3b\xa0\x03\x16\x20\x0e\xd1\xc2\xe4\x3f\x13\xd6\x5f\xf6\x68\xa0\x79\xe4\x24\x09\x78\xdf\x5d\x26\xa0\xeb\x77\x3f\x97\x81\xb7\x57\xec\x3b\x5b\xad\x3d\x8a\x69\x30\xcf\x41\x80\x3f\xba\x74\x9c\xf7\xa3\x6a\x86\x11\xea\x63\x04\xe2\xe0\x12\x28\xe9\xa5\xea\x17\xc0\xc8\x3e\xcb\x13\x59\x3c\x2c\xa2\xf6\x50\x60\xfc\x87\xfb\xef\x35\xca\x7b\x56\x3f\x0d\x49\x24\x29\xf9\xba\xa0\x8f\xe0\x20\x0e\xa9\xcf\xa0\xfa\xcb\xa9\xbd\xa1\x8d\x6f\xd8\x8c\x2b\xa6\x4f\xf5\x32\x45\x88\xbf\x18\x0e\x53\x5f\x40\xbf\xf7\xf4\xfc\xef\x03\xb3\xb7\x9f\xf9\xa0\x3e\x83\x00\x0e\x2e\x81\x9f\xf7\xf3\x4c\xd6\x24\x8c\x19\xd4\x6e\xf7\x5a\x5a\xe6\xa1\x93\xdc\x32\x1b\x4b\xb5\x6f\xd8\xa4\xe6\xce\x10\xea\x8f\x1f\xa1\x84\x6e\x1e\x05\x71\x70\x09\x60\x46\xa3\x6c\x09\xc8\xde\x15\x1f\xd9\xb8\xf4\x30\xd8\xc0\x76\xa6\xec\x23\x31\xcb\x90\x4d\xd4\x03\x9d\xee\xf9\xdb\x61\x67\x1b\xe2\x11\x12\x00\x71\x50\x17\x9b\xbf\xa7\x6c\x40\x73\xfa\x49\x12\x78\xfb\x11\x2f\xb6\x98\xbc\xa8\x5a\x7a\xe0\x1a\x5f\x91\x22\xba\xb2\x84\xf4\x2d\x36\xbf\xdf\x5f\x9f\x70\x32\x26\x3e\x60\x6b\x92\x3a\x82\xba\xc2\x00\x38\xb8\x04\xe4\x78\xb0\xfd\xb0\xa7\xb1\x54\x1c\x89\x52\x28\x29\x7e\x92\x79\x0a\xff\xc8\x4e\x08\xdd\xba\x5a\xf8\x3e\xcf\x27\xfe\x35\xd6\x01\xd4\x15\x03\xc4\xc1\x25\xa0\xc5\x70\xc5\x0c\xf5\xe1\x90\xa4\x34\x83\xbb\x8f\xd8\x4b\xb6\xaa\x92\xf8\x69\x5e\x36\x8c\xf0\x5f\x46\xc7\x3b\xa3\x4f\x39\xdf\x66\x21\xe2\x82\x38\xb8\x04\x12\xe6\x2d\x5e\x48\x19\x4b\x1e\x48\x8d\x52\x1a\xab\x8f\xba\x8c\xe7\x1a\xb9\x13\x7e\x32\xf1\xad\x27\x33\xbb\x5a\x90\x9b\xf7\x0b\xea\x60\x02\xe2\xe0\x12\x70\xec\xc1\x1b\x99\xfb\xf2\xcc\x34\xfb\x9b\x75\x36\x11\x0f\x3f\x76\xaf\x84\x82\x37\x5a\xb1\xcf\x8b\x31\xef\x8b\x23\x16\x6d\x2e\x19\x88\x6d\x3a\x88\x83\xba\x57\x08\x01\x8a\x21\x00\x0b\xec\x49\x1a\x68\xd4\xbd\xae\x42\xe0\xe1\xf5\xb1\x61\xd7\xd7\x3d\x35\x23\xd8\x28\x25\xdf\xc2\x97\xb0\xd6\xc4\xd5\x65\xe8\xe5\xc5\x4b\x41\x6a\x1c\x88\xb1\x83\x38\xb8\x06\x9c\xa6\x55\x2f\xd6\x74\xdf\xba\xad\xa5\xb9\x39\xa9\xf6\x9d\xfb\x6a\xfe\xd5\x27\x7e\x65\xc3\x89\xf4\x7e\x4d\x29\x5d\x52\x8c\x24\x50\x37\x08\x10\x07\xd7\x80\xe9\xea\x02\xda\x5e\xea\xf1\x3e\xae\x5b\x77\xd2\x45\x52\x81\xf0\x81\xaa\x3e\x74\x7d\xa6\x57\xef\x68\x45\xf3\x0c\x92\x5a\xaf\x40\x47\xe2\x40\x1c\x5c\x03\x59\x0e\x57\xce\x30\xbe\xb0\x96\xef\x23\xcf\xed\x24\x15\xb8\x62\xeb\x2f\x87\xbd\xe0\xd9\x5e\xbd\x3f\xfb\x3c\xff\x71\xb5\xb9\x0f\x74\x5f\x16\x88\x83\x6b\xa0\x4a\x42\x8e\xfa\xe5\x21\x36\x19\xaa\xea\x3c\xe3\xe1\xae\xf0\xc4\x48\xca\x4d\x23\xf1\x07\x1f\x3f\xdf\x6d\xed\x50\xee\x2f\x0b\xf1\x45\x68\x00\xc4\x41\xdd\x2b\x00\x29\x1b\xd0\x6e\xe7\x24\x0d\xc8\x38\x8c\x09\xec\x5e\xb3\x0a\x11\xdb\xd4\xbb\xf9\x95\xf9\xfe\xf4\x6d\x63\x6a\xe9\x94\x8b\xa8\x84\xe5\xce\x57\x8e\x38\x8d\x22\x13\x10\x63\x07\x71\x70\x0d\x8c\xf2\xd6\xf5\x7d\x3e\xc7\x44\x92\x98\x31\xff\x49\xb0\xc2\xbb\xfd\x21\xbb\xf1\x39\x8c\x7a\x27\xbd\xc9\x59\xfd\xe1\xf0\x76\x65\xa8\xa3\x3b\x88\x43\xba\x27\x6a\xf6\x12\xf7\xe7\x50\xb2\x0e\x61\xb4\x27\x37\xfc\xc9\x3c\xce\x78\xc5\x4e\x31\x60\x04\xfd\x2c\x19\xd6\x7a\x1d\xf7\x26\x69\x17\x2a\xe6\x04\x71\x70\x0d\x04\x49\x48\xf4\x62\x90\x76\xcf\x49\xf8\xea\x6a\xec\x71\x1c\x11\x9d\xd1\x1e\x58\xe3\x1e\xc1\x7f\xee\xf0\x69\x21\xed\x61\xa5\xd2\x16\x22\x2e\x88\x83\x6b\x80\x2d\x42\x7b\x36\x4a\xd9\x0f\xcf\x51\xe6\x3c\xfe\x72\x56\xe3\x72\xc4\x87\x1f\xcf\x5c\xf8\x5f\x7d\xa8\x33\x1e\xb1\x95\x29\x3f\x37\x8a\xd0\x00\x88\x83\xe6\x01\xa7\xbf\x6b\x00\xb4\xf5\x3c\x49\x03\x9d\xf9\xba\x78\x16\xce\x6d\x4d\xa9\xcf\x53\x7c\x3a\xd5\x85\x12\xab\x66\x0a\xc6\xa6\xdf\xe9\x68\x6e\x71\x2c\x62\x3e\x22\x57\x87\x8e\xb0\x82\x38\xb8\x06\xa2\x53\x55\x6b\x27\x72\x42\x2e\x1e\x86\x62\x19\xfb\x08\xc8\xe4\x4a\xfe\x9c\x62\x68\x36\x55\xfc\x86\x39\x34\x1b\x16\xdd\x72\x1b\x6a\x13\x08\xe2\xe0\x1a\xe0\x69\x65\x6e\x72\x89\xaf\x78\xbc\xac\x3b\xb5\xaf\x66\xb8\x94\x16\x49\xc4\x69\xf9\x2a\x3b\x04\x27\x78\xad\x98\x50\x75\x4c\xf2\x36\x22\x2e\x88\x83\x6b\x60\x56\xb4\x82\xcc\xb5\xcc\x83\xc0\x05\x25\x78\xd4\x92\xe8\xfb\x9d\x86\xfb\x55\x91\x5c\x5c\xe2\x96\xb7\x84\xb1\xde\xe8\xbc\xbc\x03\x15\x47\x82\x38\xb8\x06\x94\x2c\x0a\x56\xf9\x59\xd5\xea\xbf\x8f\x51\x92\x85\x0d\xf0\x0a\x55\xdb\x9b\x7e\x1c\x3a\x3c\xdf\x47\xf6\xe9\x6d\xc1\xfa\x9b\xfb\x96\x08\x0d\x80\x38\x68\x1e\x00\xa4\x6c\x40\xee\xfd\xe4\x94\xcd\x88\xfe\x6d\x16\x05\xb3\x3b\x1d\xe4\xc5\x7c\xf5\xa9\xf4\x8e\x5e\x3a\xac\x3e\xaf\xdc\x0a\x6f\x98\x63\x2e\x99\x5f\xb3\xc9\xdf\x55\x43\xa4\x3f\x40\x1c\x72\xca\xa6\x3b\x35\xc4\xb2\x11\xc3\x5f\x7e\xb8\xff\x70\x77\x5c\xf9\x90\xdc\x83\xbb\x8d\x49\xa1\xaa\xa4\x6c\x74\x55\xaa\xb2\x92\xf5\x27\x03\x74\xfd\x36\x80\x43\x4e\xd9\xac\x94\xe4\x2d\x16\xa2\x72\xe6\xa8\xf3\x9c\xbb\x72\xfe\xa6\x60\xee\xf7\x42\x69\x35\x29\x31\xa9\xe3\xb1\xdc\x30\x57\xb2\x68\x27\x43\x44\x64\x10\xf7\xdf\xe6\xc0\x7f\x46\x6e\xaf\x10\x8f\x56\xb6\x1f\xba\x36\x9f\x35\xf5\xf3\xb6\x85\x9f\x27\xef\xd9\x5d\xe9\xdd\x5c\x83\xe6\x77\x92\xe8\x9f\xf3\x6f\xf6\x3f\xf6\x45\x64\x60\x94\x92\xb4\x04\xab\x78\xb3\x16\x93\x45\xb3\x77\x5b\xc2\xde\x34\xd3\x5b\x7d\x43\x7b\x3a\x7a\x3e\xb6\xac\x6a\x88\x5c\x25\xbd\xb0\xf8\xcf\x0c\x8c\xa6\x01\xbe\x5b\x0e\xa5\x98\xfd\x67\x0b\x74\x5b\x71\xd7\x8e\xc3\xb3\x6f\x72\x79\xe6\x06\x8e\x92\x3c\xd6\x1f\x90\xce\xee\x88\xfe\xd9\x94\xe6\x6e\x14\x3d\x91\x7e\x10\x95\x75\xaa\x90\xb6\x88\x9c\x9f\x93\x7c\x8f\x32\x1a\x8b\x47\xce\x9e\x35\x5d\xf7\xbb\xbd\xb7\xdb\xbb\x97\xfe\x6d\x19\x18\xd0\xd0\xfe\xc8\xc0\x48\x20\x65\x60\xb0\x73\xbc\xf9\x74\xdf\x34\x66\x71\x4c\x25\x4a\x90\x58\x94\xa8\xba\x59\x44\x5c\x15\x62\xb7\xa5\xcf\xb3\xc2\xe4\xa2\xa0\x44\xbb\x7d\x1a\x19\x98\x7a\xa4\x0c\x0c\x6b\x3e\x56\xce\x82\x1c\xb9\x75\x72\xad\x0b\xb3\x5e\xb5\xa0\x0e\xdd\x12\x86\x4a\x69\x2b\xb1\x53\xe9\x1e\x26\xf1\x9e\x21\xea\xc8\xa9\x1c\xe7\x40\xce\xc0\x8c\x04\xeb\x8f\xcb\x6d\xf6\x73\x8d\x51\x96\xa9\x28\x4c\x39\xe0\xa7\x9d\xdf\xf8\x70\x07\xe7\xcb\x4f\x69\x8b\xf5\x00\xd2\x25\xc1\xda\x53\x39\xbc\x82\x9c\x81\xd9\x4b\xe6\x34\x2d\xae\xb3\x92\xd3\x95\xc9\x89\xd5\x34\x5b\xd4\x60\x20\xbb\x76\xf1\x62\x87\xfa\x21\x8f\x8a\x6c\xf9\x60\xd8\xea\x8d\x53\x19\x2d\x72\x06\x86\x4e\x29\x99\xfe\x37\xa7\x7d\x96\x6a\x56\xad\x59\xbb\xaf\xd5\xe0\xfc\xd2\x25\x15\xa6\x4d\xb9\x3c\xaa\x34\xf1\x1e\x2a\x12\x0e\xb6\x53\x19\x2d\x72\x06\x46\xa2\xd1\xf9\xdd\x1b\xdc\x33\x7e\x2d\x98\xe1\x3d\x85\x0d\x97\xb1\xc8\x26\x2f\x65\x04\x9c\xef\x4d\x69\xdb\x91\xf1\x7a\x4a\xbc\x78\x0a\x65\x73\xb7\xff\x37\xe9\x9e\xb4\xde\xde\x4c\xe9\x19\xd0\xfd\xce\x33\xa0\xbf\x37\x11\x81\x8b\xee\x2b\x46\xbf\xda\xc6\xe0\xcf\x4d\xaf\xac\x61\x53\x7b\x2d\x86\xc9\x06\xfa\x34\x00\xe2\x90\x32\x30\xe5\xad\x0f\xa4\xd9\x7e\x62\xe8\xb5\xee\x7e\x08\x7b\x9e\x59\xf4\x3a\x7c\x66\x36\x2d\x4c\xb8\xef\xc5\x80\xc7\xe7\xb6\x64\xb5\x71\x28\x03\x03\xe0\xe0\xeb\x6d\x97\x1c\x76\x6c\xed\xcd\x3c\x8e\x77\x51\x58\x72\xeb\xca\xf1\x97\xbc\x48\x14\xee\x9b\x13\xe7\xc6\xed\x34\xab\x6e\x96\xf9\x4a\x40\xdd\x23\x41\x5c\x80\x24\x0a\xe1\x3f\x4e\x48\xe2\xf7\xd5\x3d\x0b\xb0\x77\x5a\x96\x66\x14\xdd\xad\xc7\x26\xa0\x35\xd1\x9f\xff\x32\x9f\xcc\x73\xcf\x95\xe1\x11\x51\xf8\x02\xd4\x95\x06\xc4\x05\x48\x62\xfc\xb3\x3b\xe7\x63\xd3\xd4\xb2\x45\x1d\x73\xa3\xab\xfc\x51\x9d\x15\x4a\xf3\x9c\x54\x49\xcc\x82\x02\x5f\x46\x2a\x0d\x03\x50\x6a\xb1\xa5\x7f\x22\xec\x37\x88\x43\xf4\x24\x91\xf8\x7b\x06\x06\x34\x8f\x9c\x24\x81\x5d\x3e\x7f\x25\x9f\x6a\xae\x6c\xdf\xf3\x1a\xfc\x9e\x97\xce\x2e\xa5\xb6\x57\xbc\x17\xed\x9f\x75\xf2\xac\x0e\xdb\xa3\xb8\xc6\x88\x0a\x7d\x1d\x02\x70\x70\x09\x74\xc5\x88\x7b\x7b\x0f\xe9\x70\x54\x7f\xfe\x2e\xf7\x33\xf7\xc0\xd9\xff\xee\xd7\xd8\x77\xe7\xf5\x8d\xb9\x99\x27\x22\xd0\xa3\x55\xa0\x3b\xd5\x41\x1c\xd2\xcd\x2c\xf6\x56\x69\x8b\x74\x6f\x15\x7c\xeb\x75\x72\x9f\x55\xbb\x0a\x47\x7d\xe0\x50\x7b\xfe\x7b\xfd\xfe\x6b\x13\xec\x99\xfb\xf1\xa8\xb3\x88\xb8\x20\x0e\x2e\x81\x96\x11\x56\xe7\x99\x6e\xb7\xf2\x73\x96\xf8\x45\xc7\x25\x29\x28\x57\x0e\xb0\x53\x62\xe7\xba\x67\x92\x3c\x2e\x62\xb0\x75\x8e\x43\x37\xc9\x80\x38\xb8\x04\x02\x89\x5f\x36\x39\xcc\xfe\x4c\x96\x20\x58\xbf\x11\x79\x3d\x24\xa8\xe5\x85\xaf\x3c\xd6\xab\x1f\x21\x66\x58\x0f\xc3\xf9\x6e\x63\xf3\x23\x24\x00\xe2\xa0\xb6\x34\x7f\xcf\xc0\x80\xe6\xf4\x93\x24\x60\xb4\x8e\x1d\xb1\x58\x69\x80\x86\xc5\x7b\x54\xae\xc4\x58\x77\x6b\xf1\x09\x39\xf3\xcc\xa2\xf7\xa5\x3b\x4c\xa2\xa2\x9e\xf9\x47\x5f\x11\x43\x07\x71\x70\x09\xd8\x79\x2e\x7e\xbe\xd8\x43\x4e\xd7\x42\xc9\xc8\xdd\xfb\x9e\xe3\xfd\xdd\x15\xac\x3b\xb3\x24\x82\x99\xe8\x1d\x3a\xf6\x83\xa1\x4b\x90\xa3\x03\x71\x70\x09\xa8\xc7\x51\x91\xef\xf3\x0e\x62\xea\xdd\xa2\xa8\x64\xfe\xdc\xf0\xe8\x66\xe5\x98\xd6\xaf\x7e\x59\x45\x65\x0d\xf6\x54\xfc\x39\x6e\xa8\x72\x06\xc4\xc1\x25\x40\x6b\x3a\xe5\xbd\xf4\x3d\x78\xa4\x10\x7d\xe9\xc3\x9d\xb0\x86\xef\x9d\xca\x8b\x77\xaa\xb6\x1d\x5d\xe6\x2d\xe4\x6e\x8d\x5f\x50\xa0\x44\xc4\x05\x71\x70\x09\xe8\x3c\x4d\x4e\x25\xd9\x9e\xad\x8f\xe3\x27\xcb\xfd\xa8\x52\x21\xbb\xfb\x8e\x8c\x9f\x62\x56\x93\x08\xfb\xb2\x80\x71\x30\x8b\x57\x3f\x62\xd7\x0d\xe2\xa0\x76\x14\x80\x0c\x0c\x68\x81\x3d\x49\x03\xb1\x6b\xd4\x64\xd3\x2f\x74\x7d\x0f\x19\xf3\x54\xbd\x0e\x59\x8a\x82\x3a\x22\xdc\x05\xe7\xa3\x5a\x63\x02\x94\x4d\xd7\xfa\x36\xa1\x53\x8e\x20\x0e\xae\x81\xe3\x11\xfd\x17\x22\xe9\x42\x45\x47\x42\x82\xb5\xf1\xb3\x6a\x0f\xf0\x1f\x53\x25\x1f\xec\xaa\x2b\xd4\xf1\xdd\xc0\x6e\xa6\x8e\x7f\x89\x88\x0b\xe2\xe0\x1a\x28\x17\xb1\x3c\x4b\x18\x5b\x76\xe1\x73\xed\xbc\xb9\x48\xb7\xf0\x8e\xec\x19\x81\x76\x56\x14\xd6\xd1\xf7\xb6\xdd\xad\x95\x13\xea\x72\x88\xb8\x20\x0e\xae\x01\xa9\x9b\x7d\x05\x35\x55\x35\xc9\x71\x2d\x25\x5e\x15\x09\xdb\x7c\xd5\xec\x92\xe6\xf7\xce\x0d\x19\xce\x7f\xb2\xc5\x9d\xf1\x25\xf9\x81\x88\x0b\xe2\xe0\x1a\x40\xeb\xcf\xff\x69\x4b\x84\xa9\x36\x9a\x44\xb7\xd0\x25\x6c\xab\x42\x3e\xf9\x50\xbf\xb3\x4a\x6c\xfb\x87\xe7\x79\x95\x7b\x25\xaf\x27\x11\x1a\x00\x71\x50\x3b\x0a\x40\x06\x06\xb4\xdb\x39\x49\x03\x9e\xfa\xbd\x7d\xd1\xa8\xaa\xd3\xb8\x1c\xb6\x67\x6c\x2c\xfd\x73\xcd\x12\x9e\x6b\xff\xba\xd9\x99\x6c\x6f\x36\xea\x3b\x78\xc5\x1e\x3a\xe4\x06\xe2\xe0\x1a\xb8\xf2\x92\x91\x41\x52\xe9\x55\x28\xf9\xe6\x92\xa5\xb8\xe8\xd1\xb0\x5f\x91\xee\x0d\xba\x68\x62\x67\xd5\xf8\xb0\x3c\x1f\x93\x0c\xe8\x82\x26\x10\x07\xd7\x40\xb5\xa1\x35\x91\xa8\x1c\xaa\x57\xd6\x54\x22\x3a\xc3\xbe\x91\x6d\xa8\x02\xdf\x9b\x9f\xd5\x8e\x67\xf4\x55\x7d\xec\xb5\x5e\x3e\xad\x42\xc4\x05\x71\x70\x0d\x18\xf2\xb8\x19\xb7\xa0\x70\x6e\x5d\xd1\x7b\xf4\x46\x85\x28\xfb\x60\x4a\xa6\x5a\x59\x2d\xe3\x8e\xce\x93\x86\x46\xfc\xaa\x47\x8a\x9b\x88\xb8\x20\x0e\xae\x01\xf7\xc4\x21\x77\x4c\xe3\x3c\x7c\x45\xf4\xb3\x78\x2e\x35\x07\xb6\x19\x7e\xb3\xd8\x3a\x5c\x94\xd4\x03\x45\xf6\xa8\x19\xdf\x65\xd5\x10\x1a\x00\x71\xd0\x3c\x00\xc8\xc0\x80\xb6\x9e\x27\x69\x20\xfe\x37\x3b\xdf\xde\x65\xac\x0d\x0c\xe3\x60\xe2\x0b\x9d\xaf\xb1\xf8\x5b\x5c\x76\x03\x23\x48\x23\xb4\xe3\xc2\xcf\x58\x9e\xad\x85\xda\xbc\x80\x38\xb8\x06\xae\xeb\x4d\x33\xf7\x90\x52\x7a\x91\x9c\xa3\x69\x7d\x7e\x23\x3a\xd3\x3f\x34\x98\xbe\xd8\x4e\x79\xc2\x0a\xc3\x98\xcc\xe4\xb7\x00\x74\x78\x0e\xc4\x21\x69\x80\x91\x3f\x3c\x25\xa5\x5c\x5a\x0b\x9b\x47\xa9\x5b\x0c\x7f\x59\x87\x63\xff\x72\xd1\x06\xc9\x8f\x61\x6f\x53\xf7\xc8\x17\xae\x50\x6b\x22\x10\x07\xd7\xc0\xc4\xa7\x2f\xd2\x55\xfe\x71\x53\xd7\x31\x3c\xc7\x75\x5f\xe1\xfc\xa6\xc3\x24\x7f\x1c\x6c\x7e\xf3\x0a\xc7\xd5\xe2\x65\x66\x9f\x36\xa8\x45\x19\x88\x83\x6b\x00\x37\xfa\xe0\xac\xfd\x9c\xcc\x18\x01\xfe\xb8\xfa\xf8\x2d\xe7\xb1\xcc\xc2\xca\xf4\x8f\x28\x1f\x98\x2d\x7d\x07\x95\x8c\x05\xa9\x44\x11\x1a\x00\x71\xd0\x3c\x00\xc8\xc0\x80\xdc\xfb\xc9\x19\x18\xcc\x35\xee\x4a\xd6\xdb\x31\x82\xab\x6c\x21\x4f\xf7\xcb\xd0\x7f\x7e\xf1\xfd\x24\x86\xea\x2f\x97\x9d\xf5\x88\x55\x33\xc2\x53\x3d\x1d\x91\xcd\x00\x71\xc8\x19\x18\xe2\x4b\xfc\x7b\x73\xa3\x67\xf5\x49\xd2\x78\x5f\x3e\xd0\xa6\x6f\xd7\xe8\xba\xe7\xf0\x8c\x97\x9b\xd3\xf0\x15\x2a\xaf\x88\xcf\x20\x54\x3f\x05\xe2\x02\xa4\x51\x70\xfe\x19\xd9\xc4\xbb\xe3\xd1\xe4\xbe\xf7\x64\xb6\xcb\x85\x19\x7d\xbd\xac\x04\xa9\xd9\x35\xa1\xbe\xfb\x42\x45\x14\x36\x49\xbd\xd7\x13\x29\xad\x11\x91\x41\x1c\xf2\xd3\xf0\x15\x9a\x94\x15\x93\xc0\x20\xd3\x76\x2c\xd3\x4d\x3b\xff\x6e\x9a\xbc\xfb\xcc\xa7\x0c\xb1\xe6\x21\x46\x57\xa9\x71\x36\xac\x5e\x69\x28\x03\xb3\x50\xf8\x2a\x58\xcd\x56\x4f\xcb\xef\x90\x38\x53\x79\x5c\x6b\x99\x48\x45\x1e\x4b\xf5\x01\x27\x9a\x0d\x17\xc7\x40\x7e\xf6\xda\xf2\x9f\x19\x98\x9a\x4b\x9a\x6c\x0c\x79\x2b\xf3\x2c\xca\x5d\x7b\x0e\x4f\x9b\xc6\xa4\xc3\xcf\x37\x8c\xca\xf7\xf9\x11\xd8\xf2\x6b\x2a\x7f\xd4\x42\xfb\x73\x5e\x36\x9f\x8c\x10\x47\x75\xe4\x4f\xdd\x67\x1b\xe6\xf6\x4d\x52\xec\x71\xa7\xf2\x3f\xaa\x8e\xef\xbb\xd8\xd7\xb3\x25\x5c\x69\x79\x4b\x42\x02\x0f\xef\xdf\x90\x81\xf1\xc5\xfc\xdf\x86\x16\x88\x8e\x82\x19\x70\x83\xd6\x37\x28\x4c\xca\x17\x29\x03\x73\x8c\x85\x12\x23\x6c\x5b\xab\x46\xc5\x88\x3a\x91\x7f\xfb\xbd\xa6\x09\x9f\xee\xbe\x8d\xe0\x85\x0f\x68\xd6\x24\xbf\xc6\x1b\x1a\x18\x4e\x23\x03\x83\xa2\x02\xff\xab\x13\x9e\xc4\xcc\xdf\xd2\xd7\x17\xe5\xc3\x23\x84\x31\xe4\x6d\xd5\x53\xae\xdf\x6f\x63\xbb\x36\xfc\xd6\xae\x5e\x67\x39\xe7\x71\x10\xda\xa9\x1c\xcf\x40\xce\xc0\x88\xa5\xb2\xd5\x8b\x2c\xe8\x97\x8e\xcf\x5c\xbe\xe5\x3a\x79\xc8\x2c\xa2\xf0\x4d\xe8\xee\x4f\xb7\x01\x41\xf4\xbd\xb0\x1d\xed\xb8\x53\xe9\xf7\x82\xa2\x85\xf4\x67\x19\x8c\xc7\xf7\x52\xc5\xca\x69\x3c\x6f\x90\x4b\xa6\x91\x0a\x72\x24\xdd\x5a\x5e\xa3\x28\xda\x95\x0f\x35\x13\x31\x1b\xbf\xbf\xad\x7d\x2a\xa3\x45\xce\xc0\x74\x14\xb8\x9c\xf9\x7a\x3b\x7e\xe5\xfe\xc2\x83\xc0\xe4\xf9\x97\x0a\x5b\x9a\xad\x44\xfc\x19\xa4\xaa\x25\xb4\x14\x3c\x1d\x18\x67\xcf\x9d\x5a\x2a\x04\xa4\xa1\x93\x16\xbe\xb8\x71\xa6\x9a\x1f\xbc\xef\x18\x99\xbe\xd4\x14\x3c\xbe\x30\x74\xc8\xb5\xbd\xf2\x08\xfb\x9a\x79\xc8\x1b\x92\x40\x17\xd3\x9f\x53\x5a\x88\x09\x1f\xc4\xc1\x17\x3e\x02\xb7\x19\xb6\x04\xf3\x4f\x13\xb2\x6f\x23\x6e\x31\xbe\x7d\x86\x17\x88\x6e\x80\x46\x92\x72\xb3\xa6\x53\xda\x6c\x7c\xb4\x4d\x13\x6a\xfb\x0a\xe2\xe0\x0b\x9f\xa3\x8e\xeb\x7e\x86\xc8\xee\xb5\xc9\x96\xca\x3a\x56\xbe\x99\xe5\x6c\xf7\xab\xec\xe7\xa6\x70\xce\x98\xa3\x9a\xe6\x9a\x25\x7f\x86\xfc\x35\x88\x83\x2f\x7c\x0b\x34\x9f\x32\xb1\xb3\x0a\xed\x16\x6d\x1f\xd1\x0b\x08\x9e\x1b\x19\x2f\xcf\x66\x1f\x2b\x8d\xbf\x74\x59\x36\x85\x4d\x8c\xa6\xfc\x26\x22\x2e\x88\x0b\x90\x94\xf8\xc7\x73\x28\x23\x9e\xe2\x31\x13\x60\x76\xbc\xeb\xfa\xb0\x11\xf5\x4c\xc8\x37\x8d\x8b\xf7\x92\xf6\xc8\x05\x36\x74\x4a\x15\xf7\xdc\x44\x3e\x43\xed\x59\x41\x1c\xa2\xdb\x87\xef\xdf\x53\x21\xa0\x17\xfa\x24\x09\x60\x7d\x79\xaa\xd0\xfa\x90\x0e\xd5\xc5\x41\xae\x9c\xf6\x06\xe9\x39\x6c\xf2\x4a\xe5\x0b\x77\xe3\xfb\xbc\xee\x64\x7d\xbf\xd6\x9e\x6b\x81\x18\x3a\x88\x83\x4b\x20\x82\xb9\xe4\xd2\xd1\x13\x91\x0b\x93\x17\xec\xba\x31\x3a\xc2\x63\xa2\x7c\xaf\x2b\xe6\x17\x71\x39\xa7\xe3\xa7\x96\x45\x75\xfb\xbf\x82\x0e\x8d\x00\x38\xa4\x7a\x9c\xc1\x43\xfc\xbc\x75\xcc\x78\xdd\x70\xd4\x88\x69\xb6\x6e\xca\xe5\xc9\x0e\x23\xe7\x87\x1d\x19\x73\x11\xc1\x26\xc9\xbb\xe1\x9a\xd0\xef\x05\x70\x70\x09\xc8\xa1\x16\xb1\x0e\xab\xdb\xac\x05\xd7\x3d\x6c\x25\xcf\xbe\xa8\xe0\x52\xad\xc7\x2e\xfd\xf4\xfb\x06\x7e\x3d\x01\xdd\x67\x4d\xaf\x74\xe8\xe4\x04\x80\x83\x4b\xc0\xa8\x38\xfe\x75\xbd\xa4\xf7\x0a\x6f\xfb\x25\xfd\x25\x7b\xfb\xa3\x6b\x9b\x6b\xc5\x56\x11\x86\x4a\x7a\xe8\x7b\x9b\xa9\xf1\xda\x92\x08\x09\x80\x38\xa8\xe1\x8b\xca\x5f\x25\x00\x9a\x5c\x4f\x6c\xf6\x31\xcb\x4c\x10\x92\xf4\xe6\x4d\xb9\x9f\x9e\x74\x84\xd6\xab\xb2\x9f\x2c\xbb\xd8\xc3\x1f\x83\xf8\x30\xd1\xbc\x16\xfd\xd5\x1b\xa1\x2b\x4f\x40\x1c\x5c\x02\x3e\x87\x77\x85\x86\x19\x3f\x4e\x3b\x18\xa4\xac\x54\x3c\x91\x2f\x10\x91\x9b\x88\x40\xc7\xf1\x79\xbe\x16\x68\x8f\x6e\xa1\xd7\x0c\x25\x5a\x41\x1c\x5c\x02\x3e\xfa\xc2\xd9\xe4\xa2\x3f\x78\x38\xe5\x62\xa7\xbf\x13\xa7\x12\xbf\xff\xcc\x94\xab\x9e\x88\xdd\xb3\x15\x79\xec\x28\xc5\x4d\x0d\xfd\xab\x40\x1c\x5c\x02\xc9\xef\x65\xed\xba\xd7\x7f\xda\xc8\x77\x67\x3f\xf0\x7a\xbb\xf0\x33\x29\xd1\xfc\xd6\x8d\xf7\xe7\xcf\xcf\x9d\x49\xd8\x96\x48\xef\x80\x5e\x05\x10\x07\x97\xc0\x5a\x6e\x85\x6d\x6c\xbf\x3a\x31\xa5\xf0\xa2\xfc\xb8\x2f\x2d\xbb\x30\x5e\x30\x77\x91\x21\x8e\xc8\x8e\x9b\x8a\x67\xfe\x72\xcc\x4d\xc4\xf6\x17\xc4\x41\x8d\x1e\x00\xa9\x10\xd0\x4a\x77\x92\x06\x66\x63\x05\x42\xcb\x26\xfd\xbb\x9f\xaa\x37\x5e\x45\x57\xdd\x53\x8d\x38\xbf\xd8\x4e\x8a\xc2\xb4\xfd\xc5\x81\x99\xc0\xb0\x8f\xbc\x17\xfa\xf8\x0a\xe0\xe0\x1a\x98\xea\x9c\x55\xbc\xdf\xa4\xa0\xab\x64\x56\x3d\xdc\xe8\xf4\x38\xe6\x13\x4a\xe2\x79\x5b\x27\xdc\x3d\x76\x41\xc7\x7b\x62\xcf\xee\x41\xfd\xa4\x40\x1c\x5c\x03\xed\x38\x46\x47\xf1\xf3\xe3\x68\xab\x13\x97\x1e\xfa\x69\x2e\x1b\x14\xca\x92\xbe\x1f\x15\xd7\x78\x7b\x2f\x59\xe2\xe8\x5b\x0e\x21\x54\xe7\x03\xe2\xe0\x1a\xd0\x7e\x18\x9b\xf9\xf3\x13\x0e\x53\x04\x6f\x2a\x87\x32\x23\x3b\x79\xf1\x4b\x42\x79\x3a\xf4\x42\xfe\xf2\xa2\xa2\x26\xf9\x5e\x32\x5e\x44\x5c\x10\x07\xd7\x80\xea\x0d\x9e\x90\xe8\xa9\xa9\xdf\x18\x6f\xd0\x7c\xc5\x5f\xb8\x08\x9e\x1d\xfc\x2c\x7b\x6f\x70\xb9\x45\x46\xbd\x5a\x42\xb0\x44\x70\x02\xba\xfb\x16\xc0\x41\x8d\x1e\xb4\xfe\xae\x01\xd0\xb6\xe3\x24\x0d\x24\x45\xd7\xdf\x95\x13\x72\x37\xf2\x89\x68\x42\xc9\xdd\xf9\x20\xde\xf4\xce\xeb\x15\xfb\x5e\x79\x54\xa3\xdd\xee\x59\x4e\x99\x69\x6a\xa8\xd1\x09\x80\x43\x6a\xd6\xfe\x95\xab\xa0\xb3\xd0\x86\x90\x4b\x0e\x6f\x32\x33\x2b\xfd\xcb\xc0\x7d\x9c\x49\xa7\x88\xb3\x8e\x9c\x41\x0e\x45\x85\x42\x41\x90\xad\x04\x71\x70\x0d\x94\x8c\x98\xa5\x5d\xc7\xd9\xc4\xe6\x64\x2d\xb3\x2c\x19\xb7\xdb\x7a\x8b\xf2\xb2\x9d\x26\x6e\xa3\xfe\xe1\x0c\x46\x66\x83\xfd\x1b\xa8\x09\x3c\x88\x83\x6b\x80\x2b\xf2\xb2\xb3\xe0\xbe\xc6\xbc\x3e\xc1\x4a\x83\x2f\xb5\x8b\x2a\x85\x6b\x5f\x41\xda\xcd\x74\x2a\x4b\x22\x9d\xef\x33\xf6\xed\x50\x07\x70\x10\x07\xd7\x40\x74\xcd\x27\x3d\xed\x71\xf1\xc8\xcb\x53\x3f\x06\xac\xba\x6a\x7f\xe7\x76\x54\x93\xba\x27\xa7\x5f\x93\xd8\x9d\xfe\x92\x99\x24\x9f\x87\xd0\x00\x88\x83\xe6\x81\xff\x57\x2a\xc4\xf0\x7f\xb3\x50\x27\xdb\x60\x33\x03\x9b\x03\xa7\xac\x1c\xd5\xd0\xc2\x4e\x4a\x33\x8e\x7a\x5a\x6b\xd2\x4e\x0e\xfd\x70\x2e\x9b\x28\xbb\xf6\x9a\xa0\xa5\xca\x2e\x84\xa5\x04\x71\xc8\x36\x58\x7f\xfb\x58\x3e\x24\x49\x0b\xdf\x69\x33\x6c\xdd\x2d\x30\x27\x59\xfe\xec\x53\x86\xda\x1e\x3e\xfa\xb3\x4c\x39\xad\x1b\xb6\x55\x45\x88\xc8\x20\x0e\xd9\x06\x8b\x49\xb8\x56\x5e\xb3\xa1\x66\xb1\xa4\x1d\x3f\x1a\x48\xa9\x09\x62\x7d\x80\xce\x74\xdb\xf1\xa0\x6a\x51\xdc\xe1\xf7\x15\x4e\x2a\x52\x44\x64\x10\x17\x20\x8d\x03\x7b\x1a\x7d\xdb\x07\x1f\xb7\xf3\x6f\x88\x95\x5f\x9a\x17\x21\x38\xab\x3e\x4d\x59\x24\xc1\x37\xef\x56\x74\xfe\xb5\x28\xe9\xe5\xc3\xda\x2a\x6a\x44\xed\x08\x88\xfb\x6f\x64\x5f\xbf\x1b\x65\x08\xdf\xec\xf2\x2c\x83\x6e\xa7\xe8\x4a\x5a\x6b\x31\xad\x9a\x5b\x89\xf8\xa8\x82\x82\xc6\xcc\x34\xe5\x8d\x16\x36\x7d\x71\x7d\x61\xf3\xaa\xb0\x3f\x7d\xf3\x59\xc6\xc4\x2a\x8b\xea\xca\xce\x5f\xa9\x4f\xda\x9c\xb8\x09\xa9\x26\x58\xcb\x1a\x37\x2e\x39\xd1\x17\xe9\xd6\x17\x69\x5e\xb9\x5e\xf7\x07\x3a\xce\xb2\xd8\x38\x7a\xbe\xd9\xdd\xa5\x11\x2d\xc3\xec\x8e\xd7\x58\xf4\x15\x3a\x12\xf6\x3b\x81\x12\xfc\x8b\xd8\xb6\x5e\x2a\xf4\xd7\xfe\x6d\xbe\x19\x34\xb4\x3f\x7c\x73\x3d\x92\x6f\x26\x3d\xbe\x45\xbc\x7c\x44\x34\x19\x57\x7e\xf3\xea\xd9\xfb\x38\x0c\x0f\x85\xfa\x66\xa8\xf5\x53\x82\x1a\xbc\xb5\x47\xfa\xb6\x3f\x7d\x3b\x0d\xdf\x2c\x81\xe4\x9b\x29\xc8\x86\xb7\x94\xdc\x95\x98\xf9\xdc\xa9\xbe\xf5\x5c\xf5\x59\xe6\x7b\x57\x36\x47\xe3\x10\xf2\x24\x6a\x8c\x79\xf6\xc5\x83\xb1\x53\xf9\x96\x5f\x8f\xec\x9b\x99\xb5\xc5\x8c\x71\x99\xed\xf2\x3c\x2b\xf2\x18\x0a\xe3\xd4\xf4\x56\x19\x1e\xbf\x37\xfa\xce\x27\xf3\xa3\x75\x4c\x6c\xc6\xbc\xc6\xf4\x54\x8e\x10\x20\xfb\x66\x7f\xb3\x2e\xb5\xa0\x77\x93\xdd\xf7\x38\x99\xc4\x6d\x1a\xfb\x9e\xb1\xf7\x5a\xab\x89\x68\x7a\x48\x8b\xb8\xe3\x17\xf7\x9d\xe9\x33\x3c\x95\xd1\x22\xfb\xe6\xd4\x5d\x4b\xfb\x79\xcb\x15\x01\xdc\xf7\x9d\x1d\xad\x9f\xd9\xb7\x3f\xa4\xe9\xdc\x99\xe2\x5e\x6b\xd2\x8f\x79\x83\x11\xd2\xd6\x97\x7a\x6a\xbe\x19\xa4\xa1\x93\x56\xca\xf3\xc6\x95\x36\xfe\xbd\x0c\x1f\xf1\xaa\xc6\x0a\x1f\x66\xa9\x56\x4d\x94\x7c\xe4\xc1\x8a\xc3\x51\xcd\x26\x3c\x4f\x75\x37\xb3\x07\x6a\x61\x06\xe2\xe0\x2b\xa5\x9f\x0a\x59\xcd\x93\x97\xe7\x39\x2a\x9f\xa9\x39\x9f\x6d\x08\xb4\xe6\x23\xdc\xe5\x43\x4f\x6a\x8e\x38\x6a\xdb\x8f\x15\x39\x50\x2b\x40\xc4\x05\x71\xf0\x95\xb2\xf7\x01\x6e\xff\xa8\x4e\xfd\x82\xb4\x7d\xdb\xc1\x0d\xa5\x6f\x03\xf3\x3e\xab\x54\x17\xef\x7b\x70\x53\x75\xac\x4a\x5a\xed\x6f\x57\x20\xe2\x82\x38\xf8\x4a\x59\x9d\xd6\x69\x5c\x6f\xf0\xb5\x8d\xa8\xfb\xd2\xd0\x58\x85\xe0\xcd\xe2\xa7\xb1\x22\x94\x2a\x82\x67\xdc\xfa\x6b\x39\x47\x34\x2d\x17\xa0\x44\x34\x80\x0b\x90\xfc\x67\x4f\xec\x1d\x6f\xf7\x81\xf1\xf0\x29\x5c\xdd\xce\x1d\x76\x53\xaa\x80\x6e\x5d\x55\x14\xe2\x80\xa3\x4b\x7d\x95\xe5\xb2\xe8\x87\x67\xee\xab\x22\x4c\x13\x88\x43\x34\x5d\xa8\xff\xbb\x6f\x06\xbd\xd0\x27\x49\xa0\x86\x3e\x2d\x2d\xff\xd9\x03\xed\xa3\x0f\x78\x92\x8d\x67\x48\x5f\xf5\x51\x08\xf8\xd5\xe6\xb7\x56\x7a\xdc\xcb\x39\xcf\xd5\x29\x07\x5d\x1a\x0d\xe2\xe0\x12\x90\xe2\xbb\xac\x87\xdf\xf3\x31\xe0\x13\xe6\x40\x03\x5b\xc4\x01\x4b\x2b\x26\xd7\xfe\xdd\xc4\x0d\xe1\xb8\x50\x54\x1d\xb2\xe3\xff\xbb\x7b\x10\xc4\x21\x5d\x45\x8c\x35\xf8\x4b\xf1\x5b\xbf\x75\xc2\x37\x52\xd4\xa1\x22\xeb\x37\xfb\x2e\x23\xd9\xd1\x25\x9e\x4e\xd6\xd1\x4f\x9b\x6f\xb6\x74\x40\xf5\x36\x20\x0e\x2e\x81\x15\xae\x5e\x54\x86\xa8\x5b\x07\xe4\xd4\x53\x91\x18\x3f\x38\xef\x0a\xb6\xbf\x48\xf1\xb2\x7f\x76\x48\x92\xff\xc0\xa9\x34\xac\x18\x3a\xc5\x0e\xe2\xe0\x12\x70\xee\x11\xbe\x14\x23\x93\xab\x28\x66\x30\xc0\x1c\xda\xaf\xc7\x44\x7d\xee\xcd\x90\x6a\x50\xa5\x8b\x6c\x2c\xe6\x9b\x21\xac\xfd\x34\x84\x04\x40\x1c\xd4\x77\xe3\xef\xbe\x19\x34\xb9\x9e\x24\x81\x62\x07\x79\xe6\x0f\x72\xad\x19\x8e\x31\x76\x1f\x1a\x5b\x9c\x58\x7b\x9e\x96\x0b\xc4\xfa\x93\xb2\x6a\x93\x0d\x3d\x55\x5d\x39\x6e\x86\x7a\x18\x00\x38\xb8\x04\x1c\x46\x6f\xe1\x59\xd6\xc4\x59\x3e\xde\xa8\x68\x4b\x6f\xff\x9d\x5f\x91\x53\x9f\xb0\xe9\x79\xff\xf0\xfd\xac\x6b\x34\xb1\x9e\xee\x1c\x22\x2e\x88\x83\x4b\x40\x51\x8b\xb2\xbb\xfc\xad\x29\x19\x7f\xeb\xa0\xe3\x79\x1a\xcc\x30\xf2\x34\xb7\x59\xc1\x87\xbc\xb1\x82\xb7\x95\x95\x1e\x18\x37\x43\x47\x1e\x40\x1c\x5c\x02\xd6\x29\x38\x3e\xbc\xdd\x95\x9b\x9a\x2b\xbb\xca\x6d\x97\xaa\x37\x84\xc4\x54\x65\xe9\x44\xa2\xdc\x88\x97\x63\xc4\x55\xa6\x7d\x22\x11\x71\x41\x1c\x5c\x02\x77\xb8\x92\x03\x7e\x46\xde\x7a\x3d\xfc\x85\x25\x4b\xdc\x73\x72\x30\x55\x7d\xc5\x5c\x51\xd6\x31\xa0\x80\x4f\x6f\x58\xd6\x81\x97\x0d\xb1\x5f\x06\x71\x50\xbd\x3d\xc0\x37\x83\x56\xba\x93\x34\xa0\x67\x74\xee\x39\x9d\x51\x78\xd7\xd8\x1d\x5a\x57\x99\x31\x7d\x91\x37\xc5\x1e\x03\x1b\xda\x82\x3d\xdf\x2f\x3c\x47\x91\xfe\xcd\x0e\xdd\x42\x04\xe2\x90\x0e\x93\x19\x34\x06\x3f\xe2\x71\x4a\x31\x88\xd9\x79\x86\xb1\x55\x19\xe2\xad\x10\x29\x9c\x8e\x9d\x89\x76\x51\x92\xd5\xaf\xb2\xc6\x8c\x1c\x3a\x4c\x06\xe0\xe0\x1a\xf8\xa6\xa1\x3e\xb0\x19\xd8\x43\xc5\xa1\xe8\xf8\x76\x34\xf7\xd3\x60\x56\x2d\xfb\x05\xb7\xf8\xd8\x5c\x0b\x0b\xbe\xdf\xa9\x02\x59\xd0\xcd\x36\x20\x0e\xae\x81\x65\x69\xa2\x69\xc3\xba\x63\xf6\x8a\x8c\x8b\x3a\x42\x6b\x31\x0f\xf1\xcb\xe6\x22\x1c\x83\xdc\xf3\x16\x47\x4a\x37\x3a\xf4\xc2\xbd\x10\x71\x41\x1c\x5c\x03\x38\xfa\x43\x87\x79\x95\x32\x17\x2e\x3c\xa6\xd8\x5b\x69\x5e\x6b\x3a\xf3\xd2\xfb\xfe\x35\xf9\xfb\x61\xfc\x25\x72\x3f\x7e\xbe\x7f\x78\x0f\xba\xdd\x08\xc0\x41\xf5\xf6\x00\xdf\x0c\xda\x76\x9c\xa4\x01\x31\xb3\xdf\xdb\x4b\xe2\x28\xe1\x6d\x7e\x87\x0f\xc8\x79\xcf\x1e\x99\x88\xa8\x4f\xab\x98\xed\xbe\xa4\x59\x7e\xe6\xb0\xb4\x35\xa6\x82\x18\x3b\x88\x83\x6b\x40\xa6\x20\x1a\xbd\x69\xeb\xfe\x33\xfc\x62\xa7\xa9\x63\xbe\x6a\x17\xf3\x7b\xaf\xe8\xbc\x29\x06\xcf\x50\x58\x0d\x50\x0e\xf1\x38\x41\x8d\x98\x41\x1c\x5c\x03\x09\xd1\xd1\x63\xd5\xde\xce\xe7\xd8\x8e\x43\x52\xee\x39\x59\xd4\xa4\x31\x2e\xb2\xde\xef\x79\x41\x84\x46\xd0\x58\xdc\xc9\x26\xaf\x01\x15\x5d\x01\x38\xb8\x06\xf4\x12\x78\xd9\x6e\xf9\x08\xd5\xaf\x33\x0e\x62\x2d\x68\x33\x73\x39\x7f\x65\xc3\x50\x25\xeb\x2a\x66\x71\x3a\xdc\x2c\xd2\x25\x85\x7e\x2f\x88\x83\x6b\x00\x33\xf8\xcd\xb0\x9c\x69\xc9\x56\xac\x0f\x33\x6d\xa5\x6d\x59\xe2\xbe\xd2\xe3\xdc\xe8\xcb\x45\x4f\x2b\x1a\xe2\x78\x94\xec\x51\xa1\x62\x2e\x10\x07\xcd\x03\x00\xdf\x0c\xb2\x50\x27\xfb\x66\x6f\x69\x63\xc7\x67\xd5\x89\xba\x3f\xd2\x0b\xd4\xca\x7f\x3a\x6e\x3d\xd2\xe1\xcb\x9c\x92\x0b\xe9\x26\x71\x98\xfb\x70\x77\x64\xc1\x1c\xe1\x41\x41\x1c\xb2\x6f\xbe\x5a\xfc\xbd\x54\xc0\x36\xf0\xf0\xdb\x3a\xed\xa1\x8b\x52\x4a\xff\x45\xb9\x57\xca\xf8\xd2\xf8\x1a\x36\x2f\xf5\x76\x68\xd5\x48\x46\x11\x91\x41\x1c\xb2\x6f\xb6\xf3\x57\xd5\xc5\x5d\xc7\x35\xc2\x60\xf3\x95\x6e\x71\xa5\xb9\xbb\xc2\x7b\xc5\xab\xcf\x72\x3e\x3b\xd1\xee\xbc\x0d\x96\x84\x92\x1b\x22\x32\x88\x0b\x90\x26\x84\x3d\x8d\x17\x43\x4b\x85\x02\x0b\x9a\x65\x14\xf7\x72\xf1\x55\x94\x3a\x12\xbc\x9e\x4d\x15\x88\x7a\xd9\x6c\x27\x31\x52\x14\x69\x93\xbf\x51\x45\xf8\x66\x10\xf7\xdf\xd2\x80\x3f\x7d\xb3\xa5\xc7\x5e\x30\x6b\x13\x9a\xdd\x10\x5f\xa9\xac\x54\xb9\x3c\xea\xf7\xb3\x3c\xd2\xdb\x97\x5e\xa1\xf6\x0e\xdd\x6e\xbc\x7a\x3b\xc4\xef\x4f\xdf\xdc\xd9\xcd\xf2\x44\x61\xb4\x92\x57\xe1\xd6\x93\xb9\xfb\x6f\x89\x3d\x63\x14\x49\x92\x71\x14\x0a\xf3\x9c\xe3\xd8\x0d\x5c\xa7\x0d\x15\xff\x40\x0f\xa4\x08\x36\xda\xe9\x8e\xcb\x71\xe4\x9d\xb2\x24\xf2\x7f\xb4\x78\x9b\xc8\x19\x34\x97\x25\x44\x05\x6f\xde\xb8\xe2\x12\x9b\x2c\xfc\x6f\xf3\xcd\xa0\xa1\xfd\xe1\x9b\x51\xa4\xe0\xe6\xea\xdc\xa2\x98\x40\xbc\x0d\xab\x9c\x30\x6d\x94\xe2\x40\x01\xd6\x17\x79\xb2\xfd\x84\xfb\x84\xc6\x2d\xef\x4c\xfc\x1b\x48\xc9\x6c\x55\x4f\xc3\x37\xfb\x22\xf9\xe6\x9a\xc1\xee\xe9\xa8\x1d\x4e\x91\x1e\xe7\x24\x63\x9f\xf1\x50\xd7\xd6\xbe\x39\x5a\x1a\xca\x62\x65\x97\xf7\xe9\xa4\xca\x47\x9f\x50\x4f\xe5\xc3\xef\x75\x24\x27\x29\xc8\xf3\xd5\xbb\x71\x2e\x7d\x0b\x83\xc7\x3c\xda\x2c\xff\x77\x77\xec\xef\x58\x4e\xe7\x46\x69\xbf\x52\xd5\xd9\x6b\x3a\xce\xe4\x4f\x4e\xe5\xc3\x2f\xb2\x6f\x56\x31\xc2\xfd\x71\xd4\xfd\xf3\xa5\x9a\x4e\x43\x47\x03\x4b\x84\xd5\xcc\x9d\x35\x0d\xe7\x08\xa7\x9d\x4b\xdb\x85\xae\x03\x62\xfc\x4a\xa7\x32\x5a\x67\xe4\x7b\x68\xe3\x89\xb6\xe3\xcd\x9c\x8e\x36\x48\xbe\x7d\x5d\x55\x4a\x8a\x7f\x86\xbf\x9e\x67\x60\x6b\x70\x27\x33\xf4\x91\xc6\xd1\xdc\xca\xd6\xa9\xf9\x66\x90\x86\x4e\x5a\x29\x43\xa9\xca\x44\x64\x7a\xc8\x88\xc4\xa3\xad\x07\x1a\x54\xe8\xc9\xa7\x26\xee\xf5\x94\x19\x73\x17\xf9\xe3\x69\x19\xb9\xdf\xbc\x16\x82\x58\x21\x40\x1c\x7c\xa5\xa4\xf5\xe1\x25\xf2\x4d\xda\xc7\xdb\xb4\xbe\x53\xfe\xea\x55\xd2\xd8\x62\x62\xcc\xdb\xcc\x76\xea\x14\xa1\xe3\x6f\xcb\x21\x1e\xef\xdd\xa1\x43\xac\x00\x0e\xbe\x52\x46\xb7\xcc\xcf\xa5\x77\x4b\x6c\xde\x9e\x2e\x73\x0d\xc5\x6b\x19\xb9\xcf\x4a\xc1\xaf\x40\x92\xd4\x6f\xe9\x4d\x8e\x71\x01\x2d\x14\xda\x89\x83\x38\xf8\x4a\x39\x7e\x65\xcb\x04\x97\xe1\x2b\xf1\x02\xe1\x42\x42\xb8\x8d\x61\xa4\x4f\x78\xe9\xbb\x55\xc5\xbb\x8b\xb6\x4b\x2b\x72\x6b\x1c\x77\xa0\x36\xd5\x20\x2e\x40\xf2\x9f\x9d\x6e\xba\xb9\x99\x0a\xdf\x99\xa8\x32\x8a\x92\xe7\x54\xec\x7b\x3e\x2b\xda\x53\xa1\x68\xea\x0f\x17\x7d\xbb\xd8\xc0\x36\xb8\xc4\x1d\x51\x86\x30\x4d\x20\x0e\x6a\x7e\x20\xf5\xd7\xcd\x12\xe8\x85\x3e\x49\x02\x0b\x33\x56\x58\x4e\xe4\xa8\xc7\x58\x0c\x91\x02\x6d\xfd\x7d\x51\xb2\x43\xb5\x46\xbf\x46\x4c\xea\xc7\x77\x33\xd2\x23\x36\x68\xde\x42\x9f\xda\x01\x1c\x5c\x02\x41\x23\x9e\x31\xba\x14\xd6\xbf\x05\x05\xb7\x9e\xa0\x5f\xb2\xd5\x9f\x22\x18\xd1\x17\xac\x25\xb5\xe5\x0b\xc4\x7b\x3f\x6f\x58\x0b\x35\x55\x00\x71\x48\x0d\x9f\x7e\x4c\x10\x99\x7a\x7e\xd6\xb4\xe9\xa3\x6a\x54\xc2\x7c\x92\xfa\x3e\x36\xed\xf1\x65\x03\x74\x79\x71\xfb\x6f\x3c\x58\xae\x73\xd3\x88\xb8\x20\x0e\x2e\x81\xab\xea\x4e\x8c\x9f\x0f\xa9\xb1\x3c\x55\x72\x6e\xec\x95\xe5\x88\x32\x08\x5a\x24\x15\x98\x3c\xbc\x81\x12\xb4\xbe\xa3\x9a\xc1\xe9\x8b\x88\x0b\xe2\xe0\x12\x78\xcf\xf4\x39\x3e\xb1\x86\xea\xc2\x07\x12\xd2\x64\xfb\xb0\xae\x82\x0a\x6e\xab\x44\xe1\x6a\x86\x80\x61\xa1\x52\x51\x06\xa3\xd6\x7d\x84\x04\x40\x1c\xd4\xfc\xe0\xef\xbe\x19\x34\xb9\x9e\x24\x81\xdf\xb8\xaf\x2f\x75\x3b\x94\x17\xd2\x38\xae\xad\x11\x58\xda\x70\xae\x5d\x20\xe0\xbe\x59\xe6\xdd\x1a\x3c\x35\x6c\xfc\xc4\x82\x05\x6a\x52\x00\xe2\xe0\x12\x60\x6b\xc1\xbc\x62\x7c\x06\x8f\x94\x2d\x24\x82\x5c\x90\x30\x15\xeb\x75\xa3\x92\xfa\xcb\xab\xd5\x6a\x7e\x94\x03\x92\xec\xd7\x82\x5b\x11\x71\x41\x1c\x5c\x02\xc4\xbd\x4b\xb7\x14\xc2\x3e\x1a\x9a\x12\x7e\x29\xec\xc3\x64\x33\x19\x79\xbb\xe4\xde\x80\xd1\xc5\x1d\xcc\x65\x2c\xfd\x9a\xdd\x18\x0d\x11\x17\xc4\x21\xed\x97\x65\xdd\x34\xef\x1c\xeb\x63\x34\xae\x51\x3b\xda\x5b\xe4\xdc\xbb\x30\xa3\xf2\x80\x0c\xeb\xb5\xa1\x74\x7a\x79\x99\x09\x86\xc3\x0d\x68\xbf\x0c\xe0\xe0\x12\x30\x20\x45\x25\x2c\x6d\xc3\x1d\x29\x78\xce\x9b\x20\x51\xe2\x79\x51\x65\x13\x53\x10\x67\x6d\x9a\x09\x6b\xc0\x32\x30\xed\x73\xc9\x59\xc4\x7e\x19\xc4\x41\x45\xcf\xd7\xff\xee\x99\x40\x2b\xdd\x49\x1a\x08\x89\xd2\xf9\x7c\xed\xb0\x50\x8d\xc4\x71\xfa\x66\xf2\x0d\x13\xa6\xa6\x7e\x2e\x32\x45\xb7\xcf\x39\xe6\x96\x11\x25\xdd\x06\xc3\xd2\x88\xb1\x83\x38\xa4\x63\xd7\xd3\x92\x93\x51\x1f\xd9\x5f\x4c\x7b\x9d\xcd\x54\x2e\xd0\xfa\xfe\x7a\x59\x95\x22\xeb\x09\xb5\xb0\xcb\xd6\x8f\x61\xa5\x8d\x5c\xe8\x28\x2f\x88\x83\x6b\xa0\x89\x3a\x6e\x72\x93\x85\x7a\x94\xf3\xc3\x07\x11\x03\xce\xe8\x0a\x4c\x0d\x1d\x19\xf7\xb7\x3c\x78\x43\x4e\x5f\xd3\x7e\x91\xc4\x49\x40\xed\x6a\x00\x1c\x5c\x03\x25\x9b\xc2\x36\x5b\x62\xa5\xf9\xcf\x57\x72\x7e\x75\x78\xf7\x85\x7e\xcf\xa6\xb0\x7c\xa4\x25\x8c\x2b\x2f\xe3\xe1\xa3\xb1\x76\x08\x1d\x93\x01\x71\x70\x0d\xec\x92\x5d\x7d\x5f\x4f\x7b\xfe\x7e\xd6\x8d\xd5\x71\x29\x07\xa6\x1a\x82\x0a\xb6\x8a\xf4\x9c\x1f\x3c\x25\x19\xfe\x89\x8f\x7f\x2c\xb2\x22\x34\x00\xe2\xa0\xa2\x67\x80\x6f\x06\x6d\x3b\x4e\xd2\x80\x5b\xd4\x45\x4d\xcf\x6e\x09\x1f\x0f\x61\x26\xae\x38\x0d\x21\x16\x96\x47\x3b\x7e\xc7\xd5\x73\xdd\xb2\x72\x72\xb9\xd6\x9c\xdc\x50\xde\x08\xc4\xc1\x35\xd0\x79\x25\xc0\x70\xe3\x02\x7e\xf3\x4c\xed\x83\xcc\x6f\x3d\xe6\xb8\xbc\x61\x5e\x65\x4d\x33\x45\xc4\x6f\xdc\xaf\x0e\xb8\x7d\xad\x8e\x80\x0a\xea\x01\x1c\x5c\x03\xaf\x98\xd1\x1b\xa7\xd9\x9f\xd0\xca\x31\x7c\x5a\xa7\x11\xfe\xb2\x66\x3a\x14\xbc\x3e\x22\x15\xe1\xbc\x7c\xe1\x4b\xdf\x2b\xec\x34\xe8\x52\x1c\x10\x07\xd7\x80\x4c\x29\x8e\x5e\x55\x3b\xc7\x28\xff\x66\x74\x31\xa7\x00\xf1\xd4\xf0\xb3\x1e\xe6\x20\x46\xef\x9c\x73\x95\x1f\x59\x93\xa4\x7f\x05\x42\x3e\x1f\xc0\xc1\x35\xd0\xba\x81\x2f\x31\x86\x7e\x70\x96\x68\x8f\x83\xd8\x35\x28\x31\xfe\x3c\xd7\x0d\x97\xa9\xb0\xda\xd6\x70\xbd\xf1\x89\xef\x67\xbb\xdb\x10\x1a\x00\x71\xd0\x3c\xe0\xfc\x77\xdf\x0c\xb2\x50\x27\xfb\x66\xe3\xf4\x1f\x65\x58\xeb\xb4\x93\x43\x51\x44\xd1\x69\x17\x3d\xee\x2b\x99\x30\x59\xe9\x91\x3f\x9b\x5c\x72\xa7\x60\x16\xbe\xa6\xf6\x06\xe1\x41\x41\x1c\xb2\x6f\x2e\x29\x6b\x88\xd7\xe5\x97\x77\xba\xd5\x65\x58\xe9\x60\x91\x75\xf8\x42\xe9\x72\xff\x41\xca\x1d\x4c\xfc\x33\x28\x49\x7c\xb8\xf2\x81\x88\xc8\x20\x0e\xd9\x37\xeb\xbe\x6b\x35\x88\x3e\x77\xd3\x8c\xa7\x45\x78\x69\x2e\x6d\x18\xcd\xea\xd8\x9d\x03\xf7\xdc\xb8\x16\xb7\x28\x7d\xe3\x81\x67\x29\x39\x22\x32\x88\x0b\x90\x96\x80\x3d\x0d\xfd\xdd\x8a\xb7\x4f\x6a\x9e\xdd\xf9\x92\x67\xe6\x69\xb4\xab\xf1\x0b\x27\xcd\x5e\x6a\xef\xbc\xfe\x20\xf9\xb6\x35\x49\xf8\xde\x53\x7b\x84\x6f\x06\x71\xff\xbd\xb6\xe2\x4f\xdf\x9c\x8c\xe6\x79\xa0\x8a\x26\xfa\x16\xfb\xdc\x7b\x45\x1f\xec\x7c\x8b\x47\x05\xc2\xdf\xae\x99\xfa\x39\xc8\xe6\x17\x37\x5f\xb1\xac\xf8\xc7\x6d\xa0\x12\xb6\x6e\x12\xc9\x0b\x1f\x98\x52\x39\x55\xd5\xc8\x16\x79\x94\xcf\xc9\xe9\xf9\xe2\xee\x3b\x0d\x7d\x65\x73\x16\x8a\x63\xee\x3c\xfe\x03\xbd\x19\x4a\x92\xa4\xc0\xe1\xdd\x8b\x9b\x51\xb8\xf7\xe4\x1a\x56\xa3\xc5\xea\xd5\x3e\xc9\xee\x2d\xb4\xb5\xea\x8d\xe0\xab\x1e\x7b\x83\xff\x36\xdf\x0c\x1a\xda\x1f\xbe\x59\x02\xc9\x37\xdf\xcc\x14\xdd\x4c\xf7\x8d\x59\x23\x10\x74\x14\xc5\x2c\x6a\x09\x0f\xea\x36\xe1\xf8\x3e\xf1\x62\x71\x27\x6f\x89\x99\x1b\x23\x51\xf1\x34\x7c\x73\x3d\x92\x6f\x8e\x70\xf4\xf1\x3a\x0a\xde\xe1\xbf\xe5\x7f\xaf\x3a\xd9\x28\xb0\x44\xea\x43\xf7\x13\x1b\x5b\xd1\x39\xf3\x57\xa5\x31\x14\xb7\x96\xca\x4e\xe5\xc3\x2f\xb2\x6f\xa6\x0e\x48\x63\x7d\xe5\xbd\x86\xeb\x64\xa3\xa2\xc8\xf6\x83\x68\x9f\x67\x39\x10\xeb\x57\x99\xf6\x0f\x2a\xcb\xf6\x9b\x32\x36\x55\x17\x4f\xe5\xc3\x2f\xb2\x6f\xf6\x33\x14\x10\x61\x4b\x79\x71\xbd\xb9\x8d\x13\xdb\x0d\x65\xbb\x9d\x49\x80\xe4\xa0\x85\x4e\x2b\xdb\x22\xe4\xbc\xf0\x17\xac\xf6\xaa\x53\x19\x2d\xb2\x6f\xf6\x8d\x4b\x47\x19\x51\xce\xae\xd4\xd7\xc6\xcd\x20\xcd\xf5\x5d\x2b\x79\x42\xcb\x17\x84\x2b\xc8\xe5\x8c\x7d\x30\xb8\xa3\x4e\xe9\x7f\x6a\xbe\x19\xa4\xa1\x93\x56\xca\x9f\x5f\xac\x78\x0f\xb2\x29\x48\xc5\xbc\xf0\x38\x35\xef\x24\xa0\x76\xc6\x92\xf4\x3c\xad\x7b\xfd\xcc\x4d\x5c\xfe\x0b\xa5\x30\x0b\xd4\xca\x05\xc4\xc1\x57\xca\x31\xa5\x96\xba\x3a\x93\x58\x14\xe9\x61\xc3\x8c\x2a\x32\xc9\x67\x9e\x4b\xc3\x42\x4b\x7a\x0d\x63\xea\x69\x29\xed\x5d\x2d\xc2\xd0\x7d\x9f\x20\x0e\xa9\xab\x6f\x83\x4b\x80\xef\xc0\xd8\x4c\x10\xed\x0d\xfe\x71\xde\xd1\x96\x14\xad\x62\x29\x6c\x7e\x3a\xc7\x0e\x57\x14\xef\x57\xb8\x9e\xd0\x2e\x0c\xc4\xc1\x57\xb4\xd7\xd6\x53\xab\x21\x85\x58\xa2\x77\xce\xae\x29\x2a\x77\xaf\xa1\x98\x0b\x47\xbd\x7b\xc9\x20\x3c\xbc\xf0\x8c\x6a\xd8\x02\x6b\xe7\x13\x22\x2e\x88\x43\xca\x4b\x98\x84\x62\x18\xf3\x97\xa4\x28\xb3\x93\xcc\x11\xbf\xdb\xcd\x60\x64\xb3\xcc\x30\xc2\x67\x68\xe4\x49\xbb\xfc\xed\x77\xdd\x37\x7b\x84\x69\x02\x71\x50\xc9\xfa\xdf\x7d\x33\xe8\x85\x3e\x49\x02\xf7\x3e\x5b\x66\xab\x4d\x75\x8c\x3a\xb5\x91\x5f\x94\x18\x3b\x77\x79\x93\xfd\x7b\xba\x4d\xf4\x13\x41\x76\xe1\x98\x18\xf7\x3e\x59\xc8\x37\x83\x38\xb8\x04\x3e\xd3\x9a\xed\xdb\x79\x12\x89\xb5\x15\x44\xdf\x17\x1c\xe4\xef\xbf\x4f\x2d\x72\xac\xd1\xa6\xac\x1e\x50\x95\x5c\x82\x99\xcd\xb9\x8d\x88\x0b\xe2\xe0\x12\xd0\x33\xa8\x8f\x67\x9d\xcf\x1b\x5e\xf4\x49\x75\x9b\xb2\xa3\x5f\x56\xbd\xfb\x81\x66\xe5\xc6\xdc\x9a\xd8\xf6\x83\x48\x85\x79\xfe\x25\xc8\xdc\x00\x38\x24\x09\xe0\x4e\xed\x91\x18\xaf\xc6\xce\xa6\xab\xe9\x72\x72\x61\x68\x4e\x3e\xd4\x5c\x89\x79\x38\x3c\xda\xab\x82\xa1\x13\x2a\x57\x31\x09\x49\x00\xc0\x21\x75\xe2\xf2\x89\x9a\x12\xb4\x72\x7e\xfa\x34\xff\xe0\xf8\xfd\xd5\x1e\x9a\xdf\x17\xb4\xdb\x5e\x9d\x1b\xbd\x30\x61\xb8\xfc\x0a\xaf\x56\x8b\x17\x21\x01\x10\x07\x95\xac\xff\xdd\x37\x83\x26\xd7\x13\xfb\xbb\x2f\x91\xb3\x0e\x9e\xed\xa8\xb3\x9e\xc7\x74\xaf\x5d\x9f\xce\x6a\x15\xd0\x63\x0a\x3b\x53\xe2\xa1\xb0\xee\x28\x4f\x36\xf4\xe2\x2c\xd4\xdf\x1d\xc0\x21\x5d\xf6\x42\xc4\x88\x7a\x66\x4a\xae\x41\xda\xb4\xf6\x0a\x9a\xab\xff\x5d\xef\x00\x54\x91\xb3\xfa\xb4\x02\x1f\x49\x36\xeb\x27\xc3\xb4\xea\x11\x71\x41\x1c\x5c\x02\xcf\x83\x9b\xec\x28\x2b\xa5\x3e\x74\x5d\x7e\xd0\x43\xe9\x65\xdd\x29\x66\xc1\xb7\xb8\x5c\x7f\x35\x2b\x76\x30\x4c\x80\xce\x8a\x09\x6a\x88\x01\xe2\xe0\x12\xc8\xbb\x2c\x44\xdd\x18\xac\x1d\x23\x39\x38\x6c\x36\x5f\xd7\xf5\x75\xc8\xd8\xd6\xba\xc3\x8c\xb0\x76\x73\x55\x8d\xea\x52\x6f\x6f\x2e\xf4\x1c\x00\x1c\xfc\xf9\xb2\x7d\xad\x7b\x19\xad\x46\xb1\x6f\x1f\xf0\x52\xe3\x8c\x93\xef\x80\xfa\xae\x86\x96\x5c\x8e\x1a\x83\xa9\x2b\xd7\xda\x7b\xb6\x2c\x3a\xa8\x59\x18\x80\x83\x4a\x55\x01\xbe\x19\xb4\xd2\x9d\xa4\x01\x32\xbc\x31\xe5\x5e\x0b\x16\xeb\xec\x37\x37\x88\x12\x48\x03\xa2\x58\x94\x14\x8e\x85\xf0\xe8\x7b\x0a\x05\xb3\xa6\xeb\x19\x54\xf1\x11\x63\x07\x71\x70\x0d\xbc\xa6\x8b\x17\x97\x18\x7f\x98\x96\xfd\x24\x53\xe9\xcb\xcc\x70\xd8\xc2\xb8\x71\xc6\xad\x97\x6f\xcd\xeb\xef\x91\xf7\x96\xe5\x5f\x65\x81\x5e\x2b\x00\x87\xd4\x34\xf0\x36\x65\x17\x3e\xee\xe6\xee\x55\x0e\xcd\xf3\x14\xa9\xec\x5e\x04\x3c\x86\xfe\xa9\x36\x4b\x8f\x63\x3f\xf4\xca\x5c\x3e\xa2\x86\x34\x00\xe2\xe0\x1a\x48\xd1\x92\x25\x62\xc4\x7f\x55\x47\xf8\xe0\xf6\xdb\x1c\x55\x3d\x5a\x56\xd4\xd8\x42\x1e\xea\x8b\x1f\x6c\x15\x12\xd0\x8f\x85\x99\xa1\xe6\x25\x20\x0e\xe9\xd2\x4b\xbb\x12\xac\x4a\xad\xac\xc1\x55\xda\xd2\x17\x34\xb5\x72\x17\x50\x2d\x54\x05\x8e\x6a\x2c\x42\x98\x7b\x9f\x86\xe8\xa2\xa0\x3b\x42\x77\x7d\x00\x38\xa8\x54\x15\xe0\x9b\x41\xdb\x8e\x93\x34\xf0\x23\x5d\xac\xa9\xf8\x5c\x5d\xc5\x4f\x43\xdf\x2b\xe5\x41\x7c\xf8\x74\x4b\x45\xf4\x67\x55\xa9\x73\xf5\xbd\x56\x71\xdf\x79\x07\x41\x17\x52\x82\x38\xb8\x06\x9e\x3e\xb8\x53\xbc\x39\xc7\x9a\x98\x2f\x28\x74\x3c\x72\xcd\xe3\xe9\x79\x37\x8d\x58\x71\xfe\x22\x95\x27\x3f\x67\xe2\x48\xb5\x38\xa1\x29\x1b\xc4\xc1\x35\xe0\x65\x16\x96\xc3\x66\x4a\x8b\x9a\xaa\x25\x8b\xb5\x72\xbd\x72\xe7\x91\x9c\x18\xba\xb5\x64\xe8\xb5\x8d\xdc\xaa\xbc\xf9\x7a\x85\x77\x88\xb8\x20\x0e\xae\x01\xf2\xcf\x39\x15\x68\x2f\x6d\xf0\x95\xef\x91\x37\xfd\x9a\x63\x22\x66\xc8\x79\x7d\xe5\x2e\x29\x33\xf6\x20\x56\x3e\x56\x8a\xd9\x3c\x74\xfb\x37\x88\x83\x3f\xdf\x61\x8d\xb7\x81\x5e\x3b\xc2\x01\x1e\xcf\xbd\x6c\xd6\x6d\xcc\xd0\x65\x2c\x2e\x1b\x6c\x34\x8b\xfa\x28\x48\x14\xf4\xc5\xb1\xa1\x5d\x41\x68\x00\xc4\x41\xf3\x00\xc0\x37\x83\x2c\xd4\xc9\xbe\xf9\x36\x99\x5d\x9a\x9b\xa2\x7f\x8d\xd0\x57\xa6\xe6\x8f\x99\xf1\x5a\x5f\xc3\x51\x70\xd5\x2a\x04\xa4\xbe\xd7\x8c\x31\x9d\x0d\x30\xc6\x47\x78\x50\x10\x87\xec\x9b\x87\x3f\xee\xf5\xab\x96\x95\x0d\x3f\x32\xbc\xb9\xce\xb2\x5d\x84\x6b\x3f\xf3\xa1\x51\x21\xf9\xe9\xcb\xc7\xde\x81\xdd\x8c\xc4\x21\x2a\x88\xc8\x20\x0e\xd9\x37\x37\x47\xda\xcc\xd4\x44\xd7\x51\x79\x7c\x3b\x14\xe6\xa6\x42\x97\x3a\x88\x9b\x0e\x46\x31\x12\x10\x0b\xfe\xa5\x87\xe2\x26\xea\xba\x8b\x88\x0c\xe2\x02\xa4\x51\x50\x61\xbe\x79\x40\xa7\x93\xfe\x5d\x38\x61\xda\xbe\x8c\x82\xf9\x7e\x98\x69\xaa\x9e\xaf\xcb\x9c\x59\xc8\xf5\x65\x03\xd6\xa8\x52\xfb\xab\x78\x90\x6f\x06\x70\xff\xf1\xcd\xbe\xff\x38\xa7\x8d\xb6\xe7\x51\xee\x94\xbe\xd5\xa3\xdf\x6f\xfb\x7c\x4e\x9b\x3a\xab\xea\x5e\x22\xc1\xb9\xe4\x62\x29\xaf\x0b\x9c\x6b\xf2\x09\xcf\xc9\xfe\xf1\xfd\x90\x63\x88\x48\x49\x61\xa9\x31\x50\xe1\xe2\x92\xd8\x66\xf8\x99\x17\xa4\xfb\x69\xeb\x13\x2a\xaa\xf2\xf2\x83\x63\x04\x54\x73\x7f\x9e\x95\xfd\xfd\x8c\xd1\x67\x32\x26\x21\x80\xdd\xad\x79\x4c\x4f\xd2\xe0\x05\x05\xe9\x4f\x31\x61\x53\xa2\x87\x95\xbf\x8d\x3a\xa2\x4a\x3b\x56\xff\x6d\xbe\x19\x34\xb4\x3f\xeb\x9b\x91\x7c\x33\x6a\xfc\x6f\xe1\x9a\xce\xa2\x73\x14\x54\x4e\x2f\xf2\x34\x3f\x27\x4b\xf5\x94\x6b\xc4\x7f\x4b\xcd\x6b\x12\x37\x7f\x45\x2d\xca\xe2\x70\x1a\xbe\x19\x45\x15\xfe\x57\xbb\x58\x72\x9f\x65\x7f\x2a\xa0\xcb\x15\x10\x23\x6b\xe1\x61\x0c\x4b\xf9\xe8\xe3\x75\x5d\x38\xda\x88\x68\x22\x93\xe0\x3c\x55\xe0\xbd\x53\xf9\xf0\x8b\xec\x9b\xb9\x79\x96\xf2\xbe\x05\x12\xaa\x14\xb5\x79\x14\x8a\x1e\xf7\xfa\x30\x97\x5a\x7a\xaf\x51\x0b\x0e\xbf\xe7\x45\x3d\x72\x7e\xfa\xa3\xfc\x54\x3e\xfc\x6a\x23\xfd\xd9\x8f\xba\xf7\x97\x35\xa7\x0f\xe6\x64\xa8\x0b\xd2\xbd\x9b\xcf\x06\xc7\x18\xcd\x0e\x27\x44\xe8\x76\x0c\xcb\x5f\xeb\x2b\x94\x52\x21\x3a\x95\xd1\x22\xfb\x66\x21\xd3\x9c\xd5\x97\x07\xae\x31\x1f\x0f\x84\xa9\xce\x4e\xd0\x50\x26\x70\xd3\xd3\xdd\xff\x74\xf3\x5c\xf5\xe1\xeb\x49\x7f\xe1\xe5\x53\xb8\x48\xe1\xf6\xff\xa6\xa1\x93\x56\xca\xd6\xf4\x68\xdb\xc4\x31\x7e\xb7\x75\x83\x6f\x4f\xd2\xb6\x48\x86\xf9\x6a\xc9\x0a\x19\x63\xee\xc8\xa2\x5f\xf2\x90\xd5\x77\x7e\x41\x85\x58\x21\x40\x1c\x7c\xa5\xfc\xc6\x20\x61\xb2\xef\x2d\xf5\x4a\xe7\xfa\x77\xcc\x82\x2b\x16\x75\x03\xb3\x41\xd5\xac\x2a\x97\x2e\x66\x49\x9c\xc3\x4e\xa9\xab\x2d\x84\x4e\xd1\x01\x38\xf8\x4a\xa9\xf1\xd0\x4f\x22\xe1\xe7\xba\xbf\xc8\x84\xef\x9c\xa6\x6e\x85\x5b\x0d\x13\x6f\xd1\xc6\xd9\xdb\x8e\x55\x35\x84\x1c\x6c\xc5\x98\x8d\x88\xb8\x20\x0e\xbe\x52\xd6\xc6\x5d\x24\x9a\xd1\xfc\x85\x36\xc2\x95\x8d\x57\xc5\x74\x6b\xe7\x6d\x1b\xb1\x60\xba\x18\xc5\x61\x47\xff\xaf\xf9\x20\x3d\x4d\xe8\x23\x26\x88\x0b\x90\xa4\xfb\xc7\x73\xb8\x78\x49\xa7\xb5\x87\x37\x94\x99\x39\x0d\x6f\xd1\x6b\x27\x92\x06\xfd\xb7\x54\xfd\xf0\xb1\xbf\x95\xc3\x84\xa0\x5d\x75\x88\xa2\x32\xc2\x34\x81\x38\xa8\xbe\xf9\xef\xbe\x19\xf4\x42\x9f\x24\x01\x65\xda\x20\x6b\x55\xc9\xe7\x97\xb3\x89\xfb\x44\xc4\xfa\x1f\xf1\x5f\xc5\xe3\xfa\x2d\x37\xaa\xa7\x47\x9d\xb1\x3e\x24\xdc\xe6\x0a\x5d\x5c\x04\xe2\xe0\x12\x58\x7b\xd0\x86\x55\xe3\x1a\xfc\x89\xb0\x66\xf2\x2d\x6d\x85\x56\xb3\x89\x59\x78\x85\xae\xff\x17\xc2\x12\x97\x80\x5f\x77\xd6\x4c\xa0\x7b\x11\x40\x1c\x5c\x02\x7b\xb3\x82\x9f\x82\x0c\x04\x16\x68\x3b\x1f\x8c\x63\x0b\x75\x7f\x8d\x56\x50\x90\x70\x6a\x8e\x27\xe9\xda\x63\x9b\xbd\x13\xf1\xcc\x0d\x11\x17\xc4\xc1\x25\x50\x3d\x23\x5d\x4b\x34\xed\x9b\x30\x2b\xff\x49\x5c\xf3\xf0\xec\xed\x4d\xf4\x5a\x07\x5f\xf4\x73\x46\x1f\x51\x46\xeb\x2e\x88\xfa\x42\xdf\x9b\x41\x1c\x5c\x02\x5e\x82\xbc\x18\xa9\xe1\xef\xaa\x27\x13\x1a\x8a\x2e\x39\x6a\xb3\x3f\x2d\xff\x91\x32\xee\xcd\x13\x34\xd2\x67\x6f\x9e\x1a\x13\xaa\x83\x90\x00\x88\x83\xea\x9b\x55\xff\x2a\x01\xd0\xe4\x7a\x92\x04\x06\xae\x5e\xaa\xcc\x99\x3f\xbf\x2f\xc9\xa1\x63\x12\x75\x59\x49\xe6\xa1\xa9\xaf\x54\x84\x6e\xa2\x62\xf8\xd8\xc3\x44\xfb\xaf\xce\xa4\x88\xa1\x83\x38\xb8\x04\x04\x7b\x66\x8f\xf8\x57\xa5\x70\x77\xae\xa9\x0a\xbd\x72\xe9\x7c\xfa\x9b\xc9\x76\x3f\x9f\xae\x6c\x59\x17\x1d\xa7\xf8\xf3\x6b\x66\xa8\x5e\x18\xc4\xc1\x25\xc0\x99\xdd\x32\x76\xfd\xa9\xe7\xd3\xae\x8f\x24\x8c\xe2\x98\x25\xa9\xe3\x4b\xe7\x47\x56\xcc\x9f\x5e\x97\x8b\x7b\x7b\x13\x4f\x7a\x0a\xaa\xd6\x00\x71\x70\x09\xa4\xd9\x5c\x6e\x4c\x4e\xa4\x4f\x18\x3b\x5f\x10\xcb\x23\x65\x63\x33\x3f\xd6\xd3\x46\xa6\x81\x57\xb4\xab\xbc\xe8\x14\xe1\x30\x04\xa5\x90\x40\x1c\x5c\x02\x1c\x74\x52\x44\x07\x9f\x56\xce\x59\xd3\x7b\x92\x72\x5b\xf3\x8d\x47\x34\xcb\xb3\xa9\xb2\x74\x52\x5e\xdf\x7b\xd4\x48\x15\x98\x00\x35\x58\x06\x71\x50\x5d\x23\xc0\x37\x83\x56\xba\x93\x34\xf0\xcb\xe2\x71\xa7\x7c\x78\x73\x60\xb5\x44\x7f\x4e\x22\x2a\xad\x54\x55\x80\x25\xaa\xd3\xd5\xe4\x39\x9a\x33\x9a\x1b\xd7\xe8\xde\xda\x23\xc6\x0e\xe2\xe0\x1a\x98\x76\x5e\x51\x78\x49\x2c\xb1\x75\x84\x95\xc7\xd5\xf0\x5a\xdf\x52\x8d\x3d\x19\x97\x4c\x92\xa1\xe6\x0b\xd6\xbd\x7d\x15\xd3\xe6\x36\x44\x5c\x10\x87\x54\xb1\x53\x32\x84\x63\xf9\xa5\x76\xb5\xe2\x15\xeb\xfd\x17\xb5\x3b\xa2\x13\x02\x81\xb8\x4f\x36\x36\x93\x4c\x2a\x28\x5b\xa5\x65\xde\x43\x77\x59\x82\x38\xb8\x06\xd0\x07\x58\xeb\x1a\x9f\x7e\xe8\xa3\x3b\x90\xa8\x28\xdf\x69\x8d\x3c\xff\xbc\xd9\x74\x31\x4e\x60\xb7\x4c\x7c\x7f\x8c\x25\x68\x1e\x3a\x26\x03\xe2\xe0\x1a\x68\xf0\x20\x4e\x0e\x47\xed\xcf\x7a\xd2\xa0\xad\x7b\x47\xb0\x1c\xdb\x23\x31\xdb\xc6\x63\x96\x65\x9b\x93\x80\x9d\xaa\x4f\xad\x3f\x12\xa1\x01\x10\x07\xd5\x37\x6b\xff\x5d\x03\xa0\x6d\xc7\x49\x1a\x60\x35\xbd\x78\x47\x82\xac\xc9\x36\x87\x6e\xc3\x27\x87\x5c\xa9\x43\xf8\xb0\x49\x3d\x44\x70\xd0\x60\xe5\x18\x7b\x3f\xb5\x76\x41\x09\x31\x76\x10\x07\xd7\x80\x8a\xe0\x78\xc9\x63\xfa\x67\xc4\x0c\x52\x2d\x4d\xe1\xec\xc6\xe9\xae\x19\xd8\xaa\x79\x31\x6f\x04\x24\x25\x51\x6e\x16\xba\xde\x86\x4e\xb5\x81\x38\xa4\x7b\x57\xbc\x0b\x0c\x5f\x44\x63\xe8\xe5\xb1\x73\x91\x5c\xd5\xda\x52\x61\x6f\x6c\x91\x0a\x89\x4a\xf9\x92\xfa\xba\xa1\xa2\x48\xb6\x95\x11\x6a\xa1\x01\xe0\xe0\x1a\x70\xa3\x09\x7a\x3b\x79\x3b\x60\x56\x24\x55\x5d\xb8\x56\xf8\x97\x4f\x5d\xf7\x42\xda\xcd\x8f\xbc\x7c\x85\xb4\xa9\xce\x1b\xbb\xac\x90\x6f\x06\x71\x70\x0d\xd0\x0f\xe7\x3e\xb3\x76\x59\xdf\xf5\xc4\xd5\xe8\x27\x73\x55\x7e\x6f\x7f\xfb\xa6\x66\xf0\xee\xad\xc2\x47\x59\xf7\xce\x1c\x09\xf9\x5d\x45\x68\x00\xc4\x41\xf3\x00\xc0\x37\x83\x2c\xd4\xc9\xbe\xb9\x0d\x8d\xba\x57\xeb\x1d\x43\xdb\x61\x90\x5c\x54\xdb\x11\x29\x3f\x55\xa7\x5d\x94\x76\xf6\x52\xb8\x43\x3f\x49\x4e\x11\x27\xdf\x67\x84\x07\x05\x71\xc8\xbe\xb9\xaf\x41\x3c\x85\x95\x35\xef\xd0\xf0\x28\x49\x6d\x42\x62\xb1\x59\x4d\x68\x4d\x65\x33\xf7\x93\x40\xa7\x71\x30\xbf\x78\x48\x02\x19\x22\x32\x88\x43\xf6\xcd\x53\x8e\x8c\xc6\x7d\xbc\xb9\xf9\x56\x4c\xda\xf9\x12\xa8\xf2\xae\x4f\x6c\x96\x48\xe2\xbf\x68\x14\x31\x8a\x73\xd1\xfe\x0a\x76\xc1\x44\x44\x06\x71\xc8\x2d\xdc\x6d\xbc\xe8\x87\x58\x6a\x77\xc5\x1e\xc7\xb5\x51\xdc\xbb\xaf\x34\xf5\xac\x9b\xab\x73\x4c\xd2\x1f\x75\x80\x2a\xcd\x9f\x8d\x70\x54\x06\xe1\x9b\x41\xdc\x7f\x7c\x33\xce\x3f\x7c\xb3\xeb\xbc\xe9\xf7\xb1\x88\xf9\xcb\xd5\xda\x92\x29\x34\x14\xbd\x86\x84\x6f\x8c\xf1\x5f\x88\x9f\xcf\x2f\xc3\xfe\x22\x12\x18\xfb\xa5\xfa\x4f\xdf\xfc\xc1\xb6\x33\x7f\xc3\x93\xdf\xf1\xd7\x1c\x85\x15\xcd\x67\xee\xe6\x9b\x5e\xed\x14\xe9\x85\xe6\x5f\x9b\xb6\xce\x62\xf4\xb0\x51\x6a\xfc\xb9\xf5\xf6\x79\x17\x68\xf4\xe2\xd6\xdc\x73\x0e\x81\xc2\x5a\xaf\xe5\xe7\xec\xeb\xbc\x29\xa2\x8b\xb6\x0f\xcb\xb9\xe3\x31\xd1\x5b\x7f\xa0\xfd\xdb\x7c\x33\x68\x68\x7f\xd6\x37\x23\xf9\xe6\x5c\xbe\x9d\x2f\xaf\x77\x9b\xcf\xb7\xe2\x51\x04\xd4\x3f\x90\x57\xc2\xdc\xfa\xc6\xef\xf7\xb3\x14\xc5\x5d\xb9\xf5\xe3\xe5\xae\x3b\x22\xa7\xe1\x9b\x25\x90\x7c\x33\xf6\x30\x05\x9d\x0a\xf9\x0d\x05\x22\xc2\xd7\x8f\xfa\x0e\xa8\x67\x5e\x1c\xac\xce\x6e\x7f\x1c\xf8\x2a\x21\x89\xaa\x80\xb7\xec\xce\x74\x2a\x1f\x7e\x91\x7d\x33\xc1\xba\x7b\xb7\x1e\xbb\x98\x64\x5a\xcf\x75\x05\xfb\xfe\x1b\xef\x5c\x31\xd3\xda\x67\xf8\x87\xdb\x05\x9d\x7b\xbf\x6b\xb3\xeb\xc9\x9c\xca\x87\x5f\x64\xdf\x2c\xc9\x33\xc8\xc9\x8e\xa3\xdd\xce\x43\xe8\xb6\xae\xce\xf6\x0b\x25\x67\x26\x6e\xe2\x1e\x6e\x5b\x43\xa3\x1a\xed\x6d\xca\x12\x63\xee\x53\x19\x2d\xb2\x6f\x3e\xe2\x7b\x65\x84\xce\x85\xf9\xea\x81\x88\xc0\x8a\xeb\x17\x66\x51\xb9\x34\x8d\x87\x04\x3f\xe2\x5a\x42\xf5\x99\xf4\x9f\x68\xad\x71\x9c\x9a\x6f\x06\x69\xe8\xa4\x95\x72\x34\xd2\x44\x2d\x44\x46\xf6\xdc\xc4\x85\xc4\xc6\xb9\x0b\x2b\x7d\x3c\x6c\x82\x1d\x7a\xce\x16\x68\xf3\xdd\x2b\x54\x5b\x37\x86\xa1\xab\x38\x40\x1c\x52\x47\x20\x4b\x5a\x81\xc9\xe8\xa7\xfc\x0c\x8b\xc6\x8b\xcd\x46\x02\x74\x79\x9f\xd2\x77\x49\xf5\x7e\xc5\x77\xc4\xd8\xe9\x18\x2c\xcc\x70\x42\x9d\x7b\x00\x1c\x7c\xa5\x1c\xb8\x40\xf5\xcc\x6c\x5d\xfd\x7b\x2f\x93\xbe\xcd\xf7\xd7\xf1\x2e\xf2\x61\x6b\x77\xa9\x36\xdd\x0b\xbc\x72\x9a\xb7\x7f\x63\x6a\x9b\x41\x3b\x7c\x00\x07\x5f\x29\xbf\x31\x0d\xfe\xf4\x1a\x9f\x2a\xfb\x34\x88\xf3\xa0\xc4\xfc\x59\x76\x42\xb5\x06\xad\x2c\x86\x37\x67\x22\x1f\x26\x9e\xf0\xf5\xd4\x27\x90\xcf\x07\x70\x01\x92\x28\xa8\x7f\xc6\xed\x98\x64\x51\xa1\xd3\x5f\x72\xf1\x7d\x9c\xeb\xdf\x30\xcc\x36\x10\xf9\x94\xcb\x53\x19\xd7\x49\x47\x48\x6d\x30\x98\xc8\xcd\x0e\x05\x61\x9a\x40\x1c\x54\xdf\xfc\x77\xdf\x0c\x7a\xa1\x4f\x92\xc0\x87\xca\xb0\x01\x42\x45\x8e\x03\xf9\x9f\x9c\xa1\xd7\x3c\xfa\xd6\xbd\x48\x93\x66\xc8\xd4\x02\xb8\x08\xde\xe8\x7e\x7a\x2c\x79\x1d\x6a\x91\x0e\xe2\xe0\x12\x60\xb4\x27\xd6\xb5\x9c\xe5\xc8\xf6\x8a\xaf\x4e\x7e\x6f\x27\xe2\xe0\x5a\x12\x4e\x12\xd5\x3b\x84\x67\x7e\x53\xd3\xf9\x17\xa7\xe7\x21\x22\x2e\x88\x83\x4b\x60\xd2\x87\xef\x37\xef\x43\x77\x1f\xbe\x7c\xf6\xd2\x4d\xd4\x82\xc8\x62\xb6\xf9\x43\xd7\xa1\xec\xf2\x4c\xb3\x92\xf3\x06\x9c\x6d\xba\x88\xb8\x20\x0e\x2e\x81\x07\xeb\xfc\xda\x49\x99\x2e\x84\x1f\xbd\xcc\x0c\xe3\x3e\x13\x8a\x18\x54\x38\xce\xc9\xb5\xfe\x7c\xd8\xae\xf9\xfb\x3b\xb1\xad\x47\x00\x22\x2e\x88\x83\x4b\xe0\x8b\xfa\xdb\x20\xcb\xc2\x4a\xc3\xd6\xb7\xd3\x1f\xc8\x9d\x0e\xe8\xef\x17\x85\x58\xf7\xa8\x54\x6c\x7f\x1a\x99\x30\xae\xe5\x29\x70\x45\x48\x00\xc4\x41\xf5\xcd\x7f\xf7\xcd\xa0\xc9\xf5\xc4\xee\x80\xf2\x98\x2f\xb7\x6e\x13\x7b\x45\x57\xfa\x85\x09\x7c\x7f\xa4\x97\xa3\xa1\x30\x63\xff\x4d\x22\x7b\xef\x4a\xec\x6f\xff\x17\x6e\x50\x6b\x70\x10\x07\x97\xc0\x86\x1b\x25\x69\xaa\xcf\x9a\x40\xa8\xb3\xf9\x6e\xc7\x24\xe3\x98\xb0\x07\x73\xd7\xe8\xd4\xab\x64\x9d\x62\x3b\x6d\x43\x85\x95\x6e\x44\x5c\x10\x07\x97\x00\x7e\x6e\x7f\xe5\x73\x3a\x45\xee\xdb\x94\xb2\x6e\x23\xf9\xeb\x28\x0b\x0f\x55\x49\x45\x04\x25\x2c\xe4\x9f\x78\x84\x57\x97\x64\x7d\x40\xc4\x05\x71\x70\x09\x08\x5a\x5f\xad\xed\xc3\xb3\x55\x5e\xf5\x99\x71\x65\x31\x3e\x9f\xe4\x92\xf1\xd9\x9f\x4b\x6c\xb1\x96\x6f\x9f\x41\xf1\x25\x4b\x76\x2a\xe4\xf3\x01\x1c\x5c\x02\x93\x0c\x72\x67\xe7\x6e\xe0\x5a\xa0\x8c\xb5\xc6\x46\xff\x2c\x5f\x17\x08\x6d\xf7\x94\x93\x51\x15\x3e\xe6\x61\x12\xa1\x6f\xea\xaf\x46\xec\x97\x41\x1c\x54\xd7\x08\xf0\xcd\xa0\x95\xee\x24\x0d\x6c\x26\x2b\x4f\xde\x1a\x91\x79\x38\x74\x45\x33\x51\xa7\xea\x5e\xeb\x4d\xef\xd7\x89\x77\x3c\xbe\xfa\x5f\xd3\x32\x26\x9f\xfa\xba\x40\x81\x18\x3b\x88\x83\x6b\xc0\x03\xa3\x81\xff\xc6\x8d\x94\x42\x7f\x03\x1d\x82\x8f\x91\x15\xbf\x66\x76\x8b\x51\xac\x68\x70\xe8\x77\xc9\xf8\x50\x48\x50\x46\xa1\xf3\xd4\x20\x0e\xae\x81\x8f\x9c\x78\x4e\xd8\xec\xbe\x25\xb1\x2f\x1d\x52\xca\x2b\xfc\xc2\xa5\xf2\xf3\xb7\x95\x50\xe7\x9a\xfa\x09\xec\xcc\x18\xc8\xc3\x7f\x23\xe2\x82\x38\xa4\x69\x20\x1b\x35\xcf\x3e\xfb\xb8\xc9\x67\x3b\x4c\xe2\x4d\x46\x80\x61\xd2\x51\x1d\x4f\xa4\x19\xc5\x51\xd8\xd9\x28\x7b\xde\xe4\xed\x4b\xd0\x34\x00\xe0\xe0\x1a\xe8\x9e\xa1\x8c\x64\xff\xc0\xc7\xcb\x56\xd7\x81\x5a\x10\x62\xf0\x3d\xf5\x57\x98\x0e\xbe\x67\x55\x46\x2f\x76\x95\x94\x55\xda\x16\x74\xa7\x3c\x88\x83\xea\x9b\x01\xbe\x19\xb4\xed\x38\x49\x03\xd1\x4b\x62\x14\x43\x5d\x92\x75\x0b\x4e\x13\x11\x01\xae\x8c\x28\xa8\x6d\x1e\x28\xb4\x05\xec\xa2\x41\x24\x73\xa5\x6e\xb3\x1b\x43\x50\x15\x14\x80\x83\x6b\xc0\xeb\x51\x90\x78\x75\xb2\xa5\x9f\x37\xcd\xf3\xe7\x6a\xb1\xef\x31\xc9\x87\x42\x8b\x70\xa5\x0d\x9b\xf7\xa8\xa7\x5a\xf4\x64\x51\x79\xa0\xef\xc2\x00\x0e\xae\x81\xc2\xb9\x70\x8e\x2d\xbf\xb6\x97\x1e\x85\x6e\x9f\x59\x5b\x15\xe3\xf7\xea\xfb\x7f\xf3\x9a\x88\xb9\xac\xf1\xc5\x6f\x5f\x08\xc5\x84\xf2\x5c\x20\x0e\xae\x81\xd8\x3d\xe1\xdd\x26\x4a\x4f\xd5\x03\xe3\x8f\xea\x55\x14\x52\x4f\x28\xf8\x6a\xe6\x9c\x24\x84\x49\xa4\x63\x7b\x5d\xef\xe1\x63\xaf\x20\xe2\x82\x38\xb8\x06\xa8\x35\x4c\xf1\x0f\x3c\x3a\xdd\x39\xed\xcd\xa4\x35\xec\x6e\xcc\x60\xc8\x24\xe9\x52\xeb\x2d\xdc\x27\x27\x7b\x4d\xfe\xb6\x78\x09\x6a\x93\x0f\xe2\xa0\x79\x00\xe0\x9b\x41\x16\xea\x64\xdf\x8c\x5f\x42\xef\x17\xa7\x76\x10\x83\xb5\xfc\x99\x23\x21\x2d\x4d\xfd\x4e\xc8\x32\x4b\xf1\x70\x5b\x09\x9a\x4a\xe8\xb2\xca\x9b\x15\xe8\xcc\x33\x88\x43\xf6\xcd\x23\x65\x81\xc4\xcd\x7d\x75\xf5\xef\x1c\xe9\x44\x6f\x95\xd8\x38\x89\x95\xc4\xdc\xfc\xb6\x38\x75\xae\xbb\x30\xb4\x53\x60\x0c\x1b\xea\x0b\x06\xe2\x90\x7d\x73\x45\xc7\x9a\xc0\x7b\xd2\xc0\xb0\xdf\x3e\x99\xef\xde\x07\x12\x49\xef\x8d\x93\x62\x3c\x1b\xc1\xa2\x0d\xb9\x44\x55\x28\xc2\x31\x0d\x55\x4e\x83\xb8\x00\x69\x14\xc2\x7f\x46\xce\x25\x6d\xbd\xd2\x77\x95\x5b\x3f\x00\xfb\x1a\x81\x6c\xb5\x9a\x43\x66\x27\xe6\x3d\x2c\xbb\x3e\xd9\x16\xb5\x5e\x63\x89\x22\x5d\x1d\x84\x6f\x06\x71\xd0\x9d\xf2\x90\x6f\x9e\x20\x10\x2c\xd7\xf7\xa2\xca\x20\xf6\x23\xda\x59\x8e\x24\x58\xc8\xde\x50\x7e\x19\xe0\x57\xcc\xe6\x9e\x1d\xfe\xa6\xae\x39\xec\xda\x9f\xbe\xf9\x1c\x67\xf5\xc4\x71\x60\x5a\x5e\xa0\xb0\x71\xc5\x6a\xd6\x63\xef\xe7\xb9\x05\x9d\x7d\xca\x46\x5d\x5b\xd3\xe4\xe6\x0a\xd7\xea\x49\xfe\x5c\x6c\x30\x13\x24\xe8\xfd\x15\xe9\x6b\x2e\x2e\xcf\x3e\x3e\x7c\x19\x2b\x16\x63\xdc\xc4\xb6\xc2\x78\x7e\x65\xb1\x76\xd1\x64\x5f\x5d\xe4\xdf\xe6\x9b\x41\x43\xfb\xb3\xbe\x59\x1a\x6e\xae\x3a\xb5\xb2\x5d\x53\x68\xbf\x63\xcf\xa6\x6f\x4f\x71\x3a\x4a\x74\xf5\x36\x18\x24\x90\x37\xd5\x4f\x07\x2c\xb7\x5f\x59\xff\xdd\xe5\x75\x1a\xbe\xd9\x17\xc9\x37\xaf\x32\x52\x8f\xae\x67\x49\x44\xb0\xe0\x3e\xfd\xf1\x6c\x47\x68\x63\x53\xbd\x47\xec\xdb\xac\xc5\xf7\xe8\x8e\x92\x02\x2d\xaa\xa9\xc2\x53\xf9\xf0\x2b\x8c\xfc\xe1\x57\xd9\x98\x1f\xc7\x5a\x3b\x13\xe5\x91\x5b\x4d\xce\x50\xd9\xf4\xce\xea\x44\x5f\x90\xed\xa0\x90\xfc\x83\xb8\x26\xd3\xa6\xc6\xd3\x68\x1e\x2e\xed\x8b\xec\x9b\x3b\x15\xb8\x9f\xf4\x76\x6e\x79\xeb\x04\xf5\x32\x88\x30\xfc\x1a\x28\xbb\xd8\x25\x2f\x97\x6b\x5a\xfe\x80\x8b\xc3\x39\xfe\x7a\x53\xc2\xa9\x8c\xd6\x05\xe9\xcf\xf6\x50\x89\x50\x0f\xa9\xd5\x49\x65\x72\x8c\x3c\xf9\xa5\xe7\xb8\x82\x2f\x43\x10\xa1\x27\xb3\x9a\x45\xa5\x23\x6a\xd1\xd9\xe6\xe4\x7b\x6a\xbe\x19\xa4\xa1\x93\x56\x4a\x1e\x65\x11\xb1\x0f\x23\x45\x72\xfc\x3d\x9f\x85\xd8\x96\x04\x6e\xe5\x8a\xf4\x1e\xe3\x5c\x7a\x79\x41\xf5\x8e\x04\x63\xa9\x56\x2b\x64\x42\x40\x1c\x7c\xa5\x1c\xf6\x7c\x5f\xa4\xdb\xe8\x92\x74\x13\xbb\xc2\x28\xa6\x91\x20\x22\xe7\x4e\xb3\xbc\xb3\x9d\x6c\x7d\x51\xaa\xf7\x2a\xcb\x95\xd7\x0e\x88\xb8\x20\x0e\xbe\x52\x0a\x09\x95\x2e\x36\x86\x6e\x49\x46\x34\xca\x94\xfe\xbe\xe8\x9c\xd2\xeb\x24\xec\x7c\x55\x6d\xfc\x2c\x99\x46\x1c\xef\x97\x80\xff\x3b\xf9\x09\xe2\xe0\x2b\xa5\x2a\x5f\x60\x9b\xf4\xaa\xc5\x5b\x07\x85\x39\xf5\x01\x5d\x43\xca\x6b\xa1\x94\x6b\x41\xb3\x9b\x09\xef\x37\x9f\xf0\x86\x07\xf7\x41\x1d\x51\x40\x1c\xbc\x52\x6a\xbb\xc7\x2e\x2e\x93\x38\x21\xd1\x92\x9c\x26\x45\x4e\x2b\xaa\x6e\x97\x45\x61\x2a\xf5\x32\xeb\x8f\xd7\xbd\xa3\xa9\xfa\xf1\x1e\x58\x08\xd3\x04\xe2\xa0\xfa\x66\xe9\xbf\x6e\x96\x40\x2f\xf4\x49\x12\xe8\xea\x1e\x7d\xd1\x34\x2a\x78\xfe\xab\xa1\xf5\xf8\x60\x3e\x41\x44\x7e\x1f\x1b\x4d\x16\xf3\xa1\xe4\x35\xad\x1a\x87\x18\x09\xc5\x4a\xc4\xd0\x41\x1c\x5c\x02\x4c\xaf\x52\x5c\x56\xd4\x45\x50\xdf\x2f\x7d\x74\xc7\xed\xde\x7d\x7b\x13\x83\x78\x88\xa9\xf9\xab\x7c\x93\xbd\x65\xee\xfc\x75\x46\xe8\x2e\x11\x10\x07\x97\x40\x81\xb1\x9d\x04\x2f\xae\xf0\xf5\x8c\x0c\x59\x8e\xd4\x1b\x84\x18\xea\x0a\x83\x35\x7a\x66\x1e\xae\x0f\x5f\x14\x59\xf9\x9c\x9b\xc8\x46\xc4\x05\x71\x70\x09\x68\xa8\xeb\x50\x73\x47\x6e\xa0\xd0\x2f\xa5\xc4\xdf\x69\x25\xea\xc3\xea\x5e\x77\xe5\xa1\x20\xac\x4c\xc0\x9d\xf3\x64\x32\x44\x81\xee\xa9\x01\x71\x70\x09\x44\xe4\x68\x92\xf3\x3b\xe2\x70\xa0\xbb\xa8\xa4\x2f\xce\x5e\xeb\xd4\xf0\xa6\x7c\xd8\xf2\xe6\xbe\xb8\x98\xbd\xc3\xde\xa7\x6f\x32\xcd\x08\x09\x80\x38\xa8\xbe\xf9\xef\xbe\x19\x34\xb9\x9e\x24\x81\xdb\xef\x17\xbf\xe8\xed\xf4\x6d\x66\xed\x84\x55\x1f\x5c\xb3\x0e\xbb\xaf\xac\xd9\xa7\x40\x7f\xd5\xcd\x3c\xcf\x5c\xb3\xc4\xe0\x3a\xd4\xc5\x0f\xc4\xc1\x25\x80\x5f\x33\xcf\x2e\x66\x7a\x71\x51\x1a\x55\xa1\x23\x1f\x25\x83\x9b\x82\xdc\xdc\x8c\xa3\xbb\xf8\xfd\xd0\xeb\xe9\x6e\x67\xec\x5e\x31\xc8\xdf\x02\x38\xb8\x04\x7e\xbe\x95\x95\x56\xab\x3f\xb7\x60\xe2\x24\x3c\x1d\x36\x30\x4b\xb2\x81\x26\x1b\xf0\x2d\xb7\x1d\x87\x83\x48\x35\x0d\x27\x9c\x05\xba\x5d\x0e\xc4\xc1\x25\x90\x2f\xf2\x23\xda\x9b\xd6\xcc\xd4\x34\xd2\xdb\x28\xcd\xd5\x6c\xe5\x59\x16\xee\x5b\x21\x2c\x02\x9a\x1a\x4d\xed\xfd\x10\x97\x68\x7e\x44\x5c\x10\x07\x97\xc0\x7d\xaf\x30\x87\x68\xc6\xd6\x71\xc6\x20\x62\xc7\x95\xbc\x9e\xc4\x88\xf1\x0f\x6c\x86\x98\x45\x1c\x6d\x8f\x0b\x6e\x5c\x44\xd3\x16\x47\xec\x97\x41\x1c\x54\xd7\x28\xfc\x77\xcf\x04\x5a\xe9\x4e\xd2\x80\x08\xdf\x06\x1a\x56\x40\x9e\x72\x5d\x1b\x79\xe6\x43\x97\x5a\x76\x81\xe7\xac\x4e\x47\x13\x2b\x57\xdf\x2e\x99\x5d\x2a\x5f\x7b\x01\xf5\xc3\x02\x71\x70\x0d\x6c\x5f\x5d\xf9\x6c\x7c\xfb\xf0\x22\x37\x7a\xdc\x67\x8c\xfd\x9e\x44\x03\x7e\xd1\x49\x4b\xdb\xca\xae\x25\xbf\xd7\xa4\x38\x44\x58\xd7\x10\x71\x41\x1c\x5c\x03\x8c\x01\x3c\xfa\xfe\xe3\x04\x33\xb9\x6f\x0c\x30\x4d\xaa\x17\x73\xc4\x24\x68\xef\xf4\x1d\xc5\xa1\x8f\x30\xee\x6f\xbc\xfb\xa0\x08\x9d\xfd\x05\x71\x70\x0d\x3c\x97\xfb\xc2\xfd\xa2\xd7\xf2\x8b\xb8\xd4\xc4\x65\x7c\xe5\xe8\xc9\xfe\xe7\xa2\x9f\xf0\xe3\x07\x07\x0f\x57\x6b\xac\x3c\x2c\xd0\x70\xa0\x1a\x00\x00\x07\xd7\x80\x78\xbf\xea\x45\xd3\x9d\xee\x44\xb5\x0a\x86\x8c\xf7\x91\xb4\xc6\x47\x9d\xc1\xdb\x07\x6a\x8b\x8f\x26\x94\x8c\xb0\x3f\xdf\xa6\xb5\x42\x68\x00\xc4\x41\xf5\xcd\x00\xdf\x0c\xda\x76\x9c\xa4\x01\x9b\xb2\x49\x45\x3e\x67\xf5\xc7\xcc\x38\xbf\x4a\xe3\x6a\xe8\x9f\xe5\x19\xab\x79\x15\x5f\x55\x8f\xdd\xde\xb1\x38\x9b\xbf\xf6\xf8\x0e\x62\xec\x20\x0e\xae\x81\x92\x9f\x69\x3f\x14\x04\x6f\xa0\xe1\xf5\xdb\x89\x67\x7f\xbe\x22\x82\xf5\x13\x3f\x6e\x95\xaf\xa6\x97\x55\x5b\x48\xfe\x45\x69\xec\x55\xa8\x66\x1c\xc0\x21\x5d\x2f\x77\x95\x56\x5d\xe8\xe0\x45\x97\xd6\x02\x93\x91\xb3\x2f\x13\x4b\x7f\x71\x9e\x9f\xf0\x93\x2c\x51\x3f\xca\x26\xb4\x73\x9e\xfb\xd0\xfb\x0a\xe2\x90\x6a\xd1\x7f\xab\xd4\xb5\x4b\xaf\xa6\x94\x62\x16\xbb\xb2\x4a\x87\xf9\x8d\xa6\xf3\x04\xbe\x9c\x9a\x91\xce\x11\x24\x64\x49\x0b\x4f\xda\x45\xc4\x05\x71\x70\x0d\xb4\x39\xcd\xc5\xe4\xa8\xba\xf2\x48\x95\x91\xbd\xb8\x4c\xb3\xff\x21\xfb\x65\x56\x39\x0b\xa1\xa9\x82\x56\xb3\xbf\xb9\xe0\xdd\x00\x54\x84\x06\x40\x1c\x34\x0f\xb8\xfc\xdd\x37\x83\x2c\xd4\xc9\xbe\xf9\xeb\x63\xeb\xc9\xe4\xa8\x3b\x09\xf8\x7a\x61\x98\xac\xc3\xd5\x7c\x3b\xe8\x5c\xd4\xed\x8a\x0b\x13\xf2\xe4\x54\xaa\xd7\x7f\xbf\x09\x45\x78\x50\x10\x87\xec\x9b\x2f\x77\x6e\x7e\x7c\x53\xc6\x41\x26\xe3\x62\xd5\xce\x44\xd4\xaf\x1d\x29\x2b\xa2\x39\xfc\x3c\x4c\xee\x12\x4e\x8f\xe1\xe3\x90\x37\x6d\x88\xc8\x20\x0e\xd9\x37\x07\xcc\x1d\xc4\x31\xbe\xfe\x96\xcc\x2c\x3d\xa2\x8b\x66\xf0\x3d\xc3\x4e\x12\xef\xae\x1d\x4d\xfb\x3e\x5f\x4e\xca\xc5\x5e\x9c\x35\x1f\x44\x64\x10\x17\x20\xfd\x9f\x27\xf9\x67\xe4\x79\x07\x14\x92\xe3\x78\x56\x25\x0c\xea\x49\xd5\x1d\x7f\x76\x9b\xe7\x71\x5b\xcd\x1c\x47\x77\xd5\x98\x53\x49\xbf\xdd\xac\xac\x60\x40\xf8\x66\x10\xf7\xdf\xdf\xfc\xa7\x6f\xc6\xb8\xea\x98\xa8\x9b\xfd\x2a\x40\x9d\x9e\x40\xe5\x8d\xda\xa2\x8b\x10\x45\xa2\x4c\x55\x65\xfc\xbd\xce\xcf\xe3\x37\xf6\xba\xbd\x3e\xfe\xe9\x9b\x85\x15\x2e\x8d\x0c\x93\x8c\xac\x09\x5d\x4e\xdf\x3d\x36\x95\xcf\x30\xab\xe2\xe1\x79\x7b\x39\x02\x6d\xd4\x33\x8d\x93\x58\x69\xa0\xe2\x4f\x8b\x7d\x35\xc5\x45\x2d\xf2\x75\x4e\x3b\xf5\x81\xe1\xaa\xbd\xcb\xab\x51\xff\x19\xe7\xd7\xc9\x11\xf8\x92\x37\xde\x93\x05\x44\x7a\x8c\xfe\xdb\x7c\x33\x68\x68\x7f\xd6\x37\x23\xf9\xe6\x0f\x8a\xbd\x75\xc1\x91\x67\x12\xa2\xcf\xdf\x2a\xe1\x29\x1c\x5d\xe5\x4f\xe8\xf8\x69\x6b\x1e\x45\xf9\xd5\x55\x83\x2d\xc2\xda\x14\xef\x34\x7c\x73\x3d\x92\x6f\x2e\x79\xa0\xca\x97\xb9\x60\x1c\xe0\x69\x80\x6b\x60\xd6\x77\x75\xd4\xa4\xfa\x9e\x92\x9d\x60\xaa\x51\x30\x96\xaf\x72\x25\x2b\x4f\xcc\xa9\x7c\xf8\x45\xf6\xcd\x5f\xd7\x39\xd1\x1e\x7a\x44\xd6\x6e\x05\x4c\x46\x30\x97\x7c\x25\x77\xbf\xcd\x57\x1d\xa3\x5b\x3e\x7b\x1b\xc7\xf1\x48\x85\x9d\xa6\xe2\x54\x3e\xfc\x22\xfb\xe6\xe4\x55\x5c\x9e\x8d\x61\xde\x8a\x15\xe9\x27\x9a\xf3\x9b\x3d\x15\x2a\x63\xf3\x91\x4f\xb4\x36\xfa\x8a\x1f\xd1\xa4\x67\xa8\x4d\x8e\x9d\xca\x68\x91\x7d\xf3\xe3\x8f\xed\x0c\xee\x76\xbb\x75\xd2\xbe\x1e\x65\x25\x87\x26\x77\xe6\x34\x32\x82\x6e\x7d\x62\x26\xcd\xe4\x49\xda\x9f\xb5\x60\xd6\x3b\x35\xdf\x0c\xd2\xd0\x49\x2b\x65\xf3\x9a\x7b\xe4\x56\xcc\xc8\x05\xb9\x7b\x31\xd5\x37\xea\xd4\xc4\x75\x6c\xf8\xe2\xbf\x14\x3a\xbb\x86\xce\x5f\x66\x6e\xac\x64\x80\x2e\xb7\x05\x71\xf0\x95\x92\xde\xe3\xfb\x3d\xbd\x73\x9e\xdd\xab\x8b\x7b\x66\xb5\xa9\x2e\xc1\xef\xe6\x50\x73\xa5\x83\x3f\x90\x4d\x18\xd2\x07\xdc\x6a\x7d\x77\x80\x88\x0b\xe2\xe0\x2b\xa5\x7d\xbb\x35\x77\x50\xd4\x2b\x02\xf1\x80\x01\xf6\x4c\xd4\xbb\x56\x59\x84\xd8\xee\x68\xb8\x4d\xb6\x26\x7b\xb9\x97\xdb\x3e\x4e\xd3\x23\xe2\x82\xb8\x00\x49\x14\x89\x3f\xe3\xb2\x7c\xd3\x1f\x22\x48\xe0\x11\x94\x7c\xc0\x82\x67\x8f\xcf\xa9\x7b\x9c\x9c\x8d\x93\xa5\xfd\xcb\xd0\x5f\xd3\x84\x1d\xdd\x32\xa5\x09\x11\x17\xc4\x05\x48\xa2\xfe\xe3\x39\x28\xb2\x60\x76\x31\x6d\x63\x45\x8b\x90\x79\x13\x60\xfb\xe9\x55\x8e\xb8\x28\x3b\x09\xfa\x1d\xdf\x65\xc6\xb8\x99\xaa\x1e\xf7\x1b\xea\xa7\x0d\xe2\xa0\xfa\xe6\xbf\xfb\x66\xd0\x0b\x7d\x92\x04\x1c\x7d\x26\x8a\xd3\xdf\x4c\xcf\x30\xba\xba\xff\xe0\x8c\x28\x49\xe5\xfb\x5a\xee\x8e\x61\x8f\x61\x3e\xa8\x79\x6e\x1b\x25\x8a\x16\x6a\x86\x04\xe2\xe0\x12\xb8\xa5\x27\x40\xd7\x15\xf0\xc5\x39\xe9\x11\x86\xad\x0d\x6b\x10\xab\x1b\xbd\xc8\x4f\xfd\xef\x58\x6b\x93\x58\x5e\x73\x8f\x53\xb7\x58\x11\x71\x41\x1c\x5c\x02\x39\x5b\xad\x77\xfd\xdc\xf6\x78\x3e\x99\xdd\xe5\xda\xbb\xfd\x78\xe6\x26\xf6\x23\x8c\x25\x31\x76\xbb\x83\xe6\x96\x8f\x6c\xf4\xfc\x31\x88\xb8\x20\x0e\x2e\x01\xbf\x87\x4d\x44\x78\x84\xb7\x2e\xb9\xae\xf3\x92\x5d\x0f\x66\xe4\x8d\xd3\x6f\x4d\x0c\xc9\xf0\xb8\x8b\x1a\x89\xb3\xdd\x97\xbb\x5c\x0e\xb5\x80\x07\x70\x70\x09\xbc\x6b\xb9\x9e\xdb\xd7\x7f\x7f\x71\x48\x33\x72\x46\x74\xa7\x29\xf5\xd6\xab\xaf\xfb\x4f\x12\x76\x5b\x1d\x28\xd1\x2e\x86\x86\x49\x52\x22\x24\x00\xe2\xa0\xfa\xe6\xbf\xfb\x66\xd0\xe4\x7a\x92\x04\xf0\x4c\x53\xf7\x83\xda\x69\xcf\xf0\x7f\xca\xdf\x60\xc0\x2d\xb9\x9d\xa7\xa6\xaf\x45\xc9\xf1\x3a\x30\xd1\x25\xe5\x9c\xe6\x76\x99\x35\x62\xe8\x20\x0e\x2e\x01\x92\xa0\xf4\x6c\x9d\xe9\x71\x4b\xaf\x17\x85\x55\x6b\xce\xba\x8f\x0d\x58\xba\xdf\xc4\xac\xc9\xa4\x9b\x0e\xc9\x11\x5b\x59\xf7\x40\xf5\xc2\x20\x0e\x2e\x01\x1d\x3a\xb1\x0d\x4d\xbc\x55\x9d\xa7\xc4\x1b\x1e\x53\xcf\x5c\x86\xe3\x46\xa8\x3e\x1c\x17\x61\x6f\x5d\x64\xdf\x91\xb7\xa2\x49\x87\xba\x11\x80\x38\xb8\x04\x14\x37\x0e\x99\xa3\xec\xaf\x90\x9b\x24\x4c\x91\x63\x96\x04\x5b\x5d\x4c\xf7\x74\x0b\x78\xcf\xfb\x93\x46\x25\x28\xc9\xae\xbe\x09\xfa\xe6\x0a\xe2\xe0\x12\xb8\x12\x97\xf7\x65\x3c\x60\x7e\xc9\x3f\xf7\x01\x47\x46\x7c\x0d\x1b\xed\xfb\xb2\xc9\x82\x98\xac\x2b\x01\xc1\x5e\xa3\xfe\x22\x5d\xd0\x55\xbc\x20\x0e\xaa\x6b\x04\xf8\x66\xd0\x4a\x77\x92\x06\x9a\xa4\x16\xf8\xc6\xc4\xb5\x2f\xb7\x70\x1f\xba\x09\x69\x7f\xb7\x7a\x36\x5d\x6e\x4a\xf3\xcb\x33\xe5\xd2\x6f\xee\xf0\x9a\xbb\xb6\x78\x50\x9f\x2d\x00\x07\xd7\x80\x91\xe3\xfd\x83\x83\x2b\x97\xbe\x64\x1b\xad\xbe\xdb\x6c\x3c\x47\x2c\x6c\xd4\x65\x16\xd4\x2a\x81\xc9\x9f\x53\x4c\x64\x35\x87\x03\xcd\xac\x20\x0e\xae\x01\x1c\xee\xb9\x1e\x87\x87\xe6\x7d\x7c\xc3\x11\x75\xe4\x67\x2c\x5c\xd4\xab\x29\x44\x85\x2c\x7d\x3f\x71\x70\xc9\x18\x04\x78\x9b\x42\x9e\x09\xc4\xc1\x35\x50\x39\x2c\xfe\x5b\xab\xd0\xfb\xec\x23\x1e\x4c\x63\x9c\x33\x1d\xa5\x5e\x67\x1c\xaa\x0e\xc3\x14\x0e\xe8\x96\x07\xbd\x99\x24\xbe\x43\xfd\xbf\x41\x1c\x5c\x03\xa6\x4f\xd3\x26\x2f\x16\x2e\xef\x6b\xea\x08\xed\x29\x95\x96\x62\x60\x6d\xa4\x11\xa9\xd8\x4d\x1a\x2d\x29\x5d\x70\xae\x77\x3a\xb3\x84\xd0\x00\x88\x83\xea\x9b\x01\xbe\x19\xb4\xed\x38\x49\x03\xa8\x5e\xfd\x9d\xb7\xd0\x1c\x1f\xec\xcc\x79\x1c\xbc\x60\xac\x2d\x39\x22\x33\xaa\x9c\x20\xd3\xdd\xd5\x63\xab\xa1\x7f\x9a\x48\xe7\x89\x18\x3b\x88\x43\xea\xa7\x7d\x4d\xf6\x6d\x68\xc5\xd4\x6b\xa1\xa3\xf9\x48\xf4\xef\x0b\x82\x0f\x68\x34\x47\x76\xd1\x39\x6b\xcd\x23\x6a\xbc\x6b\x98\xf4\xa0\x3b\xc3\x40\x1c\x5c\x03\xc5\x84\xb1\xe9\x45\xbe\xda\x42\x72\x09\x09\x34\x94\x6d\x45\x77\xd6\xfc\x63\x26\x8e\x0e\x59\xf5\x97\xf8\x68\x35\x22\x32\xc9\xa1\x6e\x27\x20\x0e\xae\x01\x52\x19\xd4\xc7\xe2\xbb\xa3\x65\x83\xb1\xaa\x5f\x30\xe7\x6f\x2b\xa5\x64\x92\xe6\x89\x3e\x77\xb8\xe5\x79\x90\x68\x32\x74\x6d\x9d\x1d\x11\x17\xc4\xc1\x35\xc0\x1a\x1d\x58\x56\x4b\xd1\xfc\x80\x57\xa6\xcc\xdf\xaa\xb3\xf2\x6c\x0e\xe5\xa7\x6f\x32\x24\x5c\xb7\x4b\x64\xde\x1b\xb6\xdc\x91\xf8\x81\xd0\x00\x88\x83\xe6\x01\x80\x6f\x06\x59\xa8\x93\x7d\x73\xab\xea\xbd\x5b\x5b\x18\x36\x07\xce\x9d\x9f\x1d\xa6\xf8\xce\x58\x4c\x61\x1b\x7a\x39\xed\xa7\x12\x39\xbc\xf3\xc7\x4b\x3e\x4b\x22\x82\xf0\xa0\x20\x0e\xd9\x37\x37\x64\x58\xde\xdb\xa0\xa6\xf2\x74\x89\x8a\xbe\x12\xf9\x51\x2c\xc1\xd2\x63\xd7\xb6\x6e\xb0\xec\x63\x82\x8e\xac\xaf\x1c\xf9\x4a\x0b\x22\x32\x88\x43\xf6\xcd\x28\x7e\x13\x2b\xbf\xef\xea\x9d\x31\x65\xb1\x7e\xb5\x1f\x9d\xb7\x28\x75\x59\x9d\x12\xad\x7b\x63\xe5\x7b\xd9\xc8\xc3\xfb\xdb\x86\x3b\x88\xc8\x20\x2e\x40\x1a\x05\xe5\x9f\xff\x33\xe5\x96\x7d\x8a\x6d\x8b\x61\xa2\x23\x0b\xcb\x20\xe9\xeb\xca\x19\x68\xd5\x9a\x2e\xf4\xda\x67\x1b\x22\x9e\x08\xa9\xfa\x79\x18\x3c\x45\xf8\x66\x10\x17\x20\xed\x0b\xbb\x87\xca\xe8\x55\x8c\x20\x5d\xef\xfd\x97\xa1\xba\x52\x3a\x9e\x54\x3d\x16\xac\x77\x4a\xaa\xb6\x6f\xdf\xbe\x72\xf6\xab\x86\xf1\xd2\x65\x8c\x73\x7f\xfa\x66\x4e\xed\xa9\xde\x50\x32\x7a\x54\x9a\x79\x93\xa9\x28\x41\x8a\xd8\xf0\x68\x31\x8a\xc9\x25\xc3\x97\x1c\xc4\x01\x9e\xe3\x34\x37\xff\xfc\xc1\xcb\xf3\x37\x09\x32\x86\xdc\x46\x0d\x98\x7d\xa9\xa8\xbd\xdc\x44\xd0\xac\x25\xc5\xac\x8d\xab\x48\x5f\x3c\xfc\x3a\x44\x84\xa3\x90\xfa\x6f\xf1\xcd\x7e\x98\xff\xdb\xd0\xfe\xac\x6f\x46\xf2\xcd\xe8\xd1\xd8\x28\x5d\x79\x4f\x8a\x34\x4a\x1f\x4f\x2c\xed\x7f\x60\x28\xdd\x1c\x62\x14\x93\x26\xd4\x49\x4f\xae\x98\xdf\x62\xe9\x2d\x38\x95\x6f\xa1\x5c\x48\x9e\x6e\x1d\xdf\x0f\xff\x4c\x65\x9d\xea\xa7\xe8\xdc\x33\x8f\x87\x14\x69\xdc\xe7\xfc\x3d\x94\x6d\x7f\xb4\x46\x6d\x76\xf2\xf0\xef\x5c\x3c\x95\x13\xd3\xbe\xc8\xc6\xd9\xd9\xc3\xdd\x8a\x52\xf3\xce\x39\xc6\xfb\x28\xea\xdf\x69\xac\x9e\x2e\x3c\x91\x2f\xf0\xc8\x6d\x57\xa2\x53\xa0\x5f\xf7\x4e\xb0\x8a\x3f\x95\xd1\xea\x20\xfd\xd9\x61\xe1\x0c\x67\x0a\x42\x5a\x0e\xdd\x8b\x04\x23\x4c\xc2\x46\x59\x41\x46\x02\xdc\x9a\x34\xfd\x2c\xbe\xda\xb4\x22\x2b\xa4\xcc\x9e\xa7\x32\x5a\x64\xe3\x7c\x5e\xc5\xdd\x6e\x5c\xf2\xe8\xad\x53\x93\x28\x8d\xb6\xf3\x39\xa2\xe3\x4c\xbc\x7e\xe7\xbd\xce\xc7\x96\x5c\x18\x72\xaf\x77\x02\xdb\x4e\xcd\x38\x83\x44\x74\xd2\x52\x99\x9b\xd2\xe7\xcc\x85\x27\x34\xf4\x1d\xd5\x45\x54\x5f\x8f\xe8\x5d\x66\x77\x73\x74\x69\x57\xb9\x66\xde\xa5\x1a\xf5\x67\x21\x0f\x12\x11\x4b\x04\x88\x83\x2f\x95\x91\xd2\x9c\xfe\x16\xc1\x26\x99\x3f\x2e\xba\x73\xbc\x29\x1c\xeb\xbd\x15\xa0\xa2\xad\x91\xf3\x39\x84\x6c\xeb\x48\xa1\x3c\xb5\x9b\x10\x11\x17\xc4\xc1\x97\xca\x27\xed\xfa\xc1\x15\x0f\xde\x49\x8c\x76\x3c\x0f\x7f\x3d\xf1\x3a\x89\xff\xa1\x26\x19\xff\x53\x87\x26\xed\xe5\x0a\x87\xd6\x77\x0b\x90\xbb\x01\x71\xf0\xa5\x72\x27\xf5\xfd\xba\x92\x65\x1a\x8f\xd9\x21\x61\xbb\x08\xa6\x16\xc3\x75\xf7\x2f\xe7\x3e\xa1\x71\xbf\x3f\x1b\x68\xad\x77\xbf\x21\xf3\x25\x22\x2e\x88\x0b\x90\x24\xfc\xc7\x73\xe8\x91\x55\x72\xc8\x6b\x3e\x7e\x94\x19\x17\x23\xf3\x61\xf8\xb5\x6e\x17\x41\xfa\x73\x6e\xb9\x47\xde\x81\xc5\xb2\x59\x9b\x8c\x0b\x2c\x08\xd7\x04\xe2\xa0\x02\xe7\xbf\x1b\x67\xd0\x0b\x7d\x92\x04\xcc\x58\xdd\x52\x38\x55\x33\xef\xd4\x90\xa5\x36\x04\x3e\x99\x78\x9d\xf8\x8c\xcc\x29\xc9\xe6\x97\xb9\xed\x65\xa9\x32\x83\x81\x6d\xe8\x24\x25\x88\x83\x4b\xa0\xfd\x02\xcf\x7b\x02\x8f\x3b\x93\x62\x86\x23\xa4\xeb\xef\x2c\xd9\x2b\x56\x2e\xff\xb4\xcf\x64\xda\x68\x5f\x34\x59\xd0\xd3\xd0\x85\xba\x29\x83\x38\xb8\x04\x2e\xc8\x69\x74\x64\x7c\xd9\xde\xf0\x9e\xfd\x75\x59\x2e\xcf\xe2\x0c\xb5\x49\x7a\x70\xba\xc0\xf2\x40\xb2\x99\x58\x5e\x00\x0f\xd9\x67\x44\x5c\x10\x07\x97\x40\x12\x7f\x53\x10\xd5\x81\x22\x87\xc9\xce\xe4\x6e\x5c\x85\x20\x76\x45\xd8\x5b\x16\xc5\x1f\x0f\x7e\xb7\x31\xfa\x8e\xb2\x58\x5f\x8f\x42\xc4\x05\x71\x70\x09\xdc\x26\x0d\x1d\xd3\x27\x58\xdd\x3f\x38\x0c\x65\xe9\xfd\x15\x42\x2a\x81\x3a\x6c\x95\x41\xc2\xbe\xbd\x30\xf2\x80\x53\x69\xbc\xf8\x11\x62\xb7\x04\xe2\xa0\xca\x46\xae\xbf\xef\x98\x41\xb3\xeb\x49\x1a\xb8\xb3\xda\x65\xdd\x67\xf6\xb5\xff\xba\x86\x3f\xfe\x9b\xd2\x5f\x3f\x2f\xfa\x32\x2c\xda\x5d\xff\xe1\xf6\xcc\x1c\xf5\x8e\xbb\x67\x9d\x21\x62\xec\x20\x0e\xae\x01\xc7\x80\x22\xff\x19\x2e\x61\xd7\xd7\x29\x3d\xbb\x14\xde\x06\x6b\xe2\x76\x0a\xfd\xb6\x17\xd9\xf5\x18\x7a\x38\x13\x9e\x6b\x9f\xf7\x81\x92\x32\x00\x0e\xae\x81\xb8\xe4\x74\x65\xd5\x2e\x02\x11\x72\xd3\x71\x53\xed\xa6\xcd\xd5\x90\xef\x37\x8c\x1f\xa1\x05\x78\x39\x52\x6b\xd0\x46\x46\xe0\x62\x41\x27\xcb\x01\x1c\x5c\x03\x9f\x62\x92\x53\x66\x72\x0d\xa2\x27\xd9\xdd\x17\x8d\x1c\xad\x3e\xb5\xdf\xbf\xda\x30\x6c\x34\xda\x28\x1f\x42\xdd\x8b\x1f\xca\x06\x9d\x54\x05\x71\x70\x0d\xb4\x94\xa9\xd5\xac\xd8\x13\xfd\xda\x3b\x63\xd6\xa6\x86\xc3\x32\xe0\x67\x13\x6f\xbf\x91\x25\x1a\x2f\x33\x56\x18\xd2\x68\x81\xd3\x81\xd0\x00\x88\x83\x2a\x1b\x01\xce\x19\xb4\xd4\x9d\xa4\x81\x7c\xdd\xce\xc0\x95\x1b\xef\x27\xed\x9d\xc9\xed\xb4\x9b\x2c\xf6\x12\xbf\x2f\x44\xa7\xb1\x4f\xb6\x05\x38\xce\x2c\xa2\x2a\x7e\x85\x4e\xa7\x82\x38\xb8\x06\x96\x57\xd1\x76\xdb\x2a\x3c\xee\xcc\x8e\x6e\x3c\x36\xa5\xfc\x2a\x31\xd8\x30\x16\x61\x9f\x3c\x2d\xa2\xd6\x7b\xe4\x2c\x9d\xf7\x08\xea\x0c\x06\xe2\x90\xce\x1e\x55\xcb\x5b\xaf\xa9\x9d\x75\xb6\xc9\x9f\xa0\xb6\x0c\xeb\x74\xed\xe9\xc4\xfb\x6e\x30\x2b\x2b\x2b\x8c\x7e\xe5\xeb\x80\xda\x0c\x54\xe5\x0e\xe2\xe0\x1a\x50\xb1\xfc\xfd\x71\xbd\x2a\xbf\x76\xdb\x8e\x5c\xfc\x35\x5d\x5a\xdf\x43\x17\x9d\xba\x54\x93\x31\x8d\xdc\xdc\x15\x27\xcd\xc6\x02\x73\xa8\x1a\x17\xc0\xc1\x35\x60\x81\xad\x53\x1e\x1b\x69\x69\xea\xba\xfd\xf5\x2b\xc9\x19\x9f\xb1\x74\x81\x0e\xcd\x07\xcf\x29\x13\xf9\x5e\x46\x6d\x1a\xee\xd8\xb5\x22\x34\x00\xe2\xa0\x79\x40\xe7\xef\x1a\x00\xed\x3b\x4e\xd2\x80\x3e\x65\x6e\xd2\xda\x7c\x68\x27\x16\x9d\x12\xab\xed\xc2\xe5\x32\x62\x5e\x6c\x59\xbc\x0a\xa1\xd0\x56\xe5\x94\xae\x4e\xfc\x55\x63\xc4\xd8\x41\x1c\x5c\x03\xfa\x72\xf7\xdc\x42\x32\xaf\x0f\xab\x68\x62\x9a\x6b\x3b\xac\xf6\xcb\x95\xa8\x51\x3c\x95\xfa\x76\x37\xcf\x71\x79\x31\x86\x6f\x6f\x14\x8a\x0b\xe0\xe0\x1a\x70\xe6\x5e\x6a\x88\x12\x8d\x6a\xb6\xff\xf9\x83\x6d\x79\x0c\x9b\x9d\xd5\x83\x3f\x6f\x5a\x83\xda\x6f\xa6\x2e\xfa\x4d\x54\xf3\xb4\x16\x22\x2e\x88\x83\x6b\xe0\x3c\x59\x36\xbe\xe7\x3d\xda\x4f\x11\xd9\x21\x43\xd9\x84\xa2\x05\x9f\xae\x17\xda\xd9\x04\xb7\x6a\x38\xcc\x2d\x0f\x09\xb5\x97\xbb\x22\xe2\x82\x38\xb8\x06\x48\x8d\xfb\xd3\x53\xba\x09\x97\xcb\x13\xac\xf4\x71\x5f\xae\x0b\x5a\xf9\x31\x6c\xc4\xb3\x65\xce\x63\xdd\x7f\xf6\xee\x43\xcc\x65\xa8\x62\x03\xc4\x41\xf3\x00\xc0\x39\x83\x4c\xd4\xc9\xce\xf9\x0b\x59\x77\xe4\x37\x9a\xd2\x33\x8c\x74\x52\x4f\x82\xb3\xe3\x4d\xe7\xec\xa2\x5d\x3c\xfd\x3d\xd6\xc9\xbe\x5e\xbf\x97\x45\x3f\x05\xf9\x5b\x10\x87\xec\x9c\x0d\xfa\x26\xb9\xff\x3f\xe6\xde\x3a\x28\xcb\xe7\xfd\xfb\xa6\x53\x42\x01\x41\xba\x1b\x91\x32\xe8\xee\x12\x54\x10\x44\x40\x42\x10\x01\x49\xe9\x90\x6e\x90\x06\x01\x11\x91\x2e\x51\xa4\x45\x40\x04\x54\x5a\x90\x10\xa4\xa5\xbb\xeb\x99\xdf\xef\x9e\xeb\xbc\xfd\x9c\x17\xf3\xd9\xef\x3c\xc3\xcc\xfd\xfd\xff\x35\x07\xee\xe9\xfb\xda\x63\xdf\xbb\x7b\x1c\xdb\x30\xbc\xcd\x11\x4b\x91\xa1\x4f\xdc\x12\x1f\xe8\xfc\x26\x7c\xbf\xef\x45\x53\xed\xf3\x1f\xa6\xbd\xfa\x01\x73\xf9\x88\xc8\x20\x0e\xd9\x39\x5f\x7f\x5f\x44\xea\x5b\xdf\x95\xf9\x84\x01\x3b\xc3\xa5\xcf\xad\x4a\x6f\xf3\x5c\x47\x4a\x8c\x30\xfa\x5d\x1a\xe5\x0e\xd3\x89\x52\x0d\x44\x64\x10\xf7\x3f\xce\x19\xe3\x9f\x55\xd9\xa0\x17\x9c\x11\x46\x58\x48\xf2\x59\x9a\xdd\x8d\xc6\xa6\xa2\x87\xb5\x9c\x2b\x91\x3c\x2f\x1a\xc5\x70\x8d\xd3\x2a\x1f\x60\x4f\xdf\x74\x1e\xf2\xe0\x7f\xde\xf2\xb7\x11\x36\x67\x43\xd5\xb8\x62\xb6\xf0\x20\xbd\xca\x5c\xd0\xf9\xe9\xb9\xce\x30\xad\xcc\xab\x69\xae\x91\xd5\x97\x04\x05\x3d\x59\x48\x3f\xe7\xfc\x85\x16\x9b\xcd\x07\xe3\xb9\x32\x2f\xf4\x33\x69\x4e\xaf\xd9\xf0\x53\xfd\x12\x90\xb8\x4d\xb2\xbf\x7a\x65\x59\xe5\x11\xd6\xaf\x4b\x0a\xbd\xff\x6d\x46\x18\x34\xb4\xbf\x0b\x96\x91\x8c\xb0\xc8\xab\x57\x53\xac\xb8\x0b\x32\xce\x81\x6d\x19\x01\x59\xad\x34\x6c\x0e\x77\xb8\x32\xd4\x87\xe9\x02\x08\xc6\xde\x67\x16\x1d\x71\x9d\xc9\xe1\x26\xb2\x11\xde\x3e\xac\x79\xec\xb2\xa8\xc7\xf2\x25\x97\x8b\x63\x20\x3a\xe7\xb5\xab\x6b\x71\x39\xdf\x93\x34\x95\xd2\x15\x6d\x3a\x46\xff\x9b\x67\xd2\x21\xbb\x01\xd9\x08\x3f\xd0\xb4\x29\xf3\xc5\xf9\xfa\xb9\x45\xd5\x9f\x70\xeb\x76\x27\x8b\x4c\xb5\x90\x7b\x70\x69\x6e\x64\x5a\xb1\xae\x4b\x0f\xfa\xcc\xf6\x99\x8c\x16\xd9\x08\x4f\xf7\x4f\xed\xde\xb7\x23\x5f\x78\xa1\xd7\xa1\x13\xcd\x83\x29\xa4\xb0\xab\x26\x4f\xfe\x42\x1c\xfb\xad\x14\x0a\x7e\x4a\xdd\x45\xf4\x33\x19\x2d\xb2\x11\x4e\x5e\x7b\x18\xd9\xa0\xb1\xc0\x5c\xcd\xd8\xcb\xc8\xc3\x3a\xae\x1a\x7f\xa3\xa7\xf4\xee\xb9\xdd\x3b\x96\x4f\x0e\x72\x42\xed\xa3\xff\x9c\x99\x11\x06\x89\xe8\xb4\xcc\x17\x63\x6d\xd8\x14\xfd\x78\x43\x7a\x95\x41\xf2\xeb\xea\x2a\x7f\xef\x5d\xd1\x11\x5b\xb3\x0e\xab\x45\xbc\x12\x95\x1f\xfa\x99\xdb\xd0\x49\x2f\x88\x43\x7a\x91\x79\x60\x45\x86\xb8\x92\x61\x0c\xab\x45\x2c\x2c\x63\xd6\xab\x89\xff\xe6\x1c\xce\x8e\xc3\x3d\x59\xcd\x27\x3a\x22\xab\xe8\x77\x6c\xa0\xe3\x38\x00\x07\xcf\x7c\xe2\x6b\xf1\x4e\xb1\x0d\x59\x4f\x2f\x11\xaa\xde\x09\xd2\x76\x66\x7c\x2b\xe4\xc0\xea\x66\x20\xb7\x20\xd3\xec\x71\xa8\xbf\x7f\x6b\x0f\x11\x17\xc4\xc1\x33\x5f\x10\xb9\xc4\xd6\x9c\x79\x11\x6a\x70\xc2\x0d\x1f\x47\xd6\xb9\x7c\x49\x73\x03\x9a\x81\x45\xcb\x58\xda\x73\x12\xe2\x4e\x8f\x5b\xa1\x3b\x67\x20\x0e\xfe\x1d\xe4\x95\x87\x2f\x1f\xfd\x49\xb7\xbf\xef\x3a\x4d\x97\x4b\xb2\x1c\xba\xe3\xc4\x45\xb1\xc9\xaa\x5b\xd2\x70\xc3\x76\xf6\x8a\xa2\x95\x25\xc2\x08\x83\x38\xa8\x62\xf9\xdf\x8d\x30\xe8\x07\x7d\x9a\x04\x98\x7c\xff\x38\xea\xc9\x97\x38\x46\x15\x6c\x9b\xda\x7e\xcc\x74\xc0\xa9\xbb\x1d\xdb\x51\x60\xed\xf4\x80\x1e\x3d\x52\x37\xf4\x63\x27\x74\x85\x11\xc0\x21\xdd\xbc\x2e\xa3\x6a\x2c\x44\x6d\xf1\x89\x31\x2b\x67\x3c\x90\x28\xc6\x29\x47\xf3\xc7\x17\x50\x3d\xc6\xd5\xea\x6e\x99\xac\xee\xa0\x4d\x84\x6e\x5e\x03\x38\xb8\x04\x16\x65\xa8\xcb\xb1\x5d\xaa\x0b\xce\x3f\xd7\x2e\x12\xf2\x1d\xff\x44\x17\x73\xa5\x7c\x9b\xe6\xe7\x55\x1a\xf9\x6b\x19\x98\xa9\xa5\xd0\xe2\x07\xc4\xc1\x25\x70\x2d\x5f\xe1\xbd\xef\xe3\xa6\xf3\xc7\xef\x1d\x7c\x69\x5e\x1d\x5f\x78\xc7\xb9\x29\x1d\xf9\x41\x59\x3a\x31\x86\xcb\x38\xf1\xea\x16\x74\x74\x04\xe2\xe0\xdf\x61\xb8\xf1\xca\xe5\x99\x49\xb1\x28\xbe\x90\x2c\x86\x7a\x33\x1a\x31\x27\xce\xb7\x1d\xaf\x58\xda\xae\x51\xb6\x79\x61\x63\x38\x95\xbc\x40\x2c\x7e\x40\x1c\x54\xaa\x08\x30\xc2\xa0\xd9\xf5\x34\x0d\xdc\x9c\x9c\xad\x0b\x11\xc9\xf1\x2c\xaa\x1a\xde\x7b\x64\xbb\x95\xee\x82\x39\x75\xe1\x45\x20\x7f\xbf\xea\xeb\xab\x55\xd1\xed\x42\x50\x83\x01\x10\x07\x1f\x3b\x8d\xb2\x0b\x65\x6f\x9e\x63\x2d\x9f\xd1\xe6\xc9\x9c\xd7\x4f\x4e\x71\xd4\x3f\xf2\x06\xc2\x52\xee\x5c\x12\x26\x58\xa3\x9e\xc9\x2f\x11\x71\x41\x1c\x5c\x03\xb1\x02\x7f\x32\x67\xde\x4a\x67\xcd\xe3\x47\xde\xbc\xec\x45\x7f\x3d\x2c\x24\xa4\x5b\xe0\x63\xce\xb1\x21\xfd\x42\xd7\xee\x92\xa4\x02\x22\x2e\x88\x83\x6b\xc0\xa0\xd7\x6e\x4f\x6d\x26\x9b\x56\x51\x33\xc1\xf2\x6a\x9c\x30\x4f\xbd\x4f\xe8\x87\x76\xe7\x1e\xec\x99\xbe\xe0\x1b\xbb\xaf\xaf\x64\x23\xe2\x82\x38\xa4\xe9\xf0\x47\x7f\xa6\x70\xe2\x79\x54\xc5\x27\x9b\xda\xe3\xad\xb2\xf4\x8b\x8d\xab\x1d\xea\x2a\xf1\x9b\xbf\x33\xfd\x42\x7e\xaa\x32\xb2\x21\x34\x00\xe2\xa0\x52\x45\x80\x11\x06\xa5\xba\xd3\x34\xf0\xab\xe2\xb3\x97\x85\x9a\x7a\x24\xb9\x1c\xbb\x7f\x08\x46\xa6\xcf\x1c\x7b\xcd\x37\xfd\x5b\xb4\xf7\xe8\x48\x47\xdd\x4c\x16\xf4\xa0\x76\xc3\x20\x0e\x3e\xf6\x27\xc2\x68\x5b\x4d\x82\x72\x44\x62\x27\xe5\x22\x74\xa8\x23\x56\x06\x8f\x75\xdb\x1e\x2e\xe7\x51\x77\x5d\x98\x94\xe4\x0c\xc3\x83\x9a\x41\x80\x38\xa4\x6b\xb7\x8a\xa9\x7c\x5a\xc7\x61\x8d\x8b\xdd\x9b\x83\x81\x7d\x76\xfe\xb1\x57\xe7\xe3\x86\xa6\xe3\xf0\x85\x68\x16\x84\x2c\x4a\xcf\x43\x2f\xbe\x83\x38\xb8\x06\xa8\xd5\xf5\x92\x14\xb3\xef\xa2\xcb\x8c\x5d\xef\x9e\x67\x23\xe7\x1f\x34\x67\xc4\xf9\x5a\x7c\x6f\xe4\x42\xfc\x17\xaf\xe5\x2e\x74\xa8\xe3\x1f\x88\x83\x7f\x87\x9e\x8f\x64\x5c\xe5\x58\xbf\xe7\xb6\x6e\x5d\x5d\x71\x88\x95\x73\xe4\xfa\x46\x95\x1a\xbc\x79\xd1\x29\xca\xd0\xf9\x33\x51\xd2\x00\x74\xf5\x1a\xc4\x41\xf3\x00\xc0\x08\x83\xd6\x1d\xa7\x69\x40\x77\xd4\x63\xdd\xfd\x8e\x5a\x34\xe6\x0a\x87\x4f\x18\xee\xbe\x33\x3b\xf9\x0b\x9b\xfa\xb1\x92\xc4\xef\x3d\x6f\x7a\xde\x99\x2d\x19\x21\xc6\x0e\xe2\xe0\x63\x2f\xe8\x3a\x8a\xe7\x6e\xc4\xa2\x8a\x63\x89\xf1\xf2\x5a\xb5\x26\x70\xbe\x12\x77\x17\x1b\xaf\x97\xb4\x2e\x61\x8c\x90\x47\x69\xab\x1a\xaa\x96\x01\x70\x48\xfb\xe2\x4c\x61\x5b\x9c\x51\xd5\xdb\x1b\x59\x35\x5d\x52\x75\x2c\x89\x34\x34\x18\xf7\x78\xde\x6b\x24\xfd\xc6\xe6\x5f\x75\xdc\x6e\xbd\x0b\xed\x8b\x03\x38\xb8\x06\x24\x6f\x88\x2c\x09\x4b\x5c\x36\x0d\xd4\x94\xf1\x21\xbc\x6a\xca\x75\x7e\xd9\xcf\x4f\x2d\x31\x2d\x55\x49\xf8\x03\x1e\x4f\xdb\x9e\x1d\x22\x2e\x88\x83\x7f\x87\x9d\x73\x5f\x87\x7e\x0e\x3c\xa7\xdb\xac\x9a\x6f\x0b\x38\x91\x33\xf2\xfe\xb8\x49\xf4\xb8\x31\x1c\x7b\xcb\xf3\xc2\xf4\xa3\x04\xf4\xaf\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\x90\x89\x3a\xdd\x08\xaf\x14\x8a\x0f\xa1\x9a\xcd\x4e\x49\x1c\xde\xd5\xbf\x37\xaf\x86\x1e\xaf\x40\x4a\xeb\x2b\x53\xdb\x55\xc7\x5e\xc6\x53\xd7\xf7\x4d\x18\x61\x2a\x41\x1c\xb2\x11\xfe\x21\xa4\x83\x4a\xb9\x4f\x1c\x76\x6e\x93\xf1\x4e\xa9\xa8\x24\xcd\x0f\xbb\x19\x6a\xd6\xaa\x6c\x26\xb6\xf3\x4d\xbf\xda\xa7\x1e\x58\x23\x22\x83\x38\x64\x23\x9c\xba\x76\x4e\xb6\x27\xdf\xac\x57\x80\xa1\x6d\xd5\x97\x2e\x95\xf4\xa6\x55\xdb\x3a\x2f\x6d\x84\xa9\xc3\x90\xa3\xf9\xa5\x5f\x52\xb8\x88\xc8\x20\xee\xff\x34\xe4\xfa\x3b\x32\xf0\x49\x66\x84\x11\xd6\xb5\x55\x0f\x09\xf4\xe0\x56\x5c\xdf\x54\xfe\x3c\x16\xaa\x33\x15\xb7\xcc\x3d\xe5\x6f\x33\x9f\xf9\xf9\x89\xfb\x08\x53\xd3\x30\xd7\xdf\x46\xb8\xc6\xab\xeb\x90\xf7\x79\xdf\xf0\x12\x53\xf8\x7b\x03\x0c\x9b\x9f\xd1\x63\x16\xf2\x6f\x44\xec\xc5\xfb\xeb\x64\x5a\x4a\x69\xb4\x6f\xfe\x85\x1e\x55\x5e\x57\xbc\xf8\xed\x61\xf1\xa3\xa3\x6e\xd5\xd7\x3f\x1c\xec\x2e\x84\x5e\xc1\x79\xab\x7a\xa0\x9a\xf1\xe6\xb6\x97\xae\x81\x98\xc9\x7f\x9b\x11\x06\x0d\xed\xef\x0a\x64\x39\xb8\x59\xaa\x64\xa2\xb8\xb6\x89\xcd\x11\x2f\x54\xcd\xab\x76\x21\x84\x42\x75\x3e\x42\xe2\x9e\x37\xfb\x05\x62\xde\x77\x19\xe5\x42\xfb\x2e\x06\x67\x72\x58\x89\x6c\x84\xbd\x6b\xf6\xc9\x1c\x48\x3d\x7c\xd5\x53\xbf\xaa\x14\x09\xf8\xbe\x2d\xec\x9a\x6a\x5c\x1e\xcc\xf2\xbd\xe1\x56\x39\xec\xce\xf3\x6c\xf8\x4c\x8e\x66\x45\x91\xaf\x52\xcb\x5c\x93\x3a\xff\x69\xf9\x38\x6f\x9d\x42\x1e\x5d\xb5\x6d\x53\xbc\xbf\x5e\xd4\xec\x47\x1c\xed\x44\x56\x88\x3b\xc1\x91\xfd\x19\x34\xb3\x0a\x93\xf5\x41\x36\xc2\x42\x22\xdf\xe3\x34\xeb\xe9\xb3\xd4\x5a\xe6\x82\xcb\x2d\xae\x15\xfe\xfc\x20\x34\xff\x95\x30\x56\xe5\xe7\x73\xad\x0f\xcd\xda\xfe\x54\x67\x32\x5a\x07\xa4\x3f\xcb\x7d\xc9\xe8\xad\x6d\x08\xa1\xc3\x79\xe7\x6f\x4f\xa8\x4b\x5c\xf0\xd1\x09\x78\xf4\x92\xc5\x37\xde\x29\x3d\x79\xa3\xde\x22\xb4\x90\x75\x66\x46\x18\x24\xa2\xd3\x32\x9f\xc2\x8e\x2c\x3e\x65\x4c\xa4\x52\xdb\x09\x7f\x92\x65\x2f\xdb\xed\x1c\x6e\x1a\xbe\x47\x14\x3e\xb3\xf4\x6a\x46\x68\x58\x5a\x47\xae\x88\x19\x1f\xc4\xc1\x67\xfc\x4a\xac\x8b\x64\x81\x99\xcf\xbc\xea\x8a\xb5\xc2\x6b\x5c\x9c\x62\xf2\x9f\xdb\x05\x2f\xe5\x39\x3c\xd3\x50\xf0\x72\x34\xb5\xb5\x84\x2e\x25\x82\x38\x78\xe6\xcb\xf1\x7e\x5e\x5c\x6c\xd2\x31\x6d\xef\x4b\xa7\x61\x55\xa6\x71\x13\x53\xef\x7a\xb8\x76\x8e\x78\x3f\x99\xf5\x1a\xb6\x75\xe7\xff\xbd\xa2\x0d\xe2\xe0\x99\x2f\xeb\x9b\xee\xe5\x83\xe1\xa8\xf1\x0c\xbe\x5b\x7b\xc6\x59\x47\x11\x6d\x7c\x3f\xbd\x0f\x15\x14\x28\x29\x8b\xd7\xec\x8a\x6e\x48\xfd\x42\xc4\x05\x71\x7e\xd2\x28\x38\x7f\xc7\xcd\xac\x45\x49\xf8\xe4\x30\xb8\xed\x65\x3c\x12\xb2\x36\x45\x59\x8a\x11\x9e\xfe\xf5\xd7\x94\x90\xfc\xe1\x61\x1e\xde\x2f\x82\x87\xb6\x08\x23\x0c\xe2\xa0\x12\x64\xb9\x7f\x5d\xfc\x80\x7e\xd0\xa7\x49\xe0\x46\xbc\x92\xd5\x32\x23\x56\xbc\x61\xdf\x0d\xd4\xd4\xfc\x96\x8f\x71\xaf\xef\xfd\xd0\xba\x44\x83\xc3\x68\xb5\xd2\x8c\x15\xfe\x19\xea\x77\x0c\xe2\xe0\x12\xf0\xaf\x54\x7a\x7e\xab\x8d\x48\xe8\xc2\xea\x36\x67\x0b\xb6\x76\x28\xfb\x18\xea\x6f\x25\x33\x2b\x0c\x0e\xd3\x96\x2f\xce\x7d\x69\xd0\x42\x15\xc4\xc1\x25\x10\xfe\xcc\xa6\x93\xd3\x0c\x4f\x98\xd5\x9d\x44\xb5\x43\xea\x72\xeb\x3e\xca\xf8\x9e\xe9\x0c\xa5\x99\xed\x23\xed\x23\xef\x92\x4d\x63\x44\x5c\x10\x87\x74\x0a\xe0\x12\x16\xdd\x39\x24\xf8\x10\xc7\x26\x93\xa2\xec\xe5\x47\xe6\x92\x85\xbd\xd8\x7b\xd2\x97\x88\x43\xf3\x25\x98\x24\xef\xb7\x42\xad\xc6\x40\x1c\x5c\x02\x8e\xad\xbc\xd2\x1c\x2e\xcd\x28\xc1\xb5\x84\x01\x79\x97\x79\x9c\xc2\xa4\x7f\xfc\x64\xfd\x93\xdd\xba\x53\xed\x79\x1c\xbb\xac\x64\x8d\x58\xfc\x80\x38\xa8\xf6\x10\x60\x84\x41\xb3\xeb\x69\x1a\xa0\xa9\x0b\x75\x0a\x17\x91\xe6\xb7\x7a\x47\x6b\xc3\x8f\x23\xbb\x93\xa3\x46\x3c\x18\x28\xe7\xb6\x7e\x24\x6f\x18\x1d\xa3\xb3\x02\x95\x8b\x83\x38\xb8\x06\x1c\xf0\xba\xee\xbc\xa5\x7e\x38\xdc\x3c\x1c\xb3\xd8\x72\xee\xc6\x65\x21\xb5\xb5\xc3\x65\x12\x42\x19\xde\x5f\x86\xa2\x42\xe1\x25\x50\x67\x40\x10\x87\x74\x8f\xf6\x7a\x42\x63\x89\xbe\xb4\xc2\x4d\x61\xe1\x05\x46\xd7\xc2\xb6\xb2\x0b\x49\x47\x31\x58\xe8\x49\xcd\x52\xae\xf5\x7b\x93\x0b\xc2\xd0\x3d\x5a\x00\x87\x74\x9d\x1e\x0f\xcf\xb8\x4d\xd7\x22\x43\x64\x6e\xc9\x4f\x50\x4d\xe1\x7b\xad\xec\x7e\xf8\x0a\x3d\x7b\xb6\xcd\xd6\x9b\xeb\xdc\x89\x3e\x28\xd0\xfe\x1d\x80\x83\x6b\x20\x3f\x6f\x98\xde\x7f\x7a\x7d\xc7\x94\x55\x8e\xe3\x6a\xef\xcb\xb5\xe7\x31\x57\x12\x05\xd7\x0a\x43\x0c\xe8\x37\x05\xa3\xb5\x35\x48\x10\x1a\x00\x71\x50\xed\xa1\xe8\xbf\x6b\x00\x94\xea\x4e\xd3\xc0\xf3\x2a\x8d\x80\xb9\x50\x65\x6a\x01\x8b\xe5\x66\x16\x6a\x27\xdf\x6e\x95\x97\xe4\x32\xd7\x7e\xb7\x60\x0a\xfe\xa0\x31\x99\x2e\x13\x43\x8c\x1d\xc4\xc1\x35\x10\x93\x4f\x76\xd1\x00\xe3\x87\x85\xc7\x71\xb2\xea\xe3\x10\xaa\x65\xd6\xd2\x8c\xd5\x2e\x96\xfc\x05\x33\xae\x9b\x03\x8b\x78\x19\xfb\xd0\x5e\x2b\x80\x83\x6b\x60\x8a\xfd\xa8\x30\x46\x7e\xb8\x74\xa8\xd4\x5b\xcf\xd4\x80\x5e\xa4\xaf\x82\xab\x78\xf8\x9d\x84\x7e\x95\x60\x63\x3d\x03\x3d\x4b\x21\x22\x2e\x88\x83\x6b\x40\x07\xe3\xed\xfe\x75\x5a\x4e\x1c\xdb\x13\x4e\x6e\xaf\xd0\x92\x0a\x54\x43\xa6\x8b\x8c\x91\xbb\x07\xd8\x2f\x09\x51\x06\x98\xd0\x7e\x42\xf7\xf4\x01\x1c\x5c\x03\x85\xe7\xa3\x87\x68\xe5\x5e\x3f\x5d\x4c\xc3\x96\xb6\x23\x2f\xc5\xc1\x7d\x8e\x3f\xc8\xee\xfb\xf1\xe8\x85\x53\x9b\x5d\xb2\xb5\x41\x36\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\x4d\x03\x77\x36\xaf\x0b\x78\xdd\x09\xfe\x83\x8b\xce\x9f\x34\x9d\xa6\x7c\x69\x72\x77\x50\x80\x68\xfa\x75\xf8\xf7\x4b\xaf\xb5\xf8\xdb\x1f\xe0\x23\xc6\x0e\xe2\xe0\x1a\xf0\x4b\x38\x69\xa7\xbd\x63\xc4\x9c\x58\x9a\xae\x90\xe8\x70\x61\x92\xdf\x92\x3b\x26\x39\x33\x56\xf1\x81\x0a\x41\x19\xdb\x06\x26\x74\xe3\x04\xc4\xc1\x35\xb0\x7b\x9e\xe8\x9a\x94\x59\x7b\x1e\x31\xc6\xb3\xf6\xbb\x5e\xc9\xc4\x3c\x84\x73\x62\x2c\xb3\x09\x8d\xe8\x0c\x7c\xfe\xb8\xa3\x0c\xa9\x50\xad\x30\x80\x83\x6b\xe0\x95\x6b\x8d\x45\x09\x5d\x67\x4b\xc4\xe8\x0b\xaf\x74\xbb\xba\xae\x83\x48\x02\x1c\x9b\x15\x77\x86\x17\xc7\x93\x5d\x74\xae\x24\x90\x71\x07\x71\x70\x0d\xa4\xc9\x34\xc7\x8b\xee\xe0\x07\x50\xbd\xf9\xfe\x66\x20\xac\xc5\xc4\x78\xf0\xf7\x8f\x45\xb2\x9c\xe8\x75\xe5\x4d\x4d\x53\x83\x26\x3d\x84\x06\x40\x1c\x34\x0f\x38\xfc\xbb\x11\x06\x99\xa8\xd3\x8d\xb0\x63\x8f\x6c\x46\x8a\xf5\xb2\x98\x72\x96\x99\x51\x69\x0f\x2f\x57\x1b\x4b\xed\xd8\xb7\x69\xb3\x39\x22\xce\xc3\x7b\x5f\xf6\x9c\x6a\x11\xa6\x12\xc4\x21\x1b\xe1\x18\xab\x34\x8f\xac\xea\x11\x92\x24\x34\xa3\x2b\x6c\x97\x8c\x46\x51\x17\xc7\xc7\x57\x50\xdf\x71\x4e\x93\xdc\xe8\x0b\x18\xd5\x5f\x43\x44\x06\x71\xc8\x46\xb8\x72\x02\x95\x85\xa0\xf7\xb9\xc7\x56\xd4\x3b\x99\xfb\xe8\x8e\x57\x03\xeb\xe7\xc5\x8b\x4f\xde\x54\xca\xfb\xbe\x69\xa3\x20\x6c\x77\x44\x44\x06\x71\xff\x63\x84\xff\xd9\xa7\x1c\xf8\xc6\x32\xc2\x08\x87\x3f\x4b\xf1\x70\xc6\x0b\xb0\xa7\x38\x1c\x24\xa9\xfa\x56\x2c\x28\x95\xd7\x4c\x91\x6d\xcb\x31\x20\x35\xc9\x11\x24\x98\x6b\xfc\x8f\xa7\x9f\x12\x9e\x09\x54\xe5\x31\x73\xdf\xe1\x99\xb9\x2d\x90\x77\x94\x37\xd8\x60\x24\x33\xb5\xc5\x96\xa7\x1f\x18\x1b\x1a\xb8\x20\xef\x6d\xf3\x17\xea\xd5\xda\x49\x67\x80\x21\x2f\x1d\x17\xef\x71\x18\x4e\x3a\x9b\xbb\x3c\x3a\x67\x6f\xd9\xff\xeb\x69\xd2\x89\xdb\xd6\x79\x91\x89\xe1\xff\x36\x23\x0c\x1a\xda\xdf\x25\xc5\x48\x46\x58\xbf\x44\x42\xbb\x23\xae\x20\x6f\xf3\xe1\xe5\x1b\x22\x6a\xf9\x34\x6f\x37\xbd\x83\x3b\x73\x56\x2d\xf5\xf9\xcc\x1b\xc4\x1b\xf4\x5b\xce\xe4\xb0\x12\xd9\x08\xa3\xab\xa5\x69\x66\x56\x9f\x94\xf3\x8d\x1d\xaa\x91\x9f\xc8\xda\xa9\xd1\xc8\xbc\x49\xfb\xdd\xae\xfb\xe3\xe9\x5c\xe9\xd3\xef\x3a\xca\x67\x72\x34\x8b\x6c\x84\x5f\x3f\x7e\x8d\xf9\x44\x23\x58\xeb\x3c\xfb\xa5\xa0\x84\x1b\x5b\x8b\x19\xfc\xa9\xcd\xcd\x39\xe1\x6a\xda\xea\x86\x9c\xe6\xab\x9c\xce\x67\x32\x5a\x64\x23\xec\x67\xd5\xe6\xf6\xbc\x50\x69\x42\xcc\x79\x2d\x68\x81\x7f\xf6\xe5\x94\xd3\x64\x47\xe3\x92\x8e\x16\xcd\xba\x70\x25\x57\x82\x07\xc1\x99\x8c\x16\xd9\x08\xf3\x29\xcd\x19\x46\x05\x33\x63\x66\x54\x76\xf2\xb4\x6a\x6f\x8c\xde\xfb\x70\xdd\xfb\x02\x59\xca\x93\x5c\xce\x16\xb2\xf1\xb2\x45\xb5\x33\x33\xc2\x20\x11\x9d\x96\xf9\x0c\xcd\xc7\xf0\xac\x7d\x1b\x92\x2e\x16\x77\xb0\xe5\x1b\x55\x29\x56\x67\x64\x4f\x53\x28\xbf\xda\x30\x0a\xb8\xd1\xa7\x30\x8b\x03\xdd\x05\x04\x71\xf0\xcc\x27\x51\x75\xab\xde\xf0\x75\x7f\x89\xc3\x95\xa3\x68\x8d\x57\x0f\x5b\x6e\x3d\x3e\xe7\x49\x2f\x68\x99\xe5\xcf\xf0\x47\x42\x70\xb7\x06\x3a\xb6\x03\x71\xf0\xcc\xf7\x20\xb5\xb7\x2a\xd2\x4d\x41\x6c\xd2\x9e\x80\x9c\xad\xcd\xf3\xab\x2d\x53\x07\x8f\x19\xeb\x13\x29\x1e\x26\x6d\xcb\x35\x15\x27\xe8\xfe\x2a\x88\x83\x67\x3e\xff\x44\x27\x7c\xef\xf2\xc0\x74\xc7\xe5\x60\xf2\x7b\xf8\x5e\x96\x7b\xea\xc7\x9d\x49\x06\x7c\x94\xe9\xfa\x49\x7c\x4b\x4a\xee\x4a\x90\x6b\x03\x70\x7e\xd2\x28\x3e\xff\xa8\x75\xb9\xb9\x68\x5c\xce\x60\xe1\x38\x9d\xed\xd3\x26\x12\x37\xfa\x9e\x22\x68\x38\x57\xaf\x56\xb4\xa4\xf2\x16\xe3\x07\xbf\x65\xfa\x41\x84\x11\x06\x71\x50\x4d\xf1\xbf\x1b\x61\xd0\x0f\xfa\x34\x09\xd4\x33\x97\x76\x51\x10\xc8\x60\x4d\xa5\x87\x78\x3f\x70\x98\x98\x9c\xf4\x12\xea\x19\x62\xff\x3a\x88\x62\x5a\xaa\x5a\x51\xa6\x0f\xd5\xe8\x82\x38\xb8\x04\xe2\xee\xc4\xe5\xe8\xcc\xa7\xe8\xa2\xb0\x69\x3b\x46\x8c\x8d\x89\xaf\x7c\x7e\x62\xae\xa3\x18\x1c\x54\xd7\xcd\xb2\x37\xba\xb9\x1e\x09\x35\x02\x05\x70\x70\x09\x98\x3a\x3a\x68\xe3\x5c\x61\x1a\xca\xe6\x88\xc9\x50\x12\x79\xa2\x8a\xff\xfb\x59\xa6\xdf\xbc\x7c\xc8\xd2\x6d\xd7\x03\x91\xa0\x3e\x68\xb7\x1e\xc4\xc1\x25\x30\x4a\xd7\x15\xd1\x45\x7b\x13\x7f\x36\xe9\xed\x9e\xa9\x9e\xdc\x07\x1d\x9e\x5d\x32\x56\x6b\xa2\x9b\xf5\x27\x79\xc7\xc4\xe5\xb5\xb4\x50\x6f\x6c\x00\x07\x97\x80\x65\xfc\xcf\x0b\xac\xa1\xd4\xc1\x6a\xe6\x98\xa9\x03\x53\xe5\x83\xae\x8a\xf7\xe5\xaf\xec\x26\xf5\x30\x9c\x2b\xb0\xf8\x6c\xba\x60\x85\x58\xfc\x80\x38\xa8\x98\x10\x60\x84\x41\xb3\xeb\x69\x1a\x28\x7b\x64\xf9\x29\xd7\x88\x2c\xfe\x7b\xc5\x8c\x03\xe6\x17\x9a\x70\xe3\x73\x52\xcf\x8a\xbb\x33\xe3\x9f\x4a\x0e\x39\x91\xca\x54\x92\x40\xc5\x79\x00\x0e\xae\x01\x7e\x75\x67\xa2\x1a\x86\xa8\x06\x0f\x92\xeb\x58\x2f\xcd\xae\xa2\x7f\x2a\xeb\x64\x64\x60\x4a\x18\x27\xff\xa6\x72\xbf\x90\x28\x0a\xba\x68\x01\xe2\x90\x16\xc0\x31\x74\x33\xc4\x66\x49\xef\x26\xac\x0f\xfb\x7e\x6b\xe4\xbd\x3e\x7a\x93\x69\xe7\x33\x46\x60\x91\xf3\xd9\xeb\x4b\x34\xdd\x25\xe8\xc2\x09\x88\x43\xd2\xc0\x97\x5f\xdd\xa1\xf6\x97\x86\xae\x2f\xca\x1d\x5f\xcf\x12\x09\x96\x25\x4c\xf0\xb5\x9b\xe8\x7f\x61\x1e\x5a\x1a\xc8\xc9\x47\x94\x06\x69\x00\xc0\xc1\x35\x70\x57\xb9\x30\xa8\x46\x91\x6e\xa1\xba\x96\xca\xc1\x50\xc6\x25\x64\x2c\xb2\xd9\xa5\x74\xa2\x7b\x99\x79\xf5\x26\xc9\x21\x45\x95\x29\x42\x03\x20\x0e\x2a\x26\x04\x18\x61\x50\xaa\x3b\xf5\x44\x78\x5b\x5c\xa4\x3e\x22\xf5\xa3\x07\x1d\x5d\x02\xf5\x1b\x33\x13\x2c\x73\x81\x2f\xdb\x21\xf9\x77\xc3\x1d\x9f\xad\xbd\xa8\x95\x86\x1a\x26\x81\x38\xb8\x06\x84\xdc\x37\xf1\x42\x7e\xb6\xb1\x9a\x9d\x4f\xdc\xd7\xaf\x3f\xc6\xc1\x7d\xf0\x7e\xa3\xac\x89\x52\xf6\xe6\xeb\x93\x7e\x96\xd1\xf6\x3f\x88\xb8\x20\x0e\xae\x81\x47\x36\x6e\xa6\x6c\xc9\x2b\x74\xe7\x5c\xcd\xba\xef\xab\xe7\xf6\x5c\x5b\x49\x93\xec\xb8\x96\xe5\xc4\x29\x87\xaa\x5f\x9b\x4a\x0c\xcd\x03\x20\x0e\xae\x81\x2f\x29\x0c\x9b\x61\x34\x85\x5f\x44\xa6\xf1\x69\x76\xee\x0c\xbf\xa7\x5d\xf2\x51\x18\x70\xc1\xbd\xea\x2a\xd1\x8b\xfb\x32\xdd\xb5\x17\x11\x17\xc4\xc1\x35\xa0\x98\x63\xdf\xf1\xb6\x52\x27\x0c\x8d\x80\x69\xc8\x50\x80\xf8\x1c\xfe\xe8\xf1\x2a\xde\x8b\x2f\x4b\xcb\x4b\x26\xcf\x69\x2a\x9a\x21\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\xd4\xa7\x20\x85\x59\xb8\xa3\xb6\xa7\x99\x53\x50\x92\xac\x3b\xb5\xee\xad\x14\x8e\x2d\xc7\x2d\xc6\xcb\x88\xc5\xf7\x90\x7c\xe5\xcd\xf7\x70\x81\xc6\x0e\xe0\xe0\x1a\x68\x51\x52\xfd\xd1\xb3\x54\xbe\x3c\x6e\x93\x22\xa8\xf5\x36\xe6\x97\xca\x3a\xd5\xf8\xb7\xc8\x9f\x17\xe9\xa8\x9a\x1d\x23\x0f\x9a\xa0\xf4\x0a\xe2\xe0\x1a\x10\xd9\xf3\x30\x8e\x56\x5a\xaf\xfc\x18\xa4\xe4\x22\xaa\x6c\x4f\xef\xca\x55\xd3\x5e\x4a\x70\x97\xe4\x48\x46\x7d\xeb\x6b\x6d\x2b\x74\x95\x1b\xc4\xc1\x35\x90\xf4\x5e\xc9\x26\x4c\xac\xa7\xe0\xba\xb2\x07\x66\xa4\xc8\x0b\x81\xd8\x27\x2e\x4c\xdc\x91\xc5\xaf\x8f\x44\x46\xbc\x03\x50\x56\xa0\xa6\xdb\x20\x0e\xae\x81\xe6\xfd\xfd\x3d\x4a\xed\xef\xfd\x39\xf1\x5e\x01\xd4\x39\xe9\x18\x4d\x5f\xf0\x18\x3d\x1d\x5d\xae\x0f\x1e\x4a\x72\x36\xdd\xc1\x26\x46\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\x4c\xd4\xe9\x46\x98\x2d\xbc\xf4\xb1\xf3\x4a\xcf\x94\xe7\x35\xc2\x4d\x9f\x5d\x91\x38\x6c\x47\xac\x84\x56\xc1\x29\x57\xce\x1e\xa9\xa0\xdc\xbd\x74\x6a\xa8\x65\x16\x80\x43\x36\xc2\xa2\x9e\xb7\x03\x8b\x7c\x2c\xb0\xcf\x05\xff\xb4\xe6\xc6\x18\x56\x7f\x33\xb0\xc3\x69\x27\xf6\x19\xff\x6b\x88\xd1\x0b\xe2\xab\x2f\xee\x22\x22\x83\x38\x64\x23\x4c\x34\xf1\xda\x24\x7c\xc4\xf8\x43\x3e\x7d\xf1\x43\x21\xb9\x51\xc3\x70\x6e\x97\x80\x5c\x47\xce\x8c\x6b\x47\x4c\x9f\x2e\x5d\x3f\x17\x88\x88\x0c\xe2\xfe\xcf\xd3\xc6\xff\x30\xc2\xa0\x47\x93\x11\x46\x98\x95\x85\xf2\xc3\x9c\xb9\xea\x85\xaf\xb9\x0e\x2b\x25\xbf\x2d\x7b\xb1\x5a\x83\x4b\x2a\x28\x4f\xd0\x29\xe5\x8a\x54\x94\x85\x3f\xe2\xfd\x6d\x84\x17\x55\xcc\xd9\x3a\x7c\xb6\xaf\x36\x2e\x0e\xac\x16\x88\x73\x98\x3d\x69\x5f\xd5\xdc\x96\xd4\xa0\x0b\xd2\x99\xfc\xa9\x2a\x5d\x76\xfc\x17\x3a\xb6\xe2\xfb\x5b\xf1\x6d\x55\x2c\x95\x91\x2b\xcd\xdb\x73\x61\xec\x9c\xfc\xe2\xe5\x72\xcd\x63\x14\xf7\x92\x4c\x8b\xb2\xc5\xee\x91\xfd\xb7\x19\x61\xd0\xd0\xfe\xae\x11\x46\x32\xc2\x68\x4c\x8a\xea\x11\x27\xe3\xce\xc4\xad\x4f\xc7\xd3\x43\x7f\x9d\x2f\x47\xe9\x5d\xa6\x9c\xf2\x3d\x91\x2d\xfa\xf0\x74\x77\xce\xd0\xe5\x4c\x0e\x2b\xf9\x90\x3c\xda\xe1\x0a\x7d\xc7\x17\x43\x9f\xf5\xca\xd1\xeb\x62\xe6\xf4\x3c\x58\xc3\xaf\x32\x5b\x52\x52\x2e\x5d\x23\x54\x28\x89\xbb\x67\x62\x40\x7a\x26\x47\xb3\xc8\x46\x58\xcb\x54\x45\x0f\x83\x7f\xcb\xac\xd9\xfd\xf2\x4f\x7c\x89\x4f\xd4\x03\xbc\x9b\x68\x4e\x77\xde\x3d\xce\xb9\x92\x42\x60\x9d\xce\xeb\x7e\x26\xa3\xd5\x45\xfa\xb3\xb4\xb7\x5e\x2d\xbd\x68\x32\xf1\x48\x7d\x27\xf7\xbd\x81\xed\xcb\xf2\x8d\x8e\xfc\xb6\x82\x2f\xb1\x75\xac\xcd\xef\x18\x37\xc8\x55\xce\x64\xb7\xc1\x07\xd9\x08\xab\x1a\xfe\x11\x19\x16\xba\x47\x44\xc0\xde\xa2\xe4\x6c\x2c\xf6\xce\xf9\xfc\xaf\xeb\x33\xf9\xe7\x72\xe2\x0b\x2f\x5c\xcf\xd5\x2e\x3f\x83\xd2\x64\xfd\xff\x4c\x44\xa7\x65\xbe\x63\x46\x11\x85\x7a\xd3\xe0\x49\xb5\xba\x9e\xc6\xca\x04\x65\x46\xe7\x68\xda\x9f\xf7\x5b\x8d\x44\xd9\x1e\xdb\x5f\xff\xea\x10\x09\x6d\x01\x83\x38\x78\xe6\x23\x4b\x12\x10\x15\x9e\xf0\xcb\x23\xc5\x38\x79\x4d\xcb\x53\xcb\x7b\xd9\xed\xdd\x9f\xa1\x63\x85\xec\xae\x62\xc1\xcf\x15\xbf\xa5\x2e\x42\xed\x29\x00\x1c\x3c\xf3\xcd\x39\xb5\xa9\xd6\x2a\x09\x92\x26\x6b\xc9\xa0\x89\x98\x1a\xde\xe5\xbd\x4c\xc5\xd7\xf9\xfa\x3e\xf5\xba\x96\x64\xa3\x9b\x95\x0a\xf4\xf4\x25\x88\x83\x67\xa8\x98\x8c\x4b\x1f\xdf\x5e\xc9\x10\x8d\x40\xa3\xf4\x7a\x73\x59\x22\xab\xc1\x6b\x24\x0f\xb3\x0b\xc5\xeb\x09\x3b\x93\xcc\x6d\x23\x25\xc8\x60\x83\x38\x3f\x69\x1c\x58\x01\xae\x5f\x82\x57\x31\xca\x13\xa9\xcb\x07\xe7\x9a\x50\xac\xc8\x62\x5b\x31\x7a\x49\x19\x8e\x3a\x86\x46\xf0\xbb\x7a\xd4\x0c\x71\x10\x46\x18\xc4\x41\x35\xc2\xff\x6e\x84\x41\x3f\xe8\xd3\x24\x80\xb6\xfb\x63\xd6\xd3\x20\x27\xba\x1d\x6d\xf6\xe1\x47\x99\x43\xa9\x7e\xe2\xab\x76\x19\x7d\x26\xa1\x95\x78\x14\x5f\x31\xfd\x0b\x82\x11\x43\x07\x71\x70\x09\x70\xc9\x5f\xdc\x15\x2b\xb9\xd7\x56\x86\x73\x12\x41\xdb\x4f\x67\x4d\xfe\x69\xc4\x52\xaf\x0b\xab\xfc\x4a\x6e\x77\x44\xf2\x54\x3d\xd4\x5c\x0b\xc4\xc1\x25\x50\xe2\xf5\x21\x2d\xb1\xc0\xed\xd7\xb5\x4a\x75\x3f\x0b\xd9\xc6\xae\x2f\xda\x69\xa8\x19\xcc\xbe\x74\x15\x24\xa1\xe3\x02\x6e\x32\x42\x88\xb8\x20\x0e\x2e\x01\x37\x2c\xc5\xa5\x22\x9f\x3b\x6f\xb3\x3e\xbf\x6e\x30\x56\xbc\xfd\x92\xe2\x86\x2d\xde\x47\x1c\xaf\xe6\xb7\x5b\x57\x62\xfe\x74\x39\x0a\x22\xe2\x82\x38\xb8\x04\x6c\x09\xd4\x3b\xa2\xd0\xa4\x36\xfa\x6b\x06\x30\x5e\xa6\x3b\x0a\x2f\x4b\x34\x52\xa0\xbc\x57\xb8\xf8\xe9\xc8\x4a\xdf\x76\x73\xd6\x09\xb1\xf8\x01\x71\x50\x6d\x20\xdf\xbf\x2f\x80\x41\xb3\xeb\x69\x1a\xc8\x6d\x89\x89\xe9\xb0\x61\xca\x30\x69\x0f\x59\xd0\xc4\xbd\x9f\xfb\xaa\x85\xf4\xcf\x4b\x52\x74\x8c\xd8\xa0\xcb\x95\xee\x23\xdf\x5a\x10\x63\x07\x71\x48\x0f\x61\x8f\x2d\x9f\x30\xb4\x17\x29\x93\x2f\x30\xa9\x38\xa3\xee\xdf\xa1\x7b\x8c\x56\xbb\xfa\xa3\x73\x1b\xed\xdc\xcd\xae\x44\x01\x02\xe8\x95\x52\x10\x07\xd7\x00\x6a\xe9\x25\xfe\xa4\x8d\x2f\xfd\x65\x99\x2c\x2c\x37\x50\xa2\x47\x3f\xf8\x5d\x95\x7e\xf0\x01\x5f\xd3\x56\xcf\x9d\xe7\xab\x6e\x32\x64\xae\x40\x1c\x5c\x03\x42\x0d\x5d\x1c\xa4\x12\x62\x47\x78\x0a\xaf\xb7\x86\x7a\xe6\xdd\x73\x2f\x87\x59\x4f\x53\x96\x1c\xf6\x97\xfa\x45\x65\x8d\x62\xae\x40\xa6\x0d\xc0\xc1\x35\x10\x5b\x1d\x78\x57\x60\x5b\xbf\x3d\x3c\xba\x99\xac\x63\x5a\x3a\xea\xa7\x4d\xad\x89\xdd\x4e\xc7\x98\xef\xda\x2b\xeb\x5f\xdf\xe8\x18\x10\x1a\x00\x71\x50\x6d\x20\xc0\x08\x83\x52\xdd\x69\x1a\x78\x7d\x29\xe0\x96\xf0\xf0\x9c\x42\xe6\x56\x41\x61\xcb\x1d\x42\x4e\x8d\xda\xb5\xe5\xd1\x78\xb1\x76\xed\x25\x1c\xf2\x8f\xb5\xe2\x79\x88\xb1\x83\x38\xb8\x06\x88\x92\xb6\x3b\x9c\x6a\xf5\xaf\x79\x1b\x28\x9f\x64\xfb\x54\xa1\x08\xa2\x34\xeb\x0a\xc7\xf2\x97\xb8\xfe\xa6\x5f\x34\xbd\x78\x1b\xea\x15\x00\xe2\xe0\x1a\xb8\xbd\x47\xf7\x18\x8d\xf2\xcf\xc6\x49\x78\xbb\x36\x69\x0d\x33\x86\x01\xe3\x42\x0a\xe1\x56\x55\x6d\x9b\x91\x5a\x81\x9e\x74\x86\x2d\x22\x2e\x88\x83\x6b\xc0\xff\x42\xd2\x63\xbb\x10\xae\x79\x82\xc4\x51\x2b\xed\xda\x16\x39\x5e\xd7\x2d\x2a\x79\x37\xa2\xde\xa9\xf2\xe8\x54\xf7\x81\xc9\xcb\xd0\x9e\x28\x80\x83\x6b\xc0\xa1\xe5\x95\xa8\x34\x47\xc5\xef\x24\x8f\xa2\x8e\x88\x8f\x92\x2a\xdc\xf2\xb9\x3b\xdd\x7b\x9c\x7a\xab\x3b\x93\x94\xe5\x7f\xb8\x4a\x11\x1a\x00\x71\xd0\x3c\xa0\xfb\xef\x1a\x00\xad\x3b\x4e\xd3\xc0\xcf\x16\x87\x40\xab\xc8\x54\x45\xe2\x73\x5e\x32\xc3\x9a\x9c\xdf\x84\x4e\x2a\x67\x7d\xe8\xe3\x25\xea\x1e\xd9\x28\x8a\xb2\x3a\x42\x5d\xeb\x40\x1c\x5c\x03\xa9\x23\x5f\xbb\x47\x71\x4d\x79\xd5\x9a\x1c\x53\xee\xdf\x66\x48\xf2\xdc\x95\xee\xaf\x22\xe9\xf2\x0c\xf4\x8b\xba\x4f\x1b\x42\xfa\x1c\x11\x17\xc4\xc1\x35\x20\x98\xf7\xeb\x45\x90\xb5\xdc\x9b\xf9\xf6\x8b\x4f\xd6\x43\x71\x62\x53\x2a\x51\x45\x3a\x6f\x7c\xe0\x92\x1a\x37\x92\xaa\x6d\x69\x83\xae\xdd\x83\x38\xb8\x06\x6e\xdb\x47\xba\x18\x2d\x4f\xf3\xcd\xb0\xf3\x7a\x04\xec\xf0\x25\xb0\x9f\x6c\x65\x6a\xe5\x33\xc4\xbc\x72\xa1\x5f\xaa\x53\x47\x81\x96\x45\x20\x0e\xae\x81\xb0\x0f\x1f\xd5\x32\x67\x2e\xfa\xb8\xe6\x0e\x4d\x56\x88\x45\xa9\x7e\x61\xef\x96\x6b\x20\xaa\xdf\x7a\x54\x54\x5f\xa2\xe3\xad\xf3\x14\xa1\x01\x10\x07\xcd\x03\x00\x23\x0c\x32\x51\xa7\x1b\xe1\x75\x23\xbb\x0f\x74\x6f\x7a\x8b\x56\x6e\x95\xbe\x93\x4a\xe6\x1e\x20\xb5\xe9\xa1\xb8\xef\xa6\x59\x78\x3d\x60\xae\xd2\xa3\x76\xee\x3a\xc2\x54\x82\x38\x64\x23\x8c\x7e\x60\xba\x75\x7c\x8c\x1f\xba\x87\xc2\x9c\x75\x6e\x57\xf5\x40\xa6\xee\xf7\xa3\x7b\x23\x81\x85\x4a\x55\x91\xe3\xac\xe7\xf5\x0c\x10\x91\x41\x1c\xb2\x11\xb6\x7c\xd4\x99\xd3\x57\x19\xe2\x4f\x9c\x69\x72\x4d\x46\x55\x96\xc4\x87\xc1\x7f\x38\xee\xca\xf1\xe7\x07\x6b\xa1\x2d\x52\xac\xae\xe9\x88\xc8\x20\xee\x7f\x8c\x30\x0a\xda\x3f\x22\x83\x5e\x41\x46\x18\x61\x2c\x94\x7a\xe5\x20\x61\xdd\x08\x4b\xc3\x8d\xf7\x6a\x37\x7a\x47\x88\x92\x6d\xc4\xf5\xbf\xed\x2f\xe7\x59\xaa\x66\xfa\x6a\x8b\xbb\xff\x6d\x84\x85\x26\xba\xcf\xef\x5a\x5a\x53\x61\xd9\x1f\xee\x25\x35\x36\xfd\xe1\x49\x53\x93\xf6\x31\xbb\x76\x97\x59\x51\xcb\xee\x97\xac\xea\xdf\x8f\xf7\x26\x31\x52\x77\x68\xbf\xa9\xbb\x70\x11\xe3\x73\xa1\x68\xfd\x46\xff\x5a\x05\x41\xdc\xf7\xe2\x90\xf3\xa4\xa2\xae\xd4\xe4\xea\x77\x89\xfe\xdb\x8c\x30\x68\x68\x7f\xd7\x08\x23\x19\xe1\x58\x4c\xa3\x8e\xfc\x14\x31\x51\x93\x56\xd3\xfc\xec\xe5\x8c\x07\x43\x43\x59\x7c\x57\x4f\xac\x63\x8b\xd9\x5e\x6f\x61\xa8\x1b\x6f\x9d\xc9\x61\x25\xb2\x11\xe6\x3b\xe8\xb9\xe2\x7b\xc8\xbc\xed\x6d\x9a\xd9\xc9\x11\xf2\xdd\x3e\x2a\xc8\x97\x63\x7c\x75\x89\x33\xb5\x79\xf4\x85\x14\x9a\xa3\xdd\x99\x1c\xcd\x22\x1b\xe1\xa5\xb1\x07\xd6\x4a\x97\x3c\x04\x42\xdd\xa5\xb5\x7a\x67\x6b\x9c\x51\x7d\xde\x4a\x77\x9e\x9b\x93\xa0\x6c\x1b\x89\xbd\x70\x74\xc7\xf8\x4c\x46\x8b\x6c\x84\xf1\x35\xda\x6f\x0a\x4c\xf1\xc8\x1f\x5d\x13\x4e\x97\x17\x1b\xac\x63\x38\xf8\x54\x6c\xcf\x7e\xd7\x3e\xf2\x83\xcb\x67\xe9\x50\xa9\xfc\x33\x19\x2d\xb2\x11\x4e\xb8\xa4\xe0\x37\x9c\x73\xfb\xd6\xbb\x05\xa5\x2d\x2a\x8e\x96\x84\x8e\x3c\xa9\x58\x34\xc1\x3a\x73\x36\xd9\x9b\x0d\x9b\x65\xc4\x97\xce\xcc\x08\x83\x44\x74\x6a\x51\x50\xf1\x17\xb7\xf7\xb5\x61\x6b\x9b\x91\x5a\xcf\x18\xe3\xef\xb7\x64\x87\x75\xd1\x14\x2f\x8f\xe4\xf3\xbe\xb7\xe6\xf6\x39\xb9\x4c\x0a\x15\x05\x01\x38\x78\xe6\xe3\xb1\xcd\xbb\xf7\x81\xf0\x22\x91\xbb\xd6\xae\x2c\x13\xd5\x73\x21\xfc\x97\x4f\xa8\x4d\xf4\x2e\x27\xd5\x78\xaa\x79\x5c\x49\x2a\x5b\x40\xc4\x05\x71\xf0\xcc\xc7\xda\x3b\x36\x2d\x74\x8d\xc5\xf8\x0e\xad\x97\x7a\xbd\x5f\xbc\xe5\x03\xce\xd2\xf7\xce\x51\x3b\x5c\xcb\x82\xf3\x0a\xde\xcd\xd3\x50\xe1\x29\x88\x83\x67\x3e\x1c\xa3\x82\x41\x83\xd0\xfe\xb7\x8e\xfd\xab\xe2\x5f\x93\xae\x9f\xbc\xfd\xaa\xa6\xc1\xb4\x14\x73\xb9\xb4\xdd\xe3\xbd\xf9\xfb\x0c\xa8\x3b\x06\x88\xf3\x93\x96\xfc\x67\x07\x9a\x57\xd9\x8a\xe3\x03\x71\x58\xaa\xd6\xb3\x31\x92\x6d\x94\xaa\x6e\x7b\x64\x94\xef\x1f\xa2\xc8\x68\xa5\xa3\x49\xa5\xff\xa1\xf6\x42\x18\x61\x10\x07\xd5\x08\xff\xbb\x11\x06\xfd\xa0\x4f\x93\xc0\x66\x54\xcc\x1b\x52\x45\xf1\xd7\x8d\x33\xab\xdd\xa9\xa3\xd5\x9d\x81\x15\x7d\x8d\x4a\xdf\x08\x9c\x82\x85\xbe\x73\x1b\xbb\x5d\x6b\x45\x0c\x1d\xc4\xc1\x25\x70\x89\xe5\x29\xda\xc1\x7e\x59\x0b\x1b\xef\x1d\x1f\x26\x5c\x5d\x85\x7c\xfd\x73\x17\xfa\xa2\x5b\x9f\x09\x18\x2f\x66\xb4\xf8\xe0\x86\x20\xe2\x82\x38\xb8\x04\x30\x9b\x4b\x1a\x8b\xf7\x8b\x6c\xb0\xc8\x6e\x7c\x11\x9a\x32\xe2\x5a\xca\x3d\x92\x0c\xb5\x1a\x5d\xe3\x2b\xfd\x5e\xf1\xc1\xbc\x1a\x32\xd8\x20\x0e\x2e\x01\x3b\x8c\xcc\x2b\x04\xae\xe8\x34\x09\x89\x47\x55\x11\x04\x6b\xe8\xf8\x96\xf9\x15\x65\x4d\xf7\xef\xb5\x6f\x32\x6b\xec\x34\xde\x67\x86\x1a\xaf\x00\x38\xb8\x04\x28\xde\xba\x4d\xe7\x2a\x19\xcd\x8d\xfd\xdc\x90\xf7\xa5\xe2\x8f\xa4\xc9\xb5\x74\x21\x7a\x22\x7b\xe5\xeb\x82\x6d\x1d\xbd\xc1\x3d\x77\xc4\xe2\x07\xc4\x41\xb5\x81\x00\x23\x0c\x9a\x5d\x4f\xd3\x80\x4a\xc1\x38\xed\x8c\x3d\x36\xea\x66\xde\xf6\x45\xfe\x71\xc1\x8b\xcd\xcb\x6c\x76\x09\x4b\x2d\x82\x2e\x0b\xe8\x14\x16\xa1\xdc\xe9\x50\x7b\x65\x00\x07\xd7\x40\xd1\x87\x4e\x35\xdb\xf7\x62\x4f\xb3\xc5\x1f\x18\xb3\xa4\x0b\x8a\x17\x1c\xc8\x5e\xd2\x62\xba\x1c\xc5\xdd\x72\x45\x45\x46\x45\x69\x1b\x11\x17\xc4\x21\x2d\x80\x6b\xc4\xea\x15\x78\xfd\x34\xb0\x5e\x76\x2e\xab\x38\x72\xba\x0e\x5f\xb6\x78\xaf\x7c\x40\x4d\x9c\xec\xff\xee\xa5\x8f\xe0\xa0\x03\xb4\x00\x06\x70\x70\x0d\x90\x3e\x76\xc3\xc0\x29\xee\x51\x76\x7f\x19\x74\xce\x96\xe0\xa0\x8f\x7e\xf3\x21\x4a\x63\x6a\xa2\x89\xea\xfd\x69\x8a\xeb\x26\xe9\xd0\x02\x18\xc4\xc1\x35\xf0\x08\xa5\xa5\xa1\xec\xf5\x87\x68\x77\xb3\x31\xc9\x93\x3b\x21\x72\xe3\xcc\x6b\xa5\x14\x6d\x41\x9b\x01\x3b\x17\x1c\x9e\x7e\x8f\xa5\x40\x68\x00\xc4\x41\xb5\x81\x00\x23\x0c\x4a\x75\xa7\x69\x60\x9f\x91\x3b\x5c\xfc\x22\x5d\xab\xaa\xb2\x85\x08\x8f\x94\x2b\x21\x55\x99\x93\x7b\x1a\xfa\x4f\x9c\x93\x45\xb6\x15\x52\xd3\x44\x7b\xc4\xd8\x41\x1c\x52\xb7\x79\xae\x30\x9e\x9d\xbe\xd0\xb8\x57\xf8\xe1\xb7\xd0\x03\xf5\xe2\x5c\x3b\x84\x03\x34\x3d\x7e\x60\x6a\xef\xe7\x2b\x4e\xa7\x32\x78\x42\xdd\xe6\x01\x1c\xd2\x89\xf0\x46\xce\xbd\xd5\x0c\x3a\x9a\x2f\x22\xec\x7e\x41\x74\xf3\x05\x46\x23\x8d\x31\xd4\x8f\x32\x8f\xd5\xc3\xc7\xf5\x25\x5e\x06\x5a\x42\x27\xc2\x00\x0e\xae\x01\xf6\xc8\x0c\x81\x2b\x8b\xc1\x5f\xa5\x6d\x3c\xac\xb2\xf4\x7e\xcf\xe8\xd5\x6e\xec\x3d\xe9\x2b\xe3\x2e\x2b\x6c\x4f\x12\x28\xe4\x86\x7a\x26\x80\x38\xb8\x06\xde\x7c\x60\xad\x56\x2a\x51\x22\x78\xd7\xec\xbd\xc1\xc1\x4e\x4b\xa1\x4b\x69\x3e\xff\xcb\xc2\x74\x24\xac\x43\xb4\xb9\x89\xf9\xe6\x25\x84\x06\x40\x1c\x34\x0f\x00\x8c\x30\x68\xdd\x71\x6a\xe3\x44\xcc\x45\xd1\xe1\x26\xea\xf1\x43\x31\x46\x61\x4b\x43\x0a\x2a\x61\x47\xee\x86\x63\x52\xb1\x58\xac\xbd\xe5\x8f\xdf\x44\x3d\xa1\x27\xba\x40\x1c\x5c\x03\xa1\xe7\xe2\xcc\xb5\xb7\xa5\xde\x18\xa2\xd6\x67\x7a\x5b\xb4\x73\xbb\xe2\xd0\x38\xe6\xcd\xed\xf2\x11\x50\x17\x89\xf3\x48\xdf\x85\x1e\x87\x00\x71\x70\x0d\x54\x47\x3d\x9a\x4d\x0c\xaa\x2d\xf0\xfe\x58\x99\x3c\xbb\xf5\x65\xf7\x90\xe6\xc5\x41\x8f\xfb\xa1\x8a\x63\xa1\xdb\x1f\xaf\xd7\xe8\x9b\x88\xb8\x20\x0e\xae\x01\xf4\xb8\x03\xc7\xf5\x11\x41\x59\x2b\x55\x09\x11\xd9\xaa\x80\xd1\x99\x49\xc5\xb9\x5d\x87\x0d\xbd\x30\xcd\xfa\xe3\x00\x6f\xa5\x59\x44\x5c\x10\x07\xd7\x40\xd6\x2a\x0d\xa9\x60\x2d\x0d\x56\x26\x4f\xde\x2f\x0c\x0f\xee\xdd\x03\x85\xd6\xda\xfa\x30\xdd\xc4\xa1\x37\x7a\x8e\xb1\x62\x5c\xc9\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\x90\x89\x3a\xdd\x08\x2f\x5f\x9b\x7b\x41\xaa\x18\xbb\x3f\x29\x27\xdb\x48\xa7\xbd\xaf\xb1\xc6\xb6\x71\x35\x4c\xf1\x30\x0c\xcd\x98\x97\xd0\xf4\x9e\x50\x34\xc2\x54\x82\x38\x64\x23\x3c\x10\x6f\x3e\xc0\xff\x7e\x0d\x2f\xdd\x68\x9a\xae\xeb\x02\x7d\xd8\x38\xb5\x28\xbd\xc3\xe5\xec\xbb\x1f\x8b\xc5\x3e\xa9\x3d\x34\xe3\x41\x44\x06\x71\xc8\x46\xf8\x4e\xeb\xef\x08\x69\xdd\x24\x6b\x9b\x19\x3e\x46\x11\x5c\x9e\x32\xb3\x87\xa1\xcc\x16\xd5\x34\xd4\x59\x92\xf6\xd5\x16\xf1\xf2\x7e\x88\xc8\x20\xee\x7f\x8d\xf0\x3f\xae\xb3\x03\x9f\x35\x46\x18\xe1\xc0\xc1\x5f\x8f\x2f\x08\xef\xd0\x27\x8e\xa6\xd7\x9f\x88\xf6\x79\x8d\xf0\xa6\x6f\xed\x7a\xad\x1c\x86\x31\x3e\xd1\xf1\xc3\x95\x58\xfe\xdb\x08\x37\x9c\xbf\x59\x41\xf8\x92\x50\x9e\x77\x3c\x01\xff\xc4\xce\x3d\xdb\xfb\xf6\xab\x7c\x76\x05\x82\x0d\xba\x6c\xb9\xf3\xac\x6a\xb1\x3a\x7f\xa1\x1c\x06\x63\x89\x15\xe1\x17\xc4\xbf\x3e\xbf\x21\x18\xde\xa0\xb0\x7d\xbd\x57\x7d\xea\xde\x89\x74\xff\xd1\xcd\x1d\x15\x87\xf4\x89\xeb\xff\x6d\x46\x18\x34\xb4\xbf\x6b\x84\xe5\xe1\x66\x89\x9d\x6a\xf3\xe3\xe5\x4a\x1f\xb2\xef\x8d\x2f\x65\x15\x97\xef\xbe\xf3\xf8\x43\x94\xe2\xfe\x79\xf4\x52\x4a\xf9\x23\xa7\xb0\x38\xe6\xa0\x33\x39\xac\x44\x36\xc2\xf6\x49\x57\xbf\xd5\x09\xeb\x10\x4a\xfd\x11\xb4\xb9\xb3\xa3\xbe\x78\xff\x37\x93\xd6\x83\xdb\x9e\x86\xda\x4b\x5f\xe6\xa8\x3f\x54\xf7\x9c\xc9\xd1\xac\x18\xd2\x9f\x0d\xcb\x27\x17\x9d\x76\xc2\x59\x7a\xf0\x2e\x3f\x77\x48\x67\x8b\x4f\x5f\xf4\x06\x4e\xe5\x93\xc1\x4b\x0f\x71\x50\x1e\x0b\x5d\x26\xa2\x3d\x93\xd1\x22\x1b\x61\x25\xfe\x41\xa1\x4b\xf5\xfc\xa9\xe4\x71\xbe\x27\xf7\xdc\x15\x5a\xa4\xa6\x4d\x07\x55\x8d\x7e\xea\x6f\xb4\x70\x1c\xae\x9e\xe7\xf9\x70\x26\xa3\x75\x44\xfa\xb3\xa1\x1c\xa9\x1f\x46\x1e\x75\x52\x30\x58\x2d\x17\x69\x04\x36\xf6\x62\xf6\x5d\x2e\xd5\xeb\xd3\x23\x50\x50\x10\x75\x79\x19\x4f\xe0\x78\x66\x46\x18\x24\xa2\xd3\x32\x5f\x6a\x6f\x4b\xd9\xed\xcc\x4e\x56\x4f\x59\x94\xc9\x9e\x3f\xa5\x2c\x28\x93\x7a\x59\x05\xc9\x76\xf8\x98\x47\x31\x03\xd7\x0a\x2d\xb0\xa1\xad\x5a\x00\x07\xcf\x7c\xaa\x29\x64\xdd\x1a\x3b\x0f\xee\xcf\x70\xe8\xac\xf3\x34\x1c\x38\x71\xc8\x98\xd8\xa2\x11\x5f\x8c\xae\x27\x3f\x77\x1c\xd0\x34\x06\x75\x1e\x02\x71\xf0\xcc\x27\xa5\xcb\x1e\xe3\xdd\xd7\xfe\x2c\x5e\x44\x98\xb4\x50\xdf\x46\xa3\xed\xb2\x4d\xfa\x8b\xbb\x0e\x87\xb5\x6f\xd9\x7e\xfe\xdc\xf1\x67\x47\xc4\x05\x71\xf0\xcc\x87\xea\xdd\x60\x28\x20\xe6\x6f\xd6\x7c\x82\x51\xdb\xe5\xe6\x5e\xdb\x1e\xf0\x62\x27\xec\xe7\x9f\xe4\x9e\xc1\xc8\xc6\x41\xeb\xa3\xfb\xd0\x11\x13\x80\x83\xff\x7b\xeb\x03\xd1\x30\x2a\x4b\x44\x5a\xb5\x96\x52\x6a\x53\x44\x95\x8b\xc6\x30\xef\x26\xbe\x24\xe4\x2f\xca\x79\xa4\xf8\x6d\xcd\x44\x6a\x18\x61\x84\x41\x1c\x54\x23\x2c\xff\xaf\x8b\x1f\xd0\x0f\xfa\x34\x09\xf4\x92\x8c\x47\x93\xdd\xee\xb6\xff\xd1\xb8\x23\x37\xfa\x65\x76\xe1\xa6\xc9\x32\xbb\x73\x4a\xcd\xd5\xbd\x04\x16\xdb\xa9\x15\x03\xa8\x11\x37\x88\x83\x4b\x20\x5b\x64\xd7\x24\x55\xe1\x57\x7d\x32\xf7\x21\xf1\xfe\xc1\xd7\x96\xc4\xbb\x5e\x32\xb1\x9c\xa9\x22\x98\x69\xc5\x61\x5a\x62\x47\x41\x88\xb8\x20\x0e\xfe\x49\x3d\x71\x27\x27\x9f\xb1\xdc\xf5\x4c\x9f\xf6\x5f\x99\xb0\x39\xa7\xe7\x69\xab\x45\xf8\xec\xe7\x82\xd4\x7b\xdd\x24\x76\xbd\xe5\x2a\x1a\x44\x5c\x10\x07\x97\x00\x5b\xc9\xf7\x96\x29\xc6\xa2\x9b\xdf\xf0\x27\x09\x2e\x37\xd4\x9b\xa0\x04\xfc\xcc\xd1\xb0\x0a\xfa\x90\xe5\x78\xbe\x31\x2f\xac\x7a\x07\x11\x17\xc4\xc1\xff\xbd\xfe\x4d\x99\xd8\xad\x31\xad\xf6\x1f\x23\x09\xb3\x69\x59\xe6\x17\x18\xd6\x3f\x45\xbc\x69\x27\x33\x10\xb3\xd7\x5b\x64\xfe\xa2\x26\x8f\x58\xfc\x80\x38\xa8\x36\x10\x60\x84\x41\xb3\xeb\x69\x1a\x70\xd5\x0d\x4f\xd5\xcc\x90\xd9\xaf\x53\x9e\x2d\x24\xa0\xc1\x8e\x1c\xfd\xe8\xf1\x72\x37\x98\xec\x3d\xad\x95\x24\x33\x37\x89\x54\x16\x62\xec\x20\x0e\xae\x01\x25\x9e\x8f\xb1\x4f\xc4\xaa\xc4\x7e\xbe\xad\x20\x7d\xf6\xf3\xbd\x6a\x42\x55\xe0\xb8\x54\xe5\x6f\x46\x7b\xf1\xc8\xa6\xb0\x6b\x3a\x94\x88\xb8\x20\x0e\xfe\x4d\xaf\x4f\x11\x29\x44\xdd\xc8\xfa\x46\x4d\x62\x48\x74\xec\xf6\xe6\x2a\x9f\xd9\xe2\x40\x4e\xff\xe5\x9f\xa6\x32\xc7\x2b\xde\xdf\xc7\xa5\x11\x71\x41\x1c\x5c\x03\x74\x19\x9d\x21\x3e\xd6\xe5\x81\xa4\x07\xf3\xdf\x8c\xbb\xa2\x3f\x3d\xfe\xca\x9d\x97\x5a\xd8\x52\xc3\x87\x51\xf3\x2a\x19\x17\x13\x9a\xb6\x40\x1c\xd2\x13\x61\x54\x54\x57\x83\x86\xdf\x53\x5c\xd3\x23\x63\x21\x6d\xaf\x29\x7d\xfd\x27\xfd\x58\xba\xb6\x3a\x8e\x9c\xef\x22\x79\x18\xf6\x75\x5c\x84\x06\x40\x1c\x54\x1b\x28\xf6\xef\x1a\x00\xa5\xba\xd3\x34\x50\x63\xf4\xf6\x40\xf2\x56\xe6\x76\x8d\x57\xe7\x07\x2e\x43\x7b\x53\x63\xe3\xb2\xd4\xf3\x31\x75\x85\x62\xa6\x21\x1a\x1b\xdd\x83\xd0\x3c\x00\xe2\xe0\x1a\xa8\x20\x0f\x21\xfd\xf4\x6d\xc7\x06\xfd\x41\xd5\x84\x12\xd9\xac\x6c\x1a\x4d\xa6\x51\xeb\xdb\x44\x16\x67\x1e\xbc\x2c\xe3\xf3\x2f\x1e\x21\xe2\x82\x38\xf8\x37\x45\xb3\xc3\x48\x8c\x25\xbc\x95\x6e\xa2\x30\x40\xbd\x1c\x78\x2b\xf7\x2b\xd6\xf6\x9a\xa3\xb0\xbe\x26\xff\x39\x4a\xbc\x0d\xe2\x36\xe8\x1a\x2f\x88\x83\x6b\x20\x28\x39\x2a\xc5\x2f\x9c\xcc\x32\xf3\x49\x40\x7a\x72\xf6\x4a\x46\x43\xce\x2b\x7e\x0d\xe9\x79\x1a\xaf\xc2\x49\x5d\x0b\x05\xb2\x45\xa8\x6f\x22\x80\x83\xff\x7b\x89\x50\xb4\x16\x72\x15\x4c\xaf\x0c\x55\xf8\xf7\x29\x6d\xa8\x8d\x3f\x75\x11\x61\xed\x13\x70\x7e\x69\x38\xde\x4f\x15\x9a\xde\x37\x8f\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\xad\x3b\x4e\xd3\xc0\x85\x25\xdd\xa4\x3b\x89\x31\xa8\x5a\x51\x1c\x74\xaa\xf6\x1d\xbc\xeb\xf9\x6c\xf9\xc9\x56\xe3\xb7\x83\xae\xfb\x77\xe9\x25\x5e\x86\xca\x43\x40\x1c\x5c\x03\x94\xc5\x9c\x5a\x53\xb5\x86\x81\x44\x36\xdc\x81\xbc\x31\xf1\x2d\xd6\x44\xbf\x6e\xe1\xd1\x84\x2e\xd2\x86\xf6\xbf\x6d\xe5\xf7\x80\x7e\xaf\x20\x0e\xfe\x4d\xfb\x97\x9f\x76\x64\x0b\xcf\x50\x46\x13\x26\xa6\xa5\x11\x37\x0f\xa8\xf7\xc6\x98\x7c\x4e\xd1\x0d\x92\x23\xb1\xd5\xd4\x61\xa4\x83\xea\xb9\x41\x1c\xd2\xad\x80\xcc\xfa\xfe\xa2\x3c\x55\xce\x3f\xf8\x42\x17\xa8\xc9\xcf\x4d\x39\xb4\x5e\x2c\x89\xde\xab\xa2\x66\x5f\xdc\x2b\xc2\x8e\x1d\x81\x36\x6f\x40\x1c\xfc\xdf\x6b\xef\x30\xc4\xb6\xb0\x81\x25\xea\x13\xf1\x5d\x6f\x08\x6f\xd7\x95\x7d\xd7\x4d\x5e\xe3\x87\x9c\xf9\x49\x8d\x47\xf2\x03\xe7\x40\x29\x84\x06\x40\x1c\x34\x0f\x38\xfe\xbb\x11\x06\x99\xa8\xd3\x8d\xb0\x51\x68\x29\x47\xe0\xcd\x5f\x5a\x7f\x6a\xea\xa6\x24\x12\xda\x53\xf3\x73\xc5\x1f\x6f\x2e\x07\x4b\x92\xb8\x2d\xa4\x6f\xa2\x76\x3b\x21\x4c\x25\x88\x43\x36\xc2\x85\x6f\x48\xa4\x6b\xa9\xc8\x3a\xe2\x2a\xd6\x08\x4d\x3f\x98\x97\x32\x78\x27\x44\x4f\x54\x24\xd8\x69\x24\xda\x0c\x08\x75\x4a\xc9\x22\x22\x83\x38\x64\x23\xdc\x1f\xea\x47\x80\x3d\xd5\xd4\xa2\xb7\x9d\x51\x9e\xb5\xa4\xcc\x1a\xb0\xf2\x78\x44\xe1\xc7\x93\xa8\xa6\x35\x29\xf7\x4b\x11\xd7\xc8\x11\x91\x41\xdc\xff\x1a\xe1\x7f\xbc\x59\x0d\x7c\xa7\x18\x61\x84\x97\x1f\x6a\x93\xe5\x7d\xab\x31\x16\x6b\x93\xe9\xbf\xb5\xbd\x59\x69\xc0\xc5\x9b\xf3\x22\x7b\xb7\x12\x3b\x3b\x6f\x67\xfc\x0b\x5b\x4a\xe8\xff\x3f\x03\x8a\xa9\x36\xfe\x1d\xbd\xc1\x91\x76\xd1\x72\x43\xb9\xe0\xf8\x33\x9d\x69\x39\x46\x13\x76\xf6\x56\x7d\x95\xd9\xa0\x46\x75\xcc\xe0\x6f\x49\xc9\xff\xfd\x1f\xff\x7f\x6e\x84\xf9\xff\xb3\x7f\xae\x3f\x26\x0a\xca\xff\x7e\x64\x14\x1f\xe8\xcb\xbd\x3f\xf1\x96\x64\x0e\xd2\xba\x2c\x25\x99\xe0\xb9\xeb\x17\x6f\xd8\x1a\x51\xf2\xe3\x5e\x28\x95\x68\x76\xfb\x68\xf5\xf4\xdc\x97\xfc\xbf\xbf\xdc\x94\x6a\x4e\xf9\x70\x2d\xd5\xad\x3f\x45\x92\x39\x1c\x1a\x82\xc5\xe4\x06\x41\x29\x68\x01\x2b\xef\xe4\x27\x5d\xd2\x55\x79\x73\x8e\xfe\x42\xa5\x77\xca\xe6\x47\xd1\x9e\x9b\xa2\x7a\x77\x7c\xb7\x92\xd0\x63\x75\xd7\x79\x3b\x25\x5e\x47\x18\x6e\x3d\x11\x80\x1d\xd3\xbd\xd3\xf7\xdf\xb6\x85\x00\x1a\xda\xdf\xd5\xd5\x48\x5b\x08\x7c\xed\x46\x29\x91\xb8\xaa\x36\x4a\x22\x87\x16\xd8\xb4\xd7\xa6\x75\x6b\xc8\x38\xae\x89\x70\x0e\xbb\x49\xdf\x79\xfe\x34\xd3\x28\xfd\x4c\x8e\x79\x91\xb7\x10\xba\xb4\x17\xe8\x1b\x7f\x11\xd1\x2f\xfb\x19\xc5\xa9\x0c\x0b\xd2\x96\xdb\xd0\xda\x98\x1e\xeb\xf0\xf8\x7c\xad\x67\x62\xbd\xf9\x31\xea\x4c\x0e\xb5\x91\xb7\x10\x18\xad\xaa\xff\xb0\x68\x5e\xf4\xfc\x39\xb0\xce\x6d\x55\xb2\x4b\xca\xe1\xfe\xc8\xcd\x65\x4e\x3c\x40\x61\x39\xf4\x52\xcb\x6b\xf9\x33\xb9\x42\xdf\x80\xbc\x85\xf0\x2a\x7c\xc8\x7c\xb3\x46\xeb\xcd\x84\x89\xca\xe7\xea\x2c\xfe\x50\x6a\xfb\x51\x15\x7e\x67\x9b\x20\x42\x0d\x4d\x3b\xb2\x67\xee\x67\x73\x84\x8f\xbc\x85\x70\x42\xb4\xfd\x6c\x71\xa6\x63\xac\x3a\x51\x86\xb1\x5f\x3d\xbc\x5a\xf0\xc1\xa3\x31\x5f\x46\x83\xfa\xd5\x5a\xfe\xca\x30\xc3\x94\xb4\x33\xdb\x42\x00\x89\xe8\xb4\x35\x03\xed\x33\x4b\x43\xca\x0d\xdf\xc1\x63\xa6\xbd\x8d\xb1\xf1\xcc\x0d\x76\xcc\x84\x11\xd9\x8f\x47\xf2\xcf\x5d\x9d\xae\x73\xc4\x48\x4e\x20\x72\x25\x88\x83\xaf\x19\x12\x27\x7b\x51\x24\xd0\x9f\x45\x2e\x44\x33\x10\x2c\x99\x4b\x4e\x97\x49\xd0\x6c\xde\xe3\x0b\x73\xb8\x57\xdb\x54\xa4\xb4\x35\x51\x8a\x88\x0b\xe2\xe0\x7d\x3a\xb4\x6c\x5c\x30\x85\x0f\x93\x5a\xfa\x0e\xc8\x84\xcc\x51\x9a\xa6\xde\x7b\x67\x27\x31\xc9\x34\x5c\x2b\xc6\x63\xdb\x57\x7d\x85\x0b\xb5\x2f\x03\x71\xf0\xb7\x14\xd3\x30\xe4\x38\x78\x67\x9e\xa9\x72\x62\x1e\xff\xb8\xff\x4c\x6a\xfb\xe0\x64\x4d\xbb\xf8\x6a\x62\x89\xf9\xeb\xe6\xde\x28\x13\x66\x2b\x44\x5c\x10\xe7\x27\xfd\xcf\x1e\x15\xec\xb8\x18\xc6\x2f\xb9\x31\xb9\xb7\x7f\xbd\x50\xd4\x18\x71\xac\xd4\x7e\xbd\xe6\x2d\x4e\xd5\x25\x4c\x5f\x44\xd9\x14\x10\x22\xfb\x18\xb1\x85\x00\xe2\x10\x67\xe9\x92\xff\xbe\x85\x00\xfa\x41\x9f\x26\x01\x4b\xaf\xeb\x01\xd8\xc1\x93\xbf\x3d\xdd\x0d\x17\x77\x2d\x73\x5c\xef\x4f\xd3\x3d\xe9\x34\x71\x93\x3a\xa4\x1a\xa4\x45\xd1\xfd\x0e\x55\xaa\x82\x38\xb8\x04\x32\xdf\x13\x27\xdf\x9d\x39\xd8\xc3\x4f\xc5\x6b\x92\x18\x7e\x35\x79\x25\xb2\x29\xee\x39\x46\x9e\x6c\xb5\x60\x9f\x9b\xa4\x87\xeb\x10\x22\x2e\x88\x83\x4b\x20\x4a\xa4\xe3\x33\xb9\x79\xb5\xf4\x85\x83\x32\x4c\x67\x31\x56\x3c\x0b\xec\x74\x66\x31\x75\xf9\x0f\x43\xba\x33\x8f\x77\x6a\x7d\xa0\x67\x3a\x41\x1c\x5c\x02\xf5\x9b\xbf\x8d\xd6\xaa\x82\x50\x5f\x52\x5f\x42\xfb\xbe\x10\x19\xce\xf3\x3c\xa9\xe8\x12\x73\xfe\x90\x20\xe6\x01\xef\xcb\xaa\xbb\xda\x50\x95\x39\x80\x83\x4b\xc0\xbc\xd8\xee\x16\x9d\x41\xdb\x6d\x7c\x19\x47\xaf\xc2\xae\xd0\xe0\x12\xb3\x11\xcf\x38\x51\xc7\xea\xd1\x80\xce\x27\xd7\x4e\x86\xa0\x65\x23\x88\x83\xce\x4f\x00\x5b\x08\xa0\xd9\xf5\x34\x0d\x60\x4e\x52\x78\xa1\x5a\xfa\xa7\x7e\xac\x1b\xfb\x36\xf3\x90\x69\x24\xfc\x32\x47\x5e\x47\xaf\x6e\x7c\xef\x26\xdd\x3d\x2f\x93\x2a\xe8\x22\x2d\x88\x83\x6b\x20\xcb\x74\x8b\x5e\xb6\x70\xf5\xaa\x8d\xca\x8f\x91\xd5\x7d\xf2\x36\x3f\xdf\x05\x07\x83\x09\x12\xcd\xf4\x3b\xde\x9e\x2b\xe6\x57\xa0\xad\x09\x10\x07\xd7\x00\x16\x7b\x79\xba\xa2\x3a\x3d\x43\x69\x66\x53\xcd\xe1\xed\x9b\x1a\x55\x84\x65\x91\x46\xec\xe7\x0d\x52\x13\x2c\x8e\x1f\x51\x7d\x84\xae\xd4\x80\x38\xb8\x06\x46\x33\xac\xd7\xc8\x92\xbc\xfe\xec\xd1\x36\xcf\x88\x0c\x74\x34\xaf\xfc\x96\x1e\x93\x43\x79\xbf\xa3\x53\xa2\xfc\xca\xd2\xd5\x89\x1c\xaa\xae\x06\x70\x70\x0d\x9c\x6f\xa0\xbd\xe0\xe7\x38\x4e\xa5\x60\xc7\xcd\xce\x54\xae\x31\x4d\x2f\x4c\x2a\xc0\xd0\x5d\xb8\x64\x5b\x82\xf5\x86\xb5\x80\x70\x18\xa1\x01\x10\x07\x9d\xa3\x02\xb6\x10\x40\xa9\xee\x34\x0d\x04\x4c\x88\x28\xe8\x60\x5f\xa6\xf2\xe8\xda\x11\x60\x0f\xb3\x39\x79\xbb\x31\xed\xf3\x8b\x64\x31\x32\xe8\xc7\x25\x2e\xc9\x27\xce\xf5\x88\xb1\x83\x38\xb8\x06\x6a\x89\xde\xf2\x19\x3c\x4d\x4d\x95\xd7\x97\x31\xfb\x50\x9b\xbc\x68\xaf\xad\x3a\xc1\xda\x27\x4a\x7e\xdf\x03\xfd\x93\x39\x46\x18\xf4\xb4\x32\x88\x83\x6b\x20\x38\x41\x8d\x8b\xab\xf0\xd5\x3c\xad\x1f\xe1\x71\x61\xa0\x49\x1d\x3f\x4f\xb0\xc0\x15\x8b\x64\xc2\xaf\xb4\x07\x85\x6c\xf1\xd4\xf4\x88\xb8\x20\x0e\xae\x01\xc6\xab\xdb\x2e\x15\xe1\x24\x17\x54\x76\x3e\x1f\x2c\x15\x6f\x55\x7d\x17\x17\xe0\xf8\xed\x20\x2a\x7a\x5d\x98\xc1\xf7\xca\xed\xf5\x70\x44\x5c\x10\x07\xd7\x00\x9e\xec\x4d\xeb\xc1\x77\xc3\xc2\xcb\xbd\x76\x92\xb4\x64\x46\xc1\xbb\xaf\xae\x48\x13\xd1\xf6\x6f\xf4\x91\x26\x7b\x26\x73\xf1\xee\x23\x34\x00\xe2\xa0\x79\x00\xb0\x85\x00\x5a\x77\x9c\xa6\x01\x6b\xff\xe1\x3b\xd8\x6b\xd4\xc9\x6f\x7e\x7d\xc5\x8f\xf7\xf9\xb2\x6b\xff\x74\xfb\x11\x33\x77\x20\xa5\x9c\xcb\xfa\xa3\xf6\xdb\x8a\x27\x88\xb1\x83\x38\xb8\x06\x5e\xce\xb8\xf7\x6e\xe6\xa5\xca\x7f\x35\x2c\xa6\x50\x26\xfa\x52\x2c\x47\x4b\xf7\x3e\x5b\x8b\xed\xad\x3a\x6e\xaa\x1b\x79\x97\xe2\x00\x22\x2e\x88\x83\x6b\xa0\x86\xe4\xe4\x5b\xa1\xe6\xa0\xce\x80\xb3\x31\x6d\x78\x20\x47\xd3\x88\x75\xb9\x4e\x5a\xb0\xed\xa3\xc6\x9e\xee\xf8\x39\x46\x1b\x3e\x68\xdb\x0b\xc0\xc1\x35\x30\xc3\xb0\xd6\x20\x20\xe8\x28\xfb\x6c\x5e\xf5\x1a\x4d\x87\x34\xeb\x9d\x08\xa2\x07\x33\xc1\x6f\x47\xf8\x6d\xd1\xef\xec\x1c\xda\x42\x05\x16\x20\x0e\xae\x01\x6c\x9c\x8e\xaf\x5c\x91\xab\x61\xf1\x2f\x6c\x0d\x8e\x3e\x29\x92\x51\xb5\x3b\xa9\x07\xc9\x1e\x3e\x3e\x0e\xbf\x62\xb8\x90\xb8\x16\x88\xd0\x00\x88\x83\xe6\x01\xc0\x16\x02\xc8\x44\x9d\xbe\x85\x90\xe9\xe8\x1b\x25\x85\x8b\x46\x27\x3f\x2a\xc1\x31\xb5\x20\xa0\x72\xbf\xc0\x2b\x54\xf6\xdb\xcc\x64\x0e\xdd\xd5\x37\x0c\x7e\x76\xb4\x08\x3b\x0e\xe2\x90\xb7\x10\xf6\x09\x74\xe7\xd6\x48\xa6\x18\x26\xda\xd4\x30\x5c\xd2\x42\xc8\x58\x55\x8e\xe2\xe3\xce\x3f\x5e\xa4\x5c\x08\xdc\x90\xe7\x7d\xff\x01\x11\x19\xc4\xf9\xc9\xa2\x10\xff\x33\xf2\x98\x41\x97\xd2\x9c\x85\x15\xf9\x1b\xb1\xca\x57\xc4\x12\x03\xf9\x69\x44\x97\xa7\x3e\x4b\x46\xb6\x53\xe6\xcb\x3b\x72\xc9\x75\x9f\x20\x22\x83\x38\x3f\x59\x0c\xd8\xd7\xf8\x8f\xfb\x6d\x67\x5d\x5c\xe6\x91\xa3\x14\xaf\x5e\xfd\xd3\xb0\xad\xe8\x55\x72\xff\xfb\x8c\xba\x6a\xbd\x1c\x89\xdb\xc4\x76\xc1\x72\x34\x76\x06\xf1\xdf\x46\x98\x68\x4f\x63\x64\xd0\x3e\x8c\x8c\x51\x3b\xb7\x4f\x22\x7c\x59\x1a\xb7\x2b\xae\x02\xf3\x8d\x3b\xca\xeb\x74\xfb\xe2\xaa\xbb\x87\x3f\xfe\x42\x15\xc5\x94\x76\x1c\x22\xfc\x43\xbc\x46\xe4\xec\x17\x36\xc6\xbb\x48\x19\xdb\xdb\xa2\x31\x98\x6d\x9f\x5c\x2d\x91\xbe\x4b\x29\xf4\xf2\xbf\xcd\x08\x83\x86\xf6\x77\x75\x35\x92\x11\xb6\xa9\xff\x36\x9d\xf9\xf8\x71\x22\x4a\x14\xf5\x32\xc6\xbd\x63\x22\x16\x09\x06\x9c\x03\x3d\xee\xa7\x4f\x9e\x7a\xf1\x7d\x27\xcf\xb9\x78\x26\xc7\xbc\xfc\x48\x1e\x2d\xa3\x3d\x45\xc8\x27\x6c\x97\x2a\xc0\xdf\xfc\x13\x1f\xf3\x3e\xef\x0e\x8f\xb1\xb7\x12\x95\xed\x7a\xc1\xd5\x22\xec\xf5\x4d\xb9\x6b\x67\x72\xa8\x8d\x6c\x84\x39\x8f\x6f\x0f\x0b\x6a\xaf\x32\x0b\xd7\xfd\x44\x09\x96\xb4\xd0\x4b\x8d\xdb\xa6\x8e\xd2\xeb\xa7\xb3\x7c\x26\xbe\xe2\x64\xf9\xc5\xeb\x4c\x46\x7b\x17\xe9\xcf\xd6\x30\xfa\xdd\xe5\x13\xe8\xd8\xc2\xe5\x8b\xf6\x32\xea\xb7\x17\xa4\xd5\x5b\xb0\x4f\x1e\x13\x7c\xc8\xd5\xed\x57\x88\xfe\xfc\xeb\x9d\x33\x19\x2d\xb2\x11\x56\x7e\xd1\xe5\x50\x4c\x38\xb6\xf8\x39\xd6\x13\x3b\x58\x59\x6e\x4f\x69\xee\xae\x88\x8a\x65\x47\xe9\x1d\xd3\x16\xf2\x5b\x84\x7d\x67\x50\xd4\xad\xff\x9f\x89\xe8\xb4\xcc\x77\x60\x5c\x3b\x3b\x89\x97\xf0\x7c\xdc\x52\xfb\xcf\xa6\x8c\xe3\x23\x7c\xee\x34\x8e\x9d\x23\x42\xc6\x26\x2e\x79\x9c\xf3\x6e\xeb\x11\x88\x19\x1f\xc4\xc1\x33\x1f\xf9\xbc\xe5\xe3\xa3\xe1\xb1\x77\x53\x64\xd6\xb3\x23\xf8\x18\x05\xd1\xa9\x17\xed\x7f\x9c\x54\x52\x3e\x69\xca\xdc\x8d\xdc\x6e\x86\x9e\x48\x05\x71\xf0\xcc\x27\xc6\x52\x66\xa2\xf8\xc3\x3c\xea\x26\xfb\xe3\x4c\x23\xec\xf5\x6e\x53\x86\x9f\x7d\x64\x7e\x8f\x43\x1b\xfd\xae\x06\x4a\x31\xe9\x40\x07\x28\x20\x0e\x9e\xf9\xb0\xe8\x09\x2a\x5c\xf2\xa6\x94\x8f\x15\xe5\xd4\xde\x3d\xf3\x17\xbf\x7f\xfb\x5a\x5d\xcf\x52\xac\x8a\x73\xde\xa7\xeb\x84\x21\x17\x34\xa0\x95\x35\x80\xf3\x93\xfe\x67\x69\xce\x8d\x45\xf3\x7a\x9e\x5f\xd7\x39\xc8\xe6\xc8\x78\xc3\xf0\x52\x92\x5d\xac\x1b\xc9\x5e\x09\xe1\x52\x92\xfa\x0d\x45\x38\xbb\xd4\x05\x21\x8c\x30\x88\x43\x9c\xa5\xfb\xfc\xbb\x11\x06\xfd\xa0\x4f\x93\xc0\x70\xa6\x4d\xc6\x2b\xb3\x9f\xcf\x15\x49\x95\x30\x47\x69\x0d\x9b\x6b\x50\x94\xcb\x19\xe5\x63\x5e\x52\x45\x99\xfc\x36\x5b\x60\x83\x2a\xd4\x40\x1c\x5c\x02\x66\xdd\xd7\xad\x14\xbf\xa5\xe4\xe4\xf6\xc4\x3e\xbb\x51\x7e\x89\x32\x3a\x84\x22\x27\x22\x4c\x6d\xfa\xee\x0d\xfe\xbe\x65\x67\x45\x73\x44\x5c\x10\x07\x97\xc0\xcd\xcb\xf6\x05\xcf\x54\x9f\x91\xee\xeb\x6f\xeb\xe6\x6d\xb3\xd9\xdd\x8f\x8a\xf4\x4d\x3d\x0a\x4a\x7c\x70\x3e\x25\xa7\xb7\x39\xf7\x1a\x22\x2e\x88\x83\x4b\x60\x8b\x81\xaf\x19\x6d\x4d\x20\xe1\xa2\xcf\x3b\x05\x39\x53\x62\x51\x95\x15\x9e\x99\xa6\x35\x2a\x83\x1a\xb6\x11\x71\xa5\x59\x62\xe8\x05\x5a\x10\x07\x97\x80\x5c\x41\x6f\xb7\xef\x03\xb9\xf5\xad\x57\x66\xd5\x4a\x7e\xfe\xeb\x92\xd2\xfb\x52\xd7\x97\xa7\x16\xab\xfc\x03\x2c\x2c\x2e\x50\x6b\x20\x16\x3f\x20\x0e\x3a\x3f\xe1\xff\xf7\x05\x30\x68\x76\x3d\x4d\x03\x9a\xc5\x27\x38\x0f\xe6\x8d\x0c\xd3\xd3\xa4\x59\x0c\xf1\xba\x3b\x7f\x7c\x7b\x31\x18\x79\x48\x74\x7d\xb6\xc5\x59\x53\x4f\x3a\xd3\x0b\x31\x76\x10\x07\xd7\xc0\x50\x28\xf6\x5d\x95\x1c\xea\x92\x07\x2c\x4f\x75\xda\x5b\x4d\x1c\xdf\x9c\xf0\x38\xbe\xfb\x9a\xc0\x17\xd0\xee\x6f\xc2\xc8\xfe\xf2\x13\x22\x2e\x88\x83\x6b\xa0\x1f\xc3\x9f\xb2\x00\x8b\x31\xbc\xa8\xf4\xbd\xa1\xe2\xe3\xf8\x37\x09\x17\x8c\x64\xde\xa4\x5e\x9b\xfc\x11\xdb\x5f\xfe\xe8\xa8\x11\x1d\x3a\x43\x03\x70\x70\x0d\xf0\x28\x35\x3c\xbb\xdf\xb2\xd4\x5f\x20\x6c\x3e\x2d\xf8\xe2\xc1\xa8\xb9\xf0\xdd\xb4\x35\x86\xe6\x84\x1d\xb4\x47\x5b\x84\xe7\xad\x0e\xa0\x5a\x18\x00\x07\xd7\x00\x33\xd5\x42\x14\xc3\x8a\x9d\xed\x4e\xff\x77\x0e\x89\x57\xd1\x4e\x45\xa4\x86\x18\x6e\xaf\xf1\xf8\x4d\x23\x42\xe9\x5e\x28\xe6\xfe\x41\x68\x00\xc4\x41\xe7\xa8\x00\x23\x0c\x4a\x75\xa7\x69\x40\x3d\x02\x5b\x4c\x39\xf0\xc8\xee\xa8\x82\xd3\xf6\xe4\x1d\x17\x4a\x44\x06\xb3\x2c\x5e\x19\xb7\xca\x09\x37\xad\xd7\x91\x57\x3f\xf4\x5a\x36\x88\x43\xea\xb2\xb0\xce\x58\xca\xce\x14\xea\x7b\x82\x26\x45\x5b\x9a\xa0\x9b\xb0\x54\x12\x90\x50\xc0\xb0\x43\xd7\xb4\xb5\x87\x81\x67\x36\x3f\x0e\x75\x59\x00\x70\x70\x0d\x10\xb1\xb8\xb7\x92\xae\x78\x2c\x65\x89\xf9\x19\xe8\xa9\x58\x35\xc8\xa4\x0d\x56\x9a\x93\xb6\xe7\xc7\x3e\x75\x6d\xd9\xee\x26\x46\x83\xaa\xb6\x01\x1c\x5c\x03\xbc\xb1\x4d\xf9\x9b\x26\x16\xcc\xaf\x06\x44\x69\x2b\x67\xa4\x42\x58\x70\x44\x89\x1b\xfc\x87\x5e\xdc\x4a\xe6\xfb\xd1\xc7\x3a\x00\xf5\x07\x07\x71\x70\x0d\x88\xde\x15\x99\x18\xd3\x9d\xa7\x24\x67\x50\x63\x58\x24\x12\xc9\xa5\x0c\xfd\xfc\x92\xb6\x4b\x1e\xf3\xa3\xad\xfe\xa0\x27\xa3\xc4\x31\x42\x03\x20\x0e\x9a\x07\xee\xfe\xbb\x06\x40\xeb\x8e\xd3\x34\xe0\xe3\x56\xe7\x16\xb2\xf1\xf9\x39\x46\x6b\xf4\x41\xbb\x39\xd1\x5d\x8a\xab\xdb\xab\xb9\x4c\x83\x51\x49\xb5\xda\x5e\x2a\x37\x0f\xa0\x4b\xda\x20\x0e\xae\x81\xc1\x7d\x07\xda\xb6\x82\xef\x96\x39\xf9\xa9\xcf\x51\xc3\x22\x23\x71\xa6\x25\xd1\xe8\x52\x8c\x8f\x7a\x74\x31\x03\x05\xbb\x82\xe3\x10\x71\x41\x1c\x5c\x03\x74\x76\x5a\x46\x53\xb4\xae\x8f\x53\xee\x96\x19\xa1\x09\x6b\x9a\x7b\x95\x8e\xe1\x37\x06\xa0\x4c\x5c\x7f\xce\xfd\xfd\xc4\xa6\xd3\x0c\xba\xfb\x02\xe0\xe0\x1a\x40\xad\x4d\x7c\x28\x50\xed\xf7\x87\x6d\x34\x6b\x54\x21\xe0\x7e\x7b\x21\xff\x39\x4d\x3f\xe3\xfb\xc2\xcc\xeb\x33\xcb\x0c\xcf\x1b\xaa\xa0\xab\x75\x00\x0e\xae\x01\x55\xf9\x6c\x8e\xc2\x63\x7c\xae\x87\x1d\x56\x32\x4f\x96\xa4\x5f\x56\x91\x19\x16\x74\x52\xce\x46\xbc\x8c\xd2\xf9\x94\x56\xae\xbd\x8e\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\x99\xa8\xd3\x8d\xf0\x37\x25\xb9\x7b\x62\x85\x57\x74\xb0\x72\x0f\xf3\x09\x33\x86\x2e\x52\x9f\x6c\xb3\x71\x9b\x0d\xc9\x2c\x12\xfe\xd9\xa5\x94\x17\xf9\x8a\x30\x95\x20\x0e\xd9\x08\x67\xa9\x73\x7a\xad\x68\xab\x4e\x1c\x8a\xac\x05\x98\x1e\x9c\x9c\x10\xdd\x88\xaa\xb7\x97\xa1\x4d\x76\xb9\xfa\xf5\x65\xb9\x4c\x4a\x1d\x22\x32\x88\x43\x36\xc2\x33\x6d\xa4\xf1\xef\x30\xe6\xd5\xfc\xb9\xee\xd3\x0d\x8a\x5c\x6d\x88\x27\x25\x3b\x90\x14\xc6\x7f\xbd\x2e\x87\xf2\xd4\xbc\x91\xff\x00\x11\x19\xc4\xf9\xc9\x12\xc3\xbe\xc6\x7f\xdc\x6f\x5b\x5d\xc0\xd1\x29\x88\xa2\x41\x63\xa8\xe4\x58\xbd\xeb\x63\xc6\x9d\xf1\x9a\xa1\xaf\x9e\xf9\xdf\x05\xa9\x96\x0e\x65\xaf\xf7\xa4\x33\xff\x6d\x84\xa5\x8c\xdd\xd8\x73\xe3\xa4\x9e\xd6\x6b\xd7\x3c\xf0\xcd\x6a\x16\x50\xcd\x38\xe7\x9b\x47\x4d\xbd\xd6\xcd\xda\xd2\xc9\xf1\x94\x6c\xe3\x2f\x34\x5f\xd6\xbc\xbf\x5e\x78\xcf\xe6\x71\x48\x0c\x25\xc6\xa8\x42\x6a\x75\x21\xce\xab\xab\x96\x59\xa8\x2a\x37\x7f\x4d\x3d\x0a\x9c\x75\xf8\x6f\x33\xc2\xa0\xa1\xfd\x5d\x5d\x8d\x64\x84\x3b\xbb\x73\x7c\xb6\x44\x54\x73\x8e\x7e\x5f\xd8\x1b\x3a\x77\xeb\xb6\x46\xd9\xed\xfd\x05\x75\xb6\x09\xfc\xc8\x17\x2c\x95\x56\x77\x35\xce\xe4\xb0\xf2\x14\x23\xfc\x1b\xbd\x8c\xfe\xe3\x0a\x4d\xb8\xf2\x2f\xf2\xd6\xd6\x07\xe4\x1f\xee\xd1\xca\xf8\x31\x69\x4a\x0e\x45\x69\x5d\xc0\xeb\x8f\xca\x3c\x93\xa3\x59\x64\x23\x3c\xc7\xcb\xec\x81\x27\x99\xf5\x87\xe5\xf5\x2f\x1a\x2f\x79\xd7\x49\x73\xad\x95\x5c\x89\x39\xb3\x64\x77\x4b\x5c\x27\x99\xb6\x25\xcc\x33\x19\x2d\xb2\x11\xb6\x7b\xca\x62\xb8\x57\x30\x1d\x7d\x91\xea\xfb\xf5\xb9\x8b\x7a\x7c\xdb\xb4\x31\x5b\x8c\xdc\x46\xf5\x7f\x0c\xe5\x36\x5c\xbf\x09\x5a\x9c\xc9\x68\x91\x8d\xf0\x6d\xdb\x1d\x07\xa5\x87\x8e\x3a\xc2\xe4\xf2\xa6\x4c\xd6\x59\x13\x9e\xb1\xe1\x5b\x41\x6c\x14\xe9\x5e\xd2\xdf\xa6\x6d\x50\x3a\xec\xcf\xcc\x08\x83\x44\x74\x5a\xe6\x93\x59\xfb\xa1\x37\xde\xd8\x4a\xf8\xd0\x35\xb0\xe4\x30\x6e\xa2\x6b\xf8\x73\xae\xcc\xfd\x02\x45\x86\x0c\xfe\x77\x23\xf1\x12\x54\xe5\x88\x19\x1f\xc4\xc1\x33\xdf\x3d\x2c\x31\x3a\xd4\x9b\xa3\xfe\x58\x81\x8f\xdc\xb4\x1f\x08\xce\xab\x1d\x30\x57\xcf\x3f\xec\xc3\xa6\x70\xa6\x33\x8a\x67\x9e\x7a\x83\x88\x0b\xe2\xe0\x99\x0f\xef\xdc\xf1\xb7\x35\xbc\x2b\x54\x3a\xc6\x7d\xd3\xfb\x8e\xbc\x98\x1c\x3f\x4c\xa8\x07\xd8\xaa\xf4\x95\x83\x7c\xeb\x6a\xfa\x2f\x40\x0d\x36\x41\x1c\x3c\xf3\xfd\xfc\x2e\xbd\xa0\x68\xe3\xa0\x29\xf0\x2b\xf7\x84\xb6\xc1\x37\x4e\x7e\x84\x36\x5b\x46\x6f\xba\x70\x13\xa5\x8b\xe8\x3c\xce\xd4\x14\xd4\x5f\x05\xc0\xf9\x49\xff\xf3\x46\x12\x9b\x70\x6e\x2f\x0e\x9b\xc4\x9d\x30\xe3\x73\x01\x62\x33\xbe\xc9\xb7\x69\xef\x5b\xd6\x6d\x1b\xa0\xda\x25\x7a\xbb\xbb\x31\x17\x53\x21\x8c\x30\x88\x43\xf4\xdb\x6e\x00\x18\x61\xc0\x0f\xfa\x34\x09\x94\x63\x28\x54\x5e\xf9\x68\xba\x78\x2e\xea\xbb\x89\x48\x05\x95\xdb\x58\xe8\x3c\x67\xd4\x8f\x1e\x9d\xfe\x3b\x52\x12\xc6\xf7\xe8\xe6\x10\x43\x07\x71\x70\x09\x38\x45\x27\x6a\xba\x72\x27\x92\x77\x1d\xaa\xad\xe5\x19\xd8\x7b\x75\x99\x87\x66\x26\x75\x57\x3e\xeb\xb9\xbb\x7f\x50\x63\x35\x72\x0f\x11\x17\xc4\x21\x9d\x04\xbd\xeb\x3e\x59\xca\xf1\xac\xe9\x7f\x9c\x66\xff\xc0\xc3\x92\x20\xf1\xde\xcc\x4a\xea\x51\xb0\xf5\xda\xba\xb9\xa6\x95\x9f\x2a\x74\x51\x19\xc4\xc1\x25\x10\x1c\x8d\x3f\xd9\x30\xa2\x96\xe0\x23\xd5\x42\x2f\xf9\xa0\xf8\xa9\x6c\x81\xf5\x76\xc6\xde\xa7\x70\x61\x1c\xf6\xb5\x8c\x30\x65\xa8\xb2\x10\xc4\xc1\x25\xa0\xcc\xc8\x7c\xbb\xbd\xe6\x30\x84\x89\xf0\x21\x93\x43\x78\xa4\x72\xf5\x53\xeb\xe2\x8b\xaa\x63\xec\x4d\x21\x73\x7b\x17\xdf\x6e\x46\x23\x16\x3f\x20\x0e\xea\xb1\x0a\x30\xc2\xa0\xd9\xf5\x34\x0d\x54\xce\x15\xbe\x8b\x1b\x50\x7d\xc0\x3d\x9c\x79\x63\xb5\x8f\xa8\x99\x0c\x73\xda\x76\x24\x52\xc3\x83\x6a\xad\xf3\x35\x59\xf4\xc7\x06\xc4\xd8\x41\x1c\x5c\x03\x0a\xfb\xbd\x5d\xf7\x9f\x4e\x11\xc5\x18\xa5\x51\x5f\x72\x21\xb6\x53\xeb\x54\x7a\x58\x4c\xc8\x87\x2f\xf7\x59\xf8\x56\x19\x35\x9b\x38\x22\x2e\x88\x83\x6b\xe0\x4e\x73\x30\xae\xec\x15\xdf\x1d\x9c\x11\x8f\x05\xd9\xc5\x85\xa9\xfe\xb5\x30\x11\x95\x0a\x76\xc9\xc3\xb9\xa6\xd8\x65\xde\x76\x55\x44\x5c\x10\x07\xd7\x80\xfd\x1d\x67\x02\x03\xa5\xaa\x6c\xb5\xf4\x92\x8a\xc1\x88\xc7\x43\x4a\xc5\xb8\x41\xd7\xb1\xbc\x5e\x58\xbe\x3d\x21\xee\x91\x9e\x85\x9a\x42\x80\x38\xb8\x06\x9a\x30\xeb\x9c\xab\xc8\x3d\x4e\xba\x7a\xb3\x82\xa4\xb8\xbf\x2e\x52\x7e\x0c\xa4\xcb\x23\xbe\xfe\x53\x5e\xc5\xb5\xb6\xe5\x20\x10\x7a\x81\x19\xc4\x41\xbd\x96\x01\x46\x18\x94\xea\x4e\xdd\x10\x6b\x45\x0d\xf1\xc1\x33\x56\xd4\xf2\xe6\xb0\x60\x23\xec\x7b\x29\xf8\xf6\x51\xf7\xa0\xf4\x2b\xde\x23\x72\xdf\x67\x72\x14\x4b\xb1\xd0\x86\x18\x80\x83\x6b\xc0\x64\x6b\xf4\xd5\x15\x9e\xd7\xbf\xd9\xed\xb0\x7a\xbf\x27\x35\x1e\xb0\xfe\xc6\x8f\xaf\x1b\x4c\xd7\xec\xa7\xe2\xd7\x90\xd6\xc5\x85\x7a\xb9\x83\x38\xb8\x06\x78\x2a\xba\xbb\xa3\x37\xd8\xcf\xc5\xf8\x73\xcd\xee\x13\x3d\xce\x2a\x9b\x8b\xbd\xd2\x5a\xd8\x6d\x9c\x30\x12\x35\x4c\x96\x27\x75\x07\xda\xb4\x00\x70\x70\x0d\x08\x5c\xda\x7e\xe6\xf4\x83\x84\xe1\xc0\x31\x8a\xaa\x61\xf3\xfd\x6f\x5f\xaf\x30\xc7\xe2\xfd\x44\xba\xd7\x6b\x9e\xa6\xc6\x6a\xec\x3c\x88\xb8\x20\x0e\xae\x81\xf3\xd3\xb7\x44\xbf\xf1\x3d\xd6\x11\x0f\x52\xb3\x65\x0f\xa8\xf4\xe7\x15\xdd\x2b\xdf\xec\xbe\x96\xf8\xd6\x5a\x15\xdf\x4f\xb8\x2c\x02\xba\x15\x00\xe0\xa0\x79\x00\x60\x84\x41\xeb\x8e\xd3\x34\xd0\xb2\x9a\x93\xc4\xcb\x1e\x12\xad\xff\x31\xc2\xac\x31\x35\x2d\xbf\xe2\x5e\xd6\x5d\xa3\xa1\x7d\x9e\xba\x59\x1a\x92\x0b\xb6\xe6\xe7\xa0\xbe\xd8\x00\x0e\xae\x01\x2a\xd1\xee\xdf\xe9\x82\xe9\xc5\xca\x2b\xcb\x28\x1c\x85\x9f\x3f\xf3\x6c\x91\x98\xb0\x05\x2d\xcb\x54\x97\x99\x37\x1a\x36\x98\x43\x17\xb9\x40\x1c\x5c\x03\xc6\xa6\x13\x1b\xe7\x5c\x9c\x26\x46\x4d\xf9\xc4\xaf\xf9\x8c\x90\x8a\xd5\x09\x3a\x2a\x33\x49\x63\x72\xae\x97\xc5\xc7\x39\xbc\x34\x45\xc4\x05\x71\x70\x0d\xd4\xed\xe4\x44\x74\xfe\x64\x48\x98\x21\xc0\x5c\x59\xb7\x4d\x75\xa8\xc8\xbf\x4f\xc4\x9c\xbd\x27\x5c\x8d\x95\x21\xe8\xa4\xf5\x81\x1f\x11\x17\xc4\xc1\x35\x80\xba\x1f\x76\x68\x16\x81\x91\x40\xf7\xfe\xc7\xf3\x92\x41\xbf\xc0\x4a\x8c\xdd\xc1\x72\x8e\x2b\x49\x6d\x53\xfe\xde\x8d\xfd\x6a\x15\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\x90\x89\x3a\xdd\x08\x13\xc9\xb8\x31\xcc\x07\xa2\xa6\xfe\xe2\x60\xf4\xce\xb9\xfe\xd2\xff\x56\xcd\xa5\x06\x02\xb9\x81\x27\x22\x0d\x1d\x29\xda\x2b\xf1\x77\xa0\xde\xd5\x00\x0e\xd9\x08\xbf\xc3\x8c\xb1\x22\xac\xe5\xce\x9b\x93\x6d\x1d\x08\xb1\xad\x61\xee\xad\x44\x1f\x59\x6a\x0a\x73\x1e\xff\x8a\xcf\x48\xfb\xcd\xe9\x1e\x22\x32\x88\x43\x36\xc2\xa6\xa1\x8e\xf5\x0f\xd3\x9e\xb2\xaa\x2f\x3e\xc4\x50\x4d\x72\xce\x8c\x9f\x19\x17\x3e\x9e\x2b\x52\x53\xe7\x3b\x50\xd1\xe3\x64\x87\x2a\xc2\x41\x9c\x9f\xac\x24\xdc\x08\xff\xa7\xfd\xb6\xdf\xc8\xf8\x3f\x5e\xf6\xb8\x9f\xd1\xff\x3d\xf3\x10\x6d\xfb\x7a\xe3\x9d\x55\xb4\xd1\x62\x5a\x61\x31\x9a\x65\x75\x9f\x9f\x0a\x4a\xc7\x7f\x1b\xe1\x11\x8d\xbc\x73\x43\xa5\xfd\x09\x1f\x6f\x7d\x5b\xa9\xbd\x95\x88\xe7\xff\xca\x6e\x4f\x6b\xb5\x69\xfb\x75\xd1\x61\x83\xca\x38\xb5\xe6\x5f\xa8\xc6\xcb\xe5\x94\xab\x0e\x09\xe7\xaa\xda\x16\x76\xc4\x67\xb9\x9a\x07\x77\xef\x31\x1a\x7a\x30\xb5\x11\xd1\xe6\xa6\x51\x15\x9e\xdb\xf8\x6f\x33\xc2\xa0\xa1\xfd\x5d\x5d\xad\x00\x37\x4b\xa3\xaf\xf3\xdf\xef\xb5\x10\x7c\x18\xcf\x0b\x35\xe8\xd1\xd2\x6f\xe7\x11\x35\x69\xe1\xa4\xbf\xe5\x98\xd1\x23\xc8\x5a\xe9\xdc\xfc\xed\x4c\x0e\x2b\x91\x8d\xf0\x79\xbb\x03\x3f\x19\xd4\x75\xc9\x8f\x16\x5d\x44\x4c\x92\xa9\xa1\x9d\x44\x94\x2b\xc1\x13\xd6\x0d\xc2\x64\xe4\xfe\x6e\xc2\xef\x47\xce\xe4\x68\x56\x1c\xe9\xcf\x9a\xf4\xc6\x16\x6d\xdd\x7e\xfa\xee\x9b\x1b\x73\xbe\x7f\x7e\xea\xbd\x3f\x56\x55\x6b\xe5\xc3\x18\xea\x17\x9e\x36\xf1\x69\x9d\x74\xdd\x3c\x93\xd1\x22\x1b\x61\x9f\x68\x75\x62\xb5\xf2\x5d\x79\xb1\xeb\x4f\xd5\xe5\xcd\xa8\xb9\x74\xa8\xe5\xc5\x8a\x72\xb2\xfd\xcf\x0f\xd9\x78\x2f\x1e\x63\xf5\x9e\xc9\x68\x9d\x90\xfe\x6c\xf3\xfc\xf0\x11\xde\x17\x6e\xf9\xdf\x9f\xaf\xe5\xd9\x30\x77\x7f\x55\x6e\x6a\xc4\x4b\x18\x6a\x7f\x95\x7a\x21\xad\x67\x5a\x2e\xb5\xee\xcc\x8c\x30\x48\x44\xa7\x65\x3e\x41\x09\x03\xd7\xb1\xee\x6e\x76\x2e\x6b\xeb\x6f\x53\x8f\xf8\xab\x9b\x49\x98\x56\x92\x59\x70\x0d\x04\xb8\xec\xbd\x2e\x18\xf1\x42\x3d\x55\x40\x1c\xd2\xd3\xab\x19\x8a\xaa\x31\x15\x4c\xda\xe9\x85\xd5\x0c\x0e\x6d\xf7\x63\x95\xd9\x12\xc5\x6d\x26\x34\xdf\xc8\x14\x10\xcd\x4d\xb0\xfc\xdf\x07\xad\x40\x1c\x3c\xf3\x3d\x60\x49\xab\xd3\x39\xce\xe6\x5e\xd2\x6f\x0e\x79\x3f\xb5\x48\xb1\x84\x93\xaa\xc2\x93\xd1\x32\xe0\x3a\x91\x26\x7e\x9d\x3b\x66\x17\xea\x83\x02\xe0\xe0\xdf\x61\x34\x7a\xc1\x6e\x72\x0f\x07\xef\xa1\xa6\xc5\x5c\xa5\x05\x35\xad\x4e\x3e\xd6\x76\x6b\x41\xb2\xfa\xee\x0f\x27\x19\xc6\xc0\x05\x5e\xe8\x4e\x24\x80\x83\xc7\x9d\x88\xfa\x7e\x5b\xe3\xd8\xf7\xc7\x25\xd2\x29\x4e\x32\x1e\xb9\x90\xd6\xaa\x05\xaf\xfd\xc1\x08\x5b\x4f\xb1\x7b\x8e\x7f\x36\x72\x97\x10\x46\x18\xc4\x21\xfa\x6d\xff\xcf\xd4\xf1\x2f\x8b\x1f\xd0\x0f\xfa\x34\x09\xf0\x1c\x16\xfa\x3c\xa7\x8f\xc4\xd1\xc2\x75\xb2\x0d\xf0\xa8\xd6\x76\x20\xb0\xff\xc4\x92\xfa\x49\x39\x70\x9a\x60\x5f\x43\x87\x0e\x7a\x6c\x07\xc4\xc1\x25\x90\xd7\x94\xcf\x4d\x27\xc8\x63\x1d\xf5\x1c\x55\xc9\x84\xf6\x87\x84\x8d\xb7\x8a\xc2\x5b\x8a\xd0\x1f\x3c\x39\x8c\xf8\xbf\xfd\x73\x20\x63\x09\xe2\xe0\x12\x08\xe5\x96\xb4\xd3\xbc\x61\xb3\x28\x92\x58\xc5\x6c\x4e\xf2\x8e\x94\x2a\x97\xf4\xf2\xb1\x34\x9b\x46\xe8\xbe\xaf\xa0\xd9\x68\x36\x74\xc2\x04\xe2\xe0\xdf\xc1\x3f\xed\x61\xc7\x9b\xdf\x91\xbd\x57\x5d\x84\x07\x15\x7b\xdf\xd7\xc7\xd9\x64\x3e\x74\x79\xba\x3c\x53\xec\xd6\x6a\x2b\xa9\xfb\x0c\x5a\xac\x81\x38\xa4\xd3\x56\xae\xf3\x4a\x37\x2d\x94\x6e\xce\xc9\xdd\x4a\xc1\x48\xf9\x2a\xed\x1f\x95\x43\x7c\x70\xde\x8a\xb7\x85\x15\x3f\xba\xb9\x28\x69\x14\xb1\xf8\x01\x71\x50\x8f\x55\x80\x11\x06\xcd\xae\xa7\xb6\x9a\x7b\xbf\xc3\xdf\xf4\x68\xfc\x36\x5a\x29\x63\x2b\x69\x0a\x1d\x83\x83\xdc\xd0\x1f\x06\xdd\x52\xeb\x87\x42\x58\x06\x77\x09\xe2\x9d\xa0\x56\x73\x00\x0e\xae\x81\xc0\x37\x3f\xdd\xef\x92\x8c\x3c\xd1\xb6\xf8\x79\xa2\x69\x51\xd7\x4e\x1d\xe6\x94\xbe\x58\xb1\x3e\xed\x38\xa8\xc8\xe5\x66\xe4\x33\x86\x88\x0b\xe2\xe0\x1a\xa0\x90\x19\xe5\x8d\xd7\x88\xa8\x08\x8d\xf5\xfc\x93\x64\xa2\xec\x8c\xbb\xeb\xcb\xba\x43\xfa\x20\x3b\x24\xc4\xeb\xdb\x02\x8a\x76\x0e\x22\x2e\x88\x83\x7f\x87\xae\x0f\xba\xe1\xb7\x57\xb8\x29\x29\x12\xe9\xb2\x8b\xe2\x59\xd9\x9f\x19\x1e\x2b\xb2\xdb\x55\x38\x53\xed\x10\x74\x75\xbc\xc5\x91\x47\xc4\x05\x71\xf0\xb8\x49\xd5\x76\x87\xdb\x5a\x9f\x89\x67\x02\xe9\x14\x87\xa7\xca\xe9\x3b\xe8\x7a\x51\x26\x9f\xae\xd1\x16\x5a\x5e\x14\x20\xe9\xd3\x85\x36\x43\x40\x1c\xd4\x6b\x59\xfc\xdf\x35\x00\x4a\x75\xa7\xbe\xc4\x7e\x79\xbe\x9b\x46\xce\x75\x32\xd2\x86\x28\x94\xf9\x66\x8a\x3f\x4d\x8d\xab\x7b\xb3\xe0\xd8\x68\xf7\x45\x5f\xa1\xa1\x81\x24\xa8\x2d\x20\x88\x83\x6b\x60\x71\x62\x30\x94\x3b\x6c\x7b\xca\xb8\x1a\x8b\x3d\x51\x21\xa9\x8f\xd3\x68\x91\x08\x63\x94\xd1\xa0\xe2\x61\x87\x37\xaa\x63\xd1\x4d\x44\x5c\x10\x07\xd7\x80\x10\xed\x70\x33\x46\x32\xb3\xed\x24\x05\xbd\xbe\x71\xb4\x37\xc5\xd2\x8e\x4e\xff\xa2\xc3\xc7\xd9\xde\x22\x7c\xa6\xdf\xb1\xcf\xdc\xa0\xde\xe8\x00\x0e\xfe\x1d\x44\xdc\xd2\xb7\x45\x3d\x2a\xa9\x1f\x48\x84\x73\x49\x6d\x48\xba\xd1\x78\x06\xff\x9c\xb7\x70\xec\x9b\xcd\x2a\xc7\x4e\xb0\x6c\x79\x8b\x88\x0b\xe2\xe0\x71\x4f\x1e\x99\xba\x5b\x2a\x3e\xaf\x38\xbf\xa4\xa1\x49\x42\xbd\x63\x48\xd7\xa0\xc9\xa5\xd1\xa0\xa9\x9c\x65\x7c\xd0\xc6\x5f\x22\x6a\x84\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\xad\x3b\x4e\xd3\x40\xe8\xbe\xa0\x70\xf6\xe3\x52\x6b\x63\x19\x6e\x1c\x07\x31\x4c\xd4\x07\xac\x3e\xe1\xcf\xf6\x77\xdc\xfa\x9d\x75\xe7\x30\xcc\x5c\xe7\xa1\xb9\x15\xc0\x21\x75\xda\xc0\x6a\x20\x98\xef\xac\x68\xb4\x31\xc1\xe2\xf4\xbf\x15\x60\x6e\xf4\xc1\xaa\x3c\xfc\xb7\x16\x4a\xfd\xe7\xc9\xbd\x9e\x40\x0b\xa8\xdd\x20\x88\x83\x6b\xa0\xe7\x0e\x2f\xc7\xd3\x00\x6d\xff\x06\x3d\x87\x47\x0d\x65\x2e\xe8\xb9\x47\xf2\xac\x5c\xaa\x6c\xf7\x50\x13\xaf\xb8\x6f\xbd\xae\x80\xfa\x78\x83\x38\xf8\x77\xf0\x8c\x56\xf1\xf0\x42\x13\xf0\xbd\x57\x4b\xaf\x9b\xde\x77\xeb\x93\xd2\x7a\x2b\x31\x71\xd2\x7b\xb1\x4f\xaf\xe4\x7a\xae\x32\xde\x84\xda\x2e\x82\x38\x78\xdc\x4c\x66\xd4\x60\x61\x22\x75\x4d\x41\xa6\xe6\xe9\xc9\x2b\x83\x75\x9b\xef\x4c\x6e\xa3\x1e\xdd\x8c\x43\x33\x44\x5b\x59\x38\x79\x29\x82\xd0\x00\x88\x83\xe6\x01\xa7\x7f\x37\xc2\x20\x13\x75\xba\x11\xf6\x4e\x29\x12\xb5\x9e\x17\xeb\xf6\xb6\x18\xc4\xe2\xec\xd0\x3e\x1e\x89\xf2\x7e\x52\x38\xb2\x26\xd5\x21\xba\x18\xff\x3a\xde\x3a\x07\x61\x2a\x41\x1c\xb2\x11\x1e\x23\x72\x36\x49\x6f\x7b\xd6\x59\x43\x56\xf6\x2a\x63\x36\xe3\x26\xf7\x06\x77\xfa\x4e\x7c\x69\x8a\xe8\x91\xdd\xb0\x87\x0d\x6b\x35\x74\x81\x19\xc0\x21\x1b\x61\x81\x29\xd1\xe1\x00\xf5\xb9\x90\x48\x97\xd1\x24\x1c\x0a\xce\x17\x64\xfb\xdc\xbe\xf4\xa2\x56\xe3\x8d\x37\x26\x38\xba\x6e\x07\xa0\x20\x22\x83\x38\x3f\x59\x14\x54\x58\x27\xef\xff\xb4\xdf\x36\x45\x9d\xb2\x63\xfa\xc9\x60\xda\x8a\xf8\xd7\x6d\x4d\x72\x26\x4e\x74\xde\xc8\x85\xa8\x0a\x62\xe7\x6e\x72\xea\xec\x2b\x6a\x15\xda\x7f\x1b\xe1\x0b\x0f\xbf\xed\x5c\xe6\x1d\x37\x7b\xae\xc3\x48\xec\x65\x12\xcb\x36\xe4\x93\x6c\xe8\x79\x0e\xbb\xfc\xd0\x33\x7c\x46\x7d\xe1\x91\xc3\xdf\xb7\x9f\x68\x2f\x8c\xcc\x9a\x7c\xe4\xcb\x7d\xb6\xa3\x28\x82\xff\x85\x5c\x9b\x87\x70\x23\x73\x8d\xeb\x77\xe2\xd4\xb8\x22\x0d\x61\x9e\xf0\x7f\x9b\x11\x06\x0d\xed\xef\x1a\x61\x24\x23\x3c\x2c\x53\xd7\x88\x5d\xf3\xfe\xe9\x8f\x1a\xab\x3d\x4b\x9a\x8d\x89\xae\xdb\x3e\x99\x23\x78\x1b\xf2\x8b\x87\x0d\x71\x36\xc3\xcf\xab\xcf\xe4\xb0\x12\xd9\x08\x8b\xbe\x70\x90\x16\xf6\xf2\xec\x1a\xeb\x33\xf0\x9f\x7f\x35\x70\xb0\x15\x2d\xe4\x69\x59\xe4\xfa\x68\xf0\xd7\x53\x29\xe6\x39\xa9\x33\x79\x8a\x49\x12\xd9\x08\xbf\xae\x8c\x7b\xa7\xd3\x19\x75\x05\x33\xee\x33\x9e\x5f\x3b\xca\x8f\x0b\x22\xfa\xee\xc7\xcb\x87\xc1\xf5\x11\x2e\x56\x16\xee\x55\x67\x53\x23\x8c\x6c\x84\xb1\x89\xaa\x3e\x77\x87\x18\xaa\x06\x86\x9e\x18\x6f\xc9\xd5\xe6\x2b\xaf\x96\xec\x5c\x28\x79\x96\x8c\x62\x20\x69\x15\xd2\xf8\x3e\xe2\x4c\x46\x8b\x6c\x84\x0d\xd7\x71\x16\x79\x9f\x8f\x97\x07\x93\x08\x0d\x10\x89\xe2\xc6\xd0\x60\xdf\xaa\xae\x33\xc8\xf3\x72\x47\x6d\xe5\x1a\xd3\x89\x29\x3a\x33\x23\x0c\x12\xd1\x69\x99\xcf\x34\xec\xed\xf5\x77\xea\x55\x72\x4d\x33\xe7\x95\x16\x1f\x92\x44\xda\xee\x57\x68\x2e\x32\xa4\x95\xd1\xf6\xbf\x73\xee\x50\xac\x61\x43\xcc\xf8\x20\x0e\x9e\xf9\xec\x3c\xdd\x5c\x25\x9e\xdd\xc9\xc0\x2e\x79\x7f\x61\x41\x57\x37\xac\xf6\x43\xd1\x73\x4b\xef\x73\x54\x19\xa9\x04\xcf\x6e\x88\xce\xbe\x83\x9a\x17\x03\x38\x78\xe6\x93\x7d\xfe\x7a\xd0\xe8\x1d\xa1\x06\x51\x0b\xdb\x87\x57\x58\x72\xa2\x21\x17\x5a\x9b\x6e\x31\x1e\xfa\xeb\x53\xb2\xfa\xad\x47\x7c\x81\x5e\xb2\x01\x71\x48\x0d\x87\x25\xf6\xca\x50\x83\x99\x97\xe7\xff\x90\x35\x60\x4b\x5f\x2d\x48\xea\xe4\xf0\x24\xc1\x41\xe1\x9c\xc1\xd3\x7c\x88\xbb\x8b\x71\x08\x35\x1c\x06\x70\x7e\xd2\xc4\xff\x88\xbb\x20\xec\x10\x97\xe7\xdf\x83\x7f\xbb\xd9\x49\x3c\x7c\x40\xcd\xc7\x4c\xb8\x3f\x88\xbe\x9f\xf3\xdb\xa0\x2d\x93\xcf\x72\xbe\xee\x17\x84\x11\x06\x71\x50\x8d\xf0\xbf\x1b\x61\xd0\x0f\xfa\x34\x09\x5c\xa6\x65\x9d\x9a\xa8\xd1\xc1\x88\x40\x91\x98\xec\x40\xf1\x7e\x25\xe2\xf7\xda\x75\x75\xa2\xa0\x18\x67\xa0\xc6\xdd\xaa\xc4\x01\x3a\xbc\x07\x71\x70\x09\x8c\xff\x08\x15\x8f\x8e\xd8\xe7\xaf\xb1\x31\x2e\xe5\x6d\xf9\x25\x77\x72\xe9\xaa\x30\x61\xf0\x48\x4d\x4f\xe2\x81\x65\xe3\x17\xdf\x5a\x44\x5c\x10\x07\x97\x40\xc0\xf5\x8e\x3d\x99\x40\xe7\x14\x0e\x5f\xc6\xb6\x97\xb8\x32\x09\x19\xb8\x77\xdf\x32\x7c\xa6\x6d\x3a\xdf\xeb\x17\xb2\x4f\x39\x99\x02\xd5\x32\x02\x38\xa4\x57\x88\xe9\x73\xdf\x5a\xc5\x49\xba\x34\x7e\xba\x15\x77\xb0\xda\x2a\x60\x19\xe1\xb8\x27\x90\x2b\x17\xd3\xbf\x9e\x9e\xcb\x22\xd5\x0f\x9d\x2e\x80\x38\xb8\x04\x86\xf8\x7c\x31\xd1\x5a\xb0\x4c\x38\xc5\x13\x0c\xe9\x07\x06\x86\x8e\x04\xf5\xf3\xf8\x5b\x5e\xd1\x47\xd0\x7f\x24\xda\x1e\x56\x0f\x47\x2c\x7e\x40\x1c\x54\x1b\x08\x30\xc2\xa0\xd9\xf5\xd4\x0a\x09\x2f\x2f\xa5\xb5\x54\x97\x92\xc1\x19\x12\x2f\xc3\x65\xf4\x44\xf4\x35\x61\xb2\x4d\xce\x3f\x17\xe7\xe8\x85\x2a\x6f\x35\xbe\x84\x6e\x05\x80\x38\xb8\x06\xfc\x85\x6c\xb9\xbe\x36\x7e\x2d\xec\x91\xc7\x98\x71\x93\x16\x91\xc3\x6c\xe0\x69\xa4\xd2\xc3\xab\xc1\x4d\x4f\xb0\x57\x49\x17\x57\x81\x36\x17\x00\x1c\x5c\x03\x24\x6b\xeb\x54\x18\x25\x05\xeb\xf9\x42\x2f\xf2\x3f\x16\x6c\x7f\x75\x98\xc6\xff\x15\x96\xa1\x84\xcb\xcb\x90\xb3\x1d\xe5\xaa\xd0\x84\x88\x0b\xe2\xe0\xdf\xe1\xaa\x66\x89\xc5\x0c\xea\x0e\x46\x5b\xc6\x84\x3c\x45\x47\xb6\x2d\x56\x29\x5f\xa9\x33\x21\x6a\xcc\xb9\xd4\xa2\x1b\xd2\xc1\x89\xeb\x88\xb8\x20\x0e\xae\x81\xe4\xd5\x58\xe5\x16\x2d\xd6\xc4\x45\xdb\xb1\x64\xaf\x4f\x73\xfc\x72\x9d\x44\x47\xf1\x0a\x89\xfc\xea\x0d\xea\x6b\xd2\x6a\x61\x5c\x08\x0d\x80\x38\xa8\x36\x10\x60\x84\x41\xa9\xee\x34\x0d\x90\x95\x0b\x07\x7e\xb4\xae\xbd\xff\x31\xcd\x27\xf0\xc1\x6f\x9b\xb5\xef\xb9\xaa\xb8\x31\xca\x4c\x29\xce\x0f\x29\x2a\x93\xb3\x16\x8b\x10\x63\x07\x71\x70\x0d\x14\xd6\xbf\x63\x78\x74\xe4\x8f\x33\xc5\x35\x8b\x13\x3f\xa1\x86\xeb\xbe\xd7\x29\x95\xca\xdd\xb4\x2a\xbb\xab\x2a\xaf\xf5\x73\xd8\x08\x11\x17\xc4\xc1\x35\x30\x53\x9a\x58\xd2\x6a\x25\x2a\xc7\x9f\x47\x2a\x68\x6d\x9d\xe3\xf2\x64\x3b\xbf\x1a\x65\xc5\x3b\xba\xcd\x4b\x26\xe9\xc5\x7d\x61\xa8\x43\x26\x88\x43\x7a\x91\x5e\x87\xf5\xcb\x1f\xad\x88\x8e\x62\x6c\xe6\x06\xcd\x19\xde\x57\x78\x9f\x5b\x7e\x7e\x6f\x37\xb3\xad\x91\x41\xa3\xd0\x60\xda\x80\x5e\x76\x06\x71\x70\x0d\xbc\x0c\x7b\xa7\xfa\x2b\xb4\xa9\xa2\xb6\xae\x9f\x61\x29\x4f\x52\x73\xb3\x07\x93\x40\xe3\x31\x49\x41\x21\x57\x4f\x1f\xa1\x97\x17\x3b\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\x4d\x03\x77\xa6\x66\xcb\x26\x0a\x5b\x6c\x22\x58\xd7\xde\x6e\xdc\x8a\x67\xd3\xe1\xba\xcf\x70\x35\xa5\x10\xdd\x3d\xe9\x69\xe3\x1d\x06\xbf\x5c\xe8\xa6\x05\x80\x83\x6b\xe0\x08\x33\x4e\x38\x35\x37\x12\xe5\x8b\xe8\xf8\x61\x2a\xf9\xf6\xc3\xeb\xdf\x54\x7e\x8f\x8e\x1c\x50\x0e\xa4\xd0\xb0\xc7\x54\x96\x7c\x46\xc4\x05\x71\x70\x0d\xb8\xd1\x16\x96\xb8\x7a\x55\xde\xc0\xb1\xb8\xa4\x1d\x29\xeb\x23\xce\x96\x56\x37\xd9\x62\x51\x18\xc0\x50\x76\x50\x76\xbd\x32\x09\xfa\xbf\x02\x71\x48\xb9\x20\x5a\x54\xc6\xba\x5b\x04\xcd\x23\xc6\x29\xc8\x23\xf9\x7d\xb0\xee\x5b\xde\x08\x4e\x13\x32\xb2\xf1\x82\xab\xdc\x17\x6c\xab\xa0\x57\xb8\x41\x1c\x5c\x03\x1e\xf1\xa3\x8d\x57\xfa\x3e\x13\xc6\xd9\x2f\x44\x8e\xbf\x7a\xb8\x38\x63\xc0\x78\xa5\xf9\x91\x47\x6e\x76\x6b\x1e\x56\x07\x7b\x7d\x2b\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\x64\xa2\x4e\x37\xc2\x23\x9e\xfa\xbc\x3d\x1f\x33\x02\xc9\x4b\xeb\x77\x74\x16\xaf\x5d\x54\x7b\x51\x2a\xbd\x8a\x12\x45\xbc\xb5\xe3\xd9\x89\x7e\x6b\x92\x0f\x61\x2a\x41\xdc\x29\x27\xc2\xe9\x3c\x28\xb7\x6a\x7b\x51\xb8\x08\xed\x75\x2e\x5d\x3a\xef\x64\xd6\xd9\xf1\x34\xfb\x62\x9c\x16\x9b\x5f\x1b\xf5\xbb\xcb\xdc\xec\xd0\x89\x30\x80\x43\x36\xc2\xee\x54\x1b\xf4\x78\xaf\x3c\xfa\x32\x1d\x14\x7f\x72\x8c\x3a\x68\x88\x25\xf4\xce\x5c\x99\xe3\x5f\x1b\xc3\x22\x93\x26\x1d\xb6\x73\x41\x44\x06\x71\x7e\xb2\x28\x18\xff\x8c\xfc\x1f\xf7\xdb\x76\xf1\xf4\x9d\x25\x3e\x6f\x1f\xd4\x5a\xa0\xe6\xa3\xf4\xe4\xbd\xc4\x0f\xd5\x70\xcc\x40\x7a\xd5\x17\x6c\xa9\x26\xb2\x97\x5f\x26\xbd\xf9\xdb\x08\xdb\xae\x7a\x34\x3e\x93\x2f\xb8\x15\xae\x8a\x4f\x62\xe7\x9c\x5d\xef\x45\xdd\x1a\xe2\x82\xa6\x7a\x64\x82\x86\x45\xbd\x4b\x3e\x46\xf7\x17\xaa\xae\x9a\xdd\x35\x40\xc6\x21\xcb\x72\xce\x02\x8b\x80\xf5\x69\x35\x51\xc1\xf9\xf7\xed\x39\x74\x32\xdc\x91\x41\x5d\xb7\x4b\xab\x56\xfe\xdb\x8c\x30\x68\x68\x7f\xd7\x08\x23\x19\x61\xf5\x58\x56\xec\xd7\xa5\xa1\x89\xba\xac\x34\x1f\x1c\xb2\x3d\x88\x35\x9a\xf0\x42\xd6\x14\x79\xf9\x8f\x73\x2f\xc8\x5c\x62\xf0\x3c\x9b\xaa\x59\x01\x24\x8f\x56\xe8\x5c\x6b\x9a\xe4\xa7\x20\x49\xb3\x98\x1b\xc5\x1a\xc9\xbc\x99\x3d\x71\xd5\xd7\x52\x85\x99\xa9\xd7\x5f\x9c\x82\xc0\xbc\x8c\xfa\x4c\x8e\x66\x91\x8d\xf0\xa6\x00\x36\x0b\x56\x97\x26\x21\x77\x49\x86\x32\x0e\xa7\xb1\xfc\x2d\xeb\xfd\x81\xdf\x4d\xfd\x9a\x38\x75\xd9\xbb\x79\x94\xf8\x9e\x67\x32\x5a\x3d\xa4\x3f\xfb\xed\x2a\x15\xc7\x71\xa6\xda\x2f\xea\x4d\x3b\x0e\x3c\x7e\x7a\x74\x21\x6a\xdb\xcc\xe3\x56\x8f\x29\x6e\x6f\xde\xc9\xc8\x1d\xd3\x4f\x67\x32\x5a\x64\x23\x3c\xf2\x21\xaa\x21\x6e\x9d\xc1\x68\xa9\xc8\x4f\x70\x01\x67\xfa\xb9\x2f\xcb\xc0\xd7\xd2\xfe\x10\x8a\x22\xc3\xc4\x23\x12\x82\x28\xf3\x33\x33\xc2\x20\x11\x9d\x96\xf9\xe6\x7e\x68\x64\x1a\x9e\x94\xdf\xa5\xed\xe1\xfc\xf3\x52\xcc\x80\xc9\x73\x57\xd9\xb3\x99\x60\x6a\xef\x03\x3a\x65\xda\xa5\xac\x18\xe8\xf9\x5d\x10\x07\xcf\x7c\xc3\xec\xf3\x39\x0c\x0f\xcb\xbd\xb0\xcd\x56\x59\x0d\xbe\x56\x3f\xe4\x47\x2f\x61\x74\x7b\xed\xa1\x13\xbe\x5c\x1f\x64\xa8\xde\x05\x1d\x07\x82\x38\x78\xe6\xfb\x2a\x73\xbb\xc6\x81\x1a\xe3\x63\xfb\xd0\x8c\x38\xde\x1d\xb4\xb8\x07\x1e\x3e\x06\x03\x4f\x2f\xdf\x1e\x40\xf7\x5a\x10\xe7\x30\x24\x42\xc4\x05\x71\xf0\xef\xc0\xb6\xe6\x96\x76\x3f\x1d\xbf\x3c\xe6\x4f\x72\x1d\x66\xd3\x5d\xc1\x3f\x0f\x04\x71\x54\x08\xfb\x70\x37\x47\xeb\x2f\xd6\x39\x45\x42\x77\x2d\x41\x9c\x9f\x34\x0a\xea\xdf\x71\x2b\x04\xea\x1b\x9f\x3d\xfb\xe5\xe8\x63\xc6\x5d\x5b\x71\xa5\xf9\x7b\x10\xad\x70\xc8\x44\x1a\x46\x2c\x47\x1b\x3f\x1a\x97\x91\x6a\x08\xc2\x08\x83\x38\xa8\x46\xf8\xdf\x8d\x30\xe8\x07\x7d\x9a\x04\xb2\xc5\xa2\xb4\x7e\x5d\x62\xd0\x35\xb8\x1f\x71\xb8\x3b\x13\x3e\xcf\x76\xcf\x5a\xaf\x3d\x32\xdb\x39\x59\x57\x79\x81\x51\x44\xcb\x19\xda\xad\x07\x70\x70\x09\x10\xd6\xa0\x7c\xc8\x42\xbb\xda\x50\x98\xe6\x4a\x14\xac\x2f\x72\xfc\xba\xac\x91\x95\x25\x24\x36\xa2\x83\xc1\xdd\x74\xfd\xfd\x0a\x24\x01\x10\x07\x97\x40\xdb\x2f\xe1\xd9\xd0\x94\xd7\x9e\x31\xaa\x9b\x6d\x69\x28\x25\x5b\x4d\x7a\x53\xec\x3b\xda\xa4\xb1\xaf\x84\x29\xfe\x78\x68\x48\x43\x46\x18\xc4\xc1\xbf\xc3\x64\x09\x3f\x53\xce\xdc\xa3\x10\x55\xf7\xe4\x72\x53\x32\x7b\xf5\x71\x0b\x4c\xb1\x8d\xc7\x76\xc6\xa9\x34\x6f\x22\xd9\x31\x9c\xa0\x1a\x49\x10\x07\x97\x00\x29\xbd\xab\xbd\x59\x7c\xea\x45\xfb\xaf\x11\x66\x19\x7e\x8c\xaf\x66\xbb\xa8\x3e\xa0\x47\x7e\x3f\x51\xa7\xa1\xa0\x35\xc3\xfb\x04\x9d\x08\x83\x38\xa8\x36\x50\xe0\xdf\x17\xc0\xa0\xd9\xf5\x34\x0d\x08\x75\xa5\xb6\x7e\xbf\x14\x27\x24\x1b\xae\x84\xfd\xbe\x00\x8d\x83\x06\x97\x1e\x2d\x6a\xab\x60\xbc\x22\x62\xb2\x8f\x2d\x7f\x57\x0d\x3a\x5d\x03\x70\x70\x0d\x14\xf4\x89\xe3\x51\x24\xb1\x3e\x9d\x2b\xb7\xd8\xe7\xd1\xfd\xf8\x62\xe3\x4d\xac\xe1\x42\xe1\x3d\x2b\xa2\x5b\xfd\x7b\xb7\xb3\x17\xf6\x10\x71\x41\x1c\x5c\x03\xf4\x35\x9a\x79\x02\xbe\x7d\xf4\x32\xae\x47\xe3\xc9\x5a\xd5\xaa\xb4\xa9\xe3\xa2\x9f\xae\x15\x97\x94\xce\xef\xe7\x10\x93\x09\x43\xef\xc4\x81\x38\xf8\x77\xe8\xb4\x6e\x16\xc2\xdd\x08\x2a\x63\x08\x7c\x72\x45\x6d\xdf\x49\x89\xda\xda\xfb\xc2\xea\x4e\x59\x3c\xde\xfd\x3b\x6c\xae\xc7\xe8\x50\xcd\x21\x88\x83\x6b\xe0\xca\x70\xe4\x7c\x59\x1a\xfa\xf6\x04\xf5\x78\x0f\x96\x69\x6a\x3c\x57\xc6\x9e\x70\x99\x8c\x83\x56\x56\x1f\x3b\x6e\xbd\x47\xa7\x38\x42\x03\x20\x0e\xaa\x0d\x04\x18\x61\x50\xaa\x3b\xb5\x44\x82\x69\x94\x1e\xab\x33\x2e\xf4\x99\xc5\x2a\x7e\x55\xac\xd6\xb9\x5e\x81\x5b\xe1\xfe\xf7\xcd\x51\x99\x13\x5e\xf8\x88\x5a\xca\x69\x42\x25\x12\x00\x0e\xa9\x61\xda\xaa\xb5\x63\x1e\xbb\xd6\x24\x0b\x25\xdd\x65\x5b\x0a\x1e\xfb\x77\xad\x4e\x39\xc4\x7b\x02\xec\xd4\x8f\x0f\xf3\xb1\x0b\x6a\xa1\x47\x7c\x40\x1c\x5c\x03\x03\xb3\x87\x7c\x07\x4b\xb4\x39\x0b\xb7\x77\x64\x5a\x34\x24\x6d\x2f\x6f\x3e\xa4\x0d\x2c\x7a\x92\x33\x1f\x17\xe6\xd3\x57\x13\x19\x8d\x88\x0b\xe2\x90\x1a\x46\x7d\xfb\x5c\x74\xd3\x18\xfb\x82\xa2\xfe\xfa\xc3\x9c\x04\x17\x95\xc7\xde\xde\xbb\x81\x26\xaf\xa3\x7d\x54\x23\x7a\xb7\x9c\x65\xba\xa0\x86\x51\x00\x0e\xae\x81\x5a\xab\xae\x89\xea\x3e\xfd\xcb\x16\xfd\xab\x5d\x9a\x73\xf3\xef\x48\xae\xb0\x3e\xef\xf1\xc8\xf5\x6f\x9e\x1f\x94\x26\x0e\x64\xe8\x45\x68\x00\xc4\x41\xf3\x80\xde\xbf\x6b\x00\xb4\xee\x38\x4d\x03\xb3\x1b\x59\x5b\x98\x41\xa8\x85\xc5\x89\x3e\xaa\x02\xbc\xbf\x57\x64\x49\x9b\x33\x95\xd9\x25\x6a\x2b\xc3\xbf\xb1\xe4\x96\x1f\x40\x2f\x30\x83\x38\xb8\x06\xf6\x1a\x70\xbb\xd0\xae\xa2\x70\xf0\x05\x04\x1d\x0a\xad\xdf\xab\x6c\xc0\x37\x7d\xb8\xde\xb6\xf0\x88\xe9\x9a\x9e\x1a\x77\xa9\x31\xd4\x7f\x01\xc4\xc1\x35\x80\x4f\x16\x95\x3a\x3e\xd8\x79\x64\x76\x18\xc2\x78\x83\x19\xfd\x16\xae\x47\x04\x45\xc5\x83\x4a\x2f\x73\x4c\x03\x45\xd7\xa4\x2f\xd0\x83\x56\x20\x0e\xfe\x1d\x24\x7e\xf8\x39\x5b\xa3\x1b\x7d\xd2\xd3\x8b\xf1\x37\x8e\xd9\xd9\x5b\xac\xaa\x9b\xcb\xef\x33\x4e\xd8\x98\x4d\xad\x2a\xc0\xa5\x85\xce\x07\x40\x1c\x5c\x03\x36\xfe\xde\xfa\x33\x97\x37\xe7\x26\xcb\x4a\x4b\xb4\xd2\xee\xf7\xac\x31\x48\x28\x07\x97\xef\x3e\xac\xb6\x6b\x70\x4f\xa0\x6a\x1c\x41\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\x4c\xd4\xe9\x46\x98\x7f\xbb\x43\x83\xe5\xfc\xc0\x86\x71\x55\x69\x09\x6d\xfa\x82\x69\x19\x7d\x14\x4a\x4f\x92\x92\xbd\x55\x55\x1b\x3a\x1b\x03\x71\x1e\xc2\x54\x82\x38\x64\x23\xdc\xfb\xc9\xa0\x75\xe2\x19\x1f\xb6\x5e\xf8\x27\xde\x44\x91\xfa\xd1\x70\x57\x42\x95\x57\xf2\x28\x66\xfe\xd6\xcf\x43\x9b\x3a\x92\xa1\x36\x5c\x20\x0e\xd9\x08\x5f\x3e\x18\x91\x62\x21\xd9\xbf\xe6\x4f\x5a\xe1\xb4\x9c\x5f\x91\x22\x8f\xf1\x7b\x9e\xd6\x6c\x5e\xba\x2d\xeb\x8f\x14\xbf\x2f\x26\x13\x22\x32\x88\x43\x8e\xfc\x1f\xf7\xdb\xde\xe9\x8d\xfe\xc4\x5e\x2f\xd0\x63\x14\x36\x68\xd6\x13\x79\xef\xb7\xaf\xb1\xac\xc3\xa4\x5a\x5c\x54\xab\x5f\x6a\x74\x95\xb6\x82\xeb\xdf\x46\xf8\x3d\x96\x30\x6f\xce\x5d\xcd\xdf\x98\x05\x84\xde\xdd\xe2\x68\xa2\xae\x68\x9c\xe4\x35\x0b\xfb\x1b\xbd\x73\x24\x7c\x1d\xc2\xea\x91\x7f\xa1\x5b\x3b\xd6\xae\xab\x7f\x6e\x68\xd5\xdf\x56\x7e\x45\x48\x31\x73\xcf\x1f\xbf\xfb\xad\x8c\x8a\xe1\xed\x5f\xaf\xc5\x4f\xf0\x1c\x49\x62\xff\xdb\x8c\x30\x68\x68\x7f\xd7\x08\x23\x19\xe1\xe8\xf4\x51\x4c\xde\xe6\x41\xfb\xfb\xcf\x69\xc3\xfd\xf6\x85\xaf\x25\x38\xe9\x36\x46\x10\x5d\xdd\x9e\xe6\xda\xf3\x65\x77\xf0\x4e\x3c\x93\xc3\x4a\x64\x23\xac\x7b\xa1\x25\xdd\x80\x2c\x31\x77\x11\x13\x85\x6f\x1a\x85\x1a\x37\xfb\xa2\x81\x6a\xfb\x1a\xcb\x97\x84\x47\xcc\x2c\xd2\xd8\xc1\x67\xf3\x26\x31\xb2\x11\xce\xb0\x2a\xf9\x2e\x50\x77\x41\x43\x20\x5f\x61\x34\xad\x8d\x61\xac\xa7\x38\xad\x92\x6d\x65\x50\x20\xb3\x5f\xbb\x4f\x3d\xaf\x4e\xff\x4c\x46\x8b\x6c\x84\x1f\xa9\x9f\x6f\xe3\xd4\xce\xc0\x73\x7f\xd4\xf4\x8d\x20\x3a\x59\x3a\xca\x49\x40\x5a\xb4\xba\xbf\x2b\x32\x26\x32\xad\xdc\x8a\x37\xec\x4c\x46\x8b\x6c\x84\xdf\xb4\x97\xd2\xf6\xcf\x74\xf3\x92\xf3\x8a\x7b\x8f\x32\x48\xb8\xc4\xfb\xb5\xbf\x91\xc2\xa3\xc4\x98\x1d\x0b\x7e\x77\x20\xfd\xeb\x0c\xde\xbb\xd2\xff\xcf\x44\x74\x6a\x9b\xc8\x2b\x69\xd1\x53\xbc\xf8\x8a\x97\x7d\xf2\xa2\x47\x12\x84\x47\x82\xd5\xa3\x50\x96\x3e\x3c\xec\x51\x4b\x8f\xf6\x0e\x50\x6e\x83\x5e\x60\x06\x71\xf0\xcc\xe7\x65\xfd\x5d\x78\xc7\x3e\x95\xf7\x2e\x6b\xff\xe3\x55\x73\x6c\xff\x9a\xc2\x08\x33\x71\xc5\x79\xa3\xbe\x8b\xf5\xe7\x7b\x63\x51\xa0\x4e\x49\x20\x0e\x9e\xf9\xf4\x57\x09\x96\xd7\x35\x5a\xeb\xf8\xbc\x0b\xca\x2e\x12\x90\xc4\x53\xba\x88\x47\x16\xd0\xdb\x60\x84\xae\x85\xe8\x89\x64\x1a\xfc\x46\xc4\x05\x71\xf0\xef\x30\xef\x3a\xfe\xc4\x0a\x73\x5f\x3b\x5f\xa9\x1f\xe7\x41\xf7\x27\xb2\xc0\xf6\xab\x22\xe8\xd5\xeb\x6d\xee\x72\x46\xd4\x43\x54\x2e\x02\x88\xb8\x20\xce\x4f\x1a\x85\xf8\xef\xb8\xb7\x8a\x62\x1c\xf8\x7e\xce\xca\x8e\x97\xa8\x36\x30\x55\xb1\xff\xa2\x7d\xf4\xc0\xac\xf6\xab\xaf\xc9\xeb\xa0\x59\x25\x8b\x98\xa7\x4f\x11\x46\x18\xc4\x41\x35\xc2\xff\x6e\x84\x41\x3f\xe8\xd3\x24\xd0\xb8\x62\x46\x54\x66\x63\xc4\xc2\x37\xe1\x28\x91\xe3\x5b\x1a\x5b\xb5\x38\x24\xae\xf4\x38\x5c\xf1\x2a\x73\x23\x4a\xc9\x6e\x21\xb4\x17\x02\xe2\xe0\x12\x10\xdd\xca\xec\x08\xb5\xf3\xac\x4a\xe7\xad\xec\xf9\xf1\x39\x53\x8e\x99\xd2\xce\x45\x3c\x92\xb5\x24\x35\xbb\xb2\xca\xa5\xe5\x2a\xf4\x90\x0d\x88\x83\x4b\xe0\x23\xea\x1f\x6d\xb5\x06\x0b\x7c\x4a\x7f\x82\xec\x90\x14\xbf\xef\x06\x46\xdf\x47\x1c\x45\x7e\xfc\x60\xac\x0f\x29\x35\x78\xa8\xa9\x84\x88\x0b\xe2\xe0\xdf\x21\x3e\xa7\x21\x47\x88\x17\xeb\x9d\xa6\x60\x7c\xd7\x88\x09\x7a\x72\x0e\x0d\xa3\x6b\x52\x5b\x8c\x84\x18\x8e\x73\x81\x49\xbf\x39\x54\x2e\x0f\xe2\xe0\x12\x68\xf9\xc2\x94\xa9\x6d\xb2\xfe\xd5\x22\x1d\xc3\x13\x95\x9b\x4b\xf7\xf7\x96\x54\xfe\xde\xf7\x05\x16\x81\x3a\xfa\x5f\xcb\xd7\x1e\xdf\x44\x2c\x7e\x40\x1c\x54\x1b\x08\x30\xc2\xa0\xd9\xf5\x34\x0d\xb0\xd6\x37\xa7\x92\xa9\x89\xf8\x2a\x57\xac\x2d\x24\xd8\xf5\x04\x8a\xfc\x22\xe0\xf6\xc1\x97\x3c\xce\xa2\x29\xb8\x69\x52\xb4\x0b\x5d\x0b\x07\x71\x70\x0d\x54\xdf\x18\x4a\x0e\x0f\x9a\xb2\x77\x76\xf4\x0d\x5c\x6d\x7a\xfd\x5b\x68\x44\x53\xdf\xe2\x6d\xe0\x0c\x3e\xb6\xac\x6c\xf4\xfa\xc7\x49\x44\x5c\x10\x07\xd7\x00\x53\xf6\xe4\xa4\x6e\x50\x47\xb5\xde\xc2\xb8\x15\x49\x06\x41\x66\x72\x5e\x16\xcb\x27\x9e\x09\xb7\x65\xa2\x77\x01\x03\xcf\x55\xa2\x10\x71\x41\x1c\xfc\x3b\x48\x9d\xbc\xad\x91\x36\x0f\xdd\x4d\xb5\xc7\xf8\xb5\x5d\x53\xf5\xb3\xf3\x97\x0f\xb5\xc4\xb9\x82\x91\xea\x65\x2e\xea\xdb\x2b\x8f\x1f\x22\xe2\x82\x38\xb8\x06\x46\x24\x7a\xa7\x65\x5a\x8f\x87\x55\x95\xb2\x6e\x5d\xb3\x0e\x70\x72\x17\x70\x18\x7a\xfa\x4a\x86\x25\x2e\xfd\x46\xfe\xac\x31\x01\xf4\x0a\x37\x88\x83\x6a\x03\x01\x46\x18\x94\xea\x4e\xd3\x40\xee\x6f\x89\xc5\xa1\x2f\x29\xd3\x27\x3c\x8e\x7c\xb8\xd6\x7e\x2d\x15\xc2\xe7\x9e\xbf\xaa\xaf\x3e\xa4\x68\xe2\x64\xc9\x8e\x25\x18\x41\x8c\x1d\xc4\xc1\x35\xb0\x30\x77\x2c\x66\x87\xfb\x14\xc7\x2f\xff\x5d\xbf\x73\x3b\x0f\x75\x82\x57\x57\xcd\x4c\xcf\x17\x0b\x94\xe1\x95\x78\x14\xad\x21\xa8\x73\x38\x88\x83\x6b\xe0\x6a\x78\xf3\xe3\x74\xbd\x89\xfc\x69\xde\xc4\x83\x45\xc6\xf9\x71\x2d\xaa\x84\x10\x02\x06\xb9\x02\x7d\x9d\xa5\xf4\x55\xdf\x8b\x90\x11\x06\x71\x48\x65\x02\x4e\xe3\x77\xc9\x39\xba\x7b\xa4\x57\xd4\x14\x5e\x78\x15\x75\xf1\xd3\x61\x79\x0b\xf7\x6f\x7b\xe9\x3f\x9f\xbd\xfd\x35\x22\x1e\xba\x6e\x0b\xe2\xe0\x1a\xe8\xff\xf8\x38\x43\x46\xa4\xf6\xdc\xc5\xd9\xe2\xfb\x6c\x19\xec\x77\x9f\xfa\x39\x2c\xe4\x57\x55\x5a\xc8\x77\x75\xce\x61\x07\x24\xf2\x21\x34\x00\xe2\xa0\x79\x00\x60\x84\x41\xeb\x8e\xd3\x34\x10\xf4\x1e\xcd\x0f\xc3\x8b\x7c\xc9\xef\x1d\x0f\x09\x99\xc4\x9d\x52\xb9\x5c\x09\x13\xff\x00\x3a\x0f\x5d\x13\x77\x7d\xd2\x71\xdb\x1a\xc4\xd8\x41\x1c\x5c\x03\xfa\x6b\x33\xa3\x5b\x4c\x9e\x44\x7b\x4c\x8b\x9e\xf1\xbd\x8d\x06\x54\x49\xce\xa2\x3a\x8d\x75\x94\x89\xdb\xf1\x36\xb1\xfa\xc5\x50\x97\x77\x10\x07\xd7\x40\x76\x7f\xf8\xbb\xdb\x63\xa9\xc1\xab\x2d\x09\x3d\x0e\xe1\xc6\x6e\x7d\x92\x98\xe5\x8b\xbd\x6e\x5b\x53\xbd\x95\x1b\x58\x2e\xdf\xff\x3f\xe6\xde\x32\x2a\xab\xe6\xfb\xff\xa7\xa5\x94\x56\x1a\x24\x05\x54\x42\x90\x50\xe9\x46\x90\x90\x12\x50\x11\x10\xa5\x3b\xa5\x91\x6e\x29\xa5\x11\x90\x4e\x41\x4a\x1a\x69\x45\x04\x95\x06\x01\xe9\x96\xae\xff\xfa\xfe\xd6\xba\xce\xdf\xfb\x5c\xac\x7b\x3e\x0f\x78\x70\x3f\x7f\xad\x7d\x31\x87\xf7\x99\x3d\xef\x33\xb3\xf7\x0c\x43\x1f\x71\x01\x1c\xfc\x39\xa0\x3d\x0a\x69\x42\xc5\x71\x4f\x53\xb5\x32\x3b\xda\x49\xfa\x28\x34\x9b\xf6\xfd\x35\xde\x30\xa1\xba\xc2\xe3\xc4\x46\x9b\x37\x0c\x50\xd7\x68\x10\x07\xd7\xc0\xf5\x3e\xf1\xa7\x85\x32\x26\x86\x7f\xf8\xf2\xcc\xfc\x92\xcb\x3f\x68\xa1\x06\x24\x31\x8c\xed\xaa\x4b\x4d\x0f\x3d\xfe\xb2\x10\xd6\x8b\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\x99\xa8\xd3\x8d\x30\xd6\x0f\xdd\x4f\x09\xc6\x1f\x94\x06\xaf\x10\xbb\x0e\xea\x64\xf2\xe2\xaa\xf7\x3f\x79\xcf\x85\xdb\x65\x1f\x77\xe3\x7b\x53\xeb\x05\x15\x84\xa9\x04\x71\xc8\x46\xf8\xe4\x1c\xd7\x0a\xcf\x8e\x1b\xe5\x55\x6f\xae\xd8\x3a\x79\xac\x74\xed\x17\xcc\x59\xd6\x2c\xe7\x79\x15\x95\x5c\x4d\x6f\xa0\x46\x32\x23\x22\x83\x38\x64\xbb\x5a\x19\xf0\xdb\x99\x54\x1b\xff\xdd\xfa\xbc\xac\x00\x7f\xf5\xeb\xeb\x07\xac\x0b\xa2\x26\x8a\x64\x19\x6e\x4f\xbf\xbc\x71\xb6\x97\x98\x44\x44\x06\x71\x3e\x92\xff\xf7\x24\xff\x8e\xac\xf8\x69\x9f\x62\xcb\xf0\x07\xf1\xb1\xa1\xd1\x4b\x49\x21\xc5\x54\xb4\xea\xfb\x36\x97\x35\xf0\x1b\x43\x83\x04\xef\x79\x39\xeb\x46\x41\x46\x78\xed\x9d\xfd\x5c\xfe\x50\xee\xda\xe2\xcb\x97\x3d\x2d\x9f\x53\xab\x96\xf3\xf7\xf6\x44\x43\xcf\xa3\x9f\x23\xba\x55\x48\x67\x17\x3a\xf0\xb7\x11\x7e\x62\xa3\xb1\x42\x55\x84\x11\xb4\x1e\x34\x20\x6f\xab\xd3\x4a\xb0\xad\xa1\xa6\xbb\xfc\x6c\xcc\x3e\x3f\x49\x6a\xe6\x91\xcd\x46\xe6\x5f\x68\x6e\x5a\x21\xcd\xb3\xc4\x50\xf5\x2f\x2f\xf3\x5d\x70\x92\xa5\x88\xa8\xc2\xbb\xa6\x08\x66\x95\x94\x86\x1d\xf3\x4a\x0a\x3e\x18\x51\xfc\xd7\x8c\x30\x68\x68\x7f\xd7\x08\xcb\xc2\xcd\x52\x2b\xc6\xa0\x5d\x41\xc8\x31\x73\xb4\x55\xed\x5a\x40\xe3\x68\xdf\x6d\xd9\x60\x31\x4e\xc1\xab\x02\x05\xa3\x12\x4c\x0b\x9e\x69\xdc\x67\xb2\x59\x89\x6c\x84\xfb\x05\x18\x8d\x97\x96\xf8\x29\x77\x34\xaa\xfb\x04\x31\x19\x23\x23\xa9\x28\xf2\xb4\x9f\x07\x24\xe4\x60\xee\x8f\x98\x3f\xff\x46\x76\x26\x5b\xb3\x22\x48\x3f\xab\x77\x57\xe4\x32\xe5\x40\xc0\x4a\xcb\x32\xce\xce\xbe\xfa\x58\xfc\xfa\xe5\x42\x9a\x5d\x83\xfd\x01\xd2\x0c\xb9\x15\xea\x59\xe5\x90\x33\x19\x2d\xb2\x11\xe6\x8c\x41\xeb\x5f\x3c\x99\xd5\x6a\x1e\xfc\x73\x43\xb1\x6a\x91\x4c\x15\xdd\x61\xbc\xf0\x9d\xa5\xcf\xd3\xac\x9a\xa6\x58\x7a\x85\xd6\x33\x19\xad\x03\xd2\xcf\xba\x6f\x37\x87\x5f\x77\xe5\xe6\x42\xdd\xbc\xec\xb7\x86\x17\xc0\xee\x3c\xcd\x6b\xa4\x4e\xc1\x4c\x43\x62\x3f\x2c\x73\x79\xc0\x9a\xf3\xcc\x8c\x30\x48\x44\xa7\x65\x3e\x9e\x56\x1a\xa2\x77\xa2\x86\x0c\x11\xd1\x93\x86\x02\x19\x62\xb3\x9f\xc2\x71\x6f\xc6\x51\x12\x3f\x6b\x33\x8e\x60\xd2\x68\xbb\x88\x82\x98\xf1\x41\x1c\x3c\xf3\xf9\xcc\xbf\xb3\xf6\xe3\x7a\x3a\x95\x12\x38\xe3\x7e\xb5\x54\xdf\x6b\x53\x86\x48\x2f\xf8\xe0\x9c\x46\xa6\xc5\x9b\x9b\x71\x89\x0c\xae\x88\xb8\x20\x0e\x9e\xf9\x78\xb2\x95\x6b\xd7\x1d\x6e\x17\xef\xb0\x27\x35\x87\x1e\x04\x5d\x0b\x7e\x4e\x54\xf0\xa5\xa7\xf9\x1c\xdb\x27\x9c\x47\x6f\xee\xfa\x43\xd7\x79\x82\x38\x1f\x71\x8c\x7f\xfc\xbd\xc2\x78\x79\xf1\xee\xf1\x79\xed\xca\x82\x2f\xea\x8a\x58\x0a\x8c\xa9\xfa\xe8\x1f\xd7\xfd\xd4\x0f\x25\xfb\xd5\xed\xa0\x7b\x8c\x01\x9d\xb3\x03\x71\xf0\xae\x1b\xce\x66\x07\xe3\x1d\x1c\x99\xf1\xc4\x06\xf7\x9d\x56\x6f\x57\x2a\xeb\xcc\xe9\x6d\x63\xc4\x05\x44\x6d\x9a\xdf\x4a\xe7\xc4\x1d\x67\x42\x18\x61\x10\x07\xd5\x08\xcb\xfe\xeb\xe2\x07\xf4\x42\x9f\x26\x01\xa3\x56\x33\xdd\x6b\x7e\x0e\x8f\xb6\x6b\xe2\x1f\xc5\xe2\x5d\x33\xd1\x0d\x37\x18\x44\x9b\x93\x9a\xab\x3a\x5f\x92\x6e\x8e\x17\x0f\x1d\x5d\x04\x71\x70\x09\x08\x11\xd7\x0e\xf5\x25\x33\xe0\x61\x4e\x4a\xd6\x25\x8c\xa4\x3e\x9a\xff\x3a\x58\x6c\x7f\xf4\x95\x89\x6e\x46\xf0\xfc\xa1\x39\x21\x2a\x22\x2e\x88\x83\x4b\xc0\x47\x78\x73\xef\xee\x1f\x7b\xa9\x27\x17\x22\x46\x0d\xaa\xf0\x76\xfa\x42\x79\xca\xb7\x5a\x72\xb0\x8d\xde\xff\xf0\xe4\xc0\xfa\x06\xdd\x8e\x09\xe2\xe0\x12\xe0\xcc\x57\x9c\x1c\x8a\x98\x72\x73\x8f\x48\x8a\xb3\xdd\x7a\xe4\x89\x3f\xd0\x70\xdf\xfc\xe6\x3d\x27\x73\xb1\x49\x6b\xd4\x79\x2d\xa8\x96\x11\xc4\xc1\x25\x70\xf0\x3a\x7e\x0e\x6d\x9e\x5b\x24\xe6\xc7\x76\xf6\xbe\xee\xef\x71\x3a\x4d\x75\x2f\x53\x56\x5f\xc1\xf2\x57\xd1\xdf\x77\x69\x54\x9a\x10\x8b\x1f\x10\x07\xd5\x06\x02\x8c\x30\x68\x76\x3d\x4d\x03\xe2\x7a\x65\x11\x3c\x46\xf1\x55\xc3\xbe\x9a\xef\x19\xe9\xcf\xf5\x9c\xd4\x48\x4e\x4c\x31\x04\x18\x69\x1e\x5d\x35\x19\x11\x19\x87\x6a\x79\x41\x1c\x5c\x03\x33\x28\xd2\x14\x4b\x2b\x2f\xe6\x14\x30\x51\x12\x8a\xeb\x38\x3e\x87\x99\x0d\x9b\x8c\x99\x7e\xdc\x2d\x62\x90\x25\xa9\x55\xb7\x81\x76\x82\x40\x1c\x5c\x03\xf2\x9c\xca\xfe\xcb\xfd\xf9\xe2\x6f\x97\x54\x8a\x0f\x07\x74\x7e\x89\x30\x12\x78\x6d\x2b\x65\x29\x07\xcd\x11\xad\x75\x04\x95\x3c\x47\xc4\x05\x71\x70\x0d\x08\xc5\x39\xc4\x98\x2b\xae\x2f\x2b\x25\x6a\x2f\x50\x0a\x64\x05\x25\xeb\xbf\x19\x48\xcf\x14\x36\xc6\x17\x97\x3f\x21\x7a\x3f\x83\x07\x69\x16\xc0\xc1\x35\xc0\x51\x4f\xb8\x76\xf9\xb7\x28\x59\x2a\xc5\x6d\x11\x0f\x9c\x28\xfc\x90\xaa\xb6\x92\xb5\x98\x0d\x96\xe4\xd7\xe7\x4d\x96\x04\x1c\x53\x11\x1a\x00\x71\x50\x6d\xa0\xc8\xbf\x6b\x00\x94\xea\x4e\xd3\xc0\xcf\x88\x3c\xbd\x15\xdd\xd7\xb4\x7d\xef\x47\xd1\x63\x66\x49\x7a\x0a\xef\xf3\xe8\x8a\xa4\xbc\xba\xd8\x90\x33\x6e\x14\x51\xe1\xcb\x0b\xf5\x0b\x04\x70\x70\x0d\xec\xcf\x73\x66\xf7\xe4\xce\xb5\x3c\x17\x1e\x09\xb5\xff\x55\xdd\xf0\x18\xc3\xdb\x8f\xd2\xc6\x54\x99\xb0\x52\x94\x02\xbb\x9d\x45\x06\x11\x17\xc4\xc1\x35\x60\x18\x1b\xea\xb2\x5e\xee\x1a\x75\x81\x86\x7d\xee\xd9\x49\x3f\x0a\x25\xd6\x10\x07\xe9\x02\xcd\x9b\xc4\x0c\x74\x8e\x04\xac\x60\xa8\x69\x1e\x88\x83\x6b\x40\xc2\xb5\x44\x5c\x86\x49\xb1\xea\x64\x0d\xa5\x97\xc6\x7d\x9a\xdc\xb0\x20\xb0\xa9\xea\x9b\xc2\xc8\xfd\x98\xa9\x03\x32\x83\x76\x42\xa8\x7f\x24\x80\x83\x6b\x40\x86\xb0\xaf\xbc\xdb\x94\x32\x24\xf4\x0f\x17\x0b\xf6\x2b\xa7\x86\x29\xa3\xeb\x22\xa9\x2c\xc5\x33\xbc\x2e\x17\x1e\x11\xfd\x72\x53\x42\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\xd6\x1d\xa7\x69\xc0\x2f\x34\xa9\x8c\x63\x34\x22\x8b\x22\xc0\x72\x18\xfb\xc3\xea\xe4\x98\x66\xc3\x05\xc9\xb7\x8a\xa2\xb9\x04\xba\xc2\x61\xba\x81\xd0\x35\x6a\x20\x0e\xae\x81\x13\x07\x85\xed\x17\x1e\xcf\xad\xce\x3b\xcd\xf4\xed\xed\x27\x30\xab\x1f\xcb\x6f\x49\x6f\x18\x92\x3d\xb3\x48\xd9\x9b\xe7\x92\x87\xd2\x2b\x88\x83\x6b\x40\x86\xa2\xc4\xfc\x61\x53\xff\xd6\xdd\xa1\x59\xd6\xfe\x27\xcc\x61\xe8\x37\xbb\x97\x66\x5f\xca\x51\xad\x79\xe3\xe3\xeb\xe7\xbd\xbd\x0f\x35\xe3\x03\x70\x70\x0d\x94\x17\xee\x7a\xb8\xc4\xa6\x88\x71\x76\x4e\xa2\x89\xbd\x4f\xba\x37\xf3\x4d\xfb\x21\xa6\x79\x02\xbf\xc9\xfd\xee\xfc\x8f\x3f\x5e\x41\x27\x43\x40\x1c\x5c\x03\x96\x8d\x9f\x4f\x28\x19\x4b\x5a\xc5\x53\xf1\x6d\x57\xe8\x5e\x7f\x8d\x33\x96\x8d\x78\xf3\x8d\x91\x8a\xc6\x60\xec\xfc\x4c\x54\x40\x27\x42\x03\x20\x0e\x9a\x07\x1c\x00\xcd\xb2\x00\x26\xea\x74\x23\xdc\xd3\x6c\x4d\x74\x24\x6d\xc7\x1d\x66\xfc\x59\x4a\xe0\x03\xfe\x87\xec\x1b\xa5\xaf\xbf\x14\x17\xb3\xcc\xb0\xb7\x2d\x05\x4e\x75\x4b\x20\x4c\x25\x88\x43\x36\xc2\x0f\xfb\xf9\xc2\x43\xc7\xb5\xe2\xff\x3c\xb9\x77\x3d\x9a\x4c\x45\xb5\xbe\xc4\x6c\x96\x28\x9f\x44\x97\x33\x08\x47\x1a\x7d\xaa\x15\x0b\x11\x19\xc4\x21\x1b\x61\xea\x19\xfc\x45\x55\xe3\xf6\xdd\xd4\xa7\xaf\xf9\x22\x87\xbc\x6a\x97\x47\x71\xf6\xee\x5e\x52\xd4\x8b\xf9\x95\x7a\x3e\x1e\x7d\x4b\x0d\x11\x19\xc4\xf9\x48\xa2\xa0\xfc\xf3\x7f\xd6\xbb\x75\xd8\xb4\x95\x2b\x26\x5c\xce\x3c\x73\x9b\x00\x5f\x65\x92\xb2\x50\x94\x6f\xc6\xb1\x90\x28\xff\x0e\x19\xeb\x51\x5d\x15\x35\x64\x84\x6b\xc3\xcd\xb2\x1e\x85\xc7\x18\xd4\x17\xd8\x45\x19\x28\x52\xf7\x79\x54\x7e\xf5\xde\x9c\xd3\x2a\x9e\xcf\x7b\x34\xc3\x1c\x31\xab\xfb\xb7\x11\x7e\x63\x29\xf2\x21\x98\x26\x9b\xe6\x0f\xd7\x8b\x62\xf7\x1e\x07\xf5\x80\x84\x3e\x73\xac\x9b\xe3\x66\x2f\x0a\x02\x53\xdc\x57\xdd\xf8\xfe\xfe\xe8\x7b\x6b\x0f\x5d\x8e\x60\xad\xa6\xe9\x1b\xbf\xf5\x90\x9f\xf1\x28\xbf\xcb\x64\x06\x31\x4a\xd0\x9b\x70\x92\xe2\x71\x57\x0b\x5a\xe3\xff\x9a\x11\x06\x0d\xed\xef\x1a\x61\x24\x23\x1c\xf3\x73\x2e\xb3\x26\x6b\xc2\xcb\x90\xf4\x3a\x57\x10\xbe\x98\x7e\x1c\xbd\x33\xf5\x1b\x12\xa3\xba\xe2\x5c\x6b\xba\x2f\xd7\x5f\x5b\x9e\xc9\x66\x25\xb2\x11\xae\x3e\x49\x29\xdd\x69\xaf\x3e\x37\x62\x8f\x39\x76\xbb\x92\x7c\xdd\xb0\x33\xae\x42\xb5\x55\xd9\x45\x85\xf5\x72\x3f\xbe\xf8\x84\xf2\x99\x6c\xcd\x22\x1b\x61\x75\xff\xef\x8f\x2a\x66\x57\xcb\xbe\xdf\x8b\xd4\x0b\x22\x71\xc0\x63\x6f\xb1\x79\xba\x31\x3d\xe1\x60\x72\xb1\x08\x37\x32\xe6\x0e\xc3\x99\x8c\x16\xd9\x08\xcf\x38\x17\xc5\x4a\x8e\xcd\x76\x95\x69\x08\x14\xe6\xb3\x27\x7b\x5a\xa1\xd3\x69\xeb\x2a\x9b\xa7\x8a\xba\x0d\xc5\xd3\xd9\xf0\xce\x9f\xc9\x68\x91\x8d\xb0\xe2\xd0\x03\xb5\xf9\xf4\x36\x2f\xff\xdf\x0e\xd8\x59\xdb\xca\x36\x66\xc5\x18\x4e\x7b\x21\x4a\x05\xa8\x24\xa5\x3c\xbc\xd5\x2c\x42\x67\x66\x84\x41\x22\x3a\xf5\x12\x59\x35\x11\x66\x2a\xca\xc9\x8f\x8f\x98\xc2\x3c\x4d\x89\x69\xaf\x0d\xcb\x64\xbc\xbf\x3c\x8c\xcb\x4d\x9f\x18\x59\xc4\x1b\xd3\x01\xb5\x89\x04\x71\xf0\xcc\xc7\xb7\xc2\x4f\x2a\x9b\xc1\x7c\x20\x39\xf0\x54\xe2\x7a\xfd\x72\xfe\x2f\xa5\x67\x69\xef\x66\xb9\x2b\x24\x24\x39\x71\x77\x67\x18\xa1\x66\x59\x20\x0e\x9e\xf9\xb6\xdf\x4a\x5f\x35\xb8\x7a\xd9\x8e\x9f\x9a\x7c\x61\xee\x1c\x67\xa1\x46\x64\xa5\xe2\xec\x57\xab\xa2\x31\xd2\x9c\xbd\x57\xf6\xb5\xb6\x88\xb8\x20\x0e\x9e\xf9\xf4\x8b\xd2\x4c\xe2\x8a\x7d\x49\xf3\x14\x6b\xd1\xc7\x71\xd8\xd6\x2e\xb5\x6b\x06\x90\x6d\xbb\x10\x5f\x63\xbd\xd7\xf2\x90\xa5\x3b\x16\x6a\x3f\x09\xe0\xfe\x2f\x43\xfd\x23\xf3\x89\xa7\xda\x1f\xa2\x7b\x48\x62\xa7\xd0\x32\x36\xb5\xa0\xa9\x25\x09\x69\xe6\x11\xfd\x32\x12\xa8\xc9\xca\x51\x65\x09\x32\xf5\x43\x18\x61\x10\x07\xd5\x08\xff\xbb\x11\x06\xbd\xd0\xa7\x49\x40\xf2\xe7\x96\x6d\xa0\xff\xd7\xcf\x51\x91\x95\x57\x1d\x3a\x06\x2e\xa3\x54\x33\xf6\x9e\xab\xad\x9d\x25\x3a\x87\x7e\xae\xff\x19\x0e\x35\x54\x76\x0d\xe0\xe0\x12\x48\xd9\x1e\xb2\xf6\xc1\x72\x7f\x75\x25\x5f\x28\x88\xe7\x62\xee\xc8\xb2\x6e\xa5\x46\xd5\x1d\xb3\x0b\xea\x9f\xa9\x6f\x08\x50\x3b\xa7\x21\xe2\x82\x38\xb8\x04\x76\x23\x0d\x76\x74\x17\x3a\xae\x3e\x93\xb5\xf9\x4d\xe5\xf3\xe1\xb2\x28\xad\xd5\x2b\x29\xce\x6b\xa9\xd1\xd8\xfe\x16\x57\x3f\x4b\x40\xb5\xc7\x20\x0e\x2e\x81\xc7\xfd\x1d\xd9\xf1\xbb\x13\x03\xda\x17\xe6\x7f\x4b\x3b\xb7\x7c\xc0\x2f\xf7\x6c\x8e\x7a\xb8\x6f\xb4\x82\x52\x1d\xa9\x70\xe8\x6a\x86\x88\x0b\xe2\xe0\x12\x08\xa8\x5c\x56\x9d\x76\x2e\x17\x9a\x6e\xbc\x87\xf2\x3c\x5c\x5f\x69\xf1\xa3\x74\x4a\x7e\x89\xa2\x59\x48\x1f\x8f\xcc\xec\xe5\x77\x2d\x88\xc5\x0f\x88\x83\x6a\x03\x01\x46\x18\x34\xbb\x9e\xa6\x01\x97\x1b\x5f\xbc\xbe\x8c\x1a\xd3\xa3\xe9\xdc\xe6\xd2\x42\x93\x37\x7b\xea\x9b\x49\xbb\xfc\x63\x28\x78\x9b\xcf\xe6\x31\xa6\xbb\xe0\x20\x54\x6b\x07\xe0\xe0\x1a\x50\xaf\xba\xb0\xf0\x60\xb3\xca\x0a\xa7\xd6\x3d\x38\x30\x69\x94\xf5\xf6\x8f\x07\x9b\xb9\x45\x69\xad\xec\x11\x3e\x65\x19\x1e\xf9\x95\x88\xb8\x20\x0e\xae\x01\x8b\x27\xa6\x0d\xb1\x29\x76\x14\xf9\xe2\x2c\xd4\x8b\xe5\x5a\x4b\xbb\xf3\x27\xaf\xc9\x4c\x98\xb6\x59\x5e\xcd\x6c\xa5\xa6\xd5\x41\xd7\xb1\x80\x38\xb8\x06\xd6\xfb\x23\x28\x26\x43\x1b\x2c\xaf\x68\xde\xdf\x40\xb9\x34\x3a\x90\xf1\x49\xaa\x3d\x21\x80\x9c\xed\xa3\xaa\xc6\xfe\x93\xb1\xc7\xd0\x51\x4b\x10\x07\xd7\x40\x74\x7f\x2a\xc1\x7a\x45\x1c\x0a\xfd\x8b\x94\xb1\x37\x3b\x17\x1f\x07\xee\x4a\x28\x66\xaa\x2a\x0a\xdb\x3b\xbd\xb3\xcb\x76\xfb\xb2\x85\xd0\x00\x88\x83\x6a\x03\x01\x46\x18\x94\xea\x4e\xfd\x18\x72\xe1\x9b\xcd\x93\xfb\x0c\x4f\x93\xe8\x82\xbf\x28\xb3\x7d\xf4\x5d\x53\x9a\x8b\x9d\x3e\xba\xc9\x1b\x83\x41\x6d\x9d\x5e\x4f\xc9\x05\x7d\x0c\x01\x70\x70\x0d\x78\x2c\xd1\xde\xd1\x13\x7f\x26\xde\xe1\xf0\xe6\xb5\x2e\x65\xb2\x76\xde\x53\x91\x30\x39\xfb\x0d\x1b\xc3\xaf\x24\xa8\xdd\xa6\xe3\xd0\x95\x54\x20\x0e\xae\x81\xf1\xac\x6e\x4a\x75\xe7\x0b\x58\xcf\x2e\x14\xa4\x4b\xe1\x33\xa7\xe8\xcb\xd8\xe4\x76\x93\xb8\xa4\x3e\x2c\x5a\x7c\xfd\xd2\x8b\xf2\x25\x22\x2e\x88\x83\x6b\x40\xac\xa3\x5e\x58\xe4\x47\xa9\x84\x26\x3a\x56\x62\x5d\xf3\x33\xf9\x95\xec\x6b\x3e\xb8\x62\x06\x35\x84\xaa\x87\x0d\x77\x03\xd2\x0b\xa1\x53\x01\x00\x0e\xae\x01\x56\xb6\xc9\xc7\x5f\x8f\xd8\x28\xde\x17\x5d\xda\xfb\x53\x35\xfc\x3c\xd3\x50\xd5\x4e\xf7\xba\xc8\xd3\x58\x8f\x75\x11\x3d\xf9\x75\x7e\x84\x06\x40\x1c\x34\x0f\x00\x8c\x30\x68\xdd\x71\xea\x35\x6a\x73\x6f\x3b\x84\x3d\xbe\x74\x2a\x6e\x6c\xe3\x5c\xfc\x59\x5a\xa0\x9d\x71\x59\xf1\x33\xaa\x8b\xbe\x15\xe7\x11\x31\xc1\x4e\x19\x74\x30\x0a\xc4\xc1\x35\x50\xf6\x26\xb6\xfe\x3e\xa3\x96\xa3\x3a\xf3\xec\xf9\xbd\xaf\x2c\xef\x2e\x0f\xd1\xdc\xfb\x12\x1a\x3c\xf5\xca\xd4\xdf\x5b\xda\x3a\x10\x3a\xc1\x01\xe2\x90\x9a\xe6\xb1\xa3\xbf\xec\xec\x9e\x48\x0b\xd3\x37\x3a\x09\xbe\xc2\x4f\xf4\x6b\x02\xfd\x4d\xbf\xee\x68\xf6\x2d\xa3\x35\xd4\x1a\x05\x09\x68\xf9\x02\xe2\xe0\x1a\xb0\xb1\x97\x33\xf0\x44\x91\x53\x8a\x5e\xe4\x6c\xe3\xc1\xd4\x6e\xfd\x10\xe3\x1c\xab\xf1\xe8\xc9\xa4\x4b\xa8\x42\x93\xc8\x51\xda\x07\xa8\x7b\x3c\x80\x83\x6b\xe0\x55\x7f\x6d\xb4\xe8\x6d\x5e\x92\x35\xcc\xae\xc7\x4d\x4a\x13\x34\x8f\x86\x37\x7d\xd7\xcb\xc5\xcb\xf4\xd5\x8a\x2b\x69\xfd\x71\x4b\x10\x1a\x00\x71\xd0\x3c\x00\x30\xc2\x20\x13\x75\xba\x11\x76\x0f\xd6\xbd\x75\x85\xaa\x88\x3f\x66\x8e\xb3\x66\xdc\x48\x36\x95\x3c\x32\xfd\x80\xd1\x82\xaa\xa7\x9e\xa1\x42\x9b\x96\xaf\xb2\x11\x61\x2a\x41\x1c\xb2\x11\xee\x2e\xfa\xfc\xe8\x02\xe6\x95\x70\x8f\x9a\xb7\x6c\x3a\xae\x3f\x82\x5e\x47\xaf\x52\x2d\xf0\xbe\x11\xb3\xcb\xfb\xad\x51\xe8\xd2\x02\xed\xdb\x82\x38\x64\x23\x7c\xc4\x2f\x36\x2a\xf0\x96\xe9\xa2\xfa\x6e\xff\xf1\xc3\xf3\x1c\xde\x33\x01\xcc\x6a\x8e\xe8\x8a\x7b\xfc\x11\xc1\x35\xe7\x1f\xd5\xbf\x41\x44\x06\x71\xff\x67\x84\xff\xf9\x4e\xfc\xcf\xf7\x08\xb7\x93\xf5\xcb\x85\x66\xd4\x4c\x24\xe3\x95\x97\xaf\x95\xea\xa0\x0d\x2a\x7e\xfc\xfc\x0e\x7b\x9b\x77\x7c\xbe\xe2\xd2\x43\x5f\xfc\x84\xbf\x8d\xf0\x6b\x97\x77\xed\x8b\xc6\x42\x4b\xfa\xe7\xde\x24\x04\xd4\x37\xec\x62\x4b\xed\xad\x74\xd0\x3f\xf7\x5e\xe0\x25\x53\x7f\xf2\xc9\x5e\xfd\x2f\xd4\x36\x05\xcf\x5d\xf0\x67\x68\xef\x92\xa5\xf0\x1b\xba\x6e\x4a\x91\x9f\xea\x12\x72\x7f\x08\xc5\xad\xaf\x71\x5c\x3a\xc8\x3c\xd6\xb7\xfe\xaf\x19\x61\xd0\xd0\xfe\xae\x11\x46\x32\xc2\x8f\x0e\x0c\x5c\x02\x1f\x0b\xe5\x36\x1a\xe6\x75\x57\xaa\x65\x5f\x17\xc8\x08\x11\xfd\xe3\xa2\x9a\xdd\x93\xae\x91\xb4\x5a\xa2\x7b\xeb\x4c\x36\x2b\x79\x91\x3c\x9a\x21\xaf\x1f\x26\x95\x61\x51\xed\xf5\xf1\x4d\xf4\x4d\xb1\x0f\x79\x17\x9b\xfa\xbb\xd7\xe5\x36\x99\x95\x86\xb4\xb4\xd6\x3c\x58\x93\xcf\x64\x6b\x16\xd9\x08\xa7\xa1\x26\x49\xa0\xbc\xbc\xbf\xfe\x80\x64\xa6\xc0\x34\xc5\x6a\xd3\x12\x47\x4d\x0d\x23\x3d\xb8\x96\xcb\x92\xb4\x7a\x7e\xfb\xc7\xb9\x33\x19\xad\x0e\xd2\xcf\x3e\x59\xf5\x2f\x0f\x3b\xca\xb6\x0d\x0e\xb1\xba\x6c\x48\x38\xda\x99\x71\x6d\x6b\x95\xde\xa2\x7d\xa4\x3b\x9e\x60\xcc\x53\x91\xe1\xda\x99\x8c\x16\xd9\x08\x5f\xed\x58\xbb\xfa\xf2\x78\x0c\xa3\x4e\xb5\x8f\x24\xe7\x85\xe4\xaa\xe1\x5b\xfb\xc9\xf2\x9b\x07\x9c\x1e\xec\x32\xb9\x63\xd2\x03\x07\x67\x66\x84\x41\x22\x3a\x2d\xf3\x45\xbd\xc5\xdb\x1f\xc9\xe9\x48\xdc\x5f\xa7\x22\xdc\xfc\x31\xf7\xd9\x92\x9a\x82\xac\xf3\x40\x8b\x6e\x9d\x10\x87\x8c\x89\x8e\x1d\xca\xfa\x20\x0e\xe9\xbe\x04\x83\xc0\x86\x9f\x21\x75\xb7\x99\x33\xf9\xe9\x1c\x7e\x3a\x4e\xa8\x3f\x42\xcb\xbe\x29\x7c\xdd\x3d\x99\xa2\xeb\x28\xb1\xd2\x54\x02\xba\x2f\x01\xc0\xc1\x33\xdf\xfc\xd3\xd9\x40\x2a\x61\x4a\x61\x61\x4a\xc3\xef\x99\x28\xe7\xe4\x7b\x09\x5e\x0b\x33\x94\xbe\xc7\xbe\x18\x73\xad\x6c\x29\xb5\xfc\x23\x54\xd3\x0c\xe0\xe0\x99\xcf\xec\x6e\xe1\xf2\x2b\x99\x81\xf7\x22\x1b\xbe\xb5\x9e\x2b\x25\x83\x29\x36\xa2\xdf\xc9\x3e\x26\xa8\x64\xcf\x29\x29\x57\x68\x10\x42\x4e\x00\xc4\xc1\x9f\x43\x79\x1f\x36\xdd\xfd\x0d\x75\x67\xbf\xbb\x0f\xf5\x2e\xde\x41\x71\x34\x2b\xa8\xc0\x38\xfe\x95\x9d\x16\xad\x58\xb7\x54\x35\x33\xc4\x8f\x30\xc2\x20\x0e\xaa\x11\xfe\x77\x23\x0c\x7a\xa1\x4f\x93\x80\xf0\xfc\xb0\xd5\x57\xfd\x3f\xfc\x81\x5c\x29\x2b\xdf\xee\xbe\x54\x2c\x6c\xdf\x76\x2c\xb2\xbd\x37\x6d\x40\x25\x77\x4d\x50\x64\x2c\x17\xda\x0c\x07\x70\xf0\xa1\x87\xe5\xd4\xa2\x53\x94\xbc\xda\x9c\x9d\xda\xd9\x52\xca\x55\xe2\x68\x8a\xd6\x48\x91\xda\xb7\x90\xff\xf0\xe0\x40\xf6\x0d\xf9\x08\x74\xdc\x16\xc4\xc1\x25\x30\xfa\x90\x49\x3f\xe2\x02\xc6\xdd\x62\x7b\x05\x39\x1a\xff\x75\xf4\x63\xd7\x17\x5b\xf9\xc5\x29\x59\xd7\x0a\xed\x35\x1b\xf5\x22\x6d\x10\x71\x41\x1c\x5c\x02\xae\xac\x5d\x2b\xad\x13\x58\x1d\x1d\xec\x6b\x5f\xab\x1c\x39\x8e\x3e\x1b\x96\x61\xfb\x87\x8b\x64\x5f\x9c\xfc\xd8\xc5\x32\xa3\xbf\x8e\x88\x0b\xe2\xe0\xcf\xe1\xe9\xcd\x9a\x0b\xa3\x17\x35\x76\xae\xd7\x62\x98\x12\xfe\xa2\x76\x31\x20\x58\x4a\x55\x26\xe0\x71\x33\xba\x3f\x22\x54\x4a\x5f\x7d\x01\xb1\xf8\x01\x71\x50\x6d\x20\xef\xbf\x2f\x80\x41\xb3\xeb\xa9\x75\xe2\x97\xc9\xaa\x46\x33\x79\x23\x86\x62\x1a\xf3\x0e\x2f\xa5\x5f\xaf\x1b\x0c\x4b\xbf\x3b\xa7\xf1\x12\x6b\x91\x71\xc9\xce\xa3\x07\xba\x4e\x1c\xc4\xc1\xc7\x4e\xb3\xae\x49\x2b\x69\x60\xe8\xdb\xa5\xe4\x74\x58\xe0\xfb\x4a\x9a\xc3\x7d\x97\xa6\x9c\x83\x6a\x9a\x4e\x7d\xca\xc2\x57\xa8\xd2\x19\x11\x17\xc4\xc1\x35\x20\x62\xe4\xe7\xf1\xe7\xdc\x09\x37\xfa\x06\xda\x53\xbf\xbe\xbe\xec\xcf\xf1\xaf\x07\x37\x37\xf2\x77\x6f\x97\xf5\xc9\xed\xe7\x50\xbc\x86\x6a\xf8\x00\x1c\x5c\x03\x99\x82\x72\xb7\x02\x58\xc2\x99\xaa\x14\xda\x75\xeb\xb9\xc9\x9d\x0f\x2d\x15\xfc\x69\xb2\x86\x68\x79\x8f\x0c\x0f\x97\xbb\x24\xb4\xa1\xe7\x00\xe0\xe0\xcf\x21\x2b\x2b\x64\xdb\x52\x7e\x43\xfc\x42\xe2\x07\x94\x60\x83\xf9\xe2\x4f\x06\x3c\xac\xcf\xf1\x36\x23\xbd\x8d\xba\x54\xe8\x83\x8e\x64\x10\x1a\x00\x71\x50\x6d\x20\xc0\x08\x83\x52\xdd\x69\x1a\x38\xe6\x10\xe1\xfd\xbe\xa6\x8a\xb6\xfd\x4c\xd8\x15\x93\x9e\x24\xb2\x47\xea\x40\xd5\x40\x8a\x9a\x90\x59\x2a\x74\x22\xe6\x8f\x24\x54\x72\x00\xe2\xe0\x63\xa7\xd0\xb3\x28\x76\xf2\xae\x11\xcc\x20\x49\xfa\x79\x85\x5c\x5b\x32\x3f\x46\xf5\xd8\x24\xd8\xc2\x2e\xee\xe4\xa6\x0a\x4d\x6a\x0e\x54\x7f\x0e\xe2\xe0\x1a\xf8\x18\x4d\x92\x7d\x1f\x3d\xaf\x6b\x34\x86\x5d\xbf\xcc\x34\xb8\xb4\x46\x69\x28\xd8\x62\xa9\x23\x83\x2b\xe4\x6b\x12\xd3\x4a\x23\xb4\x7b\x09\xe2\xe0\x1a\x20\xce\xbd\x86\xfa\xee\x07\x4d\x9d\x7f\xeb\xc6\xc3\x2a\x23\xdf\x72\xdd\xd9\x98\xb7\xdc\xdd\x25\x76\x45\xe4\x31\x44\x5a\xfd\x07\x29\x88\xb8\x20\x0e\xfe\x1c\xe4\x36\x2e\x85\xd6\xbc\xd9\xbb\x70\xc5\x8e\xe1\xe1\xed\xde\x85\x2b\xaa\xfb\xeb\x0f\x1b\x3e\xb0\x31\x93\x0e\xed\x12\xd1\x79\x9b\x0b\x20\x34\x00\xe2\xa0\x79\x40\xe7\xdf\x35\x00\x5a\x77\x9c\xa6\x01\xa7\x7b\x74\x66\xb8\xab\xd7\x2b\xd6\x8e\x69\xf8\xd9\x1d\xb3\xff\xa8\xe4\x6b\x6e\xd7\x31\x15\x70\xce\x35\x8f\xa0\xd7\x68\x13\xca\x22\xc6\x0e\xe2\xe0\x63\x0f\x6c\x88\xa1\xdb\xaf\x1f\x9a\x9e\xba\xcb\x10\x37\x13\xed\x93\x44\xb9\x9b\x57\x20\xaa\xff\x4b\xb7\x44\xe8\x70\x70\xf2\x24\xe8\x07\x22\x2e\x88\x43\xaa\x11\xce\x8a\xd9\x5b\x92\x34\x0f\x14\xad\x97\xb9\xbb\x59\x41\xe2\xc6\x49\xf6\x42\xe7\x27\xe6\xcb\x6b\x5b\x56\xfc\x68\x7a\xb7\xda\xa0\xbe\x0e\x20\x0e\xae\x81\xba\x83\xba\xea\x98\x6c\xea\xce\x9a\x17\x6c\x1a\xa6\xfa\x8e\xe7\x3f\xa6\x3d\x8f\x5e\xf0\xa7\x3c\xbe\x18\x97\x54\xa3\x96\x5a\x0f\x9d\x0a\x00\x71\xf0\xe7\x20\x5f\x2f\xbb\xd6\xa0\xfb\x33\x91\x6b\xb1\xec\x42\xfa\x42\xc1\xd7\x93\x96\xee\x9e\xcb\xbe\xdd\x13\x4a\x83\xac\xef\x88\x35\x5e\xbe\x83\xae\xd2\x03\x70\xd0\x3c\x00\x30\xc2\x20\x13\x75\xba\x11\xb6\x4c\x73\xb1\x4a\x14\xe1\x7e\xf4\xaa\x79\xb8\x4a\x10\xef\x36\xd5\x2f\x8c\x2c\x8b\xbc\x2c\x0c\xbe\xc9\x0c\xa2\x1e\xf5\x9c\x8e\x42\x84\xa9\x04\x71\xc8\x46\xf8\x4e\xf0\x82\x83\x9f\x5f\xa8\xec\xf2\x0d\x6e\xc3\x86\x11\x5f\x46\xcd\xfc\x35\x5a\x74\x25\x9d\x6d\xa7\xef\x16\xcf\xb7\xec\x6e\x3d\x46\x44\x06\x71\xc8\x46\xf8\x35\x35\x29\x3a\x0e\x73\x07\xde\x94\xb6\x0a\x4a\xe7\x92\xeb\x0a\x36\x76\x42\xcf\xf9\xf9\xe2\xb8\x97\x0b\x86\xe7\x77\xfd\x84\xf9\x10\x91\x41\xdc\xff\x19\xe1\x7f\x7e\xbc\xf8\x9f\xef\x11\xbe\x25\x70\x97\xe4\x6a\x8e\xe5\x66\x51\x59\xd4\x22\x9f\xec\xc3\x59\xed\xac\x50\x9f\xfd\x00\x12\xa2\x61\xbf\xb0\xab\x45\xd7\x43\x93\xfe\x36\xc2\xbe\x2b\x5e\xdf\xde\x1a\xcc\xaa\x39\x44\x78\x8b\x3f\x77\xf5\x09\xc1\xf1\xb8\xe7\xa2\x9b\x1a\x96\x89\x3f\x88\x7a\xac\x34\x2d\xf2\xf6\x2f\x54\x4d\x1d\x3d\x44\x2e\x22\xe9\x49\xa6\xe1\x40\x27\xb6\x65\x82\xad\x72\x5c\x59\x52\x88\xe0\x70\x95\xf2\x43\xf4\x2b\xc3\x39\x56\x9f\xfe\x6b\x46\x18\x34\xb4\xbf\x6b\x84\x91\x8c\x30\x0e\xe5\x15\xac\x57\x27\xfc\xf6\x27\xad\xfb\x09\x3c\xeb\x96\x49\xb4\xb9\xbe\x59\x0d\x04\x4d\x5d\x29\xee\xad\x35\xe3\x17\xf7\xb5\xce\x64\xb3\x12\xd9\x08\x5f\xc0\xce\x3a\xe8\x40\x67\xec\xe6\x9a\xf1\x3a\x2e\x4c\xbf\x5d\xf6\xb8\x6b\x24\x8a\xa4\xf4\x84\xcf\xf8\x55\x46\xf8\x7d\xac\x01\xa6\x33\xd9\x9a\x45\x36\xc2\x12\xdb\x2c\xde\x5b\x13\xc7\x31\x8b\x8f\x19\x86\x36\x8b\x6f\x56\x91\xae\x61\x71\x0c\x9f\x88\x44\x9a\x94\x5f\x4e\xfd\x7e\xf5\xf0\x4c\x5a\x83\x89\x22\x1b\xe1\xcd\xc8\xaf\x37\x4c\xd4\x99\x9f\xa0\xbc\x89\xb9\xd4\xa6\x62\x98\x80\x7a\x7f\x82\xb6\xa6\x06\xf7\xf3\xcd\xa6\x61\x8d\xda\xb4\x21\xcf\x33\x19\x2d\xb2\x11\x96\xe1\xd7\xb3\x2c\xfc\xbc\xd7\x1b\xe8\x82\x19\x7c\xbe\x9a\xf0\xb7\xb7\xba\xcd\x2b\x42\x12\x74\xaa\xa3\xf8\x96\x13\x6e\xcc\xab\x3c\x67\x66\x84\x41\x22\x3a\x2d\xf3\xbd\x3d\x6a\x27\xd1\x5f\x77\xbe\xd1\x60\x26\xc0\xd5\x38\x5c\xda\xe8\x5f\x75\x7d\xee\xc2\xec\x44\xd4\x65\xdb\x0f\xe5\xc5\x65\xb7\x76\xa0\x4e\x26\x00\x0e\x3e\xe3\x63\x97\x58\xb6\x45\xdf\xb8\xca\xce\xa1\x36\x61\x24\x8d\x1b\x9c\x7b\xff\xd1\x94\x8d\x64\x75\x9c\xdc\x51\x32\x75\x06\xd1\x5b\x16\x68\x05\x0c\xe2\xe0\x99\x0f\xf5\x65\x52\x68\x32\xcf\xf0\x42\x42\x5e\xbb\x99\x0c\x55\x56\xaf\x43\x63\x7f\x63\xc0\x03\xc2\xc7\x78\x78\x2a\x1b\xd9\x53\x1c\xbf\x10\x71\x41\x1c\x3c\xf3\xbd\xce\x62\x2a\x6f\xa3\xa7\x39\x74\x7a\xe7\xae\xe7\xee\x34\xc9\xc1\xd6\xf9\x4a\xad\xab\x67\xad\xf8\xfc\xf9\xa4\xd7\x53\xd9\x3b\xd0\xb6\x05\x88\x83\xff\xbd\xce\x8a\xf8\x34\x97\x74\x32\xfc\x6d\x59\x5c\xb5\x85\x27\x69\x8f\xeb\x5e\x5a\xf4\x84\xda\x16\x04\x6a\x08\x73\x3e\x7b\xa9\xd6\x83\x0a\x1d\x8d\x06\x70\x50\x8d\xf0\xbf\x1b\x61\xd0\x0b\x7d\x9a\x04\x12\xf7\x09\x56\x66\xf4\x85\xbc\xe8\xbc\x4a\x49\xd0\xa3\x5c\x3e\xf3\x0d\x34\x04\x59\x77\x8b\x76\xcc\xfd\xd6\x57\x21\xf3\xbc\xdc\x89\x18\x3a\x88\x83\x4b\xe0\xb9\x4a\x16\xf9\xf4\xef\x21\x91\x3f\x37\xe3\x2c\x3e\x98\x99\x4b\xe8\xdb\xf9\xd1\xfe\x9e\x30\x23\xed\xd9\x96\x98\x78\x91\xe0\x48\x04\x1d\x36\x00\x70\xf0\x47\x3a\xa6\xf0\xf8\x87\xa5\x7e\x7a\xec\xdd\xe0\x1a\x81\xfc\x7c\xf6\x60\x74\xf6\x54\xe5\x01\x89\x74\xbf\x56\x56\x27\xcf\xa6\x79\xf9\x01\x44\x5c\x10\x07\x97\x00\x0f\xf3\xe6\xca\x45\x11\xe9\xbc\xea\x12\x37\xb3\x98\xc0\x7d\x49\x7c\xf9\x5a\xd2\x1d\x25\x6c\x6a\x19\x4d\x99\xb7\x74\xa9\x6c\x45\xd0\xa9\x7b\x00\x87\xb4\x58\xe3\xe3\x36\x08\x45\x1f\xda\x66\x6d\xd0\x2e\x37\x54\xe2\x57\x08\x4d\x7b\xa3\xec\x7d\x6f\xcc\x66\xbe\x31\x37\xc6\x55\x54\x3b\x0b\xb1\xf8\x01\x71\x50\x6d\x20\xc0\x08\x83\x66\xd7\x53\xaf\xd0\x72\xda\xdf\x5f\xef\x10\x6d\x99\xf9\x36\x3f\x9f\x2b\x62\x25\xfb\x8c\x6e\x5b\xf7\x12\x55\x6d\xff\xd7\x9f\x72\xdb\xf3\xf7\x3a\xa0\xef\x4b\x20\x0e\xae\x01\xa9\x1d\x95\xb2\xf8\x0b\x95\x56\xe5\x95\x96\x96\x77\xe3\x50\xf7\xf4\x1a\xb3\x76\xf5\x03\x77\x5b\x39\x4e\x7e\xba\x67\xc5\xf4\x41\x0b\x55\x10\x07\x7f\xa6\x38\xc4\xab\xca\x7f\x12\xbc\x67\xdf\xa7\xb2\x6a\xf8\xad\x47\xb8\xee\x39\x78\xb4\xfb\x56\x7d\x29\xcb\x3a\xbe\xf2\xa9\xaa\x53\x0d\xd2\x2c\x88\x83\x6b\xc0\x8f\xc0\x85\x67\x5b\xd2\xba\x73\x8b\x20\x86\x0f\xf5\xad\xd4\x8a\xaf\xd2\x9f\xe5\x4d\xfe\x8c\xd0\xe5\x2b\xe4\x52\x9b\xbf\x71\xa0\x9a\x43\x10\x07\xff\x7b\x03\xc3\x4c\x9e\xe7\x77\xee\xd6\x62\x85\x3f\xcf\xb0\x8c\xad\x1f\x74\x7e\x9e\x64\x80\xdd\x74\xdd\x39\x84\x11\xf3\x26\x3b\x8b\x05\x54\x1f\x0a\xe2\xa0\xda\x40\x80\x11\x06\xa5\xba\x53\x8f\xc5\x52\x48\x87\x8a\x5d\xbe\x1c\xd7\xaa\x3c\xb8\x2e\x86\x35\xfe\xa4\xc1\x27\xed\xa9\xc0\xf1\x3e\xdd\x46\x6a\x0b\x4d\xed\xd7\x73\xdd\xd0\xd8\x01\x1c\x5c\x03\x57\x04\x0c\x51\x9d\xcc\x35\x69\x4b\xd1\x5b\x79\x33\xb6\xf8\x4a\xc8\x16\x85\xfa\x5a\x1b\xbe\xef\x63\x3d\xf8\xfa\x50\xcc\x72\x14\xea\x43\x08\xe2\x90\x4a\x24\xc2\x2f\xbd\xa6\xb6\x41\x51\xe5\x26\x5b\xc8\x0d\x89\xb9\xbe\xe1\xd6\x89\xbf\xc2\xde\x6b\xe1\x33\x93\x5c\x26\x9e\x23\x13\x75\x13\x2a\x91\x00\x70\x70\x0d\x4c\x98\xe3\x54\x97\x05\x1f\x61\xbf\x3e\xe4\xa0\xef\x72\xbe\xb6\xe2\x9a\x1a\x5e\x50\x4d\x11\xae\x62\xf8\x58\xd3\xf1\x66\xda\x20\x74\x2a\x00\xc4\x21\x5d\x81\xbf\xcd\xfd\xf1\x47\x5a\x7f\xe7\xe3\x4a\xbd\x87\x17\xe5\x36\x9c\xba\x3e\xc8\x55\xfc\x92\xeb\xcd\x52\xfd\x58\x19\x57\xc9\xbb\x88\x89\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\xad\x3b\x4e\xd3\x00\xca\x84\x48\x97\x55\xe6\x01\x87\x8e\xbe\x59\xa0\x89\x8a\x4c\xa4\xee\x5c\x26\xb1\x97\x14\x1d\xa9\x2b\xf6\x82\x8f\xb5\xb3\xe9\x11\x62\xec\x20\x0e\xae\x81\x3b\x1f\x89\xee\x9b\xe8\x2a\xcb\xd9\x3b\x7d\xb1\x1e\x8f\x0e\xa7\x0a\x08\x13\xc8\x72\xab\xff\x41\xb9\xaa\xa8\x6e\xc4\x17\xc6\x06\x5d\x77\x06\xe2\x90\x6e\x10\x08\xf5\xbb\x37\xb5\x7c\x98\x6d\x8d\x51\xa6\xe3\xe1\x2d\x88\x39\x6f\xce\xbf\x94\x92\xf7\xb1\xce\xd9\xa8\xcf\xa1\x3e\xf6\xe4\x12\x22\x2e\x88\x83\x6b\xa0\xeb\x30\x63\x40\x5c\xfb\x65\x68\xaf\x79\x6d\xa3\x32\x81\x75\xf0\x53\x1b\x4a\xed\x5e\x92\xa6\x9a\x0f\x15\x7a\xc2\x79\xc1\x14\xd0\xe9\x08\x10\x07\xff\x7b\x73\x76\xc8\x8a\x50\x98\x58\x96\x3c\x58\x62\xe2\x84\x65\x05\x37\x9c\x50\xdf\x91\x0c\x57\xbc\x63\xca\xf2\x2e\xce\x3f\xa7\x93\x02\x5d\x9f\x04\xe2\xa0\x79\x00\x60\x84\x41\x26\xea\x74\x23\xfc\x24\x9c\xf2\xd9\xe2\x7c\x5e\xd2\xaf\x22\x19\x1a\x8a\x19\x1c\x8f\x19\x8d\xe9\xbd\x2a\x9d\x64\xfa\x2b\x6a\x99\x63\x29\x31\xb4\x03\x08\x53\x09\xe2\x90\x8d\x70\xd2\x49\xf4\x91\xe1\xea\x75\x67\x06\xf9\xd5\x9d\xfe\x1d\x99\xc6\x09\xfe\x71\xde\x5d\x5b\xf6\xf5\xb2\xd2\xea\xf9\xf8\x4f\x68\x50\x8d\x30\x88\x43\x36\xc2\x05\xa6\xe5\x15\x65\xeb\x7b\x3d\x4c\xc7\xa5\xbf\xb8\xc8\xca\xef\xe9\x5d\x24\x70\xd1\xbe\x29\xac\x1b\x11\xd5\xee\x23\x8e\x71\x70\x19\x11\x19\xc4\xfd\x9f\x11\xa6\xff\xa7\x11\xfe\x5f\xef\x11\x5e\xa2\xe9\xe8\xa2\x4e\x52\x0c\xc5\xdb\x51\xd1\xde\x92\x74\x2d\x3a\xb4\x93\xa4\x73\xd4\x37\x11\xbc\xe4\x29\x79\x29\xcd\x9f\xb8\xe0\x6f\x23\xec\xb7\x57\x57\xaf\xbb\xa5\x66\x7b\xcb\xdb\x24\x36\x38\xe0\x26\x6f\x82\xee\xf3\xa9\xea\x32\x39\xff\xb9\x68\x93\xba\xea\xc7\xfd\x44\x7f\xa1\x0b\x4f\x6a\xab\x9d\x58\x1c\x18\xd4\xe5\xa7\xeb\xfc\xbf\xec\x90\xba\x52\x08\xbc\x97\x35\x4d\xc6\x78\x56\xaa\x66\x3d\xe0\x12\x4b\xf9\x5f\x33\xc2\xa0\xa1\xfd\x5d\x23\x2c\x07\x37\x4b\x18\x0a\xeb\x97\x94\x37\x83\x82\x25\x25\x5a\x2c\x9a\x6f\xb8\xa9\xfd\xf4\xed\xd4\xca\xb3\x39\xca\x20\x4d\x76\x6d\x64\xa0\xaa\x3a\x93\x3e\xca\x9e\xc8\x46\x78\xb3\xca\x42\x97\xc8\xd1\xf1\xb3\x59\x6a\x5b\xf9\xcb\x5c\x1c\x86\x3a\xac\xf8\x17\xcd\xb7\x2a\xf1\x9b\xf5\x8f\x9e\x87\x7e\x75\x8f\x3d\x93\xad\x59\x65\xa4\x9f\xa5\xf2\x2f\x7a\xeb\x4a\xb0\x2c\x9c\x6f\x1e\xd5\xd1\x58\xac\xa2\x45\x54\xda\xcd\xca\x3d\xa9\x7d\x20\x6c\xd6\x8d\x25\x14\xd0\xd9\x77\x26\xa3\x45\x36\xc2\x3d\x7f\xe8\xaf\x3d\xc8\x6e\xa2\x26\xb7\x3c\xf6\x34\xdd\x1b\x36\x93\x2c\x12\x0d\xef\x9b\xcb\xcf\x89\xaa\x21\x1e\x39\xae\x97\xf2\x3e\x93\xd1\x3a\x22\xfd\x2c\xf7\x11\xc7\x65\x2c\x87\xcb\x76\x25\xa3\x7c\xce\xc1\xad\x46\x89\x77\xd8\xa9\x8f\xef\x59\x7c\x14\x1e\x1f\x39\x79\x67\x65\x68\x54\x7e\x66\x46\x18\x24\xa2\xd3\x32\xdf\x4b\x2d\x51\x3a\x27\x6c\x55\xd7\x63\xd3\x27\x7d\x99\x72\x4c\x27\x05\x83\xcf\xd5\x05\x44\x32\x3a\x5a\x56\x06\x45\x5f\xcf\x93\x40\x97\x26\x82\x38\x78\xe6\xf3\x14\xee\x22\xbc\x68\x54\xfa\x7e\x21\xe2\x71\x68\x40\x81\x09\xf3\xdd\x5b\x98\x6d\xc6\x5f\xa4\x8f\x6d\x34\x6f\xb5\xb0\x30\xb8\xe3\x20\xe2\x82\x38\x24\x23\x8c\x9d\x25\xfa\x51\x81\xf2\xf6\xa0\xfd\x1d\x37\x06\xc2\x5b\xdf\xa6\x2c\x13\x3b\x0d\x1b\x32\x06\x9d\x0c\x1a\xe6\x76\x25\x3e\x41\x05\xa2\x20\x0e\x9e\xf9\x9a\x1e\x3e\xba\xb3\x38\x4d\x99\x62\xfc\x67\xf0\xe5\xfb\x5f\xc9\x0e\x4b\x6d\x28\xef\xef\x19\x19\x70\x39\x06\xa9\x28\x53\xa6\xb1\x40\x99\x0f\xc4\xf9\x88\xa3\x78\xfe\x1d\x77\x27\xc7\x78\x19\xed\xc6\xb5\xa9\x82\x71\x6f\x56\x2a\x11\xcd\xa3\xe3\xb0\x71\xa7\x6e\xb1\x13\x0e\xfa\x1a\xfe\x32\x41\x8e\x6f\x0d\x08\x23\x0c\xe2\xa0\x1a\x61\xb9\x7f\x5f\x00\x03\x5e\xe8\xd3\x24\xe0\x16\xfe\x26\xb0\x86\xff\xea\xf5\x84\x38\x14\x19\xfd\x52\x1f\xf1\x73\xa6\xfd\x46\x4f\xc2\x2e\xa2\x5c\x0f\x50\x30\xd6\x30\x51\x86\x3a\xfb\x82\x38\xb8\x04\x98\x59\x8f\x82\xb5\x53\x87\xc9\x7f\x1c\xb2\xa7\xed\xe6\x63\x4a\xb7\x1c\x0a\x30\x93\x49\x3d\xbf\x26\x79\xfb\xfb\x57\x31\x7e\x29\xa8\xe9\x0c\x88\x83\x4b\xe0\xf9\x2a\xff\xa4\xb4\xe2\x9d\x1e\x2d\xb1\x23\x31\xa1\x2b\xad\x23\x68\xfd\xc3\xaa\x96\x24\xed\x16\x95\x89\x2f\x94\x7b\x6f\x34\x87\x41\x06\x1b\xc0\xc1\x25\x10\xa0\x53\xdb\xe8\x46\xcd\xdf\x75\xfe\x9e\x50\x53\x9a\x7c\x86\x24\xbb\x27\xef\xc7\x4f\xd4\x93\xca\x25\xce\x3d\x5d\x9d\xc7\x6b\xd0\xfd\xc4\x20\x0e\x2e\x81\x15\xbb\xc6\xc5\x13\x5e\xc7\xc2\x08\x15\x36\x2f\xf6\x23\x8f\x9c\x14\xb1\x7b\x4c\xb2\x87\xe4\x59\xed\xa3\x23\x1f\xcc\x8f\x94\xfc\x11\x8b\x1f\x10\x07\xd5\x06\x02\x8c\x30\x68\x76\x3d\x4d\x03\xc6\xd7\x39\xd2\x08\xb9\x5f\x18\x48\xdc\x5b\xce\x49\x58\xca\x60\x7c\x4a\x6c\x24\x51\xd7\xa3\xa9\xff\x01\xad\xd3\xa2\x90\x85\x14\x3a\x12\x09\xe2\xe0\x1a\xb8\xc6\x33\xa7\xfd\xc5\x18\xcd\xee\x61\x68\x4d\x58\x6b\xa8\xa2\x2e\xe1\xd0\xeb\xbb\x3c\xbb\xa1\x7a\xe5\x2a\x87\x68\xce\x12\xd7\xaa\x20\x83\x0d\xe0\xe0\x1a\x70\x68\x20\xac\x8e\xfe\xfd\xb5\x67\xce\x8c\x53\xff\xe6\xb7\xd2\xac\x1b\x3f\x76\x8d\x51\x05\x64\xbb\x75\xd4\xaf\x2a\xaa\x13\x5b\x41\xd7\xa6\x80\x38\xb8\x06\x4c\x6c\xd1\xa6\x72\xb9\xd3\x26\xef\xa3\x6e\x3e\x65\xbf\x5d\xdb\x6d\xba\xca\x4d\x1c\xcc\x64\x8d\x7a\xfe\x6b\xfe\xef\xfb\xe9\x8f\x3a\x10\x71\x41\x1c\x5c\x03\x8f\x3b\x05\x2f\x99\x37\x1f\x7a\xef\x78\x3d\xed\xd5\x89\x40\xa7\x7d\x70\x80\xee\x58\x5e\xe5\x4b\x22\x65\x2d\x2a\x98\x53\xac\x97\x81\xd0\x00\x88\x83\x6a\x03\x95\xff\x5d\x03\xa0\x54\x77\x9a\x06\x12\xf2\x64\xe4\xd0\x23\x68\x27\x93\x6c\x27\xb7\xef\xab\x07\x93\x9e\xef\xad\xad\x24\x22\xa4\x14\x6a\x21\xd7\xb3\x71\xd0\x68\x68\x41\x8c\x1d\xc4\xc1\x35\xa0\x2b\x5b\x23\xae\xb3\x3c\xf7\x2d\x7e\x36\xf1\xa0\xc5\x88\x88\xfc\xf6\x8d\xf9\x80\xab\x17\x42\x2c\x6c\xcf\x0b\xb4\xdf\x44\xb5\xf3\x47\xc4\x05\x71\x70\x0d\x8c\xf4\x9f\xc7\xf0\xc6\xd5\x3a\xa7\x4b\xa5\xe9\xdd\x4a\xc4\x1a\x37\x24\x94\x82\xbb\xf0\x72\x2a\x17\x97\x42\xe1\x6a\xcf\x51\xea\x13\x44\x5c\x10\x07\xd7\x00\xd5\x9e\xea\x25\x72\x9b\x0e\xd4\x1b\x92\x39\xc4\xab\x59\x65\x91\x12\x14\x78\xa5\x23\x01\xf5\x15\x9d\x89\x56\x02\xb4\xba\x25\x50\xd3\x30\x10\x07\xd7\xc0\x9d\x23\x23\xce\xe6\xa4\xfc\x65\x62\x92\x03\xfb\xd9\x87\xb9\x43\x3b\x36\xde\x7d\x46\x18\xf2\x0b\x47\x76\x13\x69\x44\xbb\xa3\x1d\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\x34\x0d\x7c\x2f\x30\xf9\x7e\x75\x4f\x6a\xd7\x71\x2c\x55\x78\x44\x2b\xe2\x43\x46\x6f\x45\xdc\xf5\x23\x26\xf1\xcd\x26\x47\xfa\x96\x5f\x8c\x50\x8d\x3c\x88\x83\x6b\x60\xee\xd6\x44\x9c\x93\xa7\x1a\x5d\x95\x15\xa7\xca\xad\x3b\x7d\x3f\xde\xe6\x68\x8d\x2a\x18\x91\x2b\xe1\x33\x0a\x7e\xbb\xc4\x4b\xea\x85\x88\x0b\xe2\xe0\x1a\xb0\x1a\x16\xa6\x4f\x8f\xa0\x27\xe7\xc8\x52\x59\xd3\x51\xa3\x14\xf1\xe8\x64\x25\x74\x89\xeb\xdd\x26\x66\x3c\x28\xfe\x9e\xdc\x02\x5d\xcb\x04\xe2\xe0\x1a\xe0\xbd\x54\xb0\x3e\x5c\xae\x7b\x79\xcd\x9c\xfd\xe7\xcd\x57\x4f\xb8\x32\x55\xbd\xf7\x6f\xec\xe4\xb5\x5e\x91\x52\x10\x90\xe1\xf3\x82\x1a\xb1\x81\x38\xb8\x06\x62\x89\xa9\x74\x73\x5f\xaa\x97\x9c\xe7\x7b\x70\x5b\xef\x99\x0d\x25\xc9\xf5\x63\x96\x37\x3e\x8f\x6d\xf9\x77\xa8\xa3\x18\xc9\xcd\x6f\x20\x34\x00\xe2\xa0\x79\xc0\xf1\xdf\x8d\x30\xc8\x44\x9d\x6e\x84\x3b\x97\xb6\x2a\x88\x24\xd6\xa2\x9a\x29\xbc\x71\xbe\x72\xbc\xf5\xc1\x5a\xbf\xe9\x38\xc6\x1b\x48\xa3\x5f\x2d\x64\x63\x33\x77\x43\x0e\x61\x2a\x41\x1c\xb2\x11\x76\x88\x9e\x57\xab\xa1\x40\x25\x1a\xfc\x9a\x6c\xf1\x29\xae\x83\xf6\x4f\xdf\xbd\xd8\xbc\xc1\xfb\xac\x16\x3c\xb1\xdd\xdc\x19\x3f\x87\x11\x91\x41\x1c\xb2\x11\xde\xeb\x63\x3b\xbf\x28\xe2\xf1\xf2\x9c\x2c\x77\xba\xe3\xbd\x55\x8a\xc0\xdb\x12\x57\xd9\x04\x96\x09\xfd\xc7\xe5\xb1\xcc\xee\xfb\x6e\x20\x22\x83\xb8\xff\x33\xc2\xb0\x0f\xfa\xff\xeb\x3d\xc2\x04\x8b\x83\xb2\xe4\xb3\x8c\x02\x59\x1b\x17\xf4\xb5\x12\xea\xbb\x4d\x4c\xde\xac\x69\x91\x57\x5c\xd1\x0c\xdb\x2c\xc5\xc1\x7a\xeb\xf4\xb7\x11\xbe\x5f\x29\x2f\x7a\x3e\xd5\x8c\x02\x7d\x61\x0e\xa5\x77\x56\xfb\x3e\xfe\x22\xaf\x5a\x74\xd0\x4b\xec\xac\x5f\x14\xa9\xe3\x2f\xca\xfb\xff\x42\xc5\x16\x0f\xed\x0e\xdd\xed\x57\xd0\xc8\x6c\xf2\x7a\x47\x84\x58\x93\x8f\xb7\x8d\x64\x6e\x68\xdc\x17\x89\xf1\xb5\x70\xcb\x9a\xe0\xfe\xaf\x19\x61\xd0\xd0\xfe\xae\x11\x46\x32\xc2\xaf\x78\x55\x08\x51\x67\x28\x17\x31\x1f\xfe\x16\xd6\xad\x3a\x59\x4a\xac\x41\xcf\x5a\x11\xd9\x89\x22\x98\x18\x9e\xf7\xa2\xf9\x78\x36\x0d\x8d\x91\x8d\xf0\x10\xee\x75\xf5\x0f\xc5\xe7\x92\x59\x44\xfd\x7c\xcc\x24\xcc\x0c\x8c\x9e\xcc\x7e\x21\xe0\x56\x91\x19\xae\x6f\x49\xa6\x6f\xa1\xbc\x7a\x26\x5b\xb3\xc8\x46\x58\xa2\x29\xcc\xd6\xc7\x98\x31\x4f\xef\x91\x59\xb4\x66\x3b\x6b\x1e\x3d\x9e\x45\x66\x6e\x9e\xe1\x64\x95\x0d\xcf\x87\x2b\x27\x4d\xec\x67\x32\x5a\x64\x23\x7c\x64\xc2\x2b\x1a\xd2\xf3\x8d\x0a\x1b\xcd\xd0\xb8\x9e\x46\xfc\xbc\x99\x32\xfe\xef\x95\x57\x24\xac\x82\x4e\xe4\x28\xbd\x51\x69\x2f\xcf\x64\xb4\xc8\x46\xd8\x36\x5c\x01\xc3\x5f\xf8\x53\x03\xf3\xf7\xe9\xfb\x69\x22\xc3\x64\xa9\xd7\xdc\xe2\xca\xd1\x17\x2e\xa6\x17\x1d\x68\x7c\xdf\x6a\x29\x39\x33\x23\x0c\x12\xd1\x69\x99\xef\x4d\xfd\x61\x47\x52\x5b\x93\x8b\xe2\x27\x77\xd5\xfe\xfe\x82\x1b\x11\x86\x78\xc3\x5d\x0c\xe2\x44\x7d\x5e\x7c\xc9\x25\x17\xbe\x43\x6d\x22\x41\x1c\x3c\xf3\x91\x90\x9b\x71\xb4\xfe\x54\x68\xfe\x33\x3e\xa7\x30\x71\xe1\x03\x85\xc6\x37\x81\x18\x5b\x0f\xe1\xa6\xbb\xd5\x99\x8a\x1f\x08\x1f\x42\xdd\x9d\x41\x1c\x3c\xf3\x89\x3f\xbf\x21\x74\x5f\xd7\x81\xf1\xbd\x59\xb4\xa4\xcf\x4e\xcf\x2a\x5f\xec\x37\x49\xea\x75\x5d\x32\x76\xe5\x00\x19\xd2\xf9\x31\xa8\x30\x0c\xc4\xc1\x8b\x77\xf4\x9e\xda\x5c\x61\xa0\x26\x79\x3c\xc0\x7c\x69\x81\xb3\xca\x49\xcc\x13\xa7\x93\xf2\x66\x85\xfe\x58\x2f\x5a\x9b\x82\x3a\x86\x62\x08\x22\x2e\x88\x83\x67\x54\x92\x20\x41\x3b\xfb\x4b\x6a\x43\x93\x0e\x4b\xc2\x9f\xc9\xb0\x87\x1c\x76\x52\xf5\x37\x78\xe8\x29\xeb\x4b\x2f\x7b\x0d\x7a\xe2\x3c\x42\x18\x61\x10\x07\xd5\x08\xff\xbb\x11\x06\xbd\xd0\xa7\x49\x60\xa0\xd5\xf7\x24\xa5\x31\xd2\x42\xdb\xa6\xdc\x58\xfe\x59\x8d\x6d\xa9\x3d\x16\x36\x85\xc4\x39\x75\xce\x38\x45\x26\x69\x17\x2d\xe8\x48\x30\x88\x43\x3a\x16\xab\x71\x1c\xc5\xf2\x6c\xbf\x36\x75\x30\x8e\xf4\x2d\x8b\x9e\xff\x9f\xf0\x08\x0f\x0f\xca\x5f\xca\x78\xf4\x81\x52\xd4\xba\x9a\x92\xd0\xb1\x58\x00\x07\x97\x80\x91\xa3\x5a\xdc\x90\x8c\xf6\xcb\x0b\x51\x1e\xcb\xfb\x35\xd1\x4e\xa6\x6f\x8d\x4d\xdd\x13\xdb\xed\xbb\x4b\xee\xee\x95\x0b\x4c\xff\x84\x9a\x7b\x01\x38\xb8\x04\xda\x7e\x52\x64\xb3\xbf\x23\xe7\xab\xdd\xf5\x6e\xd8\x55\x10\x9f\xc2\x0b\x18\xa9\x9a\xe9\xdc\x4e\xd5\x8a\xf9\x41\x30\xe7\xd3\xb8\x8d\x88\x0b\xe2\xe0\x12\x68\xf4\x62\x37\x7f\xff\xdb\x86\xcb\x0f\xe3\x4a\x58\xb4\xd6\xe6\xd7\xc7\x9f\x06\xf9\x0a\x71\x85\xdb\x98\x43\xeb\x9f\xa0\x61\x91\x9b\x20\x16\x3f\x20\x0e\xaa\x0d\x04\xed\x08\x03\x66\xd7\xd3\x34\x40\x4e\xaf\x76\xbc\xfe\xac\x87\x20\x53\x7b\xbd\xd9\x4e\x30\xaa\x87\x0e\xdd\x25\x9f\x7c\x79\x9c\x4c\x8f\xa4\x45\x97\x6a\xc0\x18\xba\x43\x19\xc4\xc1\x35\x50\xdf\xd9\x3b\xc7\x91\x86\x93\x3f\xcd\x65\x5d\xd0\x64\x7f\xe9\x2b\x67\xcb\x39\x54\xea\x87\x38\x6c\xd6\xc9\x8b\xb6\x1f\xe2\x2d\x3e\x41\x1d\xbe\x01\x1c\x5c\x03\xeb\xb7\x9e\xba\x18\xde\xf9\xae\x32\x19\xef\x90\xd6\x8d\xdb\xdd\x7f\x10\x66\xed\xe9\xaf\x3b\xd6\xbe\x9c\xd3\xb1\x25\x26\xa8\x09\xf5\xe2\x03\x71\x70\x0d\x74\xdf\xa7\x25\x49\xa8\xa4\x97\x12\xb7\x99\xbd\xaa\x44\x1a\x61\xa6\x1b\xe0\x89\xcf\xf4\x6a\x91\xda\xc3\x9f\xe0\x5a\x45\xca\x92\x38\x22\x2e\x88\x83\x6b\x80\x59\x33\x6f\x9c\xe5\x22\xeb\x93\xe7\x19\x51\x95\xe1\x14\xd7\xc9\x55\x0f\xc3\xa5\x57\x75\x7f\x26\x39\x2d\x6d\x8f\x65\x9a\x4d\x47\x20\x34\x00\xe2\xa0\xda\x40\x80\x11\x06\xa5\xba\xd3\x34\x30\x65\xde\x30\xec\xf9\xaa\xbf\x57\x8b\x2b\x43\xc9\x78\x9b\x80\x86\x18\x7d\xab\xee\xda\xc5\x07\x33\x3a\x4c\xe7\x5a\x98\x7f\x67\xeb\x22\xc6\x0e\xe2\xe0\x1a\xf8\x43\x64\xd5\xbd\xfc\xb9\xdb\x40\x3d\x93\xdd\x80\xb4\x5b\xad\x94\xf5\xe5\x17\x7f\x3d\x13\xdd\x47\xea\xf4\xa1\x46\xfb\xf6\x37\x94\xa0\x2e\xcc\x00\x0e\xae\x81\x35\x29\x7e\xdc\x37\x53\x99\xae\x85\xc3\xcb\x76\x3d\xfe\xab\x25\xcc\x2f\x32\xdd\xbe\xe7\x69\x99\x17\xb5\x74\x94\x29\xbb\xd4\x43\xdf\x44\x41\x1c\x5c\x03\x63\x3f\x9f\x48\x6a\x8e\x09\xc4\xb6\x05\xaf\x7d\x7c\x63\x5e\xd2\xc7\xd7\xb1\x4d\xe6\xcf\xfa\xfa\xb5\x72\x84\xf3\x62\xf2\x90\xa4\x06\x74\xe2\x04\xc0\xc1\x35\xf0\x67\x80\x60\x95\xf6\xde\xe8\xd5\x2f\x33\x4f\xaf\xe8\x12\x38\x7d\x72\xf2\xe9\x54\x92\x4c\x30\xc8\x4d\xfe\x51\x83\x57\xad\x2a\xd8\x83\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\xad\x3b\x4e\xd3\x00\x69\xde\x83\x67\x66\xc5\xfc\xbe\xa3\x2f\x1a\x94\x79\xb4\xe6\x1d\x2b\xa8\x71\xdd\x86\xb3\x4d\x4e\xce\x75\x2f\x8e\x45\xcf\x57\xb1\x20\xc6\x0e\xe2\x90\x3e\x8a\x06\xd3\x3d\x95\x5d\xe2\x8b\xdb\x0b\xef\xd0\xfa\x73\x80\xa7\x21\xfd\x20\xe2\x9c\xe1\x3e\x43\x9f\xfb\x92\x40\x57\x92\x93\x26\x74\x85\x16\x88\x83\x6b\x60\x02\x2b\x32\x47\x7b\xf8\x96\x90\x70\x8b\x82\xdc\xdc\xf0\xf7\x58\x6d\x9e\xcb\x37\xad\xa5\x22\x6e\x55\x7f\xa3\xf0\x45\xf9\xd4\xfa\x07\xda\xbd\x07\x70\x70\x0d\xf8\x1f\xd6\x2a\xcb\x3b\xa4\x98\x8c\x33\xe2\x2f\x48\x30\x56\x87\x7e\x7b\x65\xf4\xb9\xf0\x29\xbb\xe1\x07\xf6\xc3\xd6\xf1\xd7\xde\xb7\xa0\xee\xd9\x00\x0e\xae\x81\xea\xa1\x18\xb2\x85\x3c\x3c\x1a\x13\x2d\xff\xe1\xa5\x87\x2c\x7e\x26\x71\x4c\x0d\xf5\x97\x8e\xeb\x44\xce\x73\x13\xbf\x2f\x08\x13\x44\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\x4c\xd4\xe9\x46\xb8\x91\xdb\x95\x2e\xc4\xc1\x9a\x95\xa7\x21\x1d\x23\xf0\x70\x65\xdd\x47\x8c\x77\x1b\x37\x09\x93\x71\x2e\xa0\x10\x63\x69\x21\x7a\x07\x61\x2a\x41\x1c\xb2\x11\xce\xfb\xf3\x2a\xcd\x36\x4a\xf1\xf3\x21\x19\xff\xa6\xf0\x8c\xde\x03\xfe\xb5\xb1\x91\x9f\x55\x19\x54\x9e\xc2\x96\x8b\xbf\x06\x7d\x71\x10\x91\x41\x1c\xb2\x11\x16\x36\xad\x1f\xdd\x30\x26\x34\x34\x6b\x95\xb1\xff\xaa\xd2\x94\xb1\xf4\x7e\xad\xa1\x41\x78\x94\xe0\xe4\x19\xc3\x72\xfc\xc8\x20\x25\x22\x32\x88\xfb\x3f\x23\x8c\x82\xf6\x8f\xb2\x96\xff\xf5\x1e\xe1\xbc\x9b\x7c\x97\x44\x79\x62\x98\x5e\x50\xd9\x93\x15\xb8\xf9\x2c\x2a\x71\x28\x70\x7b\x72\x19\xdc\x5d\x8d\x77\xab\xbf\x4f\xab\xce\xfe\xb7\x11\xfe\x48\x8e\x17\xc5\x82\x1a\x6e\xa0\xc4\xf9\x08\x6b\xcf\x41\xe4\xa8\x55\x5a\x6a\x52\xa7\xe6\x26\xc7\x8b\xe4\xda\xe7\x3b\x8c\xd5\xef\xfe\x3e\x51\xfa\x2e\x32\x72\x27\x48\x45\xc0\x6a\x3a\xb9\x04\x93\x9b\x62\xde\xb8\x39\xf1\x25\xc1\x90\xd5\x47\xd2\xfa\xaa\x98\x2f\x7d\xde\x58\xff\x35\x23\x0c\x1a\xda\xdf\x35\xc2\x48\x46\xd8\xf8\x89\xdf\xfa\x7d\x93\xa6\xe8\xae\x72\xd3\x1d\xf3\xd8\xf9\xcb\x47\x8b\xee\x9a\xc1\x89\xae\x6c\xa4\x23\xc7\x4d\x17\x68\x78\xad\xcf\x64\xb3\x92\x0f\xc9\xa3\xfd\xf0\xdb\x55\x15\x64\x10\xd5\xc9\x8d\xf7\x76\xc8\xbb\x29\xd1\xf2\xe4\xfa\xcd\x4d\x5c\xe5\x5b\x0c\x2f\x16\x47\x53\xd6\x30\xdd\x4c\xcf\x64\x6b\x16\xd9\x08\x27\xc5\x8f\xcd\x2c\xb7\x1b\x5e\x0b\x44\xfb\xc3\x77\x1c\xb3\x7e\xf3\x20\x28\xd7\x42\x88\x66\x83\x0f\xe7\xe4\x76\x58\x8c\xef\xec\xa3\x33\x19\xad\x2e\xd2\xcf\xce\xd3\x34\x18\x7e\x14\xd5\x1b\xf6\x49\xa6\xe3\x57\xf7\x69\xf0\x4e\x9b\x51\x57\xc9\x6f\x0d\xe7\xcd\xd5\x56\xfc\xba\x7e\x88\x56\x73\x26\xa3\x45\x36\xc2\x5d\x19\x42\xe1\x2c\x0b\x84\x8b\x25\xf6\x6c\x75\x1f\x68\x24\x67\x9e\xfb\x7a\xa3\x36\x31\x9c\xc4\x24\x11\x53\x59\x8c\xf2\xbf\x3b\x3a\x33\x23\x0c\x12\xd1\x69\x99\xaf\x88\x7e\xeb\x9a\xed\xae\xe3\x51\xf3\xc7\xc1\xd2\xc9\xbb\xcf\x37\x8d\x0c\xf6\x5d\x2d\x2d\xaa\x56\x1d\xbe\x18\x78\x9a\x6f\x44\x9d\x20\x66\x7c\x10\x07\xcf\x7c\xef\x2d\x6a\x02\x8b\x03\x19\xbe\xa1\xaa\x3d\xd3\xb6\xa0\xb1\x9f\x53\x63\x0b\x23\x36\x18\xef\x7d\x3b\xe5\x4c\x18\x88\xa2\xfa\x10\x3a\x72\x0d\xe2\x90\xdb\xc5\x7e\xfb\x62\x47\x21\x7a\xf7\x0b\x45\xaf\xe7\x57\x11\x49\xff\x96\xb4\xcb\x17\x96\x06\x2e\x8f\x30\x24\xd5\x9b\x0c\x71\x58\x34\xfd\xff\xed\x62\xff\x9d\x43\xea\x66\x13\xdc\xb7\x8f\xad\xd4\x9e\x9d\x2e\x7d\x29\xd2\x58\x7e\x82\x9c\x5a\xf7\xea\xd3\x99\x99\xce\xd2\x45\x15\xea\x10\xa2\xd1\x3f\x73\x88\xb8\x20\xce\x47\x5c\xf4\x9f\xdb\x8c\xdb\xd5\x3c\x9f\x23\xf1\x96\x79\x44\xbb\xbe\x56\x7e\x4b\x55\xc8\x15\x16\xd5\x4b\xb4\x7c\x77\xb4\xfb\x4b\xa4\x29\x3f\xa7\x31\x01\x61\x84\x41\x1c\x54\x23\xfc\xef\x46\x18\xf4\x42\x9f\x26\x81\x2d\x0c\xb3\xf6\xa3\x67\x46\x77\xf2\x2e\x09\x70\x6c\x72\x85\xec\x3e\x74\xfd\xd4\x5c\x28\x56\x5a\xf8\x2d\x30\x26\xfe\x83\x61\x09\xd4\x31\x18\xc4\xc1\x25\x20\xeb\x1a\xe9\x36\x5b\x91\xa0\x3b\xcd\x5a\xe6\xfa\xa9\xfa\x5e\xc7\xcd\x3d\x99\x1f\xdc\x0b\x0f\x77\x94\xaf\xbe\x79\x33\x57\xb5\x41\x82\x88\x0b\xe2\xe0\x12\x98\x7c\x8f\x2b\xf5\xba\x39\x47\xd5\xf2\xf7\xcf\x07\xdf\x1f\x2d\x6c\xac\x45\xf4\xd6\x54\x4b\xde\x9e\x1b\xc6\x9d\xeb\x47\xad\x57\xd0\x43\xc4\x05\x71\x70\x09\xa4\xd1\x0a\x92\x85\xff\xe0\xcb\xa6\x2d\x9f\xb1\xe9\x23\x92\x12\x12\xf6\x72\x68\xd2\xee\x9d\x21\x0f\xf4\x34\x09\xcb\xfe\xe1\x03\x1d\x0a\x00\x71\x70\x09\xd8\x28\xcf\x59\x6e\x98\xb0\x5c\x23\xac\xf1\xf8\xad\x36\x87\xde\xa8\x57\x86\xd1\x29\xff\xe8\x9d\xba\x52\x8e\x80\x55\x3f\x73\x2a\x0e\x62\xf1\x03\xe2\xa0\xda\x40\xbe\x7f\x5f\x00\x83\x66\xd7\xd3\x34\x60\xb2\x9d\xb3\x20\xab\xf0\xad\xc9\x2a\x93\xe0\x1b\xa3\x18\x0f\xb9\x3d\x77\x02\x96\x1a\xf6\x48\x92\x86\x75\x0b\xc9\x68\x69\x11\xd4\xdb\x0e\xc4\xc1\x35\xe0\x7a\x35\x32\x91\x6e\x83\xe0\xe3\xf9\x5b\x3a\x22\x57\x88\x87\x82\xc9\x6f\xeb\xb3\x6b\xb6\x4a\x5d\xbc\xb0\x5a\xa3\xd0\xcc\x71\x08\x75\x77\x06\x71\x48\xd7\x89\xcb\x55\xc4\xa2\x79\xd8\x74\xed\x34\xba\x3d\xf4\x19\xbd\xe3\x30\xdc\xa2\xc7\xd8\x30\x10\xb3\x79\x8d\x2d\x3f\xac\x67\x7f\x8b\x18\x3a\xba\x08\xe0\xe0\x1a\xe0\xc6\xec\xca\x16\x8f\x66\xeb\xc7\x8d\x2b\xc1\x50\xec\x71\xff\x46\xbd\xfa\xf3\x76\xf3\xe4\x65\x92\x98\xa5\x14\xfc\xa5\x91\x90\x87\x88\xb8\x20\x0e\xae\x01\xdc\xc0\x3e\x26\xdc\xb2\xef\x2f\xf6\xcd\x6b\x93\x69\x75\x52\xcd\x9d\x3d\xb3\x03\xfe\xbc\x64\xc6\x58\xce\xf0\xc0\xae\x21\x59\x79\x06\x1d\x8b\x05\x70\x50\x6d\x20\xc0\x08\x83\x52\xdd\xa9\xf5\xa1\x5e\x51\x3a\x93\xd1\x5f\xfd\x4c\xa7\x8a\xca\xb1\x25\xb1\xe4\xae\x86\x51\x3d\x8c\x9a\xbe\xde\xe5\x49\xdc\x2e\x9c\x31\x97\x20\x04\xd5\x87\x02\x38\xb8\x06\x94\x03\xb2\xd0\x84\xb1\x2a\x0a\x3e\x67\x2b\x59\xf7\x4e\xbd\x3b\x40\x51\xdc\x95\xe2\x7c\xdd\x68\xae\xcc\xce\x97\xe3\xd2\xdf\xec\x02\x35\x60\x02\x70\x70\x0d\x50\xb1\x9e\x37\xaa\x62\xf0\xf3\x33\x08\xb2\xc5\xa8\xce\x73\xf7\xb9\x7d\x71\x87\x75\x48\x57\x48\xad\x9f\x8c\x6b\x61\xcb\x79\x6f\x09\xda\xb9\x05\x70\x70\x0d\x2c\x4e\xd2\x74\x5a\xa0\xa6\xf6\xb6\x61\xfc\x69\x34\x6e\xb3\x8c\x90\xbb\xc5\x3c\xad\x7d\xe5\xcd\x86\x9f\x83\xa0\xf9\x88\xd6\x09\x0d\x22\x2e\x88\x83\x6b\x80\x43\x5d\x9e\xb3\x88\x30\x76\x37\x45\x3a\x2c\x05\xbd\x79\x71\xc7\x31\xc2\x22\xac\xa0\xfc\x24\x17\x1d\xef\xf1\xce\x74\xb4\xc8\x2e\xd4\x39\x1c\xc0\x41\xf3\x80\xee\xbf\x6b\x00\xb4\xee\x38\x4d\x03\x21\x3e\xbe\x9f\x58\xfd\x2c\xeb\x36\xc5\x2e\xa6\x8a\x71\x9a\x55\x5b\xcc\xe5\x6b\x91\xf8\x6b\xbe\xe9\x93\x29\xb6\xa3\x3a\x34\x3a\x44\x8c\x1d\xc4\xc1\x35\xb0\xbe\x25\x44\xba\x79\x3b\x63\xae\x98\x4e\x92\x69\x5e\x62\x90\x7b\x3b\xd1\x8f\xd0\xb6\x2a\x80\xc2\x4d\xeb\xc0\x94\x7d\x93\x1b\x1b\xfa\x70\x05\xe0\xe0\x1a\x90\x62\x59\xe2\xca\x2b\x4a\xb4\xcc\xa8\x45\x7d\x51\x75\xd8\x9c\xb6\x8b\x52\x1d\x53\x83\xc6\xf7\xd4\x50\x30\x82\x2e\x74\x86\xf6\x22\x54\x7a\x01\xe0\xe0\x1a\x08\x8c\x16\x3b\x99\x1f\x42\x25\x98\x79\xdb\x54\x11\xff\x39\xa6\xd4\x7e\x9f\xf1\x9a\x12\xf6\xf0\xf2\xea\x56\xf6\xfd\x0e\x85\xf3\x99\x50\x4d\x33\x80\x83\x6b\x20\x2a\xf8\xf5\x7b\xc2\x73\x1c\xe9\x79\xac\x46\x7b\x43\x5c\x81\xcf\xde\x17\x8a\x5e\xd4\x93\xe0\x49\x71\x35\x89\x3e\xc7\x66\x4d\xf4\x02\xa1\x01\x10\x07\xcd\x03\x00\x23\x0c\x32\x51\xa7\x1b\xe1\x42\xec\x6b\x52\xde\xb6\xec\xe8\xfe\xfa\xcf\x3f\x6d\x15\x86\x94\x7f\xfd\x90\x54\x7e\x47\xe0\xcb\x8a\xcd\x5e\xc8\xfc\xcf\x5e\x23\xc8\x54\x82\x38\x64\x23\xec\x72\xa7\x44\x93\x73\x75\xa7\x93\x02\x9f\x85\xf0\x71\x84\x5d\xdc\x15\x5c\x73\xeb\xb0\x43\xbb\x2c\x55\xb5\x38\x7f\xda\x06\x97\xcf\x88\xc8\x20\x0e\xd9\x08\x63\xb1\x29\xad\x5c\x0c\x14\x1e\x13\x2a\x8a\xfd\xcc\xa2\x9e\xe1\xad\x10\xd7\x75\x7e\x49\x7e\x68\xbf\x9d\xfc\xfc\xf6\x6b\x4e\x67\x4c\xe8\xca\x27\x00\xf7\xff\x8c\xf0\x3f\x34\xf6\x3f\xdf\x23\xdc\x66\xfa\x34\xaf\x9c\x13\xe5\xc5\x93\x2f\xf2\x5f\xf0\x4b\x58\xa4\x54\xdf\x1a\xca\x65\xcc\x7f\xf5\x7f\x22\xa0\x54\x7e\xe5\x5e\xcb\xd0\xdf\x46\xd8\x3a\x3c\x24\x0e\xb3\x41\x27\xf8\x75\x11\xfa\xcb\xef\xe5\x79\xb2\xd9\x8b\x85\xb3\x7d\x86\xa4\xa2\xed\x01\x94\x76\x6f\xd2\xd7\xf9\xff\x42\x79\x8a\x99\x84\x13\x31\x2f\xca\x4c\x12\xdb\xc9\xa3\x53\xda\xa6\x0b\x30\x0c\xdf\x35\x21\x8d\xf1\x5d\x14\x5c\x7d\x8f\x4e\x51\xe6\xf5\x5f\x33\xc2\xa0\xa1\xfd\x5d\x23\x8c\x64\x84\xfb\xa4\x64\x68\xe3\xb0\xcd\x23\x32\xac\xe3\x69\xe5\xd4\xbf\x17\xc5\xfe\x22\x76\x55\x90\xc3\x2e\xf6\xbd\xd4\x7d\x8e\x0a\xcd\xe6\x4c\x8c\xb0\x28\xb2\x11\x5e\x70\xfc\xfa\xe4\xe3\xe0\xb5\x32\x2a\x0a\x37\x43\x6a\xdf\x71\x14\xcf\x6f\x87\x58\xa2\xdc\x6d\xca\x2f\xe7\x9a\x1e\x36\xa0\x51\xa2\x9d\xc9\xd6\x2c\xb2\x11\x7e\x86\x95\xfc\xca\x02\x37\xd5\xd7\x51\x62\x01\x7b\xb3\x96\x8e\xad\x8d\x96\x76\xd7\xbf\xa6\x5a\x55\x67\xde\x2e\x20\xbf\xa5\x7e\xe6\x4c\x46\x8b\x6c\x84\x7f\x97\x63\x75\x7a\x60\xee\x36\x94\x6d\xed\x91\xda\xd9\x1f\x37\x74\xa4\x15\x2c\x54\x78\x0f\x0b\x98\x7f\x66\x2b\x23\x77\x9d\x64\x39\x93\xd1\x22\x1b\xe1\xe0\xf0\x2b\x0e\x3d\x69\x6b\x7d\xa3\x2c\x68\x64\xd5\x2d\xf4\xed\x15\x35\x38\x7d\x33\x4f\x7e\xed\xd2\x7d\x8d\x49\x76\x9a\xff\x31\x75\x66\x46\x18\x24\xa2\xd3\x32\x1f\xe5\x88\xc5\xdc\x9d\xcf\x19\xb6\x9a\x3c\x43\xdb\x3f\x8e\xeb\xde\x84\x7b\x7e\x56\xbe\x4f\x39\x78\xb1\xc8\xa9\x5e\xee\xc5\x67\x14\x68\xdb\x0e\xc4\xc1\x33\x5f\x85\x37\x5d\xdd\xed\xd2\x9e\x6d\x45\x29\x31\xab\xe7\x8c\xbe\x69\x6e\x8c\x89\xc1\x9c\x02\xe4\x28\xbc\xc7\x78\xf7\xae\x10\x2a\xf7\x21\xe2\x82\x38\x78\xe6\xd3\x50\x0e\x19\xd6\xa0\x99\xb9\x88\xbe\x29\x3a\xaf\x63\x13\xb0\xce\xea\xec\xb7\x2c\x66\x66\xd5\x5b\xf7\x42\xe3\xae\xd6\xdb\x1f\xd0\xd6\x15\x88\x83\x67\x3e\x1b\xee\xa8\x96\x63\x7f\xf5\x47\xea\x9a\xa9\x76\x99\xb7\x3d\xa4\xe8\x68\x51\xa9\xc4\xaf\xa3\x2d\xb3\x18\xf3\xfe\xe2\xcc\x4c\x42\x87\xda\x44\x02\x38\x1f\x71\x14\x8c\xbf\xe3\x6e\x32\x79\xe0\x76\xc4\xc9\x3e\xeb\xc2\x41\x59\x39\x5a\x90\x51\xa3\x88\x9e\x73\xfd\xe3\x82\x3f\xbd\xf4\xf3\x15\x3e\xab\x8b\xa5\x09\xc2\x08\x83\x38\xa8\x46\xf8\xdf\x8d\x30\xe8\x85\x3e\x4d\x02\xb4\xde\x6d\xda\xdf\xa5\x9e\x1d\x99\xba\xb6\x0c\x54\x16\x8b\xdc\xeb\xdf\x70\x1b\x37\x9e\xc9\x97\x98\xbf\xca\x45\xd4\x5e\xa7\xc0\x89\x18\x3a\x88\x43\x6a\x92\x63\x15\xa8\x47\x11\xbf\x4a\xb1\x10\xa2\x34\x17\x97\x51\xcd\x2d\xfd\xa7\x70\x36\xb7\x50\xe9\x3b\xbe\x66\x2d\x7a\x12\xb6\x3a\x74\xd3\x15\x88\x83\x4b\xc0\xad\xcb\x80\x98\x2e\xf7\xd9\xd0\xaf\xe5\xe0\x9a\x79\xbb\x3b\xb2\xd8\xb4\x8b\x78\xfc\x75\xc6\xf6\xaf\xbc\x83\xfe\x9c\x04\xd5\xbb\x43\x47\xb9\x01\x1c\x5c\x02\x25\x56\x54\x15\xe7\x7b\x79\x8e\x1d\x6d\x65\x59\x6e\xe0\xc9\x4e\x16\xbf\x63\xe7\x63\x8b\x10\x90\xd7\xcf\x5d\x7e\x81\xdb\xfa\x8e\x00\x11\x17\xc4\xc1\x25\x80\xd9\x13\xe2\x53\x60\x5a\xbb\x8e\x79\xd9\x4f\x8b\x2d\x62\xd5\xfc\x91\x08\xeb\x98\xdd\xb0\xc8\xa8\x8c\x38\x17\x47\xd3\xa7\xb2\x11\xc4\xe2\x07\xc4\x41\xb5\x81\x00\x23\x0c\x9a\x5d\x4f\xd3\x80\x35\xfb\x4f\x2f\xc3\x97\xd4\x9e\x37\xb1\x17\xe7\x3b\xf9\x2a\x83\x9d\x02\xd9\xfd\x0a\x3e\x6e\x3d\x31\x43\xbf\xc9\x1c\x54\xbc\xad\x8a\x18\x3b\x88\x43\x6a\x10\x14\xcf\x77\xa5\x99\xe3\x68\x2b\xef\x42\x25\xca\x98\x3f\x05\x66\x58\xe2\xbb\x1f\x98\x8b\x44\xcc\x23\x52\x8c\x2f\x74\xb5\x75\xa1\x1a\x3e\x10\x07\xd7\x00\x6d\xff\x1a\x47\xf3\x1d\x72\x33\x9a\xb0\x8a\x98\x7d\x39\x94\xe6\xd1\xb8\xb6\x87\x09\xcc\xb7\xe7\x5c\x69\x29\xe9\x50\x0b\x13\xa0\x5e\x7c\x20\x0e\xae\x01\xeb\xdb\x87\x39\x39\x5d\xf3\x4f\x46\x7e\xa8\x5c\xcd\x3d\x8a\xdc\x67\xcb\xcf\x29\x6d\x16\x14\x8c\x78\x38\xf8\xa3\x43\x92\x2c\x07\xd2\x16\x88\x83\x6b\x20\xd9\x0f\xff\x93\x6b\x51\xcd\xcb\xb5\x62\x9d\xe0\xa6\xf0\xbb\x25\xad\x7c\x13\xc6\x3b\xc4\x0a\x59\xf9\xb3\x0b\x71\xd4\x83\x97\xa0\x66\x59\x20\x0e\xaa\x0d\x04\x18\x61\x50\xaa\x3b\x4d\x03\x55\x91\xbe\x4b\x9c\x63\x83\x3e\x55\x72\x2f\x98\x1c\xc4\x43\x98\xa8\xaf\xe1\x6c\xde\xc3\x9c\xf1\x6b\xc7\x23\x28\x65\xd6\x89\x87\x76\x58\x41\x1c\x5c\x03\xc3\x5d\x93\x12\x6c\x8f\xed\x77\x93\x44\xcc\x44\x59\xcb\x07\xbe\x2f\xbe\x53\x2b\x4d\x29\x7d\xef\xf5\xa4\xbd\x20\x22\xda\xce\x02\x9a\xb2\x41\x1c\x5c\x03\x36\x89\xd4\x83\x9c\xd8\xba\x95\x8f\x7e\x4d\x89\x14\x0d\x51\xd1\x53\xdd\x2f\xde\x5e\xfc\x9a\x62\x90\x15\x30\x72\x2b\x9c\x74\x56\x07\x9a\xb2\x01\x1c\x5c\x03\xb6\x03\xb7\xae\x39\xfa\x57\x34\x2c\x7c\x9c\xbb\xfb\xf6\x8f\x2f\xc1\xaf\x87\x3c\x6a\x2e\x2d\xd2\x17\x6f\x68\x31\xad\xda\x8d\x2f\x6e\x20\xe2\x82\x38\xb8\x06\x4a\xd5\xfd\x31\x9e\x45\xe3\xf1\x54\x4f\xe1\x46\x6b\xbd\xef\xaf\xbf\xb1\xd3\x1c\xf7\x3c\x33\x0b\x57\xa2\xc9\xc3\x67\xb4\xe7\xa2\x30\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\x4d\x03\xcc\x0b\xd9\xe9\xfb\x7b\x72\x64\x57\x8f\xdd\x57\x72\x67\x76\xbe\xcb\xc5\x4f\x5a\x63\xde\xf4\xae\xd3\x76\x2c\xb8\x1e\xd7\x95\x3e\x03\xed\xdc\x02\x38\xb8\x06\xc4\xa4\x3e\x32\x5a\x3c\xf8\x13\x43\x1c\x7b\xc9\xff\x71\x5e\x8b\xa0\x1f\x56\xee\x89\x1d\x5e\xdc\xd4\x9e\xe5\x9c\x7c\xbc\x4f\x23\xd4\xd7\x01\xc4\xc1\x35\xf0\xb5\x96\x88\x89\xf6\x5a\xab\xe6\x37\xac\xd5\xfa\x40\x7a\x15\x7d\x93\xe9\x89\x8e\xcf\x65\x2b\x9f\xb4\xeb\x64\xaa\xfb\x3a\x0c\xee\x21\xe2\x82\x38\xb8\x06\x62\xee\x5d\x7a\xe4\x59\x78\xb0\xe5\xf2\xdc\x34\x5a\x99\xa9\x75\x00\xa5\xd9\xe5\xea\x12\x35\xf9\x44\x2d\x71\xbc\x62\xc9\x78\xec\x26\x22\x2e\x88\x83\x6b\xe0\x7a\x1d\x45\xd8\xc8\xfd\xf8\x5a\xee\xe3\xb1\x7b\x41\x89\x62\xcc\xda\xe6\x13\x37\x4f\xde\xa7\x72\x9f\xe7\xa9\xff\xb9\xbb\xff\xd4\x05\xba\x47\x18\xc0\x41\xf3\x00\xc0\x08\x83\x4c\xd4\xe9\x46\xb8\xa2\x7a\x57\x89\x25\xc2\x94\x44\x1b\x73\xf9\x56\xb6\x93\x9e\xa2\x37\x85\xfc\xf2\xcf\xca\x20\xc7\xeb\xd7\x46\xf3\xf4\xd3\xf4\x38\x10\xa6\x12\xc4\x21\x1b\xe1\xaf\x06\x7d\x7b\x4f\x19\x6f\xaf\x17\xfa\x3d\xd3\x59\x47\x33\xca\x12\xef\xf3\x5d\x31\xfe\x3d\xc4\x93\x64\xd1\x37\xa0\xdf\xa3\xac\x8a\x88\x0c\xe2\x90\x8d\x70\x4c\xa7\xee\xfe\x42\x17\x45\xed\x8a\x40\x15\x4f\x01\x0d\x47\x80\x79\x1b\xca\x6b\xa2\x71\x9c\x81\xe3\xb5\xc1\x13\xf2\x01\xfd\x71\x44\x64\x10\xf7\xff\x8c\x30\xfd\xdf\x91\xff\xe7\x7b\x84\x0d\x63\x83\x34\xfb\x48\x5f\x5a\xa2\x13\xee\x8b\x09\xea\x2c\xec\x31\x7d\xef\x9d\xcb\x4b\x6b\x56\xb6\xc4\xd2\xb7\xc2\xb1\xe3\xe6\xfd\xdb\x08\x2b\x45\xbe\xa5\xdf\xa1\x6b\x45\x9f\x65\xb7\x55\xf2\xfe\x61\x20\x48\x38\xf0\x0e\x3d\x11\xcf\xf0\x0e\x3d\xee\x3e\x1d\x57\x46\xbc\xc5\x5f\xa8\xf4\x45\xf2\x63\xba\x5a\x2f\x81\x5d\x07\x6a\xaa\xeb\xf6\x71\xaa\x0e\x13\xe8\xbe\x28\xd6\xdb\xbf\xde\xce\x62\x11\x99\x25\x8d\xa4\xfd\xd7\x8c\x30\x68\x68\x7f\xd7\x08\xcb\x23\x35\x34\x8e\x76\xab\x90\x53\x26\xf3\x5a\x11\xbf\xf2\x33\x2b\x0f\x93\xf1\x73\xf8\x8c\x4d\x57\xe7\x0b\xee\xa2\xc3\x19\x83\xc2\xac\x82\x33\xb9\xd9\xc7\x13\xd9\x08\x4f\x56\x7d\x24\x0d\xcf\x58\x39\x10\xbe\xb5\xcc\x14\x5a\x94\x9c\xe3\x7c\xcd\x48\x5e\xd8\xc5\x25\x62\x99\xc7\x28\x5b\x26\x97\xd0\xe3\x4c\xb6\x66\x55\x90\x7e\xb6\x77\xaf\x66\x69\x82\x4b\xd9\x5d\xf6\x98\x71\xe8\x72\xd8\x9d\x01\x95\x73\x83\x46\x0d\xc4\x0f\xc2\x87\x9c\x24\x17\xad\xb1\x2a\x05\xce\x64\xb4\xc8\x46\x38\x35\xd2\x87\xa8\x9e\xd9\x03\x4b\x69\xfd\xd1\xdd\x28\x3f\xb6\xd1\xb5\x07\x9e\xf4\x21\x6b\x17\xde\xbe\x6e\xcf\x22\xab\x63\x89\x9c\x3e\x93\xd1\x3a\x21\xfd\xac\xdd\xc5\x4c\x85\xfb\x64\xb9\x1a\x17\x75\xb8\x5c\xf5\xde\x2c\x6f\x1e\xa3\x5a\x88\xcf\x3b\x5f\x33\xd0\xd8\x9d\xac\x67\xf1\x1d\x3d\x83\x8f\x1c\x3a\xff\x9b\x88\x4e\xcb\x7c\x2b\xf7\x12\xf6\xdc\x57\x77\xf2\xa7\x7c\x4a\x7b\xc9\x12\x38\x74\x13\x62\x74\xb5\xeb\xa5\x43\x7e\x77\x08\x57\xbf\x37\xd6\x4a\x80\x76\x42\x41\x1c\x52\x9b\x48\x2f\xc9\xb7\x38\xa5\x12\x75\xb7\xf6\x52\x32\x9e\x3c\xe5\x7b\x5e\xe7\xf2\x4b\xc7\x64\x93\x2d\x5e\x0c\xd5\x7d\xa0\x35\xb1\x1d\xea\x8e\x01\xe2\x90\x6a\x84\x79\xac\x1a\x57\x8c\x1c\x59\xbc\xa4\xe8\x8f\x04\x2f\xa9\x59\x97\x7c\xc6\x5a\x98\x4f\x9b\x7a\xad\xcb\xb6\xf9\xbc\x17\xff\x3d\xb4\xfa\x01\x71\xf0\xcc\xc7\xe5\x35\x41\xef\x13\xfb\x80\xe2\x31\x26\xed\x64\x68\xaf\x25\xca\x65\x99\xb5\xdf\x19\xc6\x8f\x34\x66\x5a\xcb\xcf\xdd\xe8\x7d\xbe\x8f\x88\x0b\xe2\x7c\xc4\x51\x44\xff\x8e\x1b\x7f\x8e\xc1\xcd\x37\xcc\xde\xf6\x52\xb7\xa1\xb2\x96\x5a\xc5\xa0\x68\x5c\xf9\x0d\xcd\x6e\x79\xca\xeb\x0d\x6f\xfd\x2d\x92\xfd\xb0\x11\x46\x18\xc4\x41\x35\xc2\xf2\xff\xba\xf8\x01\xbd\xd0\xa7\xde\xa0\xd5\xc9\xbb\xd3\x21\x5b\xf8\xf4\xab\xc8\x93\x1c\xad\x0f\x35\x45\x12\xdf\xfb\x64\xdc\x77\xfb\x32\xdc\x92\xbe\x69\x49\x7f\xf8\xf0\x0a\xaa\xb9\x05\x70\x48\xc7\xe1\xf0\xbf\x0f\xd9\xe5\x5d\x9c\x5b\xc3\xc5\x26\x37\x49\xca\x9f\x2e\xa3\x7d\x81\x5f\xa3\xa4\x30\xa7\x6a\xd3\xe4\xde\x59\xef\xf7\x06\x5a\x54\x01\x38\xb8\x04\xe4\x28\x2a\xd0\x3f\x94\x57\xe5\xdf\x20\xd0\xa0\x7c\x5b\x63\xdd\x3b\xbf\x89\xf7\x5e\x7f\x3a\xfb\xf1\x79\x89\xb2\xd4\xb7\x53\x8c\x50\x5f\x33\x10\x07\x97\xc0\x8f\x91\x2e\x6d\x22\x8a\x0c\x2f\x7e\xb3\x5b\x1d\x4f\x5d\x9f\xb7\xdc\x7a\x90\xed\x40\x24\xa6\xbb\xbd\xf9\x52\x8d\x47\x92\x35\x0f\x13\x11\x17\xc4\xc1\x25\xe0\xe6\xce\x38\x9b\x84\x1b\x6c\x15\x62\xb8\x23\x55\x53\xd3\x58\xbd\xa4\xfc\x48\x46\xe8\x9e\x25\x6d\x8c\xd0\x9e\x5d\xf8\xcd\xbb\x8d\x88\xc5\x0f\x88\x83\x6a\x03\x01\x46\x18\x34\xbb\x9e\xa6\x01\xcf\xd2\x1a\xef\x83\x02\x5a\xea\xf1\xa9\x13\x6a\xd2\x58\x61\x39\x07\xf4\xe5\x00\xbc\x91\xc1\x4a\x49\xb1\xcb\x93\x43\xbd\x14\xd0\x91\x60\x10\x07\xd7\x40\x38\x4f\xdb\x18\xfd\xc7\xd7\x77\x3e\xdd\xbe\xad\x67\x55\xaf\xe0\xc1\x2d\xf3\x40\xf5\x3d\xa7\x62\xff\xf6\xc3\x6c\x77\xbd\x46\x9d\x79\x44\x5c\x10\x07\xd7\x80\xb2\x29\x7d\x08\x71\x89\x06\xd3\x97\xbb\x18\x5f\x13\x5d\x05\xdd\xdd\x7d\xf0\xc8\x5c\x13\x77\x76\xee\x12\x49\xc7\x5c\xaf\x29\x32\x86\x76\x19\x01\x1c\x5c\x03\xf7\x23\x79\x3d\x63\xae\xf6\xe6\x6c\xf3\x07\xa6\xc9\xc7\x53\x47\x2b\xbe\xf6\xd2\x59\x54\x76\x13\x25\x6a\x0e\xca\xf8\x42\x9c\x02\xd5\x87\x82\x38\xb8\x06\x08\xd1\xd4\xb6\xc9\xee\x65\x79\xc5\x37\xa4\xc9\x5b\xab\x0b\x33\x6f\xc7\x1a\x85\xb1\x6b\x5f\x3a\xfc\x88\xf9\xcd\xeb\xb6\xbc\x09\x0d\x42\x03\x20\x0e\xaa\x0d\x54\xf9\x77\x0d\x80\x52\xdd\x69\x1a\xc0\xec\x0b\x62\xba\x34\xf2\xd5\xf8\xe1\x76\xaa\x0f\xc6\xa7\x3d\x3c\xe1\x87\xfc\x7e\xb5\xde\xb2\xe1\x1f\x2a\x9b\x93\x68\x4c\xe9\xa1\xee\xce\x20\x0e\xa9\x59\xd6\x15\x77\xd6\xe3\x01\x74\x2f\x8b\x78\xc1\x08\xc2\xfd\xcc\xaa\xcb\x1f\xa3\xd5\xc3\x2e\x7e\xea\x6a\x3c\x22\x9f\x37\x75\xb8\x07\xed\x08\x83\x38\xb8\x06\xd4\x08\xb1\x34\x17\x8f\x39\xe5\x9f\xfa\x5a\x5a\xd7\xfd\xae\xcc\x3e\x88\x94\xc1\xce\x5d\x59\x7c\x27\x55\x73\x7d\x62\xb5\x07\xd7\x09\x11\x17\xc4\xc1\x35\xb0\xcc\x80\x8f\x13\x42\xfc\xb2\x5d\x80\x2d\x8a\x21\xb7\x43\xf4\x23\x7e\xe6\x06\xe9\x33\x93\x9b\xef\x5a\xca\x2a\x9b\x53\xb2\x0e\xa1\x5d\x51\x10\x07\xd7\x80\xd6\x12\xe9\x4f\x7c\xfd\xe6\xca\x54\xb4\xfe\x11\x86\x0b\x93\x43\x0f\xa4\x2f\x98\xe7\xfb\x59\xde\x79\xf6\x52\x2a\x93\xea\x2a\xde\x30\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\x4d\x03\xf4\x99\xfd\x5c\x9f\x5b\x6e\xac\x96\xc6\x0a\x28\xbb\xa5\xfd\x24\x9e\xdd\x7b\x7c\xe1\x4b\xbd\x48\x1f\x41\x5b\xf7\xa7\x18\xf2\x40\x68\x6e\x05\x71\x70\x0d\xec\x79\x9a\xaa\x87\xce\xb5\xbb\x2a\xf5\xba\xfd\x0e\xbb\x28\xbd\xb1\x36\x76\xe7\x37\xc1\x77\x32\xdf\xab\x4f\xe2\x88\xbe\xdd\x10\x87\x0e\x72\x81\x38\xb8\x06\x96\x6d\x7f\x1d\xd1\x50\x30\x5f\xaa\xb7\x30\x20\x90\xc5\x10\xba\x51\xda\x51\x46\x4b\xb2\x63\xe0\x48\x2e\x27\xcf\xee\xfa\xd9\x0c\x3a\xc9\x02\xe2\xe0\x1a\x70\x8b\xe4\x58\x3b\x14\xdd\x9f\xf1\xe6\x46\x89\x70\xfc\x3c\x7a\x10\xdc\xcb\xac\x49\xd9\x84\xb5\xc5\xe6\xfa\x99\x3c\x6f\x2d\x18\xba\xfb\x1a\xc4\xc1\x35\x20\x6e\x47\x7f\x79\x77\xf3\x99\xc4\x1f\xd3\x03\x5a\x96\x5b\x28\xd2\x3d\x77\x85\x19\x3e\x0a\xeb\x8c\x07\x35\xe9\xa1\x1e\xee\x62\x8c\x21\x34\x00\xe2\xa0\x79\xc0\xe9\xdf\x8d\x30\xc8\x44\x9d\x6e\x84\x65\x4e\xf8\xdf\x7b\xaf\x5f\x41\x31\x9e\x99\xb4\x31\x0b\x89\xe1\xa6\xa6\x7a\x61\x91\x18\x56\xb3\x30\xa9\x95\xc7\x68\xef\x8c\x62\x85\x30\x95\x20\x0e\xd9\x08\x5b\xdc\xf6\x89\x88\xed\x30\xf1\xf8\x30\x65\xf6\x38\xd3\xc4\x40\x77\xb5\xa5\xd5\x32\x6c\xb9\xad\x68\x96\xca\x99\x7e\xeb\x82\x72\x22\x22\x32\x88\x43\x36\xc2\x5f\x5b\x70\x83\x56\xb4\x98\x44\x72\x07\x49\xee\xb6\xd2\xce\xe1\x17\x73\xbe\xb0\x7b\xf4\x32\xf2\x62\xe8\x45\x3c\xa7\x41\xfa\xc4\x68\xc8\x62\x03\xb8\xff\x67\x84\xff\x51\xd7\xfd\x3f\xdf\x23\x4c\x97\x47\x9a\x33\x22\xbd\x29\xc8\x60\x39\xc3\xf9\xde\xb5\xbd\x63\x56\x4e\x45\xf0\x49\x5b\xb8\x2e\x9d\xec\x38\xea\x7b\xca\x9f\x22\x7f\x1b\x61\x1a\xbd\x47\x27\x55\xa3\x8e\x6a\xe3\x4f\x0a\xc4\xfc\x7c\xc3\xf9\x5c\xf4\x82\xcf\x19\xf0\x75\x06\x69\x3f\x35\xb5\x5e\x0e\xc2\xf8\xf2\x17\xba\x8a\x6b\xef\xa8\xb0\x90\xcf\xfc\xf9\x71\xda\x2b\x21\xa9\xa6\x13\x5d\x69\xf5\x36\x36\x23\xae\x85\x76\x61\xbe\x49\x9f\x73\x39\x24\xff\x35\x23\x0c\x1a\xda\xdf\x35\xc2\x48\x46\x98\xb2\x39\x74\xdf\x34\xba\x24\xf9\xa3\x3e\x6a\x04\x57\x1f\x99\x0b\x77\xc0\x4b\x33\x56\x4a\x11\x33\x0d\xfa\xfa\x90\x4f\x6d\xf7\x64\xcf\x64\xb3\x12\xd9\x08\x3f\xe8\xf5\xfa\xfc\x7c\x5c\x79\x2c\x88\x13\x3d\x23\xde\x81\x9a\x73\x5d\x8a\x6a\xed\x72\x7f\xf4\x1a\xfb\xe6\x30\x41\x6d\x5b\x01\xee\x99\x6c\xcd\x22\x1b\xe1\xe9\xe5\x4a\x33\x21\x1f\x6b\x5e\x73\xbc\xb1\xee\xb7\x2d\x3b\x26\x62\xb7\x95\x25\x18\x6a\x93\xf0\x37\x3c\xee\x1a\xca\xe7\xc6\x9e\xc9\xf5\x49\x0d\xc8\x46\xb8\xe4\xee\x83\xc3\x73\xe6\xc3\x25\x44\xf1\x26\x91\xbf\x82\x76\xd2\x56\x55\x9d\x3c\x8c\x3e\x4f\x1f\x7e\xef\x33\x7f\x6d\xdf\x7c\x36\xd7\x27\x89\x22\x1b\xe1\xce\x6b\x5c\x96\xd9\x27\xaf\xd7\xd5\x9e\x05\x0a\x6e\xae\x8e\xbe\x5b\xe8\x48\x52\xd1\xd9\xcd\x25\x9c\x08\x1a\xe1\x5e\x9a\xfc\xea\x74\x66\x46\x18\x24\xa2\xd3\x32\x5f\x40\xd5\xde\xc3\x74\x85\x2f\xbb\x5f\x8b\x1a\x63\x15\x5f\xfe\x72\x64\x08\xde\xe8\x3a\xf9\x43\xd7\xe4\xe0\x98\x66\x9c\xfe\xf4\x13\xb4\xf2\x03\x71\xf0\xcc\xf7\x23\x21\x92\xdd\x39\xbe\x70\xd9\x7a\x1a\xbf\x6d\xe9\xbc\x4a\x56\x11\xf7\xf3\x29\x5b\x66\x7c\x2c\x91\x6b\x19\x1b\x27\xaa\x68\x50\x37\x1b\x10\x07\xcf\x7c\xf1\x27\x44\x69\xa3\x07\x0a\x77\x14\xa3\x69\xcc\x2a\x39\x51\xbe\x1d\x6f\x94\xb4\x86\x78\xa3\x52\xe6\x88\xa4\x28\x9b\xa4\x9b\x40\xdd\x6c\x40\x9c\x8f\x38\xe1\x3f\x9b\x65\x15\x8e\x0e\x98\x3a\x3a\x7d\x54\xbb\xfc\xe7\x5a\xe3\xb2\xe9\xd8\x8d\xa0\xec\x09\xea\x8d\x07\x0f\x26\xcd\x19\xd5\xee\x90\x7c\x87\x32\x1f\x88\x83\x3f\xdf\xda\x1c\xdb\x49\x5f\xab\xa2\x02\x9a\xe5\x5e\xe7\xcf\xbf\x22\x97\x89\x14\x1f\x1f\x37\x8d\x4e\x9a\xde\xdb\xfe\xf9\xeb\x69\x1a\xbb\x15\xc2\x08\x83\x38\xa8\x46\xf8\xdf\x8d\x30\xe8\x85\x3e\x4d\x02\x8d\x5f\x76\x52\x30\x7f\xf5\xdf\xdd\xc6\x68\xcf\xa1\x54\x68\x23\xe7\xad\x5e\x0d\x1a\x97\x15\x8b\xdc\xdf\xcd\xba\x49\xbd\x6d\x06\x75\x8b\x05\x71\x70\x09\x2c\xa6\x57\x13\xfd\x28\xfd\x55\xe1\x71\xb2\x35\xe8\xc9\xf7\x29\x62\x9c\xf7\xce\xe7\xbb\x29\x02\xf5\xe9\x3b\xcb\x0e\x4e\x43\x95\x94\xd0\x11\x43\x00\x07\x97\x80\xeb\x8e\xe1\x76\x65\x22\x71\x86\x4f\x42\x1b\x59\x72\xc8\xbc\xfb\xc7\x23\x19\x8b\xc0\xb4\xe3\xaa\x52\x71\x81\x12\xc3\x03\x61\xe8\xb0\x01\x88\x83\x4b\x60\xbc\xa8\xe2\x42\x53\x59\xa4\xd1\xe3\x60\x05\x6e\xf3\xdc\x6b\xef\xd8\x3b\x2f\x2b\x3d\x89\x36\xbd\x2e\xfd\x94\x8c\xa8\x99\xca\x82\x03\x11\x17\xc4\xc1\x9f\x2f\xc3\x38\x1b\x2b\x6f\xdf\xc7\xcc\x47\x62\x01\xdc\x87\xac\x9b\x2c\x76\x63\x2d\x47\x2d\xd9\x5d\xee\x91\x0c\xbf\xc2\x7c\x1d\xb1\xd0\x10\x8b\x1f\x10\x07\xd5\x06\x02\x8c\x30\x68\x76\x3d\x4d\x03\x9f\x6b\xea\x2a\x49\xd0\x62\xa2\x98\xcc\xda\xc5\x52\x29\xe7\x15\x73\xe8\xdf\x30\x3a\xe7\x61\x90\xc8\x74\xcc\x5d\x92\x94\x36\xcc\x40\x8c\x1d\xc4\x21\x35\xcb\xf2\xec\x76\xa8\xc2\xce\xb1\xc2\xab\x78\xc4\xd9\x32\x91\xa1\xce\x37\x6d\x8b\x75\x3c\x37\x89\xfe\x60\x9e\xa6\x96\xe6\xce\xea\x53\xa8\x59\x16\x80\x83\x6b\x80\xbf\x6b\x30\x74\x51\xab\xdd\x51\x65\x96\x71\xdb\xb9\x8c\xad\x93\xb0\x84\xfa\xcb\x91\xde\x89\xb4\x8d\x23\x99\xc6\x54\x5d\x22\x74\xe5\x17\x88\x83\x6b\x60\x5d\xdc\xfe\xa4\x7a\x42\xbf\xe2\xbd\xd8\xe6\x5c\xa0\xe0\x3c\xda\xd8\x4f\xed\x22\xb6\xe0\xcd\xc5\xdf\x6c\x78\x9c\x49\xed\x4a\xd0\xfd\xa1\x20\x0e\xfe\x7c\x27\xeb\xb9\xbd\x9c\xac\x88\x8b\x4b\x96\xc7\xd6\x70\x2e\xd4\x26\x7a\x32\xf4\x6f\x74\xa7\xf2\xb9\x12\x2d\x16\x2e\x89\x93\x74\x2f\x20\x34\x00\xe2\xa0\xda\x40\x80\x11\x06\xa5\xba\x53\x3b\x87\x2f\xdf\xad\x4a\xb0\xba\x6b\xbd\x96\x90\x89\xb7\x80\xfa\xa2\x30\xec\xc3\x4b\xce\x8d\x51\x21\xb6\xae\x17\x87\x1d\x01\xb6\xe9\xd5\xd0\xff\x0a\xc0\xc1\x35\x10\x11\xa8\xdd\x30\xbd\xd0\x92\x95\x22\xe0\x36\x37\xfe\xf5\x7a\xd1\x75\xd3\x94\x82\x28\xd3\x4f\x93\xd2\x7c\x5d\x3c\x7c\xa3\xcb\x0d\x88\xb8\x20\x0e\x49\x03\x14\xf3\xae\x5a\xcf\x36\x1a\xee\xbe\x9c\x16\xe5\x9a\xba\x3c\x97\xc8\x71\xff\x96\x92\x65\x2f\x67\x6a\xe1\xcf\x62\x7f\x96\xe4\x6f\x90\x06\x00\x1c\x5c\x03\x05\x1e\x91\x37\x8b\x4c\x2f\x5d\xf8\xfd\xc0\xfb\xd7\xee\x27\x91\xfa\xcf\x6f\x50\xd4\x5e\x26\x62\x8e\x3f\xbe\x48\x46\x92\x35\xb8\xb4\x80\x88\x0b\xe2\xe0\xcf\x37\xcf\x6d\xa6\xaa\xd4\x42\x69\xe7\x91\x9e\x82\xda\xcd\xdc\xc8\x15\xe5\x8d\xe9\xbe\x2b\xef\xab\x6d\x2f\x38\x8b\x1f\xd6\x96\x5e\x0f\x45\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\xd6\x1d\xa7\x69\x00\x2d\x9f\x72\xaa\xbb\xc6\xc9\xa6\xc5\xe3\x2e\x73\xe7\xe8\xf2\xb6\x23\x9d\x7e\xe8\xa8\x2d\xd3\x74\xbf\x5c\xb6\x40\xc1\x79\x47\xe8\x08\x33\x88\x83\x6b\x80\xf1\x56\xba\xe9\xbd\x47\x3b\xcf\x93\x1f\xdf\xcb\xa4\x21\x9f\x72\x24\x10\x6c\x9e\x8a\x7d\xcc\x3d\x56\x4c\x29\x6f\xc1\x24\x60\x08\xbd\xaf\x20\x0e\xae\x01\x0e\x9d\x18\xc5\x5e\x6c\x93\x11\xc3\xd1\xec\xe2\xf3\xb5\xaa\x11\xac\x27\xbb\xc6\x57\xc2\x2f\x9d\xdf\x66\x89\x6f\x54\x5b\x4b\x4f\x46\xc4\x05\x71\x70\x0d\x1c\xd3\xea\x74\x34\xf3\xa9\x3c\xa7\x60\xa6\xb6\x78\xd1\x90\x7b\x6f\x94\xf4\x93\x29\xa6\x1e\x6b\x12\xfe\x38\x23\x6e\x0a\xf6\x1e\xb4\x1c\x00\x71\xf0\xe7\x9b\x1a\x97\xc8\xf0\xfa\xb0\x76\x5d\x4a\xab\xc4\x35\x8d\x21\x75\x77\x34\xaa\xe0\x93\x28\x6d\x92\x90\x95\xf3\x07\xac\x2f\xe2\x79\x94\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\x90\x89\x3a\xdd\x08\x1f\x91\xac\x61\x08\xc4\x15\xe6\xe6\xb0\x4e\x53\x9a\x09\x5f\x5a\x20\x9f\x43\x23\xf1\x4f\xd1\xb7\xf4\xc1\x3b\xb7\xca\xa7\x40\x3d\x03\xdd\xc9\x0b\xe0\x90\x8d\xf0\x09\xda\xdb\x2b\xa8\x46\x0c\x22\xfe\x3c\x8d\xbc\xd7\x55\x64\x1b\x27\xec\x99\xe4\x6d\x55\xab\xda\xa8\x5b\xd1\xcb\x7d\x5b\x47\x3b\x11\x91\x41\x9c\x8f\x24\x0a\xfd\x3f\x23\x7b\xe3\xf8\x13\xb3\xe7\xcc\x5e\xdb\x10\xd2\x8b\xbd\xd9\x43\xd6\x29\x6a\xc8\x39\xf1\x3b\xd9\x41\x54\x9e\xf9\xce\x85\xa7\xdb\xfc\x44\x88\xc8\x20\xce\x47\x12\x15\xf6\x34\xfe\xe7\x7b\x84\x27\x33\x0e\xf8\x62\xed\xe9\x33\x2f\xf7\xd7\xae\x8c\x33\x3b\x48\xf3\x64\xb7\xb5\xac\x47\x2c\xaa\xf9\x7a\x9c\xe4\xa7\xae\x4f\x08\xfc\x6d\x84\xf3\xd5\x7d\xba\xdc\xf3\xd7\x5e\xd8\xf3\xf3\x2e\xbb\xca\x38\x4d\x4b\x3c\xb6\x66\xb6\xf8\x95\x42\x57\x61\x5e\x55\xf7\xc3\xcc\xd8\xf1\x2f\x74\x60\x4d\xec\xba\x5c\xf0\xad\xcf\x12\x8a\xdd\xb8\xcb\xa5\xb7\x34\xe9\xe7\x59\xda\x1a\xfa\x93\xef\x70\x63\x32\x48\x37\x65\xae\x1a\xfc\xd7\x8c\x30\x68\x68\x7f\xd7\x08\x23\x19\xe1\x3f\xf6\x9d\x87\x7f\xee\xaa\x8e\x5e\x70\x88\x6e\x5b\xce\xa0\x1c\xdd\xab\x7e\x2d\x21\x9b\x73\x21\xe6\x93\xe6\x55\x3b\x9e\xef\x73\x2e\x67\xb2\x59\x79\x13\xc9\xa3\xd5\x5d\xd0\xbf\x35\x37\x19\xd9\x59\x7b\xc5\x98\xf9\xd3\xdc\x3a\x0a\x7e\x47\x08\xf9\x50\xe1\xc9\x1a\xfb\x9f\x51\x77\xcd\xf7\x69\x26\x67\xb2\x35\x8b\x6c\x84\x5b\x8d\x22\xda\x3e\x3f\x49\xcb\x55\x9f\x90\x15\xfa\x36\x43\xaa\xba\xcd\x6d\x31\xe4\x76\xfb\xa9\x72\x76\x76\x85\xa9\xb4\x85\x4d\xd0\x99\x8c\x56\x0f\xe9\x67\x51\xdc\x42\x0d\x6f\x4f\xfa\x52\xa6\xff\x16\xe4\x49\xb9\xe0\x9b\x43\x8c\xde\xf2\xf6\x9a\x64\xa5\xde\x60\xf0\x53\x35\x7a\x8d\xa4\xba\x33\x19\x2d\xb2\x11\x8e\x08\xc1\xd7\x18\x95\x29\x12\xe5\x18\x26\x64\x26\xe8\x12\x60\xfa\xac\xa9\xac\x56\xe5\xb2\x66\xff\xb3\xb8\x99\x54\xe9\x71\xf4\x19\x7c\xe4\xd0\xf9\xdf\x44\x74\x5a\xe6\xab\xee\x9b\xeb\x20\xb1\xcc\x23\xf9\x48\x2c\x55\x22\x80\xb2\x7f\xf8\x10\x75\x3f\x9e\xfe\x15\x6a\x05\xa9\xe6\xac\x90\x32\xde\xac\x3a\x62\xc6\x07\x71\xf0\xcc\xb7\x90\x85\xf9\x2b\x7d\x42\x48\x66\x9d\x4d\x48\xc0\xa4\x2f\xd8\x4b\x1a\x57\xa3\x56\x9d\xba\xed\x1e\xff\xcb\xb4\x49\x4a\x42\x0b\x3e\x44\x5c\x10\x07\xcf\x7c\x91\xca\x6b\x5a\x56\xf1\x4f\x71\x73\x70\xda\x8d\xfb\xed\x32\x68\xff\x14\x63\xaa\x5a\xb5\x68\xa3\x67\x89\x7a\xe1\xdf\x88\xde\x84\x8a\x77\x40\x1c\x3c\xf3\x4d\x7c\x59\x73\x8a\xe9\xcd\x6e\x1b\x1f\x46\xe7\x4c\x0e\xb8\x4a\xfb\xbd\x4d\x37\xdd\x53\xe4\x63\x02\xad\x1f\x16\xd3\x93\xf6\x76\x54\xa8\xeb\x06\x80\xf3\x11\xff\x67\xef\x7d\xf1\x67\x7f\x12\xde\xce\xdc\xb6\x17\x72\x79\xa6\xf0\xe4\x9d\x47\x51\xfe\xb4\xc3\x79\x0b\x21\xdb\xcf\x95\xa8\xbf\xd9\x34\xa9\x6a\x59\x10\x46\x18\xc4\x41\x35\xc2\xff\x6e\x84\x41\x2f\xf4\x69\x12\x20\x26\xe0\xf6\x9f\x43\xe9\x4d\x7d\x18\xb4\x68\x16\x14\x69\x44\xcc\x25\xe8\x6e\x18\xe2\x2c\x28\xf0\xd0\x41\xb4\xc0\xf7\xca\x2f\xa8\x71\x38\x88\x83\x4b\x20\x57\x25\xc5\x4b\x52\xaa\xec\x0a\x8b\xf5\xf5\xb5\x9f\x04\xbb\xaf\x2f\xb3\x50\x1f\x4a\xcd\xb5\x12\xc7\xbd\x3a\xe9\xcd\x35\x56\x82\xba\x30\x83\x38\xb8\x04\x5e\xd8\x31\xa2\xcb\xc4\x76\xcf\x57\xd6\x09\x4c\x3d\x2d\x2c\xc0\x2a\x63\x08\x78\x7f\xdd\xc1\xda\xd7\xd8\xf0\xf0\xc6\x22\x4b\x5a\x3f\x22\x2e\x88\x83\x4b\x20\x89\xdd\x54\x7a\xf5\x19\x2b\xd5\x63\x95\x19\xc5\x77\x3f\x1a\x0d\x1e\x92\x3f\xbf\xea\xf3\xbd\x3f\x33\x35\x80\x84\x30\x99\x69\x10\xda\xb5\x00\x71\x70\x09\x84\xd5\xbb\xbf\xb5\xe7\x6f\x12\xac\x60\x7e\x7b\x4e\x36\xad\x22\x82\xf0\x95\x55\x4d\x59\x4d\x36\x9b\x80\xd0\xbb\x90\xa1\x17\x2a\xd0\x3d\xc2\x20\x0e\xaa\x0d\xbc\xf9\xef\x0b\x60\xd0\xec\x7a\x9a\x06\xe6\x0e\xd4\x7b\x2c\x8c\xcd\xa8\x3d\xbe\x44\x0b\x17\x4b\x61\x8f\x58\x57\x7d\x74\x7e\x7c\x8d\xb3\xa2\x88\x25\xe4\xc4\x52\xc7\x74\x17\xea\xea\x0a\xe0\x90\xea\x43\xf1\x66\x98\xf4\x37\x38\xcd\xbb\x0b\xa6\x31\xef\xba\x3f\x1e\x79\xd3\x2d\xe6\xf2\x6e\xc7\x30\xd6\x5e\x2d\x53\x8f\x6b\x8e\xff\x0a\xb4\x73\x0b\xe0\xe0\x1a\x38\xc4\x62\xb2\x2a\x17\x52\x2e\x2c\xa5\xfb\xf5\xcc\xce\xae\xf4\x48\xda\x9f\x0f\xf7\x01\xb1\xf0\x23\xca\x06\x4c\xb4\x1b\x83\xe5\x50\x6f\x3b\x10\x07\xd7\x80\xb3\xc7\x34\x3d\x61\xc1\x78\xba\x95\xc4\x24\x47\x24\x8a\x76\x64\x5e\x36\x8e\x6f\x49\x89\xfb\x30\x6e\xcc\x70\x26\x41\x04\x1e\xb4\x7b\x09\xe2\xe0\x1a\x28\x5c\xdd\x13\x13\x76\x30\xe0\x37\x6c\x40\xc5\x10\x24\xa7\x9a\x55\x48\xe4\x1f\xbc\x24\xf8\xc2\x1a\xed\xcd\x50\xba\xef\x7e\x22\xd4\x2c\x0b\xc4\x41\xb5\x81\x00\x23\x0c\x4a\x75\xa7\x69\xc0\xec\xd6\xcc\xef\x64\x49\xf9\xb8\x74\x5b\xaf\xd2\xcd\xd8\x29\x45\xcf\xb6\xb7\xc1\x1a\x2a\x91\xf2\x6a\x51\x07\x84\x16\x52\xe5\x01\x88\xb1\x83\x38\xb8\x06\xd2\x42\xd5\xf9\xae\x27\x4b\x1c\x7c\x78\x4f\x90\x2c\x2c\xf9\x9d\xdf\x2c\x4b\xfe\x8a\x9a\x2b\x36\x8f\xd4\xfa\xa7\xdf\x81\x5b\xda\x50\x07\x5e\x10\x07\xd7\x80\x35\xe9\x82\x2c\xd5\xd0\x8f\xf8\x9f\x6e\x22\x7e\xd2\x4f\x04\x49\x74\x47\xf4\xd6\xae\xa4\xb4\x9d\x0f\xf6\x78\xe4\xbf\x72\xf4\x0e\xea\x74\x0e\xe2\xe0\x1a\x28\xae\xbc\x68\x79\xf2\xec\x59\x68\x42\x2e\x07\x47\xe1\x86\x93\x6b\x57\x5a\xba\xa8\x0a\xb3\xcb\xab\xed\xba\xfb\xed\x42\x97\x42\xa0\x8f\x42\x20\x0e\xae\x81\x54\x03\x95\xe3\xcb\xdd\x33\x2b\x93\xbc\xc9\x65\x5f\xbf\x7e\x19\x38\xde\xe2\x5c\x97\x57\xda\xc7\xb0\xfe\x13\x4d\xf0\xd4\xf4\x40\x03\x32\x41\x00\x0e\x9a\x07\xf4\xfe\x5d\x03\xa0\x75\xc7\xa9\x57\x68\xc9\xc6\x9b\xa3\xba\x3e\xb9\x95\x68\xfc\xa6\xee\x7b\x12\x16\xe7\x6d\xf1\xb7\xdd\x6f\x9d\x0e\x95\x7b\x37\x17\x6b\xf4\x35\x03\xa0\x7b\x84\x41\x1c\x5c\x03\x2f\x30\x0f\xf8\xc5\xd3\x44\x05\xb1\x7e\x57\x38\x79\xf4\xed\x10\x19\xbc\xde\x3c\xdf\x48\x7d\x90\x7a\x05\xf3\x53\xd6\x55\x23\x3d\xe8\xba\x33\x10\x87\x74\x9f\x38\x41\xf3\x27\x8d\xb2\x08\x16\x94\xa3\xa1\xd7\x4a\x64\xab\x61\xe7\x4f\x7c\x2e\x4b\xd3\x68\x17\xa6\x6c\x3c\x4f\x97\x13\xcf\x60\x43\xc4\x05\x71\x70\x0d\x24\xde\x26\x77\xc9\x1b\xe3\xbf\x34\x5e\x34\x4c\xd9\xcf\xc3\x9f\xcc\x64\x37\x1b\x7d\x40\xc0\x6c\xb7\x68\x34\x23\xf4\xb5\xe0\x33\x37\x22\x2e\x88\x83\x6b\xa0\x8b\x79\xbe\x64\x97\xe1\x7b\xc2\x39\x97\x2b\x5c\x23\x91\xe3\x8e\xba\x86\x33\x19\xf8\x6f\x42\x34\x23\x6a\xb7\x24\x2c\xf5\xa3\xe3\x11\x1a\x00\x71\xd0\x3c\x00\x30\xc2\x20\x13\x75\xba\x11\x66\x30\x5a\x4a\xf0\xda\xab\xd9\x10\x7e\xa3\x19\xb0\x27\xef\xf0\x21\xbf\xba\x62\x7f\x6f\x64\x43\x9e\x7a\x94\x34\x6c\x43\x27\x59\x05\x61\x2a\x41\x1c\xb2\x11\xb6\x0e\xfc\x46\x1a\x25\xfc\x6a\xc2\x3f\x86\x5d\x22\x27\xe3\x31\x7e\xb4\x5b\x52\x4b\x57\xf8\x55\x7f\x83\xf5\x8d\x8b\xb4\xad\x56\x2d\x88\xc8\x20\x0e\xd9\x08\x6b\x1e\x99\x12\x2e\xbd\x6b\x69\x5f\x09\x56\xc2\xe1\x69\x5b\x49\xf9\x38\x47\xe8\xf7\x46\xb4\xbc\xc7\x98\x72\x53\x71\xfd\x68\x72\x0e\x11\x19\xc4\xf9\x48\x62\xc0\x9e\xc6\xff\x7c\x8f\x70\xa6\x11\xc9\x4d\x9d\x4b\x57\x35\xbb\xe7\x05\x44\xb6\x30\xb9\x57\x77\x39\x1c\x5d\xbf\xc8\xfe\x18\x4f\x26\x1d\xb2\x6f\x1a\xbb\xda\xf8\xb7\xaf\xf1\x19\x93\xa9\x95\x0b\x61\xdd\x4f\x11\x25\x37\x4c\x22\x8a\x8c\xc0\x7e\x6c\x5a\xb6\x87\x4a\x2c\x3f\xfc\xc8\xa1\xc3\x47\x9f\xa5\xe2\x2f\xf4\xb6\xcc\x6e\x65\x15\x5b\x5a\x87\xef\x8d\xc3\x46\xc3\x1f\xdb\x92\xaa\xbd\xf3\xef\x3a\xc2\x3d\x5f\x28\x1c\x56\xad\x05\xd9\xb4\x08\xfe\xd7\x8c\x30\x68\x68\x7f\xd7\x08\x23\x19\xe1\xa8\xda\x62\x6e\xb7\xe5\x71\x77\xf9\xa6\x5b\x13\xae\x34\x04\x78\x3f\x0f\xeb\x93\x7d\x6a\x55\x64\x37\x56\x0b\xad\xdf\x32\xcf\x39\x9c\xc9\x66\x25\xb2\x11\xa6\x8e\xba\xb1\x54\xbb\xb5\x74\x93\x51\x21\xc9\x33\xff\xfb\xdd\xa7\xf4\x97\x88\xbd\xe8\x6f\x17\x96\x1f\x04\x2b\x91\x3f\xd0\x7a\xb6\x7e\x26\x5b\xb3\xc8\x46\x58\xfa\xfd\x35\xcd\xe9\x31\x6f\x61\x9b\x4b\x4f\xca\x24\x3f\xde\xf2\xc0\xfc\xc1\xc5\xac\x95\x73\xf5\x79\x37\xba\x01\xb1\x97\x57\x63\xea\x99\x8c\x16\xd9\x08\xcf\xf3\x5e\xb4\xc9\x8b\x31\x78\x13\x33\xe8\x7a\x8f\x2c\xc1\x28\xe1\x4b\x35\x5e\x6d\xb1\x22\xa7\xbf\x5f\x9d\x10\x0d\xc1\x05\xc1\xb3\x69\x56\x8d\x6c\x84\xbd\x2d\xb1\xf1\x0a\x50\xf4\x1e\x5f\x7d\x95\x7e\x30\xe3\xfd\x81\x51\x8d\x98\xe3\x5e\x70\xea\xb1\xaf\x33\x5b\x44\x78\x5e\xb2\xb0\xe0\x99\x19\x61\x90\x88\x4e\xcb\x7c\xd1\x1e\x9d\xfe\x4f\xe4\x7f\x3e\x3e\x2f\x7b\x2e\xe8\xb1\xf8\x86\x31\xb3\x8f\x0a\xe9\xbb\xdb\x95\xc9\x13\x03\xa4\x6a\xc4\xb7\xfd\xa1\x6e\x13\x20\x0e\xe9\x2c\x54\xa0\xfc\xd7\xc8\xfe\xc4\x17\x0f\x3e\x35\x94\x72\x77\x0f\x9e\x53\xc0\xb4\xcd\xcc\x10\xed\x50\xa2\x10\x5d\x25\x8b\xe7\x12\x82\x3a\x0f\x81\x38\x78\xe6\xb3\xdb\x15\xb5\x1d\xec\xec\xff\x2d\x9a\xc5\xef\x86\xab\x69\xbb\xfb\x64\x6d\x4d\xd8\xce\x3b\x27\x75\x9d\xc8\x72\x84\x09\xdb\xc3\x02\x11\x17\xc4\xc1\x33\x9f\xfd\x15\x81\xee\xe7\x86\x31\xe6\x01\xaf\x30\xdc\x4a\x74\x67\x84\x48\x83\x29\x36\x51\xdf\x19\x58\x0b\xab\x56\x7f\x7f\xf8\xfa\x37\x74\x83\x3e\x88\xf3\x11\xff\x67\xcb\x41\x0f\x8e\x65\x49\x9a\x31\x63\xc2\x71\xfa\x70\x53\x9e\x66\x39\xe9\x5f\x61\x11\x7f\xf2\xd7\x7d\xf4\x52\x9f\x13\x36\x33\xd4\x51\x85\x21\x8c\x30\x88\x83\x6a\x84\xff\xdd\x08\x83\x5e\xe8\x53\x6f\xd0\x8a\x7f\xca\xbc\xc7\x3c\xc1\x33\x21\xbb\xa8\x34\x30\x56\xf3\xce\x2a\xbf\x2f\xda\x12\xad\x05\x2f\x59\x22\x44\x26\xd4\x77\x01\xda\x09\x02\x71\x70\x09\x84\x74\xb4\x36\x16\xd6\xbf\x98\x72\xf1\x11\x59\x0d\x79\x4a\x81\x7d\xcf\xdd\xd2\x94\x90\x4f\xf9\xca\xf5\xcb\x1f\x88\x04\x30\x9f\xb3\x42\x8d\x57\x00\x1c\x5c\x02\x32\x75\x1e\x49\xef\x98\xeb\xb7\x97\x29\xbf\xd5\xf0\xcb\xfe\x91\x0b\xd0\x22\xb9\xf4\x9a\x96\x8c\x5a\x38\x1a\x93\x32\xa1\x7e\x1d\x3a\x72\x0d\xe2\xe0\x12\x18\x4e\xc3\x21\xab\x57\xdf\xf0\xba\xd6\x3d\xde\x79\x29\xc0\x61\xe3\x57\x33\x7f\x42\xcc\x20\x06\x73\x96\x92\xa2\x5d\xf2\xcc\x39\xa8\x4c\x1c\xc4\xc1\x25\x90\x94\xbf\x10\x31\x92\xa2\xd6\x2c\x4f\xb9\x5c\x1c\xd9\x9c\xb7\x34\x6c\x31\x97\x99\x47\x73\xf3\xd1\xf9\x69\x8f\xb2\x69\xa6\x01\x5e\xc4\xe2\x07\xc4\x41\xb5\x81\x00\x23\x0c\x9a\x5d\x4f\xd3\xc0\x92\xfb\x27\x5b\xb7\x86\xfd\xed\xf0\x41\x26\xad\x4b\x72\x6f\x95\x1c\xe8\xf3\xf4\xa7\xb0\xd9\x5a\xe7\x22\x8d\x69\x65\xa3\xbd\xa0\xdb\xce\x40\x1c\x5c\x03\xcf\xba\xea\x6c\xe9\x9b\x8f\x7f\xcc\xd0\x0c\x29\xd5\x78\xc5\x05\x39\xac\x8e\xfe\xf2\xe2\xc0\x88\x13\x26\x49\x60\xcf\x23\xa3\x86\x6a\x6e\x41\x1c\x5c\x03\xcd\xdc\xdd\xd3\xb1\x51\xbe\x2c\xc3\x74\x6c\xb8\xea\xef\x04\xfc\xdf\xb4\xe3\xdc\xa5\xab\x13\x89\x7b\x83\x52\x3a\x53\x63\xfe\x00\x32\xac\x20\x0e\xae\x81\x34\xe2\x4d\x5e\xc5\xad\x8a\x46\xb1\x00\x21\xc6\x24\x61\x2d\xba\xf7\xa2\xa4\xf1\x1f\x1a\x3b\xe4\x9e\x8f\x0f\xff\x2e\xa0\x21\x7b\x0f\x99\x36\x00\x07\xd7\x40\x1b\x5d\x0f\x81\xb1\x2a\x15\xb3\x0b\x85\xae\x3a\x43\x82\xa0\x71\x14\xc7\xed\x27\x46\x1a\xfb\xc6\x54\x9e\x72\x32\x1f\x8c\x8f\xe5\x11\x1a\x00\x71\x50\x6d\x20\xc0\x08\x83\x52\xdd\x69\x1a\xe8\x8e\xa6\xbf\x8f\x75\xf5\xe2\x45\xbf\xd1\xcc\x50\x9c\xcb\xb9\x77\x7c\x74\x14\x4a\x28\x35\xe6\x74\xcf\xe3\xa7\x70\x09\x7f\xfd\x05\x1d\x63\x07\x71\x70\x0d\xe8\x4c\x52\xb7\xe2\xec\x7d\xa4\x0f\xf4\xd8\x14\xd4\xfa\xd4\x81\xb7\x7f\xb9\xa8\xcd\xed\x4a\x4c\x7d\xb0\xc9\xcd\xbd\xf7\x72\xeb\xf7\x11\x71\x41\x1c\x5c\x03\xd3\x57\xad\x24\x4a\x70\x9b\xe9\x5a\xe2\x8a\x5a\xe6\x7b\x51\x98\x63\x9a\xae\xb0\xd1\x6a\xd7\x09\xe5\x27\xb6\xbc\x28\x5d\xc4\x8e\x43\xc4\x05\x71\x70\x0d\xac\x08\xcc\xfa\xa7\x34\x3c\x76\xc2\x12\x8b\x22\x89\x4b\x8e\xd4\x54\xc7\x13\x95\xb1\x71\x71\xb3\x53\xa5\xc5\x95\x9c\x22\xd9\x86\x6a\x9a\x41\x1c\x5c\x03\x57\x39\xef\xaa\x0f\xab\xfe\xa1\x66\x2c\xb8\xf2\xdb\x2f\x68\xc2\x54\x85\x39\xd3\x3c\xa9\x7c\xef\xa6\xaa\xfb\x5a\x60\xb7\x73\xae\x08\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\x4d\x03\xdf\x12\xa6\x45\xf1\x2f\x92\x72\x72\x7f\x72\x6b\xfe\x50\x13\x6f\x3c\x34\xf2\x4c\x92\x2e\x96\x89\xe1\xf3\xcf\x9a\x6e\xf5\x58\x99\x1f\x88\xb1\x83\x38\xb8\x06\xdc\x31\x4a\xc4\xe8\x30\x82\xf9\xbd\xa7\x39\xbb\x8c\x07\xdf\x9f\x27\xbd\x15\xfc\x72\x38\x20\x95\xd2\x35\x08\x2d\x76\x4c\x2a\x08\xea\x1e\x0f\xe2\xe0\x1a\xf8\x96\x3d\xfe\x72\x16\x85\xea\xa1\x07\xc1\x46\xb6\x15\x85\x1d\x7b\xbe\x54\x69\xcd\x83\x81\x82\x37\x77\xd9\xee\xb0\x53\xda\x3f\x1d\x83\xfe\x5e\x00\x07\xd7\x00\x7d\x9b\xe5\xfb\xe7\xfd\xca\xb1\x4c\x64\xb7\xab\xbb\x19\xe2\x4f\x3c\x88\x73\xe6\x96\x76\x1c\xce\x3f\xd3\xda\x90\xd7\x22\x70\xcd\x81\x8e\x88\x03\x38\xb8\x06\x7a\x5e\x89\x0b\xbe\xda\x4f\xdb\xdb\x36\xa3\x7a\x6a\x74\x53\x4f\xe6\x69\xb6\x11\x3b\x0f\x81\xbe\xd6\x73\xa9\xec\xd5\x55\xfc\x64\x66\x84\x06\x40\x1c\x34\x0f\x00\x8c\x30\xc8\x44\x9d\x6e\x84\x2d\xd5\xbf\x07\x0d\x6c\xe2\x4e\x70\xdd\xbf\x1a\xaf\xc8\x24\xdc\xbd\xc2\x53\x69\xe8\xe7\xad\x53\xe8\xeb\xdf\x98\x72\x61\x5b\xe2\x0d\xc2\x54\x82\x38\x64\x23\x8c\xfb\xf1\x95\x1f\xef\x15\x4c\x9b\x95\x3e\x74\x99\xa8\x90\x58\xe7\x4f\x35\x1b\x3f\xaf\xdc\x55\xd1\xbb\x35\x32\xd1\x52\x43\xac\x58\x86\x88\x0c\xe2\x90\x8d\x70\xe7\x4e\xbf\x5f\x0b\xf6\x24\x5a\x87\x6c\x88\xff\x17\xa9\xc4\xc3\x39\x2c\xe1\x60\x02\xc5\xd1\x96\xd9\x50\x62\x79\xa3\x30\x8a\x6d\xe8\xca\x27\x00\xe7\x23\x49\x08\x37\xc2\xff\xeb\x3d\xc2\x9a\x95\x68\x1f\xab\x0a\x33\x72\xff\x10\x47\x4d\x3e\x9d\xdb\x7e\xef\x1e\xc5\x46\x7d\x83\x73\x98\xbf\xe2\xbb\xbe\x8c\x2b\xcd\x73\x9e\xbf\x8d\xb0\xeb\xf3\xc4\xc1\x4c\xd3\x50\xee\xf6\xf2\xc4\xd9\x20\x2c\xb3\x17\x05\x8c\xd2\x37\xe9\xed\x88\xaa\xd0\x98\x07\xdc\x7c\x5b\xb3\x2b\xff\x42\x85\xcb\x56\x83\x98\x70\x09\xbe\x61\x5b\x84\xc5\xe2\xfc\xa0\x69\x71\x2e\xb8\xdf\x93\x60\x4d\xa0\x54\x99\xb8\xf9\x08\x1d\x1b\xcf\xe3\xbf\x66\x84\x41\x43\xfb\xbb\x46\x58\x01\x6e\x96\x4a\xd1\x96\xcc\xcb\x7a\x0a\xdb\xd6\x1e\xbc\x7a\x78\xd8\xc6\xbe\x9a\x6e\x92\x2d\xcb\x25\xdb\x43\x9f\xf6\xba\xf4\x1d\x47\x53\xe3\x99\x14\xeb\x7a\x22\x1b\x61\xb1\xb1\xf1\x60\xad\x3a\x53\x59\x14\x97\xba\xdd\xe6\xd9\x2d\x5d\x71\xbb\x04\x3c\x21\xed\xd6\x9a\x4e\x79\x6d\x1e\xe5\xfb\xcc\x67\xb3\x35\xab\x8a\xf4\xb3\xee\xf9\x04\xd8\x6f\xfb\xe4\x38\xef\x05\x31\x6f\x99\xa0\xbf\xe0\xf9\x29\xe8\x30\xf3\x84\xb6\xee\x9a\x85\x54\x17\x79\x8f\x5c\x6f\xf3\x99\x8c\x16\xd9\x08\x6b\xdd\x89\x5f\xa2\xb3\xd9\x52\x4e\xd1\x0b\x39\x5f\xaa\x59\x85\x69\x5d\x2e\x71\xf3\x36\xb6\x7a\x00\x7f\xb6\xe8\x24\x6e\x16\xcb\xe1\x99\x8c\xd6\x19\xe9\x67\xfb\x79\xc8\xdf\x5a\x5c\xdc\xda\xc5\xd0\x42\xc7\x21\x2f\x71\x7b\xc0\xd0\x4f\x2f\x4a\xcf\xf4\x86\x51\x84\xae\x4a\x70\xfa\x81\x34\xdd\x99\x19\x61\x90\x88\x4e\xcb\x7c\x95\x55\x9c\xeb\xeb\x11\x13\x3a\x44\x3e\x64\x72\x95\xce\xbf\xa3\xd8\x9e\x1c\x7f\xe0\xcb\x33\xe7\xf1\x66\x4d\xc4\x6e\xe3\xd0\x83\xce\xc5\x82\x38\x78\xe6\xd3\x8b\x30\xf8\xe0\x67\xfe\xf1\x24\x8d\xdd\x8c\xba\x39\x5d\xaa\x8b\x71\xe8\x47\x9a\xc6\x01\x5d\xc9\x6e\x88\xe1\x54\xe7\x2d\x69\xe8\xe2\x40\x10\x07\xcf\x7c\x2b\x79\x3a\x87\x11\xdb\xe7\xf7\x13\x2d\xb6\xc9\x73\x09\xb9\xca\x4a\x87\x51\x9e\xc5\xbc\xc2\x26\x31\x62\x8d\x27\x26\xc2\x71\x84\xb6\x17\x40\x1c\x3c\xf3\xd9\x10\x4e\x48\xbf\x2a\x48\xe7\x0c\xac\xe9\xe9\x36\x5f\x2b\xd7\x51\xc4\xde\x90\xc8\xc6\x28\xa5\x57\xd5\x77\x63\x5d\xe5\xf1\x80\x5a\x11\x83\x38\x1f\xf1\x7f\x76\x5a\xb0\x2f\x9e\xe8\x31\x65\x1a\x7a\xeb\xcb\xbf\x1c\xbc\x86\x3d\xd8\x5a\x39\x3c\xfd\x60\xc8\xe9\xc8\xc4\xaa\xfd\x5e\x42\xe5\xba\x02\x01\xc2\x08\x83\x38\xa8\x46\x58\xe1\x5f\x17\x3f\xa0\x17\xfa\xd4\x1b\xb4\xd6\x5f\x7b\x67\x75\xaf\xbc\x63\xb0\x50\xb7\x9e\x74\x3c\xb4\xed\xc8\xdf\xee\xc7\x6a\xde\x7f\x39\x68\x5c\xf2\x46\x38\xfc\x26\x74\xd3\x15\x88\x83\x4b\xc0\xe4\xd7\x83\x63\xc3\x96\x1a\xff\x01\xee\x28\xd7\x73\xb7\x9e\x8c\xb7\x08\xde\x5e\xd3\xbe\xcc\xb5\x7f\x7b\x04\x73\x9c\xc0\x4f\x1f\xda\x5d\x00\x71\x70\x09\xdc\x3d\x27\xdd\xb1\x35\x93\xc4\x63\x52\x14\xe7\xf5\xee\x27\x75\x5d\x6e\xa3\x1a\x9e\x6c\xe8\x85\xb1\x4a\xa1\x19\x31\xed\x6f\x44\xd1\x88\xb8\x20\x0e\x2e\x81\x8f\x89\x03\xc4\x3c\x9b\xec\x56\x31\x9a\x92\x6b\x2f\x1a\xf0\xb7\xcc\xcd\x7f\xd5\xac\x31\x46\xa0\x25\x98\x5f\x08\xa3\xc0\x56\x85\x6a\xa5\x41\x1c\x5c\x02\x82\xa4\x81\xdd\x36\x28\xd6\x25\xb4\x15\xbb\xe5\xd4\xa1\xa2\x59\x92\x4a\x0e\xab\x61\xe7\xb4\x27\xbe\x9c\xdf\x5b\x9d\x70\xbe\xa6\x80\x58\xfc\x80\x38\xa8\x36\x10\x60\x84\x41\xb3\xeb\xa9\xa7\x02\x12\x39\xb9\xb8\x54\xab\x7d\x1d\xfe\x50\xe0\xce\xf1\xc6\x92\xde\x49\x3d\xd6\x30\xfd\x45\x85\xe7\x27\xd0\x14\x84\x63\x47\x3b\x04\x9d\x0a\x00\x70\x70\x0d\x1c\x8f\x5f\x8b\x3a\x12\xfb\x1d\x25\xd3\x6a\x96\xbf\x6b\xfb\x73\xa6\x76\x65\xac\x2b\xb9\x2f\xf8\x86\x8a\x08\xfd\xa2\x5a\xba\x6b\x24\x74\xc4\x10\xc0\xc1\x35\x30\x4c\xd8\xaf\xff\x73\xfc\x82\xb5\xf3\xb7\x1e\x94\x3f\x37\x50\xdc\x58\x2c\xfc\xa2\xb1\x0b\x7c\xf4\xa6\xfa\x38\x86\x5b\x4e\x1c\x46\xa1\x8f\x16\x00\x0e\xae\x01\xd6\x7e\xff\x5b\xd4\x77\xbf\x1a\x93\xf2\x2c\x7a\xa3\xe1\xef\x34\x4f\x53\x4c\xa2\x3a\x26\xc4\x3a\xf5\xb9\x3e\xf7\x9f\xcf\x29\x2d\x41\xc4\x05\x71\x70\x0d\x5c\x30\x0c\xdf\x52\xd3\x1d\x10\x5a\xec\xfc\xd5\xd1\xdc\x85\x53\x4d\x6e\xab\x76\xfd\x59\xa7\x13\x77\x3e\x89\xa0\x95\x67\xd9\x3d\x6f\x84\x06\x40\x1c\x54\x1b\xa8\xfa\xef\x1a\x00\xa5\xba\x53\x1b\xa6\x9d\xfb\xc2\xb4\xa5\x36\x97\xce\x30\xf5\xc0\x54\xe7\x06\x46\x91\x27\x4f\x75\xfc\x2d\x49\xc2\xef\x87\x99\xaf\x08\x7a\x5a\x97\xa6\xa0\x1d\x56\x00\x07\xd7\x40\x03\xde\x23\x2e\xd3\x29\xcb\xbe\x3d\xaa\xfd\x75\x5e\xdc\x95\x85\x3e\x9e\xf6\x30\xd7\x2c\x2b\x8b\x96\x96\x92\x67\x1b\x85\x54\x50\x37\x6a\x10\x07\xd7\x80\xe1\x0c\xcd\x9a\x2a\x37\x86\x9e\x86\x5c\x88\xe3\x4b\x92\xc7\x16\xbc\x25\xdf\xb6\xda\x4b\x5d\xc3\x6d\x45\x3d\xa7\x02\x38\x96\xb6\x10\x71\x41\x1c\x5c\x03\x44\xaf\x27\xdf\x46\xc9\xb0\xfa\xef\x90\xa8\xb8\xf8\xe3\xd5\x14\xff\x54\x3c\xa8\xa3\x63\x6f\xff\xa1\xf2\xfd\x6a\x38\xd5\xc2\x34\xd4\x28\x09\xc4\xc1\x35\x70\x2e\xfd\xd1\xb8\x4a\xfa\xb9\x6f\x6e\x42\xd6\x03\x64\xd5\xed\x97\x7a\x36\x42\xd5\x49\xbe\xbb\xee\x3c\xcc\xa6\xf4\x67\x3a\x9e\x4a\x43\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\xd6\x1d\xa7\x7e\x14\xcd\xac\x5a\xfa\x7c\xef\xe4\x65\x61\x4d\xb0\x98\x26\x39\xee\xae\xc2\xff\xc7\xdc\x9f\x86\x53\xf5\x36\x0e\xff\xbf\x8d\xb0\x77\x91\x21\xc3\x69\x4a\x94\x29\x09\xc9\x18\x99\xa7\x90\x31\xf3\x3c\x65\xca\x54\x51\x21\xcb\x2c\x33\xc9\x98\x79\x8a\x0c\x29\x99\xc7\xcc\x19\x32\x64\x4e\xc6\x64\x2a\xa1\x44\xd4\xff\xd8\xc7\xfd\xff\x7c\xee\xf6\xfa\x5e\xeb\x76\x3d\xf8\x3e\xf8\x5d\xcf\xae\xe3\x38\x3f\x2f\x2d\xfb\xdc\x6b\x9d\xe7\x5a\xdb\x7b\x8f\xaf\x52\x7e\x7c\x23\x7c\xad\x2f\xee\xe9\xe2\x65\xcb\x76\x85\x7f\x6f\x8a\x1e\x31\x0e\x3e\x07\x52\x4b\x7a\x7b\x04\x3b\x9f\x11\xbd\x1d\x78\x14\x68\x69\xf4\x52\x21\xb7\x35\xc1\xfb\xfc\x82\x4d\x7d\x05\xef\xd0\xf2\x29\xb2\x57\xff\x7e\x57\xfd\x51\xe3\xe0\x73\x60\xf2\xf1\x23\xd7\x70\xbb\x4d\x4b\xd6\xc2\x93\xa2\x37\x5e\x55\x24\x28\xc8\xf2\xb7\xe9\x7e\x3c\xc7\x18\x4a\x3e\x6c\xe6\x2c\x2e\xda\xf2\x8f\x7b\xd4\x38\xf8\x1c\x38\x38\x99\xff\x66\x95\x2e\x4d\x8d\xc9\x25\x34\xea\xea\x59\x4d\x54\x5d\xef\x0f\xdf\xa4\x17\xab\x6f\x15\x99\x12\x7d\x13\x5c\x93\xfe\x2d\x87\x1f\x35\x0e\x3e\x07\xc2\x95\xce\xb9\x9c\x9f\xd9\xee\x2c\x3c\x60\xaf\x67\xeb\x8e\x42\xb1\xee\xde\xa8\x65\xe5\xbd\x27\x82\x97\x4c\x9b\xc5\xf6\x91\xb3\xf2\x9f\x39\x70\xd4\xb8\x7f\xcf\x03\xf7\xfe\xdf\x1b\xe1\xa3\x36\x51\xff\x79\x23\x3c\x79\xc3\x68\xc0\xbd\x88\x94\xa7\x3a\xd2\x33\xe1\xaa\xcc\x9e\x23\x97\x25\xb3\xd0\xd7\xa2\xb2\x8b\x4f\x79\xe3\x92\x41\x74\x03\xe6\x9f\x4d\xe5\x51\xe3\xfe\xe7\x46\xd8\xab\xee\xf1\x83\x13\x32\x4e\x50\xeb\x77\x11\x7e\x10\xf9\xd2\x24\xc4\x92\x38\x8c\xa0\x94\x3b\x4e\xa5\x50\x75\x31\x77\x3c\xc1\xf6\x1f\xf9\xa8\x71\xff\x73\x23\x4c\xfb\x87\xb6\x44\x4d\x5c\xd7\x3c\xfd\xd9\xf0\xe3\x53\x82\x01\x09\x1d\xf3\x91\xe9\x19\x2d\xd0\x98\x4b\x57\x80\x2c\x79\x12\x85\xf9\x3f\xf2\x51\xe3\x02\xe4\xa4\x60\xbf\x8d\xff\xfa\x7b\x84\x95\xbf\x74\x6d\x59\x8d\x31\x2c\xa1\x37\xed\x44\x77\xcc\xa5\x48\x3e\x83\x0b\xa1\xe6\x92\x7b\xe9\x9f\xb5\xad\x86\x4f\x5b\x69\xf9\xfd\xbd\x9d\x12\x3b\x64\x73\x5f\xe0\xde\x0d\xbe\x63\xa4\x40\x67\xff\xa1\xc2\xf9\x66\xea\x2b\xa2\xca\x2a\x0b\xb1\xe8\x9f\x56\x7b\x46\xc3\x0f\x9c\xfe\x1a\x7a\xe6\xb6\x68\x07\x81\x49\xd8\x98\xee\xe7\xf8\xd9\x57\x11\x3a\x1d\x42\xcf\xc9\xc8\x15\xca\x38\x4f\xf2\xff\xb9\xbf\xf6\x52\x71\xf0\xcb\xff\xd7\x36\xc2\x47\x1d\xda\xdf\x7f\x23\xfc\x3f\x36\xc2\xf8\x29\xd7\x0f\xc8\x3d\xdd\x32\x47\x56\xae\x45\xf1\xc4\x95\x87\xab\x53\xf4\x4d\x88\xba\x5a\x9f\x35\x2e\x7f\x3a\x24\xb8\x2a\xfc\xfa\x7f\xe5\x61\xe5\xff\xdc\x08\x8f\x2f\xf7\xc5\xed\x7e\x13\x1a\x3e\xee\xeb\xd2\x76\x61\xbc\xf3\x8f\xf4\xca\x12\xfd\xaa\xc6\xdc\xbc\xb5\xc4\xae\xfa\xcd\xc7\xd3\x52\xff\x2b\x8f\x66\xff\xe7\x46\x58\xfe\x5b\x7d\xdd\x4d\x86\xcd\xce\x69\x17\x52\x67\xdb\x85\xe1\x8f\xbd\xba\x5e\xcc\xe5\x1f\xd4\xe7\x49\x09\x29\x06\x43\xe5\x0e\x29\xfe\x57\x8e\xf6\x3f\x3c\x11\x5e\xed\xae\x22\x58\x66\xbc\x48\x15\x3b\x7a\x31\x48\xe2\xb3\xb1\xe6\x1c\x0b\xcb\xcf\xc7\xf5\x84\xe4\x63\x01\x4e\x62\x0b\x61\xa8\xff\x95\xa3\xfd\x9f\x1b\xe1\xa1\x7d\xab\xd8\x6c\x7c\x4f\xa2\xe4\x3f\x19\xf8\x76\x87\xbf\x96\xb3\x45\xd8\x3f\x45\x97\x15\x59\x70\x3c\x1a\x91\x25\xd0\x74\xaf\xfc\x5f\xdb\x08\x1f\x35\x89\xfe\xd3\x95\xef\xc3\x70\x77\x5f\xef\xf6\xd6\x6d\xfa\xdf\xb9\x7a\xc7\x98\xe9\xf5\xe8\x89\xae\x56\xfd\xb9\x58\x73\xaa\xe1\xa3\x1e\xf9\x40\xb3\x7a\xdb\x3f\x67\xfc\xa3\xc6\xfd\x8f\xaf\x4f\x5a\x8f\x72\x69\xe6\xd0\xab\x1f\x80\xba\x85\x43\x0d\xb7\x7e\xff\x76\x0d\xcb\xf3\x8e\xf2\x1c\x44\x7b\x33\x8f\x7e\xb4\x99\x7b\xfe\x8f\x7b\xd4\x38\x78\x76\xb1\x6c\x78\xac\x2f\x07\x8f\xa7\x24\x3c\xd5\x96\xa2\xff\xee\xa9\xef\x45\xbf\xa1\xf7\x24\xc6\x72\x51\x8e\xaf\xe2\x46\x9e\xc9\x9f\xe5\xf9\xc7\x3d\x6a\x1c\xfc\x56\xed\x7a\x1e\xd5\x06\xf9\x97\x4a\x69\x81\x13\xf5\xf1\xfe\x2e\x77\x1e\x70\x9b\xa1\x8a\x26\xdc\x88\x85\xd6\x54\xd3\xe8\x7a\x0a\x77\xce\xfd\xfb\x48\xec\x88\x71\x01\x32\x78\xe4\x38\x37\x57\xeb\xf8\xc7\x6f\x3c\x35\x36\xad\xad\xbc\x24\xe1\xb6\xe3\x4b\xdd\x81\x7a\xe0\x54\xf0\xb2\xd6\xa5\x86\x20\x5a\xa1\xdf\xa4\xb9\xf0\x9f\x8d\xf0\x51\xe3\xfe\xfd\x1b\xe1\xff\xf7\x46\xf8\xa8\x37\xf4\x7f\x9a\x02\x45\x74\xa4\xcd\x72\x57\xb2\x0e\x1e\x7d\x6c\xb9\xec\x16\x98\x47\xac\x9e\xf1\xdc\x37\x5c\x7f\x33\x28\xb1\x91\xc4\xc6\xb2\xf9\x55\xc0\xbf\x1f\x61\x3e\x62\x1c\x7c\x0a\x10\xdd\x2e\x19\x8d\x3b\x58\xcd\x3c\x96\x65\x46\x18\xd5\xed\x23\x1a\xea\xda\x75\xaa\x5e\x3c\x23\x36\x72\xfd\xe2\x80\xe0\xeb\xe9\x7f\x37\x57\x47\x8d\x83\x4f\x81\x07\xe2\xc3\xe9\x33\x9f\x1a\x77\xde\x3b\xbe\x09\xcc\xfc\xe6\x6e\x9e\x79\x7d\xe9\x86\xd9\xa2\xfa\x60\x7f\xd8\xb6\x8e\x13\x5b\xc2\xbf\x4f\x2f\x8f\x1a\x07\x9f\x02\xd6\x12\xbf\x6a\x43\xd8\xfb\xbc\x2e\xe9\x4d\xd9\x27\xbc\xc9\x1e\x0b\xd5\x5e\xa8\xa4\x49\xdf\x76\x7a\x63\xb1\x20\xf1\xf1\xe6\xc1\xd7\x7f\x17\xd6\x47\x8c\x83\x4f\x81\x5a\xbd\x1d\x0f\x8a\x3d\xed\xd3\xd5\xdd\xf5\x63\x16\x8b\x9a\x8a\xef\x13\x73\xb7\xdb\x83\x68\x3a\xe6\x0f\xef\xdf\xea\x7a\x9e\xcc\xf3\xef\x77\x47\x1e\x31\xee\xdf\xbf\x0d\x3c\x62\x23\x7c\xd4\xd9\xf5\x3f\x7e\x7d\x92\xee\xd3\xe7\xc1\x7b\x0f\xf5\x57\x9f\xee\x37\x86\x3c\x0b\xd6\x96\xd1\xa9\x73\x3f\x51\xfb\xc4\xb1\x25\xf5\x54\x9f\xe2\xb5\xeb\xc9\xff\xde\xb4\x38\x62\x1c\x7c\x0e\xc8\x6c\x9e\x4d\xe6\xa9\x8c\x55\x20\xbb\x46\x2b\x14\x4d\x41\xeb\xb5\xe1\x55\x37\xa1\xf2\x2b\x92\xca\xb9\xb2\xbc\x60\x72\x22\x2a\xfa\x1f\xf7\xa8\x71\xf0\x39\xd0\xe5\x7a\xb5\x44\x44\x73\x32\xea\x44\xc3\x4a\x82\x47\xe8\x85\xb9\x95\xf8\x91\xd9\x09\x56\x06\x0e\x74\x0f\x2f\x61\xf8\x33\xad\xb0\x7f\xdc\xa3\xc6\xc1\xe7\x00\xd3\x59\xf2\x18\x22\xae\x58\x2a\xea\xb8\x4b\xdf\xd4\xec\xdf\x69\x50\xfa\x34\x32\x95\x0e\x52\x66\xbc\xdb\x7d\xcc\xbe\x35\x25\x53\xf8\x8f\x7b\xd4\x38\xf8\x1c\x20\xc0\x58\x04\x78\x12\x10\x05\x47\xf7\x6d\x6d\x11\xbc\x7b\x46\xe2\xfb\xb5\x90\xd5\xfa\x67\xf4\xcf\x69\x37\xd2\x42\x2f\x95\xc4\xb5\x7f\xe6\xc0\x51\xe3\xfe\xfd\xdb\xc0\x23\x36\xc2\x47\x5d\xea\xfe\xe3\x26\x48\x5d\x95\x33\x73\x57\x71\xcf\x46\x2f\xc7\xfa\xcc\x81\x96\x6a\x05\xfe\x33\xd2\xde\xcc\x27\x86\x82\x53\xa6\xad\x36\xeb\x8b\xff\xfe\xcd\xed\x51\xe3\xe0\x73\x20\xf4\xf7\x10\x5e\xec\xc4\xbd\xf9\x93\x0c\x3e\x51\x32\x8b\xf4\xfe\xe7\xce\x73\x40\x11\xde\xd1\x34\x15\x57\x81\x09\x73\xc5\x9d\xd4\x7f\x33\x14\x47\x8c\x83\xcf\x81\x40\xb1\xad\x3d\x77\x15\x59\x93\x00\xe5\x35\xa2\x04\xb5\x65\xc9\xdd\x2f\xcd\x4e\xe4\xeb\x56\x4a\xf7\xa9\x9d\x15\xaf\x18\x34\xfc\xfb\x9d\xb7\x47\x8d\x83\xcf\x81\xb0\x90\x9e\xf4\x8b\x42\x09\xc6\x39\xcd\x93\x5a\xbc\xfa\x6f\xbf\xae\x06\x31\x59\x85\xd8\x56\x7e\x0e\x71\xff\x91\x23\xde\xcc\x37\xf8\x6f\xe7\xf1\x88\x71\xf0\x39\xc0\x76\xb7\x7a\x3c\x4e\xda\x6c\xe2\xed\xd3\x9a\x30\x61\x4e\xf3\xf7\xee\x7e\x32\xf4\x5c\xfb\x23\xaf\x29\xcd\x8b\x75\x3f\x94\x72\x78\xfc\x33\x07\x8e\x1a\xf7\xef\x79\xe0\x88\x8d\xf0\x51\xeb\x8e\xff\x34\x07\xf4\x6d\xbb\xa5\x8d\x2f\x6e\x44\xe8\xb0\xee\x4f\xdd\x93\x70\x37\xbb\x0a\xe1\xd9\x52\xe5\x19\x76\x54\xd4\x5c\x26\x7f\xa1\x2b\xde\xf9\xcf\xb1\x1f\x35\x0e\x3e\x07\xd2\x0b\xfa\xda\xbc\xc5\x68\x7a\x2d\x96\xd3\x6a\x85\x9e\x5c\x71\xfd\x6c\xfb\xda\x8a\x80\x2e\xf7\x05\x8d\x4a\xb7\xfc\x6e\xce\xd4\xbf\x1f\x63\x3f\x6a\x1c\x7c\x0e\x38\xbe\x08\xd9\x88\xdb\x50\x34\x64\x48\xaa\xf4\xe5\x68\x79\xfd\x43\xe6\x5a\x1e\x79\x96\xa5\x66\xe4\xd0\xbb\x6b\x83\x15\x9c\xbb\xff\xde\x64\x39\x6a\x1c\x7c\x0e\x18\x14\xf9\x30\xeb\xf3\xd8\x0d\xb2\xdb\xf1\x86\x16\xb0\xd8\x13\x14\x28\xea\x9d\x59\x32\x3f\xde\xa4\x47\x95\xb4\x35\x3b\xa5\xf3\xf6\x1f\xf7\xa8\x71\xf0\x39\x40\x1d\x07\x2d\x2c\x0f\x1a\x0c\xa5\x33\xd9\xd1\xdd\x0b\x7e\xb5\x17\x2f\xa7\xa4\xb0\xb2\x4d\xfd\xb3\x0e\xf5\x2d\xf8\xcc\x89\x19\xce\x7f\xe6\xc0\x51\xe3\xfe\x3d\x0f\x1c\xb1\x11\x3e\x6a\x13\xf5\x9f\x37\xc2\x6e\xf1\xf5\xc4\x49\x6f\x33\x99\x5a\x59\xfc\x69\x95\x85\x35\x7a\x2b\xb2\x9e\x16\x7b\xfe\xa9\x66\x7e\x38\xef\xc4\x59\x34\xeb\xe1\xf4\xef\x07\x98\x8f\x18\xf7\x3f\x37\xc2\x33\x4c\xea\x85\xcb\x1f\x95\x78\xca\x6f\x66\x87\x33\xeb\x16\x72\x72\x94\xdd\xf7\xa4\xdc\x93\xdb\x3c\x2d\xcb\xc2\x98\x1a\xac\xfb\xef\x73\xdb\xa3\xc6\x05\xc8\xe1\x11\xe2\xca\x9d\x5f\x15\x47\xe4\x27\x8c\xc8\xef\xa5\xba\xef\x13\xb7\xdf\xe9\xee\x8c\xa5\xbd\x9d\x9a\x6c\x6f\xc1\x2b\xa0\xe5\xe8\x24\x41\xfc\xef\x53\xec\xa3\xc6\x05\xc8\x61\x7f\x93\x7f\xcb\x47\x7e\x8f\x30\x33\x4a\x17\x8f\xd4\xd6\xde\xe9\xa2\xd0\x45\x0b\x2b\x2b\x97\x3b\xb7\x6e\xe3\xfc\x1f\xc3\xff\xc3\xdc\x24\xc8\xf4\xfb\x32\x66\x82\x99\xb5\x8b\x9b\x92\x7d\xa0\xb0\x94\x12\x3a\x52\x1a\x95\xf4\xa0\x45\x55\x9f\x24\x9b\x6b\xb8\xef\x1a\xa4\xcf\x4f\x10\xe3\xfc\xba\xf6\x81\x28\xb4\x7b\x73\x25\x52\x32\x1e\xf2\xbf\xf6\x89\xe5\x5c\xcc\xc6\x9d\x22\x9d\x2d\xf1\xf8\xa5\x75\x97\x0d\xaf\xe2\x01\x19\x8e\xcf\xeb\x71\x6c\x1e\xaf\x58\x67\x5a\xbd\x43\xdf\xce\xfd\xff\xb7\xe0\xef\xed\x1e\x50\x8f\xb0\x75\x88\x05\x58\xee\x46\x09\x88\x8b\x0e\x73\x51\xdb\xfb\xf2\x37\xcf\x7b\x2a\xb9\xbc\x91\x5b\x5a\xb8\xd1\x16\xfd\xd7\xe1\xa8\xbf\x91\xcc\x7a\xb1\x9d\xd8\x9a\x4a\x30\xa3\x53\x42\xd2\x11\xe5\xd3\xa3\x20\x25\xf7\xdb\xec\x54\x66\xeb\xdb\x7b\x21\xe5\x76\x28\x9c\xbd\x0b\x0d\xdd\x7d\x33\xef\x4e\xe9\x9f\xef\xbd\x2a\x1f\xed\x46\xf9\x3c\x15\x0a\x3b\xef\x7f\xab\x37\x44\x63\xc4\x30\x75\xec\x70\xda\x89\x5f\x4a\x16\x0f\x35\xfb\xd7\x78\xba\xdf\x0e\xbd\x16\x39\x39\x8e\x27\x84\xaf\xa8\x88\x45\xe5\x5f\x83\xce\x6f\xf5\xa4\x6a\xf9\x69\xc4\xa4\x79\x8d\x90\xe8\x3e\x3a\xf1\xd7\xd0\x68\x21\xe3\x57\xd7\xf5\xf5\x62\x39\xfa\x48\xa8\xa3\x44\x27\x08\x4c\xfd\xcf\xdd\x74\x27\xe6\x3c\x26\x5c\x5b\xec\x6d\x64\xb5\xc5\xf8\xf7\x7e\xf1\xb1\xc6\xf8\x4e\xba\xfc\xcf\xd7\x12\x5f\xc3\xc7\xb2\x24\x3a\xe8\x43\x94\x89\xc7\xa7\x8a\x99\xa6\x8d\x0a\x75\xe3\x92\xfe\xfc\xfd\x75\x3f\x79\x6d\xdd\x97\xfd\x23\xac\x68\x51\x3d\xb3\xfe\x19\xbc\x37\x3f\x25\xde\x29\xae\x60\xfe\xdc\xed\xd9\xa7\x10\xbf\x79\xee\xe6\xbb\x46\x51\xc2\x0f\xa7\xfe\x3e\x3e\x72\xbf\xc9\xb0\x97\x32\x72\x51\xdf\x4f\x15\x6e\xda\x1d\xdf\xd0\xcb\x52\x59\xdd\x3d\x3c\xf6\xdb\x73\xdf\x34\xd3\xbf\x74\xd7\x5a\xea\xbb\xc5\x7f\xf7\x5b\x0b\x97\xc1\xb3\x97\xc1\xb3\xf7\xfb\xa1\xcf\x8e\x77\x96\x04\x45\xc9\x62\x46\x20\x56\xd0\xf1\xd5\x65\xad\xeb\xf2\x1f\xfb\x53\x0b\x1f\x7b\x44\x37\xb4\xde\x0d\xbb\xb6\x33\xa6\x0c\x6d\xd3\x88\x15\xfa\x7d\xf1\x23\xa6\x67\xc1\xc3\xc3\xc3\x67\xf9\x61\xf1\xdf\xfd\x3e\x02\x89\xf0\x51\x01\x4a\x78\x78\xd8\xff\x0a\xf6\x01\x0e\x42\x71\xdb\x7b\x93\x66\x7c\xca\x2b\xd4\x5c\xe7\x6f\x58\x2a\xc9\x57\x1f\x7b\xf2\xf6\xf9\xdc\x49\x2e\x89\x6d\x34\x19\x5e\xde\x9e\x9f\xc9\x7f\x37\x0e\xab\xe3\xa1\xe0\xba\xc4\xa3\x09\xd4\x43\x06\x37\xc3\xa9\xc1\x4f\x8e\xcc\x5e\xe0\xcc\x63\x56\xe7\xfd\xcd\x48\xef\xe4\xa5\x0f\x44\x10\x74\xf6\xe7\x1b\xbf\xcb\xff\xdd\xb8\x00\x25\x42\xbc\xff\xf3\x3f\x3f\x48\x86\xd0\xbb\xe6\xd8\x7f\xf7\x82\x05\x1e\x43\x01\xd4\x6c\x80\xdc\x9f\x87\x78\x78\x7f\x4f\xe3\x90\x15\xb2\x18\x57\x42\xdf\x5f\xaf\xa6\x59\x3f\x87\x90\x45\x8a\x65\xa6\x2f\xff\x71\x4f\x4f\xee\x7b\x94\xca\xff\xae\x6d\x60\x33\xe8\xaf\xa1\xb2\xfb\x1e\xbf\x9e\x2a\x13\x31\xda\x6e\x9e\x0b\xfd\x61\x93\x6b\x7e\xdd\xf8\x46\x0b\x69\xf1\xae\x84\xc5\xfb\xa2\x0a\xea\x8f\x16\xbe\x7f\xaf\x55\xc6\x7a\x25\xc9\x8c\xdf\xcc\x7d\x5c\x4b\xb9\xe1\x3e\xc8\x90\x41\x2e\x26\x35\xdb\x13\xde\x62\x3e\x32\xb7\xc8\x99\xb3\x18\x46\xfb\xd7\xd0\x93\x1d\xf7\x51\x6c\x3b\x34\xed\xa2\x61\x7f\xaa\x55\x0f\x0c\x52\x96\x8f\x43\x81\xc3\x96\x8e\x57\xe7\x56\x77\x3e\xa5\xb5\xef\xa2\xff\xfe\x98\xc3\xc9\xab\x92\x6b\x2a\xb7\x3c\xc2\xd3\x0b\x7e\xfe\xf9\x1c\xf3\x40\xca\x8d\x6a\xf9\xb7\x9f\x15\x11\xa6\x69\x83\xf1\xb7\xa3\xc7\xdf\x37\xa6\xf8\x05\x7e\x57\xa8\xaa\xf9\xf6\x8f\xb9\xbf\x50\xf2\xdc\x73\x6f\x6c\xad\xb7\xd5\x1b\x0a\xa5\x70\xe0\xbe\x24\x37\xcc\xb5\xa2\x1a\xf6\xd7\xd0\xc4\x3c\xea\xd5\xcb\xfa\x84\x8c\x11\xae\xdd\xf7\x3d\x73\x82\x6f\x75\xa7\x97\x8a\x5d\x22\x5b\xb4\x75\xe8\xe4\xee\xd6\x25\xda\x38\xfe\xd7\xd0\xf2\xe5\x4c\xb9\xae\x3b\x2b\xdb\x54\x13\x7d\x04\x4b\x99\x5f\x0d\xc2\xe5\xfa\x93\xed\x3e\x7e\x7d\xe7\x89\x1f\x46\xe4\x18\x5b\xcb\xfa\xd7\x50\x68\x58\x5d\x2e\xea\x91\x47\x15\xa5\x78\xf6\x9b\x13\x0c\xa4\xcd\x46\x53\x54\x3f\x77\x0e\x8a\xf4\x24\x9f\x2f\x34\x34\x29\x95\x04\xfe\x35\xb4\x9f\x6f\xbb\xfa\xcd\xd0\xf5\x1e\xb2\x40\x33\xf5\xe2\x2f\x61\x09\x59\x01\x19\x07\x32\x4b\x56\xcc\xfd\x52\x1e\xa3\xb4\xef\x6b\xfe\xfe\xb7\x1a\x86\x9c\x37\x54\x0a\x73\x80\x34\x05\x4f\x0b\x5d\x1f\x0e\x11\x49\x8b\xbd\xe0\x45\xa2\xa7\xa7\x6c\xe0\x29\x62\x8c\x67\x10\xf0\xf4\xaf\xa1\xb3\x6f\x45\x18\x05\xab\x02\xe6\xff\xf8\x44\x5d\xd2\x7b\x4d\xdc\x25\xc7\xd1\xaf\x64\x42\xfe\x6a\xe8\x77\x3a\xfb\x53\x6e\x61\xa7\xe1\xbf\x86\xa6\x89\xf1\x66\x2f\x68\x72\x3b\xa5\x2f\xe9\xa8\x51\x7c\x6f\x61\xf9\xb4\xa8\xc4\x23\x5c\xf0\x99\xc2\x9e\xe9\xb6\x6a\x1e\x31\xa4\xf6\xd7\x50\xf2\xd5\xab\x55\x35\xa2\x74\xbb\xe6\x7b\xf7\xd3\x5c\x98\xa8\x25\x4c\xad\x9a\x03\x1c\xba\x22\xed\x78\x26\xee\xbe\x2d\x3a\x6e\x43\xf7\xd7\xd0\xe9\x96\x98\x06\xa2\x05\xb1\x89\x4a\x2b\x19\xfe\xb7\xa6\x6e\xb2\x67\x0b\x19\x93\x52\x92\xea\xe6\x4d\x77\xc2\x79\xd2\xa4\xfb\x76\xfc\x12\xa9\xfe\xbb\x29\x18\x20\xf7\xe7\xcf\x9f\x3f\x7e\x49\x2c\x91\x78\xc4\xe3\xdc\xfa\x5c\x78\x28\xff\x79\x02\xe8\x33\x3e\x4b\x32\xeb\x13\xcb\x9e\x47\xf1\x95\xbb\x9d\x19\xc5\xdc\xc2\xe2\x76\xda\xd3\x8f\x6c\xc9\x27\x7f\x28\x93\xe5\x86\xeb\x06\x75\x54\xe2\x43\x00\x6d\x8e\x47\x8f\x47\x5b\x34\x27\xa5\x84\x87\xff\xdd\x18\xfb\x96\x97\xc1\x43\x49\x49\xe1\x49\x45\xa2\x70\xa9\xa7\x05\xb9\xf9\xc5\x37\x37\xd2\x42\x98\xa9\xe8\x39\xb7\xe6\xce\xef\xbe\x88\x2b\x1f\xec\x22\x73\xcb\xe4\x37\xf4\x2a\xb6\x34\xbe\x0c\x01\xb4\x05\x12\x85\x8f\x4b\xe5\x6e\x98\x3c\x14\x12\x19\x3a\xf5\x89\xdc\xb5\xc9\xa4\x58\xcc\x54\x4b\xf2\xb6\xfc\x5c\x62\x78\xde\x5c\xc2\xfb\x90\x6b\x8b\xf6\x22\x10\x40\x5b\x22\x51\x04\xb8\x94\x46\x2e\x27\x77\x1d\xdb\xd7\xd2\xe2\x87\x98\x3e\x13\x3a\xfc\xca\x63\xa6\xbd\x1a\xb7\x9e\x32\xe5\x4f\xb6\xd7\x1e\xba\x87\xca\x13\x43\x00\x6d\x85\x44\x11\xe2\x52\xf3\xe1\x7d\x23\x12\x83\x86\x9f\x59\x96\x2a\xef\xee\x7b\x3b\x44\x7e\x7f\x60\xb2\x43\x99\x4c\xe1\x52\x6f\xfc\xf5\x5d\xb3\x5f\xbf\x11\x04\xd0\xd6\x48\xd4\x31\x5c\x4a\xe2\x99\x84\xdd\xd8\x7e\xce\x13\xf4\x19\x79\xdd\xaf\x6e\xd9\x26\x05\xd9\x96\x78\xf1\xe5\xf5\x56\x8c\xf3\xe9\x89\x5a\x1a\xd4\x4c\x10\x40\xdb\x20\x51\x44\xb8\xd4\x58\xf2\x1a\xd3\xea\x6a\xc2\xeb\x37\x95\x9f\xf5\x63\xe6\xa6\x52\x6b\xca\x9e\xc9\x50\xd1\x73\x13\x11\x51\x73\x54\xf8\xa3\x8d\x1c\x20\x80\xb6\x45\xa2\x88\x71\xa9\x1b\x5f\xde\x19\xbd\x3c\x3b\xe8\xed\xa8\xb1\x8a\x2e\x56\xca\x3c\x91\x9b\x6c\x24\x11\x15\xd1\x8f\x57\x1d\xf5\x74\x51\x42\xec\xc1\x19\x08\xa0\xed\x90\x28\x12\x5c\x2a\x75\x4e\xff\xdc\x4b\x55\xf3\xfd\x9a\xc5\xd5\xe3\x53\xc5\x3e\x9a\x57\x1a\x6e\x24\x95\x96\xbf\xa1\x12\x15\x1d\x57\xb6\xcf\x8e\x10\x87\x00\xfa\x26\x12\x85\xc6\xa5\xb6\x0c\x8c\x69\x05\x2f\x4e\x44\x88\x3f\xcb\xf5\x8c\x4a\xd8\x72\xe8\xa3\xe0\x14\x19\x99\x93\x58\x7d\x76\xfa\x47\x6b\x36\x65\x8a\x2d\x04\xd0\xf6\x48\x14\x06\x97\x4a\x5a\xcb\xf8\x52\xf6\xea\x46\x5d\xcc\x42\x97\x9a\x77\xd2\x74\xb0\xc0\x8f\x7a\x36\xa3\xe9\x72\xee\xeb\x32\xc9\x76\xb4\xe5\xf8\xb2\x10\x40\x3b\x20\x51\xc7\x71\x29\xdb\x2e\xba\xa6\xc9\x26\xb1\x40\x3d\xaf\x66\xff\xa5\x9e\xf8\xf4\x70\x93\x29\xb3\x8f\x21\xfd\xa9\x4f\x4c\x84\x77\xfc\x34\xe8\x29\x20\x80\x76\x44\xa2\x4e\xe0\x52\x9b\xfb\xc9\xb1\xc9\x7b\x57\x73\x98\x09\x54\x7a\xa6\x19\x7f\xae\x53\xef\x7e\x77\x22\x3b\x5e\x68\xd6\x79\xae\x3f\x71\x82\xb8\x41\x10\x02\x68\x27\x24\x8a\x14\x97\xba\xce\x21\xaa\xef\x61\xd2\x70\xe8\x6c\x49\x5d\x1e\x97\x5f\x98\xe3\x9f\xef\x79\x5c\xf2\x76\xed\xef\xbc\x1f\xf1\xd7\xb2\x8a\x7f\xb2\x40\x00\xed\x8c\x44\x91\xe1\x52\x6d\x61\xce\xed\xae\x1c\xc1\xca\x9d\x94\xab\x03\x42\x06\x69\xf9\xfe\xa8\xad\xb9\x8a\xf2\x45\xbf\xb6\x6f\x3a\xc2\xf7\x5c\xba\x78\x20\x80\xbe\x85\x44\x9d\xc4\xa5\x46\x1e\x1f\xd2\xd7\x37\x54\xf7\xaa\xbd\xbc\xbf\x96\x9c\xe9\xfd\xe2\x51\x39\x11\x19\xdf\x6c\xe0\xf0\x76\x55\x2f\x49\x19\x43\xa0\x24\x04\xd0\x2e\x48\x14\x39\x2e\x15\xd3\x87\xef\xad\xd4\x32\x3c\x32\x39\x41\xba\x59\xec\x2e\x7f\x28\x3d\x5d\xc2\x55\x98\x2e\x22\xd8\xba\x57\xe8\x4c\x59\x9b\x26\x0a\x01\xb4\x2b\x12\x45\x81\x4b\xb1\x5b\x14\xb1\xcb\x8d\x52\xd5\xb8\x9c\xaa\x37\x31\x92\x78\x3b\xbf\x85\xd1\x4a\x08\xf1\xdb\x69\x24\x35\x4c\x55\xc6\x4b\x5e\xd5\x87\x00\xda\x0d\x89\xa2\xc4\xa5\x30\xea\xa6\x4b\x54\x52\x0f\xc3\x7b\xe2\x47\x1e\xa7\x5d\x0d\x65\x21\x5e\xba\xc1\x3b\xe0\x72\x92\x5a\x55\xdc\xaa\x5e\x77\xa5\xca\x1c\x02\x68\x77\x24\x8a\x0a\x97\x1a\xd8\x67\xbf\xd1\x91\xd3\x76\x85\x7f\x54\xe7\xfb\x3b\xf2\x90\xc6\x3e\xbe\x08\xb7\x58\x1b\x02\xbe\x50\x2d\xd9\xd5\x7b\xf3\x85\xd8\x53\x9f\x07\x12\x75\x0a\x97\x6a\x71\x4f\x5e\xb0\xf5\x88\x95\xe1\xe3\xc9\x0f\x63\xd5\x6f\x4f\x11\xb6\x17\xe6\x22\x9b\x9e\x69\xa6\xf3\xa1\x09\xf0\x23\x4e\xbc\x09\x01\xf4\x6d\x24\x8a\x1a\x97\x7a\x53\xb7\x6c\x5c\x1a\x36\x39\xb8\xee\x62\x51\xaa\xfd\xb0\x9d\x6b\x03\x83\x77\x37\xf6\x30\xa2\x2b\xa2\x2c\xfd\x82\xa9\x47\xcc\x25\x08\xa0\xef\x20\x51\x34\xb8\xd4\xc5\xf8\xeb\xd3\xad\x77\x54\x78\x6a\x1c\xf9\x36\xca\x32\x75\x23\x24\x79\xc5\x7d\x4c\x5f\xbb\x1d\x52\x0c\x67\x6e\xec\x57\x88\x9d\x87\x00\xfa\x2e\x12\x45\x0b\x3b\xb7\x7b\x7e\xfb\xa0\xe0\xe4\x92\xdc\x39\xfe\xed\x03\xdd\xaa\xee\x6f\x5a\x4f\x43\x62\xe5\xd8\x81\xc3\x59\x0b\xde\x9d\x2c\x8a\x11\x67\x08\xa0\x3d\x91\x28\x3a\x3a\x5c\x2b\x76\xbf\x65\x38\x68\xed\x5d\x46\x1c\xfe\x66\x4c\xc8\x7c\xb1\x3b\xfb\x5c\x96\x9b\xab\x70\xe5\x97\xae\x01\x28\x4d\xe5\x83\x9e\x0c\x04\xd0\x5e\x88\x16\xc0\xb5\xee\xc8\x37\xcd\xcf\x7f\x6f\xa2\x25\x21\x1d\x79\xba\xcf\xeb\x61\x67\xeb\xdd\xa2\xfb\xe4\x0c\x4b\x0d\x28\x8d\x66\x0b\xde\x57\x20\x81\x00\xfa\x1e\xa2\x45\x8f\x6b\x05\x6e\xf2\xad\x7b\xe5\x49\x0c\x4c\x7d\x62\xbe\x53\xe8\xba\xeb\x3c\xed\x4d\x2c\xe8\x21\x4e\x6f\x93\xc3\xa7\xb1\xe6\xcb\xab\x64\x0f\x01\xf4\x7d\x44\x8b\x01\xd7\xca\xfb\xc0\xf3\x45\xe0\xad\x67\x74\x22\xdf\x04\xfb\xdb\xa0\x2f\x6d\xe4\x19\x80\xef\x0a\x3d\x39\xde\x1b\xc7\x68\xca\xc9\x38\x17\x45\x08\xa0\x1f\x20\x5a\x8c\xb8\x56\x25\x4a\xc2\xc8\x35\xe5\x98\x99\xb7\xd2\xf5\xc0\x70\xde\xa6\x4b\x54\x1d\xbb\xc7\x5e\x54\xfb\xab\xa5\xc4\xd9\x42\x23\x6e\xaf\xd4\x20\x80\xf6\x46\xb4\x98\x60\xc7\x78\x2a\xe9\x93\x29\xa7\x67\x2e\x69\xf7\x6d\xc6\x53\x07\x6c\xad\x27\x9f\x7c\xaa\x67\xca\x64\x99\x88\x65\x78\x5f\xdc\xdf\xb2\x29\x06\x01\xb4\x0f\xa2\xc5\x8c\x6b\x31\xc8\xd6\x87\x18\x35\xa6\x52\x4a\x10\x2b\x5b\x7f\xed\x6e\x70\x58\x2b\xc0\xf0\xbb\x3f\xf4\xf2\x70\x97\xe1\x4b\x52\x52\x99\x22\x80\x00\xda\x17\xd1\x3a\x8d\x6b\xb1\x5c\xdc\x79\x38\x71\xb3\x2b\x72\x3f\x70\x4e\xa5\x20\x85\xc1\x57\xd2\x61\xa9\x22\xb2\xaf\xb9\xb5\xb5\x77\x2e\xdf\x51\xf5\x37\xf6\x22\xf6\x10\xc1\x2a\xa3\xfa\xef\x16\xfc\xff\x77\x61\x46\xc7\x02\x3b\xa7\xb8\x6a\x64\xd2\x94\xb6\x36\x5c\xf8\x99\x46\x3f\x22\xb9\xf3\xbe\x55\xec\x27\xde\xb9\xa1\xb7\xea\xf3\x28\x8a\x7b\x1b\x12\xc9\x86\x10\x40\xfb\x21\x1e\xc8\x19\x5c\xcb\xff\x63\x4e\xcf\x58\x15\x01\x61\xd7\xe9\x9f\x9f\xfd\xd5\xb3\x48\x31\x74\xc6\xe4\x97\x97\xb4\x4e\xce\xe7\xff\x9e\x7c\x90\x73\xcc\x02\x02\x68\x08\xd1\x62\xc5\xb5\xc2\x4d\x1f\x6e\x8c\x9a\x2a\x2e\x14\x39\xde\x36\x3c\xd3\xc6\x44\x41\xd7\x9f\x3f\xbf\x98\x35\x92\x69\x28\x5d\x5d\x1e\x87\x71\xe6\x83\x00\xda\x1f\xd1\x62\xc3\xb5\x56\xac\xe2\x3a\x46\x34\xa5\xcf\x71\x57\x25\xdf\xeb\x32\x73\x14\xd1\x98\x0f\x9e\xdc\x65\x0a\xf3\x23\x5a\x3c\xae\x43\xcc\x58\x74\x01\x02\xe8\x00\x44\xeb\x2c\xae\x75\x0f\xed\xf8\xf8\x1b\x9e\x94\xaf\x44\x4b\x82\xc0\x6c\x8a\x44\x88\x87\xd1\xb5\x43\xf6\x97\xa9\x2c\xe9\x3a\xe3\x89\x39\xb7\xa3\x19\x20\x80\x0e\x44\xb4\xce\xe1\x5a\x55\xf5\xdd\xf3\x17\x4d\x5c\x4d\x1f\x5e\x2a\x91\xfe\x5a\xf3\x35\x4e\x3a\xcb\xfd\x5e\xfa\x89\xb2\xe6\xca\x5c\xdf\xa6\xf9\x09\x13\xec\x1b\x38\x08\xd1\x62\xc7\xb5\xb2\xe3\x95\xe5\x80\xbf\x9b\x3f\x1e\x6d\xdb\xc4\x8f\xd9\x4f\x84\x0e\xda\xad\x19\xf4\xf1\xe3\xe3\x2a\x03\x9c\xdf\x7f\xb2\x9c\xb7\x82\x00\x3a\x18\xd1\xe2\xc0\xb5\x8c\x7e\x4c\x7a\xc6\x6b\xee\xa8\x29\x8b\xab\x32\x19\x7c\x14\xfa\xa5\x24\xd0\xa6\x0e\x48\xa2\x88\x30\x5f\xe9\x0e\xe5\xe9\x8b\x5d\x21\x80\x0e\x41\xb4\x38\x71\xad\x73\x17\x4e\x86\x2c\x2c\xfa\x88\x43\xef\xab\xef\x44\x1f\xaf\x29\x0a\x16\xa2\xc7\xbb\x11\x2b\x68\x7a\xcf\x95\xfc\x52\x41\x59\x3d\x3f\x04\xd0\xa1\x88\x16\x17\xae\x25\x3f\xe4\x7c\x96\x21\x83\xf1\xbc\x6c\xa9\x13\x75\x46\xdf\x60\xd6\xb8\xcf\xd9\x5f\xb7\xb8\xa4\x63\xf7\xa8\x24\xd6\x2e\xbc\xd6\xc7\x5e\x1e\xc2\x10\x2d\x6e\x5c\x4b\xd3\xe4\x86\x4c\x81\x0f\x8b\xca\x05\xd1\xd4\x85\xa2\xa7\xbd\x37\xcd\xfb\xaf\x4c\x7f\xa5\x65\x69\x8f\x22\x68\xb5\xbc\xf9\xeb\xa4\x00\x04\xd0\x8f\x10\xad\xf3\xb8\x96\x21\xdb\x01\x6f\xb9\x94\xf2\x31\x13\xd3\xfd\xa0\xe7\x4a\x25\x24\x4b\x7b\xbc\x8d\x11\xcd\xe7\x27\x7e\xde\x12\x70\xd8\xf7\x27\xa5\x85\x00\x3a\x1c\xd1\xe2\xc1\xb5\xfe\x30\xaa\x47\x92\x33\x6e\xf4\xef\x5f\x27\x0e\x11\xf8\xa6\x30\xbb\x38\x4d\x20\x3d\xc6\x9f\x1f\xfd\x4e\x20\x72\xca\xd3\x13\xdf\x03\x02\xe8\x08\x44\xeb\x02\xae\x45\x30\x45\x77\xc5\x44\xc2\x46\xe6\xf9\x79\x6a\x16\x26\x9b\x8d\xeb\x07\x71\x4e\x7d\xe6\x52\xaa\x72\xe9\x2e\x6c\x3a\xb2\xb7\xea\xe9\x20\x80\x8e\x44\xb4\x78\x71\xad\xe0\x12\x7c\x4a\x9d\xf2\xc8\x93\x28\x83\xe6\xac\x3a\xf3\xa6\xcc\xd8\x91\xae\x42\xa2\x95\xd9\x48\x32\xf4\x31\xf9\xde\x1d\x27\xec\x06\x27\x0a\xd1\xba\x88\x6b\xbd\xe8\xc2\xe4\xb3\x79\xc5\xbe\x9f\x97\x29\x17\x48\xaf\xe3\x5f\x6b\xf5\xd9\x33\xa4\x3e\x45\x6d\xe7\x1b\x34\xc3\x2a\xbb\x45\xef\x08\x01\x74\x34\xa2\xc5\x87\x6b\x85\xe5\xe0\x7d\xac\x0e\xde\x54\xdd\x2b\x96\xa6\x4b\x73\xb6\x0e\xe3\xac\xb3\xd6\xfc\x29\xed\x15\x31\xd6\xba\x67\x3c\x56\xba\x27\x05\x01\x74\x0c\xa2\xc5\x8f\x6b\x71\xad\x7d\xb3\x95\xbf\xf2\x8e\xf6\x44\xe3\x2b\xeb\x5f\xc6\x19\x39\x87\xdb\x77\xcd\x7f\xdf\xe7\x23\xbf\xb2\x44\x34\x83\x1e\xea\xc2\x2e\xd5\x62\x11\x2d\x01\x5c\xab\xe4\xce\xa9\x38\x19\x92\xd2\x8e\x71\xe8\xb5\x5a\xa2\xa2\x27\xaa\xf5\xe3\xe7\x5c\x17\x52\x7e\x5b\xab\x37\xe4\x8f\x66\x56\x86\x4e\x40\x00\x1d\x87\x68\x5d\xc2\xb5\x72\x18\x3f\x5f\xb2\xe2\x5e\x19\x9e\x4a\xfe\x4e\x51\xb9\xb1\xd5\xbf\xeb\xd0\xbf\xb7\xe6\xd7\xf7\xe4\x51\x56\xef\x62\xca\x4b\x73\x22\x08\xa0\xe3\x11\x2d\x41\xd8\x72\x54\x79\x34\xcc\xfd\x2c\x9d\xf5\xd7\x73\x86\x46\xdd\xda\xa1\x95\x46\x1a\x23\x04\x16\xd1\x5e\x15\xc2\x3a\x95\xdd\xd2\xb7\x6a\xb1\x17\xd4\xc7\x88\xd6\x65\x5c\x4b\x2e\x63\xb8\x2c\xdd\xc2\x89\x68\xb7\xf4\xf1\xb0\x60\x4d\xd4\xf4\x0d\x7a\x97\x50\xa5\xc6\xe5\xfa\x90\x15\x9b\xa1\x5e\x81\x46\xec\x56\x3c\x01\xd1\x12\xc2\xb5\x42\x82\xee\xd4\x91\xaf\x44\x0a\x1e\x77\xf6\xf9\x75\xf6\x58\x82\x4e\x57\x2b\xc6\x38\xe1\xc3\x20\xf7\xed\xc7\xb1\x65\xa4\xe9\x13\xa7\x21\x80\x7e\x82\x68\x09\xe3\x5a\xa2\x52\x7d\xc4\xdd\x91\x7d\x97\xf3\x85\x4d\x5b\xe3\xd9\x09\x35\x64\x0f\x9c\x47\x7b\x7b\x1b\x33\x4f\x90\x1b\x99\x27\x54\x08\xd1\x43\x00\x9d\x88\x68\x89\xe0\x5a\xb5\x2e\xe9\x27\xbc\xdc\xeb\x76\xca\x39\xfc\x93\x0c\x68\x6d\xed\x3b\x2e\x9d\xaa\x75\xc3\x43\x5f\xf6\x65\xd3\x6b\xb9\xf9\xee\x35\x39\x04\xd0\x49\x88\x96\x28\xae\x55\xfa\x28\x2f\x3c\xae\x5d\x23\x18\x2d\xb9\xc4\x72\x6a\xed\xa7\xab\xc2\xad\x13\xdc\x36\x43\x27\x0b\xed\x44\x56\x6e\xe3\x07\x17\xb8\x43\x00\x9d\x8c\x68\x89\xe1\x5a\x0a\xe5\x44\x1f\x97\x07\x32\x4c\xc3\x68\x7f\xe4\xf2\x1d\xfb\xcd\x98\x7f\xdd\x6e\x7e\x09\x15\x56\x0c\xd6\x0f\x58\x2f\x16\x7c\x35\x80\x00\x3a\x05\xd1\x12\xc7\xb5\x04\x3d\xc9\x95\x9c\x27\x46\xaf\x39\x1a\x0a\x18\xdc\xf3\x22\x5c\x98\x7e\xbb\xac\xe7\x78\x7d\xb7\x5a\x2c\xfe\xeb\x73\xd2\xcb\xa4\x3a\x10\x40\xa7\x22\x5a\x57\x70\x2d\x0f\x1b\xb5\xd7\xb1\xfc\xe9\xba\x8f\x0f\x9b\xf4\x6f\x9d\xaa\x9a\xb4\xbc\xa7\x11\x55\x1d\x19\xa2\x78\x81\x21\xa0\x5a\xa5\xcd\xea\x38\x04\xd0\x69\x88\x96\x04\x6c\x0d\x30\xbd\xb3\x5b\xfe\x87\x03\xa5\xa7\x9c\xbc\xd3\xc6\xe6\x1b\x64\xfd\xd0\x9e\x20\x38\xf9\xc2\x3b\xa7\x63\xfa\xe6\xc2\x0d\x17\xb0\x8b\xac\xa7\x88\x96\x24\xae\xe5\x72\xc2\x8d\xe0\xc3\x90\xb2\xb9\x13\x6f\x70\x02\x51\xfa\xee\xf3\xe1\xba\x3a\xcc\xf7\x86\xa2\x83\x9e\x5b\xf1\x4a\xaf\x31\xa1\xd8\xf3\x44\x3a\xa2\x75\x15\xd7\x6a\xc7\x67\x48\x1a\xd1\x9f\xf5\xfa\x1d\x70\x3e\xd8\xad\xe3\xf8\xc6\xc2\xf2\x97\xa2\x10\x02\x96\x99\x07\xa8\x19\x0e\x2a\x96\x0b\xea\x10\x40\x67\x1c\xb1\x60\x3b\xea\xb6\xeb\x5f\x0b\x36\x29\xdc\x1f\x7e\xf9\x79\xbb\x68\xbc\x0c\xc1\x97\xf0\xd6\xc2\xda\x93\xd9\xce\xb6\xbc\xa2\x22\x94\xfd\x92\x15\x7b\xb7\x17\xd8\x48\x26\x29\xfa\x08\x21\x80\xce\x44\x3c\x10\x69\x5c\xab\x50\x25\xc5\x34\xc8\x94\xd5\xfe\x6e\x7f\x50\xcd\x61\x56\xd1\xa0\x3c\xa3\x1d\x81\xa5\xac\x1e\x23\x67\xef\xbe\xeb\x0d\x72\x45\x32\x08\xa0\xb3\x10\x2d\x19\x5c\x2b\xee\x7c\xb6\xff\x7e\xec\xbc\xc3\xa6\x3f\xe4\x7a\x52\xac\xc0\xb1\xaf\xa6\xec\x89\x4b\xce\x68\x25\xdd\xb8\x7a\xdd\xe1\x5a\x31\x0a\x02\xe8\x6c\x44\x4b\x16\xd7\x12\x38\xf0\xca\x75\xff\x96\xcd\x9b\x4f\x90\xb0\xc1\x63\x44\x3f\xfc\xdc\xad\xf3\x01\x17\xde\x07\x51\xbd\x0e\xd7\xf6\x0a\xe8\x87\x29\x04\xd0\x39\x88\x96\x1c\xae\xc5\xc7\x9b\x8d\xef\x63\xbe\x17\x54\xa3\x95\xf1\xa7\x37\x88\xa9\x3f\xfc\x55\xbd\xa6\x97\xf7\xca\xb6\x20\xde\xb7\xa0\x34\x10\x29\x04\x01\x74\x2e\xa2\x25\x0f\x5b\xcc\x6c\x85\xfa\xbe\xe3\x35\x75\x57\x21\x19\xa4\xf8\xe8\xf6\x66\xc7\xf0\x46\xf9\x9b\xbc\x6f\xef\x2e\xc6\x70\x4e\x64\xbf\x7a\x79\x1a\xbb\xc0\xcd\x43\xb4\x14\x70\x2d\xc9\x60\xc6\x29\xc9\x47\x56\x98\x1c\x25\x13\xd1\x95\x60\xca\xf9\x99\xc0\xca\x06\xd7\xb3\xbe\x15\xb5\xc9\x7d\xbc\xec\xbb\x3a\x5c\x10\x40\xe7\x23\x5a\x8a\xb0\xc9\x6d\x1b\x25\x9f\xc4\x56\xf6\xf4\xba\x7d\x64\x7c\xa7\x43\x93\xe5\x9e\xd2\x7e\xf2\xf4\xd3\xe4\xaf\xae\x5d\x0e\xf5\x78\xc9\x04\xd8\xc9\x5d\x80\x68\x29\xc1\xee\x38\x51\xa6\xda\x25\x26\x2a\xca\x05\x10\xb4\x10\xfd\x0a\x51\xb2\x27\xa6\x2c\xaa\x95\x16\xfc\x32\x7e\xf6\x53\xca\xb8\xb1\x69\xb9\x1d\x04\xd0\x85\x88\x96\x32\xae\xc5\x4c\xde\x58\xbd\xbb\x76\xdc\xa5\x03\x2f\xcf\xac\x7e\x93\x7f\xce\xab\x35\xbd\x35\xe2\x76\x3f\x47\x43\x47\x04\xb7\xc1\xe9\x61\x66\x08\xa0\x9f\x21\x5a\x2a\xb8\x96\xef\x28\xe4\x6f\xce\xe6\xeb\x7b\xd3\x6d\xf6\xd3\xb9\x82\x92\x8f\xa7\x1d\xdd\xad\x4f\xa6\x36\xa6\x6a\x36\x6a\xad\x06\x13\x70\x61\x2f\xce\x45\x88\xd6\x35\xd8\xad\xb0\x3e\xdd\xeb\x57\x50\x4c\x23\x24\xaf\xef\x00\x3a\xf3\x0d\xc8\x2f\x27\xef\xa7\x3f\xbb\x4a\xc4\xde\xa8\xe9\x5e\x07\x81\x1b\x1a\x02\xe8\x62\x44\x4b\x15\xd7\x5a\x62\x74\x5b\x0c\xa4\x9f\x24\x96\x60\xbc\x1f\xa1\x67\xee\x1c\x4f\x36\xc1\x41\xb9\x65\xbe\xc7\x50\x4e\x6c\x22\x1f\x9c\x5d\x2b\x01\x01\xf4\x73\x44\x4b\x0d\xd7\x7a\xde\xae\xd3\x1e\xd1\xac\xa3\x7f\x51\x3e\xcc\x89\x28\xc4\x44\x38\x79\x8e\xd3\xa0\xc2\x53\xdb\x42\x21\x5e\xc1\x4d\x7f\x2a\x49\x1b\x02\xe8\x12\x44\x4b\x1d\xb6\xab\x0c\xfc\x11\xc2\xfa\xd2\x84\x09\x1c\x37\xbe\x7d\xef\x9b\xaf\xbf\xa8\x55\x18\xa7\xaf\xaa\x38\xf8\xd3\x6a\x2d\xd2\xc9\x17\x21\x02\x01\x74\x29\xa2\x75\x1d\xd7\x52\xc3\xff\xa9\xa1\x5d\x7a\x7d\xa0\x83\xeb\x26\x7f\x77\x5c\xf0\x00\xf9\xe2\x89\x00\xa1\x3c\x96\x95\xe0\xf7\xe6\xbf\xc8\xb9\xcd\x99\x20\x80\x2e\x43\xb4\x34\x70\xad\x0d\x6b\x95\xfb\xf9\x6f\x7c\xaf\x96\x94\xeb\xe9\x37\xdf\x64\xa6\x1c\xd1\x72\xbc\xfe\xa7\xa8\x3c\x51\xbe\x12\x13\x94\x9a\xcb\x80\x3d\xe7\x94\x23\x5a\x9a\xb0\x45\x69\xfe\x21\xdd\x72\xfa\x86\x2a\x39\x69\xf5\x6b\xe9\x97\xfb\x5f\xc9\x3a\xd7\xef\x6d\x27\x96\x54\x04\xb5\xff\xe8\xa4\xc1\x7f\x85\x5d\x64\xbd\x40\xb4\xb4\x70\x2d\xfe\x29\x71\xfe\x0c\xf7\x31\x6d\xc9\x29\x69\x3a\x3a\xf5\x2b\x43\x6d\x8f\xbf\xb5\x37\xe6\xa5\xdb\x65\x18\x0f\xd4\xe6\xc8\x08\xdc\x80\x00\xba\x02\xd1\xd2\xc6\xb5\x7e\xad\x7b\xdf\x78\xaa\x19\x6f\x59\x41\x29\x21\x13\xb7\x6b\x2d\x78\xfb\x8a\xd2\xca\x8d\x35\x71\x6b\x05\x96\xf7\xf7\x72\xfc\x02\xb0\x0b\xdc\x97\x88\x96\x0e\xae\xd5\xcb\xca\x16\xf4\xf2\xdb\xcb\xe5\xab\x39\xe5\x1d\x66\x35\x27\x19\x92\xd3\xbe\xdb\x5b\xd9\x54\x54\x5f\xad\xff\x71\x55\xeb\x7d\xcd\x79\x08\xa0\x5f\x21\x5a\xba\xb8\x96\x9b\x9f\x8c\xcf\x7d\xf7\xe9\x5f\x25\xa6\x7f\xc0\x2c\x67\x48\x7e\xa7\xf2\x15\x63\x79\xee\x52\x59\xb7\x5b\x46\xa3\x93\x37\x45\x64\x20\x80\xae\x44\xb4\x6e\xc0\xae\x1d\xa8\x6d\xfc\x4b\xd1\x7f\x8c\x22\x4d\x4a\x6b\xcc\x43\x62\x34\x9c\xdf\xda\xc9\xe1\xe5\xb3\xb9\x76\x69\x75\x1c\x2b\x7e\x25\x88\x7d\x6f\xbf\x46\xb4\xf4\x60\x1b\x61\xf4\xe3\xb0\xac\xdd\x4f\x55\x79\x95\x3b\xdb\x6e\xa4\x61\xad\x23\xe5\x04\x0f\x1d\xa9\x47\xd8\xca\x74\xd4\xce\x7f\x1f\x9e\xe6\x85\x00\xba\x0a\xd1\xd2\xc7\xb5\x26\x2c\xb7\x84\xee\x7b\x1b\xc6\x0c\x5b\x5e\x24\xb8\xc1\x42\xca\x74\xf9\xee\x9d\xf5\x5b\x6f\xef\xbc\xba\xe4\x28\x69\x48\xd5\x9d\x82\x9d\xf7\xd5\x88\x96\x01\xec\xe6\xf4\x69\x4d\x73\x66\x16\x3f\xa9\xf6\xb1\x57\x3e\x8d\xa4\xe5\x66\x9b\xab\x39\xc3\x91\xd4\x5c\xf2\x24\xb1\x9d\xcf\xfa\xc5\x2e\x62\x37\x63\x35\x88\x96\x21\xae\xc5\x9a\x81\x8e\x56\x6c\x14\x7a\xf4\x5c\xcd\x27\x1e\x2f\x65\xd0\x99\xe8\xe5\xbc\x36\x83\x34\xa9\x2e\x7b\xf0\xf2\x25\x1a\x4f\x51\x4a\x08\xa0\x6b\x11\x2d\x23\x5c\xcb\x5d\x4f\x45\x65\x56\xe5\x0a\xc9\xee\x67\xb5\x88\x22\x2b\x9a\x77\x51\x2b\x5b\x93\xde\xc2\xb7\xe2\xfa\x3a\x5b\x5e\xbe\xe8\xae\xc2\x6e\x38\xeb\x10\x2d\x63\xd8\x31\xee\x07\x8e\x6b\x06\x84\x44\xf4\x4d\x46\x27\x3d\x8a\x9a\xdb\x69\x78\x70\xde\x76\xd2\xf7\x8e\xe1\x70\xe2\x4e\xeb\xba\xad\x8d\x3d\x04\xd0\xf5\x88\x96\x09\xcc\x7a\x15\xdb\x78\xae\x86\x8e\x50\xf2\x13\xb5\xdf\x64\x19\x87\x06\x81\x63\xaf\xe1\x02\xd7\x70\xc1\xdc\xf7\x7c\xea\x77\xb5\xbf\x2f\x40\x00\xdd\x80\x68\x99\xc2\x2c\x71\xbe\x66\xd7\x91\xd2\xea\xf7\x36\x83\x18\x17\x37\x4f\x66\x81\x1f\x9a\x41\xef\xa0\x37\x28\x59\xf5\xc9\x92\x6e\x36\x06\x4b\x08\xa0\x1b\x11\x2d\x33\x5c\x0b\x4f\xc7\x80\xf8\xa0\x20\xff\x23\xd1\x67\xca\x33\xea\x6b\xcc\x87\x51\x92\x6c\x6c\xe1\x02\x6e\x9d\x31\xba\x4b\x89\xef\x0e\x58\xc5\x21\x80\x6e\x3a\x62\xc1\x76\xd4\xc3\xef\xbf\x16\x6c\xe6\xb8\x3f\x3c\x74\x6d\x5d\x81\xda\x36\xa0\xc4\x41\x44\x7d\x9a\xc0\x68\x2f\xfa\x7b\x78\xe8\xd8\x78\x85\xcf\xf7\xa6\x36\xe9\xa2\x3e\xa2\xb3\xd8\x15\x71\x33\xe2\x81\x58\xe0\x5a\x84\xc4\x8e\x7a\x75\xcd\x8e\xdf\x6e\x05\x2d\xa6\x69\x9d\xc9\x0c\x70\x22\x9d\x13\x66\xb8\xbe\x8c\x79\x53\x13\xcb\x71\x73\x08\x12\x86\x00\xba\x05\xd1\xb2\xc4\xb5\x54\x2f\xbd\x79\xc2\x62\xc4\x11\xb7\x26\x73\x9d\x86\xab\x33\xfe\x30\xe1\xf7\xa2\xdb\xe7\x64\xe5\x4e\xa3\x0a\xe5\x30\x60\x4d\xa9\x04\x01\x74\x2b\xa2\x65\x85\x6b\x69\xcf\xbd\xf7\xfb\xc1\xf3\x3c\xed\xa5\x39\xb1\xea\xd3\xd6\x57\x33\xce\x7e\x9d\x3f\x38\xe9\x19\x8c\xd6\xf1\xbf\x37\x8b\x0f\xad\xb0\x42\x00\xfd\x06\xd1\xb2\x86\xdd\x01\xd1\x1d\x5e\xd1\x32\x9a\x14\x41\xff\x59\x6e\x4b\xfd\xd6\x96\xe3\x69\x65\xb5\xce\xd9\x51\xf2\x9a\x4f\xe6\x87\xbe\xb4\xd4\x63\xec\x8b\xd5\x86\x68\xd9\xe0\x5a\x0f\xe2\x69\xaf\xf2\x56\xf1\x91\x1f\x8e\x76\xc4\xbb\x87\x9e\x76\xa8\xf5\x23\x3f\x8e\xe9\x1f\xb7\xab\x53\xe2\x0b\xd0\xe1\xb1\xc2\x4e\xc8\x76\x44\xcb\x16\xd7\x1a\x3e\xa3\x48\x61\x63\x3d\x5e\xd1\xe7\xa2\x3f\xe5\xee\x34\x78\xee\xf2\x34\xb4\x09\xbd\x62\xa5\x7c\xfd\x7b\x85\x6f\x78\xfc\x31\x35\x04\xd0\x1d\x88\x96\x1d\xec\x99\x09\x6f\xc0\x63\xf3\x4f\x2e\xec\x39\x04\xba\x11\x97\xc5\x73\x45\xb6\xa2\xaf\x8e\xcb\x9d\x08\x9b\xa1\xb6\x68\xad\x4a\x67\x8c\xc1\xbe\xe9\x3a\x11\xad\x9b\xb0\x0b\xfd\xf7\x8d\x19\xab\x62\xd6\x19\x15\x67\xb3\x2e\x51\xca\x50\xb7\xbb\x97\xec\x25\x69\x8e\x79\x25\x02\xe6\x14\x8f\xc2\x81\x16\xec\x2e\xbc\x0b\xd1\xb2\x87\xfd\xbb\x14\xab\x54\x6b\xa3\x33\x52\x9e\xe1\x31\x9a\x4f\x57\x13\x3c\x4a\xa6\x70\x55\xf4\xe1\x2b\x33\xc9\x25\xbd\xa1\xad\xee\x67\x29\x0b\x01\x74\x37\xa2\xe5\x80\x6b\x91\x77\x9f\x0b\x3f\x95\x71\x59\xff\xf4\xd9\x96\xf5\x35\x07\xb5\x8c\xb7\x66\x4f\x6c\x54\x84\xbe\x0f\x9f\x4d\x0f\xef\xc9\x64\xed\xc5\xce\xaf\x1e\x44\xcb\x11\x76\xd7\x42\xcf\x95\xe0\x46\x81\x99\xe2\x42\xbf\x8f\xaa\xfc\x60\x0a\x7a\x47\x83\xc4\x8e\xce\x38\x38\x46\xcb\xcf\x92\xd1\x7e\x81\x02\x3b\xbf\xde\x22\x5a\x4e\xb8\x56\x7e\x73\x5a\xfc\x9c\xe9\xb9\x86\xaa\x0e\x2a\x67\xca\x6c\xe2\xd1\x2f\x06\xfe\x7a\x37\x6d\xde\x1f\xd0\x94\x35\xd0\x9e\xb5\x38\x8b\xbd\x40\xf4\x22\x5a\xce\xb0\x9d\xe0\xd9\xe2\x00\xe2\x94\x02\x7b\x48\x02\x7d\x81\xd1\xf1\x66\xfb\xe5\x14\x4d\x7b\x42\xca\x0a\x69\x2a\xed\xce\xbd\x48\x85\x40\x16\x08\xa0\xfb\x10\xad\x5b\xb8\x56\x14\x99\xd6\x10\x5e\x02\xd5\xea\xb5\xbc\x87\xd9\x73\x41\x8b\xb7\xa9\x19\xb9\xdc\xce\x3e\xc0\x63\xfa\xbd\x4a\x28\xed\x7c\xe9\x27\xf6\x22\xd8\x8f\x68\xb9\xe0\x5a\x99\x14\x92\xa0\xff\xf0\x77\x22\x3a\xcb\xa5\x2b\x54\x68\x45\x18\x93\x48\xec\xcb\xf8\xf4\x15\xf1\xae\x74\xab\x5e\x04\xc5\x81\x1a\x04\xd0\x03\x88\x96\x2b\xec\xfc\x65\x2f\xbb\x3d\x7c\x33\xc6\x9f\xa0\x9a\xb2\xa2\x2b\xd4\x58\x86\x16\xe5\xb4\x64\x9a\xeb\x6a\x78\x92\x5b\xfb\x4a\xfe\x75\x1d\x3c\x08\xa0\xdf\x21\x5a\x6e\xb8\xd6\x05\xd2\x27\xde\xfd\xe9\x46\x57\x9a\x6a\x1b\x6f\x58\xd4\x15\xd7\xb2\x76\xcc\xad\xa7\x61\xfc\x64\x95\xb8\xc7\xf2\xca\x1a\xbe\x9e\x86\x00\x7a\x10\xd1\x72\x87\x5d\xe8\xc7\x8a\xfd\x55\xbf\x7f\xf6\x9b\xa9\x5b\x7a\xfc\x73\xf0\xa0\xed\xcf\x6c\x7a\xfd\xfd\x46\xee\xd8\xb0\x77\x43\x57\x7a\xb5\x1d\x14\x21\x80\x1e\x42\xb4\x3c\x70\x2d\x94\x86\xe2\xcc\xb6\xa8\x05\x13\x34\xae\x16\x42\xad\x24\x75\x4e\xd0\x2e\xa1\xf7\xc6\x3b\xea\x90\x33\x44\x21\x56\x59\xbf\x79\xb1\x8b\xbf\x61\x44\xeb\x36\xae\x85\xcf\xaa\x3c\x34\xb0\xd7\x7f\x4d\x2b\xa6\xe7\x13\xbe\xf8\x7b\xc6\xee\xdc\xf0\x8b\x5f\xb4\xea\x4f\x7c\xb0\x3a\xdd\xde\x9e\xe0\x8f\xdd\x40\x8d\x20\x5a\x77\x60\x0b\x6f\x79\x7b\x82\x08\x43\x7e\xf2\x8b\xeb\x44\x3a\x77\xe7\x15\x73\x3e\xaa\xb8\x7f\x34\x5f\x2f\x95\xbd\xfb\x89\x23\x72\xcd\x52\x87\x0f\x02\xe8\xf7\x88\xd6\x5d\xd8\x67\x70\x68\xbc\x1e\x0c\xf5\x38\x5d\x0d\x26\x3c\xa5\x34\x68\x73\xbf\x2d\x45\xd4\x50\xae\xd2\xdc\x77\xa2\xaf\xcd\xe7\x3e\x91\x41\xab\x0a\x04\xd0\xa3\x88\x96\x27\xae\xd5\x97\x44\x96\xc7\x38\xa1\x10\xe1\x12\x9f\x1c\x60\xff\x34\x99\xbb\x57\x60\x7a\xa3\x61\x54\x74\x64\x97\x8f\xa7\x64\x4e\x7a\x53\x1d\x02\xe8\x31\x44\xcb\x0b\xd7\xba\xc4\x75\x6b\xf2\xf6\xb9\xdf\x9f\xbb\x08\x5b\x64\xc2\xc9\x06\x0c\x2f\x06\x77\x46\xbd\x8a\x47\x7d\xa9\xf3\x7e\x3b\x22\x64\xf8\x03\x03\x01\xf4\x38\xa2\x75\x0f\xf6\x48\xf4\x0e\x55\x6b\x89\x4f\xd5\xbd\x93\x37\x06\x5f\xf9\x3d\xd8\x55\x7b\xf8\x2a\x41\x58\x0f\xbd\x7d\x37\x36\xd5\xdd\xca\x8c\x4e\x81\x0d\x02\xe8\x09\x44\xeb\x3e\xae\xd5\xcf\x62\x77\x35\x41\xf6\xa1\xb0\x7b\x85\x1e\x7d\x6d\x11\x8b\x96\xde\xd2\xba\x64\xe9\x6a\x60\xf1\x7d\xf5\x93\x31\x9a\x67\xbe\x9a\x42\x00\x3d\x89\x68\x3d\xc0\xb5\x3e\x8c\x30\x35\x4f\xc9\x52\xf5\x27\x92\xfd\xac\xef\x53\xc5\x17\xf7\x30\x48\x3e\x58\xb3\xc7\xa3\xe6\x28\xac\x60\x20\x1f\x7e\x22\x0d\x01\xf4\x14\xa2\xe5\x8d\x6b\x65\x31\xf6\x5f\x71\xe0\xfa\x1a\xaa\x9a\xdb\x92\xa7\x96\xbf\xe9\xbe\xff\x32\xdf\x23\x76\xae\x54\x3c\xc9\xe1\xa1\xd6\x84\x5e\xbc\x1e\x04\xd0\xd3\x88\x96\x0f\xae\xc5\xed\x2d\x73\x51\xb1\x55\x90\x27\x4c\x05\x23\xcf\x72\x6b\x45\x87\x8b\xf2\xed\xa8\x26\xcd\x7b\xf5\x66\x3b\x1a\x62\x83\x93\xcd\xd8\xb5\xc9\x07\x44\xcb\x17\xd7\x7a\xac\xb6\xcc\x54\x5d\x1a\x50\x17\xc6\xab\x5e\x16\x28\x4a\x13\x94\x23\xb0\xbe\xc1\xb0\x59\x31\xa4\x01\xca\x86\x13\x7e\xbe\xb3\x81\x00\x7a\x06\xd1\x7a\x88\x6b\xb9\xce\xb0\x94\x28\xb0\xa1\x39\xce\x9b\x30\xbd\x6d\xe8\xbe\x13\xf7\xb8\x94\xf4\xcd\x89\x0b\xd9\x6d\x74\xfe\x0c\x62\xc7\x54\x25\xb0\xd7\xb4\x8f\x47\x2c\xd8\x8e\xfa\x08\xe2\x5f\x0b\x36\x3f\xdc\x1f\xfe\x8d\x62\xcb\x97\x2d\xeb\xd3\x0d\x87\xd8\x85\xf3\x82\x49\x5d\x3d\x3d\x64\x7a\x1e\x3d\xb4\x2c\x4b\x12\xc6\x8c\xa7\xb2\x67\x26\x19\x21\x80\x9e\x45\x3c\x10\x08\xf6\xb8\x50\xf8\x78\x76\xb0\xdf\xa7\xeb\xa7\x98\xe8\x26\x88\xdd\xca\xd9\x62\x52\x3c\x83\x8b\x28\x9e\xef\x0d\x9d\x3f\x5d\x65\xc3\x1a\x84\x3d\xe1\xcd\x21\x5a\xfe\xb8\x56\x40\x84\x19\x7e\xf1\xb5\xd7\x79\x63\x99\x01\x29\xba\x39\x2b\xc2\xfe\x75\xee\x6b\xaa\xa4\x99\xb6\xa5\x07\x3b\x36\x36\xe4\x96\x54\x10\x40\xcf\x23\x5a\x01\xb0\x49\x24\x16\x73\xc1\x66\x7b\x48\x8b\x20\xf2\xf4\xfd\x09\x95\x88\x5b\x97\xdb\xcf\x72\x5f\xab\x2d\x91\xa6\xa6\xe9\x3b\x13\x19\xb3\x60\x0e\x01\xf4\x02\xa2\x15\x88\x6b\x39\xf1\xdc\x99\xd3\xd9\x92\xd5\xdb\x8b\x32\x90\x21\xcc\x9b\x3a\x9e\xd3\xfb\x51\x5f\xf9\xe9\x9b\x80\xe2\xac\x7e\x69\x92\x87\x37\x98\x20\x80\x5e\x44\xb4\x82\x60\x8b\x86\x9b\x9d\x7b\x79\xc6\xd4\xc5\x2f\xd8\x48\xaa\x24\xbe\x5a\x40\x17\xc8\xa8\x1c\xdd\x34\x7a\x42\x42\xbc\x76\x4a\x1c\x42\x8a\xb0\xbf\xfb\x25\x44\x2b\x18\xb6\xf8\xf3\x13\x09\x6e\x15\xa0\xe7\x5e\xd2\xaa\xf8\x12\xe7\x4e\x7e\x62\xb9\x5c\x3f\xdb\xe3\xf6\xe3\x31\xf2\xc9\x97\xb9\xd1\x04\x31\x06\x10\x40\x7f\x42\xb4\x42\x70\x2d\x91\x7a\xb9\x12\x31\xd7\x21\x5f\x99\x22\xe8\x81\x20\x0d\x57\xa8\x64\xf4\xe3\x5c\xa6\x33\x51\xdf\xad\x01\xa9\xac\x68\xa6\x18\xf6\xe4\xb9\x8c\x68\x85\xe2\x5a\xc2\x3f\xc2\xae\xbc\x09\xb0\x19\x3a\xb9\xf7\x94\xfa\x59\x2c\x95\xfe\xcc\xfb\x27\xf8\x6c\xfd\xe4\xb6\xa7\xfd\xee\x11\x31\xa8\x94\xb9\x42\x00\xfd\x19\xd1\x0a\xc3\xb5\xea\xee\x9a\xb0\x35\x12\x93\x72\x38\x0b\xd6\x0e\xdb\xf5\x94\x58\x7e\x11\x51\x5c\xba\xda\xd3\x79\x8a\xa9\xfc\xa4\x53\x64\xca\x4b\x32\x08\xa0\x57\x10\xad\x47\xb8\xd6\xf2\x4e\xa0\xee\x74\xf2\x35\x73\x26\x19\xf1\x8f\x05\x16\x42\x12\xbc\xca\xeb\x51\x22\x74\xeb\x03\xca\x1e\x5f\xf5\x51\xf7\x63\xb0\x6f\xba\x55\x44\x2b\x1c\xd7\x52\xb6\xfd\x2d\x4a\xf3\x72\xf2\x96\xee\xb5\xc8\xe8\xf8\x30\xed\x51\xf9\x05\x57\x32\xa6\xe9\xa2\xc8\x93\x2c\x1f\xe6\xbd\x12\x59\x29\x20\x80\x5e\x43\xb4\x22\x70\xad\xa0\xbc\x95\x98\xcb\xf2\xe5\x8b\xe3\x69\x4b\x17\x87\xbf\xdf\x6e\x5e\x88\xab\x4e\x28\x47\x89\x31\xbf\x9c\x88\xef\x0b\x18\xe1\xb7\x85\x00\x7a\x1d\xd1\x8a\x84\x7d\x14\x40\x63\xb4\x4a\x53\xf1\x6c\x9e\xc2\xab\xb8\x77\xfa\x0d\x27\x95\x66\xab\xb9\x27\x49\x1f\xda\x65\x3d\x4b\x7e\xcd\x26\x57\xc5\x82\x9d\x13\x1b\x88\x56\x14\xae\xa5\x74\xfc\x30\xc4\x78\xa0\x9d\x94\xfd\x5d\x16\xd3\x7c\x34\x81\xef\xca\xb3\x76\xfc\xbb\x29\xc6\x42\x19\x95\x34\xab\xe7\xd7\x27\xf1\x21\x80\xfe\x82\x68\x45\xe3\x5a\x96\xce\x35\x63\x1f\x56\xda\x35\x04\x28\x25\x48\xcd\x5b\x76\x19\xa4\x2f\xf8\xd1\x1a\xb6\x88\xbd\x7c\xd0\xff\x20\x7b\x49\xc4\x40\x13\x02\xe8\xaf\x88\x56\x0c\xae\x65\xd0\x13\xe7\xfc\x96\xd7\xc4\xef\xd6\xee\x1e\x69\x04\xbd\xb5\x88\x7b\x99\x55\x64\xf5\xcc\x79\x31\x8e\x3e\xa1\x79\x7a\x21\x0a\x76\x08\xa0\x37\x11\xad\x58\xd8\x9d\x2c\x91\xcc\x40\x36\xeb\x5e\x4d\x37\x67\x9f\x07\x0f\xae\x7a\xc9\x28\x0e\x08\xe9\x53\x8b\xad\x71\x26\x3f\x8f\x72\xbc\xa8\x83\xe6\x81\x00\xfa\x1b\xa2\x15\x07\x7b\x94\x76\x42\xba\x6b\x83\xe0\xde\x27\xde\x7b\x33\xa6\x76\xae\x6b\x13\xc7\xcf\x7e\xd6\x32\x2f\x3c\x73\xc0\x11\x98\xde\x96\xa3\xe6\x8d\x5d\x78\x6f\x21\x5a\xf1\xb8\x56\xa3\x98\xe3\xcf\x0a\x74\x41\xf4\xb9\x53\x22\xb9\xb6\x89\x34\x9f\x05\xb5\xce\x86\x19\x3e\x26\xf0\x78\x72\xe3\x83\x53\x4b\xc0\x63\x39\x08\xa0\xb7\x11\xad\xc7\xb8\x96\x97\xea\x89\x64\x56\xde\xf7\x87\x8b\x69\x0b\x79\xc5\xd1\xfe\x5b\x0c\x69\x0f\xf3\x3f\x74\xc6\xbf\x6e\x51\xf8\x55\x34\xa2\xf2\x0b\xfb\xfb\xda\x41\xb4\x12\x70\xad\x56\xfc\xdd\x95\xda\xf4\xda\x20\x2a\x4f\x06\xcb\xe7\xbe\xa5\x49\x4b\xf9\x97\xcc\x06\x5b\x12\x1f\x97\xdd\x52\x37\xe0\x36\x7f\x81\xfd\x77\x7d\x47\xb4\x9e\xe0\x5a\x0e\x8d\x29\x59\xbc\x51\xa7\xd4\x4a\xa3\x1b\xce\x3c\xb0\x53\xe9\x76\x9c\xe0\x7d\x36\xa9\x99\xc3\xaa\x99\xf6\x69\xe7\x90\xf1\xbe\x19\x04\xd0\x3f\x10\xad\x44\xd8\xe6\x55\x2d\xc5\xd0\x6c\x03\xea\x2f\xa5\x3f\x7d\xc6\x35\xe8\xec\x81\xdf\x2e\xe9\x03\x8f\xfb\x67\x98\x09\xe9\xf6\x1b\x58\xe8\x2f\x2b\x40\x00\xbd\x8b\x68\x25\xc1\xae\x43\xae\x73\x42\x9b\xc6\x9f\xcb\xa6\xf8\x9a\xbc\xdf\xe3\x2f\x05\x65\xc6\x1a\x0a\x5e\xd2\xdd\x1c\x9f\xfd\x23\x3c\x44\xc1\x28\x66\x05\x01\xf4\x4f\x44\x2b\x19\xd7\x32\x35\xf8\x7d\x71\x95\xdd\x58\x6e\xee\xe6\x0c\x29\x73\x29\xd5\xe2\x42\xe7\xb7\x03\xf2\xd5\x56\xf1\xc6\x80\xe7\xab\x1d\xbc\x40\x17\x02\xe8\x3d\x44\x2b\x05\xf6\xf1\xa3\xe3\xbf\x1f\x30\x34\x5f\x78\xb2\xe8\xc5\x18\x67\xd5\xcb\x21\x2d\x29\x3e\xd0\x8b\x27\xfe\x94\x31\x9c\x3d\x9b\x6b\x82\x6e\xe8\x3a\x04\xd0\xfb\x88\x56\x2a\xae\xf5\x70\xb8\xef\x4a\x10\xcf\x61\xba\x4b\x36\xdb\x7a\xa4\xfd\x41\x64\x8d\x13\x3d\x51\xd3\x93\xc3\x97\x95\xa3\x03\x77\x7b\x5c\x77\x0c\x21\x80\xfe\x85\x68\xa5\xc1\x3e\xb6\x72\xe9\x59\x4d\x1a\xde\x69\xb1\x1f\x02\x77\xa5\xf4\x3f\x08\x79\x1d\x76\xd3\xf5\x5b\xb1\x7b\x0a\x4c\xcd\x76\x5a\x4d\xe1\x05\x9c\x87\x00\xfa\x00\xd1\x7a\x8a\x6b\x2d\x04\xc8\xd6\x9e\x26\xb2\x6c\xd1\x1f\xcd\xa1\x2f\xb0\x93\x58\x1b\xd6\xff\x15\x47\xfa\xbb\xc1\x7e\xbf\x1b\xdd\x66\xe5\xc7\xc1\x0f\x01\xf4\x21\xa2\x95\x8e\x6b\xdd\x3a\x56\xe2\x26\x43\x96\x21\x16\x3d\xa6\xd4\x3d\x1b\xae\x95\x99\xc3\x4e\x8c\xd6\x7c\xf4\xad\xbb\xfb\xbb\x46\x67\xf1\x74\xc3\x19\x08\xa0\x7f\x23\x5a\x19\xb0\xf7\x63\xd0\x1e\x9f\xe4\x58\xa5\x30\x3e\x8f\xc4\x0f\xb7\xee\x97\xfe\x83\xeb\x65\x5c\x59\xd6\x12\xc4\x78\x8b\xa1\xba\x37\xfd\x2f\xde\x82\x00\xfa\xcf\x11\x0b\xb6\xa3\xfe\x10\xe4\xaf\x05\x5b\x26\xee\x0f\xd7\xaf\x77\xc6\x3f\xa5\xe7\x76\x72\x2f\xb9\x25\xea\x17\xef\x18\x6f\x06\x8f\xfe\xc2\x8d\x04\x2e\x5e\xfd\x58\xde\xb1\xb9\x57\x18\x09\x08\x60\xf0\x10\x0f\x24\x0b\xd7\xea\x19\xbb\x6a\x16\xba\x28\xf1\xd1\xee\xbe\x5f\xb6\x58\xc7\xbe\xca\xeb\xd5\xb5\x0b\x94\x36\xc6\x18\x9f\xac\xaa\x63\x51\xf4\x84\xda\x10\xc0\xa0\x10\xad\x6c\x5c\xeb\xd4\xea\x20\xc3\x85\xd3\x6b\x99\x6d\xa2\x3e\x96\x99\x4f\xa4\xd6\xb6\x5e\xf7\x3c\xd3\xcd\xbe\x46\x2b\xf7\xc3\xa8\x29\xf5\xf5\xc8\x09\x08\x60\xf0\x11\xad\x1c\xd8\xed\x63\xbf\x04\xe6\x84\x07\xd5\x17\xb9\xf0\xca\x82\x8d\xe6\xdc\xdf\x5e\x7b\x6d\x24\x19\x5a\xcf\x2f\xc4\x38\xa0\x65\xb5\x1b\xee\x6f\x0a\x01\x0c\x01\xa2\x95\x0b\xdb\x39\x57\xfc\xf1\xda\x52\xd3\x58\x74\xef\x7c\x6b\xfa\x64\xb5\x52\x83\x70\xa4\x5a\xd7\x7a\x2e\xbf\xa6\xd4\x71\x3e\xf5\x37\x6d\xb4\x2d\x04\x30\x84\x88\x56\x1e\xae\xf5\x83\xdf\x48\xa4\x21\x78\xe2\x94\x1b\xc6\xf0\xb7\x67\x6e\xf6\x0b\x57\xcb\xe7\xe6\x0f\x0a\x25\x67\x96\x2e\x37\x55\x7c\x8c\xf7\xe4\x82\x00\xe6\x18\xa2\x95\x8f\x6b\x01\xad\x8e\x72\xb3\x5a\x47\x92\x38\xcf\xd1\xc7\x24\xfb\xdd\x5c\x2f\x76\xc8\xac\x4b\xcd\xe9\xfa\xce\x5f\x6e\xf6\xd3\xf4\x67\x16\x87\x00\x86\x08\xd1\x2a\x80\x3d\x12\x0d\xfe\x74\x6c\xe7\x38\xe5\xcd\xdc\x0b\x72\x04\x50\x9e\x95\xad\xdc\xa9\x15\xae\x53\x36\xf6\xee\x9a\xb3\xf7\x7e\xd7\xc5\x6c\xf2\x42\x00\x43\x8c\x68\x15\xe2\x5a\xc7\x8a\x7e\xaf\x47\x5e\xd2\x98\xb2\xd9\x8f\x0a\x68\x3f\x17\xec\x3d\xe0\xcb\x5a\x75\x8e\xb1\xd8\x4f\x67\xd2\xca\x99\xee\x59\xb4\x15\x04\x30\x24\x88\xd6\x33\x5c\x6b\xa4\x2b\x75\xde\xdf\x5d\xe7\xaa\xa4\xb7\x66\x45\x91\x08\xd3\x6c\x44\x91\x02\xea\xee\x23\x32\xfe\xdb\x96\xaa\xd1\xa9\xb6\x1c\x7a\x10\xc0\xa0\x11\xad\x22\x5c\x6b\x91\x2a\xb2\x6e\x62\xdd\x73\xff\xb5\x6b\x34\xeb\xcb\xae\xfd\x6d\x23\x54\xde\x36\x97\x89\x44\x43\xfd\x17\x83\xb2\x56\x47\x14\x23\x04\x30\x18\x44\xab\x18\xd7\x22\xba\xb5\xfc\x70\x3c\xc5\x4e\xe2\x91\x66\x8f\xf1\x02\xed\xdd\x19\x5d\x07\xc3\x76\xf9\x81\x73\x31\x06\x54\xbd\xd7\x58\xcf\xea\xd1\x41\x00\x73\x1c\xd1\x7a\x8e\x6b\xed\xd9\xba\x43\xcb\xf1\xce\xa4\xe2\x89\xcd\xce\xfe\x77\xd5\x7b\xac\xd7\x23\x3c\x75\x40\xb2\x53\xde\xdb\xd1\x4f\x9f\x43\x20\x16\x08\x60\x4e\x20\x5a\x25\xb8\xd6\xfb\xd6\xcb\x22\x59\x96\x7c\x36\xcb\x4f\x1b\xab\x46\xcd\x46\xc9\x1b\x9a\x56\xdf\x2c\x7d\x56\xb2\x4c\x79\xb3\x49\x37\x7f\x48\xe0\x01\x01\x0c\x29\xa2\x55\x0a\xfb\x28\x80\x7f\xef\xf7\xd4\xa4\x93\x8a\xb6\x98\xc4\x06\xe3\xdc\x07\xd1\x1d\x4e\x6f\x2f\xa5\xbf\x89\x37\x0c\x95\xdf\xb0\xf2\xd5\xa3\x73\x82\x00\x86\x0c\xd1\x2a\x83\xdd\xe5\x91\xb2\x2b\x6e\xbd\x46\xd3\xd5\x28\x10\x66\xf7\x94\x4c\xd3\xc8\x96\xef\xa5\xe6\xa7\x6f\x3e\x7d\x16\xd9\x25\x8f\x4b\x7d\xb5\x25\x21\x80\x39\x89\x68\x95\xc3\x3e\xfb\xf4\x9a\xa6\x47\x36\x3c\x58\xce\x38\xe3\xca\xf9\xbc\x94\x63\xa7\x14\x8a\xbf\xda\x09\xcc\xd3\xe3\xb1\x58\xbf\x8d\xb4\x9e\xbc\x43\x0f\x01\x0c\x39\xa2\xf5\x02\xd7\xf2\xbc\x90\xf4\xee\x74\x8d\xaa\xb1\xb3\x18\x87\x4b\x54\x9b\x73\x2f\x49\xa9\xb4\x82\x75\xdc\xdc\x7e\x6e\x53\x31\xad\x88\xb8\x85\x0a\x04\x30\x14\x88\x56\x05\xae\x75\xe5\xed\xc6\x4d\xde\xeb\xfb\x6f\x3b\xbc\xb4\xb9\xa4\x7c\xf4\xbb\xe3\x9c\x64\xaa\x9d\xf5\x57\xd6\x56\xa6\x18\xf6\x57\x27\x1c\x8d\x20\x80\xa1\x44\xb4\x5e\xe2\x5a\xd3\xcd\x2f\x7d\x5d\xf9\xb7\x1d\x9c\x79\x2a\x9a\x3b\x5b\xe3\xe6\x4a\x6e\x5a\x18\x36\x59\x94\xd9\x6a\x18\x96\xb2\x1d\xd3\xf7\x63\x86\x00\x86\x0a\xd1\x7a\x85\x6b\x65\x1c\x3e\xba\xe0\xc8\xa5\x7d\x9c\x59\x84\xa8\x9a\xb6\x2d\x60\x54\x6e\x53\x2b\x7c\x44\x50\x8c\x51\xcf\xf2\x33\x7d\xe3\x2b\x0c\x31\x04\x30\xa7\x10\xad\x4a\x5c\xab\x9a\xc9\x6e\x4e\x26\x5a\xe0\xca\xc6\xfb\x7a\x6d\x5e\x65\x68\x28\x38\xb9\xba\x24\xec\x9d\x5e\x50\x6c\x52\xff\x08\x2b\x6f\xec\x2d\x08\x60\xa8\x11\xad\xd7\xb8\x56\x13\x81\x87\x4e\xa9\x2c\x47\x5d\x94\xf9\x35\x76\xb1\x1c\x09\xd0\x7e\x35\x7d\xdd\x7d\x99\xae\x2d\x5f\xd3\xb7\x05\x73\x92\x08\x0d\x01\x0c\x0d\xa2\x55\x85\x6b\x51\xbb\x97\x89\xe7\xd1\xa9\x77\xf9\xd1\x0f\xa2\x9c\x5f\x3c\x90\x4d\x92\xd6\x4b\xeb\x6b\x64\xe6\x34\x2f\x19\x4c\xde\xe1\xc9\x95\x86\x00\x86\x16\xd1\xaa\x86\xdd\x3d\x77\x10\xbd\x48\x4a\xb6\xa5\x7a\x77\xa9\xe1\x51\xd2\x35\x06\x05\x41\xb7\x49\x15\x16\x95\x0d\x15\x4c\x9a\xc8\x05\xb2\x26\x4e\x29\x08\x60\xe8\x10\xad\x1a\x5c\x2b\x91\x3d\xe7\x8d\x49\x7a\x73\xcc\xdd\x77\xbf\xbc\x78\x98\x14\xde\x18\x5b\xf3\x44\xd2\x1b\x3e\x7d\x2f\xe5\x5d\x40\x4f\x96\x7f\x96\x01\x02\x18\x80\x68\xd5\xe2\x5a\x90\xae\xf9\xbb\x20\xe3\x19\x7f\xab\x26\xb9\x3a\x62\xaf\xeb\xec\x96\xd6\x7f\x5c\xb5\x9a\x22\x6b\xd5\x33\x0c\xb6\x3e\x2d\xcd\x62\x5f\x47\x7a\x44\xab\x0e\xd7\x3a\x60\x5d\x17\x66\x58\x33\xa4\x65\xbc\xbb\x4d\xe9\x9d\x51\xd0\xfe\xc6\xa9\x53\x3f\x29\x27\xe4\x2c\xb5\x74\x95\xf4\xdb\xc0\x79\xec\x39\x9a\x01\xd1\xaa\xc7\xb5\xe6\x65\x2e\xce\x78\xcc\x9c\x8e\x74\x3e\x97\xb8\xb3\x99\xf4\xa2\x8c\xb8\xaa\x4c\xa0\x8b\x00\x24\x32\x29\x2f\xcd\xe9\x4b\xbb\x62\xcf\x39\x8c\x88\x56\x03\xec\xce\x1f\x24\x55\x27\x2a\x3e\x5f\x68\xf7\x72\xbe\x8c\x10\xb3\x97\x9d\x76\x6e\x7a\xe4\x39\x89\x24\x27\x54\x75\xc5\x2d\x68\xed\x92\x09\x04\x30\x4c\x88\x56\x23\xae\xd5\x3c\x9a\xf7\x90\xd7\x9d\xb3\x7e\xa0\xbf\x2e\x3a\x44\x23\xfb\x21\x7e\xf0\xf8\x6d\x85\xb9\xbb\x6b\xbb\x18\xd1\x33\x09\xfc\xa3\x00\x02\x18\x66\x44\xab\x09\xd7\xca\xbb\x1a\xa4\xfb\xfa\x74\x02\x7e\x1a\xc9\xe5\x49\x3a\x4c\x76\x12\xbe\x7c\x39\x9b\xd6\x8f\xe0\xf4\x77\xfe\xc3\xe4\xaa\x12\x8b\x1a\x10\xc0\x9c\x3e\x62\xc1\x76\xd4\x9f\xe3\xfe\xb5\x60\x6b\xc6\xfd\xe1\xa3\x5e\x13\x9f\xbc\x33\x7f\x8a\xfe\x68\xb8\x17\x94\x4c\xd3\x7e\xb6\x3d\x91\x71\xa7\x55\x3f\xeb\xa6\x47\x22\x5e\x23\xa8\x5c\xb7\x83\x00\x86\x05\xf1\x40\x5a\x60\x8f\x0b\x9f\x0c\xbe\x35\x7d\x24\x24\xdc\x73\x55\x81\xe9\x7e\x68\x09\x41\xbf\x9c\x8c\x8e\xa9\x63\xb9\xf1\xb0\xcd\xc6\x75\x02\xb2\x32\xec\x02\xe4\x0c\xa2\xd5\x0a\x5b\xf5\x1f\x53\x16\xac\x19\x51\x7d\xd3\xc4\x72\x95\xb6\xcb\x41\x42\xca\xb7\x45\x99\x77\x8c\xf0\x03\xfa\xd2\xed\xdc\xbb\xb5\x4b\x67\x45\x21\x80\x61\x45\xb4\xde\xc0\xee\xf2\xfc\x26\x6f\xfe\x86\xe7\x53\x54\xb2\xab\x26\x75\xa6\xed\xf0\x55\x64\x4e\xc0\xe0\x72\x70\xdb\x3e\x21\xb5\xe1\xb5\xf3\x9c\xe6\x86\x10\xc0\xb0\x21\x5a\x6d\xb8\xd6\x35\xf9\x97\x26\x06\xb9\xaf\x2d\x76\x1d\xf0\xc3\xa1\xdc\x58\xcf\xa8\x8c\xe8\x42\x6b\x11\x6a\xd2\xd9\xaf\xee\x72\x77\x9a\x0d\xb4\x20\x80\x39\x8b\x68\xb5\xe3\x5a\x27\xdb\x76\x25\xca\x36\x8f\xdd\xd5\x15\x12\x09\x2c\x9a\xff\x4e\x6d\xc9\xcf\x4d\x6f\xf6\x63\xce\x3e\xc3\xea\xd8\x25\x31\xcd\x68\x6e\x08\x60\xce\x21\x5a\x1d\xb8\x56\xf8\x9b\x73\x27\x29\xfc\x3f\x13\x13\xca\x7c\x2a\xa8\x3a\x50\x54\xae\xf5\x94\xf9\xa5\xaa\x12\x87\x47\x69\xc1\xe0\x47\x7c\x9b\xcd\x0d\x02\x18\x76\x44\xab\x13\xf6\xf8\x2b\x9f\x30\xff\xad\x84\xcf\xed\x5c\xfd\x67\x4f\xa4\x3c\x30\x92\xce\x89\x81\x0e\xdf\xf5\xd2\x5a\x03\x84\x50\x29\x77\x38\xed\xb0\xc7\xc8\x81\x68\x75\xe1\x5a\xb3\x27\xf3\xcc\x4a\xdb\x74\x33\x7c\x2e\xfe\xe9\x5f\xf3\x0a\x99\x75\x28\xaa\x27\x14\x28\x6c\xd1\x51\x54\xee\xa7\x6e\xbb\xdf\xe4\x02\x01\x0c\x27\xa2\xd5\x0d\xdb\x25\x25\xbb\xab\x1d\x9a\x7d\x7a\xdc\x7a\x18\xa5\xbe\x53\xe8\xf5\x94\xc2\xf9\xe9\xad\xa1\xcf\x62\x5a\xcd\x1e\xa2\x91\x73\x1e\x65\xd8\x45\x29\x17\xa2\xd5\x83\x6b\xcd\x0c\xdd\x57\xce\xf5\x68\x33\x5b\xc9\x28\xfc\xfc\x7d\xf1\xeb\x5a\xae\xee\xa7\xf9\xcb\x1b\xd5\x2d\x93\xe5\xb2\xdb\xbc\x2e\xbd\x9a\x10\xc0\x70\x23\x5a\x6f\x61\x73\xa2\x42\x87\xf1\xc2\xf3\xab\xde\xf6\xda\xda\xda\x16\xef\xa9\xc8\x8c\x9a\x2a\x32\x9c\x2e\x4e\x0a\x7e\xb5\xfa\x79\x36\x98\xe0\x8a\x35\x04\x30\xe7\x11\xad\x5e\x5c\x4b\x85\x40\x34\x28\x76\x3d\x04\x8f\x8e\xdf\xb6\xb6\x52\x5f\xcc\x4a\x82\x8f\xa6\x63\xe6\x0b\x9e\xbe\xc4\xd7\x78\x3c\x69\x42\x2f\x0e\x08\x60\x78\x10\xad\x3e\x5c\x8b\xd4\x4c\xa5\x20\x2c\xa3\xb6\xfa\xf4\xa2\xdb\xb5\x01\xe7\xb0\xeb\xe2\x19\xe3\x74\x45\x3d\xfd\xb4\x6c\x25\x27\x39\x1a\x4f\xae\x62\x4f\x9e\x17\x10\xad\x7e\x5c\x6b\x87\xe3\xdc\x1b\xde\x3b\x67\xdc\xfb\xc8\x3f\x8c\x5e\x95\x9c\x4b\x8f\xcb\xa5\x11\x68\x57\xfa\x98\x29\xbf\xb0\x2b\x5b\x1c\x3f\x44\x00\x01\x0c\x2f\xa2\x35\x80\x6b\xc5\xfe\xba\x3d\x19\x28\xec\xd6\x2b\xcc\x17\xf6\x40\xf9\xce\x33\x03\xce\x3f\xca\x7d\x10\x47\xf6\xc6\x8f\xf1\x4d\x01\xdd\x52\x2b\x73\x08\x60\x2e\x22\x5a\xef\x70\x2d\xb2\x39\xbc\x03\x16\x42\x9b\x79\x5d\x49\xe3\xa4\xdb\x1d\x36\x83\x2f\xd1\x4d\x98\xa9\xe3\x01\x72\xdb\xfa\x21\xb2\xd2\x99\x7b\x6a\x10\xc0\xf0\x21\x5a\x83\xb0\xcf\xf2\xb8\xec\x8d\x68\x12\x96\xeb\xa9\x51\x69\xae\x73\x5c\x61\xd4\x94\xa6\x59\x5d\x14\xa7\xf1\x65\xfb\x73\xf7\x5a\x58\x75\xa8\xd1\x31\x08\x60\xf8\x11\xad\x21\x5c\x8b\x36\xb5\xe5\x83\x3f\x79\x5c\x73\x94\xaf\x6e\x4a\x2c\xa4\xa7\xe0\xc3\xe3\x4f\xe9\xbe\xe3\x66\x13\x5d\xe9\x9d\x34\xd1\x71\x1f\x7b\xce\x11\x40\xb4\x86\x71\x2d\x01\x77\x02\x87\x9a\xc2\xeb\xc6\xa6\x8b\xd7\xb2\x03\x4e\x74\x96\x6e\x79\xd6\x96\xf1\x2a\x9f\x38\x4d\xff\x6b\xd1\x57\x4a\xf2\x35\xf6\x62\x73\x09\xd1\x1a\x81\xbd\x1f\x7b\x7b\x32\x2c\x67\x9f\x9d\xab\x1a\x20\x3c\xa5\xa6\x96\x37\x40\x83\xa7\x83\x91\xfc\x12\x34\x1c\xe0\xf8\xf0\x98\x5e\xde\x4b\xec\xa6\x47\x10\xd1\x7a\x8f\x6b\x7d\x62\x60\x45\x0b\x9e\x4b\x3f\x3e\xe8\x2c\x54\xbf\x3d\x2c\x54\x3f\xfe\xc8\xe1\x80\x36\xa3\xf4\xd3\x8f\xc3\x0d\x5d\xab\xd3\x4b\x22\x10\xc0\x5c\x46\xb4\x46\x61\x9f\x3b\x5b\xd5\x65\xef\xe7\x65\xa6\x11\xfa\x76\x0c\x15\x69\x18\x14\x61\xb9\x44\x2f\xfd\xa1\xff\x4e\x53\xbb\xd6\xf2\x0f\xee\xd0\x76\xec\xa6\x5a\x08\xd1\x1a\xc3\xb5\x5e\x4f\xac\xe3\xa3\x38\xea\x33\xf9\x8b\xa2\x16\x63\xcf\xe8\x59\x34\xae\x4e\x0a\xa5\x2a\xb4\x7c\xff\x8a\xb7\x1d\xae\xdf\xd9\xe8\x0a\x01\x8c\x30\xa2\x35\x0e\x7b\x0f\x09\xdd\x0d\xeb\x95\x1a\xbb\x39\xed\xf5\x9a\xd6\x56\xda\x39\x2f\x24\xa2\xf9\x43\xf8\x40\x19\xc7\xa3\xba\xb5\x44\xf3\x67\x51\xd8\xcd\x98\x08\xa2\x35\x81\x6b\xa5\x3f\x57\xaa\xd5\x18\x8f\x5a\xf9\xfc\xc1\xc7\x6b\x12\x7f\x56\xa6\x30\x4b\xee\xf3\xd0\x74\xe5\xda\x79\x99\x13\x73\x4f\x3f\xdf\x33\x80\x00\x46\x14\xd1\x9a\xc4\xb5\xae\x8b\xd5\x10\xe4\xd6\x24\x8c\xdf\x19\xbd\xc5\x05\xa8\xf6\xa3\xfb\x15\xc6\xf9\x23\x92\xa6\x52\x96\x7b\x92\xe8\x4b\x62\x9e\xdb\x42\x00\x23\x86\x68\x4d\xe1\x5a\xcf\xc5\x07\xb8\x1e\x06\x15\xaa\x49\x78\x75\xa7\x1d\x4f\xc2\x2f\x55\x26\xa1\xa9\xf9\x34\x50\xb8\x19\x28\x14\x43\x72\x72\x62\x4c\x1d\x02\x18\x71\x44\x6b\x1a\xd7\x52\x4f\x7a\x6f\x62\xd8\x52\xfb\x92\xc6\x2d\x2d\xf7\xcc\x3b\xb3\x26\x0d\x14\x7f\xf1\x8f\x77\x4c\xdf\x03\xc6\x87\x53\xa9\x5f\x36\x61\xd7\x13\x57\x10\xad\x0f\xb8\x96\x47\x7e\x98\x7f\x3c\xbd\x53\x1c\xff\xb6\xb4\x72\x14\x43\x0e\x9f\xc9\x03\xa7\x3c\x6f\x13\x1a\xb4\x85\x12\x9f\x60\x14\xf1\x6f\x77\x08\x60\x24\x10\xad\x19\x5c\x8b\x4a\xe9\xbc\xa4\x62\xae\x83\xc0\xac\xf5\x03\x35\xd9\x89\x4e\xc5\x59\xea\x98\xdb\x3a\x3e\xce\xc4\x56\x01\x1f\xf8\x65\x9e\x7d\xb5\x87\x00\x46\x12\xd1\xfa\x08\xdb\xa0\x57\x92\xd2\x2e\x09\xd7\x7b\x53\x70\x65\xb0\xb0\x51\xf7\x3f\x7d\x37\xce\x13\x35\x4e\x0e\xe4\x18\xda\x2b\x92\xb7\x76\x34\xb0\xe7\xaf\xab\x47\x2c\xd8\x8e\x8a\xa2\xfc\xb5\x60\x9b\x85\x3d\x0b\x2f\x18\x2f\xf7\x23\xd4\x67\x5a\x9a\x7e\xcd\xc4\xb4\xcd\xc9\xa4\xcc\x12\x82\x29\xb9\x91\xe1\xf0\xce\x45\x98\x6a\x4c\x7b\x1e\xbb\xa3\x97\x42\x3c\x90\x39\x5c\x6b\xce\x8e\x32\xd0\x8e\xa5\x69\x76\xe6\x93\x65\xf0\xc3\x9a\x03\xcb\xdc\xa7\xb5\x52\x76\xe3\x8c\x83\x3c\x8d\x2e\x9e\x99\xac\x0a\x58\x4b\x1a\xd1\x9a\xc7\xb5\x9e\x9c\x6a\x22\xb5\x2f\xed\xad\x71\x19\x38\xb4\xbf\x73\x2f\x7d\x3a\xc4\x73\xb9\xce\x21\x7e\xc5\x63\x6f\x58\xf8\x01\xa5\x9a\xb0\x3e\x04\x30\x32\x88\xd6\x02\xae\x15\xad\x9c\xda\x7e\xeb\xfa\x21\x3a\xde\x9a\x36\xaa\xca\xc8\xa1\x39\xc6\xea\x8d\xd0\x0d\x6d\x95\x3f\xf8\xb4\xf2\x53\x14\x0b\x64\x8e\x10\xc0\xc8\x22\x5a\x8b\xb8\x16\x41\x0b\x83\x18\x7b\xcf\xf2\x89\x70\x2d\x3d\x96\x1c\x6f\xf7\xf5\xb2\x80\x06\x96\x8f\x02\xbf\xfe\xa8\xaf\x2f\xf3\xa8\x51\x74\xd0\x40\x00\x23\x87\x68\x2d\xc1\x6e\x91\xdf\x27\xf4\xc9\x58\xd6\xfb\x82\x4a\xe6\x2b\xa9\x9b\xef\xed\x55\xc9\xd9\x6b\x93\xb2\x4c\x39\xb9\xa4\xc7\x74\x7d\x6a\x90\x46\x19\x02\x18\x79\x44\xeb\x13\xae\xc5\x45\x75\x4f\x8c\xf1\x2d\xde\x19\xf7\xb2\xa8\xaa\xc3\x2b\x57\x76\xb2\x5f\xc9\x3d\xff\xc2\x71\x87\xb7\x85\xab\x32\xaf\xf6\xec\x26\x76\xf7\xa6\x80\x68\x2d\xc3\x9e\xf7\xdb\xbe\xbc\xe3\xe2\x98\xa4\xc6\xf9\x65\xe6\x7d\x76\x70\xc3\xf8\x6c\xdc\x59\x97\xf8\x03\x49\x2a\xf5\x17\xec\x23\xf1\x37\x3d\xb1\x17\x1b\x45\x44\xeb\x33\xec\x4e\x16\x3b\x03\xdf\xeb\xde\xc0\x2f\xb9\xe1\xe4\xdf\xe6\x22\x87\x9a\x3e\xec\xb2\x8d\xf5\xec\xd0\xdf\xd4\x0a\x12\xac\xa8\x11\x29\xb4\x81\x00\x46\x09\xd1\x5a\x81\x7d\x96\xe7\x3e\xf1\x4c\x6a\x02\xfb\x45\xf3\x6a\xde\xeb\xb2\x39\xad\x9b\x0f\x3f\xf3\x84\x51\xa9\x5c\x8f\xf7\xc2\x53\xe5\xc6\xa3\xb2\xc5\xbe\x8e\xca\x88\xd6\x2a\xec\xb1\x49\xfc\x70\x77\xa1\x46\x44\x0b\xf1\x89\xf7\xe8\xa6\xab\x4f\x94\x22\x24\x1e\xd2\x4a\x66\x3b\xec\x5f\x14\x7c\x36\x5b\x7f\x26\xc6\x02\x02\x18\x15\x44\x6b\x0d\xd7\xf2\x2e\xed\x47\x79\x13\x5b\x6a\x7b\x9e\xe3\x9c\xbe\xec\x7d\xcf\xec\x8b\xb1\xf8\x4a\xf5\x2b\xe2\xd3\x4a\xee\xbb\x64\x8f\x53\x48\xb5\x21\x80\xb9\x86\x68\xad\xc3\x16\xcb\xe2\xd7\x95\x89\xcb\x3d\x72\xe2\xba\xc4\x30\xec\xaf\xb5\xb9\xa6\xb2\x69\xe5\x33\xed\xc9\x1e\x9e\x6b\x09\x7d\xf2\xe9\xa2\x3e\x3b\x04\x30\xaa\x88\xd6\x06\xae\x95\x6f\x4c\x7f\xe0\xe6\xa9\xed\x69\x31\x21\x51\xf6\xc1\x2c\xc3\xab\x27\x99\xa1\xab\x8e\xfc\xea\x62\x72\xd6\xde\xf6\xe6\xe5\x8b\x8c\x10\xc0\xa8\x21\x5a\x5f\x70\xad\xfd\x98\x62\x82\xad\xea\x27\xde\x81\x43\x8c\xba\x8e\xaf\x36\xbf\xf1\x24\xd6\x0c\x9c\x3b\xc7\x89\x92\xd5\x33\xb3\xe7\x0b\x59\xd7\x81\x00\x46\x1d\xd1\xfa\x0a\xfb\x88\xc2\x72\xdc\x9d\xfb\x7e\x03\x49\xa3\x86\x89\xeb\x0b\x7d\x28\xda\xf2\xa7\xdb\x26\x21\xc7\xa6\x25\xe6\x59\xb4\x17\x5e\x74\x47\xc9\x42\x00\x73\x1d\xd1\xda\xc4\xb5\x96\x7a\x86\xa2\x6c\xbd\x6c\xaa\x9e\xd2\x36\xba\xdc\xbc\xd9\xe0\x17\x9a\x35\x41\x70\xb6\xc2\x1a\x5a\xf0\x9c\x3f\x17\xd7\x38\x41\x08\x01\x8c\x06\xa2\xf5\x0d\xd7\x52\xf4\xa4\xaf\x26\x6a\xee\x3c\x57\x4e\x54\xf0\xb6\xf8\xf0\x78\x87\xd5\xf9\xdb\x32\x86\x62\x72\x53\x77\xbd\xbd\xbb\x53\xdf\xe9\x61\x17\x33\x9a\x88\xd6\x16\xae\xa5\x45\x92\x4e\xd3\xf5\xab\x2d\x46\x91\xb4\x6a\xe2\xa4\x6a\xa4\x4b\xc4\x92\x7c\x1a\x75\x65\x60\xf6\xe1\xd9\x87\xcd\x34\x92\x79\xd8\x5d\xb8\x16\xa2\xb5\x8d\x6b\x89\x77\xdc\xba\x7e\x9c\x66\x3c\x00\x58\xf3\xe7\xf3\xbf\x6e\x62\x21\x9c\x2e\x9e\x7b\xc5\x32\xa2\x68\xb4\xad\xd1\x7c\x5f\x6c\x09\x3b\x57\xb5\x11\xad\x1d\xd8\xe6\x82\xa3\x75\x59\x8e\x52\xa3\x37\x57\x50\xb3\xec\x46\xa2\x62\x08\xf3\x1b\xc7\xdf\xda\x13\x04\xdf\xcf\xa4\xf1\xd4\xbd\xd9\xbe\x71\x15\x02\x18\x1d\x44\xeb\x3b\xae\xc5\x23\x68\x66\x4b\x7f\xd8\x87\x51\xcf\x34\x1f\xdf\x7e\xde\x91\x72\xb5\xca\x40\x12\x1d\xc8\x39\x5b\xa6\xf8\x82\xac\xe6\xd3\x6b\x13\x08\x60\x74\x11\xad\x1f\xb8\x16\xa1\xb4\x7d\xd9\xb2\xae\x95\x12\x01\x31\x41\xf8\x8f\xf9\xb8\xf8\xb9\xdb\x33\x1c\xa0\x0e\xb5\x5d\x40\x92\x5e\x28\xb4\xf9\x18\xbb\xc8\xba\x81\x68\xed\xc2\x36\xc2\xe9\xb9\x3f\x7d\xec\x2c\x3f\x3d\x56\x7f\x1c\x43\x26\xd5\x12\x7c\xed\xde\x8c\x51\x82\x22\x81\x0d\x7a\xea\x3d\x41\x2d\xf1\x7b\xec\xe6\x55\x0f\xd1\xfa\x89\x6b\x3d\x6d\x6b\xa1\xbf\x4f\xac\xfe\x2a\x5b\x71\x43\xbb\x66\xe8\xdc\x70\x42\xa8\xe9\x00\x2f\x9d\x74\xf3\xc1\x00\xad\x4a\xd7\x78\xc8\x4d\x08\x60\xf4\x11\xad\x3d\xd8\x13\xa8\x67\xe3\x82\xa8\xa0\x4a\x53\x06\xee\xdf\x66\xad\xcc\x8a\x76\x9c\xcc\x9e\x6c\xe4\x75\xba\x60\x5a\x95\xe2\xc3\xc9\x87\x46\x42\x10\xc0\x18\x20\x5a\xfb\xb8\x16\xba\x30\x52\x56\x83\xae\xf7\x5e\xc2\x68\xa3\x5d\xb8\x14\xd3\xea\xf6\xb4\x26\xcd\x0a\x75\xc0\x86\xf6\x0f\xee\x08\x77\x7c\x0d\xec\xb9\xd0\x10\xd1\xfa\x85\x6b\x8d\xf9\xe5\x80\xd1\x9c\xeb\xab\xee\x51\xaf\x03\x97\xda\x96\x38\x64\x86\xad\xd1\xfa\xd1\xe1\x31\x21\x97\xf0\xe4\x8f\x0f\xb7\xa3\x20\x80\x31\x42\xb4\x0e\x60\x0b\x5c\x3f\x95\x48\x2e\x74\xbd\x8b\x62\x0e\xe9\xa5\x74\x53\xa9\x35\xd1\x6e\x97\xc6\x3f\xdf\xdb\xf8\xc9\x4a\x49\x1b\x95\xe8\x3e\x9e\x82\x00\xc6\x18\xd1\x3a\xc4\xb5\xee\x1f\x7f\x54\xe5\x57\xec\x28\x7a\xf1\xca\x1d\x9b\x80\x4f\x7c\xc7\x97\xa7\x5c\x89\xc5\xd3\x74\xde\x55\x7f\x92\x30\xae\xca\x31\xe4\x81\x00\xc6\x04\xd1\xfa\x0d\x5b\x64\xb1\x68\x28\xf0\x37\x07\x56\x57\xcd\x6d\x28\x3a\x16\xc8\x54\x1a\x30\x4b\x99\xcf\x9a\x6c\x6b\x0f\x71\x3d\x6f\x56\xdf\x69\xc7\x6e\x38\x4d\x11\xad\x3f\xb8\xd6\x1a\x8a\xa0\xad\x09\xaa\x07\x6a\xf8\x29\x82\x11\x81\x05\xb9\x57\xc7\xbf\xa6\xee\x2a\x5c\x7d\xca\x19\x1a\x1d\xaa\xfc\xc7\xe6\x1c\x04\x30\x66\x08\xd6\x00\xd5\x7f\x97\xa6\xfb\xbf\x0b\x36\x80\x82\x15\xd7\x3a\x08\xf4\xa1\x52\x35\x9a\xc7\xa9\xad\x39\x6d\x4f\x0a\x6f\xee\x2c\x5d\x92\x26\xb9\x2d\x6f\x6e\x5e\xca\x63\xb3\x97\x55\xac\x76\x06\x02\x18\xc4\xe2\x1a\x40\xc1\x9a\x6b\xbd\x32\x33\x2c\x74\xc3\xd3\xdf\x1f\xbb\xf1\x26\xf7\x0e\x49\xfc\xf4\x2b\x64\x95\x7c\xca\xda\x87\x81\x38\xc7\x3f\x9e\xf0\x28\x97\x86\x00\x06\xb1\xb9\x06\x50\xb0\xea\x5a\x85\xca\x79\x2d\xbb\x44\x81\x38\xfd\xfe\x1b\x94\x9f\x98\xbf\x3c\x31\x44\x75\x87\x38\xf5\x51\xb6\x0f\x13\x54\x2c\x3d\xb3\x7a\x81\xfd\xbd\x20\x56\xd7\x00\x0a\xd6\x5d\x63\xc5\x57\xa5\x66\xc7\x73\xf9\xa9\x36\x27\x92\xca\x90\x48\x45\x18\xbd\x6d\x74\xe9\xe0\xca\xbd\xd0\xc7\x57\x67\xcf\xae\x77\x5d\xbe\x00\x01\x0c\x62\x77\x0d\xa0\x60\xe5\x35\xb7\x73\xf4\x67\x4a\xa2\xe9\x07\x48\xac\x13\x18\x1f\xd2\x9a\xf3\xbd\xe0\xbe\x53\x24\xf8\x6c\xa5\xb6\x30\x40\x75\xff\xba\x9f\x1a\x3e\x04\x30\x88\xe5\x35\x80\x82\xb5\xd7\xf0\x51\x9f\x17\x9f\x4d\x99\xe9\x37\x9a\x2c\xcc\x3d\x69\x8e\x77\xf8\x12\xb7\xa8\xc8\xd2\x77\xea\xfe\x69\x4d\x8d\x6e\x3f\xfb\x06\x4b\x08\x60\x10\xdb\x6b\x00\x05\xab\xaf\x59\xba\x4e\x3c\xee\xc8\x53\xbe\xe7\xc6\x62\xb5\x56\xb4\x4a\xf7\xfa\xea\x40\x68\xf4\xc9\x93\x64\x22\x44\xf5\xe4\x12\x8f\x49\xa5\xb0\xeb\x5c\xc4\xfa\x1a\x40\xc1\xfa\x6b\xc5\x5d\x1f\xbd\xe9\x2e\x9d\x0e\x2b\x39\xb1\x14\x5b\x4d\x23\x4e\xc7\xb9\xd9\xbc\xf2\x3a\x96\xf0\xb2\x0b\x5f\x6a\xf5\x92\x9c\xae\x18\x04\x30\x88\xfd\x35\x80\x82\x15\xd8\x24\x0d\xeb\x93\xbd\x28\x9f\x7c\xe1\xbc\x52\x9d\xc5\xab\xab\xfc\xfd\x6b\xaf\x59\x86\x61\x6d\x96\xc7\x77\xfe\x08\x97\xce\x7a\x73\x17\x08\x60\x10\x0b\x6c\x00\x05\x6b\xb0\xb9\xdc\x9e\xef\x3b\xf5\xe8\xf2\xf0\x77\x42\x8e\x90\x2c\x6a\x6f\x47\xd4\x12\xf4\x4d\xe9\xe4\x61\x7b\xd5\x97\xd1\x04\xf6\x6f\x24\xe2\x10\xc0\x20\x36\xd8\x00\x0a\x56\x61\x7b\xf7\xec\x07\xdb\x95\x68\x7f\x75\xff\x18\xc1\x71\xc6\x6f\xc1\x14\xfa\x44\x4c\x72\x0d\x92\xd3\x9e\x8c\x8d\x43\x7e\x2f\x8f\x05\xdf\x82\x00\x06\xb1\xc2\x06\x50\xb0\x0e\x1b\xef\xec\x10\x0f\xdf\x7c\xe9\x13\xc3\xe1\x88\x85\xce\xfb\x2b\x67\xd5\x55\x89\xd8\x9f\x1c\x78\xc8\x3f\x16\xa8\xfb\x25\x57\x53\x7b\x09\x02\x18\xc4\x0e\x1b\x40\xc1\x4a\x6c\xf4\x2b\x89\xb1\x8f\x7e\x15\x54\xc9\xde\x89\x59\x8b\x9f\x97\x7d\xf2\x2d\xe7\xee\x41\x74\xec\x7b\x81\xb0\xdc\x6a\xe7\x00\xcb\x3f\xd4\x10\xc0\x20\x96\xd8\x00\x0a\xd6\x62\x2b\x4a\x3c\x19\xfc\x6a\xd5\xb8\x87\x78\x3b\xdc\x6d\x78\xe6\xba\x7a\x2f\x71\xb3\xe3\x83\x29\x96\xd2\xb9\x14\x6e\xa9\xe9\x34\xb4\x1a\x04\x30\x88\x2d\x36\x80\x82\xd5\xd8\x5c\xbf\x6d\x72\x97\x9f\xf5\x79\x60\x52\xdf\x79\x59\x48\x75\x80\x61\x65\x2b\xfc\x45\xc3\x59\xba\xee\x2b\x4a\x03\x04\x86\xbc\xd7\xb0\x9b\x5f\xc4\x1a\x1b\x40\xc1\x7a\x6c\x87\xab\x2e\x31\xc2\x8b\x6b\x06\x71\xc9\x21\x1a\x0d\x3c\x34\x06\xf8\x11\x2b\x14\xeb\x13\xa4\x6b\x16\xca\xee\x96\x71\x25\x4f\x38\x20\x80\x41\xec\xb1\x01\x14\xac\xc8\xc6\xb8\x7a\x42\x67\x2f\x7c\xb3\x7b\x95\xc5\x5c\xed\x71\x55\xc9\xa9\xc9\x0c\x26\xe2\x40\x61\x72\xda\x5b\x5c\x78\xe7\x3f\x0d\xc9\x62\xa7\x06\x62\x91\x0d\xa0\x60\x4d\x36\xbc\x1d\x11\x2f\xd6\x6b\xae\x6c\xf8\x24\x2d\xba\xed\x77\xeb\x44\x4c\xf6\x15\x36\xbc\x4e\x5b\xfe\x54\x1d\x3e\xbb\x92\x73\xbc\x05\x7b\xe9\x47\x6c\xb2\x01\x14\xac\xca\x96\x2a\xac\xa6\x99\xd4\x22\x94\xaa\x6c\x01\x3c\x5f\x4b\x29\xa2\xb8\xe9\x3e\x35\xb7\xaa\xd0\xaa\x7a\xbd\x1b\xbb\xdd\x4a\xa6\x4d\x06\x01\x0c\x62\x95\x0d\xa0\x60\x5d\xb6\x5b\x31\xb6\x4c\x49\x0c\x63\x37\x67\x5a\xd1\xea\x72\xad\x3f\x89\x03\x18\x6b\xe9\x69\x73\x79\x9f\x4c\xbc\x94\xb0\xf5\x5b\x4f\xc3\x6e\xaa\x10\xbb\x6c\x00\x05\x2b\xb3\xf5\x6a\x4e\x0a\x39\xff\x64\x21\xdb\x4f\x5a\x3b\x7e\xc7\xde\xd3\xa1\xab\x56\x2d\xb3\x8a\x88\xd6\x97\x16\x55\x8a\x9e\xf9\x51\x67\x0c\x01\x0c\x62\x99\x0d\xa0\x60\x6d\xb6\x54\xef\xae\x2e\x63\x3f\xbd\xc2\x77\x31\x25\x03\x3e\xdb\xed\xb1\x9b\x03\x41\xe1\x14\x98\x75\xd2\xb1\x0f\xb2\xd5\x24\x66\x71\xd8\x17\x00\xb1\xcd\x06\x50\xb0\x3a\x9b\x08\x9d\xe8\x12\x51\xd8\xa9\x25\x4f\xca\xb2\x0f\x51\xc7\xec\xff\x34\xeb\x54\xf6\xc6\xbd\x16\xa0\x6b\x28\xe1\xf5\x24\xb9\xa9\x4c\x01\x01\x0c\x62\x9d\x0d\xa0\x60\x7d\xb6\x7a\x5a\x87\xdd\x04\x69\x31\xd9\xde\x73\xc2\xd5\x55\x87\xf7\x84\x7f\xfb\xd9\x45\xff\xe9\x16\xe5\xb7\x2e\xf9\x18\xe3\x51\xb7\x72\x1e\x02\x18\xc4\x3e\x1b\x40\xc1\x02\x6d\x91\x3e\x85\x44\x69\xc1\xaa\x2e\x3a\x37\xe4\x0d\xb9\x2e\xad\x17\x72\x35\x68\x1e\xff\x80\x52\xf2\xc9\xca\xa0\xa7\x98\xbc\xd6\x8b\x7d\x01\x10\x03\x6d\x00\x05\x2b\xb4\x4d\x74\x87\xb8\x6f\x10\xe5\xcb\xd4\x6e\x8d\xa6\x9e\xd2\x1f\x6a\xae\xf8\x4c\x93\xa9\x93\x77\x00\x1d\x7b\x4e\xf7\xe2\xf8\xa9\x75\xec\x32\x07\xb1\xd0\x06\x50\xb0\x44\x5b\x5f\xbc\x94\x03\xf9\xfd\xa0\xf3\x2a\x4d\x3a\x61\x17\x0a\x9a\x7f\x2d\x51\xc7\xb9\x98\xeb\x0a\x44\x05\xfe\x2c\xff\x50\x9e\xd4\x2a\x03\x01\x0c\x62\xa2\x0d\xa0\x60\x8d\x36\xf5\x31\x59\xef\xb0\xb2\xa2\x17\x14\x19\xdb\xfd\xdc\x5b\xa8\x46\x17\x0a\xa5\x1b\xb4\xce\x89\x6f\x6a\x28\x85\xc8\x96\x5b\x58\xb0\x9b\x3e\xc4\x46\x1b\x40\xc1\x22\x6d\x62\xc7\xaf\x31\x0d\x72\x46\xff\x99\xba\x6b\x74\xd2\x59\x24\xfa\xe9\x40\xd6\x5d\xc6\xbb\x2a\x6f\x5b\xa0\xf7\x11\x9e\xb7\x8b\xce\x61\x0f\x13\x31\xd2\x06\x50\xb0\x4a\x5b\xfc\x71\xcc\x9b\x88\x68\xeb\x52\x47\x8a\x90\x6b\x42\xfd\x62\x5f\xdb\x1e\x1a\x91\xc7\xd3\x32\xe2\x87\x92\x8b\xdb\x9f\x81\x44\x9c\x21\x80\x41\xac\xb4\x01\x14\x2c\xd3\x86\xd7\x8e\x76\xc9\x50\x16\xfc\x78\xa7\xb4\xe4\x52\x82\xb5\xcc\x24\xcb\x7d\x82\x21\xb6\xb3\x9c\xa6\xe4\xfc\x2f\xf1\x2e\xd2\xdc\x38\x06\x01\x0c\x62\xa6\x0d\xa0\x60\x9d\x36\x8d\xad\x29\x23\x57\x7c\x8a\xfa\x5f\x0d\x14\x97\x4f\x59\xbc\x38\x85\x2e\xcc\xe4\x0d\x8b\x6e\x89\xaa\x96\x15\xda\xf2\x93\xa3\x30\x83\x00\x06\xa9\xd3\xf6\xcf\x82\xee\xa8\x80\xf0\xdf\x0b\x3a\x58\xa8\xad\x35\xbc\xfa\xb5\xc8\x8b\x3b\x3a\x98\x89\x52\x42\xaa\x59\xfe\x71\x7c\x77\xa9\x91\x27\x05\x5f\xf4\x5e\xb0\x76\x42\x9b\xf7\x28\xb0\x57\x20\xc4\x50\x1b\x40\xc1\x4a\x6d\x9c\xca\x22\xf4\x39\x31\xaf\x3a\xd9\x81\x6c\xef\xfd\xf7\x97\x0d\x52\x0c\x87\x4b\xd0\xcd\xe9\xb7\xab\xbf\x9c\xac\xe2\x99\xcb\xc7\xee\x31\x10\x4b\x6d\x00\x05\x4b\xb5\x55\x3a\xc4\xea\x06\x42\x57\xd3\xfc\x1e\x5e\x7f\x1f\x4d\xd6\x4a\x8a\x21\x21\x18\x65\x63\x8d\xea\xfc\xfe\xd2\x5c\x06\xd2\x51\x55\x86\x00\x06\x31\xd5\x06\x50\xb0\x56\x5b\xd2\xb4\x17\x73\x82\xf9\x09\xc5\x8b\x3e\xd7\xb6\x92\xbf\x1f\x52\x5f\x53\x91\xe3\x31\x30\x7c\xbf\xde\x0a\xb8\x62\x9a\xb4\x85\xa8\x20\x80\x41\x6c\xb5\x01\x14\x2c\xd6\x06\xbd\x63\xdc\xbb\x74\xe1\x04\x89\x93\x93\xab\xea\x4c\xd5\x67\xf2\x5b\xed\x19\x97\xa7\xdf\x9e\x30\x6e\xf6\x15\x56\xf8\x8a\x91\x67\x86\x00\x06\x31\xd6\x06\x50\xb0\x5a\xdb\x1d\xde\x13\xe7\xbb\x59\xd8\xe9\x8c\x8d\xfa\xe9\xde\x8a\x0f\x5e\x89\x72\xb4\x99\xdf\x3b\xde\x66\x19\xa1\xef\x47\x21\x2e\xad\x85\x9d\x98\x88\xb5\x36\x80\x82\xe5\xda\x9c\x7f\x9a\x5f\xe8\x66\xaa\xdf\xba\xe9\xb2\x97\x78\xb2\x70\x4f\x72\x2e\x55\x54\x26\x72\xfc\x69\x69\x97\xb0\x65\x9a\x30\xe9\xa2\x03\x04\x30\x88\xb9\x36\x80\x82\xf5\xda\x48\x99\x9f\x3d\xf9\xd9\x4c\xca\x49\xbd\xf0\xf8\xd4\xed\x33\x55\x1d\x6f\xcc\x93\x67\x59\xc6\x6d\x96\x47\x2f\xdd\x92\x76\x28\x58\xc0\x9e\xb3\x10\x7b\x6d\x00\x05\x0b\xb6\x7d\x3e\xff\xc2\xfa\x21\x7f\x10\x91\xd2\xe8\xa3\x4b\xce\xbe\x1f\x56\x6d\x92\x69\x8a\x2d\x5d\xd0\xed\x92\xa0\x47\xf7\xe7\x55\x80\x7d\xcb\x20\x06\xdb\x00\x0a\x56\x6c\x73\xd2\xb6\x23\xbc\xec\x47\x3b\x9c\xdf\x25\xac\xdb\x47\x1c\x47\x5d\x5b\xe1\xcb\xfd\xfc\xe3\x0b\xc7\xbb\x54\x44\xc4\x15\xfb\x77\x14\x20\x80\x41\x2c\xb6\x01\x14\x2c\xd9\x36\xdf\xb3\x25\x1e\x33\x21\xff\x4e\xd6\x4f\xfb\x81\xc1\xf7\xa9\xc1\xdd\xe8\xd2\x5f\xe5\xc6\xcc\x2a\xcc\x75\x1b\xf7\x43\x38\x95\xb1\xbf\x33\xc4\x64\x1b\x40\xc1\x9a\x6d\x45\x49\xdf\x7a\xfc\x7e\x95\xa8\x0c\x67\x1b\xcb\x45\x52\x9d\x34\xb3\xa3\x53\xf9\x1d\x32\xe3\x78\xe3\x4c\xb2\x5f\x1f\x73\x49\x05\x76\xe3\x80\xd8\x6c\x03\x28\x58\xb4\xad\x1e\x9d\x95\xfe\x26\x98\xab\xe5\x83\x94\xd7\xe4\xef\xdd\x57\x9b\xca\x05\x84\x99\xcf\xc6\x65\xdf\x99\xc5\x76\x6c\xd1\xc6\x47\xe3\x41\x00\x83\x18\x6d\x03\x28\x58\xb5\xcd\xe7\xfe\xbd\xab\xf6\xfe\x22\x01\x93\x4e\x37\xd8\x43\x4a\x76\xc5\xc3\xa2\x7e\xf0\x2d\x6a\xfc\x5a\xdb\x3a\x6d\x6d\x62\xe0\xa7\xc9\x0b\x01\x0c\x62\xb5\x0d\xa0\x60\xd9\xb6\x80\x17\xa9\xea\x71\x49\x12\x64\xdf\xb2\x08\x04\x74\xd8\xbf\xff\xf1\x24\x4d\x4f\x7d\x3e\x15\x5b\x60\xb4\x1f\x74\xf6\x0a\xa5\x18\x76\x71\x82\x98\x6d\x03\x28\x58\xb7\x8d\xc9\x6f\x73\x42\x75\xbd\xad\xdd\xde\x3f\x4d\xa9\x67\xe2\x4f\xf0\x17\x4f\x06\x5b\x7c\xe5\xa4\x81\x63\x35\x01\x04\x5d\x31\x3b\x0c\x10\xc0\x20\x76\xdb\x00\x0a\x16\x6e\x73\x8f\x2f\x94\xcd\xd5\x31\xef\x91\x50\xe4\x36\xa6\x5c\xeb\xdf\x38\x31\x6f\x49\xa0\x17\xa9\xfb\x31\xb4\xee\xe3\xfc\xe1\x95\x56\xec\xa4\x45\x0c\xb7\x01\x14\xac\xdc\x56\x2d\x41\x2a\x2b\x11\x36\x5d\x53\x50\xdd\x31\x47\x3b\x1a\x28\x1a\x44\x33\xd1\x64\xd2\x6a\x6f\x76\x3d\x84\x56\x76\xd0\xad\xe3\x3a\x04\x30\x88\xe5\x36\x80\x82\xa5\xdb\x68\x7c\x25\x5e\x3f\x13\xd3\xe1\x69\xec\x39\xa8\x51\x13\xde\xc7\x47\xcb\x67\x6f\x0f\x5c\x11\x6b\x3a\x19\xc4\x37\x83\x6e\x6f\x26\x80\x00\x06\x31\xdd\x06\x50\xb0\x76\x9b\xaa\x85\xc5\x92\x7c\x6a\x88\xef\x82\xe9\x6f\x9f\x8e\x2e\x9f\xad\xe1\xb8\xe1\x66\xf9\xea\x02\xd0\x2e\xbb\xf0\x2a\xd1\xaf\xdd\x1c\x02\x18\xc4\x76\x1b\x40\xc1\xe2\x6d\x1e\xcf\x88\x79\xac\x09\x32\xcb\x9e\x65\x64\x5f\xf1\x1f\x7d\xc8\xa9\x6b\xf9\x45\xf8\x9b\x2f\xed\xed\x14\x3c\xc2\x6e\x27\x4d\xc9\xe3\x10\xc0\x20\xc6\xdb\x00\x0a\x56\x6f\x3b\x90\x21\xbe\x95\x7b\xc2\x42\x49\xf6\x41\x81\xc5\x17\xd1\xf9\x88\xd5\xda\x63\x02\x35\x0f\x4e\x34\x8a\xc7\xd2\xf9\x31\x81\x7c\x41\x08\x60\x10\xeb\x6d\x00\x05\xcb\xb7\x8d\xd8\xbd\x17\x54\x83\x4a\xf6\xad\x35\x0c\x30\x0e\xf1\x1f\x72\x7c\xcb\x8d\x3f\x17\x26\x2e\xfc\x92\x5c\x2e\x89\xe1\x96\x73\x21\x81\x00\x06\x31\xdf\x06\x50\xb0\x7e\x5b\xdd\xc3\x9f\x0a\x6a\x05\x4d\x51\x93\xd2\xef\x8a\x9d\xee\xe2\xed\x6f\x4a\xfd\x1a\x30\xfd\x16\x79\xe2\x70\x53\x27\x6e\xa6\x32\x4d\x14\x02\x18\xc4\x7e\x1b\x40\xc1\x02\x6e\xa3\xad\x64\x97\xff\xc4\x93\x36\x37\x74\x8a\xf5\x92\xc6\x64\xcc\x8a\x67\xf1\x86\x72\x88\xbf\x1b\xc9\x37\x57\x8f\x31\xb7\x26\xc5\x5e\xea\x10\x03\x6e\x00\x05\x2b\xb8\xb9\xec\xff\x49\xa3\x87\x9a\x63\x25\xd3\xed\x12\x79\xe2\x2d\x5c\xb2\x2b\x6e\xa7\xe0\x5d\x35\xbe\x75\x6d\x8a\x83\x95\xfa\x8a\x20\x76\xd2\x22\x16\xdc\x00\x0a\x96\x70\xc3\x8b\xb0\xfd\xf9\x2d\x40\x7c\x75\xea\xad\xf6\x86\xd7\x87\x05\xa5\xc2\x1f\xf2\x12\x04\x5b\x7c\x0b\xc4\x02\x46\x5d\xfb\xab\x8b\x06\x10\xc0\x20\x26\xdc\x00\x0a\xd6\x70\xdb\xb9\x4a\xa7\xd9\x14\xfb\xbc\x5d\x3d\x63\xc4\x65\x99\xdf\xff\x1b\x64\xa4\x13\x73\x83\xe1\xb4\xb9\xf5\x27\x14\x23\x1f\xb7\x07\x76\x4f\x89\xd8\x70\x03\x28\x58\xc4\xad\x34\xec\xe7\x2d\x6f\x5b\x0a\x41\xc8\x70\x56\x46\x56\x61\xb9\x74\xf4\x20\x44\xcf\x48\xfa\xeb\x42\xd6\xa9\xf9\x47\xbe\x11\xfe\xd8\x6d\x20\x62\xc4\x0d\xa0\x60\x15\x37\xc6\x6b\x85\x0f\x7a\x20\xb5\xb6\xe7\x5f\x95\x23\xce\xde\x7b\x22\xeb\x95\x23\x44\x77\xb3\xac\x36\x38\xa9\xc5\x50\xe0\x34\x93\x8d\x1c\x04\x30\x88\x15\x37\x80\x82\x65\xdc\xaa\x75\x1e\x32\x2c\x96\xef\x84\xe5\x77\xde\xf2\x26\x4b\x64\x0f\x60\x4c\x25\xbf\xf7\x2d\x8f\xa6\x4c\x94\xbf\xbf\x44\xf1\xb1\x3b\xf6\xd5\x44\xcc\xb8\x01\x14\xac\xe3\x66\x67\x59\x66\xd4\x7f\x2e\x78\xb2\x83\xc4\x74\xd0\xcc\x85\x81\xe6\xe2\xaf\x86\x8d\xc4\x0a\x9e\xf0\x27\xd6\x5c\x3f\x2f\x8b\x7b\xe8\x43\x00\x83\xd4\x71\xfb\x67\x41\x77\xd4\xd7\x3c\xfc\xbd\xa0\x83\x85\xdc\x4e\x90\x33\xe8\x7c\xbe\x0c\xf8\xa1\x48\x09\x8d\x4c\xf9\xa2\x1f\x15\x0d\x83\x04\x0d\x7d\xb1\x8b\xd9\x59\x21\x25\x8c\xc7\x98\x6d\x20\x80\x41\x0c\xb9\x01\x14\xac\xe4\x96\xa7\x15\xb6\xdb\x45\x3d\x2c\x88\x4f\x76\x7d\xff\xe3\xd4\x55\xdd\xf6\x00\x13\xc7\x9d\x8c\x9c\x17\x77\x1e\x17\xf8\x48\xba\x9a\xb0\x40\x00\x83\x58\x72\x03\x28\x58\xca\x2d\xf6\x16\x61\x64\xd4\xcc\xce\x88\xd2\x4d\xbc\xaf\x84\x17\x4f\x3b\xee\xd0\x1c\x37\xd7\x6a\x22\x72\x7f\xce\x5d\x4e\xbb\xc0\x2a\x27\x06\x01\x0c\x62\xca\x0d\xa0\x60\x2d\xb7\xcb\x84\x03\x6a\x67\x0a\xea\x3d\xd7\xf5\xee\xef\x07\xbf\xa0\xeb\x15\x08\x1f\x67\xc1\xd7\x7d\xb2\x64\xe3\x4e\x3a\x50\x6c\xb2\x4e\x0f\x01\x0c\x62\xcb\x0d\xa0\x60\x31\x37\xd3\xf1\xef\xef\x83\xc7\xee\x48\xbc\xb8\x7b\x5c\x31\xef\x3e\x45\x1c\xbe\x44\xe5\xe9\xf6\xc3\xbb\x8c\x5a\x6c\x02\xdf\x3a\x03\x06\x09\x21\x80\x41\x8c\xb9\x01\x14\xac\xe6\xb6\xb9\xd9\x97\x2c\x7f\x3f\x65\xbb\x4d\x30\x62\xa1\xd7\x31\xcc\xe7\x99\x7e\xcd\xc7\xe0\xce\xf5\x33\x8f\x9f\x73\x08\x7e\xce\x64\xc5\x2e\x01\x10\x6b\x6e\x00\x05\xcb\xb9\x75\x84\x58\xf1\x92\x8f\x6a\x7f\xab\xdb\xf5\x35\x59\xb0\x58\x96\x92\xe3\x5b\x3f\x68\xcd\x22\x7d\xaa\x98\xe5\x3b\x9d\x29\xb9\x8e\xfd\x97\x21\xe6\xdc\x00\x0a\xd6\x73\xf3\x4d\x1a\x23\xcc\x91\xf0\x69\x4d\xfc\x75\x2e\xed\xc3\x88\xa4\xe4\x1b\xb6\x14\xd7\x8c\xa9\x95\xed\x32\xfb\x73\xee\x1d\x14\x12\xd8\xb5\x3e\x62\xcf\x0d\xa0\x60\x41\xb7\x95\x3f\xfa\xec\xbb\x17\x9e\x85\x25\x52\xd7\xbf\xcf\xbc\x9b\x96\xc6\x17\x80\x32\x7f\xc4\xfb\xc6\x43\x5b\xde\xee\x47\xc3\x7e\x15\x17\x04\x30\x88\x41\x37\x80\x82\x15\xdd\x82\x6f\x96\xbc\xca\xe0\xa6\x21\xba\xa6\x49\x93\xa5\x90\xf3\xcd\xfb\x77\x03\xe1\x16\x23\xde\x7b\xed\xc8\x54\x31\xe2\x0f\x4d\x26\x16\x10\xc0\x20\x16\xdd\x00\x0a\x96\x74\xcb\x75\xf8\xa2\x67\x26\x41\x9f\xeb\x73\x83\x57\x8b\xee\x30\x31\xb1\x0b\xe5\xfe\x76\x81\x4a\x41\x67\x2e\x9d\x90\x5d\xae\x4c\x94\x12\x02\x18\xc4\xa4\x1b\x40\xc1\x9a\x6e\xd1\xfd\x6c\xac\x44\x8f\x9b\x4d\x1d\xa1\x09\xfe\x7b\x74\x16\xcb\x5f\x31\x65\x83\x4a\xc5\x1d\xd9\xe1\x3f\x1d\xc6\xb2\x02\x0e\xb0\x57\x20\xc4\xa6\x1b\x40\xc1\xa2\x6e\xd1\xe7\xee\xe6\x97\x79\x47\x2a\x4f\x11\x87\x0b\x7c\xe9\x3d\x63\x10\x4e\x40\x91\xc8\xc0\x55\x30\xfd\x72\x6b\xcc\x7c\x41\xf7\x0c\xf6\x6c\x8a\x18\x75\x03\x28\x58\xd5\x6d\x21\x91\xc1\xe8\x1b\xfb\x16\xa7\x23\x33\x69\xe2\x61\x5a\xd0\x7e\xdc\xe4\x39\x6e\x37\xa6\x00\x66\xcd\x41\x27\xcb\x3e\xba\x3e\x3d\x08\x60\x10\xab\x6e\x00\x05\xcb\xba\xbd\x10\xbd\x7b\xcb\xc5\xe8\x04\xa7\xc6\x27\xfe\x8a\xc2\xd6\xcb\xd4\x66\x26\x69\xa6\x4a\xe6\xcb\x7c\x1e\xb3\x98\x91\x20\xa1\x68\xec\x4a\x07\x31\xeb\x06\x50\xb0\xae\xdb\xe6\x96\xa3\x6d\x65\x91\xdf\x87\xa2\x03\x99\xb2\x5c\x0f\xa6\x5b\x41\x45\xee\x39\x76\xe6\x85\xdb\x51\x66\x17\x75\x42\xfc\x13\xd5\x21\x80\x41\xec\xba\x01\x14\x2c\xec\x26\x5b\x6b\xe8\x20\x2b\x24\xdf\xea\xea\xcd\xc5\x5f\xf9\xde\xd5\x9f\x2a\xa9\x67\xe0\xe7\x1d\x0b\x1a\x66\x51\xb1\x07\x49\x81\x8e\xd8\xa9\x81\x18\x76\x03\x28\x58\xd9\x2d\x47\x31\xb5\x79\xca\x80\x33\xbe\x72\xcd\x3a\x7b\x46\xfe\x55\xde\xbe\xbc\x11\xbe\x54\xde\x43\x63\xfd\x3c\xae\x87\xe4\x1f\xf3\x4d\x20\x80\x41\x2c\xbb\x01\x14\x2c\xed\x86\xaf\x55\x75\xe9\x26\x3f\xfb\xde\x16\x8f\x53\x13\x9a\x2d\xd2\xfb\x9e\x9f\xa9\x2b\x6b\x93\xc3\xce\xb7\xe6\x5b\x26\x31\xd5\x12\xe4\x10\xc0\x20\xa6\xdd\x00\x0a\xd6\x76\x3b\xb1\x8c\xff\xc7\x6a\x40\xbd\xc7\xf2\x20\xa1\xe8\x69\x3a\x1d\x7b\xd0\xc8\x6f\xd5\xd5\xe7\x4a\x9c\x4c\xf8\xc4\xc4\x34\x5a\xb4\xd8\xab\x36\x62\xdb\x0d\xa0\x60\x71\xb7\xfb\xfc\x5a\x5d\x99\xc2\xba\x0c\x69\xce\xae\x5c\x87\x3a\xb4\xc2\xfb\xa4\x55\x5f\xf6\x7b\x48\x45\x8a\x27\xd2\x7b\x6c\x32\x9b\xb4\x21\x80\x41\x8c\xbb\x01\x14\xac\xee\x86\x5a\x63\xb7\x21\x2c\xe0\xf0\x21\x5c\x0d\x8f\xf9\x3c\xf5\x6d\xfa\xe4\x2f\x9e\xb9\x6a\x31\xa6\x58\xa1\x35\x59\xf6\x9d\x6d\x65\x53\x08\x60\x10\xeb\x6e\x00\x05\xcb\xbb\x79\x93\x7c\x15\x58\xd0\x9c\xe4\x4e\x9e\x7b\xeb\x9c\x9b\x32\xfe\x21\x24\x76\xfa\xb6\x78\x9a\xeb\x2e\x83\x6d\x12\x87\xb2\x40\x2b\x76\xd2\x22\xe6\xdd\x00\x0a\xd6\x77\xbb\xd6\x46\xc2\x36\xc6\xf1\xfc\x9a\xdc\x1e\xfe\x42\x8b\x42\xd3\xeb\x37\x18\xbc\x3d\x15\xed\xec\xe5\xb7\x65\x5d\xb7\x39\x8a\x6c\xf0\x21\x80\x41\xec\xbb\x01\x14\x2c\xf0\xa6\xd6\x76\xc2\x44\x97\x85\x2e\x67\x2e\xa8\x31\xd9\x66\xb4\x10\xf5\xf9\xed\xde\xb1\x9c\x99\x08\x4a\xae\x40\xeb\xa5\x13\x5f\x9d\x75\x21\x80\x41\x0c\xbc\x01\x14\xac\xf0\x66\x81\x49\x5d\xd3\x1f\xb8\x6c\xfc\x30\xef\xf2\xa5\x87\xb2\x1f\x9c\x0b\x7a\xd3\x94\xda\x44\x68\x66\x22\x79\x9e\xfd\xe4\x0e\xd8\xa2\x83\x00\x06\xb1\xf0\x06\x50\xb0\xc4\xdb\xb5\x08\xf6\x83\x11\x47\x52\xfd\x5b\x1f\x72\xc5\x15\x95\xb7\x18\x4b\x99\xdf\x68\x6f\x06\x0d\x9b\x3e\x1f\x7d\x3d\x68\xb6\xe3\x85\x82\x00\x06\x31\xf1\x06\x50\xb0\xc6\xdb\x33\xf7\xc0\xda\x7b\xa7\xad\x9f\xb4\x19\x6f\x57\xa3\xc5\x85\xa6\x44\x1e\x7d\x44\x17\xd6\x6e\xe0\xd1\x5c\x6e\xec\x7e\x61\xca\x89\xdd\xed\x22\x36\xde\x00\x0a\x16\x79\xbb\x37\xf0\x18\xbd\xce\xe2\x3f\xa6\x71\x3a\xb7\xe3\xd2\xea\x19\x89\x3d\xeb\x6d\xce\x52\x8d\xec\x4c\x51\xa1\x79\xea\x57\x35\x10\xf6\xd5\x44\x8c\xbc\x01\x14\xac\xf2\xa6\x38\x74\x43\xd6\xa1\x9c\xb3\x69\xfc\x47\x7f\x05\x5d\xf6\xa5\xaa\x4e\xc5\x43\xbb\x14\x52\xc3\x21\x6b\xb5\xb8\xa7\xf8\x78\x2f\xb0\xa7\x20\xc4\xca\x1b\x40\xc1\x32\x6f\x09\xaf\xf0\xf9\x2e\x04\xce\xcb\xed\x58\xc9\x1b\xb5\x58\x5d\x71\xfe\xb8\x76\xea\x11\x2d\x95\x5e\x48\xea\x9d\xfc\x0b\x9f\x26\x88\x31\x10\xc0\x20\x66\xde\x00\x0a\xd6\x79\xcb\x68\xce\x09\x1f\x0e\x1d\xf2\xdf\x36\x38\xd1\xe0\x9c\x97\x72\x22\xdf\x97\x93\x33\xca\x5e\xd6\x3f\x6a\x4a\xed\x4a\xee\x93\x57\xcc\x10\xc0\x20\x75\xde\xfe\x59\xd0\x1d\xf5\x65\x5c\x7f\x2f\xe8\x60\xa1\xb7\x04\x81\x52\x1e\x27\x69\x1e\x97\x25\xad\xb2\x9b\xd5\x6b\xfe\xbe\x67\x25\x87\xb7\x97\x2e\xa2\x05\xef\x31\x73\x86\xb9\xcb\x8d\xa8\x42\x00\x83\x18\x7a\x03\x28\x58\xe9\xed\xf9\xcf\xa1\xab\x61\x64\x9b\xb7\xf2\xbd\xdb\x3b\x78\x89\x0d\x68\xf8\x16\xb9\x69\xa7\x06\x5d\x7c\x67\x7e\xbb\xf9\x8e\x27\x64\x2b\x42\x00\x83\x58\x7a\x03\x28\x58\xea\xed\x79\x62\xc4\xc0\xc2\xc3\xe8\xac\xce\x6f\xee\xb7\x6a\xd2\x7b\xf5\x3f\xda\xad\x09\x11\x04\xb1\x88\xd1\x9e\x4d\x7c\x40\x7e\xaf\x01\x7b\x9e\x47\x4c\xbd\x01\x14\xac\xf5\x36\xba\x31\x79\x4d\x95\xe0\xda\xc8\xbb\x8b\xf3\x63\xc6\x52\xd3\x2d\x21\x94\x77\xed\x7f\xce\xae\x59\x9b\xde\xa8\xd3\xbf\x1d\xbe\x24\x03\x01\x0c\x62\xeb\x0d\xa0\x60\xb1\xb7\xe8\x75\xd6\x5f\xfd\x81\xd2\x1a\x93\x97\xbe\x37\xd0\x9c\xde\xb9\x1f\x58\xe4\x12\x8c\xa2\x28\x94\x9c\xb9\x71\x62\x2c\x3d\x46\xf2\x0a\x04\x30\x88\xb1\x37\x80\x82\xd5\xde\xbe\x64\x3e\xf5\x5a\x0d\x9b\xfa\x26\x9d\xbb\x5b\x20\xcc\x41\x44\x32\xf1\xa4\xde\xd9\x3d\x61\xf3\x0b\xa9\x5e\xdb\xb1\x60\x74\x3a\x76\xe3\x8e\x58\x7b\x03\x28\x58\xee\xed\x69\x84\x71\xdc\x97\x33\x9f\xe2\x49\x1e\x8c\x8c\x74\xd2\xb7\xff\x78\x91\x10\xe4\xee\xad\x76\xc9\x6e\x63\x65\x8c\x24\xd3\x91\x84\x0f\x02\x18\xc4\xdc\x1b\x40\xc1\x7a\x6f\xe9\xc5\xcb\xd4\xc9\xc7\x9b\x3e\xa2\x44\x76\xa5\x8d\x08\xde\xeb\x67\x07\x93\xaf\xac\xb1\x0d\xd4\x6c\x3d\x50\xcc\xba\x93\xb5\xe2\x06\x01\x0c\x62\xef\x0d\xa0\x60\xc1\xb7\xce\x7b\xaa\x61\xa1\xe5\xd7\x5e\x5c\x69\x4e\xa1\x2d\x78\x6e\xb2\xda\x92\xe8\xc3\xf6\x8b\x60\xcd\x30\x93\xc2\xfd\x50\xad\xa6\xd5\x08\x02\x18\xc4\xe0\x1b\x40\xc1\x8a\x6f\x5f\xba\x8c\x2c\xcd\x7b\x58\x0f\x96\xc9\xe3\x2a\x12\xa8\xac\xf3\x2f\xd3\x9c\xeb\x9b\xe7\x6c\x03\x4b\x68\x2d\x0f\x7a\x32\x21\x5a\x08\x60\x10\x8b\x6f\x00\x05\x4b\xbe\x3d\x1c\xaa\x5f\xf8\xff\x31\xf7\xdf\xf1\x58\xf6\xff\x1f\x3f\xee\xb4\x92\xd3\x26\x1c\x24\x7b\x64\x26\x64\x64\x65\x44\xf6\x96\x5d\x29\x5b\xd9\x94\x79\xda\x7b\x45\x21\x65\x94\x11\x42\x76\x56\x34\xec\x99\xbd\x22\x5b\x64\xaf\x42\x7e\xb7\xde\xef\xf7\xe9\xeb\x3a\x74\x76\x5c\xdf\xdf\xb7\x3f\x3e\xb7\xdb\xf5\xe7\xfd\x7a\x9e\xbd\x8e\x1e\x1d\xaf\xd7\xf1\x70\x9c\x77\x19\x46\x53\xe2\x62\x5c\x73\xa5\x1b\x55\x9f\xc5\x2b\xbe\x1a\xee\x39\x64\x85\x9b\xb8\x17\xb4\x36\x06\x50\x51\x30\x22\x00\x5c\x94\xca\x37\x00\x06\x72\xbe\xa1\x65\xee\xbd\xa9\x9f\xc6\xe6\xcb\x9c\x7f\x3a\xf5\x1c\x6f\xe1\x15\xd7\x0c\xc6\xcf\x71\x0d\xad\xb6\x2c\x2d\x41\x85\xec\xc1\x9b\x1a\x08\x00\x17\xa5\xf3\x0d\x80\x81\xa4\x6f\x5f\x1e\x6f\xa7\x98\xc1\xd2\x10\x91\x70\xad\xa9\x06\xb2\x3d\xd5\x1f\xa3\x92\xbd\xef\xe3\xb6\x5a\xc8\x4e\x27\x34\x55\x51\x1d\x72\x20\x00\x5c\x94\xd2\x37\x00\x06\xb2\xbe\xe1\x57\x71\x7f\xd9\x7f\xb0\xdf\x83\x06\xab\x96\x7d\x6b\x68\x5f\xe4\x17\xa6\x6c\x4e\x90\x04\x4f\x9b\xcd\xe9\x4d\xd8\x40\x7c\xfa\x75\xa2\x46\x69\x7d\x03\x60\x20\xed\x5b\xdd\x75\xb1\x44\xd9\x8d\xcc\x60\x66\x35\x16\x7a\xfc\xf0\xf7\x9a\xf1\xa6\xe3\xca\xd1\xd5\x09\xdf\xc9\xb7\x79\x67\xd2\x0a\x2b\x4d\x11\x00\x2e\x4a\xed\x1b\x00\x03\x79\xdf\x5e\xb3\x36\xb1\x8c\xdc\x3a\xad\x8e\xf0\xfd\xf2\xa1\xa7\xf9\xb9\x60\x63\x84\x23\xe9\xec\x75\x19\x6e\x47\xfd\x6b\x23\x1e\x1d\x9c\x6a\x08\x00\x17\xa5\xf7\x0d\x80\x81\xc4\x6f\xb3\x37\xbf\x39\x63\x91\xd3\x07\xf5\xdd\x7a\x92\x74\xfa\x06\xc5\xfb\x0d\x62\x58\xc8\x88\xbf\xe6\xee\x0a\xa5\xd7\x52\x78\xcf\x26\x3f\x02\xc0\x45\x29\x7e\x03\x60\x20\xf3\xdb\x41\xdc\xce\x9e\x96\x87\x8a\xf5\x8b\xf0\xf6\x56\x01\xba\x2b\x55\x7b\xdb\xf3\x42\x1d\x1e\x51\xbb\x3b\x86\xeb\xaf\x03\xda\x54\x6d\x10\x00\x2e\x4a\xf3\x1b\x00\x03\xa9\xdf\x64\xbd\x9a\x10\x6d\x17\xe8\x1a\xed\x03\x9f\x50\x18\xdc\xe5\x9a\x6c\x65\x8b\x27\xc0\xef\x8e\x54\xbe\x3e\xb5\xeb\x5d\x65\xd8\x41\x8c\x00\x70\x51\xaa\xdf\x00\x18\xc8\xfd\xe6\xbb\x25\xc1\x15\x92\x45\x85\xce\x9d\xfa\xa0\x28\xf4\x46\x6c\x12\xda\xfe\x0f\x41\x4f\xc7\xce\xef\xbe\xa9\x71\x5e\x2c\x5a\xe7\x7f\x6d\x67\x28\xdd\x6f\x00\x0c\x24\x7f\x0b\x4c\x09\x40\xe3\x31\xb8\x4f\xfd\x61\x53\x4c\x3d\x3f\x15\x97\xbf\xe4\x46\xbd\x50\xc2\x94\x95\x91\xda\xfe\xfd\x9b\xb7\x8a\xe1\x9c\x08\x00\x17\xa5\xfc\x0d\x80\x81\xec\x6f\x89\x37\x67\x69\xe8\x02\x02\x06\x4b\xee\x1a\x86\x91\xd6\x7a\x10\xf9\x69\xe0\x97\x4c\x63\xd6\xab\xd2\x8f\x48\xf8\xce\xd5\x8e\xfe\x3a\x36\xa1\xb4\xbf\x01\x30\x90\xfe\xad\x36\x9b\xda\x69\xa5\xcb\x6a\x52\x89\x78\x80\xe7\xc6\xdb\x12\xc9\x87\xd4\xaf\x30\x4c\x6a\xb7\x9f\x8b\x9a\x18\xb4\x2e\xb5\xb0\xfe\x7a\xa4\x41\xa9\x7f\x03\x60\x20\xff\x5b\xd3\x79\xea\x67\xdd\x11\x49\xbe\xfe\x82\x17\x19\xbe\x46\x9f\x8d\x2c\x70\xac\xab\xb4\xa6\xe3\x4c\x68\x52\x8c\xff\x21\x1b\xf8\xf9\x12\x02\xc0\x45\xe9\x7f\x03\x60\x20\x01\x5c\x73\x83\x4f\xc3\xc6\x27\x62\x34\x25\x8c\xf0\xb2\x94\xf3\x5d\x39\x9d\xef\xba\x14\xe3\x37\x4d\xb6\x3d\x5c\xc6\xb2\x14\x49\xcf\xfd\x3a\x9e\xa3\x14\xc0\x01\x30\x90\x01\xae\x40\x6d\x74\x95\x96\xce\x4b\x6b\x66\xe4\xb1\x7e\x55\xdf\x1d\xba\xcd\x4e\x98\x88\x99\x01\x1a\x6c\xb3\x7a\xcb\x2f\xc7\x03\x4d\x11\x01\xe0\xa2\x34\xc0\x01\x30\x90\x02\x4e\xe7\xae\xdb\x17\x6a\xde\x4d\xd1\xca\xc2\x39\x13\xab\x4a\x1f\x55\xbd\xb3\xcf\x08\xaa\x02\x9e\xa0\xa9\xda\xc9\x04\x3c\xa5\xf5\xfe\xf5\x6f\x13\xa5\x02\x0e\x80\x81\x1c\x70\xbc\x67\xbd\x36\x94\xd9\xd8\x4b\xae\x74\xab\x62\xf5\xe8\x13\xac\x84\x46\x09\x3d\xf4\x84\xe1\x53\x86\xca\xbd\x5e\x65\x57\x7e\xad\x8f\x00\x70\x51\x3a\xe0\x00\x18\x48\x02\x57\xa4\x4b\xa5\x64\x21\xaa\x12\xfd\xde\xc3\xba\xf4\xf9\xcd\x35\xb2\x40\x2d\x61\xaa\x1e\x57\x25\x93\xec\xda\x25\x4c\xbc\x7e\x0f\x34\x04\x80\x8b\x52\x02\x07\xc0\x40\x16\xb8\xf7\x7c\x77\xd5\x27\x3a\x1f\x49\xc5\xc5\xd3\x1b\x4d\x56\xc2\x2f\xaf\xe8\x6e\xc1\x3d\x09\xd4\xea\xd2\x86\x59\x13\x8a\xfc\xba\x08\x10\x00\x2e\x4a\x0b\x1c\x00\x03\x69\xe0\x52\x13\x3a\x97\x9c\x85\x8b\x62\xda\xed\xde\x08\x04\x38\xb6\xb1\x6a\xf2\x87\xc5\xb3\xd8\xca\xff\x34\x3c\xfd\xac\x74\x29\x97\xed\xd7\x73\x38\x4a\x0d\x1c\x00\x03\x79\xe0\x24\x5e\xd6\xc3\x12\x2d\xac\x30\xae\x33\x1b\x19\x96\xd3\xb3\x29\xc9\xd0\xb4\x2b\x47\x9f\x66\x70\x62\x4c\xca\xa4\x7f\xe6\xde\x42\x82\x00\x70\x51\x79\xe0\x90\x07\x3a\xa8\x5f\x99\x7a\xfc\x40\x07\x12\xc1\x51\xcd\xde\xb9\x28\xf1\x44\xea\xbe\x2e\x2b\xdd\xc3\xfe\x60\x6a\xdf\x19\x27\xe1\x62\x73\xde\x9b\xd7\x7d\x08\x3f\x71\x5f\xd2\xba\x70\x0a\x01\xe0\xa2\x14\xc1\x01\x30\x90\x09\x8e\xe9\x43\xe5\xe9\x5b\x67\x24\x4a\x59\x4e\x6d\x8d\x71\xe6\xc6\x2f\x7f\xdf\xd0\x34\x59\x44\x67\x9c\x72\xd1\x18\x51\xf7\x3a\x94\x90\x46\x00\xb8\x28\x4d\x70\x00\x0c\xa4\x82\x1b\x79\xfd\xf3\xce\x83\xc0\x99\xa8\xe9\xeb\xf1\xf7\x7e\x52\x65\xef\xb3\x73\x9f\x96\x8a\xc1\xac\x50\x73\xa7\x94\xd9\x60\x4a\x77\xfd\x75\x5d\x50\xaa\xe0\x00\x18\xc8\x05\xf7\xfe\xb9\xac\xfc\xf7\xcd\xbb\xa7\xbe\xf8\xf9\xe8\x1c\xcc\xd6\x93\x5b\x94\x09\xde\xab\x30\x4f\x7c\xf9\x9e\x42\x37\xcb\x1f\xf3\xfc\xaf\x5b\x33\x4a\x17\x1c\x00\x03\xc9\xe0\xc2\xfb\x37\xc3\x99\x5e\x17\x0d\xf9\xd9\xd8\x78\xcd\x8c\x3f\x88\x09\xc6\x11\xe0\x19\x1e\xf8\x11\xb0\xaa\x74\xfa\xbc\x81\xdb\xa6\x09\x02\xc0\x45\x29\x83\x03\x60\x20\x1b\x1c\x2b\x76\x6a\xc1\x8e\x8a\x38\x03\xa1\x5c\x7a\x2c\x5b\x49\xe8\x6d\x79\x5c\x59\x99\x31\x4f\xe6\x67\xc2\x9f\xae\x8b\xda\xc8\xa6\xe1\x21\x00\x5c\x94\x36\x38\x00\x06\xd2\xc1\x69\x27\xc6\xaa\xaf\xc4\x72\x6c\x7e\xb9\x75\x8e\xe7\x67\xa8\xb6\xdd\x4a\xdc\xa5\x27\xc5\x2e\x41\x5e\xa4\x1f\xcb\x14\x6f\xe8\x48\xd0\x23\x00\x5c\x94\x3a\x38\x00\x06\xf2\xc1\xb5\xdf\xdb\x6e\xb6\x71\x60\xe8\x38\xdf\x3b\x65\xf6\xc5\xbd\xbb\xe4\x72\x2c\x87\xe2\xeb\x9f\x36\xc5\x18\x75\x51\xca\xe3\xa6\x22\xbf\xee\xa6\x28\x7d\x70\x00\x0c\x24\x84\xdb\xb3\xb1\xf4\xf1\xd9\x8b\xec\xbb\x35\x46\x74\x50\x81\xa7\x40\xcd\x2f\x23\x3b\xf3\x2e\x32\x99\xc1\x34\x1a\x9e\x4f\x6b\x14\x79\x16\x01\xe0\xa2\x14\xc2\x01\x30\x90\x11\xae\xd8\x81\x5e\x7d\x3c\x60\x79\x80\x7d\xc7\x56\x07\x13\xe3\xde\x99\xe5\xdb\xfe\x1e\x31\x4d\x7d\xdf\x45\x2d\xd3\x86\x89\xd5\x7a\xb5\x10\x00\x2e\x4a\x23\x1c\x00\x03\x29\xe1\xd8\x44\x88\x28\xee\x6a\xf7\xa0\xe5\x0c\x65\xca\xe1\x4b\x76\x9e\x17\x90\x19\xd1\xcf\x8c\x19\x51\x1a\x4f\x68\x31\x7d\x14\xad\xfa\xeb\x9a\xa1\x54\xc2\x01\x30\x90\x13\xee\x4b\xa1\x92\x90\x81\x7a\xb5\x37\x4b\xee\xd9\x51\x67\x8b\x94\xfb\xf6\x97\x5e\xde\x30\x71\x3b\xa5\xa0\xce\x7f\xb3\xf8\x2d\x2d\xde\x6d\x04\x80\x8b\xd2\x09\x07\xc0\x40\x52\xb8\xd4\x16\xf2\x7c\x95\x46\x51\xf5\x00\xf8\xf7\x4f\x3c\x87\x0f\x4d\x9e\xb1\x86\x6e\x8a\xe7\x78\x88\x37\x5f\xb8\xe0\xee\xe9\xc6\xf6\xeb\x9a\xa1\x94\xc2\x01\x30\x90\x15\x2e\x28\x5b\x3c\x96\xff\x46\x84\x56\x82\x5d\xfd\x8c\xbc\xc8\x20\x33\xd9\xf4\x72\x69\x7f\x4a\x9b\x75\xab\xdf\x39\x96\xf5\x39\xfd\x5f\xa1\x45\x69\x85\x03\x60\x20\x2d\x9c\x57\xed\xa7\x14\x3c\xba\x0c\xdb\xc8\xcb\x67\x2e\xba\x08\x56\x2b\x0b\x17\x3f\x8e\x70\x4a\xf6\x52\xb6\xa9\xc8\x20\xba\x9c\x24\x2e\x8c\x00\x70\x51\x6a\xe1\x00\x18\xc8\x0b\x27\xf8\x45\xc5\xb2\xac\xf5\x6a\xc7\x3e\x85\xda\x27\xa6\xca\xec\x12\x6e\x3d\x1b\xf9\xa5\x0b\x0b\xbb\x6f\x53\x92\x38\xa6\x4c\x37\x61\x08\x00\x17\xa5\x17\x0e\x80\x81\xc4\x70\xd7\xad\x3e\x77\x8a\x0a\x7b\x76\x8a\xf7\x92\xc7\xab\x0b\xb3\x3e\x78\x2a\x37\x9b\x73\x93\x8b\xcf\x58\xe5\xed\x98\x33\x5d\x46\xfa\x5d\x04\x80\x8b\x52\x0c\x07\xc0\x40\x66\xb8\x39\x36\x91\x40\x96\x32\x0d\x5a\xde\xe2\xad\x4b\x97\x82\xf3\x2f\xfc\x48\x5d\x79\xf5\xd3\x3d\x67\x31\x38\x7f\x7b\x54\x55\xca\xf0\xd7\x49\x07\xa5\x19\x0e\x80\x81\xd4\x70\x3c\xda\x1d\x9e\xf3\xa4\x76\x72\xb5\x91\x13\x8d\x9c\x97\x6a\x47\x13\xb6\xa7\x6e\x3f\xb8\xf8\x16\x7e\x5f\xfd\xd5\x80\x9e\xa5\x3b\x35\x02\xc0\x45\xa9\x86\x03\x60\x20\x37\x5c\x60\x64\x30\x91\xab\x40\x38\x87\xf5\xf3\x38\x6c\xcb\x8d\xfe\xad\xcb\x30\x71\xb9\xc6\x8f\x25\x43\x9b\x51\x98\x09\x18\xba\x12\x76\x08\x00\x17\xa5\x1b\x0e\x80\x81\xe4\x70\x9d\x81\xf4\x6f\x52\x7d\x6b\xba\xac\xaa\xa4\xf4\x07\x30\x56\xde\x8c\xd8\x87\x51\x9f\x79\x60\xc9\xd6\x19\xd1\xac\xf6\x92\x56\x88\x0f\x01\xe0\xa2\x94\xc3\x01\x30\x90\x1d\xae\xdd\x76\x4d\x01\xe7\x3a\x8f\xbd\x3d\xf9\x5b\x9f\x33\xb7\xdd\x5b\x95\x7a\x1e\x52\x5c\x77\xd1\x8f\x6d\x88\xdc\x2e\x2f\x78\x2a\xa8\x8c\x00\x70\x51\xda\xe1\x00\x18\x58\x0f\x87\x67\x9b\xca\x7e\x51\xf1\x46\x57\x91\x4b\x72\xa8\x06\xcb\x6d\x2a\x87\xf1\xfa\x00\x74\x2e\x52\xbe\x62\x4d\x7b\xab\x0f\xc5\x0e\x08\x00\x17\xa5\x1e\x0e\x80\x81\xfc\x70\x39\x8e\x72\x12\xaf\x57\xb9\x35\xc8\x93\x22\x10\x6d\x1b\x16\x4a\xc5\x77\x4d\x5f\x39\xdd\x9b\x4c\x2f\x38\x55\xa6\x69\x5c\xb8\x7b\x0d\x01\xe0\xa2\xf4\xc3\x01\x30\x90\x20\x6e\xd3\x05\x6f\xc8\xac\xff\xa6\xfb\xe0\xbb\x08\x4f\x62\xfa\xd8\xda\x7d\x1c\x8e\x44\x7f\xe1\xb3\xcd\xab\xeb\x4d\x6b\xbe\x95\xe2\x56\x08\x00\x17\xa5\x20\x0e\x80\x81\x0c\x71\x17\xc3\x3f\x71\xe8\xb6\xdc\xd9\xe0\x7e\x2c\xf3\x26\xf1\x33\x3e\x11\x31\xdd\x70\x09\xc6\xe5\xeb\xa2\xe1\x8a\x1e\x68\x5b\x9c\x54\xbf\x0e\xc1\x28\x0d\x71\x00\x0c\xa4\x88\x53\x5a\x0c\xfd\xda\xc9\xb7\x26\x32\x6d\x24\xa5\x55\x3e\xdb\xae\xdb\x79\x8e\x46\xa8\xef\x76\x1e\x03\xa1\x07\x4f\xe0\x8d\x76\xbc\x5f\xb7\x6d\x94\x8a\x38\x00\x06\x72\xc4\x19\x31\x35\xeb\x74\x8b\xcd\x7b\xa3\xd9\xaf\xa1\x37\x54\x55\xce\x72\x05\x8f\x6b\xdb\x74\x08\x8f\xb6\x47\x89\xad\xe9\xb7\x73\xea\x21\x00\x5c\x94\x8e\x38\x00\x06\x92\xc4\x4d\xed\x45\xa6\x97\xb7\x50\x1a\x7f\x0b\x67\x7c\x8b\x3b\xdf\xdc\x16\x9b\x40\x5c\x3a\xf7\x6d\x8b\x77\x05\x23\x3a\xd9\x68\xbb\x44\x02\x01\xe0\xa2\x94\xc4\x01\x30\x90\x25\xae\x2e\x45\xb3\xad\x55\x7a\xf5\xda\x98\xda\x32\x85\xc2\x83\xf8\xf7\x33\x16\x9f\x86\xa8\xa6\x89\x9e\x3c\xb8\xe0\xf1\x84\x3b\x86\xf4\xd7\x51\x13\xa5\x25\x0e\x80\x81\x34\x71\x0d\xc4\x3c\x0d\xde\xb7\xc8\x66\xf0\x9e\x91\x9e\xab\xfb\x46\xaa\xbf\x96\x37\xe0\xee\x53\xcf\x44\x35\x47\xcf\xab\x90\xf8\x1e\x47\x1b\x01\xe0\xa2\xd4\xc4\x01\x30\x90\x27\xee\xbd\x77\x45\x51\xf6\x96\xfa\xc7\x15\x2d\x33\x06\x82\xfc\xce\x9a\x4f\xb6\x77\x3b\x93\x5c\xcc\x9b\xdf\x1b\x94\x2a\x3b\x7f\x9a\xff\xf5\xe4\x86\xca\x13\x87\x3c\xd0\x41\xfd\x62\xfb\xe3\x07\x3a\x90\x28\xee\xd1\x5b\x3d\xca\x76\x7b\xe6\x80\xf4\x2e\x42\x35\x17\xfd\xd8\x34\x6a\x2f\xf7\x8a\x42\x92\x0f\x89\x9a\xb9\x03\xc6\xea\x4a\x51\x86\x08\x00\x8e\x52\x14\x07\xc0\x40\xa6\xb8\xd6\xba\xe4\x22\xaa\x01\xd8\x35\x97\xfd\x1e\x1b\x98\x90\xf8\x04\x5d\xec\x18\x4d\x4a\xc8\xf2\xd5\x76\xcd\xbc\x57\xa9\xa4\x78\x46\x08\x00\x8e\xd2\x14\x07\xc0\x40\xaa\xb8\xf7\x87\xc6\x85\x89\xb6\x45\xd1\x3a\x8d\x1c\xd8\x43\x1c\x32\x78\x2b\x74\x3f\xcf\x10\x5d\x1b\xc7\x24\x9c\x62\x3e\xd0\x64\x20\x94\x40\x00\x70\x94\xaa\x38\x00\x06\x72\xc5\x5d\xd6\x7a\x98\x2f\xd0\x61\xeb\xaa\x38\xd5\x63\x98\x96\x79\x8d\xb3\xef\x45\x18\xda\xee\x88\xaf\x2e\x8f\x58\x15\x95\xe6\x72\x37\x1b\x02\x80\xa3\x74\xc5\x01\x30\x90\x2c\x0e\x63\x52\xc3\xbe\xc5\xed\xb3\xe0\x75\x46\x96\xc3\x0b\x7d\x87\xf7\xbf\x0e\xa2\x7f\xb8\x65\x82\x8f\xc3\x13\x82\x8e\xee\x5f\xfe\xea\x2a\x02\x80\xa3\x94\xc5\x01\x30\x90\x2d\xee\x42\xc4\x70\x99\xec\x62\xd3\x6a\x9c\xe4\x46\x5b\xa8\x3c\x6b\x3c\xeb\xc4\xfc\xda\xe8\x76\xaf\x07\x71\xde\x83\x52\x65\x0f\x5d\x2b\x04\x00\x47\x69\x8b\x03\x60\x20\x5d\x5c\x20\x8b\x97\x65\x89\x5e\xe5\x25\x3e\x7e\x61\x3e\x1c\x73\x04\x89\x24\x16\x93\x8c\x00\xd9\x6b\x47\x5d\xca\xec\xe7\xc2\xf5\xec\x77\x10\x00\x1c\xa5\x2e\x0e\x80\x81\x7c\x71\x1a\xf7\x37\x71\xc4\x0a\x77\x4b\x3e\x4a\x18\xb6\xbd\xb4\xd7\x2d\x4c\x2e\x0f\x7d\xc9\x7a\xa6\xc4\x82\x90\x34\xf4\xdb\x4d\xc9\x6f\x70\x04\x00\x47\xe9\x8b\x03\x60\x20\x61\x5c\xb0\x7a\xfa\x77\x96\x73\xef\x85\xf3\x27\xdf\x68\xd0\xad\xf8\x6a\x54\x11\x94\xd1\xf3\x7b\x14\x09\x9a\xfe\x20\xba\x40\xe7\xf6\x18\x1f\x01\xc0\x51\x0a\xe3\x00\x18\xc8\x18\xf7\xfc\x29\x9c\x70\xd2\xa3\x79\x6b\xff\xf3\x52\x7f\x3d\x93\x00\x2b\x7d\x63\x46\xc6\x6c\xb0\xb4\xd9\xc3\x4f\xfb\xfd\x9f\x27\xb4\xd5\x10\x00\x1c\xa5\x31\x0e\x80\x81\x94\x71\x12\x02\x6f\x42\x70\x38\x9f\xf8\x61\xa7\x1e\x6c\x61\xd2\x4d\x60\xb7\x78\x93\xbc\x8a\xf3\xc2\x49\x5c\x78\xf6\xa4\x9d\x9e\x80\x93\x13\x01\xc0\x51\x2a\xe3\x00\x18\xc8\x19\xd7\x4c\xe6\xf3\xac\x76\xbe\x17\x8b\x75\x5b\x36\x6d\xd8\x43\x32\xa3\xda\xe7\x8b\x64\xdc\x39\xde\x07\x21\xf8\x78\xa7\xea\xf1\xb5\x7e\xfd\x6d\xa2\x74\xc6\x01\x30\x90\x34\x8e\x94\xfb\x72\x9c\x12\x57\xec\x1c\x4e\xe6\x69\xce\x8e\xc6\x84\x26\x32\x53\x5c\x75\x12\x31\xcb\xdc\x2e\x2d\x32\x7c\xc3\x6f\x12\x26\x08\x00\x8e\x52\x1a\x07\xc0\x40\xd6\xb8\x0e\x52\x99\x26\xd3\x4f\xea\x26\xc3\x24\xe1\x2b\xfd\x6f\x73\x84\xa9\xcf\xd2\xc8\xfb\xc0\xe1\xcb\xae\x63\xd9\xae\xf9\x95\xd8\xbf\x42\x8b\xd2\x1a\x07\xc0\x40\xda\x38\x42\xc5\xab\x7b\x21\x29\x5f\xd1\x45\x14\x6f\xe8\x9f\xb9\xfc\x4a\x0c\x7b\x6b\xc0\xe8\x00\xbe\xf4\x08\xc1\xf4\xd0\xbf\x89\xf7\xe5\xaf\x7f\x4e\x28\xb5\x71\x00\x0c\xe4\x8d\xdb\x0a\x94\xa7\x69\x76\x86\x35\xac\xb2\xae\x2d\x8c\x95\x86\x88\x4c\x62\xc5\x28\x33\xc5\x3e\x5c\x5a\x89\xb7\xda\xb4\xbe\x33\xe2\x80\x00\xe0\x28\xbd\x71\x00\x0c\x24\x8e\xab\xec\xf6\x5e\x0a\x58\x9d\x3a\x65\x65\xe2\x95\xe7\xcd\x54\x65\x1b\x8a\xc0\xbb\x21\xbd\x7e\xb5\x8b\x67\xa1\x22\x6f\xcc\x69\xca\x06\x01\xc0\x51\x8a\xe3\x00\x18\xc8\x1c\x37\x90\xd0\xbe\xb7\x5d\x82\x18\x76\xd7\xa3\x5f\xf6\xdf\x49\x1e\xf7\x2f\x56\xa0\x3d\xc5\x29\xee\xa6\xf1\xb2\x9d\xa0\x8b\x38\xf4\x26\x02\x80\xa3\x34\xc7\x01\x30\x90\x3a\xee\xdb\x2c\x86\x26\xd9\x96\x77\xcd\x33\x97\xf8\x9e\xa5\xab\x54\x91\x25\xea\xa2\xa1\xf4\x2f\x83\x64\xb2\x83\x6c\x4c\xd5\xa2\x2a\x95\x11\x00\x1c\xa5\x3a\x0e\x80\x81\xdc\x71\x3b\x88\xaf\x6b\x2c\x0b\xb2\xfd\x9a\xc9\x93\x84\xb6\x37\x3e\x6b\xde\x9f\xef\x78\xc4\x3a\xc8\xff\x5a\x82\x9e\x26\xcc\xa7\x80\xfc\x0c\x02\x80\xa3\x74\xc7\x01\x30\x90\x3c\x8e\x5b\xf4\x71\x30\x2c\x6c\xe9\x79\xca\x2a\xa7\x4f\x00\x4d\x56\x60\x8d\xfb\xe3\xf0\xf7\x38\x66\x99\xc5\x36\x5c\x23\x34\x19\x86\xaa\x08\x00\x8e\x52\x1e\x07\xc0\x40\xf6\x38\x46\xd2\x9d\x45\x07\xdb\xf0\x4f\xb3\x15\x99\x14\x58\x82\x73\x53\xf9\x6d\xc3\x8c\xf7\x1f\xb7\x3b\x0b\x85\x7a\x0e\x65\x5f\x7d\xa2\x87\x00\xe0\x28\xed\x71\x00\x0c\xa4\x8f\x6b\xd4\x48\xbc\x92\x59\xbf\xdd\x22\x2c\xa1\x9e\xf0\x5c\xd0\x01\x27\x58\x3d\x14\x7b\xe7\x09\x49\x8d\xca\xb4\xf7\x22\x0d\xa9\xd5\x35\x04\x00\x47\xa9\x8f\x03\x60\x20\x7f\x9c\xab\xf3\xe4\xdc\xf3\xbe\xce\xc4\xc5\x24\x6c\x79\xd9\x6c\x7c\x9d\xcd\xd9\x5a\x53\xaa\x5c\x1f\x77\xb7\xda\x6f\x4d\x3f\x37\x8a\x7e\xed\x4e\x28\xfd\x71\x00\x0c\x24\x90\x13\x35\x8e\xcc\x43\xcf\x38\x2b\x9b\x2f\xb8\xfd\xe1\xc5\xad\x49\x22\xdb\x9b\x93\x96\xb8\x9f\xa8\x29\xeb\x63\xcb\x19\x33\xd2\x4c\x7f\x5d\x33\x94\x02\x39\x00\x06\x32\xc8\x39\x15\xdf\x59\x33\x94\xb9\x13\xbb\x30\xf1\xed\x90\x8a\x63\xaa\xdf\xc1\xcd\xaf\xeb\xc6\xdb\xfe\xb2\xb2\x8b\xf2\x93\x75\x8e\x7a\xa7\x10\x00\x1c\xa5\x41\x0e\x80\x81\x14\x72\xde\x39\x41\x4f\x48\xf3\x08\x0a\x1e\xab\xe5\x29\x72\x0d\xcf\xec\x23\x10\x93\x3c\x8a\x81\xe7\x1f\xc7\x35\x33\x3d\x29\xb4\x77\xe0\x45\x00\x70\x94\x0a\x39\x00\x06\x72\xc8\x79\x95\xfe\x50\xa2\x13\xd3\xa3\x61\x79\x45\x6a\x6c\xc9\x7c\x4a\x39\xec\x4d\xb2\x7d\x97\x8f\xad\x08\x51\xef\x65\x76\x19\x18\xc0\x85\x00\xe0\x28\x1d\x72\x00\x0c\x24\x91\x7b\x16\xa8\x9d\x4d\x68\x69\xa5\xb0\x71\xa7\x6c\x14\x33\x99\xb9\xc5\x04\x1e\x6b\xbc\x6f\x16\x86\x63\xce\xd5\x30\x17\x59\xa6\xad\x83\x00\xe0\x28\x25\x72\x00\x0c\x64\x91\x43\xa4\x6c\x10\x7b\x92\x9c\xbd\x91\x77\x83\x34\x9d\xaa\xd5\x35\x59\xac\xbc\x12\xbd\xf1\x6e\xc7\x74\xf5\x8b\xc6\x15\x8a\xf6\x1a\x6c\x04\x00\x47\x69\x91\x03\x60\x20\x8d\xdc\xa5\x45\x83\x14\x0d\x06\xc2\x3c\x8a\xa7\x2b\xef\xbe\x3b\x44\xb0\x5c\xbe\xed\xce\x9a\xc8\xaf\x24\xe0\xd9\xa5\x5e\x1e\x5a\xa7\x78\x0b\x01\xc0\x51\x6a\xe4\x00\x18\xc8\x23\x97\x95\x6e\x1d\x70\x0a\x2e\xfa\xad\x29\xd7\x73\xf4\xca\x83\x77\x9e\x63\x5f\xd4\xec\x72\x2f\xe0\x5f\x16\x08\x10\x32\x8c\xbb\x9a\x27\x80\x00\xe0\xa8\x3c\x72\xc8\x03\xdd\x68\x7d\x74\x0d\xf6\x94\xc8\x50\xa9\xa9\x14\x6f\xab\xb1\xbd\x34\x53\xf6\xd9\x84\xa4\x84\xaa\x49\xe3\xcd\x30\xce\xe4\x2b\xed\x9b\xc7\x0f\x74\x20\x91\x9c\xa2\x79\xf4\xfb\x82\x41\x34\x9f\xcf\xbb\x06\xf7\x89\xad\x39\xc7\xb6\xdd\x76\x0e\x4e\x39\xde\xb3\x71\xac\x5e\xcf\x69\x33\x78\x61\x81\x00\xe0\x28\x45\x72\x00\x0c\x64\x92\xfb\x10\x65\x58\x68\x15\x7e\xc6\xc8\x18\x57\x91\x5c\xa4\x3c\x33\xf4\xf2\xea\xae\x9b\xfe\x34\xc6\x65\x0a\x2e\xf3\xfb\x75\xe6\x8b\x44\x08\x00\x8e\xd2\x24\x07\xc0\x40\x2a\x39\xc7\x46\x87\xf3\x99\x94\xa3\x8f\x1b\xde\x31\x7f\x5e\x11\x9e\x99\xc1\x15\x96\x8f\x5d\x09\xe0\x4a\x9a\xff\x41\xd2\x32\x14\xdb\xfc\xeb\x06\x88\x52\x25\x07\xc0\x40\x2e\xb9\xcb\x5e\x1a\xf7\x86\x5e\x2e\xfb\xba\xfb\x3d\x9c\xc9\x7b\xce\x32\x25\x48\x8d\x7e\x15\x87\x81\xd7\xa1\xcf\x3d\x20\xf3\x87\xee\xbc\x16\x02\x80\xa3\x74\xc9\x01\x30\x90\x4c\xee\xfd\x8a\x9a\x03\x3e\x57\x50\x66\x81\x87\x22\x63\x1e\x43\x36\x26\x39\x62\x39\xe5\xba\x87\x7c\xd6\xdd\xcc\x70\xbb\x7b\xa3\x1a\xbf\xae\x19\x4a\x99\x1c\x00\x03\xd9\xe4\xd6\xf7\x2f\x6b\x8e\x19\xbb\x53\x24\x1d\x9e\x2d\x6d\x78\xa8\xa9\x33\xa2\x90\x95\xa3\xb9\xa5\xae\x2c\xc6\x11\x58\x2d\xaf\x34\xf7\xeb\x08\x80\xd2\x26\x07\xc0\x40\x3a\xb9\x42\x76\xc9\xc7\x81\xdc\xaa\x69\x2f\xd8\x3b\xb3\x39\x9f\x07\x46\x30\x7c\x65\xe0\x97\xdf\x7a\xeb\xbf\x92\x4f\xf4\x98\x12\xf7\xf1\xaf\x1d\x08\xa5\x4e\x0e\x80\x81\x7c\x72\xdf\x16\xf2\xbe\x47\x96\xd3\xfc\x90\x29\xa6\x8e\xe5\x6e\x75\xef\xb0\x99\xe3\x71\x70\xe0\xd5\x63\x3f\x54\xb2\x12\x5a\xec\xb5\xfd\x75\xd6\x47\xe9\x93\x03\x60\x20\xa1\x1c\xc7\x40\x41\x7f\x1b\xc5\xb9\x02\xa3\x40\xda\x69\xb4\x8f\x09\xce\x33\x7e\x18\x1c\x17\x7f\x7a\x33\x30\x0b\x32\x48\xce\x2a\xdc\x10\x47\x00\x70\x94\x42\x39\x00\x06\x32\xca\xad\x9d\x76\x8e\x6e\x33\xbd\xf5\x68\xa4\x58\x69\xd9\xbe\x32\xfa\xe7\xb9\x25\xbd\x12\x5e\x5e\xce\x42\x02\x91\x81\xe5\x40\xd6\x29\x6d\x04\x00\x47\x69\x94\x03\x60\x20\xa5\xdc\xb9\xa9\x72\x26\x6c\x9f\xa4\xb3\xdc\x2d\xcf\x37\x4b\xb6\x1f\x07\xbd\xd1\x94\x75\x2a\xfc\x5c\x98\x16\x4c\xa1\x7f\x3a\xb9\xc7\x9e\x01\x01\xc0\x51\x2a\xe5\x00\x18\xc8\x29\x47\x44\xf8\xf6\xab\x73\x2d\xe3\xc6\x30\xad\x83\x5c\xa5\x65\x4d\x5e\x8d\xc7\xf4\x3b\xd7\x41\x45\xd9\x6b\x57\x26\x1e\xbc\x91\xdb\xfd\x35\x0c\xa5\x53\x0e\x80\x81\xa4\x72\x55\xca\xd9\x7b\x2d\x17\x08\x6e\x63\xb9\x9b\xa3\xe9\x94\xf8\x16\x87\x5a\xb1\x3e\x91\x5d\xcd\xf5\x2a\x0a\xd2\x93\xd5\x37\x8c\xd0\x45\x00\x70\x94\x52\x39\x00\x06\xb2\xca\x45\xd6\x59\x2a\x4e\x17\x45\x65\x16\xd9\x4e\xdc\xb7\x58\xb9\xff\xa5\xf3\x81\x20\x97\x71\x69\xf5\x17\x6e\xf7\x6b\xa1\xa4\x0a\x5e\xbf\x86\xa1\xb4\xca\x01\x30\x90\x56\xee\xfc\x39\x31\x9c\xd4\xb9\xc3\xc0\x7c\xea\x75\xff\xdb\xa6\xe6\x57\xa4\x76\x48\xca\x83\x55\x64\x5f\x05\xe7\xd8\x3c\x25\xee\x3a\x2b\x8b\x00\xe0\x28\xb5\x72\x00\x0c\xe4\x95\xbb\xd5\xb8\xe1\xea\x91\x94\xa0\xf1\xad\xac\xba\x3d\xf7\x60\x9c\xce\xb9\xb9\x52\x52\x46\x3e\x03\x63\xd6\xe9\x86\xae\x7a\x86\x14\x3f\x02\x80\xa3\xf4\xca\x01\x30\x90\x58\xee\xd4\x66\xfd\x68\x92\x6a\x7d\xd4\x9c\x40\xe1\x3a\xe9\x88\x0a\xa2\x20\x4b\x91\xfc\x09\xfb\x59\x19\x6a\x56\x33\x2b\x09\xe2\x28\x1c\x04\x00\x47\x29\x96\x03\x60\x20\xb3\x9c\xa3\xda\x55\xda\x44\xb8\x94\xf4\x76\x2f\xe5\x12\xe6\x19\x71\xdc\x5c\x7b\x3c\xcd\xec\x09\x51\x5f\xec\xee\x41\x9c\xf7\xe9\x1e\xe8\x08\x00\x8e\xd2\x2c\x07\xc0\x40\x6a\x39\xf4\xfe\xd7\x89\x45\x4e\x3c\x3d\xae\xfb\x03\x3b\x54\xba\x41\x7c\x71\xb4\x59\xf9\x3a\x21\xda\x77\xac\xd8\xf2\xb8\xd6\xba\xfd\xf4\x11\x00\x1c\xa5\x5a\x0e\x80\x81\xdc\x72\x6f\xfc\x92\xe3\x94\x0d\xb0\xbc\x94\xb1\x12\x3f\x30\x9e\xbb\xf9\x45\x9b\xc0\x43\x08\x0b\xe7\xbd\x07\x45\xfa\x8a\x72\xdd\x82\x9d\x39\x02\x80\xa3\x74\xcb\x01\x30\x90\x5c\x8e\x00\xcf\x57\xe2\xd2\x4f\xcb\x1f\xd9\x2f\xa8\x76\x9b\xd9\xb6\xfc\xf0\x88\x8b\xa4\x0a\x09\x88\x2b\x7c\x7d\xc7\x13\xe2\xb6\x39\x54\x10\x00\x1c\xa5\x5c\x0e\x80\x81\xec\x72\xd2\x85\x86\x6b\x72\x56\x62\x06\x43\xb0\xf7\xf7\x14\x5a\xda\x9e\x5e\x13\x20\x57\x0c\xac\xc5\x48\x30\x15\xbc\x24\x20\xc6\xbf\xac\x81\x00\xe0\x28\xed\x72\x00\x0c\xa4\x97\xa3\xf8\x10\x56\x1c\xdd\x56\x63\xb9\x53\x6c\x8c\x93\xe5\x58\x2d\x68\xd8\x70\xe1\xd0\xa1\x05\x87\xa9\x9d\xba\x62\xa6\xe8\x5d\x06\x07\x02\x80\xa3\xd4\xcb\x01\x30\x90\x5f\x2e\xed\xfc\x8b\x9c\x18\x0a\xe9\x65\xeb\x9a\x4c\xbc\x43\xc7\x3d\x79\xb3\x9e\xd6\x4a\x0f\x3e\xfb\xcc\x8c\x1f\xfa\xad\x22\x3f\x7d\xc9\x11\x00\x1c\xa5\x5f\x0e\x80\x81\x04\x73\x82\x73\x8b\x7d\x2c\x9e\x7e\xed\x3b\x63\xcd\x73\x8c\xc5\x9d\x66\xae\x37\x17\x42\xf6\xf2\x5e\x39\xf4\x8d\x24\x61\x55\x0e\xa5\xdd\x45\x00\x70\x94\x82\x39\x00\x06\x32\xcc\x91\x5f\x2d\x18\xb9\x7b\x3d\x99\x68\x55\xc2\x2b\x40\x30\x5b\x95\x52\x36\xf7\xb9\x3c\x6c\x53\xa8\x90\x81\x62\x56\xeb\x0a\xa7\xe8\xaf\xd0\xa2\x34\xcc\x01\x30\x90\x62\x2e\xe2\x6a\xea\xad\x00\x0e\xa9\x73\xda\xcc\x5d\xf1\x1c\xd7\xb7\xd3\x27\x64\xd2\x6f\xdc\xcb\x2d\x90\xe4\x39\x90\x8d\x91\xf0\x8d\xfb\xb5\x09\xa3\x54\xcc\x01\x30\x90\x63\x6e\x89\xd1\xc4\xa3\x81\xce\x19\xe3\x12\x06\xdb\xf8\xe2\x00\x4b\x03\xc9\x5c\xfd\x5d\x56\x9e\xf1\x7c\xf8\x45\xff\x9b\x0c\x09\xec\xbf\xf6\x00\x94\x8e\x39\x00\x06\x92\xcc\x11\xb0\x56\x0a\x88\x65\x7c\xea\x26\x0c\xf0\x6d\xca\x96\x73\xac\xdf\x8f\xf1\x0f\xeb\xb5\x28\xd3\xb8\x75\x71\x8b\x69\x69\xd6\x49\x10\x01\xc0\x51\x4a\xe6\x00\x18\xc8\x32\x17\x43\xd6\xba\x9c\x3c\x61\xbc\x7a\x31\xfd\x49\x88\x9a\x83\xeb\xf8\xe4\xa3\xf1\x17\x8e\xfb\x54\x7d\xd3\x82\x29\xf0\xaf\x23\x95\xbf\x9e\x29\x51\x5a\xe6\x00\x18\x48\x33\x67\x48\x62\x2c\x36\xf7\x40\x47\xcf\x77\xf8\x4a\xa7\xd1\x77\xb7\x20\xad\x90\xaf\x56\x7e\xeb\x3d\x4c\x63\x56\x84\x0c\xe4\x5f\x1b\x34\x11\x00\x1c\xa5\x66\x0e\x80\x81\x3c\x73\x31\x9a\x3d\x4e\xd6\x4e\x96\x5d\x26\xde\x6d\x77\xe7\xea\x5a\xf2\xea\xbf\x9d\xf3\xbb\xa8\xd5\x22\x39\x75\x45\x4b\xe9\xf9\xa9\x04\x26\x04\x00\x47\xe5\x99\x7b\x43\xf4\xdf\x03\x1d\x39\x91\xcf\x70\x48\xb1\x94\x4c\xe4\x16\x59\xf6\xaa\x39\xfc\x9b\x6e\x9a\xc2\xd7\x9d\x03\xac\x9f\xae\x3f\x8c\x53\x7d\xf3\x77\x6e\x23\x12\x2e\x0c\xb2\x5f\x67\x45\xfb\x2f\xfd\x2e\xc1\xc4\xc6\xba\x99\x73\xcb\xe9\x65\x36\xba\x1d\xee\xd9\xd3\x77\x3f\xf9\x61\xb8\x6c\x1b\xb2\x63\x7c\x48\xf0\x27\xef\xdc\xf3\x39\x86\xf2\xe6\xc1\x52\x8d\x9f\x06\x89\x3c\xb7\xa4\x20\x79\x83\x3e\xaa\x35\x25\x71\xad\x49\x7b\xed\x42\xda\x63\x9b\x91\xf5\x59\x57\xc7\x84\x63\x28\x43\xd9\xdd\x15\x21\x62\xac\xc4\x17\x04\xf8\x85\x33\x94\x34\x2a\xc5\x3d\x9c\x64\x36\xa4\x8f\x3c\xf5\xa3\xc3\x73\xd5\x5b\x0e\x6f\x1c\x43\x3f\x8f\xaa\x58\x6c\x7e\x6e\x5a\xe0\xf1\x62\x47\x9f\xcc\xb3\x7a\xcd\x47\x3d\x16\x3a\x01\xb7\x8c\x4a\x35\x21\x08\x9a\x25\x54\xc8\x3c\x86\xaa\x23\x5e\xa6\x4a\x88\x29\x85\x18\x1f\xe8\xb4\x45\x38\x26\xc9\xc5\x1b\x14\x17\x3f\x1e\x20\x86\xdb\x3f\x95\xb9\x2c\x7c\x69\xe1\xec\x31\xf4\x9c\x8a\x6c\x0e\xff\x8b\xfe\xba\xfa\xf0\x66\x0b\xf6\x67\x8f\xb9\xe9\x2f\xe4\xbe\xd4\x09\x6a\xdb\x78\x6d\xf5\x63\x47\xfb\xfc\xb2\xea\x31\xb4\xa5\xe6\xe1\x70\xdc\x6b\xf2\xf5\xb9\x01\x3e\x3f\x25\xb7\x0c\xb9\x5b\x58\xaf\x86\x53\x2b\x86\x3f\xc5\xf4\x10\x37\xfa\x95\x74\xaf\x1c\x43\x1d\xed\x71\xbf\x7d\xab\x3a\xac\xb1\x08\xd0\x59\x9e\xf7\x31\x60\xaa\xb0\x2d\x37\xe3\xda\x79\xf8\x90\x8d\x52\x66\x20\x4c\xac\xd1\xfb\x18\xca\x5d\xbe\x40\xd7\x82\x5d\x22\x22\xe1\x48\x8d\xef\xaa\xfe\xf6\x4b\x4a\xb9\xfc\x73\xe6\x2d\xaa\x30\xed\xab\x7a\xa5\xc6\xe7\x93\xa5\x8e\xa1\x70\xa1\x33\x64\x51\xa2\x2d\x75\x0a\x0c\xd5\xf9\x96\x91\x74\x93\x3a\x04\xad\xce\xf7\x43\xae\xdc\xcc\x47\xf3\x28\x62\x8b\xa6\x3e\xfe\x07\x78\x4a\x77\x8e\xdb\x51\x4f\x32\xd1\xb9\x97\x9c\x6f\x51\xc9\x8b\x9f\x80\x6c\x49\xcb\x5b\xe3\x33\xad\x4d\x88\x93\xf5\xad\xe4\x74\xd1\x63\x28\x4e\x0d\x67\xf9\x08\xde\x13\xc9\x71\x9b\x49\x6c\xb9\x34\xa1\x80\x8d\x39\x3e\xc1\x01\x95\xe7\xc4\x76\xbc\xc3\x86\xba\x6e\xaf\x8f\xa3\x3b\x58\x91\x7d\x3f\x2d\xef\xb2\x2f\x12\xe6\x72\x16\xb9\x4b\x72\x75\x00\xef\xaf\xba\x5b\x48\x28\x9b\xa7\xf4\x56\x38\x4e\x3e\x84\x1d\x43\x65\x96\xbe\x56\x5d\x99\xcc\xdf\x7d\x7a\xee\x99\xc8\xfa\x5c\x58\xf7\xa9\x5d\xab\xa7\x3e\x8d\xf1\x15\x7d\xf7\xf8\x73\x1d\x3c\xa3\x68\x8f\xa1\x4a\xe7\x14\x46\x12\xa3\x4a\xa4\xce\xca\xca\xce\xf6\xd7\x5d\x2b\x4e\xda\x19\xda\xb0\xa1\xe1\x0a\x17\xab\xb8\x7d\xf9\xa2\xfa\xe0\xf9\xe3\x7f\xd6\x90\x77\x32\x2f\x63\xc2\xde\x2b\x44\x78\x37\xeb\xf7\xb7\xbd\x8f\xbe\x36\x59\x36\x52\x4e\x36\x55\xae\xb3\xa4\x82\xa9\x0f\x23\x3c\x86\x3a\xe0\xd1\x1d\x16\x47\x64\x77\xf1\x4d\x2e\x14\xbd\xe0\xbe\x9d\x4a\xb5\xa9\x1a\xbf\x59\xe8\x84\x4e\x12\x52\x34\x94\xaa\x07\x44\x1e\x43\xc3\x4b\xc2\xec\xce\x79\x5c\x39\xcd\xb0\x3e\x61\x54\x97\xc5\x19\xdb\xaf\x50\x39\x40\x4a\xf6\x41\xf2\xf6\xc2\xd5\x35\xcc\x07\x2d\x22\xc7\xd0\xc6\x98\x7b\x2d\x4c\x98\xf8\x6f\xd3\x36\x93\x48\x35\xfa\xda\x37\x46\x3c\x14\xb7\xdf\xac\xbe\x94\xf4\xb8\xa9\x18\xed\x5c\x1b\x47\x71\x0c\x65\x7d\x45\xae\xcd\xb8\x16\x6f\xf4\x92\xef\x92\x24\xeb\x07\xa6\x6b\x03\x80\x3c\x06\xe2\x63\x78\xd5\x78\xcc\x83\x8b\xbe\xf7\x37\xba\x8e\xa1\xcb\xe6\x9a\x67\x5e\xb6\x55\xdd\x14\x6b\x96\xee\xd7\xda\xde\xac\x30\xe2\xe0\xc9\x4a\xce\xd8\xad\x38\x95\xf1\x72\xe7\x4b\x23\x6b\xd2\xff\x7f\xe8\x38\x71\x82\xb7\x55\x64\x6e\x82\x50\xcf\xd9\x2f\xd2\x6f\x46\xdc\xf9\x2f\x6e\xc5\xe1\x1f\x22\xf2\x86\x1c\xd0\xaf\xec\x86\x33\x07\x1f\x43\x6d\x68\xd4\xf6\x93\x0a\x5d\xbc\xfd\xd6\xa8\x06\x85\x54\x12\x1f\xf6\x93\x33\xbd\xc2\x0c\x12\xe5\x88\xbb\x7e\xf5\x8a\xe9\xfb\x0c\xd3\x63\x28\x93\x16\xba\xed\x93\xc6\x48\xfd\x77\x41\xd7\x5b\x8d\xaf\x45\xa7\xf8\x49\x6d\xa7\x12\x6f\xd5\xf3\x78\xe5\xfa\x68\xa7\x52\x35\x8f\x1d\x43\xb9\x2e\xb0\x0a\x90\xae\xbb\x4b\x89\xac\x11\x13\x0c\x38\x48\xe0\x4e\x0a\x57\x88\x91\x5f\xc2\xf7\xa5\x13\x48\xd2\xe0\x5c\xce\x39\x7e\x05\x82\xab\x29\xac\xee\x50\x04\x33\x8c\x50\xd4\x9c\xfb\xde\xb9\x50\xdc\x6a\xde\xe3\x92\xb5\xf5\x82\x87\x35\x4d\xc9\xa7\xad\x1a\xbd\xfc\x18\x5a\x3e\xac\x54\xda\x77\x7e\x31\x4e\xbe\x4c\x72\x97\x61\xb0\xef\xb6\x75\x46\xca\x4e\xce\xdd\x86\xe6\x01\x87\x20\xc1\x30\xfe\x90\xe3\x53\xf1\xe8\x08\xdb\xf4\x08\xb2\x2f\x3f\x62\x69\xc9\xca\xbb\xf5\x96\xa0\x48\x21\x77\xc0\x02\xff\xa7\x79\x57\x5c\xad\x40\xb0\xa3\xd4\xa3\x63\x28\xa7\x9b\x41\x84\xeb\x6d\xc9\x21\xae\x66\x0f\x8a\x05\x79\xd5\x72\x72\xc4\xec\x6b\x31\xda\x16\xf4\x57\xb1\xfa\x4d\x54\x4a\x6b\xdc\xc7\xd0\xe4\x53\x13\x87\x39\xeb\x78\x82\xba\x42\x52\x89\x0d\xfd\xf6\x31\x4c\x86\x51\x21\xdd\xa5\x9d\x1a\xa6\xa5\x81\xe7\xce\xcf\x39\xb3\x1f\x43\x2f\xc4\x30\xd8\x2f\xdf\x26\x2b\xce\xd4\x27\x5d\xd4\x63\xcd\x2c\x88\xcc\x0e\x20\x45\xd8\x9f\x25\x39\x7c\xc6\xcd\x5a\xfd\xc1\x7e\xed\x18\x4a\xca\xde\xb6\xcb\x91\x69\x79\x65\x4c\x69\x76\xec\x85\x0b\x5b\x87\x60\x98\x41\x91\xbe\xe5\xf7\x7b\xe9\xa9\xaf\x5a\xd4\x75\xb1\xa6\x8e\xa1\x08\xb1\xd8\xf6\x7c\x46\x02\xb7\x66\xc7\x9b\x42\x74\x98\xc2\xdc\x57\x06\x3e\x5d\x79\xd0\x51\x28\xc9\x49\x41\x66\x76\xb0\xc6\x91\x7d\xfc\xba\xd6\x59\x24\xec\x0c\x37\x77\x67\xc3\x1e\x72\x09\xbc\xd0\x2f\xf4\xe1\xf7\xed\xe5\x60\x53\xe3\xe8\xbb\x92\x63\xf6\xd0\xdb\x1f\xfb\x78\x5c\xd2\xaf\x56\x67\x15\x7d\x3b\xeb\xa4\x1d\xcf\xeb\xad\xe0\x35\xe3\x7e\x13\xfb\xbb\x4f\x9d\xf1\x43\xcc\xd3\x3e\xea\xd2\x6c\xee\xc7\xaf\x2b\x73\x16\xf9\x4d\xee\x4a\xb8\x9c\x5b\x7b\xbc\x74\x0b\xfb\x66\x44\xb7\x42\xef\x7d\x5a\x11\x7e\x6e\x47\xb9\x98\xd1\x59\xe5\xde\xe3\x71\x51\x57\xf2\x15\x36\xc0\x7a\x94\xce\xb4\xf6\x39\x79\x33\x57\x80\xb9\xe4\xa9\xa2\x45\xa0\xdc\x00\xbd\x2f\xb9\xb9\x48\xdf\x45\x8d\xe8\xe3\x7b\x01\x2b\x3f\x8d\xa0\x98\x46\xdf\xcc\xa5\xa2\x45\xa7\x68\x1a\xae\x07\xdd\x53\x34\x2f\x88\xee\xc2\xa6\xea\x75\x1d\xa6\xc2\xca\x9e\x1d\x43\x03\xa5\x4d\xad\x1c\xb1\x29\x13\x23\x5f\xf9\x9e\x6d\x68\x52\x8f\x73\x35\x3b\x20\xdb\x29\x51\xba\x76\xe5\x23\xb9\x5d\x61\x62\xd3\xf3\x63\x28\x81\xd2\x47\x9b\x71\x4c\x39\x63\x91\xa7\x4d\xf9\x38\x97\x55\x09\xd5\x60\xb9\x97\x99\x59\x7b\x79\xc2\xc7\x3a\x31\xa7\x0d\x8a\x7b\x8f\xe7\xf5\xea\x95\x9a\x64\x17\x89\xc4\x70\xbc\x94\x6e\xfd\x0d\xca\xfc\xda\x96\x48\x2d\x02\x62\xba\xb1\xed\xf4\xb5\xea\x53\xf2\xd1\x87\xc7\x50\x9a\xd5\x83\xa6\x31\x75\xd8\xc7\xa7\x2e\xd7\x96\x77\x94\xe2\xa5\x0a\xbd\x76\x80\x7d\x3c\x12\xda\x18\x3c\xf2\x78\x03\xf2\xe5\xd9\x63\xa8\x29\xad\xd4\x0a\xff\x45\x9e\x8b\xdb\x92\xaf\x54\x76\x35\x5f\x72\x62\xf6\x87\x57\x71\x4a\x67\x04\xbe\x49\x1d\x4f\x70\x09\x8d\xde\x3c\x86\xde\x76\x94\x6c\x26\x31\xbf\x1c\x69\x97\x42\x44\x4e\xee\xfb\x48\xe6\x8d\xeb\x95\x12\xdb\xde\x5d\xe7\x03\x52\xd7\x69\x97\x71\x71\xe1\xe3\xc9\x92\x80\x97\x0c\x68\x5d\x0c\xf9\xa2\xed\xe4\xde\x3e\x80\xd7\xe6\xb4\xd7\x1f\x60\x44\x24\x37\xd6\xb0\x4b\xc5\x21\x31\x2c\xf9\xf5\x18\xda\x1a\x46\x4c\xea\xc8\x76\x59\xa5\x60\xc8\x5d\x45\x65\xe1\xac\x34\xc3\x6a\xe1\x6d\x9a\xb7\x8c\x46\xfb\x6c\x6e\xe9\xc4\xc2\xf1\x73\xc7\x50\x1e\x4f\x7b\x5f\x5d\xff\x1b\xe7\x05\xee\xc4\x5a\xf5\x9c\x8f\x9e\xfe\xc9\xb0\x5a\xe4\x69\xd3\x9a\x44\x72\x31\x9c\x4d\xd8\x9d\xf0\x62\x00\xfa\xbf\x3b\x0c\x84\x1e\x9b\x59\xa9\xe0\x80\xd3\xbe\xef\x76\xa0\x16\x6b\xa0\x82\xe3\x9d\xd7\x24\x61\x97\x4d\x26\x56\xec\x44\xd8\x75\x93\x63\x33\x1e\x16\xa0\x75\x0c\x2d\xa6\xa8\xe8\xf9\x11\x88\x7b\x53\x29\xf1\x8a\x51\x49\x64\xdd\xd2\xc7\x90\x31\x66\x09\x17\xf2\xf7\xb4\xd3\x99\x8f\xde\x35\x62\x8c\x49\x4a\xe2\xe1\xf9\x4a\x4a\x1e\xfb\x3f\x8c\xcf\x1c\xc4\x0a\x26\x5e\xb0\x6b\x6e\x58\x6e\x68\xbb\xbb\x39\xb7\x47\x8f\x9b\x9d\x65\xf9\x51\x4b\x23\xb8\x23\xa7\x6c\xde\xf6\xc5\x31\xb4\xeb\x89\x77\x42\xba\xf8\x42\xdf\xe7\x11\x85\x9a\x64\xbb\x3e\xb9\x24\xd3\xed\xda\xcc\x81\x8e\x0f\xb4\x45\x1f\xd7\x4b\x3b\x97\xa4\xfe\x5f\x4c\xdd\xc2\xfa\x77\x4b\xf3\xc7\x40\xc3\xf6\xbb\x22\xe1\x13\x18\x76\x45\x4b\x52\xf2\x1f\x7f\xf0\xb7\x8b\xc3\x56\x79\xd6\x9f\x18\x8a\x3c\xaf\xee\x11\x4b\xb7\x76\x9e\x5a\x1b\x31\x9f\xe7\xc1\xc7\x4d\xf3\xfd\x51\xf8\x86\xbf\xae\xe7\xff\xc5\x1f\xdc\x57\x16\x4d\x12\x0d\x0d\xed\x2a\x1a\xba\x0f\x1a\x1a\x9a\xaf\xa4\xe4\x7f\xff\x0b\x93\xf6\x51\x84\x81\x3e\x55\xee\xe5\xa1\x58\x39\xce\x27\x65\x33\x46\x6c\xfe\x3c\xe3\x2d\xe6\xa1\x02\xc3\x86\x6f\x73\x0d\x36\x6d\xb6\xb1\x18\xc9\xbc\x01\x6a\x7f\xe1\x53\x65\xd0\x04\x25\xc1\x1f\xfb\xb1\xf6\xd0\xb8\xd3\x7c\x43\x26\x3a\x77\xfd\x75\x70\x16\xce\x80\x03\xf7\xc1\x56\x47\xc1\xed\xc9\xca\xeb\x6b\xca\xa5\xfd\x9c\xb1\x7f\xe3\x63\x7d\x34\x4e\x7c\x6c\x22\xdf\x74\x5b\x3a\x49\x3f\x0f\x86\x84\x46\x42\x52\x27\x9e\xd4\xc7\x40\x9b\xc1\x54\xac\x94\x2b\x6d\x3d\xbb\x98\x09\x75\xbc\x94\x7f\x65\xb5\xc6\x27\x3e\xd6\xfa\xf9\x66\x27\xf3\xa4\xe3\xa7\xef\x12\xba\xe9\xd4\xf6\xab\x97\x0e\x54\x5c\x5b\x3c\xe6\x6e\xce\xf0\x74\x1a\x4c\x71\x44\x9c\xae\xfb\x2b\xab\xbd\x7f\xe2\x63\x55\x44\x15\x8a\xdd\x95\x76\x35\x5f\x6b\xce\xa9\x60\x24\xa7\xe6\xbd\xf2\xbd\x57\x46\x21\x91\x2d\xb8\x96\x85\x57\xdf\xd9\x87\x71\xfa\xff\xfb\xc7\x1a\xfc\xbb\xe8\xfa\x63\x62\xc1\xfc\xa4\xd0\xd1\x10\xc7\x3e\xf1\x81\xa8\xc8\xaa\x9e\x69\xe8\xdb\xf4\xfe\x7d\x4d\x83\x2f\x95\x03\x34\x8f\x2b\xd1\x42\x2e\x0d\x08\x5f\xaf\xa1\x3b\xe7\xb6\x3d\x28\xef\xa3\xfb\xef\x38\x3f\x29\x9f\x7f\xcc\xe5\x7f\xca\x5a\xf2\x79\xcc\x09\xe3\x2d\xf1\x2a\x93\xfe\x32\x6e\x27\x46\xa3\xcd\x0f\x01\xee\xa6\xe2\x91\x01\x7e\x44\x38\xed\x04\x1f\x72\x2e\x14\xe7\x27\x85\x86\x79\x7c\xee\x24\xb7\x77\x9c\xf3\xd2\xe7\x59\x41\x0d\xcf\x05\x2f\xac\x6a\x77\x3e\x2d\xfc\xee\xe5\x54\x4f\x97\xfb\x19\xb9\xd6\xc3\x39\x52\x08\xe4\x5c\x28\xce\x4f\x0a\x0d\xe7\xf8\xdc\xa7\xca\xeb\x0d\x09\x1f\x1b\x39\x71\xf0\x09\xfc\x32\xb3\x49\x4e\x93\xd6\x87\x95\x90\x11\xb0\x64\x3b\xd4\xa5\x45\xf3\xdb\x8f\xfa\x20\xe7\x42\x71\xe0\xeb\x3b\x06\x94\xed\xed\xa8\xb6\xc0\xdb\xad\x1d\x17\x54\x9e\x4e\x4e\xe8\x5a\x1f\x62\x60\x8c\x73\xb2\x7f\xb8\x67\x4d\x36\x53\x33\x89\xed\x23\xf3\xef\x38\x3f\x29\x34\x3a\x1f\x44\xc0\x15\x2d\x49\x29\x34\xf4\x13\x31\x30\xf8\x77\x77\x91\xdf\x05\xe0\xa3\x1a\xb1\x38\x0c\x37\xf5\xd5\xde\x9c\x7e\x6d\x4d\x4f\x0f\x4d\x96\x63\x6b\x3b\x51\x96\xc5\x95\xee\xb5\x1f\x21\xfa\x0d\x57\x2a\x90\x0b\x87\xe2\xc0\x01\x08\xc8\x20\xeb\x2b\x58\xe4\x39\x4f\x49\x59\x1c\xc0\x5c\x3f\x9f\x8c\x43\xab\xe2\xed\xee\xd1\x33\x8c\x2e\xf3\xa3\x3f\xb1\xbe\x9a\x10\x39\x17\x8a\x03\x07\x40\x4b\x4e\xcc\x58\xd4\xc7\x24\xfa\xd4\x48\x88\x77\x7e\xc7\xf9\xeb\x92\x71\xb0\x5a\x39\x6e\x5f\x6a\x8a\x05\x6d\x19\xb8\xd3\xdd\x47\xc8\xb9\x50\x1c\x38\x00\x8f\x31\x3b\x6d\x27\xc6\xb4\xb0\x6d\x3a\x9f\x1b\x10\xd1\x9d\x1a\x30\xae\x78\x11\xc2\x99\x30\x01\x17\x7b\x19\xf2\xa3\xdb\xee\x43\x15\x72\x2e\x14\x07\xbe\xbe\x6c\x51\x7c\x46\x6c\x53\x8b\x6f\x30\x44\xef\x6a\x65\x50\x37\xa8\x5f\x6d\xea\x6d\x5c\xb4\xa3\xda\xab\xc4\xc1\x0c\xfe\x41\x33\xdb\xea\x73\xf5\xdf\x71\xff\x0b\xc0\x7f\xf6\x8e\x3f\x44\x00\xea\x8e\xfe\xbb\x08\xd4\xb4\x5f\xaa\x5c\x1f\x3d\x3f\x98\x3d\xda\xeb\xbd\xcf\xc9\x56\xe3\x1d\x75\xf7\x5d\xe4\x0b\x0c\xd3\x8c\x19\xa3\x3b\x3d\xb8\xdc\x92\xc8\xa5\x43\x71\xe0\x08\x34\x37\xd3\xed\xb2\xd0\xf1\xf9\xa6\x4e\x60\x53\xc6\xaf\x28\x2e\x0a\x53\x93\xd4\x55\x6d\xb0\x72\xf7\x16\x7c\x2b\xb4\x68\x1e\xa7\x43\xce\x85\xe2\xc0\x11\x28\x7a\x77\x8b\x85\x9b\xa4\x64\x78\x29\x89\xc7\x37\x95\x63\xa6\x4a\xf8\xa9\x2a\xae\x57\xb9\xcd\xdd\x99\x4b\x46\x13\x6a\xbc\xd9\x91\xc8\xb9\x50\x1c\x38\x02\x3e\xd9\xe9\x5d\xb4\x92\x56\x55\xcb\xbe\xad\x3d\x53\x8b\xb7\x83\xa5\x69\x15\x6f\x09\xe4\x52\x79\x5e\x7e\x1c\x1c\x7d\x0a\x51\xb6\x8b\x9c\x0b\xc5\x81\xaf\xef\xcf\xa6\xab\x6f\xaf\x59\xf8\x8a\xa5\x29\xa3\x69\x95\x64\x7d\x66\xae\x13\x58\x5d\x13\xee\xdf\x63\x13\x61\x55\x7b\x4c\xd4\x2b\x2a\xed\x23\xf7\xef\xb8\xff\x45\xe0\xbf\x1b\xf9\x1f\x32\x00\xb5\xbd\xfe\x2e\x03\x7a\x4e\xbc\x2b\xd4\x2e\x89\x8a\xf8\x1e\xcb\x95\x43\xed\x97\x88\xbd\x18\xcd\xd3\x2b\xe8\x85\x49\x81\x48\xe3\xac\x7a\xcc\x1b\x67\x90\x6b\x87\xe2\xc0\x19\xb8\x69\x0d\xe3\x09\xb5\x8b\xb5\x47\xfb\x41\x6e\x5e\xdb\xa0\xa3\x55\xdf\x9f\x9c\x64\x84\x13\xb1\x1a\x9d\xf0\xdd\x43\x6b\x7f\xe7\x3e\x72\x2e\x14\x07\xce\xc0\x03\x46\xb7\x51\x96\x5a\x87\x4f\x5a\x1e\xbe\x37\x05\xc2\x30\x53\x9e\xd1\x28\xac\x3c\x22\xe7\x7e\xa1\xa1\x99\x55\xf6\x33\xe7\xd4\xed\xa3\x7d\x0b\x82\x03\x67\xa0\x89\xf9\x7a\x12\x06\xdb\xe7\xa2\x98\xe7\x7c\x40\x66\x95\x21\xde\x69\x85\xe2\x2b\x8f\x9e\xcc\x3e\x3b\x23\xe6\x2d\x0f\xab\x4c\xa4\x41\xce\x85\xe2\xc0\xd7\xd7\xe5\xc1\x5d\x95\x87\x3f\x2d\xd6\x84\xea\x5d\x45\x03\x2e\xdd\x53\x2d\xc3\xb5\xfc\xea\x22\xf7\x85\x85\xa7\xd2\x4e\xef\xd6\xeb\xd2\x7c\x64\x06\xa0\x38\x64\x06\xfe\x73\xaa\xfa\x43\x06\xa0\xce\x3a\xbf\xcb\x00\xe1\x83\x9f\x2d\xf0\x76\xe1\x11\xb5\x3a\x6d\x3f\xbe\x60\x0e\x49\x9b\xeb\xef\xb5\xea\xa7\x1a\xf7\xc4\xa4\x56\xdf\xe9\xa5\x6d\x4c\x23\xd7\x0e\xc5\x81\x33\x60\x53\x0f\xb3\x21\x57\x3a\xad\x6b\xce\xba\x67\xfe\x51\x4b\x9f\x97\xbf\x24\xf3\x66\xd2\xd8\x23\x75\x63\xfe\x27\x54\xaa\xdb\x56\xc5\xc8\xb9\x50\x1c\x38\x03\xbe\x37\xba\x03\xfa\x6c\x67\x75\xa3\x3c\x54\x0c\x49\xf7\x05\x9e\xfa\xb7\xbf\x2f\xf9\x10\x5d\xd7\xd4\xea\x49\xe2\x7d\x26\xc2\xd6\x1b\x39\x17\x8a\x03\x67\x40\x50\x3a\xe4\xb6\x67\x81\xec\xd7\x57\xe3\xf2\x7a\x3e\x2d\x3c\x8f\x26\x65\x48\x28\xd7\xae\xdd\x21\xba\x7f\xe6\x9b\x89\xad\xf5\xcb\x75\xe4\x5c\x28\x0e\x7c\x7d\x57\x7a\xbf\x19\x3c\xa6\x9e\x92\x10\xf5\x35\x6b\x97\xac\xb4\x3d\xa3\x2f\xc3\xfd\xfe\xad\x62\x78\xa5\xff\xad\x15\x89\x20\x3f\xcd\x1b\xc8\x0c\x40\x71\x47\xf7\x01\xe3\x3f\x67\x00\xea\xe0\xf9\xbb\x0c\xcc\xfe\xa0\xee\xcb\x38\x25\xa8\x1d\x93\x4b\x3c\x6c\xa7\x9d\x29\x1e\x1c\x20\x38\x8f\xfd\x2a\x30\x1f\x8d\x3a\x88\xbd\x82\x3c\x62\x0a\xb9\x76\x28\x0e\x9c\x01\xc1\x0d\xea\xe0\xf7\xc6\xe2\x5b\xaf\xdd\xbd\x61\x58\xc5\xe2\x0f\x3f\xec\x58\x13\xee\xd5\xbd\xbb\x28\x5e\xe6\x33\x25\x11\xfe\x4a\xf9\xe8\x9a\x42\x70\xe0\x0c\xdc\x91\x5f\x6f\x7a\x86\x33\xa4\x5c\xc7\x48\x75\xa3\x47\xac\xc3\x85\x3c\xd8\x2a\x23\x31\xf4\x5b\x02\xc3\xfa\x30\x15\xbb\x79\x43\x0e\x72\x2e\x14\x07\xce\x00\x16\xa7\x18\xfd\xa5\x30\x91\xd5\x37\xdc\x09\x68\x32\xab\x18\x59\x35\x7e\xd3\xd3\x33\xa3\x12\xfe\xdf\xaa\x44\xf2\x2f\x7d\x1d\xac\x46\xce\x85\xe2\xc0\xd7\x77\x93\xe0\xc1\x42\xf4\x33\x3b\xc5\x05\x5b\x17\x0f\xd2\xef\x9c\x85\x43\xa3\x40\xbd\x3d\xef\xb3\xa9\x26\xca\x21\x67\xdf\xec\xe0\x60\x64\x06\xa0\xb8\xa3\xfb\xc0\x7d\x14\x19\x30\xfa\x77\x4f\xee\xfe\x58\x98\x30\x3f\x19\x74\x34\xb4\x7f\x1e\x5a\xd4\xfa\x2f\xbe\x25\x7a\x3f\xa1\xfc\x24\x5d\x24\xd1\x6b\xc3\xd3\xf0\x7c\x5d\x83\xe1\x95\x85\x53\x58\xb3\xe8\x79\xaa\xec\xd4\xcc\x3e\x7a\xff\x8e\xf3\x93\x41\xf3\xf9\xe7\x64\x46\xac\x80\x1b\xad\xea\x83\xaf\xad\x8c\xb4\x2a\x46\x08\xce\xd4\x84\x60\x95\x61\x1a\x2c\xc3\x9c\xd9\x85\xc8\x06\x57\x86\x9f\xeb\x20\x27\x43\x71\x7e\x32\x68\x98\xff\x9c\x5c\x76\x5d\x2e\xa6\x40\xe3\x4b\x7f\x61\xce\x69\xb3\x89\x4f\xc2\x5e\x29\xfe\xe7\xfb\x7b\x80\x70\x0a\x5f\x66\xdd\x28\x39\xc6\xf1\x31\xe4\x64\x28\xce\x4f\x06\x0d\x0d\x0d\x76\x7c\xb2\xb7\xc8\xa3\x2c\x1f\xd1\x58\xcc\x3b\x3b\x52\x04\x59\x5d\xca\x7b\xc3\x03\xc9\x5f\x9b\x08\x2d\x87\xec\xee\xc4\x3e\x5b\xd9\xf4\xcd\xf3\xb9\xf0\xef\xb8\xff\x4c\xa6\xf3\x41\x5c\xe9\x45\xd6\x35\x50\x3f\x90\x39\x5e\xd7\x74\xc5\x5c\xb2\xca\x21\x5d\xcb\xb6\x66\x38\x13\xf8\x81\xb9\xd5\x51\x64\xc7\x8c\x6b\x21\x2b\x80\xf4\xbd\xfc\xa9\x97\xbd\x73\xcb\xf2\xc7\xd0\xa9\x7c\x1d\xe6\x00\x5f\x9f\xcd\xea\x54\x1e\xce\x37\x37\x82\xe5\x95\x4d\x1f\xcc\x44\xcb\xfe\x0c\x5d\xcc\x18\x1f\x8d\xab\x16\xdf\xf9\xbf\x52\xd7\x6c\x63\xfd\xbb\xa5\xfd\x3f\x75\x8d\x94\x1a\x19\xe8\xe9\x3a\xee\xe3\x8e\x58\x9d\x47\xf5\x38\xcb\x64\x41\x92\x3d\x3d\x0b\x53\x91\x5d\x6f\x35\xcd\x79\x59\xe2\x9b\x07\xca\xc3\x0b\x12\xec\xc9\x7f\xa3\xaf\xa9\x3b\xd1\xd7\x10\xbf\xba\xb7\xc7\x46\x25\xf3\xa6\xef\x00\xbe\xe3\x38\x21\x3b\xca\x4e\x6e\x4c\xf9\x15\x97\xa0\xf6\x92\x0a\x43\xc4\x68\x80\x84\xfe\xdf\xa8\x12\x24\x4f\xf6\x35\x9f\xfd\x53\xf7\x5e\xa4\x15\x24\xfa\x6b\xa7\x71\x37\xed\x71\x78\xa8\x33\x65\xdf\xc5\x65\xfa\x88\xa9\xbd\x66\xda\xe6\xd1\x29\xad\xfe\x37\x3e\xb6\xee\x64\x5f\xa3\xb9\xee\x5e\x4e\xea\x66\xe1\x28\x39\x3f\x9a\x5d\x4c\x8c\x3b\x6a\x8c\x7f\x90\x9a\x20\x86\xb5\x74\x8d\xc3\xd5\x4f\x43\xaf\xfb\xf5\x5f\x59\xed\xc9\xbe\x06\xdb\x0c\x97\xcb\x74\xe4\x9a\x63\xaa\xa9\xbf\xa7\xda\xe1\x99\xc0\xcd\x9f\xa1\x29\x4d\xb7\xf6\x16\x4e\xb5\x27\xd6\xc4\xb8\x0b\xbd\xfc\x2b\xab\x3d\xd9\xd7\x10\x7c\xbf\x3c\xab\x21\x4f\x24\xbe\x71\xc6\x44\x62\x27\x57\x32\x48\xc2\xfb\x93\x5d\xc2\xd5\x6e\x27\x23\xd2\x20\x2b\x89\x94\x2e\xdf\xbf\xd6\xd7\x40\x45\xf7\x77\xfb\x73\xa6\x19\x7d\xe3\x76\x4e\x80\x50\xf4\x20\xcc\xde\x93\x45\x72\xec\x7c\x48\xd4\xab\xad\xb5\x1c\xed\x67\x19\x29\x54\xcf\x36\xe4\x8e\x9e\x51\xa0\x38\xf0\xfe\x7c\xe5\x56\xc7\x25\x67\x0b\xf4\x1e\x62\x3e\x07\xfc\x19\x66\xb8\xb6\x29\xe1\x69\xe1\x11\xfb\xfb\x4a\xdd\xfd\xaf\x48\x6a\xee\x55\x00\xc8\xb9\x50\x1c\x78\x7f\xde\x30\xd3\xb8\xb4\x62\xcb\xd0\x7b\x99\x9b\x21\xec\xf3\xe3\x5b\xd9\xeb\x4b\x74\x58\x80\x6a\x12\xc3\xe3\x7e\x0d\x3d\xe7\xab\x4a\x69\xc8\xb9\x50\x1c\x78\x7f\xb6\x32\xfc\x18\x14\xcf\x4d\x59\xac\xd3\x7b\xa1\xb9\x0a\xf3\x02\x3b\xbf\x88\xa2\x95\xf9\xdd\x8f\x7c\x0c\xbc\x31\xf3\x57\x9d\x4e\xd9\x21\xe7\x42\x71\x7e\x52\x74\xff\xb8\x0e\xaf\x5f\xbc\x57\x2f\xc0\x2d\xed\x71\x69\xdc\x35\x6e\xfa\x26\x1d\x74\x39\xfa\x35\xbb\xf1\xf5\x3c\x59\xad\x0d\xee\xcf\x15\xcf\x2f\x08\xf9\xc8\xfe\x3b\xce\x4f\x0a\x0d\xdd\x07\x11\xf0\xeb\x7e\xf5\x87\x13\x1a\xd4\x6d\xe4\x77\x09\xd8\x35\x81\x29\xf3\x0f\xea\x06\x51\x61\x24\x15\x56\xa0\xd5\x03\x2c\xb7\x30\x00\xec\xbc\x20\x29\x8a\x18\xcd\xcb\x36\xdd\xa7\x5f\x21\x57\x0e\xc5\x81\x13\xa0\xfc\x9d\x30\xd8\x43\x66\xbe\xfd\xbb\x80\x2d\x85\x37\xcc\xc1\x3a\x81\x01\x4d\x3e\x1d\x73\x47\x43\xcf\x23\x72\x9e\x19\xc1\xac\x83\x9c\x0b\xc5\x81\x13\xe0\xb5\x67\xe2\x80\x25\x29\xe9\x68\x95\x4f\xfc\xea\x74\x8e\x74\xd1\x07\x9f\x0b\x06\x9e\xd9\xa6\x7b\x83\x5e\x89\xda\xc3\x2a\x2c\xdb\xc8\xb9\x50\x1c\x38\x01\xae\xdc\x41\x53\x1b\xd2\xed\xa5\x1f\x48\x49\x3b\x5c\xb6\x61\x6b\xf6\x0c\xaa\xdf\xa9\xa5\x5f\x5f\xb4\x50\xa0\xff\x7e\xdf\x3d\x3c\x06\x39\x17\x8a\x03\x27\x20\xde\x54\x81\xab\x44\xf4\x8c\xab\xe1\xcd\xad\x45\x21\xaf\x38\xf1\x7b\xbb\xfa\x9e\x16\x68\x0a\xde\xdd\x2a\x9a\x75\xdd\x12\x1c\x12\xc8\xc2\x06\x8a\xfb\x5f\x02\xfe\xb3\x79\xfc\x21\x02\x50\xb7\xf4\xdf\x45\x40\x0c\x76\x9d\x90\xdc\x5c\x97\x76\x71\x4c\x26\x13\xc8\x49\x7b\x99\x28\xd3\xd7\x5f\xa6\x6e\xf1\x35\x21\xd0\x78\x4b\xa2\x1d\x61\x8c\x5c\x3a\x14\x07\x8e\x00\x19\x79\xd6\x8f\x8f\x52\x43\x91\xf2\x21\xd2\x68\xda\xa4\xa4\x04\xd5\x7d\x66\x59\x62\x85\x84\x8f\xf7\xd2\x4d\xdf\x75\x3b\xab\xba\x22\xe7\x42\x71\xe0\x08\x94\x65\x20\x4e\x7d\xe6\x39\x4d\x32\x4a\x9b\xcb\xd3\xea\xe0\x78\xe6\x73\x6d\x77\xe5\xd4\x6b\x71\x17\xf4\x3b\x04\x32\xd6\x35\x17\x8e\x0e\xff\x50\x1c\x38\x02\xf8\xb5\x0a\x54\xa6\xbd\x68\x6c\x36\x97\x45\x52\x30\x75\xb8\xfa\xdc\xd4\xe2\x59\x6a\x49\x73\xbe\xfa\x7f\x6b\x3d\x63\xbf\x21\x6d\x81\x9c\x0b\xc5\x81\x23\xa0\x30\x69\xd4\xcd\x08\xb3\x0e\x51\xba\x48\x19\x96\xab\xd1\x30\xf7\xe9\x5d\x2f\x93\xa1\x4b\x66\xa0\xcf\x87\xf4\xfd\x8e\xd5\x8f\xb2\xc8\x43\x3a\x14\xf7\xbf\x08\xfc\x77\x27\xff\x43\x06\xa0\xf6\xd7\xdf\x65\x60\xd2\x39\xc2\x6b\xa0\xcd\x33\x4a\x53\xbf\x83\x23\xf6\xed\xb8\xa9\xae\x5a\xfb\x8b\xf6\x0d\xd9\x37\xcd\x0a\x2d\x74\xe6\x9b\x5d\xba\x47\x45\x38\x04\x07\xce\x80\xe9\x21\x1a\x9b\x99\x6d\xd8\xe9\xf3\xd4\xd6\x4e\x5f\x39\xb5\x6b\xf1\x19\xcf\x9d\x2e\xa5\x34\xb2\xa5\xae\xb7\x91\xd8\x52\xe3\xfa\x80\x9c\x0b\xc5\x81\x33\xa0\x78\x53\x6c\x4c\xf0\xb0\x7d\xb0\x9b\x38\xf9\xd1\xe8\x43\x25\xb7\x84\x70\xc7\x81\xf5\xc6\xce\x40\xa9\xfb\xeb\xec\x2e\xb9\xb5\x1c\xc8\xb9\x50\x1c\x38\x03\xb6\x30\xad\x17\xf6\x16\x78\x4a\x1b\xc6\x03\xbd\x9d\xfc\x44\x92\x9f\x6e\xc3\xdb\xd3\x97\x08\xc7\x95\xa5\x82\x3e\xf5\x62\x86\x35\x20\xe7\x42\x71\xe0\x0c\xb8\xbe\x4a\xd2\xf0\xba\xa7\x01\x77\xbb\x76\xfb\x91\xb1\x71\xc3\x13\x65\xc2\xdc\xef\x37\x7a\x5f\x13\xef\x77\xaa\xfe\xf0\x67\xbe\xe4\x83\xcc\x00\x14\x87\xcc\x40\x1d\x44\x61\x03\x75\xd8\xf9\x5d\x06\x64\x96\x12\x52\x65\xf6\xd2\xd6\x49\xec\x2f\x51\x2b\xf7\xdc\x78\x2f\x96\xb3\xd8\xc8\x7d\x6f\xea\x11\xb7\x6e\x6b\xa7\x5b\xd1\xee\x63\xe4\xda\xa1\x38\x70\x06\x44\x78\x68\xab\x68\x8b\x69\x2d\x8b\xa9\xc9\xc8\xed\xaf\x9c\x5d\xde\xc6\x33\xad\x1f\x7b\xe9\x2f\xfa\x90\xcf\xb0\x9e\xbf\x9d\xd1\x09\x39\x17\x8a\x03\x67\x40\x52\x1b\x3f\x26\x62\xee\x30\xff\x3b\xe7\xd9\xe9\x86\xce\x1d\x61\x56\xfe\x5d\x71\xe9\x5b\x1f\xcd\x9f\xd1\x16\x64\x89\xb0\xdf\xc1\x47\xce\x85\xe2\xc0\x19\x28\x03\x1c\xd4\x1a\x35\x97\x5e\x39\xd6\x44\xad\xcc\x67\xbf\x90\xbd\x42\xcc\xae\x1c\xdb\x39\x98\x9a\x3a\xfe\xf5\x9e\x1b\xbe\x98\xff\xd1\xfd\x05\x82\x03\x67\xa0\xa4\x6f\xe9\xfe\xb0\x08\x15\xd6\x1e\x22\x8c\xd5\x77\x8e\x26\xe0\x42\x7a\x12\x5a\x94\xef\xb3\xfc\x33\xe8\x34\x72\x32\x2e\x26\x98\xc8\x0c\x40\x71\x47\xf7\x01\x88\xc2\x06\xea\xe4\xf9\xbb\x0c\x98\x2d\xd7\x48\xa8\xeb\x67\x50\x04\x0f\x4e\xd5\xdd\xcd\x9a\x19\x2e\x5e\x44\x64\xa4\xee\x9e\x96\x48\xc0\xfb\x50\x90\x3c\xdf\x4c\x8d\x5c\x3b\x14\x07\xce\x40\x64\x89\xa4\xac\xa3\x62\xdd\x86\xf1\xe7\x5c\xd9\x90\xbe\xfd\x97\x97\xd4\x99\x4e\x2d\x0d\x9a\x38\xba\xe3\xfd\x98\x12\xe3\x2a\x3d\xfa\x77\x05\xc5\x81\x33\xb0\xf3\xc2\xd6\x87\x74\x93\xaf\x67\x56\xfa\x9c\x7c\xc1\x46\x18\xc1\xf5\xed\xba\x4b\xec\x31\x2d\x99\xd6\xdc\x53\x14\x4d\x32\x92\x47\x25\x23\x14\x07\xce\x00\x69\x61\x1e\xc2\x7e\xe7\xfc\xb0\x84\xb4\x59\x59\xdc\x74\x66\x4d\x5c\x54\xc4\xee\x04\x82\x3f\x8a\x3b\x7c\x01\xdb\x45\x42\x84\x1f\x39\x17\x8a\x03\x67\x60\xa6\x43\x30\x49\x2b\x84\xc7\x7a\xb1\xc3\xb5\xa8\xac\xbc\x4c\x81\x79\xd6\xaf\xf4\x91\x2f\x81\xad\xb0\xd2\x88\x48\x2a\x29\x45\x19\x32\x03\x50\xdc\xd1\x7d\x00\xa2\xb0\x81\x7a\x76\xff\x7d\x61\x93\xeb\xd4\x38\xba\x2e\x8e\x6b\x1c\x79\x63\x28\xc1\xd7\xf3\x3a\xa6\x56\x19\x40\x72\x7e\x27\xca\xb4\xb8\xfc\xcb\x55\x89\xd9\xf3\xb9\xc8\xf2\x03\x8a\x3b\x59\xd8\x00\xdc\x35\xa2\x6b\x43\xfb\x4b\xcc\x7c\x94\x61\x01\xa2\x74\x73\x04\x39\xcf\x0d\x19\x30\x5f\x30\x87\x7d\x43\xc3\x19\xd4\xf5\x5d\x43\x4e\x86\xe2\x4e\x16\x36\xb1\x3b\xec\xe2\xcf\x39\x6e\xef\x3e\xb4\x67\x61\x93\x37\x7d\xc8\x9b\x25\x50\x30\x6a\x5a\xd5\x91\x92\x4d\xfb\x4c\xe0\xce\x4d\x96\x38\xe4\x64\x28\xee\x3f\xb5\xca\x3f\x7f\x48\x7c\xba\x89\x4f\xae\xdf\x6f\x66\xfb\xe0\x34\x9e\xa9\xd8\x6d\x32\xf7\xf2\xe1\x89\x86\x6e\x5b\xab\xae\x26\x3e\xae\xb7\x9c\xce\x45\xc8\xc2\x06\x8a\xfb\xcf\x64\xf4\xe3\x85\x0d\xd4\x6b\xb1\xc7\x0b\x1b\x05\x15\x25\xd2\x55\x32\xd2\xd6\xe8\x84\xbd\x06\x2f\x45\x8a\xd7\xcd\x03\xcf\x3e\xdf\x1e\xd8\x3f\x4d\x4d\x61\x82\x96\x4e\x45\x7e\xfc\x39\x52\xe1\x91\x07\xcc\x72\x6e\x70\x7f\xf8\x5c\x9f\xea\x2a\x6b\x77\x5d\xba\x7d\x9c\xb3\x06\xa9\xf2\x7e\x69\x61\xba\xd5\xdd\xb7\x2c\x5c\xff\xd7\x0a\x1b\xa8\xa5\x1d\x2b\x6c\xa2\xc1\x85\x0d\xa3\xfb\xd5\x99\xd2\x89\x4a\xee\xcf\xca\x61\x0f\x9a\x92\x9e\xb4\x7b\xac\x26\xe1\x1a\xb4\xf1\xce\x15\xb6\xb9\x7d\x9d\x4e\x7a\xf1\xe6\x6f\x14\x36\x68\x4a\xe0\x87\xfa\x8d\x36\xd5\x21\x37\x78\x13\xa9\x84\x88\xab\x30\x65\x19\x61\xea\x13\x85\x30\xf5\x8f\x17\x79\xc7\x52\xbf\x3f\xb8\x0c\xe8\x18\x85\xfd\x95\x77\x3f\x4e\x16\x36\xf6\xfc\x5a\xfc\x69\x4a\x0b\x6f\x78\x14\x0a\x02\x74\xae\xbe\xf5\x2f\xbd\x77\x21\x08\x7b\x3f\x4d\xfa\x45\x68\xa1\x57\xf6\xe8\x40\xd3\x5f\x79\xd3\x45\xf3\xc4\xc7\x26\xd0\x2b\x18\xd2\xa1\x39\x3d\xbf\x54\x59\x37\x4d\x89\xb9\x2f\x94\x6c\xa8\x6d\xe8\x43\x4b\x8c\x3b\x75\xb8\x32\x2b\x14\xa1\x72\xe7\xaf\xac\xf6\x64\x61\xb3\xd8\x13\xfd\xf0\xde\x26\xcb\x62\xf2\x75\x46\xfd\x89\x69\x0d\xa3\x40\xcd\xd5\x5d\x42\x1d\xed\xcb\xf3\xb2\x4c\x34\x4d\x86\x81\xf3\x7f\x65\xb5\x0f\x4e\x7c\xec\xc2\xa0\xa9\x07\x2d\xe1\x29\x91\x55\xfd\xe4\x3b\xda\x94\x76\xd6\x16\xee\x64\x32\x69\x4f\xec\xc2\xdf\x99\x29\xb3\x3d\xb4\x0e\xe7\xf8\x6b\x85\x0d\x54\x74\x7f\xb7\x3f\x27\x6d\x06\xab\x5e\x32\xc0\x5c\x58\x74\x74\xc3\x6d\x7c\x1b\xda\x17\xc1\xc4\x8b\xd5\x6d\xcb\x45\xd7\xf3\xd4\xfd\xd2\x85\x0a\x21\x29\xe4\xbe\x04\xc5\x81\xf7\xe7\xce\xbd\x12\xc7\xeb\xe3\x41\x75\x84\x8a\xb0\x88\x75\xc2\x5e\x83\x81\xc6\x9f\xd6\x3c\x42\x92\x13\x66\x52\x12\x9b\xc9\x1e\x67\x43\x90\x73\xa1\x38\xf0\xfe\x6c\x17\x28\x8d\xb1\x32\x43\x53\x8e\xed\xbc\xff\x86\x59\x9e\x5f\xec\x4b\x9a\x60\xf9\xbb\xc6\x67\xa3\x53\xc9\x94\xac\x04\xa7\x1e\xaa\x20\xe7\x42\x71\xe0\xfd\x39\xe3\x6c\x5c\x44\xd4\x42\x5e\x37\x5a\x88\xba\x48\x8c\x26\xd9\x4a\x91\x83\x91\xa1\x0f\xf7\xb0\xeb\xab\xd8\xc1\xa0\xed\xf5\x89\xa3\x33\x25\x14\xf7\x6b\x1f\x3d\x3e\x37\x5c\xb1\x49\xb8\xd5\xe4\xd5\xa8\x86\x12\x7c\x90\xb3\x23\xd9\x30\xb0\x93\x49\x7b\x03\x7d\x48\x76\x34\x86\x4b\xe1\xb6\xcd\x95\x20\x64\x61\x03\xc5\xfd\xda\xf7\x7d\x10\x01\xbf\xee\x57\x7f\x38\xa1\x41\xdd\x46\x7e\x97\x00\x9c\xab\xe4\x26\x06\x8f\xcb\x6d\xcd\xbe\xb9\xdc\x39\x94\x58\xff\xf8\xc2\xb0\xbc\x41\xa9\x21\xab\xbb\xc1\x9f\xe0\x6e\x95\xd0\x21\x1b\x72\xe5\x50\x1c\x38\x01\x5f\x13\xe4\xaf\x3e\xab\x8c\xcc\xc3\x99\x7a\xe0\xce\xa6\x6c\x49\x55\xcb\x20\xe5\x77\x7b\xa8\xcf\xe5\x5b\xb0\x54\x76\x00\x05\xeb\x30\x72\x2e\x14\x77\xa2\xb0\x09\x17\x49\x9b\x23\x0e\xb3\x3c\x5f\xf1\x88\xef\x25\xd3\x12\x70\xd0\x56\x64\xf9\x26\x44\x53\x49\xaa\xfc\xd5\x66\x51\xdc\xd7\x3b\x47\x85\x0d\x04\x07\x4e\x80\xa9\x1c\x61\xb2\xd7\x1e\x5f\x8d\xe2\x3b\x9a\x8d\xb7\x9f\x39\xd2\x25\x4b\xf4\xa2\x2c\xb3\x1c\xf6\xee\xf9\x5b\x66\x64\xa8\x46\x33\x1f\x3d\x59\x42\x70\xe0\x04\x6c\xa0\x53\x84\x8f\x77\xbb\xad\x5d\xcb\x5c\x56\x5f\xbf\x93\xff\x80\x09\x21\xf1\x9e\xee\xba\xb6\xa5\xbc\x27\x63\xff\x94\x34\x1d\x07\xb2\xb0\x81\xe2\xfe\x97\x80\xff\x6c\x1e\x7f\x88\x00\xd4\x2d\xfd\x77\x11\x30\x0a\x62\xa3\x50\x88\x50\x65\x5b\xf5\x5b\x9d\xef\x1b\x2c\x5f\x49\x8e\x95\xbd\x20\x59\xeb\xe6\xad\xa5\xc5\xa8\x9b\x6f\x71\xed\x3a\x72\xe9\x50\x1c\x38\x02\xfd\x96\x24\x15\xda\x6f\x2e\xe6\xf0\x19\xe3\x0e\xd1\x9c\x4b\x22\x19\xcb\xe8\x6d\x48\x2e\xda\x57\x46\x60\x98\xe3\xf0\x13\xef\x93\x23\xe7\x42\x71\xe0\x08\x3c\xae\xc6\xf4\x18\x3c\xa5\xf7\x41\x8e\x6a\xd1\x47\xea\xc9\x24\xdf\x35\xc6\x05\x4e\xea\xbb\x7c\x4a\x4f\x18\x4d\x15\x1f\x46\x5c\x3e\x6a\x99\xa1\x38\x70\x04\x84\xcd\x2a\x84\x3b\xd9\xb1\x9c\xbf\x94\xd1\x2b\x06\xb8\x6e\x8e\x8e\x0f\xf1\x51\x9d\xf3\x78\x8f\x3d\x63\xe0\x9d\x90\x99\xa7\x91\x8f\x9c\x0b\xc5\x81\x23\xe0\xe3\x40\x17\xdd\x77\x40\x20\x4a\xe7\xc2\x77\x9a\x61\xeb\xaa\x7f\x12\xeb\x99\xc5\xfa\x17\x65\x1a\x94\x12\x2b\x7d\xf4\x5b\x46\xb8\xc8\x43\x3a\x14\xf7\xbf\x08\xfc\x77\x27\xff\x43\x06\xa0\xf6\xd7\xdf\x65\x80\x2b\xe9\x83\x57\x39\x6f\x59\xba\xce\x69\x13\xc0\xbf\xc6\x18\x4f\xa1\x2a\x30\x2b\x03\xcb\xb1\xda\x2a\x61\x70\x79\xf0\x1c\xa1\x22\x72\xed\x50\x1c\x38\x03\xf9\xef\x5a\xfb\x94\x0e\xfc\xe5\x1f\x76\x96\xd4\xce\x0a\xf9\x7c\x6f\x2c\xb6\x9b\xb7\x6c\x09\xab\xd5\xbc\xcf\xcf\x7d\xf1\x6d\xc3\x7b\xe4\x5c\x28\x0e\x9c\x81\xc4\x83\x31\x6e\x19\xcc\xaf\x66\xad\x70\x4d\x93\xce\x25\xba\x58\xdb\xc4\x2a\x67\xd7\x8b\x26\xcb\xd4\x5e\x59\x11\xcd\xdb\xe7\x8e\xe6\x42\x71\x27\x4a\x3b\x4a\xc5\x9f\xeb\x1b\x4f\x3b\xf8\xb3\xcd\xbc\x0e\x12\x43\x8b\xa2\xef\xfb\x57\x94\x94\x56\x5b\xab\x17\xcc\xfa\xe2\x39\xdb\x1e\xdd\x06\xa0\x38\x70\x06\x82\xfd\xd1\xbe\x3f\xbe\x24\xa0\x41\x15\x5f\x87\x61\x25\x2e\x6c\x91\x81\x65\xc4\x20\x3f\xea\x6b\xe7\x92\x67\xf2\x49\x6e\xe8\xd1\x45\x64\x06\xa0\x38\x64\x06\xfe\x73\xac\xfa\x43\x06\xa0\x0e\x3b\xbf\xcb\x80\x84\x53\xf1\x81\x25\x93\x7e\x18\xc9\xaa\x99\xf8\xf0\xab\x44\x8a\x4b\x66\x71\x89\x71\x70\xa6\xba\xd0\x6e\x82\x54\x77\x89\x90\x36\xe4\xda\xa1\x38\x70\x06\xea\xd9\xb6\x79\xfd\x6e\x9e\xff\x46\x37\xa4\xd3\x6e\x9c\x48\xcb\xd2\x1b\x13\x55\xf0\xa0\x21\x81\xbd\xfa\xba\x38\x46\xe6\x27\x33\x11\xe4\x5c\x28\xee\xc4\x56\x90\xff\x31\x95\x8e\xac\xa9\xf4\x0e\xcd\xda\x52\x58\x27\xef\xcd\x48\x33\x19\xeb\x56\x09\x9b\x1f\x37\x1e\x7d\x48\xf0\xa2\xaa\xcf\x3b\xda\x0a\x20\x38\x70\x06\xcc\xe2\x08\xe6\x82\x67\xf8\x98\x32\xaf\x99\x89\x6a\x46\x61\xa2\x93\xf2\x69\x59\x8c\x71\x59\x7a\xd2\x7f\x04\xc8\xf9\xb7\x3b\x34\x8e\x4a\x0b\x08\x0e\x9c\x01\x62\x23\x44\xad\x0f\xff\x7d\xf6\xca\x3b\x59\x4c\x61\x2c\xd2\x0c\xd5\x4c\x37\x8b\x6f\x60\xff\x70\x27\xc2\xb9\x40\xb6\xbb\x29\x54\x8f\xcc\x00\x14\x77\x74\x1f\x80\x28\x6c\xa0\x4e\x9e\xbf\xcb\x40\xeb\xe3\x14\x27\x9f\x50\xab\x4d\x46\xb4\xee\x55\xaa\x85\xd1\xc4\xf1\xc1\x6a\x37\x36\xf9\x0f\xe7\x27\xac\x18\x3f\x8a\xe7\x07\x1e\xbd\x5d\x04\xc5\x81\x33\x40\x3c\xbf\x2a\xba\x8d\x2d\x9b\x2a\xc6\x29\x9d\xf6\x70\xee\xb3\x02\xf9\x68\xe2\x4a\xe0\xe5\xb6\x90\x2e\x66\xc0\xf6\xb6\xd0\xd2\xd1\x9b\x76\x50\x1c\x38\x03\xe3\x9d\x53\xce\x83\x8b\x4f\x4f\xc9\x75\xe2\x46\x53\xbf\xbc\x34\x1d\x76\xba\xbc\x84\x2a\x78\x9d\xbe\x87\x7f\x2a\x68\x72\x4c\x82\x17\x39\x17\x8a\x03\x67\xc0\x29\x9e\x72\x0e\xf6\x96\xe7\x29\xac\x29\x9b\x57\xdc\x21\x31\x10\x5f\x42\x9b\xc1\x59\x13\xdd\xbc\xbf\x72\xa5\x93\x76\x70\xeb\x2b\x72\x2e\x14\x07\xce\x40\x6d\x13\x26\x41\xca\x0e\x80\xe1\xd3\x46\xbf\x6a\x5e\x52\x12\xe4\xa1\xf8\x19\xff\xa9\xf0\x5c\x4f\xb1\x14\xb7\xa7\x69\xac\x5b\x14\x32\x03\x50\xdc\xd1\x7d\xe0\xc1\x9f\x0b\x1b\xa8\x67\xf7\xdf\x17\x36\xae\x9e\xcb\xd7\x2a\x2b\x5e\x66\x09\xad\x26\xaa\xe5\x3a\xa1\x0b\x30\xdf\xf1\x7a\x8c\x46\x54\xa6\xe0\x28\xb1\xfb\xd5\x4b\x7b\xa4\x13\x59\x7e\x40\x71\x27\x0b\x1b\xcf\xca\x45\xc2\x4d\xa9\x5b\xb7\x8c\x4b\x53\xee\x65\xed\x3a\xf5\x4e\x08\xf8\x4e\x18\x9a\xb9\xa9\xd5\x30\x55\x8d\x16\x06\x77\x65\x21\x27\x43\x71\x27\x0b\x9b\xf6\xfd\xae\x42\x7d\x57\xb6\x26\x55\xa7\x9f\x4c\xfd\x4f\x12\x7c\xd3\xaf\x55\xea\xb1\x0b\x4c\x8f\x70\x3f\xd7\xc9\x13\xc4\xfb\x3e\x82\x9c\x0c\xc5\xfd\xa7\x56\x21\x3a\x3e\x79\x4b\xe5\xb9\xa0\x93\x7a\x67\xe7\xf5\x3e\xe9\x1f\xe8\x07\x36\xae\x18\x96\x63\xb6\x1d\x6e\x8b\x8d\x11\xf7\x06\xde\xd9\xfd\x18\x93\x42\x16\x36\x50\xdc\xaf\xc9\xbf\xfe\xd6\xfe\x9f\xc2\x06\xea\xcb\xc9\xc7\x0b\x1b\x77\x84\x6d\x52\x52\x15\xf3\xeb\x78\x01\xaa\x5b\x92\x82\xf7\x18\xd9\x52\x1f\x90\x46\xbe\xad\x29\xe5\xb5\xe8\xfa\x68\x74\x3f\x03\xef\x18\x8a\xf6\x89\xe3\x70\x7e\xe5\x55\x64\x8e\x63\x13\x63\x3f\x47\xf1\x10\xda\x5c\xb3\x38\x4f\x91\xbd\x41\xbd\xc5\x85\x1c\x33\x06\x36\x99\xff\x6b\x85\x0d\xd4\xd2\x8e\x15\x36\x5d\xe0\xc2\x66\xe8\xfd\x80\x71\xae\x1a\xde\x6a\x89\x10\xaf\xe9\x28\xbd\xee\xf2\xe2\x8b\xde\x22\x79\x7d\x62\xe7\xe1\xaf\x56\x45\x0e\x4c\xc6\xe6\x7f\xa3\xb0\x91\x3c\x51\xd8\x2c\x51\x52\xbd\x75\x9c\xa3\xb3\xb9\x57\xba\x72\x59\xe5\x22\xe5\x87\x1d\x3d\x59\x9a\xce\x31\x6b\xbb\x92\xc8\x8f\x73\xd8\xd1\x9b\x35\x7f\xe5\xe5\x8f\x93\x85\xcd\x17\x9d\x0f\xb9\xab\x71\x56\xc9\xd2\x1a\x74\x41\x81\xdf\x8b\xee\xe9\x1a\x2a\x16\x57\x2d\x6b\x60\x8a\xd3\x7c\xac\x7b\x2f\x37\xc2\xff\x57\x5e\x75\x39\x59\xd8\xa8\x2f\xba\x5e\xbd\xec\xf2\xaa\xea\x1d\xcb\x9b\x4b\xd4\x49\x85\x4e\x3c\x29\xc6\xd8\x0d\xd8\xdf\x92\x66\x0e\x4d\xbc\x0a\x0b\xee\xfc\x95\x2f\x62\xd5\x9d\x2c\x6c\xb0\xd0\x68\xf0\x83\x8d\xd5\x33\xf1\x75\x12\xcb\xfa\xd0\xe9\xdc\x0b\x31\x27\x1f\x55\x35\xcc\x67\x58\x60\x5d\x37\xa9\x7f\x12\x5b\xf9\x57\x56\x7b\xb2\xb0\x59\xfe\xc6\x67\x69\xb0\xc0\xa7\x36\xec\x15\x5f\x7f\xeb\xd1\x17\xae\xa1\xe2\x1b\x26\x7d\x69\x2d\xa4\x67\xf1\xb0\x89\x6e\x78\x56\x65\xff\xb5\xc2\x06\x2a\xba\xbf\xdb\x9f\xc9\x3b\x58\xb6\x85\x60\x7b\x74\x02\x49\xe4\x7a\xd9\x5c\xf4\x2b\xf4\xab\xde\x07\x96\x61\x77\x15\xf6\x39\x6e\xe4\x5c\x24\x8b\x5a\x41\xee\x4b\x50\x1c\x78\x7f\x36\xfe\x5a\xf7\x89\xd5\xb0\xd5\xd8\x29\xa9\x3f\xfb\x82\xd0\xed\x1d\x6a\xa7\xfe\xe7\x94\x93\xf9\x82\xf7\x2f\xf3\x3e\xea\x79\x16\x39\x88\x9c\x0b\xc5\x81\xf7\xe7\x2c\x8f\xdb\xc9\x9f\xdd\x9c\x1e\x3f\xd6\x52\x6a\xbd\xde\xde\x2f\x52\xe3\x33\x97\x16\xb1\x34\x70\x71\xf8\x06\x09\x7d\xd3\x4b\xef\x5a\xe4\x5c\x28\x0e\xbc\x3f\x5f\x60\xa2\xb5\xaa\x2d\x13\x7e\x1b\x4d\x1d\xc8\xc1\x25\x75\x16\x21\xba\xf1\x90\x3c\x64\x81\xa4\xba\xef\x4d\x15\x9d\x01\xa9\xdb\x45\xe4\x5c\x28\xce\x4f\x0a\x8d\xee\xf8\xdc\x7d\xb4\xc0\xe1\xd4\x76\xbf\x5d\x69\xf4\xc5\x22\xc1\xc1\xae\x72\xe1\x42\x6d\x9c\xb9\x6f\x13\xef\x66\xf3\x78\x60\x5c\x69\x39\xbe\xc8\xc2\x06\x8a\xfb\xf5\xf7\xe6\x83\x08\xf8\x75\xbf\xfa\xc3\x09\x0d\xea\x36\xf2\xbb\x04\xe4\xea\xe8\xe9\x1e\x08\xd6\xbc\xd4\x4d\xb4\xc6\xa3\xad\x3e\x98\xd2\xab\xef\xd8\x99\x7e\x30\xec\xa1\xfb\xc4\xb2\x5b\xac\x65\xeb\xe8\x29\x15\x8a\x03\x27\xe0\xb4\xdc\x3d\x16\x0a\xe0\xc7\xe2\x04\x6b\x54\xf1\x93\x81\x28\x5c\xb2\xf6\x2f\x18\x43\x4a\xfd\xd6\x02\x62\x31\x1f\xa2\xb7\xb2\x7a\x91\x73\xa1\x38\x70\x02\x92\xc9\x5e\x3d\x30\x48\x8c\x57\xdf\x93\x7f\xa7\x11\x2c\xa7\x4d\xde\xf5\x55\x2c\x1b\x71\xb5\xed\xfb\x7a\x0a\xdc\x91\xf1\x32\xee\xd1\x5c\x28\x0e\x9c\x80\xd1\x07\x11\xe7\xad\x86\xe6\xde\xe8\xed\x6f\xc9\x39\x5d\xb0\x67\x36\xdd\x9d\x52\x6c\x98\xcf\xd8\x0f\x10\x2f\x91\x95\x91\xba\x5e\x83\x9c\x0b\xc5\x81\x13\xe0\xfe\x51\x87\x2d\xfc\x1a\x81\x88\x09\x3c\x78\xb4\x52\x1c\x83\xed\x2e\xeb\x82\x6a\xc9\xba\xc1\x2e\x5a\xee\x2a\x11\xda\xbc\xeb\x28\xb2\xb0\x81\xe2\xfe\x97\x80\xff\x6c\x1e\x7f\x88\x00\xd4\x2d\xfd\x77\x11\x78\x7c\x9e\xaa\x83\x44\x18\x26\x78\x7f\xe9\x5b\x94\x7a\xbc\x4a\x9a\x4a\xfd\xe5\xe6\x95\xc4\xca\x87\xb5\xa3\xbd\xec\xec\xa1\x0f\x1d\x8e\x0a\x10\x08\x0e\x1c\x81\x69\xff\x47\x06\xca\xaa\x58\x97\xee\xe3\x4b\x3f\xde\xae\xd2\x65\x34\xbb\x5c\x1a\xcc\xd1\xce\x91\x96\x18\x38\x5a\x90\x68\x72\x69\x0b\x39\x17\x8a\x03\x47\xc0\x90\x28\xb1\x4a\x27\xcd\x5d\x9c\xf1\x7c\x94\xea\x4d\xcc\x11\xa2\x24\x7a\x1f\xdc\xc8\xb7\xe3\xde\x3f\x52\xf7\xeb\x7b\x4e\xb1\xe8\x23\xe7\x42\x71\xe0\x08\x28\xec\x8e\x03\x6e\xef\xef\xfe\x08\x5b\x2e\xaa\xba\x73\x97\x3a\xf5\x5d\xb9\xf6\xca\x59\xb1\x6c\x3d\xf7\x6f\x85\xc4\xc5\xdf\xfc\x8f\xbe\x66\x03\xc5\x81\x23\x60\x6f\x6f\xe2\x87\x43\x7f\x07\x33\x87\x73\xe1\xbb\x96\xdc\xca\xe3\x33\xa5\xa1\x7c\xd3\xfc\x75\x64\x75\xda\x3a\xf7\xf2\x48\x6b\x01\xe4\x21\x1d\x8a\xfb\x5f\x04\xfe\xbb\x93\xff\x21\x03\x50\xfb\xeb\x6f\xbf\x16\x47\xb6\x35\x60\x6b\x8a\xd7\xfc\xde\xfa\xf6\xcb\x54\xed\xd5\x6f\x14\x77\xfb\x15\x30\x9e\xde\x9d\xf8\x38\xe7\xfb\xad\xe6\x9c\xe3\x51\x73\x0f\xc5\x81\x33\xe0\x5d\x8e\x91\x23\xa6\x90\x25\xf7\x00\xbd\x8a\xf8\x65\xd3\x95\xd9\x5c\x51\xf3\x11\x15\x61\x35\x42\x23\xae\xcd\x33\x2a\x0b\xf9\xe2\xc8\xb9\x50\x1c\x38\x03\x0c\x12\x13\x30\x31\x45\x3f\x93\x46\xc7\x5c\x04\x0d\xeb\xb9\xf7\xe2\x01\x3b\xbd\xe5\x07\xbb\x11\x30\xb3\xe6\xc2\xd0\xeb\xa2\x73\xc8\xb9\x50\x1c\x38\x03\x26\xd8\x8e\x29\x96\x39\x68\xa4\x86\x92\xe5\x82\x41\x77\xe8\x5b\xb5\x9a\x71\x58\xca\xe7\xae\x69\x50\x5b\xc5\xe6\x0e\x62\xd9\x5b\x23\xe7\x42\x71\xe0\x0c\x9c\xed\x7d\x62\xb9\xf7\xf4\xc2\xc7\x91\xc2\xc8\xbc\x78\x1d\x7b\xf6\x91\xb2\x38\x2f\x05\xc5\x4b\x61\x03\x3a\x59\x55\x1c\x74\x4d\xd8\xc8\x0c\x40\x71\xc8\x0c\x48\x42\x14\x36\x50\x87\x9d\xdf\x65\xe0\x7e\x0c\x46\xf7\xf2\xe6\xc5\xc1\xcb\x12\x1d\x2b\x03\x78\x2f\x2f\xbe\x16\x60\x7a\x33\x46\x9f\x1e\x3c\x89\x66\x61\x4c\xa0\xee\x93\x8d\x5c\x3b\x14\x07\xce\x80\x12\xbc\x82\x83\x26\xeb\x40\xe4\x4b\xae\xe7\x4d\x89\xb9\x5e\xf1\x66\xd7\xcc\x49\xa5\xf9\xef\xf7\x66\x32\x44\x1d\xaf\x3f\xc4\x3a\x7a\x1b\x0a\x8a\x3b\xf1\xd3\x9b\x06\xda\xb2\xee\xaf\xe5\x6c\x5d\xa3\xf2\x5f\x49\xfb\xe6\x78\x27\xa3\xce\xa5\x7c\xf9\x9c\x71\x9f\xc1\x5f\x3b\xd2\xf8\x23\xdb\xd1\x1b\x71\x50\x1c\x38\x03\x97\x39\x82\xcc\x19\x1c\x03\x5e\xa7\x67\x36\xdf\x08\xc8\x0c\xd9\x88\x9e\xd8\x61\xb9\xed\x5d\xad\xcd\xa0\xa7\x66\x2e\xfa\x9d\xf6\x2a\x72\x2e\x14\x07\xce\x40\xdd\xc8\xd5\x9d\x1a\x52\xe1\x00\x52\x2a\x32\xe7\xed\x84\xeb\x4d\x82\xd7\xd5\x9b\xd3\xf7\x83\x3d\x9c\xa4\x37\xef\x91\xe8\x5e\x78\x8a\xcc\x00\x14\x77\x74\x1f\x80\x28\x6c\xa0\x4e\x9e\xbf\xcb\x40\x7b\xe5\x78\x98\x86\xf0\xa4\x79\x4a\xee\x1d\x55\x76\xde\xd6\x1a\x36\x1b\x3d\x57\xea\xee\x18\x3b\x47\x59\x31\xb8\xf5\x05\xf7\x11\xe4\xda\xa1\x38\x70\x06\xee\x33\x6b\x7f\xa6\x4d\x34\x21\x1c\x1f\xc1\x8d\x6d\xe5\xdb\x3e\x08\xe7\x68\xd6\xa2\xbb\x17\x07\x77\xd0\xd7\x7c\x29\x3a\x24\x7b\xf4\x15\x23\x28\x0e\x9c\x81\xe0\xcf\x2d\x14\x92\xd8\x3f\x3c\xee\xd0\xc4\x04\x6b\xd8\x9a\x50\xcc\x11\xaf\x44\x6a\x8a\x18\xa8\x2c\x69\x87\x3a\xc5\x7c\xe5\x7e\x83\x9c\x0b\xc5\x81\x33\x50\x6c\xc8\xd3\x6b\x48\xef\x2c\xfb\x90\xb8\xd9\x8f\x69\x2a\x57\xf7\xd4\x1b\x9d\x71\x3e\xe9\xa8\xec\xae\x3c\x85\x0b\xfc\x98\x03\x24\xc8\xb9\x50\x1c\x38\x03\x8e\x65\x6b\xdb\x3c\x1a\x0c\x6b\x1e\x01\x74\xce\xcf\xde\xe8\xac\x5e\x23\x23\x12\x31\x9b\xbc\xf1\x9c\x4d\xff\xc5\x32\x15\x8e\x6d\x0b\x32\x03\x50\xdc\xd1\x7d\x00\xa2\xb0\x81\x7a\x76\xff\x7d\x61\xf3\xe1\x35\x03\x0d\x47\xcb\x85\x11\x63\xd8\xe3\xd8\x4f\xcf\xbf\xcf\xc8\xbc\x6c\xf2\xfb\x91\x5d\xf4\x65\x4b\x7a\xc0\x6b\x27\x81\x42\x1e\x59\x7e\x40\x71\x27\x0b\x9b\x07\x3e\xc6\x51\x1e\xa5\x15\x9f\x00\x8f\xd5\x48\x8f\x9f\xdd\xc9\x93\x7a\x4f\xdf\xd9\x38\xe6\xbb\xfd\x14\x50\xdd\x9c\xea\x78\xbc\x87\x9c\x0c\xc5\x9d\x2c\x6c\xb8\xe6\x15\x86\x82\x6a\xd2\xfd\x9f\x67\xdd\xd9\x9d\x34\x3b\x87\xff\x30\x1c\xed\x73\xe4\xe5\x6e\x9c\x2f\x3d\x91\x9d\x11\x40\x79\x24\x72\x32\x14\xf7\x9f\xc2\x46\xf2\xf8\x64\x03\xed\xfb\x4c\xa1\x99\xfb\xeb\xfb\xfa\xcf\xde\xbc\x2f\x8f\xc8\x60\xd0\x97\x79\xe2\xb1\x97\xa0\x22\x9f\x7e\x77\xa7\x73\xac\x16\x1f\x59\xd8\x40\x71\xbf\x26\xa3\xff\xa3\xb0\x81\x52\xc4\x1d\x2f\x6c\xee\xeb\x54\x32\x0e\xea\x8d\x35\xbe\xb3\x27\xaa\x37\x0a\xb0\xc2\x8a\x24\x35\x99\x6e\xb2\x4b\x4f\xa9\xb5\x71\xe4\x4c\xef\x7f\x7f\xfc\x35\x87\x6a\x4a\x82\xbd\x65\xee\x0a\xbe\xd5\x17\x8c\x92\x87\xc6\x92\xfa\x63\xa5\xf7\x0f\x94\x89\x9f\xdc\x0b\x12\x7f\xcc\x6c\xf6\x89\x98\xec\xff\x5a\x61\x03\xb5\xb4\x63\x85\x0d\xd1\x19\xd0\xe3\xb5\x19\x6d\xfa\x2b\x52\xec\x98\x80\xa4\xf2\x70\xc0\xff\x91\xc8\xa8\x15\xaf\xb9\x97\xfa\x3b\x84\xa5\xe4\xd7\x45\x34\xa1\x2b\x7a\x1d\x7f\xa3\xb0\xf1\x39\x51\xd8\x98\xeb\xf4\x12\x5c\x9c\xa7\xd4\x7a\x62\x71\xef\xea\x8e\x2a\xd1\xca\xb4\x46\x6e\x48\x16\x5e\x5c\xc2\x1b\x4a\xba\x80\x85\x34\x59\xe2\xbf\xf2\xf2\x87\xd0\x89\x2e\xe1\xac\x75\x35\xd7\xd5\xb8\x8e\x0f\x5f\xa7\xbc\x4d\xaa\x2d\x36\xe8\x29\x13\x1c\x07\x25\x34\x48\x97\x6b\x73\xf4\xf4\x4b\x4d\xe8\x7f\xfc\x95\x57\x5d\x4e\x16\x36\x95\x75\x8e\xbd\x2f\x27\xc7\x6f\x4d\x13\xe1\x19\x77\x46\x55\x9c\xb5\x8f\xe2\x9b\x91\xdf\x13\x2b\xcb\x9e\x7d\xa3\x51\xab\xc2\xc8\xf5\x57\x56\x6b\x72\xe2\x63\xb3\xeb\x0d\xea\xaf\xa5\x86\xd4\xcd\x0b\x58\xd7\x5f\x48\x23\xd0\x2e\xdd\x5f\x16\x7c\x8e\xff\x33\x62\x39\xdf\x2c\x74\xb2\x8f\x06\xff\xaf\xac\xf6\x64\x61\x33\x9d\x74\x35\xb1\x98\x1f\xf7\x89\x45\x82\x26\xf3\xba\xa7\x47\xec\x2d\x33\xd1\x56\x97\x44\xb4\x98\x4e\x46\x36\x9c\x92\x31\x86\xe5\xbf\x56\xd8\x40\x45\xf7\x77\xfb\xb3\xbd\x64\x0d\xc5\x58\xef\x0f\xcb\x96\xe1\x11\x73\xc5\x39\xda\xf7\xe7\x5f\xd5\xb6\x7e\x57\x82\x9d\x4e\x76\x62\xca\x76\x4b\xd8\xcd\x42\xee\x4b\x50\x1c\x78\x7f\x5e\xb6\x7d\x5e\x36\xa7\xf6\x90\x50\x48\xc2\x4e\x70\x83\xc4\x70\x3f\xf3\x9e\x77\x0e\x23\xfa\xc7\xa8\xb5\xd7\xe4\x78\x53\x07\x31\x26\xc8\xb9\x50\x1c\x78\x7f\x5e\x73\x63\xdd\x21\xee\xca\x0f\x8e\x66\xa1\xd3\x8c\x16\xd4\xe2\xfe\x24\x1b\xf1\xb1\x62\x59\xe4\x43\x1b\x7f\x28\x0d\x2e\x0e\xc1\x3c\x72\x2e\x14\xe7\x27\xf5\xcf\x12\xfd\x74\x36\x96\x8a\x33\x2e\x0f\xf9\x19\x2b\x43\x92\xdb\xc3\x04\xe7\x02\x6e\x91\x30\x47\x02\x6f\x77\xfa\x27\x4f\xc5\x0d\x1f\xfc\xc0\x39\xaa\x17\x20\x38\x3f\x29\xd8\x3f\xdf\x33\x61\xd8\xb7\xee\xc7\x72\x0c\xa1\x9e\xd4\x09\x35\x20\x1a\x74\x3c\xe8\xd9\x8e\x8d\x3a\xfb\xe9\x5a\x75\xc5\xa8\x59\x1b\x97\xb8\x29\xb2\xb0\x81\xe2\xfe\xf7\x95\xe5\x5f\xf7\xab\x3f\x9c\xd0\xa0\x6e\x23\xbf\x4b\x80\xa5\xc5\xe8\x40\x96\xbf\x87\x35\x77\xdb\x73\xb5\x25\xfa\x2f\x84\xe1\x56\x92\x9d\x31\xaa\x7e\xb2\xc5\x02\x07\x23\xe1\x94\xcd\xb3\xc8\x95\x43\x71\xe0\x04\x34\x1c\xa2\xd9\xfd\x90\x66\x2f\x62\x68\xc0\x4c\x9d\x1b\x70\x5b\x5a\x95\xec\xe7\xf3\x2c\x1e\xf2\xf9\x28\xcd\xc8\xf9\xfd\x42\x29\x37\x72\x2e\x14\x07\x4e\x80\x9f\xbb\x80\x2c\xdf\x8d\x8f\x6c\x45\x99\x16\xb5\xd3\xbc\x38\x05\x35\xf4\xec\xce\x06\x79\xd7\xcd\x7b\x55\xa7\xd2\xb8\xe2\xef\x6b\x21\xe7\x42\x71\xe0\x04\x34\x10\x0d\x8a\xd1\x05\x78\x36\x3c\x38\xcb\x4f\xb7\xf2\x45\x73\xc2\x34\x35\x49\xb8\x56\xce\x5d\x68\x48\x10\x8b\x31\x8b\xf7\xf9\xd1\x2b\x06\x50\x1c\x38\x01\x67\x38\xee\x3c\xe1\x3e\xcb\x62\x4c\xbb\xc6\xeb\xf9\x28\xd8\x76\xe0\xcb\x1d\x31\x89\xa8\x6c\x0c\x66\xa3\x8d\xc1\x3b\xe3\x32\xe8\xcc\xc8\xc2\x06\x8a\x3b\x72\xd8\xfc\xb9\xb0\x81\xba\xa5\xff\x2e\x02\x4b\xa2\x3f\x0b\x4d\x9c\xad\x72\x98\x3a\x35\xef\x88\x93\xa5\xdb\x3d\xbc\xee\xe3\xd9\x64\x9e\x4f\xf1\xd5\x7b\xe9\xec\xdc\xf0\xfd\x3d\xe4\xd2\xa1\x38\x70\x04\xf4\x2a\xc4\x2a\xbd\x92\xe2\x59\xd7\xf7\x2a\xe2\x14\xe6\x35\x60\x1a\x51\xca\x35\x37\x1a\x42\xc4\x8d\xb2\x39\x89\xfc\x9b\xba\x9a\x8f\xbc\x28\x10\x1c\x38\x02\xe9\x57\xe5\x26\xde\xf8\xc5\x3c\x90\xa6\x5a\x19\xf6\x8d\xb1\xc3\x7b\xdb\x22\x5e\xd0\xa1\x77\x2d\x6e\xa4\x68\x7d\x29\x8b\xac\x04\x13\x39\x17\x8a\x03\x47\x00\x27\xc8\x27\x7b\xab\x9f\xe4\xd5\x8d\x5b\xc0\xc3\xe1\x8a\x48\xb2\x0f\x38\x49\xf8\xd2\xba\xd4\xd1\x8d\x8d\xae\x03\xf1\x9e\x2f\x8e\x1e\x00\xa1\x38\x70\x04\xc8\x68\x54\xa3\xd2\xa9\xfc\xca\xa5\x47\xd1\x8a\x71\xaa\xa7\xf9\xb5\x5d\x79\xf7\xea\x29\x23\xd9\x24\x94\x98\xeb\xae\xdf\x7a\xe3\x8e\x3c\xa4\x43\x71\x47\xee\x0a\xa1\x3f\x3f\xa8\x41\xed\xaf\xbf\xfd\x6e\xac\xf3\x0d\x05\x1d\x66\x1b\x76\x4e\xee\x73\xfc\xe3\xa7\x75\x57\x43\x96\x23\x29\xc7\xb3\x3a\x35\xcf\xb0\xe0\xf5\xb7\xda\x25\x1d\xbd\x0d\x05\xc5\x81\x33\x40\x60\xa0\x6a\xf3\x21\xf5\xc7\x77\x6a\x32\x13\xc4\xed\x6f\x12\xe4\xd3\xb5\x35\x94\x2f\x07\x6d\x9e\x5b\x0f\x73\x9c\x15\xc3\xd1\xed\x41\xce\x85\xe2\xc0\x19\x50\x21\xd0\x39\x4f\x92\x71\x6e\x9c\xfc\xc9\x2a\x8d\xc5\x35\x89\xd2\xbb\xfd\x74\xb3\xed\x51\x07\x46\x89\xa7\x53\xc8\x0b\x03\xcb\x7c\x91\x73\xa1\xb8\x13\x1b\x01\x7f\x87\x91\x2f\x5a\x4c\xd1\x45\x0c\xb4\x66\xdd\x53\xe4\xe3\x3e\x24\x3c\xf5\x2c\xeb\xf7\xdc\x06\x6f\x19\xa6\xdc\xc4\x48\xc5\x38\xda\x08\x20\x38\x70\x06\xd2\x8b\xe9\xd2\x38\x9c\x8c\x92\x3d\x67\x47\x36\x99\x28\x92\x83\x3f\x13\xb2\x8b\xb4\x65\x73\x1b\x5e\xe1\x40\xcf\x95\x6d\xc5\xe7\x40\x66\x00\x8a\x3b\x72\x57\x40\x14\x36\x50\x87\x9d\xdf\x65\xc0\x64\xc6\xd5\xd6\x66\x7e\x2d\xe8\xe3\xcf\xc3\xf4\xb9\xef\xf1\x42\x6d\x5d\x0c\xa2\x51\x8d\x93\xd9\x89\x1f\xaa\xf0\xe1\x2f\x63\x0a\x8e\xca\x2a\x08\xee\xc4\xdb\x15\x5f\x7a\xe2\x9c\x0a\x7e\xde\xbf\x33\x20\x78\x90\xfe\xb4\xbb\xe4\xed\xf9\x9f\x7b\x57\x89\xcc\x76\x2b\x08\x75\xac\x69\x98\x32\xea\x8f\xde\xae\x80\xe0\x4e\xbc\x69\xf7\xcd\x16\xbb\xa1\x68\x24\x46\x97\x41\xb9\x29\xda\xbc\x61\xc9\x24\x38\x39\x4f\x4f\x7a\xfe\x82\x7d\x73\xf3\xb5\x89\x3c\x78\xfb\x51\xd1\x0c\xc1\x81\x33\x70\x75\xb5\x5b\x6a\xa6\xc5\xcc\xd7\x58\x4b\x9d\x23\xbb\xe3\xd6\x5d\x43\x81\x99\x72\x59\x7d\x36\x15\x67\x3f\x74\x35\xee\x77\xde\x47\x2f\x9d\x42\x71\xe0\x0c\x34\x9f\xe3\x73\xe1\xcc\x74\x62\x28\xc7\x74\x9a\x7e\x6a\x57\xa0\x79\x73\x83\xe0\x09\x8f\x2d\xb3\x35\xba\x90\xaf\x44\x37\xb3\x0f\x1d\x32\x03\x50\xdc\xd1\x7d\xc0\xe4\xcf\x19\x80\x3a\x79\xfe\x2e\x03\xc9\x92\xe7\x34\x36\xbc\x14\x08\xa2\x70\x97\xa4\x0c\xaa\x0d\xc9\xb9\x22\xe3\xe6\x0d\xee\xaf\xda\x3c\x9e\xf1\xe0\xb0\xbe\x15\xfd\xf9\xe8\xe7\x21\x10\x1c\x38\x03\x71\x23\x81\x07\x6b\x11\xe6\x23\x05\xb1\x3f\x08\xa7\xe7\x3d\x18\x16\x0a\x15\x1c\xd8\xda\x2d\x75\x3e\x1d\x52\x57\x26\x99\x86\x1e\xed\x31\x50\x1c\x38\x03\x9d\xab\x34\x26\x37\x66\x56\x6b\xa3\xae\x5e\x8e\x3d\xa3\x5d\xb4\xc3\x9e\xf0\xd5\x74\x7a\x86\x35\xb6\x68\xe2\x74\x39\x45\x1b\x99\xd7\xd1\xab\xdc\x10\x1c\x38\x03\x5a\xfb\x57\x1d\x34\xa9\xc9\x37\xae\xaf\xb6\xba\xeb\x58\xed\xed\x6e\x98\x36\x76\x3d\xf4\x9c\x8b\x8f\xfd\x1c\xe3\xf9\xe5\xcd\xc2\x51\x81\x0d\xc5\x81\x33\x70\xf5\xca\x81\x52\xec\x69\xb5\x6f\x72\x04\xbe\x7d\x51\x63\x00\xdd\xdc\xe4\xfa\xc8\x68\x47\xb5\x26\xd7\x33\xf8\x65\xf3\x90\x9d\x25\x64\x06\xa0\xb8\xa3\xfb\x00\x44\x61\x03\xf5\xec\xfe\xfb\xc2\x46\x0a\x83\x7b\xe0\x60\xdf\x31\x74\x6a\x6c\xe8\xa9\x6b\xe2\x95\xc5\x42\x4c\x45\x9f\xc6\xb3\xe1\x14\x22\x53\x1f\x48\x76\x2a\x69\x7f\x20\xcb\x0f\x28\xee\x64\x61\xb3\x57\x71\x93\xcc\x52\x5f\x40\x7f\x1f\x8f\x60\x6c\x4a\x8a\x6e\x33\xc2\x3e\xfd\x15\x36\x9e\x07\x93\x92\x46\x01\xe5\x97\x64\xf3\x7c\xe4\x64\x28\xce\x4f\x06\x0d\x07\x54\xd8\x9c\x5e\x4e\xc0\x76\xb6\xb8\x5b\x6f\xf9\xa5\x85\x70\xf6\xe6\xcd\x71\x31\xf9\x9f\xc4\x54\x02\x22\x7d\x8f\x39\x84\x1f\x52\x99\x06\x1d\x15\x36\x10\x9c\x9f\x0c\x0c\x74\x35\x02\xe9\x17\x6f\x51\xda\x6e\x46\x3c\x5e\x8d\x1b\x6d\x0a\xa1\x39\xc8\x11\x73\x61\x79\x6b\xcb\x11\x20\xf8\x1d\xe3\x6b\x91\xd7\xd3\x70\x64\x61\x03\xc5\xf9\xc9\xa0\xd1\xa1\xfd\xa3\xb0\x81\x12\xf5\x1f\x2f\x6c\x66\xa7\x9c\xac\x9a\x6b\xa4\xaa\x71\xed\x89\xaf\x29\x0f\x11\x9e\x95\xad\x77\x5f\x4b\xfc\x96\x3e\x6c\x79\x73\xfb\x73\x6c\x7f\x6f\xdf\x31\x34\x6d\x59\x26\x2b\x20\x80\xc5\x38\x64\x60\xbd\xad\x24\x4a\x4b\x5e\x90\xee\x4e\xc7\x72\x35\xad\x21\x82\xbf\xa1\xb4\x7e\x4e\xf2\xc1\xff\xb5\xc2\x06\x6a\x69\xc7\x1d\x36\xe0\xc2\x26\xbc\xae\x98\xfc\x1d\xe7\xf3\x3e\x8a\xce\x81\xe7\x8a\x94\xba\xa2\xc9\x5d\x1f\x7c\x63\x84\xe5\x84\x18\x49\x57\x5e\xc2\x5a\xce\x9a\xfe\x8d\xc2\xa6\xee\x44\x61\x33\x77\xa9\x9c\xcd\xbb\x14\x57\x55\x33\x3a\x5e\xf2\xc9\x0a\xa3\xa6\x1d\x61\x8f\xf6\xea\xb5\x8c\x4b\x05\x59\xbc\x23\xcd\x17\xb6\xa6\xfe\xca\xcb\x1f\x27\x0b\x1b\xcb\x87\xad\xbb\x5d\x81\x99\xdc\x4e\x77\x73\x9e\xac\xeb\x58\x7f\xc0\x88\xac\x2a\xfb\x2c\x4f\x62\x11\x6e\x51\x98\x37\xc1\xfd\x6e\xfd\xaf\xbc\xea\x72\xb2\xb0\x29\x37\x9f\xd2\x59\xdb\x15\xdd\xf4\x57\x93\xd9\x53\xeb\x16\x95\xe9\x48\x13\x55\x75\xb4\xea\x90\x0c\x1e\x4e\xe6\x10\x7c\xfa\x8c\xfb\xaf\xac\xf6\x64\x61\xe3\x11\x4a\xe8\x66\xd4\xb1\xde\xbd\x89\xe5\x9f\x70\x61\x68\x2e\x66\x3a\x45\x72\x78\x84\x27\xdc\xfe\xb4\xca\x5a\xc0\x9d\xce\xaf\xf1\x7f\x65\xb5\x27\x0b\x9b\xc7\x01\x97\x3d\x66\xcb\xdd\x3f\x97\x0a\x98\xc9\xde\x14\x18\xce\x70\x11\x15\xa5\x0f\xc8\x7b\xf5\x40\x0b\x13\xdf\xe9\x65\xc9\xc3\x67\x7f\xad\xb0\x81\x8a\xee\xef\xf6\xe7\x8a\xef\xea\x7e\x95\xfe\x11\x22\x3b\x6b\x7b\xba\x24\x61\xef\xab\x49\xa4\xb0\x4b\x02\xd7\xbe\x26\xd7\xa2\x9b\x7a\xe6\x31\x5d\x39\x2a\x56\xa0\x38\xf0\xfe\x2c\x81\x3d\x91\xce\x3f\x50\x1a\x6b\x43\x17\x90\xfa\xcd\x9f\x7b\x02\x6f\xce\xbb\xf4\x62\x97\x5e\xe1\x2d\x83\xb5\xa2\x46\xb5\xcc\xa3\x62\x05\x8a\x03\xef\xcf\xde\xef\x9d\x69\x3e\x44\xe6\x34\xc9\x2c\x09\x07\x5c\x2f\x28\x54\xea\xa6\x49\xbf\x5d\x31\xf7\xee\xa0\xf2\x1e\xe5\xc6\xe0\xc7\x48\x9b\xa3\x1f\xd8\x42\x70\xe0\xfd\x59\x5e\xf6\x3c\x9d\x02\x8f\xef\x41\xba\x78\x92\x34\xb6\xb3\xa4\x1a\x06\xd7\x8d\x56\xcc\x56\x6e\x0b\xa5\xef\xe2\xab\xcb\x2f\xb6\xa9\x90\x73\xa1\x38\x3f\x29\xa2\x7f\x5c\x87\x1d\xc7\xf2\x15\x0b\xdc\x1f\x1d\x00\xe1\xfc\x43\x83\xb2\x31\x6b\xa1\xf9\x17\x07\xe8\xcc\x31\x61\x83\x9d\xb9\xd9\x70\xbe\x84\x3d\x64\x61\x03\xc5\x1d\x39\x6c\xfe\x58\xd8\x40\xdd\x46\x7e\x97\x80\xf1\x4f\xc5\xd2\x25\x92\x25\x9a\xbe\xd8\xb0\x28\x0c\xff\x6f\x59\xd6\xef\x8a\xec\x66\xd1\x3d\xc7\x0c\xdd\x0b\xc2\x62\x2c\x11\x75\x47\xef\x14\x43\x70\x27\xde\xb0\x59\x88\xa2\x37\xcf\xd4\x72\x6f\x97\xa3\x46\xcb\xb9\x41\xda\xaa\x2a\x1c\x2d\xde\xbf\x3e\xf5\x81\x38\x95\xfe\x05\xdf\xf9\xbe\xd3\x47\x4f\x3e\x10\xdc\x09\xe3\xec\x6d\x23\x25\xf6\xed\x77\xf3\x9e\x73\x8f\x23\x7f\x08\x1e\x62\xc8\x0d\x47\x30\x44\xee\x93\xdb\x8b\xac\x58\x91\xa1\x45\x99\x1f\x9d\xd0\xa0\x38\x70\x02\x72\x1f\x93\xbe\xc8\xad\xc9\xdc\xc2\x8c\x12\xff\x76\xd9\xd0\x85\xd3\xe5\xd9\x67\xef\xfd\x98\x96\xef\x55\xea\x4a\x55\x41\x77\x28\x0e\x8e\xde\x34\x82\xe0\xc0\x09\x00\x80\xbc\x33\x61\x81\xbc\x3f\x7e\x66\x7b\x3d\x30\x54\xe8\x26\x9a\x7a\x69\x1b\x96\x69\xe4\xb2\x4f\xeb\xa0\xc9\x17\x32\x5e\x2a\x8f\x2c\x6c\xa0\xb8\x23\x87\xcd\x9f\x0b\x1b\xa8\x5b\xfa\xef\x22\xf0\xa8\x6a\x26\x33\x46\x3f\x7f\x0c\xc3\x43\x72\x97\xe8\x1c\x9b\xa7\xcb\xd3\x4f\x9d\x3f\x16\x94\x6d\xa4\x1e\xf0\xd4\x14\x9c\x65\x3a\xfa\x8a\x11\x14\x07\x8e\x40\x55\x1d\x07\xbe\xd6\x92\x9d\x67\xd0\xc8\xe9\x86\xf3\xef\x86\xdd\xe6\x86\x1d\xba\x1d\xd9\xd2\xde\xe3\x87\x63\x27\x5e\x11\xda\x3b\xfa\x69\x2d\x14\x07\x8e\x00\xec\xc2\x58\x0b\x65\x13\x85\x50\x73\x04\xf9\xc7\x7e\x85\x1e\x89\xb3\x5f\x3d\xbf\xaa\x52\xda\xba\x17\xf6\xfc\xe8\x17\xd4\x4f\xdb\x41\xce\x85\xe2\xc0\x11\xa8\x59\x27\x02\xce\x1b\x37\x06\x56\x47\xb9\xae\x16\xbb\x62\xac\x7f\xf9\x1a\xcc\x20\xe5\xd7\x87\x89\x93\x26\x08\x1b\xba\xa0\x47\x71\xf4\x96\x09\x04\x07\x8e\x80\x66\x63\x98\xeb\x07\x71\x6a\xb2\xea\x53\xb9\xd6\xc9\xf5\x41\xb9\x32\x8f\x3e\x5d\x8a\x0c\xa6\xb4\x90\x7b\x79\x3b\xfe\x5c\x97\x15\x1f\xf2\x90\x0e\xc5\x1d\xb9\x2b\x20\x0a\x1b\xa8\xfd\xf5\x77\x19\x58\xc0\x7e\x54\xef\xa8\x37\xa2\xdf\xf2\x46\x40\x50\x40\x6c\x59\x61\x82\xb8\x82\xdc\xcb\x6a\x48\xf2\x50\x15\x73\x8a\xf2\x6e\x5e\x26\x72\xed\x50\xdc\x89\x8d\x40\xa2\xa9\x52\xf4\x22\xbb\xcd\xa7\x68\x1e\x62\x18\x0e\xef\x0b\x31\xfe\xf2\xcc\x67\x84\xf9\x4e\x29\xa7\x8d\xb6\xbc\x3d\x0f\x5e\x1c\x6d\x04\x10\x1c\x38\x03\xa1\xd7\xe2\x79\x6d\x26\x42\xef\x9c\xb5\x24\xf0\xb2\xbf\xb8\xc7\xce\x71\xfe\xcb\x23\x6b\xaa\x33\xae\x31\x6f\x0b\x9e\xce\xf0\xb2\x1c\xf5\xc1\x50\x1c\x38\x03\xa3\x03\x73\x7b\x38\x4d\xaf\xc2\x2a\x23\xf4\x63\xb7\x00\x8b\x99\x3e\x85\x0f\x5b\x96\x1e\x2f\x3a\x2a\x89\x9c\x9c\x33\x09\x06\x8f\xbe\x0e\x03\xc5\x81\x33\x10\x36\xd8\xd8\xf4\x9c\x9c\x3e\x5b\x68\x80\x56\x3d\x44\xee\xde\xc5\xa4\xc8\x1a\x8b\xd2\x72\xef\x02\xb8\xb4\xdc\xe7\x5e\x07\xed\x78\x64\x06\xa0\xb8\x23\x77\x05\x44\x61\x03\x75\xd8\xf9\x5d\x06\xfc\xac\xbe\x5c\x99\xc7\xca\xef\x2b\x38\x8b\x08\xc2\x60\x1e\xa9\x31\x2f\x71\x89\x0e\x0a\xb0\x8c\x7b\xe0\x8f\x20\xd1\xaf\x71\x3f\xfa\xbe\x31\x14\x07\xce\xc0\xfb\xea\x70\x92\x35\x44\xe9\x97\x75\xd6\x90\xaf\x84\x85\xcc\xbb\xde\xde\x53\x89\xa3\x0e\xd3\x87\xd3\x63\x58\x5c\xfc\x57\x7d\xcf\x21\xe7\x42\x71\xe0\x0c\x38\x22\xd6\x65\xce\xc9\x99\x78\x16\x76\xac\x34\x05\x7c\xe1\xbe\x82\x15\x3b\xfd\x3a\xe0\x65\xb7\x71\x63\x1e\x63\xf5\xd5\xba\x90\x23\xa9\x39\x14\x07\xce\x80\x8e\x4b\xb0\x9c\xfb\x59\xa1\xa4\x2f\xad\x4f\x17\xf1\xc3\xd8\x2f\x2b\x33\x8c\x04\xd5\x24\xfa\x1f\x8e\x98\x85\x2a\xa6\x39\xcb\x48\x23\xe7\x42\x71\xe0\x0c\xa4\x7a\x32\xdd\x5c\x6c\xb9\xb3\xa4\xcf\x5a\x22\x5c\x28\xa1\xd6\xa3\x74\xde\x05\xbe\x5f\x4c\x9f\x0f\x27\x6e\x8f\xb9\x92\xd6\x3f\x88\xcc\x00\x14\x77\x74\x1f\x80\x28\x6c\xa0\x4e\x9e\xbf\xcb\xc0\x5c\xbb\xc7\x0b\xbb\x9d\xec\xb9\xf3\xcc\xac\xfb\x53\xac\x17\xf0\xf3\x3d\x27\x17\xc4\x07\x0e\xd7\x48\x17\xa7\x67\x33\x03\xdf\xc0\x91\x6b\x87\xe2\xc0\x19\x90\x4b\xf9\x68\x06\x10\x39\x9d\xf7\x54\x95\x60\xb9\xa9\x62\xcc\x79\xf9\x93\x4f\x07\x66\xe1\xd0\xd3\x2b\x09\xb2\xf0\xb3\xbd\xcc\x47\x8e\x2c\x28\x0e\x9c\x81\x76\x3e\xc3\x5b\xc3\x36\x26\x11\x26\x63\x97\x9e\xbf\xf2\xd6\xbe\x2e\xf5\x26\xe8\xad\x6a\xe8\x90\x30\xb1\x45\xbd\xae\xca\xf8\xf2\xd1\x2f\xcd\x80\xe2\xc0\x19\x70\x6f\x54\xc7\x08\xab\xf3\x3c\x77\x9d\xac\x74\x5b\xe6\xfc\x6c\xb0\xf7\xdd\x44\xaa\x20\x0b\xe1\x28\x43\x05\xa3\xf4\x57\xa2\x09\x64\xc8\xb9\x50\x1c\x38\x03\x46\xb0\x84\xea\x91\x37\x01\x64\xb9\xb8\x8a\x42\x3e\x33\xe6\x3d\x2c\xab\xcf\x44\x93\x87\xd0\x3e\x2b\x93\x09\xc6\xbf\x4e\x59\xfd\x80\xcc\x00\x14\x77\x74\x1f\x80\x28\x6c\xa0\x9e\xdd\x7f\x5f\xd8\x44\xce\x28\xc8\xec\x48\x69\x33\xdf\x18\x4d\xf9\xe4\x2e\xe4\xfb\xd8\x80\xf4\x82\xf7\x61\x44\x11\xcb\xfe\xc8\xfa\xe1\xb9\x48\xe7\x4a\x64\xf9\x01\xc5\x9d\x2c\x6c\xd8\xd3\xa8\xcf\xbe\x50\xe0\xfe\xae\x50\xfa\x5d\x55\x5f\x0b\x1e\x3c\xb2\x45\xaf\x39\xe2\xe0\xb0\x1d\xb7\x96\x1d\x6d\xbe\x65\x78\xf4\x95\x28\x28\xee\x64\x61\x23\x37\xe8\x86\x21\xfe\xa2\x6a\x7c\xda\x6a\x5c\x30\xae\xfd\xc5\xf3\x5e\x66\xd1\x03\x35\x49\xcb\x61\x5a\x9c\x1e\x75\xdd\xe7\xe2\x5e\xc8\xc9\x50\x9c\x9f\x0c\x26\xe8\x6a\x84\x1b\xdb\x8c\x7d\x1c\x49\xd5\x77\xf3\x69\x2a\x77\x10\xf0\x4d\x7d\xff\x71\x95\xf4\xd1\xa1\x1e\x29\x97\x48\x50\xa2\xee\xe1\xd5\x2e\x64\x61\x03\xc5\xf9\xc9\xa0\xa1\xff\xb3\xb0\x81\xfa\x75\x89\xc7\x0b\x1b\x8a\x6b\x9b\x34\xc4\x02\xd8\xc6\xe2\xf1\x5b\x42\x8b\xbc\x33\x33\x3c\x7b\x8f\xfb\xdd\x77\xee\x99\xc7\x68\xb1\x95\x13\xaf\xcb\xc8\x1e\x43\x39\x3e\x98\x77\xcd\xe6\x17\x71\xbd\x5e\x79\x97\xe4\x41\xb1\x7e\x8f\x98\x76\xd6\xf9\xb6\x5a\xed\x05\xa9\x49\x47\x3a\xb7\x01\xdc\xa9\xff\x6b\x85\x0d\xd4\xd2\x8e\x3b\x6c\xc0\x85\xcd\xe3\x4f\x25\xc1\xeb\xa4\x8e\x88\xc0\x53\xaf\x8d\xe8\x08\x0a\xd0\x18\x6e\x35\xf8\x70\x0c\xdd\xce\xbf\x33\xf2\xe2\x94\x1e\x59\xd1\xdf\x10\xe2\x4a\xa3\x29\x83\x1f\xea\x43\x43\x37\x99\xbb\xaf\x9c\x0f\x66\x27\x87\x15\xc0\x64\x76\xf5\x12\x37\x3d\x08\xe4\xf9\x0c\xcb\xe0\x52\xd7\x93\xeb\x56\x02\x65\xfe\xca\xcb\x1f\x27\x0b\x9b\xf2\xc3\x32\x2f\x85\xd7\x18\xac\xbe\xb6\xaa\x71\x95\x62\xe6\x82\xd8\xf7\xe2\xe9\xaa\x49\x6f\x9f\x16\x73\xa6\x6d\x6d\xb7\x1b\x6d\xfd\x2b\xaf\xba\x68\x9d\xf8\xd8\x7d\x71\x25\x6a\xfb\xb2\x27\xb6\xac\x13\xc6\xa3\xe7\x08\x83\xaf\x7c\xc9\x6f\x12\x73\xdf\x22\x4e\xd9\x7f\xb2\x98\x69\x10\xeb\xf9\x17\xbe\x24\x14\x26\xe3\x73\xb2\xb0\xa1\x5a\x7b\x5d\x8f\x76\x20\x32\x1b\xdc\x29\x1e\xbf\x09\xb7\x99\x60\xad\x94\x96\x4d\xe0\xa3\xe7\x96\x8a\xc4\xd5\xa2\x18\x6b\xfa\x0b\xaf\xba\x84\xc9\xa0\xb9\x9f\xf8\x58\x39\xde\xcd\x65\xfc\x9e\xda\x9e\x22\x4c\xe5\x8a\x7d\x65\xaa\x57\x0f\x22\x65\x33\x0e\x82\xc8\xf6\x2d\x3d\x56\x2b\xa5\xf9\x4b\xcf\xfc\xb5\xc2\x06\x2a\xba\xbf\xdb\x9f\x95\xc2\xa8\x55\xf2\x61\x4b\xc6\xba\xa9\x11\x8f\x00\xed\xda\x8b\xf7\x6f\xfa\x12\xc8\x7f\xc1\xcb\xcc\xbb\x61\x24\x4a\x8e\xc3\x7e\xa4\x9c\x85\xe2\xc0\xfb\xf3\x3b\xa6\x91\x77\x29\x9f\xb1\xf6\x29\xb8\x99\x3a\x65\xa6\xf1\x4b\xbe\xf3\x65\xd3\x8a\xf5\xef\xbe\xe9\x1f\x4d\x31\x25\xc6\x36\x5b\x40\xce\x85\xe2\xc0\xfb\xf3\x33\x1e\xbe\xaa\x56\x97\x96\x37\xcf\x83\x2f\x72\xd0\x57\x3b\x4f\xef\xc6\xca\x7d\x15\xfe\x54\x99\x8a\xc3\x34\xfe\x2c\x98\x99\x3b\x09\x39\x17\x8a\x03\xef\xcf\xf3\x83\x99\xfd\x0b\x71\x36\xc5\x4c\x1c\x5d\x8d\x1d\xfd\x6e\x4d\x4e\x1f\x69\x25\xe3\x9b\x77\x55\x10\x07\x95\x52\x5b\x15\x2d\x47\x3f\xb0\x85\xe2\xfc\xa4\xfe\x29\x98\x77\xfb\xee\x89\xbe\x66\x9d\x44\xe7\x83\xe1\xc9\x5d\x88\xde\xa0\x1b\x1f\x18\x3b\x21\xb3\x8b\x69\xb4\x5b\xd4\x35\x1c\xd2\x36\xb2\x88\x2c\x6c\xa0\xb8\x23\x87\xcd\x1f\x0b\x1b\xa8\xdb\xc8\xef\x12\x70\x55\xcc\x21\xb3\x3f\x89\xcf\x5e\x43\xaa\x32\x95\x91\xeb\x8d\x18\x60\xac\x72\x71\x87\xc8\x95\xf1\x52\x74\xd2\x92\x04\xa5\xe2\xd1\x09\x0d\x8a\x03\x27\x00\x4e\xde\x16\xd4\xe1\x0a\x14\x2b\x08\xd7\xce\x92\x76\x0b\xe0\xda\x3d\xb9\x8f\x97\x33\x82\xa1\x9e\x77\x48\xf2\xf9\x3d\x43\xd3\xd1\xaf\x9b\x80\xe2\xc0\x09\x70\xa5\x91\x2f\x4a\x19\x8d\x8a\xa3\xd9\x2a\x5b\xe1\xbb\x7f\x76\x30\xea\x09\xde\xb8\x31\xdf\xd7\xed\x7a\xd7\x4f\xf7\x30\x5a\x0e\x8f\x74\xd6\x50\x1c\x38\x01\x2e\x9b\x0b\x0d\x6d\x99\xb6\x0a\xbd\x22\x26\x79\x2a\x9a\x67\x56\x48\x67\xc3\x2f\x30\x16\xf7\x58\x24\x78\x8a\x1c\x72\x0e\x98\x1d\x7d\x1f\x00\x8a\x03\x27\x80\xaf\xdd\x45\x9c\x79\x6c\x9e\x39\xc5\xbf\x19\x4d\x44\xc6\x72\xa3\x86\xde\xb2\x43\xe9\xc0\xf4\xa5\x81\xea\x79\x21\x57\x5d\xe6\x1a\x64\x61\x03\xc5\x1d\x39\x6c\x94\xff\xfc\xb0\x0e\x71\x4b\xff\x5d\x04\xa8\x82\xfb\x64\xbe\x2d\xab\x3a\x0e\xbe\xda\x2e\x98\x91\xbc\x55\xfa\xd3\xd2\x45\xb6\x72\xf1\xd2\xda\x99\xfb\x69\xd9\x9c\x3e\xf9\x6a\xc8\xa5\x43\x71\xe0\x08\x98\x88\x9a\x5b\xf6\x61\x96\x89\x8b\xef\x2c\x51\xfc\xc8\x96\xcc\xb3\x37\x13\xcb\xb9\x8a\x88\xc2\x54\x76\x2b\x8a\xeb\x9a\xcc\xc1\x3a\xfa\x89\x3d\x04\x07\x8e\x80\x69\xb5\x50\xd5\x87\x77\xe5\xd8\x19\x82\x1f\x5e\x47\xbe\x42\x04\x5a\xef\x51\x1b\x22\xde\x78\x2d\xd1\xbc\x2b\x1e\xd7\xba\x7e\xe6\xe8\xa7\xb5\x50\x1c\x38\x02\xb1\x39\x44\xb2\x42\x03\x58\x62\x77\x0c\xa6\xc9\x23\xb0\xb4\xde\x7e\xcf\x4f\xd8\x5d\xb4\x23\x2a\x57\x6d\x0f\xe3\x1f\xb4\x52\x2d\x42\xce\x85\xe2\xc0\x11\x60\xb7\x9f\x52\x49\x7e\x31\x72\xf8\x86\x27\xf3\xd0\x0c\xfb\xb3\xb7\xe6\xdb\x4b\x4e\x44\xf8\xd9\x15\x80\xd9\x6c\x46\x9e\xda\x52\x31\xf2\x90\x0e\xc5\x1d\xb9\x2b\x20\x0a\x1b\xa8\xfd\xf5\x77\x19\x88\xf5\x46\x27\x92\xb7\xe6\xd3\x52\x54\xd9\xbb\xd9\x9a\xc2\xbd\x1a\xf6\xbc\x37\xf9\x5c\x92\xb1\x43\x91\x14\xcd\xdd\x18\xf1\xe2\x23\xc9\x26\x14\x07\xce\xc0\x37\x2d\xbf\xb7\x3f\xf3\xb5\x16\x12\xcc\xce\x22\xe2\x5d\xea\x5f\x14\x6b\x3d\x49\xa1\xeb\xac\x92\xc8\xae\x19\x49\x7a\x81\xd3\xd8\x8f\x9c\x0b\xc5\x81\x33\x10\xa5\x9c\xac\xdf\x2e\x28\xb9\x28\x72\x79\x9e\x5e\x23\x49\x3c\xf4\x26\xf3\x61\x94\x35\x3d\x2e\x6b\xc7\x59\x7e\x56\xe3\x3b\x9d\xe3\xc8\xb9\x50\x1c\x38\x03\x64\x46\x24\xc4\x1f\x5f\x0e\x47\x55\xda\x93\xab\x94\xaa\xaf\xf6\x8c\xf4\x84\x04\x1b\xdf\x0f\xa8\x9d\x5c\x5a\x6c\x12\x99\x8f\xb2\x3a\x12\x65\x43\x70\xe0\x0c\x28\x70\x37\xb0\x38\x74\x71\x66\x32\x17\x8f\xbf\xdf\x1c\x51\xf6\x18\x5e\xcd\xac\xed\xc9\x8d\x3c\x65\xba\x69\xdb\xd3\x51\xb4\xcb\x70\x24\x9e\x86\xe0\x8e\xdc\x15\x5a\x7f\xce\x00\xd4\x61\xe7\x77\x19\x38\xe0\x67\x6e\x8c\xe5\x1c\xa7\x39\x78\x25\xf0\x3a\x24\x3f\x7f\x27\xd5\x98\x43\x5c\x8a\x00\x31\x03\x1b\x75\x23\xcb\xec\x1e\xb1\x44\xae\x1d\x8a\x03\x67\x80\xa1\x0c\x7d\xfe\x8c\xe3\x68\x5b\x41\x70\xed\xce\xa7\xf8\xd7\xab\x92\xa7\xa7\x72\x5b\x83\x66\xec\xbe\xff\x10\xba\x93\x61\xf8\xf3\xe8\xad\x25\x28\xee\xc4\x6f\x08\x4a\xef\x7b\xd6\x73\x65\x22\xf3\x94\x4e\x47\xb3\x9d\x62\xee\xa7\xcc\xd5\x80\x2d\x5e\x19\x01\xbf\xb7\xd7\x18\x5e\xeb\x2a\x3c\x0d\x47\xce\x85\xe2\xc0\x19\x28\xe9\x59\xba\x94\xb4\x31\x6e\x36\x76\x6d\xef\x1a\xb7\x4a\x61\xdb\x06\xfa\x64\xab\xc0\x19\xc5\x67\xf9\x9f\x8d\xf3\xd1\xcc\x49\x22\x90\x73\xa1\x38\x70\x06\xbe\x53\xfc\xff\x98\x3b\xab\xb0\x2e\x9b\xae\xed\x83\xa2\x34\x52\x4a\xa7\xb4\x34\xd2\xdd\xd2\x25\x8d\x80\x74\x29\x25\x48\x4b\x77\x19\x28\x22\x88\x34\xd2\x21\x20\x8d\x20\x48\x87\x94\x84\x74\x89\x28\x0d\x2a\x08\xdf\xf1\x7c\xcf\xf1\xbf\x5e\xef\x0b\x5e\xe7\xdd\x60\xe3\xde\xff\x1d\x0b\xe6\xe2\x64\xd6\x9c\x6b\x66\xd6\xac\x60\xee\xee\xfc\x4c\x60\xcd\xdb\xb3\x8a\x74\xba\x15\x55\x5c\x5d\x37\x4b\xed\x75\x6b\x24\x59\xd0\x9b\x2f\x96\xd9\x7e\x14\xa1\x01\x10\x07\xcd\x03\x80\x82\x0d\x68\xe5\x79\x6a\x3f\xb3\xa2\x88\xf5\xfd\xbd\x8e\xa9\x04\xec\xe9\x7b\x06\xe4\x61\x99\x6f\x70\xf1\x3e\xd2\x32\x2a\x76\x46\x63\xa0\x05\x71\x3d\xf6\x84\x72\x01\x88\x83\x6b\xa0\x33\xac\xf0\xbb\xb9\xa6\xfd\xe0\xb7\x67\x77\xb0\xe3\x3f\x36\xe0\xe3\x8d\x7a\x11\x68\x5e\x5b\x60\x64\x6c\x98\x62\xfb\xb6\x7b\x25\x03\x11\x17\xc4\xc1\x35\xb0\x46\x74\x7b\x98\x97\x93\xdd\x36\xb4\x5a\x3c\x8e\x71\x1b\xbf\x6d\x72\xff\x42\x35\xfd\xac\xbc\xb6\xe8\x3c\xb1\xa9\x4f\x0b\x3f\xd4\x80\x1e\xc4\xc1\x35\x60\x87\x99\x6d\x11\x65\x8c\x1b\xe7\x77\x91\xb0\x58\xfb\x76\x9d\x1a\xe5\x82\x6a\xbd\x4d\xd0\xc8\xb3\x9d\x35\x86\x35\xef\x09\x07\xa8\x10\x04\xe2\xe0\x1a\x88\xf8\x2c\xf2\x29\xb8\x98\x4f\x95\xca\xda\x57\xeb\xab\x73\xfd\xfe\xb8\xf3\xad\xdf\xef\x4a\xd0\x7c\xd2\xd4\xb2\x74\x7a\x34\xf2\xe9\x10\x1a\x00\x71\xd0\x3c\xe0\xfd\xf7\x82\x0d\xc8\xbb\x9f\x5e\xb0\x21\x0b\xac\x4d\x4b\x64\xac\xd0\x7d\x4d\x17\x23\x64\x8e\x79\x65\x2d\x8c\xfd\xd1\x58\x46\x80\xe6\x66\x4e\x7c\xe0\xc5\xe6\x8e\x17\xc1\x88\xe2\x07\x88\x3b\x59\xb0\x71\xa7\xea\xf9\x64\xe3\x41\xb3\x38\x76\x5e\xc3\x5e\x74\x2c\x28\xd6\xbc\xf3\xce\x43\x89\x1e\x3d\xf9\x8e\xba\x5e\xfa\x75\x76\x97\x35\x44\x64\x10\x77\xb2\x60\xc3\xf2\x43\x11\xeb\x0d\xd2\x47\xcb\xa8\x9b\xe6\xe3\xe9\xd8\x16\xa6\x37\xb7\x34\x2c\x32\x31\xfc\xda\x78\xe8\xfb\x6e\x34\x6c\x1f\xb8\x43\xa5\x20\x00\x17\x24\x83\x0b\xfb\x1a\xb5\x55\x95\xaa\x6e\xb9\x95\x6f\x42\x04\x1e\xad\x65\x2c\x6b\x5e\xaa\xf9\xd0\xf8\x4a\x74\x0c\x29\x87\xe0\x97\x7f\x98\x6b\xe7\xe8\x3c\xa2\x60\x03\xe2\x82\x64\xa8\x91\xfe\x59\xb0\x71\x75\xc6\xf8\xf6\xad\xf6\xb8\xde\x26\x44\xe7\xfb\x8a\xbf\x21\xdd\xdb\x3b\x55\x56\x6c\xfb\x8f\x1f\x33\x11\xcb\x8c\x46\x89\x7e\x78\xf0\x67\xc1\x26\xe2\xf6\x65\xe6\xfa\xef\xaa\x11\x55\xd1\xdb\xf7\x3c\xb7\xc7\x9e\x7f\x65\xb0\x30\xde\x17\x38\x3f\xde\xd7\xfb\xfb\x71\xc5\x1e\xff\x9f\xa7\x2b\x4c\x3e\x19\x79\x71\xec\x0d\xd6\xd1\x17\x87\x4c\x0f\xff\x0e\xf4\x54\xe3\x8d\xb5\x55\xb8\x18\xe1\x28\x90\x94\x1f\x23\x59\x19\x5a\xf1\x6f\x2b\xd8\x80\x86\xf6\x67\x0f\x1b\x78\xc1\x66\x9e\xdd\xe6\x67\x85\xf4\x2f\x93\x8d\x2f\x3b\x1f\xf9\x89\x37\x6e\xae\x0a\x54\x86\x0a\xbd\x11\xf0\x9f\x70\xe8\xf9\x1e\xdd\x9b\x1d\x74\x16\x05\x1b\x89\x13\x05\x9b\x83\xac\x66\x53\xaf\x2c\xef\x95\xf3\xaf\x45\xa7\xe3\xa9\x6f\x72\xc5\xbd\x5e\xb8\x34\xc6\x45\xa5\x48\x47\xc8\x8f\xd7\x1e\xd3\x8d\x71\x26\x87\x3f\x4e\x16\x6c\x5c\xa2\xa7\xfa\xc8\x9f\xb4\xc5\x8a\x67\x26\xa6\x11\x53\xb8\xc4\xbc\x78\x45\x77\xb9\x8b\x82\x68\x16\xef\x92\xa7\x17\x0f\x45\x92\xe1\x99\x1c\x75\x39\x59\xb0\x19\xa9\xdf\xf2\x36\x9d\x61\x4b\xdc\xf9\x89\x62\x7b\xf3\xb9\xfe\xe0\xac\xb2\x77\xde\x97\x57\xdf\x2a\x22\xec\x09\x6f\xf8\x58\x5c\xe7\x3e\x93\xd1\x9e\x2c\xd8\xb4\xfc\x88\xea\x8f\x9b\xb8\x35\x1b\x11\x43\x3c\x13\xa0\x86\xee\x2c\x91\xe5\x14\x41\x19\x2c\x8d\xd9\x5c\xcd\x2d\x3c\x35\x58\x90\x72\x26\xa3\x3d\x59\xb0\x21\x1c\xc8\x8c\x0c\x54\x18\x9b\x70\xcc\xb9\x63\x17\xf6\x59\x53\xeb\x9c\x6c\x59\x68\x23\x3e\x51\xc0\x93\x1e\x56\xe1\x0e\xf2\x7a\xa7\x33\x2b\xd8\x80\xa4\x7b\xea\xe3\x20\xef\x2a\x9f\x1f\xcd\xd0\xd6\xfa\x2a\x64\xdc\x50\xe3\x54\xb2\x13\xc2\x64\x5e\x35\x4e\xb0\xcd\xb9\xb0\x33\xdc\x30\xc9\x57\xf1\x11\x91\x97\x40\x1c\x3c\x3f\x13\x45\xd5\xfc\x2a\xd3\xa2\x7f\xe4\x13\xdf\x7f\xc1\x4e\xae\x7c\x87\x71\x4f\xa2\x49\xc1\xf0\x5e\x21\xc5\xb6\x1c\xaa\x82\x26\xff\x73\x44\x5c\x10\x07\xcf\xcf\xe3\xaf\x47\x16\x26\x3c\x35\x42\x42\xb9\x53\x7f\xd7\x10\x57\xaf\xd5\x5f\x13\x2f\x69\x1b\xef\x69\x1f\xae\xed\xe6\xf6\xdb\x30\x86\x3c\x20\x88\x83\xe7\x67\xf5\xfb\xb1\xde\x18\x6e\x65\x2a\xb5\xa8\xaf\xeb\xa4\x4c\x8f\x37\x5c\xf4\xe3\xd3\x1f\xd5\x4e\xa0\xb6\x5b\x92\x25\xb0\xa2\xb2\x7f\x47\xc4\x05\x71\xf0\xb8\x6a\x0f\x0b\x1e\x7a\xec\xd0\x12\xbc\xca\x2d\xca\x2c\xa5\x9e\xf1\x75\xf2\x5a\x8a\x7c\xa2\xe6\xc7\x7f\xa8\x42\x5e\xff\x48\x21\xea\x16\xa2\x60\x03\xe2\xa0\x1e\x36\x7f\x2d\xd8\x80\xa6\x91\xd3\x14\xc0\x12\x38\xed\xfc\x12\x6f\x02\xed\x36\xb3\xfb\xc1\xec\x61\xb8\x43\x64\xfb\xcf\x9f\x9b\x45\xca\x01\x06\xd4\x06\x46\x79\xb2\x59\x1b\x88\x91\x83\x38\xb8\x02\xa2\xb5\x62\x64\xfa\x45\xa4\x16\xda\x62\xcf\x9d\x8f\x7c\xe7\xcb\x12\xcf\xb1\xe6\xc0\xe7\xda\x7e\x8e\x96\xc3\x26\x39\x30\x3c\x78\x16\x11\x17\xc4\xc1\x15\x30\xb8\xb5\x1a\x87\x4f\x7c\x28\xd2\x12\xda\xda\x7e\x5b\x99\x7a\xae\x49\xbd\x58\x3a\x32\x82\xed\xb2\xb2\x59\x79\x52\xd3\xb6\x10\xb4\x4a\x07\x71\xf0\xbf\x94\x7d\xb1\xc8\x87\x01\x09\x7d\x0d\x59\x77\xda\x81\x79\xd6\xa7\x2b\x1a\x76\xc4\x62\x41\x2c\x78\x77\xef\x0c\xb0\xc4\x60\x31\x87\x41\x5b\x80\x20\x0e\x1e\x37\xa6\x26\x2f\xbb\x7c\xf9\xae\xff\x12\x1f\x86\xe3\xa7\x6f\xcc\x26\x2a\x25\xda\x6b\x17\x1f\x39\xa3\x70\x77\x54\xb0\xe0\x2f\x97\x1b\x21\x0a\x36\x20\x0e\xea\x61\xf3\xf7\x82\x0d\x68\x4a\x3f\x4d\x02\xc8\xee\x47\xf7\x28\x38\x5d\x4a\x39\x58\x8a\x18\x4b\xd9\xfd\xfb\xa7\xe6\xca\xd7\xca\xc4\xe4\x2b\x78\x31\x84\x5f\xdc\x78\xf8\x1a\xda\x59\x07\x71\x70\x09\xe4\x4c\x73\x6e\xb0\x35\x8d\x13\x1d\xdf\xda\xb3\xf8\xe8\xfb\xfd\xd7\xfb\x40\x3c\xeb\xb6\xaf\x5c\x55\x41\x2a\x9f\xf8\x17\x62\x8a\x20\xb3\x0e\xe2\xe0\x12\xb8\x91\x55\x90\xbb\xf3\x54\x3e\x62\xf5\x5c\x8d\xf2\x70\x2b\x4d\x7a\xc4\xe4\x7a\xe3\x4d\x34\xc6\x49\x1f\x56\x29\xa2\x2c\xf4\x72\xa8\xe1\x14\x88\x83\xff\xa9\xcc\xb3\x5e\x92\xdc\x3e\x56\x64\x32\x0e\xa6\x29\x71\xf3\x75\xba\xf5\x73\xea\x68\x4b\xe9\xaa\xfc\xdc\xa2\xae\x62\xe6\x87\x5b\x58\xd0\xd3\xfe\x20\x0e\x1e\xd7\xf6\x98\x1f\xfd\x85\x3e\x3f\xf7\x3b\x36\x8e\xc0\x2f\x13\xa9\x57\x23\x12\xd2\xa6\x4c\x7c\x53\x58\xba\x78\x91\x89\x2e\x9d\xef\x53\x41\x2c\xd2\x41\x1c\xd4\xbb\x02\x50\xb0\x01\xe5\xd7\x53\x7b\xd8\x8c\x30\xac\xd8\x50\xdd\x7e\xfc\xb2\xa3\x92\x71\x39\xbb\x5a\x4e\x0f\x33\x49\xf0\xf3\x23\x2e\x6b\x37\xfe\xb6\xde\xe9\x08\x24\xe8\xda\x0a\x88\x3b\xf1\x3a\x0c\xcf\x38\xd5\xb3\x8b\x15\x3d\x8f\xb5\x63\xa5\x87\x66\x67\x94\x03\x35\x42\xdd\x8f\x31\xb2\x16\x64\x04\xdf\xa2\x5f\xe7\x20\x82\x9e\x74\x06\x71\x70\x0d\x10\x84\x2d\x6f\x0b\x1b\xba\x10\xb1\xb9\x13\x67\xaa\xaa\xfa\x6d\x66\x55\x77\x52\x91\x52\x21\x71\x45\xf0\x12\x3c\x28\xb4\x98\x85\xee\xb0\x82\x38\xf8\xdf\x2a\xc8\x7e\x54\x0e\xcd\x37\xed\xdd\x7a\x4c\xce\xc1\xe5\x89\x9d\x4f\x68\x7e\xa2\x38\xe6\x2e\xe9\xd6\xaf\x53\xeb\x23\xf7\x7c\x7e\x42\xd3\x21\x88\x83\xc7\x7d\xeb\x96\xe1\x7b\xe7\xd0\x79\x76\x0b\x97\xe7\x61\xcc\x4b\xd5\xa7\x64\x98\xaa\x3d\x4b\x9e\x6b\x13\xc3\x86\xae\x05\x9d\xd7\x53\xd8\x10\x1a\x00\x71\x50\xef\x0a\x40\xc1\x06\xb4\xd8\x39\x4d\x03\x69\xd7\x1d\x3d\xd0\x82\xed\xbc\x74\x93\xf0\x04\x82\x9c\xaf\x8f\x95\x36\x7f\x89\xa0\xc2\x67\x31\xae\xbb\x9e\xb1\x45\xea\x29\x28\x8a\x18\x3b\x88\x83\x6b\x40\xef\x52\x82\xcc\x94\x85\x45\xf9\xcb\x2e\x22\xb7\x04\x14\xab\x49\xde\xd4\xb1\x9e\x25\x65\xaf\x8a\x6a\x64\xb1\xcf\xcf\xa2\xdd\xa0\x1e\x36\x20\x0e\xae\x01\xe1\xfe\x81\x17\xed\xf5\xed\x5f\xd8\x03\x0f\x66\x29\xdc\xd2\x1a\x8d\xc3\x07\x6e\xb5\x85\xc4\x39\x4d\xd9\x09\xfa\x99\x69\x70\xfc\x82\x7a\xcd\x00\xb8\x13\xa7\x2b\x88\xb3\xce\xef\xa2\xcd\xe5\xd8\xbf\x3e\x67\x45\xbc\xc1\x55\xcd\xa0\xb2\xf8\x85\xec\x65\xbc\x8a\xb2\x0d\x67\x37\x57\x86\xd8\x1a\x74\xba\x02\xc0\xc1\xe3\x36\x95\x0e\xd2\x60\x84\xe2\x58\xc8\x88\x4d\x05\x5c\xe3\x45\x4a\x1c\xc3\x4e\x0d\xbf\x95\xdc\xe0\xb5\x5f\xbb\xff\x3d\x60\x65\xbe\x11\xea\x61\x03\xe0\xa0\x79\x00\x50\xb0\x01\xad\x3c\x4f\xd3\x40\x98\x76\x48\x0b\x5b\xcd\x64\x1d\x8f\xa1\xda\x97\xe9\x26\x54\xe9\xf7\xcd\xbe\x13\x65\x3d\x98\x76\x93\x3b\xc9\x4a\xa4\x3e\xbe\x15\x88\xb1\x83\xb8\x13\x4f\xbb\x17\xf7\x68\x65\xa8\x6e\x97\xe0\xee\x04\x5a\x16\x2c\x7f\xc6\xdd\x3c\xae\x5a\x8d\xef\xe3\xfc\xb1\x27\xb2\xa6\x66\xe1\xc1\x2f\x82\x88\x0b\xe2\xe0\x1a\x40\x29\xaa\xf5\x7e\x60\x6f\x2b\x2e\x23\x20\xd6\xe6\xb4\x38\xee\x9e\x61\x54\x59\x42\xab\x9c\xcf\xf0\xf9\xaa\x49\xb3\xf2\x0f\xdf\x2e\x44\x5c\x10\x07\xff\x5b\x19\x9b\x87\xb5\x78\x9b\xa7\xe1\x3f\xbf\x8e\xb3\xf5\x6e\x96\x4f\x72\xca\x55\xa4\x51\x5f\xda\xf5\x26\x86\x51\x47\x1e\xea\x15\x15\x28\x17\x80\x38\x78\xdc\x84\x7c\xd1\xcc\xc1\x06\xba\x07\xc9\x79\x44\x6b\xa9\x12\x4b\x6e\x42\x56\x22\x98\xa8\x15\x02\x92\x77\x0e\xc6\xc4\x05\xcc\x5f\x0c\x21\x34\x00\xe2\xa0\x79\x00\x50\xb0\x01\x79\xf7\xd3\x0b\x36\x33\x3f\xdc\x59\xeb\xf1\xb5\x19\x76\x8c\xb0\x46\xcc\x6f\x15\xbd\xab\x22\xb1\x7c\x1b\x7e\x43\x5e\xaf\xfb\xd9\xd0\xeb\x08\x3b\xfa\x10\x44\xf1\x03\xc4\x9d\x2c\xd8\xa0\x15\xad\xca\xbc\xd9\xd1\xd7\xad\x19\x6e\xbf\x8d\x5e\xdc\x74\x67\x63\xd0\xd9\xf3\xed\xab\xeb\xd1\x18\x6b\xc3\xe4\x42\xdf\x2e\x34\x20\x22\x83\xb8\x93\x05\x9b\x39\xa6\xaf\xb8\xc1\x9b\xae\xca\x18\xb5\x4f\x07\x18\xd9\x82\x32\x59\x15\xe4\x13\x24\x8d\xbf\xe7\x65\x97\xe7\xba\xf0\x63\x1b\x97\x23\x22\x83\xb8\x20\x19\x09\xd8\xd7\x68\xea\x58\xac\x09\x3d\x4a\x32\x51\xb7\xdb\xe9\x9b\x1d\x96\x46\xe9\x1b\xe0\x18\xf5\x57\x89\xcf\x0b\xd1\xae\x12\xd6\xf9\x9a\xf6\x01\x51\xb0\x01\x71\xff\xfd\xce\x7f\x16\x6c\xd8\xab\xbe\x50\x77\x5e\x7c\x23\x24\xee\x4a\x86\x7d\x5f\xa3\x71\x36\xb5\xea\x46\x06\xfd\x2e\x69\x94\xb6\x9c\x7e\x85\x31\x73\xb2\xd4\x9f\x05\x1b\xc7\xc9\x6c\x0d\x8e\x64\xc1\x0f\x3b\x48\x41\x71\xd4\xd9\x25\x72\xe5\xf4\x3e\x6b\x36\x94\xe3\xb2\xb7\x4c\x23\x7a\x18\x5a\x3b\x49\xfe\x40\xf7\xe9\xa8\x3f\xb5\x5b\xe3\xac\x5f\x64\x6e\xb7\x0f\x5c\x9b\x22\x46\x4a\x52\x1a\x27\x70\x4a\xad\x52\x9d\x23\x74\x77\xee\x8d\x3a\xf8\xb7\x14\x6c\xf6\x2f\xfc\xdf\x86\xf6\x3f\x05\x1b\x69\x24\x29\xb8\xbf\xf6\x14\x1f\xf5\x1f\x5d\x52\xd0\x96\x15\xbe\x78\x8e\xb4\xf4\x71\x93\x4f\xe8\x53\xec\xd4\x6f\x09\xa4\xaf\xfb\xb5\x1b\x91\x12\x7e\x0e\x9d\x45\xc5\xc6\xff\x44\xc5\xe6\x7e\x85\x94\x14\x27\x8b\x6e\x58\xa9\x19\x99\x41\x6a\x5a\xb1\x1c\xe3\xe1\xc0\x7c\xe5\xcb\x7d\x43\x1c\xab\x94\xa1\x78\x09\xb2\xca\x33\x39\xfd\x21\x78\xb2\xad\xcb\xa0\xc2\x71\x51\x60\x02\x27\xed\xf6\xbe\x8a\xed\x48\xd7\xb3\x17\x4a\xa6\xa8\x14\xda\xb6\x49\x2b\x9d\xae\xe5\xb1\x31\x77\x16\xcf\xe4\xac\xcb\xc9\x8a\xcd\x2c\x39\xa6\x41\xce\x6d\x6d\xef\x36\x67\x0f\x6c\xbe\x74\x33\x86\x49\x5c\x3b\x01\xbd\xd7\xc5\x55\x8f\xf4\x52\xc9\x71\x42\x5d\x94\xce\x64\xb4\x4e\x27\x7e\x6c\x75\xfe\x52\xb5\x24\x4b\x81\x86\x58\x03\xdd\xfe\xd5\x4e\x64\xc5\x55\x2c\x2b\xa2\x20\xc7\x1f\x1c\xf7\x71\x99\xb7\x7a\xc3\x52\xce\xe0\xac\x4b\x94\x8c\xff\xc9\x8a\xcd\x5b\x9b\x00\x99\x67\x17\x48\xb8\xb6\x6e\xa5\x2f\xa1\xe0\x25\x04\xa9\x74\xd3\x0b\xbf\x2f\x15\xb9\x29\xf6\x48\xd9\x83\x9a\x86\x06\xe5\xcc\x2a\x36\x20\xe9\x9e\x96\xa0\x47\x05\x7b\x5a\xe9\x1f\x84\xbe\xc1\x26\x4f\xc0\x9f\xa2\x7d\x4e\xcf\x51\xb8\xc4\x99\xfb\xf5\x55\x0b\x53\xfb\xd7\xad\xee\xe0\xe6\x37\x88\xc4\x04\xe2\xe0\x09\xda\x97\xa0\x33\x46\x42\x0a\xa9\x1f\xb3\x46\x48\x3d\x49\xac\x77\xc2\xeb\x56\x55\x48\x99\x1f\x65\x28\xdf\x0d\x8d\xe8\x9f\x2c\xbe\xd0\xb1\x62\x10\x07\x4f\xd0\xc4\x04\x98\xe3\xa1\xb2\xd3\x4e\x05\xbd\xde\x4e\x2d\xcf\x70\xd5\x7f\x4c\xbf\x55\x0a\xf3\xec\xff\x39\x89\x3b\xb2\x51\xfd\xca\x8f\x0d\x11\x17\xc4\xc1\x13\xe9\xa0\xa2\xd3\x7c\xb6\x81\xfb\xcd\xc1\x94\x9c\x5b\xb7\xb1\x97\xa9\x72\xfd\xf7\x1e\x32\xd5\xb4\x3c\x34\xa7\x1c\xb1\xa3\xbc\x62\x11\x06\xd5\x01\x00\x5c\x90\x14\x92\xff\x9f\x71\x65\xf0\x97\x2e\x4e\x99\x4c\xcf\xa8\x3b\xb2\x49\xba\x0e\x0b\x65\xbf\xd2\x37\xad\x41\xce\x12\xcd\x53\x8d\x7c\x4c\x60\xfb\x13\xe3\x1e\xc2\xaf\x83\x38\x44\x0b\x93\xff\x4c\x58\x7f\x59\xa3\x81\xe6\x91\xd3\x24\x70\xc4\xe0\x20\x9e\xa3\xe2\x22\xc5\x21\x9f\xb8\x63\xe8\xc7\x75\xf3\xb7\x00\x6a\xd8\x55\x69\xb6\xdf\x97\x67\x9e\x8d\xad\x7a\x51\xf4\x23\x86\x0e\xe2\xe0\x12\x88\x3f\x26\x16\xf3\x31\xc4\xdf\x7f\x2c\xf0\x93\x94\xf8\x09\xbe\xce\xce\x70\x34\xbf\xbe\xd1\x15\x86\x3c\xc7\xe4\xc7\xdd\xf4\x37\xa0\x33\x36\x20\x0e\x2e\x81\x00\x74\x66\xae\xc6\xbb\x56\x58\x2e\xe8\x6b\x2a\xd2\xd2\x43\xb4\x6e\x29\x9f\xf2\x16\xf6\xbb\x64\x5c\xf7\x42\x18\xf5\x6f\x32\x43\x2f\x05\x83\x38\xb8\x04\x28\x34\xe2\x5f\xea\xe0\x97\xb3\x60\x24\x5b\x5c\x70\x25\xa3\x33\x59\x28\x2e\x68\x1e\x7e\xbc\xde\x96\x15\x66\x35\x16\xf1\x44\x11\x6a\xe3\x01\xe2\xe0\x12\xd8\xc3\xbe\x66\x10\xcc\xf9\xd1\xf8\xa6\xab\x04\xff\xb8\xfa\x9d\x27\x73\x63\x68\x47\x41\x34\xfa\x17\xef\x37\xd7\xc6\x0a\x9a\x1b\x6f\x22\x24\x00\xe2\xa0\x2e\x36\x7f\x2f\xd9\x80\xe6\xf4\xd3\x24\x30\xa9\x4a\xcd\x3d\x8f\x6a\xed\xb9\x9d\xd5\xda\xcb\xe7\x2b\xd5\xe4\x1f\x29\x57\xcc\x8e\x26\x23\xa3\xb3\xac\x12\x8f\xb9\x97\x04\x59\x2a\x10\x07\x97\x40\xd7\x95\xf4\x87\x12\x2e\x47\x0b\xb9\xea\x87\xf4\x3d\xd3\x24\xe3\x02\xdf\x3a\xb7\xed\x48\xd0\x34\x3c\x1b\x49\x13\x51\x93\xf4\xa0\x3a\x28\x88\x83\x4b\x60\x3d\x7d\xd9\x5f\x8f\x98\x74\xee\xa8\xce\x35\xc6\xc1\xf2\x17\xf3\x68\x90\x91\x9e\x66\x0f\x5f\xc0\x3e\x4e\x08\x81\xd2\xb0\xd7\x0e\x22\x2e\x88\x83\x4b\x60\x66\xd0\x90\x87\xc4\xf7\x87\x45\x8f\xf9\x5c\xc4\xc6\x39\xfa\x64\xb7\x98\x4f\x36\x92\x28\x6e\xf8\xa3\xe6\xce\x3f\x4b\xcb\xa2\xa1\xcb\x56\x20\x0e\x2e\x81\x9e\xce\x42\x4c\xda\xde\x55\xa2\xe9\xbd\x03\xe4\xa3\x69\x6d\xbe\x4d\x89\x6c\x23\x37\xfa\xa0\x65\x2a\x6a\x1d\x8f\xe1\x2a\x69\x62\xc4\x32\x1d\xc4\x41\xdd\x2b\x04\xff\x6e\xd5\x40\x09\xf6\x34\x0d\x60\xf7\x17\xba\x88\x48\x1b\x5d\xbc\x6d\x6d\x3f\xd2\x4b\x4e\xad\xde\x4a\x1d\xe1\xfd\xfe\xf3\x27\xa7\x8e\xbb\xef\x15\xd3\x13\xce\x35\x23\xc6\x0e\xe2\x4e\x9c\xb3\x5a\xa2\x2a\x72\xd9\xb9\xf1\xb6\x41\x9c\xe0\x1c\x1d\x6a\x6e\x43\x75\xc4\xfc\x0f\x89\x23\xeb\xb1\xeb\x57\x7a\x13\xba\xf0\xdd\x05\xa1\x73\x56\x00\x0e\xae\x01\x2d\xfe\xcd\x2b\x1c\x84\x21\x0c\x33\x2a\xb2\x37\xc6\xa4\xa3\x4b\xdb\x51\x93\x36\xc2\x90\x71\x6c\xa4\x8b\x7a\x3e\x06\x79\xd8\x43\xef\xf0\x83\xb8\x13\x56\xed\x89\x3a\xd2\xa5\x7e\xfd\xc5\xeb\xcb\x43\xae\x6d\x91\x0e\x66\x16\xd1\x2a\x55\xef\x63\x1e\x5d\xf6\x36\xcd\xa5\x0d\xaa\xf0\x85\x2e\x08\x82\x38\xb8\x06\xe6\x36\xd7\x9e\x5f\xef\xa2\x59\x75\x42\x91\x70\xd2\xfa\x5e\xb3\x8d\xea\xf6\x24\x5b\xcd\xb1\x02\x53\xa2\x36\xed\xa0\x3e\xdc\xb1\x05\xa1\x01\x10\x07\x75\xaf\x00\x94\x6c\x40\xab\x9d\xd3\x34\x50\x12\xa1\x70\x8d\x2d\xd2\x90\x21\x96\xf9\xb6\xb9\x52\xa2\x64\x5b\x36\xef\x13\xe1\xb8\xe5\x4d\xc7\x1d\x33\xdf\x02\x2a\x9d\x32\x3c\xc4\xd8\x41\x1c\x5c\x03\x55\x0a\xfb\xbb\x5f\x30\xa4\x37\x1a\x0d\xc7\x1d\x8c\x36\x3c\x2b\x7a\x54\x64\x77\x25\x4c\x92\xb5\x42\xc8\x24\x83\xf5\x1b\x5f\x40\x37\x8e\x41\x1c\x5c\x03\xfc\x91\xac\x5b\x9c\xf7\x84\xbe\x3d\x34\xe4\x7c\xda\x1a\x13\x3d\x77\xf4\xb6\x70\xf8\x1d\x41\x83\xb2\xe0\xdb\xcf\xd1\xe2\x0f\x2e\x43\x97\x18\x41\x1c\x5c\x03\x0c\x7b\x9c\x83\x79\xfa\xd8\x2f\x4c\x1e\x65\x3d\x0d\x4e\xf1\x16\xef\xf7\x45\x21\x75\x32\x89\x39\x52\xbb\x45\x11\x86\x5f\xf8\x16\xfa\x0e\x20\x0e\xae\x81\x80\x16\x4b\x5e\xa1\x15\x8d\x48\x54\x39\x56\xd3\xca\x5f\xa8\x24\xa4\x11\x1f\x73\xb0\x6f\x14\xde\xdc\x21\xaf\x79\x83\xb6\x23\x0b\x5d\x8a\x02\x71\xd0\x3c\xe0\xf4\x77\x0d\x80\x96\x9e\xa7\x69\x80\xb1\xcf\x84\x18\xf3\xba\x78\x5d\xc1\xc5\x57\xf7\x0e\xe6\x06\x3f\xea\xdb\xdb\x1f\x49\xc7\xc5\x48\x37\x8f\xeb\xdc\x72\xd0\xa7\x61\x40\x8c\x1d\xc4\xc1\x35\x80\x14\xab\x19\x82\x3d\x17\xcf\x48\x10\x43\x61\xea\x21\xab\x6b\x96\xd4\x4c\x36\xff\xa4\x55\xa1\x01\x4d\xe4\x5a\xdb\x70\xdf\x24\xf4\xff\x0a\xe2\xe0\x1a\x98\x99\x8f\xd0\x51\x1c\x7d\x8a\x31\x9c\xf7\xe5\x47\x4a\x7e\x2d\xf5\xa2\xe1\x0c\x33\x55\x71\x84\x2d\x49\xe3\xc8\x98\xb2\xd6\x11\x01\x34\x67\x03\x38\xb8\x06\xb0\xe6\x5a\x3d\x6c\x50\x70\xa4\xba\xa8\xe3\xfb\x15\xb0\x75\xb1\x19\xa7\x94\xa4\x52\xe9\x69\x28\x66\xec\x77\x3a\x0e\x3e\xb6\x42\x17\x7a\x41\x1c\x5c\x03\x99\x65\xb4\x96\x17\x5b\x7b\x0c\xb2\x47\x7c\xde\x49\xe0\xb9\xdb\x88\xf0\x62\x3d\xe2\x10\x9f\x92\xf0\x1c\xab\x49\xda\xb9\x57\xcd\x84\xd0\x00\x88\x83\xe6\x01\x40\xc9\x06\xe4\xde\x4f\x2f\xd9\x3c\xb1\x54\xf8\x56\x90\x28\x53\x9b\xd0\x19\x8d\x59\xf5\xa0\xe5\xd2\x7a\xab\xa9\xe2\xa5\xdb\x6a\xab\x36\x21\x71\x97\x82\xcd\x96\x3f\x22\xca\x1f\x20\xee\x64\xc9\xa6\x0f\x3d\x38\xc2\x08\x23\xa9\x36\x4e\xb3\xaf\xd7\x33\x61\x79\x07\xe5\x39\xb7\xab\x03\xb5\x58\x62\x9c\xf8\xdb\x82\xe6\xcf\x13\xd0\x93\xe1\x20\xee\x64\xc9\xa6\xf5\x7a\xb1\xb8\xd4\x7d\x97\x03\x6d\xfe\x57\x73\x1e\xa4\xe7\xc3\xf5\xf6\x29\x8f\x92\xf4\x67\xf2\x4b\x4d\x9c\x50\xa9\xaf\xcd\xb5\x21\x22\x83\xb8\x20\x19\x7f\xd8\xd7\x78\x20\xf4\x34\xc7\x5f\xe4\x11\x8a\xe5\xbe\x14\x4e\x4e\xbf\xca\xc1\xf8\x68\xf2\x6a\xfb\x25\xdb\x31\x27\xcb\x47\x2f\xd7\x77\x02\x0b\xfc\x11\x15\x18\x4c\x81\xcb\x84\x71\x22\x9d\x4d\x8a\xb4\x75\x45\xb6\xb1\xd4\x73\x3a\x38\x5d\x6e\x9e\x11\x92\xb7\x8b\x90\x7c\xca\x98\xe2\xc9\xfe\x71\xc7\x69\xeb\x5b\x2b\xea\x39\xa5\xa6\x37\x76\x03\x98\xea\x75\x89\xe9\x03\xf9\x66\xea\x6c\x53\xef\xdf\xfd\x6e\x68\x0d\x66\x95\x2b\x59\x33\xfa\x03\x3d\x16\xba\xcd\x1e\x45\xd8\xea\x3d\xed\x98\x9e\xea\xcc\xe7\x34\xfd\xf4\x5a\x5d\xee\x3c\x23\x7b\xc8\x7a\xc1\xae\xa9\xe2\x95\x3a\xb7\x7f\x5b\x05\x06\x34\xb4\x3f\x2a\x30\x12\x27\x2a\x30\xdd\x29\x09\xe1\xe6\x9c\xc6\xf4\x6a\x21\x57\xbd\x1c\x97\xaa\xb8\xb8\xd2\xa3\x85\x5b\x64\xce\xf7\x15\x93\xcb\xd3\xaf\x5d\x6b\xaa\x3b\x8b\x0a\x4c\xd3\x89\x0a\x4c\xce\x47\xd4\xbb\x6f\x98\x45\x43\x9d\xbe\xdf\xb5\xf9\xf1\x4c\xf4\x0a\x2f\xc6\x7e\xf4\x53\x7a\xa7\xda\x9f\x5a\xaf\xa9\xae\x24\x86\x7d\x3d\x93\xe3\x1c\x27\x2b\x30\x5a\xe6\x1e\x8b\xfe\x01\x96\x55\x87\x55\x63\xeb\x3a\x24\x2f\xc5\x6a\x46\xdf\x4d\xf4\xa1\x50\x12\x76\xd5\x1e\x74\xdd\xe2\x9e\x0c\x3d\x93\xc3\x2b\x27\x2b\x30\x38\x43\xbe\x52\xc6\x82\xd1\x0f\x42\x49\x17\x57\x58\x82\x7b\x37\xef\x26\x2d\x10\x3f\x24\xcf\xe6\x3b\x92\x78\x36\x6e\x28\xbb\x58\x7b\x26\xa3\x3d\x59\x81\x09\x77\x94\xb7\xce\x2c\x4c\x9d\x35\x5a\x40\xfd\x55\x5e\x33\xd2\xc2\xe9\x9e\xf5\xd5\x75\xe1\x12\x39\x23\x92\x43\x44\xbe\xcb\x58\xec\x99\x8c\xf6\x64\x05\x26\xcb\x67\x8b\x3d\x4b\xdd\x76\x60\x49\x1d\xd5\xba\xf5\x78\xcb\xee\xf8\xce\x87\xde\x6a\xd6\xe0\xc6\xf1\x27\x5e\x9a\xfb\x7e\xe7\xa6\xcf\xac\x02\x03\x92\xee\x69\xf9\xf6\xd5\x92\xe6\x5b\x8b\xd7\x45\x83\xdc\x45\xbe\xc5\x69\x63\x11\x95\x83\x8a\xe1\xca\x3d\x35\x49\x6d\x0d\x37\xba\xe7\x57\x99\xba\xa0\x8e\x79\x20\x0e\x9e\x6f\xfd\x02\x6f\x09\x5e\xc6\xc9\xca\xc5\x47\x26\x70\x64\x73\xe3\xb9\x92\xe9\x33\xab\x43\xd1\x9f\x96\x46\xd6\xfe\x01\xdb\x4e\xeb\x87\x35\x22\x2e\x88\x83\xe7\xdb\x3d\xb2\xf1\x25\x1b\x06\xbf\x60\x9f\x7b\x5c\x1c\x44\xa6\x45\x44\x42\x8d\x17\x2f\x16\xa3\x2a\x39\x35\x29\x3b\x27\x4d\x4f\xe5\x40\x6b\x2e\x10\x07\x6f\xc7\xdf\x6a\x9d\xf2\xba\x15\xc3\x7f\x51\x5b\x48\xd6\x3f\x55\x34\xce\x67\x49\xb4\x30\x87\x7e\x68\xb1\x8d\x19\xbf\xa0\xa2\x4e\x8d\x9f\x16\x11\x17\xc4\x05\x49\xa1\xfd\xe3\x3b\xa8\x3c\xd5\x61\x08\xb7\xfb\xf8\x13\x23\x2f\x18\x27\xb9\xd7\xb0\x77\xf0\x45\x7b\x28\x2f\xb9\x3c\x87\xca\xb3\xdb\x11\xef\xac\x56\xab\x11\xf6\x1b\xc4\x21\x7a\x92\x48\xfc\xbd\x02\x03\x9a\x47\x4e\x93\x80\xd7\x08\x75\xa4\xf9\xa7\x65\xf4\xfc\xbd\xde\xa3\xd1\xbe\x64\xcb\xd9\x92\xca\x01\x4c\x95\xcf\x74\x65\xa5\x77\x0d\x08\xe9\x6e\x7d\x45\x0c\x1d\xc4\xc1\x25\xe0\x54\x23\xf6\xf5\x6e\x22\xb9\x5c\x95\xb7\xa3\xc6\x04\x92\xe0\x4f\xe5\xc2\x74\x96\x82\x0f\x5f\x47\x91\xe2\x98\x5f\x6f\x62\xdd\x9d\x41\xc4\x05\x71\x70\x09\x84\x09\x54\xe1\x68\x27\xbe\xa2\x53\x8c\x45\x15\xb1\x72\xed\x98\x89\xb7\x63\x2a\x26\x70\xee\xaa\xe2\xbe\x7d\x61\xf7\x67\xc0\x00\xd4\xf9\x1a\xc4\xc1\x25\x30\x5f\x56\xcf\x23\x77\x49\xe6\xc6\xd5\x63\xc1\x92\x8a\xb7\x78\x1c\xbf\x98\xbc\xd5\xf3\x7e\x54\xa8\xb3\xdc\x79\x70\x97\xed\xbb\x2e\xf4\xaf\x00\xe2\xe0\x12\x88\x7b\x10\xf7\xd1\x13\x8b\x8d\x84\x52\x28\xa8\x6c\x45\xb6\xdb\xa6\x92\xfd\x4d\x5e\xa1\xaf\xc8\x60\xfe\x57\x2d\x3e\xbe\x8d\x27\x1d\x08\x09\x80\x38\xa8\x2d\xcd\xdf\x2b\x30\xa0\x39\xfd\x34\x09\xdc\xd4\x3b\x78\x3a\x63\x1c\x6e\xdb\x76\x7e\xd9\xa5\xea\x4b\x79\x67\x59\x31\xa5\xfc\xcf\x9f\x44\x1d\xd8\x03\x65\x79\x29\xd5\xfc\xc7\x50\xcf\x44\x00\x07\x97\xc0\x23\xee\x49\xd7\xd9\x87\x65\x22\x5f\x72\xd0\x96\xf4\xe8\x84\x92\x1b\x53\xd5\xd3\xba\x6b\x7b\x91\x77\x5c\xf9\x50\xa4\xaf\x6a\x9e\x83\x6e\xce\x00\x38\xb8\x04\x0a\xf9\x88\xcc\xdf\x5a\xbe\xdc\x94\x8f\x6c\x62\xb0\x88\xa9\x11\x79\xcc\xce\x24\x78\x3b\xf5\xad\x5d\xa9\xed\x71\x83\x4a\x95\x0e\xf4\xac\x3e\x88\x83\x4b\xa0\x82\xc9\x42\x73\x2e\xb7\x2b\xa1\x80\x06\xc9\x67\x9d\x96\x14\xdf\x68\x2a\x10\xcf\xdc\xd3\x24\xe3\xfe\xce\xb3\xfd\xd8\x3b\xf8\xca\x88\xb8\x20\x0e\x2e\x01\xc3\x36\x83\x8b\x34\x6b\xd8\x5b\xa8\xc6\x89\xd3\x2d\xe8\x8b\xc6\x31\x95\x8d\xd1\x54\x64\xe3\x0f\xa9\x2a\x54\x6b\xa3\x71\x3a\x33\x11\xab\x6e\x10\x07\xb5\xa3\x00\x54\x60\x40\x09\xf6\x34\x0d\xf8\x3c\xde\x0d\x21\x14\xc0\x6c\xe8\x37\xbf\x4f\x65\x6b\x43\xf7\x7e\xbc\xf0\x46\x6e\xe0\xd6\x9b\xa2\x0f\x7e\x38\x68\x2b\xc1\xa3\x21\x88\xb1\x83\xb8\x13\x1a\x90\xbd\x18\xce\x50\x70\x38\x7d\x9f\xf1\x1b\x75\xb0\x01\xfd\x37\x1f\x16\x5b\xfb\x0b\xdc\x15\xcb\xb4\x38\x2a\x03\x5c\x1b\x48\xd0\x37\x05\x71\x70\x0d\x28\x8b\xd4\x30\xa0\xb4\x7b\xe4\xa1\x5d\x5e\x2b\x0d\x34\x49\x11\x9a\x50\xae\x7f\xc5\xc9\x6d\x4d\x67\x4c\x55\x27\x65\x55\x78\x08\xdd\x9c\x01\x71\x70\x0d\x48\x8a\xed\xdd\x31\xa3\xe6\x6e\xa7\xe9\x5e\x51\xd5\x78\x84\x6e\xaf\xc5\xdc\x27\xbf\x90\x8b\xb6\xaf\x92\xe1\xf6\xf4\x48\x47\x02\x7a\xac\x0c\xc4\xc1\x35\x20\x46\xb2\x65\x1a\xf6\xda\xb0\xbb\x3d\xc4\xed\x52\x38\xa3\xc9\xbd\xe3\x25\xf7\x4d\x7a\xbe\xe7\xcf\x15\x8e\x5b\x7a\xe6\xf2\x36\x93\x11\x1a\x00\x71\x50\x3b\x0a\x40\x05\x06\xb4\xda\x39\x4d\x03\xb2\x65\x3a\x89\x9d\x7c\x9a\x79\xae\xd5\xbd\x37\x86\x76\xf2\x23\x6e\x06\xce\xa9\x9a\x37\xe3\xa7\x6f\xf0\xea\x37\x37\xab\xe0\x43\x07\xa7\x40\x1c\x5c\x03\xf8\x1c\x53\xa8\xdc\xa8\x98\x4d\xe3\x7c\x69\xfe\xac\x63\xe9\x68\x55\x65\xf9\xdd\x4f\xf3\xa9\x64\xcc\x6e\x8a\x95\xcb\xad\xf0\xc9\x20\xe2\x82\x38\xb8\x06\xea\x15\xab\xf9\xed\x84\x7e\x7d\xb3\xf8\xaa\xa6\x2f\x5b\x23\x72\x49\x32\x3d\x65\xb5\x4d\x70\xdf\xd8\x3d\x8e\x70\x15\xe3\x4d\x35\xf4\x6a\x25\x88\x83\x6b\x20\xc6\x5a\xde\x20\x59\x25\x74\xaa\xdd\xd9\xb6\x6c\x1b\x65\x3d\xc4\x6e\xa2\x51\x04\xdb\x58\x5d\x0c\x9d\x77\xcf\x14\xaf\xb4\x12\x15\x11\x17\xc4\xc1\x35\x50\x72\x81\x68\xb1\x51\xfc\x40\x3f\x2b\xf6\x4d\x22\xcb\x5b\xb5\xc9\xcc\x97\x71\xc3\x3b\xb4\x92\x47\x4d\xfa\xa1\x61\x97\x8e\x2a\xae\x20\x34\x00\xe2\xa0\x79\x00\x50\x81\x01\x2d\x3d\x4f\xd3\x80\x1a\x87\x1d\xdf\x9d\x88\xd4\x64\xcd\x01\xc5\x91\xe9\xca\x9b\x4f\xad\x52\xa5\xe4\x63\xa9\x77\x36\x33\xb0\xc3\xa6\x86\x83\xeb\x13\x11\x63\x07\x71\x70\x0d\xa8\xfe\x94\x53\x1c\xac\xf7\x53\xbc\x13\x90\x6b\xab\xe6\x9f\x5d\x61\x4e\xd3\x7b\x6e\x70\x67\xd8\x2a\x81\x3c\xe9\x56\x8d\x65\xb0\x38\xd4\xf7\x1b\xc0\xc1\x35\x30\x9a\x37\xec\xd6\x88\x15\x32\xd1\xd0\x77\xe3\x3c\x2f\xdd\xdd\x95\x9c\xe7\x7e\x8d\xfc\x7e\x2d\x97\x0b\x2a\x19\x24\x67\xa5\x2c\xa1\x8a\x11\x88\x83\x6b\xe0\x85\x2c\xfd\x53\x13\x8a\x6a\xad\x82\x21\x82\xb0\xbb\xfb\x75\xd7\xac\xb8\x8d\xc7\x5a\xd8\xc2\x4d\xea\x08\xfa\x1f\xfb\x60\x2b\x40\x0f\x55\x81\x38\xb8\x06\x02\x48\x69\x89\x1d\x31\xc5\x0e\x98\x3e\xd4\x18\x4e\x61\xfa\xcf\xdc\x8c\x7d\xee\xd6\x74\xb1\xd5\xc9\x63\xe4\x8b\x28\x12\x87\x83\x3f\x54\x85\x03\x70\xd0\x3c\x00\xa8\xc0\x80\xdc\xfb\xe9\x15\x18\xa3\xb1\xa0\x98\x8a\x2e\x07\x3b\xfd\x39\x7e\xf7\x07\x9a\xcb\xbf\xb7\x77\x2a\xf2\x31\x08\xa6\xa5\x29\xbe\xbf\x7a\xda\x6c\xc0\x21\x8f\xa8\x66\x80\xb8\x93\x15\x98\x9d\xf2\x1b\x78\xed\x7b\x3a\xdf\xe8\x09\xfb\xca\xe6\xf1\x18\xef\xdd\xea\x11\x95\x17\xab\xfe\x38\x64\xd4\xb9\x2b\x6d\x7a\x71\x36\x14\x11\x19\xc4\x9d\xac\xc0\xc4\x06\xd6\x93\xc4\x7e\x40\x4f\x0a\xf9\x66\x8a\x4f\xd6\x10\x17\x17\x6a\x7e\x70\x81\x59\x21\xd4\xa8\x36\xb6\x5f\x58\xa1\x4c\x70\x1f\x6a\xa5\x03\xe0\xfe\xdb\x3c\xe6\x1f\xd5\x73\xf4\x76\x1e\xf9\x91\xa0\xc5\xbd\xdf\xe8\x58\xe6\xa2\x16\x84\xde\x55\xe3\x33\x6d\x03\x77\xec\xfa\xdb\x79\xd8\x1a\x59\xdd\xca\xa0\x0a\x4c\x0a\x35\x25\xbb\xab\xbe\xc4\x73\xb7\xa1\x2b\x3c\x5f\x95\xfd\xae\xe3\x10\xae\xdd\x7c\xa0\x39\x45\xe5\x10\x71\xcf\xde\x2c\x39\x5d\xe4\xcf\x0a\x0c\x7f\x86\x6d\xd3\xad\x73\x84\x0a\x18\xf6\x17\xe7\x75\x58\xc2\xae\x70\x1f\xbc\xbf\x8b\x5a\x8c\xee\x2e\xcc\x99\x13\xb3\x87\x34\xfd\x67\x6f\x56\xf1\x70\xe3\x4d\x92\x47\xfc\xbe\x1d\xea\x92\xcb\xe8\x51\x63\x29\xbc\xe2\x25\xfb\xef\x64\xde\xdb\x4b\xcd\xea\xda\xa7\xb3\x11\x6d\x48\x48\x60\x60\xfc\x1b\x2a\x30\xfe\x17\xfe\x6f\x43\x0b\x3e\x8f\x74\x21\x48\x92\xca\x3f\x24\x4a\xda\xff\x44\x05\x46\x87\x8c\x25\x29\xf6\x62\x27\xda\xd3\xb2\xa3\xe6\x18\xb3\xf3\x54\xbe\x52\x18\xdf\xea\x2a\x15\x99\xf0\xaf\x9a\x29\x53\x16\x3b\x9e\x45\xab\x5c\x69\x24\x55\xf8\x4f\x2d\xb1\x09\xb4\x10\xd6\x52\x17\x8b\xbb\xf9\xab\x28\xaa\x5c\x4b\x6b\x80\xe5\xb3\x9c\x37\x9b\x37\xaa\xe7\x14\xf1\xc0\x6b\xcd\xda\x87\x67\x72\x3c\xe3\x64\x05\x86\xb9\xc9\x9a\xfe\xd9\xd5\x92\x34\x19\xa3\x15\x05\xca\xd5\x44\x74\x6d\x36\xb3\x22\xdb\x90\xdd\xdc\x63\x96\x19\x25\xb1\xca\x74\xba\x33\x39\x8c\xa2\x7d\xe2\xc7\xfa\x8b\x94\xda\xfc\x1a\x79\x34\xb1\x1d\x54\xa9\x7a\xee\x1b\x3a\x53\xd8\x1a\xd9\xc1\x5b\xbf\x78\xbd\x79\x49\x8d\x97\xca\x73\x4c\x0d\x67\x32\xda\x93\x15\x18\xa2\x72\x83\xe3\x06\x24\x06\xd6\xf8\x45\x53\xe3\x8d\x2d\xc5\xc3\x41\x45\x7e\x9f\xf8\xe3\x97\x6c\x43\x77\xef\xd6\x56\x78\x46\xe0\x9c\x59\x29\x04\xa4\xa1\xd3\x12\xdf\x75\x9b\xfe\x87\x64\xf3\xe2\x15\x4b\x78\x4f\x42\xed\x13\x07\x4a\x16\x4b\x98\x1a\x77\xaa\xeb\xcf\x29\x45\xc4\xd1\x29\x8a\x87\xee\x21\x26\x7c\x10\x07\x4f\x7c\xce\x2a\xc8\x25\xad\x9e\xd4\x2c\xe6\x1c\xd2\xcd\x4e\x93\x7a\xa5\x1f\x4a\x9d\x49\x7d\x47\xf9\x62\xb2\x48\x06\x0f\x1a\x6e\x3b\x43\x2f\x9f\x82\x38\x78\xe2\xdb\x72\x3b\x97\x35\x42\xe1\x74\x79\xfd\xf8\xd2\x41\xab\xd6\xb3\x84\xa2\xbc\xfb\x66\xeb\x01\x6f\x43\x9e\xf0\x8f\x3e\x5b\x11\x71\xc1\x41\xc4\x05\x71\xf0\xc4\xb7\x4e\x40\x74\x27\x41\xbd\x7e\x83\x9a\x73\x5f\x54\x5b\x9c\x3c\xa1\x50\xa4\xbc\xa7\x90\xef\x3b\x8b\xff\xcf\xf7\x1c\xd5\x6c\x6b\xd0\x76\x3c\x88\x83\x7f\x87\xdd\x91\x4e\xd9\xfa\xc2\x45\xd1\xd8\x4e\x7a\xba\x1e\xb9\x8c\x22\xc1\x64\xe7\x73\xcd\x5e\xd6\x16\xbd\xbb\x7a\xab\xf8\xaf\x79\x3b\x11\x3e\x18\xc4\x21\xba\x7d\xf8\xff\xbd\x14\x02\xfa\x87\x3e\x4d\x02\xea\x3f\x8f\xa5\x27\x14\xc5\xb2\x22\x77\xee\xbd\x08\x6b\x5d\xe8\xd8\xfe\x9d\x12\x45\xdd\xe6\xf7\x14\x9d\xf7\x4b\x56\x25\xae\x13\x54\xb2\x00\x71\xf0\xa1\xbf\xed\x17\xf1\xf1\x67\xed\xc5\xb1\x8a\xaf\xbe\xea\xc2\xf5\x43\x2f\x13\x3b\xfc\x8b\xf9\x9a\xc3\x60\xff\xab\x54\x25\xed\xaa\x00\xe8\x24\x02\x88\x83\x4b\x60\xc7\x28\x4c\x39\x23\x5f\x4a\xea\x93\xa2\xa5\xc1\xb6\x35\x6d\xf3\x57\x7e\x1e\x9b\x39\x6c\x9a\x99\x06\xc7\xe2\xe4\x71\xa2\xf3\xd0\x1b\x2d\x20\x0e\x2e\x01\x1d\x83\x29\xbb\x8c\xfc\x95\xb0\x8f\x06\x9e\x34\x52\xd7\x02\x6d\xe3\x77\xb8\x4a\x8b\x32\xae\x84\xdb\x1d\xea\xcc\x14\xf2\x8a\x41\x37\xde\x40\x1c\xfc\x3b\xf0\xd6\xcb\xa5\xd5\x5e\x89\x4e\xec\xff\xd6\x30\xea\x4d\xdf\xcc\x94\xe6\x78\xfd\x3e\x65\xfe\x60\xae\x05\x8d\x72\x70\x71\xee\x2f\x65\x84\x04\x40\x1c\xd4\xf0\x45\xf5\xaf\x12\x00\x4d\xae\xa7\x6e\x42\xfb\x16\x50\x59\x44\x5b\xfa\x13\xfd\x24\xf1\x31\x8f\x88\x25\xf0\x7a\x93\xf8\x46\x20\x46\x6f\xf1\xa7\xd9\x41\x00\xe6\xb5\xca\x3b\xd0\x26\x34\x80\x83\x0f\xfd\xf3\x65\xfe\x72\x01\x3f\xab\x04\xc9\x5c\x5e\x27\x7e\xbe\x5d\xfc\x74\x0d\xe4\x0a\xf3\x44\x93\x0b\x1c\x8a\x6d\x19\xc2\x3f\xd1\xa1\x33\xe3\x20\x0e\x2e\x01\x6d\x2f\x62\xfa\xf8\xde\x2f\xbf\xa2\xc3\xcb\x7c\xbc\x92\x13\x47\x92\x6f\xdf\x3c\x4e\xb4\x7e\xfd\x5b\x7d\xb0\x82\xa4\x34\x18\xbb\x00\x11\x17\xc4\xc1\x25\x10\xb0\x27\x5d\xf0\x45\x83\x75\x77\x54\xa3\x4b\x85\xb0\xb4\x91\xd0\xf5\xeb\x76\x43\x40\x14\x4d\x70\x28\xff\xaf\x01\x82\x6f\xc4\x50\xbb\x72\x10\x07\xff\x0e\xd3\x87\xcc\x89\x6e\x49\x16\x75\x52\x23\xc9\x58\x9d\x8a\x6f\x95\xcd\x24\x1c\xa3\xca\x8f\x8d\x2f\x0d\xf7\x75\xb9\x07\xe4\xb1\x9b\x23\x96\xbf\x20\x0e\x6a\xf4\x00\x28\x85\x80\x32\xdd\x69\x1a\x58\x1f\xb9\xa6\x46\x89\x2e\x7e\xf4\x9e\xec\x81\xa4\x87\x5c\xa9\xe0\xc5\x44\x81\x51\xea\x42\xca\x08\xf9\x83\xbb\x1d\x3b\xda\x83\xc1\xd0\x0c\x08\xe0\xe0\x63\x77\xab\xc9\x3e\x77\xf9\xdb\x0d\x7b\xbd\xf5\x28\xe1\x55\x7d\x91\x59\x61\xc1\x56\x96\x4f\x3e\xd8\x63\xd5\x9d\xb7\xb7\x36\x44\xb1\xa0\xc3\x1d\x20\x0e\xae\x01\x3e\xb5\xe7\x0e\x35\xef\x8a\xef\x44\xda\x59\x5b\x5c\x29\x77\x47\xa3\x76\x6f\x91\x7c\x79\x1d\x75\xd2\x24\x53\x83\x8b\x4b\x63\xe3\x31\x22\x2e\x88\x83\x6b\xe0\x4e\x63\xf1\x87\x26\xa3\x51\x0d\x03\x8d\xc6\xce\xf6\x52\xf7\x32\x1d\xa6\xd0\xc4\x47\x55\x6f\xcb\x0d\xf0\xc4\xb6\xea\xdf\x17\x43\xcf\x80\x81\x38\xf8\x77\xd0\x69\x7f\x49\x23\x74\x14\x6b\xc0\xfa\x9a\x5f\x3a\xe6\x4a\xe7\x03\xd1\xdf\xb9\x5d\x7d\x87\x5e\xc6\xb7\x43\xf5\xa6\x22\x91\x05\xf9\x10\x1a\x00\x71\x50\xa3\x07\xed\xbf\x6b\x00\xb4\xec\x38\x4d\x03\x2b\x5b\x5f\x71\x57\x8b\xef\xa5\x8b\x85\x07\x87\xc9\x73\x3c\x5c\xd8\x42\x5a\x12\xdf\x31\x13\xe6\xf2\x39\x08\xb0\x93\x7b\xa9\x02\x1d\xc2\x00\x71\xf0\xb1\x6f\x3a\x5e\x14\xa0\x26\x7a\x1d\x43\x1e\x68\xf6\x5c\x7d\x75\xdd\x0d\x79\x02\x43\x50\xb6\xa0\xac\x1c\x29\x87\x84\xf0\xd7\x08\x39\x34\x65\x83\x38\xb8\x06\xd4\xc7\xa4\xec\xbe\x3c\xdc\x74\xee\xa2\x2a\x90\xed\x0d\xc8\xf8\xed\xc7\x14\x3e\x97\x1c\x87\xa6\xd0\x50\x74\x10\x3c\x34\x1d\xd2\x0a\xa5\x2e\x00\x07\xd7\x80\x0f\xad\x34\xd9\x55\x3e\xda\x24\xb2\x7e\x42\xd4\xbb\x93\x22\xe1\x48\xc1\xc5\x32\x4b\xc1\x0e\x51\x13\x6c\x96\xd6\xec\x13\xdf\xa0\xab\xaf\x20\x0e\xfe\x1d\xd6\x4b\x1a\x93\xd5\x3b\xcc\xad\x2e\x89\xd1\x04\x2d\x5f\x21\x27\x0b\xf4\xdd\xf2\xce\x0f\xd5\xed\x2f\x5e\x77\x8d\xeb\xa0\x6a\xae\x47\x68\x00\xc4\x41\xf3\xc0\xff\x56\x0a\xb9\xf5\x7f\xb3\x50\xa7\xdb\x60\xea\x5b\x68\x4c\xe7\x66\xda\x4b\xc8\xa8\xbb\x74\x54\x1e\x6d\x31\x3f\xcf\x52\x89\xc5\xbe\xd9\xca\xb6\xbe\xa1\x43\xbd\x5f\x15\x10\x85\xb0\x94\x20\xee\x94\x83\x08\x42\x2e\xcc\xbe\x8f\xc6\x4a\x8b\xc8\x28\x6b\xf7\x59\xa6\x04\x0e\x4a\x50\x8b\x98\xac\x3e\x7f\x8d\xef\xfd\xba\x2d\xdf\xf8\x1e\x7a\xa5\x18\xc4\x9d\xb4\xc1\xb2\xd5\x3e\xbc\xae\xcf\x84\x6c\xaf\x5c\x8f\x1a\xb3\x4c\x10\xd2\x23\x6e\x6e\xd6\xe2\xce\x78\x62\xaf\xb6\xfd\x71\xe5\xe9\x26\x16\x0e\x22\x32\x88\x3b\x19\x39\xd9\x58\xec\x86\x41\x15\xab\xd3\x3e\xb3\x21\xce\x78\xde\xca\x5d\x9e\x92\x4b\x19\xb1\x57\x46\x75\x46\x8b\xcd\xf3\x67\x1f\xbe\x67\x45\xdc\x1d\x01\x71\x41\x32\x48\x48\xff\xf9\xab\x49\xbe\x41\xf8\x66\xb4\x7a\xd6\xaa\x09\xac\x17\x12\xd3\x0e\x73\x17\xe5\xd3\x04\x42\xb6\x97\x79\xf8\x47\x55\x33\xf0\x9c\xb8\xc6\x8d\x74\x3d\x4a\xff\xe1\x9b\x67\x6f\x24\xed\xbc\x70\x27\x35\x8b\xcc\xae\xf8\x42\x14\x64\xee\xfd\x81\xcd\x7a\x4b\xeb\xce\xfd\xcb\x85\xe7\x5c\x02\x50\xc8\x3e\xfd\xd9\x83\x40\x60\x8f\x57\xfb\xbe\xca\x38\xd7\xe6\x81\xae\xad\x93\x53\xdd\x57\x75\xe3\x3b\x87\x01\xbf\x5d\xef\x69\x91\xe3\x7e\x16\xd8\x95\xaf\xfb\xb7\xf9\x66\xd0\xd0\xfe\xf0\xcd\x4d\x27\x7c\xb3\xdd\xd4\xbb\xfc\x3a\x49\xa3\xc8\xcf\x86\x66\x8f\xee\x0c\x8a\x8e\xf5\x9e\xfb\xb6\x34\x3b\x48\x43\xce\x5b\x28\x58\xee\x9a\x38\xb0\x76\x16\xbe\x59\xe2\x84\x6f\x16\x5d\x1f\x7f\xd3\x40\x12\x7f\xac\xe1\xc5\x75\xcf\xb7\x3b\x35\x39\xc7\x42\xa9\x65\x32\xff\xaa\xf9\xa4\x66\xf0\x87\xad\xa3\xc7\xa6\x67\xb2\xa9\x7e\xd2\x37\x77\xb5\x72\xfc\x2a\xa0\xbf\xed\x38\xd6\x66\x78\xde\x07\x67\xaa\xb2\xd0\x2c\xac\x88\x51\xa4\xeb\x5b\xbb\x68\x44\x97\xee\x2c\xf7\x8b\x33\x39\x42\x70\xd2\x37\x5f\x27\x9b\x62\xaa\xbe\x7d\xd0\x52\x8c\x5c\x13\x63\xc2\xb2\xff\xe8\xe0\xc2\x31\xa1\x31\x33\x43\x95\x7a\xec\x08\xb9\xca\x8f\xad\x9d\x33\x19\xed\x49\xdf\x9c\xa3\x92\xcc\x58\xae\x94\x18\xca\x9a\xd6\x6a\xbd\x75\x93\xf4\xdb\x79\x87\x6c\x0c\xa3\x2b\x3b\x5b\x79\xbc\x8f\xcd\x24\x5a\xce\x5d\x3f\x33\xdf\x0c\xd2\xd0\x69\x99\xb2\x71\x42\x2f\x38\x2f\xae\xf6\x72\xda\xb7\x57\xcc\x77\x36\x50\x76\x7f\x21\x97\xda\x48\x5d\xa0\x75\x8f\xf0\xc0\xec\x12\xa9\x96\xab\x41\x64\x08\x10\x07\xcf\x10\xca\x53\x4e\x3e\x96\xb2\x1f\x16\x0b\x79\x02\xf1\xd2\x6d\x7c\xab\x71\xa2\x23\xcf\xdb\x60\x17\x60\x3f\x6f\xbc\xc2\xd4\xb4\x1b\xf6\x09\xda\xe0\x01\x70\xf0\x4c\x99\xd7\x5b\x7f\x63\x99\x8d\x30\xa1\x34\xff\x65\x44\x39\xae\x6f\x94\xbe\x94\xc6\x95\x43\x83\x99\x10\xa7\xa9\xd8\xf2\x35\x77\xbf\x16\x44\x5c\x10\x07\xcf\x94\xec\xc6\x7d\x32\xeb\x6c\x53\x17\xce\x5b\x26\x3c\xf1\x90\xe5\x09\x19\x23\xec\xaa\xa3\x19\xcc\x38\x3a\xe4\x18\x33\xbf\xe1\xf2\xd0\x13\x11\x17\xc4\x05\x49\x21\xa1\xfd\x19\x57\xfa\xf3\xdc\xdd\xd4\x4c\xfd\xa8\x80\x9c\xaa\xf7\x2e\xf9\x48\x42\x86\x6b\x33\xdc\xcf\xe2\x68\x1d\x69\x57\x5f\x1e\x86\x30\xaf\x3d\x43\x98\x26\x10\x87\x68\xba\xd0\xf4\x77\xdf\x0c\xfa\x87\x3e\x4d\x02\x95\x28\xc7\x6f\x75\x1a\xdf\xb6\x3a\x2b\x60\x97\x11\x11\x21\x7b\x6f\x28\xd2\x5c\x55\xff\x98\x6e\x99\x53\xe1\x7a\x63\xea\xaa\x4b\x2f\x62\xe8\x20\x0e\x2e\x81\x80\xe0\xa5\x86\xec\x9b\xd5\x15\x7a\xa2\xed\xf3\xf9\x43\xb7\x86\xba\xed\x65\x0b\xbc\xab\xbc\x7f\x1c\xe8\xac\x19\x76\xbd\x57\x85\xf6\x24\x41\x1c\x5c\x02\x0d\xba\xc5\x0b\xd7\x4d\x08\xbf\x61\xc5\x3c\x21\x98\xe1\xb9\x9b\x46\x8d\x31\xd7\x7b\x55\x8f\xac\x54\x85\xd8\xd7\xf5\xfb\x5b\x32\x1a\x44\x5c\x10\x07\x97\xc0\x53\x37\x91\xca\xc6\x66\xd4\x72\xc3\x8e\x81\x63\x7f\xba\xe5\x60\x73\x37\xbf\x08\xb2\x64\x81\xf8\x12\xc5\x2f\xf9\x47\xbf\x57\x19\x11\x71\x41\x1c\x5c\x02\xf5\x84\x8f\x2f\x9b\x9d\x9f\xf4\x61\x46\xcf\x8e\x56\x5a\xf9\x74\xa5\x10\x8b\x25\x11\xdf\x69\x60\xae\x86\xf2\x3c\x7e\x4d\x48\x6f\x06\x42\x02\x20\x0e\xea\xbb\xf1\x77\xdf\x0c\x9a\x5c\x4f\xf5\xcd\xab\x7d\xba\x31\x53\xab\x8f\x3e\x95\x48\x9a\x34\x23\x65\x12\xdb\x05\xfa\x3a\x6a\x09\x27\xf6\x1e\x34\x9d\x0b\xb1\xe1\xc2\x85\x5e\x35\x01\x71\x70\x09\xfc\x60\xd4\xd9\xa6\x23\xb1\xd3\x6c\xf4\x5c\x3f\x40\x09\x21\x5f\x7e\x72\xf5\xfa\x0f\x51\xac\x8f\xb4\xe7\x47\x04\x0a\x9e\x73\x8f\x11\x23\xe2\x82\x38\xb8\x04\xa4\xe3\x8e\x5f\x8f\xa6\x8a\xfc\xee\xdf\x2b\xa9\xc9\x2e\x44\x16\x17\x78\xf1\x66\x36\x13\xc7\x26\x61\xec\xb7\xab\xd8\x41\xb7\x06\x74\xda\x03\xc4\xc1\x25\xe0\x9c\x12\x22\x51\x47\xeb\x60\xd2\xc5\x22\x63\x37\x36\x7d\xd7\xc0\xf3\x25\x9d\x19\x7d\x30\xd9\x0f\x83\xc9\xe9\xec\x95\x16\x8f\x2c\xa8\xda\x07\xe0\xe0\x12\x08\x13\x09\x4c\x2e\x7b\x19\x72\xad\x7d\xe3\x77\x04\x17\xf9\xc3\x98\x5d\x8e\x9c\xad\xac\x5b\xcf\x50\x28\xd1\x6e\xe5\x2b\x7e\x3e\x28\x43\xac\x97\x41\x1c\x74\xdf\x1e\xe0\x9b\x41\x99\xee\x34\x0d\x14\x3d\xc7\xba\xde\x3c\x72\x0d\x6d\xe4\xb9\x42\x2a\x5f\x94\x8b\xc2\xe5\xf8\xcc\x26\xd6\x27\xbc\xfd\xf9\x0a\x93\x21\xc7\x1c\x22\xed\x88\xb1\x83\x38\xb8\x06\xe2\x50\x33\xb8\x9e\x7d\x94\x64\xaa\x51\x5f\x92\x5b\xcb\x25\xb0\xc4\xc6\xe4\x2c\xa6\x9d\xc4\xcc\x8d\x41\xdd\xa9\xfb\xb9\x35\x3c\x07\x35\x34\x05\x70\x70\x0d\x44\x48\x64\x78\x11\xb7\xbd\xbf\x7a\x9d\xc5\xed\xf9\xec\x05\x9a\x7a\xa4\x02\xbe\xa4\xbb\x44\xef\xd6\x44\x6d\x7f\x3e\x61\x0f\x25\x77\x41\xc4\x05\x71\x70\x0d\xf8\xb2\x0f\xc8\xe7\xfa\xe0\x8d\xe3\x5c\xd1\xa8\x1d\x2b\x17\x99\xb6\x40\x23\x5d\x53\x1c\x4a\x22\x1d\xf4\xd3\x47\x4a\xdc\xab\x86\xca\x67\x20\x0e\xae\x81\x6f\xb8\x57\xec\x45\x46\x2e\x16\xfe\x4e\xc3\xa3\xe7\xef\xb9\x29\xfb\x89\xcf\x01\x5f\x45\x89\x3c\xa9\xf9\xda\x77\x2c\x47\xf2\x73\x33\x08\x0d\x80\x38\xe8\xbe\x3d\xc0\x37\x83\x96\x1d\xa7\x69\x20\xe4\xb3\xa6\x8d\x51\xb0\x1c\xaa\x61\xc2\x3d\xe4\x20\xac\x3e\x7f\xe6\x16\x23\xf2\x44\xac\xfc\xd0\x9a\x68\xfb\x90\x82\xb6\x4f\x50\xaf\x68\x10\x07\xd7\xc0\x03\x86\x7c\x94\x1c\xb4\x35\xfe\xa3\x97\x19\xdd\xb2\x6b\xb8\x4c\x39\xf1\x05\x65\xa8\x43\xd6\x0f\x44\xdf\x5b\xfa\xd0\x7f\x92\xa8\x45\xc4\x05\x71\x70\x0d\xac\x5c\xd6\x08\xdf\xa0\x93\xb1\xd7\x76\x47\xc7\x2b\xf5\xb4\xb9\xd3\x38\x69\x8b\x8c\xc2\xfc\xdb\x8e\xc6\xc6\xe7\x2e\x5f\x66\x40\x27\xe4\xf3\x01\x1c\x5c\x03\x74\xe9\xfd\x9d\x76\x45\xd7\x8c\x9b\xce\x3d\x90\x75\x18\x7a\x7a\x39\x2b\x7b\x80\x52\x5c\x5a\xbf\x09\xe3\xfa\x77\xfc\x47\x2f\x2b\x21\x3f\x0e\xe2\xe0\x1a\xc0\x58\xb3\x37\x10\x32\x35\xaf\x2a\x7c\xd8\x25\x24\xa5\xbd\x9b\x38\x35\x7b\xc3\xec\x40\x54\x77\xd0\xf5\x36\xfe\xa5\x83\x31\xbe\x30\x84\x06\x40\x1c\x34\x0f\x00\x7c\x33\xc8\x42\x9d\xee\x9b\xe7\xeb\xeb\xd5\x25\x9c\xc2\x56\x86\x26\xbd\x63\x7c\x16\x49\x07\x63\xf5\x3b\x52\x7a\xcb\x12\x78\x5f\x3d\xd1\xe7\x28\x40\xfe\x70\x15\xe1\x41\x41\xdc\x29\xcf\xd0\x46\x6f\xec\x4c\xb6\x5c\x0c\x50\x21\xa0\x94\x12\x2a\x16\xb9\xa4\xeb\x64\xc2\x1f\xbf\x7d\x0f\xe5\x4e\xc1\x50\x9a\x79\xdf\x04\x33\xf4\x0c\x2d\x80\x3b\xe9\x6e\x29\x1c\x1b\xba\xef\xea\xed\x60\x60\xa8\x94\x61\x4f\xe3\x7e\xa0\xf8\x7e\x5b\x64\xc9\x41\xc9\xe2\x95\x6d\x4b\x21\xf5\x7a\x7f\xe4\x32\x22\x32\x88\xfb\xef\x63\xb1\x7f\x46\xf6\x7c\x93\x21\x5d\xfb\xfc\x9c\xd4\xb2\x08\x8e\xc9\xcd\x22\xde\x4b\x7b\x7a\xf8\x13\x0a\x96\xcf\x45\x7b\x82\x7f\xc8\x7f\xcf\xc3\x59\x43\xf8\x66\x10\xf7\x1f\xdf\x7c\xee\x1f\xbe\x79\xff\x42\xec\xf0\x91\xed\x5d\x96\xaf\x97\xf2\x59\xcb\xbc\x25\xd8\x7a\x49\x5a\xe4\xbc\x6d\xc4\x55\xac\x53\x87\xde\xba\xce\x3d\x46\xfe\xd3\x37\x9f\x4f\xc7\xe4\x78\x38\x64\x17\x32\xcc\x59\x17\xaa\x57\xf1\x40\x8e\x94\x79\xb8\x88\x6e\xe2\x52\x6b\x76\xf7\xa3\xba\xf3\x39\xd8\xf7\xff\x40\x49\x24\x14\x44\xdb\x97\xc5\x4c\xb0\x94\x43\x1e\x85\x44\x32\xab\x63\xfa\x72\x2a\xad\x98\xdd\x31\x0c\x7b\x59\x36\xc9\x7f\xb0\x7b\xeb\xdf\xe6\x9b\x41\x43\xfb\xc3\x37\x23\x49\xc3\xcd\x55\xd1\x27\xbb\x5d\x52\x75\xe4\x57\xe4\xd2\xa4\xe8\x59\xa5\x6b\xb7\x7b\x6e\xcf\x4d\x96\x5c\xb8\x48\x9d\xb4\x46\x82\x2d\x73\x95\x8a\xe3\x2c\x7c\xb3\xff\x09\xdf\x4c\x15\x4d\x1b\x87\xad\x42\xb3\xd9\x5a\xae\xf1\x3a\xc4\x32\x71\x89\x25\x5e\x91\xca\xd2\x90\xcb\x0c\x89\xc5\xec\x89\x27\xfe\x45\xe5\x33\xd9\xf8\x15\x3a\xe1\x24\x7f\xef\x26\x54\xbf\xb1\x22\x93\xbe\x5d\x87\xd4\x7f\xb5\xbd\xf4\xea\x82\x20\x76\xca\xbb\x6c\x8b\x05\x21\xff\xfa\x98\x19\xe1\x09\xaf\x33\xd9\xf8\x3d\xe9\x9b\xc3\x51\x55\x0d\x48\x46\x87\xfd\x98\x3f\x68\xd1\x21\x3d\xc5\x4e\x67\x4b\xdd\xf3\x75\x5d\x6b\x69\xf2\xbd\xe2\xa2\xfb\x31\xdb\xd1\xe6\x4c\x46\xeb\x7c\xe2\xc7\x0e\x1a\x5d\x27\xff\x25\xe4\x9f\xe3\x65\xc2\xa8\x42\x66\xcc\x21\x3f\xeb\xcb\x21\xa2\xc6\x92\xed\x18\xd8\x21\x96\xb7\xd8\x6c\x3b\x71\x66\xbe\x19\xa4\xa1\xd3\x32\xe5\xa6\x6a\xe1\xd5\x15\xc9\x87\xfa\x36\xec\xaf\x39\xb3\x8e\x18\x3c\xea\x30\x55\x2b\xdd\xae\x7c\xce\x0f\x73\x94\x68\x64\x4c\x19\x83\xf6\x59\x41\x1c\x3c\x53\xd6\x59\x12\x46\xd6\xb1\x75\xf6\xff\x2e\xe5\x89\x31\xf9\xb8\xcd\xc8\xea\x50\x8e\xf9\x6d\x4c\x88\x09\x2f\x03\x6d\x98\xdf\x01\x25\x1d\x11\x17\xc4\xc1\x33\x65\xfb\x07\xce\xfa\xc7\xe8\x4e\x2c\x95\x56\xb8\x9f\x5f\x56\x71\x8a\x7e\x57\xbd\x96\xa6\xeb\x99\x9b\xb0\x7b\x83\x1f\xcb\xe1\x87\x63\x3d\x22\x2e\x88\x83\x67\xca\x49\x6e\xf2\x8c\x4e\x11\xe3\x04\xd1\x07\x73\x69\xad\x6a\xd7\x28\xf8\xe5\x5f\x3a\x79\x9d\xab\x9e\x0c\xcc\x64\xc1\x96\x4f\x7d\x6e\x01\x5d\xff\x06\x70\x41\x52\x48\x12\x7f\xc6\xfd\xf4\xb9\xe9\xcb\xc5\xc2\xb0\x37\x8b\x04\xb4\x9f\x98\xe6\x16\x0c\xba\xe8\x34\xfb\x64\x45\xa3\x22\xeb\xa5\x8f\xc9\x42\x47\xd8\xad\x11\xa6\x09\xc4\x41\xcd\x0f\xa4\xff\xba\x58\x02\xfd\x43\x9f\x26\x01\xea\xee\xc5\x28\xed\x85\xac\xbb\xf7\x51\x7e\xf3\xda\xdf\x7b\x2a\x43\xb4\xf6\xea\xf3\x62\x71\xcc\xa6\xec\x3d\x95\xf1\xb4\xc6\x5b\x50\x83\x2a\x10\x07\x97\x00\x41\xf5\x53\x1b\xb4\xfc\xf5\xec\x9f\x35\x83\x96\xae\x7a\x6c\x73\xca\x9a\x16\x3d\x55\xd5\x05\x8f\x58\xec\x54\x39\xf8\x2f\x95\x04\x40\x0d\xe5\x00\x1c\x5c\x02\xd7\x79\x0a\x8b\xe5\x6a\xe7\x84\xd6\x4a\xf4\xa8\x93\x26\x5f\xe6\xda\x95\xef\xa2\xa7\xdc\x4a\x8f\x5f\xbc\xd2\xaf\x69\xfd\x34\x4d\x08\x3a\x22\x01\xe0\xe0\x12\x60\x4c\x38\x32\x72\x3e\xa4\x22\x8e\xbd\x14\x16\x65\xad\xd5\xcf\xf5\x9d\x21\xd9\x05\x0b\xbf\x83\xbc\x13\x99\xd7\x57\xf4\x35\xf3\x16\x74\xeb\x13\xc0\xc1\x25\xc0\xdd\x2b\xde\x74\xad\xf8\x07\xa5\xc0\x0a\xef\xfd\x64\x3c\x35\x6d\x97\xa4\xa4\xcb\x44\x1d\x9a\xaa\xe6\x63\x25\xd1\x09\x99\x13\xe4\x08\x09\x80\x38\xa8\xf9\xc1\xdf\x7d\x33\x68\x72\x3d\xb5\x65\xe9\xed\x2f\xdd\x36\xb8\x82\xe1\x2b\x71\x5d\x34\xb1\x2c\x1f\xdb\x4c\xe9\x6d\x45\xec\xb6\x4b\x6d\x3f\x23\x23\xdd\xbe\x3d\x1f\x0e\x1d\x5f\x04\x71\x27\x7a\x15\x06\x5f\x17\x30\x7e\xb5\x7c\xe9\x65\x8e\x91\xbe\x5b\x87\x99\xea\xcf\x68\x83\xe0\x9e\xe8\x83\x5b\x15\x18\x9e\x12\x03\xc1\xa4\x4a\x50\xaf\x42\x00\x07\x97\xc0\x95\x7b\x86\x02\xe7\x18\xee\x95\x6d\xb1\x1e\x7c\x88\xd1\x62\xef\x41\xcb\xbc\xfa\xe2\xde\x73\x67\xec\xe8\xdc\x11\xce\x55\x3f\x17\x1e\x44\x5c\x10\x07\x97\x80\xac\x92\x53\x3e\xd5\xbb\x9f\x9c\xd6\xfb\xb3\x5e\x4e\x43\x1d\xb6\x23\x56\xdf\x79\xaa\x23\xfb\x85\x86\xf2\xde\x94\x15\xb7\x22\x9b\x41\x47\x8f\x01\x1c\x5c\x02\xf8\xa2\x33\xe7\xae\x04\x39\x1c\x3d\x5b\x3b\x46\x91\x89\x1b\xc1\xba\x16\x7b\x5f\xd0\xdb\x45\x08\xbd\xd8\x16\x9d\xd5\xac\xfd\xd9\x73\xc4\x7a\x19\xc4\x41\x97\x9e\x85\x00\xc7\xae\x01\x99\xee\x34\x0d\x44\xcf\x0c\x5d\x90\x9a\x9b\xbe\xe6\x58\xe7\x8b\x11\x62\x31\x5b\x12\x35\x82\xef\xe2\x9d\xfa\x1e\x33\xd2\x97\x1e\xef\x6a\x9c\x4b\x2a\xd4\x5e\x16\xc0\x9d\x68\x80\x71\x2b\xfd\xf7\x97\xcb\x37\xbe\x6e\x54\x28\x85\x5a\x8c\xa5\x60\xd4\x91\x87\x0a\x07\x52\x76\xdc\x55\xf0\xf2\xcd\x71\x31\xbb\x07\x5d\x6a\x02\x71\x70\x0d\x84\x14\x33\x19\x3c\x27\x4e\xfc\x71\xe1\xda\x63\x87\x2c\x3b\x89\x1b\x1e\xb3\xdf\xc7\x43\x29\x92\x34\x77\xc7\x08\x9b\x2a\xf8\xac\xa1\x7d\x6c\x10\x07\xd7\x40\x5d\xbc\x66\xdc\xd5\x63\x1b\x5d\xda\x69\x73\xac\x4d\xef\x1e\x5a\xa6\xeb\xec\xd5\x64\xe1\x52\x3f\x28\x5b\xdf\xc9\x8e\x08\x57\x41\x3e\x1f\xc4\xc1\x35\xc0\x51\x42\xb9\x2d\x7b\xd7\xcd\xd1\xea\x78\x2b\x32\xe6\x11\xe3\xf3\xb2\xc8\x7b\x01\xc9\xf4\xbe\xc5\xb4\x24\xe5\x2e\xef\xfc\xcd\x94\x10\x1a\x00\x71\xd0\xa5\x67\x80\x6f\x06\x2d\x3b\x4e\xd3\x40\xd6\xb1\x81\x81\xeb\x0a\xbe\x0f\x35\x97\xa4\x94\x95\xec\x84\x59\xf3\x91\xbf\x38\x5a\xd0\x95\xab\xc4\xcb\x01\x72\xd9\xb7\x23\xa1\xde\xa2\x20\x0e\xae\x81\x24\x61\xf2\x76\x2b\x97\x6f\xf7\xdc\x8d\x35\x87\x1d\xb8\x72\x85\x76\x5f\x16\x31\xac\x46\x3d\x8e\x4a\xce\x24\x4f\x99\x76\x75\xb9\x85\x88\x0b\xe2\xe0\x1a\x40\x52\x96\x74\xe2\xc3\xb1\x33\xb8\x44\xd8\x54\x47\xca\x35\x1a\x7b\x18\xc8\xa3\x61\x82\x13\x91\xf1\x80\x6e\xe0\xc5\x7b\x9a\x21\xa8\x59\x09\x88\x83\x6b\x40\x18\xc3\x2f\x9a\x66\x5d\x73\xcf\xc0\xe1\x15\x12\xcb\xac\x7d\x16\x85\x73\x58\xfe\xaa\x4c\xc4\xd0\x75\x7a\x71\xdf\x51\xe7\xa3\x23\xa8\x0f\x26\x80\x83\x6b\x20\x21\xc0\x60\xad\xce\x2a\xdd\x68\xa1\xaa\x59\x74\x94\x7b\xcb\xf5\x16\xbb\x63\xd5\xa3\x3d\x3f\x2f\xff\xe4\x3b\x24\x3f\x97\x3d\x57\xa1\x5e\x85\x00\x0e\x9a\x07\x9c\xff\xee\x9b\x41\x16\xea\x74\xdf\xcc\x2c\x8e\x6c\x87\xb5\x98\xae\x8f\xef\xaf\x5a\xf9\xfe\xfb\xd0\xb7\x51\x67\xe5\x1b\xa9\x05\x8e\x83\x4e\x9e\xfd\x77\xd8\xbc\x39\xae\x21\x3c\x28\x88\x3b\xe9\x9b\x67\xd6\x02\x9b\xb1\x4a\x8c\xd3\x94\x8b\x14\xbc\x63\x63\x79\x1f\x3f\x9e\x7c\xd0\xba\xda\xf7\xe9\xc2\x77\xdb\x06\xe7\x41\x23\xf6\x3e\xa8\x0b\x22\x80\x3b\xe9\x9b\xd5\x18\x13\x62\x77\x8c\x6b\x88\xfc\x69\x3f\x05\x71\xb4\xdf\x93\x91\x7d\xe2\x19\xd9\x28\xa3\xbd\x98\xfe\xac\x62\xe7\xaa\xe1\x0d\xa8\x57\x21\x88\x3b\xf9\x3b\x1b\x62\xaf\xe8\x4c\xfe\x76\xd1\x71\x5e\x16\xeb\xc2\x88\xdc\x48\x48\xfb\xf8\xce\xc5\x33\xad\x91\xfd\x9e\xc2\x4b\x2c\xa7\xfb\x99\xa2\x08\xdf\x0c\xe2\xfe\xeb\xc8\xff\xf4\xcd\x32\x6b\xab\xb5\x92\x73\x45\x3f\x52\x28\x5f\x0a\x6d\x2d\x47\x0d\xa0\xfe\xb0\x4b\xf1\xff\x90\xf0\x76\xd8\xf1\x7a\xbe\x8b\x6f\x1c\xd5\x9f\xbe\x19\x5d\x80\xe1\x59\x6f\xd6\x3e\x31\xdb\xa3\xce\x44\xd7\x01\xbd\xd9\x80\xc2\x5f\xe8\xcb\xb5\x83\x32\x39\xce\x1e\xd2\xf6\xf1\x4f\x59\xfe\x40\x87\xf5\xd8\x94\x35\xf5\x7e\x0a\x1e\x4c\x14\x72\x8f\xaf\xb4\x7d\xb6\x39\xd7\x98\xff\xea\xf3\x34\xab\xc3\xbe\x29\xa9\x07\xc6\x17\x92\x7f\x9b\x6f\x06\x0d\xed\x0f\xdf\x2c\x71\xc2\x37\x8b\x2b\xa0\x49\xe0\x4e\x8b\x17\x59\x57\x06\x21\x4b\x5e\x41\xd7\x12\xca\xd6\xb4\x66\x48\xfc\xaa\x34\xf4\xa4\x65\xbb\x26\xb6\x3d\xfe\x2c\x7c\x73\xd3\x09\xdf\xec\x9c\xbb\xe8\x78\x28\x69\xf5\x6d\x11\xed\x1c\x87\x85\x8d\x1a\x11\xa3\x36\xfe\x3d\xcc\x77\xaf\xe2\x7d\xb5\x9d\x28\x2d\x9b\x38\x33\xce\x64\xe3\xf7\xa4\x6f\x0e\xf4\x43\x37\x99\xce\x78\xf8\x24\x9c\x25\x67\xc6\x3a\xe4\x47\x7e\x69\x90\x89\x92\x56\xcf\x55\x5f\x54\xf6\x1c\x96\xb8\x0f\x43\x8e\x67\xb2\xf1\x7b\xd2\x37\x07\x14\x89\xb6\xd3\xa5\xbd\x68\xd6\x79\x99\x82\xa5\x2b\x89\xec\x59\x4d\xcf\xb7\xaa\x56\x2d\xf2\xc6\xfc\x67\x60\xca\xd3\xa7\x9b\xf2\x67\x32\xda\x93\xbe\x99\x14\xd7\xbb\x62\x84\x28\xc0\x86\x5b\xcb\x8f\x36\xab\x8f\xdc\x79\xf8\x3c\xbe\x66\x83\xd8\xd4\xd0\xfb\x45\x92\x91\xef\xdc\x6e\x2f\xcf\xcc\x37\x83\x34\x74\x5a\xa6\xcc\x74\x94\x6b\xfe\x66\x78\xab\x93\x3a\xcf\x07\x77\xc0\x7a\x95\xe5\xb8\xa7\x2c\xc0\xa7\x7b\x8b\xa8\xec\x26\x21\xa6\x5a\xca\x26\x74\x39\x0b\xc4\xc1\x33\x65\x84\x73\x39\x71\x37\xcb\x5b\xdf\xaf\xda\x2e\x36\xb4\x62\x5d\x57\x27\x70\x2b\x25\x30\x97\x0d\x97\xc2\x5c\x7b\xe6\xb7\xad\xed\x79\xa1\xdd\x00\x00\x07\xcf\x94\x95\xd6\xc2\x97\x97\xd2\xca\xe5\xb6\x69\x50\x19\xa4\x2b\xed\xb8\x12\x30\xb4\x9f\xd0\x74\xbd\x5b\xb8\xb3\x22\x7b\x9f\x6b\x73\x17\x7a\xe7\x1e\xc4\xc1\x33\xda\xb5\x9d\x9f\x3b\xcf\x6e\xc6\xa3\x7d\xde\x2c\x49\xd1\xfd\xf4\xe5\x6b\xc4\x07\xb6\x9b\x92\x46\xc4\xad\x51\xeb\xef\x9e\x7c\x39\x5e\xb8\x8d\x88\x0b\xe2\x82\xa4\x50\xfe\xf1\x1d\x84\xb7\x0f\x4c\xb5\x26\x2c\x12\x71\x5f\x24\xe0\x94\xba\xa4\xf9\xa4\xd6\x5d\x5f\x76\x93\xa9\x3a\xb6\x12\xc5\xa0\xbd\x44\x97\xc9\x8b\x30\x4d\x20\x0e\xba\xb2\xfe\x77\xdf\x0c\xfa\x87\x3e\x4d\x02\x3d\x92\x9b\x33\xf7\x84\x45\xe3\x83\x69\x35\x2a\x03\xcd\x4d\x3d\x71\xcf\x11\xf8\xba\x5f\x27\xde\x18\x78\x10\xc0\x78\x10\x33\x96\x87\x18\x3a\x88\x83\x4b\x40\x18\x45\xda\x43\x36\x70\xbf\x7a\x4b\x21\xcb\x42\x29\x9f\x5d\xea\xd8\x35\x35\xdd\x5f\x30\xe3\xf1\x4f\x64\xf7\xc8\x40\xd2\x37\x4d\xd0\xe2\x03\xc0\x9d\xe8\x1b\x19\x4c\x67\x7a\x49\xb3\xc4\x3b\xe6\xbd\xe1\xf3\xac\x5f\xef\xa7\x6d\x77\x3a\xbb\x4a\x0e\x2b\x1c\x5b\x30\xd8\x04\xb9\x8f\xb4\x71\xa1\xbe\x91\x00\x0e\x2e\x81\xe3\xb7\x9a\x19\x59\x3a\x18\x32\x22\xcd\xaf\x6c\x9e\x18\xd2\xd7\x11\x8f\x98\xb6\x61\xaa\x08\x13\x6b\x30\x2a\x10\x37\x17\xba\x7d\x46\xc4\x05\x71\x70\x09\xd8\x6a\xc5\xcf\x66\x7b\xa4\x05\x5c\x78\xda\xbd\x2c\x97\x94\x96\xed\x97\xce\xa2\x66\xb7\x60\xa9\xae\x9e\x21\x90\xa9\xc1\xa8\x77\x88\x90\x00\x88\x83\xae\xac\xff\xdd\x37\x83\x26\xd7\xd3\x24\x40\x41\x44\x36\x56\x43\xe9\x83\x2d\x63\x2c\x6b\xfc\xa6\x95\x67\x4c\x75\x39\xa1\x49\x38\x95\x61\xb4\xd1\x87\xed\x5d\x35\xf1\xc7\x6a\xa8\x5f\x22\x80\x83\x4b\x80\xe1\xa1\x1b\xb7\x06\x51\xde\x06\xde\xc8\xcd\x4e\x8f\x32\x0b\x1f\xd1\x1e\xb6\xf4\xe2\xdf\x3a\xce\x8f\xab\xb6\x94\x05\x04\xee\x41\x7d\xe3\x41\x1c\x5c\x02\x51\x28\xd7\x3c\xe8\x1b\xf7\xb7\x82\xfa\x33\x5a\xa6\xae\xc5\x57\x7c\x29\x21\x6f\x90\x13\xb0\x53\x96\x2a\xde\xe2\x08\x6e\xc2\x86\xf6\x85\x41\x1c\x5c\x02\x96\xdf\x85\xe6\xde\x77\x18\x0d\xe0\x72\x7c\x4c\x72\x8e\xa3\xbf\x96\x4b\x1d\x63\x11\xea\x43\x12\x6e\x4d\xf8\xce\x95\xa9\x46\x07\x6a\x6e\x06\xe2\xe0\x12\x58\xe0\x99\x72\xce\x37\x50\xa5\x3b\xa8\xc6\xfd\x2a\x9d\xba\xc3\x73\xc1\xb6\xd4\x92\xa1\x99\x2c\x61\x88\x68\x45\x82\xd1\x2a\x6b\x0e\xb1\x5e\x06\x71\xd0\x55\x55\x80\x6f\x06\x65\xba\xd3\x34\x40\x7f\x9b\x71\x4f\x04\x8d\xd5\x16\x57\x6e\x61\x40\x78\xef\xdd\xbb\x5e\xd2\xba\x57\xed\x32\x66\x7a\x68\x12\x82\x2c\x21\x9e\x71\x50\xcf\x4c\x10\x07\xd7\xc0\xc3\x73\xa2\xe8\x17\xac\x28\x07\x0a\x88\x1e\x12\xb5\x50\x39\x27\xdc\xa3\x46\x67\xaa\x75\x33\x31\xec\x11\x1d\x3c\xb4\x29\xb9\xe0\x80\x88\x0b\xe2\x4e\xf4\x77\xbf\xeb\x68\xc2\x12\xef\xa4\x45\xcb\xf9\x1b\xad\xc8\xd8\xcd\x3c\x99\x47\x8e\x53\xbd\x55\x7a\x69\x2e\xb9\x33\x0c\xe5\x8d\x34\x0b\xd4\xdf\x1d\xc0\xc1\x35\xd0\xba\xff\xba\x36\x2a\x70\xb6\x5d\x28\xd3\x36\xed\x06\xb9\x44\x0e\x7e\x54\x5b\x98\xdd\xf2\x48\x8f\x46\x84\xc2\x30\xa6\xf0\x8e\x25\xd4\xbc\x04\xc0\xc1\x35\x40\x3d\x36\x11\x35\xc6\xff\x8a\xea\xf5\xfc\x15\x1a\xbc\x0b\x73\x37\x86\xda\x16\x46\xba\xb9\x2e\xdb\xd8\xb0\x28\x6d\x72\xd3\xb3\xa4\x21\x34\x00\xe2\xa0\xab\xaa\x00\xdf\x0c\x5a\x76\x9c\xa6\x01\x8d\xd9\xdb\xbe\x77\xd0\xd3\x62\x77\xdb\xe2\xd1\x3a\x77\xd5\x97\x9e\xdc\x61\x6d\x8b\x4a\xb4\x1b\xfa\xc2\xb6\x8e\x6c\x73\xa9\xa7\x1b\x31\x76\x10\x07\xd7\x40\x53\xdc\x82\x8a\xc4\xa1\x1c\x56\x0d\xf3\xb6\xf0\xdc\xd2\x92\xd8\x4f\xef\x16\x87\xac\x68\xb5\x42\xe3\x34\x25\x85\x19\xe5\x59\xe8\x9c\x36\x88\x83\x6b\x20\x45\x77\x88\x11\x23\x20\x76\x99\x36\xca\x95\x6b\xf5\xce\x3b\xc9\x45\x76\x7c\x79\x9d\x79\x83\x23\x1c\x6c\xe5\x5f\xa6\x78\x6a\xd0\xdf\x0a\xc4\xc1\x35\x20\x49\x9c\x27\xf5\x40\x30\x2d\x73\x5c\x3a\x0b\xff\x08\xf5\xc1\xf3\xc9\x4b\xf5\x78\xd6\xa6\xe7\xd4\xee\x65\xcf\x5e\x51\xc6\x7c\x6e\x03\xb5\x2d\x00\x70\x70\x0d\xb4\x4b\x15\x5f\xd0\x5c\x56\xf4\xa5\x26\x08\x36\xef\x17\x7b\x59\x77\x8e\x87\x6e\x29\x9c\xad\x87\x55\xcd\x3d\x8d\xca\xc9\x4a\x8a\x03\xa1\x01\x10\x07\xcd\x03\x00\xdf\x0c\xb2\x50\xa7\xfb\xe6\xcc\xc8\xc3\x17\xc9\xae\xb1\x41\xef\xbf\xdb\x91\xf0\x1b\x60\xbc\xfa\x5d\x4b\xef\xae\xc1\xbf\xf0\xde\x7f\x59\x48\x89\x46\xfb\x50\x00\xe1\x41\x41\xdc\x49\x0f\x9a\xa1\x9d\xdc\x26\x9c\xb8\xda\xa7\x84\x71\x91\x86\xf0\xab\xb8\x69\xc9\x76\xd7\x6f\x2c\x06\x8f\x63\x02\xf7\x0f\x8c\xfa\xd2\x22\x82\x88\xc8\x20\xee\xa4\x6f\x96\x47\xd6\x7e\xf3\x58\x62\xfd\x8e\x0d\xaa\xde\xe3\x73\x65\x3d\xb1\x22\xda\xa1\x31\xae\xdf\xb0\x3b\x3a\xc9\x2e\x97\x75\x5e\xbd\xf6\x13\x11\x19\xc4\xfd\x77\x57\xf8\xcf\xc8\x5e\xe4\x85\x0f\xd5\x3e\x1d\xe8\xd1\x04\xf9\xc9\xae\xe7\x2a\xb0\x58\xf4\x5c\x46\x72\x6a\x1f\xcb\x2b\xd5\x3b\xf2\xae\xbc\x4e\x66\x8d\xf0\xcd\x20\xee\xbf\x17\xa1\xff\xf4\xcd\xca\x94\x8a\x13\xcf\xe3\xde\x48\x91\xcb\xca\x2e\x8d\x34\x29\x94\x27\xed\x8f\x6d\x3b\x50\xb0\x45\x8b\xbe\xb5\x10\xe6\xd6\xf8\xc4\xfc\xa7\x6f\x56\x95\xbc\x94\x6f\xdf\xe8\xaa\xdc\x34\x71\x31\x47\x3a\x7f\x3c\xed\x09\xb3\x81\x38\x92\x5b\x5c\xff\x87\x52\xe6\x6e\xfb\xcb\xff\x38\x8f\xbc\x7f\xa7\x7e\x26\xa1\xf7\x5e\xeb\x9b\x07\xe8\xd9\xca\xeb\xf4\x14\xc2\x18\x42\x8b\xf6\xd9\x66\xbf\x03\x03\x9a\xe7\x09\xb5\x12\xff\x75\xfb\xcd\xa0\xa1\xfd\x79\xbf\xf9\x84\x6f\xa6\x40\xf6\xf1\xe0\x0d\x73\xa3\xf1\x12\x8e\xf5\x1a\x44\x2f\x7b\xca\x12\xac\x6b\xa8\xee\xd7\x97\xf7\xf3\x52\x1a\x2d\xf7\xbb\xb7\xaa\x67\xe1\x9b\x91\xd4\xe0\x3f\x95\xf7\x7c\x3c\x6b\xe5\x2b\x1e\x37\xe7\x98\x1f\x75\xc5\xa3\xf6\xbe\x5e\x65\xd1\x61\xb3\xe3\x68\x78\xda\xa3\xa3\x6c\x5a\x5f\x6e\x4e\x9d\xc9\xc6\xef\x49\xdf\x5c\x94\xf1\x60\xff\x41\xc2\xd8\x83\xed\xb2\x7e\x43\xbd\x57\x0c\x1e\xa2\xbd\x3c\x9f\x0e\x33\x36\xb0\xad\xb8\xf7\x59\xf2\xf0\x71\x16\xce\x64\xe3\x57\xe7\xc4\x8f\xd5\x91\xca\xfb\xae\x47\x9a\xe3\x11\x31\x33\x8d\xc1\x4b\xf7\xa3\x9f\xf8\xe8\xcd\x10\x8b\xb3\xe6\xd8\x7c\x5a\xb2\x0d\x2d\x0b\x27\xc1\x99\x8c\xf6\xa4\x6f\x0e\xa6\x20\xac\xee\xea\xd0\x60\xd8\xbe\x79\x2e\xbd\x46\xfc\x2d\xc3\x97\x83\x8f\x44\xcc\xc2\x5a\x84\x56\x6c\x6f\x65\x7c\x73\xf6\x28\xce\xcc\x37\x83\x34\x74\x5a\xa6\x44\x6d\x6a\xb0\x8b\xd6\xcc\xae\x47\xb3\x41\x9f\x2a\x1d\x18\xb3\xc4\xc0\x35\x8f\x9d\xfd\x79\x2d\x40\x26\x81\x53\xf7\x36\xd6\x7b\xe8\x95\x29\x10\x07\xcf\x94\x5e\xe2\x6f\x28\xb5\x1e\x5f\xfe\x8e\x5c\x63\x94\x5d\x6c\x7d\xbf\x75\x94\xdc\xd6\xd2\xb4\xd3\x9a\x3f\x28\x1a\x2d\xc3\xa8\xa6\x2a\x16\xea\x1f\x06\xe0\xe0\x99\x12\x83\xe8\xc6\xc3\x06\xd9\xe6\xf0\xf2\x6d\x77\x92\xac\x96\x9b\x14\x94\x42\xd2\xe7\x5f\xdf\x78\x12\x41\x50\xc3\x4b\x3c\xa5\x19\xf1\x1a\x11\x17\xc4\xc1\x33\xa5\x08\xf5\xd4\xb6\xeb\x7a\xbe\xa9\x96\xde\xd1\x8f\x87\xc9\xbc\xbb\x1f\x2b\xe5\xc5\x34\x5e\x97\x47\xd7\x2b\x63\xdc\x5f\xe3\x47\x81\x3a\xce\x83\xb8\x20\x29\x89\x7f\x7c\x87\xdc\x86\xf8\x6c\xad\x8b\x69\xd2\x04\x58\x0e\x71\x09\xf5\x6a\x52\x7e\xb9\x8c\x83\x11\xa3\x34\xb4\x99\x63\x22\xb7\x5a\x79\x2c\x25\x11\xa6\x09\xc4\x41\xf7\x9b\xff\xee\x9b\x41\xff\xd0\xa7\x49\xc0\x71\xa8\x99\x92\x65\x8e\xf0\xc0\x4e\xb1\xb0\xdb\x39\x5b\x40\xb7\x4e\xe1\x19\xc5\x16\x26\xab\x80\xe1\x47\x91\xe8\x76\xed\x48\x05\xc4\xd0\x41\x1c\x5c\x02\x63\x17\x66\x42\x7e\x89\xa7\x8a\xb3\xf3\xea\xf2\x76\x78\x25\x05\x88\x55\x35\x78\x0c\x34\xe1\xbe\x7d\xaa\x86\x62\x55\x46\x3f\x75\x80\x88\x0b\xe2\xe0\x12\x40\xb3\x1f\x13\x4c\x7e\x60\x6b\xdd\xe3\xb1\x96\x3e\x4c\xd2\x4c\x95\x36\xfc\x6e\x98\xfd\x02\x5e\x55\xfd\x3d\xbb\x25\x2e\xb1\x0d\x68\xc1\x0c\xe2\xe0\x12\xc8\xc0\xae\xfe\xb8\x2b\xeb\x7b\xde\xeb\xe0\xd7\x65\xf5\xbb\x37\xb7\xab\xaf\xed\x57\x5b\xbf\xbf\x7a\xa4\x30\xc9\x7a\x83\xa4\x9f\xb0\x07\x11\x17\xc4\xc1\x25\xf0\xfd\x00\xd7\xb1\xcf\xca\xd6\xa7\x93\x5f\xe8\x66\xb8\x75\x3c\x53\xdd\xc6\x27\x6f\xdf\x0d\x4e\xeb\xe2\x5f\xf2\x68\x54\x79\x48\x37\x11\x12\x00\x71\xd0\xfd\x66\xb5\xbf\x4a\x00\x34\xb9\x9e\x26\x81\x55\x2e\xf5\x37\x6e\x03\x8b\xf4\x7b\x32\xaf\x96\xb8\x0c\x1d\xc4\x7a\x1c\x3f\x5b\x34\x39\xa9\x4b\x97\xff\x96\xce\x62\x8f\x96\x87\xf6\x04\x41\xdc\x89\x6e\x7f\xf1\x8d\x2c\x4b\x8a\x9a\xe3\x37\x8c\xc2\x4b\x27\x7f\xf0\xbc\x3d\x7f\xd9\x46\x98\x7b\xa8\x24\x52\x58\xb0\x56\x8e\x63\xc6\x12\x6a\x1d\x05\xe2\xe0\x12\xb0\xc3\x9a\xc2\x29\x53\x37\xeb\x29\x8f\xbe\xe6\x4f\xbd\xea\xec\x39\x16\xb1\x48\xef\xc6\x27\x2a\x8e\xc2\x2f\xcf\x67\xb5\x7d\x1f\x7a\x77\x11\xc4\xc1\x25\x80\x69\x1a\x16\xb9\xfa\xb4\x4f\x51\x4f\x78\x85\x3a\xed\x75\x1b\x91\x9c\x0c\xae\x0c\x43\xd6\xb9\x51\xe5\x47\x76\x0c\xdd\x23\xce\xd0\x93\x1b\x20\x0e\x2e\x81\x12\xba\xf3\x81\xd8\x7c\xea\xbc\x11\x63\x2f\xde\xb1\xf3\xb9\x94\xe1\x17\x86\xdf\x62\x97\x5c\x7d\x1c\x15\xe1\xf3\x92\x4e\x29\x7c\x19\x6a\xf1\x04\xe0\xa0\x7b\x8d\x00\xdf\x0c\xca\x74\xa7\x69\xc0\x5c\x7e\x7a\x43\xa5\x60\x2c\xc0\x4c\xa2\x0f\xc7\x0b\x6d\x68\xce\x26\x18\x0d\xdd\x7b\x95\x7f\xcc\x31\xeb\x87\xf5\x8c\x55\x2f\xd4\x3e\x0f\xc4\xc1\x35\x80\x66\x30\xda\x5f\xa7\xe2\xf5\x29\x1a\x7f\x2c\x8f\x95\x7f\x74\x65\x24\xf8\x8e\x51\x6e\x67\xc1\xbb\x98\x1b\xba\x8a\xc8\x63\x05\x90\x6f\x06\x71\x70\x0d\xe8\x59\x0d\xca\x64\x4a\xbc\xd1\xb2\x78\x92\xdc\x81\x62\x77\x37\x9c\xa6\xa3\xed\xdb\x57\xd1\xdc\x2a\x0f\x42\xf2\x19\xca\x87\xdf\xa1\x5a\x0f\x88\x83\x6b\xc0\x9f\x8b\x4c\x8a\x3c\x24\x0c\x7f\x8c\x9f\xcb\xa2\x6a\xb6\xd9\xe0\x98\xa2\x4f\x9a\x3d\xd7\x23\x4c\x7e\x85\x1e\x23\xa5\x69\x19\xaa\xf8\x82\x38\xb8\x06\xec\xdd\x35\x3f\x9a\x72\xbe\xe8\x22\xbf\xd5\xf3\xc0\x87\xe9\x7c\x52\xde\x17\xee\x07\x36\xc3\x5d\x95\xf4\x8c\x18\x72\x9f\x5d\x89\xb3\x10\x1a\x00\x71\xd0\xfd\x66\x9d\xbf\x6b\x00\xb4\xec\x38\x4d\x03\x78\x8f\xb0\xc2\x4c\x36\x14\x62\x1c\x86\xca\x4d\x5f\x94\xa5\x1f\xca\x66\xfe\xbe\xc2\x2b\x9f\xa8\x90\x1b\xcf\xe9\x7a\x2c\x9a\xb4\x8a\x18\x3b\x88\x83\x6b\x20\x6a\x83\x3d\x6c\x2f\x71\xee\x73\x45\xe2\xc6\x70\xe2\x38\xd3\xac\x29\xd7\xca\xd5\x46\x57\x99\xf8\xa4\xa4\xee\x85\xfc\x94\x21\x24\xa8\xce\x05\xe0\xe0\x1a\x90\xa5\xe0\xd5\xa2\x51\x5d\xe6\x95\x79\xdd\x5d\xf1\x45\xcf\xd8\xf6\x43\xef\x40\x5b\x09\x45\x12\xbf\x34\x7b\xb0\x15\xcf\x93\x43\xa8\xf1\x2b\x88\x83\x6b\x20\x4f\x90\xb4\x86\x91\xb5\x56\x90\x18\xcf\x71\x31\xea\xfc\x57\x8e\xb0\xfd\x62\xce\x32\xd9\x80\x7d\xe9\xc6\x36\x4a\x02\xd2\x07\x02\xd0\x6d\x30\x00\x07\xd7\x40\x27\xbe\xde\xa3\x27\x61\x4e\xea\x63\x11\x87\x8c\x5e\x37\x29\x30\x7b\xfd\x47\xe2\xe7\xe7\xbe\x1b\x2f\x0e\x2c\xd2\x1b\x3a\x13\x4f\x21\x34\x00\xe2\xa0\x79\x00\xe0\x9b\x41\x16\xea\x74\xdf\xfc\x19\x7b\x48\x56\xff\xa3\x0f\x76\x99\x38\xdb\xe2\xb4\xde\x74\x82\xc1\xd8\x2d\x9a\x86\x50\x25\xa9\xb7\x48\x4e\x59\xef\x68\xfd\x7e\x21\x3c\x28\x88\x3b\xe9\x9b\xf5\x50\x43\x19\x29\x5f\xee\xed\x91\xf4\xbe\xe3\x37\x09\xf9\xdc\x9d\x31\xe1\x13\x8c\x9c\x45\x3d\xd1\xb8\x5e\xb0\xb7\x24\x9a\xc8\x8a\x88\x0c\xe2\x4e\xfa\x66\xb4\x7e\xce\x4c\xdb\xf6\xa5\x40\x9a\x67\xf3\x51\x0f\x0f\xe7\x13\xb8\xf1\xc2\x1c\x3f\x33\x35\x0e\x88\x9b\xf2\xb0\x48\xdf\x7e\x48\x03\xbd\xba\x07\xe0\xfe\xe3\x9b\xff\xd9\x9a\x2d\xd4\x1f\x37\x30\x60\xa5\x62\xbe\x27\x96\x99\xb4\x98\x37\x26\x2e\xce\xb7\x6c\xea\x47\x1b\xcf\xc1\xd6\xad\x55\x5f\x3b\x15\xcf\x18\x84\x6f\x06\x71\x41\x32\xd4\x48\xff\xf4\xcd\x68\x11\xcd\x32\xaf\x1f\x46\xb5\x28\xc6\x3c\xe8\x30\x18\xe9\x6e\x89\x57\x98\xab\x9c\xa8\x22\x9c\xaf\xd2\x59\x53\x45\x31\x40\xbe\xf4\xa7\x6f\x36\x79\xab\xd0\x11\x6a\xc2\x84\x51\xfe\x56\xd8\x2f\xab\x5c\x30\x57\xa1\x5c\xe7\xa7\x1c\x4b\x75\x57\x8a\xdf\x18\xa5\x5a\x34\xcb\xfc\x9f\x5b\x56\x4d\x6a\x99\xd9\x1e\xd2\xe7\x42\x89\x51\xb5\xa6\xd3\x18\xc3\x0a\x03\xc4\xba\x47\x1d\xd4\x29\x82\xc2\xea\xb3\x04\x49\x75\xd3\xfe\x6d\xbe\x19\x34\xb4\x3f\xef\x37\x9f\xf0\xcd\x41\x58\x58\x5f\x25\x08\x6e\x0a\x57\xf2\x7e\xdb\xbd\xbf\xa5\x30\x24\x41\xb0\xf1\x4a\xc6\xbf\x98\xbc\xe8\xcb\xca\xf8\xae\x74\x1e\xc3\x59\xf8\x66\x89\x13\xbe\x19\xd5\x32\x40\x94\x2d\x38\xa9\x29\xae\x69\xc3\x1c\x83\x20\xa5\xcb\xbe\xdf\x14\xb7\xf1\x78\xf0\xd3\x94\x86\xa8\xcf\x3a\xa7\xe6\xcc\x99\x6c\xfc\x9e\xf4\xcd\x21\x5e\xe7\xe5\xec\x32\x52\x84\xc9\x05\xe9\x98\xdd\xd2\x72\x8a\x7b\x47\xc4\x77\x14\x94\x57\x99\x3c\x9d\x8d\x8d\x2d\x4c\xf5\x0c\xcf\x64\xe3\xf7\xa4\x6f\x7e\xc2\x16\xaf\x97\xf5\xc8\x64\xbe\xc1\x3c\x7f\xee\x89\xb4\xc4\xda\x68\xdd\x04\x57\x1c\x1d\x4b\x87\xbc\x2e\x57\x0c\x11\x6b\x55\xd2\x99\x8c\xf6\xa4\x6f\x76\xb9\xdf\x1d\xf9\xd9\x34\xdc\xe6\x35\x95\xbf\xd1\x9d\x18\xd6\xc2\xf3\x02\xf4\x42\x9f\x87\xde\xae\x24\xb8\x55\x78\x5e\xf6\xdd\x51\x3f\x33\xdf\x0c\xd2\xd0\xa9\x2f\x94\xcd\xbd\x42\xf2\x68\xab\xe9\x9c\x7f\xa0\xef\x60\x3c\xfb\xfc\x81\x5f\x17\x26\x8a\x5e\xa3\xe2\x4b\x9d\xb9\xaf\xe8\xcb\x2c\x5b\x90\xbf\x05\x71\xf0\x4c\xd9\xc8\xfb\xde\xe7\x15\x55\x8a\x86\xe5\x7a\x85\x63\x67\x62\x20\x31\xd3\x6b\x8d\x30\xa2\x74\x93\x7c\x17\x31\xde\xf3\xe9\x51\x9a\xd0\xf9\x6f\x10\x07\xcf\x94\x9f\x3f\xe1\xaf\x6e\xad\x4b\x5e\xf9\x1d\xbe\xa4\x64\xaa\xd7\x6b\x95\x78\xe5\xca\x0a\xf7\xb4\xbc\x56\xfb\xe1\x30\xf1\xa6\xc1\xbd\x12\xa8\xd3\x10\x80\x83\x67\xca\xad\x82\x6a\xda\x73\x73\x8b\xa9\xd3\x4b\xd4\x89\x6a\xbc\x64\x96\xf1\x12\xcd\xdb\xec\xae\xea\xed\x05\x3d\x7c\xaf\x98\x04\xaf\x42\xe6\x11\xc4\xc1\x7f\x5f\x0a\xee\x2e\xba\x6e\xaf\x1c\x81\xe7\x89\xbe\x02\xaf\x68\xb9\xe4\xf4\xaa\x4b\x4d\xd5\x1a\xd3\xdd\x35\x2a\xe7\xd0\x67\xab\x25\xa1\xbe\x60\x20\x0e\xba\xdf\xfc\x77\xdf\x0c\xfa\x87\x3e\xb5\x37\xb2\xca\x9b\x0d\x2a\xdf\x3a\xba\x20\xae\xf2\xd6\x6b\xb5\x49\xaa\x1f\x7e\x8d\x86\xe4\x88\x51\x59\xd9\x4a\xcc\x20\xd7\xd5\xf3\x41\x0b\x66\x10\x07\x97\x80\xd6\x32\xce\x45\x79\xe2\x9b\xbb\x46\x63\xeb\x2b\x18\xa8\xe4\x55\xb2\x71\x2c\x2d\x9f\xb0\x6e\x25\x97\x7f\xd8\x77\xdd\x96\x64\x1a\x47\xc4\x05\x71\xf0\x4f\x9a\xf5\xfd\xa9\xbe\xe1\x83\x18\x9d\x7e\xc2\xae\x47\xb8\x2f\x44\x33\xaf\x71\x48\x33\xed\x7b\xd8\xd2\xb5\xd5\x6d\x17\xff\x12\xd2\x80\x36\x19\x40\x1c\x5c\x02\xae\x2d\xb8\x09\xb6\xef\xba\xcf\x79\x55\x8c\x3a\x7d\x1f\x37\x61\x4e\xd3\x1d\x35\x48\x59\x17\xef\x92\xe8\x9a\x1b\x51\xb6\xaf\xd6\x40\xc4\x05\x71\xf0\xdf\x37\x08\x75\xec\xed\xb7\x67\x13\x63\x97\xf1\xf9\xf5\x99\xca\x69\x0a\xf9\x54\x42\xb6\x3f\x1e\x6d\x30\x2d\xdd\x37\x2a\x13\x55\x41\x52\x47\x48\x00\xc4\x41\xf7\x9b\xff\xee\x9b\x41\x93\xeb\x69\x12\x98\x71\x8f\xae\xff\x9c\x27\xfd\x3b\x31\x90\x6d\x27\x37\x9a\x47\xd3\x25\x33\xfc\xdb\xe3\x8a\xee\x5c\x46\xac\x9e\x5f\xc3\x41\x22\xd0\x7e\x10\x88\x3b\x71\xea\xe4\x66\xfa\x62\xbe\xa6\x07\xc5\x78\xb6\x79\x6d\x8f\xd2\x05\xbf\x1f\x68\x3b\x96\x1d\x3d\x7c\xdd\xd7\x79\xc3\x8e\x07\x2f\x92\x40\x57\xc6\x41\x1c\xfc\x93\xa6\x5f\x10\xd0\xc3\xa9\xfc\xca\xa6\xf0\xb5\xec\xd5\xf4\xc0\x07\x91\x97\x86\x42\xfb\xb8\x68\x21\x99\x0f\x2d\x9f\x29\xd5\xcb\xe8\x41\xfe\x16\xc4\xc1\x25\xd0\x9e\x9c\x10\x72\x69\x3b\x80\x27\xae\xfe\x3c\x49\x00\x0b\x45\xf8\xa6\x3b\x89\x13\x17\x9a\x14\x36\x35\x41\xbf\xe6\xd7\x79\x6f\x77\xe8\x16\x08\x80\x83\xff\xbe\x9d\x45\xd7\xc6\xe8\x88\x34\x07\xd7\x7b\x15\x2e\xcd\xc8\x34\x63\x65\x4f\x8c\x10\x35\x9c\xb7\x1a\x58\x99\x3a\x24\x64\xb9\x37\xab\x08\xad\x97\x01\x1c\x74\xaf\x11\xe0\x9b\x41\x99\xee\x34\x0d\xa4\xef\xfc\x2e\xfe\xa5\x8f\x23\x8a\xa3\x39\xdb\x23\x40\x4c\xf4\xed\xf6\xc3\x15\x39\x1f\x02\x89\x5f\xbd\xdc\x41\x24\x2d\x04\xb8\xd0\x19\x75\x10\x07\xd7\x40\xf7\xe4\xb3\x4d\xff\xc9\xd7\xe7\x75\x31\x56\x94\x27\x33\x2e\x7a\xbc\x8f\xc4\x73\x53\x99\xda\x17\x24\xbb\x34\xcb\x50\x57\xfc\x3f\x35\x19\x10\x07\xff\xa6\x4b\x49\x21\x43\x59\xf5\x5f\xeb\xdf\xe0\xc6\x74\x2b\x09\x1e\x32\x39\x89\xe1\xdf\x15\x5b\x2b\x68\xcd\x6c\x9b\x59\xb9\x50\x29\x16\x89\x88\x0b\xe2\xe0\x1a\x98\xe5\xf3\x09\x53\xa2\x64\xbc\x39\x34\xbd\xc9\xdf\x15\x19\x9e\xe2\xac\xe4\x4f\xce\x7d\xf7\xf2\x9e\xd9\x15\x95\xcd\x94\x3d\x17\xa8\x2f\x18\x88\x83\xff\xbe\xc8\x4d\x75\x1d\xb8\x83\xd5\xe4\xd7\x95\x1e\x1e\x46\xf3\x3c\xff\x85\xc2\xac\x59\x32\x23\xf3\x4e\xa1\x4c\xad\xf6\xf1\x74\xc5\x85\x6d\x84\x06\x40\x1c\x74\xbf\x19\xe0\x9b\x41\xcb\x8e\xd3\x34\x80\x39\x6f\xfc\x54\xfc\xf1\xc4\x66\x1d\x76\xf2\xa5\xee\x96\x26\x8a\xa1\xfe\x84\xc9\xb1\xdb\x47\x4c\x7e\xcf\x72\x34\xc5\x9c\x97\xa0\x52\x27\x88\x83\x6b\x80\xd5\x49\x30\xf0\x2b\xcb\x16\xc7\x6c\xe5\xc2\xb2\x57\x1d\xd6\x50\xf7\xc3\xf2\x96\x71\xc6\x06\xcc\xc1\xf4\x28\xc1\x25\x9b\x45\x7a\x44\x5c\x10\x77\xe2\xbd\x52\xb1\xbe\xdf\x66\xbf\x68\x66\x15\x83\x57\xd0\xa5\xfd\x48\x45\xf4\xd8\x03\x57\x2d\x64\x3c\xf7\x8f\xde\x0c\xd3\xad\x7d\xa1\x83\xfa\x98\x81\x38\xb8\x06\xbc\x36\x17\x8a\x6e\x45\x96\x5d\x3f\x1a\xcf\x5e\xb9\x8f\xc2\x49\x56\x7d\xe5\x5b\xf6\x17\x9a\x94\xa9\x56\x1e\x95\x84\xd4\x5b\xd1\xd0\xff\x02\x88\x83\xff\xbe\x6e\xe6\x41\xa3\x86\xaf\x93\xa5\x93\xfc\x45\x06\x8e\x0f\x82\x06\x58\xe6\xfd\x18\xd1\x7a\x35\xb0\x7a\xbf\xca\xdc\x8b\xd6\x7c\x0b\xcd\x03\x20\x0e\x9a\x07\x00\xbe\x19\x64\xa1\xfe\x97\x37\xe5\x35\x16\xae\xbb\xcc\xcf\xfb\x47\x6d\x68\x18\xa5\xb6\xf5\x68\xfd\xfe\xd6\xe5\x46\x51\x8a\xd9\x37\xbc\xd5\xb2\x79\xad\x38\xd3\x10\x3a\x4d\x0d\xe0\x4e\xfa\x66\xc6\x7a\xc1\xdc\x46\x02\xed\x1d\xae\x23\x56\x17\x9b\xac\x77\xf5\xab\x33\x55\x24\xc1\x6e\x71\x32\x33\x4f\xf6\x88\x79\xf7\xca\x5f\x22\x22\x83\xb8\x93\xbe\x99\x24\x49\xea\x6e\xa2\x7f\xd7\xd6\xc4\x73\x47\x13\x1f\x93\x07\xf2\x41\x0f\xa4\x5c\x07\x8d\x90\xcb\x29\x09\x17\xaa\xc8\xac\xee\x3c\x40\x44\x06\x71\xff\xed\xde\xf5\x8f\x73\x2d\x29\xf8\xd9\xdf\x86\xa7\x09\x98\x7f\xf2\x78\x1c\xee\x1a\x57\x3d\xc0\x16\x15\x30\xa1\xbc\x34\xbc\xae\xb3\x25\xb8\x2d\xd3\x4e\x89\xf0\xcd\x20\x0e\x7a\x53\x1e\xf2\xcd\x2e\x58\xd4\xc7\xe5\x31\xb9\xfd\x3c\x73\x5f\xca\x32\xd9\x2d\x5e\x91\xee\xa8\x25\xec\x94\xdc\x3b\x87\x1f\x51\x36\xf6\x4a\x9f\x24\xf6\x4f\xdf\x1c\xa2\xfd\x42\x87\xfd\x75\xea\xd0\xfd\xde\x00\xdb\xa7\xeb\xed\xa9\x1a\x46\x5a\x1f\x36\xdf\x8b\xf9\xc5\x79\x5b\xce\x7e\xfa\x18\xda\xfe\xe7\xfa\xc8\x85\xfc\xfa\x18\x19\xe9\x07\x7f\x31\x6e\xf4\x8c\xa3\xa6\xcf\xdf\x91\xb8\x7f\x14\xfb\x1e\x5d\x30\x6b\x45\x42\xc1\xaa\xe5\xfd\xf4\x6f\xf3\xcd\xa0\xa1\xfd\x79\xbf\x59\x06\x6e\xae\x3e\x6d\x3b\x70\xa0\x8a\x7b\x15\xcc\x54\x8d\x38\xe7\x1d\x53\xfa\xb8\xce\xb7\xe1\xef\xc6\xbd\x49\x7e\xf9\xe0\x69\x0d\x4e\x7b\xc7\xd1\x59\xf8\x66\xff\x93\xbe\x79\x87\x2c\xe0\xd9\x77\x79\xd2\xf6\x07\xcb\x9e\xbd\x33\x3b\xbb\xae\xd3\xfa\x72\x63\xbf\x5e\x11\x91\x91\x85\x13\xa5\xb0\xa3\xa9\x9c\xc9\xc6\xaf\xf0\xc9\x73\xda\xa2\xfa\xfb\x78\x18\xd7\x4a\x08\x2d\xfd\x6a\xc7\xe8\x8c\x8f\x46\xd0\xaf\x12\x1a\xd0\x04\x0c\x75\x66\x72\xb9\x75\xa9\x6a\x17\x9d\xc9\xc6\xef\x49\xdf\x8c\xaa\x3b\x90\x73\x98\xcc\x86\x77\x57\x8f\x29\xac\x63\xea\x99\x01\x31\xe6\xf1\xab\xe6\x26\x97\x54\x53\xd9\x18\x5e\x4f\x8e\x17\x4d\x67\x32\x5a\x97\x13\x3f\x56\xdb\xae\x79\xaf\x6b\x50\xe8\x32\xd9\x8d\x17\x12\x49\x1a\x03\x6f\x9f\xb2\x5e\x16\x46\xfa\xb1\xbb\x21\xc8\xe9\x53\xa5\xfe\xfd\xd0\xfd\xcc\x7c\x33\x48\x43\xa7\x65\xca\x03\xbe\x89\xf3\x3d\xd1\x5f\x7f\x1a\x77\x7d\xc0\x61\x36\x9b\x08\xfa\x75\x79\x0e\x79\xe2\xaa\xcc\x53\x37\xb6\x0f\xfb\x06\x26\x53\xd0\x6e\x00\x88\x83\x67\xca\x15\xa4\x17\x59\x52\x0b\x44\x54\x9f\x19\x19\xbc\x4c\xb8\x8a\xce\x2f\x70\xf1\xa3\xbf\x41\xe3\xd8\x25\xf9\xf5\x75\xd0\x40\x28\x12\xda\xc7\x06\x71\xf0\xcc\xf3\x29\x22\x42\x8e\x77\x3d\x45\x85\x22\xf9\x7d\x10\x7f\xc3\xf6\xf1\x55\xce\x09\xaa\x86\x97\x34\xfd\x92\x3b\x51\x89\xd3\xe5\x02\xd0\x25\x54\x10\x07\xcf\x94\x6b\x9f\xf0\x82\x5e\x31\xde\x18\xf5\x0c\x49\x48\x52\xa4\xc2\xbc\xd3\x2f\x66\xca\x6e\xac\xd4\xcc\xcd\xd9\xf5\xd1\x76\xa9\xdc\x20\x1e\x11\x17\xc4\x9d\xe8\x34\xb4\x35\x1a\x4b\x17\xc4\xd4\xb3\x7b\x6b\x31\x3d\x36\xf4\x6b\xd7\x87\x62\x94\x39\x9c\xf7\x66\x37\x26\xd3\x16\x69\x96\xb2\x29\x7f\x22\x4c\x13\x88\x83\xee\x37\xcb\xfc\xdd\x37\x03\xfe\xa1\x4f\x93\xc0\x79\xe2\xee\x62\x92\x52\xba\x0b\x5c\xa9\x84\x7d\xdf\x31\x75\xd6\x15\xf9\xb2\x9f\x60\xbd\x63\xe7\xeb\xac\xa7\x8a\x94\xbe\xb4\x0f\x6d\xdc\x80\xb8\x13\xf7\x9b\x0f\xe7\xae\xdf\xb7\x41\xd6\x6d\xab\x21\x37\xbd\x9b\x3d\xbb\x34\x16\x32\xc7\x2d\xeb\xe0\x23\x49\x21\xc7\x29\x91\xb5\xe9\x4b\x05\xdd\x6f\x06\x70\x70\x09\x5c\x0a\xca\x15\x19\x59\xe4\x0d\xbe\x7e\xc7\x48\x38\xb0\x8f\xa1\xae\xf2\x25\xc3\x6b\x6e\xe6\x2e\xc1\xf0\xa2\x8a\xb9\xaf\xa5\x81\x37\x10\x71\x41\x1c\x5c\x02\x6a\xbe\xc1\x01\xf8\x16\x2e\x6f\x7c\xa7\xee\x32\x47\x1d\x27\x5b\xf1\x4d\xdc\x64\x79\x36\x3f\x53\xe1\xae\x2b\xf6\x5e\xb6\x90\x19\x6a\x01\x0f\xe2\xe0\x12\xc8\x92\xa1\x67\xd0\x79\xa8\xcc\x39\x61\xa4\x7b\x17\x33\x99\xa9\xce\xad\xf9\xba\x4f\x94\x72\x11\xc7\x2e\x92\xb9\x10\x5d\xf9\x07\x6a\x84\x04\x40\x1c\x74\xbf\xf9\xef\xbe\x19\x34\xb9\x9e\xba\xd7\x18\xe7\x73\x10\x54\xf5\xf0\xd3\x3c\xb9\xad\x85\xef\x4e\xed\x47\x7c\x89\x46\x16\x9c\x1e\x49\xa1\x9b\x34\xe3\x61\x29\x56\xb9\x52\xd0\x5e\x23\x80\x83\x4b\xc0\x35\x32\xfc\x9b\x4b\x9a\x00\xf9\xc8\x88\x06\xf6\xce\xbe\xbe\xef\x6f\x45\x49\x17\xda\x1e\x79\xe2\x84\xa7\x8a\x9f\xac\x0b\xae\x41\xaf\xd6\x81\x38\xb8\x04\xa6\x23\x39\x6f\x79\xf3\x28\x7f\x2c\x57\x1b\x8b\x95\x8e\x55\xb2\x32\xb2\xda\x32\x72\xe9\x4e\xf7\x40\x0a\x39\xf8\x82\xd4\x8f\x09\xf5\x84\x02\x71\x70\x09\x54\x61\x24\x58\xb7\x07\x3d\x47\x76\xa8\xa0\xbd\x96\xc3\x1d\x25\x5d\xa9\x7d\xf1\xdb\xe4\xfd\x07\x3f\x98\x23\xd8\x85\x02\x24\x04\xa0\xfe\x68\x20\x0e\x2e\x01\xbc\xe1\x0b\x0d\x71\x1f\x14\x64\xd6\x8f\x52\x3c\x2e\xb4\x65\x6b\xb7\xad\x22\x31\x9a\x6f\x29\x76\x64\x85\x10\x4f\x14\x4a\x65\x32\x23\xd6\xcb\x20\x0e\xba\xd7\x28\xfc\x77\xcf\x04\xca\x74\xa7\x69\x40\xa0\xf8\x65\xfe\x86\x3a\xd2\x82\xc8\xb0\x5a\x7e\x4c\xe9\x90\xc5\x4a\xd2\x31\xd5\xd4\xf8\xa5\xd9\x05\xfb\x69\x71\x0e\xed\x06\x55\xc4\xd8\x41\x1c\x5c\x03\xec\xef\x0f\x9f\xfe\x8c\xb3\xea\xae\xf2\xa2\x2d\x0f\x7c\xdf\xfe\x1d\xc3\x6b\xe3\x3c\xbb\x74\xd2\xea\xe3\x27\x14\x83\x9e\xa9\xf6\x65\x50\xc7\x45\x00\x77\xa2\x22\xb9\xb2\x8e\x5f\xfd\x53\x76\x95\x36\x34\x87\x89\xc7\x60\xb1\xc1\x44\xf8\x9a\x54\xf4\x85\x8e\x11\xd6\x47\x63\x04\x5f\x06\x62\xa1\xa7\x8a\x40\x1c\x5c\x03\xda\xe4\xd8\xe2\xcb\xc3\xcc\xba\x98\x0a\x07\xc2\x97\xb4\x2f\xc6\xd6\x3a\xde\x9f\x0b\x6d\x13\xa5\xfc\x6e\x17\x8a\xb3\x47\x75\x13\xea\x94\x09\xe2\xe0\x1a\xf8\xe5\x3f\x32\x35\xe2\x6f\xbb\x99\xbc\xbf\xb2\x9b\xfb\x5c\x68\x5e\x63\xed\x1b\xaa\xe7\x1e\xe3\xa3\xaa\x84\x47\x97\x4a\x45\x4b\xdd\x10\x1a\x00\x71\xd0\xfd\x66\x80\x6f\x06\x2d\x3b\x4e\xd3\x00\x33\x9e\x67\x9e\x0f\x79\xfd\xdb\x2b\x78\x5f\x7f\x9c\x6b\xad\xca\xf8\x18\x73\xf9\xee\xab\x89\xda\x1f\xef\x1a\x1e\x99\x1d\x88\xbe\x27\x41\x8c\x1d\xc4\xc1\x35\x60\xa6\x49\x60\x36\xc5\x14\x47\x79\x28\xd7\x6d\xc2\xdc\xb5\xb5\xf8\xee\xe0\xf2\xf8\x4c\xc1\x9b\xc0\x8e\xf8\x5d\x5c\xe6\xb5\x8b\x50\xff\x7b\x10\x07\xd7\x40\x5d\xee\x50\xfa\xf5\x1b\xf9\x6e\xd9\xc7\xda\x62\x51\x1c\xd8\xb3\x62\xd4\xc9\x9a\x89\xb6\x2b\x6b\x4a\x71\x29\x76\xd3\xa4\x5f\xb6\xa1\xbb\xe8\x00\x0e\xae\x81\x47\xe6\xc2\xd2\x99\x95\x3d\x1d\x0a\x4e\x32\xbe\xf5\x3b\x66\x0e\x7a\xe6\xaf\x59\xa3\xb4\xf3\x74\x7a\xf7\xb3\x1f\x72\xa7\xe3\x72\x22\xe2\x82\x38\xb8\x06\xd2\x9e\x77\x24\x4d\xf2\xc4\xe7\x93\x36\xe7\x7e\xef\x9f\x95\xa1\x45\x0b\x2b\xa9\x5e\xc0\xcb\xce\xf3\xfe\x66\xfd\xcc\xef\xbc\x37\xf4\xb0\x37\x88\x83\xe6\x01\x97\xbf\xfb\x66\x90\x85\x3a\xdd\x37\x3b\x21\x6f\xaa\x2e\xc7\xe1\x9a\xf5\x29\xa9\xa1\xb5\xc5\x8c\xd8\x2f\xa9\x9a\x11\x54\xdd\x8c\xc0\xc9\xec\x66\x99\xe9\xa1\x53\xf9\x80\xf0\xa0\x20\xee\xa4\x6f\x36\x50\x7d\xff\x39\xc9\x70\x38\x3e\x42\x17\x6f\x66\x86\x4d\xf8\x8e\x2f\xd5\x98\x66\xfc\xa3\x23\x5d\xcc\x25\x59\xd4\x11\xd7\x67\x6a\x88\xc8\x20\xee\xa4\x6f\xbe\xa3\x9c\xd9\x9a\x39\xff\x5b\x98\xaf\x39\x05\xf3\x49\xc9\x3d\x55\x54\xb9\x5f\xbd\x5f\x1e\xb7\x7a\xa6\xa6\x30\x2f\xab\xd5\xe4\xbf\x41\x44\x06\x71\xff\xf1\xcd\xff\x3c\x23\xf0\x4e\xe8\xfd\x45\x87\xcf\x61\xf6\xf2\x12\x9f\xd5\xb2\xb3\x8a\x6e\x19\xa4\x53\xe1\xe5\x29\x65\x58\x90\xcd\xe2\xd8\xa8\x5d\x35\xbe\x8f\xf0\xcd\x20\xee\x3f\x91\xff\xf3\x57\xfb\x1f\xdf\x1c\xfd\x26\xca\x89\xd2\x47\x12\x9d\x76\x6b\xe6\x56\x53\x0e\xeb\xa3\x11\xc5\x9a\x51\x02\xc2\xf7\x12\x16\x5f\xe4\x36\x51\xbc\x3a\x85\xfe\xf4\xcd\xb5\xf2\x12\x86\x03\x42\x52\xfd\x4b\x0b\x1f\xf4\xee\x7a\x0a\x33\x55\xe8\xb2\x2d\x3f\x78\x3c\x1f\x17\x80\x81\xaa\xbe\xce\xb1\x33\xf2\x07\xfa\x85\xf6\x31\x3b\x6d\x89\x14\x66\x4a\x49\x70\x22\x5a\xc5\xd7\x15\xeb\x2f\x86\x9f\x06\x7e\x61\x5d\xec\xa2\xaa\x71\xf6\xff\xb4\x5a\xfc\x6f\xf3\xcd\xa0\xa1\xfd\x79\xbf\xf9\x84\x6f\xc6\x62\x98\x0c\xc3\x4b\x7d\x3d\x64\x5a\x18\xb8\xdd\xf1\xeb\x39\x21\x5d\x10\xba\x15\x85\x14\xa9\x63\xd0\x81\xcf\xc0\x2b\xca\x95\xc2\xb3\xf0\xcd\x4d\x27\x7c\x33\x72\xfd\x18\x4f\xba\xb2\x0d\x9d\x92\x9c\x99\x52\x74\x87\xc8\xfa\xf4\x48\xc0\xf6\xb2\xd9\xce\xfb\x6a\x2e\x8b\xe7\xef\x70\x86\x62\xce\x64\xe3\xf7\xa4\x6f\xc6\x0d\x0e\xcf\xaf\x3a\xf4\xe9\xe4\xad\xc8\x49\x97\x94\xe1\xd2\x65\xbb\xf8\xd0\x6b\x0d\xf9\xb1\x48\xc2\x66\xf8\x47\x3f\x7f\xb2\xb3\xb9\xdf\x7c\xd2\x37\x53\xae\xfc\x1a\x75\x31\x4f\x17\x79\x22\x73\xf5\x20\xd1\xdd\x61\x38\x3e\x54\x25\x36\x58\x8e\x96\x9c\xd0\xa3\xe9\x20\x61\xb0\x97\xe8\x4c\x46\x7b\xd2\x37\xd7\x75\x73\xef\x13\x4f\x0a\x85\x88\x8f\x3e\x27\xd9\x55\xe7\x16\x0d\xbf\xfe\x44\x68\x17\x9d\x44\x99\xa7\xbc\xb5\x0c\x95\x36\xe6\xd1\x99\xf9\x66\x90\x86\x4e\xcb\x94\x06\x5f\x0f\xf5\x97\x37\xcd\x2f\xf3\x49\x07\x77\x94\x2e\xcc\x77\xff\xc8\xbd\x77\x4f\x38\xf0\x4a\xa0\x35\x73\xb0\x96\x55\xc2\x2c\xf4\x58\x10\x88\x83\x67\xca\x6d\xec\x56\xc3\xfd\x84\x0f\x1f\x1e\x5a\xfc\xb6\xa0\x98\xf5\x9e\x15\xa1\x9e\x74\x5f\x6f\x7b\xdb\x6d\xcc\x5a\xfe\xf5\xb9\x78\x32\xf4\xb8\x11\x88\x83\x67\x4a\xd5\x94\x4e\x4e\x5b\x5e\x89\x2e\x2c\xc6\xf0\x4f\x09\x11\xf7\xd1\x8b\x9a\xb0\xc3\x70\x1a\xa3\x8e\xc2\x4c\x9a\x30\x1f\xe2\x1d\x42\x87\x69\x41\x5c\x90\x14\x92\xff\x9f\x71\xfb\xaa\x51\xbf\x24\x2e\xb5\x62\xaa\x53\x1d\xea\x48\x8e\xbb\xd2\xd5\x7f\x91\x6b\x36\x69\xcc\x30\xf2\xb8\x93\x81\xfa\x29\x0c\x05\x5a\xe1\x83\x38\xf8\xf7\x35\xf3\xc7\x36\xa4\x17\x75\xa4\x72\x4e\x3c\xc6\x6a\xbd\xcc\x6a\x58\xef\xf1\x9a\x49\x3a\x63\xab\x51\x34\xe4\x3e\xb6\x21\x19\x4a\x15\xc2\x34\x81\x38\xe8\x7e\xf3\xdf\x7d\x33\xe8\x1f\xfa\xd4\xa3\xfa\x7e\x1e\xea\x02\x9b\x19\xfa\x9f\x19\xde\x3d\xf7\xcb\x8f\xd4\x95\xbf\x6b\xfb\x25\x84\xbd\x22\x3a\xaf\xd2\x31\xc7\x48\xe5\xdc\x7b\xe8\xa8\x3e\x80\x83\x4b\x40\xa8\x3f\x76\xbe\x04\x19\x99\xc4\x9f\xfe\x25\x5e\xd9\x45\x47\x62\xdb\x9e\xd7\x46\x9e\x45\xfb\x33\x9f\xaa\x2f\x3b\xd1\xbf\x14\x84\xde\xb4\x04\x71\x70\x09\xdc\xbf\xd4\x3f\x11\xb9\xd6\x6c\x2f\x54\xcd\x38\xae\x8a\xae\x4e\x4f\x9b\xad\x70\xd9\x5e\xc6\x27\x9b\xed\xe9\x8f\x86\x1c\xe4\x3c\x6d\x44\x5c\x10\x07\x97\x80\x37\x5d\xfa\xc2\x8f\xf1\x11\x7e\xd5\xc6\xf7\x51\xfa\x4f\x93\xec\x51\xbe\x66\x2d\x0b\x7b\x51\xb0\x71\x32\xe4\x13\xdd\xf3\xc4\xfb\x85\x88\x0b\xe2\x4e\xec\xe7\xe7\x68\xa3\x8c\x09\xda\xd9\xbd\x9f\x32\xfe\xc4\x89\xb4\x41\xaa\x83\xf1\xf5\x32\x4f\x83\xc6\x9d\x83\x2b\x04\x64\x95\x96\x92\xaf\x11\x12\x00\x71\xd0\xfd\xe6\xbf\xfb\x66\xd0\xe4\x7a\x9a\x04\x08\x17\x24\xfb\x18\x3e\xe0\xfa\x39\x30\x8b\x46\xf8\xec\xde\x16\xf7\x3a\x72\xa0\x78\xf8\xe6\xb6\xca\x43\xf4\x34\x2d\x5a\x4c\x16\x68\x4f\x10\xc4\xc1\x25\x40\xb2\x5b\x61\xe8\x9e\xf4\x9c\xbd\x23\xab\xd1\x91\x53\xc0\x29\xa0\x65\x1c\x4d\x6a\xf9\x8e\x1c\x3e\x86\x9e\x88\x1d\x57\xe4\xe1\x13\x44\x5c\x10\x07\x97\x40\x7f\xd4\x1b\xd5\x79\xcc\xab\xe2\x09\xba\x4d\x0a\x11\xfd\x02\xc4\xce\x25\x2a\x97\x9a\xb2\xf6\x3f\xd4\xa7\x31\xe5\x12\x2a\xd5\x43\x3d\xa1\x40\x1c\x5c\x02\x1a\x71\x4d\x32\xa4\x82\x4c\xc1\xa3\x77\x55\xde\x5c\xa6\x18\x94\x7a\xeb\x60\xe9\xda\x56\xf9\xa1\xe6\xc5\x47\xc7\xb0\xe2\xfb\x81\x49\xd0\xfd\x4e\x00\x77\xe2\x99\xdb\x00\xf5\xdd\x6b\xb9\x46\x1c\xd9\xdf\x8f\x1b\x09\xbd\x3c\xdc\xa9\xa8\xb3\x5f\x33\xe2\x78\x54\xec\x9d\xc3\xdd\x2c\xbe\xa6\x7c\x15\xb1\x5e\x06\x71\xd0\xbd\x46\x80\x6f\x06\x65\xba\x53\x7b\xaa\x3f\xfb\x5e\x9b\xe7\xc5\x13\x57\x4d\x5a\x75\x31\x1a\x8d\xc0\xe1\x3c\xa6\x99\x77\x56\x83\x83\xaa\x69\xd7\xc1\xac\x84\x42\x10\xd4\xfe\x1e\xc4\xc1\x35\xe0\x2f\x89\x9c\xbb\x62\x3b\x91\xcc\x3e\xae\x63\x32\xda\xfe\x21\xf9\xb3\x94\x74\x2b\xaf\x86\xfc\xb8\x2c\xc5\x60\xb7\x71\xff\x53\x27\xe8\xdc\x33\x80\x83\x6b\xa0\xef\x3e\x9f\x94\xd1\x0b\x2d\xad\x0d\xcd\x0b\x7a\x8d\xa1\xa4\x6b\x43\xfe\x4d\xc3\xe3\x11\x94\x98\xad\xbf\x91\xb5\x5e\x3a\xaa\xf3\x41\x33\x36\x80\x83\x6b\x40\x51\xa0\x55\x3f\xba\x4c\x2d\xf1\x33\xbf\x29\x52\xfa\xbd\x8d\x98\xc8\xaa\x97\xec\x0e\x42\x5e\xb3\x8c\x01\x15\x59\xdf\xf4\xbd\xd6\x10\x71\x41\x1c\xfc\xfb\x36\x34\x67\xd3\xff\x28\x92\x8f\x1d\x09\xf9\x1e\x1a\x30\xbb\xfe\x42\x25\x7c\x7b\xfb\x02\xaf\x3a\x2f\x23\x07\xb6\xd2\x2f\x7d\x79\x76\x84\x06\x40\x1c\x74\xbf\x19\xe0\x9b\x41\xcb\x8e\xd3\x34\x30\xcd\xb6\x6d\x5c\x20\xcc\xf3\xaa\x25\x76\xd3\xfa\x90\x6b\x9d\x44\x96\x24\xcf\x0c\x8d\xfc\x57\x78\xbf\x8a\xae\xda\xc0\x61\x35\xf4\x4d\x41\x1c\x5c\x03\x92\x1f\xa7\xcc\xfb\x8c\xa6\xcc\x70\x26\xa5\xd4\xe8\xb3\xde\x6b\x3c\x18\x34\x4e\x71\xd5\xbc\x4c\xd5\x19\xe6\x87\xdf\xc6\x27\x50\x04\xdd\x17\x06\x70\x70\x0d\xb8\xa7\xd6\x93\xa1\x5e\x88\xef\x96\x91\x55\x4f\x2d\x6c\xb9\x2a\x70\x37\x03\xf5\x62\xed\xfb\x40\xb2\x8b\x52\x62\x0e\xe7\x17\x32\x9f\x21\xe2\x82\x38\xb8\x06\xde\xb5\x1c\x20\x17\xdf\x1d\x72\xa3\x9e\x8d\x2e\xcd\x8b\x32\x67\x51\x36\x99\x7e\x67\x8f\xff\x4c\x48\x2a\xd1\x7d\x28\xb3\x17\x19\x7a\xb2\x01\xc4\xc1\xbf\x6f\xda\xf8\xdc\x0d\xf3\x47\x05\x1b\x5a\x12\xc6\xb5\x37\xf7\xb9\xbe\x55\x7d\xb0\x25\x67\xff\x71\xbf\x98\xa8\x77\xd6\x14\xd7\xaa\xde\x14\xf2\xcd\x00\x0e\x9a\x07\x00\xbe\x19\x64\xa1\x4e\xf7\xcd\x4b\xa2\x5e\x5c\x2f\x9c\x95\x6c\x6f\x2c\x36\x11\xfa\xc4\x48\xf6\xbb\x1f\x1d\x51\xa4\x2d\x98\x5b\xc4\x2c\x55\x4e\x97\x65\x05\x3d\x45\x78\x50\x10\x77\xd2\x37\xc7\x38\xe9\x50\xbd\x94\x0f\x38\x8a\xf0\xf0\xa1\xbf\x4f\xfb\x98\x96\x35\x33\xbc\xe6\x59\xaa\x75\x64\xd4\xc2\xad\x1b\xe7\xfa\x97\xb7\x11\x91\x41\xdc\x49\xdf\xcc\x4a\xfd\x42\xe3\x3a\xe7\x90\xcb\xbc\x6d\xec\x64\x8b\x42\x72\xb4\x0c\xce\x3d\xdb\x82\xe3\x3b\xf7\xcd\x24\xcd\x1e\x7c\x24\xe8\xa9\x47\x44\x06\x71\xff\xdf\xdd\x22\xff\x63\x59\x70\xf1\x53\xe4\xe3\xe9\x70\x69\xbc\xdd\xb4\x40\x3d\x1d\x0d\xcd\x87\xad\x28\x96\x8f\x2e\xea\xcf\xf4\xd5\x18\x68\x64\x6b\xeb\x5d\x42\xf8\x66\x10\xf7\xff\x23\x9f\xfb\xd3\x37\x7f\x78\xe8\xd8\x49\x87\x82\xdd\x98\xb6\x93\x44\xa0\x39\xdc\xb3\x3d\xe1\xa3\xb4\x57\xbd\xf1\x5a\xc2\xe7\xb6\x52\xbc\x5b\xc3\x13\xa2\x3f\x7d\xf3\x43\xa3\x43\x83\x0a\x13\x12\x0b\xc5\x5c\x17\x27\xcc\xcb\x14\xe7\xa8\x29\x68\xba\x75\x55\x23\xc7\x1c\xb3\xbf\xde\xb8\xcf\x30\x41\xf8\x07\x9a\x43\xdc\x55\x55\x1a\xe8\xfd\x24\x9b\x68\xaa\x36\xfc\xc1\xaa\xc7\x3a\x8a\xd3\x8a\x2b\xb9\x5c\x9f\x71\x08\xc6\x8f\xa8\x0c\x8e\xa1\x7f\x8b\x6f\x0e\xb8\xf0\x7f\x1b\xda\x9f\xf7\x9b\x4f\xf8\xe6\x74\x05\x7a\x9c\xdf\x3b\x24\xc2\x31\x33\xd8\xeb\xd5\xbb\x49\x75\x0e\x25\xba\xba\x2e\xf6\xb4\x96\x64\xf3\x51\x95\xfc\xa9\x96\x4e\x67\xb2\x17\xca\x79\xc2\xd3\xf9\x0a\xeb\x5b\x79\x57\x17\x54\x8c\x4c\x4a\xb5\x94\xe2\xf4\x39\x86\xf1\x4e\x44\x77\x10\x2a\xdf\xdd\x0d\xa3\x7a\xa3\xff\xe1\xfc\xea\x99\xec\xfc\x9e\x34\xce\x34\x69\x43\x77\x08\x03\x23\x59\x16\x91\x2b\x87\xc4\x77\x9a\xd2\x93\xcb\x15\xd1\x16\x74\x49\x93\xb9\x2e\xa6\xf3\x69\x4d\x4d\xa3\x9e\xc9\x68\x75\x4f\xfc\xd8\x18\x3b\x1b\x37\x67\x56\x64\x92\xb9\xde\x12\x96\x6b\x6d\x19\xdc\x06\xa2\xf6\xcc\x9c\x7e\xcc\x03\x0a\x51\x9a\xdf\x7b\x4d\x5c\x2a\xcf\x64\xb4\x27\x8d\x73\xb9\xfa\xfd\x1f\xb5\xce\x47\x95\x09\x41\x7d\x75\x92\x9e\x8d\xc8\xb1\xe8\xb1\xe1\x1a\x34\xc3\x64\x5b\xfe\x53\x2d\x19\x2a\x7d\xc3\x67\x66\x9c\x41\x22\x3a\x2d\x55\xba\xdf\x1c\xf2\x59\xd4\x47\x3a\xec\x99\xda\x38\x1f\x23\x62\xd7\x33\x86\xcf\x33\xd5\x35\xd7\xf5\xca\xcf\xc7\x8d\x90\x29\xcc\x15\x1b\x4a\x3d\x00\x0e\x9e\x2a\xa7\xee\x27\xd7\x4f\x90\x4e\x70\x8a\xc6\xd0\x58\x22\xf1\xbc\x53\xfe\x3c\x93\x40\x79\x33\xa4\xee\xcb\x81\xb0\x43\xc3\xc7\x84\xda\x68\x44\x5c\x10\x07\x4f\x95\xef\x45\xf0\x6b\xe5\x90\x2b\xed\xf1\xd4\xde\xd3\xb8\x47\x3e\x39\x30\xe6\xbf\x5d\xf9\x4d\xd5\x76\xe1\x7b\xbd\x59\x02\x6a\xc0\x2f\xe8\xe9\x09\x10\x07\x4f\x95\xa2\xbc\x34\x54\xdc\x11\x35\xbc\x8d\xcf\xeb\x89\x59\x8d\x9b\xfb\x5a\x72\xd0\xe3\x95\x7a\x1e\xb2\xdd\xf0\xdc\x63\xfe\x7e\x1e\x5f\x1a\x11\x17\xc4\x05\x49\xfd\xf3\x98\x8f\xdc\x47\x25\x0e\xaa\xf3\xf6\x35\xc2\xcd\xe2\xc5\x7c\x64\xef\x66\xa8\x0e\xea\x3c\x08\x7e\xf9\xd0\xe5\xa1\x32\xd5\xb3\xeb\xc9\xb4\x22\x5c\x13\x88\x83\x2e\x38\xff\xdd\x38\x83\xfe\xa1\x4f\x7d\x81\xe6\xfc\x05\x24\x25\x0b\x9f\xba\x34\x06\x7e\x2f\xbe\xcb\xcf\x0a\xfa\x8c\x2b\x7b\x22\xdd\x26\xe5\x45\x74\x33\x1c\x97\x65\x15\xa1\x6e\x48\x20\x0e\x2e\x01\x59\x1d\x27\xae\x9d\x25\xe2\xc2\x9a\x88\x49\xab\xc4\xa7\x02\x5d\xfd\x13\x3b\x23\x0a\x68\xbd\xb5\x4e\xb6\xbd\x2f\xb5\x7f\xaa\x43\xaf\x10\x81\xb8\x13\x2b\x66\xe6\x70\xbe\xdc\x3c\xbc\xa0\x18\x77\x75\x2b\x8c\xa4\xc3\xcb\xcc\x0d\x59\x4b\x01\x19\x63\x5c\x21\x1b\x7d\x5a\x98\xdd\x52\x14\xd0\x8a\x19\xc0\xc1\x25\xf0\xcc\x63\x6c\x73\xd2\x42\xe2\x37\x55\xc7\x85\xd4\x99\x49\x7b\xe4\x5f\x1c\x62\xb8\x76\x6d\x7a\xd9\x58\x0d\xcc\xf1\x06\x4f\xf8\xa0\x07\xb9\x40\x1c\x5c\x02\x0f\x9b\x44\xc7\x53\xcb\xee\xe5\x6f\x84\x33\xea\x8b\xe8\xc8\x66\x77\xd2\x5b\x34\x5c\x51\x18\x59\x12\xae\x15\xba\xfb\x74\xf3\xeb\x75\xc4\x6a\x09\xc4\x41\x37\x1b\x39\xff\xbe\x62\x06\xcd\xae\xa7\x69\xc0\xd8\x33\xfa\x16\xaf\x18\xc1\xb5\x1b\xd2\x1d\xec\x77\x62\x46\x6d\x5e\x4b\xf9\x7f\xa6\x2c\x0f\x51\x69\x0e\x4b\x37\x91\x90\x74\xfc\x89\x18\x3b\x88\x3b\xf1\x12\xd5\x1b\x69\x7d\x14\xab\x05\x22\x6a\x8b\xe6\xe0\x16\xf3\xfc\x6b\xd1\xef\x9a\x88\xca\xe7\x6d\xe9\x9f\x15\xf3\x92\xe7\xee\x5b\x43\xcd\xda\x41\x1c\x5c\x03\xf3\xcf\x30\x0b\xf3\x3a\xcd\xd9\x34\x2a\xb1\x09\x0e\xd9\x63\xef\xad\xb1\xba\xe9\x7f\x9a\x19\x62\x20\x70\x67\x17\xee\xb3\x25\x83\x5e\x86\x06\x71\x70\x0d\x6c\x23\x4b\xb4\x35\xaf\x30\x8e\x1d\xaf\x3b\x47\x98\xf4\xa8\xbe\x3a\xb4\x0a\x67\xb4\x8e\x6f\xe4\xd4\xd8\xab\xbc\xd6\x6e\xdf\xaa\x03\xd5\xfb\x00\x1c\x5c\x03\x1c\x82\x34\x47\xab\x6b\xcf\x64\xaa\xb0\x7a\x4a\x6f\x5f\x5d\xa5\xc2\xda\x35\x5c\xa7\xf3\xdc\xd6\x9a\xd8\x94\x24\xb0\xb1\x20\xfd\x09\x75\x53\x06\x70\xd0\xcd\x46\x80\x73\x06\xa5\xba\xd3\x34\x90\xad\x16\x49\x3a\x70\x61\x47\xb6\xc9\x90\x5e\x65\xfc\xfb\xe5\xf2\x2e\xcc\xb7\x3b\xa2\xa3\xc2\x84\xe9\xf2\xd7\xdd\x95\x8b\x50\xa1\xb3\x47\x20\x0e\xae\x81\xeb\xa5\x9b\x21\x6d\x43\x3e\xc7\xad\xf6\x9e\x3f\xab\x6d\x78\x55\x9e\x75\xef\x69\xbf\x59\x64\xce\xe6\xe0\x53\x33\xa6\xda\x59\x58\x80\x1a\xe0\x03\x38\xb8\x06\x6e\x3f\x8b\x3e\x8e\x6a\x9a\xdc\x6e\x23\x13\xf5\x16\xe8\x15\xc0\x4c\x7e\xce\x22\xff\x9a\xf4\x41\xbf\x2e\xbd\x69\x6f\x40\xb9\x60\x04\x22\x2e\x88\x83\x6b\x20\xb3\xb1\x98\xc2\xff\xda\xf0\x3b\xeb\xfc\xf2\xb4\x61\xb5\xf1\xa2\x67\x53\x8f\x99\x96\x48\x7d\x4b\x2e\x39\xd3\xf4\xef\x1a\xaa\x9e\x87\x7a\x65\x02\x38\xb8\x06\xd4\xee\x8d\xb0\xd1\x67\xfb\x27\x06\x5d\x13\xf1\x97\x72\xfa\x55\x41\xf4\xa2\x60\x53\x34\x87\xba\x70\xff\xa6\xb0\xef\x04\x52\x54\x31\x54\x3d\x01\x70\xd0\x3c\xa0\xfb\x77\x0d\x80\xd6\x1d\xa7\x76\x06\xa3\xb8\x44\x96\x4e\x78\x68\x5d\x65\x3c\xf9\x32\x3e\x64\x3d\x79\x2f\x67\xee\xf8\xbc\xa0\x74\x16\x76\xce\xdc\xa4\x7d\xc7\x33\x66\xa8\x72\x04\xe0\xe0\x1a\x58\x68\x32\x8f\xbd\x76\x14\xfa\x65\xe5\xb5\x5e\x27\x49\x28\x6f\x76\x23\x7f\x44\xfc\x46\xb6\x97\x5b\x8a\xca\xd6\x53\xad\xa5\xcc\x5d\x44\x5c\x10\x07\xd7\x00\x6f\xc9\xb9\xe1\xca\xdd\xf8\xf0\x78\xce\xa3\xcf\xe7\x2f\xbc\x52\xe7\xd9\x7a\x32\x26\xd7\x6a\xab\xd5\xe7\xc2\xea\x39\xa0\x53\x02\xbd\x3c\x0f\xe2\xe0\x1a\xb8\x1a\xe5\xa0\x32\xca\x57\x78\xf7\xd3\x46\xf0\xdc\xd6\x51\xa4\x3b\x37\x66\xd5\x5a\xa6\x80\xc0\xff\x63\xee\xbd\xc3\xb9\x7c\xe3\xff\x6f\x0a\xc9\xde\x7b\xef\xbd\x47\xf6\x26\xb3\x10\x91\x5d\x24\xa1\x6c\x21\x9b\xac\x6c\x91\x64\x46\x36\x49\x36\xa1\x64\x93\x64\x67\x84\x92\x11\xb2\x49\xb8\x8f\xdf\xef\x3e\xde\xd7\xb7\xcf\xf5\x76\x7f\xce\xef\x7d\x1c\xfe\xf8\xfc\xff\x38\x5e\xde\xe7\xe5\x79\x9d\xaf\xf3\x79\x9d\xe7\xeb\x75\xb6\xc9\xbc\x6c\x33\xf1\x7c\x4d\x0b\xdd\x74\x07\xe2\xe0\x1a\xb0\xc4\x5a\x6b\x63\xff\x28\xf6\x78\xd8\xa8\x4a\xb7\xa2\xf4\x17\xde\xe8\xce\x08\x25\x65\x7c\xf1\xae\xca\xea\x01\x5b\x8b\x56\xf8\x02\x42\x03\x20\x0e\x9a\x07\x00\xce\x19\x64\xa2\x4e\x77\xce\x69\xc9\x64\x9b\x21\xd3\x61\x7b\x4e\xd5\xbc\xd8\x3c\x97\x13\x69\x67\xed\xa4\x6a\xf7\xe5\xd9\x4d\xd3\xaf\x07\x8d\x72\x73\x3a\xb0\x23\x5c\x28\x88\x43\x76\xce\x17\x68\xb9\x71\x2f\x64\x98\xe9\xc5\x18\xfc\x36\xea\x0d\x19\xc2\xe3\x64\x70\x9e\x78\x2d\x18\x32\x33\xa0\x7d\xfd\x16\x45\xe6\x10\x29\x22\x32\x88\x43\x76\xce\x8d\x12\x9f\x2c\xd0\x2f\xc8\x90\x08\x8e\xf6\xcf\x91\x17\x48\xb6\xa0\xca\x16\xcb\xde\x6b\xfe\xa6\x13\x62\xb7\xce\xd4\x1c\x65\xbc\x8f\x88\x0c\xe2\xfe\xaf\xbf\xfd\x87\xc6\x80\x37\x38\x23\x8c\x30\x7b\x29\x99\x01\xf3\xc6\x13\xb3\x42\x61\x31\x79\xf6\x36\x16\xf5\x51\xca\xcb\xe7\x03\x3f\x3c\x6e\x98\x89\xf7\x16\x0a\xf2\xda\x1a\xf8\xdb\x08\xe7\xda\x6b\xdc\xf2\x2d\xfc\x32\x4a\x20\xbe\xfb\xe4\xcd\x18\x4f\x2d\xf6\x0b\xc3\xc3\x8b\x2d\x69\x4a\x73\x74\x09\x26\x83\x55\x32\xf5\x7f\xa1\xbf\x3a\xfd\x57\xab\x2d\x73\x46\x54\x02\x43\x57\x96\x66\x2f\x84\x1b\xd5\xba\x2d\xe8\x94\x37\xf6\x26\x14\x9a\xfa\x38\x1f\x7a\xf9\xfc\xd7\x8c\x30\x68\x68\x7f\x17\x2c\x23\x19\x61\x5a\x57\x91\xbe\xa5\x43\x0c\xc6\xf5\xdb\xb8\x7a\x5f\xf5\x94\xb2\x0b\xcb\x34\xb6\x26\x89\x87\xbc\xeb\x8f\x3e\x9b\x15\x16\xbc\x3a\x83\xaa\xd6\x28\x65\x79\x64\x23\x1c\x43\xca\xe5\x8d\x52\x71\xae\xa1\x44\x31\xb3\x9e\x52\x86\x9c\x68\x01\xc3\x41\x6d\xe4\xb2\xdc\xa4\xf1\x89\x23\x77\xbb\x28\xe3\xd4\x99\x6c\xe5\x22\x1b\xe1\x6d\x42\x8d\x8f\x3b\x6b\x13\x3c\xcd\xf7\xbf\x4f\xc9\x49\xd1\x5c\xaf\x35\xbd\x22\x9c\x90\x77\x27\xe4\xdd\xc5\x15\x03\xfb\x35\xb1\x33\xe9\xf4\x25\x8f\x6c\x84\x63\x82\x2d\x03\x27\x16\x9f\x19\x56\x5e\x31\x8e\x18\x90\xed\x3e\xc0\xc1\xf0\x29\xda\x67\x5a\xd2\x93\xe4\xb4\x14\xe2\x21\xde\x93\x3e\x93\xd1\x22\x1b\x61\x8c\xfc\x81\x8f\xcf\xca\x6c\xce\x19\x55\x9f\x50\x9b\xac\x86\x38\x7e\xd2\xfd\x33\xab\xf6\xf9\xc6\x56\x6d\xeb\x62\xef\x9f\x1b\xbf\xff\xff\xc8\x12\xd0\xe9\x0b\x20\xa2\xd3\x32\xdf\xa3\x44\x6b\xa1\x3a\x69\xed\x2a\xd4\x99\x8d\x3a\x85\x7c\xf4\x17\xcf\xcd\xd6\x4c\x47\xe4\x34\x71\x7e\x2d\xdc\x7f\x6e\x3e\x33\x82\x8f\x98\xf1\x41\x1c\x3c\xf3\x09\xff\x8e\x72\x7d\x7a\xd8\xfd\xf9\x06\xf1\xf3\x84\x67\x1d\x0a\x93\xf3\xbb\x4e\xe3\x33\x6c\x46\xf7\xe6\x73\xb9\x67\xf5\x71\x59\x6f\x20\xe2\x82\x38\x78\xe6\x7b\x11\x80\xcf\xd5\xf1\x58\xe2\x75\x98\xb4\x70\x19\xd6\x89\x22\x97\xb8\x68\xd6\x87\xef\xd2\x2f\x3f\xec\xdb\xea\x6e\x7d\x8b\xb3\x7e\x01\xb5\x63\x02\x70\xf0\xcc\x27\xd1\x85\x92\x1b\x19\xac\x8e\x11\xdf\x71\x1c\x2f\x9d\xb7\x6a\x59\xca\x9f\xbf\xe9\x35\x43\xc3\xfb\xda\xf3\x4d\x08\x86\x88\x69\x3c\x22\x2e\x88\x0b\x56\x44\x39\xf7\x0f\x27\x60\x54\xeb\x57\x34\xbd\xcc\x18\xf1\x50\xe2\xe4\xd1\xe0\x6f\xd6\x68\xad\x49\xbc\x2b\x0b\x29\x87\x19\x58\xb8\x4c\x49\x51\xa9\x94\x08\x23\x0c\xe2\xa0\x8a\xe5\x7f\x37\xc2\xa0\x17\xfa\x34\x09\x30\xf2\xa4\x17\x8b\x52\xa4\x0a\xad\x78\x6f\x65\x5b\x29\xe7\x2c\x92\x34\xe3\xea\x44\x77\x0f\x45\x1c\x56\x9b\x99\x18\x57\x16\xd0\x21\x86\x0e\xe2\xe0\x12\x38\x38\x2a\xbd\x44\xee\x59\xd8\xb7\xe9\xc8\x69\x6f\xfc\x40\x3d\x2f\xef\x13\xd1\xac\xdf\x9d\xf6\xb1\xa0\xb2\xac\x6f\xb7\x24\xae\xfb\x23\xe2\x82\x38\xb8\x04\x18\xaa\x37\x12\xce\x15\xac\x28\xef\xcd\xf9\xd7\xf2\x73\x7a\xbb\x3c\x77\x90\xb6\x2f\xa5\xd2\xe6\x2a\x10\x47\x5f\xf5\x68\x4a\x56\x46\xc4\x05\x71\x70\x09\x3c\xe8\xe4\x8d\x9a\xa5\xc0\xfa\x99\x9d\x90\x39\xe9\x93\xf9\xe0\x29\x13\xf1\xee\x87\xbb\x5d\xdd\xef\x69\xc6\xea\x35\x23\x2b\x7b\x9e\x22\xe2\x82\x38\xb8\x04\x12\xfc\x16\xe7\xdd\x79\xdc\x1f\xb7\xcc\xa2\x34\x7f\x44\xbd\xe4\xaa\x91\xfd\xdb\xcc\xac\x3f\x75\xf0\x22\x7a\x29\xc3\xd2\x7e\x9c\x29\x62\xf1\x03\xe2\xa0\x52\x45\x80\x11\x06\xcd\xae\xa7\x69\x40\x75\x6f\xca\xbd\xca\x0b\x8d\x64\xe1\xb1\x4f\x68\x88\xc2\x50\xac\x61\xb5\x06\xe5\xa4\x66\x16\xf6\xbb\x3f\xda\xa5\x47\xf1\x2e\x50\x8b\x1f\x10\x07\xd7\x00\x2b\xba\xea\x43\x94\xe6\xe6\x76\xcf\xd4\x8f\xd5\x6d\x2b\x1d\x03\x49\xac\x87\x1f\x39\xaf\x6d\x3c\x9a\xc1\xa1\x77\x48\xf2\xfa\x8c\x01\xb5\x5d\x06\x70\x70\x0d\x08\xfa\xa6\xe4\xbe\xef\x13\xb4\xf6\x8b\xf5\x3a\xa8\xab\x54\x8d\x5a\x37\x5d\x0c\x6c\x0b\xb0\x28\x2c\xda\x3a\x56\x22\x61\xc2\x81\xb6\xbc\x41\x1c\x5c\x03\x66\xe1\x1a\xbc\x5f\xef\x70\xd7\x8f\xc9\x1f\xb1\xbc\x6e\x9a\xdb\x27\x8b\x0b\x58\xa9\xec\x16\x9d\x65\x24\x75\xde\x3b\x40\x3d\x18\x42\xc4\x05\x71\x70\x0d\xf0\x62\x44\x36\xf1\xcd\xf9\x10\x65\x49\x75\x3d\xa7\xa8\x16\x6c\x3b\x4f\xd2\x65\x1b\xeb\x85\xad\x81\x9a\x3b\xec\x91\xdf\xcb\x62\x81\xd0\x00\x88\x83\x4a\x15\x01\x46\x18\x94\xea\x4e\xbd\x2c\xc1\x16\x4d\x97\x8a\x40\x81\x8f\x1a\x83\xc8\xd5\x5d\xd8\x4f\x88\xe9\x37\xb1\x66\xcc\xf9\xfb\x6a\xac\xf2\x86\x9f\x79\x1e\x3a\x75\x40\x06\x10\xc0\xc1\x35\xc0\xad\x89\xdd\x53\xe4\xb6\xbe\xe8\xc7\xa4\xc9\x55\xab\x12\x6f\x45\xe7\x4a\x1d\xa6\xe6\x5f\x66\xfb\xbb\xd6\xf6\xc6\x89\x31\x09\x94\x0a\x40\x1c\x5c\x03\xd2\x66\x17\xae\xaa\x30\x10\x37\x0e\xf9\x79\x57\xd6\x91\x74\xb5\xf5\xe7\xcb\x7e\xbc\x62\x59\x62\xf4\x91\xad\x6e\x4f\x73\xf8\x1d\xd4\x46\x0e\xc4\xc1\x35\x40\xf2\x96\x3f\x13\x13\xbf\x73\x2a\xa6\xa4\x2d\x7d\x39\xfe\x29\x75\xb8\xc7\xb5\xaa\xcd\x96\x44\x74\xe7\x2b\x9a\xd3\xc1\xaa\x3e\x44\xd0\x71\x0a\x00\x07\xd7\xc0\xa7\xce\x48\xa6\xfc\xe1\x40\xba\x4a\xdc\x36\x5b\x55\x3a\xfd\x84\xce\x62\x6e\x17\x23\xfd\xb4\x3c\x03\x4e\x33\xbe\x27\x7e\x85\x2b\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\x34\x0d\x94\x2e\x73\x7e\x1b\x5d\xb8\xb6\x9d\x2c\xf1\x98\x50\x17\x33\xb8\x41\xb3\xd8\x53\x47\x87\x29\x1e\xcd\xf5\xa4\xab\x28\xec\x60\x50\x04\x31\x76\x10\x07\xd7\x80\xb9\x21\xda\xa8\x7c\x5b\x9c\x9b\x74\xed\xdb\xb1\xca\x3f\x5a\x58\x98\xf1\xc2\x8d\x57\x97\xee\x60\x96\xec\xe0\x1d\xf9\x1d\xa6\x41\xa7\x73\x40\x1c\x5c\x03\xc3\x5a\x8b\xde\x7f\xe6\x86\x7e\x19\xf0\xd9\x9c\x9f\x0e\x70\x4f\x24\x79\xf6\x5a\xde\xc4\xdb\xe3\xab\xd6\x14\x8f\xc9\x8f\x60\x49\x3b\x44\x5c\x10\x07\xd7\xc0\xe4\x8b\xe6\xc6\xdc\x78\x6c\xac\x5b\x97\x92\x2b\xf4\x4c\x71\xd4\xea\x72\xf2\xe7\x08\x53\xdb\x82\xcd\xbf\x67\xad\xed\x45\xa5\x40\x47\xd0\x41\x1c\x5c\x03\xb4\xbc\x91\xed\xea\x98\xe4\x71\xe6\xa1\x7b\xae\xa4\x85\xca\xae\xdd\x86\xa8\xc5\xe6\xf1\x4e\x97\x0d\x69\x09\x83\xf9\x89\x6e\x3f\x40\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\x4c\xd4\xe9\x46\xf8\x0e\x99\x4f\xab\x11\x6d\xca\x75\xdb\x5d\x71\xbf\x3f\xe3\x95\x1d\xb6\x44\xe5\x2c\x6d\x29\xb4\x43\xcd\xeb\x52\xcc\x95\xf7\x62\x2d\x10\xa6\x12\xc4\x21\x1b\x61\x3c\x47\x0a\x92\x3f\x6c\xfe\x92\x9e\x61\xa8\xef\x7d\x94\xf5\xeb\x2b\xc7\x07\x9d\xbe\x2c\xa3\x70\x33\x06\x58\x84\xf7\x90\x8e\x8c\x20\x22\x83\x38\x64\x23\x8c\x6b\xb3\xa6\xcf\xe9\xa0\xde\xfd\x51\xee\x7a\xa6\xc2\x8c\x5e\x00\x36\x27\xb1\x48\x59\x81\x88\xd4\xd6\xc1\xa5\xe3\x6f\x95\x05\xf2\x88\xc8\x20\xee\xff\x1a\x61\x82\xbf\x23\x03\xaf\x64\x46\x18\xe1\x19\xc2\xa7\xfe\x77\x63\x8a\x9f\x5e\xfa\x4c\x33\xab\x54\xf7\xc5\x47\x44\x68\x27\x09\xf7\x24\xb0\x64\xdc\xe5\x9c\xc2\xfe\x63\xd6\xf0\xbf\x8d\x30\xd9\xec\x73\x8b\x5a\x3a\x16\x1d\x09\x8e\xd9\xd2\x89\x1d\xa9\xe3\xc0\x42\xde\xe0\xcb\xdd\x59\x56\x34\x02\xec\x92\xf9\xc9\x4f\x57\xfe\xfe\x90\xe8\xf6\x29\xf3\x58\xc1\x4b\x97\x6a\xe1\x8b\x7d\x69\x39\x7e\x3e\x67\xb4\x5f\xe1\x1e\xc5\x76\x52\x8b\x5a\x53\x46\xe6\x1a\x7b\xe6\x7f\xcd\x08\x83\x86\xf6\x77\x05\xb2\x0a\xdc\x2c\x75\x0c\x10\x7d\x15\x46\x7f\x6d\x13\x8d\xc5\x12\xdb\x36\xd4\xd1\xa6\x5f\x83\xbf\xa4\x61\x18\x87\x6b\xb1\xdf\x15\xe0\x85\xae\x8c\x7e\x26\x9b\x95\xc8\x46\xb8\xd0\xef\xe6\x05\xf3\xed\xa6\xa3\x72\x9d\x78\x54\x0a\xfe\x46\xaa\x42\x6c\x29\xe3\xeb\x7c\xd3\x9c\x03\xee\x33\x55\x01\x05\x2c\x5c\x67\xb2\x35\x2b\x8d\xf4\x67\xe3\x1a\xf2\xe2\xe9\x76\xbf\xd7\x9d\x4c\x08\x4b\x48\xe7\x63\xbe\x9a\x1c\xa4\x21\x9f\x7a\x4e\x59\x5d\x16\xd2\x32\x7e\x62\x33\xf8\xe8\x4c\x46\x8b\x6c\x84\x83\x53\x7b\xc9\xf9\x5f\x9f\xf3\x66\x12\xe8\x96\x8e\xd5\x9b\xe9\x2e\xd3\x1b\xbd\xf4\xe2\xcd\x83\xe7\x42\x92\xfe\xc3\xdf\x66\xbe\xb2\x9f\xc9\x68\x5d\x91\xfd\xb7\xcc\x06\x8d\x90\xcb\x2e\x5e\x90\xcb\x4b\xb3\x2d\x4b\xa2\x4f\x0e\x77\x8a\x6f\xba\x7d\x73\xf1\x6d\xb8\x94\x88\x2a\x36\xda\xad\x71\x66\x46\x18\x24\xa2\x53\x9b\xf6\x94\x74\x44\x18\xab\xfb\x44\x58\x56\x33\xe6\x45\x27\xb8\x48\xa4\xb7\x8c\x4b\x6a\xae\x92\x4e\xff\x70\x5d\x57\xce\x88\xd5\xd1\x80\x9a\xf6\x00\x38\x78\xe6\x4b\x6e\xea\x7d\xfd\xa8\xe3\x46\x65\xdd\xd0\xc5\xd5\xb0\x6c\xd3\x7b\x95\xb7\x34\x75\x3e\x4f\x5e\x08\x25\x3d\x62\xc9\xdb\xed\xa4\x81\xce\xd1\x82\x38\xf8\xe5\xfe\xef\xea\x6a\xa2\x67\x77\x0f\x82\x19\x5f\x1a\xb8\x8b\xa2\x97\xad\x87\x73\x2b\x67\x65\xa1\x37\xf8\xf2\x62\x3f\xe6\x7b\x73\x48\x0c\xad\xd6\x40\x5c\xb0\x22\xea\x3f\x7e\xef\xe5\xa6\x39\x0f\xe9\x9b\x8f\x9a\x27\x3d\x5e\x5b\xc9\xfd\xaa\x64\xb5\x28\xc9\x2a\x51\x74\xf6\xbd\x7b\x9e\x9c\xd8\x78\x0d\xf5\x7b\x2a\x22\x2e\x88\x0b\x56\x24\xf8\x67\x61\x5f\x20\xc9\x04\x6f\xe7\x61\x54\x38\x9f\x0d\xeb\x15\xe1\xf1\xbc\x5f\xbf\x77\x8c\x48\x53\x75\xd1\x71\x6e\xb5\x48\x32\x57\xe7\xf9\x22\x8c\x30\x88\x83\xfa\x1d\xab\xfc\xeb\xe2\x07\xf4\x42\x9f\x26\x01\x85\x6f\x35\xd7\x77\x0b\x0e\x4c\x65\x0e\x4d\x83\x95\xe6\x13\xb0\xc2\xe5\x8b\x39\x78\x88\xc4\x22\xa7\x3b\xef\xf1\x10\x26\xfc\xcf\x3d\x1e\x20\x0e\x2e\x81\xce\x40\x6c\x72\x31\x87\xdd\xf0\x1a\xe6\x39\xb6\x13\xf1\x45\xbe\x10\xa9\x3b\x37\xbc\xad\xc9\x6f\x76\x8e\x91\xcf\x9a\xa5\x5d\x59\x85\xfa\x20\x01\x38\xb8\x04\x5e\x35\xe8\x36\xd3\x72\x3f\xd4\x5c\x22\x63\xc1\x5b\x42\x0d\x56\x36\x2f\x7a\x7e\x27\x43\xcd\x3e\x67\x46\x61\xd2\xf4\x95\x45\x6f\x22\x74\xe6\x13\xc0\xc1\x25\xe0\xad\xd8\xe6\x83\xff\x0c\x87\x6b\x27\x31\x54\x4a\xd6\x8e\xc1\xa9\x37\x7c\xcf\xf4\x42\x7d\xe1\x52\x93\x0f\xce\x9d\x72\xa7\x83\x61\xa8\x5f\x0b\x80\x83\x4b\xe0\x50\x3b\xba\x43\x33\x90\x47\x9f\x3f\x93\x89\x9f\xe2\xa5\xca\x33\x32\xff\xa5\x75\x73\x7e\x13\x42\xb7\x9b\xef\x0c\x75\x28\xa3\x8b\x11\x8b\x1f\x10\x07\xed\x02\x00\x8c\x30\x68\x76\x3d\x4d\x03\x38\x9f\x1f\x26\xd9\xdd\x11\xbe\x34\x6f\xf9\xf0\xf9\x57\xa9\x04\x3b\xf4\x2f\xa6\x77\x9e\x8e\xf3\xf2\xf1\x71\x65\xdf\x2b\xc7\xbc\xe6\x8c\x18\x3b\x88\x83\x6b\xe0\x73\xbb\x90\xc9\x2b\xa1\xaa\x13\x72\x6a\xc5\xce\x4b\x5f\x34\x73\x03\xa7\xb5\x59\x0a\x6d\x14\x5e\x3a\x18\x52\xde\xbd\x76\x3e\x12\xfa\xce\x06\xe2\xe0\x1a\x70\x08\x4e\x59\x3c\x2f\x6d\x9d\xfd\x75\x61\x82\x3b\xd7\xa1\xee\x62\x74\x8d\x8d\xcf\x4d\xb2\xcd\x27\x51\xfd\xfd\xc5\xea\xba\x41\xd0\xb4\x05\xe2\xe0\x1a\x60\x8a\x93\xfb\xea\x99\x56\x4a\x73\x85\xee\x79\x9c\xa8\xf7\x7a\xe3\x7d\xeb\x22\xad\x3a\xbe\xe7\x9d\x72\x0d\x7b\x3f\x5a\xdc\x23\x43\x10\x71\x41\x1c\x5c\x03\x72\xd9\x6f\x36\x69\x9c\xd6\x57\x78\x62\xa9\xa2\x8c\xbd\x67\xcb\xc6\xcd\x50\xe7\xf6\x58\x39\x44\x19\xee\xdb\xfe\x38\x29\x94\x1e\x42\x68\x00\xc4\x41\xbb\x81\xd2\xff\xae\x01\x50\xaa\x3b\x4d\x03\x12\xdf\x0a\x1b\x3b\xcb\xef\xa2\xfc\xd1\x11\xe5\x7f\xd3\xb7\x99\x6b\x4b\x25\x76\xd9\x49\xe6\xc1\x68\xb7\x8b\xcf\xc1\x71\x0c\x0d\xd4\xe7\x17\xc4\xc1\x35\xb0\xfd\xc4\xdf\xbc\xfb\x60\x7b\xb6\x32\x6a\x3a\xaf\x2f\x7f\xb3\x48\x6c\x0e\x47\x26\x40\xe0\x8d\xef\x33\x8e\x09\xcd\xb4\xd7\x7f\xa0\x6f\x8c\x20\x0e\xae\x81\x3e\xa2\xdc\xf0\x84\x92\x74\xc9\xd6\x5b\xca\xc7\x5a\xa6\xcf\x39\xd1\xd0\x3f\xce\x9a\x0f\xd5\x77\xf6\xbe\xed\x49\x32\xef\x51\x7e\x84\x88\x0b\xe2\xe0\x1a\x88\x19\x2e\x7f\x61\xb5\x7e\xb1\x9e\x76\xbc\x57\xcd\x34\xf1\xe8\xcf\xe0\xb7\x1c\xfa\x8c\x72\x9a\x4b\xb4\x44\x0f\x31\x1d\xa5\x2a\x03\x10\x71\x41\x1c\x5c\x03\xfd\x4f\xa8\xe3\xf5\x8e\x12\x31\x5e\x31\x9b\x31\xf9\xeb\x6b\x90\xa5\x8f\xe8\xc9\x54\x7d\x0b\x37\xb0\xfe\x11\x2a\x9f\x30\x11\x1d\x80\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\xad\x3b\x4e\xd3\xc0\x67\xa3\xf9\x13\x19\xdc\xae\xaf\x57\xcf\xed\x10\x3f\x1a\xd7\x38\x59\xee\x76\xe2\x2b\x63\xd9\xfe\x2e\x38\x1d\x78\x44\xc6\x42\x05\xed\x08\x83\x38\xb8\x06\x0e\xbd\xa4\x9c\x56\x38\x9a\x22\xcf\x2f\xec\x9a\x75\x6b\xd5\x62\x29\x06\xf5\x4f\xaa\x9b\x71\xaf\x69\xe3\xe1\x04\x93\xb6\x52\x40\x7d\xc4\x41\x1c\x5c\x03\x28\x3a\x6a\xbd\xaa\x14\x5b\xf9\x7e\x4c\xe5\xae\x68\xd3\x36\x3a\x5f\x9a\x7f\x2a\x26\xe0\x4b\x1b\xaa\xe9\x6e\x8b\x63\xcf\xc6\x8f\x21\xe2\x82\x38\xb8\x06\x8a\xed\x31\x92\xdd\x9f\x31\x17\x8b\xcc\xbe\x55\x34\xee\x8f\x7d\xce\xd0\xda\xad\x7f\xd2\xfb\x58\x0d\xcf\x8e\x49\x4c\x05\x3d\x97\x14\x11\x17\xc4\xc1\x35\xf0\xd1\xd3\x63\x21\x4d\xeb\x9d\xe8\xb1\xb0\x9f\xd8\x76\xf6\xd3\x4c\x7a\xa2\x1b\x0d\xf4\x36\xbd\x8c\x71\x32\x64\x23\x74\xd3\x75\x94\x08\x0d\x80\x38\x68\x1e\x70\xfd\x77\x23\x0c\x32\x51\xff\x1f\x35\xc8\x25\xa6\x85\xbc\x92\xad\x83\x93\x3c\xe7\xc2\x31\xf6\xdc\x3a\x45\xb3\xa3\x26\x3c\xf8\x2d\xc7\x2f\xe0\xd3\xb0\xb1\x7c\x10\x2d\x86\x6a\x90\x01\x1c\xb2\x11\x9e\x8d\x7b\xfd\x1a\xcb\xfd\x85\xc0\xc1\x5b\xf1\x37\xdc\x97\x93\x72\x2e\x7a\x2b\xce\xf7\x9d\xfb\xe4\x70\x50\x4a\x4b\x43\x23\x19\x01\xf5\xee\x02\x71\xc1\xca\x28\x04\xff\x8c\x9c\xf4\x68\x9e\x98\x13\x07\x4d\xe2\xbb\xfc\x5a\x8d\xe3\xcd\x64\xfc\x37\xaa\xf4\xe5\xf7\xdd\x1a\xe7\xd6\xf3\xaa\xa7\x23\xf1\xd7\x22\x11\x91\x41\x5c\xb0\x32\x1a\xec\x69\x00\x7b\x5e\x23\x8c\xb0\x03\xed\xd5\x3f\xcf\x5e\x79\xf8\x07\x6f\x50\x8d\x5d\xd2\x49\x4d\x1c\x21\x63\x29\x45\x0b\x93\xe6\x4e\x32\x52\x55\xb8\xf5\x3e\xef\xd6\xdf\x46\x78\xef\x02\x9a\xd0\x7d\x3d\xf9\xd2\x9b\xf7\xd9\x62\x8a\x77\x3d\x2f\xf1\xfc\xe8\x6a\xe3\xf3\x18\xc6\xfe\xdd\x7c\x5d\x95\xc3\xf0\x50\xf9\x2f\x34\x43\x4c\x59\x5e\xa1\xef\x2e\xad\xee\x65\xa1\x4b\x0e\x15\x91\x55\x8c\x6f\xe9\xfa\x94\xcd\x08\x16\x03\xad\xb5\xd7\x6d\xd3\xec\xb6\xfe\x6b\x46\x18\x34\xb4\xbf\x4b\x8a\x91\x8c\xf0\x4d\xf1\xc5\x8e\xcb\xe9\x9a\x1e\x63\x37\x88\x9f\x70\x49\xbd\x5d\x1b\x32\x2e\xf3\x72\xe5\x7f\x35\x2f\x96\xaf\x95\x21\x20\x26\xc6\x74\x26\x9b\x95\xc8\x46\x38\x20\x93\xe5\xbe\x0e\xfd\xc7\xcd\xa0\x58\xf1\xd1\x1d\x65\x6b\xf6\xc0\x0c\x23\xa3\x61\x94\xa5\xce\xd4\xfb\x9b\xcf\xd2\xf2\x2b\xcc\xcf\x64\x6b\x16\xd9\x08\x07\x7c\x9d\xc3\xba\xb3\xd1\x40\x57\x7a\xe3\x72\xf3\x1e\xc7\x27\xd7\x13\x1e\x62\x79\x96\xc6\x7d\xce\x5b\x6b\x3e\xef\x23\xcd\x0b\xcf\xe4\x68\x74\x0b\xb2\x11\xe6\x19\x45\xf1\xe6\x8c\x3d\x9f\x77\xf8\x4e\x39\xf1\x3d\x97\x53\x88\x95\x4a\x10\x3a\x47\x1b\xfe\x65\x4c\xcc\xeb\xc7\xbc\x15\xa8\x18\x67\x32\x5a\x64\x23\xcc\x22\xe1\x20\x12\xaa\xcb\x4b\x72\x9f\xa5\x7c\x30\x7d\x5d\x24\xbc\x02\xe3\xea\x2f\x76\xb1\xe8\x9f\x91\xa4\xf1\xe8\x9f\xf6\x58\xe8\xce\xcc\x08\x83\x44\x74\x5a\xe6\x4b\x6e\x73\x57\x69\x33\xfc\x26\x25\x29\x93\x1c\x66\xe5\xbf\xda\xa1\x10\xa5\xf5\xa9\x37\x7b\x4a\xe9\x42\xce\x6c\xc4\xb7\x50\x3d\xe8\xf6\x51\x10\x07\xcf\x7c\x76\xaf\x66\x2d\xb9\x0f\x1c\x09\x2e\xe6\x47\xd1\x49\xa6\xbb\x0f\x84\xaa\xc7\x75\x31\x24\x56\xed\x35\xc5\x52\x2b\xf4\x9d\xcf\x86\x56\x55\x20\x0e\x9e\xf9\xf4\x3b\x8c\xdf\x8a\x0b\xae\x72\x9b\x52\x10\x90\xaa\x75\xed\xff\xf4\x53\x38\x62\x97\x41\x49\xcc\x63\xd8\x5f\x14\xa1\xb5\xfd\xf1\x11\x6a\x8c\x0c\xe0\xe0\x99\x8f\x6e\x69\x81\x60\xfb\x63\x0e\x7d\xa6\x4b\x2c\xf7\xd8\x76\x3f\xe3\xe2\xf2\x4c\xf2\x9d\x16\x62\x61\xe1\x42\xe1\xdc\xb5\xdb\x8e\xcd\x88\xb8\x20\x2e\x58\xf1\x9f\x15\x29\x8f\x8a\x23\x98\xb8\xbc\xe6\xfb\x1a\x5e\xc5\xd2\xe1\x3d\x13\xa5\x32\x53\x30\x75\x5d\x2a\xe4\xc6\x29\x4f\x51\x15\x52\x62\xa3\x3c\x44\x18\x61\x10\x07\x35\x30\xfe\x77\x23\x0c\x7a\xa1\x4f\xed\xc5\x75\xbd\xa9\xe6\x82\x90\x80\xa3\x6d\xfb\x23\xab\x48\x95\x73\x94\x33\x72\xef\x76\x3f\xae\x52\xb3\x8a\x84\xee\xd1\xdc\x79\xf3\x0e\x5a\xa8\x82\x38\xb8\x04\x70\xfa\x1c\x0b\x1f\x4a\x4b\x15\x24\x3d\xa2\xab\x7a\xfb\x52\xf7\x45\x98\x31\x9e\x76\x88\x7c\x79\xd0\x9f\xb6\xc0\x0a\x39\xec\x23\x55\xc8\x5c\x01\x38\xb8\x04\x32\x8f\x8a\x2e\xfb\x5b\xd1\x7d\xd9\x57\x7c\x19\x14\x96\xf3\x2d\x52\xfc\xfd\xa5\x31\x85\x57\x2f\x6d\x45\x9e\x1e\xf6\xbf\x88\x79\x5c\x80\x88\x0b\xe2\xe0\x12\xb8\xd9\x1e\xc6\x78\x29\x2b\xa2\x6c\xe9\x35\xd1\x47\x0f\xec\x80\x20\x89\x10\xcf\x94\xb4\x87\x3c\x64\xf8\x0c\xf7\xc2\x8f\x12\xee\x8e\x43\x0d\x63\x00\x1c\x5c\x02\x8e\xf1\x96\xcb\x9d\x1b\x89\xab\x9a\x98\x12\x2f\xb7\xe7\xfb\xfb\xc8\x46\xc8\x63\x68\x77\x7e\x0a\x96\x3b\xb4\xae\x44\x70\x68\x0b\x22\x16\x3f\x20\x0e\xda\x05\x00\x18\x61\xd0\xec\x7a\x6a\x6b\x81\xc1\xd2\xac\x2d\x3b\xa6\x73\x2c\x21\x02\x6b\x9e\x2f\xbb\x5a\xc8\x9e\x15\xd0\x8d\xa8\x29\xbc\x36\x7d\x72\x35\x8a\x70\xc7\x56\x1f\x6a\x2d\x00\xe0\xe0\x1a\x98\xc1\xab\x57\xa6\x4f\xe1\x56\x4d\x65\x48\x0f\xda\xef\x13\xb1\xcb\x17\xba\x2c\xd4\x7f\x93\x92\x78\xee\xcd\x1b\xfd\xd7\xe8\x55\xd3\x50\x91\x22\x80\x83\x6b\x40\xf1\x3b\x4a\x6c\xa0\x1d\xb1\xe5\xc6\xa0\x12\x06\xda\xce\x8f\xd2\xee\x42\xc1\x77\xae\xb2\x4b\xca\xa5\x15\x5d\xd7\x14\xdd\x44\x2a\x10\x71\x41\x1c\x5c\x03\x36\x26\x97\xd5\x47\xb4\x85\xce\x75\x7f\xcd\xec\xe0\x6a\x5b\x49\xd5\x49\xfa\x55\x41\xee\xd5\xd3\xe2\x64\x7d\x3e\xc9\xf8\x87\x3b\xd4\x62\x01\xc4\xc1\x35\x90\xf1\xbe\x4f\xad\xa1\x32\x4a\x03\xad\x58\xea\x3c\xd3\x07\xcd\x8e\x3f\x0f\xc2\x55\x5e\x6f\x7f\x72\x58\x66\xb7\x17\x78\xd1\x51\x01\x35\xe3\x02\x71\xd0\x6e\x20\xc0\x08\x83\x52\xdd\x69\x1a\x28\x11\x8e\x9b\xd0\x2a\xbe\xa8\x1f\x6b\xde\x4e\x3f\x93\xc7\xa9\x66\xbb\x36\xd9\x2f\x9c\x16\x78\xdd\xbb\x72\xd2\xc5\xe8\xe1\x12\x74\xd4\x18\xc4\xc1\x35\xe0\xde\x70\x8d\xb5\x15\x77\xa4\xfa\x12\xe1\x28\x1b\x4e\xf6\x7b\x17\x71\x02\xf2\xb0\xbb\x2c\xa5\xfa\x66\x93\x7b\xe4\x2a\xcd\xeb\xd0\xf1\x55\x10\x07\xd7\x40\xb0\x1a\xfa\xfa\x77\x73\xca\x40\xe7\xa8\x02\x2a\x49\xef\xe6\xee\x7c\xa1\xe7\xb8\x54\x8b\xe9\x64\xf3\x99\x21\x7c\x57\x8e\xc4\x1e\x22\xe2\x82\x38\xb8\x06\xf2\x04\x68\x16\x86\x79\xdb\x1e\xd0\x7f\x0f\xcc\xe3\xbf\xc3\x27\x34\xdd\xde\x7a\xdb\xf5\x66\xfc\xc7\x5e\x2e\x9f\x79\xef\x9a\xff\x69\x5b\x01\xe2\xe0\x1a\x78\x42\x97\xf8\x7b\xde\xce\x79\x2b\xf8\xc9\x9d\x7d\xff\xf3\xc3\x84\xf7\x93\x5e\xac\x58\xf7\x64\xc9\x2f\x5a\xdd\x52\x93\x8b\x0e\xba\x82\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\xad\x3b\x4e\xd3\xc0\x66\xaa\x6a\x7a\xe7\x66\x2e\x2f\xdb\x63\xac\x9c\x3a\xfd\xdb\x18\x0e\xcb\xf7\xed\x08\x35\xf0\x7e\xe2\x3e\x6a\xec\x1d\x3a\x97\x00\xa5\x57\x10\x07\xd7\x40\xf1\xb5\x2b\x13\x37\x19\xdb\xba\x5f\xeb\x5a\x3b\xb8\xdf\xac\x6c\xbc\xd3\x4c\x35\x4c\x2b\xb1\xf0\x39\x31\xcf\x9a\x77\xed\x2a\x03\x36\x64\x2c\x01\x1c\x5c\x03\xbb\xb2\xe9\x9f\x32\x2f\x95\xc6\x69\x19\xb5\x74\x91\x87\x38\x32\x45\x18\x5d\xb0\x73\xa8\xc5\xc0\x48\xdf\x17\xba\xc7\xf8\x6a\x74\x0e\x11\x17\xc4\xc1\x35\x60\x6d\xfd\x21\xea\x85\xc1\xfc\x93\x37\x0b\x9b\xe6\x5d\xee\x17\x0a\xae\x4a\x3c\xf7\x1b\xad\x13\x6a\xb8\x1e\xfa\x55\xbc\x4b\x67\x33\x18\x11\x17\xc4\xc1\x35\x30\x77\x4d\xfc\xc6\x5a\xe9\xc6\x81\xd6\xab\xd7\x7e\x53\x91\x1c\x74\x11\x81\x26\x99\x31\x3b\x5c\xb4\x4c\xa6\x1e\xc6\xc2\x57\x26\x9d\x11\x1a\x00\x71\xd0\x3c\x00\x30\xc2\x20\x13\x75\xba\x11\xbe\x34\x54\x89\xd7\xe1\x31\x3e\x17\x62\xac\x30\xc8\x56\xdf\x56\xf0\x32\x27\xa4\x07\xf3\xb0\x50\x55\x4f\x7d\x53\xe5\x3c\xf1\x34\x27\xc2\x54\x82\x38\x64\x23\x7c\xcb\xa5\x82\xae\xc0\xf2\xab\x37\xab\x38\xb7\x2b\xe7\x00\x2d\x5b\xd4\x84\xf8\x57\x63\xff\x99\xf3\x7a\x2f\xc7\x33\x6f\x94\x3f\x9e\x42\x44\x06\x71\xc8\x46\xf8\x03\x85\xe0\x44\xf3\x33\x07\x11\x01\xef\x81\xe5\x2d\x34\x6d\x05\x1b\x6d\xd1\x57\x51\xee\x87\x59\xfb\x24\x5c\xf9\xcf\x13\x37\xa1\xdf\x0c\xe2\x82\x95\x09\x60\x4f\x03\xd8\xc4\x1a\x61\x84\x59\xae\x9d\x73\x4c\xeb\x88\xb9\xf1\x2e\xcc\xa8\xc7\x5c\x3d\x2e\x33\x58\x71\x37\x8b\x70\xa7\x95\xdf\xaf\x38\xc0\x20\x8b\xaa\x6b\xea\x6f\x23\xdc\x7f\xd9\x88\xb0\x4c\xf9\x5e\x27\xfe\x1f\x05\x39\xad\x1d\x0c\xd9\x9a\xe4\x54\x9b\xd8\x68\x8c\x40\xb7\x83\x1c\x59\x9c\xcf\x4d\x62\x7f\x9f\xd4\xb9\x35\x68\x70\x34\xa3\xc1\xbf\xad\x4f\xef\x6f\x98\x43\x1d\x37\xcb\xf1\x29\x9e\xe1\x01\xb7\x34\x8a\xbd\x6e\x35\xc1\xb8\xa1\xf0\x7f\xcd\x08\x83\x86\xf6\x77\x8d\x30\x92\x11\x96\xc6\x32\xb7\x0d\x68\xd4\x96\x3f\x1e\x1b\x8d\xde\x88\xda\x1d\xd6\xfe\x89\xc7\x71\xf3\xc5\x00\xe5\x86\xe6\x33\x25\x96\xab\x5a\x67\xd1\x93\x5a\x19\x45\x10\xc9\xa3\x2d\x70\xc6\x7e\xd3\xbf\xda\x5f\xb4\xe6\x7f\x6d\x3d\x0c\x95\xf7\xc1\xf5\x96\x1f\x15\x7b\x0b\xc6\x44\x33\x77\x72\x36\xd3\x57\xe9\x1a\xce\x64\x6b\x16\xd9\x08\x93\x44\x53\x2e\x1c\x7a\x60\x94\x6c\x18\xb0\x73\xf7\xd8\xb3\x17\xa4\x28\xbf\x58\xc1\x73\xcf\x28\x7f\xe5\xf2\xa1\xed\xd5\x83\xa3\xdd\x33\x19\xad\x11\xd2\x9f\x8d\x88\xb8\x3f\x48\xc5\xf9\xe6\xde\x46\x4e\x10\xf7\x07\xe9\xe8\xc2\xca\x4f\xcc\x1b\xd1\xd7\x2e\x74\x3a\x97\x2f\x29\xe0\x2e\xd5\xa6\x9d\xc9\x68\x91\x8d\xf0\x23\xee\x26\x65\x32\x3a\x0c\x1e\x94\xcc\x20\x27\x17\xff\x46\x77\x9c\xaf\x21\xd7\x95\xb0\xb2\xd4\x50\x18\x1b\xf4\x16\xb7\xd1\x74\xcf\xcc\x08\x83\x44\x74\x5a\xe6\xe3\xc5\x77\x6c\xaf\xad\xaf\xa7\x98\x9f\xc3\xf3\x6e\x28\x7c\x2c\x12\x69\x88\x16\xe0\x40\x16\x12\xb1\xab\xe4\xaa\x44\xd8\xa9\x58\x8b\x98\xf1\x41\x1c\xd2\xf5\x0d\xe9\x35\x1c\x39\x5f\x57\xea\xfb\x71\xc7\x4c\x95\x8a\x1a\x71\x8e\x1b\xc5\x7f\x5d\x30\xa4\xdf\x4f\xc1\xc6\x3b\xee\xbc\x73\x11\x2a\xb2\x01\x71\xf0\xcc\x37\x60\x70\xae\xda\x94\xc0\x26\xa5\xed\x9b\x41\x9f\x6c\xac\x39\xad\x57\x4b\x6e\x8d\xb1\x01\xb7\x5b\x40\x57\xda\x4d\x0e\x41\x31\xe8\x12\x64\x10\x07\xcf\x7c\x96\xa1\x71\x8f\xd5\xd6\xaa\x15\xb4\x95\xe3\x32\x3c\x27\xf1\xc2\xc2\xe6\x7d\x08\x05\x94\xea\x12\x47\xa2\x5b\xe3\xbf\x16\x79\x43\xdb\x8c\x20\x0e\xfe\x7b\x2f\x4c\xfa\x94\x2f\x24\xf6\xb9\x6e\xe0\xf6\x33\x32\x4d\xf9\xe2\xc5\x56\x0a\xff\xf1\x1e\x12\x95\x73\x2b\x4f\x29\x72\x4f\x2f\xc7\x46\x18\x61\x10\x07\x75\x24\xfe\x77\x23\x0c\x7a\xa1\x4f\x93\x40\x06\x87\x4f\x4c\xeb\x76\xbe\xd8\x49\xfd\xe1\xc3\xe0\x74\xf4\xba\x78\xe2\x84\x66\x6a\x12\x97\x8c\x97\x14\x47\x95\x71\xe2\x8b\xd0\x31\x30\x10\x07\x97\x00\xdd\xa2\x54\x43\x96\x27\xcd\xd2\xfe\x7d\xb3\xf8\x1b\x09\x8b\x9d\x51\x0d\x1f\xd9\xd7\x4a\x5b\x15\xeb\x62\x71\xc4\x03\x24\xa8\xa1\xc5\x0f\x88\x83\x3f\xd2\xe6\xdc\x11\xaa\x42\x56\x95\xf2\x89\xa4\x67\x7e\x13\x11\x8a\xd6\x28\x5e\x8f\x18\xca\x3d\x5c\xef\xb7\x5b\x46\x9f\xbf\xd9\xd4\x0d\xdd\x10\x04\xe2\xe0\x12\xf0\x89\x60\xb2\x0c\x6d\x6c\xe1\x08\xff\x7c\x7f\xf6\x6e\x15\x57\x30\x8b\xe7\xfb\xb7\xd6\xef\x57\xe9\xd7\xa4\xf4\x76\x29\x8d\xa8\xa1\xdd\x05\x10\x07\xff\xbd\x8e\xf2\x0e\xa8\xd2\x13\x6a\x16\x4e\x1f\x3e\x30\xb5\xbc\x58\x93\x50\x79\xfb\xcd\xe9\xed\xad\xc9\x93\xed\x9f\x74\x6f\x55\x63\x3a\x8c\x20\x23\x0c\xe0\xa0\x4e\xa4\x82\xff\xbe\x00\x06\xcd\xae\xa7\x69\xa0\x5e\xb9\x3d\xe2\x85\x55\x6b\x4a\x20\xa6\xa2\x5b\xb0\x89\xbb\x7e\x10\x6f\x03\x7f\x93\x06\x6a\x4f\xd1\xc9\x77\xe7\x1e\x2c\x6b\xe8\xa0\x05\x88\x83\x6b\xc0\xc7\x3c\xea\x80\x57\xfa\x53\x9b\x41\x7f\x1c\x37\xbd\x47\x68\xf8\xba\x5f\xbd\x97\x13\xfe\xa1\x95\x23\x3b\xce\xb7\x91\x6e\x3e\xa8\x11\x1a\x88\x83\x3f\xd3\x06\xe6\x7e\x3e\x85\x4b\x36\xaf\x5b\x9f\x3c\xc1\x55\x38\xa7\xba\x87\xdd\x46\xdc\xa4\xdd\xa9\xfb\x3c\x6a\x26\x30\x5c\x76\xe6\x59\x38\x22\x2e\x88\x83\x6b\xa0\xe8\xa5\xe7\xad\x66\xc1\x58\xbc\xbc\xfb\xc1\x29\x3c\x68\xd5\x89\x36\x3c\x55\xe2\xba\x89\x37\xfc\x1c\x34\xbf\x0e\x25\xd9\x86\x3d\x41\xc4\x05\x71\xf0\xdf\xdb\xdd\xc5\xf3\xc4\x3b\xd3\xf2\x96\x9c\xec\xa7\x6f\xdb\xa1\x3c\x7f\x0e\x2d\xbe\xd8\xa7\xd1\x6e\x0f\xb2\x6f\x7e\xac\xce\xfd\x90\xf0\x1a\xba\xcd\x09\xc0\x41\x1d\x89\x01\x46\x18\x94\xea\x4e\xd3\x80\xc0\x0c\x73\x86\xbc\x9f\x06\x69\x06\xe1\x0e\xcb\x85\x43\x96\x56\x19\x3e\xb6\x70\xf2\x03\x2d\xb9\x65\x69\xe5\xe3\x92\xac\x58\xe8\x44\x04\x88\x83\x6b\xc0\xa1\x1b\x6d\xf9\x73\xd2\x2f\xe7\xcd\x8d\x6f\x11\x89\x3b\x7a\x95\x26\xd7\x48\x16\xea\x08\x27\x74\xea\x9a\xd8\x8a\xb2\x9d\xb7\x88\xa1\xdd\x7b\x00\x07\x7f\xa6\x46\x2a\x4c\xad\x2c\x1c\xdf\x96\xe5\x8c\x45\x0f\xc8\x23\xd7\x96\xb1\x2e\xbc\xba\x6e\x7c\x54\xf3\x8a\x92\x07\x35\xef\xa5\xcd\x94\x16\x22\x2e\x88\x83\x6b\x40\xbd\xff\x78\xeb\x0f\x8b\x84\xb7\x53\x75\x76\x92\x83\xe2\x07\x41\xd7\x31\x43\xdc\x8e\x61\x82\xbd\x9a\x5b\x6b\x15\x07\xcf\xa7\x3d\x11\x71\x41\x1c\xfc\xf7\x12\x3d\x98\x92\xb8\xc8\xf7\xd4\xe8\x16\xf1\x4c\x73\xb4\x8d\x76\x47\x54\xfb\x52\xf1\x56\x85\x3e\x36\xa3\x90\xab\x99\xcc\x5e\x6a\x33\x42\x03\x20\x0e\x9a\x07\x8c\xfe\x5d\x03\xa0\x75\xc7\xa9\x47\xa3\xd7\xc9\xce\x55\x3a\xd2\xbe\xea\x10\xc6\xbf\xd4\x70\xb0\x16\x50\x9a\x2b\x6b\x99\x28\x28\x4f\x3c\x6a\xa2\x9e\xa9\xbf\x13\x0c\xed\xb2\x83\x38\xb8\x06\xb2\xc4\xf5\x13\x5a\xbc\x59\xbd\x13\x54\xab\xaf\x3c\x61\xd8\x33\xf2\xac\xf6\x4a\x9b\x26\xa0\xac\xa6\x71\x96\xa0\x19\x36\x16\x87\x4e\x1d\x81\x38\xf8\x33\x0d\x97\x12\xf7\x75\x64\x2e\xf9\x8c\x56\x5a\x88\xaa\x99\xfc\xa3\x39\x49\x9f\x9d\xf2\x43\xbc\xf6\xf9\x9a\x0c\xbf\xbb\xd7\xb1\xd8\xa0\x5b\xa2\x40\x1c\x5c\x03\x64\x99\xee\x56\x99\x9e\x2c\x06\x5b\x26\x63\xcf\x84\xfa\x5e\xb9\x79\x13\xd2\x5b\x6e\x46\xd9\x26\xba\x6f\x3a\xdf\x5f\x55\x0c\xf9\x80\x88\x0b\xe2\xe0\xbf\xb7\x6c\x96\x0a\x6b\x6a\xbc\x49\x6d\xf0\xfb\x28\xaf\x85\xb8\xc0\xef\x79\xdd\x9c\xf1\xb2\xa7\x3f\x79\x98\x29\x44\x47\x23\xbf\x3c\xcb\x46\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\x4c\xd4\xe9\x46\x58\x0c\xd7\xdc\x5d\x7c\xa7\x2e\x70\xdd\x5d\xe8\xc9\x82\x18\x91\x39\xb6\xb5\xde\x50\x5f\xc4\xcd\xb9\x17\x8d\xfd\xaa\xa1\x68\x9a\xd6\x08\x53\x09\xe2\x90\x8d\xb0\x87\xbe\xee\x46\x4b\x3f\x5f\x14\x63\x14\xf3\xca\x25\x17\x34\xe7\x3c\x23\x5a\xa7\xcd\xfc\xcc\x0b\x46\x7a\x64\x61\x03\x68\x47\xce\x88\xc8\x20\x0e\xd9\x08\x17\xe7\x64\x0d\x14\x27\xb1\xb9\x1e\x05\xa0\x08\x6a\x75\xd4\x56\xf1\xd0\x56\xbe\xab\x9c\xe1\xce\x79\xef\x4f\xd8\x83\x26\x50\x06\x1d\x8d\x06\x71\xff\xef\x5d\xc5\x7f\x47\x06\x76\xa5\x46\x18\x61\x5e\x01\x76\x51\xe2\x4d\x1f\x45\xc9\x0d\x42\xbc\x51\x17\x39\xac\x39\x89\x5a\x19\x32\x31\xdc\x20\x06\xd1\x67\x7a\x3c\x6b\x45\xff\xa8\x11\x5e\xd5\x4c\x7c\x39\x9f\xac\x73\x2d\x30\xac\xd6\x51\x4e\x70\x6c\x49\x4e\x4e\xd1\x5a\x7f\x51\xd6\xf9\x32\x95\xcb\x57\x27\x1d\xdb\x7f\xec\x29\x65\xe1\xf7\xf9\x4d\xc4\xcb\x76\x3b\x14\x15\xa6\xd7\x69\x53\x63\x1b\xcd\xfb\xda\x44\x27\x6e\x14\x11\x7d\x32\x76\x75\x14\xb8\xfa\x5f\x33\xc2\xa0\xa1\xfd\x5d\x23\x8c\x64\x84\x2f\x2d\x06\xd7\xe3\xdf\xbe\xc7\x63\x31\xa7\x99\xf4\xca\x29\xe5\xbd\x72\xc4\x97\x68\x89\xce\x56\x66\x8f\xa8\xc7\xd8\x94\x57\x7e\x27\x9d\xc9\x66\x25\xb2\x11\x4e\xba\xf5\x52\xbc\x9a\xf0\x7a\x67\x4f\xc4\x1b\x3a\x5b\x31\xea\x36\x81\x4f\x3d\xdd\x41\x83\x2c\xaa\xd7\x8e\xad\x96\x48\x6c\xe2\x2f\x9d\xc9\xd6\x2c\xb2\x11\x36\xa3\x4a\xc8\xf7\xe5\x51\xbf\xc2\x4c\x25\x64\x23\xff\x21\x64\xbd\x50\xf9\xe9\x83\xe7\x09\x4f\x2f\xac\xf7\x37\xf6\xfd\x4a\xcc\x3a\x93\x4b\xa1\xe4\x91\x8d\xb0\x41\xfa\xd5\x4b\xb7\x8f\x67\x42\x78\x7e\x66\x15\x6e\xc7\x60\x74\x46\xa8\xf2\x1c\xdc\x3e\xb8\xbd\x71\xdb\x49\xfc\xa6\x51\xb8\x7f\xd1\x99\x8c\x16\xd9\x08\xd7\x79\xcb\x68\xab\xd4\xbe\xc5\xe2\xae\xc8\x20\x4d\x5f\xda\xd8\x22\x1e\x13\x31\x8f\xad\xc9\x34\x4e\x39\xf7\xce\x72\xec\x90\xf8\xec\x8e\x46\x83\x44\x74\x5a\xe6\x2b\xfa\x83\xaa\xaf\xed\x14\x9d\xfe\x9a\x76\x33\xbe\x3b\xcd\xf7\x41\x18\xd1\xd1\x1d\xeb\x07\x7a\xfb\x0b\x51\x57\x88\xe5\x93\xa6\xa0\x5b\x8d\x41\x1c\x3c\xf3\x55\xcc\xff\xa2\xb2\x8e\x74\x3c\x92\xae\x5e\x60\xf2\x5d\x58\xbd\xbb\x39\x91\x1d\x88\x1f\x3e\xa4\xb3\x86\x81\xbb\xf8\x42\xd9\xd7\x0c\x11\x17\xc4\xc1\x33\x89\x4c\xff\x44\x3e\x9b\xdd\x04\x7b\x23\x1a\xa5\xe2\x3d\xce\x6f\x51\xc9\x65\xf7\x82\x88\x96\x59\x2e\xdf\xde\x95\xa4\xab\x35\x27\x80\x5a\x22\x83\x38\x78\xe6\x93\xca\xbc\xfb\x55\xb8\x71\x5c\x28\xca\x1a\xdb\xef\xea\xbb\x26\x8c\x42\x94\xb4\x97\xcc\x78\x8f\x6c\x2a\x8a\x36\x2d\xac\x73\xef\x43\x9d\x92\x40\x1c\xbc\xd8\xc8\xd4\x33\xec\x3b\xfe\x89\x6a\xe4\x95\x37\xeb\x2e\x56\xab\x2b\x93\xe7\xa9\x2c\x66\xe6\xab\x76\x22\x24\x1f\x38\xce\xeb\xbc\xfc\xd4\x82\x30\xc2\x20\x0e\x6a\x31\xfc\xef\x46\x18\xf4\x42\x9f\x26\x01\xd3\xce\x34\xa6\x60\x8d\xa7\xa5\x68\x8a\x3c\x64\xbb\x8d\xef\xb3\x34\x0b\x4b\x2e\xa4\x6b\x39\x5c\x65\xef\x78\xd2\x99\x63\x65\x0f\xb5\xec\x05\x71\x70\x09\xc8\x4b\x37\xb5\xbd\x73\x8e\xc4\x36\x3e\x6a\x99\xbc\x9e\xf1\x74\xc6\xde\xd9\xff\x56\xe3\x6a\xb2\xcd\x13\x7e\x06\xe2\xaf\x6f\xc3\x85\x10\x71\x41\x1c\x5c\x02\xd8\x64\x8d\x2a\x2e\x83\x34\xac\x4a\x83\xc6\xfc\x4c\xe3\x2d\x2b\x8b\xf7\xca\x8f\x25\x43\xd1\xa7\x44\x8d\x45\x45\xea\x53\x69\x72\x11\x71\x41\x1c\x5c\x02\xa3\xee\xd7\x64\x9e\x75\xe2\xbc\xbf\x8a\xfa\x2d\xf5\xd1\x27\xb2\x5a\xc7\x8b\xfe\xeb\xdd\xa6\xcb\x77\x7f\x4a\x7e\xf9\xe3\x25\x72\x03\x3a\xca\x0d\xe2\x90\x1a\xaf\x24\xab\xcb\xe7\x62\xc8\x2d\x97\x50\xb9\x6f\xdf\xe6\xb6\x7d\xbd\x69\xa6\xcc\x64\xfb\x63\x52\xed\xb9\x24\xf3\xbd\xfa\xc8\xf9\x0b\x88\xc5\x0f\x88\x83\x5a\x8b\x02\x8c\x30\x68\x76\x3d\x4d\x03\x16\x7d\xf7\x63\x3f\x07\x55\x49\x0b\xd3\xa3\x73\xd7\x7e\x9b\x98\x09\x8d\xdc\x48\x0b\xb4\x40\xfd\x2c\x2d\xcb\xca\x30\x95\x80\x1d\x84\x18\x3b\x88\x83\x6b\xc0\xdf\x53\xfa\xb0\xfe\x5a\xf8\x94\x1d\xe5\x27\x46\x91\xb9\xae\xeb\xd4\xd5\xb7\x8c\x24\xd2\x85\x0a\x5a\x44\xf5\x2e\xf2\xbd\xfe\xb2\x88\x88\x0b\xe2\xe0\x1a\x88\x7f\x83\xa7\xfd\xe1\x6e\xda\x90\xdd\x79\x11\x42\xab\x8c\xe5\x01\x95\x92\x0b\x17\x0b\x19\xe4\x35\xd3\x9f\x67\x53\xfa\xea\x66\x41\xd3\x0b\x88\x83\x6b\xc0\x5c\xf9\xae\x34\xc7\x85\x83\x74\x46\xad\x22\x85\x54\xee\x71\xca\x51\x0e\xfc\x40\xdb\xf4\xcc\xe7\x45\x37\x02\x27\x6e\x51\x86\xb2\x41\xb5\x8c\x00\x0e\xae\x81\xfb\xf8\x05\x54\x37\x93\x23\xb9\x6f\xd6\x48\xb2\xdd\x31\x50\xc9\x16\x15\xfa\x23\xf3\xf1\xf7\x63\xa7\xf8\x2f\x3f\xcc\xd0\x6e\x66\xf8\x20\x34\x00\xe2\xa0\x16\xc3\x00\x23\x0c\x4a\x75\xa7\x69\xa0\x52\xa3\x2a\x37\xd9\x92\x85\x2f\xd1\xcb\x4a\x8d\x75\xd4\x3b\xbf\xe1\x1c\x81\x3d\x9e\xfa\x80\x85\x6b\x10\xc3\xe8\x35\x23\x2d\xa8\x96\x17\xc4\x21\x7d\x13\x4d\xb3\xe4\xb8\x32\xd0\xa0\x88\x52\xbe\xc9\x83\x25\xce\x3c\xb2\x83\x3d\x1c\x72\xee\xa1\x65\xec\xc5\xa9\xa1\x83\xa3\xe4\xeb\x50\x7d\x28\x88\x83\x6b\xc0\xc6\xec\xe6\xd6\x26\x3d\x66\x9e\x8e\x64\xa6\x1b\xf1\xe2\xb4\xbd\x27\x7d\xec\xdb\xce\xb8\x3a\x5d\xa6\xb1\xa2\x89\xdd\xf7\x46\x7c\xd0\xee\x3d\x80\x43\x4a\x05\x32\xd9\xea\xbd\x23\x9f\x0b\x06\x4b\xcb\xa6\x15\x23\xff\x88\x1e\x4d\x0c\x64\xb6\xee\x87\xf9\x4b\x79\x34\x89\xf6\xd7\xa4\x41\x26\x08\xc4\xc1\x35\x10\x72\xbb\xca\x50\xd8\x7f\xda\x9f\x9f\xd9\xaa\xb6\xe7\xf9\xb8\x4f\x76\x12\xc5\x74\x97\xd7\xb1\xb4\xb4\x9a\x95\x45\xbb\x77\x83\x04\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\x4d\x03\xfe\x1f\x9a\xdb\x7f\x36\x8a\x17\x9a\x4c\x8c\xb8\x45\x52\x6d\x75\xa0\xd4\x1e\x3f\xd9\x9f\x5b\xb3\x73\x7a\x30\xff\x86\xa8\x93\xdd\x1c\x7a\x5f\x01\x1c\xd2\xe9\xa0\xf6\xa4\xb9\x38\x4d\xba\x94\xb0\x69\xb5\xa0\x3c\x57\x9a\xe3\x63\x3f\x7a\x2d\x52\x62\xf7\xef\x2e\x42\xaa\xaf\xdf\xa8\x2e\xf3\x42\xa7\x83\x00\x1c\x5c\x03\xfd\x55\x8a\xf6\x3a\x14\xd4\xc5\x6e\x1d\x64\x6a\x4b\x93\x83\x9b\x9d\x95\x94\x62\x6c\x01\xa6\xbf\x27\x4a\xa8\x77\x99\x8f\x98\x50\x10\x71\x41\x1c\x5c\x03\xd3\xef\x2e\xf7\x68\xb5\x6c\x7c\x0c\x7a\x61\xf7\x9b\xcc\x8a\x95\x9e\x6c\xcd\xd3\x4d\x42\x25\xa4\xdd\xb9\x22\xd4\xaf\x5d\x15\x07\xfa\x18\x02\xe2\xe0\x1a\xe8\xe1\x31\x08\x20\x7f\xec\xe2\x5c\xba\xfa\x7b\xea\xcf\xe1\x6b\xbb\x03\x55\x5c\x7e\x5e\xe2\xa6\x35\xf3\xe9\x74\x9b\x07\xc5\x5b\x50\xc3\x34\x10\x07\xcd\x03\x00\x23\x0c\x32\x51\xa7\x1b\x61\x35\x73\xae\xdc\x79\xd2\x73\xab\xc1\x74\xef\xde\x5b\x06\x6a\xdc\x58\x64\xe0\xb7\xa9\x0b\x5d\x24\x54\xfa\x66\x96\x48\x11\x37\x3c\x8c\x30\x95\x20\x0e\xd9\x08\x1b\x53\x3d\x93\x78\x62\xb0\xb4\x96\xbf\x2b\x44\xf6\xa2\xef\xe5\x48\xd2\x53\xa7\x90\x90\xab\xeb\x04\x6e\x2f\xb1\x6b\x36\x4a\xd4\xec\x10\x91\x41\x1c\xb2\x11\xfe\x66\x32\x4d\x6e\xb6\xe1\x47\xea\xb1\xfb\xc3\x32\xba\x5a\x96\x50\xca\xe1\x9e\xc0\x6d\xd5\x92\x94\xe4\x97\x82\x6c\x01\x0b\x09\xe3\x88\xc8\x20\x2e\x58\x39\x00\xf6\x34\x80\x6d\xa6\x11\x46\x38\xbc\x91\xfc\xae\x0d\x79\x38\xd3\x17\xf2\x26\xba\x83\x8f\x4b\x95\x3d\xb6\x9f\x3d\xf2\x77\x72\xf9\xd9\xb3\xb5\x02\x7a\x1b\xcf\xd5\xfc\x6d\x84\xb3\x33\x99\x52\x87\xf5\xb1\xc3\x05\x44\x38\xd1\x0e\x9d\x95\x7a\xa8\xe9\x73\x53\x06\x45\x68\x78\xc6\xa9\x1e\xae\xe1\x99\xb7\x04\xff\x85\xbe\x77\xb5\x9f\x3d\xd6\x78\x30\x32\xe9\x7f\x51\x30\x6c\x5a\x9a\xa8\xc7\x71\x18\x1d\x87\x2b\xfd\x44\xc1\x98\x28\x63\xbb\xf8\x4e\xf6\x7f\xcd\x08\x83\x86\xf6\x77\x8d\xb0\x2a\xdc\x2c\x11\xfe\xaa\xf9\x1d\xfb\x65\x4f\xc1\xfb\x51\xe7\xee\x61\x74\x70\x0d\x5a\xd9\x92\xc2\xab\x0d\xca\xae\xd8\xe1\x0d\xbd\x27\x7f\x3e\x33\x9e\xc9\x66\x25\xb2\x11\x66\xba\xfd\x4a\xd4\xb5\x2f\x2f\x91\xc6\x4e\xeb\x65\x26\xa6\xf6\x26\xc3\xb2\xe4\xa7\x0b\xf6\xce\x31\xcc\x54\x94\x9b\x8f\x7d\x8f\x9d\xcf\x64\x6b\x56\x06\xe9\xcf\xf2\xe7\x97\x78\x89\x4b\x27\x2a\x8e\x0c\x15\xf8\x8f\xca\x04\x7e\x3b\x71\x0f\x4d\x69\x5c\xdf\x2f\xf8\xfc\xfd\xc5\xd1\xf9\x94\x73\xc9\x67\x32\x5a\x64\x23\x2c\x51\xe7\xa0\xa2\xec\x56\xb0\xdb\xfe\x5e\x7c\x12\xf7\x23\xa1\xb3\x15\x8d\xfd\x9b\x7c\x3f\xaa\xaa\xeb\xf2\x81\xa8\x15\x77\x9f\x17\x9e\xc9\x68\xdd\x90\xfe\xec\x75\xea\xbd\x6e\x31\xdb\x9f\xb9\xbe\xe3\x35\xd4\xa6\x81\x52\x4c\x38\xa3\x18\xcf\x5e\x78\xe3\x04\x3d\x2b\xf7\x5c\x39\x4a\xfc\x9a\x75\x66\x46\x18\x24\xa2\xd3\x32\xdf\xef\xe3\x92\x2c\x22\xf4\x45\x54\x1c\x57\x69\x42\x3b\xdd\xe1\xad\x32\x0a\xda\xdf\x3b\x81\xa4\xdc\xbc\x8c\x97\xdb\xaa\xa5\xe7\x33\x10\x33\x3e\x88\x83\x67\xbe\x8f\xfb\xe8\x2c\x4f\x99\xc7\x5e\xc4\x32\xb6\x0a\x9b\xb7\xb6\xbe\xfb\x8a\x11\xc4\x77\x5e\xc7\xcb\x04\xff\xa1\x73\x17\x49\xda\x47\xe8\xc2\x4f\x10\x07\xcf\x7c\x16\x44\x18\x9b\xe7\xbb\x58\x4e\xbe\x1d\x3b\x4a\x96\x33\xa5\x7e\xe7\xf4\xc3\x09\x89\x66\xa9\x7f\xc3\x13\xc0\xb7\x15\xb0\x4d\x9a\x09\xad\xd8\x01\x1c\xfc\x39\x84\xe5\x0e\x4b\xf2\x68\xdd\xb0\x10\x08\xf8\x53\x67\x79\x9e\x44\x32\x33\x15\xed\x21\x49\x94\x29\x0a\xaf\x3d\x5a\x8b\x3f\x86\x58\x20\x22\x2e\x88\x0b\x56\xc4\xfc\x47\xdc\xf6\x88\xfb\x5a\x57\xa2\x3b\x09\x4b\x18\xf5\x27\xad\x64\x72\x5c\xc2\x69\x32\x2d\x55\xfc\x98\x5f\x2d\x7b\x61\xe6\x30\xb7\xab\xee\x20\x8c\x30\x88\x83\x6a\x84\x55\xff\x75\xf1\x03\x7a\xa1\x4f\x93\x40\x55\xe5\xe8\x0f\x5b\x69\x4b\xaf\x9f\x3f\x0b\xd7\x74\x7a\x02\x02\xf9\xfc\x23\x8f\xa5\xb1\xd2\x30\x14\x99\xc4\xeb\xe6\xb6\x0e\xa1\xaf\xf5\x20\x0e\x2e\x81\x3f\xa6\xb1\xdb\xce\xa9\x41\x38\x4c\x63\xb2\xb2\x58\xd5\xd9\xd9\x35\x56\xc6\xd2\x83\x26\x0d\xac\x57\x37\xf7\x66\xcb\x96\x9c\x65\x10\x71\x41\x1c\x5c\x02\x7b\xa3\xe8\x57\xa7\x7d\x82\x1a\x31\xdb\x77\x1f\x7a\xc4\x84\xa2\x51\xca\xf3\x35\xaa\x72\x61\x84\x17\xf9\xe4\xa0\xf5\xf0\xe2\xa5\x23\xe2\x82\x38\xf8\x73\x98\x6d\x19\x5c\x36\xb7\x5c\xc9\xe0\x36\xf2\x53\x78\x1f\xe7\x35\xdc\x81\x49\x72\x4e\xd1\x0f\xd5\xc2\xc9\xfd\x89\x1f\x13\x91\x23\x74\x44\x1c\xc4\xc1\x25\xf0\xf5\x55\x69\x54\x83\xd9\x77\x92\xb9\xd1\xf5\xa6\x07\x6c\x05\xfb\x4a\x1a\xf7\xb8\x5e\x8e\xd6\x5e\x7a\x9d\x81\x9a\xf3\xfa\xc4\x48\x0c\xb1\xf8\x01\x71\x50\x6d\x20\xc0\x08\x83\x66\xd7\xd3\x34\x10\x32\xf7\x46\x8c\x49\x9c\x3c\x03\x3f\xee\xe4\xe2\x79\x66\xf6\x07\xbf\x9e\x8a\x3c\xce\x35\x4f\x97\xd1\xbe\xa0\x3d\xa0\x6b\x7c\x08\x19\x40\x10\x07\xd7\x80\xc5\x41\xfe\xef\xd4\x05\x3b\x27\x25\xde\xb1\x06\x4d\xba\xa5\x8e\x0f\x1f\xca\xf0\xee\xb0\xd8\xd7\x45\x54\x45\xe7\x45\xb1\xc8\x43\x0d\xc8\x40\x1c\xd2\xb1\x58\xd3\x1c\xab\x55\xda\x9c\x9a\x85\x67\x72\xb4\x62\xf8\x54\x92\xd7\xbf\x1b\x4a\x39\x30\x91\x2b\x5d\xc7\xba\xff\x69\xc9\x50\x4d\x1c\x3a\x16\x0b\xe0\xe0\xcf\x41\xd6\x42\xa7\xe5\x5b\xa8\xa3\x72\xdc\xe6\xe3\x57\xea\xbd\x72\x13\x1b\xb7\x58\x79\x34\x87\x98\xcd\x6f\x9d\x68\x7f\xf6\x7c\x1e\x60\x84\x88\x0b\xe2\xe0\x1a\xf8\xd1\x58\x62\x62\xde\x79\xed\xb6\xe2\x30\x3e\x05\x25\x91\xfd\x46\x44\xa4\x89\xd7\xc5\xb5\xa9\x80\xe0\xb6\x82\x17\xc1\x9e\x04\x15\x08\x0d\x80\x38\xa8\x36\x50\xe6\xdf\x35\x00\x4a\x75\xa7\x7e\x13\xd5\x28\x7f\xae\xd0\xe9\x61\x35\x3e\x4c\xe5\x54\x50\x61\xc4\x62\xc4\x79\x27\xf2\x48\x9a\x6a\xa6\xc3\xe5\xe3\x4f\x8b\xde\xcf\xd9\xd0\x37\x51\x00\x07\xd7\x40\xa2\x81\xe4\xdb\x3c\xde\x89\x4f\xed\xaf\x67\xe3\x7c\x47\xce\xbf\xd6\x98\x4c\x13\xa0\x5b\xa9\xaa\x48\x7a\x8a\x13\xb5\xeb\xc5\x0e\xdd\x29\x0d\xe2\xe0\x1a\x50\xc8\x65\x7f\xeb\xda\x5e\x97\xcc\x9a\xc5\x23\xc7\xd5\x22\x87\x4e\xb5\x59\xc5\xd8\x6d\x71\xcd\xd4\xdf\xa5\xa9\x44\x5f\xcc\x17\x0f\xea\x6d\x00\xe0\xe0\xcf\x81\xaa\x50\x64\xf6\x22\x5d\x64\x04\x09\x59\xbd\x7a\x64\x14\xa5\x4a\x7d\xcb\xbe\xcd\x48\x88\xc0\x2d\xa9\x76\x97\x19\xfe\x22\x51\xc8\xb8\x83\x38\xb8\x06\x84\x73\x7f\xfb\xf6\x05\x71\x09\x15\xcf\x7a\x55\x1d\x07\x89\x10\x7d\x98\x17\x8d\x8a\xc3\x71\x50\xb2\x37\xef\xa9\x0e\x3c\x39\x66\x43\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\xd6\x1d\xa7\x69\x80\x1a\xcf\xf1\xda\xf3\x1c\xaa\x4c\x4e\xd2\x8e\x68\xad\xaa\xa5\x7b\x4e\xb3\x2b\xbe\xb7\xf7\x4a\x36\x87\x1e\xfb\x2d\x5e\x1e\xab\x19\x45\x8c\x1d\xc4\xc1\x35\x20\xbe\x59\x3e\xe5\xde\x9a\x9c\x22\x13\xdb\x95\x9f\x32\x32\xcc\x86\x9e\x53\xb9\xc6\x96\x90\x5c\x77\xe3\x7d\xde\xd3\xc5\xc2\x00\xe8\xbe\x25\x10\x07\xd7\x40\x7a\x36\xff\x12\x3d\x5b\x8e\xc3\x6e\x2c\xdb\xbb\x07\x2e\xd7\x76\xc2\x09\xa9\x9f\xf8\x98\x04\x76\x7e\x90\x98\x6a\xaf\xd2\x36\xf2\x40\xc4\x05\x71\xf0\xe7\xa0\x43\x90\xe9\xdb\x3a\xb6\xbf\x7f\x69\xe7\xab\xb9\xc0\xd5\x40\x67\x69\x49\x8c\xee\xcc\x6f\x51\x27\xc7\xb4\x5d\x5f\x71\x3a\xec\xa0\xdb\x17\x41\x1c\x5c\x03\x75\x87\x0f\x0a\xde\xa1\xcd\xbf\xa4\x55\x6f\x28\xec\x50\xd2\xa7\xdc\x88\x72\x4b\xef\x93\xb7\x14\x72\xbd\x98\xa6\xa4\x35\x35\x04\x75\x8d\x06\x71\xd0\x3c\xe0\xf6\xef\x46\x18\x64\xa2\x4e\x37\xc2\x8f\x23\x5a\x28\xd7\x12\xd9\x2a\xb7\x62\xaa\xb4\x46\xc6\x6e\x67\xbc\x21\x09\x70\x51\xdc\x93\x32\xa3\xb7\xa8\xd5\xe8\xaf\x12\xa1\x40\x98\x4a\x10\x87\x6c\x84\x3f\x08\xd0\xaf\x38\x9f\x7f\xf6\xb1\xed\x96\xe2\xf1\x7b\xf5\x7d\x59\xcc\xe2\x98\x4e\xe1\xd5\xd8\xed\xf4\xbe\xee\x95\x11\xe6\x3f\xc2\xd0\x01\x66\x00\x87\x6c\x84\x69\x72\xb4\x1f\xfa\xd8\xd5\x57\x87\x9c\xbc\x63\xd7\x56\xbb\x5e\xfc\x39\x49\x69\xcd\x34\xf4\xd1\x6d\x3e\xfc\x97\xa5\x11\xb1\xe7\x9f\x22\x22\x83\xb8\x60\x65\x94\x73\xff\x8c\xfc\xbf\xee\x1a\x5d\x33\xa1\x55\x35\xcc\xb9\x92\x74\xb9\x5a\x7e\x9f\x69\x6c\xd8\xda\x3e\x2f\x73\xaf\xe8\x5e\x7b\xd7\xa8\x4b\x98\x78\x94\x48\xc4\x3f\x76\x84\x95\x1c\xd8\x7f\x71\xdd\xf2\x3c\x14\x7e\xa5\x84\x1e\xd0\x98\x72\xd3\x01\xad\x65\xa1\x43\xba\x02\x53\x44\xa5\xb2\x2c\x49\xc3\x1c\xff\xef\x13\x65\xc3\x14\x07\xf3\x02\xec\x5e\x55\x29\x85\x1a\x0a\x4f\xa9\xb0\x19\x7e\xaf\xe0\xb9\x89\x8c\x4b\x6c\xea\x79\xdd\x27\x94\xec\x7c\xf8\x5f\x33\xc2\xa0\xa1\xfd\x5d\x23\x8c\x64\x84\xfd\x13\x96\xc9\xfd\x6d\x51\x48\xec\x9c\xf8\xc9\xf0\xcb\xfc\x6d\xf0\x1e\xde\xf5\x98\x52\xbf\x59\x83\x15\x5f\xff\xd3\xe0\x41\xfc\x9b\x33\xd9\xac\x44\x36\xc2\xbc\x26\x73\xb5\x9d\x17\x0c\xca\x92\x5e\x52\xe5\x67\x76\xf5\x0a\x36\xab\x4d\x90\xc5\x70\x08\x05\x13\x90\x8b\x52\x25\xca\x6e\x97\x9d\xc9\xd6\x2c\xb2\x11\x9e\x26\x0c\xaa\x2a\x71\x64\x6a\xc3\x54\x96\x65\xa9\x51\x6d\xec\x48\x16\x98\xf9\x99\x74\x11\xe3\x46\xae\x3e\x9e\xed\xbc\x51\x8d\xc8\x99\x8c\x16\xd9\x08\x8b\xd1\x3f\xdb\x15\x92\xe8\xb6\xcf\xf2\x49\xe7\x65\x3e\xe0\x32\xab\x72\xd3\xb8\x62\x6f\x24\xe2\x53\xaf\x27\xdc\x26\x77\xaf\x7d\xe5\x4c\x46\x8b\x6c\x84\xf9\x35\xcc\xfd\xcf\x9f\x2c\x63\xe5\xf5\x62\x5d\x5f\x42\xb3\x08\x65\xe1\xea\x34\x9a\x47\xa9\x61\x75\x6a\xb9\x68\x20\x40\xfb\x8c\xf3\xcc\x8c\x30\x48\x44\xa7\x65\xbe\x6a\x74\x1b\x67\x35\x41\x97\x80\x8d\x24\x0d\x22\xed\x4e\xf6\x4f\x84\x1d\x65\xad\x0f\x84\xe3\xe7\x1e\x0a\xd1\x55\x58\xb8\x7e\x81\x56\x29\x20\x0e\x9e\xf9\xd0\x83\x09\x9b\x8a\x19\x8c\x6a\x73\x8c\x0d\x9b\x65\x8c\xae\xe6\x96\x8e\xd8\x2b\x8d\x4d\xdc\xe6\xd5\x77\xa6\x46\x57\xbe\xb1\x00\x9d\x5f\x05\x71\xf0\xcc\xf7\x2b\xec\xd3\xdd\x9d\x5f\x7b\x56\xfa\xe6\x1f\xe7\x96\xb7\xcf\x93\xdd\x65\x69\x09\x7c\x11\x42\xc4\x18\xe7\x44\xff\x23\xe9\x4d\x30\x74\x34\x1a\xc4\xc1\x9f\x43\x5f\xd8\xcd\xbd\x10\x31\xb6\x7b\x9d\x63\x3f\x59\xf7\xa5\x12\x43\x99\x4d\xa4\x7a\xb9\x2f\x0b\x4a\x4a\x90\xa6\x4f\xd5\x5c\x91\x7d\x0f\x75\x5e\x01\x70\xf0\xe7\x20\x3d\xcb\xb6\x4d\xdc\xc6\x5f\x6c\xb0\xb0\xb0\xda\xde\xb5\xaf\xce\xe3\xa3\x3d\xc6\xc5\x54\x43\xe3\xc4\x88\xcb\xdf\x99\x7c\x07\x0d\x61\x84\x41\x1c\x54\x23\xfc\xef\x46\x18\xf4\x42\x9f\x26\x01\x27\x55\xac\x47\xd6\x8f\xe4\x2c\x16\xfc\x24\x3f\xe7\xe5\x57\xb0\xdb\xde\x6f\x7c\xb8\xb6\xfe\x4b\xac\xfa\x1a\x6e\x7a\xdc\xf6\x7d\xa8\x26\x0e\xc4\xc1\x87\x8e\x2a\xdf\xa0\xf4\x79\xad\xd8\xf7\x32\xf7\xe4\xa1\x9f\x79\xa7\xd2\x86\x71\xcb\x55\xee\xdd\x43\x9a\x8a\x06\xa6\x7d\x1a\x39\x23\xa8\x7e\x0b\xc4\xc1\x25\xd0\x3a\x1b\xe6\x97\xc2\x55\x97\xa9\xa4\x9d\x23\x4b\x6c\x46\xc0\x20\xb5\x40\x59\x11\xfb\xda\x5a\xe8\x83\x9c\x6e\xdf\xd8\xd8\x98\x0e\x22\x2e\x88\x43\xda\x19\x17\xa6\xdd\x7f\xe4\x52\xcc\xf7\x79\xfa\x99\xcb\x9c\x52\x74\x0e\xfd\x3d\x39\xec\x91\x2d\x22\xee\x4c\x01\x01\x51\xe1\xb4\x77\x03\xd0\xce\x38\x80\x83\x3f\x87\xab\x0d\xa8\x96\xa8\x23\xad\x62\x1d\x51\x04\xef\x51\x0c\x35\x63\xa2\x02\x05\x7c\x9d\x6a\xa7\x02\x84\x65\x7e\xf9\x0e\x10\x0f\x79\x23\x16\x3f\x20\x0e\xaa\x0d\x04\x18\x61\xd0\xec\x7a\x9a\x06\x1e\x7f\xd2\xfe\x3c\xff\x51\xea\xe5\xf3\xe2\xb8\x21\xe9\xfa\x13\xec\x5b\xdf\x02\x73\x7b\xb2\x15\x34\x82\xaa\x4d\x5f\x04\xce\xd1\x5b\x22\xc6\x0e\xe2\xe0\x63\x9f\x6d\x0d\xf7\xef\x8c\x28\x30\x11\xc6\x68\xad\xab\xfb\xbe\xdf\x1b\x48\x61\x35\xda\x6d\x76\xe1\x19\xd1\xb1\x31\x06\xb7\x71\xa5\x26\xf4\x71\x01\xc0\xc1\x35\xc0\xdb\x3a\x58\x4b\xb5\x2e\xc8\x7d\x2f\x34\x70\x31\xb5\xd7\x8d\x34\x53\x24\xa5\xe1\x6a\x27\xa3\x7a\x53\xf7\xd3\x91\x86\x41\x03\xe8\xba\x27\x10\x87\xb4\x33\xae\xc3\xea\x55\x15\xe1\x4d\xcf\x71\x83\x84\xa5\x50\x39\xc7\xe6\x72\xdb\xd7\xa9\xd0\x02\xbf\x37\x07\xd2\xd8\x87\x77\x3c\x26\xd2\x20\xe3\x0e\xe0\xe0\xcf\x61\x6e\x8b\xfc\xd8\xb7\xfa\x75\x87\x83\xc6\x82\x59\x8f\x66\x91\x27\x25\x43\x18\xca\xa0\xf1\xfb\x38\xff\x0f\x5a\xa8\x75\x38\x58\x59\x50\x6d\x20\x80\x83\x6a\x03\x01\x46\x18\x94\xea\x4e\xd3\x40\xb8\x37\x59\xd4\x73\x0a\xb7\x92\x3f\x5f\x3e\xbb\x2b\x5c\x7b\x87\x9b\xd2\xcc\x34\x35\x75\x71\x2f\x83\x3e\x7b\x6c\x90\xcb\x1c\xbb\x1c\x3a\x66\x0a\xe0\xe0\x63\x6f\x9e\xf2\x08\xfa\x1d\xf1\x4a\xf7\x5d\x2c\xda\x5d\x0f\xed\xee\x0b\xde\x51\xfa\xf1\x45\xce\x36\x71\x73\x84\x31\xbb\xf7\x32\xef\x42\xcd\xa7\x40\x1c\x5c\x03\x95\x8c\x0a\x44\xad\x97\x46\x74\x98\x89\x19\xd7\xaf\x5e\xd5\x8a\x58\xef\xae\x10\x32\xc4\x1d\x3b\xda\xe8\x17\x68\xec\xca\xce\x87\xea\xda\x41\x1c\xfc\x39\x64\xa6\x70\x4b\x1a\xf3\x4e\x36\xbc\xd1\x43\xf5\xc6\x6e\xae\x8a\x61\xbf\xc4\x4f\xb2\x20\xba\x83\x69\x41\xa6\x7a\x3d\x86\x7a\x60\x0b\xea\x41\x00\xe0\xe0\xcf\xe1\xb1\xa9\xcb\xdb\x94\x21\x0b\xba\x50\x23\xb2\x15\xb7\xd2\xd1\xca\x27\xe2\x28\x09\x94\x9a\x1a\x17\x48\x2c\xf8\xd4\x78\x6c\xd7\xed\x11\x1a\x00\x71\xd0\x3c\x00\x30\xc2\xa0\x75\xc7\x69\x1a\x98\xab\xa8\xc1\xb5\x25\xa6\x65\xbd\xeb\x4a\xf3\xc6\x51\xb8\x32\x68\xfd\x47\x0f\x03\x6a\x02\xfd\x92\xf5\x75\x3e\xee\x27\x5e\x01\xd0\x2e\x3b\x88\x83\x8f\x3d\x10\xe3\xeb\x83\x4f\x05\x9f\x7a\x77\xa4\xb9\xc8\x87\x03\x27\x77\x94\x06\xe3\xba\x6a\x8a\x99\x89\xb6\x7f\x55\x78\x2d\xc7\xc4\xdc\x41\xc4\x05\x71\x48\xa7\x83\x3c\xcb\x4d\x26\x22\xe3\x95\xd4\x4b\xa6\xb3\x0a\x5c\xdb\x24\x12\xd2\x96\x38\x23\x73\xd6\x55\x3e\x99\x0a\x77\xf8\xb2\x38\x40\x06\x1b\xc4\xc1\x9f\xc3\x4d\xd9\x9c\xb9\xbd\x0f\x09\x93\xf9\xe7\x84\x24\xec\x30\x37\x9c\x88\x1f\x4c\xdb\x48\x0a\x10\xc6\xf1\x96\xd2\x5e\x2d\xe4\x68\x7d\x03\xf5\x8b\x00\x70\xf0\xe7\x60\x50\x7e\xb3\x43\x4a\xc8\x6b\xdb\x91\xbc\x9d\xd1\xe3\x21\x95\xae\xce\xb2\x20\xa6\xd6\x54\x90\xfe\x58\x92\xfe\x6b\x61\x95\x66\x2c\x84\x06\x40\x1c\x34\x0f\x00\x8c\x30\xc8\x44\x9d\x6e\x84\x37\x15\x3f\xea\xbe\x29\xee\xb2\x4c\xa7\xe5\xde\x88\xd5\x21\x52\x32\x2a\x32\x6a\xa3\x68\x6c\x1a\x44\x23\xbb\xf2\xfb\xcd\x97\x14\x47\x84\xa9\x04\x71\xc8\x46\x98\xc4\xb5\xce\x64\x87\x98\x26\xf9\xe6\x6e\x0f\x83\x6d\x66\x89\xa9\x76\x51\xec\x4f\xf9\x0f\xb8\x6f\x73\x99\xb5\xef\x74\x67\xb8\x40\x16\x1b\xc4\x21\x1b\xe1\xd4\x2b\xfd\xb3\x14\x7d\xcb\xd8\x8c\x57\x19\xc9\xf1\xea\xa2\xdb\xaf\x5a\xa2\x35\x2e\x05\x31\x25\x3c\xaa\xf4\x45\x1d\xfa\x9c\x7d\x1e\x11\x19\xc4\x21\xf7\xa3\xfe\x5f\x77\x8d\xc6\x61\xc0\xef\x35\xc6\x2b\x90\x4a\x66\xeb\xce\x2f\xb9\xd9\x8c\xf7\x5a\xa3\x78\xf4\x0e\xee\xb1\xed\x40\xd2\x5b\xd1\x70\x57\xc5\xe4\xbf\x8d\xf0\xbc\x0a\x6a\x56\x6d\x01\xaa\x4b\xef\x8e\x79\x77\x66\xb3\x1d\x75\x92\xec\xa5\x84\xf4\xcf\xf4\x96\xbb\xb8\x64\xf5\x55\x8c\xe3\x5f\xfe\x42\x25\xa3\xc2\xf5\x85\x17\x14\x9d\xcc\x1e\x6c\xba\x11\x5f\x78\x50\x5b\x72\xe5\x25\x9f\x16\x4b\xf6\x2f\x3d\xb3\x4f\xae\x0f\x73\x4a\x4d\xfe\x6b\x46\x18\x34\xb4\xbf\x6b\x84\x91\x8c\xf0\x9c\x62\x6f\x3c\x61\x1f\xf9\x09\xd3\xcf\x01\xfd\x63\xfc\x6e\x76\xe9\xac\x35\x6c\x4b\xa2\xd4\xeb\x42\x25\x5a\x76\x9a\xae\x57\x9e\x9f\xc9\x66\xa5\x10\x92\x47\x23\xb6\xae\x7b\xf9\xb8\x95\x62\xf9\xe1\x8f\xcb\x1d\x0a\x98\x0b\x4f\x97\xa7\x55\x24\x27\x9f\x1a\xf0\x09\xb8\x50\xe0\x55\x6e\x6c\xe1\x9d\xc9\xd6\x2c\xb2\x11\x7e\x37\x39\x21\x45\xd0\xc1\xcd\x11\x73\xb3\x3c\x55\xea\x26\x4f\x39\x85\xc9\x85\xf8\xd1\x55\xed\xbc\xfe\x5b\x86\x61\xeb\xcd\xfb\x5f\xcf\x64\xb4\xc6\x48\x7f\x76\x66\x9f\xed\xf7\xcc\xa7\x74\xe2\x68\xae\x77\xae\x86\x6a\x4c\xd9\x59\x66\xb7\x96\x0b\x79\x6f\x79\x85\x33\x5d\xff\x40\xeb\x69\x50\x75\x26\xa3\x45\x36\xc2\x54\xad\x07\xfd\xb6\x97\x02\xc7\xb9\x32\x7d\x37\xd4\x98\x27\xd8\x3b\x22\x68\x45\x2a\xa5\xae\x79\x4d\x96\x16\xb8\xab\x07\xd2\xed\x9c\x99\x11\x06\x89\xe8\xd4\x96\xc1\xbf\x89\x77\x4d\xf9\x6e\xe5\xa2\xee\x52\x6f\x5e\xc3\x2b\x1e\x51\xfd\x89\xf1\xb5\x35\xad\x64\xac\x16\x9b\x69\x5f\xbf\xc5\x1d\xba\x2f\x04\xc4\xc1\x67\x7c\xf2\x2d\x01\x1d\x8d\x14\xae\x5d\x81\x63\x41\x21\x7e\x83\x54\x75\xcb\x45\x5b\xfa\x16\xab\xd9\x83\xf4\x75\x34\x87\xcb\x28\xd6\xd0\x85\x9c\x20\x0e\x9e\xf9\x5a\x04\xbe\xff\x30\xca\xba\xb6\x6c\xc3\x37\xc9\xb5\xe4\xfc\x65\xc5\x6a\x43\x53\x30\xc6\x06\xef\x92\x6f\x2d\xcb\x6f\x6a\x33\x3b\x68\x55\x05\xe2\xe0\xcf\xc1\xe0\x46\xe5\x79\x46\x43\x2f\x34\xb5\xcd\x8b\x1b\x55\xea\xb7\x32\xfc\x29\x7a\x66\x7e\x9d\x5f\x4e\x7f\x46\xb7\x50\x5a\x87\x52\x07\x7d\x0a\x07\x71\xf0\xfb\x1d\x6e\xc4\x5d\x9a\x32\xa4\x7e\x20\xf1\xee\xe3\x8a\x21\xef\x73\x5a\x53\x61\xd9\x07\xef\x7c\x92\x43\x06\x50\x1e\x79\x34\xe4\x72\xee\xe0\x21\x8c\x30\x88\x83\x6a\x84\xff\xdd\x08\x83\x5e\xe8\xd3\x24\x10\xfb\x74\x6b\x08\x1f\x65\xa8\x63\xa5\xec\x30\x2b\xe8\x2e\xb5\x61\x8f\xc9\xe3\xc0\x36\xbd\x50\x66\x73\x21\x61\xf4\x5d\x69\x03\xe8\xca\x67\x10\x07\x97\x00\x7d\xaa\xcf\x8d\x17\x8f\x6a\x39\x2e\xa7\xa3\xfe\x49\xb1\x7a\x8e\xa3\xe8\x88\x46\xd6\x13\xfe\xc9\x7b\x85\x3b\xf6\xcf\x45\x94\xf3\x2c\x88\xb8\x20\x0e\xa9\x4c\x5c\x79\xee\xcf\xed\x27\x3e\x16\x55\x7e\xee\xcc\x95\x7a\xab\xcf\xd0\x3b\xe7\x5b\xa6\xde\xa9\xdc\xec\xa6\x56\xf5\x78\x3a\x50\x54\x09\x95\x89\x03\x38\xf8\x73\xb8\x9d\x78\xf3\x71\xe7\x87\x88\xf3\xa4\xf1\x77\xb8\xb5\x0f\x92\xb3\x13\x2b\x7c\x76\x2e\x1f\xdd\x97\x6b\x12\xea\x11\x1a\x95\x9d\x87\xee\x27\x06\x71\x70\x09\x64\x0c\xd6\x9b\x85\x27\x2a\xd1\xaf\x04\x5f\xf8\x51\x1d\x28\x9c\x2e\x4e\x7b\xfb\xb3\xfa\x79\x1c\xac\x3b\xba\xd1\xa6\xee\x2c\xf2\xd0\xb1\x58\x10\x07\xd5\x06\x0a\xfd\xfb\x02\x18\x34\xbb\x9e\xa6\x81\x43\x7f\x91\x50\x95\xf3\xf4\x2c\x26\xf1\x4f\xce\x4f\x2f\x7d\xbd\x7c\xd3\x6f\xda\x41\x4f\x42\xb7\x2e\x86\xec\x73\x5a\x9e\x81\x1a\xb4\x00\x06\x71\x48\xb5\x81\x24\xfc\x2b\x69\x3b\x61\x73\x83\x2e\xfa\x89\x7a\xd3\x45\x4d\xf6\x46\xf8\x5f\x0f\xb0\x73\x55\xef\xba\x4a\x9b\xcb\x19\xbf\x87\x8e\x9b\x83\x38\xb8\x06\x38\xb1\x34\x59\x16\x96\xdc\x1e\x11\xe0\x28\xdc\x41\xff\x75\x80\x93\x27\x57\xc4\xfb\x11\x47\xb6\x12\xf7\x7e\xef\x10\x96\xff\x34\x2a\x22\x2e\x88\x83\x3f\x07\xb2\x6d\xab\x1b\xe9\x53\x05\xfe\xd9\xc1\xb6\x16\x24\x93\x36\xf5\x93\x3d\x55\xa9\xa2\xc3\x1d\xb7\xa5\x7e\xff\xfc\x71\x49\x53\xfb\x1d\x54\x1b\x08\xe0\xe0\x1a\xb8\x6c\xa2\x75\x95\x86\x88\x6b\x32\xbc\x81\x3c\x4c\x53\x96\x0c\xcd\x81\xb3\x72\xbb\x08\xeb\xa4\x5a\x99\xd5\x3e\x83\x3b\x46\xe0\x2a\x42\x03\x20\x0e\xaa\x0d\x04\x18\x61\x50\xaa\x3b\x4d\x03\x64\x24\x0f\xb7\x88\x70\x7f\x63\x30\x63\x3b\x5b\xb9\x14\xf2\xa0\x8f\xde\x6f\x2f\xbf\x49\xaa\x5c\xc1\x81\x72\x3c\xd7\x8a\x53\x7d\x19\x1a\x3b\x80\x83\x6b\x80\xeb\x1a\xfe\x0f\x16\x52\x42\x23\x2a\x74\x72\x0e\x6a\x36\xb5\x76\xfe\x5b\x79\x69\x69\xd4\x0b\x16\x06\x0f\xa5\xef\xdf\xdc\xb9\x02\x99\x0a\x10\x07\xd7\x00\xaa\x9d\xe8\x15\xec\xb8\x25\x66\xe1\xcb\x23\x79\xe2\x35\x7c\xc7\x79\x6e\xe2\x24\x2b\xf4\x63\x71\x1f\x59\xbf\x27\x2c\xa5\x37\x8f\x40\x1f\xda\x00\x1c\xfc\x39\x6c\xf8\x4a\xe9\xea\x87\xfb\x51\xbb\xdb\x2e\xa3\xdc\x72\x5e\x10\x59\xa3\x51\x44\xc3\xed\xb0\xfa\xa8\x97\x7d\xa8\x3d\xe4\x29\x06\xbd\x0b\x20\x0e\xae\x81\xeb\x2e\x2e\xcd\xd5\xc1\xba\x84\xfb\x84\x8e\xae\xd8\x8f\x09\x3f\xa7\x1b\x6c\xb4\x11\x76\xd0\x33\xd8\xed\xde\x73\x17\x7f\x73\xeb\x3b\x42\x03\x20\x0e\x9a\x07\x8c\xff\x5d\x03\xa0\x75\xc7\x69\x1a\x78\x11\x4a\x5d\xdb\x67\x2c\x3b\x86\x3d\xbd\xb9\xfb\x3e\x04\x33\xb8\xf6\xe2\x94\x0a\x7e\xa2\xaf\xe8\xa6\xc2\x49\xfe\xb7\xcf\x3e\x35\x88\xb1\x83\x38\xb8\x06\xbe\xc6\x34\xb4\xfe\xca\xd2\xc5\xe0\x26\x78\x46\x98\xa7\xed\xde\x3d\xf5\x79\xc4\x6f\xb4\xd6\x5d\x7a\xad\x92\xba\xcf\x9d\x7b\x09\xfa\xce\x0c\xe2\xe0\x1a\xc0\xf8\xae\xea\x10\xcf\xc3\x1d\x22\x86\x62\xc5\x3f\x1e\x1f\xfe\x03\x8b\x89\x4a\xa8\x27\x9c\x59\x39\xb9\xa2\x77\x93\x9b\xde\x33\x0c\x11\x17\xc4\xc1\x9f\x43\xd6\xf7\x57\x94\xe2\x41\xfb\x43\x74\x22\x8f\x05\xdf\x86\xa3\x73\x73\x87\x07\xcb\xc7\x2a\x0a\x95\xbd\x98\xe8\x5b\x1d\x55\xf6\x83\x6e\x69\x04\x71\x70\x0d\x38\xa4\xfb\xc7\x17\x7b\xa2\x09\x1d\x46\xd0\x3f\xef\x4a\xbb\x38\xd1\x92\x88\xd9\xd4\xf1\xcb\xd7\x24\xd9\xcf\xd4\xae\x52\xe6\xc5\x00\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\x64\xa2\x4e\x37\xc2\x14\xdd\x17\xf4\x42\x3f\xce\x34\xde\xce\xd0\x53\x6e\xbe\xe8\xff\xbe\x4d\x8a\x27\x9e\xe5\x73\x1b\xee\x42\xd3\xe7\x77\x9f\x28\x27\x5a\x10\xa6\x12\xc4\x21\x1b\xe1\xb2\xd2\x27\x36\x27\x4d\x53\x46\x83\xb5\x5c\x5f\x16\x64\x3a\xe3\x9e\xe6\xcf\x79\x65\xaa\x99\x79\x7e\x37\xca\x64\xaf\x1b\xcf\x39\x42\x44\x06\x71\xc8\x46\x78\x9c\x48\x64\xe3\x85\x23\xc9\xb8\xbc\x1e\xfb\xbc\xcd\x6d\x47\xb2\x92\xc9\xaf\xa8\x44\xf6\x7c\xbb\x78\x3d\xe8\xbc\x42\x18\xdd\xbc\x88\xc8\x20\x2e\x58\x19\x85\xe1\x9f\x91\x4d\x70\x17\x0d\x27\x8f\x5c\x0c\x9d\x7f\xc8\xf6\x60\x45\xfe\x7a\x92\x3d\xd8\xea\xe2\x95\xdd\xcc\xe7\xa6\x9e\x81\xe3\xe4\x99\x2b\x03\x19\x61\x9e\x07\x26\xd1\x9e\xd6\xf2\xe3\xbc\x5d\x0f\xc9\x97\x2e\x5f\xa9\x21\x0b\x5c\xa8\x90\xa1\xef\x3e\x57\x9a\x70\xa3\x93\x4a\x6b\x83\xef\x6f\x23\xdc\x84\xf9\x3b\x43\x6c\x54\xb9\xa0\x78\x83\x9f\xe5\x6a\xe0\xd6\x8f\x1e\x27\xce\x04\xe2\xf8\xd0\xfc\xc0\xe9\x70\x43\x96\x3e\xea\xbf\x0d\x9f\xfd\x16\xff\xef\xbe\x6f\x2b\x91\xfb\x98\x7d\x5d\xdb\xf2\x37\x94\xdb\xc7\xec\xc3\x84\x08\x26\xfc\xe8\x93\x8f\x5d\xea\xe6\x82\xd1\xff\x6b\x46\x18\x34\xb4\xbf\x6b\x84\x91\x8c\xf0\x72\x0c\x8b\xcb\xa1\x7a\x59\xdb\x07\x6f\x93\x8b\xce\xd6\x8d\xed\x73\x58\x1a\x69\x74\x9a\x9c\xaa\x12\x7d\x53\x1f\x0e\x7e\x2a\xcc\x9f\xc9\x66\x25\xb2\x11\x2e\xf0\x5e\x39\x48\xd9\x37\xda\x5d\xa1\x65\xfb\xb9\xe2\xab\x23\x48\x41\xfd\xdc\x7f\x65\xff\x3d\xb6\xf8\xf9\x68\x07\x15\x56\x1d\xbd\x33\xd9\x9a\x45\x36\xc2\xac\x6c\xb2\x18\x0b\x5a\x1c\x9d\x4d\x8e\x33\x6a\x51\x3b\xdf\xad\x74\x24\xe2\x85\xf7\x0d\xdc\xd2\xae\xc7\x59\xee\x37\x8f\x10\x9c\x89\x23\x95\x47\x36\xc2\x74\x31\x87\xc9\x47\xbf\x3c\x30\x51\x74\xd8\xb8\x59\xbd\xed\xea\xf1\x7f\xc5\x2d\x52\xe2\x99\x37\xe7\xbd\xac\x11\xdf\x89\xca\xbf\x7d\x26\xa3\x45\x36\xc2\x6d\x8e\x03\x56\x95\xae\x33\xe5\x4b\x1e\x5e\xcf\xb2\xb6\x15\x4d\xf7\x95\xba\x85\x6d\xf3\x4f\xbc\x6a\x0e\x59\xdf\x0b\xce\xd5\x19\x9c\x99\x11\x06\x89\xe8\xb4\xcc\xe7\x3e\xf9\x80\xbf\x01\xd5\x73\xe4\x77\x09\xd1\xce\x73\x45\x27\x9b\xe3\x4b\x5f\xba\xe4\x8f\xfa\x6d\x3c\x27\x9f\x8f\x9c\x63\xce\x84\x2e\xe4\x04\x71\xf0\xcc\xb7\x16\xe1\x40\x1a\xb6\xd2\x7e\xb7\xb8\x7f\x55\x06\xed\x67\xa8\x92\xb7\xce\xb7\x64\x55\x4c\xd9\xea\xfd\x9b\x1c\xfc\x97\x9e\xb2\x8b\x21\xe2\x82\x38\x78\xe6\x9b\x21\x52\xab\x91\x2d\xe4\xc8\x4f\x35\x79\x75\x62\xeb\x93\x99\x7d\x85\x54\x39\xf7\xf8\x48\xde\x5b\xe1\x9d\xba\x83\x76\x8f\xe8\x6d\xa8\x0d\x2d\x80\x43\xda\x0a\x4a\xe0\x8a\x7a\x5f\x72\xdb\xea\x31\x01\x99\xfc\xb5\x7b\xfb\xbb\xab\xf1\xdf\x9b\xeb\x33\xaf\xcb\x7e\x3f\x32\x90\xf5\x2f\x74\x87\x76\xb0\x41\x5c\xb0\x22\x8a\xfc\xdf\x71\xe7\x1f\x54\x37\xde\x7d\x6a\x34\xef\x5c\xce\x57\x48\xc0\xf1\x88\x2e\x60\xc5\x6b\xf5\x79\xae\x8d\x26\xf7\x4f\xff\x42\x0e\x2e\xd2\x5c\x84\x11\x06\x71\x50\x8d\xf0\xbf\x1b\x61\xd0\x0b\x7d\x9a\x04\x1c\xbb\xbf\x1f\x55\xf6\xa3\xb0\x58\x92\x0e\x51\x57\x5b\xa4\xaf\x38\x98\x36\xbf\x72\xb5\x4c\x1a\x67\x7c\xc5\x6b\x43\xa4\x25\x9a\x82\x18\x3a\x88\x43\x3a\x12\xc9\xac\xad\xd1\x74\x20\x49\xa7\x25\x4b\x46\xd3\x25\x62\x66\xde\x64\x45\xfa\xcc\x2c\x96\x22\x7f\x97\x6d\x98\xc8\x45\x91\xa6\x1b\x3a\x12\x09\xe0\xe0\x12\x38\xf8\x54\xfa\x67\xd8\xbe\x8d\xfd\x19\x0f\x81\x94\xf8\x58\xdd\x83\x2f\x7d\xad\x33\x46\x93\x61\x63\x0f\x1d\xba\xac\x16\x9b\x59\x7b\x11\x71\x41\x1c\xfc\x39\xc8\xc8\x5e\xd5\x65\xa1\x4b\xea\xa5\x89\x98\x95\x4f\x97\xc8\xf3\xfc\xee\x8b\xf1\xc3\xc0\x88\x57\x25\x62\x77\xd7\xa2\xc6\x49\x73\x02\x2a\x3f\x07\x70\x70\x09\x30\x4c\x55\xcf\xd3\x65\x3f\x89\x37\xd7\x97\x8c\xa2\x1e\xd8\x78\xbc\x7e\x3b\x8f\x2e\x97\x36\xb5\x30\xd2\x64\x75\x74\xba\x9e\xc3\x10\xb1\xf8\x01\x71\x50\x6d\x20\xc0\x08\x83\x66\xd7\xd3\x34\x80\x3d\xbf\x1e\x7f\x63\xbc\x93\x28\xe5\xe4\xe7\xb0\xd1\xc9\x35\x9a\x7b\xde\x99\x32\xd7\xb8\x2b\xb5\x3e\x86\xa5\xae\xf9\xa9\x6c\x42\xb7\x87\x81\x38\xa4\xa3\xd1\xd5\x0f\x24\xe8\xc9\x0f\x0a\xd0\xae\xbc\xa2\xea\x6d\xa9\xd7\x7b\x15\x21\x85\xc3\x5d\x5d\x15\x92\x9b\xff\xa7\xb7\xef\x27\xdb\xff\x1c\x8d\x06\x70\x48\xc7\xe3\x19\x06\x83\x3d\x17\xa9\x94\xc6\x4c\x0c\xb7\xce\x2d\x19\xa6\x62\x75\x7e\x33\x96\x3c\x79\xb4\xb7\x50\xbe\xb1\x71\x6f\xfb\x4f\x32\x74\x3c\x1e\xc0\xc1\x9f\x03\xc7\x8d\x86\x2b\x86\xd7\xb2\x82\xee\x73\x56\x7f\x49\x0f\x76\x7b\xc2\x33\x71\x38\xfa\xb5\xc9\x50\xbb\xaf\xf9\x9d\x79\x1e\x9f\x53\x35\x22\x2e\x88\x83\x6b\xe0\x42\x72\xa2\xf8\xed\x08\xd4\xdb\xf8\x46\x06\xac\xb3\x8b\x94\x1d\xf6\x46\x7a\x2a\x09\x38\x3e\xbd\xa1\xfa\x16\x0c\x9c\x92\xee\x38\x08\x0d\x80\x38\xa8\x36\x10\x60\x84\x41\xa9\xee\x34\x0d\x60\xca\x4d\x1b\xf9\xb4\xde\x7c\x54\x66\x26\x49\x55\x2d\x3e\x37\x72\x61\xeb\xb2\xff\x32\x89\x94\x81\xd1\x7d\xda\xca\xa4\x9d\xd7\xe4\x88\xb1\x83\x38\xb8\x06\xda\x9b\x6a\x1c\xe8\x4f\xa2\xe4\x56\x3f\xaf\xd2\xae\x34\xa5\x62\x76\xe5\x1c\xf8\x1d\x7c\x36\x13\x7f\x72\x0f\x5d\xfd\x31\xb5\xc1\x21\x22\x2e\x88\x83\x6b\x40\xbb\x9e\xe0\x45\xc0\x15\x0b\x0c\x0e\x8c\x96\x44\x94\x7b\x4f\xd6\xc6\x06\xc4\x4c\xb2\x09\xc2\x0f\x3e\x7e\xc9\xe3\x51\xef\xc5\x82\x3e\x88\x81\x38\xf8\x73\x70\x79\x5a\x83\xc9\xed\x21\xe3\x16\x47\x83\x1f\x5c\x6a\xdf\xff\x95\x3f\x8a\x42\xda\x87\xf2\xc9\xe6\x40\x48\x21\xfb\xfe\x5d\x09\xa8\x5d\x04\x88\x83\x6b\xe0\x44\x69\xf0\x53\x3d\x7e\xcf\x62\x53\x76\x51\xcb\x8f\x96\xa0\x73\x56\x4a\xfa\xfa\xe8\x56\xb2\xed\x39\x2d\xc5\x91\xdc\x25\xe6\x36\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\x34\x0d\x94\xa1\x06\xb4\xf8\x5b\xde\xdd\xf2\xfd\xd8\x15\x7e\x85\x9f\xa7\xf0\x31\x1b\xe9\x91\xd1\x1c\xcb\x49\x24\xa5\xef\x24\x86\xb1\x25\x74\x8a\x07\xc4\xc1\x35\x10\x83\x47\x14\x73\x97\x38\x35\xa4\xd7\xd3\x6e\xa9\x82\x24\xa6\xe1\x95\xea\x45\xc5\x1e\xf4\x4b\x3e\xec\xf9\x37\x1c\x7a\xa2\x7f\x28\x20\xe2\x82\x38\xa4\x1b\x04\xd8\x77\x58\x7f\xe1\xd9\x19\xc8\x69\xe9\xb4\x92\x4d\x54\xa5\xa2\xa6\xf0\xf9\xe3\x4d\x44\x61\x66\x96\x7c\x12\x30\x09\xb8\x04\x2d\x33\x40\x1c\xd2\x55\x62\xd3\x3c\xa8\xf4\x93\x45\x99\x56\x73\x14\x31\x8a\xd1\x41\x74\x47\x06\x8a\x22\x3f\x37\xd5\xbf\xfb\xba\xc6\xcf\x3a\xd7\x18\xda\x22\xe2\x82\x38\xb8\x06\x64\x94\x8d\x47\xfb\x07\xcc\x1f\x37\xca\x4b\x3e\x26\xb3\x4b\xf8\x82\xfe\xdc\x86\x52\xb7\x5b\x28\x27\x9c\x78\xe3\xb2\x74\x2b\x25\x17\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\x64\xa2\x4e\x37\xc2\xec\xee\x3c\xac\xb5\x95\x0f\xb6\xe6\xe4\x83\x18\x2a\x28\x3a\x08\x55\x18\xb3\xab\x22\x5f\xaa\x30\xd8\x5a\xeb\xca\x6a\xe0\x32\xc4\x20\x4c\x25\x88\x43\x36\xc2\xdb\x8a\x47\xd5\xf7\xf4\x2f\x9c\x1f\xc6\x1e\x6d\xc0\xab\x8f\xfd\x6d\xc7\x9e\x23\xfe\x86\x22\xe3\x49\xe1\xf6\x1f\xe1\x6c\xfd\x7d\x12\x44\x64\x10\x87\x6c\x84\x57\xa2\x4d\xfa\xf0\x0d\xf7\xfe\xb8\x6c\x5a\x5f\x7c\xf4\xa0\x13\xfd\xa7\x7f\x3e\xaa\xda\x9a\x9f\x68\xa4\x38\x99\x8e\xab\xcd\xb8\x20\x22\x32\x88\x43\xfe\xcd\xde\x34\xa5\xf1\x57\xc6\x0e\x8d\x18\x83\xfd\x54\xd6\x0b\xd4\xb9\xac\xfb\x48\x51\x9c\x3a\xc7\x8b\x2a\x8c\x8e\x7d\xaa\x45\xa8\x6d\x21\x23\xfc\xfc\xc2\xd7\x93\xa2\x4d\x1c\xf1\xeb\x97\x14\x53\xdb\x47\x9c\xe3\x59\x4c\x63\x23\x3e\x55\x7d\xd4\xbb\x55\xf5\x88\x8e\xf3\x87\x3b\xd7\xdf\x46\xd8\x25\x98\x54\x60\x39\x8f\xf7\x0a\xbf\xb8\x86\x93\xed\x73\xf3\x4b\x7e\x39\xe5\xb4\x05\x3f\xe7\xd5\x1f\xc9\xec\xa4\xa0\x15\x78\xfc\xe3\x06\xd9\x93\x10\xb6\x78\x69\x37\x5d\x7c\x62\x11\x4e\x9c\x1d\x07\xbd\xb9\x62\x32\x8f\xba\xbd\xfd\xb7\x81\xde\x7d\x0f\x57\xbf\xd0\x4e\xff\xd7\x8c\x30\x68\x68\x7f\xd7\x08\xab\xc1\xcd\xd2\x1d\xc6\x0f\xfe\x0b\xa9\xa8\x2b\xd7\x3f\x27\x0d\x12\xb0\xa9\x85\xde\xae\x08\xe6\x34\x7b\x1a\x12\xcd\xbe\x2d\xfd\x5e\xa2\x83\x73\xf5\x4c\x36\x2b\x91\x8d\x30\x4e\xff\x72\xc6\xdd\x8d\x19\x2d\xa2\x83\xc0\x86\xd6\x5a\xa5\x15\x1b\x69\xd7\xc3\xcd\xf0\xf4\x78\x3c\x89\x54\x33\x3d\xc7\xa4\x07\x67\xb2\x35\x2b\x8b\xf4\x67\x13\xa3\x65\x2e\x8b\xf5\xcc\xe9\xc5\xbd\x97\x5d\x20\xbc\x6d\xf9\xe7\x06\x4d\x1d\x65\x58\x86\xe3\x5e\xba\xf8\x9d\xc2\x7e\x29\x2d\x85\x33\x19\x2d\xb2\x11\x76\xee\x30\x6b\x1c\x33\x1c\x49\x89\x21\x4e\xe9\x1d\x20\xc9\x24\x68\x1c\x6d\x11\x0f\xb4\xeb\x1a\x6e\xa1\xbf\x41\xad\xd4\x1f\xcd\x73\x26\xa3\x75\x47\xfa\xb3\xf2\x06\x25\x9c\x92\x8f\xb0\x38\xc8\x8e\x4b\xbb\x64\x96\x29\xa4\x51\xd7\x6a\xc4\x47\x30\xe4\xfc\xaf\xeb\x1a\x32\xe6\xde\xbd\x8a\x73\x66\x46\x18\x24\xa2\xd3\x32\x9f\xfd\xb8\x38\xde\xdb\xf1\xdd\xcb\x0d\x0a\x1c\x82\x7d\x89\x3e\x03\xd8\x8d\xa8\x79\xef\xc2\x63\xa8\xdf\xfa\x0f\xb0\xbd\x64\x49\x83\x8a\x61\x40\x1c\x3c\xf3\x15\x6c\x1b\x0f\x1f\xca\x75\x04\xca\x8a\xa7\x71\xc7\x13\xd5\x59\xb6\x50\xbb\x95\xca\x53\x6d\x9c\xbb\xe0\xb3\x67\xd3\x9c\xf3\x19\x6a\xe9\x09\xe2\xe0\x99\xaf\x04\x7f\x20\xb4\xf8\x93\x72\x81\x94\xfe\x2e\x8f\x40\xd5\x67\x6a\x4a\x5f\x19\x86\x57\x84\x0b\x34\xda\xd1\xcd\xa2\x21\xc6\xd8\x9d\x88\xb8\x20\x2e\x58\x11\xed\x9f\xe7\xe1\xa4\x29\x6e\x9b\xf6\x7f\xa8\x99\xe8\xc0\x61\x49\x5e\x39\xcc\xa7\x90\x96\x1a\xf3\xb1\x7f\xf1\xb8\x17\x43\x59\x5d\x31\x26\xda\x1b\xca\xa8\x00\x0e\x1e\x57\x1c\x43\x9c\x2e\x33\x8b\x9f\xa9\x6b\xb0\x46\xf3\xaa\xcd\xaf\xab\x34\xa2\x31\x2f\xac\x1b\x04\xb7\xb7\x97\x3f\x70\x57\xb4\x6c\x43\xf7\x08\x83\x38\xa8\x46\x58\xed\x5f\x17\x3f\xa0\x17\xfa\x34\x09\x50\xfa\x2d\xb1\x3d\x43\xcf\x9c\x3b\x29\x32\x6e\xa0\x13\x91\x70\xd0\x54\xb3\xa1\x9b\xa4\xdb\xe8\x4a\x9a\xc2\x50\xcf\xbb\x3f\x67\x81\x18\x3a\x88\x43\xba\x41\xab\xc8\xf8\xc7\x1b\x23\xff\xc0\xf5\xd4\xfb\x8f\xe4\x33\xe8\x9d\xd4\x08\x86\x45\x4a\x16\x7f\x53\x48\x8d\xbe\x73\x9b\xd6\x55\xf3\x41\xc4\x05\x71\x70\x09\x50\xee\x76\x15\xba\xb4\x87\xb3\x07\x8e\x6a\x9b\xf9\x3e\x7f\xf8\xbc\x25\x1a\x7b\xe1\xbe\xe8\x68\xbb\xe7\xe6\x81\x49\xb6\xf1\x01\xd4\x84\x0b\xc4\xc1\xff\x55\xb6\x6f\xcc\xa9\x12\x47\xa9\xbd\x7e\x1b\x1b\x0b\x70\xe6\xb7\x9e\x23\x79\x6f\xbd\x12\x1d\xef\xe8\xdf\x6a\xc0\xbe\xa2\x54\xef\xb1\x83\x88\x0b\xe2\xe0\x71\x23\x56\x3d\xdf\xd4\xf2\xd0\xc4\x0c\x9b\xd7\x3e\xed\x53\xba\xdf\xfd\x36\x31\xbe\x50\x5a\xa5\x22\x45\x43\xc8\x47\xf5\x92\xff\x5a\x27\x62\xf1\x03\xe2\xa0\xda\x40\x80\x11\x06\xcd\xae\xa7\x69\xc0\xf2\xc5\xce\x9a\x42\x0b\xaa\xcf\xd6\x58\x3b\xd5\x04\x89\x8c\x7d\x61\xfc\x84\x7a\x57\x02\xfe\xfd\xfb\xad\xee\xac\x18\x4d\xda\xd0\x0e\x2b\x88\x83\x6b\x60\xf3\xbd\xb6\xa9\x2e\x8f\xc0\xcf\xb9\xf4\xc1\x51\x45\x9d\x2e\xa7\xb1\x30\xca\xa7\x75\x36\xd3\x61\xc3\x6e\xa2\x44\xbf\xa9\xca\x79\x10\x71\x41\x1c\x52\x93\x9c\xf4\xd5\xad\x99\xd6\x6c\xfe\xe2\xea\x60\xdf\xe2\x9e\x76\x1f\x83\xd0\x1f\x36\xce\x2b\x9c\x4f\xfc\xdd\x1f\x99\x27\xa8\x14\x6e\x43\x4d\x72\x00\x1c\xfc\x7f\x55\x86\xcd\x29\x98\x79\x9d\x00\xfd\x93\x7f\x52\xbc\x31\x4f\xda\x68\x59\x6b\xff\x9d\x71\x42\xdb\x84\xaa\x1c\x0d\x94\xed\x7a\xc9\x26\xc8\x08\x00\x38\x78\xdc\x9b\x26\x6b\xbb\xf1\x66\xe8\x6f\xed\x39\x39\xc8\xa4\xb7\xc8\xa7\x5b\xb5\xc5\xbe\x2f\xd5\xb7\xcc\xe0\x85\x17\x2c\xd1\x7e\xe1\xe8\x46\x68\x00\xc4\x41\xb5\x81\xb2\xff\xae\x01\x50\xaa\x3b\x4d\x03\x29\xfc\xee\x7a\x59\xc6\x22\xe9\xa8\xe9\x61\xe9\xa1\x8b\x95\x1c\xaf\x43\x48\x8f\xc2\x3a\x55\x3e\x1c\xc4\x97\x5d\xbb\x32\xf7\xf0\x16\x62\xec\x20\x0e\xae\x01\x51\xbf\xc9\xb4\xa8\x8d\x8f\x3e\x4f\x6c\x23\x9a\x89\x2e\x5b\xa2\x1f\x25\xdd\x08\xd9\xb6\x29\x7b\x7e\xdd\x59\x4b\xd4\x44\xac\x09\xda\xb9\x05\x71\x70\x0d\x4c\x59\x52\x95\xd8\x0c\xc6\x7c\x5f\x0d\x4b\x0d\x11\x54\xe7\x5f\x7c\x1c\x4c\xa1\x28\x4c\xd2\xf7\xd5\xf4\x97\x59\xd7\xbe\x1c\x11\xd4\xdb\x00\xc4\xc1\xff\x57\x14\x2e\xd7\x4b\x3f\xf1\xed\xdb\x37\x57\x68\xac\x8e\xd6\x14\x28\xbc\x35\x5e\x75\xee\x7b\xcd\x61\xb1\xbd\x55\x83\xf9\x4c\xf5\x25\xd4\x45\x1f\xc4\xc1\xe3\xbe\x43\x65\x4b\x1c\xd7\xee\xee\x7b\x45\x1c\xb7\xb5\xe7\xa1\x3c\xa6\xe8\x25\x42\x10\xfb\x7a\x58\x89\x48\x7b\xd1\x53\xdf\x7c\x00\xba\x42\x0b\xc4\x41\xf3\x00\xc0\x08\x83\xd6\x1d\xa7\x69\x80\x4f\x99\x2f\x41\x41\x3e\x57\xbb\xcd\xf1\x4b\xee\x85\xf5\x59\x6a\xf4\xe9\x68\xf4\xef\x64\x66\x5d\x96\x64\xb2\x7a\x3e\x66\xf2\xd0\x77\x66\x10\x87\x74\x24\x98\x40\xb0\x98\x51\xb4\xb3\x16\x05\x15\xdf\x33\xd1\x23\x4e\xeb\xe2\xf9\x30\xc9\x92\x13\x79\x26\x7d\x32\xfc\x84\xf2\xab\x26\xd0\xce\x2d\x88\x83\x6b\xc0\xc9\x6e\xc8\xa5\x10\xeb\xad\x9b\x1b\xdd\xe5\x8e\xe3\x91\x5d\x13\x31\x99\xf5\x6b\x04\x46\x61\x05\x06\x14\xd3\x64\x98\xe4\xf1\x52\x50\x59\x0f\x80\x83\xff\xaf\x3a\x1f\x2d\xf8\x6d\xde\x21\xec\x5f\xd8\x6c\x96\xe9\xd1\x59\x9a\x97\xc1\xe6\x64\xef\x5a\xe2\xb2\x7e\x64\x67\x99\xc7\x5f\x16\x1d\x8d\x88\x0b\xe2\xe0\x71\x6d\x28\xb1\x04\x49\x9a\xf7\x6a\x4a\xda\xe8\x72\xef\x99\x96\x27\x5a\xe2\x72\x59\x7c\x8f\x63\xd1\xe4\xa7\xd0\xcf\x3f\xca\x90\x79\x8c\xd0\x00\x88\x83\xe6\x01\xf7\x7f\x37\xc2\x20\x13\x75\xba\x11\xd6\xe9\xca\x19\x10\x44\xd3\xb7\x7a\xe3\x36\x98\x7a\xf8\xe3\xcb\x3b\xb2\x55\x8f\x27\x76\x09\x81\x5b\xae\x18\xb8\x52\xa1\x76\x85\xd0\x01\x66\x10\x87\x6c\x2a\xfb\x25\xf7\x24\xd7\xaf\x05\x24\x54\x6f\x2b\x54\x4a\xb1\x92\x04\xc9\x5e\x30\x8b\x96\xfb\xd9\x7c\x33\xf3\xd3\x4f\xe5\x4e\xdf\xf9\x31\x44\x64\x10\x77\x4a\x8d\x30\x2d\xc1\x83\x72\x9a\x35\x83\x4f\x2f\x0c\xf3\x2d\x34\x63\xc6\x3a\x02\x2e\x3c\x1a\x24\x41\x7b\xad\x5e\xcd\x5f\xe8\xd1\x7f\x65\x17\xaa\x11\x06\x70\xc1\xca\x28\x28\xff\x7c\x27\xfe\xd7\xf7\x08\x0b\xc4\x33\x39\xaf\x59\x93\x54\xbe\xbc\x41\xbc\x62\xcc\xfe\xb2\x3c\xa6\x20\x94\x38\xd0\x99\x86\xe8\x24\x83\x8f\xbd\xb1\xcd\x79\xe3\x6f\x23\x7c\x45\xa8\xcd\x27\x8a\x44\xe8\x62\xc3\x1f\x5b\x02\xd6\xcd\x5e\x52\xf9\xd1\xd1\xbb\x2c\xd8\x11\xc6\x62\xea\x65\xdb\xd6\x54\x2c\xe9\x7f\xa1\xeb\xa4\x3a\x2d\x27\x5e\xb8\x69\x61\x22\x25\x64\x3b\x76\x85\x25\x6d\x21\x0c\x15\x68\xef\x86\xeb\x93\x86\xef\x19\xf7\xbf\x8a\x9f\xfc\xaf\x19\x61\xd0\xd0\xfe\xae\x11\x46\x32\xc2\x9b\x53\xf2\x89\x62\xfa\xc9\xac\x77\x1f\xfd\xb2\xf8\x61\x32\x24\xcd\x4f\x9d\xcf\x21\xf2\x47\xfc\x77\xf8\x6a\x90\xa0\xbf\x60\x29\xd9\x99\x6c\x56\x22\x1b\xe1\xd7\xbd\xfc\x1a\x99\x07\x2a\xf3\x57\x38\xb8\x6f\xd4\x90\xa7\x91\x26\x74\xac\xfe\xd0\xe7\x0b\xe0\x40\x41\xdb\xb2\x27\xc4\x0e\x54\x3f\x93\xad\x59\x64\x23\xac\xa0\xaa\x50\xfa\xad\xb6\x06\x73\xfa\xa1\xe4\xcd\x2c\xff\x54\x85\x0d\xcb\x66\xe2\xcb\x3d\xf8\x34\x77\xbd\x64\xdf\x7a\xa1\xee\xc4\x9f\xc9\x68\x91\x8d\xf0\xab\x6c\xa9\x6c\x1a\x4a\x23\xd5\xa1\xd7\xdf\xe5\xe9\x3f\xce\xe8\x9b\xf8\x1f\x4d\xbe\xee\xa8\x9f\x79\x73\x3c\x3d\x24\xc6\x35\x64\x76\x26\xa3\x45\x36\xc2\x6b\xdf\xdc\xba\x03\x55\x9b\x65\xb3\xb5\xec\x79\xa6\x7d\x4f\xfa\x6a\x04\xde\x92\x2d\xc7\xa0\x8c\x55\x33\xf6\x6e\x61\x52\x60\x9c\xdd\xf5\x49\x20\x11\x9d\x96\xf9\x50\x6b\x75\xdf\xf8\x99\x84\x45\x45\x65\x07\x65\x2a\x52\x04\xcb\xe1\x3d\x22\x45\xb5\x9f\xb2\x5f\x11\xbd\x51\xa7\x76\x92\x54\x0f\xdd\x74\x0f\xe2\xe0\x99\xaf\x29\x64\xef\xe8\xa2\xa1\x4e\x22\x0e\xc5\xab\xc1\x37\x82\xa1\x58\x6b\x7c\x34\x2e\x95\xac\x5c\x32\xa4\x33\x15\x57\x48\x63\xad\x24\x10\x71\x41\x1c\xd2\x36\x00\x7d\xce\x35\x3c\x73\xb1\x4f\x8a\x73\xf7\xec\xe9\x7f\x07\x64\x84\x2b\x3c\xd0\xf9\xf1\xb9\x67\xf9\xb6\xf4\x8c\xe1\x78\x05\xf3\x2f\x68\x1b\x00\xc0\xc1\x33\xd4\xc1\xe1\x05\xcd\x21\x36\x6d\xb4\xd2\x4d\x4d\xbe\x82\x1f\xb2\x44\x61\x1d\x5f\x5f\x4f\x8d\x39\xbc\xf4\x1c\x68\xe7\x75\x7a\x16\x52\x0a\x6d\x33\x02\xb8\x60\x45\xf9\x7f\xc4\x45\x93\xbc\xb1\xab\x3c\xb0\x9c\xf8\x2d\xf7\xe4\xea\xa5\x6b\xcc\x7c\x5d\x2b\x33\xc5\xb4\xc9\x1c\x1b\x15\x74\xdf\x99\x16\x71\x73\x1e\x22\x8c\x30\x88\x83\x6a\x84\xff\xdd\x08\x83\x5e\xe8\xd3\x24\x70\x5f\xe1\x5e\xfc\xdd\x1b\x58\xe5\x4b\xc1\x98\x9f\x35\x14\x88\x9e\xfc\x70\xb3\xb4\x18\x31\xc6\xa7\xf7\xa7\x30\xf8\x93\x30\x30\x02\x7d\x55\x07\x71\x70\x09\xc4\x3e\xb2\xb6\x79\x37\xbe\xf9\x76\x50\xe7\xe6\xfd\x82\x8b\x47\x77\xcf\x4f\xd7\x07\x2c\x93\xb1\x67\xd6\x47\xff\xb2\x2e\x2a\xf9\x05\x1d\x89\x04\x71\x70\x09\x60\x3a\xf5\x50\x36\x31\x85\xd1\xd6\xd4\xdd\x58\xce\x72\x2f\x16\xa7\x24\x9f\xba\x36\xc9\x8c\x4f\x44\x52\x4b\x22\xd3\xea\x1e\x42\x0d\xed\x5c\x01\x38\xb8\x04\x2a\x12\xb9\x0c\xda\xbe\xa9\x87\x92\xee\x48\xfc\x4a\x57\xe2\x47\x6b\x1e\xdd\xa8\xf2\x6e\xf1\xd1\x59\xc5\xa4\xd5\xb0\x79\x5f\xb3\x0e\x35\x3a\x07\x70\x70\x09\x44\x05\xb0\xd9\xfa\x3d\xc7\x12\x64\xc2\x27\x68\xb9\x3c\xb5\xa5\xd7\x6d\x39\x55\xd9\x9c\xc3\x27\x1c\xa1\xae\x46\x67\xa9\x41\x20\x84\x58\xfc\x80\x38\xa8\x36\x10\x60\x84\x41\xb3\xeb\xa9\xd7\xa6\xc8\x5f\xfd\x90\x81\x5e\xdb\xa9\xd2\xf9\x76\xc3\x4e\x67\xb0\x75\x48\x5b\x98\xb0\xb7\xad\xc1\xa4\x41\xa8\xa1\xb9\x26\x89\x12\x6a\x15\x00\xe2\x90\xee\x0f\xb5\x66\x28\x29\x9c\xc6\x18\xb0\x9e\x6a\xf0\x5f\xfe\x86\x37\xef\xbd\xb7\xcc\x7c\x67\x23\xe3\xfd\xed\x95\xdb\x3b\x14\xfe\xcf\x20\xc3\x0a\xe2\xe0\x1a\xb0\xad\xf1\x2f\xe3\xda\x8e\xd7\xf7\xb5\x28\x4b\xbd\x4a\xf9\x88\x5a\xd3\x5a\xc6\xc7\x61\xe7\xe6\x37\x86\x3d\x4e\x2a\x8c\x82\x24\x27\xe8\xa3\x05\x80\x83\x6b\xe0\x44\xbe\xc2\xc3\x2f\x06\x9b\x21\xee\x7a\x92\x32\xb6\xc1\xd1\x6d\x2e\x49\xe9\xef\x2f\xc6\xc7\xad\xca\x0a\xf6\x53\xe4\xee\xaa\x42\x15\x1d\x20\x0e\xae\x81\x32\x17\x96\xe9\xeb\x92\x93\xab\xa1\x8f\x68\xd2\x67\x17\x85\x17\x1c\xcb\x87\xb5\x32\x69\xa6\x8d\x66\xe9\x23\x89\x43\x45\x5a\xa0\x3a\x71\x10\x07\xd5\x06\x02\x8c\x30\x28\xd5\x9d\xda\x3d\xbe\x3f\x7d\xc2\x8d\x53\xaf\xc3\x99\xbb\x16\x27\x3e\xa6\x1c\x4b\x53\x34\x78\x47\xcb\x4c\x54\x74\x12\xed\x5c\xeb\x58\xe4\x28\x74\x85\x16\x88\x83\x6b\xe0\x9b\xdc\x96\xd4\x27\xb7\xd1\x11\x23\x77\xfa\x01\xf1\x44\x6f\xca\xdb\x1e\x23\x3f\xc9\x85\xf7\x69\xde\xa4\xf3\x10\x63\x0c\xcf\x43\x29\x06\xc4\xc1\x35\xc0\xf0\x48\xad\x6f\x6d\xe1\x52\x70\x04\xe5\xc5\x7c\xed\x02\xa7\x48\x0e\xb2\xf2\xa1\xfe\xdb\x34\xbe\x6c\xac\x19\xc7\x0c\xa1\xd9\x50\x2a\x00\x71\x70\x0d\xb8\xc7\x06\xdf\x19\x8e\xc6\xc7\x16\x16\xce\x21\xe6\x08\x5e\x92\x7e\xd8\x76\x44\x6a\x1c\x36\x6c\x99\x75\x6d\x46\x80\x53\x90\x0c\xaa\x92\x01\x71\x70\x0d\xe4\xe0\x95\xa5\x5f\x0b\xd9\x7b\xde\x18\x21\xb2\xd3\x8d\x5f\xa0\x74\xc5\xfe\x3b\xf7\xa6\xec\x46\xe0\x89\xa4\x05\x9a\x0f\xa9\xb2\x1e\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\x4d\x03\x97\x6b\xca\x79\xd0\x28\xb4\xdb\x1d\x53\xda\xc8\x8e\x30\x43\x93\x48\xef\x9c\x0b\x18\x55\x38\xd7\xab\xee\x63\xf3\xdc\x91\x13\x5d\x09\x31\x76\x10\x07\xd7\xc0\x2f\x35\x25\x37\x6a\xf6\x55\xd2\x44\xab\x41\xbe\x99\xd0\x62\x1f\x81\x77\x76\x71\x18\xdd\x84\x66\x2f\x76\xfb\x6b\x46\xe4\x9c\xa1\x1d\x61\x10\x07\xd7\x40\x1f\xab\x57\xfa\x27\xdc\xc6\xc6\x36\x31\x63\x59\x8f\xdf\xfc\x66\xcc\xb9\x2f\xc2\xd4\x8a\xdc\xad\x47\xff\x70\x45\xc5\xb1\x5a\x40\x37\x08\x80\x38\xb8\x06\x6e\x69\x53\x0b\x6a\x9a\x08\xf2\x85\xe3\x48\x1f\xbd\xe5\xaa\xb1\xa2\x34\xde\xb5\xdd\xf1\x0d\x6c\x6c\xbb\xbd\xeb\x54\x9c\xa6\x0d\x3d\x07\x10\x07\xd7\x80\x86\x1a\x23\x96\x86\x58\x64\x03\x7b\x3a\xd6\x51\xb2\xb9\xfb\xd8\x60\x17\x8f\x9b\x5c\x54\xe5\x82\x3e\xf3\x01\x21\xfa\x16\x0a\xd4\x35\x1a\xc4\x41\xf3\x00\xc0\x08\x83\x4c\xd4\xe9\x46\xf8\x6e\x6b\xae\xb6\xae\x50\x29\xff\xbe\xeb\x72\x05\xf9\xc1\x4b\x43\x1f\xc6\xed\x1f\x33\xe9\x53\x59\x2c\xdf\x26\xbd\xbf\x64\x4a\x7d\x47\x98\x4a\x10\x87\x6c\x84\x2b\x26\x85\x7d\x5c\x32\x78\x6e\x1d\xe2\xa8\xd0\x2d\xaf\x97\x98\x86\x46\x5c\xc9\x9e\xc7\x30\xa5\x2d\xd7\x31\x58\x7b\xcb\x3d\x7a\x03\x11\x19\xc4\x21\x1b\xe1\x94\x40\x77\xcf\x82\xfd\xa8\x8d\x3f\xc3\x0b\x5f\xef\x4f\xae\x24\xec\xa8\x32\x15\x66\x4a\x27\xd6\xff\x8a\xfb\x66\xd8\xb1\xdf\x16\x88\x88\x0c\xe2\xfe\x8f\x11\xfe\x67\x83\xb3\xff\xf5\x3d\xc2\xc4\x5c\xbd\xfb\xdc\x2f\xed\x14\xa6\xb4\x16\xa6\x72\x3d\x38\xfa\xc5\xa3\x4c\x5e\xdf\xb0\x3b\xb8\x9f\x93\x55\xda\xad\x7b\x1d\x7d\xfe\x6f\x23\x6c\xc0\x5a\x1c\x59\x35\xfb\x4b\x5e\xc1\xad\x96\xed\x8b\x07\xc9\x81\x75\xfa\xf1\xf9\xee\x70\xd1\x78\x67\x35\x1f\x92\xdf\xab\x47\xa4\x7f\xa1\x3f\xbe\x2c\x8b\x88\xe5\xbc\xec\x39\x09\x1c\x5a\xca\xcb\x20\x4c\xcc\xdc\x92\x4d\x14\x60\xfb\x43\xff\x8e\x5c\xd3\xa9\xde\x40\x8d\xff\xbf\x66\x84\x41\x43\xfb\xbb\x46\x18\xc9\x08\x7f\xcd\xe7\x96\xff\xb5\xd7\xc0\xca\xcd\x52\xd5\x59\xe8\x63\x51\xf5\xe5\xa9\xeb\xf0\x91\xb7\xcb\x82\xc8\xc9\x77\x33\x31\xb4\x2f\x4b\x67\xb2\x59\x29\x8c\x7c\xb3\x4f\xf8\xd0\x3c\x4a\xa6\x59\xcc\x15\xaa\x5f\x5b\x58\x39\xec\x26\xf7\x9f\x38\x71\xf9\x15\x29\xe3\xe3\x62\x92\xf9\xb3\x48\x73\x06\x9e\xc9\xd6\x2c\xb2\x11\x2e\x33\xf3\xc9\x76\xae\xba\xca\xb0\xb7\xb8\x71\x5b\x3f\xb7\x9e\x55\xda\x8a\xf7\x71\x17\x29\x6f\x10\x9f\x17\x67\xd7\x63\xfa\xc6\x33\x39\x91\x8d\x72\x03\xe9\xcf\x56\xe8\xdd\xfc\xa8\xeb\xd4\x5a\x65\xb7\x76\xe9\x80\x39\xdb\x79\xd1\xb1\xf7\xd3\xd7\xf8\x1e\x3a\x94\x0c\x86\x8a\x1e\xe7\x5a\xa2\x33\xe9\x48\x16\x80\x6c\x84\x8d\x9a\xea\xdd\x3f\x5e\xa0\x71\x32\x90\xd0\x18\xaa\xfa\xd9\xda\x77\x4c\xbd\xcb\x86\xba\xd8\x6d\x34\x61\x57\x93\x54\x9b\x1f\xb1\x77\x66\x46\x18\x24\xa2\xd3\x32\x9f\xa2\xc9\x9b\xbc\x27\xee\xb3\x39\x15\xf2\xab\xca\x7b\x95\xea\x92\xd3\x04\x37\x9c\xa6\x7e\x4d\x76\x3e\xbe\x53\x4e\x65\x9d\xa5\x08\xdd\x1c\x0f\xe2\xe0\x99\x0f\x0b\xb7\xe6\xd0\xb6\x3f\xc1\xf4\xdd\x14\x73\x57\x5f\x29\x7b\xda\x8e\xa3\xdf\xa7\x84\xf3\x4b\x6f\xa3\xbf\x7c\x67\x53\x8c\x39\x80\xb6\x01\x40\x1c\x3c\xf3\x11\x9b\x2f\x8e\xd1\xb0\x72\x7f\x79\xcf\xf4\xb5\xfb\xa6\x44\xc1\x25\xed\xc7\x42\x4e\xc9\x4e\xed\x44\x15\xb4\x28\x45\xac\x1e\x31\xaf\x10\x71\x41\x1c\x3c\xf3\x35\x7a\xfc\x49\xd6\xe6\xb7\x20\x1b\x6c\x60\xc3\x54\xdb\x3b\x4f\xf9\x13\xfd\xbe\x78\x9b\xfc\x45\x07\xde\x7b\xe7\xd9\x96\xa7\xf2\xa0\x6d\x51\x10\x17\xac\x88\x72\xee\xef\xb8\xf8\x7e\xfd\xf1\x0c\x1b\x2f\x5a\xec\x8d\x73\x29\x44\xb4\x5c\x29\x57\xef\xe3\x89\x6c\x93\x77\x29\xcb\x48\x4e\xbd\x22\x0f\x73\x33\x41\x18\x61\x10\x07\xd5\x08\xff\xbb\x11\x06\xbd\xd0\xa7\x49\x00\x85\xf0\x68\x2f\x69\xac\xb2\xc8\x63\xc6\x90\xb7\x52\x16\xf5\x9d\xd9\x46\x90\x1f\xd5\x52\x54\xe6\xa1\xe2\x43\x26\xd2\x2c\x0e\xe8\xee\x54\x10\x87\x64\x82\x1a\xae\x5e\x60\x3a\xfe\xb5\x5f\x63\xf6\xc1\x2e\x5a\xff\x67\x54\x56\x37\xc3\x5d\x17\xff\xf1\x2e\x8e\x3e\xc3\x3a\x0b\x27\x73\x63\xc8\x04\x01\x38\xb8\x04\xd8\x9d\x4d\x07\x5e\xd4\xf3\x9b\x5d\xd9\x24\xd2\xd9\xda\x36\x13\xf7\x0f\xf9\xec\x76\x62\x8b\x99\xa8\xd4\xad\xd1\xeb\x23\xaa\x06\xed\x32\x82\x38\xb8\x04\x0a\x75\xb7\x9e\xe2\x60\x14\x55\xf7\xfb\x0d\xbf\xd7\x3f\xd2\xc7\xca\x5a\x78\xa3\x4a\x75\xc8\x3b\xfe\xa7\xdd\x49\xad\xef\x51\x03\xb4\x60\x07\x71\x70\x09\x14\x78\x36\x05\x67\x30\xf5\x0a\x58\xf7\x4d\xbc\xf4\xbb\xcc\x88\x6a\xdf\x28\xe6\x5a\x36\x43\xe5\xbd\x1d\x4a\x33\x20\x5b\x76\x05\x3a\x16\x0b\xe2\xa0\xda\x40\xe1\x7f\x5f\x00\x83\x66\xd7\xd3\x34\x60\x7c\x38\xc5\x2f\x72\x2e\x21\x55\x56\xa3\xdd\x83\x68\xa0\x4b\xa0\xb9\xf3\xb0\xed\x99\x62\x84\x03\x85\x6e\x63\xf6\xb0\xc2\x53\xe8\x1a\x6d\x10\x07\xd7\xc0\x86\x47\x69\xae\x34\x27\xd5\xad\xbd\xb7\xde\x5d\xdc\x54\xe3\x2f\x57\x25\xdd\xb2\xe4\xf4\xc4\x18\x18\xa4\x44\xf3\x68\xde\xea\xfd\x80\xea\x2d\x01\x1c\x5c\x03\xaf\x0c\x37\x5b\xde\x4e\x36\x08\xea\x8b\xed\x5f\xc7\x0e\x42\x59\x31\x78\xbc\x3d\xf5\xd1\x88\x4c\xea\x62\xb8\x4c\xab\xce\xce\x3e\x23\x22\x2e\x88\x43\xda\xb5\xf3\x39\x94\x2d\x0c\x23\xfc\xa0\xc4\x50\xab\xb5\xe4\xd6\xe1\x3a\xd2\xa8\x74\xb5\xcf\xec\x3d\xb7\xb5\xc4\x55\x43\xf5\x84\x36\xe8\xce\x5b\x10\x07\xd7\x80\x96\x7a\x2f\x76\xea\xde\x55\xd5\x07\x4c\x62\x65\x07\x0a\x41\xe8\x78\xc3\x4a\xf1\x5e\xeb\x12\xb1\x5f\x1e\x6b\xb7\xc8\x7d\x10\x87\xae\xd0\x02\x71\x50\x6d\x20\xc0\x08\x83\x52\xdd\x69\x1a\x68\x2f\xc6\x15\x8c\x66\x1a\x18\xa6\x30\xf9\x90\x12\xe9\xdc\x39\x6d\x43\xa0\x90\xd0\xb4\x69\xbc\x7e\x91\xbe\x70\xcb\xcb\x7b\x16\xfa\x08\x00\xe2\xe0\x1a\xe8\xbf\x20\xf4\x83\xbb\x48\xf6\x62\xe2\x1c\x25\xeb\x5e\x22\xf3\x61\xdd\x4a\x87\xea\x18\x77\x71\x53\xc1\x46\xf0\xb1\xb4\xb8\x88\x23\xb4\x7b\x0f\xe0\xe0\x1a\x60\xda\x7d\x8c\xcd\x79\xcb\x25\xbe\xb5\x50\x53\xa0\x7f\xc3\xd3\xa1\x83\xe5\xdd\x26\xf6\x7b\x55\xdb\x14\x59\xa6\x47\xd2\xd6\x6e\xd0\x47\x16\x10\x07\xd7\x00\xa5\x70\xd7\xa2\xe2\x14\x47\x4e\xdc\x43\x29\xdb\x01\x22\x2e\x9b\x3f\x99\x9c\xf5\x47\xb1\x62\x7e\x53\x1d\x94\x8a\xb8\xbc\x5f\xe9\xa0\x13\x27\x00\x0e\xae\x81\x9c\x87\x97\x99\x28\xb7\x96\xc6\x4d\x59\x94\x3f\x6e\xdf\x88\xfe\xe8\x9a\x21\xe0\xc8\xe3\x93\xfc\x5b\xdc\xd4\xba\x66\xd5\x82\x56\x0e\x32\xc2\x00\x0e\x9a\x07\x6e\xfc\xbb\x06\x40\xeb\x8e\xd3\x34\x20\x4a\x81\x93\x9b\xdd\xda\xb2\x76\xf7\xa5\x08\x71\x24\xba\x1c\x07\xa5\xc2\xcf\x34\x19\x4c\xf4\x68\x65\x47\x93\x49\xa7\x58\x07\xe8\x76\x42\x10\x07\xd7\x40\xae\xb8\x94\x74\x8d\xe0\xf8\xef\x3f\xda\x2e\x2f\x3e\x16\x12\x94\x4a\x3e\x89\xa0\xc1\x24\x13\xd8\x3a\xc7\x34\x5a\xcb\xa4\x2b\x1a\x85\x88\x0b\xe2\xe0\x1a\x70\xb8\xfa\xc6\xa4\xa7\xad\x4c\x2e\x32\xa0\x29\xa4\x84\xc2\x2b\x22\x8d\xea\xf0\x56\x2d\x3f\x2e\xcf\x01\xcb\xed\xd4\x3b\x57\x15\xa1\x06\x87\x20\x0e\xae\x01\xf2\x3b\xf3\x8b\x0d\x45\xdb\xcf\x57\xcf\xd9\xac\xaa\xcd\x7f\xfd\x33\x1b\x3e\xb4\xc9\x47\xf8\xdd\x36\x3e\xa1\xfc\x5e\x23\x71\x90\x2e\xd4\xe2\x04\xc0\xc1\x35\xe0\xf1\x27\xa4\x91\x6b\x33\x47\x39\xa1\xe0\x49\x9c\x4b\x5a\xd7\x83\xaa\x4e\x41\x31\x42\x03\xe9\x3e\x83\x85\xe0\x97\x3a\xec\xa2\x19\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\x90\x89\x3a\xdd\x08\xff\xbc\x33\xbd\xc0\xf0\xa8\xf0\xc7\x85\xe6\x52\x8d\x8a\x7a\xd6\x61\xde\xcc\x28\x6b\x81\xc5\xd7\x55\x35\x93\xf7\xd0\x7a\x24\x42\xe5\x10\xa6\x12\xc4\x21\x1b\x61\x9e\x61\xd2\x9f\x1d\xb7\x07\x34\x5c\x7f\x08\x5e\x5c\xae\xad\x3d\x71\x1d\x33\xb0\x13\xe5\x09\xed\x61\xb9\x92\x38\xc3\xd4\x19\x94\x8c\x88\x0c\xe2\x90\x8d\x30\x1e\xa1\x94\x58\xe4\xce\xa5\xa9\x42\x0e\x86\xab\xbd\x33\xeb\xee\xc9\xbb\x37\x8f\xbf\xb7\x4d\xb4\xb7\x7f\x0d\xda\xd8\x9a\x5c\x2f\x43\x44\x06\x71\xff\xc7\x08\x13\xfc\x23\xf2\xff\xfa\x1e\xe1\x40\x99\x84\xbe\x32\x66\xbc\x07\x5d\xae\x56\x97\x18\xd0\x24\xf8\x14\x46\x07\x15\xbc\xfb\x5f\xc9\xf3\x90\x93\xdc\x3e\xda\xe0\x2e\xf8\xdb\x08\xe3\xec\x85\xe4\x8a\xf3\xbd\x78\xf1\x4c\x82\x81\xe5\x15\xbe\xef\xbe\x2c\xe5\x58\x78\xe0\x2b\xbe\xe0\x87\x76\xef\x1d\x97\xb9\xa3\xd6\xfe\x7e\x77\x66\xe2\xdc\xfa\x39\x54\x03\xfa\x99\x9d\x4e\x56\x5a\x4d\x71\xeb\x0a\x50\x9e\xd5\x0b\xd9\xd3\x3f\x09\xfb\xf4\x64\x60\xb6\x2e\xfd\xbf\x66\x84\x41\x43\xfb\xbb\x46\x18\xc9\x08\xab\x98\x72\x24\xa5\x90\x8a\x2d\xa6\xbd\xb1\xf8\x54\x2c\xf8\xc5\xeb\x71\xee\x76\x7f\xdd\xf9\x9e\xd0\x5c\xd5\x00\x4e\x5c\x73\x0a\x92\x33\xd9\xac\x44\x36\xc2\x6d\x04\x62\x3c\xfd\x09\xf7\xf6\x56\x83\x3f\x74\x7e\xb0\x9c\xfb\x10\x25\xa1\x8d\x6f\xa2\x89\x8b\x36\xda\x8c\xbe\x84\xff\x56\x62\xf4\x4c\xb6\x66\x91\x8d\x30\xaf\x10\x79\xa3\x6d\xd5\x18\x9e\x9f\x4d\x83\xd3\xa3\x97\xf4\x13\x8d\x27\xbe\xcd\x2d\xf6\x2d\x87\xce\x43\xfd\x4b\xdc\x2a\xa9\x2f\xce\x64\xb4\xc8\x46\x78\x67\x66\xc8\x51\x26\xa6\xa2\x97\xfa\xae\x66\xbe\x4e\x08\xe6\x61\xe6\x0d\xaa\xf7\xdf\xd7\xfb\xd2\xf0\x71\xb7\xa6\x4d\xed\x07\x2e\x9e\xc9\x68\x91\x8d\x30\xbf\xce\xd6\xb9\x17\xa2\xd3\x85\x4b\xbe\x97\xb2\xa2\xab\x74\x64\x72\xd2\x8b\x15\x06\x19\xb2\xd6\x03\x74\x23\x5e\x98\x79\xb7\x65\x9c\x99\x11\x06\x89\xe8\xb4\xcc\x57\xf0\x6a\x71\x35\xc8\x02\xe5\xf8\x9c\xeb\x9f\xab\x15\x69\x63\x99\x81\x49\xce\x2d\xad\x3e\xe4\x5b\xda\xbb\xb3\xd2\xb7\x0b\x0f\xa1\xfb\x42\x40\x1c\x3c\xf3\xa5\x04\x93\xe8\xac\x47\x84\x3e\x78\x87\x7f\xaf\xf9\xeb\xa1\x4e\xed\xaf\xdb\x24\xc7\x8b\xfb\xcd\x75\x39\xdb\xd1\x1f\x64\x8d\xa8\xa0\x4e\x49\x20\x0e\x9e\xf9\x54\x87\x7f\x07\x48\xd3\x3e\xa0\x11\x5e\xef\xd0\xfb\x9d\xe0\x1b\xa7\xfb\x53\x77\xd9\x1a\xd5\x50\x80\xa5\xa1\x28\x05\x53\xbf\x04\x2a\x0e\x04\x71\xf0\xcc\x67\x7c\x0e\x57\x92\x24\x6b\xbc\x32\xf1\x67\x92\xdf\x58\x7e\x00\x2f\x56\xaa\xab\xb0\x86\x9f\x4f\x14\x96\x24\x6b\x7a\xab\xd4\xde\x37\xc8\x09\x00\xb8\xff\x93\xa1\xfe\x8e\xfb\xa6\x5e\x89\xca\x11\xbb\x6a\x52\xa6\x9d\xb3\x71\x2d\x74\x64\xe5\x7d\x4e\x93\x90\x7e\x1e\x61\xf4\x00\xb6\xd2\xe5\xe4\x80\x59\x61\x84\x11\x06\x71\x50\x8d\xf0\xbf\x1b\x61\xd0\x0b\x7d\x9a\x04\xda\x24\x18\x49\x72\x69\x0c\x5d\x8c\x43\xbf\x85\xde\xcf\x37\x68\xc7\x0c\x13\xd9\x92\xda\x67\x14\x2f\xe8\x66\x51\x78\xac\x50\x8f\x8d\x18\x3a\x88\x83\x4b\x40\xec\xb9\xd0\xcd\xeb\xbf\xf5\xbe\x24\x12\xa8\x1e\xd3\xd1\xd0\x99\xf5\x7f\xf5\x1d\xf2\xc4\x9d\x2d\x1e\xe9\xe1\x30\x29\xeb\xd7\x83\xca\xcf\x41\x1c\x5c\x02\xc2\x06\xde\xa1\xa8\x52\xba\x15\x66\x97\x88\xfb\xa2\x50\x30\x6c\x96\xae\x52\x4a\xfa\xd2\xa1\xda\xd6\x63\xa8\x26\xda\xbc\xa5\xbf\x8f\x88\x0b\xe2\xe0\x12\x10\xbc\xae\x43\xc2\xfe\xca\xdc\xee\xbc\x93\x1f\xa9\xa7\x88\x13\x93\xeb\xc4\x79\x26\x94\x72\xbc\xcd\x9c\x6b\xcf\x9c\x30\x4c\x52\xa1\x3b\x29\x41\x1c\x5c\x02\x97\x85\xec\x35\x9f\xf0\xea\xb0\x38\xb4\x10\xd2\x79\x1e\x33\x7c\x60\xc4\xda\x38\x0c\xfa\xd5\x24\x5f\xf1\xb5\xb7\x4b\xa8\x96\x0c\x15\x6a\x94\x04\xe0\xa0\xda\x40\x80\x11\x06\xcd\xae\xa7\x69\x60\x2f\xe1\x11\xda\xe0\xa0\x67\xf5\x6f\xa6\x08\xf5\x07\xe8\x81\x1f\x17\x92\x67\x09\x6b\xc4\x35\x09\x71\x63\x7c\xa8\x6a\x35\x3a\x8a\xa1\x9a\x5b\x00\x87\xd4\x39\xfc\x46\x91\x82\x0d\x4f\xbf\xa8\x07\x11\xff\xa5\x7e\xb5\x79\xda\xb9\x07\xee\xb7\xfa\xe3\xdc\x28\x9e\xe2\x5d\x50\xd3\xf5\xfd\x09\x5d\x45\x03\xe2\xe0\x1a\xd8\xe2\x8d\x19\x5d\x3b\x71\xbe\x54\x1d\xf3\x51\xc4\x4d\xce\xf0\xdb\x39\x15\xbe\xdf\x6d\xeb\x5d\xd4\x36\x95\x6a\x4c\x09\xe8\x9b\xd0\x77\x36\x10\x07\xd7\x80\x32\x81\x8e\x22\xeb\xfb\x48\xd5\x77\xa5\xf3\x83\x54\x0c\xef\xb4\x9e\x85\x94\x8b\x4c\x36\x33\x50\x86\xe8\x6a\xeb\x35\xac\x92\x7f\x47\xc4\x05\x71\x70\x0d\xac\x60\xfb\x7b\x78\x4e\x4c\xdf\x1c\x33\x76\xeb\x23\x7f\xc5\x4a\x13\x46\xfe\xb6\x91\x82\xf0\x4f\xf7\xdd\x6e\x01\xc1\xc1\x7c\xa7\x1c\x84\x06\x40\x1c\x54\x1b\x08\x30\xc2\xa0\x54\x77\xea\x3d\xc2\x4f\xfc\x9c\xd8\x4a\x49\x7b\x84\xf9\xe6\x6e\x46\xe7\xde\x49\xd4\xd5\x8c\xf1\xcd\xbd\xd0\x71\x32\xe4\xb8\x4b\x7d\xcf\x23\x1e\xba\x96\x0c\xc4\xc1\x35\xb0\x9f\xd7\xf1\x28\x88\x51\x03\x3d\x7a\x2a\x7a\x34\xf6\x87\xd2\xc6\x97\xe2\x68\x2e\xbd\xf0\x67\x34\x07\x0e\x68\x4f\xb5\xc4\xf3\x19\x10\x71\x41\x1c\x5c\x03\x46\x46\xcf\x0c\x9c\x89\x24\xf2\xd8\xda\xb9\x2e\xa7\x71\x10\xe6\x8f\xa6\x2f\x1e\x67\x72\xbf\x5c\x1e\x1c\xbc\x53\x70\x6f\x9f\x02\x3a\xc1\x01\xe2\xe0\x1a\x48\xce\xa1\x50\xf2\xc2\xae\x4c\x53\xf1\xb8\xcc\x67\x35\x77\xf5\x29\x11\x7e\xe7\x4a\x17\xbe\x0d\x5e\xd5\xb3\xd8\x7e\x26\x93\x57\xe1\x88\xb8\x20\x0e\xae\x01\x46\x55\x66\xc6\xcd\x89\x31\xe9\x83\x1d\x1b\xb5\x6a\xdf\x86\xdb\x87\x76\x51\x05\x6a\x71\x0f\x83\xbe\x14\x89\xb5\x50\x63\x63\x5e\x44\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\xd6\x1d\xa7\x69\x40\x5e\x1a\x47\x9d\xe3\x1c\x96\x99\x31\x95\x9c\xd6\x89\xef\x51\xc3\xa8\xcf\x35\x95\x87\xfd\x96\x18\x65\x28\xea\x7a\x06\xb1\xa6\x1f\x11\x63\x07\x71\x70\x0d\xdc\x37\x5c\x09\xe5\x1c\x3b\xcf\x32\x5a\xac\x2a\x2e\x33\xbe\x4d\xf6\xff\x30\x77\x96\x51\x59\x35\xdf\xdf\x47\x1a\x15\x44\x5a\xba\x04\x29\xe9\xee\x6e\x04\x44\x01\x11\x50\x52\x09\x11\xe9\x6e\x04\x41\x52\x41\xe9\x12\x91\x56\xba\x04\x41\x05\x69\x05\xe9\x4e\xe9\x2e\x09\x9f\xf5\xfc\xd7\xba\xce\xf2\x77\x2e\xd6\x3d\xf7\x0b\x5e\xdc\xef\x3f\x6b\x5f\xcc\xe1\x7b\x66\xcf\xf7\xcc\xec\x3d\xf8\x5e\x87\xf8\x9d\x79\xf5\x23\xf4\xdb\xf9\x61\x9f\x5d\x7e\x5e\x86\x4e\x1d\x01\x38\xb8\x06\x7e\xbc\x59\xbe\xc8\x76\xbb\xf5\x0e\x7a\x7d\x0c\xe5\x83\x5a\x9b\x45\x57\x89\x23\xa9\x38\xea\xc9\x2f\x86\x19\x76\x13\xb4\xeb\xfc\xd0\x47\x0b\x10\x07\xd7\x80\x78\xbd\x7f\x74\xca\x39\x4b\xae\x69\xaf\xc5\x68\x6a\xe9\x27\x21\xf4\xb9\xe8\xa1\x8f\x32\x5b\x93\xda\x2d\x06\x95\x3e\xaf\x63\x0e\x40\xfd\x22\x00\x1c\x5c\x03\xe2\x0c\x1f\x0d\xd3\x42\xb2\xbd\x82\x68\x1f\x3f\xcb\xa3\x08\xbf\x78\xa2\x1c\x2e\x11\x16\x82\x9f\x1c\x4d\xa1\x35\x54\xc3\xdc\x38\x08\xd5\x08\x03\x38\x68\x1e\x00\x18\x61\x90\x89\x3a\xdd\x08\x2b\x61\xec\x7a\x08\x13\xf3\x99\x37\x0a\x4a\xf2\xcf\x28\x44\xa5\xf7\xa6\x5c\x69\xe2\x8c\x7b\x9a\x50\xee\x12\x93\xd9\xde\x79\x7c\x88\x30\x95\x20\x0e\xd9\x08\xbb\x98\xaf\xbb\xdf\x77\xc5\x16\x4b\xab\x8a\x90\x5e\xaf\x0e\xe1\x2a\xc8\x48\xbe\x2b\xad\xd5\xd0\xbb\x6e\xd5\x30\x13\x7f\x62\x27\x85\x88\x0c\xe2\x90\x8d\x70\x39\x7d\x96\x31\x6f\x87\x47\x47\x67\xeb\x01\x1d\xd5\xbc\xa4\xd5\xa7\xe9\x19\xa5\xca\xfd\x29\x76\xb7\x3f\x0d\x5a\x8b\x68\x2b\x37\x11\x91\x41\xdc\xff\x37\xc2\xff\xbb\x8b\xff\xef\xef\x11\x6e\x78\xf0\x6a\x6f\xe8\xdb\xf7\x9c\x73\xb1\x1c\xfc\x59\x77\x8a\x7d\xf9\xfc\x7b\xd9\xae\x69\xb2\xfd\x94\xce\xb5\x88\xf5\x09\xc4\xfc\xdb\x08\x77\x5f\x37\xb0\x59\x1a\xd6\xd2\x71\x63\xc5\x91\x55\x49\x53\xbf\x37\x1c\xfe\xcb\x09\x23\xc4\x6e\x93\x71\x7f\x59\x60\x47\xd7\x5a\xfe\x2f\xd4\xf1\x4b\x82\xd9\x14\xe3\x6b\xb2\x98\x16\x2b\x26\x37\xe2\xb9\x4f\xde\x37\x17\xf4\x4b\x79\x16\x96\x4e\x92\x34\xa7\x7e\x63\x24\xe0\xff\xd7\x8c\x30\x68\x68\x7f\xd7\x08\x2b\xc1\xcd\xd2\x17\x9b\x99\x2c\x36\x0e\x36\xd3\xaf\x59\xb3\xb7\x0c\x9d\x15\x6f\xd2\xd9\x6c\x79\xf3\xcf\x1e\x3f\x11\x6d\xeb\x2a\x3f\x54\xfe\x65\x77\x26\x9b\x95\xc8\x46\xb8\x80\x37\x83\x5f\xb9\xe8\x9e\x6e\x4e\xee\x27\x2f\xee\x84\x6b\x6c\x72\xdd\xc2\x4d\x18\x43\x0f\x63\x0b\x9a\x4e\xda\xd9\xa2\xe5\x48\xcf\x64\x6b\x56\x12\xb9\x59\x35\x93\x5e\x9a\xb2\xff\x7c\xee\x63\xf6\x4e\xd5\xf6\x64\x5b\x07\x0a\xd9\x0c\xd7\xd4\x41\xb7\xe4\xe7\x85\xd2\xcf\x57\xfb\xcb\x5b\xce\x64\xb4\xc8\x46\xf8\xe3\x04\x66\xba\x80\xd8\x4b\x77\x8f\x4f\x8e\x5c\xd6\xa8\xc6\x0a\xd6\xa6\xa9\x1c\x1f\x58\x9e\x37\xf7\x4e\xcf\xfd\xc6\xa8\xc4\x19\x3b\x93\xd1\x3a\x23\xfd\x6c\x6f\xf4\x33\xe9\x6e\x9f\x3e\x56\x29\xa2\x18\x86\x61\xda\x9f\x5d\x8a\x9e\xcd\x0d\xe7\x8c\xa2\x95\xc4\x2e\x2b\xaa\x1c\x5c\xa0\x3c\xbb\xae\xd1\x20\x11\x9d\x96\xf9\x5e\x6c\x3e\xb0\x23\x2f\x4a\x72\xf7\xad\xba\x5a\x77\x82\x69\xfd\xf8\x4b\xcf\xac\xc2\xed\x02\xc9\x1d\x35\xb3\xf7\xd2\x6c\xf4\x9f\xe7\x10\x33\x3e\x88\x43\xaa\x11\x3e\x2f\x39\xf5\xba\x7a\xb5\x7b\x1e\xc5\x52\x89\x23\x75\x65\x60\xdf\xee\x38\x8d\xd0\x37\xd7\xd2\xb6\x7f\x3f\xe3\xc3\x45\xbd\x3d\xc8\x60\x03\x38\x78\xe6\x73\xaf\x7b\xdc\x8d\x2f\xc8\xfc\xc0\x72\x06\xbf\xb0\x63\x2d\xdb\xd4\x0a\x8f\x74\x8d\x6c\x69\x5c\x2e\x69\xeb\x76\xba\x8b\x08\x5e\x28\x22\x2e\x88\x83\x5f\xf0\x47\xe6\x94\xdb\xe0\x11\x8e\x29\x15\x7f\x5d\x4f\x85\xea\x81\xba\x62\xdb\x37\x1e\xa6\xfe\x74\x1e\xe7\x64\x4c\xb4\xa1\x19\x35\x3c\xa8\x88\x09\xc4\xc1\x9f\x2f\xeb\x73\xaa\xac\xec\xcf\x9b\x66\xe6\xf7\xc8\xd5\x38\xb5\xdf\xba\x3f\xcd\xf3\x20\x1b\x7c\xea\xc3\x8a\x22\xca\x2e\x5c\x4c\xca\xfa\x01\x61\x84\x41\x1c\x54\x23\xac\xf4\x8f\x8b\x1f\xd0\x0b\x7d\x9a\x04\x3a\xac\xc3\x44\x71\xc6\xb8\x9b\xcb\x5e\x38\x33\xf5\xbd\x8a\xe0\x40\x0d\xaa\x68\xe9\xa6\x7f\xfc\x8c\xdc\xfa\xb3\x56\xfb\x95\x5a\xe8\x58\x2c\x88\x83\x4b\xc0\xc6\xfe\x76\xc9\x84\x43\x49\x81\x32\xb6\xb8\xbf\xc6\x87\xba\xe4\xe8\xaf\x7e\xf7\x02\xb3\xb1\xef\xee\x78\x8e\x19\xdd\xe2\x53\xf4\x86\xbe\xd6\x03\x38\xb8\x04\x5e\xde\x53\x95\x5b\x75\xa1\x27\xd1\xc2\xb2\x6a\x7d\x34\x90\xe6\x9e\xab\xdc\x74\x97\xd6\xde\x61\x64\x44\x2b\xf8\xd5\x18\x8e\x92\x02\x22\x2e\x88\x83\x4b\x00\xfb\xb7\xb7\x87\xb2\x49\xd7\xc5\xf3\xa4\xb3\x23\x87\x89\x86\xd7\xba\xd2\x74\x65\x75\x30\xd0\xb2\xba\xd5\x3d\x06\x97\x2e\x48\x40\xf5\x71\x20\x0e\xfe\x7c\x7f\xe5\x08\xd6\x5d\xcd\xfe\xbc\xf1\x51\xb4\x2a\xca\x85\x25\x65\xd9\x7a\x4b\x3b\xe1\x45\x6b\x1c\x5b\xa7\xb9\x46\xbf\xda\x37\xb9\x62\xc4\xe2\x07\xc4\x41\xb5\x81\x00\x23\x0c\x9a\x5d\x4f\xd3\xc0\x30\xfa\xb5\x7c\x8a\x57\x55\x3e\xdc\xf9\x13\xb4\x03\x21\xe4\xde\xbf\x6b\xb8\xb2\x9f\x59\x3b\xe1\x9b\x4f\x59\x45\xba\xde\xc4\xd7\x45\x8c\x1d\xc4\xc1\x35\x60\x99\xa1\x81\x79\x91\xc1\x7f\xfa\xf2\x42\xf7\x13\x91\xdb\x85\x45\x97\x43\xc3\xf1\x19\x88\x9c\x75\x12\x77\x1e\x93\xf7\xf8\x96\x40\xf7\x13\x83\x38\xb8\x06\x88\x33\x5c\x2f\xc7\x5d\xa3\x28\x5d\x7b\x28\x9b\x6d\xbe\x48\x65\xe0\xd1\xbd\x17\xec\xec\xe5\x39\x76\x4d\x92\x1d\x43\x66\xeb\xc7\x08\x22\x2e\x88\x83\x6b\xa0\xc1\x3c\xf6\x53\xba\x0e\x7d\xd7\xca\x34\x93\xa1\x7c\x9a\xd1\xbd\x47\x4f\x6f\x28\x15\x3e\xc4\xe7\x6d\x68\x7d\xff\x00\x7b\x64\x72\x17\x11\x17\xc4\xc1\x9f\xaf\x87\xd1\x9b\x3a\xd5\x99\xbb\x5d\x7e\x87\xd6\xe9\xc6\xa8\x0f\xec\xe4\x1c\x9b\x79\xd2\x89\xf1\x79\xef\x6c\x18\x5a\x09\xe3\x08\x2f\x23\x34\x00\xe2\xa0\xda\x40\xc9\x7f\xd6\x00\x28\xd5\x9d\xda\x34\x8f\x54\x8f\x27\xa9\x4d\xc0\x21\x28\x84\xc8\xcb\x66\x90\x06\xc5\xf4\xe3\xbb\x2b\x7e\xdc\x6b\x0f\x1d\xf3\x33\xbc\x2d\x25\x38\xde\x42\x4d\xf3\x00\x1c\x52\x8d\xb0\xa1\xed\xf0\xd4\x3a\xd5\x1b\xa1\xee\xb0\xf3\xb4\x94\xac\xb6\xeb\x3b\xb7\x5b\x3e\x13\x37\xe4\x46\x0f\xd0\xbc\xf7\x20\x16\xce\x80\x76\x19\x01\x1c\x52\xc3\x34\x71\x3f\x51\xd7\x5e\x22\x33\x4a\x61\xf3\x2b\xc1\x9e\x33\xd3\x3a\x56\x5f\x6b\x1d\x95\x52\x9c\x37\xd6\x3f\x27\x5f\x99\x5b\x82\x3e\xb2\x80\x38\xb8\x06\x50\x7f\x24\x3b\x9b\xb9\x33\x3e\x59\xc8\xc7\x4d\x96\x13\x1a\x0b\xa3\x76\xf1\x70\x48\x67\xbb\xb1\x33\x9c\x2a\x79\xf2\xd5\x7f\x02\x6a\x43\x01\xe2\xe0\xcf\x77\x6b\xff\x82\xf6\x8e\xc5\x39\xe5\x61\x5d\x21\xbf\xb2\x50\xb1\x63\xe1\xe3\x01\xe7\xe5\x1e\x87\x9a\x1a\xb6\x18\x0d\x8e\xde\xab\xf8\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\xd4\x3b\xe5\xbb\xd4\xf7\x77\x96\xbf\x5f\xd7\x91\x77\x88\x56\xac\x7b\xf3\xb5\x84\xf8\x25\x56\x58\xb2\xcc\x07\x53\x34\x9b\xca\x40\x62\x9c\x1c\xc4\xd8\x41\x1c\x5c\x03\x23\x09\x9e\x97\xaa\xf0\x83\x55\x8f\x65\x5b\xac\x71\xa2\xef\xd2\x10\x7d\xb8\x92\x9c\x2b\x8b\x9a\xd6\x41\xc3\x41\xb7\x99\x5f\x00\x7d\xb8\x02\x71\x70\x0d\x98\x56\xa6\x3d\x4b\x08\xdd\x91\xf4\xe9\x2f\x5d\x4d\xfb\x3a\xda\x4b\x3f\x11\x58\x53\x65\x52\x11\x7c\xcb\x29\xbb\xe0\xf2\x0d\x67\xa8\xa6\x1f\xc4\xc1\x35\x90\x15\x47\x54\x7b\xe2\x5b\x9e\x96\xee\x98\x69\x5b\x95\x61\x54\xca\xbf\x4c\xa0\x94\xb3\xdc\xf8\xea\x4d\x61\x49\x8c\xc7\xa0\x03\x3e\xb4\x83\x0d\xe0\xe0\xcf\x77\x9c\x96\x7c\xf8\x12\x83\xb4\xd2\x73\xfd\x2c\xc5\x0a\x85\x82\x43\x7f\x56\xdd\xa7\xa3\x81\x4a\xd4\x61\xbc\xc2\x3d\xa5\x4f\x31\xa0\x93\x21\x20\x0e\x9a\x07\x9c\xff\xd9\x08\x83\x4c\xd4\xe9\x46\xf8\xe9\x9d\xcd\x4c\xb3\x9b\xf7\x35\xcc\xaf\x2d\x9b\x84\xef\x85\x24\x0e\x68\x1f\xaa\x8c\x33\xfa\x85\xda\xca\x91\x56\x89\x6e\x61\xfa\x22\x4c\x25\x88\x43\x36\xc2\xbc\x42\x03\x32\xfa\xc4\xb4\xd5\xae\xb3\x23\x6b\x27\x62\xa6\xc5\x3e\x23\xb8\xf3\x2e\xc6\x46\xbf\x7c\x6d\x2e\xee\xb0\x86\x6d\x56\x20\x22\x83\x38\x64\x23\x5c\xff\xb1\xf6\xf1\xd8\x86\xc7\x93\xfd\xfb\x3b\xa8\x89\x9b\xf2\x78\x0d\x79\xf3\x77\x48\x26\x58\xe2\xea\xde\x6d\x5a\x85\xef\x18\xe9\x23\x22\x83\xb8\xff\x6f\x84\x51\xce\xfd\x1d\xf9\x5f\xdf\x23\x3c\x9e\xa1\x50\xfb\xf6\xc3\x0a\xa5\xe3\xad\x97\xdc\x3e\x2a\xde\xb3\x1e\xf7\x31\x0f\x7c\x1b\x8c\x62\xd1\x71\x7c\xb5\x64\xaf\x79\xfc\xcf\x3d\xc2\x69\xef\xf4\x9f\x2c\xce\xef\xca\xe4\x9f\xbb\xa5\x6a\xec\xa5\x9b\x63\xf1\x81\xeb\xfc\x05\x29\x1b\xb6\x3e\x91\x44\x52\x71\x43\xab\xf1\xbf\x3f\x50\x62\xb0\xf1\xc9\x89\xfa\x30\x8f\xf3\xbd\x70\xea\x41\x21\x59\xc6\xa4\xf5\xb9\xb8\x9a\xe1\x3c\x32\xbb\xb0\x69\x25\x30\xc2\x45\xf9\x5f\x33\xc2\xa0\xa1\xfd\x5d\x23\x8c\x64\x84\x69\x35\xed\xd6\x1e\xbc\x13\x33\xcc\xfa\xc1\xc2\x90\x64\x3f\x20\x30\xf2\x72\xfe\x73\x4b\x38\x8a\xcb\x68\xf2\xde\xb3\x60\x05\x1a\xd6\x33\xd9\xac\x44\x36\xc2\x51\x4f\x6b\x4a\xae\xd4\xa7\xe9\x08\x11\x8a\xa1\x34\x65\xc6\x65\x4a\x30\xe2\x6a\x2d\x2b\xda\x4a\x5f\x39\x7f\x43\x74\xa2\x81\x90\xf3\x4c\xb6\x66\x91\x8d\xf0\xc2\x7e\xc8\x2d\xb5\x9d\x9a\x83\xb4\xc9\x29\xd7\x76\xb5\x47\x2c\x81\xd1\x86\x28\x1a\x81\x0b\xcd\x0b\xb4\xfd\xb3\xd6\xb6\x97\x86\xcf\x64\xb4\xc8\x46\x38\x34\x86\x4c\x8b\xc2\x3d\x30\x35\x29\xd6\xd3\x49\xab\x65\x57\xe4\x1d\x29\x71\x0f\x7f\x99\x0d\x46\xe4\xfa\xaf\xc8\xac\x60\x86\x33\x29\xc4\x96\x42\x36\xc2\x68\xdd\x31\xe5\x21\x32\x8d\x6a\x84\x63\x01\x62\x1f\x94\x9a\x49\xfa\x45\x74\x16\x50\x63\x08\xc2\x69\x26\xf8\x44\x7e\x1b\xe6\x87\x9d\x99\x11\x06\x89\xe8\xd4\x8b\x03\x9d\xaf\xec\xc8\xe5\x7a\xe2\x0a\xc8\x63\x88\x35\x7b\xd3\xdc\x4c\x66\xd6\x7d\x1f\xf8\xc1\x83\x10\x2b\xf1\x7b\x29\x7f\xef\x73\xa8\xad\x2b\x88\x83\x67\xbe\xe7\x8b\x7a\x21\x6f\xb9\x34\x48\xc4\xcb\xc7\x28\xaa\x3d\xf3\xd0\x26\x1d\x52\xc9\xb7\x9a\x8e\xc5\x50\xe6\x7b\x29\xb2\x55\xd9\x68\x10\x71\x41\x1c\x52\x87\x94\xfb\xbb\x0b\xe4\x0a\x47\x8f\xfd\x14\x32\xef\xbd\x56\x1a\x30\xd6\x56\xec\xb4\x1d\xba\xdc\xdd\xf6\x68\x63\x37\x80\x82\x7c\x18\x2a\x0a\x02\x71\xf0\xcc\x77\xa3\x32\x2d\xf7\xc0\x48\x52\xfb\xd9\x0c\xf5\x8f\xfa\xe9\x62\x31\x17\xf4\x0b\xe6\x05\x0a\xd7\x19\x50\x02\x73\x5c\xe6\xb1\x4a\x82\x10\x71\x41\xdc\xff\xcf\x50\x7f\xc7\x1d\x12\x30\x75\x91\xf7\x8b\xef\xf6\xcb\xa7\xb4\xd7\xdf\xbd\x26\x22\xd1\xac\x76\xbf\x8f\xd5\x39\x8e\x45\x29\xdc\xfa\xfe\xe5\xcc\x0d\x84\x11\x06\x71\x50\x8d\xf0\x3f\x1b\x61\xd0\x0b\x7d\x6a\x93\x9c\x97\x47\xc1\xef\xa2\x0c\x2a\x5e\x30\x6a\x7f\xa6\xad\x0c\xeb\x4a\x69\xf3\x64\xb0\x90\x3d\xaf\xcf\x45\x2f\x7f\xe2\x66\xd4\x09\x75\x0a\x05\x71\x70\x09\xe0\x72\xb3\x06\x2f\xd6\x5c\x56\x75\x7c\x6f\xf5\xe0\xd9\x48\x4a\x19\xd1\x3e\xd3\xd8\xd3\x68\x5f\xe9\xf5\x47\x4d\x4d\x29\xab\xf9\x9a\x88\xb8\x20\x0e\x2e\x81\xb7\x75\xd5\x0e\xe1\x3f\x6e\xcc\x7a\x05\xee\x31\x36\xe2\x1a\x6c\xf9\x1c\x50\x89\x49\x86\x24\x63\x0b\x7a\xef\xa5\x2c\xb6\xaf\xe5\x23\xe2\x82\x38\xb8\x04\xbc\xc9\x05\x04\xd3\xbe\xdb\x57\x5d\x29\x56\xa6\xb5\xfe\x1a\xe9\x78\x4f\xa6\x58\x8f\xd5\xf9\xf1\x82\x18\xc9\xf1\x7d\xe6\x47\x93\x90\xb9\x02\x71\x70\x09\xa0\x71\xc5\x12\x54\xe4\xf3\x70\x59\x37\x95\x6c\xd3\x2f\xf5\x52\xcd\xd8\x68\x3a\xdc\xb9\xe8\x38\xf5\x59\xa2\x98\xd0\x1a\x7b\x1a\x6a\x92\x03\xe2\xa0\xda\x40\x80\x11\x06\xcd\xae\xa7\x69\x80\x8b\xac\xf7\xb9\xe6\x04\xee\x98\x60\x7e\xdc\x84\xbc\xed\x6e\x16\x8f\xe9\xd3\xa2\x81\x7d\x5d\x71\x85\xa9\x6f\x2b\xab\x11\xa1\x50\x49\x3f\x88\x83\x6b\x40\xe8\xea\xab\xe6\x3e\xec\xbb\xad\x5a\x68\xce\x26\xcd\x85\x73\xe8\xf3\x64\x71\x8b\x99\xa5\xe1\x04\xb7\xb3\x1e\xe7\x34\x87\xac\x41\xf5\x96\x20\x0e\xae\x01\x9c\x9f\x3a\x28\xd7\xcb\x1f\x05\x89\x9a\x62\x19\xa6\xf2\x04\xe1\xdf\x9c\x27\xd0\x11\x46\x5d\xb2\xd6\xd2\xd3\xfe\xec\xf7\xc3\xf0\x21\x22\x2e\x88\x83\x6b\xe0\x67\x53\xcb\x03\xfe\x6c\xf4\x5d\xc7\xc9\x4d\x8a\xd4\xbb\xdf\x9c\x88\x34\x5f\xfb\x4c\x4e\x93\xb3\x2f\x51\x9a\x08\xdc\x7b\xe5\xf8\x13\x11\x17\xc4\xc1\x35\xa0\xb3\x42\x7a\xf3\xeb\x9d\xc4\xf4\x97\x23\x31\x75\xe7\xd3\xd5\x65\x53\x7f\x93\x0a\x56\xc9\xc7\xbd\x3c\x77\x65\x98\xd7\x16\xd7\xcc\x0a\xa1\x01\x10\x07\xd5\x06\x02\x8c\x30\x28\xd5\x9d\xa6\x81\xe4\x95\x98\x58\xf2\x6b\x22\x18\x1b\x73\x15\xbb\x4f\x0c\x4c\xd0\x76\x3a\xd5\xc9\x34\x24\x99\x78\x29\x2f\xbc\x4b\xef\x37\x3a\x6f\x84\x18\x3b\x88\x83\x6b\x40\x26\xab\xa9\xf0\xd2\xe2\x81\x64\x1b\x9f\xea\xc7\x73\x4c\xba\x45\x8a\x19\x02\xb8\x0e\xdf\xc8\x97\x88\xbd\x69\x24\x5a\x5f\x12\x43\xc6\x12\xc4\xc1\x35\xe0\xfd\x24\x33\xfa\x1b\x53\xdb\x61\xcb\x57\x71\x54\x3c\x4c\xac\xd7\x2b\x6a\x0d\x79\x62\xb2\xfc\x8f\x8a\xad\x3c\xaa\x6a\xa5\x8f\xa0\x8f\x2c\x20\x0e\xae\x81\x7b\x47\xcf\xb6\xa9\x93\xcd\xd4\xd2\x5d\x22\x4a\xa3\x1b\x5c\xa8\x8d\x33\xf0\x43\x7d\xf6\x27\xf5\xa5\x1f\x75\xb1\x52\x71\xd7\x7a\x41\x8d\xe3\x00\x1c\x5c\x03\xee\x25\xa8\x0f\xd6\xf7\x17\xc2\x5c\x9b\xb7\xdf\xda\x34\xfa\x95\x2d\x72\x6b\xd0\x63\xbe\x94\xec\x21\xa2\xed\x0b\x35\x9c\xf9\xf5\x0d\xa1\x01\x10\x07\xcd\x03\x00\x23\x0c\x5a\x77\x9c\xa6\x81\x5f\xa6\x8d\xb7\xc8\x36\x62\x1b\xeb\xcd\x15\x75\xf1\x2e\x15\x57\xce\xf8\x5f\xdf\x3f\x7f\x4b\xf2\xa7\x0c\xd6\xd6\xc7\x8e\x22\x4d\xa8\x42\x08\xc4\xc1\x35\x70\x94\x1b\x66\xa6\x95\x2d\x25\xe7\x46\xef\xd3\x96\xf7\x81\x8b\xeb\xdb\x23\x69\xce\x3e\xdf\x74\x6e\xfe\xe0\xb4\xfe\xef\x84\xc3\xd0\xdd\xcc\x20\x0e\xae\x81\xc5\xe9\x93\xa0\x92\x14\x7b\x14\x8c\x47\x34\xcb\x39\x31\x03\x01\x01\xb3\x5a\xc9\x0f\x1f\xa1\x7f\xa0\x47\x8b\x90\x68\x0c\xf2\x71\x42\xc4\x05\x71\x70\x0d\xec\x53\x2b\x4b\xe7\xcb\x67\x73\xd5\x90\x6a\x0b\x0b\x7b\xf5\x49\x33\x7f\x36\xbb\xb6\xc9\xbd\xc5\xff\x7e\xb6\xa7\x18\xb3\x92\xab\x0d\x3a\xc5\x00\xe0\xe0\x1a\x48\x62\x2e\x64\xa7\xff\x8c\xcd\xd2\xb5\x71\xc3\x61\xad\x43\xbb\x99\xcd\x46\xcd\x5a\x25\xa6\x4a\xfd\x5a\xa6\xa2\x1f\x8d\xb8\xa0\x3d\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\x64\xa2\x4e\x37\xc2\x29\xf8\xd6\x0a\xbf\x48\x1e\xbe\xac\x8d\xb1\x6c\xaf\xea\x26\x7b\xff\x24\xaf\x96\x87\x91\xc1\x89\x23\xba\xf1\x39\xc1\xa1\x0a\xc6\x07\x84\xa9\x04\x71\xc8\x46\x58\xa1\x81\x9f\x6c\xab\x02\xf3\xea\x3c\xc5\x81\xa9\x44\x32\xed\xac\x94\xee\x8c\x90\x33\xce\xc3\xdc\x67\x43\xee\x89\x3c\x14\x22\x9d\x88\xc8\x20\x0e\xd9\x08\x4f\xcd\xcf\x0e\x76\xdc\x2c\xba\xb7\x75\x58\xf2\x3b\x61\x2e\x5c\x68\x35\xd5\x7f\x54\x99\xc2\xf6\x5c\xd1\x55\xe6\xaa\x28\x1b\xcf\x75\x44\x64\x10\xf7\x7f\x46\xf8\x7f\xae\xbc\xfa\xd7\xf7\x08\x5f\x7d\x4b\x72\xff\x7a\xf5\x05\x45\xd7\x8e\x97\xb2\xad\xac\xdb\xcf\xbf\xab\xf4\xba\xd1\x88\xf0\x5d\x77\x50\x8c\x1e\x99\x53\xef\x35\xfd\xdb\x08\xbb\xfb\x09\xa1\x14\x4c\xb9\xe4\x0d\xb0\xf3\x5c\x36\x50\x8b\xb8\xea\x42\x22\x92\x81\x6b\x22\x16\x24\xb5\x37\x43\x72\x8f\xaa\xfa\xfc\x5f\x68\xb5\xe1\x68\xbe\x6f\xe7\xf5\x59\xf7\x83\x41\xe1\x67\x1b\x26\x23\xdc\xd4\x3e\x11\x29\xf1\x82\xe6\xe7\x3b\x94\x0c\xbb\x4a\x48\xb9\xfe\x6b\x46\x18\x34\xb4\xbf\x6b\x84\x91\x8c\x70\x12\x43\x07\xaa\x46\xff\x04\x87\x5d\xf0\x8d\xac\xc7\xe1\x39\x3f\x39\xc7\x2c\xbb\xea\x08\xab\x87\x4b\x19\xde\xca\x5e\x19\x49\x78\x7e\x26\x9b\x95\x7c\xc8\x17\xfa\xb6\xfd\x61\x79\xf5\x7a\x38\x1e\x25\x62\xef\x43\x40\x67\x74\x88\xf0\xd6\xa1\x4b\xeb\xd0\x15\x15\x9b\xc9\xf2\x77\x8d\x9b\x7e\x9e\x67\xb2\x35\x8b\x6c\x84\x13\x93\xc4\x5e\xec\x7b\xe2\x75\xdf\xb4\xcc\x53\xa5\xb9\xff\xac\x6c\xeb\x7a\xef\xd2\xa8\x45\xc1\x48\xc1\x0e\xdf\x06\x0d\x1e\x73\xdf\x99\x8c\xd6\x00\xe9\x67\xb7\xb9\x1f\x06\xea\x64\x33\xf8\x5d\x54\x92\x8f\x8c\x50\x5f\x7e\xfb\xbd\x9f\xbc\x55\xc3\x39\x28\x96\xfc\x7b\x3a\xd6\x67\x3c\x02\x99\x33\x19\x2d\xb2\x11\x1e\xe7\x6e\xd1\xf7\x88\x21\xe3\x1c\xbc\xc7\xe8\x26\xed\x4b\x2c\x47\xb8\x49\x16\x99\x23\x2a\x20\xc1\x8b\x29\xfd\xf6\x8a\x84\xab\xd9\x99\x19\x61\x90\x88\x4e\xcb\x7c\x93\x54\xcb\x02\x38\x47\xef\x8a\x5b\xe2\xd4\x8b\x3a\x99\x17\xae\x3c\x52\x49\x7f\xf7\xac\xac\xb3\x41\xb5\x32\x40\xc6\x9d\xcd\x06\x3a\x0b\x08\xe2\xe0\x99\xef\x70\xa5\x8e\xf7\x23\x7e\xd0\x3b\x3c\x77\x9f\xf5\xb8\x1d\xcb\x7b\x19\xf2\x78\x43\x52\x0a\xeb\xbd\x4a\x5e\xc7\x4f\xe8\x59\xd5\x20\xc3\x0a\xe2\xe0\x99\xcf\x8b\xd9\xc7\x7f\x5d\xde\xac\x0f\x2f\x84\x71\xe4\x19\x89\x40\xa1\x9b\xc9\x07\x7c\xfe\x2f\xae\xe1\x8e\x4a\xd6\xee\xa3\x4b\xcf\xbf\x20\xe2\x82\x38\x78\xe6\x4b\xa0\x18\x78\x4f\xe6\x86\x7e\xc9\xeb\xa0\x68\x83\x2c\xb5\x88\x0f\xaf\x1e\x35\x78\x72\x0e\xc3\x10\x35\x5c\x93\xf3\x1d\x67\x7b\x0d\x22\x2e\x88\x0b\x90\xf9\xdf\xcf\x89\x07\x44\xba\x9b\xcb\x76\x94\x4f\x9f\xad\x90\x7d\x7b\x1e\xbb\x54\x44\x7c\x7e\x5e\x8c\x7b\x8a\x76\xad\x94\xc7\xdf\x6c\x8e\x9f\xf3\x0e\xc2\x08\x83\x38\xa8\x46\xf8\x9f\x8d\x30\xe8\x85\x3e\x4d\x02\xf3\x4d\xaf\x7e\x19\xe0\xfe\xc4\x31\xa2\x5c\x08\x26\x7c\x1d\x72\x60\x64\x2e\x3b\x5b\xef\xad\x9e\xb3\xc4\xc6\xba\x54\x8e\x82\xa7\x88\x18\x3a\x88\x83\x4b\x40\xee\x9e\x89\xcf\x0b\x72\xe3\xec\x13\xec\xd1\xca\x37\x17\x6c\x2c\xb6\x49\x75\x2c\xd0\x26\x2e\x5e\x5e\x4d\xe6\xe0\x90\x3d\x28\x87\x36\xef\x41\x1c\x92\x09\x2a\xe5\xe1\x32\x5b\xc9\x16\xcb\xc0\xba\x7c\x72\x32\xf5\x90\xce\x1d\x4f\x44\xfb\x49\x9e\xba\x89\xb8\xe3\x63\x32\x73\xbd\xcb\xd0\xf5\x26\x20\x0e\x2e\x81\xed\x38\x93\xa8\xce\x4f\xd1\xa6\xda\x8d\x5a\x72\x8b\x49\x3e\x35\x03\x63\x5c\x35\x8d\x8c\xb9\x0c\x41\x3b\x34\x15\x94\x77\x9d\xf0\x10\x71\x41\x1c\x5c\x02\x71\xad\x1c\x5d\x91\xbf\x49\x1f\x17\x93\xa8\xf9\x8b\x15\x2e\xb5\x44\x59\x33\x69\x7f\x37\xdc\x72\x6b\x6b\xf3\x3f\x67\xef\xa4\x3f\x87\x58\xfc\x80\x38\xa8\x36\x90\xef\x9f\x17\xc0\xa0\xd9\xf5\x34\x0d\xb0\x36\xaf\xdf\x6f\xf9\x48\xab\xc6\xfd\x45\xdd\xb9\x70\x83\x94\xb3\x5c\x9b\x64\x70\x91\x17\xc5\x76\x6d\x75\xe1\xbd\xcf\xbe\x28\xd4\x78\x08\xc4\xc1\x35\x80\xf1\x66\x8a\x29\x6a\x41\xf9\xb2\x05\xba\x65\x6d\xd2\x8e\x66\x9c\x48\xb2\x96\x58\x8c\x78\xf7\x25\x65\x3b\x49\x27\x67\x01\x72\x16\x44\x5c\x10\x07\xd7\x80\xa1\x44\x60\xe3\x71\x63\x08\x05\xaa\x9d\x2d\x4b\xde\xf5\x3e\xab\xd0\x48\x0a\x6f\xac\x8d\x89\x13\x96\x6c\x5f\xc1\xf9\x54\x65\x1f\x44\x5c\x10\x07\xd7\x80\xae\x55\x95\x73\x05\xd9\x60\xdc\x0c\x8d\x03\x6e\x25\x55\x07\xff\xaf\xd5\x9f\x5f\x03\x3f\xf5\x87\xdd\xcd\xc8\x0a\xb9\xb1\x74\x08\xd5\x48\x82\x38\xb8\x06\x2e\xfe\x38\x28\x7e\x4c\xe4\x5a\x6b\x61\xc5\x4b\x94\xb9\xd1\x8d\xb9\x4e\xb0\xf6\xe0\x16\xc9\x63\xdd\xaf\x92\x72\xee\x8f\x0f\x18\x77\x10\x1a\x00\x71\x50\x6d\x20\xc0\x08\x83\x52\xdd\x69\x1a\x58\xaa\xc1\xf1\xb4\x5d\x65\xbd\xc4\x68\x3b\x7b\xa3\x62\xf8\x50\x8f\x6c\xdc\xf1\x44\xe2\x13\x09\x6d\xf7\x1d\x53\x6a\x91\xdb\xe6\x47\x88\xb1\x83\x38\xb8\x06\xc8\x6e\xc8\x63\x61\xae\x6c\x65\x52\x0e\xbf\xec\x14\xbe\xe6\x5b\xc8\x3d\x3b\x9c\xf1\x79\xa8\x4e\xcc\x79\x6c\x69\x3e\x6a\x83\xe4\x3d\x74\xd8\x06\xc0\xc1\x35\x20\xa3\xcd\x2e\x70\xae\x4e\x59\x91\x4d\x51\xf4\x97\x93\x99\xba\x9e\xa1\x77\x72\xaa\x1e\xe1\xb0\xb4\x10\xb5\x8d\x81\x73\x98\x2a\x54\xd5\x03\xe2\xe0\x1a\xc8\x47\xeb\x76\x8d\xc9\x49\x35\x4c\xb0\xf4\xf7\x30\xed\x4d\xda\x7d\x9d\x97\xc6\x79\xbf\xd3\x62\x21\x71\xa4\xa7\xa7\xdc\x03\x0d\xda\xbd\x04\x71\x70\x0d\x28\xa2\x7f\x2a\x36\x20\xca\x1e\x29\xef\xbb\xf0\x6b\x9d\xc7\xad\x45\x42\xae\x7b\xb1\xab\x89\xbe\x4c\x94\x88\xee\x3e\xff\x04\xf7\x75\x84\x06\x40\x1c\x34\x0f\x18\x00\xee\x92\x06\xac\x3b\x4e\xd3\x00\x4b\x0e\xaa\x3f\xde\xc0\xdd\x5f\x1d\xa4\x92\x13\x5a\x64\xf4\x6a\x94\xf9\xb7\x75\x22\x69\xd7\xab\xf1\x3f\xab\xc9\x71\x0c\x8b\x40\x4d\xad\x40\x1c\x5c\x03\x3c\xf5\xf4\x57\xc8\x05\xad\x39\x9a\x4c\xfc\x35\x9c\xac\x6f\xb3\x51\x58\x53\xaa\xe6\xeb\x62\x8f\xe7\x17\x4d\x11\x38\x38\x75\xa0\x23\xe2\x82\x38\xb8\x06\xd0\x8a\x7c\x37\x85\x71\x9e\x96\xfc\xbe\x3c\xae\xbe\xe8\x63\x1a\xa5\xf2\x60\xe7\x31\x5a\xbf\xef\xf5\x4e\xbc\xe3\xcf\x71\x96\x49\x93\x88\xb8\x20\x0e\xae\x81\xf3\x0f\x46\xdf\x8a\xb3\x16\x98\x50\x7d\x6c\x5b\x91\x2c\x53\x43\x63\x0e\x58\x94\x0a\xbd\xe6\x5b\x64\x1b\x72\xff\xc7\xb7\xac\xce\x55\xa8\xc5\x09\x80\x83\x6b\x80\x8b\x4f\xae\x1a\xe7\x58\xe3\x57\xcb\xf4\xb0\x88\x6d\xa8\x93\x49\xcd\x13\xfc\x54\x4f\xdf\x35\x99\xdc\x46\x72\x86\x8f\xd8\x3b\xb6\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\x90\x89\x3a\xdd\x08\xb3\x85\x6b\xa4\xde\xdd\x54\xed\x89\x25\xc8\x4a\x64\x79\x9b\x2a\x4b\x41\xfc\x3c\x21\xf9\x3e\x69\xb8\x83\x83\x24\xf9\xbd\x64\x17\x62\x84\xa9\x04\x71\xc8\x46\x98\xc6\x06\x6d\xd8\x23\x51\x81\xfb\x67\x50\xb6\xc9\x37\xa7\x67\x0d\xed\xc7\x69\xd5\x74\xb3\x84\xbd\x52\xc3\x9d\x1b\x73\x79\x35\x12\x88\xc8\x20\x0e\xd9\x08\x53\x58\x7c\x2a\xb9\x81\x39\x4b\x2f\x91\x74\xe2\xbc\x78\x32\x82\x76\x49\x84\x13\xab\xf0\x07\x5e\x0d\x25\x96\xce\x1e\x6d\x72\xbd\x10\x22\x32\x88\xfb\x3f\x23\x8c\xff\x77\xe4\x7f\x7d\x8f\xb0\x96\x9a\xbf\xb0\x01\x46\x5c\x06\xe3\xc6\x58\xd2\x76\x1e\xff\xd5\xd2\x64\xd5\x07\xc1\x8a\xfd\x74\xfe\x24\x96\x22\x3f\x79\xb4\xa3\xfe\x36\xc2\x1e\x06\xb9\x07\x06\xb7\x9e\xfa\xb9\xcf\x8b\x69\x63\x8a\x68\x7e\x5a\x66\x53\xb8\x71\x81\x46\x23\x57\x8e\xa0\xf6\x1d\x57\xeb\x17\x91\xbf\x73\x68\xa9\x68\xfc\xa7\x03\xf6\xc0\xc3\x92\xa6\xa6\x91\x38\x76\x8f\xf5\x03\xa9\xb5\xf8\xed\xd0\x7b\x47\x75\xf8\xad\xac\xdf\xd6\x0f\xff\x6b\x46\x18\x34\xb4\xbf\x6b\x84\x91\x8c\x30\xae\x26\x45\x46\x9b\xc5\x9f\xef\x59\x3d\x9e\xf4\x0e\x72\x09\xdd\x44\xb8\x2c\xda\xeb\x42\x9c\x2d\xd9\xaf\xf9\x51\x47\x34\x0e\xa7\xce\x64\xb3\x12\xd9\x08\x73\x90\x9f\x13\xc3\x1c\x30\xca\xd8\x0e\xc8\x89\x28\xb3\x5d\xf9\xd3\x4b\x62\x17\xd3\xf7\x62\xae\x9f\xc4\x56\x8c\xd5\x82\x75\x60\xfc\x4c\xb6\x66\x91\x8d\xb0\x9c\xdb\x89\xd7\x60\x7d\xdd\x08\xcd\x33\x73\x85\xaf\xfc\x34\xf5\xe1\xfa\xae\xec\x03\xd1\x1f\x68\xc6\x82\x28\x1a\x1d\x99\x1b\xce\xa4\x35\x98\x14\xb2\x11\xbe\xe5\x1d\xd2\x76\xae\x71\x91\x3a\xe2\x52\x91\x0f\xb5\xf9\x4e\x5b\x2b\xfe\x3b\xf3\xe3\xc5\x61\x9f\xe8\x1f\xdb\x7d\xb5\xf7\x5f\x31\x9c\xc9\x68\x91\x8d\xf0\xd8\x8d\x41\x19\xee\xe4\x6e\x27\xae\xdd\x81\x3d\xca\x3f\x1f\x9e\x29\x48\xf4\xd0\x47\x5d\x62\x4d\x1c\x51\x78\x4d\x15\xce\x34\xcd\x76\x66\x46\x18\x24\xa2\x53\xdb\xc5\xee\x8f\xa4\xa9\x6c\x34\x6d\xb9\x56\x66\x92\xa1\xba\xf8\x8b\xf6\x75\x65\x3f\xb2\xc2\xf2\xf7\xb6\xba\x2d\x8e\xb6\x26\x50\x22\x03\xb5\x8b\x05\x70\xf0\xcc\x87\xa5\xc2\x82\xfe\x4d\x74\x60\xea\x38\xe4\xd5\x51\x98\x60\x9a\x80\xe7\x49\x7f\xc3\x37\x1b\x3f\x9a\xe6\x5c\x6d\x9e\x96\xac\x0d\xe8\x93\x2a\x88\x83\x67\x3e\xcf\x38\x34\x52\xe7\xaf\x8b\x85\x6b\x5d\x77\xe3\x66\xa2\xf4\xd6\xa8\xa8\x7f\xac\xd5\x63\xf1\x87\xef\xf5\xaa\x72\x3d\xe0\x20\x82\x32\x2a\x88\x83\x67\xbe\x52\x65\x36\xb3\xd0\x48\x14\xf2\xf1\xf1\x8e\xf6\x57\x03\x22\x11\xb4\xfc\x1b\x24\x53\x4e\x49\xae\x87\xd2\x2a\xde\x15\xe6\x85\x98\x88\xb8\x20\x2e\x40\xe6\x7f\x67\x51\xbf\x37\x15\x96\x9c\xe4\xe3\x7f\x56\x70\x62\x66\x19\x1f\x48\xb3\x48\xa4\x9e\xef\x9e\xfe\x71\xac\xd6\x40\xfa\xb3\xd2\x8e\x5a\x2f\x13\x61\x84\x41\x1c\x54\x23\xfc\xcf\x46\x18\xf4\x42\x9f\x26\x01\x01\x5b\x5e\xc5\x4e\xba\x26\x27\xb3\xc3\xe7\xe7\xb6\x7b\x8f\x57\xb3\x57\x14\xc3\xe4\x25\xde\x75\xce\xde\x4c\x28\xfc\xc5\x6b\x08\x19\x40\x10\x07\x97\x80\x8e\xe9\xcb\xaa\x45\xc9\x99\x63\x3d\xcf\x71\xbc\xfe\xc2\x4a\xcd\x96\x55\xdc\x97\xb7\xec\xa4\x6d\x38\x47\x25\x33\x8d\xa5\x1d\x7a\x11\x71\x41\x1c\x5c\x02\xd4\x0f\x14\x19\xe5\xd0\x1f\xd6\x93\x77\x0b\x59\x30\x1d\x97\x10\x9d\x84\xf1\xf6\x56\x2f\x07\x36\x19\xa8\x2a\xb1\xbd\xcb\xf3\x80\x76\xed\x40\x1c\x5c\x02\x54\x5f\xf7\x5e\xf5\x1b\xe6\x29\x87\x44\x2a\xe7\xa1\xa4\x9a\x11\x25\x50\x45\x29\xb5\x91\xaa\x69\x44\xdd\x69\x72\x54\xc1\x08\x82\xae\x63\x01\x71\x70\x09\xd0\x7c\x59\x72\xfc\x68\xf7\xc9\xe0\x60\xec\x90\x2b\x8c\x68\xba\x5a\x80\x7f\x32\xea\xa7\xf2\x2c\x21\x8d\x3b\x93\x93\xd3\xdb\x9c\x2a\xc4\xe2\x07\xc4\x41\xb5\x81\x00\x23\x0c\x9a\x5d\x4f\xd3\x80\xd8\xb4\x9f\x8f\xb5\xe7\xaf\x8d\xde\x66\xc6\xf7\xd4\xea\x12\xa5\x44\x65\x05\xda\xba\x93\x7f\x18\x98\xd3\xa8\x04\x36\x2a\x97\xa1\xdd\x7b\x10\x07\xd7\x80\xe8\xd4\x35\xe9\x29\x55\xf5\xe9\xc1\xca\x9e\x2c\xbb\xcd\x94\x58\x9e\x83\x3f\x98\xd7\x23\xef\x4e\xb9\x89\xcb\xd6\xd1\x69\xfb\x05\x23\xe2\x82\x38\xb8\x06\x18\x8f\xd0\xc7\x56\x73\xae\xbd\x97\x3a\xac\x31\x5b\xbe\x96\xa1\xc1\xd7\x1e\xba\x9e\x54\x5a\x3f\x64\xd4\x55\x50\x33\x31\x99\x0a\x35\xc9\x01\x71\x70\x0d\xd0\xfd\xd6\xb7\x8c\xcc\x2b\x19\x2d\x1b\xcb\xe2\x7e\xbc\x2b\x13\x39\x46\x13\x80\x56\x52\xb6\x5e\x10\x7c\x95\x37\xc3\x53\xae\xfd\x06\x22\x2e\x88\x83\x6b\x80\xeb\x71\x71\x89\x29\x4f\x5a\x7a\x6f\x3a\xcd\xdb\xd1\x2a\xdb\x82\x87\xe2\x8a\x49\xdd\xc4\x55\x3c\xb9\x51\x71\xbf\xd1\x4c\x26\x28\xa0\x05\x30\x80\x83\x6a\x03\x01\x46\x18\x94\xea\x4e\xd3\x80\x72\x5d\x78\xa0\x7e\xdc\xc5\x5a\x03\x54\x05\xda\x3b\x0a\xd3\x7f\xd4\x2a\x25\x92\x9b\x8c\x98\x30\xcb\xa5\x18\x63\x0c\xf2\xa4\xa0\xdd\x35\x10\x07\xd7\x80\xb8\x8e\xbd\x64\x73\x03\x65\xa9\x5c\xe1\x9b\xed\x73\x7e\xaa\xe7\xcd\x9e\x44\x0e\x5a\x8f\x45\x78\xc5\xf2\x5c\x3d\x98\x12\x0d\x81\xfa\x1b\x82\x38\xb8\x06\xee\x55\x38\x4a\xb8\xd6\x9c\xab\xfd\x68\x8d\x89\xee\x17\xb7\x44\x67\x44\xcc\x9a\xff\x49\xe9\x3d\x09\x19\xc6\x6f\x99\x97\xea\xde\x56\xd0\xce\x2d\x80\x83\x6b\xc0\x7a\xd1\x15\x03\xff\xd6\xd6\x75\x66\x56\x97\x11\xc7\x03\xcf\x06\xe3\x2c\xf7\xd1\x46\x9a\x54\xcc\xd0\xb8\xf4\xbe\x8b\x9f\x7a\x18\x10\x71\x41\x1c\x5c\x03\xdc\x07\xc2\xd5\x2f\x94\xf0\x05\xb7\x9f\xdf\xe0\xe3\xda\x58\x8e\x18\xbe\xa7\xf9\x00\x67\xae\xd1\x2a\x55\xcd\x5b\xba\xf3\xf1\xf4\x55\x84\x06\x40\x1c\x34\x0f\x00\x8c\x30\x68\xdd\x71\x9a\x06\xe4\x58\xea\xde\xb0\x94\x5f\x27\x3c\xe2\x0a\x73\x6b\xdc\x26\x4c\x5b\x97\x4c\x8b\x7f\xeb\x9f\xa3\xfa\xd2\xa7\xfa\xdb\xd8\x22\x19\xf4\x4c\x41\x1c\x5c\x03\x35\xd6\xd9\xeb\x0c\x1b\xba\xe9\x2d\x37\x23\xfa\x23\x17\x8b\x48\x04\xd4\x48\x82\xbf\x2b\x97\xc6\x35\x2f\xfd\xa9\xd9\x42\x5b\x82\x8e\x1a\x83\x38\xa4\x86\x69\x1b\x83\x73\x3e\x8b\x0b\x03\x5e\xbd\x0f\x83\xfd\x92\xf8\x3a\x2a\xec\x7f\x76\xbf\x17\x5d\x7f\xbd\xcb\xf6\xeb\x41\xef\x33\x1d\xe8\xef\x05\x71\x70\x0d\x3c\xe2\x88\x15\x4c\xe8\x2a\x7e\xae\x38\xbe\xb3\x9e\x63\xf1\x45\xf7\xe4\x69\xda\x17\x55\x8a\x80\x84\x97\x73\x26\xbd\x47\x82\x35\x49\x88\xb8\x20\x0e\xae\x01\x4b\xb1\x4a\xf3\x6b\xb3\x02\x26\x02\x9a\x1f\xae\xdc\x78\xfa\x90\x70\x43\x8a\x78\xe6\xe5\xce\xf9\x43\xe3\x94\x6d\x8b\x96\xc9\xcd\x3c\x84\x06\x40\x1c\x34\x0f\x00\x8c\x30\xc8\x44\x9d\x6e\x84\xe9\x69\x02\xb4\xaf\x59\xaf\xa1\xa3\x95\xb2\xd1\xfc\x62\x1a\x68\x8d\x96\x08\x1f\x11\xbd\x57\xa7\xd5\xae\x52\xc5\xf5\x28\xfb\x2d\x64\x57\x41\x1c\xb2\x11\x7e\xcc\x7e\xa7\x74\xea\x65\xdd\x98\xcf\x6b\x0e\x15\x66\xf6\x28\xaa\x5d\x62\xae\xf9\x2c\x3c\x0e\x37\xfd\xbb\x3d\x4c\x1d\x82\xfc\x90\x5d\x05\x71\xc8\x46\xb8\xa2\xed\x33\xcd\xfa\xb3\xaf\x1a\xc4\x74\xf1\xbe\xa2\x5a\x03\x8f\xe3\x1f\x2d\x69\xa9\x11\xa7\x65\x04\xcb\x64\x2f\x1b\x45\xcd\x0a\x20\x22\x83\xb8\xff\x33\xc2\xff\x73\xf7\xf3\xbf\xbe\x47\x98\x9e\x99\x8f\x4a\x50\x5c\xfb\xe7\xac\xc0\x87\x25\xc7\x28\x2a\x0e\xf7\xef\xd3\x54\x59\xf8\x8f\xce\x4d\x7f\xd2\x7d\x32\x1d\x56\x9e\xf2\xb7\x11\x16\x7d\x54\x7d\x65\xcb\x54\x2c\x8b\x2c\xd2\xb6\xae\x5d\x2d\x18\xab\x52\xd8\x41\xe7\xab\x13\x71\x56\x20\x91\x37\xff\x07\xb2\x78\xc1\xbf\xd0\x4b\x1b\x15\x58\x72\x82\x1f\x5b\x18\xe6\xf4\x57\x34\x76\xb5\x44\x24\xad\x8a\x94\x9c\xd2\x25\x2f\x79\xda\x8c\x98\xd8\x0f\xe9\x30\xfe\xd7\x8c\x30\x68\x68\x7f\xd7\x08\x2b\xc3\xcd\xd2\x2c\x6f\x81\x6e\xd9\xcd\xa8\x35\x9a\xc3\x66\x22\x86\x97\xd8\x58\x99\x4a\xb8\x14\x38\x94\xd5\x9f\xf2\x45\x35\x1e\x1f\xff\x96\x9c\x3d\x93\xcd\x4a\x64\x23\x6c\xbc\xba\x7f\x4f\x5b\xa2\x9f\xf6\x50\xb5\x8a\xd0\x9d\x75\xab\x28\xd4\xe2\x8e\xf7\x1d\xe9\x9b\xfb\x8d\xa6\x96\x14\x19\x09\x13\xb7\xcf\x64\x6b\x56\x13\xf9\x66\x5d\xf2\x5e\x0f\x7a\xc7\x6e\xb6\x7a\xc9\x42\x1e\x9d\x62\xed\x1c\xed\xc8\xca\x94\x27\xc1\x2a\x8c\x45\x7c\xaf\xb6\x71\x27\x86\x98\xce\x64\xb4\xc8\x46\xd8\xf3\x7c\x5d\xe5\x9c\xf7\x9a\x0b\x8b\xb5\x8a\xeb\xac\xb0\x10\x2e\x7f\xca\x3b\xa7\x4b\x65\xd8\x74\x96\x95\x85\x2e\x75\x25\x5d\xe8\x67\x32\x5a\x17\xa4\x9f\x4d\x90\x9e\x1f\xad\x49\xb5\x8d\x12\x9d\xdf\xbb\xae\x46\xf8\x44\x27\x36\x7d\x8c\x32\xc9\x75\x59\x56\xbe\x1d\x83\x50\x32\x2d\xeb\x0c\x7a\x64\x1b\xfc\x3b\x11\x9d\x96\xf9\xae\x76\xbd\x6c\xfd\xb3\xfb\xa3\x52\xa8\x73\xdc\x7d\x57\x75\xab\x69\x9a\xff\x0e\xcb\xe0\xed\x6e\xaa\x17\x26\x0a\x0b\x25\xd7\xd1\x98\x11\x33\x3e\x88\x83\x67\x3e\x85\xd4\xb7\x09\x33\xc3\xa2\x78\xc1\xc4\x4a\x52\x9f\x03\x3c\xaf\x63\x45\x13\xee\xdd\xcf\xbc\xe2\xf7\xba\x81\xb2\xc9\xba\xd9\x12\xda\x11\x06\x71\xf0\xcc\xd7\x16\xb2\xff\x80\xa7\xd4\x94\x20\x4c\xfc\xf5\x68\x27\xf5\xb0\x65\xb7\x48\x64\xdd\x83\xd7\xfc\xda\x1b\x63\x56\xb6\x41\x93\xf9\x50\x4d\x33\x88\x0b\x90\xf9\xdf\xd6\x80\xa4\x97\xcc\x44\x9c\x4a\x84\xb7\xf1\x75\xec\x34\x14\x7b\x8a\x9d\x9f\x2e\x59\x76\x33\x9b\xe9\x73\x5f\x62\x61\x5a\x48\x11\x5d\x86\x3a\xa4\x80\xb8\x00\x99\x73\xff\x13\xf7\xc1\xae\x50\x01\xa9\xa8\xde\x70\xa7\x51\xed\x95\x7b\xdb\x74\x14\x5b\xd5\x9b\x0c\x84\x5b\x55\xc1\xd3\x94\x99\x74\xf1\x0c\xda\xb4\x08\x23\x0c\xe2\xa0\x1a\x61\xe5\x7f\x5c\xfc\x80\x5e\xe8\x53\x8f\x44\xda\x9a\xaf\x1e\x6e\xe2\xb9\x46\x5c\x18\x8e\x8b\x30\xc4\x1f\x9d\xd2\x74\xe1\xa4\xcf\x0d\x14\xbc\x72\x83\xa1\xbe\x6b\xdb\x18\xda\x59\x01\x71\x70\x09\x7c\x20\x8b\xe0\xf3\xf4\x72\x61\x97\x4b\xd1\xe3\x66\x8c\x2f\xa3\x27\xfd\x24\x5f\xe6\xf9\x44\xab\x80\x25\xe5\xc9\x4e\x0b\x9a\x42\x13\x22\x2e\x88\x83\x4b\x00\xff\x20\x3e\x1c\xf5\x57\x4b\xd1\x79\xad\x89\x5a\x92\x9e\x07\xfe\x73\x4d\x61\xad\x0e\xe4\xed\x37\x54\xae\xe5\x53\xf7\x07\x39\x71\x22\xe2\x82\x38\xb8\x04\x8c\x37\xc7\x9e\x7c\x1e\xe2\x30\x0d\xdd\x6b\xdb\xda\xb7\xef\x3f\xff\xf5\xc7\xda\x33\xa1\x8f\x51\x21\x38\x1f\xe7\xb0\x2d\x7f\xa4\x43\x77\x52\x82\x38\xb8\x04\x12\xaf\x1f\x26\x15\x12\xa7\x7b\xe8\x5c\x9b\x1c\xb4\xc2\xc0\x23\xe0\x61\x9a\xb1\xe0\x2a\x74\xf1\x10\xcc\xfa\x76\x01\xcb\x3a\xec\x13\x62\xf1\x03\xe2\xa0\xda\x40\x80\x11\x06\xcd\xae\xa7\x5e\xa1\x65\x8f\xfa\xf4\xf6\x2a\xcb\xfd\x5f\x54\x05\xaa\x0c\xd7\x16\x7e\xbc\xf8\x8c\x7e\xd2\xd8\x9a\xc6\x40\xed\xf0\x30\xa9\x58\xb8\xe7\x17\xd4\xcc\x06\xc0\xc1\x35\x20\x8d\xcd\xb6\x65\x82\xc6\xfc\x34\xa0\xf8\xf0\x05\x17\x79\xe8\x82\x13\xae\x99\xb1\xc5\x64\xe8\xc4\x3c\xdd\x76\xc4\x06\x51\x0b\xd4\x80\x09\xc4\xc1\x35\xf0\xfa\xaa\x79\x9e\xa3\x6d\x0b\x39\x9a\xc3\xeb\xda\xdd\xa4\xdb\xa3\x5c\xfd\xec\x77\x2e\x5a\xc8\x55\x1d\x69\x78\x11\x63\xe7\x10\x46\x23\xe2\x82\x38\xb8\x06\x50\x15\x7b\xdd\xdf\x3a\x0a\x1b\xd6\x3b\xcc\xb3\xd3\x1e\xba\x19\x31\x46\x4b\x99\xa7\xb1\x0c\x2b\x7f\x97\x27\x09\xd7\xca\x9c\x84\xba\x5c\x83\x38\xb8\x06\xf8\x97\x2e\xe0\xff\xc0\x98\x61\x97\x39\xa6\x5f\xa1\x70\xe5\x0c\x44\xff\x30\x22\x97\xd8\xf8\x29\xc3\x55\x32\xb9\xd5\xa2\x96\xc0\x10\xa1\x01\x10\x07\xd5\x06\x6a\xfe\xb3\x06\x40\xa9\xee\x34\x0d\x64\x45\x5d\xd5\xd1\x57\xbf\xdc\xe6\x7d\xd4\x35\xd9\xd2\x2e\xd8\xcd\x20\xdb\x4d\xbd\x53\x9b\x26\x69\x32\xeb\xb8\x9c\xf2\xe1\x0a\x74\x7f\x2e\x88\x83\x6b\x00\xf3\x82\x49\xd8\x85\xca\x6c\xf1\x92\x47\xd5\x65\x7a\x81\xa5\xd3\xb8\x15\xce\x11\xba\x6b\xbd\x5b\x98\xe6\x1d\xd1\x17\x66\xf8\x4c\x10\x71\x41\x1c\x5c\x03\xb6\xd8\xcc\x57\xee\x0a\x6b\xa1\x18\x6e\xfe\xb8\xe5\x1d\xdf\x5e\x80\xfa\xb5\x31\x7c\xcd\xd5\x6e\xa2\x33\xaa\x9b\x81\x36\xc4\x08\x3a\x19\x02\xe2\xe0\x1a\x60\x5e\xbb\x8d\x26\xc4\x1f\x5d\x56\xef\x78\x33\xdb\x62\x79\xdb\x48\x5e\x9c\x47\x5f\x7a\xfb\x73\x1f\x87\xfb\xf6\x3b\xe5\xe4\x20\x2c\x44\x5c\x10\x07\xd7\x40\x84\x34\xa6\xf9\x95\xd1\xa5\x81\x77\xcd\x6e\x93\x63\x95\x35\xd4\x18\x44\xa6\xc4\xe8\x8f\x74\x5e\x89\x71\x73\xf5\x3c\xd9\xd3\x8f\x45\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\xd6\x1d\xa7\x69\xa0\x7b\x58\x56\x24\x1c\xa7\xde\x3d\x42\xac\xa1\xca\xa3\xdd\xe3\x9e\x86\x6a\x15\x6a\xcd\xec\x02\x75\xbc\x75\x4a\xe4\x7c\x59\x59\x11\x62\xec\x20\x0e\xae\x01\x75\x1b\xa7\xa6\x5d\xe3\x7a\xce\x8a\xf7\xcb\xb9\x4d\xab\x2a\x8b\x16\xc3\xb2\xb4\x21\xb6\x93\x38\xd3\xf6\x7e\x37\x5b\x52\xdc\x6a\x11\x71\x41\x1c\x5c\x03\xdb\x4b\xfd\x24\x2f\xe6\x28\xaf\xf2\x31\x3d\x5a\x8f\xbc\x5f\x65\xf0\xb2\xf2\xce\xcc\x0b\xef\x68\x31\xec\x9e\x30\x56\xd2\xa4\x38\x54\xe8\x14\x0f\x80\x83\x6b\x60\x7d\x42\x21\xf9\xb7\xac\x67\xda\x23\x14\x97\x5b\x98\x12\xd8\x74\x3f\x82\xf2\x6a\x04\x5b\x1b\x43\x71\x8c\x99\xe5\x8e\x12\x6a\x73\x11\x71\x41\x1c\x5c\x03\x58\xe4\x94\xc1\x4e\xcf\x03\x5e\xfb\xda\x4d\x7b\xec\xe6\x1e\x16\xb7\xf2\x6c\x4a\xa0\x7e\x56\xfd\x88\xcf\xbd\xa4\x77\x22\xad\x69\x83\xd0\x00\x88\x83\xe6\x01\x97\x7f\x36\xc2\x20\x13\x75\xba\x11\x8e\x60\xb9\xf0\x98\x3c\xeb\xf7\xf5\x00\x51\x5d\xae\xef\x7d\x55\x6f\x03\x7c\xb0\x27\xf8\x46\xe9\x4b\xd4\x32\xe2\xcb\x6b\xc5\x58\xbf\x20\x4c\x25\x88\x43\x36\xc2\xaf\x2f\x0d\x09\xe4\xda\xa6\x9e\x53\x11\x11\xc2\xaa\xa1\xd2\x93\x7c\x99\x1a\x90\x2a\xfa\x14\xaf\xa9\xaf\x27\x6a\x46\x53\xe6\xae\x27\x22\x32\x88\x0b\x90\x43\xa1\xfd\xdf\xc8\x44\x8a\x4b\x69\x9a\x3a\xbf\x70\x54\x3f\x24\x3d\x58\x6d\x60\x63\xbd\x1b\x94\xf5\xe6\x51\x77\x73\xf8\xca\xbb\xd5\xa6\x66\xd9\x94\x35\x44\x64\x10\x17\x20\x77\x0e\xf6\x34\xfe\xf5\x3d\xc2\xc1\xb2\xa6\x56\x0e\x98\x64\xaf\x23\x0a\xfc\x29\xbf\xb6\x68\xbd\x70\xb1\x38\x26\xda\x2b\x55\x53\x96\xfe\x42\xf2\xb8\xf8\x75\x4b\xe6\xdf\x46\x58\xf3\x32\xdb\x87\x2f\x52\xea\xce\xda\x47\x0e\x9c\xe7\xe8\x0c\xc8\x43\xd4\x55\x36\xfa\x63\xbb\xc2\xd6\x3e\x2d\x78\xfd\xe8\xc5\xd0\xfc\x0b\xbd\x3b\x9f\x3f\xf5\x3e\xc3\x44\x6a\x34\xe2\x21\xbe\xf7\xaa\x17\xf7\xb3\x2e\x96\x9a\x3d\xf9\x20\x7f\x6f\xcb\x4f\x47\xa6\xc5\xba\x8e\xff\x35\x23\x0c\x1a\xda\xdf\x35\xc2\x48\x46\x98\xb6\xa1\x65\x2b\x21\xd5\xcb\xdb\xb0\xcd\xc2\x44\xb5\x76\x85\xbc\xe4\x31\x13\xd9\x7c\x5a\x6f\xbe\x23\x45\x52\x10\x91\x03\x75\xe4\x99\x6c\x56\x22\x1b\xe1\xa9\xd7\x3d\xbc\xf3\x77\x12\x87\xb1\xe6\x13\x1b\x30\x13\x1f\xe4\xfd\xdc\x47\xb3\xcd\x38\x7a\x50\xfc\x8c\xa5\xe8\x2b\x46\xc2\x9f\xdd\x33\xd9\x9a\x45\x36\xc2\xee\xc5\x35\x7c\xf4\x44\xdf\x57\xf7\xd9\x7f\x75\xe4\x17\x1d\x4e\x58\x5a\xa1\xb9\x37\xcc\x7e\xe2\x1b\x3f\xcf\x54\xec\x16\x85\x43\x73\x26\xa3\x45\x36\xc2\xc2\x58\x42\xe6\x97\xeb\xbe\xfc\xac\x33\xab\x40\xf1\x7c\x67\xfa\xe3\xbd\x35\x45\x48\x07\xa6\xb5\x24\xd3\x5d\x1b\xf1\xac\xda\xca\xce\x33\x19\x2d\xb2\x11\x4e\x7e\x3f\x48\x16\xe1\x96\xc7\xbd\x59\x1f\x6b\x4f\x8b\x95\xd3\xf8\x7a\xb1\x4a\xf6\x62\xf6\xa6\xad\x73\x2b\xa6\xfd\x27\xad\x14\xbe\x33\x33\xc2\x20\x11\x9d\x96\xf9\xf4\xde\x4a\x28\x4b\x64\x87\xaf\xd0\x62\xd6\xce\xa2\xa2\x8d\xd9\x89\xdf\x56\xde\xe8\x73\xad\xae\x54\xde\x9e\xb8\x8e\x8e\x6b\x45\x0c\xb5\xde\x04\x70\xf0\xcc\xe7\x56\x20\xba\x5d\x7d\xef\x5a\x6c\x3e\xc9\x87\xed\x82\xfc\xf6\x0c\xb3\x91\x48\x87\x43\x9c\x9a\xe6\x05\xef\xf6\xb9\x8f\x46\xc7\x90\x0b\x02\x71\xf0\xcc\x97\xda\x76\xee\x58\xf1\x7b\x17\x85\xd2\xc4\xe5\xcd\x73\xf2\x36\xee\xf9\x9b\x37\x4d\x76\xe7\x2f\x92\x9e\x70\x19\x84\x48\xf2\x31\x88\x20\xe2\x82\x38\x78\xe6\x5b\x45\x2d\x6a\xb1\x3d\x2c\xc4\xac\xba\xda\x5d\xa8\xb1\xee\x26\xc3\x6a\xfa\xd8\xf7\x69\x1c\x7e\xf3\x34\xf7\xcb\xd8\x30\x5f\x92\x05\x44\x5c\x10\x07\x8f\x1b\x4f\x31\xa4\x4d\xd7\x79\x35\xfa\xad\xd9\xb9\x66\xf9\xad\x59\xce\xa7\xb8\xb7\xac\xe7\xf8\x93\xa9\xf7\xbc\xf6\x65\xdc\xd3\x34\xb0\x10\x46\x18\xc4\x41\x35\xc2\xff\x6c\x84\x41\x2f\xf4\x69\x12\x78\x1a\xf7\xdc\x2a\xe8\x99\xe4\xc3\x47\x47\xe3\x83\x41\xf8\x54\x3d\x1f\x5f\xdd\xd9\x28\x9f\x0e\x2d\xcf\xd9\x63\x0c\xfe\x5d\xf7\x01\xfa\xfa\x0d\xe2\xe0\x12\xb8\xfb\x89\x72\xd4\xa3\x8b\x6b\x93\xf0\x44\x3d\xde\x4e\x19\x8f\x39\x85\xb9\xbe\x2a\xdc\x44\xf3\x7c\x77\x07\x3a\x19\x86\x68\x30\x74\x17\x23\x88\x83\x4b\xc0\xa0\xaa\x73\xa0\x4e\x94\x87\x75\x7b\xbf\xbd\x8a\xbf\xe7\x88\xea\x1a\x1e\xcf\xae\x20\xdf\xf0\x9b\x15\xda\x70\x7a\x22\xe3\x94\x12\x44\x5c\x10\x07\xff\x57\xbd\x93\xa1\xd8\xe0\xa2\x28\x53\xfa\xd8\x13\x78\xa3\xcd\x45\x29\xa2\x7f\xe2\x85\x8d\x32\x71\x17\xda\xfd\x2a\x22\x2e\x71\x4f\x75\x1b\x44\x5c\x10\x07\x8f\xeb\xae\x47\xe0\x96\x69\x7e\x5e\x22\xa3\xa5\x77\x25\x83\xd5\x4b\x37\x46\x6c\xac\x75\xa5\xdf\xe9\x97\x80\xc2\xda\x80\xc1\xbc\xbd\x1c\x54\x1b\x08\xe0\xa0\xda\x40\x80\x11\x06\xcd\xae\xa7\x69\x80\xfd\xa2\x8d\xed\x55\x1d\x8e\x32\x95\xcc\x07\xde\x56\xfe\xb9\xf1\x4a\x34\xd2\x49\x8c\x64\x36\xe4\x57\xd0\xf7\x0a\x39\x05\x6a\x36\x10\x63\x07\x71\x70\x0d\xc4\x36\xba\x5c\xbc\xf7\x23\x76\xbc\x2b\x6e\xf8\x4d\xf3\x22\xbf\x72\x5b\x7a\xf8\x8b\x87\xee\x7e\x5e\x17\x54\x7e\x71\xb5\x90\xdf\xba\x8f\x88\x0b\xe2\xe0\x1a\x50\xce\x63\x3b\x27\x88\x4d\xdb\x4e\xe8\x78\xeb\xa2\x7c\xde\xde\x0f\xce\x84\xf2\xfc\xb8\x84\x91\x19\x83\x34\x1a\xdf\x2d\xc5\x29\xe8\x63\x08\x88\x83\xff\xaf\xfc\xa2\xde\xdd\x6d\x8a\xc9\x6c\x19\x8a\xb9\x50\x12\xa5\xd5\x74\x7d\x33\x43\xc8\x77\xe2\x2e\xca\xb7\x21\xf9\x68\xb9\x9b\x4c\x6e\x50\x5c\x10\x07\x8f\xeb\xba\x89\xe5\x54\xec\xb0\x68\xde\xfe\x7d\x74\xe7\xa5\x88\x1f\xe3\xb3\x3b\x4a\x2a\x91\x5f\x87\xc2\x1d\x5e\xec\x1b\x15\x96\xe5\x87\x20\x34\x00\xe2\xa0\xda\x40\x80\x11\x06\xa5\xba\xd3\x34\x70\x30\xb8\xf3\xc6\xe8\x66\x64\xa7\x61\x8f\xfe\x07\xf9\x24\xd3\x3d\x0f\x55\x1f\xda\x63\xa3\x86\x55\xde\x94\xcb\xfa\xf6\x45\x76\x55\x88\xb1\x83\x38\xa4\x2a\x99\x8b\x1e\x93\x4a\x8c\xbb\x7d\x7f\x8c\xef\x7a\x64\x8f\xba\x79\x08\xcd\xe4\x4e\x6b\xeb\x8b\xa4\x57\x47\xee\x3a\xd2\x4a\x78\x75\x40\x55\x32\x00\x0e\xae\x81\x41\x99\x2a\x6a\xb5\x89\xac\xae\x3b\x69\xf9\x32\x2c\xc4\xe2\x97\xc8\x4a\xd6\xa3\x94\xbf\x25\x26\xa5\xb9\x85\xb8\xdd\x6a\x3a\x88\x42\xc4\x05\x71\xf0\xff\xd5\xda\xa3\x80\xa4\x88\x79\x9a\xd5\xb0\xdd\x9f\xde\x6c\xa1\xa2\x82\xfd\x84\x83\xb5\x58\x91\x17\xb5\x4d\xe9\x86\xa7\x8f\x52\x5b\x02\x11\x71\x41\x1c\x3c\xae\xff\xed\xdb\x7a\x96\xb5\x72\xf6\xbf\x63\x5f\x27\x3c\x7c\xf6\x27\x89\x3b\x46\x09\xe7\x31\x8a\xfe\xf2\xdd\x96\x1f\x73\x43\xa9\x12\xb7\x11\x1a\x00\x71\xd0\x3c\x00\x30\xc2\xa0\x75\xc7\xa9\xa7\x02\x16\x1d\x72\x85\x4c\x51\x06\x66\x51\x33\x57\x44\x1c\xc8\x54\x72\xef\x16\xe5\x90\x39\x5e\x28\x1a\xc1\xca\x0b\x9f\x4a\x65\xab\x80\xde\x2b\x00\x07\xd7\x00\xe9\x3a\x8d\xc8\x5b\xa6\xc6\x9a\x7b\x3f\xe6\xf3\x79\x2e\x37\x5f\xaf\x1b\xd0\xe9\xb3\x94\xb2\x67\xc7\xbc\xdb\x9a\x4b\xf6\xbe\x2e\x02\xfa\xce\x0c\xe0\xe0\x1a\x58\x09\xec\xfc\xb2\xac\x58\x64\x23\xe6\x37\x8c\xe3\xf6\x7d\x81\xd0\xee\x53\x98\xb8\x56\xf4\x03\xb1\x2b\x81\xe5\xb5\x0f\x49\x99\xa0\x2b\xbf\x40\x1c\xfc\x7f\xa5\xef\x91\x5a\x8f\xff\x71\x2b\xa6\x77\x8f\x7d\xaf\x32\x74\x34\x81\x12\x5b\x03\x53\x8b\x9c\x74\x70\x3f\x82\x5b\x59\xaf\xe5\x0e\xd4\x34\x0f\xc4\xc1\xe3\xf2\xd5\xd5\x58\x55\x5d\xb0\x7b\xec\x9f\x5c\x96\xc1\xfc\xa6\xce\x15\xeb\x63\x84\xb4\xc5\xe5\x43\xe6\x3b\xcf\x1f\xc8\xb9\x38\x69\xe6\x22\x34\x00\xe2\xa0\x79\x00\x60\x84\x41\x26\xea\x74\x23\xcc\x4e\x9d\xe6\x51\xd7\x33\xe3\x75\x34\xd9\xbe\x58\x4b\xcc\xd2\xfd\x9c\x6d\x62\x51\xe3\x7c\x48\x27\x41\xd7\x7c\x43\xe6\x30\xce\x7d\xe8\x92\x23\x00\x87\x6c\x84\xed\xbe\x94\xb7\x39\x0a\x32\xcc\x1f\x4d\xe5\xda\x59\x89\x52\x5c\xde\xea\x4c\xc9\x31\x4b\x77\x0d\x30\xc5\x6a\xbb\xaa\x4c\xe9\x4a\x86\x88\x0c\xe2\x90\x8d\x30\xe9\xec\xfe\xd5\x2f\xd8\xbe\xbe\x8a\x05\xf6\x99\x37\x0f\x69\x8d\x75\x16\x73\xf0\x0e\xdf\x62\xe1\xc4\x86\x6f\xfc\xd9\xd0\x1e\xe9\x42\x44\x06\x71\x01\x72\xe8\xb0\xa7\xf1\xaf\xef\x11\xc6\x53\xfb\x62\x33\x8e\xae\x68\x24\x92\xdc\x52\x88\x2d\x7a\xe3\x92\xe6\xb9\x3c\xd1\xab\xcc\xbd\x9c\xe1\xa3\x5d\xe8\x33\x06\x25\xbd\x7f\x1b\xe1\xa0\x66\x5d\xe9\x18\x4f\xe6\xc7\xcf\xef\x2b\xed\xd2\xe4\x37\x8c\xe6\x5d\xff\x1c\xab\x39\x63\xda\xe4\xa0\xef\xa0\x2e\xf0\xad\xe1\xda\xdf\x27\xca\x8e\x3f\x3f\xbd\x3e\x41\x11\x66\x6e\xab\x5a\x96\xa5\xab\x3d\xbb\x8e\x52\x22\x72\x7e\xed\x13\xd7\x9f\xc0\x3f\x7b\xdf\x1e\xfd\x2c\xf9\xaf\x19\x61\xd0\xd0\xfe\xae\x11\x46\x32\xc2\x8b\xde\xf6\x95\x26\x55\x24\xa3\x35\xbb\x0a\x1c\x5f\x19\xcf\x8f\x79\x59\xbc\x2f\xc5\xd8\x12\xc6\x4b\x92\x2b\xcb\xe0\x54\x7d\x83\x7a\x26\x9b\x95\xfc\x48\x1e\x4d\xd9\xe1\x3c\x99\xec\x84\x2e\xd3\xb8\x82\x2d\x93\xd5\xe8\x4b\x51\x91\x97\xdb\x53\x1e\x7a\x7d\xc2\x61\x9c\x8c\x1d\xe4\x5c\x17\xce\xa6\x7d\x33\xb2\x11\xde\x88\x11\x35\x54\x7d\x42\x76\xa5\xa0\xb2\xe8\x4a\x55\x2a\xc1\x3b\xf5\x8f\xb9\x9b\xbf\x79\xef\x1f\x1f\xca\x46\xc5\x49\x45\xbf\xe9\x3d\x93\xd1\xde\x45\xfa\x59\xbc\x2f\x93\xe7\x6c\x97\x0a\xcd\xdb\xe8\xe7\x84\x82\x13\x15\xf0\x93\xf4\x66\xfa\x44\xfc\x1c\x3f\x7e\x90\x9e\xe9\xdc\x1a\x32\xa3\x38\x93\xd1\x22\x1b\xe1\x85\x5f\xf4\xb6\xda\xda\xcb\x78\xfc\x93\x54\x34\xd7\x74\xec\x2d\xd0\x84\xc4\xa2\x25\x31\x6b\xdf\xad\x29\x36\x64\xac\x68\x7b\x2b\x9e\x99\x11\x06\x89\xe8\xd4\x0b\x44\x35\x0e\xe7\xb7\x0d\xeb\x8d\xa6\xf7\xc5\x84\x2d\xb5\x88\x13\x29\xce\xf9\x99\xca\x72\x87\x88\xb8\x2d\xf9\xb3\xd8\x7a\x07\x41\xe7\xc0\x40\x1c\x3c\xf3\x75\xd3\x14\x8d\x88\x04\x2d\x27\xef\xb3\xa9\x1f\x57\x1e\xd7\x8d\x2a\xf3\x88\x77\x77\xb4\x5f\x71\xfb\x79\x85\x97\xc3\xd9\xe7\x39\xb4\x73\x0b\xe2\xe0\x99\x4f\xc8\x33\xcb\x4f\xbc\xa7\xed\xe0\x9b\x69\x3a\x1e\x6e\xa5\x92\x26\x16\xc1\x3b\xff\xca\x6e\x79\x54\xb3\xca\x19\xcc\x81\xc2\x9f\x3b\x50\xf7\x1d\x00\x07\xcf\x50\xc5\xef\x9b\xd8\xeb\x14\x69\x86\x82\x04\x9b\x9b\x28\xbd\x04\xb1\x03\x2b\x45\x6c\xaa\x6c\xe8\x2f\x11\x19\xbd\xa8\x99\x4f\x75\x87\xce\x5a\x82\x38\xf8\x73\xe8\x37\x27\xeb\xf5\x4b\x30\x2f\x89\xd9\xd9\xae\x75\x9f\xe2\x2c\xbb\x85\xd6\x8f\x9a\xc8\x99\x7f\x2e\x5e\xb7\x74\x3b\xf6\x84\x59\x0e\x61\x84\x41\x1c\x54\x23\xfc\xcf\x46\x18\xf4\x42\x9f\x26\x81\x8a\x4a\x43\x7c\xf5\x04\x41\x82\xd7\xa4\xad\x17\x1a\x27\x6b\xe6\xd9\x58\x99\x5d\xfd\x29\x35\xe9\xef\x67\x9f\x27\x2e\xfc\xa8\x84\x8b\x18\x3a\x88\x83\x0f\xbd\xc8\x9b\xfc\x20\xb2\xf2\x93\xb9\xde\xe6\x27\xd3\x84\x32\x52\xe7\xdb\x38\xf8\xb8\xdc\xe4\x8a\x4d\xf2\x76\x97\xae\x9e\x2f\x10\x55\x46\xc4\x05\x71\x70\x09\x68\x18\xd0\xee\xab\xca\x84\x77\x58\x94\x76\x71\xd9\xf3\x32\x6f\x6f\x2c\x0c\xb8\x17\x65\x29\xa7\x2a\xfc\x69\xcd\x6a\xc5\xc3\x86\xae\xbe\x06\x71\x70\x09\xe4\x79\x08\x5c\xc5\x9a\x67\xbc\xa5\x5b\x19\x72\xd5\x88\xc0\xf7\xeb\x28\x15\x45\xfe\xa2\x0d\x73\xb4\x4f\xca\x61\x95\xce\x55\x0f\xa8\x9e\x15\xc4\xc1\x9f\x83\x35\xf7\x77\xb4\x51\xb1\x48\x92\xc7\x16\xf3\x5f\x97\xaf\xca\x1f\xb3\x78\xdb\xa9\x14\xb4\xad\x4d\x25\x48\xe0\x99\xf9\x3e\x1f\xcc\x42\x2c\x7e\x40\x1c\x54\x1b\xc8\xff\xcf\x0b\x60\xd0\xec\x7a\x9a\x06\x5c\xd1\xc5\x9d\x09\x3d\x5d\x5f\x5c\x8f\x5f\xa5\x8c\x38\x4f\xad\x65\xd2\x90\x50\x3c\xcf\x68\x52\x79\xb5\xec\xf0\xfc\x5e\x75\x24\x74\x84\x19\xc4\xc1\xc7\x2e\x2f\xd1\x6a\xf3\xe0\x92\x88\x44\xbb\x77\xa3\xe6\x97\x3b\xb7\x9e\xfd\x39\x72\xc3\x55\xa0\xed\x9e\x1b\xcc\xb9\xf6\x50\xc3\x23\xe0\x35\x22\x2e\x88\x43\x3a\x1a\xdd\xb2\x3f\x2e\x15\xa9\xf5\x2a\x63\xdc\x3e\x65\x7d\xbc\x70\x3f\x23\x67\x7b\xc6\x65\xc4\x69\x5f\xda\xbf\x89\x6f\x55\xea\x37\x54\xcf\x0a\xe2\xe0\x1a\xf8\x85\xf3\xf2\x6a\x23\x76\x3b\x8a\xa1\x2a\x3f\xf9\xa4\xaf\x52\x00\x63\x9a\xb3\xe5\xe4\x5b\x62\xd3\x6e\x7e\xab\x6a\xef\x9f\x97\x89\xa0\x66\x41\x00\x0e\xfe\x1c\xd6\xc6\x2e\xde\x28\x19\xdb\xc1\x6d\x50\xeb\x33\xff\xaa\x88\x6e\x69\xe3\x25\x9b\x70\x7f\x88\x90\x24\xd9\x8b\xdc\xa5\x5e\xb9\x74\x04\xa1\x01\x10\x07\xd5\x06\x02\x8c\x30\x28\xd5\x9d\x5a\x1f\xca\x58\xa8\x3f\xdf\xf6\xdc\xb5\x39\x2f\x25\x78\x8d\xd7\x20\x8a\x70\x05\x5b\x62\x9c\x7d\x54\x30\x93\x5f\xfa\x4d\x10\x63\x20\x54\x77\x0d\xe2\xe0\x63\x8f\x7e\xd6\xff\xc3\x23\x1b\x1b\xbf\x7f\x69\xcf\xd4\x5a\x32\x7c\x7c\xe1\xd6\xef\x37\xe3\x5e\xb5\xc6\xf3\x4d\xa5\x8f\x69\x9a\xd1\xeb\x11\x71\x41\x1c\xd2\xd1\x68\x9a\xf1\x3e\xaa\x15\x35\x82\x4b\xed\x84\xb2\xd7\x6f\x99\x04\x14\x58\xd9\xe1\xce\x24\x90\x78\x9b\x76\xfe\xfe\xc4\xe3\x7b\x15\xaa\x92\x01\x71\x70\x0d\x04\xd0\x94\x5f\xc2\xa9\x21\xd6\x6c\x0b\xc6\xf3\x6b\xe6\x1a\x52\x78\xdf\x55\x28\xe6\xda\x80\xd6\x7f\xb1\xc0\xae\xf6\xf6\x57\x4e\x3f\x44\x5c\x10\x07\x7f\x0e\xba\x7a\xa8\xbe\xa2\xd9\x49\x1b\x57\x54\x3f\xe4\x6b\xee\x7a\xbf\xba\xf0\xc0\xbb\xfa\x5a\x48\x2c\xba\xc3\x67\x7a\xc6\xf4\x01\x9c\x76\x84\x06\x40\x1c\x34\x0f\xdc\x05\x34\xcd\x03\xac\x3b\x4e\xd3\xc0\x9f\x2b\x01\xcb\x73\x0f\xc5\xdd\x54\xdd\xcf\x53\x89\xb0\xf6\x3a\x1d\x0f\xea\x17\x8a\x85\xf4\xab\xbf\x6c\x25\xd4\x9b\xb9\xc1\x01\x35\x0c\x04\x71\xf0\xb1\xf7\x4a\xdf\x0e\x3c\x0e\xe4\xfe\x8c\xbb\xec\x66\xed\x14\x40\x62\xa8\x94\x77\xd7\xde\x75\xf5\xfc\x8d\x02\xf2\x04\x26\xa7\xe0\x18\xe8\xa4\x05\x88\x83\x6b\xc0\xef\xf7\xfe\x3d\x27\xf5\x86\x09\x6e\x55\xa3\x73\xbe\xe1\x63\x14\x18\x75\x8a\xee\x37\xf6\x9f\x9c\x57\x9c\xdb\xe4\x79\x75\xb9\x12\x3a\x72\x0d\xe2\xe0\x1a\xb0\x7c\x6f\xdc\xe3\xe5\x46\xe7\x7a\x53\xbb\xac\xe5\xab\x33\xef\xc9\xf0\xdd\x84\x4b\x7a\x57\x07\x5e\xfe\x3a\xc0\x5f\x9c\xed\x51\x87\x4e\x1b\x80\x38\xf8\x73\x18\xe5\x35\x76\xde\x5a\x25\xd9\x35\xf7\x15\xe9\xbf\x8b\x87\x72\x65\xc0\xc5\xd5\xe0\xcd\xb3\xcd\xa1\x3f\xf5\x8f\xe3\x0a\x88\x15\xfa\x10\x1a\x00\x71\xd0\x3c\x00\x30\xc2\x20\x13\x75\xba\x11\xfe\x11\xe6\x79\x9f\xaa\xfc\x77\x74\x66\xfd\xba\x41\xbc\x50\xde\xa2\x1a\x8e\xad\x74\xb2\x61\xc9\xfa\xc0\x37\x5c\x5a\xb4\xf2\x89\x44\x84\xa9\x04\x71\xc8\x46\xb8\xdb\x6b\xa2\x8a\xf6\x5a\x74\x45\xd9\xb3\xa2\x17\x14\xcb\xd1\x45\xc1\x01\x6e\x66\x64\xf7\xe4\x42\x50\x6f\x4f\xf2\xb1\x98\x89\x42\xd5\xc7\x20\x0e\xd9\x08\xef\x5f\xe0\x7a\xf9\xfb\xa9\x2b\x17\xcf\x94\x11\xb5\x77\x73\x4d\xac\x5b\x2e\xe6\x9c\x22\x63\x66\x62\x60\xae\x67\xb6\x5c\x3d\xb7\x0f\x22\x32\x88\x0b\x90\xc3\x86\x3d\x8d\x7f\x7d\x8f\x30\x87\x82\x74\x5d\x92\xb3\xe4\xeb\xf0\x8b\xa9\xdf\xef\x6c\x91\x15\x7e\x6c\x8d\xd0\xc1\xbb\x4c\x3b\xba\x9b\xb1\x51\x8b\xa5\x14\xf5\xe7\x6f\x23\x5c\xe9\xf8\xd2\xd1\x91\xe8\x9c\x24\xcb\x02\xc5\x2f\xbd\x2f\x57\x25\x7d\xfe\xf0\x93\x79\xae\x5f\xf7\x7e\x93\x72\x7c\xfc\x42\xdc\xdb\xe2\x2f\x94\xfc\x40\xa1\x93\x55\x60\x8e\x63\xb2\xfa\x08\x83\xe6\x45\x80\x74\xd2\x9b\xeb\x5e\x86\x21\x9b\xac\xa9\xe8\x11\x75\x79\x6a\x3f\x19\xfe\x6b\x46\x18\x34\xb4\xbf\x6b\x84\x91\x8c\xf0\x7b\xa9\x6c\x56\xcb\x0f\x8f\x39\xdf\xa5\x99\x99\xb0\xa5\x0d\x49\x68\x87\x4b\x7f\x09\xd6\x64\xa1\xc6\x43\xef\xca\x09\x72\xe5\x76\x3f\x93\xcd\x4a\x64\x23\x1c\x20\xda\xc9\xbd\x33\xa2\x12\x8c\xaa\x45\xf1\x58\x0f\x57\x5c\x7e\x41\x47\xf2\xfd\xaa\x8d\x24\x63\xe9\xf5\xe9\x8b\x2d\xf3\x9f\x94\xce\x64\x6b\x16\xd9\x08\xff\x3c\x4a\x5c\x42\xc3\xd3\xb8\xcb\x67\xa0\xe4\x76\x2c\x4f\x26\x95\x3d\x32\x11\x73\x5e\x21\xa7\xc8\xcc\xbd\xa2\xa8\x9e\x2c\x8a\xeb\x4c\x46\x8b\x6c\x84\xcf\x49\x7e\xe2\x67\x5f\xb8\xc4\x33\x97\xd2\xf4\xf1\xe5\x4c\x9d\x51\x5a\xc5\xf5\x85\x15\xa5\xc6\x0e\xcc\xbd\xdb\x9d\xcb\xc6\xc5\x97\xcf\x64\xb4\xc8\x46\x38\xf7\x99\xa7\xcc\xa5\x2d\xb9\xe9\xaf\x9f\x72\x84\x1f\xe9\x51\x48\x7f\xb7\xb1\xb2\x51\xa0\x1d\xac\xaf\x63\xd3\x08\x65\xbc\x1b\xde\x7d\x66\x46\x18\x24\xa2\x53\x9b\x65\xdd\xdc\xe2\x1d\x7b\xf8\xc0\x38\x2f\xa0\xee\x40\xe7\x45\x99\xab\x4e\x4a\xf4\x54\x59\xb9\x8a\x5a\x69\x13\x1d\xfa\x65\x89\xc7\x8e\x50\xb3\x2c\x00\x87\xd4\x29\xe9\x73\x97\xdb\xe7\xbb\x57\xea\x8b\xcb\x19\x2e\x5e\x70\x37\xf3\x53\x08\xa7\x32\xc4\xf9\xed\xea\xf3\x70\x6d\xa4\x8c\x2f\x5f\xdb\x01\x2a\x36\x02\x70\xf0\xcc\xd7\xea\x2f\x12\x17\x26\xd1\x8c\x8a\x86\xcd\x73\xef\x56\x54\xe3\x9f\x44\x1e\x75\xc6\xd5\xd4\x99\x8c\x87\x1b\xdd\x5a\x27\xa1\x79\xd0\x0a\x18\xc4\xc1\x33\x5f\xc5\xd1\x4e\xb1\x5f\x01\x03\x66\x33\x1e\x81\xdd\x9b\x46\x67\xbe\xa2\xb2\xec\xac\xd0\x66\x12\xf5\x0d\x0e\xaa\x11\xff\xea\x18\xe8\x2c\x14\x88\x83\xff\xbd\x17\xa8\x1b\xea\x9e\x07\x05\x25\x2a\x92\x7f\xa1\xc4\x5c\xe9\x91\xf1\x9e\xd5\xc9\xe6\x64\x61\x1f\x77\xb2\xf4\x21\xd2\x1d\xf6\x68\x47\x18\x61\x10\x07\xd5\x08\xff\xb3\x11\x06\xbd\xd0\xa7\x96\x89\x37\x49\xdf\xda\x2f\x7c\x76\x5e\xe9\x68\xae\x7b\x33\xf9\x4d\x1e\xf5\x8a\x49\x64\xd8\x28\x8e\x70\x14\xa3\x66\xcf\x60\x9f\x06\xd4\x28\x09\xc4\x21\x1d\x89\x7c\x4b\xe9\x95\xc8\x27\xb8\xde\x43\x7d\xe2\x26\xf1\x66\xa1\x38\x83\x41\xff\x71\xd4\x03\x2d\xdc\xb4\xa4\x79\xef\xbb\x6e\x97\xa0\xab\x99\x41\x1c\xfc\x91\xaa\x2f\x50\x98\x94\x2b\xeb\x63\x3d\x76\x28\xbb\x4d\x76\x31\xfd\xbb\xe9\x72\xe1\xd3\x4b\x58\x0a\xae\xc3\x9d\x26\x28\xd7\x08\x0b\xc4\xa1\x63\x76\x00\x0e\x2e\x81\x9c\xf2\x25\xe3\xdf\xfb\x37\x05\x02\xc2\xf8\x22\xd5\x1e\x75\xaa\x27\xcd\xe4\xf7\x91\xf1\x3e\xbf\xbc\xea\x34\x7b\xc7\x99\x40\xfc\x0e\x22\x2e\x88\x83\xff\xbd\x12\x69\x96\x31\xa5\xd8\x57\xbf\xcc\xd7\x4e\x8d\x7e\xd3\x9b\xb2\x1b\xa3\xc5\x09\xd8\xbf\x24\x36\x5b\xe8\x52\xda\xe0\x28\xad\xdc\x81\x58\xfc\x80\x38\xa8\x36\x10\x60\x84\x41\xb3\xeb\x69\x1a\x18\xb1\x10\xa0\x39\x27\x2b\x5d\x3c\x41\xb6\xbe\x77\x39\x47\xcb\x91\x3b\x27\xcf\xef\xd3\xea\xc3\x00\x2e\xf6\x38\x5f\x0d\xff\x62\x4b\xc4\xd8\x41\x1c\x5c\x03\x53\x5d\x7b\x0f\xad\x30\x9e\x70\x3a\xd5\xe9\xf9\xcc\x6b\x38\x13\xe6\x7c\x1b\x12\xb8\x89\xf6\xf1\xde\x54\x81\xb6\xca\x4d\xb9\xe5\x32\x44\x5c\x10\x07\x7f\xa6\x2e\x4c\x8f\x6a\x93\x68\xec\xe8\xfa\xd8\xb0\xc6\x42\x32\xad\xf5\x5a\x3a\xb3\x67\xd7\xc5\xfb\x1e\x35\xc6\x5e\xf6\xbe\xa4\x6e\x16\x8b\x88\x0b\xe2\xe0\x1a\x40\xcf\x57\x66\x17\x18\xfa\xf1\xf0\xe2\xeb\x3a\x8f\x06\xb9\xcb\x61\xf4\xf2\x0c\x21\x16\x37\x6e\xb6\xb9\xd4\xdd\xa0\x27\x65\x4a\x13\x44\xc4\x05\x71\xf0\xbf\xf7\xfb\x27\xe3\xc2\x23\xe9\x83\x1b\xaf\x35\xa9\xf3\x3e\x5e\x66\xa7\x6a\xb6\xdc\xfe\x4e\xf5\xe7\xfb\x02\xc1\xa6\x52\xa6\xa3\xb7\x07\x74\x34\x1a\xc4\x41\xb5\x81\x00\x23\x0c\x4a\x75\xa7\x7e\x10\x73\x94\x54\x58\x9e\xe4\x9d\xb5\x39\x27\xb5\x96\xd3\xd9\xf7\x62\x6d\x35\x58\xd7\xb7\xeb\x3c\x15\x7a\x78\x06\xfd\xab\x61\x7c\xa8\x6f\x22\x88\x43\xba\x47\xf8\x06\x0b\xae\x3a\x45\x7f\x46\x30\xd5\xaa\x81\x98\x9c\xc7\x4d\xef\xca\x14\x3f\x93\xb7\xa6\x8d\xae\x15\x62\x4f\x6f\x57\x2c\x61\x43\x1d\x78\x01\x1c\xfc\x99\x92\x37\xa4\xce\x29\xf8\x0d\x12\x48\x88\xa4\x57\xd8\x55\x8e\x64\x50\x0a\xa6\xb0\xd6\xd0\x25\xa7\x13\xd9\x87\xbe\x33\xa7\xee\xfc\x83\x88\x0b\xe2\xe0\x1a\xb8\x7d\xe5\x4e\xdc\x74\xc2\x4c\xaa\x38\x1f\xa9\x71\xd8\xa1\xb2\xb8\xfc\xad\x81\x7c\x7d\x63\xd9\xae\x93\x0f\x71\x41\x25\xd3\x4f\xa1\x0f\x83\x20\x0e\xfe\xf7\xfa\x5a\x2b\x84\x7b\x7e\x64\xa1\xcb\x55\xe1\xc1\x99\x91\x69\x08\xd8\x36\xcc\xc0\x89\xc2\x41\xe9\x6b\x76\xf1\xb2\xa2\xe9\xe0\x90\x45\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\xd6\x1d\xa7\x69\x20\xe9\x0b\xbf\x7c\xa8\xee\x3e\xb5\x5a\x9c\x48\xc5\x87\x90\x16\x1d\xb2\x52\x34\xce\x31\x42\xe3\xcd\x57\x2b\x13\xc3\x83\x77\xbe\x41\xbd\x02\x40\x1c\x5c\x03\xe5\x38\x86\xa8\x8a\xcc\xb4\xed\x78\xf3\x54\xe2\xe5\x47\x58\xbf\xfc\x29\xa6\xeb\xe2\xd0\x3c\x64\x57\x0c\xdf\xb8\xe3\xbe\x35\x84\x0c\x36\x88\x83\x3f\xd3\x48\xc2\x5e\x45\x3a\x16\xb3\x7e\x6b\xa7\x7e\x0f\x94\xa3\x4a\x55\x54\x8a\x7b\x7c\xe7\x2c\x18\xeb\xf6\x83\xbb\x03\x29\x9e\xce\x43\xfd\x2d\x40\x1c\x5c\x03\xb4\x4c\xc2\x81\x66\xfd\xab\xd6\x7f\xa4\xbc\x99\x2c\x7f\x4c\xa4\x74\xb2\x5d\xd1\xcd\xca\x92\xd5\x7b\x5d\x8f\xe5\xb3\x30\xdf\x0b\xe5\x18\x10\x07\xff\x7b\xf9\xe9\xf9\x84\x39\xf6\xa8\xc4\x3d\x58\x48\xdb\x9e\xf5\xdf\xb6\x16\xfe\x51\x32\xcb\x74\xae\xad\xea\xc3\x9d\x4d\x66\x42\xdb\x65\xe8\x06\x01\x10\x07\xcd\x03\x00\x23\x0c\x32\x51\xa7\x1b\x61\x53\x2c\xfa\x2b\x7d\xbd\x35\xaf\x87\xfa\x2f\x56\x37\xe2\x10\x12\x25\x37\x3d\xec\xcf\x42\xaf\x5f\xae\x2c\x8f\x53\x94\x19\x7b\x78\x1d\x61\x2a\x41\x1c\xb2\x11\xf6\x0c\xa2\x2e\xb4\xf0\x76\xa0\xe2\x90\xf7\x7d\xf2\xfb\xdb\xb0\x2f\xb3\xfd\xe1\x3b\xf4\xfc\x35\x65\x87\x89\xef\x89\x92\x5a\x55\xbf\x11\x91\x41\x1c\xb2\x11\x2e\x5d\x55\x8e\x42\x89\x8f\x56\xec\x8e\xbe\xe4\xd0\x61\xc8\x94\x1b\xee\x97\x51\x86\xf1\xad\xf5\x9b\x79\xec\xf7\x7e\xfb\x50\xd5\x1f\x88\xc8\x20\x2e\x40\x8e\x16\xf6\x34\xfe\xf5\x3d\xc2\x54\xeb\xc7\x2d\xa3\x5a\xe7\xbe\x24\x3b\x2b\xaf\xee\xa9\xbd\x94\x29\xf6\xde\xbb\x72\x74\x91\x80\x26\xfa\x22\xc9\x4b\x03\x92\xd5\xb9\xbf\x8d\x30\xcd\x05\x27\x63\x55\x2c\xc3\xba\x20\x9e\x24\xbb\xb7\x3f\xe4\x08\x6f\x0a\x7e\xcb\x74\x7b\x23\xa5\xed\xff\x04\x25\x28\xf6\xd2\x0f\xaf\xbf\xd0\xaf\x42\xef\xe3\x5e\xc9\x57\xa7\x39\x9e\x17\x08\xea\x2f\x32\x9e\x58\x66\xe2\x7c\x71\x33\x6f\x45\x99\x6c\x98\x4d\xb8\x73\xc2\x4a\xef\xbf\x66\x84\x41\x43\xfb\xbb\x46\x58\x05\x6e\x96\xb4\x31\x37\x98\x93\xbb\x9f\x97\xbe\x47\xfb\x16\xb8\xae\x6d\x3c\xeb\xc6\x19\x95\xbb\x68\xd4\x57\xdf\x2a\xb6\xed\x66\xbb\xf9\x62\xed\x4c\x36\x2b\x91\x8d\x30\xa7\x35\xd6\x10\x93\x04\xaf\x66\xab\x5b\xd2\xe5\xb2\x13\xb9\xcd\xee\x85\x3f\x04\x58\xab\x41\x3d\xf5\xec\x47\xe7\x92\xc4\x2d\xd1\xce\x64\x6b\x56\x0b\xe9\x67\x49\x19\x4a\x70\x0b\x63\x46\x87\x13\x99\x7d\xcc\xa3\x7f\xac\xfa\xb7\x0f\x8b\x09\x10\xbe\x62\xb0\xaa\xac\x45\x8d\x2b\x09\xe8\xce\x39\x93\xd1\x22\x1b\xe1\x17\xb2\xee\xe3\x9d\x8c\x77\x86\x3c\x44\x51\x3e\xcd\x7e\x63\xa2\xc1\xfc\xed\xd1\xdf\x75\xa1\x4f\x06\x7d\x21\xc9\x85\x5e\x3f\x0a\xe5\x4c\x46\xeb\x8a\x7c\x7d\x71\x2a\x6a\x5c\xde\xd7\xab\x5c\xa2\xdc\x86\x23\xbf\x7e\x7f\x10\xca\xea\x65\x4a\x43\x31\xc9\xe7\xab\xfd\x54\xaf\x33\x53\xc2\xa4\x7e\x66\x46\x18\x24\xa2\xd3\x32\x9f\x49\x1e\xa6\xfe\x78\xad\xfe\xbb\xd6\x37\x99\x3e\x62\xdc\x04\xce\x95\x0b\xaa\x45\x0a\x7d\xb2\x4f\x1c\xe6\xea\x54\x31\xac\x89\x3f\x20\x66\x7c\x10\x07\xcf\x7c\xdb\xbf\x32\x3c\x1e\x77\x3f\x22\xcb\xf8\x5a\x30\x5d\xba\x55\x18\x91\xdc\x3b\x4b\xc5\xf3\xe0\xda\xf2\xad\x8a\xb2\x4d\xd5\x8b\x5d\xd0\xcd\xfc\x20\x0e\x9e\x49\x9a\x3b\xee\x67\x62\xb2\xa3\x97\x48\xd5\xe0\xc5\x33\x05\xa2\xcd\x1e\x96\x29\x0c\xc9\x88\x10\x79\xf8\xcc\xb2\xf2\x87\x92\x17\x41\x45\x4c\x20\x0e\x9e\xf9\x58\x6c\x51\x7d\xd1\xa2\x98\x7b\xf2\xc6\x87\x25\xcc\x9d\x17\xd5\x3f\x8b\xde\x25\x25\xf9\x64\xc5\xd8\xf2\xc6\xaa\xe6\x63\x68\x5b\x1c\xb4\x1d\x02\xe0\x02\x64\x50\x7c\xff\x8e\x3b\x4e\x1d\x33\xbc\x71\xa7\xb3\x45\x70\x76\x7d\x34\x8d\x30\x99\x8e\x8b\xa6\x82\xad\xfe\xd6\x4e\x5c\x4d\x5b\x56\xe1\x61\xff\xdd\x30\x84\x11\x06\x71\x50\x8d\xb0\xca\x3f\x2e\x7e\x40\x2f\xf4\x69\x12\x10\xa9\x77\x1e\x09\xb9\xdc\xb3\x32\x3b\x36\x42\x75\x59\xe3\xf8\x28\x75\x18\xd5\x42\xfc\xe5\x51\xd5\xea\xfc\x94\xe1\x95\x6e\xa3\x02\xc4\xd0\x41\x1c\x5c\x02\xd7\xf4\xd1\xf5\xc9\xde\x0a\x4c\xf6\x1c\x2b\x16\x07\xba\x69\xa9\x13\x7a\xed\x6d\x50\x5f\xa8\xf4\x7b\xc0\x5e\x2e\x39\x9a\x39\x0e\x3d\x52\x10\x07\x97\xc0\x10\x55\xd1\x85\x4a\x3e\x45\x5d\xb4\xa3\x66\xca\xa0\x1e\x35\xf5\x09\x72\x81\xc4\x56\xfd\x25\xcd\xb2\x50\xf5\x88\x5b\x35\x86\x6e\x88\xb8\x20\x0e\x2e\x01\x36\xb2\x6f\xf7\x70\x17\xa4\xc9\x79\x6f\x4d\xa1\xdd\x88\x4f\x0c\xe9\x0d\xb0\xfe\x55\x9e\x1f\x5b\xe4\x4b\x90\xef\xac\xae\x5a\x01\x5d\x21\x04\xe2\xe0\x12\x48\xcf\x2b\x3a\x57\x78\x6f\xb9\x08\xff\xcb\xb6\x7f\x31\x77\x7a\xe2\x87\x31\x3a\x75\x2b\xe2\xbc\xf4\xae\xda\x19\x67\x94\xf7\x4f\xde\x22\x16\x3f\x20\x0e\xaa\x0d\x04\x18\x61\xd0\xec\x7a\x9a\x06\x0c\x3f\x8c\x0b\xa8\x3c\x29\x17\xdd\xd6\x21\xb6\x78\xe6\x7b\xf2\x1a\x4f\xf2\x9e\x87\xe6\x41\x01\xf7\xb3\x0c\xe2\x2e\xee\x91\x72\xa8\x49\x14\x88\x83\x6b\x60\xf7\x31\x89\x10\x65\xc5\x09\x6e\xc7\xdd\x6b\x02\xa3\x0f\xd6\x85\xb2\x8d\x2b\x98\xbb\x85\x45\x19\x07\xf9\x75\xf9\x27\xd6\x71\xc7\x10\x71\x41\x1c\x5c\x03\x7d\x2d\xd2\xdb\xb1\x27\x36\xa9\x64\x71\x4b\xa1\xd3\x02\x23\xc6\xe7\x83\x8e\xda\x24\xe2\xd0\x03\xf8\xc5\x3a\x6e\x8d\xfa\xb4\x78\x22\xe2\x82\x38\xb8\x06\x30\x35\xe9\xa5\x6d\xf4\x1d\x3f\x85\xd4\xbc\x08\xef\x90\x8d\xd6\xa0\xc6\x88\x69\xb4\x9e\xa7\xd1\x61\x75\x4d\x09\x42\xf3\xc1\x86\x34\x0b\xe2\xe0\x1a\x78\x24\x57\x64\xc2\x82\x65\x9d\xb6\x1c\x18\x7d\xe7\xa3\x56\x0b\xff\xbe\x9c\x9c\x86\x08\xbd\xd9\x3d\xc2\xc0\xcd\x2c\x3a\xc5\xe7\x1a\x08\x0d\x80\x38\xa8\x36\x50\xeb\x9f\x35\x00\x4a\x75\xa7\x69\xa0\x5a\xf9\x9c\x94\x8e\x53\xa6\x84\xd4\x56\xfc\x71\xf1\x70\x9e\x37\xb7\x6b\xe6\xa7\xed\x76\x46\x77\x2c\x7b\x7f\xdd\xbe\x34\x53\xa8\xee\x1a\xc4\x21\x7d\x0c\x09\x3a\xef\x5a\xa5\xb2\xd6\x95\x31\xb4\x62\xbb\x74\x5e\xf2\xe3\xca\x3b\x74\xf9\x68\xfa\x6f\x7f\x64\xb6\xa8\x26\xfe\x04\xea\x09\x41\x1f\x43\x00\x1c\x5c\x03\xb8\x38\x0f\x54\x59\x13\x1a\xd1\xef\x79\x04\x1e\xe4\x6e\x5d\x91\xbf\x15\x2f\xbb\xf1\x91\xd8\x03\x07\x8b\x60\x2c\xe4\xa7\xe3\x1c\x74\xdc\x16\xc4\xc1\x35\xe0\x25\x74\xdd\x6f\x67\x3b\x80\x37\xae\x81\x73\x90\x57\x80\x98\x8e\x27\x7d\x73\x1d\x95\x1b\xbd\x67\xf2\x6d\x78\xdd\x32\xe6\x33\xa8\xdb\x3d\x88\x83\x6b\x00\x7f\x7c\xfd\x69\xf6\x42\x4f\x39\x6e\x72\x97\x62\xb5\xd6\x2b\x2b\x5a\x0a\x12\x4f\x0d\xb6\xc2\xb5\xaf\xf6\xaa\x1c\x62\xdd\x92\x07\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\x34\x0d\xcc\x2c\x3e\x68\x5b\x25\xd3\x96\x6c\xc3\xde\x67\xd9\x2a\x78\x1d\x40\x40\x67\x46\xd4\x79\x4b\x4a\xb9\xc8\x2a\x59\x3b\x6e\xad\x07\x9a\x5b\x41\x1c\x5c\x03\x0d\x11\x0b\xb9\x39\x5e\x3c\x26\x09\xf8\x17\x2e\x8a\x89\xb4\x79\xed\xfa\xde\xa7\xc2\xd4\xd1\xad\xac\x4f\x1a\xf2\x36\x5d\x4e\x83\xd2\x36\x88\x83\x6b\xa0\x60\x55\x2f\x87\x4b\xfa\x64\x98\xee\xe0\x8f\xd1\x65\x56\x32\x8c\x4e\x56\x3b\x29\xf2\xa7\xe3\xb6\x14\xf7\xcd\xf9\x2d\xe4\x16\x25\xa1\x8f\xb8\x00\x0e\xae\x01\x0a\x94\x03\xf1\xb0\x12\x9b\x17\x58\x02\xdf\x69\xaf\xd3\xff\x92\x1c\x4e\xa9\xfb\x6c\x90\x7c\x53\x91\x33\x3b\x4d\xe0\x21\x27\xc6\x35\x44\x5c\x10\x07\xd7\xc0\xa1\x6e\x04\xb1\xfa\x5b\x55\x4a\x8b\xd2\xf4\xfc\x9f\x0a\x27\x09\x7f\xe2\x83\xb1\x2d\x48\xea\xed\x5d\x3d\x73\x9e\x1c\xbe\x3b\x08\x46\x68\x00\xc4\x41\xf3\x80\xeb\x3f\x1b\x61\x90\x89\x3a\xdd\x08\xd3\x29\xdb\xbd\x6d\x7b\xab\x27\xb1\xbc\xe6\xbf\xff\xe6\x59\xaa\x55\x6d\xc7\xa4\xf1\xb6\x3f\xcf\xfb\x60\x26\x13\x81\x87\x3d\x84\x2a\x08\x53\x09\xe2\x90\x8d\xb0\xce\xd7\x94\x73\xda\xf5\xc4\x5b\x74\xdb\x38\x6d\x36\x27\x6a\x9e\x32\x2d\xd2\x29\x75\x9a\x41\xb7\x37\x08\x77\x99\xf8\xbc\x9e\xc4\x23\x22\x83\x38\x64\x23\xec\xb9\x97\xff\x3e\x90\xf7\xfb\xda\x8d\xb1\xa3\x57\xcf\x45\x92\x89\xb9\x58\xdc\xd7\x1e\x3a\x68\x27\x1d\x93\xfa\xb0\x87\x1c\x5c\x6a\x82\x2c\x36\x80\x0b\x90\xf3\x85\x3d\x8d\x7f\x7d\x8f\xb0\x29\x8d\xcc\x1a\x1f\x0f\x27\xcf\xae\x54\x81\xc6\xfe\xcd\x77\xec\xe8\x7d\xe1\x35\xec\xb2\x6f\x82\xab\xd2\xc6\x5f\x39\x3f\x8b\xda\xfe\xdb\x08\x17\x45\x45\x7f\x9e\xb9\xc6\x5e\xc8\xff\xf0\x9e\x91\x73\x4a\x21\xa6\xc4\xe1\xc8\xb0\x84\x0c\xd3\x2a\x6f\xd9\x10\x45\x21\xb9\xe2\xdf\x65\x9a\x37\x54\x25\x7d\xb6\xb4\x78\x69\x6c\x72\x7f\x2b\xb0\xe3\x59\xde\xfa\x90\xff\xc7\xc8\x3f\x86\x0c\xd5\xed\xe7\x46\x7a\xe3\x6c\x47\xcb\x7f\xcd\x08\x83\x86\xf6\x77\x8d\x30\x92\x11\x36\x69\x54\xcd\x39\xe2\x4f\x4d\xf9\xf4\x5b\x4f\x91\x77\x8b\x0c\xc5\x83\xa5\x6b\xe9\xcb\x53\xb4\x1f\x28\xe4\xd7\xc4\xc8\x31\xeb\x1f\x9c\xc9\x66\xe5\x29\x3b\xc2\x4f\x5a\x78\xfb\xe9\xc2\x5f\x60\xc5\x9a\x6f\x6a\xed\x7e\x55\xde\x99\x5e\x9e\x92\xb1\xe2\x20\x7e\x6f\x1a\xee\xae\x9e\xd0\x38\x70\x26\x5b\xb3\xc8\x46\x38\x4d\x48\x87\x1a\xad\xf1\xe5\x72\xa3\x50\x20\x76\xc5\x33\x21\xb7\x55\x26\x02\x2d\xba\x20\x27\xba\x3b\x73\xf9\x2a\xa4\xaa\xfd\x43\x67\x32\x5a\x64\x23\x8c\x4e\x13\xbe\x63\x7e\xb7\xcb\x21\x3c\xb3\xc3\xc4\x57\x73\xd6\x56\xec\xe4\xaa\xeb\xda\xb4\xa5\x7b\x1b\xfb\x3a\xa6\xe7\x7c\xfe\xd7\x33\x19\x2d\xb2\x11\x76\x68\xef\xa1\xad\xc5\x3e\xee\x6e\xb5\x70\x0c\x57\x0b\x32\xe4\x74\xdc\x27\x50\xf8\xf3\xe3\xc2\x78\x0c\x21\xbf\xf7\xdc\x75\xf6\xc3\x33\x33\xc2\x20\x11\x9d\x96\xf9\x7e\x6f\x9a\x19\xbf\xbb\x4a\x42\xc3\xb6\xdc\x26\xa7\x6a\x69\xf5\x8a\xe8\xe8\x7b\x43\x80\x9e\xea\x10\x16\x96\x95\x9e\x57\xc7\x80\x07\x62\xc6\x07\x71\xf0\xcc\xa7\xa1\x5c\xc5\xcf\xfb\xd1\x46\x48\xd1\x4b\xce\xad\x24\x69\x57\x53\xdc\x3e\x11\x75\x50\x04\x63\x59\xcd\xdd\x73\xc3\x95\x73\xc3\x10\x3a\xbf\x0a\xe0\x90\x0a\x44\xa9\x89\x35\x0d\x6d\xee\x73\xe7\x99\x17\x8a\x4f\x4f\x29\x56\x1b\x7c\x19\xf8\xf3\xb0\x7e\xa5\x5b\x4a\xe7\x20\x27\xf2\xd6\x11\x54\xd0\x0a\xe2\xe0\x17\xfc\xbd\x6f\x6c\xd2\xde\xbe\xb0\x4d\x2c\xad\xe1\x8d\xff\xf3\xba\x62\x61\x36\xa3\x59\x8c\x2a\xf5\x5a\xa2\xe2\x2f\x5e\xe5\x5d\x31\x4f\xe8\x39\x80\x38\x78\xfb\x49\x94\xe9\x00\x9a\xf4\x0b\x5f\xb2\x2f\x1d\x50\x4f\x5c\x8a\xfe\x45\x7b\xf8\xc4\x6f\x7e\xe2\x9a\x16\xed\xe3\xa6\x92\x0f\x68\x9e\x46\x86\x08\x23\x0c\xe2\xa0\x1a\xe1\x7f\x36\xc2\xa0\x17\xfa\x34\x09\x18\x5d\xf2\xa3\x63\x17\x5b\xbb\xb1\xac\xf8\x6c\xee\xf3\x17\xbf\xa2\xb7\xe1\x63\x57\x08\xed\x3f\x75\xde\x8a\x1f\xc3\xe0\x16\x6b\x83\x6a\x03\x41\x1c\x5c\x02\xaf\xd3\x6c\x35\xff\x14\x69\x1a\xfa\x4d\xa6\x7a\x12\xcf\x60\x72\xc6\x4a\x24\x6b\xe6\x94\x7f\xbd\x7a\x8b\xc8\xb3\xca\xea\xc2\x4f\xa8\x46\x18\xc4\xc1\x25\x30\xe6\xe6\xa3\xbb\x3a\x34\x49\x79\x57\xf0\xae\xe2\xcd\x1b\xfa\x65\x7e\xb9\xd3\xed\x74\x5f\xaf\x89\x4a\x37\x39\xec\x13\xac\xe2\x72\x23\xe2\x82\x38\xb8\x04\xd8\x59\xd2\x39\xe8\x70\x45\xec\x6f\xce\x4c\x18\xae\x33\x8e\x3c\x50\x54\x2e\x26\xd8\xbb\x28\xc5\x9b\xd0\xb5\x54\xb9\xfc\x6b\x01\xba\x3a\x07\xc4\xc1\x25\x90\x9d\x17\xe9\xfe\xd3\x62\xa8\x3b\xfc\x58\x6f\x44\x9b\xf9\xb6\x68\xc1\x66\x40\x20\xf3\x5b\x19\x75\x49\x2f\xb1\xd2\x6f\xf1\x03\x89\x88\xc5\x0f\x88\x83\x6a\x03\x01\x46\x18\x34\xbb\x9e\xa6\x01\x3e\x53\x85\x39\x11\x0f\x2e\xd9\xb8\x7b\x1b\x8f\x02\xe9\x8d\x4b\xcc\x79\x70\xdf\x54\xd1\xc6\x1c\x90\x64\x63\x3f\x7d\x5b\x24\x3b\x84\x18\x3b\x88\x83\x6b\xc0\xb3\x0f\x93\x6a\x54\x64\x63\xb1\xcb\xc4\xfa\xb7\x9b\x10\xb9\x2d\x4a\x7f\x15\xd5\xf7\xf5\x69\xd1\xe2\xc9\x38\x26\xce\x65\x23\x0e\xa8\xc9\x3b\x80\x83\x6b\x40\xe9\xb3\xf2\x1d\x2b\xe9\x5b\x98\xe2\xa1\xc7\x63\x9c\xd5\xbd\x22\xa5\x29\x97\x0a\xe7\x24\xef\x98\xb6\xd2\x7d\x31\xae\x96\xc9\xd2\x47\xc4\x05\x71\x70\x0d\xa4\xf2\x78\x61\x54\xfa\xd2\xe7\x35\x75\xf2\x0f\x79\xf8\x88\x44\xa9\xd9\xb9\xa2\xdf\x24\x50\x6d\x51\x65\x20\xee\xd6\xb5\xbc\x0f\xdd\xa5\x0b\xe2\xe0\x1a\xa8\xb0\xcf\x13\xdb\xdc\x22\x63\xa3\x29\xd0\x37\x5e\x27\xb2\x4e\xbe\x2a\x15\x1a\xec\xcb\x37\xd5\x1a\x72\x48\x43\x78\xf0\x8e\x3d\x10\xa1\x01\x10\x07\xd5\x06\x02\x8c\x30\x28\xd5\x9d\xa6\x81\x86\x48\x22\x11\x2f\x02\x6f\xaa\x83\x1f\xd5\xf7\x2c\x1e\xfc\x2a\x88\xc7\x22\xf3\x0c\xc1\xc0\x10\xaf\x63\x8c\xb7\xbe\xa2\x95\x08\x75\x63\x07\x71\x48\x0d\xd3\x7c\x8d\xa3\xf9\xd2\x9f\xfc\x3a\x58\xbe\x9a\xc3\xc8\x7e\xf3\x75\x5c\x8e\x57\x33\x87\x80\x95\x5a\xc5\xde\xd7\xfb\x19\xd7\x04\x57\xa0\x86\x69\x00\x0e\xae\x01\x54\x3a\xd1\x3e\x4b\xf9\x3c\x0e\x73\x74\xd4\xc7\xb5\xa6\xf7\xe6\x2b\xcc\xae\x62\xbf\xb2\x6c\xc0\xbc\x2d\x38\xa6\x18\x80\x63\x46\x0f\x35\x36\x03\x70\x70\x0d\x44\xf7\x88\x3f\xf8\xc5\x7f\xf9\x7c\xde\x64\xd5\xb3\xd1\x28\x65\x56\x4d\x7b\x94\x77\x92\x3f\xde\x70\x1e\xc7\x14\xf3\xd1\xa5\xec\x43\x06\x1b\xc4\xc1\x35\xe0\x64\xc5\x6a\xe0\x52\x33\xeb\x7f\xee\x43\x76\x55\xea\xfe\x93\xf8\x8c\x92\x67\x69\x57\x75\xf2\x8b\x71\x0d\x59\x50\x2f\xe0\xb1\xee\x21\x34\x00\xe2\xa0\x79\x00\x60\x84\x41\xeb\x8e\xd3\x34\xe0\x86\xcd\x68\xe7\x5f\xe0\x37\xfd\x2c\x71\x35\x5a\x7f\xc5\xe6\x78\x8e\x5b\xfe\xde\x66\x8a\xf8\x4f\xb3\x8f\x77\x8a\x84\xbd\x27\x97\xa0\xd6\x1e\x00\x0e\xae\x01\xaf\x49\xd6\x8c\xaf\x98\x2a\xb2\xfc\xed\xf8\x5d\xb2\x18\x3c\x81\x99\x7a\x16\xd4\xce\xb1\xe7\x99\xb5\x31\xb6\x7e\x4d\x6d\x0a\x40\x27\x38\x40\x1c\x5c\x03\x4f\x3b\x9e\xd2\x07\xf8\x14\x35\xe4\x4c\x7f\x2f\xbf\xc6\xfd\xd8\xa6\x04\xef\xea\xc0\x70\xea\xcc\x95\x3c\x71\x09\x9d\x13\x05\x61\xe8\x72\x0a\x10\x07\xd7\x80\x63\x84\xd8\x52\xd6\x07\x19\xa3\x45\xbf\xeb\x1a\x8a\x27\x82\xe4\xbf\xbf\xb0\x9e\x28\x93\x8f\xa3\x50\x26\x7d\xde\x6a\xbf\x41\x29\x86\x88\x0b\xe2\xe0\x1a\xb8\x5f\x86\x6d\xc9\x76\xf2\xee\x45\xe2\x65\xee\xce\x2f\x83\x43\xe2\x97\xe2\x1a\xc5\xe2\x1d\x2f\xa1\xf7\x10\xc4\x84\x50\x6c\x7e\xfb\x8e\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\x99\xa8\xd3\x8d\xb0\xd5\xe3\xa9\x80\xf0\x5e\xe2\x4b\xd7\xec\x84\xdd\x43\x3e\x5f\xd7\x6f\xd5\x2d\xca\x50\xb0\xea\xcb\xdd\x3c\x6f\xca\x2a\x22\x9f\xfc\x1a\x61\x2a\x41\x1c\xb2\x11\x6e\x26\x7f\xf7\xe8\x5b\xd7\x7a\xba\x30\x5e\xb7\xad\x93\xcb\x5d\x17\x06\x4a\xc1\xb2\x46\x9a\xa7\xa5\xad\xdc\x24\x03\xfa\xa1\xa9\x8e\x88\xc8\x20\x0e\xd9\x08\x97\xdb\xeb\xde\x19\x14\xd9\xe7\xca\x2b\x5e\xa0\x50\xb7\x66\x37\x98\xc2\xd8\xbd\x41\x2d\x35\xc4\xaf\x51\xcc\x10\x29\xd3\x38\x2d\x8c\x88\x0c\xe2\x02\xe4\x50\x50\xff\x37\xf2\xbf\xbe\x47\xd8\xcc\x41\xea\x1b\x81\xa5\x68\xc4\xe3\x54\x7c\x12\x12\xff\x38\xb9\x2a\x17\xe9\x52\xdb\xde\x7d\xa7\x63\x42\x97\x19\xe7\x71\x09\xe1\xbf\x8d\xf0\xaf\x60\x75\x91\x00\xbd\xa6\xbe\xac\xd9\xa8\x21\x7f\xfa\xdd\x20\xde\xb4\xfb\x9b\x39\x2e\x5d\x13\x9f\x1a\x04\xc7\x87\x50\x15\x94\xff\x3e\x51\x4a\xfa\x23\xc6\xf2\x9a\xaf\x74\xea\xa0\xd5\xed\xea\x1d\xb3\x6b\x72\x5b\x8f\x94\x96\xec\xbc\xd9\x46\xda\x43\x7a\x9a\xf5\xb6\x68\xfe\x6b\x46\x18\x34\xb4\xbf\x6b\x84\x91\x8c\x70\xf4\xc1\x81\xe8\x7a\xc1\xb9\x9f\x5a\x76\x31\x19\x79\x05\x5f\xf8\x45\x33\xf9\x6a\x73\xf0\x4a\x0c\xe3\x37\x87\x48\x28\x73\x29\x6c\xcf\x64\xb3\x52\x00\xb9\x7d\xf3\xe2\x1f\x02\xb2\x45\xea\xd2\xdf\x96\x9a\xb4\x1f\xf7\x2f\xca\xdf\xf0\xbf\x99\x59\x61\x90\xb8\xd2\xe8\x1a\x40\x9f\x3d\x42\xef\x71\x26\x5b\xb3\xc8\x46\xd8\xea\xb6\x95\x56\x02\x2a\x65\x59\x43\x34\xaf\x1b\xc7\xc5\x9b\xf7\xd9\x1d\x05\x9b\xa6\x5b\x22\x1f\x4e\xea\xe4\x19\x86\x08\x67\x6c\x9f\xc9\x68\x0d\x91\x7e\xb6\x58\x70\xbc\x67\x87\xf2\xa8\x81\x35\xb3\xf4\x7b\x75\x92\xc7\xea\x81\xa7\xaf\xc4\xcb\x29\x59\xb5\x07\xab\xfe\xe3\x4b\xb6\x42\x11\x67\x32\x5a\x64\x23\x3c\x79\x65\xa3\xfa\xa9\x15\xdd\x37\xbc\x78\x25\x97\xdb\xd7\x3e\xa7\x54\x1b\xbe\x74\x32\x6e\x3c\x36\x46\xdb\xc9\xc3\xae\x36\x4d\xd5\x3a\x33\x23\x0c\x12\xd1\x69\x99\xef\xb6\x8a\xd8\x21\xd1\x7d\x74\x54\x06\x94\x9f\xe7\xe9\x53\x35\x4c\xf9\xf2\xd2\xb1\xcf\xfd\x64\xba\xc9\x37\x4b\xbe\x50\x68\xb9\x0c\x5d\x9a\x08\xe2\xe0\x99\x6f\x06\x47\x88\x43\x52\x83\x03\xed\x84\x93\xb4\xbb\x48\x3d\xeb\x81\xa9\xd6\x0f\xe3\x82\x92\xbe\x56\x89\xcd\xa4\x13\xd9\x77\x03\x50\x47\x23\x10\x07\xcf\x7c\xd1\x1a\xa1\x73\x8e\x5a\x76\x4c\x2b\x29\xef\x7c\xd8\x5e\xaa\x7c\x1c\x19\x58\xee\xd9\xd3\x77\xe6\xb3\xa1\x7e\xf1\x41\x75\x51\x03\x3a\xbb\x08\xe2\xe0\x99\x2f\xfb\x30\xf1\xee\xe5\xc8\x7e\x73\xd1\x87\x1f\xb7\xc6\xf8\xf0\x1d\xdf\x1c\xf4\xe0\xea\x14\x9b\xee\xe8\xed\x0a\x63\x8f\xb8\x66\x41\x05\xa2\x20\x2e\x40\x46\xea\x7f\x6b\xb0\xbb\x13\xd0\x06\x6b\x72\xc6\x03\x08\xbf\x2e\x3f\xbd\xd8\x38\x9b\x84\xe9\x35\xbe\x77\xa7\xd1\xb8\x85\x76\x91\x9d\x5c\xd0\x5d\x1e\x61\x84\x41\x1c\x54\x23\xfc\xcf\x46\x18\xf4\x42\x9f\x26\x01\xfa\x72\xb1\xee\x7c\x0e\xed\x13\x2c\xac\x1d\x23\x71\x66\xd3\x15\xaf\xf9\xb0\x72\x2b\xfd\x89\xcb\xcf\xaf\x3d\xc1\x61\x96\x37\x83\xae\x37\x01\x71\x48\x4d\x72\xa6\x66\x29\xa8\xee\xac\xa1\x62\x47\x0e\xbf\xb1\xa4\x32\x68\x8a\x13\xa5\x3e\xd0\x92\x62\xf1\xe2\x34\x7b\xe9\xe3\xa2\xd2\xc6\x03\x35\xc9\x01\x70\x48\xbb\x81\x56\x2c\x6a\xf1\x3b\x7c\x62\x9e\x09\x45\x9b\x38\x7b\x16\x73\xba\xa2\x92\x8f\x42\x8a\xce\x3b\x32\xd1\x27\x68\x08\x1a\xef\xd9\x42\xbb\x81\x00\x0e\x2e\x01\x37\x89\xc4\xe4\xc2\x6e\x96\xd0\xb9\xbb\xdd\xb5\x5c\x2a\xa4\x96\xa5\x4d\x4a\xb7\xc8\xd2\x34\x8e\xc5\x3f\x8f\x2e\x24\xb8\xfa\x42\x06\x1b\xc4\xc1\x25\x40\xa8\x5c\x93\x50\x73\x98\x61\xa3\xaa\xbc\x33\x6e\x2b\x75\xf0\xb1\xb3\x51\x02\x2b\xea\xe5\x6d\x09\x8e\x4a\xc1\x3f\x3a\x29\x5d\x8c\x88\xc5\x0f\x88\x83\x6a\x03\x05\xfe\x79\x01\x0c\x9a\x5d\x4f\xd3\x00\x4f\x76\xbc\x8f\x49\x5a\x05\x63\xa6\xec\x49\x60\x65\x32\x9e\x48\xfe\x08\x93\x4f\xfe\x76\xc2\xc8\x9f\xdc\xfd\x81\x8f\x3a\xeb\xd0\x91\x48\x10\x87\x54\x27\x9e\x21\xa4\xf0\xa0\x3a\x9f\xc8\xce\x83\xc7\xc7\xa1\x6e\x10\x4b\x0a\xbb\xb4\xe3\xba\x97\x59\x70\x5f\x18\x6b\x8b\xe1\x5c\x2a\x23\x54\x27\x0e\xe0\xe0\x1a\x78\xb6\xb4\xac\xe5\x46\x79\xdd\xcd\xf3\xa4\x6a\x7e\x75\x4c\xfc\xc2\xb7\x46\x99\xb5\x9e\x96\x0a\x0c\xc6\x71\xf6\x49\x17\x7f\x52\xa8\x05\x01\x88\x83\x6b\xa0\xd7\x59\xea\x37\x6e\xba\x70\xc1\x98\x74\x24\x7f\xe8\xcc\xef\xa8\x45\x6e\x1f\xe1\xef\x8e\xb7\x45\xc7\xa7\xc7\xaa\x70\x1f\xc7\x93\x42\xb5\x8c\x00\x0e\xae\x81\x45\xd6\x62\xbf\x6c\xc3\xcb\x22\x26\x85\x7e\x2a\x81\x31\x91\x03\x4d\xad\x42\xdf\x27\xdd\xb1\x87\xc4\xcc\x09\x94\x9b\xba\x44\x23\x10\x1a\x00\x71\x50\x6d\x20\xc0\x08\x83\x52\xdd\x69\x1a\x60\x50\xfd\xde\x32\x25\x4f\x79\x7d\x3d\x6a\x61\x96\x35\x86\xbe\x41\xd3\xbe\xb5\x28\x31\xed\xde\x9b\x3b\x2a\x8b\xcd\xbc\xfb\x4a\xfd\x88\xb1\x83\x38\xb8\x06\xe6\x87\xc3\xce\xff\x91\x2c\x73\x0a\xec\xa6\x7b\xe3\x4d\x4b\x4f\x7f\x64\x9a\x51\x19\x59\xe8\x2b\x3f\xc6\x1b\x5b\x99\x9c\xa9\x44\x89\x88\x0b\xe2\xe0\x1a\xd0\x66\xc5\x60\x33\xfb\x78\x49\x8e\xaa\x7b\x6a\xea\xcb\x89\x7d\x97\xce\x61\xc1\xeb\x7b\xba\x77\xe8\x7d\x6f\x54\x3f\x95\xe7\x5f\x82\xea\x4e\x41\x1c\x5c\x03\x32\xee\x57\x53\xd7\xbc\xaf\x68\x84\x5c\x1f\xbe\x51\x61\x6b\xf4\xe7\x53\xd2\x52\xaa\xe2\xcd\x3d\x01\x97\x00\x26\x75\x0c\x4d\x1f\xe8\x68\x34\x88\x83\x6b\x40\xdd\x86\xe2\xfd\x39\x75\xd3\x99\xb1\x0a\xa1\xe6\x27\x92\x53\x54\xc6\xe6\xb4\x52\x07\xd8\xaa\x97\x0e\x1e\xd1\xc7\x3e\x8d\x7f\xe7\x82\xd0\x00\x88\x83\xe6\x01\xc3\x7f\xd6\x00\x68\xdd\x71\x9a\x06\x9e\xc8\xb7\x0e\xf2\x0f\x94\xab\x72\x5e\x4f\xe0\x17\xe7\x78\x55\x4e\xfb\x44\xf5\x73\x06\xe5\x45\x22\xe1\x9b\x65\x1f\x3a\xc2\x24\xa0\xce\xf9\x20\x0e\xae\x81\x39\xa5\x1f\x32\xe7\x4c\x17\x85\x34\xf3\xeb\xbd\x76\x4d\xea\xcd\x1e\x8e\xdf\x8f\xe4\x5b\x0f\x51\x17\x72\xec\x88\xc3\x6c\x26\x82\x3a\x87\x83\x38\xb8\x06\x7a\x86\x78\xf2\x96\x5a\x0c\xc8\x6d\x7c\x7f\x7f\x31\xe0\xff\x7a\x61\x07\xdd\xe6\x47\x87\x5f\xd8\x77\x2e\x34\x59\xb9\x54\x71\xad\x47\x88\xb8\x20\x0e\xae\x81\x4f\x16\x4d\x2e\x53\x09\x45\x6e\xe9\x61\x01\x7b\xd7\xd1\x16\xd2\x46\xb9\x1d\x87\x78\x15\x2f\x3d\x25\x7c\xce\x96\x83\x21\x55\x08\x19\x6c\x10\x07\xd7\x80\x8d\xae\x64\xbe\x84\x9f\x37\x47\x34\xef\x33\x2b\x3a\x85\x93\x9b\x5d\xe4\xee\xf7\x6e\x94\x3a\x52\x50\xc8\x4f\xe7\x12\x49\xc4\x11\x22\x34\x00\xe2\xa0\x79\x00\x60\x84\x41\x26\xea\x74\x23\xfc\x4e\xa5\x25\xeb\x15\x26\xdf\x43\xf6\x02\xeb\xc5\x6f\xe7\x7a\x68\xa9\xf5\x25\x31\xb3\x8d\xc4\x3f\xed\xba\x5a\xe8\xcb\xbd\x2d\xef\x40\x98\x4a\x10\x87\x6c\x84\x77\xc6\x2e\x19\xd1\x7b\x6e\x68\xd7\xe2\x7c\x75\x99\xa9\xa7\xb0\xa2\x21\x8f\xbf\x28\x1f\xb1\xc4\xcd\xf0\x7e\x5d\x3e\xcc\xee\xcd\x08\x22\x32\x88\x43\x36\xc2\x8e\x6b\x63\xf3\xb3\x98\x02\x87\x7f\x9e\xb1\xe2\xcc\x7c\x0c\xbc\x2c\x81\xcd\xfc\xe7\xf7\x7e\x1b\x2d\x21\xb1\xba\x49\x72\xa2\x75\x37\x22\x32\x88\x0b\x90\x43\xc1\xfe\xdf\xc8\xff\xfa\x1e\x61\x2e\xc9\x0b\xa5\xfd\x3a\x3c\xa1\x93\xb7\x1c\x3d\x3a\xfa\x2f\xb6\x3b\x1e\xf6\x05\x19\xe2\x2b\x8e\x7e\xdd\x27\x67\x93\x1c\x92\x5a\xfc\xdb\x08\x7b\xb3\x0d\xb1\xc5\xfb\x2c\x2b\xf3\xd1\x2a\x61\x1b\x24\x47\x73\xcf\x5e\xe0\xcc\xe1\xb2\x2f\xab\xce\x35\x8b\x1d\x64\xf4\x12\x26\xff\x0b\xe5\x57\xd4\x4c\x79\xd4\x9d\x44\x32\x4c\x7b\x75\xb1\x48\x9e\x78\xa5\x52\xd5\xbf\x1f\x45\x3c\x81\x30\xa9\xdc\x2d\x32\xf7\x3e\x81\xec\x7f\xcd\x08\x83\x86\xf6\x77\x8d\x30\x92\x11\xae\x0e\xf7\xeb\xd8\xf6\x3c\x9e\xc3\xfc\x14\xf9\x04\x6f\xfe\x77\x83\xb9\x7a\x7c\x51\xd5\x95\x69\x52\x55\x42\xeb\xb7\x23\x4e\x83\xbf\xcf\x64\xb3\x12\xd9\x08\x8f\xda\x4f\xe4\xa8\x15\x8d\xb6\xf5\x27\x29\xde\xfc\x72\xaf\xc5\x79\xbb\x44\x2a\x6b\x26\x3b\xe9\x05\x1e\xb9\x85\x82\x87\xa9\xc0\x99\x74\x8d\x6e\x40\x36\xc2\xe3\x18\x76\xc9\x3d\x5c\x37\xae\x85\xea\x11\x9c\xb4\xf2\x7b\x27\x0a\x99\x54\x3f\x7c\xaf\xc6\x86\x7b\x63\x7c\x99\x55\x59\xb1\xeb\x4c\x7a\x74\x49\x21\x1b\x61\x06\x34\xc9\xee\x09\x14\x9e\x96\xd0\x47\x99\x72\xf9\x8c\x53\xcd\x38\xbe\x1f\xae\xa3\x3c\x93\xe5\xfb\x72\x32\xf8\xfb\x72\xf7\xc4\xd9\x6c\xbb\x23\x1b\xe1\x30\x05\x0b\x33\x3b\xaf\xa4\x58\x99\xc2\x73\xbf\x08\x93\x8e\x84\xd2\xd8\xd1\xdc\x0c\xb4\xde\x67\x3a\x7a\x4d\x92\x61\xba\xf2\x9e\xc1\xcf\x1a\xfc\x3b\x11\x9d\x96\xf9\x76\x37\x3b\x1c\x53\xb2\x7f\x05\xca\x49\x5b\x8b\xd1\x7d\x9f\x36\xaa\x59\xd8\x4f\x9c\x4e\xca\xb7\xc0\x0e\x2d\xc7\x29\x74\x9b\x8d\x81\xce\x2e\x02\x38\x78\xe6\x8b\x09\xff\xfe\xa6\x5f\xdf\xdb\x42\xf7\xa7\x99\xec\xdb\x84\xb4\x8d\x07\x2c\x2d\xda\x24\x29\xc7\x44\x7d\xd6\x68\x5c\x11\x1e\x75\x90\xb1\x04\x71\xf0\xcc\xa7\xbb\x86\x9a\x85\x91\x27\x14\xab\x93\xee\x6c\xd2\x9e\xa2\xef\xa6\xdd\x6c\x78\x2b\x22\x7c\x9d\xf3\x39\xd3\xf1\xa2\xf5\x49\x19\x0e\x22\x2e\x88\x83\x67\xbe\x6d\xfb\xe8\xd7\x55\x89\xcd\xec\x4f\xf6\x6f\xe2\xfb\x9a\xb7\xa8\xe5\xbd\xf8\xe8\xe4\x56\xb5\xff\xc6\xad\x32\xbd\xfc\xbb\x92\xc5\x79\xe8\x28\x37\x80\x0b\x90\x41\x41\xff\x3b\x6e\xf1\x55\xc5\x22\xfa\xc8\xca\x8a\x44\xf9\xa4\xd2\x07\x51\x92\x32\x47\x86\xd3\xcc\xc3\x17\x4b\x28\x12\x32\x2f\x46\x96\xb2\x8e\x32\x22\x8c\x30\x88\x83\x6a\x84\xff\xd9\x08\x83\x5e\xe8\xd3\x24\x70\xcc\x61\x6b\x49\x2a\xdf\xc8\x18\x2e\xc2\xd2\x4f\x65\xd0\xd3\xd7\x7c\x9f\x6b\xab\x70\xbb\xe8\xd1\x7d\x8f\x28\x9a\x84\xbd\xef\x4f\x10\x43\x07\x71\x48\xc7\x62\xa5\xbc\x9d\x49\x79\xf0\x45\x2f\xd7\xe6\x0f\xd6\x99\xe8\x6b\x5a\x5f\x20\xb8\x28\x68\xc7\xbd\x65\x9b\x9e\x1a\x72\xc1\x19\x0f\x32\xd8\x20\x0e\x2e\x81\x0e\x15\xa2\x8b\xc4\xb3\xe3\x3c\xa3\x8c\x47\x17\x0e\x05\x1d\x9a\xcd\xef\x55\xf2\x2e\xac\xcb\xcd\xb2\xcb\xca\x29\xb7\x5f\xa7\xa3\x43\xc4\x05\x71\x70\x09\x1c\x26\xd0\xf7\xdc\xb4\xfb\xb3\x1a\xb8\xbd\xda\xe3\x5f\x2e\x7d\x51\x65\x3a\x66\xea\xc7\xae\x64\x4b\x9e\xf7\x5b\x61\x27\x21\x4b\xc8\xb4\x81\x38\xb8\x04\xaa\x67\xf2\xb3\x8f\xbe\xb4\x07\xe9\x8d\x12\x38\x04\xab\x0d\xba\x74\xb3\xa6\xed\x33\xe9\xaf\xec\xcb\x76\x8d\xdf\xf3\x12\xc4\xa0\x46\x2c\x7e\x40\x1c\x54\x1b\x08\x30\xc2\xa0\xd9\xf5\x34\x0d\x94\xa1\x51\x1c\xa5\x10\xbb\xf0\x58\x73\x1a\x92\x68\x64\x08\x4c\x76\xb6\x09\x1a\x66\x26\xc5\x56\x98\xbb\xb2\x4e\x93\xac\xf1\x56\x22\xc6\x0e\xe2\xe0\x1a\x18\x13\xca\x46\x5b\x6c\xcd\x0c\x31\xb2\xcc\x56\xbe\xb1\x8d\x9f\xa8\xc9\x54\xb1\xb4\x7b\x41\x37\x3c\x3b\xf3\x5c\x72\x04\x96\xee\x2b\x68\xf7\x1e\xc0\xc1\x35\xa0\xf7\x86\x41\xd7\xd9\xee\x52\xd4\x61\xf4\x63\x82\x2a\x7b\xce\xd8\xfd\xc2\xf1\xc5\xf2\xed\xa7\xe9\x35\x5f\xb0\xf7\x57\xf5\x16\x8d\x11\x71\x41\x1c\x5c\x03\xbe\xc2\x2c\x86\xb7\x14\xd5\x88\x0d\x34\x03\x65\x38\xb4\x1a\xec\x3d\x99\x7e\xf7\xcb\x8a\x4d\x98\xad\x0c\x7f\x15\x69\x55\xc6\x5e\x46\xc4\x05\x71\x70\x0d\xa4\x99\x59\x58\xe5\xd7\x7f\x1e\x21\xdb\x9c\x36\x3e\x44\x49\x8b\x7d\xf2\xc2\x79\x55\x25\xa3\x6a\xea\xe6\x64\x38\x13\xdf\x5a\x17\x74\x97\x34\x88\x83\x6a\x03\x01\x46\x18\x94\xea\x4e\x2d\x91\x78\x60\x30\xfe\x41\xcb\x99\xfe\xd6\x7b\x5e\x99\x1e\xc2\xb0\x07\x15\xfc\x62\x11\xc1\x3c\xcd\xfe\x5e\x13\x18\x05\xa8\x77\x9b\xa0\x54\x00\xe2\xe0\x1a\x70\x11\xd5\x7c\xe7\x17\xc0\x50\xd4\x94\x42\x9b\x64\x78\x93\xdd\xc2\xde\xfd\xf8\xf9\xe7\xf7\xf6\xa2\x6d\x14\xf6\xb2\xc1\x74\xa9\x50\xbb\x08\x10\x87\xd4\x28\xa9\x22\xb6\x67\x97\xa8\x80\x54\x4f\xe9\x19\x8a\x5a\xdb\xaf\xee\x1b\x65\xf5\x5e\x39\xdd\x2b\xc7\xea\x7a\x6f\x6a\xb4\xf2\x3b\xa0\x6b\xdf\x40\x1c\x5c\x03\xdf\xf3\x6e\x26\x09\x14\xbf\x49\xcc\x32\x2a\xd0\xf7\xfc\x2e\xfc\x36\x62\xab\x18\x97\x35\xed\xb5\x48\x54\x0d\xc3\xfe\xde\xbd\x42\xe8\x3e\x71\x10\x07\xd7\x80\xab\x0a\xcb\xa6\x73\xa4\x06\x43\xa2\xae\xb2\x9a\xfa\x48\x91\xc1\x61\xf7\xc5\x38\x5d\xd4\xb7\x65\xfe\x01\xcd\x39\xfd\x6b\x87\x37\xa0\xce\xe1\x00\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\xf5\x3e\x71\x6a\xe3\x32\x72\x56\x76\xbc\xdf\x59\xae\x9f\xcf\x6f\x8a\xce\xbd\xc2\xd1\x96\xa8\x68\x8c\x0b\x30\xc8\x0f\x0b\x9c\x97\x49\x9f\x44\x8c\x1d\xc4\x21\xdd\x23\x9c\xce\xcc\xf0\x83\x2f\x01\xfd\x6a\x4e\x85\x8d\x5d\x8d\x72\x3b\xb6\x91\x50\x99\xa7\x99\xc8\xa0\x4f\xfb\xcf\x20\x49\x5e\x1b\xe8\x12\x09\x10\x87\x74\x9b\x62\x66\x19\xc9\xe7\x74\xfb\xb7\xd5\xf9\x4b\xa4\xb1\x5b\x9d\x63\x54\xdd\xe2\x14\xf2\x4f\xa9\xd9\x7c\x76\x0c\xf9\x98\xf9\x82\x98\x10\x71\x41\x1c\x5c\x03\x28\x85\x8e\x4d\xe8\x52\x3c\x8e\x37\x78\x93\x7e\x86\x9d\x9c\xf8\x79\xfd\x94\xb9\x10\x68\xff\xa7\x33\x38\xfe\x5b\x04\x3e\xfe\x4e\x0d\x22\x2e\x88\x83\x6b\x40\x7a\xb4\xed\x5c\xf6\x23\xaa\x09\x12\x4a\xaf\xef\x83\x43\x9d\x6b\xe1\xad\x12\xdc\x64\xdf\x1c\x53\x83\x9f\xdc\xc7\x6b\xe6\x55\xb4\x45\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\x4c\xd4\xe9\x46\x38\x46\x9f\x30\x95\x4f\x72\xb9\xbd\xdf\xc7\x45\x40\xdc\x6b\xa4\x02\x6f\x0a\x2b\x5d\xd1\x8b\xef\x7a\xb6\x7f\x05\x51\x0f\x5e\x30\xb4\xbb\x0a\xe2\x90\x8d\xf0\x2d\x29\xad\x6d\xda\x8f\x92\x9b\x0c\x24\xdd\xa8\xa2\xd8\x39\xa5\x74\xa1\x5b\xdf\x3f\x0e\x08\x90\xbf\xfc\xb3\xd7\x31\x6c\x92\xc1\x83\x88\x0c\xe2\x90\x8d\xf0\x09\xcb\x2f\xbc\x37\xde\xfd\xa3\xb5\xb4\xbc\xaa\x99\x4e\xc5\x4e\xf9\xbd\x95\x3d\x97\x52\x29\x46\x2b\x3c\x34\x8b\xd3\xde\xbd\x61\x40\x44\x06\x71\xc8\x91\xff\xf5\x3d\xc2\x6d\x61\x97\x09\x1d\xae\x89\x6a\x14\x0d\x7a\x68\x68\x2c\x50\xca\xd2\xaf\x17\x9b\x51\xd5\x33\x18\x1e\x5d\x73\xcd\xb8\x2c\xfc\x72\xfe\x6f\x23\xcc\xcf\xbc\xf1\x12\x87\xa2\x97\xf5\xe2\x85\xdf\x6e\xdf\xd9\x6e\xdf\xb9\x58\xc6\xfc\xa8\xd8\xaf\xc9\xcb\x2c\x29\xa7\xc3\xcb\x9c\x20\xed\x2f\x54\x82\xf8\x79\x8f\xa5\xe2\xa3\x52\x5f\x96\x0e\xbd\x1f\x71\x7b\x7d\xcb\x1c\x2f\x19\xd6\x35\xd5\x14\x1c\x52\x6f\x5f\x75\xe5\xa6\x66\xfb\xaf\x19\x61\xd0\xd0\xfe\xae\x11\x56\x85\x9b\xa5\x1f\xb7\x0b\xf3\xb3\x12\x1b\xfd\x6c\xb5\x2f\x9e\x7c\xe9\x67\xe0\x90\xce\xd9\xf4\xbb\x76\x3d\xbb\x9d\xb9\xa4\xb2\x2d\x22\xb9\xe4\x4c\xda\x47\xf9\x22\x1b\x61\xbf\x72\x47\xa9\xab\xaf\xe5\x43\xdf\xf9\x0f\x67\x1a\xb1\xb0\xbe\xd2\x29\xda\x6e\xd5\x5f\x27\xdc\xcd\xef\xae\x5a\xe5\xc8\xa5\xd2\x3c\x93\xad\x59\x6d\xa4\x9f\x15\xc5\x1a\xe4\xe5\xa2\x33\xd8\x5c\xd7\x2b\x79\xf5\xb3\x3a\x70\xf7\x4d\xda\x96\xf5\x0f\xb6\x97\xed\x14\x56\x4c\x09\x23\x32\xce\x13\x67\x32\x5a\x64\x23\x9c\x6c\x59\x48\x91\x41\x5b\x41\xe0\x32\xb3\x47\xf0\x41\x8b\xfd\x87\x41\x5d\x8b\xe3\x6d\x9f\x1b\xdf\x1d\x63\x23\x18\xe4\x3e\xf9\x15\x9c\xc9\x68\xdd\x90\x7e\xf6\x0b\xea\x9e\x64\xa8\xd3\xf0\x85\xf7\x7b\x59\xaf\x8e\x94\x62\xaa\x1c\xb8\x36\xc3\xae\x45\x2e\xa6\x0b\x4c\xbd\x92\x1c\xad\xc3\x72\x3d\x33\x23\x0c\x12\xd1\xa9\xe7\x62\x75\xe5\x63\xef\x9e\x8b\x67\x7a\x1a\x5f\xc5\x55\xf3\x53\x99\x31\xfc\xe0\x21\xe1\x0f\xf3\x56\x11\x59\xbb\x00\xc1\x2f\xda\x1e\x90\xab\x00\x71\xf0\xcc\x47\x9d\x6b\x21\xa2\x20\xc7\x9c\x19\x31\xbb\x70\x71\xd7\xdc\x47\xc2\xb1\x6d\xb6\xc6\x44\xb1\x5f\xff\x71\x98\xef\xcf\x45\x81\xe7\x2e\x88\xb8\x20\x0e\x9e\xf9\xcc\xcf\xdf\x37\xbb\x5f\x7d\x44\x47\xa0\xa4\xff\x56\x71\xa3\x90\xe9\x06\xe9\x6d\xee\xb2\x66\xbc\xfe\xb0\xb2\xd4\xfd\xaa\x5b\x87\x66\x88\xb8\x20\x0e\x9e\xf9\x82\xcb\x7a\xf1\x8d\x7f\x57\xad\xbc\xdb\x39\xba\xc6\x6c\x18\xf8\x01\x95\x94\x5a\xda\xe7\xd1\x57\x23\x0d\x27\xfe\xfc\x35\xb5\x1d\xa8\x1b\x35\x88\x0b\x90\xf9\xdf\xdb\xd8\x51\xb1\xbe\x31\x99\x4e\x0b\xa1\x4e\x67\xb6\x6f\x6d\xd5\x55\x58\x62\x78\x32\x0f\xa9\xee\xa6\xe6\x63\xf5\x97\x63\x63\xae\x93\xd4\x22\x8c\x30\x88\x83\x6a\x84\x55\xff\x71\xf1\x03\x7a\xa1\x4f\x93\xc0\xfc\x7a\xcb\xc5\x4a\x57\x05\x75\x9b\x4c\x52\x29\x0f\x35\x37\x6a\x3d\x8b\xf7\xb5\x7f\x22\x36\xe2\xad\x38\x03\x47\xfa\x24\x0f\x1e\x43\x3b\x36\x00\x0e\x2e\x81\x32\xcc\x5f\xf1\x18\x03\x94\x27\x5f\x87\xda\x88\x9b\x28\xe9\x2d\x5f\xf3\xbc\xbe\xdb\x7f\xf4\x50\x26\x9a\xf4\x43\xa6\xaa\x9e\x08\xd4\xdd\x19\xc4\x21\x99\x20\x6a\xbf\x3b\xc2\xfd\xbc\x64\xa5\x51\x15\xb1\xfd\x29\x4f\x63\x7e\xbe\x31\x8f\x90\xa1\xa7\x31\x49\x46\xbd\x45\xb1\xf0\x6a\x22\x15\x32\x41\x00\x0e\x2e\x81\x7b\xd8\xe3\xcf\x77\x9b\x65\xab\x97\xfb\xf7\x13\x3e\xc6\x58\x1b\x3c\x1b\x8a\x31\x7b\xf7\x76\x99\xc1\xc4\x1f\x9f\x52\x99\x41\x2d\x1e\xea\x42\x0b\xe0\xe0\x12\x38\x61\xca\x12\xa9\x9f\xbe\xed\x1d\x76\x22\x72\xbf\x2f\x8e\x8e\x46\x57\x0c\x03\xed\x77\x4f\xc7\x55\x1f\x47\x9b\xe7\x3b\x3c\x3e\x51\x88\xc5\x0f\x88\x83\x6a\x03\x01\x46\x18\x34\xbb\x9e\xa6\x01\x82\x8f\xd8\x75\xe8\xe8\x23\x8d\x11\x69\x73\xed\xee\x4c\x37\xa3\x6d\x98\x0e\x46\x1d\x7e\x59\x0a\x9f\x57\x65\xb8\xac\x69\x6c\xe3\x8d\x18\x3b\x88\x43\x6a\x1e\xff\x90\x39\xd4\x87\x5c\x35\xc4\x26\xa4\x71\xba\x96\x8d\x6e\x73\x9b\x82\x56\xbb\x35\xd7\x7f\xc0\x3e\xc8\xf1\x85\xe3\x66\x97\x01\xd4\x3c\x1e\xc0\x21\x4d\x03\x51\x53\x69\xe3\xf5\x72\x03\xe5\x4e\x66\x54\xd1\x46\xe3\x5f\xfb\x3d\x8b\xfa\x5e\x87\x48\xef\x89\xe8\x61\x67\x14\x86\xde\x81\x4e\x05\x80\x38\xb8\x06\x18\x6a\x88\x73\x96\x73\xae\xae\x5b\xe3\x1c\x2a\x5e\x67\xef\x65\x70\x79\x83\xcb\x7c\xe9\x2b\xeb\xe5\x7e\x65\x49\xff\xc0\x15\x22\x68\x27\x08\xc4\xc1\x35\x70\x59\xce\x5b\xfe\xb9\x65\x22\xff\x27\x05\xa7\x97\xa1\xc5\x0c\xaa\xbb\x51\x8c\x57\x48\x3e\x0c\x39\xf6\x53\x97\xde\x88\xc8\xf3\xbd\x85\xd0\x00\x88\x83\x6a\x03\xb5\x01\x57\xe7\x00\x52\xdd\x69\x1a\x50\xf9\xb8\x19\xf7\x1b\xcb\xa2\x2a\x69\xaf\xca\x4c\x18\x53\x53\xe2\x06\xfb\xcd\x7d\x4c\xdc\x80\x80\x2b\xfa\x06\xe6\x7b\x6a\xb9\x6a\x88\xb1\x83\x38\xb8\x06\xde\xcd\xc7\x63\x8d\x99\xe3\x4e\x0d\xee\x09\xbd\xb7\x5c\x59\xd5\x71\xec\xbc\xf3\x42\xbb\x84\xc7\x32\xd1\x22\xff\x7b\x8b\x6a\x3c\xd4\xdf\x10\xc4\xc1\x35\x10\x64\xd5\x6b\xdb\x66\xaa\xcb\xc7\x75\x3c\x4d\x7b\xf7\xf9\xb1\xce\xb8\x29\x99\xc9\xc0\xf6\x82\x6b\x93\x02\x55\xd8\xb3\xef\x6b\x97\x10\x71\x41\x1c\x5c\x03\x96\x31\x32\x73\x17\x5a\x63\x4a\x57\xc4\xaf\x14\xb7\x2e\xd2\x77\x62\x04\xb6\x3f\x7c\x45\xe2\xbc\xbd\xc8\xfb\x7c\x6a\xe9\xb5\x17\xb4\x23\x0c\xe2\xe0\x1a\xc8\xc5\xf4\x61\x52\x71\xa6\xd1\x4d\x33\xa4\xdc\xd2\x2e\x25\x78\xe4\x6f\xc9\xf1\xd4\x7d\x21\xe9\x92\x40\x6a\xd7\xad\xfa\xdf\xbd\xf5\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\x34\x0d\xf8\xb9\xdd\x16\x99\x76\xcf\xab\x5d\x2f\x4a\x46\xd9\xe7\x8b\xd1\x1b\x9a\x61\x8c\x6d\xcf\x4e\x72\x2f\x7b\x6e\xd9\x69\xdd\x4e\xf4\x05\xfa\xb8\x00\xe0\xe0\x1a\xf0\x67\x66\xe1\x0b\xfc\x7f\xcc\xfd\x79\x38\x55\xfb\xff\x07\xfc\xef\x65\x88\x28\xf3\xb0\x16\x92\x29\xf3\x10\x91\x21\x64\x26\xb3\x90\x50\x99\xe7\x99\x84\x8c\xcb\x90\x39\x85\x42\x66\x52\xe6\x64\x96\x42\x32\x0b\x91\xa9\x32\xcf\xc9\x3c\x53\xf8\x5d\xdd\xdf\xcf\x39\xdf\xf6\xfe\x9c\x75\x3b\xbf\xeb\xfa\xfe\x71\xf7\x8f\x73\xed\xf3\xf2\xd8\x7b\xed\xfd\x5e\x6b\xbd\xde\xef\xb5\xf6\x93\x33\x33\xa7\x59\x89\xfa\xeb\x60\x6c\x85\x73\x4f\xbf\x7c\x76\x19\xbe\x34\x2c\xdd\x3b\x91\x3d\xb7\x13\xbe\xf7\x77\x56\xc0\x49\x75\x98\x63\xc0\xbd\xc8\x36\xe6\x49\xdb\x92\x1a\x55\xda\xf4\x0f\xcb\xf3\x45\x86\x66\xef\x6c\x64\x99\xd8\x05\x0c\x4c\x6c\xf6\xbe\x1a\x39\xf0\x99\xfd\xe5\x9e\x54\x87\x39\x06\xce\xfb\x9b\x59\x1a\x14\x4a\xf9\x36\x4e\x3d\xde\xb2\xe7\xb1\xfd\xc2\x55\xea\x9a\x14\xa5\x9c\x36\x97\x78\xaf\xe6\xa3\x70\xb6\xe5\xdf\x63\xeb\xa4\x3a\xcc\x31\xf0\xed\xa5\x14\xcd\x4d\xdb\x11\x42\x8a\xfe\x07\x21\x24\x51\x21\x61\xa7\x33\x14\xea\x01\x5e\xe1\xa6\xdc\x2d\x2f\xcd\xb3\xac\xe6\xc7\x7f\x8d\x81\x93\xea\xfe\x3e\x0e\x78\xfd\xbf\x4f\x84\x4f\x9a\x44\xfd\xf3\x44\x58\x32\xd3\x5f\xed\xfb\x88\x78\x5c\xd9\x2a\xbc\x3b\x95\x9f\xd7\x69\x5f\xb1\x6c\x59\xc5\xb7\x3f\x7a\x2d\x0b\xff\xc7\x3d\xd4\xe9\xe2\xbf\x26\x95\x27\xd5\xfd\xf7\x44\x38\x2a\xaa\xf6\x91\x9a\x97\xfc\x8c\xbb\xb3\x6c\x7e\x9a\xd2\xda\x7d\x92\x52\xb6\x2e\x2f\x63\x6b\x43\xde\x74\x9a\xd2\x5b\xa2\x9b\xaa\x7f\xc9\x27\xd5\xfd\xf7\x74\x75\x26\x49\x78\x00\x74\x0d\xfd\xc8\xf1\x9c\x7e\x61\x5e\x0b\x37\x84\x65\xee\xd2\xc8\x9d\xf4\x71\x6a\x81\x34\xdf\xad\x51\x78\x27\xe6\x2f\xf9\xa4\xba\xff\x7e\xcd\xff\xfa\xef\x08\xf3\xf9\xba\x04\xea\x05\x1b\x73\x08\x59\xc4\xda\x7e\xe6\x78\x34\x73\xc4\xb4\x56\xea\x6b\xdf\xf9\x8c\x4c\x20\x8a\x5d\xd4\x9b\x58\xe0\xcf\x89\xb0\x7b\x65\x8f\xd6\xfa\x7d\x8e\x5f\xfe\x79\xd1\x5a\x97\x14\xce\x18\x2c\x25\x5a\x10\x24\xaa\x69\x75\xb2\xea\x9c\x56\x49\x96\xf6\xfa\x33\x2c\x2b\x92\x47\x11\x2c\x31\x97\x36\xef\x50\xa9\x94\x65\x02\x2b\x78\xb7\xb6\xc8\x4c\x48\xbd\xd8\x63\x94\x0b\xcf\x94\x79\xb3\xf3\x33\xfe\x7f\x6d\x22\x7c\xd2\xa6\xfd\xf9\x1d\xe1\xff\x9a\x08\xef\xe2\xf9\x1c\xc9\x3e\x3f\xce\x8b\x2c\x39\xfe\x50\x0e\x6a\x49\xe1\xea\x3d\x5f\x7a\x14\xcd\xfc\xc3\x47\x71\x32\x8c\x92\xe1\xed\xfe\xff\xc9\xc5\xca\xff\x9e\x08\x43\xf3\x9f\x12\x1e\xda\x4d\x8b\x29\xbd\x08\x63\x33\xd3\x75\x76\xcb\x7c\xc8\x35\xdb\x53\x63\x41\xeb\x7a\x98\xc1\x21\x74\x98\xe9\xf6\x7f\x72\x69\xf6\xbf\x27\xc2\xaf\xbc\x3b\xc7\xb7\x36\x2b\x93\xcf\x26\x58\x7e\x4a\x2e\x88\xff\xe6\x68\x77\x9a\x51\x87\x22\xb6\xa4\x5f\x49\x2b\xb0\x9c\xef\x69\xed\xff\xc9\xd6\xfe\xf7\x44\x78\x9f\xb5\x6d\x69\xfe\xe0\xd7\x33\x69\x7b\xa5\x82\x77\xad\x73\xe5\x2e\x2d\xfe\x5b\x53\xda\xa5\x14\xbe\x7b\x94\xe3\x6c\x17\x1e\x4a\xff\x9f\x6c\xed\x7f\x4f\x84\x5b\x88\x44\xbd\x17\xeb\x12\x2c\xdf\x99\x3d\xb9\x8a\x7f\x2f\x77\xb7\xf0\xf5\xcf\xdc\xb2\xaf\x58\xd5\x0c\x78\x56\x5e\xef\xc1\xe6\x67\xff\x67\x13\xe1\x93\x06\xd1\x3f\x9d\xf9\x86\x6a\xe5\x34\x6d\x4a\xdd\x13\xa3\x38\x7a\xab\xf6\x05\x27\x76\x37\xa3\xd9\x96\x0a\xe6\xdf\xb8\xbf\x6f\x60\xc3\x4a\x8e\xfa\x38\xfa\xd7\x11\xff\xa4\x3a\xcc\x33\x9f\xc9\x39\xea\xb4\xfc\x1a\x6e\x6d\xf3\x97\x74\x9c\x6d\xea\xe6\x14\xe7\xcc\x87\x42\x07\xba\x6b\xa7\xdc\xa6\x8e\xf9\x2d\xcd\x7f\xfd\x3d\xc1\x3e\xa9\x0e\x73\x49\xd5\x95\xf5\xe0\x51\xd2\x7b\xc5\x75\xb6\x51\x6c\x29\x4f\x52\x42\xa7\x27\x1f\xba\x29\xef\x24\xe1\x97\x94\x94\x49\xe0\x13\x19\x58\x3a\xfd\x7d\xef\xd6\x09\x75\x98\x6e\xe3\x51\x6a\x5b\x5a\xdf\xcc\x72\x93\xfd\x05\x83\xb3\xd2\xcf\x3f\xfa\x85\xaa\xcb\x15\xed\x39\xdd\x4d\x6b\x60\x2f\x6b\x97\xb1\xb1\xfc\xcb\x3d\xa9\xee\xbf\x3a\x60\x2a\xad\xca\x3d\xa3\x8e\x83\x8b\x82\x33\xbd\xc3\x64\x5a\x3f\xb8\xb5\x28\x03\x3e\x6d\x2c\x7e\xe4\xe6\x4c\x5f\x7f\xbf\xf3\x74\xe8\xaf\x89\xf0\x49\x75\x7f\x7f\x47\xf8\xff\x7d\x22\x7c\xd2\x0e\xfd\x4f\x43\xe0\xa1\x54\xb1\xcf\x23\x6f\x92\x22\x0f\x9b\x55\x72\xbf\xa5\x37\x2b\x97\x58\x71\xa8\xe7\x92\x89\xdf\x60\x29\x0a\x64\xad\x9c\x2b\x12\xfa\x6b\xd3\x4f\xaa\xc3\x1c\x02\xd6\x4f\x4e\x25\xfa\x62\xeb\x8e\x36\xcd\x65\x4b\xce\x85\x0d\x3a\x7e\xee\x55\x3d\xd8\x4b\xfc\x72\xad\xa7\x1e\x97\x95\x64\xc4\xfb\xd6\x5f\xee\x49\x75\x98\x1f\x15\x8a\x3f\xb9\x66\xfd\xc2\x2a\xd1\xd4\xb5\xdb\x8a\xef\xb6\xd8\x19\x3f\xd0\x5f\x07\xdb\x0a\x3f\x9c\x1a\x0b\xa0\xff\xa2\x74\x26\xf7\xef\x5b\x38\x4f\xaa\xc3\x74\xf9\x5e\xb1\xfa\xdc\x76\xca\x68\xd8\x1d\xfc\x28\xfd\xbd\xfd\xc6\xf8\x27\x6b\xea\xfc\x04\xd7\xbd\xbd\x24\xe6\x99\x83\xe7\x9e\x6f\xff\x6e\xaa\x4e\xaa\xc3\x1c\x02\xe4\x5c\x77\x95\x8f\x9f\xfc\x58\x78\x34\xd8\x6e\xfb\xc0\x78\xde\xc3\xa4\x36\x0d\xa7\xa6\xa7\xfa\x91\x5b\xb2\xae\xc2\x81\xf8\x29\x82\xbf\x6f\x8d\x3e\xa1\xee\xef\xef\x06\x9e\x30\x11\x3e\xe9\xe8\xfa\x4f\x63\xe0\x91\x3f\xbd\x95\x97\xe8\x83\xbd\xf3\xdf\x8e\x79\x04\x13\x99\x66\x5c\xb3\x93\x25\x5d\x9b\x3c\x4f\x89\xc6\x2d\x6d\x9f\xbd\x1e\x75\xe9\xaf\x6d\x3f\xa9\x0e\x73\x0c\x94\x3a\x6f\x19\xd2\x45\xcb\xdd\x62\x88\x30\x3b\x4d\xde\x20\xf4\xcd\x27\x93\xa2\xec\xd1\x58\x81\x32\x6e\x68\xab\xe0\xfd\xee\x87\x7f\x7f\x43\xe2\xa4\x3a\xcc\xcf\x6a\xeb\xbd\x36\xcd\xe3\xd7\xbc\x19\xcc\xd7\xa7\xf7\x64\x09\xc2\xb9\x0a\x97\x71\x6f\xec\x30\xbc\x6e\xbd\xbc\x39\x1e\xce\xcf\xe6\xc0\xf9\xf7\x0d\x1c\x27\xd4\x61\xba\x1b\xd6\x75\x94\x91\x95\xb6\x5f\x9a\xdb\xae\x51\xe0\x8f\xbb\x66\x92\x53\x13\x64\xba\x5e\xf8\x65\xc3\xb7\x7b\x15\xab\x69\x76\x48\xed\x2f\xf7\xa4\x3a\xcc\x31\x50\x22\x9b\xe5\x29\x48\xdc\xe2\x1e\x2f\xa8\xd6\xd2\x46\xc6\x7f\x75\x53\x7e\x0c\x8f\x28\x75\x3e\x3a\xd1\xc2\x52\x35\xf5\x88\xd6\xff\xaf\x31\x70\x52\xdd\xdf\xdf\x0d\x3c\x61\x22\x7c\xd2\xa9\xee\x9f\xc6\x80\x89\x7d\x56\x5c\x78\xea\x47\xae\x54\x7d\x2d\xb3\x83\xe5\xa9\x90\xf8\x9f\x15\x34\x76\xc2\x31\x3e\x1b\x4c\x6d\x52\xea\xfb\xed\x7f\xef\xaf\x27\xd5\x61\x8e\x81\xae\xbb\xf8\xeb\x91\x4b\x6f\xb4\x9e\xfd\x20\xbb\xb4\x43\x75\xe0\x87\xf7\x61\xab\x24\x9b\x35\x7d\xf3\xf1\x4a\x48\x24\x2d\x7f\xcd\xff\xde\xc1\x71\x42\x1d\xe6\x67\xb5\xde\xbf\x7d\xbd\x4f\x5d\xeb\xea\xb1\x29\x75\xe7\xf3\xc1\x86\x07\x4a\x74\xd3\xb4\x51\x0e\x86\xd7\x9b\xaa\x94\x0c\x41\xd1\xf0\xbf\xff\xe4\xd7\x49\x75\x98\xae\x98\x0a\x96\x60\x94\x15\xcd\x41\xf3\xb3\x66\xef\x42\x3d\x07\xfd\xab\x94\xb1\x43\xe3\x9f\x84\xfb\x74\xb9\xec\x09\xe7\xe8\x06\x32\xfe\xbe\x32\x7e\x42\x1d\xe6\x18\x48\xe2\x15\xd5\xb8\x1a\xab\xab\xe4\x5f\x63\x41\xd6\x78\x78\xb5\xc6\xf7\x66\x16\x87\xa1\x33\x6f\xe7\xf3\x49\x9e\x87\x83\xba\x2a\xe7\xfe\x1a\x03\x27\xd5\xfd\x7d\x1c\x38\x61\x22\x7c\x52\xdf\xf1\x4f\x63\xc0\x56\x66\x52\xf3\xc7\x4c\x7e\x3e\xd9\xed\x9a\xec\x37\x4f\x0c\x97\x9f\x0a\x04\xfa\x5f\x96\x0d\x48\x63\xbb\x90\xfc\x21\x4a\x6b\xf3\xef\x2b\xb7\x27\xd5\x61\x8e\x81\x03\x7c\x2a\x68\x42\xf5\xb9\x63\xb3\xea\x47\xe5\xd6\x81\x40\x8f\xc5\xc2\x27\xdf\x70\x43\x84\xed\xb3\x72\xd6\xd7\xb0\x9f\x2d\x6b\xff\x1d\x45\x72\x42\x1d\xe6\x67\xa5\x72\xa7\x81\xa3\x68\xb2\x49\xc2\x93\x30\xb2\xd0\x6f\x54\xe9\xca\xd7\xf0\xa5\xf6\xf0\x86\x8c\x33\xad\x2a\xce\x1a\x4f\xb3\x25\x42\xff\x72\x4f\xaa\xc3\x74\x43\xa7\x92\x62\xdb\x9e\x19\xaf\x71\x34\x48\xcd\xb4\xf4\x3f\x14\x0f\x7c\xa3\xaf\x24\xab\xd9\x23\x92\xae\xf2\xe9\xf0\xb1\xbd\xa6\xcd\xdf\xdf\x3d\x3e\xa1\x0e\x73\x0c\x08\x7d\xcd\xe5\x74\x2e\x71\x3b\x96\x7b\xf4\x42\xf1\x5e\x80\xa7\x7a\xaa\xb8\xf4\x69\xda\x1f\xb9\xdf\xb0\xae\x51\xb0\x84\xe0\xaa\xa9\xfc\x9d\x1a\x7d\x42\xdd\xdf\xc7\x81\x13\x26\xc2\x27\x4d\xa2\xfe\x79\x22\xfc\x9a\x51\xff\x66\x5c\x7e\x48\x7c\xaa\xe9\xcb\xc9\x2e\xa0\xd0\xb2\x5a\xd3\xc3\x4e\x2f\x56\xe1\x5c\x11\xe3\x3b\xf5\x10\x42\x27\x92\xbf\x26\x95\x27\xd5\xfd\xf7\xa4\x92\x66\x28\x4a\x8a\xec\x20\x73\x24\xbd\x67\x2b\xa4\xc7\xb5\x78\x7d\x34\xa8\x23\xcc\xe3\x6e\xfd\x6d\xf5\x45\x95\x28\x16\x79\xb9\xf9\xbf\xe4\x93\xea\x82\xe4\x50\x38\xe8\xf2\xc7\xb3\x41\x2d\x0e\xba\x8c\x6f\xd6\xc3\x56\xfc\xe6\x37\x1a\xa9\x24\x87\x3c\x6c\x47\x2a\xf2\xce\xcc\x7e\x69\x2d\xb2\x3b\xef\x2c\xf3\x97\x7c\x52\x5d\x90\x1c\x0a\x85\x3e\x76\x4f\xfc\x3b\xc2\x12\xff\x39\x27\xc4\x15\x5b\xf8\xbc\x95\x72\x49\x79\xff\x6d\xc8\xd9\x8e\xb3\xb9\x5a\x15\x30\xd6\xa5\xb0\xb7\xee\xd7\x48\xcf\x22\xa4\x4b\xc3\x87\x75\x01\x95\x22\x1e\xa7\xfa\x62\x16\xe9\x2f\xc9\xa2\xf3\x19\x33\xb8\xad\x47\xf6\x60\x91\xc1\x7f\xce\x80\xd7\x0b\x72\xf9\x55\x18\x93\x6c\x3a\xe2\xf1\xb7\x45\xe8\x48\xdc\xe9\xe3\x2c\x1f\x3c\xd8\x88\x49\xf7\x7a\x31\xee\x8c\x6a\x4c\x87\x6f\xf2\x63\x07\x9a\x5b\xe4\xcb\x62\xf5\x18\xec\xce\xc5\x2f\xa3\xa4\x07\x2e\xe3\xb9\xfd\x20\x1f\x62\xf2\xc8\x7a\x47\xf5\xb6\x66\xf5\x5d\x1a\x81\x7e\x39\xf1\x07\xff\xc6\x9b\x58\xa3\x5f\x8d\x08\x69\x5e\x3f\x1d\xbe\x08\xe8\xa2\xa8\x2c\x6d\xec\xf9\x2e\xf3\xdd\xb3\x70\xb5\xb1\xb4\xb1\x30\x77\xb5\xb0\xb2\x71\xbb\xeb\xea\xf5\xcf\x8f\x06\x00\xff\xf3\x62\x5c\x5e\xc5\x13\x4e\xa8\x66\x52\xe8\x36\x53\xb9\xb4\x3b\x58\xed\x6e\xb3\x99\xb8\x36\xa9\xd3\x58\xce\x0d\x3c\x8e\x53\x26\xdb\x24\x0b\x92\x41\xfd\x79\x91\x94\xd8\xc8\x5c\xa5\x6a\x05\xdf\x50\xc5\xa9\x52\x28\xc5\x70\xb4\xcb\xf8\x4c\x9f\x02\xef\x9d\xd7\x46\xf3\xc4\x53\xca\xcf\x2a\xc5\xce\xfe\x51\x0a\x1e\xd9\x7e\x34\xc9\xce\xb6\x3b\x23\x2c\xae\x2c\xf6\xf0\x85\x0a\xcc\xb5\xd1\x91\x7c\x3d\x40\xf3\x51\x8a\x67\x3f\xbe\x6e\xc4\x99\x4b\xff\x4e\x0c\xfc\x9f\x6c\x6f\x38\x50\x06\xa5\x25\xc5\x0e\xe8\xa2\xc8\xfe\x67\x83\xdc\xee\x3a\xb9\x9a\x58\x59\x38\x3b\x79\x58\xb8\xfe\xf7\x23\xdf\xff\xb3\x79\x38\x9e\x64\xda\xfe\xb7\xf2\x32\x6b\x1f\x48\xe6\x4a\x6b\xac\x65\x17\x01\x6d\x22\xfa\x51\x67\x45\xf6\xa9\x7d\xd4\xbe\xff\xea\xed\x8d\x51\x44\x01\xd6\x28\x14\x0a\xf5\xbf\x3f\x89\x48\xfe\xfc\x29\x8b\x22\x94\xc2\xfc\x7f\x52\x81\x37\x41\x14\xd6\x88\x3d\xea\x1f\xfe\xe9\xa1\xb0\x1b\xfe\xe9\xf1\x53\xa7\xfe\x78\x6b\x18\x4f\x71\x8c\xff\xa0\x6f\x16\xc1\xa9\x81\xb6\x7d\x6e\x67\x7a\xdf\xb5\xdf\x99\x4d\xda\xd4\x6c\x4c\x1d\xa8\xdc\x98\xce\xb6\x0c\xfb\x33\xcc\x39\x06\x2e\x91\xbf\x2c\xae\xc4\x55\x2b\xf7\x40\xa8\xf8\x20\xc4\x0e\xf7\x63\x8b\x17\xd5\x90\x65\x95\xce\xaf\xcc\xfe\x83\x8d\x30\xb6\x9d\x25\xe0\xdf\xa1\x81\x8a\x01\x28\x7c\x94\x0c\x0a\x15\x0c\x07\x4a\xbb\xfe\xf1\x0c\x77\x45\x58\x7b\xa5\xb4\xdf\x4a\x6e\xcc\x96\xf4\x5f\xe5\x74\x3a\x32\x76\xfb\x64\x2c\xf9\xb6\x21\xfe\xe8\x62\xa8\x6e\xbc\xd6\x53\x53\x38\x50\xfa\xcf\xfb\xf7\xa7\xaa\x6a\xca\x3b\xd3\x86\x49\x64\xb0\x2f\xd8\xfa\x3f\x1d\xc9\xe2\xb8\xbd\x2f\xe3\x53\x6c\xe8\xa1\xcf\xdd\x32\x51\x1b\x47\xfc\x1e\x0e\x94\x56\xff\xa3\x5c\xca\x35\xfd\x27\xaa\x26\xe9\x90\xff\x86\xbe\x33\xc7\x24\xb6\xae\x02\xf8\x39\x35\x5c\x36\x86\xc4\xaf\xbf\x64\x8a\x12\x70\xc8\x81\x03\xa5\xff\x5c\x83\x79\xa4\xd2\x40\x15\x4b\xcd\xa9\xfa\xf2\x05\x41\x9f\xd9\xc6\x47\xec\x1b\x9e\xe0\xbd\xca\x2b\xdc\x47\x0e\x7a\x37\xcf\x64\xd9\xc4\x7a\x28\xfc\xbb\xd7\x1c\x7c\x0a\x85\x15\xa4\x84\xfd\x9f\x37\x3f\x20\x30\x50\x16\xb5\x80\x27\x03\x03\x81\xb2\xa8\x1f\xbf\x7f\x4a\xfe\xbb\x6d\x09\x3e\x85\x02\x82\x94\x80\xbf\x18\x38\x50\x16\xb5\xfc\xfb\xd7\x15\xfe\xdd\xb6\xfd\xc3\xab\x58\xfc\xcf\xab\x58\xfa\xe3\x55\x9c\xb4\xcd\xff\xf0\x2a\xbe\xff\xfe\xf5\x2a\xe0\xdf\x0d\x91\x40\xb9\x40\x69\x14\xf6\x03\xf8\xff\x79\xfa\x20\x3c\x05\x94\xf8\xff\x8c\x66\xac\x9b\xbf\x7f\xfe\xcf\x46\xfd\xe3\xc3\x0b\xff\xfc\xf0\x8f\x7f\x7e\x78\xe9\x9f\x1f\xfe\xfe\xdf\x0f\xff\xe7\x30\xaa\xd2\xb0\x18\x48\x43\x7d\x7b\x7e\x9b\x16\x30\x54\x29\x2c\x7f\x80\xe5\x3a\xbb\xeb\xf2\x9a\x72\xcb\x25\x70\x68\x5b\x83\x8c\x7c\x18\xd6\x05\xc4\x5e\xe8\x8e\xb8\x94\xaf\x87\x51\xa4\x3f\xf6\x0c\x6b\x90\x1d\xa8\x57\xfb\xc2\x05\x02\xba\x28\x82\xff\xd9\xe5\xcd\x5c\x9d\x1c\xff\xf7\xbf\x04\xfe\x87\xb5\xe8\xfd\x3a\x64\x1e\xfb\x71\xe0\x13\x09\xe4\xdb\x68\x37\xf0\x13\xaf\xa1\x27\xe4\xe3\xc8\xab\x0d\x92\xe0\x86\x7e\xef\x43\x6a\x7d\x38\x30\x50\x06\x85\x83\x1b\x28\x83\xc2\x3d\xcd\xf9\x3f\xbf\x32\x2e\x7f\xb7\xa5\x2c\xb3\xc6\xb6\xed\x6d\x49\x7c\x79\x82\x4f\x1c\x47\xb4\xa7\xfd\xa7\xd5\x83\xd2\xbe\xf9\xe7\x43\xb4\x1e\x89\x04\xb0\x0c\xca\xec\x3f\x47\x6f\xc5\x1b\x74\xb7\x2d\x3a\xbf\x5f\x82\xfa\x24\x34\xfa\xd7\x18\x7a\x8f\x71\x17\xa4\x0a\x6e\x3e\xce\x78\x66\x11\xb4\x58\xa4\xd2\x2f\xf6\xfb\xe8\xfd\x64\x21\x4a\x22\xca\x64\xa4\x43\x24\xf7\x0d\x8b\x07\x81\xde\x40\xd1\x52\xa6\x9c\xde\x59\x26\x93\x02\xf5\x26\xf1\x97\xfb\x7d\x6b\x2b\xa6\xcb\x61\x7d\x6f\xbe\x07\x28\x7d\x62\x3a\x26\x9f\xe3\x9b\x9b\xfa\xcf\xfa\x6a\x44\xd1\x93\x85\xa5\x7a\xd7\x84\x99\x37\xc7\xee\x45\x93\x75\x4f\x9c\x09\x23\x70\x9a\x07\x92\xf7\xe3\x6e\xd6\xe2\xdc\x22\xf6\x6d\x8e\xf9\xf3\x2c\xe8\xa6\xa3\x25\x6c\xb1\xfc\x22\x8f\xa8\x46\xc6\x3c\x0c\x90\x98\x70\xd4\xe1\xe2\xc5\xa7\x3f\x2e\x88\x30\x35\x4f\x66\x3f\x7f\x09\x6d\x61\x8a\x0a\xbc\x6f\xe4\xd3\x2a\xbd\x37\xe0\x59\x11\xb1\xfb\xd0\x37\xf5\x72\x38\x57\xa0\xe3\xc7\x50\xcd\x7e\x83\xe4\xa1\xc3\x11\x7b\x7e\x29\x59\x14\x30\xf1\xff\xc7\xb1\xfb\x8f\x52\xb7\x2c\x9c\xdb\x81\x6d\x73\xbe\x44\x85\x56\x8d\x8b\x39\x74\xa1\x15\x6b\x39\x64\x02\x47\x1b\x37\x56\x35\xeb\x92\xb9\x83\xbf\xfe\x79\x46\x90\x8f\xd7\x1c\xde\x4a\x93\xdf\xab\x94\x58\x8d\x1c\xca\x94\x68\xa1\x09\xbd\x86\x37\xfc\xad\xe0\xdc\x88\x61\xae\x6e\x6c\xe2\x31\xeb\x9f\x5b\x17\x61\x0c\xcf\x92\xd7\xbe\xbd\xfd\x26\xeb\x86\x30\x49\xfc\xa2\xf6\xa7\x06\xf5\x45\x28\xb7\x7d\x24\x87\x5b\x86\xc9\x91\x87\x48\x14\xbf\x08\xbc\xf0\x47\x7d\xd6\x72\x85\x40\x61\x7e\x74\x59\xe4\xdd\x54\xac\x51\xf1\xe0\x88\x02\x83\xfa\x8f\x71\x25\xa3\xb8\x8c\xca\xf1\x2d\xef\x2e\xb3\x71\x48\x6d\x9b\xfc\xbb\xb7\x2d\x52\x06\x65\x2e\x83\x32\x0f\xd8\xb9\xc9\x8a\x62\xc1\x07\xc8\x18\x3e\x77\xf6\x7c\x58\xed\xeb\x0d\x64\xf3\x4c\x96\xe3\x59\x1b\x10\x25\xca\x96\x77\x80\x2e\xc8\xe3\x7b\x5e\x28\xed\x3e\xe4\x4b\x2a\x0a\xc0\xa3\xf9\x7d\x82\xc2\x62\xd8\x31\xf9\x77\x6f\x48\xf0\x29\x2c\x20\x48\x09\x85\x62\xf8\x7f\xf6\xe6\x3f\xdb\x8f\x5f\xe4\x97\x76\x72\x74\x2b\xdd\xb5\x48\x8c\x1c\xe6\x6a\x7b\x7a\x6e\x05\x36\x66\x15\x92\x0f\x6d\x3f\xf0\x3e\x0b\x67\x96\x08\xf7\x04\xdc\xfe\x77\x75\xbf\xf5\x80\xff\xd2\xdb\x62\x92\xa1\x9c\x4a\xbd\x94\x59\x21\xf9\x1d\xab\xe8\x9a\xb9\x47\x7e\xba\x1f\xeb\xcf\xbf\xd5\x34\xb3\x23\xdc\x7c\x46\xd4\xf9\x35\x40\xe8\xdf\xd5\xfd\xd6\x7f\xff\xc3\x41\x05\xc0\x32\x38\x3e\x35\xb8\xff\xee\x13\x0b\xc6\x05\x20\x60\x22\x48\xee\xd8\x1f\x85\xfa\x73\x1c\x67\x99\x04\x39\x4c\x34\x86\xe2\x5e\xa9\xcc\x91\xd8\x8c\xca\xeb\x7c\xd8\x7e\x10\x7b\xe3\xe5\x04\x67\x82\x43\xb1\xf3\x37\x72\xc1\x94\x3f\x47\x71\xa6\xd9\x7d\x52\xd5\x01\xdc\x95\xce\xb1\x3a\xa9\x65\xf0\xb4\x90\x09\xb7\xdc\xdd\x8b\x44\xb1\x33\x8b\xaf\xab\x50\x6d\x3d\xbf\xfe\x28\xd5\x1a\x84\xf0\x34\x6c\x43\x28\xc3\xa3\x36\xde\xed\xbe\x0e\x95\x88\x56\x9b\xe6\xab\xa8\xde\x26\xb0\x1c\xe8\xec\xf3\x02\x4a\x1c\xff\x28\xbd\xc4\x9a\x67\xf7\xca\x83\x77\xdf\x80\x2c\x90\x93\x64\x3c\x00\x77\xa7\x5c\x77\xdb\x9c\x6d\xca\x41\xec\xd8\x35\x32\x46\x3d\xee\xdd\x1f\xa5\xd7\xee\x4e\x50\x24\xbd\x1b\xce\x3f\x67\x63\x02\x18\x55\x4f\xa5\x73\x1a\x96\x37\xa8\xb0\x74\xf4\xc5\x2b\x5e\x1b\x7b\xa3\xf1\xbd\xfc\x8f\x52\xbb\x3d\xc1\x65\x73\x03\x7d\x8e\x79\x94\x36\xf5\x5d\x99\x9a\x61\xe1\x6f\x37\xae\xce\x4e\x4a\x4f\xba\x7e\x0e\xbc\xd6\x7c\xba\x4e\xf6\xcf\x7b\xd3\x45\x8e\x2e\x5e\xf7\xf1\x28\x67\x53\xd2\xf2\x1a\xb5\xd1\xcd\xca\xa4\x58\xc4\x75\x9c\xb2\x22\xf3\x27\xb8\xa0\x52\x40\xcf\x64\xf0\x47\x29\x3f\x98\x9b\xea\xc4\x26\xd1\x39\xf4\x42\xbe\x69\xcb\x7a\x6e\x2d\x5c\x3c\xad\xd8\xf5\xc1\xfa\xed\x72\xea\xe0\x8b\xc5\x6e\x61\xcb\x7f\x94\x86\xbd\x5f\x5d\xb0\x5d\xb4\x79\x2c\xbf\x4f\x6c\xa3\x64\x1a\xaf\x24\xf6\xe5\xa2\x71\x90\x1c\xe9\x81\x4e\x29\x91\xf3\xd7\x62\xd7\xc7\x7f\xbe\xaf\x0a\x9b\xcb\xce\x49\x19\x6d\xa7\xfb\xce\x05\x4d\x5c\x24\x67\x79\x1b\x32\x3b\x59\x33\xe0\x1a\x1d\xcb\x11\x6e\xe2\x22\x55\xf8\xe7\xd9\x5c\x6c\x02\x87\x4d\x71\x8c\x8f\xe8\x71\x24\x7b\xe9\x29\xfc\x81\xb1\x58\x2f\x66\x33\xad\xae\x8b\xb2\x32\x17\xe3\x8c\xde\xcb\xdd\x1e\xff\x73\xbc\x09\xfd\x92\x3e\x7c\xc9\x4f\xd5\xcb\xde\xae\xce\xa0\x20\x1c\x5b\x12\x6f\xb4\x0a\x2a\x3f\x4e\x66\xef\xa7\x4a\x1d\x92\x71\x7d\xff\x47\x69\xe2\xf0\x57\xb1\xf8\x6a\x3d\x29\xeb\x4f\x14\xe1\xc5\xbd\xe7\x1f\x05\xde\xe1\x69\x48\x54\xf3\xe3\x27\xb5\x64\x93\x75\xbd\xf8\xba\xf8\xcf\xdb\xae\xa2\x14\xb6\xce\xc8\xf9\xd3\x46\xf0\x30\x3d\xba\x6a\xd5\xee\x22\xfb\x34\xdb\x26\xd5\x06\xf5\x51\xe4\xcd\x82\xb6\x81\xb2\x73\xe0\x1f\xa5\x46\x1a\xfd\xe9\x5c\x67\x8d\x3b\x5d\x7d\x5c\x3f\x9c\x3d\x5b\x56\x11\x20\x25\xc5\x46\x7d\xbf\x87\x97\x6e\xdf\xfd\xac\xe7\xb4\xb4\x4f\xc0\x38\xd9\xbf\x1b\x82\x41\x72\xc7\xc7\xc7\xc7\x01\x89\x0c\xd1\x28\xbc\x61\xce\x9b\x1c\x28\x20\x70\x0a\x1b\x5e\xc0\x62\x60\x5f\xbc\xcd\x25\x14\x98\x69\x95\xad\xea\x94\x44\x34\xe3\xd1\xfa\xfd\xca\xbb\x90\x84\xef\x3d\x8d\xe3\xb7\x9d\x17\xf8\x87\x5e\x41\x30\x0a\x45\x83\xa2\x7e\x49\x2a\xa5\x84\xc2\xda\x9a\xfa\xbd\xc3\xcb\xa0\x00\x29\x29\x94\x54\x34\x80\x0e\x2d\xe1\x78\x8a\x2c\xd8\x6e\x6b\x2e\x6b\x28\xb4\x7c\xcf\x3e\x7f\x5c\x50\x71\x84\xea\xbb\xed\xeb\xcf\xe0\xcf\x26\xc9\xb7\x93\xa2\x0c\x03\x48\x10\x16\x3a\x44\x7c\x51\x78\xb8\x4e\x23\x9a\xf2\xe9\xa7\x66\xbe\x02\x93\xc3\x83\x69\x15\xc9\xef\x57\x8e\xa2\xeb\x51\x4c\x0e\x5c\xc1\xb9\x3f\xf9\x61\x2c\x24\x08\x1b\x1d\xfa\x6e\x99\x1d\xcc\x37\xc4\xff\x8d\xf9\x89\xef\xbc\x43\x65\xdb\x6e\x09\x5b\x62\x58\x9d\xe3\x40\x1e\xb0\xe8\xd7\xf5\x32\x66\x58\x08\xc6\x46\x82\x70\xd0\x21\xa9\xeb\xa2\xe9\xb4\x8d\x1f\x92\x4f\x7d\x31\x57\x1c\x7c\x4b\xf6\xc6\x34\x37\x32\xd1\xe5\x12\x7c\x4b\x1f\xf6\x1c\x8b\xbb\xea\xca\x0b\xe3\x20\x41\xb8\xe8\xd0\x7b\x92\x4f\x01\xc7\xad\x17\x68\xf3\xcb\x2b\x83\x75\x3e\x5d\x58\x21\x5b\xa1\xd7\x28\x6b\x0a\x11\xff\x6e\xdb\xc7\xea\x37\x23\xe3\x06\xe3\x22\x41\xa7\xd0\xa1\x16\xea\x55\x1d\x40\x0f\x77\x43\xe2\x54\x42\xb9\x40\x21\x33\x10\x57\x08\x8b\xef\x2c\x4d\xe7\xf7\xde\xf6\x23\xd9\xa5\xaf\x50\x80\x4f\x21\x41\x78\xe8\x50\xd8\x73\x9b\xb9\x36\xeb\x3d\xce\x8d\x4c\xec\x1f\xb3\x5e\x3d\x5b\x90\x5a\x4f\x99\x3b\x84\xdf\x7e\x85\x49\x2d\xa9\xfe\x88\x5f\x13\xc6\x43\x82\xf0\xd1\x21\x03\x14\x23\xea\xd3\x95\xc7\x7d\x36\xd1\x6f\x2f\x3d\xf9\x6c\x56\xcb\x39\x01\xe9\xce\x4d\x9c\x27\x20\xd0\x22\x3a\xce\x55\xf2\x76\x81\xf1\x91\xa0\xd3\xe8\x10\x3f\xab\xb3\x40\xb8\xf6\xaf\x27\xaa\x2f\x16\xa3\xee\x25\xea\xef\x0b\xbe\xbe\xd6\xa9\xae\x78\xbd\xff\x0b\xd6\x93\x1b\x12\xcf\x6b\x1c\xe0\xd3\x48\x10\x01\x3a\x74\x8d\xe6\x80\x84\x92\x75\x60\x42\xb6\xe8\x9a\x40\x9d\x50\xe4\xee\x33\x19\x05\xd1\xc4\xf1\x6e\x77\x6e\xb6\x26\x99\xf5\x08\x1f\x3e\x98\x00\x09\x22\x44\x87\x2c\x38\x9f\xc4\x9d\xd1\xbb\xf8\xc4\xae\x6d\xf9\xd5\x1b\x43\x03\xea\x03\x86\xb0\x3b\x34\xfc\xed\x81\x9a\xb4\x16\xf7\xc2\x28\xd5\xb1\x60\x42\x24\xe8\x0c\x3a\x74\xf3\x61\x7c\x47\x46\x56\xed\x69\xec\xdb\x36\xf7\x58\x27\xf6\x29\x3c\x70\x64\x82\x3b\x4f\x9f\x4a\xd0\x7d\xe5\x48\x63\x3b\x9b\x4e\x05\x9f\x41\x82\xce\xa2\x43\xbc\xa5\x3f\x09\xb0\x59\xbb\x2c\x70\x3b\x3e\x1b\xda\x71\x1e\x42\xf5\x57\x70\xb3\x1e\x79\xbd\x50\x10\x2e\x23\xa4\x3e\x65\xf0\xda\x08\x3e\x8b\x04\x11\xa1\x43\x54\xed\xa0\x14\x49\x92\xea\xfe\xc7\x67\xbb\x75\x86\xdd\xc3\x0c\xfa\xd8\xcd\x93\xfb\xc2\x53\x13\xe5\xda\x85\xcb\x3c\x5d\xa1\xb4\x30\x11\x12\x44\x8c\x0e\xf5\xe0\xae\xba\xab\x36\x7d\xe9\x6d\x3e\x50\x50\xd4\x79\x96\xe8\xee\xf0\xc4\x91\xd6\xf3\xf6\x96\x1a\x41\x27\xc5\xdc\x3b\x12\x65\x1b\x98\x18\x09\x22\xc1\xd8\xd7\x4c\x34\xf3\x97\xf9\x2b\x15\xaa\xe1\x3a\x45\x0e\x9b\x88\x9d\x98\xfd\xfc\xaa\x87\xdc\xa6\xe5\x0d\xe7\x09\x57\x5b\xef\xb8\x70\xc0\x24\x48\x10\x29\x3a\xc4\x49\x90\xe4\xff\xc8\x7e\x97\x75\x2c\x64\x89\xd1\x4f\xe7\x8d\x27\xa9\x9f\xdb\xb3\xab\x65\xd1\xb5\x25\x4f\x1c\x2f\xfe\x70\x5a\x04\x61\x52\x24\x88\x0c\x1d\x0a\xaf\x4b\xe2\xb0\x8b\x13\xbb\xf4\xb5\x5b\xca\x51\x69\x93\xbf\x24\x5b\xe5\x97\x6b\xe5\x42\xd0\xfa\xa7\x3d\x1e\xcb\x8b\xe3\x91\xc2\x30\x19\x12\x44\x8e\x0e\xdd\x2a\xd5\x70\x7c\x3e\xe6\x52\xb7\xe1\x87\x1d\x3f\x30\x5c\x63\x69\x36\xe0\x82\xe7\xfa\x65\xb4\xf2\xf8\x30\x00\x5c\x6a\x34\x61\x87\xc9\x91\x20\x0a\x74\xa8\x5c\x45\xf4\x97\x11\x36\x71\xed\xb3\x17\xf7\xa2\x9f\x9c\xaa\xd1\xac\xd3\xb0\x4d\x23\x53\x23\xdc\x67\x3f\x52\x52\xd3\x76\x3c\x7b\x0d\xa6\x40\x82\x28\xd1\x21\x3d\x70\xaa\x7a\x0a\xb5\xc7\xce\xbb\x1a\x94\xf0\x5d\xa0\xbd\xea\x87\x62\x44\x5b\x8f\x6a\x79\xe7\xf3\xfe\xd5\x80\x1f\x2d\xe5\xd7\x60\x4a\x24\x88\x0a\x1d\xf2\xf5\xc1\x15\xa4\x23\xcd\xba\x7b\xff\x87\x44\xa1\x91\x61\x71\xc4\xba\xc5\x9e\xc2\xe5\x7b\xe7\xde\x54\x34\xe0\xb4\x49\x4e\xb1\xd0\xc1\x54\x48\x10\x35\x3a\x34\xfd\x3a\x2a\xc2\x57\x82\x42\x2d\xa4\x95\xe8\xfd\xbd\x8a\x49\xc3\x77\xc0\x70\x5f\x6d\x5a\xf4\xfb\xc6\x04\x0d\x7b\x29\x78\x8e\x04\xa6\x46\x82\x40\x10\x5d\x9a\x27\xf8\x26\x5c\x1c\x1e\xe3\xd4\xcc\x4c\x95\x70\x0d\x7f\xb0\x7c\x0c\x0b\x8c\x31\xf7\xce\x63\xf3\xa7\xbb\xbe\x4f\xf0\x18\x8b\x1d\x06\x41\x44\x0a\x42\xa7\xb4\x27\x6f\x8b\x93\x97\xc4\xf6\x2e\x24\x28\x30\xb8\x84\xf3\x00\x90\xeb\x91\xed\x3e\x43\xd8\xb0\xf9\x23\xe9\xf0\xc5\xc7\x4e\x34\x30\x08\x21\x52\x34\xe8\xd4\x72\x4a\xc0\x14\xd4\xe5\xe7\x12\xf7\x60\xe8\xf8\x86\x15\xf8\xeb\x3d\x35\x73\xf7\xf3\x34\xde\xf4\x74\x02\x83\xa4\x27\x12\x6d\x1a\x30\x48\x83\x48\xd1\xa2\x53\xc1\x73\xa6\xba\x1a\x69\x05\xea\x96\xee\x0b\x4f\xdf\x8f\x9a\xca\xd7\x5d\xb4\x5c\x99\xbd\x50\x83\xe7\x67\xff\xf0\x31\xfb\x05\x0a\x76\x18\xa4\x45\xa4\xe8\xd0\xa9\xc5\xc7\x6f\xcd\x4d\x22\xbf\xb7\x8d\x2a\xbd\xf1\xbb\xb3\x21\xfa\x9d\x55\xc5\x43\xa0\x22\x85\x9a\xf1\x82\xf1\x4f\x6d\x7b\x9d\x24\x6b\x18\xa4\x43\xa4\xce\x61\x1c\x51\xae\x72\x64\x5d\x8f\x19\x71\xa2\x8b\x4e\xb9\x5d\x21\x4a\xdd\x78\xc7\x1a\xc8\xf4\xf7\x78\xa7\x4a\x71\xce\x80\x9a\xaa\xe8\x1e\x2b\x0c\x9e\x43\xa4\xe8\xd1\xa9\xa0\xe6\x17\x8e\x5b\x78\x1e\x9c\xb7\x5b\x0e\xdf\xe0\x49\x51\xde\xbc\xcb\x70\x41\xdb\xa6\xb1\xe0\xe0\xd0\xa1\xcc\xd7\xd6\xca\xd0\x1c\x06\xe9\x11\xa9\xf3\xe8\x54\x47\xc3\xf5\x67\x6b\xfb\x69\x94\xf0\x62\xca\x75\x0f\xdc\x76\xbd\xe1\x9c\xf0\x53\x83\x3b\xe2\xfc\x6a\xf8\x2d\xf9\x96\xf9\x49\x4c\x30\x78\x1e\x81\x8a\x21\xff\x77\x8d\xfb\xff\x36\x58\x20\x03\xfa\x73\x7b\x10\x51\xbf\x62\xce\x1c\x6f\xa5\x14\x3d\x8e\x99\x1a\xb9\xc2\x7e\x8e\x61\x8b\xe0\xcd\xcb\x41\x01\x5a\x5b\xf0\xbb\xf9\x85\x4e\x57\x18\x64\x40\xdc\x0c\x46\x74\xca\x27\x4b\x32\xfc\x47\x65\x45\x01\xd5\x03\xb1\xc7\x6a\x64\x89\xfe\x3c\xcb\x35\x35\xba\xef\x45\x14\x1c\x03\x9f\x24\x6c\x6a\xd7\x0a\xc1\x20\x23\x22\xc5\x84\x4e\xe5\x36\x9b\xae\xb7\x71\xb1\xd3\xea\x5e\xb7\x97\x68\x6a\x3d\x57\x62\x45\x9f\xd6\xac\xe7\x9c\x37\x79\x51\xde\x57\xe8\x6a\x28\xb3\x1b\x0c\x32\x21\x52\xcc\x18\x47\x5a\x09\xd6\x44\x27\x7c\x26\xc1\x71\x6a\xc9\x53\x70\xa7\x7b\x64\xf3\x70\xf0\xf6\x7a\xce\x92\x27\x33\x00\x4e\x7f\xe2\x09\x54\x81\x41\x66\x44\x8a\x05\x9d\xfa\xaa\xb9\x4b\x5f\x72\x89\xba\xfd\xe9\xa3\x9c\x73\x2b\x84\x66\xdf\x98\xdb\xb7\x5d\x6f\x2c\x8d\xd8\xed\x34\x99\x03\x73\x81\x9f\x8d\x61\x90\x05\x91\xba\x80\x4e\x29\x5b\x29\x37\x15\xd3\x92\x27\x75\xdc\x5f\x26\xcc\xb1\xed\x36\x8c\xbb\x1b\xa0\xe2\x33\x9f\xd0\xbf\x82\x7f\xfe\x53\xe4\x2f\x56\x25\x18\xbc\x80\x48\xb1\xa2\x53\xdc\xc4\xbe\xee\x4e\x7d\x52\xa3\xaf\xb6\xdc\x15\xa4\xbe\x28\x1e\xed\x11\xf3\xd2\x53\x7f\xc6\xbe\xe4\x53\x68\x80\x6f\xef\xd3\x6f\x0c\x83\xac\x88\x14\x1b\x3a\x25\x91\x58\x23\xf6\x73\x97\xf2\x87\xba\xcb\x19\xeb\x0f\xe6\xcc\x7a\x31\xda\xa5\x04\x76\xc5\x40\x55\x67\xef\xba\xe6\x15\xe1\xab\xaa\x30\xc8\x86\x48\xb1\xa3\x53\x4e\x53\x53\x41\xa1\x07\x81\x95\x57\xb8\x2c\xdc\xb3\xbf\x1d\xc7\x7e\xaf\xfc\x45\x7a\x6e\xec\x55\xda\x93\x17\x72\x2b\x77\xb5\xb7\xac\x61\x90\x1d\x91\xe2\xc0\xe8\x02\xa9\x7a\x27\x63\xba\x88\xd2\xa9\x7d\xc4\xfd\x86\x3d\x8c\xe4\x1b\x13\x66\xe0\x89\x17\x21\xd3\x4f\xd7\x08\x07\x6c\xc9\xf5\xc8\x60\x90\x03\x91\xe2\x44\xa7\x8e\x24\x7d\x2b\xe7\x4a\xa6\x0b\x5f\x9d\xff\xbe\x2b\x5d\x97\x24\x3c\xfe\x7a\xd2\x52\x9c\xc3\x74\x26\xe6\x33\x8e\xd8\xa7\x6b\x05\x46\x30\xc8\x89\x48\x71\xa1\x53\x43\x4f\xfb\x3b\x86\x3a\x7c\x14\xc5\xb5\x52\x76\x27\xaa\xc1\x5c\x1e\x7e\xdc\xdc\x26\x09\xfe\x92\x1a\x4f\x1c\xb3\xba\x89\x5d\x51\x18\xe4\x42\xa4\xb8\x31\xba\x0a\x3e\x65\xfc\xda\x95\xd7\xf9\xe4\x31\x36\x59\x6b\xbf\xc6\x5f\x64\x73\x64\xb2\x15\xe5\x5c\x71\x49\x1e\x92\xda\x2e\xe7\xdf\xc1\x87\x41\x6e\x44\x8a\x07\x9d\xe2\xe0\x26\xde\x61\x9e\x14\xdf\xdc\x18\x4f\x3d\x4d\xa9\x74\xfa\x2b\x1b\x75\x3c\x40\xe4\x41\x91\x63\x49\x69\xf8\xd5\xeb\xc9\x2b\x2d\x18\xe4\x41\xa4\x78\xd1\xa9\x97\xaf\xea\x59\x3f\x95\x1f\xc6\xf5\xc6\x3e\xea\x0c\xc1\x59\x41\xad\xc8\x6b\x65\x94\xe3\xbf\x2a\x64\xc2\xcd\x49\xc4\x4b\x9d\xe7\x82\x41\x5e\x44\x8a\x0f\x9d\x8a\xfa\xbe\xd6\x8f\x67\x22\x4f\x77\xcf\x5f\xb8\x2c\x52\xc2\xba\xc1\xb0\xef\xc2\x0b\xee\x80\x32\x7c\x9c\x2f\x2d\x6f\x52\x26\xab\x6f\xc1\x20\x1f\x22\x75\x11\xa3\x95\xeb\xb8\xda\x30\x1f\x5f\x6c\x00\x39\xed\xb1\x04\x90\x4a\x18\x98\x53\xe6\x09\xc6\xf4\xcd\x7a\x98\x73\xcb\x78\xab\x7c\x5b\xc2\x83\xc1\x8b\x88\x14\x3f\x3a\x25\x44\x44\xf4\xc2\x9a\xfc\xf6\x79\x0f\x0e\x27\xeb\xb2\xd7\xaa\x82\xa7\x4a\x4c\xf1\x2f\xfc\xbc\x65\xc4\xbe\x28\x3d\x5e\x50\x53\x8d\x0b\x83\xfc\x88\x94\x00\x3a\x05\xbd\xfc\x35\x1c\x6c\x37\xd3\xf9\xdd\xab\x22\xfe\x53\x56\x71\xb1\x6e\x72\x3b\xc5\xd9\x2a\x7a\xd1\x6e\x3c\xfa\x17\xbf\xb8\x8f\xb8\x60\x50\x00\x91\xba\x84\x4e\x6d\x96\x3a\x93\x8c\xa5\x7d\x4a\x96\x74\xb4\x52\x89\xbf\xe6\x66\xa1\x13\x3f\x79\x3b\xfc\x83\x99\xeb\xfb\x8f\xfb\x91\xf6\xe7\xa7\x9d\x60\xf0\x12\x22\x25\x88\x4e\x39\xde\x67\x16\x28\xd5\x70\x94\x24\x0d\xb1\xde\x16\xcd\xbd\x6b\x50\xb8\xa3\xe9\x72\xcd\xe8\xe9\x29\x03\xab\x88\x6b\xa3\xe3\x71\x52\x30\x28\x88\x48\x09\xa1\x53\xf7\x83\x7a\xbc\x76\x9a\x05\x3e\x60\xe5\x56\xdd\x8a\xb7\x8e\xa9\x92\xdc\x58\xd1\x73\x4e\x1f\x70\x7e\xee\x1c\x51\x5c\xcf\x7f\xc8\x0e\x83\x42\x88\xd4\x65\x74\x2a\x84\xf6\xad\xce\xd3\x00\x0a\x87\x1b\x9f\xf7\xc5\x9f\x29\x3a\xb3\x70\xf3\x57\x7d\xe0\xc1\x0f\x6a\x16\xf8\xc2\xf7\x96\x8a\xd0\x8c\x06\x06\x2f\x23\x52\xc2\xe8\xd4\x69\x55\x21\x6a\xc2\x9f\x1a\x6d\x87\xac\xd9\x82\xd8\xe7\x16\xfa\x0b\xaf\x96\x13\x36\x92\x5a\x55\x6b\x66\x64\x6d\x39\x0c\xba\xb2\xc1\xa0\x30\x22\x25\x82\x31\xda\x8b\xcf\x55\xd8\xd2\xfb\xa7\xdd\xb5\x36\xee\x20\x87\xdf\x03\x9f\x1f\xe1\x1b\xf1\x5f\xee\xcd\x4a\x97\xcb\xb4\xae\x6b\x64\x70\x84\x41\x11\x44\x4a\x14\x9d\xb2\x2e\xdf\x99\xe3\xa6\xeb\x2c\xeb\xfb\xbe\x7a\x41\x0e\xc7\x50\x26\x72\xde\x46\xd6\xca\xfe\x12\x69\xa3\xa9\x15\xf9\x58\xe3\x15\x2d\x18\x14\x45\xa4\xc4\xd0\x29\x69\x7b\xeb\x86\xae\xdb\x0a\x3d\x2f\x4a\x7a\xb7\xf3\xb6\x5d\x3e\x30\xa4\x6e\x32\x59\x2f\x24\xb7\x1c\xdf\xaa\x4d\x68\x6a\x78\xcd\x05\x83\x62\x88\xd4\x15\x74\xaa\x6d\x9e\x55\x90\x28\x9e\x96\xce\xd0\x70\xfd\x14\xdb\x0e\xdd\x6b\xdb\xfc\xd5\x6e\x72\xa3\xbb\x97\xe4\x55\x18\x9b\x9d\xa8\xb9\xae\xc0\xe0\x15\x44\x4a\x1c\x63\x88\x8a\x0b\xc1\xae\xa1\x17\x34\x51\x4f\xb9\x9a\x3a\x6a\xf7\x08\xfc\x4f\xbd\xee\x23\x5b\x11\x56\x0b\x74\x65\xd5\x52\x0e\xe6\x10\x81\x41\x71\x44\x4a\x02\x9d\x92\xb5\xaa\x49\xd6\xad\x72\xce\x7a\xe8\x7f\xbb\xe6\x28\x23\xcf\x63\x22\x75\x2d\xb4\x95\x56\xf1\xb2\xbc\x7f\x36\xb7\xc2\xae\x8f\x3d\x0c\x4a\x20\x52\x92\x18\x13\x61\x37\x31\x7f\x80\x5b\x42\xc5\x8b\x79\x96\x4e\xed\xf3\x6d\xac\xd3\xe2\x8a\x45\x9f\x3a\x7b\x1c\x62\xb6\x48\xec\xcd\x2a\xbd\xa4\x61\x50\x12\x91\xba\x8a\x4e\x31\x8d\x28\x92\x86\x99\xcc\xd8\x5f\xce\xe7\xbe\x45\x1c\x03\xba\x56\x87\xd1\x19\x34\xe2\x46\xa7\xa9\x68\x92\x28\x3d\xac\xc4\xb7\x83\xc1\xab\x27\x34\x64\x27\x2d\x8f\xfe\xd1\x90\x49\x61\x0c\xc4\xdd\x36\x8a\x42\x81\xa8\x22\x0e\xa5\x49\x43\x9d\x19\x37\xa9\xb9\x15\xc9\x10\x63\xe3\xdc\x1c\x50\x36\xbc\xe1\x91\xf7\x17\x0a\x18\x94\x42\xdc\x0c\x69\x74\x4a\x91\xdd\x37\x92\x4d\xb3\xa9\x5e\xaf\xff\x56\x73\xbc\xb2\x74\xe5\xc3\x39\x9a\x0d\x2d\xbf\x06\x93\x86\xb9\xd6\x5f\xc2\x7b\x6d\x2a\x30\x28\x8d\x48\xc9\xa0\x53\x56\x9d\x58\xd5\xe2\x9d\x89\x5b\x75\x02\x07\x2e\xa5\xf2\xee\x03\x4c\xad\x1a\x65\xde\x05\x62\x22\xdf\xaa\x86\x05\x22\x54\xcc\x2e\xc3\xa0\x0c\x22\x25\x8b\x4e\xa5\x53\xa5\x9c\x91\xc1\x19\xb5\x1b\xe7\x71\x91\xf8\xf2\x2e\xc4\xee\x8a\x4f\x57\x60\x76\xe7\x59\xbb\xa2\x0c\x9b\xd7\x8f\x3f\x2a\xe0\xc3\xa0\x2c\x22\x25\x87\xb1\x3c\x58\x9f\xa1\x77\x23\x3d\x29\x57\x2c\xe5\xfb\x42\x0b\x5e\xe9\xf7\x00\x9f\x7c\xd7\xe3\x6f\x93\x46\x5f\x73\x37\xde\xee\xf8\x72\xa8\xc2\xa0\x1c\x22\x25\x8f\x4e\x91\xce\xc7\xa8\x7d\x98\x7c\x1a\x69\x4d\x5e\xdb\x12\x81\xb7\xf2\x60\x82\x47\xf1\x13\x07\xad\xe7\x9d\x5b\x53\x36\x1f\x84\x5e\x79\xd3\xc3\xa0\x3c\x22\xa5\x80\x4e\xf9\xcf\x54\xdf\x9b\x6f\xea\xbc\x44\xe0\xcb\xcc\x51\xfd\x60\xf2\xa7\x5c\xe3\xdc\xf5\xfc\xa0\x8b\xa9\x3a\x5e\xb9\xe2\xac\xf6\x7a\x1c\x30\xa8\x80\x48\x29\xa2\x53\x85\xce\x05\xa9\x3d\x76\x2d\x2f\x4d\x1c\x4e\x49\xe6\xc8\x19\xb0\x18\xd7\x2f\x56\x36\x65\x46\x93\x1a\x7f\xe7\x5a\x4d\x1b\x9d\x60\x82\x41\x45\x44\x4a\x09\x9d\x0a\x0c\x25\x37\xff\xf0\xfe\xfb\x22\x25\x31\xf1\xb7\x6f\x84\x35\xe5\x5b\x6e\xe4\xa0\x6e\x92\xa3\x58\x9b\x7f\xdc\xb8\xf5\xe2\xa6\x39\x0c\x2a\x21\x52\xd7\x30\x4e\x9c\x2b\x35\xe4\xd0\x2c\x2e\x91\x53\xc3\xcd\x2d\x7f\x6d\x66\xb3\xce\x4b\xfa\xda\x24\x76\x8a\x97\xe4\x44\x73\xba\x36\x1f\x5b\x52\xc3\xe0\x35\x44\x4a\x19\x9d\x4a\xcd\x33\x4a\x53\x11\x8b\x81\x6d\x9f\x31\x11\xc6\x72\xd7\x86\xbb\x49\x51\xa6\xec\xd3\xde\xc9\x4a\x22\x7e\xef\xad\xaf\xcf\xa4\x04\x83\xca\x88\x94\x0a\xc6\x72\xc1\x7e\x4b\xf9\x9e\x39\x85\x5a\xcd\xb9\xe8\xcc\x86\xb0\x81\x68\x96\x5c\xe2\xc3\x01\x09\x93\xcb\x55\x2f\xf4\xc2\x43\xae\x07\xb1\xc0\xa0\x0a\x22\xa5\x8a\x4e\x61\x91\x8e\xd7\xfb\x6d\x48\x50\xda\xc7\x3a\x6a\xaf\x6d\xd0\x37\x8a\x70\x77\x17\x55\x68\x99\x5d\xae\xaa\x5b\xfb\x90\xb6\xc2\xad\x0f\x83\xaa\x88\x94\x1a\x3a\xe5\xa6\x92\x75\xcb\x87\x91\x5d\xae\x8a\xd0\x83\xf6\x71\xb4\xcd\x97\x49\x0b\x09\x27\xc7\x00\x05\x0d\x55\xd7\x4a\xad\xce\x31\x58\x10\x06\xd5\x10\x29\x75\x8c\xa3\x52\xa6\x27\x3b\x11\x8f\xe4\x27\xb7\xe1\x63\x31\xe6\xf2\xba\xc4\xee\xa8\x8a\x08\x22\x1c\x48\x9f\x09\x6b\xc8\x70\xa4\x42\x16\x17\x06\xd5\x11\x29\x0d\x8c\x8e\x73\x41\x86\x47\x1e\x0c\xc4\x89\xa4\xb4\x16\x1c\x2d\xf1\x5b\xd9\x7f\x19\x56\x75\xcb\x87\x43\x80\x48\x01\x95\x65\xc5\x66\x80\x0b\x83\x1a\x88\x94\x26\x3a\x65\x7e\xe7\x50\x10\x7b\xbb\xee\x17\x8b\xad\x6f\x10\x1b\x71\x24\xee\xd5\x02\xdf\xa3\x30\x23\xd4\xd3\x55\x49\x95\xc0\xb5\x07\x3a\x17\x60\x50\x13\x91\xd2\x42\xa7\x28\xb4\x83\x6f\x9b\xf0\xe1\x90\x71\xc6\xbb\x69\x39\x5f\x5c\x1f\x26\xd5\x31\x29\xb7\x2f\xa3\xd0\xef\x4a\xd8\x10\x98\x88\xad\x66\x84\x41\x2d\x44\xea\x3a\x3a\xb5\x17\xca\xef\x35\x3c\x49\xf1\xcd\xc4\x3a\xdb\x7e\xbd\xaa\x3f\x19\x3c\xf8\x40\x77\x6a\x38\x94\x86\x75\x25\x3d\xef\xae\xd3\x59\x10\x06\xaf\x23\x52\xda\xe8\x94\x24\xf4\x09\xa0\x9f\xed\x64\xee\xf2\x7c\x7a\xe1\x06\x9f\x89\x40\x90\x77\xb4\x22\x09\x65\x9a\xb7\xa0\xe8\xf9\xf7\xd3\xf2\xfc\x8c\x30\xa8\x8d\x48\xe9\xa0\x53\x37\xca\xcb\xb2\xea\x75\xc4\xf9\x5b\x86\x68\x2f\x2f\x3d\xe8\x56\xaa\xbc\x26\x93\x00\x1b\x2c\x87\x9b\x75\x1d\x4a\xb1\x86\x46\x61\xc3\xa0\x0e\x22\xa5\x8b\x4e\x1d\xe2\xb8\xb2\xcd\x2d\xf6\xb9\x2a\x3e\x4c\x27\xc0\x02\xe9\x13\x15\x0d\x68\xb7\x13\xe8\xaf\x49\x37\x0d\x72\xc6\x4f\xd9\x9c\xe3\x85\x41\x5d\x44\xea\x06\x3a\x45\xb6\xa7\xf1\x54\xf9\x94\x0c\x16\x5f\x4a\xa6\xa5\xc0\x4e\x68\x14\x2f\x87\xfe\x13\x53\x1a\x99\xb3\x2e\x31\xb2\x7d\x5a\xcc\x63\x4e\x30\x78\x03\x91\xd2\x43\xa7\x46\xb0\x89\xd8\x1e\xa6\xf1\x7d\x12\x8d\x56\x76\x1d\xc5\xdd\xd8\xe1\xbe\x74\xcf\x99\xcf\xfd\xbc\x72\x78\xa9\x18\x8b\x15\xf9\x02\x2d\x0c\xea\x21\x52\x37\xd1\x29\xda\x2e\xc2\xc0\x4d\xff\x92\xc7\x40\xaa\x59\xa9\xb6\xf1\x5d\x2c\x31\xd8\xb1\x33\xc8\xd0\xcf\xb7\x9b\xa6\x3b\x1d\xba\x1b\x20\x05\x83\x37\x11\x29\x7d\x8c\x7d\xb0\xba\x20\xb7\x44\x40\xc9\x40\xcf\xe9\x6d\x39\xa8\x0d\x38\x06\x93\xa4\x58\x10\xf2\xd4\x41\xf8\xd3\x13\x9c\x17\xf8\x71\x00\x18\xd4\x47\xa4\x0c\xd0\xa9\xb2\x9a\xca\x90\x77\xe3\x87\x14\x81\x55\x51\xef\x59\x74\x03\xaf\x87\xf5\x2a\xce\x3c\xb5\x8c\xb6\x63\xaa\xe5\xcf\x36\x55\x29\xe2\x81\x41\x03\x44\xca\x10\x63\x86\x8c\x95\x21\x74\x4f\xf6\xc1\x1c\x55\x82\x68\xe4\x6d\x56\x15\x6e\x05\xf7\x7b\xf8\x3b\xea\xc9\x3d\x4e\x06\x9f\xef\x18\x9b\xd3\x88\xc3\xa0\x21\x22\x75\x0b\xe3\xaa\x04\xfd\x68\x2f\x73\xf7\x4d\xf9\x7c\x92\x9f\xe4\xaf\xda\xaf\xc8\x6c\x13\x0c\xcb\x32\x79\xdd\xef\x1f\x3e\xef\x6d\xfc\xb1\x2f\x57\x18\x06\x6f\x21\x52\xb7\x31\x2e\x94\xd5\x33\x7c\x9b\x99\xc7\xd6\x2d\xfd\x2c\xe3\xd9\x99\x25\xb6\xc2\x97\xb1\xc8\x96\x9e\x91\x9f\xa4\x91\xaa\xaa\xfb\x76\x30\xde\x0a\x06\x6f\x23\x52\x77\xd0\xa9\x89\x04\x6c\xef\x7c\x41\x22\x05\xe3\x0f\xb1\xe1\x2f\x70\xaa\x9a\x15\xbb\x58\x0c\xed\x0a\x19\xbc\x45\x51\x22\xbe\x5a\x75\xa1\xea\x30\x78\x07\x91\x32\xc2\x58\x79\x19\x4f\x8f\x5c\xfb\x56\xe8\x78\xc6\xfa\xd6\x60\xca\x71\x4b\x17\xe5\x8c\xd1\x77\x8a\x19\x1d\x0d\xdd\xa5\x0d\x29\xcb\xfb\x63\x5c\x30\x68\x74\x42\x43\x76\xd2\x45\xe8\x3f\x1a\x32\x63\xf4\xe7\x76\xc5\x52\xa5\x5b\x6d\x3f\x8a\xd5\x7a\x98\xba\xee\x07\xb7\x94\x9d\x53\xac\x26\x97\xfc\x35\x53\xed\xe2\xb9\x9f\xa3\x4c\x70\xc8\x06\x83\xc6\x88\x9b\x61\x82\x4e\xe9\xfb\x86\xf6\xba\x84\x0d\x9e\x61\x4c\x7a\x6a\x90\x6b\xe3\x63\xa3\x26\x2b\x16\xb7\x96\x78\x30\xfb\xa3\xca\x4d\x34\x51\x55\xc5\x04\x06\x4d\x10\x29\x53\x74\x2a\x5e\x6c\xe0\x4c\x9e\x5a\x1f\x38\x7f\xf7\x9a\x6f\xb9\xfc\xb7\x55\xb5\x3e\xac\x37\x31\x57\xd7\x7b\xbf\x5b\x65\x8a\x0d\x6b\x4d\x02\x30\x68\x8a\x48\x99\xa1\x53\x2a\xc5\xc6\xa1\xcd\x8e\xa5\x5d\x81\xef\x9e\x17\x27\x64\x26\xa5\xfc\x94\x6a\xbe\xd3\x57\x5d\x86\x4f\xa7\x5e\xec\xfd\xea\xa2\x28\x3e\x0c\x9a\x21\x52\xe6\xe8\x14\xdd\xde\x25\x1c\xfd\xc2\xe7\x36\xc7\x63\x25\x02\x71\x9a\x37\x62\xa8\xae\xcf\xc6\x8f\x72\xe0\x85\xb0\x9c\xa9\xd0\xe1\x51\xbe\xc1\x04\x83\xe6\x88\x94\x05\x3a\x15\xa7\x48\x7e\xf3\x86\x80\x2b\x31\x03\x5d\xe3\xab\x5b\x6b\xa6\xcf\x3f\x15\x1f\x57\x47\x73\xb0\xce\x7c\x99\x0c\x3d\xa3\x8f\x73\xc7\x1c\x06\x2d\x10\x29\x4b\x74\xaa\xf7\xca\xe9\x2f\x04\x14\xfb\x5c\xc1\xc3\x0f\x28\xe9\x1a\x7c\xc1\xa0\xcf\x5d\xad\x99\x91\x8d\xcb\x37\xec\x89\x57\xe6\x8c\x8f\xf4\x61\xd0\x12\x91\xb2\x42\xa7\xbc\x4a\x2c\x02\x9f\xf5\xbb\x88\x5c\xc5\x1f\x1d\xa3\x6c\x90\x37\x56\xa3\xaf\x96\x16\xd5\x98\x3a\xd7\x58\xde\xf8\x6d\x69\xba\x53\x0a\x06\xad\x10\x29\x6b\x74\x6a\xb4\x26\xa0\x97\x78\x78\x2b\xb6\xdb\xca\xac\x3e\x1d\x2b\x29\xe8\xb6\x07\x89\xc7\xb9\xc5\x61\x35\xbf\xcb\x4a\x8a\xcd\x9b\xc5\xc6\x30\x68\x8d\x48\xd9\xa0\x53\x25\x1b\xf4\x6a\x4e\x63\x4e\x38\x56\xeb\x91\x95\x96\x97\x93\x9f\x68\x1f\xa8\xcf\x11\xe7\x35\x50\x66\x25\xf1\x6b\x3d\x6b\x6c\x72\x83\x41\x1b\x44\xca\x16\x63\x3d\xb8\x70\xe5\xb1\xf9\x83\xc1\xf8\xd6\xa4\xe3\x65\x5c\x67\x67\xf3\x53\x8c\x39\x3e\x6d\x6f\x2c\x08\x35\x55\x3f\x98\xd3\xef\x98\xd3\xc1\xa0\x2d\x22\x65\x87\x71\x3d\xf9\xd7\xb6\xe7\xa3\x5c\x0d\x09\xde\xc0\x3b\x0f\xfd\xd7\xdf\x27\x11\x3e\x77\x92\x8f\xe2\x8d\x35\x0f\x88\xd3\xa1\x4c\x67\x14\xd5\x86\x41\x3b\x44\xca\x1e\x9d\x3a\x5f\xb1\xe5\xee\x27\xfe\x3d\x3e\x77\x66\x44\x39\xc5\x34\x42\x95\x24\x49\xa1\xce\x43\x08\x85\x7a\x75\xa6\xfc\x59\x15\x8e\x88\x10\x0c\xda\x23\x52\x0e\xe8\x14\x25\xbb\x79\xb3\xef\xf2\x2c\x16\xd6\x6a\xd0\x3c\xe5\xaa\x35\xf5\xd9\x07\x63\xa5\x56\x9a\xb1\xe7\x22\x02\x65\x1c\x1e\x2f\xe8\x6b\xc0\xa0\x03\x22\xe5\x88\x4e\xbd\x91\x67\x9e\x4d\x1d\x13\xb3\xc1\x13\x52\x60\x24\x71\xa0\x48\x38\x64\xcf\x7e\xfb\xa9\x76\xc6\xd1\x42\xa6\xd3\xa5\x8e\x91\x87\x1b\x06\x1d\x11\x29\x27\x74\x4a\x7c\xe6\xce\x20\x95\x7a\xbb\x5b\x5e\x7a\xef\x26\xc5\x85\x89\x19\x3b\xdd\x0e\x0b\x81\x99\xfc\x24\x51\xad\x85\x2a\x3e\x3c\x2f\x41\x18\x74\x42\xa4\x9c\xd1\xa9\x0a\x0d\xf5\x0e\xae\xc0\xa0\x4e\xe0\xfd\xf9\x64\x8e\x90\xdd\xd7\x25\x65\xf7\xed\xf6\xce\x4e\xb7\x76\xfd\xea\x0d\x4d\x2e\xf1\xc7\x83\x41\x67\x44\xca\x05\x63\xb4\x6b\x32\x31\x39\x65\x1c\x6d\xa7\x34\x79\x1c\x74\x2d\xbe\xf8\x7a\x86\x39\x4b\x80\x29\xd6\xc8\xed\x3a\x7d\x7a\xc9\x0a\xdb\x47\x11\x18\x74\x41\xa4\x5c\xd1\xa9\x8f\xfc\x5a\x0f\x44\xd3\x3d\x8d\xc6\xda\x46\x8b\x0d\xb2\xe5\x35\x2d\xa7\x4c\xe6\xea\x6d\x2f\xa6\x18\xec\xb7\xb1\x06\x76\x4d\x98\xc2\xa0\x2b\x22\xe5\x86\x4e\x65\xc7\xcb\xba\xc5\x51\xbf\x2e\x65\x18\x7f\x12\xa9\xe0\x86\x63\x9a\x7a\x2a\xe1\xf5\x2b\x2d\xd0\xf0\xaa\xdc\x25\x37\xd7\x2a\x49\x32\x18\x74\x43\xa4\xee\x62\x2c\x2d\xdf\x18\xa9\x2c\xf0\x58\x4b\xda\x3b\xe4\xfa\x34\x3e\x19\xe3\x51\xec\x98\xfd\x58\x05\x37\x2f\x97\xad\x36\x42\x9a\xd5\xe4\x97\x1a\x0c\xde\x45\xa4\xdc\xd1\x29\x9d\xef\xc1\xcd\xfe\x8f\x0b\xf7\x94\xb8\x1c\x0b\x34\x7b\x53\x0f\xfd\x5e\xf4\xb1\xc2\x1d\x14\x9f\x42\xba\x77\xbe\xc9\xbd\x40\xd9\xc2\xa0\x3b\x22\x75\x0f\x9d\xe2\x12\xb9\x89\x67\xd3\x5b\x31\xdf\xa2\xa1\xdb\x64\xbf\x99\xfd\xda\xd8\xb1\xee\xa0\x20\xe1\x98\xf2\xd2\x6c\x5c\xe0\x97\xc5\x63\x21\x18\xbc\x87\x48\x79\xa0\x53\xf2\x92\x3f\x4c\xde\xe6\xd3\x36\x31\x77\xe5\xc6\xb5\xb9\xdc\x6b\x5a\x72\xcd\xfd\x69\x7c\xcb\xfe\x56\x91\x8a\x1e\xa1\xce\x01\xae\x2a\x0c\x7a\x20\x52\x9e\xe8\x54\x67\xd2\x79\xf8\xbe\xe6\x24\xf9\x69\x51\x58\xf8\xdd\x25\x93\x7b\x10\xe5\xb7\x85\xd0\xb1\xa1\xd7\xe5\xb2\xf3\xc4\x26\xad\xad\xd8\x30\xe8\x89\x48\x79\xa1\x53\x4f\xe2\x99\xb0\xc2\x2e\xb6\x48\xf9\x6e\x13\xac\x1f\x1b\x12\x8c\x8e\xd8\x61\xd5\x5f\x61\x68\x36\xf7\xc6\x49\x64\xbc\xf2\xc3\x10\x80\x41\x2f\x44\xea\x3e\x3a\x75\x46\x21\x47\x86\x7a\xf2\x4e\x59\xfd\xc0\x2a\xc3\x81\x7b\x91\x27\xa3\x4d\x19\x65\x5b\x00\xe5\x9a\x2c\x1f\xf7\x41\xe3\x2a\xbf\x0c\x0c\xde\x47\xa4\xbc\xd1\xa9\x52\xe1\x7e\x82\xe2\x83\xe9\x74\xd2\xc4\x91\x9b\x4f\x4d\xcd\x80\x99\xbe\xd0\xfb\xee\x9d\x93\x82\xe7\x82\xd5\x32\x59\x3a\x47\xc4\x61\xd0\x1b\x91\xf2\xc1\x58\x2e\x11\x11\x1c\x58\xf0\x89\x49\xf3\x4b\x8c\x9c\x25\xd6\x59\x88\xbb\xbc\xba\x53\x7b\x2f\x57\x98\x44\xd8\xc4\xe1\xe6\xcb\x84\x00\x73\x18\xf4\x41\xa4\x7c\x31\x76\xe7\x78\x6b\xa2\x5d\x9e\x4e\xff\xaa\x2b\x91\xc7\x6d\x79\xc9\x36\x82\x45\xfb\xd3\x14\xf5\x4a\x92\xf5\xed\x9d\x1e\x2d\x2a\x80\x3d\x0c\xfa\x22\x52\x7e\xe8\x54\xc4\xb5\x61\x1e\xd0\x95\x77\x3b\x9f\x4f\xfb\x26\x97\x71\xea\x46\x50\xd7\xa5\x94\x63\xf9\xb5\x4d\x87\xaf\xaf\x50\x24\xcd\x3a\x6c\x30\xe8\x87\x48\xf9\xa3\x53\x76\x22\x11\x37\x78\x49\xb2\x28\x6f\xd1\x56\x2f\x37\x5d\x79\xe6\x6d\x15\xcc\xd0\xf6\x76\x34\x34\x71\xba\x53\x7c\x2b\x25\xf6\xa2\x04\x0c\xfa\x9f\xd0\x90\x9d\x74\xab\xdf\x1f\x0d\x59\x00\xfa\x73\x67\x2d\x9a\x8e\xf2\x7e\x08\xaf\x4b\xe1\xfa\xba\xcd\x81\xff\x32\xf4\xa5\x4d\xcd\xa9\xae\xab\x7a\x38\xfa\x7a\x62\x7e\xa3\xb7\x78\x85\x60\x30\x00\x71\x33\x60\x8c\x59\xd4\xd1\x03\x1a\x85\x85\xc8\x1f\x55\x4e\x69\xc9\xec\x3c\xf1\x23\x17\x8d\x22\xbe\xbe\xc1\x3d\xb8\x3c\xf5\x30\xb5\xd7\x4c\x81\x4c\x09\x06\x61\x44\x2a\x10\x9d\x4a\xc8\x81\x1c\xc3\x82\x05\x0a\x6a\xaa\x6f\x2c\xeb\x3c\xcc\xa1\x14\xeb\x25\x26\xc9\x09\xe3\x77\x03\x72\x3d\xc8\x56\x89\xda\x5c\x60\x30\x10\x91\x0a\xc2\xb8\xc6\xa1\x2b\xe1\x9a\x5c\xc5\xe0\xf8\xb9\xd1\xb1\x90\xf1\x4d\x58\x4c\x9a\x6e\xc6\x0c\x3d\x6c\x73\x47\x99\x03\xfb\xa9\xa5\x4a\x8f\x10\x0c\x06\x21\x52\xc1\xe8\x94\x0b\x38\x7e\xab\x42\x5a\xf7\x3e\xdb\x63\xcd\x76\x4a\xd0\x8f\xf3\xe5\xa3\x1c\xbf\xa6\xba\x99\xb6\x0f\x81\x1b\xda\x02\x29\xd7\xec\x61\x30\x18\x91\x0a\x41\xa7\x8a\x7f\x3a\xff\x2a\x59\x62\xca\x3c\x2d\x59\xdc\x52\x21\xa3\x6c\xc0\x91\xa2\xce\x58\x9a\xce\xcb\xbc\xc3\x1c\xfd\x54\xd9\x65\x99\x1f\x06\x43\x10\xa9\x07\xe8\xd4\xda\x11\x03\xe9\xf7\x11\x27\x4d\xf9\x35\x05\x29\x4b\x17\x15\x95\x87\xbb\x1b\x84\x8a\xa5\x0f\xc3\x54\x73\x1a\x4e\xf1\xad\x3d\xa6\x82\xc1\x07\x88\x54\x28\xc6\xb2\x76\x7f\xb1\x18\x69\xc8\x3d\x1c\xf0\xd7\x8f\xfb\x7b\xce\x25\xbe\x19\x77\x6c\xd6\x7f\x71\x8c\xcc\x2e\xb6\xe7\x31\x93\x3f\xa4\x93\x81\xc1\x50\x44\x2a\x0c\x9d\x7a\x5e\xd2\x47\x47\xa4\x4c\xcd\xe4\x81\x93\xd3\xb5\x96\xcb\xe3\x48\x4d\xc1\x14\x46\xaa\x43\xc5\xfc\x43\xe4\x81\x6a\xa9\xdf\xe2\x79\x18\x0c\x43\xa4\xc2\xd1\x29\xbe\x39\xcb\xaf\x8c\x63\x12\x97\x56\x75\x62\x82\x1b\x1c\xdb\xe0\x8b\x90\x2c\x16\x5f\x3d\x4b\x6e\x1e\x19\x7c\x7a\x53\xc8\xd4\x0c\x06\xc3\x11\xa9\x08\x74\x0a\x9c\xe6\xf2\xc9\xb1\xa8\x0e\xdb\x70\x53\x9e\x5c\x7c\x1f\x7c\x5e\xbf\x60\x25\xfa\x62\x9e\xd8\x9b\x27\x05\xe6\x2c\xf2\xbd\xfd\xc2\x30\x18\x81\x48\x45\xa2\x53\x66\x74\x5b\x74\xe6\x6e\xef\xb4\x4f\xf7\x9e\xfa\x61\x88\xe3\xef\x73\x60\x35\x71\x51\x36\xda\x33\xe4\x50\xcf\xe8\x5e\x6f\xc6\x03\x71\x18\x8c\x44\xa4\xa2\xd0\xa9\xdb\x2b\xfc\x46\xce\x9b\xa3\x3a\x7a\xc5\xf4\x11\xb8\x1c\x0f\xdf\xf3\x47\xbf\xb8\x49\x71\x79\xf9\xa6\xc4\x8d\x50\xa1\xab\xf7\x18\x2f\xc0\x60\x14\x22\x15\x8d\x4e\xc5\xaa\x3c\x7c\x4d\xc7\x41\x1a\x51\xf4\x91\x46\x6d\xe7\x15\x27\x4f\xdd\x91\x63\xad\x63\xd3\x60\xba\xa8\x2b\xee\xe8\x90\xbc\x88\x2c\x0c\x46\x23\x52\x0f\xd1\x29\x82\x0b\x41\x8d\xe1\x5f\x8e\xab\x34\xcf\xda\x06\xf3\x4f\x75\x97\xc4\xeb\xe1\xb6\x4e\xfa\x99\x3a\x3a\xb4\xf2\x8f\x97\x5d\x7e\xc6\x01\x83\x0f\x11\xa9\x18\x8c\x39\x83\x8a\xb7\x32\xc1\x73\x8f\xd3\xf5\x1c\xd9\x72\xc4\x45\x61\x39\xa6\x97\x81\x51\x9c\x6c\x92\xdd\x4c\x91\x79\xf2\x8b\xa2\x2f\x4c\x60\x30\x06\x91\x7a\x84\x71\x8d\x23\xab\xe1\x01\xf3\xaf\x02\x9f\xd7\x81\xea\xf9\x35\x03\x49\x29\x05\xe7\x36\xec\xb9\x80\xd7\xbe\xce\x6b\xfd\xa7\xca\x9f\xad\x0b\xc3\xe0\x23\x44\xea\x31\x3a\x35\x73\xea\xe8\x11\xd1\xc1\x50\x41\xf4\x91\x6e\x7c\xcd\xed\x8e\xae\x84\x59\x17\xf1\x0c\xc6\x0c\xe5\x4f\x3c\x58\x86\xc2\x0c\x8b\xbc\x30\xf8\x18\x91\x8a\xc5\x58\x14\x29\xa2\x0b\x50\xfe\xd0\xf6\xe2\x74\x1d\x4b\xcd\xdd\xed\x84\x5a\x0e\xa1\x06\x12\x52\x5b\x89\xf9\x07\x42\xe5\x3d\x11\x4d\x29\x5c\x30\x18\x8b\x48\xc5\xa1\x53\xad\x85\xac\xd8\x0a\x19\x6f\x8a\x3a\x3a\x52\xf1\x56\x3d\x2c\xe7\x72\x2a\x88\xda\x76\x37\x7c\xa5\x7e\xde\x62\xf7\x68\x38\x18\xbd\x03\x83\x71\x88\x54\x3c\xc6\x27\xb8\x3c\xbd\xd2\xae\x3d\x23\x56\x15\x12\xc7\x82\x4f\x61\xa0\xa1\x10\x68\xa4\x2e\xfb\x95\xdf\x49\x9d\x7b\x60\x56\xf4\x3c\x11\x39\x0c\xc6\x23\x52\x4f\xd0\xa9\xfc\xf3\x7c\xdf\x63\x5b\x9c\xb3\xa2\x3e\x37\x38\x13\x87\xa5\x89\x18\x48\xeb\x85\x37\x50\xe7\x2d\x7f\xea\xbe\x54\x35\x02\xf6\xa3\x60\xf0\x09\x22\xf5\x14\x9d\x9a\xab\xee\xfe\x0c\x5f\x60\xed\x7c\x29\xdf\xc8\x3c\x3e\xae\x2f\xba\xc2\x97\x43\x61\xb8\x37\xe4\x79\x5c\xd0\x61\x6b\x79\xda\x8f\x09\x06\x9f\x22\x52\x09\xe8\x94\x68\x03\x2f\xfe\x9b\x4f\xb6\x05\x57\x25\xc4\x83\xf8\x53\x6c\x9b\xaf\x7e\x5e\x94\x8f\xdc\x1b\x69\x2d\xca\x0a\xdc\x37\xce\xbd\x49\x02\x83\x09\x88\x54\x22\x3a\x35\x5d\x95\xf1\xfe\xd0\xcb\x3f\xbe\xfb\x89\xf3\xfb\xfd\x85\xa6\xa6\xc1\xf4\xfd\x6d\x0d\x17\x62\x94\xc4\x6d\x4f\x65\x5b\x26\x22\x10\x06\x13\x11\xa9\x24\x74\xea\xd3\xe5\xeb\x2c\xa5\x82\xfd\x57\xb9\x14\xb6\xe3\x9d\x6c\xef\xcc\x4b\x91\xe9\x7c\xd5\x17\x56\x9e\x0c\x6f\x16\xe4\x7e\xde\xe5\x2e\x0f\x83\x49\x88\xd4\x33\x8c\x7b\x48\x6e\xdc\x3f\xde\xfa\xd9\x32\xa2\x80\x17\x9f\x72\x47\xdd\xdc\x4d\xff\x8e\x4b\x5f\x4d\x3a\x87\x55\x16\x3e\x41\xc4\x8e\x9b\x93\x16\x0c\x3e\x43\xa4\x92\xd1\xa9\xdd\x33\xd2\x1f\x4a\xd3\x47\xc5\x6f\x84\x7e\xe5\x3c\x2a\x4c\x3e\xf7\xc6\xb9\x4a\x32\x64\xb2\x3f\xf2\x26\x70\x90\xa7\xda\xf4\x59\x1b\x06\x93\x11\xa9\x14\x74\xea\x9c\x68\xc4\xcf\x19\x51\x37\xf9\xa6\xc2\x67\x79\x05\x92\x04\xbe\xb6\xcf\x0c\x9c\x5e\x34\xcf\x07\x06\x7d\x39\x87\x1d\x7d\x35\xf2\x32\x0c\xa6\x20\x52\xa9\xe8\xd4\x45\x47\xd2\xca\xb9\xad\x95\x9f\x35\x93\x72\x09\xfa\x78\x30\x97\x23\x89\xc1\xc7\x3b\x02\xb7\xa5\x4f\xa7\x14\xc5\xf5\x18\xd9\xdf\x81\xc1\x54\x44\x2a\x0d\x63\xc1\xdb\xa7\xf2\xdb\x98\xee\xdc\xcc\xe0\x59\xe1\xc3\x5d\xb7\x5b\xc6\xc7\xdc\x53\x69\x97\xa3\x9e\xba\xdc\x76\x2e\x57\x2a\x71\xe8\xc0\x82\xc1\x34\x44\x2a\x1d\x63\xde\x9e\xf2\xc6\xe3\x54\x91\x0e\x8e\x04\xf9\xfb\xc5\x6a\x54\x6d\xcf\x1e\x83\x28\xbd\x53\x49\x92\x39\x36\x56\x64\x55\xe5\x11\xb5\x01\x0c\xa6\x9f\xd0\x90\x9d\xf4\x85\x8a\x3f\x1a\xb2\x0c\x8c\xdd\x83\xf3\xdd\xf9\x51\xce\xab\x89\x14\xce\x6d\x8d\x0d\xc1\xdb\x95\x32\x58\x5d\xd1\x22\xd9\x0d\x4e\x07\x5c\x8c\xc9\x3b\xcf\x28\xe9\x61\x30\x03\x71\x33\x32\xd1\xa9\xab\xf2\x32\x72\x77\x1b\xd4\xfb\xc7\x28\x9f\x8f\xbe\x85\xee\x88\xc4\xcd\xf4\xf2\xf3\x24\x1e\x79\x2b\x4f\xbe\x64\x0f\xce\x10\xc3\x83\xc1\x4c\x44\x2a\x0b\x9d\x0a\x62\xd0\xc5\x96\x72\x49\x95\xd9\xd2\xa8\xbe\xf7\xd4\x47\xef\xb0\x23\xa4\xf2\x18\xd7\xba\x3a\x15\x0e\x67\xff\x75\x56\x57\x16\x82\xc1\x2c\x44\x2a\x1b\x9d\x2a\x72\xaa\xd0\x02\xf5\x73\x9a\x6b\xe2\xfd\x3a\x0e\xdd\x1c\xa8\x6c\xd7\xe5\x73\xab\x49\xef\x8b\x95\xbb\xf3\xfe\xd4\xd0\xba\x70\x11\x06\xb3\x11\xa9\xe7\x18\x53\x9f\x86\x42\xec\xa0\xc8\x4b\xec\x14\x28\x7f\x6a\x9a\x4e\xef\xf9\x4a\xac\x2d\x1d\x8e\x4e\x7e\x46\xc6\x53\xf1\x70\xb0\x3d\xb1\x35\x0c\x3e\x47\xa4\x72\xd0\x29\x98\xac\x8c\xe4\xd2\x27\x01\xde\xb0\x6b\x16\xc7\xb4\xb6\xfe\x5e\x5e\x3a\xdf\x2a\x1e\xf2\xf1\x56\xee\x6f\x93\x33\x28\xf6\x44\xb0\xc1\x60\x0e\x22\xf5\x02\x9d\x1a\x2c\x73\xd8\xb3\x95\xe3\x76\xcf\x37\xda\x4a\x3d\x43\x5b\xcd\x31\x3f\xe1\x3a\x3b\x48\x4c\xbb\x96\x29\x67\xb9\xd5\xa9\xcd\x22\x01\x83\x2f\x10\xa9\x97\x18\x87\x5d\x29\xbf\xc7\x8d\x1e\xa5\x04\xeb\xe6\x8b\xdc\x6a\xcc\x0f\xfb\x15\x6a\x66\x76\xd6\xae\x51\x53\xe1\xdf\x7d\xff\xec\xd5\x75\xd0\x04\x06\x5f\x22\x52\xb9\x18\x93\xd7\xd1\xa1\xa9\xb5\xfe\x35\xec\x2d\xf1\xb7\xb5\x8f\x5d\x58\xbe\x91\x7c\x91\xe7\xa3\xed\xad\xf8\x46\x7a\x3a\xb5\xba\x4d\x2b\x18\x1f\x06\x73\x11\xa9\x3c\x8c\x03\x9c\xa4\x7e\x05\xb1\x90\x14\x93\xde\x6d\xe9\x92\xa9\xcb\x1a\xd9\x6e\x03\xe9\x49\xaf\x53\x7c\x72\xe2\x05\xa3\x42\x18\x7e\xfc\xbc\x09\x83\x79\x88\x54\x3e\xc6\xe9\x9c\xfd\x47\x86\x56\x59\x10\x98\x73\xee\x3e\x73\xc0\x63\xb6\xae\x29\x0b\xca\x3d\xdd\x7c\xf2\x62\xb5\x55\x6e\x2c\x95\xa1\x55\x06\x18\xcc\x47\xa4\x0a\x30\xd6\xa2\x48\x57\xee\xf0\x54\x13\xd0\x5f\x84\x3f\x34\x8e\x64\xba\x5c\x2b\xb8\x02\x59\x9f\x29\xcb\xcb\xbd\x4e\x30\xf2\xb5\x6b\xe2\x16\x1e\x0c\x16\x20\x52\x85\xe8\x94\xfa\xf1\xa3\x60\x26\xd9\xdc\x0d\xc2\x6b\x05\xa6\x0e\xb9\x3b\xc9\x1e\xcb\xd0\x48\xdc\x1d\x15\xc1\x6b\xbc\x37\x41\xf2\xe9\x37\xd6\x30\x58\x88\x48\x15\x61\x5c\x48\x95\x97\x73\xa2\x7f\xc8\x73\x48\xeb\xfe\xf1\xf6\xa7\xd3\xd1\xcf\x55\x33\x48\xc6\xc1\xee\x7d\xcb\x94\x29\xc6\x0e\xf1\x27\xc3\xc4\x30\x58\x84\x48\x15\x63\x5c\x74\x16\xae\x6d\xfd\xe1\x75\x41\x2a\xcb\xab\xcc\x66\xd8\xc2\x43\x50\xe1\xc1\xf2\xc0\x77\x9a\xa0\x57\xfe\xf3\x53\x67\x75\x8e\x3d\x94\x61\xb0\x18\x91\x7a\x85\x4e\x65\xa0\x3c\x59\xdd\x23\x49\xcc\x43\xab\xb9\x7a\xef\xb6\xef\xcc\xb4\x39\xdd\xae\x5f\xbb\xa6\xb1\xab\x95\xf1\x9a\x7e\xb7\x4b\x4d\x0a\x06\x5f\x21\x52\x25\xe8\x54\x4d\x76\x28\x63\x8b\xe0\xc3\x80\x1e\x68\x41\xf2\xa7\x1a\xce\x0e\x7f\x6d\x1e\x9f\xf6\xc4\xbb\xa5\x39\xf9\x36\x85\xb7\xb4\x77\x2c\x61\xb0\x04\x91\x7a\x8d\x4e\x15\xe0\xf1\xf1\xdd\x12\xc2\xb1\xbd\xf0\x30\xb2\x99\x7e\x80\x23\x82\x88\xdd\x43\x98\xd0\x17\xcf\x5b\x9f\xe0\x15\xdf\x0d\x23\x5d\x66\x18\x7c\x8d\x48\x95\x62\x4c\x3f\xe8\xbb\xe7\xe2\x72\xe2\x1f\x15\x68\x1e\x79\x4b\x98\x72\x5d\xf1\x4f\x3a\x33\x28\xa8\x6a\x36\xef\xc8\xdf\x13\xf6\xb1\xfe\xd5\x19\x18\x2c\x45\xa4\xca\x30\xc6\x15\xdd\xed\x8e\xcd\x07\x6a\xf4\x6d\x67\x71\x07\x80\xf4\xd0\xd9\xbb\x89\x59\x3b\xde\x9f\xc4\xaf\x1b\xed\xc7\x53\x46\x7c\xa7\xbb\x0c\x83\x65\x88\x54\x39\xc6\x2a\xf5\x1d\xe5\xd4\x6b\xb2\x46\x79\x0b\xb3\xa6\x94\x5f\xb6\xca\xcf\x16\x58\xab\x4f\x15\xea\x76\x62\x35\x84\x57\xdc\xc0\xe5\xe2\xc6\x87\xc1\x72\x44\xaa\x02\x63\xc7\x89\x24\xb4\x30\xf4\xd3\xaf\xe8\x33\x88\x1c\x4c\xe1\x28\x67\x54\x9f\xe2\x3b\xed\xdb\x20\x47\x42\x48\x01\x8a\x84\xec\x2e\xb2\xc2\x60\x05\x22\x55\x89\x71\xd1\x99\xd4\x3e\x08\xda\x11\x64\x22\x23\xd8\x54\xcd\xad\x4d\x64\x63\x4f\x70\xe1\x1c\x8c\x92\x5a\xf9\x79\x7e\x84\xed\x13\x33\x25\x0b\x0c\x56\x22\x52\x55\x18\xeb\x2b\xc7\x7c\xdf\x0c\x39\xd7\xbb\x1f\xfd\x78\x18\x37\xde\xca\x2e\xbf\xaa\x6f\x55\xaa\xfb\x49\x1e\x87\xdb\xaf\x30\x47\x74\x84\xff\x1a\x0c\x56\x21\x52\xd5\x18\xb7\x0d\x14\x71\xeb\x59\xc8\xef\xc7\x29\x4a\x8f\x18\xa8\x57\x7a\xcd\xf5\x90\x30\x41\xd2\x31\xf7\x73\x38\xb5\x70\xa3\x34\xcd\xe9\xa4\x60\xb0\x1a\x91\xaa\x41\xa7\x8e\xa4\x0e\xda\xd3\x15\x0a\x5d\xaa\x87\x28\x43\x74\xcb\x1c\x4b\xdb\x76\xdf\xb9\xc2\xf5\xfb\x9e\xea\x5e\x3a\xaf\xd5\x86\xbb\xc9\x61\xb0\x06\x91\x7a\x83\x4e\x11\xfb\xf9\xbd\x3b\xba\xf1\x96\xbf\x9c\x7f\x1d\xf5\x8a\x6c\x10\x7a\x11\xfd\x21\x34\x22\xdf\xf0\xba\xc6\xf0\x74\x3d\x43\x62\x22\x0d\x0c\xbe\x41\xa4\x6a\xd1\x29\x77\x4d\xdc\xb5\x5e\xce\x6a\x9f\x96\x92\x9d\x7b\x84\x6a\x05\x99\x3c\x09\xcd\x8c\x6d\x25\xc9\x5e\x3b\xe4\x8f\x7a\xdf\x27\x93\xf1\xc2\x60\x2d\x22\xf5\x16\x9d\xc2\x59\x54\x27\xb8\xc9\x59\x3c\x3a\xeb\xf4\x36\xc7\xc7\x48\x27\xc4\xbe\x6b\xec\xbc\x60\xfc\x3c\xaf\xc4\x02\x13\x35\x1d\xd9\xf9\xcb\x30\xf8\x16\x91\x7a\x87\x71\xa5\xc8\x16\xfb\xf4\xf3\x7b\x2b\x17\x06\xad\x17\xf9\x35\xf3\x39\xa2\xd5\x95\xf9\xdf\x5f\x34\xb3\xc1\x3b\xec\xdb\x08\xdb\x7c\xf7\x00\x0b\x06\xdf\x21\x52\x75\x18\xb7\x58\x5c\x8b\x79\x53\x15\x99\x16\x22\xbb\xcd\x06\xfa\xd2\x51\xee\x28\x27\x6a\xd3\x4c\x2c\xb0\x71\xe7\xd6\x18\x51\x2c\x0b\x11\x5a\xc1\x60\x1d\x22\x55\x8f\x4e\x51\x47\x57\x75\x4d\x25\x85\x91\xb2\xd7\xa8\xf5\x07\x2d\x34\x06\x8d\x73\x15\xd4\xb1\x18\x0f\xc5\xec\xd1\x1a\x5d\xec\x39\xbe\x67\x09\x83\xf5\x27\x34\x64\x27\x7d\x6d\xf5\x8f\x86\xac\x01\xe3\xbe\xa8\xc3\x8e\xa6\xb7\x3c\x75\x1a\x4e\x8f\x22\x51\x6f\x16\x5c\x17\x49\x0b\x72\xc6\xbf\xb5\x27\x38\xc4\x07\xf7\xac\xb0\xdd\xc8\x03\x60\xb0\x01\x71\x33\xde\xa3\x53\xaa\x9e\xab\x5d\x2e\x8a\xb9\xf2\x84\x0c\xaa\x79\xea\x8b\x32\x6f\xc4\x45\xd9\xf8\xb6\x47\xac\xfb\xef\xd7\xd8\xcf\x96\x9a\x93\x5f\x87\xc1\xf7\x88\x54\x23\x3a\xd5\xe0\x13\x8b\xc2\x7b\xfa\x5a\xbd\xee\xa5\x8a\x86\xd2\x37\xaf\xd0\x94\x7b\x63\x1c\xb4\xb3\x13\xce\x7b\x5f\x01\xc3\xca\x3b\x86\x0a\x30\xd8\x88\x48\x7d\xc0\xe8\x76\x2b\x15\x3c\xf5\x97\x1f\x98\x0d\xb5\xee\x5d\xae\xf5\xb6\x69\xbf\x38\xe9\xc7\xd2\x5b\x76\xa5\xe1\x57\xe8\xb5\xe4\x9f\xf3\xf7\x05\x60\xf0\x03\x22\xd5\x84\x31\xc9\xa0\xab\x12\xea\x33\xe5\xba\xf3\x55\xce\xe2\x16\x3b\xf7\x0f\xb3\xee\xf0\xf3\xb5\x17\x8d\xbd\x64\x54\xd3\x51\xdc\x6a\xa8\x08\x6b\x18\x6c\x42\xa4\x9a\x31\x3a\x4e\x33\x50\x76\xaa\x64\x57\x7e\xe9\xf3\xfb\x69\x3b\xda\xc6\xd2\x8a\x31\x2a\xef\x02\x1d\xb7\x61\xb5\xbe\x84\x4a\x62\x2c\x1b\x75\x18\x6c\x46\xa4\x5a\x30\xc6\x74\x05\x1b\xc5\x5b\x91\x2c\x8b\x0d\x75\x71\xcb\x33\xa6\xb3\xd7\xf8\x59\xb7\x19\x48\x8f\x4f\x59\xeb\x2b\xdc\xb1\x78\x2c\x1c\x2f\x09\x83\x2d\x88\x54\x2b\x3a\xc5\xf9\xf0\x60\xa8\x4c\x52\x6c\xf5\xab\xde\x6a\xc2\xd0\x36\xf6\xb0\xa2\x63\xcb\x26\xa7\x98\x40\x6b\xa7\x26\xe1\x01\x37\xd9\x94\x13\x0c\xb6\x22\x52\x6d\xe8\x94\x81\xb4\x68\xe5\x94\xf1\xd5\xe7\xc5\x64\x75\x64\x9e\xf2\x7c\x0d\xa2\x4f\xde\x13\xe1\x1d\x41\x9a\x5c\x16\x0e\x1f\x78\xda\x9d\xcc\x61\xb0\x0d\x91\x6a\xc7\xe8\x38\x5f\x64\x5f\x98\x9e\xc7\xfe\xa5\x5c\xeb\xbd\x6a\xf7\xa2\x53\xdf\xa4\x64\x35\x75\x3a\xc4\x7c\x86\xd7\x5c\xc0\xb3\xd1\x6e\x8e\x0d\x06\xdb\x11\xa9\x0e\x8c\x35\xce\x55\x23\xbf\xd5\xfc\x28\xfb\x59\x56\x67\x3f\x65\x96\xd2\xd7\x1d\x04\x6f\x98\xa3\x3a\xd7\x86\xc9\x4e\x8d\xbc\x99\x2e\xc9\x62\x80\xc1\x0e\x44\xaa\x13\x9d\x7a\x0c\xd4\xcf\xf6\x7f\xb3\xba\xe3\x59\x62\x87\x12\xca\x53\xd0\x46\x3d\xda\xd6\xa8\x7e\x6f\x48\x52\xca\xa9\xe1\x4f\x26\x79\x0e\x84\xc1\x4e\x44\xea\x23\x46\xc7\x49\x16\xc7\xdc\x23\x90\xae\x12\x30\x12\x97\x60\x80\xdf\xee\x40\x9c\x73\xcf\x96\xae\x28\xaf\xa8\x3d\xde\xbe\xf1\xa5\x69\x97\x1c\x0c\x7e\x44\xa4\xba\x30\x2e\x4c\x4c\x2e\xd3\x49\xdc\xaf\x95\xcb\xc8\x5b\x92\xbb\xe2\x4f\x64\xff\x59\x29\x77\x70\x5e\x8e\x9e\x38\x8d\x62\x59\xf2\xab\x17\x4a\x1a\x06\xbb\x10\xa9\x6e\x8c\xde\xee\xca\x78\x5f\x4d\xce\x00\x10\x91\x5f\x09\xd0\x19\x3d\x9e\xf3\xe7\xb6\xdf\x57\xd3\x23\x12\x7c\xbc\x49\xd0\xc1\x6e\xc4\x4c\x04\x83\xdd\x88\x54\x0f\x3a\xe5\x00\xbf\xab\x7d\x1d\xe4\x9c\xb8\xb4\x4f\x88\x7f\x35\xca\xb1\xc3\xef\x09\x20\x22\x2d\x3f\x18\x65\xf4\xa3\xa2\x88\x45\xb2\xe2\x2a\x0c\xf6\x20\x52\x9f\x30\xce\x76\xa5\x2f\x94\x03\x36\x9a\x70\xd3\xa6\xac\x26\x5e\xb2\x14\x31\x7f\x5e\xc8\x25\x4c\x6e\x7c\x6b\xa2\xad\x7b\x4e\x82\x25\x9c\x1a\x0b\x06\x3f\x21\x52\xbd\xe8\xd4\x53\x33\x6b\xb9\x8e\x82\xab\x4f\x69\x5e\x64\xb5\xe2\x8d\x66\xb0\x3b\xdc\x48\x0f\x75\xf2\x1e\x25\x8f\xd4\x06\x6f\xe9\xd7\x31\x1a\xc0\x60\x2f\x22\xd5\x87\x4e\x69\xc1\x01\xe1\x0d\xc1\x19\xd5\xcd\x34\xcb\x57\x6e\x11\xee\x4e\x4b\x85\xcf\x90\x45\x4c\x79\x50\xfa\xcd\x98\x8e\xfb\xe0\x35\x4b\xc3\x60\x1f\x22\xf5\x19\x63\x26\x93\x68\x40\xfa\x20\xe9\xa7\x05\x93\x7a\xfa\x8d\xa9\x4c\x89\x37\xa9\x77\xb2\x64\x4f\xdf\x79\x25\xed\xa6\x67\xd0\x22\x11\x6e\xcd\x06\x83\x9f\x11\xa9\x7e\x74\xaa\xf6\x69\xc2\xca\xeb\xe4\x73\x9f\x13\x5e\x35\x46\xf3\x9d\x79\xc2\x6b\x10\xaf\x60\xdf\x54\xdf\xc5\xcc\xb5\x37\xbf\xf6\xb3\x3c\x98\x0e\x06\xfb\x11\xa9\x01\x74\xea\x5e\xdb\xe6\x39\xc5\x75\x05\x8b\xce\x41\xb3\xb7\x4f\x67\x37\xad\x0b\x79\x29\xca\x0a\x17\xba\xef\x5d\x8d\xe3\xd0\x6e\xf5\x53\x3b\x03\x83\x03\x88\xd4\x20\x3a\x55\x65\x7b\x44\x47\x28\xe6\xf6\xf1\xfb\x8b\xcd\xca\xce\x17\x81\x56\xba\x71\x14\x83\xfb\x07\x89\xdb\x35\x26\x69\xe2\x0d\xca\x71\xaa\x30\x38\x88\x48\x0d\x61\x34\x19\x39\x4e\xee\xac\xe2\x82\x80\xb4\x38\x01\x6f\x72\xa2\x19\x16\xc3\x3c\x73\xfd\x2c\xbe\xeb\xfa\xbd\x92\x2e\xf2\xe7\xef\x9b\xf4\x61\x70\x08\x91\x1a\x46\xa7\x44\xa6\x65\xce\xbb\x35\xec\xd7\x3c\x27\x7a\x16\x7a\x78\xc3\xeb\x6c\xb1\xda\x2f\x31\x43\x0d\x8e\xe8\xb5\x0a\x82\x07\x58\xf7\xf5\xd9\x60\x70\x18\x91\xfa\x82\x4e\xd5\x07\x88\x85\xee\x13\x49\xd5\x7e\xe4\x6a\x24\x7d\xb6\xee\xb0\xdf\xee\x40\x15\x9f\x1f\x58\x79\x03\xbf\xa5\x68\x8c\x87\x64\xee\x12\x0c\x7e\x41\xa4\xbe\xa2\x53\x5f\x12\x76\x70\x63\xf4\xbd\x74\x8b\xad\x79\x0c\x6a\x24\x98\x1f\xe1\xf0\xdf\xc3\x6f\x4e\x37\x90\xd0\xf1\x4e\xed\xd6\x88\xc8\x32\x83\xc1\xaf\x88\xd4\x37\x74\xca\x48\x3e\xcd\xf5\x7b\xbd\x68\x40\x0e\xfd\x51\x71\xf0\x1e\x7c\x6e\x81\x43\x95\x37\xb8\xe3\x81\x67\x60\xc8\x67\x16\x8e\x8c\x70\x16\x18\xfc\x86\x48\x8d\xa0\x53\x54\xe4\x93\x92\xee\x21\x94\x29\x82\x16\x79\xa7\xfd\x49\x2f\x56\xa4\xf6\x16\x6e\xbf\xc9\xa4\x3c\xa6\x9a\xa1\x11\x3d\x68\x95\xbe\x01\x83\x23\x88\xd4\x28\x3a\xf5\x0c\xfb\x23\x77\x46\x6c\x1e\x80\x8a\xfc\x3c\x17\x96\xf1\x79\xf6\xa7\xd9\xf5\xc5\x3a\x75\xf5\x46\x7f\xf2\x28\xfb\x8b\x7c\xa2\x97\x60\x70\x14\x91\x1a\x43\xa7\xf0\x18\x80\x6e\x3f\x61\x8f\x8f\x8a\x0a\xcb\x13\x0f\x04\x01\xa3\x67\xe1\x2e\x8f\x39\xb0\x6e\xc6\x94\x2c\x58\x7d\xc8\x7a\x79\xd6\x06\x06\xc7\x10\xa9\x71\x8c\xa5\x65\xa7\xeb\xf4\xa7\xd6\x36\x7c\xb6\xec\x1e\x4f\x3d\x88\x1c\xe9\xc0\xeb\x21\x60\x1a\x2d\x34\x72\x68\x61\x96\x2c\xd2\x1e\x32\xd2\x83\xc1\xf1\x13\x1a\xb2\x93\xc2\x41\xfe\x68\xc8\x26\x30\xee\x33\x98\xca\x91\xaf\xf3\x0c\xa4\x88\xa5\xdf\xee\x9b\x94\xee\xf8\x45\xa9\x61\x11\xf6\x5e\xbd\x82\xd2\xe2\xd2\x2d\xad\xac\x4b\x25\x06\x30\x38\x81\xb8\x19\x93\xe8\x94\x3f\x93\xd7\xbb\xa0\x2c\xc3\xa0\xe5\xe7\xe9\x23\x47\xf1\xe5\x4c\xe2\xdd\x06\xe7\x07\x2d\x9c\xf3\xee\x46\xdb\x9e\x93\x3d\xee\x77\x83\xc1\x49\x44\x6a\x0a\x63\xa9\x46\xf4\xfd\x3d\x2f\xa7\x3d\xee\xa6\xf8\x86\x79\x17\x23\x89\x5f\x56\x4f\x09\xf9\x0b\x19\x6f\x5e\x1b\x7b\xf4\xb8\x22\xf4\x7e\xb8\x2d\x0c\x4e\x21\x52\xd3\x18\x27\xce\x08\xf9\x6e\x25\xbf\xa2\xcf\x5c\x43\x2c\xa4\xdb\x93\xcb\xe1\xbd\x1f\x78\x7a\x4a\xfd\x0c\x29\x4e\x57\x04\x59\xdc\xee\x33\xb8\x0e\x83\xd3\x88\xd4\x0c\x3a\xc5\xf8\xc1\x9e\x23\xb6\x9c\x3d\x6d\xa5\xc9\x7f\xa4\x3d\xbc\x27\xed\xdc\xe7\x4e\x14\x8f\x17\x69\xb6\xae\xe9\xf1\xd7\xfc\x9e\x4d\x39\x18\x9c\x41\xa4\x66\xd1\x29\xee\x90\x48\x4f\x9b\x4d\x2b\x7a\xb7\x24\x38\x8f\x50\xc9\x86\x22\xf3\x93\x20\xb9\xfc\xd9\x5e\x95\x3a\x51\x31\x76\xbb\x81\x05\x59\x18\x9c\x45\xa4\xe6\xd0\xa9\x0f\xba\x8d\x6f\xb8\x52\xcf\x49\x12\xd6\x09\x57\x8b\xb5\xba\x6e\x9d\x5b\xd2\x55\x54\x0c\x7f\xfd\x05\x30\xfa\xa9\xf3\x6a\xb0\x8c\x16\x06\xe7\x10\xa9\x79\x74\x8a\xd9\x86\x39\xe5\x61\xeb\x90\xbc\x40\x40\xc8\x03\xbe\xd0\xb5\x9f\x57\x87\xb2\x3c\x28\xce\xe6\xda\x06\x5d\x83\x9c\xbc\x46\xa8\x89\x60\x70\x1e\x91\x5a\x40\xa7\x6c\xeb\x26\x9c\xdb\xbb\x20\x5e\xb1\x0d\xea\x1b\xda\xf2\x0d\xef\x98\xd6\xe2\x67\x0e\xa8\x36\x0e\x3b\xdc\x1c\x04\xb1\x3c\xfd\x05\x60\x70\x01\x91\xfa\x8e\xb1\xff\x87\x6a\x66\x57\xdf\xa6\xb4\x2e\xd1\xfe\xde\x97\x99\x9c\xb3\xc6\xb6\xc6\x69\x6a\x8b\xd5\xcc\x5b\xfe\xc2\xe3\x1a\x1e\x15\x09\x0d\x0c\x7e\x47\xa4\x16\xd1\xa9\xe5\xeb\xe9\x42\xcb\x41\x47\x22\xb0\x46\xbd\xbd\xfd\xb3\x0b\x7d\xf4\x9b\xdd\xf7\x24\xb9\x54\x02\x72\x2a\x34\xca\x76\x9a\xb8\x98\x60\x70\x11\x91\xfa\x81\xf1\xaa\x36\x0f\x8f\x16\x3b\x33\xe5\x04\x93\x5e\xa5\xfa\x4b\xeb\x76\x25\x87\xb1\x4b\xa7\x42\x16\xa7\x22\xab\x9e\xb4\xa9\xdf\x3b\x4b\x02\x83\x3f\x10\xa9\x25\x8c\xc1\xc0\x88\x7b\x73\x5d\xa5\x4a\x5d\x9b\xbc\xdd\x2e\xff\x6e\x5e\xf9\xe5\x8c\x1f\x04\x79\xe6\xd3\x86\x57\xda\x83\xa2\xbd\x08\x8e\xcd\x60\x70\x09\x91\x5a\xc6\xb8\x0c\xb7\xfb\x2c\x66\x71\xc4\xda\xce\xd9\xdf\x9f\xe9\x34\xe1\xca\x99\x7b\x75\x24\xb2\x5f\x4b\xb5\x06\xaf\xea\xbb\xad\xc7\x1e\x71\x9f\x81\xc1\x65\x44\x6a\x05\xe3\x9a\xec\x7b\x9a\x17\x29\xc3\xec\x41\x26\x37\x5f\x65\xc5\xa6\xac\xd8\x1d\x62\x63\xcf\xba\x6c\x32\x6c\xd4\x37\x5c\x8b\xf7\x78\x12\xcb\x0e\x83\x2b\x88\xd4\x2a\x3a\xb5\x89\xf3\x61\x09\x1e\x00\x4a\xcd\x6e\x5e\x8b\x34\x2b\x68\xbf\xbe\xd4\xa5\xf1\x45\x65\x7e\x69\x2d\x6d\x49\x64\xe5\x25\x63\x1e\x04\x83\xab\x88\xd4\x1a\x3a\x95\x48\x45\x96\xe2\x07\xf8\x6e\x07\x3d\xaa\x19\x9c\x9e\xaf\x4b\x75\x20\x79\xa3\x78\x81\x99\x3d\x67\xcb\xfa\xe7\x9a\xbb\x58\x07\x3d\x0c\xae\x21\x52\xeb\xe8\x54\x5e\xdc\xfe\xd4\x7e\x31\xcd\xf2\xcb\x50\x0e\xb1\x99\xd7\xd9\x9f\x73\x93\x5a\xb2\x6b\xd6\x6d\xcd\xaf\xf5\x72\xb5\xaa\x49\x7e\xe2\x86\xc1\x75\x44\x6a\x03\x9d\xea\xd6\xdb\xb8\x5c\x44\xfd\x8e\x76\x6a\xc3\x65\xff\x9e\xb2\x1a\xe1\x63\x8f\x68\x3d\x9a\x5e\xd1\x81\xcf\xde\xcc\xbf\x02\x7a\x8d\x40\x18\xdc\x40\xa4\x36\xd1\x29\xc1\xf9\xc6\x5b\x1a\xa8\xb7\x29\x74\x19\xed\x1a\xbc\x31\xfd\xc5\x73\x26\xea\x9a\xb6\x2d\x0d\xaf\xaf\x5e\x6f\x27\x56\x35\xfa\xca\x0a\x83\x9b\x88\xd4\x16\xc6\x01\x59\xf2\xbe\x27\xc3\x11\xf3\x24\xce\xb0\x71\xeb\xbc\x40\x13\x9d\xb3\xab\xf8\x77\xcb\x88\xd5\x54\x15\x6e\x49\xab\xf4\xe7\xab\x62\x30\xb8\x85\x48\x6d\xa3\x53\x1d\x22\x4d\x17\x7b\xb2\xc7\xda\x17\x1b\x0f\x7c\xbc\x27\x32\x83\x27\x7b\x39\x82\x14\xca\xdf\x0b\x09\x6c\xa4\x88\x65\xe9\x7f\x64\x83\xc1\x6d\x44\x6a\x07\xe3\xbd\x7a\xc9\x96\x34\xae\x51\xd7\x47\xf8\x6c\x7f\x22\xe3\xe9\xf4\x5e\xe8\x5b\x05\xfd\xd2\xcb\xec\xb5\x17\xe8\xcc\xac\x7d\x8a\x8b\x8c\x61\x70\x07\x91\xda\x45\xa7\xaa\x85\xa7\xee\xc8\xa0\xee\xb3\x0f\x5b\xf7\x13\x12\x29\xc8\xee\xa4\x92\x73\xbf\xfa\x7a\x5d\xc4\x5a\x8b\xc3\xed\xc1\x64\xc1\x5d\x39\x18\xdc\x45\xa4\xf6\xd0\xa9\xae\x7e\xf0\x6c\xbb\xe7\x61\xe9\x34\x99\xbe\x7b\x5a\xf9\xcb\xe8\x2a\x31\xd9\xe1\x9d\x71\x0d\x86\xdc\x3a\x8b\xdc\xe4\xa8\x40\x07\x18\xdc\x43\xa4\xf6\xd1\xa9\xa6\x26\xc2\x2d\x93\x87\x25\x78\xdc\x4f\x6a\x04\x3f\x2b\x37\xcf\x7d\xef\x62\x6a\x5e\x62\x11\x31\x0b\x66\xd4\xd3\xa5\x5d\x0f\xa2\x85\xc1\x7d\x44\xea\x00\xe3\x16\x0b\xaa\xcb\xd8\xf9\xaa\x03\x53\x42\xeb\x83\x57\xb7\x5b\xc9\x2e\xba\xc7\x70\x95\x39\xc9\x66\x2e\xfc\xf8\x86\xc5\xb2\xc6\xa2\x46\x01\x83\x07\x88\xd4\x4f\x74\x8a\xc6\xdd\x35\x6b\xec\x03\xed\x2c\x9d\x43\xc3\x59\x8b\xe6\x1b\xe7\xdf\xd5\xe3\x2f\xe5\x6b\xe6\x4c\xe7\x2d\xed\x6a\x7e\x66\x7c\x20\x05\x83\x3f\x11\xa9\x5f\xe8\x54\xf8\xe5\xc2\x56\xcd\xb2\x9b\x75\x63\x85\x59\x54\xe7\xaf\xc7\x11\x14\x7c\x59\x68\x20\x5b\x27\x78\x9d\x67\xf3\x6a\xd6\xc4\xf9\x95\x10\x0c\xfe\x42\xa4\x0e\xd1\x29\xa5\x9f\x95\x2d\x99\x15\x58\x5c\x4b\x62\x76\x2a\xb5\x55\x9a\x6a\x69\xea\x54\x1b\x8d\x89\x5c\x63\x07\xed\x96\x36\xa1\x09\x46\xb8\x30\x78\x88\x48\x1d\x61\x0c\x86\xf7\xb7\x12\x88\x5f\x8e\xcc\x04\x4b\xcc\x97\x6e\x88\xb4\x87\x44\x9c\x4f\x1e\x91\xda\x28\xe7\x5a\xf4\x11\xa1\x73\x75\x7a\xe8\x00\x83\x47\x88\xd4\x31\x3a\x25\xc7\xaf\xa2\xde\x5d\x4c\x17\xd6\x2e\xad\x1a\x94\x50\x48\xac\x43\x57\x3b\xf5\x4e\x2b\x81\x97\xb8\xca\x34\xff\xed\x9d\x7b\x07\x58\x30\x78\x8c\x40\xf5\x90\xff\xbb\x08\xb6\xff\x6d\xc8\x20\x00\x23\x59\x8c\xe0\xed\x47\x4b\x81\x97\x76\xf3\x11\xe5\x9c\xe4\x2b\xaa\x06\x3d\x3e\x25\x58\x66\x37\x45\x7f\x56\x49\x06\x36\xf9\x92\x6d\x10\x88\xc1\x10\x80\x98\x2d\x06\x01\x18\xe9\x62\xe5\x6b\x13\xdf\x86\x05\x3e\xf0\xcc\x5a\x2c\x18\xb6\x18\xcf\xd9\xfa\x79\x35\x9c\xb9\xec\x96\x48\x93\x5f\xb1\x52\x12\x34\xa0\x6a\x0b\x43\x00\x62\xbe\x18\x04\x60\x24\x8c\xd5\x6f\xdc\x5a\x6b\xdb\x93\x48\x60\xba\x67\xa7\x02\xad\xe7\x60\x77\x95\xc9\xb7\x8b\xf5\xc2\x0f\xbe\x76\xcc\xc7\xde\x9c\xb0\x3f\x07\x43\x00\x62\xc6\x18\x04\x60\xa4\x8c\x85\x2b\xb1\x44\xdf\xfc\xfe\x41\x2e\x96\x35\x2f\x3e\xc6\x44\x4e\x61\xb3\x9f\x9b\x53\xfe\x2b\xae\xbd\x0e\xf3\xec\xaf\xfb\xf4\xac\x92\x30\x04\x20\xe6\x8c\x41\x00\x46\xd2\x58\x3d\x0d\x9d\x77\x3b\xc5\xd2\xc6\xd0\x98\x44\xf0\xc2\x2d\xe2\xe6\x73\x64\x17\x3b\xdb\xb2\x0d\x68\xb0\x00\x39\x98\xc1\xb8\xc8\x0a\x86\x00\xc4\xac\x31\x08\xc0\x48\x1b\xbb\x5b\xb3\xe9\xdd\xd8\x36\x22\x3b\xed\x75\x3e\xb3\x68\xf4\xad\xea\xcb\xe3\x70\x37\x68\x8f\xe2\xfe\xdd\x75\x73\x57\x62\x1c\x40\x08\x86\x00\xc4\xbc\x31\x08\xc0\x48\x1c\x1b\xcf\x21\xd0\x29\x37\xcd\x27\xca\xa0\xee\x21\x27\x83\xb8\x98\x73\x22\x62\xbf\x45\x69\x4f\xb3\xf6\xfd\x64\x98\xd6\xff\xa5\xab\x06\x43\x00\x62\xe6\x18\x04\x60\xa4\x8e\x05\xea\x0a\x83\x7c\xb2\xa6\x9a\xed\xb5\x44\x21\xdd\x13\xda\xc1\xe5\x2f\xf0\xab\x44\xa7\xbb\x5e\x36\x97\x91\x46\xcc\x4d\xca\xe1\xc2\x10\x80\x98\x3b\x06\x01\x18\xc9\x63\x33\x87\xc5\x93\x1c\xb4\x3f\xc4\x6f\x9d\xee\x1d\x93\x5e\x56\xd6\x0e\x7e\x98\x86\xbb\x54\x92\xfb\x9a\xa0\xb4\x77\x07\xc8\x47\x31\xc1\x10\x80\x98\x3d\x06\x01\x18\xe9\x63\x7e\xb6\x67\x3d\xc9\xd4\xee\x56\xcf\xf2\x4a\x3c\xf1\x2d\x51\x6c\x59\x98\x38\x83\x33\x91\xb6\x54\xe6\xff\xa5\x47\x86\x99\xa6\x5f\x1a\x86\x00\xc4\xfc\x31\x08\xc0\x48\x20\x33\x6d\x03\x9f\x75\xe6\x03\xd7\xe9\x9a\xbb\x50\x2f\xdf\xe7\x11\xdc\x6c\xac\xaa\x7e\xe5\x1c\xca\x9a\xbc\xac\x6b\xda\xfb\x03\x9b\x14\x86\x00\xc4\x0c\x32\x08\xc0\x48\x21\x1b\x0e\xca\x1a\xe4\xf7\xce\xb2\xeb\x12\xb4\xac\xcd\x8e\xde\xf0\x14\x5d\xb8\x2b\xf1\xeb\x14\x55\x37\x6e\x66\xb4\x84\x8d\xeb\x0c\x3d\x0c\x01\x88\x39\x64\x10\x80\x91\x44\xa6\x2b\x7e\xca\x8d\x5a\xca\xee\x96\xeb\x92\x4e\xd9\xba\x58\x4c\x98\xf8\x50\xa0\x9c\xb7\x40\x89\x0b\x85\x17\x14\xdd\x3b\xd8\xe7\x04\x43\x00\x62\x16\x19\x04\x60\xa4\x91\x05\x7a\xd8\x45\x45\x04\x25\x9f\x6f\xc9\xfb\x99\x71\x7d\xf9\x5d\x1d\xbb\xbe\x75\xfb\x05\xdb\x2d\x0a\xe3\x88\x46\x5f\x25\x92\x19\x1d\x18\x02\x10\xf3\xc8\x20\x00\x23\x91\xac\x88\x55\x61\x3b\xbc\xbf\xfe\x19\x5f\x4f\x33\x50\xbd\xce\x79\xc9\xfb\xbe\x71\xff\x6e\x36\xff\x02\x67\xc4\x65\xdf\x80\x17\x21\x84\x30\x04\x20\x66\x92\x41\x00\x46\x2a\x99\x9a\xfb\xbb\xf4\xa1\x91\xaa\xc0\xe1\xfe\xf3\xfc\x1b\xc9\xc5\xd6\x29\xb3\x9d\x3e\xef\xd2\xe7\x58\x05\x35\x3d\xee\x77\x01\xb3\x0c\x30\x04\x20\xe6\x92\x41\x00\x46\x32\x59\x0b\x47\x9e\x51\xf6\x2b\x2c\x9f\xa7\xb7\xf1\x97\xa2\x2b\xda\x8f\xac\x6c\x3f\x37\xa1\x0c\xe5\x97\x89\x3b\xec\x6d\xcb\x2a\x68\x44\x60\x08\x40\xcc\x26\x83\x00\x8c\x74\xb2\xac\x6d\x6b\x3e\x2d\xfb\x52\x2b\xdc\x33\x9c\x95\xba\x8e\xb7\xe2\x3a\xee\x7c\x6b\x72\x48\xea\xc4\x05\x24\x4a\xdd\x2e\xee\x8e\xb0\xc0\x10\x80\x98\x4f\x06\x01\x18\x09\x65\xc6\xad\xcf\x94\x06\xf0\x28\xc0\xf2\xb0\xc1\x27\xbf\xd2\xa7\x36\xf1\x48\xcc\x3a\x5f\xaf\x10\x79\xcb\xdf\x17\x22\x78\xbb\x57\x87\x82\x21\x00\x31\xa3\x0c\x02\x30\x52\xca\x5a\xda\xa4\xac\xf3\x0f\xab\xe8\x37\x45\x8e\xf9\x1b\x9c\x1d\xb1\x23\x55\x66\x25\x7a\x72\xdd\x1b\x3f\x04\x9b\x69\xb5\x2e\x38\xfc\xde\x37\x11\x73\xca\x20\x00\x23\xa9\x2c\xf6\x57\x45\xc5\x59\x9e\xfa\x6a\x9b\xa6\xa0\x73\xf4\x71\x91\xf2\xfd\x4f\x2e\x3b\x64\x1a\xbe\xfc\x24\x8c\xef\x34\xa9\x5a\xfe\xf5\x37\x86\x98\x55\x06\x01\x18\x69\x65\x45\xad\x2f\x88\x0c\x6b\xe2\x97\xa2\x2c\x7f\x89\x4a\xbb\xf1\x8f\x69\x53\x28\xeb\xcd\xf9\x5f\xdd\xb8\xac\xfb\x0c\x38\xaa\x74\x52\x85\x21\x00\x31\xaf\x0c\x02\x30\x12\xcb\x88\xdc\x58\x03\x1e\x2a\x97\xd7\x1d\x6a\xf5\xaf\x1d\x58\xec\xaf\x3c\x5e\x21\xed\xd3\xd0\x17\xb7\xd3\x64\xde\x1b\xb9\x31\x32\x2b\x07\x43\x00\x62\x66\x19\x04\x60\xa4\x96\x49\x04\x1a\x6a\x3a\x5d\x7b\x24\x7b\xa1\x4b\xb2\xaf\x23\xf3\x43\x91\xf2\x8c\xca\x99\x6f\x74\xe0\xc0\x4d\xc0\x88\x26\x83\x5a\xe3\xf7\x51\x03\x31\xb7\x0c\x02\x30\x82\xcb\xac\x3f\xcf\x71\x9d\xbe\x36\x4c\x2c\x32\x7b\x37\x73\xb5\xa1\x41\xbc\x65\x33\xbc\xa9\xf4\x32\x10\x2e\x1a\xde\x85\x17\x39\xa0\x81\x07\x43\x00\x62\x72\x19\x04\x60\x44\x97\x6d\x3d\x22\xfe\x71\x36\x29\xad\xcd\xf4\xfc\xd4\xb7\x2e\x67\xf9\x04\x7f\xd7\x08\xdb\x18\x49\x6b\xbc\x02\x0e\x73\x94\xd8\x0f\xf1\x0b\x30\x04\x20\x66\x97\x41\x00\x46\x78\xd9\x59\x23\xf2\x7b\x6f\xfc\xa9\x4d\xa5\x9a\xdf\x89\x44\xbb\xbf\xe7\x13\xaf\xee\x66\x0c\xc7\x3e\xad\x3a\xef\x8f\xbd\x94\x1c\xd5\x20\x0f\x43\x00\x62\x7a\x19\x04\x60\xc4\x97\x65\xec\x4f\x6b\x5f\x68\x24\xfe\x11\xe2\x8f\xa5\xf1\x65\xc1\xb3\x6e\xaa\x8b\xfa\x4c\xb0\x01\x0f\xe1\xe4\xc1\x84\xe9\x58\xae\xb5\x00\x0c\x01\x88\xf9\x65\x10\x80\x11\x60\x56\xfd\x4c\x49\xd2\x91\xa8\x8d\x88\xf6\x91\xaf\xbb\x79\x8a\x43\xf8\x81\xa7\xd0\x5b\x41\xa7\x3d\xab\x56\x76\x69\xef\x3c\x1b\x4a\x65\x18\x02\x10\x13\xcc\x20\x00\x23\xc2\xcc\xc8\x2b\xcb\xd7\xdc\x87\xc1\x45\x7a\x5e\xf1\xed\x13\x89\xbc\x72\x8d\x10\x5d\x86\x80\x8d\x39\x86\x4d\xd9\x96\x57\xb1\xdd\xeb\x06\x30\x04\x20\x66\x98\x41\x00\x46\x88\x19\xbf\xea\x47\x2a\xf5\xbb\xad\xa3\xaa\x3b\x2d\x7b\x04\x05\x67\xf9\xcd\x7f\x84\x04\x3f\x35\xb8\x38\xcd\xf0\xd9\xec\xa7\x6f\xcf\x15\x5e\x18\x02\x10\x53\xcc\x20\x00\x23\xc6\xec\x74\x94\x90\x52\xec\xbb\x44\x0d\x6b\x2a\xbf\x6a\x39\x2c\x41\xf5\xfa\x71\x10\x2f\xe2\xb1\x90\x5e\xa0\x6a\xf8\x67\x8d\x34\xba\xdf\xbb\x13\x52\x8e\xd9\x5f\x0d\xdd\x49\x41\xb9\x7f\x36\x74\x18\x41\x66\x05\xd6\x46\x15\xd2\x7c\x2d\x77\x1c\x1f\x2f\x64\xec\xbd\xee\x57\x71\x9c\xbe\xe5\xbf\x92\x71\xe6\xaa\x3b\xbf\x1e\xe7\x25\xb7\xe7\xa6\x30\x04\x20\x26\x99\x41\x00\x46\x94\x59\x74\x80\xb0\xb9\xec\x57\x22\x4a\x87\xc4\xed\x8f\x09\x97\x88\xda\x4a\x57\xee\x7c\xe1\x61\xef\x5a\xfc\x6a\x5e\xf1\xa5\xde\x53\xfa\x77\x43\x87\x98\x65\x06\x01\x18\x61\x66\x8a\x96\xf0\x2e\x55\xa0\xbd\x16\xb1\xb7\xf6\x96\xbf\xc0\x4c\x8e\x12\xb5\xe9\xb8\x6a\xf9\xb9\xa6\x0c\x9f\x76\xb7\x5e\x3d\x56\x41\x18\x02\x10\xd3\xcc\x20\x00\x23\xce\xac\x46\x85\xf3\xf6\x2d\x9a\xdc\x33\xb2\xc2\x63\x64\xef\x1e\xf0\x6b\x47\xa9\x1b\x2e\xd6\x28\xe5\x36\xf8\x1e\xa4\xd4\x5e\xca\xd2\xff\xdd\x83\x21\xe6\x99\x41\x00\x46\xa0\x19\x8f\x59\x1a\x3e\xc4\xdd\x47\x73\xf6\xea\x4f\x8a\xe7\x0b\xca\xb7\x3a\x57\x45\xd8\xe6\xf1\x9b\xc3\xa2\xa9\x3a\x76\xfd\xa3\xcc\xf9\x61\x08\x40\x4c\x34\x83\x00\x8c\x48\x33\xa1\xbc\x87\x9b\x6f\x09\xd9\xe3\x2d\xbe\x5a\xaf\xe7\x7f\x73\xe8\x7c\x58\x42\xf8\x40\x2e\x52\x37\x3d\xdc\xb7\xb1\xef\x71\x7b\xc1\x0d\x18\x02\x10\x33\xcd\x20\x00\x23\xd4\xec\x8b\x75\xb6\x6d\xea\x66\x55\x0e\xdf\xfe\xa3\xb6\x08\xa3\x4a\xe5\x14\x02\xb9\x4d\x8f\x6a\x8e\xdd\x54\x4b\xc9\xab\x87\xc3\xc7\x9a\x30\x04\x20\xa6\x9a\x41\x00\x46\xac\x99\x17\x99\xec\x6b\xef\x7a\xfb\xe0\x20\xbd\x73\xdc\x1d\xb9\x8a\x86\xec\x61\x2b\xd5\xb5\x8c\x6d\x8e\x89\x45\x79\xbf\x8a\xcb\x63\xf5\x61\x08\x40\xcc\x35\x83\x00\x8c\x60\x33\x05\xcb\x83\x80\x8a\x6d\x14\x65\xd6\x03\x32\xc6\xf5\xb0\xc8\xd6\x6e\x1a\x97\xac\xb4\x30\x71\x82\xe7\x82\x64\xdd\xe9\x53\x58\x4a\x30\x04\x20\x26\x9b\x41\x00\x46\xb4\x19\x0b\x30\x9f\x6a\x91\xaf\x7f\xbf\xf1\xac\x62\x5b\x1f\x69\xbd\x18\xc9\x52\xc4\xae\xd2\xb5\xb2\x32\x7d\x85\x53\xfb\xea\x53\x9f\xef\xc0\x10\x80\x98\x6d\x06\x01\x18\xe1\x66\xe6\x87\x15\x31\xab\x8c\x2f\xa4\xb5\x0b\x14\x9e\x10\x9d\x26\x13\x29\x7d\x97\x2f\x4a\x71\xbf\x12\xd0\x5a\x28\xe1\x2a\x94\x59\xfa\x3d\x34\x10\xd3\xcd\x20\x00\x23\xde\xac\x13\xe7\xe6\xa7\x8b\xfa\xc6\xa9\x25\x5f\x56\x77\x7f\xc1\xf9\x2c\xba\x2c\x36\xac\xda\x12\xef\xda\x1a\x5f\x5e\xb5\x20\x17\xea\x3c\x0b\x43\x00\x62\xbe\x19\x04\x60\x04\x9c\x25\x33\xb8\xf3\xb1\x7d\x07\x97\x92\x5a\x8a\xc6\x35\xd9\xa2\x6c\x56\xbd\x79\x06\x24\x32\x8d\x39\xe3\xf8\xd9\x50\xbf\x2c\x78\x2c\x61\x08\x40\x4c\x38\x83\x00\x8c\x88\xb3\x74\x82\xd4\xaf\xdd\x61\x8e\xb1\x19\xb7\x7b\x79\x9c\xdf\x5c\xf8\x34\xe4\x70\xbe\xeb\x95\xe1\x93\x7d\x59\x66\x55\x1c\x85\x6f\x8f\x7e\x9f\x68\x11\x33\xce\x20\x00\x23\xe4\x6c\xc4\xa5\x62\xef\x66\x47\x68\x9d\xd1\xe0\xf9\xa1\xc0\xea\xa0\x30\xb2\x74\x30\xf6\x14\x69\x4c\x86\x08\xaf\xea\x82\x26\xad\xdc\x75\x18\x02\x10\x53\xce\x20\x00\x23\xe6\xec\xf4\x4d\x29\x96\x1f\xad\x8c\xde\x3e\x64\x97\xb9\xb7\x70\xc4\x13\x75\xea\x73\x14\x4b\x4d\xe0\x45\x3e\xe1\x0e\xa7\xfe\xb1\xe7\x20\x0c\x01\x88\x39\x67\x10\x80\x11\x74\x46\x7c\xc6\xca\x8b\x23\xf8\x7e\xed\x73\xf9\xe7\x01\x3f\x5e\xd8\x44\x3d\xc3\xc2\x15\xa1\x92\x1f\xd2\x0a\x00\xef\x0f\x92\xf3\x88\x8a\xc3\x10\x80\x98\x74\x06\x01\x18\x51\x67\x9d\xd6\x42\xb4\x15\xdf\x93\x2c\x29\xb4\x48\x52\x75\x24\x17\x48\x2e\x8a\x8a\xb4\x5e\x38\x6f\x2e\x75\x4f\x8e\x4f\x63\xcc\xbd\xeb\x77\xdf\x8a\x98\x75\x06\x01\x18\x61\x67\xe7\x7a\x23\x54\x9b\x1c\xd8\xc9\xc3\xce\x0d\x7a\xfc\xf4\xa6\xdc\x78\xa9\x3f\xaf\xfb\x80\x7f\xd2\x22\x34\x8b\xa0\xfb\xba\x5a\xf2\x15\x18\x02\x10\xd3\xce\x20\x00\x23\xee\xec\xac\xa7\xa3\x23\x49\x0c\x8e\x30\xca\x0e\xb0\x61\xfc\xc6\xbf\xba\x75\xe1\x5a\xc1\x4f\xf7\xd8\xec\x49\x1d\x8e\x41\xa9\x65\x72\x2d\x18\x02\x10\xf3\xce\x20\x00\x23\xf0\xec\x33\xae\xee\x2b\xdf\x7c\xb9\xbc\xae\x9d\x48\x5f\x81\x87\xc2\x67\xb7\x4f\xb5\x08\xd0\xdc\xfd\xa9\x37\x7a\xd9\x83\x15\xeb\xfe\xc4\xef\xe6\x04\x31\xf1\x0c\x02\x30\x22\xcf\x50\x1e\x47\x7b\xad\x5a\xbd\x15\xd4\x40\x8f\x24\x4d\x9d\x79\x14\x5d\x4a\x2c\x6c\x23\xa0\xb8\xb3\x50\x2d\xd2\x51\xb9\xa5\xae\x08\x43\x00\x62\xe6\x19\x04\x60\x84\x9e\x1d\xbb\xec\x87\x9d\xcf\xe7\x92\xdb\x57\x7a\xee\x3a\x67\x51\x89\x12\x63\x5b\x7a\xd2\x9e\x2e\x18\x96\xec\x6c\x23\x5f\x1e\x9b\x46\x02\x43\x00\x62\xea\x19\x04\x60\xc4\x9e\x51\x6f\x64\x14\xc5\x10\x2f\x7f\xde\xbb\x82\x7b\x43\xc3\xb6\xb5\xe7\xf3\x0e\x9b\x07\x1f\x1e\xed\xa3\x41\x2a\xeb\x36\xb7\x71\x42\x32\x18\x02\x10\x73\xcf\x20\x00\x23\xf8\xcc\xf5\x47\x62\xe6\x7e\x75\x50\x96\x56\x3f\xf3\xee\xca\x8f\x87\x84\x9c\xf7\x47\xea\x45\x71\x46\x43\x65\xd7\x97\xea\x48\xbb\x8d\x39\x61\x08\x40\x4c\x3e\x83\x00\x8c\xe8\xb3\xb1\xab\xe7\x0b\xde\x26\x76\xd3\x4d\xe7\x0c\xf0\x19\x8c\x13\x17\x72\x97\x5d\xa9\x2e\x71\x7f\x87\xaf\xab\x3b\xb5\x40\x3f\x4b\x7e\x1a\x86\x00\xc4\xec\x33\x08\xc0\x08\x3f\x0b\x3b\x1a\x65\x3e\x35\xae\xf0\xf5\x96\xe7\x0c\xb9\xfe\x25\x7c\x73\x6e\xb0\x4e\x7f\x6e\x79\x73\xf1\x7e\xac\xda\xbc\x55\x26\xed\xef\xf3\x26\x62\xfa\x19\x04\x60\xc4\x9f\x9d\x35\xb0\x11\x4d\xce\xb6\x8f\xbc\x64\xf0\x6d\x06\x57\x71\xcb\xcb\x54\xdf\x27\x4d\x06\xdf\x68\xa7\x68\xc8\x41\x70\xbc\xa8\x16\x82\x21\x00\x31\xff\x0c\x02\x30\x02\xd0\xca\xcb\xf9\x56\x45\x42\xe6\x68\xf9\xe8\xa2\x25\xb3\x9f\xdd\x55\x88\x53\x5d\xb5\x91\x9a\xc5\x33\xbd\xdf\x49\xd5\xba\x64\x99\xf5\x7b\x9c\x21\x26\xa0\x41\x00\x46\x04\x9a\xe0\x4b\xf6\x84\x1b\x25\xa7\x05\xab\x96\xa8\xb0\xcf\xbe\x54\x2c\x9c\x9a\x34\x51\xd5\xd2\xd0\x18\x6e\xb9\x35\x34\x1b\x32\x93\x66\x04\x43\x00\x62\x06\x1a\x04\x60\x84\xa0\x25\x7d\xe1\xf4\xe4\x48\x7e\x39\xe2\x2d\xbe\x40\xa4\x05\x56\xab\xd3\xc6\x8d\x36\xfc\x0a\xc4\x73\xfc\xc8\xb5\xe2\xf8\x41\xe6\xb6\x04\x0c\x01\x88\x29\x68\x10\x80\x11\x83\x96\xeb\x0d\xb2\x11\x0f\xf0\xa7\x73\x4b\xcb\xc8\x51\xc7\x8a\xf4\x97\x3b\x93\xf7\xf6\x74\xfa\x12\xfc\x58\x1a\x8e\x3d\x6c\x0b\xfa\xfd\x69\x22\xe5\xa0\xfd\xd5\xd0\x9d\xf4\xe7\x0c\xfe\x6c\xe8\x30\x82\xd0\x4a\x6c\xda\x49\xc6\x3a\xa2\xa5\x94\xae\x1b\x5b\x70\x65\x01\x8d\x97\x4c\x0a\xee\xa9\xe1\x4f\xef\xdf\x62\x78\x3f\x13\x83\xa3\x4d\x0f\x43\x00\x62\x12\x1a\x04\x60\x44\xa1\x59\x1b\x07\x8c\xde\x00\x78\x00\x89\x34\x63\x99\xeb\x21\x05\x4b\x83\x41\x9c\xd7\x39\x14\x99\xe5\xa9\x14\x51\x3f\x4c\x48\xb7\x59\x61\x08\x40\xcc\x42\x83\x00\x8c\x30\xb4\x98\x58\xab\x39\x7b\x1e\xfe\x31\x16\x27\xcd\xf1\xb2\xce\xfe\x7b\x72\x2f\x7f\x38\x34\x72\xae\x82\x3c\x51\xf9\xfd\xc4\x82\x55\xbf\xfb\x79\xc4\x34\x34\x08\xc0\x88\x43\x0b\xe9\xf9\x90\xe1\x48\x43\xd0\xb6\xf2\xe2\x26\x59\x47\x59\x99\x24\x61\x7d\x10\x4b\xe4\xf9\x37\x78\xa4\x23\xd0\xd6\x6b\xe1\x4b\xbf\xe7\x40\x88\x79\x68\x10\x80\x11\x88\x66\x37\xf8\xe8\x9c\xd4\x88\xf8\x19\x37\x6b\xbd\xe2\x0d\xeb\x8f\x4c\x26\x42\xe2\x1f\xed\xa4\x99\xbe\x7c\x7e\x4b\xa2\xe7\x79\x99\xef\x26\x0c\x01\x88\x89\x68\x10\x80\x11\x89\xb6\xad\x88\x6f\x0c\x2c\x2f\xe9\x3d\x0a\xd9\x7a\x31\x2b\xe8\xeb\x2f\x79\xd9\xd3\x72\xae\xf5\x25\x6e\xcd\xed\x3e\xe3\x24\x8b\xa7\xdc\x30\x04\x20\x66\xa2\x41\x00\x46\x28\x5a\xf6\xca\x38\x77\xeb\xbd\x9d\x31\x8b\x80\xc0\x33\x4b\x56\x26\x84\x00\xf3\x4d\x92\x27\xfe\x2f\xe5\x4e\xc7\xfc\xcc\x92\x9b\xe1\xfc\xfd\xca\x10\x53\xd1\x20\x00\x23\x16\xed\xd5\x06\x81\x69\x7f\xb0\xb6\xd1\x57\x78\x7c\xf4\x09\x0e\xdb\xf7\x0e\x77\xd6\xb9\x96\x87\x4e\x77\xc6\xcc\x6f\x3d\x9f\xb8\x14\xf9\xbb\x05\x40\xcc\x45\x83\x00\x8c\x60\xb4\xec\x3b\x38\xf7\x9d\xaf\x4c\x8f\x9f\xda\x6d\xd0\x39\xec\x96\x9c\x9b\x07\xc2\x06\x17\xd3\x98\x82\x13\x6a\x77\xb0\x64\x34\xbc\x51\x30\x04\x20\x26\xa3\x41\x00\x46\x34\x1a\xb9\x6d\x31\x7f\xac\x6d\xbb\xbf\xa8\x56\x3b\x2f\x2e\x05\xff\x96\x4d\xd0\x4a\xc2\xde\x5b\xeb\x6f\xec\xb1\xa4\xdd\x75\xb0\x38\x13\x0c\x01\x88\xd9\x68\x10\x80\x11\x8e\x96\xb4\xad\x7c\xaa\x67\x66\xaf\x7a\x75\x78\x75\x4f\x55\xf5\xc2\x22\x79\x72\x7b\x1c\x87\xf2\x6d\x3c\xd5\xdd\x7e\x03\xd3\xf8\x1e\x62\x18\x02\x10\xd3\xd1\x20\x00\x23\x1e\xad\xd6\x47\xe3\xc2\xa3\xbd\xe7\xe7\xce\x9b\x9f\x27\x52\x48\x51\x91\x0b\xa6\xb9\x2f\x5b\x81\x47\x91\xe6\xe6\x3b\x93\xdc\xfd\xe8\x91\x30\x0c\x01\x88\xf9\x68\x10\x80\x11\x90\xe6\x48\xc3\x92\x4b\x43\xcd\xd1\xa5\x93\x65\x14\xe1\x47\x71\x77\xec\x9a\x59\xdc\xb3\xed\xd8\x7e\x77\x8b\xc4\xf8\x79\x52\xf6\x22\x3a\x18\x02\x10\x13\xd2\x20\x00\x23\x22\x4d\x82\xea\xea\x1b\x39\x05\xdc\xef\xd9\x7a\xa2\xd8\xbe\xab\xa8\xca\x7d\x13\xfc\xd9\xa4\x76\x05\xd8\x64\xcb\xab\xda\xf2\xb9\xf7\xef\xf6\x1c\x31\x23\x0d\x02\x30\x42\xd2\x26\xed\xe3\xb9\x0e\x5e\x0a\x94\xda\x04\x2b\x04\xbd\x35\xac\x64\xbe\xe1\x50\x24\xda\x99\x5b\x7e\xbe\x65\xfc\x91\x35\xaf\x76\xe5\xef\x4f\x13\x31\x25\x0d\x02\x30\x62\xd2\x1e\x0f\x85\xcd\x7f\xa9\x90\xc4\x16\xb2\xa1\x5c\xba\x99\x1d\x2d\xa9\x92\x69\x49\xba\xbe\xb3\xff\xd2\x27\x5d\xd1\xa6\x2d\x87\xea\xf7\xbe\x89\x98\x93\x06\x01\x18\x41\x69\xa7\xd8\xdd\xd4\xaf\x96\x1e\xf0\xea\x09\x71\x65\xd1\x99\x87\xbf\xfb\xb2\x4c\xbd\x67\xaa\x74\x21\xed\x25\x2f\x01\x81\x44\xb2\xf3\xef\xd3\x19\x62\x52\x1a\x04\x60\x44\xa5\x5d\xe5\xc5\x51\xe4\x8f\x71\x55\x53\x96\xb8\xc5\xad\xc3\x91\xf1\x90\x94\x69\xba\xdd\xc3\x06\x47\xae\x31\x50\xd7\x91\x07\x9b\xe4\xf7\xd0\x40\xcc\x4a\x83\x00\x8c\xb0\xb4\x0b\x2c\x96\x15\x3d\xe6\x1a\x9a\xc9\xa4\x30\xf7\xfb\x18\x1d\xc2\xf8\x3e\x48\xf8\x51\xf7\x1d\xd4\x33\x9e\x4e\xf2\x2b\x09\x4b\xbf\x8f\xf3\x88\x69\x69\x10\x80\x11\x97\x86\xbb\x6e\xf7\xdc\x36\xc5\x06\xef\x81\xe3\xfc\x45\x67\x25\x8b\xb2\x91\x9a\xd2\x21\xd2\x03\xf9\xd1\x11\x26\x77\x4d\x71\xaf\x41\x3e\x18\x02\x10\xf3\xd2\x20\x00\x23\x30\xed\xea\x5b\xdd\x94\xdc\xb4\xc3\xe6\x4d\xa3\x84\xf3\x44\xb3\xd5\x4c\x53\xda\x57\x8c\x4a\x26\x7c\x15\xb6\x85\x5b\x9d\xad\xd9\xa6\x7e\xef\xe8\x88\x89\x69\x10\x80\x11\x99\xb6\x61\x2e\x79\x49\xe7\xe6\x13\xcf\x56\xdc\x77\x7c\x4f\xee\x1b\x50\x9f\x59\xab\x7e\x28\x73\x5b\xeb\xb5\xdc\x11\x1d\x47\x59\xbd\xd3\xef\x43\x10\x62\x66\x1a\x04\x60\x84\xa6\x15\xda\xc8\x14\x56\x2f\x32\xb8\x63\x3d\x58\x56\x9f\x9a\x39\x93\xdd\x3c\xcf\x48\x7e\x99\xc1\x7c\xf9\xc6\x3e\xa3\x95\xaf\x26\xe7\xef\x83\x23\x62\x6a\x1a\x04\x60\xc4\xa6\xe9\x13\x3a\x0e\xd1\xd2\x4b\xe0\x38\x85\xff\xd2\xe3\x6f\x4a\xca\x31\xab\xd5\xb8\xb2\xf8\xe1\x70\x09\x12\xea\xa1\x7f\x58\xa2\x7a\x06\x86\x00\xc4\xdc\x34\x08\xc0\x08\x4e\x6b\xbb\x6e\x1c\xf1\xee\x82\xdf\x29\xd1\xff\x1f\x73\x6f\x1d\x55\x45\xf4\xbf\xff\x32\x94\x34\xa8\xa0\x8c\x80\x74\x48\x37\x28\x5d\x82\xb4\xb4\x20\x82\x02\x02\x92\x22\x02\x22\x20\x87\x46\x50\xba\xa5\x53\x40\x14\xa4\x94\xee\x90\x90\x10\x69\x50\x4a\xe9\x96\xf6\x2e\x7f\xbf\x75\xb8\x7c\x06\xcf\x9a\xcf\xf7\x5e\xff\xf8\xae\xe5\x9f\x8f\xef\xf3\x9e\xfd\x9c\xb3\xf7\x7e\x66\xcf\xbc\xd0\xa9\xff\x4d\x72\xe6\x3a\xfa\x41\x03\x57\x83\x54\xe3\x1b\xdd\x15\x89\xfa\x3a\xab\x4f\xeb\x7f\x02\x2a\x4a\x72\x1a\x08\x40\xd0\x69\x2c\xb6\x05\x86\xe9\xe5\x93\x4a\xe6\x61\x32\x65\x63\xc3\x6d\x2f\x72\xb9\x8d\xf9\xe3\xcf\x91\x72\x02\xdb\x46\x34\x3c\xcc\xf8\x7f\x72\x38\x4a\x76\x1a\x08\x40\xe0\x69\xae\x97\xfd\x3f\x88\xdc\xf1\xb7\x2e\x61\xbd\xb1\x7a\x54\x20\x60\x82\x65\x7f\x50\xc7\x07\x86\x70\x0e\x2d\xf6\x5c\x2e\xcb\xe5\xe3\x45\x80\x00\x4a\x7a\x1a\x08\x40\xf0\x69\x88\xb7\x7c\xdf\xb6\x5d\xda\x4a\x34\x9a\x29\xe4\x0d\xf0\x30\x03\x6f\xd7\xfa\x62\x98\x49\x77\xbe\x3a\xf8\x2c\x88\xb7\x4a\x64\xf4\x00\x01\x02\x28\xf9\x69\x20\x00\x01\xa8\x5d\xc9\xae\x9a\xaa\xfc\xfe\x26\x31\xfd\xcd\x2b\x1a\xac\xda\xc3\x4e\xeb\x2c\xff\x51\x56\xe3\x41\x85\xd6\x2e\xda\x78\x0e\x1c\x51\x74\x04\x08\xa0\x24\xa8\x81\x00\x04\xa1\x96\xc9\x18\xd7\xb6\xe4\xa8\xe8\x9f\xe8\x1b\xc4\xe8\xa1\xb8\x64\x74\x26\x3b\xd6\x8e\x8a\xdf\x96\xbe\x6d\xc2\x16\x11\xd4\xb9\xfc\xe7\x4b\x8b\x92\xa1\x06\x02\x10\x88\x5a\x56\xcd\x83\xea\xd6\x21\x8d\x2b\x23\x0e\xf7\x67\x0e\x95\x54\x14\xba\x17\x3f\xa6\x5e\x0f\xbf\xcf\xb2\xf5\x05\x8d\x81\x95\xeb\x33\x29\x02\x04\x50\x52\xd4\x40\x00\x82\x51\x3b\x58\x14\xca\x11\x74\x59\x15\x7e\xc3\x90\xaf\xcb\x7a\x9d\x8a\xdc\x24\x34\x87\xec\xfa\x87\x56\xa6\x01\x11\x6c\xc2\x10\xfa\x10\x7d\x04\x08\xa0\xe2\xa8\x21\x37\x74\x70\x7f\x74\xea\xe4\x86\x0e\x02\x52\xe3\x2d\x33\xa7\x1a\x16\xbd\x1e\x29\x05\x9c\x37\x0d\x18\xac\xe0\x24\xf8\xe6\xb1\xa1\xf5\x8a\x83\x20\x98\xe4\x2e\x85\xea\x46\xb2\x21\x02\x04\x50\x92\xd4\x40\x00\x82\x52\xab\x55\x98\x1f\x2e\xa7\xdb\x3b\xe3\x86\xc6\x9b\x3b\xe0\x74\xb9\x53\x8f\x89\x2d\xe6\xed\xde\x00\xa9\xc2\x64\xed\xed\xd0\x97\x97\xff\xcc\xf3\x28\x59\x6a\x20\x00\x81\xa9\x3d\x8b\x3c\x30\x72\x1e\x88\xea\x5e\x6d\xfc\xdc\xf8\xca\x3e\x66\x2e\x77\xe8\x76\xac\x5e\xfe\x44\xc9\xcd\x74\x85\xe2\x07\x94\xe5\x1c\x08\x10\x40\x49\x53\x03\x01\x08\x4e\x2d\x74\x9a\xfd\xe6\x6c\x79\xb5\xfa\x55\x86\x68\x2f\xb4\x5d\xef\x60\x7d\xb1\x67\x0d\x4d\x75\xeb\x7e\xad\x44\xa5\x8d\xdd\x6e\x35\x7f\x7e\x32\x28\x79\x6a\x20\x00\x01\xaa\xcd\xef\x3e\x0b\xed\x5d\x33\x37\x7a\xdd\x54\x7c\x3e\xbf\x40\x6d\x97\xfc\x47\x33\x26\x4d\x84\x0f\x46\xd0\x5d\xbe\xbb\xae\xe9\xf7\xff\xac\x8d\x28\x89\x6a\x20\x00\x41\xaa\x89\xd2\x5a\xd4\x57\xdb\xad\x4c\xef\x95\x99\xc4\xa3\x1d\xa5\x57\x31\x85\x74\x75\x44\xdc\x39\xf3\x1e\x1d\x57\xd2\xf7\xea\xe2\xfe\x9f\x10\x8a\x92\xa9\x06\x02\x10\xa8\x9a\xba\x7b\x02\x1d\x5d\x49\x8b\xcb\xb5\xdb\xfb\x45\x3d\x5f\xef\xe1\x86\x5c\xe4\x0e\x96\xa1\x1e\x54\xb8\x70\x99\xa0\x06\xaf\x95\xe7\x22\x02\x04\x50\x52\xd5\x40\x00\x82\x55\x93\x0f\xd0\xbb\xcd\xf3\x2e\xfe\x25\xd8\xff\xa6\xf5\x7b\x75\x9d\xdd\xe4\xb4\xdc\x66\x95\x50\xd5\xc4\x90\x67\x6f\x45\x7c\x55\xd2\x9f\xed\x39\x4a\xae\x1a\x08\x40\xc0\x6a\xbe\x37\xe6\xf7\x97\xf2\x6f\xac\x0c\xe4\x84\x60\x48\x87\x66\x64\xf1\x2c\x2a\x2e\x47\x12\x09\x24\xc6\xdb\x56\x7f\x38\x14\x0d\xa5\x41\x80\x00\x4a\xb2\x1a\x08\x40\xd0\x6a\xf7\x6a\x45\xeb\x79\x8c\xb3\xb7\x04\x86\x29\xd0\xbb\x2d\xcc\x69\xe4\x7e\x48\x4a\xf7\xfb\xb2\x1e\x25\xfb\x51\x10\x60\x7b\x78\x5a\x22\x40\x00\x25\x5b\x0d\x04\x20\x70\xb5\x9b\xae\xa2\xd9\x3d\x84\x3e\xad\x3f\x25\xa3\xc7\xd2\x0f\x0d\x7d\xdc\x01\x34\xf0\x8c\xad\x43\xb1\xe4\xeb\x48\xfd\x29\x4c\x59\x7a\x04\x08\xa0\xa4\xab\x81\x00\x04\xaf\xb6\xc7\x32\x59\x5d\xce\x7c\x58\x4d\x89\x9e\x54\xf2\x2e\xd8\x72\xf2\xf7\xe7\x85\x75\x95\x20\xe5\x96\xc4\x9f\xee\x45\x8d\x2f\xdf\xfd\x49\xb4\x28\xf9\x6a\x20\x00\x01\xac\x91\x64\xf8\xc6\x6a\xb2\x3e\x7e\xb3\x15\x44\x20\xb5\xb6\x19\xf4\x1d\x3f\xc9\x30\xc3\x97\xbf\x6f\x70\x63\x8a\x35\xdc\xb8\xe4\x01\x19\x02\x04\x50\x12\xd6\x40\x00\x82\x58\xe3\x75\x3a\xea\xc7\xec\xfd\xf0\x55\xa5\x85\x50\xff\x29\x17\x71\x28\x25\x75\xe2\x60\x4e\x9d\x88\x7f\x87\x99\xdf\x8a\x60\x4c\x88\x05\x02\x04\x50\x32\xd6\x40\x00\x02\x59\xc3\xdc\x91\x57\xf9\x5c\x5c\xae\xdb\xcf\xc6\x92\x84\xf6\x9e\x52\x54\xb7\xbd\x41\xea\xdc\xec\xdb\x38\xb1\x0e\x11\xfc\xa4\x97\x96\xcc\x08\x10\x40\x49\x59\x03\x01\x08\x66\xcd\x48\xb3\x7e\xeb\x99\x80\x7e\xd4\x2c\xf5\x63\xde\x6e\xc6\xa0\xe7\x73\xd7\xdf\x88\xa7\x76\x36\x56\xde\x4c\x5d\x49\x33\x89\xa9\xb7\x41\x80\x00\x4a\xce\x1a\x08\x40\x40\x6b\x71\x46\x67\x2f\x6a\x24\x5d\xbb\x56\xaa\x9a\x58\xba\x82\x53\x81\x3e\xf5\xea\x3e\xcd\x2f\x95\xa0\x90\xfc\x8f\xa9\xab\x99\xba\xe0\x19\x04\x08\xa0\x24\xad\x81\x00\x04\xb5\x16\xe0\x65\x59\x07\x0c\xcc\x3f\xde\x89\x4b\x39\xfa\x45\x15\xcd\x68\x14\xb5\x48\xc3\xcb\xf4\xce\xb2\xba\xb7\xe1\x83\xc0\xdb\x18\x79\x04\x08\xa0\x64\xad\x81\x00\x04\xb6\xf6\x5a\x15\xac\x97\x16\xe3\xc2\x98\xd5\xf1\x8e\x05\x6e\x95\xbd\xbb\x6f\x84\xa8\x66\x97\xa3\x9c\xbe\xaa\xa7\x59\x51\x68\xea\xf9\x67\x77\x88\x92\xb6\x06\x02\x10\xdc\x9a\x7b\xbe\xb3\x68\x96\x61\x28\x15\xdd\x84\xd7\xab\x70\x72\xdf\x9c\x47\xf9\xcf\xbb\x4d\xcc\xf6\x0c\xec\x99\xea\x3c\xc3\x5e\x88\xff\xf9\x9e\xa1\xe4\xad\x81\x00\x04\xb8\xd6\xf2\x44\xee\x88\xdb\x31\x00\xef\xfb\x27\x16\xdd\x43\x59\x8d\xed\x4c\xa2\x9b\xbc\x5f\x8d\x04\xc2\xef\xeb\xd0\xfb\x3d\xef\x4f\xd3\x46\x80\x00\x4a\xe2\x1a\x08\x40\x90\x6b\x2d\x3f\x9f\xdb\xc9\x89\xda\x67\x3f\x94\x88\xe2\xdb\x2e\xc1\xa8\x7a\xe9\x59\x6e\x95\xd9\xb0\x4c\x4a\x70\x45\x93\xe2\x4d\xa2\xc2\x9f\x9d\x0e\x4a\xe6\x1a\x08\x40\xa0\x6b\x21\xa5\x2b\xe1\x43\x3c\x7c\x1f\x52\x24\x5e\x1f\x32\xd7\xc9\xb4\xb8\x0f\x32\xc6\xd2\x06\xbb\xa0\x37\x1f\x0c\x17\x15\x9a\xfb\xfc\xd9\x1d\xa2\xa4\xae\x81\x00\x04\xbb\x36\x3e\x31\x6b\xc6\xf7\x9d\xb4\xab\xd1\x91\x2f\xf8\x9a\x1f\xd9\x7d\xc7\x47\x96\xb4\x2c\x5d\xf5\x3f\x09\xa9\x0d\x55\xbe\x45\x62\xfe\x89\x81\x28\xb9\x6b\x20\x00\x01\xaf\xc5\x5d\x92\x99\x9d\x3c\xbf\x7a\xa3\xe5\x49\x90\x32\x97\xa5\x3f\xa6\x6f\x9c\xa5\x54\xec\x7c\x03\x82\x26\xa4\x86\x40\x47\xe8\x0c\x15\x02\x04\x50\x92\xd7\x40\x00\x82\x5e\xc3\x7a\xda\x45\x5d\xea\x6a\x3c\xf9\x6c\x7d\x45\xe1\xa7\x69\xf5\xb2\x15\xe3\x75\x3b\x5f\x33\x93\xc6\x0e\x63\xdf\x04\x0e\x7f\x59\x29\x04\x08\xa0\x64\xaf\x81\x00\x04\xbe\xa6\x42\x31\x3b\x14\x4b\x1e\x66\x58\xa9\x19\xcf\x57\xcc\x6b\xb0\x88\x6b\xa2\xe9\xe4\xb2\x1d\x93\x57\x4a\x16\x99\x9c\x1a\xb9\x7d\x1e\x01\x02\x28\xe9\x6b\x20\x00\xc1\xaf\xbd\x4c\x5a\x2b\xaa\x5d\xfe\x55\xdc\x1d\x93\x2d\x3e\x48\xdd\x68\xc2\x9f\x32\xc8\xcb\xae\xa5\x4a\xfe\x2d\xe3\xf7\x77\xac\xed\x7d\x16\x04\x08\xa0\xe4\xaf\x81\x00\x04\xc0\x66\x4d\x96\x23\xf6\x30\x29\xd9\xe7\x9e\x2e\x6e\xc6\xdc\xbe\x5a\x28\xdb\x39\xb3\x83\x25\xc3\xd6\xa2\x2f\x9e\xcd\x56\x93\x6e\x86\x26\x08\x10\x40\x49\x60\x03\x01\x08\x82\x4d\x8d\x85\x5e\xaf\xd4\x30\x7d\xd6\x96\x73\xea\x96\xfd\x8a\x0c\x1b\x7e\x9e\x46\x94\x16\x9b\xda\x05\x9d\x86\xdf\x84\x5c\x45\xdc\xd2\x08\x10\x40\xc9\x60\x03\x01\x08\x84\x8d\x49\x32\x32\x91\xc5\x18\x13\x1b\xb1\x94\xec\xc6\xed\xc3\x92\x43\xc0\xda\x38\xd4\x5c\xc7\xf2\x49\xe9\x60\xff\x65\x81\x9d\x93\x28\x02\x04\x50\x52\xd8\x40\x00\x82\x61\xe3\xcc\x36\x0b\xf4\xc9\x10\x67\xe7\xc7\x70\x13\xf2\x1c\x64\xc4\x1f\x52\x29\x92\xa9\xfe\x55\x12\x1e\x63\x93\xd9\x71\x7e\xfa\xe6\x1f\x37\x51\x71\xd8\x90\x1b\x3a\xb8\x3f\x0d\x7a\x72\x43\x07\x01\xb1\x51\x12\x99\xe8\x47\xd1\x04\x35\x53\x95\xc9\x4a\xe8\xf6\x98\x6a\x87\xca\xba\xe2\x5e\xec\xc2\xbe\xf9\x61\x12\xe4\x0a\x39\x7b\xf8\x67\x39\x43\x49\x62\x03\x01\x08\x8a\x8d\xda\x4c\x43\xb6\x3a\x25\x79\xed\xa9\x59\x45\xb2\x6e\xba\x8c\x46\xf4\xb3\xc2\x7d\x00\xf7\x5d\xd0\xac\x9c\xe3\x2c\x0f\x7f\xcf\x9f\xfd\x04\x4a\x16\x1b\x08\x40\x60\x6c\x6f\x6d\xdc\xb5\xf8\xaf\xfc\x18\xcb\x98\x72\x39\x5a\xc6\xd1\x92\xc8\x6b\xa1\x5c\x13\xfc\x5a\xa7\xc2\xff\xb6\x5f\xe0\x72\xe5\x7d\x59\x04\x08\xa0\xa4\xb1\x81\x00\x04\xc7\x26\x80\x93\xf1\xfd\x8b\xd8\xf4\x20\x90\x33\xe0\x32\x18\x22\x59\xdf\x1d\x13\x4a\xc8\xd5\xbe\x87\x4d\xe5\x9f\xd5\xed\xfb\xa9\xe1\xcf\x1e\x0c\x25\x8f\x0d\x04\x20\x40\x36\xad\x87\x87\xb4\x9c\x8e\x5c\xc9\xd8\x5b\xbf\x82\xef\xf7\x6f\x48\xdf\xf2\x61\x05\x80\x60\xbb\xe5\x51\xf6\x0f\x44\x13\x60\xb7\x16\x02\x04\x50\x12\xd9\x40\x00\x82\x64\x73\x9f\x1a\x89\x61\xdd\xee\xbd\x16\xa6\x7a\xf5\xab\x53\xa9\xd1\xb0\xf6\x92\xf8\x88\xf2\x6f\xf7\xd8\xd7\xac\xe2\x39\x57\xd9\x47\xff\x4c\xcd\x28\x99\x6c\x20\x00\x81\xb2\xd5\x46\x60\xfd\x18\x12\xde\xef\x7a\xdd\xf6\xfd\x52\x47\xb3\x71\xfa\xba\xf3\x5b\x26\x96\x08\x2d\xc5\x58\xc7\x4e\xa5\xf4\xeb\xe7\x34\x10\x20\x80\x92\xca\x06\x02\x10\x2c\x9b\x8d\xfc\x65\xdf\xaf\xb1\x49\xaf\x41\x76\x8c\x10\xc5\xad\xde\x75\x55\x8c\x8e\xea\xe4\xb5\xdd\x90\x7b\x6a\x20\xda\x7b\xaf\xb2\x3f\xdb\x26\x94\x5c\x36\x10\x80\x80\xd9\x3a\xa7\x0b\x65\x1d\xf2\x1d\x00\xc6\x03\x43\x8c\xaa\xd8\x9b\xbe\xfc\x36\xe3\x32\x57\x77\xa8\x07\xce\x74\xd9\x89\x2a\x69\x71\xff\x09\x0e\x28\xc9\x6c\x20\x00\x41\xb3\xb1\x2f\x45\xd4\xa9\xbb\xe9\x7d\xbe\xd1\xef\xb4\xa3\x43\xcf\x53\x37\x4a\xa1\x95\x73\x0e\x2d\x35\x9e\xbb\x47\xb3\xfc\x0b\x3f\x95\x2e\x02\x04\x50\xb2\xd9\x40\x00\x02\x67\x4b\xbb\xa6\xe0\x60\xba\x9d\x57\xcc\x1b\x4c\x92\x65\x79\xb4\x71\x43\x95\x60\xa0\xd0\xe2\xae\xe7\x3e\xd6\x9b\x16\xe2\x47\x89\x4c\x5c\x08\x10\x40\x49\x67\x03\x01\x08\x9e\xed\xe2\x15\x87\xdb\xc3\x2b\xa2\xe8\x69\x3f\xc8\x23\x44\xbf\xaa\xd8\xe3\x1f\x54\xf9\xce\x8d\x14\x3e\xfa\x14\xb5\x1a\x1e\xf8\x11\xed\x2e\x02\x04\x50\xf2\xd9\x40\x00\x02\x68\xfb\xa0\xfd\xe1\xb2\x49\xc0\x74\x7b\xea\xb5\x46\x5e\xd3\x1f\x61\x37\xf4\x97\x4d\x19\xbf\x51\xc9\xde\xb3\xaa\x7b\x86\xf8\x8e\x77\xd7\x1c\x01\x02\x28\x09\x6d\x20\x00\x41\xb4\x31\x4a\x13\x0c\xe2\x4f\x76\x67\x9e\x51\x36\x1d\xad\xc0\xc6\xff\xf1\x62\xab\x4c\xb9\x34\xe1\x70\x84\xf4\xab\xac\xc9\x9e\x8b\xd0\x9f\xdf\x26\x4a\x46\x1b\x08\x40\x20\x6d\xf6\xad\xc1\x99\x78\x5f\xfb\x68\x5f\x7b\x11\x3e\x0e\xc1\xd8\x78\x99\x8c\x85\xfe\x61\xb8\x98\x8e\x2c\x70\x36\x37\x3f\x57\xa0\x81\x17\x01\x02\x28\x29\x6d\x20\x00\xc1\xb4\x35\x6e\x56\x45\x60\xd9\x1d\xba\x52\xd5\xe9\x0e\xaf\x74\xcc\x81\x29\x78\xda\x73\x39\x77\x32\x5c\xc3\x03\x7f\xdc\xc6\x70\x00\xff\xec\x5b\x51\x72\xda\x40\x00\x02\x6a\xdb\x0f\xab\x77\x6f\x5b\x17\xea\x95\x8d\xc2\xfb\x40\xc7\xdf\xad\x82\xb1\x56\xc7\x64\x2c\x85\xc0\xc4\x1f\xad\x2f\xf3\x65\xd7\x35\x45\x80\x00\x4a\x52\x1b\x08\x40\x50\x6d\x82\xcf\x29\x1a\xce\x9d\x7b\xa8\xff\xf6\xd3\xdd\xdf\xfc\x81\x1f\x19\x31\x94\x7a\xa9\xf0\x96\xf9\xf7\xf3\xdd\x48\x09\xc2\x36\x6a\xff\x84\x2d\x94\xac\x36\x10\x80\xc0\xda\x7a\xf2\x19\x83\x84\xb7\x44\xb5\x08\x93\x98\xe2\xce\x1b\x38\x45\xe7\x77\xde\xd9\xb2\x0b\xe3\xa2\xba\xf5\xbe\xe0\xfe\x04\x79\x17\x2e\x02\x04\x50\xd2\xda\x40\x00\x82\x6b\x3b\x98\x27\x65\xac\x5f\xd4\xbb\x88\x7d\xe6\x45\xd7\x5b\x37\xe2\x1e\xf1\x4a\xaa\x16\x16\x2b\xa5\x08\x45\x92\x4d\x2c\x26\xd1\x1d\x42\x04\x08\xa0\xe4\xb5\x81\x00\x04\xd8\xd6\x91\xa1\x45\x92\x33\xe3\x17\x8b\x78\xd1\x24\x9b\xbf\xd8\xec\x2a\x93\xe2\xe6\xb9\x7a\xa7\x77\x8f\x29\xf9\x20\xee\x03\xc0\xfe\x27\x3a\xa3\x24\xb6\x81\x00\x04\xd9\xa6\x89\x5f\xf1\x92\x30\xb3\xba\x86\xb0\xd8\xda\xdb\x27\x62\x06\x11\xcd\x28\x4e\x0e\x70\x29\xb8\x1e\x55\x9e\xbd\x12\x9a\xf1\xe0\xcf\x8e\x1a\x25\xb3\x0d\x04\x20\xd0\x36\x15\x5f\x43\x09\x16\x91\x0c\x0f\x5a\x71\x55\x47\x89\xdd\xb3\x8b\xb5\x8c\x63\xe7\x9d\xce\x60\x3e\x61\xf4\x1f\xa6\xac\x28\xf8\xa1\x8c\x00\x01\x94\xd4\x36\x10\x80\x60\xdb\x14\x95\x1f\xdd\xa5\x7a\x27\x5f\x96\x38\x3c\xd6\x4c\x38\x2e\xf3\xa2\xf6\x69\x32\xc7\x7e\x24\x91\x5f\x43\x5d\x09\x83\x2c\xc6\x34\x36\x02\x04\x50\x72\xdb\x40\x00\x02\x6e\xe3\x5d\x6a\x8d\x63\xa7\xd4\xba\x4b\xb4\xf1\x76\x60\x11\xe1\xa7\xbf\xf2\x4d\xe8\xe1\xb3\xb6\x95\x5d\x96\x48\x1d\xba\xaa\x02\x74\x4a\x04\x08\xa0\x24\xb7\x81\x00\x04\xdd\x76\xc8\x86\x71\x8b\x71\xe0\x5d\xd7\x2b\x75\x9e\x75\xec\x38\x6d\xdc\x39\x9d\xc4\xa2\xd0\xc6\xf3\x3c\xeb\x74\x97\x4d\xa8\xad\xa8\xcd\x10\x20\x80\x92\xdd\x06\x02\x10\x78\xdb\xcd\x9d\x2a\x7c\x2b\xf5\xdc\xd7\xa4\xbd\x11\x04\xb3\x17\xe2\x69\x6b\x5e\xfe\x5a\xdc\x30\xbc\x4f\x2b\xfe\xb6\xc7\xa7\x99\x44\x56\x1f\x01\x02\x28\xe9\x6d\x20\x00\xc1\xb7\x21\xaa\xef\xaa\x34\x7e\x10\x51\x9c\x79\x1b\xd8\x0b\x68\xb3\xc7\x5d\x1e\xbd\x7a\xfb\x77\xba\x8e\x9c\x7a\x0a\x07\x5e\x5f\x12\x83\x15\x02\x04\x50\xf2\xdb\x40\x00\x02\x70\xdb\xdd\x99\x63\xed\x4b\xaa\xbd\x36\xd8\x77\x66\xf9\xb6\xd4\x85\xf2\xd2\x03\x97\xfb\x39\x97\xad\x0f\x65\x22\xc8\xa5\xcb\x79\x38\x18\x10\x20\x80\x92\xe0\x06\x02\x10\x84\x9b\xda\xbd\x57\xca\xbb\x13\x66\x01\x72\xf2\xb3\xed\x19\xb7\xd2\xdb\xae\xfc\xf8\x64\x97\xe3\xf6\xf0\x87\x5d\xf2\x03\x3c\x1c\x01\xcb\x6b\x08\x10\x40\xc9\x70\x03\x01\x08\xc4\xed\x9d\x10\x03\xb9\x69\x32\xbd\xe7\xe0\xd5\x20\xa3\xe1\xae\x18\xdb\x4f\xb6\x15\xef\x53\xb1\xa7\x2b\x24\x09\xa4\x54\x4a\xfc\x1b\x1e\x21\x40\x00\x25\xc5\x0d\x04\x20\x18\x37\x5f\x5e\xc3\xe5\xb0\x5d\x2a\x7d\xfd\xec\x75\x39\x3d\x39\xb0\xa2\x7a\xb1\x6c\x6b\xd2\x89\xed\xfe\xee\x67\xaa\x62\x25\x3d\xd9\x3f\x29\x04\x15\xc7\x0d\xb9\xa1\x83\xfb\x03\xee\x27\x37\x74\x10\x90\x9b\xbd\x58\xea\x93\x2d\x86\x3e\xfe\x44\x8b\x0f\xe2\x3c\x0b\x2f\x0a\x24\xbe\x4d\x84\xdc\xfa\xfd\x25\xb8\x07\x93\x29\xf4\xc2\x40\xe5\x9f\xbd\x29\x4a\x92\x1b\x08\x40\x50\x6e\x23\x9b\x99\x63\x72\x0f\x74\xad\xdc\x1d\x3e\x77\x2e\xf8\x77\xdd\x78\x2c\x5b\xf8\xbc\x49\xdf\x06\xcc\x39\xcf\xe4\xf0\x1a\xe3\xd1\x3d\x04\x08\xa0\x64\xb9\x81\x00\x04\xe6\x76\x8b\x6b\x6d\xdc\x23\x11\x48\xbb\xcb\x8e\xb6\x16\x1a\x11\x35\x62\x21\xa3\x3a\x36\x2a\x9a\x88\x58\xbd\xb7\xe6\x33\xff\xbe\xc6\x0e\x01\x02\x28\x69\x6e\x20\x00\xc1\xb9\x31\xa5\xba\x2a\xff\x4e\xa6\x4a\x75\x37\x00\xae\xee\x3b\x8c\x99\xaa\x5e\xe6\x61\xb8\x64\x54\xd5\xd6\xd7\xb7\x32\x3c\xc3\x01\x52\x23\x40\x00\x25\xcf\x0d\x04\x20\x40\x37\x2d\x0a\x22\x74\x42\xf9\xb4\xb4\x77\x24\x87\x29\x64\x69\x8f\x87\x30\x3d\x58\xd2\x76\xed\x7a\x87\xd6\x87\x23\x70\x9e\x4d\x60\xff\xd9\x04\xa3\x24\xba\x81\x00\x04\xe9\x96\x46\x62\xf2\x4c\xa2\xd5\xb0\x08\x90\xce\x3e\x53\x5e\xac\x93\xb5\x3d\x39\x3d\x95\x88\xb6\xf3\xa5\xc7\x46\x4a\xa5\x9e\x22\xec\xcf\x0a\x84\x92\xe9\x06\x02\x10\xa8\x1b\x3d\xaf\x6e\x4b\x8d\x8a\xdd\x08\x9e\x70\x6d\xe6\x19\xc6\x1a\x2f\xfa\x95\xdd\x04\xac\x7b\xb1\xca\x6a\x65\xae\xce\xf9\x63\x67\xfe\x6c\x01\x50\x52\xdd\x40\x00\x82\x75\xe3\xc0\xdb\xe2\x50\x30\x71\xaa\xbc\xcc\x18\x53\xb4\xfe\xed\xb6\x65\xfa\x86\xc0\xf3\x24\xb7\x6f\x3e\x6d\x95\xeb\xd4\x18\x69\x3b\x78\x08\x10\x40\xc9\x75\x03\x01\x08\xd8\xed\xdd\xe5\xde\x99\x52\xab\x2f\x85\x84\x0a\xd2\x35\x3d\x1f\x3a\xf5\x98\x9e\x63\xdf\x9f\xea\x01\x65\x9c\x6e\x45\xf4\x87\xc6\x5f\x93\x44\x80\x00\x4a\xb2\x1b\x08\x40\xd0\x6e\xf5\x92\xe5\x92\x44\x91\x77\x75\x5d\xd0\x4d\xc9\x9e\xf9\x76\xd3\x51\xb2\x7d\xaa\xf0\xa6\xbe\xdc\xbe\x21\x37\xe9\x33\x57\x33\xf7\x67\x13\x8c\x92\xed\x06\x02\x10\xb8\x5b\xf8\x3d\x5b\x8a\x23\x30\xfa\xed\xbe\xe7\x65\x52\x6a\x3e\xa9\x35\x86\x49\xf6\x58\x16\x99\xd6\x77\xb8\x54\x41\x34\x84\x2d\xfa\x02\x08\x10\x40\x49\x77\x03\x01\x08\xde\xed\xda\x97\xec\x96\xe7\xe8\xb5\xee\x79\x21\x0b\x3a\x38\x57\x15\x74\xd4\x6f\x0a\x1b\x16\x05\x72\xdd\x1a\xae\x65\x7e\x35\x4c\xf4\xf6\x4f\x6e\x44\xc9\x77\x03\x01\x08\xe0\xed\xf5\x59\xc6\x06\x5d\x5d\x39\x82\x20\xe1\x42\x73\xd5\xbd\xd6\x2e\x0e\xb9\xa6\x57\xdc\xb7\x4b\x82\x48\x6c\xe6\x2f\xa7\x36\x05\xe3\x20\x40\x00\x25\xe1\x0d\x04\x20\x88\xb7\x47\xa9\x9d\x2e\x7a\xcb\x53\xf3\x1e\xd7\x88\xd3\x0d\x8c\x58\xaa\xbe\x8c\x70\xd9\x3a\xe5\x0d\x06\xff\x58\x37\xbf\x73\x7e\x82\xed\xcf\x3c\x8f\x92\xf1\x06\x02\x10\xc8\xdb\x6e\xcc\x8f\x8f\x1a\xa2\x86\x0d\xbe\xa6\x22\x44\x74\x98\xd7\x8b\xeb\x73\xbd\x42\x3f\xbc\xf7\xe7\xd7\x5e\x77\xa9\x59\x63\xef\xd3\x41\x80\x00\x4a\xca\x1b\x08\x40\x30\x6f\xe3\x33\x81\xac\xb6\xc9\x0f\xbf\xb0\xc6\x65\x85\x25\x76\xd0\xca\x0f\x12\x9f\x6b\x48\x7e\xdf\x7f\x5e\x46\xe1\x80\x2a\xb2\xfa\xad\x10\x02\x04\x50\x72\xde\x40\x00\x02\x7a\x0b\x2f\x7f\x27\xb1\xd6\x40\xe9\x96\x22\x1e\x48\xc4\xf9\x8d\x7c\x37\x9b\x1e\xb7\x94\x10\xec\xc1\x9a\xe5\x06\x1a\xaf\xa2\x8f\xfd\xd9\x83\xa1\x24\xbd\x81\x00\x04\xf5\x76\xc0\xf7\x8e\x7c\x92\x55\x3c\xaa\xcc\xe2\x39\x4d\x41\x84\xa9\x23\xc8\xba\xc0\xd8\x9e\xc9\xd4\xfc\x98\x41\x97\x9b\x57\xe2\x2c\x2d\x02\x04\x50\xb2\xde\x40\x00\x02\x7b\xfb\x8e\xc8\xd9\xc9\x76\xbd\x2b\xbc\xdb\x84\xd7\xc6\x45\xd2\xdb\x65\xfb\xd5\x3a\xf8\xed\x53\xcd\xcc\x3a\x6e\x45\x67\x9e\x99\xc8\xdb\x08\x10\x40\x49\x7b\x03\x01\x08\xee\x4d\x20\x83\x42\x3f\x66\x3b\x8d\xfe\x7b\xa2\x8c\x50\x6c\x28\x02\x9b\x70\x6f\x1e\x3d\xfe\xad\x24\x5e\xfd\x7e\x58\x1e\xcf\x2e\xf6\x9f\xe0\x80\x92\xf7\x06\x02\x10\xe0\xdb\x25\xd3\x23\xf5\x9f\xce\x0d\x8b\x41\x8b\xe6\x7d\x62\xeb\x64\x8e\x7e\x85\x77\xed\x08\x65\xb4\x95\x13\xab\xf7\xa9\xce\xad\xc5\xfe\xf9\xa1\xa3\x24\xbe\x81\x00\x04\xf9\x76\xd0\x37\xab\x82\x87\xa5\xc9\xac\xf8\x46\x43\xe2\x89\x49\xb1\xf4\xf6\x33\x9e\x8b\x7a\x64\xab\x01\x89\x25\xcf\xf1\xd8\xbd\x55\xa5\x10\x20\x80\x92\xf9\x06\x02\x10\xe8\x5b\x0a\x56\x8f\x13\xbf\xd4\xd7\xb5\x4e\x8d\xa3\xab\x0d\x25\xb7\x2f\xab\x6a\x28\x82\xef\x35\xae\x48\x7e\xfb\xb8\x13\x3e\xd7\x82\xf7\x27\x53\xa2\xa4\xbe\x81\x00\x04\xfb\xe6\xf0\xf4\xf9\x33\xc5\xb4\x1d\x8d\x9d\x77\x69\xb1\x43\x37\xcb\x4a\xc5\x62\x49\x6f\x18\xef\xff\xf8\x90\x51\x61\xcc\xce\x89\x71\xfe\x4f\x31\x94\xdc\x37\x10\x80\x80\xdf\xe2\xbf\x97\xfe\x66\xd4\x34\xb7\x70\xf5\x3e\x33\x37\xb1\x65\x77\xb4\xf7\x20\x7a\xf1\x76\x5d\x9c\xa2\xa8\xde\x58\xf0\x2b\xd2\x03\x75\x04\x08\xa0\x24\xbf\x81\x00\x04\xfd\x26\x29\x18\x5e\x9b\x2d\x42\x56\xb6\x59\xf7\x3c\x53\xc7\x06\xc8\xfc\x65\xf3\xb6\x70\xe6\x2e\xa9\xcc\x26\x7b\x5b\x27\x91\x09\xee\x9f\x59\x03\x25\xfb\x0d\x04\x20\xf0\x37\xea\xb9\xa8\xea\xc6\x14\x7b\x6f\xb6\xdd\x43\xcf\xb5\xd9\xba\x1d\xeb\x91\x77\x5e\x83\xd1\x81\xec\xc3\x26\xe4\x84\x99\x47\x45\xd7\x11\x20\x80\x92\xfe\x06\x02\x10\xfc\xdb\xb6\xed\x50\x0c\xbd\x91\x97\xf5\xe3\x90\xc2\x26\x62\xfc\x00\x26\xdf\x23\xa6\xbb\xf6\x13\x87\x53\x77\x66\x99\xe2\x2c\xb4\xb2\x14\x11\x20\x80\x92\xff\x06\x02\x10\x00\xdc\x3b\xfb\xa1\xb3\xbd\x9f\x23\xf6\x1e\xbe\x2f\xaf\x17\xa7\xbf\x53\xa2\xf7\xcb\xcd\x0a\xad\x33\x86\x10\xe1\x80\x3e\xdf\x7b\x89\xc8\x00\x01\x02\x28\x09\x70\x20\x00\x41\xc0\x85\xef\x29\x7a\xda\xad\xef\x07\x8d\xc9\x9a\x69\x3e\xbe\xc0\x6d\x86\xfe\x2c\x9f\x34\x45\x58\x24\x33\xe7\x41\xa7\x20\x6f\x3a\xcd\x9f\x4c\x89\x92\x01\x07\x02\x10\x08\xdc\x2b\xb2\x12\xc5\xfa\x09\xfe\x89\x24\xa3\x66\xcb\xe9\x52\x91\x3b\x4f\x6d\x52\xc4\x56\x97\xbe\xe9\xc9\x5b\xea\x8f\x51\x25\xe4\x33\x23\x40\x00\x25\x05\x0e\x04\x20\x18\xb8\x0e\xbc\x2e\x96\x81\x07\x49\xcc\x26\x2e\x9e\x94\x3e\x1e\x79\x99\x25\x4f\xb1\xb5\x9f\xd3\x5c\x74\xb8\x49\xe7\xfa\xb6\x43\xab\x4b\x06\x01\x02\xa8\x38\x70\xc8\x0d\x9d\x91\x5a\x7f\x32\x1b\xa1\xf1\x27\x07\x37\x87\x06\x42\xc2\xf7\x25\x9e\x92\x92\xcc\x17\x5d\xbb\x39\x29\x77\x1f\x13\xba\x4c\x49\xb9\x9d\xdc\xd0\x41\x40\x70\x44\x97\x14\xe9\xde\x17\xa6\x94\xe1\x79\x5c\xed\x66\xf8\x89\x25\xda\x51\xf7\x92\x0a\x87\xba\xb8\x2b\x3c\x61\x80\x88\x4b\xb7\x4b\x09\x01\x02\x28\x49\x70\x20\x00\x41\xc1\xfd\xd6\x73\x2d\x6b\x96\x34\xb0\x28\x52\xe7\x6f\x9e\x89\x99\x74\x4f\xd2\xba\xb4\x13\x9d\xd8\xc2\x79\xf1\x9a\x16\x43\xfb\x96\xd0\x9f\xcd\x09\x4a\x16\x1c\x08\x40\x60\x70\xee\xc6\x01\x68\x55\xef\xcf\xda\x3d\x5c\x95\x8d\x24\xfe\xa6\xa0\x63\x87\xb8\xf4\x4c\xda\xf9\xc2\xf9\xe0\x61\xea\x3c\x6b\x5e\xcc\x3f\xbb\x66\x94\x34\x38\x10\x80\xe0\xe0\x3e\xf5\x28\x39\xa5\x34\x4b\x64\xaa\xdb\x36\x2a\xb8\x04\x9a\x2a\x8f\x09\x30\xf4\x0e\xee\x7d\xea\x2f\xeb\xeb\x18\x62\x88\x6e\x50\x43\x80\x00\x4a\x1e\x1c\x08\x40\x80\x70\xa3\xb5\x4e\xcb\x3d\xe1\x03\xa4\x2f\x14\xaa\xfb\x35\x8f\x56\x84\x45\x9c\x4a\x09\x15\x5c\x69\x40\x4e\xbe\x03\x91\x6c\xf1\xf3\x7f\x42\x28\x4a\x22\x1c\x08\x40\x90\x70\x24\xfb\x3d\x6d\xfb\x8d\xdc\x39\x63\x37\x89\xa3\x6f\xd2\x89\x58\xd9\x39\xbf\xf8\xda\x9d\xce\x27\x9e\xe6\x6b\x64\x2a\x1c\x80\xfd\x67\xd5\x46\xc9\x84\x03\x01\x08\x14\x4e\xc7\xe1\x87\x8c\xf3\x92\x80\x0e\x83\x91\xc0\x3d\x51\x74\xd5\xfb\x59\x51\x54\xce\x22\x43\xf7\xce\x70\x60\xb2\xda\x6d\x3c\x7f\x80\x85\x00\x01\x94\x54\x38\x10\x80\x60\xe1\xc6\x17\x7e\x7a\x32\xa4\xbc\x7e\x26\xac\x3b\x70\xe1\x9a\x2f\x30\xcb\x7e\xdb\x79\x7e\x1b\x63\x7b\xbe\xd2\xe4\xd6\x8e\x80\xcc\x91\x3c\x02\x04\x50\x72\xe1\x40\x00\x02\x86\x73\xfc\xfa\x32\x46\xa3\x93\xf1\xba\x72\xa7\xb2\xe4\xc2\x57\x69\x8d\x75\x3c\xaf\xb5\x03\x81\x51\x3b\x9e\xa8\x57\x75\x1a\x7e\x4c\x74\x08\x10\x40\x49\x86\x03\x01\x08\x1a\xee\x05\x82\xb2\xe6\x5c\x6b\xda\xb2\xfb\x85\x10\x11\x2a\xca\xc3\x10\xcb\x4b\x5d\xfd\x57\x1b\xe2\x2b\xcc\x8d\x25\xd3\x06\x24\xbe\x53\x21\x40\x00\x25\x1b\x0e\x04\x20\x70\xb8\x6e\x8c\xd4\x4d\xc1\x9c\xa7\x18\x61\xfe\x58\x5a\xd7\x35\x3f\xa6\xe6\xcb\xb8\xd1\xb4\x27\xee\x44\x78\x0b\x7f\x0d\x72\x50\xd2\xfc\x93\xb5\x51\xd2\xe1\x40\x00\x82\x87\x2b\x70\x6e\x16\x57\x68\xc4\x39\x63\x1f\xa9\xeb\x9b\xdd\x9b\x8e\xc7\xa3\x4e\x4a\x02\xce\x7c\xdc\x1e\x98\x5a\xcd\xb3\x9d\x1b\x25\x40\x80\x00\x4a\x3e\x1c\x08\x40\x00\x71\x0f\x5d\xee\x3c\x92\x72\xb1\x0b\xe0\xce\x65\x0b\x16\x21\x9c\x71\xbf\x16\x1b\x30\x99\x52\xf1\x9e\x14\x88\x13\x7c\x3e\x42\x68\x46\x81\x00\x01\x94\x84\x38\x10\x80\x20\xe2\x74\x4d\xdb\x40\x34\x9b\x10\xf7\xde\xd7\x58\x80\x17\x7e\x3f\x2b\x1b\x45\xf4\x34\xc7\x1a\x86\x24\x69\xeb\xc7\xdd\x51\xef\xdd\x9b\x08\x10\x40\xc9\x88\x03\x01\x08\x24\x4e\x9f\x7a\x30\xe5\x83\x63\xb1\x1a\x66\x6e\x4e\x75\xee\x3b\x2a\xc2\x73\x6a\x8f\xce\x86\x67\xe7\xbd\x52\x9f\xa5\x51\x8e\x7e\x77\xf5\xcf\xd4\x8c\x92\x12\x07\x02\x10\x4c\xdc\xf5\xf4\x7e\x7c\xf5\x84\x6e\xdf\x26\x3d\xca\xf6\xc2\xa7\x9a\x6f\xe8\x99\x73\x89\x65\x38\xc5\xed\xcc\xdf\x46\xa0\x59\x28\xc9\xb3\x20\x40\x00\x25\x27\x0e\x04\x20\xa0\x38\x76\x06\x91\x58\x49\xa9\x6b\xad\xaa\x67\xc6\x9f\xfe\xac\x6f\x1a\x54\x23\x49\x21\x7c\x73\xb7\x77\x9f\x86\x59\x30\xa1\x39\x27\xeb\xcf\x1e\x0c\x25\x29\x0e\x04\x20\xa8\xb8\x85\x4a\xc3\x3c\x47\x5d\xf2\x97\x8e\x09\xdf\x5e\xe5\xad\x3e\x78\xba\x27\xe8\x26\x61\xce\x1b\xbd\xfd\x86\x22\xd6\x80\x80\x7c\xe7\x16\x02\x04\x50\xb2\xe2\x40\x00\x02\x8b\x43\x60\xec\x4c\x0b\xf4\x2f\x63\xf0\x50\xed\x76\x56\x94\xe1\x1f\x91\xc7\x26\xb7\x2f\x6d\x38\x07\xae\x92\x63\x57\x04\x79\x04\xff\xf9\xd2\xa2\xa4\xc5\x81\x00\x04\x17\x87\x6e\x25\x56\x91\xa4\x8b\x9f\xf9\x65\x48\xaa\x8e\x03\xdb\x9c\xed\x02\x60\x75\x47\x37\x76\xf7\x15\x95\x72\xbe\xe4\x07\x92\x5d\x5d\x04\x08\xa0\xe4\xc5\x81\x00\x04\x18\x37\x10\x96\xd2\xfb\x41\xef\xf2\x63\xd3\xde\xd6\xb7\xf1\xba\x46\x95\xca\xea\xec\xee\x67\xdb\x7d\xf3\x26\xad\xfb\x66\x2e\x1c\xe4\xe8\x21\x40\x00\x25\x31\x0e\x04\x20\xc8\xb8\x35\xd9\xe8\xaf\x01\x01\xba\x7e\x03\x9b\xce\xb7\xb9\x23\x9c\x2f\x8c\x7d\xb9\xd8\xfa\xd5\xb7\x5f\xd2\x1e\x3f\x8a\xf9\x4a\x4c\x23\x3b\x02\x04\x50\x32\xe3\x40\x00\x02\x8d\xcb\xf8\x7c\x2f\x47\x58\xde\x3b\xb5\x7a\x1e\x8d\xea\x30\x90\xaf\x06\xc7\xfa\x62\x33\x46\xce\x8b\x25\x96\xf3\x4c\xe8\xee\xd6\x6f\xb5\x11\x20\x80\x92\x1a\x07\x02\x10\x6c\x1c\xfb\x64\xf2\xee\xce\xcd\x5d\xcb\x7a\x8e\x90\xb1\xee\x7b\x86\x6a\x92\xef\x2e\x83\x86\xa1\x5f\x2f\x26\xe7\x2c\xeb\xe4\xda\x9a\x33\x21\x40\x00\x25\x37\x0e\x04\x20\xe0\xb8\x7e\x8b\xb3\x9a\xad\xf6\x82\xd5\x8b\x22\xac\xdf\x5f\x26\xde\xf8\x78\xd5\x32\x8a\xa3\x76\x2f\xbe\xf9\xa7\x3f\x2d\xc9\xa8\x4c\x9e\x2d\x02\x04\x50\x92\xe3\x40\x00\x82\x8e\x1b\xc8\xb6\x2e\xfc\x59\x70\xe6\x31\xde\x63\xeb\xde\x6b\xd1\xdf\x75\xa6\xcf\x0c\x85\x71\x39\x7f\x79\x76\xfb\x61\xbe\xcb\x55\x65\x71\x1b\x04\x08\xa0\x64\xc7\x81\x00\x04\x1e\x07\x9a\x81\x3b\x22\xda\xf5\x2a\x85\x6b\xe7\x24\x7d\xb4\x4d\xcb\x3a\x5d\x9f\x29\x65\x3a\x09\xe6\x9a\x26\x55\x19\xe8\xd1\x7a\x5d\x41\x80\x00\x4a\x7a\x1c\x08\x40\xf0\x71\xe6\x3a\x8e\xb1\x0c\x5a\x7d\xab\xeb\xdb\xf6\x7a\xc3\xfb\x26\xb7\x87\xd5\xa4\x8c\xe2\x02\x5c\x34\x1e\x62\xd9\xb8\x90\x1a\xcb\x58\x21\x40\x00\x25\x3f\x0e\x04\x20\x00\xb9\xfe\x56\xe2\xca\xb8\xcf\x21\x95\x2f\x04\x9b\x24\xee\xb2\x0a\xc4\xf0\x35\x0b\x5a\x2c\x93\x87\x60\x2c\xcd\xd8\x8e\x71\xba\x98\xa2\x21\x40\x00\x25\x41\x0e\x04\x20\x08\xb9\xaa\x44\xe3\x1a\xfc\xce\x5f\x3d\xe3\x8f\xce\xdc\xc4\x31\x91\x09\x5a\x6e\x51\x69\x28\x4e\x58\xb8\xe0\x40\x3a\x50\xa2\x18\xca\x69\x88\x00\x01\x94\x0c\x39\x10\x80\x40\xe4\xae\xe7\x55\x96\xcf\x89\x1d\x6e\x5a\x6b\x3b\x87\xb1\xb6\xcd\x94\x4c\x5b\xbd\x90\xca\x7f\x70\xc5\x69\xda\xa6\xca\xed\x7c\x2c\xf1\x03\x04\x08\xa0\xa4\xc8\x81\x00\x04\x23\x57\x92\x22\x24\x65\x61\x5a\xa9\x59\x9d\xd7\xda\x96\xc1\xd5\x82\xe9\x68\x4c\xab\x24\x2e\xa5\x42\xd9\x5f\x73\x84\x89\x81\x2d\xfb\x67\xd6\x40\xc5\x91\xfb\x40\xf2\x7f\x37\x74\x69\x4b\x25\xbc\xf9\xb9\x2f\xde\x07\x39\x26\xa2\x8f\x89\xfa\x3c\xcf\xd3\xaf\xe9\x88\x78\x37\x86\x45\xab\x18\xd9\x5c\x25\xc8\x7c\x05\x11\xcb\x3d\xc8\xaa\xc7\x8c\xf6\x7f\xd5\x2a\x47\x53\xee\x23\x51\x2c\x84\x1c\x94\x5a\x09\xb2\xa1\x9b\xca\xc3\x01\xe9\x49\x3f\xee\x3f\x5c\x27\x77\x96\xbf\xf9\xe2\xb9\xc9\xb5\x13\x52\xaf\xc7\x74\xbf\xfa\xe5\x89\x9d\x6e\xed\xcb\xdb\x7f\xd2\xfd\xc9\x33\x39\x15\x8e\x75\xf7\xae\x8d\x44\x81\x98\x48\x5c\x9a\x5b\x2a\xef\x09\xa9\x75\x09\x9a\x28\x77\x3b\x9e\x4e\x01\xbb\x82\x95\x42\x47\xa7\x28\xdf\xb3\x38\x11\x3e\xdb\xbc\x89\x73\xbf\x1f\xbb\xaa\x0a\xdf\xbc\x7f\x42\x9a\xc5\x9c\xf8\xd3\xec\x50\xc2\xb6\x2f\xe3\x1e\x57\xc6\x33\x53\x67\x99\xd0\xb8\xa9\xe5\x20\xc3\x4a\x92\x0c\xf5\xbd\xa8\xaf\xfe\x02\x27\xa4\xd2\x71\x6b\x35\x38\x7d\xea\xcb\x8b\x2a\xaa\x5b\xb7\x57\x0f\x69\xbd\x22\x0d\x3e\x6e\xa6\xa6\xf2\x18\xbe\x9e\xb9\x1e\xa8\xc3\x9d\x72\x42\xea\x63\x78\xa5\x33\xd0\x6d\xf0\x0a\x79\x56\xea\xbd\xd5\x59\x86\xea\xb2\x6b\x13\x76\x14\xaf\xf6\x3f\xb8\xf6\x5c\xea\x8d\x08\x5b\x0f\x3b\x21\x7d\xd9\xc3\x10\x4c\x79\x24\xe1\x15\x45\xcb\x7d\x8b\x4a\xfc\x6d\xa8\xeb\xb7\xd7\x77\x2e\x2f\xa7\xdf\x38\x73\xbe\x56\xf6\x2b\x03\xb9\xf3\x09\x69\x29\x37\x03\xc2\x2a\x8b\x86\x06\x7b\x40\x47\xf7\xfd\x45\x34\x36\xec\xc6\xb3\x26\x6c\xe5\xdb\x1a\xbe\x32\xe5\x98\x87\xd8\xa2\x2a\x27\xa4\x1e\x17\xc3\xe3\x2c\xa4\x26\x28\xd6\x29\x3d\xca\x36\x9f\x58\x45\x56\x35\x95\x6a\x53\x0c\x6b\x92\x75\x31\x78\x33\x0b\xa9\xfd\xa4\x3f\x21\x9d\xa4\xd3\xff\x2c\x86\x45\x76\x23\x3c\x77\x43\x9f\x13\xf3\x67\xfc\xa3\x40\xed\xfc\x4b\xf6\x47\xdc\x77\xef\xee\x72\x25\x59\xd2\x52\x9c\x90\x36\x26\xfd\xfc\xb4\x2f\x5b\xc7\xe5\x9e\xb0\x7e\xf6\x85\xb8\xac\x2f\x75\x66\xb7\xe3\x2b\xc1\xa1\xa2\x5d\x97\x3e\x5a\xde\x07\x03\xf1\x27\xa4\x95\xf7\x93\xb6\x4d\x06\x4c\x23\xe7\x7e\x95\x63\xe6\x28\x37\xbd\xc2\x31\x4a\xda\x88\x76\x16\xf5\xd4\x12\xd7\x07\x64\x2c\x7c\x1f\x9d\x90\x32\xd8\x54\xd6\x8b\x3b\xaa\xa8\x9f\x11\xe1\xb0\xbf\xdc\x53\x90\xb6\x13\x55\x93\xbf\x50\xe6\xc8\xfa\xed\xae\x78\xc3\x26\x5f\xaf\xe0\x09\x29\xf6\xae\x7d\xd7\xf2\x9e\x5c\x94\x4e\x57\x55\xa5\x58\xb1\x4e\x68\xe6\xf0\xa3\xca\x51\x01\x6f\x8f\x28\x45\x5a\x87\xb2\x1e\xe1\x2b\x27\xa4\xe5\x4b\xc3\xaf\xfb\x41\x9f\x0a\x75\xec\x25\x9d\x2f\x61\xd7\x3a\xfb\x7c\x98\xf1\xf8\xd4\xed\x77\xe8\x52\x0d\x4a\x8a\xf9\xd3\x1a\x4f\x48\x5b\x67\xb4\xab\x78\x07\x39\x6d\x5e\xd3\x20\xc4\x9f\x2a\x60\x09\x62\x51\xa5\x60\xde\x04\xcf\xb6\xf7\xe7\xb3\x48\xe0\x36\x6b\x1f\x9d\x90\xf2\xd5\x08\x88\xb5\x88\xd6\xfa\x0a\x73\x6b\xb5\x59\x8a\x25\xd3\x7d\x90\x33\xe4\xa4\xfd\x20\x2e\x11\xed\x59\x58\xa4\xde\x58\xfa\xfc\x64\x03\x88\xcd\xc9\x1a\xef\xa3\x97\x3b\x92\x41\x69\x66\x7c\x75\x23\x8d\x19\x07\x7c\x1a\xcf\x1d\x3f\x5f\x2c\xac\xa8\xbd\xc9\x79\x8b\xf1\x84\x94\xc8\x46\x3c\x87\xb9\x65\x76\xde\xc8\xee\x28\x94\xb8\x34\x93\xb0\x2e\x2f\xa6\xef\xbd\xb8\x88\xc9\x3d\x59\xeb\x62\x1f\xff\xcd\x93\x23\x20\x86\x5d\x9a\x6a\xc9\x4e\xb4\x5b\x9d\x5b\xb5\x32\xf2\x24\xa9\x82\xb1\x5d\xf5\x05\x6e\x86\xc7\x90\x33\x4e\x00\x6b\xc1\x7e\xf8\x97\x13\xd2\x36\xbd\xce\x4f\x14\xaf\x73\x4c\x1c\xc6\x7d\x0f\xe2\xe7\xc5\xe5\xbf\x60\x57\x72\x53\xd6\x1e\xcc\x6b\x7a\x1f\x88\x8d\x78\x76\xad\x9e\x90\x5e\xce\x3a\x47\x17\xd3\x23\x8f\xc5\x21\x63\xfe\x8b\xcf\x72\x9d\x3e\x20\x62\xcd\xb4\xbb\xd4\xda\x5e\xe6\xba\xf0\xfc\x41\xab\xcf\xec\xc9\x9f\xa1\xe6\xa6\x12\xc2\xe4\xb9\xb1\x6f\xfe\x35\xcc\x0b\x23\xbf\x59\xf6\xb3\x6f\x8e\x24\xff\xee\xfa\xa9\xec\xc6\x87\x25\xb8\x83\xdd\x73\x42\xda\x65\x5f\x3f\xd6\x29\x07\x1c\x6a\xdf\xc2\x6f\x92\x61\x12\x90\xe9\xf2\x16\x29\x56\xd0\x0b\xa4\x0e\x2c\x7b\xa8\xd1\x78\xed\x3f\x1a\x28\xa5\xe5\x36\x6c\x74\x4e\x5b\x22\x91\xe9\x0b\x7c\xe0\x84\xe6\xb4\x61\x45\xac\x9b\x21\xf5\x2a\x38\x82\x28\x86\xf4\x25\xa8\xe5\x75\x42\xfa\xb1\x96\xc5\xbd\x5c\xbf\x31\xb3\x40\x27\x29\x07\xcf\xee\xec\x87\xb9\xd8\x33\x1c\xae\x3e\xa5\xa4\x09\xc9\xe9\x3a\xc3\x1d\x21\x2c\x27\xa4\x01\xa2\x97\x27\xe5\x93\x0a\x79\x5f\xc4\xc7\x3b\xed\x7f\xd7\xfd\xce\xcc\xfa\x88\xb7\x65\x38\x2c\xe6\x66\xd9\xe3\xe6\x21\x43\x07\xaa\x13\xd2\x64\x05\x75\xaa\x0f\x58\x6f\x5b\x39\x34\x34\xde\xbf\xe0\x63\x5b\xf6\x1b\xec\x9c\x88\xb1\x26\xce\xc5\x2d\xc1\x21\x32\x1f\x14\x7f\x73\x42\xfa\x49\x4c\xc2\xc1\x2f\xc2\xa5\xfc\x77\xec\xc3\x7b\xf1\xa4\xc6\xa5\x23\x77\xdc\xa3\xee\x1d\x08\x7d\x3f\x13\x33\xd2\x15\xa3\xb5\x77\x72\xb0\x52\x09\x54\xb1\x3f\xff\xfc\x42\xcc\xfb\xc4\x23\x55\x6e\xca\xb1\x49\x46\x34\xcf\x47\x7b\x50\x64\x38\xe8\x93\xd7\x8d\xa4\x77\x4f\x7e\x9f\x90\xca\xfb\xdc\xe5\xb9\xff\xcb\xb8\xfd\x93\x14\x6f\xc1\x28\xe7\x0f\x0b\x66\xb7\xf9\x8f\x8a\x96\xdb\x93\xf1\x15\xdd\xfa\x9f\x7c\x32\xc3\x4f\x48\x5b\x72\x2d\x2f\x29\x1c\x61\xde\x96\xbf\x83\x63\x17\x58\xbb\x97\x5d\xeb\xcc\x76\x27\xf9\x86\x1f\x99\xf2\xaf\xb1\x87\x0b\x06\xbd\xa3\x27\xa4\x7e\xa4\x99\x8e\x1f\x7b\xad\x5d\x8f\x78\xb0\x26\xd2\x74\x42\x99\x9f\x6d\xdf\x74\xcb\xa2\x57\x7b\x15\x4d\x9f\x48\xd0\xc3\xba\x7c\x72\x04\xb6\xaa\xbf\x7a\xbc\x99\xe9\x6f\x36\x7e\x98\x8d\x86\x6b\x63\x14\x7b\xa7\x0b\x87\x26\xb2\x69\x40\xce\x29\xb7\x4a\x9e\x69\x7b\xf1\xde\x09\x29\x3e\x36\x69\x08\x4d\x80\x2d\xb3\x72\x1b\xf5\xd6\x5b\xf4\xec\x1c\xbc\xe2\x2b\xc4\xbf\x1e\xab\x3f\x0e\xb7\xa1\x7a\xc9\x7c\x21\xeb\xe4\x4c\x88\xbf\x7f\xbe\xfa\x9d\xbf\xfc\x34\x69\x42\x63\x20\x35\xd6\x90\xe2\x8f\xc7\xb7\xfa\x62\x5e\x99\x1b\x90\x3f\xdc\xd0\xe0\x8a\x71\xcb\x3e\x21\x4d\xe3\xf8\xc8\x04\x8a\x73\x97\x5d\xca\x17\x98\x1b\x46\xec\x90\x55\xf7\x9b\x15\xfa\x9c\xcd\x2a\x39\xaa\x7e\x47\xcc\x5c\xac\x12\x73\x42\xba\x6c\xae\x49\xf6\xba\xa3\xe2\xae\x58\x9b\xcc\x80\xd6\xf6\x66\xb9\x21\x1b\x57\xf6\xab\xcc\x9d\xf2\x33\x99\xaf\x7f\x7d\x6b\x61\x8e\xff\xff\x26\xbd\x9a\x56\x65\x7a\xf8\x7e\x21\x90\xa0\xb2\x98\xc7\xe3\xb1\x5d\x78\x9a\x3b\x1e\x8b\x6d\xba\x9b\xe0\x1b\xcf\x84\xe4\x1b\x94\x24\x27\x7f\x5b\x31\xb8\x93\x47\x37\x5e\x39\x51\x05\x0c\x68\x97\x27\x66\x4f\xeb\x8c\x51\x54\x7a\x19\x94\x8f\x23\x3e\x30\x27\x8e\x45\xa8\xca\xee\x9c\x90\x26\xaa\x97\xa7\xce\x17\xbd\x60\xbd\x1a\x12\xff\xbd\xdb\x49\x6c\x7a\xb7\xfd\xa1\x5e\x8a\xf2\xa7\x17\x58\x0f\x98\xc6\xed\x83\x23\x12\x4f\x48\xbf\x79\xca\xa4\x3e\xf4\xdc\x8e\x7a\x52\x7a\x24\x2e\x68\xe1\x4f\xfc\x10\x3b\xd0\x51\x84\xff\x6a\xc9\xcd\xc2\xf9\xa1\xb8\xed\xae\x91\x13\x52\xed\x8b\x15\x72\x1d\xe7\xcd\x57\x5a\x2f\x06\x39\xfd\x46\x38\xd5\x80\x31\xbd\xc2\xb7\x79\x23\x99\x9d\x3a\x3d\x7d\x12\x1e\xfb\x7d\x3c\x21\x15\xc8\x17\xab\x9d\x4a\x74\x1a\xf5\x5c\x9e\x57\x89\xa7\x6d\xa8\xf4\xab\xcd\x35\xe8\xaa\xfd\x59\xfc\x50\x85\x67\x0b\x0c\x26\x30\x3c\x21\x0d\xe9\xcb\xbb\x11\x7f\xe5\xcc\x5c\xaf\x62\x2d\xcd\x73\xdd\xa3\x78\x93\x67\x8b\x53\xaf\xc6\xf3\x79\xbe\x56\x7c\xbe\x6f\xaf\xc6\x7d\x72\x85\x19\x04\x86\x17\x68\xc5\x24\x5e\x3e\x4f\x2e\x1e\x4d\xd9\x30\xc2\x7a\xbb\xde\xac\xe3\xff\x66\xdb\x6e\xf2\xc7\x55\xf6\x12\xb5\x94\xd0\x13\x52\x1c\x92\x3e\xed\x34\x79\x3b\x92\xef\x2f\x29\x1d\xb3\x67\x1b\xfc\x35\x54\x36\x5f\x54\xc9\xbe\x9a\xf0\x5e\x2b\xd2\x6f\x31\xa1\xab\xf0\x45\xff\xef\x36\x03\x27\x67\xd7\x5a\x60\xd7\x2a\x3c\x93\x35\x90\x80\x79\x7d\x7a\xfc\x72\x80\x17\xc9\xa5\xb0\x64\xdd\x70\x07\x8e\x9f\x4a\xfc\xcb\x21\x9a\x13\xbd\x27\xa4\x45\x45\x0f\x54\x53\x0a\x83\xae\x4b\x33\x9e\x9b\x91\x0a\x53\xa7\x49\x50\xe6\x62\xbf\xe7\x67\x24\x77\xe3\x96\x9d\x2d\xc9\x59\xc6\x43\x49\x49\x02\x02\x2f\x49\xc9\x13\xff\xe3\x0e\xd9\x61\xb8\x50\x1c\xb7\x7d\x5b\xf3\x72\x73\x87\xed\xe6\xdc\x3e\x2d\x5e\x4e\xb6\x65\x93\x96\x46\x40\x57\x6e\xe9\x0f\x9b\x8c\x13\xd2\xcf\x09\xcf\x62\xd3\xc4\x7f\x7e\x19\x1f\x51\xac\x7a\x65\xff\x45\x3e\xde\x64\xbb\x3a\xeb\x6b\x57\x23\x75\x51\xd3\x7a\x49\xf7\xa2\xf4\xff\xa0\xea\x16\xd6\x7f\x77\x69\x3e\x18\x68\xd8\xde\x52\x12\x9e\x7e\x41\x52\x5a\x92\x92\xff\xd1\xf8\xe7\xa7\x18\x06\xfb\xbe\xa4\x7e\xeb\x32\x17\x29\xcf\x4d\xe9\xa7\x9a\x8b\x59\xd0\x36\xe3\x2c\xc4\xbd\xd8\x34\x4e\xc3\x11\x78\x5e\xfb\x3f\x68\xdc\x4b\x0e\x4d\x12\x0d\x0d\xed\x3a\x1a\xba\x27\x1a\x1a\x9a\x97\xa4\xe4\xff\xfd\x17\x24\xe3\xa9\x04\x40\x3e\x35\x72\x33\x3d\xcc\xcb\x17\x9d\x83\xa4\xe2\x57\x2f\x9a\x8f\x8d\x20\x83\x59\xca\xf4\x9a\x91\xa4\x80\x9b\x0d\x01\x1f\xbf\xf5\x06\xd5\x3f\xf8\x54\x59\x34\x21\x49\xe8\xc7\xea\x59\x0b\xb0\x93\x2f\xca\x94\xce\xad\x38\x03\x66\x14\x42\x07\x0f\x2f\x57\x2b\x7d\xa3\xb1\xe4\xd0\x9c\x09\x8a\xc5\xe6\x66\x2b\xfe\x17\x1f\xeb\xa9\x71\xea\x63\xa9\xec\x10\x9b\x06\x06\x9a\xaf\xbc\x47\x5a\xb4\x57\x08\x66\x2d\x34\x05\xd5\xae\xab\x09\x7a\xd9\x4e\x3d\x79\xb1\x84\x38\xba\x9c\xf4\x4f\xae\xf6\xce\xa9\x8f\xed\x6d\xbc\x8c\x63\x3f\x29\xa7\x0c\xe8\x7f\x37\x94\xc0\x6f\x48\xef\x51\xd6\xd3\x48\xe0\x73\xf9\x72\x93\xcb\xb5\xea\x39\xbf\xcb\xd6\x3f\xb9\xda\x27\xa7\x3e\xf6\x5c\xcf\x8e\xa6\xf7\x03\xda\x36\xbf\x4c\x50\x67\x8f\x0a\xe7\xc2\x2f\xf7\x8e\xbb\x9b\xb7\xf2\x1e\xab\x3c\x99\xbd\x9c\xd9\x27\xe9\xf3\xff\xff\x63\x0d\xfe\xbb\xaf\xae\x0f\x26\x16\xe0\x2d\x8d\x8e\x86\x38\xf1\x89\x9d\x97\xab\x46\x8f\x8e\x00\xbd\x30\xa1\x20\x1a\x57\x29\x96\xb8\x3a\xca\x88\xb6\xf1\x57\xf1\xaa\x4a\x1f\xfd\xd4\xa4\x58\x92\xef\x79\xea\xfe\x77\x3a\x6f\x69\xcf\xff\xa8\x1b\x5d\xe4\xeb\x88\xcb\x2a\x3b\xbb\xe7\x3e\xf9\xfd\x37\x93\x50\xa4\xfc\x67\x5d\xf6\xae\x75\x0c\x1a\x2e\x05\x03\x39\xa3\x4b\xf9\xe7\x90\x75\xe1\x74\xde\xd2\x68\x98\x27\xeb\x96\x53\xc6\x88\xc8\xe4\xb1\x76\xb6\xd1\x0c\x7b\x2c\x56\xed\x8b\x7d\x24\x78\x79\x65\x54\x0b\x1f\x07\x43\x60\x3f\x5b\x26\x0f\xab\x04\x59\x17\x4e\x07\xed\x97\x9a\x8c\x52\xe7\xc1\x51\xff\xc3\xeb\xed\x07\x14\xd6\x57\x37\x70\xa9\xcf\x1d\x98\xe6\x30\x71\x16\xbd\x0f\xbb\x4a\x1f\x06\x0e\x30\x23\xeb\xc2\xe9\xbc\xa5\x49\xfe\xa3\xee\x18\x58\xba\xff\x4b\xad\x1d\xbf\xd3\xea\xd1\x4f\xd5\xc4\xef\x93\xba\x56\xbf\x31\x30\x26\xd8\x59\x1b\xed\xac\x48\x67\xaa\xbe\x63\x7b\x1a\xfc\x77\x13\xc0\xdf\xbc\xdb\xbd\xf4\x8d\x6d\xcb\xcc\x9e\x54\xcf\x38\xe4\x69\x8b\x36\x28\xc2\x6c\x47\x10\xee\x3b\xd7\xc7\xde\xf8\x99\xc7\x07\x9f\x5d\x7a\x0a\xd9\x33\x9c\x0e\x3a\x16\xc1\xd9\x2a\x99\xfe\xcf\x39\x22\x32\x23\x49\x5a\xb3\x19\xdf\x7b\x7d\xb8\x94\x94\xd5\xcf\x6d\xd6\x9d\x8d\xbb\xf7\xfa\xc1\x1b\x0a\x26\x64\x5d\x38\x1d\xd4\xbb\x97\x32\x49\x74\x75\x43\xb2\x8b\x61\x81\xf7\x83\xb1\x0f\x19\x02\x0f\x5a\xc1\x97\xa1\x46\xaf\xd2\xc4\x0a\x31\xd8\x3c\x23\x44\xef\x20\xeb\xc2\xe9\xa0\xfd\xa6\xbb\x2a\xbb\xb2\x2b\x36\x47\x35\x36\xf1\xb1\x80\xab\xd3\x75\xea\x85\xae\x81\x35\x57\x14\x55\x15\x06\x4d\x5e\xac\x64\xf2\x0c\x23\xeb\xc2\xe9\xa0\xde\xb1\x84\xf0\x19\xb2\x4c\x2d\x7c\xc0\x10\xb5\xd5\xca\xa4\x68\xbe\x79\xbd\xb5\xbf\x65\xc1\xfe\xd2\xfe\x47\x1c\xcc\x80\x3d\xaa\xd9\x4f\x48\xef\xe0\x66\xd1\xbf\x79\xc7\x64\xf6\x65\xb2\x9a\x84\xc9\xbb\x88\xc6\x1e\x5b\x65\xf7\x49\x68\xbc\x12\x67\xba\x44\x82\xf0\xd2\xf5\x1d\x66\x87\x2a\xc7\xbb\x1a\xc8\x9e\xe1\x74\xd0\xb1\xb8\xc8\x4e\xca\x22\x3b\x11\x75\x1d\xfb\x86\x97\x56\xb2\x61\x62\x04\x3e\x09\x81\x45\x30\x53\x89\x45\xb3\xf1\x39\x8e\xc0\xbb\x23\xc5\xc8\xba\x70\x3a\xa8\x77\x3b\xfb\xdd\x63\x95\x25\x81\x6a\xb9\x11\xcf\xea\x34\xa4\xe7\x69\x6d\xb0\xda\x65\x8e\x02\x52\x84\xd1\x13\x3d\x38\x88\x25\xcd\x13\x90\x75\xe1\x74\xd0\x7e\xd3\xac\x93\x78\xde\x5f\xbf\x11\x4d\xe3\xae\xc5\x44\xca\xe5\x34\x9e\x98\x8e\x16\xfe\x1d\xbd\xb3\xa8\x5e\xf1\xed\x77\x02\xc9\xf4\x20\x64\x5d\x38\x1d\xd4\xbb\xa3\xd6\xeb\x35\x37\x2c\xbc\xc4\x52\x55\xd0\xb4\x8a\xb3\xc7\x19\x6b\x05\x56\xd7\xae\x0e\xec\xb3\x5c\x63\x56\x8f\x21\xe9\x17\x95\x41\x7a\x07\xb7\x14\xfd\xcd\x3b\x39\xcc\x78\xfa\xe5\x60\x61\x2e\x13\xf6\x5a\xd7\x91\x87\x14\x71\x57\x31\xcc\xbc\x45\xd2\xea\x31\x3a\xef\x31\x76\xe9\x85\x6f\x91\x20\x7b\x86\xd3\x41\xc7\x22\x42\x8a\x0e\x3b\xfb\xae\xb3\xf1\x9e\xb7\x71\x42\x57\xb6\xb0\x75\xb1\xcb\x68\x67\xca\x84\xfa\x5e\x26\x0e\xae\x0c\x62\xc0\x48\x01\x59\x17\x4e\x07\xf5\xae\xbe\xf0\x53\x67\x54\x9e\xb7\xfc\x51\x60\xe7\x2a\x2d\xba\xd6\x42\x57\xac\x11\x27\xcf\x99\xc1\xab\xc5\x6f\x6b\x9e\x32\xee\xc4\xdb\x22\xeb\xc2\xe9\xa0\xfd\xf2\x14\xc7\x8d\xe3\x11\xf1\x77\x1c\x5a\x7a\x3b\x3f\xfb\x82\x7d\xa1\x58\x3d\xc5\xe1\x68\x51\x21\xf5\xac\xf1\x12\xb8\x12\xea\x76\x06\x59\x17\x4e\x07\xf5\xce\xc9\xd5\x56\x35\xe2\xc8\x62\x4d\xb8\xce\x59\xd4\x57\xd0\x4e\xad\x14\xcf\x72\xde\x49\xfe\x1b\x13\xd7\x47\xfb\x5b\xf7\x0a\x4b\x0a\x90\xde\xc1\xad\xe7\x7f\xf3\x4e\xa0\x42\xb7\x6b\x8b\x71\xce\xaa\xe6\xbb\x4c\x33\x4f\x88\x67\xf5\x5c\x61\x34\xdf\xc7\x99\xae\x17\xec\xcc\x3f\x6f\x3b\x70\x72\x1f\xcf\x99\x70\x3a\xe8\x58\x74\x7c\xc6\x39\x94\x39\xab\xf8\xfc\x6e\xbb\xfa\x80\x1f\x3b\xa1\x96\x2b\x5d\x57\xac\x8f\x4e\xb4\x44\x7a\x99\xe6\x02\x97\xb3\x99\x08\xb2\x2e\x9c\x0e\xea\x9d\x32\xbb\xe0\x43\x41\xfc\x54\x0a\xdd\x6b\xe9\x4e\xe7\x76\x55\x4b\xd3\x65\x7d\x4b\x64\x0c\x3a\xb7\x3b\x3e\xf7\x8f\x7e\x9c\x4e\x75\x42\xd6\x85\xd3\x41\xfb\x6d\x48\xed\x20\xab\x19\x31\xc2\x6a\x6b\x16\x75\xff\xe2\xfe\x88\x1c\x8c\x26\xac\xb0\x24\xca\x0e\x7b\x34\x99\xf8\xd1\x58\xaa\x7f\x11\x59\x17\x4e\x07\xf5\x6e\xa5\x7f\xc9\x20\x86\x62\x4a\x42\xd4\xeb\x7e\xa7\xe4\x47\x1b\x32\x7d\x59\xce\x86\x1a\xa5\xe0\x8f\x3e\xf7\x56\x24\xfc\xbd\x35\x8d\x91\xde\xc1\x6d\x8a\xfe\xe6\x9d\xc9\xb2\xf2\x97\xbe\x23\xda\x67\x69\x77\xe6\xe9\x81\x81\x78\xde\x27\x4f\x22\x98\xf6\x6e\x9b\x51\x64\x68\x51\x89\x7c\xa8\x30\x14\x44\xf6\x0c\xa7\x83\x8e\xc5\x93\x39\xed\x97\x75\xdb\x93\xd2\xfe\x87\x8e\xed\xcd\xd9\x5f\xcc\x56\x3d\x2b\x25\x96\x6c\x11\xf9\xc2\x44\x39\xbe\xda\xb8\x9a\x0f\x91\x75\xe1\x74\x50\xef\x68\x63\xc2\x13\x15\xce\xe2\x97\xa8\x9e\x6d\x23\x64\xd5\xe3\xf2\x1e\xdc\x51\x4b\xb1\x55\x38\x8b\xab\x27\xf8\x4a\x4b\x3e\x78\x5e\x1e\x59\x17\x4e\x07\xed\x17\xf3\xfd\x1d\xec\x5b\xcc\x5d\xb5\x1b\x93\xbf\xd8\xfd\xbc\xc5\xb8\x24\x79\x7a\xe7\xaa\xea\x02\x0a\x83\x13\xdf\x19\x9a\xfd\x48\x24\x45\xd6\x85\xd3\x41\xbd\xdb\x24\x72\xfd\x19\x9a\x64\xaf\xf4\xd3\xc6\xc9\xed\xfc\x2e\xfb\xbb\xa1\x51\xb0\xee\x21\x4f\xd2\x54\x2b\xf9\xd0\x63\xaf\x9c\x80\x00\x4f\xc3\xff\x2e\x0d\xfa\x60\x61\x02\xde\xb2\xe8\x68\x68\xff\x51\x9d\x40\x1e\x3f\xa6\xfe\x8e\x90\x82\x33\x55\x6d\xc2\x74\x1e\x7d\x79\x1a\xb6\x8d\x4e\x9a\xd5\xdb\x09\x8b\xb0\x9f\x53\x0a\x8f\xc5\x1c\x3c\x6f\xfd\x77\x3a\x6f\x59\x34\xcf\xff\xac\xfc\x4b\x66\xdd\xa0\xf0\x75\xc1\xf5\x26\x99\x2c\x7a\x91\x87\x57\x3c\xb0\x82\x15\xcf\x09\x3a\x9c\x49\x73\xbb\x48\x39\x15\x1f\xc7\xf0\x14\x59\x19\x4e\xe7\x2d\x8b\x86\xfe\x9f\x95\x6f\x8a\xc5\x2f\x8c\x3e\x98\x56\x7e\x1a\x16\x84\x2b\x94\x25\xfb\x85\x94\xe8\xcc\x43\x2c\xd7\x5c\x9c\xc1\x40\xaf\xc8\x25\x2c\x89\x70\x64\x65\x38\x9d\xb7\x2c\x1a\xda\x7f\x7e\x37\xfc\x68\x17\xee\x91\xdb\x6c\xbe\x88\x59\x8d\x1c\x6d\x0d\xa4\x3a\xcc\x15\x73\x62\xaa\xb1\x61\xf3\x15\xda\xc5\x98\x2f\xf2\x48\x0c\xf6\x44\x26\x7a\xb8\x7b\xf6\x27\x13\xfd\x59\x5d\xef\xe1\xa5\x58\xd0\xd8\x50\x0c\xd7\x89\x4f\x5f\x90\xc2\xe3\xad\x87\x08\x15\xe3\x50\xd3\x66\xcc\xcd\xdd\xe1\xa6\xce\xf1\x93\x52\x31\x71\xb6\xb6\x2f\x36\x35\xdc\xf7\x2a\x82\x9f\xcc\xf9\xa2\xc5\xd0\xa8\xd6\xed\xb6\x8f\x78\x6a\x57\xde\xcd\x75\xef\xbc\xb2\xf2\xbf\x25\xd1\x6f\x63\xfd\x77\x97\xf6\xff\x26\x7a\x69\x75\x52\x48\x00\x23\x66\x2b\x6f\x1a\x24\x67\xbb\xcb\xab\x91\x30\xa2\x42\x1f\x96\x5b\x7c\x31\xed\x80\x24\x43\x77\x0f\xb3\xe4\xe5\x1b\x29\x6b\x31\xf6\x7f\x11\xe9\x6b\x4f\x45\xfa\x07\x4a\xf8\x8e\xca\xa6\xfc\xe5\x08\xae\x95\xa9\x2b\x9e\x9e\xd9\x0d\x14\x93\x2c\x93\x02\xb7\x12\x7d\x85\x75\xa5\x03\x03\x53\xdb\xff\x45\xda\x94\x3c\x1d\xe9\xc5\x06\x63\x33\xab\x2c\x56\xbd\x65\x18\x9b\xcb\x8a\xd8\x0d\x85\x64\x78\xc2\xdc\x71\x7f\x5d\xee\x3d\x52\xae\x1f\x5d\x79\xa8\x5c\xf4\x2f\x3e\xb6\xf6\x74\xa4\x1f\x9c\x96\x58\xc0\xe4\x0b\xac\xce\x7b\x27\xde\x69\x86\xbb\x2d\xfe\x1c\xe7\xe3\xf3\xfa\xe9\x65\xd7\x11\x16\xbb\x45\x74\x2f\xde\x7f\x72\x03\x43\xf2\x74\xa4\xe7\x1f\xc2\x0c\xb6\x16\x4a\x5d\x73\x0c\x62\x08\x77\xb9\x27\xb2\x92\x1e\x99\x6d\x78\xc9\xe9\x49\xac\xa2\xb8\xe9\x5e\xd8\x80\x3c\xcb\x3f\xb9\xda\xd3\x91\x1e\xaf\xe7\x75\xb2\xe5\xb2\x5c\x88\x86\x96\xdb\x46\xb5\xd3\x79\xe5\x40\x8f\x9d\x37\x34\x6b\x45\x1d\x0d\xe9\x03\xee\x39\x1b\x31\xf5\xff\x2c\xd2\xc3\x7d\x75\xff\xb6\x4c\xda\xeb\x5e\xc1\x1c\xf3\x36\x1c\x9e\x6f\x24\xa2\xa9\xb3\xef\x3a\xb7\x4f\xf7\x9a\xb3\x21\xfb\xd6\x07\x41\xbc\xda\xad\x45\x0a\x4d\x3c\xe4\xf2\x00\xa7\x3b\x15\x2d\xf4\x2f\xfd\xb6\xad\x14\xe5\xba\xf0\x5d\x60\xe8\xfa\x99\x0b\x31\x4d\x5e\xcf\xda\xc7\x45\x31\x8e\xa8\x96\x82\xa4\x7f\x15\xab\x7c\x3e\x8e\x16\x30\x3a\xe8\x32\xa9\x54\x83\xf6\x93\x30\x80\xe2\x5c\xc2\xb8\x01\x46\x8a\xb6\xc9\xf4\x70\x8b\xdb\x76\x19\xb9\xfb\x03\x0e\x62\x23\x9b\x6d\xa2\x48\x01\x64\x5d\x38\x1d\xb4\xdf\x1f\xf7\x8d\x68\x18\x0e\xba\x9c\x99\x09\x9a\x66\x1e\xd8\x07\x0a\x93\x98\x58\x7b\x11\xdc\xfe\xa8\x42\xc6\x73\x23\x7a\x45\xe8\x5c\x26\xb2\x2e\x9c\xce\x5b\x1a\x0d\x38\x59\xb7\x30\xa3\xe1\xe6\x5b\xbc\x92\x3e\xa7\x96\x9d\x3b\xad\x4b\x32\xfe\x22\xa1\x85\xac\x77\xf4\xf2\xe5\xb4\x36\x38\xc7\xcb\xd3\xb9\x85\x91\x5b\x1c\xb8\x09\xe0\x6f\xde\xd5\x3d\x38\x17\xec\x51\xff\xa5\x68\x02\xf7\x0d\xfb\xae\x21\xc6\x99\xda\xd6\x44\x7a\x47\x6e\xa2\xd8\x20\xe7\x70\x69\x63\xd9\x4b\x5f\x90\x3d\xc3\xe9\xa0\x63\xb1\x76\xfe\xce\xd8\x63\x8e\x9b\xa4\x56\x9d\xde\xba\x49\x9a\xdd\xcc\x53\x87\x64\xd3\x1e\xbf\x84\x0b\xea\x3f\x61\x55\xff\x98\xf1\x0c\x40\xd6\x85\xd3\x41\xbd\x93\x11\x06\x7e\xe9\x8c\xac\x33\xe2\xb9\xa1\xbb\x75\xe0\x7a\x4a\x9f\x41\xe3\xd5\x49\xa3\x16\xf2\x33\x35\xa0\x03\x98\x25\xbe\x58\x20\xeb\xc2\xe9\xa0\xfd\xc6\x0a\x67\x94\xe8\xba\x78\x50\x7d\xad\xc5\xcf\x79\xad\x87\xe3\x5f\x92\x6a\xfd\x75\xae\xdd\xba\x15\xb3\xe1\x6a\x11\x03\x22\xff\x78\x8b\x03\xa7\x83\x7a\x17\x65\xa2\xc8\x51\x2c\x4a\xe6\x7c\xfb\xee\xd6\x82\xb0\x47\xa4\xb8\xdd\x8e\xbe\xbb\x05\x9a\xe2\xb3\x1e\x55\xcd\xda\x1e\x09\x36\x09\xa4\x77\x70\xb3\xe8\xdf\xbc\x7b\x20\x56\x59\x40\xdd\xe2\xa2\xba\x97\xc0\xca\xc4\x75\x57\xf4\x02\x6f\x9a\xe8\xc6\x03\xd3\xcd\x5f\x9c\x2a\x3b\xea\x3b\x43\x81\xbe\xc8\x9e\xe1\x74\xd0\xb1\x78\xf0\x8d\xb3\x2e\x9b\x6c\x59\xf5\xa3\xc7\x38\xa9\x83\x90\x97\xe0\x59\xb7\xaf\x2e\x84\x29\x76\x85\xef\x2c\xb2\x53\xb3\x74\x3f\x1f\xdf\xde\x80\xd3\x41\xbd\xbb\x4e\xff\xa1\x2b\xca\x56\x92\xf5\x67\x4d\x0b\xe1\xb5\x4e\x0e\xbc\xf6\x50\xec\x30\x26\x83\xa4\xb4\xb7\x9a\x1c\x45\x9b\xb8\xb8\xdf\x91\x75\xe1\x74\xd0\x7e\x7d\x71\x0e\xc7\xfc\xf2\x4c\xec\xca\x6f\x45\xac\xb8\x87\x5d\xb8\xa2\x1d\x94\x32\x2d\x44\x1d\x3b\x2e\xa1\xfc\x6c\xdd\xfd\x8b\x98\x09\xb2\x2e\x9c\x0e\xea\x9d\xe2\x77\xc3\x1e\x7a\xc0\x2a\x50\x99\x97\x3c\x28\x4f\xa3\x79\xae\xb7\xbe\x9f\xe1\xb6\x53\x96\x9f\x67\x63\xda\x41\xd7\x6a\x93\x1c\xd2\x3b\xb8\xa5\xe8\x6f\xde\x5d\x9a\x50\xe4\xa8\x50\x61\xb2\x62\x6e\x36\x98\xda\x27\xd8\xf6\xcb\x37\xf7\x0c\x46\x9f\x25\x2a\xcf\x70\x33\xb8\xb1\x4f\x50\x4a\x83\xec\x19\x4e\x07\x1d\x8b\x15\xe3\xe5\x16\xbe\x72\x15\x05\xad\x91\xb8\x7b\x09\x5a\xfa\xbf\x28\x65\x36\x08\x7d\xa6\x3b\xa2\xd5\x54\x02\x2b\x36\xdf\xdf\x1f\x47\xd6\x85\xd3\x41\xbd\x8b\xd0\xaa\xc5\x10\x50\xd9\xc1\x1b\xdf\xa8\x1e\xf5\x78\x93\xd3\x94\x64\x2c\xb5\xca\xbc\x94\x92\xfe\xa9\xf6\x52\x88\x22\x7d\x56\xf4\xf1\xad\x02\x18\x1d\xb4\x5f\x6c\xde\x4d\xf3\x44\x3d\xc7\x02\xb6\xcb\xc9\x2f\x5a\x9e\x07\x5e\x5d\x55\x16\xa2\x5c\x3d\x5b\xdb\x38\x25\xe2\x55\x71\x49\xb2\x8f\x02\x59\x17\x4e\x07\xf5\xce\xf9\x4d\xbc\x86\x87\x9d\x06\xbe\xcb\x0d\xd3\xe8\x3b\x77\x9a\x13\x54\x88\xf3\x76\x8d\xfb\x0b\xcf\x1e\x74\xab\xed\xf9\x30\x0a\x7a\x22\xbd\x83\x5b\xcf\xff\xe6\x5d\x08\x20\xf8\x31\x17\x6f\xf6\xd3\x78\x7c\xf4\x02\x5f\x45\xf5\x9a\xc9\x53\x05\xb3\x5c\xcf\x30\x4e\xcc\x0f\x39\x53\xba\x26\xda\xe8\xc8\x9e\xe1\x74\xd0\xb1\xa8\x7f\x43\x25\xe1\x1e\xdb\x37\xe7\x7d\x18\x3b\x53\xc7\x9b\xe7\x7a\xdb\xe3\x0a\x65\x60\xf6\x7d\xd9\x9e\xc0\x4f\x7d\x3e\x12\x42\xc9\xc7\xb7\x4d\x60\x74\x50\xef\x16\xb6\x6d\x2c\xab\x6f\x8e\xb7\x5d\x30\x12\x5c\x55\x23\x6b\x2d\xa5\x62\x3e\xd0\x9c\xa9\x8e\xab\x0e\xc7\xa1\x0a\x54\x66\xcf\x73\x45\xd6\x85\xd3\x41\xfb\xe5\x4b\x76\xd6\x27\xba\xf2\xd1\x54\xc3\xf0\xad\x11\x09\x17\xd9\x3b\xd0\x61\xbe\xb4\xe6\xa6\xf4\x8a\xc7\xdb\x84\xf5\x7c\xda\x2f\xad\xc8\xba\x70\x3a\xa8\x77\xc5\x5f\x16\x9f\x0c\x5f\xbb\x84\xb5\x8f\x08\x62\xf6\x9a\xa3\xf2\xe5\x4e\x8b\x47\x0b\xf1\x4a\x2a\x20\x43\xa7\x92\x97\x75\x32\xc2\x44\x7a\x07\xb7\x29\xfa\x9b\x77\x1f\xe5\xbe\xd5\x62\x7e\x1e\x16\xbc\x77\xf7\x83\x7b\xaa\xd4\xef\x6a\xe6\x83\x1e\x9e\x1c\x17\xbe\x8e\x7d\x71\x3a\x9e\x09\x30\x4e\x13\xd9\x33\x9c\xee\xd4\xf1\x43\xd8\x2f\xff\x50\x51\x2e\x7f\xa2\x94\x6e\x45\xec\x82\x60\xe7\x5a\x41\x8a\xc9\xc7\x9e\x47\x42\x87\x86\xf4\x08\xe9\x92\x57\x8c\xc7\xc7\x0f\x30\x3a\xa8\x77\x73\x39\xd4\x67\xfc\xcf\xf6\x3d\x28\x7e\x42\xcf\xaf\x2c\xa6\x58\xf5\x4c\x4b\xb5\xf4\xa0\xa4\x02\x4d\xfe\xd9\xd0\x1d\x1b\x1e\x7a\x23\x64\x5d\x38\x1d\xb4\xdf\xc6\xc1\xfd\xe6\x82\x8d\x3a\xc0\xef\xae\xb6\xb2\x20\x5f\xe4\xf9\xdf\xb4\xbf\xc6\xfc\x7d\x2c\x8a\x98\xbf\x49\x76\xd6\x29\x70\x0d\x22\xeb\xc2\xe9\xa0\xde\xcd\x74\x09\xc5\x6b\x05\x72\x59\x2d\x74\x39\x17\x95\x96\x95\x2a\x32\xce\x7a\x97\x44\x7b\x11\xd9\x5c\x55\x1e\xb9\x96\x72\xfe\x62\x29\x32\xd2\xc3\xc5\xc1\xbf\x47\x7a\xd7\x07\xd6\x99\x83\x63\x98\x62\x9c\xe3\x81\xb5\xa9\x91\x0c\x4d\xd2\xf4\x2d\x73\x62\xd5\x17\x92\x75\x6b\xfa\xa2\x11\x74\xd2\x8f\x91\xf1\x18\x4e\x77\x3a\xd2\x07\x3d\x13\xc5\x1f\xf4\x9c\x3d\x8a\xc2\x91\x6c\xe0\xd0\xa3\x93\x75\xd7\xb1\xc5\x94\xe6\x66\xaf\x94\xbc\x5e\x5c\x98\x9d\x9a\xca\x8e\xac\x0c\xa7\x3b\x1d\xe9\xbf\xa9\x2f\x8a\x53\xfa\x1b\x73\x5a\x5e\x56\xfd\x10\xfd\x4e\x09\xac\xd7\x8e\x24\x2f\xcf\xbc\x9a\xee\x35\xd8\x80\x93\x61\xe2\x78\x16\x59\x19\x4e\xf7\x7f\x22\x3d\xc9\x7f\x1c\x9b\xdc\xb1\x1e\x6b\x1a\x49\xd1\x77\xf1\x6c\x2d\x73\x10\xf0\x4a\x69\x68\x5a\x3d\x1f\xfd\xfb\xd6\x79\x8e\x6b\xfe\x71\xba\xbf\xaf\x7f\x3e\x8e\xf4\x70\xcf\xd6\x9d\x8c\xf4\xd6\x93\x79\x51\xf7\x24\xa8\xbc\x35\xf4\xa6\xed\xa9\xc7\x03\xf2\xfa\xf7\x28\xd7\xa6\x5c\x31\xd3\x63\x9f\x72\x87\x31\xe7\x9a\xa0\x9d\x7c\xfa\xe4\xee\xfd\x86\x0b\x33\x5c\xaf\x22\x8c\x68\x96\xf8\xc7\xf7\xaa\xca\xf4\x86\x7d\x66\x26\xcd\x6e\xc6\x52\x7d\x18\xf8\x18\xbd\x57\xff\xbf\x2d\xd2\xc3\x5d\xda\x89\x48\x1f\x0a\x8d\xf4\xf9\xfb\x06\x57\xb6\x26\x9e\x4b\x56\x7d\x9d\xea\x0a\xe4\x95\xe3\x69\x5d\x4e\x1e\xc1\x70\x43\x13\x7d\x12\xe9\xb4\x76\x8d\xbc\xc0\xfc\x5f\x44\x7a\x34\x65\x68\xec\xd3\x08\xa7\x59\x4b\xd6\x77\x96\x7f\x5e\x23\xc9\x95\x8d\x43\x24\x22\x85\x3e\x15\xb6\xfd\x32\xe7\xa5\x8a\x8d\xc5\x97\x4b\xb7\x11\xbc\xff\xe4\x00\xf9\x74\xa4\x5f\x2c\x28\x5d\xe0\x6b\xff\x10\xc9\x54\x89\x56\xc3\x20\x7b\x17\xb4\x1f\x12\xc4\x5b\xd8\xc8\xa9\xc6\x37\xd2\xc7\x59\x8d\xbb\xfe\x4f\x42\x2e\x9a\xe6\xa9\x8f\xb5\x00\xdd\x38\x5c\x4b\x8a\xcd\x6f\xd9\x28\x9a\x0b\x6c\x10\xe8\x6b\x59\x27\x54\xbe\xf9\xc9\xfe\x54\xdd\xb9\x8d\xe2\x10\xc3\x87\xf4\x9f\x5c\xed\xe9\x48\x4f\xd2\xee\xa8\x89\xa3\x6b\xeb\x4c\x21\x78\x47\xfd\x83\xf7\x53\xb1\x6e\x72\xcc\xab\x39\xeb\xaf\x9b\x2a\xe2\x96\x85\xa4\x6b\xc8\xff\xc9\x33\x09\x68\xae\xa7\xaf\xd6\x59\x9c\xad\x38\x61\x22\x95\x91\x78\xe7\x85\x96\x52\x16\x66\xa4\x3b\x9f\xff\x95\x20\xf3\xd2\x73\x3f\xe8\xea\x29\x23\xcb\x43\xfe\x59\xa4\x87\xfb\xea\xfe\x6d\x99\x3c\x63\x1d\x53\xf2\x20\x58\x23\xd2\x20\xff\xb2\xa2\x71\x3f\x7a\x5b\x59\x04\xfb\x40\x6d\x5d\x12\x86\xbb\xe4\xc8\x79\x6f\xb4\x0d\x36\xe4\xf2\x00\xa7\x83\x2e\x3b\x2a\xd8\xc4\xdb\xd6\xe6\xf4\xe2\x39\x56\xb4\x3b\xc3\xee\xf8\xd7\x32\x57\xbe\x3c\xcc\x96\xde\x1c\xda\x29\xe5\xf0\x69\x7c\x89\x71\x7c\xaa\x07\xa7\x3b\x75\x5a\x78\x73\xba\xce\xe7\x99\xdf\x3e\x4f\xde\xa7\x9f\x5a\x81\x37\xf0\xa2\x1e\x6c\x2c\xaf\x91\x8d\xaa\xd0\x0d\x89\x1c\x2c\xe4\xb2\xe0\x1f\x9f\x16\xc2\xe8\xa0\xfd\x8a\xd0\x7f\x53\xcb\xc3\xd0\x8f\x6d\x35\x6d\xfe\xb0\x54\xc2\xae\xe6\x78\xaf\x33\x2c\x40\x68\x5e\x31\x96\x9b\x76\x68\x25\xad\xc7\x05\x59\x17\x4e\xe7\x2d\x0d\x99\xba\x95\x5a\xaf\x7e\x32\x7a\x33\xaa\xa1\x8c\x3f\xc8\xde\xf5\xea\xb6\x5f\x37\x83\xf6\x06\xfa\x90\xdc\x68\x18\x87\xa2\xa9\xb5\x94\x3f\x72\x8b\x03\x37\x01\xfc\xcd\x3b\xd9\x84\x73\xe2\xa2\xd5\x0c\x0f\x05\x99\x7c\x19\x9c\x4a\x8d\x0b\xae\x38\x1d\xf4\x12\x7f\x8c\x2d\x66\xba\x35\x3f\xdf\xf0\xba\xe6\x25\xb2\x67\x38\xdd\xa9\x53\xfa\x5f\xee\x9d\xee\x17\x1a\xcb\x32\xf4\x0f\xe7\xaf\xed\xeb\xfa\xe1\xb0\x93\x68\xe5\xf0\x1b\x2d\xa5\xbc\xa4\x27\x97\x7e\xe6\x8c\x76\x7c\x4a\x0f\xa3\x83\x7a\x17\x1c\x28\x40\x76\xeb\xbe\xbc\x38\xc1\xc3\xa8\xb6\x06\x5f\xd9\x60\xc1\x42\x5a\x6e\x97\xfc\xbb\x95\xc4\xbe\xab\xb6\xaa\xb7\xc6\x71\x8f\xeb\xc2\xe8\xa0\xfd\x8a\x3a\xbe\x9b\xa4\xf6\xbb\xd8\x1c\xea\x6c\x9f\x24\xe2\xfb\x5d\xd5\xe3\x2a\x1b\xf1\x67\xe6\x0b\x19\xd6\x02\x1d\x44\xfd\x5c\x41\xc6\xc8\xba\x70\x3a\xa8\x77\x1b\xe8\x17\x83\x27\x7a\x5c\xd6\x6e\x64\x2d\xdf\x5c\x37\x2b\x70\x65\x40\x48\x34\xd0\xe8\x69\x5b\x2a\xb8\xd3\x0f\x4c\xc9\xd0\xb0\x21\xbd\x83\x9b\x45\xff\xe6\x9d\x59\xfe\x81\x9c\x7a\xfd\x8d\x89\x9d\x5e\x65\x8a\x5a\xf9\x89\x25\xd6\x33\x37\x3f\x0e\xc4\xe8\xf8\x60\x76\x54\x2a\x00\x4f\xde\x9f\x47\xf6\x0c\xa7\x83\x8e\xc5\xf7\x81\x05\x33\x3b\xed\x7d\xa1\xdb\xe8\x40\xc8\x74\xde\xa7\xcd\xf1\x95\xe2\xc3\xe0\xb7\x5b\xe3\xdd\x89\xf7\x9d\x2d\x12\xa5\x94\x91\x75\xe1\x74\x50\xef\x8a\xd8\xe8\xbe\x7f\xee\xf6\xe6\x1d\xa6\x1e\x76\x4b\xef\xef\xd3\x79\x28\x5c\xfb\x45\x94\xdf\x4c\xdb\x99\x8e\xec\x1e\x91\xc6\xc5\xe3\xb8\x09\xa7\x83\xf6\x2b\xbc\x70\xa9\xdd\x5b\x8a\x86\x7a\xec\x0a\x0f\x17\xce\x70\x48\x87\x3c\x5f\xf1\x1d\xdc\x83\x9c\x66\xb5\x14\x81\x3b\x3c\x13\x09\x89\xc8\xba\x70\x3a\xa8\x77\x9e\x0e\x34\xa1\x5f\x0e\x89\x44\x69\x9c\xf8\x70\xe9\xb6\xae\xfb\xc4\x33\x93\x2d\xd4\x65\x94\x6a\x90\x4b\xac\x7c\xa1\xdd\x32\xc4\x43\x7a\x07\xb7\x14\xfd\xcd\x3b\xad\x4d\x9c\xcd\x0c\x2e\x35\x0b\xfd\x47\xdc\x9c\xbb\xaf\x5a\x62\x82\xf6\xd0\x6c\x44\xd4\x38\xa6\x33\x69\x6a\x6e\x3d\xb6\xbf\xb5\x80\xec\x19\x4e\x07\x1d\x8b\xa9\x34\xcc\x22\x39\xc2\x2b\x2b\xf6\x47\xa4\xae\x3d\x51\xc9\x2c\x0a\xbe\x18\x2a\x5c\x3b\xea\xf3\x72\x17\x59\x8d\x8c\xe7\x14\xf3\x91\x75\xe1\x74\x50\xef\xc8\x39\x3c\x48\xbe\xa1\xb5\x73\x04\xd6\x08\xf6\xe5\x75\x79\x5c\xcf\x33\xaf\x52\x7e\x3a\x55\xf5\x5d\xf9\xfd\x98\x4b\x30\xd9\xb6\x18\xb2\x2e\x9c\x0e\xda\x6f\x13\xf3\x6d\xcd\x81\x8f\x18\x5b\xca\x26\x19\xee\x82\xa1\x0d\x24\xd6\x46\xfd\x11\xe8\x82\xca\x9c\x80\x74\xc4\x8c\x1b\xb6\x12\x3f\xb2\x2e\x9c\x0e\xea\x5d\x80\x0f\xda\x6e\x8c\xa0\x80\xc6\xa5\xa8\x5a\x8c\x07\xe2\x57\x2d\x32\xb1\x0c\xe9\x14\x46\xbd\xec\x9d\xf2\x8d\x7a\xe5\x87\xa2\x79\x91\xde\xc1\xad\xe7\x7f\xf3\xae\xb0\xdd\x8f\x66\x2d\x84\x18\x1f\x3f\x70\xd3\xac\xc7\xfe\x0e\x81\x23\xb7\xab\x93\x75\xd2\xcf\x94\x36\x03\x42\x5c\x4a\xbc\x03\x10\xd9\x33\x9c\x0e\x3a\x16\xe4\x2c\x05\x4e\x9d\x97\x8c\xbb\xbc\xf4\x3f\xa3\xe5\x3a\x9b\x37\x3b\x37\x77\xe2\x13\x26\x87\x1d\x3a\x90\xa5\x90\x7b\xff\xe2\x56\x3d\x1e\x63\x18\x1d\xd4\xbb\x61\x51\x2d\xe5\xd9\x33\x65\x4e\x8c\x2b\xc2\x05\xdf\x2b\x79\x48\x87\xc2\xbc\xbb\xb5\x1c\x54\x3f\x2b\x15\xe0\x0f\xec\x5d\x56\x3c\xbe\xd5\x0c\xa7\x83\xf6\x8b\xf7\x69\x75\x3f\xf5\x61\x2b\xfd\xd2\x76\x08\x0d\xf7\x12\x51\x09\xe1\x6c\x40\x6a\x46\x89\x5b\x87\x16\xa6\x12\x75\x84\x6d\xca\x01\xb2\x2e\x9c\x0e\xea\xdd\x59\x43\x44\xb5\x27\xff\x13\xd6\x8f\x66\xd9\x0c\x41\x4c\x32\x74\x95\x0c\x77\xdf\x1b\x63\xef\x3d\x25\xc1\xe1\x26\xdd\xd9\x14\xae\x3b\xfe\xdd\xc1\x6c\x8a\xfe\xe6\xdd\x14\xb8\x40\x1f\x3b\x15\xa9\x64\xbe\xa5\xd0\x51\xc2\x5b\xe6\x92\x39\xa6\x5b\xcf\x5f\x27\x28\x7f\x21\xf2\xbe\x49\x03\xb5\x19\xfd\xf1\xef\x03\x46\x07\x1d\x8b\xb0\xe1\xb8\x82\x70\x89\x29\x42\xa7\xb5\xf6\xdb\xe7\x5c\x6f\xa6\x27\x2b\x9c\xf3\x9a\xba\x51\xe4\xcc\x15\xf7\x30\x30\x63\x1f\xfb\x07\xb2\x2e\x9c\x0e\xea\x9d\xde\x53\xa7\x37\x58\x26\x7c\xad\x39\x72\x8c\x16\x1f\xac\x48\x88\x03\x2a\xbd\x14\xce\x48\xf4\xda\x25\xe5\x51\x3a\x93\xd3\xca\x1d\xf7\x0b\xa7\x83\xf6\xfb\x45\x2e\xb3\x74\x8c\x96\x7e\xf4\x32\xe1\x9d\xd9\xcc\x21\xb0\xa0\xbb\x9e\xfb\x02\x4e\x4a\x01\x7a\xd3\x3a\x11\xaf\x98\x7a\xc8\xf1\x3a\x0a\xa7\x83\x7a\x57\xdd\x8a\x49\x94\xfc\x0b\xc4\xf0\xec\xa0\x5d\x35\x2f\x2e\xf6\x77\x53\x1a\x27\x4c\xbc\x3a\xd7\xf7\x5e\x9a\xd3\xdd\x24\xdc\x25\x04\x19\xe9\xe1\xe2\xe0\xdf\x23\xfd\xc4\x12\x2d\xf1\xd2\x3b\x7a\x75\xf9\x41\xd2\x88\xb1\xb5\xbe\x91\xc5\xac\x77\x3a\x65\xa3\x9b\x99\x4d\xe9\x03\xb7\xf4\xd0\x3b\x1e\x20\xe3\x31\x9c\xee\x74\xa4\xef\xbb\xa8\x43\x83\xe0\xfb\xd6\x54\xaf\x73\xcf\x03\x5b\x89\x23\x4d\xff\xa3\x61\xfc\xcc\xf8\xe2\x8d\xaa\x01\xf6\xcc\x87\x1e\x6e\x2a\xc8\xca\x70\xba\xd3\x91\x3e\xd2\xbb\x64\x47\x49\xb2\x28\x66\xfc\xa5\x6c\xb8\xf9\x39\xe7\xfc\x0b\x9b\x34\x49\xdf\x99\x77\x7f\x34\xb3\x71\xb1\x08\x8f\x5f\x10\x40\x56\x86\xd3\xfd\x9f\x48\x2f\x79\xb2\x72\x45\x59\xa9\xea\xe3\x9c\xd2\x62\x5f\xe1\xf0\xc5\xf4\x39\x0d\xe2\x8f\x2d\x35\x29\x62\x43\x68\xd9\xe7\xf7\x3c\xfd\x1f\xb5\x7f\x9d\x3a\x8e\xf4\x70\xef\xc0\x9d\x8c\xf4\x95\x58\x01\xf7\x4a\x77\xed\x9f\x74\x8c\xda\x0b\x3a\xb5\x4f\x7c\xc9\x39\xff\x4a\x67\xa0\x2b\x07\xed\x67\x46\xbf\xe0\x55\x37\x92\x92\x13\x52\xef\x5f\x6d\x81\xf6\xee\x23\xbe\x8c\xd5\x92\xd8\xdf\xf9\xaa\xf4\xe9\x88\xb5\x24\xc3\xc2\x73\xeb\x7f\xb7\xdf\x3b\x77\x9b\x0e\xa3\xfd\x7f\x5b\xa4\x87\xbb\xb4\x13\x91\xfe\x33\x34\xd2\xb7\x89\x72\x9b\xdc\x29\xac\x36\x91\xfb\x3e\xca\x04\xea\x4e\x94\xbf\x8c\x8d\xa4\x39\x70\xe0\x63\x73\xf1\xa9\x6b\x08\x0d\xf6\x69\xf9\x17\x91\x5e\xf2\x54\xa4\x2f\xd2\x16\x15\x44\x08\x3a\xdf\xb4\x4e\xad\xa4\xcd\x0e\xfd\xbd\x8d\x77\x53\x8b\xd2\x13\xc1\x18\x2e\xa9\x20\x58\xab\x60\xba\xec\xfa\x4f\x0e\x90\x4f\x47\xfa\xd4\x1f\x25\x5e\xd2\xc4\x2d\x57\x1e\xc9\xe4\xd9\x5f\x53\xfd\xba\xbc\xdc\x4c\x47\x6c\x05\xfa\x7e\x2e\x09\x9f\xa7\xae\xa0\xd0\x7c\xfb\x4f\x8e\xcb\x4f\x47\x7a\xb2\x24\x4c\x0b\xfe\xf2\x6e\xeb\x29\x62\x0c\xbe\xb0\xe6\x83\x80\xd2\xcd\xc1\x5b\x0d\x8e\x8f\x45\x9c\x2a\x9c\x30\xad\xd1\xe2\x0f\xfe\xc9\xd5\x9e\x8e\xf4\xf8\x04\xec\x75\x59\x6b\x7c\xe9\x77\xfc\xce\x3b\x25\x0c\x3e\x41\x4f\x79\xe4\x6e\x69\x8a\x20\x91\xc8\x62\xf7\xa6\x38\x42\x14\xfc\xfe\x27\x57\x7b\x3a\xd2\xab\xce\x6e\x54\x8c\xa4\xd0\xe5\x55\x57\xe9\x57\x38\xb6\x9b\x27\x11\xdf\xa6\xef\xd5\x8f\xaa\x6b\x09\x2a\xb5\x0f\x3c\xb2\xaa\xd7\xfa\x67\x91\x1e\xee\xab\xfb\xb7\x65\x52\xd0\x4a\xb4\xae\x95\x95\x5c\xe4\x7e\x88\x8e\xee\xb7\x85\xa9\x9b\xe9\x12\xe3\xdf\x3e\xa2\xaf\x3f\xa6\xfd\x91\xad\x2b\x2e\x3a\xa6\x8b\x5c\x1e\xe0\x74\xd0\x65\x67\x90\xbf\x2f\x65\xf4\x71\xbc\x57\xd0\x63\x77\x51\xb1\x5f\x8b\xec\x2f\x97\x88\xda\xa3\x5a\xa5\x88\xe5\x46\x7d\x5d\x15\x92\x2d\x97\x90\x75\xe1\x74\xd0\x65\x92\x5d\xf9\xee\x23\xef\x02\xd7\xb6\xb7\xf2\x33\xa6\x0b\x72\x89\x33\x4d\xba\x67\xdd\xae\x89\xe6\x76\xa3\x45\x1d\xe0\x6a\x76\x91\xab\x21\xeb\xc2\xe9\xa0\x77\xa8\xbf\xf8\xc7\xcc\xea\xa2\xfb\x3a\x7c\x7d\xe0\xb2\x50\x1c\x9d\xd1\x26\x41\x64\x6e\xf5\x4d\x34\x24\xd3\x90\x6b\xee\x77\x22\x17\x0f\xe5\xf1\x32\x09\xa3\xf3\x96\x06\xfe\x63\x1c\x0e\xd0\xfc\x86\x53\x3a\xbd\x77\x64\xd0\x17\x8a\x84\x06\x3f\x97\x5d\x7d\xa7\x8d\x33\xb7\x34\x59\x3f\x9b\xcf\x05\x70\xa4\xe6\x7a\x21\xb7\x38\x70\x13\xc0\xdf\xbc\x23\xb8\x83\xa6\xa5\x16\x39\xfa\x78\xd0\x5b\x46\x2f\xbf\x78\x54\x93\xf4\xd7\xe0\x78\xa5\x9c\xb8\xfe\x30\xb5\x31\x3e\x39\x97\x92\x1c\xb2\x67\x38\x1d\xd4\xbb\x0b\x9f\x9c\x44\xe2\x9c\xb1\xa4\x47\xcc\x15\x44\x0c\x1c\x59\xb2\x68\x28\x9a\x6a\x5e\xd9\xaf\x3f\x92\x6c\xe8\x7f\x93\x44\xf2\x8c\x0f\x59\x17\x4e\x07\xf5\xee\x07\x79\x7b\xad\xa9\x7f\x08\xd1\x0b\x04\x96\x3b\x47\x6d\x54\xc5\x14\xe1\x91\xc3\x8f\x7b\xda\x38\x0f\x49\xbb\x1f\x1f\x06\x26\x01\xc7\x4f\x42\xc0\xe8\xa0\xde\xb5\xe2\x0b\x28\xb6\x2a\xb9\xfc\xb6\x6f\xcf\xfb\xfc\x50\x37\x39\x80\xc0\xc2\xf5\x90\xd0\xf6\xc5\x6d\x6a\xd6\x42\x16\xeb\x00\xfe\xe3\x93\x69\x38\x1d\xd4\xbb\xa7\x4d\x3a\x2c\xc1\x37\x88\xae\x19\xe1\x07\x8c\x7e\x14\xc7\x60\xb1\x65\xfe\xa9\x56\xbc\x6e\xb0\x83\x96\xb7\x4a\x82\xf6\xc3\x79\x14\xe9\x1d\xdc\x2c\xfa\xd7\x5b\x69\xfe\x3f\xde\x3b\x5d\xc3\xca\xdf\x18\xd5\x4b\xde\xda\x4d\x4b\xca\xc3\xf9\x26\xfa\x3a\x30\x68\xe8\x0a\xeb\xbc\x57\xae\xe0\x2d\xae\xe3\x5b\x69\x30\x3a\xa8\x77\xb5\x75\x66\x55\xd7\x49\xe7\xe3\x35\xd4\xb4\x7e\x7b\x59\x58\xde\xe6\x68\x16\x65\xba\x7b\xc1\x97\xa6\xb2\xa4\x57\xf0\x29\x06\xf6\xf1\x03\xc0\x70\x3a\xa8\x77\xd5\x0b\x04\xe7\x5c\x48\x2f\x92\xfd\x74\x64\x6e\x2e\xaf\x21\x9b\xc5\xc8\xd1\xd5\x35\x77\xcf\xc6\x78\xd2\x98\xd7\x61\x46\x9d\x7a\xfc\x70\x2a\x9c\x0e\xea\xdd\x9c\xda\xda\x58\x4a\x8a\x0a\xa5\xa0\xeb\xae\x7a\x31\x4f\x64\x86\x0c\x49\xc2\x75\xaf\x95\x48\x4a\xa2\xc2\xf9\xe5\x69\x25\x33\x87\xe3\x93\x2c\x18\x1d\xd4\xbb\x87\x0f\x8d\xbc\x71\x68\xcd\x30\x73\xd9\x7f\xee\x6a\xc9\xaf\xc4\x90\x95\x3c\xe7\x9b\xe6\xaf\x25\xad\xd5\xd6\xb1\xcb\x3f\x5f\x0d\x22\xbd\x83\x5b\x8a\xfe\xe6\x9d\xb7\xcc\x5d\x96\xf5\x7a\xb9\x59\x45\x35\x04\x3e\x3f\x17\xa7\xdc\x8d\x00\x39\x6a\x32\x42\xaa\xd1\xa8\xfa\xd5\xcf\xe7\x82\x85\xae\x21\x7b\x86\xd3\x41\xbd\x5b\x25\x2e\xe9\x75\xb4\x7c\xd3\x52\x3c\xba\x28\x28\x71\xdf\x64\x7e\xaf\x7a\xc3\x6f\x37\xed\x63\xc2\x8c\xe6\xc5\xd5\x50\x8c\x1f\xc7\x31\x0b\x4e\x07\xf5\xae\xca\xfa\x73\xc7\x61\xc1\xbc\xc2\x22\xc9\xae\x7f\x79\x8d\x42\x55\xf8\xad\x6f\x4f\x16\xfb\xec\xe6\xb1\xed\x7e\x7e\x8c\x6c\x1e\x3f\x8b\xac\x0b\xa7\x83\x7a\x17\x8d\x77\x3e\x82\x85\x38\x3b\x91\x7d\xfc\x12\x73\xdf\x78\xc2\xbe\x8b\x91\xce\x37\x91\xa5\x95\xfe\x98\x2b\x7e\x5a\x5d\xb9\x02\x37\x8f\x4f\x37\x61\x74\x50\xef\x28\xfb\x13\x2c\xf7\x13\xb9\x9b\x46\xde\xbd\xcc\x8f\xd2\x79\xc8\x3a\x52\x1a\xe9\xa1\xa8\x24\x18\xf4\x55\x27\xbb\x82\x8d\xa6\xf5\xf8\x65\x25\xb8\xf5\xfc\x6f\xde\xf1\xb2\x47\x5f\xe4\x1f\xcb\x67\x0c\xc4\x7a\x6c\xf6\xb3\x27\x07\xbb\xe4\xd2\xf8\x94\xb8\x6e\x62\xe4\x6f\x03\x91\xcb\x63\x62\x5c\xc7\xd1\x1b\x4e\x07\xf5\xae\xd8\x6a\xa2\x56\xdf\x7d\x76\x9a\x9a\x80\xa7\xf1\x73\xc6\x80\xe9\x34\x45\x36\xf9\xc2\x25\x8d\x07\xca\x95\xc2\x1d\xcf\xba\x3e\xe8\x21\xeb\xc2\xe9\xa0\xde\x6d\x8c\x89\x6f\xa7\x56\xcc\x2e\x3b\xa1\x3f\xb7\x30\xfa\x92\x3d\x9d\xe4\x99\xdb\x76\xd6\x45\xc5\xe7\xfa\x19\x0c\xac\x31\x3e\xf5\x23\x64\x5d\x38\x1d\xd4\x3b\x87\x91\x30\x02\x8e\x03\x93\x08\x27\x5d\xb1\xa9\xf9\xc3\xf5\x7b\x3b\x45\x2f\x1c\x13\x6e\xab\x3c\x89\xba\x8e\xfd\x5e\xac\x8e\x21\x0a\x59\x17\x4e\x07\xf5\xae\x76\xe4\xfa\xaf\xaa\xf3\x57\x7d\xcf\x5f\x22\x7d\xbc\x1d\xab\xd7\x2a\xa4\x77\xb3\x2d\xed\x20\xc0\xcd\x51\x66\xd3\xee\x9c\x2e\x77\x22\xd2\x3b\xb8\x4d\xd1\xdf\xbc\xfb\xba\xf2\xc2\xc1\x56\x99\xd9\x3f\xaa\x88\x25\x6e\x39\xdc\x6a\x2c\x1a\x57\xd8\x83\x5d\xfe\xfb\x79\x25\x92\xf7\x47\xef\xcf\xaa\xcd\x22\x7b\x86\xd3\x9d\x7a\x69\xe2\xae\x35\xfd\x16\x51\xb2\xca\x6a\xc7\xc8\x3b\xcf\x14\xac\xe7\x42\x07\xcf\x96\x3e\x6c\xa3\x6b\xf1\x96\x12\xe6\xb8\xe0\x45\x1f\xef\x29\xe0\x74\x50\xef\xb8\x84\x77\x75\x35\x9e\x7a\xe6\x6e\x69\x07\x78\x0c\xdd\xc4\xc3\x7b\xa2\x49\x5b\xd0\x68\xc1\xf9\x2e\x23\x71\xb6\xc7\x6b\x20\xe6\xf8\x96\x3b\x9c\x0e\xea\x1d\xdf\xe2\xe6\xe1\x16\xdb\x30\xbf\x3e\x59\x25\xfd\x3c\x51\x71\x9d\x18\x51\x82\x6e\xc2\x7e\xe2\xbc\xb0\x49\xee\x80\xae\x87\x62\xfc\xf1\x13\x16\x30\x3a\xa8\x77\x8f\x4a\xd7\xb6\xb9\x34\xe8\xd6\xdc\x7c\x69\x1e\x27\x7d\xd0\x59\xbd\x41\x4a\x72\xed\xfe\x77\xe3\x74\x16\xfd\x8c\xe5\x4b\x38\x36\xed\xc8\x48\x0f\x17\x07\xff\x1e\xe9\xcb\x28\x2e\xef\x50\x7a\x5e\xc9\x96\xb6\xba\x7c\x06\x27\x54\xf5\x22\x65\xdb\xad\x07\x18\x2f\x92\xac\x81\xb9\x26\x44\x8d\x17\x43\x14\x32\x1e\xc3\xe9\x4e\x47\xfa\xbb\x3a\x3b\xa5\x7c\xfb\xd4\xe7\x35\x18\x5a\x7d\x1f\xbd\xa4\x32\x64\xd2\xf0\x7e\xab\x1c\x2a\x88\x87\x0d\xa2\xf1\x24\x94\x0a\xf9\x21\x2b\xc3\xe9\xbc\x65\xd1\x30\x21\x91\xde\x1d\x6b\x6c\x5f\x3c\x6c\x6f\x49\x4f\x88\xc0\x8b\x2b\x77\x25\xa8\xba\x61\x80\xb3\x7a\x4a\xe0\xf5\x0c\x33\x3e\x22\xe1\xbe\xe5\x71\xa4\x87\xd1\x79\xcb\x02\x90\xd1\xa8\x6d\x9b\xf9\xe8\x77\x14\x6f\xa4\xfe\x60\xb3\xfb\xdb\x17\x19\xcc\xee\x1e\xae\xaf\x9e\x2a\xa1\xb9\xbe\xda\x65\x22\x3a\x0b\xa9\x2d\xc7\x91\x1e\x8e\x55\x73\x32\xd2\x73\x17\xf1\x95\x67\x1e\x5a\x39\xdd\xbe\x31\x10\x78\xcd\x48\x46\xbb\x8f\xd9\xf7\x73\xfe\x3b\x42\x7c\x7f\x1a\x9d\xe7\x5c\x64\x13\x2b\x27\xa4\x99\x9f\xcd\xd8\x26\xa7\x15\xdf\x4d\xfb\xad\xc7\x60\x8c\xd4\xdd\x7d\xfe\x6e\xb0\x07\xc3\x67\x28\xf3\x7b\x8a\xba\x5d\xbf\xe4\xf6\xc2\xff\xb6\x48\x0f\x77\x69\x27\x22\x3d\x09\x19\x24\x80\x29\x45\x11\x79\x7e\x0f\xed\xf9\x8e\x93\xe9\xdc\x16\x36\x80\x6e\x7f\x61\x01\x4b\x70\x5a\xa1\x35\xf7\xe7\xe5\xf0\x90\x20\x36\x4e\xef\x7f\x11\xe9\x3d\x4f\x45\xfa\x9f\xdb\xbf\x58\xd5\xf9\xf1\xc9\x68\xbb\x88\xb5\x52\xb3\x0d\x99\x62\x02\xc9\x70\x79\xf8\xc6\x1c\xe7\xbc\x4b\xec\x33\x14\xad\x9e\xfd\x93\x03\x64\xe1\x53\x69\x93\x28\x95\x84\x56\x2a\x53\x51\xe7\x03\x5d\x67\xd4\x19\xed\x6a\xb7\x34\xf7\x83\x0b\x00\x6b\x9f\xa3\x72\x33\xc7\xb7\x48\x7f\xb5\x1b\xff\xe4\xb8\xfc\x74\xa4\x0f\x93\x38\xa2\x9b\xe9\xbc\x71\x39\xcf\xae\xf0\x13\xf7\xeb\xda\xf6\xd5\xf1\xaa\x46\xb5\x3a\xd3\x6f\xa5\x2f\xcc\xfc\xed\x27\x99\x0b\xff\xc9\xd5\x1a\x9d\xfa\x58\x27\x33\x9d\x2d\xb1\xae\x21\xb2\xbc\x40\xa3\x15\x96\x66\x2c\x36\x39\xb1\x45\x3a\x6a\xda\xa5\x84\xb4\x75\x6f\x2b\xdc\x28\x7a\x8f\x7f\x72\xb5\xa7\x23\xfd\x0d\x35\x1a\xbf\x3a\x90\x7d\x61\x64\xd0\xe0\xd1\x54\x27\x56\xee\xeb\x0c\xf7\xb5\xc7\x09\xe7\x71\xed\x7f\x7d\x7f\xf6\x54\x67\x64\xfb\x9f\x45\x7a\xb8\xaf\xee\x5f\xdf\xa5\xbf\xf2\xfe\xdb\x27\x7e\x9a\xf3\xe5\x42\xef\xfd\x7c\x67\x16\xec\x2c\x37\xd0\xde\xbb\x64\x4b\x1b\x10\xb9\x44\x29\x81\xb9\x85\xbc\xc7\xef\xd2\xc3\xe8\x4e\x3d\x0c\x8d\x5b\x95\xfd\x85\x12\x0c\xb1\x34\xa7\xd1\x17\x38\x6c\x2d\xb8\x20\x35\x50\x92\x2f\x78\x9d\x4e\x64\x9a\xea\xd3\xa3\xa5\x96\xe3\x07\x06\xe1\x74\xd0\x65\x32\xcf\xcb\x32\x99\x41\xc5\x35\xaf\x91\xce\x7c\xf8\xec\xb3\x4b\x81\xc2\x95\x5f\xcf\x36\xbc\x2b\x3e\x9c\x15\xb8\x84\xf3\xa4\x34\xf1\xf8\x7d\x3a\x38\x1d\x74\x99\xdc\x0a\xca\x4b\x31\x2c\xe3\x9c\x11\xcc\xf4\x35\x3c\xcf\x3d\xd8\x82\xfe\xed\xac\x22\xfb\xaf\xe2\xde\x6b\xeb\x97\xe2\x4a\x0f\x1f\x1e\x6f\xa7\xe1\x74\xde\xd2\x38\xff\x31\x0e\xf3\x74\x07\x56\x03\x58\x8f\x02\x29\xbe\xeb\x3c\x37\x20\x19\x7c\x74\xd8\xb7\x1d\x1e\x42\xd9\x7b\xa3\xb2\x7c\xf4\x7e\x07\x87\xb8\x09\x72\x8b\x03\x37\x01\xfc\xcd\xbb\x8b\xa5\x8a\xf7\xba\x1b\x87\x48\x05\xba\x70\xfc\x28\xf4\xd3\xeb\xf8\xe5\x77\xc3\x16\x47\x7b\x6f\x0d\x15\x26\xef\xc8\x19\xe9\xed\x1e\xbf\xdc\x00\xa3\x83\x7a\x77\xde\xec\x41\xd8\x45\x25\x95\xc5\xf3\x86\x63\x17\xee\xd3\x91\xd5\x30\x9f\xc5\x11\x78\xbd\xe6\x28\xb4\xb6\xbc\x19\x6a\x79\xef\xe5\x33\x64\x5d\x38\x1d\xd4\x3b\x6b\x5b\x9c\x82\x9a\xb5\xf9\xc6\xe2\xaf\x42\x37\x53\x03\x3d\xec\x9f\xd0\x90\xb1\xae\x6c\xad\x7e\x7d\x63\xbb\xc1\x1a\xc3\x2c\xc5\x89\xac\x0b\xa7\x83\x7a\xc7\xd3\xaf\x97\x12\x8a\x7d\xe7\x30\xc5\xc4\x22\xcf\x9c\x3a\xda\x94\x3a\xfd\x96\xe2\xeb\x99\xd0\x5f\x51\x57\xab\xee\xb1\x68\x6a\x38\x1e\xbf\xd3\x0b\xa3\x83\x7a\x47\xc6\x66\x96\xc0\x49\xc9\x74\x87\x7a\x8d\xc7\x3d\x3a\xc0\xe6\xeb\x37\x33\x31\x89\x90\x1c\x0c\x46\xc3\x8d\x41\xb3\x09\x59\x74\x46\xa4\x77\x70\xb3\xe8\xdf\xbc\x0b\xda\x9c\x09\x78\xec\x54\xf6\x7c\xf0\x57\x05\x46\xc0\x54\x3a\xad\xf0\x12\x8d\x1a\xd9\x60\x64\xa7\xfc\x6f\x9e\xc3\xaf\x21\xc5\xc7\x11\x19\x4e\x07\xf5\xae\x97\x9a\x73\x6b\x6b\x94\xb6\xe5\x3e\xd1\xca\xa4\xe8\xa1\xd0\xb3\x66\x80\x3b\x5e\x6f\x4b\xaf\xe9\x5c\x8a\xce\x4f\x0f\xad\xb1\xe3\xba\x70\x3a\xa8\x77\xd2\x0e\xc1\xed\xb3\xbb\x69\xfd\x58\xfa\xeb\xad\x89\xf1\x7e\x3f\x7e\x02\x7e\x4e\x96\xfe\x03\x79\xb5\x36\x56\xb3\xf2\x67\x34\x0e\x91\x75\xe1\x74\x50\xef\xba\x1d\x28\x3e\x85\x3e\xda\xe5\x1f\xc6\xa8\xf5\x70\xc8\xda\x78\x22\x1a\x78\x67\x85\xd5\xf9\x4c\x14\xff\xa3\x77\x58\x91\x1d\x04\x04\xc8\xba\x70\x3a\xa8\x77\xa4\x54\x6a\x21\x69\x97\xbc\xcb\x64\x46\xd1\xde\xe3\x54\x4e\xf3\x6b\x3b\xf3\xec\xd7\x91\xbf\x64\x91\x50\x66\xac\xd5\xbb\xf7\xe1\x29\xd2\x3b\xb8\xa5\xe8\x6f\xde\x09\xe1\x07\xd3\x74\x92\xbe\xb0\x20\xc4\xb8\x74\x7e\xdd\x2f\x9a\x6c\xe8\x25\xcd\x02\xc6\xcd\xb8\x7d\x5e\xc5\x47\x6c\x51\xc5\xc0\xf1\x93\x10\x70\x3a\xa8\x77\xf9\xda\xef\xa6\xd3\xea\xa3\x67\x24\x0c\x2f\x5d\x54\x28\xe9\x65\xe3\x63\xcb\xaa\x4c\x59\xc4\xc9\xf7\xfe\x34\xe2\x76\xd6\x56\xe6\xf8\x56\x1a\x9c\x0e\xea\x5d\x0a\x0b\x7d\x22\xba\xa1\x7d\x98\x57\xe7\x25\xff\x6a\x1b\x3f\x6e\xdf\xee\x6c\x89\x8f\x93\x68\xbb\xc2\xf1\xf4\xb1\xc6\x9b\xba\xc7\xb7\xbc\xe0\x74\x50\xef\x8c\xf8\xdd\xc4\x7c\x2a\x35\x74\xcf\xc9\x0f\xd5\x24\x2c\x5d\x95\x34\xed\x97\x19\x37\x44\xdf\xdc\xda\x50\xf3\x59\xed\xd5\xad\x3e\xbe\x1d\x03\xa7\x83\x7a\x97\xf6\x9e\x26\x95\xcd\xd1\xf0\x95\xfb\xec\xc8\x26\xc3\xc5\x57\x01\xe3\xc4\xac\xd7\x3a\x72\x38\x6f\x4b\xb1\xa1\xe7\xc9\x7d\x22\x3c\x7e\x3a\x06\x6e\x3d\xff\xeb\x4b\x13\x5c\xb5\xdd\x1b\x0e\xcd\x4f\xb6\xae\x50\x3e\x92\x18\x9f\xc0\xd8\x09\xdf\xe9\xe4\x8e\xea\x9b\x45\x4b\x2f\x6e\xe7\x22\x30\x2a\x3b\x7e\x69\x02\x46\x07\xf5\x8e\x8b\x21\x2a\xba\x87\x16\xef\x5c\x22\xf6\xf3\x68\xa3\xf4\x8a\x9d\xab\x9a\x05\x46\x83\x1e\xec\x5f\xa4\xb9\x05\x43\xd1\x18\xbe\x28\x1e\xc7\x37\x18\x1d\xd4\xbb\xaf\xd4\xa1\x88\xed\x8b\xbf\x7f\xcd\xa1\x57\xe4\x31\xf8\x4b\x7e\x7c\x1d\x7c\x21\xc4\x3c\xeb\xd1\xaf\x73\x93\xb3\x11\x3a\x75\xf2\xc7\x2f\x9a\xc1\xe9\xa0\xde\x55\xe3\x2c\x77\xea\x5d\xeb\x2a\x9d\x4f\x73\x98\xb8\xf2\x71\x03\x64\x5c\x3a\x58\x16\x26\x5c\xef\xbd\xe0\x9b\xd3\x3b\xe9\xfe\xbb\xee\xf8\x16\x1d\x8c\x0e\xea\x5d\xdb\x65\x3e\x27\xf6\x2c\x47\xba\x32\x4c\xc7\xe9\x44\xfb\xb7\x9a\x77\x37\x88\x12\xb8\x6c\x18\xad\xd0\x85\xbd\x24\x7a\x18\x3d\x69\x90\xde\xc1\x6d\x8a\xfe\xfa\xbb\x33\x76\x98\xe9\xed\x32\xb8\xd4\xe6\x5c\x30\xb4\x97\x7e\x3e\xf0\x01\x26\x91\x29\x65\x2b\x23\x17\xd6\xaa\x33\x5f\x3c\xde\x18\xf1\xf1\xef\x0e\x46\x77\x6a\xce\x6c\x99\x3a\x63\x56\x61\x1e\x35\x4a\x21\x6a\xda\xde\xf7\xbc\xe7\x9c\x28\x45\x17\xcb\x7c\xa0\x27\x26\x93\x6c\x7f\x73\x5a\xc5\x31\x47\x07\x4e\x07\xf5\x4e\xf0\x87\x9f\xc4\x9d\xed\x1f\x9b\x49\x74\xbc\x6f\xab\x7f\x99\x4a\xdd\xf9\x25\x12\x9c\x6a\x7e\x89\xe4\xc1\xf0\x51\x77\xf2\x6b\xcd\xa1\xe3\xe3\x12\x18\x1d\xd4\x3b\x75\x81\x5a\xcd\xf5\xaf\x67\x7f\x5e\xe5\x52\xb2\x92\xbe\x63\xae\x44\xaa\xad\x5a\x70\x94\x34\xf8\x68\xcf\xa0\x59\x5b\xd6\x84\x31\x0c\x59\x17\x4e\x07\xf5\xee\xba\xd4\xa1\x72\x38\xae\xfa\x92\x3c\x91\xd7\x97\x90\x31\x90\x66\xee\xfb\xfa\xc8\x68\x57\xa5\x26\x47\x12\xbe\x88\x79\xe0\xaf\x45\x64\xa4\x87\x8b\x83\x7f\x8f\xf4\xdf\x27\x0f\x3a\x48\xe3\xa8\xdd\xae\x47\xca\xcb\xe7\x3f\x78\x3a\x17\x48\xc2\xba\x16\x2a\x22\xd5\xb8\x9f\x53\xdb\x39\x88\x56\x4d\x88\x8c\xc7\x70\xba\xd3\x91\x1e\xe7\xb3\x53\xf0\xfe\x7e\x50\xd2\x9d\xfd\x94\xb7\xc4\x2c\x2d\x41\xac\x65\xfe\x2c\x52\x7b\x33\xfe\x0c\x64\x83\xd3\x9c\x4b\xdc\xde\xc8\xca\x70\xba\xd3\x91\xbe\xce\x2c\xb1\xf7\x67\x44\xfd\x00\xd5\x75\x44\xb4\xe4\xb7\x97\xc1\x9b\x5b\xe7\xfc\x4b\x4a\xae\xfc\x70\x7d\x8c\xef\xa9\xfe\x36\x22\x10\x59\x19\x4e\x77\x7a\x34\x9e\x5d\x8b\xce\xf6\x14\x0d\xc7\x34\xfb\x25\x4d\x94\xfd\x59\x65\x7f\xf8\xeb\xab\xf9\x56\x62\xcb\x21\x7b\xb3\xf0\xa4\x95\x4d\xaf\xfc\xe3\x48\x0f\xc7\x94\x3d\x19\xe9\x4b\xda\x3a\x36\x52\xb0\xcd\xbc\x3d\x39\x2c\xf9\xde\xf6\x9f\xf9\xe5\x7c\x73\xf8\xdb\xf6\x17\xf1\x6d\x47\xd3\xb6\x4f\xaa\x9f\x5e\x6c\x9e\x90\xea\x27\x7a\xd3\x37\x61\x9b\x28\x53\x5d\x96\x7c\x1f\xec\x15\x73\xab\x6f\xe6\x20\xfa\xe1\xb7\x7d\x91\x16\xd0\x90\x61\x37\xeb\x3c\xfd\xff\xb6\x48\x0f\x77\x69\x27\xdf\xa5\x87\x46\x7a\xb4\x0e\x45\xf9\x82\x54\x4f\x86\x0e\x51\xb7\xb8\x78\x43\x07\x43\x45\x0e\xdc\xb3\x2c\x7b\x8d\xdc\x8d\x8f\xdd\x9f\x19\x0c\xb5\x73\xfe\x8b\x48\x5f\x7b\x2a\xd2\xe7\xdc\x11\x24\x9e\xed\xc4\x1d\xfb\xd1\xa0\x60\xf7\xce\xc1\x13\x8b\xf7\x3a\xd1\x70\xb2\xe1\x62\xc6\x08\x87\xd6\x28\x8f\x4b\xd4\xff\x64\xbc\x50\x1f\x20\x9f\x8e\xf4\x54\x37\xe6\x9f\x7c\xd6\x5d\x3b\x90\x7a\x67\x31\xb5\x77\xbf\xbd\x98\xcc\x54\x69\xb0\xb0\x01\xa0\x0a\xe9\xbb\xac\xb4\xe7\x34\x77\xe1\x9f\x1c\x97\x9f\x8e\xf4\x78\x62\x54\xdc\xf2\x01\x6f\xf0\x26\x8e\x88\xd5\xc8\x4d\x88\x6a\xb3\xb5\x55\xc1\xc6\x5c\x93\xa6\xee\x5f\xd6\x66\xe1\x7b\xb1\x65\xff\xe4\x6a\x4f\x47\x7a\xcd\xae\x52\x9e\x40\xa9\xa2\x2b\x09\xcd\x6c\x1b\xa9\x95\x8b\x3f\xcf\x4a\xe0\xfd\x7e\xf5\xdc\x62\xe9\xad\xfd\x59\x55\xf9\x39\xf5\x9a\x7f\x72\xb5\xa7\x23\xbd\x41\x00\x5b\x82\xb8\xb0\xcc\x6a\x86\x7b\xd9\xbb\xd9\x92\x51\x6e\x3c\x23\x37\xc6\xce\x3d\xbb\x62\x74\x83\x9f\xe2\x15\xdf\xd9\x87\xfe\x59\xa4\x87\xfb\xea\xfe\x6d\x99\x8c\x9d\x8d\x4c\xbe\x12\xd2\xa1\xd3\x25\x34\x78\xbb\xed\x95\x68\xe4\xa6\xd2\xe3\x98\xdf\x63\x3f\x4c\x44\xaf\x67\x23\xea\x94\x84\x8f\xef\x50\xc3\xe9\xa0\xcb\x24\x73\x5d\x76\xd6\x74\x02\x7e\x2e\x5f\xbe\x2d\x4f\xe6\x8e\xf5\x26\xfb\x9b\x3b\x9d\x06\xd5\xbf\xe9\x53\xd3\xdf\xe3\xb9\x4c\xf0\xd7\x23\xeb\xc2\xe9\xa0\xcb\x64\xf1\xe5\x02\x83\x1d\x75\xb9\x8f\x8a\x53\x42\x64\xaa\x92\x44\xb1\x4d\xbf\x5d\xa9\x2c\x2d\xf8\xee\x95\xe4\x87\x32\x47\xb7\x78\x65\x1d\x9f\x86\xc0\xe8\x4e\x2d\x93\x99\xed\xe1\x5e\xe6\x79\x0d\xc3\x55\x33\x5f\x4b\xb6\x84\xdc\xcd\x0c\x36\x02\xc6\x2e\xf6\xfd\x48\xa4\xf9\x1e\x05\xf0\xe8\x1d\x3f\x55\x00\xa7\x83\x8e\xc3\xaf\x47\x65\x2b\x16\x78\x7b\x5d\x20\xf1\x8f\x08\x83\xd2\x31\x2b\xe1\x1f\x19\x87\xe8\x8c\x61\x41\x83\xdd\x79\x39\xf8\x7c\xb1\xfb\xc8\x2d\x0e\xdc\x04\xf0\x57\xd4\x13\x47\x3c\xae\x88\x58\x05\x82\x50\x53\x61\xee\xce\x5d\x80\xff\x3d\x96\xed\x50\x27\xae\x5f\x15\xd3\x34\xcf\xa6\xdf\x62\x88\xec\x31\xea\x09\x46\x07\xed\xd9\x27\xe4\xa2\xb3\x37\x0b\xe7\x7c\xe5\x45\xc4\x78\x6e\xd0\x73\x37\x5b\xfe\xd4\x06\x79\x66\x65\x0f\x4f\xb7\xba\xdc\x00\xbf\x33\x18\xc8\xba\x70\x3a\xa8\x77\x09\xa3\x32\x3d\x6c\x82\x04\xfc\x38\x24\x92\xcf\x4a\xeb\x93\x39\x89\xce\x6e\xdd\xb7\xc3\x25\x27\x04\xca\x6a\xbd\xf1\xb4\xdb\x30\x91\x75\xe1\x74\x50\xef\x30\x83\xf2\x0d\x89\x5c\x25\xd9\x2e\x5b\xbb\xb8\xfb\xbc\x5e\x8e\x93\xb6\xa4\x7c\xac\x5c\x32\xe5\x66\xca\xfe\x48\x81\x79\x1b\xe7\xf8\x21\x76\x38\x1d\x74\x1c\x40\x30\x9f\x2c\xc8\x8f\x67\xef\x28\xc7\xc3\xf5\xb6\x62\x0f\xc9\xd4\x6b\x9b\xa0\x2c\x43\xa7\x03\x6a\x07\x4d\xbe\xc0\x89\x12\x85\x63\xc4\x1a\xcc\x2c\xfa\xd7\x48\xff\x1c\x5b\x94\x6b\x1a\x87\x5a\x96\x20\xe4\x4e\x69\xec\x7d\x39\x57\x26\x8d\x38\x9b\xe7\x4b\xcf\x3d\x42\xbf\x4d\x38\xf7\xbc\x32\x3f\x8e\xf4\x30\x3a\x68\xcf\x19\xf1\x29\xcb\x56\x53\x12\x15\x38\xb7\x4b\xc8\x5f\xcd\xa9\xda\x1a\x56\x30\xcf\x5d\xd3\xeb\x08\xbf\x21\xef\x7d\x6f\x6c\x70\xe3\xf8\x61\x68\x38\x1d\xd4\xbb\xc6\x3e\x74\x30\xf5\x33\x9d\x7d\xeb\xa7\x3b\xd9\x29\xe2\x16\xdb\xc6\x94\x92\xb6\x05\x8d\xa5\xbb\x2f\xf6\x86\x94\x5b\x62\x82\xd2\x8f\xdf\xdf\x84\xd1\x41\xbd\x13\xd7\x95\x0c\xbe\x3a\x1b\xaf\x5c\x5d\xd8\xda\x93\x3d\xb1\xcf\xe0\x71\xfb\x8b\x08\x70\x61\x2b\xf7\x3a\x46\x59\x61\xd6\xcb\x82\x55\x64\x5d\x38\x1d\x74\x1c\x34\x5b\x82\x9c\x1b\xc5\x29\x48\x2b\xcf\xe4\x59\xbd\xaa\xf3\xcf\x93\x8d\xee\x15\x7c\x19\x40\x6e\x21\xff\xda\x34\xea\xf2\xe7\x07\x7c\xc7\xef\xf4\xc2\x2c\x45\x7f\xf3\x2e\x83\x31\x77\x26\x99\x15\x9f\xde\x93\xfa\x86\xf4\xc2\xf5\xe8\x82\xad\x2c\x2f\xfc\x1c\x34\xa0\x37\xc7\x8f\xe3\x68\xf9\x91\xec\xf1\x96\x1a\x4e\x07\xed\x19\xbf\xe4\xd1\x15\x66\x5b\x3a\xb2\x1f\x05\xd6\x37\xf0\xdc\x16\x5d\x78\xd3\x5e\x94\xf4\x9a\x9c\xdd\xfe\xea\x52\x8f\xa7\xe9\xbe\x7f\x7c\xea\x0d\xa7\x3b\xe5\x5d\xa1\x4c\x75\xfe\xc8\xc4\xd1\xf5\x44\x23\x8d\x0d\x67\x8d\x6a\x95\xfa\xad\xaa\x0a\x8d\x85\x6b\xad\x84\xe7\xd7\x88\x0a\xb8\x2a\x8e\xbd\x83\xd1\x41\xbd\xcb\x8e\x24\xa8\x39\x2b\x41\x12\x5e\x7e\x5d\xff\x76\x51\xd6\xc3\x1b\x5d\x12\x6c\x75\x25\x5d\x25\xa6\x07\xc2\xbc\xaf\xab\x27\x63\x19\x90\x75\xe1\x74\xd0\x71\x08\x1a\x6c\x69\x4d\xbf\x40\x9b\x23\xfc\x95\xfa\x66\xa0\xbc\x1d\x6f\xfc\xcb\x2a\x8b\x92\xb2\x67\x6f\xf1\x65\xe4\xc7\xfb\x1d\xb4\xa3\x90\xde\xc1\xad\xe7\x7f\xf3\xae\xea\x25\x7b\x42\xbc\x4f\xd7\xa6\x51\x91\xad\xfb\x47\xb7\xb5\x58\x1f\x8d\xf9\x08\x8d\xf7\x03\x75\xc4\x1a\x2c\xa1\xbd\x69\x8f\x8f\x4f\xa7\xe1\x74\xd0\x9e\xa5\x98\x68\x9d\x79\xf1\x4b\x97\x69\x38\xc6\xb1\x0f\xa6\xf0\x06\xe2\xe4\x95\xe3\x30\xde\x24\x31\xc6\xe1\x2d\x74\x08\xc5\x7f\x51\x41\xd6\x85\xd3\x41\xbd\xb3\x11\xa4\x2f\xd0\xca\x72\xd2\x25\x69\xf2\x79\x31\xce\x1d\x77\xf0\x74\xae\xdb\x71\xfe\x01\x1a\xbf\x8f\xf8\xac\x8a\xad\x9a\x84\x3b\xb2\x2e\x9c\x0e\xea\x1d\x53\xe6\xb6\xe2\xd4\x93\xe6\xf8\x95\x9c\xee\x45\x76\x73\xc6\x8e\xfd\xea\x57\x5d\x6f\x4c\x59\x38\xc1\xa1\x1b\x57\x2e\x05\x6f\xa5\x21\xeb\xc2\xe9\xa0\xe3\x90\xe2\xce\x70\x77\xa1\xdd\x6c\x51\x9f\xb9\xf8\xea\x3b\x09\xf5\x3e\xe5\x2b\x4e\xf8\x07\xef\x69\x0b\xf0\xcf\x76\x86\x49\xa5\x0e\x0c\x22\xbd\x83\xdb\x14\xfd\xcd\xbb\x12\xb2\xf4\x0c\x51\xaf\xf4\x0b\xbf\x77\xd2\x5f\x90\xbf\x26\xc9\xbc\x68\x3b\x61\xcc\xaa\x46\x83\xc3\x18\x7b\xc5\x11\xbd\x79\x26\x03\xd9\x33\x9c\x0e\xda\x33\xd3\xd2\xfd\x9d\xed\xab\xef\xca\xbd\x38\x7e\x1e\xd6\xe6\xab\x06\x1d\xd8\xa6\x15\xba\x34\x66\x45\x34\xdc\x30\x7e\x9f\xf7\x39\xee\xf8\x76\x3e\x9c\x0e\xea\x1d\x4d\x9f\x30\x5d\x88\x92\x07\x75\x64\xc8\xae\x68\x68\x5c\xe5\x35\x11\x9d\xf7\x6f\xc6\xf5\x45\x97\xb3\x2c\x9d\x2f\x93\x7d\x4b\xc4\x46\xd6\x85\xd3\x41\xbd\xd3\x8a\x33\x1e\x7b\x4a\xdf\xa8\xca\x9a\x35\x5b\x55\xa5\xfe\xa1\x22\x26\xda\xe3\x37\xb3\x60\xfb\xf8\xcd\x66\x15\xbb\x60\x4d\xe9\xd2\xe3\x17\x7f\x60\x74\xd0\x71\x30\x04\x62\x2b\x47\x3e\xf8\x92\xe6\xe1\x29\x09\x7b\xce\x98\xf7\x31\xad\x26\x89\xbe\x1a\x42\x1b\x57\x21\x15\x8a\x2a\x4c\x5e\x6d\x44\x46\x7a\xb8\x38\xf8\xf7\x48\xff\xed\x6b\x93\xe3\x19\xb9\xe8\xed\x2b\xef\x85\x24\xd2\xb2\xad\x5f\x95\xd4\x26\x3d\x18\xc1\x7a\x26\x10\xcb\x2d\xfc\x06\x7d\xf5\x4c\xca\xf1\x7b\xe9\x30\xba\xd3\x91\xbe\xfc\x5c\x35\xfb\xda\x9d\x39\xaf\x9b\x08\xd3\xf0\x6a\x32\xf9\xb5\xaa\x5c\xeb\xcb\x3a\xa5\x4f\x74\x2c\x97\x6f\xcb\x52\x27\x13\x57\x21\x2b\xc3\xe9\x4e\x47\xfa\xb2\x94\xd5\x05\xdc\x6e\xd1\x64\xe6\xb0\xcf\x4a\x07\x77\xbf\x3a\x7a\xb7\x0c\xdf\x2c\x48\x58\x62\x42\x0b\x29\x02\x5d\xf4\x23\xf9\x8e\x9f\x2c\x80\xd1\x79\xcb\xe2\x40\x6f\x70\xe0\xb6\xf2\xc9\x0f\x78\xcf\x6c\x1f\xe2\x12\x98\x88\x99\x92\x3e\x2d\x1b\x9e\x6c\xee\xb1\x79\xf0\xb9\x95\x8f\xa3\x86\xfd\x71\xd1\x71\xa4\x87\xfb\xdb\x2f\x27\x23\xbd\x02\xc5\xef\x78\x09\xcb\x9a\x5d\xc6\x2d\xc9\x02\x02\x66\x4b\xa1\x56\xcf\x6b\xc2\x63\xfc\x0b\xbc\xb3\x6a\x06\x5f\xb1\xcb\xfb\xd3\x4e\x9e\x33\xde\x37\x6c\x52\x6b\xfa\x69\xd7\xfc\xac\x64\xe2\x5c\x3e\x85\xae\x81\xc1\x06\x05\x1f\xce\xe0\x70\x3c\xa5\xbf\x0b\x47\x37\xee\xed\xff\x6d\x91\x1e\xee\xd2\x4e\xbe\x4b\x0f\x8d\xf4\x6a\x29\x96\x14\x8f\x25\x1c\x4a\x44\x39\xdd\x89\xe3\x37\xe9\x78\x23\x9b\x97\xc0\xc0\xaa\xe8\x64\x9b\x6b\xb7\x0e\x78\xf8\xca\x4a\xff\x45\xa4\x47\x53\x81\xc6\xbe\xbc\x54\xe2\xfe\x1d\x4c\xb9\x40\x1b\xff\xe1\x83\xb6\xc0\xab\xb3\xf3\x5b\x45\xcc\x34\xc1\xea\xd7\x83\x0f\x70\x87\xb7\x99\xcb\x55\xff\xc9\x01\xf2\xe9\x48\x3f\x4f\xc7\xe9\x1f\x9c\xc5\x89\x31\xbe\xdd\x45\x7f\xa8\x45\x53\x3d\xc0\x41\xd2\x9d\xf1\xa0\x6e\xdd\xf8\x63\x56\x55\xb7\xaf\xd3\x3f\x39\xb7\x46\xd3\x3a\xf5\xb1\x74\x6c\x39\x8f\xc8\x43\x22\x18\x76\xda\xea\x45\xfb\x79\x0f\x47\x27\xf3\xf2\x12\x76\xcb\x73\x63\xea\xde\x8b\xc6\x74\xb8\x34\xfd\xf8\x27\x57\x7b\x3a\xd2\x3b\xe8\xbf\x1e\xd4\xce\x4a\xc1\x1c\x09\x9e\xa9\xf9\xb9\xf3\xa2\x2c\x73\x54\x9f\xff\x42\xa6\xed\x32\x83\x95\xa6\x53\x60\xc1\x80\xc0\x3f\xb9\xda\xa7\xa7\x3e\x76\x25\x2a\xc7\x61\x8a\x91\x99\x27\xee\x56\x71\x6a\xa8\x9d\x70\x8b\xaa\x5d\x79\x75\x92\x31\xa3\xcd\x03\xec\xb6\x3e\x0c\x6c\x1e\x8e\x7f\x16\xe9\xe1\xbe\xba\x7f\x5b\x26\xa3\x52\xa6\x79\xdc\xb2\xde\x66\x57\x6a\x7c\x1c\x15\x74\x20\xe1\xde\x5d\xc3\x55\x7f\x7a\x38\x25\x0b\xd8\xbd\x18\x91\x2a\x10\xe6\x41\x2e\x0f\x70\x3a\xe8\xf2\x60\xc2\x46\xe1\xeb\xdf\x3c\x7f\xe1\x42\xca\xed\x2a\x8a\xb4\x90\xc0\xbb\xae\x57\x2a\x2f\x35\xf9\x90\x4f\xbd\x7a\x35\x81\xf6\x86\xf0\x98\x4c\x0f\xa7\x3b\xf5\x7e\x5a\x5e\x3f\xb7\x89\x86\xe2\xef\xe4\xad\xf6\xeb\xac\xd7\x55\x3f\x89\x0e\x15\xba\xb9\x98\x24\x7c\x7e\x48\x2a\x38\xb7\x60\x3f\x3c\x70\xfc\x7e\x1a\x8c\x0e\xba\x4c\x52\x19\x2b\xa5\xba\x71\xcc\x0c\x22\x44\xcc\xb8\x5a\x0b\x7f\xc6\x1f\x62\xd9\xe8\xc9\x76\xf1\x9f\x4f\x29\x28\x12\x4a\x11\xf0\x91\x46\xd6\x85\xd3\x79\x4b\xa3\xe1\x9c\xac\xeb\xb2\xeb\x8e\xbe\x66\x15\x4f\xe3\x89\xe1\xce\xf9\x0e\xbd\x59\x37\xca\x2f\x7c\x52\x76\x07\xd3\x70\xa7\xe8\xf3\x70\x60\xc7\xc8\x02\x72\x8b\x03\x37\x01\xfc\xcd\xbb\xa7\x59\x4f\xc8\x1f\x21\xe2\xa8\xc8\xf3\xd9\xfd\xee\x99\x90\xcf\xbd\xf6\x89\x20\xa3\x34\x7a\x72\x4b\xf6\x39\xfa\xbb\x9c\xda\xd1\xe3\x77\x64\xe1\x74\x50\xef\x76\x0c\x29\xd3\x6f\x05\xae\x05\x85\xdc\xf6\x13\x02\xef\xd3\x80\xb1\x61\xb1\x85\x22\xb9\x32\xdb\xb3\xa5\x7b\x56\xf9\xb2\x1f\x96\x8f\x79\x05\x30\x3a\xa8\x77\xcd\x4d\xb2\x52\xe7\x9b\xdb\x8f\xe6\xbe\x37\xfb\xf9\x96\xcb\x52\xfb\xf3\x90\xf5\x08\xb1\xee\xb9\x81\x13\x62\xcc\x0d\x61\x8b\xc7\x27\x64\x70\x3a\xa8\x77\x01\x83\x82\x8a\xda\x8e\x91\x87\x3f\x14\xd6\x46\x83\xf5\xf4\x92\xad\xa3\xde\x4b\x47\x5f\x13\x1b\xc7\x2f\x53\x9c\x7e\xd8\xc3\xeb\x8f\xac\x0b\xa7\x83\x7a\xc7\xd7\xe9\x24\xce\x38\xf6\x83\x31\xd9\xa7\x0d\xed\x9a\xac\xe5\x46\x15\xad\x65\x97\xf2\xa1\xc9\x6b\x03\xb5\x2b\xc2\xce\xba\x8c\x55\x48\xef\xe0\x66\xd1\xbf\x79\xa7\xc2\xf7\x61\x51\x2d\x64\xbd\x59\x9e\xeb\x2a\xe5\x28\x93\x9b\x7c\x8d\x6c\x5a\x98\x4d\x49\x19\x4f\x49\x75\x58\xe1\x8d\x75\x83\xe3\x87\x48\xe1\x74\x50\xef\x06\xa6\x64\xad\x54\x59\x8b\x2c\x15\x8e\x3e\xa5\xe6\x18\x9c\x95\xb6\x48\x5e\x78\xf4\xff\x30\xf7\x97\x51\x55\x44\xed\xff\x3f\x8e\x74\x4b\x48\x09\x52\x82\x74\x48\x37\x48\x48\x29\xdd\x21\x21\x29\xa0\x80\xa0\x74\x97\x80\x20\x9d\xd2\x20\xdd\x5d\xd2\x20\x48\x2a\x2d\x20\x21\x0d\x2a\x5d\xe2\x7f\x7d\xfe\x6b\x9d\xf9\x7a\xcf\xe1\xb7\xe6\x7e\xc0\x83\xfb\xf9\x6b\x5d\x67\x66\xbf\xcf\xcc\xb5\xdf\xb3\xf7\x75\x6d\xe4\x8f\x3e\xce\x4f\x6f\x15\xdc\xe2\x94\x52\x01\x2c\x3d\x14\x07\xd6\x6e\xbc\x6c\x5d\x95\x40\xa3\xa6\xd0\xbd\x8d\xc2\x36\x3d\x03\x39\x8d\xa5\xeb\x01\xbe\xdc\xcb\x95\xd3\xf7\xb3\x62\x58\x53\x95\x1a\xc0\x6a\x21\x14\x07\x57\xf0\x42\x47\x8b\x54\x7b\xbf\x61\x53\xa9\x39\xaa\xfa\x5e\x27\x4b\x21\x99\x05\x6d\x29\xb9\x91\xfe\x3b\x87\x9e\x85\xc5\xc2\x96\x46\xc0\x16\x42\x71\x60\xed\x98\x1d\x96\x95\x52\x73\x66\xff\x36\x70\xe4\xfd\xb5\x40\x9d\xf7\x56\xff\xc8\xe7\x84\x87\x93\x5f\x4f\x66\xb1\x9a\x5b\xac\xb2\x5d\x05\xd3\x0e\x2a\x15\x5d\xa5\x1d\xd5\xdd\x95\xce\xfc\x57\xfc\x5d\x4f\x91\x8a\x6e\x72\x4b\x3d\x7f\xd4\xed\xc5\xd3\x20\x38\x46\x54\x8f\x18\x38\x81\xbf\xec\xf8\x1d\x28\x78\x81\xe2\xc0\xda\x69\xfc\x44\x75\xfd\x2d\xc2\xc4\xcd\x3d\x92\x57\x1e\x45\xd3\xed\x9c\x90\x55\x84\xd6\x7b\x20\x1c\xa9\xa3\x3e\x74\x7b\x19\x75\xf5\x13\x30\x55\x87\xe0\xe0\x6a\xe9\x07\x17\xa5\xb7\xe5\x8f\xaa\xfc\x68\x02\x97\x68\x43\x47\xd6\xf2\x9b\x68\xf1\x26\x7e\xba\x8c\xad\xca\xbc\x8f\x16\xb2\xc5\x22\x05\xea\xbc\x21\x38\xb0\x76\x27\xb2\x33\x5f\x75\x53\x85\xa7\xad\xde\x78\x6f\x4e\x8a\xfd\x25\xbd\x28\x2e\xd7\xc9\x19\x29\xa9\x25\x6e\x62\x55\x58\x99\x7c\xff\x0d\x78\x4f\x40\x70\x60\xed\x14\xd8\x7b\xee\x39\x8e\xb0\xe6\xd1\x57\x2d\x74\x1e\xcc\x3e\xf6\x98\xf9\x95\xd7\xfa\xa5\x28\x02\xed\xe9\x81\xdd\x97\xa1\xca\x13\x5a\x98\x76\x50\xf9\xfc\x2a\xed\xb8\x5f\x73\xa8\x3a\x51\x71\xa7\x9e\xdb\x9d\xa8\x55\x67\x12\x5b\x8a\x04\xf3\xd0\x7b\x92\x2b\xb2\xad\xc8\xfa\xe9\xd9\x6e\x6a\x54\x00\x9b\x96\x21\x38\xb0\x76\x36\x3a\x1b\x68\x7b\xa7\x6a\xb5\x31\x5f\xf4\x22\x67\x25\x08\x2c\x2e\x11\x24\x1e\x4a\xde\xf7\x62\x5a\xba\x53\xfb\x62\xe1\x4e\x91\x0d\x2c\x2e\x14\x07\xd6\xee\x06\xca\xf6\x41\xa0\x16\x33\xf3\xa3\x43\xaa\x66\x8d\xa5\xc6\x62\x93\xa1\x4b\x8a\x84\x04\xfb\x11\x0e\x6c\x3a\xa1\x37\xd4\xfc\xc0\x4e\x08\x28\x0e\xac\x5d\x34\xe6\x90\xae\xda\x13\xc9\x49\x2c\x9e\x24\x64\xc1\x73\xb3\xca\x45\x06\xae\x83\xd9\x6f\x75\x62\x5e\x2a\x44\xc3\x75\xb8\xdd\xc0\xa9\x26\x50\x1c\x58\xbb\x53\x92\x75\xac\xc3\x83\xd3\x38\xd6\xc2\x23\x8b\x50\x7b\xc3\xb0\xb2\x86\xe6\x45\x6a\x37\xc3\x89\x54\x41\x77\xbe\x08\x26\x9b\x49\x98\x76\x50\x93\xa2\xab\xb4\x93\x52\xdd\x2b\x20\xdc\xb8\xd8\x62\x59\x90\xd3\x78\xc1\xb8\x73\xeb\x65\x52\x4f\x9f\x65\xb4\xfa\xe0\x6f\x8c\x51\x86\x11\xa5\x26\xa0\x67\x0a\x14\x07\xd7\x52\x74\xf6\x8c\x66\x96\xc1\x64\xcb\xf2\x2c\x26\x8b\x7f\xc6\xe3\x82\xd0\x6a\xb9\xb0\x82\x93\x82\x37\x96\x42\x5f\xa5\x08\x7d\x1f\x38\x69\x02\x8a\x03\x6b\x87\x6e\x5a\x4b\x98\x9e\x37\x8d\xca\x2d\x1a\x2a\x72\xcf\xe3\xe2\xe5\xb0\x54\x97\x44\xfa\xf4\xbd\xe3\xad\xc7\x01\xd5\xb1\xd1\x7b\x40\xcd\x3b\x14\x07\xd6\x8e\x60\x3d\xc9\xc6\x91\xaa\x7e\xf3\x41\xe5\x52\xa5\x1b\xfa\x48\x51\x37\xa6\x16\x27\x4a\xf6\x43\xcd\x6f\x2e\x95\xb4\x55\xdf\x8f\x81\x22\x0f\x28\x0e\xac\xdd\x9b\x39\x91\xa9\x80\x32\x3e\x25\x2a\x4b\x4f\xf5\x2d\x87\x96\xe3\x19\x07\xc3\x3f\xed\xe5\xe8\x1e\x99\xca\xb9\x5a\x83\xaa\x45\x74\x30\x4b\x0f\x65\x07\xaf\xb6\xf4\x8d\x82\x2d\xcf\xd3\x9f\xfe\x3a\x4d\xf8\x29\xe2\x80\x6c\xc4\x9e\xf1\xf0\x6d\xf1\xa9\x76\xe2\x61\xd5\x2f\x0f\xd1\x55\xda\x4c\xfc\x34\x98\x3d\x86\xe2\xe0\x2d\xfd\xef\x52\x9f\xf6\x1c\x87\x4c\x44\x6f\x7a\xb5\x1f\x19\x98\x9b\x35\x14\x77\x2d\x37\x6f\x2a\xe0\x94\xd3\x46\xbd\xed\x21\xbb\x1f\x6d\x0c\x8b\x0c\xc5\xc1\x5b\xfa\xe4\x1b\x34\xde\x41\x1b\x59\x9f\x63\xdc\xb3\x3e\x30\xd2\x7f\x26\x0d\xbe\x4d\x7a\xfb\x4c\x18\xc5\x04\x65\x78\xf5\xb1\x67\xb9\x0a\x03\x2c\x32\x14\xe7\x2f\x4d\x0d\x1a\x8d\x43\xa5\x6c\x7e\x27\xd5\xe1\x61\x9d\x71\xa9\x33\xc4\x3f\xb6\xaf\x91\xac\xe7\xec\x86\x5c\xb6\x7a\xdf\xbe\x98\xec\xb0\x3f\x9b\x93\x04\x2c\x3d\xd4\x19\xad\xff\x5a\x7a\x52\xfd\x07\x54\xef\x77\xa8\x5e\x65\x76\x89\x86\xd6\x13\xa3\x74\xd5\x68\xd7\x64\x20\x97\xa9\x32\x38\xdf\x27\x7f\x28\x36\x57\xf4\x6f\xd7\xae\xc1\x82\x06\xde\x38\x7d\x9b\xb7\xfa\x3d\x8e\xc8\x18\x35\x75\xc6\x6a\x1f\xad\x6b\x74\x3a\x23\x06\x51\xda\x4b\x7b\x92\x0d\x0e\x8b\xfe\xd7\x2c\x3d\xd4\xad\xfd\x5b\x4b\x0f\xb6\xf4\x3b\x15\x71\xca\x96\xc6\x8b\x7c\xee\xe7\x51\x85\x66\x15\x0f\x92\xab\x91\xa3\x05\x9e\x39\x7d\xc4\xee\xa7\x3b\x4e\x6f\xff\x51\xc0\x7f\x1d\x96\x5e\x02\xce\xd2\x2f\x3d\xd7\x7f\xb6\x5e\xcb\x1a\x93\xe0\xb5\xcf\x15\xca\x45\x71\xe6\xd0\xb4\xd6\x7f\xcc\x97\x5f\x8c\xaa\x79\x6c\xfc\x1b\x87\xff\x3a\x7e\x55\xba\x0d\xde\xd2\xff\x6e\xda\x51\xca\xb9\x29\x40\xe9\xd4\x85\xbb\x7b\x24\xf1\x4b\x77\x92\xed\x76\x4f\x79\xb0\xec\xba\x56\xfa\xb3\xbc\x54\x8d\x2d\x8a\x6b\x59\x2e\x87\xb7\xf4\xb8\x5b\x45\x6d\xb6\xe6\x0e\x35\xb6\x36\xc9\x3f\xa7\x2b\xfb\x94\xa2\x05\x03\xa2\xd0\x79\xe4\x14\xaa\xcd\x3a\x97\x39\xe4\xdb\x6e\x5f\xcb\xdd\xc2\x5b\xfa\xed\x4f\x3d\x86\xe6\x0e\x95\x86\x65\x73\x3f\x4b\xbd\x7e\x3f\x91\xe6\x55\x71\x6b\x18\x4a\xf7\x1b\xe8\xfa\xd2\xd8\x79\x26\x6b\xbc\x76\x2d\x77\x0b\x6f\xe9\x23\x9a\xcf\x58\x6f\x52\xab\xcf\x74\x5a\x3c\xc3\xe4\x0c\x62\x56\x8a\xd4\x75\x36\xd8\xfe\xba\xd9\x11\x6e\xec\xb0\x9e\x13\xf5\xfb\x1a\xfa\xfb\xeb\xff\x77\x7f\xdd\xab\xd2\x64\x29\x4f\x32\x8e\xe6\x5f\xb5\xf9\xb4\x56\x2d\x74\x94\xfa\xe3\x94\xc7\xf7\xe7\x17\x25\x09\x7c\x27\x1b\x87\x8d\x79\xed\xdf\xe7\xb1\xc2\xd2\x03\x14\x07\x4e\x93\x0d\x2c\x99\xe8\xa4\xc5\xf1\x04\x98\xb2\x9c\x03\xe3\x95\x99\xec\x19\x3f\xf1\x4a\x5a\xca\xd7\x9e\xb8\x76\xf0\x45\xdc\xba\x29\x2b\x02\x8b\x0b\xc5\x81\xd3\x64\x0e\xb5\x4c\x14\xe6\x03\x96\xa4\xd2\x9c\x1d\xb6\xfc\x67\xea\x03\xf9\xfa\xef\x49\x19\x0c\xd0\xee\xf6\xac\x29\x7c\xe8\xeb\xd7\x06\xa6\x64\x50\x1c\x5c\x4d\xaf\x77\x63\xe1\xb0\xd8\xc4\x97\x5e\xf3\x55\x92\xbd\xf6\xe8\xc5\x0c\xae\xc9\x32\xb2\xb4\x30\x83\xd2\xe9\xce\xcf\xbb\xf1\x43\x87\x40\x4d\x2f\x04\xe7\x2f\x89\xe0\xf3\x6f\x5c\xe5\xa8\xe2\x28\x97\x03\x5a\xc2\x8c\xfc\xd2\x9c\x0a\xea\xef\x9e\xf6\x6e\xab\xa1\xb1\xca\x5e\xfc\x17\x8f\x29\x5a\xa2\xe5\xc3\x0c\x61\x53\x1c\xa8\x17\xc0\x55\xda\x89\x20\x05\xb8\x09\x9b\xbf\xf9\x6e\x94\x1b\x3b\x59\xd8\x2c\xfb\xb6\x87\x85\xc9\x01\x81\xc2\x2f\x3f\x5c\x22\xf4\x69\x7d\xe1\xf4\x20\xd0\x16\x0e\x82\x03\x6b\x67\x65\x23\x4d\x64\x42\x87\xf9\xe9\xe2\x2e\xc9\xea\x60\xbf\xb2\x83\xac\x55\x63\x73\xda\x07\x12\x74\x4e\x72\x9d\x72\x26\xd2\x67\x2f\x60\x71\xa1\x38\xb0\x76\x77\x74\x3b\x6e\x78\x11\x8f\xbb\x06\x50\x85\xde\x7e\xad\xa0\x8f\x4a\xb3\x93\x3a\x24\x9d\x4b\xe5\xaa\xe5\x44\x5d\xf5\x5d\xbb\xf2\x27\xf0\xd9\x04\x82\x03\x6b\xb7\xa3\x9f\xc8\xf6\xbb\x5f\x8f\x59\x6e\x31\x61\x7a\xd9\x28\xf8\x2c\x19\x4d\x3f\x64\xa9\xe0\xc8\x52\xa0\xe0\xb8\x3d\x42\xca\xad\x1b\x16\x17\x8a\x03\x6b\xf7\xb6\xb1\x30\xaf\x6a\xed\xb9\xcf\x2a\x1f\xe6\x8b\xa9\x1d\x26\xa3\xc7\xe5\x9a\xdb\xa8\xd1\x0e\xc8\x5c\x9f\x6a\x98\x09\xd6\xaa\x0c\x60\xda\x41\xbd\x45\xaf\xd2\x6e\x05\x19\x6f\xab\xa2\x16\x79\x4c\xc8\x9a\x8f\x8e\x94\x58\xb9\x31\xe0\xc9\x8f\x26\x3a\x6a\xd7\x23\x29\xdf\xb8\xde\xfb\x18\xbd\xc0\x66\x68\x28\x0e\xac\x9d\xf2\xaf\xd6\xb7\xba\x04\x97\x4d\xfe\x5f\xbb\x76\x19\x7e\xaa\x50\x27\x14\x6f\x1d\x3d\x64\xe1\x1e\x40\x73\xad\xa7\xea\x1b\xfa\xe5\x0a\x8b\x0b\xc5\x81\xb5\x73\x1e\xd7\x7d\xed\xe8\x3f\x39\x10\xf2\xb9\xde\xfd\x48\x39\xad\x17\x6d\x05\x33\xf6\x88\x1f\x8d\xbc\xc6\xf5\x35\x86\x67\x71\x07\x09\x2c\x2e\x14\x07\xd6\x0e\xdf\xa3\xa2\xfc\xdb\x7c\xb0\x18\xb7\xd7\x5d\x67\x2a\x9b\xc8\xf9\xc5\x23\xf9\x85\xb0\x45\xd2\xa1\xe4\x85\x06\x62\x85\xe3\x7c\xa0\x87\x05\x14\x07\xd6\xce\xfa\x2f\x3f\x46\x8a\x2e\x3f\x57\x3b\x1b\x87\xdf\xc6\x6c\xfa\xdd\x37\x71\x99\xf3\x46\x9e\xef\x99\x07\x78\x6f\x90\xdc\x44\x1a\x7e\x0c\x14\x4d\x40\xa4\xa2\xab\xb4\x9b\x46\xf9\x6d\xdc\xac\x22\x26\xff\xb3\x97\xbb\x18\x71\x6a\x0b\xa5\x83\xe7\xd8\xa8\xe3\xfd\x97\x40\xd7\x1b\x0e\xfd\x01\x5e\x25\x31\xb0\x6b\x86\xe2\xc0\xda\x3d\x97\x3f\xbd\xd4\x1a\x40\x90\x7c\xb5\xdf\x22\x8c\xd1\x78\x53\xff\x4e\xce\x6d\xcb\x65\x99\x8a\x3a\xf7\xef\xec\x4e\x6a\x9d\x35\x0d\xb0\xb8\x50\x1c\xdc\x49\x13\x6e\xdc\xed\x4a\x27\xa5\xe1\xab\x4c\x38\xb8\xfd\xf1\x82\xb4\x38\x53\x4d\xf2\x0e\x7a\xc3\x7e\xe5\xc1\x37\x95\x7d\x13\xff\xf4\x00\x56\x08\x82\x83\x5b\x2d\x7c\x6e\x48\x8f\x7c\xe8\x5b\xaf\x5e\x38\x3b\xe8\xb3\x23\x6d\x9e\x94\x88\x43\x95\xd1\x4a\x7a\x3f\xdb\x46\x82\xff\xb7\x41\x34\xd0\xfe\x0b\x8a\x03\x6b\x57\xef\x9c\xed\x69\x77\xe1\xb0\xb8\x87\xc7\x1d\xf5\x36\x4d\x29\x9e\x1c\x4b\x69\x70\xd5\x75\x7b\x76\x5c\xff\x65\x71\x3f\xcf\x7b\x36\xa0\x2d\x25\x44\x3e\xbf\x4a\xbb\xa4\x3e\xc6\xf2\x85\xb0\x57\x19\x5a\x32\xc6\xf1\x7c\xa6\x32\xb5\xe7\x6b\xc8\xf5\xc5\x81\x68\x7b\x6b\xdd\x1f\xcc\xdf\xb6\xd0\x02\xef\x20\x28\x0e\xac\x1d\x7a\x6f\xf2\x26\x43\xad\x21\xd7\xfe\xba\x90\x37\xf6\x50\xeb\x99\x19\xeb\xa5\xaa\x93\xb0\xa0\xe7\x87\x5f\x73\xfb\xe7\xad\x78\xce\x80\x7d\x83\xe0\xc0\xda\xf1\x66\xdf\x4a\x60\x39\xcb\x8f\x9e\xfb\x2e\x9c\x25\x4d\x22\xbb\x4c\x4d\xc2\xf7\x16\x5d\x55\xaa\xee\xee\x88\x5d\xc3\xf4\x9b\xdc\x05\x60\x27\x16\x04\x07\xd6\xee\xdd\xf6\xe4\x8f\xbb\x99\x27\x34\x5b\xb6\x33\x03\x17\x24\xfc\x8e\x17\x52\x46\xf7\xe4\x4c\xff\x14\x5a\x3b\xad\x18\x94\xcd\xcd\x02\x45\x5b\x50\x1c\x58\xbb\xb6\x8a\x2f\x34\x98\x41\xb8\x66\xd2\x62\xf3\xbe\x2c\xbc\x08\x89\xd3\x38\xe9\x21\x86\xa9\xad\x6e\xc7\x4d\xc7\xbb\xbe\xeb\xcb\x1f\x61\xda\x41\x4d\x8a\xae\xd2\xce\xa4\x22\xaf\x97\x57\xdb\xdd\x31\xc5\x53\xcf\xed\x35\x93\x78\x8c\x74\x19\xf3\xcd\xc0\x39\x25\x54\x61\xfd\x5f\x97\x49\x28\x01\x19\xb0\x6b\x86\xe2\xc0\xda\x71\xa2\x79\xfe\x29\x14\x23\x65\x40\x1f\x7b\xac\x49\x1f\xc0\x9d\xc8\x2c\x4e\xec\xe4\xf6\xdd\x6b\xdf\xb9\x34\x36\x98\xc2\xf2\x19\xd0\xee\x12\x8a\x03\x6b\x37\xfb\xf2\xf3\x06\x9d\xdc\xd8\x21\xd9\x2c\x1a\x4d\x60\x6d\xe5\x5b\x21\xcc\x4e\x12\x9d\x60\x7e\xb9\x67\x69\x99\x3b\xc1\x3b\x73\x65\xb0\xb8\x50\x1c\x58\xbb\x86\x69\xb9\xf9\x17\x8b\xc6\xa9\x14\x38\xf7\x8f\x97\xd2\x7c\x73\xe3\x8d\x85\x45\xde\x7e\x88\x16\xb2\x58\xb5\x1f\x6d\x9f\x7c\x0a\x7c\x1a\x87\xe2\xc0\xda\xc5\x15\x89\xe6\x7c\x69\xa5\xf3\x4e\x2d\x24\xd9\x4e\x97\x58\x75\x16\xb2\x10\xc1\x42\xab\x11\x78\x60\x77\x3e\x2d\x2e\xf0\x34\xe5\x2b\xcc\xd2\x43\xd9\xc1\xab\x2d\xfd\x37\xfc\x19\xb3\x93\xf1\x56\xb2\xf0\xf7\x0e\x11\x9d\x1b\x64\xb6\x6c\x75\x8f\xaa\xec\xb6\xa5\x4b\xc6\x25\xda\xcc\xe8\x75\x71\xee\xc2\xec\x31\x14\x07\x6f\xe9\x17\x28\x25\x4d\xce\x0f\xcb\x25\x6a\x38\x48\x42\x33\x8b\x14\x92\x8a\x9a\xec\x9e\xab\x31\x98\x65\x28\x7f\xe1\x2b\x8b\xfe\x30\x1c\x09\x34\xde\x83\xe0\xe0\x2d\x7d\x63\xab\x7e\xea\x17\xee\x59\x3b\x9c\xd1\x35\x8d\x90\x02\xb1\x40\xd5\x51\xf5\x0d\x7e\x91\x3d\x87\x71\xba\x9b\xe1\xd4\x45\xa5\x40\x4b\x3f\x28\xce\x5f\xda\x07\x34\x1a\xfa\x9a\xae\x74\xa1\x79\x17\x7b\x17\x7a\x69\x0d\x9d\x75\x6f\x73\x69\xf5\xa4\x53\x3c\xce\x13\x95\xe4\xb2\x9e\x1f\x0f\xcf\xb5\xe2\x00\x96\xde\x8b\x24\x3a\xc9\xea\xc1\x02\xf9\x1e\x85\x57\xdd\x81\xab\x4d\x6c\x4b\x77\xad\x26\xf9\x8c\x3a\xd1\x10\x9d\x3f\x03\xbf\xf2\xc6\xdd\x7f\x2d\xfd\x4d\xce\x72\x46\xc7\x27\x8c\x94\x7b\x84\xfe\x73\xf7\x84\xb8\x09\xf8\xff\x7a\x73\x0d\xca\x54\x6b\xb5\x08\xe0\x3e\xd9\x20\x75\x5e\xf9\x07\x55\xdb\x1a\x63\x59\xef\xc8\x9c\x55\xab\x6a\x55\xe8\xfa\xf0\x88\x5f\x51\x3f\x19\x51\x40\x46\x98\xa5\x1e\xef\x1c\x63\x63\xa7\xc4\xf3\x7f\xc5\xd2\x1f\xa3\xfc\x77\xb7\xf6\xff\x2c\xbd\x14\x82\x24\xd8\x81\x61\x1f\xc9\xb3\xbe\x5b\xcc\x1f\xa0\x66\x75\x18\xc0\xb4\x22\xa5\xd7\x78\x88\x7d\x88\xfa\x96\x7c\xb4\x09\x8d\x92\x45\x66\x04\x3f\xeb\x3a\x3c\xbd\x0f\x9c\xa7\xbf\xcb\x62\x2c\xb3\x13\xc2\xd0\x24\x3a\x96\x56\x83\xca\xe4\x5a\x40\x44\x8e\xf4\x96\xf7\xd7\xc8\xa1\x89\x7b\xbd\x62\xc4\x64\xbf\xde\xb5\xac\x20\x0b\xc2\xd9\xcd\x85\xa0\x3d\x37\xaa\x46\x79\x5f\x01\x04\x2c\x7d\xf3\xdf\x64\x88\x34\x0f\x47\x5d\x56\xcf\x48\xf8\x28\x4c\xf2\x8a\x13\xe2\x4b\x8d\xae\x65\xbd\x1c\xde\xd3\xdb\xcf\x34\xa1\xbc\xf3\xbb\xcb\x22\x9d\xf9\x49\x16\xbd\xbe\x19\x89\x85\x3d\xde\x96\x5a\xe8\x6e\x30\x72\x88\xa9\xde\xcc\xa0\x86\xcc\xb5\xdc\xad\x3d\xdc\xcf\x6a\x06\x86\x1a\x45\xfb\x74\xa5\xa2\xd6\x89\x32\x4e\x48\x87\x47\x37\x92\x1b\x16\x3f\x75\x19\x8d\x25\x8f\x46\xd0\xb6\xd0\x4f\xa6\xbe\x96\xbb\x85\xf7\xf4\x81\x98\xf5\x37\xd3\xbe\x96\xfc\xa5\x3c\xeb\x54\x76\x9d\x5d\x16\xbb\xe5\xff\x42\xaa\x75\xd3\x7c\x4e\x14\x8d\xbf\x79\x20\xd4\x7a\xee\xda\x3c\x3d\xd4\x5f\xf7\xaa\x3c\xb9\x34\xc8\xc5\xc1\x8c\x83\x5a\xf3\xca\x7c\x71\x79\x54\xc1\xf7\xce\x40\x3d\x97\x42\x60\x66\x3d\xd1\xbb\x9b\x7c\xac\x9a\xa9\x38\x1b\xb0\xfc\x00\xc5\x81\xf3\xe4\x9f\x60\x3b\x6d\xae\x42\x57\xfc\xc5\x82\x3f\x5b\x7b\x23\xd4\xb2\x17\x09\x8e\xb9\x86\x05\x77\xb3\x14\xa2\x30\x22\x1c\x46\x08\xfb\x61\x71\xa1\x38\x70\x9e\x0c\xec\x17\x6b\x43\x25\xb0\xb6\xe5\x13\x7f\x2e\x1a\x6c\x22\x8b\xa6\x2f\x10\xe3\xaa\x8b\xd4\x36\x9c\xdf\xb7\xf7\x50\xe6\x84\x1d\x68\xa5\x0f\xc5\xf9\x4b\x22\x20\xfe\xc7\x72\xfa\x7e\x94\x76\x7c\x77\xd2\xab\x27\xd9\x17\x6d\x36\x0f\x4f\xb7\x1e\x9e\xd3\x79\x36\x78\x76\xe9\xf5\x32\x94\xb7\x6b\x10\x3f\x07\x0e\xe8\x87\xe2\xfc\x25\x91\xff\xb3\x2d\x3d\xc1\x2a\xea\xbc\xd1\xc2\x77\x95\x17\x6c\x0f\x5e\x8e\x0b\xe5\x65\xe8\x1a\x37\xde\xc8\x15\x2d\x54\x0a\x8d\x21\xb4\x3e\xc5\x74\x82\xcd\x71\xa0\x5e\x00\x57\x69\xa7\x18\xa2\xc1\x27\x71\x3f\x31\x44\xa8\xe8\x28\x0b\xf5\xe5\xe8\x1a\x8f\x54\x9e\x65\xbd\x4a\x86\xc3\xaa\x0d\xab\x01\x51\x6d\x3d\xb0\x8b\x14\x8a\x03\x6b\xf7\x7e\x66\xc0\x98\xba\x80\x03\x2b\xbe\x41\x74\x56\xed\x81\x29\x9b\xc7\xda\x94\x5c\x76\x38\xb7\xf0\x21\x6b\xd8\xbb\x00\xd4\xdc\x97\xb0\xb8\x50\x1c\x5c\x6f\x43\x5c\x37\xec\xb1\xa8\x7b\xdf\xc4\x1f\x9e\x1c\xdf\x9b\xe6\x55\x73\xc7\xf8\x5b\x1f\xae\xd4\x40\x42\xbb\xf8\xd1\x79\x91\x5a\x0a\x28\x7a\x87\xe2\xc0\xda\xf1\x4b\x89\x11\x5b\xfa\x96\x68\x0b\x11\xd0\x8b\x06\xec\x7f\xb1\xe6\xab\x71\xab\x15\x48\x1b\xb0\x56\xad\xdb\xf4\xd0\x18\x1b\x06\x0a\xb2\xa1\x38\xb0\x76\x47\x38\x2c\x7a\x01\x9c\x63\x4f\x34\x5e\x4a\xf0\xcf\xa8\xd8\xc5\x2e\x4d\xa3\x5f\xfa\xd3\xe8\xa2\xbe\xee\x68\x8a\x10\x7c\xfa\xe4\x37\x4c\x3b\xa8\xb7\xe8\x55\xda\x51\xe7\xef\x27\xa9\x3c\x90\x94\x08\x1b\x93\x0f\x0c\x75\xfa\x42\xd9\x48\xd7\xd7\x69\xb4\xbf\x60\x93\x66\xfe\x9e\x6f\x12\x35\x17\xa8\x42\x80\xe2\xc0\xda\x6d\x58\xdb\x3c\x72\xc7\x6c\x3c\x32\x30\x0e\xf7\x76\xeb\x7f\xa4\xdd\x99\xe5\xdb\x27\x24\xe1\x10\x8b\x96\x51\xc1\xf0\x5e\x71\x09\x38\x4d\x0b\x8a\x03\x6b\x67\xd3\x80\x37\xa1\xbb\x4f\x16\x36\x29\xa4\x2a\x8f\xdd\x1c\xa7\x9b\x13\xed\xac\xf3\x44\x8b\xc6\x9e\x78\xf0\x5d\xcc\x8d\xe6\xcb\x73\x60\x19\x12\x82\x03\x6b\xf7\x53\x50\xd5\xf5\xe5\xbb\xaf\xb3\x17\xbd\xe5\xcf\xfa\x4b\x0d\xbd\xdf\xd4\xe2\x44\x72\xce\x7f\x23\x15\x4c\x73\xa9\x94\x17\xe2\x0b\x80\xc5\x85\xe2\xc0\xda\x0d\xf6\x97\x60\xd1\x0e\x6d\x92\x2c\x1c\x9d\xdf\xb8\x5c\xd0\xe4\xfb\x2d\x91\x67\xe0\x4c\xef\xbf\x46\x45\xad\xe5\x32\x5e\x27\x45\x0a\xd3\x0e\x2a\x15\x5d\xa5\x9d\x64\x45\x4c\xb1\x53\x96\xa7\xeb\x54\x3a\xed\xc7\x4c\x8a\xf2\xfb\xfd\xf4\xa4\x11\xe8\x51\x7c\xd4\x8b\xb1\xf2\xcc\x26\xfa\xf8\x2a\x40\x63\x01\x08\x0e\xac\xdd\x79\x75\xfe\xb8\x5d\xbc\x53\x64\xec\xea\xad\x9b\x44\xfb\x4d\xd4\x64\x7f\x22\xac\x5f\x34\x92\x4d\x3f\xc8\xd2\xb4\x53\x9d\x24\x03\x4e\x8f\x84\xe2\xc0\xda\x05\x64\x61\xa8\xfb\xa9\x89\xdb\x99\xa8\x1f\xd8\x19\x78\x17\xca\x11\xed\x17\x27\x35\xe1\xd8\x38\x4b\xbc\xf0\xed\x31\x90\x73\x30\x03\x2a\x69\x20\x38\xb0\x76\xb3\x3c\x5e\xd8\x01\xfc\x8f\xab\x59\xad\x77\x9c\x8d\x25\xcd\xf9\x47\xd8\x54\xfb\xd0\xd9\xb6\x71\x1f\xd5\x99\x6c\xc4\xd3\xcc\x01\x4b\xc8\x50\x1c\x58\xbb\xa5\xdf\xdb\x49\x3c\x03\x34\x9b\xf6\xc8\x12\xf6\xea\xbb\x8d\xfb\x68\xce\xb1\x79\xca\x2f\x6a\xb0\x24\x9a\x32\xcf\x5b\x42\x5e\x74\xc2\xb4\x83\xca\xe7\x57\x56\xbc\xf0\xfe\x59\xaf\x79\x49\xb7\xaa\xc3\xd0\x54\x74\xeb\xa2\xd6\xa5\xf1\xc8\x63\x91\xcb\x2f\x9f\x0a\x5d\x8b\x73\x9a\xcc\x28\x2f\x09\xa8\x78\x81\xe0\xc0\xda\x99\x92\x4f\xcd\x21\x9a\x58\x1a\x60\xd1\x48\xd8\xa0\xaf\x73\xb4\x73\xbc\xfe\xa5\x89\xa1\x71\xa3\x36\xf1\x5b\x9a\x5e\xf7\xe6\x0d\xa0\x0a\x0a\x8a\x03\x6b\xb7\xf9\x7e\x85\x8a\x5f\x45\xa9\xf0\x5c\xb9\x62\xfa\x46\x96\x0f\xbd\xde\x4f\x96\x82\x8b\x50\xad\xb2\x57\x27\x4f\xf5\x10\x3f\x46\x02\xdb\x58\xa0\x38\xb0\x76\x76\xef\x39\x5f\x48\xaf\x66\x11\x11\x87\x58\xdf\x67\x18\x50\xe8\x88\xdf\x2e\x33\xc9\xad\x2b\xad\x76\xbd\x48\x0a\x8a\x7c\xe2\x01\xc4\x85\xe2\xc0\xda\xf9\x76\x9a\xf3\x0a\xad\xab\x86\xa2\x3d\x64\x35\xae\x3d\x43\x23\xbb\xfd\x66\xec\x03\x8e\x5c\x89\xc6\x01\x45\x63\x35\xfa\x81\x0c\xb0\xf3\x1e\x6a\x52\x74\x95\x76\xa4\x9c\x48\x4e\xe1\x28\x81\xfe\x3d\x33\xef\xfb\x7c\x6f\x7d\x99\xc9\x43\x42\x35\x97\x9d\xf0\xec\x8e\x33\x3e\x23\x5d\x44\x51\x21\x00\xb6\x9b\x40\x70\x60\xed\x72\x77\xee\xf4\xbe\x1a\xb9\xc0\x2c\xbc\xdd\x7e\x69\x3c\x84\xf2\xf1\x4d\xfc\x47\x71\x93\x9a\x99\x90\x04\x8d\x60\xa4\xb9\xb9\x6c\x60\x39\x1d\x8a\x03\x6b\x87\xe4\x8e\x44\xa7\x96\x96\x50\x9f\xc5\xdb\xfe\xb2\xd8\x72\xd0\xa1\xfd\x43\xb1\x88\xb2\xc7\xd1\xe7\x71\xfc\xaf\xe5\xec\x02\x4c\x44\xb0\xb8\x50\x1c\x58\x3b\x5c\x1d\x2f\x1c\x37\xdb\x20\x0a\x13\xc3\x0f\x7a\x21\x55\xe8\x38\x36\x36\x2c\xe9\xa5\x37\xe2\x09\xd7\x84\xfb\xcb\xde\x05\xa2\x03\xdf\xa5\xa0\x38\xb0\x76\x39\x95\xb4\xe6\xa8\xdd\x83\x7a\x79\x13\x1e\xed\x12\xf8\xaf\xac\x44\x78\xb1\xa3\x39\xc4\xe7\x25\x5c\xa7\x1b\x93\x0f\x9c\x1a\x18\x61\x9e\x1e\xca\x0f\xfe\x7f\xf4\xc7\xe3\x4e\x0b\x6d\x34\x20\xfa\x21\x2c\x82\xfb\xeb\xd4\xef\xd6\xfb\x92\xb2\x09\xc1\xf0\x2e\xd6\xaf\xc3\x88\xf2\xb2\xb8\xe6\x51\xdd\xc0\x2e\x76\x08\x0e\xde\xd3\xdf\x35\x34\x3d\xcd\xf4\xea\x17\xa4\x9e\x72\xbd\x39\xa2\xf1\x42\xf2\xf3\x37\x44\xf7\x84\x1d\x8c\x8e\x12\xaa\xd6\xe3\x90\xaa\xf3\x64\x58\x64\x28\x0e\xde\xd3\x63\xad\xa6\xde\x75\x31\x88\x9c\xde\x9f\xa0\xaa\xa0\x76\xcb\x9d\x13\x35\x16\x4b\xd7\x50\x7d\x44\x39\xe7\xc8\xf8\xad\xcf\xb9\xb3\x02\x16\x19\x8a\x83\x6f\xa6\xff\x5f\x1f\x4c\xff\x9d\x56\x6f\x44\x14\x85\x48\x3e\xba\x70\x5f\x8f\x1d\x79\x23\xf9\xe5\x1b\xcd\xe2\xdb\xf6\x97\x9c\x26\x26\xa7\x1c\x69\xd6\x34\xe4\xff\x7a\x7a\x81\xa1\xf1\xba\x5c\xea\xe6\x24\xfc\x13\xb6\xda\x3f\xfd\x99\x37\x1b\xac\xbc\x95\xf7\x3c\xdd\xd5\xc8\x0e\x5d\x6e\x73\xb2\xb6\x34\xfc\x9b\x6b\x58\x39\x6d\xa2\x6e\x10\xa6\x7b\xe6\xd9\xde\xf7\x8c\xcd\xd9\xc5\x57\xb0\x1f\x57\x55\x3e\x7c\x1a\x5c\x2f\x8e\x1a\x29\xb5\x10\xf2\xbf\xe6\xe9\xa1\x6e\xed\x1f\x4f\x2f\x01\xe7\xe9\xe9\x11\xc3\xb1\x1f\xb2\x3c\xd7\x0e\xfc\xb3\xf2\x51\xaa\x9f\x88\xcd\x10\x8d\x92\xd8\x82\x18\xd7\xd8\xa7\x1e\x3d\xe5\x95\x6b\x87\xe8\x75\x78\xfa\x36\x38\x4f\xff\x62\x59\xf0\x21\x73\x50\x6c\x37\x41\x4c\x9f\x84\x7b\x30\x42\xc8\xe7\xc7\x3b\x78\xca\xf3\xb9\x3c\xf9\x45\x2a\x2d\xb2\x1f\xf8\x7e\x5f\xcb\x12\x32\xbc\xa7\xff\x64\xa3\x92\xd2\x6f\xd1\xc5\xbc\x6a\xad\x8f\x96\x9d\xe1\xd2\xbf\x80\xa2\x62\x7c\xc3\x1e\x2b\x43\xa5\x15\x95\xc8\x23\x90\x17\xe9\x5a\x16\xcc\xe1\x3d\xfd\xd0\x88\x46\x93\x60\x78\x80\x18\x8f\x79\xeb\xbd\x80\x80\x25\xa1\x17\xf6\xfc\x34\x3b\x11\x7e\x0f\x74\x62\x0d\xe3\x66\xbb\xe3\xaf\xa7\xd5\x3e\xbc\xa7\x47\x7b\x6c\x96\x48\x28\x3a\x3c\x8e\xf5\x23\xdb\x69\x6f\x2c\x92\xf5\xfe\x50\xd8\x30\xf5\xb3\x74\xb6\xa1\x38\x09\xba\x34\xd1\xc2\xa7\xd7\x72\xb7\xf0\x9e\x9e\xd8\xf7\x91\x36\x79\xb0\x6b\x49\xce\xec\x2c\x83\x88\x98\x17\x9a\x32\x1e\xd2\x5d\x96\x4a\xf5\x50\xd5\xe9\x2e\xff\x08\x9a\x97\x3c\xd7\xe6\xe9\xa1\xfe\xba\x57\xe5\x49\xa5\x07\x5c\xd4\xdd\xf1\x08\x61\x59\x73\x7e\xbf\x28\x6d\x8c\x9d\x15\x9a\x02\xc7\xcd\xd9\x87\x65\xa8\x7a\x5d\x65\x84\x3f\x45\x00\x3d\xb2\xa1\x38\x70\x9e\x94\x3f\x10\x45\x59\x7c\xbd\xc3\xe8\x33\xe7\x58\x51\x52\xcf\x84\x9e\x69\x64\xd4\x86\xf1\x3c\x45\xdb\xe1\x40\x21\xc8\xea\x96\x2d\x70\x92\x35\x14\x07\xce\x93\xca\x79\x73\x4e\x4f\xe6\x30\x08\xdc\xbf\xf6\x49\xfa\xd3\xa3\xd8\xf4\x79\x18\x79\x8f\x06\x8c\xb3\x33\xac\xde\x43\x1d\x45\xf6\x48\x00\xd6\x21\x21\x38\x70\x9e\xa4\xf2\x64\x63\x88\x90\x5b\xad\x55\xfd\xbb\xbe\xbf\x43\x8f\xbd\x84\x54\x8a\x72\x80\xe5\x6b\xa2\x88\x55\x77\x71\x4a\x69\x3f\x09\x54\xc8\x42\x71\xfe\x92\x12\xff\xb9\xc5\x3a\x5e\xeb\x5e\xc8\xb3\xb1\x53\xcc\xc2\x00\xdc\xd4\x21\xfd\xa1\x2f\x29\x7d\x41\xbc\x14\xb2\x1c\x8f\x13\x4c\xde\xb4\x5b\x6c\x36\xc0\xe6\x38\x50\x2f\x80\xab\xb4\x73\x7c\xf3\xb4\xda\x79\x08\x93\xc8\x93\x3a\xd3\x83\x79\x57\x27\xd8\xc7\x46\x9f\x28\x54\x82\x96\x7c\x26\x25\x53\x9c\xfa\x4b\x2a\x70\xaa\x37\x14\x07\xd6\xee\x76\x60\x5d\x6f\x1a\xdd\xd7\x5f\xc8\x88\x77\xa3\xcc\xd3\x08\xb3\xca\x16\xad\xca\x7e\xda\xec\x7f\x2e\xc6\xb4\xb4\x1e\x68\x0a\x05\x4e\x90\x87\xe2\xc0\xda\xe5\xff\xe9\xdc\x67\x36\xd0\x25\xa9\x5f\xd0\xba\x44\xcf\x61\x12\x30\xc7\xa0\x6d\xef\x25\x1c\xbf\x10\xbf\x9f\xe3\x57\xb8\x20\x08\x94\x0a\x40\x71\x60\xed\xf0\x6d\xb5\x4e\xcc\x36\xfe\xe6\xb0\x4f\x5f\x3c\x73\xcd\x69\xca\x5e\x70\xdf\xfb\x5d\x23\x30\x18\x62\xf8\xfa\xa6\x65\x4c\xd5\x11\xe0\x63\xa1\x38\xb0\x76\x91\xde\x91\x63\xae\xd8\x6c\x64\x94\x42\xfe\x95\xeb\x32\x9f\xad\x6a\xd9\xab\x0b\x4b\x3c\x45\xbe\x14\x6d\xa9\xf3\xf1\xfd\x8a\xfd\x04\xd3\x0e\xea\x2d\x7a\x95\x76\xc9\x06\xfb\x85\xfe\x0b\x3d\x84\x8f\xf3\x16\xe9\xdf\x19\xdd\xb7\xd2\xe8\x59\x59\xe1\x99\xba\xe3\x12\x23\xea\x47\x86\x89\xbb\x00\x1c\x9b\x08\xc5\x81\xb5\x63\xf4\xe2\x4f\xac\x5f\x0d\x51\x73\x34\x5f\x72\x14\x66\x20\xbc\x75\x6f\x28\xf8\x8b\xd9\x2e\x9d\x3f\xa1\x1a\xda\x4a\xf2\xf1\x03\x5f\x58\x5c\x28\x0e\xac\x1d\xc3\xd9\x80\x26\xbd\xc5\x97\x0e\x4c\xba\x61\x17\x8a\x86\x8a\x3a\x23\x6f\x29\xe5\xcd\x8c\x36\x55\xb9\x0c\xeb\x90\xca\xd7\x91\xc0\x37\x2f\x28\x0e\xac\x5d\xb5\xaa\x83\x91\x6b\xe8\x27\x96\xaa\x38\xe6\xbf\x5b\xbf\x74\x28\x47\xe5\xe2\x0b\x8a\xa7\xf5\xa6\x3d\xfb\x7a\x9d\x91\xf7\xa9\xf7\x80\xee\x18\x10\x1c\x58\x3b\xfd\x1e\x3d\x54\x9a\x6d\x9c\x3d\xb4\x27\x89\x0b\x9d\x18\x3f\x9e\xbc\xad\xfd\x18\x4e\x45\x3e\x13\x45\x55\xa3\xd4\x14\x8e\xdb\x9f\x03\xd3\x0e\x2a\x15\x5d\xa5\xdd\xc1\x12\x3d\xff\x4f\xff\x75\x45\x9c\x7b\xc9\xec\x25\xa9\xf3\x64\x51\xaa\xd4\x86\x6b\x4c\x36\x71\x9f\x55\xdb\xb6\x2b\x63\x89\xca\x61\xd7\x0c\xc5\xc1\x9d\xd2\x1f\x62\xeb\xbe\xba\xdb\x23\x13\xed\x20\x5e\x23\x95\xc5\x23\xd2\x5b\xb9\xc0\x55\xf6\x50\xc4\x7e\x8e\xd2\x38\xe7\xd2\xf5\x04\xe8\x40\x02\xc5\x81\xb5\xbb\xbb\xe6\xc8\x14\x7a\x68\xce\x24\x7b\xa2\x26\xb3\x1c\xdb\xa8\x51\x6f\x91\xf8\x4e\xfd\xd3\xe3\xdb\xb5\x5c\xe2\x39\x9a\x42\xb7\x81\xe3\xf1\xa0\x38\xb0\x76\xec\x7f\xec\x59\x4b\xc3\x46\xdf\x2c\x24\xe6\xee\x2d\xcd\x49\x52\x2f\xca\xf8\x3d\xf6\xf7\xe0\x48\xf5\x1f\x69\x23\x5c\x3b\x7c\x09\x7c\x97\x82\xe2\xc0\xda\x89\x91\xed\x19\x07\x17\xe8\x7f\xee\x0b\x74\xbe\x19\xc2\x60\xe4\xf4\x77\xf5\xd5\x6f\x7a\xbe\xa4\x24\xf9\xbf\x9d\x83\x4b\x85\xbf\x53\x61\xda\x41\xe5\xf3\xab\xb4\xb3\xc6\xf9\x9c\x97\x55\xdb\x70\x92\xf6\x6b\x81\xf1\xaf\x9e\x1a\x33\x16\x4a\xac\x21\x4a\x5f\x73\x65\x5a\x18\x2f\x79\x91\x5c\x23\x50\x2e\x00\xc5\xc1\x7d\xc3\x26\xdc\x4f\x8b\xdf\x64\xee\xa9\x12\xdc\xe4\xb2\x2b\x51\x7d\x21\xb1\xfb\x3c\x0b\x67\xc6\xb1\x6c\x2b\x3c\xcb\xe9\xb5\x95\x52\x28\xf0\x0d\x1b\x82\x83\x6b\xb2\x36\xfa\x8d\xee\xfc\x2d\x6e\x73\x04\x07\x37\xab\xf2\x56\xd5\x73\xc2\x0f\x5f\xf8\xa9\x44\x96\xb8\x10\xab\x1a\x32\x0d\xba\xb8\x98\x81\x26\x6b\x10\x1c\x58\xbb\x5d\x84\x62\x37\x69\x77\xb5\xbb\x5e\x1e\xcf\xa3\xd0\xd1\x4d\xef\x3c\x0f\xff\x51\xc1\x75\xc2\x41\xb2\xd7\xfd\x27\x08\x39\xeb\x15\x50\xa5\x0f\xc5\x81\xb5\x2b\x47\x21\xf9\xf1\x51\xfc\x5c\x37\x37\xa2\x3a\x91\xb9\x5e\xf9\x5b\x4e\x5a\xe4\xf8\x01\xed\x83\xcb\x36\xdd\xa0\xe0\x9b\x97\x35\xc4\x30\xed\xa0\x26\x45\x57\x69\x77\x33\xea\x9d\x46\x01\xc9\xa6\xfa\x02\x0b\xc2\xd1\xcb\x38\x8c\xd9\x11\x79\x26\x92\x70\x41\xbf\xca\x07\x69\x27\x2b\xf4\xd3\x01\xa9\xb0\x6b\x86\xe2\xc0\xda\x61\xc8\x6b\x28\x6e\xf0\x8e\xe8\x3e\x5b\x28\xa4\x88\x6c\x1b\x88\x1b\x97\x7f\xb2\x18\xdb\x31\x39\x15\xa7\x7a\x7e\xb0\xb9\x76\xb7\x0b\x16\x17\x8a\x03\x6b\xb7\x35\x4a\x42\x77\xb2\x61\x77\xdf\x3b\xbb\x00\xc5\x70\x53\xf4\x72\x7b\x8c\xfc\x65\x7a\x8c\xb3\x7c\x34\x5a\x59\xbc\xd1\x45\x02\x35\x2c\x2e\x14\x07\xd6\xae\x4c\x25\xd5\xae\x6b\x67\xc8\xa6\x3d\xbe\xdf\xf2\x59\x97\xd4\x03\x16\x92\x03\xca\xe0\x39\xfe\xdc\x6a\x63\x4f\xc3\x22\xb2\x7e\x20\x77\x40\x71\x60\xed\x7c\x6f\xd3\x92\xbe\xc0\x12\x3b\x67\xec\x6d\xd4\x9f\xc7\xf2\xf9\xae\x11\x91\xe4\xdc\x86\xda\x6d\xef\x32\xb1\x21\x8a\xc0\x61\xeb\x03\xf3\xf4\x50\x7e\xf0\x6a\x4f\x7f\x67\xa9\xe4\xa9\x61\x88\x13\x9d\xea\xbd\xa4\x29\x9e\xf7\x26\x87\xdf\xab\xfa\xd7\xdd\xbf\xc5\xbd\x79\xb8\xea\x78\x1c\x15\xac\x5e\x0b\xf3\xc7\x50\x1c\xbc\xa7\x0f\x39\xe0\x5c\x48\x6a\x88\xb7\x69\x74\xe9\x92\xde\x55\x45\x1a\x0a\xcb\x48\x6e\x31\x8f\x16\x37\xea\xe7\x4a\x39\x7e\xb3\x34\x82\x05\x8b\x0c\xc5\xc1\x7b\x7a\x8e\xb7\x1c\x8a\x53\xa1\xb5\xcd\xa3\xfd\x3e\x88\xf2\x05\xbb\x86\x7a\x2f\x93\x9e\x98\x5b\xea\xea\x19\x85\x75\x79\xeb\x65\x47\xe9\xc0\x22\x43\x71\xfe\xd2\x08\xe8\xff\x19\xf9\xbf\x3e\x99\xbe\x2b\x6d\x63\xe0\x5c\xba\x9d\xc3\x33\x65\x0f\xff\xad\x98\x74\x20\x55\xee\xb0\x53\x2a\xdf\x74\xe5\xa9\xcb\x17\x1a\xae\x67\x13\xc9\xff\x7a\xfa\x27\xb9\xf9\xaf\xf4\xf1\x77\x85\x4f\x42\x91\x30\x5e\x8a\xc6\xe8\x45\x1d\x28\xf4\x0b\xf6\x2b\x7d\x27\x56\x56\xf5\x1a\xfd\x75\xfb\xdf\xc6\xe3\x04\x43\x6d\xfc\x24\x77\xb5\xc2\xdf\x6d\x11\x45\x6c\x08\x8f\x5b\x35\x49\xf0\x19\xe7\xc9\x77\x90\xa8\xad\xe1\xd3\x93\x9c\x15\xd6\x49\x48\x60\x62\xfe\x2f\x78\x7a\x1f\x94\xff\xee\xd6\x02\x90\x10\x50\xfc\x1f\x50\xf9\x04\x86\x49\xf9\xc0\x79\x7a\xf1\xb7\xd6\xd4\xb4\xa8\x22\x33\x63\x01\xa6\x76\x32\x77\xc8\x66\x66\x98\xed\xc7\xfd\xde\xe5\x9f\x66\x45\xb0\x39\x32\xf8\xdd\x48\xb9\x0e\x4f\x8f\xa0\x04\xfe\x55\x45\x31\x41\xff\x4d\xf2\xf8\x1f\x75\x6b\x78\x78\x7d\x8a\xfd\x3f\x91\x39\xa6\x82\x97\x2f\xd7\x72\x1a\xa4\x49\xec\x43\x52\x52\xae\xa5\x0d\xbc\x0f\xbc\xa7\xef\x95\x26\x36\x35\x64\x6e\xd1\xe6\xd0\x18\xff\x6c\x5a\x38\xcd\x15\x92\x3f\x1c\xc0\xe5\x51\x9d\x2d\x33\xba\x93\x8d\xfd\xe7\xa3\xca\xb5\x2c\x98\x6b\xc2\xfd\x2c\x59\xf8\xd7\x0f\x0e\x21\x81\xd9\xba\x39\xf8\x74\x4b\xbd\x49\xdc\xfa\xb3\x6e\xdd\x85\x15\xd4\xc6\xb9\xdb\xca\xf6\x09\x9e\x09\xd7\xb1\x17\x42\xda\x07\xde\xd3\x33\x1d\xc7\xfc\x20\x98\x30\x3b\x68\x8f\xa7\x0f\x76\x53\x3d\xb2\x0a\x10\xc0\x7e\x66\xa4\xb9\xfc\x59\x97\x77\x19\x2d\xf8\x8b\xdd\xe4\xb5\x99\x6b\xa8\xff\xd0\x55\x09\x8b\x83\x03\x05\x99\xc0\x90\x65\x57\xc3\x28\xcd\xb9\x01\x7f\xc7\xce\xaa\x5f\x1e\xe1\xe2\xde\x8a\x66\x66\x0a\x4b\x2a\xe6\x56\x0e\xb0\xe8\x01\xc5\x81\x13\x16\x82\x9b\xa6\xcf\x49\x00\x67\xa9\x13\x5b\x89\xdb\x9c\x99\x80\x93\xdf\x61\xea\x82\xd9\xcb\x73\x8a\x07\xb4\xe1\xae\x9b\xc3\x73\x5a\xb0\xb8\x50\x1c\x38\x61\xbd\x5f\xc4\xf6\x6f\x62\xaa\xd0\x61\xf8\x10\xdf\x21\x10\xed\x3a\x60\xad\x57\x76\x7e\xea\x3d\xef\x8b\x99\xf6\xa0\xdc\xac\xdb\x16\x98\x28\x42\x71\xe0\x84\x95\x3c\x1f\x4e\x52\x16\xad\x75\xff\x4c\x5a\xa3\xb9\xd9\x74\x5d\x8e\xe6\xd2\xd3\xa5\x37\x3c\x37\x7b\x6c\xd2\xef\xd2\xcb\x67\x33\x13\x30\x3b\x10\x1c\xf8\x7a\x0f\x27\xfa\x65\x5a\x4a\x7e\x88\x46\xf4\xd3\xd3\x0d\x3e\xcc\x2e\x15\x4c\x75\x40\xec\x70\xb3\x34\x1b\x3a\xd4\xd9\x24\x28\xe0\xed\x87\x4d\x36\xa0\x9e\xc4\xab\xb4\x3b\xd6\x45\x0e\xdb\x35\x42\x4a\xd9\xcb\xd1\xcd\xec\x5b\xfa\x28\x26\xd4\x51\x83\x6c\x7c\x8e\x85\x8a\x2b\xf7\xbe\x5b\xfe\x6c\x16\x38\x3f\x18\x8a\x03\x6b\x17\x93\xe8\x17\x63\xa0\xc7\x47\xad\x88\xc4\x5b\x73\xb1\x43\x8b\x63\x93\x93\xf5\x73\x21\xd9\x23\x92\x06\x67\x47\x7c\xf2\xc3\x0c\x25\x2c\x2e\x14\x07\x1e\x0b\xc4\x4f\x21\x9f\xdb\x7d\xa8\x30\xc4\x93\xa4\xb4\xf0\x5a\x37\x03\xf6\x3b\xc7\x4a\xf6\xc5\x33\xd9\xbb\x5b\x67\x7d\x97\x53\x24\x81\x05\x41\x28\x0e\xac\x5d\x3d\x7e\x69\x97\xf3\xa7\x68\xe6\xe1\x89\xc7\x71\xaf\xf8\xf4\x0d\x97\x6e\x85\xb8\xa9\x38\x90\xfc\x39\xcc\x29\x28\xb7\x28\x7a\x46\x0c\x8b\x0b\xc5\xc1\x6d\x40\x6d\x79\x98\xd9\x44\x1c\x9e\x38\xb2\xd3\x3a\xe9\x4e\xdf\xc1\x98\xf9\x82\xe7\x35\x65\xd1\x97\x7c\x33\x9a\x47\x01\x65\xf9\x67\x8f\x60\xda\x41\xbd\xce\xae\xd2\x6e\xc0\x7d\x78\x08\x49\x4e\xbb\xad\xcc\xee\x41\x6d\x6b\x6b\x83\xd8\x45\x83\x2f\xd2\xdc\xf8\x42\x62\xbe\x68\xe9\xe8\x91\x75\x22\x70\x28\x19\x14\x07\xd6\xee\x3e\xa1\xd7\x98\xc8\xef\x1e\x1f\xbe\x57\xe9\x64\x82\xfe\x23\xc8\xfc\xab\xa3\xb8\xd5\x78\xab\x61\xb7\x4e\x78\xbc\x5e\x38\xbd\xd3\x87\xc5\x85\xe2\xc0\x63\x11\xf7\x86\x23\xb0\x84\xf4\x8e\xc8\xe1\xb2\x23\x72\xe0\x7e\x26\x45\x18\x92\x1c\x96\xb2\x2c\x56\x7b\xc9\xc9\x13\x8f\x28\x69\x0f\x60\xa3\x28\x14\x07\xd6\xee\x95\x84\xf1\xf6\x12\x8a\x87\xa6\xf0\xa4\x17\xb7\xf9\x65\xb8\x8f\xdb\x8b\x9a\xc0\x15\x6d\x32\xe5\xbf\xc9\x4c\xa2\x3d\xf7\x85\xa8\x60\x71\xa1\x38\xf0\xf5\x2e\x5c\x30\x25\x3a\x27\x9b\x35\x4b\x4e\xa4\x62\xf7\x2b\xd4\x3f\x32\x95\x78\x11\x56\xf5\xf7\xc9\xcd\xf1\xe1\x81\x57\xbe\x85\xec\xc0\xa9\x0f\x50\x39\xe1\x2a\xed\x7c\xfc\xb6\x1d\xf9\x2d\x04\x83\xcb\xc4\xdd\x0e\x88\x9e\x67\x13\xfe\x6a\x69\x38\x45\xc3\x7c\xa2\xf8\x0b\xe1\x30\xf7\x73\xad\x07\x50\x5f\x0b\xc5\xc1\x2d\xdc\xd1\x37\x78\x56\x49\xe5\x77\x20\x3d\x12\xbc\xe5\x1c\x62\x41\x6e\xe7\xb3\x13\xd8\x89\xe7\x50\xf0\xbe\x91\x43\x70\xdb\xa5\x0c\x68\xb9\x08\xc5\x81\xc7\xe2\xc4\xda\x91\x9e\xd3\x9c\x29\xdd\xdf\x57\x51\x4e\x4a\x8a\x8a\x4d\x3f\xb9\x83\x53\x4a\xf0\xfc\x36\x5d\x3d\x0d\xd3\x2b\x01\x15\x60\x43\x09\x14\x07\xd6\x6e\xb3\xe3\x7d\x54\x7b\x58\xf0\x2e\x65\xdb\xa1\xfd\x21\xe7\xcd\x07\xb2\x1d\xac\x25\x62\x58\x51\x8e\xf8\x07\xd8\x35\xc2\x26\xa9\x80\xd9\x81\xe2\xc0\xd7\xab\xd5\x97\x46\x23\x74\x19\xa1\xc7\x5a\xc0\x2f\xf5\x96\xb8\xdf\x5b\xf4\x4f\xfe\xc0\xf0\x85\xdb\x13\x93\x20\x9d\xf9\xd0\x1b\x82\x7c\x30\xed\xa0\x12\xeb\x95\x27\x76\xd8\x8e\x6d\xf6\x7e\x6f\x60\x79\x32\xcf\x51\x23\xc0\x30\x5e\xfe\x11\x51\x71\xa0\x3b\x3c\x32\x11\x31\x4f\x97\x47\x9e\xad\x1f\xd8\x70\x05\xc5\xc1\x1d\xe4\x28\xa2\xf1\xb3\xba\xda\x32\xcb\xed\xa9\xa2\xeb\x87\x0a\xff\x1c\x6c\xfa\x16\x47\x93\x69\xf2\x38\x2a\xd4\xe7\xe4\xef\xdc\xdf\x8b\xc1\xe2\x42\x71\xe0\xb1\xc8\x3a\x0f\x55\x33\x16\x9b\x6d\x5b\x64\x40\xb9\x73\xaa\x79\x23\x01\x17\xcb\xbb\x34\xf3\x4e\x78\x37\xf1\x11\xaa\x5a\xb1\xf4\x06\x60\xae\xa1\x38\xb0\x76\xa4\xdf\x24\x77\x8d\x56\x2f\x23\x9e\x0f\xeb\xbf\x30\x6d\xc1\xdb\xbf\xdf\xc9\xfb\xcc\x2f\x10\xff\x68\xdb\xd8\xd7\x37\x32\xf9\x04\xd8\x44\x01\xc5\x81\xaf\xf7\x67\xf9\xc7\x54\x95\x4f\x4f\x2d\x6e\x8a\xd1\xf8\xaf\x11\x53\x90\xfb\x79\xee\xb9\x17\x05\x69\x8f\x94\xfd\x7c\x19\xf9\x89\xaa\xa3\x05\x66\xd0\xa0\x26\xf7\x57\x1b\xb4\xcf\x51\x83\x19\x5c\x6f\x2c\x89\x86\x37\x9a\x6f\x1c\xff\xb4\xfc\x19\xd7\x72\xf3\x79\xe5\x5c\xc5\x74\xa9\xf1\x51\x4d\x6b\x31\x16\x50\x1b\x0d\xc5\xc1\x1b\xb4\x08\x05\x7e\x07\xa6\x69\x4a\x19\xdf\xa5\xf6\xb4\xda\x1b\x0b\xfa\x1a\x9f\x16\x7e\xda\xbd\x2b\xc0\xc2\xd2\x89\x08\xf7\xb2\xf6\x36\x84\x45\x86\xe2\xe0\x0d\x5a\x66\xa6\xc4\x92\x00\x41\x6c\xa3\xc8\x64\x04\x72\x38\x33\xa5\x67\x94\xf4\xe6\x4b\xce\x37\x45\xc9\x88\x09\x14\x2e\xf8\xf9\x8f\x80\x76\x67\x50\x9c\xbf\x34\x02\x35\x68\xd1\xd5\x07\xcf\xcf\x77\xbd\x66\x79\x30\x82\xe9\x76\x19\xef\xdb\xc8\x48\xcf\xca\xf9\x93\x1e\xee\xf3\x3d\xc3\x4d\xcf\x67\x8f\x5d\xdf\x02\x06\xad\xd9\x22\xed\xe8\xe9\x84\x59\xec\xda\x71\x3d\x72\xfe\xa3\xee\x54\x74\xa3\xb4\xfd\xf8\xd7\x22\x3e\x1a\x62\x7a\x37\xa4\xac\x02\x5f\xfe\x6b\xd0\x70\x35\x2c\xbc\xb4\x8e\x3f\xba\x14\x2f\x87\x5e\x60\x6a\xb8\xb3\xfe\xd0\x5e\xcf\x16\x4d\xe0\xaa\xc6\x2d\xa2\x14\x1d\x7e\x16\x55\xff\x0f\x3a\xf5\x66\xb6\x58\x50\x12\x83\xa4\xaa\x28\x58\xcb\xd0\x2e\xe8\x60\xa9\xee\x80\x49\xcb\xd6\xf1\xc9\x82\xf6\xe1\xc6\x9f\xb4\x0e\xca\xff\x35\x83\x06\x75\x6b\xff\x18\xb4\x36\x38\x83\xa6\x5a\xbc\xf4\xd2\x98\xd5\xea\xed\xfe\x7d\xc9\x57\x91\xec\xb6\x6c\xc1\x0e\x41\xc6\x55\xb4\xdb\x72\xe7\x9a\xe3\x77\x58\x9f\x1c\x3d\xb8\x0e\x83\x26\x01\x67\xd0\xe4\x3d\x8f\x65\x88\x84\xd3\x87\xc9\x34\x69\x97\x4a\x27\xc3\x22\x17\x5f\x0f\x04\xd9\xe6\xdd\xb8\xfb\xa8\x33\xff\x83\x7e\xcf\xde\xf7\x6b\x59\x0f\x84\x37\x68\xe2\xdc\x53\x8a\x69\xaf\x97\x9f\xde\x70\x4a\x6e\x6e\x34\xc1\x9e\xa9\xaa\xf3\x55\xe7\xb1\xb0\x8d\xba\xe4\x50\x3c\xb4\x22\xcb\x65\xbe\x96\xd5\x4f\x78\x83\xa6\xca\xa9\xf3\x71\x76\x6f\x53\x27\x89\x46\x64\x4e\xff\x47\xf7\xef\xed\xc6\x87\x94\xcd\x7a\x47\xcf\xd2\x43\x1d\x7e\xb0\xe5\xda\x85\x5e\xcb\xdd\xc2\x1b\x34\x07\xd9\x7a\x24\x7f\x0b\xbd\xe4\xca\x95\x0c\xb2\xf0\xd7\xb5\x0f\x2a\x55\x3e\x54\xc8\x97\x7d\xf0\x56\x10\x5f\x49\x5e\x13\x70\xbd\x86\x95\x6d\xfd\xff\xee\x3f\x74\xe5\x97\xfc\x53\x2d\x42\x67\x96\x20\xe7\xcb\x5f\x53\x64\x8a\x69\x54\x78\x49\x32\x77\xec\xeb\x82\x34\xcf\xa3\xc3\x5f\xef\xa9\x2b\xa6\x03\x47\xd2\x40\x71\xe0\x84\x65\xed\x47\xb6\x9a\xc1\x61\xde\xfa\xed\x0f\xfe\x67\x0d\x8d\xc4\xe7\xee\x97\xb1\x66\x26\x7c\x4b\xfa\xa4\x62\xc8\x0c\x9c\x21\x49\x40\x43\x33\x28\x0e\x9c\x00\x9e\x05\xd6\x93\xe4\x06\x60\x74\xc7\x0d\xa8\x79\x8d\xba\x7a\xa5\xe7\xbc\x79\x19\xf4\x29\x3e\xf0\xb5\xc3\x91\xad\x72\xf9\xab\xaf\xf6\x40\x93\x10\x08\x0e\x9c\xb0\x94\xaa\x90\xa2\x5f\xd3\x2c\x7d\xcd\x68\x6c\xb5\x8f\x59\x47\xf6\x6a\xb8\x9b\x52\xee\xca\x34\x84\x2f\xfd\x64\x24\x3e\xee\xd1\x1a\x50\xe9\x0a\xc5\xf9\x4b\x22\x48\xfc\x47\x85\xe0\xdc\xd2\xf3\xf4\x1c\xdd\x30\xdf\x0f\x75\x5d\x8e\x45\x08\x42\xfa\xdb\xdf\xb9\x12\x22\x69\x5f\xd0\x6e\xa6\x5d\x04\x32\x6d\x27\x00\xc7\xa5\x40\x3c\x89\x57\x69\xe7\xc5\x3e\xdc\x98\x30\x8d\x4c\x76\xb3\x61\x11\x97\x5f\x81\xf4\x68\xff\xcb\xe9\x46\xd0\x5b\xe7\x01\x03\xfc\x5b\x29\xb2\xd5\xfa\xa5\xb0\x6b\x86\xe2\xc0\xda\xed\xcd\x5a\xb8\x5e\xe2\x63\x6d\x52\xd1\x7c\xd8\x61\x47\x0b\xb9\x2d\xfc\x2b\x0e\xc7\x41\x58\xf2\xf0\xa2\x66\x31\x9a\xae\xd8\xa7\x05\x16\x17\x8a\x03\x6b\x17\xee\x70\xbf\x7d\x28\x31\x37\xb6\xa3\xa4\x24\x6a\x8f\x17\xcd\x9f\xda\xe0\x7b\xc8\x56\x94\x52\xe9\x08\x4a\x4f\x4a\xdb\x8d\x16\x3f\x58\x5c\x28\x0e\xac\x9d\xb9\xd7\xca\xab\xd6\x14\xae\xe2\xe1\x39\x19\x82\xec\x90\x63\x29\x76\x43\xb3\xb7\x58\xf5\x53\x1f\x49\x9c\x17\xe7\x79\x5e\xf5\xec\xc3\xe2\x42\x71\x60\xed\x5a\x6e\xc5\x10\x99\x22\x7d\xf3\x60\xc2\xc8\x0b\x57\x5c\x9f\x22\x2e\xc1\x66\x4e\x24\xb0\x1f\x5d\x6a\xa4\x44\x22\x68\x0c\x1c\xca\x86\x69\x07\xf5\x3a\xbb\x4a\x3b\x5d\xf5\x0e\x04\xc5\xb7\xbe\x73\x5f\xc3\x5f\x13\xaf\xe2\x8d\x3c\x3e\x3f\x60\xe2\x2a\xe5\x93\xe3\x1d\x17\xb0\x71\xf9\x8d\x74\x0e\xf4\x6b\x87\xe2\xc0\xda\x5d\xf8\xac\xfc\xf6\x39\xed\x48\xce\x92\x15\xf3\xc9\xe9\x44\x70\x12\x2f\xa4\xa2\xcc\xb5\x9d\x4d\x50\xef\x73\x7e\xd8\xdd\xc4\x3e\x0c\x8b\x0b\xc5\xc1\x35\xaf\x7a\xf4\xa4\xf1\xe2\x10\x99\x90\xb0\x4c\x99\x6d\x5f\xc9\x30\x3f\xcd\x70\x95\x4a\x3e\x9f\x3f\xe7\xdb\x5c\xef\x8a\x50\x9b\xd8\x22\x30\xa1\x83\xe0\xc0\xda\x11\x7a\x1f\xb6\x99\x0d\x6e\xa9\x95\xd8\xe1\x34\x95\x9a\xde\x79\x9f\xe7\x95\xca\x7f\xd4\x5c\x3a\x42\x3f\x99\xa9\xf0\xa8\xaa\x0b\x38\x81\x19\x8a\x03\x6b\x17\x2c\xe2\x97\x5a\x99\x16\xc8\xd2\xf7\xeb\xcf\x9b\xfb\x14\x51\x6f\x0f\x39\x3e\xec\xe5\x1a\x26\x20\x53\xa2\x1b\x16\x29\xcc\x9d\x57\xc2\xb4\x83\xca\x09\x57\x69\x77\xf7\x76\xc0\xc4\x9f\xdc\xe3\xa5\xf8\xa3\x58\x3e\x7c\xfd\x9f\xad\x66\x53\xad\x8f\x33\xb8\x1b\xa5\x77\x0d\x5f\x7e\x1b\xbe\xf3\x1b\xa8\x04\x87\xe2\xe0\xfa\xc0\x07\xfe\x9d\x0b\xeb\x56\x7a\x59\x56\x2c\xc6\xdf\xad\xde\x14\x42\xf4\xda\x46\x06\x2f\xe3\x85\x52\x1a\xb7\xcf\x05\x9f\xbd\x13\x1e\xd0\x81\x01\x82\x83\x3b\xf1\xbb\x83\x98\x80\xc6\x3b\xd5\x97\x96\x33\x8f\x94\xe3\xad\x87\x54\xdb\x97\x5b\xae\x8a\x78\x23\x0e\x3a\xef\xad\x23\x39\xa2\x2e\x81\xc6\x7c\x50\x1c\x58\xbb\xe7\x2e\xc2\xf7\x36\xc6\xb5\x73\x9b\x56\x5e\xaf\xd7\xd6\x0e\x72\x3a\xeb\xb1\xb9\xc8\x0f\x0b\xf0\xaf\x4c\xce\xe0\x61\xb1\xb6\x1b\x01\x55\xd5\x10\x1c\x58\xbb\x1d\x3c\x62\x1b\x91\x09\xd4\x92\x3f\x99\xf8\xf4\xfc\x83\x1a\x32\x53\x7c\xb6\x04\x8f\x15\x29\x92\x3b\x58\x76\xb1\x5f\x50\x20\x7e\x87\x69\x07\x95\x58\xaf\xd2\x2e\xe2\x6b\x1d\x6a\xc0\x9d\xb2\xf9\x12\x99\x21\xb6\x05\xb9\xf9\xe8\x8f\xf1\x0c\x9f\x96\x78\x1f\x5f\xe8\x39\xea\xed\x31\x9f\xd0\x02\x15\x3c\x50\x1c\x58\x3b\xdd\x53\x12\xf2\x0d\xab\x90\xe1\x70\x5b\x67\xa1\x10\xe3\x2c\xcf\xda\x66\xa1\x54\x05\x9e\x08\x37\x47\x37\xa5\xd5\xc1\x4a\x02\x60\x77\x00\x14\x07\xa7\xdd\x33\x4e\x3c\xdc\x89\x0d\x5c\x7c\x4c\x6f\xb9\xb8\x16\x83\xf9\x57\x0c\x8f\x46\x05\xdb\x2f\x0b\x62\xce\x9f\xa1\x76\xfb\x1b\x01\x0d\xc2\xa0\x38\xb0\x76\x4f\xb2\xf4\xbf\x86\x3c\xac\x7b\x83\xb1\xd6\xac\xfd\xeb\xeb\x0a\x2b\xf1\xb3\xbf\x3f\x95\x85\x37\x5f\x3b\x54\x13\xa2\xa2\xd0\xcf\x01\x8d\x36\xa1\x38\xb0\x76\x98\xdb\x36\x7a\x42\xc6\x4f\xeb\x4a\xa2\x06\x84\x24\x35\x0f\x13\xe7\x17\xe5\x4c\xcf\x45\xb5\xbf\xbc\x34\x21\xb8\x79\x3e\xcd\x17\x0c\x33\x68\x50\x93\xfb\xab\x0d\xda\xcd\xbd\xae\x9e\xcd\x8f\x77\x02\xd1\x02\x2b\x56\xbc\x36\x3f\x67\x15\xd4\xe6\xa2\x5a\x06\xed\x54\xb6\x08\x19\x44\x6d\xb6\xbc\xbb\x84\x99\x1d\x28\x0e\xde\xa0\x15\x45\x46\x39\xc8\x39\xd8\x9f\xb5\x87\x52\x8d\xf4\xdc\x5a\x78\xd0\xaa\x7f\x7f\xf7\xcd\x4c\x87\xaa\x7b\x8e\x1c\x8a\xbf\x5b\x8d\x36\x2c\x32\x14\x07\x6f\xd0\xa2\x22\x07\xbd\xc5\x86\x3f\xb2\x26\xdd\x90\x21\x68\x0d\x21\x23\xa3\xa2\xd5\xab\xca\x3b\xe9\xac\xfc\x53\x8f\xd6\xf9\xed\x44\xed\x33\x2c\x32\x14\x07\x7f\xcd\xc8\xef\x09\xf2\x76\xc6\x17\x08\x99\x4e\xb9\x5d\x2e\x0e\x9f\xd4\x79\xe3\x88\x0a\x18\x51\xde\x1c\xff\xa9\xb5\x27\xb8\x2f\xdd\x47\x09\x18\x34\x3a\xbb\xe6\x0e\x31\xa7\xc7\x2a\x68\xc2\x6c\xf6\x94\xa3\xa5\x59\x27\x71\x1f\x8b\xb7\xea\x9c\x98\x17\x4d\xc4\x3a\x0f\xb8\xc7\xf8\xfe\x9d\xf9\xa6\xec\x5a\xdd\x7d\xcf\x64\xf8\x63\xfb\x6d\x5a\xac\x9c\x7d\xf0\xb1\x5c\xdb\xa7\x25\xc2\xcf\x56\x0b\xd8\xaf\xbf\x93\x7d\xcc\xe9\xd4\xff\x07\x7d\x11\xf3\xe5\xd1\x9c\x79\x89\x2c\x5a\xf5\xee\x9f\xbd\x94\xcd\x2f\xc3\xc8\xa8\xea\xd9\x4e\xdf\x7f\xf9\x88\x57\x5f\x22\x22\xa5\x5a\xfc\xaf\x19\x34\xa8\x5b\xfb\xc7\xa0\x21\x48\x81\x67\xf1\x56\x36\xfc\xca\xfd\x4b\xfe\x06\x39\x5a\xe4\x83\xc7\x49\xfe\x36\x43\xdd\x92\x86\x0d\x5f\x9f\x6a\x27\xcc\x7d\x4c\xb8\xad\xd3\x93\x7b\x1d\x06\xcd\x07\xce\xa0\x99\x94\x68\xeb\x93\x6b\x89\xc8\x93\x9e\x7e\x8a\xd1\x2a\xd6\xc3\x1c\xe8\x9d\xdf\x68\x88\x75\x21\x9f\xee\x68\xa4\xfd\xb3\x63\x58\x70\x2d\x4b\x59\x42\x70\x96\x25\xec\x4c\x33\xe5\xb2\x3c\x7b\xf1\xb9\x1d\x13\x7d\x2b\x63\x51\x56\x9e\x17\x57\xbd\x73\x4b\xe1\x0c\xae\x6e\x45\x82\xcc\x51\xe7\xcc\xb5\x2c\x65\xc1\x1b\x34\x52\x2e\xa9\xc6\x8a\x93\x01\x2b\xd6\xd8\x0c\xb2\x6f\xd2\x18\x4d\x86\x0a\x8b\xbe\x26\x9f\x03\x58\xd9\x31\x50\xd3\x9b\x8f\xb4\xdf\x5d\xcb\xdd\x3a\xc0\xfd\xac\xe5\xf8\x9d\x4a\x0d\x0c\xd4\xcf\xbf\xa2\xbd\x04\x9a\x4f\xde\x61\xe1\x9c\xc9\xbd\x9d\x2a\x58\xd0\xf3\xee\x93\x58\x5d\x6a\xe0\xba\x86\x43\xb2\xf5\xff\xbb\xff\xd0\x55\x09\x2b\x3e\xde\x33\x3e\x5a\xb7\xd2\xf2\x5d\xdd\xa4\x85\x9b\x37\xbf\x25\xb7\x18\x5d\xba\xc8\x67\xeb\x41\x94\xed\x0f\x69\x6a\xf6\x3e\x45\xb0\x17\x35\x14\x07\x4e\x58\xc9\xfb\x28\x8e\x34\xe6\x41\x74\x4d\xb1\xd5\x66\xf6\x77\x54\xef\x0c\xc7\x9e\x2e\x20\x8d\x29\xb2\x57\xe8\x4f\x8c\x96\xfb\x07\xdc\x00\x56\xa4\x20\x38\x70\xc2\xea\x24\x95\xe4\x4e\xd2\xd1\xb2\xfc\xd8\x61\x84\xe3\x23\x5f\xda\x7b\x2a\xd9\x5d\xe1\x14\x24\x19\x80\xc1\x13\x70\x3e\x61\x22\x09\xb4\x66\x80\xe2\xc0\x71\x6b\xb9\x50\x65\x85\x1f\x34\x10\x19\x93\xb0\x7b\x6d\x9f\xde\x0c\x7f\x24\xfc\xce\x5b\xce\x29\x69\xe9\xf1\x9b\x75\x8f\x59\x5b\x2d\x20\xc1\x42\x71\xe0\xf1\x9d\x9a\x6b\xdb\x40\x2d\x09\xae\xfe\x41\x48\x3b\xc5\xb8\xb4\xa2\x37\x40\xa7\x36\x2c\x23\x1a\x16\xda\x22\xf5\x97\x3c\x68\x82\xdd\x12\x36\xd9\x80\x7a\x12\xaf\xd2\x0e\xb9\xc4\x43\x3a\x2f\x6e\xf6\xd5\x26\xb6\xe9\x73\x4c\x7b\x4b\xb2\x52\xcc\xa4\xe9\xba\xdf\x8a\x16\x2d\x31\x1e\xa9\xf4\x78\x59\x26\xb0\x6b\x86\xe2\xc0\xda\x59\x36\xd2\x32\x4c\x9b\x8c\xe1\x16\xb2\xbf\xc8\xfc\xf1\x6b\x39\x25\x2f\x77\x48\xb1\x01\xaf\x35\x66\x25\x3e\xd8\xbb\xbc\x3e\x4e\x00\x16\x17\x8a\x83\x2b\x17\xae\xd1\xf3\xe1\xc6\x0e\x49\xbf\xb9\x92\x3f\xe1\x59\x69\x43\x4e\x82\xbd\x69\x2b\x16\xe0\x4f\x68\xc9\xe9\x7c\xc4\x79\x3b\x1b\x98\xe4\x43\x71\xe0\xb8\x2a\x52\xe8\x0b\xb7\x9f\x07\x0e\x5a\xee\x1e\x8f\x6d\x21\xad\x3f\x5d\x0a\xfb\xa8\xd6\x43\x65\xb8\xd3\x83\xad\x43\x24\x8e\x1c\x0d\xb4\xd3\x82\xe2\xc0\xe3\xcb\x35\x24\xde\xc6\x52\x76\x42\x29\xb0\xce\xfb\x3a\x15\x5f\x59\xd3\x31\x39\x99\x88\xe4\x93\x9a\xd2\xd3\xe9\xf2\xf0\xb8\x9c\x59\x0a\x98\x76\x50\xaf\xb3\xab\xb4\xbb\x81\x37\x16\x13\xc9\xb4\xef\x4f\x12\xa7\x49\x60\x3e\xda\x2b\xfd\xb0\x99\x1f\xcb\xed\x7b\x00\xa2\xdc\x4f\xca\xf2\x88\xb7\x6a\xd5\x40\xc7\x57\x08\x0e\xac\xdd\x8a\x3b\x93\x3d\x0b\xc2\xf8\x3b\x11\x03\x95\x4d\x2e\x0d\xca\xae\x0b\xf4\x1e\xdd\xd7\x31\xc8\x0e\xe9\x52\x48\xad\x27\xd4\x9a\x8d\x40\x7b\x2a\x08\x0e\x3c\xc6\xad\x23\xaf\xe3\x0d\x42\x4a\xe3\x9b\xd2\x4d\xbd\xed\x8a\xbf\x93\x9d\x3f\x53\x6a\x29\xb3\xf5\x11\xff\xfa\x8c\x73\x5c\xaa\xc3\x0b\x78\x9e\xa1\x38\x70\x5c\xb7\x05\xb4\xd3\xee\x43\x4c\x0a\x71\xee\x18\xbf\xc1\x1b\x7c\xf3\x49\x98\xcb\x05\x1f\x65\x90\xe2\x86\xb2\x7b\x4b\x08\x77\x98\xe9\x61\x71\xa1\x38\xf0\xf8\x12\x88\x7e\x47\x24\xf6\xb7\xbd\x4c\xd8\xfe\x8b\x2c\x1d\x39\x81\xcd\x12\xf1\x5a\xd0\xdd\x51\x08\xa3\xcc\x1a\x83\xd5\xb4\x2f\x21\x09\xa6\x1d\x54\x4e\xb8\x4a\x3b\x4e\xcf\xda\x2e\x4c\x09\x4f\xa2\x73\xc6\xa3\x67\x2a\x3b\xdc\x6f\x2e\xa2\x35\xce\x93\xfa\xcc\x63\xfb\x95\x46\x07\x4d\x69\x05\x2a\x81\xb6\x33\x10\x1c\xdc\xb9\xe9\x17\xf1\xbf\xec\x5a\x25\x4f\xce\x04\x7c\xbf\x5a\xe0\xb7\x04\x10\x2f\x0f\xdf\x92\xeb\x69\x9d\x43\xd8\x50\x9b\x60\x9c\x4c\x01\xda\x53\x41\x71\xe0\x31\xc6\x7e\x11\xf7\x98\x6f\x68\x2e\x48\x50\x5d\x9d\x8f\x64\xd4\x8e\xc2\x6a\xb8\x28\x26\xcd\xbd\x59\x3d\x5e\xd3\x9d\x6a\x83\x35\x0e\xd8\x6e\x0e\xc5\x81\xe3\xc6\xb3\x4f\x09\x0b\xd2\x22\xf0\x1d\xaf\x4d\xc5\x6e\x7d\x3e\xac\xc8\x96\x22\x5d\x69\x7c\x27\x7e\x1f\x27\x6e\xe6\xa3\xa4\xcc\x6b\xe0\xa0\x2e\x28\x0e\x6e\x57\x47\x39\xe5\xbe\xcc\x73\xe7\x17\x16\x7f\xf7\x42\xdf\x46\x33\x24\x55\x86\x3a\xf9\xa6\xd2\x7b\x96\xd1\x92\x55\x39\xb6\xfb\x98\x2a\xc2\xb4\x83\x4a\xac\x57\x69\xd7\xbf\x9e\x3d\xb6\xa0\xba\xe5\xb4\x25\x44\xf4\x83\x35\xa7\xf9\xc2\xe7\xe9\xcb\x9c\xbf\x05\x17\x53\xea\xe1\x3e\x61\xc9\x16\x96\xe2\xb0\x6b\x86\xe2\xc0\xda\xc9\x30\x98\x64\x84\x35\x3d\x48\x7d\xac\xfc\xdc\x4b\x94\xc6\xfa\x21\xf2\x28\x22\xed\x5c\xd3\x8a\xf9\x6e\xee\x66\x79\xad\x5e\x24\xd0\xee\x09\x8a\x03\x8f\x71\xbb\xb6\x9f\x5c\x67\x92\xbb\x2c\x6e\x46\x7d\xcc\x6d\x0a\xc3\xc1\x3d\xcc\xd0\x0d\x57\xa9\x74\xe3\x0a\x9d\x50\x17\x3c\x02\x46\x5c\x58\x5c\x28\x0e\x6e\x55\x95\xd6\x2a\x39\xde\x89\x54\xf5\xad\x16\xbd\xe8\x74\x9d\xee\xf7\xb6\xd6\xdb\x5c\xef\xd5\xb6\x9f\xf4\x7d\xa3\x8d\xfe\x84\x3c\x38\x06\xac\xaa\x42\x70\x70\x27\x4d\xf8\xea\x6d\x37\x5b\x64\x19\xac\xd4\x75\x88\x4e\x72\xed\xbd\x34\x64\x7f\x51\x17\x7d\xe4\xe5\xe6\x93\x6a\x47\x76\xba\xe6\xba\x09\x33\x68\x50\x93\xfb\xab\x0d\x1a\xf2\x19\x1a\xce\xa8\x4d\x1c\xd9\x03\xb9\xd0\x6c\x9e\xea\xec\x82\x68\x23\xe6\xec\x16\xed\xa0\xda\x7e\xe2\x22\x02\x17\x29\x04\x4b\x98\xd9\x81\xe2\xe0\xcd\x0e\x1d\xf3\x68\xb8\x5c\x78\xcb\x03\xa6\x6f\x64\xdf\x87\x70\xa5\x49\x2a\x2c\x46\xdf\xa1\x7d\x33\xf1\x36\x09\x11\x2a\x55\xc4\xa4\x7f\x04\x8b\x0c\xc5\xc1\x1b\xb4\x88\xa4\x0f\xbe\x76\xd3\x17\xd2\x04\x4c\xcc\x53\x01\x19\xed\xee\xfc\x5a\x36\xc8\x9e\xb7\x7e\x3c\xf6\x2a\xad\x5d\x9e\x7d\xfa\xc4\x0b\x58\x9b\x83\xe0\xfc\xa5\x11\x10\x6e\xfc\x47\xe4\x76\xa1\x2e\x54\xdb\xb9\x60\x1b\x59\x89\x39\xe5\xbc\xdc\x52\x43\xbd\x2c\x2a\xfc\x42\xc5\x6c\x33\xf2\x45\x5c\x2b\xe5\xbb\x4f\x5e\x03\x06\x0d\xf5\xd4\x7e\x68\xf7\x4c\x26\x4e\x6b\xa8\xa5\x59\xb4\x5a\xeb\x5d\xee\xcc\xcb\xe6\x6f\xbc\xfe\x5e\x71\x0a\x34\x8e\x75\xa3\x02\x4c\xff\x1a\x34\x61\x87\xcd\xcb\xfb\x38\xba\x5c\x62\x8a\x6f\x8f\xbf\x20\x9a\xf5\x4d\x58\x7d\x14\x72\x5d\x15\xc9\xf2\x5a\xde\x7a\x2d\x6d\xdf\xe0\xf4\x0f\x6a\x5b\x30\x9c\xd5\x26\xbf\xf5\xc8\x4b\xef\x17\x2e\x55\x76\xa3\x9b\xda\xab\x08\xfd\x54\x9d\x9f\x5a\xba\x0d\x1e\x05\x1b\x8b\x0e\x15\xff\x6b\x06\x0d\xea\xd6\xfe\x31\x68\x12\x70\x06\x2d\x3e\x7f\xc8\x92\x22\x9d\xcb\x43\x78\x34\x7e\xee\xb5\xc8\xfd\x57\x3d\xa8\x0b\x77\x25\xa7\xd2\x2b\xad\x68\xd0\x53\xef\x24\x07\x22\x5c\x87\x41\x6b\x83\x33\x68\x1f\xa8\x25\x64\x04\xca\xbd\xbd\x29\xa4\xdb\x59\x8c\x2e\x30\x33\xb0\x09\x78\x26\x0c\x8c\xa5\x95\x4e\x1f\xb9\xd3\xf4\x7f\x3c\x1d\xb9\x96\xa5\x2c\x78\x83\xd6\x1e\xe3\x96\x11\xae\xfe\x4d\xf5\xf9\x2e\xc7\xcc\xc5\xfd\x5e\x91\x6f\xd9\x29\x8a\x82\x89\x1b\x58\x2f\xfb\x2f\x50\xe8\x05\x4b\x9c\xae\x65\x29\x0b\xde\xa0\x25\x4d\x50\xae\x63\xe6\x6f\xcf\xdc\x7b\x8e\x34\x5a\xf5\x38\x3d\x7a\x18\x9d\x8b\x93\x22\xa8\x8b\xf1\x09\x21\xc5\x8b\xc7\x63\x17\xf6\xd7\x72\xb7\xf0\x06\xad\x46\x8a\xa2\xdf\xf7\x4e\x01\xf2\xf1\xe0\xb0\x96\x88\x38\xa3\xff\x91\x3f\xc5\xa2\x01\x39\xc2\xdf\x7b\xe6\x03\x6f\xd0\x7b\x3e\x59\x5d\x9b\x41\x83\xfa\x0f\x5d\x95\xb0\x9c\xc3\x30\x1e\xf3\x19\x22\xe2\xde\x10\x4d\x50\xd8\x9c\x55\x14\xc8\x94\xe7\x8d\x59\xe5\x46\x77\x6b\x8b\x44\x9c\x20\x22\xb3\x07\x56\x4b\xa0\x38\x70\xc2\xe2\x63\x99\x5b\x78\xbb\x3e\x1a\x25\xc0\x84\xdb\x17\x80\x3d\x5c\x13\x15\x46\xf1\xb3\x3a\x3d\xaa\x43\x2a\xf7\xe7\xe5\x67\xfe\x2d\xa0\x1e\x0f\x8a\x03\x27\x16\x8f\x68\x5c\xb9\x10\xf6\xd3\x25\xaa\xd8\x0b\xd3\x8a\x7d\xbc\x94\xb2\x31\x85\x64\x57\x3b\x99\x35\xbd\x9f\x17\xbe\xe3\xbe\xf3\x40\x5f\x62\x28\x0e\x1c\xf7\xd4\xf0\xe2\xe5\xf3\x4d\x8b\xea\x75\x5a\xfa\x2c\xe5\x28\x16\xff\x72\xdb\x55\xd6\x79\xd3\x39\x6b\x6c\x1c\x72\xe9\x73\xf6\xc7\xc0\x51\x43\x50\x9c\xbf\x24\xf5\x7f\x8c\x83\xf0\xfe\xb9\xb1\xfa\xac\x59\x22\x5e\x4a\x1c\x6e\x85\x63\xa6\x47\x7a\x33\xcf\x9a\xb3\x74\xdd\x5f\x0b\x51\x4c\xda\x9b\x74\x39\xbc\xb0\xc9\x06\xd4\x93\x78\x95\x76\xf9\x6b\x7d\xdf\x16\x9e\xa8\x99\xe6\x1b\x2b\x6d\xe6\x7f\x7d\x99\x79\x9b\xf3\xcd\x7a\x00\x83\xa2\xc1\x6d\xb4\xb7\x09\x7e\x85\x3a\x40\x6f\x00\x28\x0e\xac\x1d\x52\xac\xcd\x31\x91\x76\x56\x8c\x82\xb3\x5b\x8d\xfd\xf7\x80\x0d\xcc\xf2\xb4\xa1\x91\x76\x62\xf1\x68\x39\x4b\xd2\x84\xcf\x6b\xc0\xe9\x9d\x50\x1c\xdc\xf6\x97\xba\x80\x6f\xdf\x79\xb9\x10\x7c\x64\x2a\xea\x2b\x62\xa2\x34\x7e\x92\x33\xb7\x7e\x29\x48\x8e\x11\x19\xc6\x2a\x58\xdf\x78\x0a\xd4\x7e\x42\x71\xe0\xb8\xb1\x98\xd3\x2f\x3e\x71\x2e\x7e\x2f\x31\x44\x3f\x0c\x8c\xc8\x69\x61\x0b\xfa\x3b\xe4\x2c\x78\x4e\x32\xb7\x2b\xbb\x1a\xf0\x35\x50\x13\x16\x17\x8a\x03\x6b\x67\xad\xfe\x6e\x31\xcf\x25\xd3\x17\x25\xfe\xf3\xda\xc3\xe4\xcc\x3c\xaf\x2c\x66\xe5\x67\x2b\xe6\x2a\x2a\xd9\x02\x39\xaa\x0c\x3a\x17\x30\xed\xa0\x5e\x67\x57\x69\x37\x25\x5a\xad\xf4\x19\x83\x86\xb0\xb3\xae\x5e\xfe\xe4\x6b\x42\x0f\x23\x95\x7c\x66\x5c\xec\xe7\xf7\x0a\x98\x71\x63\x2d\x42\xd5\x6f\x61\xd7\x0c\xc5\x81\xb5\x73\x41\x28\x6c\x45\xf1\x4c\x1a\x7d\x18\x1c\x5e\x61\x59\x7f\xf0\xd9\x8e\xf5\xf2\xac\xa5\xf7\x61\x58\x82\xd7\x07\x3b\xd2\xa9\xf2\xf7\x40\x6f\x2b\x08\x0e\x3c\xc6\x6f\xc4\x6f\x3f\x2c\xe8\xc0\x0a\xe0\xd9\xca\x2f\x25\xd6\x42\x4f\x3a\xe3\x91\xca\xa2\xf8\x2b\x1c\x2f\x48\x64\x77\x2b\xba\x6a\x0a\x78\x3e\xa0\x38\x70\xdc\xca\x10\xbf\x1f\x94\xa2\xb4\x55\xf8\xc9\xed\xa9\x8f\xee\xe2\xd6\xab\x26\x9a\x3d\x0e\x50\xb6\xcb\x3c\xee\x57\xe6\x18\x9b\xcc\x03\x3e\xb8\x40\x71\x60\xed\x56\xb8\xe7\x1d\x8a\xf4\x94\xe8\xce\x1b\xf0\xb6\xa4\xd2\x0f\xb8\x51\xac\x2b\xcc\xef\x75\x90\xc7\x7d\x25\x59\x97\x60\xb0\xc8\x5d\x82\x69\x07\x95\x13\xae\xd2\x6e\x7b\xff\xd3\xb1\x3c\x37\xaf\x46\x35\x02\xad\x15\x66\x6c\xb7\xb9\x8f\x59\x20\xa7\xdb\xed\xc3\x66\xb4\x1b\xb8\xf4\x8b\x93\x51\xc0\x09\xe6\x50\x1c\x58\xbb\x11\x2c\xad\xe0\x9f\x1a\x11\x71\xcb\x3f\x2c\x99\xf4\x3c\x74\xf8\xb3\xa6\x12\xdf\x3f\xb2\x28\x38\x95\x34\x34\xb3\xdd\x31\xa9\x04\xb6\x59\x43\x71\xe0\x31\x96\xe0\x0d\x39\xb0\x94\x3f\xf2\x93\x2e\x4f\xd6\x2b\xba\x30\x16\xde\x91\x76\x18\x66\x95\x21\x69\x1c\x7c\xab\xf2\xfc\x4f\x3e\xe2\x3b\x58\x5c\x28\x0e\x1c\xd7\x78\xa1\x3a\x18\x79\x54\x13\xad\x8e\xa5\xaf\xa8\x59\x36\x90\x35\x25\x04\xff\x3e\x31\x3d\x66\xc3\xbb\x30\xd4\xfd\x48\xd3\xd2\x57\xb0\xb8\x50\x1c\x58\x3b\xea\xe9\xd9\xb0\x69\xfe\x0c\xaa\x82\x65\x62\x1a\x7c\x94\x25\xb9\xaf\x3d\x2b\x13\x9f\xef\x13\x59\x59\x31\x2b\xfe\xe6\xa2\x67\xce\x84\x69\x07\x95\x58\xaf\xd2\x0e\xd7\x07\x9b\x57\x35\xf5\x43\xc2\x43\x36\x16\xd3\xaf\x4f\x77\xf9\xdd\x35\x90\xdf\xea\xd9\x94\xdc\xfa\xbc\x6f\x4c\xe8\x66\xab\x07\xd4\x1a\x43\x71\x60\xed\xd6\x42\xf4\x62\x3c\xf1\x06\x0b\x24\x6e\x24\x8b\x50\xce\x3c\x88\xa4\x96\x6d\x0a\x7b\x32\x28\x5d\xd9\xa8\x53\x23\xe5\x23\xa3\x7f\x13\x16\x17\x8a\x83\xfb\x20\x99\x72\xf0\xb4\x80\xb2\x22\x76\x8e\x6c\x84\x4f\x3f\x42\x0f\x5d\xaa\xc7\xf8\x56\x6b\x86\x46\x71\xc4\xbb\x09\xe9\x97\x94\xf7\x81\x9e\x59\x50\x1c\xdc\x3b\xb3\x00\x4d\x9d\xda\xba\xa4\xa6\x0a\x25\x48\x9f\x58\x48\x66\xd4\xe0\x76\x2c\x75\xb8\xf6\xcc\x1a\x5e\x19\x5b\xf6\x59\xea\x14\xb0\xeb\x00\x8a\x03\x6b\xd7\x27\x59\x86\xa2\xb6\xa6\xe0\x49\x4d\x18\xf0\x74\x44\x2c\xad\x19\x91\x9b\x6e\x35\x84\x6d\x90\x55\xf9\x55\x26\x95\xbd\x85\x24\x07\xcc\xa0\x41\x4d\xee\xaf\x36\x68\x5e\x11\xe9\xee\xb2\x12\x83\xbb\xc6\x1a\xd5\xdb\x8f\x98\x3b\x3c\x5e\xe6\x23\xd0\xf1\x18\x07\xe2\x8a\x34\x6c\x37\x7d\xa8\x9f\x0e\x86\x99\x1d\x28\x0e\xde\xa0\x35\x7f\x2e\xdb\x44\x09\x7c\x16\x27\xfd\x8c\xbc\xdc\xc3\x61\x77\xe9\x54\x96\x6d\x8c\xa3\x60\x57\xea\x95\x4a\xc0\x58\x0d\x22\xa9\x08\x2c\x32\x14\x07\x6f\xd0\x9c\x57\xfc\xdd\xa6\x87\xd6\xf4\x23\x94\x13\x90\x5b\x4d\xa9\x07\x87\x13\x31\xfa\x93\x72\xea\x31\xd4\xcc\x2d\xf8\x6f\xde\x36\xaa\x83\x45\x86\xe2\xfe\xcf\xa0\xfd\x67\x0f\x1f\x77\xd4\xa9\xd0\x98\x85\x10\x29\xfc\xc3\x4c\x3f\x1d\x2d\x55\xb5\xa8\x6e\x64\xf3\x68\x54\xdd\xef\xc3\x8d\x7a\xaa\x79\x9a\x3a\x37\x01\x83\x56\xbf\x33\x53\xf0\x95\x2c\xa0\x49\x05\x75\x47\x6b\x3c\x4a\x68\xf0\x4b\x00\x03\x26\xb7\x8a\xfd\x09\x6d\xa6\x7e\x4d\x35\x4f\x56\xd7\xbf\x06\xed\x73\xb1\x3d\x33\x7d\x65\xb9\x81\x03\xee\x30\xf9\x1a\xe2\x56\x4a\xb7\x89\xd5\x37\x9f\x0a\x8a\xf3\x3d\x21\xd3\xb5\x34\xd7\xed\x7f\x8f\xfe\x18\x7e\x64\xcd\x4b\xd5\x1f\x90\xdf\xac\xbf\x62\xdf\x87\x8d\xa2\xca\x3d\xdc\x19\x74\x21\x8b\x50\x1d\x61\x9e\x79\x70\x81\xcf\xe1\xf3\xbf\x66\xd0\xa0\x6e\xed\xdf\x1a\x34\x38\x83\xc6\x7f\x8f\x33\xe1\xbd\x29\xaf\x2f\xd6\x8c\x38\xd1\x5d\x8a\x3f\xf3\xd9\xe9\xd5\x02\x26\x0d\x01\x71\x64\xab\x05\xca\xa7\x6c\x1c\xe9\xd7\x61\xd0\x10\x94\xc1\xbf\xca\x2a\xd3\x73\xbb\x5b\x58\xf5\xfc\x4d\xb2\x8b\xf3\xa7\x87\x78\x31\x88\x2d\x8f\x97\xd2\x73\x0a\x59\x5a\x83\xfd\x6e\x7b\xaf\xd7\xd0\x5d\xcb\x52\x16\xbc\x41\x5b\x56\xc7\x5e\x12\x99\x10\xff\x64\xab\x60\xc7\x3e\x10\x32\xb8\xcf\x37\x15\x3e\xb6\xdb\x84\xaa\x13\xa6\x9d\x44\x27\x80\xcf\xfe\xe9\x5a\x96\xb2\xb4\xe0\x7e\x36\xaf\xb9\xa2\xab\xf0\x7e\xf2\x9e\xaa\xfb\x3b\x09\x6f\xef\xed\x32\x81\xbb\xdc\xaf\xb7\x75\x8b\xdb\x9f\x25\xde\xdd\x45\x18\xd5\xa8\xbc\x96\xbb\x85\x37\x68\x3f\x87\xa9\x1a\xea\xec\xcb\x6f\x2c\x2c\x26\x2a\xb9\xe0\xe8\x0f\x95\x12\x3d\x97\x17\x9c\x2d\xcf\xe8\x6a\x98\x5a\xbc\xf0\x48\xf0\xbd\x36\x83\x06\xf5\x1f\xba\x2a\x61\xf9\x13\x5b\xc9\xf6\x1a\x7f\x6a\x0d\x99\x93\x10\xfb\x58\x83\x21\x90\xde\x70\x07\xe9\x32\x7e\x5c\x3b\x37\x8d\x2f\xf7\x8b\xac\x64\x1f\xec\x45\x0d\xc5\x81\x13\x96\xca\xb1\xa0\xed\x27\xec\xfc\xc2\x0d\x3b\x84\x3f\x01\x66\x73\x9e\xe3\x08\x96\x85\x61\x84\xec\x0b\xb7\x8d\xa6\xef\xfc\xdc\xa6\xc5\x07\x56\x35\x20\x38\x70\x62\x79\xd4\xe7\x50\x9b\x86\xe8\x32\x8c\x69\x6d\xae\x3d\x39\xd1\xdb\xb3\x53\x74\xc0\x30\x66\xd5\x40\x28\x6c\x4e\x8e\xfe\xc0\x1f\x75\x12\x16\x17\x8a\x83\x2b\xc6\xe6\xd7\x65\xde\x51\x67\x35\x49\xe3\xe6\x14\x44\xcc\x45\xee\xc6\xa6\x7e\xe6\x42\x56\xa5\x89\x34\x42\xa5\xa0\x3a\x7e\x38\x8e\x09\x14\x63\x43\x70\xe0\xad\x24\xf9\xad\xef\xf2\xd4\x51\x33\xa5\x08\xb1\x6d\x23\xe3\x5a\x94\x25\xbd\xf2\x19\xbe\xbc\x99\xa4\xa1\xcd\x99\x16\x31\xec\xe6\x36\x7f\x00\x9b\x6c\x40\x3d\x89\x57\x7e\x0d\x7e\x83\x3a\x95\x40\xcb\x38\x91\x84\xf0\x07\x03\x29\xfb\x75\x67\xfd\x5e\xfd\xa4\x72\x67\xa5\x7d\x7b\x4f\x33\x36\xea\xb2\x1c\xd0\x04\x15\x8a\x03\x6b\xe7\x35\xe7\x6f\x3e\x7b\x32\x6e\x21\xc2\xc9\xac\xfa\x74\x8f\x3d\x42\x31\x6c\x99\xcd\x96\xab\xfc\x03\x5f\x53\xec\x80\xa9\xb7\x4f\x36\xb0\x75\x12\x82\x03\x8f\x31\xff\x8e\xb6\x14\x6f\x04\x4f\x9c\xc6\x76\x5a\x15\x6f\x1d\x66\x0b\xea\xdd\xd3\x0d\x1c\x4d\xfa\x98\x3c\x7a\x76\x12\x1e\x94\x5b\x5f\x81\xe6\xaa\x10\x1c\x38\xee\x9f\x1e\xf5\x3a\xf9\x9f\x5c\x3a\xd1\xbf\x8c\x63\x14\x08\xec\xa4\x8f\xc4\xc9\xc5\x10\x5f\x76\x23\xb7\x70\x16\x55\x06\x7c\xe7\x7e\x0d\x34\x57\x80\xe0\xe0\x9a\x20\x9c\xe3\xbd\x18\xb6\xb0\xf6\xe8\xe7\x17\xd2\x08\xb1\x7c\xc7\xd8\xfc\x6b\xca\xdd\xf3\x17\xa7\x65\xd9\x99\x2c\x3a\x55\x21\x82\x06\x4c\x3b\xa8\xd7\xd9\x95\x67\xab\x8e\x4a\x9c\x76\x1f\x6d\x48\xe4\x9e\x17\x55\x10\xda\x17\xde\x7f\x54\x7c\xae\x48\xae\x4c\x8d\x30\xd0\xe2\x4e\x17\xeb\xd4\xff\x10\x76\xcd\x50\x1c\x58\xbb\x78\xb1\x00\x34\x9b\xf4\x99\xa2\x2a\xfb\xe1\x35\x31\xdc\x86\xc5\xcd\x20\x8e\x7b\x93\x58\xfc\x02\x4c\x65\x15\x32\x69\xe6\x8b\xc0\x0a\x01\x14\x07\x1e\xe3\xd5\xd6\x39\x0f\x6a\x15\x84\xdb\xc4\xe9\xb1\xf1\x3f\x6e\x28\x1b\xee\x98\x24\x32\x1b\xa3\xa2\x46\x2d\xcc\xf3\xce\xfc\x89\x70\x98\x87\xc5\x85\xe2\xc0\x71\xa9\xf5\x90\x4f\xbf\x4d\x2c\xf2\x13\x28\xfe\x8a\x66\x2e\x2c\xd4\x8b\x7f\xb7\xed\x25\x1e\x5a\x98\x96\x63\x21\x7b\x12\x67\x13\x0e\xd4\xcc\x41\x71\x60\xed\xca\xe9\x90\xfc\x70\xf8\x54\x78\xdf\x4c\xa7\xb4\xb3\xf3\x39\x56\x12\x94\x84\x18\xb2\x3f\xd8\x8c\x09\x7b\xe3\x91\x46\xa7\x18\xb2\x06\xd3\x0e\x2a\x27\x5c\xa5\x5d\xcd\xc1\xaa\x31\xc5\x3d\x73\xa7\xc5\xc0\x42\x5c\x3a\x5f\x72\x3d\xdf\xfd\x47\x19\x8a\x43\x89\xc3\x25\x22\xdc\x3c\x6b\xf7\x1e\x2a\xc2\xae\x19\x8a\x03\x6b\xf7\xc5\x48\x8b\x46\x33\x62\xa4\xde\xfe\xbb\x4d\x6e\xc6\x79\x32\x91\x8a\xa2\xce\xc6\x4b\xe5\xbd\x7a\xf6\xa6\xc1\xd6\xd3\x16\x2f\x60\x3b\x1b\x14\x07\x1e\xe3\xb2\x69\x1a\xca\x44\xf2\x28\x23\x9b\xe4\xd0\x13\x5f\x49\x81\x19\xcf\xfb\x59\x14\x65\x25\xbc\x87\xd4\xf7\x34\x79\x32\xfd\xa4\x80\x06\x16\x50\x1c\x38\x2e\x5a\x79\x2c\xcf\x6c\x6e\x40\xe4\xd9\xc7\xdc\x4b\x05\x22\x65\xea\x3f\x3c\x5c\xf8\x2c\x99\xbf\xbd\xfe\x76\xbe\xe2\xfb\xe2\x89\xef\x0e\x8b\x0b\xc5\x81\xb5\xb3\x79\xa5\x36\x66\xcc\x99\x32\x40\x61\x38\xe8\xed\xc1\x88\x94\x5c\xb8\xc1\xe5\x6d\x35\x3e\x50\x4b\xcf\x80\xf9\x70\xee\x25\x69\x2e\x70\x3e\x27\x44\x62\xbd\x4a\x3b\x7e\x37\x62\x86\xf6\xa4\x47\xac\x4d\xbf\x05\xbe\xee\x2c\xe0\x71\x23\x1c\xbe\x6d\xa7\xd0\xc5\x7e\x31\x53\xe4\xe0\xd2\x85\x4c\x08\xd4\x52\x42\x71\x60\xed\x70\xe8\xbd\x09\x53\x1f\x2b\xfe\x98\xee\xff\x30\xe5\x83\x6b\xf5\xd6\xec\x2d\xb7\xce\x17\xeb\xef\x09\x05\x6f\x76\x70\x2d\xce\xda\xf8\x60\x71\xa1\x38\xf0\x18\xdf\xa3\x4c\x49\x1a\x7c\x85\x3a\x6d\x34\xd7\xbb\x76\xf4\x92\x62\x44\x50\xe4\x9c\xcc\x3e\xb1\x4a\xbc\x09\xaf\x41\x2a\x48\x9b\xc8\x12\x16\x17\x8a\x03\xc7\xa5\x79\x8a\x79\xbb\x81\x44\x56\x80\xf5\xa2\x7d\x82\xa5\x83\xfd\x87\x2d\x21\xdd\x44\x5e\x52\x9f\x52\xc0\x3d\x66\xa9\xb4\xb0\x29\x6b\x58\x5c\x28\x0e\xac\x5d\x3f\x81\x4e\x74\x6c\xb0\xbd\xca\xf4\x9b\x0b\x06\x37\x8d\x3b\x58\x43\x3e\x13\xef\x96\x97\x76\x9f\xfc\x18\xfd\x41\xaf\xef\x40\x3a\x0f\x33\x68\x50\x93\xfb\xab\x0d\x9a\xb3\xa4\xf3\x6f\x12\xed\x36\xa4\xa0\x71\x2c\xcb\x51\xfe\x5b\x53\x1c\xcd\x19\x34\x01\xd1\x32\x92\x6e\x2a\xd1\x2c\xbf\xf4\x75\x8d\x00\xb3\x03\xc1\xc1\x1b\xb4\x47\x32\xab\xfc\x39\x86\xcf\x88\x3b\x4c\x0b\xe7\xfb\x72\xad\x0d\xe8\x3a\xac\x90\x24\x5f\x4c\x74\xb8\x90\x25\x7a\x3a\x1f\x89\x00\xed\x47\xa0\x38\x78\x83\xe6\x27\x31\x22\x18\xb8\xf7\xe6\x72\x3b\x28\xe2\xd5\xfd\x29\x64\x85\x0e\x02\x06\x9c\x44\x71\xe2\x5b\x01\x29\xbf\xcb\x6a\xb7\xed\x33\x60\x91\xa1\xb8\xff\x33\x68\x78\xff\x11\x39\xf5\x89\x98\x9c\x5e\x1d\xab\xfd\x31\x93\x3e\xee\x4c\xe1\xfa\x73\xee\xf2\x9b\xd9\x11\xc4\x93\x5a\x93\x65\x4f\x8b\x16\xa3\xba\x58\x01\x83\xd6\xf7\x43\xb3\x85\x6b\x8a\xdd\xae\x80\xda\x57\xcc\x5d\x0e\x85\x0f\xe5\x4e\x06\xb2\x2a\x19\x7e\xff\xd7\x62\x46\x71\x8c\x1e\xcd\xcb\x7f\x0d\xda\xfd\x0c\xc9\x86\x21\x2a\xbc\x25\xb3\xc8\xd7\x6f\xc7\xbe\x59\x09\xcc\x1f\xa4\x69\xd8\x89\xb7\x2c\xb2\xa2\xb9\x1e\x63\xbe\xc0\x64\xf8\x07\xf5\x25\xc8\x8b\xf6\x28\xc2\x5c\xe6\x41\xa8\xff\xdd\x29\x2a\xe8\x31\xf5\xad\x82\x1e\x6b\x83\x23\x3e\xce\xff\x7d\x09\xe5\x73\x5e\xd7\xff\x35\x83\x06\x75\x6b\xff\xd6\xa0\xc1\x19\x34\xae\x99\x8d\xcd\x97\xac\xcf\x70\xf4\xd9\x8e\xdc\x4a\xe8\xa8\x4c\xa2\xe9\x7b\x1b\x62\x89\x55\xcc\xe6\x9e\x60\x60\x69\x44\x2b\xdb\x5d\x87\x41\x93\x80\x33\x68\x37\xd0\x79\x5f\x07\xa8\x0b\x3e\xb3\x62\xc3\xeb\x49\xad\xc6\xe3\xec\x2b\x90\x6e\x49\x4a\x73\xe1\x96\xe8\xe0\xf0\xbe\x55\x6f\x18\x70\x2d\x4b\x59\xf0\x06\x4d\xa4\x05\xe1\x39\x29\x62\xfe\xd0\x2d\xc7\xf1\xc1\x12\xdb\x77\x0f\x8f\x82\x90\x55\xc8\x8f\x63\x3f\xbd\x22\xe4\xbf\xc7\x67\x8c\xdc\x78\x2d\x4b\x59\xf0\x06\xad\xf4\x0f\xeb\x9f\xa1\x1f\x7b\xd1\x42\xfa\x77\x91\xf6\x13\x44\xef\xfd\x94\x4d\x40\x24\x6d\x7f\x7c\x42\xea\xf3\x23\xa0\xa3\x76\xe1\xed\xb5\xdc\x2d\xbc\x41\x9b\x63\x9e\x2d\xa4\xfd\xa5\xf4\xcb\x51\x42\x6d\x83\xeb\xc8\x8d\xa6\xb4\xdf\x49\xdb\x18\xcf\xb9\x47\xf2\xef\x97\x26\x6f\x3b\xc4\xc3\x6b\x33\x68\x50\xff\xa1\x2b\xb7\x5a\xed\xdf\xf0\x3a\xbc\x44\x11\x72\xf1\x32\xd8\xa9\x14\x11\x1b\xca\xf4\xc3\x54\x23\x5b\x72\x9b\x6b\xea\x8d\x91\x16\x9b\x60\x38\x00\xb6\x5a\x41\x70\xe0\x84\xa5\x65\x15\xf5\x41\x02\x67\x98\xfe\xf3\x33\xf2\x82\x5c\xa1\xbf\xcf\xeb\x93\x88\x1d\x73\x03\x5e\xdf\xd4\x52\xfc\x74\x43\x9a\x55\x00\xa8\x4f\x80\xe2\xc0\x89\x85\xb3\x02\x39\xea\xb8\x47\x30\x3f\xaf\xf4\xe4\xd5\x52\xf2\x2f\x1d\x5b\x39\x01\xdb\x09\x57\xa7\x5a\xda\x95\xb9\xd4\x98\xf5\x45\x60\xd5\x08\x8a\x03\xc7\x45\xe6\xed\x68\x9e\x1c\x98\x71\x46\x36\xc5\x94\xc1\xc4\xda\xa7\xe2\x0c\xf7\xd4\x5f\xb9\xb8\x8f\xc7\x40\x74\xb3\xc9\x9f\x19\xdf\x1c\xd8\x2e\x08\xc1\xf9\x4b\x22\x50\xff\x1b\xf7\x0e\xd7\x00\xdd\x67\xb7\x0f\x02\x49\x89\x9e\x02\x19\xb4\xf7\x1f\xea\x34\x54\x18\x2b\x7f\xcc\x7a\xa5\x5a\xbb\x84\xb1\xd8\xf0\x00\x68\x12\x02\xf5\x24\x5e\xa5\x5d\xa4\xd3\x73\xd6\x1f\x4d\x4c\x77\xfa\x1d\x3f\x3d\xc2\x7a\x7a\xaa\xc0\xb1\xfc\xb0\x79\x19\xdf\x2c\xa5\x5b\x81\x09\x85\xbf\xf2\x2d\x30\x16\x50\x1c\x58\x3b\x47\xad\xbc\x43\xf7\xcc\x9b\x97\x77\x1e\x3e\x13\x3f\xcc\x24\xfe\xdc\xf1\x29\x6e\xbe\xf0\x7c\x6d\x3a\x58\x4c\x70\xbf\x75\xe1\x13\x30\x69\x86\xe2\xc0\x63\xbc\x63\xfe\x3b\xf2\x61\x59\x33\x3b\x69\xc1\xf4\x01\x59\x09\x23\x33\x66\x94\x28\xc7\x5a\x1f\xfd\x53\xb4\x87\xf1\xda\x5e\x25\x2e\x6b\xb0\xb8\x50\x1c\x5c\x21\xfd\xbd\xfd\x59\x62\xc6\x58\x2a\xda\x27\x75\xf7\xd7\x45\xa4\x3b\x2b\x2f\x8a\x97\xf7\xef\xa1\x78\x3d\xb8\xac\xf3\xeb\xca\x40\x00\x0e\x03\x87\xe2\xc0\xda\xf9\xa3\x4d\xd7\xef\x24\xcc\x4e\x13\x11\xf0\xeb\x32\x56\xd1\x94\xf0\x3d\x0e\xdc\x1f\xbb\xfc\xc5\xb8\xfa\xda\xa0\x52\xf4\x31\x82\x0a\x4c\x3b\xa8\xd7\xd9\x55\xda\xe5\x11\x09\xab\x73\x08\xdc\x4f\x8e\xe8\x4e\xcb\x14\xf4\xdc\xdc\xeb\x6b\x1b\xb7\xaf\x44\xb9\xdd\xa1\x81\xf6\xc6\xd8\xfc\xae\x1d\x30\x41\x82\xe2\xc0\xda\xc9\x62\x48\xd4\xec\xb5\x18\x58\x8c\xed\x13\x9a\x3f\xfd\x35\x20\x20\xaf\x69\xd6\xb3\x93\xa4\xd8\x21\x26\x8e\x41\x38\x51\x9d\x9d\x0f\x8b\x0b\xc5\x81\xc7\xd8\x65\x9a\x06\xe1\xe2\x95\xfe\xc8\x54\x09\x83\x25\x1a\x0e\x7e\x5d\x8c\xd8\xea\x1f\x36\x46\xa1\x59\x91\xed\x58\xa1\x8f\xf6\x9a\xc0\x01\xf1\x50\x1c\x38\x6e\x08\xed\xed\x8a\xdb\xe9\x7e\xde\xc7\x1c\xdf\x3c\x37\x58\x59\xf5\x74\xe9\x22\x3f\xbd\x70\x6b\x09\x7b\xf4\x2b\x2e\x38\x65\x4b\x31\x1a\x16\x17\x8a\x03\x6b\xd7\x5f\xca\x32\x4d\x47\xa2\xf6\xe5\xe7\x90\xfc\xcd\xef\xd2\x1d\xd8\x79\xb3\x13\x24\xad\x48\x16\xa3\xeb\xf3\x17\xb7\x98\x9d\x16\x15\x60\xda\x41\xe5\x84\xab\xb4\x43\x99\x76\xf7\x70\xed\xd7\x5e\xff\x79\x87\xd3\x8c\x7b\x50\xf6\xaf\x6a\xde\xcb\xce\x0d\x2c\x99\x5b\x4c\x76\x44\xf7\x36\x77\x05\x00\x63\x02\xc5\x81\xb5\x0b\x5f\x46\x61\x1d\x56\x11\x4a\x15\xd1\x6e\xca\xcb\x68\x54\x11\xd5\x21\xe5\x1f\x26\x42\xcb\x79\x51\x82\x21\xb9\xcd\xd7\xeb\x66\x01\xd4\x68\x42\x70\xe0\x31\xa6\xd2\xaf\xf5\x4b\xc8\xa9\xfa\xf6\xec\x26\xeb\x67\x37\x99\x37\x2f\x0c\xd5\xbe\xb0\xdf\x63\x89\x1b\x09\xbe\xb3\x76\x2e\xd9\x84\x00\xac\xcc\x41\x71\xe0\xb8\xd6\x0f\x71\x9a\x3e\x39\x37\x77\x8a\x54\x71\xce\x6b\xcb\xba\x17\x3d\xc2\x59\x91\x8d\xaf\xb3\xfc\x6a\x10\xca\xd2\x45\xf0\x58\x15\x38\xd5\x07\x8a\x03\x6b\x77\xa3\xad\xf9\x13\xde\x97\x06\x0a\x1e\xc5\xa8\x8b\x70\xee\xa4\x33\x64\x26\xb5\xf2\xef\xd2\xed\xf2\x95\xca\x4d\x31\x0b\x35\x28\xfb\x30\xed\xa0\x12\xeb\x55\xda\x51\xc8\x6f\x6e\xaa\xa2\xb2\x3d\x3e\x7f\x8a\x83\xd3\xe9\x39\xaf\x20\x54\xea\xad\xa2\xf9\xd1\x0c\x65\x5f\xca\x19\x51\xa5\x23\x18\x58\x91\x82\xe2\xc0\xda\x89\xd5\x74\xa9\x15\x0e\xe0\xbe\x2f\x52\xad\xb0\xad\x49\xb1\x13\xef\xa8\x88\x25\xe0\x39\x53\xfc\x51\xa6\xbe\xa4\x80\xb0\x57\x04\x94\x0a\x40\x71\xe0\x31\x26\xb6\x33\x13\xf8\xe3\x26\xa1\xa8\xaf\xd9\x25\xbf\x3f\x8e\xe1\x16\x99\x4c\x1d\x4a\x8f\x90\xf6\x73\x19\x93\xc5\x11\x4b\xda\x1e\xa8\x55\x85\xe2\xc0\x71\x71\x74\x45\xd8\xc5\xfc\xa9\xdb\xfb\xcc\x5a\x62\x8d\xe2\x58\x6e\xbf\x97\x7e\x3d\x5d\xa3\xff\x5e\x89\xb5\x75\x61\x87\x65\x27\x02\xe8\xd4\x0b\xc5\x81\xb5\x73\x7e\xea\x3f\xa9\x5f\x90\x2a\x95\xec\x23\x32\xfa\xf7\xdc\x7f\x94\x79\xd9\x8b\x01\x7d\x48\x15\x7b\x68\x4b\xda\x29\x5c\xad\x5e\x01\x66\xd0\xa0\x26\xf7\xff\x1f\x27\x33\x24\x78\xe7\x1f\xd1\xda\xc4\x31\x22\x15\xa7\x07\x7e\x48\x9e\xe2\x57\x5a\x3f\xe0\x58\x45\xd8\xa2\x24\x48\x76\x31\x3d\xe3\xf3\x03\x4e\x66\x80\xe0\xe0\x0d\x9a\x6a\x56\xf2\xca\x9d\x63\xdd\xaa\x32\xc5\xe2\xb6\xef\x4d\xc5\xa4\x64\xfd\x2e\xdf\x72\x10\xbe\x33\xbc\x20\x09\xa2\xc1\x4e\xe2\xc5\x85\x45\x86\xe2\xe0\x0d\x5a\xb4\xb7\x2e\xca\x8c\xaf\xc3\x5b\x7a\xd7\x49\x4f\xbd\xe7\x1b\x6c\x67\x75\xf6\x59\xe4\x8d\x6f\xa6\x91\x98\x96\xfa\x32\x16\x5f\xbf\x80\x45\x86\xe2\xfe\xcf\xa0\xfd\x67\xc7\x4c\xd7\xea\x6c\xa9\xa6\x24\x44\xc9\x35\x11\x5c\x23\x8d\x52\xde\x9b\x47\x3a\x04\xb3\xf2\xe6\x49\xa2\x83\x01\x27\xb2\xbb\x85\xb8\xdb\x80\x41\xe3\xfe\xc8\x2b\xda\x2b\xd2\x16\x28\xc0\xa9\xf1\xc9\x5a\x34\x9d\xb6\x41\xc6\x90\x9d\xa6\x41\x4c\x3c\xde\xa7\xa2\x52\xa5\xab\x36\xf4\x5f\x83\xe6\x5b\xde\x63\x4e\x2d\x5c\x82\x82\xf3\x4e\x7c\x5b\x95\xe7\x8b\xd6\x60\xa2\xb6\x2d\xa7\x4e\xd4\x37\x91\x07\xbf\xbc\x3e\x1f\x3a\xb2\xfd\xfb\x01\xf3\x98\xb5\x81\x64\x2e\x92\x43\xe8\xc4\x03\xb7\xf2\xc5\x29\xa5\xcd\x45\xfc\xdf\x3f\x94\x39\xde\x62\x7d\x3a\x65\x36\x3b\x59\x34\xff\x6b\x06\x0d\xea\xd6\xfe\xad\x41\x93\x06\xcf\xe2\x85\x56\x7e\x9c\xd1\xe7\x92\x95\xd6\x63\x84\x3b\x30\xaa\x9e\x17\xfd\x46\x91\xc1\x35\x51\x7c\x77\xbe\x1c\x11\x23\xab\xdf\xf9\x41\xe7\x3a\x0c\x9a\x0f\x9c\x41\xcb\x4e\x6a\x27\x6a\x14\xaf\x8d\x0a\xb9\xf7\xed\xe6\x06\xd3\x81\x33\x29\xd5\x9d\x7b\x09\x24\xb2\xe1\xa4\xac\x28\xbe\xc7\xa2\xb3\xed\xd7\xb2\x94\x25\x0c\x67\x59\x14\x8d\x84\xb6\x1a\xc8\xea\xb7\xfa\x79\xf8\xab\x85\xc8\x84\xb0\x88\xf1\xed\x1c\x7c\xef\x11\x6c\x2e\x9a\x5e\xdc\x41\x9c\xeb\x5e\xbc\x96\xa5\x2c\x78\x83\x96\x39\xc3\x6b\xa5\x96\x54\xd1\xc6\x10\x49\x66\x6c\xc0\x4d\x97\x27\x7d\x27\x80\x58\x70\xba\x80\xcf\xf4\xd8\xc0\x40\x37\x77\x84\xed\x5a\xee\xd6\x11\xee\x67\x39\xb9\x69\xba\x8c\x6b\xa4\x37\xff\x1a\x20\x7d\xcf\xcb\x17\xdd\x21\x19\xf9\x9c\x9a\x87\x5e\x63\x93\x49\x3c\x40\x76\x6f\x79\xa5\xe3\xda\x0c\x1a\xd4\x7f\xe8\xaa\x84\xf5\x6a\x1a\xd9\x4c\x50\x8f\x51\xd2\xea\xae\x9b\xb3\xa5\xa2\x4f\x99\x8a\xe4\x5d\x23\xd4\xda\xec\x23\x5d\x6d\x5c\x6e\x5e\x25\x4e\x03\xa0\x8b\x1a\x04\x07\x4e\x58\x28\x33\x69\xb1\xaa\x0a\x84\xaa\xab\x53\x1d\x71\xa2\x9e\x49\xb7\xd7\x1f\xbf\x24\x7e\xa3\x15\xf5\x74\x66\x85\xac\x6d\xd0\x9d\x0d\x98\x8c\x43\x71\x70\xdb\xe4\xbe\x8b\x63\x11\xea\xa1\x89\x17\x96\x54\x30\xff\xcd\x6e\x08\xdf\xdc\xd0\x6b\xdb\xca\x1f\x34\x94\x95\x97\x93\x88\x0a\xdb\x05\x9a\x79\x40\x71\xfe\x92\x08\xe8\xff\xc6\xcd\xc6\xa0\x3a\x0f\x3c\x24\x8e\xaa\x7a\xcc\xe4\x5e\x9c\xd1\x72\x78\x90\x76\xff\x65\x2e\xa7\xb8\x6a\xf4\xd0\xd1\x44\x74\x3a\xe6\x6d\x58\x5c\x28\xce\x5f\xf2\x3f\xf7\x89\x3b\xec\x4d\x46\xd0\xf9\x33\x0e\x1e\x1a\xfe\xc8\x8a\x08\xda\x1a\xe8\x2d\x43\x5e\xc2\xed\x32\x95\xfb\x96\xf9\x83\x66\x35\x8f\xf2\x14\x36\xd9\x80\x7a\x12\xaf\xd2\xee\xe7\xe4\xee\x58\x2d\x6b\x0e\x0b\xa1\x20\x99\x3e\xee\x37\x9f\x36\x26\xbe\x07\xfa\xb9\x9d\x6b\xbb\x98\x27\xb8\xef\x52\x42\xb2\x7c\x80\xb1\x80\xe0\xc0\xda\x85\x45\x53\x66\xda\xff\x08\xa1\x9c\xbe\x47\xc5\x2d\x77\xd3\xdb\x8e\xa3\x61\xae\x8a\xf8\x91\x35\x7f\x0c\xdf\x47\x67\x9c\x2e\x6f\x60\x2b\x22\x14\x07\x37\xc9\x77\xb0\xe1\xb6\x2a\xd6\xa8\x4c\x8e\x90\x90\x77\x6e\x9c\x88\xf4\x64\x90\xd1\xdb\x7f\x80\x57\x59\x55\x19\x51\xef\x5f\xf8\xff\x3a\x92\x41\x71\x60\xed\x6e\xad\xec\x7c\x45\x4f\xbf\x1d\xf5\x98\xa3\xaa\x87\x64\x4b\x9b\xb7\x54\x21\x85\x8c\x75\x9a\xf6\xa0\x7c\x29\xdf\x50\x34\xce\x19\x30\xd7\x50\x1c\x58\xbb\x5c\x69\xfa\x7b\x5a\x51\x8f\x38\x67\x0d\xb4\x9f\x63\xa5\x32\x36\x3b\x77\xf0\x78\x84\x3d\x2a\xe5\x38\x44\x78\x2a\x44\x57\xd5\x4b\x0d\x74\xe0\x84\x78\x9d\x5d\xa5\x1d\xd7\xe4\x84\xdf\xf9\xd1\x7b\x0f\xbf\x63\x3a\x3f\xfb\x98\xc2\xf1\x5b\x3a\xf6\x14\x7e\xe1\xf1\xde\xae\xed\xfa\x4a\x71\xb3\x09\x79\xb0\x6b\x86\xe2\xc0\xda\x6d\xd2\xe2\x9a\x53\xeb\xb9\xb2\xd5\x7e\x68\x14\x7b\x88\x54\x9b\x7f\xc3\x1a\xad\xd1\xb2\xb1\xe1\x16\x96\xde\x7d\xa5\x97\xa5\x83\x40\x43\x08\x28\x0e\xac\x9d\xc2\x50\xa3\x6b\xb7\xdc\x4e\xb8\xa9\x03\xeb\x3c\x53\x9b\xcf\xa9\xbe\x33\xd9\x3a\xe5\xab\x0f\xc6\x83\x92\x04\x4c\x0d\x56\x31\x85\xb0\xb8\x50\x1c\x58\xbb\x99\x4d\xf7\xd3\x94\xa6\x62\x8e\x11\x14\xad\x1b\xd3\x77\xfc\x74\x88\xdf\x27\xd2\xf4\xb6\xfd\xf8\xf4\x99\xd4\xad\x55\x90\x2c\xc5\x1b\x16\x17\x8a\x03\x6b\x87\x3f\x8e\xd2\x1a\xd9\x2b\x2f\xfd\xf3\xf2\xbd\x0b\x4a\x4f\x9e\x66\xcf\x26\x02\xc3\xd3\x3d\x85\x4f\xb9\x81\xa4\xb3\x25\x92\x39\x4c\x30\xed\xa0\x72\xc2\x55\xda\xe5\xe8\x8a\x10\xb3\x62\xde\xbd\xb5\x95\x5c\xcc\xaf\x73\xc7\xbd\x0e\x81\x8c\xf9\x48\xca\x52\xe1\x86\x91\x69\xe1\x60\x73\xfa\x2e\xb0\x3d\x15\x8a\x03\x6b\xc7\x35\x46\xff\xfe\xf3\x01\x8d\x21\x0a\x62\x7b\x8a\x45\x75\xc5\xc1\x32\x93\xdf\xa3\x3f\x5a\x54\xaf\x2a\x02\xbe\x7c\xac\x7f\xdf\x0e\xec\x66\x80\xe2\xc0\xda\xcd\x44\xd9\x90\x6d\x08\x66\x90\x56\xf9\x63\x77\xb4\x8e\x6a\x36\x72\xa0\x8f\x1b\x04\xff\xa0\x92\x26\x1a\x5d\x7a\xce\x1d\xcd\xc7\x0b\x8c\x31\x04\x07\xd6\x2e\x2b\x37\xe2\x83\x7c\x98\x72\x8a\x08\x4f\xef\xc7\xe4\xd5\x5d\xbc\xf3\xfb\x91\x42\x7c\xb9\x12\x78\x89\x8c\xa8\xf6\xec\x46\xf7\x22\x80\x0f\x23\x10\x1c\x58\xbb\x33\x9f\x89\xf9\x09\x1f\xeb\xdf\xa9\xc7\xeb\x87\xf9\x49\x42\xcb\xaa\xdb\x3b\x68\xae\x47\x0c\xd1\x75\x71\xd1\x37\x2b\x44\x2b\x9c\x61\xda\x41\x25\xd6\xab\xb4\xb3\xac\x98\xf4\x78\x12\x3a\x38\xd3\xf0\x27\xa1\x96\x48\x96\x79\x4b\x52\x44\x64\x7a\x39\x4d\xc2\xe5\x1b\x9e\x4f\x7b\x8a\x7a\x0f\x50\xaf\x0a\xc5\xc1\x35\xe7\x09\x8a\x5e\x7c\x36\x4e\x7e\x31\x59\xfc\xfa\x87\xeb\xa0\xca\x50\x6a\xf0\x3d\x8b\x55\xf1\x68\x55\x82\xe1\x5c\x12\x16\x3d\x45\x1e\xa0\x39\x0f\x04\x07\xd6\x4e\xa7\x8a\xa5\xba\x6f\x4a\x93\x7b\xbd\x8d\x51\x57\x45\xf8\x28\xb9\xd6\x7e\xe0\x16\xf1\x17\xab\x44\x8a\xdd\xaa\xdb\x23\x64\x14\xc0\x6a\x2d\x14\x07\xd6\xee\x27\x97\x56\x9d\x86\x7b\x0f\xaa\xf4\x4a\x96\xfb\xf0\x67\x32\x6b\xdf\x46\x0f\x0b\x44\x04\xbc\xe2\xf0\x6d\x85\xe2\x7e\xe7\xf1\x1c\x20\x77\x40\x70\x60\xed\x32\x93\x3e\x25\x7f\xe3\x7e\x57\x74\xbb\x23\x7f\x77\x64\x51\x9a\x16\x3d\xb8\xbc\x61\x05\x3f\xaf\xd0\x7d\xc7\x32\xc1\x0b\xc9\x1d\x38\x3a\x0f\x6a\x72\x7f\xb5\x41\x43\x23\xaa\xff\x82\x51\xee\xb7\xf5\x27\x89\xc6\x76\xf0\x98\xdc\x3a\xd3\x71\x29\x0b\x99\x7b\xd6\xd6\xaf\xcb\xa5\x9e\x52\xc8\x51\x06\x66\x76\xa0\x38\x78\x83\x76\x5b\x53\x8b\x9e\x84\xce\x2d\xa4\xbd\x3d\x75\x0c\x5f\x13\xf9\x5e\x59\x11\x76\xa7\x65\xc6\x74\x84\x61\x46\x64\x3a\xee\xbe\x16\xb0\x79\x12\x8a\x83\x37\x68\x41\xe3\x8d\x16\x6c\x93\x14\x7c\x0d\x38\x21\x0c\x66\x3b\x95\xef\x5e\xcf\x10\x37\xdf\xbf\x65\xd9\x7f\xab\x96\x6a\x35\x77\x8c\x62\x09\x16\x19\x8a\xfb\x3f\x83\x86\x70\xe3\xdf\xc8\xfa\x38\xeb\x5a\xdf\xfe\x38\x6a\x39\xac\x89\x0d\x60\x86\xfe\x8a\xcb\x1c\x6b\x77\x74\xcd\xfc\xc8\xee\x24\x9f\x86\x6d\xff\x3a\x47\xf4\xff\x6d\x71\xf4\x3d\xf8\xfe\xd1\xff\x32\xe2\x44\x22\x2c\xcb\x9c\xbb\x7d\xb6\x2b\xe7\x82\x5b\x2d\xd4\x69\x84\xa4\xa2\xa9\x4d\x95\x5d\x97\xfe\x5f\x83\x96\xcd\xfb\x02\x85\x6f\xeb\x30\x7c\xcd\x94\x4b\xf0\xc1\xd2\x2a\xe2\x6d\xf7\x78\x56\x43\x42\xea\xf1\x3f\x24\x8f\x15\x65\x76\x05\xfe\x45\xdd\x79\xe9\x29\x36\x53\xbb\x16\x13\x91\xa5\x18\x47\x64\x0e\x68\xd8\x6c\x39\xd7\x25\x87\xd5\xcb\x3f\x2c\x7b\xfc\xf8\x91\x8f\x5b\xfb\xbf\x66\xd0\xa0\x6e\xed\xdf\x1a\x34\x38\x83\xe6\x29\x55\xc2\x92\xd1\x78\x82\x3f\xe7\x84\x7b\xd2\xf5\xe0\xe3\x5c\x58\x85\x9f\x87\x71\xe5\x0f\x35\xd3\x2a\xb9\x50\x4a\x19\xb5\xe5\xeb\x30\x68\x6d\x70\x06\x2d\x08\xeb\xf8\x1b\xed\xbd\xe9\x76\xfc\x7b\x1e\x8a\xca\xb6\x72\xdb\xd6\xf3\xcd\x4b\x19\x03\x6b\xfb\x8f\x4c\xa8\x3b\x67\xde\x48\x5e\xc3\xf1\x6a\x61\xd2\x12\xf0\x06\xed\xe5\x44\x8e\xdf\x9d\x42\x53\xf1\xf8\x1f\xf4\x67\x48\x61\xfd\x6f\x35\x30\xb6\xca\xff\x6a\xec\xe8\x3c\xc7\x30\x7d\xe4\x6b\x24\xf5\xf9\x5a\x96\xb2\xe0\x0d\x9a\x8a\xfa\x58\x4e\x68\x72\x45\x22\x8a\xff\x69\x2b\xe9\x47\xdb\x06\xd2\x4a\xa1\xa0\xa3\x9e\x17\xde\xcf\xf9\x83\x9c\xc8\xef\xb7\x24\x5c\xcb\xdd\xc2\x1b\x34\x52\x81\xa2\x5f\x88\x97\xa8\x7f\x33\xde\x3b\x3b\x0a\x31\x09\x7e\x38\xc0\xb6\x4d\xa9\xd6\x2b\x25\x2e\x7e\x45\x8a\x7b\x30\x2a\xbc\x7f\x6d\x06\x0d\xea\x3f\x74\x55\xc2\xba\xc5\x54\x11\x3c\x5f\x46\x1b\x6a\xcc\xf9\xfd\xae\x78\x68\x30\x69\x3e\xaf\xaa\xde\x72\x8c\xe3\x3b\xbf\x1b\xc3\x8c\xb6\x94\x3f\x71\x80\xc9\x2d\x04\x07\x4e\x58\x8b\xd6\x76\xa2\xaa\x46\xf2\xe2\xbd\x9d\x6c\x87\xad\x72\xea\x24\x5f\xd7\x4e\xa3\x2a\x27\xff\xc4\x3e\x88\xc9\x93\x47\x9e\xbf\xac\x83\xc5\x85\xe2\xe0\x26\x1b\x3c\xcf\x4e\x82\x53\x65\x6d\x79\xa9\x8c\xd2\xe6\x8b\x90\x84\x57\xec\xd2\x8e\x95\x68\x5b\xf5\x5f\x8d\x4f\x7e\xcd\x28\x77\x01\x5a\x5c\x43\x71\xe0\x84\xd5\x88\x6d\x39\x77\x38\xee\x5b\x8e\x4b\xc4\x79\x48\xc0\xea\xb8\x4e\x60\xe3\x2b\xfa\x2a\x97\x81\xad\x9b\xad\xd4\x60\x3f\xd1\x6b\x1a\x16\x17\x8a\xf3\x97\xfc\xcf\x6d\x08\xa6\x3e\x38\xfa\xf4\xa2\x2f\xa8\x1c\x12\xff\x62\x77\x13\xb1\xea\xb7\xb8\x14\x30\x4a\x65\xef\x7d\x14\x0d\x7c\x8d\xa3\x4f\x8e\x5c\x07\x9b\x6c\x40\x3d\x89\x57\x76\x93\x9b\x50\x4a\xb9\x24\xde\xe6\xa1\x1f\x7d\xac\x7a\x58\xe0\x57\x41\xae\xf4\x06\x5b\x40\xf2\x6c\x51\x2a\x64\x39\xa3\x35\x8b\x13\xf8\x0a\x0a\xc5\x81\xb5\x5b\x8d\xdc\x99\x22\xca\x8f\xb9\x85\x5c\xe7\x58\x5f\x67\xff\xdd\xee\x6b\xcd\xa0\xcc\x9b\xcf\x69\x11\xed\xb8\x42\x3b\xcd\xf7\xa2\x81\xaf\xcc\x50\x1c\x58\xbb\x51\xad\xb3\x1c\x02\xd9\x10\xc5\x96\x55\x42\x2a\x0a\x4e\xfb\x51\xd6\xa0\x08\xa7\x91\x77\xb5\x8f\x58\xfe\x0c\x1d\xb0\x34\x7d\x03\xb6\x22\x42\x71\x60\xed\x1c\x0a\xe2\x16\x0c\x59\x09\x59\xcd\x24\x5a\xc2\xf8\x1a\x3a\x84\x47\x68\xaa\x47\xee\xdc\xeb\x9a\x0b\xd7\x7e\xf4\xf8\x14\x33\x08\x38\x8f\x09\x8a\x03\x6b\xe7\xf1\x41\x13\x79\x5a\xf0\xd9\xb3\xae\xf9\x27\x53\x9c\x08\xbf\x6e\x6b\x61\x6e\x11\x71\xb7\xaa\xda\x9d\x13\x13\x92\xd7\x9a\x3f\x28\x80\x69\x07\xf5\x3a\xbb\x4a\xbb\x53\xf1\x82\x43\x6b\x17\xae\xd8\x50\xb3\xbd\xe0\x77\x69\x6a\x11\x22\x22\x47\xa1\x5b\x13\xb1\xf5\x5f\x89\x5c\x91\x09\x44\x9d\xef\x02\x35\x8f\x10\x1c\x58\x3b\xd6\x9e\x1f\x7b\xee\x0b\x7c\xea\x8e\x54\x4e\xf7\x6d\xcc\xd3\x85\x39\x91\x28\x4d\x95\x6e\xed\x71\x2a\x2a\x37\xab\xa2\x3f\x7b\x08\x74\x65\x85\xe2\xc0\xda\xe5\x8a\xdc\xfa\x9b\x99\xf1\x18\x45\xf3\xd5\xdd\x99\x31\x53\xc6\x6f\xab\xe9\x4f\x08\x52\x34\x5b\x7c\x05\x94\x9b\x3e\x52\x6e\xc4\x30\xc2\xe2\x42\x71\x60\xed\x18\x50\x4b\x9e\xb6\x9e\x39\x51\x30\xdc\xd0\x62\x98\xd1\x0a\x13\x73\x30\x68\x3f\x49\x4a\x1f\x7f\x2a\x1b\x98\x69\x7d\x3c\x3e\xf6\x08\x16\x17\x8a\x03\x6b\xa7\xec\xab\x72\xc8\x92\x6f\xc0\x91\xb7\xfb\xf7\xe3\x2d\x37\x97\x57\x54\xd4\x79\x05\x0c\xb8\x2e\x35\x47\x88\x78\xbf\xcb\x58\x1e\xdd\x85\x69\x07\x95\x13\xae\xdc\x75\x30\x80\x14\x2a\x68\xcb\x18\xf6\xd5\x5a\xe5\x2f\x91\xc9\xa8\x8c\xdb\x02\xad\xb7\xa4\x49\xd9\x27\xde\x47\xf5\x0d\x66\x4e\x03\x68\xc0\xae\x03\x08\x0e\xac\xdd\x46\xf9\xcb\x30\x79\xdb\x5f\xdd\xa6\xfb\xe7\xfe\x45\x7f\x32\xeb\x53\x53\x2b\xd2\xbe\xc8\xba\x74\x55\x54\xcc\x46\x91\xba\x92\xc4\xc2\xe2\x42\x71\x70\x8d\x58\xf6\xd1\x08\x39\x54\x06\x55\x88\xc8\xf5\x95\xdd\x99\xcc\x86\x47\x95\xaa\x35\x57\x6d\xac\x7d\xb9\x75\x94\xb5\x35\x15\xbf\x03\x67\x47\x42\x71\x60\xed\x88\x6b\x4a\x09\x11\xcf\xe2\x15\xf8\x8c\x83\x52\x88\x53\x3f\x78\x37\xd9\x0a\xa3\xe8\xdb\xe4\x5b\x22\x29\x6b\xc8\x66\x45\x7f\x00\x8e\x3c\x81\xe2\xc0\xda\xb5\x76\xe4\xd1\x9f\x94\xca\x46\x4c\x04\xee\x06\xf9\x2e\xfe\x4c\x79\x1c\xb2\xbf\x8f\xc2\xab\xc2\xcb\xc0\x81\xa3\x78\xa6\x2b\xcb\x0e\x34\x78\x81\x48\xac\x57\xae\x7e\x6e\xab\x7c\x92\x9e\x8b\xa4\x89\xae\x92\x19\xcf\xa4\x4a\x2a\xcb\x10\x6a\x1f\x33\xfe\xc3\x5d\xdc\xf5\x83\x52\x95\x8b\x8b\x19\x58\x91\x82\xe2\xc0\xda\xf5\xde\x60\xcb\x32\x9f\x38\xac\xcd\x29\xa7\x28\x65\xf4\x4c\x8e\x09\xbd\x99\xf9\x9c\xb5\x88\x2c\x73\x68\x8e\x99\x61\xde\x12\x71\x0e\x16\x17\x8a\x03\x6b\x47\xf6\x6a\x2d\x36\x78\x4f\x37\xac\xfc\x29\x85\x7c\xe5\x79\x8e\xc9\xa9\x39\x8f\xe2\x73\x43\x45\xcf\xfd\x8a\x72\x2a\xd7\xcc\x3d\x60\xdb\x2b\x14\x07\xd6\x2e\x6e\x70\x7e\x96\x89\x14\x5f\xba\x97\xea\xc8\xc5\x42\xa7\xee\xa7\x8b\x95\x53\x19\xca\x0d\x04\x5a\xed\xe5\x7e\xa3\x87\x77\x9f\x91\xc1\xe2\x42\x71\x60\xed\x32\x67\x96\xe4\x9e\x46\x17\xff\x52\x97\x78\xd2\xa4\x71\x7c\x7f\xa7\xae\xd7\x9a\x82\xfd\xe4\x75\x19\xc9\xd0\xa2\x31\x9e\x45\x8b\x31\xcc\xa0\x41\x4d\xee\xaf\x36\x68\x36\x84\xf7\xdf\xf0\xee\x2e\x7b\x28\xae\x9b\xf5\x9a\xa2\x07\x3e\x0d\x78\xe3\x9b\x40\x42\xe5\xf6\x5c\xf2\x99\xb8\xc9\x9e\x8c\x90\x00\xcc\xec\x40\x71\xf0\x06\x2d\xcb\x46\x97\x9b\xec\x17\xb3\xc1\xa8\xb1\xab\xd8\x69\xac\xff\xeb\x6f\x13\x72\x32\x74\x97\x0b\xa7\x41\xfc\xb6\xe4\x0d\x7e\x1f\xc6\x60\x91\xa1\x38\x78\x83\xf6\x89\x83\x9c\xf7\xcd\xa5\x77\x28\x99\x41\xf0\x4d\xe7\x6a\x5c\xfa\x37\x1a\x23\xcc\x2f\x0d\x68\x15\xce\x4e\x7f\x52\x18\x14\xb8\xbe\x85\x45\x86\xe2\xfe\xff\x06\xed\x3f\x9f\x6b\x8a\x92\x28\xe5\xa9\x73\x1d\x1a\x7f\x2f\x99\x9f\xf9\xf2\xcc\x66\x83\x44\x08\xf6\x7d\xd3\x85\x15\x3a\x97\xee\xb5\x3c\xe4\x96\x80\x41\xc3\xb5\x13\xcb\x67\xe8\x5d\xdd\x34\x7a\x71\xf9\xee\x66\x6d\x2e\x4e\x7b\x51\xc2\x97\x2a\x31\xe1\xa7\xa6\xd2\xb6\xd5\x01\xc1\x07\xff\xd1\xc5\x91\xbe\xb7\x2f\x48\xea\xce\xef\xb2\xb8\x55\x45\xed\x06\xa9\x10\xcc\x4f\x5c\x1d\xcb\x5a\xa8\x4f\xe4\x33\x30\x58\x84\xa5\x1f\xfe\xdc\xf8\x07\x9d\x8f\x8e\xd6\xc4\xec\xfa\x84\x41\x69\xfe\xa0\x90\xd8\x6c\xd7\x14\xab\x31\x21\xf6\x49\x4d\x9a\x32\x49\xd1\x65\x41\x78\xdb\x23\xdc\xff\x15\x83\xe6\x8b\xf2\xdf\xdd\xda\xbf\x35\x68\x70\x06\x4d\x1f\x3d\x09\x5b\x74\x49\x40\x1d\x4f\x6b\x74\xdc\xdf\xf0\x4b\xa7\x8c\xd9\x30\x32\x01\xd5\x4d\xbc\xf0\x0b\x84\x89\xd7\xca\x2f\x5a\xaf\x65\x75\x87\x13\xce\x3c\xf0\x92\xab\xe3\xf9\x05\xad\x5f\xe0\x93\x73\x3d\x0d\xa1\xde\xf2\x14\x36\x57\xad\x6b\x65\x2c\xce\x3e\x9d\x56\x1a\x63\x3a\xbd\xbc\x96\x3d\x8e\x3e\xf0\x0e\xcd\x95\xe8\x28\x44\xdb\x44\x59\x07\x45\x5f\x8a\x2e\xb8\xd6\xfe\xb9\x50\x85\xe0\xdd\xc4\x15\x83\xb0\xdf\xbb\x9e\x4c\x4a\x61\x77\xb6\xaf\xe5\x6e\xb5\xe1\x7e\x76\x80\x4b\x39\x38\x26\xf0\x5b\x2a\x2f\xe6\xad\xac\x1f\xa2\xbc\xfc\xca\xcc\xbc\xf3\x77\xb7\x70\x9c\x12\x38\x6b\x64\x12\x9c\xf6\xb0\xaf\xe5\x6e\xe1\x1d\xda\xb0\x42\x9a\xfb\x6a\x78\x98\x45\xd5\x03\x4d\xa9\x4a\x8c\x9a\xa4\xd9\xb9\xb9\x66\xb7\x84\xdc\x38\x6a\x89\xc6\x23\x4f\xfa\x62\xad\x6b\x73\x68\x50\x7f\xa2\xab\x32\xd6\xe5\x36\xfd\x32\x51\x03\x6b\x57\xd8\x9d\x05\xd2\x1d\x7e\x0d\x11\x0b\xe9\x95\xea\xfc\x18\x4d\x44\xd7\x1f\x43\x33\x91\x65\x46\xe3\xb0\x37\x35\x14\x07\xce\x58\xea\x62\xb5\x15\x52\x9f\x14\x45\xb7\x0c\x51\x7b\xaa\x83\x79\x18\x22\xf1\x5d\xdc\x9f\x30\xdf\x31\xac\x5f\x71\x63\xa0\x4e\x2f\x05\x8a\xba\xa0\x38\x70\xc6\x62\x7d\x8d\x36\xaf\xb0\x41\xf0\xb7\xbb\x25\x05\x39\xf5\xf0\xe2\xab\xf0\x93\x21\x44\x96\x59\x47\xf5\xa9\x91\xd3\x12\xc4\xa5\x53\x12\x60\x06\x0a\xc1\x81\x33\x96\x1e\xd9\xe0\xf1\xef\xf1\x81\x33\xbc\x6c\x4a\xcd\xaa\xaf\x7e\x98\x07\x1b\x24\xca\xad\x27\x75\xbe\xf8\xf7\x77\x13\x68\x18\x35\x80\x3d\x67\x50\x9c\xbf\xe4\x7f\x7e\xe6\x7a\x38\xa6\xc8\x41\x85\x64\xd3\x28\xdc\x21\x5e\xc6\x47\xde\xfe\x9d\xea\xbc\xd9\x85\xf0\xcc\x83\xae\x10\x8d\xb1\x85\x5d\x47\xba\x1b\x36\xdb\x80\x7a\x12\xaf\xd2\x8e\xcc\x98\xef\x1d\x73\x62\x93\xd5\x16\xc5\xea\x19\x1e\xc5\xa9\x5a\x3d\xdd\xc3\xd9\x2f\xb3\x7e\x19\xa9\x69\x3a\x6c\x56\xa8\x31\xc9\x40\xf6\x86\xe0\xc0\xda\xdd\x78\x18\x23\x2b\xf5\x50\x88\x18\xf5\x56\x88\x73\x8f\x2c\xa1\x09\xe1\x42\x94\x3d\x2f\x5e\x35\x4b\xb4\x84\x03\xaf\xa9\xa8\x1c\x16\x30\x03\x85\xe0\xc0\xda\x29\xf1\xf4\x3e\xcc\x3c\xfb\x39\x7f\x7c\x8a\xb5\x75\x97\xb6\xe8\x33\x06\x57\xbc\xf0\x5f\xe4\x9d\xd4\x73\x6f\xe7\x91\x61\x2f\xde\x34\x58\x5c\x28\x0e\xac\x5d\x29\x66\xbe\xf6\x0d\xe4\x20\x0d\x79\x7c\x5c\x14\x3e\xf7\x77\x48\xce\xf3\xb1\xf1\x8c\xfc\xe4\xb4\x6c\x51\x4b\xa3\xf2\xfa\xd2\x5f\x60\x71\xa1\x38\xb0\x76\x51\x6d\xa2\x33\xe9\x95\x4e\x45\xbf\x42\x18\x74\x45\xb4\x64\xf2\xfa\xe9\xcd\x5a\x89\xe5\x27\x56\x85\x9b\x84\x9e\xc7\xff\xde\xe2\x81\x69\x07\xf5\x3a\xbb\x4a\x3b\xf3\x4b\x7e\x8b\xc7\x76\x1b\xc8\x68\xb6\xc1\x51\x74\x76\xdf\x7b\x1f\xa7\xf2\x2a\x5c\xe4\xda\x86\x7e\x4d\xe2\x5d\x96\x73\x17\x04\x4e\x68\x86\xe2\xc0\xda\x15\xd5\x0c\x5e\xbc\xa9\x78\x95\xf5\x9e\xcc\x73\xb5\x58\x5f\x78\x24\x46\x67\xfa\x9b\x0b\xb5\x6f\xf1\x36\x53\xc6\x0b\x7a\x57\x3b\x60\x2c\xa0\x38\xb0\x76\xf5\x1a\x8d\xe3\x58\x5f\x2e\xfa\xde\x04\xef\x1e\x74\xc5\xc7\xc6\x9d\x37\x39\xae\xf3\x4e\xf7\x93\x9f\x2e\x1d\x21\x32\x62\xf5\xda\xc2\xe2\x42\x71\x60\xed\xf6\x84\x04\x43\x18\x56\x34\xd2\x11\x31\x62\xce\xe3\xf8\x5a\xef\x39\x4e\xec\x26\xca\xa5\xfd\x62\xa4\xb7\x98\x7e\xca\x92\xc6\x08\x2c\x25\x42\x71\x60\xed\x38\x04\x69\x2e\x37\xb7\x13\xa4\xeb\xb0\x07\x2b\x4c\xee\x6e\x52\x61\x1f\xea\xff\xa4\x73\xdd\x57\x9f\xfd\xfd\x80\xd0\xca\xec\x36\xb0\x74\x0d\x95\x13\xae\xd2\x4e\xc3\x46\x5d\x9d\x4e\x94\x61\x1c\x97\x0b\x39\x4b\xb1\x5d\xd8\x26\x85\xa3\x49\x5f\x84\xa6\xa9\xbf\x30\x86\xf7\x17\x4a\x99\x91\x0a\xec\x9a\xa1\x38\xb0\x76\x77\x7b\x5f\x39\x2f\x65\x12\xfe\x30\xb4\xf1\x9d\x7b\x95\xf4\xdb\x5c\x1a\x2b\x89\x25\xd8\x18\x1d\x93\x7d\x21\xf5\x55\x7b\x1f\x35\xa0\x1d\x14\x07\xd6\x8e\x4d\xc6\x26\x8e\xf9\xaf\xcc\x8d\x85\xfb\x9f\x38\x1d\xce\x37\xa2\xee\x50\x06\x13\x36\xbc\xef\x36\x71\xdf\x30\x24\xde\xa4\x89\x01\x5a\x65\x42\x71\x60\xed\x72\x87\x6f\x66\x2f\xa2\x4f\x92\x1e\xbd\x7f\xe7\x3b\x57\x96\xf9\x47\xe9\x87\x03\xf2\x83\x3e\x6a\xcd\xdf\x99\x3e\x73\x4f\x92\x54\x80\xd6\x85\x50\x1c\x58\x3b\x65\xa7\x09\x36\xfa\x3c\x9f\x44\x7f\x16\x11\x1f\x49\xfb\xb3\x1a\x92\x94\xe2\xdf\xa2\x1f\xa8\x4b\x8e\x35\x84\x3d\x67\x11\xc2\xca\x60\xda\x41\x25\xd6\xab\xb4\x5b\xe6\x30\xf7\xb4\xf1\xee\x28\xd6\x62\x96\xdb\xfe\x84\x14\x53\xc7\x3d\x22\x1f\x6a\x68\x61\xd6\xe9\x2a\xe4\xdd\x2f\x39\xf7\x18\x38\xd7\x01\x8a\x03\x6b\xc7\x7f\x52\x6c\xa1\x49\xd3\xb8\x8e\xf9\xff\x63\xee\xbd\xc3\xb9\x7c\xff\xff\x7f\x2b\x7b\x65\x4b\xb2\xb2\x32\x22\x49\xc8\x16\x11\x32\x93\x3d\x43\x28\x7b\xef\x99\x11\xc9\x4e\x46\x66\xc8\x5e\x59\x65\xcb\xc8\x5e\x19\x25\x44\xc8\xc8\x2e\xc2\xef\x78\x7f\x3e\x9f\xe7\x75\xf4\xba\x9e\x7e\x9d\xaf\xef\x71\xf8\xe3\xfd\xff\xed\x78\x70\x5e\xd7\xfd\x79\x3e\xce\xfb\x75\x9e\x8f\xc7\x49\x39\x7c\x41\x56\xca\xa3\xeb\x86\xb8\x70\xc1\x13\xc5\xfc\xed\xd0\x62\x72\xfb\x0b\x35\x0f\x37\xa0\xe2\x36\x00\x07\x7f\x77\xfe\x13\xb4\xe1\x29\x91\x57\x6d\xa4\xd6\x0a\x8e\xca\x92\x75\xac\x15\xb7\x43\x51\xd6\x33\xaf\x9d\xf1\x78\xc1\xe0\x7c\x1f\x85\x16\x2a\x20\x04\x71\xf0\x77\x87\x89\x1b\xd3\x3e\xbf\xe9\x7b\x43\xdd\xa5\xb7\xfb\x1a\x0b\x59\x77\x1a\xd7\xaf\x39\x2b\xe3\xe8\xf3\x31\x41\x3f\xab\xb3\x97\x74\xa1\x36\xb2\x20\x0e\xfe\xee\x0c\x71\xd7\x5a\x59\xfb\xae\x3d\x19\xb9\x57\xa9\x52\x5a\xf8\x83\x70\x6c\x67\x94\x9a\xfa\xd9\xeb\xdd\x9b\xab\xbf\x58\x1a\x15\x42\x16\x10\x0e\x0d\xb4\xba\x3f\xd9\xa1\xf1\xd7\xad\xf6\xef\xb5\x09\x12\x9b\xcc\xec\x74\x48\x88\xa3\x07\x4a\xa9\xa8\x84\x1b\xcb\x5c\xe5\x60\x22\xd2\x29\x2c\xcb\x27\xfb\x85\x70\x3b\x20\x0e\xd9\xa1\xf1\xd6\x52\x6c\xd4\x44\xbd\xff\x71\xeb\x26\x1b\xfb\x03\x3f\xcc\xc5\xa1\x48\x39\x09\x3a\xf1\xa0\x09\x05\x83\x18\x79\xf3\x77\x0b\xb7\x11\x91\x41\x1c\xb2\x43\xbb\xad\xfd\xae\x9d\x2c\xd5\x75\xf2\x79\xa7\x4f\x21\xb6\x89\x96\xa4\x1c\x8f\x02\x15\x9d\x9d\xf8\x16\xb6\xea\x0b\xbb\xf1\x1c\x7b\x32\x44\x64\x10\xf7\x3f\x0e\x8d\xf8\x1f\x9b\x73\xff\xf6\x22\x34\x11\xcc\xaa\xf4\x07\x9c\x84\xbf\xde\xe5\xbf\x5d\x9f\x74\x4b\xad\x63\xee\x52\x8a\xc0\xc9\xf2\x1e\x77\xc1\x0e\xb9\x54\x74\x10\x3d\xf2\xa7\x43\x5b\x23\x49\x4b\xb7\xaf\x74\xdf\x36\x7b\xc5\xdc\x20\xfb\xa2\x1b\x37\x4e\x9a\xa1\xb9\xe7\x6d\x79\xdb\x44\x8b\x7c\x38\x7f\x2a\x6a\xe2\x9f\xb9\x06\x95\xe6\xdd\xc4\xe0\x03\xa6\xd0\xd4\x29\x0a\x82\xb2\xf8\x11\xee\x9e\x67\xfc\x86\x8b\x01\x36\xe1\x7c\x14\xef\xcc\xe9\xb2\x23\xff\xdb\x1c\x1a\x68\x68\x7f\x16\xa1\x21\x39\x34\x63\xcf\x4c\xff\x3d\x6f\x4c\x11\x62\x0a\x96\x01\x1c\x82\x45\x5f\xeb\x1c\xbe\x95\xdc\xf1\xb0\xda\xf2\xc3\xbc\xb4\x5e\x3c\xb6\x85\x53\xd9\xde\x41\x76\x68\x9b\x67\xf9\x84\xdd\x6f\x4e\x9c\x65\x5a\xc9\xe0\xeb\x60\x2c\xa9\x78\x31\xe1\xc8\x3b\xdb\x10\xeb\x2d\x97\xb0\x80\xfd\xc9\xa0\xfc\x54\xfa\x75\x34\x22\x3b\x34\x33\xa6\x2b\x67\x4a\x50\x9b\x2f\xbc\xe5\xbb\xea\x26\xb0\x6e\x51\xb7\x93\x72\xfd\x86\xf3\x92\xdf\x57\x8a\x9c\x67\x32\xd8\x1f\x06\x3c\x4e\x65\xb4\xc8\x0e\xed\xf6\x92\x5e\x63\xda\x18\x1a\x06\x01\x4a\xbc\x5b\x2d\x25\x4b\x14\xe6\x59\xf5\x69\xde\xd9\x66\xe5\x43\x06\x22\x7a\x5f\x9d\x08\xa7\x53\x19\x2d\xb2\x43\x3b\x2f\x71\x34\x84\x93\xa5\xa8\x31\xdc\xf6\xb9\x0c\xe3\x02\x71\xbe\x4c\xf7\x2e\xb5\xe0\x5c\xed\x26\x4e\x26\xd1\x43\xe7\xb8\x9c\x53\x70\xdf\x3a\xff\x4e\x44\x27\x65\xac\x96\xbe\xc2\x64\x65\x1a\x55\x9a\x29\x67\x75\x7e\xcf\xa3\x26\xc1\x57\x11\xae\x04\x31\x42\xa4\xeb\x36\xae\xfe\x05\xdf\x0c\x2f\xa3\x41\x7d\xa2\x00\x1c\x3c\x63\xd1\x39\x0b\x3d\xd1\x08\x20\x7f\xfc\x65\x6f\xf7\x8c\x18\xe9\xd4\xd3\x12\x9f\xf4\x16\x8f\xda\x82\xfa\x50\x14\x8e\xb1\xe6\x12\x46\x2b\xa8\xf2\x01\xc0\xc1\x33\x56\x04\x57\x10\x65\xc6\x73\x05\x4c\x77\x3b\xd5\xb6\xd0\xe0\xe9\xbe\xfe\x4e\x9c\xd2\x81\x0b\xbc\x47\x46\xa3\x6f\x2e\xfa\x33\xf2\x7e\x40\xc4\x05\x71\xf0\x8c\xf5\x9d\x2a\x97\x57\x52\xdd\xd7\xe4\xdd\x4a\xb7\x81\xe5\xd3\x69\x9d\x43\x81\x6b\x86\x51\x61\xa2\x3e\x3a\x2e\x6f\x6c\x6d\x1e\x86\x43\xfb\x30\x20\x2e\x40\xf2\x9f\xb3\xe8\xcf\x7b\xd5\xde\xf9\x9f\x97\x19\x42\x3d\x05\x8f\x83\x07\xf7\x99\x23\x14\xa6\x08\xef\x2c\x24\x1c\xa4\xe2\x12\x30\xc6\x86\x3f\xa7\x46\xac\x36\x40\xbf\xc4\x93\xde\x9d\xbe\xf2\x71\xc8\x23\xbe\x14\x49\xc7\xd0\x15\x5c\x42\x3d\x36\x7c\xfb\xcb\x37\xbf\xa2\x91\x35\x90\x72\x28\x6b\x25\x7d\x33\xc5\x86\x9e\x05\x88\x83\xbf\x3b\x9c\x0b\x0d\x53\x93\xba\x83\x4e\x6f\x5f\xa0\x98\x71\xbd\x8a\x32\xe3\xf0\xaa\xb3\x72\x45\xb7\x4e\x57\x93\xa2\x64\xa7\x9f\x13\xae\x42\xc4\x05\x71\x48\xed\x3c\xf6\x9b\xab\xa3\x46\x94\x53\x16\x5d\x79\x2f\x91\x8c\xde\x99\x76\xb8\xd3\xc5\x40\xbf\x15\x34\xd6\x57\x9a\xc7\x6e\x42\x1d\x0e\x39\x3f\x10\x07\x7f\x77\x6d\x77\x66\x0b\x7e\x33\xa7\xe2\xbc\x55\x79\xba\xe4\xc9\x71\x85\xaf\x75\x2b\x4f\x4c\x4b\x20\xd8\xce\x28\x94\xa8\xcc\x22\xfd\x11\xb4\xaf\x0a\xe2\xe0\xef\x2e\xda\x7b\x71\xce\x89\xd3\xe9\x49\xe3\x0c\x4a\x43\x1f\xea\x75\x07\xf9\xf4\x7d\x3d\xbd\xde\xe7\x83\x38\x67\x0a\xe9\x97\x7e\x46\xe9\x22\xde\x1d\x68\x3a\x3b\xe9\xdd\x19\xbd\x18\xbe\x1b\x52\x9e\xd8\xe3\x2d\xb7\xd1\x2d\xe5\x4e\x79\xd7\x92\xec\xf7\x85\x7c\x7e\x26\x87\x67\x63\xc6\x2c\x77\xec\x30\xa1\xcb\x0c\x40\x1c\xfc\xdd\x9d\x1f\x69\x1b\x75\xcb\x17\xa8\xac\x88\x7b\x5b\x7d\xab\x27\x97\x64\xcc\x87\x06\xd7\xfb\x1b\xff\xf2\x90\x80\x73\xd3\x9d\x21\x11\x29\xa8\xca\x06\xc0\x21\x55\xad\xa4\xe1\x74\xf8\x6d\x18\x2e\xd7\xfb\xa7\xf0\x56\xa2\x3b\xef\x6c\xf4\xa3\x10\x09\xa2\xdd\x7f\x47\xfd\x99\xdd\x05\x8d\x7a\x1d\xfa\x32\x02\xe2\xe0\xef\xee\x41\x82\xb5\x98\xdd\x0b\x9a\xf1\x2d\x46\xce\xef\x76\x6f\xac\x22\x03\xf5\x52\x99\xb7\xf9\x2b\x64\xad\x22\xd4\x23\x1a\x70\xd3\xbf\x40\x95\x4c\x00\x0e\xfe\xee\xb8\x30\xc3\xde\x72\xcf\x7a\x90\xbc\x14\xee\x4c\xa6\xaa\xe2\x6d\x45\x27\xeb\x34\x7f\xea\x86\x27\x8f\x9a\x35\xe2\xfc\xea\xc3\x45\x03\xe8\x80\x2a\x20\x27\x9c\xf4\xee\xf0\xcb\x89\x76\x57\x55\xdc\xd6\x78\x51\xfd\xe6\xcb\xfb\xc5\x0f\xc2\xce\x2c\x14\x28\xc7\xb6\x65\xdf\x16\xfd\x51\xda\x9f\xa2\x95\x87\xf8\x9f\x41\x1c\xd2\x01\xd5\x4f\xd7\xbe\x10\xda\x7e\x7d\x37\xac\xa3\x8a\xaf\xd4\xb1\x11\x7a\x90\x71\x98\xfb\x54\x61\x0b\xbd\x9e\x9b\xf6\xb9\x28\xef\x02\x54\x55\x0a\xe2\x90\x1c\xda\x3c\x91\x09\x4d\xf5\xe3\xf6\xab\x1b\xb5\x12\x4d\x5b\xe2\xe3\xf4\xf8\x85\x0f\x86\xe2\x1d\x4b\x6e\x3c\x9d\x51\x38\x17\x88\x06\x5d\x92\x00\xe2\xe0\xef\x2e\xac\x4c\xf5\x4b\x82\x60\x18\x53\xeb\x37\xa3\x75\x6e\x6d\x33\xf2\xb7\x8a\x98\xba\x8d\xbd\x58\x82\xbc\xba\x9a\xc9\xaa\x1f\x4a\xa1\x5b\xf7\x40\x1c\xfc\xdd\x0d\x74\x84\x31\xbe\x1a\xf1\xbb\x50\x4e\xd0\x6a\x2e\x73\x41\x2d\xba\xe3\x35\x87\xfd\x3d\xb5\x17\xd9\x1a\xec\x7a\xdc\x71\xde\x79\xdf\x11\xef\x0e\x94\x58\x4f\x7a\x77\xc6\x22\x26\x1e\xc5\x8a\x6a\xb6\xa5\x5b\xb4\x1f\x2a\xd5\x75\xd2\xc5\x62\xa7\xbc\x71\xce\x57\x7d\x39\xeb\x71\xb0\x10\xf4\x35\xa7\x05\xf1\x3f\x83\x38\xf8\xbb\x53\x4d\xd3\xc5\x92\xe9\xa1\x1f\x97\xae\xdb\x3e\x22\x9e\xb4\x7f\x80\xd2\x1c\x4a\xbc\xf8\x46\xe9\xa3\x53\xc5\xfa\x52\x82\xfc\x24\xd4\x5a\x09\xc4\x21\x5d\x66\x10\x87\x33\x52\x7a\xcb\xaa\xed\x86\xcb\x17\x39\x32\x9b\x2b\x41\x7d\xfa\x87\xbb\x97\xee\x8a\xff\xba\x4a\x99\x69\x6e\x41\x88\xbf\x07\xb5\xfd\x01\x70\xf0\x77\x57\xb5\x85\x2d\x6f\x75\x0b\x25\x37\x3a\xb4\xa8\xb8\x84\xd1\x83\x97\xde\xa7\xe6\xfe\xe2\x78\xa5\x3e\x0b\x07\x45\x22\x55\xf5\x13\x0e\x44\x5c\x10\x07\x7f\x77\xb4\x5c\x61\xed\x72\xd8\x94\x51\xfa\x41\x7b\x0e\xe4\x79\xd2\x0e\x5d\x77\x51\x5f\xeb\x3f\xb3\xbd\x75\x97\xf6\x6c\xc0\x65\x12\x33\x57\x84\x43\x03\xad\xee\x4f\x76\x68\xb8\xdc\x77\x9e\x28\x5c\xbe\xd1\xf8\x49\x59\xae\x64\xb0\xcd\xad\xc3\x2b\x6e\x12\xeb\xde\x4c\xd0\xaf\x82\x68\x01\xd1\x2c\xa7\xc0\x71\x84\xdb\x01\x71\xc8\x0e\xcd\x51\xde\xb4\x4d\x13\x25\xc9\xfd\xbe\xbe\x1e\x99\x97\xd1\xb5\xe8\x23\x0b\xce\x3d\x3e\xf2\xcb\xf5\x63\x19\x75\xe8\xfa\xbe\x7a\xec\x88\xc8\x20\x0e\xd9\xa1\xdd\x20\xb4\xce\xd6\x09\x8e\x8a\x67\x59\x66\x25\xff\xa2\xe9\x9f\xb7\x56\xeb\xc1\xf6\xba\x5e\x70\x46\x17\x27\xbc\x86\xee\xb5\x28\x03\x22\x32\x88\xfb\x1f\x87\xf6\x8f\x5b\xe7\xfe\xf5\x4d\x68\x9d\xf7\x7a\xba\x69\xf2\x72\x4d\xec\x3f\x07\xfd\x4e\x5a\x16\x95\x1d\xc1\xac\xe7\x39\xdf\xf8\x7b\x59\x2d\xe0\xb7\xc8\xa4\x6f\xef\x8f\x3f\x1d\x1a\x3a\x03\xab\xf3\xf9\x22\x4a\x86\xf7\x7d\xf3\x64\x76\x46\xaf\x47\xbd\x31\xec\x2b\x88\x73\x82\xee\xfd\xd0\xbe\x9c\x6a\x7d\xcb\x40\xfb\xcf\x7d\x47\xff\xde\xf6\x76\x01\x65\xb1\x4d\x85\xf2\x4d\x2c\xc2\x24\xbc\x4b\x12\xeb\x66\x55\x1e\x92\x82\xd9\x66\x35\x3a\x6f\xd5\xdd\xeb\xff\xdb\x1c\x1a\x68\x68\x7f\x56\xa1\xdd\x84\xaf\xe2\xe3\x02\xc8\x18\xb7\x3c\x39\xb2\xe6\xa6\x9e\x4c\x33\x1a\xdf\xfd\xc6\x12\x15\xf2\x93\xbf\x3b\x3c\x5a\x66\x8d\xa8\x88\xf5\xea\x26\xf6\xa9\x6c\xef\x20\x3b\x34\x14\x97\x5d\xe6\x78\x97\x1b\x0a\x45\x3d\x2d\xdf\x8d\x8a\xf0\x89\x8e\x79\x15\xf6\xdf\xd9\xaa\x6c\x93\xa1\xfe\xe4\xa0\xc7\x73\x2f\x3d\x95\xcd\xac\x1b\x48\x7f\x76\xe9\xe6\x56\x70\xc3\x3a\xcf\x97\x3b\x39\x91\xc3\xf4\xde\x38\x94\x87\x42\x14\x19\xf6\x63\x8b\x26\x9f\xaf\x8b\xed\xf4\x57\xcc\x9c\x46\x53\x14\x69\x5f\x64\x87\x36\xd7\xf3\x86\x7a\xf4\xf5\x58\xdc\xc4\xf7\xb0\x21\x94\x64\x6c\x66\x4b\xb5\x76\x9c\x72\x37\xf5\xd4\x95\x87\x39\x29\x8e\xec\x9c\x4f\x4f\x65\xb4\x0e\x48\x7f\xf6\xd7\xa6\x39\xa7\x33\x76\x9a\x2d\xa1\xa1\x3e\x7d\x6e\x93\xd2\x52\xed\xda\xcc\xe6\xa1\x6c\x9d\x0b\xfb\x83\xf5\x30\xd9\xab\x53\x55\xa7\xe6\xd0\x40\x22\x3a\x29\x63\xa9\x12\xd7\x8a\x8c\x2c\xdb\x11\x8b\xc4\x8d\xe6\x35\x29\x29\x6d\x79\x9e\xf9\xc2\x16\xa8\x7d\x93\xe0\x87\x3c\xfe\xfb\x1c\x69\x16\xc8\xa1\x81\x38\x78\xc6\x72\x39\x48\xbd\xa5\x53\xcb\xdb\x73\x1e\x33\x77\x6a\x31\xb9\xe5\x55\xa1\x10\x1a\xc5\xdc\xa1\x9e\x76\x92\xf6\x41\xb8\x52\x08\x23\x74\x02\x0f\xc4\xc1\x33\x96\xa6\xb3\xe4\x99\x5c\x12\x1f\xe2\x2f\xc3\xd2\x3a\xbc\xef\x84\x8d\x8c\x3b\x55\xf1\xd7\x3a\xd9\xad\xd5\x6d\x85\xbf\xe7\x2f\x25\x41\x7b\x7e\x20\x0e\x9e\xb1\x2e\xc7\x1b\xa7\x98\x1c\xd8\xf0\x1b\x5c\xfc\xc1\x5b\xc2\x76\x9b\xef\xee\xbc\xb8\x84\x17\x6e\xa8\x9d\xa9\xab\x58\xd3\x75\x2b\x0f\xe8\xfe\x59\x10\x17\x20\x89\xe2\xfb\x67\xdc\x0b\x4d\x69\x59\x8d\xf3\xcc\x18\x78\xf8\x5e\x49\x66\x57\xd6\x36\x68\x75\xfd\xdc\x74\x5e\xeb\x1d\x7c\xf2\x6b\x35\xb9\x99\xc7\x55\xe1\x2b\xf3\xef\xb8\x00\x49\x14\x7a\x5f\xbf\xa0\xff\x99\x3a\x24\x51\xd0\x90\x84\xa0\xf3\xef\x7e\xd0\x27\x49\xe0\x46\xb1\x40\x91\x49\xf2\xee\xd4\xe1\xc3\x27\xda\x4f\x47\xcb\x56\xf6\x53\x2a\xdd\x50\x3f\x45\x44\x36\xa9\xe0\x1a\xb1\xf4\xe7\x40\x57\x48\x83\x38\xb8\x04\x4a\x5e\xf6\x4c\x99\xce\xfe\xec\xbf\x4c\xd8\x6d\x3c\xa6\xad\xbf\x7a\x6c\x4b\x2f\xa8\x3a\xfa\x66\x44\x03\xa3\x6d\xf4\xd9\xec\xb8\x00\x22\x2e\x88\x83\x4b\x60\xb6\xec\x7a\x0d\x2b\x3e\x4f\x5f\xe1\xc4\x78\xd8\x95\x79\xdf\x87\x19\xcf\x93\x53\xaa\xdf\x5d\x40\x13\x10\x53\xb2\x7f\x30\x8f\x0f\xdd\xf6\x05\xe2\xe0\x12\xd8\x6f\xc6\x93\x94\x0c\xd8\x8f\xa4\xb6\x78\xd5\x1e\x7e\x66\x21\x9a\x74\x35\x9a\xb6\xe5\x2b\xbe\x6c\xcf\x0b\x3c\x65\x01\x0e\x6e\xe8\x70\x27\x88\x83\x4b\x60\xbe\x8d\xf4\xd6\x7a\xc4\x93\x2e\x15\x8d\xb0\x8b\x8e\x19\xcb\x57\x78\xa4\xdc\x1d\xf7\x70\xa5\x39\x7e\xd0\xae\xf8\x44\x0d\xac\xd5\xfa\xca\xfe\x3b\xee\xff\x24\xf0\xbf\xf3\xf8\x5f\x34\x00\x9a\x5d\x4f\xd2\x00\x56\x0a\x9d\xee\x79\x2b\x4c\xde\x25\xda\x15\x8e\xe4\xab\xc1\xd3\xb5\x14\x67\xe4\x74\xb9\x84\xbd\x9b\x55\xe2\xc3\x5b\x44\xc2\x42\xa0\x9e\x7c\x00\x0e\xe9\xf0\x17\x1f\x2a\x75\xf3\x5b\x69\x02\xfc\xb9\xdc\x5e\x43\x61\xab\x5d\xfa\xd4\xea\x8f\x6f\x52\x51\xde\x13\xf9\xaf\x07\x58\xba\x18\x24\x42\x87\xbf\x00\x1c\x5c\x03\x45\x12\xbf\x95\x13\x06\x49\xd8\x15\xf6\x6b\x0a\xc7\x9c\xaf\xf9\xf3\x26\x1c\xed\x3f\x1e\x17\xc3\x39\x54\x77\x0e\xa2\xde\xd5\x64\x85\xb6\x4d\x01\x1c\xd2\xb6\x90\x92\x73\x9f\x64\x76\xfe\xbb\xe7\xb1\x36\x0f\x4d\x27\x3a\xb9\xd6\xfa\xe4\x48\x87\xdd\xd0\x75\xf5\xc9\xdc\xd2\xe9\x93\x04\xea\xa1\x6d\x21\x00\x07\xd7\x40\x04\x6d\x68\xa5\x5f\x91\x6f\xe5\xbb\xcd\x15\xdb\x78\x2a\x1d\x9d\xd6\x25\xa5\xa3\xe0\x3b\xf3\xbb\x17\x93\x38\x7a\x2c\x86\xfd\x0e\x11\x1a\x00\x71\x08\x0d\xfc\x4f\x52\xfd\x8b\x06\x40\xa9\xee\x24\x0d\x44\xc5\x7c\xa7\x56\xaf\xe9\x3c\xdc\x5e\x94\x13\x97\x1f\xe9\xe9\xd6\xc0\xd1\x0c\x8c\xd2\x70\xfe\xd5\xf7\x7c\xbc\xc9\x1d\x7d\x1e\x9a\xb2\x41\x1c\x5c\x03\xb3\x8f\x16\x05\xc4\x2c\xa9\x04\x13\xdc\xfa\x85\xa8\xb8\x29\x6c\x7d\x39\xb6\xae\xbf\xed\xa5\xcc\x0c\x7a\x3d\x5c\xfc\xe4\x46\x18\x09\xf4\x7b\x05\x70\x48\x7d\x24\x1d\x43\x29\x03\x58\x6c\xe2\x75\xdf\xad\xde\x79\xf6\xfd\x15\xca\xfc\x2b\x4b\x9d\xe8\x0c\xdf\xe8\xfa\x9c\x19\xe9\x4d\x2c\x9b\x42\x48\xb3\x00\x0e\xae\x01\xd4\x48\xd9\xab\x9f\x89\xd4\xf0\x2b\x12\x76\x9a\x7c\xae\x9a\x67\x6b\x72\xd1\x1e\x0b\xe1\x14\x5f\x95\xbb\x7f\xd5\x32\xf0\xdd\x08\xd4\x6f\x16\xc4\xc1\x35\x10\x1e\x53\xf9\x5c\x3e\x95\xee\x33\xd1\x6b\x2e\xdb\xfe\xa7\x2d\xde\x59\x3a\xf2\xab\xb3\x15\x45\xe1\x7e\x46\x5f\x7f\x2e\x69\xaa\x53\x20\x34\x00\xe2\xa0\x79\x40\xf3\xef\x1a\x00\xad\x3b\x4e\xd2\x80\x92\x5d\xe7\xfd\x11\x4d\xae\x96\x2b\xbc\xb1\xbb\xcf\x0e\xd8\x46\xe6\x5b\x7e\xf8\x95\x73\xde\x97\xb2\xfe\xd9\xad\xfd\x62\x92\x08\x4a\xaf\x20\x0e\xae\x81\x71\xfa\xd4\x16\xd9\xdc\xf9\xa7\x8b\x43\x5a\xf1\x0a\x9a\xa3\x67\xda\x94\xf2\x6f\x3e\xc6\xc8\x7c\xc9\xb2\xa6\x51\x71\xdb\xd9\x47\x13\x11\x17\xc4\x21\x69\xa0\xfc\xe5\xce\xfd\x91\xfc\x4c\xe5\x9a\x9d\x59\xea\x7a\xce\x7b\x5f\x6a\x83\x08\x06\xe9\x92\x5d\xcb\xec\x2a\x0f\x6e\xcc\x7e\xa6\x83\x34\x00\xe0\xe0\x1a\xd8\xa5\x44\x23\x7b\x25\xdc\x9c\xa0\x93\x59\x56\x82\xa7\xd7\xd7\x24\x64\x80\x59\x94\xbd\x7f\xc9\xba\x9d\xfa\xfe\x3c\x56\xff\x7b\xe8\x00\x2f\x88\x83\x6b\xc0\x06\xab\x61\xde\x80\xf2\xb1\xda\x80\x52\xa8\x8a\xf1\xcb\x94\xce\xc5\xf6\xbc\xe9\xf7\x0d\x97\x89\x8d\x79\x93\x65\xe7\x16\xa6\x3f\x22\x34\x00\xe2\xa0\x79\xc0\xe1\xff\x47\x03\x7a\xff\xce\x44\x9d\x6c\x84\x73\x99\xa5\xd3\x1c\xf4\x45\x55\x52\xa6\x2e\xe2\xaf\xbc\x4c\xe9\x79\x93\x7a\x94\xd3\x15\xd6\x71\x7e\x66\xf5\x7d\x19\x9a\x80\xbf\x17\xc2\x54\x82\x38\x64\x23\x6c\x21\x6a\x65\x6f\x1f\x12\xe6\x5a\x56\x5d\xe9\x9e\x43\xd9\xa2\xb8\x35\x7c\xc0\x5c\x12\x20\x97\xca\xeb\xef\x9a\x4e\xf9\x04\x7b\x13\x11\x19\xc4\x21\x1b\xe1\x46\xef\xab\x7d\x28\x4c\x4f\xa3\x27\xbe\x8d\x6a\x86\xac\x4d\x48\x09\x1a\xd6\x5c\xe7\x55\x17\x29\x7c\xc0\x4d\x85\xeb\x73\xdf\xbc\x15\x11\x19\xc4\xfd\x8f\x11\xfe\xc7\x3b\xfb\xd7\x37\xce\x5d\xc8\x21\x61\x4c\x18\x90\x3d\xc3\x25\x65\xbe\xc7\xf7\x60\x93\x29\x24\x66\xc3\xb4\xaf\xca\xda\x56\x4a\xe6\xfa\xf2\xef\x8e\xc0\x85\x3f\x8d\xb0\xfd\xaf\xc6\x9c\xad\xb3\x85\xf5\x9a\x05\x04\x98\xa2\xdf\xe6\xd3\xa7\xb6\xa8\x7d\xbb\x24\x3c\xb4\x9c\xdd\xd9\x6c\xa2\x7c\x7c\x71\xff\x40\x27\xd6\xd6\xcc\x3a\xc3\xa9\xac\x74\xb9\x6a\x8d\xcb\x69\xf2\x2a\x79\xa4\xa8\xb3\x46\xe3\x9f\x9e\x3f\xa4\xde\x78\xff\xf8\x37\x86\xf6\x7f\x9b\x11\x06\x0d\xed\xcf\x6a\x3f\x24\x23\xec\xd5\x95\x80\x76\x44\x9a\x9b\x4a\x9e\x97\xca\x22\xa7\xa2\xe6\xa3\xef\xe6\x18\x57\x19\x9b\x23\x2b\x55\xd0\xfc\xfd\xe3\xe4\x8d\x53\x69\x8c\xd2\x88\x6c\x84\x93\x6a\x2a\x78\x0c\xbe\x8a\xe1\x31\x73\x92\xf2\xef\xa4\xde\x18\xf8\x68\xfd\xba\x96\x93\x77\xdb\x94\x1a\x83\x9d\xc9\xb2\x5c\x99\xf0\x54\xf6\x0c\x91\x8d\x70\xab\xc7\x40\x54\x54\xcc\x8f\xc2\x0f\x4a\x5c\xf7\x7e\xce\x66\xbf\xd3\xd7\x98\x8b\xb0\x9f\x1b\x5d\x60\xb2\x2b\x3c\x73\xf5\xbd\x2c\xef\xa9\x8c\x16\xd9\x08\x2b\xf8\x96\xb2\x0f\xde\x25\xf1\x1c\x49\xc3\x23\x79\x79\xa6\xf9\x56\xe5\x80\xa4\x0b\x21\xc1\xfb\xb6\xca\x12\x06\x97\xc8\xb8\x73\xa7\x72\x62\x57\x1c\xd9\x08\x2f\x26\x4e\x04\xf3\x85\xba\x61\xf8\x3d\x08\x8d\x67\x27\x28\x5f\xd3\x5f\x8e\x6a\xaa\x9b\x49\x9e\x10\x72\x91\xd1\xbe\x8b\x62\x70\x0a\x37\xa0\xeb\xfc\x3b\x11\x9d\x94\xf9\x06\xd7\xb6\x03\xc7\xd7\x32\x9c\x66\x6f\x35\x14\x5b\xb9\x32\xc5\x1e\x30\xf2\xd8\x15\x85\xb8\xf1\x1c\xfa\x4d\xab\x79\xb9\x18\xfd\x44\xcc\xf8\x20\x0e\x9e\xf9\x52\xdd\x1b\xfc\x0c\x4c\xac\xf4\x04\x13\xde\xbd\x29\xdb\xbb\x5e\x6d\x43\xfc\x3a\xfd\x11\x21\xa7\x97\x53\x93\x4d\xaf\xf1\x35\x41\x28\x43\x81\x38\x78\xe6\x1b\xcf\xbe\x68\x20\x3c\x9c\x65\x19\xca\xf0\x66\xb6\x3b\xf8\x88\x42\xd2\x68\xb4\x50\xf3\x50\x6b\xaa\x5c\xbf\x52\x05\x95\xab\xf2\x18\xca\xa8\x00\x0e\xfe\x89\x95\x9a\xec\x59\x53\x78\x96\xa3\xbb\xcd\x4c\xf9\x70\xe0\x1b\x89\xb9\x31\x93\xab\x31\x66\x3e\xb2\x83\x73\x16\x26\x97\xfb\xe8\x4c\xa1\x6b\xcb\x40\x5c\x80\x24\xf6\x3f\xbb\x0e\x17\xbf\x46\x2b\xf0\x1a\xbd\x3e\x1c\xd6\x24\x9c\x20\x4b\x9b\x46\x1f\x82\x37\x60\xf4\x68\x92\x51\xcb\x68\x34\x92\xdd\x53\x3f\x17\x61\x84\x41\x5c\x80\x24\x0a\xda\x7f\x8c\xb0\xf8\xdf\x8d\x30\xe8\x07\x7d\x92\x04\xb8\x2c\x5b\x0a\x24\xf7\x73\x78\xf2\x51\x16\x47\x4c\x3e\xeb\xa5\x84\xb8\x0c\xf2\xfb\x1a\xb2\x36\x31\x16\xe2\x55\x8c\x07\xa7\x6b\x41\x3b\x19\x00\x0e\x2e\x81\xd5\x0b\xb6\xe2\xea\xb7\xfa\x93\x9f\x5b\x15\x76\xea\xca\x8a\x27\x16\x57\xb8\x6f\xf6\x60\x79\x05\xd1\x91\x3d\x37\xfc\x36\xe5\x09\x55\xd6\x80\x38\xb8\x04\xe4\x30\xf2\x62\xcb\x1e\x18\x69\xd7\x1a\xaa\xa4\xb9\x99\xde\xcf\xad\xed\x65\xa6\x5b\x35\xaf\xfa\x30\xb4\xb5\xe1\x97\xd4\xe0\x36\x8b\x88\x0b\xe2\xe0\x12\x30\xe2\xd9\x72\xcb\x27\x53\x7e\x1c\x87\x8d\xca\x29\xdc\x9e\x55\xea\xc8\x69\xc0\x31\x3d\xb9\x55\x19\x79\x25\xca\x61\x02\x2f\x05\x13\xda\x3d\x04\x70\x70\x09\xbc\xd6\x14\xf4\x0b\x5d\xa2\xc7\x3f\xa0\x60\xd1\x6d\xd6\x2f\xac\x2c\xfe\x1d\xf6\x78\xc1\xeb\x6c\xb3\xae\xca\xf0\x7c\xea\x3b\x9c\x55\xc4\xe2\x07\xc4\xfd\x9f\x04\xfe\x77\x1e\xff\x8b\x06\x40\xb3\xeb\x49\x1a\xe8\xb9\x32\x35\xba\x39\xfa\x85\xf2\x13\xf1\xdd\xef\xb4\xaf\x77\x9c\xdd\xba\xf5\x37\xb1\x5f\x3e\xb9\x34\x5e\xcc\x40\xee\x55\x84\x13\x8c\x18\x3b\x88\x83\x6b\x20\x99\xf8\x9d\x01\xa5\x89\xdc\xd1\x6d\x5d\x41\x96\x22\x2f\xff\x61\xbf\x82\xfa\x92\x67\xe6\xc2\x19\x6e\x34\x7b\xfd\x37\x1e\xc6\x64\x20\xe2\x82\x38\xb8\x06\x4a\xae\x10\xf8\xde\xf9\x40\xea\x2e\x9e\x69\x73\x63\xb7\x72\xbd\xed\xeb\x19\x17\xb7\x4f\xe5\x8a\x47\x29\x02\xbd\x3f\x76\xd8\xae\x43\x67\xe1\x40\x1c\x5c\x03\x76\xae\x2c\xdb\x9f\x99\xa3\x4b\xd9\x1f\xc7\x3c\x11\xc3\x2e\x64\xf3\xa2\xc4\x36\xbe\x78\xa8\xa8\xf5\x69\xe9\x4a\xd6\xd3\x4e\x4a\x6e\xa8\x72\x14\xc0\xc1\x35\x30\x46\x44\xd1\xfd\xeb\x37\x61\x68\x44\x44\x7d\x18\xf6\xc6\xcd\x06\x71\x2f\x09\xb3\x59\x7c\x95\xb5\x7d\xb5\x28\xdf\x01\x42\x81\x06\x84\x06\x40\x1c\x42\x03\xe2\x00\x23\x0c\x4a\x75\x27\x69\x60\xfb\xe7\xb5\x12\x27\xdd\x7d\x17\xba\xdf\x28\xde\x5f\xea\x88\x9d\x25\x7e\xb6\x48\x98\x30\x8f\x25\x51\x92\xd3\x0d\xd2\xc8\x25\x41\x1f\x82\x40\x1c\xd2\x55\xe7\xa5\x7a\x79\x1c\xed\x75\xf4\x32\xe3\x7a\x91\xf3\x66\xf3\xa1\x4f\x3f\x11\x64\xa9\x09\xdd\x52\xb6\xce\x4c\x29\xa4\xf5\x77\x86\x7a\x49\x82\x38\xa4\x5b\x42\x5f\xf0\xcd\xd5\x15\xe0\x5e\xa9\x55\xdf\x7b\x60\x39\xa7\x8d\x7d\x6d\x7c\x5a\x4a\xc1\x37\xcc\x2b\xa4\xee\x27\x4b\x70\xe3\x76\x11\x54\x31\x0b\xe0\xe0\x1a\xf8\x10\xbc\x12\x4f\xfb\x51\xe5\xdb\x0f\x17\x0e\x83\xf9\x39\xc2\xc2\xe7\x98\x3c\x53\x02\x44\x9a\x9f\x6d\x84\x32\x14\x38\xd3\x2f\x42\xbb\x83\x20\x0e\xae\x81\xee\x72\xa1\x1f\xad\x92\xac\x71\x75\x22\x02\x65\x44\xb1\xf9\x62\x87\xc5\x3d\x33\x57\x8a\x2e\x77\x6d\x07\x70\x3c\xa6\x7c\x7c\xa0\x86\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\xad\x3b\x4e\xd2\xc0\x94\x46\x67\xb9\x48\xb5\x98\x6a\xbf\xeb\xba\x98\x81\x0e\xf3\x7b\x73\x0a\x53\x97\xde\xb6\x86\x83\x5f\x61\xa3\xf7\x82\xd5\xae\x8d\x22\xc6\x0e\xe2\xe0\x1a\xe0\x4e\x21\xa8\x3a\xb0\x19\x21\x7b\x41\xb6\xc7\x9f\xe3\xef\x32\x7a\xc9\xaf\x36\x85\x49\xe4\x11\x2f\xd9\xc5\x77\xdc\x85\xbd\x4c\xd0\xc7\x56\x10\x07\xd7\x00\xeb\x9b\x27\x99\x73\x63\x9d\x0d\x09\xb8\x5b\x77\xe4\xf3\xd3\x84\xb4\xb0\xad\x69\xec\xf1\xf3\xc4\x24\x30\x9e\xac\x69\x3f\x98\x93\x86\xaa\x85\x01\x1c\x5c\x03\xae\xe4\xa5\x7a\x28\x37\xe2\x0f\xbc\xae\xbc\xce\x6c\xa2\xcc\x89\x79\x21\xfc\xf0\x58\x21\xbf\x26\x16\xbf\xfc\x46\xe3\x58\x21\x3f\x34\x0f\x80\x38\xb8\x06\xcc\x1c\x99\x62\xbe\x59\x28\x04\x94\x07\x69\xe1\x57\xae\x7b\x4e\x50\xa7\x08\x9c\xa9\x62\xe2\xd1\x5a\xea\x76\xf5\x96\x31\xbe\xf9\x0e\xa1\x01\x10\x07\xcd\x03\x00\x23\x0c\x32\x51\x27\x1b\x61\xd2\x19\xfb\xd2\x81\x19\x2a\xf3\xdf\x8f\x05\x32\x07\x09\x4c\x8b\xb0\xe9\x24\x49\x3c\x0b\x8f\x5f\x71\x5a\xfc\x14\xdb\xf0\x3c\x63\x84\x30\x95\x20\x0e\xd9\x08\xa7\x5c\xae\x22\xef\x2f\xfc\x80\xef\xb4\x5c\x4c\x2e\xa5\x85\xc6\xe2\xb4\x2b\xd4\xdd\xca\x1f\x5a\xbd\x1e\x50\xfc\xd8\x3b\xf1\xc2\x2d\x44\x64\x10\x17\x20\x8d\x82\xfd\xcf\xc8\x6b\x3c\xb3\xfc\x41\x94\x31\x17\xad\x4c\x7e\x0f\xd4\x6a\x0e\x1d\x35\x5c\x36\x38\xbc\x4c\xf1\x31\x68\xe3\xf3\xa5\x96\x43\x06\x0d\x1f\x44\x64\x10\x87\xfc\x34\xfe\xf5\xcd\x7e\xfe\x6a\xdb\xb7\xfd\x4c\xc2\x0c\x83\x0a\x84\x30\x28\x26\x8f\xd9\x0e\x5e\xa9\x4c\xa6\x1d\xf7\x2e\x29\x78\xf2\x9d\xb9\xf6\x13\x73\xe0\x4f\x23\x7c\x46\xfe\xf5\x61\x92\x8e\xab\xaf\x1d\x61\x28\x85\x89\xa6\xcd\x37\x2e\xf9\xf5\x7b\x58\x96\xf4\xf9\x0c\x45\x7c\x56\x92\x46\x17\x34\xff\x40\x83\xd7\x2e\x52\x57\x38\xe0\xa6\x7c\x93\x35\xbe\x7c\x39\x3e\x79\x9f\xdf\x81\xe3\x09\x9a\x93\xc0\xb0\xe6\xb8\xa4\xdc\xaf\x8d\x39\xba\xff\x36\x23\x0c\x1a\xda\x9f\x55\x95\x48\x46\x38\x8a\x39\xd1\x71\x65\xd5\xf3\x76\x82\xd4\x19\xc2\x81\x9c\xfe\x68\x8b\xa7\x1e\x84\x45\xcf\x03\x35\xae\x4c\x2a\x09\xee\x28\xcf\x9f\x4a\x4b\x16\x14\x5e\x24\x8f\x96\xed\x9a\xb2\x70\xb4\x42\x50\x5b\x89\x5a\xbb\x3f\x35\x74\x36\x43\x10\xbd\xb1\x69\xd2\xfc\x62\x88\x69\xd4\x08\x59\xfd\x24\x05\xdf\xa9\x6c\xcd\x22\x1b\x61\x6e\xc7\x6a\xe9\x97\xf6\x13\xbf\xa4\x74\xe9\xa2\xba\x6e\xf9\xa6\xb1\xf2\x50\x6c\xef\xfe\x66\xed\xf5\x79\x70\x3e\x2b\x60\xfb\xf8\x54\x2e\x41\x47\xb9\x87\xf4\x67\xb9\x0a\x33\x7f\xfd\x0a\xb8\xe5\xa7\xa5\xbd\x36\x73\xeb\x71\x80\x94\xa9\x1a\x9d\x85\xd2\xd3\xea\xaa\x48\x7f\xa9\x7e\x79\x0c\xf2\xd3\xd9\x76\x47\x36\xc2\xe3\xb8\xfb\xa9\x45\xa3\x7a\x79\x73\x76\xc6\x32\x8e\x29\x63\xc5\xe6\xec\x9a\x38\xb8\x21\xf8\xdc\x9d\xed\x71\x6e\x1f\x8c\xb7\xa2\x4e\xcd\x08\x83\x44\x74\x52\xe6\xbb\xc8\x6e\x67\x4d\xaa\x9a\xa9\xbd\xaf\xac\xbc\xd1\xeb\x48\x38\xa1\x16\x6b\xdc\xa4\xb3\x4c\xa9\x2e\x7d\x3e\xd3\x9d\xf7\x9e\xec\x45\xc4\x8c\x0f\xe2\xe0\x99\x8f\x43\xb7\x81\x23\xdc\x44\x47\xe4\x67\x6e\xdd\x68\xd7\xb5\x56\x4a\x77\xb7\xa7\xb9\xeb\x34\xee\x43\xf5\x58\x7a\x29\x9f\x0a\x53\x6b\x10\x71\x41\x1c\x3c\xf3\x31\xaa\x44\x08\x28\x2d\x9f\x29\x37\xbe\xd0\x64\xf9\xde\xe5\x5b\x94\xb2\x68\xb2\xbb\xfc\x80\x99\x41\xeb\x2b\x99\x7b\x13\x2f\x8b\x0f\x11\x71\x41\x1c\x3c\xf3\x99\xe3\xec\x66\xa1\x2a\x36\x2f\xbe\x91\xcb\x63\xa2\xd5\xb9\x3a\x15\x47\xaf\x69\xb3\x60\xf7\x1a\x5d\xf1\xee\xa5\x1b\xb3\xea\x0f\xec\xa1\x86\x75\x00\x0e\xa9\xa3\x38\x4e\xf7\x32\x53\xe1\xa3\x6f\x99\x85\xb4\xc7\xfa\x9d\x4e\x37\xc4\x1d\xad\x9e\x31\x89\x1a\xe6\xb7\xcf\x68\xfa\xd4\xd7\x2b\x56\x22\x8c\x30\x88\x0b\x90\xa4\x47\xf9\x8f\x11\xf6\xfd\xbb\x11\x06\xfd\xa0\x4f\x2c\x12\xb3\x7f\x7b\x11\xb7\xa7\xd0\x51\x7a\x2f\x5e\x6e\x19\xad\x59\x9d\x3c\xb8\xd4\xfd\x57\xfb\xc0\xf4\xd0\x44\xd1\x79\x9b\x78\x11\xa8\xe8\x0a\xc4\xc1\x87\x1e\x74\x24\xf1\xf8\x99\x4b\xd2\xf7\xdf\x32\x9b\x69\xcc\x3c\xf8\x9f\x9e\x95\x12\xf5\x5f\x8e\x6c\x15\x65\xff\xf4\x4a\xaf\xaf\x31\x68\x11\x11\x17\xc4\xc1\x25\x70\x56\xa1\x64\xfd\x53\x79\xf5\x43\x9d\x9a\xc2\x5e\xad\xd4\x23\x87\x59\x02\x4e\x95\x9b\x2f\xb5\x71\x3a\x6b\xc9\x65\xbc\xfd\x42\x25\x11\x71\x41\x1c\x5c\x02\x05\x5f\x6e\x72\xc4\xe0\x71\x4f\x63\x2c\x61\x58\xf7\xd8\xe2\x7a\x5a\x0c\x6d\x1b\x10\xcd\x8c\x8a\x26\xad\xe2\x25\xab\x9f\xd5\x83\xfa\xbc\x82\x38\xf8\x73\xd8\x47\x65\xe9\xb6\x79\xde\xd2\xe0\x60\xcc\x1d\xa7\xd8\x76\xcf\x73\x3e\x82\x36\x64\x27\x8c\xee\xfa\x84\x48\xce\x18\xea\x3d\xd9\x33\x88\xc5\x0f\x88\xfb\x3f\x09\xfc\xef\x3c\xfe\x17\x0d\x80\x66\xd7\x93\x34\xc0\xef\x43\x5f\x9c\x62\x12\x49\x78\x66\xaa\xa8\x4a\xa0\x2a\x95\xac\x70\x0b\xad\x98\xdc\x76\x9e\x6a\xe6\x9b\xa2\x83\xfd\x31\x35\xd4\x72\x05\xc4\xc1\xc7\xde\x9d\xe4\x47\x40\xe9\xac\xf9\x22\x24\x38\x8c\x97\x5a\x0b\xd5\xd5\xd5\xb7\x6a\x28\xfb\xd9\xb5\xda\xc3\x6f\xb8\xec\xf4\xed\xe5\x14\x88\xb8\x20\x0e\xae\x81\xb8\x5b\x99\xa6\x2d\xe5\x3d\xe5\xad\xc5\x86\x29\xa6\xbf\x5f\x6e\x52\x3a\x2b\x5b\xdf\x59\x9b\xae\x38\xda\xad\x24\x4f\x9d\xf6\x26\x84\xda\x76\x00\x38\xb8\x06\x9e\x37\x30\x29\x39\xc7\x6f\x5d\x2b\xee\xdf\x6b\xae\xf4\xdb\xea\x5e\x78\x21\xf7\xf5\x1a\xab\x46\x98\x35\xde\x82\xb5\xc4\xde\xfc\x5d\x44\x5c\x10\x07\x7f\x0e\x7e\x26\xab\x77\xae\x58\x88\x7c\x97\x4e\xd1\x10\x7c\x8e\x3b\x73\x77\x43\xd2\x7d\x0a\xd3\x16\x6d\xd8\xe0\x56\xc0\x12\xb5\xf8\x51\x01\x42\x03\x20\x0e\xa1\x01\x5f\x80\x11\x06\xa5\xba\x93\x34\x30\xe0\x27\xdb\x7f\x8d\x6e\xb6\xc2\x28\x80\x32\xb3\x6b\xcf\xaf\x78\xf9\x31\xe5\xb9\x3a\xff\xf6\xe4\x99\x31\xcb\x4e\x21\xc5\x0f\x50\x21\x3c\x88\x43\xba\xe5\xd5\x5d\xf6\x65\x70\x2c\xbe\x7d\xb8\xaa\xaa\xdf\x9b\xfb\x58\xf5\x0f\x35\x8b\x3d\xf5\x42\x72\x87\x0d\xde\x63\x3e\xf8\x42\x9e\xa7\x8f\x88\x0b\xe2\xe0\x1a\x48\x29\x2f\x46\xd7\xeb\x65\xc7\xf2\x0d\x5e\x7f\x24\xb0\x6a\x2c\x6c\xb7\x50\xc7\x15\xf6\x4c\x5a\x30\xd8\x5a\xfb\xd2\xa2\x34\x09\xf4\x0d\x17\xc4\xc1\x35\x60\x35\xf4\x90\x5c\x6a\x16\x63\x7b\x74\x8d\xc0\xe7\xe3\xc1\xef\xf3\xe4\xd3\x8d\x83\x23\x0e\xf4\x95\x83\x7c\xf1\x9a\x77\xab\x8e\x76\x10\x71\x41\x1c\xfc\x39\x74\xb2\x05\xf0\x1d\x75\xa9\xe3\xbf\xd1\xe1\xde\x3c\x0c\xf0\xd8\x28\x48\xcd\xbc\xf4\x45\x0e\x1f\xe3\xd1\x4c\x4d\xba\xd0\xaa\xe4\x10\x42\x03\x20\x0e\x9a\x07\xee\xfd\x5d\x03\xa0\x75\xc7\x49\x1a\xd0\x54\xb5\xc0\xac\x4d\xe2\x6a\xa2\x93\xcc\xa8\xe7\x7e\xec\xb9\xbf\x34\x76\x6f\x19\xd3\x72\x7e\xd3\x7f\xc3\x21\x7f\xc0\x3a\x6b\x0d\x3a\x70\x05\xe0\x90\xc6\x6e\xd3\x24\x19\xbe\x3f\x2e\x8c\x8e\x53\x98\x27\xcc\xf3\x61\x67\x82\xfe\x9a\x45\x81\x7b\x5a\xa3\x45\x2c\x23\xd5\x8f\x76\x0f\xe8\xc4\x09\x88\x83\x6b\xa0\x34\xf3\x77\x03\x3e\x33\x89\x63\x67\x79\x65\x4f\xd3\x61\x8f\x7a\x59\x38\xce\x33\xab\x88\x4c\x4a\xb6\xee\xfd\xbe\xfb\x92\xb1\xcf\x10\x71\x41\x1c\x5c\x03\x9e\x38\x52\x46\x0e\xda\xc9\x91\xa6\x92\xfa\xac\x71\xfa\xb7\x0b\xef\x32\x2a\x2b\xfb\x39\x7c\x10\x3a\xb7\x26\x44\xd1\x8f\x4e\x07\x95\x1c\x81\x38\xf8\x73\x70\xfa\xe4\xb8\x6f\x70\x6f\xe5\xe1\x87\x19\xaf\x2b\xbb\xe5\x24\xe7\x05\xe5\x83\x18\xc3\x0a\x9f\x35\xa9\x33\x28\xa4\xe4\xb7\x3a\x2d\x22\x34\x00\xe2\xa0\x79\x00\x60\x84\x41\x26\xea\x64\x23\x9c\xff\xce\x36\x22\xb2\x9e\xac\x6d\xa2\xc8\x35\x74\x4f\xd0\x97\xa7\x86\x43\x29\x2f\xb7\x56\xee\x42\xf7\xef\x14\xc1\xd2\x9d\x7a\x19\x84\xa9\x04\x71\xc8\x46\xd8\x0c\xcf\xd2\x25\x83\xc1\x49\x77\xe7\xdc\xe0\x20\x9d\x6f\x30\x13\x99\x99\xb9\xe8\xf2\x5e\x46\x40\xe7\xa6\xb0\x59\x3e\xd3\x58\x19\x22\x32\x88\x43\x36\xc2\xa8\x9f\xbd\x7e\x13\x7c\x45\x17\xd9\x75\xfd\x9e\x30\x5c\x6c\xc7\x44\x9b\x16\xc2\x42\x40\xf3\xc2\x06\xe3\x40\x58\x2d\x35\x40\x0e\xea\x59\x0b\xe2\x02\xa4\xb1\x61\x4f\xe3\x5f\xdf\xa0\xd8\x6b\xdb\xfc\xa9\xe7\x26\xea\xa1\x86\x16\x5e\x9b\x14\x0b\xbf\x54\x6f\x80\x70\xc5\xad\x7b\xa1\x74\xa1\x6f\xec\x54\x5b\x85\xfe\x79\x34\x3a\xa6\x3b\xdf\xb2\x6d\x5d\xf5\xee\xd8\xb3\x0e\x95\xf3\xa1\x38\xf9\x94\xee\x83\x72\xe7\x95\xd4\x15\xa4\xc5\x6f\x88\x30\xfd\x68\x72\xfd\x03\x25\x16\xcd\x77\xb6\x6d\x1e\xa4\x7f\x2f\xd3\x3b\x49\x96\x6f\x40\x37\xf7\xf9\xc2\x8f\x4e\x5d\x1d\x74\xca\x95\x89\x50\xd3\xe5\x90\xf6\xff\x36\x23\x0c\x1a\xda\x9f\xc5\xab\x48\x46\x38\x58\xfd\xea\xa1\x39\x73\xfa\x75\xee\x1a\xce\x06\xd5\xbb\x09\x12\x87\xad\x97\x87\x38\xdd\x6b\x44\x69\xeb\x70\x4a\x29\xf3\x06\x72\x4f\x65\xb3\x12\xd9\x08\x8f\x07\x7d\xd4\xab\xc5\xab\x4f\x2f\xa4\x7d\xd1\xa6\xb9\x9c\xf2\xe2\x35\x71\x2c\x8a\x6e\x08\x51\x7c\xe0\xb9\x6b\x06\x5f\x2d\xa5\x0f\x4f\x65\x6b\x16\xd9\x08\xaf\xd7\xbf\xc0\x9d\x29\xe1\x66\xaf\x11\xf0\xfe\x81\x91\x38\xfd\x2d\x7f\xc6\x06\xe3\x1b\x0d\x53\xa2\x35\x6a\x02\xcb\x99\x33\x97\x1e\x9d\xca\x68\x91\x8d\x70\xcc\x32\x23\xcb\x1a\xaa\x69\xc9\x5e\xce\xcb\x2c\x1b\x63\x6b\xde\x81\xc7\x49\x1e\x34\x16\x18\x4c\xeb\x0d\x4c\xf8\xa5\x83\x1e\xca\xa7\x32\x5a\x64\x23\xbc\xfc\x8a\xca\xd7\xf3\x26\xfa\xb2\x6e\xc5\x2b\x5b\x33\x9a\x2d\xaa\xac\x96\x46\x6f\x1b\x8a\x1f\x23\x57\x3e\xa0\xbc\x94\xf9\x91\x7d\x0a\x0f\x59\xe7\xdf\x89\xe8\xa4\xcc\x37\xd2\xd9\x18\xb6\x15\xf6\x8a\x4b\xc7\x82\x68\x70\x3f\x49\xea\x6a\xf5\x75\xd4\x67\x03\x78\x5b\x4d\x3f\x6e\x8c\x75\xb7\x6d\xe9\xde\x40\xcc\xf8\x20\x0e\x3e\xe3\xb3\x14\xfd\x1e\x26\xfb\x46\x30\x1a\xca\xbb\xca\x22\x6a\xe9\xe0\xff\x90\x3e\xd4\xa1\x39\x26\x72\xa3\xe2\x8c\x9e\x12\xdb\xf4\x24\xd4\x2a\x03\xc4\xc1\x33\xdf\x75\x9f\x6d\x2c\x9b\xc6\x6b\x53\xbc\xe7\x62\x6a\x6e\xfa\xbe\xf1\x45\x63\xf4\xef\x24\x31\x0e\xc9\xe1\xc3\x4b\x22\x6e\xfb\x78\x08\x35\x8c\x04\x71\xf0\xcc\x77\x6b\x6d\x96\x9b\x2d\x7a\xa0\x80\xc5\x49\x68\xe4\x3d\x1f\x9b\x25\xa9\x30\x69\xfb\xea\x3e\x9a\x6b\x3d\xa7\xed\x7d\xaa\xcb\xb9\x97\x11\x71\x41\x1c\xfc\x8c\x15\xda\xf1\x51\x5a\xcb\x57\x59\xc6\x57\x39\xcd\xc1\x4f\x1b\x97\x0f\xcf\xfa\xf7\xec\x5a\xe5\xdc\x71\xf5\x2a\x6c\xdc\x3b\x2f\x1f\x2d\x8a\x30\xc2\x20\xee\x3f\xef\xed\x3f\x46\xb8\xf1\xef\x46\x18\xf4\x83\x3e\x49\x02\x8c\xb6\x62\xc2\x4f\x31\xe3\x72\x50\x1e\x8a\xb4\x9e\x99\x2e\x95\xe9\xae\x64\xa5\x28\xbd\x21\x82\xf6\x73\x00\x2f\x5c\x24\xe1\xe6\x16\xf4\x6d\x01\xc0\xc1\x25\xd0\xb5\x78\x0d\xcd\xdf\x3e\x88\xac\x42\xf0\xca\xec\x4e\xf5\x44\x78\x0e\x43\x68\x72\xc6\xc0\x43\xad\x9b\x34\xf8\xc3\x52\x62\x0b\x50\x47\x1a\x10\x07\x97\x80\xe0\xef\xb5\xf6\x57\x0a\xf4\x55\xf7\x36\x57\x3f\x54\xbc\xc9\x35\x6a\x78\xb8\x45\x7e\x2b\x2f\x4d\xf6\x6b\xa4\x46\xc8\x8e\xbb\x93\x1e\x22\x2e\x88\x83\x4b\xe0\xc5\xb8\x66\xf6\x4b\x4c\x45\x35\xf9\x98\xe7\x1c\xb1\xad\xc1\x2f\xfc\xdb\xd2\xfa\xcf\x46\xa5\x9c\x53\x33\x60\x8f\x5e\x4b\x6e\x80\x76\xb0\x41\x1c\x5c\x02\x66\x77\x8a\xb0\x19\xe3\xe5\xf6\xef\x6c\xbd\xef\x7d\x77\xcf\xd5\x7c\xe9\xdd\x26\xa7\x9a\x53\x9e\x8d\xbd\x69\xcc\xfc\xcf\x33\x33\x89\xd0\x2e\x00\x80\xfb\x3f\x09\xfc\xef\x3c\xfe\x17\x0d\x80\x66\xd7\x93\x34\xb0\x91\x32\x51\x8c\xeb\x72\x64\x91\x2a\xfd\x95\x8d\x5f\x93\xe7\x9d\x6c\x27\xf6\xf8\xbe\xc9\xa3\x87\xef\x7e\x2d\x27\x73\x44\xb8\x38\x23\xc6\x0e\xe2\xe0\x1a\x30\x11\x2d\x61\x63\x72\x9f\xaa\x6e\x21\x70\x0f\x79\x53\x5d\x90\xd5\x6d\x12\xb4\xd1\xe1\x96\xf0\x7d\xc5\x49\xb4\xd2\xa5\x93\x1b\x3a\x1a\x0d\xe2\xe0\x1a\x58\x49\xf4\x1a\x48\x3d\x96\x2a\xd0\x32\xc1\xf5\x66\xad\xb7\xe2\x3c\xfb\x4c\x2d\xab\x76\xe2\x05\xce\x2d\x02\xf5\x8b\x99\x21\xea\x9e\x88\xb8\x20\x0e\xae\x81\xb4\x5f\x63\xd7\xb8\x0c\x32\xca\x1d\xf0\xa8\xae\x67\x54\xf6\x17\x3b\xf3\xe2\x0e\xcd\x8b\xdc\xc4\x92\xad\x29\x24\xa4\x29\xa1\x87\xea\x47\x41\x1c\x52\xad\x20\x6a\xe2\x07\xd7\x79\xca\xcf\x82\xed\x8f\x17\x2f\x8a\x2f\x8f\xfa\xde\x7d\x3b\x17\x94\x32\xa5\x20\x27\x7f\x7b\x6e\x6d\x29\xcd\x1f\xa1\x01\x10\x87\xd0\x40\x23\xc0\x08\x83\x52\xdd\x49\x1a\x18\x9e\x5d\x2a\x96\x1b\x1b\x0a\xed\xe3\x1f\x8d\xeb\xb9\xbe\xa2\x48\xb9\x1b\x41\xa6\x30\x57\x38\x92\x45\xa3\x2e\x49\xc6\x1e\x4a\x8c\x18\x3b\x88\x83\x6b\x80\x4c\xe3\xaa\x38\x46\x15\x47\xf6\xde\x75\x79\xfa\xb5\xbc\x23\xf1\x36\x91\x03\x9f\x00\x5b\x8a\x95\x1d\xff\x2b\x44\x6f\x7e\xa1\x42\xc6\x12\xc4\xc1\x35\x40\x9a\xc4\xaa\x6a\x60\xcc\xc0\x61\xb5\x77\x4c\xf2\x95\xe7\xd3\x42\xab\x3b\x77\x49\x5e\x0b\xe9\x26\xff\xac\xe5\x65\xbb\xd5\x17\xf2\xd0\x4e\x33\x80\x83\x6b\x60\xc4\x25\xe3\xd7\x99\x36\x12\x6f\xb3\xa3\xcf\xfa\x47\x7d\xd8\x74\xf7\x24\xe5\xac\x27\x8d\x2b\xef\x25\x58\xe7\x5b\x99\x5e\xfc\xb9\x09\xa5\x44\x00\x07\xd7\xc0\xc6\xbe\xfa\x13\x29\x54\x91\xab\x16\x31\x39\xf5\xca\x09\x97\x2c\xd5\x1a\xc5\x2e\xd3\xce\xa7\x96\x7d\xf8\x80\x7e\xc3\xc1\xc1\x4c\x1b\xa1\x01\x10\x07\xcd\x03\x00\x23\x0c\x5a\x77\x9c\xa4\x81\x5a\xff\x9b\x99\x3e\xb2\x78\x6c\x43\xab\x11\x01\xa2\x64\xa5\x39\x72\x71\xa4\x51\xfc\xb3\xfa\x6d\xbf\x71\x94\x0a\x7e\x49\x30\x43\x17\x55\x81\x38\xb8\x06\x7c\x15\x82\xbf\x84\x14\xe5\x92\x3b\xe3\x69\x47\xf9\x65\x30\x53\x88\x1a\x88\xf4\x39\x8c\xb1\xe4\x30\xa8\x3f\x94\x32\xd4\x92\x80\x3e\xb4\x81\x38\xb8\x06\x5e\x5c\x8d\x53\x56\x14\x93\xd7\x7a\x17\xc5\x79\xad\xb3\xb5\x19\xed\x17\x6a\x5d\xaa\x40\x41\xc3\x7c\x1e\x3a\x45\x61\x42\xd6\x2a\xf4\xae\x40\x1c\x5c\x03\x02\xb9\xb5\x1a\x39\xf7\xa2\x9c\x7c\xa3\x16\x77\x9b\x75\xd3\xb6\x19\xce\xc8\xb6\x69\xf2\xd2\xa8\xd7\xb3\xad\xef\x93\xe4\x8e\x39\x41\xdd\xa2\x00\x1c\x5c\x03\x95\xf7\x1f\xad\x0a\x67\x14\x8e\x76\x97\x2c\x29\xcd\x64\x9d\x7f\xd8\x18\x12\x2c\xcf\x2b\x16\xae\x1b\x6b\x31\xd1\x86\x8b\x5d\xa7\x8f\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\x99\xa8\x93\x8d\xf0\x1e\x26\x8b\xc7\x30\xe3\xfd\x03\xb2\x4f\xe7\x82\x03\x77\xd3\x12\x55\xd6\x2f\xcc\xf9\x99\x3b\xf8\x58\xa5\xbe\xf1\xc0\xe4\xd6\xfb\x84\x30\x95\x20\x0e\xd9\x08\x63\x93\xba\xfb\xbc\x24\x65\xc4\xb9\xa1\xa7\x9a\xff\x14\xe3\x9e\xb3\xa2\x44\x87\xfc\x4f\x9a\xf5\x29\x5c\xbd\xc0\x7c\x9f\x21\x5a\x12\x44\x64\x10\x87\x6c\x84\xfb\x73\xcb\x88\x14\x7c\x6d\x1f\x67\x2e\x57\x46\xe3\x29\x0d\xa9\x88\xe6\x3b\x06\x64\x3e\xf1\xcc\xa8\x93\x90\xb7\x66\xc7\xf7\x78\x85\x88\x0c\xe2\x02\xa4\xe9\x61\x4f\xe3\x5f\xdf\x54\x59\xc5\xc0\xa3\xd7\xea\x92\xb1\x4a\x2c\x35\x14\x6a\xe9\x8c\xe2\xbc\x65\x45\xa4\x99\x25\x91\xfc\x24\x86\x30\x81\x2c\x92\x5a\xdd\xff\x4f\x23\x9c\x7b\x74\xaf\x93\x5d\xad\x65\x02\x5b\x46\x38\x6e\x4f\xb1\xbc\x98\xb1\x0b\x43\xb1\xdc\x78\x69\x0a\x93\x97\xb8\xe7\x4a\x1e\x1a\xc1\x1f\x68\xef\xb2\x79\xa3\x28\x47\x85\x5b\xf1\xfa\x44\x85\x5b\x5e\x88\x0a\x51\xc1\x57\x1f\xba\x8d\xe3\xa8\xc8\x60\x07\x8c\x77\x23\x22\x39\xff\x6d\x46\x18\x34\xb4\x3f\x6b\x84\x65\xe0\x66\x69\xd6\x86\x47\x96\x86\xda\xc6\x4a\x48\x02\xff\x58\xf6\xf5\xec\x97\xc0\x90\xf6\x98\xad\x31\x4e\x6d\x7e\x61\x99\x63\xcf\x87\x7a\xd9\xa7\xb2\x59\x89\x6c\x84\x6b\x6d\x24\xc4\xae\x68\x97\x7b\x7d\x7f\xcf\x44\xac\x41\xd4\x18\xed\xda\xd6\xe1\x13\x19\x60\xb0\xa9\xc2\xed\x8b\x42\x63\xc7\xe0\x73\x2a\x5b\xb3\x22\x48\x7f\xf6\x81\xb9\x6a\x20\x59\xe9\x61\xfc\x3c\xca\xc7\xe7\x18\x74\x8b\xda\xef\x93\x9f\x8f\xd6\xd0\x0e\xac\x8c\x5a\xe3\xd6\xb3\xa6\xd6\xc9\x9d\xca\x68\x91\x8d\x70\x95\x88\x1d\xb1\xff\xd3\xf5\x6f\x71\xc9\xce\xc5\x69\x31\x9a\xa3\x8f\xfd\x0f\xbf\x5e\xff\xf4\xaa\x92\xe3\x25\xfa\x50\xc4\x61\x59\xcd\xa9\x8c\xd6\x11\xe9\xcf\x4e\x2c\xcb\x7d\x6c\x73\x69\xe6\x46\x21\x54\x70\x58\x97\x42\x4f\x77\x69\xda\xec\x3b\x9f\x60\xaf\x7b\xcf\xdf\xb3\xf0\xb8\x58\xad\xff\xd4\x8c\x30\x48\x44\x27\x65\xbe\xa5\x20\xe6\x19\x82\xb0\x0f\x82\x76\x2e\xb7\x9b\x55\x7a\xa7\x2f\xa4\x73\xec\xc6\xea\x92\x2a\xe2\x74\x9f\x6d\xcb\xd0\x45\x4f\x14\x86\xba\xef\x03\x38\x78\xe6\xe3\x55\x0c\x9f\x2d\xdf\x8a\x26\x2f\x1d\xd8\xfa\xf5\x6b\x5f\x87\x70\x9c\xb1\x5c\x6b\xda\xf1\xfb\xce\x20\x41\xb4\xd4\xc7\xe2\x49\xe8\x4a\x30\x10\x87\x74\x13\xca\x9c\x45\xad\xf7\x5d\xf2\xb3\xe3\x4b\x73\x04\xf1\x3d\x04\x9f\xe7\xd0\xab\xbe\x6b\x8a\xd9\x85\x5e\xc7\x10\x5c\xb6\x15\x26\x37\x40\xc4\x05\x71\xf0\xcc\x47\xcc\x78\xcd\x91\xf5\x7c\x55\xba\xad\xd2\xdd\xd9\xe7\xca\xa9\xbb\x85\xc9\xa8\xa3\x6b\x9d\xc1\xbc\xe9\x84\xb1\xbb\xa4\x1e\xe4\xd0\xf5\x8c\x20\x2e\x40\xf2\x9f\x9d\x16\x2e\x06\x35\x5a\xf7\xb2\x76\x3a\xcb\xca\x69\xa2\x87\xdf\xcb\xaf\xff\xb0\x64\xf6\x51\xa4\xf7\x35\xe7\x81\xa1\x01\x6a\x76\xd2\x06\x06\xc2\x08\x83\x38\xa8\x46\x58\xe6\xaf\x8b\x1f\xd0\x0f\xfa\x24\x09\xdc\xbc\x34\x1c\x46\xb3\xd4\x9a\xc4\xd7\x63\x49\x52\x32\x87\xe1\xc6\x5b\x1a\x44\x58\x56\xf4\xed\xdb\xcf\x88\xb8\x78\x77\x2a\x74\x52\xc4\xd0\x41\x1c\x5c\x02\x5f\x18\xa6\x50\xa8\x2a\xe4\x22\xd9\x1f\x84\x1d\xe5\x33\xcc\x53\xdc\x61\x5c\xdc\x1c\x8b\x6d\x6c\x6a\xd6\x98\xff\x84\x8d\xd2\x82\x82\x88\x0b\xe2\xe0\x12\xf0\x91\x73\x30\xf1\xf7\xbb\x53\xae\x4f\x5a\x12\x85\x16\x22\xd4\x53\xf7\xd0\x97\xa2\x2c\x54\xe0\x6a\x63\xe8\xfb\xd7\x8e\xd6\x81\xd0\xf5\xf3\x20\x0e\x2e\x81\xbd\x6f\xa3\x0f\x0c\xf6\xe7\xb1\xbf\xbe\x4f\x0c\x6b\x99\xeb\x5e\xf9\x48\x4e\x79\xa5\x6f\xe6\x43\x56\x4f\xb6\x4b\xfd\xab\xe5\x86\x4e\x44\x5c\x10\x07\x97\xc0\xd2\x23\xff\x08\x1d\xaf\xfc\xc2\xca\xbb\x71\xe7\x5f\xe1\x53\xe0\xc8\x68\x5c\xb2\x8c\x14\xbe\x8c\xe9\x31\x22\x97\xcc\xe6\x46\xca\x8d\x58\xfc\x80\x38\xa8\x36\x10\x60\x84\x41\xb3\xeb\x49\x1a\xb8\x3d\xf3\x80\x5d\xc2\x81\xf8\xce\x3d\x81\x07\xe9\x78\xea\xbd\x64\xdd\xb8\xb3\xef\x64\x4d\x53\x0e\xc2\x1c\x4d\xb7\xb0\x79\x6d\xa0\x23\x86\x20\x0e\xae\x01\xdb\x5f\xb1\x39\x0e\x8d\x42\xe5\x9f\x72\xc8\x02\x55\x2a\x8f\x42\xc6\xf3\xee\x98\x3e\x42\x8d\xf9\xe4\xd8\x1d\x2f\xd3\x6c\xec\x0c\xd5\x9d\x82\x38\xa4\x9d\x20\x0c\x89\x35\x9d\x3b\xd5\x79\x6c\x3b\xfa\x59\x78\x1d\x6a\x17\x44\xe6\xd8\x2c\x6f\xf2\x3a\x44\xf4\xcc\xb4\xb4\x8b\xa1\x67\x4e\x40\x3b\x41\x00\x0e\xae\x81\xee\x3a\xb9\xf6\xba\x8e\xbe\x6e\x2e\xec\x9f\x1e\x89\x36\x3f\x4c\x1b\x4d\x73\x19\x7b\x1f\xf0\x6b\x5b\x05\x84\x12\xe5\xab\xf9\x33\x42\x3b\xd8\x00\x0e\xae\x81\xb0\xbb\x35\xf7\x5d\x46\x05\x67\xe9\x56\xb8\x6f\x71\x1a\xc6\xa5\xfd\x6e\x93\x9a\x20\xdb\xd1\xba\x35\x3f\x4d\xad\xd7\x65\x5b\x67\x88\xd0\x00\x88\x83\x6a\x03\x45\xfe\xae\x01\x50\xaa\x3b\x49\x03\xf9\x6b\x91\x13\x6d\x3d\x51\x89\x2d\x23\x5f\x6b\x1e\xba\xa9\x9c\xd5\x1e\x43\xd1\xdd\x9d\x7f\x9c\x7c\x96\x2e\xbe\xb1\x72\x55\x16\xfa\x18\x02\xe2\xe0\x1a\xd0\x8f\xca\x8e\xce\xe7\xec\x98\x8b\xd5\xcd\x6f\x31\x2f\x93\xdb\x5b\xd9\xb9\x8d\x83\xad\x3b\x1a\xfc\xc8\x44\x54\x67\xa1\x2b\xb5\x12\x6a\x36\x07\xe0\x90\xea\xc4\xcf\xd5\xae\xf9\x55\xae\x8a\xae\xf4\x3a\x5a\xdc\x08\x24\x89\x6f\x0a\x61\x5f\x59\xdd\xa4\x63\xb3\x0a\x64\x14\xa2\x35\x3b\x0f\xb5\x19\x07\x71\x70\x0d\xe8\x37\xaa\xdc\x55\x61\x35\xc2\xde\xfe\xe8\xe0\xdf\x58\x9c\x93\x66\x56\xb6\x2b\xfd\xfc\x3e\x3b\xfd\x41\xc4\x96\x2a\x3d\xc5\xab\x15\xe8\xff\x05\x70\x70\x0d\x60\x75\x13\x30\x1f\xb7\x69\x0f\xd1\x74\xf9\xb0\x8b\x59\x31\x3b\x69\x31\xf6\xad\x26\x2b\x4a\xff\x94\xe0\xbd\xd5\xc3\xbc\x7a\x6c\x8b\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\xad\x3b\x4e\xd2\xc0\x9d\xcd\x9f\x6a\xa2\x4d\x81\x0a\x09\x03\xbe\xf4\xe6\x0d\xa1\x16\x25\x0f\xa6\x2a\xc5\x62\x2a\x0a\xfc\xef\x88\xf0\x2c\xc4\xdc\x80\x6e\xba\x05\x71\x48\x07\xa3\xb4\x30\x03\x6b\xc6\x1c\xb9\x94\x83\x96\xe4\xab\xf9\x58\xe9\xdf\x6d\x4a\x9a\x3f\x7c\x33\xa8\x97\xf9\x26\xbc\xee\x4e\x28\x4d\x3a\x22\x2e\x88\x83\x6b\x40\x97\xee\x77\xe5\x11\x4e\x84\x45\xc7\x51\xa3\x76\xf9\x0b\xd5\x6f\x04\x26\xf5\xb9\x6f\x89\x8b\xdf\x5a\x7f\x40\xc3\xab\xc5\x28\x83\x2e\xa0\x01\x71\x70\x0d\x28\xb0\xce\x4a\x37\x51\xe5\x15\x85\x9b\xbc\x2c\x9f\xc0\xec\x8d\x4a\xf4\xd3\x9e\xf6\xd1\x32\x44\x3d\x2f\x49\x48\x3f\x8f\xba\x0e\xb5\x37\x06\x71\x70\x0d\xf8\x3e\xb6\xdf\xfa\x24\xf8\xe4\xf9\x71\xcb\x73\xb4\x99\x02\x9e\x8b\xbe\x91\xe1\x09\xcf\x0f\x64\x17\x7f\xda\x0c\xcb\x9b\x9c\x35\x64\x47\x68\x00\xc4\x41\xf3\x80\xe3\xdf\x8d\x30\xc8\x44\x9d\x6c\x84\x6d\x9f\xed\xd0\x69\xdc\x72\xc5\xd5\xd1\xaf\x22\x3b\x96\x7b\xea\x63\xb2\x26\xb4\x1d\xd0\x39\xc0\x71\x51\xd9\x4e\x67\x5f\x86\x19\x3a\x1a\x0d\xe2\x90\x8d\xf0\xcd\x72\xd9\xd2\x74\xf5\x9b\xb1\x8a\x4f\x4d\x48\xba\xcd\xd6\xed\x18\x4b\x82\x44\xce\x4e\xbd\xc1\x75\x7b\xf4\xfc\xfe\x21\x9e\x77\x24\x22\x32\x88\x43\x36\xc2\x02\xab\xd5\xcf\x5f\x0f\xb0\x9c\x23\x4a\x09\x92\x95\x23\x5d\x97\x93\x53\x94\x28\x78\x69\x21\x1e\x53\x61\xd5\xb1\x3e\x9b\xda\xee\x89\x88\x0c\xe2\x02\xa4\x7d\x61\x4f\xe3\x5f\xdf\x08\x5a\xdb\xc8\xe6\x55\xad\xdd\x9a\x5d\x74\x37\x35\x17\xd7\xe6\x6c\xcd\xb7\x44\x2c\x2e\xf7\xc0\x2a\xb2\x17\x69\x99\x77\x27\x3e\x3c\x65\xfb\xd3\x08\xcb\x5d\x3d\x90\x91\x42\x21\xb9\x72\x94\x20\xff\xa1\x85\xc7\x54\xcb\xde\x3f\x1e\xc3\x70\x73\xcb\x8f\x33\x67\x29\xe6\xf3\xb9\x65\xad\x3f\x50\xa1\xe5\xe4\x52\x1a\xcd\x81\xa1\xd7\x1b\x8b\xc9\x34\x6d\x5a\x7c\x9a\x74\x3b\x36\x8a\xd9\xd5\xec\xd8\x17\xee\x70\xee\xcd\x5f\x9a\xfa\x6f\x33\xc2\xa0\xa1\xfd\x59\x23\x8c\x64\x84\x3f\x56\x61\x5a\x61\xb7\x8b\xff\x34\x54\x62\xad\xa9\xa9\x10\x78\xf0\x4c\x3e\x30\x93\xd3\xec\xbc\xde\xf6\xed\x64\xf7\xd1\x0e\xfa\xc1\x53\xd9\xac\x44\x36\xc2\x5a\xdd\xc1\x87\x45\xd9\x11\x04\xb6\x9c\xaf\xa8\xee\x6b\x7d\x1e\xa8\x2f\x91\xad\xc3\xe4\xa9\x70\xdb\xa9\x12\x0f\xe7\xfe\x74\xee\x54\x1a\xfc\x8a\x23\x1b\xe1\x0c\xa5\x59\x47\xd6\xa8\xe8\x6c\xde\xb3\x24\xe8\x3e\x39\xde\x92\x02\xd7\x58\xf0\xdb\x9b\x09\x48\xfd\x9c\xe8\x5e\xbe\x0d\x68\x3f\x3a\x95\xd1\x22\x1b\x61\x94\x7b\xce\x4a\x8e\x52\x3c\x23\x9e\xfa\x74\xf8\x25\xc5\x89\x28\x62\xd1\x29\x28\x07\x12\x55\x2c\xa6\xcc\x6b\x6a\x9f\xc7\x0b\x53\x4f\x65\xb4\xc8\x46\x58\x36\x3b\xff\x8e\xbe\x82\x77\xf6\x36\x6b\x62\x03\xe6\xde\x6d\x6a\xd9\xf7\xe1\x0d\x5d\xdf\x08\x6f\xf8\xe0\xcd\xb8\xd9\x79\xca\xb2\x9e\x9a\x11\x06\x89\xe8\xa4\xcc\xd7\xf6\xb3\xe4\xd2\x84\x09\xf6\xfe\xfc\x9e\xea\x60\x79\x27\xa5\xf0\x41\x14\x95\x2f\x96\xa4\xb8\x8d\xe9\x6f\xec\x8b\xdf\xb5\x95\xca\xa1\x56\xb0\x00\x0e\xc9\x05\x4d\xde\x96\x77\x24\x24\x16\xba\x3a\x8d\xa6\x4d\x58\x91\x1f\x79\xce\x8b\x91\xfb\xcd\xd4\x17\xef\xe8\x3e\x7c\x2f\xef\x82\x16\xc8\x60\x83\x38\x78\xe6\x0b\x2b\xf9\x2e\xd8\xa8\xd9\x73\x2c\x34\x7b\x54\xed\xcb\xac\x88\x52\xcb\x97\x6b\xd2\x37\xa9\xdd\x7f\x9e\x23\x80\xae\x69\xcf\x68\x0a\x6a\xa1\x09\xe0\xfe\x93\x49\xfe\x8c\xfb\xe4\x56\xb4\x9e\x5d\xcb\x67\xbe\x09\xd3\x0f\x9b\x6c\x71\x07\x32\x19\x09\x89\xa9\x43\x3f\xc8\x5d\x18\xce\x39\x7b\x0d\x04\xe6\x4c\x22\xe2\x82\xb8\x00\x49\x8c\x7f\x76\x21\xea\x7c\xf4\x24\x94\x27\xcc\xd4\x6d\xa5\x23\xe9\x07\xd9\x2b\xe2\xd4\x8f\xb6\xd1\x18\x3f\x1b\x29\x52\x9c\x0d\x58\x64\xfb\x87\xda\x11\x46\x18\xc4\x41\x35\xc2\x7f\x37\xc2\xa0\x1f\xf4\x49\x12\x48\xc3\xe8\xd9\xab\x79\x90\xc2\xba\xae\x8e\x8a\x59\x95\xde\xd3\x72\x96\xfe\x45\x36\xce\x24\xc9\xdc\x8c\x23\xe1\x57\x2d\x2a\x37\xa8\x53\x2d\x88\x83\x4b\x20\x27\x4a\xd6\xe0\xa1\x99\xf2\x98\xf2\x64\xa3\x53\xf1\xe7\xb4\xd8\xb5\x5a\x67\xe6\x40\x53\x53\xcd\x10\xfa\x81\x1f\x99\x41\xce\x9c\x88\xb8\x20\x0e\x2e\x01\xf6\x38\x6f\x5f\x4a\x77\x8c\x82\xc7\x9c\x57\x45\x30\x67\x6c\xf1\xf0\x44\x13\xd1\x19\x2a\xf8\xf7\xdd\x7f\x90\x88\xd7\x8d\x0f\x5b\x20\xe2\x82\x38\xb8\x04\xbe\xec\xbb\x3f\xe0\xc8\xa6\xbb\x7f\xb4\xc9\xf7\x68\xe1\xbb\x4f\x5d\x78\xe0\x02\xc5\x4c\x29\x91\xec\x27\x8d\x8f\x03\xbd\xf9\x63\xaa\x90\x64\x01\x1c\x5c\x02\xf4\x14\x0f\x8f\x82\xe7\x84\x9f\x5b\xba\xb2\x08\x24\x84\x3f\x21\x23\xbf\xf7\xf9\x45\x95\xc1\x3a\x43\xda\x08\x63\xc1\x22\x4b\xef\x3a\x62\xf1\x03\xe2\xa0\xda\x40\x80\x11\x06\xcd\xae\x27\x69\x80\xa1\xb6\x21\x94\x17\xa5\x6d\xae\xb5\xee\x2c\xed\x43\x69\x9e\x1b\x65\x9b\xcd\x44\xaa\xe1\x2d\x7b\xcd\xb2\x72\x5d\x4f\xf1\x4d\x14\x11\x63\x07\x71\x70\x0d\xf0\xdd\x88\xc7\x9b\xc5\x6b\xdb\x24\xdc\xe1\x17\xbf\x35\x50\xa2\x97\x30\x78\x7f\xd0\x6b\xe6\x6c\xe6\x81\xc3\xd4\xf7\x79\xf7\x50\xa8\x5b\x31\x88\x83\x6b\xe0\x31\x36\x87\xc8\x7b\x75\xdf\xe8\x2b\x8c\x67\x05\xca\x45\x12\xed\xce\x17\x55\x19\x1b\x5f\xf0\x62\xa6\xc0\x16\x61\xa8\x68\xd3\x84\xee\xeb\x01\x71\x70\x0d\x68\xae\x68\xa2\xf3\x6c\x6b\x39\xdb\x50\x44\xe3\xdb\x78\x56\x36\x3d\x8c\xbf\x39\x36\x2a\x4f\x4a\xa8\x1b\x71\xfd\x25\xda\xde\xe3\x30\xe8\x68\x28\x80\x83\x6b\x20\x33\x8a\xcd\xa7\xc1\x4d\xf4\xb6\xd8\xec\xc7\x3d\xef\x0f\xea\x29\x56\x57\xc3\xd5\x77\xb4\x5b\xce\x98\x52\xb1\x66\x94\xdc\x19\xb5\x40\x68\x00\xc4\x41\xb5\x81\x00\x23\x0c\x4a\x75\x27\x69\xe0\x3a\x79\x4f\x4c\x08\x2a\x5f\xa1\x9b\x26\x9b\x4e\xec\x37\x57\x8e\x16\xbb\x72\xdb\xd7\xdd\x6d\xfa\x63\x85\x89\xc4\x16\x8a\x47\xd0\x21\x1e\x10\x07\xd7\x00\xdb\xaf\xb5\x4c\x56\x7f\x9b\x80\x5e\xbb\xdf\x74\xcf\x14\xca\x9d\xae\xcc\xa9\x4a\xaa\x69\x65\x54\xf6\xe3\xa0\xa4\x71\x94\xbd\xe0\x42\xc4\x05\x71\x70\x0d\xbc\x24\xa5\x68\x1c\x7d\x39\x87\x56\xb9\x21\x34\xe3\x4f\x90\x2e\x1d\x97\x60\x72\xe6\x2e\x7d\x7e\xf6\xf3\xe8\x7e\xf1\x5f\x66\x21\xf1\x88\xb8\x20\x0e\xae\x01\x65\x99\xc3\x73\x62\x6b\xa8\xa2\x26\xab\xa2\x22\xa1\x24\x78\xe3\x9e\x98\x5f\xc8\x70\xd8\xb2\x2e\x0a\x2f\x11\xf0\x67\xf6\xae\x43\xed\x2d\x40\x1c\x5c\x03\xd1\xe6\x98\x39\xd1\xd4\x7e\x2e\x0d\x3a\x4b\x71\xd7\x47\x1b\xeb\x82\xf1\x73\x9a\xa4\xf4\x65\x42\x12\x5a\x1c\xd7\x3c\xda\x14\xaf\x23\x34\x00\xe2\xa0\x79\x00\x60\x84\x41\xeb\x8e\x93\x34\xe0\x29\x5f\x8f\x77\x88\x57\x9f\x30\x86\x77\xed\x38\xe4\xc7\x8b\x67\xfd\xcc\xc1\x31\x0f\xae\x57\xfc\xb8\x28\xd6\x9a\xa7\xe4\x44\x4e\x04\x1d\x09\x06\x70\x70\x0d\xe0\xe7\xe0\xbf\x26\xde\x73\x8a\x59\x98\x58\x4f\x5b\xb3\xcc\xcc\x2d\x44\x09\x4f\xc5\x9f\x35\x5f\xde\xaa\xb2\x53\xed\xc6\x28\x84\x6e\x08\x07\x71\x48\x9d\xba\x13\xd1\x45\x87\x27\x62\x1f\x60\x26\xae\xbc\xca\x1b\xbc\x13\x44\x35\xa6\x35\xf7\x3b\xbe\xf7\xc7\xc8\x06\xc5\x4e\x2d\xb5\x28\x74\xda\x00\xc4\xc1\x35\xe0\x35\xb5\x9d\xf7\x06\x4b\xc4\x42\x68\xfe\x93\x5b\xb4\xfe\xf1\x2f\x5b\xe6\xbb\x46\xc2\x12\x6a\xaa\x6e\xbc\x72\x62\x91\xef\x4b\x4a\x11\x71\x41\x1c\x5c\x03\x01\x1c\xd5\x51\x8d\x5c\xd9\x73\xa3\x74\x53\x7e\x69\xcc\xa8\xcf\xa8\x8a\xae\xee\xa1\xb2\x7a\xab\xaa\xcc\xe6\x88\x7b\x6c\xf3\xeb\x20\x34\x00\xe2\xa0\x79\x00\x60\x84\x41\x26\xea\x64\x23\xdc\xb9\xef\xcc\x2d\x9e\xea\x3d\x5c\xce\xd3\x49\xf1\xd4\xe8\x8d\x16\xc6\x74\x62\x03\xa5\xfc\x39\x4b\x71\x0d\x4f\x63\xd3\x55\x29\xa8\xa5\x15\x88\x43\x36\xc2\x77\xaa\x29\xb3\xca\x0f\x8f\xdb\xe8\x44\x57\xbb\xf1\xee\x98\xba\x5c\xf7\x22\x88\xa8\x5c\x37\xba\x57\x6c\xe6\x14\x51\xad\xe0\xa3\x89\x88\x0c\xe2\x4e\xa8\x11\x5e\x67\x96\xd0\x70\x7f\x63\xe5\x38\xd5\x23\x22\x83\xef\xfe\x8c\x58\xe2\x91\x2e\xcf\x13\x39\x52\xa9\x7e\x7b\xbd\x2f\x06\x46\x2f\xa0\x1a\x61\x00\x17\x20\x8d\x82\xf6\xcf\xc8\xff\xfa\xe6\xd5\x90\x1b\x17\xbe\xc8\xa6\x96\x5e\x89\x48\x4a\x72\x3e\x98\xd5\x9c\x65\xbd\xe4\x70\xe5\xfd\xc4\xb3\x04\x95\x37\x4e\xed\xe3\x7a\xf6\xb4\x7f\x1a\xe1\x42\x65\xed\x0a\x06\x8b\xb6\x06\xd9\xc9\x64\x29\x3f\x82\x1f\x0c\x6f\x4c\xbb\x09\x95\xe3\x2f\xa4\xb2\xa9\x1d\x77\x3e\x52\xe0\x8e\xfe\x73\x64\xd2\x79\x5c\x63\xa3\x8f\xd2\x9b\x63\x74\xac\xbe\x8a\xab\x14\x35\x2d\xad\x5f\x7b\x6e\xe8\xfa\xcd\xfa\x15\xbd\x67\xaa\x33\xbe\xe8\x7f\x9b\x11\x06\x0d\xed\xcf\x1a\x61\x24\x23\x4c\x81\xd6\x8a\xe9\x12\x7e\xe4\xee\x26\x73\xf4\xba\xc9\xab\x8a\xf0\x98\xe2\x56\xfa\x16\x99\x67\xbd\xc4\x9e\x7f\x65\x83\x61\xa1\xf8\xa9\x6c\x56\x5e\x41\xbe\x14\x94\x8a\x75\xca\xfa\x35\x5d\x2f\xb5\xa1\x6e\x8b\xe0\xe3\x18\xb9\xb7\xc1\x9a\x25\xa3\xd5\x97\x42\x9a\x8e\xa4\xbf\x63\x89\xcc\x9a\x9f\xca\xd6\x2c\xb2\x11\x36\xd5\x56\xbb\x2b\xd5\x54\xf2\xd6\xfd\x61\x37\x9f\x17\x13\x33\xae\xdc\xd7\x66\x3e\x4a\x37\xde\x63\xd1\x10\x97\x8e\x06\x9b\xd8\x9e\x53\x19\xad\x16\xd2\x9f\x6d\x62\x27\xe2\x18\xc7\x7c\xd6\xcb\x60\xa7\x73\x73\x6f\xde\x26\x15\x45\xcb\xc4\x59\x80\xe3\xf2\xbb\x26\x92\x64\xf2\x80\x24\x8c\xb8\x53\x19\x2d\xb2\x11\x4e\x7a\xc0\x48\x13\x6b\xc7\x63\xed\x8a\x1b\x1d\xe5\x6c\x90\xa7\xc4\x10\x10\xf1\x49\x41\x6b\x37\xbc\x71\x8b\x4d\x33\xe9\x91\xf0\xff\x8b\x2c\xff\x6e\x84\x41\x22\x3a\x29\xf3\x51\x9a\x62\x14\xa0\x6e\x4b\x92\x8e\xc4\x15\x1b\x7b\xef\xc6\x66\x47\x2a\x1c\xb7\xe8\xcf\xbf\xd7\x94\x95\xed\xf9\x45\xfc\x13\xb5\x11\x31\xe3\x83\x38\x78\xe6\x9b\xc6\xa8\xda\x22\xdd\xaf\x35\xd3\x7e\xee\xfb\x32\x23\x64\x9a\xe0\x4e\xa6\x97\xaf\x76\xe3\x1a\xde\x6d\x92\x88\x83\x40\xa9\x2c\xe8\x2c\x14\x88\x83\x67\x3e\x3f\x8e\xd6\x8e\xda\x0c\x5f\x7c\x4f\x57\x81\xdc\xfd\xdb\xd8\x51\x4e\x3f\x8c\x75\x7a\x27\x28\x6c\xa8\xdc\x77\x73\xce\xca\x3c\xbd\x89\x88\x0b\xe2\xe0\x99\x2f\x2f\xca\x56\xb6\xfd\x6c\xc8\x7b\xc6\x89\x7a\x8c\x07\xae\x8e\x13\x03\x42\xe5\xcf\x86\x32\xce\x5c\x8b\xc4\x1d\x7b\x37\x1a\xeb\x03\x9d\x85\x02\x71\x01\x92\xe2\xff\xfc\x14\x9e\x4e\xdd\xee\x9c\xdf\x8e\x67\xf4\x20\xfb\x6b\x08\x81\x48\x07\xad\x93\x4c\x57\xee\xe3\xe7\xc3\x0b\x57\x03\xae\xfa\x13\xf6\x4e\x41\x35\xc2\x00\x0e\xaa\x11\xfe\xbb\x11\x06\xfd\xa0\x4f\x92\x80\x38\xb6\xf7\xbd\x76\xde\x4f\xce\xf6\xe6\xf6\xb2\xdd\xa1\x33\x4f\x85\xc3\xea\x44\x87\xbe\xb9\x5d\x96\x91\xe6\xab\x40\xaf\xf9\xf5\x10\x31\x74\x10\x07\x97\x40\x15\xde\xdb\x86\xb5\xcd\x2a\xca\x58\x86\xce\xe7\x1c\x3e\xfa\x91\x13\xfe\xab\xa2\x95\x1d\xb7\x6f\x9b\x9c\xc3\x52\x73\xba\xe2\x32\x03\x5d\x1d\x01\xe0\xe0\x12\xf8\x10\x57\x6e\x8b\x66\xda\xf9\x06\x73\xfd\x3e\xea\x48\x8e\x67\x38\x4e\x03\x4f\x69\xd9\xf4\xba\xd1\x0e\xeb\x8d\x6f\xa6\x55\x67\xa0\xc5\x0f\x88\x83\x4b\x00\x85\x04\xa3\x7a\x47\xb9\xf7\xaa\xc7\xd1\xf2\x27\x29\x5f\x6f\x1e\x29\x4c\xc1\x21\x1c\xf5\xaf\x2b\xbf\xfb\x72\xd8\x6c\x8d\xf8\x2e\x21\xe2\x82\x38\xb8\x04\x8c\x8d\xe9\x07\xe3\x14\xeb\x63\x76\x44\x84\xf0\x5f\xbf\x4d\x1a\x97\xbe\x88\xcf\xf8\xce\x5d\x25\x45\x8d\xe3\xd2\x8a\x67\x5a\x41\x3b\x62\xf1\x03\xe2\xa0\xda\xc0\x2b\x7f\x5f\x00\x83\x66\xd7\x93\x34\x80\xd6\x43\x43\x4c\xd8\xa4\x3b\xf8\xcb\xbc\x94\x3a\x29\x62\x24\x32\x06\x67\xd4\xb6\x4c\xe8\xe5\x08\xc9\x18\xb7\xaa\xb0\xc8\xa2\x11\x62\xec\x20\x0e\xae\x01\x8d\x97\xaf\xb8\x46\x7d\x8c\x86\xf4\x2e\x1a\xbe\x7c\x58\xda\xd8\x35\x20\x77\x2f\x8a\x5c\xe6\xd1\x14\x15\xb3\xea\xeb\x55\x11\x6e\xa8\x5b\x2c\x88\x83\x6b\xe0\xcd\x9c\x6d\x77\x9b\xbb\xbb\xb0\x1d\xbe\xe5\x26\x75\xe6\xbe\xd1\x4b\x51\x75\x8b\x62\xab\xbe\xae\xa3\x94\x8c\x46\xbb\x4c\x3f\x71\x44\x5c\x10\x07\xd7\x40\x9b\x4a\xe8\x8e\x1d\xda\xf9\xf4\x62\x2d\xfc\xfc\x5f\xad\x17\x6e\x94\xc4\x16\x68\x54\x5d\xaf\xa2\x60\xb0\x79\xd3\xa6\xa2\x15\xc1\x03\x7d\x17\x04\x70\x70\x0d\xd4\xac\x5a\x5d\x15\xbd\x2a\x89\x51\x8a\x57\xda\x44\xe7\xb1\x80\x1e\x5f\x7a\xa9\xd8\xf9\xb6\x4a\x66\x69\x37\x3e\xbe\xed\xe1\x67\x69\x84\x06\x40\x1c\x54\x1b\x08\x30\xc2\xa0\x54\x77\x92\x06\x22\x2f\x64\xd4\x32\x8a\xa4\x9d\x09\x20\x12\x58\xc7\x32\x1b\x6d\xbf\x33\x22\xb1\xc6\x36\x62\x4b\x28\xce\x55\xbd\x34\xe7\x3e\x07\x9d\xb4\x00\x71\x70\x0d\xf8\x9c\xa3\xf4\x73\xf7\x71\xde\x63\xfc\x96\xe7\xeb\x93\x6b\xa6\xb1\x4c\x56\xe9\x9f\xee\xbe\x42\x10\x48\x33\x22\x5d\x5d\x30\xc1\x0f\x9d\xe0\x00\x70\x70\x0d\xe8\xbf\x2a\x6e\xe7\x17\xfd\x18\x3b\xf3\xa4\xcf\xa9\xbb\x09\xcb\xda\x39\x59\xc1\x57\xad\xb2\xa6\x43\xe7\xc2\x5d\x96\x96\xe6\x97\x0b\xd0\xce\x2d\x80\x83\x6b\xc0\xd7\x7c\x0e\x9f\x93\xda\xec\xd9\xfb\xb7\xe8\x9b\x89\x3a\xe8\x5c\x42\xaf\x6f\x3b\xcb\xf9\x91\xf2\x25\xa4\x4c\x6c\x05\x52\x96\xdd\x86\x8e\xf1\x02\x38\xb8\x06\x9a\x75\x9c\x0f\xb7\x76\xae\x53\x65\xc6\x07\x72\xf5\x65\xb1\x65\x08\xd6\x62\x35\x6a\xda\xc7\x6d\x38\xe3\x7c\xa5\x12\x34\x1f\x85\x1a\xa6\x81\x38\x68\x1e\xd0\xfa\xbb\x06\x40\xeb\x8e\x93\x34\x50\xcc\x31\xac\x73\xbf\x6e\x8b\xdd\xed\x5d\x56\x73\x2c\xef\xe0\x95\x98\x8e\xe2\x49\xab\x96\x03\xc5\x32\x7c\xb7\xf7\xa9\x5f\xaf\x42\xb9\x00\xc4\xc1\x35\xd0\x46\xc9\x29\xb2\x48\xca\xe6\xfd\x3e\x30\xb0\x2e\x32\xb0\x5e\x13\xd7\xe7\x13\xad\xec\xc5\x34\x5c\x8e\xd1\x2f\x4c\xd2\x3d\x59\x4f\xa1\xdf\x15\x80\x83\x6b\xc0\x6e\x84\xf2\xe5\xd5\x68\x07\xc5\xcb\x97\x23\xa8\x26\x0b\xb9\x35\xae\xbf\x49\x33\xa5\x3d\x48\xcc\xde\x74\x8d\xe0\x63\x88\x6d\xfc\x0a\x35\xb7\x03\x70\x70\x0d\xa8\x9e\x23\x7e\x49\xf8\x42\xdc\xba\x75\xfa\x98\xc0\xcd\xe2\xfe\x61\x4e\xd2\xad\xb6\xf9\xb0\xb4\xc7\x97\x7a\x04\x18\xc4\xc7\x37\xa1\x32\x19\x10\x07\xd7\x80\x50\xe9\xcb\x02\x4e\x5d\x3b\xf7\xab\x82\x6f\x78\x28\x38\x7e\x8b\x90\xde\x5b\x74\x99\x2c\x29\xbb\xe8\x55\x50\x38\xef\xe7\x9b\x1d\x83\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\x99\xa8\x93\x8d\xb0\x60\x3b\x63\x14\xd6\xd6\xd9\xc2\xed\x54\x39\x82\xdd\xe4\x73\xc3\xf7\x7d\x26\x28\xb7\x52\xa8\x2f\xf3\xdb\xf3\x89\xd4\x5b\x93\x14\x21\x4c\x25\x88\x43\x36\xc2\x0b\x8f\x4c\x31\xd6\x9b\x5e\xf8\xc5\xfc\x38\x67\x68\x78\xe1\x0b\x55\x22\xed\xe6\x0f\x23\xae\x65\xb7\x62\xc6\x6e\x2f\x5c\xee\x73\x2a\x88\xc8\x20\x0e\xd9\x08\xcb\xbc\xd7\x99\xca\xb6\x99\x6d\xae\xd6\xd5\x7a\x7a\x41\xf9\x8a\x00\xcf\x10\x37\xc1\xaa\x95\xd0\x34\xa3\x01\xc6\x88\x7d\x6b\xa5\x37\x22\x32\x88\x43\x8e\xfc\xaf\x2f\xb8\x4d\xbb\xa5\x4c\x5b\x73\xa6\xb8\x83\x4b\x55\xb5\x3c\x82\x8f\x63\x2d\xf8\x63\xcf\x74\x82\x35\x51\x3e\x4e\x25\x36\xa1\xf9\x47\xd1\xc2\x3f\x8d\xb0\x6b\xfd\x2b\xaf\x5b\x82\x64\x1e\xc1\x2c\x6f\x4d\x54\xfb\xf7\xf6\x2e\x3c\xab\x1b\xb0\xcf\xe1\xa4\x0c\xf6\xcc\xdd\xa1\x60\x72\x92\xfd\x03\x1d\xb8\xcd\x15\x50\xbb\xeb\x47\x54\xce\x65\x3f\xc8\x19\x2d\xa1\x1c\xa6\x63\x39\x6a\x5d\x96\xc8\x44\x7c\x81\x69\x6c\x7c\xf7\x09\xe9\x7f\x9b\x11\x06\x0d\xed\xcf\x1a\x61\xe4\x1d\xe1\x17\xf4\x75\x98\xcd\x6f\x6e\x3e\x35\x8f\x29\xc0\xcd\x26\x66\x44\xbd\x25\x43\x88\x71\xb3\x24\xee\x5e\x1e\xed\xee\x1b\xea\x79\x9c\x53\xd9\xac\x44\x36\xc2\x0e\xe5\x23\xdb\x0b\x4d\xa2\xc2\x09\x22\x6a\xeb\xb7\x79\x70\xfb\x7d\x3d\x47\x9b\x9d\x42\xb3\xd6\x37\x55\xe3\x0e\x3f\x97\x7e\x25\x38\x95\xad\x59\x64\x23\xfc\xe2\x71\x6b\xe5\x60\x80\x8c\xd2\x7d\xef\x84\x28\x3c\x32\x0b\xbb\xed\xe5\xba\xfd\x60\xaf\x3b\xfc\x0d\x11\xdd\x9a\xbf\x04\xea\x5c\x4e\x65\xb4\xc8\x46\xf8\xa9\xd4\x44\x67\xd2\x8f\x2f\x44\x62\x2b\xac\xd3\x0e\xdc\xdf\xc5\x08\xe6\xa3\xc7\xa7\x2a\xc8\x31\x14\xf8\x5c\x05\x24\x5e\x9a\x90\x9e\xca\x68\x91\x8d\xb0\xf5\xf2\x50\x16\xf1\xaa\xe4\xbe\xca\x17\x43\xe5\x27\x42\x49\xcc\x24\xc5\x07\x1f\xcd\x0d\x4b\xfa\xce\x30\xb2\x84\xe5\xb4\xcf\x7d\x39\xbd\x1d\x61\x80\x88\x4e\xca\x7c\x04\x15\x81\x38\xa6\x77\x57\x69\xc8\x3a\x17\xe6\xad\x7b\x99\xee\x9f\x4f\xb0\x74\xa9\x24\xaf\xdd\x29\x6a\x6d\x97\xbc\x26\x17\x15\x84\x98\xf1\x41\x1c\x3c\xf3\xbd\xe5\x6a\x0c\xdd\xf3\x76\xb8\xbf\xc7\xd9\xce\xb5\xad\x1b\x47\xe0\x2b\x1f\x7b\x9f\x40\x03\x95\x37\x62\x50\x63\xd2\x23\x91\xe9\x11\x22\x2e\x88\x83\x67\xbe\xb9\x88\x8d\x58\x5f\xa7\x6f\x4b\x0b\xfc\xcf\x5c\x0c\xbc\xcd\x59\x38\x79\x78\x7f\xad\x27\x29\x11\xb8\x6b\xdf\x45\x1f\x36\x5f\x92\x45\xc4\x05\x71\xf0\xcc\xd7\xea\xbd\x60\xb5\x46\xf2\x41\x8f\xd8\xd7\xc9\x2c\x87\x8e\x53\x24\x7f\x7f\x43\x47\xbb\xa8\x5a\x4b\xad\x13\x6b\x81\x97\x1d\x1b\xea\x8e\x01\xe2\xe0\xff\x6f\xcb\xfb\x22\x94\xdd\xa8\xbc\x67\x1f\x9c\x6a\x3d\x0d\xf2\x33\x4b\x19\x6d\xdf\x2e\x26\x4f\xb3\x8e\x3c\x8c\xa2\xb3\x48\xdb\x73\xbd\x88\x30\xc2\x20\x0e\xaa\x11\xfe\xbb\x11\x06\xfd\xa0\x4f\x92\x80\x6c\xc8\xf3\xd5\xe1\x19\x1a\x2d\x2c\x42\xb9\xfe\x56\x77\x1b\x6e\xc5\x58\x5f\xb2\xcb\xa3\x58\x7e\x8f\xbe\x8d\xd6\x89\x62\x4d\x43\xf7\x75\x82\x38\xb8\x04\x1e\x1a\xbb\xb1\x67\xdd\x75\x6a\x6a\xef\xbc\xf3\x3d\xb1\xda\x4e\xfd\xbd\xa3\x4a\xe3\x73\x47\x71\x1c\x47\x0e\xac\x6b\xdf\x79\xcf\x67\x21\xe2\x82\x38\xf8\x23\x9d\xee\x41\x39\xeb\x76\xed\xf8\x05\x9d\xf7\x60\x6c\x28\xdb\xc5\x4f\x79\x8d\x8e\xd7\xcc\xf4\x92\x0d\xca\x98\xb9\x5d\x86\x1a\x49\x3d\xa0\x6f\x2c\x00\x0e\x2e\x01\xfa\x98\x92\x0e\x15\xfc\x45\xf7\xa1\x50\xde\x1f\x4a\x26\xb2\x0e\x82\xad\x49\x45\x2b\xfd\x0e\x68\xd4\x3b\x17\x4d\x79\x45\x57\xa0\x6f\x21\x20\x0e\xfe\xff\xde\xfe\xcc\x6e\x1f\x2e\x8a\xd9\x93\x26\xbd\x34\x6b\xf1\x8a\xad\xe2\xfb\x65\x1d\x79\x4f\x2f\x12\xaf\x8b\xe4\xe3\xed\xa1\x63\x12\x96\x88\xc5\x0f\x88\x83\x6a\x03\x01\x46\x18\x34\xbb\x9e\xa4\x01\xdb\xf0\x6c\x83\x8e\x88\x0b\xc3\xe9\xfc\x4a\xf7\xda\x3f\x44\xf5\x19\xde\xbb\x34\xee\x71\xa8\x35\x24\x79\xa6\x34\x4a\x6e\x52\x07\xaa\x0d\x04\x71\x70\x0d\x2c\x16\xe8\xb5\xa5\x45\xb7\xea\x96\xe2\x29\xd9\x17\x52\xf5\x2b\x66\xdc\xb8\x56\xf8\xe4\x98\xb1\xa3\x7c\xe9\xe5\xf9\x27\x1f\x5e\xd0\x22\xe2\x82\x38\xf8\x33\xa5\x49\xef\xca\x1c\xeb\xbf\x45\xc3\xeb\x48\x4e\xac\x39\x62\xf6\xe0\xce\xb3\xba\xdf\x67\xd9\xf2\x17\xf4\x12\x51\xfb\xd6\xcc\x8a\x94\x10\x71\x41\x1c\x5c\x03\xa1\xd3\x63\xbc\x68\x61\x76\xe9\x6e\xbc\x2f\x93\x0a\xed\x99\x28\xa6\x1c\x46\xde\xbd\x31\x7a\x4a\x44\x62\x7d\x37\x21\xa9\x64\x9e\x06\x11\x17\xc4\xc1\xff\xdf\x4b\x9d\xc2\x46\xb5\x49\xc3\xd6\x11\xec\x22\x19\xd7\x04\x0a\x67\x94\xbb\x0f\xd6\x44\xd7\xfc\xd2\xbf\x63\xe8\xb8\x0b\x06\x74\x38\x21\x34\x00\xe2\xa0\xda\x40\x80\x11\x06\xa5\xba\x93\x34\x70\xa0\x4e\x9f\xbb\x50\xf0\x28\xad\x33\x62\xd8\x30\x6b\xa5\x68\xf5\x96\x62\x67\x35\xe3\xde\xce\xa0\x8d\x93\x18\x6d\x27\xb3\x18\xd4\xdf\x10\xc4\xc1\x35\xb0\xe7\xea\x91\xee\xaf\x41\x2d\x1b\x23\x87\xc7\xea\x2a\x7b\x7b\x24\xd9\x56\x9f\x49\xff\x8b\x3a\xc9\x8b\x0c\x8f\xc3\x4f\xae\x76\x3e\x50\xc9\x01\x80\x83\x3f\x53\x5f\xcf\x6f\x01\xe5\x6a\x58\xd7\xab\xda\x42\x38\x22\x73\xe5\xd3\x1c\x02\xc4\x7f\x11\xdf\x6e\x4f\xaa\x65\xad\x41\x39\x73\x70\x04\xd5\x73\x83\x38\xb8\x06\x9c\x12\x24\x6b\x2e\x50\x8e\x1b\xf1\xf0\x4c\x7d\x19\xd1\xe4\x17\x5e\xb7\xf5\x6e\x12\x1c\x58\xfa\x34\x2d\x66\x21\x2b\xcc\x50\x1d\x8a\x88\x0b\xe2\xe0\xff\xaf\x14\xad\x79\x5c\xfe\x7e\xa6\x95\x7e\x71\x9d\x03\x43\xe2\x54\x7f\x89\x2e\x4e\x3e\x3f\xcb\x6f\x4d\xc7\x22\x13\xfe\xa8\x62\xaa\x30\x84\x06\x40\x1c\x34\x0f\x00\x8c\x30\x68\xdd\x71\x92\x06\xea\xd5\x12\xa9\x03\x7a\x69\x9c\x1c\xc3\x06\x6c\xbb\x13\xfd\x84\x5a\xa3\xae\x13\x48\x9a\xe6\xe5\xba\xe7\x14\xe2\x6e\x3e\xcf\x85\xbe\x8b\x83\x38\xa4\x12\x89\x14\x6a\xc9\xa8\x27\xf9\xcb\x59\x4d\x39\x81\xce\x53\x64\x04\xba\x18\x4f\x86\x8e\x73\x9c\x6e\xe5\xde\x48\xca\x8e\x2f\x3c\xb0\x85\xe6\x17\x00\x07\x7f\xa6\x0f\x71\xf9\x3c\xb2\x35\xbb\x3c\x36\xa4\xd7\x7c\xd3\x0d\x57\xb3\xf2\x37\x1c\x18\xcc\x5c\xfc\x2f\xba\x2e\x75\xbf\xb1\xa7\xc6\x81\x3e\xb4\x81\x38\xb8\x06\xb8\x96\x07\x42\x7f\x2e\xea\x5a\x68\xa6\x79\x89\x7e\x4f\x2c\xa4\xfd\x65\xd1\xf0\x7c\x52\xf7\x8b\xd1\xfd\x2f\xdb\x28\xaa\xb7\x12\xa0\x72\x21\x10\x07\xff\x7f\x65\x2e\xf2\x1e\x0c\x13\x4f\x68\x74\x88\x1f\x35\xed\x1f\x46\x34\xd7\xc8\x47\x89\xe0\xfe\xee\xec\xbb\x6d\x46\xcb\xf9\xe8\x59\x56\x26\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\x64\xa2\x4e\x36\xc2\x47\xc9\xce\xb1\x3c\xad\x7d\xc3\x9e\x9f\x1e\x8f\xd8\xd6\x4a\xae\x93\x6d\xb0\x37\xa0\xe2\xd6\x4e\xe7\xca\x6b\xf2\xab\xed\xdf\x5c\x41\x98\x4a\x10\x87\x6c\x84\xed\x1f\x99\xd0\x9d\x7b\x60\x6a\x16\xbb\x6d\x95\x76\xa3\x39\x78\x8f\xd6\xba\x5e\x60\xa1\x51\x72\xb1\x95\x36\x79\x77\x45\x34\x2d\x07\x11\x19\xc4\x21\xdb\x55\x87\x87\x1a\x2b\x1c\x6f\xa6\xf1\x95\x7e\x54\x3b\x98\x37\x53\x45\x6e\xde\xe6\xce\x7e\xa4\xd4\xfe\xb3\xea\x83\x65\x2d\x26\x8b\x9f\x13\x22\x32\x88\x0b\x90\x46\xa1\xff\x67\xe4\x7f\x7d\x8f\x70\xb7\x88\x98\x7d\x70\x8c\x6b\xf5\x71\xa2\x9d\x71\x12\x99\x61\xd5\xa4\xbe\x57\x9c\xf1\x6f\x81\x59\xac\x84\xc9\xde\x04\xf5\xfd\x7f\x5c\x9f\xb4\x1d\x9e\x79\xc6\x90\x38\xd3\x6b\xed\xd2\xb7\x99\x56\x6c\x2e\x9d\xa3\x46\xfd\xcf\xb5\x77\x59\xd7\xe8\x1c\xf4\x8a\x9b\x74\x9e\xb9\xff\xb9\x5b\x79\x29\x25\xed\xed\x34\xb9\x61\x1a\x16\xab\x07\x17\xc1\xaf\xc8\x9f\xac\x6f\x68\x04\x51\xf0\xc4\xef\x51\xc9\x0a\x33\x3e\x25\x49\xfd\x6f\x33\xc2\xa0\xa1\xfd\x59\x23\x2c\x0b\x37\x4b\x91\xfb\x96\x49\x5c\xac\x5c\x06\x3f\x7e\xdb\xce\x37\xa5\x60\x2c\x62\x11\x73\x19\xbf\x38\x13\x1a\x57\x14\xe8\x7f\xdd\x87\x40\x27\xec\x54\x36\x2b\x91\x8d\x70\xf3\xad\x7b\xf7\x33\xd8\x8c\x7c\x22\xd5\x4d\x0a\x9e\xc5\x16\xe0\xb4\x0e\xad\xbd\xb4\x6b\x96\xfc\xc1\xdf\xe2\xa7\x53\x1e\x35\x42\x75\x2a\x5b\xb3\xa2\x48\x7f\x16\xe7\x4e\x55\x86\xf3\x97\x46\xb6\xc4\x0f\xc7\x82\x67\x87\xe5\x6d\x50\x7b\x05\xc3\xc2\x45\xde\x48\x1a\x46\x8f\x0b\x61\x5f\x17\xea\x3e\x95\xd1\x9e\xb0\x23\x4c\x32\x13\x38\x7b\x8f\x31\x2b\x73\x02\xe3\xf8\xda\xd8\x2b\xd2\x8e\xe8\x33\xec\xb3\xb9\x0a\xb8\xad\x9b\x74\x16\xd8\xf6\x0b\xb7\x4f\x65\xb4\x4e\x48\x7f\x96\x62\xd3\x97\x7b\xe4\x4d\x20\xde\xc0\xda\x4a\xc6\x08\x21\x1e\xd1\x63\x94\x79\x77\xd3\xc6\xa2\x42\x32\xce\xa5\x68\xe1\xfb\x23\xa7\x30\x5a\x9d\x7f\x27\xa2\x93\x32\x5f\xd3\x4d\xc3\x5b\x9e\xd8\x33\xcb\x16\x0f\x8a\x89\x52\x19\xd6\x3e\xad\x5b\xfa\x90\x5e\x7a\x87\x56\x8d\xef\xd5\x28\x5b\xc0\x6e\x0c\x65\x12\x10\x07\xcf\x7c\x8a\x59\x8a\xa8\x82\xdb\x6b\xbf\xf3\x6f\x5d\x0d\x22\xdb\x40\x7d\xa6\x92\xc0\x46\x8a\x76\x2e\x49\x43\xcf\xee\x42\x68\xc2\x4a\x3c\x13\x22\x2e\x88\x83\x67\x12\xa3\xb9\xb1\x10\x55\xe1\x68\x2b\xb2\x30\x4b\xec\xa8\xfb\xb4\xe3\x3d\x28\xed\xdc\x44\x45\x53\x8b\x93\x19\x68\x94\xed\x42\x77\xc2\x11\x71\x41\x1c\x3c\xf3\x11\xcd\x2f\xc7\x1d\x9b\x8c\x0b\x5a\x66\xc7\x38\x31\xa9\x68\xb8\x3e\x9c\xbb\x16\xe2\xb3\xbd\xf7\x93\x6a\xed\xf5\x74\x49\x99\x2e\xe4\x04\x40\x1c\x3c\xae\x90\xf3\x88\x9c\xcf\x7e\xb8\xef\xe3\x1c\xbe\x8b\x9f\x14\x8e\xd7\xde\xfa\xc4\xbf\x5d\x5a\xe4\x13\x47\xb1\x4d\x2f\x93\xac\x49\xda\x41\x18\x61\x10\x07\xd5\x08\xcb\xfe\x75\xf1\x03\xfa\x41\x9f\x24\x81\xe3\xca\x9e\xf1\xab\xd5\xad\xf4\xb3\xc2\x4c\xae\x59\x8e\xf8\xd2\xef\xdd\x79\xd9\x94\xd2\x2b\x25\xa2\xbf\xd3\x9c\x33\xd7\xb5\x82\x1a\x66\x83\x38\xb8\x04\xa8\x86\xc5\xe2\xdd\x34\xf9\x46\x9f\xac\x9f\x6d\x4e\xc3\xe5\x7e\x55\x2c\x28\x68\x91\xc0\xd5\x55\xdc\x51\x91\x10\xbe\xda\xfd\xfb\x15\x22\x2e\x88\x83\x4b\xa0\xd5\x89\x5a\x34\x52\xef\xb7\xff\xcf\x0f\x0c\x4f\x07\xfd\x45\x14\x5f\x9b\x62\xce\xf6\x38\xb4\xa2\xc6\xdb\x7b\x19\x36\x58\x67\x5a\x42\xdf\x2c\x00\x1c\xfc\x55\x55\x4d\x46\x65\x46\x7f\x7d\xe9\xeb\x3e\x4d\xe4\xa5\xfe\x89\xf6\xa1\xd5\xd4\x07\x51\x3e\xae\x76\xb4\x10\xdb\x79\xef\x0f\x58\xbc\x50\x07\x52\x10\x07\x8f\xab\xf7\xe1\xd1\x2f\x33\xec\x60\x89\xcf\x61\xcb\x7a\xce\x13\x56\x63\x7d\xb3\x55\xfb\xea\xd5\xe8\xe2\x9a\x8f\x02\x22\x09\x58\x15\x97\x10\x8b\x1f\x10\x07\xd5\x06\x02\x8c\x30\x68\x76\x3d\x49\x03\xe7\x13\xda\xa4\x3c\xd1\x6a\x30\x1f\x88\x7f\x7a\x54\xa5\x6c\xed\x91\xb9\xbf\x7a\xee\xf5\x53\x7e\x9b\x4f\xe5\x14\x55\xef\xae\xde\x54\x47\x8c\x1d\xc4\x21\x75\x8d\x1e\x21\x8c\x6f\x25\x76\xfc\xf5\x68\xb3\x5b\xcb\x62\x61\x63\xf8\xc1\xa4\x6d\xcf\x55\x16\x92\xe3\xea\xde\xc9\x5d\x36\xee\x2e\x1b\xa8\xe6\x16\xc0\xc1\x35\xb0\x9b\x66\x7c\xee\x8a\xa7\x7d\xca\x7b\xa9\x87\x75\x7b\x6d\xa9\x3b\x7d\xed\x55\x2e\x36\x4b\x7c\x25\x8e\x44\xe3\x69\x5d\x3f\x7f\x43\xd3\x0b\x88\x83\xbf\x2b\xdd\x09\x46\x9b\xc9\xcb\x43\xdf\xbe\x35\x7a\xf9\xb0\xe4\x35\x92\xb8\xea\xf0\x45\x35\x3c\xe9\xa0\x3b\xe4\x08\xa9\x0f\xf5\x9d\x82\xca\x04\x40\x1c\x3c\x2e\x8b\x58\xa7\x38\x3a\x45\x24\x7f\x64\x66\xc3\xc0\x9c\x70\xae\x5c\xa1\xb9\x55\xbe\x3e\x89\x73\x1a\xe7\x4b\x5f\x57\x6e\x4a\xc6\x1a\x84\x06\x40\x1c\x54\x1b\x28\x0a\xd8\x11\x06\xa4\xba\x93\x34\x90\x97\xa5\x27\x62\xf0\x98\xc9\xfa\x88\x84\x08\xe7\x42\x83\x49\x8f\xf0\xbb\xe4\x63\xf3\x8b\x82\x92\x5f\x5e\x05\x9c\xad\xb7\xb6\x68\x86\x0e\xc5\x00\x38\xa4\xa3\xd1\x3c\xf1\xe8\x34\x77\x2d\xd4\x83\x38\x1b\x93\x95\xcf\x45\x0a\x31\xbe\xa7\xc4\x37\xf0\xd3\x33\xa8\x70\xf8\x19\xc9\x78\xb5\x07\xfa\xbd\x82\x38\xb8\x06\xb6\x64\xf5\x65\x51\x1f\x4b\xde\x24\x78\xea\xa1\xab\xe9\x47\xa5\xdf\xee\x7a\x5d\x92\x56\x71\x94\x3f\xcb\xc1\x26\xf9\x25\x76\xca\x0f\x44\x5c\x10\x87\x34\x65\xb3\x90\xdf\xcc\xc2\xfd\xc1\xa2\x28\x65\x72\xd7\x80\x48\x78\x85\x72\xba\xaf\x08\x8b\x88\xd2\x5a\xc7\xdc\x4a\x99\xab\x56\x10\xba\x48\x01\xc4\xc1\xe3\x7e\x2f\xde\x1e\x09\xaa\x15\xb7\xe9\xb3\xf6\x95\x5e\x4d\x58\xe6\x75\xf9\xee\xbf\x6c\xfd\x7c\xf3\x69\xc7\x67\x12\xf7\x77\x8f\x50\xb6\x10\x1a\x00\x71\xd0\x3c\x00\x30\xc2\xa0\x75\xc7\x49\x1a\xe8\x35\x2b\x3b\xa6\x39\xe0\x39\xff\x4b\xf2\xc9\xe3\xa2\x68\x9d\xac\x17\x82\x15\x2f\x4a\x77\xa9\x6b\xfc\x29\xe2\xf5\x7b\x42\x94\xd2\x10\x63\x07\x71\x70\x0d\xf4\xad\x74\xee\xb0\x70\x09\xb9\xb9\x0e\x58\x2a\x7e\x8d\xdc\x63\xa9\x13\xc4\xe5\xdf\xac\x1c\xe1\x94\xcf\xa1\xd9\xc6\xf0\x12\x86\x76\x9a\x41\x1c\x5c\x03\x41\x29\x3d\xe4\x04\x92\x54\x2b\x01\x7b\x62\xcf\xcb\x8c\x6e\x10\x7a\xef\xc9\x16\x16\xa3\x8b\x3e\x9a\x6e\x6d\x90\x7c\xdc\xac\x4a\x8f\x88\x0b\xe2\xe0\xef\x6a\x32\x44\x39\x80\x23\xe8\xbe\x34\xc6\xc1\xa3\xf3\xea\xd2\x57\x0c\x2e\x5c\xfe\x14\x37\x7e\x94\x39\x79\x7d\x33\x63\xd6\xc6\xe9\x00\xba\x4f\x1c\xc4\xc1\xe3\x8e\xb7\x18\x56\xac\x5d\xfc\x6c\xee\xaa\x6f\x97\xea\x53\xde\xef\x8d\xe9\xa4\xc0\x73\x87\x7c\xd6\xf7\xaa\x75\xfa\x59\xac\xb9\x4e\x1e\x84\x06\x40\x1c\x34\x0f\x38\xfd\xdd\x08\x83\x4c\xd4\xc9\x46\xb8\x79\x24\xd8\x74\x03\xa7\x32\x70\xa9\x62\x6d\xe8\xb9\xcc\xf8\x14\x01\x97\xc7\xed\xe9\x03\x93\xad\x43\x3d\xb5\x27\x55\x0d\x97\xec\x11\xa6\x12\xc4\x9d\x70\x7d\x52\xc5\x4e\x82\x61\xa2\x63\xcd\x4b\xab\x97\xb3\x51\x34\xb9\x12\x1e\x96\x22\xdf\x92\xd2\xd4\xa2\x7e\x6c\xc4\xf7\x61\xcb\x96\x49\x40\xd7\x27\x01\x38\x64\x23\x4c\x6c\x91\xfb\xf0\xa2\xfe\x9d\x76\xe1\x4f\xda\xda\x01\xfa\x75\x4a\xda\x0c\x63\xed\x67\x6f\xc7\xb9\xed\xfa\x4f\x1c\xdc\x0d\x77\x98\x44\x44\x06\x71\x01\xd2\xff\x79\x92\xff\x58\x22\xff\xdb\x7b\x84\xd3\xf1\x95\x30\xfb\x97\x46\x88\xae\xb8\x79\xa7\xdf\x9c\x73\x6c\x93\xba\xf1\x3a\x50\xe3\xa3\xf0\x44\x78\xb7\xbf\x5c\x6a\x89\xdb\xf1\x9f\x2e\xee\xe2\x90\x27\xfd\x95\xf9\x57\xaa\x49\xed\x12\x2f\xca\x6e\xf3\xba\xe2\xe4\xe0\x09\x70\xcf\xf1\x61\x1e\xc7\xde\x96\xe5\xeb\x1a\xfa\xf6\x07\xea\xd6\x21\xd9\x35\xbe\x5a\x73\xa1\x40\x0d\x3b\xf9\xcb\x54\xea\x4c\x75\xcd\xa4\xec\xad\x46\xbd\x63\x45\xac\x0a\xcc\x3d\xb4\x04\xd3\xff\x36\x23\x0c\x1a\xda\x9f\x35\xc2\x48\x46\x98\xc4\xf2\x79\xaf\x3d\x2f\x91\x63\x8a\xe4\xfe\x19\x66\xd3\xde\x86\x0b\xce\x52\x6a\xf2\x5d\x5e\x5f\xa5\x64\xb1\x14\xa5\x0d\x71\xa8\x4f\x65\xb3\x12\xd9\x08\x3f\xad\x20\xb8\x46\xc8\x1e\x2d\xb1\xbe\xc5\x18\xf3\x6c\xfe\x73\x4c\xf6\xd6\x19\x87\x51\x61\x8a\xab\xa4\xa4\xd2\xc5\x81\x67\x62\xb7\x4f\x65\x6b\x16\xd9\x08\xeb\x05\x67\x39\xe1\x12\x6a\xa5\x4e\x38\xaf\x39\x8b\xf8\x56\x12\xb0\x08\x7d\xd9\xad\x8c\x61\x89\x71\x2f\x74\x51\xe2\xf2\xa4\xbf\x77\x2a\xa3\x45\x36\xc2\xea\xe4\xb1\xf5\x19\x7e\x3c\xe7\x17\xe6\x6e\x62\x98\xee\xad\x29\x3d\xc9\x50\x3d\xd8\xd7\xa4\x53\xf8\xfc\x39\x4f\xc4\x08\x85\x81\xfb\x54\x46\x8b\x6c\x84\xb9\x44\x2a\x6c\x34\xf2\xc5\x83\xdb\x1e\xb2\xde\xb1\xde\x0f\xea\x16\xbc\x68\xf8\xcd\x51\x5a\x6f\xad\x83\x42\x91\xfa\xd5\xa7\xdf\xaf\x4f\xcd\x08\x83\x44\x74\x52\xe6\xc3\xef\x70\x3a\xef\x70\x85\xe7\xba\xfa\xb3\x6b\x58\xd5\x91\xaf\x08\x0c\x2c\x09\xb8\x9d\x07\x70\x74\x98\xaa\x9f\xa6\x8f\x84\x2e\x41\x5b\x20\x20\x0e\xe9\x3c\x1c\x1a\xaa\xe3\x40\xd3\x64\x1e\x45\x2c\xff\xb0\x76\x40\xe2\x94\xb6\x62\xf8\x63\xfd\x63\x99\x40\x83\xb3\x77\x8d\x98\xbf\x0c\x4e\x43\xe7\xe1\x00\x1c\x3c\xf3\x89\x6e\x97\x90\x50\x6e\x93\xfd\xea\x4b\xbd\x77\x21\xad\x2c\x55\x5d\x60\x6d\xbc\x8d\xe8\x25\x3e\xcd\xc8\x0b\x21\xcd\x28\xe7\x91\x26\xa8\xeb\x06\x80\x83\x77\xb1\x28\x31\xfc\x4d\x7d\xb5\xff\x4b\x56\xb3\x49\xf1\xe5\xc2\xb2\xf4\xce\x44\x47\xb7\x23\xf4\xb8\xcc\x96\xd4\x97\x1d\x43\x19\xfa\x9b\xca\x88\xb8\x20\x0e\xfe\x7c\x85\x5d\x33\x2f\x46\xd9\x1c\xb5\xa1\xee\x63\x10\xf4\xb9\x87\xe7\xa5\xa0\xa6\xfc\xb8\xf3\x3a\x24\x51\x8b\x67\x53\xf9\xe7\xb9\x00\x76\x84\x11\x06\x71\x50\x8d\xf0\xdf\x8d\x30\xe8\x07\x7d\x92\x04\x3e\x5b\x61\x9b\x3c\xbf\xb9\xcc\x5a\xfa\xf0\x4a\xae\x47\x49\xfd\xc5\x9b\x37\x5c\x79\x2f\xdf\xe6\x2e\x8a\x63\x51\xbb\x5f\x70\x28\x31\x80\x18\x3a\x88\x83\x4b\xa0\xa0\x50\xe3\xe1\xef\x09\x37\x65\xe3\xf0\xcf\x42\x95\xfe\x0c\x3b\x49\x32\x55\x47\x38\xad\x7d\xad\x8f\x37\xb3\xa4\xb1\x3b\x2d\xa0\x2b\x33\x40\x1c\x5c\x02\xaa\x73\x9d\x3a\x2e\x38\xe9\x2b\x18\xc6\x37\xa5\xbe\x37\x18\xe5\x9d\xe1\xbe\x16\xac\x15\x97\xb3\xff\xcb\x4c\xe4\xc6\x31\xab\x20\x74\xef\x31\x88\x83\x4b\xe0\x03\x2a\xee\xad\x62\xa9\x42\x3f\x19\x53\x11\x3c\xb3\x1b\x8d\xa3\x77\x6e\xc8\x05\xa6\x44\xe7\x34\x53\x13\x7e\x5f\x3a\x24\xd9\x34\x83\x8e\x5c\x03\x38\xf8\xf3\x7d\x8c\x55\xf1\x48\x48\xa4\x9d\xba\xa8\x4a\x5a\xb5\x5d\xed\x2c\x8a\xee\xc5\x10\x7d\xea\x5b\x38\xbd\x9a\x4a\xeb\x65\xc2\xd4\x8f\xf7\x11\x8b\x1f\x10\x07\xd5\x06\x02\x8c\x30\x68\x76\x3d\x49\x03\x5b\x9c\xf4\x25\x3c\xc4\x14\xaf\x18\x4d\xe5\x1c\xb7\xb5\x56\x0b\xf8\xf3\xf1\x2e\x2f\xd4\x1d\x38\xfb\x70\x5d\xfb\x89\x8e\x9d\x2d\x08\x99\x0a\x00\x07\xd7\xc0\x36\x66\x6b\xa5\x90\xad\x4e\x5a\xdb\xa2\x8e\xbb\x07\x77\xfa\x02\xe3\xf5\x94\xa5\xc0\x37\xb9\x39\xd7\x7f\xed\xa1\x9a\xd4\x9f\x81\x3e\x2e\x80\x38\xb8\x06\xda\x9f\x1e\x49\x76\xcb\x08\xde\xae\x4e\x6d\x48\xbf\xbd\x48\xa3\x24\x97\xbc\xa2\x4a\xb2\x12\x6f\x2e\x90\x19\x55\xbb\x74\x84\x03\xd5\xf2\x82\x38\xb8\x06\xec\x07\xfd\xd3\x42\x53\xf4\xaf\x1a\x69\xab\xec\x3d\xf0\xf1\x4f\x49\x8a\xfd\x9e\xf7\xf6\x91\xce\x48\xf5\xfb\xaf\x03\x21\x97\xe9\xa1\xa6\x61\x20\x0e\xfe\x7c\x57\x33\xe6\x6b\xc2\xae\x0e\xb8\x3e\x09\x0e\x1b\xdb\x29\x96\xac\x7b\x44\x3d\xd3\x78\xbe\x41\x56\xb1\x7b\xde\x39\x35\x4d\xb7\x73\x1e\xa1\x01\x10\x07\xd5\x06\x02\x8c\x30\x28\xd5\x9d\xa4\x81\x76\xae\x31\xce\x0d\x45\xfe\xfc\x4f\xf1\xe7\xce\x24\xd7\x7b\xde\x4c\xda\x08\xbc\x86\x97\xf0\xe2\x65\x74\x92\x51\x77\xaa\x90\x3c\x74\x24\x18\xc4\xc1\x35\xb0\x25\x15\x81\xce\xe4\x4c\x4b\x1e\xbb\x6f\x62\xa2\x87\x39\x75\x96\x50\x9d\x6c\xb3\x8b\x46\xcc\xd5\x88\x6b\xc7\xa1\xcd\x7a\x03\xfa\x76\x09\xe2\xe0\x1a\xa0\x1f\x70\xf2\x7a\x4e\x32\xfc\x39\x85\x8b\x0c\xe7\xcb\x95\x14\x99\x00\x47\x46\x62\x8e\x2d\xbb\xe7\x72\x87\xbf\x5e\x7f\x78\xd2\x03\xd5\x71\x82\x38\xb8\x06\x0c\xba\x0e\xd2\x75\xd1\xca\xd3\x1d\x58\x0b\x48\x8e\xed\x3b\x4a\x50\x56\xb6\xfb\x9f\xed\x36\x9d\xdb\xa1\x56\x97\x39\x8e\x93\x2a\x44\xc4\x05\x71\xf0\xe7\xeb\x4f\x42\xf8\x2c\x97\x67\xf3\x4a\x24\x7e\x4e\x23\xfa\xf9\xee\x1f\xe2\x36\x0b\xb2\xb2\x8b\xe1\x71\xc5\x6f\xf0\x44\x47\xac\xb9\xb0\x11\x1a\x00\x71\xd0\x3c\x00\x30\xc2\xa0\x75\xc7\x49\x1a\x78\x19\x7f\xec\x9c\x9f\xfb\xd5\x78\xe7\x65\x99\x41\xe1\xb1\x6e\xcf\xd7\x36\x0d\x7b\x2e\x55\x6c\xea\x92\x9e\xfb\x38\x7d\x23\xaf\xfa\xa1\xba\x6b\x00\x07\xd7\xc0\x35\x6b\x99\x2e\xf4\x4a\x32\xec\x17\xb7\xbe\x8e\xf0\x79\x2f\x7d\x24\x77\x9f\x50\x35\x09\xe4\xe7\x6a\x61\xbb\x6f\x35\x30\xfa\x6b\x0c\x11\x17\xc4\xc1\x35\x50\x9b\x57\x6b\x13\x94\x3f\xc6\xf4\x39\x64\xec\x1c\x23\x75\xe6\xe0\x57\x6a\xe1\xab\xd4\x3f\x1b\x17\x07\x25\x63\x26\xd5\xc4\xf8\xde\x41\x5d\xae\x01\x1c\x5c\x03\xab\x1c\xb7\x46\xdf\xb0\xe3\xc5\xca\xef\x06\x35\x2b\xe3\xd8\x93\x7e\xb3\xa8\x1d\xc4\xf2\xda\x9a\x18\x25\x7a\xe6\x50\xf6\xe5\x12\xd4\x8c\x0f\xc4\xc1\x9f\x2f\xe9\x20\xf3\x4d\x03\x4f\x37\x55\xb1\x66\x6b\xc1\x5f\x2f\xae\x71\x9e\xcb\x2e\x79\x8c\x85\x9d\x1e\xa7\xfa\xe1\xce\x5c\xa3\x71\x11\x27\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\x64\xa2\x4e\x36\xc2\xc3\x2e\xc3\xf4\x8c\x26\xe1\xd5\xbf\x73\x37\x26\xa2\x2f\x0d\x71\xb1\x62\xd9\xea\x9e\x7d\xf0\xf5\x7d\xae\xba\xb7\x1a\x0a\x2e\xf6\x7d\x84\xa9\x04\x71\xc8\x46\x38\xdf\x1c\x77\xa3\xf8\xc1\xb1\x52\x55\x57\xd0\x43\x5b\x39\xdf\xd9\xfa\x66\xcf\x5c\xeb\xbb\x5e\xe7\x51\xba\x23\xaf\x7f\xc3\x29\x8a\x85\x2e\x66\x02\x70\xc8\x46\xb8\x4b\xe4\x72\x9e\xb6\x6e\x37\xbf\xdf\xd0\x27\x1d\x16\xe6\x97\x5c\x1a\x5d\x57\xee\x6d\x55\xdc\x8b\xbc\xc8\xd6\x6f\x68\x83\xd7\xcc\x8e\x88\x0c\xe2\x02\xa4\x51\x50\x50\xff\x11\xf9\x5f\xdf\x23\x2c\x1b\x68\xc4\x6b\xb6\x67\xd8\xd5\x2d\x71\xa5\x68\x8a\x7b\xd1\x82\xd5\x73\xb9\x56\xfe\xc1\xee\x97\xa4\xba\x3e\xed\xee\xc0\xec\xe8\x3f\x8d\xb0\xd3\xd2\x5a\xea\x52\xba\x27\x25\x8b\x9a\x07\x85\x89\x23\xd5\xb0\xe8\xcc\xd4\x07\x6d\x71\x9f\x47\xcc\x98\xdb\x18\x39\x46\x79\x7f\xde\x60\xb3\x80\xd9\xff\x89\x15\x4b\xe4\x0b\x7b\xb7\xfb\xf1\xad\xee\x81\x01\x3d\x7c\x56\x2f\x9b\xdc\x80\x9f\x92\xf3\xe9\x2d\x24\x52\x98\x3d\xff\x6d\x46\x18\x34\xb4\x3f\x6b\x84\x91\x8c\x30\x87\xb7\x86\x8d\x59\x62\xdb\xce\x98\x95\x5d\x16\xb9\x5d\xeb\x3b\x61\x7b\x73\x45\x1e\x83\x79\x57\x83\x24\x9a\x16\x5f\x2a\xb4\x9f\xa7\xb2\x59\xc9\x87\xe4\xd1\x86\x68\xf5\x97\xb1\xce\x0e\x48\x3b\x97\x31\x7f\xe5\x9f\x73\xab\xb7\xeb\x20\x8f\xd5\xb9\x2c\x12\x22\x17\x2e\xb2\x35\xd9\xea\xff\xec\x54\xb6\x66\x91\x8d\xb0\x1c\xb6\xfd\xc2\x2d\x15\xda\x66\x76\x3c\x46\x3a\x54\x8e\xf8\xd6\xb3\x9e\x6f\x87\xc6\x0e\x75\x2e\xa4\xd4\xc9\x49\xa5\x0e\xac\x38\x9c\xca\x68\xb5\x91\xfe\xac\x08\x27\x19\x4f\xe9\x0d\x27\x6f\xcc\xb6\x1b\x56\x23\x77\x02\x43\xba\x5e\x32\x89\x5c\x10\x5a\xe6\xb7\xb8\x5c\x92\x29\x52\x82\xb6\x7b\x2a\xa3\x45\x36\xc2\xd7\xfc\x2d\x56\x5b\x7b\x26\x73\x86\x0c\xbf\xf0\x86\x7a\x55\x0a\xd1\x3a\x90\xb9\x9c\xa9\x6e\x72\xa3\xb2\x08\xed\xcb\xfb\xce\x7e\x0a\xfe\x5b\xe7\xdf\x89\xe8\xa4\xcc\x77\x84\x3f\x53\xd6\xfa\x41\xa6\xe4\x59\xd4\x1c\xf7\x0d\xf2\xde\xf1\x94\x28\x12\xad\x36\xa9\xd7\xea\xc6\x0c\x04\xc6\x17\x36\x8c\xa8\x10\x33\x3e\x88\x43\xba\x37\xc5\x67\x8e\xd0\xec\x42\xa9\xfd\x48\xa1\x50\x9d\x60\x5b\x83\xe5\xc3\xc5\x67\x06\x11\x59\x9f\x16\x3d\x02\xa5\xee\x92\xb0\x7e\x87\x6e\xd0\x07\x71\xf0\xcc\xd7\x31\xba\xca\x92\x23\x32\x6f\x37\x3d\xd2\x92\xb3\xde\x4d\x7e\xd7\xe6\x6c\x93\x66\x61\x90\x64\xf3\x5b\x2d\x35\x76\x6b\xf7\x68\x68\x9b\x11\xc4\xc1\x33\x9f\x67\x19\xfb\xba\x01\x4a\x79\x89\x03\xd1\xcd\xaf\x96\xc4\x7b\xcd\xec\x8f\x36\xb4\x66\xc5\x5e\x7f\x4f\xee\x7d\x94\xbf\x8d\x13\x2e\x07\x75\x09\x01\x70\x01\x92\xf4\xff\x78\x0e\xf1\xb1\x8a\x7b\x4d\x45\xa4\xcb\x5f\x31\xe5\x63\x07\xb3\x18\xa9\xaa\x73\x63\x76\x5d\x75\xe2\x16\xf0\x0f\xab\x75\x2c\xec\x7e\x67\x21\x8c\x30\x88\x83\x6a\x84\xff\x6e\x84\x41\x3f\xe8\x93\x24\x20\x37\x7a\x9b\x2f\xd9\xa5\x83\xee\x9d\x40\xed\xb5\xc4\xcc\xa2\xd7\x59\xd5\x91\x01\x4a\xad\x9c\x47\x4b\xe6\x74\xfa\x4e\x3c\xf5\xd0\xb1\x35\x10\x07\x97\x80\x94\x28\xf9\xb5\xbb\xf5\xdb\xfa\x0e\xe5\x77\x52\x7f\x47\xad\x69\xb1\x24\x3d\x10\x2a\x0e\x8a\x56\xc0\xde\x33\x17\x2f\xf4\x79\x05\xdd\x1f\x0a\xe2\xe0\x12\x70\xd1\x45\x35\x26\xba\x7c\x8d\xf9\xb5\x19\xe5\xb9\x79\xe9\xa4\x57\x13\x4f\xbe\xc9\x3f\x4d\xc5\x26\x50\x55\xfe\xb6\xb3\xd2\x29\x18\x81\x88\x0b\xe2\xe0\x12\x90\x88\xa0\xce\x3e\xf7\xa0\x95\x80\xd9\x91\x39\x74\xe1\x62\x0a\xcb\x6d\x2f\x1c\x9a\x2a\x5f\xb6\xeb\xef\x9a\xc3\x02\xef\xf2\x04\x42\xbb\x21\x20\x0e\x2e\x01\xf9\xef\x06\x44\x21\x37\x83\x51\x05\xa5\xdf\xcb\x79\x71\xb8\xf5\x99\xfa\xcd\x97\x31\x24\xd8\x18\x7a\x95\x3c\xe4\xb5\x35\xa2\x81\x8c\x30\x88\x83\x6a\x03\xf9\xfe\xbe\x00\x06\xcd\xae\x27\x69\xe0\xa7\xc6\x88\xb0\xa3\xb0\x7d\x44\x51\xfb\x72\x8f\x91\xde\xbd\x6c\xac\xcb\x1d\xee\xde\x0e\x0f\xdf\x3b\x7f\xce\x2a\xbb\x2f\xf1\xb5\x0f\x31\x76\x10\x07\xd7\xc0\x42\x8e\x82\xc6\xdb\x98\xf3\x5e\x16\xe5\x7e\xad\x24\xd9\x8e\x33\x43\x18\x2c\x8a\xb8\x43\x1f\x31\x19\x14\xc3\x13\xc7\xdd\x9e\x43\xbb\x81\x20\x0e\xae\x01\x33\x23\x54\x01\xbc\x17\xec\x0b\xfa\x73\x83\xf8\x58\x46\x61\x94\x3f\xb2\x74\x39\x37\xe4\x82\xb0\x8e\x06\x96\xe5\x4a\x5e\xbb\x43\x57\x73\x81\x38\xb8\x06\x54\xdc\x14\xba\x34\x1b\x29\xb1\xc8\xaf\x27\x9f\x7d\x96\x1d\xba\x74\x2e\xe8\xec\x70\x39\xa3\xe7\x45\x51\x41\xf1\x91\x00\xa6\x65\x36\x44\x5c\x10\x07\xd7\xc0\x13\xfe\x40\x86\xdc\xbb\x79\x3d\x52\x8b\x13\x5e\x9a\x1c\x3a\x0b\x06\x98\x5a\xe1\x7e\x75\x54\xef\x32\x50\x71\x7a\x51\xfb\xd5\xf3\x10\x1a\x00\x71\x50\x6d\x20\xc0\x08\x83\x52\xdd\x49\x1a\xf0\xa7\xdc\x56\x44\xff\xf1\xca\xe8\xfd\xbb\x2a\x45\xef\x31\x8b\x10\x5a\x52\x2f\xd3\xdb\xa3\x49\x21\x41\xe7\x35\x54\xbd\x77\x78\xb0\x10\x63\x07\x71\x70\x0d\xd8\xe0\x69\x5b\x39\x86\x0f\xd2\x46\x51\x48\x04\xff\xb8\x77\x91\x89\x5c\xb2\xfc\x71\x86\xfe\x2c\xfd\x77\xea\xcf\x7b\x4e\x35\x07\xd0\xf5\x6c\x20\x0e\xae\x01\x92\xfb\x03\xde\xd5\x28\x49\x8c\x8e\x17\x3c\x5e\x77\x60\xd0\xb2\x95\x9e\x2f\xd4\x77\xb1\xd0\xfd\xe6\x6e\x5a\xe7\x59\xde\xa5\x06\xed\x06\x82\x38\xb8\x06\xd2\x0b\xf8\x1f\x15\xbd\x55\x46\xbf\x59\x52\x23\xbf\xe1\x7f\x7d\xfa\x2e\xf1\xac\xeb\x96\x3e\x05\xaa\xe5\x63\xf2\xc1\x6a\x15\x36\x28\x25\x82\x38\xb8\x06\x62\xe7\x5f\xfb\xd7\xad\x04\x9e\x6b\x33\xc7\x32\xc4\x8b\x60\x18\xc2\xdb\x23\xc3\x20\xed\x74\x3c\x74\xed\xdd\x9f\xac\x31\x71\xa0\x42\x68\x00\xc4\x41\xf3\x80\xf6\xdf\x35\x00\x5a\x77\x9c\xa4\x01\xb6\x71\x61\x2d\xd2\xdb\x1b\x05\xc6\x42\x0f\xd7\x06\xd6\xbf\x3f\xe8\x5a\x78\xad\x99\x35\x3d\xe6\x40\x5f\xca\x15\x2e\xa8\x3a\x09\xf5\x75\x00\x71\x48\xf3\x40\xc6\x38\x7b\x25\xe9\xcd\x89\xbb\xcf\x2d\xcb\xce\x78\x18\x8d\xb8\xd0\xff\x68\x56\xea\x37\x9c\x4d\xf5\xbe\x1d\x30\x1c\x7c\x9c\x0b\xcd\x03\x00\x0e\xae\x81\x8d\x04\x9b\xc6\xe9\xb3\xca\x93\x17\xf1\xe4\x9e\x2c\xb8\x31\xba\xef\xe3\xe9\xca\x2e\xf3\xbe\xfd\x9c\x26\x5a\x6b\xfb\x1e\xf5\xc2\x06\x22\x2e\x88\x83\x6b\x40\xb8\x9e\x59\x4d\x9a\x25\x94\x62\x39\x57\xce\xcb\x76\xb4\x33\xf1\x41\x82\xd8\xb8\x77\x46\x6f\x71\xbb\x5e\x04\xfd\x3c\xa6\x1c\x74\x95\x18\x88\x83\x6b\x20\xe3\xe0\xd7\x4e\x0d\xc7\x65\xfe\x44\xb1\x8f\x81\xdf\x83\xd7\xa7\xed\xf1\xc9\xf9\x6b\xba\xa8\x55\x02\xe5\x49\x66\x15\xea\xa6\x76\x11\x1a\x00\x71\xd0\x3c\x00\x30\xc2\x20\x13\x75\xb2\x11\x56\x88\x58\x0c\x78\xfa\xa2\x20\x98\x2f\xe3\xfd\x52\xeb\x8c\xd3\x15\x35\xe9\x05\x7a\x0a\xcb\xc6\x52\x1f\xc3\x47\xc4\x31\x56\x73\x71\x08\x53\x09\xe2\x90\x8d\x70\x01\xed\x4c\xb6\xad\x58\xff\xb0\xdd\x47\x3a\x51\x66\x91\x09\x7c\x4d\x9e\x41\xba\x16\xc3\x62\x3f\x13\x49\xcb\x9f\x78\x9a\xee\x50\x1b\x2e\x10\x87\x6c\x84\x2b\x6f\x88\x4a\x6c\xf8\xb9\x9d\xa7\x34\x1f\x31\x1d\x4f\xbb\x9c\x61\x42\x2e\xdc\xaa\xa9\x5a\xc3\x88\x23\xbf\x18\x96\x24\x53\x2a\x89\x88\x0c\xe2\xfe\x63\x84\xff\xd9\xe0\xec\x5f\xdf\x23\xfc\x3e\xff\xc1\xb9\x5b\x47\x18\xba\xb2\xfa\xd8\x36\xa1\x8d\xfb\xaf\x1a\x5d\x38\xf4\xd3\xe4\x82\xc9\x15\xf6\x3e\xd9\x7d\xd7\x19\x9c\xfa\xd3\x08\xdb\x55\x7e\x5a\x10\x76\xed\x73\x7b\x56\xe1\xea\x9f\xad\x61\x3e\x53\x62\x59\x68\x19\xd3\xf4\xa1\xad\x26\x10\x7f\xb0\x27\x28\x44\xef\x0f\x34\x44\xac\x59\xfb\x92\x52\xbf\x42\xa6\x95\xc4\x7b\xe3\x5f\x33\x8c\xb4\x5d\x58\x99\x4e\xa9\x8c\x61\x84\x3b\xf7\xbe\x64\x95\x5c\x6e\xfa\x6f\x33\xc2\xa0\xa1\xfd\x59\x23\x8c\x64\x84\x1f\xdb\x9e\x27\x30\x46\x37\x6f\x37\xfb\x2e\x1a\xd2\xbb\xeb\xf6\x75\xcf\xfa\xa8\x9a\x2a\xd6\x53\x50\x49\x52\xe3\xb2\x3b\x4d\xdc\xd2\xa9\x6c\x56\x22\x1b\xe1\xc7\x15\xab\x77\x74\xc3\xf5\xce\xb2\x12\x61\x97\xe1\x4e\x72\x29\x1c\xee\x32\x3d\x7e\x34\xd2\x5a\x5e\x93\x30\x19\xb5\x51\xbb\x70\x2a\xed\xa3\x1a\x91\x8d\x70\x93\x25\x36\xfe\x7a\xa4\x59\x50\x78\xf8\xa6\xf5\x80\x67\xa8\x41\xa1\x66\xf0\x12\xa3\xfe\xa6\xee\x13\x5e\xf3\x0b\x31\x93\x84\xa7\x72\x10\x5c\x1c\xd9\x08\x9f\xaf\x2b\xbb\x6a\x27\x91\xb1\x30\x23\x75\xc9\xa5\xcb\xa3\x8b\xf7\x89\x98\xad\x9f\xac\x75\x5d\xcb\x81\x93\xe4\xb6\xfc\xe6\x88\xc5\xa9\x8c\x16\xd9\x08\xab\x3f\x89\x50\xe8\x8a\xbd\xec\x3f\xd1\x2d\x46\xab\xca\xa8\x72\x30\x3c\x7c\xdd\x4f\x46\x86\x11\xd7\x89\xf4\x49\x93\x57\x05\xc3\xb7\x53\x33\xc2\x20\x11\x9d\x94\xf9\x0a\x31\x9d\xbf\xfe\x96\x45\x17\xbd\xcc\xaf\xf2\x05\x3d\xfe\x55\x86\xbf\x9e\x3b\x9e\x1d\xf5\x0d\x01\xb9\x42\x6f\x5a\x4d\xa2\x69\x68\x05\x0c\xe2\xe0\x99\x2f\x2f\x20\xd8\x80\x54\xdc\x94\x7e\x32\x2f\xfb\x48\x50\x4b\x84\x62\x49\x32\xea\xc9\x4d\x74\x5a\x5c\x6f\x4b\x92\x84\xfa\xaa\x2e\x21\xe8\x9c\x1d\x80\x83\x67\x3e\x0f\xec\x6d\xd7\xbb\xaf\x64\x1b\xcf\x93\x9b\x1f\xb4\x5b\x2b\x55\x6e\x13\xdf\x72\x6c\x6a\x29\x24\xc1\xba\x30\x22\x12\x14\xbc\x0b\x75\x74\x01\x71\xf0\xcc\xd7\xf4\xc0\x89\xab\x7f\x8f\x05\x93\x40\x59\x37\xb6\x73\xb3\xf0\xa1\x5f\xd9\xcf\x14\x2c\x29\xac\xb0\x54\x7f\xad\x99\x73\x3f\xe2\x35\xa0\x23\xe2\x00\x2e\x40\x12\x05\xed\xcf\xb8\x7e\xf7\xb9\x44\x2a\x6d\x3f\x9c\x53\xed\x57\x71\x33\xbb\xe4\xfa\x33\xf1\x90\xa7\x33\xae\x23\x48\x7a\x34\x61\xac\x2f\xdc\xf7\xb9\x27\xc2\x08\x83\x38\xa8\x46\xf8\xef\x46\x18\xf4\x83\x3e\x71\x47\x98\x89\x6e\xf1\x7b\x97\x8c\x26\xee\xdc\x9a\x75\x67\x31\x0d\xb7\xa9\xb3\x19\xd3\xed\xef\x78\xeb\x41\xd5\xbf\xcc\x2e\x06\x6c\x41\x3b\x36\x20\x0e\xe9\x58\xec\x14\x57\x5b\xa4\x7a\x8f\xc6\xda\x6f\xd6\x0d\x0f\xb2\x20\x87\x48\xdd\xc2\x5d\xdf\xcc\x81\x23\x5c\xc1\x2f\x13\x55\xb7\xb1\xa1\x85\x2a\x88\x83\x4b\x20\x1f\xed\x4a\xff\x8a\xfd\x06\xb3\x76\x21\x31\x3e\x4b\x00\x61\x6b\xe2\x04\x9e\xb5\xba\xbd\xe3\x5e\xb7\xff\xcd\xbb\x3b\xe6\xc2\x50\x27\x62\x10\x07\x97\x80\x87\x40\xc7\xb8\x63\x78\xc7\xd6\x55\x87\x92\xf6\x0b\x5d\x64\xa3\x86\xf4\x5b\x3a\x46\x94\x91\xa3\x04\x21\x67\x3f\x4b\xe2\x88\x41\xc7\x62\x41\x1c\x5c\x02\x3f\xf0\xa4\xd5\x72\x82\x58\x8d\x63\x82\x6a\xf6\x7b\xb7\x32\x25\x3e\xb2\xdb\x62\x1e\xed\x0f\x59\x0f\xa6\xd5\xb8\xd1\xae\x7e\xa2\x46\x2c\x7e\x40\x1c\x54\x1b\x08\x30\xc2\xa0\xd9\xf5\x24\x0d\x24\xb1\xfb\x87\xe8\x0f\x53\x05\xd7\x04\xe0\xd7\x3d\x3e\x6f\x71\xd5\x9c\x54\x78\x8c\xbd\x5f\x50\xe3\xf1\x4e\xbe\xf1\xab\x1c\x92\x1c\xc4\xd8\x41\x1c\x5c\x03\x3f\xf7\x2f\x2f\xd5\x8a\x1c\x7f\xe4\xd4\x24\xd8\x6f\xea\x4e\x8c\x29\xd9\xde\x1c\x11\xf6\xd2\x58\x17\xeb\x4d\xd4\x9b\x2b\x3f\x0f\xed\x30\x81\x38\xb8\x06\x30\x84\x31\x42\xd9\xdc\xae\xd7\x58\xbd\xd6\x17\x7a\xd5\x3e\x78\xf6\x4a\xa7\x78\x56\xf2\xcd\x14\x7f\x93\xc4\xe1\x2b\x58\x2e\x34\x50\xf3\x78\x10\x07\xd7\x00\x81\xd1\x35\xfd\xf6\xe6\x79\xb7\x0e\xa3\x49\x6b\xd7\x29\x9d\xb4\x9c\x21\xa2\xa6\x3c\xc2\x0c\xd7\xee\xaa\x2b\x7b\x4f\xbf\xf9\x41\x3b\xc2\x20\x0e\xae\x81\xa2\x6b\x3f\x43\x3b\x68\x67\x93\x48\x59\x33\x4d\x26\x08\x18\xe3\xaf\xf6\xb4\x71\xa0\xd0\x66\xbc\x56\x65\x7a\x34\x4a\xaa\xa2\x71\x84\xd0\x00\x88\x83\x6a\x03\x01\x46\x18\x94\xea\x4e\xd2\xc0\x43\xd4\x77\xc6\x16\x2b\xab\xbb\x75\x5c\xf1\x3d\x4f\x82\x8e\x5d\xdc\x15\x95\x59\x9e\xa7\xaa\x51\x8f\x54\xfd\xae\x11\xd1\x36\x39\x0b\xd5\x5b\x02\x38\xa4\x7b\x84\x93\xc2\x8b\x42\x2d\xbe\x17\x26\xc7\xb2\x47\xd0\xf9\xb3\x8a\x7c\x7a\xde\xd9\xf7\xcd\x2f\x67\x31\xc2\x88\xd9\xac\x8c\x1c\x37\x0a\x11\x17\xc4\xc1\x35\xa0\x35\x6a\xf1\x5d\x9f\xa9\x8a\x84\x95\xb8\x2b\x9a\x4a\x84\xcb\x34\x47\xed\x0c\x76\x26\xfa\x90\xf4\xcb\x25\x8d\xfc\xb5\xa7\x97\x3b\x10\x71\x41\x1c\x5c\x03\x7d\xb4\x1e\xba\xae\x4d\x0e\x96\xcd\x9f\xeb\xec\xd9\xac\x3a\x75\x76\x2d\xda\x05\x31\xb9\x15\xb4\xbe\x7f\xb7\x93\x64\xf6\xa5\xbd\x07\x1d\xe3\x05\x70\x70\x0d\x44\x8a\x94\x30\xdc\xf7\x17\xe3\x51\xb4\xb8\x63\xf9\x80\xc4\x62\xf5\x0a\x61\x72\x1c\x99\xfc\x5b\x8d\x48\xd1\xa5\x88\x2a\x6a\xd4\x5a\x84\x06\x40\x1c\x34\x0f\x00\x8c\x30\x68\xdd\x71\x92\x06\xca\xf0\xbd\xbf\x92\x8e\xfd\x7f\xcc\xbd\x65\x54\x55\xcd\xfb\xff\x0f\x48\x88\x80\x48\x88\x20\x12\x2a\x8a\x0a\x88\x08\x48\x77\x48\x48\x4b\x37\x08\x08\x02\xd2\x25\xdd\xa1\x48\x28\xdd\xdd\x5d\x92\x22\x02\x22\x8d\xb4\x74\x28\x28\xdd\x25\xfc\xd7\xef\xbf\xd6\xd9\x5f\xef\x7d\x58\x9f\xb9\x1f\xf0\xe0\x7e\xfe\x5a\xd7\x39\xb3\xdf\xd7\x9e\x99\xf7\x9e\x99\x6b\xd8\x29\x72\xbd\xb2\x4a\x35\x79\xb2\x3e\xbb\xa7\xfc\x7e\x1d\x1f\x55\xf8\xb6\xae\x78\xd0\x41\x5f\xb8\xdd\x18\xd1\x76\x10\x07\xcf\x01\xdf\xbc\x74\xce\x6d\x03\xd4\x0d\x2d\x92\xb6\x6b\x82\x79\xb4\x51\xda\xb5\x0e\xbd\x6c\xdb\x4d\x2d\xde\x4c\x64\x4f\x48\xd0\x6a\xa0\xc2\x66\x20\x0e\x9e\x03\x6c\xf7\x79\x2e\xc6\xa3\x31\xb6\xb0\xda\xa4\xac\x1a\x76\x34\x2e\x1d\x18\x05\xbd\x7e\x8b\xbb\x46\x69\x4d\x71\xf4\x05\xc5\x01\x1b\x0d\x11\x17\xc4\xc1\x73\xe0\xf2\xc1\xf0\xf5\x2f\x65\x3f\x25\xbb\x03\x66\x84\x37\x75\xdc\xe2\x52\xec\x4a\xb3\x24\xea\x4d\xb4\xc3\x96\x79\x84\xf1\xb9\x03\x8f\x11\x71\x41\x1c\x3c\x07\x0e\x8a\x2e\xde\xcd\x9b\x0a\x4d\xe9\xa7\x78\x6b\xb4\xd8\xbd\x87\x46\x58\x7d\xad\x5e\x37\xf8\xd7\xae\xf0\xa2\x84\xd6\xab\xf6\xa0\x6b\x88\x1c\x00\x71\x50\x3f\x00\x30\xc2\x20\x13\x75\xba\x11\x16\x36\x51\x5e\x58\xac\x34\x26\x8e\x1d\xbf\xf2\x7e\xff\xbb\x43\x7a\x1c\xc1\xfb\x56\x67\x41\xf3\xda\xf6\x47\x41\x2c\x16\x8d\xb4\x7d\x08\x53\x09\xe2\x90\x8d\xb0\x03\xa6\x49\x35\x7f\x65\x4f\x3f\xda\x58\x37\x0a\x5f\x5c\xf3\x7a\xda\xf3\x36\x8c\x08\x57\x67\x09\x1f\xe3\xf7\x53\xa6\x43\x3b\x2f\x10\x91\x41\x1c\xb2\x11\x2e\x18\x73\xc2\x94\x9f\x66\x79\xf8\x5c\x6d\x77\xd6\x6b\x5b\x58\x0b\x65\x33\xd1\x27\xdf\x66\xee\x7a\x16\x7a\x7f\x7c\xd5\xa6\x18\x74\x46\x18\xc4\xfd\x3f\x23\x7c\xe9\x1f\x91\xff\xf5\x3d\xc2\xbe\xc4\xe9\x36\xd5\x7d\xa6\x4e\xc7\x4c\x18\x93\x29\x4a\x21\xb4\x6e\x3b\x72\xce\x19\x37\x65\xe2\x22\x6e\xc6\xe3\xf6\xde\x5b\xf9\x47\xd5\xe8\x94\xe5\x71\x7a\xb2\xba\xdc\xcf\xd5\xd5\x82\x66\xa4\x37\x3e\x90\x53\xda\x4d\x34\xb8\xa7\x3f\xc7\xa1\xd3\x26\xa6\xec\x64\x7b\xe1\xf3\x17\x6a\x5c\x57\x34\x55\xb6\x6f\xef\xe8\x3d\x11\x2e\xe1\xdd\xe3\xd2\xec\x98\xa4\x85\x7f\x17\x4b\xb9\xca\xb9\xd2\xd3\xfd\x88\xb0\xd5\xf0\xbf\x66\x84\x41\x4d\xfb\xfb\x8c\xb0\x18\xdc\x2c\xfd\x2c\xa2\x21\x53\x39\x34\x9c\xc9\xa1\x8b\x1e\x9c\xba\x12\x4d\x79\xac\x3d\x53\x1a\xcd\x65\x57\xca\xf4\xe3\x5c\xad\x71\x70\x88\xf9\x99\x2c\x56\x22\x1b\x61\xb1\x0b\x8c\x26\x31\x4f\xc3\xf8\x56\x34\x76\x26\x7c\x3b\xb8\xe4\xe2\x6c\x26\x98\xbf\xfb\x59\x6f\xeb\xf7\xd6\xfd\xc1\xce\x9f\xa5\x3e\x93\xa5\x59\x3e\xa4\x9f\xad\xcd\xd2\xd2\x5d\xa1\x6d\xe4\x37\xdd\x55\xb8\x32\xdb\x98\xaa\x24\x2f\x80\xd7\x38\xd0\xe7\xb6\x57\x82\xa6\xcd\x1c\x19\xff\xec\xde\x99\xb4\x16\xd9\x08\x4f\xc8\x3f\x10\x2f\x79\xf1\x35\x23\x4f\x07\xc3\xa4\x21\x48\xb5\xcc\x4d\x49\xc6\x2e\x7d\xb5\xdc\x3b\x41\xf0\x91\xf5\xfc\xf4\xbe\xe3\x99\xb4\xd6\x0e\xe9\x67\x57\x32\xad\x76\xa8\x53\xdc\xa6\x74\x02\xac\xa9\xdc\x2a\x9b\x6b\xb4\x39\xa2\x02\xb0\xa6\x79\x18\x4a\x63\xf9\xb7\xba\xc8\xf9\xce\x60\x21\x5a\xfd\xdf\x25\xd1\x69\x23\x5f\x9f\xad\x84\x35\xe5\x24\x07\x3a\x9e\xe2\x57\x31\x05\x8c\x7c\x36\x6c\x9b\x00\x7e\xf7\xd6\x2d\xad\xb7\xc5\x4f\xfc\x8b\x42\x4f\xa0\xaa\x10\x20\x0e\x3e\xf2\x99\x8f\xd6\x7d\x2f\x9b\xd3\x3d\xce\x3d\x37\xaa\xf1\x4a\x4d\xd9\xe2\xda\x23\xbe\xfc\xa5\xaf\x0d\x43\x86\xce\x68\x1b\xee\xa3\x7d\x8f\x10\x71\x41\x1c\x7c\xe4\x2b\x92\x0d\x63\x7e\xe8\x6d\x93\xb2\xdb\x7d\x5e\x7f\x8d\xc0\x0c\xcd\x28\xa7\x97\x28\x1a\xe3\xde\xf7\x84\x77\x7b\x9b\x0f\x29\x58\x20\x77\x05\xe2\xe0\x23\x1f\x6f\x43\xf2\x96\xfe\xab\xae\x10\xb2\xc1\x2f\xd7\xac\x74\x96\x12\xd7\x79\x28\xf0\x66\xb7\x7a\xe3\x34\x88\xbb\x3f\x70\xf8\xa3\x57\x43\x5b\xae\x01\x1c\xfc\x42\xc2\x42\x97\xb5\x55\x8c\x79\x81\xf0\x39\xb1\x56\xfb\x70\xfb\xa6\x10\x61\xf5\xbe\x02\xf4\x95\x9d\x25\xfc\x5f\x43\xbc\x7e\xd4\x0f\x97\x11\x46\x18\xc4\x41\x67\x84\xc5\xfe\xe7\xe4\x07\xf4\x42\x9f\xba\x1d\xee\x95\x47\x46\x46\x73\x5b\x2d\xcd\x9a\x63\x3c\xff\xfd\x6f\x45\x4e\xdb\x99\x19\x2f\xa7\x8a\x9b\xf6\x8f\x1e\x3f\xd2\x52\xc8\x85\x56\x6e\x41\x1c\x3c\x05\x38\x5e\xb6\x53\x5a\xe9\x2d\xbd\x5c\x37\xd6\x4d\x18\x11\xd1\x95\xe1\x24\x36\xb1\x4b\x0e\x29\x9f\x2a\x3f\x26\x70\xa1\x14\xa8\xde\x40\xc4\x05\x71\xf0\x14\x70\x0a\x42\xe1\x25\xf3\xa4\xc5\x9d\xba\xbc\xa1\xfe\x35\x7e\x27\x9e\x42\x0a\x1f\xc7\x07\x67\x9e\x1b\xb5\x91\x9c\x94\x21\x5f\x1f\x2a\xbe\x03\xe2\xe0\x29\xb0\xe2\x3b\xe0\x6b\x74\x80\xed\x56\xfa\x16\xe7\xea\xf6\x48\xee\xd0\xfc\x2e\xf7\x97\x64\xbd\xf9\x93\x9a\xc7\x66\x7c\x45\xb4\xb3\x4d\x88\xb8\x20\x0e\x9e\x02\x3b\x9d\x51\xcc\x84\x29\x87\x4a\x92\x7a\x78\x78\xef\xf0\xaa\xc9\x87\xd4\x72\x9b\x85\x9b\xf5\x72\xee\x48\x45\xd2\x0f\xdc\xf1\x80\x56\x82\x40\x1c\x74\x36\x10\x60\x84\x41\xbd\xeb\x69\x39\x20\x38\xfa\xfd\x41\xff\x43\x1b\xd7\x3d\x99\x47\x8b\x9e\xdd\x9f\x2f\x2f\x8b\x87\xd3\xd5\x38\x1b\x13\x0d\x96\x44\xee\x2d\x2c\xfc\x81\xcc\x0a\x88\x83\xe7\x80\xd1\xc0\x87\x6b\x47\xf3\xc7\x3b\x9f\xb1\x37\xbf\xba\xb1\x07\x95\xc7\x91\xff\xb9\x6f\xba\x1c\x2e\x17\x79\x9b\xe4\x41\xd4\xd4\xa5\x27\x88\xb8\x20\x0e\x9e\x03\x0f\x0d\x39\xfa\xb2\x19\xbe\xda\x3f\xc5\xfb\x21\x47\x60\x28\x75\x3e\xe7\x81\xe4\x3b\x1d\xc7\x77\xc5\xdb\x2f\xd6\x2b\x59\x3f\x46\x40\x77\xd3\x82\x38\x78\x0e\x5c\x62\xc7\x5d\xbb\xd9\xbe\xc7\x3c\x7b\x90\x5f\xcc\x71\x61\x94\x28\xed\x06\x97\xf9\x6f\xa2\x2f\xc1\x2f\x2d\x06\xe4\xca\x94\xac\x8c\x10\x71\x41\x1c\x3c\x07\xb0\xbe\xd3\xba\x5d\x10\xf6\x53\x65\x7a\x5c\xc4\xa8\x9d\x3c\xf8\x74\xf2\x93\x71\x0f\xf7\xf6\xcc\x5c\x7d\x9d\xdf\xd3\x85\xe8\x58\x2c\xe8\x0e\x59\x00\x07\x9d\x0d\xe4\xfb\xdf\x39\x00\x1a\xea\x4e\xcb\x81\x4c\xaa\x9f\x2f\x73\x0e\x43\x1a\xfe\xd4\xc7\xc5\xbc\x1e\x9a\x56\xc8\xb2\xce\x56\xe9\x96\x68\xca\x28\x68\xb9\x56\xd0\xf8\x33\x15\xca\x01\x10\x07\xcf\x81\x5b\xe1\xb6\xf9\x37\x34\x6c\xfb\xe6\xdd\x6c\x96\x5d\x9f\x7f\xb5\x70\xb4\x40\x95\x78\xb1\x1a\xd4\xdf\xe5\x25\x85\x1e\xf3\xf2\x9b\x35\x22\x2e\x88\x83\xe7\x40\xd6\x6c\x20\xab\x4a\x8a\xd3\x47\x3c\xa7\xa2\xc0\xbb\x4e\x77\x2f\x93\x63\xd1\xfe\x92\x2f\x79\x55\x32\x11\x73\x7f\x9d\x8e\xaf\x1a\x3a\xc7\x09\xe2\x90\x76\x05\xd0\x58\x9b\x3b\x39\x35\xe9\x54\xa2\xcb\x3f\x41\x8f\x7b\xa8\xd0\xed\x2e\x20\xfe\x52\x9b\xb4\x0f\x4d\x34\x41\x24\x44\x67\x95\x12\xda\x15\x00\xe0\xe0\x39\x10\xd5\x6b\xd3\x61\x46\xd0\xba\x16\x9c\xcd\x7c\xe7\xb6\x14\x5a\x9a\xa4\xd3\x10\xd7\x3a\xbb\x57\xf1\xb4\xd6\x0b\xd2\x01\xe7\x29\x1c\x44\x0e\x80\x38\xa8\x1f\x00\x18\x61\xd0\xbc\xe3\xb4\x1c\x70\x91\xb7\x49\x20\xa8\xc5\x7a\xea\x13\xa6\x26\x53\x7e\x97\x65\xf6\x7e\x67\x50\xfd\x0f\x87\x1b\xb7\xc4\x0d\x19\x3f\x62\xd5\xad\x86\x23\xda\x0e\xe2\xe0\x39\x50\x78\xd8\x19\x50\x9f\x49\x23\x40\xfd\xfd\xa2\x82\xe4\x23\x36\xf2\x74\x54\xef\xc3\x4f\xba\x97\x9e\x74\xd2\xe9\x3c\x2f\x1e\x48\x54\x83\xaa\x51\x03\x38\x78\x0e\x8c\xd8\x8e\x4a\x94\xa8\x9e\x3c\x09\xf5\xd2\x73\xc0\x16\xe1\xeb\xf9\x2a\xf2\xd4\x36\x52\x4f\x4c\xdf\x67\x8a\x78\x37\xaa\x23\x1c\x3a\x29\x05\xe2\xe0\x39\x20\x6e\xd3\x3a\x66\x29\x23\xce\x41\x94\x57\x36\xf7\x78\xd7\x26\x00\x5f\x9e\x22\xe7\x7a\xee\xef\xf2\x17\x63\x2d\x73\x98\x1c\x8c\xd0\x31\x01\x10\x07\xcf\x81\xb6\xa0\x08\xbf\x88\x73\x2d\xab\xfc\xe7\x2f\x94\x57\x96\x6b\xe1\xec\x79\xf5\x19\x66\x78\x35\x52\x3e\xfc\x73\xc3\x4a\x2a\x14\x6f\x01\x91\x03\x20\x0e\xea\x07\xec\xfe\xb7\x11\x06\x99\xa8\xd3\x8d\xb0\x39\x1e\xb3\xe1\x5b\xb7\x75\xd2\x1b\xc9\x75\xa1\x6a\xc5\x5c\x74\x35\x99\x4f\xca\xb7\x48\xe8\x05\xf4\x64\x54\x09\xae\xd3\xbc\x31\x43\x98\x4a\x10\x87\x6c\x84\xc3\x6b\x22\x3f\x3c\x35\xfc\x6d\x60\x29\x25\xa2\x4d\x65\x5c\x81\xe9\xea\x82\x1a\xea\xc2\x27\xaa\x75\x48\xdd\x95\xe8\x79\x44\x9b\x8a\x88\x0c\xe2\x90\x8d\xf0\xa3\xc8\x55\xbc\x1b\x9f\x07\x73\x94\x5d\x7c\x2d\x05\xe8\x53\x1b\x2c\x15\x34\x74\x32\x6e\x6a\x8a\xa3\x57\x12\x6d\xd0\xb7\xde\xa4\x40\x44\x06\x71\xff\xcf\x08\xff\xb3\xd2\xf7\xbf\xbe\x47\x78\xbb\x7e\xc8\x35\x7f\xbe\xbf\x45\xc7\x32\x13\x05\xdb\x4c\x3b\x4a\xab\xeb\x3c\xf5\xbb\xe6\x41\x11\xbb\x9c\xba\xc7\xb7\x77\x96\xf4\xfe\x36\xc2\x73\x5f\x9d\x9a\x69\x95\x44\x76\x13\x75\x88\xea\x28\xd5\xd2\xd9\x66\xd9\x8f\xe5\xaf\x6e\x0a\x31\x74\x62\xef\x2f\xf2\x3c\x5b\xfa\xfb\x2c\xec\xa8\x5e\x3d\x09\x7a\x3d\xe9\x04\x67\x10\x7b\xb2\x57\x12\xb6\x70\x41\x9c\x89\xa4\x24\x2e\xcb\xa8\x9c\x7c\x4e\x47\x14\x5a\x29\xea\x7f\xcd\x08\x83\x9a\xf6\xf7\x19\x61\x24\x23\x9c\x9a\x13\x70\xf7\x46\x69\xa7\xc7\x08\xf1\x9b\xfc\xa1\xad\x80\xb1\xba\xdd\x31\xb9\x29\x34\x95\xae\xbb\xb7\xb7\x70\xce\x5f\x16\x7c\x7c\x26\x8b\x95\xc8\x46\xf8\x7d\xd3\x80\x74\xf7\xab\x5f\x0d\x98\xe6\xcb\x8f\xf2\xc8\xc6\x8f\xde\x62\x6b\x77\x8e\x0c\x39\x5f\x50\x72\x34\xde\x16\x59\x65\x78\x79\x26\x4b\xb3\xc8\x46\x78\x82\x81\xfa\x5e\x47\xde\x6e\xb2\xab\xf1\xb9\x75\xe3\x3a\xb9\xf4\x86\x1a\xf6\x67\x71\x37\x6e\x06\x3e\x7c\x17\xf5\x40\xc5\x1f\x97\xe9\x4c\x5a\x8b\x6c\x84\xa7\x8d\x58\x3c\x03\x1a\x86\xf4\x68\xfc\xf0\xde\xe1\xd2\xb5\x96\x6b\x8d\xac\x46\xa1\x73\x17\x63\xab\xd7\xba\x9f\xff\x18\xd7\x25\x7b\x26\xad\x45\x36\xc2\x6b\x1f\xf2\x1f\x39\x2f\x89\x9d\x1f\x44\x2b\x33\x7c\x65\x34\x81\xe6\xcf\x34\xdb\xbb\xbe\x1d\x66\x5c\x1e\x33\xad\x93\x1b\xf3\x2a\xf8\xcc\x8c\x30\x28\x89\x4e\x1b\xf9\xb6\x17\xe8\x36\x23\x9a\x8b\xbe\x68\xb1\x4e\xe3\x1a\xbe\x97\xdb\x39\x61\x35\x51\x66\x2d\x7a\x32\xd8\x9d\xcb\x14\x9d\x75\x33\x09\x2a\x96\x05\xe2\xe0\x23\x5f\x82\xe5\x28\x5d\x37\x97\xe0\x23\x3d\xc9\xc0\x7d\x89\x34\x3a\x96\x4b\x2d\x7b\xa1\x1a\x6e\x75\x99\x46\xf9\xf3\xa1\x1d\x2f\x95\xa0\x12\xbc\x20\x0e\x3e\xf2\xfd\x62\x95\x1c\x76\xeb\xc2\xfd\xe9\x74\xbd\x47\x60\xb1\xfa\xd1\xd4\x4b\xee\x0f\x09\x84\xa6\x6e\x4e\xca\x27\xd6\x58\xbd\x04\xdd\x4c\x88\xb8\x20\xce\x4b\x10\xc5\xfd\xef\xb8\x93\xd1\xdf\xd3\x8b\x3b\x26\xbb\x1a\x23\x62\x4b\x85\x33\x1f\xc9\x4b\x2c\xa6\xca\x32\x3b\x6b\xd0\xf5\x4f\x18\x88\xb8\xfa\x08\x42\xfb\xe1\x40\x9c\x97\xe0\x3f\x0f\x98\x0c\x53\x94\xd1\x5b\x4b\xe1\x05\xb6\x65\x4a\xfd\x18\x7f\xa9\x5e\x96\x5e\x82\x39\xaf\x6d\x5f\x61\x4e\xc9\xa2\xa8\xb0\xa4\x6c\xc0\x80\x30\xc2\x20\x0e\x3a\x23\xfc\xbf\x8d\x30\xe8\x85\x3e\x2d\x05\xbe\x61\x36\x16\x3f\xa0\xff\xd9\x7d\xdb\x2b\x7f\xbb\xe7\xcf\xc9\x73\xa1\x5f\xd3\xb8\xdd\x01\xbe\x77\xaf\x17\x70\x71\xa9\xfe\x5a\x80\x56\x01\x40\x1c\x3c\x05\x44\xdd\x47\x74\xa6\x51\xbb\xad\xd8\xbe\xcc\x27\x8d\x4b\x8d\x2d\x37\xe8\x07\x04\x8b\x17\x97\xa4\x52\x32\x99\x65\x5c\xa3\xf6\x89\x45\xc4\x05\x71\xf0\x14\x58\x2d\xc0\x08\xe8\x3b\xd1\xdf\x59\x71\x4e\x50\x19\x61\xbd\x7c\xf9\xc6\x45\x27\x8e\x27\xd2\xa5\xfb\x9f\x70\x84\xa8\x89\xaf\xed\x42\x13\x76\x10\x07\x4f\x81\x4b\xfd\x7b\xd8\xb4\xd7\xbf\xb1\x84\x24\xac\x1f\x0c\xfe\xb9\xe9\xfb\x25\xd6\x6c\x64\x7d\x2f\xb9\xc5\xfa\x8b\xa7\x9b\xbf\xaa\x29\x74\x95\x34\x88\x83\xa7\xc0\xe8\xc4\xfb\xfb\xd3\xb3\x5e\xfc\xfd\x9a\x37\x5c\xad\xef\xac\xc6\xe9\x50\xa7\xf4\x87\x4a\x68\x8a\x6f\xb7\xae\x06\x92\x64\x8c\x28\x21\x26\x3f\x20\x0e\x3a\x1b\x08\x30\xc2\xa0\xde\xf5\xb4\x1c\xa8\x72\x6d\x9f\xcf\xac\xf7\xba\x7c\x85\x34\x46\xa3\x76\x31\x22\x35\xd4\xcd\xee\xe2\xa1\xd0\x78\x41\xec\xd3\x0f\x7f\xda\x7e\x67\x41\xdb\x57\x41\x1c\x3c\x07\x66\xdf\x5f\x8b\xde\x7f\xc9\xda\x60\x94\x86\xea\x51\xd6\xbb\xfe\x1d\xed\x3c\x91\x95\x20\x4d\x67\xbd\xf2\x33\x0a\xf4\x07\x0d\x37\xa1\x82\x46\x20\x0e\x9e\x03\xfd\x7e\xfe\xba\x5d\xc1\xe4\xbc\xad\x77\xcc\xed\x6b\xee\x63\xd4\xd1\xf3\x85\x69\x6d\x1a\x53\x84\x94\x7f\xe7\xaf\x69\x36\x19\x86\x8a\xd2\x83\x38\x78\x0e\xe8\xf2\xee\xac\x17\xd3\xeb\x47\xd2\x99\x99\xc8\x4f\x75\x39\x5f\xad\x89\x48\xb5\x59\x31\x21\xf7\xaa\x35\x73\xd9\x13\x8d\xe6\x74\x85\x6a\xf1\x01\x38\x78\x0e\x30\xa5\xf5\x6c\xef\x79\xa3\xf6\x2b\xfb\x5c\x0b\x0c\x57\x4f\x0b\x64\x30\xfe\x64\xec\xf2\x9b\xc7\xd8\x7b\x9a\xb3\x65\xa5\xf6\xf0\x2a\x22\x07\x40\x1c\x74\x36\x10\x60\x84\x41\x43\xdd\x69\x39\xa0\x15\xae\x28\x2f\x49\x75\xfd\x57\x33\x93\xa2\x71\x6c\xdc\x82\xe5\xce\x57\x3b\x0c\x0f\x86\xad\xd6\xf7\x46\xb5\xb9\x69\x76\x5b\x0a\x88\xb6\x83\x38\x78\x0e\x74\x6d\x7d\xbd\x1f\x77\xdf\xfe\xf7\x39\x37\xa5\x0a\x73\xda\xfa\xc9\x08\x76\xe6\xc8\x14\x9d\xca\x0b\x97\x0b\x6b\x2e\xca\xf8\x72\x09\x42\x05\x98\x00\x1c\x3c\x07\xda\x83\xec\x8d\x6a\x97\x4d\x82\xc9\x54\x2b\x1a\x5f\x2e\x0b\x1d\x0a\x54\xc4\xa1\x89\x99\x19\x31\xc8\xf3\x2d\x50\x32\xc4\x18\x40\x37\xe9\x81\x38\x78\x0e\x24\x8e\x7f\x76\xb1\xce\xe1\x5d\xb1\x63\x5b\xf1\x94\xf9\xd4\x5a\x96\x4a\xcc\xd0\x78\x0f\xe3\xd6\x1d\x09\x92\xfd\x12\x72\x41\xff\x23\x44\x5c\x10\x07\xcf\x81\x0f\x8b\x79\x28\x09\xe4\x2d\x11\x7f\x12\x55\xf9\xd2\x35\x77\xbc\xf9\x8d\xa8\x6c\x77\x6b\x9c\x07\xb1\x14\x55\x46\x9a\xcb\x34\x9b\xa0\x2b\xb4\x00\x1c\xd4\x0f\x00\x8c\x30\x68\xde\x71\x5a\x0e\xfc\x28\xfc\xb5\xd9\x45\x84\xe5\x49\x54\x6c\x13\xdc\x80\x3b\xd4\xbd\xc1\x8e\xff\x92\x87\xce\x11\x3b\xd8\x25\xa0\x2f\xa9\xde\x6f\x1e\xda\xc2\x0c\xe0\xe0\x39\x80\x2f\x74\xd4\x77\xeb\x76\xdf\x4b\x4b\x21\x95\x38\x07\x32\x5e\x9f\xbd\xcf\x93\xcf\xb1\x2b\x71\x73\x14\x78\xd3\x34\x58\x89\x4d\xa1\x4a\xff\x20\x0e\x9e\x03\x8c\x4f\x25\x19\x31\x72\x62\xb7\x83\x28\x08\x9c\xf6\x9a\x8f\xfc\x9f\x3c\x2d\x24\x6a\x3b\x56\x0b\xb6\xc0\xdd\x57\xe6\xe6\x7d\x06\x19\x6c\x10\x07\xcf\x81\xbe\x64\x13\xaf\x7b\x98\xc1\x43\xb6\x9d\x95\x0a\xae\x6c\xee\xe7\x43\x75\x12\xd9\x1b\x9a\x88\x99\x3b\xca\x14\xe9\x38\xf7\x34\x30\xa1\xf5\x01\x00\x07\xcf\x01\x33\x85\x1f\xcf\x71\x5f\xac\x50\x85\x4c\xbf\x56\xfd\xd9\x70\x69\x85\x87\x9e\x9a\x36\xab\x29\x69\xaa\xd3\x11\x3f\x05\x23\x95\x1c\xea\x07\x40\x1c\xd4\x0f\x00\x8c\x30\xc8\x44\x9d\x6e\x84\x29\x1a\x17\x58\x0a\x58\x77\x6f\xf4\xa1\x0d\xf9\xbc\xfb\x3d\xd3\x6b\xa7\x18\xe8\x3b\x6c\x63\xff\xe1\xd7\xd7\xe7\x52\x5a\xa2\x71\x1f\x10\xa6\x12\xc4\x21\x1b\x61\xb9\x56\x47\x54\x4f\xe7\x14\x75\x23\xa3\xe7\x4a\xd5\x83\x53\x7d\x39\xf3\xdf\x75\xeb\xcd\xcb\x36\x77\x3e\x87\x86\x5c\xd2\xf0\xb6\x41\x44\x06\x71\xc8\x46\xf8\xb3\x71\xea\x2a\xa7\xc5\x41\xb2\x71\x3e\xe6\xb2\xc1\x68\xfd\xbb\xb4\x3b\x8f\x86\xc9\x8f\x88\xe9\x6c\xac\x5c\x3d\x2e\xf2\x04\xd4\x21\x22\x83\xb8\xff\x67\x84\x51\x50\xff\xf1\xe1\xfd\xdf\xde\x23\x8c\x83\x49\xfc\x96\xda\xdf\x9c\xf6\x49\x1b\xd5\x76\x21\x5a\x66\xd6\x85\xb2\xbb\xf8\xbb\xb6\xb2\xb6\x61\x66\x14\xc1\xb4\x24\x19\x49\x7f\x1b\xe1\x9a\xc3\xa4\xd5\x81\xa4\xce\xb0\xc1\x93\xde\x7d\x8e\x87\x57\xb8\x28\x13\x65\xc8\xab\xab\x8c\x2b\x6e\x26\x8c\x0b\xf1\xd6\xb3\xfe\xed\x1f\xd8\xde\x6d\xd9\xf5\x62\xa9\x9b\xf1\x2a\xcb\xd7\x57\xe6\x0d\x4d\xcb\xdc\x95\xcd\xe2\xa5\xa1\x38\xb0\x2f\x15\x64\x4c\xdb\xed\xa0\xf8\xaf\x19\x61\x50\xd3\xfe\x3e\x23\x8c\x64\x84\xbf\xa5\xe0\x8a\x6b\xbe\xc9\x51\x77\xdb\xb9\xfb\x8c\xda\x97\x40\x59\x9f\xea\x15\x5f\x67\xec\xa4\xb8\x3c\x16\x7a\xb2\x8e\xd1\x81\xee\x99\x2c\x56\xb2\x20\x79\x34\xc9\x43\x42\x7b\xd2\x4f\xad\x0a\x4b\x8b\x14\x17\x75\x99\xfb\x5f\x11\x2c\x04\x67\x6f\xa1\x76\x9c\x53\x8f\xa7\x9e\x55\xa4\xb8\xa8\x7c\x26\x4b\xb3\xc8\x46\x38\xe3\x42\x45\x82\x44\x55\x96\xcb\xf9\xe6\x17\xb9\xba\x9c\x32\xed\xe9\x56\xdf\x7a\xdf\x8c\xa6\x61\x3e\xeb\xbe\x9a\xe2\x11\x55\xac\x79\x26\xad\x55\x47\xfa\x59\x1b\x8a\xcf\xe4\x24\x4c\x6f\x33\xfb\x8d\xb6\xdb\xd1\xf7\x24\xaf\x6f\x39\x3f\xf3\xe4\x56\xbf\xc2\x76\x81\xed\xc9\xf1\x96\xed\x33\xe2\x33\x69\x2d\xb2\x11\x8e\x4e\xde\xd1\x3a\xe7\x30\x9e\xed\x17\xfd\x2c\xf9\x66\x6d\xcc\x7b\x82\x18\x2c\xff\x3c\x27\x16\x16\x9a\x03\x72\xa2\xfe\x23\x8e\x33\x58\x76\x57\xff\x77\x49\x74\xda\xc8\xf7\xfa\xea\x25\x7f\x0c\xd2\x3c\xa2\xde\x8a\xf6\x43\xcd\xae\xa6\x66\xac\x4b\xb1\x85\xd3\xef\xa3\x02\x2c\x23\xfc\xef\x0e\xc8\xdf\x5f\x46\xf4\xf8\x20\x0e\xa9\x52\x92\xd5\xd4\xa3\x65\x4d\xe9\x6f\xbf\xee\xd1\x99\xbe\x36\x72\x8a\x3b\xb1\x0a\xb5\x51\x94\x5b\xb9\x94\x56\x30\xca\x9a\xb0\xd4\x0a\x5d\x1e\x09\xe2\x90\xee\xce\x99\x1a\x1c\x1c\xc8\x0b\x18\x7e\xe8\x72\x6e\x55\x38\xf1\xe9\x57\x29\x69\x65\x4e\x2b\x7e\x51\x99\x3c\x6a\x29\xbe\xcb\xad\x39\xf7\x21\xc3\x0a\xe0\xe0\x23\xdf\x27\x07\x9c\x85\x42\x29\xe5\x7d\x7d\x0f\x21\x43\x3c\x41\xa7\x96\xfb\xce\xdd\xde\x02\x45\x75\xd1\x2f\x67\x1d\xad\x2c\xe9\xd8\x69\x11\x71\x41\x9c\x97\xe0\x3f\xf7\xd5\xc8\x26\x30\xe4\xcb\x0c\x48\x1d\x14\xb2\x3a\xe7\x29\xbc\xc4\x96\x9f\xf3\xaa\xe0\x5b\xd3\x0d\xcf\x0c\xe9\xaf\x0f\x39\x0e\x46\x23\x45\x18\x61\x10\x07\x9d\x11\xfe\xdf\x46\x18\xf4\x42\x9f\x96\x02\x69\xab\x96\xba\x6d\xb5\x62\x54\x77\x2f\x27\x0d\xc7\x4b\xea\xb3\x87\xcd\x94\x91\x68\x16\xf4\x3d\x4d\xc3\x0a\x5d\x33\xe7\x0b\x77\x47\x34\x1d\xc4\x21\x1d\x13\x8f\x2b\x0f\xad\x29\xb8\x23\x7e\x39\x5d\xd7\xd5\x8c\x6b\xbf\x6a\x4d\xe2\x89\x53\x90\x32\xb7\x6b\xff\x0b\xf6\xdc\x90\x4a\x54\xe8\xfa\x24\x10\x07\x4f\x81\xe3\xfd\x61\x01\xb7\xfa\x23\xd6\xce\xbb\x76\xaf\x30\x3b\xa5\x8a\x93\x22\x9e\xb3\x70\x2a\x56\x1b\x6b\xcc\x54\xc9\x1e\x2b\x86\x40\x5b\x98\x41\x1c\x3c\x05\xde\xf3\x28\x1d\x72\xeb\x98\xae\xad\x5b\xf8\x11\xb0\xdb\x5a\x64\x58\xfe\x78\x88\xaf\x4d\x28\x58\xe1\x25\x5d\x86\x7b\x3e\x55\xf8\x06\x22\x2e\x88\x83\xa7\xc0\x4a\x1c\xb7\x52\xb4\xcf\x55\xa6\x67\x61\x81\x9a\x0a\x06\x2b\xeb\x8d\x6b\x5c\xc5\x3b\xee\x82\x82\xca\x2c\xaf\x8a\x9f\x4f\xa5\x3e\x44\x4c\x7e\x40\x1c\x74\x36\x90\xe5\x7f\x4f\x80\x41\xbd\xeb\xa9\x77\x49\xdb\x70\x92\xdc\x76\xc9\xe5\x0a\xec\xba\x5e\x8f\xc9\x6a\xed\x97\xc4\x27\xae\x6d\x47\xe1\xcc\xa2\x25\xba\xc4\x1f\x9e\x4f\x05\x19\x56\x10\x07\xcf\x01\x96\xd1\x98\x6c\xcd\x62\x41\xba\xeb\x91\x18\x89\x6e\xea\x44\xef\xbb\xb0\x26\x2e\xda\x12\xdc\x1c\xd2\x2f\xb9\xf1\xa4\xb0\x9d\x13\xaa\xee\x0c\xe2\xe0\x39\x30\xcc\xc5\x28\x61\x60\xae\x97\x4e\xe4\xec\x48\xdc\x1c\xa3\xd1\xaf\x4f\xd7\x2b\xe8\x39\x2d\x4b\xdb\xaa\xa1\xa6\x1d\x5d\xd5\x06\x15\x36\x03\x71\xf0\x1c\xf8\x46\x72\xdd\x03\xc5\x69\x9f\x9e\x65\xe4\x83\xff\xc4\x14\x47\x68\x2d\x19\x69\x33\xef\x83\xe2\xb7\xe1\x04\x63\x42\x07\xa1\xcc\x84\xd0\x47\x21\x00\x07\xcf\x01\x5b\xbd\xe7\x37\xad\xa8\x1e\xf0\x9b\xab\x4a\x2b\x76\x18\xc5\xaf\x26\xf3\xe9\xbe\xe9\xd2\xbc\x93\x1d\x26\x61\xdc\xb8\xd7\xf3\x18\x0f\x91\x03\x20\x0e\x3a\x1b\x08\x30\xc2\xa0\xa1\xee\xb4\x1c\xb0\x7a\x91\x56\xd6\xb5\x79\x4d\x2b\xdc\xd5\x6e\xec\x81\xee\xf2\xb8\x35\xea\x8d\x9e\xfa\x8c\x2b\x3d\x36\x76\xca\xdb\x05\x5a\xb9\x50\xad\x00\x10\x07\xcf\x81\x39\x1d\xc7\x1c\xc2\xc3\xe9\x66\xc3\x62\xae\x18\xff\x21\xf7\x3f\x65\xf3\x9f\x3f\x2a\x72\xe5\xa9\xdc\x28\x7a\x6d\x84\xb3\x25\x0c\xdd\xd0\x07\xe2\x90\xce\x89\x8f\x05\x3b\x60\xa6\xfd\x52\x23\x9c\x53\x48\xcb\xf1\xb2\x26\x9d\x24\x55\x22\x33\xaa\x63\xb9\x5c\x39\xac\x8c\xd9\x3b\xef\xca\x03\x9d\x13\x07\x70\xf0\x1c\xc0\x3d\x77\x75\xa6\x5d\xfd\x4e\xfc\x51\x0c\xbb\x8b\xda\xcf\x73\x55\x82\x15\x58\xe5\x83\xc4\xb7\x55\xe2\xb5\x09\x3e\xfd\xd1\x17\x23\x81\xea\x47\x02\x38\x78\x0e\xc4\xed\x85\xea\x50\xbe\xd6\x32\x97\x49\xee\x4a\x9c\x8f\x5f\xa1\xa3\xf6\xd0\xfa\xc6\x60\x11\x84\x63\x93\x7c\x9e\xff\x02\x6b\x56\x37\x22\x07\x40\x1c\xd4\x0f\xa8\xff\xef\x1c\x00\xcd\x3b\x4e\xcb\x81\x97\xc5\x32\xef\x7e\x46\x6c\xbb\xe7\x6b\x2c\xde\xc9\x1b\x52\xc2\x9c\x4f\xfb\xc3\x7a\x83\x43\x0c\x8b\x21\xe2\x92\x9d\xa5\x91\x0f\xf4\x4c\x41\x1c\x3c\x07\xc2\x58\x30\x1a\x36\x0e\x22\xef\x0b\x58\xb6\x32\xaa\x0d\xbf\xf0\x12\x33\xff\xda\xe3\x91\x9a\x10\x6c\xf0\xa9\xfb\xb0\x73\x62\xe3\x3a\x22\x2e\x88\x83\xe7\x00\x5e\x89\x5a\x65\x4d\xde\x68\xa8\xf1\xc3\xe2\x28\x3f\x37\x2d\xb6\x9b\x03\x89\xeb\x0b\xea\x27\x7c\xd5\x28\x34\x91\x96\x53\x07\xd0\xff\x05\x71\xf0\x1c\xe8\xe9\xcd\x34\x74\xc4\x51\xbe\x6b\x59\x73\x83\x4e\x62\x61\xe0\xd7\x95\xe2\xc4\x54\x8b\x0e\x85\xd7\x87\x7d\xf7\x24\x8b\x04\x1c\x99\x11\x71\x41\x1c\x3c\x07\x2c\xdc\x1d\x29\xfc\x89\xe9\x6e\x86\xc7\xe0\xb8\x90\x2f\x2e\x8d\x31\xa4\x5e\x4f\x3a\x96\x8e\xe2\x55\x79\x5e\xd1\x6e\xc9\x31\xe5\x88\xc8\x01\x10\x07\xf5\x03\x00\x23\x0c\x32\x51\xa7\x1b\x61\xc1\x82\xef\x43\x1e\x65\x3a\x79\x24\xec\x31\x9c\x36\x3a\xb7\xfb\x13\xb2\xd2\xbe\x05\xae\xf2\x93\x0a\x7a\xe0\xda\x8c\xe9\x4b\x42\x55\xa3\x41\x1c\xb2\x11\x3e\xec\x68\xcf\x34\xe2\xe3\xc2\x8b\x1b\xbd\x39\x6e\x24\xf4\x8d\x79\x8c\x5d\xa8\x8e\xaf\x81\x4b\xb5\x16\x97\xdc\xd1\xaa\x45\x6f\x07\x11\x19\xc4\x21\x1b\xe1\x7a\xcb\xc8\x5d\x26\x5f\x5b\x6f\xf4\xdf\x3d\xeb\x5c\xbd\x74\xdb\xcc\x72\xd8\x34\x96\x9c\x3a\x6c\x4b\x36\x4c\x7c\x94\x07\x3c\xb7\x10\x91\x41\xdc\xff\x6f\x84\xff\x91\x63\xff\xfa\x1e\x61\x9c\x43\xa2\xfa\x22\xbf\xc7\x73\xc4\xb1\x9f\x03\xa8\x30\x46\x24\x16\x6c\x55\xbf\x45\xc6\x19\xa9\x93\x5a\x6e\xca\x33\x46\x3a\x67\xfe\x6d\x84\x97\x4e\x9a\x82\x44\xbf\xf3\xcc\x7b\x96\x7c\x74\xb8\xb3\xcf\xc2\xfd\x10\x5d\x9f\xef\x1e\x5e\xe3\x50\x96\x54\x85\x39\x23\xb9\x0b\xcf\x5f\x28\xc6\x1b\xba\xae\x0b\x38\x95\xb5\x8b\x27\x93\xb2\x0b\x39\xf9\x33\x7e\xa4\x14\x06\x7d\x09\x24\xbc\x5c\xcd\x28\xf9\x5f\xb6\xd1\xbf\xfd\xd7\x8c\x30\xa8\x69\x7f\x9f\x11\x46\x32\xc2\x17\x95\xb3\x09\xa7\x82\xb2\xe3\x5a\x39\xf6\xc6\x4a\xcc\xb6\x88\x7c\x33\x05\x55\xdf\xab\x6b\x99\x2e\x31\x3e\x30\x7c\x7c\x6c\x33\x77\x26\x8b\x95\xc8\x46\xd8\xb5\x9f\xf2\x69\xbc\x4d\x5a\x45\x42\xd4\xfb\xc3\x26\xe1\xf0\x5f\xc2\x89\xf2\x15\xd5\xd8\x1a\x57\x5c\x34\x29\x95\xab\xa9\x07\xa9\xce\x64\x69\x16\xd9\x08\x57\x76\x3f\xfa\xf9\xc7\xfe\xb3\x4d\x48\xa1\xd9\x05\x75\x8c\x50\xd2\x04\xe6\x0f\x99\xe7\x65\x2b\x6e\xbf\x5c\x78\xa1\x2f\x5a\x42\xcb\x7b\x26\xad\x45\x36\xc2\x79\xcf\x9d\xa8\x45\x39\x86\x43\xf7\x95\x79\x46\xec\x9f\x0f\x72\x73\xd2\x76\x12\xe6\x4f\xbc\x59\x0e\xec\xe2\x44\xb9\xb1\x65\x9d\x78\x26\xad\x45\x36\xc2\xb3\xec\x3f\xaa\xb4\x9e\xfe\x46\xa7\xb4\x6c\xfb\x1c\x76\xa3\xcd\x7f\x6e\xcf\x66\x7b\xf9\xb1\xa8\xbd\xdf\x4c\x49\x1f\x3e\x06\xaf\xdd\x99\x19\x61\x50\x12\x9d\x36\xf2\x3d\xf2\xa0\xee\x37\x4f\x5e\xea\xbb\xc2\xa5\x3c\x98\xf3\xb9\xc0\xbc\x27\xf7\x40\xda\x40\x70\x7a\x26\xbd\xfa\x5a\x70\xe9\x2a\x01\xe4\x56\x40\x1c\x7c\xe4\xe3\x9c\x72\x9f\x48\x7a\x2d\xd0\x3e\x8a\x23\x2d\xdd\xfd\x7d\x01\x3f\xd2\x18\xcb\xf3\xf3\x5c\x13\x57\x77\x85\x1c\xed\x8f\x78\x46\x68\x5f\x2c\x88\x83\x8f\x7c\x3f\xe9\x3d\xc5\x48\x7d\xbf\xbc\xf9\x19\xa1\xd0\xe7\x6e\xdb\xb7\xd2\xa2\x78\xd9\x40\xa0\x05\x3f\x84\x77\x2f\x73\xf0\x65\x6b\xa3\x04\x22\x2e\x88\x83\x8f\x7c\xd8\x4f\x9c\x22\x0c\x98\xe7\xcf\xf5\xc4\x54\xb8\x8a\xac\x3e\x24\x0b\x10\x7d\x4c\xb6\xca\x71\xed\x3e\x4e\xc1\xd1\x9b\xb8\x62\xfc\x9f\x88\xb8\x20\xce\x4b\xf0\x9f\x9f\x13\xf7\x75\x84\x4c\xfb\x27\x2b\xcc\x9d\xbe\x50\x12\xd4\x97\x28\xdb\x31\xe8\xe3\x3d\xc7\xb9\xe2\xbe\x56\x68\xf1\xe5\x24\xa4\xe9\xdd\x07\x84\x11\x06\x71\xd0\x19\xe1\xff\x6d\x84\x41\x2f\xf4\x69\x29\xf0\xbb\x2e\xcc\x95\xca\x8a\xd5\x0d\x0f\xad\x29\x89\x7f\x66\x37\xc9\x49\x82\xf8\x8e\x74\x34\x75\x38\xee\x42\x47\x78\xa0\x4b\x39\x64\x84\x41\x1c\x3c\x05\xfc\x4a\x5b\xf6\xf1\x4b\x3f\x25\x1b\xa9\xa3\x66\xef\x57\xcb\x69\xec\x29\xff\x48\x9b\x7f\xdd\xf6\xe0\xea\x31\xfe\x01\x09\x89\x79\x04\x22\x2e\x88\x83\xa7\x40\x33\x31\xe5\x4e\xbf\x8f\x02\x79\xc6\x96\x43\x32\x76\x82\x78\xb2\x6d\x37\x0d\x53\xc2\x4f\x8e\xb6\x8e\x15\xfa\xdf\x93\xdd\x45\x13\x88\xb8\x20\x0e\x9e\x02\x37\xbb\x27\x7f\x7c\xdc\x47\x8b\xfb\xd0\x3d\x20\xdd\xf0\xe7\x45\xc2\xfb\x21\x0f\x2f\xa3\xe0\x0f\x9e\xbf\xaf\xe1\xf5\x5b\x1d\xd6\x55\x22\xe2\x82\x38\x78\x0a\xe8\x55\xbe\x7c\x4e\x31\x93\x43\x4c\xa0\xe6\x18\x24\x28\xee\x18\x54\x14\x77\x88\x4a\xee\xe5\xba\xfc\x79\xc8\xca\xc7\xab\xfa\x7b\x28\x62\xf2\x03\xe2\xa0\xb3\x81\x00\x23\x0c\xea\x5d\x4f\x5d\x11\xce\xcc\x57\x72\x91\x0b\x97\x52\x89\x1c\xc8\x33\x5f\xf6\x09\xac\xc0\xac\x0d\x7b\xad\xea\x76\xd3\x72\xb9\x76\x1c\xd5\x71\x17\x2a\x40\x06\xe2\xe0\x39\x30\xf9\xc9\x78\x55\xfa\xaa\xbb\x1d\x8a\x5c\xe5\x52\x09\xc6\x6f\x1e\x51\x25\xfe\x69\x2b\x43\xb1\x19\x82\x76\xfd\xcf\xb9\xb8\xe2\x64\xd0\x77\x2b\x00\x07\xcf\x81\x1e\xe3\xe4\xeb\xd3\x37\x88\xcd\x68\x45\x57\x0a\x5f\xef\xa4\x9f\x2b\x66\xf0\xc0\xbd\x36\x8e\x65\x1b\x4f\xbd\x5c\xa3\xa7\x6d\xfb\x0d\x9a\xa8\x02\x38\x78\x0e\x38\xf4\x38\xcd\x57\x3e\x59\xf2\x20\xfe\xa3\x99\x5f\xa3\x51\xba\x53\xe6\xb6\x7f\x95\x25\x90\xcb\xe3\x7b\x26\x13\xb6\x67\x32\x2d\x1e\x22\x2e\x88\x83\xe7\x00\xee\xdd\x00\xb1\x02\x5f\x2d\x3a\xd6\xdf\xa5\xb7\xa3\x09\x14\xba\x17\x8b\xdd\xe6\x84\xc7\xe4\x33\x97\xfd\xd4\x7e\x47\x3c\x0f\xad\x43\xe4\x00\x88\x83\xce\x06\x02\x8c\x30\x68\xa8\x3b\x2d\x07\xd4\x0e\xf5\xf1\x7b\x14\xa5\xa9\xbe\x14\x5b\x59\x89\xa3\xf4\xc9\x0c\x8a\xae\x9c\x98\x0a\xa5\x95\x62\xed\x4e\x62\xc7\x90\x4f\x42\xa7\x64\x40\x1c\xd2\xd6\x68\xff\xdf\x15\x61\x5e\x37\x26\xed\x23\x97\x8c\x7a\xd3\x37\x27\x32\x3b\xa3\xe6\x2e\x08\x13\xd2\xb0\x07\xd4\xdd\xe9\xfb\x26\x02\xad\xb0\x82\x38\x78\x0e\xf0\xf3\xdf\xc8\x59\x48\x50\x4b\x79\x14\x5c\x50\x4b\x4a\xf0\x9d\x30\x6b\xdc\x3f\xfa\xe5\xfc\x4e\x23\x8e\x5e\xb0\x0d\x5d\xc2\x00\x37\xf4\xf1\x06\xc0\xc1\x73\xa0\x62\x61\x3f\xa3\x47\xd4\x8d\xe2\xf3\x83\x5f\x31\x73\xa5\xed\x35\xce\x25\x0d\x95\xd4\x03\x1f\x6a\x57\x71\xb4\x50\x59\xca\x6f\x41\x1f\x43\x40\x1c\x3c\x07\x8a\x1c\xef\x3b\xa3\x5e\xdd\x18\x55\xc2\xad\xd1\x94\xcc\xa0\x27\x30\xe5\x89\x78\x7c\x8f\xaf\xf6\xe6\x07\x9f\x5b\xf1\xf4\xa9\x0d\x35\x88\x1c\x00\x71\x50\x3f\x00\x30\xc2\xa0\x79\xc7\x69\x39\x30\x37\x4e\xb0\x47\x7c\xc7\xed\x62\xc3\x47\x99\xb5\x7b\x2d\x05\x6f\x37\x25\x7e\xb9\x3b\xe2\xd2\xda\x3f\xae\xb8\xa1\x68\x9b\xb1\x72\x08\x7d\xb4\x00\x70\xf0\x1c\x48\x9d\xa5\x79\xf0\x7a\x25\xfd\x2b\xd5\x43\xee\x9d\x94\xaa\x9c\xe7\x54\x8b\x4f\xd1\xd6\x71\xae\x4d\xe7\x26\xe8\xf9\xd9\x4b\xa4\xce\x21\xe2\x82\x38\x78\x0e\x90\xec\x56\xa2\xfb\x30\xf2\x4c\x6c\x0a\xd8\xe1\xfe\x99\xaf\xae\xeb\x57\x2a\x60\xbb\x98\x99\x7c\x1c\x52\x46\x8b\x77\xaf\xde\x14\x2a\xf0\x06\xe2\xe0\x39\x70\x83\x4c\xdb\x7b\x5f\x43\xe2\x85\x8d\xe5\xf1\xd1\x5e\x28\x69\x6a\x8b\x23\xbb\xe1\xbd\xdc\xfb\x2d\x9b\x72\xee\xb1\xf5\x63\x0e\xa5\x88\xb8\x20\x0e\x9e\x03\x8f\x5f\x6e\x65\x9d\xeb\xfc\x63\xbd\x1c\x99\xc0\x84\x73\xb7\x3f\xf2\xcd\xde\xa4\xe8\x40\x46\x9d\xd5\xcf\x7c\xb6\x64\x7f\x97\xc0\x13\x44\x0e\x80\x38\xa8\x1f\x00\x18\x61\x90\x89\x3a\xdd\x08\xdf\xa1\x33\x70\x0a\xea\x45\x7f\x3c\xf4\xa3\xa6\xc7\xef\xd5\x0e\x73\xff\x33\x59\xe6\xb8\x44\x4b\xb6\x54\xa2\x3b\x77\xb2\x6e\xd2\x89\x20\x4c\x25\x88\x43\x36\xc2\x0f\xfb\x9e\x15\x89\xd1\xf1\x1e\x58\xff\xba\x3b\x93\xf6\x90\xfd\xe3\x44\xed\x17\xbe\xb6\xd0\xbc\xc4\x21\xb9\xc7\xdd\x7c\xcc\xea\x1a\x88\xc8\x20\x0e\xd9\x08\x87\x1c\xaf\xa7\x7f\x79\x6a\x1c\xa5\x48\x6c\x18\x82\x35\xd7\x7e\x45\xc1\x74\x2a\xe9\xa8\xab\xa9\xbe\x75\xfc\x38\xae\x6a\x27\x47\x1e\x11\x19\xc4\xfd\xff\x46\xf8\x1f\xdb\xd9\xff\xf5\x3d\xc2\x29\x0c\xd5\xb7\xc9\x78\x1f\x54\x5e\xcd\x63\xfd\x39\xea\xb1\x77\xb9\xbe\xdf\xa0\xd8\x9b\x20\xa3\xfc\xb8\xbe\x08\x9f\xb6\x4c\x2a\xf2\x6f\x23\x3c\x15\x5d\x8d\x9f\x22\xae\x7f\x81\x80\x55\xfb\x3b\x76\xb6\x97\x58\xad\x9e\x98\x01\xbf\x33\xae\x61\xc5\x7b\xd9\x17\x57\xba\x4c\xfa\xff\x42\xf3\x15\x39\x50\x48\xe8\xc3\x30\x82\x3b\x42\x92\xb9\x6f\xb9\xe5\x79\x72\x0e\xba\x48\xf4\xec\x4a\x5c\xeb\x95\x4e\x51\x66\x9e\xdf\xf9\xaf\x19\x61\x50\xd3\xfe\x3e\x23\x2c\x0e\x37\x4b\xb6\x1a\x0c\xe3\x7d\xfd\xf6\x9b\xdf\x3d\xc5\x72\x25\x9c\x18\xf3\x6b\xd6\x0c\x51\xde\x72\xc5\xeb\x77\x7e\xf2\xdf\x45\x31\x21\x10\x3f\x93\xc5\x4a\x64\x23\xdc\x96\x56\xd8\x72\x53\xea\x69\x7b\xd8\x0a\x8f\x43\x2f\x05\x95\x8a\x61\xed\x76\xe3\x46\xf9\x42\x3a\xd3\xce\x98\xa0\x13\x91\xd0\x99\x5c\x28\x84\x22\x8b\xf4\xb3\xf1\xfa\xb6\x54\xfd\x29\x2d\xd6\x0d\xdf\x84\x85\xad\x35\x7e\x45\x96\x7d\x2e\xe1\x99\xe4\xee\x20\x14\x79\x31\x28\x29\xd1\x78\xb4\x76\x26\xad\x45\x36\xc2\xb4\xf8\x86\xec\x62\x2e\x1a\xcc\x5f\xdb\x5a\xb8\xbb\xde\xb5\xac\xbd\x51\x60\x9f\x78\x35\xc7\xd8\x20\xbb\xd3\x4f\x6f\xd2\x20\x28\x75\x26\xad\xb5\x47\xfa\xd9\x17\xf6\x2a\x38\x44\x17\x5a\x54\x73\x1d\x3e\x0b\x07\x32\x08\x39\x30\xc7\x8d\x15\xc7\xd6\x19\x26\xde\xb1\x88\xe4\xc3\x90\xeb\xaf\x39\x33\x23\x0c\x4a\xa2\xd3\x46\xbe\xe7\xca\x59\xce\x85\x77\xf4\x35\xda\x45\x44\x16\x2d\xfb\x69\xb4\x3e\xdc\x34\x1e\x31\x5d\x9e\xbe\xff\x98\xc3\x42\xfe\xfe\xdc\x4b\x68\x2f\x20\x88\x83\x8f\x7c\x1e\x98\xbc\xb1\x5b\x16\x5c\xf2\x65\x28\xea\x68\xed\x95\x92\xae\xa2\x5c\xec\x38\xf2\xa3\xab\x2c\xbd\x2d\x96\xdf\x66\x3b\xca\xb0\x11\x71\x41\x1c\x7c\xe4\xa3\x61\x55\xbb\x9b\x3b\x77\x35\xed\xe1\xc2\xca\x3d\x37\xbf\x7e\x5f\xbc\x7b\x24\x87\x81\xae\x07\x8c\x13\xa8\x15\x78\xf2\x44\x34\xa9\x88\xb8\x20\x0e\x3e\xf2\xfd\x9a\xba\x95\xd9\x34\x9f\xb3\x55\xa8\x4d\x71\xd9\x2e\xed\xfc\x2c\xe3\xea\x05\x23\xe1\x4f\x3b\x7a\x1d\x23\xb4\x3f\x3f\xed\xc4\x0f\x43\x5b\xae\x01\x9c\x97\x20\xca\xf9\xbf\xe3\x12\xf4\xc7\xeb\x3d\xa7\xa9\xad\xb1\x50\xfc\xe2\x1f\xcd\xed\x65\xea\x4e\x97\x6d\x57\x1b\x53\xb9\xfc\xce\x1a\x55\x3f\x00\xb5\x9a\x10\x61\x84\x41\x1c\x74\x46\x58\xfc\x7f\x4e\x7e\x40\x2f\xf4\x69\x29\xb0\xaa\xf7\x55\xca\x56\x49\x67\x3c\x9a\xfd\x55\x04\x0a\x2f\x65\x66\x0f\xb9\xb2\x9d\x6f\x5e\x94\xbf\x06\x41\xfd\xbe\x8a\xa4\x20\xb4\x85\x19\xc4\xc1\x53\xc0\x7a\x72\x78\x90\x8b\xac\x6a\x6b\x76\x2d\xaf\x5b\x42\x15\x3d\xd2\xc3\xae\xcc\xfd\x7b\xf3\x1c\x8a\x74\xb7\x24\xb5\x5b\xdc\x02\x74\xde\x12\xc4\xc1\x53\xe0\x5b\x54\xb3\xc0\x45\xdd\x0c\x15\x7d\xb4\x51\xa3\x2a\x9e\xe4\x07\x2b\x2a\x9f\xf2\x94\x2b\x24\x98\x2b\x6d\x33\x16\xc4\x78\x6d\xff\x40\xab\x76\x00\x0e\x9e\x02\x39\x1b\x87\x18\xf3\x91\x3f\x5f\x8c\x64\x63\x68\x8f\x76\xc9\xeb\xfc\x12\xd9\xea\x6b\x91\x93\xde\x58\x9a\xcb\xa6\x34\xf3\xbe\x06\x5d\xc7\x02\xe2\xe0\x29\x30\x3b\xe5\xf4\x76\xe7\x01\x27\x43\x1b\xaf\xf6\x1a\xd3\x71\x2e\x9f\xb2\x33\xda\xd6\xbc\x28\x71\xdb\xd7\x4f\x96\x22\x04\x0f\xf3\xa0\xf3\xa1\x20\x0e\x3a\x1b\x08\x30\xc2\xa0\xde\xf5\xb4\x1c\x78\xdb\xc1\x9d\x2a\xdf\xa5\x62\xad\xba\xb4\xf6\xe7\xdc\xb1\x70\xf6\x2c\xbd\x3f\x81\xd2\x86\xab\xc6\xd1\xfd\x9f\x95\xbd\x5b\xfb\x31\x88\xb6\x83\x38\x78\x0e\x90\x85\xab\x5a\x15\x30\x0b\x24\x4a\x77\x06\x74\x96\x9c\x47\x11\x75\xb2\xc3\xfe\xd6\xe7\x7b\x35\xa8\x28\x29\x8a\xe8\x8e\x09\x06\x74\x8e\x13\xc4\xc1\x73\x20\x9c\x7c\x41\x92\x47\xf8\xb5\x01\x4f\x9b\xa3\xc9\xce\x88\xab\x96\xcf\x9a\x74\x62\x29\x4e\x66\xa5\x07\xc9\x0f\xbb\xe2\x13\x3e\x4b\x44\x5c\x10\x07\xcf\x81\x2a\x91\x8b\x72\xde\x8b\x99\x5c\x7f\x04\xf4\xf1\x9d\x1e\x6f\xf8\x74\xd2\x16\xfb\x56\x85\x5c\x0c\xe3\xf7\x55\xd6\x71\x75\x8f\xb1\x83\x3e\x08\x00\x38\x78\x0e\x3c\x59\x18\x43\xfd\xa4\x70\xdb\xe4\xe0\x49\xd1\x83\x85\xcb\x6b\xc3\x37\x1e\xd2\x33\xee\x71\xfb\xfc\x96\xdc\x51\xb7\xee\x90\xa1\x7e\x8e\xc8\x01\x10\x07\x9d\x0d\x94\xfd\xdf\x39\x00\x1a\xea\x4e\xcb\x81\xc8\xc9\x0f\xe7\xab\x67\x08\x29\x29\x54\x71\xb1\x8b\xdf\x13\x3d\xfb\x6c\x88\x15\x5c\xb4\x61\x9c\x62\xa7\x5f\x71\xa4\x5d\xcd\xd6\x85\x68\x3b\x88\x83\xe7\x80\x99\x29\x8d\x86\xa0\x9b\xd2\x61\xb5\xa7\x3d\xb1\xb1\xd3\x3b\x46\xd4\x82\x93\x2e\x7b\xe5\x4e\xf7\x3b\x8b\xa5\x54\x6c\x31\xa5\x9d\x50\x11\x2e\x00\x07\xcf\x81\x0f\xcc\x97\x2b\xc7\x94\xc4\x98\xbf\xf3\xda\x19\xd8\x47\xe3\x09\x6d\x33\x84\x74\xf0\xf6\x07\xd2\x60\xe1\xaf\x95\x76\x60\x4c\x40\x05\xd3\x40\x1c\x3c\x07\x7e\xf2\x96\xbd\x13\x22\x36\x21\x3b\x9a\xbc\xfe\x66\x69\x2b\xfa\x13\xcf\x06\xd9\xf5\xec\xec\x4c\xff\x73\xef\xf7\x68\x28\x4b\xa5\x5e\x40\xdf\x5a\x01\x1c\x3c\x07\x5e\xe4\x77\x2b\x1d\x98\xc9\xaa\xaf\x89\xa2\x56\x11\xad\xe3\x14\x8a\xc6\x1b\x1a\x11\x4b\x29\x86\x72\xe8\x66\xe0\x88\x86\xba\x4d\x21\x72\x00\xc4\x41\xfd\x00\xc0\x08\x83\xe6\x1d\xa7\x5e\xa3\x96\xab\x29\x2f\x19\x53\x62\x2b\x38\xde\x41\xa8\xce\x24\xf1\x86\xf1\x46\xa7\x9e\xea\x87\x9e\xc7\x5d\x4a\x2b\x02\x09\x3d\x9b\xd0\xa5\x0c\x20\x0e\xa9\x76\xe6\x6f\x59\x72\xfa\x0f\x49\x9c\x16\xae\x7e\x49\xf4\x1f\xec\x06\x2a\x45\x9a\xfe\x68\xd2\x27\x91\x54\xfc\xbc\x8d\x26\x24\xff\x0c\xaa\x1a\x0d\xe2\xe0\x39\x70\x15\x5d\x90\x5a\xdc\x58\xa6\x91\x82\xb6\x2f\x68\xf5\x40\x09\x75\x39\xbf\x6e\xc3\x80\x41\x1c\x17\x9f\xfc\xf2\x74\xe1\x3b\xc3\x5f\x88\xb8\x20\x0e\x9e\x03\xac\x8c\xb1\x6d\x82\xba\x2d\x39\x16\x2a\x5f\x3a\xed\xb0\x87\x13\x28\x88\x24\xfd\xdc\xf5\x38\x09\xf6\x7f\x47\xc9\x39\xde\x2e\x84\x76\x05\x80\x38\x78\x0e\xd8\x2b\x4c\xa9\x75\xfb\x5f\xeb\x22\xd2\xa4\x7d\x89\x57\x3f\xe2\x67\xeb\x4c\x3c\x4d\x10\x4a\xc5\xe5\x2c\xc9\x52\xf2\xc4\x9e\xee\x11\x22\x07\x40\x1c\xd4\x0f\xd8\xff\x6f\x23\x0c\x32\x51\xa7\x1b\x61\x9f\x94\x95\xa7\x0f\x55\xd7\x4d\xbc\x0c\x9f\xf2\xe3\xce\x7f\x7a\x7d\x70\xf0\xb1\xab\x23\x36\x32\xdf\x5c\xea\x6b\xa9\xca\x2c\xf1\x5b\x84\xa9\x04\x71\xc8\x46\xb8\x35\x86\xb6\x89\xfe\x7b\xa1\x75\x33\x73\x6b\x30\x56\x66\xb5\xc8\x64\xe6\x9d\x21\xa9\xa2\x64\xe1\x22\xac\x42\xfb\xc0\x0c\x32\x55\x44\x64\x10\x87\x6c\x84\xc3\xd3\x02\xef\x78\x10\xe4\x37\x60\xf2\x2b\x69\x5c\x10\xf2\x5f\xbb\x61\x14\x1a\x68\x66\xd3\xd2\xd4\x66\xd7\x4e\x3e\x2e\xf1\xf5\x25\x74\xfa\x18\xc0\xfd\xff\x46\xf8\x1f\x77\x3f\xff\xeb\x7b\x84\x39\x52\xea\x9e\xfd\x29\xfd\x1d\x80\x5b\x5b\xc6\xe4\x6a\xfb\x32\x2c\xc5\xe5\xc2\x1d\xf3\x54\xe7\x47\xf9\xee\xb1\x89\xe2\xd7\x2e\x0d\xfc\x6d\x84\x79\xc7\x88\xaf\xf6\xd5\xb6\xbd\x2a\x26\x4a\xda\x5e\x4a\x4e\x56\xe4\x1e\x5f\xb2\x68\x10\x27\xe0\xc1\x8f\xaa\xbf\xe9\x35\xbe\xc5\xfe\x17\xfa\xa3\xcd\x9d\xb3\x58\x2f\x59\x10\x57\xf3\xa6\xb8\xce\xaf\xcd\x30\x9a\xd2\x2b\x2a\xe4\x73\x36\x9d\x9e\xaa\x6d\xae\xab\xf9\x06\xff\xb9\xad\xd1\xa0\xa6\xfd\x7d\x46\x18\xc9\x08\x93\x35\xe1\x11\x3e\x2a\xf0\x53\x9d\x11\x7d\x34\x75\x37\x3d\xa8\x91\x23\xca\x18\xad\xed\x9e\x1b\x77\xe6\xed\xec\x4f\x73\x7e\x1b\x6a\x67\xb2\x58\x89\x6c\x84\x37\xda\x13\xc8\x23\xe9\xc2\xaf\xb5\x72\x71\xc7\xb2\xa0\x78\xbd\x2e\xc0\xb8\x1b\x2e\x8b\x42\x83\x8b\xb2\x8b\xa9\xd8\x4f\xf1\x26\xe3\x4c\x96\x66\x91\x8d\xf0\xc5\x99\x00\xd9\xfd\xbb\x6c\x83\xf1\x64\xdb\x4e\x6f\xa7\x1e\x60\xb3\xee\xc7\xcd\x24\x92\xf0\xc8\xe4\x78\xd9\xc9\x47\xfb\x2b\x32\x9c\x49\x6b\x91\x8d\x30\xae\x46\x93\x00\x9d\xae\x58\xa7\xa8\xc0\x66\x33\xb7\x7b\x45\x30\x8b\xa1\x16\xfd\xc8\x1d\x6e\x9d\x30\xc5\xfe\x71\xdc\xb7\x97\xbb\xcf\xa4\xb5\xc8\x46\xd8\xfc\x7a\xd6\x0a\xf6\x42\x99\xa5\xe3\x66\xea\xbb\xcb\x2f\x0d\xa9\x14\xf4\x58\xc6\x70\x19\xf8\x4d\x33\x28\x45\xe5\x70\x8d\xee\x8b\x9e\x99\x11\x06\x25\xd1\x69\x23\x5f\x87\xe3\x72\x39\xc1\x55\xf5\xf7\x3b\x03\x38\xa1\xe5\xba\x3f\xe7\xd2\x36\xe7\x43\x89\x1e\x4b\x84\xba\xcf\x4f\x30\xd4\xc6\x7d\xfa\xbf\xcb\x53\x01\x1c\x7c\xe4\x7b\xcf\x36\xfa\x94\xdc\x64\x75\xe3\xc6\x7d\x71\xa5\xd6\xcd\xa3\xfb\xfb\x4d\x2f\xad\xdf\xf1\xd0\xa2\xaf\x77\x60\xc8\x77\xf2\x96\x40\xfb\xe1\x40\x1c\x7c\x24\x91\xc4\x89\x97\x16\xff\x82\xbb\x37\xc7\x9d\xad\x94\xb3\x30\x6a\x16\xc7\x7f\x43\x62\x29\x96\x68\x53\xe3\x3e\xcd\x2f\xe6\xfd\x5a\x01\x44\x5c\x10\x07\x3f\xbc\xf3\x1d\x53\x81\x77\xe6\x95\xda\xcd\x5d\x19\xbd\x5a\xb3\x9e\x9a\xc5\xef\xaf\xce\xbd\x4b\xa2\x1a\xd8\xf4\x7a\x72\xee\xba\x5e\x3a\xd7\x39\x44\x5c\x10\x07\x7f\x0e\x91\xe4\xa3\xf2\xd7\xbb\x6e\x85\x66\x3e\x43\x6d\x15\xd9\x9c\x67\xf4\xc3\x53\x7c\xf1\x83\x35\x9e\x72\xd7\x65\x4f\xd0\x29\x49\x1a\xcb\x5d\xfd\xdf\xbd\x89\xa7\x69\x77\xbf\x85\x36\x2f\xe4\x8d\xa0\xa4\xe1\x22\xa6\xdd\x58\x57\xf5\xa5\xa8\x5b\x0c\xf7\xe2\x48\xbf\x2b\x35\x89\xbd\xfa\xd4\x9c\xc6\xbd\x8a\xf8\xcf\x20\x0e\xfe\x9f\x9f\x9d\xd3\xf6\xbd\xe3\x87\x4f\x9b\x6f\x62\x45\x9e\x64\xbf\x67\x61\xf3\x0c\xbb\xf2\xc4\x3d\xbd\xa5\xf3\xfa\xca\x8a\xd7\x8b\x4d\x5e\x44\x5c\x10\x07\xd7\x4e\xe9\xe0\xb6\x43\x17\x61\xc8\xb7\x99\xc2\x39\xea\x1b\xc2\x76\x04\x0e\xac\xd7\xdd\x5f\xfd\x5a\x16\xf9\x35\x2e\x8f\xba\x13\xc7\x0f\x2d\x39\x81\x38\xb8\x76\x6f\xaa\x95\x79\xbc\x58\x34\x3f\x6e\x1f\xa9\x05\xa5\xff\xde\xc8\xd6\xb2\xd7\xd1\x76\x51\x11\xc1\x0a\xeb\x61\x4c\x09\x25\xae\x9e\x45\xc4\x05\x71\xf0\xe7\xe0\xa4\x42\xe8\x98\x6a\x70\x81\x37\xe5\x4b\xff\x72\xca\x3d\x17\xe5\x30\xee\x89\xaf\xcb\x43\xb6\x0b\x8f\x44\x57\x87\xd5\x7f\x5a\x0a\x23\xb4\x03\x75\x67\xa7\x69\x37\xdf\x75\x2b\xe2\xd5\xb2\x83\x77\xbc\x87\xd1\x46\x24\xf3\x53\xeb\xb5\x51\x07\x49\xd5\x01\x01\xc7\xfa\x9b\x56\x2c\xa1\x71\x95\x50\xc5\x2f\x10\x07\xff\xcf\x84\x87\x6a\x89\x4b\x9c\xe6\x8f\x43\x2d\x5e\x28\x84\x38\x0a\x64\xf7\xd8\xf8\xa0\x9f\x7f\x19\x36\x1c\xe2\x2d\xc2\x53\x8f\xbb\x5a\x88\x88\x0b\xe2\xe0\xda\x85\x75\xa9\xec\x4c\xea\xe5\xec\x5c\x35\x33\x93\xb6\x5c\xda\x61\x75\xe5\xf8\xb9\x90\x90\x66\xfb\x34\xdb\x88\xbf\xd0\x89\xde\x04\xaa\x4a\x03\xe2\xe0\xda\xad\xbe\xbc\x5f\xfa\xfd\x8d\x30\xc9\x54\x52\x52\x93\x86\xbe\x0e\xae\x47\x64\xc6\x7b\xb2\xed\x5a\x8a\x88\xa7\x07\xfa\xbc\xba\x3b\x50\x5c\x10\x07\x7f\x0e\x0e\x1b\x58\xb6\x45\xd6\xbf\x0c\x3a\x7a\xc7\xb7\xdf\x73\x7a\xd0\x04\xaa\x89\x49\xbc\x6d\x19\x7d\x6d\xfd\x6e\x4f\xab\xa0\x3c\xcf\x1f\xa1\x1d\x68\x4c\x38\x4d\x3b\xac\xf7\xf5\xe4\x56\x44\x02\xca\xa2\x5f\x92\x43\xdf\x25\x8b\x90\x2f\x4e\x0a\x4f\x9c\x74\x12\x73\x2a\xd7\xea\xd9\xd9\x52\x7a\x0d\x22\xfe\x33\x88\x43\xda\x47\xbe\xca\x3a\x22\x57\x15\xdd\x17\xc2\x11\xf1\xc8\xad\xe2\x6d\x52\x9d\x9f\xcf\x54\x6e\x66\xed\xcd\xe9\xb1\x93\x80\x16\x7c\xf9\x5c\x68\x1f\x39\x80\x83\x6b\xf7\xb3\x10\x37\xeb\x3c\x85\x27\x47\x65\xb2\x23\xf7\xc0\xa7\xa2\xa2\xf6\x6f\xb8\x01\x15\xa5\x0f\x03\xaa\x33\xec\x0a\x7c\xb3\xdf\x42\x77\xc1\x80\x38\xb8\x76\x9c\x4a\xbf\xca\x7e\x66\xdf\xe3\x1e\xae\xab\xc8\xa5\xf6\x65\xbe\x1d\xab\x34\x30\xb7\xc1\x1d\x51\x65\xf1\xdd\x19\x17\xa3\xe2\x8e\x03\xb4\xeb\x07\xc0\xc1\x9f\x83\xa7\x92\x92\x8a\x51\xad\xb0\xe5\x41\x78\x74\x8c\x71\xe0\x49\x1c\x53\x98\x18\xb6\x05\x8a\xea\x92\xc6\x97\xbe\x1f\xa3\x89\xbc\x4a\x08\xed\x40\x03\xeb\x69\xda\xa5\xb8\xa2\x68\x7c\xc6\xdd\x50\x2a\xd8\x0e\x37\x0f\x57\x91\x9e\x1e\x94\x31\x2f\xc2\x64\x8e\x2a\xae\xa4\x4a\xb6\xd1\x14\xbb\xbf\x8d\xf8\xcf\x20\x0e\xe9\x20\xb4\x2a\x01\x27\x9b\x50\x82\x93\xca\xdb\x72\x3b\xf7\x7c\x34\x33\x71\xf3\xf5\xd6\x1b\xcf\x62\x44\x1d\x30\xb9\xa4\xaa\xed\xfe\x40\x4e\x0f\xc4\xc1\xb5\xf3\x5e\x9d\x88\x7e\xb4\x66\xf4\xc8\x8c\xca\xdb\x20\x2b\xf2\x72\xca\xee\xd4\xb7\x16\x2a\x9b\xf2\x84\xe6\xbe\x84\xe5\x4a\xad\x05\xe8\xc8\x0e\x88\x83\x6b\xb7\x71\xb1\x56\x34\xc4\xab\x5c\xc3\x8b\x4d\x8c\x45\x8e\xc0\xea\x33\xae\x29\x75\x51\x44\xf1\xc8\x48\x64\x89\xfb\x83\xfa\xee\x46\xa8\x9c\x3b\x88\x43\xca\xe1\xba\x1a\x93\x0f\x38\x2f\x2d\x3c\xe3\xcb\x53\x68\xd3\xeb\x1c\xb0\xea\x83\x05\x0c\x09\x0e\x69\xd5\xde\x3c\x17\xb6\xb7\x95\xcd\x71\xd7\xfc\x77\xb3\xfb\xd3\x1d\x9a\x85\x98\xf2\x54\xd8\x95\x87\xc6\x1b\x12\xe3\x3e\xc2\x55\xd1\x0f\x62\xb1\x6b\x79\x32\x38\x3d\x3b\x73\x62\x34\x9b\x45\x2c\xcb\x6e\x23\xdc\x0e\x88\x43\x76\x68\xaf\x75\xa9\x3c\xad\x6d\x3d\xb6\xd4\xb5\xde\xbe\x4a\x1b\x7b\xb3\xb1\x33\x7d\x97\x32\x65\x8e\xf7\xee\x55\x5c\xaa\x87\x5c\xf8\xf7\xbd\x11\x91\x41\x9c\x97\x30\xca\xa5\x7f\x46\x6e\xc6\xe0\x5d\x41\x93\x4f\x8e\x7e\xd6\x7d\x29\xce\x87\x92\x47\x5a\x56\xeb\xd1\x4e\xf0\xd4\xf8\xcd\xf4\xdb\xf6\xa9\x51\x77\xf4\xda\x10\x91\x41\x9c\x97\xf0\x79\xd8\xd3\xf8\xd7\xe5\x8c\x23\xb1\xa7\x8e\xc5\xe3\xec\x28\xfc\x07\x15\xab\xe2\x33\xe7\x94\xc6\xc9\x6b\x3d\xd5\xab\x26\x3c\x3e\xd0\xc6\x8f\x87\x4b\x0b\xef\xfd\xed\xd0\x02\x2d\x46\x22\x46\x5f\x3c\xd3\xad\xf9\x5a\xe5\x6e\x2d\xe0\x70\x87\x79\x37\xa7\xa5\x64\x30\x23\x23\xe4\xe4\x66\x63\x68\x3e\xb3\xd5\xdf\xce\x48\xbc\x6e\x06\x97\x26\xfe\x36\xcd\xbc\x53\x78\xec\x1e\x19\x4d\x34\x77\x3c\x0d\x61\x58\x77\x76\xe2\xed\x75\x2e\x8b\x58\x3c\xa3\xff\x9a\x43\x03\x35\xed\xef\xc3\xab\x48\x0e\x6d\x88\xec\x7b\xab\xd4\x68\xbe\xd8\x9d\x27\x63\x45\x0b\xec\xa4\xc4\x26\x18\x85\x8d\x0d\x03\x69\x63\x09\xbd\x01\x4e\x5f\x1a\xe8\x2e\x9f\xc9\x2a\x1a\x2b\x92\x79\xe8\x4b\x36\x49\xb9\xb8\x5b\xf1\x8c\xf2\x61\xa6\x68\xa3\x1f\x97\x7f\xfe\x8f\xda\x90\x6c\xb2\xd2\xbb\x4f\x2f\x6b\x66\x1e\x7a\xcd\x72\x9c\xc9\x9a\x21\xb2\x43\xbb\x14\xd1\x97\x5d\x7c\x4e\xd9\x4c\xe5\xd6\xe2\x15\x9b\xe4\xb9\xe1\xfd\xde\xc2\x0b\x85\x92\xf8\x19\x44\xd8\x03\xca\xda\x53\x2e\xa4\x67\xd2\x5a\x0d\xa4\x9f\xed\x26\x64\xaa\x09\x8c\xe1\xb5\x62\x9a\x72\x9d\xc0\x7b\xd6\xfd\x60\xd6\xf3\x7e\x7d\x38\x8a\x7a\x65\xc9\xa3\x39\xf6\x64\x93\x8d\x8f\x67\xd2\x5a\x64\x87\xd6\xfb\x7e\xf8\xae\x12\x3a\x67\x6b\x5f\x9e\x9b\xc2\xf2\xa1\xe0\x6f\xef\xfb\x77\x62\x4e\x42\xa3\xf6\xfd\x24\xb9\x8e\x46\x53\x06\x06\xce\xcc\xa1\x81\x92\xe8\xb4\x11\x2b\x9e\xfe\x1a\xde\xb4\xd3\xb5\xeb\xc5\xd1\x12\x62\xb4\x9e\xf5\x26\x29\xd6\xf7\x46\x70\xaa\x6d\x30\xe3\x7b\xf6\xfa\x89\x66\x8c\x5c\x10\x3d\x35\x88\x43\xaa\xe2\x34\x6f\x9b\x74\xc5\x7a\xb4\xc4\x57\xda\x74\x38\xb5\xf3\xdd\xd3\x35\xbc\xe3\x0c\x4f\x2a\xdf\xc1\xbd\x8f\x17\x1c\x9b\x06\xea\xa1\x6f\x9e\x20\x0e\x3e\x62\xe1\x78\xd5\x7d\x63\x1f\xf5\x23\x49\x18\xfb\xbc\x63\x7f\xee\xd9\x4f\xa2\x80\x4f\xe3\xd5\x82\x04\x5b\x5f\x8a\x48\xc3\x6f\x4c\x72\x42\x27\x17\x41\x1c\x7c\xc4\xba\x59\x36\xe5\x41\x34\x67\xf6\x6c\x94\x14\xbb\xa4\x35\x64\xff\x47\xbb\xac\x83\x1c\x93\x9a\x53\xd1\xa6\x4f\x46\x7f\xcf\x18\x0f\x54\xc3\x12\xc4\xc1\xbf\xa5\x0e\x19\x90\xf6\x7b\xc4\x18\x94\x86\x6d\x6f\xd5\x3a\xcd\x30\x96\x2b\x9e\x1b\x42\x8b\x65\xcc\x43\x8d\x54\x2e\xdb\x0a\x3f\xa6\x85\x66\xf9\xa0\x37\xf1\x34\xed\x50\x72\xd0\x54\xd1\x9c\xb1\x30\xa9\x8c\xbe\x9e\x84\x66\x6a\x65\x99\x5d\xe3\x21\x63\xe6\x8b\xdd\xbe\xec\x5a\x51\x69\xef\xf0\xc5\x06\xf1\x9f\x41\x1c\x5c\x3b\xe1\x28\x81\x06\x34\xc2\xa4\x42\xa3\x37\xd5\xed\x36\x97\xe9\x23\x26\x43\x75\xb1\xd4\xb8\x9f\xe4\x3d\x16\x09\x49\x25\xfa\xf2\x7f\x77\x1c\x81\x38\xb8\x76\x3d\x4e\x94\x42\xe5\x62\xbc\x73\x8a\x6f\x48\xdb\x49\xc5\xc3\x9a\x1e\x44\x79\x2c\xf5\xa6\xed\xe2\xf5\x24\xba\x92\x5b\x87\x62\x40\xb5\x32\x41\x1c\x5c\x3b\x97\x21\xac\xd9\xd2\xde\x35\x27\xa1\xc7\x42\xe9\xcd\x3d\x12\xa8\x03\xfe\x59\x4f\xc5\xab\x44\xc7\x38\x5a\x94\x09\x44\x7c\xa6\xa1\x53\xa7\x20\x0e\xae\xdd\x0b\xa6\xde\x73\xe3\xdc\x6f\x49\x2c\x0c\x7f\xb6\x2c\xdd\x12\xf9\x73\xd7\xf5\xa5\x44\x7e\xfb\xea\x4c\x0c\xef\xc5\x67\xee\x6f\x46\xd2\x10\xda\x81\xba\xb3\xd3\xb4\x8b\xad\x9a\xda\x47\xb7\x19\x7e\x45\xd9\x36\x27\x9d\x55\xc7\xd9\xfe\x6e\xb0\x22\xdb\x39\x70\x30\x2a\x24\x59\x91\x95\x88\x68\xd0\x00\xf1\x9f\x41\x1c\xd2\x26\x59\xcd\x9c\x35\x5c\x93\x1a\x66\x7d\x1a\x19\x89\x0b\xe2\xa6\xed\x35\xfe\x2f\xc4\x2a\x4e\xd4\xf9\xaf\x64\xec\x39\xca\x6a\x3f\x86\x6a\x53\x83\x38\xb8\x76\x1c\xd8\xc3\xe3\x8f\x08\x06\xe5\xa9\x0d\x57\x1b\x6c\x8a\xa3\x6e\x87\x15\x70\x04\x61\x2c\x2e\x50\x35\xa4\xbb\xa6\xd7\xf7\x2a\xde\x82\x6a\x53\x03\x38\xb8\x76\x89\x8e\xcf\x7c\xab\x36\x26\xde\x1a\x62\xd9\xcb\xda\xfd\x32\xc2\x7d\x62\x60\x68\xd9\x92\x52\x5a\x55\xf0\x85\x80\xe0\xe3\xcd\xaf\x50\x49\x2e\x10\x87\x54\xea\x6b\x02\x57\xa6\x74\x62\x1b\xef\xe3\x93\x41\x83\x96\xc7\xe8\x46\xa6\x2e\x42\x31\xba\xa3\x44\x24\xf1\x2e\x57\xed\x1b\xc4\xcb\xc6\x10\xda\x81\xc6\x84\xd3\xb4\x3b\xf0\x8a\xf0\x1e\x96\x0c\x51\x89\xc1\x93\xec\x93\x25\xa7\xb4\x51\xb2\xd5\x39\xb7\xbd\xdb\xaf\xbb\xed\x69\x11\x7a\xed\x71\x01\x74\x17\x1a\x88\x83\x6b\x77\x33\x85\x6f\x36\x79\x6f\xc4\xb7\xec\x89\x53\x6c\xe1\xa5\x30\x4e\xd4\x7c\x3f\xbb\xd5\xd5\xc9\x74\xf2\xdc\x4f\xe1\x06\x3a\x6b\xd0\x57\x2d\x10\x07\xd7\xae\xc3\x80\x4b\x24\xfa\xe4\xaa\x4d\x23\xe1\xf4\xf2\x5a\x99\x29\x77\x07\xbb\x43\xd7\xcd\xf2\xf8\xe1\x30\xcc\x9e\xb6\x26\xf2\x4e\xe8\x7d\x06\x71\x70\xed\x4c\xaf\x96\x1a\xe0\x5c\x78\x1d\xc3\x2c\x2d\xd1\x50\x2f\x8d\x29\x74\x81\xea\x39\x3d\x8d\x85\x6c\x52\x4f\xc5\x84\x1c\x5f\xbd\xf7\x6d\x44\x5c\x10\x07\xd7\x4e\x59\x05\xcd\x9d\x2b\x23\x6e\x9d\x4c\xb2\x24\x4f\x76\xc7\x35\x0a\xe7\xb9\x6b\xf5\x1d\xff\x70\x74\xeb\xcf\x37\x68\x92\x87\xb1\x3b\x10\xda\x81\x06\xd6\xd3\xb4\x7b\xea\x95\xc8\xf6\x4d\x2b\xb8\x56\x87\xe4\x04\x37\xfd\xa7\x18\xfe\x94\x5e\x23\xbd\xd2\x4f\x76\xfe\x90\x09\xcf\x23\xd3\xbd\x8f\xd0\xa6\x54\x10\x07\xd7\xae\x6d\xca\x93\x3a\xc9\x2a\xcf\x5c\x19\xbf\xf0\x1d\xbb\xbb\xfd\x14\xd7\x82\x85\xe4\xcc\xea\x1b\xbf\x92\x97\x6f\x29\x29\x1f\xe7\xaf\x20\xe2\x82\x38\xb8\x76\xdb\xe7\x19\xf6\x0e\x8d\x12\x66\x74\x1b\xc9\xcf\x31\xfc\x5e\xe7\xf4\xf2\x0f\xc0\xeb\x35\xc5\x4a\xad\xa4\xe6\x15\x21\x12\xb9\x04\x6d\x20\x06\x71\x70\xed\x2e\xb6\x8a\x7a\x30\x70\x5f\x6f\x3b\xa6\xc3\xfc\x85\xa6\xb6\x4e\x23\x2d\x91\xf9\x8a\x06\xaf\xf8\xbd\xcc\x4b\xff\x3f\x9f\x47\x1f\x40\x07\x2a\x40\x1c\x5c\xbb\x71\x66\x6d\xbb\xcd\x15\x92\x1d\x03\x77\xce\x21\x8d\x8b\x28\x64\xc3\xf6\x0e\xea\xe9\x81\x1b\xa3\x27\x0d\x16\x11\xf9\x97\x45\x07\x11\x0e\x0d\x34\xbb\x3f\xdd\xa1\x5d\x5a\xeb\xf3\xb9\xdd\x53\xe9\x8f\xdb\xe3\x91\x15\x55\xeb\x5e\x9d\x1f\xb3\xb9\x18\xac\x43\xa2\x3b\xff\x24\xf3\xd6\x27\xef\x9e\x12\x84\xdb\x01\x71\xc8\x0e\xed\x99\xe7\x7a\xe7\x33\x54\xb5\xbe\x2d\xf7\xcd\xc3\x2d\x7e\x52\xbf\xe5\xa9\xe2\x38\x65\xd7\x26\x47\x13\x51\xf4\x38\x7f\xdd\x2b\xda\x88\xc8\x20\x0e\xd9\xa1\x75\xb6\x29\x64\xe6\x9f\x3b\xce\x78\x11\x4e\xe1\xbf\xbf\x58\x2f\x7e\x37\xc9\x33\xa6\xf8\x57\xdc\x03\x94\x9c\xaf\xd4\x8f\xbc\xb5\xa0\x53\x95\x20\xce\x4b\x98\x1a\xf6\x34\xfe\x75\x9d\xdd\x78\xd9\xaa\xe4\x5f\x25\x6f\xee\x71\xbc\x8d\x99\xe9\xb6\xe3\x99\xdb\xff\x6a\xa9\x92\xf4\xa4\xfd\x0d\x86\xc9\xed\x09\x8b\xd7\xe1\xf1\x7f\x3b\x34\x47\x19\xb5\x82\xaa\x50\x26\x9a\x1c\x4f\x6f\x52\x02\xc2\xe3\x4d\x33\x35\xde\xeb\x58\x18\x72\x26\x07\xa3\xf6\x8b\x6c\x89\xe9\xd9\x7f\x2f\xb7\x45\x52\xb0\xf8\xb7\xbd\xd1\x25\x5d\x54\xba\xc5\xec\x3c\xbb\xe1\xdc\x52\xb6\x48\xf4\x84\x59\x52\x5d\x06\xfb\x81\xab\xc1\xc5\xca\xff\x9a\x43\x03\x35\xed\xef\x53\x95\x48\x0e\x6d\x13\xc3\xe1\x52\x43\x96\x00\xda\xae\x1a\xe5\xe5\xd9\xa1\xec\x29\x0a\x94\xa7\x9d\x73\xf6\xa1\x38\xf3\x34\x3f\xe6\x79\xeb\x7f\x7f\x39\x93\xe5\x1d\x64\x87\x96\xa0\x12\x5e\x11\x89\x31\xcd\xd8\xba\xe4\xfd\x64\x42\x76\x00\xa5\x97\x58\x72\x68\x6f\x3e\x2a\xb7\x1d\xbb\xdc\xee\xfc\x18\xa9\xfb\x99\x2c\x66\x21\x3b\xb4\xcc\x0d\xc1\x8e\x43\x21\xd2\xb8\x67\xdc\x0c\xdb\x45\x25\x6a\x6f\xea\x72\x51\xdf\x3f\x73\x13\x6e\xd5\x1a\x65\x6c\x4e\xab\xd4\xc3\x3d\x93\xd6\x22\x3b\xb4\x8c\x1d\x97\xc4\x45\xdd\x63\x89\xf5\xf3\xd5\xae\xc2\x96\x36\xb4\xd6\x8a\x89\x9f\x77\x7e\xb9\xed\x05\xcf\x7c\x98\x78\x62\xfa\x76\xf5\x4c\x5a\x8b\xec\xd0\x9e\xf3\xa7\x86\x5b\xbc\x9b\xc7\x9e\xb8\x7d\x2d\xb5\x7e\x7d\xc8\x1f\xa3\x45\xb0\x37\xea\x93\xe5\x27\xb7\x8f\xad\x4f\x59\x1c\xa7\xdf\x9c\x99\x43\x03\x25\xd1\x69\x23\x16\x41\xc8\xef\x75\xdb\x81\x67\x27\x13\x22\xab\x33\xde\x44\x64\x82\x6f\xed\xb9\xcb\x7c\xa2\xa8\x5a\xe7\xa7\xad\x56\x3c\x4c\x0c\xa1\xf2\x42\x20\x0e\x3e\x62\x51\x85\xff\x90\x65\xd2\x2b\x54\xfe\xd3\x14\xf5\xf9\x16\x77\x91\x3f\xe6\x16\xee\xc6\x55\x74\xbe\xc7\xdc\x9b\x02\xfd\xf4\x97\x9c\xa1\x9b\x57\x41\x1c\x7c\xc4\xd2\xc4\x74\xd8\xda\x1c\xb0\xf0\xaa\x79\xb7\x56\x82\x46\x8a\x15\x4e\x7f\xf2\xdb\x3b\xff\xb7\x24\x93\xa1\x0a\x2d\x46\x24\xe3\x39\xe8\xaa\x35\x10\x07\x1f\xb1\xf0\x7f\xcf\x30\x5b\x1e\x7f\x25\x10\x15\xa7\xb3\x63\xed\xcc\x67\x2a\xbb\xdd\xcf\x5b\xd1\xc2\xf5\xe8\x59\xc0\xaa\xed\x20\xaf\x29\x34\xeb\x02\x71\xf0\xca\xf5\x38\x94\x1f\xeb\xde\xf8\xf8\xc4\x3e\xbe\xda\x7c\x0d\x73\xf9\x9b\xa0\xeb\xfc\xd3\x0c\xc6\xbb\xf4\x93\xb6\x46\x6e\xc4\xca\xdf\x5f\x41\xb3\x0d\xd0\x9b\x78\x9a\x76\x9c\x78\x0d\x3b\x1c\xed\x17\xe5\x49\x22\x87\x1b\xff\x98\xf8\x2f\x3c\x57\x0c\xae\x6d\x51\x92\x57\xfa\xac\xd1\xf8\xcd\x82\xf1\x07\xb4\x11\x18\xc4\xc1\xb5\x1b\x7d\xd8\x30\x7c\xf3\x3d\xae\x0e\xd3\x37\x1c\xd9\x98\x39\x17\xa5\x17\xef\xf7\x84\xcf\x63\x62\x34\x3b\x69\xee\xf7\xe7\xf5\xbe\xc3\x47\xc4\x05\x71\x48\xeb\x30\x26\x3e\x31\x5a\x3b\x17\xde\xdd\x64\x89\x7b\xf4\x9b\xe4\x9c\xbc\x71\x64\xe2\xf7\x42\x81\x98\x1f\xfb\x43\x0c\xef\xf2\x1d\xb0\x2f\x42\xeb\x30\x00\x0e\xae\x5d\x78\x66\xad\xa9\x72\x5a\x50\x90\x54\xdb\xca\xc8\x9b\x7d\x93\x27\xd7\xf7\x3a\xe8\x52\x68\xa6\x77\xf2\xf1\x5c\x15\x5a\xc2\x6f\x41\x45\x62\x41\x1c\xd2\x25\x44\x49\x46\x61\x65\xe7\x6f\x35\xff\xac\x9d\x19\x6f\x53\x99\x79\x39\x41\x8d\xed\xb5\x87\xcf\x3d\x5f\x60\x5f\xf6\xd1\x46\x40\xbc\x13\xa1\x1d\xa8\x3b\x3b\x4d\x3b\x92\x19\x72\x23\x89\x8a\x7b\xd4\xe8\xa8\xd7\xbc\xb0\x67\x70\x9a\x89\x9b\x9b\xd8\x59\xf0\x05\xfc\x1a\x6f\x28\xb4\x94\x3a\xde\x82\x76\xee\x81\x38\xb8\x76\xf5\x33\xca\x45\xda\x8d\x27\xf7\x2b\xa5\xfe\x5c\x2c\xad\x40\xf9\xf5\xf3\x24\xa5\xef\x4e\xc2\x95\xa1\x35\x8b\x8b\x39\x17\xae\x38\x41\xcf\x18\xc4\xc1\xb5\xab\x98\xa2\x99\xa9\x7d\xd6\x4f\x98\x76\x12\xe3\xb6\xf5\x95\x37\xa4\x44\x33\x61\xd1\x85\x81\xba\xf9\x57\x62\x7c\xaf\x2d\xc9\x43\x68\xb3\x35\x88\x43\x2a\x3c\x69\xf3\x50\x4d\x34\xfc\x8f\xe7\x8a\x1e\x16\xc3\xfb\xf3\x19\x3a\xf3\x4b\xc1\xb2\x4c\xc4\xf8\x46\xd1\x57\x6e\x1f\x4b\xeb\x50\x66\x43\x3b\x0d\x01\x1c\x5c\xbb\xde\x46\xed\x82\x23\x81\x7d\x99\x68\x59\xca\xdc\x7a\x02\x7a\x8a\x56\xa3\xad\x5e\x8a\x93\xde\x45\xc2\x0d\xb1\x54\x1b\xd7\x57\x9a\x08\xed\x40\x63\xc2\x69\xda\xed\xfb\xea\xd0\x92\x74\xbc\xff\xf6\xa2\xa2\x8e\xe8\x6b\xc1\x1d\x05\x74\xf1\x5b\x9f\xc4\x7a\x69\x34\x22\xd6\x9d\x1a\xd9\xe5\x59\xd3\x11\xff\x19\xc4\xc1\xb5\x7b\xb2\x3c\x30\xd2\x61\x33\xa7\x85\x15\x48\x14\xea\xda\x33\xd2\xb7\x30\xeb\x17\x31\x73\xf8\xd0\x80\xa2\xe2\xbb\xe1\x58\xd9\x49\x00\x22\x2e\x88\x83\x6b\x57\xf2\x1a\x45\x75\x35\xa2\xad\x6e\xe1\x66\x71\x71\x8c\x30\xd5\x02\x6d\xc8\x6f\xb3\x2c\xaa\xa2\x01\xbc\x03\x4f\xad\xf7\x21\x86\x77\x10\x71\x41\x1c\x5c\xbb\x2f\x37\x19\x16\x5f\x2b\x53\xb0\x8d\xee\xbf\xb9\xda\x6b\x46\x5b\x3a\x56\x38\x4a\x78\xfc\x61\x6e\xe1\x61\xa5\x1a\x8d\xf6\xa1\x27\x54\x40\x17\xc4\xc1\xb5\x73\x7f\x21\xfa\xda\xb9\xfe\xee\xf5\x1c\x89\x87\xd8\x73\x82\x1f\xbd\xb6\x34\x53\xb0\x43\xb0\x51\x06\x5b\xed\x5d\x4c\xa8\x3a\x19\x84\x10\xda\x81\x06\xd6\xd3\xb4\xc3\x5f\x33\xfa\x90\x70\xcd\x52\x84\xc6\x14\x25\x3b\xdc\xa2\x5e\xc4\xf9\x16\xfe\xa1\x80\x82\xdc\x4e\x64\xd0\xcb\xdf\xbc\x17\xe5\x9c\xa1\x7e\x1e\xc0\x21\x5d\x31\x8c\x83\x81\xf1\xe5\xb2\xf4\x50\x93\x46\x57\xcc\x80\x62\xd2\x46\xc7\x6b\x03\x9e\x80\x37\x1d\x1c\x6c\x35\x2a\x0a\xf3\xb9\xe9\xd0\x75\xad\x20\x0e\xae\x9d\xae\x50\x65\x44\xf1\x11\x4a\xf4\xb7\x86\x87\xef\xb5\x94\xd1\xae\x48\xdd\x3b\x16\x7a\x88\x76\x51\xe4\x9d\xc4\x53\x6e\x3c\xba\x25\xe8\xff\x82\x38\xb8\x76\xde\x82\x6a\xfa\xd6\x54\x81\x3f\x53\xdc\x39\x63\x3b\x0b\xdd\x72\x3c\x8f\xe4\xe5\x4b\xbb\x6b\x19\xfb\x7e\x4f\x1d\xde\x90\x47\x0d\x85\xd6\xe6\x00\x1c\x5c\x3b\xd6\x1b\x2c\x1c\x0c\xbb\x14\x3c\xaf\xee\x5e\x69\x0f\x1c\x52\x7a\xc1\xd1\x57\x3a\x7f\x1b\xb5\xfd\x43\x89\xda\x06\x2d\x91\xd9\xd2\x5d\x84\x43\x03\xcd\xee\x4f\x77\x68\x2a\x76\x23\xbc\xe2\xba\x7b\x32\x9a\xe6\xdb\x12\xcb\xe9\x62\x96\x36\x0c\x54\xb6\x6e\xed\x6c\xfb\x3d\x24\xf2\x9b\x71\x51\xd2\x90\x43\x03\x71\xc8\x0e\x4d\x28\x2c\x37\x69\xab\x90\x51\xb4\x7c\x33\x18\x8d\xba\xf8\x35\x45\x97\xc3\xf3\x4b\x01\x47\xe9\xf2\x86\x28\x03\x31\x7e\xf8\x4c\x50\x69\x59\x10\x87\xec\xd0\xd6\x9d\x6e\xbe\xd0\xfc\xb2\x3b\xe3\xbf\x8d\xff\x46\xf8\xf5\xc7\x9e\x73\xb4\x9f\xbb\x2f\x09\x47\x14\x9f\xbb\x73\xf1\xfd\x85\x1f\x07\xd0\x95\xa0\x20\xce\x4b\xd8\x1d\xf6\x34\xfe\x75\x01\xd8\x69\x77\xa1\x64\x4b\xf7\x9d\xf7\x8e\x15\xc7\xbc\x8f\x9e\xfb\xe1\x5b\x62\x06\xd8\x70\xb1\x70\x94\xcb\x15\xff\x1a\x89\xde\xe9\xfa\xfe\xb7\x43\xfb\x6e\x39\xd9\x13\xcb\xbf\x1f\xe3\x39\x1b\x4a\xf6\xec\x73\xb5\x82\xc3\xfc\xa1\xef\x2d\xbc\x15\x97\x93\xc9\x4a\xf6\x78\x5c\xac\x0f\x7f\xa1\x85\xa3\x21\x1b\x17\x7e\xb3\x24\x19\x35\x1a\xa5\xdf\x50\x17\xf1\xed\x1a\x36\xc8\xa2\x23\x51\x28\xef\x3d\xac\xab\xa9\x8f\xe0\x15\xfa\xaf\x39\x34\x50\xd3\xfe\x3e\xee\x27\x01\x9f\xc5\xeb\xd5\x7e\xf3\x9d\xde\x34\x55\xe8\x2e\x9b\x25\xf4\x7f\x4d\xe3\xfb\xad\x93\x10\x9f\xd7\xc1\x31\x78\x1d\xc3\xc5\xca\xfe\x07\xe9\x8f\x33\x59\xde\x41\x76\x68\x73\x1e\xa4\x37\x5e\x2c\x55\xaa\x7e\xca\x62\x24\x48\x65\x7e\xdc\x6c\x7e\x69\xa9\x3e\xbc\xdd\xec\xd6\x7c\xe6\xee\xe8\x6c\xac\xdb\xb5\x33\x59\xcc\x92\x43\xfa\xd9\xa6\x3a\x65\x8f\x76\xae\xa5\xf7\x23\x29\x5f\x56\x72\x32\x77\x44\xf0\x0e\xe7\x15\xbd\xd7\xb8\xc5\xab\xe4\xec\xc3\x5d\x53\x85\x51\xcf\xa4\xb5\xc8\x0e\x8d\x80\x5d\x9f\x2c\x76\xc4\x1e\x67\xeb\xea\xf4\xee\xdc\x2a\x4e\xdf\x4a\xc8\x85\x95\x44\xc1\xca\xf4\x12\xf6\x57\x4b\xb2\x3b\xf7\x15\xce\xa4\xb5\x0e\x48\x3f\x5b\xac\x60\x79\x6b\x30\x44\xbb\xc6\xb4\x65\x6a\xce\xc9\xd8\x42\xf6\x61\xe0\x2e\x33\x1d\x7f\x8e\xd0\x54\xc5\xac\xe0\x08\xe3\xf3\xa3\x33\x73\x68\xa0\x24\x3a\x6d\xc4\xaa\xc7\xa6\xe3\x99\x6b\x54\xac\xac\x5c\xbb\xe5\xbb\xb2\x36\x1f\x6c\x74\xdb\x81\xdf\x2a\x97\xee\x78\xe7\xd7\xfb\x92\x91\x4c\x6e\xc8\x99\x80\x38\xf8\x88\x95\x74\xd1\x6b\x06\xef\xce\xcb\x57\xe4\xbe\x32\xce\xbf\xed\xa9\xba\x7f\xee\x56\x6a\x89\x1b\xfe\x60\xee\x3c\x76\x7f\x36\xd2\xbf\x75\x01\x11\x17\xc4\xc1\x47\xac\xbc\xfc\x19\x2d\xaa\xf4\xa2\x18\xc6\x4b\x6b\xcf\xdf\xa3\x09\x4d\x1b\xba\x7d\xc3\xb7\xdd\x27\x59\xb7\x68\x9f\x4e\x96\xfc\x7c\x08\x5d\x57\x01\xe2\xe0\xcf\x21\x37\xe6\x88\x70\x57\x1e\x6d\x6a\x8b\xd6\x81\x9f\x91\x6d\xf8\xce\xcf\x25\xc7\xe5\x43\xed\xc1\xfe\x3d\xfe\x6f\x6f\x3e\xbf\xc6\x81\x2e\xef\x06\x71\x5e\x82\xe8\xff\x5c\xd3\xa0\x0c\xfb\xbe\xae\xd6\xf5\x85\x6d\x7e\x6d\x3c\x89\x28\xfe\xfa\x03\xaa\x4a\xba\x06\xc5\xed\x88\x9a\xf6\xb4\x82\xc3\x21\x8d\x20\xc4\x6c\x03\xf4\x26\x9e\xa6\x9d\x66\x97\x6a\x39\xa6\xfa\xd1\x1b\x2b\x0e\xab\x1f\x81\xcf\x93\x85\x9c\x18\xba\x70\xcc\x7f\xd1\xf5\x3a\x25\x2d\x6e\xdf\x97\xfe\x05\x7d\x73\x07\x71\x70\xed\x4e\xba\x69\x67\xb0\x18\xdb\x6a\xed\x46\xd9\x36\x32\x38\x5d\x9d\x85\xd7\xf0\x2c\x39\x64\xb3\x5f\x30\x88\xff\xea\x89\xb1\xa0\x80\xe2\x82\x38\xb8\x76\xec\x2f\x93\xce\x5d\x94\xb3\x5e\x32\xbc\xd2\xd8\x58\xe0\xa1\xdb\xde\x41\x68\x23\x14\xeb\x7d\xb0\x38\x43\x76\xc2\x8b\x13\x6d\xa9\x89\x88\x0b\xe2\xe0\xcf\x01\xf7\x23\x86\xef\xbe\x87\xc5\x81\x66\xe7\xf1\x20\x29\xa7\x39\x17\xfb\x2d\x14\x74\xd4\xfb\xfa\x9c\x04\xc6\xbe\x11\x6f\x0e\xbe\x4c\x43\x15\x1b\x01\x1c\x5c\xbb\xe4\xdc\x42\xd4\x02\x9d\xa5\xc2\x4b\xcd\x5b\x9e\x45\x4c\xc9\xb1\x25\x13\xd7\xa5\x4c\x2e\xe7\x26\x77\xd7\xce\xd9\xa1\x14\x5b\x65\x22\xb4\x03\x75\x67\xa7\x9e\xad\x3a\x77\x1f\x8d\xaf\x90\xcc\x2a\x86\xea\x50\xf5\x3b\x3f\x5b\x09\x3b\x65\x66\x66\x50\xc5\xa6\x66\x50\x9c\xe4\x8d\x75\xae\x6b\xd0\x79\x12\x10\x07\xd7\xee\xf9\xe7\x30\xa9\x7b\x0e\xe3\x14\xd6\x72\x7c\x64\xbe\x1b\x18\x05\x4f\x8a\x5c\xc5\xaf\x11\x60\x7c\x70\xe1\xa4\x98\xfe\xa0\xfe\xc8\x0b\x3a\xbe\x0b\xe0\xe0\xda\x89\x2f\x47\x3d\xf3\xa6\x2c\x41\x47\x23\xfc\xb8\xdd\xa4\x9e\xed\x9e\x2d\xd2\xdb\x4e\x31\xf0\xf1\xfb\x82\xfe\x6e\xbe\x24\x61\x49\x07\x22\x2e\x88\x83\x3f\x87\xdb\x24\x0d\x4e\x61\x9c\x02\x76\xf7\xab\x2f\xfe\x79\xbf\x7e\x75\xa7\x51\x55\xe4\x52\xb4\xa3\x8f\x07\x33\x13\xf7\x15\x96\xc9\x3c\xa8\xee\x16\x88\x83\x6b\x67\x2e\x5c\xa8\x77\x17\xeb\x45\xd2\x92\x77\xa8\x5a\xbd\xdc\x17\xd6\x3d\x61\x61\x69\xce\x1b\xcf\x74\x88\xbc\x37\xd2\xae\x3f\x7e\x23\x8d\xd0\x0e\x34\x26\x9c\xaa\x9d\x6b\xd7\xc8\xf0\xc4\xf2\xe0\x64\x6c\x97\x54\xe6\x4c\x1a\x7b\xc5\xc0\xa3\xbd\x28\xad\xce\xb7\x57\xfc\x71\xac\xad\x28\x31\xdf\x42\xda\x01\x38\xb8\x76\xa5\x35\x46\x84\xab\xaf\x65\xb1\x9b\xa9\x6c\x52\x3e\xd3\xbf\xf0\x9f\x79\xc5\x26\xaf\x94\x44\x1d\xb4\xa6\xa5\x33\xba\x48\x7b\xb5\x01\x11\x17\xc4\xc1\xb5\xc3\x56\x58\xe4\x89\x36\x5f\x08\x93\xcb\x8b\x9a\x64\xa3\xd5\x24\x70\xbd\x39\x92\x3a\x48\x15\xe9\x5e\x71\xcb\xfd\xdd\x02\xa1\x2a\xa4\x1d\x88\x83\x3f\x07\xbb\xc6\x23\xfc\x3f\x01\xdb\x14\x7d\x6f\x84\x77\x2e\x8b\xc4\x76\x33\xe6\xee\x63\x08\xe6\x6b\xc9\x7c\xc2\x1d\xd7\x27\x49\xc5\xcd\x43\xc4\x05\x71\x70\xed\x2e\x4d\xae\xf9\x65\x2c\x7e\xab\xc0\x8b\xef\x7e\x5c\x2d\x17\x65\x42\x4d\x4e\xe2\x2c\x4d\x57\xb0\xda\x62\x29\xc9\xc0\xdd\xc3\xb7\x8f\xd0\x0e\x34\xb0\x9e\xa6\x5d\xfa\xbe\xcd\x90\xb6\xc0\xaf\x42\xcf\xc3\x56\xc3\x1d\x6e\x86\xf4\x0e\xfc\x0f\x64\xe7\x69\xdf\xbd\xb5\xbd\x7a\x63\x4b\xb5\x30\x1e\xaa\x18\x0a\xe2\xe0\xda\xf1\xee\xcf\xfd\xe9\x0a\xab\x32\x67\x61\xf8\x68\x64\x26\x25\x91\xc4\x86\xdb\x64\x1a\x7e\x6c\xe3\x56\x8d\x13\xa1\x7d\x2d\x8c\x2c\x11\x11\x17\xc4\xc1\xb5\xab\xe4\x12\x2b\x5b\x74\x45\x93\x96\xa0\xe6\x7c\x64\x9e\xf4\x65\x46\x98\xc4\xba\xec\xbd\xfc\xd0\x76\x96\x89\xb3\xae\x40\x63\x3f\x74\xb6\x19\xc4\xc1\x9f\x43\xab\xee\x25\x93\xf5\x40\x61\xad\x17\xea\xb1\xf9\x4e\x92\xd7\xa9\xdb\xc8\x7e\x84\xf6\x14\x29\x4f\x45\x11\xfb\x9a\x8d\xdc\x49\x51\x42\xc4\x05\x71\x70\xed\x0e\x95\x83\x2f\x4b\x65\x4a\x5e\x33\x2c\x4b\xce\x1b\x10\x3d\x8e\x39\x89\xf4\x3d\x6f\x48\xd2\x60\xe9\xe0\x9c\x65\x75\x98\xbd\xef\x8b\x70\x68\xa0\xd9\xfd\xe9\x0e\x2d\x54\xb3\xea\x99\x60\xb8\x69\xef\xdb\x16\x65\x12\x87\x8d\x43\x6a\x59\x3a\x33\xb6\x03\xfe\xb2\xc9\x50\x8d\x4b\x8a\x46\xa5\xea\xa6\x08\xb7\x03\xe2\x90\x1d\x5a\xfb\x66\xb0\x58\xc2\xe5\xcd\x3c\xb2\xa4\xc5\x23\x5c\x8e\xdc\x79\xba\xaa\x56\x71\xc2\xb8\xc5\x5b\xac\xbd\x25\xd1\x79\xea\x37\xa9\x11\x91\x41\x1c\xb2\x43\xa3\x1b\xfa\x41\x5f\xe5\x18\x2d\xe3\x7b\x6b\xf9\x97\x41\xbc\x4b\x7f\x2e\xdb\xa2\xca\xf4\x80\xe0\xfe\xd8\x3d\xd6\x1e\x47\x25\x25\x68\x97\x23\x88\xf3\x12\x46\x41\xfb\x67\xe4\x7f\x5d\x99\x54\xf1\x4a\x8d\x48\x07\x91\xd1\xea\x97\x2b\x41\x76\x27\x1e\x76\x0d\x64\x91\x7d\xec\x1a\x0f\xdf\xd1\xda\x75\xba\x7b\xc7\xda\xfa\x56\xff\xed\xd0\xea\xad\xd2\x12\x44\xb2\xe6\xb2\x79\xc9\xd1\x1e\x24\x5c\xfe\x14\x3a\xec\xbf\xd4\x7c\xfd\xb2\x82\xc5\xe5\xc3\xeb\xa1\xde\x09\xba\xe4\x7f\xa1\xe7\x3f\x2b\x14\xb2\x0c\xcf\x1a\x5c\xf0\x66\xee\xf6\x6a\x21\xca\x75\x65\x37\xe5\x31\x10\xf2\xbc\x12\x70\xa7\x93\xff\xf7\x9b\x93\xfb\xff\x35\x87\x06\x6a\xda\xdf\xe7\xd0\x90\x1c\x5a\x42\xc2\xc8\x2f\x63\xf2\x2d\xb5\x38\xcf\x0f\xe6\xf2\x34\xd5\x9a\x99\xb7\xba\x5e\x2b\x3f\xa2\xbf\x54\x22\x8d\x55\x63\x14\xa3\x7e\x36\xe7\xd0\x90\x1d\xda\xb0\x81\xb2\x8e\xd9\xaa\x65\xf2\x15\x77\x0c\xef\xde\xab\xa3\x0d\x77\x50\xf5\x65\x6d\xea\x58\x85\xd4\xab\x2c\xac\x12\x03\xb1\xce\xe4\xd2\x0a\x7e\x64\x87\x16\x61\xf8\x78\x50\xc3\x83\x5f\x2e\x48\x2a\xd0\xdb\x9f\xec\xfd\x87\x39\x3b\xa5\xcb\x38\x73\x57\x3c\x47\x6b\xeb\x1f\x7c\xba\xb9\xa6\x7d\x26\xad\x45\x76\x68\xd5\x43\x7e\x4c\x3a\x5b\x98\x2b\xd8\x8f\xf9\xb1\x49\x27\xdf\x65\x09\x77\xfc\xf9\xfe\x51\xd8\x63\xca\xfd\x0b\xab\x5a\x6a\xa0\xda\x95\x33\x69\x2d\xb2\x43\x7b\x40\x7f\x3d\xa9\xbb\xb6\xbc\xb4\x64\x5e\x94\x26\xd7\xe9\x7b\x0b\x66\xc7\x7a\x4f\x15\xb6\xc5\x12\xb6\xe1\x67\xc3\x43\xd7\xc9\x33\x38\xfe\xa6\xfe\xef\x92\xe8\xb4\x11\xeb\x38\xe7\x50\xd2\x63\x2b\xe5\x88\x8b\x97\x6e\xc3\x6e\xea\x63\xa9\xd3\x8c\x87\x5c\xef\x87\x73\x41\xdc\xbc\xfc\x13\x32\xcb\x58\x43\x88\x9e\x1a\xc4\xc1\x47\xac\x47\xed\x6e\xf2\x41\xec\x87\x79\x97\xc4\xb3\x7b\x69\xbf\xbb\xb6\xbd\x71\x31\x92\xf5\x2c\xb0\xb9\x10\xd5\xcb\x4c\x7e\xbb\x3d\x72\x01\xaa\x78\x0a\xe0\xe0\x23\xd6\xfd\xf0\xb4\xaa\x22\xb2\xf9\x2e\xf4\xda\x0f\x0f\x87\xab\x07\x5d\xaf\x3d\x0d\xd1\x96\xa3\x75\x0d\x7f\xb8\xb2\x57\x20\x43\xdb\xc0\x06\x9d\xbd\x02\x70\xf0\xe7\xe0\x3e\xb4\x65\x19\xd5\x33\x21\xad\xcf\xda\xa5\xe0\x74\x39\xcc\x8b\xc4\x4f\x9e\x89\x3b\xda\x6c\x40\x00\xd5\x26\xec\xd7\x6f\x17\x69\x44\x5c\x10\xe7\x25\xf8\xcf\x1b\x7f\x51\x66\xbd\xa8\x92\x71\x9a\x33\xf0\xf7\x29\xa7\xf0\x43\x17\xa8\x0f\xad\x3c\x7e\x4e\xdd\x91\xa3\xb6\x68\x2a\x2d\x39\xe7\xac\x05\x7d\xcb\x07\xbd\x89\xa7\x69\xd7\xe2\xd1\xad\xf1\xae\x98\x51\x8b\xe4\x3c\xc9\xd6\x83\x82\xac\x66\x4c\x91\x70\xa1\x11\xa3\x1a\x42\xac\x2a\x15\x49\x0c\x62\x2f\xa8\x7c\x1a\x88\x43\xd2\xee\x22\xbd\x85\xc1\x2f\xb6\x6f\x1e\x17\x03\x23\xcb\x48\x7e\xce\x7a\xb1\xed\xe3\x05\x84\xbf\x33\xd6\x0b\xb8\x4a\x63\x60\x60\x0b\xed\x50\x05\x71\x70\xed\xe6\x66\x39\x64\x85\x6d\x4b\x87\xb0\x36\x8e\xe6\xf3\x03\x7a\x2c\x5d\x89\xf7\xc3\xbf\x88\x7b\x19\x7d\x2f\x41\x31\x3a\xa1\x75\xf8\xbf\xb2\x77\x00\x0e\x49\xbb\xd8\x9f\x91\x8c\x57\x35\x4d\xd2\xf0\xdd\xc8\x0e\x9c\xf1\x6a\x6e\xcd\xe3\x13\x64\x51\xc9\xda\x19\x0f\xbd\x1c\x0f\x3c\xee\x80\xea\xbf\x83\x38\xb8\x76\x19\xb9\x6f\x9d\x06\x0c\x47\x7b\x5e\xff\x51\x19\x93\xa7\x55\xe2\xca\xdf\xf0\xf2\xa6\xcd\x14\x94\xe2\x73\xe1\x2e\x6b\x8b\x1c\x8e\x45\x68\x07\xea\xce\x4e\xd3\x6e\x4a\xd6\xaa\x85\xfe\x8e\x63\xf5\xc9\xf2\xbd\x93\x14\x0b\xfb\x07\xe1\x59\xb7\x94\x53\x13\x30\xda\xe2\xab\xb2\x7f\xd4\x8b\xb2\x41\x6b\xcc\x20\x0e\xae\x5d\xda\xd8\x03\xa5\xdf\x16\xda\xe9\x9d\x29\x61\xbc\xdf\x22\x88\x25\x84\x9f\x14\xab\x14\x49\x7c\x6c\x1e\xf8\x43\x34\xbd\xe1\xbf\x2d\x86\x88\x0b\xe2\xe0\xda\xf1\x0d\x2e\xb0\x7d\x2d\xe2\xaa\xeb\x58\xfb\x51\xa8\xe1\xdf\xf4\x29\x77\x3e\x1b\x9d\x99\x24\xeb\x42\x56\x53\xd1\xc6\xba\xfb\xff\x5d\x64\x08\xe2\xe0\xcf\x61\x68\xf2\xd2\x86\xb1\x09\xda\x4a\xe7\xb6\xe5\x0f\xf5\x5c\x45\xeb\x56\xfc\x59\x8e\xaf\x36\x5c\xcf\x83\x7e\xe2\x8e\x63\xf0\xcb\x40\x5f\x5c\x40\x1c\x5c\xbb\x4a\xcb\x5c\xee\x8d\x4d\x52\x3a\xaa\x7c\x55\xed\x35\xe2\x17\xf1\xb7\xf8\x03\x7c\xdd\x59\x66\xbe\xfa\x1f\x52\x11\xed\x67\xd3\x7b\x23\xb4\x03\x8d\x09\xa7\xee\x3b\xe0\xb1\xc7\x53\x73\x72\xb0\x13\xd7\xa4\x24\xa6\x53\xfd\x41\xb9\x95\xfb\x85\xb1\x93\xae\x45\x13\x73\x6c\xb6\x5f\x9e\xb2\x44\x0e\xda\x77\x00\xe0\xe0\xda\xa9\x3f\x4b\xf0\xac\xcb\xde\x71\x21\xac\x17\x16\x7d\x4e\x6e\x51\xb0\x21\x1b\xcb\xf1\xb5\x7f\xfd\xeb\x97\xd4\x81\x0d\x05\x95\x9f\x54\x88\xb8\x20\x0e\xae\x1d\x9b\x21\xf6\x55\x71\x56\xf4\x47\x75\xeb\x2b\x01\xec\x21\x1f\xe9\xb5\x45\x6f\x93\xb7\x72\x6f\x7c\xfe\x63\x7c\x6b\x02\xef\x6d\x2d\x74\x6f\x30\x88\x83\x3f\x87\x36\x23\x6f\xdf\xf6\xd4\x45\x97\x40\xf6\x61\x14\x09\xd6\xce\xae\x23\x4c\x4e\x0c\xa9\xd7\xf7\x9f\xdc\x2b\x8c\x42\xd5\x29\x09\x84\xae\x4b\x02\x71\x70\xed\x6c\x4d\xee\xa9\xdb\xd7\xcc\x7b\xa2\x96\x64\x7c\x48\xdc\xb3\x8a\x4c\x29\x0d\x4c\xba\xf5\x34\xaf\x08\x4f\xf3\x2e\x1a\xce\xc5\x7b\xbb\x08\xed\x40\x03\xeb\x69\xda\x3d\x79\xee\xce\xad\xa2\x35\xdf\x9f\xcd\x55\xa1\x3b\xb7\xbd\xfe\x52\x36\x3f\x6f\x60\x1f\xd5\x6a\x64\x00\x8d\xfd\xd9\x2e\x8e\x4c\x13\xb4\x4e\x09\xe0\xe0\xda\xb9\x32\xdc\x88\xaa\xb1\xc2\x99\x4a\x4d\x33\x79\x5d\xf2\x30\xa3\x79\xe6\xfd\xcd\x57\x45\x0d\x72\x8e\xbd\x72\x17\x69\xd4\x13\xbd\xa1\xdd\xba\x20\x0e\xae\x5d\xed\x75\x5c\xc9\x54\xf7\xdb\x35\x8f\x8f\xfa\x69\x3f\xca\xbb\x6a\x69\x25\xc9\x0a\x9d\x2f\x7d\x2e\x3a\xf7\x96\xf4\x80\x0f\xe5\xd1\x7b\x44\x5c\x10\x87\xd4\xff\xf0\xbc\x9d\x75\xf1\x45\x63\xd6\xf4\x10\x7e\x82\xd5\x57\x83\xf1\x99\xcd\x61\x7c\x25\x6d\x89\xbb\x8c\xfb\xe2\xd3\x14\x06\x29\x61\xa8\xff\x01\x70\x70\xed\x74\xcb\xcf\x1b\xd1\x1d\x67\xbf\x8b\x25\x60\xea\x6a\x1e\x19\xe5\xc1\x8f\xf8\xc4\x1d\x69\x83\x8f\xfe\x8d\x30\xcc\x9f\x7c\xa3\xad\x17\xe1\xd0\x40\xb3\xfb\xd3\x1d\x5a\x79\x0b\x73\xa9\xd7\xb5\xd1\xde\x1b\x3a\xd3\x3c\x6a\x22\x0d\x09\x51\xba\x5f\x85\x2c\xf9\x2e\xf3\x5f\x4e\xd7\x0d\x15\xbd\xb4\x04\xad\xa1\x81\x38\x64\x87\xa6\x1f\x95\x90\x1f\x62\xc4\x7b\x9e\xe9\x5b\xd9\xee\xfe\x6d\x99\xa7\x1b\xef\xe6\xcb\x63\xca\x08\xac\xfb\xb1\x1f\xd5\x3b\xe3\x0c\xf0\x23\x22\x83\x38\x64\x87\x46\x90\x8b\x7e\x47\x2d\x6d\xce\x81\xc1\xb1\xc5\xb2\xe6\xf2\x8f\x27\x05\x4d\x7c\xa4\x9e\xbd\xe3\x72\xfb\x63\xf1\x7f\x26\xb7\x2b\x7c\x11\x91\x41\x1c\x72\x0d\x92\x7f\x5d\x32\x93\x35\x8f\xe7\xe3\x6c\xbc\xdd\x98\xfb\xca\x2f\xa9\x98\xeb\x4d\xb5\xbe\x1f\x73\xd4\xbb\x3e\x2e\x96\x59\x4a\x31\x6d\x93\xbd\xc6\xd5\xfc\xdb\xa1\xad\xe0\x12\xed\xcf\x1e\x8d\x47\xba\x8e\xcd\x69\x24\xbc\x11\xed\x65\x36\x2e\x5a\x95\x47\x21\xa5\x63\x37\x30\xae\x51\xb4\xde\xac\xfb\x0b\xf5\xaf\x97\x4a\x32\xa6\xbc\xff\xd0\x2e\xcc\x9e\xd4\xdf\x52\xf6\xb8\xde\x82\x1f\x3d\x00\xb7\x54\x2d\xaa\x02\x5d\xf7\x1a\xc3\x17\xae\xff\x9a\x43\x03\x35\xed\xef\x73\x68\x48\x0e\xed\xed\xd8\xfd\xdf\xc3\x98\x13\x92\x71\x5c\x14\x7d\xdc\x03\x7b\xef\xe2\xd7\x8e\x3e\x4b\xd9\x6a\x35\x7e\x54\xba\xf3\xc8\x1b\xf3\x38\xf0\x4c\x96\x77\x1e\x21\x99\x87\xaf\xe5\x72\x14\x94\xaa\x2a\xa6\x52\x33\x56\xd9\x9c\x01\xde\x8e\x6a\x7b\x32\x4b\xce\x0d\xd4\xc6\x8b\x81\xec\x9e\x95\x21\x57\xf4\xcf\x64\x31\x0b\xd9\xa1\x0d\xb7\x26\x35\x67\x24\x55\x79\x6c\x8c\xe0\x1a\xd0\xea\x2d\x9c\xbb\x85\x2f\x94\x6c\x25\xd2\x61\x1c\xbd\xee\xf1\xc0\x91\xed\xd6\xd0\x99\xb4\x56\x13\xe9\x67\xd5\x44\xdc\x3a\x58\xe3\x83\x64\xba\x1a\x98\xef\xf1\x2e\x06\x6c\x3f\x5f\x69\xa3\x6b\x1e\x8e\x57\xf1\x29\x31\x15\x41\x0f\x36\x3d\x83\xda\x95\x41\xc2\xee\xc8\x0e\x4d\x3e\x14\x95\x4e\x55\x47\x2f\x2f\x46\x9c\xa3\x5a\xf6\x4b\xcc\x0c\x2a\xb3\xe3\x49\x6e\x4f\x28\x1a\xa5\xe9\xcd\x95\xfc\xcd\x48\x87\x33\x73\x68\xa0\x24\x3a\x6d\xc4\xd2\xbb\x72\x5b\x8b\x69\xd3\xd9\xc6\x2f\xa2\xe3\xc8\x9c\x7c\x9a\xa6\x30\xcb\x84\x84\xaf\xcf\xc2\x81\xf5\x7c\x08\x59\xe3\x9e\xd2\x2e\xa2\xa7\x06\x71\xf0\x11\xcb\x9b\xe8\x65\xf4\xd1\xda\xba\x12\xed\xe3\xcb\x6d\x89\x1e\x52\x41\x72\xb5\x72\xfd\x84\xbf\x85\x53\x7e\xf4\xc4\xfe\xa9\xb8\x58\x07\xcd\x36\x40\x1c\x52\x09\xca\x25\xce\xbc\xb6\x43\x9e\xe3\x73\x58\x9e\xae\x8b\xc4\xdf\x4a\x56\x74\xdb\xa4\xc6\xa6\xf6\x2a\xce\x73\x59\x51\xdb\x5c\x72\x86\x4e\xe9\x83\x38\xa4\x13\xe4\xe7\xeb\xe4\xce\x97\xce\x17\x8d\xa1\xe5\x57\x5a\xa9\x60\xef\xd9\xed\x7b\x38\x1b\x9b\xb8\x47\xad\x1b\x95\xb4\x35\x34\x16\x40\x15\x48\x40\x9c\x97\x20\x0a\xda\xdf\x71\x55\x7b\x62\xce\x8d\xd4\x64\x4d\x7a\x11\xb5\x2c\xf9\xe1\x7e\x9a\x8f\xc3\x74\x99\xdc\x55\xfb\xa4\xfd\x85\xfa\x17\xfd\x55\x36\x27\x11\xc4\x6c\x03\xf4\x26\x9e\xa6\x9d\xca\xc7\x1f\xfd\x55\x2b\xfc\x53\x11\xbe\x63\x45\x9f\xb2\x31\xd1\xbd\x2e\x7c\x0b\xb9\x95\x75\x23\xe3\xcf\xd4\x27\xe9\xeb\x98\x33\x50\x95\x17\x10\x07\xd7\xce\xf0\x0e\xf5\x8d\x73\x68\xb1\x72\x02\x98\xbe\x3f\x7f\xb3\xe6\xb4\x76\x05\x05\x35\xf1\x98\x3f\xd6\xe1\x22\x9f\xf9\x28\x9f\x88\x0d\xed\x72\x04\x71\x70\xed\x3e\x2e\x94\xb5\x52\x6d\x7d\x49\x91\x5d\xb2\x4b\xd2\xbd\x70\xe9\xc7\xfb\x4c\x9b\x13\x4a\x46\x95\xb8\x22\xab\xa0\xb1\x2a\x2d\x05\xa8\x36\x27\x88\x83\x3f\x87\x9b\x38\x12\xa2\x02\xc7\x97\xa7\x47\x88\x4c\xfc\x46\x9a\xbc\xf3\x9b\xc2\x33\x25\xfa\x93\xb5\xc8\x3f\xac\xe6\x60\x6b\x78\x51\x50\x40\xe7\x77\x00\x1c\x5c\x3b\x22\xf1\x9a\x98\x9a\xc3\x14\x53\x49\xf1\xed\x49\x33\xfe\xfd\xfa\xae\x4f\xbc\x58\x21\xef\x95\x78\x19\xaa\xd8\x4e\x9e\x26\x74\xd3\x40\xee\x1a\xd0\x9d\x9d\xa6\xdd\x09\xfe\x27\x7b\xd5\x5d\xfc\x1d\x2d\x8a\x5d\xf2\xf5\x23\x96\x31\x9d\x35\x2a\xe7\xd0\xa0\xcd\x7a\x33\x94\xde\x25\x95\xc7\xc1\x0c\xd0\x3a\x25\x80\x83\x6b\x27\x72\xaf\xc4\xc8\x87\xe0\x62\xe9\x08\x87\xd5\xd5\x11\xa9\xe3\xdd\x06\x69\x8c\x94\x4d\xa3\x30\xbd\x24\xd1\x8b\x8b\x7e\x77\xbf\x5a\x23\xe2\x82\x38\xb8\x76\x02\x7e\xb1\x55\x9c\x86\x5a\x75\x7e\x07\x8b\xf7\x52\x32\x73\x4a\x06\x4c\x78\x1c\x9f\x34\xb4\x89\x64\xbe\xe9\x9b\x98\x4f\x08\x83\x72\x02\xc4\xc1\x9f\xc3\x68\x9b\x94\x1e\xd6\x41\x2a\x97\xdb\x2b\x7d\xb6\x2e\x85\x3f\x25\x2f\x98\x38\x38\x02\x1e\x3c\xce\x94\xfb\xa1\xc6\xe8\x86\x71\x05\xba\x0b\x06\xc4\xc1\xb5\xfb\x75\xaf\xc8\x23\x43\x93\x80\x53\xaf\xc0\x43\xc2\x3b\xec\xed\x70\xd3\x57\xf6\xde\x69\xa7\xf3\xa3\xdc\x06\x84\xe2\x4d\xdd\x5c\xc1\x08\xed\x40\x63\xc2\x69\xda\x19\x4a\xcf\xe9\x0b\xf9\xe5\xc4\x3e\xe7\x78\xcc\x46\xc6\x1c\xbd\xf1\x96\xb2\x33\x61\x34\xb0\x1a\x15\x5d\x88\xe6\x83\xf5\xb3\x6c\xc8\x5d\x83\x38\xb8\x76\x9a\x27\x57\x35\x24\x93\x84\x2a\x92\x3b\xca\x7f\x28\x6f\x89\x95\x8a\x57\xe2\xd8\xb6\xbb\x9a\x99\x94\x7e\xb7\xf0\xae\x13\x56\x84\xca\x01\x83\x38\xb8\x76\xfc\x9b\x8b\x95\x76\x69\x76\x0f\x26\x45\x9a\xba\x2f\x58\x39\xbc\x0f\x9d\x93\x75\xfa\xa2\xbf\xe3\xcc\xec\xd6\xde\x96\x2f\xf5\xc2\x1f\x11\x17\xc4\xc1\x9f\x03\xf9\x6a\x01\x06\x81\xde\xc7\xad\x0f\x41\x2d\xf2\x57\xc5\x16\x0c\x2b\xfa\x6c\xda\xea\x39\xae\xa6\xf1\x24\xc8\x06\x77\x4c\x58\x6a\x23\xe2\x82\x38\xb8\x76\x52\xa6\xe4\xc5\xa8\x52\xfa\x73\x13\x95\xec\xad\x56\x7c\x33\x14\xda\x06\xd4\xfc\xfb\xe7\x25\xf1\xf7\xcd\x6f\x84\xfb\x45\x66\xdb\x23\xb4\x03\x0d\xac\xa7\x69\x87\x16\xf8\xcd\x74\x45\xc7\x37\x34\x52\x68\x32\x77\x3a\x2b\x63\xee\x6b\x7c\xd7\xbb\xba\xaf\x69\x76\x3d\x65\x9c\x7c\x69\xce\x78\xfc\x88\xff\x0c\xe2\xe0\xda\xd1\x2f\xd1\xb4\xcc\x1e\xcb\xc4\xeb\x32\xb4\xba\xb4\x5b\xb0\xbd\xe2\x3b\xd2\x9c\x6e\xfe\x4e\xbd\xfd\x7a\x5e\xe6\xfe\x3c\xc7\x34\x74\x91\x05\x88\x83\x6b\xe7\xe4\x15\xd7\xaa\xd3\x99\xcb\xda\x70\x5d\x66\xcf\xac\x9e\xee\x1c\x1f\x05\x8e\xae\x64\x35\x7a\x76\x8e\x24\xc5\xc1\xd8\x66\x24\x3a\x22\x2e\x88\x43\x1a\xf7\x65\x4b\xb1\xd1\x1e\xab\x46\x7c\x2c\xff\xc5\xa3\x47\xaa\xe3\xd1\xef\x17\x9b\x31\xfe\xc3\x2f\xad\x19\x3b\xc2\xf2\xf5\xe0\x38\xb4\x9f\x01\xc4\xc1\xb5\x33\x55\xe6\xcb\xe3\xf5\x70\x65\x08\x65\x0e\x34\xb9\x2e\x7a\xac\xd0\x7d\xd5\x49\x47\xa6\xcc\x86\x9c\x5c\x64\x36\x87\x98\x37\x82\x08\xe1\xd0\x40\xb3\xfb\xd3\x1d\xda\xb5\x4b\x8c\x74\x62\x0f\xf9\xa5\x05\x9a\x57\xa4\x89\xb8\x8c\x2e\x69\x79\x2c\x46\xd6\x24\x8a\x8d\xeb\x62\x16\xd6\xb4\xa7\xe5\xb1\x23\xdc\x0e\x88\x43\x76\x68\x53\x26\xb3\x2c\x27\x97\x50\x7d\xf8\x52\x8f\x84\xba\x3e\x0d\xae\x87\xdd\x65\x52\xf9\x31\x6f\xe9\x82\x19\x4b\xf8\x7a\xd0\xc0\x2e\x09\x11\x19\xc4\x21\x3b\xb4\x9b\x91\xd2\x2f\x7d\x50\xe8\x3e\x63\x9b\xf5\x04\xde\x8a\x11\x4d\x57\xb1\xa6\xc3\xc5\x69\x99\x3f\x7f\xfe\x21\x11\x05\xa7\x50\xa3\x1f\x22\x32\x88\x43\x8e\xfc\xaf\x6b\x39\xbe\xfd\x96\x2b\x1e\x73\x17\xeb\x67\x9f\xc4\x47\xea\x40\xe5\xe3\x18\x7d\xb7\xa5\xd9\xb8\x89\x3c\xa6\xa1\x9a\x1e\x43\x0b\x99\x07\x52\x7f\xdb\x0b\xa5\xdb\xfc\xed\xf5\x19\x4a\xf5\x31\x84\x36\x7e\x16\xbb\x28\x9c\xcf\xce\xad\x9b\xe3\xeb\xa8\x5a\xad\x94\x15\x07\x90\x30\xef\x60\xfd\x85\xe6\x7c\x0f\x76\xac\xe1\x8f\x3b\x69\xbe\x87\xf2\xcc\x3b\x5b\x2c\xf7\x7e\x39\x01\x6a\xcf\x30\x6d\x73\xe7\x0f\x7b\x94\x5f\x3e\x98\xd2\xff\x35\x87\x06\x6a\xda\xdf\xe7\xd0\x90\x1c\x1a\x95\xa4\x63\xcb\x13\x3d\x33\x7c\x9a\x74\x42\x0c\x14\xda\xfc\x95\x3c\x7f\xa7\xfd\x6e\x17\xae\x87\x0b\x9a\x71\x9f\x3b\x8e\xf0\x78\xce\x64\x79\x07\xd9\xa1\xf1\x74\xfe\xf4\xa9\xf0\xdb\xb8\x3b\x6a\xa2\xa4\x1b\xde\xda\x92\x11\xaa\xee\x1b\x4b\xab\xb4\x72\x45\x89\xa4\x89\x96\xab\xff\xf6\x99\x5c\x73\xff\x11\xd9\xa1\x95\xe1\xc5\x57\xd9\x5c\xb4\xad\x9a\xae\x8e\x39\x1f\x4d\x7e\xf2\xc0\x36\xbd\x94\x26\xcb\x83\xd2\x83\xc7\x9a\x48\xef\x2e\x97\xd2\xd6\x99\xb4\x16\xd9\xa1\x95\xea\x3c\xaf\xf7\xb5\xf8\xa8\xd8\xe8\x89\x12\x31\xf5\x35\xa8\xc8\x5f\xf7\xb0\xbc\x7a\xc1\x6f\xfd\x81\xf2\x02\xbe\xa8\xc9\xd5\x80\x33\x69\x2d\xb2\x43\xa3\xb5\x59\xb9\xa7\xf8\x9c\x35\xeb\xfa\xa3\xd7\x87\xc9\xe3\x45\x3e\xbd\x68\xd4\xc9\xb3\xde\x7f\xb4\x30\xfd\x43\xc5\xde\xe0\x0d\x7f\x3b\x33\x87\x06\x4a\xa2\xd3\x46\x2c\x54\x92\x8b\x18\x38\x7d\xd7\x51\x9a\x9f\xb0\x37\xb0\xe5\xd2\x44\x7b\xdd\x48\xd6\x72\xd5\xa5\xee\xca\xbc\x9a\xdc\x30\xd1\x90\x0c\x55\x9e\x07\x71\xf0\x11\x4b\x30\x6a\x51\xff\xf6\x41\xb5\xcf\x8e\xf8\x04\xc9\x96\x85\x45\xad\x97\xc2\x6b\x1f\x23\xfb\x80\x1f\x42\x8d\x82\xd8\xe4\x86\xbd\x50\x25\x04\x10\x07\x1f\xb1\x9e\xdf\x5f\xc6\xca\x26\x4f\x97\xcf\x88\x1b\x76\x34\x5d\x0c\x19\x21\x52\x39\xba\x9b\xf7\xca\x29\x9e\x6a\xf7\x10\x95\x2d\xeb\x11\x54\x6d\x02\xc4\x21\x55\x73\xde\xaf\xaa\xc6\xab\xe2\xf5\x59\x44\x1f\x88\x88\xad\x45\x3f\xb7\x3e\xce\xe7\x43\xb5\x10\xf2\x83\x2a\x96\x6f\xfe\xfb\x51\xf9\x14\x54\xcd\x19\xc0\x79\x09\xfe\xb3\x22\x6e\xd1\xad\xc7\x85\x37\xde\x56\x55\xc6\x8a\xc4\x95\x3d\x0f\xe1\x13\x3c\xd2\x9c\xa5\xfd\x8e\x5b\x4a\x1e\x93\x8a\xfb\xb6\xec\xde\x38\x34\xcb\x07\xbd\x89\xa7\x69\x47\x15\xbd\x5b\x25\xfe\x7b\x6e\x0e\x6d\x64\x9b\x7c\x81\x51\xcc\xd7\xee\x79\x26\x5e\x8f\x80\xc5\x90\x41\x0a\x4e\x5c\x0f\xce\x1f\xe8\x6e\x72\x10\x87\x54\x87\x53\x4e\x26\xa0\x51\x69\xc1\x44\xe2\xd3\xcb\xe9\xb9\x75\xf3\x0d\x93\x8e\x60\x37\x7c\x1b\x63\xad\x64\xab\xe0\x96\x58\x7a\xbd\x7b\x50\x1d\x4e\x00\x07\xd7\xae\x51\xab\x14\x8b\xe5\x8f\xee\x16\x95\x89\x8e\x80\xd1\xdd\x1e\xeb\x6b\x03\x59\xef\xfc\xa3\x5c\xaa\xbf\x97\xcc\xbe\xc3\x09\x8f\xba\x86\x88\x0b\xe2\x90\x76\xea\x0a\xd0\xac\xae\xee\x68\xf6\x51\x47\x8f\x58\x2d\xc5\x86\xff\xd4\x8f\x4f\x26\x08\xec\x50\xc2\xd1\x31\xae\xb8\xd3\x86\xc2\xdb\x06\xed\xd4\x05\x70\x70\xed\xaa\xe7\xf2\x32\x8e\x9a\x3b\x7c\x54\xc6\x09\xad\x7d\x9f\x8c\xd8\xf7\xdc\x4b\xda\xbb\xad\xba\xbc\x27\xd4\x3d\xa9\xe3\xc2\x86\x41\x89\xd0\x0e\xd4\x9d\x9d\x7e\xa5\xa2\xcf\x6d\xe3\xe8\xca\x78\x36\x42\x89\x80\xbd\xbb\x96\xfa\x46\xda\x4f\x87\x96\xd1\x2c\x62\xab\x96\x33\xe7\xf3\xe4\x55\xa1\x2b\x0a\x41\x1c\x5c\x3b\x3d\x6a\xb7\xe7\xcc\xa1\x49\x63\xce\xf4\x1a\x4f\x9e\xd6\x07\x11\xbb\xae\xf6\x76\xe0\x08\x99\x31\xe1\x3c\x29\x9d\x71\xfe\x91\x03\xd5\x24\x05\x71\x70\xed\xce\x7f\xf3\x09\xb7\x8a\xfb\xa9\x48\x49\x76\x45\x9e\x4d\xd1\x6c\xdd\x9a\x65\x7b\xf5\x1c\x1f\x23\x61\xe9\x0f\x01\x63\x6d\xea\x5e\x68\x37\x34\x88\x83\x3f\x87\x8f\xe9\xaa\xce\x1a\xf5\x51\xef\x9d\x70\x3b\xca\x4b\xa3\x24\xc8\x87\x5e\xa6\x0c\xe9\x7e\xb9\xff\x83\x49\x2a\xf2\x19\xf6\x5b\xc1\x3d\xc8\xb5\x03\x38\xb8\x76\x49\xcf\x0c\x4d\xf2\x1a\x3e\x8f\x91\x6e\xcc\x6a\x1f\xa2\x24\x85\x5b\xbd\xb3\x5b\x91\x48\xf9\x30\xa3\x30\xfd\xfa\x36\xcb\x6a\xf7\x07\x84\x76\xa0\x31\xe1\x34\xed\xbc\xc7\x2c\xd1\x07\x75\x6f\x17\xc5\x24\x2e\x67\xe5\xc8\x3f\x1f\x97\x9e\xe5\xb6\x7e\x38\xc2\xbd\xe6\x20\x29\x4b\x5d\xf3\x8a\x0b\xda\x77\x00\xe2\xe0\xda\x95\xf3\x59\x8d\x1e\x14\xbb\x6e\x79\x87\xae\xf7\x3b\x2e\x77\x45\xa4\x86\x3d\x9c\x68\xb1\x5b\xd5\xf8\xa8\xc4\xa4\xd0\xa1\xc7\x17\x89\x88\x0b\xe2\xe0\xda\x6d\xe9\x25\x2c\xb8\x86\x5a\x36\x60\xa4\x16\x2b\x1d\xab\x53\xb6\xf0\xa9\x04\xde\xdb\xd4\x13\x14\x94\xc2\x1a\x7d\xfa\xb3\xc5\x0e\xda\xf9\x0a\xe2\xe0\xcf\x21\xf8\x6b\x16\x61\xb7\xda\xe3\xd4\x0e\xc3\x92\xe2\x19\x23\x9e\x55\xbf\x40\x0f\xf9\xd8\x3b\x74\x5b\x93\x17\xbc\x6e\xe6\x63\xe9\x8f\x20\xe2\x82\x38\xb8\x76\x0e\x12\x77\x37\xec\xde\x4a\xdf\x8c\x55\x16\x7f\x22\x35\x56\xa8\x7e\xd8\x83\x1b\xa1\x8c\x96\x59\xee\xe9\xd5\x9a\x35\xb4\x7a\x28\x83\xd0\x0e\x34\xb0\x9e\xa6\x1d\x03\x7b\xf7\xf8\xb5\xd7\x4a\x6f\x3e\x15\x4b\x87\x14\x71\x5f\xd0\x2d\x6f\x97\xa5\xd7\x6c\x78\x61\x99\x21\x2f\x26\x5e\x30\x51\xc3\x8e\xf8\xcf\x20\x0e\xe9\x8b\xa4\xf0\xa7\x20\x7b\x4c\xd1\x70\x22\x77\xa7\x8d\x24\xd1\x49\x96\x17\x0f\xb9\xb4\x69\x36\x3e\xdb\x05\x85\x89\x61\x06\xb4\xb8\x94\x41\x39\x01\xe0\xe0\xda\xd5\xf0\x37\x64\xa8\x05\x09\x86\x6a\x6f\x5f\x56\xb9\x77\x81\xcc\x4b\x09\xaf\x99\xd1\xa0\x64\x9f\x82\x8b\x28\x43\x90\x98\xf9\x1a\xe4\x82\x41\x1c\xfc\x39\xbc\xa3\x44\x17\x7b\x6d\x9e\xbb\x1a\x10\x57\x17\xbc\x9b\x35\xae\x94\xd9\x7c\x81\x3e\xe1\x49\xa4\xf6\x97\xda\x00\xb3\xc0\x18\x5c\xa8\x96\x23\x88\x83\x6b\x27\x30\xde\x8e\x9a\x61\x4e\x31\x45\x72\xcd\xa5\x77\x64\xb4\x6b\xf5\xf5\x57\x5e\x26\xd2\x36\x9b\x44\x5f\x2b\xdd\x8b\xad\xcc\x8f\xcd\x10\x0e\x0d\x34\xbb\x3f\xdd\xa1\xed\xe5\xcb\x05\x0f\x26\xa6\xdc\x1e\x11\x6a\xb9\x65\x6c\xaa\xbd\xe6\xcc\xd2\xfd\xe8\xc1\xe5\x87\x74\x87\x06\xb5\x19\x53\xb5\x13\x9e\x08\xb7\x03\xe2\x90\x1d\x9a\xca\x95\xd6\x9f\xbe\xb5\x53\xfb\xda\x8c\x4b\xba\x9d\xf8\xc2\xa4\x51\xa5\xc1\x57\x32\x5b\xcd\x1d\x53\xec\xcc\x12\xca\x4e\x84\x3e\x41\x27\xdc\x00\x1c\xb2\x8f\x4a\x76\x76\x10\xf9\xb8\x5b\xce\xb1\x6f\x38\x30\xc1\x3b\x69\x3e\x65\x8e\xfe\xed\x47\x50\x0f\x7e\x1b\x05\x9a\xb2\x20\xb1\xca\x4f\x09\x44\x64\x10\xe7\x25\xfc\xff\xe6\x7e\x7f\x47\x7e\x85\x39\x1c\x18\x3e\xe9\x2f\x44\xb0\x9d\xec\xa9\xa2\x24\x27\x1f\xda\x8c\x6e\x10\x86\xa9\x3a\xd5\x5d\xad\x26\x97\xa1\xa8\x82\x0f\x39\xb4\x61\xd4\xd1\xdf\xd7\x79\xf8\x82\x03\x13\xcb\xc6\x92\x36\xb5\x31\x0a\x37\x5a\x94\xfc\xf2\x77\x5e\x4e\x2d\x70\xd0\x97\xcb\x24\x85\xfc\xed\xd0\x2c\xeb\x1f\xe2\x84\xf7\x52\xc6\x73\xa4\x1a\x4d\x68\xa0\xf3\xe6\x0e\x0f\x92\xd2\x72\x97\x90\xc5\x38\x64\xa9\xd0\x77\x6e\xbe\xa1\xf8\x0b\x95\x10\x16\xd1\x20\x4d\x20\x66\x4b\x9c\x58\xe0\xaa\x67\xd4\xc2\x5c\x90\xb8\xa9\x75\x18\xc2\xca\x58\x8b\xae\x15\xf2\x54\xfb\x72\xed\x7f\xcd\xa1\x81\x9a\xf6\xf7\x39\x34\x49\xf8\x2c\x9e\xd2\x21\x2a\xf3\x28\xca\x26\xbe\xe7\xb7\x18\xaa\x75\x8b\x4c\xfd\x3d\xc3\x28\x4f\xd6\x6d\x19\x03\x89\xd8\x34\xd3\xcb\x39\x73\x25\x67\xb2\xbc\x83\xec\xd0\xa4\x2f\xdc\xaa\xb5\xce\x75\x65\x1d\xcc\x60\x3b\x69\x99\xa0\xa1\x1a\x88\x60\x7a\x42\x1c\x81\x52\x2d\xce\xaa\x6d\xc0\x44\x32\x6c\x70\x26\x8b\x59\xf2\x48\x3f\xab\x6a\x28\x30\xce\xc1\x43\xf4\x55\x8a\x2a\x74\xe1\xc9\xb9\xca\xce\x50\xa5\x74\x7c\xfb\x2e\x41\x27\xe7\xeb\x75\xf7\x63\x1a\x9c\x3e\x9c\x49\x6b\x91\x1d\x9a\xf3\x63\x89\x6e\x7b\xd9\xe3\x3f\x66\x01\x1e\x47\x7d\xa1\x1b\x14\x6c\xcc\x3c\x19\x07\x36\x5a\x6e\x87\x6a\x3e\x31\x89\x93\x87\xfc\x67\xd2\x5a\x47\xe4\x35\x34\x52\x34\x3c\x13\xd4\x83\x54\x92\x0a\x87\x4a\x54\x66\x9f\xa3\x3d\xc5\x47\xd2\xf4\x17\xbc\xee\x7f\x7c\x9f\x7e\xae\x73\x5b\xa3\xf9\xcc\x1c\x1a\x28\x89\x4e\x1b\xb1\x34\x5c\x99\x7c\x8f\xc2\xb8\xaf\x51\xbc\x95\x31\xe7\x88\xbc\x7f\xf0\x56\x78\xad\xfb\x43\xa7\x67\x27\x1e\xbd\x65\x9e\x8a\xd5\x3e\xe4\x4c\x40\x1c\x7c\xc4\xc2\x79\xae\x91\x38\xcc\x76\xf7\x32\x8a\x4b\x0d\xb3\xdd\xa1\xd8\xe2\x1a\xb9\xea\x38\x87\x1d\x7f\xa5\x7b\xe7\xb8\x98\x8b\xf0\x39\xe8\x9b\x22\x88\x83\x8f\x58\x2c\x5a\xe7\xdf\x10\xd9\x7a\x93\x66\xe1\xa0\xeb\x3e\xba\x18\x50\x68\x5e\xa0\xb6\x71\x41\x46\xd1\x6d\xa8\xde\x0c\x4b\xf2\xb9\x34\x54\xdb\x0a\xc4\xc1\xf7\xcf\xdb\x7c\xbe\x7d\x2f\xe8\xa0\xe9\xa0\xfe\x3a\xa1\x02\xff\x1b\xff\xb0\x3a\xb6\xec\xef\x16\x9c\x1e\x0a\x13\x7b\xa6\xe2\x61\x4e\xd5\xaf\x11\x71\x41\x1c\xd2\x37\x5b\xac\xb6\xdb\xfa\xb3\xec\x68\xb3\xa9\x1d\x9b\x9b\x75\x95\x46\x18\xce\xb4\xa3\x92\x3b\x89\x79\x58\x43\x15\xe7\x31\xd7\x48\x6a\x11\xb3\x0d\xd0\x9b\x78\x9a\x76\x64\xdd\xef\x57\xde\x89\x99\x88\x78\xe9\x3d\xf8\x80\x43\x8f\x6b\xeb\xf8\x22\x0c\x85\x58\xe2\x26\xcb\x98\xfc\x4b\xb9\x30\x96\x34\xa8\x96\x23\x88\x83\x6b\xb7\xd8\x22\x2f\x76\x9c\xe1\xa3\x9a\x74\xa4\x64\xcd\x23\xdf\x41\x35\x28\x6b\xde\x88\x4e\xf4\xf3\xb6\x7b\x50\xda\x1f\x6e\xab\x8b\x5b\x88\xb8\x20\x0e\xae\xdd\xce\x61\xc3\xe0\xb7\xe5\x40\x5d\xb3\xc5\x63\x7b\x75\x9d\x7d\xce\xf3\x54\x76\xcb\xf7\xec\x19\x5a\x93\x66\x3f\x75\x71\x3b\x8a\xcf\x20\xe2\x82\x38\xb8\x76\xe3\x45\x55\xca\x7b\x19\x75\xe5\xfa\x9a\x6b\x2d\x71\x68\x8a\x42\x84\x5f\x52\xa7\x1d\x5d\x35\x6b\x9f\x9e\x13\x76\x5e\x75\xc8\x84\xea\x91\x82\x38\xa4\x1d\xc0\xb7\xd3\x38\x1b\x66\x95\x5c\x83\x8e\x39\x75\x07\x23\xae\x53\x29\x73\x63\x9c\x3b\xf8\xd6\x79\xcb\xcd\xc6\xf4\xcd\xf6\x43\xb7\x10\x84\x76\xa0\xee\xec\xd4\xf7\x6e\x9a\xf4\x43\x52\x94\x88\x64\xae\xde\xd5\xf1\x76\x9f\x2e\x8d\x08\xcc\x3b\x25\x12\x05\x4c\x2b\x6c\xb2\xc9\x92\x6e\xb6\xa3\x37\xa1\xf7\x0e\xc0\x21\xb9\xeb\xf5\x8f\x07\xf9\x76\x7c\xa9\xd3\x25\x49\xbf\x83\xd5\x04\x66\x9c\x15\xeb\x86\x22\x7f\xe7\x50\x2c\x0e\xe0\x58\x8b\x7d\x9e\x87\x2a\x16\x80\x38\xb8\x76\x86\x59\x97\x6d\xd7\x9f\x3c\xe0\xeb\x3e\xd9\xc9\x8e\xfb\x7a\x81\x3f\x53\x53\xca\x49\x34\xb4\x83\xc0\xc7\xd6\x2d\x9a\xea\xd6\x7d\xa8\x52\x08\x88\x83\x6b\xf7\x89\x36\x5b\x6a\xc2\x33\x80\x83\x43\x2b\x72\x24\xeb\x06\x61\x13\xf5\xba\xc9\xf4\x3d\x1e\xac\x2f\x41\xa2\xcc\x54\x3f\x1e\xbe\x87\x66\xa0\x20\x0e\x69\x27\xa2\xb0\xab\xc8\x1b\xa3\x58\xd6\x46\x51\xdb\xf7\x01\x45\x37\x25\x77\x42\x68\xc8\x48\x4a\x46\x6d\x86\x28\xcb\x64\x82\x73\xdd\x15\x11\xda\x81\xc6\x84\xd3\xb4\xa3\xe0\x6c\x4e\xb1\x99\x19\x62\xb4\x61\x29\x68\x2a\x2a\x9a\x4c\x13\x2d\x7a\x13\x35\xea\xce\x7b\xff\x60\x25\x72\xf0\xd8\xe5\x10\xda\x35\x08\xe2\xe0\xda\xbd\xa0\x18\x54\xff\x71\x39\xf9\x90\x6e\xbf\xc0\x86\xe1\xaa\xa8\x86\x6a\xcd\x6e\x7e\x7b\x62\x74\x8a\xaf\x88\xe3\xcc\x9d\xa8\xe4\x68\x44\x5c\x10\x07\xd7\x2e\x2a\x92\x71\xd4\xfd\xa2\xb3\x92\xba\x5c\xe3\x37\x45\xcc\xa9\x26\x7d\x35\x32\xcc\xcf\x35\xea\xd2\x76\x6f\x97\x24\xf4\x14\x59\xdf\x21\xe2\x82\x38\xb8\x76\x96\x24\x93\xeb\xcd\x8a\xde\xa9\x2f\x72\x2d\x07\x32\xe7\x18\x5f\x3e\x78\xd9\x16\xd7\x45\x21\xa7\x25\x1d\x24\xcc\x11\xf3\xa0\x02\xaa\xa1\x0a\xe2\xe0\xcf\x37\x07\xd3\xed\xb6\x84\x1d\x95\x72\x92\xe6\xb5\x4d\xf9\x32\x42\x73\x4f\x23\x06\x3f\xa7\xc5\x38\xfc\x47\x89\xdd\x8a\x0d\x07\xfd\x0d\xd0\x1a\x1a\x60\x60\x3d\xb5\x0e\xa7\x96\x8c\xba\x5e\xb4\x31\xed\x57\xe7\xd2\x58\xc6\xdb\xcf\x27\xab\xad\x28\x03\x4f\xae\x9d\xb3\xde\x0f\x9d\x36\x95\xb4\x4e\x8a\x82\xea\x70\x02\x38\xb8\x76\xf9\xe5\x12\x0f\xb2\xb0\x1b\x62\x09\xbc\x4a\x1d\xf3\xf3\x7b\x08\x70\x3c\x94\x64\xca\xc8\x05\xdf\x75\x9c\x93\xf1\x3e\x89\x20\x84\xce\x31\x83\x38\xb8\x76\x7b\xcb\x3b\xd7\x5d\xd7\x44\xc6\x7f\x57\xa3\xad\xbd\x24\xbb\xd4\x47\x52\x37\xf8\xc2\xa6\x1a\x35\x9d\x33\xdf\xfd\x80\xed\x49\xa4\xcc\xff\xc7\xdc\x9f\x46\xff\x52\x53\xe9\xe2\x38\x2a\x88\x03\x28\x83\xa0\x88\xda\x60\x3b\x81\x8a\x9a\xca\xd0\x36\x2a\x20\x82\x8a\xa8\xa0\xe2\x40\xb7\x62\x86\x4a\x25\x55\xa9\xa4\x2a\x49\xa5\x2a\xb1\x69\x66\x71\x04\xc5\x09\x27\xb4\x41\x05\xdb\x09\x41\x9c\xb1\x5b\x14\x51\x19\x9c\x91\x56\x69\xc4\x06\xa5\x05\x15\x51\x40\xe4\x2a\xff\x45\xdf\x7b\xf8\x9f\x0b\xae\x75\xee\x0b\x6b\xad\xdf\x3b\x16\xeb\x39\xf9\xee\x4f\x92\xca\xde\xcf\xb3\x77\x76\xee\xe8\x40\xb2\x09\xdc\x9d\xd7\xee\xb8\x4b\x7f\xff\x5f\x7b\x3d\x2f\xfc\xee\xc6\x6d\x77\xbd\xd7\x8f\x9f\xf7\xa7\x43\x6f\xb9\xec\xd7\xe7\x1d\x71\xeb\xdb\x7e\xfa\xba\x23\x1f\x7a\xed\xf6\x1f\xdc\xfc\x8e\x1a\x97\x4d\xe1\xee\x3c\xbf\x3f\x3e\x7d\xef\x07\xbf\xb4\xfd\xc9\x7d\x1f\xf0\xfd\x57\x1f\xb7\xcd\x1b\x8e\x7b\xcd\xbd\xdf\xbf\xff\xbf\xdd\x6d\x0f\xf2\xd5\x33\x7e\x9f\x0f\xda\xfa\x51\xe2\xb6\x0d\x0c\x6d\x53\xd1\xfd\x5f\x66\x68\x5b\xbf\xeb\xb4\x6b\x87\x1b\x6f\xfc\xcd\x65\xfb\xbf\xe4\xc7\xea\xa1\xbb\x6c\xf9\xc8\xd7\xdc\x5d\xbf\x95\x6c\xbe\xd5\x96\x6f\xfe\xf6\xef\x96\x33\xae\xdc\x71\x03\xdb\xd9\x14\xee\xae\x0c\xed\x59\x1f\x58\x8e\x3a\xf7\x3d\xfd\x6d\xef\x3b\x9d\x1e\x76\xe2\x74\xc5\x0d\x5b\xf8\xad\x7e\x75\xe3\x1e\xef\x58\x4e\x7d\xe5\x99\xf3\xe1\x27\x7d\xef\x92\x0d\x23\x6f\x0a\x77\x57\x86\x86\xdf\xf5\xfb\x93\x2e\x7c\x7a\xfc\xf4\x5b\x7f\xf6\xbb\xb2\xe5\xd1\xea\xb3\xbb\x9c\xf8\xd6\x9d\xdb\x8f\xef\xf1\x99\x6f\x3c\xfb\xa2\x9b\xff\xe6\x96\x6d\xbf\xbb\x61\xe4\x4d\xe1\x8e\x79\xc6\x66\x9b\xfd\xdf\xdd\x5e\xde\xf3\x8a\xa7\x3d\xeb\xd0\xcf\x3c\x6e\xb8\x79\xb7\x7f\xb8\xdf\x8f\xfe\xf5\x1a\x5b\x9d\x79\xff\xd3\x4e\xd8\xf1\x87\x2f\xfe\xe1\x27\xf8\x47\xae\x7c\xf3\x57\x1f\x77\x07\x43\xbb\xd7\x36\xdf\x3b\xe4\xd4\x67\xba\x6d\x7e\x76\xc2\x43\xe2\xe9\x3f\xff\xca\xf1\x2f\x78\xee\xef\xdf\x78\xee\x33\xde\x73\xc5\x31\xbf\x3d\xeb\xd0\x0b\xf8\xc3\xbf\xb0\x31\x43\xfb\xf0\xab\xdf\x72\xd5\x57\x8e\xa0\xe4\x21\xa7\x5c\x7f\xa3\xd9\xbb\xdd\xfd\x59\x3b\x7c\x9c\xdd\xa3\xeb\x8f\xbd\xf8\xd2\xcf\x6e\x73\xdf\xf0\x92\x6b\x36\x82\xb6\xe3\xc1\x7b\xec\xfb\x4f\x97\xfe\x60\xd7\xd7\xfb\xe7\xef\x15\x0e\xc2\xd7\x1f\x7f\xe9\x27\x6e\xfd\xd2\x61\x9f\x7f\x36\x79\x4e\x73\xf2\x17\xb7\x38\xfb\xff\x6b\x0c\x6d\x53\x3f\x6d\xe3\x7b\x68\x77\x61\x68\x07\x3d\xe8\x75\xdf\x7c\xe1\xb4\xc5\x95\xff\xcd\x2e\x5c\x2e\x7d\xcd\xa1\x67\x5e\xf2\xb5\x0f\x7e\xab\xdd\x71\x97\xcb\xdf\xff\x94\x4f\x3c\xf0\x99\xdd\xa5\x17\xfe\x55\xd2\x3b\x77\x65\x68\x5b\xee\xb7\xdb\x3f\xde\xf6\xf0\x77\xec\xba\x53\x18\x4f\x3f\xe6\xac\x07\xdf\xf7\x56\x7e\xd3\xff\x7a\xe0\x21\x2f\x7f\x4b\xff\xd4\x5d\x5f\x7e\xf9\xaf\x4e\xfe\xdd\x5f\x25\x99\x75\x57\x86\x76\xe0\x4f\x3f\x76\xda\x15\xe9\xcb\x5b\x1c\xf5\x9a\xd3\x1f\x72\xce\x71\x9b\xdd\xed\xdf\xde\x7e\xd5\x2f\x0f\x3b\xed\xa8\x9b\x68\x79\xf0\x95\x8f\xdb\xf6\xee\x87\xff\x55\x7e\xed\x5d\x19\xda\x01\x37\x9e\x53\x5f\xfd\xdf\xe0\x27\x5f\x7d\xee\xcd\xcf\xaf\xae\xbf\xd7\x63\x7f\x82\x3e\xfa\x96\x93\xbe\x4b\x76\xda\x26\x1f\xf8\xdb\x2b\x8f\x7d\xfd\x5f\xe1\x61\xb2\xd7\x3f\x63\xef\xbb\x32\xb4\x9b\x0e\xda\xf9\xfc\x5b\x6e\x7e\xcf\xc7\x7f\x70\xc6\x19\x5f\x3b\xe7\x8f\xc7\xb0\x33\x1e\xbc\xfc\x78\xcb\x67\xff\xe0\xeb\xbf\xb9\x69\xb7\xad\x1e\xf0\xb2\x9b\xff\x7a\xef\xa1\x6d\x6a\x13\xfd\x25\x8f\xf5\x87\x5b\xee\x7f\xd0\x25\xf7\x79\xf8\x27\xbe\x78\xb7\x97\x7e\xf4\xf0\x87\xdc\x76\xc8\xf1\x1f\xb9\xfa\xc7\x0f\xf9\x8e\xee\xf6\x95\x7b\xdf\x8f\xd9\x6f\x7f\xe7\x0e\x0f\xb0\x09\xdc\x9d\x3d\xd6\x57\x9e\x76\xe3\xaf\x0e\x3b\x62\xf7\x4f\x7e\x64\x47\xfc\xc4\x0f\xfd\xf7\xa3\x7f\xf7\x83\x27\xfe\xe0\x9c\xbf\x8b\xaf\xdd\xe9\xb1\x97\xbe\x6c\xb7\x0f\x98\xc7\x6c\xb9\x61\xdc\x4d\xe1\xee\xdc\xcd\xf7\x56\xfb\xea\x7f\xbe\xf9\x11\xaf\x7f\xc1\x2f\x1f\xf6\xb2\xa3\xfc\xad\x27\x9f\xf2\xf6\x83\x7f\xf8\xf4\xad\x5e\xf1\xfb\xab\x1f\x30\x3c\x75\xaf\x1d\x8f\x3f\x72\xdf\x0d\xe3\x6e\x0a\x77\x67\x7b\x0f\x78\xff\xa3\x3e\xf6\xb2\xdf\xdc\x7a\xf1\x3b\x1e\x70\xea\x27\x4e\xfb\xe8\x99\xd7\x7f\xed\x7e\xe7\xee\xf3\xf6\xdf\xa7\x7f\x9b\x1e\x71\xc0\x37\x9e\xf2\x8e\x6b\x1e\xb0\x61\xdc\x4d\xe1\xee\x12\x29\xee\x78\xf0\xa7\xff\x70\xd8\x37\xff\xf8\x44\x78\xd5\x77\x2e\xdb\xee\xe0\x6b\x1f\x77\xf0\x0e\x47\x7e\xfb\x86\x5f\x5e\xf4\xb8\xdd\xdf\xf7\xdb\x2f\xdf\xf4\xf6\x1f\x6e\x88\x36\x36\xf5\x25\xfe\xc5\x5e\x8e\x6f\x7a\xef\x87\xde\xf6\xfa\x8b\xae\x3f\xe8\x8c\xd7\x3c\x75\x27\x6a\x2e\xd8\x3e\x3d\xfe\xc0\xb7\x7e\xed\xd0\x0b\x3f\x7c\xf3\x0b\x3f\xf8\xbe\xcb\x5f\xa6\xef\xe8\xe5\xb8\x09\xdc\x9d\xe7\x62\x9b\x93\x2e\x78\xd0\x17\xf6\x3a\xf6\xd4\xfa\x5f\xd2\x95\x3b\xbf\xf1\x9f\xfe\xeb\x25\xf5\xad\xc3\x03\x3f\x75\xf6\x97\x1f\x73\xef\x8b\xe4\x87\x5f\xf3\x84\xcf\x6c\x18\x77\x53\xb8\xbb\xbe\xe4\xfb\xc5\x1b\x77\x3c\x0c\x6d\x7f\xda\x65\x67\xf0\x9d\x0e\x46\xbb\x5c\xb7\xff\xc9\x6f\x3a\xee\xb1\x07\xbf\xe2\x21\x3b\xfc\xe8\x9c\x5b\x3f\xb2\xdd\x51\x1b\xc6\xdd\x14\xee\xce\xf6\xfe\xeb\x67\x0e\x3c\xea\xa1\xff\xf1\xfa\xff\x75\xcd\x41\xff\xfa\x89\x6f\xef\x73\x7d\x78\xc3\x0b\x6f\xfc\xf7\x17\x9f\x76\xd8\x9e\xa7\x93\x2f\x5d\x7e\xc1\x4b\x1e\x70\xc2\x86\x71\x37\x85\xbb\xf3\xfc\x6e\xff\xd8\x78\xc0\x6d\x6f\xbb\xf6\x9a\x37\x5d\xfa\x8d\xf6\xd5\xaf\xfc\xc5\x4c\xbf\x70\xca\xe6\x9f\xfb\xd6\x67\xdf\x14\xde\x7d\xc8\xfe\x7f\x7c\xca\x3d\xef\xb3\x61\xed\x36\x75\x9c\xfd\xa5\xb5\x3b\xbc\x9a\x1e\x79\xd5\x7f\x5e\xb8\xed\x1e\xdb\x1d\xf8\xc4\x6b\x4f\xfc\xf6\xc3\x0e\xbe\xef\xe7\x6f\x30\x4f\x24\xbf\xfb\xbb\xa3\x5f\xfc\xbf\xfe\xfd\x0b\x0f\xbe\x6a\x83\xcd\x9b\xc2\xdd\x79\x2e\x0e\x3b\xfc\x82\x03\xd4\xbf\x5e\x7c\xbf\x6f\xbd\x7a\xab\x63\x76\xdf\xf2\x05\xdb\xdd\x83\x7d\x66\xcf\x43\xaf\x7d\xe5\xcf\xee\x1f\xef\xfb\xfe\x0b\xfe\xb6\xbf\xa3\x13\xc2\xa6\x70\x77\x5e\xbb\xe3\x6f\xd8\xe1\x5d\xef\x7c\xcd\x36\xcf\x7c\xe5\xf3\xff\xe6\x8c\xe7\xdf\xe7\x2b\x97\x3f\xed\xaa\xf7\xdc\xe7\x91\x77\x3f\xde\xec\xf0\xe4\xf3\x0e\x39\xfe\x9f\xda\xdd\x36\x8c\xbb\x29\xdc\x9d\xed\x3d\xe1\xe5\x3f\x79\xfe\xf0\xb0\xd7\x1d\xf2\xb4\xdf\xb7\x87\x3e\xea\xa4\xe7\xde\xfa\xda\xcb\x3e\xb9\xcf\x51\x95\xbe\xe4\x3e\xd3\x23\x1e\xbc\xdb\x07\x2e\xbd\xa3\xca\x71\x53\xb8\x3b\xcf\xef\x99\xfb\x9e\xba\xc0\xfb\x7f\x6d\x7a\x2b\x7c\xee\xd7\xbe\xbe\xdd\x93\xf6\xfa\xdd\x7e\xff\xb9\xe5\xfd\xde\xfb\x8b\x37\x9e\x5c\xcb\x03\xdf\xfb\xe7\x9d\x8f\xd8\xb0\x76\x9b\xf2\x09\x7f\x69\xed\xb6\xd8\xec\x49\xc7\x3d\x76\x87\xc3\xd2\xe7\x4e\x3d\xaf\xbf\xfa\xef\x77\xfe\xe6\x1f\x4f\xdf\xf1\x94\x8f\x9d\xee\x2f\xf8\xb7\x47\x3f\xfc\xb7\x3f\xf9\xdb\x3d\xf7\xdb\x60\xf3\xa6\x70\x77\x9e\x8b\xab\x2e\x79\xe5\x79\xdf\xbd\xea\xd4\xe5\xb6\x57\xbf\xff\x15\xa7\x6d\xfd\x8e\xf7\x9d\x70\x8f\x43\xc1\x91\xc7\x7d\xfa\xe3\xb7\x36\xe7\x3f\x60\x7a\xe8\xd1\x9f\xbf\xe3\x9e\xe6\x26\x70\x77\x5e\xbb\xaf\x5c\x08\x5e\xfb\xfb\x87\x36\x1f\xbb\xee\xa8\xdd\xbf\x7d\xf9\x51\x3b\x5f\xd4\x3d\xf3\xd6\xe7\xfc\xe6\xf0\xcb\x4e\xfb\xc7\xb3\xf3\xd5\xcf\x52\x0f\xdb\xfa\x8e\xb3\x78\x13\xb8\x3b\xdb\xdb\xfc\xea\x92\x7f\xbc\xe1\xe6\x7b\xec\xd4\xfe\x78\x3a\xf4\x0f\xd7\x8b\x1f\x3e\xf3\x13\x87\x5f\x7e\xe0\x09\x3f\x78\xde\x49\x2f\xfe\x87\xc7\x7d\xf2\x8b\x06\x6f\x18\x77\x53\xb8\x3b\xcf\xef\x3b\xf7\x78\xf2\xf3\xf7\x3a\xe9\x90\x67\x1d\xf1\xb9\x7a\xbb\xf3\xfe\xb4\xd7\xe7\x0e\x7f\xe9\xa9\xbb\xfd\xc3\xb0\xc7\x85\x1f\xb8\xf2\xf1\x27\x5c\x7a\xc8\x73\x1e\xba\x61\xed\x36\xe5\x58\xff\xd2\xda\xdd\xfc\xf8\x5b\x4e\x7e\xdf\xf8\xd5\xe7\xff\xf0\xa9\x9f\x7f\xff\xbb\x3f\xf0\xa8\x8f\xbe\xeb\x71\xdf\xbf\xf9\x86\xb7\x5f\xfc\xfb\x7f\xde\xf7\x6e\xe7\xbe\xe0\x19\x57\x1e\xbf\xc1\xe6\x4d\xe1\xee\x3c\x17\xb7\x3e\x68\xcb\xc7\x5f\x74\xde\x93\x0e\x7e\xb0\xbd\x82\xfd\xf0\xef\xb6\xdd\x79\xfb\x3f\xde\xf2\xb6\xdd\x0e\x38\xea\xdb\xe3\x47\x1f\xf0\xc1\x1d\xbf\x73\xc2\x1d\x39\xe6\x4d\xe1\xee\xbc\x76\x7f\xdc\xe7\xe6\x47\xff\xf6\x9e\x57\x5e\xf9\xe4\xeb\xaa\x8f\x1f\xf9\xce\xc3\xb6\x78\xfa\xde\x67\x3f\xeb\xd2\xaf\xec\x7f\xc2\x47\xef\x7b\xcd\xb5\x0f\xfb\xdd\x17\xe9\x1d\x8c\x72\x13\xb8\x3b\xdb\xfb\xe5\xdf\x3c\xa5\x3e\x7e\xf3\xcd\xdf\xca\x5f\x70\xc3\xd5\xdb\xfe\xfc\x92\x6f\x5d\x75\xf1\x3d\xbe\xf2\x5d\x7f\xc4\xfc\x8d\xcf\x7c\xf4\xac\x1f\x1e\x55\xee\xc8\xb5\x6f\x0a\x77\xe7\xf9\x45\x3f\x3a\x63\xf7\xe1\xcc\x70\xdb\x33\xde\xf4\xa1\x67\xa6\x23\x97\xe7\xbd\xf7\x29\xfb\xdc\x7b\xe7\x6b\xcf\xf8\xf1\xdd\x9f\xfd\x80\x47\x1c\xb7\xc5\x73\x9f\xb3\x81\xa1\x6d\x2a\xba\xff\xcb\x0c\xed\xc0\x6b\xbe\x71\xcd\x29\x17\xef\x7a\xd1\xa7\xdd\xeb\x7f\xbe\xe5\x41\xe7\xbf\xfa\xac\x3d\x3f\x7b\xd5\xfb\xdf\xf1\x8b\xaf\x5f\xf7\x8b\x93\xf6\xfb\xfc\x65\xdf\xbe\x74\x03\xdb\xd9\x14\xee\xae\x0c\xed\xad\xb0\x3b\xec\x90\xa7\x1f\xf4\xd3\x67\x9d\xe7\xf7\xfb\xc3\xf5\x17\x6e\xbf\xeb\xfe\x7f\x77\x4a\x77\xe3\x3d\xf7\x37\x17\x3c\xa7\xfc\xf4\xa9\xc7\xe9\x0d\x23\x6f\x0a\x77\xd7\x7e\x1e\x7f\xbc\xe5\x94\x47\x4f\x7f\xda\xfc\x9b\x17\xbf\xee\xc5\x27\x1e\x7d\xd2\xb9\x0f\xdc\xf3\x59\xd7\x1f\xf8\xe2\xed\x7e\xf9\x98\x17\xdc\x6f\xb7\x5f\xbf\xf6\x2d\xef\x38\x77\xc3\xc8\x9b\xc2\xfd\xcf\x8b\xd5\x77\xdb\x78\xe4\x4d\xbe\x87\xf6\x90\xbb\x1d\xb2\xd9\x56\x52\x9b\x27\xe0\x27\x84\x1c\x62\xdd\x6f\xfc\xdf\x8f\xfe\xdf\x83\xec\x77\xe6\xb7\xce\xdb\xe5\x92\xeb\xfe\xe1\x9f\x1e\xc2\xbe\xfa\xfd\x9d\x9e\xfa\x77\x57\x5d\xfb\x81\x13\x5e\xb3\x83\x7f\xcf\x2f\x0e\x7b\xcf\x7d\xce\xbc\xea\xcb\xff\x7e\xe4\xee\x77\x3b\x64\xb3\xed\xff\xcf\x3f\x8c\xce\xd3\xa6\xee\xa9\xef\xea\xf8\x17\xfe\xd7\x99\xff\x87\x11\xbe\xfe\x3f\x6f\xd9\xe1\x73\x2f\xba\xe2\xac\xe7\x88\xff\x7a\xfe\x7e\x8f\x79\xd4\x19\xef\xdc\xff\x94\xdd\xc8\x43\xdf\x7b\xc1\x57\x9e\xfc\xd2\xe3\xc7\xa3\xdf\x7b\xe4\xeb\x37\xfa\x11\x6f\xfc\xf1\xd5\x5f\xdb\xfc\xc4\xfb\x7e\x37\x5c\xf7\xde\x98\xaf\xfb\xd4\x8d\x9f\xfa\xc5\xeb\x77\x68\x1f\xc1\x5f\xfa\x96\x6d\xdd\x95\xa7\x9d\xba\xcf\x3b\x37\xce\x53\x3f\x6f\xd7\xc3\x7f\xfb\xaf\xdb\xef\xfa\xbb\x1f\x9f\xfd\x85\x1f\xbd\x61\x0f\x78\xd9\x73\x1f\x78\xdd\xf6\xfc\xd7\x4f\xb9\xd7\x16\xbf\x7a\xd1\xce\xc7\x9c\xfa\xb4\x8d\xd3\xf0\x5f\x9f\x7f\xda\x9d\xfb\x4c\x76\xde\xc7\xf3\xbd\xfe\xf6\x23\x67\xfe\xcb\x57\x3e\x78\xe3\xe5\x4f\xfe\xfa\x0f\x77\x76\xf9\x93\xff\xfc\xf0\x17\xfe\x64\xe3\xee\x7c\x0f\xfa\x73\x7b\x11\x3d\xed\xb4\x6e\x2b\xf2\x94\x03\xfe\xfe\x84\x0f\x3d\xe7\xa8\xc7\xde\xf0\xcd\x77\xbf\xe0\xc8\x83\xde\xf4\x9e\xe5\xfb\xf7\x3a\xe4\x75\x1b\x37\x96\x7f\xc1\x63\x0e\x85\x07\x7c\x0f\xbd\xe2\xbd\xc7\xef\xfa\x86\xcb\xde\x70\xe3\x57\x9f\xf4\xaa\x9f\x7c\x01\x1e\xbc\xef\xf9\x69\xd4\xfb\x2e\x7b\x9e\x77\xf7\x9d\xee\xfb\x7f\xbd\xb2\xb5\xfb\x01\xd3\xbd\x9e\x78\xf4\x3d\xaf\x3a\xff\xa6\xa3\x4e\x5a\x0e\xbb\xcf\x37\xcf\xff\x2d\xfd\xd2\x67\xfe\xe6\xc2\x1f\xbc\xe9\x09\x17\x9d\x55\x9f\x7e\x8f\x5d\xf6\xde\x7b\xef\x73\xee\xf6\xff\x36\x0b\xc7\x6e\x71\xfb\xe0\xc7\x3c\x63\xcb\xcd\x36\xdb\xec\x98\x8d\xfe\xc6\x21\xfb\xfc\xf2\x91\x7e\xff\x2f\xde\xf2\x8e\x23\x3f\xb8\xdf\x17\xfc\x49\x5f\x3e\xff\x8d\x27\x6f\xfe\xf2\x0f\x7c\xf9\xb8\x6d\x5e\x78\xc6\xfb\xdf\x76\xeb\xe1\x3f\xdd\x08\xba\xd9\x8d\xf5\x19\xf5\x99\x7b\x0f\x1f\x3c\xf6\xd7\xff\xf9\xd2\x9d\x7e\xb9\xf3\x01\xef\x79\xfc\xb3\xef\x73\xd9\x4b\x9e\x7f\xe5\x95\x3f\x22\x3b\xef\xf7\xc9\xe7\x6d\x04\xfd\xc1\xbb\x7f\xfe\xcf\x97\xdd\x76\xe2\x11\x3b\x9d\xf2\xf2\x97\xbd\xec\x88\x97\xbe\xea\x69\x47\xc7\xfb\x9d\xbf\xcb\x69\xf7\x2a\x7f\x7a\xf9\x76\xdf\xb9\xf8\xc2\xf7\x1f\x79\xe2\x7d\xff\xdf\xfe\xfc\x31\xcf\xb8\xed\xb6\xdb\x6e\x3b\x79\x97\x8d\xc6\xfe\xfa\xe1\x17\x9f\xf1\x80\xfd\x3f\xf5\xfd\x4f\x5e\xf3\xd3\xed\x45\x7e\xd3\x1b\xbf\xf4\xcb\x6d\x36\x7b\xc4\x5e\x7b\xee\xbf\xd3\x4e\xee\xb8\x6f\x5d\xfe\x98\x8d\x7f\xdc\xbd\x7f\xbf\xfd\x65\xe0\x05\x3b\x1d\xf7\xc6\xf7\x1d\xc1\x2f\xfd\x87\xa3\x77\xfe\xe5\xc7\x3e\x7b\x8f\x8f\x9d\x7d\x35\xfa\xd3\x36\x97\x3f\xe4\x19\x9f\xba\xef\x89\x1b\x41\x77\x7f\xef\x93\x1f\xf3\x87\xbd\xfe\x5b\xec\xf5\xae\x97\xe0\xb3\x7f\xbd\xe3\x15\x97\x7c\xef\x8a\x33\x3f\x77\x19\xf9\x74\x2e\x37\x3c\xe5\xfd\xfb\x3c\x65\xe3\xcc\xef\xfd\x77\xbf\xe9\xc7\xdf\x39\xeb\x65\xe9\x8c\x27\x6d\xf5\xd2\xab\xf9\x0b\xf6\x7d\xf5\x4b\xfe\xfc\xca\x6e\xc1\x57\xef\xf6\xd5\x73\xfe\xeb\xb6\x3f\xdf\x77\x8b\x8d\xd3\x36\xd7\xbc\xf8\xb7\x27\x7d\xf8\x71\xcf\xbf\xf1\xe4\x97\x9d\x7d\xca\xfe\x4f\xff\xde\x67\xcb\x49\x17\x5f\xf5\x8d\xbf\xb9\xe9\x0d\x8f\xeb\xdf\xfb\xb1\x6f\xbe\xf0\xbc\x8d\xa0\x3f\x7a\xd2\x0b\xbe\xf6\xc9\xbd\x0f\x3e\xf0\xf1\xa7\x8e\xef\x38\xeb\xf8\x67\xff\xf9\x8f\xff\xf1\x88\x8f\x3c\xf2\x75\xfd\xc9\xf8\xdb\x4f\x64\x6f\xb8\x5a\xed\xbb\x31\xf4\x92\xbb\x5d\xb2\x77\xf5\xf7\xcb\x31\xdb\x9e\xfa\xdc\x71\x9f\x57\x8e\x07\x5f\xf4\x54\x7d\xec\x70\xda\xeb\xf7\x39\x40\x1f\x88\xde\x7d\xc0\xa3\x37\x82\x5e\x7d\xe2\x33\x9e\xf8\xc3\x63\xaf\xd8\xf7\x32\x6b\xd1\xd1\xaf\xfe\x8f\xe3\xec\x99\x4f\x78\xca\xdf\xdf\xe7\x1c\x7d\xce\xbf\x7f\xf9\xe2\x1f\xbc\xe1\xb5\x1f\xdf\x08\x7a\xd2\x2f\x9e\x7e\xdc\xc3\x4e\xfe\xee\x1f\xce\xb8\xe1\xf0\x1d\xde\x42\xd9\x77\x7e\xf5\xd5\x9b\xb6\xbc\xb5\xdd\xfa\xdc\xbf\xdd\x62\xaf\x83\x0f\xfe\xec\x7d\x36\x2e\x87\x3d\x74\xfb\xa7\xed\xf2\x1f\x27\xbf\xef\x1d\x8f\x3e\x7f\x5f\x71\x10\x79\xd7\x33\xff\xeb\x79\x8f\xba\xe6\xf9\x2f\x7c\xf5\x73\xdf\xfc\xd4\xf4\xb0\x4f\xee\x75\xf1\x3f\x6e\xcc\x5d\x7f\xf2\x81\xd3\x1f\x75\xe2\x0e\xd7\xdc\x72\x11\x3f\xf6\x9e\x67\xfe\xd7\x65\xef\xba\xe1\x7b\xcf\x39\xf6\x94\xeb\xee\x7e\xc0\x2b\x9e\x42\x5f\xf4\xb5\x7b\xbd\x68\x23\xe8\x2d\xd4\x1c\xf5\xb3\xd3\xb7\x78\xdb\xe7\xcf\x7a\x57\xfb\x85\x5b\x4f\x39\xfb\xa9\xdf\x8f\xb7\xbe\xeb\xa6\xed\xfe\x78\xf7\x3f\x5f\x95\x7f\xb1\xcb\xa7\x9f\xb4\x11\xf4\xb1\x7f\x38\x6f\xab\xd7\x7e\xfb\xa1\x27\x3c\xe9\xc5\x1f\x78\xf6\x5e\x2f\x6e\xce\xfd\xd8\x4e\xaf\xfa\xc8\xb5\xef\x7c\xd5\xb6\xdb\x9c\x7d\xd6\xcf\x37\xdf\xf5\xd7\x1b\xbf\x87\xfe\x91\xcd\xb7\x3b\xfb\xa5\xcf\xdc\xe2\x8a\x1d\x4e\x78\xf7\x97\x7e\xf6\x8e\x33\xb7\x0f\x37\x3e\xe8\xf1\x4f\xdb\xf1\x27\xef\xbd\xd7\xdb\xdf\xfd\xa2\x5f\xbd\x6d\xc7\x8b\x37\x82\xee\xec\xef\xb9\xd9\xd6\x17\x4d\x4f\xbf\x88\xff\xf6\x5f\x1e\xb0\xb5\xd4\x47\x3c\xe4\xde\x27\x7f\xda\xfd\x7b\xb8\xfe\x9c\x97\x1c\x73\xe0\x8b\x5f\xb8\xf1\xb7\xb0\xcd\x1f\x2f\xfd\xc6\x9f\x4e\x3d\xfe\x91\x3f\xdc\xe7\xfa\x7b\xfe\xee\x7b\xcf\xf9\xef\x47\x1e\x75\x38\x3f\x5f\x7c\xea\x33\x7b\x7e\xe5\x1e\x6f\xbe\xf6\x79\xff\xf2\x99\x8d\xa0\x97\xed\x40\x4e\xbd\xed\xcc\xdf\x7c\xea\x09\x9f\xfd\xe8\xf7\x5f\x29\xbf\xfe\xdb\xe6\x83\xb7\xa2\x6d\x2e\xdb\x49\x3f\xf0\xa3\xcf\xdc\xcc\x7f\xf5\x31\x1b\x5f\x04\xdd\xe5\x3e\xbf\xdc\xef\x6f\xd2\xcd\xaa\x7f\xf2\xb1\xdf\x2b\x17\xfe\xf2\x11\xc7\xde\xfb\xd3\x5f\xaf\x0f\xfd\xd2\xb5\x47\xbc\xe9\x1f\x2f\xd8\x77\xbb\xd3\x3f\xba\x11\xf4\xb5\x9f\xf9\xb7\x43\x5e\xf4\xee\x0b\xdf\xfc\xb0\x76\xdb\x03\x7f\xbe\xc3\xfd\x0e\xf5\x3b\xec\xb9\x39\xfe\xe1\x25\x87\x5f\xfc\x98\x87\xdd\xef\x75\xe7\xff\x5f\x2d\x5a\x5f\x61\x86\xab\xb7\x38\x9c\x5e\xf0\xaa\x0b\xbf\x7e\xc4\xcf\x1f\x7e\x8f\xe7\x1d\x59\x7d\xfa\xa2\x9f\x3f\xfc\xe1\xc7\x5e\xf8\xa0\x57\xbd\xec\xbe\xf1\xf1\xc7\x6e\x04\xbd\x7e\xa7\x47\x7c\xef\x82\x17\x3d\x00\xaa\xad\x77\x9f\x7e\x60\xcf\xff\xd9\x65\x8f\x3f\x2b\xfc\x76\x9b\x7f\x7a\xe1\xfc\xb9\x7e\xf7\x93\xe4\xb3\x6e\xda\x08\xfa\x84\xcf\x1f\xfc\xb8\x13\xb7\x7c\xe3\x6f\xf6\x3c\xfa\xc2\xff\xfc\xd5\x3e\x2f\xa7\xec\xb8\xcf\x7f\xed\xd8\xf3\x4f\x3a\xeb\x49\x5b\xed\xb1\xdd\x3f\x3e\xf2\x39\xe3\xc6\xb2\xe8\x0d\x57\x1b\x7c\xea\x17\x06\xf9\xf0\x23\x4e\x7a\xe6\x0f\x3e\xf7\xe6\x77\x0e\xf7\xdc\x75\xd7\xad\xcf\xf9\xe7\x73\xf7\x79\xd5\x63\x9e\xf8\xf9\xf3\xbf\xb4\x11\xf4\x0d\xb7\xee\x73\xc8\x27\x0f\xfd\xc5\xe7\x1f\x7c\xf7\xf7\x6f\xf1\xa0\x97\x3c\x28\x4f\xdf\xbe\xf9\xba\x3d\x36\x3f\xe1\x9f\xf5\x36\x1f\xda\x63\xf3\xf3\x6e\x3b\x68\x23\xa8\xdd\xf3\x0d\xfb\x3d\xf2\x23\xbf\x33\x97\x5f\x79\xc5\x33\xfe\xfc\x88\xcd\xdc\x8b\xb6\x7a\xc6\x23\x5f\x73\xcc\xfd\x5f\x71\xee\x97\xfe\xf6\xfb\x8f\xfa\xd5\xf9\xdb\x6e\x04\x7d\xb4\xb8\xe6\xb4\x1d\xf6\xfb\xe2\x1f\xff\xfc\xd1\x0f\x5d\xc4\x8f\x11\x2f\x3b\xed\xb6\xef\x3e\xec\xd1\x7b\x2e\xa9\xfc\xe9\x7b\x5f\xd9\xec\x8d\x07\x1f\xb8\x11\xf4\x4b\xdf\xf9\x9b\x2f\x3c\xfb\x0f\x97\x6f\x75\xc9\x33\x76\xba\x65\x87\x17\xfd\x9d\x7f\xf7\xe3\xbf\xf8\xfc\xc3\x4e\xff\xf0\x09\x3f\xfa\xe0\x67\x8f\xdd\xfd\x83\xd5\xc7\x36\x82\xbe\xf2\x2d\x6f\xbd\xe6\xd9\xff\x40\x8e\x79\xf8\xd6\xf7\xfe\xb0\x8d\xb7\xde\xe3\xa2\x7f\x7b\xeb\x25\x47\x9f\xf9\xe8\xd3\xf6\x7f\xc1\xd6\xaf\x39\xe3\x8a\xc3\x4e\xde\xf8\xc8\xd8\xee\xd6\xd7\xdc\xff\x92\xef\xb4\x87\x75\x6f\xba\xe5\xba\xe7\xed\xb1\xdb\x8d\xe7\xec\xf8\xa0\xfd\xce\x39\xe4\x81\x9f\xd9\xfa\x5e\x67\x6f\x7f\xda\x72\xff\x8d\xa0\xee\x11\xd3\xf0\xba\x2b\xae\x7f\xe8\xc7\x1e\xfb\xa6\x47\xfc\xf8\xbf\x5f\xb5\xe7\xbd\x9e\xfb\xf4\xfd\xd5\xd5\xa7\x9c\xfc\x89\x97\x9c\x73\xf0\xb6\x56\x5d\xb7\xb1\x28\xfc\x92\x0b\x9a\x03\xcf\x3a\xe0\x59\xf7\x3c\xba\xfb\xcc\x6e\xfb\xab\xc3\x2f\xfa\xf1\xb9\xbf\x7c\xfb\x56\x2f\xaf\x1e\xf6\x93\x43\xbe\xf5\xfe\xf7\x1d\xf9\x9a\x8d\xa0\x4f\xb9\xee\xbd\x5f\xd9\xf1\x43\xfc\xc4\xed\x7f\x7d\xce\x1b\x87\x9b\x4f\x7f\xeb\x8e\xdf\x75\x7f\x7a\xf8\xd7\xdf\xfc\xba\xa3\x9b\x13\xf7\xb8\xf0\x84\x63\xbf\x74\xe4\x6f\x76\xfd\x7f\x3b\x5d\xff\xf7\x81\x7c\xe4\xc9\xbb\xdc\xee\x82\x1f\xb3\xd9\xdd\x8e\xfa\xd9\x3d\x4e\xda\x65\x97\x27\xbf\xf8\x7e\xaf\xda\xfe\xc3\x7b\x6e\x79\xea\xbe\x7f\x7a\xf4\x2e\xb7\x9d\x7e\xe1\xd3\x1e\xba\xc7\x41\x87\x9e\xcd\x4e\xc9\xbf\xe7\xdb\x1f\xfc\xb8\x1f\xdd\xf3\xc1\xbb\x6c\xb6\xd9\x66\x37\x3e\x7d\x33\xb1\xef\x66\xd7\x6c\xb9\xec\xc3\x68\xc3\x5c\x4d\x21\x43\x94\x71\xda\xa9\xce\x4c\x29\x1a\x9a\x58\x8f\xfd\x94\x2b\x58\x58\x15\xd4\xe0\x49\xab\x1c\xce\x46\x92\xb6\x10\x66\xf1\x62\x46\x44\x33\x1a\x4c\x2e\x9b\x3d\x78\xb3\x07\x9e\xbe\xed\xde\x7b\xef\xfd\x57\xb3\x82\x55\xb4\x1e\x28\x74\x23\x58\x52\x27\xe6\x09\xfb\xb9\x41\x8d\xf7\x84\x20\x33\x2f\x84\xb2\x29\xa0\x21\x91\x40\x49\x51\x2a\x2f\xc4\x2a\xde\xfd\xf5\xad\xa0\xa2\x8c\x0d\xe9\x0d\x8c\xd0\xf2\xd9\x58\xe6\xdb\x21\xd9\x91\x54\x78\x11\x6d\x4f\x5c\x70\x04\xfb\x99\x8c\x54\x47\x2b\x1d\xef\x3c\x2e\x7e\x85\xb9\x00\xa6\x99\x1c\xe7\x24\x15\x5f\xf5\xbe\x74\x64\x50\x76\xae\x7a\x8f\xd0\x58\xe3\x5e\xfb\x21\x3a\x30\x4f\xa3\x00\x11\x97\x39\x66\x32\xb3\xb4\xc2\x5c\x8c\x3c\xa8\x66\xf0\xcb\x38\x8b\xd8\x0b\x1b\x0a\x57\x00\x60\x26\x5d\xe4\x89\xcb\x32\xc2\x36\x8e\xd2\xc9\x48\x4d\xae\x40\x1b\x31\xf4\x6e\x85\xb9\x18\xf5\x08\x38\x1d\x88\x2f\x52\xb8\x64\x5a\x3b\xd5\x5d\xd4\xdc\x54\x63\x40\x79\xa8\x49\x8f\xeb\x71\xc2\x2e\x80\x39\xd4\x85\x38\x3d\xc6\xb8\x82\x15\x7e\x5c\x10\xea\x28\x4f\x59\x62\x8d\x47\x2b\xd1\xd4\x74\x33\x6f\x68\x1f\x53\xa0\xb1\xa0\xa5\x87\x2e\x59\xbe\x18\xcc\x45\xe5\x91\xed\x9a\x15\xac\xe0\xb2\xb6\x2a\xf6\x23\x50\x59\x9a\xd2\x71\x4a\x0c\x4c\x10\x12\x44\x4b\xbb\xa8\xaa\x41\xba\x30\x51\xc7\x59\x07\x1b\x1b\x42\x60\xdf\x8d\x2b\xec\x8b\x79\xa4\x75\x4d\x2d\x75\xd0\x83\x76\xca\xd5\xc0\x62\x58\xda\x59\xb9\xd2\x41\xda\x27\x53\x16\x2a\xa0\xa4\xd3\xa4\x1d\xc1\x53\x3d\xe2\x6a\x85\x6f\x84\xf6\x6d\xe3\x68\xd1\x61\x22\x30\xa4\xa6\xb3\x60\xea\x1d\xe8\x65\xc4\xed\x34\xcb\x1a\xce\x31\xa8\xce\x74\x36\xd0\x29\x75\x19\x83\xd6\x19\xbb\x82\x15\x41\x03\xa2\x35\xeb\xda\x39\x41\xc6\x00\x08\x6d\x58\x32\xc8\x0b\x82\x40\xb7\x42\xc4\xa6\x21\xa5\x80\x90\x5b\x5c\x6b\x93\xf3\x44\xd8\xb0\x82\x15\xa5\xed\xc2\xdc\x8e\x39\x95\x31\xa4\x04\x7d\x65\x87\xa5\xb5\x69\x92\x04\xd4\xbc\x96\xb0\xf1\xbe\x34\x4c\xd2\xa6\x92\x0e\xd4\xac\x8b\x23\x5f\x63\x5f\xd4\x2e\x44\xd9\x31\x9d\x2a\x56\xb3\x04\x80\x99\xeb\x6a\x1c\x82\x14\x0b\xf5\x4c\xb7\x21\xb7\x14\x98\x64\x4c\xe5\x44\x9b\x9c\x51\x79\x5e\xc1\x0a\x93\x02\xe9\x25\x6d\xda\xd9\xf6\x13\x87\x69\x02\x95\xed\xd3\x00\x1a\x4b\x54\xcf\x81\xac\x45\x99\x8a\x10\x43\x9f\x0d\x87\x42\xa6\xbe\x23\x2b\x58\x21\xe7\x56\x30\xca\x58\xd3\xf5\x44\x35\x6d\x42\x08\x9b\x41\xd9\x51\xf3\x42\x07\x8e\x05\x6e\x17\x68\x46\xa3\x27\xd4\xa3\x69\x86\x15\xcb\xd5\x0a\xe7\x45\xcc\x12\x21\x30\x15\xdf\x14\xa0\x38\x99\x7c\x50\x5d\xb0\xed\x88\x8c\x0d\x69\x61\x33\xe6\x08\xfb\x66\x4c\x21\x4f\x10\x60\x4f\x43\x6c\xd7\xf0\x23\x82\x75\x3c\x39\xd0\xdb\x59\x03\xa8\xc5\x10\x94\x94\x53\x4e\x68\x1a\x48\x93\xcc\x20\x7c\xdf\x77\xa0\xa7\x2a\x1b\x44\x44\x82\xb0\x5d\xc3\x8a\x6e\xec\xa2\x24\x85\x56\x6a\xa9\xab\x41\x9b\x8a\xb1\xa1\x74\x66\xc2\xd4\x0f\xa5\x94\x69\x40\xd1\xcf\xa8\x62\xd2\xb8\x46\xa4\x99\x80\x31\xaf\x71\x82\x5b\x1c\xeb\x69\x5e\xea\x02\x9a\xc1\xf6\x70\x14\xae\x15\x25\x8a\x5e\x8a\x76\xc0\x4a\xda\x45\x8f\x43\x46\x0c\x33\xdb\xe7\x6c\x09\x2f\xcb\x0a\x73\xb1\xc8\xd0\xa2\xa5\x6b\x97\xe8\x97\xaa\x28\x48\xe1\x04\x96\xde\x84\x12\x05\x48\x79\x74\x70\x2e\xd5\x5c\x0d\x84\xf4\x54\x88\xb9\xaf\x73\xab\x57\x98\x0b\xcb\x8d\x52\x58\x62\x9a\x87\xc5\xd9\xae\x47\x93\x0d\x93\x30\x61\x92\xb8\x45\xa9\x85\x75\xb0\x6c\x80\xc1\x93\xa0\xdb\xd4\xce\x50\x74\x6b\xec\x8b\x94\x33\xec\xa0\xab\xa9\xca\x92\x2e\x8e\x50\xb8\xa0\xba\xf4\xd1\x12\xa3\xb1\xec\x7d\x04\xfd\x1c\x25\x68\x93\x1a\x46\x91\xa0\xb5\x7c\x0d\x2b\x88\x81\x74\x02\x2c\xd7\x96\x3b\x8f\xdc\x3c\xd8\xde\x20\x0b\x10\x5f\x7c\xbf\xc0\xba\xb7\x71\x16\x33\x32\x66\xa4\x75\xa1\xc4\xd5\x2d\x85\x2b\xac\x48\x46\xde\x07\xa9\xc0\xa0\xa7\x76\xe6\xd0\x89\x99\x39\x00\x30\x9f\x11\xa2\xaa\xb7\xd2\x41\xec\x17\x0a\xa5\x04\x83\xf5\x54\x8b\x32\xae\x10\x5f\xb0\x92\xbb\xaa\xaf\x00\xe2\xfd\x60\x09\x0f\x8d\x9c\x96\xb6\xae\xad\xb5\x0d\xa6\xba\xd7\xb8\x88\x2a\xd5\x71\xc1\x8a\x07\x52\xcb\x96\x53\xbf\xc2\xee\xa4\x13\x61\x66\xc2\x4c\xf5\x75\x00\x6a\x6a\x9d\xf7\xd4\x35\x75\x00\x54\x17\x67\x48\x93\x70\x4b\xbd\xe8\x9b\xb6\xe6\xcc\xab\xd4\xf2\x2a\x83\x35\x58\xd1\xed\x47\x84\x67\x31\x1a\xec\x9a\x36\xdb\x44\x48\x57\xa2\xf7\xa4\x61\x1c\x7a\x88\xda\x1a\x4b\x30\x14\xcc\x03\x88\x4d\x17\xab\xc0\x57\x88\x2f\x18\x53\x4d\xdf\x76\x13\x51\xc9\xb4\x25\x2a\x03\xea\x39\x2b\x37\xd7\xde\xe2\x86\x45\x87\x4a\x2b\x97\x5a\x2c\xb0\xaa\x5d\xa8\x27\xde\x49\xb6\xc6\x79\x01\x26\xbf\xf8\xd0\x08\x4e\xda\x22\xdc\xe4\x5d\xc4\xa6\x2a\x22\x82\xb6\x69\x6d\x15\xa5\xed\x21\x87\x63\xe8\xb2\xaa\x3a\x3b\xcb\xb6\x31\x6b\xec\x0b\xe9\x89\x6c\xbc\x94\x02\x43\x0b\x9d\xae\x14\x47\xf3\x04\xfd\x30\x06\x6c\x29\x05\x9c\x54\xcb\x92\x1a\xa6\x55\x07\x38\x34\x1d\x40\x7e\x0d\x26\x40\xb1\x9c\xca\x32\x68\x56\x2d\xb2\x75\xd0\x12\x0b\x28\xa2\xac\x9b\xc5\x54\xd3\x90\x1a\xe0\x78\x1a\xd0\x00\x2a\x1b\x87\x94\x1a\x37\x57\xf5\x0a\x56\x84\x99\x76\x9d\x1d\x18\xee\x31\x9f\x29\x4e\x8a\x07\x07\x39\x0c\x09\xe7\x69\xae\x47\x9b\x96\x59\x8d\x79\x02\xbc\x69\x52\x1b\xbb\xd4\xb4\xff\xff\xb8\x73\x83\xe0\xb1\x29\x8d\x78\x05\xc1\x03\x65\xc7\xf1\x12\x94\x76\x24\xc3\x2e\x46\x02\x07\x68\x9c\x98\x3b\x8a\x6a\x01\x68\x72\x49\x81\x5c\xd8\x0c\xc6\x8c\x64\xe0\x26\x54\x61\x8d\x23\x5f\x72\x05\x6a\xbc\xd8\x94\x52\x6f\x74\xef\x26\xdf\x4e\x6d\x3b\x92\x62\xd1\x0c\xab\x90\x1c\x53\x4c\x34\x88\x4e\x29\x90\x92\x94\x2b\x2b\x90\x7c\xd6\x35\xb2\x37\x19\x8e\x5d\xd1\xc2\x76\xa9\xae\x18\xca\x51\xf8\xaa\x17\x4a\x80\xa1\xef\x52\x35\x26\x35\x46\xea\x0d\x6a\x26\x92\x9d\xae\x56\xa0\xd7\xb4\xf3\xa8\x06\x7d\x83\x39\xe3\x4d\x1c\xbc\x1b\xc6\x66\x54\x72\x31\x1c\xcb\x8a\xf3\xc1\x40\x2b\x91\x87\xbc\xa1\x3a\xc3\x41\xf3\x8a\x06\xb3\xc2\x5c\xcc\x61\xc4\x70\x30\xb4\xcf\x4b\x69\x4c\xcb\x5a\x8d\x50\x96\xb3\x9a\x8b\x28\x0a\x2c\x75\x5a\xfa\xca\x27\x62\xbd\xa8\xa9\x8a\x5a\x4e\x15\x5d\x83\x52\x46\xd5\x1a\xde\xc1\x26\xc7\xa8\xa4\x4a\x95\x36\x53\x4a\x3d\x9c\x61\x74\x81\xd6\x33\x51\x2a\x90\xce\x41\x4e\x09\xe0\x92\xe4\x36\xac\x71\xcc\x19\x3a\x0c\x09\xcc\x64\x0a\xb4\x9a\x17\xa2\x51\xd7\x68\xd1\x4f\x03\x59\x32\x83\x0b\x83\x12\x47\xda\x97\xa5\x18\x0e\x18\x9b\x55\x49\x62\x8d\xb9\x18\xfa\xbc\xd4\x68\x58\x50\x4e\xc8\x2a\xc5\x85\xd0\xd9\x06\xde\x24\x38\x74\xae\xd0\x09\x20\x47\x9b\x0a\x2e\xd3\xe0\x3b\x8a\xa2\x1b\x40\xbf\x82\x15\x15\xe1\xb0\x63\x79\xc0\x13\x9f\x33\x0a\x73\x31\x69\x1a\x2c\x21\xf5\xd2\xce\x15\x66\x5c\x39\x9c\xf0\xd0\x9a\x36\xd4\xa8\x00\xa9\x90\x58\xc3\xfd\x71\x3a\x03\x35\x66\x12\xb5\x8b\xd0\x2c\x79\x10\xb8\x62\x55\xc2\xde\xf1\x40\x82\x16\x59\x36\xe3\xe2\x8b\x85\xd4\x80\x94\x58\x93\xf2\x0a\xa7\x16\x23\x1e\x0f\x73\xe5\x6c\xaf\x44\x0a\x8b\x27\x60\x58\x74\x43\xda\x60\x31\x99\xd5\x38\xf7\x03\x6b\x7b\x13\x34\x99\x72\xad\x8c\xae\x63\x07\x56\xa0\xd7\x2c\xc1\x19\x44\x69\x87\x10\xa1\x86\x58\x0a\xa5\x16\xc8\x21\xf3\x1d\xb3\x4d\xcd\x81\xf7\x0c\x35\x4d\x36\x01\xd3\xba\x77\xc4\x31\x54\x56\x90\xac\xe9\xc8\x86\x56\xd7\x66\xa9\x92\x4f\xba\xcd\x18\xd8\xdb\x99\xbd\x25\x6d\x12\xb2\x19\xc3\x60\xac\x54\x36\x97\x25\x01\x8a\x67\x20\x04\x1a\xd7\xf8\x52\xbb\xb6\x67\xa4\xe2\x2a\xb7\x10\x0f\xc5\x12\xa5\x5b\x9e\x6a\x1a\x67\xaf\x38\xee\x28\x17\x71\xe1\x21\xcc\xbd\xec\xaa\xaa\x85\xc5\x18\xb0\x86\x64\xdd\xa2\x61\x81\xd1\x32\xab\x50\x18\x74\x91\x75\x63\xc6\x89\x3b\x48\x95\xd3\x49\x03\x66\xa9\x4e\x78\xe6\x35\xb3\x32\x52\x51\xaa\x52\xd6\x38\xc1\x85\x6a\xb1\xe8\xa8\xcb\x9d\x14\xbe\x52\xd8\xa2\xe8\x7b\x3c\xfb\x91\x57\x40\x07\xd0\x9b\x9a\xce\x7d\x4d\xdb\xd9\x35\x4b\xe7\x9c\x70\x7c\x0d\x1a\x15\x71\xa7\x08\x75\x83\x94\xce\xe8\x7e\x26\x98\xd5\x23\xd5\x11\xcc\xb1\xe6\xf3\x14\x5b\x81\x03\x4c\xd5\xac\x0d\xe7\x83\x95\x68\xa9\xa8\x5a\x61\x5f\x58\xed\x18\x88\xcd\x58\x03\x24\x50\x15\x42\x55\xe9\xd9\xe5\x29\x5b\xda\xcc\xcc\xd3\xb1\x1d\x2a\xe3\x87\xe0\x41\x60\x15\x4e\x55\x74\x54\xae\x60\x45\x63\x15\x89\xbd\xd6\x80\xd4\x65\x98\x96\x68\xfb\x09\x70\xdf\x21\x13\x52\x1c\x6a\xaf\x85\x5d\x44\x86\x10\xb2\x8c\xa7\x0a\xf3\x42\xfc\x1a\xfb\x02\xa2\xe0\xa8\xb6\x48\xcd\x63\xec\x49\x03\x0b\x30\xc1\xd7\x4b\x53\xba\x29\xc4\x31\x55\xdc\x89\xde\x96\x5e\x44\x55\xbc\x9d\x19\xc9\xd5\x1a\x32\x6d\x15\x41\xdd\x17\x53\xc7\xca\xa9\xac\x73\x07\x54\x52\xcd\xa4\xf4\x9c\x7a\x5c\xb4\xe2\xa1\x23\x21\x0b\x39\x15\xd8\xb5\xca\x21\x52\x83\x35\x7c\x2a\x9e\x44\x41\x90\x58\xdf\x86\xdc\xb3\xce\x5b\x00\x83\x9f\x34\xb1\x05\x63\xb3\x48\x07\x6b\x02\x52\xee\x34\xac\xbb\x04\x48\x14\x64\x15\xf1\x87\xe9\x6a\xf1\x5d\x6b\x29\x9d\x6c\x32\x56\xe1\x16\xc6\x56\x2c\xb4\x65\x7d\xd3\x54\xb0\x31\x5a\x8f\x03\x8f\x72\x6e\x87\x65\x34\x74\xce\x6b\xd0\x6b\xca\xbb\xbe\x99\xcc\xb8\x60\x30\x14\x81\x83\xd5\x65\xa2\xbd\xc3\x3e\xc9\x5e\x61\x40\x97\x71\xf4\x3d\x86\x92\x69\xc9\xb1\x9f\x51\x0f\xfd\x0a\x5f\x2a\x6b\x91\x13\x33\x98\x27\x15\x49\x2c\xa0\x19\x73\xd3\x71\x47\x21\xa7\x2e\x06\x5a\x4b\xdc\xb7\x33\x68\x7c\x8b\xbd\x64\x96\x93\xbe\xd6\x62\x85\x44\x1b\x05\x72\xc2\x55\xe4\x59\x35\x66\x1e\x5a\x17\xab\x22\xf5\xc8\xe5\x3c\x4e\x06\xa2\x69\x6a\x4a\xd5\x37\xbd\x86\x75\x8e\x8a\x0f\x43\x5f\xbb\x35\xfc\x08\x1d\x4d\x6f\x05\xed\xc1\xd2\x35\x05\x47\xc3\xa6\x21\x25\x05\x16\x31\x16\x1a\x97\x12\x6a\xa0\x74\x1c\xc4\x80\x17\x59\x05\xc2\x7b\xd6\xb7\x6b\x9c\x17\x41\xa9\x3a\x03\x8a\x24\xad\x84\xb7\x69\x81\xba\xa9\x49\xc5\x4a\x6f\xba\x64\x16\x08\x6b\x40\xdc\x58\xa6\x2e\x14\x96\xd3\xe2\x5d\x57\xd6\x90\xef\x61\x81\xcd\x4c\x17\xc9\x8a\xec\x28\x6d\xfb\x0e\xd7\xa5\x43\x64\xe4\x91\x50\x90\x51\x5d\x2f\xae\x41\x4d\xae\xa1\x6f\x3a\x29\xb5\xee\xda\x15\x24\x6b\x3a\x56\x6a\x69\x6e\xff\x46\xab\x71\xea\x94\xc2\x8b\x2d\x04\x8c\x5d\x40\x84\xc6\x25\xeb\xc1\xe7\x4a\xc3\xaa\xee\x08\x12\xd2\x8b\xc1\x11\xb1\x46\x0c\x5e\x4c\x54\x2d\x19\xb9\x61\xa8\xb5\x30\xa8\xa2\x61\xbb\xb4\x09\xd0\xb1\x55\x5e\x80\x6a\x6a\x4c\x41\x73\x26\x88\x8e\xd6\xfb\xaa\xc7\x1d\x5b\xc1\x0a\x3d\x43\x0d\x75\x1e\xf3\x50\xdb\xb1\xea\x26\xc3\x21\xc3\xca\x8f\x30\x65\x4f\x9d\x4c\xe3\x28\xfd\x3c\xd4\xf3\x44\xc7\x96\x2b\xd3\x73\x61\xee\x22\x78\x6c\xaa\xd2\xed\xaf\x2f\x78\xb0\x96\x2c\x85\x76\x5d\xee\xa7\x3e\x4d\xd3\xe4\x73\x57\x75\x31\xa8\x66\x54\x0d\xca\x44\x77\x59\xd0\xc4\x83\x1f\x47\xd8\x66\xae\xd5\x32\xeb\x69\x85\xc9\xf3\x45\x0f\xb3\x0c\x6e\x6a\xea\x05\x19\xa4\x97\x46\x06\x2f\x6b\x61\x27\x07\xb3\x1d\xea\xc9\xe0\xcc\x46\xc8\xca\xac\xc8\x58\x11\x1f\xf8\x0a\x9f\x36\x2d\xd8\xd0\x0e\x8a\x12\x60\xc6\x81\x08\x89\xa3\x9f\x5b\xbe\x98\xd4\xf2\x8c\x54\xd5\x60\x64\x94\x86\x76\xb1\x38\x37\x9d\xac\xe7\x5c\x56\xc8\x52\x32\x95\xe7\x38\x36\x75\xcd\x1a\x64\x87\x21\x00\xd8\xa2\xaa\xc1\xb9\x03\xa5\x1a\x62\x93\xa5\xc6\x86\xa5\x04\x2a\x2d\xda\xb9\xd1\x30\xfb\x75\xa8\x83\x24\x13\x33\xc9\x2a\x58\x12\x45\x6d\x01\x83\xce\x59\x54\x12\xf4\x74\x08\x49\x49\x82\x2b\x28\x07\x94\x3a\x15\x96\x58\x29\xd0\x75\x6b\x7c\xda\xf5\xa0\x3c\x6a\xa0\xca\xfd\xec\xed\xc4\x94\xc3\x8d\xd7\x02\x23\xb6\x50\x99\x04\xa2\x9d\xae\x06\x36\xc8\x92\x63\x9b\x7b\x00\x30\xce\x78\x0d\x39\x8e\xd4\x0b\xab\xdc\xe0\x1b\xd3\xf4\x52\x01\x5d\xda\x85\x0b\x27\x30\xa8\xb3\x89\x52\x76\x93\x68\xb8\x4b\x1a\x5b\xad\xc6\xd8\xe4\x54\x56\xc8\x03\x31\x23\xc6\xe4\x1c\xc4\x00\x37\x13\x1a\x67\xc0\x3c\x9e\x12\x97\x53\x2b\xe8\x42\x92\xb1\x5e\x32\x3f\xe9\x99\x81\xd6\x20\x3c\xd8\x2a\xb3\x15\x32\xf9\x8c\x4e\x8a\xdb\xd0\xab\x71\x68\x91\xee\x46\x2c\x70\x55\xf5\xb2\x8a\x56\x4d\xae\x6f\xfd\x98\xfa\x62\x33\xea\x47\x02\x63\x85\x26\x97\xe0\x1a\xea\x32\xb5\x83\x5b\xea\xd6\xc7\xa2\x25\x2b\x0b\xa4\xb3\x9a\x06\xd4\x86\x26\x63\xd3\xd8\x3e\x35\xb5\x30\x1a\x96\x49\x3b\x2b\xcb\x52\x0a\x2f\xe3\x0a\xb9\x52\xa6\x6c\x6b\xf0\x50\xcf\x6e\x1a\x46\x99\xda\x49\x8f\x26\xe8\xd9\x2c\xdc\x44\x4d\xbb\x52\xb0\xae\x0c\xf0\x6d\x10\x98\x0d\xb6\x4f\x41\xaf\x22\xc7\x25\x52\x32\x00\xc3\x58\xe8\xd4\xce\xd0\x57\xc2\xb2\xcc\x6b\x6b\x44\x5b\x27\xaa\x48\x95\x5a\xd4\xd7\x95\x19\xda\xb0\xf8\x86\x27\x49\xcb\x1a\x2b\x42\x47\x5f\x61\xb2\x20\xe8\x11\x4f\x73\x5b\x57\x21\x62\x51\x18\x1a\x7d\x96\x51\x75\x95\xed\x7c\xdf\x57\x66\x18\x96\x31\xbb\xc1\x41\xc3\xd7\x90\x5d\x20\x30\x53\x7b\x3b\x83\x6a\xb5\x0e\xd5\x38\xa3\x5c\x85\xa6\x99\xe3\x3c\xb0\x7e\xc2\x33\xae\x26\xaa\x8b\x9a\x32\x4c\x73\xa7\x24\x42\xb4\x5d\xc3\x9b\xe9\xc4\x06\x3a\x51\x68\x5a\x0c\x58\x41\x9e\x14\x50\x3b\x60\x50\xd3\x38\x1f\x40\x9e\xc4\x58\x0b\xd9\x87\x9a\xce\x8b\x19\x9c\xe9\xc6\xbc\x06\xbd\x1e\x95\xd6\x7a\x9e\xba\xa6\xe6\x34\x48\xdf\x01\x36\x55\x73\x56\xa8\x5a\xca\x84\x6b\xe3\x16\x01\x65\x5d\x28\xf4\x23\x9d\xda\x18\xdc\x3c\xae\x61\x45\xe1\x98\x4c\x80\x2a\x64\x31\x19\x43\x33\x91\x5e\xd4\x50\xe5\x99\xb5\x24\x59\x4c\x10\xe7\x84\x72\xe3\xf0\x10\xcc\x68\xb2\xee\x13\x5b\xc3\x0a\xc9\xe3\xe8\xdd\xcc\x4d\xae\xb9\x4e\xad\x86\xc0\x3b\x9a\x07\x31\x53\xdf\xf9\xb1\xd2\x95\x8c\xdc\xf7\xb0\x92\x24\x34\x66\x6c\xa5\x63\x2b\x84\x88\x0c\xd7\xaa\x91\x10\xf9\xac\xa7\xca\x8e\xb3\xd7\x55\x8f\x9b\x0a\xb5\x4d\xce\xc4\x30\x9f\xd9\x9c\x47\x68\xb9\xad\x26\x92\x24\x68\xb0\xd0\x6b\x04\xed\xc3\x58\x00\xa5\x1e\x15\x67\xea\xa1\x59\xbc\xf4\xb2\xcb\xcb\xcc\xfb\x49\x0c\xae\x99\x5c\x4d\x53\x2c\x28\x6a\xa7\x49\x56\x7e\xea\xfa\x76\x8d\x70\x39\xa5\x69\x76\xde\xe0\xc4\x60\xa3\x84\x75\x4d\x99\x51\x10\x3d\x0c\x72\x6e\x25\x6b\x07\xda\x01\x34\xd7\xb3\x8a\x03\xd2\x34\xea\x41\x50\xb1\x86\x64\xad\x6b\xa7\x23\xb6\x60\x0e\xae\x15\x19\xa9\xdc\x51\xdd\x33\xd4\x70\x65\xb4\x25\x46\x66\xdc\x4a\x0a\xdb\xe4\xbb\x10\x7d\x13\x54\xbb\x06\xbd\xae\x97\xdc\x62\x53\x4f\x2c\x70\xaa\x97\x52\xb4\x69\x1a\x53\xe9\x41\x30\x27\x65\x5f\xba\x3c\x02\xad\x9b\x45\x08\x20\x40\xab\x83\x5a\xe2\x1a\x99\xfc\x85\x0a\x96\x63\x46\xca\x0f\x80\xc2\x0c\x42\x0c\xd5\xc4\x89\x44\xbe\x6f\x6c\xa5\xa8\xa9\x92\x40\x52\xc7\xde\x83\xda\x47\xaf\x00\x5d\x81\xd8\xd2\x06\x5b\xe6\xd8\xd0\x10\x34\x86\x9a\x16\x90\x51\xe8\xec\xa8\x34\xf5\x60\x94\x4b\xbf\x50\x50\x0d\x05\x43\xd8\xcc\x2e\xc2\x7e\x69\x29\x5f\x43\x08\x83\x28\x27\x37\x19\xda\x07\x6d\x5a\x33\x93\x41\x4e\x82\xb5\x23\xaf\xa6\x9a\x73\xd7\x74\xbc\xd8\x25\xf7\xa3\xcf\x84\x4a\x1d\x22\x67\x74\x8d\xf3\xa2\x47\x65\x06\xbc\xaa\x16\x82\x78\x60\x66\x10\x0d\xab\x7d\x97\xeb\x69\xd2\x40\x0a\xdc\xca\xd8\xf8\x94\x82\x74\xc5\x4f\xd6\xd7\x8b\x69\xd7\xa8\x63\xad\x32\x9f\x28\x58\xfa\x11\x36\x30\x9b\xd6\xb9\xde\x98\x29\xd6\xb3\xe1\x8d\x4b\x15\xf5\x28\xb8\x38\xa8\x19\xcf\x73\x34\x65\x6c\x74\xe3\x57\x10\xce\x69\xaf\x71\xb5\xe8\xa0\x62\xc8\x7a\x4e\x8c\xe1\x1c\x13\xa9\xe3\x3c\x2e\x89\x99\xbe\x6e\x74\x2c\x83\xb9\x7d\xa7\x54\x55\x2f\x1a\x2b\x3b\xb6\x46\xc4\x57\x49\x52\x0b\x8b\xdb\x92\x45\x37\x17\xdb\x8c\x31\x17\xe7\x45\xaa\xfc\x30\x89\xc4\x07\x85\x68\xea\xfa\x89\xa8\xae\xef\x66\x6c\xad\x14\x6b\x88\x82\xb9\x5e\xa8\x45\x60\xb2\xd4\xe9\x32\xf6\xaa\x9e\xda\x29\x73\x33\xf8\x4e\x95\x29\xc8\x19\xa0\xbe\x66\x28\x06\xca\xf2\x90\x74\x85\x18\x58\xa3\xfa\x7e\x9e\x49\xc4\x92\xb0\x19\xf5\x36\x37\xcd\xb8\x34\x73\x8c\x04\xda\xa8\x13\xf4\x03\x0e\x52\xd5\x9d\x57\xc9\x54\x2a\x68\x16\x55\x5a\xfc\x5d\x05\x8f\x4d\xdd\xd7\x5b\xa1\xc2\x03\x8e\xbc\x1d\x9d\x23\x61\xc0\xa1\xd5\x19\xa9\xe1\x7f\xce\x3b\xdb\x67\xa4\x31\x64\xcd\xb0\x40\x18\xa0\xe2\x58\x95\x29\x49\x9a\x48\xbb\x46\x06\x66\x36\x68\x24\x7a\x11\xbc\x99\xd9\x38\x96\x28\x03\x48\x6c\x5a\x32\xe8\xac\xee\x51\xab\x60\x9d\x89\x09\x78\xb1\x55\x54\x4d\x5f\xe7\x50\xad\x71\xc0\x48\x06\xc0\xd4\x74\x21\xba\x20\x44\x5c\x74\x30\x68\xf6\x1c\x2d\x15\xb0\x40\x33\x93\x44\x21\x58\x69\x1c\x0a\x62\xca\xf4\x52\x64\xbd\x46\x28\x10\x90\xeb\xb9\x80\x5d\x95\x42\x99\x99\xa9\x5a\xe9\x02\x1e\x4b\x54\xaa\xd2\x82\x27\x34\xa5\x3c\xf7\x35\xcb\x31\xb9\xc1\x2d\x91\x3a\xbd\x06\x8d\x52\x2a\x37\x3d\x97\xd1\xc8\xda\x2a\x82\x50\xcf\x42\xb0\x5a\x5a\x91\xe7\xce\x84\xd2\x2e\x6d\x4b\x31\x0f\x5a\xc8\xd4\x8d\xf3\x34\x25\xbf\x06\xbd\xae\x81\xe2\xb6\x97\x7d\x1f\x03\x83\x23\x2b\x63\x1a\x4c\xcc\x8d\x6c\x9b\x31\x55\xa4\xf2\xa2\xbd\x9d\x5a\xd9\x98\x7b\xc5\x7c\x3f\xea\x25\xae\x51\xbc\x35\xb5\x15\x53\xfd\x38\x49\x55\xa4\xe3\xd6\xb3\x31\x89\x48\x15\x68\x6a\x01\x86\x06\x0e\xba\x37\xd9\xcc\xa9\xaf\xe8\x80\xaa\xd8\x30\x12\xd6\x20\x73\xd8\x8e\xfd\xcc\xda\x94\x84\x57\x94\x8c\x7e\x71\x98\x2f\xb4\xee\x32\xb7\x02\xc0\x9a\xbb\x6e\x80\xda\x41\x69\x1b\x5e\x0d\xb3\x53\x61\x8d\x9c\x18\x5b\x6c\x19\x85\x1e\xc9\xac\xa6\x60\x54\xe3\x32\x22\x11\xb2\x36\x52\x80\x1c\xd4\xca\xa9\xa1\xab\x58\xb3\x40\x1b\xb4\x26\x9c\x28\x13\xd7\xb0\xa2\x57\x41\x94\x66\x26\x4b\x1c\xa8\x8f\x44\x70\x34\xf7\xb9\x6a\x17\xd9\x45\xd2\x2a\xd7\x0b\xd4\x66\xda\x01\xd9\xb4\xbe\x6b\x6c\x2f\xbd\x58\xa3\x16\x0b\xa1\x1e\x01\x3d\xb7\x6c\x9e\x43\x14\x25\x12\x62\x69\xca\x8a\x16\xda\xd4\x4d\x58\x4a\x90\xa0\x9f\x64\xa2\xb1\x11\xfd\x38\x0c\x7d\x59\xa5\x14\x79\x1c\x20\x4e\xb0\x65\x1d\x1f\xd4\xb4\xe8\x7a\x99\xdc\x40\x32\x14\x8d\x36\x93\x5f\x26\x23\x98\x0b\x6d\xd0\xac\x06\x13\x9f\x87\xc0\x5d\xb7\xc6\x5c\x28\x94\xb0\x07\x0b\x1c\x54\x1b\xc2\xe4\xda\x85\x77\xd1\x7b\x3d\x45\x3a\x46\x29\x0c\x44\x25\x51\x4a\x3b\x2c\xe4\x14\xbb\x6a\xd4\x6e\x95\x8b\x78\xb2\xd5\x7d\xe4\x4b\x55\x0d\x92\x6a\xe6\x08\x25\x8a\x2f\xcb\x3c\xca\x6c\xc7\x6a\x30\x75\x01\x63\xd0\x2e\x27\x1a\xb8\x9d\x35\x1e\xe7\x6e\x0d\xea\xe0\x82\xac\x87\x50\xaa\xc5\x03\x5b\x8b\xd8\x79\x7f\x7b\x7c\xe0\x5b\x49\x90\xe4\xbe\x2a\x93\xac\xa0\x5f\x9a\x6e\x9c\x8d\x6b\x08\xe7\xa6\x5d\x43\x2c\x1e\x54\x6d\x2a\xc3\xfa\x38\xb7\xce\x4d\x85\x4c\x43\xe4\x63\xc0\xac\x08\xd3\x2d\xb2\xe9\xfa\xa5\x4e\x5d\x1f\xc3\x34\xe8\x19\x2e\xa3\xc3\x6b\x88\x3f\xcc\x76\x43\x5b\x49\xbe\xd0\x49\x94\x9e\x42\xae\x60\x25\x1b\x4e\x86\xde\x8e\xb3\x45\xcd\x82\xa9\x85\x83\x80\x15\x69\xfc\x88\x6d\x45\x49\x5e\x23\xbe\xc0\xdd\x58\x6b\xdf\x10\xad\x30\x9e\x5d\xaf\x11\x01\x65\x49\x9d\x9d\xc7\xbe\x76\x5e\xd4\x7a\x0a\x06\x95\x54\xab\x89\xcc\x62\xe1\x43\x64\x6b\x5c\x69\x89\xcc\x77\x8d\x10\x51\x55\xd9\x90\xa1\xf7\x8b\x75\xa6\xf3\x53\x37\x89\x06\xb6\x23\xb6\x43\xd5\x35\xdc\xc9\x84\x9d\xae\x01\xeb\xab\x2c\xd6\xf0\xa9\x1a\x4e\xda\x96\xd2\x48\xe4\x67\x3d\x5a\x22\x7b\xa3\x4b\x19\x75\x9e\x10\x05\xa6\x12\x06\x78\xc1\x6c\xc4\x9e\x45\x67\x8b\x71\xc3\xb8\x46\x75\x1c\xe7\x73\x15\xaa\x6e\x46\x64\x8c\x0a\x0e\xa0\xc3\x63\x45\xc6\x8c\x11\x72\x16\xf8\xc2\x43\x96\xa9\x99\xf8\xe0\x60\xa7\xeb\xd8\x08\xc2\xd7\x20\x73\x49\xb5\x63\xe4\x0b\xa9\x6d\x4f\x58\xcd\xe7\x2a\x99\x4e\xe8\x52\x11\x83\xa7\xaa\xe5\x96\xba\x8e\x47\xad\x4d\x5c\xe6\xca\xf2\xae\xa7\x62\x8d\xab\xd4\x5d\xc9\x86\x8a\x39\x4e\x36\x41\x22\x6a\x9c\x5c\x6d\x63\x01\xaa\x37\xd4\x02\x32\xa4\x0e\x2e\x04\x76\x51\x95\x3e\x8e\xa6\xc7\x89\xac\x51\xdf\x4c\x7d\x8b\x91\x1d\xab\xd2\x8d\x55\x1e\x3d\xac\xba\x3a\x16\x96\x17\xeb\x55\xef\xba\x69\x98\x33\x87\xd6\xbb\x0e\x04\xb0\xdc\xfe\x55\x4f\x6c\x8d\x14\x17\x0b\xb0\x08\x4c\x97\x69\x52\x8c\xf7\x75\x8c\xb4\x5d\x96\xa9\xcc\x1c\x8d\x85\x2f\x16\x7b\x86\x31\xc0\xb9\xd2\x23\x51\x0c\x8d\x70\xf0\x79\x0d\x21\x4c\xf6\x53\xad\x99\x1e\xfb\xa6\xd1\x0c\x93\x8e\x2f\x9e\x20\x3b\xa6\xc5\x41\xdb\x33\x83\x5d\xa1\x39\x05\x35\xb3\x3a\xd7\x35\xc2\xf3\x9c\xd7\x60\x02\x82\x37\x53\x62\x6c\xc8\x1d\x9e\x1d\x41\xa6\x2a\x94\xb4\x00\x00\xcc\x98\x6d\x8a\x37\xa1\xa6\x7c\xc9\x75\x63\x4a\x4f\x0c\x73\xb8\xef\xd6\x38\x2f\x7a\xbf\x80\x51\x76\x08\x2f\x22\x42\x5d\xfc\xc2\x73\x28\xbe\x69\xe8\x50\x83\x4e\x2c\x13\x72\x06\xd6\x80\x55\x8c\xdb\xa9\x0e\xfd\xb2\xb0\x35\x04\x8f\x52\x72\x13\x3b\x3c\x92\x7a\x88\x85\xb4\x9e\x13\xc9\x50\xe7\x7c\x5d\x66\x44\x2a\x33\xa3\xa4\x1b\xa8\x85\xcb\xc6\x1a\x1e\xcb\x40\xc5\x1a\x4c\xc0\xf6\x93\xa5\x6a\x70\xc6\x99\x01\x57\x71\xe1\x84\x14\x3e\x95\x19\xb4\x53\x5a\x20\x6e\xa4\x24\x2d\x25\x86\x04\x67\x1c\x11\xf5\x4c\xcd\x1a\xdf\x08\x0f\x6d\x45\x67\x3f\x42\xef\xf0\x9c\x38\x9e\x40\x96\x76\x6c\x2b\x38\x89\x32\x95\x52\x08\x90\x58\x94\xb9\x9a\xd3\x40\xa9\xee\xbb\xc4\xd6\xf0\xa9\xa0\x64\xdf\x1a\x0e\x6b\xc9\x79\x72\x6c\x71\xca\xe6\x11\x95\x09\x57\x6a\x1c\xc7\xde\x0f\x0d\x1a\x71\xef\x54\x28\x10\x07\xd7\xd6\x3d\x43\x77\x11\x3c\x36\xd5\x75\x68\x85\x0a\x0f\xbd\x74\xbd\x71\x01\x8d\xb0\x5d\x80\xe3\xcb\xbc\x24\x59\xd7\xdd\xc0\x90\xb2\x0d\x1c\x6d\x6c\x49\x07\xb9\x0c\xa9\x80\xa1\x72\x29\x1b\xbf\xc6\x65\x12\x32\xe0\x31\xdb\xda\x82\xda\x20\x57\xcd\x44\x4d\x95\xa4\x73\x69\x17\x36\x1a\x2c\x6d\x72\xa3\x24\xba\x72\x52\x4c\x08\x48\x3f\xf5\xf5\x1a\xb9\x52\x26\x91\x14\x72\xd1\x9e\xb1\x90\x1c\xac\xc6\xb4\xd8\x2e\xa8\xae\x93\x2d\x00\xb5\xf2\xac\xed\x75\x23\xcb\x28\x3a\xb1\x70\xb3\x8c\x28\x88\x35\x0a\xa2\x23\x48\x2a\x95\x76\xb1\x85\xda\xaa\x85\x75\x95\xfa\xba\x41\xda\x0b\x88\xbb\x79\x74\x5a\x4d\xcc\xca\xa1\x9e\x3a\x2d\x42\x89\xf5\x12\x57\x71\x7f\x50\xe7\x0a\x39\xd3\x8d\x5d\x1a\x74\x2c\x7c\x6a\x5a\x3e\xf5\x0a\x76\x49\x05\x1e\x16\xe4\x25\x86\xb1\xee\x15\x5d\x42\xd7\x97\x36\x87\x55\x3e\x6d\xb3\x54\x4e\x60\x73\xfb\x69\x3a\xd5\x75\x44\x66\x6e\xe6\xc4\xea\x69\xf6\x6d\xf4\x8a\x8b\x7e\x22\x32\x7b\xd2\x6b\x68\x43\x91\x4a\x54\xed\x1a\x2b\x02\x15\xae\xa9\xc6\x71\x11\x43\xc7\x38\xa1\x3e\xd0\xbe\xe4\x69\x0e\xd0\x61\x52\xe8\xec\x51\xf0\xa0\xae\x4b\xeb\x28\xcd\x0b\x61\xb5\x5e\xa3\xf2\x27\x34\x53\xca\x88\x09\x66\x66\x3a\xf6\x43\x01\x15\x20\x2c\x1b\x4a\x2c\x35\x65\x22\x82\xb0\xb6\x8a\x01\xa7\x60\xdb\xba\x6f\x33\x54\x7c\x0d\xf7\xd7\xca\x11\x68\x47\x61\x18\x97\xba\xad\xc6\xb6\x75\x16\xf3\x89\x83\x6a\x5c\xf8\xe8\xf5\x58\x77\x13\xcf\x1e\xcf\xae\x6e\xda\x50\x14\x02\xe3\x1a\x5d\x12\x0c\x69\xfa\xca\x72\xb1\x78\xd4\x0c\x4b\x6a\x05\xac\x33\x5b\x7a\x4f\xdb\x51\x48\x36\xd6\x06\x91\x3a\x4c\x5d\xa8\x27\xc6\x54\x89\x5d\x8e\x2b\x84\x45\xb4\x51\x42\x5a\xdc\x75\xc5\x66\x2f\x8a\x6a\xc2\xc2\x90\xa1\x59\x2b\x50\xd2\xb0\x68\xd0\xcb\x56\x75\xa8\x35\x5d\x55\xd7\x9e\x23\x91\xd6\xc8\x3a\xd0\x9c\x21\x1e\x5d\xa3\x21\x42\x5d\x5f\x23\xce\x16\x63\x7a\xae\x30\x51\xa0\x27\xa3\xa0\x23\xb4\x03\xe7\x04\x24\x40\x5c\xa5\x01\x63\xab\x64\x60\x96\xc1\x35\x72\x58\x18\xc4\xa8\xf3\x06\x40\x35\x75\x74\x9a\x32\x1a\x5b\xef\xe7\x28\x47\xc9\x66\x94\x7a\x01\xd2\xa4\x9a\x89\x2c\xbd\x6e\x57\xc8\xe4\xb3\x3a\x18\x0f\xb2\xcf\x9d\xf6\xbe\x9b\x61\x6e\x82\xc5\x60\x09\x93\xb1\x98\x94\xc5\xcc\xd5\x5c\x03\x30\xc4\x00\x47\x59\x2d\x66\xea\x1c\x5f\x63\x5f\x70\x2f\xc7\x81\xe9\x38\x0f\x64\x46\x9a\x02\x30\xd5\x8d\xf2\x3d\xea\xeb\xa9\x83\x1c\x0e\xd9\xe0\xbe\x5d\x9a\xca\x17\x5f\xe1\x12\x6d\xe3\xd7\xa8\x08\x9b\x3a\x33\x58\x49\x53\x2b\x16\xd6\x90\x10\x35\xa8\x19\x9e\xff\x27\x48\x69\x32\x45\x80\x49\xc1\x45\x05\xb8\x53\x8a\xf7\x59\xc4\x36\xae\x11\xb4\x8f\x88\x67\x2e\xb8\x22\xd2\x0c\x21\xe7\x3a\xa6\x6e\x51\x5d\x89\x4a\x1a\xb1\x94\x26\x77\x99\xcd\x12\x2f\x0c\x36\x13\x05\xa0\x4d\xb0\x5d\x23\x33\x57\x68\x43\x80\xa6\x08\xcf\x4b\x72\x0d\x81\xa9\x9f\x16\xe9\x60\x8a\xfd\x02\x53\x8e\x45\x33\x36\x31\x69\xa9\xd1\xdc\xf4\x55\x60\x60\x8d\x8e\x54\x14\x22\x2b\x02\xad\xd3\x88\xf5\x94\xeb\x0a\xb6\xb2\xb8\x08\xca\xe0\x4a\xdb\x2c\x94\xd1\xda\x74\x6a\x89\xb9\xb7\x76\x2a\x58\xf6\xad\x62\x6b\x94\xa8\x7b\xd4\xd7\x99\x4d\x56\x4b\x90\x16\xd9\x27\xa5\x15\x42\xd5\x6c\x4b\x92\xf3\xa4\x7a\x8f\x48\x18\x12\x1d\xe6\x85\x69\x47\xe8\x90\x96\x6e\x8d\xaa\x49\xbe\x58\x38\x2c\x7d\x98\x48\xad\xba\x2a\x9b\xba\xd4\x8c\x76\x72\x8a\xa0\x19\xdb\x61\x82\x23\x06\x8d\x5c\x26\x68\x9a\x04\x27\xe8\xb1\x18\xd7\xe8\xce\xd5\x8d\x44\x92\xa9\x48\x1f\xc7\xa9\x6b\xac\x1a\xc5\xc8\x70\xdd\x42\xc7\x81\x96\x26\xc7\x91\x2e\x49\xcd\x88\x45\x1f\x67\xe2\x98\x4f\x74\x0d\xf9\xbe\xa4\x5c\xaa\x36\xf3\xb6\x6d\x8a\x8b\x93\x19\xbd\xa8\xc8\x90\x82\x1b\x9c\xc4\xc1\xeb\x99\x64\x80\xe0\x40\x3a\xdc\xd9\x36\xd2\x40\xd6\x48\x2e\x51\xe7\xa8\xcc\xb5\x49\x93\xe8\x52\x4f\x22\x18\x6a\xd1\x34\xae\x49\xbe\x25\x60\x48\xb5\xe1\x24\x57\x51\x80\x4a\x4f\x9c\xc8\xb1\x1b\x67\xba\x46\x0f\x8f\x8c\x96\x49\x50\x02\xb0\x21\x21\xaa\xb6\x83\x0d\x23\x6a\xea\x5b\xdf\xcc\x91\x40\xd2\xc5\xca\x33\x48\x05\x58\x4c\x6e\xdb\xc4\x6b\xb1\x4a\xb7\x9d\x89\xcd\x9d\x0e\xa6\xb6\xcd\xa4\x60\x9a\x2c\xea\x27\x8b\x92\x44\x05\x50\xde\x76\x76\x9a\xdb\xa5\x35\x63\x8e\xbe\x9d\x64\x08\x3d\x40\xdd\x1a\x75\x69\x43\x37\x0f\x86\x90\x16\xe3\xa6\xf2\x82\x0e\xb2\x86\xa6\xa8\x46\x43\x50\x4c\xc9\x48\xba\x9e\x48\x19\x41\xcd\x69\xe7\x4d\xa5\x9a\x6a\x95\x0b\x9a\x28\xf7\x5a\xb1\x4a\x2a\x8c\x94\x37\x7a\x98\x7d\x47\xc0\xdc\xce\xca\x02\xc7\xab\x88\xd8\xc0\x40\x90\x69\xa4\x03\x48\xb2\xe9\xdb\x09\xac\x92\x50\x69\x8b\x37\x08\x6b\x67\xa2\x5e\x78\x57\x9a\xd4\xa6\x9e\xd0\x89\x98\x2e\xb6\xb6\x21\xed\x2c\x21\x66\x5a\xcd\x1a\x51\xd7\x44\xc2\xd7\xa8\xbe\xa7\xbd\x70\xbc\xa9\x9c\x45\xca\x11\x07\x31\xf7\xf5\x62\x6a\x91\x79\x57\x39\xce\x6c\x9f\x17\x1f\x4c\xa2\x63\x54\xd2\x86\x41\x25\x5c\xf1\x35\xce\x4e\x29\xe0\x5c\x59\x04\xd3\xd0\xc0\x68\x28\xb0\x04\x61\x54\x52\xce\x8a\xc8\xe8\x5b\x68\xa7\x3e\x94\x9c\x00\x94\x53\xcb\x73\x53\x85\x55\xba\xb6\x21\x08\x97\xb6\x1a\xad\xe9\x26\x3a\x62\xaf\xc6\xa1\x5b\x28\x35\x4b\x24\xb9\xa6\xd0\xc3\x0a\x8d\x51\x06\xda\xd0\xc9\xcc\xb8\x1a\xa0\x04\xe0\x2e\x82\xc7\xa6\x7a\x27\xaf\x20\x78\x14\xdf\x2d\xd3\x80\x40\xe7\x49\xa4\x9d\x62\xa1\xe1\x99\xf3\xc1\xd8\xc0\xa9\x69\x32\x70\x52\x64\xb6\x90\xa9\x2b\x2c\x0e\x55\x3b\x49\xbd\xc6\x12\x0e\x40\xea\x96\xab\x76\xe4\x0e\xc4\x81\x99\xb6\x41\xcb\xd8\x27\xe8\xea\x08\xa3\x8e\xdc\xf4\x99\x14\x34\xa5\x6c\x95\xe4\xbc\xa3\x6e\x5c\xa3\x54\x88\x16\xda\x4d\x6c\xa2\xb0\x47\xda\x80\x9a\x38\x31\x87\x82\xe5\x40\x5c\x37\xce\xd5\x80\x99\xd1\x0b\x77\x59\xf0\x56\x93\xb1\x49\xdd\xb8\x4a\x03\x57\x63\x86\x39\x69\x3f\xce\x56\xe6\x19\x16\x4d\xe6\x8e\xa4\x32\x03\x19\x3b\x2c\x39\xf0\x8e\xfa\x41\x23\xa3\x51\xeb\x88\x55\x89\xb7\xed\x1a\x8e\x47\x3a\x9a\x46\x96\x15\x2f\x51\xd2\x8e\x52\x92\x17\x61\xe4\xb2\x14\x34\x53\x03\xa4\xee\x9c\x69\xea\x31\x70\x36\x4d\x63\xc3\x9b\x2c\xaa\x35\x24\x28\xaa\xc3\xdc\x6b\xa1\x26\x16\x24\xa8\xeb\x50\x06\x22\x6c\x52\x18\x9b\xd2\x45\x5b\x19\xe1\x07\x09\xaa\x21\x22\x1d\x6b\x26\x20\xe1\xab\xdc\x2b\x4d\x29\xda\x05\x36\x93\x67\xbd\x9b\x93\x24\xa8\x46\x6c\xb4\xd5\xd8\x0d\x0a\xb2\xe2\x4c\x1a\x07\x31\xe4\x8e\x7b\xd1\xe0\x28\x53\xd3\x6e\xa4\x65\xfe\x15\x83\xb3\x40\x07\xa0\x61\x8d\x50\x60\x26\xcf\x2d\xf0\x7d\x3b\xf9\x8c\x12\x6f\x16\x15\x06\x0b\x79\xcb\xa1\xa1\x23\x6a\x58\xec\x96\x54\x37\x62\x0d\x02\xe3\x1d\x02\xc4\x0f\x2c\xa9\xdb\x3d\x9c\x28\x83\xac\x82\xcc\xa1\x9d\xf3\x58\x49\x1e\x70\x83\xfd\xbc\x58\xcf\x79\x8f\x16\x51\x4b\xc1\xe8\x1a\xfb\x62\x62\xd8\x34\x60\xc4\xb6\xa3\x75\x6b\x12\x18\xed\x08\x75\x55\x13\x5d\x45\x30\x0f\x25\xf6\x3d\x1c\x42\x28\xda\xd6\xfd\x38\x8d\x6e\xc1\x60\x95\x1b\x9d\x45\x23\x37\x4a\xd1\x43\x21\x78\xf0\x00\x7b\x31\x72\x1d\x86\x38\xf0\x7e\xea\xc8\x98\x6c\xc7\xdd\x52\x57\x55\xe9\x69\x2b\xd1\x50\x95\x35\xca\x6f\xa5\xf6\xa8\x0c\xbc\x72\xb4\x13\x39\x6b\x31\x62\x5e\x85\x71\xe1\xc1\x1a\xd5\xf7\xf3\x28\x64\x4c\xcd\x24\x6b\x3e\xc3\xca\x34\x98\x2e\xab\x74\x49\x88\x0b\x09\x9c\xf3\x7a\x44\x1a\xeb\xff\xa9\xe2\xe0\x76\x9e\x06\xdb\x54\x0b\x9a\x7a\x54\x6a\x80\xdb\x1e\xd4\xc1\x84\x2c\x68\x8b\x95\x8b\xab\x5c\xef\x01\x52\xfb\xc5\x23\xe1\x2d\x99\xec\x62\x22\x47\x80\xd6\xb9\x6a\x79\x3f\x51\x6d\x71\xd3\x38\x22\x63\x5b\xb2\x67\x45\xe3\xd6\xcc\x74\x8d\x0a\x0f\xea\x97\x65\x10\x78\xc6\xad\xd4\xdc\xab\xd8\x57\x6d\xc5\xc2\xe2\x2c\x6f\xc6\x6a\x46\x06\x68\x30\xba\x65\x21\x85\x70\x96\xba\x01\x23\xb0\x42\xde\x98\x69\x4a\x07\x1a\x95\xe1\x79\xec\x83\xa8\xc6\x0e\x7b\x17\x6b\x62\x4b\xa3\x2d\x72\x15\x81\xbc\x6d\x49\x95\x84\x96\x5e\x54\x15\x04\xb1\x5b\x83\xcc\x39\x2b\x46\x38\xc2\xde\xd6\x6e\x14\xca\x47\xc0\x30\xb1\xcd\xd8\x22\xef\x17\x37\x05\x3c\x11\xba\x2c\xb3\xeb\xbd\xd3\x1a\x60\x36\x2f\x71\x8d\x36\x6f\x5d\x56\x12\x2e\x29\x5b\x5d\x5b\x1d\x32\xe2\x58\x8a\xaa\x0b\x91\x8f\x4e\xb2\x2a\x3a\x5e\x21\x8a\x50\x0a\x3c\x0d\x12\x19\x89\x53\xbb\x46\xde\xb8\xa5\xb8\x54\xb1\x55\x6d\x3f\x05\x9e\x12\x23\xb1\x52\xc9\xf3\xd9\x55\x24\xd6\x8d\xed\x2d\xef\xfb\x21\xce\xb0\x77\x83\x17\x8d\x21\x26\xaf\x51\xf9\x23\x35\x34\x8b\x1c\x14\x0b\x56\x54\x35\x05\xcc\x25\xda\x0c\x79\x28\x66\x8a\xdc\x0f\x3d\xc6\xa3\xf2\xad\x24\xb8\x9f\xf8\x2c\x5d\x50\x6c\x0d\xf9\x7e\xe9\x70\xdb\xb9\x29\x8c\x80\x24\x35\xb9\x2e\x8f\xa9\x52\xc0\x68\x61\x8d\x65\xca\x49\xc3\x53\xe9\x59\xcf\xb8\x4d\x5d\xe6\x61\x36\x6b\xf8\x11\x3a\x42\xc3\x6c\x48\x33\x09\x65\x5e\x5a\x99\x38\x9e\xe3\x38\x55\x5a\x77\x0e\xea\x65\x0c\xc4\x51\x3d\x6a\x3a\x4b\x9a\x15\xe7\x64\x00\x6b\x34\x21\xa4\x85\x7a\x1b\x98\x8f\xc8\x4f\xb5\x6e\x69\x82\xa0\x4f\x1c\x95\xb1\x2d\x3a\xa0\x1c\x52\x9a\x7a\x2d\x96\x61\x56\x18\xd6\x44\xf3\x46\xb6\xab\x64\xaf\x07\x22\x89\x4d\x73\xb7\xf8\x02\xb4\x5b\xc4\x14\x2b\x22\xc2\xe8\x87\xc1\xc8\x58\xd5\xc9\x8d\x7a\xe2\x3c\x93\xd4\x4f\x13\x44\xb9\x5f\xa5\x8d\x2c\x4d\x56\x7a\x33\x77\x7e\x28\xc1\x8a\x49\x2c\x1c\xb4\xa0\x52\xb1\xcc\x03\xa7\x9e\x85\xb1\x1f\x86\x2e\x84\x69\xd2\xd2\x7b\xdd\x68\xb5\xc6\x95\x16\x46\x02\x25\xa6\x2e\xd8\xa7\xde\x35\xd0\x3a\xd9\xcb\x6e\x2e\x33\xea\x67\x8d\x31\x5e\x24\xb5\x84\x48\x58\x43\xdc\x4d\xb3\x6c\x90\x8f\x6b\xc8\x71\x54\x54\x78\x00\x98\xc0\x94\x60\xd3\x00\x21\xa0\xa6\x09\xb6\xb6\x6f\x6c\xe3\x17\x96\x07\x9e\x3a\x63\xdb\x9a\xcc\x4a\x2c\x70\x6c\x7d\x43\xd7\xe8\xed\x82\xba\x91\x2e\xd9\xf2\x2e\xe5\x21\x0a\xc3\x50\x9c\x99\x6d\xc0\xa2\x5b\x1b\x08\x0f\x22\xc8\x31\x5a\x48\xfa\x1a\x8e\x40\xd1\x32\xd7\xab\x88\xc5\x4c\x75\x6d\x96\x72\xec\x92\xab\x96\x30\x93\x41\xca\xc1\x0f\xa9\x65\xa6\x2f\xcb\xc0\xb0\xad\x27\x08\x17\x51\x01\xc6\x39\x74\xac\x56\xab\xb4\x1b\xa8\xab\x8e\xf6\x35\xd0\x68\x71\xf5\x62\x1a\x0f\xbc\xef\x78\xe2\x51\x74\xae\xd5\x19\xf2\x5e\x08\x5b\x0b\x52\x4d\x4b\xf0\xa2\x54\x15\x5b\x45\x6a\xd0\xa1\xf5\x18\x99\x81\x43\x3c\x26\x46\xba\x36\xe7\x61\x72\xcc\xa0\xd0\x45\xd6\xfa\x94\x95\xae\xe1\xdc\x79\xd7\x11\x1e\xe7\xd8\xf1\x6a\x8d\x88\x4f\x42\x3b\x93\x06\xcb\xa6\xd7\xbc\x9e\x4c\x88\x6e\x1a\x87\xa9\x97\x14\x13\xe9\x52\x05\x5b\x41\x01\x56\x64\x6c\x00\x69\x84\x22\x18\x6d\xe4\xd9\xef\x10\x3c\x36\xf1\x02\xd4\x2a\xaf\xb4\xa0\x62\xb8\xc9\xc6\xe2\x16\x2d\x85\xf1\x4c\x17\x33\x29\x09\x46\x9f\x5c\x40\x64\xc6\x6d\x40\x73\x69\x59\x33\xa0\x1c\x93\xed\x56\xb9\xc6\x11\x45\x46\xa4\x59\xb8\x47\x5a\x4f\x32\xd0\x28\xdb\xb6\x4a\xb5\x74\x1e\xaa\x3a\x06\x82\x1c\xb4\xa2\x53\xc9\x99\x1e\xce\xa5\xd1\x35\x58\xa3\xcc\x72\x14\x30\xdc\x1e\x26\xca\xe4\x5b\x40\x3a\x17\xc0\xd0\x0a\xbb\x44\x06\xa1\xab\x06\x1e\x1a\x22\x21\xcb\x83\x9f\x47\x66\x5c\x25\xe1\x0c\xd6\x70\x7f\x08\xcd\xba\x40\x19\xab\xbe\xe9\x07\x03\x87\xdb\xa3\x40\x8b\xe6\x18\xda\x11\x4a\xc2\xdb\xc9\x46\x35\xd0\xa1\x30\xd0\xc6\x01\x61\x87\xfd\x1a\x73\x81\x32\x9c\x21\x40\x75\xf6\xc6\x54\xb6\xd6\xa5\x83\x92\xce\x6e\xce\xd8\xf9\x7a\xa8\xe6\x5e\xd0\x41\xb2\xba\xa8\x4c\xa5\x6f\x46\xc6\xd7\x20\x30\x8c\x56\x42\x30\x86\x65\xaf\x16\xbd\xcc\x56\x8d\x83\xb0\xbd\x85\xb2\x4f\xa9\xca\x46\x2d\x1d\x98\xdc\xd0\xd7\xd5\x34\x2d\x73\x56\x63\x0d\xba\x35\x6e\xab\xd5\x28\xd5\xb0\x33\xd9\x49\xde\x2f\xa5\x86\x83\x68\x98\xf7\xae\x0b\xad\xaf\x2b\x10\x68\x3d\x10\x5a\x26\x19\x7c\xc0\xfd\xac\xe3\x20\xd9\x1a\xa2\x60\x37\x39\x62\x4c\xd5\x0c\x1e\x20\x62\xe5\x50\xc1\x05\x10\x30\xaa\x99\x2b\x5b\x89\xa1\xe9\x3c\x68\x8c\x80\xf3\x44\x0d\xd1\x33\x93\x79\x8d\x9b\xbe\x74\x0e\x4c\x35\x95\xab\x33\x23\x53\x58\x98\x1c\xc6\x30\x30\x1e\xc8\xc8\x4a\x58\xe8\x08\x19\xc1\x42\x6a\x3e\x17\x63\x73\x3f\xc3\x50\xad\xd2\x21\x3a\xa5\x66\xea\x03\x56\x25\x0b\xe2\xa5\x99\x31\x19\xac\x8b\xfd\x3c\x1b\x36\x8b\xa5\x54\x19\xca\x3e\x06\x0e\x0b\x0b\x83\x60\xcd\x52\xd6\x10\xc2\x28\x1c\x06\x83\x88\x23\xdd\xd4\xdb\x18\x42\x0f\x05\x6e\x75\x30\xb2\x77\x1d\xeb\x10\x57\xa2\x31\x58\xf4\xac\x66\x33\x5c\x8c\xaf\x98\xf6\x6b\x04\x67\xb5\x66\x0b\x09\xa8\x9d\x2b\x65\x0a\x34\x14\x64\xda\xcc\xd3\xd4\x4f\x99\x06\x01\x26\xe2\x1a\x66\x7a\x6d\xea\x2e\x0c\x03\x6c\x05\x54\x6b\x74\x06\x60\x13\x0d\xa1\xf7\x10\xf7\x13\x69\x1d\xb5\xa5\x86\x8b\xd1\x75\x1f\x2a\x3d\x4c\xa9\x6a\x26\x25\x6d\x6a\x66\x18\xa5\xe8\x73\x17\x67\x19\xbb\x35\xf6\x45\xbf\x30\x34\x39\x01\x70\xaa\x74\x18\xbb\x58\xf1\x5a\x59\x32\xc2\xaa\x89\x2d\x9f\xac\x2d\xa0\x16\x59\x15\x28\x95\x55\x95\x55\x81\xf2\x55\xfa\x13\x94\xaa\x22\xad\x89\xed\xed\x54\x52\x76\xc9\x8e\x4c\xf8\xa1\x88\x12\x89\xf4\xf3\x10\x62\xb7\xb0\x0c\x5a\x01\x73\x57\xf4\x24\xb1\xce\x6b\x84\x88\x55\xcf\x96\x19\x55\x82\x56\x63\x14\xf3\x10\x78\xd6\x0a\x37\x0d\x0a\x11\x87\x89\xc6\x71\xec\x24\x00\x8d\x24\x00\xa5\x34\x05\x81\x6c\xbb\x46\x4b\x5d\x92\xc2\x54\xa4\x66\x70\xae\xe9\x3c\xb8\xba\x10\x3a\xc1\xd0\x01\x8d\x23\xe2\x13\x5d\x1a\xcc\x17\x3f\xa6\x26\x69\xa4\xa6\xa0\x83\xcc\x6b\xd4\xa5\xc9\x28\x2c\xe3\x7d\xea\x0a\x09\xd9\x76\x56\xcf\x8a\x12\x07\x68\x27\x6c\x07\x86\xec\xaa\xaa\xaa\xa6\x36\xcf\x53\xce\xc6\xf7\x15\xd4\xdd\x1a\xd4\x61\xea\xd9\xc8\x6b\xc8\x98\xa4\x8b\xe0\x3e\x55\x6d\x65\x46\x49\x86\x0c\xa8\x57\x81\x49\xbe\x70\x07\xbb\x05\x15\xc1\x2b\x84\xe9\xe0\x57\x69\x36\xe7\xfb\x6c\xb4\xce\xb6\x19\xaa\x7e\xf2\x35\x52\x60\x86\xdd\x18\x2b\x37\x21\x03\x7c\xdd\xf0\x0e\x27\x44\x97\x26\x01\x90\x33\xce\x01\xac\x51\x10\xcd\x1c\x9c\x03\x59\x8c\x68\x32\x02\xce\x00\x32\x4e\x56\xc2\xa6\xed\x4c\x00\xc1\x8b\xa6\x78\x49\xca\xe4\xc3\x82\x95\xc2\x02\x55\x2d\x5b\xe3\x3a\x20\x45\xb3\xc6\xbd\x9b\x06\xd8\x35\xfd\x22\x51\x9f\x11\x0c\x55\x20\x0d\x90\xbd\xcc\x9d\x51\x46\xe9\x52\x2a\x41\xea\xd2\x76\x83\x58\x60\xd4\x6b\xd4\xb1\xda\xaa\x23\xd9\xd1\xd9\xc5\x58\xe2\x04\x2c\x44\x73\x71\x51\xd7\x05\xa4\xd0\x77\xd6\xe2\x01\x44\x01\xaa\x90\x7b\xac\x22\xad\x53\xbd\x4a\x3b\x72\x64\xa5\x45\x20\xf4\x03\x9b\xa8\xa4\x31\x73\xef\xa2\xeb\x9b\x86\x7a\x0a\xa1\xaf\x48\xd1\xda\x99\xbc\xdc\xce\xb7\xb9\x0b\xbd\xf0\xab\x74\x61\x72\x4a\x68\x3d\x2c\x6a\x54\x65\x69\x02\x45\xcd\xa4\x48\x32\x2a\x08\xeb\xda\x05\x8b\x69\x06\x83\x6c\x1a\xc2\xac\xee\xc6\xcc\xd4\x34\xaf\x71\xc5\x9e\x0d\x90\xaa\x4e\x90\x20\x02\x5d\x86\x86\x2f\xe3\xe8\xa3\xc9\x73\x85\x5d\x6b\x27\xd3\xb6\xdd\x74\x7b\x84\x43\xbd\x4f\xb6\xca\xb3\x67\xc5\xaf\x51\x7f\x34\xf7\x0b\xce\x3c\xe3\xd9\x94\x6e\x5e\x9a\xd1\x74\x60\xa9\x71\x50\x35\xad\x1b\x59\x51\xef\x7b\x62\x34\x4e\x1a\x43\x54\x8a\xca\x49\xaf\x52\xc7\xba\x00\x19\x4b\x71\x71\x28\x65\xe4\xc1\x23\x92\xdc\x18\xa1\xe6\x6a\xd0\x52\x36\x1c\xb1\xa6\x1b\x0b\xd4\x92\xb9\x58\x8f\x13\x60\x7c\x0d\x39\x8e\xca\x31\xc2\x9a\x28\xc3\x74\x8a\x23\x68\x4c\xa7\xdb\x01\xea\xc8\x6c\x8f\x40\x33\x0f\xc6\x25\xc6\x17\xe2\x6d\xa1\x40\x29\xd4\xbb\xb1\x5b\x43\xf0\x68\x46\x51\xc6\xb9\x63\x75\x6a\x69\x4d\xf5\x32\x91\xc6\xf3\xd1\xaa\x32\x54\xbd\x6d\x5d\x1a\x82\x6b\x2b\xa6\x70\x0d\x7b\x3b\x66\x8e\x5d\xbb\x86\x10\xc6\x0a\xa5\x4a\x29\x68\xab\xa5\x78\x31\xd9\x6a\xa0\x63\x06\x94\x2f\x10\x78\x99\x0b\xef\x34\x37\x5c\x55\x0c\x08\x95\x9d\xef\x9c\x30\x6b\x48\x93\x3c\x0e\x9d\x1e\xa8\x85\x2a\x0c\x11\x34\x4b\x3d\xf0\x11\x48\x54\xc2\x78\x7b\x80\xc5\xe5\x62\x7b\x83\x66\xd8\xeb\x82\x53\x6a\x91\x5b\xc0\x72\x17\xc1\x63\x53\xef\x58\xaf\x50\xe1\xc1\x15\x9f\x12\xaf\x20\xae\x39\x0f\x2d\x43\xc8\x05\x28\x29\x4c\x84\xa6\x16\x85\xec\xc7\xce\xcd\x53\x37\x77\x3d\x80\x5d\xe3\x85\xea\xf9\x1a\xa1\x00\x29\x7c\x68\x70\x56\x3a\x54\xe3\x30\x83\x56\x61\x48\x40\x67\xb4\xf6\xb0\x14\xcb\x48\x8a\xd2\xf1\x69\x69\x85\xe9\x44\x62\x84\xa4\x35\xee\xe4\xb3\xce\x97\x2c\x2b\x15\x2a\x92\x65\xe4\x6d\x3b\x2a\xe5\xe4\x10\x2b\x22\x54\xc8\x32\x0a\xc3\x98\x61\x35\x42\x75\xed\xe7\x59\x2c\x89\x9b\x35\x32\x73\x75\xdf\xe9\x45\xd5\x23\x49\x16\xf4\x09\xb9\x96\x7a\xbc\x8c\xb8\xe2\xce\xdf\x4e\x21\x49\x1f\xb1\xe9\x3b\x1a\x6d\x2f\xfa\xe4\x50\x3d\x87\x35\xde\xcd\xd1\x4e\xd8\x71\x2a\xd2\x32\x1d\xab\xa5\xd7\x04\xc3\xd2\xd4\x90\xa8\x11\x81\x41\x8e\xd4\x98\xc2\x1b\x9f\xba\xbc\x90\xaa\x4b\x3d\x81\x60\x8d\x63\xce\xd4\xd2\x5b\xd8\x44\x58\x29\x51\x4a\x89\xd4\xb6\xcc\xd6\x4d\x90\x92\x01\x0a\x58\xe3\xb5\x05\x52\x56\xd0\xb5\x40\xb2\x84\x0c\x58\xa3\x44\x9d\x8d\x20\xe5\x0e\xf1\x45\x69\xa4\xb2\xac\xa0\x45\x59\x19\xb1\x48\x44\x11\xf2\xdd\xe4\x3c\x6c\x67\xd5\x8f\xfc\xf6\xa9\x08\x0b\xb2\xfd\x1a\xcf\x4c\x52\x5d\xb5\xb5\x73\x1a\x79\xbc\xe8\xa9\x68\xc6\xfa\x46\x62\x41\x18\x2e\x04\x60\xaf\x9c\xa4\x36\xb1\xa4\x9b\xa0\x8b\x45\x10\x65\xb9\x0a\x8d\x02\x09\x43\x96\xfb\x18\x75\x91\x19\x0d\xb5\x04\x73\x67\x39\x64\x43\xcb\x31\xef\x5c\x8b\xc7\x19\x1b\x0c\x27\x58\xd9\x66\x64\x6a\x24\x65\x8d\xdd\x29\x27\xd5\x71\x5f\x8d\x8b\x4e\x96\x67\xa9\x80\x0b\x53\x63\x81\x81\x4c\x61\x9a\x9a\x1a\x8c\x3c\x4f\x8b\x69\xdb\xb8\xb4\xb5\xf0\x7d\xbd\x46\xee\x83\x55\x5d\x88\x10\xe0\x8a\x12\xac\x38\x9d\xc8\xed\x5e\x2f\x58\x6e\xa6\x11\xe3\x41\xa9\x7e\xf0\xa6\x75\xb4\x33\xb6\x1b\xe6\xa1\xea\x75\x57\xd6\xd0\xfb\xe5\x12\xc9\x42\x5c\x0a\x88\xe9\x11\xb4\xd1\x40\x34\x20\x9a\x4c\xec\x2b\x4f\xa7\x5a\x28\x5d\xfa\x49\xe8\xc5\xc2\x54\x98\x52\xbd\xd0\x6b\x3c\x57\x6c\x18\xa3\xa9\x1f\x78\x40\x4b\x5b\x5a\xaf\x82\x31\xa9\x05\x5d\xb4\x6c\x9e\x44\x1a\x53\x67\x6a\x68\x6d\x5c\x6e\x8f\x94\x13\x1c\x13\xa9\xd6\xf8\x52\x8b\x5a\x62\xa7\x70\x5a\x84\xb6\x36\x2b\x4c\x0a\x67\xb5\xc4\x50\x88\x79\xc9\xba\x56\x73\x0a\x9d\x32\x02\xcf\x26\xe2\xa6\x1d\xa0\xa1\x6b\x50\x87\x8c\x99\xe8\x62\x5b\x66\xa6\x47\x3b\x26\x6f\x10\x0f\x9d\x73\x10\x10\x44\x7b\x86\x3b\x38\xc4\x5a\x14\x43\x46\xde\x06\x5f\x15\x53\xaf\xf1\xb4\x22\x83\xb9\xce\xc3\xac\x45\xd2\x6c\x6e\x7d\x1a\x43\x6f\x7a\x97\x60\x98\x96\xbe\x24\x85\x42\x20\x0a\xc5\xdc\xa2\x8a\x65\x04\x62\x10\x9d\x5e\xa3\x5e\xb1\xa1\x33\xef\x9c\x82\xd4\x20\x3c\xb3\xc2\x9c\x9b\xe1\x10\x2b\xa4\x8c\xe5\x1c\xd5\xae\x6d\x85\xe4\x81\x68\xa0\x2a\xcc\x40\x4c\x61\x5c\x41\x2c\x66\x5d\x1f\x89\xf2\x43\x34\x23\x40\x73\xcc\xae\x6b\x01\x0c\x19\xa8\x09\xe9\xa8\x44\xa7\xdc\xe0\x6d\x1b\xea\x38\xb5\x26\xa3\x26\xa2\x89\xad\x41\x6c\x63\x58\xb0\xae\x3a\x20\x11\x12\x83\x1f\x6a\x38\x14\x57\x64\x0d\x38\xf4\x0e\x37\xc9\x35\xb3\x57\xaa\x43\x0d\x2e\x82\x04\x6a\xf9\x92\xd7\xa8\x4b\xb3\x4a\xe5\xd6\xd5\x98\x4a\x18\x47\xd7\xb1\xd0\x0d\x12\x28\xd4\x9a\xa5\xe9\xa5\x92\x14\xcc\x4d\xe6\x39\xe2\x69\x6e\x19\x6a\x24\x99\x57\xa9\x6a\x20\x05\x0f\x2d\xe4\x8c\x78\x01\x6b\x6e\xc7\xdc\x28\x08\x4b\xaf\x95\x18\x9d\xc6\x2e\x94\xa9\x43\xd8\x4d\xb3\x61\xb8\xc7\x03\x68\xab\xb2\xc6\x09\x1e\x7c\xce\x63\xee\x89\xc6\xb8\xa8\xd4\x4b\x1c\xe1\x30\x8c\x9d\x60\x8a\x81\x7a\xca\x8d\x4f\x53\xae\x41\x94\x70\x82\xaa\xf3\x32\xc6\x55\xc4\x9f\x98\x54\x8d\x7b\x84\x23\xc2\x40\xcb\x92\xf0\x40\x27\x6e\x9c\xc2\xb5\x5a\xbc\x90\xb1\xf7\xb3\xe4\x28\x74\x4a\x08\xcb\x70\x87\x8c\x59\xa5\x16\x8b\x2d\xb0\x1d\xea\x9a\x0a\x20\x45\xdf\xf8\x44\x0d\x2b\xa2\x56\x68\x42\xbc\x9f\x3b\x32\x87\xa0\xd8\x24\x79\x67\xe2\x58\x8d\x60\x46\x7c\x0d\xc9\x3a\xba\x49\xd0\x06\x06\xac\xd0\x6c\xbc\xaf\x67\x93\x22\x00\xdd\x20\xec\xa2\x5a\x86\x3c\x9a\x49\x0b\xc7\xce\x0f\x51\x26\x6e\x73\xa1\x71\x85\xde\x2e\xcc\x37\x35\x1b\x40\x23\x44\x1a\x29\x9c\x5b\xe3\xda\x09\x58\xd9\x9b\xb2\xb4\x65\xf2\xbd\xa9\x58\xad\x98\xcf\x5a\x77\x4b\x37\x59\x22\xe8\x2a\x11\x5f\x43\xe7\x26\x33\x30\xc5\x26\x41\x0d\x88\x48\x9e\xe0\x45\xf8\xba\x17\xc9\xc3\x54\x35\x15\x10\x93\x9a\xdc\x32\x67\x5e\xc7\xcc\x75\x5c\xe5\x41\x89\x26\x26\xd7\x79\x8b\xc6\x5c\xc1\xc9\x35\xd5\x48\x6d\xbf\xf0\xd4\x2b\x84\x16\x58\xbb\xd2\x85\x71\x5a\x3c\x88\x95\x5a\x3a\xd1\x06\xc1\xc2\x1a\xbb\x93\xb7\x73\x8a\x22\xb1\x1e\xe4\xa5\x1a\xba\xa2\xc7\x59\xa0\xb6\x6d\x78\x32\x95\x9a\x7a\x5a\x2f\x9e\x75\x19\x04\x60\x07\x98\xc6\x85\x99\x55\x2e\xfa\x07\x55\xcd\x95\xe8\x84\xd5\x5c\x0e\xb3\x98\x00\x30\x8b\xab\x12\x8d\x3d\x6e\xb3\x19\xe4\x38\x65\x39\x0c\x43\x0a\xa6\xb1\x8d\x28\x6e\x59\xa3\x1d\x39\x73\x0d\x33\xc1\x8c\xa4\xc5\x10\x06\x2e\xaa\x82\x02\xd6\xb0\x8f\xac\xef\x04\xb6\x28\x8f\x2a\xcc\x63\xc2\x13\x61\x59\xf8\xd2\x10\xb1\xc6\x37\x42\x3d\xf3\xad\x55\x3d\x32\x23\xf4\xa2\x9e\x78\xac\x45\xc0\x33\xc5\x89\xc2\x65\xf0\x06\x4c\xfd\x22\xb3\xaa\x5c\x4e\xdd\xe2\x07\x65\xf1\x78\xd7\x67\x69\x4f\xfa\xc5\xd3\x8f\x7b\xd8\xc9\xdf\xfd\xc3\x19\x37\x1c\xbe\xc3\x5b\x28\xfb\xce\xaf\xbe\x7a\xd3\x96\xb7\xb6\x5b\x9f\xfb\xb7\x5b\xec\x75\xf0\xc1\x9f\xbd\xcf\x4b\x56\xa8\xf0\xe0\x09\x16\x1f\x85\x6c\x2b\x03\xb1\x34\xba\x1b\x23\x2a\x8d\x4c\xb1\x82\x33\x65\x4d\x33\xb3\x42\x5c\x15\x11\x9d\xeb\x61\x6a\x87\x9a\xfb\x35\x1c\x8f\x55\x23\x14\x16\x8d\xfd\x2c\xe4\x12\x66\x03\x78\x95\xcb\xe8\x7a\x10\xf1\xa0\x28\xcd\x36\xc6\x48\x6d\x97\xec\xe0\x66\xce\x50\x17\xd7\x68\x1e\xc5\x06\x12\x4c\xcc\xbd\xc7\x0c\x05\xe8\x55\x0f\x80\x11\x2a\x83\x8e\x62\x3b\x5b\x0e\x83\x9b\xfd\xd8\x08\x9b\xc2\xa2\x42\xdb\x3b\x5a\xd1\x35\xae\x2e\xf0\x4e\xd7\xa1\x49\x1e\x38\xa1\x43\xcb\x6d\xd7\x4f\x1e\x8d\x93\xf6\x4b\x04\xe3\xcc\x27\xef\x00\x4d\xb3\xd4\x9a\x48\xe2\x11\x83\xad\x5f\x23\x44\x1c\x32\x10\x1e\xc1\x20\x55\x8f\x8d\x41\x70\xe8\x6b\xc4\x1c\x25\x5e\x23\xae\x73\xbf\x04\x29\x8c\xb6\xb4\xa6\x5d\x3d\xd6\x63\xc3\x8c\x59\x23\x87\x8e\x64\xc1\x16\x41\x19\x1a\xa8\x07\xbf\x04\x85\x58\x5a\x5c\x95\xa3\x54\x04\xd7\x4b\xd3\x0c\x99\x7b\xa4\x5a\x68\x6a\xa7\xd5\xa8\x69\xbb\x46\x87\x99\x05\x49\xd6\x76\x46\xff\xff\x68\xfb\xd7\x17\x80\xbe\x7f\x2d\x10\x92\xc9\x91\x99\x68\x06\xc7\xe9\x4c\x49\x93\x19\x34\xd3\x40\x0c\x31\x7b\xad\xb5\x17\x31\xcd\x0c\x25\x21\x35\x66\x81\x27\x0b\x91\x68\xdd\xef\xf7\xfb\x12\x11\xe9\x50\xd8\x0b\xcb\x17\xa6\x1d\xc9\x50\x14\x5f\x68\x60\x6a\x1a\x45\x16\x95\x65\xa8\x11\x28\x69\x20\x14\x1a\xe6\xa5\x8b\x16\x59\x2a\x5d\xf8\x9e\x5f\x27\x0e\x1c\x5f\x35\xbf\xfd\x1f\x2c\xd6\xde\xeb\x73\x79\x9e\xcf\xe7\x79\xce\x74\xf4\x29\x34\xf7\xd3\x99\x09\x6d\x19\x24\xab\xb3\x71\x73\xd6\x61\xe8\x51\xbe\x97\xc0\x18\xf0\x99\xee\x8b\x24\x4c\xda\x54\x30\xb0\xb7\x00\xe6\xb8\x00\x8b\x0f\x79\x41\x91\x9a\xca\x31\x8e\xf0\x29\x65\x7e\x57\x87\x3e\x9c\x5a\x7d\x4f\xac\x7e\x61\xad\x48\xaf\x46\x13\x94\xd6\x14\xf6\xba\x26\xd2\x47\x7a\x8d\x5e\x63\x0c\x28\xea\x93\x89\x07\xb2\x4c\x76\xca\x0c\xab\xbe\x87\x3c\x83\x7c\xe1\x15\x43\x70\x77\x74\x42\x2a\xba\x1f\x9b\xb7\x06\x73\x98\x79\x1d\x91\xeb\x36\x90\x28\x62\x8f\x78\x51\xbb\x1b\xaf\x94\x8d\xa9\x75\xce\x4f\x98\xfc\xb3\x0c\x67\x31\x6c\x57\xa8\x33\x29\xf8\x6e\xc8\xc0\xe4\x69\xac\x9d\xe3\x00\xa8\x1e\x94\x02\xbb\xdd\xc0\xcd\xe0\xcd\xbb\xc8\xf9\x62\xc7\x76\x09\x3e\xbc\xe7\xec\x45\x2c\x66\xd5\xcd\x9d\x60\x24\x85\xc5\x4b\x2f\xa2\x0f\x07\x98\x28\x06\x34\xf1\x26\x44\x3d\xc7\x96\x97\x7c\x31\x7f\x34\x2d\x24\xf7\xd6\x54\xb8\xf7\xf5\xa6\x33\x65\x7f\x05\x32\x98\x51\xf8\xbc\x54\x98\xf7\xb6\x45\x4f\x35\xaf\xb9\x75\x1b\x14\xc7\x27\x4e\x03\xa4\xef\x98\x94\x99\x04\x02\x8e\xb9\xeb\x2f\x22\xce\x2f\x00\x72\x35\x5e\x8e\xd0\xac\x77\x6f\x71\x8a\xb2\xc5\xf2\x14\x94\x5e\xf6\x85\x50\xa7\xb7\xca\x80\xe7\xf4\x29\x71\x37\x1b\xe2\x6a\xe8\xe6\xa7\x8d\x00\x40\xb6\x25\x5a\x84\xb8\xd2\x83\x4d\x56\x57\x5e\xc4\x45\x6a\xbe\xf0\x1c\xeb\x7e\xee\x95\x51\xde\x72\x17\x1f\xa2\xd1\xb7\xbe\x2e\x3e\xf0\x11\x10\x6e\xb9\x6f\x0e\x18\x9e\xce\xcd\xe0\x3b\x7b\x55\xf8\xb5\x5f\x14\xaa\xb5\xda\x29\xf3\xa3\xfd\x61\xb9\x79\xf9\x30\x1d\xea\x7a\x60\xc7\x5d\x47\x6f\xa1\x21\x0c\x98\xbd\x0a\x6e\x3d\x44\x77\x81\x53\xf5\x8b\xf9\x23\xb3\x67\x24\x7b\x32\x20\x5b\x80\xac\x1c\x37\x97\x9b\x5b\x5e\xf1\x3a\x0f\x22\x34\x20\xdc\x1b\x58\x61\x39\xb6\x14\x4e\xce\x9b\x7e\x01\xdf\x1f\xa5\xbb\x15\xd1\xd1\x33\x38\x7b\x4c\x9d\x63\xe2\x96\x5f\x09\x8f\x66\xb4\xc2\x1d\x72\xa2\x17\x0d\xf7\xd6\x49\xdd\x9b\x6b\x2e\x9f\x7c\x91\x65\x0c\x1d\x6e\xe2\xb8\x39\xb8\xbd\xe2\x5b\x0f\x3d\x0a\x12\xe8\x6d\x6e\x1d\x74\x64\xd2\xa6\x41\x53\xce\x9d\xe6\x6f\x01\xe6\x13\xb5\x9d\x0d\xd7\x7a\xca\xe3\x23\xde\x74\x40\x4b\x0e\xe2\x8f\x3d\xab\xa6\xd1\x06\x50\xc0\x38\x30\xb0\xe1\x89\xf1\x0c\xa5\xf2\xf6\x13\x0f\x21\xea\x93\x1e\x47\xcb\x9d\xc2\x40\x4d\xa9\x88\xe9\x35\xf2\x76\xbe\x5b\x67\x55\xca\x7c\x3b\xd6\xf8\xf2\x30\xc3\x43\x34\xf6\x01\x7c\x32\x5b\xc1\x7b\x17\x0f\x31\xb0\xcd\xb1\xc1\x3b\xf9\xd4\x05\xdb\x86\x3b\x18\x15\x1d\x83\x44\x7f\xae\xae\x73\x12\x83\x0f\xa8\x3e\xde\xfb\xc5\x74\x1c\xc9\x81\xf9\x68\xd4\xdb\x42\x31\xa1\xc1\x27\xaf\x76\x5d\x81\xda\x3b\x07\xab\x2c\x77\x1d\xc8\xb9\x9b\x85\x38\xcc\x5d\xa1\xa9\x3f\x5f\xe4\xd4\x47\x75\x78\x66\x69\x2d\x1d\x0a\x61\x72\x48\x52\x84\x49\x20\x59\xa9\x37\x09\x68\x43\x5d\x44\x89\xde\x59\x8a\xe4\x95\xc8\xf5\x2f\x44\x8e\x29\x12\x85\xe2\x59\x80\x0a\xef\xa5\x95\xe2\xb3\xc0\x9d\x47\x78\x09\x70\x72\x52\x4d\x7e\xdf\x48\xf8\xb3\x9c\x17\x84\xa0\xb4\xf2\x27\xde\x52\xdc\x61\x16\x81\x1f\xf8\xec\x60\x49\xf0\xd9\x9e\x3a\x1f\xc8\xfc\x85\x9b\x6b\xc6\x99\xe1\x54\xaa\x94\xf0\xe1\xa8\xc5\x73\x0b\xfb\xe2\x8d\x18\x7d\x61\xb4\xcd\x97\x92\x51\x62\xfb\x25\x2d\x03\x3d\x74\xcd\x9b\xdd\xe1\xcb\xa5\xec\x91\x43\xbe\xfc\xdd\x3f\x1c\xd1\x95\x87\x7e\x31\x71\x9e\xc4\x63\x09\x56\x90\x2f\x43\x4f\xbc\x04\xfb\x19\x5a\x52\x80\xe5\x27\x93\x07\x9c\xc8\x33\xa6\x1d\x26\xc7\x68\x4e\x63\x35\xe9\xbe\x90\x17\xde\xe0\x0e\xfb\x2e\x83\x29\x49\x92\xbc\xe9\x87\x0e\x69\xbc\x4f\x8f\x2c\x97\xe9\x1a\x25\xba\xc1\x53\xb2\x2a\xaf\x9a\xaf\x0d\x08\x7e\x32\x29\x18\x5c\xb8\xc5\x0b\x88\x94\x06\x53\xe5\x58\xf7\xa1\x6e\x96\x27\x78\x81\x12\x3b\x56\xb6\x47\xf1\xda\xe8\x00\x1c\xc7\x17\xbe\xe9\x7e\x41\x7d\xb2\x10\xd4\x14\x56\xe6\x70\x2c\x1a\x34\xe0\x79\x4c\xa1\xdc\xf4\x89\x01\x0c\x24\xb3\x51\xd5\xf4\x47\x74\x61\x9f\xa8\x2f\xd4\x3f\xa7\x1f\xf9\x59\xc0\xe3\xd7\xfd\xd3\xff\xea\x2f\xff\x5f\xff\xce\xff\xc6\xef\xf8\xf7\xfe\xa9\x5f\xc1\xff\x93\xf8\xa7\x7f\xe5\x5f\xfd\xd5\xff\xfc\x5f\xff\x4f\xfc\x9a\xff\xc2\x7f\xfc\xb7\xfd\x2b\xf3\x97\xfd\xb7\xfe\xb5\x3f\xf7\xeb\x3f\x98\xf0\x70\xc0\xf8\xf7\x19\xcc\xbf\xca\xdf\x6d\xf9\x23\x09\x66\x07\x99\x06\x12\x8c\x49\x63\x30\x09\x2d\x78\xbb\xe0\xb6\x34\x77\x6b\xfb\x89\x72\x38\x0f\x44\xa1\x26\xf4\x2a\x89\xcd\x75\x2b\x4a\xa1\xc1\x5b\x50\x93\x0d\xdd\x1c\x9b\xb7\xe6\xee\x19\xc7\x95\x13\x28\xbc\x4b\xf9\x62\xb6\x82\x54\xa0\x8a\x06\x35\x92\x1e\x9c\xd0\x7b\x0d\x3c\x32\xbc\xc9\x5a\x67\x18\xaa\xf1\xed\x72\xf0\xcd\x1c\xc1\xca\xa6\x6c\x66\xb2\xf5\x8b\x72\x39\x39\x2f\x6d\x9a\x47\x4d\x43\x2b\xed\x79\x97\xb6\x17\xe7\x6c\xc0\x60\x6f\x7c\x67\x72\x66\x72\xa2\xc1\x3b\xe0\x0e\xf7\x11\xeb\x13\xa8\xc1\x7b\xde\x8f\xa0\xcd\xab\xc6\x8d\xea\xf8\x3d\x63\xf4\x21\xc6\x56\x1e\x41\xc8\xf2\x3d\xe6\x2c\x61\x1e\xb9\xdc\x8b\xf0\x39\x97\x7e\xe1\x44\x1e\xa3\xad\xe0\x82\xc3\xae\x69\xb5\xa1\xf1\xe8\x3a\x7d\x5c\xa0\xc1\xb4\x88\x3c\xa1\x0a\xef\x56\x3e\x0d\x27\xf6\x38\x03\xbb\x7b\xbe\x18\x64\x5b\xde\x8c\x38\x2d\x80\x68\x8f\xb1\x71\x17\xca\x54\x9b\x41\x68\x03\x52\xcb\xb2\x42\xe8\x48\x0d\xee\x73\xeb\xab\xf1\x8b\x2a\x7e\xbe\xe0\xd0\x5f\xd3\x4c\x3a\x7b\x67\x10\x4a\xa3\x33\x69\x1b\xae\x1b\x22\xad\x6b\x2a\xdf\xbe\xa6\x4b\x2f\xdd\xb6\xfa\x68\x71\xdb\xde\x8a\x4f\xbc\x62\x6a\x57\xd8\x11\xef\x91\x21\x6c\x55\x13\x44\xa5\xaf\x12\x66\xd7\x37\x71\x7b\x1e\xa9\x87\xd1\x45\x3a\x13\x49\xbb\x4f\x7e\x05\xf9\xc4\x8a\xd5\x12\x0a\xdf\xb4\xbc\x6b\x37\x7b\x4a\x9e\xfa\x9a\xc7\x18\xf0\xa6\xf2\x43\xcc\xc8\xa9\x31\xbb\xd2\x9d\xad\x16\x85\xa5\x4e\x72\x3c\x5f\x34\xf9\x57\xa3\xb5\xf4\xfb\x9a\xa8\x8c\xb4\xcf\xaa\x63\xd2\x23\xaa\x48\xb2\xed\x35\x79\x93\xfc\x59\x87\x4c\xfe\xc8\x22\xd3\x12\x12\x7c\x62\x52\xd6\x8e\xf0\xdc\x70\xb2\x3c\xe9\xeb\xc4\x0e\xf0\xc6\x8d\x3c\xc3\xb2\x29\xea\x68\x61\x5c\xb4\xb7\x08\xd2\x5e\x1c\x86\xed\xbe\x9d\x2f\xe0\x38\x75\x49\x1a\xbb\xe5\xc7\x1c\xd4\x02\x8c\x3e\x61\x47\xfa\x39\x4f\xce\x39\x2c\xe4\x72\xa4\x81\x4c\xab\x82\xd5\x84\xbf\xca\x79\xff\x85\x56\x83\x3e\xae\xef\x18\x10\xe3\xa9\xb9\x22\xc1\xb0\x31\x31\xc4\xfc\x50\x3b\x8e\x0c\x81\x7f\x40\xdb\x70\x28\xf3\x04\x52\x79\xdc\x82\x7d\xc1\xe4\x6f\x5e\xd7\x86\xb2\xb6\xa1\xf7\xcd\x28\xe8\x77\x17\x07\x8d\x66\xa4\x75\x18\xac\xa0\xa5\xd6\xb7\xf0\xe2\x5b\x40\xd4\xd0\x55\xd9\x17\x53\x50\xcc\x1d\x43\x5a\xda\xf5\xd2\x1c\x5f\x2a\x62\x0d\x6f\x61\xfc\x2a\x36\xf6\xdb\x46\x0e\x9d\x16\x3d\xd9\x1b\x5f\x17\xb1\x8b\xc8\x92\x2f\xe6\x09\xf8\x09\x01\xc1\xd6\x29\x7f\x76\x6a\xc2\x5b\x41\x50\xea\xaa\xf3\x1f\x5a\x3c\xd6\x8b\x6c\xf2\x41\xe6\x10\xc5\x9f\xe7\xd8\xf6\x24\xfb\x85\x93\x51\x03\x46\x8d\x08\xfc\x13\x6e\x38\x4e\x32\x21\x90\x2b\x38\x15\x41\x8b\x16\x30\x24\x6b\x70\xa8\x44\x87\x4a\xb3\xc5\x59\xfb\xfe\x09\x04\xa5\x53\xad\x56\x05\x03\xac\x61\x49\x50\x30\xfb\xc6\x11\x55\x0f\xa7\xf6\xba\x4f\x4f\x6b\x85\xb2\x9d\x6c\x8a\xbb\xd7\x0a\xa0\xee\x17\xbc\x31\xf7\x27\xde\x4d\x29\x3f\x42\x41\xa2\x16\xf1\x56\xe8\xd8\x39\xc0\x43\x4c\xf1\xec\x17\xcc\xe6\xea\xcb\x26\xb5\xcf\x25\xe9\x11\x9f\x48\x21\x8e\x23\xdd\xda\x1b\xb8\x26\xa6\x56\x38\x32\x80\x94\xd3\x3c\xf1\x3c\x09\xe0\x5c\xa8\x3e\x70\xf4\xe8\x89\x7d\x8b\x43\xf5\x3c\x9f\x28\x0f\x11\xbe\x7f\xa8\xce\xd3\x48\x75\x0d\x5f\x78\xbf\x2f\x77\x58\x59\x4e\x60\x6f\xd6\xb0\xc7\x36\x83\x41\xaa\x89\x9e\xeb\x40\x36\xbd\x7d\x11\xc1\x31\xa8\x58\x09\x8a\x5d\xf5\xa6\xc3\x51\x2d\x6f\xf0\x36\x10\x08\x7d\x04\x5e\xd6\xb7\x80\x55\x13\x76\x41\x6e\xcd\x7a\xac\xd4\xe5\x8b\xfa\x42\xe2\x36\xd8\x3a\x2f\xc7\xf1\xc9\x90\x2f\xea\x96\x45\x33\xe4\xfe\xf6\xf7\xf4\x9d\xfc\xd1\x3c\x99\x18\x64\x37\x97\x5e\xf4\xb2\xf3\x45\xd4\x82\xdb\x77\x56\x70\x4f\x82\x0f\x6b\x90\x31\x78\x23\x30\x0f\x64\xd7\x65\x9f\xfc\x9b\xcc\xcf\x70\x3d\x1a\xe6\xb0\x8f\x81\xf0\xd0\x2f\xa8\xcf\x5d\x31\x7f\x27\xb8\x4a\x25\xde\xeb\xe3\xa7\xcd\xde\xe7\x82\x3d\x0d\x2b\x20\x50\x03\x9f\x7b\x08\xe9\x66\x66\x88\xe4\xe4\xc4\xf9\x42\x76\x9a\xe9\x17\x8c\x5a\xe2\x7e\x14\xb0\x49\xd7\x4b\xba\x17\xb7\x94\x4b\x03\x67\x58\xf6\xbb\xe3\x9b\xa7\x9e\xa2\x45\x88\xfa\xc3\xd4\xfd\x62\xc2\x83\xbb\x27\x0a\x78\xb7\x01\xa1\x86\x3b\xe7\xc2\x82\x4c\x8e\xcd\xeb\x99\x97\xaf\x85\xa5\x18\x8f\x81\x03\x13\x44\xd5\xf3\x03\xd2\x27\xca\x86\x51\x0e\x89\x77\xaf\x34\x2b\x1e\x76\xbd\xdc\xbe\x23\x45\x6d\xea\xe8\xb6\xef\xd5\x8a\x96\x04\x55\x3d\xdb\x59\x07\x2f\x15\xcd\x17\x2a\x8f\x24\x4a\x2d\x99\x9f\x31\x10\xab\x1a\x78\x8f\x2c\x9c\xae\x3e\xb2\xd7\x0c\xca\x32\xce\x70\xd9\xe2\x10\xc2\x56\x1b\x2e\xf6\x5a\xdd\xbe\x58\x13\x55\xe9\x4a\x0b\x59\x57\x48\x83\x8a\xfa\x7d\x48\x72\x22\xf8\xd2\x0b\x68\x39\x41\x8a\x05\x23\x68\x87\xe3\x70\x8a\x80\x0e\xb1\xed\x27\x9a\x82\x1c\x70\xd2\x0b\x9e\xb6\x76\xb8\x04\x2b\x4d\xb0\xd7\xf2\x3a\xe5\x48\xc4\x22\xde\x5f\x9f\x87\x4c\x1b\xa8\xd3\xfc\x0b\x2b\xf9\x39\x6f\xe4\x67\x01\x8f\xbf\xfb\x97\x7f\xdf\x1f\xf8\xe7\xff\xcb\x3f\xf1\xd7\xff\xde\x9f\x65\x3f\xf5\x8b\xfe\xf0\x5f\xfd\x4b\x3f\xfd\x7f\xf9\xf3\xff\xfa\x4f\xfd\xee\xff\xc3\x3f\xf2\x1f\xfb\xcf\xfe\x07\xc9\x4f\xfe\x4f\xff\xb1\x9f\xfc\x00\xf0\x08\xdc\x5e\x61\x22\x6a\x23\x1a\x2a\xa4\x38\x5c\xca\x54\x09\x2f\xb5\x07\x35\x77\xe8\xc6\xc0\x0c\xe7\x31\x8a\xc2\xa6\x8b\x19\xe7\x8b\xd6\xe1\xe1\xa4\xf0\x34\x03\xb1\x91\x88\xf7\xc2\xc3\x98\x73\xec\xd9\x40\xad\x12\xa6\x14\xce\x69\x11\x59\x0d\xf5\x10\x14\x4b\xe5\xc8\x7e\x51\x2e\x73\xd8\x02\xee\xea\x78\x5b\xc1\x69\xea\x1d\x0a\xaf\x2c\x91\x41\x4d\x0c\x3c\x17\x28\xd5\x21\x18\x18\xe0\xd2\x3d\x45\x77\x1b\x3f\x11\x9b\xa3\x29\x9f\x54\x14\x54\xc5\x5d\xbe\x5d\x58\xa4\x5d\x77\x81\xca\xc5\xef\x97\x36\xcb\x0e\xde\x86\x57\xbe\xc9\x7d\xdb\xe9\x29\xdc\x2f\xd0\xe5\xe7\x5d\x8d\xa4\x41\x37\x85\xb4\xde\x55\x26\x4a\xaf\x1d\xe1\x98\x4e\xd5\x78\xc3\x79\x1e\x2a\x7c\x40\x3a\x93\xe2\x10\xe4\xc1\x7f\x21\x0b\x49\x91\xd3\x94\x16\xc2\x41\x0e\xee\x35\xc6\x23\xa9\xe0\x78\xf4\x83\xef\xab\x2e\x54\xf1\x2e\x3d\x20\x03\x6d\xa7\x16\x58\x58\x5e\xd6\x2f\x1a\x18\x83\x13\x80\x2b\x24\xb4\x17\xb8\xed\x50\x52\x02\xaa\x7d\x31\x76\xa8\x88\x81\x52\xe9\xf1\x40\x8c\x74\x8e\xc1\xb0\x2c\x19\xd7\xbe\xb8\x0b\x8f\x1b\xb5\x35\x5a\xca\xba\xc7\xd1\xf0\xfd\xa2\x36\x18\xcb\x4f\x72\x69\xf4\x14\xeb\x48\x11\xe5\x08\x2f\x83\xa3\x17\xae\xd9\x17\x6c\x14\x35\xcf\x4b\x2a\xd2\x24\x61\x0e\x20\xcf\xb9\xb0\x81\xb7\xe6\xe8\x6e\x4d\x94\x88\xf1\x19\xaf\x70\xcc\xe6\x84\x17\xb1\x54\xbc\xef\xf9\x42\xa8\x53\x00\x37\xcf\xb9\xe2\x59\x36\x43\x38\x79\xb3\x89\x0c\xc7\x39\xe2\xb6\xe4\x6d\xf3\x2b\x61\xe4\xb1\x55\x51\xea\x7d\xb0\x61\xf9\x8b\x39\x13\xaa\xf2\xb4\x86\x07\x7c\xf5\xd9\x7c\xa3\x0a\xf0\xb1\x55\x31\xff\x94\xde\xb3\xb8\xca\x39\xe7\x07\x1f\x17\xbd\xc3\xdb\x6a\x6d\x3f\x9f\x98\xa0\x02\x68\x61\xbb\xf4\x95\x82\x8f\xbc\x8c\x3e\xc9\x3c\x49\xac\x2a\x04\xb7\x48\xe8\x68\x34\x6b\x59\x2b\x9c\x45\xcf\xda\x52\xf1\x89\x57\x0c\x28\x8f\x68\x83\x0e\x79\xed\x9d\xce\x89\x0d\x5d\x3e\x4e\xdb\xdd\x6c\x48\xf6\x4e\x14\xda\x53\x9f\xe5\x95\x18\x10\x9a\x56\xbd\xf9\x62\x27\x3f\x9b\xa5\x5f\x24\x4c\x2d\x12\xa9\x3a\x53\x32\x3c\xef\x5d\x68\xdc\x37\x08\x91\xbc\x4a\xd6\x3c\x64\x71\xc4\xef\xa6\xdd\x99\xf7\xf9\xa2\x38\x3b\x3e\xb4\x32\xf1\xb4\xb7\x2d\x3b\x8e\xa9\x83\xef\x1a\x41\x30\xcf\x8a\x6b\xf5\xde\x90\x59\x25\xc3\xb8\x61\x89\x64\x4b\x1d\x3f\x61\xf2\x45\xda\x95\x77\xd4\xa3\x7d\x49\x78\x56\x93\x39\x78\x56\xcf\x93\x9b\x1f\xb2\x53\x0e\xf3\xc2\xaa\xef\xab\x1f\x1d\xb5\x70\x4e\xd6\x2f\xf2\x08\xad\x26\x45\xcd\x71\xd8\x8f\xbc\xbe\x3b\x87\x18\xaf\xcd\xf4\x9c\x2e\x1a\x1e\x97\xd3\x8c\x58\xd9\x25\x5f\x1c\x35\xef\x5d\x90\x7e\x51\xb4\xe7\x9b\x48\xe5\x9d\x73\xd0\xec\x94\xfc\xd9\x34\xb8\x32\x1e\xca\x4b\x15\xbe\xc2\x86\x80\x25\x95\x05\x49\xda\x8c\x67\x15\x25\xbe\x10\xb3\x25\xd6\x8a\xf0\x3c\xf0\xbd\x2c\x3b\x16\x2b\x27\x36\x1c\xa5\xa7\x61\x70\x3c\x26\xf4\x2c\x54\xf2\x87\xd8\xe1\x93\x67\x01\xdd\x0c\xc8\x17\xbb\xd7\x34\xd7\x98\x9a\x9a\x9a\x5b\xf2\x72\x85\xee\x2d\x89\x0a\xe5\xc3\x0b\xb7\xba\x31\x89\xfc\x98\x9d\xd0\x31\x7d\x3a\xf2\xea\x3e\xeb\x17\x77\x91\x11\x74\x2b\xb9\xaa\x37\x3a\xfb\x4e\x2c\x0f\xa6\xa0\x81\x62\x36\x73\x01\x4d\x1c\x34\xc9\x93\x67\x17\x5f\x9d\xe8\x60\xf9\xb4\x2f\xb2\x19\xec\x42\x9f\x3b\xcd\x12\x33\x73\x5e\x7c\xb6\xb9\x4d\x24\x87\x3c\xe1\x65\xd0\xc0\xd2\x90\x53\x67\x58\x5c\xa0\x54\x17\xbc\xe0\x93\x2a\xc7\x73\x6b\xdc\xf2\xf5\xa9\x3f\x54\x5c\x26\x02\x97\xa0\x6f\xe4\x9a\x57\x42\x58\xaa\x8a\x95\x84\xbe\x66\x7c\x2d\x0d\xe8\x9d\xc4\x7d\x51\xe5\x90\x65\x7c\x04\xbe\x2e\x5d\x11\xa9\xfb\x74\xcc\xb6\xd2\xcc\x76\xeb\xf9\x8e\xba\xef\x67\x71\xbc\x17\x6d\x31\x65\xfe\x68\x4f\xfa\x17\xeb\x80\xb4\xb1\x16\x98\xf4\x8f\xf5\x2f\x39\x70\xc6\xb2\x31\x23\x7c\x04\xb2\xe1\x09\x1b\xaa\x92\xc4\x9c\xfe\x7d\xf3\xcb\x8e\x9c\x70\xc3\x4f\x08\x15\xc7\xd3\xbc\xe9\xd1\x49\x13\x1b\xfb\x65\x05\x6d\xb0\x63\xe8\x3c\x3a\x45\x0b\xb7\xaa\x34\x56\x36\xe1\xa8\x61\x41\x4e\x4b\xec\x1b\x8a\xab\xbc\xe5\x85\x7d\xed\xa1\x63\x7b\xda\x68\xb9\xe0\x67\x73\x77\x8e\x4c\xfc\x0d\x2c\x9c\x5b\xe1\x8e\x1d\xa8\xca\x1f\xf0\x8c\xf0\xc5\xfa\x30\x25\x31\xab\x5c\x70\x78\x95\x5d\xd3\x86\xa0\x1e\xed\x83\x24\x96\xb9\x1f\xda\xb4\xa2\xae\x63\x77\xa5\x7c\x07\x5d\xd4\x1f\x02\x37\xf8\xc4\xba\x39\xea\xbd\x2b\xb8\x67\xc6\xbe\xea\x03\x34\x25\x64\x93\x0c\xba\x0f\xe3\xe1\xe8\xb8\x4e\x00\x15\xa1\xf6\x4a\xbb\x59\xa5\x64\xf2\x89\x47\xa1\x95\x5d\x8b\xf7\x41\xcc\x95\x37\x1d\xcf\xae\xcc\x57\xa6\x67\x1f\x3d\xde\xa0\x5e\x6d\x47\x3c\x15\xf6\x0d\x52\x51\x12\x02\xf0\x49\xd4\xb2\x13\x47\x87\x43\x5d\xae\x49\x1d\xb7\xb8\x5b\xe2\x29\xc7\xd3\x54\x46\x0d\x39\x56\x47\x0b\x67\x64\x3f\x0d\x11\x65\x32\x3c\xc8\x17\xc4\x3c\xd6\x41\xbd\x83\x87\x57\x17\xcd\x56\xb3\x9e\x6d\x69\x39\x7d\x14\xe7\x8d\x0d\xea\xea\xbc\x97\xf4\x18\xd2\x51\x74\xe9\xa6\xf9\x3f\xc4\xa5\xe5\xef\x11\xff\x9b\xff\xca\x1f\xf8\x47\x7f\xfb\x7f\xf7\x8f\xfc\xb4\xfd\xef\xfd\x83\xdf\xfd\x47\xff\x95\xbf\xd0\xff\xc1\x4f\xff\xdd\x5f\xf2\xf7\xff\x91\xff\xd7\xff\xee\xfc\xef\x7f\xf9\x1f\xff\x97\x3e\x58\x69\x09\x73\x07\x98\xd0\xc8\x4c\xb5\x4a\x0a\x13\x40\x54\x1e\xfc\xf2\x25\x40\x89\xb3\x9a\x02\xca\xa1\xcc\x11\x9c\xf2\xa8\xb3\xd6\xcf\x17\x68\x51\x61\x06\xf9\xe8\x8b\xd9\x0f\x41\x2f\x21\x61\xba\xe7\x02\x8a\xba\x3b\xe2\xcc\x9b\x3d\x7e\x9e\xe3\x44\x3d\x8a\xf8\x66\x0c\xd4\x5f\x94\x88\x04\xc3\x81\x6b\xde\x79\x8e\x79\xf1\x09\x76\x28\xd1\xeb\xb1\xf9\x22\x07\x64\xb2\x65\xc9\x00\xde\x67\x72\xf3\x98\x55\x27\xbd\x89\x7e\xc1\x95\x0a\x2d\x64\x35\x6f\x4c\xf2\x75\x04\x36\x2b\x07\x23\x1c\x1e\xcd\xd9\xa3\x27\x86\xba\x26\xfa\x3a\x1e\x0a\x9f\xeb\x74\xbd\x6f\xfe\x22\xd8\xd2\x67\xdf\xfc\x9a\x28\xa1\xd7\xfe\x1d\xd0\x47\xd2\x67\xdb\x02\xbf\xe6\x20\xce\x89\x31\xa2\x97\x42\xcf\x3a\xb6\x07\x89\x9c\xba\x9f\xcc\x13\x64\x4a\x23\xa7\x1e\x02\x9c\x61\x47\x3e\x1d\xf8\x10\x8e\x9d\xce\x56\x55\xac\xc3\x15\xcf\x4b\xde\x5b\x04\x73\xa4\x0c\xf8\xde\xf7\x7c\x91\x78\x06\x47\x3d\x54\x26\x63\xd2\xf9\x67\xb6\x6c\x50\x7b\xb4\x5f\x82\x85\xcc\xe0\x31\xa7\x1c\x0c\xa8\xa0\x41\x97\xb0\xa1\x0c\x25\x98\x2f\x5a\xca\x0a\x8d\xa7\x89\xf3\x20\x9e\x7a\x02\xb2\x3e\x19\xe8\x70\x60\x00\x13\x58\x19\xb6\xd9\xee\xbd\x33\xea\x44\xb5\x9d\xa2\x07\xfa\x8b\xdd\x6b\x4a\x9d\x45\x1e\xbd\xc0\x33\x8b\xb0\x77\x95\x1f\x6e\x9c\x71\xd6\xd6\x8a\xaa\x4c\x48\x92\xa4\x56\xba\x03\xcc\x77\xeb\xb7\x5f\x41\xbf\x78\xa9\x67\x11\xdd\x29\x67\x47\xea\x77\x3c\x68\xa8\xc3\x2e\x1a\x2a\x19\x26\x11\x25\x42\x4e\x21\xa5\xc7\x16\xd3\x02\x68\xe1\x1a\x11\xfe\x45\xeb\x30\xfc\xa3\x5b\x47\x8c\x07\x71\xf9\x18\x54\x2e\x34\xf2\x3b\x01\xe5\x88\x08\x42\x1b\x05\x29\xb9\x47\x50\x17\x86\xf7\xb5\x98\x4a\xbf\xd0\xad\x78\xab\x81\x0c\xfb\x62\x31\xda\x27\x11\xa9\xe7\x5c\x4c\xa9\x7e\x34\x7e\xf8\xc4\xa2\x07\x6f\x3b\xbf\xe0\xf1\x68\x79\x66\x50\x20\x5f\xbc\x54\x21\x45\x59\x41\x2a\xd7\xe7\xdc\xcf\x59\x9c\xd1\x57\x3f\x66\x9f\xe2\xfb\x4d\x8f\xa5\x76\x3c\x39\x64\x7d\xae\x6b\xb6\x78\xf7\x94\x2f\x76\x6c\x43\x5f\x18\x38\x62\xc7\xbc\x0f\x52\x30\x71\xf7\xe4\xb0\x0b\x16\x04\xf2\x37\xa1\xea\x14\xd5\x89\xc3\x73\x83\x42\x10\xd8\xfc\x89\xb7\x14\xa1\xfa\x18\xa4\x10\x8d\xf2\x38\xec\xd8\x72\xe2\x25\xec\xd6\x93\xd9\xbe\x9e\x0e\x26\xb6\x9a\x6f\xe8\xa0\x53\x40\x53\x36\xf0\xf9\x42\x78\x8f\xec\xa7\x1f\xff\xec\x37\xba\xa7\xed\x4e\x5f\x64\xdb\x85\xed\x6c\xb6\xb5\x79\x56\x47\x26\xc5\xd3\x5e\xc9\x4d\xce\xc3\xd6\x9b\xcb\x27\xdb\xf0\xca\x61\x26\xfc\x94\xba\x3e\xda\x01\x81\x74\x5c\x08\x0a\xbf\xc8\xe6\xbd\x76\x46\xd1\x13\x6b\xd2\xcf\x4d\x93\xbe\xac\xcd\xa4\xcc\x17\x1c\x3a\x13\x2c\x6a\x52\xf8\xdc\x2e\x6d\x68\xbb\xd1\xef\x0b\xd3\x0d\xd6\xe1\xb6\x17\x23\xa1\xaa\x45\x07\x40\x63\xf1\x2d\x9e\x07\xcb\xe7\x8b\x53\x38\x97\xb8\xa6\x42\x64\x9b\x49\xee\x32\x12\x78\x88\x0c\x20\x07\xae\xfc\x4b\x00\xf4\x4c\xf2\xde\x78\x5b\xac\xef\x74\x96\x25\x9f\xc0\x2e\x38\x86\x04\x5f\x17\x76\x28\x7c\xd4\xf8\x33\x22\xb2\x26\x18\xef\x78\x9f\x4d\x86\xf7\x00\x89\x6d\xdc\xc4\xae\x1f\xca\xb2\xf3\xe4\xf2\x05\x28\x58\xc1\x35\x1b\x73\x82\x84\xa1\xbe\x86\xe5\xd8\xc6\x93\x49\x89\xa6\xa4\xd7\x74\x39\x1f\xac\x96\x55\x61\x56\x5e\x1e\x19\xad\x69\x5f\x2c\xab\x56\x6c\xab\xdd\xc3\x65\x5e\x06\x3a\x1d\x4b\xdb\xdf\xe7\x29\x3a\x87\x54\x18\x54\xdb\xa6\x1f\x7a\x29\x72\x9c\xeb\x3c\xad\xfb\x34\xf6\x85\xda\x0e\x47\x0b\xbd\x36\xb6\x60\xfb\x56\x85\x63\x97\x91\xc0\x64\xe8\x0a\x10\x20\xed\x16\x13\x42\x26\x34\x44\xac\x9e\xe5\xce\xca\x94\x7d\x01\xbb\xec\x85\xe1\x6d\x5d\x9f\x32\x2e\x60\xda\x04\x18\xb4\xe3\xd4\xdd\x3e\x52\x1c\x8d\x39\x95\x8e\x1f\xe5\xd1\x0f\xb2\xbb\x5c\x43\xbf\x21\x11\xcc\x63\x72\x4f\x44\xe0\x62\x35\xdf\x9d\x3d\x41\xa2\x71\x12\x15\xb2\xcb\x31\xb8\xd2\xee\x24\xd2\x28\x47\x98\x56\xcf\x13\x3d\x1f\xf4\x23\x84\x7a\x70\x4f\x06\xe1\xed\x04\x52\x8c\x25\x78\x0c\x92\xcd\x23\xd0\xbd\x98\x5c\x61\xea\x65\xc8\x2c\x9c\x23\x64\x0f\xeb\xa4\xfa\xc9\xca\x6c\x37\x00\x82\x70\x8b\x12\xd5\xaf\x57\x6a\x55\xfb\x2a\x57\x6e\x40\x6c\x88\x76\x87\x57\xaf\xf6\x4e\x10\x64\x18\xfd\x2d\xd7\xa2\x4f\xac\x9b\xf9\x78\x5f\x75\x03\x05\x7b\xaf\xae\x6f\xb6\xf7\x05\x24\x43\x73\xee\x18\x3c\x70\xe1\xd9\xb0\x27\x24\x6e\x35\x86\x86\xe1\xf8\xde\x2f\x72\x2a\x20\x73\x92\x77\x73\x3d\x70\xa9\x55\x26\x16\x05\xc4\x68\x60\x41\x3d\xb3\x0d\x5f\xe0\xd0\x65\x37\x7a\xa2\x54\xcc\x45\x9f\xed\xbf\x10\x70\xed\xd7\x88\x18\x7c\xd8\x91\xc3\xbb\x19\x3a\xcf\x4d\x7c\x0f\xe5\x8e\x9f\xd1\x5a\x37\xa9\xb7\xd0\xcb\x58\x30\xa6\x63\x03\x11\xd8\x17\x0b\xdd\xb6\x91\xd6\x52\x2b\x87\x08\xf2\x90\x17\x68\x00\x15\x63\xac\x3a\x12\xa4\x67\xb1\xd7\x45\x25\x97\x63\x63\x0d\xea\xb3\xd5\x8b\xea\x17\xe4\x92\x9f\x3a\x2c\x71\xac\xa5\xaf\x2c\x0f\x51\x98\xee\xc2\x03\x73\xec\xbd\x76\x5d\xa1\xf3\xde\x6b\x59\x9b\x40\x94\xb7\xd8\xd7\x8c\x9f\x23\xc1\xfd\xb3\x80\xc7\xbf\xef\xff\xf1\x3f\xfa\xb7\xfc\x96\xff\xe5\xbf\xf3\xb7\xfe\x4b\xbf\xf6\xf7\xfd\x47\xff\xb5\x5f\xab\xfe\xfb\xff\xcd\x5f\xfa\x1b\xfe\xe0\xdf\xfa\xaf\xfd\x86\x7f\xea\x17\xff\xd1\x3f\xf2\xd7\x7e\xe1\xbf\xfb\xff\xf4\x2f\x7e\x00\x78\x68\x92\x42\x8c\xd6\x19\xe1\xcf\x49\x20\x55\x8a\x1d\x36\xcb\xcc\x50\x4c\x45\xa4\xc9\x37\x91\x6b\x40\x3f\xe4\xca\x57\x57\x8e\xbf\x30\x6c\x23\x1a\x48\x67\x99\x47\x46\xe0\x57\xa2\xe5\x13\xc4\xee\xad\x43\x8d\xb1\xf2\x7b\xf0\x22\xc6\x2e\x26\xdf\x50\xfd\x80\xe7\x74\x3b\xbe\x68\x29\xa9\x07\x31\x4f\xc7\x8d\xcb\x06\xac\x96\xd4\xab\x5f\x74\x84\x34\x19\xf9\x03\x53\x66\x71\xed\x23\x55\xb7\xfe\x1d\x6a\x64\x7f\x6e\xfb\x62\x97\x32\x1a\x33\x7a\x8d\x2e\x67\x01\x08\x79\xea\xec\x07\x30\x3d\x68\x59\xb9\xbd\x86\x3c\xfe\x75\xd8\x70\x0a\x28\x52\xf7\x65\x70\x97\x2f\x58\x4a\x32\x79\xc5\xa3\x34\x88\x68\xee\x90\x67\x8f\x60\x08\xc0\x65\x55\xda\x2d\x65\x12\x46\x42\x88\x78\xc7\xe3\xe5\xa5\x20\xd7\xde\x9f\x2f\x98\x39\x9c\x39\x48\xbe\x4d\xb4\x9a\x76\x66\xc0\x94\x76\x7a\x80\xc4\xab\x4d\x34\x70\x5c\x5d\xe3\xbc\x82\x6b\xae\xbe\x93\xc0\x76\xf7\x17\xcd\x1c\x2d\xa2\x93\x3d\x62\x4b\x1a\xdc\x67\xc0\x7e\xca\x73\x3b\x57\xd4\xe0\x96\xde\xdd\x82\x13\xdd\x55\x69\x0b\x52\xd1\xa6\x3a\x82\xf8\x44\x46\x16\x38\xcd\x1f\x86\xb2\x12\xef\x14\xa1\x1d\x02\xb3\xf5\x0f\x92\xb0\x25\x92\x95\x47\x1a\x57\xac\xf4\x12\xfd\x5c\xc2\xee\x91\x11\x7c\x31\x66\xd9\xb3\x58\x92\x69\xe9\x79\x23\xa2\xe1\xb3\x0d\xdf\x2b\x48\x4e\xed\x88\x3b\x0b\x95\xf2\xe1\xd8\x93\xdc\x7b\xd6\x55\x4e\x13\xd8\x17\x05\x89\xd7\xb1\x65\x32\x09\x66\xe7\xa1\x02\x19\xb4\x8f\x3b\xb5\xf3\x92\x20\x8f\xce\x15\x51\xc8\x50\x91\xd3\xe1\xfa\xe6\xae\x1b\xed\xbe\x88\x17\xa6\x3e\x96\x5e\x65\xd1\xf4\xab\x5c\x73\x84\x54\x51\xe3\xac\x9a\x4b\xb4\x7b\xcf\x1e\x4e\x0b\x47\xc5\xfb\xa4\x29\xba\xf7\xb1\x9f\x70\xa5\xf2\xda\x64\x53\x9c\xe0\x42\xe2\x6a\x2a\x4a\x74\xdd\xfd\x78\x20\xf1\xb8\xbd\xc7\xdf\x17\x2c\x79\xe1\x96\xb9\x34\x27\xc0\x20\x5f\xd8\x15\xd3\xe4\xe6\x16\x59\x69\xa6\xc5\x75\xa5\xcf\x4a\x5b\xe8\xc3\xb2\xe6\x1e\x74\x1b\xf3\xc7\x20\x53\xab\xda\xc5\xe3\xa2\x2b\x19\xe7\x93\x45\x3c\xeb\x18\xed\x81\xec\xa3\xf2\x18\x7c\x9c\xab\xe0\x0e\x9c\xec\x47\xc4\x77\x81\x71\xe3\x00\x78\xc7\x6a\xe7\x23\x42\x46\xba\xc4\xf3\x05\x34\x09\x95\xa9\xad\x95\x39\xdf\x2e\xd4\x38\x82\xfb\x59\x21\xc5\x9a\x0f\x4c\x06\xf5\x7d\xcd\x21\x8c\x3b\xfd\x4e\x37\xdb\xe4\xbe\x7c\xc2\xcc\x55\x3d\xf6\xb2\xc5\x01\x8c\xb2\x49\x90\xcd\xf7\x41\x58\xa5\xa4\x22\xa1\xd6\xbd\xd9\xb1\x77\x54\x64\x25\xcb\xc6\x17\xba\x85\x32\x5f\xb4\x94\x2f\xac\xc7\xbe\xb0\xc3\xba\x1f\xcb\xac\x63\xf3\x0a\xf3\x84\xb7\x1b\xfe\x6a\xd2\xc2\xf9\x21\xbc\x32\xb2\xb7\x62\xeb\x65\xed\xcc\x2f\x5c\x9d\x48\x1c\x8e\x67\x5a\x85\xe8\xd5\xbb\x0d\xd7\xc9\x58\x35\x01\x86\x35\xdc\x66\x4b\x1f\xb6\x93\xea\xe8\x39\x3f\x7c\x9f\x66\xb0\x2e\xe4\x0b\x12\x61\xc4\x20\x96\xec\x15\x59\xe8\x8a\xba\xd0\x8e\xcb\x62\xdc\x51\xce\x70\x67\xce\x0e\xc0\x2a\x61\x9a\x3d\xa0\x14\x40\xae\xb5\x97\x2f\x22\x38\xd6\x8e\x95\x06\x25\x60\x87\x41\x4e\x32\x4f\x69\xa2\x97\xe0\x61\xdf\x5d\x12\x4c\x8e\x7b\x9b\xec\x18\x42\x0f\x32\x3a\xbf\x2f\xf9\x02\x08\xeb\x52\xb8\x62\x5c\xbd\x41\x75\x46\x0e\xa8\x4e\xcc\xbe\x42\x78\x1b\x1f\xf4\x35\x14\xb2\xf7\xf1\x88\x45\x8d\x61\x57\xb0\x30\xff\x05\xb9\xf4\x43\x18\xda\x49\x13\x60\xe3\xbb\xa1\x02\x06\x08\x5e\x9a\x7d\x3d\x09\x4b\x0c\x4c\x0b\xf9\xe1\xef\x40\x19\x65\x52\xa5\x32\xce\x3c\x9f\x0c\xca\xf7\x20\xfd\xc0\xad\x24\x24\xf2\x29\x1d\xf6\x3e\x34\x86\x95\x03\x45\xc4\x4e\x55\xa1\xa2\x49\x85\xcd\xd3\xf7\xe1\x0d\x3d\xe8\xf9\x62\x11\x8f\xb4\x16\x52\x2c\x15\x04\xa6\xd7\x9b\xd0\xdc\x49\xd1\x9d\x85\xe6\x89\xe4\x94\x1b\x78\xe1\xa0\x0f\x0f\xba\xc4\x29\x2a\x23\xfa\x92\x2f\xc4\x6c\xc3\x8e\x97\x85\x76\x34\x1b\x41\xe8\xac\xfd\xbb\x50\x23\x27\xac\x9d\xa1\x00\x9b\xe1\xd7\x22\x0c\x5b\x95\x6c\x09\xf7\x3e\x90\x94\x2f\x56\xe0\xb0\xf5\x24\x86\xe6\xe7\x2c\xf7\x49\x92\x84\xdc\xc8\x13\xa6\x63\x59\xbb\x27\x01\x29\x94\x60\xe1\x60\x61\xca\x1b\x42\x5e\x4b\x83\x2f\xa6\xe3\x46\x3e\x7b\xc8\xb5\x86\x74\x53\xb8\x28\xc5\x09\xf0\x78\x3b\x4c\xc4\x15\x80\xf7\xc2\x07\x85\x53\x3a\xf2\x6f\x2d\x9d\x53\x52\xbf\x30\x94\xa0\x24\xbe\x41\x2a\x68\x93\x05\xd6\xb7\x07\xb3\xd4\x88\x74\xed\x2a\xf3\x82\x02\xe7\xc5\x88\xbb\xcb\x26\x35\x34\x52\x6f\x2f\xb4\xfc\x83\x75\x40\xfa\xe6\x03\xe1\x8c\x5a\x2f\xa2\x7d\x88\x8a\xe2\xe4\x2b\xa9\x31\xc9\x85\x2b\x54\xd1\x91\x37\xf6\x77\x68\x71\x8e\x71\x90\x33\xff\x89\x57\x4c\x07\xac\x57\x95\xfb\x06\xb2\x52\x36\xf2\x5d\x6e\xd4\xf0\xe8\x66\x2d\xe2\x72\x61\xc7\x61\xd2\x43\x61\x0d\x1c\x35\x82\xbb\xc7\x7e\xf1\x45\x02\xdd\xa2\x04\x65\xf5\xe5\x85\x07\xde\xd9\x83\x81\xd7\x36\x81\xe5\xe3\x83\x80\x36\x46\xc1\x86\x06\xe1\x8c\xda\xf5\x9c\x5c\xc0\x17\x40\x18\xb5\xcd\xef\x6d\xf9\x6b\x90\xb7\xd1\x65\xd8\xa4\xa7\xac\xf6\x84\x5e\xd4\x00\xf6\x87\x2f\x19\x7b\xee\x83\xa0\x55\xe5\x2c\xf5\xe7\xc0\xb4\x3f\x0b\x78\xfc\xc1\x5f\xf8\x4b\xfe\xe8\x7f\xe6\x57\xfe\xa3\xff\x9b\x9f\xf8\xad\xbf\xeb\x4f\xfe\x95\xdf\xf1\x87\xff\xe9\xf6\x7f\xfb\xb7\xff\x8b\xff\xea\x3f\xf3\x97\xff\xeb\xff\xd8\x7f\xf5\x77\xfd\xe4\xff\xf1\xb7\xff\x33\x7f\xee\x03\xc0\x03\x52\x34\x24\xc4\xce\xaa\xae\x5a\x5a\x35\xd9\x57\xe9\x79\x80\xaf\x18\xea\x7c\xde\x95\xf1\xb3\x54\x64\x94\xaa\x46\x7c\x8c\x99\x7e\x11\x60\x16\x1e\x63\xa7\xe1\x9e\xb6\x63\x7c\xb7\x1c\x2a\xa2\xc4\x21\x6c\x7e\x9a\x76\xce\xac\xee\x89\x23\x3c\x45\x5c\x95\xdc\x28\x0a\x82\x2f\x90\xb3\x65\xf3\xab\xb3\x46\xda\xd0\x61\x4b\x3b\x44\xd7\xc6\xec\xf5\x0b\x18\x13\x75\x04\x9b\xc2\xbe\x08\x26\x67\xd7\xd2\xa7\xd7\x19\x7c\x32\xf8\x3a\x69\xb6\x2a\x63\x7d\xd0\x90\xef\x5c\xc4\x5e\x1c\x6f\x7c\x2e\x4b\xfc\x9c\x66\x54\xc3\x7b\x0b\xa4\x07\xce\xc0\xb7\xf6\x28\xf3\xc1\x9e\x18\x99\x04\xd0\x43\xc9\x53\x11\x1b\xee\x50\x8a\x23\x61\xab\x6a\xbf\x8c\xc8\x67\x38\xf9\xfa\xfc\xf8\x80\xe5\x1a\x9d\x52\x8c\x5e\x5a\xbf\x60\xaf\x4d\x29\x21\xe2\x8e\x1b\x43\xcb\x90\x21\xed\xd1\x9b\x3d\x32\xda\xbd\x20\x6f\x49\x6b\x43\x30\x77\x88\x01\x47\xed\xa6\x74\x0b\xff\x45\x98\x33\xb7\x39\xcc\xc1\xdb\x7d\x06\x41\xf2\x5a\xa4\x24\xb0\x01\x4c\x2a\x47\x18\xde\x45\x3d\xeb\x54\x09\x1c\xc1\x93\xde\x15\x1f\xfa\x89\xef\xb5\x37\xee\x1d\x6b\x94\x03\xd6\x2e\x99\x79\x89\xda\xeb\xcb\x3c\x4f\xe4\x6f\x78\xce\xd4\x1d\x42\xc5\x42\xcf\xba\x71\x48\x1f\xf9\x92\x2f\x16\xae\x02\x79\x1f\xdf\x40\x78\xde\xb9\x84\x1a\xa5\x4c\xfc\x28\x08\x9f\x45\x55\x35\x5c\xc5\xf3\x56\x2e\xe9\x0e\x2b\xf4\xa7\x19\x3b\xd2\x27\x9a\xdd\xa5\x91\x4d\x09\x41\x92\x53\x87\x20\x11\x97\xcc\xfc\x32\xf8\x9a\x02\x65\x96\x60\x93\x83\x39\x90\x59\xd5\x4c\x4a\xef\x00\xdf\x4f\xf6\x4a\x45\x67\xf1\x44\x0c\x55\x58\x13\xa3\x43\x74\x19\x1c\xde\xc1\xa1\x15\x90\xfc\xd0\x6b\x32\x7e\xd9\x21\x4d\x07\x2f\x88\x82\x69\xd5\x2f\xa6\x1a\xd2\x9a\x03\xf3\x33\xc8\x22\x79\xcd\x83\x9f\x67\x51\x02\x47\x99\xad\x38\x01\x25\x08\xc3\x4a\x14\xd0\x2c\x54\xf7\x1e\x09\xf2\xcf\x17\xcc\x9c\x33\x55\x6c\x3a\xd3\x7c\x24\x6d\xb2\xd7\xe0\xb5\x05\x28\xd4\x5e\xa3\xd9\xec\x9e\xc0\xe0\x5a\xb2\x12\x90\x1d\x7f\x0a\xf4\x9c\x7c\xc1\x03\x41\x44\xef\x84\xb2\x82\xcd\x91\xc5\x7c\x70\xc4\x7d\xcc\xad\xe6\x34\x41\xd8\x0b\xa2\xe9\x01\x53\xa9\xc2\xae\xfd\xb1\xe8\x75\xcf\x17\x05\xc9\x1b\x36\x62\x48\x8a\xcc\xd0\x49\x6c\x99\x74\x92\x30\x4c\xc4\xa8\xd8\x74\xd4\xd2\x14\x7b\x81\x8f\xf4\xb0\x9f\x8d\x4f\xbb\xe3\x13\xe5\xa1\xbd\x65\x15\xf3\x67\xf6\x7c\x9f\x31\x6d\xb7\xa3\xf6\xad\x18\xab\xef\xa1\xd0\x06\xad\x51\x7f\x8a\x1d\xaa\x69\xc8\x97\xf3\xc8\xdf\x2f\x40\x41\x31\xcf\x22\x18\xf3\x72\x60\x6e\x85\x23\x66\x92\x04\xa5\xd6\x37\x6a\x11\x04\x08\xdc\xdc\x47\xb0\x37\x04\x42\x4f\x81\x45\xee\x2f\x3c\x84\x28\xa6\x7d\x91\x90\x88\xab\x6f\x5b\x60\x55\x56\xc9\x7c\xec\x32\x88\x5c\xe9\x67\xf3\x6d\x4a\x01\xb8\x76\x96\x6d\x45\x2e\x7f\x85\xfd\x02\x14\x3c\x83\x4e\x0e\x5d\x7a\x3b\xd5\x1c\x42\xc7\x96\x95\xd0\x44\xd9\x7b\x7a\xd0\x32\xd7\x03\xe0\x52\x83\x2c\x30\x97\xe0\x79\xbd\x64\x5f\x30\x73\x31\x0a\x1e\xa3\xcd\x68\x32\x91\xab\x7d\xca\xdd\x9d\x19\xc3\x68\x89\xd8\x4f\x22\xd5\xcc\x86\xc8\x20\x5f\x58\x67\x38\xb8\xd1\xfe\x05\x7b\xad\xba\xc0\xd7\xa4\x86\x5e\x8e\x9a\x7c\xcf\x7d\xbb\xde\x97\x3a\x24\xd4\x92\x65\xbd\xdc\x71\x37\x95\x05\x79\x03\x3e\x6c\xe6\xea\x93\x6c\x86\x55\x87\x57\x95\x41\x5d\x17\x48\xba\x67\x54\x9c\x65\x05\xa6\xec\x95\xe1\xa9\x69\x91\xf9\x32\x61\x41\x0c\x8e\x9a\x65\x54\x6f\x5f\xfc\x17\x86\xc8\x47\x02\x6e\x4a\xda\xaf\x56\x53\xe2\x7a\x4f\x7a\xe6\xd1\x2d\x39\x2b\x69\x0f\x4f\x93\x92\x24\x9e\xf6\x69\xbe\xc3\xc4\xfa\x17\xf3\x8a\xb0\x83\x6a\xf1\x98\x66\x1f\xe7\xa1\xa7\x66\x1c\x20\x0d\xc8\xb1\xa2\x4e\x9c\x68\x47\x03\xc4\xe0\x63\x13\x20\xb2\x6c\xa2\xc4\x27\x84\x8a\xda\x6c\x01\xdc\xdc\x00\x3a\x52\x64\x14\xc5\x1a\xe0\x67\x61\xbc\x9f\xe8\x7c\x3a\x5b\xd1\x2e\x25\x3f\x4b\xa1\xda\x12\xb5\x98\x7d\x31\xd3\x5b\xe8\x6a\x9e\xb8\x94\xce\x5c\xf8\x09\x9c\x4d\xe9\xee\x2a\xdc\xe6\x1d\xd7\x06\xfc\xfe\xd0\xda\x51\x6c\xbc\xb2\x77\x68\xa5\x98\xfb\xa2\x1f\xd1\x58\xb7\x85\x83\x35\xbc\x94\x30\x71\xc7\x81\xbc\xba\x07\xfe\xf2\x00\xd2\x31\x72\x89\x55\xc5\x8a\xe3\x9c\x43\x57\xc3\x28\xb4\x2f\x66\x7a\x51\x4f\x40\xf9\xa6\x36\x64\xb1\x3e\x07\x87\x24\x29\x94\xa7\xd8\x21\xf1\xe9\x8a\x41\x85\xf1\xae\x13\xdd\xaa\xba\x1c\xd2\xda\xf6\x49\xdd\xc9\x0b\x10\x06\xc9\x21\x3a\xb6\x07\xe8\xa4\x98\x3e\x75\xa2\xe8\xce\x8b\x5e\xb5\x88\x8a\x0d\xaa\xc3\x60\x61\xc8\x5b\x3a\x78\xfb\x40\xff\x88\x8a\xfd\x58\x47\x14\x86\x1b\xd4\x9c\x86\xb9\xae\xa7\xe1\x39\xb9\x86\xe5\x77\x51\x6b\xe8\xd1\xa9\x3d\xe5\x59\x51\x9d\xeb\x94\xf9\x44\xc0\x55\x93\xb9\xa6\x0c\x72\xdf\x01\xde\x2c\x71\xed\x16\x36\xc0\xd7\xee\x20\xae\xc2\x01\xd4\x11\xca\x20\xd2\xe3\x1e\x30\xd2\xdd\xfe\x1b\x6f\x29\xe2\xee\x19\x31\x3c\xe3\x15\xa8\xee\x4a\x08\x2c\x15\xbb\x6d\xe3\xcc\x81\x4b\xcf\x2a\x61\xe8\x4a\x66\xfa\x33\xb1\x92\xb6\x37\xfe\xf3\x00\x8f\x7f\x47\xfd\x45\xbf\xe0\x9f\xf8\xb3\xe3\x3f\xfc\x67\xd9\xdf\xf9\x3d\xff\xd6\x7f\x42\x9a\xdf\xf4\xcf\xfe\xe3\xbf\xf3\x8f\xa7\xff\x61\xfb\xdb\xff\xed\xff\xf4\x7f\xfe\x57\xfd\xda\x5f\xf3\xbf\xfd\x00\xf0\xe0\xe5\xb1\xa6\x7a\x1d\x22\x59\x50\x6a\x98\x52\x16\x7d\x14\x97\x55\x38\x4a\xd3\x87\x11\xbc\xba\xb6\x52\xbd\x8b\x9e\x3d\x73\x6f\x5f\xe0\x77\xf8\x39\xd9\x01\x18\x0a\x03\x91\x5d\x49\xa2\x52\x70\xf9\x97\xe0\xf0\xba\x12\x73\x95\x03\x1d\xb8\x69\x4a\x6d\x88\x2e\xb3\x8b\x9f\xf0\x40\xd8\x93\x4a\x88\x07\xe1\xd4\x88\x0e\x26\x55\x0c\x8a\xcb\x28\xb3\xe7\x22\xa2\x7e\x4b\xdf\xec\xd8\x73\x57\xc1\x33\x2e\x2e\xe8\x27\xe6\xb8\xed\xad\x36\x02\x47\x6b\xfd\x21\xfb\x28\x54\x99\xc9\x4c\x2c\xd3\x15\x52\xa3\x45\xb9\xf4\x73\xb3\xf3\x79\xbc\x01\x88\x66\x63\x79\xbe\x50\x06\xd8\x8a\x24\xb0\x23\x17\x6b\xb1\xa6\x46\xcd\x6b\xb8\x8c\xd3\x9b\x28\x48\x0f\x20\x4f\xe3\x8f\x20\xa1\xc1\x80\xa1\x4e\xbd\x43\xf1\x85\x5a\x36\x11\x1a\x3c\x5a\xe0\x5d\x69\x99\x3c\x4d\xc6\xe1\x72\xa2\xf2\xf5\x80\x9c\x5e\x85\x72\x47\x5c\x05\xec\x24\x75\x38\x14\x68\x0a\x2d\x5f\xb4\x51\xb3\x37\x44\xe9\xce\xc0\x4e\x77\x9a\x7c\xa3\x67\xba\x50\x01\xef\x54\x6d\xa4\x9d\xd2\x7b\x83\xe1\xed\xa1\xd4\x45\x7c\xcf\x78\x3e\x51\x94\xdf\xdb\x23\x45\x98\x35\xd2\x66\x08\x65\x9e\x65\x69\xc7\x0a\xbf\x35\xf8\x0a\xde\x89\x0a\x7f\xc1\xf4\xe7\x3c\x17\x93\x67\x68\xfc\x85\xc0\x1a\x41\x6a\xd7\xc7\x4f\xd9\xad\x34\x57\x85\xa7\x33\x82\xb2\x1f\x62\xec\x46\x1d\xcd\x1c\xd3\x09\xea\xee\x5c\x06\x78\xa4\x35\xc1\xd6\x6f\x44\x8e\x29\x6f\xb8\xca\x26\x19\xba\x6f\x8d\xfc\x02\x3e\x52\x06\x1c\x58\xee\x75\x34\x29\xf1\xee\xd0\x4a\x87\x91\xe1\x3d\xc7\xa7\x7c\xb1\x88\xd7\x0f\x1f\xfa\xe1\xd1\x71\x40\x92\x39\x89\xba\x61\xae\x05\xd3\xc4\x60\xe2\xcb\x68\x1b\x08\x33\x7b\x54\x52\xbb\xc6\x2b\xd6\x38\x5f\x80\xc5\xbe\xef\x73\xb0\xa8\x95\x18\x82\x8e\x35\x13\xca\x81\xad\x53\xac\x56\x47\x1c\x25\x2a\xcb\xed\x41\x8c\x07\x97\x19\x77\xca\xfb\x13\x2b\x56\xe8\x8f\xbf\x77\xb0\x97\xe7\x4a\x8e\x1b\x0e\x06\x1d\xd4\xeb\xb0\x7d\x3a\x13\x89\x1a\x09\x56\x70\x84\x2b\xbb\xaa\x8f\xe5\xb9\xe6\x0b\x41\xc6\x09\xc4\x15\xa1\x10\x10\x72\xde\xd6\x35\x6a\x68\x31\x12\x19\x57\x3d\x4f\x3e\x19\x9f\x2b\x89\x84\xda\x26\x1f\xac\x93\xd1\xaf\xfb\x42\x6a\x79\x15\x0c\x58\xf1\x0d\xc9\x61\x21\x73\xd3\xc9\x77\xba\x43\x1f\x6e\x9a\x45\xb7\x72\x31\xf5\x4c\x49\xd2\x5b\x89\x6d\xde\x93\xe4\xbe\xb8\x8b\x3a\xf9\x53\xe4\xa4\xea\xcd\x65\xb3\x59\xb4\x72\x4b\xa2\xa9\xbd\xe5\xe2\x9d\xe4\x2d\x37\xe9\xbb\x57\xf6\xb0\x13\x3a\xc4\xaa\x9f\x8c\x22\x7b\x2a\x74\x0a\x82\x14\xfb\x5c\xaa\x49\xde\x1d\x20\x4d\x83\x5f\x2c\x33\x56\x08\xf0\x9e\x3e\x1e\x35\x62\xef\xea\x99\xbb\x6a\xeb\x17\x2d\xe5\x83\xa0\x5f\x73\x9b\x79\x4e\xbd\x8f\xdd\x27\xc0\x99\x8f\x1a\x2f\x7e\xd4\x7d\xf9\x7b\x6f\x6b\x00\xb8\x47\xc1\xe3\x83\xa2\xf5\x65\x5f\x00\xa4\xc4\x70\xcc\x1b\xf7\x53\x27\x12\x4e\x05\x6f\x8a\x3b\x81\xb2\x71\x39\x9d\x65\x38\x41\xee\xe9\x15\x98\x28\xa2\x76\x92\x1b\xf1\x2f\x5c\xe0\x08\xe9\x5e\x2f\x74\xe1\x3c\x7e\x6c\x87\x5a\x49\x54\x0e\xae\x92\x3b\x8b\xc8\x39\xe1\x84\x07\xab\x44\x9f\x2e\x83\x61\xb0\xd2\xf7\x93\xe9\xb8\x39\xea\xe0\xd6\xb7\x45\xde\x34\x5b\x94\x4d\xe6\x6e\xfd\xc4\x99\x05\x47\x96\x7e\x44\x72\x65\xcd\x97\x00\xd5\xe1\xf0\xf9\xba\x4f\xd6\x38\xa0\x13\x0d\xf8\x53\x19\xdb\x05\xf8\x6c\xd0\x03\x15\xb3\x3b\xc9\x85\x9e\xe1\x61\x9d\x50\x3e\x95\x68\xc2\xe0\x14\x70\xdc\x5c\x3f\xb1\x2b\xb6\xaa\x04\x37\x78\xa9\x90\x0f\x85\xd3\x20\x04\xe1\x25\xba\xce\xc7\xc4\xe2\x61\x20\xc8\xd4\xbd\x5a\x11\x57\x11\xfb\xae\xeb\x9f\x2f\x80\x73\xaf\x49\xc7\x10\x97\x91\x6f\xd4\x94\x01\xfe\xa2\x8b\xaa\x7c\xfa\x43\x16\xc9\xb4\xed\x50\x1e\xe8\x2f\x76\x3a\xb9\x67\x2a\x78\xef\x17\xed\xf5\xe4\x86\x49\x0b\x0b\xa4\x6b\x83\xc5\x97\xdb\xac\x3e\x69\xf4\x54\x6f\x54\xae\x81\xa2\x9f\xee\x79\xea\xf4\x52\xc6\x93\xd0\x0e\x7c\xe0\x40\x41\xe7\xd4\xb1\x9d\xb7\xfb\xa2\xd3\x90\xda\x01\xd5\xb4\xf3\x49\xcc\x2d\x08\x0e\x97\x79\xb0\x9f\x89\xe7\x81\x31\x64\x02\xc7\xc9\x9f\x18\x7f\x2a\x2f\xb9\x86\x7c\xcd\xc4\xec\x3a\x98\x89\x46\x4a\x75\xcb\xc6\x37\x66\x8b\xc7\xb6\x7e\xa9\x67\x2a\xab\x27\xf2\x31\x30\x4e\xea\x17\x40\xd8\x7d\x56\x6a\x81\x99\xa9\xfa\xcb\x6f\x0e\x90\x1d\xe0\xd1\x52\x5b\x3d\x16\x91\x89\x55\x30\x99\x5a\xcd\xa8\x8f\x99\x38\x45\x0a\xf8\xa2\x43\x9c\xca\xd0\xf7\xb5\x7d\x88\xbc\x9b\xea\xb1\x5a\x1c\xc4\xe4\x5e\xde\x7e\x0e\x50\x15\x94\x53\x21\x7d\xc1\xf5\x09\x8c\xad\xcb\x25\x5f\x10\x6d\x39\xa0\xc0\x70\xd9\x3d\xef\x47\x67\xad\xe8\x53\x29\xad\x43\x33\x9c\x0e\x52\x50\x47\x01\x50\xf0\x5a\x48\xb5\xd6\x94\x96\xf8\xf6\x45\x04\xaf\xd3\xef\xf6\x43\xa7\x9e\xd1\x5b\x97\x74\x08\x56\xe9\xc5\xeb\x63\x16\x31\xa9\xc1\x3d\x77\x52\x82\x64\x40\x44\xb9\xd8\x5b\xf8\x17\xaa\x2a\x34\x46\xa2\x10\x59\xe5\x4a\xe8\x12\x76\xbb\x29\x3b\xca\x86\x89\xf2\x11\x48\x19\x2b\x37\x6a\x47\x8a\x36\xe3\x97\x14\x5a\x42\xfd\x39\x39\xf5\x67\x01\x8f\x5f\xfc\xf7\xff\x57\xff\xf3\xff\xe7\xef\xfd\x2f\xfe\x73\x7f\xf1\x3f\xf4\xb7\x7f\xd1\xff\xf5\xcf\xff\xeb\x7f\xe3\x9f\xfb\xcd\xbf\x91\xfd\x29\xfe\xc7\xfe\xc4\xbf\xfc\x3f\xfe\x37\xfd\xb6\xbf\xf5\xab\x7f\xcf\x9f\xf8\x37\x06\x78\x88\x5f\xf1\x0b\xfe\xc6\xcf\xdf\x6e\x25\x7b\xb0\xd3\x9e\x5e\x52\xea\xd3\xe3\x26\x40\x45\x66\xb9\x10\xdf\xca\x91\x47\x1d\x89\xc3\x14\x17\x6c\x2b\x6a\x65\x4a\xa5\xff\x0c\x4e\xf3\xfb\x7f\xe9\xff\xbf\x97\xf7\x0f\x3d\x45\xd4\x02\x9b\x6c\xc7\xb0\x8f\x0c\x05\x6d\x2d\x78\x0a\x14\x48\xce\xf0\x8d\xe6\xac\x77\x61\x99\x1a\x33\x97\x2c\xdc\xf4\x4d\xf2\x47\xba\xb3\x3f\xe6\x53\x58\x00\x8e\x7d\xaa\xca\x96\x1a\xd6\xe7\xf6\x51\xf4\x79\xdf\x55\x49\x89\x4f\x00\x8c\xea\x71\x0d\x69\x36\xea\x85\x8b\x6b\x00\xff\x68\x99\xe4\xc7\x7c\x0a\xe9\x72\x40\x68\x10\xec\x55\xa4\x82\xba\x60\xb2\x06\x31\x30\x48\x8a\x71\xd1\x3a\xf7\x56\xe2\xb0\x79\x35\x41\xfc\xa6\x41\x8b\x7b\x7f\xfc\xa7\x20\xd8\xf1\xca\x8c\x2f\xe3\x96\x05\x9f\xd4\x67\x07\x72\xbd\x5c\xb1\xde\x17\x50\x78\x67\x32\x35\xc0\x8f\x02\xbc\xea\x2c\x06\x7b\xab\xff\xe0\x14\x19\x89\xe2\xd2\x63\x6c\x2a\x0e\x8f\x58\xfc\xc4\xb3\x88\x4c\x31\x1d\xa6\xf8\x51\x33\x8e\xd1\xca\x0e\xae\x38\x82\x15\x0b\xb6\xdd\x1f\x7c\x91\xe7\x0d\x12\xdc\x24\x67\xd4\xdb\xc9\xc7\xce\x69\x5b\x54\x56\xed\xb0\xc1\xe1\xea\x38\x26\x80\xc2\xc6\xcb\xe7\xb6\xf2\x98\x57\x1b\xf3\xc1\x5d\x38\x5c\x2b\x49\x07\xeb\x19\x00\xa0\x1a\xa1\x0b\x95\x53\xa7\x35\xed\x5c\x26\x24\x50\x8b\xed\x51\xfc\x5d\x3c\x6c\x33\x57\xd9\x3f\x72\x32\xfa\x31\x9f\x62\x29\xfa\x78\x0a\x6d\x42\x68\xef\x6d\x70\x0c\x06\x31\xa8\x1d\x29\x50\x8a\xc5\x72\x31\x8f\x7a\x35\xd4\x74\x4f\xe1\x01\xf5\xf9\xa8\x0f\x4e\xc1\x51\x7d\x6a\xe4\x1b\xdb\xf4\x22\x43\x0f\x94\xd1\x01\xbf\x36\x89\x31\x3c\x21\xdc\x21\x4c\x6b\x0b\x1b\xdf\xba\x3c\xfc\x2d\xc4\x88\x0f\xfe\x0b\xa4\xce\x5b\x6d\x9c\xea\xc8\xdc\x85\xcc\x7b\xc8\x92\xe8\xca\xf2\x8a\x68\x83\x88\xd1\x57\x19\x4b\x16\x24\x1f\x23\x80\x08\xb1\xa7\x0f\xee\x62\x57\xdf\x72\x00\x82\x41\xde\xa9\x9e\x0c\xdd\xe5\xc5\x32\xb2\xa7\x50\xc8\x63\xea\x6c\x1b\x74\x6d\x1d\xe7\x67\x23\x0d\xe9\xac\x1f\x9c\x82\x4e\x0c\x1e\xd5\x83\x88\x44\xaa\x92\x42\x0b\x1e\x85\x44\x39\xa5\xe4\x2a\x1a\x82\xf4\xdd\x57\x96\x90\x2f\xcf\xf4\x08\x14\x8a\xea\xfa\xe0\x2e\x9e\x2b\x6d\x7f\xe7\xb3\x3a\x77\xec\x87\x7e\xad\x9d\xb4\x49\x50\x62\x6f\x6a\xa4\x97\xb7\x7a\xf7\xf6\x5e\xf2\xda\xca\x3d\xa3\xa0\x26\x3f\xb8\x8b\xec\xb9\xce\xa5\x8d\x17\xc5\x01\xcd\x21\x6d\xf8\xb6\x1c\x89\x39\x8e\xb3\xba\x35\x82\x4a\xe2\x6d\x55\x6b\x9b\xc2\x9e\x3a\xe3\x8f\x46\x91\x7f\xcc\x77\x61\xee\x0e\xcd\x6f\x6e\x01\xf7\xd7\x45\xe2\x6a\x23\xe1\x8c\x3a\xd1\xe3\xa7\x19\x89\x41\x15\xac\x7a\x85\x77\xed\x0d\x63\x5c\xc3\xbe\x88\xe0\xb2\xb1\xcc\x4d\x2f\x52\xac\x1a\x2f\xab\x07\x3f\xde\xbd\x93\x8f\x58\x08\xb9\x30\xa1\x47\xa3\x2b\xdc\xc6\x9a\x91\xfc\x22\x64\x0f\xf8\xe0\x8b\x80\x43\x87\xf4\x5b\xba\x26\xf0\xd9\xab\x53\x3b\x85\x0a\x20\xaa\x36\x9a\xd4\x0c\xdd\xbc\x5c\xcf\x4a\x41\xe9\xe0\xb6\xd7\x14\xfa\xc1\x17\xa1\x0f\xde\x93\xf4\x1d\x9b\x53\x3a\x0d\x6d\x9b\x56\xf0\x62\x6a\x90\xbd\x62\x17\x1d\x64\xc3\xc4\x33\xd3\xba\xf7\xd6\xe2\x0a\x13\x3d\x5f\x44\xf0\xd6\x86\x4d\x65\x03\x68\x0b\x95\xf8\xb0\x54\x04\xef\x0a\x62\x16\x5c\xbf\xcb\xdf\xa9\xfb\xb1\x1e\x33\x88\x53\x16\x17\x6b\xfb\x41\x7d\x41\x73\x64\xd7\x5f\xcb\xde\x17\x56\x6d\x51\xae\x2f\xcf\xb1\xac\xe4\xfd\x33\xa2\x01\x5c\xbd\xf9\x9a\x49\x8e\x23\x97\x4b\x54\x67\xbf\x5f\xbc\x91\xf0\x66\xe6\x94\x18\x67\x2d\x84\x32\x3b\x30\x42\x89\x8c\xb2\xe5\xd9\xe2\xec\x34\x78\x2a\x57\xa6\xce\xb0\x82\x3d\x44\x7f\xda\x8f\xda\xa8\x1f\xf3\x5d\x14\x7f\x1f\xe7\x07\xa1\xaa\x6d\xe0\x31\x14\xf7\x95\x4f\x86\xe1\xe9\x3c\xb6\xfd\xd6\xab\xa6\x75\x4c\xf2\x70\xfb\x89\x56\x87\x52\xcb\x07\x77\xa1\x4c\x8a\xb1\x92\xab\x94\xe2\x2b\xaf\x9d\x2f\x4b\xac\xe0\x52\x06\x79\xd9\x0b\x4a\x45\x55\xb5\xce\x28\x50\x21\x11\x3a\xaa\xfa\xd1\x52\xe2\x8f\xf9\x14\x8d\x26\xdd\xf3\x7c\x3d\x14\x29\x60\x21\xf8\x29\x64\xb4\x95\xe4\xe4\x53\xce\x82\xe4\x89\xd8\x52\x04\x9e\x37\x4a\x7b\xad\xd0\xee\x8b\x97\x9a\x91\x43\x7e\x07\x2a\x2b\x84\x85\xf7\xc4\x19\x98\x8d\x16\xf1\xfa\x2b\x43\x06\x26\xf0\xc4\xba\x30\x45\x1d\x2a\x4a\xb1\x39\xb9\xf0\xc1\x5d\x74\xf8\x6a\xba\x22\x67\xab\x2a\xf2\x4a\xe9\x47\x7d\x9d\x78\x42\xd0\xd7\x69\x8c\x70\x31\x1b\x89\x69\x77\x05\xa5\x5e\x1a\xb3\x7e\x3e\xc8\x66\xe4\x96\x8b\x6f\x92\x66\x54\x92\x49\xf7\x72\x9b\xc6\x4f\x35\xf9\xe5\x6f\x8d\xb9\xfd\xf0\x8f\x7a\x44\x4e\x76\x89\x58\x46\xe7\x16\xb5\x7f\xf1\x45\x42\xd9\x66\x65\x40\x9e\xea\xea\x63\x3b\xa0\xcc\x28\x28\x43\x5d\x22\xaf\x32\x7d\x4f\x8d\xb9\x42\x8f\x6e\xcb\xe8\xca\x3b\xf9\xd1\x74\xdc\x8f\x3b\xa7\x4e\xbe\x1f\xd6\x08\x40\x7c\x83\x71\xc5\x85\x4f\x25\x77\xd1\x3d\x8b\xd8\x79\xc4\xdd\x85\xaf\xcf\x92\xb0\x15\x0c\xa8\x31\xce\x7d\xd1\x21\x2a\xae\xcc\xc0\x33\x1e\xc0\xf1\x91\xae\x1d\x91\xb1\x3f\x47\xf8\x37\x47\x30\xbb\x51\xcb\x0e\x42\x41\xd2\x76\x31\xb7\x76\x7c\x7f\xe4\xa7\xf4\x63\x3e\x85\xc9\xb7\x44\xa6\x49\x2e\xa1\x42\x87\x8a\x36\x4b\xfa\x8e\x1e\x8b\x66\x90\x4b\x3b\x7f\x7d\xa8\x51\x2f\xf6\xd2\x94\x45\x1c\xf9\xc1\xff\xbf\x53\xfc\x2c\xe0\xf1\x97\x7e\x02\xff\xde\xff\xf7\x1f\xfe\x3f\xff\xb1\x7f\xff\x7f\xe7\x0f\xfd\x85\xff\x9c\xfc\xd3\x7f\x47\xfd\xfe\x7f\x80\x7e\xf1\x5f\xfa\xa5\xe6\xdf\xf6\x87\x7e\xe5\x2f\xa8\xff\x93\x7f\x81\x7d\x00\x78\xa0\xb8\xa5\xe8\xc5\x46\xb4\x07\xa4\x65\x39\xb9\x97\x3b\x32\xa8\xde\xac\x86\x77\x60\x64\x18\x23\x17\xb9\xc3\x47\xef\xc9\x2e\x5f\xbf\xf8\x91\x56\x9a\x16\x56\xe5\xc1\xa1\xc4\xcf\xc4\x08\xae\xad\xe0\xa9\xaa\x22\xa9\x75\x95\xe6\x56\x41\xea\xda\x6c\x9d\xc4\x96\xf3\xff\xb5\x07\xfb\x31\x9f\xa2\x2a\x15\x0a\x13\x62\xab\x11\x68\x97\xf2\x86\xa9\x1a\x79\x26\x2b\x9e\xa0\xb7\xba\xda\x4f\x3b\xa6\x36\x1b\x83\xc4\xdd\xf9\xf9\xa3\x95\x96\x1f\xf7\x5d\xe4\xf3\x5c\x42\x1f\x9d\xf0\x1d\xd7\xfa\x06\x86\xab\x97\xac\xe9\xda\xe3\xc3\xee\x82\xe1\x2a\x91\x6e\x2b\xe1\xc2\xb8\x1d\xa2\xd0\x0f\x4e\xa1\xb1\x77\xcd\x17\x87\x46\x7e\xfd\x4b\xdb\x85\xa0\x5d\x18\x85\xd8\x63\x18\x28\xb9\x2a\x10\x2b\x5e\xe1\xf1\x8f\x2a\x1c\xc7\x7c\x3e\x78\xda\xe4\xd1\xde\xe3\x8b\xac\x40\xb0\xc1\x24\xf8\x8a\xf3\x42\x2c\x1f\x52\x2a\xb2\x24\xb9\x46\xdc\x0e\x39\x5c\x61\x87\x17\x8b\x6d\x5a\x3e\x28\xda\x29\x9f\xb6\xd0\xed\xe5\xea\x6e\x58\xd3\x9c\x7d\xcd\x46\x3a\x74\xe1\x9e\xb2\xa3\x10\x3c\xbe\xc1\xff\x90\x9d\x1d\x3b\xca\x2c\x72\xcd\x17\x25\x62\x47\x0d\xba\xa8\xca\x35\x8e\xf3\x91\x8f\x77\x00\x40\xd8\xf6\x2c\xfe\x30\x52\x9f\x27\x47\xce\xdb\x6e\x8f\x9b\x63\x57\x52\xe3\x8f\xf0\xfe\x1f\xf3\x17\x29\x6e\x05\x59\x09\x0e\xef\xe1\x7e\x96\x85\xfd\xeb\x84\x25\xe5\x3a\x05\xd0\x2b\xa4\xee\xcf\xec\x93\xbb\xc7\xe3\xa3\x99\x04\xfe\x93\x97\x0a\x2b\x24\x94\x35\xaf\xe8\x65\x14\x2d\xa0\x90\xc5\x8c\xb7\x25\x4c\xe8\xe5\xc5\x36\x35\x65\x0b\x13\xa1\x05\xc6\x49\xf7\x83\x80\x2f\x0a\xd5\x99\x54\x8c\x6b\x3a\xc8\xcb\x02\xbc\x6b\x07\x7c\xa3\x9a\x97\xa4\x97\x48\x41\x58\xf3\x7a\x20\xbd\xae\x62\x96\x1d\x13\xb0\xe2\x7e\x51\xa8\xea\x4b\xa9\xe3\xcb\x5c\x6b\x3d\x67\x39\x10\x3c\x34\x79\x41\x0d\x5e\x2c\xdd\xa8\xba\xc3\xb2\xb2\x1f\x04\x8c\x36\xa5\x14\x94\xec\x07\x11\x9c\xd6\x20\xda\xc9\x21\xd0\xa0\xc8\x9b\xd2\x45\x62\x2b\xb6\x80\x7d\xda\x23\x33\xdc\xaa\xd7\xe8\xe1\xb8\xeb\xb1\x08\x07\x06\xa8\xf7\x5f\x94\x88\x63\x02\xfa\x3a\x25\x75\x99\xcc\xcd\x30\x70\x08\xfb\x71\x64\x35\xbe\xdf\xca\x5d\xb6\x49\x81\x9d\xb4\xde\x1b\x6f\x88\xd6\x52\xee\x8b\x37\x02\xc4\xeb\x98\xdc\xb5\x0b\x35\x82\xe3\x4f\x0e\x32\x9a\x20\x12\x27\xa6\x03\xea\x1c\x46\x59\x15\xb8\xa6\x90\x83\x89\x00\xcb\x63\xd8\x07\xa7\xb0\x57\xd2\xce\x92\xc7\x65\x5b\x39\xc3\x5c\xd9\x90\xf4\x42\xf0\xf0\xe0\x21\x49\x14\x86\x87\xe7\xc6\x21\x69\xd2\xd6\x78\x27\x7e\xbe\xc8\x23\xe8\x51\xd2\x45\x9e\xe1\x9b\x0f\xc5\xbc\x19\x77\x08\x3e\x02\x21\x23\xb2\x3b\x71\xaf\x10\x14\x4f\x1e\x94\x02\x74\x51\x93\x62\xf6\xc1\x5d\xd0\xbe\xc8\x53\x0f\x68\x6a\x3c\xe2\xdd\x5d\x0f\x01\x7d\x6a\xb1\xd9\xc3\x7a\xf3\x54\x4a\x0e\xb5\x24\x78\x87\x57\xa7\x8c\x61\x82\xee\x03\xb0\x98\x56\x9b\xb5\x4b\x26\x17\xc3\x23\x9b\x48\x0b\x65\x71\x5d\x09\x21\x0c\x84\xf6\x4f\xcc\x95\x6c\xe2\x92\x01\x82\xf6\xb0\x9b\x52\xfe\x0b\xb0\xf8\x98\x58\x71\x06\x1a\x44\x0e\x72\x1a\x5d\x44\x0f\xa1\x2e\xf6\x87\xee\x8e\x07\xde\x83\x97\x55\x16\x4e\x6c\x2a\xe9\x21\xbe\xf8\xfe\xc5\xdf\x89\x22\x91\xad\x17\xa6\x89\x61\xe9\xc8\x81\xcb\x36\x8f\xd5\x99\x32\x58\x37\xad\xcb\xd3\x89\x04\x0f\x56\xbc\x56\x33\x51\xa7\x39\x1f\xc4\x4e\xfa\xae\xed\xb0\xf5\xc7\x59\x5e\x39\x39\xf2\xd8\x6d\xc4\xec\x4a\x49\x24\x06\xb6\x4f\x7d\xee\x6b\xb6\x15\xa6\xe7\x8e\x5c\x91\xde\x7f\x01\x59\x1f\x12\x9d\x17\x16\x04\xc7\x29\x04\x21\x44\xf0\xb0\xd7\x4c\x04\x4d\xcb\x14\x75\x8c\xa9\xa0\x92\xd6\x62\x40\xa2\xb9\xce\x5d\xda\x17\x75\x67\xf5\xcf\x55\x33\x28\x54\x1e\x72\x5f\xe1\xf5\x5a\x1d\x45\x2e\xdc\x6b\x06\x1a\x70\xf2\xae\x21\x6d\x3a\x40\x5d\x8b\x68\x0c\x66\xf2\x05\xd4\x50\xf7\xed\xd8\x51\xdc\x56\xd6\x70\x77\x3b\x21\x5e\x69\x56\x5f\x6f\xe8\x06\x4b\x23\x3a\xdc\x4c\xf1\x30\x01\x22\xef\x7b\xd4\x3a\x5f\xdc\x05\xe6\x92\xdf\x19\x37\x31\xb2\x83\xfb\x28\xdd\x6c\xe9\xc8\x2a\x4c\xc4\x86\x13\x19\x97\x47\x9a\x4c\xc7\xf3\x98\x15\x10\x3a\xed\x0b\xea\x93\xf8\x6d\x97\x54\x95\x00\x09\x1c\xe7\xf9\xc9\x59\x98\xb0\x11\x6d\x46\xd1\xda\x0d\x9d\xee\xe1\xd7\x07\x3e\xa6\xa0\xa1\xb7\xa3\xee\x17\x14\x57\x1e\x2f\x73\x27\x6d\xb0\xba\x02\xbb\x66\xd6\x34\xa4\x0f\x1d\xc5\x83\xba\xea\x26\xd4\xbe\xcd\xb3\x20\x50\x08\xab\xc0\xa1\xde\x4f\xf2\x48\x7f\x76\x9b\x84\x1a\xba\x9d\x14\xa5\x57\x60\x5c\x0b\x95\xee\xe8\x5d\x1d\xd1\x3d\x97\x29\x92\xf5\xdb\x6b\x0b\x44\x13\xe7\xe9\x17\xfd\x08\x05\xdc\x84\xe2\xbd\x87\xce\x60\x34\x49\x07\xb5\x3b\xb7\x80\xca\x6f\x2e\x55\x74\xc1\xd6\x10\xe7\x38\x82\x3d\xd9\x83\x77\xb6\xda\x07\xf0\x3d\x61\xec\xea\xa2\x32\xa5\x21\x66\x00\x97\xea\x4b\xc7\xfd\xd4\x70\x33\x02\xf4\x96\x31\x2b\x88\x31\xbf\xbe\x42\x5c\x19\xf7\x9b\x94\x0f\xde\x08\xbd\x7e\x10\x47\xd6\x88\x2f\xc5\x37\x7a\xf2\xa8\xbc\xa6\x56\xf0\xd9\x24\xea\x48\x97\x7c\x91\x49\x1d\x55\xf1\xf8\xf5\x4c\x40\x73\x65\x3f\x0f\xf0\xf8\xe5\xff\xe6\xbf\xf9\x1f\xf9\x77\xcd\xff\xbb\x0e\xff\x81\x9f\xfa\xf3\xf7\xcf\xfc\xcd\x7f\xcf\x4f\xfd\xe3\x7f\xfc\x4f\x8b\x5f\xf7\x27\xff\xd6\x6f\xfa\xaf\xfc\xfa\xff\xd9\xaf\xf8\x25\x7f\xe0\x0f\xfd\xf8\x01\x0f\x32\x29\x85\x78\x88\x44\x48\x07\xf0\x84\x77\x88\x1c\xa8\xdf\x09\x1e\x83\xe6\xab\xd2\x0d\x39\x3d\x47\xd5\x3b\xc6\x31\x8b\xa2\x4d\xbf\x98\xf0\x48\xaf\xeb\x3d\xaf\x37\xf0\x7e\x67\x85\x41\x8b\x46\x14\x55\x41\x5f\xf7\xae\x42\xfa\x90\xcf\x3e\x9a\x66\x57\x53\x1a\x21\xae\xf7\x7c\xc0\xe4\x13\x6f\x06\x4b\x59\x0a\x6a\x16\x0b\x81\x2d\x77\xec\xfb\x3e\xc9\x60\xc0\xa2\xaa\x39\x99\x81\x79\x65\x51\x81\x29\x00\x18\x86\x61\x36\xbf\x98\x76\xa1\x36\x09\xd6\x66\x84\x87\xe1\x68\x42\x3e\xf7\x74\x95\x04\xbe\x3a\xa3\x2c\x5e\x7d\x46\xe8\xc9\x5c\x93\x16\xf5\x2f\x56\xfd\x7c\xd1\x5e\x5b\x75\x3b\xec\x46\xeb\xad\xb0\x56\x39\x7b\xac\x82\x4f\x8a\xdb\x47\x4b\x48\x37\x59\x93\x81\x8d\x64\x9c\x8b\xe2\x5e\x9c\x60\x9f\x14\xed\x3b\x3d\x74\x3c\x14\x19\x86\x51\x18\x43\x42\xf6\x86\x25\xca\x29\x3b\x1c\x1a\x86\xc1\xfe\x79\xa8\x4e\xd9\x18\xe8\x25\xee\xb6\x9a\x2f\xd8\x6b\xb0\x38\x68\x8d\x68\x13\x8e\xe6\x8d\xe1\xfe\x48\xaa\x06\x1e\x62\xac\x99\x6a\x5b\x04\x7a\x81\x10\x7c\x76\x49\xea\x2c\x39\xc6\x89\x5f\x4c\x78\xe4\xad\x9e\x60\xe7\x99\x36\x1f\x3d\x76\x9a\x88\x80\xb4\xd6\x4c\x32\xc8\xba\x9e\xa7\x95\x15\x5d\x59\xdc\x24\x91\xd2\x43\x0a\xff\x02\x6a\x60\x9b\x30\x47\xda\x70\xc5\xb7\x63\x4d\x33\x3d\x19\x05\xd5\x52\x53\x30\xb3\xb5\xc0\x11\x71\x0f\xb8\x7b\x99\x0a\x9b\xf6\x83\xbf\x60\x6c\xc9\x0e\x2b\x3a\xa0\x19\x72\x0b\xca\xe8\x79\x3b\x2b\xe9\xc5\x46\x69\xa6\x0a\xbd\x9e\x4c\x60\xa5\xa3\x9e\x98\xfc\x23\x9c\x6e\xf7\x13\x8c\x9b\x53\x44\x77\x5a\x36\x17\x1f\xe6\x4c\xfc\x9d\x7c\x6d\x0b\x02\xf6\xaf\x9f\x92\x28\xe6\x89\xdd\x50\xf0\x3e\x12\x2c\xd3\x2d\xc3\x3f\x68\xaf\x69\x01\x6e\x9e\x7e\xd4\x41\xb4\x9a\xe0\xf7\xba\x3e\x11\x46\x9b\x39\xc1\x58\xb6\xcb\x34\x54\xef\x33\xd4\x7a\xf8\xee\xc6\xbf\xa9\x7e\x01\xfe\x50\xd9\xe4\xdc\x2c\x2a\x1f\x15\x60\xd4\x20\x37\xb9\x8d\x15\x12\x0a\xb1\x1e\xb3\xec\x95\x2b\xb3\xe4\xbd\x07\xd4\x4c\x9f\x70\xfb\x07\x3c\x10\x79\xa5\xb1\x2d\xce\xa3\x1a\x52\x0a\x3c\x8a\xd8\x67\x21\x2a\x2d\x09\xdb\xdf\xdd\xda\x12\x2c\x1e\x52\xf1\x89\x6f\x12\xb4\x60\x4e\xbf\x78\xa9\xd6\x43\xac\xae\xb3\x47\x82\x73\x4e\x5d\x99\x14\xd3\x6f\x57\x58\x4b\x5d\x91\xb5\x26\x91\x06\x66\x74\x40\x41\x76\x32\xb5\xae\x7e\x51\xb4\xbf\x10\x3e\x55\xdb\xb4\x2c\x8a\x41\x10\xe1\x84\xe9\x51\xd7\x91\xbd\xce\xa7\xfb\x2e\xd4\xc9\x08\x70\xda\x83\x43\x15\x99\xa6\xbf\xc8\xa9\x94\x90\xc5\x66\xe8\x31\x04\x39\xa4\xe6\xca\x94\x8d\x38\xd3\x50\x5c\xcb\x0c\x8e\x12\xaa\x0c\x86\x20\x71\x73\x8b\x6c\x66\x71\x3d\x5f\xe4\x54\x70\x08\x9f\x10\xc8\x6a\xd2\x0a\x1b\x66\x91\x68\x7f\xbc\x7f\x41\xcb\xe4\xbe\xea\x9e\x94\x86\x70\xc0\xad\xdd\x0e\xc7\x27\xb4\xf6\x05\xad\x43\x34\xb1\x83\x8b\xc9\x1c\xc2\x3e\x43\xeb\x47\x63\x64\x8c\x19\x8c\xa4\x9d\x4c\x85\xf2\x48\x00\xa9\x5b\x51\xf1\xa9\x25\x4c\xcb\x17\xf3\x47\x2c\xc2\x09\x9f\x6e\x85\x67\x04\xbd\xb1\x77\x0b\x4d\x12\x75\x6d\x05\x73\x42\x56\x30\xa5\x06\x3b\x66\xd8\xd3\xb2\x8f\x26\xa2\xf3\xc1\x34\x2d\x81\xad\x9d\x27\x78\x7f\x1a\xd9\x84\x8d\x8b\xec\x63\xd7\x93\x91\x73\x12\xb8\x27\xe4\xc3\x8a\xd8\x1c\xce\xee\x85\xa6\xfe\xa0\x4c\xbf\xc8\xec\x55\xd5\x23\xa9\x58\x87\x27\xa4\xba\x7e\x50\x19\xe7\x91\x11\x16\xfd\x52\xc6\xc9\x73\x45\x6c\x47\xb4\xd0\x25\xc4\x14\xc5\x1e\xbe\x98\xad\xa0\x26\xcd\x1e\x59\x81\x09\xc4\x18\x34\x0e\x03\x3d\x8f\x42\x84\x04\x1a\x2e\x50\x7e\xd3\xf1\x18\x4e\x15\xf0\x98\xc9\x17\xf2\xde\x7f\x0e\x57\xfa\x63\x6c\x6c\x2b\xea\xb4\xb7\x89\xef\xc2\x0f\x4f\x35\xbc\xad\xaf\x6a\x6f\x6d\xd4\x92\x4c\xba\xac\x57\xea\x44\x0e\x4f\x02\xed\x30\x9d\xed\x9f\x50\x19\xcc\x6a\x84\x5d\x91\xf6\x00\x88\x02\x63\xa8\x13\xf7\x4e\xfa\x22\xe6\x53\x69\x9b\x8a\x59\xfd\x2a\x19\xc2\xe2\x5b\xa3\x24\xd0\x2f\x00\xd2\x81\x5f\xcd\xa1\xc0\xe3\xbe\xa8\x3c\x42\x7b\x90\x48\x3c\x2a\x07\x32\x55\xb7\xdb\x43\x50\x62\x48\xe2\x09\x49\xbd\xfb\xd1\x2b\x90\x2f\x80\x30\xec\xab\x1e\x4b\x0f\xed\xa7\xb7\xc6\x2e\x6f\x72\x13\xf5\xc2\xa1\x0e\xf3\x9c\xae\x52\x29\x70\xb8\x41\xf6\x20\x90\x19\x57\xf2\x8b\x6c\x46\x59\x25\x9c\x64\x9c\xc0\x4c\xee\x16\xe0\x25\x2a\xb8\x76\x53\xc1\x13\x4a\x40\xb2\xd0\x0a\xf7\xce\xef\x44\x72\xf6\x25\x62\x06\x9f\x54\x39\x7e\x2c\x79\x66\x91\xdd\x25\x23\xd2\xe0\x78\xc7\x37\x0c\x47\xfd\x0c\x68\xc8\xf4\xe6\x7e\xa3\x3b\xe2\x31\x58\xc4\x51\xe1\x05\xe5\x83\x99\x5e\x82\xfd\x39\x59\xed\xc0\x89\xb2\x94\x1a\x11\x7c\xc4\x81\x40\xbe\xd6\x19\xf9\xc8\x6d\x25\xde\xd1\xd2\xe8\x17\x78\x09\xf1\x06\xf0\x4f\x80\xf3\x66\x72\x2a\xa5\xe1\xe9\xda\xe6\xf6\xcc\x02\x07\x99\x0f\xc4\x28\xb2\x3b\x5f\xd3\x1e\xef\x06\x26\x12\xdf\x13\x50\xb7\xb5\x9c\x2f\xa6\x69\x6f\xe8\xf1\xbe\xa7\x1b\xae\x10\x1c\xd5\x31\xcd\xf6\xfb\x6a\xe5\x00\x4c\x58\x12\x18\x75\x31\x2c\xdd\x86\x72\xb3\xeb\xad\x0f\xf5\xf1\xe7\x01\x1e\xbf\xe5\x4f\xfc\x0f\xfe\x53\x3f\xf9\xbb\xfe\xcc\x6f\xfb\x65\xf6\x9f\xfa\x55\x7f\xed\x27\xfe\xc9\x5f\x57\x7f\xe2\x5f\xfe\x85\xef\x5f\xfc\x5f\xfc\xc6\x3f\xf7\x2f\xfc\xb2\x7f\xf2\xbf\xf4\xa7\x7e\xd3\x3f\xfb\xc1\x84\x87\x23\x8e\xe7\x7c\x05\x07\x35\x2b\x20\x17\x07\xf5\xaa\xbd\x5e\x19\x2f\x0e\x13\x2f\xc6\xa9\x09\x62\xc4\x57\x02\xa5\x0e\x8b\x96\x7d\x10\xe6\x68\x80\xaa\x7b\xbb\x94\x4e\xb9\x6f\x0c\x30\x38\x55\x20\x38\xa3\x0e\xf7\x20\xfa\x43\x2b\xc5\x56\x59\xa5\x17\xdf\xe2\x3b\x67\x7f\xda\x17\xf8\x5d\x86\xfd\xad\x2b\xd7\x25\x70\x4c\x90\xfb\xa2\x34\x6b\x0f\x1b\x14\x4f\xe1\x97\xad\x63\xb2\xe7\x45\x7e\xed\x94\xca\x81\xb0\xa9\x2f\xc2\x1c\x15\xf5\xff\x43\xdb\xbf\x85\xfe\xff\xfd\x7b\x81\x90\xa4\x76\x20\x37\xdb\x2c\x6b\xdb\x45\xe1\x4e\xb3\x24\x77\xb5\x4e\xaf\xc0\x2b\x41\x2b\x29\x2c\x4b\x09\x3b\x68\xeb\x7c\x3e\xaf\xf5\x5a\x07\x4b\x43\x77\xe0\x85\x5a\x99\x17\x45\x37\xd1\x46\x4b\x2a\x28\xc3\xca\xed\x21\x28\x76\x06\x8a\xe4\x38\xc2\x30\xe0\xc8\x0c\xe8\x78\xa1\xcc\x89\x39\x38\x32\x3a\xfc\x36\x23\x08\xff\xdb\x79\xdd\x7e\xf9\x5e\xbc\xf9\xbc\xd6\x7a\xae\xe7\xf3\xf1\x7c\x1c\x90\xab\x97\xc2\x29\x6e\xd4\x13\x22\x68\x50\xe7\x91\xda\x3c\x37\xc6\xe5\x49\x65\xb7\x50\x02\x9d\xc3\xc8\x7b\xbb\x8d\xf7\x93\x6d\x14\xd8\x68\x5f\xd5\xa9\x68\x6c\xd9\xd1\x79\xd1\x72\xb9\xf8\x3a\xb8\x32\xcf\x20\x71\xdb\x1e\x50\x8a\x00\x0e\xed\x45\x6e\x59\x96\x7f\x81\xeb\x22\x85\x76\x53\x80\x2e\xcf\xf5\x11\x2f\x1a\xd5\x72\x5a\x82\xd2\x38\x34\x07\x99\x11\xce\x1c\x6a\x3a\x31\x48\x72\x7b\x3b\x89\xf0\x8b\x47\xf8\xed\x00\xd6\x5a\xc3\x7b\xb7\xf3\x16\x8a\xc5\xea\xa0\xbc\xd7\x32\x26\x77\xf1\x51\x90\x76\xbd\x77\x29\xc8\xc1\xb2\x8a\x9f\xd5\x7e\x31\xc0\xb8\x56\x1e\x61\xd6\xa6\x79\xbe\x31\xf9\xad\xe8\xa3\x8b\xee\xe2\x8d\x00\x85\x89\xf8\x63\x86\xda\xb4\xdb\x07\xea\xa4\xda\x10\xf1\x0b\xfa\x2d\x0d\x03\x45\xac\x28\x1a\x2f\xb2\xba\x12\x41\xf8\x8b\xf0\x16\x09\xa9\x07\x32\x1f\xcb\xd0\x3e\x0a\xec\xba\x2a\xa2\x26\x7e\x68\xa8\x5f\x8c\x51\xf9\x2d\x04\xb2\xf8\xa0\x72\x90\xf5\xe0\x54\x93\xd1\x7d\x25\x8e\x6b\xea\xc9\x78\x45\x17\xf3\xfb\xf6\x9d\x31\xaf\x7d\x04\x36\x3e\xe1\x1f\xe1\x3c\xc7\x43\x1c\x13\x28\xf3\xf3\x82\x6e\xf4\xb9\x37\xba\x44\x35\x7c\x1e\xd9\xde\xbc\x4a\xee\x0f\xf5\x6c\x61\x16\x07\x5a\x83\x7d\x01\xd3\xae\x15\x16\x62\x23\x53\xb3\xc7\x1b\xd1\x83\x4a\x15\xa7\xa9\x99\x1d\x52\x8c\x94\xc6\x26\x45\xd4\xaa\x51\xcc\x88\x66\x5f\x23\xbf\x60\x78\x50\xee\x1d\x1c\xc6\x6e\x54\x9d\x6b\xf3\xca\x05\xce\xd3\x93\x2d\x88\x6e\x07\xc6\x68\x6f\x5f\xaf\x40\xfc\x44\x35\x4c\x74\x13\x7a\xfb\x05\x04\x15\xe4\x8d\x8f\x48\x8f\xcb\x69\xbe\x75\x20\xba\xf8\x24\xc2\x95\x4a\x3b\x9f\x63\x2b\x29\x17\xbe\x78\xb9\x27\xd3\x94\xaa\x35\xeb\x8b\xaa\xc5\xc6\xab\xec\x0c\x09\x49\x22\x01\xce\x89\xcb\xca\xc7\xac\xd2\xbe\xd3\xa6\xb7\x8b\x11\x85\x86\xac\xd1\x75\x54\x7f\xfc\x95\x97\xb3\x2f\x4e\xa7\xc1\x58\x0f\xf0\x90\xfc\x1a\x39\x5e\x95\xe5\xea\xfe\xbc\x00\x25\xa0\x06\x7b\x7b\xcd\x17\x3a\x96\xae\x3d\xd0\xee\xbb\xc4\xa3\xc4\x17\xcc\x1f\x0f\x9a\xca\xec\x8d\x45\x6a\xed\x71\x66\x92\xbf\x7b\xbd\xa9\x34\xb5\x5f\x53\xde\x86\x2f\xd4\xa2\xe0\x42\xfd\x40\x16\xad\x8d\xf8\x17\x6f\xaa\x01\x83\x8b\x6c\xa9\xf1\x80\x34\x3d\x9a\xbd\xf9\x22\x40\x40\xb4\x36\xbe\x60\x46\x34\x38\x78\xa2\x2f\x03\xd1\x27\x93\x9e\xdc\xfd\x82\x1c\xfe\x2a\xfd\xa4\x97\x38\xc4\x81\xa2\x11\x68\x93\xb2\xc3\xd4\xb4\x41\x0e\x4c\x4c\x12\xb5\x15\x20\xc9\x27\x42\x67\x2f\xeb\x62\xf1\x89\x8c\x23\xd9\xac\x10\x79\x2d\xe1\x12\x2b\x00\x5b\x05\xed\xa9\xb0\x5f\xd5\x9f\xbb\xfb\x9a\x40\x3f\x20\x22\xfb\x06\x8d\xe8\xe8\x27\x7f\x22\x13\xa5\xe2\xe1\xed\x59\x1b\xdc\x2d\xd3\x6e\x7b\x42\x48\x77\x5a\x9d\x84\xdd\x6c\x9e\xa8\x22\x04\x0a\xb5\x8d\x37\xc2\x22\x4e\x1d\xc9\xf1\x41\xbd\xa0\xc7\x3e\x2f\xcf\xdb\x2c\x2f\x21\x41\x77\xec\xc2\xc7\x54\xc2\x81\x5e\xb9\x71\x0e\xa8\x5c\x82\x5d\xec\x01\xed\x3d\xf8\x40\xc6\xc4\x17\xbb\xd2\x43\x9d\xce\x9b\xf7\x3c\x06\xb5\x03\xcb\x20\xda\x1c\xa3\xbb\x42\x11\xdf\x57\x59\x56\xfa\x8d\x63\x45\xe6\xde\x35\x13\x3c\x4a\x7c\x01\x59\x4f\x5a\xfd\xd8\x06\x58\xee\xa6\x5c\x80\x85\x6b\x4c\x4e\xfb\x65\x5d\xc1\xb1\xa3\x98\xf3\x96\x55\x54\xce\x1a\x39\x37\x5b\x7b\x3e\x11\x5c\x95\xe2\xed\x78\x07\x07\x2e\x35\x1e\xef\xdc\xdc\xa6\xf0\x30\xa4\x66\xc7\x5a\x76\x77\x11\x4e\x67\x0e\x9b\x35\xf0\x3c\x60\x33\x3e\xe1\xb1\xb2\x09\xc0\x3b\xbc\xce\x63\xfb\x45\x53\xf3\xa0\xe7\xb4\x1a\xa7\xef\xb9\x95\xaf\xcd\x18\xe2\x13\x10\x5e\xcf\xc0\xf8\xe5\xf9\x19\x5f\x40\x93\xdd\x55\xd5\xef\x1e\x44\xa5\x2c\x8e\x2d\xee\x78\xe0\x0a\x09\x00\xde\xd9\x00\x71\x6d\x70\x38\x1f\xfc\x3e\xfa\x79\xfc\xee\x97\x7f\xc1\x82\xa2\xf2\xe8\x03\xe0\x91\xbc\xf1\x86\x57\x6a\xaf\xf6\xc7\x44\x89\xf8\xb9\xd3\x42\xaf\x7d\x51\x57\x82\x41\x47\x7b\x98\xa6\x87\x89\xf1\x01\x77\x93\x8d\xc2\x6b\x03\x57\x58\x32\xc7\x83\x45\xb3\x3f\x3f\x8f\x60\xb1\xd6\x0b\x3c\x61\xfb\x55\x8c\x3c\xe2\xd1\x49\xd4\x2b\x97\x91\xe3\x0b\xf6\x3d\x6b\xd2\x19\x9d\xa2\x3b\x8a\x21\xae\xe3\x15\x81\xa1\x14\x9d\x55\x98\x56\x23\x00\x7b\x1c\x49\x5e\x72\xcc\x71\xcb\xd6\xa7\x10\xf9\x17\x37\xf5\x01\xc0\x16\xe3\xf4\xd4\x80\x10\x2b\x13\xad\xaf\x54\xf6\xaa\xe7\x82\xc1\x7a\x81\x95\x76\xcf\x11\x37\x0d\x63\x98\x0c\xf1\x99\x7f\x40\x52\xa0\xd9\x88\xf6\xf8\xf0\x60\x20\x05\x22\x08\x41\xc9\xa3\xc1\x6f\x12\x83\x09\x52\x1f\x37\x74\x09\xab\x46\x36\x30\x21\xce\xf6\x31\xeb\x8f\x32\x3c\x7e\x67\x28\x7f\xf3\x17\xff\x8f\xe9\x5f\xf8\xdd\x7f\xf1\xff\xf7\x7b\xff\xd6\x4f\xfe\xc2\xdf\xf2\x3f\x81\xff\xf7\xbf\xf4\xb7\x7e\xf2\x27\x7f\xfa\x2f\xfe\xc4\xef\xfe\x1d\xff\xc1\xf1\xeb\x7e\xfa\x03\x86\x87\x63\xf6\x2d\x16\xd9\x6d\xf1\x3d\xa8\xe9\x51\xf0\xe1\x90\x3c\x4f\xcb\xa2\xdb\x8a\x46\x2e\xde\x9b\xc5\xa5\x36\xcc\xf0\x1c\xdc\x27\x04\x47\xd1\xdf\x3e\x48\x57\xb0\xe1\x32\x01\xa2\xaf\xbc\x4f\xc8\xe3\xbd\x77\xa9\x72\xab\x2e\x4b\x11\xb7\x18\x55\xfa\xbc\xb6\xd1\x4b\xfb\x07\x98\x15\xc3\xcf\x98\xd4\x87\xdc\x9d\xba\x95\x64\xee\x77\xcc\xa3\xf1\x74\xea\xde\xfa\x06\x01\x43\x87\x72\xc8\x04\x9e\x24\x57\x06\x71\xb2\x4f\x1e\xe1\x58\x49\x36\x72\xeb\x1a\x6e\x21\xab\xcd\xa8\x04\x29\x52\xbd\xaa\x20\x42\x5e\x3e\xbd\xe7\xc1\x3c\x52\x8f\xda\x6b\x4f\x9a\x80\x2f\x06\x18\x31\x66\x63\x82\xd9\x38\x2b\x82\x38\xcf\x68\xce\x4b\xe3\xbb\xa1\xf5\x67\xf6\x27\x2b\x0c\x57\xf5\xfc\x7d\x38\x02\x7e\xc4\x61\xc6\x17\xb0\x4b\x9f\xbd\x3c\x36\x27\x8e\xbb\xdd\x84\xcf\xaa\x3c\x28\x37\x6c\x3e\x88\x0b\x18\xb1\x07\xde\xa7\xc9\x13\x90\x97\x03\xd5\xfa\x36\xf1\x45\xbb\xcc\x11\xd8\x54\x78\x78\x1d\xe9\xe5\xcc\x7b\x43\x03\x65\x90\x50\x5b\x7a\xbc\xe9\x3a\xb3\x37\xd5\x14\x98\x04\x91\x4b\x4b\xa3\x6d\x5f\x0c\x30\xd3\x3e\x80\x5e\xcb\x30\x81\x8f\x20\x5a\x3f\x3d\x02\xb0\xdf\xad\xe0\x94\x65\x78\x97\xb7\xf5\x01\x0e\xfc\x66\x92\x0c\x08\x2a\xb6\x2f\x30\x6e\xf8\xb4\xbd\xd8\x06\xa4\xc5\x73\xb6\x68\xda\xde\x3c\x93\x7f\xfd\xe4\x34\x13\x92\x1d\xe4\x8d\x67\x2b\xdb\xb6\x24\x9c\xcc\xb0\xff\x62\x87\xae\x75\x94\x25\x27\xbc\x80\x9a\x10\x13\x87\x56\x64\x84\xa9\x87\x3d\xfa\xd1\xe5\x96\xd2\x13\x38\xd9\xc5\x58\xa2\x5c\x01\x3c\xfc\x13\x9e\x09\x61\x36\x3e\xca\xac\x88\x7d\x0b\x5a\x81\x31\x9f\x3c\x9f\x32\x29\x85\x5c\x28\x70\x01\x93\x12\x45\x28\x3c\xdc\x02\xbe\x51\x3f\xec\x13\x5a\xb6\xf1\x51\x1d\xd8\xa6\xc3\x4c\x73\x12\x85\xd6\x8a\x94\x0d\x38\xb1\x85\x0f\xe5\xdd\x2c\x23\xb6\xb9\x8a\xb1\x2d\x67\x6e\x11\xff\xe2\x74\x26\x65\x82\x85\xae\xe0\xbb\xd2\x2b\xb9\xae\xb7\x77\x4d\xd5\xe9\x3c\x8b\x67\xb4\x67\xca\x8e\x10\xd2\x6f\x58\x38\x72\x91\x5d\xf0\x9f\xf0\x4c\x20\x67\x62\x30\xa4\x38\xc4\x89\x5c\x88\x27\xe4\x2e\x71\xd6\x6c\x86\xdc\xec\x8c\x86\x7f\x94\x69\x34\xc1\x72\x0e\x7e\x57\xa9\x1f\xec\x4a\xd9\xe9\xcf\x3b\xb2\x6e\xe1\xc5\xef\xb8\x83\xb6\xe9\xee\xda\x95\x13\xd3\xda\xbc\x66\xf2\x9c\xb4\x9e\x3b\x1c\xa8\xd4\x5a\x65\x6e\xfa\x85\x0b\x93\xe7\xa8\xe3\x78\xa4\x78\xe0\xfa\x61\xca\x7d\x4a\xdb\x9b\x1d\x31\x59\xc7\x90\xe5\xcd\x76\x4d\x0e\x3f\x40\x4a\xe6\xb5\x99\x6b\x7d\xb2\x07\x12\x90\xdb\x18\x11\x46\x32\x88\x9e\x51\x0f\x70\x76\x35\x2b\xd5\xc1\x67\x92\x8e\xd6\xbc\x15\xeb\x4d\x48\x10\x3a\xfa\xbc\xd8\x8b\x2f\xee\xc8\xc3\x48\x7a\x97\x57\x59\x6a\x04\x5d\xcc\x83\x22\xb9\x72\x1d\x2f\x03\xda\x7a\xea\xf4\xe9\xcc\x86\xcb\x04\xf0\x61\x2a\xe1\xdb\x17\x44\x79\x56\xd4\xbb\x13\x50\x59\x9c\x9a\xc3\xbc\xde\xc7\xa1\x66\x58\xfa\x14\x4e\x96\x76\x75\xa2\x23\xe0\x3a\x81\x91\xa6\xf2\x6e\xf8\xf9\x42\x70\xc5\x4c\x77\xb9\x04\xf4\x94\xd4\x79\x83\xd0\x8d\x70\xd2\x99\xec\x6a\x7a\xe9\x49\x16\x6b\x83\x50\xaa\x5a\xb4\x38\x9c\xa5\x22\xec\x2f\x04\x14\x4c\xbf\x6c\x07\xf9\xc0\x98\xb0\xb5\xcf\x18\xeb\xba\x3c\xb6\x8d\x3a\x04\xff\xc6\xdc\x5e\x8c\x68\xc1\x11\x3e\x0b\xd7\xf4\x22\xa4\xef\x07\xcc\x1f\x9a\x08\x2f\x10\xc0\x5e\x5f\x1a\x9d\xc2\xea\x36\xca\x86\x78\x22\x40\x88\xa5\x83\x17\x71\xea\xf1\x9e\x0c\xf3\x2c\xd3\x20\x6d\xcc\x7f\xe0\xce\xc5\xde\x51\xf2\xf3\x36\xdc\xde\x67\xce\xf9\xb2\x96\xae\x86\x1c\x8a\xde\xfc\x4a\x30\x0f\xba\x6f\xdd\xab\x56\x50\x25\x4b\xd2\xad\xd2\xbf\xe8\x72\xf2\x58\xb5\x63\x12\x02\x7e\x24\x93\x0e\x67\x95\x5a\xba\x3c\x86\x23\x34\x36\x4a\xbd\xe4\x05\xe9\x5d\x11\xc8\x86\x5f\x76\xf5\xe4\x5f\x74\x7c\x82\x24\x84\xd6\xec\xf6\xa0\xa7\x72\xf8\xf2\xb4\x5e\x1b\x1e\x57\x42\x64\x76\x4b\xac\xe9\x31\x6c\x17\x9e\xd4\x8c\x81\x42\x3c\xfb\x17\x6b\x1d\xfa\x80\x9e\xa2\x01\xb9\x14\xef\xa8\x84\xce\xa7\xe0\x14\x96\x9b\xe1\x52\x9c\x5d\x16\x82\xec\x99\x8d\x99\x5f\x32\xde\x09\xab\xfb\xc2\xb7\xa2\xf7\xb7\x58\x47\x56\x09\x67\x93\xa5\x74\xe3\xce\xf7\xe9\xed\x89\x06\xc6\xd1\xb7\xa2\x15\x6d\x5a\x77\x1f\xdc\xf6\xee\xe1\xf9\xc2\x6d\x87\xc2\xb6\x87\x21\x00\x50\x61\x73\x34\x27\x22\xc0\x79\x79\x4f\xcb\x88\xb8\xea\xb7\xaf\xf7\x84\xc7\xf9\x42\x05\xa9\xf0\xad\xc1\x80\x2f\x84\x35\x4d\x01\xeb\xb0\xb7\xd9\x1f\xb5\xe2\x6b\x22\xd5\x03\xa7\x43\x43\x63\x2e\xac\x94\x6c\xac\x97\x1e\x67\xad\x80\xc9\xe3\x84\xcb\x17\x4b\x47\x96\x4a\x72\x05\xc6\xd4\xf6\x74\x1c\x6c\x2c\x9e\x66\x1e\x12\x4f\x4b\xe7\xe5\xf7\xc1\x41\x77\x0e\x86\x7f\x0b\x19\x17\x34\xd4\xfe\x1d\x83\xf8\x7f\xb7\xd9\xf7\x71\x99\x49\xaf\xf6\xb6\x43\x91\x98\x6b\xfa\x66\x14\x49\x31\x65\x15\x08\xca\x83\x04\x2b\x31\xba\xba\x39\xde\x03\x92\xc7\x88\x2f\xd6\x3a\x3a\xd1\xf7\x69\x6c\x8b\xb0\x9b\xe2\x2e\x75\xcf\x14\x2e\x91\x12\x45\xf7\x55\x72\x53\xf2\x82\x5c\xc8\xe2\x42\x07\x10\xce\xa8\xf5\x47\x3d\x3c\xfe\xc5\x5f\xf1\xab\xfe\xea\x5f\xf8\x6d\xff\x11\x64\x7e\xec\xd7\xce\xbf\x96\x7e\xee\x9f\xfb\xa7\x7e\xdd\x9f\xec\xff\xd2\x2f\xfd\x1f\xfd\xb7\xd7\x9f\x8e\xbf\xf6\x8f\xa8\xff\xea\xbf\xf6\x01\xc3\x03\x0a\xda\xec\x73\x95\xcb\x85\x9b\x7a\x45\x13\xcf\x41\x78\x53\x29\xd1\x26\xaf\xcc\x1d\x50\x97\x96\xf1\x99\xd6\x5c\x6d\x68\x07\x7e\x31\x46\x0d\xbd\xc9\xbd\x44\x74\x5b\x66\xde\x00\x2a\x10\x71\x30\x4a\x41\xe8\xc1\x3d\x4b\x13\x76\x8d\xe6\x61\x1c\x0c\xbd\xd6\x86\x78\xfa\xc5\xde\xf8\xed\x10\x5d\x3a\x1c\x01\x3c\xd4\xde\x69\x04\x33\xcd\xf1\xe6\xa7\xbd\xb5\x3c\x77\x24\x41\x05\x8b\xb0\x2f\x5e\xf8\x02\xcd\xfb\x4f\xc8\x5b\xe0\xad\x32\x1d\x20\x98\x21\x54\xf0\x30\xcf\xb9\x58\x8f\xe9\x17\x9b\xc3\xea\xb1\xd9\xbb\xde\xa1\x12\xe7\xd1\x6f\x88\x86\x93\x9f\xd0\xe9\xec\xe5\xfc\x12\xdc\x23\xeb\x4c\x42\x28\xa8\xe0\x90\x06\x43\x91\x3f\x13\xf2\xcd\x25\xb9\xe0\x19\x3b\x29\xe1\xee\x83\x9c\xa3\xf4\x8b\xfd\xe0\x51\xab\x95\x5d\xc6\x93\x46\xe3\xf7\x2e\x68\x23\x39\x84\x40\x8c\x9f\x97\x41\xc1\x91\xaf\xde\xa6\x61\xe5\xa1\xda\x81\x13\xb0\xfd\xc2\xf2\x6e\xfa\xb5\x32\x44\x39\x81\xbe\x8f\xf1\x83\x5c\xd9\x21\xa4\xe4\xba\xb9\xa9\x42\x65\x38\x00\xef\x2d\x2b\xe5\xe5\x9f\xe4\x03\xa1\x5f\x34\x67\x15\xbd\x33\xf0\x16\xc1\x0b\xb5\x05\xaf\x7e\x09\x3f\xe3\xe5\x97\x0b\xf2\x80\xd8\x6e\x4e\x47\xda\x1a\xef\xd9\x91\x63\xb7\x00\xfe\x02\x8e\x63\x66\xc9\xc7\xd3\xb8\x00\x7a\x75\x39\xf2\x9e\x67\x05\xd4\x51\xd6\x36\xc6\x02\x6b\x7a\xdd\x5a\xda\x1b\xdc\xf1\x86\x53\x0c\x10\xc3\x27\x06\xae\xf2\xe8\xa2\xca\xe0\x98\xfe\x7c\x04\xee\x12\xe3\x87\xd3\x22\xee\xb4\xbc\x86\xc4\xd4\xe5\x04\x58\xd3\xa0\xf0\xb3\xde\x9d\x96\xf8\xe2\xe1\x01\x6f\xc3\x84\x10\x18\xd4\xec\xb0\x59\x64\xef\xde\x51\x41\x3e\x26\x7b\xc4\x4e\x61\xb5\x03\x61\x11\x85\x1d\xf0\x8e\x97\xb7\xfa\x89\xf8\x6c\x7a\x85\xc2\xe5\xfa\x20\x6b\xe2\x5d\x32\x14\x80\x5e\x1a\x3c\xc2\x0f\xbd\xf5\xc0\x7d\x70\xd7\x90\x3e\xc9\x4a\xcd\x4f\x49\xec\x7e\xd1\x22\x1a\x0b\xe1\x56\x98\xec\x45\xf5\x82\x2b\x3e\xf8\x0c\x0c\x76\xc8\x5a\x17\x84\x19\x15\xd4\x3d\xa9\x81\x15\x2e\xc7\x62\x68\x73\x3e\x01\x05\x7d\xc8\x48\x44\x86\xe4\xe2\x5e\x56\x2a\x12\xcb\xbc\x8f\xcd\xe8\x7c\x73\x0e\x8f\xa8\x60\x18\x6b\x1c\x20\xc7\x97\x73\x22\x60\xfc\x8b\x16\xd1\xf2\x45\xd0\x7c\x18\x65\x19\xbd\x82\xc5\x4a\x6f\x4b\x14\x6e\x61\xb8\x1a\x16\xfa\xc7\x7b\x1b\x42\x0a\x86\x0d\xfe\x00\xd0\xc2\x27\xd6\x66\xfc\x71\xf0\xb2\x29\x9d\xef\x2f\x6b\x4e\x22\x75\xc2\x92\x2f\x93\x67\xa9\x4a\x2b\x61\x67\x45\x5d\xed\x70\xbe\x3d\x56\xa7\x6a\x3f\x51\xfa\x92\x47\xd6\xde\x28\x31\xe2\x6d\x3e\x8c\x3b\x5e\xcd\xc7\xc9\x37\x2b\xaa\xd3\xeb\x9a\x63\x30\xdd\xe7\x01\x93\xd4\xe9\x6f\x72\x04\xcc\x2f\x80\x30\x3b\x5a\x93\x9c\x79\xb2\x24\x32\xd7\x6f\xa7\x8e\x1e\xaa\x8f\xc3\x28\xf5\xf1\x87\x7f\x45\x68\xde\xec\x7c\x4c\xd4\x2f\x7a\xd9\x17\x3c\xd6\xc2\xd5\xf4\x1e\x8d\xf8\x48\x67\x19\x07\x80\xf6\x07\xcd\x3c\x2c\x14\xd4\xce\x0e\x8b\x72\x55\x42\x3e\xb0\x2a\xd4\x88\x9b\xe2\xfd\xc4\xab\x21\x39\x9c\x34\xf6\xd5\x81\xad\x8c\x38\x73\xb5\x84\x34\x2b\x16\x2c\x8a\x47\xb7\x97\xc0\x64\x32\x7f\x22\x54\x46\xd8\x93\x52\xfb\x42\x40\xa1\x9f\x29\x7d\xd1\x1e\x2a\xa6\x06\xdc\x26\x1e\x15\xcb\x10\x20\xe4\x07\x82\x6e\x1f\x70\x55\x64\xc6\x6d\x56\xe4\x5b\x58\x11\xe9\x8b\xa6\x9d\x1a\xc6\xf6\x3b\x5c\x59\x00\xc1\x05\x01\xa2\x0d\x34\x39\x3a\x6a\xd1\x61\x04\x68\x00\x1c\x13\xdc\xce\x9a\x00\x50\x2f\x0a\xab\xe7\x8b\xda\xc9\xce\xe1\xa1\x21\x2a\x93\x8c\x60\x0d\xab\xe3\x7d\xa8\x26\x10\xb1\x6c\x6c\xa0\x09\x91\xc9\x6b\xe7\x8f\x57\xf3\xd1\xe9\xd6\xf2\xc9\xba\x0f\x15\xdb\x8e\xe7\x46\x6a\x7d\x91\x0b\xd5\x77\xaa\x20\xac\xec\x30\xb1\x5c\x2a\xd8\x30\x96\x2a\x2e\x93\x58\x8c\xf2\xd8\x56\x80\x2f\x00\xd2\x0e\xef\x18\x4e\x6b\x3e\x72\xd0\x41\x29\x11\x0b\xb3\xc8\x44\xbb\x06\x7a\x38\x36\xa5\x4c\xda\x49\x56\xaf\xa2\x0f\xbe\x3a\x1c\xf6\xc5\x78\x1d\x9e\x09\xd2\xc0\x9d\xa7\x61\x70\x6a\xc1\xa5\x0e\x65\x9d\xc9\xbc\x5d\x85\x58\xad\x2e\x6f\xa8\x6e\xec\xe7\x09\xc0\xf2\x10\xfa\xfd\xc0\x6d\x87\xa1\xc9\x19\xbd\xe2\xa5\xf3\x2d\x7c\x5e\xd0\x4f\x05\x7a\xa3\x67\x91\x1b\x7b\xe8\x5d\xde\xb8\xcd\xd8\xc6\x43\xed\x76\x92\x67\xde\x2f\xde\xd4\x61\x0a\x71\xc5\x36\x5c\x80\xa6\xaa\xf2\x27\x89\x62\x40\xc4\xd7\xe1\xe6\x5c\x6f\x3b\x2f\x7e\x55\xeb\xe3\xee\xd6\xd1\x15\x7c\x7c\xe1\xa3\x47\xce\x38\x9b\xee\x07\x34\x5b\x3d\x80\x1c\x3d\x22\xd6\x0e\x40\xae\x18\x3a\x1d\x05\xce\x53\xae\x3e\x6c\xf0\x04\xa1\xc1\x1b\x02\x5f\x58\x70\xe3\xf8\x90\xd1\x0d\xe3\xf6\x4d\x87\xe5\x1c\xa4\xbd\xd5\x99\xc5\x72\xde\x51\x52\x5d\x1f\xa6\x1c\x74\x09\xc8\xa5\x39\xa3\x3e\x83\x4f\x4c\x8e\xf3\x20\xba\x03\xc2\x2f\xc5\xd3\xc5\xc1\x84\x1c\x75\x28\x5b\x5e\x2f\xe5\xbd\xeb\xb9\xbe\x60\x84\x1f\x09\x8f\x8b\x8b\x8a\xee\xbf\xe0\x1f\x05\x9b\x52\xe2\xc1\xc5\xd2\x10\x35\x62\x23\x40\x91\xd0\x73\xc9\x2b\xb3\x2b\x39\xd7\x60\x22\x5c\x73\xdd\x6d\xd9\x7c\x07\x67\x6d\xfe\x08\xe0\xf1\x9f\xff\xd9\xdf\xfa\x9f\xfb\x9f\xfd\xfb\xfe\xd0\xbf\xf0\xeb\x7f\xdf\x5f\xfc\x67\xfe\xee\x6f\xf8\x1f\x50\xf6\x3f\xfd\xd9\xff\xef\x4f\xff\xdc\x1f\xf9\x93\xff\xc5\x5f\xf2\x53\xbf\xec\xbf\xff\xab\xff\x6b\xf5\x03\xc0\x23\x55\x4e\x2e\xf5\x41\x98\x60\xc4\x65\x7d\x45\xa1\x93\x3d\x41\xcd\x41\x54\xf1\xc7\x4c\x1c\x0d\x6a\x73\x05\xf7\x4e\xa6\x84\x69\x5f\x18\x69\x81\xfc\xbe\x34\x97\xf7\x7d\xc4\x5b\xda\x32\x89\x4a\xea\xf1\x3d\x36\x9e\xc0\x43\xd7\x46\x2f\x6f\xe9\x4d\x53\xf8\xe2\x8f\x8e\x08\x7c\x81\xb4\x6b\xdd\x50\xd9\x56\xe2\x84\xbd\x5e\x08\x84\x2e\xb1\x1d\x92\x65\x94\x30\x67\xc2\x6f\x67\x71\x67\x6d\xd2\x74\x0f\x44\x9b\x28\xf0\xc9\xf6\x7a\xa9\xe0\x13\x63\xa7\x5e\xae\x25\xe9\x87\x1e\xa5\x36\xba\xd2\x89\x1a\x25\xc1\x6a\x2c\x5f\xe4\x4b\xd2\x7e\xdd\x3d\x9d\xc3\xfa\x45\x99\x7b\xc4\x0b\x82\xe3\x06\xfa\xf7\x75\x0c\x64\x63\xf2\x28\xad\x38\x7a\x46\x7b\xcf\xe0\x2d\x94\xd9\x0c\x55\x9e\x3e\x51\x04\xcf\xd2\xf9\xa2\xcc\xd9\x1b\xb4\x1e\xd0\x05\x1d\x5f\xb6\x54\x11\x48\xca\xf7\x88\xc7\xfb\x87\x99\x80\x89\x75\x68\x8b\x54\x21\xde\x69\x60\xad\x69\xfa\x44\x33\xb7\xc7\xb3\x91\xea\x08\x04\xae\x09\xb0\x6c\x1b\x3c\xab\xb2\xf6\x35\x75\x55\x39\xd8\xa5\x88\x65\x59\x71\xc3\x09\x17\x78\xfb\x84\x5f\x0c\xf9\x9c\x4a\xd6\xc7\x08\xe8\xde\x35\x0a\xb9\x9b\xb2\x7a\xca\x78\x79\x1a\xb4\xa6\x1f\x1e\x1c\x48\xe8\x33\xeb\xe3\x56\xcc\xe5\x45\xcb\x7e\x31\x3a\x6c\x3b\x9f\x3e\xea\xa3\xae\x04\x00\x81\x25\x92\x3a\xd5\xad\xf8\x46\xa3\xae\xa6\x82\x3f\xd7\x1b\x37\xcb\x19\x85\x04\xc0\xba\xac\x5f\xf0\x8f\x72\xa6\xf0\xa6\xec\x65\x5a\x6e\xab\x65\xc9\xe0\xed\xdd\x84\x4e\xd1\xde\xb7\xc1\x9b\xf5\x83\xd4\x54\xf9\x11\xbd\x17\x3e\xbc\xae\x5f\x40\x50\xbe\x26\x8a\xf0\x78\x5d\x37\xea\x80\xf1\x7a\xad\xeb\x79\x00\x87\x07\x6c\x2b\xae\x68\x03\xad\xf9\x68\x7e\x00\x97\x7b\xac\x67\x7f\x02\xc7\x89\xbb\xa3\x0e\x94\x10\xa0\x9e\x71\xf5\x6d\x60\x90\x0b\x6b\x59\x08\xb5\x8b\x5b\xbb\x37\x25\xc9\xaf\xe5\x26\x40\x78\xe1\x08\xec\x8b\xa6\xdd\x3d\x15\xad\x94\xa2\x9f\x2f\xe9\xab\xda\xca\x7b\x20\xf4\x50\x17\x0f\x82\x2f\xed\xb9\x0c\x6e\x5f\x7f\xdd\x56\x9a\xca\x77\x8d\x2f\xc8\xe1\x54\xab\x08\x84\x0a\x4d\xe4\x93\x25\x3b\xe7\x85\xa4\xde\x05\x9b\x1d\x9b\x4e\xbb\x4f\x4f\x62\xfb\x07\xf0\x12\x69\x48\x54\x1f\xd7\xbe\xa8\xe0\xca\x1c\x30\x26\xcc\x6c\x8c\x30\x16\x5b\xe0\x4e\xec\xad\xed\x72\x63\x33\x99\x5f\xc3\xe6\xbd\x76\x2d\x68\x24\x07\x74\x8f\x79\x7c\x01\x9c\x5b\xae\x0b\xb8\xd4\x18\x27\x80\x1c\x41\x3f\x83\xe8\x47\x3d\xf6\xed\x06\xbf\xc6\x11\x29\xfb\x12\xb8\xaa\xd5\xa7\x74\x4d\x5e\x75\xbf\xa8\xe0\x1c\x9e\x73\x20\x43\xbd\xd6\x4a\x44\x0c\x36\x09\x2d\xde\x01\x86\x6f\x91\x05\x3b\x74\x73\x0d\x55\xa6\x06\xe3\xe7\x3c\x6b\x43\xff\x45\x7f\xd1\x8d\x7f\xd1\x7c\x03\xb5\x3a\x42\xd8\xa8\xaf\xec\xc5\xc6\x71\x19\x17\xe2\x6b\x01\xa2\x39\x34\x31\x1c\xf6\x46\x1e\xfa\x44\x2d\x7c\x71\x3a\x71\x11\xc8\x30\x32\x37\x7f\x51\x3b\x46\x1c\xcd\x8f\x64\xbc\x60\xd3\x65\x30\xaf\x55\x35\xba\x63\x89\xab\x08\xbf\xd1\x98\x07\x8d\x2f\x28\xea\x84\x27\x8c\x03\x51\x93\x4e\x9f\xed\x1d\xdc\x19\x0c\x58\x7b\xa1\x26\xd9\xb9\xe3\xc1\xee\x08\xfb\xc7\x47\xda\x40\xac\x81\x97\x4f\x12\x28\x5a\x0c\x45\x2e\x10\xcc\x08\xdd\x7a\x9d\x0d\x90\xde\x9c\xfd\xec\x1b\x4c\x5a\x89\x2a\xdb\x16\x9b\x6a\x76\x7b\x96\xb9\x98\x0e\xf8\xc5\x4d\x7d\x0a\x38\x8e\xb2\xe5\x14\x10\x18\x60\x61\xb0\xc4\x91\x94\x43\x2a\x1a\xb2\xd9\xf8\x90\x03\xa9\x1b\x4f\x08\xea\xb5\x61\xfb\x70\xbe\xb8\xa9\x64\x30\x5f\x6b\x73\x12\x58\x91\xa6\xc2\x3e\x5f\x09\x95\x93\xc7\x8a\xb3\x7d\x72\x4f\xb0\x35\xcb\x55\x61\xeb\x5d\x4b\x69\xf2\x17\xac\x06\x26\x0b\xac\xc0\x3f\x09\x07\x76\x48\xe3\xd2\x73\x08\x99\x0c\x1c\x68\x4c\xc4\x4a\xf7\xac\x14\x83\xe2\x46\x4b\xc8\xcd\xbd\x87\x7f\xe1\x05\x45\x2d\x7f\x6a\xb8\xb0\x3d\x80\x49\x72\xad\xdf\x78\x41\x70\x3a\xbc\x65\x8b\x2d\xb4\x95\xbc\x98\xa0\xed\x72\xa0\x97\x56\xc5\xa2\x5f\xdc\x11\xc6\xa5\x91\xfc\x4e\xfe\x2a\x8a\xcf\x55\x5e\x17\x98\x1f\x68\x17\x2f\x35\x65\xb6\x17\xd3\x10\x69\xf4\x22\x57\x17\x36\xd1\x38\x2d\xbe\x70\x12\x61\x45\x2d\x9a\x47\x43\x13\x72\xdf\x46\x0f\xc7\xd1\x51\xab\x62\xbd\x17\x81\x72\xc9\x0d\x57\x05\x0d\x6a\xea\xa2\xec\x09\x6c\xe2\x8b\x21\x1f\x82\x2b\xd4\x83\x83\xd5\xd3\x78\x97\x0f\xf0\x32\x1c\x51\x84\x1d\xaf\x67\x92\x16\x13\x10\x25\x82\x4d\x0f\xae\x76\xcb\x3d\x96\x7d\xf1\x8e\x04\x4f\x73\xa7\xe9\xad\xd7\x10\x33\x00\x0c\x97\xb4\x00\xb4\xc1\x8b\xb4\xd2\xb3\x7c\xd1\xe3\x7a\x8b\xad\xf7\x26\x77\x93\x7b\x9e\x2f\x94\x08\x14\x72\x50\x71\xb6\x6c\x3a\x30\x76\xd4\x3e\xad\xde\x19\x20\xe2\xf0\xc9\xbc\x8b\x31\x1a\xe2\xdb\x1b\x23\x1a\x0d\xe2\xdb\x33\xfd\x42\x1a\x49\x68\xd5\x52\x70\xbc\x67\xbd\xfa\x89\xc8\x31\xab\x35\x9b\x8c\x6f\xfc\x60\x32\x7e\x98\x4c\x40\x8f\xb6\xce\x33\x21\x30\xaf\xf2\xf6\x93\xf8\x82\x8e\x68\x25\x11\x6a\x5e\x94\xb3\xf6\x02\xf8\x2c\xf9\xe4\x7b\xa8\x83\xae\xcb\xf6\x0c\x2c\xab\x2e\xfe\x75\xd3\x3d\x47\x68\xc7\xc7\x8f\x00\x1e\x3f\xf6\x2f\xff\xcd\x40\xfe\x77\x7f\xa6\xa8\x9f\xfc\xbd\x7f\xe4\xbf\xf2\xd7\xfe\xf4\xff\xe2\x7f\x5d\xfe\xbd\xbf\xf2\x57\xfe\xd8\x9f\xfa\x3d\x7f\xee\x37\xfc\xee\xff\xcc\x7f\xe1\x67\x7f\xee\xcf\x7f\xc2\xf0\x70\x99\x9a\xa6\xe5\x24\x4b\x69\x56\xbb\xc7\x5c\x6c\x91\x5b\x3e\x84\x32\x3f\x5c\x18\x3f\xfc\xcf\x62\x15\xe2\xaf\xdd\x23\x7f\xb2\xbd\x0e\x2f\xd1\x0b\xf2\x60\xd5\xbc\x07\xe5\x25\xfb\xdc\x2a\xba\x2b\xca\x43\x6a\xf2\xf4\x55\xaf\xba\xbc\x80\xa7\xe0\x1e\x0c\x57\xcf\x17\x9b\x39\xe6\x9a\xd2\x4b\xf0\xc8\x3b\xd6\x5e\x2c\xd6\x24\x47\x31\x46\x8d\x95\x79\xaf\x9b\x32\xb0\xb4\x2c\x97\x70\x43\xd6\x29\xdf\x7a\x7e\x61\x98\x44\x8f\x4f\xc3\x3f\xc9\x5d\xde\xe0\x71\xce\x8d\x1a\x37\x3d\x65\x3e\x98\x2e\xdb\x0e\x01\x4f\xec\xb4\x21\xf3\x43\xfb\x16\xd8\xee\x94\x7e\xb1\xfb\x80\x99\x47\x37\x13\xed\x2a\xa5\xa8\x0a\x4d\x9b\x52\x23\x24\x92\xce\x57\x5f\xb0\x03\xa8\xac\x17\xd5\x17\xe8\x82\xaa\x6d\x3c\x87\x2f\x5a\x81\x4e\xac\xb5\xb5\x94\x3c\xcf\xcb\xd2\x01\x35\x23\xc0\x66\xaa\xcc\x5b\xb0\x9d\x14\x54\xb7\x9f\x0f\xe9\x28\xbb\x68\xc5\xaf\xe7\x5f\xe8\x4a\x59\xdb\xb1\x9e\x49\x79\xc0\x54\xf4\x74\x58\xeb\xa4\x8b\x38\x0c\xa6\x57\xd9\x09\xbc\x21\x32\x61\x87\xd4\x39\xf5\x05\x4f\x33\xb6\x7f\x71\x47\x30\x2f\x54\x03\x23\xfc\x8a\xfb\x21\xb3\x8f\x26\xdf\xab\xfd\x9d\x66\x22\x41\x8a\x11\x99\xdb\xed\x92\x80\xfa\x76\x1b\xad\xc4\x9f\x04\x48\x07\x59\x3b\x0f\xad\x11\x5e\x45\x07\xee\xbc\x23\x33\x71\xb6\x18\xfa\xea\x16\x53\x43\x75\x33\x2b\xde\xd9\x1b\xd7\xf4\xc1\xb8\x9f\x2f\x18\x61\xb4\xe5\xcc\x42\xc8\x41\x56\xe4\x56\x6f\xd6\x23\x27\x6f\x3e\x46\xcf\x67\xef\xb5\x93\xd0\x81\xd7\x77\x95\xb2\x8c\x1d\xa5\xd4\x2f\x7e\x05\x3b\x8f\x9c\x53\xac\x9b\xba\x54\xf9\x25\x26\x5b\x85\x44\x27\x0f\xce\x48\xb9\x52\xca\x9b\x34\xc3\x01\x40\x7d\xf7\x7c\xb0\x86\xeb\x93\xf1\x1a\x23\xf6\xf3\x39\x1c\xb8\x63\x9c\x73\x23\x09\xeb\xe1\xd7\x9a\x5d\x32\xeb\x30\x4e\x19\x25\x31\xd4\x73\xe5\x00\x81\xcf\x21\xd3\x17\x06\xae\xd4\xc7\x64\x9e\x2c\x6e\x64\x9a\x46\x4c\x66\x99\xd4\x3d\x0c\x1d\xc6\x1f\xb9\xd5\x63\x1d\x9d\x32\xcf\x1b\x22\xa1\x1e\x85\x3d\xfb\xf9\xa2\x6a\xdd\x82\xe1\x2b\x69\xe7\xa2\x07\x59\x97\x6d\x53\x99\x4a\x94\xd7\x0b\x77\x32\x0f\xac\x61\x1d\xf2\xea\x43\x85\x5d\x08\x00\x00\xdd\x17\x3a\x74\x59\x26\x74\x0d\x4f\xd7\xe6\x99\xd8\x08\x8f\xe8\x54\xd5\x32\xdb\x79\x39\x6f\x0c\x0f\x21\x30\xbb\xc0\x95\xb9\x9a\x29\x1e\x1e\xfe\xc5\xae\x94\x81\xf7\x89\xf4\xbd\xd4\x92\x31\x2f\xe0\xb8\x06\xf2\xba\x87\x74\x04\x49\xd7\xaf\x34\x69\x6b\x7e\x8d\x0b\x4a\xe4\x1d\xc2\x48\x9f\xdc\xd4\x2b\x8c\x2b\xe7\x09\x8f\x1d\x11\x35\x4c\xea\xad\xb8\x76\x5d\xfc\x25\x3c\x0a\x0c\xba\x47\xcf\x03\x7b\xa3\x63\xbe\xba\x0b\xae\xfa\x17\x77\xa4\xb9\xc6\x3d\x22\xc9\x62\xc3\x1f\x62\x98\x1e\xcd\x1f\xb3\x04\xb9\x28\x7a\xd5\x78\x10\x90\xc2\xc0\x13\xea\x46\x83\x57\xdd\xfd\x89\x15\xe2\x3a\x0b\xa3\x64\xfc\xbd\x2e\xd9\xa7\xc6\xdb\x9f\xf7\x65\xad\x7b\x36\x85\x02\x59\x14\x11\xab\xf4\xf7\x3c\x91\xf5\xf4\xb0\x37\x7e\x22\x1f\x0e\x25\x34\x35\x09\x47\x66\x2f\x80\x67\x13\x85\xfb\xdd\x33\xf3\x0d\x23\x11\xa4\xc2\x0e\xc4\x4d\xe3\xdc\x0f\x5a\x09\x9c\x69\x3f\xb1\x23\x47\xcd\x7b\x03\x84\xdb\x21\xc2\x99\x0b\x12\xc9\x20\x93\xdc\x2b\x28\xa7\x66\x75\x98\xc3\xc9\x4b\xab\xe3\xeb\xe6\x10\x24\x3a\xbf\x70\xe7\x62\x63\x9c\x4b\x32\x69\xf0\xf0\x98\x10\x6c\xfb\x25\x50\xce\x7e\xed\x08\xfe\x9d\x86\xba\x40\x39\x77\xf8\xd4\x8a\x02\xf0\x95\xd8\x2f\xc2\x2e\x19\x7c\x7c\x12\xd9\x66\x4e\x23\x69\x10\xda\x17\x20\x99\xde\xcd\x55\x28\xeb\xa1\x45\x65\xe7\xbc\xec\x0c\x6b\x2f\x29\x87\xa7\x3e\x9f\x64\x82\x00\x31\xa2\x3b\x76\xb7\xc9\x89\xca\x28\x61\x6f\x9d\x5d\x44\xec\x77\xa8\xad\x83\xd0\x30\x28\x9a\xd6\x4d\x7b\xdd\xb1\xf0\x4b\xe8\x17\xef\x48\x20\x9d\x5d\xf4\x1a\xd3\xac\x2a\x1d\xcc\x40\xf4\x8b\x34\x00\x26\x4a\x42\x6e\x2d\x17\x67\xa3\x27\xd4\xfa\x5d\xf8\xdc\x07\x3a\xf0\xc9\xb9\xd0\x0c\x21\x14\xde\x11\x33\x42\x82\x16\x25\x2f\xd0\x2a\xbf\x0c\xe8\xdc\x76\x41\x22\x1c\xd5\xeb\x3e\x38\xc9\x35\xe3\x96\xf9\x0b\x99\x28\x23\x18\x1c\x0c\x79\x55\xe4\x95\x13\xbc\x43\x26\x3c\xbc\x19\x01\x97\x50\x8d\x13\xcc\x4c\x9b\x98\x61\x46\xf5\x33\x62\x1c\xbc\xb6\x2f\x3a\xbe\x43\x96\x74\x86\xbd\x5d\xa2\x7e\x9c\xd4\x47\xba\xa6\x5f\xf6\xbe\xda\x72\xc0\x37\x6b\x00\x1b\x3e\x10\x90\x99\xca\x47\xcc\x27\x7e\x01\x16\x33\x11\x4a\x7e\xfa\xce\x07\x81\xfd\x40\xa1\x04\x58\xdb\x12\x5f\xd7\x86\x70\xf4\x8d\x69\x12\xa2\x69\x88\xa6\x7e\x18\x29\xee\xe5\xe2\x8b\xd3\xc9\x62\x4e\xb4\xa6\xd4\xd2\x0a\x61\xbf\x00\x70\xa0\x23\xf5\x1b\x88\x62\x63\x32\x70\x77\x00\xc9\x79\xe5\xd0\xa0\x6d\x8f\x3a\xfc\xe2\x65\x67\xfe\xce\xac\xd3\xb8\xd4\x46\xb8\x4b\x7f\x3a\xaa\xef\x24\x55\xe2\x4b\x63\xdb\x7c\xb0\x1e\x96\x40\x24\x8a\xd7\xbf\xb6\x06\x61\xef\x17\x3c\x56\x07\x80\x40\x2a\xd1\xf4\xd0\x8c\x36\x25\xcb\xfa\x39\x67\xf4\xbd\x6e\x05\xa2\x77\x6e\x93\x53\xc4\x81\x6b\xef\x32\x5f\xc9\xc0\x3f\x76\x3a\xff\x11\xe0\xf1\x07\xff\xfe\x6f\xf8\xed\xff\xd7\xff\xee\x3f\xff\xb3\xff\xf1\x7f\xcf\xff\xf6\x17\xff\xc4\x7f\xe7\x27\xce\xfc\xff\xff\xeb\x7f\xe7\xa7\x7e\xd1\x1f\xfe\x3d\xf6\x97\xfe\xf1\x9f\xfa\x45\xff\xef\x7f\xf8\xdf\xfc\xc0\xc3\xc3\xdf\x73\x86\x05\x00\x9d\xe8\x1b\xef\x05\xe8\x40\xdd\x94\x44\xfb\x76\x36\xde\xf0\xc9\xaf\xe5\x38\xd3\xfb\xa0\x10\x9f\x11\xfd\x17\xfa\x41\xca\x7b\xdd\x63\x91\xb9\x8a\xd9\x0c\xb7\x1d\x75\x7e\x8c\x05\xfc\x1e\xf7\x58\xcf\xf9\x8d\xcf\xed\x76\xe6\x63\x4f\x40\x0a\x6c\xfe\x09\x39\xfc\x87\x6a\xab\x0b\x85\xf5\x56\x65\x46\x23\x6f\xa9\x2e\x01\x98\xe2\xf4\xee\xa4\x33\x89\x0e\x8b\x9b\x5c\xaa\x6d\x67\x74\x26\xd2\x27\x91\x9b\x32\xe8\xd1\xa8\x48\x68\x54\x36\x33\x86\x3b\xaf\x0d\x5c\x49\x7c\x53\xba\x50\xb1\xb0\x9e\xc8\x32\xe9\xe7\x35\x34\x3b\x1d\xfc\xfd\x62\x98\xdb\xef\x98\x50\x50\x09\x2f\x89\x59\xf0\xe7\xcc\x15\x8b\x5e\xec\xed\xac\x28\x4e\xdf\x62\x97\x90\x32\xdb\xa8\x48\x4f\xd3\xbc\x9d\x7e\x51\xf2\x9f\xc2\x0c\xe7\xfe\x60\x52\xbb\x34\xb3\x72\x12\xd8\x75\x84\x0b\x4d\xc6\x0b\x97\x5e\xd3\xcd\x2a\x8e\x95\xe4\x3c\xa6\x5a\x98\xf9\x27\x88\x6a\x25\xb0\xea\xe5\x64\x4f\x14\x4d\xd7\x68\x24\x81\x1f\xbf\xa7\x1a\x14\x27\xfa\x54\x03\x87\xe0\x6e\x5a\xc4\x10\xec\xc2\x46\xff\x85\x66\x2e\x60\xe3\xfa\x1a\x4e\x4e\x7d\xb0\x5f\x4f\x45\x34\x42\x83\xf4\x95\xf6\x40\x4a\xd9\x03\x68\x49\xd6\x13\x3b\x5f\xa6\x5b\x02\x80\x7f\x71\x2e\xec\x3b\x9c\x49\x78\x5e\x4c\x00\x5d\xab\xd6\xa6\x7b\x73\x21\xd7\x16\x97\x52\x4b\x6a\x7d\x94\x57\x54\xf0\x28\xe3\xc5\xfe\x3d\xe0\x03\x8f\x7f\x46\xfd\xec\x29\x84\xd4\xde\x41\xdb\xaa\xa1\x99\x24\xc5\xf0\x44\xdb\x6e\xad\x21\x85\xce\x4a\x47\x74\xb3\x2e\x98\x36\xd4\x58\xb6\x2f\x46\x4a\x18\x03\x8d\x51\xf8\x18\x9c\x7d\xb7\x4c\x2a\xbf\x63\x2e\x56\x18\x56\xac\xa0\x29\xea\xee\x34\x8c\xdc\x57\x0e\x90\x8a\x2d\xe7\x17\xd2\x05\x0a\x1f\x9f\xb9\x19\x44\xb0\x12\xf5\x29\x6a\xd2\x39\x15\x9c\xef\x16\x40\x69\x80\x94\x8e\xd3\x49\xb4\x3c\x36\x2c\x6c\x8e\xef\x43\xbf\xb0\xb0\x8a\xb3\x29\x1a\x9a\x13\xa8\xdc\xad\x4c\x76\xfb\xe0\x17\xd7\xe7\x4c\xe8\x01\x76\x92\x0e\x1c\x04\xf5\xce\xe2\x9e\xce\xe3\xa6\xf8\x84\x29\xb8\x6e\xfd\xa1\x1f\x99\x2f\x38\x48\x6b\x7d\xea\xb0\x56\x39\x08\x53\x37\xd9\x65\x56\x6f\x20\x37\x73\x59\x3c\x41\x7b\xeb\x7a\xeb\x27\x61\x97\xd3\x43\xc8\xea\x0a\x93\x54\x5c\xfa\x36\x80\xed\xa0\xde\xf3\x8e\x8d\x1b\xab\x7e\xc3\x44\x6e\xbc\xf9\x61\xa8\x9d\xdc\xdc\x43\x3f\x89\xe8\xad\xb6\x05\xa0\x1e\x40\xdf\xe8\x8c\x2c\xdc\xdf\x92\x7b\xea\x5e\x3c\x8b\x27\x7b\x95\x05\x67\xe7\xb7\xf6\xe1\x3c\xda\x6f\x0a\xc3\x7e\x31\xcc\x29\xc4\x83\x92\x08\xe2\x16\x4d\x76\x2f\x1f\x33\x66\x67\x68\x7d\x8c\xd3\x76\x5b\x81\xb3\x19\x82\xb8\x6c\x87\x2d\x72\x07\x7c\xc4\x27\xd0\x64\x9e\x38\x05\xca\x6c\xb1\x07\xc8\x48\xa7\x93\xc4\xe6\x17\x88\x3a\x53\x19\xa8\x9d\xd7\x25\x60\x93\xb4\x80\x02\xe8\x11\x24\x5f\xe4\x60\xb0\xa3\xf9\x69\xc5\xd6\xc7\xcd\xec\x33\x9b\x44\xf4\x37\x7a\xe7\x89\x7a\x97\x20\x27\x8c\xd2\x62\x4f\x1b\xc9\x67\xac\x71\x3c\x7b\xfc\x17\x4d\x7b\x3a\xc1\x05\x37\xcb\xa1\x8a\x6f\xb8\x8a\x6c\xec\xd8\xd2\x43\xeb\x4d\xdc\x31\xea\x19\xc1\x3c\x8d\x39\x68\xb6\xc9\xc9\x68\x0e\xbf\x10\x0d\x74\x22\xac\xe3\xcf\x92\x50\xbc\xee\xd2\x94\xaf\xb3\x34\x31\xcd\xec\xe0\x17\x5a\xcd\x23\xd1\x2c\x50\x03\x0e\x9d\xf2\x81\xa9\x7f\xe2\xaa\xa2\xe2\x29\x98\x37\xf1\x84\x49\x86\x0b\x32\x48\x89\x91\x00\x6e\x70\x6a\x02\xeb\xe5\xd5\x74\xaa\x53\x70\x78\xa1\x7a\x2d\xef\x40\x7c\x41\x0e\x8f\x6b\x61\x8c\xda\xd3\x91\x20\x13\xa9\x66\x05\x16\x05\x29\xa3\x0c\x72\x6c\x04\x42\x17\xaf\xc5\xbc\x5b\xf7\xb3\xd4\x7e\x41\x6c\x5f\x9c\x8b\x27\xd6\x6e\xc8\x84\x94\x4e\xb6\xac\x7e\xd0\x69\xe5\x3c\x9b\xe2\x27\x6b\x59\x23\x45\x8c\x26\x8b\x73\xa2\x62\x23\x7c\xeb\x0c\xe7\x8b\x49\x40\x24\xd2\x17\x0e\x15\x5a\x2a\x43\x41\xf5\x2c\xb4\x41\xd4\x3f\x34\x1e\xac\x87\x0c\x32\x90\x39\x74\x22\x03\x6c\x65\x02\xeb\xe4\x17\xac\x49\xba\x06\x00\x41\x4d\xa5\xc8\x13\x52\x15\x83\x16\xd7\x26\xb7\x6e\xf5\x10\x49\x7f\x5f\xa2\xef\xf5\x84\x45\x92\x94\xd2\x0c\xbe\xb1\x7e\x21\x1f\xbe\xd7\x8c\xb0\x48\x1f\x85\x6d\x1e\xa1\x23\xde\xad\xeb\x94\x02\xc3\xf3\x6d\xc4\xac\x66\x56\x9c\x0b\xb2\x16\x83\x96\xed\x3b\x3e\x91\x71\x14\x32\x33\x16\xcf\x85\xb1\x09\x90\x62\x77\x3a\x12\x8f\x99\xf0\xf8\x9e\x59\x31\x86\x26\x1e\x03\xf2\x21\x3b\x7a\x03\xf4\xb6\xf0\x0b\x3e\xc1\x91\x41\xe3\xa7\x2c\x7b\x60\x50\x2a\x28\x4f\xd7\x2b\x8a\xd8\x87\xe8\x27\x5c\xcd\x79\xad\xd7\x25\x5a\xea\xbd\x3b\xb0\xc9\xda\x27\x86\xcf\xcf\xba\xfe\x99\xd5\xec\x36\x8d\x6e\xf3\x69\x72\x4b\xab\xde\x7b\x36\x64\xcb\x67\x29\x12\xc0\x4c\x52\x93\x30\xbf\x04\xc0\x48\xce\x17\x5c\x6f\x7b\x03\xe3\xe2\x52\x7c\x1e\x09\x1f\xba\xb0\x18\x50\x98\x5c\xc5\x6e\x00\xc7\xe0\xd7\x0b\xd0\xc9\xfc\x79\x29\xd1\xc3\x56\x23\xe1\x17\x82\x6e\xec\xc4\x33\x30\x32\xf7\x25\xa9\x19\x53\xe4\x78\x9f\xa3\xe6\xc5\x5b\xa9\xa1\x70\xde\xc1\xac\x57\x19\xb1\xc4\x22\x4e\xe9\x73\xdb\x8f\xa6\xb4\xa4\x5f\xff\x07\x7f\xd3\xaf\xfe\x3f\xfe\x2b\xe1\xaf\xff\xb3\x7f\xe3\x37\xfe\x83\x5f\xf5\x0b\xf2\x6f\xfb\x25\xbf\xf1\x57\xff\x81\xdf\xff\xe3\xbf\xf3\xcf\xfd\xf9\xff\xd4\x3f\xf9\x9f\xfe\xbb\x3f\xf7\x1f\xfa\x80\xe1\x31\x69\xd2\x95\x71\x31\xf7\x9b\x64\x11\xc9\xba\xda\x25\x2f\x2d\x66\xb6\x11\xb5\x60\xbc\x97\x4e\xc9\xe0\x4b\x4d\xd9\x94\x8e\xa7\x7d\x22\x1a\xa8\x26\x0c\x55\x28\x5b\x77\x59\xf3\x0a\xce\xcb\x23\x16\xf5\x30\xdb\x5d\x60\x7d\x58\x78\xfb\xa0\x55\xaf\xd7\xbf\xbb\xf3\xad\xef\x17\x07\x09\x22\x63\x4a\x24\x0f\xbb\xbc\xaa\x0e\x61\x0a\x27\xcd\xb6\x1a\x24\xe9\x55\x43\x92\xcb\x66\x76\x99\x23\x58\xc6\x26\x37\xc8\xd2\xbe\xf8\x15\x27\xb2\x0a\x5d\x4f\xd4\xd7\xc5\xfa\x6d\x72\xa9\x6a\xa0\xb3\x64\x40\x0e\xb2\x41\x6f\x08\xef\xd4\xf5\xf0\x32\xe1\x94\xfb\x8d\xfe\x0b\x56\x83\x99\x7d\x3f\xb4\xa0\x1e\x8b\x01\xd5\x06\xdc\x53\xf1\x16\xbf\x98\xb1\x59\xb4\x5f\xa4\x90\x8e\xae\xc8\x4f\xb4\x7e\x6e\x55\xc1\x27\xe8\xb2\xb3\x81\x89\xf7\x91\x1e\x99\xa5\x05\xa8\x88\x39\x5c\x4a\x78\xe0\xb1\x3a\xbe\xa6\x75\x06\x7a\xc2\x6c\xe4\xe3\x68\xdb\x8b\xfa\xfa\x45\xb1\xcd\xc4\x43\xc5\x07\x1c\x62\x40\xb4\xe4\x38\x35\x5d\xe7\x3c\x3b\x8e\x69\x4a\x36\xf7\xec\xde\x33\x2d\x2f\xb2\x3e\xfb\xb8\xdb\xc4\x17\x82\xab\x40\xa5\xab\x74\x07\xb9\x93\x6c\xa0\xbf\xbb\xe6\x45\xeb\x95\x03\x0d\x81\x83\xad\x4b\x04\x23\xd8\x43\x11\x6b\xd0\x10\xce\xb0\xfd\xc4\x5d\xdf\x67\xbe\x33\x32\x6a\x5e\x34\xa0\x20\xac\x27\x86\x55\x4d\x54\x3e\x22\x77\x37\x66\x06\x84\x50\x6c\x25\x0d\xb3\x2c\x22\x94\xfb\xc4\xd7\x9e\x3f\x30\xb2\x99\xc8\x20\x47\x9e\xd3\x96\x82\xec\x4c\x34\xba\xe0\x6f\x14\x9b\xbc\x08\x76\x34\x13\x9d\x4c\x1d\x87\xda\x3a\x9f\x64\xc3\x83\xe4\x01\xe4\x0e\xb3\xae\xd2\x6b\x3b\x05\x33\x97\x03\x6c\x79\x6e\xb9\x98\xdd\x54\x48\x0a\x37\x40\x34\x28\x81\xbd\xe4\xec\xc1\x17\xbb\x52\xd8\xf2\x60\x1e\x74\xb0\x32\x29\xea\x36\x8a\x7c\xa4\x6f\x46\x4f\xeb\x57\x0b\xf7\xa6\x5e\xb9\x91\x9a\x6d\xac\xf7\x0d\x78\x52\xfb\xc5\x0e\xbd\xce\x33\x27\x21\xf8\xa8\xee\x5e\xac\x72\x50\xb7\xc5\x70\x53\x58\x90\x53\x53\xeb\x51\x41\x88\x87\xcc\x82\xbc\x8b\xa1\x4a\xf6\xc5\x3b\x42\xb5\x36\xd8\x85\x7b\x17\x91\x40\xdf\xd2\x05\x47\x45\x99\x41\x34\x9b\x13\x59\xdb\x18\xeb\x49\x2c\x52\x71\xe7\x41\xbe\x87\xc7\x2f\xc6\x28\x6a\x1e\x4d\x21\x44\x56\x18\xfa\x9c\x83\xa8\x07\x44\x8f\x06\xa1\x2d\x28\xb7\xae\xaf\x6d\x89\x9a\x46\x0e\x82\xeb\xbe\x55\xd7\xf9\x45\x5a\x3f\x43\xa6\x9a\x1d\xe8\x9a\xec\xd6\x1e\x5c\x5c\x24\x3c\xfa\x58\xae\xda\x0d\xd6\xd8\xaa\x2e\xd9\xc9\x90\x78\x04\xf3\xf8\x6a\xc9\xbf\xf0\x27\x60\xee\x5d\xbd\xd6\x97\x8a\x83\xf3\x13\xd8\xa8\xa4\xdd\x40\x48\xce\x24\xd3\xc7\x95\xdd\x1a\xbc\xa0\xd0\x0d\xcb\x43\x99\xb5\x83\x7d\x71\x3a\x59\x82\x68\xab\x49\x41\x07\x9d\x64\xf6\x4c\xbc\xdd\xd9\x00\xe5\xa5\x30\x27\xad\x89\x87\x27\x32\x0c\xeb\x1e\xdb\x1d\x69\x7e\x48\xff\x04\x8e\x4b\xad\x97\xf9\xc4\xdb\xdb\x86\xe0\x96\xe0\x49\xe8\x22\x4b\xf6\x6e\x9d\x25\xce\x35\xa0\x15\x99\xd1\x58\x42\x95\x90\x5e\xf3\x8b\x2e\x87\xb9\x48\xb8\x53\x82\xdf\x18\x24\x4d\xa9\x1f\xb0\x58\x7e\xcd\xe0\x6b\xb2\xc3\x87\x2a\x62\xe4\xc6\xc4\x52\xcf\xe0\x6d\xac\xd8\x3f\x02\xc2\x34\x78\x48\x43\xed\x21\x3c\x7b\xab\xda\x08\xe5\xbc\x8d\x99\x29\x3c\x26\xfb\xd6\x67\x79\x2d\x3b\x7e\xef\xde\x8a\xc7\x7a\xec\x17\xfd\x85\x11\x23\x92\xb8\x96\xb3\xad\x34\x9b\xa6\x0e\x92\x70\x67\x11\x4c\x84\x6a\xa8\x44\x76\x6f\xd8\xbc\x44\x8e\xb5\x00\xf2\xac\x61\xbf\xd8\x95\x86\xde\x54\xcd\xbc\x27\x39\x6a\xbe\x11\xda\xb2\xaa\x7a\xde\xa2\x4e\xda\x2a\x6b\x61\x0c\xb4\xe0\x1c\xc1\xf4\x30\x36\x93\x97\xdf\x2f\x06\x18\xee\x23\x50\x6b\xa6\x53\x37\x1e\x64\x45\x92\x5e\x87\x8c\x7e\x04\xc8\xa0\xa4\xb3\x02\x4c\x39\xc6\xa4\x1e\x71\x08\x33\xa6\xfb\x4f\x64\x5f\xf9\xf1\x0e\x72\x47\x6d\xe6\x45\x77\x83\x6b\xe6\xea\x51\x99\xad\xb1\x98\xf1\x92\xe4\x21\x84\xd8\xad\xcf\x19\x18\x44\x25\x4e\xf7\x05\x58\x3c\xf7\xc5\xbc\x66\x4e\x5a\xef\x47\x4f\x0f\xec\xb3\x6c\xa2\x68\xec\x8c\x63\xb3\xa9\xce\x37\x3f\x20\x9e\x3c\xdf\x94\x7d\xa0\xec\x13\x36\x6d\xdc\x55\xfa\x17\x5d\x75\xb5\xe7\x44\x1e\x98\x57\x29\x3d\xb4\x61\xfd\x8d\x27\x94\x3c\x36\xc2\xf1\x14\xbc\xd2\x88\x75\x09\xf8\x85\x88\x99\x3e\x7e\x1f\x38\xf0\xd8\x24\x18\x20\x90\x91\x4e\x0c\x95\x7b\xd4\x96\x83\xbd\x4c\xe6\x27\x3c\xa0\x11\x2e\xfb\x99\x19\xa3\x14\xdc\x17\x90\xb5\x7e\xd6\xd8\xd6\x53\xcb\xfa\xbb\x34\x53\xf6\x59\x2c\x04\x0d\xbc\xd6\x5d\x86\xa1\x27\x1a\xbe\x50\x6a\xf9\xe1\x33\xbf\x07\x46\xff\xc5\xa2\x4d\xb4\x1f\xfe\x02\x11\x5c\xbd\xdc\x13\x4e\x71\x96\x98\x08\x06\x87\xa2\xf8\x3e\xe4\x73\x2a\x77\x79\x81\xbe\x54\xa4\x89\x43\xda\xbe\x58\xb4\x31\xaa\xf3\xcb\x32\x5d\x38\x6a\xc5\xb5\x38\x40\x42\xe1\xc3\x1c\xfa\x02\x33\x7f\x68\x8c\xf9\xe3\x9f\x34\x4a\x28\x09\x3f\xf0\x99\xcf\xfd\xa2\xef\xec\xc0\xfb\x89\x82\x00\xc2\x36\x33\x24\x00\x61\x01\x4a\x2a\x3e\x9a\x33\xaf\xb6\xdf\xb3\x33\x6c\x66\x39\x10\xbf\x14\x9e\x40\xce\xfb\x23\x80\xc7\xaf\x11\x7f\xfb\x67\x7e\xf9\x6f\xfa\xb3\xff\xe6\x3f\xf8\x3f\xfd\xf1\xbf\xc4\x7f\xbf\xf8\x1d\x3f\xf3\x0f\xff\x89\xff\xc4\xaf\xf9\xf5\xfb\xbd\xff\xd6\x5f\xfd\xff\xfc\x82\x3f\xf4\x5b\xff\xeb\x1f\x30\x3c\x00\xd5\x56\x13\xad\x97\x2b\xcf\x10\xe4\x74\x26\x60\x57\x30\x2c\x55\x0c\x0f\xd0\x9b\x7b\xdd\xdb\xde\x56\x91\x6e\x1d\x5c\xf5\xb0\x2f\x46\x4a\x7c\xd9\xa2\xfc\x89\xbc\xbe\x19\x5f\x67\xfb\x86\xb6\x9c\xe5\xfc\xd3\x08\x8f\xf5\x31\xa4\xc4\xf5\xc3\xd8\x49\x10\x7f\xe7\xd3\xea\xf8\x02\x5d\xbe\xda\xda\x69\x60\xbb\xa8\x86\x06\x0c\x43\x2a\x0f\x38\x68\xa8\x1b\xe1\x79\xa5\x9b\xdb\x23\x49\x9e\x58\xa4\xe9\x43\xe4\x57\x80\x2f\xf8\x04\xc9\xbd\x5e\xb0\x11\xbc\x30\xcc\x60\xeb\xd0\x82\xde\x1c\x91\xc8\xd3\x40\x73\x0e\xa3\xdc\x33\x4b\x31\xba\x93\x4d\x47\x20\x9c\xf0\x09\xae\x6b\xfd\x73\xac\x5c\x13\x12\x95\x94\x58\xc9\xb2\x5d\x21\x72\xca\x63\x35\xe8\xab\x84\x30\x95\xca\x66\xc9\xa5\x69\x3d\xea\xca\x2f\x1a\x12\x4a\x4b\x8f\x40\xc4\x37\xee\x06\x55\x79\x58\xec\xa9\x66\x59\xd1\x48\xef\x0a\xf6\x2d\xfc\x3c\x46\x1e\xfc\xa8\x67\xb4\x19\xdb\x33\xbf\xe0\xdc\xb0\x18\x80\xa8\x8c\xdf\xe5\x0b\x8f\x93\x8d\xe2\x16\xc1\x2e\x24\x9d\x2c\x7e\x27\x30\xc0\x2a\x23\x33\x34\x0f\x99\xd1\xb6\x2c\x07\xf8\x84\x4e\xf7\x34\x4a\x6d\x7d\x19\x56\x24\xbe\xce\x05\x5f\xca\xb5\x1a\x8e\x79\x02\x60\x10\xc2\xe1\x4b\x12\x1d\x4f\xa1\x22\xe7\x39\x8f\xfe\xc5\x17\xa9\xaf\xea\x25\xd7\x18\xef\xee\xc2\x56\xa3\xc6\xd5\x5d\x4c\x9f\xb9\x0e\xd9\x42\x53\x55\x8e\xcb\x68\xe9\x4a\x7e\x18\xd3\x99\x7c\x91\xfd\xc0\x44\x96\xb1\xed\x15\x98\x40\x64\xd5\xcc\xb3\x74\x08\xe2\xee\x11\x92\xfe\x7a\x50\x76\x09\x34\x02\x55\x92\x6c\x4f\xb8\x2c\x95\x2f\xa2\x9b\xa9\x55\xe3\xbe\x0e\x08\x1a\x65\x1c\xa2\x9a\xdb\x66\xe5\xda\xb7\xbe\xfa\x31\xa0\xa1\x26\x5d\x0f\x9e\x28\x28\xb4\xd6\xbb\x11\xd8\xbf\x38\x17\x13\xe7\xe1\x9e\x3c\x56\x98\x03\xfb\x92\x89\x4a\x18\x83\x97\x9d\xbc\xd2\xda\x1d\x81\x91\x9f\x2e\x69\xaf\x0b\xee\x87\x69\xa2\xc4\x17\xc3\x1c\xc4\x0b\x3b\x00\xce\xe0\xa2\x84\x9d\xaf\xc6\xe4\x6d\xd8\x0a\x2e\xd6\x63\x07\xe9\x07\x9c\xfa\xa8\x25\x14\x75\xc7\xd4\x2c\xdb\x27\x81\x6d\x12\xd1\xa4\xf7\x52\x37\x82\xec\x83\xd4\xb3\xc1\x55\x91\xe9\x89\xb3\xfb\xe2\x68\x4c\x97\x63\xe9\x47\x18\x9f\x3c\xdd\xaa\xc1\xf3\x45\x05\x77\xef\xdd\x37\x03\xd8\xda\xa3\x94\x4b\xfb\xd2\x22\x05\x01\x52\x31\x78\xca\x7c\xab\x65\x8a\x39\x98\xc4\xba\x72\x17\x79\x1c\x71\x5f\x0c\xb6\x22\x76\xdb\x6a\x41\xaa\xec\x5d\x41\x53\x09\x92\x97\xcd\x7b\x21\xe3\xd2\xa8\x5b\x27\x2d\x26\x79\xe5\x9e\xa7\x70\x2f\xe7\x1c\x5f\x70\xf4\x28\x84\x49\xd8\x3c\x98\x4d\x65\x11\xf1\xda\x26\x02\x2b\xc3\xc2\x67\xf4\x1b\xc2\x11\x55\xc8\x23\x87\x70\x49\xf7\x5b\x6b\xb4\xf6\x13\x3e\x81\x4e\xe5\xbd\x85\xd7\xce\xd0\x84\x32\x1d\xa9\x8e\xc1\x6f\x75\xc2\x6c\xa6\x5e\xb6\xa2\xa7\xd5\xe7\x35\x35\x10\x3c\x68\x5b\xb5\xfd\x42\x87\xde\x4a\xa0\x68\xcc\xb5\x14\x41\x4a\xf5\xc7\xea\xc8\xba\xc6\xad\x3f\xa1\xf5\x32\x6f\xd4\xe7\xd0\x44\xe6\xe4\xde\xde\x4e\x4f\xf1\x5f\xb8\x30\x8d\x6a\xec\x33\xc6\xd5\xa7\xe2\xcb\x2f\x17\x7c\x3f\xf5\xbd\x5a\xb7\x3a\xb8\x8b\xe9\x52\x71\x43\xba\xb0\xb0\x77\x3c\x7e\x7c\x14\x7b\x7f\x6b\x60\x27\x9f\xe7\x11\xe4\x1d\x1b\xa8\x10\x31\xb2\xbe\x34\xd8\x7f\x68\x7b\x0a\x54\xe4\xf2\x7d\x67\x2a\x0b\x6a\x15\xd0\x50\xfe\x03\x99\x28\xe3\x86\x3a\x33\x9e\xdd\xf8\x7b\x43\x94\xb3\x1d\x08\x03\x55\x78\x92\x87\xf8\xec\x22\x19\x1e\xee\xd7\x98\x06\x2d\x41\x80\x3f\x08\x7e\xb1\xc9\x07\xf0\xbe\xd0\xb0\xe0\x92\x0c\xec\x66\x88\x40\x14\x44\x37\x76\x10\xb7\xa5\xfb\x64\xd9\x7c\x8f\xa0\xab\x05\xef\x46\xf4\x7e\x7f\xc2\x33\xe9\xc9\xcf\x29\x19\xa1\x68\xf5\x18\x61\x5f\x70\x56\xa9\x9f\xcc\x53\xb1\x36\x1a\x1f\x35\x70\x09\xa6\x07\x86\xb9\x44\x25\x8a\x9f\x0f\x46\x4a\xea\x18\x9e\x78\x32\x25\xa4\xe1\x4a\x47\x8e\xce\x44\x8a\xa9\x73\x99\x26\x08\xba\x77\x9a\xa3\xbc\x2b\xeb\xed\x5b\xd8\x2a\xeb\xf9\x84\xed\xe2\x5b\x13\x91\x7b\xa5\x35\xd3\x98\x11\xbe\xd1\xa9\x3b\x79\x30\x1f\x2b\x68\x1b\xcf\x6b\xc4\x75\xca\xf5\x39\x37\x28\x26\x05\xd8\x3e\xe0\x13\xb0\x03\x30\x17\x48\x62\x55\x0a\xbd\x50\x1f\x62\x98\x16\x89\x8f\x1d\x2e\xed\x57\xca\x97\xcd\xf1\x02\xa7\xcd\x9b\xe9\x0a\x05\xc5\x4f\xee\x08\xa2\x58\x09\x02\xef\x22\xfe\xba\x81\xea\x58\x65\xbc\x33\xf8\xe1\xf6\xd9\x55\x89\x9a\x1d\x39\xa5\x4f\x8a\x2c\x4e\xa9\x77\xe6\xbe\x30\x70\xad\xd2\xdd\xbe\xfb\xc3\x3a\xc4\xb9\xf8\xc6\xb0\x2d\x83\x92\x20\x18\x2a\x8e\x43\xb2\xf4\x8e\x73\xb1\x79\x04\x8a\xef\xa0\x72\x7d\x92\x15\xf3\xd4\x13\x45\x6e\x06\xa3\xc6\x14\xe1\xb7\x5b\x04\xe0\x8d\xd5\x4c\xfc\xd6\x71\x91\xf3\x2c\xa6\x37\x17\xd7\x30\xae\x48\xa5\xe7\x7e\x71\x3a\xeb\xb6\x84\x86\x67\x19\xb8\x21\x31\xd2\x0f\x0a\xe1\x80\x5a\xec\x0c\x56\x14\x8f\x69\x7a\x20\x21\x61\x73\x81\xef\x29\xbb\x45\x9f\xf0\x8f\x94\xab\xe0\x4a\x0b\x55\x2b\xbd\x4b\x0a\xcb\x8d\x63\x3a\xa0\xfb\xd3\x98\x2d\x57\x3b\xf0\xee\xa8\x6c\x9d\x23\x2a\x09\x0b\xc2\xff\x58\xed\xfc\x47\x80\xc7\x9f\xff\x2b\xff\xc9\x3f\xf3\x9b\xff\x8d\xbf\xfe\x4b\xfe\xf2\x6f\xfc\x15\x7f\xef\x97\xff\xb6\xff\x52\xfb\xdf\xfc\xba\x3f\xfb\xdf\xf8\x5d\xff\xfb\x3f\xf1\x87\xff\xe9\x3f\xf6\xff\xfc\xe9\x5f\xfb\xc7\xe0\xff\xf9\x03\xc0\x83\xba\x76\x24\x79\x27\x2d\x4b\xf8\x9a\x01\x02\xcb\x5b\x90\xdc\xfb\xde\x2b\xa4\x3b\xad\xbd\xc4\xe3\x78\xaa\x7c\xc7\x19\x7a\xe0\x4f\x3e\x21\x09\xcf\xa6\x53\x48\x98\x1e\xe5\x4d\x20\x0a\x33\x1b\x44\x3e\x65\x61\x25\x0b\xc5\x2b\x33\x1d\x32\x22\x53\xea\x72\x11\xd5\xb8\x7e\xb1\xa5\x24\x00\xc2\xe6\xd1\x8c\x7e\x31\xe0\x4c\x9c\x49\xbb\x69\x53\x9b\x4d\x3d\x81\xde\x37\x24\x8c\x75\x47\x78\x57\x7a\xd9\xc3\xd9\x11\x5f\x8c\xd7\x20\x2d\x33\xa4\xa4\x6f\x21\xea\xe1\x9b\xb5\x17\x9d\xe3\xb5\x71\xd6\xba\x52\xa1\x8e\x73\x00\x6a\x02\x08\xe0\xa1\xeb\x61\x75\x7e\x92\xca\x9e\x54\x90\xc0\x94\x35\x66\x8e\x40\x05\x2f\x34\x0c\x6f\x45\x35\xed\x14\x53\x20\xf5\xe4\x26\x1d\x9a\xd2\xcb\x81\x13\x0f\x95\x7f\x11\x5e\x47\xaf\xa8\x9e\xbd\x5d\xa3\x7d\x9e\x07\x64\x18\xc7\xd1\x6f\xfe\xf9\x88\xf8\x5d\xc6\xd4\x11\x15\xbb\x72\xf1\xab\x19\x75\x14\x38\x80\x7e\x21\x5d\x68\x84\xab\x8b\x9a\x3a\x41\x8a\xae\x54\x17\xa9\x59\x02\x10\x44\x53\xf8\xd5\xb3\x0b\x6d\xc0\x63\x9b\x09\x7c\x99\x55\x61\xac\xee\x8b\x2d\xa5\x96\xd3\xef\x5d\xa7\x38\x11\x4e\xaf\x6e\x2a\x37\xb0\xa5\x6f\xa7\x4f\x04\x0b\x17\x23\x4a\xd9\x66\xf4\x47\x18\x2d\x4a\xc3\x06\x7e\xa1\x43\xb7\x0f\x4e\x1d\x06\xb6\xb5\xc3\x76\x05\xbc\xa6\x8e\x8d\x26\xa9\x8d\xe4\x65\xa4\x0e\xc7\xea\x47\x62\xf8\x36\xd3\xa5\x64\xe8\x9b\xb6\xe8\x51\xf0\xbc\x24\xfb\x59\x25\x7c\xdd\x2e\x45\x3e\x7e\xbd\xd5\x8f\xce\xd3\x60\xc4\xdd\xc3\x48\x75\xd3\x15\x22\xaf\xf4\x06\xcc\x2f\x74\xe8\x8c\x3a\x1a\xce\xb6\xf1\x1c\xc0\xf7\x05\xf0\x75\x5c\xf5\x13\x54\x2b\x77\xa7\x68\x42\x7f\x0d\xe7\xca\x23\x92\xa2\x8b\xf2\x25\xd2\x7e\x01\xfe\x40\x68\xaa\x47\x91\x07\x1b\x25\xd0\xbc\xd3\x98\xc4\xe5\xa4\x4e\xe5\xf1\x8d\x31\xab\x47\x1a\x43\x6b\x77\xac\x5b\x5b\xc1\xbd\xf4\x8b\x86\xc4\x58\xd9\x29\x05\x42\xe8\xfe\x3e\x78\xac\x3c\x9b\x11\xed\x98\x97\xb7\xf1\xae\x28\x3b\x93\x68\xf7\x3e\xc4\xeb\x0f\x3d\xb2\xc4\xf3\x49\x92\x51\x99\x2e\x93\x47\xea\x59\xb0\x29\x51\x88\x29\x68\x2f\xde\xb2\xd9\x64\x7a\x77\x6a\x47\x98\xeb\x27\x5d\x25\xe2\x49\xf7\x35\xe7\x8b\x6c\x29\x3a\x7b\x6f\x4d\x3b\xce\x97\x12\xef\x5d\x8d\x20\x47\xa8\x2b\xc3\x28\x60\xa4\xe2\x7e\x22\xc2\xf6\x16\x72\xbc\xf2\x98\xd1\xdc\x27\x50\x03\xc1\xaa\xab\x91\xba\x57\xc4\xed\x41\x0c\x7a\xce\xb3\x5c\x00\x9a\x1e\xfc\xf8\x05\xed\x02\x9a\x36\x54\x4d\xf6\xef\x5b\xc4\x0e\xec\x0b\x21\x5e\x35\x0a\x3b\x98\xde\xa5\xcd\xeb\x07\x53\x29\xab\x14\x62\xb3\xc8\x20\xa7\xfa\x49\x68\x3d\x0f\xe4\xe5\x05\xc3\x25\xdd\x59\x32\x5f\x58\xea\x32\xc2\x99\xe3\x55\x12\x89\x9b\x6b\xcb\x9f\xf8\x00\x39\x75\x60\x19\x96\x65\x32\x12\x87\x05\xa0\x13\x07\xf2\x7a\x2d\x96\x0b\xfc\x13\x50\x50\xc8\x25\xdc\x40\x64\xed\x05\xcb\x79\x52\xc1\x65\x26\x43\x49\x90\xfb\x88\x57\x23\x7b\x11\x49\xb9\x29\xb6\x1b\x40\x56\x4a\xcd\xbe\x60\x90\x36\xe0\x25\x9a\x14\x29\x12\xf2\x06\x3e\xd5\xe7\x58\x2d\xf3\x26\x2f\x2e\xa4\x9b\x30\x70\x69\x58\x3e\x1c\x0f\x07\x09\x3b\xb3\xf0\x4f\x04\x9a\xc7\xd5\x81\x02\xdb\x9d\x37\xa7\x7f\x3e\xc3\x8a\xda\xe8\x59\x1e\xd6\x82\x37\x8f\x92\x31\x4b\x6e\xd8\x04\x41\x67\xde\xa0\xde\xbf\xd8\xe4\x1b\x32\xf3\x64\xd2\x65\xee\x7d\xa1\x0d\x05\x2a\x07\xdf\x26\xbf\x30\x24\x24\x31\xdb\x3b\xd3\x0a\xa1\x8c\x77\xbd\x80\xf0\x54\xe0\x17\xcb\x25\x06\xf3\x23\x9e\xa0\xb7\xfd\xa1\x83\x21\x7d\xa7\xb3\x39\xbc\x2b\xa5\xb3\x6f\x62\x57\x78\x5d\xf2\x7b\x22\xb4\x18\x7b\x85\x98\xae\x5f\xc4\xd2\x1a\x29\x05\xe6\x5a\xee\x0a\x7d\xae\x82\x32\xda\x83\x70\x08\x93\xf5\xc0\x50\x10\xb4\x2d\x36\xca\xad\x20\x7a\xe8\x12\xb4\x31\xe7\x0b\xd9\x57\x0b\x38\x78\xad\x46\x9e\x31\x8f\xfc\xc8\x96\x54\xdc\xd5\x56\xaf\x78\xcc\x8f\x4b\x8b\x3f\xa6\x02\x29\xbb\xb0\xe9\x54\x92\xfb\x27\x61\xda\x4d\xcd\xf0\x3c\x4d\x59\x16\x5f\x82\x34\x73\xac\x6c\xfd\x3c\xeb\xc6\x61\x00\x95\x97\x9a\xe5\x18\x4e\x70\x13\xb3\x24\x98\x67\xf3\x2f\x52\x23\x09\x21\x5e\x75\x97\x47\x03\x13\x1b\x23\xea\x1a\xcb\x9a\xf2\xae\x33\x12\x16\xf1\x56\xca\xe1\xa1\x18\x59\xb9\xe0\xc0\x52\xbd\xfd\x0b\x19\x07\x08\x89\xfe\x50\x26\x80\xb9\x4a\x0a\x77\x93\xe0\xe4\x91\xa1\xb4\xed\x0b\xb7\x29\xd3\x2d\x66\x88\xe2\xc8\x44\xc0\x2e\x30\xe7\x4f\x04\xdd\xf6\xc8\x8d\xbb\x3a\x74\x6f\xd9\x0b\xb5\x54\x6a\xf8\x38\xd4\x60\x61\x6f\x19\x31\xae\x93\x06\x1f\xfc\xbc\x8f\x11\xc7\x61\x4f\xe9\x17\x60\x31\x2a\x93\x74\x84\x0a\x0c\x70\xe7\xf5\xdc\x46\x92\x31\x33\xc0\x05\x12\x85\x98\x10\x5c\x7c\x13\x88\xb7\x46\xf0\x54\x31\x92\xc7\x7d\x31\x21\x66\xa7\xaa\x6a\x93\x8c\x58\x15\x08\x46\x8f\x08\xac\x6f\x8f\xce\xb2\xe2\x3b\x59\x58\x3e\x33\xee\xc2\xde\xc8\x1d\x95\x73\xf7\x9f\x08\xfd\xc1\x7e\xe1\xe1\xf9\xc4\xdb\xdd\x11\x89\x8c\x57\xdf\x07\x70\x17\x56\xaf\xec\x4d\x0c\x1a\x91\x81\x8b\x46\xc3\xa8\x11\x41\xc9\xc1\x1f\xf5\xf0\xf8\x1f\xfe\x2f\xff\xe8\xdf\xfe\xcd\xff\xbd\xe7\xf7\xff\xe4\x8f\xfd\x07\xfe\x44\x1a\x7f\xff\x17\xfe\xa5\xff\xd7\x1f\xfd\xcb\xbf\xef\xff\xf2\x6b\x7e\xe6\xbf\xfc\xdf\xfa\xb1\x3f\xf0\x7f\xf8\x1b\xbf\xeb\x7f\xf5\x85\xa4\xa5\x48\x4f\xee\x32\x2a\xb9\x23\x84\x89\xab\xc4\xbb\x79\xad\xfa\x89\x8d\xa0\x35\xd6\xaa\xfe\x65\xfd\x49\x13\x54\xf1\xbc\xb7\xba\x2f\xd0\xa2\x90\xf4\x03\xd7\x05\x9d\xac\x97\x8d\xce\x20\x3f\x52\x49\x2e\x14\xd4\x6b\x31\x7a\x18\x3d\x41\xea\x31\x54\x7f\xb6\x01\x20\x5b\xfb\x05\xa9\x6f\xfb\xf2\x6a\x41\xbb\x71\x7a\x0e\x18\xb3\x0d\x94\x1c\x5f\xaa\x74\xae\x61\x26\xba\x8b\x9d\xd7\x95\x8d\xad\xf1\xbe\xf8\x50\xfd\x45\x56\x0c\x85\xaf\x19\x25\xbc\xf6\x65\xf5\x2e\x83\xd6\x8b\xcc\xfb\xd2\xcb\x7e\x9e\x1c\x94\xc5\xca\xdd\x15\xc6\x27\xcf\x27\x35\x0d\xfb\x36\xe1\x0b\xba\xfe\xd4\x1e\xf7\x55\x25\xe5\x8e\x83\xc1\x46\x5b\xfb\x79\x63\x1a\xcb\xd0\x49\x29\x2c\xc9\x80\x33\xb6\xac\xfb\xc8\xcc\x36\x7d\x33\xfd\x42\x0d\xbf\x63\xe0\x62\x36\xac\x49\x61\x7a\x2f\x79\x8c\x1d\x13\x98\xee\x19\x59\xd8\x18\xa7\xdf\x4a\x81\x92\x7a\x52\x28\xca\xb5\x44\x7c\xb2\x13\x6b\x57\x54\x7e\xf4\x5d\x65\x54\xb0\xf7\xd8\x56\x21\x63\x8f\xe5\xf5\xf4\x45\xed\xcb\xa7\x95\x10\x7b\xa1\xc8\x76\xf3\x7d\xcd\x37\x0e\x33\xfe\x98\x60\x7c\x56\x26\x4c\xcc\x3a\xb7\x83\x6e\xb4\x35\xd9\x11\x41\x83\x5b\x4e\x81\xac\xe4\x49\x24\x47\x07\x8e\x02\x9a\x97\x7f\x01\x0a\x96\xc1\x9c\x92\xf0\x3a\xe9\x6d\xa5\xc9\x87\xe1\x27\x00\x66\x5b\xbb\x6c\x8e\x60\x34\x51\x6a\xa7\xb1\x8f\xc6\x9c\x8a\x99\x2e\xff\xc5\x1d\x59\xae\x81\x77\x0b\xe0\x5a\xe6\x19\xb5\xaa\xb8\x61\x69\x9d\xfe\x4e\x32\xe5\x81\x17\x73\xa5\x7a\x78\xa2\x95\x3d\x99\x90\xa8\xac\x5f\xe0\xfd\x4e\x51\xbc\x2e\x9e\xf3\x2a\x60\x46\x7e\x53\x76\x6f\xb6\xc6\x66\xd9\x5e\xf4\x70\xff\x9c\x37\x53\x15\x3b\xde\x13\x3d\xbd\xd9\xfa\x89\xde\xd8\x34\xa3\xcf\xa2\x5e\x74\xcb\xe7\x4c\x84\xbf\xa8\xd2\xa8\xc9\xb0\x0c\x67\x20\xb0\x80\x63\xec\x10\x09\xa8\x25\x38\x16\xe3\xfe\x24\x69\x80\xbe\x50\xca\xdd\xaf\xba\x4c\x49\xfe\x80\xd9\xcb\xa1\x79\x63\xad\xcf\x95\x24\x8d\x6d\x1f\x88\xde\x75\x5f\x58\xe0\x50\x72\x93\x4f\x18\x61\xe3\x29\xc2\x6b\xda\x3d\xab\xee\xc9\x4e\x66\x25\x00\x4b\xcb\x20\x14\x4a\x1f\x2e\x97\xc9\xbc\xef\x26\x76\x41\xcc\xb5\x01\x36\xff\xc5\x00\x73\xa3\xa4\xee\xf6\x0b\x80\xef\xcf\x58\xf8\x45\x1d\x10\x2a\x57\x41\xa1\x15\xb4\x63\x4d\x39\x36\x26\x14\xe8\xdb\xf2\xb0\xac\xa7\x5f\xd4\x8b\x8c\xce\xe3\x6d\xae\x37\x2f\x80\x0f\xc6\x47\xae\x60\x8f\x1a\x57\x99\x17\xcf\xf2\x74\x95\x4d\x95\x03\x45\x0d\xa3\x91\xf2\x23\x1b\xd9\xf3\x38\x0f\x51\x83\x2d\x9f\x9e\xa4\x9f\x61\xa0\x8a\xca\x0b\x07\x03\x24\x62\x55\x2e\x4b\xf2\x11\x46\x9a\xc2\xdf\x92\x00\x7f\xe0\x17\xe7\xc2\xa7\x95\x0c\x06\x30\xdd\xe7\xe0\x07\x7a\x73\x71\xe9\x2e\xec\x14\x12\xc1\x5b\x3c\xfb\xc5\x61\x7b\x09\xa4\x83\x8f\xb7\xb5\xf3\x4f\xe4\x80\x74\x9b\xa1\x71\x82\x22\x35\xf2\x8a\x75\x83\xac\xc7\x4c\xd6\xfa\xb4\x0e\xc3\x2c\xcf\x31\x8f\x0b\xaf\x2f\xe5\x80\xf5\xf8\x98\xd8\x17\x03\x4c\x7d\xb3\x05\xcf\x14\xd1\xc8\x6c\x5b\x5d\x97\x5b\xef\x9c\xb5\x84\x64\xc7\x5b\x03\x2f\x73\xf1\x51\xbd\xa7\xa3\x1b\xba\x00\x09\xf7\xc5\xcb\x7e\x9f\x91\x4d\x8f\xeb\x3c\xca\xa2\x07\x81\xa8\x9e\xaa\x68\x0c\xa1\xbd\xce\x8a\x87\xd4\x33\xcc\x00\x88\x1a\x63\x1f\x13\x2b\xc4\xfc\x0b\x98\xd6\x75\x94\x6c\xcd\x95\xa7\x30\x12\xe3\xfe\x32\x69\x64\xf5\x05\x45\x45\xf3\x71\x80\x91\x89\xb5\xeb\xc1\x8e\x7d\x84\x94\x05\xbb\x2f\xe0\xb8\x42\x42\x11\xd6\xab\x76\x19\x90\xf2\xa8\xa2\x95\xd4\x9c\x5e\xc7\x27\x9d\x10\xf8\x9a\xb8\x1d\x62\x64\xdd\x40\x72\x2d\xdc\xfb\x89\x8d\x2c\x46\xde\x02\xdc\x20\x1a\x8e\x00\xce\x61\xd7\x2c\x50\xa2\x3c\x52\x6c\x34\xb6\x0e\x89\xa8\x97\x60\xd2\x03\x07\xef\x83\x9d\xca\xbf\xb8\xa9\xbc\xf8\xa9\xba\x46\xd6\xb7\x88\xdb\x62\xce\xb0\xf5\x48\x4c\x32\xd8\x5e\xef\xa5\x71\x9b\xb3\x75\x8a\x70\x00\xe0\x91\x02\x98\x4f\xe4\x3d\xcd\x05\xdc\x74\x26\x27\x19\xc4\xab\x21\x78\x26\x6b\xab\x71\xd7\x34\x8a\x9f\x42\x91\x97\x2d\x4e\xf6\x68\x6a\x0a\xa4\x6c\x66\xfe\xc5\x42\xa5\xdc\x0e\x90\xd1\x2e\x39\x64\xe8\x63\x91\xa0\x8d\x77\xe3\xce\xeb\xf8\x66\x7c\xd0\x08\xfb\x76\x98\x42\xe6\x04\x75\xe8\xbd\xf2\x7e\x62\x7e\xdd\xd5\xe4\x89\x3b\x5b\x43\x23\x4f\xd5\xd6\xdd\x2d\x50\xc3\x08\x98\xe5\x99\xe3\x6f\xe5\xb7\x01\x0d\xd9\xd2\x0e\xea\x61\x30\xfd\xa2\xbf\x08\x7a\x17\x36\xd4\x28\x19\x42\x49\x5b\x03\x18\x2a\x8f\x99\x45\x51\xbf\x1c\x95\x52\x69\x64\x04\x1b\xb8\xf3\xa4\x3d\x72\x20\xf8\x17\x42\x7f\xc0\xe3\x4b\xbd\xb4\xbe\xa6\x6c\xcc\xeb\x13\x36\xba\x57\x13\x61\x55\xfa\x8c\x4c\x7d\xca\xb2\xc0\xe6\x1b\x3a\x8d\x88\xe7\x8d\x6d\x7c\xf0\x45\x22\x87\xa6\xd8\x31\x26\x9a\xeb\x6d\x2b\xf3\xd6\x9d\x1e\x45\xc7\xa9\x5d\x9a\xe1\x58\x56\xc2\xa0\xcb\x6c\x3d\xf3\x8e\xb5\x76\xff\xc5\xb9\xa8\xa3\x27\x87\x1c\xc9\xc4\x2e\x40\x17\x7c\x7a\xc3\x1b\x8c\x81\x22\x6c\xec\xe5\xa9\xc7\x84\xaf\xb9\x33\x10\x58\x6b\x95\x0e\xdf\xfc\x23\x80\xc7\x8f\xff\xb2\xbf\xff\x07\x7e\xfc\x2f\xff\x15\xf7\xbb\xfc\xff\xfc\xef\xfd\x9d\xdf\xf2\x53\xff\xd9\x7f\xf5\x4f\xfd\x47\x7f\xe2\x37\xfd\xa9\xdf\xfe\x1f\xfb\x7f\xfc\xd8\xbf\xff\xff\xf6\x1f\xfe\x99\xfd\xe3\x1f\x30\x3c\x3a\xb5\x1b\xb1\x95\xd8\x39\xcc\x23\xa2\x22\x61\x15\x17\x35\x63\xed\x85\x2c\x0a\xb5\x57\x49\x88\x1d\x0c\x6d\x63\x86\x7f\x9b\xb6\xb7\x8f\x1a\xf7\x29\xeb\x02\x29\xd7\x74\xc9\x37\x04\xc5\x56\x2c\xdf\xce\x9a\x9a\xe9\xce\xcc\x3d\xb3\x96\x64\x2a\x52\xf9\x92\xb4\x89\x52\xd4\xea\xcc\xdc\xf3\x3e\xf7\x3d\x2f\xf7\xbc\x1b\xae\xa1\x15\xd9\xb6\x42\x69\x6b\xa5\x51\x26\x26\x45\x4b\x52\x6a\x56\x12\x49\x19\x29\x29\x06\x15\x0a\x22\xb1\xac\x24\xca\x4b\xb2\x80\x9e\x04\xf7\xfc\xf8\x9d\x4e\xdf\x73\xd8\x73\x38\x67\xf7\x77\xff\xfb\x3c\xd7\x73\xce\x3c\x73\xcf\x5c\x73\x5d\x9f\xeb\x73\x7d\xae\x6c\x30\xbd\xa3\x26\x36\x93\x41\x11\x74\xb3\xf9\x99\x68\xd4\x9c\xd8\x12\x4c\x3a\x10\x0f\xab\xc1\xb9\xd2\x3c\xfb\xe5\xfb\x29\xf8\x11\x02\x02\x16\xac\x7c\x87\xba\x7e\x31\x0c\xa8\x64\x18\xe1\xe4\xec\xcc\x70\x3f\xa5\x38\x46\x39\x80\x03\x71\xe1\xb9\x37\x92\x48\xde\x0e\x19\x53\x97\x89\x06\x8b\xfd\x1d\xdd\x6a\x52\x7a\x3b\x81\x4f\x32\x34\xd9\x85\x2d\x97\x43\xe5\xe4\x21\x86\x15\xe3\x3a\x73\xd3\x9c\x66\x7d\x02\x45\x97\xe9\x1b\xd4\x35\xdf\x83\x22\x76\x60\x50\x02\xab\x07\x72\x95\xb1\x43\x94\x12\x55\xf4\x24\x14\x42\x52\x0e\x00\xc5\xe5\xaa\x8f\x23\x9d\xd1\xea\xb3\x70\xde\xcb\x1d\x1a\xff\x5b\x6c\x1d\x80\x3e\x92\xd1\x2e\x9c\x65\x69\x95\x56\x6c\xd7\xc5\xc6\xd9\x2e\x5f\xaa\x98\x8e\x18\x5a\xa1\x6b\x84\x99\x65\xfd\x95\xee\xb8\xda\xa0\x0c\x19\x2f\x67\xd5\xc5\x9c\x8b\xed\x12\x41\xd4\x50\x28\x87\x2d\x69\x40\xa2\xb8\x4a\x2c\x12\x22\x25\xd1\x52\x27\xe4\x7a\x99\x3b\xce\x05\xd8\x23\x1c\x3a\x0c\x74\x16\x3c\x5a\x12\x9e\x48\xdf\xb3\x40\xad\xe5\x4c\x2c\xde\xb2\xaf\x87\x39\x1a\xee\x42\x9c\xc6\x13\xbc\xaf\x1b\x2a\x30\x94\x43\x2b\x08\x4f\x78\xec\x3b\xc0\x8b\x8f\xb2\x91\x8d\x62\x5d\xe4\x3e\x70\x45\x71\x1e\x7c\xd0\xda\xf1\x55\x82\xec\xe6\x34\x0a\xa4\x5b\xc6\x15\x43\x40\x30\x92\x26\x1d\xc6\x09\xad\x50\xdc\x60\x21\x4d\xcd\x26\xda\x68\x5a\x01\xbc\x14\x68\xb0\x48\x34\xa6\x2f\x36\xf2\x66\xee\xa0\x65\x1f\x81\x30\x77\x42\x7b\xc8\xde\xd7\x9e\x90\x71\x58\x57\x7a\x99\x11\x5b\x35\xd8\x4b\xc3\x17\xbe\xac\x5c\x9a\x6c\x50\x9d\x63\xe1\x75\x87\xc8\x31\x01\xa7\xd1\xc7\x61\x1e\x7a\xe7\xdb\xc5\xbd\x2e\xe7\xc5\xb0\xea\x04\xd5\x56\x64\x80\xaa\xf1\x00\x4d\x44\x17\x4b\x30\xe0\x5d\x58\x73\xc7\x23\x0c\xd0\x76\x14\x77\x45\x7b\x5d\x5d\x5e\x7b\x1f\xfc\x5a\xa1\x9d\x85\xdb\xe2\x8c\x15\x4e\x80\x5d\x9b\xdd\x19\x32\x44\x28\xd2\xc5\x3d\xdf\x31\xae\x18\x37\x9b\xc9\xa2\x71\xd1\x8b\xb8\x94\x4e\xea\xb4\xc3\xdb\x1e\xea\x5a\x0c\x99\x9d\xc1\x8d\xcc\xa8\xd3\x43\x71\x93\x8c\x9e\x5f\xe9\x8e\x80\x84\x11\xc3\x28\xdf\x19\x46\x39\x1c\x7a\xce\x4a\xc0\xc5\x17\x60\xd5\xab\x9e\xc1\xc6\xb7\x1d\x9f\xdb\x8a\x99\x02\x8c\xd4\x3e\xf5\xb5\x6e\xe1\xe8\x2d\xc0\x76\xd6\xf2\x51\x54\x44\x18\x3b\x3b\x05\x4b\x73\xbb\x8e\x28\x83\x0e\x45\x25\x6c\x5c\xb5\x54\x80\xd3\x5c\x8c\x2e\x13\xe8\x1d\xab\xa0\x2d\x74\xe5\x7d\x81\xb6\x6a\x1b\x64\x0d\xe0\xda\x57\xbd\x8a\xdb\xc1\xd4\xd0\x36\x28\x53\x14\x9a\xae\xb5\x7b\xc6\xb8\x49\x05\xae\x3b\x46\xb1\x5e\xc4\x80\xab\x4e\x90\x30\xbc\xb2\x7f\xdf\xf8\x1c\x62\x11\x6a\x8e\x07\x52\xfa\xe6\xfd\x81\x34\x47\x97\xe7\x24\xd3\x92\xb7\xa4\xaf\x3b\x80\x73\x00\xd2\x18\x39\x82\xe1\x0e\x5f\xe9\x86\x6d\x9e\x94\xf7\x06\x46\xe9\x09\x81\x2e\x51\xd1\x70\x33\x66\xe3\x9e\x79\xbd\x63\x79\xf9\x3b\x8a\x4b\x35\x9d\x0b\xc5\xab\x4f\x55\x32\x6f\xa8\x01\xef\x86\x56\xf3\xe4\x9b\x2f\xe1\x94\x43\x28\xce\xd2\xd2\xb5\xa7\x1c\x4b\xc6\xba\xdd\xa2\xb6\x43\xae\x13\x00\x14\x8b\x5e\x4b\xe7\x79\x29\x2a\x51\xb1\x09\x56\x77\x6e\x40\x74\x56\xa0\xc5\x19\x27\x36\xa9\x4e\xd6\xf5\x50\xef\x69\x5d\x60\x7c\xca\xda\x89\x72\x83\x04\x9a\x56\xf7\x47\x4a\x90\xec\x7b\xe6\x44\x5c\x10\x66\x33\x16\xd9\x78\x59\x27\xe1\x41\x4f\x9b\xa6\xbf\x03\x6a\x48\x17\x94\x11\x3b\x30\x63\xbe\x94\xd8\xb5\xcf\xca\x06\x6f\xd5\xa2\xb1\xad\x6a\x15\xba\x10\xad\x52\x94\xb1\x61\x5b\x82\xc7\xca\xde\xc1\x27\x40\x39\x84\x85\x4e\x32\x68\x6f\x19\x95\x5a\xf1\x26\xf3\x65\x60\xba\x82\x2b\x2c\x6f\x18\xc1\x8c\x91\x75\x06\xb2\xa6\xfc\x35\x07\xb8\xe3\x1d\x71\x52\x6f\xcb\x9d\x29\x6d\xf5\x10\x5b\xec\x8e\x07\x8e\xe6\xc9\x74\x67\x75\xf4\xc8\x6b\xf5\xcc\xc6\x4b\x75\xd1\x43\xb6\xb2\xcb\x75\x87\xc2\x0c\x8b\x59\x23\x3c\xaa\xf6\x73\x97\x55\xec\x70\x15\xaa\x33\xcb\x7b\x60\x65\x37\x29\xef\xd9\x82\x4b\xa3\xbe\xa3\x10\x04\xbc\xf6\xc0\xef\xe0\x2b\x0e\x16\x11\x9c\x53\x4f\xcd\xcc\xb9\x14\x58\x4e\x75\x0e\x88\x93\x76\xc7\xd0\xea\xf5\xbe\x29\xdb\xe5\x6c\xf0\x90\x7a\xc3\x65\x5e\xfe\x0e\x08\xaa\x41\xbd\x53\xad\x88\x5b\xa8\x26\x73\x29\x06\x17\x82\x3b\xf6\x6e\x3b\xc5\x48\x7c\x21\x4c\x93\x67\x61\x71\x33\x31\x9e\xf6\xec\xf4\x8e\x06\x4d\xc8\x56\xe5\xf2\x2c\xc7\x06\x06\x55\x44\xec\x24\xf1\x72\x69\xa7\xa9\xdb\x6d\xac\x87\xd7\x0a\x1f\x6d\x17\xc1\xb3\x2d\x8b\x6d\xf2\x3b\x4e\x27\x1b\x46\x15\xa7\x02\xd6\xa1\x47\x2c\x7a\xe9\x97\xd3\xf5\x98\xc4\x8a\xd8\xe4\x05\x2c\xbb\xa2\x63\x52\x97\x60\xd0\x86\x5c\xf3\x67\xbe\x23\xfa\x25\x44\x25\x4a\xfd\x51\xba\x36\xfe\x64\x0f\x3d\xa8\x6c\x75\xb1\xf5\x51\xab\xad\x6b\x43\x21\x9f\x97\xe3\x98\x71\x0f\x14\x1e\xa9\xdf\x21\xc1\x4d\xe5\x3c\xa7\x65\x27\xb4\xfa\xd2\xc6\xf5\x15\x5d\xc6\xbb\xe7\xee\x6a\xfa\x1c\xac\x6f\x48\x01\x7c\xc5\x3a\xb7\x41\x43\x3f\x92\x14\x0e\xbe\x1f\xe0\x11\x3e\xb5\xc6\x6f\xfe\xb9\xb7\x7f\xc2\xdf\xfd\xcc\x67\x7f\xea\x6b\x7e\xe1\xeb\x7e\xf7\x87\x7e\xf9\x17\x3e\x59\xff\x5f\x7f\xed\xdb\x5f\xf8\xd5\xdf\xff\x87\x1e\x73\xea\x5f\xba\x81\xe1\xb1\x4c\x9b\xa5\x81\xfd\x9c\x72\x4d\x44\xa6\x43\x95\xc8\xd3\xa6\x68\xba\x06\x46\xa0\x73\x0a\x23\xb4\x83\x2b\xe8\x36\xad\x96\x83\xdf\x41\x2d\xf4\x81\x4e\x2a\xf3\x9e\x42\x18\xaa\x75\xab\x29\x84\x1b\x74\x94\x59\x1c\x29\x34\x4b\x78\x07\x6d\x69\xa0\x82\x1e\xf1\xc6\x2d\xb2\x77\x90\xfa\xf2\x09\x14\x6b\x4d\x85\x50\xbd\xc7\xe8\xd2\x20\x62\x73\xc0\x45\x83\xea\xd2\x9a\xab\x82\x2b\xba\x53\x71\xb7\x93\x7e\x1c\xce\x6e\xb7\x08\xb8\x0a\x82\xe3\xa1\xcf\xad\x9c\x67\x0e\x2e\x17\xa2\x8c\x8d\x75\xce\x4d\x46\x18\xa4\x6a\x22\xfb\xcb\x62\x9d\x5d\x4c\x2d\x33\x1f\x77\x70\x47\x35\x6a\x48\x3d\x26\xec\x12\x57\xd9\x1b\x30\x57\xf2\xa4\x67\x3c\xf7\x2d\x6e\x12\xca\xcb\xc9\x7e\x1a\x41\x2f\xcb\x84\x8e\x97\xc6\x4c\x98\x3b\x12\x18\xd8\x51\xda\x62\xa3\x8b\x90\xa3\xfa\xde\x87\x1e\x4b\x87\x08\x2e\x05\xae\xc4\x11\x9c\x9c\x0a\x17\xa3\x82\x46\x03\x16\x98\x65\xf7\x68\xfc\xb3\xb5\x5b\x3c\x51\xac\xc3\x7a\xaa\xcd\x4a\xdb\x85\x11\xb2\x3b\x68\xdc\x67\xdd\xb0\xa9\x8e\xe6\x9c\x3a\xa5\xb3\xcd\x70\x9e\xb7\x8c\x56\x54\xb1\x26\x7b\xc8\x3c\x0f\x2c\x79\xe4\xd9\x20\x51\x7a\x0d\x6b\xcd\xae\x0e\x19\xd2\x82\xcc\x5d\x4a\x15\xd7\x26\xd0\x38\xfb\xe5\xef\x48\x1d\xaa\xd9\x5d\x4b\x09\xda\x59\xba\x5f\x16\xb0\x61\x25\x37\xae\xf3\x3e\x97\x5f\xd1\xec\xfb\xd6\x93\x40\xc4\x02\x13\x54\x3c\x83\x48\x77\x84\x88\xda\x6c\x00\x10\xbe\xf5\x96\xfc\x12\x20\x56\x29\x89\x30\x35\x76\xdc\x63\x18\xc3\x5f\x6d\x14\xa7\xa4\xda\x55\xae\xda\x01\x8a\xf9\x1d\x09\xcc\x48\xbc\xdb\x41\x14\x0a\xb5\xef\x30\x81\x9c\x13\x61\x5a\x4f\x72\xb6\x09\x06\x11\xac\x17\x9e\x76\x09\x43\xea\x74\x3b\x8b\x3c\x6f\xd1\x3f\xaa\x75\x53\x83\x4e\x07\x1b\x1f\xa4\x4f\x6b\xe2\xb9\xa6\xd2\x6e\x61\xc1\x38\x3e\x23\x46\x6d\x73\x33\x9e\x48\xda\x81\x54\x9e\xc7\x7e\xc7\x4d\x45\x9b\xd4\x54\x84\x1d\x82\x72\xec\xab\x99\xe1\xd8\x71\x5c\x85\x69\x10\x2c\xf2\x0c\x69\x3f\x1d\x1d\xb8\x38\x34\x77\x05\xa7\xc1\xe5\x8e\xbd\xc8\x47\x56\x58\x69\xa7\x37\xdf\x3c\x3e\x0d\x26\x3e\x18\xab\xcb\x79\x21\x11\x57\xc3\xc5\x29\x87\xc4\xd9\xad\x15\x66\xd6\xdd\x32\x76\x07\x2d\x7b\x6b\xe8\xb0\x47\x24\x91\xd3\x7e\x08\xc1\xb7\xea\x61\x97\xdb\xb5\x77\x40\x40\x34\x62\xd0\xa2\x69\x21\x7e\x52\x3a\x9d\x35\x78\xde\x41\x45\x66\x9b\xaa\x99\x10\xce\xa9\xdc\xdb\xca\xcd\xef\x1c\xd2\x82\x0a\x76\x47\x20\xc2\x9c\xc5\x01\x2f\x53\xaa\xcd\x8a\x8b\xf5\xe0\xa8\x98\x77\xdc\x11\xb9\x8b\x54\x31\x24\xdc\x21\x33\xf6\xe6\xa6\xa3\x80\x88\x23\xb3\x6c\x0d\xb3\x0a\x8c\x7e\xf8\x49\x1b\xdb\x8f\x50\x98\x6c\x36\xdd\xa1\xed\x42\xa5\xf7\xd4\x37\x69\xa9\x0a\xaa\xca\x4c\x83\x67\x8a\xab\x92\x52\x56\x78\x6c\xc2\x08\x1e\x51\x86\xbb\xea\x71\xa5\xf6\x3e\xb9\xf9\x3b\x68\xd9\x4e\xc4\xe5\xaf\xa1\x09\x15\x33\x69\x23\x6a\xe0\x5b\xa9\x76\xb7\xda\xbb\xb1\x12\xe2\x84\x13\x09\xc1\xe4\xb4\x9d\x7a\x91\x2b\xd9\x3b\xa0\x86\x81\xc1\x84\x4b\xab\xe8\xd0\xc4\x85\x58\xb9\x99\x5c\x92\xb1\x33\x9a\x63\xf7\xa4\x5f\x9d\x10\x82\xb7\x96\xf9\x51\x0f\xe1\xc6\x6e\xee\x90\xff\xf3\xbb\x28\xce\xdb\x06\x1d\x38\x19\x72\x7b\x5d\xfe\x70\x7b\xd2\x00\x84\xa2\xa8\x01\xaa\xee\xa3\xc8\x2b\x80\x8b\x64\x74\x12\xe5\xef\x10\x02\xa7\x23\x14\x6d\xac\xb7\x63\x5f\xb3\x27\xac\x97\xe3\x63\x29\x83\x1a\xce\x21\x6f\x8a\x79\xb7\x5d\x12\x9f\xe1\xac\xe1\x1a\x51\x49\xb9\xee\x50\x49\xe8\xbb\xe6\x3e\x18\xa4\x6c\x03\x5b\xa4\xe4\x72\x32\xb9\x62\x44\xef\x2a\x05\xa9\xab\x1a\x03\x90\x51\xd4\xb8\xcc\x42\x89\x0b\x7a\xc7\x10\x54\xea\x36\xb0\xc4\x22\xd2\xb1\xb0\x58\x2a\xf5\xd8\xb9\x40\xc2\x3b\x90\xdb\x49\x9d\xf7\x44\x9d\x6e\xd4\x5e\xf3\xc5\x9a\x37\xfa\xd0\xeb\x8e\x26\x66\x61\xa4\x8d\x07\x5d\x29\x63\x62\xa2\x39\x7d\xf1\x66\x1f\xd0\x16\x6a\x0e\xcb\x01\xa6\x80\xaa\xad\x36\x7b\x69\xec\xdc\xfb\x62\xe3\x3b\x52\x4a\x08\x01\xc0\x27\x51\xac\x76\xb1\x4d\x00\xec\xe4\xe8\xda\x1b\x96\xa0\xf6\xd6\xd9\xaa\x60\xd3\xa7\x39\x00\xf3\xb5\x23\xa6\x24\xa0\x77\xa4\xd7\x1d\x29\x47\xdd\x85\x12\xd1\x22\xc0\xec\xc8\xc8\x78\xaa\xd4\xcf\xbc\x33\x11\x8f\x1c\xf0\xa6\x44\xe5\x4c\xcb\x56\x40\x3f\x8e\x5b\xd2\x6b\x4a\x61\x31\xc3\xa8\xcd\x15\x0c\x05\x30\x66\x6f\x47\xb5\x93\x86\xcd\x82\x5d\xd5\xc2\x44\x30\x3a\x1d\xfd\xb2\x11\x37\x27\x3d\x8a\xee\x0e\xce\xcd\x14\x65\xa0\x4b\x9f\x87\x76\xa7\xc5\xd4\xa6\x36\x92\x83\xa0\xaf\x0a\xa7\x5c\x38\x54\x99\xfb\xb1\xed\x85\xc6\xba\x77\x7d\x5d\x97\xb9\xe3\x74\xee\x23\xf3\x84\x6c\x2d\xc8\xc8\x41\x1a\x20\x0d\xe1\x83\x65\xaa\xaf\xe3\x22\x7d\x07\x46\x14\xbb\x71\x97\xd8\xdc\x8e\xb8\x0f\x75\xe5\x3b\x5e\xb3\x32\x77\x8a\x4b\x45\xa4\x4e\x0c\x04\x83\x16\x13\xb0\x00\x58\x8b\xe4\x53\x44\x2c\x34\x0f\xc9\x7a\xa9\xf6\x3c\xe0\xee\x49\xe8\xfe\x8e\x55\x24\x16\x61\x1c\x27\x96\x07\xd3\x89\x5e\xd1\x31\x9a\xb7\x69\xcd\x7e\xc9\xed\xa1\x80\x73\x4f\x9b\x01\xdb\x22\x6b\x04\x68\xd8\xda\xc5\x7c\xff\x96\x96\xdf\xff\xd5\xff\x52\x7d\xd9\x8b\xbe\xe4\xf7\xff\xa6\x67\xba\x1f\xfc\xf4\x27\xeb\x67\xbc\xfc\x35\x3f\xfc\xe6\xbf\xf4\x61\x7f\x1c\xfe\xd6\xd7\x3e\xf5\x27\xff\xfa\x73\xbf\xe1\x59\xff\xff\x00\x0f\xf9\x45\x8f\x7a\xf3\xfb\x93\xc3\x31\x3a\x4b\x22\x66\x17\x43\x9a\x71\xf9\x13\xaa\x43\x44\x6f\x96\x19\x8b\xb3\x24\x24\xd7\x90\x4e\x93\x94\xf4\x93\xd5\x8a\x92\x7f\x1f\xd4\xf0\xfc\x9f\xfc\xff\xba\x79\xff\xaf\xab\xd8\x9d\xd8\xb6\x18\x6d\x3b\x71\x55\x42\x50\xec\x60\x37\xa6\xe2\x8d\xe9\x3e\xe0\xea\x7b\x52\xe3\x6c\x68\xcb\x5c\xd4\x74\xe8\x2b\x3f\xdc\xd1\xf9\x08\xaf\xa2\xa1\x7a\x72\x11\x05\xaf\x81\x50\x01\x0e\xce\x25\x6a\x79\x5a\x21\x69\x2e\xc4\xc2\x8b\x91\x74\x90\x7c\xd0\xb2\xc0\x19\x9b\x5e\x59\x3e\xf2\xab\x60\xdc\xf8\x60\xb1\xf0\x4e\xef\x87\xaa\xf9\xb0\xcc\xb8\x2b\x73\x00\xe0\xca\x2e\x2f\x89\xba\xcd\x54\xef\x0c\x65\x7a\xb2\xb9\x49\xfd\xf0\x30\xaa\x47\x78\x2f\x78\xba\xb0\x6d\x04\xcd\xbc\xb3\x76\x5d\x16\x1c\x4b\xf7\xee\x80\x98\xdc\xa2\xdd\xa5\x5e\xa3\x3c\xdd\x01\x51\x32\x62\x96\xa4\xb9\xc3\x77\x9c\x0b\xcb\x31\xda\xe4\x81\xe1\x95\x87\x25\xa4\xf8\xad\xe0\xec\x2c\x41\xc6\x13\xbc\x41\x8f\x68\x22\xe1\x64\x82\x3b\x11\x37\x88\x41\x51\x37\xac\x22\x75\x88\xaf\xee\x42\xd1\xc2\xaf\x18\x0f\xee\x2d\xc0\xe2\xa0\xac\x8e\x90\x57\xc1\xb0\xc6\xa9\x38\xdc\x90\x5a\x71\x3f\x4b\x4b\x7b\xba\x61\x15\x3a\xed\xe7\x66\x42\xa6\x57\xac\xb3\xe4\x76\xb9\xdc\x37\xdb\x25\x72\x29\xf6\x38\xb7\xb1\x2b\x4d\x85\xd7\x02\x9c\x39\x48\x7c\x95\x87\x69\xd9\x8f\xf0\xe9\x6c\xd6\x9f\xbb\x56\xb5\x09\x4b\x8e\x66\x36\x46\x66\x37\x65\xf1\x68\xb2\xc7\x89\xe5\x6b\xc8\x75\x49\xb7\x66\x8d\x30\x81\xe8\x86\x69\x37\xec\x85\x5a\x33\x9e\x12\xb7\x9a\xd9\xbe\x19\x9d\xf6\x91\x1c\x87\x12\xf2\xa1\x60\xe6\x92\x2c\xa9\x43\x19\x32\x18\xb9\xcf\x10\xaf\x88\x1e\x9e\x77\xf0\x08\xaf\x02\xef\x79\x5f\x6a\xd4\x48\x58\x53\x64\xa1\x75\x74\xc4\x7a\x9a\xe0\x98\x9d\xed\x0d\x07\x84\xc8\xdc\x51\x51\x0e\xc8\xcb\x69\x7f\x3d\x9c\x52\x3e\xd2\x5f\x84\x37\x34\x07\x38\xb7\xb5\x41\x91\xe0\xa6\xa2\xac\xdb\x80\x97\x97\x8c\x1f\xc1\x85\xb5\x53\x24\xa4\xe3\x3a\xbb\x22\x09\x71\x14\xdc\x70\x47\x58\x92\x5b\xe5\x04\xfb\x59\x77\xbc\xab\x81\x93\x43\x3b\x50\x7a\xf1\xb1\x9f\xc3\x9a\xe3\x5a\x71\x56\x79\x80\x8b\xc6\x02\xd4\x61\xc9\xc3\x42\x5a\x8f\xf0\x2a\x86\x44\x07\xd9\x43\x9d\xb4\x9a\xe5\xc2\x64\x27\x5b\x0c\x79\x44\x97\xb6\x3c\x81\xcb\xa5\x41\x0e\x47\xed\x2a\xde\xed\xd4\x51\x9c\x6f\x78\xcd\x58\x68\x71\x6b\x94\x97\xf3\xa0\x27\x22\x47\xa2\xf4\xd0\x73\x67\x55\xf5\x4d\x41\x44\x75\x45\xe6\x30\x97\x66\x6b\x82\x5e\x96\x99\xdd\xd1\x3b\xfc\x85\x06\x6b\x2c\x23\x42\xe2\x3a\x32\x3f\xf3\x42\x55\x25\xbb\x8e\xba\x45\xed\x8f\x69\x08\xb0\x00\x12\x22\x47\x87\x30\x10\xbc\x1e\x16\x7c\x7e\x84\xf7\x02\xf1\x9d\x73\xd0\x49\x0a\xa0\x69\x0a\x07\x87\x80\x54\x11\xe9\x16\x67\x1e\x44\x98\x60\x85\x26\x75\xf4\xe8\x33\x9b\x7e\x6f\xeb\xe1\x96\x96\x47\x78\x2f\x60\x41\x27\x80\xeb\x8c\x07\x47\x62\x39\x77\xa1\xb2\xb1\x4d\x55\x16\x34\x69\x97\xf5\x60\xdb\x4a\x2b\xe3\x44\xe2\xd0\x13\x5e\xbb\xa4\xf3\x86\x55\x00\x8b\x61\xab\x49\x4a\xbf\x4c\x59\xf8\x8c\x9a\x1a\x8e\xdc\xba\xda\x98\x3b\xb7\x60\x83\x9b\x14\xd4\xc2\xb5\x27\x3d\x74\xcd\xfd\x61\x75\xfd\x47\xf8\x8b\x50\x90\x90\x42\xa7\x2e\x06\x33\xd8\xfa\x30\x4e\xf1\x22\xcc\x51\x67\xd7\x97\x81\x3a\xa5\xae\x09\xab\xeb\x3c\xc3\xa0\xf2\xe2\x05\xdc\x70\x3a\x59\x76\xf2\xea\xf5\xda\x4e\x2f\xe4\x12\x73\x5b\x6a\x6f\x62\x75\x19\xf7\x0a\xab\x9c\x57\x62\x4c\x42\x20\xfb\x4a\xd1\x18\x6d\x4e\xec\xef\x78\xd9\xf9\xd8\x54\x44\x1d\x0c\x8d\xa2\x49\xee\x8a\x82\x10\x53\xfc\x59\x91\xde\x67\x9f\x62\xe0\x93\x9c\x60\x20\x0f\x67\x6f\x4d\x82\x56\xd8\x0d\xab\xe8\xa4\x79\xe0\xf6\x15\xb5\xa7\x92\x44\xbb\xf9\x6b\x1b\x66\x14\x0d\x9d\x1c\x55\x30\x81\x2c\xb7\xb1\x73\x38\x81\xa1\x8b\xfb\xf5\xf0\x54\xa7\x47\x78\x15\x65\x63\xf3\xc4\xd8\x1f\xcb\x6e\x1b\x8b\x88\x57\x04\xf1\xe1\xeb\x25\x05\x92\x93\x1a\x0c\x11\x02\x5a\x48\xd9\x27\xa1\x5d\x67\x7c\xcb\x1d\xb1\x12\xb6\x1d\x1d\xa3\x80\x26\xe3\xee\x83\xa3\x79\x3a\x4b\xda\x50\x73\xe1\x13\x98\xe8\x1c\x8e\xf2\x5c\x38\xac\x0c\x59\x25\x1e\xde\xf0\x45\x98\x4a\xd1\xed\x3d\x51\x06\x23\xca\x68\x56\xdd\x03\x4b\x8a\x5d\xec\x44\xb9\x1f\x4d\x01\x9a\xc6\xc0\xd6\xcb\x73\x78\x34\xac\xd0\xfc\x8e\x88\xcf\xa0\x45\x73\x0b\x05\x4b\xb0\xcf\x7d\xbb\xb4\x95\x2d\x59\x1e\x47\x43\x98\xb8\x30\xb6\xa9\x34\x37\x3d\x5e\x97\xa2\xf8\x80\x2d\x3d\xcc\xe9\x7d\xa4\xf3\x11\x21\x6c\x8a\xe1\x34\xad\x2c\xdd\x37\x86\xa7\x3c\xce\x60\x25\x5c\xfc\xac\x8d\x43\xd6\xc9\x99\x71\x40\x99\x12\x87\x37\xb7\x71\x7a\xc3\x3b\x42\x03\x6f\x60\x73\xc7\x26\x46\x18\x3c\xf8\x14\xd4\x90\xd7\xd5\x94\xc5\x29\x6e\xc6\x91\x8e\x2f\x45\x90\xf0\xfb\x29\x82\x39\x7a\x3f\xe9\x0d\xf1\x05\x25\xa7\x5a\xd5\x1d\x40\x5e\xa7\x0e\x3e\x73\x92\xcc\xdc\x9a\xa2\x3e\xc4\xb0\x23\xa5\x81\x18\xa9\xa4\x23\xed\xb1\x64\x7f\x31\xb9\xaf\x1b\x6e\x2a\xbb\x84\x85\x59\xe5\xb2\xd8\x9a\xf6\xa0\x32\x9a\x49\xc8\x4c\x6e\xd3\x61\x1c\xda\x67\x39\x34\xf3\xf8\xa0\xd1\x7b\x01\xbd\xbc\x92\x59\x37\xec\xc5\xd8\x20\x18\x9d\xa1\x34\xa5\x26\xd2\x76\x11\x65\xda\x47\x04\xe9\xd4\x5e\xc3\x1e\xa9\x52\xac\x52\xb7\xe1\xb9\x93\x91\x28\x5f\xee\xbf\xc6\x5a\xff\x05\xf0\xf8\xbc\x5f\xfa\xce\x97\x7e\xec\xf7\xf0\x6f\x79\xec\x5b\xbf\xff\xcf\xc7\x77\xff\xad\x6f\xfd\xd8\x7f\x13\xde\xf3\xc9\x2f\x7b\xce\x37\x3f\x53\x7d\xcb\xef\xfc\xf1\xff\xed\x9b\x5e\xfc\xc8\x03\x1e\x8c\x83\xb3\xbb\x16\xd8\x06\x49\xbf\x4a\xc5\x8e\x1a\xdf\x99\x66\x57\xc2\x26\x86\x46\xce\x82\xd6\x6a\x64\x30\x3a\x61\xd3\x27\x56\xe0\x86\x80\x84\xa1\x16\xa3\x04\x2b\x56\xcb\xbb\xe1\x00\xec\x1d\x6c\x1d\x01\x0c\x21\x23\x73\xed\xd2\x59\x1e\xb3\xb6\x62\x5d\x73\xb4\x95\xc6\x74\x37\x40\x0d\x94\x0b\x36\xc3\xe6\x89\x6a\x45\xa8\x45\xbd\x60\xcb\x0d\x7c\x6a\x83\xc2\x89\x89\xe6\xb8\x64\xac\x5a\xb0\x2a\xee\xbe\xe2\xea\x8f\xfd\xbc\x61\x15\x3e\x24\x06\x02\x06\xc3\xec\x64\xd6\x2b\x69\xe9\x85\x76\x9b\xaa\x74\x8c\x93\x6c\x5b\x57\x28\x6d\x7d\x79\xe4\x04\x0c\x67\xd2\xdd\xdf\xf1\x08\x17\x25\x27\xeb\x67\xba\x50\x36\xb9\xd8\x43\x37\x67\xe2\x76\x21\x75\xa9\x92\x14\xe0\x25\x19\xc0\x88\xb4\x79\x48\x2a\x75\x57\x47\xbe\x63\x15\x08\x77\x15\x41\x3f\x80\x97\xa2\xfa\x1c\x71\x3d\xe5\x20\xe8\xd8\x57\xdf\x3c\xd4\x35\xf6\x4c\xb5\xad\xee\x20\x5e\xa9\x0c\x5a\x00\x77\xa4\x51\xdb\x19\xb7\xd4\x89\x36\x9b\x01\x0e\x5d\x38\xcf\x56\xad\x99\x02\x7b\xd6\xe8\x81\xa9\x6a\xf1\x9a\x0c\x9e\x48\x62\x2b\x0f\x02\xc8\xba\x23\xb1\x75\xc6\x0b\x82\xe7\x86\x69\x6b\x44\x21\x03\x25\xed\x64\x0f\x18\xbb\xd0\x67\x6f\xc9\xb0\x60\xe1\x76\x9c\x6e\xa3\x46\x31\xd7\x36\x70\x47\x92\x8f\x20\x8c\xe6\x00\xc3\xb4\x6a\x46\xa7\xed\x90\x5a\x19\x15\xd4\xd9\xd6\xbe\x9b\xd3\x83\xc3\x5e\xc0\xcf\xed\x74\x41\x87\x72\x36\x62\x6f\x08\x8b\x18\x61\xdc\x79\x98\x19\x44\x45\xe4\x43\x97\xd8\xb3\xdf\x5c\xd4\x05\xec\x71\x24\xb5\x8d\x59\xae\x8d\xd9\xab\x4c\x0c\x42\x9b\x82\xd9\x7e\xc3\x5e\x5c\x50\x1c\xd1\x78\x1a\xb3\xe6\xda\xe7\xeb\x24\x8c\xca\x60\xed\x65\x2f\xf3\x90\xb7\xc2\x83\xd5\xad\x66\xe1\x6b\x0b\xea\x28\xa5\x5c\x77\x80\x82\xd0\x93\xba\xc4\x99\x75\x3d\x00\x6f\xa3\x9a\x23\x7a\x7f\x91\x2e\xac\xaf\x20\xc0\x5e\x22\x6d\xe7\xa9\xfb\xb0\x08\xb9\x1d\x78\xe1\xee\x48\x29\x6d\x3c\xb4\x64\x87\x32\x6e\x56\x7c\x8a\xae\x48\xa9\x1b\x24\x69\xa4\x5d\xd1\xad\xb3\x15\x8e\x59\x77\x00\x0b\xf7\x08\x1d\xed\x2c\xd7\x1d\x60\xb1\x70\x53\x0a\x39\x27\xd9\x2f\x80\x12\x03\xb8\x39\x99\x07\xc4\x8a\x86\xe5\x8f\x32\x39\x38\xe2\x16\x98\xb3\x20\xa9\x1e\x34\xd3\xb7\xa4\x0e\xae\x65\x9d\xf6\xed\x4c\x95\x59\x79\x9c\x76\x65\xa7\x35\xe8\x87\x59\xe2\x6a\x50\x54\x16\xe6\x68\x52\xa8\x5d\xee\x67\x5c\xbb\xd7\xee\x0e\xa8\xc1\x5c\x82\xf4\xe3\x72\x6e\x8f\xd2\x2d\x7c\xc1\x75\x7a\x30\x0f\x13\x46\xcd\xec\xc2\x6c\x2c\xe2\x49\x1c\x26\x9e\x3c\x75\x6f\xc2\xb4\x37\x84\xcb\x54\xa3\x83\x93\xcc\xbc\x4a\x3e\x9b\x2d\x49\xb3\x7b\x6b\xa9\xd0\xd9\x0b\x2b\x8e\x51\x45\xab\xce\xd1\xb9\x1f\x07\xcb\x9b\x4b\xbe\x5c\xf9\x86\x55\x30\x06\x0e\xe6\xe3\x72\x4c\x31\xc5\x2f\x5d\x63\xe3\x12\x02\xdd\xb3\x69\x5a\x9d\x2b\x21\x47\xe7\xd8\x36\xb5\x2b\x7e\x1c\x69\x5c\xe9\x06\xa8\x81\x72\x7d\x01\xee\xdc\x35\xf6\x4b\x76\x29\x42\x65\xa1\xe1\x06\xcf\xda\xed\x69\xa8\x8d\xce\xa7\x19\x6c\x69\xb1\xf8\x23\x91\x4e\xce\xe2\x6e\x38\x17\xac\x3b\x85\x87\xa5\xba\x90\xbe\xb3\xe9\x59\xd6\xdc\x50\x25\x6d\x97\x97\xf2\xa1\xc0\x43\xac\xee\xaf\xc4\x05\x53\x26\x60\xb8\xd3\x1b\x8a\x4b\x2c\xc2\x75\xe1\x31\x79\x5a\x75\x4a\xb1\xef\xaa\x8b\x9e\xd3\x09\x1a\xb3\xba\x79\x5e\xe3\xc1\xad\x45\x25\x3b\x1a\x48\xcc\x18\xed\xeb\x8e\xf4\xba\x40\x9f\x67\xef\x1b\x9e\x95\x4e\xc4\x63\x3c\x24\xce\x97\x1b\x6b\x26\xdb\x0f\x7b\x9e\x64\x0d\x47\x52\x4d\xc5\x26\x5e\x78\xac\xfc\x06\x0f\xce\xfc\xaa\xee\xac\xe5\xe2\x41\x6e\x7b\x74\xc9\x15\x17\x8f\xde\xe7\xc9\x80\x1c\xc1\x0e\xc3\x3d\xeb\x42\xe1\x8c\x67\x32\xca\x94\xc5\xef\x28\x22\x64\x59\xa7\xea\x6e\xc2\x61\x23\xec\x1b\x8c\x52\x1d\xc9\x76\x67\xb8\x20\x65\x5d\x89\x97\x08\xda\x8c\x61\x36\x78\xb0\x2d\xa3\x93\xde\x91\xe4\xf3\xed\x4c\x4e\x12\x42\x6b\x35\x42\x0f\x23\xc1\x81\x49\x4f\x28\x17\xf9\x50\xca\x7d\x5c\xd3\x2d\x8c\xa7\x68\x64\xca\x73\x27\x99\xb1\x3b\x4e\xe7\xa9\xd8\xce\x07\x5f\xe7\xc9\x79\x46\xee\x30\x9c\xb8\x4d\x27\xb2\x99\x1e\xd8\x75\x5c\x02\x6c\x24\x2c\x59\x85\xaf\xeb\x52\xcd\x10\x7e\x47\x94\x33\x08\xe4\x27\x3c\x73\x72\xbe\x85\x71\x8a\xeb\xca\x6e\x3b\x51\x8b\xb3\xcc\xd3\x32\x47\x36\x98\x76\x57\xb6\x6b\x8f\x3d\x6f\x40\x9b\x75\x43\x3e\xc2\x2a\x92\x35\xf6\x15\xcf\x3c\x8f\x2e\xa4\xd9\x36\x07\x2a\xe5\x11\xe2\xb4\x9d\x18\x1a\x82\x72\xb0\x79\x4d\x88\x86\xb3\x1b\x59\x7c\xbf\xc3\x77\x6e\xe7\x0c\x3e\xb2\x0d\x11\x31\x4e\x39\xed\x0c\x59\x48\x77\x1d\xda\x24\x72\xae\xee\x76\x31\x62\xea\x8a\x42\xc3\x8f\xab\x10\x50\xf2\x0d\x65\x60\x36\x0a\x08\x42\x14\x72\xc6\xb5\xd9\xfd\x9c\x18\x39\x71\x69\x55\x65\x17\x23\x0a\x6f\x8e\x53\xd8\xd1\xb3\x4d\x41\x9c\x6c\x1f\x7a\xbb\xa5\x30\x2f\x53\x40\x9c\xd3\xb1\x03\x5f\x20\xd9\x2e\x32\x27\x6f\x67\x3f\x4f\x3d\x0f\xd8\xaa\xb1\x4d\x84\x88\xf3\xa1\x1c\x75\x1a\x8c\xd1\xc1\x1d\x5e\xcb\x42\x72\xfa\xa4\x69\x15\xc1\xaf\x7a\x80\xb0\x5b\x76\x84\xe0\x59\x32\x03\x00\xb4\xe1\x68\xaa\xaa\x3c\x96\xad\x6f\x22\xe2\x52\xf2\x7f\x8d\x72\xbe\xe5\x37\x3f\x0c\x78\x3c\xea\x9d\xe2\x7b\xc5\xdf\xfb\xbd\xf1\x79\xdf\xf4\xd6\xd7\x3d\xed\xb7\xbc\xf9\xe3\xbf\xe4\x3b\x3e\xeb\x0f\x3c\xfa\xd5\x5f\xfd\x15\xff\xe1\x3f\xfc\x0c\xf9\xf8\x2f\xfe\xbe\x3f\xf8\x30\xe0\xf1\xed\x9f\xf8\xea\xcf\x78\xda\xa7\x3d\xea\xe1\x3f\x79\xc3\xd7\xfc\x96\xa7\x7f\xd7\x2b\x3f\xe9\x39\x6f\xfc\xb2\xf7\xfe\xb5\x37\x7d\xc9\xdb\x3f\xe7\x39\xf8\x45\x9f\xf4\x89\x2f\xf8\xb7\xe7\xb3\xdf\xf8\x8e\x8f\xf8\xaa\x8f\xfd\xae\xa7\x3f\x60\x5a\xff\xed\xcb\x5e\xf5\xe7\xbe\xfe\xb3\x5e\xf2\x91\xaf\xff\xb0\x17\xbf\xe4\xb7\x7f\xf8\xf3\x7e\xf9\x9f\xbd\xf1\x37\xbd\xee\x07\xdf\xf9\x9c\x0f\xf9\x3b\x2f\x79\x63\xfe\xc4\xe7\x3c\xe3\x01\xd3\xb7\x3d\xf1\x1b\x3f\xe7\x2b\xdf\xf6\xae\x97\x3e\xfa\x9b\x5f\xf8\xb1\x3f\xf5\xa8\x47\x3d\x26\x7d\xc5\xff\xf1\xc3\x7f\xff\x1b\x3f\xee\x87\x9e\xf2\x75\xbf\xfe\xfc\x67\xbf\xee\x43\xbe\xe5\x01\xd3\x2f\xfd\x53\x1f\xfc\x07\x1e\x07\xbe\xfd\x7f\xfa\x4a\xfd\xa4\x57\x7f\xfe\x6f\x7a\xdd\x87\xbf\xf2\x4d\x3f\xfd\x63\x1f\xf2\xad\x7f\xe1\xc7\x3a\x7a\xe5\x9f\xfe\x0d\x5f\xff\x22\xfb\x80\xe9\x8b\x3e\xff\xdf\xbe\xf2\xc3\xdf\xf4\x96\xc7\xbd\xf4\xa3\xf8\xbf\xfe\x67\x7f\x05\x7e\xed\x17\xbd\xe8\xe3\x3f\xfa\x77\xfd\x59\xf7\xfa\x9f\x2a\x3f\xf0\x33\x2f\xfe\xe5\x2f\x78\xc2\x03\xa6\xcf\x7f\xcd\xab\x9f\xff\x3f\xfc\x9e\x8f\x6a\xef\x7c\xd1\x9b\x3f\xf9\x3f\x7d\xfb\x4b\x7f\xcb\xef\xfd\x86\xf1\x4f\x7f\xe5\xb7\x3d\xf9\x7b\x3f\xf1\x45\x6f\xfe\xec\x3f\xf6\xf6\x27\xfc\xc8\x03\xa6\x9f\xf7\x96\xb7\x3d\xed\x47\xde\x28\x3f\xfd\x51\xaf\xfa\xac\x7f\xf7\xdd\x7f\xfe\xe7\xdf\xf9\xcc\x2f\x36\xff\xf2\x63\xde\xd0\x1e\xf7\xa1\xe5\x3b\x7f\xe3\x57\xfc\xd1\xf8\x96\x07\x4c\x19\xdd\x9f\xf5\x7f\x3f\xe6\x0b\xd3\x2f\xbe\xf8\xd3\x9e\xf5\x23\xfb\xef\x7b\xe2\xd3\x5e\xfa\xd1\x4f\x7d\xea\xef\xb6\xff\xe8\x17\x9e\xf9\xef\x9f\xfe\xc2\xd7\xbf\xf7\xcb\x1f\x30\x7d\xd7\x7b\x9e\xf2\x8f\x9e\xf2\xf4\x7f\xf5\xd4\xdf\xf0\x0d\x5f\xfb\xd5\xdf\xf4\x31\xdb\x1b\xfe\xce\xdf\x7d\x26\xfb\x9d\x7f\xf8\xf3\x3f\xef\xc7\xbf\xf7\x8f\x3e\xed\xf7\xbf\x63\xfe\xc9\x07\x4c\xff\xde\xa7\xfc\xc4\xb3\xfa\x97\x7e\xe3\x0b\x7f\xf1\x47\x7f\xe5\xb5\xe3\x8b\xe2\xc7\xfc\xfa\x73\xd0\x0b\xf1\x3f\x7f\xca\xdb\x3f\xeb\x27\xe6\x57\xf7\x37\xbf\xe1\x77\x3d\x60\xfa\x98\x7f\xfd\x0f\xbe\xe6\x95\x99\xff\xed\xe7\x7e\xc1\x7f\x7c\xf2\xdf\xfa\x81\xbf\x01\xff\xc7\x8f\x80\x1f\xf4\xd1\x6f\xfb\xf3\x8f\xff\xb4\xc7\xc8\x67\xbc\xe4\xaf\xbc\xee\x3f\x3d\x60\xfa\x6d\xe4\x0b\xff\xcd\x9f\x4a\xef\x7a\xe7\x7f\x78\xf4\xab\xde\xf8\xef\x9f\xf4\xda\x8f\x7c\xc2\x4b\xf1\x7b\x9f\xf4\x2b\x9f\xa4\x5f\xff\xb3\x2f\xf9\x89\x9f\x7b\xcb\x6f\xfb\xa1\x07\x4c\x7f\xc7\xeb\x7f\xe8\x47\x7f\xf0\xc5\x8f\xfe\xc7\xfc\x2d\xdf\xc3\x5f\xf6\x49\x9f\x57\xde\xfc\xbd\xe9\xe5\x8f\xf9\x9d\x7f\xe1\x0f\x7f\x85\xfb\xd2\xa7\x7c\xf1\x93\x9f\xfb\xb5\x0f\x98\xfe\x86\x6f\xfa\xe0\x5f\xf8\xb2\xb7\xfc\x89\x8f\xfe\x86\x37\xff\xe4\xf3\xff\x85\xfc\xd6\x97\x7e\xca\x5f\x7c\xeb\x97\xbe\xf6\x31\xf6\xb1\xdf\xc8\x5f\xf4\xa9\x8f\x5d\x9f\xf1\x99\x0f\x98\xfe\xe5\xb7\xff\xf7\x6f\x7c\xed\x0f\x3c\xfb\x9d\xff\xf1\x97\x1e\xfd\xaa\x27\xfe\xc5\x4f\xfa\x95\x6f\x7b\xc3\x77\xbc\xfc\xdd\x9f\xf1\xa2\xd7\x7e\xca\x73\x7e\xdf\xb3\xde\x1d\x7f\x71\x3d\x60\xfa\xdd\x4f\x7e\xef\x53\xdf\xfe\x91\xaf\xf9\x4b\xe6\x59\x2f\xfe\x88\xaf\xfc\x8b\x1f\xfe\xd8\xa7\xfd\xcf\xdf\xf6\x7b\x5e\xf8\xa6\x1f\x7d\xc6\x3f\x7e\xf6\xcf\xbe\xaa\x7f\xfd\x2b\x7f\xf5\xc1\x4f\xf0\xdc\xfe\xef\xde\xf9\x5a\xf5\x47\xbf\xe1\x9d\x1f\xf2\x96\xcf\xfa\xbe\xd7\x7d\xd6\x13\x5f\xf6\xec\x5f\xfa\x0e\x26\xc2\x77\x3e\xee\xd7\x5e\xf8\x95\x76\xc4\x07\xff\xad\x1f\x75\xf0\x09\x5f\xf3\xf9\xaf\xf9\xec\x3f\xf3\x2f\x9f\xf0\xdf\x3c\xe9\x4f\x3c\xf1\xf1\x8f\xfe\xa6\x2f\xf9\xf8\xc7\xfd\xec\x73\x9f\x70\xbc\xec\x23\xff\xc9\xaf\xfd\x83\x07\x0f\xe1\xd7\x7e\xc2\x07\xff\xc2\x1f\x78\xfe\x9f\x7e\xde\xcf\x7c\xe4\x79\x3e\xfa\x7f\xff\xd9\x97\x7c\xe7\xb7\x7f\xd0\x57\xfc\xb4\x7b\xc5\x0f\x7f\xea\xcf\x97\xcf\xfd\xa2\xbf\xf0\xd8\xfd\x01\xd3\x6f\x79\xe2\xc7\x7d\xee\x3f\xf9\xbc\x57\x7f\xfd\xd7\x7c\xd7\x3b\x5e\xf0\x99\xfa\x2f\xfd\xa9\x3f\xfd\xee\xd7\x3f\x9b\xd6\x97\x7d\xcf\x21\x9f\xfd\x2f\xfe\xe3\xdb\xae\x4f\x7e\xc0\xf4\x97\x9f\xf0\xaa\x57\x7d\xfa\x3f\xfd\x8c\x6f\xfe\x1b\xbf\xef\x0b\xde\xf9\x6e\xf0\x04\xf5\xa4\x17\xfc\x46\xfb\xea\xfa\x43\x6f\x2f\xcf\x7e\xf2\x63\xdb\x97\x7f\x26\x7f\xc0\xf4\x25\xaf\xff\xda\x77\x3f\xfe\xe5\xcf\xf8\xc6\xff\xf5\x27\x9e\xf7\x9a\xd7\xfc\x32\xfd\xf9\x3f\xf9\xb8\x1f\x7f\xd7\x7b\xbe\xe0\x43\xb7\x5f\x3f\x9e\x9f\xbe\xf0\x7b\xfe\xd9\xcb\x1f\x30\xdd\xde\xf0\x8a\x33\xbc\xf3\xa7\x3f\xff\xd7\x5e\x8d\xbf\xe8\x29\x7f\xe4\x69\xef\x6a\x7f\xf7\x83\x5f\xf2\xee\xbf\xfd\x53\x5f\xf8\xaf\xfe\xe6\x1b\xbf\xec\x17\x7f\xc7\x27\x7d\xcf\x03\xa6\x2f\x78\xed\x4b\xbe\xf2\xe3\x3f\xe5\x3b\x9e\xf7\x11\xc7\x5f\xf9\xf7\x3f\xbe\x3d\xfa\xb5\xcf\x1f\x2f\x7e\xd2\x2b\x7e\xfb\x1f\xff\xd0\x9f\xf8\xed\x9f\xf0\x33\x2f\x78\xea\xcf\xfd\xc0\x03\xa6\x4f\xf9\xd6\x47\xbd\xea\xf1\x5f\xa1\x9e\xf0\x41\x9f\xfc\x3c\xfd\xf7\xdf\xf1\x51\x7f\xe7\x53\x5f\xf9\xc5\xdf\xf6\x4f\xff\xde\xe7\x3c\xee\xc5\x4f\x7f\xc3\x33\x3f\xf7\xed\xf4\xc1\xbb\xf5\x97\xff\xc1\x3b\x7e\xee\xb1\x2f\x85\xbf\xfa\xee\x67\xfe\xdc\x63\x5f\xf1\xf7\xff\xf1\xcb\x3e\xfb\x37\xfe\xf4\xe3\x9f\xf5\xba\x5f\xf8\x27\xdf\xf7\xaf\xbe\xe3\x9f\x7f\xd5\xcf\x3c\xe7\x23\x1f\x30\xfd\xa0\xb7\xbe\xe0\xf1\x9f\xf0\x9b\xdf\xf9\x87\x3f\xe7\x97\x9f\xf7\xf6\x0f\xff\x37\x9f\xfe\xd6\xef\x7f\x97\xda\xcb\x67\xbf\xe4\xd3\xde\xf8\x87\x3e\xfb\xbd\xbf\xfa\xb4\x97\xfc\xfc\x03\xa6\xdf\xf3\x57\xff\xbb\x57\x3c\xfd\x93\x7f\xec\x4d\xef\xd8\xbf\xfb\xc3\x7e\xdb\x53\xfe\xea\x2b\x7e\xfc\x5d\x1f\x66\xff\xf3\x8f\xd4\x4f\xf9\x63\x9f\xf0\x75\xcf\xfc\xcd\x3f\xf9\xbc\x3f\xf1\x80\xe9\x5b\x7f\xf0\x6f\xfe\xc9\x9f\x7d\xc1\x0f\xbc\xe7\xbb\xbf\xf7\xf5\x3f\xf4\x9e\x7f\xf7\x6b\x3f\xf8\x51\x2f\xfc\x23\x3f\xf2\x0f\x7f\xfc\x2f\xbf\xfe\xf7\x7c\x35\xf8\xce\xef\xff\xee\xff\xfc\x65\x0f\x98\xfe\xf5\xf7\xb0\xbf\xf5\xf8\x97\xff\xd9\xb7\xfd\xf0\x97\x7e\xda\xfa\xd0\xe7\xbf\xee\x07\x7f\xef\x9b\x1f\xf3\x55\x3f\xf5\xbf\xfc\xd6\x77\x3c\xe9\xc7\xde\x96\x9f\xc1\xde\xf4\xb6\x07\x4c\xbf\xfe\xc5\x5f\xfe\xb9\x1f\xfd\x87\x7e\xec\x79\x6f\xfc\xc2\x6f\x7a\xfa\x9f\xfb\x33\x9f\x02\xfb\xc7\x7d\x5c\x39\xde\xfe\xdf\x7e\xdd\xdf\x7e\xcd\x53\x5f\xf8\xca\x27\x3e\xe9\x1f\x3e\x60\xfa\xe6\x9f\xfe\xa9\xbf\xf1\x9e\xc7\xfc\xd2\xaf\xfe\xe4\xb7\x9b\xef\x7a\xae\x79\xfe\x73\xdf\xf4\x55\xea\xbd\xcf\xf8\xf4\x3f\xf8\xec\xff\xf3\x69\xef\xf8\x98\xef\x7b\xf6\xb3\x7e\xf4\x1b\xfe\x0b\x02\xfd\x81\xbc\xeb\x0d\x94\xbb\x19\x4f\x77\x8e\xda\x77\xbc\x25\xb3\x87\x56\xb0\xe0\x2e\x62\x9f\xe8\x71\xb2\x2d\x51\x43\x92\xc1\xd1\x0c\x83\xf1\x20\x76\xa3\x1c\xde\x11\xf1\x61\xae\x78\x95\x57\x27\x61\xe4\xb5\x4e\x62\x62\xf3\xa4\x24\x07\x4a\x6f\x67\x58\x53\xb8\x1e\x77\x0b\xf4\x3e\xd3\x5e\x8e\x7d\x6d\xf6\x0e\xec\xb7\xe5\x58\xc5\x0e\xe6\x9e\x9a\x3c\xdd\x76\x5d\x08\x34\xa7\x18\xde\xa0\x51\x2c\xa1\xf3\x30\xa5\x26\x75\x64\x49\xc7\xb2\xa7\xda\xba\xb3\x37\xec\x45\xe1\xb2\xd4\x76\x06\x7f\xac\x5e\x85\xc9\x9b\xf7\x7b\x55\xfb\xa0\x23\xed\x5a\x95\x5e\xe8\x94\xa6\xae\x81\xac\x4f\xc4\x0d\x6a\xfc\x1d\x35\x81\x79\x40\xce\xed\x61\x07\xe2\x15\x5d\xcb\x2d\x79\xa1\xc1\xdb\x9a\xbd\x5f\x4a\xa3\x00\x36\xc9\xc6\x1c\xd1\xa0\x1d\x4c\x9d\xf7\x02\xef\xa0\x62\xce\x32\x6b\xf1\x75\x61\xaa\xf6\x13\xf1\x83\x5e\x01\xab\xfd\x1c\x92\x45\xd2\x61\xd2\x71\x20\xd4\x36\x88\x00\x12\x31\xe4\x9d\xaa\x72\x07\x7e\xd1\x10\xd8\x4d\x25\x4c\xd4\x71\xb0\x00\xa2\xa9\x39\x44\x75\x74\x8b\xed\x24\x40\x4c\x49\xc3\x29\x86\x9a\xb8\x25\xed\x89\x9b\x99\xdf\x42\xc5\x6c\xd0\xf5\x51\xad\xbd\x32\x60\x45\x2a\x77\xc8\xa5\xc8\x26\x90\x3a\xe0\x1a\xcd\xca\x26\xc2\xb5\xd0\xd6\x2a\x3d\x2e\x00\x65\xf2\xb7\xe0\x5a\x8e\x02\xc9\x3a\xf2\xca\x72\x6f\x2a\x20\x47\x77\x18\xec\x1c\x5c\x90\xa1\x5a\xb3\x84\x73\x44\xe7\x98\x55\xbb\x94\xe4\x4a\x79\xdd\x90\x2d\xb3\x22\xae\x74\x8a\x8d\x14\xd8\xa4\x30\xba\x28\x33\x46\x6c\xb9\x89\x4c\x57\xb7\x7e\xf2\x30\x5b\x21\x92\x0c\x46\xf6\x80\xae\x90\xae\x3b\x48\x4d\xa7\xdc\x4a\x6c\xc4\x0b\xed\x37\xd9\x3a\xe7\xb2\xb0\x23\x96\x54\xeb\x55\xab\xa5\x50\x67\x55\x51\xdf\x46\x11\x04\x93\x6d\xdb\xc0\xba\xa3\x0c\xcc\xd8\xb5\x1a\xb0\x8a\x4a\x33\x72\xdb\xd7\x3a\x0e\x82\xac\x3c\xcc\x46\xe1\x99\xcb\x48\x5e\xce\x75\x0e\x7b\x98\xe4\x59\x1c\xbc\xde\x52\x1f\x69\x76\xd2\x40\x78\xde\x4d\x5d\x0b\x91\x70\xad\x12\xc3\xa6\xfb\xd1\x83\x3f\xf2\x28\x25\x9b\xd6\x30\x8d\x2c\xa6\x33\x35\x36\x16\xbf\x83\x4e\x94\x17\x40\x3a\x4d\x28\xae\xba\x38\xef\x8e\x83\x7d\xb3\x38\x94\xb6\x76\xef\x74\x49\x60\x8e\x38\x2b\xe1\xf9\xd0\x9c\xee\x2d\xed\x53\xdc\x91\xb3\x33\x1e\xb7\xa9\x37\x4a\xc1\xde\xaa\x72\xc7\xa2\x23\x1b\x54\x41\xc3\xc5\x8f\xc8\xad\x01\x58\xcc\x1d\x34\x4b\xf3\x2c\xa2\x76\x70\xc3\x3b\x42\xb7\xe2\x93\x4e\x66\x1e\x42\x53\xee\x2e\x26\xd6\x49\x41\x19\x58\x19\x69\xa2\x38\xc4\xe6\xe5\x8e\xb6\xb1\xa9\x12\x43\x04\x80\x98\xfd\x8e\xd3\x89\x4c\xe6\x7b\xc6\xd9\xe2\xd2\x95\x7d\xc8\x33\x74\x4c\x21\xa8\xf2\x8c\x2b\x57\xe5\x9c\xca\x61\x2f\xb0\x58\x79\x5c\xa4\x40\x6d\xe7\x1d\x75\xb3\x0b\xb2\xad\x14\x94\x83\xdc\x1c\x3d\xda\xa8\xde\x9c\xa1\x00\x0b\x83\x4b\xb6\x01\x03\x10\x50\xc7\xe6\xe4\x76\xb0\x32\x28\x73\xa7\xbb\x83\x96\x9a\xdb\xd1\xc1\x2a\x85\x06\x76\xe1\x18\x8b\x14\xb6\x6b\x25\x70\xa1\x66\xda\x30\x7a\xb0\x73\xdb\x82\xde\x96\xab\xee\x00\x27\x1e\xe9\x8e\xf8\x42\xab\x5a\x76\x18\x66\x38\xed\x92\x90\x06\x5b\x8d\xb9\xd0\xbe\x9f\xcd\xb9\x2d\xdb\x54\x41\xdb\x73\x58\xfd\x1a\x1e\x59\xd6\x69\x31\x77\xd0\x46\x7a\x48\xe7\xca\xcb\x59\x63\xb3\xdd\xa9\xe7\x5d\xd1\x7e\x6a\xef\xb8\xdf\x77\xba\xa3\xd9\x11\xd1\xdc\xc1\xd4\x20\x04\xb3\x8e\xf3\x96\xd3\xd9\xc6\xa9\x01\x3b\x67\x29\xa5\xb0\x92\x00\x27\x97\x5d\x47\x33\xc1\x6e\xf1\x22\x5c\x42\xb3\x39\x53\x36\x08\x45\xb2\x82\xbe\xaf\x8a\x78\xc3\x5e\x1c\x96\x08\x5d\xe4\xe0\xa2\x06\xc0\x2d\x08\xed\xc0\x4a\x76\x97\xb0\xf4\x17\x4d\x26\x5f\x58\x6e\x3b\x3d\x8b\xd6\x09\xa1\xc6\x2b\xbc\xe1\x8e\xb0\xaa\xb1\xd6\x4e\x17\xbe\x97\x29\x95\x4a\x12\x40\x84\x8f\x04\x3a\x4c\x74\x70\x56\x5b\x49\x87\xda\x05\x10\x9b\x75\x1b\x76\xa7\xa1\x77\x54\x75\xf3\x21\x46\x5d\xe2\xba\x0a\x81\x1c\x1d\xc8\x02\x31\xa6\x81\xc7\xa6\x09\x3d\xdc\x65\x35\xdc\x33\x07\xb8\x03\xd8\x4d\x53\x9a\x0b\x7e\x07\x21\x94\x40\xd8\xc7\xb5\xed\x1c\xef\xe8\x0c\x1d\x92\x95\x69\xa8\xa2\x49\x5a\x94\xcc\x40\x51\x73\x05\x38\x31\xd1\x64\x43\x29\x68\xa4\xdc\x0d\xe7\x82\x52\xd5\x15\x3c\xbc\x84\x3a\x14\x74\x29\x30\xe6\xb6\xe7\x39\x03\xa2\x4e\x22\x77\xa2\x96\xeb\x31\x7d\xde\xd3\xd2\x88\xda\xc4\xec\xba\xe1\x35\xa3\x52\x0b\x94\x2e\x5c\x68\x4f\xa6\x0e\xaa\xc6\xb2\x0b\x64\xce\x24\x3b\x77\xda\x56\x91\x36\x93\xb0\x74\xad\x8d\x6d\x8c\x4e\x45\xed\x1d\xe4\x58\x54\x66\xa0\x07\x0f\xf1\xba\x6a\x3d\xb0\x2f\xb8\x6f\x45\xb2\x62\x4e\x36\x90\xdd\xc6\x51\xb0\x3a\x23\x08\x6a\x56\x08\x1b\xd4\xc6\x80\x3b\xee\x48\x3d\x46\xf5\x5e\x34\x7e\x7a\xe2\x7d\x58\xe7\x16\x58\x18\x74\x02\xb9\x66\xd9\x1a\x76\x8d\x47\xca\x34\xd2\x65\xec\x14\x99\x49\xef\xc8\xcd\x9a\xbe\x90\x72\x90\x94\x30\xba\x1d\x7c\xb4\xdd\xc3\x65\x27\xbc\x60\x1b\x50\xd2\x91\xc0\x96\xd5\xb6\x9d\xfb\x71\x8a\x03\x5e\x96\xb2\x5b\x18\x31\x5d\x12\x61\xa9\x14\xab\xaa\x89\xf2\xb5\x25\x7d\xe2\xd5\x4f\x54\xb1\x83\x33\xcd\x86\x3d\x61\x92\xd6\x48\xf1\x76\x5c\xf0\xaa\x8c\xbf\x1f\xe5\xee\x03\x61\xc4\x37\x00\x1e\x83\x25\x2f\x4a\x93\x3b\xc7\x6e\x59\xc5\x56\x03\x99\xc6\xd6\xd9\x18\xcc\x0f\xa7\x6a\x83\xf6\xdc\x2f\x9b\x9c\x4e\x44\x72\x9c\xee\x28\x03\xd3\xa3\xe5\x0b\x66\xc2\x82\x90\x5b\x59\xc5\x92\x93\xf5\x89\x19\x3a\x66\x63\x91\xf5\x6c\x67\x8d\x6b\xc9\x55\xfd\x7e\xc8\x88\x22\xbf\xc3\xd9\xb2\xd8\xb4\xd8\x61\x08\xfc\xf2\x29\x12\x0c\x8d\xa1\x41\x92\xb6\xa1\x0c\x56\x68\x30\x8b\x5d\x66\xed\xc3\x21\x03\x8a\xba\x1b\xbb\xec\x1d\x6e\x4e\xa0\xc6\x73\xd0\x0d\x5d\xd2\xd2\x86\x34\x65\x43\xa1\xa0\xca\x28\x65\xcb\xbc\xb9\x06\x5b\xc4\x65\xa0\x1d\x14\xbd\x61\x45\xe5\x1d\x25\x71\xda\x31\x9e\x93\x88\x73\xf5\xe8\x77\xa0\x3c\x19\x27\x5c\x43\x1c\x9b\xbe\x34\x3d\x99\x8b\x7e\x74\xe0\xb3\xc2\x6d\x16\x96\x70\xdc\xe7\x1d\x74\xa2\x8b\xbb\x5d\xa0\xe8\x48\x9d\x11\x9f\xd6\x86\x52\xd0\x75\x5a\xb5\x60\x38\x87\x08\x6c\x4c\x3f\x4c\xa5\x76\x1b\xee\xda\xe8\xd8\xe2\x2d\x5f\xe4\x54\xb4\x06\xbb\xab\x54\xcd\x71\x0d\xb5\xce\x69\x36\xef\x90\xc8\x32\xcb\x96\xd6\x60\x92\x6d\xe6\x8a\x92\x81\xa9\x25\x38\x0b\x4e\xe8\x8e\x4e\xc7\x6c\x80\x5a\x15\x24\x10\x45\xe3\x87\x6c\xc0\x07\x12\x59\x45\x7d\x5c\xb1\xdb\x99\x6d\x6e\x70\x8c\xb1\x5f\x9b\x4b\xac\x00\x73\xdd\xf1\xf0\x40\x35\x0e\x2d\xa3\xcf\x1e\x83\x34\x4e\x80\x3b\x1f\xb2\xd2\x4c\x04\x5e\x1a\x56\x58\xd1\xb9\xd5\xbd\x1b\x6a\xf0\x95\x53\x86\xd1\xdc\xe0\x6c\x29\x99\x6b\x09\xe8\x52\xb1\x83\x7a\xe9\x2e\xbf\xfa\x9e\x69\x1b\xfa\xf0\xe0\xda\x08\xa5\x87\xa8\xe8\x04\x53\x36\xd6\x82\x51\x5d\xdf\x01\x0a\x52\x36\x2c\xdc\xea\xca\x0b\x23\x61\x7a\xb5\x99\x5c\xbe\x6c\xcd\xb6\x03\x6f\xb2\x6d\x46\xe9\x7a\xca\x29\x05\xa8\x98\xf1\xb9\x5f\xee\x0e\x6a\x15\x55\xc6\x0d\x74\xa4\x71\xac\xd8\xd0\x4c\x69\xad\x88\x6d\x3f\x1b\x9b\xc7\x32\x61\xab\x8d\x1d\xbb\xaf\x14\x9a\xa6\xdb\xd5\x99\xa6\xf4\x0e\x68\x92\x66\xd1\x7c\xd6\x72\x6c\xa3\xe3\xcd\x10\x13\x4f\xd7\xea\x10\x19\x51\xc3\x0c\x58\x3d\x5b\xe2\x38\xb1\x15\xa0\x7e\xe8\xcd\x95\xeb\x8e\x64\xee\xd8\x71\x8c\xfc\xd8\x12\xb2\xc0\x47\x34\x8e\x9a\xad\xb2\x2a\x28\xb6\xe6\x0c\x0a\xcc\x83\xec\xc9\x15\x01\xdc\x92\x27\x41\x74\xd9\x3b\x00\x8f\x79\x0c\xcc\xf0\x98\xb8\xca\x80\xda\x02\x25\xc7\xb1\x02\x39\xa1\xbc\xd4\x38\xf5\x20\x43\xdb\x59\x61\x5b\x16\xa8\x8d\x8a\x90\xd8\x0d\xe4\x15\xb6\x4e\x10\xd7\x79\xb9\x2b\xbd\x0f\x8d\x22\x24\x70\xea\x4b\xdd\x4e\xbb\xcd\x62\x00\xbe\xfc\xa5\x16\xf5\x59\x5b\xdb\x97\x43\xc6\xb1\x3b\x82\xb3\x8d\x41\x84\x1a\x00\x3b\x8c\x5d\x65\x78\x1e\x4b\xad\x6d\x4c\xa6\x20\x5c\x8a\xa5\x51\xd0\xe8\x96\xb1\x28\xf1\xe1\x5c\x55\x1b\xbc\xa5\x73\xe9\xb0\x72\xa3\xba\x8b\x2a\x59\x5b\x34\xb8\xca\x2c\xe9\xa6\x04\xc0\xcd\xdc\x80\xc8\xe1\x1a\x76\xe1\x23\xcf\x80\x12\x94\xeb\x42\xf6\x16\x72\x2c\x90\xc1\x67\x07\x9d\xc9\x76\x7a\x4b\xaf\x73\x44\x40\x27\xed\xb4\x78\x76\x5e\x47\xa9\x58\xaa\x23\x1d\x6a\xd9\xdd\xdb\x41\x4b\xba\x03\xfc\xc9\x24\x0e\xa3\xa4\x30\x51\x8f\x01\x0d\x99\xb6\x9c\x6d\xe7\xc0\x23\x3e\xf5\x86\x84\xd1\x1e\x55\x6d\x84\x0c\x1e\x2f\x4d\x71\x74\x77\x50\xab\x96\xc3\x87\x15\xf6\x88\xb0\x28\x6f\xe4\x11\x74\xf1\x5c\x3d\x74\x85\xb7\x7e\x20\x13\xb3\xda\xc2\x49\x7a\x53\x3b\xbc\x8a\x02\xc1\x5c\x77\x74\xcc\x6b\x10\xb2\xc8\x21\x49\x47\x46\x89\x9b\x5a\xad\xee\x6d\x0a\xc0\x0e\xb8\xd2\x0a\xec\x00\x42\xc0\x76\x5e\x30\x42\xcc\x59\x38\xcb\xbc\x63\x2f\xea\xb8\xf6\xb3\xb9\x28\xb0\xf4\x1c\xea\x88\x41\x7d\x28\xd0\x25\x7b\xc0\x17\xd7\xac\x8f\x66\x3d\x15\xda\x69\xed\x3a\x38\x89\xef\xfe\x8e\x72\xdf\xd1\x36\x02\x04\x9f\xc2\xaa\xc6\x91\x23\x55\x2b\xc5\x5b\xba\x90\xc9\xbe\x72\x9d\x7a\x6c\xbb\x0e\x76\x9e\x3e\x74\x99\x1c\xe0\xb7\x90\x20\x8f\x4b\xca\xc2\xe1\x65\xdb\xd8\x8f\xaa\xb6\x55\x40\x46\xd7\xb9\x47\xa3\x2a\xa2\xe0\x74\xde\x6a\xb8\xa1\x7e\x1e\x0e\x1d\x92\x9d\xf8\x8e\x88\x8f\xe9\xe3\x34\x8d\x5d\xb8\x78\x14\x8b\x43\x87\xd2\xfe\xc0\x40\x7a\x17\xec\x55\xdd\x8c\x36\xed\xa7\x45\xb0\x36\x78\x42\x86\x91\x26\x77\x90\xe9\xd9\xb6\x38\x97\xdd\x60\x55\x29\x37\x67\xb2\xe2\x38\xfd\x71\xad\xc8\xa8\x0a\x5d\xba\x2a\x31\x4b\x8c\x2d\x23\x73\xa7\xe9\xd4\x55\x80\x3b\x32\x01\x2b\xbc\x07\x63\x89\x8c\xf8\x41\x00\xde\xed\xd8\x3c\x14\xa4\xa8\x74\x1a\x79\x6d\xfc\x8a\x9a\x50\x98\x00\xab\x98\xc7\x19\x07\xe7\x77\x44\x39\x6e\x08\xcb\x75\xa9\xfb\x84\x39\x5e\x0d\x6a\xdb\x9c\xa0\x74\x0f\x60\x1c\xb0\xcd\xdd\x10\xc5\xdc\x29\x88\x97\x06\x0e\x15\xa8\x5f\x77\xdc\x54\x2c\xf2\x3e\xd1\xae\x27\xdf\x92\x4a\xb8\xfa\x1c\x72\x3c\x4e\x76\x69\x9a\x3c\x30\xa5\x1c\x35\x61\xe5\xce\x00\xb5\x4f\xdc\xce\x9e\x6e\x51\x0f\x20\x04\x82\xb6\xe2\xe2\x12\x6a\x6e\xe2\xb2\x57\x9d\x36\x57\xe5\xce\xbd\xa7\x83\x78\x7a\x6c\x93\x6c\xb2\x52\x70\x81\x83\x5f\x70\xbf\x85\xc6\x3e\x8f\xee\x56\x60\x27\x34\x8e\x21\x60\xc1\x04\x17\x07\xd3\x43\xae\x48\x34\x0b\x93\x70\x94\x1a\x6d\x21\x80\x1f\xe6\x52\x9b\xa7\xf4\xfd\x00\x8f\x0f\xc4\x74\xbb\x01\xf0\x38\x67\x3c\xb6\xeb\xd0\x3e\x58\x8c\x54\x80\xa2\x12\x42\x97\x9d\x27\x6c\x12\x17\x13\x0a\x68\x6a\x53\x05\xe1\xb8\x40\x64\x4d\xa8\x3b\x84\x84\xe8\xc6\xf4\x72\xc8\x1b\x29\x58\x41\x27\x8d\x55\xc1\x73\x74\x64\x3d\x66\xeb\x1a\x17\x1c\x4c\x75\x16\x66\xda\x11\x20\x48\x1a\x0b\xf9\x1d\xec\x7b\xbb\x04\x4b\xa5\x1f\xf6\x12\x56\xb1\x50\xa2\x8c\x7a\x17\x76\xd6\xda\x3d\x34\xdc\x8d\xc5\x54\xcc\x17\x50\xbe\x52\xb0\x5d\xde\xc1\x3b\xae\xb6\x2c\x49\xb7\xe1\x1c\x3f\x17\x91\x6d\x52\x38\x5c\xe0\x8a\xd2\xda\x28\x29\x57\x15\x15\x8c\xc3\xdb\x9d\x6e\x6a\x4d\x77\xec\xb6\x5e\x77\x3c\x3c\x12\x10\xc0\x09\x30\x79\xb4\x76\x5a\x73\x04\x47\x63\xbf\xc6\x04\x17\xd5\xe0\xb4\xf8\xaa\xfb\x82\xc0\x0d\x58\xb2\xe0\x82\x09\x68\xb7\x3b\x20\xa8\x8c\xac\x25\x70\x9b\xe8\x94\x42\x08\xdc\x85\x5f\x46\x99\x90\x9b\xd1\x12\xd3\x79\xc1\xe1\x4e\x62\xb9\xae\x7b\x7e\x28\x95\xe8\xfb\x1d\x80\x47\x4f\x25\x8e\x88\xc8\x91\x32\x26\x57\xae\xf4\x32\x08\x1b\x85\x9a\xe1\x27\x56\xd2\x3b\xb5\x99\x02\x6a\xd6\x42\xe2\xc1\x20\x2c\xe9\x86\xbd\xa0\xfb\xea\x6a\xe3\xa9\x89\x15\xe5\xb2\xee\x5c\xfc\x24\xeb\x94\x25\xe4\x9d\x26\xd4\x40\x16\x0d\xc7\x3a\x8f\xa8\x53\x71\xfd\x48\xd1\xdf\xe0\xe6\x18\x03\x48\x32\xed\x80\xe3\x10\x2f\xcd\xd0\x56\x77\xeb\x1d\xc2\x34\xe2\xca\x28\xd3\x9b\x39\x99\xcf\xdb\x46\x0e\xb9\xd7\x4d\x05\x05\xef\x60\xbb\xf4\xc8\x04\xf0\x22\x55\xa7\x3a\x2e\xe6\xc8\x23\x53\xbf\x4e\xe5\x01\x22\x87\xe5\x81\xa3\x3d\x8f\x01\x65\xd5\x2b\x83\xa2\x0a\xbf\xa5\xf6\xe1\x7d\x95\x4d\x19\xd9\x36\x19\xec\xa9\x83\xcb\xd3\x8d\x82\x3c\xc6\x09\x8a\x59\x55\x3d\x79\x21\x6a\xaf\x52\x41\x27\x0c\xbe\x88\xbd\xc3\x77\x12\x9a\xce\x42\x84\xed\xd4\xd4\xbd\x32\x0d\x4e\x7f\x31\x2f\x4a\x14\xa2\xc6\x69\x36\x5a\xe8\xc9\xd6\x04\x06\x4d\xe5\x76\x6a\x43\xba\x23\xbd\x0e\x09\xef\x48\x1f\x72\x76\x4e\x63\x46\xde\xaf\x0b\xd6\xe8\x73\xbc\x4a\xde\xc1\xca\x23\x28\x2a\xd5\x0e\xce\x5d\xef\xae\x82\x24\xd8\x1d\xfe\xe2\x10\x20\xf4\x93\x24\xe5\x0e\x08\x09\xb2\x45\x44\xbc\xf1\x01\x8f\xad\x5c\x81\x61\x2b\xc8\x16\x87\xb0\x28\x96\xb3\x2d\xbc\x46\xbb\xa3\x1a\xc5\x6c\x3f\x97\x3c\x8c\x19\x44\x39\xdf\xc4\x48\xfb\xde\x41\x39\xe5\x61\x9d\x83\xce\x4d\x4a\xd5\x6e\xfb\x75\x68\x4b\xfc\x96\x0f\xe8\xe9\x1d\x89\xad\xb2\xfc\x6c\x65\x6d\x5b\x6f\xbd\x6d\xb8\x61\xd8\xc8\x56\x92\x5e\xb6\x51\x9d\x55\xe9\xa2\x9e\x39\xb1\x7d\xf9\x28\x69\xae\x5c\xbb\x3b\x52\xca\x4d\x1c\x87\x90\x79\x57\xe0\xa0\x0b\x6c\x79\x54\x8a\x10\xcf\x96\xf4\x98\xd1\x8c\xb0\x93\x36\xf1\xa6\x99\x91\x38\x48\x0c\x04\x32\x77\x78\x2d\x4d\xa5\xc6\x74\xd4\xb4\x23\xaf\x3a\xb3\x20\xcc\x2c\x6c\x2d\xce\x41\x5f\x16\x26\xb4\x34\xd3\x26\xcb\x73\x87\x69\x40\xde\xa0\xbf\x23\x50\x2d\x00\x47\x8b\xd8\xd5\x7d\x0d\x0b\x07\x13\x28\x5f\xcc\x4e\x98\x16\x13\xb8\x73\xe0\x23\x1f\x60\xf0\x98\x96\x76\x63\xd0\x00\x6f\xe9\x80\x5d\x34\xa0\x7d\x3b\x75\x6b\x53\x6e\x59\xb5\x52\xe9\x54\x73\xcc\x91\x37\xae\x63\x87\x1e\x86\x95\x1c\x06\x82\x57\x50\xfa\x92\x5b\xbe\xc3\x77\x6e\x6e\x60\x9a\x03\xa5\x69\x03\xe7\x54\xda\x15\xd3\xe6\x56\xd8\x95\xbb\x3c\x12\x17\x57\xcc\xf6\xb2\x22\x60\x44\xd9\x62\xb1\xb9\x7c\xc7\xb9\x18\xee\xd4\x8d\x5f\x67\xb0\x50\x8c\xd2\x9b\x1b\x47\xb7\x12\x0f\xdc\xbc\x5b\x49\xa7\x9d\xa0\xa5\x23\xcf\x54\x28\x64\xb0\x40\xf5\x16\xe9\xc8\x93\x78\x3c\xab\x2c\xc5\x3a\xaf\x8f\x6d\xc3\xa2\xf4\x40\xb3\x5c\x4a\xf5\x90\xc0\xee\x73\x85\x3a\xd4\x9d\x5e\x3b\x41\x21\xad\xc2\xef\x48\x60\x0e\x1d\x8d\x5b\x79\xa4\x74\x89\xc4\xcf\xe1\xf7\x87\x72\xa7\x2a\xcd\x91\x97\x07\xa8\x94\x54\x50\x34\x69\x24\x83\xd8\xa6\x9b\x02\xb7\x70\xf4\x04\xd3\x5b\x3e\x3c\xa2\x24\x15\x70\xcd\x53\xe7\x56\x35\x2a\x40\x98\x1d\x84\x3a\x10\xb2\xb3\x95\x1e\xb7\x87\x9e\x5e\xbe\x80\x96\xf6\x8e\x3b\xe2\xe5\x71\x98\xea\xe8\x06\xf7\x3d\xcc\x2b\x5d\x4e\xb5\x87\x22\x1e\x45\x4f\x2d\x74\x0f\x7a\x76\x6c\xc4\xd9\x72\x4a\xbb\x7d\xc8\x77\xde\x01\x16\xd3\x63\xaa\x75\x6e\xe7\x4e\x58\xde\x36\x73\x22\x61\xf6\x1e\xb6\x5a\x58\x54\x7d\x69\x45\x19\xb6\x6a\x97\xea\xd0\x32\x71\x6e\xb6\x44\xc0\x1d\x7b\x01\x30\x76\x61\xf7\x05\x29\x2d\x4f\xa8\x23\x60\x47\x56\x57\x13\xba\x65\x58\x77\x92\x35\x00\xbc\xca\x99\x1b\xb6\x25\x80\x5d\x89\x5b\x3a\xda\x40\x3d\x07\xda\x00\xf5\xcb\x4b\x15\x37\x27\x42\x63\xd7\x0e\x69\xda\xc7\x61\x4f\x8c\x53\x2a\x7e\x0b\xdb\x75\xf5\x0a\x51\xd9\xc1\xc6\xee\xc8\xcd\xea\x6c\x23\x16\xda\x5a\xb2\xe0\x80\x49\xcb\x5e\x3a\x45\x23\x2c\x75\xaa\x06\x0d\x10\x23\xea\xea\xbb\x31\x92\xf7\x96\x55\x31\xe0\x8e\xd2\x27\x0d\x6c\xad\x36\x19\xca\xc5\xb3\x0d\x1e\x08\x8b\x8b\x66\xc1\x77\xce\x77\x29\xb2\x6f\x30\x6b\xc7\xf4\x43\x3f\x06\x96\x44\x20\xef\xf1\x17\xa7\x89\x22\xb9\x9e\xce\xa6\x07\xb4\x4a\x9e\x85\x64\x61\xfb\xdc\x8e\x24\xf9\x75\x64\x2e\x28\x71\xc1\x00\x8c\xad\x79\xe8\x37\xd3\xbd\x1f\xe0\xf1\x81\xfa\xf5\x6e\x10\x55\x3a\x9d\xeb\xd7\xa1\x64\x28\x0b\xe2\x85\x05\xdd\xad\x38\xca\x81\xcb\xc2\xf8\xf4\xa0\x5f\x06\xa1\xdc\x13\x09\x92\x66\xea\x2b\x6a\x77\xa8\x3c\x32\x7c\x5c\x86\xf4\xa8\x0e\x14\x01\xf0\xef\xd3\x0c\x9a\xc2\xcb\x7a\x65\xcc\xc1\x8a\xb5\x8b\xb6\x2c\x88\x2a\xe9\x12\x37\xac\x31\xbb\x05\xbf\x03\xeb\x24\x7a\x13\x6e\xd2\x49\xa3\x72\x2b\xb6\x92\x20\xd9\x2f\x95\x06\x77\x87\x8d\x54\x5d\x20\x5e\xda\xb3\xab\xd9\x1e\x08\x6f\xee\x8e\x50\x60\xc5\x7d\x1c\x92\x21\x25\x98\x5f\x30\x2a\x56\xa3\x6c\x46\x34\x09\x5a\xe3\xfd\x52\x18\x05\x78\x56\x2d\x3c\x81\x87\x02\x15\xe9\x3b\x2a\x30\xac\xd6\x4b\x47\xe7\x32\x8e\x22\x9f\x00\xa3\x84\x83\x44\x05\x2b\x01\xae\x99\x26\x41\x15\x03\x67\xdc\xe0\x53\xef\x1a\x05\xd8\x4a\xb9\x83\x96\x7d\x26\x4d\x1a\x10\x0c\x95\x05\x01\xf4\xad\x0a\x1c\xe4\x79\x3a\xca\xf6\xe0\x24\x3e\xe6\x3c\xa6\x7b\x28\x70\x9c\xbc\xe0\x25\xf2\x62\x77\xf0\x8f\x02\x41\x97\xbf\x8e\xb8\x44\x2d\x15\x8b\x3d\x61\xef\xc6\x25\x8e\x40\x3d\xa1\x0c\x00\x2e\xa8\x3f\xb0\x4a\xfa\xd2\xa9\x03\xef\x0a\xbd\x63\x15\x5e\x80\xa0\x4f\x0c\x58\x43\x5d\xa8\x66\x0b\xdf\x92\xde\x4f\x96\x98\x01\xc9\x23\x74\x5c\xb0\x29\x61\xed\x19\x0e\x22\xeb\x14\x03\xdc\x01\xbb\x84\x6d\x67\xf6\x20\xc4\x43\x83\x0e\x0f\xc0\x74\xa4\x71\x03\x2c\x8d\x60\x2e\x3c\xe9\x66\x0a\xd2\x48\x00\xe1\x55\x68\x53\x63\xb1\xc7\x1b\x4e\xa7\xda\x2e\xbc\x99\x54\x49\xd4\x26\x3b\xeb\x8f\x0d\xd8\xc0\xbb\x72\x75\xd1\xaa\x2f\x6e\x70\x3e\x34\x3a\xe2\x8e\x75\x26\x73\x60\x74\x07\xcf\x84\x91\x2d\x4b\xcf\xa9\x51\x3d\xef\x76\xe5\x36\xb8\xc4\x3d\xa5\x19\x83\xde\x4d\x16\xd6\x92\x76\xb4\x72\xf0\x6b\xa0\x53\x5e\x85\x92\x3b\x42\x44\x0a\x6d\x13\x1a\x28\x91\xd5\xb6\x65\xad\x9d\xc7\x4c\xae\xc1\x30\xb4\x3b\x9a\xc7\xc5\x48\x28\x07\xe8\x24\xeb\xb4\x71\xaa\x8a\xe1\xf4\x06\xb2\x27\x85\xe0\xd4\x0a\x52\x86\x55\x54\x56\x8c\x78\x3a\x74\x9d\x21\x27\x42\x22\xf5\xc9\x5f\x63\xb9\xa8\x02\xdf\x9b\x6c\x0e\x19\x70\x16\x76\x07\x51\xfe\x74\x46\x04\x04\x4e\xe6\x06\x3e\x9c\x00\x45\x5e\x30\x33\x99\xe5\xe5\xc9\xc9\xc6\xb9\x45\x8e\x59\xc0\x28\xb2\x46\x95\xd7\x3b\xb9\xa5\x41\x53\x6e\x92\x6c\xb5\x00\x93\x90\x3c\xf0\xda\x06\x6d\xe7\xe8\xc7\x06\x10\xb2\xab\x5a\x9b\xc0\xa8\x35\xcc\x48\x76\x95\xce\x4e\xd9\x4e\xef\x90\x33\x3a\x8e\x84\xba\x19\x9e\xc6\xce\xa2\xf2\x1b\xd5\x0c\x1c\x00\xa7\xb0\x67\x82\x82\x9f\x13\x53\x07\xec\x84\x74\x69\x8b\x4a\x19\x62\xde\xc1\x08\xb3\x26\x04\x03\x0e\x74\xf5\x25\x48\x05\x7a\x07\xb2\x19\x66\x2e\x23\x0e\x55\x31\xbd\x96\xe5\xe7\xd9\x4e\x79\x4e\x7b\xce\x9c\x28\x29\x37\xf8\x0b\x7a\x69\xe6\x18\x22\x7c\x2b\x68\xcd\x5d\x73\x2c\x8b\x67\x7b\x87\x0b\x65\x28\x8e\x3d\x19\xd4\x21\x1a\x49\x40\x77\x21\xa9\x1c\x35\xee\x8e\x22\xc2\xc6\x7a\xc8\x9a\xed\xb5\x62\x10\x80\x50\xac\x0d\xce\x26\x21\x3b\x3b\xa1\x19\x5b\x94\xc0\x96\x52\x79\xd9\xb9\x6d\xb2\x63\xcf\x6e\xa9\x1b\x53\x8e\x3a\xad\xea\x58\x12\x8b\x0e\x69\x4a\x8a\xa3\x38\x77\x85\x07\xd3\x71\x14\xd3\x6c\xdb\xa4\x8d\x70\x54\x2b\x9b\x9a\xd9\x9b\x3b\x82\xf6\x7e\xa4\x13\x2f\xbc\x7c\xb2\xc8\x77\x05\x33\xce\x24\x27\xaf\x58\x3b\x33\x19\x64\xaf\x6a\x2e\x5a\x54\xcc\xd3\xcb\x66\x76\x34\xd8\x1d\x50\x43\x8b\x46\x9c\x4b\x76\xbe\xa2\x5e\x3b\x77\x87\x71\x8d\x94\xc3\x1f\xb1\xd6\xfd\x54\xf9\xd8\x1c\x8e\x8d\x57\x20\x0e\x5b\xa8\xc2\xd6\xde\x21\xd5\x22\xd5\x32\x25\x35\x37\xa9\x6f\xb6\xb3\x75\x4a\x9d\x0f\x19\xb8\x0b\xfe\xdc\x37\x42\x81\x30\x92\x04\x2c\x8f\x15\x42\x1f\xe8\xb4\xf4\x8e\x77\xe4\x94\x23\x08\x74\xb5\x20\xb0\xc6\x24\x50\xb3\xf7\x6a\xdd\x3a\xd2\xa9\xd5\x4e\xe4\xd0\x2a\x74\x3c\x91\x86\x00\xc1\xa2\x42\x1f\xb7\x08\x8f\xd9\x23\x61\xcb\xd4\x55\x31\x95\x27\xcb\xd4\x50\xc7\x91\x74\x88\x1f\x9a\x1a\x76\x16\xbc\xea\x3e\xb0\xbb\x16\x6a\x67\xba\x4c\x28\xf4\x06\x85\x5c\x36\xf5\x86\x0d\x26\x59\x24\x66\x09\xb8\x74\xbe\x10\xc4\xb0\x78\xb4\xe1\xa9\xf7\x32\x35\x4f\x9b\x44\xf9\x32\x2a\x90\x82\xeb\x71\x4b\x93\x11\x1d\x4d\x18\xa7\xf9\x48\xad\x82\x3e\x74\xcd\x85\xc7\x06\xb6\x68\x65\xb0\x3c\x23\x2c\x08\x9d\x03\xaa\x1d\x81\xad\xcc\xea\x97\xbe\xa5\x41\x73\xeb\x13\xe2\x0d\x29\x1c\x34\x20\xd0\x26\x2b\xda\xe9\x27\x82\xc7\x2a\x32\x6c\x97\x48\xa5\x92\xb0\x35\x08\x48\x0c\xfb\x3a\x28\xbe\x63\xce\x10\x8b\xc2\xb5\xc4\x24\xe7\x9b\x2a\x7d\x35\x60\x93\x8d\x67\xe8\x35\xd9\xb5\xf5\xe3\x9a\x16\x9f\xcd\x6e\x55\xce\x81\xd7\xba\x0a\xb5\xfc\x0e\x06\xa9\x82\xb1\x57\xb8\x6f\x9a\x92\x10\x71\x82\x74\x2c\x2c\x90\x88\xa7\xef\x61\xbf\xda\x84\xfc\xda\xae\xd2\xce\xd9\x41\xae\x06\x59\x94\xef\xc8\x8a\xe6\x52\x90\xe0\x78\x74\x0f\xe9\xa5\xb6\xd3\xc2\x95\xfb\xac\xc4\x60\x0b\x23\xe8\x40\x12\xaf\x97\xc8\xf9\xdc\x1d\x5d\x6b\x08\x94\xee\xe0\xf4\x8a\xa1\xa4\x9d\x96\x1f\x35\xb5\x69\x7c\x1a\x84\x64\x84\xa3\xce\x9a\x39\x90\x45\x66\xb8\x1c\x15\xf9\xb6\x91\x7c\x59\x3d\x88\x9c\xe3\xfd\x00\x8f\x0f\xa4\x3a\x74\x03\xe0\xd1\xbc\xe7\x9d\x58\x1a\xe3\x71\x88\x1a\x0b\x26\x59\x29\x68\x38\x35\x7d\xb2\x30\x07\x67\x16\xf5\x66\xd2\x70\x5b\xa8\x94\x63\xcd\xee\xe8\x8d\x9a\x46\xb4\xce\xc0\x65\x40\xa4\x14\x0e\xc7\x12\x01\x4c\xdb\xd5\x51\x27\x9c\x1c\x39\xcc\x4d\x0a\x5b\x51\x92\x00\x7b\x7a\x5c\xea\x16\xa5\x32\x83\xe6\x25\xbc\x25\x83\xb2\x04\x21\x85\xe2\xc0\xf4\xa1\x95\x9d\x45\x38\x01\x52\x0b\xe7\x91\xdc\xae\x19\x3d\x30\x45\x80\x9c\xf5\x16\x1d\x3d\xdf\x8f\x4a\x5a\xf3\x4b\x62\x1e\x7d\xa8\xa7\x96\x96\xb7\x9c\x4e\x86\x92\x59\x27\xef\x98\xb6\x94\x44\xdf\x2a\x1f\x29\xfb\xad\xdf\x32\x98\x28\xe6\x52\x00\xd1\x8d\x4a\x70\x48\x69\x43\x01\x62\xc9\x6a\xb8\xa2\x9c\x83\x79\xf1\x81\x8f\x49\x98\x81\xd8\x93\x89\x36\x12\x2e\x73\x47\x4d\x6c\xe6\x46\x1c\x88\x25\xe5\xdd\xbb\x5d\xa2\xa8\xf3\xa6\x57\x6d\xdd\x80\x4b\x34\xbe\x19\xe4\x1b\x12\x3a\xe7\x2d\x3a\x85\x93\xa6\xe5\x0e\x67\x8b\xa5\x9c\x87\xef\x9a\x81\xbd\x13\xe7\x36\x25\x92\xa7\x04\xed\x85\xf0\x55\x69\x14\x92\x1b\xdd\x92\xdf\x75\x3c\xe7\x26\x1d\x9b\xfc\x8e\x64\x2e\xb9\x9c\x5c\x87\xd7\x92\x22\xb4\x4c\x51\x8a\x7d\x86\x48\xce\x10\x9c\x91\x02\x39\x9a\xcc\xba\x7c\x25\x28\x1f\xd5\xf1\x53\x97\x7c\x07\x0b\xca\x95\x68\x4d\x4d\xae\xb5\xeb\xd8\x34\xcd\xa5\x65\x96\xb1\x77\x27\x19\x15\xb7\xbc\x07\x5a\x76\xd5\x9a\xd8\xd7\xb9\x9d\x24\x9e\xd9\xde\x41\xb3\xac\xa3\x81\x34\x11\xde\xd0\x46\x77\x87\x80\x36\xbb\x39\xd9\x95\x8b\x3a\x39\x58\x5e\x81\x7d\xf8\x63\x6e\xf9\x02\x13\x09\x84\xa0\x83\x77\x3c\x3c\xa1\x86\x3d\x8c\x29\xa8\xa8\x47\xda\xf6\x06\x70\x27\x9d\xec\x24\xa1\x2b\xdb\xc5\x8b\x82\xf0\x50\xb1\x1a\x33\x0c\x47\x2a\xd0\x0c\xef\xa0\xdf\xe2\xd3\x08\xce\xbc\x14\x93\x99\x15\xaa\x13\x62\xe7\x03\xec\xca\x09\x9e\x76\xb3\xf4\xd6\xa1\xf5\xb5\xd0\xe3\x42\xf9\xc8\x71\xe4\x5b\xc2\x65\xa9\x8b\x5b\xa7\xd2\x08\x6b\x7e\x40\x85\xd0\x1e\x63\x2a\x9b\x6e\xa7\xdb\x82\x84\x1d\x83\x76\xac\x0e\xbc\xb0\x97\x21\x76\x45\x76\x0b\x21\xda\xc1\x71\xa8\x3a\x0f\x0e\x04\x00\x63\x43\x81\x1e\xc7\x7e\xd8\xa3\x97\x91\x0f\x62\x78\xd6\x7a\x69\xc5\xfc\xd1\x35\xdf\x37\x07\x5d\xba\xa3\x6e\x4c\x9c\xcc\x75\x87\xef\xcb\x5e\xf8\x85\xde\xd7\x4c\x11\xc3\x85\xf7\x74\x1c\xca\xa8\x3a\xf7\x54\xd7\xde\x4e\x7f\x0e\x74\xb6\x9c\x98\xbd\x43\xe7\x86\x48\x01\xb7\xb8\x3a\xd9\x4f\x6e\x77\x58\xc6\x5c\xf0\x44\xf2\x98\x05\xc0\x43\xc8\x6b\x86\xdd\x4d\x6d\x55\xda\x2d\xbe\xc6\x3e\x98\xb9\x23\x5c\xbe\xa2\xc8\x9c\xfa\xe3\x22\xdb\xe9\x37\x59\x73\x3c\x8d\xb9\x7c\x99\x1b\x5a\xd3\x81\x25\x32\x92\x95\xf0\x23\xca\xed\xda\xda\xc5\x0f\x76\x4b\x4a\xa9\xe7\xd5\x78\x98\x81\xb3\xaa\xf4\x5c\xd8\xf0\x4b\xf6\x2b\x98\x39\x0c\x5f\x0d\x8f\x35\xfb\xa5\x9b\xf6\x69\x69\xb1\x94\x55\xeb\x8e\x10\xb1\x09\xc7\xf1\x39\x15\xb0\xcc\xa8\xf3\x9c\x6e\x6c\x75\xe6\x7d\x8f\xa8\x3b\xd3\x66\x58\x65\x00\x75\xa2\x59\x56\xb4\x69\xf8\x64\xf6\x5b\x5a\xe0\x44\x90\x2e\x2f\x28\x4b\x9e\x13\x5d\x8b\xee\x3b\x9e\x54\x9a\xc9\xd9\x82\x55\xc8\x60\x08\xa7\x98\x08\xe3\x59\xc5\x85\xf8\x0a\x6e\x01\x48\x4f\xe4\x5d\xe4\x6c\xae\x76\x1d\xd1\x4b\x1d\x2f\x3c\x4e\x06\xb1\x71\x02\xcf\xc0\x8f\x5a\x8f\x7d\x5d\x1d\x71\x39\x63\x37\xe9\xba\x83\x5b\xc1\xc2\x43\x9f\x9b\xb2\x2a\x2e\xee\x7a\xd8\x78\x6e\x73\x6c\x0b\xd2\xa0\x51\xab\x79\x63\xd4\x14\x33\xcf\x03\xf0\x9d\xae\x61\xc0\x04\xeb\x8e\x21\x4d\x7c\x43\x31\x53\xde\xfc\x42\xd5\xc0\x8d\x6b\x76\xd5\x8b\x28\xdd\x2f\xdf\xa3\x88\x9a\x5e\x68\xbb\xae\x0b\x9e\x55\xbb\x4d\xe5\x96\xdd\x1d\xab\x48\xa8\xc6\x53\x25\xbb\xc7\xee\x6b\xd9\x1d\x09\x4e\xac\x08\xed\xce\xec\x85\x62\x76\xe8\x42\xdb\x31\x24\x07\xb4\x0b\x6e\x08\x6e\x77\x44\xbf\xcc\x85\x4a\x99\xc7\x04\x4e\xbb\xf9\xcc\xbd\x70\x4e\xa6\xea\x0a\xc4\x70\xcf\x21\x8c\x9d\x81\x2a\xb1\xa4\xfd\x3c\x8f\x53\xc8\x63\xb2\x5b\xf6\xc2\x27\x52\xf6\xd0\xeb\x42\x34\x5e\xa3\x38\x3b\x0e\x64\xe2\x09\xd2\x38\xac\x4e\x02\xc7\x8c\xf8\x56\x1a\x3a\x60\xa1\x47\x39\xc2\xbc\x03\x38\x47\x7b\xef\x24\x1e\xfa\x92\xb3\x95\x32\x14\x3a\xf7\xb4\x49\x01\xba\x39\xb4\x2e\xc4\xc5\x60\x6b\x4d\xdb\x00\x68\x23\x53\x5e\xa1\xdf\xe1\xb5\x58\x6e\x74\xcd\xbd\x0b\xb5\x01\xd1\x81\x47\x67\xf1\x6a\xee\x6c\x5d\x40\xd2\x7a\x96\xd9\x55\x30\xdc\xb8\x53\x0d\x5e\x90\x44\x29\xad\x1b\x98\x82\x74\xdf\xc1\x6c\x3a\xee\x17\xe8\xc0\xea\x13\x6a\x6e\x34\x1a\xf2\xda\x5d\xf0\x64\x77\xe6\x24\x5e\x45\x72\xc0\x68\xe5\x69\x74\x1e\xc0\xdc\x31\x4c\xd8\xcb\xe9\xca\xbe\x13\x0d\xb8\x0a\x81\x5d\x0b\x02\x9d\xd7\xca\x27\xba\xa2\x43\x11\x71\x38\x36\x72\x76\x7f\x0d\xa9\x42\xba\x84\xf0\x77\x64\x88\xb3\x66\xb9\xf1\x11\x96\x3d\x2f\x70\xc8\xca\xcc\x66\xa8\x2c\x47\x39\xf0\x91\x34\xf2\x44\x2c\x8c\x90\xea\x1a\xd5\x8d\xec\x9b\x18\xb7\xc0\x2e\x65\xbf\x58\x92\x81\x1f\x90\x65\x93\x4d\x10\xa7\xbd\xb6\xa2\x76\x5c\x31\x4d\x4e\xb1\x5c\xf8\x89\x36\x72\x11\x98\x37\xe9\x4d\x01\x96\xbd\x1f\xe0\xf1\x81\xb4\x93\x6f\x68\x69\xb1\x0b\x88\xb0\x09\xea\x08\x0d\x10\x1c\x1c\x5e\x60\x1e\x08\xe6\x4b\x28\x1b\x40\xec\xdb\x58\x92\x39\xb5\xa3\x75\x64\x0f\x1a\x73\xb7\x74\x80\xe3\x83\xee\xbc\x57\x74\xad\x1c\xa1\x09\xe7\x08\xba\x64\xb1\xae\x26\x59\x5f\x0e\xd0\x16\xa0\x42\x15\xcb\x64\xae\xc4\x7c\x3b\x6e\x09\x97\x19\x65\xd0\x6a\x4d\x16\x31\xa2\x82\xe2\x20\xda\x44\xcc\x31\x1f\xfb\xb0\xbb\x74\x32\x06\x79\xf6\x7e\xf9\xdc\xf9\xd9\xe7\x3e\xf2\x79\xcf\x5c\x3e\xe8\x6d\x36\xc0\xd1\x50\xda\xc2\xbb\xd3\x7d\xf6\xe3\x38\x8b\x56\xb4\x6e\x04\x37\x64\x88\xf6\xb5\xb6\x13\xed\xf0\xd0\xf2\x92\xe5\x96\xe1\x5d\x94\xda\xa9\xeb\xb0\x0c\xab\xad\xe5\x73\x4b\x66\x57\x1e\x42\xec\xcb\xca\x82\x23\x61\x1a\xca\x7b\xdd\xa1\xad\x16\xc7\x88\x91\xbb\x43\xc2\x4a\x4a\x7c\x02\x4f\xda\x45\x2c\x35\xb9\xed\x2c\x05\x54\x5c\xae\x27\xb4\xb8\x87\x74\x6c\x7d\x8e\xc2\x39\x66\x6e\x1b\xf2\x00\xd7\xbc\x63\x66\x3a\x0b\x8c\xd3\x0e\x35\x3c\xbc\xb5\xc2\x9a\x52\xf3\x54\xc2\xac\x3c\x06\xe2\x30\x22\x64\x59\x6d\x60\xf7\xe3\xb4\x3b\x98\xc7\x4a\xf9\x96\xc9\xed\xee\xc0\x57\x30\xb9\xa2\x92\x6c\x2b\xd9\x05\x49\xc5\x9a\x17\xaa\xae\x4b\x84\x86\x1f\x50\x6c\xca\xce\x11\x46\x55\x18\x13\x6d\xe1\x1d\x44\xb6\x20\x59\xb9\xa2\x49\xd2\xa1\x93\xb2\x51\xf1\x59\x93\x22\x21\x8a\x2c\x82\x9c\x3b\x90\xfd\xb4\xe0\x8c\x27\x2e\xc2\x77\xc4\x64\xbf\x45\x6d\x27\xd0\x9c\x2e\x55\x63\x10\x15\x2b\x0b\x07\x6f\x7b\x8e\x36\x63\x57\x45\x6a\x1e\x2a\x58\x8d\xca\x59\x1c\x07\xa5\x4c\x99\x92\xc4\x75\xc7\x50\x37\x48\xf5\x82\x90\x66\x15\x0c\xd5\x9c\x06\xb7\x55\xb8\x2f\x8d\x09\xe4\xf4\xda\x57\xbd\x5a\x76\x3b\xdd\x55\xab\x66\xd2\x10\x4a\xcc\xb7\xf4\xa1\xe3\x50\x8c\x28\xe2\x80\x23\x27\x81\x0d\x2d\x41\x14\x58\x79\x07\x1d\xf4\x5e\xeb\xa9\x2e\xe8\x12\xce\x49\x21\x1f\x74\x55\x86\xde\xc1\xfc\x31\x2b\x32\xc8\xa7\xab\x21\x27\xb6\xfe\x1f\xda\xfe\x2d\xf4\xc3\xef\xdf\x0b\x02\x47\x86\xb9\x11\x46\xd9\x8a\xcc\xcd\xc0\x20\x0e\x33\xe0\xcc\x78\xb1\x8e\xc3\xe0\x14\xa5\x59\x60\xd0\x06\x13\xa5\xa0\x5c\xe7\xf3\xe1\x59\xa7\x67\xad\x45\x86\xa5\x81\x37\x81\x66\x06\x45\x20\x41\x94\x15\x65\x48\x18\x26\x88\x60\x49\x91\x19\xa4\xd0\x45\xdb\x32\x11\x32\xcd\x32\xc2\x43\x17\x59\xfc\xf6\x9f\x4d\x1b\xb6\x20\xd4\xff\xb9\xfc\x5e\x7d\x17\xeb\xf3\xac\xf7\xe1\xf5\x7e\xbd\x5f\x2f\x0a\x40\x07\x17\x5b\x58\x39\x7b\xca\x59\xa1\xcb\x98\x47\xb1\xa8\xa9\xa1\x02\x2c\x95\x92\xf6\x45\x03\xa3\x64\x6f\xa8\x19\x77\x9a\xd5\xfa\xb0\xe3\xd4\x15\xba\xa5\x73\x15\x60\x18\xdb\x96\x4d\xc9\x4c\x08\x4f\xc6\x82\x1a\x95\xc9\x3e\x71\x62\xee\xc0\x34\x42\x1f\x4f\x4e\x7c\x5a\xde\xf1\x1d\xcf\xbe\xda\x43\x9a\xb1\xe8\xe1\x7d\xfc\xb0\x76\xfb\x9e\x07\x12\xaa\x99\x97\xdb\xf1\x45\xd4\x72\x12\xe0\x70\x90\x1a\xd7\xa3\x82\x0a\x78\xc5\xed\x66\x0c\x51\x72\xbc\xec\x00\x70\x25\x1a\x26\x37\x08\xd8\xf3\xe4\xdd\xa3\x01\x9f\x00\x1e\xac\x5c\x06\xb0\x62\xe8\xf2\x7b\xf5\x54\x98\xa4\x13\x5f\xbf\x5a\xe2\xd7\x3b\x6a\x56\x4a\x96\x98\xc1\x40\x10\xc4\x3f\xa8\xf8\x2f\x26\x73\x97\x45\x54\x6e\xa4\x1d\x0d\xe0\xb2\x20\x29\xcd\x84\xc6\x21\x84\x34\x6b\xd2\x7c\xc2\x80\x4d\x0b\x14\x9f\xb8\x8c\x83\xf6\x15\x5f\xa8\x30\x71\xff\x54\x13\x24\xbf\x83\x96\x25\x9f\xdc\x75\x68\x26\xa8\xcb\x47\xe5\x9e\xcf\xcb\xb1\x2b\xa8\x83\xa5\xb7\x48\x14\x94\xe8\xd7\x27\xde\xd8\x68\xe9\x08\x18\x92\xfc\x84\x94\x3a\x20\xef\xb0\xc6\x64\x22\x79\xa9\x81\xdd\x7c\x77\x00\x0f\x3e\xc6\x0c\xb2\xbd\x20\x31\x61\xff\x85\xcb\xec\x48\x03\x6b\xb6\x16\xc7\xb5\x99\x7b\x94\x26\xfc\x3d\x70\x98\x94\x16\x2b\xd5\x8b\x22\xd1\x43\x91\xdd\x07\xa1\x1b\xc1\xaa\xed\x13\x3e\x41\x6d\x5d\x90\x73\xae\xc2\x71\x16\xe5\x25\xcd\x3d\xde\x89\x5c\xf1\x9a\x85\x98\x7c\x75\xbd\xc9\xb7\x75\x6d\xb2\x78\x4e\x1e\xa0\x7f\x31\xee\x33\xc3\x82\xbd\xf8\x7b\x6a\x38\x11\xe4\x5a\x95\xbd\x10\x1d\xef\x3d\x2e\x5b\xeb\xa8\x2f\xd0\x2f\x03\x77\x34\xff\xb0\xf0\xa6\xf8\xc9\xda\xd7\x45\x68\x4a\xd6\x3c\x1a\xc9\xd2\xad\x1f\xdd\x1c\xab\xf3\xd8\x04\xc5\x4a\x3b\xcb\x51\xc8\x28\x5c\x9c\xca\x64\xab\x84\xc4\x13\xbf\xe0\x6e\xee\xb1\xdd\x1c\x16\xe1\xe4\x64\xd7\x09\xfc\xd0\xe5\x13\xaa\x29\x83\x1d\x4a\x16\x3b\xa7\x1c\x11\x5f\x41\x9d\xed\xaa\xc1\x86\x7b\xbe\xa8\x2f\x84\xd6\x4f\x45\x2d\x07\x4c\x20\x94\x37\x15\x31\xb5\x59\xaf\x17\x94\xdb\x16\xf6\x12\xac\xd2\x29\x09\x52\xf2\xd4\x3b\xf9\xca\xe2\x8b\x97\x9a\x4f\xc4\x5b\x24\x38\xa7\x8a\x95\x66\x7a\x05\x65\xb4\xb8\x0a\x99\xd8\x79\x68\x46\x32\x47\x54\x61\xcc\xe0\x92\xa0\x83\xc6\xbf\x00\x7f\x58\xa9\xa7\x74\x33\xe7\xa4\x38\xf3\xf0\x96\xeb\x21\x5f\xd9\x87\x16\x19\x73\xf3\xd9\x3a\x9d\xe7\xa5\x7a\x6e\xfc\x68\x07\x65\xfc\x64\x18\xcd\x67\x17\xc5\xf8\x32\xba\xb6\x0d\xcf\xdd\x06\x9e\xf3\x40\xef\x20\x25\x0f\x9c\xc1\x74\xa1\xbb\xa3\xc3\xcf\xd6\xf2\x5a\x0c\xb7\xf0\x45\x9f\xda\x4c\x3d\x4f\x15\x3e\x0a\xc6\x01\x08\x8f\xd6\x19\xe9\xe5\x55\x16\xd6\xa9\xe1\x16\xc1\x7d\xd7\xe7\x51\x85\x73\xcb\x0a\x22\xc3\x7f\x01\x41\x3d\x80\x51\xc0\x3c\x2e\xec\xc5\x2f\x41\xa8\xf7\xcd\xdf\x57\x83\x7c\x5e\xa1\x57\x53\x8d\x35\xc8\x62\xd1\xc6\xbe\x40\x0f\x68\xc6\xf9\x62\xf4\x59\xf2\x7d\xf4\x6b\xeb\x96\x52\x59\xc1\x1d\xe3\xf3\xcc\xce\x9a\x72\x1d\xc6\xa0\xab\x82\xd6\xe2\x64\x03\x98\x9c\x4b\x1b\x3b\x8c\x7f\x13\x9f\xf0\xbf\x85\x03\xd4\x07\x80\x87\x10\xb9\xbd\xf8\xca\xf9\x4c\x89\x12\x31\x25\x81\xb8\x4e\x7c\xe9\x31\xea\x10\xcd\x7f\xfa\x89\x0f\x45\xe9\x5c\x0f\x95\x00\xb0\x4f\xb6\xd5\x16\x0e\x4c\x5f\x3a\x61\xb5\x75\xca\x9b\xe5\x42\x56\x43\xbe\xcf\x1c\x01\x81\x12\x72\x43\xa0\x69\x30\xeb\x98\x29\x93\x0a\x47\xff\x22\xfd\x99\x90\xd0\x40\xa0\x6f\x2a\xd2\xe6\xea\x12\xe7\x5d\xf1\x64\x6c\x75\xa8\x1b\x0a\x3a\x6a\x39\xbf\x0f\xe6\x66\x6d\x4f\x3d\xf1\xcf\x17\x58\x66\xd0\x69\xb3\x32\x99\xd6\xcd\x60\xa9\x9e\x39\xec\xf0\xb6\x6e\x81\xe7\x58\x47\x31\x71\x9b\x20\xa1\x3b\x2c\x9e\xf1\x40\x02\xab\xfb\x42\x25\x61\x37\x86\x7b\x86\xe3\xec\x51\x5d\xad\x59\x71\x6f\xf4\x61\x70\xaf\x9c\x73\xd1\xa2\xe3\xdb\x5d\x29\x8b\x1b\x1d\x50\x92\x32\xfb\x2f\x56\x9d\xe6\x09\x83\x91\xa5\xb5\xd0\x6c\x3a\x75\xce\x5d\x83\x1f\x9c\xb6\xc0\x3b\xca\x68\x34\x0e\xd1\x80\x94\x27\x9a\xe7\x90\xd7\xd0\xf0\x45\x33\x77\x27\x16\x07\x14\x83\x03\x52\xe6\xf0\xf3\x08\x87\x46\x06\x0d\xa0\x93\x9a\xdc\x77\x94\x93\x9c\x5b\x1b\xbf\x0b\xbe\x45\xc7\xfe\x85\x13\x33\xdf\xb8\x16\x63\x71\x3e\xe0\x0d\xc6\xd7\xc1\x31\x79\xe4\x7a\x67\x29\x78\xe7\xc7\xe0\x8c\x9e\xde\xb9\x57\xa8\xae\x18\xc5\x58\xe4\x8b\xb9\x31\xb3\x19\x45\xa4\x22\x3f\x26\xb0\x42\x41\x73\xf3\x42\x55\xa4\xb1\x3b\x9a\x51\xfc\xf4\xe5\x25\xe0\x71\xcc\xd4\x88\x81\x33\xe7\xf9\xc2\x81\x82\xd7\x55\x7c\x38\xcd\x1c\xae\x25\x8e\x10\xb1\x91\xad\x46\x56\xe7\x4c\xe7\xc0\x66\xda\x55\x0e\xb6\x48\x06\x07\x94\x2c\xbc\xaa\xf0\x85\xae\x7d\x5c\xf2\x91\xa5\x19\x66\x8c\x02\x12\x40\xa7\x8f\xac\xec\xd5\xd8\xd5\xa7\x2e\xd9\x94\x30\x66\x1a\xbb\xcd\x5b\x98\xdc\x50\x6d\xf6\xc9\xbe\x31\x66\x28\x3a\x98\x4a\xca\x68\xfb\xb8\xa0\xad\x61\x30\x50\xe5\x93\x00\x75\x3a\x42\x68\x69\xec\xeb\x9e\xb5\xa8\x23\xd9\xf1\xe7\x8b\xb2\xc8\x0a\x62\xfd\x1a\xe6\x18\x26\x23\x34\x04\x21\x09\x45\xce\x90\xd0\x3d\xb2\x66\xb1\xaa\xe7\x87\x80\x26\x98\xa9\x26\xd7\xcd\x92\xf8\x82\x8a\xfc\xfa\x9b\xd8\x05\xc0\xdc\x5e\x47\xd3\x79\xae\x55\xb8\x4f\x4f\x7b\x5b\x7e\x0d\x4e\x76\x1e\xd9\x02\xa6\xe0\x1d\x9c\x31\xc4\xe1\xfd\x02\xa6\x7d\x74\xc9\x4b\x50\x6a\x8d\x38\x1d\x5f\xea\x4a\x39\x2f\x02\xcb\x82\x74\x6a\x6e\x8d\x4a\x6d\xa0\x6a\xb9\xc9\x58\xb7\x37\x0a\x80\x2f\x72\xea\x34\xb7\x25\xb1\x10\x44\xab\x92\xdb\x0b\xba\x2c\xaa\xb1\x8f\x14\x2f\x50\x8f\x11\x8f\x76\xdb\x44\x18\x05\x4b\xfe\x90\xaa\x07\xfb\xc0\x07\x83\x43\x28\xd7\x2b\x8e\xee\x07\x95\x22\x43\xcd\x2a\x52\x09\x5c\xc2\x2b\xd7\xf7\x85\xea\xca\x96\x1b\x36\x73\x2e\x99\x64\x7a\xeb\xfa\x46\xe6\xcd\x67\x88\x03\x8b\x51\x30\x37\x79\xcf\x4f\xf5\xcb\xd0\x84\x30\xd7\xc0\x74\xb1\x1e\xb0\x0e\x4a\x46\xb4\x27\x53\x1e\x82\xf4\xe0\x13\x68\x12\x09\x63\xbd\x3b\x7b\xa3\xe5\x37\x77\x0c\xb9\xbd\x25\xe6\x4c\x2e\xfd\x43\xdb\xab\x65\x64\xdd\x76\x4e\xad\xda\x4a\xb4\x74\xdd\x17\xcd\x5c\xaa\xc1\x46\x27\x83\x3f\x38\x79\x80\x93\xb9\xe6\x70\x6a\x21\x18\x46\x9b\x4c\xb1\x40\xce\xe2\xa6\xf9\x52\x07\x99\x9a\xf8\x3c\x5f\xf0\x8f\xd8\x43\x5f\xa5\x7a\x99\xc2\x6a\xc4\x09\xc7\x3e\x62\xb2\x18\x9d\x84\x02\x75\x3b\x02\xbe\x9b\xa6\x14\x18\xf3\x61\x63\x01\xcf\x3f\x01\x8b\x29\xba\x84\x77\x17\xdd\x22\x6a\x1f\x19\xce\x1b\xcd\xce\xf2\x0d\x63\xd0\xcb\x07\xcb\x9d\x57\xc7\x80\x5b\x8a\xe3\x4d\xf0\xf6\xf7\x8b\xc5\x9a\x77\xd4\x87\x72\x40\x79\x70\xad\xd0\x08\x58\x7d\x2a\x2a\x58\x63\xfa\xc0\xfe\x76\x79\xc2\xfb\x3c\x25\xb3\x20\x55\x6c\x16\x75\xf1\x7c\xc1\x20\x65\xba\xba\x47\xd9\x03\xf1\xc3\xd2\xd1\x9b\xb6\x01\xd2\x98\x47\xe5\x8d\x86\x19\x87\x0e\x66\x69\x8c\xed\xd5\x8f\xef\x0e\x09\x75\xbe\x88\x9d\xc7\xcf\xc1\xb5\x30\x96\x4f\xaf\x09\x95\xcf\x0b\x97\x30\xbc\xb7\xdc\x78\x55\x2f\xdd\x7a\x1e\x37\x9d\xc8\x1e\x76\x8c\x27\x8a\xfc\x0b\xd5\x36\x22\x9e\x47\x1a\xff\xa4\xdc\x77\x1d\x57\x57\xa2\xe3\x40\xd4\x95\x10\xf2\x1b\x5e\x10\x0c\x35\x76\x3c\x66\x74\x69\x2f\x63\x8c\x9c\x2f\xb2\x19\x87\x3f\xfc\x7d\x68\x1b\xc1\xd5\xa0\xf6\xda\x77\x4c\x37\xde\x4d\x1f\x1d\x1d\xbd\x89\x66\x75\xaa\xee\x1e\x96\xe1\x12\x6a\xaa\x7f\x01\x84\x21\x7e\x1c\xa2\x81\x75\x19\xd9\x19\x41\x4d\x75\xd0\x33\xc1\x49\xa0\xd7\xeb\x03\x2c\xa9\x8a\xab\xe2\xbe\x87\xd4\x38\x58\x0b\xf1\x8b\xde\x0c\x84\xdb\x9a\x27\xe5\x7d\xbc\xa9\x22\x4d\x94\xdc\x5a\x52\x4d\xb8\x5e\xd9\x99\xd9\x5b\x35\x1c\xb4\x1c\xf8\x2d\xcc\x19\x1c\xfc\xf3\x05\x83\x74\x16\x04\x80\x66\xe9\xe0\xc6\x2c\xe0\xac\x01\x5f\x52\x9e\x97\x54\x58\x8e\xcf\x98\xc1\xc7\x51\x06\xe3\xe5\xb2\x4b\x28\x06\xfb\x44\x3b\x0e\xe2\x1b\x1c\xa6\xa0\xf0\x7d\x91\x45\x18\x93\x7b\x03\x7c\x06\xe3\xc6\x22\x3c\xdf\x04\x66\xaf\x6e\x41\xfa\xa2\xd2\x16\xd4\xec\xf9\xa2\x13\x58\x35\x41\xf5\x2c\xae\x05\x01\x9b\x47\x72\x18\x25\xa9\xe1\x99\xb1\x46\x10\x93\x26\xba\x3f\x2c\xbc\x56\x62\x3b\xc4\x76\x63\x85\x9f\x0b\x78\xfc\xad\x7c\xac\x3f\x00\x3c\xdc\xd3\xec\x42\x32\x04\x64\x91\x72\x0f\x3d\xce\x68\x11\x23\x7d\xe7\xca\x1a\x6d\x10\x5e\xdd\x17\xc1\x63\xdb\x30\x82\x22\xb2\xb9\x4f\x24\x69\xce\x32\xaf\x55\xb1\x16\xbc\x3d\x31\xa5\x65\x98\x87\xf0\x66\x02\xb7\x5f\x6f\x82\xdb\xcd\x1a\x46\x80\x2e\xee\x45\xef\x58\xe3\x13\x82\xe3\x1b\x59\x96\xa8\x3e\x24\xc9\x7d\xfd\xb4\x0e\x08\x43\x38\x8b\x75\xb3\x4d\xef\x3b\x73\x80\x85\x4a\xea\xd5\x4c\xb7\x3e\xb8\x03\xf9\x85\x56\x83\x79\x49\xca\x64\x65\x12\xe5\x43\xac\x4f\x6b\x55\x18\xa9\x3d\xab\x9b\x37\x3a\xfd\xbe\xb1\xab\x77\x79\xf7\xd4\x06\xb5\xbb\xfd\x93\x26\x9f\x97\xcc\x00\xb2\xa6\xcd\xa5\xa7\xdc\x64\xd0\xe1\xd6\xee\x40\x83\xd1\x6c\xb6\xdd\x66\xe8\x42\x60\x1d\xa0\xc1\xeb\x78\x81\x81\xed\x8b\x47\xb5\xd7\x7d\x77\x32\x39\x3d\xaf\x4c\x11\x0b\x0c\x35\x24\x15\x2f\x2d\xf6\x8d\x02\xd6\x03\x14\x7b\xc2\x3c\xb3\x85\xa6\xf1\xca\xf3\x13\x11\xc2\xbd\x33\x7f\x9b\x07\xb9\x81\x0a\x12\x96\x8c\xe0\x3a\xdf\xb0\xd0\x75\x70\xe2\x86\xdf\xa0\x95\x0f\x39\xba\x1e\x67\x60\x33\xe7\x4f\xc8\xe1\x20\x5e\x57\x3c\x6c\xd8\x77\x85\x3b\xdb\xb0\xdc\xba\x56\x8d\x33\x85\x0d\x9f\x16\x6f\xf1\x43\xa3\xd5\x5f\x2a\x58\x0e\x18\xd8\xe7\x8b\x37\x72\xa4\x34\x95\xbc\xed\x08\xbb\xaa\xd7\x6f\x31\x2b\xea\xa2\xaf\x04\xcc\x29\xf7\x6e\x03\xf2\x46\x9c\xc3\xd0\x7d\x1b\xc5\xa4\xda\xbe\xe0\x1f\x8d\x87\x6b\xb5\x82\xdc\x47\xda\xfe\x56\x39\xcd\xb2\xa4\x73\xaf\xf8\xd3\x02\xed\x9c\x37\x92\xe9\x05\x47\xa9\xd9\xa2\x51\xb3\x7e\xa1\x6b\xcf\x69\xa8\x8d\xe6\x18\x62\xbc\xf4\xb5\x25\xc0\xcc\x4f\x92\x0a\x11\x22\xeb\x83\xd6\x59\x85\xd6\xcb\x55\xbe\x47\x92\xb7\x87\x73\xf9\x17\x77\xa1\xd6\xd9\x4d\x0e\xa2\x98\x9c\xa3\x1e\xac\xa5\xa4\xab\x6b\x32\xb9\x2e\xd3\x54\xcf\x9e\xa3\xc9\x8b\x92\x9f\x30\x85\x60\x68\x74\x5f\x2c\xd6\xb0\xd7\xf7\x49\xcc\x0b\x2c\xf1\x41\x9f\xe0\x13\x7f\x30\xa7\x7d\x68\x94\xb2\x8d\xa9\x03\xa1\x88\xa4\x09\x9c\xb2\x74\x47\x27\xde\x2f\x58\x0d\xc0\x42\xcc\x8b\x06\x1a\x5b\x1a\x13\xc5\x26\xae\xf7\x6e\x97\x57\x8d\xc0\x83\x27\xae\xaa\x3b\xb4\x9e\x13\x4b\xc3\xc9\x62\xbc\x9f\x4c\xa3\x4a\xe3\x4e\x22\x1c\x3b\xc0\x8f\x78\x62\x09\x16\x24\xe5\x9f\x64\x92\xe2\x7d\xe7\x79\x07\x9b\xd5\x11\xfb\x50\x94\x26\xdd\x67\x7c\xe2\x83\xb1\x36\x06\x91\x5e\x22\xdf\x57\x0a\x0c\x3d\xef\xe0\x2e\xf5\xd2\x62\x2d\x29\xb5\xf8\xac\xf4\x75\x85\x0b\x04\x03\x25\x1d\x2f\xe9\xbf\xc8\x66\xae\xf0\x11\xf4\x73\x38\x0f\xb3\xcd\xce\xe0\x7a\x03\x7e\x87\xaa\x0e\x61\x5b\x88\x3e\xbe\x11\x87\x9e\xae\x16\xef\xd0\xbc\x29\x7d\x22\x47\xbe\x99\x14\x90\x54\x73\xeb\x61\xcf\x7e\x13\xa1\x8e\x2f\xdd\xeb\xa1\xdb\xde\x68\x5c\xe7\xf7\xc0\xdd\x1b\x03\xe3\x42\xe7\x24\xfb\x44\xa8\xb3\xca\xec\xf5\xc1\x29\xb9\x64\x6d\x13\x7e\x09\x1b\x3d\x01\x50\x5e\x68\x2b\x03\xa4\x5f\x1d\xb3\x8e\x46\xc9\xc2\x8f\x4d\x08\x7f\x22\x47\x5e\xb5\x5a\x3c\xb4\xa0\x41\x68\x76\x97\xfc\x80\x32\xfc\x3a\x2f\xab\x55\x74\xf4\x24\xb1\x8f\x7d\xf9\xc2\x4e\x20\x31\x3c\x99\xfd\x7e\xc2\xb9\xd9\x39\x77\x6b\x87\x9b\xde\xd9\x98\xdb\x58\x41\x78\xc2\xc8\x35\x59\x7b\x73\x09\xad\x19\x75\x62\x7c\x31\x7a\x76\xa6\xe0\x11\x9f\x70\x6e\x2a\x98\x5d\x3e\x75\xd9\xc5\xc5\x3b\xa2\x11\x80\x6e\x14\x02\x80\xf9\xf0\x31\x9e\x51\x4d\x7c\x57\x6d\x5d\x83\x4d\xdc\x8d\xb3\x7d\x01\x41\xc5\xb7\x95\x41\x63\x9a\x3b\x16\xd3\x2e\xf6\xcb\xb4\x90\x0f\x32\x23\xc4\xcd\x09\x22\xad\xf7\x3d\x7b\x74\xf0\x69\xa9\xea\xe9\xda\x17\x7c\x02\x61\xe0\x90\x06\x3e\x08\xaa\xab\x85\x3f\xdc\x7a\x63\x90\x67\xb1\xe1\x43\x9f\x9d\xda\x7a\xca\x63\x23\x3e\x00\x9f\xc4\x2e\x14\xee\x0b\xe6\x4f\x6a\xd4\x72\x6b\x1e\xec\x2f\x27\x0d\xee\x86\x6f\xf7\xfc\xb8\x47\x4c\x42\xaa\x9a\xe3\x1d\x1e\x0d\x57\xaf\x87\x8a\x18\x81\xf6\xf3\xc5\x29\xfc\x96\x49\x80\xd8\xd7\xe8\x55\xb5\x5a\x19\xee\xa2\x74\xd6\xe2\x3c\x39\x07\xc1\x98\x07\xc0\x9b\x36\x8c\x2a\x85\x58\x88\x38\xf8\x02\xa6\xe5\xc3\x95\xf3\x7a\xf6\x6a\xd9\xe6\x44\xa7\x53\x40\x60\xd1\xe8\x34\xec\x60\xd3\xb4\x82\x27\x12\x87\xcc\xae\x13\xd5\x17\xe9\xf0\x85\x39\x2e\xdf\x00\x5e\xb3\xd9\x18\x81\x32\x68\x19\x59\xed\x0e\x29\x81\xb5\x0d\xf7\x86\xa9\x32\xa7\x1b\x42\xab\x1d\x8c\x11\xd0\xc8\xe8\x5f\xb0\x69\x79\x88\x00\x55\xa7\xdf\xda\x9f\xf1\x3c\x44\x28\x55\x2b\x17\xbb\x9c\x87\x10\x51\x13\xca\xf9\x78\xd5\x16\xb8\xae\x1d\x3c\xd0\x37\xea\x5c\x6c\xe7\x80\x29\x31\x4f\x9d\xa3\xd1\x5a\xca\x6d\x01\x20\x3b\xd8\x82\xc0\xe4\x92\x45\x7b\x3d\x9c\x29\xf7\x3d\x92\xcd\x2f\xd9\xf0\x0b\x1d\x3d\xfe\x1c\x41\x85\x90\x05\x6c\xb9\xdb\xc9\x8f\x51\x9c\x2d\xeb\x09\xd8\x50\x4f\x80\x69\x39\xb9\x94\xa1\x1e\xad\xed\x2b\xfd\x2b\xf6\x27\x6c\x97\xe3\x26\x77\x8a\xae\x7e\xf2\xa6\xb1\xad\xa1\x28\x96\x9a\xa4\xfd\xca\x4c\x62\x88\xb7\x8c\x31\x5a\x79\x4e\x4d\xd4\x0e\x17\xce\xcf\xf2\x10\xfa\x19\xc0\xe3\xaf\xfe\x4f\x3f\xf9\xef\xfc\xe4\x3f\xf8\x1f\xfc\xfa\x9f\xf7\x5b\x7e\xd3\x6f\xf8\x6d\xbf\x04\xff\xd9\x7f\xed\x5f\xff\xc7\xf9\xaf\xf8\x75\x7f\xfb\xaf\xfc\x0f\x7f\xef\x3f\xf0\x1b\xff\x9e\xff\xe1\xfc\x63\x1f\x68\x78\xd8\xe1\x08\x21\x3a\xb5\x3a\x7b\xdb\x2e\xd8\x34\xfb\x21\x2a\x3a\x58\xad\xfb\xa1\xe7\x45\xc0\xbb\x23\x05\x98\xca\x6b\x96\x10\xfc\x62\x5b\x8d\x39\xe7\xd4\xe0\x73\x24\x40\x77\x89\x58\x21\xed\xa5\xb4\x42\x8f\x72\x64\x1f\x01\x80\xb0\x72\x38\xb2\x0e\x9e\x6b\x9f\x47\x46\xf6\x45\x33\xd7\x01\x8c\xe6\xb6\x0b\xc3\xc9\x15\xbd\xe6\x4d\x54\x8b\x5c\x33\x0b\x69\xb8\xd0\x9f\x4a\xf2\x26\xe8\xca\x8a\xc9\x81\xb8\x9e\xfe\x85\x60\x12\x43\x0e\x9b\x1d\x67\x2a\xe0\xf2\x12\xbc\x8c\xd9\xa5\x25\xaa\x16\xb1\x6f\x09\x3b\x27\x6c\x2b\xfd\xb2\xc6\xe3\xa2\x01\x96\x7a\x3e\x99\xe4\xe3\x63\x4a\x19\x73\xef\xbd\x92\xde\xfe\x5e\x98\xa2\x22\xb8\x2c\x30\x4d\xbf\xc2\xa4\x09\x0a\x37\xab\x8b\xf5\xc2\xd2\x11\xde\x5f\xb4\xd7\xec\xba\x51\x00\xab\xe4\x92\xd3\xa7\x38\xb8\x78\x7e\x5b\x6a\x57\xc0\x3b\x43\x2e\xcf\xfb\x28\x2d\x71\x79\x24\xa3\x65\x69\x43\xe9\x17\xfa\x04\x1c\x8f\x67\x0c\x0f\x6e\xf0\x00\xb2\x23\x01\xa6\xa0\xbf\x25\x28\xf2\x72\xee\x78\xe4\xbc\x0c\x1c\x0f\x26\x8a\x4f\xa8\x01\xca\xfa\x7c\xb0\x7b\xcd\x67\xee\x2b\x32\x99\xe1\x5b\x92\xb9\xf9\x65\xee\x89\x86\x80\xd6\xf5\xdc\x49\xe8\x4e\x65\xde\x8c\xd9\x1d\x06\x1f\xa0\x8b\xc1\xe3\x17\x85\xaa\x57\xb6\x5d\x1d\xd9\xe9\x34\xc6\xca\x51\xaa\x82\x48\x49\xab\x59\x2b\xe1\x66\xba\xa0\x79\xf0\xe9\xe1\x03\x00\x7e\x2f\x34\x89\x7f\x42\xbf\xed\xe2\x9e\x00\x7d\xb9\xc8\xcb\x8b\x50\xd9\x2c\x0d\xf5\x9e\x05\x6a\x33\xf5\x08\xd4\x9d\x3d\xc7\x54\x4e\x91\x12\x9d\x2e\xeb\xbe\x10\x15\xa3\x62\x19\x41\xd1\xd4\x38\xb3\x26\xc4\x0b\xcc\xde\xaf\x5d\xc0\x3f\xcc\xb8\x41\x24\x24\x14\x42\x0a\xef\xf6\xab\x51\x8c\x6a\xf9\xc4\xd4\xf0\xf0\x48\x60\xcd\x06\xf0\x3a\x89\xce\xee\x12\xe8\xc2\x4b\x88\x97\x13\x76\xdc\xf1\x1b\x7c\xa5\xd5\x8b\x30\x44\x1c\x07\xe8\xf9\x89\xf0\x1e\x1b\x25\xa7\x71\x5a\xb9\xab\x27\x9b\x5d\xe6\x31\x80\xbc\x80\x7d\x97\x2f\xd0\xce\x8d\x0c\x3d\x2a\xc3\xb6\x5f\x6f\x31\xa0\xee\x0b\x8e\x1e\xa7\x7d\x2c\x01\xcd\xf9\xa1\x18\x7e\xb2\xcc\x27\x39\x88\x8c\xbe\x18\x8f\x84\x27\x17\xdb\x01\xdf\x12\xd0\x3e\x9a\xca\x4a\x79\xce\x17\xe5\x32\x8f\xc8\x45\xe5\x0e\x37\x8e\xc9\x7a\x7d\xac\x94\x6b\x16\xcf\x40\x6d\x8d\xc2\x50\x56\x64\xbc\x76\xf6\x32\x47\xd8\xc1\xb4\xf6\x8d\x92\xc8\xb0\x09\x09\xc0\xf3\x08\x48\xe0\x84\x40\xdc\xd9\x18\x06\xb9\x9c\x19\xc1\xb5\x0b\x24\xc2\xaa\x30\xdf\x2d\x6a\xdb\x07\x37\xec\xbf\xe0\x2b\x72\x6d\x03\xaa\x72\x45\x33\x9e\x7c\x63\x6b\xa5\x85\xb3\x54\x37\xc5\xb7\x1d\x73\x62\xd7\xd9\xd8\xf0\xa5\x14\x4f\xcf\xf9\xa8\xfc\x0b\xb0\x38\x8b\x33\x4a\x4a\xa8\x22\xe6\x15\x0e\x13\x48\xf7\x14\xaa\x14\x64\x90\xac\x4d\x56\xa4\xbb\x2a\x67\x27\xc4\xc6\x12\x5e\xe5\x23\xbe\x90\x91\xf5\x31\xb3\x4e\x41\x8a\x72\x03\x2b\xda\x2d\x21\x87\xce\x54\x69\x90\xd3\x37\x8c\x3a\x20\x7c\x38\x36\x9b\x92\x01\xfa\x3b\x1c\xfd\xe4\xbb\x90\x0e\x81\x6e\x3b\x95\xce\xb0\xd3\xdb\x25\x6d\xa5\x7a\xcd\xc0\x24\x4d\x55\x6a\xa9\xdd\x38\xf5\x30\x0c\x9d\x69\xae\x0c\x0f\xbf\x10\x2d\xe5\x3a\xd0\x9d\x06\x70\x2e\x88\xeb\xf6\x56\x48\x97\x59\xb5\x11\x8b\xd5\x87\x5d\x25\x96\xca\x89\x9c\x08\x51\x42\x2e\xa1\x98\xc8\xfd\x02\x2c\x16\x90\xf8\xab\xbc\x18\xa9\x4b\x9d\xe2\x54\x88\x5b\xa0\x80\xaa\x2b\xc4\x31\x5e\x15\x53\x8d\xc1\x6b\xd4\x2f\x55\x6d\xde\xd5\xbe\x30\x78\xe4\xeb\x1a\xb5\xb7\x26\x52\x33\x2e\x1f\x80\x76\x34\x24\x26\x53\x0a\xab\x87\xbd\x0c\xad\xfa\x6a\x75\x15\x44\x63\x99\xcb\xa5\x4d\xec\x0b\xc5\x08\xc5\x78\x33\xa2\x6e\xc7\x15\x44\xa9\x44\x1a\x42\xba\x20\xa8\x53\x82\x75\xcb\x60\x37\xb8\xbf\x15\xb9\xf7\xa8\xb0\xca\x1e\xe3\x93\x4e\xe0\x40\x56\x4d\x8e\x7a\xc2\x52\x19\x97\x52\xdc\x80\xe7\xeb\x1a\xbb\x86\x73\x64\x9d\x1b\x4b\xbd\x7e\x2f\x82\x53\x01\x0f\xab\xf8\x0b\x31\x5b\x9e\xb5\x25\x72\x01\x8e\x8f\x24\x80\x15\xf7\x9e\xa2\xd6\x2b\x08\x29\x4f\x01\xf4\x9e\xbc\x45\xb5\x72\x5e\x06\xa7\x7d\x1f\x3d\xcf\x17\x4a\x65\xdc\xf0\x14\x84\x9b\xa8\x10\x86\x41\x24\x7a\x0c\xbe\xb1\x2a\xe0\x1a\x01\x81\x76\xf2\xba\xc3\x9a\xf5\x0f\xa2\x1e\x9a\x38\xb2\x10\x5f\x44\xf0\xbe\xe1\xb8\xcf\xce\x6e\xf7\xcc\xc4\x38\x6b\xb8\xac\x12\xef\x72\x86\x93\x35\x31\x30\xe6\x2a\xf5\x1a\xb1\xd8\x0b\x09\x24\xa4\x7d\x00\xfe\x70\xaa\x76\xf0\xa4\x21\xeb\x54\x95\x72\x91\x54\x64\xf4\xb7\x83\x17\xc9\x08\x73\x2e\x2b\x2f\x69\x0e\xed\x4a\x5b\x9b\x82\xc6\x31\x7e\x51\xe5\x3c\xcc\x82\x55\xc0\xc5\xa4\xb6\x77\x59\x3f\x1e\x92\xdf\xe3\x9d\x92\xdb\x16\x68\x49\x77\xaf\x9a\x41\x90\x38\x29\x24\x2b\xe9\xc2\xbf\xe8\x10\x63\x2f\xa4\x05\xba\x8b\x46\xf7\x71\xc0\xa1\xc2\x1b\xf6\x14\x17\x4c\xf5\xc3\xab\x42\x08\x66\x94\xde\x9a\xc7\xac\x0e\xc7\x4a\xbe\xd8\x44\xe0\xae\xdd\x67\x0e\x70\xf3\x9e\x29\x9b\x10\x8a\x27\x6f\xeb\xd3\x34\x25\x22\x44\x93\x3e\xfa\xd1\x0d\xaf\xad\x14\x91\x06\xea\x6e\x7e\x96\xdd\xc9\xcf\x00\x1e\xff\xe6\x2f\xfb\x13\xbf\xfd\xfd\xb5\xbf\xf5\xf7\xfd\xc5\x3f\xf6\xd7\x7f\x6a\xff\xaa\xfa\x4b\xfe\xe7\xdf\x89\x7e\x1f\xf9\x77\x7f\xf2\x2f\xff\x7f\xfe\xc4\xf9\x0d\xef\x5f\xf8\xb3\xff\xbf\x0f\x18\x1e\xa0\xae\x4b\x49\xba\xb6\x96\x55\xa7\xea\x97\x6f\xea\x83\xea\x4c\x99\x49\x20\x2e\x4f\x2c\x06\x6e\x69\xcf\x0a\xef\x0f\x75\xc9\xfb\x7c\xd1\xcc\x95\x57\xcb\x9c\x96\x7f\x22\x90\x1c\x3d\x37\xdc\x4a\x00\x36\x0f\x39\x74\x35\xa0\xe0\x34\xc9\x02\x04\xa2\x72\x44\x30\xd9\x99\x79\x3e\x29\x48\xc0\x29\xd2\xc1\x67\x8e\x37\xe6\x4c\x9e\x36\x96\x2f\x7d\xec\x04\x11\x0c\x10\xa8\x76\x87\xaa\x60\x00\x22\x43\xe0\xbc\x64\x7b\xbe\x58\x5d\x18\xec\xdc\x60\xd1\x73\x9e\xea\xe8\xc1\x56\x29\xaa\xb0\x85\xf2\xe9\xc1\x3f\xca\xa8\xa7\xa3\x04\x19\x08\x6a\xf6\x8b\x60\xd2\xb9\x7d\x81\x22\xba\xf4\x1c\x62\xe6\x18\x52\x6f\xa8\x4b\x57\xdd\x91\xed\x52\x2a\xdc\x71\xca\xbb\xd1\xcf\x75\x30\xa3\x43\x1a\xe8\x00\x30\x7e\xe2\x17\xdf\x85\xa7\x53\x9b\x45\x67\x3a\x19\x8d\x7d\x44\x6b\x27\x8e\xa4\x89\x04\xae\xd6\x7e\x4b\xdf\x0c\xf0\x3a\xce\x70\x78\x0e\x09\xc9\xee\x5f\x94\xcb\x9a\x05\x9a\xa7\xb9\xe8\x99\xe5\x3c\x1d\x66\x61\x73\x11\xa9\x58\x01\x5c\x92\xda\xed\xa3\xc5\x9e\xe7\xb8\x9b\x9f\x62\x99\x1f\xe2\x13\x5b\x5a\xda\x3c\x79\xcf\x96\xb5\xd2\x63\xe3\x86\x27\x7a\xd3\xb2\x4b\x33\x92\x60\xfd\xcd\x4d\xc0\xcd\x29\x0e\x6b\x21\xae\x9f\x6a\x3e\xa1\xeb\x4f\x65\xb7\xd5\x37\x81\x29\xe1\x55\x0f\x64\x6e\x61\xf5\x16\xc9\xa0\xb6\x16\x5e\xaf\x30\x3c\xfd\x01\xb9\x1a\x03\xae\xa3\xe6\xfd\xc2\xba\x99\x67\xb8\xa9\x08\x3b\xa9\x1f\xee\xbf\x91\x7d\x0b\xe1\xd8\x5e\xb8\x26\xea\x03\xfc\xd0\x51\xc1\x15\xe9\x73\x9e\x81\x34\x33\x60\xc0\xf6\x45\xbc\x50\x05\xce\xc7\x78\xb8\x70\xd9\x26\x1d\x72\xf7\x90\xfe\xb9\x6c\x6c\xd2\x96\xed\x15\x1f\x12\x1d\x68\x73\xc5\xfb\xec\x19\xa7\xe8\x5f\x4c\x60\x8c\xce\x6b\xa1\xdb\xee\x68\x91\xe2\x17\x0d\x0f\x29\xd0\xca\xe0\x83\x7c\x49\x5e\x41\xdd\xe4\xd1\x6e\x8b\xb7\x32\x08\x49\x70\x9f\x30\x7f\x48\x79\x33\xea\x36\x63\x71\x50\xb1\xbe\x8e\x06\x1a\xa4\x71\x16\x08\x8f\x83\x77\x9a\x03\x9e\x53\xcf\x0f\xf9\x83\x80\x02\x87\xf9\x62\x86\xce\xc7\x01\xdd\x4f\x40\xe7\x09\x22\xbc\x36\x67\x33\x27\x08\x79\x46\xc4\x76\x77\x12\x40\x13\x48\x16\x1c\x12\xa6\x97\x5a\xb4\x34\xf8\xc5\x24\xbf\x9c\x13\xdb\x1a\x06\x4b\x06\xfa\x9e\xf5\x20\xbb\x13\xa3\xfb\x7d\x6e\x74\x74\xbd\xa7\xf8\x0b\x6c\xbc\x16\xc6\x8e\x5f\x44\xcb\xf8\x02\x08\x6b\xd9\x1d\x3f\x95\x46\x52\x34\x89\xb4\xcc\xa8\x4c\xbb\x8b\x15\xe3\x22\xc0\x48\xd4\x52\x8f\xab\xf3\x7c\x33\xbd\xb0\xba\xe8\xc0\x17\x6f\x64\x73\xaf\x98\xb5\xc0\xb1\xd7\x7a\xfa\x1e\x90\x34\x79\xe9\x09\xb1\xbe\x45\x9b\x52\x5e\x28\xbc\x2b\x94\xd1\x82\x6c\xb6\x91\xf5\xfb\x85\x4b\xcb\x7e\x42\xd6\xd4\xac\x6a\xdf\x63\x1f\xca\xaf\x13\x77\xcd\x83\x9a\x06\x3c\x86\xd5\x1a\xa7\x75\x1c\x60\xb6\x83\x77\xef\xe9\xfd\xf8\x62\xbd\x07\x19\xc3\x32\xb9\x20\x10\x75\x2c\x80\x28\x8a\x24\x05\xa1\x9d\x5d\xcd\xfb\x5e\xb3\x4e\xac\x44\x0f\x9c\xe0\xa1\x96\xd6\x1a\xde\x2f\x14\x23\x1e\x86\x8f\x26\xd8\x63\xb4\x69\x43\xaf\xe7\x3d\x5f\xdc\xf7\xb3\x0b\xb5\x41\xe0\xd1\xcd\x3a\x4c\xad\x66\xe7\x5d\x4f\x2f\x50\x7d\xe1\x15\xc3\x72\xe5\x45\x81\x10\x1e\xe4\xb2\x34\x8f\xb4\x1c\xd8\x32\x75\x17\x33\x28\x85\x94\x96\xa3\x4f\xcd\xe2\xc0\xf1\x68\xc2\x53\xdb\xfc\x0b\x56\xc3\xcc\xc6\x85\xf9\x42\xc6\x65\x1e\x79\xf0\x11\x17\x9a\xed\xf4\x3d\x70\x7c\xb5\xed\xd0\xb6\xc0\x75\xa9\x82\x4a\x41\xf8\x9b\xc4\xf3\x85\xfc\x9f\xbf\x8e\xf6\x7d\xfc\x6c\xb2\x20\x05\x3c\x06\x69\xa3\xec\xfd\xc1\xad\xea\xb5\x39\x80\xbe\xb0\x70\x59\x11\xe7\x2c\x90\x65\xff\xe4\xeb\x04\xf5\xa6\x40\xe5\x7e\x1e\x9a\x32\x0a\x0b\xe2\xa3\x30\x71\xc3\x03\xb0\x89\x8e\xab\x93\xa1\xc0\x6d\x5d\xe1\xfb\x7a\x30\x5e\x26\xbf\x58\x8d\x4c\x30\xfb\x6c\x4a\xa1\xd9\xaf\xe5\xf9\x49\xa5\x3c\xc2\x48\x57\x82\x48\x11\xe6\xb7\x77\x71\x79\x64\x96\x9d\x6d\xde\x5a\xa2\xe0\x5f\xdc\x45\x1f\x6e\xc9\x3e\x90\x63\x24\xab\x1e\x5c\x8a\x35\x19\x88\x32\x49\x3a\xa1\xde\xb8\xd1\xa7\xb8\x82\x11\x6d\x73\x73\x9c\x79\x65\x5f\xac\x95\xdf\x36\xec\x3b\x88\xcb\xb5\xad\xb2\x30\xa5\xae\x7a\x12\x49\x03\xa4\x7b\x80\xd7\xe6\xd1\xda\x1f\x82\x09\x13\xfb\x16\x5a\x32\x03\x5f\xac\xf7\x14\xbc\x55\x4c\x30\x24\x2f\x58\xeb\xe9\x92\x38\x96\x24\xba\x22\x7d\xd9\xdb\x65\x47\xf9\x22\x69\xc5\xa0\x6c\x3c\xe1\xf6\xe0\x3e\xf1\x04\x89\xa7\x4e\x3b\x29\x60\x99\x88\x88\xae\x80\x1c\x0b\x7e\x10\x62\x18\xba\x5b\x92\x9c\x9e\x78\xde\x0f\x40\x19\x81\xfc\x42\xf5\xf4\x2f\x16\xf1\x4c\xe3\x4e\x32\xc6\xf7\x0f\xff\xf4\xb5\xc4\x84\x0b\xac\x36\x18\x6b\xbb\xd3\xe1\x92\x28\xe7\xb5\x19\x8f\x44\x4d\xd4\x1f\xfa\xd7\x4f\xea\xce\xd5\xf4\x33\x19\x0a\xdc\x5f\x2c\xe5\x1d\x9d\x5a\x20\x51\x92\x20\x10\xce\x26\xa0\x89\x43\x20\x96\x0b\x94\xd1\xc4\xe5\xf5\xab\x7f\xe0\x51\xc8\x3c\x07\xf1\x80\x77\x06\xc2\xf7\x55\x86\xb9\xd1\xe6\x03\x47\xae\x7d\xad\x78\x1e\xdd\x90\x59\x61\x19\x90\xf6\x7b\x0d\xdb\x38\x34\xf1\x73\x00\x8f\x9f\xf8\x8f\xfe\xad\x7f\xf8\x4f\x36\xf1\xaf\xfe\x9e\xbf\xe3\xcf\xff\x9a\x7f\xf9\x0f\xfc\x0b\xf0\xff\xfb\x0b\xe0\xff\xf1\x17\xfd\x77\xff\xe4\xff\xe5\xff\xf9\x13\xfa\x37\xff\x91\x7f\xee\x3f\xff\xef\x3f\x00\x3c\xa8\xbd\xab\xd5\x37\x0b\x0e\x72\xc9\xb3\x60\x79\x76\x09\x09\xa9\x17\x47\xc6\x65\x30\xf5\xad\x56\xee\x87\x07\xb0\xee\x1b\x0f\xea\x5f\x68\x33\xcb\xc7\x91\xf4\xe8\xc1\x08\xda\xe6\x86\x3e\xf5\xad\x1a\xee\x80\x97\x41\x23\x13\xfa\xb6\x5d\x38\x3d\x60\x72\xdf\xf0\x35\xe3\x01\x5f\xd0\xa6\x3a\x5d\xe1\xd5\x2a\xa5\x4e\x62\x9c\x9c\xb0\xa7\xf3\x4a\xe7\xfb\x60\x1d\x60\xa2\x2d\x84\x19\xb4\xcd\x08\xbf\x6f\x47\x81\x9e\xf9\x45\x33\xc7\xc2\x23\x76\xb2\xc8\x68\x6c\xd5\x2c\x54\x3f\xa2\x07\xc6\x5a\x83\x79\x3c\x1d\x02\x10\x85\x71\x84\xeb\xdd\xab\xe9\x35\xc0\xa4\xd9\x17\x77\x71\x3b\x27\x27\xc4\xee\xa5\xe4\xd6\xec\x0a\x52\x91\xde\xef\x73\xdd\x13\x8e\x87\xfa\xf6\x78\xe8\x3a\xa3\x3e\xce\xf8\x30\x79\xfc\x42\xbf\x9c\x95\xa4\x0c\x97\x0f\x23\xe1\x75\xde\x2f\xfd\x42\x15\x18\x78\xa7\x20\xe2\x88\xfe\xc2\xc9\xeb\x11\x2f\x29\x0e\xb4\x91\xa6\x65\xfc\xf9\xa2\xa5\xec\x94\x08\xc5\xf3\x5a\x66\xe6\x1d\xd0\xdb\xfa\x23\x69\x9f\x63\x64\x39\x7a\x1f\x51\xb3\xc4\xdd\x7e\x42\x30\xad\x34\xb9\x2c\x0d\x5f\xc8\x85\x56\x0c\x91\xc8\x5e\x08\xcc\x2c\x5f\x68\xd7\x20\x77\x4d\x34\x1f\x1a\x1f\x4e\x0d\x63\x15\xc4\x81\xda\x91\x58\x51\x78\xfd\x7b\xcf\x17\x34\x4b\xb7\xab\x9d\x3e\x12\x77\xad\x70\x98\x37\xa7\x12\x6a\x11\x44\x5f\x07\x9a\xbd\x2e\xbc\xf1\xae\x41\x35\x8d\x66\x5a\x97\xc3\x01\xbe\x98\x03\x0d\x0c\x54\x00\x3f\x1c\x66\xed\x26\xa5\xb6\x01\xe9\x92\x1f\xa7\x2b\x4e\x23\x51\x6b\x2e\x9e\x1b\x75\x34\x6c\xb2\xaf\xcd\x6f\x85\x1f\x14\x24\x8c\xac\x7c\x24\x23\x10\x60\xe3\xc8\xd4\xe1\x36\x8c\xf7\x2c\xc5\xb1\x83\x0d\xab\x26\x78\xbc\xb3\x0f\x70\xb6\xb7\x65\x93\xa2\x62\x5f\xcc\x4a\xf9\xee\xb9\xad\xf0\x16\xb2\x1d\x2b\x7d\xea\x2e\x4b\xd1\x97\x55\xc6\x7b\x8d\xef\x4d\xc5\xbe\x2c\x08\x3a\x06\x01\x65\xa3\x9a\xee\x17\x77\xe1\xf4\x54\x22\x18\x44\x0a\x85\x36\xe8\xea\x62\xa3\x42\x6e\xaa\x4b\x94\x44\xc4\xa2\xf0\x80\x26\x67\xe4\x84\xe1\xe8\x0d\xa5\x3f\x5f\x80\x82\x40\x71\x10\x99\x41\x5e\xca\x4b\xdc\x4a\x70\xc4\x3c\xd5\x13\x85\xdc\x99\x0f\xc2\x36\x2a\x21\x17\x14\x02\xd8\xc9\x51\xaf\xe8\x27\x22\xc7\xe6\xd0\xb2\x34\x2c\x8b\xd4\xf7\x1c\x32\xe7\x80\xe4\x1d\x2b\x59\x44\x14\x76\x9d\x9a\xe0\x01\x93\xb9\x88\xae\x33\xc6\x62\xa0\xf0\xc5\x29\x26\xfb\xa1\x16\x6e\xf5\x96\x06\xef\x7a\x70\x0d\xc8\x17\x39\xe4\x85\x76\x2d\xba\xa7\x63\x82\xb9\x79\xef\xc9\x4e\x6c\x3d\x98\xf9\x44\x49\xc4\x03\x7d\xaa\x76\xc4\xe5\x68\x5a\x81\x1e\xdc\x38\x7d\x6e\x29\x80\x4e\xe2\xe3\xe0\x4b\x86\xdc\x97\x4c\xb5\x14\x73\x1a\xc7\xf2\x89\x16\x14\x7e\x28\x16\x51\x77\x4d\x1d\x4d\x03\xbe\x4e\x12\x6a\x03\x66\x6c\xbd\x85\x8d\xc2\xb5\xb6\xd7\x81\xe4\x92\x81\x09\x3c\xf8\xd5\xfd\x8b\x59\xa9\xe1\x20\x98\x77\xbc\x65\xd7\x2b\x3c\xe8\xe2\x3e\xec\x62\x3e\x9a\x0a\x3e\xeb\xf3\x64\x46\xf4\x60\x48\x0f\x55\x31\xeb\x4b\xd8\x4f\x24\x32\xd3\x1e\x76\x73\x1c\x42\x05\x3f\x54\xa3\xe7\xf6\x08\x63\x53\x16\x2e\x8d\xe3\xe0\xdb\x6c\xcb\xf0\xab\x01\x35\x33\x9d\x32\x80\x97\x5f\x44\x70\xa0\xfa\x4a\xf5\x35\x07\xae\x42\x3b\xb7\x43\xbd\x9c\xb1\x6e\x22\xb5\x1a\xa9\x9a\x64\x52\x32\x48\x8b\x5c\x43\x39\xf2\xed\x9e\x4f\xa2\xd6\x52\xf7\x3a\xce\x16\xbb\x35\x86\x01\xb7\xe3\x74\xbd\x1a\xeb\x42\x01\xe6\x95\x08\x7e\x4a\x82\x90\xd9\xe9\xe2\x78\x3d\x65\xc2\x7f\x01\x90\x1a\x9e\x59\x1f\xbe\xf6\x33\x9f\xea\x1a\xd7\x93\x32\x77\xaa\xcc\x95\x96\x1f\x9a\x39\x55\x5f\xc7\xb3\x89\x78\x56\x64\x9f\x9d\x9c\xfb\xe2\xbb\x78\x65\x83\x2c\x53\x95\x39\xf5\xc7\x9f\x15\xf9\x5a\x18\x6d\xbc\xb4\x41\xae\x2f\x75\xc1\xe1\x6f\x21\x15\x06\x94\xf8\x78\xc0\xfd\xc4\x64\x5d\x07\x9f\x38\x8f\xd6\xec\xe8\x35\x0b\xe4\x2d\x1b\x60\x58\x49\xee\x30\xf7\x17\x3e\x51\x18\xe2\x8b\x70\xea\xb1\xe6\x18\x83\xe1\x27\xaa\x6d\xe2\xc8\xd4\xa6\xd8\xf7\xa1\xc8\x68\xae\xb9\x44\xa5\xec\x86\x6b\x95\x0b\xd3\x91\xd4\xb0\x2a\xcd\x70\xd2\x56\x46\x0c\xe1\xe6\x27\xba\x58\xc8\x92\xb7\x5f\x7a\x2c\xa8\x59\x73\xc5\x52\x41\xbe\x47\x06\xea\xcd\x13\xe1\xba\x3a\x95\x5a\x4a\xf7\x3e\x0e\x84\x92\x8c\xcd\xe3\x0b\x50\xf0\x98\x61\x94\x4e\x02\xe0\x16\x2a\x4d\x6d\x36\xa8\x87\xdb\x65\xf5\xa6\x83\x8f\xe8\x91\x7e\x77\x99\x14\x7a\x64\x7d\xa1\x3f\x9f\xd4\x5a\x7c\x4c\xbe\xb0\xa3\xe3\x98\x67\x9a\xe4\xc1\xc6\x71\xc1\x22\xde\x32\x73\x83\xdb\x09\xe3\x7b\xd9\xb4\x74\x6c\x3d\x3b\x4f\x44\xca\x7f\x01\xfe\x20\xa6\xa1\x6e\xe5\x14\x7e\x25\x2b\xa8\x94\xda\xc3\xc0\xd6\x14\x30\x14\x19\xad\x51\x5b\x94\x07\x29\xd2\xa4\xd7\x3c\x66\xe3\xfb\x01\x1c\xc7\x46\x86\xb6\xc7\x04\x45\xa7\xe3\x28\x6a\x88\x00\xcd\x8f\x90\x5f\xed\x5e\x22\xcf\x22\x39\xbc\xbe\xc5\x12\xba\xb0\xc2\x37\xb0\x3f\xc9\xec\x34\x26\x1b\x65\x55\xda\x56\x0f\x3a\x9f\x3d\x5b\x95\xa1\xc2\x17\x0f\x54\x79\xec\xa8\x18\x11\x1e\x25\x8e\x0f\xd8\xa8\x79\xdd\xcf\x5a\x2b\xff\x19\xc0\xe3\x77\xd3\xbf\xf3\x3f\xf9\x27\x9e\xbf\xfa\x57\xfe\xcb\x9f\xff\xa7\xfe\xdc\x7f\xfa\xab\x7f\xea\x17\xfe\x5f\xff\x28\xf9\x1b\xbf\xfa\xaf\xff\x52\xfb\x67\xfe\xf4\x1f\xf9\x13\xff\xc5\x5f\xfa\xbf\xfd\xc1\x0f\x00\x8f\x18\xbb\xa8\xbe\xda\xc2\x8f\xf2\xe9\x3a\x07\xb1\x19\x2b\x79\x9b\xc3\x8e\xab\xbc\x68\xc4\x26\x06\x16\x8c\xec\xfa\x0c\xe9\x9e\xf3\x05\xb5\xd0\x64\x11\xfa\x04\x15\xad\x16\x8b\xc6\xe3\x91\xef\xdd\x09\xf4\x3c\x46\xa9\x23\xa5\x29\x2c\x7c\x29\xd3\x04\xe4\x0d\xd8\xdb\xca\x27\x7c\x02\x06\xbb\x04\x8f\x1a\x7c\xa9\xdb\xdd\x90\x97\xb7\x6b\x1f\x71\x77\x1a\xb3\x3e\x3b\xb3\x2d\x73\x4c\x8c\xd6\x40\xcd\x59\x8f\x92\xe3\x8b\x24\x5c\xf2\x0d\xbc\x05\xe6\xe2\x82\x49\x14\x8b\x0a\xe7\x31\xdc\x69\x95\x22\xd6\xfc\x90\x67\xfa\xf6\xa9\xb9\x47\xb7\x2a\x6d\x63\x57\x7c\x01\x41\x01\xc8\x66\x68\xcf\x61\x38\xe1\x5c\xed\xc8\x9e\x62\x63\x79\xda\x1c\x4f\x90\x9c\x88\xf3\x15\xb7\x11\x47\xee\x44\xba\x4c\x45\xdc\x17\xe0\x4f\xe7\x44\x79\x58\x5e\x03\x80\xbb\x4c\xdb\x57\x99\xe9\x02\x2c\x2f\x73\x5b\xce\x8e\x5f\x23\x81\x42\x9d\x74\x91\x24\x24\xb9\xbe\xec\x0b\x44\xd5\x64\x6d\xed\x1b\x10\x2b\x66\x8c\x77\x19\xff\x9c\xf2\x02\x60\x65\x0e\x4c\x52\x7b\x1c\x1b\xf9\x00\xb3\x8c\xc2\x2a\x33\xd5\xce\xfd\x44\xd8\xd7\xd0\x2c\xb2\xa1\x8d\xe7\x1e\x4c\x3e\xf2\xaa\x07\x18\x37\x44\xda\xc1\x32\x5f\xb5\x13\x51\xda\x55\xb6\x11\x2e\xb0\x40\x24\xfc\xc4\x42\xaf\xbc\x73\xfd\xd0\x17\x64\x45\x47\xa2\xfd\x05\x07\xca\x12\x67\x27\x5b\x79\x04\xf3\xcb\x12\x83\x6b\x22\xe5\x11\x7a\xb8\x30\xe3\x0b\x11\x42\x9e\xa9\xe2\xa7\xb0\x60\x01\x79\x3b\x23\x87\xcf\x38\x57\x42\x92\x06\x9e\x21\xe0\x33\x20\x67\xdd\x43\x9f\xca\x05\xa8\xd1\x26\xf1\x85\x31\x17\x27\xa0\x4c\x14\x62\xaf\xa3\xbd\x1d\x75\x0f\xe3\x0c\x8b\xb4\x97\xab\x52\xa7\x87\xd8\x12\xf9\x6a\x01\x52\x98\x17\x65\x68\x76\x0f\x5f\x44\xad\x13\x9c\x07\x57\x23\xef\x8a\x1d\x4e\x5a\xf5\x06\xe7\x80\xaa\x5c\x1c\x33\x83\xa5\xa9\x9a\x44\x9c\x46\x10\x51\xd8\x43\xe2\x4b\x7e\x11\x2f\x1a\xaf\x20\x9a\xe5\xb0\x54\xe2\x8d\x75\x53\x0d\xf6\x2b\x6a\xcc\xc3\xbc\xcf\xf5\x27\x4f\x4e\xa5\x02\x87\xa0\x03\xa0\x90\x82\x8a\x0f\xa6\x0e\xfc\xed\xef\x15\x43\x4a\xee\x63\xc5\xd8\x5b\x8b\x4c\xf7\x9c\xac\x8a\x80\x61\x96\x6f\x12\x0f\xf6\x98\x83\x4c\x19\x73\xc9\x94\x76\xbe\x50\x49\x10\xe7\xa8\xac\xe1\x99\x6e\xe5\xb1\x73\xea\x44\xb7\x6b\x40\xb6\x33\xe3\x3e\xd8\xd3\x7b\xdc\x8a\x3e\xd4\xb4\x13\x25\xb5\xbc\xf6\x2f\x44\x08\x51\x92\x11\xc7\x40\xb8\x2c\xe8\xe1\x67\xa3\x82\x88\x20\x4b\x94\x2c\xf6\x8b\x0b\xe9\x7b\x24\x8e\x12\x87\x40\xad\x57\x9f\x44\xda\x17\x3c\x13\x68\xb2\xe7\x7a\x8f\xe1\xb9\xaf\xb5\x53\xd7\x39\xf7\xe4\xc1\x97\xde\xba\x98\x3d\x72\xf9\x54\xee\x91\x6c\x61\xcf\x75\x4f\xe0\x13\x3d\x13\xda\xba\x1a\x74\x37\x7d\x3d\x51\xab\xb3\x42\x38\x29\x67\x4b\x25\x37\xe2\x47\x1c\x17\x93\xbd\x64\xa3\x22\xde\xd1\x20\x8f\x05\x7e\xe2\xba\xd0\xda\x73\x87\x67\x60\x72\x4e\xd0\xb0\x74\x47\x1b\x81\x34\xb8\x32\x8d\x6f\x7d\x67\xc3\x45\xe7\x6e\xb4\x09\x4f\x1a\x0d\x3e\xfd\x8b\xfa\x02\x64\x14\x64\x68\xd6\xd0\x4a\xa5\xb4\xbb\x48\xad\x9a\x1e\x49\xda\x73\xc2\x34\xaa\xbd\x6f\xdc\x6a\x2d\x18\x65\x06\xba\xfd\x10\x53\xbf\x50\x06\xc0\xee\xd1\x2a\xf6\xd4\x8f\x6b\x88\xd5\x99\x7c\xeb\x86\xc2\x1c\x5f\x61\xed\x04\x92\xaf\x17\x49\x4a\x17\x1a\x15\x1a\xa9\xe4\x27\xab\x4e\x64\xe6\xda\x74\x76\x6b\x8e\x31\xdf\xb9\x88\xa9\x6d\x9f\x87\x50\x5d\x68\x98\xc7\xf6\xce\xde\xb1\x80\xa4\x47\xd3\x07\xa1\x09\x3e\xf1\x3b\x48\xb8\xdc\x28\x24\x8d\x47\x31\x42\x4d\xeb\x73\x02\x10\x1d\x25\x9a\x04\x6c\x6f\x04\x54\xca\x8a\x31\xbe\x9b\xd1\x76\x7b\x1e\xfc\x0b\xa3\x60\x8a\xc0\x89\x60\xec\x7d\x65\x78\x49\x75\x0c\xd6\xe5\x3a\x77\x03\x3f\x4c\x3d\xcd\xb3\x7d\x07\xdc\xc1\x58\xe8\x4b\xd7\x71\xd8\x4f\x24\xfb\x87\xc6\x16\xa8\x31\x95\x58\x39\x60\x9e\x60\xe2\x25\x9c\x3b\x04\xc4\xc6\xcc\x37\x6d\xe1\x18\x0e\xcf\x1b\x3c\x6b\xc5\xd8\x60\xe5\x17\x8d\xed\x31\xbd\xb7\x8d\x0a\x24\xbe\x21\xfc\x7a\xb1\x57\x7a\x6a\xa5\x02\xf7\xa0\x8f\x64\x1b\x8b\x52\x21\x17\xa4\x0f\x2f\xec\x76\xe4\x0b\x99\x7a\xb6\x31\x93\x95\xe1\x45\xea\x7c\xb4\x09\xa5\x64\x51\xdc\x73\x14\x93\xf5\xa1\xbc\xf1\xb3\xf8\xed\x0d\x0b\x89\xc2\xc9\x97\x0f\xff\x85\xb6\x0b\xbf\xa0\xcf\x87\x4b\x47\x2d\x3b\xc4\x00\xc7\x51\x5a\x53\x01\x8d\x2e\xb4\xac\xa0\xac\x28\xb2\x46\xf2\xd7\x29\xd7\x49\x55\x6b\x80\x2f\x80\x30\x8c\x72\x7e\xa3\xf1\xaa\xab\xd1\xd5\xd9\x49\x8c\x72\xfb\x8b\xd4\x4c\x88\xd2\x05\x1c\xe4\xfc\x75\xaf\xce\x30\x93\x30\xc7\xa2\xe1\x0b\x56\x43\xc4\xd8\x3d\x2b\xcb\x9b\xd7\x9d\x08\x49\xe5\xad\x33\xe7\xdc\x72\x68\x05\x7a\xb9\xd6\x42\x86\x37\x19\x81\x25\xee\xa5\xec\xf9\xc9\x3a\x60\x4b\x50\x69\x3c\x10\x17\xc9\xd5\xa3\x15\x1d\x56\xcf\x6a\x56\x48\xc1\xbe\x1c\x2c\x98\xe2\xbb\x8b\x7b\x2b\x83\xc4\xb4\xcc\x6b\xfb\x62\xa0\xd2\x24\x36\x1d\xad\x06\x18\x46\x83\x25\x59\x8f\x06\x58\x9d\x11\xb7\x9a\x21\x56\x5e\x3d\x76\xd5\xba\x92\x44\x71\xf7\x91\xf6\xfc\x2c\xaa\xc4\xcf\x00\x1e\xff\xef\x3f\xf3\x07\xff\xd8\xbf\xfd\x87\x7f\xfe\x1f\x12\x7f\xe9\x5f\x12\xff\xfe\x2f\xfd\x95\xe3\x2f\xfc\xde\xe7\x8f\xff\xc4\xaf\xf8\xa7\x7e\xdd\xdf\x17\x7e\xed\x4f\xfe\x5d\xbf\xe6\xf7\xfc\xa6\x0f\x34\x3c\x6e\x05\x3c\xe0\x72\xbc\x2f\xe3\xc1\xb7\x3c\xc2\x88\x61\xa3\x4c\x22\xf1\x05\x6b\xb8\xc0\xa9\xb6\x51\x88\xe4\x85\x4d\x9f\x39\xc1\x17\xf2\x7f\xce\x82\x59\x74\x17\xbd\xb1\x1c\x14\xd2\x30\x03\x07\xb1\xeb\xf1\x7d\x77\x0e\xa9\xa3\x8a\x4f\xbe\xd8\xbd\x0e\xf5\xe7\xd5\x75\xc4\x2f\x76\xf2\x71\x78\xee\x12\x64\x0e\xb6\x41\x82\x54\xb4\x6a\xf1\x83\x56\xc4\xfe\x86\x7a\xd3\x82\xe5\x7d\x71\x41\x0d\x59\x66\x41\xf0\x21\xb3\x2f\x9a\xb9\xf6\x4a\xad\x58\x08\xd9\xa3\x14\xc2\x95\x26\x23\x31\xed\x36\x13\x50\xfc\x3c\x72\xb6\xdb\x90\x99\x7c\x07\x00\xde\x65\xc0\x03\xdc\x17\xfb\x83\x0f\x10\x04\x84\x82\x0c\x16\xe4\x59\x6b\x12\x13\x30\xb2\x3d\x21\x5a\x07\xde\x70\x87\xa0\xab\x25\xf0\x26\x4b\x91\xe5\x08\x5f\xf1\x85\x49\x99\x35\xe4\xf6\xb7\x5c\x71\x3d\x39\xcf\xbb\x94\x3c\x29\x48\xc6\x18\xe8\x62\x07\xad\x67\xc8\x48\x6f\x04\x7e\x68\x32\x8c\xb5\x2b\xdf\x2f\x5a\xca\xed\x3a\xdd\xc5\x44\xec\x1f\x97\xca\x73\x89\x8c\xda\x30\x85\x42\x85\x15\xdc\x76\x87\x2c\x68\xd9\x33\xe7\x00\x5d\xf7\x15\xc3\xf8\x02\xef\x07\x47\xbf\x1a\x8b\xc3\x0e\x67\xfd\xbd\xf2\xc2\x9c\x4a\xa2\xa3\x1e\xe5\xd0\x73\xda\xa3\x1c\x31\xc1\x36\xc2\xda\xc3\xf8\x39\xcb\x7d\x41\x0e\xc7\xe7\xc6\xe0\x2f\x82\x2d\x3f\xb6\x65\xc6\xd4\x8b\x1c\x88\x85\xa8\x15\x5b\xaf\xa8\x84\x4a\x11\xa3\x80\xf3\x4b\x61\x88\xec\x7c\xf2\x8b\xb0\xdd\x3c\x1a\xe2\xb9\xad\x3f\x58\x49\x09\xe4\xac\x83\xab\xc5\xef\x30\xde\x04\x6b\xfc\xab\xa5\x16\x6b\x29\x35\x4f\xb1\x48\x88\x2f\xa8\xc8\x69\x74\xff\x1c\xd5\x27\x3d\xe3\xdc\x91\xd0\x4b\xc3\x6c\x6d\x1b\x7b\xd0\xf5\xac\x38\x8b\x1f\x33\x48\xe4\x29\x18\x69\x1e\x76\x3f\x11\x7c\x76\x74\x68\x6f\x8e\xc3\xba\x39\x41\xbc\x0b\xc4\x54\x81\x39\x6a\xac\x1d\x04\xd6\x6c\xc2\xaa\x77\xb6\xe4\x0b\xd3\x02\xb6\x72\x3e\x69\x60\xba\x93\xa5\x3c\xba\x56\x94\x57\x80\x8e\xa9\x7b\x1d\xc5\x66\x88\x97\x00\xeb\x24\xb1\xa9\x0c\x96\xa0\x62\x86\x3a\x19\x91\x34\xe7\x13\x8a\xfa\xfb\xd4\x15\x43\x11\xa6\xbc\xad\xa6\x8a\xc2\x85\x53\x79\x3e\x24\xdc\x70\x41\xee\x5e\x91\xc9\x8c\xe1\xa7\x8d\xc7\x14\x22\xe6\x7c\x61\x2c\x4e\xc8\x10\x45\x68\x3e\xe7\xb3\xd2\x18\x67\x9b\xa6\xc0\x8b\xde\x39\xb6\x96\x00\xbb\xb7\x9f\x2d\x0b\x4d\x85\x25\x09\x2a\x11\xd0\x7d\x01\xbb\xbc\x81\xed\x40\xb6\xb6\x5d\x22\x3d\x4a\xf1\x47\xf2\x46\x88\x78\x3b\x8b\xcf\x4e\x95\x5b\xe4\x14\xc5\x23\xd1\x7c\xee\x21\x81\x7d\x42\x94\xc7\x1a\x16\x17\x14\xdd\xef\x7c\x2e\x1e\xc0\xe0\x42\xeb\x35\x09\x4f\xb5\x4a\xba\x55\xe1\x8b\x1f\xda\x4b\x35\x44\xbe\x50\xe9\x07\x7e\xc1\xf0\x68\x55\x33\x55\xb4\x6c\x94\xbb\xe7\x02\x46\x9f\xf6\xac\xbb\xde\x27\x89\x57\x8e\x27\xcc\xeb\x96\xd4\x2c\x13\xe8\x53\x42\x0d\xe0\x2f\xec\x8a\x99\xf7\x28\x11\xaa\x70\xec\xb6\x9e\x51\xd7\xeb\x01\x88\x90\x86\x1e\xf2\xd3\xae\xac\x35\x24\x27\xe6\x5c\x64\xe6\xc8\x00\x8c\xe9\x13\x5a\xb6\xef\x95\x21\x2f\x1c\xae\xb7\x86\x23\x33\x0c\xf7\x1e\x16\x50\xae\x16\x2d\x0d\x3b\x1f\x6e\x57\xe4\xe0\x82\xc0\xa1\x76\xee\x2b\xbe\x10\xea\x7c\x15\x1c\x42\x5a\xff\x36\x50\x08\xde\x79\x3f\xed\x94\x9d\xca\xc3\x43\xaa\x9c\x79\xed\x80\xe3\x6e\x06\x48\x94\xbb\xed\xb0\x8f\x96\x55\x4f\x2f\x0f\x7e\x17\xdd\x91\x4a\xef\x85\x9e\xf1\xf8\xf0\xa8\x17\x44\x84\x48\x03\x98\x27\x1a\x38\x31\x47\xc4\xa0\x72\x2d\x27\x7c\xf0\x52\x79\x46\xe7\x8d\x73\x3b\x0b\x84\x86\xbe\xdb\xc8\x59\xc7\xab\x25\x45\xec\x5b\x32\xe8\xd9\xbe\xe6\x31\xcb\xd2\x7c\x8a\x53\xa2\x94\x2f\x8c\x82\x39\xde\xab\x1e\x04\xa0\x23\x8b\x0e\xca\x3a\xe6\x05\xa8\xd5\xd9\x60\xfa\x9e\x07\x01\xa8\x22\x20\x4c\xb9\x67\xf5\x3d\x49\xa9\xf4\x93\x2a\x67\x80\x42\x96\x48\x93\x5d\x3a\x8f\x77\xd1\xd9\xf6\x56\xe4\x5f\x33\xdb\x1b\xfc\x1b\xf7\x7c\xb5\x77\x77\xc9\x91\x92\xbe\xda\xbf\xe2\x8b\xa8\x25\x01\x95\x99\x76\x1c\x2f\x2e\x3c\x03\x2e\x5f\xe6\x5a\x16\xd6\x23\xc2\xcb\xbc\xd6\xba\xeb\xf3\x18\x7b\x97\xfb\x76\x64\x9a\xf9\x24\xb3\x53\x72\x0f\x8c\x83\x05\x26\x05\x0a\xab\xba\xa9\xf7\x02\x62\x69\x9b\x70\x7e\xb1\x4c\x6b\x41\x00\x2f\x4f\x2d\x74\x6b\x85\xbb\x9f\x38\x5c\x41\x4c\xaf\x63\x13\x9b\x80\xee\x38\x76\x3d\xba\xe2\x40\x4f\x81\x0b\x3d\x10\x60\x3d\x73\x53\xac\xcd\xee\xc2\x9d\xa4\x1b\xfc\x7e\x21\xd9\xcf\x18\x08\xb6\xa1\xe5\x60\x60\x64\x30\xa1\x1f\xb6\x8e\xd8\x38\x51\xc9\x77\x98\xed\xc8\xf9\xdc\x14\x3b\x35\x87\xfa\x1a\x23\xb9\x9f\xb0\xef\x53\x4a\xec\x2d\x06\x97\x0b\xef\xf3\xb8\x5e\x1f\x84\x17\xf2\xd8\x2a\x1f\xc3\x46\xd6\x8d\xdc\x2b\x1c\x28\x52\xdf\xa6\xee\x13\x7e\xa2\xaf\xc8\x48\xb4\xf5\xee\x95\x1f\x74\xa7\x0b\xe5\x70\x8f\xe9\x20\xcf\x92\x9d\x3f\x73\xf0\x76\xde\x0d\x29\x4b\x23\x34\xf0\x43\x21\x0a\xdd\x17\x30\xad\xed\xc6\xed\x60\x4a\xc0\xda\xa1\x57\x05\xcc\xc1\x3d\x83\x95\xc1\xf1\x9e\x7b\xf8\x0c\xbd\x0f\xa7\x1d\xdd\x3a\x0e\x23\xb5\xc8\xea\xcf\x01\x3c\x7e\xde\x6f\xfb\x3f\xfd\xd7\x7f\xef\x5f\xfa\x47\x7e\xd1\x6f\xf9\x0b\xff\xf1\xbf\xf2\xef\xe9\x7f\xfa\x8f\xfe\xb2\xdf\xf5\xdf\xfe\xda\x9f\xfa\x09\xff\x8b\x7f\xab\xf8\xfd\xff\xf7\x5f\x7c\x7f\xf9\xff\xeb\x7f\x1f\xe0\x61\x7e\xd5\xff\xe1\x2f\xfe\x5c\xc0\xe3\x0d\x06\x90\x44\x72\x67\xbd\x38\xaa\xfa\x7e\xde\x27\xac\xcd\xf4\x4c\xaa\x0a\x89\x08\x7a\x1e\x66\xaf\x8e\x2d\xf2\x6b\x18\x0a\x3f\x3d\x75\xf8\x37\x7e\xfd\xff\xd6\xcb\xfb\x9b\x9e\x02\x1f\x32\x62\xab\xa0\x09\x48\x69\xa8\xd9\x3d\x78\x21\xab\x3d\x61\x85\x7b\x8e\xea\xec\xce\xff\xf0\xea\x42\x11\x35\x51\x60\xc3\x01\x1f\x9c\x42\x06\xe7\x6d\xf5\x35\xf9\x25\x9d\x98\x6d\x01\x0c\x03\xfd\xe1\x83\x9a\x14\x12\xb9\xd2\x30\xb2\xe8\xfb\x8c\x91\x4a\x28\x29\xbb\x1f\xad\x2e\xfc\x78\x4f\xc1\x7a\x3f\x44\x73\xa7\xbc\x7e\x06\x04\x9d\xdd\xd2\x7f\x48\x76\xeb\x00\x22\x45\x7f\x46\xa5\x13\x20\x64\xb7\xef\x95\x17\x6e\xf3\xfe\xd1\x24\xff\xc7\x7c\x17\x2a\x30\x1a\x4c\x19\x72\x3a\x26\x8c\x7c\x78\x58\x2e\x8b\xd5\x0b\x5a\x52\x14\xe3\x24\x54\x17\x23\x56\x38\x8a\x97\x56\x3b\xda\x8f\x0c\xdb\x7e\xcc\x77\x41\xb3\x7f\x9e\x69\x92\x4d\x40\x40\xf4\x66\xd7\x5c\x2b\x32\xb0\xb2\x5f\xea\x7e\xf8\xd7\xcf\x71\xbb\xef\x82\x85\x6e\xd7\x74\x76\xe1\xf3\xc1\x29\x0e\x99\xb4\xeb\xb9\x99\xea\xf3\x9d\x0e\x5b\x10\xea\x8d\xa2\xa7\x1e\x9d\x7d\xa9\x63\x0b\xa8\xb5\xea\x4d\x66\xf3\x8c\xef\x91\x3f\x12\x15\xfb\x31\xff\x22\x4e\x9c\x27\x9c\x05\x2e\xd6\xe2\xd5\xc2\x9d\xfd\x24\x28\xc5\x98\xda\x49\xc0\x70\x3c\x40\x82\xa2\xa3\x5c\xce\x6a\x5a\x9c\x2e\xec\x8b\x37\xb2\x00\x11\xba\x3b\xcf\x71\x78\x64\x6f\x65\x17\xbd\xc1\x4c\xd8\x0f\xcb\x41\x14\xd4\xce\x97\x11\x94\x42\x98\x26\x24\xb8\x69\xfb\xd1\xd4\xe1\xc7\xfd\x8b\x70\xdf\x44\xc5\xd7\x62\xe2\xeb\x68\x4b\x29\xdb\x4c\x6f\x05\x32\x3c\x83\xa4\x79\x0b\xa7\xdb\xba\x63\x97\xd8\x7c\x09\x09\x5e\xf8\xc1\x29\x30\x07\x12\x4e\xfa\x60\x86\x13\xe4\xf0\x42\x00\x90\x8d\x85\x15\x71\x7c\x3b\x45\x57\x73\x18\x5d\x41\xbc\xa9\x1a\xbe\xd3\xf3\x8a\x0f\x4e\xc1\x0f\x19\xec\x65\x93\x58\x3f\x83\xe7\x0f\x5a\xb4\x0b\xfc\x28\xb9\x26\xa6\xc6\x4c\x61\x4e\xb0\x29\x74\x69\xc7\x23\x1a\x49\xa4\xfe\x48\x54\xec\xc7\x7c\x0a\x4d\x49\x61\xce\xea\xc2\xf3\x1b\x39\x13\x45\x2a\xa8\xeb\x05\xf4\x32\x99\x93\xc7\x6d\xe2\x4a\x48\xb3\x11\x13\x77\x58\x5e\x35\xca\x0f\x4e\x31\x4d\xa8\x83\x97\x67\xcd\x4d\x80\x85\xe8\xcc\xc3\x00\xcb\x3e\x89\xe3\x1f\xbf\x9e\xa4\x31\x2c\x50\x03\x88\xf9\xb3\x0f\x31\x0e\x7c\xf1\x5d\x84\xfe\xa0\x7e\xd2\xa8\xb4\xfc\xf0\x5f\x9a\xab\xc3\x46\xf7\x36\xad\x28\xc0\x4a\x75\x31\x54\xd9\x76\x8d\xd9\xc9\x12\x7a\x1f\xeb\xe2\x07\xa7\x98\x04\x42\x52\x10\x18\x11\xda\xe4\xac\x3a\xb1\x67\x62\x65\x0b\xba\x6f\x83\xd4\x33\xe0\xb6\x2b\xf3\x17\x50\x35\xae\x3d\x6f\xe8\x1f\x7c\x17\x8c\x8a\xce\x39\xc6\x3d\xd6\x13\xa6\x98\x53\x70\x94\x4a\xf3\x96\xf4\x7b\x1f\x5a\x68\xf4\x5b\xbb\x63\x88\x2c\xd3\xa3\x89\x4c\xfd\x11\x09\xf8\xc7\x9d\xd9\x75\x7c\x93\xe6\x4f\x2c\x12\x1c\x60\xab\x2c\xb6\x13\x42\x94\xb7\x02\x12\x49\xf8\x23\x56\x58\x5d\xf4\xd9\xf0\x8e\x06\x54\x0d\xbf\xc8\xec\x06\x59\xb2\x95\x7a\x53\xf3\xc2\x27\xc1\xe6\xdc\xce\x34\x3b\xc6\x01\x8f\x9c\xea\xce\xf6\xe0\xf5\x34\xef\x87\x82\x03\xef\xbe\x7f\x64\xfc\xf9\x63\xbe\x8b\xe4\x33\xda\x3d\x9a\x46\x48\x78\xe3\xac\xaf\x38\x92\x71\xcd\xa4\xab\x37\xe0\x9e\x50\x12\xaf\xc6\xb4\x1b\x4f\x09\x4f\x1d\x91\xfb\x45\x1e\xd9\x4e\xd6\xc9\xc9\x1a\x0c\x0d\x9b\x73\xc2\x18\xf0\xfe\x4e\x19\xea\x04\xa4\xbf\x72\x5e\xd3\x4e\x75\x8c\xe7\x61\x71\xb4\x97\x49\xfb\xc5\x4b\x75\x71\xb3\xbb\xc1\xb1\x18\xda\xa5\x79\x89\xe4\xea\x4d\xc9\x2d\x08\x0d\xae\xc4\xec\x89\x0e\xaa\xc6\xc2\xdd\xbf\xe6\x3d\x8c\x7d\x10\xb5\x58\xa4\x73\x13\x76\x09\x0c\x4f\x03\x8b\x7b\xdb\x5f\x82\x08\xa0\xfe\x5a\x59\xe2\xda\xe6\x8e\xb9\xb0\x11\x18\xa4\xd3\x94\xe8\x8a\x7f\x50\xf1\x31\xf9\xb2\x4a\x01\xd4\x39\x15\x39\xe2\xbb\xb0\xfb\xa1\x8d\xbe\x70\xad\x13\xfd\xed\x29\x1f\x10\x49\xc3\x3b\xb9\x32\xd4\x6e\xcd\xdf\x0f\x3a\x01\x86\xb0\x59\xc0\x82\xd7\xbd\xda\x09\xcf\xa9\x10\x36\xf6\x81\xb4\x12\xa8\x2f\x4a\x36\x08\x85\x31\x40\x34\x43\xaf\x52\x41\xaa\x76\xbe\xe8\x47\xa0\x82\xa7\x65\x1d\x97\xba\xd2\xbf\xbc\xb8\xc1\x26\xab\x4a\x58\x28\x38\xc5\xe7\x45\x4a\x04\xa9\xa7\x8f\x9b\x3a\xf0\xdc\x1a\x9e\x2f\xea\xce\x35\x5f\x17\x55\x7a\x93\xe3\x2c\xd0\xec\x83\xa7\xe8\x5a\x27\x85\x5e\xb0\x1b\x65\xd5\x42\xad\x06\x66\x89\x81\xf7\x98\xe6\x8f\xfb\xe2\x8d\x94\x48\x87\xa7\x27\xbd\xa2\xa7\x5d\xdf\xd7\x4e\xdb\x7a\xb0\x15\x12\x78\xdc\xb4\x91\xbe\x8f\x0a\xd1\x56\xab\xa8\x47\x70\x35\xd4\x3f\xe8\x04\x38\x07\x38\x72\x57\x96\x47\xfa\xa0\xf9\xd2\x00\x26\xdd\xe6\x10\xad\xa4\x74\x44\xd7\x17\x0f\xf2\xb8\xb0\xf7\x8c\xf5\xb4\xc5\xc2\xf3\x41\xec\x64\x04\x29\x17\xef\x56\x81\x0a\x2f\x5b\x6a\xbd\x30\x2c\xdf\x40\x4e\x91\x72\x1a\x47\x80\x78\xe7\x8e\x2b\x8b\x27\x59\x3c\x64\xf4\xad\x7c\x70\x8a\xed\xc4\x16\xe8\xbc\x41\xf9\xa3\x08\x6d\xce\x16\xa2\x5e\x98\xd2\x28\x38\xea\x7d\x98\x99\x24\x14\x93\x0d\xb8\x49\x51\x6f\xeb\xfd\xe2\xbb\xb8\x09\x77\xaa\x55\x7e\x52\x2e\xf7\x28\xf4\xe0\xa0\x96\x48\x67\x34\xca\x31\xf1\xe8\x1e\x48\x35\x4a\xa8\x8e\x01\x07\x10\x02\x8b\xff\x35\x76\xfe\x0c\xe0\xf1\xcf\xfe\xe5\xff\xc7\x9f\xfb\xa9\x3f\xf0\x3b\xfe\xca\x9f\xff\x6f\x7e\xfe\x9f\xfa\xff\xff\xae\x5f\xfa\xd7\x7f\xf7\x9f\xfd\xe7\xff\xf8\x5f\xfb\xe5\xbf\xff\xa7\x7e\xd9\xef\xfc\xbb\x7f\xfb\x5f\xab\x7f\xf1\x7e\x00\x78\x68\x62\x88\x53\x70\xdb\xf7\x74\xb8\x90\xd7\xd2\x34\x33\xf9\x51\x41\x23\x7c\x1b\x2a\x62\x43\xd1\x39\x40\x9b\x81\x6e\xd8\x2d\xe0\x7e\xf1\xa8\x4a\xde\x9e\xa3\x2b\xc7\xb1\x23\x44\xe5\x5a\xc6\x26\x6a\xbf\x10\xaa\xcc\xc3\xd7\x58\xaf\xf8\x03\x9f\xd3\xe5\x7e\xd3\x4f\xaf\x82\x7f\x01\x35\x9c\x5d\x86\x63\x5d\x90\x4d\x21\x2d\x0d\x6a\x42\xb0\x64\x14\x71\x46\xdc\x8a\x07\xf9\x9b\x72\x9f\xd0\x72\xcc\x27\x5a\xc4\x89\x0f\xca\x22\x5e\x17\xaa\x23\x25\x1d\x30\xa5\x08\xb1\x2a\x10\x1c\xd1\xa2\x16\xdf\x51\x9e\x62\xc9\x5b\xb8\xd5\xd7\x79\xc2\x2d\x68\xb4\x6c\x26\xd4\x07\xa7\x88\xe2\x32\x51\x44\xbd\xc5\x82\xa9\xeb\x7d\x1e\x99\x5f\x09\xf5\x39\x9b\x17\x70\x01\x51\xaa\x2f\x62\x0d\x44\x0d\xfa\x5d\xb4\xf8\xe2\x2e\x18\xa5\x39\x70\xb6\x8b\x7f\xc2\x1d\x10\x17\xda\x03\xc0\xa5\x61\xef\x85\x12\xcf\x03\xf6\xd6\x99\x63\xd3\x13\x6d\xa3\x09\xc3\x2a\xfb\xa0\xbd\xe6\xe5\x5c\x4f\x01\xb3\x81\xbc\x22\x5e\x01\x6b\x74\xe5\x79\xfb\xc9\xf3\x8a\xdc\x5f\x4d\x7a\x43\x77\x46\x84\x22\x90\x05\x26\xe3\xcf\x17\x80\x47\xfd\x21\x78\x80\x25\x5e\xae\x2b\xd7\xa6\xa4\xc9\x8e\x19\x21\x3f\x51\xd6\x87\xb7\xf5\x02\xfd\x38\xfd\x64\x9f\x1b\x15\x88\x80\x76\xdd\x07\xa7\xe8\xa9\x09\x7c\xf3\x68\x3d\xd0\xca\x96\x17\xa1\x6d\x69\x69\x0e\x22\x1b\xac\x8b\x8a\x19\xa9\xf7\xb4\x61\x0c\x84\xe4\x0d\x60\x88\x0f\x5e\x2a\x1f\xc1\x3c\x85\xea\xc2\x61\x6d\xd0\xcf\xf1\x3e\x4e\x49\xad\x59\x08\x56\x61\x60\x9f\x32\x6d\xf2\x25\xa3\x83\xed\xeb\xce\x0b\x40\xfb\xa2\xbd\xce\x6b\x3c\x91\x2b\x98\x0b\x51\x4f\xdf\xe2\x1d\x85\x9e\x97\x0b\x2b\x73\x0c\x10\x42\x45\x75\xbe\xdb\x1d\x70\x33\x79\x9d\x8b\x22\x7c\x71\x17\x89\x24\xb2\x1a\x43\x10\xa7\x01\x2e\xac\xcf\xca\x38\x66\xfa\xdc\xd1\x69\xed\xc8\xe6\x5a\x04\xa2\x78\xb3\x35\xc8\xa3\x65\xf5\xed\x83\x08\xce\xd7\xe3\x7d\x45\x27\x9a\x95\xb0\x07\x74\xbc\x05\x99\x83\x27\x62\x6d\xb7\x37\x6a\x29\x82\xf6\x03\x6f\x7e\x89\x0c\x5c\x01\xe2\xc5\x17\xa7\x78\xcb\xd1\x6c\xd0\x7e\xaa\x28\x22\x8c\x7e\x4f\x1f\x6e\x47\x95\x55\xb7\xae\x0b\xc3\x6d\x4c\xc6\xbc\x89\x5f\xc5\xa1\xe8\xf3\x09\x5f\xc0\xb4\x88\x06\x4c\x98\xff\x21\x99\x95\x45\xc3\x64\x62\xee\x1f\xf2\x49\xd2\x80\x96\xf3\xf4\x69\x9b\x24\xea\x25\x6e\x58\xf0\xf0\x2e\xcd\x8f\xa4\xcd\x7e\xcc\x77\xd1\x00\x2f\x95\xa9\xd0\x60\x5a\x47\x22\x1a\x0f\x89\x02\xd1\xfe\x3e\xa1\xc1\x87\xbd\x2c\xa2\xf0\xe4\x45\x55\x63\x87\x96\x61\x98\xf8\x22\x76\x72\x0b\xf9\x4b\x60\xb0\x8f\x67\x22\x68\x3c\x0b\xaa\x75\x14\xf9\xe0\x26\xa5\xa6\x91\x6b\xd5\xae\x5b\x01\x0e\xd1\x03\x40\x72\xf8\x2f\x5a\xca\x84\x51\x46\x7c\x63\x59\x39\xbf\x65\xea\x37\xcb\xc6\x9c\x03\x46\x1b\xcf\x1c\x9c\xc7\xc7\xf9\xe6\x4a\x3d\x78\xa0\x2f\x55\x6e\xf6\x01\x04\xc5\x3d\xe8\xe6\x2e\x09\x33\x21\xca\x64\xaa\xfb\xf2\x90\x86\x8c\xfc\x4f\x03\xe8\x3b\x28\x64\x30\x71\xc6\x2a\x60\x87\x0f\x22\x9d\x58\xbf\x00\xce\xa7\x19\x2f\x29\x88\x5f\x5b\x89\xc3\xf2\x1d\x15\xd1\x40\x0c\x05\xe0\x08\xc0\xe1\x84\x0a\x51\x0a\x0c\x2f\x15\x90\xf2\x6a\xea\x3e\xc9\x66\x9d\xac\x2b\x00\x7b\x1d\x10\xce\x71\x30\x1e\x26\x0e\x14\x41\x5c\xc2\xbb\x7b\x29\x84\x9e\x51\x46\x14\x85\x0c\xbe\x22\x97\xf0\x7c\x31\xd6\xe9\x0f\x79\xdf\xfc\xb6\xee\x9e\xf9\xf0\x4b\xf9\x51\x09\x6b\xb9\xb7\xec\x7a\x83\xc8\x81\x7c\xd5\xd0\x76\x5f\x25\xc9\x7a\x28\x15\x9f\x54\xbf\x0f\x59\x01\x63\x77\xfa\x12\x90\xd6\xed\x51\xed\x3d\xaf\xc8\xde\xeb\x3d\xaf\xdd\xa4\x37\xb6\xe4\x43\x75\x3e\xf8\xf6\x14\x9f\xbe\xa8\x72\x18\x5f\xe0\x45\xc9\x1c\xfa\xc6\x36\x96\x20\x46\x4d\x56\x48\x1c\x8e\xeb\xad\xcb\x64\x0f\xb8\x77\xa7\x0c\x5d\x33\x89\x1a\xe2\x10\xf8\x02\x38\x57\xb8\x3e\x7c\x41\x89\x9d\x64\xb9\x3e\x01\x5e\xc0\x45\x4d\x00\x9d\x95\x4d\xd8\xd4\xc3\x5a\xdf\x5b\x47\x39\xdc\x6a\xb7\xea\xfd\x91\xf1\xe7\x8f\xf9\x14\x42\x9b\x13\x5d\x7b\xd0\x59\x64\x44\x70\x93\xab\x8f\x88\x55\xb0\x5d\x97\x4f\x2d\xe5\x7b\x75\x63\x10\xc2\xbe\x79\xc9\xab\xc8\xf1\x41\x0d\xce\x70\xb3\x39\x34\x1a\x92\x46\x60\x1f\xba\xde\x04\xf8\x72\x76\x37\x34\x4c\x14\x89\xde\x95\x37\xb2\xe8\xa9\x18\x74\x3c\x23\xdc\x32\x7c\x11\x3b\x47\xb3\x7c\x5b\xa8\x2b\xf6\xc7\x12\x76\x60\xdf\x74\x3f\x78\xd3\xa7\x54\xc8\x3c\xea\x5a\xed\x93\x88\x14\x8a\x98\xe6\x58\xf3\x5f\x54\x39\xc4\x9a\x3a\xdb\x43\x2d\xa4\x2c\x16\xfc\x90\xec\xa9\x18\x8a\xa6\x60\x6c\xda\x27\xbd\x0f\xd6\xb8\x12\x74\x6b\xf6\x54\x9f\xfa\x4a\xff\x45\xbc\x38\x7b\x17\x48\x7c\x7a\xd5\x28\xef\x8e\x09\x65\x7c\xdc\x55\x27\x6d\x66\xc2\x4b\x64\xa8\x43\xf4\xe9\x14\x1f\x7a\xa1\x29\x96\x18\x5f\x7c\x17\x42\x82\x30\x89\x00\xfa\xd6\x26\x63\xd3\xb4\x5b\x58\x82\x58\x80\xe5\xb0\x0d\xa1\x10\x8e\xa3\x0b\x04\x7a\xd5\x64\xc0\xeb\xc6\x07\x77\xc1\x78\x0e\x82\x35\xa4\x16\x3f\x11\x04\x2a\x2e\xa4\xac\x68\x3f\x9f\x03\xdc\x69\x7c\x5c\xa4\x3b\x57\x3e\x2b\x0c\x09\x1c\x6c\xc6\x43\x7f\x0e\xe0\xf1\x2f\xfe\x9a\xbf\xf1\xeb\xff\xf2\x2f\xfc\xcf\xfe\x19\xf7\xdb\xff\xf0\x2f\xf8\xfb\x7f\xd7\xff\xf9\x17\xff\xc6\x7f\xe8\x77\xff\x6d\xbf\xef\xbf\xfa\x63\xbf\xf9\x0f\xfd\x8e\x3f\xfd\xa7\xde\x7f\xf4\x4f\xfe\x8f\x3f\x7e\xc0\x83\x2d\xea\xaf\x63\x02\x1b\x56\x65\xa7\x78\x86\xfb\xa6\xb6\x9e\x33\x19\x5f\xf8\x19\xa8\x15\x13\xc3\x3d\xfa\xc4\x08\x80\x22\xf0\x8e\x2f\x0a\x12\xab\x36\x3e\xe9\x65\xe9\x80\xec\xb5\x64\x6e\x35\x13\xb7\x47\x53\x3e\xac\x74\x7f\x10\x09\x64\x36\xa9\x78\x25\x5c\x47\xaa\xf1\xf3\x45\xe2\x11\xd5\x6c\xcf\x75\xe7\xb7\xe5\x09\x97\xa7\x08\x78\x93\xec\x7b\xf2\x02\x62\x90\xd9\x40\x4c\xfe\x5e\x86\xd9\x26\xa0\xe1\x6e\xe3\x17\x1f\x12\x81\x08\x37\x17\xd4\xe5\x0b\x66\x8b\x49\xe7\xe8\x69\x2b\x1b\x06\x41\x31\x7b\x2a\x0a\x81\x31\xaf\xda\x2b\x3c\x7c\xc9\xca\xcc\xf8\x02\x6a\xd8\xd0\xf3\x1d\x82\x48\x6d\x49\xa6\x60\xde\x4f\xc0\xec\x8d\x44\xf3\x07\x2f\x7d\x2d\xba\xd1\x67\x4d\x6e\x13\xe3\x4c\xfc\x74\x04\x3e\x68\xaf\x59\x7e\xf2\x54\x33\xbe\xe1\x95\xfb\xf4\xcc\x4f\x27\x5d\xe9\x34\x4a\x7c\x84\x73\xf6\x3e\x29\xa0\xa9\x39\xf7\x7d\xcc\x56\x94\x8b\xcf\x07\xe9\x8f\xd1\x2e\x49\xaa\xc5\x1d\x90\x72\x49\x85\x25\xc0\x35\x8e\x01\xe4\x61\x03\xd0\xa6\x41\x45\x1e\xa8\xd8\x8c\x58\xeb\x5e\x99\xdd\xf1\x0b\x38\x4e\xd8\x07\xfb\xde\xeb\xc5\x7b\x4f\x5c\x72\x9b\x36\x5d\x5e\x89\x27\xcf\x59\xee\x00\x4f\xea\xfb\xbe\x19\xe0\x3c\x56\x23\x7e\x78\xf6\x45\xb0\x1d\x5c\xd6\x5d\x3c\xc1\xef\x9d\x4c\xc6\x07\xd2\x1e\xd8\x74\xda\x86\xd2\x42\xe0\x26\x8b\xac\x83\x0a\x72\xec\x54\xfb\x63\x27\x8e\x5f\x4c\xaf\x51\xa4\x14\x28\x5d\xb9\x7c\x42\xf2\xd7\xf2\x32\x42\xb1\xf7\x7d\xb8\xea\xee\xd1\x91\xbe\x87\x60\x42\x08\x37\xa8\x5a\x51\xf3\x04\x5f\xcc\xc4\x72\x83\x63\x46\xb0\xde\x24\x0c\x46\x80\x3f\x8f\x33\x41\xb9\x04\xcc\x7e\xb6\x46\x94\x0f\xca\x7c\x87\x22\xe1\x40\x27\x4b\xa9\xf3\x0f\xf0\x7e\xae\x9b\xfc\x5f\x68\xfb\xd7\xd7\x0f\xbf\x30\x2d\x14\x0a\x4d\x12\x5f\x64\x30\x03\x13\x38\xbe\xc8\x7c\x61\xa9\x18\xeb\x88\x90\x88\x87\x8a\xa2\xd0\x17\x16\x1d\x08\x5d\xe7\xf3\x7a\xd6\x79\x3d\x6b\x51\x51\x56\x16\x11\x38\x45\x67\x14\xa9\x18\xc1\x9a\x28\x51\x82\xc8\x74\xa2\xd3\x88\x22\x13\x5b\xf6\xf6\xac\xc8\x46\xb6\xec\xbd\xd9\xa2\x8c\xc3\x06\x37\x7b\xf3\x9b\xbd\x07\x06\xe6\xad\xcf\x7f\xf0\xe5\xfb\x59\xcf\x7d\xdf\xd7\x75\x5f\xd7\x75\xaf\xc6\x97\x8d\x8c\x09\xb7\x55\xb5\x5c\x13\x75\x27\x09\xc8\xca\x07\xc6\x1a\xfc\x99\xb4\x10\xcf\x1b\x61\x59\x4b\xa6\xfe\x5d\xa1\xfc\x3f\x6f\xbe\x5f\x3b\x0b\x10\xb5\xaa\x89\xc6\x6b\x25\x9e\xe4\xf3\x70\x62\x16\xda\x8f\x79\xb2\x95\x8f\x82\xcb\xe9\x1e\xde\x12\x49\x2e\x2e\x7d\x31\x9c\x71\x33\x10\xdf\x08\x71\xb2\x58\x4e\x7e\xd6\x32\x55\x36\x9b\x42\x1e\xbd\x37\x81\x64\x0e\x55\xb9\x4f\x18\x07\xf6\x9d\xdc\x4b\x08\xcb\x5f\x0c\x24\x70\x92\xf2\x3e\xc2\x2f\xa3\x0c\x06\x90\x62\x16\x52\xb0\x5a\xbf\x1c\xae\xed\x59\x7f\xb3\x1f\xb4\x38\x6f\xcc\x60\xc0\x0b\xf1\xc5\x7e\x90\x07\xc9\x06\xec\xc0\x72\xe7\xb4\x0c\xa2\x21\xec\xe1\xd1\xd2\x1a\x2c\x7f\xf8\x7d\x24\xbd\x40\x17\x45\x33\x3f\x8e\x13\x64\x96\x62\xf3\x0b\xed\xa6\x68\x43\x73\x82\x84\x6a\xd3\xe7\xc5\xdc\x4a\x6d\x9d\xa5\x1d\x08\xef\x19\x1c\xa1\xec\x1f\x09\x72\xd5\x95\x03\x0f\x18\xb3\xe7\x8b\x71\x59\xe9\x28\xb0\xc0\x35\x3e\xd6\x85\x8a\x18\x23\x73\xc9\x7c\x7a\x7e\x22\x0d\x89\x34\x9a\xf7\xf9\xe1\xd7\x78\x23\xc8\x10\x72\x1e\xf9\x17\xd0\x81\xb3\x18\x19\xe5\x78\x00\x44\x99\x1a\x2f\x37\x88\x86\x90\x16\x46\x0a\x7a\x82\x29\xae\x5a\xcd\x96\x2f\x10\xe3\xbd\x02\xf0\xfd\x85\x0a\x8a\x91\x27\xb0\xca\x16\xf7\xad\xea\xfc\x82\x06\xed\xb6\xec\x85\x11\x9c\x04\x37\x34\xd6\x2c\x85\xa9\x4e\xb7\xba\x82\x6f\x44\xca\x84\xf7\x0b\x82\x34\x94\xda\x57\x2e\xb0\x99\xb7\x99\xab\x98\x0f\x76\x28\xa1\xab\x34\xb5\x62\xb9\xc1\xb5\x33\x53\xf9\x42\xc2\x2f\xac\x66\x3f\x9f\xbc\x0b\x2a\x4f\x1f\x5d\xe1\x45\xc6\x58\xe9\xee\x2e\x94\x89\xb5\x6c\x43\x52\x4e\xe8\x8d\x67\x76\xd4\xe6\xbb\xad\x02\xf4\x5a\x5c\x0b\xf8\x62\xc5\xb5\x19\xae\x47\x90\x97\x97\x6a\xd4\xd2\x02\x30\xa3\x2d\x09\x06\x44\xb2\x5e\xac\x86\xb1\xc6\x29\xa7\x88\x5d\x26\x7b\xa1\x09\x8b\x5f\x68\x2b\xb6\xd8\xef\xb3\x01\xbf\x90\xb6\xfc\xa4\x63\x38\x83\x0f\x57\x18\xe5\x20\x8e\x9f\xa2\xcf\xd3\x65\x6b\xba\x83\xb4\xdf\x4a\xb9\x3a\x5f\x68\xb1\x10\x8c\x36\x30\xcb\xca\x6a\xf5\x01\xc8\x26\xb1\x93\x09\x2e\x2d\xfe\x58\x18\x44\x9f\x77\x2d\xb4\xe4\x14\xe5\x79\xc7\x74\x59\xb9\x0f\xaa\x16\xf3\x12\x33\x70\xc9\x61\x03\x25\x71\xcc\xf6\xb0\xf9\x69\x40\x2e\xc8\x97\x46\x70\x0b\x08\x1e\xa0\x19\x37\xe3\x75\x74\xa5\x8c\xdc\x07\xd4\x24\x23\xe0\xa8\xde\xb2\x73\xdd\xf2\xa7\x5f\x21\xca\xac\x60\x06\x7f\xd5\x8e\xc5\x48\x3b\xc3\x5b\x96\xab\x0c\x3d\x72\x96\xf4\x96\x0e\xbf\x00\xf9\x74\x16\x88\x65\x21\x7d\x52\x6e\x8b\x79\x91\x9f\xc4\x91\x77\x91\xc7\x1c\x57\xb8\x59\x4e\xaa\xe5\x2f\x28\xf4\x3d\xc2\x92\x2a\xbe\x50\x41\x71\x5a\x78\xd9\x49\xe9\xdb\x5a\xc2\x33\xc4\x17\x3d\x98\x6d\xf7\xbe\xa0\x3c\x5d\xae\x02\x61\xd4\xdb\x4b\x67\xec\x06\x1c\xec\x93\xbf\x50\x16\x73\x24\x5d\xf3\xbd\x1f\x7f\xbd\x93\x4f\xa3\x5c\xf1\xae\x6b\xab\x82\xca\x0c\x8a\x3b\x55\xe2\x6e\xf6\x3d\x94\x56\x69\x68\x1e\xa2\x7d\x81\x8a\xf0\x41\x70\xf3\x2a\x28\x70\x89\x7b\xad\x18\x3e\x07\xf3\xfa\x94\x1c\xb5\x48\xe1\x8d\x1a\xb8\x9a\xa8\x0c\x21\xda\x1b\x56\xa3\xfe\x8b\xff\xc5\x29\xb9\xea\xd4\x6a\xb4\x31\xed\x44\xde\x87\x06\x6e\xc8\x1a\x10\xe2\xb7\x7a\x94\x43\x90\xba\xfb\xe5\x09\x71\x05\x98\x2a\xa9\x0f\xbf\x8c\xf0\xe0\x7f\x62\xff\x8b\x3f\xf7\xb7\xcc\x7f\xf5\xbf\xfd\x73\xff\x81\x7f\xfd\xb7\xfe\xe9\xbf\xf3\x5b\x7f\xc7\xcf\xfc\xc4\xbf\xf6\xc7\xb8\x7a\xfe\xf8\x8f\xfe\xb3\xff\xf3\x1f\xf0\x6f\xf9\x40\xe1\x61\x46\xa0\xad\x93\x68\xeb\xb0\x75\x37\x7a\x82\x07\x2d\xaf\x77\x43\x82\x63\x8f\x3e\xe9\x42\xe7\xbb\xa4\x8b\x13\x4d\x7c\x39\x68\x1f\xc0\x28\xfe\xb0\xf1\x58\x11\x06\xfe\xa1\xf7\xf9\x28\x3d\xd8\x54\x30\x85\x48\x7f\x67\x2d\xa7\x6b\xb1\xfb\x2a\x2d\xe4\x3d\x87\x0b\xb4\x40\xf6\x05\x74\x60\x08\x41\xd7\x6f\xe7\x38\x8f\x10\x35\xda\x67\x24\xb0\xe8\x74\x5b\x4a\xbf\xd7\x2c\x8f\x78\xf2\x9c\x56\xe7\xe7\x2e\x05\x45\x14\x9f\x8c\x02\xcf\x43\x36\xcc\x4f\x7d\x6c\x32\x5d\x74\x22\x28\x87\xbe\x3c\x73\x03\xbf\x60\x5a\xc6\x51\x64\x4a\x89\x67\xd0\xc8\x74\x3f\xfe\x93\x62\xeb\xfa\x89\xef\x55\xb8\x56\xa4\x90\xc2\x3a\x4b\xdf\x37\x78\xb7\x29\x90\xf3\xd7\xa6\x53\xad\x02\x93\x14\x5f\x5c\xa8\xc6\x3a\xd7\xbe\x90\xdf\x06\xf4\x72\x9e\xc9\x3b\xa5\xf7\xd2\x18\x80\xec\x0b\x5f\xed\x2d\x75\x0e\xd5\xc4\xf7\x22\xf5\x94\xb2\x36\x85\x7d\xf2\x15\x04\xe3\xe7\x0b\x60\x7b\x6f\x3b\xba\x01\xdd\xa5\xa5\xb3\xd1\x7b\x9e\x69\x18\xf3\x69\x1f\x22\x95\xf3\xef\xd3\x5f\xc2\x8d\x9f\xd6\x70\xf9\xe4\xb7\xf6\x2f\x86\xb3\xf6\xee\x73\x8a\xc6\x5c\xd0\x27\x2d\x7a\x5f\xe5\xe4\xe2\x29\xf9\x00\x1c\x1c\x59\xed\x40\x0e\x37\x40\x34\x76\x55\x51\x7e\xa3\xfb\x05\x1d\x67\x1f\x6c\x45\x2c\x76\xa7\x63\x05\x7d\xce\xb2\xa4\x6b\xc6\x29\x2b\xf1\xb5\x4f\xe0\xdb\x1d\x3f\xac\x08\x51\xfe\x42\x77\x40\xa3\x7d\x01\x6c\x79\xb7\x44\x46\x08\x57\x20\x8c\x3e\xcb\x3d\xb9\x9b\x5b\x5e\xf0\xea\xcd\x38\xb9\x5c\x95\x53\x22\x29\x76\xbf\xd5\x1c\x03\x9b\xfc\xa2\xf1\xf0\xb4\x10\x88\x7a\x1e\xb1\x15\x9a\x20\x4e\xfc\x3a\xf0\xb4\xdd\x27\x6c\xab\x3a\x11\xd8\x72\xb2\xee\x78\x8b\x4d\x6a\x15\x33\x95\xff\x40\x5a\xc8\x9b\xa2\x93\x84\xfc\x5a\xcf\xd6\x92\xf7\xf5\x49\x3f\xe0\x95\x6a\x81\xa8\x35\x9f\x33\x2a\x25\xce\x2e\x88\xe1\x85\x6f\x3f\x99\x9d\x2f\x24\xa7\xc8\x90\x2e\x4d\xf7\x33\xc7\x3c\x56\x14\x8d\x1b\x20\x73\xd5\xc2\xcc\x64\x99\x8f\x26\x65\xb7\xd4\xc4\xc7\xcf\xe0\x63\x1f\x9c\x7f\xd1\x84\x55\x35\xed\x36\xb1\x30\xe3\x00\x34\x5d\x6f\x0c\x40\x7a\x40\x92\x57\xd8\xcf\xda\x28\xad\x15\x2b\xc3\xfd\x6b\x24\xb6\xb1\x6e\x80\xbe\x90\xeb\xa3\x89\x69\x50\x7e\xb7\xfb\xfa\x47\xf9\xa7\x57\xf0\x03\xe0\x47\xe4\xda\xce\x8c\x67\xbc\x8d\xa1\xe3\xea\xad\x48\xda\x82\x42\xf5\x8b\x3e\x22\x1e\xaf\xc8\x85\xd7\x35\x7d\xa2\x90\x91\x80\x52\x4b\x84\x62\x67\x21\xaa\x20\x76\x86\x75\x22\x7d\xa7\x22\x8f\x7b\x9d\x06\x4f\xff\xa2\xa7\xa6\xa9\xa4\xd8\xb4\x1e\x1c\x2c\x3d\x1d\x16\x8a\x74\x77\xcf\x32\x30\x5e\xae\x8d\x71\x84\x95\xb8\xae\x8e\xfa\x48\xcb\x2b\xb8\xf2\x0b\x0a\x2a\x41\x1b\x78\x81\x65\xcd\x0d\x82\x7f\x26\x38\xf6\x5e\xb4\xcd\xe5\xa8\x29\x46\x19\x77\x93\xbc\x38\xb1\xaa\x31\xe3\xae\xcc\x7f\x2f\xf3\xe7\x9f\xf7\xeb\x3c\xf4\x7d\x38\x8f\x11\xc0\xd5\xae\x6c\x07\x70\xea\x2d\x79\x5c\x7f\xb3\x63\x8f\x27\x9b\x53\x64\x73\x78\xe2\x92\x8c\xdd\x37\xb4\x0f\x20\x25\x33\x18\x32\x64\x39\x7a\x7f\x78\x98\x9d\x29\xb3\x05\xde\x2b\xde\x7e\x12\x86\x7c\x6f\x44\xed\xb6\x7b\x8d\x84\x01\x78\xa5\x4c\xaa\x7e\x41\xbb\x78\x17\xae\x6e\xca\xa2\x3e\xad\x9b\x0e\xe7\x14\x10\x8c\x77\x3c\x35\x2c\x2d\x6f\x90\x0d\xb4\x0e\xd3\xae\xf1\x72\x67\xcc\x43\xcf\x07\xef\x82\xdb\x9a\xf7\x94\x8b\x94\xde\xde\x96\x48\xd5\xd3\xac\xc1\x39\x6a\xf4\xca\x7a\x0d\x3d\x19\xe1\x21\x1e\xfc\x52\xff\x43\xeb\xcd\xbe\x7e\x31\x6b\x01\xd5\x8c\xae\xe9\x46\x52\x89\xf2\x55\x6c\x2b\x14\x67\x4d\x2f\xe1\xc8\xd9\x8e\x52\x73\x48\xc3\xf7\xce\x97\xf5\xe9\xcf\x49\xfd\x0b\x1b\x47\xf0\x65\x3f\x78\xe6\x57\xea\xda\xca\x8d\xea\xd5\x06\xbc\x2e\xf3\x4c\x8d\x91\x6f\x91\x74\x43\xea\xde\xcd\x16\x06\xc6\x2b\xc5\xe5\x17\xaf\x33\x89\x13\x60\xb9\xe1\x21\xe4\x71\xf8\x90\x74\x9f\xcc\x55\xdf\x84\x88\x01\x9f\x55\x3a\x3a\x87\x49\x2e\x92\xc4\x29\x50\x14\xc4\x17\xb3\x16\xeb\x52\x32\xaf\xbc\x10\x46\x5f\xa9\xb9\x2a\x4f\x57\x2c\xdb\x25\x59\x31\x32\xbc\x85\x0a\x2a\x32\x42\x45\xc7\x8b\xe5\x80\x70\xfa\x2f\x68\x17\x97\x63\x4b\xf6\xad\xdc\xab\xa7\xa7\x53\xe1\x94\x55\xf4\x71\xdc\x9b\xe0\x3c\x57\x99\x37\xb4\x5a\xe0\x99\x9d\x3c\x4c\xc3\xa7\xb4\x2f\x56\x9f\x80\x68\x53\x1b\x91\xac\x2d\xe6\xdd\x1e\xca\x1c\x30\x2d\xec\x0c\xcc\x4e\x9c\x6d\x49\xe7\xa5\x3c\xd8\x4a\x79\x38\x6d\x5e\xf6\x93\x75\x1f\x9e\x92\xa0\x40\xca\x95\x67\xd9\x7d\x4a\x3d\xf3\xe9\xde\x47\x5d\x90\xf1\x50\xda\x8a\xf7\xc9\x93\x5a\xd1\x3d\xc3\xef\xc3\x7c\xfd\x02\xa7\x32\x23\x05\x19\xd6\xb8\xf1\x0b\x64\xad\xce\x69\xf7\x68\x61\xc9\x15\xc3\x37\x9e\xd2\x7a\x54\x72\x86\x24\x01\xbf\xa9\x57\xf5\xc6\x2f\x96\x8e\x3c\x65\x50\xe5\x56\x19\x00\x8c\x1c\x28\xeb\x6e\xfc\x22\x07\xda\x08\xdc\x74\xf9\xea\x93\xc1\x7c\x47\xe6\xd4\x36\x68\xae\xf4\x9f\xe8\x15\xf7\xa4\x0c\x54\x21\x9f\xae\x8c\x7a\x79\x79\x34\x1c\xf7\xcc\x94\x17\x99\x99\x3d\x4d\x38\x56\x2a\xe5\xd0\x4e\x57\x0b\xba\x95\x48\xfd\xcb\x08\x8f\xdf\xf2\xff\x0d\xf0\xc7\xff\xe0\xef\xfc\x9b\xbf\xed\x7f\xf0\xff\xfb\xf1\x7f\xff\xef\xfd\x6f\xfc\x8e\x1f\xfb\x35\xff\xbd\xff\xdc\xaf\xfb\xd1\xbf\xfd\x27\x7e\x3c\xfd\xcc\xaf\xfd\x73\xff\xec\xcf\xfe\xd1\x0f\x14\x1e\xdb\xca\xb3\xa5\xde\xc3\xcb\x54\x20\xf7\x50\x2c\x86\x07\xc3\xbf\x10\x4f\x99\x34\xc5\x17\xd6\xc3\x2c\xbf\x84\x45\x84\x0a\xaf\xfc\x0b\xb7\x5a\x58\xf4\x28\xc9\xa4\x34\xcf\x2b\x66\xcf\x12\x43\xf1\x0c\xca\xb9\x53\x69\xf5\xd8\xc8\x01\xf1\x42\x41\xb0\x6f\x56\xa7\x58\xe3\x17\xb4\x0b\xc3\xde\x8c\x2d\x18\x3c\xe6\x61\x61\x3b\xe5\x20\x7a\x30\xb5\x37\x1d\xce\xd8\x9a\x2f\x15\xcd\x12\x36\x6d\x40\xda\x99\x9c\xbb\x90\x5f\xf0\x77\x6f\x35\x86\xe0\xc2\x74\x3c\x5a\x1b\x91\xaa\x21\xcf\x78\x5b\x06\x26\x6c\x15\xe6\x39\xd4\x95\x7c\x7b\x85\x3b\xa3\xab\x23\xe4\x9f\x8c\x45\xb6\x54\x71\xf3\xc3\xcd\x52\xaa\xe9\x22\xaf\x27\xcf\x6e\x2f\x02\x9a\x9a\x2d\x91\xd4\xd0\x27\xd2\x4c\xab\x8e\x52\xea\x36\xd5\xf5\x83\xbd\x31\xbf\x14\xce\x2c\xe5\x38\xa2\xed\x24\x85\xd4\x83\xb2\x04\xe1\x35\x47\x77\x5e\x9a\x88\x58\xba\x46\x43\xd1\xc4\xe4\xfc\x44\x3e\xee\x17\xf0\x7a\x7b\xbf\x72\x98\xc7\xa5\x76\xa6\x7a\xe9\x14\x77\xcf\x25\xa4\xec\xea\x15\x5d\xd3\xba\x83\xc6\xf7\xc4\xe8\xf5\x30\xb4\x1e\xde\xbf\xa0\x5d\x90\x89\x78\xe0\x3d\xdb\xd9\x47\x88\x71\x0d\x59\x36\xb4\x1f\x5a\xc0\x0c\x17\x16\x1e\x61\x10\x9d\x65\x6e\xba\x46\x0f\xa1\x16\xf1\x2f\xca\x9c\x2b\x8f\x5f\x82\x13\x2e\xf7\x84\xea\xa9\xee\xc4\xb6\x6b\xac\x42\x07\xf0\x40\x45\x9e\xb2\xa6\x7a\xc7\x3e\x57\x82\x14\x59\xf6\xfc\x8b\x41\x75\xc5\x8e\x66\x46\xa4\xc8\xf2\xcc\xf9\xf2\xb1\x85\x01\x74\x0e\x69\xf0\x53\xeb\xd8\x32\xf6\x18\x7b\x4a\xe2\x7d\x5e\x52\x9e\x73\xc5\x17\x03\x89\x4e\xb3\xcb\x7d\x61\xf2\x07\xb6\xb7\x3b\x2a\x3d\x17\x35\xd7\xc0\xfa\x00\x88\xb0\xf3\xb2\x42\xb6\x24\xc4\x4b\x17\x8b\xb0\x52\x7c\xa1\xad\xd8\x1b\x6a\x4b\xa3\x8e\xc7\x08\x48\x1f\x12\xf6\x3d\xb6\x09\xd1\x6a\x5b\x9b\x82\x31\x74\xe7\x04\x92\x25\x38\x10\x39\x03\xf2\xf2\x2f\x44\xc0\xa9\x68\x5c\x08\x09\x6f\x8c\x9c\xf7\x1a\x1c\x6a\x0e\x9f\x46\xf1\x7d\x71\x03\x94\xb5\x24\x9a\xf5\x5b\x8f\xcd\x47\x7a\x88\xc9\xfe\x0b\x1b\x87\xb7\x8d\xaf\x47\x5d\x1e\x75\xa3\xfe\x76\x65\x1f\x23\x84\x15\xdb\x14\x9e\x2f\x20\xd5\x9c\x17\x53\x6e\x8f\x18\x0f\x7f\xdf\xf5\x7c\x92\xed\x92\x4a\xb6\x16\xae\x7c\x5b\x8a\x49\x8f\xb4\xc1\x3a\xa7\xa8\xfd\x9c\x9e\x49\x0b\x01\xc6\xe6\x4b\xe0\x46\xe3\x37\x46\x14\x50\xe5\x1f\x10\x1e\x8c\x3c\x12\x9a\xb9\x2c\x70\xc9\x10\x90\xb0\x9f\x73\x47\xa5\x22\xc2\x29\xbd\xfa\x41\xe7\xc5\x9d\x2f\x47\x9f\x17\x0c\xd4\xc1\x38\xe7\x0b\xc2\x03\xc5\x1d\xb6\x21\xf1\xa9\x99\x8e\x00\x1c\x6f\x54\x07\xeb\xbd\x47\x5e\x72\x2e\x61\x36\xcd\xd2\xfe\xb0\xe1\xc2\x44\x6f\x6b\x08\x7c\x51\x3b\x19\x81\xde\x95\xa8\xec\x1e\x49\x5a\x3f\x80\x67\xe6\x51\xe5\x3a\xd9\x50\xec\xa8\x15\x46\xdd\x7a\xe5\x82\x48\x40\x16\x5c\x97\x9f\x90\xc5\x35\x29\x96\xce\xdb\x73\x70\xfe\xac\x72\x18\xd1\x04\xeb\x3d\x6f\xb7\x9c\x3c\x3c\x3d\xba\xbf\x7a\x5f\xeb\x6b\xad\x52\x32\x10\x3f\x49\x98\x31\xb3\x74\x72\xf7\x3a\x0a\x73\x50\x24\x91\xe1\xe5\x69\xb6\x85\xa6\x79\xf5\x68\x57\xac\xf1\xdc\xb8\x0c\x03\x22\x2f\xa1\xf8\x7b\xbe\xa8\x5a\xb8\x86\xb7\x94\xfd\x90\xb7\x49\x6b\xe0\x61\x05\x57\x43\x7b\x78\x03\xd5\x73\x08\x8a\x82\xd9\x4f\x68\xf0\xcd\xe1\x9d\x87\x8f\xf5\x49\x3a\xd7\xec\xde\xb3\x26\x61\x5d\x63\xce\xf3\x40\xeb\x4a\x67\x59\x61\x7e\x57\x0f\x2c\xed\xd1\x15\x41\x63\x9e\xf8\x70\xc6\x53\x7b\x79\xf8\xa2\xa7\xc2\x57\xa4\x57\x47\x45\x52\x9c\xfb\x01\xf4\x71\xac\xf9\x64\xca\x1a\x15\x53\x3b\x83\x8d\x26\xc9\xd2\x64\xae\xe4\x65\xc5\xac\x7c\xbe\xa0\x69\x11\xe3\xd6\xf1\xe9\xb0\x82\x03\x2a\x04\x32\xe4\xec\x2c\x83\x30\xb9\xed\xc2\x56\x6f\x24\x0a\x42\xdc\x0e\x2c\x51\xf1\x14\xce\xfd\xe0\x4b\xe5\xcc\xd4\x7d\xb2\xa8\x7e\xf4\x9c\x0a\xa5\xa3\xbf\x28\xa2\x40\xc9\x43\x6a\xd6\xcf\x22\x3d\x99\xa2\x0c\x04\x93\x80\x7e\x1c\x79\x3e\x51\x9c\x73\x19\xf8\x80\x6c\x96\x14\xd0\x83\x06\x57\x92\xa7\xb9\x5f\x8c\x8b\x5d\x20\x88\xca\x38\x7e\x48\x9f\xd9\xda\x1b\xdd\x56\x4a\x89\x2f\x14\xa4\xb0\x85\xd8\xcf\x82\x8e\xa6\xe4\xf4\x4e\xaa\x01\xb8\x86\x6b\x3d\x8b\xc8\x29\xb8\xd9\xcb\xd9\xda\xa0\x7d\xe3\x34\x9a\x8a\x35\x7e\x62\x32\xaa\xe8\x79\xe8\x2c\xce\x0e\xd1\x03\xe3\x9c\x84\xe6\x30\x41\x45\x0c\xac\x63\x0e\x16\x73\x5d\x6b\x93\x64\x13\xc7\xe7\x3b\x60\xf8\xe2\x4b\x85\xb7\x79\xf0\x04\x8c\x86\xd5\xbc\xbc\x89\x46\xc3\x70\xca\x0f\x71\xd1\x0d\x2b\x90\xb4\x99\x6e\xcd\xc6\x7a\x2f\x07\xc3\xc7\xf5\x49\xbe\x22\xbb\x25\x80\xbc\xa5\x94\x1a\xc3\xb0\xe5\x81\xf4\x70\xf9\x6c\x32\xcc\x6b\x31\x15\x1c\x55\x38\x86\x2b\xb9\xbf\xae\xeb\xa5\x37\xfb\x22\x17\x6b\xdb\x19\x8e\x5c\xf0\x04\x4a\xc7\xa3\x1e\xb6\x42\xec\x5d\xa5\xa1\x24\x37\x19\xee\x1e\x5b\xb4\xf0\x8d\x56\x3c\x4e\x71\x3e\xea\xfd\xc2\x1a\x49\x97\xad\x80\x6f\x5c\x30\x79\x41\x06\x69\xc2\xa4\x90\x49\x38\x67\x27\x4d\xd0\x57\xa4\xf7\xbd\x34\x39\x31\x25\x43\xf3\x15\x6c\xb0\x5f\x46\x78\xfc\xa1\x5f\xff\xab\xfe\xe1\x7f\xf6\x4f\xfd\x91\x9f\xfc\x1b\xbf\x36\xe7\x5f\xf3\xbf\xfc\xdb\x3f\xfd\xc7\xff\x57\xbf\xf2\xf7\xfd\xf5\xf0\xb3\xff\x8f\xdf\xf8\x0f\xc6\x6f\xff\x3d\xff\xd3\x1f\x91\x1f\x10\x1e\x7d\x1e\xc4\x7d\x61\xd5\x86\x8e\xb4\xce\x34\x9d\x9e\x8c\x6c\xf6\x4e\xa8\xd5\x2c\xce\x50\xf5\x74\x45\x5f\xf9\x10\x7f\x39\xcd\x5f\x18\x28\x78\x6d\x4f\xe1\x46\x74\xc2\x01\xf0\x92\x9c\xc8\xed\x6b\xf8\xe5\xf1\x0a\x15\xb4\xb8\x80\x37\x80\xf8\x5e\x09\xab\xf8\x4e\x44\x08\xf8\xa2\x09\x07\xad\x8d\x11\xf9\x8c\x8b\xe6\x52\x59\x0f\xad\x6f\x9e\xf1\x90\x4a\xa6\xb5\xfd\x09\x9e\x5a\xea\xb0\x89\x63\xf4\xde\x86\x5d\xe3\x13\xc1\x52\xec\x4c\x09\x5c\x56\xee\xb7\xde\xcc\x2a\xbf\x21\x29\xe0\x8c\x64\xda\xb5\x6e\x4b\x5d\xdc\xde\x8b\xbb\x63\x3a\x3a\x21\xca\x27\x52\xe4\xf4\xf4\x30\x00\x4c\x7a\xee\x3d\x2d\x2f\x22\xc6\x28\x62\x4b\x11\xc8\x9c\xac\x99\xc7\x10\xd9\x90\x60\xf7\xd8\x29\x62\xf2\xbc\x7d\x21\xcb\x96\x15\xb4\xac\x35\x9d\xb6\x6b\x0b\x74\xbf\xd6\x3e\x71\xb8\xf2\x52\xcd\x8e\xf7\x20\x4f\xc1\xfd\x83\x02\x19\x9b\x44\xbc\x5a\xfd\xc4\xad\x86\x66\x9c\x7b\x9c\x6c\x66\x31\x2e\xa7\xeb\xe1\x1d\x8a\x22\x57\xc2\x3c\x89\x20\x2e\x0c\x7f\x9d\x2d\xd2\x0b\xcc\xb2\x5d\x36\x7d\x51\x6c\xb9\x47\x9d\xd3\x0d\xcb\x80\xf1\xd9\x9d\x8f\xa9\xc3\x9b\x28\x54\xbd\x40\xd1\xc1\xb9\xc0\x1d\x4e\x80\x6e\x22\xa0\x02\xa7\x33\x9d\x7f\x21\x39\x8d\xc8\xbc\x79\xf0\x6c\x4b\x6f\x5a\x8c\x0e\xf7\xe9\xcd\x10\x78\x1d\x92\x98\x01\x1c\xe1\x5c\xc0\x49\xa8\x68\xdd\x78\x8b\x71\xbf\x80\xd7\xac\x7a\xdc\x69\x7b\x74\x9e\x6d\xd0\x14\x56\x06\xfc\x46\x12\xcc\x82\x1b\xba\x27\xd9\x0a\x0b\x9f\x38\x28\x79\x5f\x04\xe9\x5b\xbd\xfc\x82\xef\xa7\xeb\x4a\xa2\x19\x2b\x63\xb6\x5e\x0f\x41\x96\xc5\x23\x14\xca\xad\xec\x9a\x08\x77\x81\xf3\xa1\x9e\xf7\xfa\xc2\x01\x5a\x72\xb9\x2f\xea\xc5\x46\x6f\xdb\x66\x20\xc5\x65\xda\xe5\x10\xff\x70\x54\x17\x5a\x38\x57\x1a\xa3\xf7\x9a\x59\x1a\x09\x4f\x56\x84\xd5\xee\xf0\xbc\x7d\x10\x42\xc8\xe4\x3b\x44\x25\xbd\x14\x36\x9e\x81\xa9\x30\x80\x0b\xcc\xc7\xc0\x8c\xcc\x40\xa4\x77\x07\xd7\x49\x6d\xaf\x66\x9e\xc4\xd3\x33\xe0\x17\x7b\x20\x4a\x8b\x34\x2b\x00\x11\xa2\xf2\x4d\xb2\xc8\x1e\xef\xde\xb1\x3c\x0c\xdd\x84\x59\x22\xc8\x18\x32\x4f\xc4\xdd\xb2\x56\x12\x28\xf8\xa2\x6a\xf1\x19\x0a\x0f\xb0\xff\x42\xd0\x52\xcc\x72\x3e\xaa\x90\x40\x60\xda\x9e\x51\xca\x70\xa2\x51\x42\x31\x33\xcf\xe1\x1c\x8f\x6e\x8b\x1f\xa4\x24\x30\x29\x4f\x84\x69\x1e\xdb\x9d\x14\x8b\x41\xe3\x1b\xab\x57\x64\xcc\x89\xd8\xbc\x7a\x6c\xaf\xc0\x7d\xaa\x2b\x28\x73\xe3\x55\x50\x7c\x41\x35\x10\x2a\x6d\x10\x62\x51\xed\xc3\xc0\xd6\x0d\xdc\xae\x21\x7d\xd2\xa4\x23\xb6\x52\x17\x47\x93\x51\x69\xcb\x44\x7a\xe3\x14\x8f\x4f\xb4\x15\x0f\x1f\x1b\x25\x5d\x0b\x95\x8f\x08\x01\x8e\x77\x2f\x1c\x95\x63\x2d\x56\xf4\xb2\x1d\x48\xea\x23\x33\xde\x23\x41\x38\x27\xc6\xef\x17\x34\x6d\xdf\x49\xbd\xa1\x3e\x9e\x34\xa0\x71\x0f\x29\xf8\x04\x1d\xad\xed\xc9\xa3\x9a\xd3\xad\x95\x78\x9a\x34\x8b\xe3\x11\x28\x68\x27\xf8\x82\xa6\x8d\x3b\x33\xba\xc3\xce\x2b\xbc\xe0\x79\x5f\x9b\xd3\xd8\x26\x49\xbf\xe9\x95\x06\x6f\x3c\x72\x7d\x1f\x29\x99\x40\x95\x3a\x84\xfb\xf9\xe2\xaf\x80\x41\xf9\xc7\xd8\x96\x5f\x64\x2f\x3b\x5e\xca\x0b\xc4\xe4\x65\x03\xb9\x0f\x7a\xe0\xc0\x84\xaa\x09\xa9\xf1\xcb\x46\x66\xee\xf3\x45\x62\x04\x43\x4e\x95\x57\xbd\x35\xde\xbd\xdb\xae\x1d\x12\x48\x2c\x51\xc9\x8e\xa2\xaf\x24\x12\x67\xff\xdc\x23\x86\x29\x5a\xd9\xb7\x9f\xc6\xbf\x30\x93\x9c\xba\x4f\x59\x74\xff\x30\x52\x80\xea\xb8\x64\x69\xcc\x76\x5c\x26\x66\x14\xd3\x55\xa6\x4d\x59\x40\xf5\x78\x30\xb7\x58\xae\xfc\x85\xc9\x88\xed\xf8\xbe\x8b\x90\x59\x5e\x48\xaa\xc5\xbd\x13\xdd\xba\x3d\x77\xd2\x2a\x97\xf0\x7b\xe2\x8e\xe5\x30\xc8\x25\x8d\xe1\x45\x18\x8a\x2f\x6a\xa7\x66\x31\x9c\xbe\x25\x1a\x3e\x30\x98\x93\xe1\xad\xbe\x1a\xdb\x59\x08\x4f\xc1\xae\xd7\x6b\x44\x44\xf3\x76\x94\x7e\xb5\x67\xf8\x93\xd7\x29\x9a\x5a\xe0\x55\xfc\xf5\x6b\x80\x9b\x78\x86\x81\x8b\x1a\x28\x74\x0b\x61\x12\x74\x19\x0e\xf9\xfd\xa4\x5c\x55\x73\x15\x8f\xc8\xbe\x88\x23\x27\x3d\x3f\x1c\x86\x0a\x52\x68\x94\x58\x1d\x2d\x97\x3e\x8f\x15\x1b\x49\xd9\x1d\x5f\xeb\x5a\x31\xe5\xb8\x9f\xc2\xe5\xf0\x83\x7d\x42\x59\x03\x49\x51\x65\xc1\x06\xfd\x14\x7d\x2a\x92\x6a\x4e\x45\x26\xa6\xcc\xc3\xbe\xba\xe1\x67\x8f\x32\xde\x96\xa4\x93\x6c\xc7\xd0\xfb\x17\x5a\xef\x11\x27\x35\x1c\xc0\x39\x53\x48\x93\x4a\xb1\xa6\x60\x36\xaf\xec\x03\x27\x6f\xd7\x89\xcf\x22\xfc\xee\x42\xb5\x45\x83\x75\x28\x7c\xf1\x2e\xaa\x3e\x2c\x51\x9f\xd0\xeb\xe8\x4e\x69\xf2\xa7\xe6\xc9\x63\x4d\x58\xd8\xc7\x09\x8c\x62\x0a\xc9\xee\x69\x64\x05\x36\xcc\x41\xbe\x20\x05\x19\x23\x9d\xcf\x1e\xd4\x6b\x07\x53\xcd\xdb\x87\x52\x91\x3c\x4e\xde\x6a\x24\x33\x79\xa2\xb0\x40\x9f\x7c\xd8\x0d\x23\xe4\x0b\xf3\xf8\x62\x25\x3e\xe8\x40\x42\x3d\xbc\xe8\x4d\x0c\xcf\x3b\x3e\xc2\x2c\xf5\x3e\x58\x2c\x07\x08\xc8\xba\xd4\x5d\x99\x02\xfa\x96\x73\x37\x3c\x9e\xa1\x5f\x46\x78\xfc\xd1\xdf\xf1\x1f\xfe\xed\x7f\xee\x3f\xf9\xd7\xfe\x5b\x7f\xf0\x7f\xf7\x4f\x7e\xea\x37\xdb\xff\xc5\x7f\xff\x8f\xfc\xfc\xdf\xfb\x09\x36\x7f\xe6\x4f\x26\xfd\x13\xff\x9f\x7f\xe5\xdf\xe8\xbf\xe1\x8b\xd0\xd2\x63\xd2\x52\x8d\x78\x77\x7f\x40\x50\x05\x85\xb8\x68\x87\x89\x0b\x30\xcc\xf3\x48\xb1\x4b\x84\x8f\xa0\x4e\xd0\x46\x87\x6e\xe0\x0b\x8e\x9b\xd1\xac\x6d\x3f\x3e\xa3\xb5\x99\x72\xf1\x61\xe0\x6c\xb7\xaa\xde\x97\x18\x48\x6e\x12\x06\xbc\x05\xca\xf7\x75\x4c\xd3\x86\xa8\x62\x5f\xf0\x77\x43\x47\x18\x87\xa5\xb7\xcb\x49\x6c\xe9\x9e\x63\x40\x80\x78\x2f\x4c\x7a\x7b\xde\x45\x05\xd7\xa8\xb2\x0a\xb3\x8c\xc5\xa9\xd5\x17\x05\x86\xd1\xc8\x6e\xe7\x1e\x59\xd5\xfa\x6e\x10\xa6\x9a\xb4\x51\x75\x78\x6b\x22\xd3\x81\xc5\xa3\x62\x79\x79\xe8\xd4\x36\xd1\x2e\x81\x9f\xe4\x13\x8c\xde\x2f\x5a\xd0\x6d\x61\x70\xeb\x06\x9c\xe4\xfc\x74\xcc\xd7\xc1\x79\x1f\x18\x36\x79\xe0\x12\x01\x62\xc5\xd7\x24\xf2\x39\xe7\x0b\x30\x87\x6c\x8b\xbb\xa9\xa1\x95\xde\x08\x06\x57\x08\xe1\xdc\x90\x4b\x9c\xd9\xb2\x6c\xa1\xa8\x79\x96\x8f\x7d\x07\xdd\xcf\xcc\x1c\x9c\x2f\x38\x6e\xc8\xcd\xe3\x96\xbc\x22\xcc\x34\xd4\xd0\x51\x49\x16\x4f\x70\xb9\xf8\x8a\x51\xd5\xa5\x21\x98\x4b\x34\x33\xf7\x53\x26\x1b\x8e\x7d\x41\xbb\x8c\x44\xb9\x22\xc5\x23\xc2\xe0\x76\x2e\x71\xb2\x62\x2c\xa4\xea\x53\xd7\x2c\xbd\x39\xe5\x13\x1c\xba\x9c\xa2\x2c\xc2\x35\xe1\xf8\x05\xe1\x51\x72\x19\xd1\xe8\xd5\xd3\x41\x7a\x5b\x1e\x1c\xeb\xe6\x98\xd9\x37\x3f\xec\x84\xe5\x7c\x5a\xc7\x37\x04\xfd\x59\x92\xda\x67\x7c\x13\xbc\xd7\x41\xc9\x9c\x6b\x6f\x0e\x69\xc5\x38\x15\x6a\x7a\x9f\xfb\xba\x2d\xe6\x95\x0e\xfa\x8b\x4e\x67\x11\x0b\x3f\xa0\xa3\x60\xa2\xf8\x45\xa8\x58\xc9\xeb\x3c\x08\xd8\x31\x99\x75\x4a\xeb\x86\xba\xd7\x84\xa3\x01\x1d\xd8\x0c\xbb\x6c\xb3\xd4\xc7\xd2\x61\xc2\x11\xde\x0d\x51\xbf\x00\x73\x36\x27\xcc\xd5\x4c\x63\x15\xe1\xf5\x0a\x38\x26\xb3\x05\x53\xb1\x9c\xf7\xe1\x23\xaf\x15\xc2\x8a\x87\x20\x3b\xae\x3c\x41\xb7\xf3\x05\xf9\xa3\x81\x6e\xad\xbd\x1e\xbf\xa1\x42\x2e\x1b\x3b\xf0\x71\xdb\xc3\xda\xde\xd0\xa2\x62\x5e\xac\xe0\x16\xa8\xf0\xd4\xa0\x6a\x03\xe6\x7c\xb1\xbd\xa6\x9a\xb1\xb7\x80\x69\x1e\x3d\xe7\x3e\x22\x1c\x3f\x3b\x1c\x3a\x51\x54\xe7\x0e\x3e\x6e\x4b\x34\x78\x9e\xf2\x8a\x56\xee\x9a\xeb\x93\xfc\x23\x2a\x73\xa0\x31\xb2\x42\x7a\x34\x5e\x8f\x2a\x4a\x11\x64\x20\x65\x3d\x15\x94\x4b\x0c\x2d\x7d\x5d\xc6\x2b\x41\x7b\x3d\x08\xe6\x0b\x45\x18\x7f\x34\x72\x86\x1b\x8d\x2e\x05\x6f\x8b\x91\xc1\x9d\x59\xf1\x93\xa9\x51\x6c\xba\x62\x84\xdc\x28\xd3\x9d\xc5\xd1\x5e\xa1\x68\x0a\x1f\x68\x6e\x18\xc1\xba\x33\xd9\x0e\xc2\x12\x0d\xd4\x31\x7b\xd9\x32\x3b\x24\x15\x8f\xdc\x3c\x61\x56\x79\x3c\xe7\x3e\x81\x4e\x6f\x56\xaa\xe1\x8b\x30\x5b\xc6\x36\x4b\x30\x28\xb4\xe4\xa3\x78\xbc\x99\x93\x9c\xd7\xf2\xc4\x40\x46\x99\x67\xe7\xf8\x21\x8c\x26\xe2\xc5\x57\x67\x0c\x44\x6b\x1f\xec\xd0\x59\x2d\x3c\x27\xb1\xe3\xc4\x60\x17\xd4\xc6\x96\xdb\x9f\x57\x3e\x2e\xd4\x0d\xd4\x20\xed\x1a\xbf\x83\x76\x0b\x87\x03\x2c\xe8\xeb\x13\x4f\x3e\xe6\xcf\xdb\xb7\x1f\x4f\x18\xac\xd6\x4b\x24\x64\x9d\xc6\x1a\xfc\x1c\x99\xbf\x1b\xd4\x9c\xd8\x0f\xa8\xc1\x11\x52\x72\xda\x7a\xb2\x2f\x28\x6b\x8c\x47\x63\xfd\xe9\x4d\xde\xe4\xbd\x95\x1c\x06\xd5\xd4\x64\x80\x5a\x91\x3b\x16\x37\x6a\x63\x5e\xbb\xb4\x99\x15\xc9\x43\xad\xfb\xc2\xf6\xd5\x7f\x98\xd3\x11\x20\x3c\x28\x44\xa6\x51\x0f\x25\x6f\x65\x42\xc4\x23\x1f\xbc\x4c\xa7\x29\xe7\x9d\xc0\xbb\x9e\xd1\x9c\x86\xb2\xb3\x2f\xfa\x48\xe4\x18\x33\xad\x49\x7e\x57\x00\x36\x91\xe7\x48\x3a\xc8\xec\x80\xa2\xd7\xf1\x5a\x84\x02\x9e\x1a\xf8\xd6\x77\x19\xd6\xfc\x9c\xe0\x8b\xb9\x13\x87\x71\x6f\x98\x41\xd3\xf9\x50\xa1\x9c\x57\x67\x28\x5d\x95\x8f\xfd\xc5\xf9\x10\x94\x46\x6b\x4a\x97\xf1\xc0\xa3\xe8\x1d\xa8\x7f\x11\x9d\xaa\xdd\x31\x20\x6d\x89\x53\xa9\x99\x26\xed\xc6\xf0\xa5\x67\x5d\x48\x12\x9c\x9d\x92\xba\x28\xb6\x26\x91\x59\xa4\x84\x45\x42\x3f\xd1\x56\xa4\x83\xdb\x50\x28\xea\xf7\x94\x70\xf1\x5d\x8b\xa2\xd1\x1e\x44\xca\x7d\x3a\xa8\x91\xa1\xc7\x5c\xe4\x95\xa0\x2f\x08\x95\xae\x70\xbf\x50\x4d\x1e\x29\x4b\x7c\x1c\xaf\x8d\x58\x86\xdc\x95\x26\x54\xd7\x58\x08\x64\x3e\x05\x54\xd8\x88\xf3\xa0\xba\xc7\xbe\xbb\xa2\xe3\xda\xfe\x82\xbe\x67\x05\x77\xf2\xda\xb3\x7c\xb6\x47\xc5\x44\xd0\x5c\x1d\xa7\x81\xe1\x79\x53\x27\x07\x87\x83\xda\xa8\x82\x7b\x82\x68\x01\x59\xc1\x2f\x96\x8e\x7c\x5a\x41\xf6\x78\x16\x1a\xd7\xa4\x36\x5a\xc5\xe2\x91\x29\xe9\xda\x83\xa2\x6f\x2f\x7a\x21\x29\x8b\x2e\x13\xce\x39\x89\x3f\x28\x7c\xd1\x47\x20\x3f\xdd\xe9\x7e\x49\x24\x19\x77\x9f\x85\x2a\xde\xe6\x09\x5c\x51\x59\x53\x5b\xd5\xcd\x4e\x95\x29\x9b\xac\x1e\xed\x3b\x4a\xff\x02\x15\x3d\xc7\x11\x13\xa5\x0a\x33\x94\x3e\x44\x0e\x50\x9e\xd7\xf2\x9a\x06\xe2\xc8\xaf\x9d\x1c\xd4\xd5\xf7\x2e\xc2\xb3\xda\x43\x59\x60\x5f\xbc\x8b\x87\x1a\xbd\xe0\x00\x5e\xac\x55\xf9\xe6\x46\x61\x19\x72\xb6\x62\x76\x7a\xd7\xd1\x58\xbd\x73\xe6\x61\x1e\xc6\x74\x13\x97\xe1\x5f\x72\xd6\xe2\x17\x09\x8f\x7f\xfc\xe3\x7f\xf5\xaf\xfe\xc7\xfe\xc2\x7f\xfc\x7f\xf4\xbf\xfd\xcf\xfc\xae\x9f\xfb\x79\xf0\xe3\xe6\xf7\xfe\xd4\xaf\xf0\x7f\x6d\xfe\xdf\xfe\xd1\xf8\x89\xff\xf4\x8f\xac\xff\xc2\x6f\x16\x1f\x10\x1e\x34\xdc\x89\xd5\x75\x8a\xed\x9c\xe1\xe4\x60\xbe\xf3\x09\x92\x45\x12\x7b\xad\xf0\x0a\x32\xcf\x71\x38\x02\x9f\xde\xd3\x06\x95\xfd\x0b\x3d\x01\x07\x6e\x4b\x0f\xca\x0c\xa3\x3b\xc2\x15\x79\xb9\xaf\x52\x8d\x86\xab\x56\x24\x53\xef\xa2\x6b\xfe\xc5\x6f\xec\xc7\xa1\x58\x6a\xfb\xa2\xcc\xe1\xc0\x33\x02\x14\x4e\xc2\x57\x75\x04\x73\x7b\x74\x34\x0f\x81\x28\xab\x30\xe4\x7a\x26\x60\x4c\x2b\x16\x8e\x5b\xce\x94\x07\x7f\x22\xbf\x7d\x6b\xed\xe9\xdc\x81\x1f\x7a\xa1\xa0\x96\x70\x18\x2d\x66\xa7\x76\x9b\x1a\x7f\x7d\x70\x91\x5d\xb7\xa9\x04\xc1\x2f\x86\x91\x60\x9f\xa4\x24\x78\x82\xf2\x73\xe9\x2c\x22\xac\xb2\xb2\x48\xe0\x91\x6b\x8d\xb9\x36\x41\x96\xfa\x25\x33\x9e\xf1\x25\x3e\x4b\xcd\xae\x4f\xbe\x7e\xb1\x37\x5e\xd7\xe7\xb7\xbd\x09\xa3\xd7\x96\xa5\xb5\xf7\xa6\x9c\x21\x78\x7a\xb4\xd1\x6c\xc1\x04\xb2\xa8\x53\x30\xcf\x9f\x88\x18\x47\x9c\x7d\x01\xaf\x9f\xd4\x75\xa7\x7a\x1a\xc8\x42\xd8\xe6\xe8\x17\x99\x20\x7a\x38\x1e\x9f\x96\x48\xe9\x61\x0a\xcd\x30\x21\x44\x6e\x0f\x6a\xa7\xfe\x8b\x92\x5f\x17\x3b\x97\x38\x91\x86\x4a\xeb\x69\x37\x43\x81\x09\x9e\x9d\x42\x68\x15\xa4\xf1\x3c\x51\xb9\x33\xad\x86\xc2\x4c\xe2\xe9\x27\xf9\xe5\x6c\xe9\xfe\x30\xfb\xb4\x3c\x45\x49\xc6\x77\xf7\x42\xe5\x0f\x79\x71\xa4\xb2\x43\x08\x11\x36\x99\x17\x82\x8e\xe1\x02\x0a\x10\xaa\xff\x82\x20\x75\x1a\x88\xa7\x10\xf2\x4a\x7a\x5b\x1a\xe5\x25\xcf\x7d\xa6\x95\x26\x36\x24\x77\x16\x1b\xd0\xa7\x75\xec\xdf\xdc\x66\x64\xc5\x33\xf7\x05\xf9\x93\x95\x3b\x47\x49\x39\x81\x2e\x7a\x0e\x71\x2b\x8d\xd5\x1e\x81\x5d\x9f\xe3\x22\x5f\xbb\x19\x84\x12\x19\x53\xef\x0d\xf7\xd8\xdb\x17\xf7\x0e\x22\x9e\x19\x7a\x2b\xe1\x63\x44\xbc\x00\xec\xa8\x9f\x8c\x36\x76\x44\xcf\xb7\x2e\xdf\x71\xe5\xf6\x89\xf8\x19\x7c\xdf\x61\x34\xec\x5f\xd4\x0b\xd6\x80\xcd\x3f\x4c\xeb\x65\xb1\x74\x3d\x4d\x86\xb8\xc0\x84\x9c\x62\x76\xdb\xe9\x18\xaf\x9f\xd2\xb3\x6b\x68\x08\xf0\x5a\x3c\xc5\x17\x43\x3b\x60\x09\xb9\xd5\xce\x38\xaf\xcf\xbd\x7a\xab\x86\x3e\xf0\xc9\x9a\xc7\xe5\x44\xe2\xf8\xd5\xdc\xbb\x5d\xf4\x4b\xb3\x94\xb0\x04\xf9\x45\xda\x4e\x27\x63\x42\xd1\xe0\x71\xb4\x85\xe8\xce\x5b\x43\x54\x06\x01\xdb\x74\xa4\x9d\x5d\x3f\x2b\xcd\x6c\x5c\x40\x6b\x9f\xdd\x49\x1b\xbe\xd8\x5e\x0f\xd1\xf4\x85\x56\xd1\xec\xa8\x70\x82\x1d\x9b\x36\x51\xe0\xd9\x00\x60\xf7\xde\x23\x7d\x24\xb6\x0b\x72\x88\xde\xbe\x0f\x41\x3f\x11\x87\x97\xad\x26\x58\xa6\xd6\xe6\xe5\x40\x83\x18\x3f\x16\x34\x53\x10\x7c\x56\x4b\xfb\x94\x32\xd2\x25\xd3\x9d\x48\x9d\x03\x63\xd7\xfa\x45\xbd\x88\xba\x90\xfe\x32\x5b\xec\x12\x8f\x22\x31\xdb\xa7\xb3\xb0\x4e\x39\x20\x19\xd2\x57\x5e\xe1\x7d\x4d\xe1\xca\x3d\x49\x1a\xeb\xf9\x27\x49\x65\xfa\x41\x3e\x0a\x8b\x76\xb4\xb0\xcd\xb1\xa0\x4b\xb4\x39\xc4\xd0\x4b\xc8\xae\x6a\x4e\x9f\x53\xee\x9a\xbd\x7b\x93\xa4\xfa\x9a\x9f\x48\xd4\x67\x79\x1f\xc5\x1e\xe1\x7c\xc8\x4c\x38\x67\x2b\x1c\x27\x14\xfc\x3a\xf3\x2e\x1a\x1e\xf1\xb0\xc7\xb7\x41\x43\x7b\xd5\x70\x88\x7f\x73\x13\xa4\xa3\x98\x65\x4d\xc9\x4b\x04\x2c\x97\xd9\x90\xe7\x85\x44\x11\x82\xe7\x19\x85\x0f\xcd\xf1\x8a\x19\x18\xf5\xd6\x39\xf9\x1e\xfa\x8b\x63\x97\x8c\xb9\x4e\x26\xc4\xcb\x04\xce\x6b\xbc\xe4\xc1\xb6\x88\x64\x87\x40\xf7\x16\x66\xa1\x80\x2c\x5f\xf4\xdc\xb6\xa4\x3a\xfd\x71\xcf\x27\xe9\x19\x1e\xa9\x9b\x60\x6c\xd8\x60\xfe\x34\xa6\x28\xab\x55\x70\x26\xbc\xe4\x40\xfa\x1b\x2d\x1f\xaa\xc0\x97\x55\xe4\x55\x1a\x9e\xb4\xf6\x85\xb1\xe6\x94\xf2\xbe\x4e\xfb\xe2\x5a\xee\x0e\xe8\x56\xdb\x92\xfb\x61\xa7\xdb\x47\xaf\xb3\x4b\x33\x7e\xb3\x73\x47\x9d\x4d\xbc\xa2\x7a\xf1\x05\x29\xb8\x4c\x83\xa8\x78\x65\x61\x54\xb7\x6a\xc5\x6e\x48\x23\x70\xd0\x09\x90\x72\xa0\x63\xab\xb1\x49\x1a\xca\x5c\xc9\x00\x3e\x5c\x9f\x2f\x6e\x14\x4a\x58\xa4\xa4\x53\xf2\x47\xf7\xd4\xdf\x49\x0e\xb4\xae\xd4\xeb\x86\xab\x88\x3e\x16\x00\x45\xfa\x72\x15\xc9\x2b\x24\xce\xe5\x9c\x2f\x12\xa9\x00\xdf\xd9\x60\xca\x23\x96\xc8\x0a\x36\xcb\x74\x02\x63\xe0\x46\x58\xf0\xa5\xb1\x30\x3c\x10\x10\xe4\xd1\x05\xc8\x68\x44\x44\xf1\x13\x78\xbd\x41\xda\x56\xc8\xdc\xc9\xcb\x53\xe6\xc0\xee\xe5\x80\x36\x2c\x2d\x25\xcd\x90\x28\xdf\x40\x99\x7a\x0c\x9f\xde\xaa\x63\x10\xff\x24\x46\xf6\xdc\x65\x23\xe6\x4a\xc0\x9e\x2b\xdc\xfd\x29\x05\xca\x58\x40\x6d\x4a\x3d\x0d\x60\xf3\xaa\x51\xb5\x74\x09\xb8\xf4\xc0\xd6\x3f\xb9\x7c\xb6\xfb\x7a\x81\xb2\xa1\xd3\xca\xa4\x78\xa7\x4d\x87\x26\x6a\xe6\x69\xf3\x62\x31\x75\x10\xbd\xd8\xc3\x1e\x29\xe0\x7d\x5d\x87\xef\xf8\x22\xf3\x47\x51\x90\xaf\xc2\x19\xca\xde\x37\x55\xef\x29\x54\xc3\xa4\xb1\xd4\x62\x1a\xbe\x01\x4d\x4f\xc9\x60\xe1\x45\xc4\x74\xfb\x9c\xf0\x49\x80\xeb\xb6\x87\x65\x00\x9d\x33\xba\xb6\x58\x1f\x2b\x1f\x3a\xde\xb2\x44\x80\x61\xfa\x64\x44\x75\x7d\xeb\xa6\x13\x40\xe0\x6a\x58\x7e\xa9\x52\xf0\x17\x09\x8f\x9f\xfe\x7b\x7f\xe8\xe7\x7f\xec\x2f\xff\x37\xff\xbb\xff\xe3\xbf\xf2\x93\x7f\xf3\x6f\xfe\x63\xf6\x0f\xfe\x3b\x3f\xfa\x97\xfe\xe9\xbf\xf5\xbb\x7e\x35\xfe\xb7\xd3\x9f\xaa\xbf\xfb\x4f\xfe\x3f\xff\xf2\x07\x96\x96\xb2\x1a\x0c\xe0\x34\x2c\x4f\xc2\x8f\xf7\x8a\xe7\x66\x0a\x3c\xcf\xc3\xe6\x10\xa8\x32\x61\x8f\xe2\x6c\x53\x5d\x64\xb6\xcc\xb5\x2f\x98\x33\xfe\x64\x8d\xaa\x24\x65\xc7\xbe\x38\xe5\x77\xd5\x4b\x97\x0c\x32\x8e\x15\x4c\x87\xa3\xa2\x95\x26\x91\xaf\x43\x1c\xd8\xe9\xe5\x37\x3b\x31\xb4\xc2\xa1\xfa\x3e\x15\x2b\x6c\x29\xa7\x0f\x37\xd8\x1e\x71\xdb\x30\x2f\xc4\x19\x8d\x0a\xf7\x0d\x9a\xf5\x2c\xca\xcb\xeb\x8c\xfe\x8b\x80\xb5\xa7\xda\x24\x96\x1c\x4d\x32\x5a\xa2\xed\xc3\x80\x79\x47\x48\x1d\x72\x76\xef\x51\x9a\x6c\x43\x04\x2b\xd4\xa3\xaa\x6a\x6e\xf9\x8b\x2b\xcb\x1c\x17\xa7\x9e\x62\x3a\xe0\x70\x20\xc7\xb6\xec\xdd\x54\x27\xb5\xe0\x2d\x55\x78\xe3\xe5\xef\xd0\x62\xca\x20\x2c\xcf\x6d\xa4\x05\xbf\xd8\x95\x2a\x11\x19\xef\x49\xef\x50\xde\xc1\xdf\xe3\x22\x12\x26\x40\x19\xc7\x88\x6e\x95\x08\xf7\xa2\x2e\x87\xfa\xbc\xce\x59\xe3\x90\x05\x5f\xc8\xe9\x88\x4b\xe0\x31\xeb\xd2\x3c\x06\x4a\x84\x6c\x87\xc7\xf2\xad\xcf\xca\xd1\xc9\xfa\x76\x90\xe8\x0c\x6a\xf3\xb3\x01\xa3\xce\xf7\x2f\xa0\x03\xef\x8f\xe9\x02\xd5\xe3\x8f\x28\x1a\xa8\x8e\x9b\x8c\x6f\x6d\xe0\xbd\xbd\x99\x73\xcd\x03\x24\xb2\x0d\x2c\x94\xe4\x5e\x12\xc6\x06\xbf\x28\x73\xb7\xf7\x65\xe1\x80\xaf\xbb\x92\x45\x58\x52\x67\xdb\x41\x1f\x62\x37\x0f\xda\x02\x63\xd7\x91\xd2\xcf\xd2\x3b\xda\xb9\xf7\xa4\xed\x8b\x41\x15\xbe\xf8\x02\xcb\x95\xe8\x87\x11\xc3\x84\xa5\x3b\xbd\x53\x61\x3c\x9d\xb4\xc4\xe8\xe7\x09\x63\xd3\xe7\x51\x37\x24\x17\x9d\xd1\x5f\xc8\x2c\x59\x8c\x80\x67\x4c\xe8\x5c\xf3\x58\xd6\x2b\x5f\x06\x21\x40\xb3\xe1\xa9\x6e\x35\x4d\x45\x81\x85\x3a\x83\x50\x3a\xc1\x67\x21\xfa\x89\x0f\x9d\x1e\xb7\x8e\x2c\x44\xca\x9e\xce\xe3\xf6\x3a\x8b\x3e\x19\x1d\xa3\x2c\x32\xd7\x1a\xa1\x21\xee\x25\xc2\x25\x98\xf7\x5a\x1c\x06\xbe\xd0\x1f\x4d\x92\x6c\xd4\xa6\x36\xed\xe5\x5e\x14\x84\x27\x50\x16\x4b\xd3\xae\x23\xdd\x73\xbe\xb9\x8d\x46\x36\x99\xb7\x04\x05\x50\xff\xc6\xf6\x55\x49\x84\x3d\x0f\x9b\x1c\xb2\xd0\xcd\x37\x33\xbd\x1f\xd7\x12\xa1\xde\xa6\xad\x17\x74\x71\xb9\x6d\xf6\x5e\xf1\x35\x28\xe4\x26\xbf\x80\x0e\xc3\x66\x8c\x4b\x56\xae\xb5\xcd\x6a\x11\xf7\x19\x95\x8f\x4b\x72\x2e\x31\x4a\x63\xed\xac\xbb\x35\xd7\x2f\xf0\x0b\x00\xe7\xf2\x17\x42\x79\xee\x9b\x12\xd4\x8d\x82\x46\x2d\x0d\xb7\x7b\x3c\x16\x0f\x0e\xb2\xea\x91\xc9\xee\x52\xec\x1e\x59\x15\x2e\x01\x55\x61\x43\xad\xc2\x2f\x08\x0f\x41\xf7\xf3\x18\x7e\x0b\x9a\xdc\x48\xc1\x5d\x0b\x47\x3d\x17\xdc\x72\x35\xb9\xe6\x05\x66\xce\x88\x8e\x48\xaa\x4c\xfe\x68\xd3\xbf\x00\x73\xcc\xe1\x38\x0a\x44\x14\x51\x9b\x56\x26\x0a\x33\x9b\x24\xee\x08\xf7\x9a\x58\x17\x74\x3c\x33\xf4\x53\x0e\x57\x5d\x91\x42\xa0\xe2\x9f\x28\xc2\x3a\x75\x32\xcb\xd0\x6d\x1b\x13\x79\x93\x50\xdf\x7d\x39\x0b\x8a\xe1\xaf\x86\x09\xb9\x45\xea\x71\xf3\xda\x5c\xb6\xa4\x97\x9d\x2f\x7e\x11\x98\xea\xb8\x81\x7b\xf1\x4e\xea\x82\x38\xb6\x91\x55\xfa\xbd\xca\x20\x1b\xdb\x28\x31\xc0\xe2\x15\x08\xf8\xf0\xa4\x71\x89\xf6\x13\x05\xe9\xad\x2a\xa8\xaa\x32\xb6\x16\x24\x0f\x7b\xf1\x34\x88\xfe\x70\x7c\x64\x84\xaa\xf4\x1a\xc8\x69\x98\x43\x8b\x63\xa9\xb5\x99\xc9\x3e\xa9\xe0\x55\x65\x53\x0e\xf2\xd7\xf2\xa4\xb8\x11\x1d\x35\xbf\x16\x26\xc0\xf1\x66\x1d\x67\x78\x5a\x89\x57\x81\xcc\x3c\x5b\x93\xa7\xc7\x2f\x6c\x1c\x33\x1e\xa5\x5d\x8a\x0f\xd7\x5c\x18\xd1\xfa\x60\x35\xa3\x0b\xf8\xbb\xb4\xd7\x02\x95\x97\x9c\xdd\x9e\x67\xea\x92\xdd\xf4\x29\x7f\x72\x28\x58\x93\x6b\x09\xd7\xaa\x21\x52\x56\x7d\xaf\xf1\xce\xee\x6b\x89\x00\x4c\x2d\x76\xa1\x17\x28\x26\x3d\x11\x59\xc1\x3d\xde\xa8\x5d\xbf\x98\xf8\xe4\xa3\x7c\xda\xb9\x0e\xf2\xdc\x56\xed\xd3\x88\x09\x3c\xc3\x3c\x81\x4e\x37\x15\xb6\xc3\xd1\x6b\xbf\xd9\x73\x73\x65\xb1\x8e\xdf\x4f\x34\x37\x94\x5a\x6e\x00\xe4\x3a\x98\x9a\x1f\xd4\xb0\x71\xbb\xcb\x04\x33\xd8\xf9\x8a\xe6\x84\xa9\x1a\xbf\xf4\x8d\x76\x8d\x78\xae\x75\x5f\x58\x9d\x60\xcb\xf8\x66\xd0\xb0\x28\x60\x58\x13\xf0\xbb\xc0\x0f\x75\xf4\x74\x17\x4a\xe0\x19\xdd\x34\x00\x85\x56\x48\x84\x1e\x41\xd1\xfe\xe4\x2e\x5f\x53\x0c\x33\xe8\x74\x62\x39\x98\x09\xf9\x3e\x3e\xb4\x5d\x7b\x13\x86\x73\x19\x4d\x4b\x92\x83\xbc\x95\x74\x40\x24\x08\x28\xf2\x5f\xcc\xe0\xcc\x1d\x8d\x15\x51\xcf\xc0\x59\xbd\x6c\x13\x4c\x84\x41\xef\xd1\x85\xb0\x65\x14\x0b\xd5\x9e\x84\x96\x39\x14\xc2\x41\x96\x79\xc6\x17\xab\x0c\x96\x36\x07\x11\xe2\x2a\x8a\x7d\x7d\x7d\x0a\xe7\x2e\x52\x23\xf3\x33\xb6\xcc\x97\xd8\x5e\x77\x44\xfe\x2a\x06\x8c\x0a\xa8\xdc\x4f\x14\xa4\x6b\xc9\xf4\x80\xc0\x20\x98\x96\x87\x10\x36\xd2\x6d\xbd\xc9\x8a\xf5\x66\x73\x7a\xae\x43\xdb\x53\x9e\x2e\x6d\xc8\x0a\xc7\x85\xe0\x27\x46\x3c\xcf\x80\x19\x06\x9a\x61\xc8\x42\x10\xd3\x27\x66\x28\x69\x9d\xb6\x86\xbc\x62\xed\xc5\x3c\x31\x6a\xd5\xbd\xa2\x84\xcd\x2e\x45\xfe\x65\x84\x07\xfe\xfb\x3f\x9b\x9f\x9f\xfb\xeb\xbf\xf3\x9f\xfd\x35\xf2\x7b\x7e\xff\x7f\xe5\xbf\xfc\x4f\xd7\xff\xe9\x57\xfd\xf4\xcf\xff\x1f\xfe\xff\xbf\xfb\x2f\xfe\xef\xff\xe5\xff\xfc\xbf\xfa\x5b\xfe\x23\x7f\xf2\x03\x85\x47\x78\x0e\x64\x9b\xac\xc4\xbc\x56\x26\x05\xe5\xb0\xf5\xb4\xa1\xb1\xd2\xb0\x31\x70\x8e\x19\x5d\xb3\x53\x7c\xd8\x75\x26\x70\x57\xbf\x60\x11\x21\x99\xe8\x3e\x10\x43\x62\xd4\x31\x43\xa5\x84\xd7\x2d\x46\xe2\x1f\xb0\xc3\x6a\xe1\x79\xb2\x6f\x15\xe9\x39\x64\x9a\xf1\xb9\x58\x7c\x01\xa3\xee\x9e\xea\xc0\x1d\xd4\x7d\x70\x75\x85\x09\xe4\x31\x71\x76\x11\xe7\xd4\xab\x58\x77\x20\x5f\x4c\xb0\x10\xcc\xc3\xba\x17\x8f\x9f\xa4\x24\xd4\xf5\x98\x5a\x19\x98\xba\xcc\xf8\xcc\x59\xd6\x1e\x89\xea\x89\x3b\x60\x21\xd1\x91\x6f\x22\x92\x09\x2c\x1a\xa3\x48\x76\x13\x3e\x79\xce\x0d\x79\xb8\x21\xea\x6f\xf5\xe5\xe1\x74\xcb\xde\xce\x6d\xac\x89\x2c\x6a\x26\x51\x0a\xce\x70\x05\x4e\xe0\x52\x99\xd4\x43\xc2\xf0\x85\x7f\x70\x82\x08\x1f\xda\x7d\x49\x82\x41\xb6\x69\x34\x74\x02\x93\x6c\x61\xc8\x5f\x2f\x08\xa4\xb4\xe8\x04\x65\xb3\x1b\xe1\xa2\x3c\x70\x5f\x14\x18\x42\xa9\x58\xd4\xdf\xe9\x07\xb5\x34\xd8\xe6\x93\x04\xb0\x6b\x3b\xd0\x80\x8f\x1a\xd3\x7a\xc2\x0d\xdb\x27\x83\xe9\xe4\x03\x8d\xf8\x62\x38\xc3\x5b\x45\xf6\x4c\x73\x99\xaa\xc3\x58\xbd\xd7\x99\x98\x31\x9e\xbc\x5a\x8c\x0f\x4a\xf0\xf5\x72\xfb\x19\x4d\x45\xb4\x51\x37\xfa\x17\x9a\x1b\xea\xe7\xc1\xa4\xa9\x30\x65\x33\xd3\xdb\x87\xaa\x88\x5e\xbc\x6f\x1c\xc2\xc4\x81\xac\x3d\x9a\x0d\x5e\xad\xe4\x2a\xe3\x33\xbe\x61\xda\xd7\x79\x85\x97\xaf\x78\x2b\xcb\xa8\x07\x1e\xef\x90\x22\xc6\x3d\x67\x93\xde\xa3\x5e\x0e\x1d\x89\x72\xd9\xf1\x04\x22\x53\xf3\xb8\x2f\xb4\x58\xaa\xaf\xbb\x4d\x78\x39\x6f\xc1\xde\x2a\xf1\xd8\xa6\xa3\xb6\x7c\x25\xa4\x3f\x44\xe3\x93\xd7\xb8\x3b\xf1\x6b\xcd\x50\x84\xe8\x2f\x8e\x26\xf3\x9b\x79\xe8\x69\x73\xf4\x4e\x63\xd6\x7b\x48\x9a\xda\x2b\xaa\x2e\xf6\xde\x40\xbc\x62\x3c\x8f\xb2\x8d\x31\xa4\x34\xe5\xb4\x3d\x5f\x0c\x67\x3c\xb6\x27\x67\x90\xeb\xed\xc8\xbf\x65\xdd\x97\x07\x14\x4b\xf6\xba\xb7\xe4\x27\x95\x0e\x95\xfa\x64\x5d\x53\x6d\xa0\x34\x8f\xcc\xfd\x82\xfc\x89\xbb\xc2\x75\x16\xf7\xb6\x34\x16\xf7\x8c\xbc\x70\x02\x13\xf2\x7b\xb7\x89\xa7\x78\xb0\x9f\x1d\x72\x1a\x28\x8a\x6d\xe5\x81\xee\x27\x27\xbd\xb5\x17\x6a\x9e\x81\x90\xbd\x0f\x61\xec\x3d\xf8\x15\x57\x18\x63\x56\x84\x90\x63\x7e\xc7\xa0\x8f\x9e\x8a\x4b\x52\x15\x92\x1e\x7e\x40\x59\x33\xc6\x98\x3f\x89\x1a\x3a\x51\xea\x40\x25\x86\x9e\x79\x98\xf5\xa5\xc5\x44\x9c\xe3\x99\xa9\x22\xc0\x0e\x59\xea\x72\xef\x7c\xac\xf8\x82\x6a\x20\xf4\xda\xac\x9f\xa4\x20\x64\x1b\x3c\x27\xe8\xcd\xb8\x0d\x5b\xdf\x0c\x51\xaa\xb1\xac\x09\x79\xf7\x71\xf9\xed\xa5\x1c\x86\xf7\x2f\x88\xb0\xb1\xbd\x69\x02\xdb\xfa\x12\x80\xd0\xf3\x94\x79\x2e\xef\x1c\xc9\xbe\x25\xd2\x65\x85\xe4\x92\x2d\xae\x00\xe0\x52\x38\xf7\x1b\xfd\x11\x0f\xf4\x20\xfd\x78\x53\xb0\x37\x2f\x0e\xdb\x3c\xef\x55\xbe\x6f\xb7\x23\x9c\xb7\x2e\x0f\xa5\x93\xf1\xf1\x8c\xf6\x78\x28\x25\x25\x7c\x51\x2f\x22\x7b\xf7\xab\x2b\x6e\x61\x7a\x01\x33\x67\xef\x9a\x1b\xf1\x4d\x26\x3b\x93\x32\x6e\xd6\x0f\xcf\xd4\xb9\x79\xbc\x93\x42\xae\x13\x3e\x20\x3c\xb8\xb3\xaf\x8e\x13\x65\xa9\x7b\x28\x21\x62\x4a\x9f\x64\x74\xd1\xfc\xe9\x3e\xba\xb5\xb5\xd8\xca\xef\x67\xc5\x37\x70\x2a\x55\xaa\xf2\x0b\x90\x8f\x28\x37\x72\xe3\xe7\x16\xf0\x3a\x2c\xd8\x30\x47\x94\x31\x5b\xb9\xc5\xf0\x50\x28\x65\xfd\x26\xa3\x76\x9e\xb1\xb8\xac\xf3\xf3\x85\x81\x82\xab\xc7\x08\x27\xed\xe3\x42\xa1\x31\x9f\x46\xdd\x5c\x6f\xea\xbc\x49\xf4\xca\x67\x23\x7a\x83\x2b\x4d\x72\x17\xc7\x50\x9d\x49\xcd\xbe\xc8\xfc\x81\xbd\x0d\xb3\xad\x34\x4e\x5d\xc8\xc6\x4b\x1c\x85\xbc\x12\x92\x86\xb4\xc2\x28\x67\xca\x3c\xe5\x71\x54\x85\xbd\xed\x90\x68\xf9\x4f\x6c\x1c\xc9\x22\x84\x5e\xc2\x26\xc9\x88\x77\xce\x72\x48\x2d\xce\x72\x06\xb6\x56\xb3\x8c\x4b\x6d\x5b\xb1\xa1\xda\x9b\xc0\x93\x27\x0e\x5f\x84\xe5\xcf\x42\xc0\xd3\xcf\xc4\xc3\x94\x81\x54\xce\xaf\x4a\x09\x8c\x07\x5c\x89\xcd\xab\x5b\x8f\xd1\x9c\x33\x86\x5b\x40\xa2\x6e\xb5\x3d\x5f\xac\x81\xd7\xfb\x43\x2d\xc0\x5a\xc9\x7b\xd3\x0e\xb0\xa3\xc2\x3a\xbd\x93\xa4\x0e\x6e\xb4\x8f\x19\x46\x6d\xc5\xa0\x3b\xce\x5c\x55\x73\x1f\x5f\xf4\xd4\x2c\x9a\xd8\x0b\x03\xe3\x16\x5d\xeb\xc5\xc6\x89\xeb\x26\x8c\x8b\xd2\xda\x33\x49\xda\xc8\x05\x5e\x8b\x79\x4a\x6d\x3d\xa0\xbe\x5f\x1c\x90\x66\x0c\xdf\xf7\xe1\x10\x44\x87\x96\x6a\x06\xe4\xc2\xf6\xae\x43\xe5\x3d\xe9\x16\xfa\x50\xb1\x75\xac\x0c\xef\x64\x69\xdf\x75\xe1\x4f\xac\x91\xc5\xb8\x03\x55\xd9\x71\x3d\xb8\x0d\xf1\x0c\x4e\x04\x93\xb5\xcf\x54\xd5\x16\x79\xb8\x68\x65\xba\x94\x73\x1d\x2d\x3b\x3a\xcf\xf8\xc5\x72\xc9\x8f\xd7\xb2\xee\xb7\x7d\xdd\xe3\x51\xbb\xab\x3c\x95\x14\xaa\x15\x89\x8f\x8c\x2c\x49\x40\x5f\x5d\x8b\xc7\x0c\x92\xf7\x44\x01\xbf\xf8\x52\x19\xa8\xaf\xd5\x4a\x65\xf7\x18\xb4\xcd\x2c\x29\xbb\x56\x1d\x25\x17\x31\x21\xb6\x6a\x6f\x70\xa0\x4c\xb8\x1a\xa4\x6b\x97\x03\xe3\x2f\x31\x74\xff\x22\xe1\xf1\x53\x7f\xeb\xa7\xff\xc0\xaf\xfb\x8f\xfe\xb1\x9f\xfc\x0f\xa6\xff\xcd\xbf\xf4\x97\xf0\xaf\xf9\x5b\x7f\xea\xfd\xf3\xbf\xf7\x67\x7f\xd3\x7f\xfd\x57\xff\x95\xdf\xf4\xeb\xff\xc6\x4f\xfd\x17\xff\xee\xff\xf5\x03\x85\x87\xbf\x10\x0c\x69\x4c\xbe\x4e\xab\x9c\xed\x42\x08\xfa\x34\xfa\x8d\x7b\xf2\x18\xaa\xcc\x75\x19\xaa\xad\xe2\xb6\xa7\x41\x40\x18\x9f\x48\x4e\x6b\x0e\x42\x54\x9b\x9d\xc7\x90\xb7\x5a\xca\xbd\x65\x8f\x4a\x22\x28\xac\x1d\x33\x20\x5c\x3f\x74\x25\xca\xde\x60\x4f\x80\xa9\x7e\xc1\xeb\x32\x8f\x50\xab\x80\xe4\x46\xf7\xf1\x02\xeb\x69\xfa\x3e\x6c\x41\x10\x84\xf5\x34\xb4\x07\x0f\xc5\x5f\xd0\xd4\x13\xe8\xae\x27\xf4\x2f\x0c\x14\x60\x5d\x40\xe1\xdd\x88\x81\x08\xc3\x24\xa0\xd5\xf1\x32\xe8\x17\xc0\x25\x3a\x72\x2b\x31\x79\xeb\xa2\x3b\x4f\x89\x08\xb3\xf1\x27\xb7\x1f\x26\x8b\x46\xbb\xc1\x01\x2e\x8f\xbd\xf0\x25\xa3\x3d\x82\x9b\x37\x18\xf1\xf4\x78\xc6\xda\x8c\xcf\x24\xf5\x7d\xfc\xc9\x7a\x01\xf7\x89\x78\x6b\x40\xc6\x2a\x7f\x89\xaa\x69\x38\x02\xb3\x01\x3c\xee\xc2\x11\x31\x66\xe1\xd3\xa2\x96\xba\x90\x79\x17\x68\x6c\xa8\xfd\x8e\xf1\xc5\xd9\x38\xbe\x2d\xe7\xd0\xd7\x6b\x60\xb9\xb2\x83\x46\x1c\xed\x34\x4a\x95\xb5\x08\x48\x76\x42\x4c\xae\x36\x11\x2c\x4f\xf7\x2f\x73\xef\xe3\xbf\x80\x51\x53\x68\x38\x13\x0e\x56\xe3\xd9\xf2\xb9\x41\x01\x85\x2b\x53\x33\x3c\x4c\xb7\xbd\xac\x0c\x72\xb7\x84\x4d\x7e\x96\xe7\x63\xfa\x4f\x82\x7d\xe1\xce\x66\xa0\x2e\x35\xce\xcd\x0f\xb7\xda\x7a\x34\x7d\x37\x93\x39\x3c\x00\xe7\x4e\x19\xb9\xbc\x29\x50\xea\x73\x8d\xbe\x01\x7f\xe1\x00\xe7\x8a\x3c\xbd\x45\x9a\x90\xae\x35\xd9\x70\xd3\xbd\x8b\x30\xec\xb2\xc7\x08\xcb\x00\x62\xbc\x2f\x9c\xc1\x1d\xd5\xab\x82\x82\xaa\x2f\xac\x0b\x4c\x86\x27\x76\x70\x44\x78\x2f\xe8\xd5\x5c\xeb\x38\xf7\xee\x29\xcf\x72\x9b\xef\xf1\x3e\x28\xb9\x07\xb1\x39\xda\x4d\xe7\x6e\xb7\xda\x17\xd6\x85\xbc\xc0\x5d\xbd\x2c\x5d\x93\xac\x69\x0b\x78\x01\x33\xa3\x2a\xe7\xc4\xb0\x73\xdf\xa4\xe9\xee\xbb\x24\x95\x46\x75\x33\x93\xf1\x85\xb1\x86\x45\xaf\x8b\xd4\xd3\x2f\x04\x36\xc8\xc2\xd4\x44\x53\x3e\xfe\x71\xe9\x79\xc4\x9b\x57\x17\xf7\x51\x32\x59\xe8\xd6\x62\xbb\x0c\xfb\x49\xe6\x0f\x76\x50\x58\xe1\x88\x89\xc8\xf5\xbb\x59\x2e\xe2\x15\xd0\x22\x40\x11\xaa\xbc\x61\xdc\x6c\x62\x98\xd6\x85\x5b\x0e\x00\x76\x2a\xbe\xf8\x5f\xb0\x26\xbd\xea\x69\x6d\xf5\x6c\x2d\x75\x4c\x1a\x62\x1b\x56\x2a\x68\x96\xba\xb1\x2a\x0b\x38\xef\x75\x7e\x7b\x06\x2b\x8e\x2a\xeb\x17\xa1\x62\x9d\x6c\x92\x69\x63\x3a\x53\x1f\xf2\x14\xe9\x55\x27\x72\x76\x10\x7e\x24\x22\xbb\xac\x13\xc0\xea\xef\x18\xcf\x78\x55\xc0\xeb\xb6\x4f\x74\x69\x99\x47\x20\x00\x21\x09\x3f\x42\xfb\x37\x50\x03\x91\x35\x82\x83\xa6\xc7\x0e\x20\x73\x33\xf8\x6c\x47\xcc\x7c\x98\x78\x0a\x3f\x5f\x54\xf0\x3a\x05\x12\x54\xa7\xe2\x2c\x11\x52\x79\x1a\x98\x69\x22\x72\x81\x4b\x85\x21\xbf\x97\x91\x10\xbd\x66\xad\x09\x68\x53\x0c\xa1\x7f\x61\x69\x01\x98\x3e\xda\x1c\x73\x5d\xaf\x33\x48\x76\x27\xd4\x3d\x53\x51\xb5\xd9\x5a\x5c\x5b\x98\x5b\x09\x3e\x40\x5e\x67\x5c\x61\x2b\xb8\x2f\x0e\x48\x5f\x5b\x02\xd4\x59\x65\x29\x0c\x15\x3e\x0b\x51\x68\xc4\xd9\xc3\xd7\xf4\x8b\xd5\xe2\x63\x31\x24\xce\x8c\x97\x24\xa6\x94\xb4\xfd\x8b\xa1\xdd\x51\x8f\xc9\x1a\x06\xf4\xf2\x8a\xc0\x9e\x66\x2a\x2b\xf3\x55\x0f\x9f\x89\xc2\x4b\x78\xcd\x17\x63\xb9\x71\x7e\xe3\x6b\x9b\x16\xee\x8b\xcc\x9f\x13\x95\x48\x27\xba\xbe\x04\x92\x0d\xef\x59\x1f\xfc\x26\x07\x72\x1c\x37\x43\xae\x87\xc2\xb0\x41\xbe\x94\xf7\xf8\xbe\x8c\x46\xf0\x85\x1d\x90\xf6\x32\xc0\x8e\x90\xbc\x9b\x81\x62\x71\x33\xfd\xc9\x7c\x30\x6d\x92\x9b\x65\x70\x7f\x19\x99\xa7\x33\x5e\x5c\x26\x1e\xdb\x5a\xbf\x48\xdb\xc9\x74\xe3\x06\x44\xf5\xcc\x16\xd8\x5b\x46\xee\x8d\x81\xe0\x4b\xe1\x59\x56\x8b\xf4\xe0\xd9\xb8\x7e\x9f\x40\xee\x4b\x48\xae\xa0\x7e\xa1\xb2\x56\xd1\xbd\x58\x33\x4f\x02\x98\x73\x1c\xb2\xf3\x63\x9b\xdc\x1a\x89\xb5\x1f\x16\x45\xa2\xa2\x80\x54\x0d\xe0\xb0\x55\xf2\x5e\xff\x49\x86\x07\xce\x46\x76\x0d\x24\x17\x67\xdc\x1c\x2c\x91\xab\xe0\xcb\x13\x2d\xfb\xe2\x83\x12\x49\xe3\xc5\xc4\xb6\x42\xe6\x31\x0c\x85\xe7\x0b\xd3\x00\x8b\xce\xf2\x0a\x6b\xcd\x21\x25\xe8\x10\x6b\x83\xe1\x51\x44\x8f\x3c\x87\x13\xfd\xdb\x8a\x3b\xd5\x4e\x21\x84\x9a\x65\xbd\x0c\x7f\xd2\xd9\x5f\xb0\x70\x5e\x06\xb5\x9a\x3c\xf1\x68\xd6\x85\x48\x88\x08\xc8\xd9\xae\x3c\x16\x23\xce\x03\x15\x4f\xde\xd1\xa5\x8d\x6f\x42\xfc\x13\xfd\x91\x65\xe3\x15\x6d\xdb\x85\xa1\x7f\x84\x2f\xeb\x80\x84\x7c\xd8\xd1\x67\xdd\x97\xe1\x63\x55\xaa\x4f\x2b\x9b\xe2\x1b\x3c\xc6\xfd\x0b\x84\xf8\x14\x03\xdd\x0c\xc3\x6c\xed\x0d\xe2\x69\x95\xcc\x14\x0d\xd6\xe4\x99\x14\x85\xca\x5f\x94\x6f\xeb\xe4\x50\x1f\x07\xaa\x5c\x9d\x4f\x08\x8f\xe8\x5c\xaa\x31\xea\x75\x7b\x10\xfa\x2d\x91\x06\x38\xb4\x45\xf5\x00\x1e\xc7\x46\x4c\x5a\xea\x5f\xbb\xcc\xde\x24\x1b\x04\xd8\x17\xeb\x3e\x67\x68\x06\xa1\x10\x7c\x1c\x68\xe7\xe4\xd9\xf5\x64\xed\x25\x64\x6d\xc9\x76\x8a\x37\xc4\x5e\x6b\x88\x41\x46\x9f\x80\x0f\x6f\xfc\xe5\x67\x69\x7f\xff\xff\xec\xdf\xf7\x57\x7f\xec\xf7\x99\x1f\xff\x95\xbf\xe1\x27\xed\x9f\xf9\x27\xff\xa1\xff\xe3\x6f\xfc\x17\xfe\x53\xff\xf3\xbf\xf0\x7f\xf9\x4f\xfc\xe8\x9f\xff\xaf\xfd\xfd\x3f\xfc\xdb\xff\x11\xfb\xf1\x0f\x14\x1e\x43\x29\x2b\x8c\x5f\x63\x49\x33\x1e\xe6\x01\x41\x59\x9f\x28\xdf\x1c\x0e\x20\xfa\x09\x57\x1f\x64\x4c\xc4\x15\x32\xb9\x38\x80\xf2\x8b\x87\xf4\x46\x8d\x91\x10\xa7\xdc\xe8\x8a\xa3\xab\x48\x2f\xdf\xa8\xcb\x9d\xae\xb9\x9b\xb0\xad\x14\x01\x60\x7c\xf2\xca\x46\xe4\x84\x8d\x5f\x30\xed\xe4\x70\x52\xf8\x59\x09\xc8\xfb\x28\xd6\x72\xf0\x0b\xb1\xbe\x2d\x74\xd8\xd9\x07\x09\x97\xb9\x6b\x8c\x84\xeb\xf3\x73\x0a\xdc\xee\x8b\xcd\x1c\xb8\x2f\xa0\xcf\x9b\xaa\x52\x6a\x19\x20\xb5\xf0\x85\xdf\x1c\x65\x6d\xb6\xc6\x97\x8d\xc1\xcb\xe2\xe6\x12\xd8\xe8\x51\xe3\x51\xf7\x8b\x6d\xd4\x62\x9d\x7a\x63\xf1\xcd\x6e\x4f\xbb\x2a\x6b\x8f\x92\x53\xf9\x28\x3d\x67\x07\x98\x27\x49\xc4\xea\x35\x0f\x4f\x55\x9b\x4c\xe8\x17\x1b\x18\x26\xd6\x21\xb8\xd9\x2b\xc4\x8e\x08\x0d\x61\xd0\x5c\x13\x33\x15\x9f\x57\x16\xe6\x9e\xab\x16\x85\x83\x11\x05\x88\xbf\xf0\xf5\x7e\x7c\xe1\x7a\xae\x40\x76\x3f\x18\x96\x6c\x87\xb6\x9d\xa7\x47\x20\x23\x81\x38\xe2\xf1\xbc\x86\x92\x25\x35\x87\x10\xd0\xc4\x3c\x2f\x24\xa5\xd6\x4f\x3c\x73\x4f\x70\xdb\xce\xb0\x75\x73\xec\x7a\x37\x53\x1e\xde\x6a\x82\x83\x20\xcf\x8a\xcd\x6a\x2c\xc0\xc9\x83\xeb\x78\xdd\x2e\x01\x7e\x91\x5f\xce\x7d\x0d\xf5\x04\x62\x86\xd9\xbb\xdb\x90\x1a\xa8\xa8\xa0\xf7\x8e\xe3\x6e\x76\x94\x53\xcc\xc6\x7e\x7d\x86\xdc\x05\xd9\x67\xcf\xe7\x0b\x82\x34\x77\x7f\x45\x54\xfc\xe8\xe5\x24\x79\xa5\xf1\xa6\x82\xd8\xfb\x80\x3c\xe9\xc3\x23\x1f\xe9\x76\x30\x5f\xe6\x12\x1e\xd1\x2b\xf0\x89\x8b\xb1\x7b\x16\xba\x7c\x51\xb7\xe7\x5e\xbc\x36\x59\x58\xdd\x42\xb3\x2f\x84\xdf\xbd\xf2\x75\xa9\x55\x88\x48\x82\x69\xd7\x22\x0b\x6e\x5f\x58\xe0\xa6\x6e\x95\xcf\x19\x6d\x61\x8f\xea\xa7\xa9\x4d\xe7\x03\x3a\x3f\xd9\x0c\x67\x4d\x7c\xb9\xf3\x35\x18\xee\xe7\x92\x10\xf0\xc7\x7c\x72\x95\x5d\x8f\x27\x52\x83\xfa\x04\x8b\xac\x97\x4c\x06\x61\xb5\xaf\xb7\xa4\xbc\x66\xfb\xc7\x3d\xb7\x92\xd6\x9a\x75\xb7\x0c\x75\xc6\xf3\xb8\x2f\x72\x6e\x22\x47\xcc\xc8\x00\x5a\xb1\x98\x3e\xcb\xf8\x65\x04\xb1\x5a\xcc\xb2\x3d\xc1\xe2\xed\x12\x09\x4a\x13\x6e\xc2\x24\x99\xf4\x52\x9f\x24\x46\x80\x57\x56\x3e\xcd\x9a\x01\x1e\x50\x3d\xf0\xa1\x0f\x8a\xb6\x84\x13\xbc\xcf\x8e\x5c\x58\x2f\xf8\x2c\x9c\xf6\x2d\x4f\xb5\xc9\x87\x2f\xb4\x58\x61\xda\xb7\x74\x43\x8e\xb1\x98\x40\xb7\x0a\x22\x27\x6d\xf8\x42\x5f\xc6\xc4\x6b\x3c\x5d\xda\x07\x02\xf3\xb6\x28\x2a\x2b\xdd\xf0\x2f\x00\x8c\xd0\xe0\x7d\x2d\x5d\x59\xa1\x05\x05\xd3\x4b\x2e\x15\x3d\x02\x54\xe9\xba\x4d\xde\x30\xe0\xf9\xf2\xd4\x74\xae\x11\x61\xa4\xfa\x27\xb1\xd3\xfd\x05\xad\x07\xbf\x32\x30\x24\x91\x67\x88\x6c\xe3\x5a\x88\x7b\xb4\x18\x7f\xe3\xd9\x67\x3b\xfe\x66\x14\x85\x6d\x10\x5a\xad\xe0\x17\x09\x33\xbe\xa0\x99\x01\x07\x17\xae\x3d\x94\xc0\x31\xbe\x14\xbd\x37\x3c\xad\x94\x54\x53\x4d\x6c\xaa\x6b\x5e\x79\x6c\xba\xd1\x9e\xb3\xfd\x17\x30\x4a\xf9\x17\xbc\x38\x75\xec\xd3\xa1\x65\xc8\xca\x57\x2a\x57\xd8\x17\x62\x1a\x7a\x85\x60\xe7\x48\x61\x4a\x58\x57\x48\x05\xc7\x9f\x64\x35\xf0\xa5\xae\xc6\x12\x77\x42\x65\x27\xc7\xd6\x33\x34\x0f\x61\xe0\xcc\x75\xea\x50\x19\x86\x40\x60\x3a\xe5\xeb\x96\xa3\x56\x5d\x2c\x3f\xb9\xde\xf3\x8c\x4b\x37\xbd\xb1\x07\xfd\xaa\x06\xe6\x78\x98\x3c\x27\xde\xc8\x98\x09\xed\x2c\x95\x34\x94\x1e\xf2\x28\x67\x8d\x25\xeb\x4f\x4e\x6e\xbe\xc9\x74\xab\xe1\x1b\xe2\xb4\x04\x19\x74\x11\x79\xed\xcb\x65\x34\x66\x50\xad\xe6\x8b\x46\xf3\x2c\x4c\x8d\x8e\x4f\xc1\x6e\x29\xbe\x90\xeb\x6f\xe9\xd0\x12\xee\xe9\x13\xe3\xea\xa8\x37\x9d\x21\x65\x43\x2a\x78\x17\x61\x36\xf5\xb8\x9c\x72\xb6\x92\x92\x73\x72\xab\xf3\xe0\x0b\x52\xb0\xba\x87\xcc\x43\xc8\x06\x3a\x41\x39\x8b\xae\x13\x10\xd8\x83\x9d\x54\xf1\xf6\x34\x78\xd6\xf1\x85\x5c\x22\x0f\xb3\x22\xe5\xf5\x49\x2e\x56\x53\xb3\x20\x56\xed\xd5\x89\x72\x80\x0d\x4d\x91\x34\x24\x9e\x74\xc1\xe6\x93\x11\x44\x62\x02\x21\x06\xd0\x05\x89\xe9\x45\xe3\x7e\xa1\x9a\x44\x77\x9d\xb9\xa9\xa2\xba\xbc\xe4\x00\x3b\xbb\x99\xc0\xc4\x17\xc0\xc8\xdf\x1d\x2f\xda\x06\xac\xb6\xbd\x11\x59\x6c\xb4\xcb\xd3\xbf\x20\xc2\xa0\xbf\x38\x6a\x35\x9e\x83\x0b\xca\x43\x7b\x76\x6e\xa5\xaa\xeb\xea\x0d\x50\xc4\x8d\x17\x14\xa8\x38\xc4\xfd\xc5\x18\x3e\x5c\xd6\x4f\xb2\x5d\xd6\xda\x7c\x0d\x61\xf5\xd8\xde\x36\x65\x22\x68\x1d\x90\x8a\x9c\x86\xd0\x6b\xdd\xdb\xf1\x46\x1c\x6e\x1a\x08\xf0\x0c\x86\xda\x17\x0b\x58\xa8\x60\x58\xb9\x75\x7b\x71\xd8\x1c\x68\x1b\xc4\x19\x6e\x92\x02\x76\x60\x09\x4a\x1d\x06\x74\xb3\x8c\x74\x6a\x2f\xaf\xc7\x90\x7d\x81\x53\x23\xe8\xa9\xda\xa6\xdf\x1b\x67\x13\x68\xf2\x15\x1b\xca\x25\x52\xd2\x26\x28\x12\xca\x7a\x07\x09\x4f\x0e\x3d\xf9\x77\x1c\x73\x3e\xc1\xa9\x22\x0c\xb0\x49\xef\x2b\x30\x21\xa5\x17\x5e\x08\x35\x36\x1d\x89\xa6\xd5\xdf\x42\xb5\xf4\x6b\xe3\x05\xbd\xd8\xb1\x2a\xda\xe7\x2f\x49\x79\xfc\x45\xc2\xe3\x7f\xfd\x67\xff\xc9\xdf\xfd\x91\xff\x17\xfc\x37\x7f\xfe\x0f\xff\xdd\x1f\xf9\xd9\x3f\xf3\x7f\xff\x99\xdf\xf6\x2b\xfe\xfa\x8f\xfd\x0f\xff\xce\x3f\xfc\x73\x7f\xfa\x2f\xfe\xb1\xff\xf7\x7f\xe9\x6f\xfc\x4f\x7e\xed\x07\x84\x47\x02\x6e\xcb\xa6\xd5\x15\x11\xa7\xc5\x8b\xb9\xa3\x0f\xf6\xc3\x67\x15\xf5\x9a\x4a\x48\xf3\xde\x58\x14\x17\xaa\x21\xb0\xef\xbb\xbe\x70\x74\xf2\x01\x04\xf3\x28\x51\xc3\x67\xb9\x9d\x19\x49\xa4\xd6\xd7\x6f\x58\x02\x28\x57\x35\x32\x5e\xce\xac\x8f\x18\x8d\xb7\xe7\x55\x29\xfc\x62\x0f\x34\x00\x4e\x43\x59\x6d\xf3\x2b\xb2\xd0\x5b\x38\x3b\xd8\x41\x71\x71\xd7\x1d\x93\xeb\xb4\x5e\x4a\x7a\xdd\xc4\x2f\x24\xbc\xb1\xf1\xc5\x79\x30\x7e\x46\xef\xef\x6b\x1e\x41\xa3\xdd\x48\x2c\x6b\x8c\xd1\xd0\xf1\x8c\xc6\x01\x19\xae\xe2\xdf\xa6\x20\xf3\x29\x2e\x22\x61\x9c\xb8\x7e\x22\xa7\xa3\x4d\x13\x1e\x42\x21\xdb\x40\x6d\xc6\x35\xe0\x09\xc6\xcf\xb7\x96\xf5\xb4\x80\x9a\x56\xfd\xf1\x5c\x76\x1a\x5a\xcb\xb2\xe1\x4f\x38\xee\x30\xc4\xb9\xef\xc3\x7c\xb1\x29\x08\x8f\x47\x0b\x1c\x8d\x46\x25\xda\xc6\xec\xc8\xea\x78\x8a\x79\x08\x20\x50\xc6\x44\xa7\x2c\x9f\xec\x3e\x84\xe8\xaf\xa5\xe4\x2e\x83\xc9\xc0\xe9\x44\x8e\xeb\x3d\xa7\xe9\xb2\x6f\xc8\xa8\x90\x32\x85\x4b\x80\x3e\x8e\x88\x5c\xb0\x7e\xbe\x10\xca\xf3\xb7\x60\x69\xfb\x78\x27\x10\x06\xa4\x50\x31\x2f\x39\xfb\xeb\x92\x24\x7b\xc5\xca\x88\x04\xb0\x3e\x08\xb8\x81\x2d\x7a\x4d\x27\x5f\xc4\x79\x31\x78\x75\x4b\x10\xa2\xf5\x3c\x00\xcd\xbd\x1c\x45\xf7\x9a\xbb\x38\xb7\x98\xfe\x3b\xb4\xfd\x79\xf0\x87\x5d\x56\x17\x06\xe2\xe0\x0c\x3a\x11\xa3\x42\x26\x3d\x41\xd1\x88\xd2\xc8\x38\x01\xef\xbd\xcf\xbd\x18\xc7\xdd\x24\x6a\x80\x02\x13\x90\x1e\x60\xe0\xee\xfb\xf3\xdc\xf5\xb9\x0b\x8b\x42\x23\x36\x0c\x4c\x43\xac\xb0\x8e\x6c\xcd\x1e\x10\x3a\xca\x16\x63\x44\x18\x1c\xc3\x22\x34\x0e\x19\x64\xc0\x74\x09\x34\x4b\xd8\x94\x45\x1a\xec\x66\xea\xe5\x85\xca\x5b\xc5\x54\x59\x35\x79\x9f\x3f\x7f\x55\xe7\x57\x75\xbe\xf7\xb9\xf7\x9e\xf3\xf9\x9c\xcf\x39\xd7\xcf\xa0\x78\x9c\xe3\x10\xf7\x45\x75\x87\xd8\xcc\xb6\x9e\x00\x73\x26\x00\x9b\x92\xaf\x42\x79\x1a\xe8\xbd\xd8\xa0\x56\x45\x42\x8f\xe9\x57\xb0\x28\x9e\x51\x41\x2f\x1c\xbb\x7b\x41\xe1\x5a\x03\x3d\xd1\xe9\xcb\x8a\xca\x73\xa4\x33\xba\x44\x06\xd3\x8c\xaa\x8b\x6a\x59\xe6\xbe\x10\x85\x4e\xf4\xe0\x94\x3b\x7a\xa7\x29\xd4\x75\xce\xc8\x26\x6f\x4f\x10\x1e\xc7\x95\xaa\x9c\xc5\x86\x99\x4a\x33\xfd\x08\x5c\xc0\xb0\x1d\x3c\x37\x3f\x52\x8c\x4e\x29\x07\x6a\xea\x0b\x51\xb9\xdd\x32\xe3\xca\x4f\x88\x80\xd5\xca\x39\xe7\x2a\xf2\x30\x37\x1f\x0c\x5a\xcd\x08\x6a\xe8\x5c\x4a\x48\xda\xa0\x75\x2a\xb1\xdd\x2d\x8a\x17\x93\xb8\x0e\xe3\xe8\x13\x34\xed\x09\x69\xce\xa0\x21\x16\x04\x30\x64\xd9\xeb\xba\x7c\x5e\xe7\x1c\x88\x5f\x52\x80\x1b\x24\x0e\x6e\x6a\x37\x0a\x16\xfa\x6c\xcc\xa6\x4f\xa8\x1a\x4e\x5a\xa0\xca\x7e\x1d\xf7\x79\x07\xe9\x77\x5a\x60\x32\xa4\xc7\x11\x28\x37\x56\xc1\xa4\xb5\x9e\xa2\x43\x77\x27\x07\x17\x99\xc4\x3f\xd1\x7b\x1d\x81\xce\x32\xb5\x24\x86\xd2\x7b\x8a\x03\xee\x8c\xf8\x5a\xf6\xec\x7b\x95\x61\x76\x32\x57\xc8\x7e\x47\x54\xc2\xbd\x89\x06\x57\x7d\x66\x08\xe1\x8a\xdb\x0e\x6e\x39\x53\x47\x4e\x23\x02\xd6\x95\xae\xea\x2e\x04\x81\xdc\x80\x96\x96\x32\x70\x9f\x69\x60\x29\x94\xf4\xe9\x91\xe7\xcd\x31\x67\xb3\x9f\x27\xb3\x30\x84\x28\x30\xc4\x00\xdf\xeb\x3e\xd6\xf0\xb0\xce\x5e\x66\xe1\x21\x42\xce\x12\x98\x0b\x8f\x06\x66\xd8\x4f\x44\x33\x54\x30\xbe\x64\xd2\x4d\xaf\x7c\xf2\xc3\xc2\x48\x16\x32\x83\x18\x68\xf7\x1e\x99\x08\x43\x6b\x63\x96\x83\x3b\xf1\x7d\xed\xb0\xf7\x13\x8d\xbb\xf3\xdc\x66\x1f\x32\x89\x55\x64\xa2\x50\x31\x35\x0e\x6a\x35\x11\x46\xc7\x5c\x79\xa0\x93\x01\x03\x06\x21\x51\x12\x6a\x9d\xc9\xf0\x89\xdd\x49\x4c\x88\x36\x68\xc3\x94\x4b\x3a\x01\x7a\x97\x58\xea\xe9\x3d\x3e\xe4\xc1\xf4\xc9\x76\xba\xf0\xed\x77\x98\x95\x62\x42\x22\x15\xfb\x89\xf6\x61\xb4\xc5\x34\x54\x32\x71\x4a\x2a\x33\xe6\xbb\x9d\xab\x0a\xb5\x40\x20\xf3\xce\xf4\xbe\x78\x96\x44\x5d\x2b\xa6\xcd\x22\x30\x08\xf3\x27\xf2\x8b\x01\x0c\x37\xa4\xeb\x5c\xc1\xb1\x33\x53\x4b\xea\x00\xdd\xc0\x8c\x0c\x52\x5c\xd3\x4b\x9d\xd1\x62\x9c\x3d\x53\xb6\xfb\xd0\xdb\x23\xd3\x76\xe6\x6e\x8e\xf8\xb5\x1b\x29\x31\x11\xa1\x58\x93\xb0\x76\xe3\x75\x6d\x0a\xa3\x24\x5b\x05\xb4\xab\x8e\x2a\x34\x97\x59\xa1\x72\xf6\x44\x1c\x59\xf1\x54\xaa\x69\xa5\x99\xb7\x67\x46\x8e\x34\xc3\x2b\xd5\x4a\x77\x75\x74\x2d\x38\x67\x4c\x6b\xb0\x26\xc0\xb2\xb9\xe8\x30\xa3\x4f\xa8\xe3\x44\x80\x2d\x90\x5b\xb0\x79\x4b\x88\x7d\x04\xc5\x43\xdc\x44\xea\xe8\x1c\xbd\xda\x5d\xed\x05\x45\x81\x05\x28\xda\x23\x29\x8d\xac\x27\x6a\xe8\x63\xd0\xe1\x95\x57\xe4\x4e\x7c\x6c\x38\xeb\x36\x74\xf0\x6d\x72\xd0\xbd\xa0\x7e\xba\x53\x13\x62\xa0\xdc\xf8\x3a\xa8\xc9\xe2\x91\x37\xc7\x58\x90\x2d\xc6\x41\x11\x1f\x8b\x16\xd1\x0d\xa2\x3e\x4b\x1d\x0e\x13\x13\x4a\x8c\x90\x75\x9e\xcd\xd3\xbc\xb2\x1d\xf6\x28\xc1\xac\xf0\x44\x64\x5f\x7d\xf0\xa3\xde\x83\x89\x4d\x6b\x48\x8a\x4b\x93\x2a\x47\xc5\x63\x88\x9b\x4a\x89\x90\x17\x62\xff\x5c\x66\xc9\x7b\xdd\xd7\xcc\x4f\x68\xf4\xa8\xed\x3c\x18\x26\xb6\x39\x5d\x6b\xe7\x1e\x4d\xe1\x72\xe6\x3e\xe6\x4d\x12\xb5\xf7\xa5\xce\x98\x5d\x33\x3b\xb8\x6b\x28\x02\x32\xb6\x4f\x90\x82\xa9\xe1\xa6\x3b\x75\x85\x92\x79\x1c\x2d\x5e\x27\xcb\xe5\xe0\x9a\x9e\x14\x55\x98\xc7\x68\x29\x84\x30\x0c\x2e\x97\x87\x46\x2a\xeb\x9e\xd0\x7a\x1f\xde\xeb\x1a\x97\x3a\x64\xb8\x50\x8a\x74\x5f\x0e\xf4\x84\x10\x8f\xf1\x26\xf7\x9e\x9c\x19\x1d\xf0\x35\x64\xb1\xb4\x84\xae\xf5\x4b\xa6\xaa\xfc\x3a\xe1\xf1\xb6\x3f\xf5\x15\xff\xee\xef\xf9\xb7\x7e\xfe\x3f\x7b\xcf\x7f\xf9\x45\x3f\xf3\xf6\xdf\xfd\x87\x7e\xea\x6b\x7e\x41\x8b\xf6\x1e\xdf\xf8\xca\x1f\x7a\xff\xf7\x78\xeb\x9b\x3f\xe8\x1b\xdf\xf4\x00\xe1\x31\x1b\x51\x74\x6b\x3d\x69\xb9\xf7\x4a\x07\x84\xc9\x95\x59\x5b\xbe\x6c\xf3\xb1\x6c\xb3\xcb\x26\xe7\x41\xf9\xc8\x27\xaa\x37\x5f\xf0\x91\xb9\x15\x17\x82\xe6\x34\xba\xb6\x44\x3d\x94\xfe\x72\x1c\x99\x95\x18\x62\xa1\x8c\x8a\x15\xd8\x32\x79\x9f\xb6\x90\x12\x50\xb6\xe8\x70\x4f\x0c\xea\x0c\xce\xca\x98\xad\xa7\x97\xd5\x8e\x5e\x22\x25\x7b\x0d\x79\x90\x23\xa6\xac\x56\xc3\xf3\x64\x5e\xcf\x53\x6e\x92\xbb\x8f\x87\x98\x4f\x3c\xcc\xc5\xae\x6e\x00\x96\x65\x5b\x31\x88\xeb\xb5\xe8\xe3\xf0\xf4\xe4\xb9\x1f\x33\x3a\x11\x32\x61\xf2\x8a\x28\x75\x6d\xb1\x12\xdb\xb7\xf5\x88\x6c\x0a\xee\xaa\x7d\x62\x7e\x0d\x40\x6d\x91\xf7\x0c\xc3\x20\xe8\xa2\xbf\x83\x6f\x1b\x32\xbf\x40\xb9\x97\xb3\xfe\xb4\xb3\xca\x7a\xdf\xe2\x89\x0b\xa6\x8e\x1b\xa1\xaa\xb3\x82\x7e\xa2\x92\xcf\x33\xd2\x26\x55\x3e\x84\x21\xf7\xa1\x8c\xcc\x7c\x10\x1a\xae\x72\xc0\x82\x88\x3e\x8f\x9b\x3d\x20\x39\xa5\xb8\x5f\xe3\x85\xbc\xb0\xea\x71\x81\xe9\xa4\x58\x5e\x5a\x21\xb7\xca\xa4\xde\x64\xe5\x78\x55\x14\xa1\xd9\x04\x36\x56\xc6\x81\xae\x67\xe6\x99\xdc\x4a\xab\xac\x2e\xb9\xfa\xae\xe6\x22\x21\x04\x7e\xec\x34\xef\x0e\x81\x66\xc6\xec\xac\x92\xba\xdc\x08\xde\xba\x7c\x45\x98\xd8\x13\xd5\x6b\x98\x07\xa2\x62\x79\x35\x72\xb1\x82\x2a\x27\x3b\xbc\x32\xd3\x32\x01\x6b\xa8\x80\x20\x25\xa1\xb1\x71\xc7\x4e\x7a\x40\x7c\x83\x47\xde\x04\xf1\x96\x92\xa3\x16\x66\x1b\xab\xc6\x0c\x37\x25\x6e\x00\x1a\x2a\x48\x4d\x31\x06\xb8\x60\x54\x26\x87\xc0\x1b\x41\x6a\xb9\x40\xec\x13\x83\xb4\xf6\xb9\xb7\x0f\xd4\xcd\x8a\x4a\x3c\x64\x53\xc6\xd8\x21\xe0\xa6\x4e\xc5\x96\x95\xab\x87\x55\xc7\x59\x52\xd9\x49\xd2\xac\x94\xe1\x4f\x54\x29\x09\xb3\xe9\xa8\x0b\x4b\xa8\x94\xbe\x17\xc8\x51\xe9\x84\x2d\x4b\xc3\x1e\xb7\x73\xf4\xba\x82\x41\x82\x23\x7d\x8d\x3d\x97\x62\x2a\x3c\x71\x77\x76\xe9\x64\x04\x2e\x41\xd7\x8b\x8f\xfc\xae\x71\xdf\x38\x31\x7c\xf1\xc6\x2c\x0b\x3b\xdc\xbb\x9e\xda\xdc\xab\xd3\xdd\xf3\x55\xad\x7b\x42\x4f\x70\x18\xcc\x45\x64\xa7\x6b\x65\xeb\xcb\x3a\x80\x50\x24\x63\xb3\x34\x33\x5f\xea\x24\xae\x1e\x2c\x58\x3c\x09\x49\x4b\xbb\xc1\xcf\x47\xa8\xc9\x63\xcf\x01\xbd\x6b\x7c\x55\x1d\xb4\xcb\xa0\xc2\x99\xea\x51\x99\x04\x0d\xa6\x1b\xdc\x14\x33\xcc\x6b\x3e\xba\xa9\x26\x5b\xa6\xdc\x13\x31\xd5\x23\xaf\x2f\x13\xf8\xd4\x73\xb7\x73\x84\xf3\x6a\x22\x0e\xe3\xfc\x85\xec\x19\x4f\x7d\x9b\x54\xf6\x79\x40\xd9\xae\x91\xfd\x8e\x16\x3c\x41\xc7\x85\x91\x62\xbf\x27\xd2\x13\x8b\x33\x6b\x7a\x71\xea\xd9\x85\xba\xce\x43\xcb\xd9\x62\x3a\xa1\x49\xca\xb4\x8a\x32\x99\xa3\x0a\xf6\x48\x8a\x68\x04\x9b\x9c\x38\xcb\x35\x9f\x18\x02\x0d\xc3\x9a\x35\x04\x62\x84\x28\xb7\x51\x37\xee\x8d\xa9\xa6\xd6\xa1\x85\x05\x04\xc4\x5d\x9f\x38\x23\x88\x1d\x47\x13\x86\xcd\xb2\xe0\x62\xe8\x00\x9b\x62\x6f\x82\x24\x8b\xd4\x62\x3a\x3e\x5a\xa7\x4e\xa2\x2a\x51\x9d\xda\x42\xa5\xf7\x13\xa5\x8c\x59\x4d\xb9\xb2\xd6\xc7\x25\xd6\x51\x71\x3d\x18\x9a\x20\x02\xa6\xd8\x86\x2d\xa4\xcb\x17\xbb\xe2\xac\x13\x5e\x47\xc2\x1b\x25\x20\x9e\x28\x71\x6d\x59\x80\xe1\x82\xda\x00\x30\x38\xce\x06\x79\xbc\x45\xee\xa2\xdf\x58\x07\x36\x90\xc0\x1b\xe6\x85\xe9\xc8\x17\xb6\x40\xd4\x6d\x9f\xd0\xdc\x6c\x91\xae\x3a\x96\x0c\x97\x02\x91\x6c\xd1\x84\xd1\x36\x5c\x8d\x91\x89\x36\x8e\x14\x0e\x70\xaa\x95\xf0\x69\xd1\xbd\x5a\x51\xad\x3c\xa2\xc5\x52\x31\xef\x10\xef\x8b\xdd\xee\x88\x0b\x92\xd9\x84\x26\xac\x00\x5c\x32\x8b\x47\xdc\x79\xa7\x9a\x0d\x5c\xfb\x4c\x9b\x74\x1e\x9f\x18\x9d\x4a\xef\xb0\x6e\xcb\x96\xbb\x4f\xb8\xee\x13\x20\x4c\xed\x55\x04\x35\xdd\x42\x80\xba\xb8\x48\x8e\x0b\x6c\x03\x6a\x3c\x19\x56\x2d\x86\x27\x5e\xe3\x60\x73\xc3\x63\xa9\x74\x2e\x9f\x50\xe6\x1e\x4d\x35\x33\x35\x95\xa6\xe3\xda\x97\x75\xdc\x6a\x2b\xc3\x51\x13\x4c\x1c\x7b\xa6\x0c\x7d\xe4\x0d\xa1\x81\xd8\x5a\x7d\x8c\xcc\x46\x83\x45\x1d\x12\xee\xb9\xe1\x72\x03\xf8\x72\x82\x1e\x33\x3e\xca\x79\x97\xc9\x4a\xc6\x04\xdf\xf7\xae\x4f\x34\xab\xa6\xb6\xe4\xd9\xd5\xb1\x64\x37\xfe\x5a\x45\x91\xaa\x87\x8d\xa8\x31\x30\xf8\xd9\xb2\x54\x00\x41\x08\x3a\x8a\xd4\xb8\x34\x8f\xd3\x3d\xd1\xf6\xc5\x52\x60\xf6\xbe\x6a\x02\xf6\xbe\xd2\xe0\x50\xd8\x13\xf2\xd1\x1b\x46\x6a\x15\x56\xcf\x42\x33\x1d\x9a\xef\xa3\x2a\x8e\xe4\x52\xfc\x89\x42\x9b\xd5\x70\x9c\x66\x42\xda\xa5\x68\x79\x60\xe4\xfb\x3a\x1c\xcd\x4b\xa6\xd8\x69\xdf\x5a\x96\x60\xcf\xee\x12\x25\x43\xa3\xa6\x70\x78\x22\x9a\x41\x18\xce\x7d\x5d\x32\xdc\x47\x51\x3c\x40\xae\xe4\x28\x72\x86\xa3\x4d\xa5\x80\xd9\x61\xa9\x6a\x29\x19\xb9\x74\x44\x6d\x61\x67\x7e\x42\x8b\xc5\x6a\x41\x70\x57\x0e\xeb\xb5\xb4\xa3\x5a\xd3\x93\x29\x7c\xa6\x3c\x90\x27\x6e\x02\x31\xe7\xac\xdc\x54\x17\xe5\x54\xbc\xc5\xf0\x44\x29\x83\x61\x78\x22\x8f\x4d\xdc\x3d\xfa\xeb\xf4\xed\xe8\xa9\x21\xc2\x9d\x87\x00\xd1\xb9\x4d\x24\x68\x50\xf0\x02\x88\xe6\x99\x94\x7a\x9c\xc5\xfe\x06\xc2\xe3\x8b\x3f\xfb\xdf\xfb\xae\x0f\xfe\xfd\xdf\xfa\x23\x3f\x2b\xbe\xf0\xb7\xfd\xde\xf7\xfb\xec\xef\xfa\xb6\x5f\xf8\x6d\xee\x97\xbf\xa9\xbf\xcb\x87\xfc\x9e\x8f\xf8\xd8\x7f\xeb\x3b\xbf\xe8\x23\x9f\x20\x3c\x50\x88\x25\xb5\xcc\x88\x53\x30\x37\xd2\x44\xc2\xcb\x30\xc3\x99\xd5\xe5\xe2\x6c\xdd\x4d\x4f\xbc\xf2\x88\x7a\xde\x02\xd1\x67\xc6\xbc\xa5\x66\x25\xa9\xc7\x30\x48\xcb\x86\xcc\x1e\x96\xb2\x2e\x97\xd0\x85\xd1\x11\xa1\x45\xf3\x60\x37\x71\x3a\x5d\x3d\x10\x9b\x00\x08\x8f\xf4\x5e\x2b\x49\x77\x2c\x31\x92\x0b\x82\x59\x06\xe7\x26\x75\x0f\xfa\x31\x2a\x2f\x12\x44\x23\xa1\xc2\xe8\x0e\x1e\xec\x2d\x41\xad\x66\x3f\xd1\x3f\xd8\x05\x86\x1d\x1e\x03\xe2\x35\x63\x0c\x98\x08\xcd\x1d\xd1\x84\xc1\x26\x4d\xee\x05\x81\x79\x94\x95\x42\x2f\xcd\x59\xef\x0e\xf9\x88\xb6\x22\x7a\x90\xf3\x90\x70\x4d\x6b\x70\xbf\x2f\x95\x63\x45\x39\xdf\xda\x23\x31\x80\x5a\xba\xb1\xed\x27\x03\x24\x33\xa6\xf5\x65\x05\x78\xa2\xea\x70\x96\xa0\x62\xa6\xa8\xe1\x49\x05\x8f\xf6\x98\xb4\xf3\x7e\x52\xb0\x74\x6e\xed\x12\x96\xd5\x7d\x5a\x1a\x5a\x3c\x39\x9e\x67\xe2\xfc\x89\x84\xc4\x46\x30\xf2\x74\x27\x2e\xfe\xf4\x45\xdd\xfd\x22\xb2\x17\x7c\x37\x62\x1a\x4c\xe2\xe8\x61\x1c\xde\xd2\x71\x8c\xbc\x23\xdb\xe3\xca\x4f\xc8\xb2\xad\xcc\xf1\xba\xce\x50\x92\x09\x0d\x66\x50\x83\xa6\x1b\x99\x23\xae\x06\x2a\x8a\xb5\x8d\xcc\xab\x64\x15\x91\xad\xa3\x59\xa5\xd4\x27\xae\x7c\x22\xb1\xd5\x80\xb7\xb6\xa5\x81\x87\x0f\xea\xf2\x15\xdf\x6d\x4d\x16\xba\x88\xab\x78\xd1\xed\x84\x59\xdf\x65\x24\xac\x0b\x25\xec\x11\x6a\x92\x68\xa6\xdd\xb1\xfd\x91\x20\x88\x61\xdc\x08\x58\x15\xf2\x61\x58\xd8\x9d\x1f\xde\x53\x98\x35\xec\x84\xeb\xbc\x8a\x2d\x68\xd8\x27\x2a\xf9\xb7\x2d\xe6\x72\xbd\x68\x21\xdb\x2d\xae\x32\x6b\x25\x68\x81\x91\x2f\x78\x07\x45\x6e\x5f\x33\x88\xc2\x27\x22\x28\x3a\x82\x76\x81\x3d\x41\x0a\x2a\x9e\xe6\x01\x60\x48\xbe\xd9\x66\x10\x8f\xae\x0e\xdb\xf8\xb9\xc2\xaa\x7e\x0e\x4a\xe6\xc4\x32\xbb\x70\x74\xd4\x90\x48\x97\x7f\xe4\x31\x6d\x7c\x99\xa9\x2e\x9d\x66\x35\x82\x60\x64\xee\xbd\xec\xb1\xdd\xe9\xce\xb3\x5d\xd7\x18\xd9\x66\x22\xd6\x8d\x8b\x00\xb0\xc5\x4a\xb9\x7b\x82\x14\x34\x86\xc1\x9d\x4c\x4a\xee\xc0\x2f\x24\x06\x78\xaa\xc5\x3d\x00\xc2\x4d\x03\x16\x66\x23\xb9\x62\x9a\x1c\xa2\x27\x28\x12\x6d\x78\x3f\x71\x46\x16\xa0\x62\x95\x2d\x07\x6f\x0d\xdc\x10\x73\x8b\x36\xb0\x37\xf2\xec\x30\xa2\xfa\x61\x88\xb7\x7c\x8c\xdc\xf5\x62\x20\x45\x3d\xf8\x13\x20\xff\x50\x78\x67\x2f\xe0\x00\x77\x5e\x4e\x13\x33\x28\x74\x78\x9a\xd9\x5d\x20\xca\xaa\xb2\xdb\x31\x7c\x12\x32\x8c\x70\x63\xf2\xc2\xc5\xf5\x44\x33\x89\xd6\xb0\x07\x31\x47\x5c\xe9\xb8\xcc\x71\xb8\xce\xcb\xb2\x52\x2a\x7e\xd5\x2b\x75\x9f\x56\xaa\x0a\xa0\x53\xb8\x98\x3b\x66\x1e\x3c\x01\x6c\x13\x76\xc5\x02\x22\x99\x1e\xe5\xba\x40\x65\x09\x64\x62\xa5\x3a\x14\x86\x9c\x0f\x6b\x45\xbc\x0c\x09\x6d\x6d\x41\xcc\x4c\x8b\x94\x27\x88\x73\xdd\x94\xa3\x95\xab\xa3\x25\x76\x48\x76\x74\xc1\x8f\x4b\x35\xd0\x07\x70\x72\x4b\x6d\x70\x20\x0e\x2b\xc3\x5b\x8e\x96\x54\xb3\xfc\x13\x27\x75\x41\x89\x85\xf3\x53\x1d\x32\x85\xe9\x6f\x70\x2f\x03\x28\xb7\xae\x5e\xc8\x65\xcc\x60\x94\x4d\x79\x25\xe2\x4d\xa8\x74\x36\x12\xfe\x84\xe6\xe6\x5a\x00\x7b\x75\xc7\x0e\xe3\xdc\x86\x37\x48\x31\xd6\x05\xd3\x33\xe7\x86\x5b\x85\xb0\x59\xa7\xce\xd6\xee\x5e\xae\x11\x20\x8e\xe5\x01\x35\x2d\x2d\xe7\x4c\x71\x57\xba\x2f\x54\xba\xdd\xc8\xde\x04\x67\xb3\xf4\x38\x9b\x0f\x85\x2f\xba\xd6\x72\xe9\xba\x03\x2a\x6d\x9e\x71\xa8\xf5\x84\xe6\xa6\x9d\x07\x57\xee\x98\x46\xeb\xce\x14\x2c\xa7\x4c\x72\xdc\x4c\xb9\xf3\x86\x80\xd8\x34\x17\xa8\x56\xe7\xa2\x62\x16\xa7\x3a\x75\x7e\x64\x68\x29\x2b\x64\x93\x3d\x0f\xe0\x92\x54\x35\x52\x8a\xed\xb4\xfb\x94\x60\x26\xab\x7d\xbc\xf5\x84\xd3\xe3\x88\x93\x06\xde\x89\x93\xc3\xf0\x04\x12\x38\x46\x9e\x06\x8d\xcc\x1d\x3e\x81\x59\x0d\xcb\x55\x9b\xc5\xd1\x44\x5d\xa8\x73\x36\x07\x5d\x5c\xb0\x06\xdf\x97\x6a\x47\xa1\xf6\x91\x7d\x41\x68\x3f\x07\x0e\x37\x6e\xe7\x45\xf3\x4a\x6d\x4d\x6e\x34\xea\x2e\x94\x6a\xe8\x75\x92\xb2\x19\x9e\xfe\x88\xf7\x55\x1a\x18\xb5\x3f\x41\x59\xd3\xd9\xc9\x46\x92\x1a\x7a\x46\x80\x43\xe2\x02\x4a\xa5\x30\x3d\x81\x9c\xec\xb8\x8b\xba\xb3\x76\xd4\xe8\x5b\x51\x39\x2c\x9d\xb1\x3c\x91\x83\x33\x65\xc8\xee\x61\x51\x5b\xb5\x44\xc0\xb1\x71\xbb\xd4\x1a\x23\x47\xb5\xc3\x69\xa2\xdb\xa5\xae\x0e\x6d\xc0\x70\xb6\x51\xb8\x66\x8f\xac\x05\x16\x09\x11\xc5\x99\xcf\x83\x9d\xa9\x7a\x41\x5c\xab\x0b\xee\xbb\xf5\x73\x24\x77\x19\xbb\x91\xf1\x03\x7b\x12\xf3\x61\xee\xcc\xf3\x13\x71\x04\xb9\x21\xe3\x05\x38\x0b\x77\xe0\x7e\xe1\x9d\xe4\xb9\x6c\x3c\x49\x0b\xe7\x32\x66\x44\x66\x22\x40\xb9\xbb\x58\xc2\xd5\x95\x0a\xf9\x09\x84\x48\x00\x04\x70\xd5\xc9\xbb\x83\x73\x26\x89\xe2\xb5\xf8\xf0\x52\x51\x0f\xe0\xa0\xcd\xdd\x00\x55\x10\x67\xa3\xf4\x34\x6c\x01\xfa\x08\x1d\x97\xef\xd0\x48\x9b\xc9\x5d\xb3\x37\x42\x90\x8c\xa7\xad\xa7\x1e\x8e\xe4\x8b\xe2\xe8\x2f\xb1\xea\x79\xc5\x9b\x62\xce\xdc\x19\xd5\x64\xf9\x37\x10\x1e\x3f\xf5\x75\xaf\xfb\x98\x1f\xf8\x8a\xaf\x7d\xcb\x17\x7e\xe9\x1b\xbf\xe1\x2d\xff\xc3\xbf\xfe\xba\xdf\xf1\x55\xaf\xfa\xa6\xaf\xff\xb6\xcf\x7c\xe3\x9f\xf8\xcb\xe0\x6f\x7e\xcd\x17\xfe\xf2\x7b\xff\x2f\x23\x3c\xcc\x9f\x7d\x9b\x9f\xf8\x0d\xdb\x59\x7b\x23\x3a\xcf\xe6\x94\xa8\x29\x7e\x9e\xaa\x14\x3a\xed\x7d\x23\x1d\x15\xeb\x23\xca\x4b\xfa\xcc\x44\xd5\xc4\x6d\x91\xf8\x8d\xec\xaf\x72\x56\x5f\xf2\xb7\xff\xff\x5d\xbc\xff\x5f\x5e\x50\x05\xe8\x79\x66\x38\xf2\x12\x53\x2e\x07\x2b\xbc\xac\x3a\x8c\xdd\x27\x58\x17\xea\x59\xe3\x14\xf3\x15\xaf\x8b\x0a\x7c\x2e\xd1\x2d\x80\x0f\x78\xd1\xd1\x69\x0f\x29\x2f\xac\x1b\xe9\x3a\xbb\x02\x3b\x83\xfd\x1e\x00\x58\x26\xa9\x0b\xf7\x65\xbb\xf5\xcc\x16\x52\x9d\xbd\x6e\x02\x5f\x4c\x11\x5f\x66\x2f\x34\x4e\x39\x31\xec\x00\x99\xc5\x40\xb6\xbb\x38\x2e\x28\xd3\x80\xbc\x9e\xc9\xc6\x60\x55\xaa\xc1\x18\x07\xaf\x29\xcf\x6b\x9f\x8d\xab\x07\xbc\xb8\xe3\x0d\x94\xc1\x67\xc7\x5b\x78\xc6\x5b\x0b\x6a\xec\x39\x76\xa0\x77\xb2\xe8\xb6\xf7\xb5\xe9\x30\x47\xe0\x60\x5d\xc7\x89\xf8\xc5\x9e\xd8\x17\x5a\x61\x57\x55\x04\x6e\x68\x79\xba\x3d\x97\xdd\x9e\xc8\xa0\x26\x83\xa9\x21\xd9\x1a\x82\xc0\x25\xe4\x97\x68\xc6\x63\x8c\x7f\xed\xb2\x7d\x99\xbd\x08\x3b\x5e\x87\x0e\x31\xb0\xb3\x93\x00\x7a\x1d\x46\x1f\x02\xc9\x98\x78\x4c\x09\x38\x15\x24\x1b\x08\x5e\xa0\x3b\x7c\x5f\xf9\x4a\xf9\x01\x2f\x18\xd5\x94\xbb\x19\x46\x8e\x27\x0d\xf2\xb0\xc7\x99\x34\xcd\xee\x5c\x0d\x21\x98\xb3\x40\x40\x89\x9a\x88\xa8\x7d\x40\x80\x2b\xe6\x40\x3f\xe0\x85\x53\xfa\x20\x57\x88\x38\x28\xee\x0a\x3c\x0d\xc4\x18\x93\x15\xb4\x5c\x27\xa0\x47\x6d\x2b\xd1\x6b\x70\x52\xed\x09\x90\x85\x24\xbd\x38\x9b\xf9\x65\xfe\x22\x57\x5c\xb9\xf8\xb0\x58\x5a\x3e\x87\xb9\x3b\x2e\x67\xda\x0a\x93\xe9\x27\x88\x1c\x4e\x48\x03\x1e\x33\xd7\x24\xb5\xf4\x5e\x5c\xfe\x81\xb5\xa0\x97\x38\xe3\x19\xb4\xe2\x8c\x80\x00\x2d\x2f\x3a\x9a\x32\x7d\x66\x97\x94\x53\x6b\x71\x2b\xc8\x65\x41\xb5\xe9\x7a\x85\x7c\x93\xc6\xf0\x03\x5f\xc4\xf0\xcd\x69\x2f\xb5\xa8\xbb\x30\x77\x5e\xbc\xed\x23\xb0\x82\xb3\x9f\xbe\x9d\xa5\x04\x30\xb0\xc8\xe5\xe8\xc7\xc4\xd0\x41\x9a\x5f\xd4\x1f\xbd\xcc\x5e\x9c\x98\x73\xe3\xe4\x28\xfb\x3c\x4a\x3c\x1a\x8e\x71\x30\xa3\x6f\x67\xb6\xaa\x33\x8d\x84\x93\x3b\x12\xa0\x47\xcc\x77\xb3\xed\x8c\x2f\x0a\xe5\x5f\x66\x2f\x22\x46\x25\x8d\x1a\x9a\x47\x7d\xe7\x79\xa8\x39\x86\x96\xc2\x2d\x01\x37\x65\x9b\x71\x87\x1b\x36\xfb\xaa\x15\x08\x24\xd1\xd5\x68\x7e\x60\x5f\xc0\x38\x38\xb7\x37\xf7\xa5\xde\x22\x93\x5b\x23\x20\x73\xdc\x88\x79\xd7\x99\xc3\x90\x51\x8b\xf2\x1e\xe6\x58\x07\x8c\x76\xc6\xf9\xe2\x23\xa8\x2f\xb3\x17\x64\x4d\xbd\xe5\x8d\x7a\x5a\x41\xf9\x49\x8a\x28\x24\x2f\xc1\x19\x38\x4b\xce\x56\x2a\xa9\x92\x67\x2c\xb7\x4d\x90\x83\x97\xdb\xec\x89\x93\x8a\xcd\x02\x0c\xe9\xa5\x13\x22\xb7\x83\xae\x43\xb6\x28\xf3\xe7\xa1\x6d\xc6\x33\x9e\xba\x22\xe2\x6f\x15\xfa\xe1\xad\x57\x62\x3a\xff\x84\x17\x6b\xc3\x5e\x97\x94\xb5\xfb\x43\x76\xe2\x34\x1d\x7a\x4e\xb5\xf1\x85\x26\x5b\x80\x91\x26\x6c\x0c\x67\xf7\xea\xee\x9a\xa6\xe2\x5f\x14\x87\xbf\xdc\x31\xb5\x3a\x14\x61\x1a\x9e\x4d\x12\x88\x97\x52\x49\x9e\xab\xc5\x13\x08\x60\x61\x35\x0b\x0e\x7a\xb1\x82\x2a\x92\x06\xb9\x48\x45\x9e\x0f\x78\x71\xb8\xcb\xe4\xdd\x41\xf6\x8b\x5d\x4b\xb6\xb0\x25\xbc\x8b\xa2\xe5\x8c\x3e\x1f\x77\x85\xbc\xb2\xb8\xec\x90\x77\x31\x82\x59\x13\xeb\x03\xb9\x16\x1b\x53\xab\xe8\x69\x4a\x6c\x9f\x4b\xee\x7d\xcd\xc6\x00\x67\x23\x1a\x79\x2d\x99\x63\xac\xfb\xbe\xe7\x0b\x80\xa2\x02\x1f\x0b\x2c\x8f\xe4\x5a\xf4\xb2\x5a\xd4\x6d\x20\xe6\x36\xfa\xeb\x08\xc2\x66\x38\xa4\xf3\xd4\xdc\xd7\xd9\x4a\x80\xbb\xba\x38\x40\xc9\x8b\x17\xcd\xe3\x7c\xf1\x19\xeb\x97\x79\x2d\x72\x47\xf8\x60\x01\x1d\xb2\xad\xa1\x53\xcb\xf4\x38\x66\xb5\xda\xaf\xb2\x70\x85\x3c\x19\xcb\x44\x47\xf4\x48\xcc\x32\x93\xd4\xf9\x62\xb9\xef\x65\xf6\xe2\x92\xe2\x38\x8f\x7d\x26\xd6\x0a\x8b\x27\xbd\x0f\x60\xd9\xf4\xf9\xa6\x5c\xdf\x04\xef\x3e\x81\x01\x47\x85\xee\x3e\xb1\x91\x1b\x29\xff\xc0\x17\x61\x1a\x9e\xd6\x6b\xee\xa6\x71\xc1\xec\x34\x84\x51\x65\x1f\x21\x22\x2e\x45\xda\x63\x1f\x3e\x90\xc1\x84\x25\x40\xd8\x56\x8d\xed\xfe\x81\x93\xca\x28\xbe\x29\xcb\xc1\x13\x78\x58\x5e\x80\x60\x46\x5f\xd5\xe3\x73\xd3\xde\x52\xe2\xf2\x9e\x9a\xd5\xba\x6e\xdb\xa7\x94\x26\x1b\xc9\x1e\xd8\x17\x34\xa5\x79\x70\xef\x47\x3e\x96\x83\xd2\x4b\x76\xa1\x43\xc1\x06\x9b\x38\x54\x92\x91\x68\xe5\x04\xd1\xec\x74\xbc\x1e\x4e\x50\x2f\xcb\x13\x48\x00\xe3\xae\xaf\xeb\x42\x28\xce\x83\x60\x87\x08\xc1\x73\xdb\xc6\xd7\xbc\x65\x77\x10\xb7\xc5\x16\x70\x63\x5a\x42\xf1\xc9\x1d\xcb\xf0\x89\xbc\x73\x37\xd1\x89\x2b\x7a\x36\xa0\x2c\x3e\x9c\xca\x62\x73\x94\xa3\xda\xc5\x38\x94\x2b\x9f\xe5\x14\xb1\x04\x9e\x4a\x65\x3b\xbb\x58\x9e\x88\xec\xf3\xb2\xc8\x1a\x56\x93\xe5\xe2\xf4\x54\x5c\xc2\x0f\x5c\xed\x3c\x43\x99\xc6\x0c\x76\x8a\x3d\x88\xcc\x28\x06\x66\x7b\xf2\x23\xbe\x38\xb5\xed\x65\x5e\x8b\x03\x9f\x48\x75\x81\xb6\xf5\x5b\xf3\x34\x9b\x1d\x04\xba\xdd\x31\x19\x74\x21\xc8\x0c\x3a\xd7\xd0\xf9\x7c\x01\x20\x54\xa9\x6b\x2a\x4f\x64\x7c\xa1\x21\xe9\xe7\x45\x9c\x26\xcb\x9f\x09\xc4\xa9\x62\xc5\x59\x08\x19\xcb\x6d\x5a\x37\x21\x53\xed\xf6\x99\xcb\x79\xdf\x16\xd8\xb9\xff\x67\x54\xf4\xeb\x84\xc7\xe7\xbd\x85\x7d\xc9\xbf\xfb\xed\x9f\xf0\xd3\x7f\xef\x3f\x7d\xe5\xfe\x2d\x5f\xf6\xcf\xbe\xee\x4f\xfd\xf8\xef\xfc\xc0\x37\xfc\x95\x77\xfe\xd9\x3f\xf7\xad\x3f\x5d\x3e\x8a\xfd\xc8\x4f\xbf\xfc\x84\x07\x6d\x98\xcb\x0b\x10\x67\x00\x4e\xbe\x64\xdc\xec\x08\xb0\xd8\x8a\x26\x3f\xe8\xc1\x5b\xbc\x19\xb2\x71\xe3\x2d\x1d\x40\x57\xa6\x2a\x3f\x01\x1d\x12\x06\x20\xa9\xf3\xf4\x95\xf5\x62\x15\x0e\xd7\x38\xeb\x71\x55\x22\xdc\xbe\x2b\xb8\x6a\x1f\xe7\x52\x9b\x57\xc3\xe7\x3a\xc8\x80\xec\x81\xa3\xcd\x70\xc7\x40\xd9\xa9\x26\xb8\x59\xc8\x57\x1f\xdc\xb2\x35\xdb\xd5\x5d\xf2\x47\x8f\x93\x96\xb2\xa3\x99\x67\x30\x58\x04\x8a\x2d\x2e\x0f\x04\x1e\x7a\xf6\x85\x45\x23\xf2\x30\x72\x38\xc5\x0b\x21\x58\xee\x1d\x89\x62\xe7\xad\x99\x71\x7d\xdd\x1e\x49\x11\x23\x6b\x3b\x5e\xc5\xc3\x66\x9e\x48\x97\x5d\x6e\x43\x2c\x0e\x71\xd0\x46\x9a\x63\x59\x63\x1b\x68\x9c\xc4\x99\x2c\xb8\xb1\xed\x0b\x87\x34\x11\x64\x5c\xaa\xab\xdd\xee\xc5\xc9\x00\x2f\xf3\x17\x01\xae\x02\x1d\x5b\xf1\xa1\x98\xa3\x13\x38\x8f\x12\xc1\x11\xc7\xc1\x49\x05\xb0\x66\x82\xb7\x62\x7c\x30\x71\x50\x60\x66\xef\xcc\x8b\x07\xbc\x98\x12\xd9\xe6\x4e\xef\xae\x9b\x18\x84\xf9\x4d\x0a\x65\x74\x1d\x61\xc8\xe5\x4d\x5c\xf9\x94\x9e\x5d\x20\x5e\x49\x04\x67\x4f\x6a\x5e\x1c\x17\xfa\x32\x7b\xd1\x36\xd0\xbd\x6e\x5d\x10\x5c\x60\x04\x06\x8e\x8e\x50\x3b\x72\x80\x19\x89\xbb\x37\xd1\xfd\x1d\xd1\x41\x2b\x1b\x87\x30\xc1\x08\xe7\x9f\x00\xf9\x96\x78\xcc\x4a\x1d\xcc\xc6\xfb\xd0\x52\x2f\xc7\xdb\x02\x97\x0e\xe1\xb8\xb3\x43\xa0\xa4\xeb\xba\x56\xa2\xfd\xf4\x49\x59\x85\x1b\x7b\x62\x5f\x10\x87\x2e\xdc\x85\xa1\x8d\xe7\x4d\xea\xa1\x54\xe8\x42\x57\x5c\x98\xe0\x38\x15\xc7\xb0\x73\x3c\xcc\x44\xf2\xb5\xa4\x30\x86\xd1\x07\xd6\x02\x49\x68\x48\xb6\x09\x56\x79\x43\x98\xa3\xaa\x21\x1c\x6a\xdd\x7a\x2b\x94\x46\x10\xb8\xb8\x98\xb5\xb1\x67\xef\x61\xc3\x4b\xfd\xda\x83\xb0\x2f\x37\xc8\xf7\xbc\x3b\x33\x82\xf3\x55\xd7\x96\xbb\x48\x17\xa6\xbc\x72\xd5\xc4\xec\xda\x67\x91\x92\x8a\x32\x31\x67\x88\x56\x9d\xed\x5f\x9b\x4f\xf0\x32\x7b\x61\xed\x75\x31\x82\xd0\xd0\x07\x1e\xbd\x26\xe2\x83\x92\x04\x0d\x34\x87\x57\x9a\x36\x31\x7d\xf0\xde\x5f\x96\xe3\x45\x00\xae\xfa\xc5\xd9\x2e\x2f\xb7\x17\xd4\x13\xde\x9a\x3b\x27\x73\x67\xb3\x55\xfa\x17\xfc\x42\x97\x50\x39\xcc\x7c\xf6\x81\xba\x3a\x0f\x56\xe9\xe1\x8c\x9f\x7d\x8c\xf0\x40\x5a\xc4\x48\x1b\x54\x05\xb8\x21\xdc\x2b\x12\xa3\xeb\x7d\x13\xb5\x99\xaa\xf5\x2c\xb7\xa5\xc2\xc7\x9c\xf3\x18\xfb\x4a\xc7\x11\x91\x17\xde\x3e\x11\x53\x0f\x5a\x36\x94\x57\xa4\x75\x56\x90\x6f\x55\x20\x1d\x7a\x37\x25\x92\x8b\x9e\x40\x6a\x89\xa5\x79\x4e\x44\xb0\xc8\x99\xb4\xb3\x3e\x91\x2e\x33\x10\x84\x0c\xe1\xc8\xf7\x54\x68\x2c\x5c\xae\x0b\x1f\xf6\x50\xdc\x82\x65\x82\xa4\xaa\x70\xa4\xb1\xf4\x3e\x18\x11\x5b\xb3\xf3\x5c\xc7\x03\x5e\x2c\x4b\x19\x34\xb4\xe8\xbb\x5c\xf9\x02\x67\x97\xec\x2c\xa9\xe8\x25\x2b\x5d\x96\x84\x04\xb5\x46\x73\x5d\x2a\x90\xf3\xbc\xa1\x46\x8f\xd0\x2e\xfd\xa8\x5b\x2e\x74\xc0\x6e\x44\x40\xb2\x01\xec\xfc\x2a\xd2\xc7\x9c\x64\x46\xcc\x6e\xc8\xce\x93\x2d\x62\x6b\x61\xa4\x95\x5b\xf3\x27\xe0\x35\x9e\xf1\x50\xd0\xe0\x8e\x18\x03\xf2\x3a\x77\xb8\xfd\x59\xb2\xcb\xe2\x4e\x59\xc1\xe9\xdd\x4d\x23\x11\xf7\xc8\xa3\xea\xa1\xd9\xb5\x9e\x48\x97\xd7\x98\x66\xc4\x88\xab\xcf\x05\xb4\x61\x61\xbb\x61\x25\xc7\x3d\xd1\xee\x0b\xef\x30\xea\x79\xe6\x79\x47\xd0\xc2\x65\x11\x21\xc0\xa6\x27\x92\xf6\xd5\x2b\x85\xdb\xa5\x12\x8a\x30\xa1\x60\x9c\xba\xb8\x69\x3c\x7c\xcb\x7b\xab\xc8\xf9\xe2\xc7\x11\x12\x01\xd6\xc3\xed\xaf\xce\x9f\xd8\x9d\x2a\x68\x83\x1c\x47\x9c\xdb\xb9\x20\xde\x3a\x18\x1b\x88\x75\x87\x46\xe3\x9e\xac\x76\xd3\xbc\x69\xad\xc7\x03\x4a\x01\x6d\x84\x2f\x8e\x85\x7c\x99\xbd\x48\x40\x25\x54\xe3\xb9\x67\xe7\x3e\xa9\x81\xa9\xaa\xd2\xca\x0e\x90\x3a\x8e\xce\x32\x4b\xd4\x2a\x7b\xbb\x03\xd1\xe5\xdc\xb4\xde\x3d\x10\xd9\xe9\x02\x44\xe6\x39\x4d\x41\xb9\x3b\x10\x56\xa4\x2d\x76\xd4\xe6\x60\x6d\x61\xcc\xfc\x59\x60\xc7\xa6\x84\xb3\x49\xbb\x60\xf6\xbe\x3e\xb0\x16\xbf\x0a\x13\x8d\xbb\xcf\x7c\xe6\x60\x5d\x8a\xb2\x50\x95\x42\x09\xf7\x14\xf9\xa4\x71\x84\x69\xc0\x1c\xfe\x38\xf0\x99\x36\xd5\xcd\x95\x27\x4a\x5c\x47\x2a\xc6\x9c\xd6\xa0\x9a\x49\xc2\x71\x98\xd3\xca\x17\xd2\x0a\x00\x18\x83\x01\x0f\xc6\xb2\x58\xb2\x46\xc1\xe5\xf2\xa1\xdd\x2a\x3c\x71\x83\x53\x6b\xa1\x20\xb1\x55\x47\xc1\x2e\x7e\x75\xb1\x94\x95\x6d\xf7\xda\xa5\x72\x5d\x70\x98\xbc\x24\x77\xe7\x85\x95\x80\x03\x6a\x8f\xec\x4e\x7f\x8d\x78\xb8\x4b\xb1\xe3\xaa\x08\xa8\x18\xae\xc5\x60\xb7\xd2\x94\xcb\xd1\x60\x25\x34\x8d\xb2\xab\xf7\x83\x83\x9b\xad\x2b\xe1\xf5\xc4\x17\x59\x63\x51\xc3\x0f\x61\xcf\x03\xf8\x03\xdd\xfe\xf4\x55\xdb\x0c\x33\xdb\xd7\x9d\xb3\xd2\x56\x53\x57\x43\xe9\x28\xc8\xa3\x92\x96\x2d\x79\x22\xbf\x20\x7d\x61\x6e\x80\x6c\xbb\x4e\x8e\x56\x83\x18\xc8\x29\xc8\x72\x67\xa4\x06\xd0\xa4\x61\x65\x34\xfb\x1b\x5d\x2b\x1f\xc4\xbb\xf5\x04\x41\xda\x28\x3a\x8d\x48\xa8\x7a\xeb\x38\x5b\xde\x26\xec\x8a\x77\xda\xda\xa9\x4e\x7f\xdd\x1e\x43\x0b\x95\x0e\x03\xb7\x9a\x07\xdf\x69\xab\xdf\x40\x78\x7c\xf4\x7f\xf7\x3e\x7f\xf4\x77\xbd\xff\xb7\x7e\xd1\x0f\xfd\x99\x8f\xfb\xe0\xff\xeb\x5f\x7f\x17\x38\x5e\xf1\x8a\x16\x7f\xe6\xb7\x7e\xc4\x97\xff\x7f\x3e\xe0\xab\xfe\xc9\x1f\xff\x73\x5f\xff\x00\xe1\x21\xfd\xe2\x06\x08\x6c\x29\xba\x9c\x3d\xe5\x0c\x12\x63\x96\x89\x63\xd9\x19\xa0\x22\x34\x9e\xb1\xe3\xca\x6c\x53\x30\x6b\x83\x96\x3d\xc1\xb4\x6f\x1c\x9b\x29\x46\xe9\xd0\x69\xc1\xe4\x42\x87\x7d\x21\x4f\xbf\x49\xee\x81\xd3\xd3\x21\x8e\x56\x5d\x2d\x78\xa5\x79\x71\xe1\x84\xe2\x09\x18\x25\x91\x3c\x18\xbf\x3c\x1d\x28\xc6\x22\x93\x89\x12\xaf\xc6\xf4\xa4\x5e\x9c\x86\xb9\x9e\x7d\x47\xea\x18\xb7\xc6\x9b\xb3\x61\x20\x7d\x22\x69\x0f\x77\xa6\x38\xd6\x53\xb0\xb4\xb9\x3a\x41\x8f\xae\x95\x99\xac\x3c\x1d\x35\x85\xfb\xd1\xc2\xc8\x17\x1a\xf8\x3e\xf7\xc0\xb4\x11\xfe\x44\xe0\x71\xc1\xba\x93\x59\x0a\x8d\xac\xc0\xd0\x9d\xc2\x35\x4c\xe8\xa7\x9e\xd0\xe5\xca\x60\xe5\x00\x5b\xa7\x36\x25\xfe\x54\x34\xb5\x5f\x9b\x10\xfd\x72\xd3\x2e\x9c\xb0\xa6\x3b\xdc\x52\x8b\xc0\xc3\xce\x96\xae\x35\x80\x3c\x26\x96\x83\xd1\xc2\x07\xbe\x59\x43\x97\xae\xc4\x27\x8d\x0d\x76\x4f\x00\x18\x73\xee\x1a\xed\x89\x07\x03\x08\x20\x98\xb2\xd4\xd2\x82\xe0\x0b\x49\xfb\x1e\xa7\x40\x5d\xdd\x6a\x58\x95\xa4\x24\xd1\xe3\x6a\xf2\x03\xfb\x82\x6e\x31\x42\x99\xc7\x79\x88\x94\x0e\x44\x2d\x3d\x52\x04\x41\xc7\xce\x36\x5a\xcc\x1c\x38\x27\x3a\xe6\xd4\x64\x2b\x73\xb6\xa0\x16\x7b\x22\x39\xdb\xc4\x22\x5a\x0f\xca\x74\xef\x46\x9c\x24\x82\x25\x0f\x21\x33\x3f\x94\x27\x1c\x90\x7b\x29\x45\x2c\xa8\x73\x91\x01\xc5\x21\xeb\x23\xbb\xf3\x3a\x33\x70\xb6\x05\x50\x24\xd7\x96\xdc\xf6\xe0\x7e\x17\x62\x40\x53\x97\xc8\x5a\xe3\x55\xc3\xd6\x2d\x0f\xc8\x8e\xb8\x47\x71\x8f\x24\x67\x73\x08\xd3\xaa\x5d\x35\x9f\x03\x16\x35\xad\x24\x3a\x57\xb7\xbb\x41\x62\x73\x43\xe9\x79\x7b\x7e\x53\x0c\x17\xeb\x84\xe7\x8d\xd7\x13\xe1\xcf\xe5\xa5\x95\xf6\xa5\x25\xce\x13\xe9\x4c\x88\xaa\x8e\xb9\x39\x8f\x2b\x80\xb4\x30\xcb\x37\x6d\x77\x6e\xa7\x91\x24\x35\x4a\x17\x7f\x80\xfc\x61\x7e\x24\x73\x4f\x6e\xad\x68\x26\x22\x4f\x14\xc5\x0d\x9c\xf6\xae\xe1\xbe\xb1\x53\x3d\x23\xdb\x8c\xb3\xd5\x1b\xa2\x45\x51\xd3\x83\xfd\x44\xd2\xbe\x47\x95\x53\xb7\xab\xb5\x0b\xc8\xf3\xbe\x47\x3a\x99\x1e\xb4\x8e\xfb\x9a\x42\xf7\x12\x75\x58\xa0\xf1\x63\x1c\x73\x2a\xb5\x52\x7d\x00\xd8\x32\x79\xc8\xd1\x67\xed\xfc\x64\x91\xdc\x4c\xac\x3c\xd7\xb9\xe6\x60\xf1\xa8\x8c\x73\x61\x24\x60\x3c\x5d\x5c\x76\xba\x91\xb3\x98\xd2\x07\x4e\x2a\xed\xca\x91\x0b\x8f\xbe\xd4\x59\xc2\x75\x34\xec\x27\x12\x51\xf1\x13\x0a\x02\x6a\x22\xfa\x48\x8e\x2f\x64\xe8\x39\x34\xac\x5d\xa8\x27\xf4\x04\xcc\x91\xe3\x72\x12\x26\xa7\x76\xe7\xc4\xde\x87\x2e\xb4\x96\xcb\x66\xc0\x32\xc5\xb0\xd8\x86\x6f\xc8\xb4\xcc\xfa\x4a\xbc\x1f\x16\xd0\x27\xce\xc8\x45\xee\x92\xcd\x54\x8b\x9e\x02\x2c\x5c\x66\xc0\x6c\x6b\xeb\x99\xdc\xdc\x8e\x32\xb0\x2b\x54\x68\x46\x0e\xb2\x4f\x63\x0f\xa7\xd9\x13\xaa\x06\x79\x1a\x41\x16\x1d\x4d\x88\x7c\xae\x43\x8f\x9b\x38\xe4\x0d\xa8\x2d\xe7\xba\xdc\x79\x81\x4d\x07\x12\xa4\xeb\xdd\x71\x00\x14\xbb\x27\x08\x8f\x32\x8e\x5a\x0d\xb3\xd5\x84\x5b\xe3\xf3\x48\xeb\x88\x2b\x0c\x40\x9c\x92\x68\x1d\x6c\x86\xe3\x50\x58\x5e\xf0\x18\x67\xc1\xca\x87\x27\xd4\x71\xac\xb9\xd5\xe7\x64\xb7\x9e\xad\x61\xa4\x66\xda\xd6\xbb\x41\x8a\x3e\x58\x94\xa4\xdd\xad\xa7\x6d\xee\x9b\x6b\x43\xab\xe1\x76\x29\xfb\xc0\x7d\x41\x35\xcc\xc1\xe4\x8e\xb9\xbd\xf3\x4c\xc6\x3b\x83\x25\xd2\x96\xa4\x11\xa5\x2d\xb7\xd7\x55\xe1\xae\xfb\x3d\x4f\x71\x57\x4b\x96\x76\x4f\xe8\x58\xbd\xce\xe0\x1c\xe0\x68\x4a\xc5\x40\x2f\xd7\x0f\x4d\xae\xde\x63\x2c\xb7\xf3\x05\x73\xcc\x64\xd8\x36\x66\x49\x84\x35\xaa\x38\x19\x9e\xf0\x02\xf2\x43\x56\x0c\x52\x25\xb7\x51\x70\xae\x1a\xb2\x8d\x44\x5c\x9e\x21\xa6\xd1\x38\xbb\x96\xc3\x85\xeb\xbe\xb9\xb8\x4b\x69\x04\x3f\x92\xf1\xf1\xc4\x0e\xad\x4b\x6f\x20\xe4\x6b\xcf\x4b\x25\x52\x01\x16\x50\x4e\xd7\xc6\x0e\xac\xc9\x21\xef\xb9\x97\xb9\x1a\x6a\x39\x1c\x6d\x3f\x50\x43\xa7\x0c\xa7\x54\x8d\xa4\xbe\xd6\x5d\xaa\xb1\x26\x79\xb8\x53\x12\xb7\xf1\xd3\x8c\x78\x18\xb1\x85\x98\x99\x11\x60\xb7\x4d\x42\xba\xf5\x44\xb9\x8f\xba\xd4\x17\x52\x1e\x06\xed\x30\xbb\x03\xb0\x46\xcc\xb3\xae\x30\xea\xed\x60\x82\xea\xf0\x7a\xe9\xa8\x6a\x65\x10\xe8\x0a\x2f\xf7\xc4\x5a\xb8\x63\x95\x66\xa9\x2c\x50\x51\x50\x3a\x38\xc0\x09\x71\x3b\x66\x8f\x5e\xde\xd9\xf5\x83\x78\x0a\xc8\x69\x9b\x02\x14\x81\xbc\x15\x78\xa2\xb8\x94\x06\x98\x24\xbb\x34\xc5\xc9\x71\x86\xc2\xdf\x2b\xb9\x99\xbb\x77\x17\x18\x27\x1e\x44\x0d\x4d\x6e\x20\xd3\x36\x19\x76\xe7\x46\x7e\xa2\x07\x80\xa6\x2c\x95\xeb\x52\x59\x7b\x85\x39\xd3\x8e\x4e\xc1\x0a\xd6\xaa\x6c\x1e\x97\x50\x7c\x15\x58\x84\x1d\xe3\x5a\xba\xc4\x8a\xc6\x7a\x42\xbb\xa9\x07\x01\x68\x76\xa3\x9a\xbc\xb7\xb9\xa0\x59\x3c\x9e\x15\xa0\xde\x82\x13\xca\x1a\xce\x46\x3d\x23\xf4\x55\x36\x23\xfd\x12\xce\x3e\x42\xfe\x04\x08\x1a\xf0\x69\x42\xa3\x82\xc4\x84\xe5\x5b\xa3\xb6\x4e\x6d\x99\xc0\x73\xf3\x70\x67\x7c\x32\xbf\xf7\x59\xba\xef\xdd\xd5\x5a\x7e\x03\xe1\xf1\xe3\xff\xf4\x0d\x9f\xff\x96\xdf\xf9\x13\x6f\xfe\xce\xcf\xb0\x5f\xf0\xb9\xf6\xcb\x3e\xf7\x47\x3e\x50\xbf\xf5\xa3\xfe\xd0\xfb\x7e\xca\x0f\x7e\xd0\xcf\xfe\x3b\xaf\xff\x94\xd7\xfc\xc3\x27\x14\x1e\x13\xdc\xe0\x90\xd7\x4e\x49\x27\x6d\x6e\x42\x23\x6d\x64\x54\xa9\xf2\x71\x91\x02\xf8\x58\xbe\xf1\x6b\x0f\xca\x34\x0d\xe3\x64\xfb\x09\x30\x07\x9b\x80\x8e\xe6\x2b\x6d\xc8\x0d\x22\x35\xef\x73\x9e\x13\x9a\x89\x80\x02\x52\xf5\x09\x8e\x85\x74\x5e\x50\x12\xa8\xe0\x92\xf4\x91\x06\x8a\xd8\x2f\x14\xcb\x40\x52\xf8\xdb\xee\x58\x0b\x89\x0e\xf1\x04\x0f\x03\x1a\x76\x55\x1c\x40\x8d\xbd\x98\xcf\x69\x53\x15\x80\x4d\xee\x89\xca\x5c\xb7\x13\xfa\x88\x79\xba\x5a\x38\xad\x61\x55\xc3\x70\xb3\x43\x0d\x8a\x05\x3e\x13\x23\xea\x28\xb7\xe0\xf6\xe8\x44\x29\xeb\xe4\xb1\x9f\x68\xe3\xc0\x98\xc0\xd0\x01\xc5\x49\xd7\x5a\x3b\xf7\xe4\x58\x61\x78\x27\x0e\xbc\x61\x54\x61\xa3\xa5\x89\xd3\x49\x06\x01\x6b\x02\xd4\xb2\x27\x98\xf6\x66\x27\xa4\xc3\x55\x55\x45\xbd\xe9\x85\x9c\x54\xbb\xc9\xe3\x9e\x2a\x04\xcb\x49\xac\x15\xac\x1e\xc7\x42\xea\x42\x41\x9e\x60\xd1\x07\xaa\x51\xd4\x53\xb7\x7b\x4a\x66\xf8\xdc\x14\xb6\xd8\xd0\x4c\xb8\x4a\x13\x61\x42\x9b\x3f\xee\x84\x8c\xd6\x1c\xa3\x7b\x32\xdc\xcb\x99\xeb\x13\x81\x87\x05\x7f\x0b\x82\xc1\x80\xac\x1a\x5e\xa6\x04\x17\x21\x09\xc5\x3e\xb7\x26\x87\xb2\x80\xd5\x89\x82\x19\xfe\xbc\xa3\x97\x64\xe9\xf9\x88\xe6\x66\x9e\x93\x5d\x78\x22\x73\xe9\x8b\xdc\x62\x4d\x48\x35\x9b\xcd\x08\x4f\xb6\x00\x40\xe6\x2a\xeb\xba\x0d\x89\x28\x37\xcd\xbb\xf7\xe1\x81\xca\x1c\x05\xc1\x49\x33\x0f\xe9\x13\xd2\xe2\xec\x03\x22\x1a\x39\xa8\x8c\xda\xf3\x54\x6c\x8f\x0e\xeb\x72\x24\x07\x12\x93\x28\x26\x4a\x93\x9f\x90\xdf\xde\xf9\x5a\x9c\x32\xc7\x7a\xeb\xb5\xcf\x03\x69\x3e\x17\x36\x3c\x1f\x7b\xd3\x4c\xce\x99\x0e\x18\x38\x95\xc7\x01\x5b\xf6\x79\x14\xff\x44\xd2\x7e\x6e\x5a\xae\x11\x9c\x30\x2d\x34\x78\x65\xb9\x5c\x0a\xeb\x3a\x20\x3a\xe6\x08\xfe\xe8\xd7\x82\x24\x0f\x8f\xcd\xb4\x6c\x46\xc8\xca\x13\xd5\x6b\xcd\x20\x9a\x17\xba\xb1\xd5\x10\xa5\xb9\xea\x60\x9c\x1f\xe2\xc4\xba\x27\x61\xa5\x2a\x45\x02\x7f\xa3\x58\x6e\x28\x94\x38\xc7\x7c\x02\xcc\x51\x90\xca\x2d\x81\xaa\x2b\x9e\x8b\xdd\x1a\xcd\x82\xca\x0c\x96\xaf\x7b\x85\x7e\xd5\x74\x61\x32\x66\xbd\xe9\x91\x23\x77\x18\x61\xd6\x9e\x50\x84\x61\x7e\xb3\xe3\x96\xca\x0f\xd0\x99\x31\x8e\x1b\x48\x68\x2e\x86\x77\x29\x42\x3e\x10\xc5\xad\x94\xe3\x70\xa2\xd2\x5b\x99\x83\x90\x27\xe0\x35\x6d\x03\x96\x7a\xa3\xca\xcc\xc0\xd3\x86\xfb\x4e\x97\x23\x77\x32\x76\x1b\x47\xe7\x31\x4c\x06\xf1\xd8\x5e\x98\xbe\xe4\xa2\x82\x6d\xff\x84\x5e\xd1\x74\xbe\xb8\x04\xad\x8d\xcd\xb8\x4f\x5c\x46\x7d\xef\xc4\x5d\x3e\x82\xc2\xe5\x20\x11\x98\x04\xd5\x3a\x8a\x52\xc0\xc8\xdb\x5b\xff\x44\xdb\x57\x65\xd0\xdf\x9c\xda\x08\xdb\xa5\xaf\x2d\xfc\xb5\x6e\x8b\x46\x33\x5d\xd7\x60\x0c\xe8\x33\x85\x45\xc7\x19\x37\xa5\xb3\x11\x04\xe8\x13\x54\x43\x45\x43\xdf\x35\x21\x31\xd1\x6a\x6d\x0b\xc1\x32\x83\xc8\x0e\x74\x04\x7e\x5f\x27\x17\x04\x15\xe3\x7b\x05\x61\xe2\x11\xa7\xcd\xf0\x09\x6d\xc5\x48\xf0\x6a\x53\xb2\xbe\xfd\xa9\x89\xb8\x24\xd6\x8c\x91\xe9\xaf\x2c\x0c\xf4\xa0\x4f\x5c\xf2\x52\xd9\x92\x76\x94\x86\xe7\xd4\x4f\xb4\x3a\x31\x0a\xec\x39\x69\xb6\x40\xe1\x70\x69\x0d\x8e\x7d\x99\xc9\xcf\x11\xe4\xdd\x2c\x3d\x65\xb3\x77\x3a\xbb\x3f\xf7\x28\x97\x3a\x2f\xe4\xf8\x23\xf0\x9a\xe9\x5b\x59\x9f\xbd\xd0\x20\x03\xcf\x2c\xe0\xd6\xf8\x1a\xc9\x35\x34\xdd\xf1\x28\x85\x88\x2d\x11\xbc\x0e\x90\x36\xc8\x71\x3f\x42\xbb\xcc\x79\x55\x89\x8e\x5b\x8e\x7c\x35\x92\x02\xd4\xe4\xf4\x34\x12\xcb\xd2\xd1\x01\x3d\xa4\x5b\x9c\x2c\x87\xf8\x4d\xf6\x3a\x3b\x60\x2f\x4e\x61\x7a\x99\xbd\x10\xb1\x61\xa7\xa6\x49\xb3\xc4\x7a\x5b\x18\x82\xc6\x9a\x54\xad\xdb\x4c\xd6\xe1\x75\xc7\x7c\xdd\xe7\x8c\x1b\x5e\x09\x86\xee\x3b\x7b\xa2\xb8\xa4\x54\xcf\x85\xae\x7b\x6c\x60\x7c\x60\xea\xa2\x11\xe0\x92\xe8\x5c\xbe\x08\x49\x62\xc8\xc9\x2b\x6d\xfb\xb9\x55\x82\x42\xd9\x49\x9f\xa8\x5e\x0f\x68\x5c\xc7\x0c\xc2\x5c\x46\x81\x6e\x98\x4a\xdd\x4d\x82\xda\x4c\xd4\xdb\x64\x5e\xf5\x22\x6a\x93\xeb\x92\x41\x93\x39\xe0\x09\x9f\xc0\x23\xd8\xd2\x5b\x34\xbd\x9c\x2f\x0a\x83\x05\x5a\xef\xfc\xaa\xa4\x38\x9f\x92\x3c\xd9\x29\xd4\x59\xe5\x28\x57\x1d\xdd\x5f\x62\x57\x69\xed\x13\xb7\xd6\xd5\xb1\xba\x5b\x86\xa1\x1a\xb1\xda\x4d\x80\x60\x8e\xbe\x80\xba\xa1\x8b\x26\xec\xa9\x41\x4e\xb7\xc5\x4d\x21\x6d\x8d\xf3\x17\x7b\x22\x8e\x10\x90\x59\xc1\xd1\xdc\x83\xa7\xea\xc0\x1a\x2d\x5b\x06\xe2\x29\xf8\x00\xad\x24\xd1\x8b\x48\xdb\x59\x28\x9b\x82\x1b\x0c\xb1\x9f\xc8\xf8\x28\xe1\xe0\x85\x9b\xd9\x0b\x4a\xd0\x32\x2a\x15\x25\xf3\xe2\x66\xa2\xb0\xa8\x31\xb7\x0a\xf2\x14\x98\x36\x8b\xfb\xec\xf2\x8c\x37\xcb\x4f\xec\x4e\x1e\x26\x9d\x40\xc6\xa6\xbd\x09\xb6\xc2\x90\x32\xce\x2d\xc7\x75\xa4\x3e\xc3\x29\x07\x02\xe0\x02\x33\x5a\x24\xe7\x0b\x1f\x88\x8b\x27\x50\xd1\x28\xe2\x26\x49\x53\x03\x43\xec\xb2\x1f\x09\xea\x15\x7c\xb9\x53\x5d\x09\xd6\xb6\x2c\x66\x36\x93\x1d\x63\x01\x47\xe2\xa5\xd9\xf6\x3f\xef\xce\x4f\xfe\xad\x2f\x12\x1e\xdf\xf3\xd9\x6f\xfa\xe8\xef\xfd\x95\xd7\xfe\x95\xff\xfd\xe7\x7c\xe8\xab\x5e\xf5\x57\x3e\xe8\x23\xfe\xc4\xc7\xb6\xdf\xfe\x2d\xbf\xef\x75\xbf\x65\xbf\xe5\x43\x7f\xd7\x1b\xbe\xe3\xdb\x3e\xef\x57\x09\x8f\xb7\xfd\x8c\x7f\xef\x7b\xdf\xfd\x83\x5e\xf9\x36\x2f\xfe\xcb\xfd\xfa\x77\xfc\x98\xb7\x7b\xfd\x3b\xfd\xe2\x0f\xff\xb7\x3f\xdc\xde\xe7\x55\xbf\x45\x7d\xd2\xcf\xfc\xdc\x9b\xfe\xf9\x7f\xf8\xfa\x1f\xfc\x33\x1f\xf2\xba\x1f\x20\x5f\xfc\xd6\x3f\xfd\x12\xd3\xcf\xf8\x3a\xf5\x1f\x7d\xce\x1b\xdf\xf8\x8d\xe5\xdf\xff\xf8\xbf\x7d\x7e\xe0\x1f\x7e\xfb\xbf\xfd\x31\xef\xf6\x79\xf7\xf7\xfe\xdc\x97\xbe\xdd\x67\x7e\xf6\x1f\xff\xb4\x4f\x7c\xe3\x9b\x5f\x62\xfa\x86\xff\xe9\xf7\xbf\xf9\x4b\x7f\xdf\x7b\x7f\xca\x6f\x3a\x5f\xff\x39\x6f\x7a\xd5\xbf\xf8\x1b\xff\xa3\xf8\xa8\x57\xfe\x9e\x9f\x7e\xd5\x37\x7f\xe9\x6f\xfa\x97\x9f\xf0\xbb\xf4\x8f\xff\xd1\x97\x98\x7e\xf3\x7b\x7f\xdf\x47\x7c\xfa\x5f\xff\x23\x9f\xf8\x85\x1f\x6c\xdf\xf2\x9a\x8f\xfd\xae\xff\xe4\xeb\xff\xe0\x0f\xbd\x9d\xfa\xcc\xfb\xf7\xfd\xa5\xb7\xf9\xbc\xef\x7b\x9f\xbf\xfb\xea\x77\x7a\x89\x29\x7d\xb5\xfe\xc7\xaf\xff\xf3\xf6\x3f\xff\xa8\x77\xff\xfb\xff\xfa\xcd\x3f\xff\x9e\x6f\x90\xf8\x43\x3e\xf6\x0f\xbc\xe1\x5f\xbd\xef\x4f\xbc\xee\x43\xdf\xf0\xdf\x7d\xfb\x2b\xff\xe2\x4b\x4c\xff\xe9\x8f\x7e\x7f\x78\xa7\xd7\xff\xb9\x7f\xf4\xd5\xc7\xef\x7d\x9f\x6f\xfc\x77\x7e\xfc\xf5\x6f\xf9\xd0\x7f\xfe\x2d\xe4\x1f\x7c\xc6\x5f\xfa\x80\x1f\xd6\xe2\xc7\x5e\x87\xfe\xe0\x4b\x4c\x3f\xfb\x57\xfe\xce\xef\xf8\xb2\x57\xbf\xe2\xfb\xbf\xfb\xc3\xde\xf1\x63\x3e\xe7\xed\xfe\x93\x1f\xfe\xe3\x1f\xff\x39\xff\xf8\x33\xde\xf2\x6e\xef\xfd\x0d\x5f\xf7\xcb\x6f\xfd\xee\xf7\xff\x9f\xde\xff\x25\xa6\x7f\xed\x47\xfb\x87\x7f\xf1\x07\xfe\x07\xff\xfc\x7b\x3f\xfc\xfd\xd4\xfa\x4d\xd7\xdf\x7a\xf3\x87\x7e\xdc\xc7\xfd\xdd\x77\xf8\x53\x7f\xf3\x4f\x7c\xd8\x67\xbd\xee\x23\xbf\xf3\xf3\x3f\xeb\x25\xa6\x1f\xff\x61\xff\xab\xcf\x3a\xdf\xfa\x39\x9f\xfa\xbf\x79\xe7\x30\xe3\x97\xbf\xf6\x8f\x82\xb7\xfe\x3f\xbf\x67\x7f\xd3\x07\xfd\xfb\x5f\xf5\x4f\xfe\xfc\x7b\xfd\xab\xcf\xfd\x17\x3f\xff\x12\xd3\x1f\x7b\xd7\xb7\xf9\x8f\x3e\x5b\x7c\xfa\x7f\xf1\x9a\xaf\xff\x93\x9f\xfb\x7f\x79\xcb\xb7\x7c\xdb\x57\xff\x81\x9f\xfc\x82\xe3\x1d\xbe\xef\x93\xff\x5f\x3f\xf7\x01\x1f\xfd\x7e\xaf\x7d\xdb\x57\xbd\xc4\xf4\xed\xbe\xf3\xcb\xfe\xc0\xbb\xfd\xeb\xbf\xf6\xa6\x2f\xf8\xd4\x4f\xff\x3b\xef\xf2\xb5\x5f\xf9\xbe\x3f\xfb\x9a\x77\xfa\xe8\xf5\xc7\x3e\x7f\xbd\xeb\x1b\x3e\xe9\x64\x7f\xe0\x95\x1f\xf7\xd2\x0f\xfb\xa9\x7f\xf1\x2b\xff\x51\xfc\x3f\x7d\xcc\x47\xbb\x57\x8d\x8f\xfc\x62\xf8\x0d\xaf\x78\x9f\xcf\xfb\x98\xd7\xff\xc9\x57\x7f\xcf\x07\x7e\xe2\xdf\x1f\x7f\xe1\x3f\xfc\x92\x4f\x7e\x89\xe9\xcf\xfd\x17\x3f\x26\xc4\x96\x6f\xf7\xfb\x3e\xe4\x17\x3f\xeb\xb5\x9f\x36\xfe\x9b\xb7\x7e\xc3\x8f\x7f\xd3\x5f\xfa\xab\xff\x8f\xf7\xfe\xc8\x0f\x78\xaf\x2f\xde\x5f\xf5\x8a\xaf\x7d\x89\xe9\x67\xc1\xdf\x65\xbe\xe2\x7f\xf8\x81\x5f\xf9\xf2\x2f\xf9\xc9\x7f\xf0\x9f\x7e\xba\xf8\xf0\x2f\xfb\x3d\x3f\xfa\xbb\xff\xc4\x7b\xfc\x75\xf8\x96\xd7\xbd\xfa\xcb\xbe\xf2\x1d\xbe\xed\x3b\x5e\x62\xfa\x61\xff\xfd\x1b\xdf\x37\xfd\xe0\x7b\xfd\xee\xbf\xf5\x1f\xf0\x3f\xf2\xc1\x1f\xbe\xbe\xe9\xb3\xbe\xe1\xa7\x3f\x7e\xfe\xd0\xbb\x7f\xd5\xbf\x7a\xdf\xff\xad\xfb\xe2\x2f\xfa\x99\x5f\x7a\x89\xe9\xff\xf9\xcb\xbf\xe6\x35\xef\xf4\xa7\x3f\xf8\x27\x5f\xfb\xa6\xb7\x7f\xf5\x78\xb7\x57\xbc\xfe\xd5\xef\xce\xfe\x8f\xfd\x95\x3f\xf0\xf7\xfe\xfb\x77\xfd\x4b\x6f\xfe\xa4\xef\x78\x8f\xf4\x12\xd3\xbf\xfb\x46\xf5\xf6\xff\xe3\xdb\xff\x85\x9f\xf9\xbe\x1f\xfc\xfe\x7f\xfc\x87\xd9\x97\xbc\xe9\x6f\xbd\xdf\xdf\xff\xc8\x5f\x80\x9f\xf8\x6e\xaf\xfb\xc2\xd7\xbe\xfb\xc7\xbd\xeb\x67\xfd\xd6\x97\x98\x7e\xf5\x6f\x7e\xe7\x57\x7e\xf8\xbb\x7c\xcf\x1f\xfe\x8b\x1f\xf6\x69\xbf\xf0\xc3\xef\xf7\x1d\x7f\xec\x3d\x5f\xf7\x0d\xdf\xf4\x4d\xbf\xfc\x97\x3f\xff\xfd\xbf\xfa\x1f\xfe\xc9\x37\x7d\xe4\x3f\xfa\x23\x2f\x31\xfd\x2d\xff\x30\x7f\xee\xff\xfa\xc7\xde\xf9\xe3\x3f\xfd\xcf\xff\xe6\x8f\x78\xaf\xb7\x9e\xaf\xfa\xbf\xfd\x57\x1f\xfd\x5b\xdf\x51\xf0\x8f\x10\xbf\xf8\xd5\x3f\xf9\xdd\xbf\xe9\xfb\x7f\xee\x25\xa6\xff\xe4\xb3\x7f\x29\xfc\xe5\x77\xf8\x9b\x93\xbe\xb2\xfc\x48\xfe\x9a\xbf\xf1\x3b\x7e\xfb\x6b\xfe\xce\x6b\xde\xf9\x75\x7f\xe4\x5d\xff\xe3\x77\x84\xdf\xfc\x17\xff\xc6\x6f\xfb\xea\x97\x98\xae\xaf\x7d\xc7\xdf\xfe\x9e\x6f\xf3\x1f\x1f\xbf\xff\x0b\xbe\xee\x3d\x7f\x51\xfd\xce\x9f\xf9\xcc\x5f\xfc\x3f\x7c\xcc\x6b\xfe\xfc\xef\xfe\x17\xff\xed\xaf\xbc\xf7\x4f\x7c\xe8\x7b\x7d\xd8\xff\xfd\x25\xa6\x1f\xf5\x57\x5f\xfd\xcf\x7e\x22\x7c\xfe\x5f\xf8\xde\xf5\x87\x7f\xe8\x9d\xde\xfa\xc3\xdf\xf9\xed\xff\xbb\x7f\xfb\x3d\xde\xe1\xbd\xdf\xf3\x0f\xbe\xe7\xfb\x7e\xf1\xa7\xfd\xbd\xb7\xf9\x95\x9f\x7a\x89\xe9\x6f\xfe\xa1\xf7\xfa\xde\x57\xbd\xcb\x9f\xfd\x8e\x37\xff\xd4\xa7\x7c\xf0\x5f\xf8\xb7\x3f\xf5\xbf\x7e\xc5\xd7\xfd\xde\xd7\xde\xaf\xfe\xfc\x3f\xf4\x09\x5f\xf9\x53\x9f\xf0\xc1\x5f\xf0\xa9\xef\xf8\x12\x53\xf5\xee\x6f\xfb\x45\xdf\xfa\x29\xf2\x5b\xd7\x2f\xbd\xe9\x53\xbe\xe7\x15\xff\xef\x4f\x7e\x9b\x3f\xf3\x7d\xff\xcd\x77\xfd\xb1\x3f\xfe\x13\xc7\x37\xbe\xcf\xef\xfe\xe6\xaf\xff\xe4\xff\xfa\x25\xa6\x9f\xfc\xb9\x3f\xf8\xdb\xff\xe5\x6b\xff\xd8\x8f\xfe\xc2\xb7\x7c\xd4\x3f\xfb\xa4\xd7\xfc\xe9\xf7\xff\x91\x9f\xa7\xff\xf4\xd5\xef\xf2\x1e\xff\x65\x31\xdf\xf8\x4b\x1f\xfe\xea\x6f\xfd\xd8\x97\x3a\xf0\x9f\x7d\xc5\xb7\x79\xf6\x0f\x5e\xf9\xd7\xfe\xcb\xf7\xff\xcf\x3f\xf0\x2d\x6f\xfb\x91\x1f\xf4\x29\xff\xd5\x1b\xcc\xb7\xff\x3c\xf8\xb3\x3f\xfb\x2b\x6f\xfc\x53\x9f\xfb\x01\xef\xf4\x57\x7f\x9d\x7f\xfd\x37\xdd\x2d\x0f\x8c\x14\x7a\x21\xa3\x93\x8d\x4c\x70\x79\x7c\xb2\x5b\x29\x07\x37\x6f\x7c\x6a\x49\xc7\x70\xad\xe3\x26\xaf\x90\x84\x98\x42\xcc\x43\xa8\x5c\x1e\x11\x59\x55\x4f\x60\x5f\x49\x79\x70\xe5\x48\xe9\x22\x07\x9d\x28\x86\x1b\x79\x21\xba\x75\x44\x34\xd3\x8d\x88\xb7\x91\x27\x1f\x9a\xf3\xf6\x84\xea\x9b\x5a\x95\xa0\xf2\xf5\xee\xa8\x77\x3e\xae\xba\x0d\x53\xc1\xfa\x05\xe4\x2a\x2d\xfb\x56\x77\xec\x21\x82\x56\x7c\x14\x57\xc4\x75\xd7\x27\x5a\xfe\x6b\x82\x6b\x22\x89\xef\x4b\x01\x23\xba\x8b\xbe\xd0\x72\x2c\x06\xd2\x21\xc8\xe6\x3e\x76\x7d\xc6\xab\x03\xab\x73\xed\x9b\x00\x92\x9f\x58\x0b\xad\xef\xe8\x68\x56\xd8\xcd\x75\x45\x5e\x8c\x8c\xd3\xd9\xd3\x16\x7e\xc4\xc5\x55\x21\x8c\xf9\x5b\x47\x0b\xe9\x41\xfb\x4d\xa2\x86\x0f\x30\x19\x14\x01\xbc\x4e\x67\xcc\xa5\x34\xaf\xb7\x9b\x38\xe5\x26\xa9\xdd\xa8\x9d\x87\x0a\x8d\x75\x45\xbb\xbc\x94\x05\x00\x1b\x73\x67\xac\xc0\x13\x88\x55\x01\x64\x5d\x41\xf4\x92\x54\x86\x3b\x65\x0b\x04\x6b\xac\x34\x2e\x85\xba\xf3\x6e\x7c\xab\xbb\x81\x7c\x47\x1e\xaa\x2e\x55\x5d\xfb\x89\xac\x4b\x6a\x45\x18\xbc\xb7\xae\xb8\x49\xc6\xc2\xa9\xbb\x21\xfa\x10\x69\x4f\x98\xcf\x7b\xd1\x7a\xdd\x11\xb3\x1a\xa8\x14\x02\x15\xba\xda\x13\xb8\x79\xb9\x45\x2f\xb7\x3a\x23\xaa\x9c\x71\xed\x18\x2d\x44\x36\x92\xb9\xf8\xe8\x03\xe2\x62\x29\x3e\xac\x9a\xb3\x4d\x66\x4c\x44\xae\x3d\xc1\xbf\xe2\x2d\xae\x79\x7b\xa5\x9b\xb7\x75\x6c\x03\xef\x81\x29\xaa\x19\x1e\xe8\x92\x39\x5d\x98\xc6\x78\x92\x66\xe5\xb5\xdb\xf6\x67\x5c\xee\x89\xea\xc0\x1c\xa7\x40\xee\xea\x6d\xd8\x44\x38\xf4\xa9\xdf\x91\xc3\x3c\x91\x74\xee\xce\x95\xa0\x9c\xeb\x75\x9c\x9b\x8d\xd3\x8f\x62\xcd\xb5\x9e\xd0\x9e\x8b\xd8\xf7\x81\x44\xb4\x00\xd2\x72\x7a\x78\xbf\xb0\x47\x80\x17\x00\xa5\x03\xc2\x83\x9e\x14\xe6\x08\xf3\x6e\x56\x8b\x7a\x4e\x9f\xea\x13\x05\x61\x52\x04\xb8\x5c\x37\xc7\x48\x83\xbb\xe6\x60\x29\x13\x96\x8c\x16\x9e\xdc\x02\xba\x59\x88\x81\x31\x19\x8e\x05\x71\x8b\x44\x06\xff\x00\x87\xc0\x1a\x73\x07\x81\xfe\xbc\xb2\xc9\x54\x1e\xa9\xeb\x92\x38\x14\xce\xde\x15\x38\x16\xc8\x51\xa9\x23\x96\x71\x21\x78\x45\xb6\x09\x9a\x1f\xc0\xcd\x6c\xd9\x59\x49\xe5\x84\x4d\xa1\xe2\x72\xe6\x4e\x2e\x96\x30\xeb\x8e\xac\x92\x82\x89\xa8\xc5\x69\x2b\x72\xc4\x8e\xdd\x70\x66\xf6\x44\x05\x8d\x89\x03\xda\x92\xa1\xf5\x13\x60\xad\xe0\x4a\xd0\xa4\xc0\xac\x23\xda\xd7\x34\x04\xd2\x65\xb7\x0b\x05\x75\xe5\x3b\xfa\x1b\xe0\x02\x9f\xb8\x2f\xfc\x6c\x17\x9b\xa0\x5c\x52\x69\x51\x42\x2a\x2a\x66\x44\x24\x23\xc3\x5e\xe2\x12\xf4\x92\xab\xe1\xf3\x90\xb5\x12\xe0\x6e\x03\x35\x7b\x62\xd4\x14\x23\x05\x2b\xe6\x5c\x5c\x08\x7b\x9c\x94\x9a\xf1\xe6\xad\xad\x10\x5c\x50\x38\xdc\x5e\xcf\x75\xb5\x29\x40\x3e\x50\xb9\xca\xb4\xf9\x89\x7e\xae\x1d\x6a\xf6\x34\x1d\x8c\xe8\x46\x0e\xd4\xb6\xf0\xc6\xee\x6d\xaa\xba\xbc\x16\xa0\x4d\x4d\x01\x6d\xb1\xb7\x76\xca\x55\x03\x71\xf9\x89\x71\x29\x0b\xb0\x2a\x8b\x3d\x6a\x0c\xb3\xaf\xa3\xe8\x8b\xdf\x99\x5a\x6c\x8f\x70\xed\xd8\x01\xd3\xbd\x67\xa6\x4f\x19\x89\x1c\x00\x8c\xcc\x9f\x60\xfb\x7a\x65\xdd\x51\xaa\xc2\x70\xe4\x4a\xad\x16\xd6\x7c\x10\x70\xe5\xdb\xcc\x06\xab\x86\x49\x65\xe5\xca\xa5\x3c\x4f\x84\x8f\x69\xf8\x03\x5d\xeb\x14\xb7\x8b\x15\x82\x66\x6a\xa4\x20\xaa\xed\x88\x19\x21\x2c\x46\x29\x88\xc5\xaa\x99\x82\xba\xb6\xd3\x4b\x03\x2d\xc0\x0a\xad\xbe\x9f\xe0\x5f\x7b\x93\x56\x01\x87\x06\x03\x0b\x1f\x6c\x98\xb3\xe8\x71\xb6\xbe\x58\x8c\x41\x35\xab\x0f\xbd\xd1\xcc\xa1\x9b\x3a\xdb\x39\x93\xb6\x4f\x54\x13\x3d\x5f\x00\x53\xe1\x6d\x3a\xb8\xd8\x87\xd4\x31\x02\xb3\xb6\x11\x6d\x27\x8a\xea\xa9\x15\x37\xd7\xe5\x2f\x2e\x64\xb6\x4b\x35\x46\x9f\x98\xec\xc0\x13\xcc\xea\xba\xb9\x3e\x38\xbc\x8f\x61\x02\x46\x41\xae\xa4\x8b\xf4\x5c\x9c\xa5\x70\x8b\xac\x2d\xeb\x70\x24\x74\x0f\x58\xdb\xee\x89\x31\x3a\x27\x36\xc6\x1a\x0b\x7d\x2a\x4d\xef\x21\xbb\x2a\xaa\x62\x20\x64\x27\x68\x1d\xd4\x1e\x45\xe8\x7d\x8f\x9c\xcf\xec\xce\x7d\xb9\x03\x3c\xc1\x39\x0a\xe3\x95\xb8\x13\x08\x97\x21\x3e\x9c\x1d\xec\x36\x0e\x79\xa9\x42\xc3\x1a\x2c\xa7\x83\xc2\x65\xe6\x62\x11\x4e\x22\xf5\x99\xcf\x47\x86\x05\x5e\xa7\xcc\xc1\xe3\xd1\x53\x5c\x0d\x2b\x87\x2e\xab\x9d\x5f\x80\x21\x0b\x81\xab\x4e\xcd\x72\xe6\x01\x0c\x4a\xa0\x49\x94\xa7\x7f\x84\x11\xef\x27\xf4\xdb\x5c\xb7\x39\xf3\x70\x12\x6e\x95\x51\x62\xc3\x33\xd3\x86\x3c\x97\xab\x5a\x25\x07\xa5\x2b\x2f\x20\xc4\xc4\xa4\x7e\xa6\xb7\x6d\x4e\x75\xa0\x2b\x49\x55\x7a\x6d\xc0\x87\x23\xdf\x84\x70\xce\xea\x79\x8a\x78\xab\x7b\xc0\xa9\xda\xa6\xb4\xd8\x43\x12\x61\x64\xf6\x4f\xd4\xf1\x36\x15\xa4\x4e\x07\xcc\x44\x09\xb3\x32\xac\xbd\x92\xd6\xfa\x50\xe8\xde\x9c\xfa\xd2\x99\x40\xdd\x7b\x62\x76\x77\x34\x2c\x73\x81\x27\x5a\x4f\x32\x63\xf9\x88\xdb\x87\x7c\x75\xcd\xb8\x05\x95\x37\x05\x69\xa9\xd8\x31\x55\xa0\xbb\x28\xb7\x19\xbf\x10\x6a\x7c\x15\x51\x6f\x0e\xd2\x6f\x10\x9c\xfd\x9b\x18\xd2\x07\x08\x8f\x3b\x99\xcb\x58\x0d\x0f\x8d\x77\x38\x47\x5f\x1c\xc7\xfb\x34\x14\x78\x23\x81\x16\x75\xc5\x16\xa4\x1e\x83\x73\xb8\x4a\x0d\x07\x0d\x4f\xc8\x15\x42\x3f\x2e\x77\xb0\x78\x78\x7b\x5b\x13\xea\x09\xef\x73\x25\xc6\xfa\x69\xf9\x6e\x6c\x30\xd9\x97\xdf\x52\xb8\x03\x63\x06\x96\x27\xeb\x89\x6e\x80\xdb\xda\x70\x8d\x95\x36\x45\x29\x43\x9f\x57\x6b\xe3\x6e\x60\xaa\x5b\x6d\x09\xa4\xeb\xb3\x5b\xc2\x09\x34\xa4\xf7\x89\xac\x4e\xfe\x89\x5e\x15\x2d\xa8\x16\x48\xef\x04\x24\xd1\x2d\xac\xc8\x10\x1c\xa7\xac\x17\x2b\x0b\xd7\x74\x8a\x6a\x8c\x5c\xa7\x70\x79\x9c\x2e\x14\xf5\xcc\x9c\x2e\x3d\xee\x65\xf9\x08\xe9\xb2\x25\x92\xdc\x2c\x5f\xed\xd2\x60\xf5\x08\x8c\x32\x8a\x8b\x73\x0b\x53\x8e\xbb\x16\x04\x1b\x22\x95\x97\x27\x7a\x98\x6e\x64\x0e\x29\x30\x16\x33\xf4\xae\x8a\x65\x18\xb0\xab\xc9\x8c\x2a\x42\x8a\xf7\x72\x58\xa6\x2f\x0f\x30\xc0\x87\xb9\xce\x39\xc7\x13\x45\x50\xea\xa2\x65\xc1\x87\x40\xfa\x2d\x1a\x9c\x1c\xdf\x3d\x29\xa3\x94\x3d\xda\xdc\x32\xf1\x5d\x40\x55\xe2\xa0\x4d\x70\x20\xe5\x71\xd2\x27\x48\x41\x8a\x52\xbb\x84\x27\x5d\x5e\xc2\x4c\xb8\xae\x7c\xe7\x3a\x33\xcc\x79\xfb\x52\xa0\xad\xa5\xcf\x66\x74\x9b\xe6\x74\x42\xb1\x21\x42\x79\x82\x82\x3a\xae\x7e\x6e\xe0\x5b\xba\x52\xec\x0a\x66\x84\xbd\xe7\x28\x48\xa4\x7a\xc5\x20\x45\x82\x85\x98\x92\x45\xa6\x79\xc1\x6b\xde\x8d\x3e\x91\x90\xec\xb9\x60\xeb\xd8\x9a\xc1\x4f\xbf\x9d\x9d\x69\x5f\xa6\x18\xc1\x69\x2f\xab\xf9\x8a\x73\xc0\x96\xe5\x1c\xec\x69\x1c\xd5\x74\x3d\xd1\x54\x4d\x99\x54\xd9\xbd\xf0\x9b\x19\xde\x89\xd4\x12\x25\xb5\x15\x76\x26\x8f\x10\x26\x2a\x74\x10\x5a\x23\x0f\x7c\x17\xad\x44\xf7\xf6\x2e\x4f\x48\x00\xa5\x86\x2b\x8f\xa0\x00\xa0\xc7\x70\x21\x72\xe2\x50\xb6\x7c\x1a\xad\xe4\x85\x28\x59\xa7\x5e\xfe\x2c\xa6\xf0\x88\xce\xe2\xe5\x09\x9e\x90\x7a\xc5\x00\xf7\x22\x90\x95\x69\xd1\xe8\x99\x47\x9d\xcf\x62\x03\x3a\xef\x2b\x0e\x60\x88\x2c\x8b\x0e\x3b\x38\x4a\x36\x4e\x9f\x7b\x79\x22\x45\x64\x8e\x9d\x50\x8d\xdb\xf0\xc9\x88\xd0\xd2\x8c\xec\xd6\x56\xee\x05\xf4\x70\xdc\xa8\xf2\xc3\x24\xe4\xd7\x36\xde\xf6\x51\xca\x05\xcb\x23\xd2\x50\xd7\x05\x33\x64\xd0\xe2\xfd\x7d\x80\x4b\xa3\x78\x5b\xd7\xb2\x71\xad\x8b\x12\xf6\x39\xb8\x58\xcd\xe6\x17\x16\x48\xd7\x5e\x8f\x5d\x9e\x80\xd7\x60\xfe\x6a\xab\x10\xaf\xce\x1c\x1a\x5d\x97\x94\xec\x9a\xad\x31\x2e\x37\x20\x3a\xed\xcb\x73\x97\x3c\xeb\x40\x86\x52\xbc\xd2\x81\x3e\x71\x5f\x54\xdf\x08\xf1\x2b\x4e\x64\x2c\x68\x9b\x4d\xc9\x2e\x61\x37\x62\xb9\x53\xd8\xc5\xd5\xa0\xa8\x11\x93\x09\x97\xef\xdc\xc6\x85\xca\x03\x82\x33\x6a\x49\x91\x00\xb4\x8c\x64\xf7\x8e\x6f\x8c\x5e\x80\x4b\x8b\x03\x4a\x80\xbd\x2e\x57\x50\xbc\x71\xbd\xdc\x59\x7c\x5e\xc9\x01\xbb\xe8\x03\x9d\x11\x2c\x31\x37\xa9\xd5\xf2\x05\x20\x05\x06\xb1\x9e\x07\x83\x11\x1d\x19\x5e\x1e\x81\xcd\xc5\x9a\xcd\xcf\x8a\x14\xbb\x4f\x72\xaa\xdb\xad\x27\x84\x88\x51\xd0\xa4\xc1\x0b\xd9\x4b\x56\x1e\x2a\x18\xbb\x08\x69\xb6\xbd\xe8\x59\x6e\xcb\x27\xb9\x75\x66\x23\xf0\x36\xe8\xc9\xca\x45\x19\x7b\x62\x9a\x41\x82\xf5\x16\x2c\xf2\xa1\xd8\x0d\xd2\x1c\xbe\x72\x59\x6e\x59\xcf\xb0\x4a\x68\xac\x36\xd7\x2a\x30\x97\xb0\x46\x88\xa2\xfb\x89\xf8\x13\xfb\x62\xf3\xc0\xe7\x38\x75\x4a\x38\x45\x2d\x34\x28\xe1\x98\x7e\x11\x7f\x9d\x85\xae\xe8\x8b\x1b\xf6\xd8\xc9\xb9\xa1\xa5\x6c\x71\x7b\xf0\x44\xde\x09\x8f\x9e\xfa\x8d\x39\x3f\xc3\x76\xac\x18\x21\x4e\x38\x66\xf0\x57\x91\xa7\x9b\x1d\x8f\xec\x29\x5f\x4a\x74\x71\x9e\x2f\xfc\xe9\xe9\x13\xfd\x9f\x96\x2d\xe9\xf3\x36\xed\x88\x87\x09\x73\xec\x1b\x52\x7f\x5f\xb0\x70\x63\xb0\xbb\x81\x65\x19\x0c\xb1\x31\xbe\x16\x00\x2a\xc7\x05\x1e\xa0\x26\x29\xc8\xb1\x19\x74\xc5\x5a\xce\x79\xe1\xd3\x4f\x93\x6f\x70\xd8\x99\x0e\xab\xe9\x95\x33\x61\x5a\x81\xe5\x6e\x31\xd0\x95\xef\xe3\xb8\xe0\x13\x63\x74\x64\x2a\x75\xa8\x2c\x75\x83\x45\xd6\x86\xf8\xd9\xc9\x9e\xc2\x9b\x54\xcf\x1b\x7b\x70\xc6\x36\xe0\x9a\x11\x62\x93\x71\x51\xd5\xe4\x27\x84\xcb\x6c\x40\x4a\xa8\x9a\x1d\x31\xbe\x5b\x3f\xeb\xf0\x24\x44\xd2\x84\x99\x3a\xb7\xd0\xdc\x72\x09\xc2\xd3\x49\x28\xb2\x39\x64\x99\x4f\xcc\xd6\xa6\xbd\x6d\xca\xc6\xb9\x20\x3b\x66\x0e\xc4\x25\x76\x37\x0f\x45\x95\x2a\x09\xae\x23\xa9\x88\x84\x7c\xc5\x80\x09\x57\x99\x20\xdc\xe9\x23\x82\xf6\xa2\x2f\x8d\x91\xc2\x0a\x79\x11\xf1\x2c\xfc\x9e\x91\x24\x7f\xc8\x70\xd6\x10\x32\x38\xdb\x5c\x3d\x20\x36\x51\x4e\x5d\x95\x55\x9f\x28\xa8\x24\xac\xa2\x8b\xb1\xd7\x69\x99\x9d\xcd\x52\x8d\x2b\x45\xd1\x45\x73\x00\x82\xe1\x59\xca\xb2\xfd\xf2\x5b\xe6\x4a\xda\x39\x53\x7b\xe2\x8c\x30\x37\xfd\xb4\x85\x43\xcb\x43\x0b\x5c\xaf\x54\xd5\xd8\x98\x24\x26\x68\xa8\xc3\xdf\x32\xd1\xc1\xf8\x96\x2c\xa0\xa8\x51\xb9\xae\x47\x26\x3b\x10\xa5\x78\x1f\x99\xd1\x6d\x91\xab\xb7\x1b\x74\x68\x1f\x8f\x39\x11\xe0\x27\x06\x87\xb5\x19\xae\x5b\xa9\xe5\x4e\x4f\x80\xd6\xf9\x25\xa2\xcc\x5f\x27\x3c\xfe\x4d\x3a\xaf\x07\x08\x0f\x29\x2c\xba\x66\x5e\x85\xdc\xf9\x08\xa1\x94\x06\xea\xbe\xbc\x51\x56\xc8\xae\x7c\x96\x6d\x19\xdf\x2e\xda\xb1\xf6\x44\x45\x62\x9f\xe8\x12\x61\xb4\x01\x38\xf3\x95\x54\xe3\x2c\xc7\x2b\x6e\x52\xdd\x99\x5a\x4b\x89\xa4\x9c\xc1\xac\xe9\xb8\x39\x9e\x5d\xcc\xa3\x9c\x9b\xcb\x5d\x9e\xe0\xac\xc6\x75\x47\x50\xe9\x9d\x35\x38\xc5\x59\x96\x3a\x88\xf2\x7a\x1f\xb1\x4b\xc9\x61\xeb\x73\xab\x06\xa7\x89\x64\xca\xfb\x98\xf7\x9d\x9f\x18\x9b\x4f\x0f\xaa\x57\x02\x9a\xb6\x0b\x46\x93\x37\x49\x89\xc2\xeb\x0a\x83\x36\x3b\xd6\x19\x2f\xe7\x7a\x55\x68\xa5\xc5\x48\xbb\x0e\x4c\x58\x79\xa2\x02\x83\x86\xf4\xae\x2f\xd4\x49\x44\x21\xba\xc2\x58\xd9\xf8\x3c\xb9\x98\x08\xdc\xb7\x6d\x1b\xf6\x0c\x7c\xa5\x98\x09\xb4\xa1\x4a\xc0\x3d\xc1\x2e\x67\x1f\x86\xbe\x75\xbd\x54\x07\xc9\x98\x8e\xad\x5a\x69\x06\xc8\x6a\x10\x11\x5c\xb1\x36\xb3\x29\x39\x28\xee\xce\xf2\x63\xa4\xfc\x88\xe6\x86\xf6\x7d\x37\x37\x78\x5b\x92\x4f\x46\x4f\x0d\x78\xa0\x10\x05\xc5\xcf\x7a\x42\x6e\x79\xa7\x1b\xd3\x6d\x7d\xb0\x71\xc8\x50\x1c\x78\x42\xd5\x60\x05\x86\x59\x69\xc5\xa4\x43\xe9\x82\x92\x5e\x8b\xac\xa2\x02\xe1\x9b\x39\x9b\xfd\x52\xbc\x23\x2a\xa2\x99\xca\xb8\x9d\xe5\xf1\x84\xb6\x82\xa9\xba\x61\xed\x23\xcc\x04\xea\xc9\xd8\x1c\xa2\x77\x26\x47\x23\x23\xc6\x54\x40\x86\x3a\x16\xb7\xce\x62\x99\x63\xa5\x38\x8d\xc0\x13\xe9\x32\x29\x91\xd1\xda\x2f\xe0\x67\x3a\x6f\xa6\x01\x82\x89\x5f\xb7\xa2\x49\xd9\x7a\x0d\x9b\xd6\xe9\xc9\x9d\x38\xb7\x45\x5c\xc3\x5c\xa4\x3e\x30\x4f\x9a\x55\x5b\x29\x30\xc5\x88\x2a\xd8\xec\x10\x55\x9a\xd8\x56\xe8\x30\x00\x1f\x38\xc9\xe3\xba\x1a\xb3\x5c\xa3\x60\x10\x4c\x8c\x6c\xfd\x44\xcf\x23\x2d\x8b\x41\xbc\x4f\x7d\x77\x51\x9c\x3f\x83\x74\x4e\xea\xd9\x76\x6e\x08\x73\x09\xce\xc0\x69\x9e\xbe\x5c\xaa\x25\xb8\xa8\x6d\xf6\x09\x1d\x3e\x95\x9c\x13\xdd\x39\xe9\x96\xf7\x54\x0e\x2c\x24\x8d\xf1\x46\x86\xde\xfa\x44\x8d\x29\x6f\x55\x5f\x34\x64\xd1\xa5\xdd\x3a\x0a\xfa\x88\x2e\x2d\x45\x11\x71\xd2\xab\x1b\x9e\xb0\xe6\x42\xc0\x92\x78\xef\xc7\x46\x91\x84\xab\xb4\xfb\x24\xfd\x4c\x0d\x2b\x27\x42\xeb\xc1\x8b\x47\x7a\x1e\x21\x8d\x1e\x07\x1f\xfc\xf4\x0e\x37\x6c\x95\x8e\x5e\x53\x25\x86\xeb\x2c\xbb\x2b\xdb\x91\x99\x66\x0a\xc1\x41\x11\x28\x58\xc6\x67\x26\xbf\x67\xe4\x67\xb6\xc7\xb1\x72\x8d\xa4\xf5\xe2\x3a\xd7\x69\x40\xd7\x4f\x78\x97\x99\xee\x7d\x9f\xc1\x51\x36\x6f\xc3\xcd\x9d\xa1\x0f\x4f\x74\x6a\x9f\x45\xa4\x8a\x2f\x7e\xee\xab\xe9\xce\x55\x08\x1e\x79\xa6\xee\x21\x67\xf0\x45\x4d\xdd\x32\xe2\x75\x9c\xd5\x61\x4c\xb0\x2a\x8e\x3e\x01\x6c\xa7\x70\x30\x18\xe0\xee\xe4\xf6\x38\x00\x96\xc8\x34\x8a\xe3\x29\xb1\x37\x97\xde\x37\xf4\x0c\x55\x0b\xcc\x4e\x94\x4a\x44\xc4\xf1\x04\xbc\x66\x98\x23\x28\x1c\xf3\xd8\x92\xb3\xc2\x4a\x98\xae\x93\xb2\x76\x6b\xe8\xb3\x1c\xb8\x7b\x97\xd2\x91\xe6\x75\x32\x43\x44\x1b\x51\x3d\x43\xd3\xc6\x05\x9c\xf6\x4e\x8a\x10\x75\xbb\x38\xdc\x07\x2d\xd0\x8a\x43\x22\xaa\x45\x2a\xb5\x97\x3e\xce\x1b\x73\xc5\x99\xf1\x74\xf4\xfa\xc4\xbe\xa8\xcd\xc8\x1e\x18\x1d\x06\x40\xcc\xaf\x08\x5b\x6b\x9d\x38\x32\xfb\xe1\xcf\xd1\x88\x90\x06\xa7\xe6\xea\xe9\x11\xa1\xbc\xd5\xf2\xc4\x9c\x71\x86\x62\x48\x3d\xb6\x53\x00\xa0\x55\x51\xcd\x99\x01\x23\x70\x29\xce\xd3\x5c\xf6\x9c\x72\xd5\x88\xf3\xaf\xc2\x1c\x0c\xf2\xfe\xff\xd2\xf6\x26\x2d\xe0\x7d\x5b\x76\x50\x50\x30\x1f\xc0\x49\x40\x10\xc5\x22\x3a\x3e\xdd\x8d\x0d\x64\x20\x82\x8a\x8a\x08\x11\x03\xa2\x9c\xbe\xbd\xa7\xef\x09\x85\xc1\x86\x20\x86\xa2\x32\x30\x10\xc1\x68\x06\x11\x03\x21\x0a\x12\x8c\x13\x21\x28\x0a\x0e\x44\x34\x13\x67\x4e\x84\x08\x19\x88\x11\x1d\x68\x21\xbf\xf7\xf7\xe1\x83\x2a\x78\x60\xfe\xf7\x1b\x5c\xce\xdd\x67\x9f\xbd\xd7\x5e\x7b\x2d\x86\xda\x17\x5f\x31\xc5\xca\xfd\x11\x1d\xbf\xfa\xe1\x32\xf2\x67\x38\xe8\xdf\xbb\xc9\x0c\x02\xe1\xbd\x29\xbd\xe3\x60\xaa\x69\xe0\x00\x41\x5c\xca\x17\xa3\x0c\x86\xef\x73\x31\xe6\x39\x23\x19\xc5\x50\xde\x63\xa3\x9e\xa1\x4f\x81\x6a\x83\x61\xc6\xf6\xb6\x08\xed\x3d\x18\x2d\x3c\x8b\xe2\xdb\x3f\xd9\xe7\x02\xb9\xa2\xe1\x5d\xb2\xa7\xfb\x34\x1f\x21\x92\x6f\x05\xc9\xae\x9b\xe4\x5d\x3d\x78\x35\xcd\x1e\xc7\xae\xe0\x14\x0c\x3c\xf9\xf9\xc2\xde\x0d\x1a\x07\x29\x43\x4a\x9b\x26\x9d\xc2\xee\x3c\x20\x40\x0e\x91\xa8\xcb\x4c\xd1\x52\x9d\xb4\xbd\x28\x07\xfd\x3a\xb0\x29\x5b\xfb\x93\x9d\x47\xd6\x51\x26\xfb\xca\x4d\x90\x38\x9a\xd9\xbd\xf0\x73\x6e\xeb\x6f\x1a\xe3\x49\x43\xdd\x37\x98\x79\x16\x05\x0f\x16\x55\xbf\xf8\x85\x5f\xdc\xd4\xb7\xb1\xa3\xde\x3c\x82\xcf\x63\x3f\x4f\x97\x60\xd4\x52\x01\xcf\x9a\xc8\x4e\x27\x2f\xa9\x56\x5e\xfc\xa6\xe3\xd4\x34\xc3\x03\xfa\x17\x5f\x21\xdc\x2e\xa2\xd1\x31\x95\x7a\x96\xf3\xb4\xa7\x15\xe9\x6e\x2d\x2c\x44\x4f\x7a\x3a\x7f\x64\x93\xe2\x85\xe3\xa9\xa6\xdd\xc9\xc2\x27\x37\x95\x93\x62\x23\x26\x3e\x49\x8d\xf6\x1e\xab\xf7\xb9\xab\x30\xa9\x63\xf1\x64\x88\x5a\x0c\x00\xf2\xe7\x49\xe6\x06\x15\x3a\xf4\xd5\x7d\xc1\x9a\x64\xdb\xbb\xa7\xa3\x94\x1f\xb0\x80\x8d\xe9\xf5\x2e\x1d\xc5\xbb\x8a\xb7\x32\x89\x74\x24\x6f\x0e\x2a\xc8\x12\xe3\x63\xed\x6b\xf9\x27\x9c\x1b\x15\xca\x0b\x5d\x8d\xc1\xa6\x90\x06\x83\x8f\x91\x33\x5b\xf2\xda\x14\x5b\xe4\xcd\x59\xc9\x3c\x91\x11\x9a\xfe\x12\x25\xe0\xd5\x41\xfc\x2e\xc0\xe3\xd7\x6d\xab\x7d\x00\x78\x10\x2a\xdd\x66\xf7\x80\x88\xd4\x7d\x8f\x25\x51\x0b\xcd\x85\x4c\xf0\x79\x1f\x5a\x71\x5b\x03\xed\x36\x44\x51\x46\x1c\x5a\x77\xfc\x42\x12\x9c\x2a\x7e\xc4\x55\x87\xb0\x9d\x31\x7b\x0d\x2c\x5c\x02\x4e\xdf\xc7\x02\xcb\x2c\x61\xa8\x0a\xb0\x97\xde\x87\x26\x3c\x13\x1d\x83\xf2\x2f\xc8\x9e\x76\xad\xb0\x3d\x5b\xd1\x9b\xd8\xab\xd9\xfd\xa2\xb4\xea\x30\x77\xb7\xaa\x7c\xc6\x6a\x86\x11\xf7\x0c\xb6\x29\xdf\xdb\x4e\xb2\x7d\x31\x07\x4a\x43\x25\x44\xa9\x94\x5d\x44\x7b\x66\x3b\xf4\xbd\xc0\xdc\x8a\x79\x8c\xd5\x3e\x83\xb5\x9b\x0f\x13\x18\x52\x1d\xfa\xc9\x8c\x9c\x4f\x64\x31\x62\xc9\x96\xbe\x6d\x75\xcd\x69\xf2\x68\xbf\xc6\x9f\xd9\x33\xb5\xc5\x3f\x0b\x4e\xb7\x59\x85\x7c\x73\x34\x70\x51\xed\xa1\xb0\x7d\x41\xb3\x7c\x73\x77\xa2\x4b\x22\x51\x7e\xa2\xc1\xac\xdd\x9a\x32\x06\xf1\x80\xe2\xd5\x2b\xb0\x10\xac\x5f\x4d\x3d\x65\x40\x6b\x39\x83\xbe\x5f\xcc\x3e\xa2\xe2\x71\x46\x64\x3c\xbb\xbb\x68\x35\x15\xdf\xa4\xef\xbe\x5b\x8e\x30\x3f\xb5\x96\x36\xfb\x26\x4c\x61\x54\x25\xb6\x0b\xac\xfb\xc5\x23\xcc\xd0\x64\x8a\xad\x79\x0a\x95\xa0\x6f\xef\x12\xbf\xd7\x97\xe2\x60\x85\x97\xa6\x87\xb7\xa0\xd7\xd9\xc6\x5e\x5c\xe0\x08\x07\x7d\x31\xfb\xa0\xd1\x0d\x60\x14\xc3\x20\xf4\x9c\xa0\x17\xe4\x3d\x28\x23\xca\x41\x0e\x85\x43\x46\xd2\x30\xee\x89\x4a\x28\xd5\x5a\xce\xef\x0e\xf7\x8b\x7c\x11\xf2\x00\xb5\xc3\xf6\x84\x92\x16\xe5\xe9\xbd\x97\x31\x61\x78\x6b\xe0\x71\x14\xbb\x5e\xc2\x50\x88\xba\x57\x48\xae\x9e\x1c\x2d\xfb\x80\x7e\xcb\xd8\x90\x51\x55\xf8\x64\xcf\x40\xd0\x77\xeb\xe8\xeb\x8b\x2f\x34\xb7\x2d\xcd\x37\x34\xda\x68\x96\xb3\x24\x85\x32\xb0\x6b\x3a\xe2\x0b\x3e\x81\xc2\x42\x2c\x01\xad\x8f\x36\x87\x13\xbb\x13\xce\x53\x49\x10\x18\x2b\x74\x02\x80\x33\xd4\x5e\xd9\x16\x2c\xcf\x90\x58\x2a\xd9\xbf\x98\xcc\xbd\x95\x60\x72\xa9\x1f\x16\x48\x8a\x29\x39\x8c\x0d\x0b\x9c\x81\x93\x17\xa0\x68\x7d\xfd\xd6\x3a\xf4\x8a\xf2\xa5\xdb\xc0\x22\xe9\x17\xe0\x0f\x5f\xa8\xa0\x79\x52\x27\xb9\x06\xf1\x26\x5c\x72\xd0\x4f\xf2\x30\xf7\x60\x04\x7c\xaf\xe2\xf5\x52\x1e\xf8\xa8\x60\xf5\x56\xe1\xfd\x82\x73\xa3\xa2\x95\x0a\xf4\x1d\x9a\xf2\xb5\x4c\x0d\x80\xa0\x1d\xd3\xd0\xc8\xb3\xfa\x36\x52\x97\x6c\x18\x00\xfa\x9a\xd4\x44\x48\x92\x7c\x21\xc2\xc0\x16\xd4\xd6\x4d\x5c\x33\x36\x70\xf1\x75\x6e\xf0\x44\xed\xf7\xf1\x8a\x6e\xc2\x1f\xa0\x22\x94\x87\x8b\x5b\xd2\x7c\x0c\xa5\x5c\x7e\x02\x78\xcc\x94\x9a\xc5\xcf\xb4\xb6\x5a\xcf\x61\x20\x4f\x37\xc7\xa0\x28\x20\x4d\x61\x18\xb5\x9a\x67\xa7\xe2\xf8\x6a\x16\xdf\x17\x36\x03\xbf\xb0\xba\x5b\x5d\xa1\xa5\xe6\x52\xd3\x3e\x1d\xc3\xdb\xf4\xcb\x79\xeb\xcf\xa1\x5d\x0c\xef\xa8\xee\x2f\x56\x2d\x3d\xf6\x2c\xa1\x07\xf3\xf4\x0b\xa7\x08\x66\xe0\xea\xb5\xea\xfc\x5c\xbb\x04\x31\x8b\x4d\x62\x4f\x74\x8e\xbd\xf2\x32\x13\x6e\x34\x77\xf9\xa7\x8a\x7e\x99\x30\x0c\x88\xc2\x3f\xf9\x8a\x0b\x02\xdf\x92\xf6\x87\x9a\x1b\xf1\x53\xd5\x79\xcf\x59\xe2\x45\x35\x69\x1d\x82\xed\xcd\xe7\xc3\x20\xc8\xb9\x86\x99\xde\x1b\xbe\x80\x26\x1b\x02\x47\xf2\xe7\xb4\x5f\x88\xc1\x46\xa7\x7c\xf3\xad\x8f\xd6\xd0\x6e\x48\xdb\x17\x05\xfc\xcc\xd2\xee\x29\x5d\xa0\x0c\x21\x3d\x5f\xf0\xd2\x02\x4c\x4b\x3c\xbb\xae\x2d\xa3\x2d\x00\xef\xb4\xb2\x5d\xd5\x14\x91\xaa\x71\x30\xce\x5a\xdc\x63\x5a\x7c\xc1\x30\x9a\xad\xc2\x3e\x61\x16\xf3\x9d\x1f\xc4\x18\x31\x9a\x4d\x19\x00\x20\x3d\x16\xd4\xea\x31\x22\x44\x23\xe7\xa5\x78\x9a\x83\x45\x4c\xea\x16\xd9\x29\xb3\x9f\xf0\x09\xb8\xd6\x19\x67\x69\x19\x86\x1d\xeb\xa0\x52\xeb\xfa\x02\xf2\x5e\x6d\x9f\x5e\x8f\x0b\xc1\x64\x6b\x92\xb4\x16\x9c\x52\x76\x7b\xf9\x17\x59\xab\x5d\x86\x77\xde\xda\x19\x93\xf7\x80\x72\xed\x30\x06\x38\x56\x3c\x13\xe7\xc0\x84\x2d\xa5\xd4\xa0\xcd\xeb\x9b\x84\x29\x74\x01\xbe\x00\x48\x33\xac\xbd\x1c\x9e\x77\x72\xc8\xeb\x9c\x9f\x9d\x0b\xaf\x00\x32\x8b\xac\xf6\x67\x10\x1a\xb2\x99\x10\xb6\x27\x5d\x6f\x85\x70\xe2\x8b\xc6\xb6\xbd\xf3\x36\x55\x72\x27\x00\x63\x5f\x65\x95\x54\xde\xa5\x4c\xd6\x1c\x81\x3d\x16\xd2\x48\x31\xac\xf4\xe0\x02\x14\x36\xf9\xf3\x89\x58\x60\x70\xf8\x1d\x53\x46\x69\x54\xa3\xc0\x4d\xe7\xd5\xeb\x9a\xe7\x57\xef\xc1\x52\xf0\x85\x26\x5f\x01\xe5\xae\x42\xb4\xcf\xbd\xf3\x93\xfa\x62\x95\xc8\x2a\xe1\xbb\x2b\x4f\x12\xa9\x2b\xdb\xac\x2c\x54\x4e\x98\xd1\xec\xf2\xaa\x35\x7f\x5f\x9d\xfd\xe1\x8a\xbf\x18\x8f\x97\x7d\xe2\x0c\x1d\xa5\xed\xf8\x79\xc8\x6d\x6e\xbf\x29\x68\x87\x07\xdc\x4f\xa9\x0f\x74\x67\x1e\xd0\x35\x11\xaf\x44\x32\x8d\x57\x20\x68\xdd\x02\x5f\x70\xf4\xc8\x48\xfb\x8d\xd5\x46\x96\xd3\x52\xcb\xc7\xdc\xf1\xc1\x5c\x00\x02\xa8\x44\xaf\x5c\x12\x16\x58\x74\x22\xd5\x40\x9c\xa8\xcb\x9f\x2c\x5c\xe1\x84\xaa\x51\x91\xc7\x86\x0b\x20\x11\x13\x45\xa6\x6d\xd7\x71\x5d\xf8\xce\x04\xe3\x6e\x2e\xda\x1c\xc7\xa7\x4b\xed\x7c\xbc\xbf\xa2\x76\xfe\x4b\xc0\xe3\xd7\x69\xee\x7c\xa0\xa1\x1c\x31\x40\x75\x3d\x1c\x7a\x05\xc0\x02\x49\x16\xd6\xd2\x8d\x8e\x1f\x7b\x59\x01\xab\xeb\xb5\x3b\x74\x19\xd3\x5f\x38\x03\x5b\x0c\xbe\xd0\xf0\x40\x30\x52\xb0\xec\xf6\xd8\x82\x7d\x91\x0b\x3c\x3a\x0c\x89\x47\x2a\xd1\x98\xe7\x48\x4b\x51\x3f\x42\x87\x02\x3e\xc9\x5d\xdf\x3f\xa1\x9c\x5e\x98\xb7\xd7\x33\x51\xa0\xcb\xfd\xf1\x22\xbf\x83\x56\xc2\x43\xd0\x62\xbf\xa7\x2b\xce\x04\x44\x18\x61\xf4\x56\x83\x07\x80\xa0\x7c\x71\xb5\xbb\x4a\xb2\xe1\x31\xdd\xc0\x7c\x13\x38\x12\x91\x32\x85\xd8\xc3\x11\x0d\x0c\x42\xd3\x38\x2f\x6d\xe6\x0d\x2a\x49\x4c\x29\xdb\xee\x0b\x4f\x66\x4a\x90\xa0\x72\x9f\x16\x04\xcd\xfc\x05\xe9\x4d\x89\x31\x47\xd2\x2a\x76\x3b\x57\x85\xd7\x65\xd9\x8b\x2d\xb6\x72\xb5\xd7\x0a\xfb\x49\x03\x63\x4b\xd0\xa9\x57\xb7\x2f\x25\x91\xf3\xc5\xd7\xec\x23\x9c\xc0\x01\xab\x33\x5d\x56\x14\x61\xfc\xe1\x58\x66\xc1\xc1\x23\xb6\xfd\x02\x69\xc7\xe0\x5d\xb2\xa1\x6c\x30\xd6\xf7\x98\x9a\x4a\x20\x8a\xf5\xce\xf4\x44\x6d\xa8\xad\x16\xce\x8a\x12\x7e\x28\x8a\x76\xd9\x46\xf9\x17\x77\x44\x68\x73\xae\x0f\x26\xd9\x9e\x8f\xc4\x7d\xb2\x0b\xfa\xe6\x98\x88\x8a\xf5\x86\x6b\xdc\x8c\xd0\xfb\x92\x72\x25\x50\x15\xbf\xf1\x93\xfd\x41\xd2\x93\xb9\x48\x38\x9f\x1f\xd6\x46\x04\x0c\x30\x3a\x74\xd0\x3a\x35\x5a\x8d\x42\xae\xf3\xa5\xf0\x73\xb5\x7e\x25\x6d\x2f\x45\xe1\x0b\xa4\xbd\xc2\x84\x2e\x5f\x71\xad\x98\x9c\xaa\xbd\x49\xc7\x0a\x54\x62\xb7\x92\xb3\xb9\x48\xe7\x1e\x60\xd1\x5b\x8d\x0c\xa3\x03\x26\xb0\x2f\x48\x7d\x83\xd9\x66\x08\x4d\x15\xee\xe9\xf5\x93\xdf\x8c\x32\x14\x05\x27\xd1\xd3\x5d\xca\x5e\x87\x4a\x74\xb8\x81\x0d\x53\xf4\xa2\x8f\x4f\x94\x9c\xdf\xf2\x6a\x23\x82\x79\x41\x36\x86\x63\xe7\x03\xd1\x00\x86\xcd\x2d\xc2\xf0\xb0\x94\xbd\xae\x1c\x46\x28\x47\x89\x38\x56\x2e\xec\x17\xec\x38\x87\xc4\x56\x40\x8d\xfb\x02\x6b\x0e\x9b\xaf\x78\x1f\x3a\xb4\xa4\x9e\x60\x82\x27\x59\xb1\x4a\x80\xf1\x33\xaf\x25\x94\xa1\xb7\x7e\xe2\xdc\x38\x94\xc4\x7d\x98\x42\x9c\x54\x25\xb8\xfe\x78\x70\x93\xe2\x1a\xa1\x0d\x1b\x9c\x89\x45\x6f\x93\x25\xef\x99\x14\x37\xf2\xea\xfa\x85\x63\x38\xa5\xd3\x57\xdf\xc4\x51\x82\x5e\x20\xc4\xa9\x5c\x8f\xfa\x0c\x11\xf9\x1e\x1e\x8a\x85\x0a\xb7\xa5\xdf\x77\x9d\xe1\x46\x2c\xab\x9e\x4f\x78\x26\x50\x1b\x1e\xca\x95\x07\x15\x52\x3c\x7e\x2a\x26\x8d\xce\x07\x2c\x52\x13\xf1\x0b\x10\x56\x05\x79\xc0\xc3\xdf\x3a\x39\xb7\xe6\x13\xc8\x5a\x2d\x14\xcb\x95\x10\xcc\x93\x67\x37\x04\x85\xd7\x1f\x01\x44\x96\x0e\xb0\x5b\xcd\x7d\x37\xb6\xce\x98\xbe\x2d\x2d\xdd\x21\xd4\xbe\x88\x4e\x22\x54\x7c\x07\x49\x67\xf2\x9e\x96\xbc\xc5\x9d\x7a\x2e\x53\x81\x4e\xbc\x95\xe6\xee\x79\x36\x83\xef\x2b\xbb\xb1\xb8\xbe\x82\xf1\x2f\x5e\x76\xa1\xd3\xb9\x93\x6f\xbf\x46\x1f\x11\xf2\x4a\x70\x97\x5a\x27\x42\x46\x83\xe2\x29\x69\x94\xfd\xc8\xe1\x28\x25\x68\x7b\x4f\x4a\xf9\x82\x67\x42\x0b\x64\xa7\xd6\xb7\xeb\x55\x9a\x60\x83\x4b\x7d\x7c\x5a\x36\xe7\xdd\x96\xb2\xfd\x9d\x04\xa9\x0c\x51\xeb\x94\x0d\x08\x0f\xae\x9f\xa8\x9d\x73\xa5\xd4\x8b\xbc\x9d\x4c\x52\x2e\xc7\xf5\xe0\xbe\x61\xf8\x2c\x71\xe8\x00\x05\x16\x9c\x2e\xd6\xe7\xf1\x32\xbb\xc6\xac\xed\x0b\xab\x3b\xda\xd3\xb3\x9d\xbd\x25\x76\xcd\xa9\x30\x10\xcf\x30\x16\x08\x8a\x58\x2b\xf3\x10\x56\xc2\x32\xe7\x0d\x34\x3e\x4d\x78\x9e\xd0\x69\x9f\x2c\x19\x49\x6b\x4b\x99\x4f\x00\xad\x6f\x9c\x66\x38\xd4\x37\x58\x09\x04\x69\x3e\xee\x02\xaf\xdc\xe9\x12\x29\x05\x71\xf2\xb8\xbb\xf9\x85\x83\x08\xf3\x86\x10\xe0\x6b\xbb\xef\x83\x79\xb0\xda\xb8\xb5\x4a\xb5\x2f\x5c\xd8\x3d\x95\xa0\x74\x4a\xcb\x4f\x90\x23\x3c\x8a\x3d\x6d\xb9\xfa\x05\x9b\x96\x77\x0f\xb3\x96\x4b\x18\xa5\xb6\x74\x89\x21\x80\x85\xed\xf0\x4e\x1d\x25\x4b\xc6\x9f\x8a\xce\x10\x66\x02\x50\x2c\x9e\xf7\xb2\x2f\x78\x26\x65\x0d\xe5\x78\xdc\x9d\x52\x1a\xf4\x93\xda\xf4\x96\x55\xd7\xfc\xf1\x9c\xd7\x17\x5b\x0e\x98\x9e\x27\x6d\x1b\x7b\x7a\x71\x6d\xdf\xd4\xe0\x45\x91\x28\xbd\x31\xbd\xbe\x70\xb2\xd1\x3b\x6a\x1e\xab\xd1\x96\xbb\x8b\x23\x56\xcc\x18\xee\x15\xe3\xf1\xa8\xb1\x9c\xa1\xe4\x5f\xa8\xaa\x74\xc0\x06\x66\x2c\xd3\xc3\xa1\xc2\xaf\x58\xcc\xf7\x30\xc9\xe6\xf4\xfa\x48\x36\x05\x0e\x48\xdd\x9d\x13\xf8\xf5\xbd\xac\x82\x3f\xa9\x72\x7c\x77\x67\x28\x58\x6e\xac\x6f\xce\xb6\x79\x44\x7c\xbd\xe3\x7a\x97\x8c\x86\x28\x66\x9b\xac\xad\x8d\x69\xb5\x31\x3a\x01\x84\x4f\xd6\xca\x21\x74\xf5\xdd\xd9\xe8\xc7\x05\x50\xbd\x01\xdd\x84\x85\x23\xf0\xaa\x78\x33\xae\x17\xa3\x8b\xfd\x8c\x53\x6c\x9b\x3f\x92\xc9\xf9\xc2\x59\x86\x3d\x09\x76\xba\x67\x7d\x89\x73\x08\x57\x48\x0d\x5e\x43\x6a\x37\xed\xbb\x99\x77\x6e\xac\x24\x07\x67\x74\xd3\x91\x30\x8c\x50\x7d\x32\x44\x70\xda\xbc\x90\xbb\xee\x49\xd7\x41\x07\x33\x6f\x80\x12\x28\x30\x40\x1e\xfa\xad\x4c\x4d\xbf\x2b\x75\x30\x6b\x41\xb8\x5b\x70\x95\xf1\xbb\x00\x8f\x5f\xa7\x1c\xfc\x01\xe0\x41\xe1\x24\xf3\xd1\xa4\x8f\xa2\x1d\xd4\xb6\xcd\xc0\x14\x62\xe3\xbc\x85\xe9\xbc\x4e\x9a\x86\x11\x9c\xdf\x29\x34\x72\x36\xec\xe8\xbe\x48\x73\xba\x95\x33\x19\x26\x7d\xbe\x5c\x4c\xc8\x2d\x2c\x45\xa2\xe9\x8f\x12\xa9\x59\x3e\x34\xce\x80\x2d\x51\x00\xef\xe8\x91\x0f\x98\x9f\xec\x1b\x97\x71\xc4\xdb\xb7\x8f\xf3\x3c\xbc\xb4\xf2\xea\x4e\x9c\xd1\x74\x04\x90\xc4\x23\x7a\xe2\x15\xad\xf0\x6a\x4f\x12\xe1\xe1\x98\x24\xbe\xe0\x99\xe0\xa3\x9d\x6d\xa1\xd9\x96\x56\x1a\x4d\xbd\x8f\x1d\xaf\x23\x62\x72\x3e\xaf\xc9\x83\x55\x92\x27\x6e\xa8\xcf\x59\xcd\xc3\xf8\xf5\x5f\xb0\x1a\x0c\xcc\xa9\xfe\x48\xa9\x17\x3e\x64\x9b\xde\x13\xa0\x37\xa6\x55\x81\x5b\x0f\xb2\xab\x35\xf4\x72\xb7\xe1\x10\x06\x53\x23\xf9\x2b\xbe\x58\xa0\xf0\xb5\x88\x8d\x0a\x3f\x8d\x91\x36\x48\x59\xb9\x20\x30\x8f\x82\xbc\x51\x4e\xb0\xc2\x46\xf0\x23\x14\xa1\xd9\x21\x91\x39\x9a\xfc\x8b\x65\x12\xe8\xe2\xec\x4f\xb1\x14\xef\x10\xf6\xab\xa0\xaa\xf4\x98\xb0\xaf\xc3\x08\x94\x42\x49\x57\xbc\xb1\x7a\x13\xb5\xc9\x05\xe7\x56\xfb\x62\x92\x1f\x0d\x93\xaf\x7c\xb0\x79\x00\x7a\xf4\x06\xc9\x83\x67\xc3\xc7\x18\x66\x64\x7c\x18\x78\x6f\xe1\x26\x97\xa5\xf3\x65\x6a\x93\x6b\xee\x17\xa6\x0e\x75\x6d\x74\xdf\xf3\x4a\xd3\x38\xd1\x4d\x4a\x47\x6e\xd7\xca\xbf\x0d\x11\x26\xb0\x22\x6f\x7f\xd0\x91\x8e\x95\x5e\xd1\x8b\xa8\x02\x5f\xdc\x91\x5b\x07\x20\x2b\x4f\x17\x22\xb5\x64\xbe\x0a\x56\xcd\x45\x51\xc1\x11\xcd\x5a\x51\xd9\x3e\x72\xb1\xa8\x99\x2f\x2f\x74\x4a\x5e\xf7\xc5\xf4\x9a\x75\x71\x5c\x2d\xb9\x2d\x03\x34\x73\x4d\x2d\xac\x9a\x6a\x78\x7a\x8b\x64\xd7\xa5\x12\xf8\x68\x39\xa0\xf4\x33\x08\x60\xcb\xa0\x5f\xac\xc0\x6d\xa5\x7a\x5c\xe2\x86\xbd\xec\xb0\xb6\xcc\xda\xfc\xc3\x28\x7d\x3c\x0e\x6c\x95\xd8\xb7\xcd\x9a\x59\x53\x3d\x8d\xd2\x0b\x7e\xec\x17\xfc\x23\xb0\xc8\x33\xde\x7b\xef\x32\xd3\xe8\x36\x20\x5e\x2d\xb7\x12\xcb\x9b\x7c\x04\xe3\xc7\x2b\xbc\xaa\x39\xcd\xeb\x10\x1f\xe6\xc6\x3d\x5f\x08\x75\xde\x7e\x40\x87\xd7\x91\x15\x41\xa6\xe1\x66\xb6\x70\x78\xde\xb4\x98\xd3\x15\xbc\x86\x69\xe3\xbd\x1d\x5c\x50\x1c\xc3\xb3\x06\x64\x5f\xc4\x85\x06\x0e\x99\xda\xe0\x89\x98\xdc\x67\xd4\xe2\x50\xa2\x52\x23\x47\xa7\x82\xb7\x64\x78\x2f\xa9\xa0\x2e\x00\x8c\xc5\x38\x39\xf4\x89\xce\x8d\x7f\xfb\x2a\xe3\x61\x0b\x83\x15\xd0\x1b\x14\xb6\x89\x5e\x1a\xf6\x2b\xcb\x96\x6b\x9a\x74\xa2\x9b\x48\x9d\x6d\xf9\x36\x1d\x72\xf1\x05\x0b\x4a\xd9\x69\x7b\xf2\x25\x9a\x86\x60\x89\xb2\x8f\x03\xd3\xdd\x0c\x04\xd3\x0a\xd2\x94\x10\x7b\xcb\xdb\xdb\xb5\xa6\x6b\xc2\xba\x08\x5f\xb4\xd7\x4b\x42\x75\x5f\xd9\xf2\x20\xa5\x5a\x0e\xf2\x2b\x05\xc9\x34\x1f\x7a\x75\xc8\x4b\x02\x45\x33\x17\x0c\x79\x72\x63\xdd\x77\xe9\x2f\x14\xa9\xd8\x0b\xd5\x7b\x95\x87\x58\x8e\xd0\x8f\xc8\xab\x47\xd3\xae\x5e\x2f\xec\x69\xe7\x57\x20\x18\x68\x75\xf9\x1d\x1c\x9a\x1b\x97\x4e\xf7\x8b\x3f\x72\xe0\xc5\x6b\x63\x4e\xd8\x5c\x1b\xc9\xf4\x34\xfa\x14\xc4\x1b\xf5\xda\x20\x05\x5b\x52\xd5\xc8\x84\x8c\x0c\x92\xb7\xcc\x4b\xa3\x5f\xc0\x71\x28\xd5\x7b\xd9\xd3\x0b\x5e\x7c\xf2\x5b\xaa\x88\xca\x56\x80\xa4\xb5\xbd\x33\xc5\x0e\xdf\x41\x49\x45\x00\xa1\xd8\x45\xeb\x6d\xf9\xc2\x49\x5e\x0c\xfb\x20\x84\x5f\x45\xee\x6b\x6c\xa8\xfe\x8a\x10\x12\x05\xb6\xd4\x19\xb5\xc1\xf7\x36\x8c\x1f\xdf\x33\x88\x8d\xe0\x83\xbc\xfb\xe2\x2b\x2a\x08\xfd\x46\x88\xcf\x6e\xcd\x77\xfb\x80\x0c\x01\xe9\xfe\xc6\xa7\x3d\x5b\xc5\x66\x1d\xa9\xbd\xbb\x1c\x50\x35\xb9\x6d\x2e\xfb\x27\x6e\xc8\x63\xd6\x9a\x29\xb0\x20\xe1\xfc\x98\x46\x9b\x18\x6e\x98\x5e\x75\x6b\x20\xb4\xb1\xb8\xe1\xca\x74\xf2\xb0\x16\x81\x4c\x54\xdb\x2f\xe6\xc6\x29\xa0\x16\xb6\xcb\xc2\x28\xea\x2d\xa9\x79\x14\x77\x7e\x94\x1b\x50\x34\xcb\xb9\xa4\xfa\x2a\x2b\x4b\x33\xf7\x5a\x2b\x54\x45\xe5\x0b\x0d\x8f\xca\x98\xea\x8d\xdf\x5e\x72\x2f\x0c\x8c\x39\xe4\x09\xc8\x53\xc4\xf5\xd9\xbc\xb1\x94\xe0\x39\xf2\x04\xc9\xb5\x79\x1d\x4c\x87\x7f\xc1\xad\x00\x5a\x80\x45\x72\x3e\x6e\x00\xf8\x2e\x60\x3b\x69\x93\x3e\x5b\xab\xc8\x8d\x6d\x03\x24\x9b\x55\x7d\x2e\x5e\x4f\xdf\x38\x74\xdd\xbf\xc8\x9d\x39\xf1\x58\xde\xe0\xa4\x1d\x8e\x93\x75\xf1\x55\xad\xdd\xa5\x20\x24\x4f\x45\xe8\x76\x3b\x4f\x82\xa9\x60\xda\x97\xd1\x56\xad\xf6\x05\xec\xb2\x9e\xe1\x46\xb4\x18\xf1\x1a\xee\x9b\x77\x3f\x8c\x17\x96\xf5\x73\xfa\x74\x63\x2b\x7f\xf6\xa6\x58\x80\x61\x8e\x2b\x65\x20\xff\x05\xfb\x9e\xaa\x59\x5f\x82\x8a\x8e\xca\xb7\xbd\x56\x4d\xca\xb6\x0b\x06\xc7\x29\x31\x7d\xb4\x74\xdd\xd4\x8e\xed\x94\x74\xc8\xe0\x27\x41\x9f\xa8\x67\xa8\xd2\x13\x66\x98\x47\x54\x0b\x92\x16\x78\x3b\x6e\xb0\x44\xd4\x32\xd2\x23\x89\x2e\xb3\xb4\xb1\x60\x61\x7d\x2e\x4e\x26\xa8\x9f\xf8\x96\x8b\xea\x04\xe9\x37\x9d\xc5\xed\xa8\xba\xb1\xce\x86\xe2\xc0\x36\x4d\xcf\x83\xd9\xe9\x22\x08\x8a\x98\x33\x8f\x18\xb0\xe1\xb0\x7f\xc5\x49\xfe\x97\x80\xc7\xaf\xf3\x3f\xfa\x00\xf0\x70\x9c\x11\xfc\x76\x1f\x0c\xc2\x61\xec\x6d\x8f\x82\x37\xcc\x8c\xd8\x23\xd4\xa3\x89\xb0\x49\xd1\xb2\xc0\x86\xb1\xe8\x26\x46\x65\x5f\x5c\xaa\x66\x56\xbe\x0f\xed\x81\xb3\x1f\x09\xaf\xb2\xf4\x28\xac\xe5\x91\x98\xcf\xab\xc5\x00\x91\x12\xbe\xe9\xc5\x53\xa4\x24\xa3\xc1\xe5\x0b\xcc\x8a\xb7\xb7\xd4\x27\x25\x6e\x82\x3d\x48\xec\xa5\x60\x74\x17\xe8\xb9\xcc\x96\xc8\x68\x42\x6d\xf3\x10\xa2\x29\x2d\xdb\x12\x4d\xeb\xbe\x28\x05\x4a\x95\x13\x71\xd7\x8a\x4b\x0f\xaf\x4b\x41\x9a\x09\x75\xe0\x17\x86\xa3\x33\xfb\x98\x96\xc9\xb2\x39\x07\xe1\xac\x43\x7b\xa4\xbe\xf0\x8f\x64\x8a\xd3\xb7\xf2\x39\x75\x85\xf4\x50\xb2\xed\xf0\xe4\x81\x6d\xe6\x3e\x30\x78\x11\xf1\x17\x2f\xfe\xe4\x77\xf8\x8a\xab\xa1\xed\xa1\x5f\x00\x1e\x89\xdc\x38\x1a\x13\xa7\xa4\x4c\x4e\xf4\x51\x56\x84\xa9\xbd\x94\xcd\x63\x84\x48\xdd\x4b\xfa\x20\x46\x32\x72\x26\x1d\x78\xe1\x17\x9c\x1b\x86\xde\xd3\x14\xc6\x8c\x24\x09\x19\x7d\x4d\x99\x34\x2f\xd1\x09\x52\xad\x6a\xf9\x54\x12\x7a\x4b\xef\xbd\x4d\xc4\x14\x87\x34\x02\x7c\xd1\xc0\xe8\xd1\x07\xa8\xd1\x2d\x40\x55\xf4\xb9\x27\x85\x10\x26\x7d\xcd\x0b\xb1\x0c\xb6\xe5\xd8\x2c\xf5\xcb\xa7\x85\x00\xde\x35\xce\x4f\xbc\xf1\x2a\xa9\x7e\x4a\x86\xa0\xf7\x74\xa7\x51\xc2\x91\x15\x17\xd8\x19\xad\x12\x3e\x49\x3f\x42\x9f\x61\x5e\x95\xcc\x99\xc1\xe9\x21\xe9\x17\x7f\x04\x12\xc8\x50\xb6\x8e\x91\xdd\x73\x3e\x4d\x3c\x99\x63\x36\x6d\xdd\x6f\x35\xd5\x37\x4f\xd4\xc4\x5e\x3f\x6a\xac\x82\x28\xaf\xc7\x7f\xd1\x5e\xe3\xb7\xdc\xba\xa5\xb8\x7a\xcd\xf9\x6e\x63\x4c\x8b\x01\x45\x28\x1f\x9d\x38\xf4\x88\x68\xac\x65\x09\x68\xd7\x78\x84\x22\x7b\xb3\x4f\xf8\x04\xe4\xd0\x67\x38\x36\x85\x7f\x53\x2e\x37\x4c\x25\xb8\x09\x59\x53\x50\x6d\x2a\x2a\x73\x0e\x5d\x65\x76\x43\xf8\x20\x29\xd9\xfa\x86\x04\x6c\x49\xba\x29\x97\xd9\x82\x0a\xa7\x6b\x22\xa9\xd0\x70\xf0\x71\xa8\x9e\x28\x78\x25\xb1\xb2\xae\xb7\x02\x61\x8a\xc7\xf2\xd8\xbe\x98\x52\x4a\x8c\xae\x93\xf9\x18\x73\x71\xd1\xe9\x81\x2d\xe4\xbe\xf8\xa9\x05\xee\xc0\x96\x62\xa4\x79\x1b\xba\xe5\x0d\xbf\xd8\x37\x2a\x3f\x21\x7b\x6e\xaf\xf7\x34\x99\x3f\x40\xb6\x57\xdd\x37\x84\x5b\xd6\x89\x07\xb9\x6b\x3b\x79\xe4\xe0\x84\x6b\xe6\xda\x90\xa0\x35\x22\x0e\xac\x5f\xd0\x6f\xfd\x13\x2a\x9f\x5d\x53\x42\xf1\xe5\x04\x94\xd7\xb6\xf9\xf4\x59\x42\x83\x2f\xf7\xfa\x0e\xaf\x8c\xa9\xba\x5a\xd9\x93\x00\xef\xf9\xe2\x8f\x50\x90\xdc\x18\x94\xde\x47\x30\xa7\x5f\x4e\x96\xa6\x05\x96\xd7\x92\xeb\xb7\xd8\xb2\x61\x8a\x6b\xc7\xfa\x17\xd3\xca\x22\x01\x8a\x5f\xc0\x71\xcc\xc7\x89\x07\xdf\xe1\x46\xb3\x11\x6c\x18\x6d\x74\x35\xa3\xd1\xc0\x77\xb9\xd9\x9e\x42\x63\xc7\xe6\xbe\xfb\xea\x74\x4e\x19\xa7\x7d\xd1\x46\x79\xbd\x8c\x41\xbd\x35\xa7\x0a\x49\x25\x7a\xa5\xb7\x2b\xdc\x45\x17\x53\xb4\xa9\x06\xe4\x06\x20\x95\xbf\x07\xbd\xc0\x97\xe7\x94\x2f\xf4\xd2\x0e\x04\x4b\x32\xce\x68\x0e\x77\x2d\x0d\xeb\x9d\x29\x2f\xfe\xd2\x91\xd0\xaa\x57\xda\xa7\x40\x8a\xaf\x85\x21\x59\xc3\x67\xb2\xf5\x0b\x7f\x6a\x25\x44\xc0\x4d\xa8\x3d\x97\xcd\xe2\x3d\x9d\xa4\x70\x38\x0f\xb4\x3d\xba\xd6\x96\xd0\xb8\xaf\x7d\x1f\xf6\xea\x2c\x1e\xec\x0d\xfd\x62\x27\x9f\xfa\x50\x07\x0b\xe1\x6e\xd9\x63\x0c\xec\x4d\x98\x77\x47\xef\x70\x82\x17\x38\x0b\xf0\xf6\xd5\x35\xde\x43\xe5\x34\x9d\xd4\x50\xc4\x17\xaf\x99\x79\xa8\x5e\x3a\xc3\xa6\x44\x2d\xe7\x05\x8b\x35\xc3\xde\xf2\xd0\x2e\xbd\xb5\xd2\x9b\x99\xb3\xaf\x19\xe8\x02\x6a\xeb\xb2\x92\x4f\x9c\x49\xda\x54\x30\xa6\x5c\x80\xcc\x16\xe3\xd1\x66\x57\x33\x0d\x5d\xb2\x13\x6b\x52\x7c\x4b\xa6\xc4\x3e\xae\xbc\xfe\x96\xc1\x3d\xd6\xf6\x0b\x81\x78\x3d\xe6\x46\x5c\x5f\xad\x16\x20\x74\xdf\x4d\x7c\x7d\xdd\xe9\x30\xdf\xe1\x12\xa5\xf1\x29\x41\xb4\x93\x98\xaf\x21\xac\x3d\x57\xfd\x82\x29\xf8\x96\xd3\x23\x30\xb9\x1c\xa4\x31\x7e\x36\xa7\x09\x8d\x91\x08\xf8\xc5\x76\xd5\x38\x72\x18\xbe\xbd\x90\x3e\xa2\x73\xd3\x4a\xab\x7d\x51\xfd\x1a\xb4\xb7\x62\x3b\x60\x5e\xba\x41\x65\xed\xb7\xd7\xe0\x19\xe2\x62\x1e\x51\xc7\x7a\xf6\x50\x32\x26\x3c\x9f\xf6\x9e\xec\x4d\xfd\xc2\x93\x99\x3a\x3d\x9c\x3a\x03\xe5\xd7\x0c\x32\xba\xd0\xf3\xee\x39\xe2\xf6\x2c\x9e\xfd\x4c\x3b\x39\x09\xf3\x56\xa6\x58\xf2\xea\xc9\xd4\x96\x4f\xfc\x94\xe2\xd8\x25\x47\x4a\xea\xe3\x2c\xeb\xe2\x28\xbf\x0c\xd4\x09\xea\x25\x60\xc5\x4d\xdd\x61\x98\xde\x05\xeb\x3b\x5f\x02\x2c\xf8\x02\x20\x65\xaa\xb3\x72\x6d\xde\xbc\xc6\x85\x41\x61\x64\x9a\x9c\x4a\x1d\xf1\x74\x57\x94\xeb\x29\xeb\xe3\x30\x8c\x69\xc9\x55\xf9\x23\xc0\x27\xb0\x0b\xa6\x77\x2c\x33\xb9\xb6\xd2\x95\xba\xdd\x43\xc0\x4a\x84\xe9\x23\x3d\x44\x20\xed\x65\x48\xb8\xe6\x9e\x67\x44\x23\xa9\x88\xf0\x8b\xd7\x8c\x1e\x0d\xb1\x3d\x08\x1a\x2c\x32\x4d\x92\x27\x1a\x45\x19\x2b\xbb\x20\x7d\x79\xaf\x9f\x6c\xc2\x6e\x9f\x49\x59\x7d\x83\x52\xf2\xfe\x4a\x27\xf0\x4b\xc0\xe3\xd7\xb9\x38\x7f\x00\x78\xb0\xa6\xca\x4b\x1b\x98\x5d\x75\x7a\x67\x8d\x6b\xee\xe7\xb0\x6d\xf4\x3e\x6c\xab\xf3\x3c\xac\x70\xe3\x39\x43\x0a\x04\x97\xa4\xfa\x62\x37\x8a\xbe\x4d\xb2\x7c\x09\xca\x54\x9a\x8b\x57\x79\xd5\x62\x4a\x8e\x7d\xc1\xa0\x98\x76\xab\x42\x4b\x6b\x98\x18\x0b\x88\xbc\xfc\xe8\xb8\xbe\xd8\xbd\xe6\x8d\x2d\x7c\x9f\x19\xca\x05\x36\xab\x3e\x25\x4d\x33\x28\x55\x24\x29\x07\x48\x36\xf4\x89\x18\x8c\xb6\x56\x3d\x44\x2e\xf2\xda\x2f\x4a\xc4\xa6\xd3\xc0\x31\x6a\x19\xc5\x06\xfb\x0e\x94\xaf\x66\xfc\xc8\xe5\x22\xad\xd9\x3e\x01\x6a\xf9\xba\xbb\x31\x7b\xfc\x8c\xa3\xde\x2f\xf6\xc4\xd8\x88\xd4\xaa\xdb\x23\x78\x2f\x4b\xca\x09\x59\x60\xac\xac\x1f\x18\x5f\x25\x8e\xf5\x67\x28\xe3\x8a\x62\xb1\x44\xf3\x2c\xa6\xc9\xfd\xe2\x52\x19\xa4\x40\x7c\x48\x58\xcb\xbc\xcf\xf3\x34\xba\xf7\x22\x06\x1f\x7a\xb8\x11\xa2\x0b\x8b\xc8\xa9\x57\x13\x0a\xf3\x92\xb2\x3c\xe1\x0b\x73\x5c\x06\x55\xba\xd9\xa6\x0e\x02\x83\x45\x16\xf0\x68\x72\x3a\x85\x6a\x89\x95\x51\x58\x49\x6d\x7b\x16\xef\x04\xf9\x12\xf6\x63\xa2\x81\x5f\x30\x3c\x5e\xed\x07\xa2\x2a\x12\x3a\x04\x05\x69\x88\x93\x8b\xba\x74\x4c\x6d\xca\x01\x6f\x44\xd7\x2a\x3b\xf6\x5a\xd0\x32\x9f\x15\x95\xf0\x0b\xa4\xbd\xf2\x3b\x2f\x1b\xf1\xb5\x51\xad\x04\xe8\x5b\xa7\x4f\x4e\x99\xf7\x62\x47\x52\x93\xc7\x13\x0e\x22\xcb\xa6\xd3\x6a\x99\x1c\xb5\x7e\x41\xf6\x9c\xb3\x9e\x12\xf3\xdb\xed\x2e\xe7\x51\xbe\xf9\x7d\x0f\x7d\xe1\xbe\x19\x21\x1e\xd4\x38\xed\xbd\x98\x0f\x61\xf8\x3b\x96\x0e\xa1\x7c\x51\xb4\x77\xdc\x0d\x6f\xce\x5a\x3b\x61\x3f\xe9\x5c\xc9\x7c\x29\x0c\x46\x74\xc5\x23\xa5\xa6\x04\xbf\x8e\x9b\x52\x77\x2a\x11\xd5\xa4\xbe\xb0\x99\xa4\x0b\x6e\xff\x70\x1f\x02\x7a\xb6\x40\x0f\xf0\xdb\x89\xe7\x01\x66\x68\xa5\x0a\xeb\x02\x84\x2e\x37\x47\x6a\xe2\x8d\x71\xdc\x0c\x7f\xc2\x8e\x43\xfe\x85\x60\x3d\x2f\x66\x9d\x4f\xb1\x08\x78\xa8\x50\xb0\x0f\x4d\x7d\x05\x62\xc1\x17\x57\xff\xc8\xd6\x37\x73\xd0\x7a\x65\x64\xf9\xc4\xe1\xca\x89\x6b\xa8\x21\xf3\xa5\x95\xa5\xa9\x8d\x78\xab\xe7\xf4\xc1\xef\xab\xb1\xcc\x40\x88\xea\x24\x0e\xe8\x8d\x38\xa8\x1c\x6c\x72\x5f\xb0\xa0\x76\xa1\x9b\xdd\xab\xca\xf4\x1d\xb2\x26\x2c\x7e\x10\x7f\x9f\x50\x59\x9f\x54\x93\x9c\xdb\x59\xd6\x51\x04\xfd\x34\x4f\x68\x5e\x9e\x2f\xce\xe2\x80\x9e\x99\x5a\x94\x83\x18\xdf\x51\xa0\xda\x22\xd3\x5d\xef\xe3\x39\x1d\x99\x3f\x12\xb0\x62\x85\x43\x5d\x6a\xdd\x4e\x78\x22\xfd\x82\xbb\x69\xf8\xc8\xb9\x88\x99\x53\x75\x30\x99\x87\xfa\xd2\x7b\x89\xd8\x3f\x24\xd8\xdc\x7b\x40\xde\x80\x19\x38\xdb\x96\x60\x7c\x4c\xbf\x5f\x80\x3f\xfa\xdc\x5e\x90\xa1\xb7\x8b\xa1\x2a\x0e\x07\xb7\xb6\xcf\x73\x5b\x30\x84\xe0\x99\x78\x51\xc6\xe8\xd8\xd4\x1c\x73\xe0\xf6\x88\xfe\x45\xee\x3c\xb6\x6d\xe3\x7a\x78\x27\x6c\x0f\x22\xf0\x20\x1a\x06\x5a\x27\xb2\xbb\x9e\x63\xb7\xb9\x0a\x18\x45\x24\x26\xb4\x12\xc9\x8f\xb7\x5f\x2c\xd6\xf0\xd7\xd6\x8d\x9d\x82\xc5\x2b\xf3\xf6\x16\x4a\xb1\x76\x93\x98\x72\xeb\x2e\x0a\x47\x7c\x33\x2e\xc9\x52\x21\xed\xcb\x1a\xf2\xf0\x2f\x6a\x2d\xdc\x0d\x90\xc3\xc3\x05\xf5\x23\x2c\x38\xa0\xa5\x87\xb6\x61\x69\x29\x55\xaa\x1f\xfd\x2e\xe5\x97\x24\x9e\xd3\x95\xad\x07\xe4\xfc\x17\x00\x29\x1e\x2f\x70\x01\xf7\x33\x96\x3e\x39\x5b\x18\xaf\x1e\x5b\xe2\x27\x2b\x55\xdb\xa5\x71\x03\x8d\x51\x19\x46\x1f\xfb\x16\x5f\x28\xf8\x64\xed\xcb\x37\xfc\xa8\xd7\xd1\x09\x97\xcf\xdc\xcb\xe2\xd4\xce\x2a\x26\xba\x1b\x3a\x2d\x4b\xc7\x8c\x08\x10\x36\xa0\x8b\xe0\x0d\xf9\x4f\x54\x55\x78\x0c\x41\xe4\xc4\x02\x86\xca\x3b\x4a\xc1\x00\xd6\x52\x36\x24\xa1\x07\x11\x3f\xb3\x91\xe4\xcc\xa6\x44\x2e\x42\xe8\x84\x10\xf8\x62\xad\x7c\xcc\x33\x47\x62\x30\x09\xf6\x4c\xf8\x78\xeb\x1f\xd5\x27\x3b\x70\x06\xc3\x67\x7d\xdf\x28\xe0\x76\xcf\x8b\xe6\x4e\x2f\x50\xab\x8b\x2f\x80\xb0\x3a\x82\x70\xb2\x72\x72\xe8\xba\x2e\x41\xee\x65\xcc\x63\x02\xe3\x3c\xdd\xa2\x09\xd6\xec\xc3\xf1\xe4\x9d\xc8\x6b\x5e\x97\xf3\xfd\xa2\xb1\xdd\xc9\xed\x78\xa4\xf9\x85\x6b\x02\xe2\x36\x86\x6c\x58\xe8\xfa\xfa\xdb\x1a\xef\x06\x76\x7a\xec\xa0\x0d\x83\x37\xc6\xcb\xce\xfa\x24\x2e\xfc\xdb\xd3\x80\x20\x6b\xdb\x59\x1a\xd2\x4f\x33\x4d\xb2\xa1\x44\x31\xb2\xc6\x27\xe9\x27\xa3\xf7\xa1\x1d\xef\x54\x82\x6f\x67\xde\x2f\xd8\x2e\xf4\x96\xb5\xd9\xc1\xd5\x66\xdf\x0e\xe4\xee\x35\x55\x49\xa5\x17\x99\x0b\xbb\x94\x9d\x32\xd1\x00\x23\x3d\x92\xbe\xbe\xa5\x92\xfe\x09\x8f\x15\x10\xcb\x5f\x84\xf4\x64\x2f\x4b\x0d\x5a\x57\xe7\xd4\xfe\xed\xc3\x9a\xc3\x68\x3f\x39\x53\x65\x33\xe1\xeb\xed\x32\x66\x6f\x3f\xd1\xc5\xf2\x57\xa5\x8e\xda\x91\xa1\xee\xa5\xe2\x1e\x79\x8a\x67\x85\xce\x3d\x98\xe9\xc7\x9d\x85\x04\xc8\x28\x48\x21\x86\xcd\x8e\x7a\xff\x82\xa4\xc0\xce\x3a\x46\x6b\xb6\x39\x97\xc8\x25\x01\xc3\xb3\x35\x55\x45\x33\x6b\x48\x50\x8c\x58\x8e\xab\x96\x44\xb2\xca\x37\x5b\x71\xc1\xdf\x03\xf0\xf8\x37\xfe\xe5\xbf\xed\xcf\xc4\xdf\xf9\x77\x7f\xfb\xef\xf8\xbb\xc3\x7e\xff\xc2\x6f\xfd\x83\xe0\x77\xfe\xab\xbf\x76\xff\xea\xbf\xf0\xf7\xfe\xa5\xff\xfe\x1f\xff\x43\xff\xc7\x9f\xfd\x5f\xff\xf7\x0f\x00\x0f\x84\xb0\x2f\xc8\x2f\x96\xdf\xcd\xc4\x2e\x02\x73\x35\x87\xc5\x11\x3e\x56\xdf\xfe\xde\x67\xa3\x9d\x19\x81\xa5\x88\x47\xb7\x18\xf9\x17\xc8\xd9\xb4\x76\x03\x3e\xa5\x05\xd5\x4a\x60\x2a\x38\x4f\x82\xdb\xd8\x05\x15\xd7\xf7\x1a\xcd\x01\xac\x1d\xcb\x40\x46\x85\x10\xa0\xe4\xbf\x48\x73\xb2\xb1\xc9\x04\x70\x44\x37\xab\xe2\x92\x87\x41\xc9\x4e\x42\x2f\x08\x4d\xe1\xd2\x73\x60\x6e\xbd\xad\x92\x53\x65\xbc\x8b\xb1\x4f\xf6\xd0\xdf\x57\xa5\x5d\x04\x91\xeb\x35\xad\x57\x69\x78\xcc\x19\x2a\x8d\x34\xea\x5e\x4e\xdb\x6d\x03\xea\x64\x70\x7a\x01\x87\x43\x49\xbf\x70\x9c\xa6\x91\xb5\x64\x5f\x77\x73\x0f\xb6\x82\x1d\x63\x7f\x72\x1a\xae\xa8\x5b\xdb\x63\xaf\xf4\xe4\x79\xc2\x88\x68\x8d\x38\x3a\x58\x15\xf1\x2f\xb4\x1a\xa4\xed\x45\x66\x87\x0b\xaf\x00\x1d\x92\xfc\x7a\x56\x37\x24\x8d\xfc\x1a\x4a\xdf\x17\x1c\x41\x02\xba\x83\xc5\xb9\xd6\xed\x2c\x80\x2f\x92\x6d\x9a\x44\xe7\x28\xe5\x8a\x71\x99\xe4\xa9\x5e\x87\x11\x24\xc9\xc4\x56\x67\xd8\xd1\x1c\x76\xc5\x8a\xf9\xeb\x5e\xbd\x1e\xcb\xbe\x81\xe3\xfc\xe9\xe7\x05\x52\x9e\xc4\x92\xcb\x47\x47\xbe\x24\x7e\x75\x51\x4f\x78\xef\x0a\x85\xc4\xfb\xe6\xa4\xcc\xe5\x67\x85\xf8\x6c\xfe\x8d\x14\x62\x8d\xf4\x06\x2b\x0e\x2e\x5b\x46\xfb\xe6\x94\x15\x7b\xcc\xc5\xda\x01\xc6\x76\x1e\x45\xd8\x6d\xfd\x8d\x4b\xa2\x0d\xc7\x95\x9f\x68\x78\x80\xeb\x32\x82\xfb\x47\x2d\x4a\x5f\x8e\x05\xcf\x02\x38\xc7\xa6\x3a\x81\x10\xfa\xbc\x31\xc6\xd7\x85\x18\xf9\x94\xab\x93\xa3\x63\xf8\xc2\xa5\x45\x1f\xe4\x8c\x5b\xf5\x41\xa5\x42\xaf\xc6\x86\x96\x1c\x29\x56\x13\xee\x92\x1c\xe4\xd2\x32\xac\xb4\xc7\x44\xce\x4f\x26\x1b\xfb\x02\x6a\x60\x07\x6b\xc6\xf3\xf6\x25\xad\xfb\x58\x26\x12\x33\xd7\x13\xe5\x2c\x04\x1d\xf4\x2e\x5e\x9e\xab\x8c\xa9\xd8\xd7\xcf\x2c\xb5\xb8\xe5\x8b\xdc\xd9\x0c\x2e\xa5\x9f\x08\x54\x20\xba\xe9\xd7\x1e\x76\x0c\xec\xd7\x2a\x8d\xa3\xea\x9b\x71\x7d\x99\x0b\x56\x09\x60\x9f\x58\xf7\xeb\xbf\x98\x95\xa6\xb7\xb6\xb8\x48\x78\x16\xda\xdd\x08\xa9\xe7\xf3\x6c\xdb\x59\xc7\x7a\x2d\x85\xed\x6d\x57\x63\xd3\x90\x5d\x38\x47\x64\xce\x66\x5f\x50\xd4\xa1\x8b\x34\x26\x92\x53\xaa\x8b\xbd\xfe\x5a\xc6\x60\xeb\x3b\x1b\x9d\x8f\xf7\xc6\x13\x26\xcf\x34\x27\xcc\x31\xd7\x00\xe9\xdc\xf0\x45\xb9\xbc\x70\xa9\x32\xea\x7d\x92\x10\x47\x97\x53\xdd\xe8\xa4\x88\x5e\xf2\x3b\x8c\xe0\xaa\xd2\xea\xfb\x84\xba\x83\xe5\x02\x23\x69\x7c\xa2\xae\x3f\x98\x71\xe2\x26\xbe\x86\x1e\x1a\x71\x68\x5b\x62\xfa\xd9\x24\x4f\xcb\x4b\x3e\xdb\xbd\xe3\xb4\xc2\x82\x5f\xa2\x86\x69\x25\xe9\x5f\x44\xe7\xd5\x5e\x03\xac\xbd\x32\x5c\x59\x32\x54\x62\x43\x33\xa1\xd4\xcb\xfa\xde\x3a\xba\x72\x46\x07\x5d\xce\xc3\xa8\x30\x72\x6a\xc3\xbe\x98\x52\x56\x7a\xa6\xf4\x18\xef\xa3\xca\x8b\x9f\xde\xa2\x4f\x15\x94\x88\xb0\xca\x75\xf6\x1a\xb7\x13\x2f\x5e\x02\x16\xc1\x27\x6c\x36\x7d\x62\x2c\x9e\xcb\xac\x77\x33\x08\xd1\xbd\xb7\x52\x5b\xdf\x25\x59\x22\x97\x0b\x00\x4d\x15\x89\xa1\x39\xae\xa7\x87\x61\x70\xf0\xe1\xf5\xd2\x2f\xe0\xfb\x4d\x6c\x1b\x23\x45\x52\x37\x2a\xeb\x8a\x0b\x7e\x24\x2e\xdb\x27\xa4\x2d\x89\xca\x42\x27\x1e\x9a\x35\xde\x87\x11\x29\x34\xe4\xe2\x0b\x5a\xf6\x68\x1b\x6b\x4d\x59\xce\x84\xc0\x58\xb1\x71\x0e\xf0\x20\x8b\xf7\x9c\x2e\x20\xd8\x92\x61\xbf\x41\x03\x38\xa6\xb6\xcc\xa2\xfc\x09\x2f\x8d\xee\xf9\x23\x1c\x59\x29\xc3\xfa\xa7\x7a\xf0\xa2\x40\x00\xa4\xb7\x5f\x5f\x03\x2c\x1e\xe0\x28\x5a\x1d\xbe\x18\x89\x59\x4b\xcf\x17\xb2\x90\x2c\x68\x21\xaa\x91\x80\x84\x00\xcc\xb3\x79\x7a\x0a\xb7\x7d\x39\x55\x50\x3e\xb4\x5b\x26\xe5\xca\x0d\x02\x25\x1b\x9d\x93\x4b\xf1\x89\x99\x76\xea\x3d\x3a\xce\x0d\xe7\x95\x95\xdb\x55\x9c\x97\x97\xf4\x78\xfb\xf8\x96\xd1\x20\xa1\x4d\xd5\x27\xc2\x71\x2d\x93\x93\x16\x5b\x7c\x91\xb5\xdc\x26\xf5\x38\x7d\x0f\x1a\x03\x28\xc9\x87\x78\xe5\x4e\x59\xf5\xa9\x51\x78\x0e\x24\xd9\xa9\xa1\xef\xd1\x5e\x6e\x55\xc7\x92\xec\x13\x39\xf2\x42\x8a\x1f\xd6\xce\xac\x71\x8b\x34\x65\x8d\x35\x36\x11\x07\x3b\x9b\x6f\xf0\x91\x77\x28\xb7\x8b\xbc\x2f\xa0\xd7\x4d\xe9\xbf\xb0\x72\xa0\x38\xd5\x50\x44\x21\x22\x2d\x82\xc4\x03\x66\x61\x84\x83\xc4\x38\x62\xd6\x65\x18\xca\x1b\xae\xb1\x50\xd3\xbb\x16\x78\x67\xab\xec\x0b\xe6\x4f\xf5\xaf\x1c\x89\x64\x37\xb2\x7c\x5f\xf4\x00\xd1\x3a\xe4\xbb\xe2\x7e\x70\xbc\xf6\x45\xc1\x0f\x61\x79\x4a\xdd\x80\xc2\x1f\xc4\xc0\x17\x6b\x5f\x8a\x0e\xa4\x88\x41\xf6\xa2\x65\xaa\xa3\x0c\x00\x96\x00\x9f\x0e\x3b\x1b\x8e\xb5\x39\xc9\x21\x80\x99\x0f\x8b\xb2\xc8\x93\xb5\xfb\x42\xb2\x9f\xf5\xd3\x4f\x50\x91\x6d\x13\x90\x9a\xaf\x4a\xb8\x73\x0a\x4f\x5a\x01\x57\x46\x5d\x38\xe9\x47\xd0\xf0\x0b\x80\x0c\xd2\xa8\xc6\xbe\xc8\x9d\x44\x09\x99\x28\x4a\x61\x9a\xc8\xc9\x53\x60\x9d\x28\xf0\x46\x1a\xf3\x01\xc5\x57\x6a\xe7\x2f\x29\x76\x7a\x64\xb7\x51\x19\x90\x5f\x59\xef\xf9\x25\xe0\xf1\xd7\xff\xe0\xef\xfb\xc7\xfe\x1d\xf1\xa7\xff\xd4\x9f\xf8\x4f\xff\xf0\x9f\xfd\x97\xfe\xef\xff\xf2\xbf\xf9\x8f\x7e\xe3\x6f\xfc\x39\xfc\x77\xfe\x8f\x7f\xf2\x7f\xf8\x9b\x7f\xe4\x37\xff\xd9\xdf\xfa\xdb\xff\xe8\x07\x80\x07\x1c\x62\x68\x6f\x06\xa1\x6e\x8f\x0c\xfd\x73\xa9\x62\x1b\x22\xbb\xe6\x7e\xf7\x40\xdd\xa7\xb1\xb1\x61\x5d\x2a\x19\x1e\xfc\x8a\x2f\xf6\xd0\x99\x5b\xb6\xa3\x5e\x12\x74\xb6\x5e\x36\x1f\x0b\x4f\xf7\xfa\x3e\x3a\xbe\x16\x2f\x7b\xc6\xae\x5d\x38\xb1\x71\x99\x08\x4b\x07\xbe\x51\x12\xa9\xba\xf3\xd2\x48\x25\xa4\x57\x56\x9e\x60\x53\xf2\xaa\x3c\x8f\x51\xe6\xa9\x07\x9a\x89\x1a\xb5\x6b\xb1\xa7\x2d\xe2\x8e\xdb\x9d\x7f\x71\xa9\xbc\x5f\xd4\xf0\x1e\x6d\xbb\x48\xe5\xd0\xc5\x81\x22\xf1\x46\x12\x54\xd9\x88\xf7\x35\x35\x47\xe5\x96\x72\x00\xb3\x67\x59\x7d\xe0\x17\x53\x4a\x4d\x8d\x55\x3c\x1e\x8b\x13\x35\x72\x0e\xca\x5f\x87\x1e\xd2\x7a\xae\xfd\xe8\x63\xba\xbe\x53\xae\x22\x2d\xf2\xba\x08\xb2\xcb\x27\x06\x4c\x9b\x76\x30\xdf\x4b\xc4\xd2\x02\xc1\x31\x5e\xb0\x05\x8a\x5c\xb3\x1b\x47\xbc\xb5\xf4\x7b\x6e\xb1\x0d\xf7\xe1\x57\xe1\xb9\xd0\xfb\x89\x60\x12\xd1\x4d\x50\x7d\x61\x8e\xba\x1f\x89\x4a\x49\x95\xe6\x8e\x09\x45\xa8\x19\x54\xb1\x55\x91\x6f\x38\xc2\xcc\x40\x8e\xd0\x48\xff\xa2\x50\xb5\x34\x6f\x44\xb2\x17\x13\x77\x56\x74\xd5\xef\x8f\x77\x97\x8c\x9e\x37\xa8\x6f\xdb\x03\xf6\xf9\x90\x3d\xc1\x81\x35\x57\x12\x20\xf8\xe2\xe1\x29\x3c\x6b\x31\xd8\x18\xf0\x3e\x29\x58\x21\x46\x47\xd5\xd8\x62\x7f\xf4\x72\x0b\x2c\x35\x05\x55\x0f\xba\xc5\xcc\xc6\x98\x91\xaf\xfb\x42\xcc\x36\x8f\x16\x7b\x1d\xfe\x96\x76\xdf\x5a\xee\xb0\x8a\xe5\x5d\x41\x22\x42\x9a\xfb\xbe\xf1\x55\x96\x9f\x3d\x62\xd3\x3c\xee\x5e\x05\xf8\x82\x67\xb2\x46\xa3\xe0\xdd\xaf\xaa\x47\x45\x75\xa5\x32\xc4\x42\x0f\x39\x7f\xae\x95\xad\xe5\x6c\x9b\xe1\x13\x3c\x01\x92\xaa\x2e\xa2\xe9\x13\x7d\x02\x78\x62\x0b\x28\x02\x1e\x48\x85\x6b\x83\xcc\xa2\x3e\xf1\xa5\x85\x01\xcf\xcf\xf4\x68\x8d\x35\x34\x58\xed\x96\x63\x05\xc9\x8f\xfd\x82\xae\xff\x32\xbf\x31\x0d\xdc\x48\x99\x0f\x77\xa4\xd9\x88\xa6\x60\x8a\x06\x60\x9f\x46\xaf\xf2\xd8\x4c\x78\x51\x84\x48\xbb\xac\x35\xf3\x5f\x08\xfb\x1a\x61\x64\x7a\xb2\x94\x81\x50\x5f\x26\xc8\x9d\x68\x49\xc1\x46\xfd\x20\xf4\x56\x85\x3a\xc8\x28\x54\x62\xf1\xca\x39\x19\xb8\xbf\x98\xcc\x31\x88\xaf\xe3\xcb\xa7\xb0\x47\xb4\xfd\x40\x34\x29\x83\x0c\x14\x95\x8d\xe9\xc1\x3f\x02\x17\xe3\x28\x4d\x88\x87\xe8\x8c\x57\xbc\x7d\x51\xa8\x52\xe2\x09\x0b\x93\xbd\xbc\x72\xd2\x80\x25\xf5\x9e\x0c\x33\x89\xc5\xe2\x41\x6e\x27\x5b\x6a\x1e\x93\xdc\xb2\x5a\xee\x6e\x73\xf6\x8b\x55\x27\x07\x43\x42\x39\xdd\xb7\x0b\xd4\x38\x85\x0c\x93\xa0\x0e\xd4\x6f\xb9\x24\xb2\x30\xe5\xab\x92\xeb\x5b\xe7\xa5\x49\x81\x78\xd9\x4f\xea\x8b\x37\x71\xd7\xec\x36\x90\x29\x05\x12\x35\x85\xa5\x4e\x53\x5a\x61\x0d\xb8\xd7\x90\xa5\x91\xfd\x44\xcc\xb2\xd2\xf4\x39\x0f\xa9\x9f\xf8\x6c\x21\x9e\xec\x7d\x83\x96\xe7\xd6\xe8\xca\x7d\xa5\x79\x8b\xf5\x56\xe7\xea\x85\x6a\x32\x45\xcd\x8b\xaf\xdc\xa7\xa6\x48\x3f\x33\x7f\x52\x5f\xd4\x51\x0e\x03\x24\x50\xb8\xcc\x5c\x92\xde\x24\x5f\x40\x5f\xc6\x81\x76\xa9\x48\x96\xc2\x72\xe7\xec\x75\x75\x4a\x82\x28\x86\xc4\x17\x30\xad\xcb\xb9\xe4\x63\x94\x15\x92\xea\xd6\x8b\x60\x4f\x01\xed\xde\x14\x76\xb2\x30\xd9\x80\xa4\x7a\x0c\xcc\xee\x61\xc7\xab\xf9\xc6\x6f\x7c\x30\x78\xd4\x34\x29\x41\xe5\x1b\x9d\xb3\xed\x06\x9c\xc0\xba\xbe\xc9\x11\x46\xb3\xb5\x8a\x27\x8c\x95\x94\xee\xa9\xe0\xa4\xa6\xfd\x84\x29\x88\xb1\xed\xc9\x3f\x30\x65\x1f\x2b\xe1\xf4\x70\x6c\x5d\x8b\xc4\xef\xec\x66\x91\x38\xed\x97\xcc\xde\x82\x8d\x7b\x3d\xec\xa1\xdb\x7d\x01\xdf\xa7\xa8\xe2\xe6\x82\x9c\xb9\x33\xd3\x08\x2b\x51\xc8\x21\x77\xbe\xef\x98\x59\xdc\x9d\x63\x11\x46\x09\xea\xa5\xe4\xc6\x13\x8a\x3e\x99\x1b\x67\x64\x83\x7a\x86\x79\x10\xc6\x9b\xc1\x9b\x47\x27\x86\xd7\xc2\xbb\x17\xb0\x54\x77\xad\x87\x12\x9b\x72\x25\x32\x1e\x58\xfd\x7c\xc2\x6f\x16\xc0\x59\x18\x17\x46\x1c\xe1\xf7\xe5\xfd\x91\xe1\xdc\xa7\x11\x25\xc0\x68\x25\xe0\x63\xe9\x5e\x4a\x6a\x5e\x31\x01\x29\xf7\x56\xbf\x90\x17\xc6\xfa\xee\xb7\x69\xc7\xd3\x3a\x64\x38\x94\x2b\xa5\x90\x6b\x12\x6b\x96\x31\x97\xd8\x1a\xb7\x1c\x62\xb8\xf6\xd2\x24\xe1\xd3\xcf\x17\x86\xf3\xd7\x86\x62\x2d\xa3\x6f\x91\x05\x72\xb7\xc7\x0b\xe9\xeb\x2f\x92\x05\xc2\xb0\x13\xdf\x2e\xc6\x47\x4e\x37\x26\x9d\x56\x11\x85\xbe\x90\x4e\x65\xe1\x98\xe2\xa1\xbb\xec\x15\x94\x77\xe6\x42\xc6\xd1\xbf\xa9\x5e\x9a\xc7\xb6\x07\x9d\x95\x46\x59\x09\x6b\xd6\x9a\x9f\x79\xc8\xf2\x45\xf5\xdb\x23\x02\x61\x2d\x30\x80\x78\xf2\xbd\x4c\xa0\xd2\x13\x11\x7e\x16\xb6\x8d\x9a\x3c\x47\x3d\x28\x35\x90\xd7\x45\x7b\x1a\x34\x7f\x62\x20\xfd\xf6\xe0\xf6\x45\x0e\xb7\x46\xc2\x76\xaf\x37\x74\xeb\x5d\xd2\x66\xc4\xb6\x5c\x2c\x53\x19\xee\x4a\x0a\x00\x7b\x95\x81\x40\xab\xdf\x98\x28\x04\xa6\x17\xf3\x12\x2d\x00\xd0\x25\x72\x45\x14\xb8\xb4\x04\xfb\xab\x95\x74\x71\x97\x52\x0e\x10\xca\xc3\x4b\x2a\x11\xdc\xbd\xbf\x0b\xf0\xf8\xfd\xff\xed\x7f\xf8\x1b\xff\xc0\xff\xf5\xaf\xff\xcf\x7f\xee\xb7\xff\xf4\x7f\xf2\xf7\xfd\xe5\xbf\xf8\xcf\xfc\x6f\x7f\xe2\xef\xfa\xcd\xf3\x0f\xff\xfb\xe7\x0f\xfe\x77\xff\x56\x64\xbf\xf1\xf7\xff\x6b\x1f\xd8\xd2\x2e\x43\x89\x0f\xd5\x42\xd4\xcb\x19\x81\x73\x5c\x6a\x46\x99\x42\x84\x8c\xdd\xd7\x69\x3c\x3c\x53\x2f\xe5\x01\x8c\xa0\x3d\xbc\xec\x0b\x9a\xe5\xe9\xec\x62\x2f\x48\x91\x34\x8e\x1a\x6d\x7e\x7a\xf1\x0c\xe9\xa5\x4e\xa9\x8c\x9b\x02\xac\x4b\xde\x67\x6c\x74\x59\xe5\x99\xe8\x7e\x81\x71\xe7\x75\x6a\x58\x64\xf8\x07\xd5\x49\xc9\x84\x56\x72\x5a\x59\x00\x8a\x02\x63\x7d\x32\x15\x0d\x9a\x6d\xee\x22\x85\xe4\x91\xeb\xfc\x8b\x04\xd3\x3d\xf5\xfe\xbd\x29\x89\x5a\xcd\x3e\xd8\x3f\xe2\x40\xe0\x35\x7f\x48\xaa\x0f\xbb\x0a\xc0\xf6\xce\x07\xb4\x78\x77\x97\xfb\x75\x9f\x6c\xfa\x92\x1b\xc7\xaa\x38\x7a\xcf\xa3\x23\x7b\x48\xb7\x7c\xea\x22\x54\x74\xa0\xb8\x44\x78\x54\x52\xc5\x25\x57\xe1\x2d\x25\xb0\xa8\x2f\x2c\xf4\x68\x49\x46\x80\x25\xb0\xb6\xf9\x32\x13\x65\x25\x66\x3a\xc9\xde\xfd\xe8\xc6\xae\xe2\x7d\x81\x7b\x1f\x51\x32\x6a\x1d\x27\x57\xb1\xfd\x42\x55\x85\xd2\x40\x9b\xc2\x2b\x3c\x95\x41\x59\x1f\xf9\x42\xf4\x8a\x36\x17\x4e\xd5\x54\xa4\x4a\x8a\xe6\x3e\xf4\x21\xa3\x6d\x8d\x38\x1f\xe0\x0b\xf3\xba\x56\x8a\x26\x5c\xc6\x45\xa4\xc5\x4e\x16\xa8\x1a\x6f\x2f\xe0\x46\xdf\xeb\xc3\xa6\xbb\x81\x86\xda\x55\xcf\x7d\x4e\xbc\xa3\x9f\xfa\xcd\xd6\x33\xce\x81\xaf\xe7\xed\x8f\x9a\xde\x42\x56\x5c\x5f\x8e\x50\x00\xe8\xb2\x50\xb9\xab\x87\x54\xa4\xed\x00\x5a\x97\x51\xbf\xe5\x13\x07\x0a\x74\x88\x51\xc8\x16\xd0\x44\x1a\xb7\x92\xa1\x59\x74\xb9\x1d\x0d\x79\xa9\x31\xed\xa8\xf5\xc0\xde\x19\x3f\x55\xa8\x71\x81\xd2\xbf\x68\xf2\x83\x9c\x7e\xaa\x3b\x4a\x1c\x75\x75\x20\x96\x90\x52\xb4\xd4\x7b\x9a\x85\x23\xda\xa1\x33\x25\x6f\xa6\x20\xa8\x81\x05\xc4\xd7\x17\xa6\x86\x94\x84\xb3\x18\x31\x61\xb8\x02\xa7\xe1\xa3\xc6\x94\x69\x06\x4e\xc6\xa6\xd3\xf0\xb7\x43\x47\xfa\x78\xc6\xd3\x9b\x7f\x9b\xa5\xf2\x8b\xb3\xa0\x56\x66\xe8\xe6\xbb\x93\x0b\x36\xd9\x9e\x41\xe5\xf7\x79\xd3\x4b\x0c\x9a\x02\xe9\x91\x84\x31\xec\x16\xdf\xed\x80\x0b\x65\xf4\xf8\x2f\xca\x22\x89\x68\x22\x61\x82\x3b\xa0\x4e\x78\x6a\xf4\x5a\xbf\xd0\x92\xb2\x90\x9e\x17\xc1\x8e\xb7\xb7\xe1\xf4\x3a\xd7\x1d\x67\xe8\x85\xf7\x8b\xa2\x9d\xeb\x36\xd5\x2e\x47\xac\x65\x4d\x93\xb6\x4d\xa6\x8d\x1e\xce\x58\x84\x9a\x5e\xeb\xb8\x4b\xde\x0b\x87\x4a\xa8\x61\x9c\xa3\x6b\x5f\x94\x45\xb4\x87\x40\xa9\x70\xea\x86\x77\xb6\x28\x33\x70\x1c\x78\xf8\xec\xc4\x8b\xae\x8f\x70\xef\x1d\x7c\x66\x24\x58\x61\x4b\x0b\x6e\xf9\x17\xb3\x52\x32\x7d\x57\x0d\xbd\xbe\x1e\xed\xfd\x1e\xda\x31\x62\xcc\x02\x33\xed\x6e\x09\xdb\xec\xea\x24\x11\xab\x54\x34\x3c\x1f\x32\x51\xfd\x82\x1d\xd7\xb3\x67\x10\x4e\x6a\x6e\xd0\xce\x09\x41\xf9\x5c\xf0\xa0\x23\x0c\xdf\xe0\xe4\xb6\x6f\x6d\xa7\xc1\x1b\x6d\xb6\x3d\x5c\x2e\xfc\x17\x1a\x61\xa7\x56\x33\x8f\xca\x9a\x1b\xdd\x30\xb5\x9e\x1e\xa3\x19\x1a\x44\x59\x7f\x7d\xd9\x74\x91\x21\x24\x92\x48\x85\x5c\x2e\xca\xb0\x7d\x51\xa8\x62\xcf\x2c\x6c\x16\x30\x2f\xa9\x69\x17\x96\xf4\x6e\x30\x12\x7b\xb6\x77\x62\x3c\x4f\x67\xc4\xf5\x27\x79\x48\x2a\x36\xac\x90\xe7\x0b\xe6\x0f\xf3\xef\xa1\x17\x0c\x0b\x83\xc9\x03\xb7\x84\xc6\x2b\x3c\xe6\xb0\x8c\xab\xf7\xa3\xbb\x87\x6e\x75\x59\x05\x23\xc5\xc9\x3a\x5f\xfe\x85\x28\x3a\x5d\xbc\xb2\x75\x12\x00\x4f\x1a\x17\x45\xb8\x33\xbc\x0c\x37\xcf\xfd\x41\xc0\xbf\xb5\x1c\x59\x78\xe1\x8c\x96\xe9\x0e\x7f\xc5\xa4\x1f\x88\xd9\xd2\x53\xd0\x53\xfc\xc0\x64\x59\xc3\x01\x30\x06\xd5\xfa\x24\xd2\xd3\xc8\xdb\xbe\x59\x63\x84\x34\x0c\x4c\xea\x4d\x6a\x81\x4c\x23\xfe\xc5\x57\x70\x9d\xd1\x53\xe2\x30\xd1\xe1\xf3\x16\xd8\x88\xf5\x07\x30\x42\xde\x26\xa7\x3f\x0a\x5a\xb1\x60\x62\xb7\x00\xc1\xb9\x0c\x4d\x7c\x32\xc9\x87\x2b\x3f\xf4\x69\xf4\x79\x7d\x94\x30\xd3\x1e\x5f\x62\x16\x5a\x10\x3a\x75\x49\x8b\xa5\x47\xc5\xfd\x19\x99\x66\xbf\x6d\x56\xa2\x7c\x71\x47\x28\x02\x5b\x24\x87\x26\x75\x7b\x68\x13\x88\x51\x69\x3e\x5c\x37\x61\x5c\xd5\x0e\xec\x74\x77\xe7\x48\x27\x51\x07\x6f\x01\xc6\x4f\xa4\x53\x29\x4c\xa3\x20\xa4\x24\xe2\x16\x71\xc3\x18\x9e\xc7\xad\xde\x87\x51\x54\xb7\x88\x4d\xd6\x60\xc3\x7d\xf8\xa1\xd6\xd8\xa6\xa8\xff\xa2\xd6\x5a\xd2\x03\x18\x71\x42\xd9\xd3\x6b\x3c\xaf\xb3\x22\x6d\x36\xa4\xcc\x87\x86\x88\xd0\xa5\x7b\x94\x8f\x4d\x15\xd8\x3c\x86\xdb\xf6\x0b\xbe\xe2\x6d\x00\xbe\x72\xdf\x07\xf2\x5d\xaa\xdf\x07\xb2\x11\xf9\x35\x6f\x48\xc2\xe0\x75\xe8\xe9\x2a\x2b\x8c\xc7\x6d\x72\xae\x87\x4c\xf0\x45\x06\x97\x07\x16\x7c\xa0\xc0\xb4\x24\xf7\xde\x00\x3b\xb4\x23\x6d\x82\x43\xf7\x3c\x47\x5b\xcf\x23\x4b\x21\x70\xdc\xc4\x14\xd3\xc3\xf7\x2f\x3a\x44\x16\x27\xf1\x1a\x7a\x1a\x1e\xd7\x29\x79\x25\xc0\xf6\x7d\x0c\x76\x84\x59\x16\x98\x78\x4d\x6d\xb4\x71\x99\x02\x0e\x13\x58\xa3\xe0\x17\x83\xb6\x5b\xf2\xe9\x4b\xc6\x8a\xd3\xbc\xa4\xca\xd5\x9a\x3f\x09\xe9\x11\xca\xe8\x75\xe3\x62\xd1\xa8\xcf\xf3\x5c\xde\xb1\x56\x4f\x14\xbf\xc2\x63\xfd\x25\xe0\x31\x7f\xfb\x9f\xfc\x8b\xff\xf5\xfb\x8f\xfc\xf1\xdf\x74\x7f\x74\xfd\xb1\x3f\x0f\xff\xca\x1f\xf8\xa7\xff\xbd\x3f\xfe\x1f\xff\xe1\x7f\xf5\xaf\xfd\xf3\xff\xe6\x7f\xbe\xfe\x89\x7f\xe8\x3f\xf8\x93\x7f\x6b\x80\x87\xfd\x47\x7f\xdf\xdf\xf8\x3d\xb6\x9e\x79\xbb\xf5\x9d\x7c\xf4\xb5\x21\xca\x06\x07\x65\x61\x5f\x17\x74\xd8\x94\x7e\xa5\x06\xe4\xca\x82\x9d\x0c\x7e\x71\x14\xe3\x4f\xba\x15\x7f\xe1\x7f\xfa\xff\x7b\x78\xbf\xe7\x57\x98\x68\x46\xeb\x7e\x01\x13\x7b\x13\x15\xc9\x03\x94\xb8\x89\xfb\x67\x2f\xed\x02\x1b\xc9\xb2\x7b\x00\x7d\x3d\xc8\x7c\x2e\xb9\x7f\x5a\x1a\xf8\x99\xbf\xc2\x99\x18\xe6\xd3\xdf\xa4\x1b\xef\x9d\x51\xa4\x9e\xb0\x66\x1f\xbb\x35\x73\x81\x0c\xe7\xdd\x35\x35\x22\x54\x9a\x05\x2b\x62\x81\x3b\x3f\xff\x57\xd0\xa1\xa4\xa2\x33\x2c\xfb\xe4\x09\xe6\x26\x7c\xc5\x30\x5e\xaa\xa2\x55\x01\x6a\x45\xe1\xc0\x62\xf5\x38\x6b\x04\xcf\xbc\xb6\x54\x6b\x3e\x38\x8b\x33\xc2\xdd\x5e\xc0\xe1\xc1\x8f\xdb\x1d\x62\x58\x8f\x23\x7a\x8a\x3c\x73\x4c\x8f\x95\xe3\x72\xb5\xe1\xd9\x26\x03\x41\x2d\xeb\x3f\x19\xb6\xfd\xcc\x67\x91\xa3\x33\xb3\xe3\x4c\xa6\x68\x47\x36\x5e\xfd\xc4\xf8\x00\xb9\xa3\x19\xae\x52\x26\x71\xd9\xb5\xd6\x7b\x06\x69\xd8\x29\xaa\x7e\xb2\xdc\xfc\x99\xcf\x62\xa2\x8b\xdf\x44\x26\x18\x73\x41\x06\x03\xe0\xa7\x89\x82\xb7\xc6\x77\x92\x31\xe4\x8f\x68\xb5\x82\xbe\xca\x99\xe5\x19\x6d\xeb\x27\x1b\xa8\x9f\xf9\x2c\xe6\x4e\x80\x45\xa8\x9d\xae\xb9\xce\xc9\x40\x71\x33\x4a\x4f\x85\x92\x5d\xc5\x0e\xc5\x78\xef\xa1\xa1\x8a\x81\x51\x21\x7d\x90\xcb\x3e\x38\x0b\xfd\xb0\x40\x1b\xd4\x5d\xd0\xc7\x23\xe2\x40\x09\x30\xcd\x0d\x86\x43\x7b\x06\x57\xc3\x2c\xe7\x75\xbd\xa5\x74\x9c\x1a\x40\x09\xf6\x41\x5c\x30\xd4\x6e\x28\xa1\xdb\x40\x6e\x2d\x18\x74\x27\x76\x05\xfe\x91\x60\x45\x2e\x87\xa8\xd3\x30\xb3\xa7\x6f\xe6\x59\xc7\x57\xa6\xf4\x4f\x44\xf9\x9f\xfb\x2c\x4c\xe8\xcf\xf6\x4f\xe4\x6b\x27\x9b\x4c\xe3\x31\xb7\x37\x5e\x56\x1b\x01\x84\xeb\x45\xd0\xa2\x53\x92\x32\xee\x8b\x02\xa4\xf4\xa7\xc6\xf6\x67\x8e\x8b\xbb\xac\xe0\x0f\x9e\xf9\x82\x52\xc3\xae\x45\x72\xb4\x95\x33\x66\x84\xb0\xe3\x7c\x36\x32\x17\xc4\xfb\x6e\xb7\x49\xa3\x8a\xea\x9f\x94\x44\x7e\xee\x3f\x62\x40\xd7\xf6\x76\xe2\x9e\xf1\x66\xaa\xdb\xf2\xb0\xa4\x5c\x21\x9d\xe4\x01\xeb\x88\x12\x26\xcb\x28\xb9\x94\xda\xf3\x96\x9c\x7f\x32\xf2\xfb\x99\xcf\xa2\x5f\x63\xd4\x6b\xf4\x8e\xf8\x99\x6b\x49\x15\x4b\xf3\xdd\x57\x8b\xf8\xb8\xb0\xac\xdc\xc7\x0e\x8f\x0f\x78\x74\x97\x0a\xd8\xe4\x27\xb2\xe7\xcf\x7c\x16\x55\xba\xb8\xf9\xa6\x0e\x69\x67\x44\x55\x60\x65\x7d\xdf\x7b\xdd\xe0\xd4\xdc\x24\xde\x59\x50\xa3\xaf\x43\x7e\x68\x8c\xd6\xd3\x7e\x5a\x3e\xfb\xb9\xb3\x96\x1c\xcf\x88\xe1\xe6\x78\x6e\xd5\x50\x93\x1d\xba\x2e\xe6\xbe\xaf\x5f\x54\x50\xf4\x1a\x5a\xba\x7b\x4c\x24\x2f\xe3\xbb\x6e\xc6\xc8\x07\x5f\x21\x75\xa4\x8e\xc8\x5a\x52\x07\x3d\xc6\x26\x72\x99\xf1\xca\xf0\x78\x06\xdb\x6a\xdd\x4b\x62\x28\x78\x15\x89\x36\x0e\x17\xa6\x61\xf7\x83\xb8\x70\x9d\x4d\xdb\xa5\x9b\xa5\x6f\xb5\xab\xcb\x1c\x87\x97\xa0\x7d\x76\x63\xce\xb9\xc0\x10\x25\xed\xa1\x60\x0d\xe8\x24\x75\x1d\xb4\x2f\x5e\x76\xde\x52\x80\xad\xea\x22\x9e\x9a\x95\x33\x53\x8e\x5e\x9e\x53\x2c\x35\x68\x06\x8e\x3b\xcc\x0c\xf9\x71\x12\x14\xbb\x7a\xd2\x23\xfc\x22\x3a\xfb\x03\xe4\x0d\x6f\xb4\x44\x9a\x72\xf0\x3b\xcd\x04\xd4\xda\x9c\x57\xd4\x5c\x1b\x21\x83\xa2\xef\xb1\x65\x34\x81\x1d\x22\xca\xb3\x0f\xce\x82\x95\xd0\xba\xa9\xeb\x45\xa8\x5a\x7b\xf8\x75\xc3\x49\xf7\xbe\x41\xd7\x1d\x25\x6c\x4d\x2c\x04\x21\x65\xe5\xb1\xab\x24\x4a\xb3\x82\xf6\x8b\xaf\xc0\x10\xe1\xe4\x31\x4f\x00\x98\xa5\xc9\x89\xc9\xc7\x07\x79\x9f\x23\xb3\xd4\x44\x99\x71\xed\xd2\xde\x80\x88\x9a\xd9\x18\xf9\xd3\xb8\xef\x67\x8e\x8b\x80\xba\x7b\xd2\x2b\xb1\xf7\xaa\xa1\xb5\x5e\x13\x27\x29\x2a\x08\x46\xd4\xc1\x1b\xec\xb9\x92\x21\x3f\x1e\x76\x8a\x37\x0e\x32\xfd\x64\x14\xfc\x73\xd7\x9d\x62\x13\x93\xc6\x0b\x45\xee\x46\xe0\x8a\x12\x16\x62\xaa\xf0\x94\x9d\x70\xa4\xa9\xbd\xf5\x3e\x84\xd0\xe3\x12\x69\xa5\x8a\x29\xe2\x17\xf9\x22\x83\x63\xdc\x09\x80\x94\x4e\x1c\x55\x48\x96\xf2\x54\xbf\x50\xd5\x48\x97\xcd\x11\xdb\x6b\xef\xb7\x76\xc4\x7a\x55\x11\x4c\xf0\x41\x3f\x42\xb1\x57\xfb\xa9\x49\xe1\xf8\x70\x24\x29\x9c\x12\x3f\x76\x1b\x7d\xa1\xce\x9d\xce\xa0\x2a\x93\x1c\xd5\x1e\x46\x96\x49\xe4\x51\xcb\x17\xd1\xc9\x4c\xd1\x62\x99\xea\x1c\xbe\x4f\x24\xaf\xe9\x73\xb2\x93\x13\x4c\x28\x17\xd1\x2d\xba\x50\xb8\x06\xf4\xcb\xcb\x2f\x3e\xb4\xfd\xc4\x82\xfa\xb9\xbb\xa2\x84\x55\xdf\x42\x35\xb8\x2b\x09\x9d\x2d\xa7\x6f\xe2\x04\x57\x5a\x3a\x7a\x3b\xcd\x14\x70\x4a\x5f\x0d\x50\xe6\x21\x3a\x09\xc1\x17\xfd\x48\xb4\xcc\xcc\xb8\x99\x2e\x2a\x60\x22\x4b\x47\xb2\xbe\x3b\x90\xf7\xf4\x03\x61\x09\x6f\x3c\xc5\xe9\x3b\xe5\x8f\x37\xce\x1b\x11\xf9\x17\xd1\xc9\xe8\xe8\xa2\x2b\xe4\xc5\x1e\x45\xa3\x86\x29\xe2\x9d\x70\x53\x4a\x6e\xb0\x87\x63\x22\x95\xe2\xbd\x5c\x93\x39\xb3\x79\x05\x62\xe0\x83\xe8\xd4\x40\xec\x26\xe6\xce\x03\x72\x4b\x4a\x6a\x41\xe2\x47\x42\x00\x76\x18\x48\x09\x8e\xfa\x93\xd9\xdd\xb2\xd4\xd2\x99\x94\x73\x9d\x2f\xea\x4e\xcb\x32\xa9\x0f\x6e\x40\xdb\xba\xb1\x75\xc7\xfb\x41\x22\x5b\x4f\x25\x31\x34\xa8\x44\x8a\x47\xb0\x57\x75\xc3\xc6\x9d\xe3\x3e\xf5\xff\xeb\x04\x7e\x09\x78\xfc\xcd\x3f\xf5\xd7\x85\xb8\xf2\xf7\xff\x3d\xff\xe2\xff\xf9\x67\x7e\xeb\xdf\x5e\xff\xd9\xef\xfc\x95\xff\xe5\xaf\xfe\x73\xff\xca\x7f\xf1\x4f\xfd\xb1\x3f\xf2\x87\xfe\xfc\xfd\x4b\x7f\xe0\x2f\xff\xfc\x80\x07\xe5\xbd\x78\x5e\x58\x0c\x8b\xef\xb1\x9e\x6a\x28\x00\xe5\xc9\x6e\x26\x6e\x02\xa2\xd4\xa5\x76\xa3\x49\x92\xda\x9a\xcd\xea\x50\xfb\x0f\x7e\x21\xa3\xeb\x19\x59\xc5\x1c\x8f\xa0\x5d\xb2\x87\x18\x5b\x9c\xf1\x5c\x58\x2f\x58\x62\x34\x66\xe5\xad\x21\xca\x6d\x02\x1d\x06\x9a\x85\x2f\x9a\x39\x0e\x48\x7e\x16\x7e\x77\x33\x28\x4d\xbd\x30\x07\xd2\x70\x06\xa4\x3d\x17\xf4\xa4\xae\x62\xa0\x15\x35\x4a\x3c\x8b\x3b\x3a\xe0\x4f\x92\x77\x3f\xf3\x57\x80\x20\x5a\x10\xd1\x0e\xcf\xe4\x98\x21\xeb\x70\x2f\xcb\x6b\x25\x5e\x90\x17\x71\xe2\x83\xab\xa6\x34\x5e\x1a\x7c\x11\xf5\xfa\xfa\xc1\xd5\xa6\xc4\xba\x98\x7c\xe6\x94\xd3\x7c\x08\x12\xca\x35\xc4\xa3\x80\x0c\xf6\x10\xd5\x03\xdc\xec\xfd\x2d\x0e\x4d\x7d\x1a\xa9\xdb\x89\xf3\x45\x63\x1b\x31\xba\xa6\x72\xb2\x43\x09\xf7\xe9\x26\x78\x86\x09\x22\x8f\x6c\x6c\xa8\x6b\xba\x29\xef\x7c\x68\x08\x4e\x90\xfd\xd4\xd8\xb6\xfd\xe2\xe1\xb1\xa3\x3b\xc5\x59\xa7\xbd\x16\x4b\x59\xae\xfa\x12\x58\xd2\xcb\x84\xf7\x99\x39\xa2\x47\x87\xe2\x95\xb3\x5f\x4b\x36\xe2\xd4\xc3\x2f\x12\xcc\x7a\x16\x74\xf0\xea\x91\x87\x9b\xb2\xaf\x4e\x71\x30\xb9\x47\x02\xac\x0e\x5c\x22\x6d\x6d\x3d\x82\x4e\x78\xce\x33\x79\x9d\x1e\x7e\x10\x9d\xd4\xb9\xc8\x88\x20\xe6\x0a\x6c\x12\xc5\x21\x89\x59\x91\x82\xdd\x0f\xad\x4f\xa4\x74\x8e\xaa\x6b\x36\x0d\xd1\xa2\x53\x07\x4f\x66\x1f\xb4\xd7\xb4\xa6\x16\x47\x63\xdb\x1c\xa4\x22\x03\x08\xd2\xd9\x1f\x8d\x85\x4d\x27\x8f\x96\x17\xac\xce\x6a\xfb\x34\x79\x31\x7e\x17\x7c\xd7\x27\x85\xea\xf0\xd8\x5f\xe6\xd3\xe3\xa8\xb3\xab\x77\xfd\x88\xe9\x13\x3a\x40\xd0\x7b\x48\xbc\xf0\x6c\x29\xf8\x41\x94\xf0\xd7\x8d\xbc\xc4\x6d\x5f\xc4\x45\x15\x4f\xd9\x81\x16\xee\xe8\x4c\x13\x93\xa1\x66\x95\x1e\x70\xa3\x1e\xb9\x03\x16\x9a\xaa\xfc\x3e\x05\xd6\x16\x03\xb6\x52\xd8\xfd\xc1\x1d\x79\x0e\x72\x40\x57\x6a\x4c\xbc\x10\x4b\xc2\x90\xd1\xe1\x8c\x78\x8c\x84\x85\x0d\x31\x6f\x1d\xc0\x60\xfa\x8e\x08\x23\xdc\x89\xf6\x2f\xfe\x08\x25\x50\x50\xa2\x40\x0e\xca\xfa\xc5\x97\x72\x54\xcc\x46\x40\x7f\x50\x73\xeb\x05\x87\x53\x57\xb9\x43\xf0\x0a\x5f\xd9\xc2\x99\x7e\xd1\xcc\xb1\x19\xa9\x75\xca\xbd\x32\x32\x44\x67\x2f\x8a\xed\x58\xc2\x63\x65\x05\x5d\xfa\xc2\xb6\x43\x5c\x17\xc4\xad\xb2\x5b\x67\x0b\xe9\x17\x25\xe2\x9b\x2c\xf3\x9d\x6b\x22\x2b\xd8\x55\xaa\x97\xb5\x0e\x70\x17\x80\xf0\xbc\xd1\x1c\xca\x0e\x3e\xfb\xc6\x2c\x11\xe9\xd8\x23\xff\x5f\x53\xc3\x9f\xfb\x4d\x8d\x82\x8a\x0c\x2b\xdb\xc5\x75\x04\x56\xb1\xa7\xd7\xb5\x1c\x77\x76\xc7\xa6\x04\xe1\x2c\x73\x1d\x73\xd9\x37\xf4\x00\x30\xf1\x1f\x34\xf9\xd4\xe7\x40\x54\x97\x3e\xeb\xc2\x91\x0e\x38\x0a\xf9\xc4\xe4\x1e\xfb\x60\x12\xa1\x66\x4f\x07\x9a\x5a\x71\xaf\xd5\xf0\x48\xac\x1a\xff\x22\x2e\x42\x98\xbc\x39\x29\xb9\x4a\x07\xbe\x56\xc4\x16\x1b\x16\x3b\xd1\xc4\xe1\x33\xbc\x85\x27\x6a\xd5\xb5\x29\xa7\xd4\x90\x53\x1f\xe5\x0b\x20\xcc\x1e\x84\xe9\x5d\xda\x6f\x07\x72\xbc\x1d\xdb\xba\xf6\x7a\x54\xdf\x3b\xfe\x78\x50\x00\xa2\x77\x05\x3b\x6d\x7a\x51\x8b\x41\x1f\xfa\x01\x58\x4c\x5d\x73\x00\xc8\x2d\x1d\x3d\x6f\xdf\xcd\xaf\x06\xaf\x72\xa7\x46\x0f\xbd\xf0\x54\x9f\x37\x67\x7e\x45\x9a\x6a\x5e\x45\x17\x4e\xed\x8b\x2a\xa7\xca\x07\xa4\x7d\xd1\x09\x2f\x85\x10\x60\xa5\xbb\x6e\xe8\xe0\xcd\x97\x70\xfb\x94\xa6\x08\x22\xc4\x66\x10\x14\x08\x5a\xa8\x5c\xbf\x18\xb4\x31\xa4\xd2\xc2\x95\x81\x37\xea\xa2\x16\x78\x32\x94\x85\x5f\x3f\xb5\x3d\x56\xa9\xfb\xff\xd0\xf6\x6f\x21\x1f\x7d\x71\x5e\x30\xf4\x06\x06\xbd\x91\x5a\x39\x84\xa0\x19\x24\xa9\x99\xe5\xb8\x0e\x7b\x0d\x04\x45\x04\xa2\x26\x62\xdd\x88\x0d\xa1\xeb\x7c\x3e\x9f\xf6\x5a\x5a\x14\x13\x36\x46\x64\x22\x28\x59\x11\x3a\xa5\x68\x69\x53\x64\x22\x25\x91\x81\x24\x35\x05\x45\x21\xa1\x25\x78\xa8\x40\xcd\x20\x4c\x8d\x34\xfe\xa3\x82\x30\xef\xe5\xec\xeb\xe7\xe6\xe1\xb7\xf7\xfe\x1e\x3e\xa7\xaf\xca\x18\xc8\x65\x9c\x92\x6d\x21\x7d\xf1\xfe\xe7\xa9\x6d\x3f\xcf\xbf\x45\xf6\xf4\x4e\x81\x86\xc8\x49\xef\x21\xf2\xbb\x79\x8f\x83\xda\xc9\x05\x69\x1b\xa7\xa1\xe3\x0b\x2a\x3d\x92\xc3\xc8\x3d\x94\xa9\x7e\xb1\x09\xe4\x51\xc6\xd1\xa6\xa2\x05\x9f\x7e\x78\xa1\xf3\x04\x19\x76\x04\x59\xeb\xe8\xc3\x44\x96\x32\x09\x5e\x64\xc1\x7b\xd4\x4c\x2c\xd5\x2f\x66\xf0\x30\xfd\xdc\xea\xaa\xe6\x6b\x3d\x72\xe0\xeb\x28\x1f\x8b\x54\xc4\x75\x3a\x9a\xcf\x9b\x3b\x7b\xa6\xce\xd9\xb8\x5c\x99\x4d\x0e\x7e\xd1\xd9\xdb\xaa\x14\x96\xa7\x0c\x44\x02\x90\xad\xe0\x25\x35\xe5\x04\x19\xa5\x1d\x1e\x8f\xba\x96\x35\xbd\xda\x80\x06\x49\xfb\x82\x02\xc1\x17\x60\x71\x12\x2f\x67\x52\xc3\x9d\xb7\x4b\x6b\xcd\xd8\x6f\x51\x88\xba\xf3\xa0\x5b\xc6\xca\x00\x94\xe7\x41\x62\x49\x52\x56\xd5\xc3\x0b\xff\x05\x95\x81\xa0\x72\x1b\x3a\x1e\xe3\xe3\xb7\x2f\xb0\x80\x93\x8e\x0f\x65\x0f\x5e\x94\xb5\x38\xcb\x54\xb1\xe8\x40\x23\xf1\x32\x15\xed\x39\x9f\x74\xb3\x07\x3d\x03\x42\x46\xae\xa1\x2a\xcc\xa1\xcb\x3c\xb5\xbd\x98\x05\x59\xf0\xac\x3f\xac\xf6\xea\xb5\xfa\x30\x7f\x7e\xb6\xa0\x04\xfb\xc5\x26\x00\x4f\xcc\x92\x61\x38\xbb\x8b\x6c\x73\xcc\xe6\xa2\xa0\x94\x12\xf4\x78\x33\xae\x0b\x27\xbc\xc2\x13\x27\x9c\xc3\x71\x48\x17\xe7\x9f\xd0\x3a\x96\x8b\x1c\x93\xdd\x86\x16\x41\xac\xf6\x48\x67\x23\xe8\x0b\x8b\x40\xe4\xf5\x8b\x1d\x21\x45\x31\x9b\xe6\x47\x22\xd7\x69\xf0\xf9\xe7\x00\x1e\x7f\x14\xfe\x3b\xcd\x7f\xff\xff\xf4\xd7\xff\xd9\x9f\xfe\x93\x7f\xef\x7f\xf1\x9f\xf8\x23\xe2\x77\xff\xa9\x7f\xf7\xff\xfd\x97\xff\x47\x7e\xfd\x7f\x09\xfe\xff\x7e\xea\x27\xfe\xd4\x9f\xf9\x25\xff\xeb\x9f\xf9\x00\xf0\x48\x29\x9e\x89\xae\xae\x55\x60\xa0\x90\xf2\x0a\xb0\xa7\x69\x70\x5b\x36\x12\x31\x35\xda\xb3\x03\x7a\xdd\xb9\x82\x89\xc4\xc4\xf8\xe7\x82\xa5\x9f\xe7\x1f\xcf\x73\x3f\x5c\xb1\xfe\x6d\x3c\x29\x18\x31\x4b\x97\xec\x0a\xd6\xf4\x4a\xb4\x51\xf5\xe9\xc2\xa3\xcc\xdb\x30\x20\xb3\xc0\x68\x3b\xf9\x0b\x74\xb9\x85\xe9\x59\x59\xb2\xf0\x14\x8e\x55\x34\x54\x86\xb0\xcf\xe0\x49\xaf\x7e\x6f\x84\x58\x00\x00\x5a\xdb\x3c\xbf\xe5\x79\x5e\x7f\x3e\x80\x5d\x68\x7c\x51\xe1\xdd\x28\x94\xb8\x02\x83\x1a\x55\x92\x6a\xa9\xad\x89\x63\x36\xe2\xdd\xde\x52\x38\xd1\x2a\x6d\xd4\xb3\xaf\x15\xb8\x7f\xc0\xcc\xd1\xc8\xf2\xb4\xcc\x80\x63\x6e\xdd\x68\x29\x43\xc8\xed\xbc\xc1\x31\xc3\xee\x8f\xe2\x8f\x40\xd8\xdc\x61\xa9\x69\x75\x67\x36\x84\xdb\x5f\x8c\x45\xa5\x37\x46\x12\x0d\xfd\xc9\x4e\xd1\x36\x6d\x83\xf8\x20\x83\x39\xf0\xe0\x44\xe3\x4a\x03\xf4\xbd\xf4\x67\x8f\x2c\x82\xa0\x0d\xfc\xe2\x89\x94\xa9\xc5\x48\x03\xf3\x21\x98\x6f\xb3\xbe\xee\x62\x2d\x98\x3a\xfb\xa9\x1d\x40\x80\x98\x2c\xe0\x86\xa5\x73\x52\x67\x94\xbc\xd8\x07\x48\x3b\x85\x50\xb7\xcb\x6f\xb5\xb8\x8c\x65\xf6\x10\x71\x9c\x1f\x0a\xdb\x79\xaf\x13\xd8\x8d\x57\xe2\x61\xde\x97\x75\xe1\xdf\x4a\x5d\xa7\xe0\x8b\xd5\xe1\xd6\x3e\xd2\xb8\x45\x01\x63\x3b\xab\xa6\x5a\x4d\xb2\x98\x15\x58\xc3\xfd\x0a\xb3\xba\x89\x61\xe4\xee\x4e\x00\x59\x56\x38\x8a\x0f\x96\x39\x6a\x6a\x7d\x01\x2a\x05\x9c\x90\x88\xa0\xcc\x79\xf2\x8e\x23\xc4\x09\xe7\xf8\x12\x95\x10\xf3\x9e\x01\x61\x9b\x51\xb9\xd8\xc8\x3c\x5f\x7c\x23\x64\xef\xaa\x99\xa6\x16\x3e\xe5\x4e\x23\x8e\xd1\x72\x0f\x00\xdf\x43\x52\xba\xda\x0a\x04\x5f\x90\x96\x28\xbd\x63\x2f\xa8\xf6\xfe\x8b\x35\x0a\xe9\xe4\x97\x19\x87\x5a\x0c\xaa\x0c\x11\xdb\x2b\x58\xcd\x90\x46\x3a\x73\x27\x8d\x36\xed\xbc\x2e\x63\xf5\x87\x18\x41\x35\xb2\x5f\xf0\x40\xd7\xa2\x6c\xba\xb5\x7a\x03\x8a\x9e\x76\x9e\x19\x3d\xae\x1a\xca\x93\xa1\x1c\x4d\xa1\x41\x89\x4c\x90\x32\x80\xed\x16\x5e\xe5\xf6\x85\x16\x2b\x68\xe5\x07\x3f\xb7\xf2\x19\xe8\x3b\x03\x0f\x91\x02\xb1\x40\x42\x17\xc9\xa9\x46\x1c\xaf\x4f\x75\x26\x09\x74\x56\x31\xbd\x9a\x7f\x01\xbb\x58\x29\x1f\x20\xba\x8a\x00\x8b\x19\xeb\x7e\xc5\x2c\xe6\xbc\x98\xb6\x1b\xb3\xec\x95\xf4\x68\x62\x24\xa4\x0e\x69\x84\x18\x4c\x7c\xc1\xa1\xd3\x61\x39\x61\x56\x99\xd0\xcb\x25\x82\x77\xc0\xda\xd5\xce\xa6\x71\x2a\xaa\xda\xea\xb4\x94\x14\xf3\xa4\x15\x28\x89\x96\xcf\x43\xbf\x78\x22\x30\x48\xe7\xb0\x4f\x15\x3e\xe6\xd9\x90\x2e\x70\x0e\x9b\x0c\xc9\x3d\xbd\x5b\x93\x10\xec\x37\x0f\x33\x24\xeb\xeb\x4e\xc0\xea\x4f\x3a\x3b\x5b\x9a\xcc\x98\x8b\x79\x93\xab\x96\xc2\xac\xb6\xd5\x97\x2c\x78\xf2\x21\xdb\x0c\x84\xde\xb5\xaf\x0d\xad\xec\x83\x02\x55\x89\x7e\x00\x35\xd0\x98\xa1\x89\xe7\x3e\x68\xbf\x3e\x92\xb4\xab\x3d\x82\x19\x71\xe7\x96\x7d\x1c\x14\xca\x52\xe3\x8e\xfb\xbc\xba\xbc\xbe\x4d\x19\xfb\x07\x3d\x95\x3d\x24\x96\x16\x1c\x98\x71\x44\x7f\x99\x2c\x9e\xf7\x00\xb7\x4d\x62\x9a\x26\x73\x5f\x6f\x30\xa9\xcb\x68\xf5\x2a\xba\x1d\x46\xe1\x17\xab\xc3\x60\x5c\x66\x0e\x0d\x4a\x03\x21\x02\x4c\xd4\x3a\x3c\xa8\x3e\x1a\xdd\x31\xc0\xee\x07\xaa\xed\x91\x20\xc5\x6c\x83\x5d\x0a\xd9\x7d\xa1\x6a\x40\x91\x5a\xf7\xbc\x13\x6d\x44\xf2\x5e\x98\x9c\x8b\xe8\xb4\xc5\x6d\xe3\xe4\xa3\x4e\x73\x7e\x5d\xf6\x72\xd8\x21\x80\x49\xd7\xcc\xbf\xd0\x37\x7b\xca\x9e\xc8\x84\x11\x84\x84\xac\x17\x0c\xeb\x46\x2e\x2e\x9d\x22\xdd\x34\xa6\xa5\x4a\xcb\x74\x62\x9d\x5b\xd3\xbd\xa0\x4d\xf4\x0b\x2d\x56\x3a\xae\x77\x09\x04\x26\x7a\x3f\x1d\x06\x6c\x46\x96\xfa\x8c\xba\xe7\xa6\xec\x7d\xc0\x59\xa0\x36\xf0\x2c\x9e\x54\x01\xd8\xbc\xec\x8b\x2f\x75\x07\xfe\x58\x68\x26\xe1\xa0\x0b\xb7\x65\x38\xc2\x9f\x4a\x81\x71\x2b\x5f\xf0\x1c\xb8\x43\xde\x40\x68\x70\x9f\x60\x1d\x1a\xba\x7d\xd1\x53\x1b\x25\x5e\x55\x86\xac\xa4\x56\x70\x5c\x92\xc0\xef\xd1\x90\xbe\xa4\x62\xdf\xb0\x11\x76\x29\xc5\x6b\x93\xd9\x2c\x63\xc4\x0c\xf0\x93\x3e\x32\x09\xd3\x66\x96\xd2\x76\xf3\x5b\x02\x12\x07\xe5\x29\x71\x68\xf5\x2e\x4d\x69\x0d\x18\x5b\xbe\x27\xf6\x1a\x1d\x83\xc9\xd9\x7e\x01\xbb\xa0\xfe\x3a\xa7\x32\xed\x0d\x31\x01\x9f\x3a\x62\x5c\xae\xb5\x34\x65\xc6\xe6\xa6\x49\xd8\x9b\x80\x8b\xb0\x3d\x6c\xe7\x83\x46\x3a\x5f\x10\x2a\xcd\x80\x3a\xa2\x12\x14\x99\x36\x34\x5e\x02\x9d\xe6\x4d\x16\x58\xe1\x12\xd7\x4e\x7b\x3c\x79\xa5\x64\x14\x99\x27\x6c\x1d\x6f\xf8\x62\xca\x69\x6a\x76\x4d\x78\xc8\xf6\xd0\x4a\x72\x54\x91\x42\xff\xf6\x3c\xa9\x48\x45\xab\x75\xae\x03\x79\x3c\x02\x27\xcd\x5f\x1b\x16\xf9\x82\x8c\x66\x8d\x41\x2d\xa8\x61\x4b\xe5\x57\xf8\x1d\xa6\xf5\x09\x9f\x37\x9b\xd6\x9f\x6b\x4f\x98\x92\x9d\x48\xa7\x1e\x1b\xac\x57\x76\xad\xe1\x17\x2a\x28\xca\x67\x90\x82\x5c\x87\x35\x44\x22\x57\xd9\x98\x83\xab\x61\x12\xb3\x39\xad\x1b\x7e\x7b\x36\xe2\xd2\x55\x54\x27\xb6\x1c\xfb\x6f\xa0\xf0\xf8\x5d\x7f\xe5\x6f\xfc\xb6\xf2\x37\x7f\xec\x97\xff\xd9\xff\x10\xff\x0d\x3f\xfe\xbb\xcf\x5f\xfa\xa3\x7f\xe1\xff\xf9\xfb\xde\xbf\xf5\x6b\xff\x07\xff\x9f\xdf\xf6\x6f\x75\x7f\xe2\xbf\xfb\x0f\xfe\xc9\x07\x96\x16\x6e\x02\x6e\x82\xf9\x3b\xc5\x5a\x4b\xd4\xb1\x11\x4d\x89\x0c\x41\x56\xcb\x32\x95\xad\x7a\x79\x01\x24\x8d\xb3\x15\x74\x8d\x8e\x7e\xd1\x78\x18\x35\x29\x05\xf8\x56\x11\x1e\xf5\xda\x70\x25\xf2\xb6\x02\x46\x61\x64\x6f\x1d\x59\x83\x82\x90\x8a\x26\xc7\x26\xf1\x4c\x8a\xba\x0f\x3e\x2a\x3a\xd8\x38\x39\x70\xba\xaf\xe9\x61\x4d\x39\xce\x56\x46\x5c\x43\xe2\x22\xb0\x1b\x01\xe4\x75\x46\xac\x37\x76\xd7\x64\xdc\x56\xf6\x0f\xf4\x04\x74\x12\x06\x36\x2d\x31\xa8\x38\xfa\xdd\x94\x81\x38\x5e\x16\xdc\x3b\x52\x15\x82\x44\x4f\x81\x48\xe9\x39\xf4\x5d\x87\x62\xac\x80\xfb\xa2\x09\x13\xb0\x40\x99\x4b\xee\x07\x18\x2a\x09\xb9\x8f\x1c\xe5\x20\x67\xe1\x1b\x53\x7b\x8e\xd7\x7a\x6d\x28\x68\x7d\x77\x60\x74\x32\xf5\x85\x75\x81\x3e\x68\x70\x44\x3a\x4e\xb7\x72\xf1\xe0\xd4\xe6\xc8\x5e\xb2\x07\x2c\x50\xa9\xa5\x9b\xef\x0c\xd9\x80\xbb\xb3\x5a\x93\xe7\xe7\xdc\x2f\x0a\xcc\xbc\xcc\x22\xbb\xfd\xd5\x67\x07\xbd\x9f\xad\x61\x76\x3b\x71\xe7\x16\xec\x94\x30\x9a\xa6\xb4\x2e\x24\xf2\x3a\x2d\x1c\x6e\x8a\x7e\xc1\x03\x55\x97\x6b\xf6\x9a\xdd\x51\x24\x68\x55\xaf\x18\xf5\xc4\xc0\x66\xd3\x1b\x22\xb8\x36\x1a\x9b\x29\xcc\x9f\xcc\xf7\x53\xd8\x95\x5f\x08\x1c\xa9\x35\x0b\xbf\x45\x1b\x7f\x39\xbc\x4a\x83\xf7\xb1\x46\x3a\x5b\x51\xd8\x3a\xcd\x81\x54\x55\x85\x87\xd6\xcd\x04\x39\xcf\x48\xaa\xfb\xe4\xb7\xf0\x66\x63\x1d\x96\x40\x64\xf8\x59\xa9\x11\x14\x76\x44\x0d\x9f\x97\xab\x23\x33\x71\x75\xe1\x0c\xac\xf0\xdb\x27\x63\xe9\xf9\xc4\x4c\x22\xb5\x93\x5b\x35\x67\xee\x0a\xb4\x74\x57\x4b\xc4\x69\x49\x68\x9e\x10\x9e\xa0\x7d\x6f\xfb\x79\x5d\x77\x66\x86\xeb\x2b\x57\xff\x22\xf3\xe7\xe7\x9d\x2b\x7d\x33\x65\x2b\x39\x40\x2c\x69\x08\x11\x1f\xed\x6b\xef\xe4\x65\x7a\x2a\x75\xd6\x1c\x55\x60\x95\xa2\x82\x8b\x36\x1f\x2d\x3f\xa9\x17\x6e\xd3\xd1\xdd\xc3\xdf\xa6\xde\x0d\x51\x94\x30\x71\xdf\x68\x59\x6f\x0e\x9a\xa9\x0c\x84\x02\xef\xc3\x52\xc0\x98\xa3\xae\xb9\xfb\x44\x28\xdf\x9c\x5c\x99\xd5\xa2\x97\x49\x9a\x0e\xc0\x5d\x12\x6d\xed\xd6\xdc\x1a\xce\xee\xce\x68\xdf\x8e\x36\x3d\x1f\x43\xb4\x9e\x89\x7d\x62\x69\x11\x35\xfb\xe0\x28\x53\x76\x60\xa7\x80\x27\x98\x23\xcd\x1f\x8b\xe9\x12\x75\xbe\xdc\x09\x48\x69\x26\x18\x54\x69\xd5\x1e\xe6\xf9\x64\x75\xb0\xb4\x99\x13\x11\x26\xe5\xe9\x48\x02\x0e\x1f\xdb\x28\xcc\x3d\x1d\xdf\x91\x78\x91\x91\x78\x57\x41\x72\xcd\xdc\x3f\x9a\x09\xf2\x89\x08\x98\x0b\x67\xcb\xc5\x1a\xc8\x5a\x2d\x83\x55\xae\x7e\xb9\x54\xa7\xd6\x97\xaa\x9d\xfd\xbb\x64\x66\x89\x3e\xbe\x0f\xd3\x87\x7c\x16\xfd\x02\xa6\x0d\x36\xf5\xfb\x44\x6c\x3a\x34\x9d\xc0\x55\xfa\x8e\x1a\x83\x37\x37\x7e\x60\x7d\xae\xa1\xbe\x32\x36\xab\xdf\xef\xdc\x2f\x84\xf0\x7c\xc0\xa1\xb3\x9d\xdf\x95\x99\xbc\xb8\xd8\x2a\x4a\x78\x6f\x9c\x44\x58\x72\x9b\x21\x88\x97\x70\x9e\xf5\x28\x6f\xcf\x98\xba\x9b\xa1\x95\x06\xfd\x0b\xb0\x98\xfa\x6a\x49\x29\x3a\x07\x26\x36\xc5\x75\x44\xc3\x97\x94\xd4\xb9\x19\x1f\x8f\xce\xda\x95\x6f\xd1\x39\x9b\x26\xe6\x4a\x50\xf8\x02\x76\xa1\xb4\x71\x67\x5c\x24\x4f\xce\x2e\x39\xc7\xfa\xab\xa9\xc5\xd8\x1b\xed\x66\x57\x9d\xc0\xde\xdf\xaa\x13\x38\x87\x9c\x97\xdf\x40\xc7\x17\xbf\xc5\xf0\x2a\x49\x76\xce\x6e\x8d\xd3\xf7\x39\xac\xcf\x0c\x9b\x2c\xf6\x21\xce\xdd\xf4\x1c\x13\xd7\x65\x6f\xba\xcd\xb4\x77\x6d\xb9\xd8\x17\x7a\x02\x6d\x77\x61\x18\xab\x3e\xa2\x79\x04\xb5\x8a\x5b\xa0\xfa\xbb\x9a\x04\x46\x25\xe9\x52\xa0\x05\x46\x04\x9b\xc0\xc5\x0a\x35\x6a\xff\xc0\x32\xcb\x46\x3c\x0c\xf4\x76\xb7\xd7\xad\xbd\xd7\xe8\x28\x92\xce\xb7\xfb\x1d\x75\xc8\x19\x96\xbc\x8d\xf1\x25\x47\x16\xd7\x5b\xa7\x40\xfc\x83\xaa\x45\xe3\x75\x09\x26\x63\x5d\x79\xb0\x90\xd4\x55\xcf\x5b\x34\xf1\xd9\xad\x54\x28\x0e\x4e\x72\x50\xf3\x86\x4d\x74\x00\x15\xaa\x85\xeb\x17\xf6\x61\x1c\x16\x2f\xcc\x03\x92\xde\x22\xcd\x4a\x33\xcd\xca\x30\xc9\x23\x90\xdd\xfd\xc8\xeb\xb8\x27\x41\x27\x34\xec\x31\x95\x56\x5b\xfb\x60\xbe\x60\xa3\xd1\x88\xc8\xf5\x15\x12\x8d\x6f\x90\xeb\x80\xd7\xaf\x9f\xbd\x2d\x84\xde\x2d\x70\x78\x7d\xed\xeb\x9d\xa3\x96\xce\x6c\x17\x10\x7c\x01\x84\xbd\x79\x8a\x97\xa6\x5d\xcf\xb8\x20\x54\xfc\x28\x74\x97\xa6\x32\xc3\x11\x74\x24\x17\x40\x47\xa9\xef\xc5\xab\x2e\xa2\x4d\x46\xf5\x2f\xd4\xf7\xd6\xa2\x7b\x1e\x3d\x7d\x29\x8d\x69\xef\x6a\x52\x6e\x8f\x42\xd1\x0b\x76\x1e\xc6\xc8\xc2\xd6\xc1\xb7\x82\x41\x7c\x88\xab\x48\xf0\xc5\x86\xe8\x07\xb2\xf6\x9d\xa5\xb6\xa9\xba\x9c\x93\x77\x25\xd9\x9b\xfb\x62\x8e\x07\x85\xe3\xb4\x1b\x2c\x13\xe9\x3d\x9b\xe2\x58\x49\xfd\x62\x5b\x66\x8a\x27\x84\x32\x6c\x61\x8a\x37\xcb\x8e\xc6\x2a\xb5\xa2\x96\x58\x12\x3a\xec\x0c\x34\xa9\x3b\x38\x45\x75\x2a\x20\x7b\xd2\xa6\x50\x5f\x00\x61\xfa\x91\x7c\xcf\x68\x8f\x93\x68\x2d\x60\x72\x78\x5f\xf9\x06\x39\xe7\x3a\x1a\x69\xc1\xd2\x0c\x9c\x35\x5a\xa1\xb1\x7c\x9e\xf2\xaf\x6c\x02\xff\x12\xf0\xf8\x4f\xff\xe9\x3f\xf7\x93\xbf\xec\x3f\xf6\xe3\x7f\xef\x0f\xfc\x9d\x5f\xf8\x13\xfb\xd7\xfc\xd2\xff\xe1\x4f\xfc\x5a\xf6\x1f\x9c\xbf\xfa\xaf\xff\xc5\xbf\xf2\xab\xfe\x53\xff\xf8\xbf\xf2\x33\xbf\xbe\x7c\x00\x78\x20\xdb\x1e\x47\xb8\xb1\x45\xfb\xbb\x9c\x38\x37\xe8\x1e\x63\xeb\xdb\xb3\x1b\x5e\xd3\xeb\x2b\x45\x1f\xe0\xa5\x88\xf7\x96\xf0\xae\xe8\x8b\xc5\xd6\xbd\x2c\x37\x9b\xa8\xd1\x0e\x79\x06\xb4\xbe\x14\x1f\x48\x2d\xaa\xc3\xc1\x93\x7c\x6d\x6b\x20\x2c\xfd\x21\x1b\xf7\xae\xd8\x17\xa2\x3e\x46\x51\x0c\x88\xf9\xdd\xf1\x9e\x6f\x00\x8c\x22\xe0\x77\x7b\x7a\x42\xfc\x4d\x37\xef\x41\xd3\x64\xc3\x63\x62\x66\x5c\xbd\xd1\x53\x3f\xc0\x75\x99\x75\xa0\xd3\xbd\x03\x7a\xba\xb7\xec\x00\x03\x01\x54\xca\x1e\xd8\xd6\x99\x9d\xcf\x8e\xc1\x5a\xb4\x79\xb5\x93\xd4\xfa\xb2\xf3\x85\xd3\x97\x42\x16\xf3\x5b\x97\x43\x5d\x78\x82\x0e\xda\x9e\xd3\xde\xf1\xe6\x58\xdc\x51\x56\xed\x11\x9f\xcc\xc0\x6b\x73\xb6\x52\x9a\x67\xd5\x0f\xf8\x41\x2a\x85\x3d\x04\x01\xff\xd2\xb5\xf2\xe9\x9a\xab\xd7\xbc\xef\x16\xd4\x25\x76\xdc\xde\xc8\xd7\xeb\xc5\xc9\x8f\x99\x6b\x2d\x5b\xfc\x37\x6f\xe7\x0f\xab\xb4\x88\x32\x56\xa0\x42\x5f\x2a\xbe\xb9\xbb\xcb\xa8\x30\x66\xb3\xe8\x25\x82\xb3\x8f\xd0\xd8\x5e\x63\x76\x53\x8d\xe4\x5f\x48\x0b\xb3\x42\xb6\xef\x31\x91\xee\xe5\x32\xbf\x68\x80\xba\x06\x3e\x38\x7b\xda\xe3\xbd\x35\x8e\x35\x08\xb6\xd5\x36\xd9\x88\x00\xcd\x5f\x8c\x45\x34\x91\xdd\xe4\x13\x0d\x85\x0a\x58\x43\x86\xb1\x6b\x69\xdb\xf4\xd6\x0f\xd8\x81\x4a\xfb\x64\xce\x06\x23\x54\x5c\x7a\xd2\x5c\xe1\x0b\x63\x0d\xcb\x70\x87\xd9\x20\x62\x27\x49\xbc\x87\xcb\x7b\x44\xa2\x3c\x38\x6f\x36\x4c\x3c\xbe\x3c\xfe\x20\xcf\x60\xa4\x25\x75\x7d\x57\xfc\x84\x37\xbe\x64\xd6\xe6\xf1\xd5\x3e\x44\x9a\xa7\xcc\x0f\x99\x3f\x2c\x10\xc5\x65\x67\xb6\x45\x99\x1e\x3c\xcc\xec\x88\x94\x40\xe9\xbb\xe4\x17\xc9\x43\xb4\x07\x4d\x0e\x6a\x29\x3e\x20\x5d\x3f\x5f\x11\x4b\xcf\x72\x99\xd5\x15\x4a\x87\x22\x93\xd1\xf2\xba\x3e\x56\x63\xe4\x90\xcb\xf6\x93\x0c\x0f\x96\x14\xd6\x56\xf8\x96\x2a\x1a\xd1\xdd\xeb\x0a\x28\xe0\x75\xd5\x88\xee\x91\x0b\x91\x32\x63\x4b\x30\x3b\x8e\xbb\x19\xb6\x31\x7c\x91\xaa\x02\x7c\x05\x00\x2e\xde\xae\x9c\x4b\x04\x27\x77\x0d\xfc\xa9\x4f\x37\xf4\xa5\x2b\x4d\x11\x48\x7c\x2a\x18\x3a\x6d\x99\x78\xc8\xf6\x93\x2f\xb5\xd3\x40\xb6\x58\x77\x3c\x8a\xcd\x91\x98\xb5\x18\x79\x53\x35\x79\xdd\x32\xbc\x4a\x3c\x41\xa8\xd0\x91\x64\x37\xb6\xeb\xb9\xbb\x7e\xc1\xc0\x9c\x91\x5e\x13\x30\x04\x59\x79\x7a\x99\x2c\x36\x45\x41\x49\xd6\x80\xa9\x4d\x59\xde\x9b\x19\x7f\xdf\x77\x0c\x38\x43\x1f\x75\xfb\x2f\xcc\x67\x3b\xfb\xee\x36\xda\xa1\xe3\xca\xde\x52\x1e\x9b\x5a\x4d\xda\x66\xd1\x17\x6e\x07\x66\xfd\xa8\x88\x79\x19\x6e\x23\x9b\x44\x94\xee\x8b\xf7\xe2\xb9\x67\x72\xce\xf5\xd5\xd1\xab\xb3\x01\x09\xb0\x44\xf2\xd6\xda\xcd\x45\x50\x55\xe5\x00\x8e\xd3\x8d\x20\x73\x8a\xef\xb2\xff\x22\x51\xfe\xe7\xbb\x6a\xd5\x68\x8d\xcc\x80\xc2\x8b\xce\x6b\xc6\xdb\x9f\x1f\xba\xe8\xbb\x6d\x90\x63\x2a\x79\x94\x95\xe6\xe1\x85\xc9\xe7\xf4\x36\x01\xf9\x04\x14\x2c\x0d\xa4\x82\x82\xe4\xc9\x34\xd4\x9b\xcd\x4a\x46\x10\x5a\x02\x6c\x7a\xdb\x6d\xdf\x73\xd2\x74\x6f\x5c\x1b\xa7\x41\x8f\x51\xfc\x03\x4d\x2f\x7d\x78\x64\x3d\x76\x19\xf6\x22\x6f\x77\xf7\x60\xb5\xb2\x39\x0a\x55\x38\x1a\x01\xe9\xcd\xa6\x67\x18\x79\x7b\xe1\x0a\x5e\xae\xe7\x7e\xf1\x5e\xd4\xca\x1f\x32\xe1\x32\x0b\xd4\xe9\xde\xac\x21\x5f\x8d\x78\xac\x8d\x9a\xe7\x2e\x32\x33\xeb\x8f\xf7\x0f\xec\x39\xc8\xa5\x7f\x68\xf6\x1f\xfc\x16\x60\x3d\xc3\xd7\x8e\x45\x9d\x6e\xbf\x96\x14\xc7\x4a\x1a\x73\xf5\x10\xa0\x7c\xfd\xd8\xbd\xcd\xd8\x94\x30\x46\x3f\xe3\x69\xe7\xe9\x5f\x4c\xbf\x13\xa4\xe1\x92\x22\x30\xb2\x0b\x5e\x36\xcd\x65\x99\xf3\xee\x88\xa4\x0f\xd2\xef\x46\x10\x48\x59\xa8\xd5\x06\xbc\xb3\xb2\x99\xfc\x17\x4f\x84\xc2\x8a\x24\x2c\xf4\x35\x76\x91\x34\x58\x81\x08\x4c\x96\x03\x4b\xb4\xab\x24\x6c\x04\xeb\x11\x31\x33\x72\x5f\x60\x6d\x3b\x79\x7c\x41\x65\xbc\xfd\x92\xf3\x3e\xd3\x75\x64\x47\xdd\xed\xad\x49\x80\x97\x99\x6b\xc4\x21\x87\x1c\x69\xfc\xb1\x18\x62\x8a\x23\x0e\x82\x23\xed\xbf\xa0\x75\x68\x0d\xe4\xe2\xf6\x56\x96\x3a\xfc\xd9\xc1\xb2\xc7\xa2\x79\xae\xee\x31\xc5\xa0\x43\x19\x1c\x33\xdb\xed\x16\x57\x26\xb6\x36\x7b\xf9\x42\xc7\xfa\x8c\x3b\x1f\xeb\x83\xc1\xe3\xbe\x40\x5a\x12\xdb\x9a\xe4\x8a\x74\x53\x4d\x34\x15\xb4\xc9\xbe\x30\xac\x5d\x32\x54\x86\x61\xfe\x45\x6e\x45\x73\x63\x69\x74\x0f\xa5\xc4\x04\x28\x24\xee\x34\x88\x3c\xe2\x63\xf0\x95\x31\xa2\x73\x75\x46\x37\xbd\x47\x9b\x58\x52\x65\xf4\x7e\x01\x35\x1c\x24\x6c\xc6\xec\x61\x83\x1f\x15\x53\xb2\x07\x4c\x3c\x06\x04\xcf\x08\x02\x5f\x29\xca\xf3\xae\x49\x56\xb7\xee\xb4\x76\xa8\xbb\x5f\xf4\x54\x58\xd5\x5a\x67\x4a\x31\x89\xf1\x06\xe7\xae\x1d\xe2\x6a\x29\xab\x84\x3c\xa2\xf6\x19\xfd\x63\x24\x1a\xd8\xd7\xf3\x2c\x7c\x8b\xfb\x02\x82\x2a\x53\x11\x79\x04\x5e\x78\x69\xc4\xf8\x29\x65\x67\x23\xa1\xa1\xbb\xe1\xfe\xf6\x61\x83\x34\x53\x54\x76\xa5\xf5\x6b\x5a\x19\xe0\xcf\xb5\xb4\xfc\x4f\xff\x86\xfa\x85\xff\xd7\x5f\xf8\x9b\xff\xc1\xff\xf9\x6f\xfe\xb5\xff\xed\xaf\x63\x7f\xf2\xef\xfc\xd9\xdf\xfe\x3f\xff\xbd\xff\x10\xfe\x97\x7f\xcd\x4f\xfd\x77\xfe\xc0\xaf\xfd\x2f\xfe\xaa\x3f\xfa\xaf\x7f\x60\x69\xd9\x0a\xa5\xc9\x98\x5d\xb0\x31\x82\xee\xa8\x31\x93\xf8\xa6\x1c\x26\x51\x2d\x66\xbd\xe6\x52\xf2\x55\x4d\xba\x0c\x48\x85\x96\x7f\x22\x45\xee\xfb\x35\xb8\x9c\x76\x19\x86\x78\xbc\x8b\x2a\x6e\x82\x28\xb3\xaf\x8d\xc3\xea\x40\x0e\x15\xaa\x32\xd0\xa6\x97\x6e\xc3\x26\xfb\x44\x8a\xac\x8c\x07\x32\x75\x60\x48\x98\x82\x8b\x4e\x02\x9f\x3c\x48\x06\x48\xdf\x50\xf9\xbe\x12\x77\x31\x4c\x87\x3b\x7c\x9f\x04\xd3\xfa\x44\xf8\x6a\x27\xed\xb3\x38\xff\xe0\xa3\xd0\xac\x2c\x20\x1d\x4a\x7d\x55\x07\x61\xdf\x34\x30\x57\x48\x4b\xc8\xee\x00\x3d\x16\x78\x5e\xfa\x85\xa5\x85\xed\xd4\x09\x46\x45\x0e\x5f\x51\xbb\xb1\x74\xf0\xf4\x1f\x46\x8f\x49\x25\xe8\x48\xf9\x6b\xd8\x04\x08\x20\x40\xf8\x28\x84\x15\x01\xbf\x68\x7f\xb8\xb5\x10\x51\x80\x6c\x5f\xde\x4e\x9d\xfb\x7d\xf2\xd3\xbd\x8a\xa1\x46\xbf\x35\x7d\xb0\x35\xb0\x64\x9f\x12\xd9\xa1\x5c\x8d\xef\x17\xaa\x06\xed\xfb\x01\x47\x91\x3c\x02\xe3\xce\x94\x35\x27\x13\x38\x76\x9f\xda\x53\x8d\x76\x61\x50\x21\x74\xdf\x29\xd3\xca\xec\x91\xa6\x7d\xa1\x76\x81\x48\xa3\xc3\x89\xe5\xa7\x27\xde\x39\x68\x54\x54\xdd\xb7\xbe\x5d\xf2\x31\x7b\x57\x42\x25\x75\x95\x38\xe2\x12\x80\x2f\x43\x5f\xf0\xc6\x94\x25\x4f\xe0\xb6\x20\x82\x0a\x53\x27\x4b\x4c\x71\x66\x3f\x91\xe8\x52\x4e\x0b\xd9\x59\xb4\x32\x55\x6e\x0f\x91\x66\xf4\x43\x7c\x91\x67\xc2\x96\xb6\xa3\x34\x2b\x51\x9f\x06\x11\x73\x66\xea\xcb\x22\x06\x8f\x8c\xcb\x09\xca\xf1\xf4\xec\x9c\xd7\x9e\x1e\xdb\x93\x76\x74\x5f\xe0\xfd\xec\xd2\xd1\x36\xc6\x03\x8a\x97\x78\x68\x98\xb8\x7c\x17\x59\x16\x02\x90\xea\x4e\xb4\xf7\xd8\xec\x07\x5e\xd8\xef\x22\x4c\x6f\x6a\xbf\x80\xe3\xd8\xc8\x08\x13\xdc\xf4\x30\x66\x2b\x25\x7a\x47\x28\x86\x37\xbd\x7d\x25\x97\xa2\x6f\xb9\xc8\x6d\x55\x97\x4f\x74\xb1\x71\xbb\xce\x17\x6b\xd4\x13\x74\xf6\xf4\x29\x12\x26\x36\xf1\x2d\x55\xa4\xea\xa0\xc4\x7d\x48\xdc\xb5\xc9\x8b\xde\xa1\xb6\x0f\xfd\xd9\x08\x4e\x5b\xa8\xfb\x42\x5b\xb1\x32\xd7\x13\x79\x7e\x5a\x8d\xef\xb8\xb0\xac\x17\xdc\x82\xa3\x54\xf8\x25\x2b\x9a\x5b\xac\x63\xcd\xad\x4a\xaa\x10\xad\x00\xfa\x89\x14\x39\x4a\x7e\x07\xb8\xaf\xa6\xc5\xe2\x41\x97\xc2\x38\xf4\x6e\x5e\xf1\xe8\x34\xd4\x0f\x8f\x49\xf4\x94\x6c\x6d\x25\xc5\x44\x54\xd6\xe2\x8b\x3e\x42\x3b\x8d\xcf\x42\xb2\x9f\x7d\x39\x11\x8a\x07\x33\xa6\x51\x7c\x43\xad\xf9\x5d\xe2\xbe\xad\xbc\x7a\x0b\xbb\x52\xef\xaf\x41\xf3\x7e\xd1\x47\x18\xde\x1c\x2a\x69\x38\xd2\xb6\x65\xf7\x14\x16\xe6\x4e\xd4\x2b\xae\x57\x79\x77\x8e\x2f\x17\x96\x72\x7a\x75\x68\xab\xa7\x89\xed\x17\xe3\x32\xbe\x69\x08\xcb\x48\xf6\x31\xb4\x3d\xa6\x83\xa5\x41\xae\xe1\xa0\x76\x5d\x3a\xe3\x95\x1d\x19\xec\x5d\xc1\x81\x23\x24\xf6\xf1\x5f\x80\xc5\x45\x07\xbc\x26\x47\x83\x80\x5b\x84\xa9\xf3\x3a\xcb\x9e\xd5\x7a\xec\xa9\xb1\x50\xa1\x3f\xd8\xac\x67\xec\x03\x49\x58\xa9\x03\xf0\x45\x2e\xd6\xab\xe9\x4e\xc4\xd0\x58\x46\x72\xbb\xdf\xb8\xe9\x21\xcc\xa9\x93\x52\x62\x75\xad\x02\xd9\xc2\x43\xd1\xbd\xb2\x8c\x7c\x35\xfa\x89\x81\xc2\x10\xdc\xec\xde\xdb\xfb\xc1\x62\x11\x95\xad\xc3\x09\xb7\x66\x75\xf9\x30\x67\xdf\xc5\xa6\xb1\x59\xe5\xf3\x5a\xe1\x49\xb0\xbc\x7e\x91\x73\x93\x29\x8e\xa4\x4e\x25\x6e\x37\x63\xe3\x50\xf8\x50\x57\x1e\x31\xa7\x1e\x1a\x79\xc8\x73\xf5\x0f\xbf\x42\xeb\x0c\x6a\xe3\x58\x86\x2f\x80\xf3\x72\x44\x4e\xde\xa3\x7a\xcd\x9b\x8d\xa6\xfd\x6a\xe3\xdb\x00\x3a\x2b\xf3\x94\x7c\xd0\x6b\x84\xe0\x3e\xce\xf0\x1c\xa9\xe8\xc3\xea\x17\x53\x8e\x0a\x7d\x21\x0c\xbc\xe6\xf9\x72\xca\xd6\xb4\x2c\xed\xf3\xee\x8a\x8e\x55\xe1\xde\x91\x1e\x71\xa6\x66\x21\xb7\x61\x00\xbf\x8e\x7f\x61\x1f\x76\xc3\x1b\xf9\x56\x20\xde\xee\x1a\xcc\xa1\x44\x3f\x98\x6a\xbb\xb5\x99\x4d\x92\xd3\x72\x8f\x97\xa2\xcb\xb0\xa3\xa6\x09\x8f\xff\x24\x9f\x40\x5d\x3d\x0b\x5b\xd0\x6c\xda\x19\x4c\xec\x81\x47\xd5\x3c\x53\x05\x28\xd6\x6d\x81\xee\x60\xbc\x7e\x52\xa2\x8c\xb0\xc6\x47\x47\xbf\xf8\x52\xa9\x5f\x51\x58\xeb\x5f\xfd\x54\xd7\xe0\xd3\x14\xa4\x18\xc9\xc7\x0d\x1e\x07\x79\xe9\x5c\xa4\x6d\x2c\xb1\x01\xf7\x09\x23\x87\xf3\x49\x16\x14\x61\x1c\x57\xd8\x5e\x00\x00\x47\xd9\x24\x74\x7a\xe9\x05\x94\x96\x45\x1a\x62\x35\xad\x44\x45\x9d\xf9\x9a\x5e\x6b\xd4\x71\xe7\x0b\x08\x8a\x9d\xce\x15\x29\xc6\xbc\x95\xb4\xb5\x7b\x50\x64\x3e\x3c\x06\x11\x8e\xd9\xcf\x3b\x54\xff\x61\x04\x0f\x0d\xf4\xa2\x90\x8a\x92\x23\xf1\x05\x19\xfd\x46\x66\x39\x1e\x3d\x13\xbe\xd8\x80\xe6\xac\x42\xab\x2a\xc3\x4e\x24\xdf\x9c\x5c\xa0\xd6\x9c\x69\x45\xba\x28\x6b\xfe\xec\x08\xbe\xd8\x96\xab\xde\x73\x91\x8e\x50\xb3\xef\x30\x08\x67\x54\x2a\xb6\x5e\x92\xc3\x2b\x8c\xc6\xb6\x97\x65\xb8\x48\xe6\xed\x4a\xed\x87\x58\xf5\x03\x5a\x87\x39\x47\xea\xf2\x30\x1a\xb4\xa8\xcf\xb4\xa6\x0c\x04\x55\x5e\x69\xca\xed\x3e\x5c\xcf\x77\x57\x50\x12\xa3\x7b\x70\xa6\x05\xbc\xbc\xfe\x1c\xc0\xe3\xa7\x7f\xc1\xaf\xf8\xd5\xbf\xfb\x57\xfe\x1f\x7f\xdd\x6f\xf9\x5d\x7f\xf8\x1f\xfe\xed\xdf\xfe\x33\xff\xe1\x1f\xfd\xa9\xbf\xf0\x97\xfe\xd2\xff\xf7\x77\xfc\xb1\xff\xe4\x4f\xff\xe5\xff\xe8\xdf\xf9\xbd\xff\xab\xdf\xf0\x81\xc2\x63\x8d\x03\xcd\x30\xd7\x9a\x63\x0c\x0c\xe0\x89\x6a\xc8\x10\xbd\xd3\xaa\xa3\x5c\x5c\xed\x67\xaa\x69\x8c\x3a\xf4\x3d\x11\x06\xf8\x85\x27\x9f\x11\xb4\x81\x51\x0b\xf3\xb6\x35\x51\xe2\x69\x15\x17\x2f\x3d\xa0\x4f\xb6\x8d\x29\xfb\x8e\xb0\x59\x4e\xfa\x96\xe4\x10\xab\x38\x7c\xb2\xd8\x92\xa3\x9c\x04\x61\x2c\x1e\x4f\x26\x9d\x96\xf3\x5e\xb6\x04\xa8\xe2\x39\x4a\x76\xbc\x8e\x84\x53\x0e\x8d\x95\xcc\x00\x67\xef\x3e\x49\x94\x4f\xe4\xe1\x82\x16\x4e\x05\x5e\x7e\x93\x3c\x3c\x95\x86\x17\x98\x64\x9a\x99\x61\x71\x91\x3e\x03\x53\xab\x3c\x70\x71\xf5\x7a\x3e\x41\x54\x3b\x50\x3b\xe5\x35\x9c\xda\xd1\xc0\x3d\xe9\x0c\x55\x77\xc7\x31\xca\xe3\x31\xa0\x5e\x76\xf8\xd4\x0f\x83\xb0\xdb\x06\x10\xdd\xfe\x0b\xff\xa0\x78\xe4\x83\x1e\x40\x10\x55\xf9\xfa\x11\xb3\x94\x2b\xb4\xe2\x55\xe0\x5a\x2e\x36\x5f\xb2\x91\x9a\xf7\x39\x47\xe9\x88\x95\x10\xf7\x0b\xb1\x27\x7f\x84\x9c\xa6\x09\xfa\x5a\x8a\xb8\x54\x77\x99\x4d\x1e\x99\x7b\x02\x19\xb3\xb2\x07\xf7\xdd\x52\x26\x8f\x85\x95\x8a\xd7\x5a\xf8\x05\x87\x2e\x96\xa6\x7d\xc4\x5d\x02\xce\xbd\xab\xe6\xe3\xb6\xec\xd6\x59\x46\xea\x0f\xd7\x0b\xfb\x77\x0c\x66\x75\xaa\x6c\x38\xd0\xeb\x05\x1f\x3c\x11\x76\x68\x99\xab\x00\xdc\xf8\x1a\xf8\xe9\x84\x3c\x19\x27\x64\xcb\x11\x7e\xf9\x87\xda\xb8\xec\x51\x5e\xe6\x9e\x33\x7f\xb9\x59\x05\x7e\xc1\x3a\xc0\x79\xb3\xd3\x04\xbc\x44\xf7\xc1\x0a\x14\x3d\x3f\x7d\x9a\x66\x6c\x4b\x3b\x6f\x3c\x5f\x6b\x9c\x8b\x14\xdd\xdb\xde\xfa\x9a\x70\x3f\x59\x1d\x76\x2f\x4e\x02\x8b\x1e\x19\xc8\xbc\xc4\x1b\xfb\xbc\x3d\x13\x80\xa5\x7f\x47\x96\xa9\xa4\x57\x50\xbc\x22\x17\x4f\x7c\x35\x19\xfc\x0b\xbc\xbf\xe3\xee\x6b\xe6\x30\x30\x52\xda\x5c\x7a\x82\x11\x8d\x6f\x5a\x74\xf8\x3e\xd7\x3d\x90\x15\x68\x41\x7e\x0e\x39\xb2\x0b\xaa\x8b\xf8\x82\xa5\xec\x55\x18\xcd\xaf\x80\xd2\x50\x1a\x05\xbf\x0b\xec\x15\xc5\x3c\x17\x6b\x1a\x62\x7a\xdf\x4c\x59\x14\x10\xa2\x41\x19\xad\xf6\x61\x5f\x48\xd4\x85\x27\xce\x8f\x33\x0c\x06\x2f\x2d\x8f\x45\x3e\x5c\xbc\x4f\x1f\x17\x0e\x12\x59\xf3\xdb\xdf\x13\xba\x09\xb6\xc8\x87\x50\x02\xbe\x88\x4e\x65\x98\x19\xf9\xb2\x8e\xb0\x63\x39\xe8\xc6\xde\xbc\x0d\x22\x59\x98\xd9\x67\x0d\x42\x35\x6f\xe1\x53\x65\x38\xe4\xb5\x79\x5d\x33\xeb\x17\x23\xa2\x2c\x30\x8f\x64\x6d\x82\xed\x56\x38\x18\x0f\xd0\x29\x00\xfa\x76\x96\x60\x89\x20\x75\x66\x86\x4d\xd2\x36\x55\x3b\x0f\xd0\x37\x4a\x41\xf1\x32\x2a\x1e\x4e\x99\x50\xc8\xf9\x81\x5e\x79\xf2\x10\x3a\xcc\x34\x98\x26\x75\xed\x13\x6a\xe2\x45\x6f\x69\x6c\xa2\x80\x3d\xfe\x8b\x70\x4a\x34\x0a\x31\x5e\x71\xa6\xaa\xc7\xba\xe9\x59\xa2\x44\x0f\x3b\xd3\x33\x0e\x57\xb6\xf9\xec\x72\x1a\x79\x70\x0f\x4d\x23\x5b\xf7\xf9\x42\x04\xac\x10\x3c\x26\x1f\x29\x65\x3f\xdc\x18\xb4\x22\xe8\x9a\xae\xdc\x06\x56\x9d\x31\x89\xde\x99\x55\x3f\x24\x05\x34\x44\x44\xf1\xe9\x5f\x74\xf6\x38\x3a\x4d\xeb\x67\xef\x28\x86\x56\xb2\xed\x98\xd7\xa8\x63\x09\x6f\xcf\x0f\xf6\x4f\xe8\x8e\xd5\xd2\xd6\x43\x64\xb9\x54\xe0\xf4\xc9\xb8\x7c\x74\xbc\xbe\x6c\xf5\xc3\xc8\xb5\x21\x7a\x18\x9d\x6e\x69\x10\xc6\xd9\x94\x79\x3a\xcb\x9b\xeb\xeb\x8e\x06\x90\xd0\x15\x40\x88\xdf\x40\xd6\x15\x4a\x2b\x87\x75\xf1\x61\xc5\x6e\x90\x16\x7a\x8a\x1b\xa9\xe8\xd3\xdc\x2a\x47\x21\xb2\xe0\x28\x89\x94\xe4\x57\x6b\xe4\x7e\x71\x97\x8f\x25\xe2\xfd\x1c\x11\x85\xfa\xf0\x03\x0b\x67\x96\xb5\x95\x6c\x10\x82\xa3\x99\xa4\x78\x73\xce\x9b\x20\x3f\x5f\xf3\x9c\x65\x5b\xf3\x9f\x64\x78\xec\x8b\x2b\xa3\xdc\x61\x34\xe9\x01\x4b\xbc\xb2\xcb\xba\xf2\x49\x0f\x0e\x49\x24\x0d\xf4\x31\xe0\x79\xa8\x19\x2d\xc5\x58\xca\xf8\x22\x14\x5d\xb8\x9d\x81\x44\xa7\xea\x37\x89\x6c\x5a\xaa\x6f\xbc\x74\x43\x17\x4d\x1b\x34\x41\xfe\x94\x85\xc6\x59\x99\x84\x8e\xab\x1f\xa2\x7e\xf1\x44\xcc\x8a\x8e\x63\xc5\xb6\xcc\xd8\xcc\x04\x48\x38\xd0\xb2\x4c\xeb\xb2\x53\xf1\xdc\xe6\x46\xfb\x5d\x7d\xd7\x1a\x91\xce\x4f\x7d\xfc\x17\x9b\xc0\xb8\xe0\x95\x0c\xb8\x1c\x17\x64\x00\x47\xd8\x9c\x90\x8e\x2c\xf1\x64\x0b\xa3\x10\x42\x1e\x98\x53\x2e\x7d\x1e\xe1\xf7\x65\x41\x7c\x41\x3a\x06\x06\x2f\x9a\x2f\x61\xc9\xba\xf9\xbc\xad\x47\xc4\x72\xa4\xea\x87\x3a\x41\x43\x18\x77\x97\x25\x8e\xb5\x69\x56\x46\x0d\x1e\x0b\x7c\x41\xb4\x8d\x79\xc0\xca\x6b\xd5\x04\x76\x0c\x46\x18\x25\xa5\xb1\x8a\x14\x50\xa9\x3c\xe0\xc5\xbb\x8a\x17\x1c\xb3\xf5\x18\xd1\x43\x53\xe0\x17\xf3\x05\xfa\xa1\x79\x30\xa7\xf5\x88\xdd\x1e\xa2\xab\x77\xed\x24\xa0\x23\xc7\x25\x6d\xef\x09\xc7\xfc\xc8\xcd\x3b\xab\xba\x1b\x5a\xfe\xc5\x49\xef\x9f\x6f\xdd\x3b\xb0\x2a\x12\x59\x9c\xf0\x3a\x54\x6d\x1f\x90\x6c\x89\x28\x37\x42\xf9\xb6\xc6\x2e\x81\xd3\x14\xdb\xd0\x07\x6b\xc5\xfc\x80\xf0\x8b\x6d\x99\xad\xc5\x66\x78\x7c\xc2\xa8\x54\xdb\x87\xb9\x54\x46\x8f\xb0\xc9\x15\xd2\x6d\xf1\xa6\x55\x28\xce\xde\x96\x7e\xf8\x5b\xb1\x53\xd0\x9f\x03\x78\xfc\x5b\xfe\x72\xfd\x6f\xff\x9b\xff\x1f\xbf\xe2\xf7\xfd\x91\xdf\xf4\x0b\x7e\xcf\x8f\xfd\xd3\xf4\x3b\xff\xab\xff\xbd\xff\xdc\xbf\xfe\x23\x82\xff\x1e\xf1\x8f\x7e\xfa\xef\xfd\xef\xff\x4d\x7f\xed\xff\xfd\x01\xe0\x31\x96\x81\xfc\x58\xca\xf8\x11\x6f\xc7\x37\x55\x2c\xde\xdb\xab\xf1\x4e\x72\x51\x57\xf0\x7b\xe0\x95\x28\xbc\x2f\x2f\x61\x99\xd3\xbe\x40\x54\x4f\x30\xdc\x73\x9d\xad\x22\x48\x94\x1c\xcf\xd4\xe5\x41\xe4\x9c\x25\xc7\xc6\x92\xde\xe7\x88\x61\xfb\x2d\xa3\xe4\xa7\x72\xd9\x3e\xf9\x2f\x54\x9d\x2f\xd2\x7b\x84\x1d\x5f\xf5\x22\x42\x82\xcb\x0b\x5d\xfc\x4a\x93\xc9\x80\x1b\xcc\x81\xd5\x25\x63\xde\xb7\x44\x27\x41\x02\x5f\x14\x5b\x01\xdc\x28\x7c\xa3\x41\x30\xd3\x6e\x5b\x85\xf2\xc6\x69\xaf\x2a\x6b\x2c\x6c\xc4\xd5\x87\x0b\xa4\x4a\x05\x14\x8c\xf6\xd1\xe2\x8b\x74\x7d\x4a\x1f\x26\x22\xe6\xa9\xbf\x86\x75\xb5\xe4\xba\x74\xa6\xc7\x28\xa8\x4a\xcd\x4f\x67\xef\xed\xa4\x90\x89\xa1\x31\xaa\xe9\x26\x5a\xfd\xc2\xe9\xfb\x0e\x40\xdb\x73\xc9\x05\x2f\x3e\xf4\xf6\xa8\xd2\x5b\x5a\xbc\x83\xfb\x59\x10\xb2\x55\xf0\x61\xcd\xe3\xd7\xc1\x8e\x24\xcc\x55\xff\xe2\xd3\xf6\x76\x14\x89\xd9\xed\x87\x4a\x75\x3d\x11\xeb\x25\xf3\x11\x17\x2b\xbe\x1b\xf7\x17\x36\x93\xe7\x1b\xb9\x4f\x6b\x6e\xcc\x1d\xfa\x04\xef\x57\x42\xef\x04\xf6\x03\xd0\x71\x73\x66\xfc\xee\x35\xbd\x08\x70\x1b\xda\x6d\xd7\x44\x12\x64\x8e\x9b\x38\x3a\x0d\xba\xdb\x15\x83\x2f\x52\xd4\x2f\xd3\x22\x9e\x90\x86\x94\x18\x74\xbb\xa5\x69\x48\x6b\xac\xca\x83\x1f\xd4\x70\xe9\xef\x14\x6e\x2a\xc5\xdc\xdc\x1e\x8d\xe6\x3f\xf1\x0f\xd2\x00\x28\x29\xee\x55\x4e\x2b\x5c\x43\x0d\xbd\xd8\xdc\x90\x42\x82\x60\xba\x6d\x97\xc0\xbb\xc7\xbd\x95\xf2\xa8\x2c\x65\xfa\x7e\x72\x81\x62\xa2\x01\x8a\x04\x75\xca\x78\xa4\xa8\x77\x59\xf7\x22\x72\x63\x97\xd1\x2c\xd2\x72\x59\x3c\x05\xcc\x9f\xa4\x1c\xe2\x0f\x17\x52\x7c\xc1\x89\x11\x95\xef\xa1\xef\x61\x90\xfb\x04\xbb\xf7\x1a\xe9\xf5\x98\xfe\x92\x1c\x2a\x7e\x46\x56\x93\xa2\x32\x2b\x7a\x5f\x06\xbc\x9b\xc2\x7f\xb1\xe4\x8b\x06\x1d\x96\xb5\x44\x31\x66\x76\xb1\xe6\xea\x25\x80\x4a\xfb\x0c\xa7\x0d\x33\x58\xe1\xd8\x25\x3d\xd4\x68\x3b\x1c\xfc\xd9\xec\x8b\xe1\xcc\x75\x24\xc2\x63\x38\x06\x23\xe3\x8a\x7b\x49\x05\xae\x72\x9f\x47\xfb\x21\x13\x6a\xf9\x54\x43\xba\x1b\xb6\xdc\xa7\x1c\xe1\xc3\xf9\x40\x73\xc3\x9e\x59\x57\x64\x44\x65\xb9\x4b\xe7\x49\x1a\xbe\x52\x06\x85\x21\x17\xfb\x83\xd0\xe3\x9c\x52\x94\x4e\xbd\x00\x49\xf2\xd8\x02\xf9\x07\xb9\xf6\xcc\x16\xd3\x1d\x78\x17\xd5\x65\x88\xa0\x96\x22\x11\x15\x5d\xb9\xc2\x75\xbc\x77\x41\x76\x14\xac\xcf\x23\x2d\x1f\x28\x1f\x34\xc4\x17\x39\x37\xec\x66\x0f\xbc\xd1\xf1\x11\x6a\x3f\xb9\x95\x32\x4a\x62\x33\x40\x2a\xed\x34\xb1\x6a\xa7\x7a\xec\xf4\xd1\x98\x70\xb9\x5d\xc0\xfb\x8b\x50\x74\xda\xe0\x2b\x3c\xa2\xa9\x6a\x23\xf7\xa1\xc9\x3d\x61\x95\xa7\xbe\x6d\x08\x95\x80\x94\xbb\x01\x3b\xd2\x1b\x89\x40\x57\x27\x4c\xd7\x27\x0e\xf0\x59\xed\x38\x21\xb6\xe7\x91\x9d\x89\x0a\xd3\x73\x19\xd6\x16\x40\x14\xd1\xe2\xf7\xa8\xb4\x6a\x6f\x05\x38\x41\x0e\x0d\x02\x3b\xff\xc5\x4a\x99\x1f\x9d\xae\xa9\x5b\xed\x53\x63\xdc\x36\x26\xad\x35\x0c\x8f\xa5\x12\xf6\xf5\x88\xc4\x28\x68\x62\xbd\x08\xd4\xc3\xb0\x58\xf7\x8b\x8b\x78\xb4\x5f\x73\xc2\x98\x56\xf6\x7a\x7b\x17\x76\xa6\xe2\x41\x98\x85\x9d\xe7\xa4\x45\xd0\x7c\x2e\x2d\xa0\x0b\xc3\xe2\x5b\x18\xd1\xab\x7d\x71\x99\x24\xb0\x19\xf0\x60\x8b\xe4\xc4\x9c\xf1\xf4\xe8\xf3\xe4\x1d\x93\x6e\x64\xe3\x38\x10\x8f\x52\x89\xea\x9f\x86\x1b\x03\xe8\x49\xa9\x7f\x61\xdc\x65\x9c\x25\xfd\x3e\x79\x05\xe1\x28\xab\x99\xa2\xf0\xc0\xe6\x94\x24\x2c\x8f\xc2\xb3\x4e\x90\x9a\x0b\x32\x97\xcf\xa2\xb0\x30\x25\x3e\x81\x1a\xd0\x33\x07\x32\xe0\x42\x8e\x80\x97\x58\xc9\xca\x2e\x8d\x82\xf5\x50\x4c\x51\xaf\xf2\x86\xa6\x5e\xc7\x7e\x16\xcd\x98\x96\x15\xbe\xa0\x75\x4c\x96\x47\x26\x33\x19\xc8\xbb\x37\x59\xa0\x1f\xaf\x71\x3c\x4c\xb4\x1a\x2b\xf1\x09\xf5\x58\x43\xcb\x1d\xe7\x75\x41\xa6\xc6\x3e\x39\x57\xdc\x97\x83\x14\x50\xc1\xd2\x0a\x27\xf5\x45\x3a\x39\xb6\xc8\x7c\xaf\x15\x17\x76\x2d\x15\xf4\x33\xe2\x33\x68\x83\xd3\xbc\xcf\xbe\x5f\x4c\xbf\x3c\xd9\xb6\xd8\xa2\x5a\xc7\xa2\x3d\x4e\x65\x98\x96\x28\x83\xe0\x1d\xb0\xd9\x96\x80\x5d\xb5\xec\x65\x70\xf3\xad\x5d\x2a\xa7\xf8\x62\xca\x59\x88\xce\x18\x71\xb2\xa0\x60\x77\x2d\x4e\x53\xa2\x97\x67\xef\x00\x07\xa9\xd3\xbe\x65\x69\xd9\xda\x1c\x0f\xb5\x53\x61\xd3\xec\x17\xf5\x42\x44\xea\xbc\xee\x9d\x27\x94\xb0\x00\x5a\xb8\x31\x6e\x91\x0c\xdc\x7b\xd5\x0b\x31\x21\xeb\xd4\x53\x71\xa8\xe9\xbd\x92\xb5\xf7\x7c\x71\x2b\xe6\xa9\xa1\x79\x78\x98\x87\xc1\xc8\x77\x1c\x1c\x54\x2d\x43\x50\x4e\x0c\x4c\x87\xe6\x8c\x90\x1f\x36\xb4\xdb\x70\xe8\x10\xe8\xdd\xbe\xd0\x6e\xb2\x46\x3d\x13\x42\x54\x29\x5f\x0e\x1f\x01\xbd\x49\x79\x4c\x95\xfc\x15\x97\x6a\x76\x38\x7e\x92\xc3\xd2\xa7\x78\x98\x29\xae\x7d\x71\x2b\x86\x81\xc3\x68\xe1\x81\xd0\x84\x84\xd2\x55\xe9\x36\x5b\xe7\xbe\x38\x46\xa0\x78\xef\x8b\x81\x36\x4f\xee\x8d\xcb\xd2\x98\x24\xcf\x75\xea\xe7\x00\x1e\xff\x87\xff\xc6\x3f\x09\xbf\xe3\x97\xfc\xb7\x5e\xfa\xab\xdb\xff\xad\xfe\xb9\x3f\xf4\x6f\xff\x45\x3f\xf9\x3f\xfe\xc9\x5f\xf1\x53\xbf\xe1\x57\xfd\xc6\x1f\x81\xff\xcb\xdf\xf2\x87\xfe\x6d\x3f\xfd\x01\xe0\xd1\xaa\x08\x9c\x02\x34\xec\xee\x3d\x21\x65\x1f\xd9\xc1\xd4\x0d\x1b\xa5\x13\xad\x15\x73\x15\x59\xf5\x28\x08\x45\x74\x05\x7b\x7c\xe2\x07\x1a\x9c\xc3\x53\x59\x9b\x0f\x7a\xb6\x37\x3c\xcc\x7b\x87\x13\xf0\x91\x74\xd1\x26\xb0\x71\xfc\x4e\x65\xb9\xd7\x07\x22\x6d\x4c\xfc\x42\x4e\xc7\x62\xf7\x2a\x39\x5d\xd4\xed\xdd\xc5\x88\x56\xed\xe8\x94\x8c\x55\x07\xd4\xc8\x93\xa1\x4e\x3c\x70\xac\x29\xee\x68\xcf\x6d\xa2\xfb\x62\x99\xb3\x95\xbb\xea\x7b\xa4\xa2\x10\xa6\x1f\x9e\x25\x14\x39\x34\xcd\x64\x79\x52\x1a\x86\x30\x54\xb4\x74\xb6\x10\x2a\xc7\x8e\x35\xb9\x4f\x38\x31\xa7\x84\xad\x00\x8a\x03\x2e\x92\xda\x29\x8b\x0a\x0a\x9b\x46\xd5\x94\x03\x60\x26\xe5\xb0\xc6\xbe\x51\x10\x89\x33\x87\x0e\xfb\x49\x12\x70\x65\x58\x74\x3f\x36\x20\x81\x13\x05\x0f\x61\x1d\x52\xa7\xc1\x9b\x7b\xe8\x32\x5b\x9d\x78\xc3\xec\x99\xbe\x5e\x4d\xf5\x28\xe1\x1b\x37\x7c\x85\xda\xc7\xe4\xbc\x2b\xea\x74\x7a\x48\x58\x61\xb1\x96\x1a\xb9\x8f\xb4\x8f\x38\x85\x1d\x44\x53\xa1\xd5\x6c\x4f\x41\xfd\xe4\xa8\xa1\x7f\x2c\xc4\x0f\xab\xf1\x90\xa6\x77\xbd\x37\xb6\x97\x06\xb1\x35\xb3\x8f\xa0\x79\xa4\xd9\x68\x05\xfb\x89\x12\xbe\xa2\x4f\xbb\xdc\x17\xfc\x60\xe9\xe0\xed\xf1\xad\x72\x6e\x7c\xa6\xb8\x59\x31\x75\xfd\x1c\xb8\x94\xdb\xca\x7d\xf6\x02\x53\x5d\xe2\x63\x8c\x89\x08\x78\x8e\xf8\x44\xe1\x01\x27\x0a\xba\x39\xde\x16\x28\xa0\x5a\x87\xcc\x94\xfe\x3d\xe0\x30\xb4\x29\xe1\x9d\x16\xf2\x72\x58\xe0\xde\x7d\x8e\xc2\xf9\x17\x91\xba\x6c\x2a\xf7\x9c\x36\xae\x40\xdc\x01\xe6\x68\xd2\x47\x8c\x73\xa2\xf4\x87\x9e\x3c\x5d\x71\x0f\x6c\xb0\xdd\xb2\x7b\xe5\xb7\x06\x36\xbe\xe0\x3e\xc2\x4b\x81\xdd\x82\x9d\x95\xfb\x4d\xc9\x08\x23\x0e\xc6\xb9\x3b\x9e\x5d\x15\x3c\xa9\x17\xe5\xc4\xaf\x8d\x0b\x92\xc4\xc3\xc8\xed\x0b\x1b\x87\x7e\x5d\x7f\xec\x59\x0f\x36\x1b\xb3\x37\x48\x13\x7a\x69\xd2\xa8\xb7\xcd\x04\xcb\x15\xa8\x81\x79\xed\x70\xea\xa4\xcd\xb6\x22\xe7\x0b\xd7\xb3\x9f\x2f\x7b\x44\x70\xa0\xa3\x6b\x05\x31\x1c\x36\x50\x8a\x7c\xc6\x8e\x94\x50\xbd\x9f\x07\x4a\xfe\x66\xa1\x9b\xb7\x22\xbb\xc3\xbf\xd1\x13\x98\xf6\xd0\x15\xa8\x13\xb8\xa4\x0c\x6f\xbb\x4b\x5f\x1d\x1f\x4d\xdc\xe3\x15\x14\xc5\x49\x21\xe4\x38\x5d\x17\x9a\x12\x47\xfd\x8b\xa3\x86\x8c\x14\x9f\x1e\x2b\xca\x35\x21\x68\xe7\x06\x03\xf5\x9d\x9b\xc5\x6d\x79\x1b\xb3\x09\xa8\x2f\x7b\xd7\xe6\x3d\xf4\xe8\x9d\x87\xaa\x7d\x72\x4f\xc9\x78\xd6\x7c\x19\x9c\xd4\x6b\x16\xa7\x87\xa7\xde\x21\x00\x4a\x83\x81\x72\x2d\x8c\xbd\x9c\x86\x8d\xbc\xa5\xaa\x8c\x24\xeb\x17\x5a\x2c\x4a\xcd\x34\x0c\x71\xd9\x61\x95\x91\xd1\x56\xfd\x3a\x0b\x86\x9d\x39\x26\x4e\x64\xf0\x50\x12\x03\x92\x77\x5e\x89\x75\xab\x6f\xfd\x64\x99\xd3\xf7\x75\xcb\xde\x56\xdd\x1e\x49\x6e\xae\xc3\xbb\x2f\x95\x99\x3a\x2f\xc4\x88\xac\x76\xcf\xb1\x36\x6d\xea\x37\x0f\x46\xd1\xfc\x22\x79\x88\xc2\x59\xe3\xc9\xb7\xea\xe7\x4d\xa2\x44\xc9\x7d\xb6\x83\x95\xca\x90\x10\x1d\xb3\xa9\xb0\x54\x20\xa4\x11\x2f\x8e\x80\xe6\x6b\xbe\x50\x90\xb2\xc1\x1b\xb4\x50\xc3\x87\x51\x06\xb1\x6b\xe0\x84\xbc\xe6\x9b\xc1\xb6\xaf\xd3\x80\xa5\xa3\x39\x26\x2c\xd3\x94\x99\x29\x25\x65\xf0\x05\x34\xa9\x21\xba\x42\xaa\x4b\xf9\xbb\x84\x75\x2c\xe4\x52\xde\x8b\x82\x2c\xf5\x3e\xfc\x6c\x69\x3d\xae\x1a\x97\xd7\x8b\x97\x4a\x45\xe4\x27\x66\xd5\x4c\x8f\x31\xbd\x26\x6e\x27\x5a\xb0\xa9\xf0\xe0\x76\xf8\x1e\xe4\xa1\xbe\x03\x74\xe5\xda\xda\xc6\x00\x83\xcb\x19\x49\x5d\xbb\xfd\xe2\xed\x2c\xf4\x4d\x01\x5e\x5f\x1d\xb0\x45\x73\x9f\xf0\xd9\xe4\x79\x7b\x22\x4f\x65\xe3\x10\xf2\x38\x23\xcf\x76\x21\x93\xce\x2e\x7c\xc1\x17\x77\x73\x98\x08\x78\x51\xe1\x2e\xeb\x31\x61\xaf\x62\xf3\x40\xc9\xfb\x5c\xcf\xdc\xbb\x6c\x7d\x5f\xcb\x1c\x7b\x80\x30\x07\x70\x93\xe4\x3b\x3e\x79\x3b\x77\x76\x15\xdf\x0c\xd8\xd2\xd6\xe3\xa2\xd6\x84\xbc\xc5\xa4\xaa\xea\x98\x06\x4f\x97\x52\xa4\xd3\x1a\x02\x3d\x5b\xaa\xe6\x20\xfd\x02\xb2\x1e\x71\x58\xb6\x18\x7d\xa6\x52\x49\x85\x67\x49\xa7\xf6\x40\xec\x21\x8a\x6f\xa7\x9f\xc3\x97\xf6\xc6\xba\x47\x55\xb8\x8f\x6b\xb5\x7f\x31\xfd\x8e\xfd\xda\xf4\xd8\x11\xb0\xdf\xd2\x5e\x82\x9e\xac\xc2\xa5\xa2\x8c\xc2\x95\x54\x51\xc1\xd4\x09\x83\x5d\xb6\xcd\xe0\x40\xdc\xd2\x2f\x8c\xbb\xb9\x06\x17\x33\xe6\x5e\x16\x42\xd2\x1b\xf7\x29\x69\x22\x4b\x4c\x2e\x53\x41\x76\x70\xf7\xb7\xd0\x23\x56\x8c\x19\x03\x3f\x9d\xfd\xe2\x89\xc8\x13\x58\x60\xe7\x0a\x28\xd7\x5d\x4d\x30\x10\x34\x34\x62\xc1\x47\x16\x9c\x1a\x93\xe7\x15\x95\xd9\x2a\x19\x4c\xb2\x1e\x9e\xc5\x17\xf3\x05\xd5\x8a\xa9\xf7\x3e\xdd\x4d\x88\x01\xc0\xc1\x8d\xbe\xba\x54\xbb\xd1\x62\x19\x96\xf6\x4a\xc5\x0a\xa3\x31\x0d\x4a\xdf\x16\x57\xfd\x62\x4f\x9d\xa6\xc3\x94\x5e\x4a\x6b\x7b\x07\x86\x40\xba\xc5\x5b\x85\x5c\x51\xb7\x78\xe5\x98\xc7\x72\xb4\x09\xb5\xde\xfd\x78\x2a\xad\xf4\xe4\xe7\x00\x1e\xe7\x7f\xf2\x23\xbf\xe8\x47\xff\xb5\xdf\x88\xff\xbd\x7f\xfc\xcf\xff\xe8\x3f\x52\xff\x8e\x7f\xf0\x5f\xff\x47\xff\x81\xff\xc2\x4f\xfe\xa6\x5f\xfe\xff\xfa\x9f\xfd\xb3\xdf\xfa\x77\xff\x33\x3f\xf6\xbb\xfe\x9b\x1f\x00\x1e\x75\x86\x97\x43\xd1\x62\x58\xbe\xaa\x34\x42\x95\xbc\x54\x21\x36\xe5\xd9\xd1\xe4\xd4\x32\xf8\x06\xc8\xed\x36\xd5\x1c\xd3\xa5\xfb\x62\x5c\xf6\xdc\x19\x9a\xbc\x91\x6a\x1e\x34\x58\xaf\x4f\x2c\xc1\x0f\xbf\x23\x08\xc1\x01\xc0\x33\x1d\x17\x84\x06\x6b\xd9\x68\x67\xe1\xda\x17\x07\xdb\x52\xf0\x5d\xf9\xe3\xa8\x23\xa3\x53\xf3\x8c\x67\x35\x64\xa2\x14\xd6\x33\xca\x70\xb4\x97\x37\x28\x48\x88\x90\x5a\x4f\x97\x1d\xfc\x8b\xd3\x47\x5a\xa3\x42\x8b\xf3\x87\x46\x8b\xde\x17\x74\xd2\x87\x01\x04\x28\x1f\x9c\xe3\xfc\x6c\x0f\xc0\xbb\xa3\xd4\xce\x75\x4e\x96\x4e\x9f\x44\xa7\xd2\x5c\xc5\x40\x43\x07\x1b\x19\xdb\xfa\x20\x1e\x21\x80\x4f\x95\x22\x9f\x5d\x46\x78\x75\x60\x2d\x47\x4a\xda\x6b\xe1\x5b\x67\xb3\x5f\x1c\xfe\xc4\x2e\xb3\xba\x50\xb7\x4c\x0b\x96\xd5\x3b\xea\xb9\x11\x63\x5e\x64\x4e\xa9\x3f\xea\xb1\xe1\xb4\x66\xcf\x96\x94\x4b\x3c\xf9\x1c\x5f\x14\x18\x58\x4e\xa4\x1b\x75\x93\xd0\xe3\xa6\x26\x4f\x7c\xd9\x33\x4b\x2f\x2f\x1b\x11\x4d\x25\xf2\x19\xfb\x8d\x35\x41\x3e\x2a\xac\xf0\x8a\x2f\x1c\xe0\xc2\x3e\x4b\x87\xd2\x2a\x4d\x8a\xfa\xc7\x28\x3a\x73\xad\xb0\xb4\x2d\x22\x8f\x0f\xb5\xfa\xc4\x77\xe0\x18\x61\xb6\x6a\xf9\x72\x3e\x51\x78\x00\x16\xb6\xea\xe6\x89\x51\xd1\x2b\x53\xe2\x6d\xa4\x45\x12\x04\x43\x0d\x19\xfc\x3e\xa3\x30\xc3\x07\xd2\xd9\xfb\x17\x89\x47\xdb\x2f\x8a\x2d\xe4\x23\x22\x2e\x02\xa5\x2f\xc8\x23\xd6\x04\xd6\x9d\xe2\x4a\x95\xc0\x76\x84\xaf\xa0\xc9\x56\xeb\x8d\xf2\x68\xfa\xdc\x32\xf1\x27\x01\x6b\x67\xfb\xc7\xe2\xcb\xb6\x57\x80\xb1\x43\x27\x84\xc1\x00\xfc\xce\xf2\xb6\xe7\x2d\x6f\xe4\x48\x5c\xc5\x70\x26\xa9\x78\xd1\x6b\x0f\x5f\x18\xae\xfc\x3c\x8f\x51\x96\x3d\x38\xb9\xe0\x80\x7c\xb9\x6c\xd3\xd5\xe7\x85\x46\x30\x55\x30\x7b\x9e\x94\x02\x17\x3a\xd2\x3b\x8b\x87\xf1\x93\x53\x69\x85\xba\xa9\x4b\x34\xac\xb9\x63\xf2\xa4\x8f\x06\x04\x42\xe8\x10\x77\x13\x71\xcf\x7c\x3e\xb6\x58\x45\x64\xd6\x8f\x0d\xd7\x88\xf3\x85\x81\x82\x04\x50\x24\xd9\x83\xb6\x53\x4b\xd2\x67\x35\x5d\x9f\x4d\x72\x46\xae\x41\x28\xd8\xe5\x95\x94\x45\xa4\x81\x32\xac\x78\xe8\x74\x5f\x78\xf2\x29\x6e\x23\x19\xa7\x34\xc3\x0c\x1e\xc0\xe9\xed\xbe\x8e\x12\x08\x7c\xd9\x2e\xee\x0d\x1a\x76\x3d\xd6\xfb\x4c\x25\xeb\xc3\x64\xae\x5f\x2c\xb6\x26\xd2\x47\xc4\x79\xa1\x96\x67\xcd\xa3\x0c\xb7\x37\x44\x42\xd8\x9b\x33\x4a\x3b\xd2\xee\x86\x30\x35\xe4\x28\x68\x91\x8e\xe1\x2f\x74\x69\x14\xcd\xb1\x18\x03\x76\x09\x7a\xed\x33\xb3\xef\x88\x87\x85\x30\xb4\x11\xb9\x46\xf5\x42\xc9\xbf\xe5\xb4\xfc\x10\x14\x9e\x71\xeb\x17\x36\x0e\x96\x19\x66\x8b\x0d\xc8\x33\x7a\xf5\x80\xad\xbd\x8c\x93\x60\x6d\x8e\x8a\xc3\x08\x9f\x37\xf3\xa4\xca\x24\xec\xbc\xb6\xd8\x57\xb4\x4f\xe2\xff\xd4\x78\xcc\x86\xbe\xe7\x3e\x55\x27\x71\x11\x75\xdd\x84\x64\xd2\xea\xec\x6e\xc5\x8c\x8b\x8c\x27\x95\x30\x57\xe1\x91\x28\x54\xfa\x45\x20\xe3\x10\x2c\x9a\x3e\x83\x46\xa6\xc0\xb6\x30\x19\xf8\x40\x69\x20\xda\xa3\x07\x87\x68\x4b\x67\xa2\x88\x7c\x25\x62\xf7\x70\x58\x0b\x5f\x7c\xa9\x08\x3b\x8a\xb6\xb6\x14\xd3\xf5\xcc\x4b\x6c\x43\x35\x04\xf3\x78\xbe\x62\x78\x45\x41\xe1\xe1\x18\xb8\x49\xa9\xbc\x6a\x2b\x5e\xea\x17\xeb\x35\xe1\x9c\xe2\xd7\x5b\x21\x98\x63\xec\x7d\x1d\x64\xf8\xa0\x47\x09\xe3\x5f\xcb\x87\xca\x01\xb2\x4e\xc4\x2b\xed\xa9\x34\xb7\xe1\xda\x17\x6b\xd4\x12\x06\x4c\x20\x21\x4d\x89\xb8\xae\xe8\xb6\x3e\x79\x87\xa1\x85\xcf\x66\x39\x37\x2f\x5f\x54\xf0\xc0\x17\xa7\x4e\x97\xb4\xf0\x7c\xa1\x6a\xc8\x90\x10\x26\x24\x74\x98\x34\x98\xa4\x98\x2a\xa4\x06\x29\x7b\xde\x6a\x05\x46\xcf\xfb\xb6\x36\x75\x81\x88\xcf\x1e\x4a\x08\xe6\x0b\x43\x37\x5b\x9b\xb3\x03\x08\x91\x27\x1d\xfe\xa0\x9c\x77\x64\xdb\x3a\x72\x18\x9c\xf2\xb5\xd5\x5d\x08\x84\xf7\xf1\xf0\xdc\x59\xd5\x56\xb8\x2f\xb4\x15\x90\x00\xf2\x64\xb6\x68\xa6\x5d\x12\x87\x2e\x7a\x55\x77\x9b\x43\xcc\xb7\xfb\xe1\xad\x64\x24\xb4\x57\xbe\xfb\x1a\x69\xfd\x38\xe9\x13\x5b\x39\x95\x31\x42\x54\x04\xbd\x10\x87\x84\xf6\x24\xa9\x88\xfc\xe8\xae\xec\x73\xf9\x00\x94\x74\x2d\x5a\xcd\xb1\xc3\x2b\x70\x5e\xf7\x8b\x08\x6e\x86\x19\x11\xcc\x42\x22\x53\x3c\xcb\x38\xb2\x44\x41\xe8\x1c\x85\x22\x0b\xc9\x3b\xba\x2a\x14\xb8\x6a\x77\x2b\x13\xf5\xf0\x89\x3e\xa1\x32\xc2\x74\x84\xbd\xe6\xdc\xda\x74\xa7\x6b\x1d\xce\x6d\x12\xb9\x84\xbd\x49\x17\x2b\x6f\xc0\x30\x69\x80\x2b\xc3\x9b\x23\xf6\xd2\x4f\xcc\x24\x86\x87\xc5\x30\x5a\xd4\xa7\xd3\x77\x7e\x7a\x8c\xb2\xa1\x1b\x2b\x3c\x33\x42\x56\x81\x2a\xaf\x17\xae\x55\x0f\xb4\x2d\x0d\xdc\x2f\x42\x8e\x59\xe6\xb3\xa0\xf4\xb8\x68\x66\xd3\x23\x66\x38\x10\x03\xa1\x27\x7a\xd0\x88\xd6\x0c\x94\x14\x07\xef\xe8\x31\xe7\xb5\xc4\xb5\xe8\x8b\x6d\x99\x5e\xc8\x17\x4e\x08\xb9\xa8\x61\xf8\xd9\x73\x9d\x2d\xe0\xb7\x6d\xd5\x0a\xc9\xcf\x03\x15\xee\xaa\xab\x1b\x2f\x73\x84\x82\xb1\xd1\xbf\xe2\x87\xf8\x97\x80\xc7\x7f\xf6\x3f\xff\x13\xff\x97\xbf\x1b\xfe\xd8\x6f\xfe\xab\xe7\xd7\xfd\xad\x5f\xf6\x4f\xff\xf6\xff\xee\x7f\xf3\xef\xfa\xc5\xbf\xfe\x97\xfc\xd6\x1f\xfd\xf7\xfd\xe8\x6f\xfb\x13\x7f\xf8\x2f\xfe\x6b\xff\xec\xef\x7f\x10\x5a\x2a\x68\x15\xc9\xe7\x9a\xec\xd5\x9a\x1e\x50\x7c\x9d\x8c\x83\x85\x57\x7f\x5f\x5b\x4d\xc9\xa9\x9b\xee\x95\x8d\x66\xcd\x4c\xbd\x19\x1f\x2c\x30\xcc\xf9\xde\x0c\x44\x55\xe5\xa1\x2b\xa3\x68\x10\x00\x49\x1a\xcf\xca\xaa\xa6\xbc\x5f\x2c\xc9\xcc\xe7\x0d\x4a\x99\x32\x89\xa1\xef\x27\x91\x77\x32\x64\xda\xf5\xc1\xef\x3b\x41\x93\xba\x52\x53\x68\x7d\xdb\x03\xc8\xe4\x47\x6d\x3a\x17\xa1\xf7\xfa\xe3\x57\xe5\xa4\x75\xd9\xd8\x17\x65\x2e\x59\x79\xb1\xee\xc2\x61\x94\xc9\x56\xf9\x79\x41\x05\xa7\xb5\xc1\x7a\x2b\x91\x53\xda\x57\x87\x7d\x7b\x54\xd3\x7d\xd6\x82\x90\x7e\xf1\x5f\xbc\xfb\x3c\xaf\x3f\x69\xc1\x65\xf6\x79\x23\x07\x66\x2e\xcc\x84\xac\xdc\x6c\xd0\x48\x2b\x38\x9f\xac\xa4\xbd\xfd\x31\xe2\x98\xf9\x85\x14\x99\x21\x53\xef\x8e\xd3\x3f\x13\x3c\x85\x0b\x27\x8c\xb8\x6d\x9d\x4e\x92\x0b\x1c\x61\xc2\xb6\xc1\xb5\x5e\x17\x98\xd1\x63\x7a\x6a\xbf\xb9\x7b\x3d\x4d\x8c\x2f\x63\xab\x8f\x47\x63\x92\x49\xc7\x28\xd5\x27\x57\x2e\xb5\xd8\xe5\xd6\xc5\xd8\xce\xb3\xd8\xf0\xc0\x5e\x05\x86\xf4\x0b\x59\x36\x99\x07\x20\xee\x75\x09\xf8\xf8\x40\xb6\x8b\x08\xbe\x5e\xa0\xb2\x85\xcc\xc9\x30\xf3\x40\x6c\x2e\x78\x80\x53\x39\x08\xc6\xcb\x17\xd0\x24\x03\x85\x04\x3a\x4a\x0e\xc9\x35\x1d\x5a\x28\x7a\x4d\x06\xdd\x35\xac\xd6\x48\x37\xe3\x2d\x9f\x74\x97\x6e\xc1\x3c\xe0\x21\x2b\x7d\x91\xb6\xc3\xd8\xb0\x6b\x03\xf7\xf8\xba\xe9\x55\x8b\xab\xc5\x2c\x68\x84\x13\xf3\xbc\x93\x17\x69\x28\x05\xcb\x1d\xa8\x2f\xa0\x24\xc3\xe7\xfd\x42\x96\xcd\x9c\xf0\xf8\x86\xf5\x14\x0b\x66\x7b\x56\x0c\xbd\x0b\xf1\xdc\xa2\x1e\x4b\xd5\x8d\xef\x39\xc3\x5e\x9f\x85\xa9\x52\x5e\xee\x9f\x4f\xee\xe4\x33\xf1\x64\x19\x1b\x4d\x4a\xd3\x70\xd7\x11\xdb\xb5\x22\xa3\x16\x97\x14\xe6\x5f\xcc\xbb\x0a\x07\x34\xfb\x3e\xc2\x83\xa7\x1e\x43\xe8\x17\xe3\xb2\xb8\x2a\x83\xe1\x1f\x22\x93\x33\xa9\x16\x7e\x3b\x86\x9a\xf3\x1d\x03\x8d\xf6\x66\x7d\xdd\x24\x39\x18\xb4\xdf\x28\xda\xf2\xd6\x7e\x31\x16\x1d\xf4\x8a\x94\x08\x77\x6f\x57\x6c\x35\x24\xe2\x4b\x76\xb6\xe1\x99\x1d\xda\xde\x27\xb2\xb8\xc6\xa2\xc4\x0c\x31\x06\xdd\xda\xf0\x5f\x24\x03\x44\x77\xf3\x7d\xf5\xb3\x4f\x54\xcc\xe6\x18\x53\x5f\x82\x09\xaf\x3c\x09\x3b\x2b\xd4\x05\x45\xe8\x18\x73\xa8\x07\x9d\x8f\x24\xc0\x07\xeb\x35\x43\xa6\xa7\x34\x42\xf0\x93\xc2\xbd\xca\xa9\xab\xcc\x76\x1b\x80\x53\x2d\x77\xbd\xbe\x90\x2e\x71\x0f\x7a\x6f\xf1\x5d\x1c\xa5\x3e\xf1\x5e\x57\x0c\x82\x5b\x52\xa7\xae\x8e\x3b\xe6\x78\xd7\xf6\xeb\x5f\x46\xeb\x18\x42\x45\xf2\x88\x15\x65\x60\x28\x3b\x50\x72\xb4\x16\xc0\x4f\x8e\x1a\x02\x33\x0a\x4d\x7b\x3b\xdb\x33\x78\xf6\x55\x1c\x5e\x0e\x9d\x2b\xc0\xae\x54\x65\x55\xaa\xe0\xac\x9a\x73\xae\x20\xfb\xc3\xda\xf9\x85\x75\x81\xf6\xbe\xd1\xdd\x35\x3a\x4d\xcc\xe5\x07\x2a\xc2\x64\x3b\x80\x88\x5b\x59\x31\xd4\x2e\x92\x02\x28\xa2\x8a\x1c\xb6\x0d\xb5\xd8\x4f\xac\x0b\xc6\xd0\x40\xb6\x19\x20\x5f\xd7\xca\x55\xc9\x8f\x5d\x58\x75\x53\x81\x41\xe4\x05\x2b\x3a\x3a\x19\xa0\xd5\x50\x14\x94\x54\xe0\x8b\x7c\x82\xa7\x35\x1f\xa4\xa7\x09\x2c\x91\xb3\x06\x88\x39\xb2\x3c\xcb\x89\x00\xb6\xe1\x83\x9f\xed\xd9\x44\xfe\xdd\xf1\xb9\xae\x03\x56\xc0\x17\x44\x1b\x2d\x41\xde\x5e\x9d\xbb\xa6\x4c\x9e\x17\x47\x15\x8b\x44\xc4\x4b\x0b\x89\x3b\x8b\xcc\x80\xd8\x76\x24\x00\x84\x84\xa0\xe8\xfe\x45\x7a\x06\x25\xd4\x62\x74\xb3\x9e\x19\x28\x1f\x1f\xd1\x61\x9a\x3d\xa5\xf6\x46\xd3\x4d\x36\x36\x23\x94\x05\x6c\xfb\xce\x23\xb1\x1c\xaa\xf6\x2f\x0c\x57\xfd\x91\x8c\x36\x9c\x1d\x8e\x2e\xf1\xd2\xe9\x2b\x8e\x12\x81\xa4\x2d\x98\xa5\xa5\xf7\x3e\x66\x18\xe8\x0d\x8f\xcd\x75\x80\x79\x3f\xd1\xf4\x8e\x2c\x59\xcb\xcb\x5b\x7a\x66\xa9\x27\x94\x79\xe3\x1b\x7c\xa5\xc5\xde\x82\x6a\xb0\xcf\xd3\xaa\xe3\x83\x09\x89\xa6\xce\x0f\xfc\xe2\x3e\x0a\x3d\xd6\x8f\xb2\x56\x1b\x77\x85\x46\x80\x4f\x6e\x14\xcc\x30\x80\xc9\xdc\x9e\x65\x6b\xec\x70\x58\x2c\x08\xca\x11\xba\xac\x41\x5f\x24\x89\xd0\x8e\xa2\x84\x4f\xb2\xe0\xa4\xc0\xde\x04\x1d\x83\x16\x4b\x22\x8d\xca\x02\xb2\x65\x90\x54\x20\x15\x7f\xd7\xda\x40\x15\x62\x1f\xfa\x45\xed\xf4\xa1\xd7\x8e\x4d\x37\x50\x76\xc8\xd5\x45\xf8\x30\x89\x47\xda\xf7\xb4\x50\xea\xf0\x0a\xe0\x49\x59\x4c\xe9\xb9\xfa\x2c\xe4\x3f\xa1\xfb\x9e\x5c\x7a\x95\xcf\xb1\x92\x03\x6c\x19\x71\x5a\xeb\xb2\x38\x2f\xe5\xc6\x71\x7b\x0b\xbd\x4e\x5f\x45\x4f\x2f\xe7\x1b\x84\x41\xbf\xe8\xec\xb4\x3d\xdd\x5f\xb6\x57\x64\xf6\x25\xb1\xa4\xb1\xba\xe0\x4d\x98\xf4\x18\x4b\x9e\x5d\x74\x4d\x21\x38\x6d\x47\xec\x63\x32\xca\xa2\xff\xa2\xb3\xab\x34\xa9\x3d\x1c\x32\xc3\xed\x00\x5a\x37\x0f\x8f\x6a\xe3\xc0\x4c\x70\xf4\x76\xaa\x33\xfc\x23\xee\xc6\x49\xab\x77\xa4\xce\xce\x17\x44\x9b\x79\xe8\xcc\x0a\x1b\xae\x7b\x0d\x77\x75\xa1\x70\xda\xfd\x4e\xa1\x74\x39\x93\x37\x31\x9c\xcd\xcc\xe2\x0d\x92\xe9\xdd\xa5\xf4\xaf\x84\x5f\xff\x4b\xc0\xe3\x17\xfc\xad\x1f\xfb\xab\xbf\xf3\x57\xfe\xc7\x7f\xe6\x1f\xff\xfd\xff\xda\x8f\xff\xe6\x5f\xfc\x07\xff\x47\xbf\xf4\xcf\xff\x7b\xfe\xc0\xfa\x89\x3f\xf6\xef\xff\xfd\x7f\xe6\xef\xff\xfe\x1f\xff\xe3\x7f\xf0\x47\x3e\x50\x78\x28\xd7\xd7\xd9\xfa\x54\x17\x13\xe9\x4b\x05\x68\x5f\xb1\x8e\x24\x4d\x1a\xe8\x88\xb9\xae\x30\x09\x4c\x37\xcd\x36\x75\xa5\x5b\xfc\x8b\x83\x6d\xc1\x1c\x60\xc9\xe9\xe2\xad\x09\x0c\x73\x5b\xd6\xea\x88\xd5\x55\xab\xa8\x2e\x56\xf6\xd3\x12\x26\x09\x93\xd1\x0a\x8c\x2e\xd8\x2f\x2e\xd4\xb3\x20\xdf\x36\xcc\xa3\x09\x2a\xd3\x08\xc2\xd1\xc8\xaf\x2e\xf1\x6c\x4d\x22\x59\x23\x52\xa4\x24\xc5\x2c\x3b\xf9\x96\x68\xcd\x28\xfe\x0b\x7e\x70\xfd\x50\xda\xd4\x3c\x14\x04\x30\x2c\x27\x67\xbf\xa1\xd1\x74\x6b\x34\xdc\x41\x3d\x1e\x43\x71\xea\x0a\xad\x05\x03\x03\xf6\xbd\xfe\x83\xc6\xc3\x04\x89\x32\x60\x84\x7f\xa8\x78\x22\x09\x83\x13\xe6\xe7\x87\xa2\x3a\xe5\x72\xef\x89\xd4\xb6\x45\x49\x42\xab\x46\xf0\x14\x47\x4b\xfb\x42\x72\x0a\x17\x1d\x0b\xe5\xc5\x33\x7c\x14\x05\x0e\x63\xa3\xd1\xa8\x91\xeb\xdb\xc1\xa3\x01\x9a\xeb\x11\x2f\x05\xeb\x91\x74\x0b\x3a\xcc\x27\xf1\x7f\x26\xc6\xd0\x5d\x46\xb6\xe8\x1e\xa5\x79\x97\x9e\x07\xa5\x18\xf0\x6a\x7d\xf3\x57\x12\x9e\x74\x1a\x0f\x04\xf9\x65\xbc\xea\xcd\x3f\xb9\xd6\x6f\x56\x40\xc8\xdf\xce\x31\x81\x88\x8e\x86\x01\x0b\x91\x61\xbf\x15\xaf\xc7\xe6\x01\xae\xb8\x0f\x22\xf2\x01\x66\x2a\x00\x04\xf8\x44\x96\xdd\xe0\x75\x5d\x9e\x16\x79\xd8\xf2\x89\x4c\xd7\x77\x3e\x5b\x41\xb0\x59\xc7\x4f\x37\xcf\x11\x38\x25\x4f\x65\xe8\x64\x69\x38\x6a\xff\xc2\x4c\x02\xb7\x0d\xa9\x69\xd6\x1b\x27\x63\x34\x26\x57\xef\xd3\x6d\xe7\xda\xe2\xa7\x23\x78\x9a\x3d\x35\x3e\x9e\xfb\x9e\x63\xa2\x28\xd5\x2f\xda\x1f\x79\xfa\x3b\x1a\xf0\x6f\x11\xe6\x3c\x1d\x5e\xbc\x9e\x8c\x31\x2a\xeb\x60\x97\xcb\x46\xcb\xb4\x56\xde\x37\x3c\xe1\x3c\xbc\x4d\x75\xbf\x60\x6c\xa9\xd2\x24\x23\x24\x2e\xd5\x3a\x8f\xdc\x4c\x11\x33\xea\x3c\x82\x4b\x68\x32\x82\x5f\xd0\xfd\xd0\x3e\x2f\xf6\x3a\x3f\x53\x3d\x5f\xc4\x0b\xb3\x13\xdf\x07\x94\x1d\x69\x62\x55\x1b\xba\x97\x11\xe7\xf8\xb2\x07\x01\xb0\xd1\xe4\x2a\x9a\xcf\xab\x98\xe5\xf1\x5c\x8e\xdb\x22\x5f\x9c\x8d\xa3\x22\x41\x05\x2b\x39\xcf\x8b\x40\xa4\x54\x14\xae\x5e\x9c\x8d\x88\x53\xb4\xa4\x77\x16\x13\xb0\x5c\x9f\xe4\xf7\x1c\xe2\x1e\x31\xdb\x17\x70\x5c\xe5\xc7\xec\x38\x03\xc2\xba\xd1\xbe\xa8\x6b\x8c\x6d\x1d\xf5\x44\x2b\x96\x32\xa1\x54\x68\x08\xd4\x12\x6e\x0d\xed\x0a\xd9\x27\xa7\x15\x59\x74\xe6\xd2\x91\xf6\xa9\xce\x6b\x7a\xd4\xc9\x12\x14\x09\x74\x7a\x4c\x5b\xb7\x99\xdb\x8f\xad\xaf\xd1\xbb\x3b\x98\x9e\x88\x02\xff\xa2\x6a\xdd\xc1\xf0\x02\xd5\xab\xc6\x2a\xf1\x5b\x69\x04\x98\xaa\xac\x54\x32\xb8\xa4\x67\x6c\x24\x7d\x41\xf9\xd1\xe2\xc1\x5d\x27\x83\xd9\x17\x1c\x3a\x89\xf3\x21\x78\x59\xc2\x73\xca\xdd\xde\x91\x83\x9e\x55\x8a\x4c\xe0\x03\xa7\x68\x63\xa0\x46\x50\xc9\xaf\xe9\x5b\x73\x74\x06\xfc\xc2\x7b\xdd\xc2\x73\x39\x45\x27\x32\x7a\xf0\x39\x49\x9f\x37\xa4\x97\xc3\xb3\x83\xe2\xbe\x22\x91\x5b\xbb\x7a\xb5\x43\x4e\x79\xf0\xba\xe3\x93\x03\xd2\xf4\x5d\x06\xed\x33\xdc\x01\xd4\xbe\x9e\x3e\xab\x37\x57\x9d\xd2\x95\x92\x81\x45\x26\x61\x5c\x82\x8e\xb2\x72\x96\x33\x94\xf5\x9f\x0c\xed\x6c\x92\xff\x3f\x7b\xff\x19\x55\x35\xf3\x3d\xfc\xc3\x80\xa8\x80\xbd\x77\xc5\x8a\xbd\x24\x27\x89\x0d\x1b\xd8\x7b\x17\xac\xe9\x27\x3d\x39\x39\xa9\x62\x03\x2b\x62\xbb\xec\x1d\xec\x0d\x2b\x2a\x76\xc5\x8e\x0d\x51\xb1\x77\x51\xb1\x57\xec\xfa\xac\xef\xfd\xbb\xd7\x45\xee\xf5\x7b\xd6\xba\xae\x37\xe7\xd5\xff\xcb\x5a\xbc\xfb\x9c\x3d\x7b\x76\x76\x66\xf6\xec\xd9\x33\x51\x34\x14\x87\x0d\xd0\x26\x64\x5c\x66\x64\xce\xa3\x03\x0a\xaa\x89\x94\x26\x10\xa8\xd7\x43\xbb\x09\x91\x95\x74\x0c\x21\x6c\x81\xf2\xf0\x34\x6e\xfb\x22\xee\xa4\x79\xcc\x65\x49\x2a\x86\x09\x14\x88\x03\xb4\xcb\x24\x79\x5c\x42\xdc\x16\x49\x12\x1c\x43\x83\xac\x8d\x92\x16\xe5\x56\x09\xc3\x46\x14\xde\x0b\x42\x26\xea\x8b\x58\x4b\xd6\x19\x42\x04\x24\x44\x23\x38\x17\x4b\x63\x84\x6e\xcb\x02\x8e\x80\x8c\x42\x7a\x09\xc9\x50\x68\x13\x82\x61\xc0\xe3\xb5\x4c\x00\xb4\x65\x43\xd0\x58\x9f\xec\xa1\xab\x18\x4b\x48\xb2\x48\x10\x02\xa0\x70\x38\x21\x09\x1e\x1c\xe2\x18\xcc\x26\x74\x59\x92\x51\x5e\x03\x6c\x94\x52\x05\x41\x51\x5d\x3a\xc2\xe2\x96\x68\xfa\xa4\xca\x5a\x95\x68\x85\x20\x64\xb7\xa6\x78\x50\x8c\x46\xdd\x04\x65\x78\x5d\x1a\x84\x71\x86\x6c\xf1\x0c\x69\x52\xb2\xc6\x23\xa0\xdb\x82\x0c\x48\x83\x28\x0f\xed\x56\x7c\x31\x6a\xf1\x80\x02\x7a\x2d\x0c\x66\x08\x98\xf3\xaa\x90\x49\x01\x80\x29\x73\x06\xc7\xb8\x35\xdb\x85\x7a\x35\x5b\x05\x51\x14\x45\x58\xd9\xad\x2b\x92\xee\xb6\x50\xdc\x17\xb3\x99\xee\x95\x64\x42\xf1\x18\x82\xac\xb9\x55\x88\xc7\x6c\x00\x11\x39\x88\x41\xff\x13\xea\xa9\x32\x0a\x49\x2e\xca\x2b\xa0\x24\xec\xc2\x49\xc5\x90\x3c\x30\xe2\x8b\x2f\xe2\xa1\x02\xe3\x92\x41\x5b\x03\x38\x8c\x33\x3c\x28\x84\x7b\x2d\x0a\x10\x45\x14\x02\x5d\x9c\xc7\xe5\x62\x69\x84\xc1\x30\x4d\x60\x34\x0f\xe4\x81\x51\x9d\x04\x05\xce\x17\x35\x7a\x82\x6a\x12\x2c\x4d\x2b\x32\x2e\xa9\x04\x66\x5a\x00\xa4\x6b\xa2\x82\xe0\x14\x49\x73\x8a\xcb\xa3\x6b\xa0\xc9\x7a\x64\xc0\x23\x9b\x02\xaa\xd0\xa2\x80\xa0\xbe\xd8\x12\x57\x6c\xaf\x68\x33\x30\xe6\x75\x19\x0c\xc7\xb1\x1c\xc3\x41\x2e\x0e\x42\x0d\x09\x91\x39\x04\x50\x0c\x84\x91\x38\x02\xe5\x08\xc3\xe3\xf6\xe2\x36\xe3\xd6\x50\x5f\xac\x10\x19\xd2\xb2\x11\xc3\xcd\x49\xa2\xaa\xba\x69\x13\x93\x58\x5d\xd1\x6d\x97\xc5\x02\x5e\x5a\xa5\x6c\x8e\xf5\x8a\x2c\x81\x50\x16\x2e\xc0\x86\x69\x70\x06\xe7\x8b\x2d\x2e\x54\x86\x58\x8b\x44\x6d\x15\x20\x38\x54\x14\x70\xce\xe4\x5c\x86\x4b\x51\x15\x2f\x4e\x12\x26\xad\x81\x24\xca\x92\x2c\x80\xbb\x69\x9d\x26\x69\xd9\x6d\xaa\x8a\xfa\xbf\x12\x1e\x54\xfd\x7c\x6b\xd3\x67\x93\xe9\xd6\xf7\xa7\xb3\xaf\x95\xbf\x3e\xc3\xaf\xc3\xad\xfd\x19\xad\xc2\x5f\x41\x47\x7b\x56\x3e\x9e\x3a\x63\xa7\x0f\x2a\x3c\x68\x93\x16\x34\x9b\x40\x68\x00\x97\x29\x5e\x95\x18\xd2\x0b\x00\x24\x66\xa2\x26\x25\x29\x2e\x90\xb6\x6d\x8f\x40\x09\x0c\x4a\xc0\x2a\x65\x81\x14\x23\xf8\xe2\xd3\x47\x28\x4b\x93\x26\x43\x1a\x24\xc5\x22\x86\xe6\x45\x65\x48\x82\x28\x55\xb7\x79\xd0\xb4\x61\x91\xd5\x11\xc0\xc2\x49\xd9\x63\x0a\x9a\x01\x72\x14\x22\xc3\x32\xe0\x8b\x10\xd1\x80\x3c\x88\xad\x9a\x3a\x66\x52\x1e\x44\xa5\x3c\x14\x2f\x23\x96\xc8\x79\x10\x8c\xa3\x2c\x52\xa3\x48\x86\x34\x31\xc6\x6d\xd0\x38\x09\x0b\x2a\x47\x42\x96\x2f\x96\x0e\x0a\x44\x30\x3a\x29\xff\x27\xf6\x40\x11\xc5\x72\xa3\xb8\x81\x98\x5e\x01\xa7\xbc\x8c\x61\x81\x06\x22\x11\x6e\x2f\xad\xb9\x68\x0a\x30\x35\x18\x47\x19\x8e\xf7\x45\x28\x40\xd0\x06\xac\xd2\x38\x2b\x88\x2a\x48\x63\x86\x05\x12\xb0\xcb\x94\x4d\x9d\x14\x18\x0c\x05\x54\xc4\x30\x4c\x84\xc3\x11\xd4\x8b\xb2\x14\x25\x9a\x1e\x08\xf7\xc5\xa5\x62\xac\x45\x6b\xb8\x89\x48\x5e\x0f\x4c\x32\x6e\x4d\x66\x34\x95\xc2\x01\x46\xb3\x71\x06\x63\x71\x8d\x35\x79\x88\x34\x64\xc2\xab\xa9\x96\xdb\x63\x90\x3c\xc3\xf8\x22\x50\xd5\x05\x5b\x65\x19\x18\x21\x3d\x3c\xec\x55\x0c\xd2\xed\x91\x11\x80\xa2\x38\x97\x5b\x56\x15\x90\x35\x05\xd0\x50\x20\x04\x73\x7b\x44\x83\x15\x15\x4a\x90\x6d\x9f\xdc\x73\xc3\xcb\x30\x48\x1a\x96\xcb\x83\xdb\x96\x06\xb1\x16\x48\xbb\x28\x08\x22\x44\x0c\x54\x19\x5d\x33\x05\x19\x16\x55\x5b\x71\x2b\xa4\xcc\x9a\xb2\x41\x4b\x8a\x2f\xc2\x22\x18\x14\x44\x1a\x65\x30\xd8\x25\x01\xba\x47\x04\x48\x37\x64\xa2\x34\xa9\xd1\xb6\xc6\x78\x70\x98\x57\x34\xc9\xab\x78\x68\x37\x89\xf2\xba\x25\xeb\x20\xa1\xf8\x22\x11\x26\x80\x2a\x49\x31\x10\x82\xc9\x12\xe0\xd2\x65\x09\xe4\x0c\x54\xc1\x0c\x98\x92\x25\x41\xc5\xdd\x36\x29\x31\x80\xe9\xf2\x5a\x80\x88\x81\x0c\xa3\x63\xba\x2f\xae\x85\x44\x39\x0c\xf8\x3f\xf7\x0f\xe8\x92\x17\xc5\x75\xd1\xcb\xaa\x6e\x4c\x47\x05\x98\x63\x75\xc6\x2b\xea\x3a\xab\x79\x40\x91\x16\x11\x9a\xe6\x04\x89\x67\x51\xaf\x4f\xfc\xc2\x12\x15\x56\x71\x51\x86\x26\xba\x64\x97\x97\x33\xdc\xb4\x4b\xd2\x35\x16\x86\x79\x0f\x0d\x68\x06\x6a\x82\x16\x0a\x51\x14\x2e\x12\x98\x21\x21\x1e\x98\xf0\xc5\x57\x5a\x30\x86\xe6\x70\xc0\x24\x21\x8f\xed\xe2\x68\x5c\x31\x61\x49\xa5\x10\xc4\xa6\x4d\x17\x4c\xc2\x94\xcc\xc8\x3a\x27\x2b\x88\xa0\x0a\x98\x22\x8b\xb0\xa9\x70\xbe\x38\xe9\x8b\x61\x10\xe3\x06\x58\x82\xb1\x48\x91\x53\x05\x37\xa6\xc8\x14\x8b\x42\xa2\xc2\x32\x9a\xcb\x6b\xf2\xbc\xae\x21\xb6\x47\x77\x99\xa8\x05\x93\xa0\x2d\x49\x86\xea\x8b\x51\x0b\xd1\x61\x80\x93\x15\x8b\xa1\x28\xd1\x70\x13\x06\xc5\xaa\x92\x05\x82\x96\x97\xb5\x0d\x89\xb7\x00\x88\x74\xc9\x36\x6d\xd8\x12\x45\xe1\x28\x64\x6b\xb2\xc7\x37\x5f\xfb\xc2\x58\x5b\x03\x45\x15\xa0\x6d\x10\xc6\x24\x8d\x56\x49\x15\xe2\x3c\x22\x26\xf1\x94\x41\x7a\x40\x4c\x81\xdc\x2e\x1e\x71\xbb\x00\x4a\xf6\x18\x6e\xc8\x17\xfb\x83\xa8\x41\x70\x20\xe8\xf6\x5a\x12\x0f\xd9\x2e\x44\x64\x28\x4d\xe7\x48\x97\x2a\xc1\x1a\xc4\x20\x5e\x4e\xb3\x58\x91\x16\x65\x12\x92\x61\x48\xd2\x14\x8e\x67\x7c\x71\xcf\x0d\x66\xdb\x8c\x9b\x23\x70\x51\x54\x55\xc2\x65\x81\x6e\x88\x35\x68\x80\xe4\x5c\x82\x1b\xd0\x08\x13\x00\x11\x2f\xa8\xf3\xba\xe5\xe1\x4d\x03\xf4\xb8\x35\xd2\xc4\x7c\x31\x8f\xf0\x80\x6e\xdb\x30\xac\x90\xa0\xc2\xc0\x08\x03\x59\xb4\x9b\x52\x40\x1e\x32\x49\x0b\x06\x3d\x06\x03\x7b\x54\xd3\x45\x99\xaa\x26\x8a\x00\x24\x18\x2a\x6c\xf9\x22\x59\x8c\x69\x92\x07\x65\xdc\x92\x28\x08\x94\xa8\x03\x6e\x0a\xa5\x45\xb7\x0d\x89\x10\x0b\xa2\x24\x42\xca\x1e\x98\x32\xbc\x02\xc2\x12\x16\xe9\x45\x31\x5d\x92\x41\x5f\x2c\x29\xbd\x2e\x9a\xa4\x5d\x00\x86\xea\x10\x80\xe9\xbc\xa1\xa8\x00\xe0\xc2\x60\x44\x92\x40\x89\xa6\x3c\x06\xc5\x03\x22\xa9\x09\x08\x21\xb1\x1c\xae\x79\x60\x09\xf3\x45\xbd\xa2\x97\x17\x61\x8a\x42\x15\x03\x93\x25\xca\xf2\x88\xb2\x0b\xc5\x75\xd5\x6d\xaa\x80\x00\x48\xac\x47\x32\x08\x83\xe7\x58\x41\x24\x4c\xc3\x80\x4d\x1b\x10\x01\x5f\x1c\x99\x05\x14\x41\x34\x14\x5c\x13\x54\x5e\x20\x18\x9e\x84\x34\x97\x87\x65\x71\xc1\x46\x01\x89\x97\x5d\x04\xc6\xe0\x94\xc6\x7a\xdd\x02\xe0\x95\x28\x5d\x60\x05\x9f\xdc\xf9\xc3\x79\xbd\x8c\x0b\x01\x09\x17\x26\x71\x0c\xcf\xea\x84\x80\xd9\x5e\xdb\x50\xbc\x94\x57\xb4\x3d\x00\x00\x11\xb2\x8b\xf3\x70\x30\x06\x19\x9c\x28\xf3\x18\xec\x93\x03\xdd\x10\x61\x60\x5e\xc1\x10\x75\x2f\x26\xcb\x82\x40\x11\x3c\x84\x93\x8a\x4d\xc9\xa6\x0b\x43\x75\xdb\x8b\x61\x36\xe1\x25\x11\xcc\x65\x30\x30\x8d\xf1\x9a\xec\xf5\x45\x3d\x81\xa0\x09\x00\xa3\xeb\xb2\xea\xa5\x60\xc1\x64\x25\x0f\x65\x7b\xdd\x32\x0a\x90\xa8\x87\x24\x44\x9e\x41\x6d\x90\x47\x61\xc6\x52\x41\x17\x4a\x00\xaa\x45\x2b\x3e\xa9\x76\x71\xf3\x1e\x5e\x17\x60\x01\xf1\xb8\x79\x95\x02\x14\x55\x33\x10\xaf\x00\xe8\xb0\x4c\x58\x92\xd7\xa3\xf3\xa4\xae\x78\x50\x18\xc1\x64\xc5\x56\x04\x80\x40\x7d\x51\xed\x62\xb2\xa4\x4d\xf1\x22\x2e\xcb\x8c\xec\x42\xdd\x84\x8b\xc1\x2d\x00\x02\x75\xdb\x23\x7a\x08\x59\xe7\x40\x5a\x72\xbb\x25\x01\x24\x6c\x08\xa6\x44\x01\xe0\x7d\x72\xb0\xc6\x42\x40\x0f\xe0\xe1\x65\x55\xb1\x78\xd0\xb0\xac\xff\x04\x7f\xbc\x26\x78\xbd\xa4\xea\x45\x19\x90\xb7\x11\x11\xd6\x2c\x18\x46\x5d\x8a\xd7\x23\x21\xa2\x88\xf9\x60\x66\xc7\x14\x12\xe1\x64\x5a\x30\x14\x44\x61\xdd\x92\x8e\x81\x8a\xc9\xb2\x10\xcb\x2b\x08\x25\x12\xac\xa8\xd2\x26\x89\xe3\xa2\xa9\x09\x84\xcb\x2b\x98\x2c\x4e\xfa\xe4\x58\xb9\x47\xf1\x50\x08\xe1\x86\x2d\x45\x73\x69\x34\xeb\x22\x2d\xd8\x22\x0c\x0f\x6d\x98\x1e\xdd\xcb\x9b\x26\x4a\x63\xa4\x22\x4a\x12\xc3\x7a\x58\x4e\x70\xd1\x38\xee\x8b\x95\x80\x02\x22\x26\x6e\x73\x1e\x88\xf3\x58\xa6\xa9\x33\xb6\x07\xc7\x00\x53\x40\x64\x49\x15\x75\x53\x40\x68\xaf\x21\x20\xa4\x8b\x36\x20\x9d\xd5\x01\x88\x02\x50\xcf\xff\x4a\x78\xcc\x58\xf9\xb8\xe8\x87\x59\xad\x9e\xe7\x9e\x1c\x73\x2f\x61\x6a\xfb\xbe\xcf\x3e\xa3\x37\xe3\x6a\x36\x99\xef\x71\x1f\xfd\x3e\x2a\x2e\x3d\xd6\x17\x15\x1e\x3a\xc2\x93\x82\x00\xb8\x58\x4a\x31\x3c\x22\x4a\x00\x8a\x64\x8b\x2c\xc5\x30\xa0\x6c\x43\xa0\x47\x40\x55\x4b\x15\x74\x37\x07\x9b\xbc\xcd\x68\x36\xe1\x93\xcb\xa3\x54\x18\xf5\xaa\x36\xa6\xeb\x16\xc6\x52\xa0\x6c\x6b\xa0\x80\x92\x2e\x02\xb2\x30\x54\xe5\x25\x0f\xe8\x76\xb1\x90\x4d\x08\x80\x06\x09\xba\xa1\x60\x34\x81\xfb\xe4\xfb\xc6\x08\xc2\x03\x16\xab\x82\xa2\xaa\x62\xbc\x20\x71\x16\x0d\x92\xba\xc6\x10\x6e\x99\x24\x10\x8c\x23\x71\x16\x74\xe1\x28\x62\xd9\x14\xa2\xb3\x2a\x49\xd8\xbe\x08\x97\x25\x40\x53\x25\x93\xe0\xbd\x5e\x51\x82\x28\xd8\xad\x01\x2e\x8d\xf6\x92\x2a\x4f\xeb\x9a\x4a\x29\x18\x4c\x83\x0a\xcb\xab\xb0\x2c\x82\x04\xcb\xc2\x90\xc6\xfa\x22\x7f\x87\x22\x38\xc7\x5a\x2e\x0d\xa6\x61\x1a\x12\x70\x9a\x35\x11\x9a\xe0\x10\x18\x96\x39\x10\xc5\x04\xc6\x52\x11\x4c\x23\x71\x04\x67\x70\x94\xc3\x79\x99\xf7\xc5\x2d\x09\xa8\x40\x8a\x20\x07\x92\x3c\x00\x33\x30\xce\x91\x98\x0b\x16\x3c\x2c\x89\xcb\x14\xeb\x76\x11\x9a\x4c\x98\x6e\x03\xf0\xc0\x18\xc1\x13\x80\xa1\xd3\xa6\xa5\x83\xbe\x28\xde\xc2\x3c\xf4\x7f\x5c\x92\x31\x44\x80\xb6\x6c\x2f\x23\xb1\x5e\x0c\xf3\x5a\x38\xa9\xa2\xa8\xa6\x92\x8c\xc8\x68\x06\x65\xeb\x12\x4d\x31\x9a\xe0\x72\xe1\x9c\x2f\x8e\x7d\xa1\x9a\xd7\x86\x15\x92\x00\x05\xb7\x65\x78\x71\x2f\x6c\xd2\x82\x4e\x59\xba\x2c\x90\x2e\x03\xa6\x38\x95\xb5\x74\xc3\xa3\xa1\x30\xe9\xe2\x20\x5d\xd1\x30\x90\xf1\xc5\xa9\x67\x1c\xf7\x68\xbc\x4b\x15\xdc\x06\xe1\xa6\x4d\x89\x92\x38\x95\x24\x4c\x8b\xd4\x74\x10\x03\x40\x1c\x17\x09\x97\xc1\x80\x86\x1b\x56\x14\x1a\x55\xdc\x1e\xca\xf2\xc5\x21\x23\xc6\x05\x61\x82\x1b\x26\x11\x9a\x85\x4d\x58\x84\x40\xda\xb0\x48\x95\xe0\x58\x1b\xb3\x60\x15\xe0\x6d\x8d\x61\x44\x2f\xeb\xd6\x4c\x17\x00\xca\x12\xaa\xfb\xe4\x7b\x07\xb2\xad\x9b\x34\xa9\x28\x3c\x09\x2a\x02\xc1\x61\x88\xac\xa3\x8a\x22\xa1\x98\xc1\xc9\x2e\x96\x03\x29\x02\xc6\x70\x01\xf6\xba\x35\xd0\xd6\x14\xc5\xc5\xfb\x62\x19\x85\xa9\x8c\xa6\xe0\x32\x0f\x01\xb4\x86\x6a\x5e\x44\xf0\x88\x18\xc8\xc2\x24\xc6\x8a\x2e\x85\x50\x34\x8c\x42\x61\x9a\x82\x18\x95\x60\x04\x14\x41\x15\x40\xf7\x49\xc9\x29\x69\x4b\x6e\x89\x23\x2d\x5e\x50\x5d\x2e\x92\x13\x70\x56\xb0\x41\xc2\xf6\xa8\xa8\x26\x08\x14\x85\x93\x1e\x48\xa4\x75\x08\xd5\x51\x0d\xd3\x25\x09\x90\x01\x5f\x04\x24\x5e\xc5\xcb\x78\x49\xda\xad\xa9\x1e\x1e\x11\x31\x8a\x70\xcb\x00\x80\x00\x9a\xc4\x80\x84\x22\x69\x1e\x14\xe5\x31\xd9\x74\xcb\xa6\xc8\x48\xb0\xc9\x6b\x98\xea\x8b\x51\x8b\x00\x78\x06\x84\x2c\xaf\x1b\xe1\x50\x06\x22\x0d\x0b\x07\x70\x0d\x02\x00\x99\xa1\x61\x93\xd7\x41\x84\xe1\x21\x95\x67\x70\x96\xf4\x2a\x5e\x92\x20\x38\x5f\x8c\xe0\x18\x24\xd0\x2c\x2a\xb9\x54\x88\xc1\x2c\xd0\xc2\x65\x97\xcc\x82\x06\x60\xa9\x92\x89\xa3\x06\xa3\x01\x2c\xa9\xaa\xb2\x21\x21\x14\xcf\xc1\x1e\xdd\xe0\x0d\x9f\x2c\xa3\x24\xc3\x23\x23\x06\xc3\xbb\xdc\x04\x0a\xe9\x14\x8c\xe8\x82\xec\x52\x79\x03\x14\x38\x85\xa4\x69\x54\x41\x54\x06\x64\x70\x04\x10\x2d\xdd\x2b\x99\xac\xe5\x8b\xda\x0a\x4c\x77\x59\xb6\x09\x21\xa2\x48\x62\x20\x0b\xe9\x2a\x23\x4b\x8a\x17\xb4\x6d\xd3\x45\x1a\x22\x85\xc1\x98\x2d\xb8\x6d\x17\x45\x71\x92\x88\x81\x0c\x46\xe0\x5e\x5f\xa4\x26\x41\x99\x46\x45\xd6\xc3\x42\x3c\x62\x1a\xb2\x5b\xa4\x24\x2f\xe4\x21\x30\x9d\xd0\x35\x8e\x84\x19\x8d\x11\x59\x05\xc2\x39\x0f\x06\x0a\x82\xc8\x30\x88\xa4\xfa\x62\xec\x84\x5c\x18\xc4\x5b\xaa\x08\x70\x14\x60\xb3\xb6\x6d\x29\xb2\xa8\x2b\xa2\x4b\x03\x6d\x88\x70\xb3\x02\x0b\x5b\xb4\x6a\x79\x61\x86\x81\x3c\x12\xca\xc1\x94\x2f\x12\xe7\x28\xef\x71\xa9\x30\x89\x12\x38\x22\x68\x92\x8c\xa0\x3c\x89\x2a\x9a\x04\xc8\x98\x0e\xc9\x12\x6f\xd9\x8a\xc5\x08\x80\x97\xa7\x41\x4c\x04\x05\x09\xe0\x4c\xdc\x17\xb7\xaa\x30\x96\x17\x46\x74\x93\x04\x05\x01\xe0\xbd\xbc\x87\x55\x4c\x54\x03\x61\xd9\x82\x24\xdb\x2b\xe2\x34\x2c\x98\xb6\x0e\x78\x3d\xb8\x17\x02\x69\x8d\x14\x69\x5f\x1c\xef\xc1\x3c\x80\xea\xa5\x50\x40\x54\x64\xc3\x66\x5c\x5e\x58\x13\x2c\x4d\x00\x4d\x12\x27\x19\x8e\xa6\x50\x11\x72\x81\x38\x07\x6b\x90\x4d\x20\x90\x20\x79\x68\xc0\x27\xdf\xa2\x83\x40\xdd\xc5\x7b\x01\xb7\x2e\xc9\x5e\xb7\x6e\x6b\x98\xca\x30\x86\x86\x02\xba\xa9\xb9\x00\x84\xa6\x69\x9d\x57\x30\xc8\xf4\xc8\xa6\x68\x13\x88\xec\x16\x7c\x72\xec\x4b\xc6\x61\x0f\x60\xa0\x14\xcb\xb8\x18\xc3\x24\x64\xc8\x20\x35\x8f\x47\x22\x49\x42\x14\xdc\x1e\x5a\xc5\x0d\x95\x10\x04\x81\x20\x75\x93\x94\x54\x00\xb7\x7c\x71\x1c\x10\x85\x28\xaf\x60\x5a\xba\xe5\x21\x28\x95\xd7\x60\x0c\x94\x11\x82\xd1\x61\xb7\xee\x55\x65\x1c\x83\x50\x8b\x42\x00\x00\xe4\x05\x41\x65\x5c\x3c\xea\xa6\x0d\xc6\x17\xdb\xc0\x08\xc4\x29\xb0\xe8\x71\xf3\xa8\xa4\xc3\xbc\x8e\xf1\x38\x4f\x99\xa2\xc4\x23\x24\xa6\xb8\x3d\x38\xac\xba\x68\x8a\xe6\x6d\x56\x65\x49\xaf\x64\xb9\x71\x97\xc7\x17\x9f\xbd\x47\x74\x1d\x61\x69\x1c\x95\x39\x9b\xd0\xbc\x1c\x40\x02\xb0\x48\xaa\x8a\xe4\x15\x78\x93\x96\xdc\x84\x46\xa2\xa2\x06\x61\x98\x8e\x81\x14\x8b\xa3\x38\xed\x8b\x8f\x28\x60\x6e\x8d\xe6\x0c\x0d\x85\x01\x9e\x63\x79\xdb\xe0\x45\xc3\x85\xaa\x12\xce\xab\x2a\x82\x49\x2c\x05\x21\x04\xed\x11\x48\x5a\xe2\x25\xda\x05\xbb\x79\x41\xe7\x7c\x51\x7f\x84\x0a\x08\x2c\x30\x26\x40\x2a\x2e\x01\x37\x68\x94\x84\x70\x82\xa7\x4c\xd9\x8d\x41\x06\x0c\xa1\x94\x07\x94\x6c\x50\xe5\x6d\x96\x76\x43\x2e\xde\x05\xca\x8c\x2f\xe2\x0b\xd1\xe4\x79\x49\xd6\x49\x46\x91\x75\x85\xb7\x41\x10\xc6\x11\xca\x66\x00\xd6\x03\x0a\x1e\x48\x95\x69\x56\x63\x15\xc0\x04\x35\xdc\x63\xc0\x94\x80\xaa\xa0\x2f\xea\xd2\x58\x08\x17\x25\x5c\x91\x70\xdb\x05\x99\x24\x67\x20\x92\x8b\xa1\x20\x81\x44\x24\xc8\x45\x31\x6e\x8c\xb3\x15\x4c\x83\xbc\x3c\xc6\x5a\xbc\xca\x91\x22\x8f\xe9\xff\xfb\x48\x4b\xff\x2d\xe7\x38\xec\x58\xd8\xa4\xf9\x7d\x07\x0c\xfa\x95\x2f\x66\xc8\xec\xcd\x97\xdd\xe7\x3f\x03\x11\x1f\xff\x3c\x68\xb7\x72\x60\x25\x1f\x54\x78\xa8\xa0\x5b\x25\x30\x00\x31\x50\x54\x21\x64\x59\x31\x40\x1b\xa7\x74\xd5\x36\x65\x43\x26\x40\x04\xc0\x40\xaf\x08\x19\x6e\xb7\xec\x56\x75\x9e\xa6\x4c\x96\xf0\x45\x70\xe6\x21\x65\x5e\xb5\x68\x9d\x40\x75\x5e\x97\x51\x4d\xb5\x0c\x37\x07\x02\x22\xee\x01\x61\xc2\xe5\x56\x0c\x93\x44\x05\xc8\x23\xf1\xbc\x5b\x76\xa3\xb4\x0c\x58\xbe\x58\xc0\xb8\x60\xb7\xc4\x68\x80\x40\xd3\x2e\x15\x21\x04\x92\x95\x60\xc8\xe5\x82\x79\x9b\xe1\xdc\x14\xc9\x52\xa0\x8b\xa2\x0c\x51\xf2\xc0\x8a\x6a\xf3\x82\x4d\xa9\x3e\xb9\xe3\x5f\x02\x61\x8e\x35\x21\x2f\x27\x4b\x0a\x0b\x59\x6e\x12\xa1\x74\xd5\xa3\x8a\x96\x6d\x12\x02\x46\x0a\x38\x86\xd3\x94\x2d\x72\xb0\x8b\xd2\x40\x88\x92\x01\x9f\x7c\xd4\x50\x41\x64\x0e\xb3\x51\x80\x17\xdc\x1a\x60\x9a\x96\x6a\x13\xba\xe2\xe1\x14\x0c\x35\x14\xb7\xc9\xc2\x06\xe1\x62\x71\xaf\x01\xb1\x9a\x20\x61\x26\x64\x69\x5e\x5f\xf8\x85\xcb\x74\xb9\x45\x16\x02\x4c\x2f\x88\xc3\xa2\x0c\xbb\x29\xdd\x02\x58\x9d\xd6\x0d\x90\xe5\xbc\x80\xa6\x21\x3a\x47\xd1\x5e\x80\x73\xd1\xa6\x87\x24\x6d\xdb\x27\x09\x0f\x01\xe3\x18\x9c\xb7\x04\x5e\x95\x35\x5a\xc5\x75\x2f\xc4\x50\xaa\xc7\x12\x09\x16\x87\x18\x0f\xc1\xa8\x6e\xdd\x84\x71\x09\xe1\x15\x45\x75\x09\xa8\x4e\xf9\xe4\x1c\x3a\x28\xb3\xba\xd7\x65\x41\xa2\x05\x21\x2c\xce\xff\xc7\x49\x29\x90\x32\x4d\xaf\x57\x70\xb9\x4c\x93\x74\x79\x3c\x3c\xa9\xcb\xb0\x97\xe0\xdc\x84\x0e\x31\x20\xe7\x8b\xdb\xb2\x39\xd8\xd4\x11\x5e\xb0\x28\x0b\xd6\x21\xc9\x12\xdc\xc8\x7f\xa2\x56\x5b\x81\x64\x4a\x11\x30\xd5\x10\x4c\x58\x76\x79\x70\x4e\xb4\x71\x86\xf0\x92\x9a\x85\xf9\xe0\xd4\x33\xe6\x62\x58\xc9\x60\x04\xcb\x02\x71\x15\x14\x41\xda\xeb\x96\x24\x1a\x62\x31\x44\x81\x21\x8f\x00\x32\x02\xeb\xa1\x54\x0b\x75\x49\x86\x09\x01\x04\x2e\x5b\x80\x2f\x82\x76\xb7\x49\x18\x2e\x15\x15\x51\x12\x20\x14\x53\xd0\x19\x44\x33\xbc\x20\x2b\x63\x90\xcd\x89\xb8\xc9\x0a\x34\x6c\xe0\x8a\xa5\x50\x00\x80\xd1\x92\x48\xbb\x58\x5f\xec\x03\x91\xa8\x6c\x22\xba\x9b\x97\x3d\x04\x2c\x8b\x18\xec\x52\xdd\x26\xab\x81\x20\x4f\x41\xb2\x57\x15\x48\x08\xb6\x58\x11\xd7\x54\x45\x46\x65\xce\xa5\xc9\x30\xe6\x8b\xe9\x4f\x02\x44\x9d\x80\x5c\x9a\x80\x4a\x82\x82\x9b\x86\x6d\xa1\x1c\x00\x30\x94\xe0\xe2\x44\xc6\x6b\x1b\x1e\x59\xd1\x45\x84\xa7\x30\xc0\x66\x74\x91\xb2\x09\x9f\xdc\x9e\x41\x18\xa8\x48\x51\x30\x2b\x68\xb2\x06\xd8\x34\x68\x11\xb6\x48\x98\xa6\xd7\x92\x64\x99\x01\x55\xc0\xd4\x75\xd3\xab\xa8\x2e\x18\x60\x3d\x0c\xab\x69\x88\x4f\x4e\xc3\x73\x0c\xec\xd6\x48\x0e\xb3\x11\x44\x01\x4c\xcc\x74\x69\xa4\xe0\xf1\x18\x92\xc2\xe1\xb0\x8b\xe5\x65\x1c\x97\x18\xc3\xb0\x3c\x9c\x57\xf0\x6a\x0c\x84\xba\x71\x5f\x24\x48\x2d\xc3\x0d\x8b\xa0\x69\xd3\x9a\xc5\xf1\x06\x28\xca\xb4\xa8\xcb\x30\x04\x33\x84\x6e\xd3\x10\x89\x7a\x70\x46\xd3\x30\x58\x80\x08\x94\x83\x18\x80\x53\x7c\x71\x21\x23\x8a\x21\x9a\xe5\x96\x58\xcd\x0b\x63\x1e\xc4\xeb\xe5\x05\xb7\x8a\xcb\xa2\x06\xa1\xa2\xac\x41\x94\x47\xa4\x6d\x8e\xf0\xe0\x98\xc1\x82\xb4\xc8\x20\x1e\x82\xf0\xc5\x85\x8c\xa8\x0b\x50\x18\x4b\xb6\x55\x1c\xc0\x19\x19\x14\x19\xda\x2d\xa0\x0a\xe7\x75\xe1\x3a\x2f\x91\x34\xe5\xe6\xdc\xa8\x5b\xc5\x50\x51\x93\x2c\x8c\xc0\x00\x12\xf1\xc5\xd1\x05\x14\x35\x0c\x83\x16\x40\x12\xc2\x64\x40\x04\x11\x5b\x47\x4c\x82\xe5\x2d\x49\x70\x69\x04\xec\x05\x5c\xba\xc6\x72\xba\x6a\x68\x1c\x25\x50\xa6\x05\x11\xa8\x4f\xf6\x07\x25\x81\xf0\xaa\x1c\x09\x18\x16\x25\xdb\xb4\xc2\xd3\x12\x49\x0a\x32\x4d\x58\x9c\x8e\xd9\x30\xa1\x60\x0c\x63\x89\x30\x26\x33\xa6\xcc\x9a\xa8\xa4\xba\x08\x5f\x2c\xe6\x08\x45\x50\x18\xc4\x2b\x22\x5e\x16\xe1\x34\x8e\xa1\x4d\xcb\x26\x35\x99\x47\x2d\x01\xa7\x6d\x92\x12\x50\x09\xa7\x5d\x0c\x85\x1a\x88\x17\xe7\x64\x81\xf3\xd1\x0d\x33\x0a\xef\xb5\x34\x09\xf0\x40\xbc\x2c\x28\x84\x02\xca\x2c\x4f\x09\xb6\x9b\x63\x69\x8d\x27\x4d\x4c\x87\x51\x49\xa0\x69\xd1\x36\x68\x0d\xf6\xb2\xa0\xea\x8b\xab\x10\x29\x98\xf4\x48\xb6\x8d\x79\x29\x48\x74\x83\x20\x6d\x2a\x8c\x06\xd9\xa0\x25\x02\x2e\xcb\xb2\x64\xd8\x65\x70\x18\xaa\x0a\x00\x0d\x59\x2e\xc3\x16\x28\xd6\x27\xdf\x47\x61\x58\x56\x53\x75\x16\xa7\x00\x02\xb2\x75\x10\x64\x15\x01\x81\x6c\xc4\x50\x09\x1a\x90\x29\x50\x43\x30\xaf\x44\x7b\x39\x1e\x56\x01\x5b\x80\x64\x08\x55\x7c\x71\x15\xa2\x88\xb8\x21\x99\x53\x05\x44\x20\x6c\x13\x84\x40\x55\x76\x93\x92\xed\x82\x6d\xaf\x29\xb8\x35\xcb\x0b\x43\x82\xae\xdb\x22\x6f\xb8\x00\xd4\x80\x44\x2f\xc3\xfb\xc2\x2f\x28\x95\xd6\x11\xd1\x70\x19\xa4\x0b\x27\x2c\x02\x46\x34\x8a\x86\x35\x12\xa6\x71\x4a\x97\x3c\x9a\x82\xca\x9a\x1b\xb7\x70\x92\x42\x68\xce\x83\xaa\x96\xec\x9b\x7b\xb1\x38\x5a\xc3\x3c\x0c\xc7\x01\x38\x61\x73\x2a\xaf\x91\x3a\x25\x0a\xb2\xc8\x98\x28\xa3\x7a\x68\x14\x84\x78\x1d\x42\x71\x04\xe1\x28\x95\x44\x2c\x8a\x42\x7d\x51\x8b\x05\x62\x04\x0f\xc1\x82\xc0\x10\x3a\x2a\x80\x28\xcd\xd1\x08\x24\xf3\xaa\xe8\x51\x54\x17\x82\x1a\x2e\xd6\x96\x41\xd8\x44\x0d\x41\x23\x05\xd2\xc3\x2a\x9c\xea\x8b\xb8\x93\xf0\xb8\x4d\x06\xf0\x82\xac\xa4\x02\xa4\xdb\xe2\x51\x83\xd1\x31\xc2\x74\x2b\xb2\x4b\xa5\x71\xc6\xd4\x09\xc6\xb0\x59\x9a\x14\x4c\x9d\xf4\x1a\x92\x00\x61\xbe\x88\x2f\x48\x46\xb3\x65\x93\xb5\x2d\x1c\x86\x51\x9b\xa3\x68\x17\xcb\x61\xb6\x5b\x36\x11\x5c\x05\x65\x80\x71\x21\x2e\x82\xe7\x60\x46\x74\x21\x98\xac\x8b\xa6\xe4\xf1\xc5\x6c\x66\xa2\x2a\x6f\xc1\xb0\x04\xab\x06\x4f\x63\xa2\xa6\x48\x32\x6f\xba\x4c\x0f\x06\x68\x1e\xb7\x4e\xeb\x28\xa2\x02\x82\x2a\x02\x80\x22\x93\x0c\x2f\xe9\x1e\xd5\x17\xd5\x71\x24\xe7\x05\x44\x80\x36\x20\x82\x05\x30\xd9\x44\xbc\x84\xe4\x42\x50\x41\xe7\x69\x0c\xd2\x64\x86\x16\x54\xcd\x66\x51\x89\x56\x38\x8d\x55\x3d\x8a\x4c\x63\x79\x95\xc5\x67\x8a\xfd\x4f\xc2\x63\x62\xaf\xea\x63\xde\x6f\x2a\x55\xfd\xe3\xed\x5d\x07\x6e\x25\x34\x76\xdd\xe8\x59\xee\x55\x29\xfc\x4d\xeb\xa0\xfc\xaf\x07\x54\x8a\x5b\xd5\x66\x62\x01\xff\x0a\x85\xda\xc5\x75\xf9\xf3\x9f\xbf\x6a\x7e\x7e\x8b\x1a\xdd\xa8\x3f\x24\xcc\xef\x7f\x7e\xdc\xbd\x66\xaf\xef\xf9\xf7\x9e\xfd\x99\x9c\xf1\xb1\x44\x54\x56\xb9\xdd\x2f\x3b\x0f\xfa\xb9\xa2\xd3\xe7\x32\xf5\x9f\xa5\xdf\xdd\x71\xbd\x79\xf1\xff\xa2\xff\x45\xff\x8b\xfe\x17\xfd\x2f\xfa\x5f\xf4\xbf\xa8\x6f\xd0\xf1\xbb\x02\xfe\x1d\xf8\x7f\xe7\xf0\xff\xb3\x7d\xd1\x2e\xce\x2f\x34\xf4\xff\xcb\xff\x33\x0b\xfd\x8f\xd1\xcc\x33\xc6\x03\xee\x50\x67\x2c\x6d\xab\x15\x54\x73\xf3\xf6\xa4\xe3\x6b\x3f\xdf\x6d\x71\xe6\x7a\x25\xc9\xda\x31\xb6\x46\xff\x3b\x3f\x63\xff\xcf\x7e\xcf\xa2\x50\xc7\x03\xc9\x5d\xd5\xe4\x10\x52\x6f\x5d\xdb\xa5\x5a\x51\xd6\x1d\xbf\x3f\x7b\x64\xa5\x63\x5f\x8a\xae\x69\xbc\xd7\xdf\xbf\x77\xe7\xcb\x89\x33\x1f\x38\xd0\xc3\x9b\xe7\xd5\x26\x4f\x2d\x8c\x29\x71\x75\xcd\xaf\xdd\xed\xe8\x13\x81\xc7\xff\xd2\xa5\xda\x6b\x4b\x0b\x47\xbe\x84\xde\xa8\xf8\x35\xc2\x81\x36\xcf\xa8\x5a\xa0\x53\x8f\xf1\xfb\x8a\xdc\x68\xb7\x66\xf4\xb7\xba\x2b\x2e\xed\x6a\xfb\xba\x4b\x97\xd1\x43\x1e\x16\xaa\x5d\x95\xfd\x99\x6f\x96\x03\xad\x9e\xda\x63\x5c\xc7\x43\x0f\x0b\x4c\x89\x7c\x7a\x2a\xfc\xe2\x85\xf9\xe5\x8a\xfa\xbf\x88\x8e\x0a\x1e\x3a\x38\x41\x1a\xdd\x32\x35\x63\x8b\x03\x6d\xd8\xb3\x0e\x14\x94\x55\xb1\x73\xd7\x1d\xe2\xf6\xd4\xbe\xa9\x9f\x6e\x37\xfa\x70\xff\xf9\xe2\xc8\x5e\x09\xfb\xc4\x95\x8d\xce\x5c\x69\xe0\x40\xbf\x24\x7c\xbf\x0b\xdd\x3f\x73\x4c\xec\x97\x94\x50\xe2\xf8\x40\xad\x7d\xc6\xb2\xba\x41\x15\xbe\xc5\xac\x6a\x3e\xb4\xd8\xd6\xc0\xdd\xf3\x1d\xa8\x3c\x6a\x47\xbe\x57\x09\x7b\xac\x43\xc5\x7e\x6f\x78\x50\x28\xfe\x43\xd6\xdc\x3d\xd3\x77\xb5\xcd\xf4\x7f\xcd\xf4\x09\x2e\x7e\x86\xa9\xe3\x40\xcb\xce\xc9\x2d\x5c\x2d\x10\xf9\xe8\x7d\x2d\x2d\xea\xbb\xa9\xfe\xaf\x8d\x2b\x7e\xec\x8b\x9d\xd4\xaa\xe1\x87\xbe\xe9\xaf\x62\xce\xcf\x5e\xee\x40\x7b\xf7\x79\x55\x76\x7d\xef\xed\x7c\x4c\x95\x03\xd7\xfd\x8e\x2e\x84\xa7\x79\x46\x7f\xbd\xf8\x3a\x5f\x81\x77\x01\xdd\x5d\xd3\x9a\x17\x9f\xec\x40\x3f\xb4\x3b\x80\xe4\xbc\x79\x2e\x8f\x3d\x7f\x7a\xca\xfd\x5a\x28\x6c\xd6\xaa\x5c\xbe\xdd\x76\x3e\xb4\xfd\x9d\x1b\xbd\x67\x64\x5f\xc9\x75\xa0\xfe\xdd\x5b\x6d\x2a\xf3\xe3\x5a\xf3\xd1\xf5\xc5\x3a\x08\x3b\xa2\x05\xb1\xe7\xc5\xe8\x92\x75\x57\xf5\x1c\xbe\x69\x61\x65\xe1\x2d\x51\xde\x81\xee\x2b\x3f\xa4\xc5\xc7\xf9\x5d\x6a\xe8\x7d\x87\x2f\xed\x35\x0f\x5b\xf1\xb6\x1d\xfa\xa1\xd9\xa0\xf0\xbe\x29\x73\x4a\x34\x9e\x56\xe1\xbe\xe9\x40\xf1\xcc\xfa\xa5\x52\x23\x4e\x97\x4e\x66\x32\x96\xb2\xe9\x51\x2b\x46\xa5\xed\xad\xd2\xa0\xe2\xee\x29\xb7\x3e\x56\x68\xbe\x39\xf5\xad\xd7\x81\x32\x4a\x58\xbe\xfa\x65\x04\x6b\x74\xc7\xfd\xa3\x8f\xc7\xb8\x7f\x85\xb4\xeb\x3d\x75\xcf\xec\xa0\x2a\x78\x4a\xe3\xc9\xe7\xf2\xb7\xfc\xe8\x40\x8b\xbf\xff\xb3\x88\xef\xd2\x3f\xec\xcb\x3a\x34\x76\x74\x46\xda\x57\xc4\x7e\xf0\x60\xcf\x86\x2f\x01\x9f\xa7\x1d\x7e\x57\x33\x3b\xbe\xa7\x03\x5d\xb2\xe7\x49\x9b\xa2\x13\x02\x46\xda\xf9\x84\xe5\xcd\xa7\x81\xdb\xee\xba\x9f\xde\x1b\xfa\xe6\xe3\xd6\xa9\xf7\xef\x35\x2b\x5c\x7b\x5d\xba\x03\x15\x6a\x8d\x18\xd6\x2d\xe4\xf4\xf1\xf6\xc9\x3a\xf0\xb8\xef\xd0\xe8\x19\x9d\x3a\x47\x0d\x6b\x9e\xdb\xe8\xd0\xab\xb1\x49\x2b\x57\xf5\x75\x1a\xeb\x2c\x59\x3d\x3e\x6c\x7b\x66\xc8\xc8\xd1\xe9\xea\xf5\x69\x07\xe1\xe1\xaf\x17\x47\xcc\x35\x47\x3f\x5f\xa2\x8f\x5f\xc5\x5e\x9c\xae\x38\xd0\x33\x5f\x2b\x86\xe5\xd4\x64\x3a\x07\x77\x08\x79\x7f\xa6\xf8\x83\x33\x97\x6a\x69\xaf\xef\x97\xa8\xf9\x3b\xe9\x89\x9d\x30\xe7\x23\x7b\xd5\x81\xc6\x9d\x5f\x9e\x7d\xdc\x7d\x69\x63\xf5\x88\x5e\xd7\xfa\xd0\xab\x57\x14\x66\xc8\x5b\xdd\xf6\x1d\x77\x57\xea\x58\x74\x7c\xbf\x83\xcf\xaf\x39\x50\x10\x08\x18\x52\xff\x4b\x6a\xb7\xc6\x1b\x06\x17\x0e\xbf\x15\xdc\xa5\x58\x81\xa6\xa5\x0e\xfa\x95\x3b\xd1\x78\xb6\x14\x52\x6b\x4e\xbb\x5e\x4e\xd7\x2e\x55\x04\xa1\x2f\xbc\x3b\xbb\x73\xcc\xa4\xe6\xe3\x03\x9b\x50\xf7\x7e\x2d\xef\x5b\xa1\xf8\x89\x9f\xad\x8a\xcd\x1b\x3a\xea\x65\x64\x29\x07\xba\x22\x69\x68\x70\xeb\xc9\xd7\x16\xea\x93\x47\xdd\xbe\x30\xc2\x68\x3d\xb8\x40\x51\xff\x37\x23\x5b\xac\x9a\xb6\x82\x9c\xd3\x63\x0d\xe3\x74\xc2\x13\x4d\x2a\xf6\xfb\x30\xed\xa6\x72\x35\xdf\x95\xa2\x9b\xea\xef\x6e\xb0\xe9\xeb\x98\x45\x1f\x5f\x0e\x98\x01\xb4\xeb\xd7\xa3\x10\xf9\x6c\xad\x03\xfd\xf1\x69\x1b\x39\xb1\x6a\xfb\xaa\xe1\x9b\x76\x0c\x7c\x3e\x3f\x02\x98\x45\x14\xf5\xdc\xf9\xb8\x60\xc7\xe7\x83\xd1\xbf\xf1\x7d\xa3\xda\x39\x50\x4e\xf8\x54\x74\x3c\x68\xbc\x77\x43\x21\x77\x77\x7f\x9b\x33\xba\xdf\xef\x3e\x2d\xdb\x66\x98\xf7\xca\xee\xcd\x2f\xee\x7f\xe3\x1a\xe1\x40\xbf\x3f\x8d\xfe\x5d\xfb\xc7\xfe\xbd\xbf\x5d\x99\xf3\x7a\xac\x45\x87\x37\x0d\x6f\xfe\x84\x9b\xd0\x71\xce\x22\xfb\x49\x56\x63\x57\xa4\xf3\x69\x2d\xfe\x52\x36\x1f\xd5\x29\x75\xc3\xb7\x29\xd5\x6f\x65\xb7\x0d\x3f\x33\x63\x68\xab\xd7\x77\x9a\x3c\x9e\x57\xa8\x7c\xdb\x56\x9a\xdd\x67\xa8\xd3\xb3\x46\x75\xe9\xdc\x61\x7b\x00\xbe\xec\x73\xe5\x59\xe8\x8e\x4b\x3d\x86\xa6\x55\xca\xad\x53\x7a\xc9\xf8\x2e\xf0\xcb\x25\x4c\xfe\x01\xce\xe1\xad\xe4\x9b\xfb\x63\x0a\xa6\xe7\xff\x2a\xbc\x5d\x5a\x72\xe4\x83\x32\x75\x7e\x3f\xf3\x93\x06\xf5\x3a\xfb\xb9\xf7\xa4\x02\x4a\x9d\x7a\x1f\x68\x07\x1a\xb4\xec\x47\x5c\xe5\x27\xa5\x7a\xfd\x5e\x74\x32\xad\xf4\x39\xc2\x2c\xd7\x39\x2b\xa6\xe6\x4e\xf0\xf4\x94\xfb\xdf\xfe\x0c\x0b\x99\xbb\xd0\x81\xde\x96\xeb\x1c\x1f\xf4\xfd\xc1\xd1\x36\xcf\x96\x7a\x94\x96\x9b\xd2\x62\xdc\xfb\x97\x86\xc4\x5a\x69\x5d\x8a\xe1\xd7\xb2\xb7\x0e\xcb\x97\x51\xfa\xdf\x0d\xae\xff\x7f\xc6\xe3\xc1\x59\x0d\x7a\xb7\x8d\xbc\x9d\xd4\xaf\xfe\xb4\x57\x33\x86\x4f\x85\x6f\x04\xbe\x28\x2f\xff\x79\x50\xee\xde\xb3\x86\x85\xd2\x9f\xcd\xb4\x1d\x68\x83\xdb\xde\x71\x0d\xfc\x7f\xdb\xed\x2a\xfd\x8e\xca\x32\x89\x2e\xc5\x3a\x7c\xeb\xb9\x2b\xb7\x7a\xfd\x90\xcb\x69\x1d\xbe\x76\xdb\xf8\x32\x2e\x76\x48\x9d\xff\xfb\x7e\x75\xed\x1b\x39\x2a\x99\x1a\x39\x90\xdf\x18\x34\x77\xd3\x89\xc1\xb3\xcb\x97\x98\xfa\xa2\xd9\xa3\x4a\x83\x92\xd2\xfe\xaa\x36\xe3\x44\xdf\xdc\xbf\xc9\x65\x63\xbb\x0c\x69\xf2\xb2\x7e\xbf\x4e\x93\x6f\x6e\xdc\x9c\x3c\x98\xc3\x8d\x43\xc9\x83\xdd\xcb\xbf\x06\x55\xe4\x2e\xc1\xcb\xb6\x56\xca\x23\xdf\x5f\x3a\xf3\xb1\x7b\x52\xfe\x19\x73\x3d\xc7\x87\xfd\x79\x49\x7a\x7e\x7e\xdc\xc2\xef\x1d\x1c\xf6\x69\xec\xd5\xdb\x25\xb6\xe0\xa5\x8f\xe5\xe6\x35\xdf\xa7\x8f\xdf\xbb\x79\xfe\xf7\xaf\x7e\x5b\xb5\xbb\x65\xce\xf0\xf5\xeb\x66\x7c\x0c\xa1\x47\x61\xa3\xca\x87\x17\x4c\x1b\xe3\xb5\x3f\xc8\x79\x42\xc7\xff\x81\xd7\x19\xad\xc7\x57\x89\xed\xb6\xeb\x6b\xb1\x90\x6d\x09\x13\xd6\xe1\xd9\x45\x53\xdb\xcd\x4b\xda\x52\x6e\x55\x7c\x7c\x39\x28\x8f\xdc\xf9\x62\xe7\xe0\xda\x7a\x68\xe7\xb3\xde\x53\xf5\xde\x16\xa8\xfd\x6b\xd9\x40\x99\xee\xb7\xbe\xc6\xdc\xe9\xe7\xee\xb4\x3e\xd1\x7d\x4b\xae\xd3\xb5\xc6\x5d\x5c\x73\xf7\x71\xf1\xf5\x21\xe3\x43\x1b\xbf\xac\xef\x3f\x6d\xe5\xab\x5a\x77\xd1\x40\xab\x4a\xea\x9c\x21\xbf\x57\xdf\x8b\x50\x07\xe5\x69\xca\x4c\x38\xe1\x4a\xd9\x30\xa1\xaf\xb5\x64\x7e\xc7\x3b\xc1\xdb\x36\x4e\x78\x94\xaf\x55\x9d\x6e\x43\x4e\x9d\x21\xa3\x6e\xd7\x2a\xa3\x5e\xcd\x6b\x7f\xf5\xe9\x2d\x87\x8e\x2d\x2e\xf5\xab\x48\xef\x01\xac\x77\x2b\x34\xb4\x6c\xc9\x5b\x9e\xb7\xfb\x87\x54\x5e\x32\x76\x70\x2a\x9c\xb8\xe1\x5a\x1e\x79\xeb\xc6\xee\x49\xca\xea\xbf\xe2\x7f\x77\x4e\x5e\xde\xb9\x64\x96\x5f\xa7\xfe\x3d\x24\xb8\x5e\xf0\x15\xac\xad\x55\xbc\xef\x47\x76\xbc\x53\xd3\x10\xf5\xe4\xf9\x31\x61\x89\x01\xe9\xf5\x8e\xc6\x74\xc2\x95\x88\x41\x8d\xf2\x5d\x91\xfe\x68\xc8\xde\x05\xbb\x9a\x84\xfe\x28\x36\x35\x4f\x53\x36\x49\xd7\xbd\x27\x86\xac\x69\x3b\x60\x6e\x50\x81\xde\x47\x13\x13\xc4\x8e\xa7\x27\xec\x2a\x73\xa2\xd4\xfc\x46\x61\x55\x67\x9e\x08\xc8\x6b\x3f\xf1\x72\x89\xc2\xad\x6f\xae\x8d\x9b\xb1\xa0\xa0\xff\xa8\x07\xbd\x3f\x06\xbc\xbf\x1e\x7c\x2e\x7b\x05\x72\x3f\x2d\xa9\xfc\xc9\xd4\xf8\xdf\x79\xe4\xfa\xe2\xc1\xc5\x2e\xc6\x06\xf7\xb9\xd0\xa4\x55\x87\x93\xe7\xb2\x7b\x96\x9d\xb1\x6e\x71\xe7\xad\x87\xaf\x5e\x3e\xf8\xb8\x62\xb3\xdb\x51\x6b\x73\x63\xff\x46\x8b\x0f\x28\xfa\x3b\x25\x65\x4c\xad\x4a\x31\x93\xa3\xf7\x27\x96\xea\xd9\xe8\x94\x67\x60\xda\xb0\x65\x0b\xb7\x50\x33\xf6\x76\x68\xde\x71\x79\x9e\xd0\x72\xdb\x0a\xb6\x1f\xfe\x23\x70\xfe\x8f\x57\x07\x9e\x97\xac\xf1\x6d\x23\x3e\xb1\x5d\x91\x97\xee\xba\x77\xca\x8c\x4c\xb9\x91\x35\xfb\x6c\xbc\x43\xe8\xae\x63\xdd\x8a\x7c\xde\x53\xc3\x3f\xa5\x67\x95\xbe\xc9\xfe\x45\xa3\xcb\x2d\xb9\xef\x36\xc9\xa3\x15\x36\x1f\x3a\x88\xe4\x5f\xbe\xb6\x60\x9e\xd0\xd7\x70\x24\x1d\x1f\xb0\x21\xae\xe8\xbb\x5d\x01\x4a\xf1\xef\x9f\x30\x60\xee\xe2\x60\x7e\xda\xe7\xd5\x57\xfa\x5e\xea\x47\xf8\x77\x74\x38\x5f\x39\xab\x7c\xf5\xd6\x2b\x3b\xbd\x78\x57\x49\x3c\x34\xd3\xb8\x9b\x58\x1f\xac\x6b\x07\x7e\x6d\x57\xa3\xe4\xb5\xdc\x9e\xc9\xf9\xbc\xb7\xf2\x84\x2a\xf2\xcc\x36\x47\x02\x99\x4d\x13\xcf\xcc\xcc\x57\x34\xea\xd5\xcd\x9d\xf9\xe6\x1c\x79\xbd\xec\xed\x99\x9c\x2d\x07\xba\x0f\xde\xe0\xc9\x71\xf8\xfe\xc7\x45\xcd\xaa\xcd\x8a\xbf\x0d\x87\x35\xae\x15\x9b\xe0\x19\xe2\x37\x9a\x5b\x5a\x27\xfa\xec\x9a\x3f\xa5\x63\x37\x67\x57\x26\xfb\x3a\xfa\x54\xfa\xe0\x00\x7a\x68\xf9\xd4\xae\x1f\x63\x9f\xff\x94\xca\x85\x6d\x4c\xec\xbe\x76\xf7\xe4\x19\x7b\x46\x2c\xba\xf5\x05\xba\x30\xb8\x1b\x96\x27\xf4\x22\x5e\xa3\x6d\x8d\xd0\x76\x44\x70\x54\xf4\x77\x75\xb0\x5e\x8d\x78\x57\x37\x23\x37\xbf\x55\xb1\xdb\x88\x84\x89\x3b\x02\x1b\x5c\x74\xf4\xa9\xfe\xa2\x57\xb5\x23\x13\xc6\x37\x5c\xfe\xe5\xd8\xab\x0b\xe3\x27\x5c\x1b\x5a\x36\xa5\xe9\xad\x39\xe5\x97\xf4\x2c\xfd\xbc\x50\xf1\xeb\x67\x7e\xe6\x09\x1d\xb3\xa0\x5e\xcd\x1b\xfe\x60\x91\xe0\xbd\xe1\x6b\x1f\x26\x6f\x6b\xf5\x36\x92\x28\x31\x63\xea\xa7\x98\x46\x87\xab\x9d\x5f\xdc\xf9\xfd\x8e\x3c\xf2\x69\xc5\x27\x28\xb8\xfc\x3e\x7d\x67\x4a\xf8\xf6\xab\xe9\x5a\xa5\xef\x17\x0f\x5f\x5c\xdf\xb4\x47\x22\x95\xd2\xac\x35\x04\xec\x5b\xee\x74\xd3\x53\x0b\x98\xee\xb9\x03\x29\x35\xe3\x74\xcb\xaf\xe3\xfc\x4e\x54\x1a\x1f\x3d\x38\xdf\xdb\xde\x4b\x9a\xec\x0a\x1a\x91\xb6\xfe\x4d\xf0\xe8\x3c\x4d\x7b\x7e\x8c\xf7\xae\xb9\x71\x71\x4a\xbe\xd1\xd5\xbe\x87\xb8\xc7\x16\xd8\xf7\x4c\x1d\x46\x76\xfd\x5c\xa0\x77\xf6\xc8\x18\x77\xac\x76\x38\xaf\xfd\x99\xa3\xc1\xfb\x45\xeb\x76\x98\x53\x77\xec\xfe\x12\x39\x39\x5f\xbb\x87\xef\xfb\xd6\x6e\xd6\x2f\xb0\xc9\xfe\x5d\x5b\x5a\x0d\xbb\x5c\xc1\x3f\x8f\xdc\xf6\x16\xca\x49\x99\xbd\xe2\x58\x58\x85\xbd\x7f\x0a\xd9\x9d\x7f\x5c\xbd\xdd\x7f\x7b\x89\x90\x84\x23\x9d\xaf\x6d\x0f\xec\x56\x70\xc0\x04\x87\xf5\xc7\x87\xb3\xd3\xae\x34\xfd\x69\x9c\xc5\xf5\x7e\x4b\xab\x4e\xee\xba\xb5\xce\xf4\xb0\xd7\xb3\x46\x27\x36\x6d\x04\x5c\x8e\x2f\x76\xb2\x48\x9e\xd0\x83\xb9\x11\xcd\xba\x68\xdb\xdf\xcd\xdb\xde\x7a\x51\x19\x31\x53\x69\xdb\xbf\x6b\x47\xa1\x42\xc5\x9d\xca\xcb\x9d\x25\x16\xfc\x6c\x18\xee\xec\x7e\xdd\x19\xdd\xd8\xba\xc7\x3e\xed\xfe\x6b\x59\x5b\xb5\xe7\x83\x93\x07\xc4\xd5\xe3\xe1\xfa\x52\xd9\xf0\x29\x7d\xbb\x9e\xb4\x6a\x77\x39\x92\xd7\x7d\xa2\x47\x04\x3c\x3c\xa2\xc9\xd3\x42\x4d\x4b\x67\xbc\xbc\xbc\xf7\xf6\xa6\x77\xf3\x7f\xa9\xf9\x90\xcc\x89\x05\xfe\x9c\xd8\x3a\x6f\x9d\xc3\xf9\x2e\x87\xf6\x0e\x3c\x5d\xaa\x74\xbd\x42\x5b\xb4\x66\x69\xb1\xfd\xa6\x36\xbc\x75\x6c\x75\x48\x0d\xfc\x71\xfb\xa8\x35\x2d\xa3\x9a\x65\x3b\xc6\x93\xa7\x43\xf1\xb6\x03\xc7\x54\xba\x19\x5e\xe6\xc6\x86\x22\x4f\x47\x36\xda\xb6\xeb\x58\xd4\xa7\xe7\x07\xba\x2c\xed\x74\x7e\x61\xb1\xec\xcf\x35\x9c\x9a\x66\xd7\x9f\xd8\x7e\xc4\xd0\xc9\x4b\x47\x08\xf2\xb6\x5d\x47\x0a\xf7\xe9\xf0\xce\xdb\xfc\xee\x8a\xeb\x27\x8f\x57\x99\x57\xa2\x78\xbb\x16\xd9\x0e\x74\x52\x08\x9d\xdd\x98\x78\xa5\x86\xff\x9c\x5c\xb6\xff\x95\xd2\xdf\xce\x15\xc0\x83\xbb\x57\x1b\xb9\x74\xca\xa5\x41\x3b\xb3\x8d\x8e\xa3\xf3\x8c\x4a\x12\x8b\x6b\x7e\x3f\x30\x1f\xaf\x33\xd8\xfa\x35\xb1\xd6\xa2\x66\x7d\x56\x9f\x59\xb4\x95\x3b\xf7\x7c\xc9\xce\x87\x2f\x0f\x0e\x9b\x73\x2c\x4f\xd5\xaf\x39\xec\x4b\xfb\x55\xa3\x8b\x21\x87\xd2\xba\x2a\x73\xc9\xea\x50\xe5\x52\x0b\xee\x57\x88\x2e\x50\xa4\xe6\xe4\x90\x6d\xc9\xb3\x75\x87\x4b\xcf\xe8\xf2\x48\xd7\xb7\x2c\xda\x15\xf6\xc2\xf4\xb4\x20\xe6\x6d\xa8\x57\x69\xdc\xc1\x9e\x6b\x4e\x7c\x49\xaa\xdf\x04\xeb\x51\x95\xef\xe5\x70\x94\xf4\x2e\xb7\xf6\x07\x56\x7c\x00\x1f\x3a\xb1\xa5\xdb\xf3\xfc\x44\xea\x38\xa1\xc3\xaf\x2f\xc9\x2b\x17\xe7\x24\x9e\x1c\x7f\xd0\xaf\x4c\x1e\x99\xf3\xe1\x6b\xc9\x96\x66\xed\xcc\x09\x13\x92\xb7\xcf\x4f\x4f\x93\xa3\xca\x8e\x1c\x97\x56\x5a\x9e\x5f\xa9\xc3\xe2\x9c\x1d\xcb\x2b\xed\x70\x38\xca\xcd\xf2\xa3\xc6\x97\xad\x1a\xb0\x65\xd9\xc4\x8b\xfe\x58\xf5\xe5\x55\x1a\x0c\x03\x57\x8d\xac\xe1\xb7\xd7\x6f\x57\x9b\xba\x35\x27\x15\xe8\x9d\x27\xf4\xcf\xeb\xed\x6f\x5a\x2d\x6c\xdc\x7c\x61\x7d\xea\x42\x83\xcd\xd7\x8e\xc2\x0d\xbe\x5d\xad\xf5\x62\x68\x44\xf7\x2a\xc1\x75\x45\xfd\x52\xa9\xdc\x09\x7f\xa3\xcf\x5e\x95\xec\xb0\xe6\x54\xb5\xe4\x33\x25\xe5\x1d\x11\x66\xd6\xee\xdf\xb3\x9f\x65\xac\x59\x98\xdb\x6c\xfa\xf0\x59\x25\xf4\xa2\xbf\x2e\x3b\xba\x3f\x6b\xf7\xa9\xdb\x85\x5b\xbc\x88\xe9\xbe\xaa\x2a\xfa\xfc\x53\x83\xd6\x83\x13\xe2\x23\x9e\xc5\x1f\x28\xbc\x6c\x0f\x18\xdd\xe4\x71\xaa\x3b\xaf\xfd\x43\x6b\x2a\xee\x45\x42\x92\x86\x6f\x2f\x7d\xa9\x5b\x4c\xc4\xe8\x90\xe9\xf6\xfd\xd2\xf1\xa8\x0a\xd5\xb8\xd3\xb2\xf7\x99\xf1\xc8\xbe\x3c\xf2\xf1\xae\xcc\xf0\x81\x62\x9b\x7d\x77\x8c\x85\xe3\xb6\x29\xf8\xea\x9f\x73\x87\x54\xa9\x51\x72\xde\xef\x9b\x55\x0b\x92\x5d\x8f\xfc\x3c\xe1\x74\x94\xed\xa3\x3a\x64\xfd\xaa\xf0\xde\x06\xbf\x4d\xe9\xdd\xb2\x4b\xf0\xc4\xc6\xad\x5b\x5f\xec\x3a\x34\xe1\x2c\x18\x5f\x6c\xdf\xf2\x26\x59\x92\x03\x1d\x2d\xf5\x18\x5e\xf5\x74\x34\x34\x03\x1c\x30\x6a\x3a\x70\x0c\xf7\x8a\x73\xd4\x67\x23\xce\x65\xae\x48\x78\x1c\xc1\x94\x1c\x6c\xe4\xf5\x7f\x46\x7a\x8d\xa5\x67\xbb\xdc\x9c\x7e\xd1\x7d\xe2\xf6\xfc\x45\xfa\x60\xff\x43\xe3\x8b\xee\x3c\xd9\x3a\xa6\x5f\xfd\x0e\x6f\x7a\x94\x69\x31\xdd\x61\xaa\xc1\x3d\x0b\x28\x21\x63\x13\xe2\xbe\xa7\x95\x58\x3d\xa6\x07\x5d\x3c\xae\x85\xac\xbb\x2f\x1e\x9d\xa9\x1e\xbd\xc1\x8c\x59\xd6\x2c\xe5\xff\xd1\xf5\x05\xfa\x26\x8c\x38\x7e\x24\x7f\x89\x19\x46\x76\x0e\xb4\xb5\xd1\x5e\x66\xf1\xa2\xa9\xe0\xfd\xea\x8f\x76\x9d\xad\xf9\x39\x6c\x5f\xde\x53\x1d\xb1\xbf\xea\xc5\x1a\x8f\xc7\x3f\x7a\x3b\x00\x1c\xda\x71\xca\xf7\x79\xbb\xb4\xa5\x7d\x3f\x57\xee\xa3\xdc\x19\xfd\xbd\x7e\xd6\xe9\x51\x2d\xf2\x6c\x95\x54\x60\x21\xd5\x35\xfb\x41\x40\xc5\x0f\xed\xfb\xdc\xea\xc6\x09\xd0\xe1\xcb\xc9\xed\x5c\x03\xc5\x07\x4d\xbd\x21\xa5\x8a\xed\x30\x1c\x8f\x4a\x3a\x3c\xa1\x46\xbf\xdc\xe6\x60\x95\x9a\xe8\xe0\xc8\x57\xd3\xc7\x8c\x7d\xd9\x20\x6e\xe2\xef\xcf\x55\x2e\x5e\xad\xd2\x3f\xec\x72\xd9\xed\x8e\x81\xaa\x72\xd4\x9e\x63\xfd\x73\x9b\xad\x89\x9f\xc4\x97\xf8\x39\xdf\x15\xb4\xa8\x76\xd0\xe0\x27\x05\xef\xbf\xd8\x72\x2f\xbe\x65\x4c\x8f\x46\x79\xe4\xed\x25\x13\x6e\x82\x89\xdf\xa6\x98\x81\xb9\x8d\x9b\xd4\xdc\x32\xf0\xed\xdd\x4b\x53\xab\x3d\xb9\x7e\x32\x7e\xec\x44\xbc\x15\x05\xa4\xe7\xde\xf0\xff\x77\xe1\x61\x6c\x64\xe8\x78\xbf\xc0\xb8\x3c\x13\x2c\x2c\x1c\x7f\x66\x8a\xf0\x20\xe0\xd4\xbb\x01\x9a\x31\xa3\xe2\xb4\x9e\xdf\xe6\xa6\xaf\xcb\x5a\x1e\xec\xae\xff\xa8\x41\xdf\xf4\xec\x99\x79\x3a\x6c\x7c\x91\x5b\x1b\x0f\x2c\x7e\x6c\x53\xcf\xa7\x9d\x33\xd2\x7e\xea\xa3\x0f\xaf\x2c\xf8\x3d\x6b\xea\x93\x1a\xf3\xe6\xbf\x2c\x13\x7c\xb7\x87\xe3\x69\xc5\xd5\x3c\x53\xa4\x90\x90\xf9\x57\xed\x8f\x3c\x78\xbe\xd2\x3a\xd0\x3f\x61\xbc\x4e\x54\x08\xfc\x51\xa0\x97\xb2\x62\xdf\x43\x60\xb2\x03\xad\x3e\x62\xfb\x23\x7b\x47\xbf\xe9\x99\x53\x33\x77\xe1\xbf\x3a\x2c\x62\x6a\x37\xbb\x9a\xfa\x28\x71\xfa\xf4\x33\x8b\x06\x46\x87\x37\xce\xcd\xbd\xee\xff\xef\xa2\xd9\xd8\x0e\xa1\xc0\xc4\x3c\xb9\x2f\x22\x33\x1b\x8d\x9a\x17\xdc\x48\x7d\x3a\x12\xbf\xed\x0d\x5c\x1d\xda\x3f\xf0\x63\x42\xdf\xeb\x05\x4e\xfc\xd8\x18\xd0\x73\xc8\xc1\xa2\x0e\x15\xca\x7c\xe9\x32\xed\xf6\xd0\xb9\xb3\x0a\x3f\xab\xb8\x62\xe6\xd0\x3e\xc5\x36\xf7\x16\x3a\x55\xf8\xf4\x70\x80\x70\xa9\x4b\x8f\xb2\x95\xe2\x87\x39\xd0\x8d\x8d\x02\x56\x8e\x3d\x34\xa4\x67\x95\xcd\x83\x2f\x5f\x1f\xf8\xb1\xbf\xb0\xfa\x58\xfb\xe4\x1f\x1b\x12\x77\x6f\x1b\xf1\x60\x39\xb4\xa2\xba\x03\xad\x3a\xee\xdc\xc0\x96\xd5\x8a\x76\x0a\xdb\xd7\x3d\xb5\xfc\x90\x53\xe1\x7d\xf8\x57\xf8\x94\xf7\x77\x62\x8e\x96\x7d\xf0\xb1\xde\x37\x22\xee\xef\x47\xf6\x4f\xd1\x67\x6c\x44\xf5\x44\x3f\x47\xcf\xd8\xef\x9f\xf3\x6d\xba\x31\xe5\x56\x4a\xf1\x35\x14\xb8\xe5\x7a\xf2\x74\xee\xc6\xfe\x79\xc5\xae\x05\x05\x95\x7c\xf1\x29\xff\xb8\x9c\x73\x0e\x1d\x72\x5f\x94\xdf\x17\xb8\xb0\x78\xf5\x87\x3d\x9e\x76\x6e\x90\xf8\xe5\xfb\xeb\xfa\x3f\x18\xab\x7f\xdc\xb9\x73\x7b\x1f\x45\x1f\xe8\x51\x69\xa6\x03\xbd\xd8\xea\xde\x9e\xaa\xd1\x0d\xa4\xfd\x2b\x85\x15\x67\x3a\x5d\x5c\xa7\xef\x1c\xf5\xbe\x6e\xfb\x09\x65\x8e\xdf\x6c\xdd\xf4\xe8\xc7\x98\x70\x07\x9a\x8c\xbd\xf8\x38\xeb\xdc\xc3\x9c\xca\x8d\x07\xa8\xcb\xba\x67\x9d\x6e\xd4\xe5\xc2\xc4\xd1\x41\x33\x87\xd8\xc3\x8f\x0e\xac\x8a\x47\xbe\xca\xbd\x11\xf0\xef\xa2\xd5\xd8\xc8\xc0\x7c\xa1\xa1\x93\xf2\x9c\x31\xdf\xdc\x25\x1b\x4f\x94\xda\xd4\xfc\xc3\xa5\xc6\x92\xfc\xd7\x37\x3e\x24\xd4\x1a\xc2\x3d\x70\x5f\xcb\xd9\x90\xcf\x9c\xde\xa0\xed\xbb\x3c\x67\xfc\x2d\x8f\xae\x0c\xa5\x05\xaa\x01\xa5\xaa\xc5\x1e\x18\x59\x65\xcd\x83\xc8\x8c\x3f\xc2\xf9\x2f\xab\x8f\xbf\x69\x58\xee\xe0\x8b\x1d\xef\x1d\xea\x6e\xb8\x5a\x72\x2d\xee\x29\xfe\xb8\xd7\x95\xa7\x68\xaf\x0f\x4d\xbb\xce\x6e\x83\x77\x2e\x37\x69\xeb\xb0\xe6\xe3\xb7\xcc\x4d\x2c\x18\xd9\xc1\x81\xf2\xfc\x8a\x97\x2d\x0a\x2e\x7e\xa3\x67\x0e\x98\x7f\x23\x6a\x13\xf1\x9e\x19\x5b\x37\x1b\x6d\xf3\xa9\xec\x58\xf1\x51\xf9\x8c\x5d\xbf\x1d\x13\xc2\xc4\x03\x7d\x3d\xab\xe7\x00\xcf\x4b\x42\x2d\xbb\x9c\x29\x33\xea\xe4\xc1\x56\x83\xa7\xbe\x9c\xb2\x29\x6b\x8d\x5d\xa3\x70\x9b\xb5\xef\x22\xf2\x54\x8d\xd7\x1b\x27\x5e\x79\x39\x6e\xe4\x80\x75\xe5\xbb\xa6\x9d\x69\xa7\x46\x5f\x05\xbf\xec\xbf\xdc\x68\x23\x3f\xa0\x03\x1c\xb0\xfc\xc5\x26\x47\xfb\x31\x43\xbb\x8c\xb9\x33\x61\xf2\xa6\x12\xc7\x02\x32\xdb\x31\x0d\x16\xa6\xee\xab\xb9\xe7\x65\x93\x2d\x63\x1f\x5f\xa8\xd5\x6f\x5b\xd6\xc9\x41\xb9\x13\x03\xfe\x5d\x80\x15\x1b\xd9\xc1\x6f\xaa\xff\xa4\x3c\xc9\x41\x27\x16\x22\x19\x13\xcf\x21\x87\xa5\xd5\x67\x2e\x7f\x5d\x78\x7e\xdd\xc5\x6d\xf5\x03\x2b\x52\x09\x9d\xee\x4e\xdc\x93\x3f\x7c\x6e\x33\xe7\xac\xd4\xf0\xd1\x81\x32\xde\x7d\x4f\x93\x5e\x35\x39\x27\x55\x39\xfa\x32\xe7\x45\xfe\x64\xe4\x45\xa1\x2e\x5b\xc3\x8a\xc4\x14\x9e\x38\xfd\x9b\x03\x3d\x56\xfb\x43\x4a\xce\xf9\x05\xfb\x97\x3e\x0c\x65\x0f\x7f\xdb\x58\xe0\xed\xee\xc0\xeb\xc9\x3b\xd5\xfa\xb5\xbe\x49\x41\xd5\x81\xcd\xce\xf7\xfc\x64\xc1\xda\xef\xd7\x0d\x7c\xdc\x45\xea\x96\xe5\xf2\x3f\x92\x70\xee\xd6\xe6\x76\x7b\xd2\x7a\xd6\x6b\xd8\xbb\xed\xde\xce\x55\x76\x34\xcb\xef\x40\x2f\x6f\x7a\x18\xd5\xeb\x6a\xf9\x25\xe3\xc6\xcc\x7e\xbc\xe0\x5e\x6c\xdd\xe2\xa7\x95\x6d\x51\x1b\xab\xa6\x37\x4d\xbb\x35\xf7\x6b\x8d\x75\xca\xdf\x6f\xce\x3f\xc5\x59\xb1\x11\xed\x8e\x06\x39\xde\x9c\xbd\x3d\xcf\x9f\xce\x37\xfb\xda\xa9\x2b\xf4\x91\xf4\x9b\x50\xb3\x99\x67\x6b\xec\xfd\x59\xed\xd8\x94\x0d\xaf\xc6\x06\xc4\xfe\x7c\x6d\x0e\x76\xbe\xe8\x8f\x1e\x9c\x0a\xee\x71\xfd\xda\xb8\xdc\xdb\x71\xc3\x1b\x94\x5e\x1f\x5d\x7c\xc6\xcd\x87\xd7\x9b\x5c\x58\x07\x94\x39\x3d\xf1\x18\xdb\xda\x81\x7a\x4a\xfd\x2a\x90\x31\xfc\x68\xe2\xc6\x4c\x6c\xa1\x51\xff\x5a\x6e\xca\xef\x8e\x5d\x0a\x4f\x5f\x3d\x69\x5d\xc0\x8a\x3f\x67\x27\x2d\x79\xe4\x40\x5b\xba\xcf\x1f\x9a\xf2\xb8\x94\x77\xfd\x85\xea\x05\xcf\x6e\x7a\x69\xfe\x5a\x52\xf3\x76\x42\xab\x21\xd3\xc0\x21\x97\xee\x9f\xbe\x36\xa5\x44\xee\xad\x80\x7f\x17\x97\xc5\x46\x36\x2c\xef\x57\x7a\x4a\x9e\xe4\x62\xad\x2e\x14\xc5\xeb\x41\xc7\xc0\xb5\xc7\xb3\x90\xab\x8f\x7a\x11\x59\xfc\xf4\xc4\x69\x3f\xd6\x1a\x72\x51\x6c\xd8\xda\x15\x29\x0e\x25\xca\xf7\x6b\xbc\xf3\xfc\xc3\x67\xe2\x8c\x09\x19\x0f\x5b\x2d\x0b\x7c\x12\xfb\x74\x54\xab\xa1\xd3\xc9\xfc\x07\x2a\x4d\xe6\x1a\x29\xe2\x79\x07\x3a\x31\xb5\xd3\xe8\x22\xa3\x6a\x57\x7b\x38\xb7\xed\xa8\x31\x20\x59\xe9\xec\x98\x40\x2b\xe2\xc6\xfb\xd6\x27\xea\x75\xe9\x94\xd3\x62\x4b\x5d\x07\x6a\xac\xbf\x56\x35\xb3\xf6\xfd\x94\x01\x90\xec\x97\xef\x51\xb5\x53\x61\x2f\x07\x84\x4d\x4b\xbe\x1a\x35\x62\x6a\x4a\x81\x15\x97\x4b\x34\x76\xa0\xbb\x0f\xc6\x26\xbf\xbc\x15\x9e\xb2\x6c\xd2\xb8\xee\x51\xdb\x3a\x3f\x7f\x5f\x76\xee\xce\xe0\xa3\x9d\x87\xcd\xbe\x7a\x69\xd2\xba\x7a\x04\xec\x40\x77\x74\x38\x32\x6c\x5f\x8f\xd9\xcd\xc6\x55\x5c\xfd\x00\x99\xf4\xac\xc4\x92\xc4\xc1\x35\x0b\x7d\x5f\x41\xd5\xcd\x60\xfb\x90\x5d\xdf\x8c\x73\xa0\xdf\xb7\x35\x4e\x4c\xbe\xbb\xfe\x4b\x9b\x32\xf8\xba\xa1\x45\xc3\x7a\x65\x37\x1c\xba\xae\x95\xdf\xfc\x61\x3d\xdf\xcd\x9f\xd8\xb7\xdb\x6b\x33\x37\x39\xe0\x5f\x06\xb2\x11\x91\xc5\x23\x1d\xaf\x8e\x7c\xa2\xf5\xc5\x06\x7b\x4f\x07\x51\x49\xf5\x86\xba\x8a\xa6\x9d\xa9\xb6\x13\x3c\x55\x75\x50\xf8\xe5\xfd\x35\x66\x37\x0b\x4d\xab\xb3\xca\x31\x28\x84\x94\xdd\x56\xb0\x6a\x95\xc2\xe2\xbb\xc9\x9b\xa0\x16\x75\xee\x29\x73\x52\x16\x85\x8e\x08\xda\xa3\x76\xfa\xc5\xbe\x1d\xb3\x70\xfb\xf3\xbc\x41\xa1\x13\x36\xb8\x68\xdf\x4a\x93\xf6\xf6\x26\x06\x9c\x9d\x55\x22\x72\xf7\xa7\xd4\x16\x55\xbb\x35\x0e\xed\xbd\xe0\x58\x1b\x64\x5c\x8a\x7f\x43\x47\xc7\xfa\xe7\xbb\x5c\x60\xde\xaf\x1b\xa9\x45\xfa\x2d\x19\xb0\x77\xce\x19\xf7\xc0\x5e\xbd\xca\xdd\x98\x3a\x16\x3b\xb1\xfd\x9a\x15\x34\x37\xbe\x8a\x03\x6d\xb8\x70\x49\xe2\xcd\xec\xd0\xde\x3f\xb2\xc3\x07\x9e\x83\xdc\x85\xe3\xef\xbc\x7a\xce\x96\x84\x47\x6c\x15\x37\xb5\x58\xb2\x68\xb0\x73\xa8\xf9\x82\xcc\x2c\xba\xbc\xdf\x3b\xa4\xdc\xe4\x69\x3f\x03\x2a\x1c\xd9\xdb\xb9\x69\xa9\x29\xf7\x03\x6e\x5c\x77\xd5\xae\x53\xeb\x4f\x26\xd6\xf8\xef\xa1\xe6\x9f\x22\xbf\xd8\xc8\xc8\x50\xbf\xd9\x0e\x7b\x95\xba\x67\x9b\xf1\x5c\x85\xa0\x1e\xc9\xc3\x0b\x7e\xed\x58\xbd\x59\x70\xa7\x92\x8f\x5b\xc0\x6b\x17\xd6\x7a\x90\xb4\xf8\x49\xe3\x55\xeb\x9d\x33\x89\x6e\x8d\x0d\xf9\x76\xa4\x4b\x83\x62\xe7\xb7\x5f\x58\xa3\x56\x42\x3e\x1e\x5f\x7b\xe1\x79\xf9\xe1\x9d\x97\x74\x79\x77\xfe\xd7\xfe\x7d\x0e\x74\x32\x1d\x55\x09\x7d\x76\x23\x7e\x91\x2b\x63\x18\x7d\x7a\xc3\xbc\x94\x46\x21\xdb\x52\xa7\xf6\xbd\x7e\xbf\x0e\x1d\x15\x34\x4d\xb9\xeb\x40\xc1\xae\x13\x4a\xee\x89\x54\x0a\x3c\x92\x72\xbf\x4d\x39\x79\x20\x71\xfe\xf2\x88\xd9\x03\xfc\xa1\x6e\xde\x7c\xa9\x25\x56\xc4\x46\x75\x76\xa0\x6f\x97\xf9\x23\x5d\x43\xdb\x36\x28\x12\x53\x01\x6f\xe1\x79\xf8\x34\x50\x3b\xfe\xbc\xf9\x86\xa6\x07\xb4\x8c\x0e\x2b\xef\x0c\xed\xbd\xfb\x6f\x2b\xfc\x53\x50\x1b\x1b\x19\x54\xc8\x2f\xd4\x61\x85\x96\xf5\xc3\xb5\x2f\xbb\x7e\xe7\xbc\xdd\x31\xea\xf3\xc6\x1b\xcd\xaf\x1c\x79\x1b\x6d\x67\x56\x0b\xda\x0f\xad\x1b\x1d\x77\xbd\x33\x88\x3b\x94\x10\x1e\x74\xdc\x37\xf8\x4a\xe1\xae\xf9\xe2\xb2\x0e\x34\x9d\xbf\xf9\xc6\xf0\xe0\xcd\x67\xc2\x1b\x3e\xba\xde\x7a\xa2\xff\x98\x8a\x47\x2f\xd4\x71\xce\x65\x6d\x5f\x2d\x9e\x31\xe6\x72\x46\xcb\x32\xb2\x2b\x6c\xce\x1a\xaa\x74\x3d\xad\x41\xd3\xd7\x0d\x4f\xaf\xb4\xfa\x74\xdf\xbb\xa0\xcd\x7c\x07\x3a\xe1\x50\x9b\x29\xa9\x43\xfe\x9a\x64\xd6\x86\x13\x17\x36\x79\x34\xb9\xda\xc7\x3d\xcb\x32\xc6\x55\x1c\x34\x4c\x9b\xf9\xe0\xe4\x94\x65\x1b\x1c\xe8\x8b\x75\xb9\xc5\x67\x5f\x3b\xf4\xd1\xd8\x25\x7a\x2a\xce\xee\xfd\x64\xd2\xf6\x09\xf1\x75\x66\x8f\x5b\xb5\x7d\xe4\x8f\xf8\xc8\x1f\x4b\x1e\xe6\xc6\x05\xfc\xcb\xc8\x3a\x22\xb4\x88\x73\xd6\xe9\x85\x2a\x19\x65\xf3\xfb\x55\x1c\x10\xd0\x3c\xfe\xd7\x8d\x49\x4b\x67\x7c\x7f\x3f\xf5\xfc\x93\xec\xc2\xb3\xe5\xd8\x4f\x83\x8f\x6e\x9d\xe2\xd0\x61\xec\xf0\xc7\x43\xfa\x87\xad\x3f\x04\x4c\x49\xda\xfa\x33\xa8\xce\x83\xe7\xf9\xf7\xef\xdd\xba\xf2\x65\xf2\x78\x26\x29\xb1\x4f\xdb\x7d\x1d\x1d\xe8\xa2\xad\x5b\x5e\xfc\x3a\x27\x6f\xbe\x3b\xa7\xcd\x1a\x20\xf7\x7d\xd9\x5f\xad\x0a\xfd\xf5\x86\x6d\x14\x40\x4b\x3b\x8b\xd4\x5e\xff\x70\xad\x03\xad\xf5\x6c\x7e\x40\xbb\xb0\x8e\x3b\x9e\x8c\x79\xb4\xfe\x7a\xad\xb7\x4b\x17\x46\x6c\x3e\xbb\x2a\xab\x58\xfb\xb6\x2b\xea\x8f\x2f\x44\x84\x3a\xbd\x66\x47\x4a\x4e\xa3\x8c\xfa\x19\x7b\x72\x1a\x6f\xb8\x73\xd7\x55\x6d\x46\x9b\x96\x55\x66\x64\x18\xb7\xfa\xbf\x7d\xa4\x41\x15\x83\xcb\x86\xe7\x66\xfd\xdf\x1a\xa2\x7f\xda\xe6\x8a\x8d\xfc\x32\xe6\xcf\x91\x45\x95\xf3\x44\xd7\xdb\x95\xb4\x75\xf5\xa5\xcb\xc9\x11\x93\x1f\xce\x2a\x6b\xf7\xe4\xf8\x1a\xb9\x47\xf7\x54\x45\xaa\xfe\x4a\xed\x53\xe1\xc9\xba\x67\xf5\x9d\x8b\x97\x69\x9f\xfa\xfd\xd2\xe7\xdd\x19\xb8\x7b\xdf\x27\x31\x66\x79\xe7\x5a\x61\x8b\x94\x67\x35\x0e\xdf\xb0\x9a\x55\xfd\x51\x21\x79\x2a\xd6\x35\x4f\x2a\xf3\x46\x8a\xdc\x34\x26\x7e\xfb\x98\xd6\xdd\xab\x8c\x8d\x73\xdf\xde\xbe\x33\xe4\xdc\x19\xef\xc6\x2e\xdb\x9a\x85\xdd\x7f\x03\xa4\x47\x3b\xa5\xa6\x85\x6f\xcf\x28\x3b\x39\x7b\x96\x2b\x2e\x7a\xc8\xb7\xc4\x5f\xb7\x9a\x3d\x9e\xd1\xe9\x66\x7a\x73\x7e\xdf\x80\x1e\xae\xa8\x22\x31\x7b\x9d\x7b\x58\x4d\x3b\xe6\x1b\x91\x52\x78\xca\xda\x2b\x6b\x3e\x92\x3b\x9f\x6f\x5e\x51\x71\x6c\xb1\x13\x8b\x88\xb2\x71\x23\xcf\x95\x3c\xd0\x80\x3f\xe5\x40\x5b\x35\xe4\x5a\x60\x6d\xca\xe7\xec\xe0\xf5\x6e\x43\x9f\xd7\xbf\xdf\x21\xf7\x68\xe1\x16\x09\x43\x87\x55\xbf\x32\x7b\xd6\xe7\xd1\x05\x08\x07\xba\x1f\x7b\x09\x2e\x39\xdb\xa5\xa4\x34\xe4\xc6\xb5\x88\xdc\x69\xf7\x53\xea\x2a\xf9\xc8\x62\xb1\x5b\x7f\x95\xbd\xef\x75\x9f\x7c\x7f\x2c\x6f\xf9\x54\x28\x5f\xd1\x87\x85\x27\x6f\x4c\xcd\x6c\x32\x1d\x5c\x7d\xbb\x67\x44\x85\x9d\x55\x06\x95\x98\x56\xf2\xca\xbe\x8a\xab\x97\x18\xeb\xc4\x5f\x79\x63\x68\xfd\x2f\x89\xb1\xd5\x9e\xdf\x08\xd0\x8e\x94\x9c\xe9\xa9\xb5\x36\x6a\xd5\xc5\x87\x05\x4e\xa7\x5d\xba\x54\x83\x9d\xd8\x67\xd8\x94\xc3\xe1\x79\x64\xd7\x93\x01\x3d\x3f\xbe\xf5\xef\x58\xaa\x88\xff\x97\xa1\x15\x8c\x92\x29\xe9\x1f\x4a\x6e\x31\x76\x8d\xaa\x3b\x64\x53\xc2\x0b\x89\xa9\xeb\x18\xc2\xcb\x56\x9a\xf8\x70\xd9\x99\x77\xed\xbb\x4c\x8c\x5b\xed\xaf\xf7\x2a\x53\xab\x4e\xdd\xf2\x37\xfa\x1c\x28\xfc\x5e\xaa\x76\x4d\xdc\xb8\x6e\x78\x9e\xd0\xe3\x9b\x7b\xad\x48\x6a\x7b\x72\xc8\xc4\x53\x47\xa1\xeb\xe0\x80\x69\x7f\x96\xb4\xe3\xb2\x93\x86\x3f\x39\x7f\xe9\xee\xe3\x0e\xf7\xd6\x39\x13\xdc\x7b\xca\x25\x2e\x65\x56\x77\x2a\x3d\x9d\x8b\xeb\x78\x30\xa2\x59\xf7\x39\x83\x8b\xde\x07\x4a\x57\x28\x74\x65\x42\x42\x21\x3c\xf5\x63\xd7\x3c\xa1\x97\x12\x5b\x1b\xc2\xef\xce\x13\xde\xa4\xdd\xb8\x99\xd8\xbd\xf1\xd7\x81\xdd\x1b\x01\x8d\xaa\x3e\x5b\x3d\xff\xe1\x29\xb2\xad\x5f\xbb\x71\x79\xe4\xdb\xdf\x2f\x2a\x16\xb1\x5b\x2f\xfe\xf6\x30\xff\xb7\x22\x99\x50\xef\xec\xb5\xd3\x0b\xa5\x2c\x0e\xef\x10\x1f\xbe\xe9\xcb\xe1\xbb\x0f\x54\x87\x6b\xa7\x57\xfc\x3e\x18\x6d\xbe\x04\x8a\x88\x5d\xdd\xf4\x4c\xc7\x57\xb9\xbf\x7b\xf5\x6e\x7f\xef\x54\xbe\xa0\x8a\x83\xd6\xdc\x9c\x90\xb2\x77\x9a\xa3\xfb\xe5\xdf\x8d\x59\xbc\x0c\x4f\x59\x53\x77\x2c\xf5\xb0\x6b\x9b\x1b\x53\x7b\xa7\x05\x74\x98\x5e\x72\xc7\xdd\x43\xeb\x55\xcf\xcc\x1a\xeb\x1d\x9a\x0e\x1c\x05\x16\x8f\x59\x9f\x80\x65\x66\xbf\x6a\x3e\x6e\x84\xbc\x6e\x72\xc5\xfd\xef\x99\xa7\x55\xe9\xca\x2b\x6b\x7c\xe9\x70\x30\x71\x84\xa3\xfd\x6b\xf5\x6b\x5f\xb9\xbc\xc6\x53\xf0\x75\x85\x4f\xee\xa2\x97\x8a\x95\x09\x18\x3d\x6a\x58\xd8\xb2\xaa\xf9\x3e\x96\xbb\xba\x0b\x9b\x7e\x26\xcc\xe9\xa9\x85\x19\x77\xf7\xf5\xbd\x63\xd4\x0e\x33\x1f\x36\xab\x5b\x7d\xfc\x90\xaf\x01\x89\xdb\xb7\xc8\x07\xf8\xe2\x55\x0b\xcc\xaa\xb9\xfa\xe7\x7d\x07\x1a\xcd\x24\xcf\xfe\x51\xac\xca\xad\x63\xdd\x26\xac\x7e\xfa\xe5\xf6\x0a\xa9\x32\x7e\xbf\x7f\x58\xc7\x01\xcf\x5e\x34\x2f\x7c\x74\xea\xfc\x42\x79\xf6\x17\xd7\x9a\x27\x7a\x3e\xeb\x3d\xc3\x3f\xb0\xe1\xdc\xcc\x1f\x5f\x26\xb5\x5a\x5e\x7a\xdc\xf5\xc0\x27\xaf\xda\x7e\xd8\xb4\x73\xff\xa1\xf8\xca\x79\xbd\xf2\x78\xcb\x0e\x46\xaf\x90\x35\xab\x73\x76\xf1\xf4\x92\xa7\xdf\x3f\x5d\x1b\xd2\x35\xff\xce\xb4\xa6\x54\xc1\x13\x4f\x3b\x2c\x10\x89\x3c\xf2\xee\xc1\xf6\x5f\x57\xcd\x9d\x4e\x79\x73\x4e\x3e\xdf\x79\xf5\xac\x58\x24\xc0\x73\x08\xce\xd8\x38\xb4\xf0\xbc\xdc\x22\x7d\xb3\x17\x36\x72\x18\x75\x64\x14\x78\x67\x46\xf9\x82\x1f\x47\xbf\x9d\xb8\xc0\x6a\x1a\xbd\xb5\x72\xfb\x73\x2b\xf4\x61\x95\x54\xbf\x4f\x63\x67\xc6\xf1\x15\xdf\xe6\x09\x3d\x1b\x7f\xb7\x5a\x12\x3f\xa9\xfc\xc3\x4d\x0a\x30\xe1\x64\x4e\xa5\x12\x7f\x96\x8d\x3d\x48\xae\x5f\xfe\xa2\xeb\xa2\xe7\x71\xf6\xaf\x3d\x0e\xa3\x32\xe1\xa7\x1f\x4d\x3d\xd2\xe9\x87\x67\x59\x42\x5a\xa3\x12\xd3\x17\x6c\x7b\x91\xfb\xd5\x7e\x93\x7c\x6f\x79\xcb\x8b\x91\xe3\x7b\xc5\x56\x77\x1a\x75\x6e\xb7\x16\x91\x5d\x66\x06\xf5\xdf\x25\xd6\x3c\xb2\x18\xa8\x56\x67\xf5\xc1\x7a\x3d\xad\xda\xd7\x93\x4a\x7d\x5d\xb1\x31\xf1\x6c\x78\x70\x9e\xa5\x2a\x1f\xdc\xd5\x9e\xfb\x93\xf3\xf5\x75\xfc\xe9\x5b\xfe\x6d\x8b\x34\xa9\x77\xbc\x44\xef\x96\x8b\x6b\x0f\x2b\x65\x22\xe9\x4f\xd2\xa3\xd3\xf3\x54\xad\x72\x6b\x0a\x3f\xff\x6e\x1f\xcf\xf5\xac\x1e\xde\xab\x83\x89\x19\xf8\xf3\x15\x4d\xf7\x0d\xe9\xb3\x78\xf0\xe1\x7e\xb1\x7a\xbe\x87\x8e\x17\x65\xf7\x84\xee\xe1\x2b\x1b\xac\x7a\xfd\xa1\xfd\xdc\x03\xef\xf3\xed\x6a\x12\xd3\xfc\x9c\x7d\x36\xf6\xa7\x7d\x6b\xc4\x9b\xb1\xb5\xca\x55\x8c\x72\x6a\xda\xaf\xd8\x9b\x79\x09\x73\xb2\xf2\x2f\x7c\xb2\xa3\xef\x87\x61\xd2\xc1\xc8\xfb\x8c\x78\xee\x4e\x7c\x54\x84\xff\x84\xc4\x8c\x33\x27\x0b\xe6\x19\xf5\x4e\xc5\x89\x7b\xcb\x4c\x66\x2c\xa0\xda\xd4\x9f\x7b\x0a\xe7\xbb\xb4\xac\xdf\x00\x6e\x59\x93\x07\xf6\xae\xb7\xd5\x5c\xed\x87\x19\xaf\xf2\xda\xff\x59\xb8\xd1\x5c\xba\x4d\xc3\xc1\x77\x3a\x87\xde\xac\xb1\xb7\x41\xaf\xf0\xe1\x1b\xa6\xaf\x1e\x33\xeb\xe8\x87\x4f\x47\x9f\x3e\x8d\x0f\x8b\x71\xb6\xbf\xfc\xec\x82\xd6\x5b\xa6\x22\xfa\x91\x6e\x45\xe3\xb3\xca\x08\xfb\x4f\xa7\xf6\x3c\x32\xa4\x54\xc2\xe5\x01\xcc\x5d\xb9\x6f\xca\x5f\x51\x79\xed\xa7\x75\x5f\x8c\x79\xee\xa6\xbc\xea\x6f\xbf\x98\xe3\x27\x8e\x2d\xf6\x68\xc7\xa2\x14\x6a\xa0\xc8\xb1\x15\xe6\x1f\x59\x88\xb6\x1f\x96\xd7\xfe\xa3\x94\xea\x07\x67\x06\xf7\x41\x27\xf5\x7d\xbc\x76\xc4\xa7\xd7\x05\xab\x5f\xeb\x77\xa9\x6c\x14\xf4\xe8\xf1\xd0\x5c\xa6\xcd\xb1\xcd\x85\x9d\xed\x77\xdb\xb4\xe4\xb3\x58\xe5\xa5\x1d\xb1\xa8\xc7\xcd\x46\x6a\x82\xb4\x60\xfb\xeb\x01\xd1\x59\x55\x52\x46\xf7\xa0\xdf\xb5\xd9\xba\xf3\x90\x23\x23\x39\x7e\xd4\xd6\xc5\xb3\x67\x76\x2c\x51\xa5\xfd\xda\xc5\xc9\x53\xb1\x57\xa5\x91\x31\x1b\x22\xbd\x75\x5e\xf2\x75\x0b\x7c\x38\x19\xdf\xc7\xd1\x7e\x8d\xea\x1f\xfa\x5e\x9d\x32\x27\x6a\xfa\xe8\x6c\xba\xf8\xba\x8f\x61\x56\xe5\x91\xe1\x67\x62\xef\x97\x8b\xef\x99\xbe\xef\xe7\xf4\x24\xc7\x40\x95\x6f\xcd\x29\xae\x43\x72\xdb\xfe\xb8\x7f\xe2\xf5\xd2\x07\x07\xf7\x78\xb7\xb0\x6e\x8f\x72\xa3\x9a\xbc\xea\xf3\x7a\xc8\x63\x6f\x28\xd6\x20\x4f\x68\x31\xf6\x73\x2a\x7d\x16\x09\x8e\x9f\xd2\xea\xf3\xde\xd4\x2a\x0f\x03\x17\xee\xad\x9d\xfe\x7a\x77\xcc\xf1\x93\xed\x0b\x57\xe9\x91\xb0\x2d\x8f\x44\xfa\x34\xea\x75\xea\xe8\xca\xd7\xdd\x92\x2e\xac\x62\xaf\x1e\x6d\x76\xa2\xc4\x84\x55\x71\xf7\xf6\xac\x9d\x39\xe6\x4b\xf1\xc2\x1b\x67\xfc\x76\x34\x0f\xfc\xf8\x90\xfb\x2e\xbc\x77\xfe\x71\xef\x1f\xdf\x4d\x6f\xcf\xdc\x39\x1e\x1e\x9e\x5d\xef\x88\x55\xa9\xc0\xc5\x20\xe1\x75\xa1\x11\xbb\xf2\x84\x86\x77\x4e\x6f\x5c\xbd\x79\x68\x70\x91\xc4\x71\x5a\xca\xbe\x31\xa5\x83\x7e\x57\x98\xb6\x7e\xfb\xfa\x62\x9f\x06\x72\x3f\x0b\x96\xf4\x52\x0e\xef\x4b\x0a\x99\x72\xf6\x7d\x46\xed\xe0\x85\xc9\xa7\x12\x6b\x17\xeb\x76\xf0\x6b\x2b\xd6\xf2\xa4\x8b\x01\x4d\xe3\x8e\x5d\xf8\xb2\x6b\x63\xee\x4d\xff\x7f\x37\xf3\xc6\x46\xfa\xfb\x85\x86\x38\x96\x93\x71\x1b\xc3\x2e\xae\x5e\xbc\x96\x2c\x30\xa2\xd2\xf0\x62\x89\x98\xe2\x79\xb5\xc4\x9a\x55\x78\x55\xe8\xe6\x22\xef\x2e\xfd\x08\x64\x86\x38\x97\x93\x57\x96\x1f\xbd\x5b\x3c\x6b\xb2\xd1\xfe\x70\xc5\x92\xc3\x52\x96\x6e\xe9\x58\x39\x5f\x83\xc4\x92\x34\xd5\x6e\xd3\xf2\xb2\xe9\xd9\x85\x1c\x68\x89\xcf\xb7\xeb\xef\x7c\x99\x96\x54\x21\x7f\xa9\x98\x3a\xcb\xdb\x04\x1f\x6b\xf2\xfb\xfc\x93\x47\x77\x22\xdf\xe2\x8d\x2e\x5f\x4a\xbf\xe4\x1c\xd7\x23\x3e\x9e\x9b\xfa\x45\x9a\xe6\x1f\xd5\x65\x77\xd5\xcb\xcd\x93\xed\xc9\xc5\x53\xe6\x3f\x2a\x71\xed\xe8\xb5\x0e\x75\xd6\x15\x73\xfb\x9f\xf8\x7b\xa1\xfc\x4f\xd3\x7f\x6c\xc4\xf8\x21\xce\x14\x93\x3b\x25\x78\xcc\xb9\x53\xa3\x23\x0e\xa4\x8c\x68\xfe\x28\xaa\xd6\xaa\x2d\x3f\x93\xcd\x62\xd5\x86\x78\xab\xde\x6b\x94\xcd\x07\xbc\x72\xa6\x00\xae\x15\xcd\x1e\x5a\xcb\x53\x0b\xc8\x6c\x5d\x65\xd0\xc4\xd2\xe2\xf6\xd4\x1e\xec\x99\x2f\x80\x64\xbd\x2e\x5a\x6c\xfb\x05\xff\x61\x33\x1c\xe8\x99\x93\x71\xa3\x9a\x34\xf9\xb1\xa3\xd0\xa7\xb8\x0d\x1b\xea\xcf\x98\xf2\x7b\x55\xfd\x98\x5f\x54\xb5\x79\x8d\x8a\x36\xdd\xb7\xd5\x8d\xd7\x73\xa0\x6d\xa3\x33\x2f\xaf\xcf\x6e\xf2\x28\xd0\xaf\xf3\x1d\xfe\x43\xa9\xd1\xbb\x4a\x2a\xc8\x64\xbf\x79\xb9\x31\x03\x36\xbc\x7d\x33\xa7\x46\xc1\xdc\xad\x01\xff\x2e\x5a\x89\x8d\x6c\xe7\x5f\x20\xd0\x91\x62\xba\x13\x5b\xf0\xe0\xe0\x73\x61\x23\x8b\x07\xfc\x55\x7d\x52\x8b\x3e\xfd\x42\xfa\x75\xa9\xd3\xf4\xc2\xbb\x96\x55\xd6\x0e\xde\xb5\xe8\x50\xd9\x52\x79\x8e\xf3\xa2\xfd\xd5\xaa\x13\xcf\xf2\x07\xda\x66\x3d\x28\x89\xe4\xff\xe5\xad\x1d\xe5\xb1\x90\xcf\xf5\xa8\x46\xcb\xd8\x1d\xab\xc1\x1d\xce\x58\x7b\xd6\x5f\x53\x3b\xe5\x7e\x6c\x3c\x30\x6a\xf2\xe6\x9b\x53\x1a\x65\x4b\x27\xde\xc7\x57\x3c\xe6\xaa\xff\x6e\x7f\xdd\x97\xab\x66\xa5\x0e\x7d\xee\x40\x3b\x04\xbc\x31\x4a\x0f\x64\xe7\x25\x25\xad\xac\x1a\x7c\x23\xe3\xf4\xa5\x6d\x0d\x12\x77\xa5\x54\x99\x3d\xae\x5d\xa5\x0e\x6f\xe6\xec\x6c\xeb\x40\x73\xb4\x5e\xfb\x13\x4f\x7f\x1c\x15\xdc\xd3\x7e\xb9\x79\xfb\xd5\xa3\x7f\x4d\xc9\x6d\x71\xb1\xc7\xc2\x19\x71\xd0\xf7\x88\xa6\x9b\x5a\x9f\x76\xa0\x85\x69\x70\xcc\xe1\x5b\xdb\x56\x95\x8d\x4b\x1d\x7c\xac\x68\x66\x60\xe9\x45\xa1\xf3\x46\xfd\x38\xf9\x00\x4f\xdb\x25\xb7\x2b\xd5\x74\xd8\xdf\x59\xd4\x7f\x0a\xd9\x62\x23\xa6\x06\xf9\xc5\x39\x7c\x3c\x28\x2d\xc2\x6f\xe8\x08\xba\x6b\x42\x1d\x8a\x3d\x16\xbd\x2d\xa7\x58\xf1\x13\xcf\xe7\x2f\x98\x9f\x1b\xdd\xf3\xe1\xa6\xa0\x0f\xd9\x8e\x59\xce\xba\x30\xec\xfa\x99\x01\x77\x96\x4f\xd1\x5a\x43\x31\xf9\x7b\xa9\x8f\xba\x2f\xee\xfd\x6d\x49\x8e\xf1\x6a\xec\xe5\xc1\x0b\xe3\x06\x34\xcb\xb3\x6c\x56\xe3\xdc\x87\xc7\xcb\x28\xf3\x37\x74\x78\xbd\xf9\x25\xf5\xf3\xf0\x9a\xd4\xa4\xc4\xa8\x92\x7f\x64\xcd\x95\xb6\xa6\xed\xb4\x88\x6b\x4e\x73\xb5\xcf\xdf\xb5\x0c\x3c\x76\xf9\xf0\x53\xc5\x4e\xcb\x67\x4b\xed\xee\x5f\x63\x81\x36\xb8\xd6\xeb\xce\x0b\x5a\xd6\x69\xb7\x24\xe3\x76\x8b\xbf\xdf\xde\x7f\x0a\x30\x63\x23\xc7\x8f\xf7\x9b\xe8\xf0\xf1\xf8\xfb\x43\x27\xbc\x4c\x4e\x8d\x1b\xb4\xa3\x4a\x94\x71\xea\xc8\x75\xed\xc3\xa0\xba\xea\xc0\xf8\xcd\xe3\x4e\x15\x79\xd5\x7c\xd7\x69\xe7\x3e\xcd\x96\x52\xeb\x3f\x7d\x19\xb6\xbf\x67\x11\xec\x44\x99\xac\xdd\xdd\xa6\x3f\xc7\x0a\x60\x87\xbb\x7d\x98\x36\x6d\xc6\x90\x06\x85\x5e\x54\x2c\xe3\x40\x87\x2d\xee\xb5\x78\x9f\x11\xb4\xa4\x53\xc7\x58\xe8\xe2\xa3\x76\x7d\xe4\xb6\xe5\xb1\x2e\x57\xcb\xc4\xb4\xdb\xdd\xef\xe8\xd7\xa6\xc9\x09\x0e\x54\x69\x3d\xf3\xf4\xb0\x43\xe3\xdf\xcc\xad\xb3\x80\x6a\xd1\xa8\xc5\xea\xe5\xf3\x53\x33\x89\xaa\xb3\x92\xf6\x7c\x13\xd7\x76\xdd\xbc\x72\xd5\xdf\xcf\xec\x9f\x42\xa2\xd8\x88\xd0\x60\x3f\x47\x4a\x5f\xf3\x2b\xf9\x33\xa5\x7f\xe8\xa5\xed\xbc\x54\xb0\xf4\x8b\xd9\xd6\xfa\x92\x75\x76\x64\xcc\x2b\xf5\xbb\x67\xbe\x94\x6b\x8f\xec\xbe\xf3\xf3\x1e\x44\x6e\x7a\xdc\xcc\x15\x85\x83\xc8\x21\x2d\x6b\xaf\x2d\x12\x7a\xbf\x13\xba\xb2\xd3\x93\xb9\xad\x9b\xbb\x1f\x6c\xb8\xb6\xc7\x04\xba\x1a\x0e\x6d\xef\xf4\xfc\xe2\x17\xf3\x32\xe7\x4f\xbb\x47\xd7\xc6\x57\xff\xd5\xff\xf8\x23\xa9\xee\x9b\xe2\xa1\x2d\xfb\x7d\x25\x0b\x6f\xf9\x36\x7a\x7b\x96\x03\xad\x58\x7f\xcc\x82\x03\x83\xc2\x3f\xc6\xff\x0e\x7d\xef\x2d\x96\x75\xa0\xe4\xf5\x8e\xcd\xa8\xc2\x9f\x4f\x92\x95\x47\x0d\x4d\x18\x52\xe0\x7e\xee\xf6\x7c\xff\x2e\x80\x8b\x8d\x9c\x52\xdc\x1d\x38\x2d\x4f\x32\x3d\xab\xff\xf2\x2f\x13\x5e\x24\xa3\x47\xde\xbb\xee\x2e\x9f\xf5\xe8\x56\xb3\xcc\xd4\x6b\x5b\xe6\xdd\xf9\xb3\xb7\xc5\xd6\xe1\x49\xa3\x93\x1c\x4a\xf4\x88\xfe\xd5\x7b\x54\xb7\xd5\x29\xdd\xeb\x16\xb2\x2f\xce\x49\x2f\x74\x28\x7a\x5c\xe9\x9e\xd7\xc2\xfa\x27\x2f\xac\xf5\xf0\xc9\x89\xc7\xcb\x1c\xe8\xf3\x98\xc8\xd0\x88\xe9\xc1\x59\x7b\xfe\x14\xae\x90\xa1\x04\x84\x96\x18\x3b\xdf\xaf\x48\x8d\x12\xc7\x26\x8e\x89\xe9\x78\x7a\x15\x2b\x39\xd0\xa8\x25\x83\xf8\x95\xb5\xeb\x9f\x34\xcc\x67\x2d\xcb\x95\xee\x35\xf7\xcb\xf7\x9c\xa4\x97\x85\x7e\xaf\x2f\x5c\xc2\xec\xd2\x7b\x47\xd3\x46\x0e\xb4\x57\xc1\x1b\x55\x4b\x9c\xa0\x97\x3e\xf6\x5b\xc6\x36\xae\xb2\xbc\x68\xa1\xf4\xd4\x51\xbb\xcb\x75\x38\xee\xe5\x99\x11\x7c\xcb\xf1\xad\x9c\x03\xe3\xeb\xae\x1f\x9b\xbf\x58\x75\x8e\xdb\x72\xb8\xdc\x9d\x59\x47\x4e\x6e\xbd\x33\x79\xf1\x95\xd4\x11\xe5\x0a\x05\xb7\x4e\xeb\x39\x76\xe0\x6b\xe7\x8b\x7e\xbd\xeb\x5f\xaf\x47\xea\xad\x2f\xc4\x4c\x1c\xd5\xad\x72\xeb\xdc\x9f\xeb\xb6\xb1\x21\xcb\x06\xbd\xd9\x3d\x74\x47\xb3\x92\x99\xa8\x73\x22\xd9\x3b\xe9\x5d\xe3\x3b\x4a\xfb\x16\x91\x53\xcb\xeb\xb3\xab\x8d\x00\x36\x5d\x5b\xa7\x7a\xc2\x8f\x3e\x95\xf7\x3c\xe7\xce\x98\x97\x9d\x29\xcc\xda\x4b\xde\x7c\xab\x88\xf7\x59\xd1\x70\x7c\xf5\x92\xad\xb5\xb1\x03\x52\x7b\x9e\xa9\x7b\xbb\xce\xf8\xb8\xf5\x4f\x9b\x2e\x5a\x3a\xbb\xed\xe1\xbf\x13\x00\xff\x14\x48\xc6\x46\x8c\x2f\x9e\xe4\x48\x00\xac\x6d\x33\x7c\xf0\xd3\x82\x8f\xd4\xde\x13\xab\x36\x0c\x39\x9b\xd5\x0c\xf9\x82\x1e\xfd\x51\xeb\xf3\xbc\x36\x43\xaf\xde\x95\xa3\xeb\x39\xd7\xdf\x2f\x7a\x27\x16\x6d\xeb\x8e\x4c\xfa\xfd\xbb\x99\x7c\x33\xeb\xcb\x36\xa3\xb8\x5a\x64\xe9\xc3\xee\xad\xde\xae\x78\x1a\x93\xde\x3f\xb3\xa7\x03\x8d\xdc\x7d\x6d\x7f\xe3\x43\x25\xcb\xbd\xcd\x99\x70\xac\xf8\x84\x4b\xb3\xda\x83\xfe\x6b\xf3\x0f\x6f\x73\xa9\xe9\xe4\x41\x4f\xf6\xcd\xed\xff\xd2\xb9\xaa\x67\xd6\x05\x29\x89\xf3\x33\x60\xff\x4e\x1d\xf6\x96\x90\x9e\xd7\x0b\x8e\x3b\x75\xfe\x42\xe3\xd2\x5b\x9a\xe6\xef\x52\x38\xf3\x51\x53\x07\xba\xae\xcb\xbb\x5b\xee\xb2\xc4\xcb\x29\x7f\x3e\x98\xbb\xc3\x7a\xad\x1c\xd1\xf1\x57\x8f\x05\xdb\x17\xff\x29\x9e\x39\x05\xf3\x34\xaf\x54\xe8\x6f\x23\xfc\x63\x8c\x1a\x19\xe0\x17\x34\xd5\x31\xd4\xec\x2a\x54\x73\xe5\xd7\x95\xcb\x90\x94\xe8\xea\xdb\x89\x45\x56\xb1\x77\xeb\x46\xf4\xbc\x3e\x68\xdd\xb7\xf7\xf7\x37\x2f\x3a\xf0\xe1\x4d\x71\x87\x12\xd3\x07\xb6\x8e\x90\x92\x92\x12\xca\x6f\x59\xbc\x83\xec\xd4\xf9\x19\x6d\x0e\xdd\x34\xae\xca\x9b\xeb\x05\xcf\x8d\xac\xf4\xee\xa4\xe1\x4c\xce\x7a\xf8\xa0\x0a\x41\x77\x6a\xb4\xe8\xef\x1f\xe3\x4d\x0b\xdd\xbd\xa0\xe2\xd7\x26\x0b\xab\x4d\x6e\xbe\x70\xcd\xa7\xfb\x61\xad\x5b\xcd\x14\x1d\x43\x33\x37\xa0\xb7\xdd\xa1\xde\x41\x20\xbc\x6c\xbf\xcd\xad\xbb\xf5\x0f\x17\x6f\x4f\x3c\x5a\xbe\xe6\xb5\x53\xe1\x59\x6b\x7a\x21\x8d\x77\x38\xd7\x9f\xb7\x97\x9f\x09\x2e\x15\xf9\xf8\xc7\x80\xb0\x0e\x3b\x1a\xee\xdb\x1e\x79\xc9\xbb\x11\xae\x9d\x1e\x99\x3f\xfa\xd8\xf2\x6d\xc7\x6e\xce\xfa\x3b\xa4\xf8\xc7\x40\x39\x22\xb0\x78\xa4\xc3\x06\x23\x7f\x8f\xd8\xb1\x75\x53\x99\xdc\x58\xdb\x2e\xf1\xeb\x59\x7d\x6c\xe7\xc5\x55\xbb\x9f\xff\xc8\xec\xb4\x23\xd0\x3b\x6f\xf9\x91\xfc\x85\x1d\x1d\xeb\x24\xf6\x1f\xc1\xf3\x17\x9e\xfd\x2a\xd3\xb8\xf3\x77\xee\xcb\x4d\xf1\xc9\x0a\x1c\xfd\x78\xbe\xe3\xde\xd7\x67\x2f\x24\xe4\x7a\x05\x07\xfa\xb9\xf6\xb7\x4d\x7b\x13\x97\x3e\x6f\xff\xe1\xf2\x8e\xae\x3f\xca\xf8\xd5\xde\xba\xfa\xe6\xb2\x19\xcb\x52\x97\x4e\x2a\xf3\xae\xc9\xae\x87\xc7\x9c\x9e\x70\xaf\x73\x52\xf1\x27\x1f\x36\x05\x52\xdb\xc3\x56\x2c\x60\xbb\xcd\x88\xa9\x33\xb2\xed\x8a\xb4\xbd\xdb\xb8\x56\x5b\xeb\x8c\x78\xfe\xea\xef\x99\xe4\x1f\x43\xf0\xc8\x76\x7e\x7e\xb2\xa3\x6b\xfb\xfd\x86\x2f\x1e\xd3\xdf\xef\xed\xab\xec\x9d\xd1\x75\xab\x41\x57\xdf\xcf\x2e\xd6\x7a\xd9\xa5\xf9\x76\x1d\x76\xf3\x2a\x94\x8e\x39\xe9\x50\x82\xb6\xda\x3e\x6e\x78\x7f\x75\xc9\x2b\x4b\xaa\x7f\x69\xb5\xa2\xd6\x9c\x61\xc7\x77\x03\x52\x1d\x2e\xe7\x41\x4e\xcc\xc0\x2d\x51\x59\x6d\x1c\xe8\x61\xfe\xd2\xca\xe6\xd7\x86\xe7\x5e\xf8\x75\xb0\xf3\x25\x38\x3d\xf3\x53\x76\x44\xc1\x9c\x37\x69\xeb\x5f\x8e\x57\xe7\xa7\x3e\x4e\x75\xa6\x7d\xc7\x59\x7d\x9e\xec\xd7\x7a\x9d\xf4\x3e\xad\xb1\xb2\x55\x72\x41\x25\xb9\x64\xc8\xc9\xb7\x44\xd4\x0e\x3c\xe0\xc6\xce\x5b\x89\x2f\xb7\xe7\xfe\x29\xf1\x3f\xe0\x3f\x95\x5d\xc7\x46\xfe\xf9\xf3\xe3\xcf\xa2\x6a\x79\x11\x79\xed\xcc\x72\xb3\x9f\x0e\x8c\xfc\x46\xee\x7a\xdc\xef\x4d\xb1\x87\xbb\xc6\x9d\xbf\x7a\xbe\x6e\x98\x7e\xf8\x1c\xde\xc2\x2f\xf6\x3a\xe6\xd8\x21\x5f\xb8\x1c\xb6\xba\x14\x25\x1b\x96\x7d\x9e\x13\x19\xe2\x59\x69\x3d\xfe\xb9\xbc\x5c\xfc\xfb\x0b\x15\x92\x12\x7a\x84\x37\x4e\xdb\x74\x30\x8f\x7c\xb7\x63\xc3\xbe\x2d\x03\xc3\xf8\xd5\xf3\x8a\x2b\xfb\xc6\xbc\x5e\xa5\xf3\x21\x65\x57\xde\x6a\xde\x27\x80\x79\xfa\x65\xc4\x5f\xbd\x27\x3b\x16\x04\x41\xd1\x8f\x2e\x4b\xfa\xc6\x25\x27\xbe\x9d\x2c\xf3\x28\xf8\xd3\x92\xa3\x5f\x8e\x10\xef\x69\xb6\xd2\xe7\x82\xb2\xff\xb2\xe0\xc5\x87\xf2\x84\x06\xd7\x7c\xdd\x98\x3c\x36\xef\xe4\xcc\x72\xc9\x5d\x87\x75\xd8\x5d\xfc\xc0\xf8\x8b\x57\x1e\xae\xbe\xf6\xd7\xb3\x22\x33\x89\x75\x35\xb6\x6d\xcc\x23\x69\x77\x70\xc0\xb5\xf8\x85\x3d\x3a\x55\xd1\x8f\x8d\xae\xf8\xb4\xfd\xe2\x11\x19\x93\x22\x56\x88\x45\x16\xd5\x29\x13\x9d\x54\xea\x63\x3e\xc7\x7b\xd3\xe5\x7d\xd4\xe4\x7d\x2f\xb5\x92\x7f\xa5\xb5\xd8\x79\x73\xcc\xd6\xa0\x86\x18\xb3\xab\xbb\x5b\x24\x57\x4e\x2f\x22\xb8\xe5\x23\x1d\xf3\x84\x9e\xdb\x30\x66\xef\xeb\x9c\x2e\x31\x1f\x2f\xab\x3d\xd2\xc6\xd7\x6a\x15\x5b\xbc\x65\xc3\x75\xfb\x96\x35\xd8\x3b\x22\x75\xf2\x73\x53\xde\xe2\x10\xda\x75\x50\x81\x6b\xd5\x2e\x4f\xa8\xde\xe4\x4d\xce\xb9\xb0\xb8\xa5\x8f\xbe\x96\xff\x54\x3f\x7a\xf3\xef\x1f\xc3\xf6\x86\x06\x35\x3e\xdb\xac\x62\x9e\x50\x2e\x64\xee\xc5\x2b\xea\x8d\xf5\x7b\xbb\xce\xf4\xf6\x83\xb6\xe4\x3f\xb1\x76\xc9\x93\xa7\x4f\xca\xdc\xc4\x7f\x1c\x3a\x7a\xe4\x47\xf7\x10\x67\x09\xe5\x89\x2a\x65\xa7\x0d\x2c\xb2\xa4\xdf\xf5\xeb\x57\x16\x5e\x69\x1a\x78\xbc\x54\xf9\x8c\x75\xca\x8f\xd1\x8b\x8f\x04\x9e\xad\xd5\xbc\x6e\x74\x9e\xd0\x39\xcc\xf0\xc5\xdf\xd3\x3a\x24\xbd\x11\x73\x67\xbf\x69\x79\xb0\x69\xd3\xe3\x37\x03\x6a\x2c\x51\x4a\x04\xbd\xbd\xfc\xa0\xd6\xfe\xc2\x9e\x3c\xf2\xbe\x77\x71\x7a\x74\xe6\xb2\x37\xdd\x81\xd2\x7d\x4f\x1c\xb5\x89\x35\x7e\x6d\x6b\x0b\xbd\xdb\x86\x8c\x6b\x7b\x09\x23\xa3\x0e\x38\xcb\x53\x5a\xbe\x5d\x9f\xf0\x33\x3a\xeb\xc2\x73\x61\xd5\x8d\x27\x9b\x22\xf7\x24\x0f\xf1\x8e\xc8\x9c\xd4\xb3\xc9\x9b\x95\x5f\x0f\x95\xd4\x4f\x3a\xaa\x08\xa6\x55\x9b\x30\x7f\x42\x62\xad\x96\x71\x31\xd9\x77\x46\xe6\x3b\x3a\x75\xed\xd8\xb1\x5b\xc7\xec\x7c\x5e\xde\xaf\x56\x4a\xf7\x9e\x8b\x13\x81\x3c\xf2\xe1\x0a\x6c\xdc\xdb\x3f\xcf\x88\xe4\xd2\xe5\x47\x9e\x69\x11\x11\xb5\x64\x54\xe6\xb1\xa7\x9b\xa7\xdd\xfe\x50\x7f\xdd\xa7\xaa\x60\xa1\x64\xe7\xb2\x79\x01\xa3\xf5\x3f\xf8\x79\x5e\x42\x85\x6d\x33\x94\x9e\x23\x9a\x76\x7f\x92\x7d\x31\xac\xce\xe2\x96\xd1\xbf\xef\xaf\x3e\xf3\x34\x3a\x79\x81\x03\x7d\x7f\x6e\x50\xff\x3e\xe4\xb3\xeb\x7b\xfc\x2f\x9f\x2c\x5b\x2d\xb6\x7c\x74\xc5\x4f\x47\x76\xb7\xf9\x54\x65\xdc\x8c\xc9\x87\xac\x5f\xeb\x83\x1c\x68\xe7\xe7\x70\x93\xcb\x3d\x0b\x75\xcf\xbe\x99\xb8\x32\xe4\xab\xb4\x64\xe4\x9f\xfd\xc9\xcd\x26\x2c\xf4\x3b\x54\xca\xdd\x2f\x37\xb7\x13\xea\x40\x7f\x79\xdb\x36\xfa\x7a\x69\xd6\xef\x99\x57\x95\x66\xad\x66\x14\xd8\xa4\x30\xa9\x07\xba\x0e\xa8\xf5\x71\x02\xd4\x75\xe3\xee\xa5\xd7\x2a\x3a\x2a\x23\x33\xd3\xba\xee\xeb\xf1\x10\x9c\xb8\x7b\x4a\xfe\xdf\x65\x4b\x87\xd2\x1f\xef\xbc\xef\x31\x3b\x74\xc8\xb2\xe8\xd6\xed\xb3\x8e\x32\x74\x9e\x01\x36\xd5\xb3\x16\xfd\xbe\xdd\x22\xcd\x3f\xa2\xd2\xa8\xe8\xe9\x57\x36\xdc\x31\x77\x6f\x88\xde\x9e\x7c\xa2\x53\x5c\x3d\x6b\x0e\xd4\xb6\xb6\xd3\x00\xef\x9b\x26\x7e\xbb\x70\x7a\xcd\x50\x63\x60\x76\xbd\xa0\xca\x9b\xcb\xde\x9e\xf0\x60\x64\xee\xea\x27\x6d\x0a\x5d\xef\x5f\xaf\x58\xce\x91\x01\x79\x83\xc5\xc1\xcb\xeb\xe7\x7c\x29\xdb\x66\xde\xda\xfd\xe7\x7a\x9c\x0d\xdc\x86\x04\x94\x7f\x58\x6c\x68\xb1\x02\xcf\xb3\x80\x39\xc5\xab\x84\x5f\x38\xe4\xcc\x5b\x8d\xb1\x7a\xed\xc8\x9a\x3b\x8b\x8d\xee\x1c\xf8\x57\xa1\xe9\xea\xba\xe4\xc3\xd4\x97\x9b\xdf\xdd\x7f\x96\xf4\x5a\x49\x9e\xfa\x0b\xcf\x53\xf5\xc7\x36\xd7\xd6\x17\x1f\xca\x57\xab\x3c\xbc\x44\xc7\x6f\x4b\xeb\x2d\xbc\x7a\xe6\x6d\x56\xea\xd6\xce\x0b\x94\xb6\xd5\x67\x1f\xb9\xb3\xf4\x99\x53\xd5\xc0\x56\x09\xd7\x4e\x7e\xc7\x47\xc1\xdb\x0b\x56\x89\x18\xb1\x26\xf0\xc6\xba\x07\x39\x85\xb3\x57\xc7\x86\x7d\xf3\x9b\xff\x74\xcc\x3c\x39\xaf\x7d\x77\xfb\xf0\x5f\x13\x97\xf5\x9d\xc1\xae\xf4\xcb\xb8\x7f\x64\x56\x89\x86\xb3\x5f\x8f\xe9\xf7\xf3\x7c\xfb\xa3\x4f\x33\x0a\xbd\xaf\xa7\x64\xe5\xb5\xbf\xf7\x03\x34\x25\xb3\xea\x01\x7b\xe1\x99\xf0\xa9\xf5\x31\x6c\xe7\x46\x6c\xe3\x9b\x67\x3b\xe3\xfe\xf8\x3f\x1b\xa5\xdc\xec\xb2\xf2\x81\xa3\x53\x07\x97\xf6\x01\x27\xdd\x1e\x3c\xe5\x37\x1f\x42\x7d\xa8\xe9\x19\x52\x23\x7f\xb7\xc0\x99\x39\x4f\x92\x9b\x54\x06\xf2\xc9\x81\x64\x95\x3c\xa1\x2f\x83\xad\xd6\xcd\xb9\x67\xd5\xbb\xbd\xad\xf8\xf3\x50\x76\x48\xf9\x9c\x46\x7b\xba\x1e\x1f\x52\x60\xb1\x7e\x39\x66\xcf\x3b\xb8\x51\xa0\xc3\xff\x07\xb3\xd4\x1f\xab\x5e\xd9\x9e\x6d\x4f\x27\xdc\x89\x38\xf9\xbb\x5c\xe8\xfc\xe2\xed\xea\x5f\x02\x66\x7f\x78\x79\xa9\xc4\xf9\x1e\xac\xe2\xa8\xf9\x71\xf5\x5a\x3d\x9a\x8c\xaa\xd7\xf6\xc4\x91\xe8\xe8\x1e\xdb\x46\x6c\x3e\x93\x71\xf0\x68\xd2\xc4\xf4\xb2\xdb\xd1\x81\x95\x1e\x0c\x2a\xe4\xf0\xff\xe2\xab\x77\xf7\x28\xb3\x7b\xeb\xa3\x79\xc7\x0a\x87\x64\x7c\xfd\x36\xfb\x66\xcc\xae\x22\x0d\x32\x8a\x3e\xbc\x6b\x96\x28\xbf\x71\xe0\x17\xa7\x4d\xc7\x5f\xbd\x50\x35\x31\xf4\x44\xca\xd7\xf2\xef\x8a\xec\x18\xd3\x75\xfb\xd7\x45\xd5\xc0\xa0\xd2\xc0\xf4\xec\x41\x33\xfb\x9d\xa9\x17\x6c\xe5\x3d\xfe\xe1\xef\xf2\xe7\x3b\x77\xa9\xf7\xde\x77\xdc\xd7\x75\x4d\xa3\x9b\x8a\xed\x8f\x25\x33\xf9\x12\xea\x26\x16\xcb\x20\x0b\x27\x1d\x3b\x90\xe4\xb0\xd4\xa8\xb8\x29\xda\xe3\xce\xbd\x9e\x2d\x9a\xe7\xc7\x56\xf4\xa7\x66\x3f\xf8\x0b\x58\x54\x74\x40\x6c\xed\x9c\x65\x61\x57\x06\xb9\xda\x55\xcf\x53\x75\xec\x4c\x70\xf1\x87\x6a\x51\x49\x71\x59\xa7\xe7\xe2\x3d\x22\x16\x6f\xd9\xd2\x7c\x54\x10\xef\x7f\xae\xf5\xde\x5f\xed\x9a\xed\xb9\xb1\xdb\x61\xa9\xda\x51\x27\x87\x9e\xa8\x32\xb0\x0d\xb4\x67\x7b\xfb\x3f\xc0\xca\xcb\x7e\x4d\x89\xb0\x3f\xf3\x8a\x5c\xba\xba\xf5\xe6\x95\xac\x84\xb4\x9a\x79\x42\xbd\x01\xc1\x39\xad\x56\x75\x1c\xf0\xc2\xff\xd1\xac\x80\xc8\xb4\x09\xf1\x13\xb7\xbf\xfa\x95\x10\xda\x25\xee\xed\xaa\x07\x15\x3e\xb0\x3d\x1c\x41\xcb\x80\x65\xe1\xac\x30\xb5\xf4\x96\x83\xfd\x07\x7c\x6a\x67\xf7\x4e\x18\xdc\x95\xbe\x19\x34\xf6\x78\x87\x96\x85\x6a\x56\x77\x75\x72\x4e\xc0\x01\x6b\x7f\x76\xb8\xfe\x7d\x5b\x23\xbe\x4e\xeb\x80\x8b\x35\xc6\x0e\xdc\x77\x7e\x67\x68\xa3\x94\x3b\x4b\xdc\x65\x77\xcd\x5d\x58\x6d\xa3\x73\xf9\x5d\xbe\xcd\x86\x5c\x71\x7a\xa3\x90\x47\x91\x03\x7a\x45\xd6\x22\xb1\x0f\x4d\x56\xe6\x9b\xb4\x28\xac\xd1\x99\xae\x21\xb9\x67\xb3\xfc\x29\xa7\xfd\x9f\x94\xcc\xb8\xc9\x36\xcc\x7c\x78\x7c\x0c\xb4\xb4\xea\xc4\x84\xac\x1e\x97\xde\x4d\xf8\xd9\x79\xda\xc3\x42\xb5\xc5\x2d\xeb\x86\x78\x1e\x39\xd0\xf4\xe9\x4d\x96\x9d\xeb\x72\xeb\x33\x83\xa1\x13\xfb\xae\x5a\xc9\x7d\x3e\xfa\x60\x52\xe5\x15\x0d\xeb\x55\x3b\x7b\x71\xed\x86\xae\x6d\xbe\xe4\x29\x80\x06\x97\xbb\xf6\xb2\xcd\x8c\x9f\x9d\x44\xf6\xfd\x96\xe1\xc3\xae\x24\x65\x94\x7d\x95\xb2\xfe\xe1\xbd\x2e\x2d\x0f\xc5\xd4\xab\x73\xde\xb9\x83\x37\xee\x50\x01\x76\x44\x78\xb1\x69\x9d\x12\x72\xdb\xfe\x89\xe8\xf9\x22\x7b\x1a\xf2\x81\xfd\xb3\xfe\xaf\x23\x09\x5d\x47\xe5\x56\x6b\x75\xdf\xf1\x54\x2f\xbe\xce\xf1\x4c\xc6\x86\x2c\xd8\x77\x01\xa9\x39\x5f\x88\x48\xdb\x52\xfb\xe8\xc8\x9c\x2d\xca\xca\x95\x85\xfb\x26\xf7\x1f\xd1\xa8\x75\x9e\x59\x3f\xb8\x9e\x82\xc7\x66\x59\x5a\x53\xab\x2a\xff\x21\x02\xdb\x90\x38\x69\xd5\xc5\xa8\xe5\x8d\x87\x55\xeb\xb8\x75\x6e\x44\x62\x8f\xff\xa7\xe2\x97\xce\x8a\x66\x4b\xd4\x6f\xd5\xae\x09\xec\xf7\x74\xcc\xa3\xcc\xcc\x9b\x23\x3b\x8e\xd2\xdf\xe6\xff\x74\xec\xe1\x5a\xe6\xe4\xbc\x9d\x77\xf3\x1c\xa0\xa6\x9f\xe7\xd7\xe6\xd4\x8a\xe7\x1b\x5d\xcc\xad\x9a\x62\xcd\xde\xd6\xa9\xdc\xf3\xef\x63\xbd\x4f\x9b\x6e\x38\xfe\x4a\xea\x55\xfa\x64\x0d\x47\xbd\x75\x68\xe2\xbd\xd4\x52\x74\x89\x3f\xfd\xd2\xe5\x93\xbd\x0f\x97\xad\x79\xa8\xe7\x98\xb9\x2d\xab\xf7\x09\xcc\x2a\x4d\xf4\x1b\x5a\xaf\x9d\xc3\x55\xf8\x5d\x4d\xc7\x3f\xd9\x7b\x72\xc8\x5c\xbb\x64\xfb\x80\xad\x0d\xc6\x7e\x0c\x3b\xf2\xec\xed\x82\xa3\xb3\xcc\x3b\x5f\x33\x86\xbe\x33\xfe\x8e\xed\xfe\x69\x9e\x88\x8d\xf4\x0f\x0c\x0d\x75\xc4\x76\x39\x1d\xcf\x4d\xa8\xf6\x07\x4c\xa9\x91\xe8\x57\xab\xf2\xc8\x36\x02\xd9\x49\xe9\xad\x35\xb9\x14\xf3\xa4\xd8\xab\xab\x1f\xde\xee\x74\xd6\x55\x6c\xb2\xd6\x3f\x6d\x58\x3a\xe5\xf6\xd0\x4a\xc3\x7f\xb2\xcb\x57\x6d\x99\xb2\x37\x78\x6d\xc5\xa7\xa1\x59\xad\xfa\x27\xb5\x78\xbd\xaf\x7b\x88\x03\xcd\xc7\xfd\xf5\xe3\x6b\x4e\xed\xaf\x83\xd4\x69\xdf\xf6\x0b\xf5\x0e\xf5\x7e\x99\x56\xf3\x46\x83\x0f\x81\x0f\x8a\x06\xcb\x8d\x7b\xad\xd5\x1d\xe8\x9f\x3f\xcb\x1a\x16\x4c\x79\xf0\x15\x19\x96\x7f\xd3\xfc\xbe\xed\xfb\x34\x1c\xfb\xf6\xf0\x5f\xeb\x0f\x97\xad\x72\x76\x4a\x93\x05\xcb\xab\xdd\xfb\x3b\x20\xff\xa7\x79\x2d\x36\xd2\xbf\x5d\xa8\x33\x4d\xb0\x5b\x1a\x76\xb1\xc4\x9e\xc9\x41\x0b\x56\xbd\x18\xd1\xa2\xcf\xb2\xeb\x3b\xfa\xbd\xe8\x58\x33\xa8\xe6\xb6\x5f\xcf\xfe\x0c\x4b\x18\x3c\xdd\x91\xc0\xbf\xd8\x61\x59\x58\x99\xed\xb3\xd3\x06\xfa\x6f\xd9\x96\x32\xaa\x5a\xd7\xdc\x09\x9b\x0f\x66\xf6\xeb\x54\x7a\x91\x38\x7b\xd6\x97\xd5\xeb\xab\x39\x57\x92\x37\xef\xdc\xda\x76\xed\xed\x90\xed\x29\x2d\x76\x08\xa5\x6f\x37\x55\xaa\x43\xf3\x80\xf2\x42\x4d\x25\xa9\xd4\xf9\x9c\x85\x8f\xe6\x38\x97\xb2\xb7\x88\x29\xb6\x38\x27\x25\xb3\xd2\x82\x49\x3f\xff\xec\xff\x3d\xee\xaf\x83\x35\x87\xac\xbb\xd1\x76\x90\x3e\xb2\x64\xe1\xf4\xb7\xda\xdf\x3d\xfb\xa7\x69\x38\x36\x72\xbc\x5f\x68\x80\xa3\x67\xbd\x57\x78\x32\x97\x22\x6b\x17\x7d\xbb\xfc\x17\xb1\xb9\xc6\xc6\xad\x62\xd6\xd8\x9e\x3b\x3b\xec\x7e\x07\x95\x6c\x1a\xb5\x3f\xed\xb3\xc3\x71\x1e\xe7\x7f\x1b\xb5\xa6\x5f\xcb\x12\x3f\xd7\x56\x35\x73\x8b\xf5\xab\xcd\x36\x77\xf7\xa9\x5d\xd0\x20\xa6\x53\xaf\xe2\xa7\x43\x77\xe7\x39\xd4\x4d\xf5\x66\x24\xca\xc2\xbd\x07\x65\xef\x4d\xe8\x11\x5e\x3c\x6e\xcf\x00\xac\xef\xfa\xf3\x0d\x5a\x71\x8d\x42\xbf\x06\x77\xad\xf2\xc7\x59\x8a\x82\x75\x9d\x8c\x6e\x44\x0e\x8b\xdc\xfc\x36\x5b\x8b\x6d\x09\x7b\xdb\x49\x87\x16\x20\x8c\x3c\x96\x2e\x5c\x7a\x5d\x8d\xb1\x27\xc1\xbf\xdd\xf1\x1f\xa3\x86\x48\x7f\xbf\x80\xd9\x0e\x77\xac\xea\xde\xbc\xfe\xfd\x87\x7e\x2f\x0a\x6e\xec\x74\xa7\xea\xad\x91\xf0\x10\xd7\xf3\x5b\x9f\x8b\xdd\x3b\x37\x7e\xc8\xed\x3f\x85\xab\x3c\xaa\xe9\x50\xe2\x87\xdf\x8a\x87\x85\x4a\xde\x58\xd5\x73\x88\xdf\xee\xcc\x55\x39\x71\xee\xf4\x81\xcf\xd3\x2c\x95\x9b\xb7\x3a\xbb\xa2\xdd\x45\x76\x2e\x92\x83\x07\x84\xae\x0e\x71\x6f\x29\x50\x71\x6a\x26\xdf\xaf\x6d\x58\xcb\x42\x65\x93\x33\xaa\x35\xbb\x5b\xe8\x47\xc1\x5e\x03\xaa\x04\xb8\x4a\x3b\xd0\xab\x13\x3f\xdc\xbc\xfd\xe5\x5c\xe6\xc6\x43\x2b\xa6\x31\x42\xe0\xd8\xb6\x37\x4f\x6f\xdc\x53\x78\x43\xc0\x3d\xb1\xdd\xc9\xf6\xb7\x3c\x11\x7f\x17\x4c\xfc\x53\x40\x12\x1b\x59\x3c\xa0\x5d\x01\x47\xaa\xa0\xc0\xc8\x71\xbb\x67\x0f\x1c\x76\x2d\xf7\x65\xb1\x90\x92\x7b\xd3\x87\xfd\x6a\x76\xf3\x49\xe5\x97\x08\xdf\x28\xb8\xda\xff\x8f\xb1\xb7\x8c\xea\xfa\x89\xb6\x87\x01\x49\x01\x09\xe9\x10\x04\xa4\xa5\xbb\xe3\x4b\x23\x20\xdd\xdd\x4a\x23\xd2\xdd\x48\x4a\xb7\xd2\x1d\xd2\xdd\x29\x20\x21\x21\xdd\x48\x77\xc7\xb3\xd6\xff\xb9\x57\xe6\xf7\x8a\xfb\x7e\xaf\xf9\xcc\x99\x3c\xe7\xcc\x3e\xfb\xa3\x9a\x8d\xd7\x05\x92\xb3\xcc\x96\xe4\xea\x2d\x52\xb7\x74\x8a\x78\xbf\xcc\xb6\xb4\xdc\x94\x75\x06\xe4\xa5\x89\xb6\x98\x5d\x14\x67\x15\x95\xee\x44\x7d\x1b\x03\xa0\x94\x57\x8d\xcd\xb3\xf7\x6b\x7d\x04\x53\x73\xb5\x36\x73\x65\x41\x9b\x3a\x9e\x81\x24\x9f\x6e\x35\xfa\x2a\x89\x09\xe7\x7b\x3e\xeb\x83\xb4\x33\x3f\x54\x78\xcf\xf8\xed\x86\xbf\xb3\x6a\xea\x33\x5e\xb9\x13\x66\xb2\x9b\x3e\x1b\x6b\x5b\x7d\x52\x6f\x5e\x54\x6c\x14\x73\x71\x02\x50\x55\xec\xf7\x88\x28\x9f\xfd\xdf\x07\x84\xb3\x24\x37\x95\x7d\xae\x2c\x7f\x55\x98\x60\x52\xbc\x21\x6e\x54\x37\x27\x74\x34\x87\xdc\xfe\x2f\x55\xf0\xa4\xaf\x23\x0a\x8b\x98\x0f\x0c\xc2\x4e\x1c\x3f\x95\xdb\xd5\xaa\x14\x24\xd9\x07\xe9\x03\x71\x9f\x1c\x9b\x93\x4f\xa5\x70\xdd\xc1\x1f\xed\x7d\xeb\x9f\x55\x01\xf1\x99\x40\x1f\xa0\x9a\xb4\x61\x15\xfb\xa8\x3e\x2a\x05\x8a\x6f\xfa\x94\x30\x6f\x67\xa5\xf3\xbf\x81\xd4\x19\xca\xc1\xb5\xaa\x29\xf6\x21\x54\xb8\x01\xd0\xd2\x13\x03\xbf\x77\x3d\x01\xf7\x67\xfb\x82\xc4\x7f\xb0\x28\x50\x89\x0e\x76\x0c\x83\x24\xc6\x98\xaf\xa7\xb1\x4d\x7f\x52\x12\xd0\x02\xd0\xc9\x8d\xe9\x67\xf1\xa3\x89\x3f\xf3\x97\x5d\xec\x7a\xc7\xe6\xaf\xa2\x3a\x08\xf6\x9d\x57\x71\x34\xea\xb1\x3d\x4b\x43\xf7\x6a\xc1\xcc\x3f\x85\xe0\x47\xe9\x3a\x4e\x52\x14\xe6\x39\xd8\x70\xa2\x9c\x9c\xee\x93\x48\x51\x74\xe3\x3a\x96\xf9\x56\x8c\x26\xb9\x43\xb8\xb5\xd0\x7f\x39\xfa\xa7\x9c\x13\x5f\x08\x0b\x3a\x14\x2c\x30\x0a\x02\x13\xc9\xd6\x7b\xf3\x42\xc7\xd7\xe2\xdb\x22\x01\x74\x81\xa2\x0e\xc3\xee\x2e\x9f\x07\x08\xc8\xe9\x89\x43\xbc\xd2\xbd\xdc\xcb\x41\x1a\xd3\xd4\x10\x4a\xf6\x5e\xc9\x87\x4e\xa3\xbd\xfe\xc5\x4e\x43\xcf\xac\x8d\x35\xc3\x0c\x99\x28\xbb\xf0\x59\xc4\xee\x43\x91\x50\x90\xeb\x63\x57\x7f\xf6\xd2\x7e\x35\x0b\x73\x67\x6a\x98\xff\xb2\x9c\x4a\xe4\xab\x5a\x66\x91\x5e\x4d\x67\x51\x82\x45\xe4\x21\xe2\x69\x02\x48\x19\xa5\xc7\xcd\x4a\x24\x75\x17\xc9\x94\xf8\xba\x3a\x13\x10\xec\xc0\x36\x4f\xbd\xd8\xd0\x97\x70\x94\x70\x61\x03\x33\x5f\x64\x41\x87\x0f\x5c\xa7\x28\xea\xd9\xbc\x2d\x46\x75\xf3\x3c\x5c\x4b\x12\x3e\x67\xde\x25\x99\xb6\x6e\x5f\x32\x22\xe1\x0a\x75\xa5\xae\x9f\x63\xa7\xe3\x49\x3e\x9e\x35\xaf\xbf\x70\x63\x1b\xbc\xa4\xd5\x51\x4e\x77\x44\xc9\xe3\x56\xf5\x69\x74\xf3\x58\x27\x88\x30\x8b\xab\xb4\x26\x17\xa1\xfd\x3b\x8d\x7d\x3e\x09\xfd\x7f\x73\x26\x7c\x45\x9e\x79\x03\x29\xfa\x4b\x44\xa6\xf6\x76\x87\x91\x14\x06\x82\xf4\xc1\xdf\x44\x3f\x3a\x28\x2c\xb4\xe9\xbe\x5b\x36\x73\x8b\x0d\xfe\x88\xcc\xd1\xf9\xf2\x0e\xe8\x2c\x1d\x8f\x84\xdf\xa2\x96\xec\xc4\x7b\x38\x63\x1c\x14\x62\x36\x66\xbb\xb3\x02\x99\xd7\x36\xe2\x6f\x67\xce\xe1\xe5\x86\x1e\xc2\xf3\x1f\x3b\x2b\xe9\x49\xef\x7b\x46\x6d\xf0\xce\x68\xe7\x4a\x4e\x6a\x6e\xec\xbb\xd7\x58\xc0\x5d\x46\xd4\x9e\xcf\xd1\xab\xa8\x35\x69\xaf\xde\x3b\xf0\x15\x0a\xae\x60\x77\x90\xf8\xa2\xbe\x3e\xba\xa6\x31\xfc\xc7\x10\x37\xf1\x34\x8a\x6d\x18\x83\x09\x3b\x2e\xb9\xb5\x3d\x46\x2a\x4f\xc9\xbf\xcd\xf0\x94\xe7\xe3\x2b\x4a\x1a\x0a\x03\x2c\x83\x2b\x84\x13\x3a\xac\x81\x2f\x03\xa4\x29\x67\x77\x3c\x05\xe6\x3f\xf4\x09\xb4\xef\xc4\x9c\x5a\xcb\xa2\x58\xe5\xc5\x5a\xdd\x50\x4e\x81\x3e\x10\x6a\x08\xa2\xbd\xb4\x32\xe0\xde\x11\x0d\x8d\x09\xee\xa0\x8c\x97\x74\x60\xf4\x0b\xa6\x7d\x17\x4b\x98\x6a\x5a\x15\x22\xd3\x4d\x01\xb2\xad\x82\xe9\x3c\x09\x58\xa5\x9d\xb5\x52\x26\xac\x70\x0c\x22\x49\xdf\x24\xfc\x94\x58\x84\x63\xfc\x5c\xd5\x68\xeb\xad\x1c\xd5\xf3\x1d\x7c\x8a\x13\x75\xc3\x87\x16\x5c\xde\x87\xa1\x3b\x0b\xfa\x4a\x76\x18\x65\xee\xae\x94\x2c\xdc\xa2\x96\xcd\xdf\x65\xa0\xe9\x28\xc9\x0c\x3e\xf0\x29\x60\x47\x90\xe0\x1c\x37\xbd\xbe\xd3\x60\x59\x6f\x6c\xe6\x38\x83\x53\xa0\x12\x13\x19\x5c\xf5\x4a\xe8\x1c\x8b\xcf\xbc\xa6\xee\x3f\x2f\x83\xf9\xbf\x39\x4a\xbe\x10\x44\x7f\x18\xb2\xc0\xc7\x96\xa9\x1b\x09\x56\x4f\x4e\xf0\x3d\xa6\x88\xa5\x8f\x52\x05\x0f\x23\x44\x1d\x20\x9e\x0e\x6f\xf0\x4d\xe9\x95\xfc\xdd\xa7\x26\x96\xc1\x7b\x27\x37\x73\x07\xdd\x75\x50\xb7\xd1\xeb\xac\x45\x9a\x54\x21\xe7\x2c\x6e\x79\x96\x73\x01\xea\x28\x7a\x80\x9f\xd8\xcc\x55\x70\x18\xcc\x4e\x9f\xf3\xe7\xed\x8f\x50\x6f\x97\xaf\x30\x54\x4e\x7c\x27\x97\x1b\xcf\xe3\x0d\xf7\xdf\xc8\x6c\xce\x43\x47\x90\x2e\x12\x7c\xc1\x3d\x0d\x40\x7b\xb5\x18\x1b\x59\x79\xe5\x92\x23\xd1\x32\x98\x53\x23\x6c\xaf\xae\x6d\xda\xf8\xcc\x3a\x0a\x0a\xda\x70\x7b\x2b\x6e\x35\x52\xa2\x40\x7e\xab\x7c\x00\xd6\xca\x50\x38\xc4\xd0\xee\xc8\xb7\xfc\xcf\x12\x79\xe4\x0f\x12\xb6\x45\xb4\x16\x0f\x8b\x77\xcf\x9f\x6d\x36\x7d\xc7\x04\xa0\x83\x52\x6f\xdc\x49\x5f\x86\xfe\x24\x1b\x70\x49\x1e\x45\xa3\x85\xdd\x1f\xe8\xa9\x93\xa4\x6b\x77\x9e\xe3\xd6\x1f\x88\x4f\x75\xb0\xfb\x47\xb7\x7a\xaa\xfe\xdf\x17\x62\xf6\x70\xf3\x90\x48\x04\x38\xa3\xcf\xe6\xb7\xb6\xba\xc2\xac\xed\x72\xac\xf0\xfd\x69\xe8\x73\xff\x90\x6c\xb4\xad\x1b\x8d\xab\xa2\x32\xe1\x1d\x93\xb0\x73\x91\xdb\x3f\xf6\x22\xef\x8b\xca\x9b\x6b\x9c\xe3\xcb\x45\xe3\x7d\xfe\x51\xc5\x46\x13\x9f\xbf\xc2\x94\xa6\x03\x9d\xb5\x91\x37\x9b\x7b\x15\x2c\x13\x65\xc0\xde\x81\xe6\xc4\xe6\xb1\xdd\xc2\x28\x29\xa4\xc0\x2b\x74\xa2\xd4\xbd\xa7\x82\xae\xe8\x14\x60\xb0\x6d\x77\xa9\x59\xfd\x7a\xdc\x64\x0c\x30\x73\xec\xc2\xc6\x60\xdd\xa5\xc2\x18\x55\x6c\x8c\x34\xc6\x66\x54\xba\x23\x99\x4e\x11\xaf\xfe\xf0\xb5\x27\x9e\x5b\x47\xaa\xb3\x21\xa3\xff\x87\x6f\xe0\xf6\x7a\x63\x6d\xe6\x83\x2c\x05\x54\x50\x04\xf2\x14\x69\xfa\x99\x8a\x13\xd6\x57\xff\xa5\xa3\x12\x56\x5e\xbe\x93\xb2\x0a\x9c\xc7\xae\x52\x31\x9e\x07\xbc\xb4\x81\x3e\x65\xd5\x35\x6b\x2e\x17\x2b\x36\x32\xf1\xba\x4b\xe3\x78\x97\xfb\xd7\x2f\xdf\xaa\x5e\xf3\xc2\xe5\x0a\x6c\x15\xa7\x99\xe8\x5c\x8a\xef\x6b\x21\xd2\x4f\xca\x6c\xab\xae\xf6\xbd\x2b\xc5\xdb\x14\x0f\x57\x58\xfd\x61\xc7\x84\x98\x26\x83\x75\x19\x00\xca\x6d\xcb\x51\xfa\x61\x39\xe5\xa2\xdc\x84\x86\x4c\x90\x69\x3f\x5d\x18\x6b\x80\x34\x10\x53\x6e\x91\x14\x1f\xc1\xd1\xb2\xfc\xe8\xc7\xe3\x00\xbc\x53\x6d\x82\x0b\x19\xd1\x57\xc7\xdf\xc2\x3e\x1a\x69\x93\x4e\x92\xa8\x98\x14\xdc\xbc\x91\x93\xf1\x80\xf3\xac\xf6\x4a\x20\x02\x58\x2c\x3f\xb1\x31\x18\xff\xea\x3f\x0f\xa6\xf7\xa0\x1b\xe2\x1b\x6d\x4a\x3b\xe4\xd2\xf4\x09\x88\xc7\xa7\xd2\x5c\x84\x8a\xc7\x94\xd6\x5d\x05\xbb\xea\x12\x62\xfc\x6e\x9e\x49\xa8\xa6\x83\x5a\x78\x5a\x27\x89\x0b\x62\x57\xd3\x96\x9e\x19\xf1\x47\x8c\xac\x64\x49\xda\x55\x48\xad\x17\x80\x0e\xbb\x0c\xaf\x56\x48\x20\xc0\x0f\x46\xeb\x9c\x86\xf5\x9a\xc1\xa6\xb8\x26\xa2\x4d\xe3\xc9\xa2\xa5\xa4\x6e\xab\x38\x2c\x39\x1d\x3c\xc6\x18\x3e\x7c\x71\xc6\x24\x88\x87\x54\xde\x4d\x0d\xd8\x57\x2a\xa6\xf2\xbe\x9e\xb6\xd8\xe1\x74\x97\xb9\x13\x9e\xfe\x93\x9d\xb9\x66\x4c\x8f\x5d\x8d\xab\xda\xa4\xe4\x50\xf0\xd4\x09\x36\xcb\xd0\x5f\x91\x85\x0a\x5f\x4c\xff\xfe\x33\x6c\x52\x7c\x0f\x9e\x54\xb2\xa9\x2e\x91\xa0\x10\x70\x15\x5f\x73\xf2\x96\x93\x86\x89\x30\xc2\x2f\x05\xea\xf6\xca\xd6\xa7\x45\x09\x8f\x62\xc7\xa1\x08\xd2\x93\x37\x9d\xcc\xe2\x59\xff\x00\x62\x5c\x2d\xeb\x25\x72\x23\x13\x04\x0d\x04\x73\xa5\x2c\x83\x7c\xce\xed\xb2\xc2\x5d\x13\xcc\x9c\x35\xc6\x98\x90\xd0\x6d\x5c\xec\x66\x20\xdd\xfe\xc5\xe4\x74\xdd\x51\xf6\xf4\xda\x2e\x53\xe7\xfd\xa2\x10\x9a\x39\xf7\xc0\x00\xf6\x48\x0d\xb3\x8e\x84\xff\xae\xce\xb1\xb1\x61\xe7\x23\xb2\xf5\x0b\x6c\x1a\x0a\x27\x17\x46\xea\x35\x39\xad\xf2\xe7\x65\xed\x15\xd9\xf9\xa9\x19\xd9\x5f\xb9\x7e\x62\x12\xfd\x83\x2f\x0e\x3e\x80\x63\x4a\x56\xdb\xd0\x37\xec\x39\x98\xb6\x98\xa4\x21\xfb\x6d\x9e\x98\xe1\x85\x35\x04\x41\xb4\x3c\xe1\x59\x74\xb6\x75\xaf\x4c\xf5\x6e\x34\x00\x75\x82\xad\xff\x0c\xcb\x72\x24\x2b\xf7\x8b\x7a\xc1\xa1\xf9\xd7\x5a\x7b\x46\xf0\xd8\x8c\xca\x8b\x59\xf9\xf3\x51\x72\xd1\xd8\x94\xed\xc7\xf5\x17\x37\x56\x83\x1e\x77\x90\x83\x62\x58\x3b\x52\x84\xcf\x5d\x91\xb8\x49\xa4\xf2\x77\x69\xa0\xc4\x0e\x21\x44\x90\x69\x06\x8a\x3b\x04\xb0\x1f\x13\x51\xa2\xae\x17\x95\x06\xfd\x9d\xb1\x20\xc2\xc1\xc8\x29\x27\x61\x50\xf3\x49\x28\xb3\x65\x16\xe4\x92\x65\x05\xf5\xc1\x0f\xf7\xd1\x2a\x91\x41\xca\x5e\x93\x0f\xb2\x52\x5c\xd6\xd8\xbc\xd5\x19\xba\xe4\x3e\xc7\x6c\xbb\xe9\x61\xfc\x1b\xca\xaf\x89\xc8\xd8\xb9\xac\x80\x18\xe4\xd0\xd0\xec\xe8\x52\xbf\x65\x4d\xe2\xa0\x98\x45\xc9\x5d\x1c\xf9\xb6\x14\xff\xfd\x41\x45\xd2\xd6\x44\x89\xaf\xb3\xdb\x8c\xa9\x0f\x68\xff\x69\x76\x5a\x9b\x4c\xa9\x5c\xed\xce\x2c\x62\x9a\x57\x72\x51\x42\x28\xbe\x6a\x0b\x83\x98\x58\x7b\xb7\x9a\x48\xc2\xb1\x05\x0e\x04\x64\x46\x79\x6e\x7f\x4b\x32\xb4\x23\x95\x59\x22\x65\x4a\x40\xb5\x27\xe6\x35\xf1\x26\x82\xee\x99\xd2\xf8\xc2\xfb\xce\x2d\x70\x49\x28\x00\xdc\x54\x50\x75\x79\xdd\xe7\xc6\x5b\xf5\xa5\x66\x81\x86\xe8\x4e\xee\x09\x0a\x3d\xbd\x99\xef\xbd\x95\x59\x5c\x77\x6e\x54\xbf\x50\x89\x3d\xda\xaf\xdc\xc4\x79\x16\x4f\xd3\xde\x8e\xf5\x9b\xbb\xcd\x24\xa3\x0b\x31\xe0\x4b\xb5\xf3\x56\xa1\xe3\x87\x05\x57\x98\xa2\xd0\xc2\xe0\xdc\x47\xab\xfc\x58\xb4\xcf\xf8\xc2\x0b\xdb\xa9\x27\x38\xca\x97\xc5\x2b\x0b\xb4\x51\x53\x3c\x21\x5a\x9b\x96\x5a\x8a\x36\x03\x0c\xfc\x1a\x1e\x40\x0c\xb6\xb2\xd7\xcb\x73\x42\xd4\x61\x0b\x75\x87\xc4\xd7\x4b\x88\x2a\x1b\xad\xd8\x84\xc9\xc9\xf5\x66\x6c\x7a\x4f\xca\xff\x90\x57\x19\x38\xa9\x8c\xf8\x73\x35\x65\xe6\x21\x97\x56\x71\x91\xfb\x37\xbf\x98\x70\x27\x18\x09\x64\x27\xa1\x5f\x85\x9e\x41\x46\x17\xa9\x11\xaa\x39\x81\x41\x8d\x24\xf2\x43\x66\x42\x90\x7b\xe7\x39\xb8\xd6\x9e\x58\xa2\xab\xab\x5b\x27\xda\xfa\xbb\xa7\xc3\x7d\x2b\x40\x54\x5e\xf2\x6b\x1e\x30\xa7\x74\x77\xd8\x9d\xf0\x13\x79\x76\x9a\x8a\x21\x7f\xde\x99\x5d\xa3\xfd\xc8\x2f\x41\xe4\xa3\x25\x87\x53\x7e\x63\xaa\xf4\xd5\xc9\x81\xf7\xb1\xd1\x1f\xe5\xdb\x0b\xe2\x6f\xf5\xe7\x44\x65\xca\x06\xbb\x16\x28\x7e\xf9\x59\x50\x11\x94\xab\x4a\xb5\x66\xf4\xf1\xb4\x7c\x94\xea\x8a\x02\xb2\x76\x57\xbe\x22\x84\xbf\x25\xaa\xfa\x5f\xc5\xd3\x64\xd9\x9b\x6f\xfa\x57\x47\x0b\x22\xe7\xf5\x7a\x0e\xc3\xd5\x17\x59\x7d\x98\x6e\x04\x6c\x92\x2b\xd2\xe6\xbc\xfc\x5c\x3c\x2c\xf3\xfe\xcd\x77\x54\x22\xd3\x79\x76\xa2\x04\x2f\x0d\x17\x2e\xe2\xbd\x14\x53\xd7\x30\x23\x9d\xba\xc7\x46\xfd\x65\xec\xa7\x9c\x1b\x36\xc2\xce\xd6\xb2\xf1\x75\x29\x2d\x25\x6e\x03\x46\x4c\x5b\x1a\x3c\xa1\x27\x4f\x3d\x86\x17\x05\x2a\x86\xc0\x85\xe2\xe7\xe2\x3f\x2b\x26\x4b\xf5\xcc\x0d\x12\xe3\xba\xf3\x93\xa2\x7b\xc3\x8b\x5d\x62\x17\x6b\x8e\x78\xc4\x9c\x5d\x99\x8f\xe5\x2c\x09\x80\x6e\x6e\xf3\xc8\xd8\x0d\x32\x32\x85\xbd\x96\xd5\xa8\xe6\xeb\xc4\x24\x2b\xb9\xc9\x67\x56\xc0\xf9\xe6\x06\x89\x08\xd5\xe3\x6d\xa1\x05\xa0\x4a\xe5\x1e\xd4\x88\x21\xc3\x6c\xd0\x59\x5a\xa5\xb3\x0a\x7c\x10\x94\x16\xa4\x7e\x1f\xaf\x96\xf4\xbc\x01\x93\x45\x63\xcb\x9f\x58\x8f\x83\xca\xf9\xcc\xdb\x2a\xeb\x8d\x1b\xea\x78\xa7\xf5\xf4\xf8\x0a\x97\x81\x9f\x01\x69\x44\x02\xe6\x57\xd2\x92\xaa\xcd\x33\x4d\xc4\xe5\xd0\x47\xab\x12\xeb\xdb\xc5\xb5\x7d\xb9\x15\x8d\x69\x2d\x83\x49\x92\x9a\x55\x3d\x93\x2e\xf5\x02\x47\x82\x92\x58\xa2\xee\x6e\xd1\x31\x5c\x2f\x81\xc3\x57\xe1\x72\xeb\x6a\x64\x6c\x3e\x86\xa9\x57\xdc\xdc\xa6\x2b\x51\x07\x66\x1c\xda\x5e\x8e\x41\xc3\x87\xc5\x42\xd1\x0d\xb9\xfa\x01\x98\x53\xdf\x61\x3c\xb1\xcc\x23\xee\xb5\x4c\xd9\x77\xac\xb3\xdf\x98\x09\x0a\xf7\x3e\x0b\x0c\x06\x6a\xa3\x85\xba\x39\x5d\x85\xf8\x7f\x7e\xf1\xd8\x68\x64\x5c\x9b\xb8\x4e\x34\xdc\x4d\x87\x11\x9b\xca\x5f\x9d\x00\x61\x27\x8d\xd5\x52\x9c\x62\x11\xb1\x76\x34\x82\xd0\x38\xe7\x05\x7f\xa0\x4a\x90\x8b\x9f\xbf\xa5\x4d\x80\xa6\xfd\x58\x39\x9d\xdd\x80\x07\xce\xfd\x83\x8b\xae\x0d\x19\x79\xd8\x9a\x1b\x71\xcf\x47\x1d\xd2\xf8\x7f\xb1\xef\x53\x97\xb4\x2f\x24\xca\x1b\x1d\x24\x25\x05\x23\x33\x53\x39\x30\x38\x3f\xd8\x48\x88\xc2\x4d\x7d\xa2\x4a\xa4\xab\x86\xa0\xb9\x69\xd6\x30\xb9\x8e\xd4\xb8\x10\xbe\xa9\x74\x07\x9c\x8b\x55\x66\x12\x88\x5d\x37\xa9\xe1\x10\xf9\xcc\xc1\xb6\x4d\xe6\xba\x47\x40\xb3\x62\x31\x49\xc6\x8f\x7d\xc2\xe1\xf0\xb7\xa7\x2f\x5b\xc1\xac\xcd\x16\xdb\xd8\xee\xf2\x4f\xfc\xcf\x19\x7c\xb3\xcb\x6f\x2d\x6f\x32\xea\x09\xd4\x72\x9b\x39\xcc\x9e\xc5\xf8\x7f\xe8\x1e\x7f\xfd\x01\x80\x3a\x3d\x0f\x52\xca\x90\xb4\x27\xd9\xe9\x74\x28\x91\x99\xdc\xb5\x90\x63\x62\xfb\xb2\x41\xf1\x85\xa7\x3a\x2b\x09\xf9\xca\x9f\x4a\xff\x9f\x69\x4f\x5d\xea\xbe\x10\xd2\x28\x52\xd0\x34\x6e\xc5\xb3\x25\x6e\x52\xa2\xfa\xf9\xf5\x3d\x6d\x98\x5b\x0b\xfa\xbe\x1a\xba\x92\x36\x99\xf1\x0b\x2b\x58\xed\x6d\x26\x4b\x3c\x17\xa0\x13\xad\xc2\x0d\xf4\x89\xa4\xa2\xf1\x1b\xad\x5a\xcc\x8d\x36\x8c\x69\xab\x2a\x03\xc4\x47\x3a\x58\xfc\x7b\x04\x7e\x36\xb5\x75\x75\xa2\x00\xd4\x05\x82\xaa\xe8\x59\xe7\xc1\xee\x85\xa3\x41\x4d\xb5\x2e\xa4\xf5\xb5\x94\x6c\xb1\x50\x97\x31\x08\xc3\x75\x36\x47\x96\xec\x39\x58\x98\xf4\x26\xd7\x16\xe7\xe1\x14\x1e\xd6\xf8\xcd\x85\xd4\x9d\xf1\xc4\x82\xc9\x03\xdb\xf7\x98\x99\x93\xd5\x76\x7b\xbf\xf1\x90\x1c\x9d\x90\x7f\xb9\x98\xa7\x3c\x0b\x5f\x51\x58\x58\x32\xc0\xb2\x5c\xfc\x15\xb7\xc0\xed\x22\x6f\x83\x45\xad\x9a\x08\xe6\x51\x9a\xfa\x4e\x51\x4f\x88\x1a\xa9\x6f\xc1\x76\x96\x03\x5c\x1a\xbb\x2d\x18\xd0\x36\xa8\x5d\x0e\x50\x31\x28\x6f\xc8\xe7\x58\xaa\xb4\x73\x0b\x8a\x7d\xcc\x8d\xa8\x5c\xb3\x7e\xb6\x22\x55\x4d\xd5\xbb\x2a\x06\x32\x4c\x3e\x0b\xab\xca\xfd\x14\xe0\x1f\x26\x86\x81\x3d\x76\x6f\x59\x6b\x37\x6d\xb8\x1e\xdb\xd5\x8c\xea\xa9\xc3\xc3\xf7\xce\x42\x33\x7e\x0f\x40\x83\xf3\x14\x7e\x08\x75\x35\xa8\x0b\x50\x6a\x43\xaf\xd5\x9d\x91\x3e\x10\x22\xd1\x4b\x9f\xa6\x5d\x9b\x17\x41\x5e\x92\xa7\xaa\xb3\xfe\x73\xcc\x9f\x74\x84\x20\x5f\xa0\x60\xe1\x01\xc7\x7c\x15\x46\x1d\x02\xdd\xf1\x03\x12\xc0\xf4\xc9\x28\x36\x24\xd9\x60\x6f\xa1\x51\x53\xdf\x9a\xa3\x0d\x32\xaf\x2c\x11\x20\x07\xbd\x0e\x74\xa2\x1f\x47\xeb\x79\xa2\x13\x8f\x7c\x7b\x29\x54\xcb\xd6\xd0\x91\x4a\xbb\xfa\x0a\x29\x8e\x9e\xa5\x48\xb2\xda\x21\xba\x5c\x81\x02\x58\x27\x17\xe1\x63\x5c\xbe\xfd\xf5\xd0\x62\x64\x32\x50\xbc\xbb\xba\xa5\x8e\x67\x66\xcd\x2e\x8d\xe8\x68\x78\x5d\xc1\xc3\x9b\xac\xd2\x28\x00\x80\xea\x72\x14\x43\x35\x24\x5b\x8c\x53\x94\x7d\xd5\x2d\x6d\x3e\xfa\xcb\xd6\xe5\x43\xf9\xc2\x61\xf3\x80\x8a\xe8\x94\x2c\xd4\x23\x4d\x06\x80\xbe\xf0\x45\xa3\x49\x6f\x72\xe7\x28\xd6\x3b\xf0\xcc\x6a\x22\x96\xcb\xb6\x99\xf7\xac\x65\x92\xb8\xbc\xb4\x7f\x25\x42\x03\xff\xe5\x16\x80\x92\xbc\x67\xd3\x51\x32\xff\x66\xff\x66\xf6\x32\x59\xcc\x3b\x7a\xf5\xb0\x93\xa5\xd6\x5c\x84\xa9\xad\x8e\x8b\xd4\xfd\x04\x9d\x84\xe7\x5f\x38\xf7\x94\xe7\xe6\x0b\xa1\x16\x82\x02\xcb\xef\xec\x6e\x27\x52\xd8\xbd\x85\x84\x8e\xcb\xbc\xc2\x74\x15\xb2\xde\xe8\x38\xfb\x5a\xd2\x99\x2e\x6e\x1c\xf2\xb2\xe1\x9e\xbc\x9a\x04\x93\x57\x24\x78\x6e\x04\x07\x3f\xb8\x55\xd2\xf6\xa9\x91\xdd\xe9\x32\xb1\x03\x86\xe9\x68\x90\xee\x8c\xfc\xb1\xb7\x7a\x9d\x9d\xe4\xa3\xd9\xc0\x98\x63\xbd\x44\xc0\xd9\x26\xcd\xb9\x66\x9d\x8d\xb8\x10\xb7\xd8\xb2\x47\xb7\xc9\x4f\xf8\x18\x77\xca\x33\xb7\x58\x5f\x7e\x08\xc3\x0f\xb8\x44\xa0\x86\xf4\x96\x9e\xe5\xec\xb7\x93\x2b\x76\x0b\xb1\xb1\xd2\xaf\x14\x86\xd9\xfe\xbe\xba\xe5\x0e\x86\x0a\x42\xfe\x95\x1d\x42\xea\xfb\x78\x8a\x61\xf0\xe0\x1a\x8f\x71\x6c\xa6\x87\xe3\x06\xa6\x0a\x4a\x94\x53\xcc\x7d\x74\xf8\xf4\xeb\x6b\x3e\x7d\xd3\xf9\x36\xa7\x57\x53\x67\xdc\xbf\xad\xfe\x94\x4f\xea\x0b\x21\x85\xa5\x00\xb7\xfa\x7e\x04\xdc\x70\xc6\x59\x2e\xdd\x2f\x98\xda\x30\xe9\xeb\xdf\x7e\x89\xaf\xaf\x3b\xa7\x84\x09\xa7\x3e\x73\xd4\x5b\xea\x5d\x92\x81\x69\x9b\x2f\x0f\x29\xae\x5f\x56\xbe\xb5\x90\x2f\x16\xf6\x37\xbb\x67\xd0\x14\x8a\x92\x85\xb4\xbe\x0e\xf8\x92\xd5\x61\x5d\x8c\x61\x56\x05\x16\x52\x5d\xdc\x3e\x8b\x35\x6a\xab\xbd\x18\x26\x8d\xf6\x0a\x8e\x8b\x29\xb0\x64\x21\xcd\x09\x9a\x9d\xe7\x92\x33\x87\x48\x23\x56\xf7\x82\xe4\x99\xf7\x97\x25\xb7\x16\xb5\x72\xd0\xe5\xb2\x54\xf5\x86\x87\xf8\x3e\xf5\xb1\xbd\xa3\xe8\x0c\x0d\x0f\x77\xbd\x7a\x04\xa4\xc9\x49\x7b\xff\x4c\x7b\xca\x8b\xf4\x85\xc0\x0a\xe1\x81\xa6\x51\x6f\x8e\xcb\xbc\x14\xcc\xe8\x53\xa1\x8e\xcd\x50\x69\x9e\x4c\x59\x70\x81\xf8\xae\x7b\x57\x8c\xb6\xda\x2d\xbd\xd1\x0b\xfc\x22\x07\x66\xf0\xde\xd7\xf8\xf8\x54\x57\xbb\xea\xd6\x18\xff\xb1\x61\x66\x4f\xbb\x13\xef\xd1\x3e\xa2\x66\x9a\x9c\x14\x5d\x90\x5c\xd5\x6a\xf8\x01\xb2\x41\x52\x18\x9e\x49\x3e\x68\x26\x11\x2f\x38\x76\x39\xe8\xf5\x85\x2c\xce\x8c\xe7\x38\x93\xcf\x7d\x5a\x74\x29\xe0\x14\xfc\x20\xab\x01\x40\x99\x43\x47\xa8\x61\x98\x96\xc7\x47\x31\x9c\x6c\x02\xc2\x0e\xde\x7a\x23\xfd\x24\xa1\x64\xe3\x74\xc2\x89\xca\x59\xa0\x7f\x89\x51\xff\xcf\xb4\xa7\xbc\x5e\x5f\x08\x2c\xba\x90\x37\x60\x5a\xc0\xf6\xfd\x8c\xb6\x0c\x6d\x75\x36\xfd\xca\x55\x5b\x86\xbb\x76\x82\x75\x8d\x49\xad\x2c\x55\x96\x49\xe7\xaf\x1f\x0c\x62\x29\xa3\x20\x39\x29\x14\x8d\xef\xa0\x73\x3d\xcc\x29\xf5\x66\xdc\xda\xfa\x14\x61\xb3\xe6\x9e\xa6\xb5\x9d\x21\xc6\x91\xff\x03\xb3\x86\x8b\x52\x22\x98\x91\x4a\xbb\x2b\xf6\x34\x28\x8c\xa3\xec\x56\x9f\x21\x41\x42\x8e\xb7\x8c\xa1\x6a\x09\x6e\xfe\x19\x73\x69\xf4\xb6\x2e\x75\xc5\x18\x3c\xa0\xed\x9f\x31\xe7\xf1\x57\x55\x0f\xa8\x46\x57\x49\x33\xdb\x1f\x3d\x83\xf0\x29\x04\xad\x22\x2a\xbe\x75\xe9\x4c\xe6\x97\x2e\x90\x22\xf9\x47\x16\x7c\xca\xf7\xf5\x15\x85\x86\x86\x05\xb2\x47\xa7\x3d\x49\xb6\x0f\x08\x36\x9c\x53\xdf\x37\x7f\x76\x17\xf8\x1a\xbd\x22\xae\xb5\x7f\x93\xa7\x89\xe5\x85\xe2\x39\xbd\xaa\x2d\x08\xf2\x77\x51\x09\x6e\x98\xb9\xbe\x4e\xab\x7e\x50\xce\x8f\x09\xf3\xe2\x1c\x97\xe4\x26\x94\xd3\x5f\x28\xf9\x95\x4a\xa3\xc5\xc0\xbc\x8e\xd3\x04\xec\x34\xa7\x8b\xdc\x29\xf8\x29\xdd\x0a\xe3\x07\xe4\x90\x9e\x8f\xda\x6b\xb9\xf7\xfd\x75\xe9\x17\xc3\x5e\xd3\xa5\xe9\x92\x6b\x18\x02\x18\x8f\x3b\x6d\xcb\xa2\xd7\x0d\x95\x03\xe7\x94\xcc\x49\xbd\xa5\xa3\xe0\x13\xfb\xc7\xc9\x7c\x9e\x9f\xbc\xf3\x5a\x21\x38\xad\x98\xf4\x74\xef\xe7\x1e\xa9\x67\x4f\x78\xea\xbe\x10\x52\x68\x61\x70\x39\x96\x69\xac\x09\xc6\xed\xdd\xef\xc2\x54\x70\x4a\x54\xb4\x62\x59\xaa\x51\xe8\xb7\x62\x67\x11\x56\x8f\xbd\xee\xce\x81\x89\x90\x4a\x05\xba\x4b\xef\xe9\x17\xfa\xed\xc5\x8a\xbd\x33\x27\x64\x3c\x3a\xa1\x34\x7a\xd6\xc3\x3e\x78\x05\x4e\x8d\x2e\x5f\x28\xf4\x9b\x03\xef\x5a\x12\x90\x17\xb3\x1e\xaf\xc9\x4b\xc8\x90\x72\x44\x67\x3d\xc4\xbf\x52\x77\x79\xa5\x25\x82\xae\x4d\x59\xab\x51\x8c\xd2\x66\x1d\x6a\x32\x07\xa6\x26\xe3\x53\x77\xd6\x42\x78\x95\xed\xf9\xc9\x1f\x12\x12\x0e\x7d\x1c\xbe\x51\xb2\x1b\xf6\x7f\xc1\x5b\x5d\x65\x6e\x72\x29\x75\x88\x24\x04\xa0\x4d\x03\xf3\x1a\x68\x77\x0c\x51\xe9\xc2\x50\x45\xec\x6a\x43\xbd\x1f\x91\xd7\x28\x9a\xc4\x31\x63\x17\x7b\x06\x26\xc6\xc2\x5d\x96\x1f\xaf\xdf\x27\x62\x10\x5f\x51\x44\xa8\x68\x60\x0c\x88\x98\x58\xcb\xd6\x56\x53\x5f\xd2\xcd\x8b\x1a\xe9\x4a\x52\xc4\x89\x9a\xcd\xb5\xbd\xe4\x0b\xcd\x2e\x1a\x18\xf3\xfd\xf1\xf1\x23\xb8\x6e\x75\x71\x9d\xcc\x6d\xa4\x22\x39\x6d\xc3\x5b\x98\x0c\x6d\x06\xab\xa9\x6e\xa7\x1a\x93\xa0\x86\x03\x38\x02\x49\x02\x5e\x4d\xb5\x80\x77\x54\xd2\xf9\xdb\xca\x1b\x57\x46\xf4\xdc\xbc\x59\x73\x28\x84\x99\xc0\xd1\x65\x3e\xba\x3e\xbe\x8c\x9b\xb3\x5f\x05\x25\x79\x43\x7f\x2e\x01\xa8\x35\x66\x5d\xea\xca\x91\x54\xe9\xe7\x6a\x9f\x94\x9c\xe4\xee\x8d\x75\xd7\x62\x5d\x85\x88\x40\x6c\x4d\x8d\xec\x97\x9f\x5e\x37\x07\xfd\xdb\x92\x4f\xb9\xe2\xbe\x10\x58\x49\x28\x58\xc0\x34\xba\xc3\x66\xbe\x54\x29\xb2\x67\x72\x2b\x36\x22\x5f\xb3\x24\x59\x8d\x88\x07\x39\x14\x55\xcb\xa6\x85\x48\x66\x8c\x3d\x74\x2e\x4a\x81\x4e\x38\x88\x85\xc9\x4c\x61\xe5\xeb\xbf\x84\x17\x5e\xa7\x98\x27\x85\x97\x0b\xa3\xe1\x77\x69\xd2\x37\xb0\x5e\x5c\x24\x7e\xc5\xc9\x79\x02\xbe\x17\x60\x64\xdd\x6b\xa8\xb1\xd5\xbf\xfe\x4c\xd2\x6b\xce\x52\xc0\x24\x47\xc6\x3a\xbc\xd4\xff\x29\xe0\xdd\x3e\x37\x46\xdc\x45\x1a\xa8\x05\x61\xf7\xcc\xf5\x20\x73\xf5\x9b\x3b\x33\x6e\x31\x5e\xbf\xdb\x8c\x4e\x92\x98\x39\x5e\x88\x87\x63\x12\xed\x4a\x79\x83\xa0\x97\x86\xd9\xbf\xa7\x90\xa7\x42\x07\x5f\x08\x1c\x06\x14\x3a\x90\xf8\x1c\x28\x46\xa9\xa1\xd8\x90\x95\xce\x2c\xf0\xca\x47\x8c\xe1\xf4\x9a\xb3\x20\xe7\x31\x8a\xc5\xf0\x6c\x47\xe2\xb4\x44\xd2\xf8\x0a\x1e\x79\x5f\x5b\x3e\xb3\x32\x52\xf1\x9d\x68\x11\xbc\x31\x3e\x88\xf9\x1c\xcf\xf3\xd6\x86\x70\xac\x57\xb5\x31\xf9\xca\x56\x5d\x7d\xa8\xc6\x15\x80\xc6\xba\xbc\x63\xb6\x87\xc7\x33\x9d\x4d\xcf\x23\x6a\xf8\x3e\x79\x34\x86\xc6\x40\x1b\x12\x9f\xd3\xdf\x2a\x8e\x8c\xe5\xc6\xb6\x00\x9e\x36\xda\x45\xc7\x4a\xf4\x09\x81\xa7\xd9\x77\xef\x28\x8e\xf2\x28\x49\x0c\xf9\xbc\x9f\x5f\x4b\xe0\x25\x0c\x16\x56\xbb\x16\x7c\xc7\xca\x06\xa0\x9b\x0e\x0a\xb9\xcb\x45\x0f\xc7\x95\x62\x95\x3f\x27\xa6\x0c\x2b\xdc\x7e\x46\x74\xf6\x06\xea\x5c\x97\xdd\xa3\x91\xe3\xb3\xd3\x37\xfc\x5b\xba\x4f\x45\x45\xbe\xa2\xe8\x7d\xe0\xf6\x8d\x29\x8b\x37\x79\xdf\x42\x50\x29\x8f\xa4\x2d\x1a\x52\x99\xce\xe3\x53\xf9\x71\x6e\xe0\x02\x3f\xc6\xe7\x88\x9b\x60\xf1\xd4\xde\x14\xe8\x43\x26\xb6\x75\x65\xe6\xb0\xb7\x30\xc6\x77\x21\x8c\x34\x5e\x1e\x9f\x72\xe5\x3c\x49\xf7\x66\xd5\x8a\x9a\xf5\xf7\x0e\x52\x28\x4d\x60\xb2\xfa\x17\xb9\x91\x6b\xc9\x75\x72\xdb\x80\x15\x7e\xdc\x6a\x75\xf6\xe2\xb3\xbf\xe8\x58\xd1\xf3\xc9\x75\x64\xa4\xe8\xd2\x66\x6e\x3b\xa0\x78\x06\x2e\xae\x9f\x95\x2d\x0e\x5e\xbe\xe9\xc6\x51\xf8\x67\x0f\x58\xb2\x3b\x85\xc6\xc0\x05\xcb\x67\xda\x8b\xf6\xc2\x1b\x88\x97\xf9\x22\xe7\x79\x2f\xff\xe7\xf4\x78\x42\x76\xf4\xff\xa9\xf8\x2d\x82\xac\x3a\x23\x28\xcd\x30\x95\x3e\x79\x0d\xec\xf9\xa8\xe1\x34\xa9\xf4\xf5\x8d\xe0\x41\x36\x2f\xe5\x3a\x3c\xee\xd4\x5f\x8d\x4e\xfb\x75\xc2\x40\x3d\xda\xbc\x79\x2a\xae\xc2\xcb\x72\xfc\x1f\xa6\x84\x56\xc1\xaf\xa1\x3f\x09\xb7\xe7\xef\x92\x7e\xfe\xb5\x3e\x5b\x26\xfd\x81\x9c\x13\xed\x11\xf9\xeb\x6f\x81\xb5\x05\x59\x82\x7f\x3f\x6f\x69\xd9\xb2\x1a\xf6\x95\xf2\xef\x1f\x37\x1c\xb4\x25\xd4\x66\xce\x5a\x11\x31\x65\xef\xc3\x80\xb8\x2f\xe4\x88\x23\x74\xdc\xdc\xea\x92\xb8\xbd\x2a\xed\xcc\xe6\x56\xed\x7b\xf7\xeb\x9a\x4b\x7c\x4e\x99\xcf\xc6\x23\x3c\xe8\x9e\x5c\xfa\x80\x98\x50\xea\xee\xb3\x56\x3a\x5e\xf4\xe7\x86\x8c\xb1\x84\x3e\x01\xb1\x74\x4d\xce\xe7\x15\x19\x98\x7e\x2d\x47\xf0\xa8\x9b\xad\x81\x43\x8f\xc8\x1e\xb9\x66\x79\x65\x8f\xfa\x99\x02\x43\xf1\x90\xfb\x99\xaf\x85\xae\xc7\x29\x43\x59\x38\xf9\x5c\xf0\x21\x05\x12\xdb\x93\xd0\x56\xc0\x69\xfb\xaa\x77\x9d\x95\xa1\x4a\x8a\x1e\x3d\x23\x0c\x7f\x6c\x64\x6f\x20\xb4\x99\x27\x21\xf6\xef\x8f\x6c\xeb\xcc\x70\x76\x49\xcf\xfb\xfd\xc7\x46\xaf\x95\x2b\x8b\x58\x09\xac\xbf\xe5\x25\xaf\xbc\xe1\x37\x51\x18\x49\x9f\xf5\x0d\xef\xe5\x5d\xe2\x9a\x8a\x6f\xd9\xb2\x93\xce\x56\x04\x63\x79\x52\x57\x2d\x62\x1b\x2c\xdc\x9f\x3e\x1c\xa7\x81\xad\x6f\x5d\x32\xe9\xe0\xdd\x90\xd8\x5e\x49\xe9\x55\xaa\x24\xa4\x88\xec\x77\x1e\x3f\x7e\x9f\x2a\xe0\x63\x10\xad\x10\x4f\x6d\xca\xba\x47\xf1\x95\x96\x2d\x92\xb4\xb8\xe2\x12\xee\xef\xa4\x3e\xb1\x02\xa7\x11\x72\xee\x31\x40\x65\x24\xce\x4b\xad\xcc\x6a\x2e\x2b\xae\xac\xba\x9e\xee\xe2\x9b\x3d\x5f\x1e\x9a\x4b\xb5\x12\xbc\x12\x6c\x1f\x8a\xcf\xef\xc5\xd3\x4f\x46\xff\xc9\xb9\x3e\xff\xe2\x59\xfc\xe7\xeb\xcb\x98\x01\xb9\xa8\xad\xc1\x54\xc7\x8d\xbd\x67\xeb\x3f\xa2\x59\x45\xb3\x28\x92\xec\x3e\xff\x61\x2c\x04\x54\x87\xc6\xbb\x95\x39\x1f\xd8\x90\xbe\x76\x58\x2f\x5b\xcf\x5a\xa7\xa4\xd0\x72\x7e\xaa\xf0\x61\x8e\x7e\x87\x77\x9e\xd9\x4e\xe9\xfd\xf0\xf8\x7d\xa7\xb7\xfd\xe4\x3f\x18\x0f\xc9\xbc\x3a\xb3\xac\xf4\x4d\x28\x23\x3b\xf3\x3b\xb6\xf3\xee\x47\x7b\x76\x9d\xd6\xd9\x23\x7a\x31\x1d\x81\x39\x2d\xc2\xa2\x1a\x34\xfb\x62\x15\x48\x43\x1b\xf8\x9d\xb9\xf4\x20\x43\x42\x13\xfd\x03\x04\x31\xd5\xd8\x8c\x01\x86\xa0\xf4\x06\xbe\x16\x50\x12\xab\x57\xc3\x24\xe5\xec\xc0\x67\x26\xe7\xb9\x62\x9f\x39\xb2\x4e\x2a\x2f\xc1\xfd\x12\xa4\xdf\x53\xab\x97\x3d\xbb\x28\x0a\x0d\xe8\xfd\xed\x6f\xd3\x61\xb2\x62\x07\x0a\x6a\x25\xc0\x5f\x37\xd5\xe0\x48\xab\x9a\xba\x9c\xd4\x5e\xae\x54\xe2\x72\x1f\x0c\x74\x59\xa8\x5c\x80\x65\xb3\xd7\xf2\x43\xcf\xf6\xe4\x1d\x5e\xc4\x78\xc7\xef\x31\x2b\xf7\xd3\x0a\xc4\xa5\x52\xd3\x12\x54\x4a\x47\xab\x71\xe9\x11\x50\x00\x29\x2f\x35\x43\x79\x56\x66\x52\xd5\x3e\x09\x71\x2e\x1e\x59\x0b\xdf\x30\x68\x36\x6a\x09\x15\x83\x13\xb1\xe7\xf1\xc8\x8e\xf8\xcc\xf5\xd6\xe0\xbb\xf4\x76\xd5\x0e\xce\xdb\x93\x38\xbe\x0c\x5e\x48\x57\x20\x93\xd4\xbc\xcf\x85\x20\xc6\x9b\x31\x96\x18\xd3\xe3\x43\xc4\xce\x94\xff\xa4\x72\xd0\x2c\x8a\x58\x25\x84\x31\x52\x13\xce\xda\x95\xef\x61\x3a\x77\x73\xc9\x56\xe8\x3b\x72\xda\x29\x0c\x45\x63\xff\xc4\xac\x2d\xf1\x80\x62\xae\x54\xe8\x1c\xab\x82\xe6\x88\x22\x50\x41\xfb\x70\xcd\x2d\x2a\xfe\xab\xe9\x0b\x86\xec\xdc\xb9\xc2\x3c\x3e\x33\x45\x10\x68\x34\x00\x0a\xc5\xa8\x28\x38\x35\x59\xb4\xf2\x5a\xbe\xa7\x33\x8b\xb4\xac\xd4\x80\x64\x6c\x2f\x2b\x0a\xd7\xd3\xa9\xe1\x41\xa8\x2e\x5f\x04\x1d\xa0\xb5\x44\x05\xbe\x14\x37\xfc\xce\x41\x78\x8d\xc7\x85\xb4\x3f\xdb\x59\x17\x0b\x65\x05\xbb\x4b\xb6\xad\xf6\xf2\x82\x38\x44\xf1\x07\x20\x0e\x28\x1a\x9d\x85\xd2\xfc\x6a\x7e\x22\x6c\x34\xf8\x84\x03\x65\x93\xb3\xe6\x43\xa4\xba\xb0\xd3\x52\xae\x08\x93\xfd\x45\xd8\x51\xc4\xfa\x23\x32\x9d\x55\x97\x4b\x6a\x6e\xc4\x36\x5d\x40\x6c\xb9\xdb\x13\xaf\x41\xcb\x3f\xe4\x2b\x5d\xda\x75\x44\x33\xbc\x43\x8a\x90\x92\x72\x17\x30\xfe\xe4\xa8\x5c\xdd\x37\xd5\x6e\x74\xaf\xa5\xaa\xbf\x6b\x46\x8d\xaf\x50\x18\xdb\xd8\x5f\xf0\x5e\x41\xbf\x55\x0b\x7a\xee\x0a\x1f\xb0\x04\x24\x68\xaa\x27\x07\x9b\x2b\xf0\xe0\x10\xe7\x6a\x16\x6f\xb0\xd1\x35\xf8\xdf\x24\xad\x63\x47\x21\x0d\xd0\x8d\xcf\x15\xc6\x76\xef\x80\xaf\x6a\x14\x36\x1c\x30\x29\xad\x2b\x77\xec\x38\x34\x7c\x11\x3a\xb9\xb0\xe3\x88\x57\x18\xf7\xcb\xcb\xc4\xb8\xa7\x43\x94\x93\x21\x56\x33\xc0\xf7\xd1\x68\xc2\xe4\xcc\x7a\xed\x0c\xa2\x8c\x61\x3d\x6b\x48\xbc\xc5\xcb\x0d\xa7\x2d\x33\x0d\x2c\xb6\x2e\xd7\x48\x45\xe1\x05\xf0\xad\x81\x83\x42\x8c\x03\xe3\xf5\xdd\xaf\x3b\x5b\x24\x4d\xc2\x9b\x3f\x81\x1b\xe3\x33\xae\xd5\x0f\x08\xe8\x7f\x79\x5f\xc5\x18\xce\x46\xe6\x19\x03\x8d\x12\xc6\xb0\x33\x9f\xbc\x93\xcf\x48\xe3\xf6\x7b\xed\xae\x7f\xe4\x9f\xd8\xec\x43\xe8\xc6\x72\xe6\x2d\xe0\x2d\x63\x2c\x16\xbb\x6b\xf5\xd8\xa8\x7a\x11\x7d\x3e\x52\x12\x55\x20\xc5\x68\x2e\xba\xf4\x97\x74\x82\x9f\x21\x8e\xac\x8e\x74\x62\x42\xde\x7f\x62\xb2\xc6\xf6\x9a\xb6\xc0\x95\xd2\xca\xd4\x52\x84\x77\xee\x27\xd5\xe0\x4b\x45\xd8\xff\x8c\x1c\x36\xa5\x08\x5a\xf2\x50\x03\xcb\x8e\x54\xb9\x61\xee\xe2\x4a\x06\xef\x71\x4e\x25\x62\xb5\x6b\xfb\x4b\xa6\x3c\x35\xee\x1b\x71\xb6\x42\x4d\xa9\xdd\x71\x87\xb5\x6e\x09\xd6\x9a\x2b\x58\xa2\x53\x39\xd9\x1d\x3f\x3f\x7e\x5f\xc7\x3f\xfc\xf0\x95\xd2\x02\x7c\xc7\x90\xc1\xd0\x21\x54\x79\x7d\x5e\x7d\xb9\xcc\xdc\x96\x31\x46\x2d\x94\x22\x63\xe7\xe0\x20\x50\x0c\x5a\x79\xfa\x42\xe8\x5b\x62\x7c\x93\x85\x35\xbd\x91\xe0\xdb\x52\x9a\xb7\xa3\xfd\x9e\x47\xa6\x3c\xf3\x5e\x02\x69\x87\x08\xd6\xea\x12\x60\x4f\x8f\xc5\x13\xf0\xac\x96\xbf\xa5\xa7\x37\x98\x39\x48\x5a\x85\x5f\x3e\xcb\x88\x09\x45\xb1\x45\x8f\x53\x6d\xac\x5b\x26\x23\xee\x26\x7b\x1c\xa9\xd7\xdd\x54\x6f\xa3\xd9\xa4\x7d\xb5\x59\xb3\xee\x7d\xe2\x4d\xcb\xc2\xf8\xc2\x29\x52\xdb\x4f\xc9\xec\xdd\x47\xf0\xa8\x0e\x5c\x81\xec\xec\x96\x81\x57\x1d\xaf\x97\x5f\x28\x29\xcb\xe1\xee\xee\xcd\x4e\xfe\x12\x06\xe5\x12\xf1\x8e\xfd\x88\xe4\x0e\x6c\x8a\xc3\xa7\x88\x12\xd0\xc1\x39\xf2\x13\x4c\x16\xc5\x92\x2f\x0e\xb0\xe3\xa4\xae\x74\x49\x23\xa1\x7a\x15\x43\xe6\x21\x90\xfc\xfc\xe8\x82\x5b\x52\x31\xdf\x11\x98\x29\x13\xcd\xcb\xac\x01\x22\xe2\xe8\x17\xcf\xf9\xf5\x8c\xb6\x45\xde\x11\xe6\x98\x77\x41\x5f\xa2\x22\x17\x40\xf6\xb3\x2f\x34\xe2\x9e\x3f\x7e\x7f\xe9\x2b\x6f\x38\x66\x31\x21\x73\x16\x99\x9c\xa5\x49\xa9\x1a\x86\xbd\xa2\x78\xf6\x05\xa7\x0d\x71\x7c\xf3\x87\x79\xac\xeb\xb7\xe3\x40\xa3\xb8\x18\xc6\x2f\x8c\xb5\x73\xa8\x55\xee\x57\xe8\xe0\xc8\xc7\xdf\xde\x32\xf1\xbf\x41\x16\x7c\x4f\xe7\xb9\x40\x74\x6c\xd8\xb1\x0a\x14\x94\xf1\xae\xf7\x3f\xf7\xac\xdd\xaf\xca\x69\x0b\x85\x2a\xad\x34\x1e\x49\xc5\x7e\xdf\x16\x8d\x51\x4f\xf3\xae\xad\x36\x9e\xa1\xac\x8c\x0f\x68\x94\x58\x87\x55\xb0\x2a\xae\xc7\xe5\xad\x77\xa9\xc4\xbb\xe5\x28\x2c\x7c\x84\x42\x82\x99\xac\xd2\x46\x7c\x8a\xf2\xf8\xca\x0b\x16\x40\x98\x34\x06\xe9\xb0\x5f\x2c\xad\xa8\x59\xbd\x5f\x75\x19\x1b\xb2\x15\xb0\xb6\x5d\x98\x1d\xb8\x74\x77\x46\xa9\xac\x39\x51\x50\x62\x1e\x04\x1c\xbe\x92\xe5\x4b\xcf\x5e\xf3\xf4\xd7\x91\xe3\x0c\xf3\x9d\x9b\x44\x85\xe8\x55\x34\xd3\xa9\xc3\x12\x76\xcb\x0b\xf3\x79\x9d\x85\x51\xeb\x3d\x36\xea\x40\x49\x55\xa4\x1f\xe2\x15\xff\x09\x07\x13\xd1\xee\x6d\xb0\x15\x7d\x71\xc6\x83\x76\x08\x5e\x13\xf3\x5f\x42\x77\x55\x11\x4b\x80\xfd\xb6\x33\x2d\xea\xa7\x27\x4c\x28\xbd\xd7\x4e\x71\x1f\x7b\x79\xdb\x12\x88\x7b\x72\x83\x56\x51\x92\x87\x5c\x84\x88\xa1\x54\xce\x09\x0a\x98\xc9\x8d\x8f\x33\xa7\x99\xe5\x51\xbd\x18\xc5\x09\xd5\xb4\x9b\xf9\x95\x1a\x3c\xc5\x7d\xda\x46\x15\x19\xbe\x3b\x9c\x55\x8e\xc6\x6d\x01\x12\xea\x69\x24\xed\xe8\x4b\x42\xb5\xe7\x29\x74\x84\x31\xfe\xb2\xb6\xfe\xf2\xd7\x4d\xea\x2a\x76\xe5\xb6\xe7\x40\x9e\xf3\xf5\x47\x05\x0e\x7f\xb7\xcf\x24\x5e\x2a\x71\x71\x62\x47\x69\x2b\xcf\x7f\x64\xf2\xbd\xb5\x1b\xd2\xcc\x0d\xcd\x43\x7b\x75\x8b\x9b\xd9\x85\xdf\xec\xa1\x05\x70\xdf\x13\xe5\x72\x4b\xa6\xde\xaf\xd7\xf6\x65\x61\xdf\x7e\xb6\x2c\xae\xfd\x5d\xa7\xd9\xcd\x36\x72\xde\x38\x82\x5c\xcc\x6a\xaf\x59\x08\x8c\x7e\x8f\xa6\xe2\x3a\x34\xdf\x48\x9c\x0b\xc5\x99\x22\xbc\x17\x93\x9b\x67\x4e\xe0\xcd\xe7\xcb\x5f\x1e\xe3\x15\x2f\x9f\x4f\x05\x10\xc3\x01\x95\xf0\x95\x66\x15\xac\x0d\x0a\x45\xd9\x05\x43\x05\x70\x3b\x8c\x22\x0f\x33\x6c\x02\xd5\xf1\x0c\x3a\x97\x58\xa2\x9c\x57\x86\x45\x89\xe0\x3e\xd1\x0b\xb2\xef\x34\x2a\x2c\xda\xfa\x8e\x7c\x80\x27\xfe\x81\xaa\x12\xbf\x67\x21\x94\x4f\xd9\xe6\x16\xca\x30\x9d\x7c\xd3\x6d\xb1\xef\x7f\x63\x8c\x27\x5d\x04\x08\x22\x94\x10\x1c\xe0\x83\xfe\xc1\x87\xbe\xba\xf9\xd2\xaf\xd3\xcb\x6a\x2a\xde\x13\x76\xd6\x77\x07\xd3\x65\x09\x6f\x3f\xba\x14\xe4\x11\x65\x5d\xa3\x37\x00\xd6\x60\xd4\x52\x1d\x56\x3b\xfe\x24\x70\xf1\xdd\x1f\xfb\xe9\xfc\x8e\xc4\x5e\xc0\x05\x52\x34\xdf\xce\x46\xc1\x9c\x4b\xb5\xd6\xd6\x74\x5f\x00\x56\x8b\x36\xa8\xe3\x72\xd6\x9e\xb5\xd2\xf6\xea\xb4\xb7\xe2\x4c\xc0\x8f\xb6\x7c\x72\x11\xff\x9b\x25\x40\xf3\x25\x6f\x06\x9b\x61\xb9\x0e\x80\xba\xae\x34\x86\x07\x14\x69\xfa\x2c\xfb\x52\x8b\x86\xe3\xbf\xf4\xf8\x91\x9a\x88\x2f\x6c\x1a\x74\xa1\xde\x3d\xd4\x21\xd7\x46\x35\xf0\x2f\x3a\x7e\xd2\xfb\x80\x78\xc3\xfe\x27\x3a\x5e\x63\x95\x2a\xba\xb5\xf0\xa8\xa3\x1a\x7a\xc8\x62\xd8\xf5\x51\x5d\x32\x48\xf1\x15\x6e\x54\x81\x68\x33\xff\x25\x1d\xac\xe8\x05\x05\xc1\xc4\x8a\xff\x72\x30\xb1\xb5\xf0\x69\x92\xb3\x5a\xdc\x73\x33\x17\x5d\x7e\x42\xf2\x44\x32\xe7\xc2\x58\xf6\x28\x2d\x6e\x8d\x6c\xb5\x07\xf3\x3a\x68\x36\x01\x0f\x50\xbd\x30\x54\xf4\x32\x41\x61\x8e\xe1\x10\x76\x6e\x9f\xef\x42\xa4\xc2\xcf\x66\x71\x3e\x61\x85\xaa\xf2\x6d\x01\x4b\x81\xa8\x2a\x9e\x3e\xa8\x6a\x26\xe8\x62\xcb\xf3\xe8\x2e\x8d\xa0\xcd\x43\x77\xa6\x92\x85\xcd\xbe\xe2\xd5\x91\x6d\x4d\x53\x5f\x30\xed\xe3\x52\x58\x1b\xa8\x34\xb4\x8c\x78\xd1\x0d\xd7\x23\x02\x05\x51\x6d\x29\x51\xd7\x7a\xef\xe1\xb6\xdf\x4a\xc6\x79\x36\xba\x99\x94\xbf\x34\xfb\x2f\xd0\x7a\xca\x07\xf0\x85\xf8\x7b\x93\x82\x22\x3d\xe7\x51\x08\x0b\x89\xec\x58\xfa\x61\xb2\x86\x29\x66\x3b\xe7\xd0\xcf\x31\x55\x37\xc7\x68\xae\x08\x32\xb9\xf4\xb1\x51\x0c\xa5\xc0\x64\x9c\xc1\x8f\x14\xd8\x43\xb4\x0f\xf4\x66\x8c\x74\x2f\xe5\x60\x1a\xbf\xdc\x5f\xc2\xa6\xc1\x23\xa7\x61\xe9\xdd\x25\x20\x08\x52\x97\x26\x03\x50\xb2\x76\x92\x31\x11\x4b\xa8\xbf\xf5\x16\x66\x1c\x84\xcd\x6d\xa1\x86\xf8\x19\x35\x49\x63\xac\xd1\x0a\xb4\xe3\x21\x53\x5b\x5f\x2c\xc0\xec\xf4\x08\x3f\xc9\x03\x7d\xdb\xec\x21\x24\x1e\xf9\x53\xdf\x5a\x36\xd3\x3a\x94\xfa\x04\x27\xe6\x38\x5f\xbb\x30\xe2\xe9\x4f\x43\x46\x00\xda\xed\x7b\x39\x61\x7e\xc1\x30\x53\x76\x39\x76\x65\x6a\xec\xbd\x46\x3f\x8c\x2d\x16\xec\xe3\x91\xd1\xc6\xa4\x9e\x27\x5d\xf0\x93\xed\xdf\x28\x3c\xe5\xde\xf8\x42\xa0\x91\x10\x41\x95\x9e\xe5\xc8\x52\x8c\x24\x8c\x41\x3b\xd7\x49\x87\x42\x9c\x55\xb9\xdf\xde\x22\x93\x16\x62\x15\xeb\xe5\x02\x54\xbd\x14\xa9\x19\x7e\x20\x71\x95\xe8\xbb\x7a\x87\x3a\xd2\x4d\x81\x91\xb9\x97\x2d\xc4\x3a\x2b\xea\x25\xc1\xfb\xda\xf3\xa1\xc6\xdf\xbf\x84\x2d\x3e\xe6\x97\x0b\x80\xf5\x56\xf4\x46\x83\x9f\x6f\x6a\x67\x1c\x69\x08\x78\xef\x70\x7f\x7c\x45\x5f\xee\xb8\x55\x51\x8d\x76\x64\x1b\xd5\x53\xa0\x5d\xc8\xdf\xff\x05\x40\x7b\x78\xc7\x7a\x51\x4e\x0e\x30\x1d\xf7\x8a\x7b\x6f\x87\xe6\x92\xed\x46\xbf\x3f\x47\x85\xa5\xb8\x90\xbb\xac\x6e\x16\x58\x6d\x05\xc5\xb0\x48\x29\x8d\x6c\x44\x38\xae\xab\x6c\x39\x44\xed\x1a\xab\x84\x0d\x07\xd1\xc9\x42\x82\xb3\x93\x4a\xff\x78\x0a\x19\x9e\x7c\x97\x72\xfc\x97\x4f\x78\xca\x73\xf3\x85\x78\x3f\xff\x4f\x3e\xc1\xa0\x20\xe3\x32\xb8\xa4\x01\x6e\x77\xed\x25\x39\x7b\x81\x4a\x94\x53\x11\x54\xdb\x08\x43\xe5\xb4\x37\x73\xee\x6d\xee\xe9\x2e\x28\x6f\x49\xaa\x1f\x4c\xe5\xbc\x45\x51\x1e\x87\xeb\xe6\x42\x65\xac\xbe\xe1\x42\x98\xfe\xf3\xbe\x1c\xd9\xb8\xeb\xa5\x97\xe4\xd4\xdc\x10\xc8\x0b\x2a\x3e\xaf\x63\x77\x6f\xfe\xc3\x65\x6d\xfb\x8d\x03\x41\x68\xc1\xcc\x82\xd6\x44\x05\xeb\x85\x00\xa7\xba\x92\x91\x32\x2d\x66\x54\x35\xc8\xf4\xd5\x2d\xc7\x44\x47\x10\x6c\xa5\x24\x8b\xcd\xf4\xa2\x40\xdc\xaa\xea\x22\x93\xbd\x37\xba\x6e\xa1\x55\x09\x4f\xb8\x1e\x5d\x7e\x24\x31\x3f\xe5\xc0\xf8\x42\x48\xa1\x10\x31\x01\xd3\xc8\x39\xa1\x05\x9e\x9f\x62\xce\xb2\x68\x96\x7e\x3b\x17\x72\x35\xcf\xe0\xa9\x85\x15\x3f\xa2\xb0\x86\x6f\x6c\x18\xb4\x1b\xbd\x6f\x03\x3a\xa1\x95\xfc\x25\xe1\x8d\x00\x7c\x60\x30\x6b\x1b\x89\x1e\x9a\x1a\xb3\xd8\x42\x4a\x79\xad\xab\xaa\xc8\x54\xd9\xca\x1f\xb4\x84\x13\xf0\x11\x66\x05\x41\x05\x3b\x8f\x42\x9f\x15\xae\xf6\x4f\xf3\x76\x79\x05\xcd\x80\xdf\x99\x1a\xe1\xea\xe5\x0f\x45\x45\xd4\xd7\x34\x7e\x51\xff\xe1\x5c\xa1\x9c\xaa\x6b\x47\x46\x3c\x57\x4e\xd0\x28\x59\x24\x49\xa3\x8a\x34\x57\xef\xfc\x85\xfb\x80\xa8\x6b\x8c\xf7\x1a\x3b\x7a\xb9\xf6\xdf\x31\xf6\xa4\xc7\x03\x81\x85\x82\x06\x4d\x4b\x62\x1b\xdf\x42\x47\x34\xe0\x0e\x23\x5f\x97\x52\xc2\xb9\x9f\xc3\x5f\xb1\xea\x1a\xc5\xbf\xb6\x20\x2e\x5a\x1e\x09\xcd\x11\x4b\x02\xa9\xff\x33\x38\x2b\x1d\x02\xe1\x2e\x3f\x4e\x8b\xf8\xc9\xcf\xdf\x46\x9c\x14\x7f\x4b\x4d\xb8\xb9\x3f\x6f\xdf\xd4\x0e\x56\x56\x10\x43\x05\x45\xb9\xfb\x59\x37\x42\x16\x97\xce\x50\x8b\xec\xdc\x7c\xce\x98\x5e\x73\x1d\x47\x08\x13\x39\x85\xdd\x6a\x37\xe9\xb0\x61\xef\xd7\x03\xe2\x8e\xa3\x93\x6d\x05\xcf\x9b\x61\x7c\x3f\xf9\x15\x2b\xd7\x6b\x61\x86\x6c\x56\x78\xb0\x37\xf2\x9a\x70\xb9\xef\x11\x79\xd3\xb9\x31\x82\x9a\x06\xbd\x8d\xe1\x45\x63\xd4\xbd\x2f\xb3\x1a\x72\x17\xd8\x38\x93\x45\x47\xdf\x51\x35\x97\xd7\x7e\xd7\x52\x78\xd6\x49\x38\x71\x94\xee\xf2\x6f\x7e\x9f\xba\xce\x7c\x21\x42\x98\xff\x59\xba\x7c\x42\x1d\x0a\x77\x69\xc7\x36\x2a\x55\xe2\x11\x55\xe1\xc9\x35\x52\x6c\x78\xa5\x32\xb7\xf4\x86\x2f\xd1\xcd\x65\xa2\xbd\x8e\x95\x80\x4e\x04\x51\x50\xcf\xd9\x8f\xb6\xc7\x11\x4c\x18\xdf\xc8\xb3\xa9\x44\x06\xf8\xcc\x39\xc0\x12\x7a\xb4\xe8\xef\xaf\x25\x67\x25\x77\x80\x32\x7d\x33\xea\x10\x21\x92\xe3\x4a\x6f\x2a\xbb\x03\xa5\x88\x87\x98\x03\x17\xcb\x48\x6b\x6c\xb3\x7e\x58\xad\xfd\xe8\x13\x35\x33\x4d\xb0\xfc\x20\xf2\x05\xe6\x33\x35\xe4\x02\x11\xed\x37\x55\x1a\xbf\xe5\xd3\xb9\x48\x6c\xb4\x5f\xb6\xdc\x50\x59\xd4\x9d\x34\xce\xe4\xec\xf2\x59\x9c\x7b\x63\xfe\xff\xc0\xa7\x7e\xbb\xf2\xbf\x3f\x3c\x78\x9c\x0a\x26\x3d\xd5\x74\xff\x74\x56\x3b\xd8\xac\x32\xfb\x98\x1f\x53\x1e\xa5\xfa\x6c\x47\xe8\xba\x27\x9a\xa5\xdf\xd7\x97\x49\xce\xe4\x01\xd9\xef\xf7\xef\x5f\x33\x4f\x45\xd2\x9b\xfa\xe9\x20\x43\xe4\x6e\x26\xe3\xd2\xa5\x1d\x04\x60\xec\xfe\x6a\x51\xff\xfc\x7b\xd5\xad\x49\xf5\x07\xe8\xef\x7c\x19\xec\x65\xa3\xfa\x47\x32\x3a\xc9\xc0\x12\xb6\x6f\x99\xc1\x25\xb0\x1f\x7f\x1e\xa3\xba\xf8\x49\x48\xfd\xda\x41\x9f\xcc\x01\x85\x87\xdb\x32\xec\x3e\x6b\x4f\x0a\xaa\x64\x69\x4a\x24\xbc\x5a\xc0\x7d\x57\xb0\x2f\x00\xb1\x0c\x41\x84\x58\xa5\x93\x07\x61\x15\x44\x82\xec\x37\x2f\x8e\xa2\x3f\xae\x76\x87\x7f\xfd\xc2\x35\x78\x3c\x38\x11\x3a\x96\xe1\xe6\xb2\xa9\x58\x64\x70\x46\x67\xa1\x49\x6b\xe1\xcf\xab\x81\x05\x26\x26\x8b\x5a\x47\xd1\x25\x6f\x3e\xb6\xff\x8a\xb9\xd9\xf2\x79\x42\xb0\x40\x50\xd3\x5e\x75\x7a\xab\x6f\x35\xe6\x4e\x6d\x91\x18\xe4\xd1\x2a\xa3\xe8\xdb\xdb\xea\xc5\x9f\xe6\xbf\x9f\xb1\xfb\x2e\x67\x48\x93\x33\xe0\x43\xef\x8a\x38\x2c\x44\x8d\x98\xe5\x7d\x7e\x5b\xd7\x1c\x0e\x34\xca\x16\x60\xc1\xd4\x3a\x4f\xbb\x53\x41\x92\xd4\x9b\xd3\x34\x43\xda\x8b\x57\x90\xce\xf9\xc0\x43\xe1\x39\xd8\x1e\xd9\x85\x4f\x04\x68\xa9\x7b\xbe\xe9\xc4\x65\x68\xcb\x0c\x6e\x61\x21\x43\x7a\x5b\x77\xb0\x20\xd4\x43\x37\x4d\xec\x5f\xd7\x2d\xa2\x8f\x47\xfb\x35\xa0\xa9\x0f\x74\xae\x06\xe5\x94\x60\x65\xb5\xc5\xda\x53\x26\x0a\x8e\xa9\x7f\xce\x2a\xb6\x07\x56\x98\xe5\xdb\xdc\x93\x1b\x28\x19\xf6\xba\x31\x4a\x3b\x3f\xda\xef\x4e\x83\x76\xe2\x5f\xc7\x9b\xb0\x71\x1b\x57\xe1\x63\x62\x9c\xb3\xb5\x2b\x85\x39\x53\x89\xce\x42\xbb\x88\x20\xda\xe0\x7b\x0e\x32\x84\x5e\xe1\x68\x90\xb3\x6f\xf8\x6a\x47\xaa\x9b\x64\x9b\x32\xd0\x6a\x73\xba\xe1\x79\x78\x40\x1f\x31\x16\xf2\xd3\xc8\x27\xd7\xa5\x03\x0c\x29\x01\xf8\x8f\xc7\xc3\xfe\xdc\xba\x70\x55\x6d\x32\x76\x0a\x7c\x7c\x13\x97\x25\x68\xb7\xc7\xbb\x9f\xad\x98\x29\xcc\xee\xba\x0c\x78\x1e\x91\x03\x0c\x66\x75\x91\x0f\x1e\xdc\x58\x9e\x5a\xe9\x22\x47\xe7\x1f\x96\x38\x0d\x8c\x8f\xd0\x69\x34\x70\xa4\x2e\x8a\xac\x88\x29\x89\x81\x91\x5a\x91\xc2\x10\x73\x91\x13\x4d\xdc\x20\x1a\xfc\xdd\x69\xa0\xb2\xc0\x37\xfc\x71\x8c\x35\x4b\x36\xe5\x52\x28\xd0\x32\x7e\xbb\x0f\xa8\xc1\xdb\xd0\x80\xd3\x5e\xaf\x2f\xd5\x10\xae\x29\xe9\x7d\xcb\x43\x17\x68\x68\x86\x35\xeb\x96\xa6\x59\xb3\x9d\x6a\x53\x10\x4c\xce\x04\x2a\xc2\x4a\x40\xdb\xa6\x63\x8b\x1e\xf9\x2c\xdc\x6d\xb7\xba\x13\xe3\x08\xb0\x29\x2b\xe2\x61\x21\x4a\xe7\x23\xe5\x67\xb1\xcf\xdb\x21\x02\x1c\x89\x6e\xf3\xf8\x84\xc3\x79\x3f\xa4\x7d\xa3\x0b\x3d\x5c\x1c\x2d\x98\x8b\xf9\x6d\xbe\xf8\x50\xf5\x05\x15\xea\x6f\x44\x22\xe4\x21\xcf\x81\x46\xbf\xbe\xa4\x6a\x13\xb3\x37\xfc\xa0\x4f\xdb\xb8\xd8\x67\xdf\x75\x84\xe0\xed\x68\x64\x5f\x77\xd8\x83\x26\x2e\xca\xf0\xe0\x6d\x01\xfe\x46\xa2\xe6\xbd\xcb\xd8\x1f\x48\x59\xfe\x4b\x26\x53\xcc\xb7\xb0\x3c\xf4\x5e\x1a\x6e\xcf\x3e\xc9\xbe\x63\x3b\xfa\x31\x88\xde\x13\x78\x04\xce\x69\x73\xa0\x32\xa2\xdf\x29\x29\xec\x4a\x8e\x80\x9d\x42\xb1\x4e\x8a\x66\xb1\x38\x01\x26\xf1\x47\xb4\xf4\xc2\x54\xa9\xa8\x2c\x7f\x30\x03\xb2\x34\x19\x63\xdf\x38\xde\xad\xc4\xde\x80\x5d\xbf\x3c\x5c\xb2\x6b\x45\xdc\x6c\x17\xdc\x4a\xfc\x66\x2c\xae\x0d\xf1\x98\xa2\x0c\x05\x80\xb6\xc7\xde\xa6\x74\x64\x8b\x34\x0a\xcd\x18\xce\xb1\xd8\xed\xbc\xcf\xdb\x38\x75\xf5\x36\xe6\xa1\x79\xfb\x61\x73\x68\x63\x1f\x4d\x02\xd0\xf9\x59\x84\x14\x89\xd4\x7e\x27\xeb\xa3\x3d\xd7\xc8\x8c\x1b\x6e\x43\x4a\xc8\x48\x26\xdb\x2c\x10\xd1\xa5\x74\x22\x35\x81\xbe\x04\x4a\x60\xb3\x9b\x9c\x4a\x93\x99\x1a\xd8\x35\x6a\xc2\xe4\xa9\x7d\x05\x25\x97\xa1\x1d\x0d\x5d\xb5\x5b\x0b\x0b\xe2\xbb\x07\xd7\x52\x63\x40\x32\x51\xca\x86\xa5\x4b\xf0\x51\xde\xbb\x12\x3c\xbd\xb9\xf6\x0d\x4a\x95\x7e\x77\xf6\xd6\xf6\x3d\xa9\x9b\x51\x46\x82\xc9\xbb\xd8\x3d\x60\x50\x35\xa4\xe3\x03\xde\xfb\xbd\x4d\xdf\x98\xf9\xc8\x3d\xf8\xfe\xd4\xa6\xcc\x8f\x3f\xaa\x01\x26\x9d\x7d\x3a\xa8\x7e\x1d\xee\x46\xd2\x0f\x58\x53\x9a\x2b\xcf\x46\x1a\x0e\xbe\xfd\xa4\x8b\x33\xcb\x52\x9b\x6d\x98\xb9\x9d\x5a\x3e\x7c\x6f\xf0\xb6\xa5\xf7\x88\x7b\xae\x0c\xda\x19\x68\x94\x2f\x16\x46\x57\x07\xbb\xcc\xde\xad\x1e\x23\xf2\xf3\xbb\x85\xf2\x0c\xfc\xac\x08\x25\xbb\x4d\xb8\xe3\x61\x88\xd5\x48\x9a\x34\x40\x7a\x93\xb4\x33\xe2\xe6\xfe\xbb\x7e\x85\x2a\x7f\x88\xbb\xa6\x3e\x3d\x87\xd3\x1c\xd4\x58\x09\xff\xf9\xc6\x32\x6b\xd6\x1f\x5b\x4b\xbd\x0b\xcc\xd9\xef\x1f\x62\x64\x2b\x4b\x76\xeb\x7f\x70\x29\xde\x0a\x8d\x57\x73\xd6\x37\xe4\x58\xa1\xb8\x61\xc1\x20\xf9\x28\x12\x2c\x81\x0d\x12\xd1\xd1\xad\xf2\xd7\x4b\xa8\x87\x7a\xbf\x9d\xb4\x38\x9a\x39\xb4\xf2\x75\x6e\x9f\x77\xce\xde\x37\xbc\xa5\x29\xa4\xff\x3e\x13\xd0\x82\x0e\x28\xb7\x15\xbe\x58\xb4\x70\x8f\x27\xb3\x35\x53\x36\x4b\x77\x4f\x1a\xac\x3f\xf4\xf8\x12\x2c\xb9\x4f\xdd\xd3\xe4\xc1\xdf\x1c\xfa\x1a\xdc\xa7\x58\xf1\x4b\x76\x2a\x47\x6a\x86\x70\x76\xb4\xf8\x6e\x7a\xf4\x74\x4a\x05\x28\x8e\x4e\x03\x28\x5d\x9e\xdf\x4d\x74\xe3\x4e\xec\xd7\x1e\x1b\x4d\xb9\xec\xcd\x0a\x7f\x2e\x18\x6e\x91\x82\x3d\x83\x4c\x01\x5b\x8f\xe8\xf5\xe2\x77\x88\x06\xc5\xd8\x0f\x23\xee\x3b\x3e\xf5\x3f\x47\x8f\xc8\xf2\x7e\xd8\x51\xae\xf4\xeb\x41\xc1\xee\xd2\xeb\x10\xa5\xbd\x1d\xa6\x9a\x39\x35\x0f\xc9\x95\x1d\x92\x38\x37\xd8\x02\x5f\x1d\x62\xe0\xf3\x43\xe2\x70\x96\x6b\xb9\x97\x67\xd8\x04\xcc\xa8\xe4\x51\xb3\x32\xb5\x1d\x2c\x79\x92\x62\xdf\xea\xcc\x72\xca\xdb\xee\x8e\x97\xc1\x67\x44\xdb\xc8\x17\x72\xe8\x93\x98\x8d\x16\x9d\x05\xdf\xf1\x77\x8b\x8b\x69\xc6\x91\xf3\x25\x6f\xcc\x58\x7a\x9b\x35\x98\xfe\x7c\x00\x76\xf4\xed\x79\x3b\xb1\xf6\xa7\xfb\x31\xc8\x1a\x0c\x96\x8e\x21\x22\x83\x05\x1a\xdd\x98\x6a\xc7\x1b\xb6\xf9\x1b\x9a\x61\x5e\xa6\x4b\xf0\x5d\xc1\x56\x2e\x51\x1f\xe3\xe7\x65\xbd\xda\x38\x83\x6d\x58\x21\x92\xf1\x8b\x16\x56\x03\x82\x70\x1f\xb4\x30\x1e\x65\x06\xeb\x3d\x8e\xff\x64\x95\xfc\xc4\x30\xd2\x49\x9d\x51\xc7\xd7\xbb\xfe\xa0\xa0\xce\xe4\x25\x08\x56\x0b\xdb\x1f\x8c\xfb\xe0\x79\x0e\x28\xc3\x3b\x7a\x45\x5e\x02\x50\x3e\x56\x1b\xf1\x3e\x1a\xc9\xa1\x87\xa9\x99\x91\x39\x1b\x6e\x39\x26\x13\x1c\x14\xf9\xfc\x6f\x42\xed\x2c\xb8\x3d\x84\xe8\xb9\x5e\x8f\xf6\x93\x34\x99\xe8\xfe\x3c\xb4\xc5\xde\xea\x3d\x59\x2f\xbd\x2d\x45\xa3\x4f\x5e\xb6\xc8\x9d\xdb\xfd\x9a\x84\x35\x6d\x08\x5f\xe9\x24\xf3\x68\x15\x8f\x04\xeb\xf0\xb8\x62\x8e\xc1\xa1\x26\x46\xc4\x32\x7c\x6d\xf1\x17\x8b\x5e\x49\xb2\x42\x47\x5b\x93\xde\x4a\xbc\xed\xb3\x37\x5c\x80\x92\xbd\xce\x6c\x85\x1e\x74\x14\xe2\xf0\xb7\x69\xc4\xac\x6b\xb9\xd6\xbf\x6f\xa2\x61\x0f\x9f\x5d\xd3\x70\xb3\xcb\xaf\xdd\x15\x1d\x31\x83\x46\xbd\xef\xdd\xa7\xe3\xfa\xb0\x60\x9e\xfd\x6a\x3a\x5f\x6f\xb6\xed\xeb\x6f\x0e\x78\x65\x6f\x07\x23\x7e\x97\x22\xe6\x26\x53\xe1\xba\x3e\x80\x5a\xf1\xdb\xaa\x3d\xbc\x35\x87\x9c\x8e\xc2\xac\x2e\xeb\x35\xe1\x02\xbd\xdc\x52\xd6\x44\x8a\x48\xf6\x5c\x5f\x4e\x0b\xa5\x15\x04\x48\xab\xe8\xf4\x3e\xcb\x4d\x85\xf4\x45\x13\xb4\x90\x94\x3f\x1c\xe6\x55\x9a\xb8\xa8\x61\xe9\xa9\xc9\x72\xe5\xe8\xe2\x06\xd3\x53\x67\xfc\x47\x0d\xcd\x85\x16\xa5\x23\x05\x31\x0c\x53\xdd\x37\x5d\x2f\xbe\xf0\x6d\xa6\x73\x3c\xe3\x4f\x82\xf5\xfc\x20\x04\x98\x14\x06\x94\x1c\x0d\x7c\x90\xf3\xc9\x08\x9d\x8e\xe0\xba\xb8\xf6\xf7\xfb\x65\x6f\xdc\x0e\xff\xf4\xb0\x1c\x33\x06\xe9\xed\x90\x21\xeb\x2b\x23\x37\x81\x2a\xeb\x86\xc7\x59\xf5\x33\x37\x4c\x34\x73\xde\x08\x6e\x63\x4d\xf9\xb9\x6f\xda\xea\x82\x93\xa0\x3e\xd7\x6b\x83\x81\x5f\xdb\x5f\xbb\x5c\x59\x77\xc5\x0d\x66\x35\x71\xbc\x29\x3c\xdb\x47\x8f\xa0\x13\xbb\x50\xc3\x3d\x05\x05\xcd\xec\x36\x82\x13\x51\xd5\xa4\x87\x2d\x71\x17\xcf\x3a\x50\x37\x81\xb2\xf6\xd8\x70\xee\xe3\x8d\x98\x2c\x5c\xd8\x90\xe0\x1d\xe4\x61\x6e\x8e\xab\xa8\xbc\xd9\xe8\xa9\xba\xd8\x97\x1d\x88\x09\xc3\x82\x92\xff\x94\x9d\x9f\xba\x4e\x7d\x21\x6d\x64\x0a\xde\x80\xb2\xf3\xb4\x7f\x26\xe7\x8d\xcd\xc3\xb2\x67\x30\x0e\x5e\xf6\x50\x67\x02\xbd\x96\x95\x51\x63\x5f\x0e\x91\xb8\xdf\x4c\xe5\x7d\x40\x06\x98\x2d\x28\x31\x15\x1c\xdc\xe0\x64\xb0\xbd\x16\xc4\x3f\x6b\xe9\x36\x1b\xa6\xa6\x26\x30\x83\xae\x35\x4e\x44\x11\xe8\xfa\x10\xc7\xfc\x07\x16\x7c\x97\xad\x16\xdf\xeb\x13\x39\x35\xaa\xca\xa0\x0f\x89\xd2\x8f\xf8\xf8\xfa\x21\xc4\x79\x75\xaf\x34\x75\xe4\x7b\xaf\x26\x5a\xc5\x32\x58\xd7\xb8\x03\xbb\x2b\xc9\x8b\x4c\xa7\x4c\xb9\x75\x5c\x7f\xa2\x9d\xc0\x43\x01\x3b\xee\x33\xdb\x3a\xdc\xa3\x22\xc2\x57\xb2\x46\x6d\x06\xaa\xd3\x8c\x4e\xac\x38\xaa\x7e\x4b\xfb\x33\x04\xf1\x77\xe7\x57\x0b\x0f\xdf\x0f\xc7\x69\xc5\x32\x63\x13\xa5\x4e\xaa\xe7\x9c\x7b\xb3\xd3\x0f\xd2\x76\x1a\xda\x42\x75\x53\x7e\x7f\xad\x94\x91\x13\x26\x78\x96\x8d\xc1\x7b\x7d\x9a\xd1\x26\xb1\xc9\xdf\xb7\x8d\xb5\x6e\xb6\x9a\x0a\x4a\x66\xd9\x1f\x2a\x9d\x6c\x3e\x74\x20\xf8\xd8\xc3\x11\xe7\xb9\x55\xa6\x0d\x70\xd4\xf7\x35\xef\xc7\xff\xea\x79\x61\xf4\xe9\xda\xb2\x63\xf4\x9f\xe3\xfc\xd4\xb5\xe6\x0b\xc1\x84\x86\xfd\x0f\xef\xae\xb7\xec\xb7\x44\x8c\x74\xfd\x4c\x00\x77\x35\x6c\x89\x9a\xc6\xf3\x9e\x6a\x42\x05\x5a\xf5\xbf\x99\x6f\x83\xfa\x43\x72\x4b\xc1\xda\x8a\x8d\x9a\x96\x3e\x1b\xc9\xce\x2b\x27\xd6\x07\x3c\x9a\xfe\x55\xa9\x29\x24\x19\xe6\x56\xf3\xe0\x3c\xfa\xd2\xae\x35\x4f\x13\x49\x04\x00\x5a\xf5\xdb\x99\xf0\xcf\xe2\x9c\xe0\xb6\x6b\x4e\xa5\x59\x3e\xfa\x42\xee\x87\x0a\xf4\x9c\x87\x1f\x5f\xa2\x71\x0c\xf1\xfe\xd8\xc6\x81\xcf\xb7\xe9\x4b\x96\xb1\xf8\x88\x8c\xf1\x3f\x77\x51\x5e\xe4\xec\xbb\x97\x2b\xc8\x7e\x54\xef\x0d\x14\xd0\x09\xb7\x6c\xdb\x76\x63\x91\x83\xfb\x17\xd4\x3f\x75\x0d\xfb\x42\xc4\x60\xa0\xa1\x80\xa0\xde\xc2\x37\xaa\x81\xcb\x4a\x82\xc4\xd0\xfe\xe1\x0a\x5f\x86\xf0\x9b\xce\xcd\x11\x97\xe2\x92\x71\x3a\xbb\x80\x54\x02\xe7\xdb\x03\x90\x11\x74\x33\x23\x69\xd8\xfe\x59\x35\x0b\x3d\xca\x27\x9a\xa8\xc1\x85\x00\x42\xe3\xda\x46\x19\x50\x6e\x0d\xc7\xc8\xb2\x7b\x18\x24\x03\xae\x30\x8d\x9e\x44\xa1\xa3\xc0\x0c\x7a\xaa\xdb\x10\x46\xfe\x91\x49\x8f\x19\x4b\xb8\x78\x21\xa5\x3b\xb1\xdf\xd5\xcd\xf4\xbf\x70\xe5\xc1\x70\x96\x8d\xb7\xf2\x5b\x3a\xcf\x1a\xb9\xf6\x6f\x16\x58\x0a\xc7\x89\xca\x5d\xac\xfe\xc6\x4d\x6c\xcb\xc3\x63\x09\x71\x28\x27\x39\x7a\x4b\xb0\xe8\x2c\x59\xe5\x19\x53\xdc\xb4\x97\xd2\x87\xe7\x09\x30\xc8\x7b\xb9\x5a\xee\xbe\x7a\x92\x12\xc1\x08\xbe\x74\x3c\x7f\xe2\xf0\xec\x66\xfe\x8d\xc2\x53\x1e\x86\x2f\xe4\x19\x14\x34\x05\x30\x0a\xf5\xdf\xcb\x13\xa6\x82\xf0\xd7\xc3\x5a\xca\xe1\x9e\x43\x6f\xbe\xc2\x4b\xbc\xcd\x10\x35\x34\x38\x1f\xb6\xeb\xfd\xc3\x48\xe8\x3e\x04\x74\x22\x9a\xf6\x6c\xb3\x34\xbe\x38\x14\xed\x4f\x64\x74\x75\x6d\xbf\xcd\x7c\x90\x9d\xb9\x95\x56\xd7\xf7\xec\xae\x91\x22\xa9\x54\x2a\x30\x32\xea\xc9\xee\xc2\x92\x32\x94\x78\x3e\x2e\xd5\x57\xb0\x0a\xc7\x57\xe1\x97\x5a\xd0\x13\x02\xe9\x94\x57\x75\x08\x1b\xf6\xd2\x31\xcc\x02\xa0\x5d\xb3\xaf\x61\x7f\xfb\x72\xf0\x5b\xa8\xa5\xf1\xf5\x49\x62\x26\xdb\xb0\xfd\x0c\xd0\x6d\x57\x14\x12\x19\x41\x64\x0e\xda\x42\x04\xeb\xd3\x4c\x85\x89\x78\xba\x05\x1d\x56\xaf\x2b\xe7\x31\x30\x77\xe8\xc7\xda\x56\x87\x3e\x92\x9e\x61\x9c\x9b\x64\x5b\x15\xb8\x7f\x3b\x7b\x8c\x0f\x9f\xba\x6a\x7c\x21\x88\xd0\x50\xaf\x81\x65\x1e\x6b\x2b\x07\x3f\x06\x43\x9b\x4c\xec\x97\x7b\xcc\xa8\x1c\x2d\x49\xc5\x61\x79\x86\x8a\x7f\x80\x1e\xfa\xca\x86\x6b\x53\x4c\x02\x54\x9d\x49\x4e\x1b\xc2\x85\xb3\x1c\x15\xe0\x9d\x9b\x3c\xa1\xb5\x88\xcf\x4e\x44\xd2\xf9\x62\xda\x6c\x15\x7d\xcc\x41\x54\x3b\xd8\x2d\x0f\x12\xef\x78\x3b\x88\xe5\x18\x54\x5e\x44\xd8\x7c\x5e\x0b\x24\xe3\x97\xce\xc3\xad\x95\xdd\xf2\xbb\x95\xbd\xe6\x59\x55\xb2\xb7\x50\x6c\x01\xab\x30\x7f\x45\xae\x23\xfb\x99\xa7\x9f\x0b\x23\xf2\xe4\x1f\x04\x4f\x9e\x85\xa5\xdc\xb7\x85\x3e\x1b\x7a\x0e\xa7\xfa\x2d\x83\x8a\xa5\xa3\xfb\xdf\xe9\xf8\xd4\xd5\xe8\x0b\xd1\xc7\x84\x90\x02\xa7\x23\xc7\xc4\x85\xee\x9e\x88\x6a\x18\xee\xb6\x71\x4f\xc4\xd7\x9a\x53\x38\xe4\xfe\x60\x34\xd3\x29\xe5\xae\x91\xbb\x7a\x5e\xf5\x5f\x45\xe0\x04\xcb\x3b\xe9\x34\x95\x05\xe0\xd6\xd2\x3d\x34\x4a\x76\xab\xaa\xe6\xa2\xee\x5a\x2f\xbf\xb4\xa0\x9a\x2a\xa5\xf7\xcf\x31\xb2\xa8\x05\xa0\x4a\x2c\xbf\x6c\x8c\x7d\xea\x8e\xd7\x25\x07\x85\xf9\x60\xb6\xe8\xc9\x42\xa7\x28\x5f\x36\x22\x42\xf5\x6c\xa6\x16\xa9\x7c\xda\x00\x13\x52\x1f\xa1\x04\x6b\x74\xb8\xf6\x5d\x7e\x20\xf8\x63\x18\xcf\x33\xd8\xec\x9b\xbe\xfc\xf5\xe6\x52\x9a\x4f\xed\xf7\xe7\x62\x92\x77\xcd\x33\x00\x34\xf4\x47\xbc\xd8\xf2\x0f\xba\x95\xdb\x8c\x79\xa4\xe7\x95\x0d\xcf\xc6\x23\xed\xe4\x05\x5f\x1b\x53\x76\x05\xf1\x95\xc9\x6b\x79\x11\x01\x50\x7f\x35\x31\x04\x1c\x73\x33\x8f\x20\x16\x34\x6d\x23\xa2\x8e\x06\x61\x57\xec\x26\x0f\xee\x0f\x05\x5f\x7a\xf5\xa6\x22\x48\xb7\xfe\x02\xd0\xb8\xea\xe6\x82\xb7\xf1\x8a\x58\xf6\x74\x51\xa6\x45\x0e\x6b\x9d\xa8\x7f\x5e\x44\xf6\x1c\x2a\x8f\x6e\x68\x96\x89\xd0\x51\xb5\x7c\xfa\x97\x5b\x79\xf2\x32\x87\x90\x92\xa2\x83\xa4\x37\x62\xca\x55\xc3\x79\x38\x73\xcb\xb5\x1e\x39\xb1\x9a\x85\x83\x72\xf9\x34\xc1\x8e\x51\xe7\x07\x7c\x27\x46\x72\xad\x56\xff\x52\xf0\x67\x27\x1d\x19\x78\x0c\x47\x07\x88\xd7\x01\x3c\x87\xc5\xf5\x7f\x30\x49\xe3\x3a\x2f\x37\xe7\x25\x67\x55\xde\x36\x7a\xcf\x4b\x62\xbe\x01\x25\xfd\x65\x4c\xbe\xc1\x99\x55\x31\xf0\x93\x32\xd2\xf7\xc6\xd3\x12\xa7\xf1\xbc\x9e\xf1\x8d\xcd\x4e\x14\xb9\x63\xb0\x66\x2f\xdd\xf5\x00\x49\xff\x3e\xc1\xb0\x52\x5a\x1a\x74\x5e\xe3\x02\x0c\xb0\x97\x38\xed\xda\x66\x96\x5a\xc6\xfc\x75\x85\xaf\x37\x73\xda\xa6\xcf\x1a\x26\x5f\x01\xfc\x74\xc6\xb3\x4c\xf8\x08\x0a\x82\x67\xe7\xe9\xd3\xd3\xd1\x2d\xe9\x85\x03\x5c\xab\x1b\x4a\xba\x8c\x6f\x90\xfb\xb1\xd7\xd9\x70\x49\xfe\x2d\xb0\xa7\x3c\x0a\x5f\x08\xac\x6f\x2c\x78\xfd\x3a\x6f\x2c\x64\xd7\xa8\x76\x5c\xa7\xd9\x0b\x5f\x24\xb2\x75\x3f\x97\x09\x29\x17\x8b\xb6\x8e\x36\x99\xc3\x3e\x30\x2d\xc6\xea\x01\x0b\xe5\x7e\x09\xc4\x7b\x5e\xae\x94\x40\x5b\xec\x48\xe0\x6f\x8c\x9d\xaf\x8d\xce\xf4\x3b\xcf\xc8\xf6\x35\x96\x4c\x52\xee\x35\x66\x4c\x83\xa4\x46\x9e\x5f\xe3\x75\x24\x5f\xff\x9a\x53\x64\xec\x85\x16\x32\x3b\xfe\x2e\xa1\xf1\x95\x48\xe9\x40\x54\xeb\x42\x63\xd0\x0f\x10\xa9\x83\x06\x57\xcd\xa4\x7e\xc3\x77\xd5\x4b\xbf\x8b\xb1\xb8\xc2\x20\x81\xda\xd1\x57\xbd\xfb\x50\x44\x64\x4a\xec\x8b\x5b\x65\xfb\x12\xcd\x7c\xe0\x1b\xc4\xc8\x4f\x96\x18\x67\xc6\x9c\x14\x99\x0d\x23\xa9\x9b\xcf\xef\xbd\x54\x5e\xe3\xe1\xb6\xb6\xfa\x89\x27\x98\x58\x4a\x8e\xd7\x59\x81\x13\xc6\xe4\x4e\x77\xca\xa8\xd9\x45\x94\xb1\x7a\x3e\x2c\x12\x9b\x17\x7d\xba\x3f\x6c\x32\x79\x68\xed\xf7\x1b\x5b\x34\x72\x32\x50\x1f\xcc\x51\x97\x9f\x86\x3d\xab\x5c\xf5\x6c\x42\x9d\xfc\x46\x36\x5a\x11\x45\x01\xf5\x2e\xdf\x8b\xe5\x17\x5e\x45\x50\xf1\xeb\x61\x41\xb4\x72\x95\x7f\x75\xab\x4f\xb9\x60\xbe\xa2\x99\x50\x50\xbe\x8f\xd3\xfb\x1e\x5d\x36\x82\xf8\x8d\x85\x46\xef\xea\xef\x3b\xef\xcd\x73\x5a\xa1\xa0\xd8\x26\x7d\xfa\x4e\x71\x44\x94\xe5\xac\x26\x8f\x8a\xc6\xc7\xe9\xb5\xcc\xe4\x5f\x26\xfb\xa6\x64\x65\xac\x8b\x9d\xb6\xfd\x11\x75\xf2\x05\xa7\x13\xde\x6b\xd4\x6f\xcb\xb1\xf2\x27\x14\x63\xe3\xd2\xd3\xc0\x9a\x31\x16\xad\xb5\xed\x2e\xbf\xa5\x40\xce\xeb\x21\xef\x21\x30\xa4\x85\x9f\xef\xae\x17\x6a\x5e\x92\x92\xa4\xfb\x21\xa9\xb3\x12\x0a\x70\x5b\x7e\x87\x08\x84\x4f\xa0\x28\xf1\x39\x78\x95\xc6\xc7\x11\xcb\x54\x70\xc7\x63\x8e\x1a\x1c\x4b\x47\x04\x25\xaa\x64\x4d\x04\xbe\xa2\x3c\xf7\xfe\x1f\xd5\xac\xa7\x7e\x00\xec\x0b\xf1\x3a\x78\x78\x48\x7c\x05\x78\xa3\x30\x74\x17\x13\xd1\x66\x09\xdc\xf7\xe5\x02\xa8\xe5\x4b\x97\xbd\xef\x0f\x31\xfc\xe5\x86\xf3\x64\x11\xcb\xfc\xce\x10\xad\x6b\xaf\x00\xe8\x0a\x83\x55\x12\xdd\x67\xa5\x0b\x7f\x46\xe6\x70\xbc\x8a\x31\xba\x32\x12\x31\x35\xf9\x18\xaa\x01\x91\x37\x6d\x83\xae\x06\xd6\xf2\x40\x5d\x8f\x8b\x02\x7c\x79\x8e\xbf\xf4\x16\x01\x94\x9e\x01\x2e\x23\xcf\x8c\x93\xb6\xf3\x65\xe9\xf1\x89\xab\x06\xac\x43\x23\x0f\xae\x37\xa0\xf8\xbb\x33\x25\xd1\xfb\x2e\x7f\x9e\xdc\x40\x27\x8b\x66\xf3\x21\xc5\x07\xb6\x7b\x35\xb2\x34\x81\x6e\xc1\xf6\x55\x22\xc7\x5d\x1e\x98\xb4\xa2\x7f\x65\xff\xb1\x44\x36\xa6\x35\xd0\xcd\x54\xdd\xea\x1e\x3b\xd9\x5d\x55\x78\x4a\xa3\xf0\x17\xab\x45\x72\x6f\x02\x25\x3f\x26\x18\x0c\xc2\x25\x84\xdd\x9f\x70\x7b\xb0\xdf\x08\x54\xba\x45\xdd\x4f\xfb\x52\x75\xaa\x47\x93\x15\x0c\x7e\xe6\x0d\xe4\xfd\xbe\xac\xe5\x0f\x28\xe7\x24\xa2\xf2\x62\x3e\x88\xda\x35\x42\x9f\x10\x08\x4f\x2e\x6d\x3b\x39\x6b\x7e\x63\xc2\x14\x78\xfe\x91\x32\x0e\xcb\x22\xe9\x4d\xa9\x25\xa0\x71\xe4\xa5\x11\xe9\xfc\x7a\xd2\x2a\xd7\x10\x1d\xc3\x67\x40\xb2\x5b\xc1\xb3\xbd\x50\x79\xd4\x25\xbf\x08\x3d\x61\x2a\x29\xcb\xd7\x03\x98\x59\x5a\xb7\xf7\x04\xd4\x17\xbc\x61\x69\x82\x81\xfd\x88\x83\xab\x6d\x45\xa5\x41\x3b\x81\x6c\x8b\x8e\x1a\xa5\x1b\x3f\x3e\x86\x77\x03\x4f\x97\xe6\x88\x5e\x01\x87\x2f\x38\x24\xa1\x44\x48\xcb\xbf\x47\xf9\xcd\x2e\x7e\xf4\x98\x65\xbe\x48\xfa\xbd\xe2\x64\xd4\x52\xd0\xcf\xd9\x06\x86\x18\xe9\x0a\x71\xbc\x18\x4a\xa4\xa9\xf7\x9d\xbf\xcf\xfd\xf8\x9e\xbf\xbc\xc7\x7f\xbe\x81\x5d\xf0\xfd\x95\x5c\x0b\x3c\x25\xe6\x61\x67\xee\xe3\xf7\x2f\x52\xa2\x4c\x0f\xd3\x55\x17\x4f\x4e\x43\x10\xd4\x56\x20\x82\x05\x03\xf1\x7b\xcc\x41\xec\x9b\xad\x42\x4e\x9f\xd9\x8a\xa3\x01\xe5\x9a\xcb\x4f\xa6\xd1\x1a\x35\xab\x62\x49\xea\xae\xb5\xd4\x7f\x1f\x5e\xf1\x86\xb5\x98\x45\x16\xea\xab\x2c\x2e\xc9\xa8\x61\x8a\x0e\x88\x83\xdf\x2f\x31\xc8\x17\xd1\x6f\xce\x62\xf3\x6f\xef\xa6\x96\xe4\x57\xda\xe3\xb8\xfb\xfa\x3b\x7c\x57\x25\x6c\xdc\x49\xd1\xb7\xb7\x5c\xeb\x1a\x80\x5e\x5d\x20\xd5\x8f\xbb\xcc\x53\x48\x9f\xe3\x6a\x9f\x22\x94\x7a\x1f\x68\xa9\x2f\x87\x68\x1d\x48\x07\x37\xf3\xd3\xc8\xc2\x07\xed\x83\x7a\xff\x57\x42\xd6\xa1\x12\xd5\xba\x5f\x1e\xcc\x9f\x21\x61\x23\x7a\x13\xa0\x0a\x8d\x67\x36\x0a\x04\x1f\x6d\x8b\x3d\x33\xd4\xce\x3f\x05\xa0\xe6\xa1\xae\x58\xcb\xf0\x6d\xd2\x0c\x2c\x66\xee\x9d\x15\x21\x46\xe1\x9f\xd2\x14\xdb\x4a\x05\x55\x2e\x08\x03\xf4\x2f\xda\xcc\x01\xd6\x9a\xdc\x94\x45\x9e\x08\xb9\x4c\xa0\xab\x13\x6a\x10\x51\x81\x1c\xab\xae\x02\x45\x21\xfa\xb4\xb9\x4a\x1c\x9d\x05\x36\xa1\xaf\x37\x10\x0d\x99\xc4\x88\xce\x1a\x70\xda\xc7\x2f\xda\xda\xff\x6a\x94\xff\xd8\x97\xe1\x2e\xe0\x56\xfb\x2c\xb8\xd9\x95\x65\xdb\x8d\x1f\xff\xd3\x39\x50\xad\xe5\xff\x95\x0d\x3b\x3c\x4b\x23\x62\xdd\x2a\x56\xdc\x61\x85\xe3\x9a\xc5\x4b\x5e\x19\x09\x22\x80\xfd\xca\xec\xcf\x46\xb4\xb0\x1f\xb0\x52\x65\xd9\xed\x24\xff\xfc\x92\x6b\x59\x32\x0a\xf1\x39\xdf\xde\x65\x45\x71\x27\xf2\xc8\x6f\x7e\x81\x7e\xd6\x48\xf7\x2c\x4d\x58\x39\x11\x58\x2a\x04\x8d\x2d\x1d\x3c\x9d\xb1\x99\xd2\xdd\x1e\x78\x87\xb2\xa8\x9a\xfe\x76\x78\x74\x68\x08\x9e\x96\x2c\xb1\x45\xad\xe8\x9d\x04\x40\x7a\xf5\x82\xcb\x01\xe6\x55\x26\x33\xb9\x98\xe4\x11\x0d\x59\xc4\x9d\x1e\x9d\xad\xc9\xec\x2f\xa6\x76\x1b\xb5\x51\xa7\x42\x2f\xf3\x0f\xe0\x39\xd8\xf7\xe1\x4c\x19\xb6\xc2\x06\xdd\x1a\x53\xa9\xcd\x73\xfb\xfd\x7b\xd4\x2d\x88\x87\x7d\xcc\xa7\x77\x77\xa4\x37\x85\xf3\x61\x8c\xc2\x60\xdc\xf8\x91\x1b\x87\x3d\x88\xf2\x15\x1c\x49\x6a\x3f\x3f\x03\x9c\x4e\x56\x4b\x02\xaa\x31\xaf\x1e\x67\x66\xf1\xd4\xe7\x6e\x1a\x24\x4f\x20\x13\x4b\x94\x75\x9d\xbb\x21\x7d\x67\x1c\xb1\xa7\x0b\xcd\xfb\x2a\xa7\x2a\x54\x55\xc9\xfa\xce\x9c\x67\x91\xcd\xd8\x87\xfa\xe6\x18\xf4\x92\x3d\x9a\xe9\x22\xc7\x2c\xdd\x3f\x1e\x89\xdd\x9f\x39\xaf\x72\x45\x47\x90\xdd\xce\xd9\xbd\x9c\x27\xd9\x43\x6f\x47\x9c\xdb\xa1\xef\x01\xbe\xdf\x16\xfb\x81\x9c\xa9\x5f\xaa\xce\xec\xca\x28\x32\x86\x72\x3c\x78\xf7\xd3\xe0\x8a\xea\x6d\x1c\x9a\x6a\x77\x75\xa0\x35\x61\x1d\x20\x72\x3c\xa0\x9a\xcc\x4c\xb9\x3c\xd0\x27\xcc\xa4\x43\xb1\x9a\xef\x81\x53\x5d\x94\x8c\x17\xba\x35\x77\x64\xae\x6d\x83\x88\xef\x14\xa8\xf0\x1f\x6d\x76\x3c\x6e\xc7\x65\xe1\x2e\x8e\x24\x14\xca\xda\xa9\x46\xa7\x34\x1d\xfc\xdf\xac\xb0\x31\xf8\xec\x82\x46\x94\x14\x49\x10\xf4\xfd\xc7\xef\xd3\xb0\xec\xd1\xa8\xad\x2c\x04\xdc\x73\x84\x78\xb6\x4b\x71\x06\x16\x1d\xc7\xb7\xb5\x1e\x3a\x7e\x56\xe4\xd4\x50\x20\x2d\xef\x06\xea\xda\x4a\x23\x93\xfb\x14\xb7\x13\xdb\x97\x95\x88\x12\xe6\x20\x64\xb3\x2e\xcf\xfc\xb1\x50\x43\x69\x2f\xe9\x66\x19\xe8\xfd\x4b\xbe\x81\x1a\x5b\xf0\x0a\x69\xac\x53\x77\x96\x9e\xec\xd4\xec\x38\x27\x28\x79\x0e\x67\xa1\xa1\x50\xfc\xf7\xe8\x9b\x12\x99\x74\x1e\x9e\x03\xdc\xc0\xf1\x47\x42\xed\xf1\x3a\xc4\xe3\x01\x42\xbd\x58\x57\xfd\x45\xb0\x2e\x69\xf5\xec\xe3\xb5\xb7\xc9\xbc\x55\xa6\x2a\xca\x0c\xcf\x5a\x17\x40\x46\xb2\x9a\xc8\xc8\xf1\x9d\x48\xdb\x75\x73\x71\xa0\x23\xa5\x47\x72\x7c\xab\xbe\x90\xf5\xa3\xcd\x5e\xe4\x22\x05\xf6\x24\xec\x82\x10\xe4\x78\xc0\xc2\xe9\x48\x21\x98\xd2\xcf\x2d\x53\x4f\x6c\x8d\x8a\x2c\xea\xb8\x04\x4a\xa1\x9b\xa7\x21\x74\xab\xe6\x39\x1c\x0a\x94\x25\xe7\x3d\x36\xaa\x50\xcd\xc2\x99\x41\xe4\x9c\x77\xd2\x62\xa0\xfa\xe5\x4d\xfa\x5e\x64\x81\xb4\x8e\x5a\x89\x47\xdd\x95\xce\x78\x99\xf7\xf0\xaf\xd6\x47\xe4\x49\xe6\x9a\x61\x38\xa1\x9a\xc7\x8a\x82\x65\x4d\x47\x62\x1a\x89\xde\x65\x4a\xef\xad\xc5\x6f\xa9\xcc\xcf\x16\x30\xaf\xdb\x75\xd0\x80\x29\x65\xa6\x33\xa5\xfd\x6e\xa1\x98\x5b\xd5\x2e\x7f\x3b\x7e\x90\x35\xdc\xa6\x03\xf3\x12\x32\x8c\x51\x7b\x29\x91\x4b\x94\x7a\xc3\x0a\x6e\xa9\xcb\x4c\x8a\x17\x42\x24\xc1\xab\xa3\xa4\x04\x69\x2c\x3c\x17\x7b\x65\xb5\xf5\x8a\x6a\xa1\xd5\x13\xf8\xa5\xc8\x6a\x09\xcb\x48\x80\x4d\x6e\xc7\x78\x4d\xf6\x12\x96\xc1\x50\x9f\x30\x4c\xec\xd8\x8b\x27\xd9\x9a\x19\xa8\xe2\x3e\x2c\x72\x7c\x25\xc0\x47\xc7\xae\xfa\x04\x10\xac\x32\x53\x94\xa5\xec\xc2\x18\x46\x2d\x24\x87\xda\xd5\x0a\x6e\x8e\x60\x5a\x30\xbb\x50\x1d\xca\x23\x50\xf3\xfa\x17\x34\x8c\x54\xbf\x03\x2f\x62\x7c\x92\x29\x19\xc3\xc7\x9f\xfc\x5e\xee\x0e\xd2\xb6\x42\x36\xe7\x9c\x51\x6d\x28\x54\xdd\xc9\x82\xdc\x5d\xef\xc4\xe7\xd0\x10\xc1\xc0\x73\x71\x91\x15\xa1\x52\xc7\x7c\x9f\x74\x21\x67\xc2\xa4\xe9\x70\xe8\xae\xf9\xd5\xce\xc8\xeb\xcb\xd9\xc1\xb4\x84\xc5\x21\x7e\xf0\x47\xad\x89\x7f\xa3\xd3\xc6\xe0\xc2\x12\x51\xa1\xb9\xc7\xed\x25\x88\x26\x2a\xe8\xac\xcf\xce\xbf\xe9\x7a\x28\xdb\x9c\x17\xe4\x7e\xf6\xeb\x01\xf2\xc0\xe3\xb6\x34\x49\x98\xf4\x89\xed\x95\xb9\x83\x3f\xd8\x2f\x3c\x18\xfb\x0d\x88\x48\xde\xe3\x7c\x08\xc4\x63\x46\xb7\xd4\x0f\x50\x06\x57\xf4\x7e\xb5\x0e\x9d\xe0\xee\x86\x51\xe7\x77\x2e\xfb\x81\xb3\x7b\x8d\x65\xec\xa2\x74\x77\x0e\x58\x67\x2a\x4f\x1c\xbc\xed\x14\x9b\x76\x00\x7a\xa0\xa6\xcb\xc1\x3a\x88\x8f\x42\xe4\x7f\xd0\x59\xbc\xdd\x0e\x83\x6e\xd4\x3e\xa7\x5e\x9b\x1a\x83\xc6\xa1\x5d\x17\xfb\xd6\xf7\xe1\xb1\xab\x9c\xa4\x31\x37\x66\x2e\xac\x4d\x37\x42\xf2\x09\xb7\xd7\xb1\x61\xd0\xac\x52\x51\x28\x58\x89\x19\x84\xdb\x75\x8d\xbc\x11\xb2\x25\x8f\x5d\x95\xc5\x3d\xeb\x5e\x26\x0d\xad\x78\xd1\x5a\xc3\x3a\x41\xf2\x76\x36\x9a\xb0\x8a\xc0\xe2\x4b\x73\x27\x4d\xd1\xd7\xdd\x46\xe9\xd9\xdd\x7f\x71\xef\x53\xee\x84\x2f\x04\x06\x1f\x11\x8c\xfe\x9b\xb5\xb5\x7b\x2a\x22\x7c\xab\x50\x9d\xd5\xd3\xfb\xe3\xc4\x88\x27\x27\x91\xe4\x26\x0a\x9d\x0d\x24\xcc\x6c\x55\xa0\x6c\x9a\x09\x80\x49\xc0\xf7\x8f\xac\x13\xd6\xd6\x60\x8a\x4d\xca\x0a\x19\x92\xcf\xa4\xb7\x69\x74\x7d\xbb\xbd\xd4\x15\x2a\x97\xbd\xc9\xbf\x2a\xac\x06\x8a\xd3\x9e\x7f\x32\x46\x5b\x55\xa6\xdc\xfa\x3d\xfe\xeb\x67\xe6\xb0\x9e\x74\x2d\x5d\x5f\xe3\x6a\xfb\x78\x4f\xfe\x55\x08\xe3\x0f\xfb\xca\x78\x30\x67\x13\x4a\x51\xc4\x15\x13\xf5\xb7\xbd\xdd\x67\x61\xc1\x4a\xeb\xcd\x04\xca\xc2\x34\xa7\x14\x76\x8c\x1f\xfe\x26\xda\x1c\x94\xe6\x3e\x00\x5d\x47\xfb\xf1\xf3\xc5\x5f\xf9\x9b\xef\xf5\x3d\x25\x2d\x4a\xc1\x1b\x44\xc3\xa1\x3f\x85\xf7\x23\x52\xe3\xef\x7b\x15\xae\xb6\x05\x6b\xff\x8d\xc2\x93\x9e\x12\x44\x01\xc6\x1b\x24\x36\x1c\x45\xb4\x76\xe9\x57\x70\xfd\xae\xfd\x50\xb5\x5b\x60\x0d\xbb\xe7\xe6\xef\x1a\x7f\x46\xf7\x70\xc8\x34\x7c\xd0\xd1\x3f\x24\xa5\x02\x74\x82\xb3\x9f\x6e\xf9\xaf\xcd\x0c\x59\x71\xae\xc2\xce\xaf\x3d\x18\xac\xb7\x88\x7f\x3a\x51\x67\xf5\xfc\x08\x4b\xae\xa9\x5b\x4a\xbe\x82\xef\xde\xf0\x03\x35\x82\x2d\xca\x3a\x22\xd2\xee\x0b\x96\xdd\x58\xd7\x98\x53\x1b\xba\x1d\xec\x4c\x7e\x82\x8c\x4a\x47\x8a\xf0\xb7\x65\xe0\x93\xf3\xfe\x17\x6f\x25\x89\x5e\x5e\x1f\x19\x43\x4d\x97\xad\xa8\xf7\xcb\xc6\xad\x88\xd3\x12\xba\x1f\xf4\xac\x60\xc5\xfc\x2a\xc4\xb1\x46\xc0\xb2\xa1\xcd\x40\xf6\xba\xa8\x12\x94\xad\x40\xc6\xd7\x3c\x76\xd9\x3b\x81\xe6\xda\xcf\x83\x53\x55\xdf\x9a\x0e\x22\x4c\x5d\x2b\xe1\x09\xfc\xe3\xd1\x3f\xe9\xb0\x88\x22\x43\x09\x01\x51\x5c\xf2\x8b\x46\xca\x35\xb3\xf2\x1e\xe4\xbc\x63\x5b\x54\xb4\xcc\xa1\x64\x62\x4d\xc2\x8b\x9a\xaf\xf7\x7d\x7a\xdb\x1e\xc7\x1c\x28\x0f\x40\x1f\x12\xab\x39\x11\x46\x1e\x9c\xb7\x42\x75\x78\x12\x9c\xe2\x02\xd8\xac\x25\xd6\x96\x6f\x6d\x2e\x22\x07\x1c\x53\x91\x82\x37\x42\xfc\x01\xa8\xf0\x70\xfe\xc8\xeb\x9d\x85\x0e\x11\xa3\xf0\xfb\x09\xa8\x4c\x93\x36\xee\xa3\x32\x55\xe7\x53\x72\xe3\xf8\x32\xb6\x7a\x8e\x3d\xb0\x02\x93\x97\x51\x36\xd9\x4c\x31\x9b\x35\x45\x94\xfb\x26\x95\x92\x2f\x13\x3e\x7b\x50\x29\x71\x4d\x94\x26\xb7\x5e\x0f\xc3\x0f\xff\x9b\xfa\xbf\xbc\xc6\x53\xae\x90\x2f\xc4\xdf\x1b\x06\x4c\xdf\x11\xfe\x75\x8b\x65\xfc\x2c\xe7\x52\x2d\xb6\x0c\x6d\x94\xe1\x2d\xb0\x7b\x27\xdc\xc6\x62\xa5\x16\x4f\x58\xb8\x34\x62\x35\x3b\x06\x0a\x77\x8f\x2a\x75\xbe\x5c\xfb\x43\x40\x8a\xce\xa9\x31\xa1\xab\x10\x96\x3e\x51\x79\x8c\x9d\xd1\xdf\xa4\xb8\xd8\xc6\x94\x72\x49\xe1\x08\x3e\x66\x3b\x95\x26\x8e\xd5\xc3\x9b\x86\x16\x41\x5e\x6e\xfe\xe9\x68\xfc\x83\x6e\x4b\x4f\x17\x4d\x8a\x9c\x33\x7a\x53\x48\x4e\x26\xd3\xed\x09\x40\x75\x56\x0e\x3f\x57\xa6\x98\xd4\x2a\x6c\xe3\x63\x54\xb4\x0f\xa1\xd2\x39\x1f\xe9\xd8\xf1\x6b\x3f\x54\x1c\x0a\x56\x21\xf9\x23\xea\xfd\x8b\xbd\x9f\x72\xdd\x7c\x21\x88\xde\x50\x92\x80\x69\xfd\xdf\x64\x98\xb7\xd3\xff\x96\xd5\xfc\xb2\xd3\xfb\x12\xba\xa7\x99\x07\x93\x7e\x13\x5d\xf2\xc7\xa8\xb2\x83\x15\xe6\x2d\x51\x39\xa8\xfd\x3f\xd8\x4c\x8a\x6f\xe9\xc6\x1d\xcf\xb1\xc8\xcd\x82\xb4\x69\xc9\x7f\xcf\x63\xf2\xfc\xfc\x93\x7a\x39\x33\xd2\x8b\x1e\x22\x07\x0a\x50\x38\xcb\x16\x96\xcf\x1e\x75\x3b\x88\x1d\x6b\xd6\xb5\xc0\x7f\x77\x03\xe6\x80\xbe\xd5\x91\x67\x58\x00\x01\x76\x53\x20\x92\x66\xe6\x2e\x00\x38\x70\xe7\x22\x49\xdb\xee\x1b\xef\x93\x10\xdd\x05\x52\x4a\xe6\xcf\xe5\x50\xee\x94\x90\x73\x15\xde\x7c\xff\x12\x53\x43\x26\x97\x3c\x10\xf9\x78\x8a\x1d\xe1\x88\x84\xbd\x72\x8f\x98\x4e\x86\xe3\x58\x8e\x72\x5e\x1c\x53\xed\x42\xce\xe9\x5a\xc6\x6a\xc5\xd6\x99\x0c\xcc\x9f\x09\x8f\xf9\xb7\x7f\x9f\x72\x4a\x7d\x21\x42\x64\xd4\xe0\x29\x96\xc1\x76\x65\xde\xb8\x65\x2b\xe4\xe5\x6e\x65\x97\x8e\x47\x43\x4f\xe8\xf4\xea\x42\xf0\x76\x46\x92\xb1\x09\x2f\x51\x54\xa8\x43\x0f\xb0\x0c\xcf\x9f\xed\x61\xd7\xcf\xea\x4b\x12\xc7\x59\x9b\x87\x1e\x0b\x9e\x30\xcf\xba\xaf\x0f\xd4\xda\xe2\x9f\x28\x35\x77\xbc\xc3\x66\xf0\xc7\x39\x0a\x7b\x09\xe8\xba\xc7\x06\x7d\x2f\xda\xbd\x2c\x55\xdd\x66\x65\x5f\xfe\xba\x57\xe2\xdc\x3b\x26\x67\x5c\x98\x66\xe7\x9a\x95\x27\x03\xa0\xf5\x65\x73\x1d\xce\xbf\x70\x20\xaf\x8e\x73\x6c\x48\xb9\x44\x72\xa2\x5e\x19\x1d\x15\x4f\xad\x47\xa2\x46\xb6\xeb\x09\x49\x5a\x81\x5c\xf5\xd4\xc5\x77\x18\x1d\x7e\xbf\x6d\xed\x14\x72\x7c\xf6\xe5\x4a\x8d\x59\x33\x2a\x0e\xfb\xfb\x86\x49\x15\xed\x1d\xac\x86\xdc\xe2\x9e\xfd\xdb\xbf\x4f\xf9\xdb\xbe\xa2\xb0\x50\xe6\xc0\x4a\x30\xe6\xf8\x29\x7a\xe6\xc8\x57\x45\x5b\x68\x51\xdf\x99\x2b\x7b\x1a\xa8\x91\x78\x35\xb8\xee\x22\xb5\x53\xf0\x3b\x84\x7a\xc4\x16\xcc\x51\xd7\xd4\xb8\xe2\x51\x28\x6c\xd3\xeb\x26\x87\x7a\x84\x0a\xe4\x8a\xdf\x1a\x87\x18\x5c\x46\xef\x7d\x77\x20\xe2\x82\xa4\x3b\x56\x83\xff\x50\xe3\x65\xe2\x3b\xfa\x24\x1c\xbd\x5f\x80\x38\x2e\x39\x47\x6e\x9b\x73\xea\x9f\x5d\xb1\x93\x5a\xff\x11\x2b\xb6\x67\xf3\x0f\x6b\x3b\x0f\x98\xed\x1c\xc4\xb2\x34\x88\x2f\xde\xfb\x09\xe7\x23\xf2\xc6\xac\x35\x8a\x21\x9a\x60\xe5\xd2\x06\x3e\xcc\xac\x3c\x9c\xb2\xc4\x76\x4b\xfa\x9f\xce\xd7\x93\xfe\x21\x24\x18\x0a\x6a\x09\x98\x5f\xbf\x50\x9a\x46\x42\xdd\xad\xd3\xe3\xb1\xeb\x72\xfc\xad\x6d\xd6\x62\x56\xcb\x1a\x06\xa4\x92\x71\x6f\xb6\xbc\x33\x0f\xc7\xfd\x16\xa0\x13\xf7\xa2\x88\xd3\x2b\xa5\xa6\x1f\x73\x9d\x08\xea\x7f\xd6\x2a\xe6\xf1\x5e\x7f\x18\x65\x21\x35\x8e\x5c\xb2\xba\xa9\xac\xf7\x6f\xa4\x01\x56\x2e\x1c\x33\x66\x03\xa7\xfa\xfb\x6c\x47\xff\xd6\x60\x05\x24\x81\x6e\x99\x2f\xe5\x8e\x95\x7f\xc6\x95\x0f\xd9\x3c\x35\x5a\xf6\xa7\x8e\x1f\x57\xee\x10\x73\x02\xcb\x3d\x8e\x15\xb6\x53\x9b\xce\xd2\xd2\x40\x55\x63\xa0\xc0\x82\xa8\xe8\x88\x50\x8c\x72\x4d\x64\xd5\xcf\x5d\x11\x90\x31\x42\xfd\x3c\xac\x7e\x70\x7c\x02\x8b\xa8\xf5\x37\xa2\x32\x12\xf9\xc8\x55\xb9\x29\xd4\xa6\x24\xe5\x69\xe7\x01\xcd\xb9\x4e\xb8\x94\x1d\x48\x03\xd9\x93\xbd\xc8\x5a\x16\x40\x4e\x2e\xa0\x15\xe4\xd0\x39\x7b\x7f\xf0\x20\xd1\xc3\x7e\xa4\xae\x7e\xa2\x50\x57\x8e\x79\x7a\x05\xf5\x6f\x25\x3c\xe5\x7d\xf8\x42\x60\xa0\xff\xf3\x33\x8e\xf0\x93\x63\xdc\xe6\x85\x84\x23\x9b\x0f\xf5\x0e\x92\x03\x5e\xfd\x6d\x78\x75\x96\x81\xd0\x67\xf9\x5f\x74\x05\x54\x2e\x14\x6b\xc0\x3a\xa7\xa3\xa1\xb3\xa5\x5a\xa3\x3d\x4d\xab\x0d\xa7\x63\xc5\x31\x36\x29\xdb\x08\x7f\x1a\x11\xfa\xd3\x7e\x4a\x94\xf0\x80\xe9\x48\xa2\x49\x90\x93\x1b\x76\xcd\x9c\x45\x9d\x1b\xab\x8c\xb0\x61\xd0\xb1\x97\x8a\xee\x82\x9d\xae\x3a\x76\xf3\xc9\xd7\xcc\x44\x74\x39\x96\xcb\x07\xf8\x8d\xda\x5f\xcf\x2d\x22\x9e\xdf\xac\x58\x27\x2e\xc2\x46\x71\x38\x70\x91\x7e\x66\x5b\xe2\x22\xca\x0d\x01\x72\xd3\x3d\xab\x21\x1f\x51\x16\xfe\xfd\x62\xf3\x49\x67\x49\x14\x16\x4f\x18\xf8\x29\x0b\x05\x97\x5a\xa3\x99\xfb\x88\xf8\x79\x90\xc6\x94\x52\xa4\xa4\x67\xf1\x9c\xb4\xba\xf2\x6b\xa7\x17\xd3\x42\x5a\xbf\x87\x5c\x90\xa0\x1e\xbb\x50\xf4\xb5\x5b\x3b\x6b\x3d\xd6\xce\xb3\x6f\x9b\xa5\xb0\x16\x41\xc3\x75\x69\x05\xaa\x8c\x40\xa5\xa2\xf1\x43\x2f\x79\x03\x99\x1b\x58\xf5\x87\x2b\x31\x5b\xc5\x6e\x5f\xb9\x2c\x8d\xef\x71\xbf\x61\x67\xd9\x51\x32\x3b\x33\x3d\xd9\xe7\x43\xaf\x71\xbb\xaf\xbc\x3d\x5f\x04\xd2\x56\x0b\x8c\x9a\x3e\x25\xcc\xb7\xb8\xc7\x36\xc4\x27\x9c\xd7\x70\x23\x2f\x33\x63\x91\x29\xb1\x53\xaa\x35\xdf\x8c\x94\x90\x84\xe7\xce\x01\xd0\x08\x0b\xa9\x30\x45\x95\x17\x5c\x6d\xfb\xdf\x32\x7c\x5c\x90\x50\x4e\x7a\x34\x36\xd6\xe5\x8f\x12\x5c\xf4\x4d\x58\x3c\xb4\xbf\x83\xf9\x5e\xee\xe5\xc5\xb5\x56\x73\x36\x4d\x47\x84\x34\x08\x3b\x0e\xdc\x73\xc3\x5f\x41\xdb\xc7\xd0\x71\x99\x26\xc3\x63\x59\xc5\xb5\x8b\x1a\xe7\x45\xff\x93\x60\xc2\x89\x3e\x47\x21\x81\xe5\x3c\x71\xdc\xb3\x49\x7c\x5f\x48\x7b\x57\x90\x7e\x53\xef\x1b\xc0\x4b\x7f\xfc\x7e\x60\xd7\xfd\x67\x54\xda\xff\x63\x45\x5d\x24\x92\x3c\x0e\x18\x2c\xd1\xa0\x2e\xfc\xe4\xe2\xfa\x55\x20\xba\xd2\x84\xcd\xb7\x0a\x97\x75\x56\x09\x44\x22\x83\x28\x6b\x3d\x67\xe7\xa2\xf6\x3f\x30\x40\x80\x99\x58\x87\xdf\x39\x13\x2f\x4b\xff\x26\xb8\xd4\x53\xb8\x23\x45\x26\xe7\x27\x49\x4a\xc0\x0e\x14\x47\x1a\x4d\xea\x62\xc5\x2a\xe8\x8e\xff\x7e\xc3\x23\x31\xea\x3f\x72\x80\x7a\xb0\xfd\xdb\xed\x82\xd5\xa5\x15\x2f\x30\xb1\xb7\xe5\x7a\x52\xd0\x3d\xdd\x87\x47\xe7\x1d\x98\x99\x0d\xfa\xae\xd3\xbf\xde\xff\x90\x60\x13\xea\xfd\x43\x1c\xa5\x8a\xf2\xec\xe3\x94\x99\x02\xfd\xe5\xba\xa3\x7b\x88\x44\x94\x56\x01\xce\xe3\xf7\x0f\x22\xaa\x34\x4a\x98\x65\x1b\xd3\x87\xc9\x2f\x13\xc8\x5a\xfe\x72\xdf\x73\xb5\x69\x61\xd2\x13\x5b\xf1\x12\xe3\xd1\x6b\xa4\x73\x80\xee\xb8\x84\x87\x09\xca\x69\x30\x6b\xd6\x77\x4e\x77\xa4\xfd\x6a\x8d\x70\x38\x83\xd1\x11\xfa\xaf\x03\x3c\x31\xa5\x7b\x19\x43\x0a\x33\x93\xa0\xe0\xae\x4e\x94\xe6\xfd\xc8\x08\x81\x04\xe2\x55\x80\x0d\xf5\x5e\x09\x87\xfa\x7a\x39\x3e\x6b\xdc\xf5\xc7\x49\x41\xf2\x48\x96\x8a\xbd\x47\xab\xd4\xf5\xd4\xa6\x13\x0a\xa5\xf5\xf0\x30\xe5\xea\xf1\x17\x60\xed\x83\x6c\xb6\xc3\xeb\x3f\xf9\x5a\xab\x8c\xd0\x62\xfa\x28\x17\x81\xf5\x26\xae\xe2\xec\xa5\x2d\x5e\x70\xef\xb8\xf7\x6a\x90\x2c\x38\x96\x48\x03\x4b\xd6\xdd\x35\x39\x0c\x73\xdc\x33\x79\x5e\xbe\xdf\x81\x92\x03\xc8\x36\xfb\x2e\x06\x1c\x0a\x2e\x9f\x03\xab\x6e\x3e\xea\x19\x15\x09\x44\xab\x7a\xa6\x7d\xb7\x22\x70\x5b\xbd\x33\x99\x2b\xf5\x63\xfd\x08\xc4\x58\x50\x35\xef\x9e\x4f\xc4\x2e\xa9\x75\x8c\xdd\x2c\xe3\xa3\xd8\xb4\xe3\xcd\x2c\x0f\xc5\xfb\x3b\xdb\xaf\x4b\x28\x05\xb5\x6e\x74\xaf\x3e\x36\x0a\xd5\xee\x62\xfc\x42\x45\xed\xfb\x15\x97\xf8\xbe\x2d\xac\xfb\xc8\xd6\x1b\xae\xd9\x02\xe2\x75\x9f\x01\x9d\xf4\x02\xbf\xaf\xea\x80\x32\x3b\xfe\xdd\x7a\x39\x32\xb5\xb5\x6a\x1c\x07\x07\x1d\xf7\x87\x7a\x99\x28\xb4\xdc\xb6\x87\x67\x56\x61\x95\xde\x11\x96\xf9\x83\x25\xe0\xfb\x44\x09\x39\x7a\x58\xc8\xa7\x09\x8b\x23\x47\x6b\x3a\x4d\x4a\x34\xdf\x26\xdc\x46\xd8\x45\xf6\x82\xbb\xb3\x69\x78\x46\xb5\xb8\x2a\x90\x91\x4d\xbe\x48\xf3\x47\x0b\x6f\x20\xe2\xa7\x8a\x3e\x0a\x02\xd5\x8d\xba\xf8\x3b\xa5\xf5\xa4\x18\xda\xc1\xf9\x0f\xd1\x19\x8d\xd8\xe4\x00\x23\x5b\x81\xd8\xad\x2c\x7d\x4f\xdd\x11\xcf\x11\x65\x9e\xb7\x02\x0f\x3b\xb3\x58\x78\xb4\x8b\xed\x21\x41\xda\xd8\xeb\x55\xac\xb3\x16\x58\xec\x07\x29\xc0\x89\xd7\x2d\x41\xad\x08\x35\x4f\x6a\xa8\x33\xe9\x5c\xd0\xe3\x6b\x54\x81\xcd\x67\x1e\x7d\xf0\x60\xbd\xdf\x14\xc1\xeb\x05\x53\x41\x3f\x32\x44\x53\x23\x03\xd5\xd1\x31\xa4\xf7\x96\x65\x85\xc3\xa2\x19\xd0\xdf\x56\xc2\x5a\xda\xc2\x76\xa4\x26\x8c\xa3\x81\x2e\xb8\xd1\x6b\x7e\x84\x2c\xb7\x54\x79\x19\x05\x9b\x3b\x94\x8d\x03\xdc\x28\x54\xa5\x3b\xdf\xbf\xbc\x4a\xef\xcc\x07\x74\x70\x10\xdf\xac\x02\xc3\xef\xc8\xc2\xb3\x16\x83\x9d\x24\x1c\x44\xe9\xdc\x88\x44\x62\xa8\x20\x86\x6b\x41\x63\x61\x18\x2f\xe7\x1a\x3f\x2a\x7c\xdb\x26\x7c\x05\xd4\x3a\x62\xb3\xcc\x1e\xed\x58\xdc\x51\xd9\x74\x50\x33\x13\x9e\xfb\xfe\xa1\x37\x70\x67\xbd\x65\xb2\x1e\xaa\x8b\xa9\xb7\xe6\xc2\x00\x48\x49\xe7\x44\x71\x5b\x53\xf0\x52\xd4\x0c\xe8\x17\x2f\x0a\x61\x23\x6d\x91\x51\x98\xe1\xa8\x56\x49\xfd\x87\xbb\x1d\xff\x0c\x25\x2c\x66\x02\xe6\xab\x4a\x33\x9e\xa0\x32\x93\xbc\x3f\xf0\x6d\x4d\xee\x62\xc5\x86\xc4\x53\x08\xb2\x70\xde\xb3\xa5\xe2\xf4\x3c\x60\xa3\xeb\x91\xbf\x07\x88\x7e\x1c\xa8\x42\xb8\x6a\x7e\x14\xe3\x3f\x96\xe5\xbf\x92\x72\x8a\x9a\x59\xf6\x7f\x33\xa4\x32\x80\x5a\xe2\x8f\xc9\x53\x0c\xa3\xaf\x02\x6c\xc2\x7f\x83\x2f\x83\x3e\xcd\x23\x58\xa3\xee\xc5\xa9\x9a\x1f\x30\xe6\xe7\x19\x48\x90\x62\xf3\x11\x3d\x5b\xb5\x01\xe1\xe1\xbd\xb3\x03\x20\xf6\x9f\x76\xba\x3f\xdd\x79\xad\x61\xf9\x63\x75\x5a\x1b\x5b\x24\xaa\xc3\x2a\xb6\x8f\x34\x9c\x45\xcb\x03\x8f\x50\x3c\xb5\xe2\x04\x38\xdb\xb7\x76\xfb\x2c\x6b\x9b\xf1\xd4\x8e\xac\x73\xa8\xe1\x47\x84\x0a\xc4\xa7\xb6\x8e\xa7\x33\xfc\x59\x9c\x86\x72\x5a\xa5\xea\x92\x40\x85\x10\xd5\x20\xd1\x0c\x06\x85\x05\x53\x39\xfb\x89\xa1\x7c\x64\x17\x5c\xaf\x90\xec\xd0\xdf\xa5\x04\xbf\x38\x05\xd3\x46\x5e\xb5\xcd\xd3\x01\x50\xec\x6b\x91\xa1\x5e\x9f\x53\x45\x59\xde\xfe\x9c\xa4\x97\x09\xb2\xaf\x0f\xae\xf4\x75\xf2\xe9\x56\x03\xa0\x65\xba\xa1\x51\xf8\xfd\xc1\xdd\x7f\x5f\x1a\x78\xa8\x01\x2d\x3d\x6e\xa6\x63\x8c\x22\x95\xa3\x95\x62\x8a\x78\x90\xf9\x22\x25\xb9\x2d\xdb\x4c\xb1\xb7\x88\x00\xb2\x06\xbc\xc9\x08\xa3\x97\x48\x9f\x8b\xf6\xc5\x10\x15\x84\xba\x22\x2f\x9c\x23\x93\x9b\xd4\xf7\x5f\x38\x87\xf3\x3a\x9b\xa3\xcb\xee\x14\x39\x83\xad\xc6\xc6\x78\xbd\x9c\x6d\x0c\x36\xcb\x63\xd8\x83\x69\x0b\xb8\x72\xd1\xec\xec\x28\x99\x5e\xa5\x0d\xdf\xd5\x96\x5c\x4e\x12\xdc\x35\x7d\x9c\x2a\xee\x1c\xae\x18\x94\x8d\xbf\x06\x9f\x59\xe9\xc4\xa0\x6b\x84\x7c\xf8\xec\xef\x38\xf5\xd3\xec\x1c\x86\xf6\x98\x77\xf8\xde\x60\xda\x3e\x8e\xd5\xd4\x5d\xbe\x2d\x09\x9f\x3f\x61\x7b\xff\xf5\x52\x8d\x58\x17\xe7\x03\xbc\x22\x56\x0b\xe6\xaf\xc6\xc6\x8e\xbd\xa3\xab\x2f\xb9\x0f\xe0\xf7\xc5\x50\xc6\x2d\xde\x21\x37\xd5\xe9\x6b\xe4\x68\x53\x30\xea\x6e\x3f\xc0\x1e\xaf\xf0\x42\x70\x7a\x85\xfd\xa1\x2a\xa1\xfd\xaa\x51\x1e\x67\x15\xda\x64\x22\x81\xb8\x13\xce\xfc\x8b\x4a\x04\x94\x1b\x29\x4a\xe4\xef\x77\x54\xcf\x51\x2d\x10\x9f\x17\xad\xa7\x94\x77\x6e\x73\x03\x35\x64\x42\x6b\x9b\xc7\x03\x6c\x0a\x5a\xf6\x5c\x1d\x82\x4b\x82\x6f\xf9\xda\xca\x14\xfe\xd4\xa4\x55\xb1\x98\x8b\xb2\xe8\x11\x76\x6a\x01\x99\x30\xe5\x85\xe7\x6e\xe5\xe5\x26\xf8\xd5\x1c\xc5\x48\x3e\x14\x32\xd4\xf2\x9f\xa2\x87\x16\x10\x5c\xcb\x9a\xf4\xcf\xea\x78\x3f\x93\x43\x83\x3d\xfd\xa4\xb0\x60\x52\xc5\x1a\x38\xa6\x5f\x71\xd8\x84\x61\xe9\x59\x5f\xa9\xa2\x61\x29\x5b\x22\xb3\x43\xf6\x4e\x2e\x52\xd9\x54\xd0\xf9\xb1\xa7\x5c\x26\xf0\x75\xa2\xf1\xd4\xf7\xe2\xe9\xfb\xab\x71\xbf\x4f\xf1\xfc\xb0\x18\xa5\x68\x88\x6a\xc6\x66\x52\x1a\x98\x1d\xb2\x1e\xa6\x80\x55\xe5\xdb\xd6\x57\xd6\xb6\x6d\x65\x83\x8f\xf8\xa0\x2b\x81\xef\x42\x1f\x5b\xeb\x48\xec\x3a\x19\x39\x0e\xa7\x62\x31\xef\xcd\x5b\x04\xe4\xcc\x35\x13\xd3\x4d\x20\x3a\x8e\xbc\xad\xfc\x95\x99\x06\xd9\x17\x6e\x29\xf9\x79\x2e\xc8\x27\xc7\x3b\x51\xf7\x57\xcf\x1d\xe4\x53\x80\x3d\xa5\xbb\xce\x22\xf2\x66\x6b\xf7\xf9\xb0\x9b\x98\xa8\xc0\x00\x81\x75\xcc\xa7\xf7\xd8\x10\x22\xb8\x0f\x1d\x6b\x3d\x1a\x82\x8c\x3b\xe6\x80\x68\x9e\x62\xe0\x02\x56\x01\x44\x4e\x80\x66\x71\x2a\x43\x11\x45\x4f\x5d\x28\xa8\xb4\x44\x1e\xb9\xec\x4b\x9f\x29\xff\xb9\x83\xf8\x09\xd0\xa8\x8c\xe0\x1c\x52\x36\xfe\x41\x28\x11\xa3\xea\x27\x85\xc2\xa4\x8c\x9d\xe4\x8e\xca\xc3\x93\x90\x64\x4f\x9b\x09\x19\x3f\x77\x65\xa0\xa7\x46\xad\x91\x05\x26\x36\x46\x63\x2b\xc1\xdb\x1e\x14\x8b\x9a\x52\xcc\x5a\x9d\x8e\x2b\x4a\xca\xa3\x24\x8d\x72\x9c\xef\xc6\x5c\xea\x81\x46\x59\x7f\xd1\xf0\xe0\xba\x31\xa3\x58\x27\x2d\xaa\xb2\x19\x04\x0c\xd0\x97\x8f\x70\xea\x0c\x31\xe7\x61\xea\x30\xee\x32\xd4\x9b\x03\xa5\x9e\xa1\x81\xaf\xce\x12\x02\xf8\x7b\x32\x7e\xf4\x48\xe2\x0b\x22\xe4\xd2\x69\x7d\xf1\x91\x64\x2d\x7b\x7e\xa0\x14\x1c\x14\x3a\xea\xfe\x1f\xc9\xc4\xeb\xf9\x62\xb8\x2e\x07\x19\x94\x04\x58\xa5\x85\x03\x87\xe2\x51\xd5\x95\xc5\x1e\x99\xb4\x2b\xd6\xab\x2d\x85\xe4\xb5\x9a\x06\x72\x00\xba\x1b\xac\xf7\xa9\x1e\x2f\x2b\x60\xee\x20\xc1\x4d\x91\xb3\x17\x92\x2f\x5b\xf5\x8d\x51\x7d\xe6\x17\xe6\x0e\x0f\xbe\x6a\x2b\x9c\x1b\x28\x04\xa9\xf2\x39\x1c\xd3\xd3\xfd\x0b\x43\x7f\x45\xaa\xf2\xbb\x4a\xe1\x77\x15\xcc\xcb\x6f\xb3\x0d\xf0\xb3\x65\x14\xd1\x64\x0a\x07\x16\xfe\xd7\xcb\x7f\xea\x92\xf6\x85\x88\xc2\xfe\x47\xcd\xb7\x9a\x62\xae\xa2\x5b\x6f\xb2\x71\xf3\xaf\x12\x46\x44\x93\x51\x95\xc1\x62\x88\x84\xc4\xd7\xf4\x58\x5c\xbe\x4f\x15\xec\x57\x74\x19\xc0\x71\xa1\x4f\xfe\x51\xef\xce\x3b\xfb\x75\x66\x02\x44\x9c\xb8\xe7\xe6\xf5\xd0\xf4\x74\xc7\xb2\xc8\x79\xbf\x8c\xc2\x3c\x67\xc9\xc6\x18\x48\x8c\xb5\x7a\xa1\xff\x52\xd7\xf8\xf6\xf2\x65\x13\x55\xb4\x63\x4f\xc2\xbb\x44\x05\xcb\x8b\xfc\x22\x45\xa1\x0f\x5f\x4b\xa9\x2a\x5f\xc3\xb8\x3e\x0e\x6d\x95\xcd\xf1\xaf\xfe\xde\x8e\x3c\xb7\x13\x9b\x1c\x32\x85\x5e\x96\x94\x53\x3d\x0c\x74\x25\x5a\xd4\x3b\xeb\x1a\x1c\x53\x3c\x8f\x08\xe0\xfb\xc7\x85\x55\x7f\x8b\xda\x22\xee\x28\xaf\xb1\x44\x48\x6b\x16\x16\x99\x04\x85\xca\xb3\xf2\xff\x92\xe1\x9c\x0f\xbc\x18\xc0\x6a\x00\xd9\x0f\xd9\x90\x0d\x72\x89\xe2\xcf\x31\xd3\x55\x49\xd9\x9c\x72\xba\x68\x76\xf4\x77\xfe\x71\x33\x59\x91\xad\x3f\x8d\xfd\x20\x6c\x66\xe3\xff\xa2\xde\xa7\x3c\x15\x5f\x88\x3a\x14\x8c\x10\x30\x5e\xd3\x07\x1f\x3e\x50\x5c\x2e\x0d\x6f\x18\x75\x53\x9a\x64\xf6\x95\x18\x34\x6e\x56\x14\xab\x0b\x55\xa7\x11\x88\x90\xa6\x1b\x56\x81\x62\x60\x95\x66\x15\xce\xbf\xf7\xc9\xf9\xf6\xc8\x29\x10\x9f\xe1\xa2\x9e\x44\xe3\x9f\x4c\x6e\xc5\x3f\x3b\x51\xb4\x33\xbe\x1b\x6e\xca\xa8\x04\xa0\x53\xde\x59\xfc\x75\x16\x6e\xb4\x04\x62\xe7\x7f\x07\x7e\x18\x63\xe6\x6e\xf6\x5e\x6b\xf0\xb1\x93\x2c\x97\x19\x38\xb6\xfc\xae\x49\x00\xa0\x61\xc1\x5a\xc6\x62\x95\x4d\x3b\xcb\x42\x42\x3a\x24\xfd\xe6\xb8\x0e\x35\x1f\x56\x5f\x1f\x4c\xd4\xe7\xbc\x55\xa9\x1c\x9a\x66\x3d\x04\xa0\xb7\x19\xcd\x24\x31\x27\x97\xfe\x06\xce\x8a\x06\xf7\xa8\x5c\x7d\x2c\x62\x99\x93\xa3\xfa\xac\x6d\xd2\xe7\xb1\x7c\x33\xcc\xb3\x77\xff\x72\x3b\x4f\x1d\xee\xbe\x10\x58\x18\x6f\x50\x2c\xca\x70\x22\x37\x4d\xd9\x08\x43\xeb\xff\x63\xec\x2d\xc3\xba\x7c\x82\xb6\x61\x5a\xba\x53\xe9\xee\x2e\x01\x91\xf8\x91\x82\x74\x37\xd2\x2d\x2d\x5d\xd2\x2d\x0d\x02\xd2\x25\xdd\x8d\x48\x4a\x77\xa7\x08\x22\xdd\xcd\x7b\xbc\xcf\x73\x3f\xb2\xff\x4f\xde\xdf\xe7\xd8\x6b\x66\x77\xaf\xdd\x73\x66\x67\xce\x81\xbf\x8c\x79\x0e\xd3\xb1\x51\xa2\x1c\x8d\xec\xc5\x88\x66\xac\x21\x7e\x16\x04\x03\x35\xbc\x01\x66\x6b\x4c\xaf\xde\x7d\xfb\x03\xf5\x2b\x0a\xb1\xc0\x89\x63\xc4\x73\xbf\x60\xcb\xf9\xc5\xb8\x97\xc6\xb0\x9f\x59\x7b\x05\x9b\x18\x24\xaf\x0a\x2c\x54\x28\x64\x1e\x82\xef\xd1\xc7\xae\xed\xc6\xaa\xbb\x46\xe1\x29\x45\x3e\x91\xe6\xae\x7f\x29\xd8\xd8\x36\x67\xc4\x7b\xd6\xe1\x07\xce\xc2\x5a\x43\x2e\x39\x45\x6d\x23\x7b\xc3\x98\xe7\x83\x9e\x54\xaf\xab\xd5\x20\x3e\x6b\xf3\x28\xab\x59\xbe\x7b\x10\x7e\xe5\x19\x54\xf6\x5f\xd3\xfe\x79\xc3\x40\xb0\x31\xa1\x60\x00\xd3\xce\xb3\x4a\x1e\xc5\xd4\xf2\x7a\x3c\xbf\x5d\x5b\xfe\x2e\x13\x90\xbe\x9b\x7a\x15\x87\x6b\xa3\x5e\x73\xcc\xbc\xe1\x9d\x6a\x29\xb9\x0a\x28\xe1\x4c\x37\x17\x60\xd8\xb7\x79\x3f\x04\x6d\x41\xd7\x3f\xa6\x27\x52\xe5\xfc\x2e\x4e\xdb\x9d\xdf\x93\xe9\xc7\xae\x0e\x59\x4d\x1e\x98\x94\xa4\xf9\x7e\x2f\x60\x1b\x2d\xe5\xa7\xd7\x71\xb6\x04\x4f\x0c\x73\x43\xee\x34\x67\xc8\xb7\x0e\x47\x69\xde\x1f\x6b\x47\x91\x87\xfa\xc6\x80\xe8\x2b\x36\x7b\x3b\xf8\x1c\x02\x1e\x01\x9e\xcd\x49\x6a\x04\x84\xae\x2d\xd6\x5b\x8d\x8c\xa3\x8f\x6b\xf0\x31\x99\x33\x69\x5b\x72\xcf\xff\x9a\xf6\xaf\xcb\x2b\x00\x02\x0b\x03\x85\x09\x98\x26\xf7\x69\x3d\x5b\xc4\x9e\xda\xd1\xc3\xa0\x8d\x90\xd8\x9c\xcd\xf1\x25\xb1\x82\x84\xf0\x39\xc5\x8f\x52\x12\xc6\xc3\xb8\x4b\x5f\xd0\xe7\xda\xf1\x35\x7f\xbd\xb1\xac\x84\xdf\x1f\x2c\x59\x11\xaf\x9b\xf1\xa3\x8b\xae\x36\x2a\xe2\x59\x0a\x0f\xcd\x33\x7d\x82\x39\xe6\x06\x10\xc3\x2e\xcf\xba\xa6\x7b\xe6\xe2\x3b\x18\xb4\x78\x26\x68\xb8\xe6\xcf\x30\xd5\xff\xa9\xb7\x51\x34\xe5\xf8\x06\xbb\x91\xf2\xdb\x37\x0d\xac\x3a\x4b\xfe\x95\x77\x0c\xa7\x07\x77\x2a\xb3\xf7\x47\xe2\xcb\x97\xcc\x95\x05\xfc\x5c\x8f\x8b\xd7\xcf\xbe\x1e\x73\x50\x70\xfe\xf6\xa3\x0b\xff\x1b\x91\xfb\xd7\x6d\x17\x00\xc1\x44\xec\x04\x83\x8d\x61\x22\x66\xd2\x49\xe1\xf1\xb0\xbc\x8e\x09\x01\x19\x12\xd2\x3f\x64\x38\x88\x84\xd2\xb2\xda\x76\xcd\x3f\xeb\x3e\x94\xd8\xc3\x80\xb9\x8d\xc2\xbf\xe3\xab\xc7\x83\xf2\x31\xd4\x2f\xcf\x9c\xb0\x44\x54\xc3\x2c\xe8\x4a\xf0\x0b\xa0\xb4\x0d\x7b\xb3\x3e\x1d\xc9\x10\x76\x81\x35\xce\x74\x69\x86\xee\x4b\xca\x76\xc8\x72\xa8\x64\x91\xc5\xf4\x86\x85\xe9\x67\x3d\x12\x93\x1b\xf8\x71\x38\x95\xa5\x26\xc2\x65\x57\xe5\x4f\xc7\xd8\x9c\x32\x2d\x7d\xcc\x7c\x69\x6a\xf5\x1a\xb5\xc9\x27\x0c\xa4\x22\xfe\xd0\x3f\x21\xd6\x54\xb0\xde\x64\x94\x8c\x56\xa4\x67\x5c\x68\xc0\xf7\xd7\x25\x70\xfb\x21\x92\x88\x4e\xfc\x4c\x55\xe2\x7f\xe8\xf0\x1e\x92\x2c\x34\x22\xd2\xd9\x49\xd9\x49\xef\x16\xdb\xb0\x49\xbc\x98\xfe\xae\xef\xbf\x6e\x92\x00\x88\x08\x1c\x14\x02\x30\x09\xcf\x58\x11\x85\xfb\xa2\x52\x99\x6b\x7a\xc7\xaa\x66\x88\x30\x5e\x1d\xca\xc7\xbb\xfd\x9c\x7e\x4f\x52\xa7\xd5\x7f\x63\x9c\x88\x03\x46\x5c\xd7\xb5\x53\x69\x5a\x6b\x9d\x53\xf6\x3f\xa2\x17\xfc\x61\x4b\xa5\x94\xb0\x82\xa3\xa7\x13\x2c\xe3\xac\x84\x21\x76\x11\x18\x44\xfe\xf3\x9f\xaa\xc2\xc5\xe5\xad\x0d\xdc\x0e\x43\xcb\x48\xa5\x97\xa9\xaa\x6a\xb3\x07\x08\xa2\x7d\x62\x55\x6e\x91\x7b\xca\xbe\x6b\x3d\xc7\x60\x7e\xda\x99\xc7\x3e\xd7\x6d\xd8\xf3\xf3\xad\x45\xc2\x18\x17\x79\x6e\xd5\xd5\x2f\x69\xf8\x0e\xcb\xbc\x11\x9d\x62\xd5\x81\xc1\x12\xa7\x4f\xa9\x82\xff\xba\xf9\x02\x20\x30\x7e\x7e\x60\xaa\xe0\x87\x25\x65\x8f\x5b\x23\xb4\x67\xb8\x9e\x9a\x97\x56\x0b\x1e\xdc\xc4\x53\x48\x8c\xd0\x6e\x17\x69\xc4\x2c\x19\x91\x46\xa4\x3d\xe0\x4b\x74\x08\x8d\x82\x43\x69\x2d\xc1\x0c\x51\x6c\x72\x0c\x52\xa1\x25\x8e\xc6\xf2\xf7\xb1\x78\x7b\x4b\x49\x6a\xbe\x85\xc0\x0f\xcb\x2f\xda\x00\xd1\xc9\x5b\x62\xd8\x3d\x97\xef\x1e\x9c\xae\xdf\xe9\x49\x5b\x8e\x91\xa3\x93\x79\xb4\x54\xfb\x58\xcd\x5a\xfc\x0a\xef\xbb\x90\xa8\xc1\x26\xb2\x7f\xbc\xcd\x14\xe5\xaf\xc2\x96\xb1\x32\xb3\x5e\xaf\x49\x96\x9f\xcb\x6f\x6c\xa1\x77\x68\x04\xba\x98\x78\x06\xc5\xd8\x88\x31\x82\x1d\x2b\x61\xae\x08\x07\xc3\x20\x34\x54\x2e\xfb\xab\x9b\x46\xa1\xfe\x99\xba\x5e\xe1\xae\xbd\xb5\x61\xd5\x3f\x3d\x98\x59\xa3\x72\x13\xf5\xfe\x86\xe4\xfe\x75\xa9\x07\x88\x57\x66\x63\x02\x9c\x86\xe4\x3f\x96\xb9\xcf\x6a\x10\x6f\x0f\x2c\x06\xa2\x9f\x6b\xb9\xe9\x5e\x7e\x69\x6a\x3e\x8c\xc9\x9d\x5a\xd8\xa5\xf0\x29\x23\x35\x05\x03\x21\x85\xf3\x11\x70\xa1\x52\x51\xa4\x2c\x53\x56\x23\x92\xd6\xe9\x41\x26\x45\xcc\x47\xcb\x86\xc3\x9b\x98\xc7\x56\x97\x4d\xbf\xe8\xc1\x2e\x7d\xf3\x3f\xeb\xfc\x90\x78\xb5\x09\x8e\x53\x6a\xfe\x58\x6d\xf4\x3d\x17\x95\x7c\x76\x7e\x02\xd7\x6f\x31\xc8\xc8\x40\x12\xf0\xe3\x01\x9c\x2f\x77\x96\x26\x85\xaa\xaf\xdb\xfe\x12\x7b\x89\x19\x22\xe3\xf7\x5d\x65\xce\xac\x44\x39\xcc\x8e\xd2\x8d\xfa\x5f\x59\xb3\xb1\x4f\xc1\x86\x91\x08\xd1\xf5\x1f\x52\xa2\x5f\x4e\x6f\xe5\x7e\x2b\xb8\xf4\xe7\xdd\x91\x34\x98\xe7\x6e\x8e\x25\xa7\x30\x95\xfa\xfa\x7b\xf3\xd9\x6f\x02\x40\xd4\xb3\xec\x1c\xfd\x25\x93\x25\x75\x61\x64\xa6\x47\xe4\x57\x86\x6b\x56\xce\x03\x71\x36\x2d\x7d\xad\x1c\x18\xe5\x67\x39\xb0\x3a\x32\x17\x13\xff\x53\x9f\xa6\xa0\xb8\x87\x5f\xa8\x50\x69\xe3\x45\xd2\x32\x0b\xd5\x99\xcc\x1b\xe6\xe8\x79\x35\xb2\x0f\x8b\x70\x04\xf3\x86\x3b\x8c\x1f\x33\x38\x00\x72\xfb\xe8\xfb\x98\x42\x0a\x2c\xb0\xee\x81\x45\x6a\x9a\x46\xe5\x60\xad\x76\x1c\xa3\x9e\x2f\x25\x0e\x3d\xde\xa6\x62\xb7\x2d\xc6\xc2\xe4\x6c\x55\xea\x30\xa1\x36\x08\xdc\xac\x91\x8b\x95\xe3\xee\xd4\xbb\x49\x30\x38\xba\x76\x10\x63\x1f\xf7\x05\x38\x0d\x1b\xce\xbd\x45\xfa\x04\x96\x23\xe5\x1e\xbf\xe8\x01\xa2\xb3\x7e\xdd\x7e\x18\x17\x31\x07\x26\x2a\xd2\x66\xc1\xfc\xf7\x2a\x70\xe1\xb3\x68\x9a\x66\x3b\x61\xa8\xe5\x8a\x5b\xe9\xd5\xc9\xe2\x4f\x0a\x60\x4b\x9e\x50\x53\x78\xbe\x50\x3d\x7a\xb3\xf2\xa9\xab\x98\xf0\x23\x1a\xaa\x81\xfc\x19\x26\x72\xa7\xb4\x21\x0e\x7d\x7c\x63\xf9\x73\xe0\xb0\xb1\xbc\x13\x90\x2f\x7c\xc7\x34\x16\xe6\x95\x27\x9f\x21\xad\xb8\x5e\x1c\x58\x23\xb3\x30\xdf\x51\x8a\x14\x0d\xeb\x31\x40\x54\x74\x03\x1c\x36\x8c\xc1\xae\xe7\xb9\x47\xd6\x74\xcf\xe1\x72\x42\x70\x7c\x24\x65\xb6\x73\x73\x12\x92\xcd\xa1\x9a\xba\x24\xc8\x0c\x57\x39\x5b\x41\xab\xb6\x5f\x6b\x6b\xe2\x8a\x5b\x75\xcf\xa5\xd8\x0e\xf8\x12\x61\x6b\x71\x94\x97\xc8\xa8\xe4\xb8\xbb\xde\xd2\xe2\x9f\x3d\x4a\x7d\x69\x7e\xf2\x1b\x90\xf8\xd3\x10\x64\x0b\x6c\xc7\x23\x08\x78\xf3\x47\x50\x09\xbd\x82\xd7\x67\x8a\x0a\x05\xbe\xc5\x47\x3f\xe8\x63\x4b\x65\xa8\xfb\x3f\x7d\x1f\x8f\xaa\x89\x22\xc6\x83\x69\x77\x54\x39\xf9\x28\x6c\x73\x9f\x45\x68\xa2\xd3\xa9\x99\xbd\xab\xc6\x9a\xe1\x6e\x4a\x59\xd7\x61\xe0\x49\x92\xb7\xa3\xd0\xc8\x7d\xdb\x40\xd8\xd2\x23\x29\x89\x81\x34\xb3\xed\x84\x3f\x25\x0f\x59\xe9\x76\x3b\x77\x70\x91\x8e\x9d\xc1\x1b\xa4\x7f\x34\xfa\x72\xdd\x6b\xd8\x33\x7e\xe1\xa9\x58\x8e\x14\xda\x9c\xd0\xa5\xa5\xee\x00\x95\xa5\x7e\x9b\x5b\xd9\xd3\x7f\x8f\x59\xc4\x65\xf3\x34\xe8\x09\x1d\x8b\xc7\xe5\xac\x9e\x7b\x70\xb7\x78\xe9\x6d\xa5\xdd\x8b\x67\x21\x49\xc5\xbe\xb5\x10\x3c\x2c\xf7\xdb\xeb\xd6\x98\xb8\x32\xd0\xfc\xee\xfc\xb5\x15\xd7\xdf\x11\xae\x94\x1c\x81\x62\x46\x5f\x2f\xee\x4f\x68\xb4\x37\xf7\x2e\xf0\x34\x65\xb5\xd8\xd9\xf1\x18\x9c\x81\x6a\x0e\xb1\x8e\x1d\xbd\x72\xf8\xc7\xb2\x86\x3f\xf1\x76\x96\x9d\x50\x8f\x50\xd9\xb5\xaf\xc6\x6e\xfc\x56\x56\xd3\x5b\xd6\x82\x58\xb8\xb8\x01\x5a\xf0\x5c\xaa\x25\x3d\xee\x90\x76\x0c\x37\xde\x7d\xb9\x8a\x69\xf2\xda\x53\x09\xc9\x37\x7d\x03\x7c\x75\x7e\xca\x25\x74\xbd\x81\x40\xa6\x55\xc9\x2a\x0b\x7e\x6c\xec\xb1\x4f\x05\xd7\x48\x3a\xff\xb8\xbb\x5b\x48\xee\x65\xab\x20\x86\x6c\xcb\x01\xfa\xd5\xb4\x2a\xae\xc3\x73\x20\x6a\xa0\x90\xe7\x51\x6b\x7b\x70\xda\x14\x16\x7b\x5c\xd9\x01\xdd\xfe\x6b\xf4\xcf\x09\xbb\x10\xfe\xc7\x70\xd2\xbd\xc2\x74\xfd\x47\x47\xa0\x44\xa6\x4a\x04\x55\x6d\x02\xc1\x46\x0f\xaf\xcd\xd7\x3c\xeb\x85\x9a\x5a\x13\x7d\x3e\x09\x6e\xf5\x1f\xa2\x2d\x63\x87\x97\x4d\x75\x79\x74\x4f\x92\x75\xdf\xb9\x78\x0d\x74\x59\x51\xbc\xe5\x92\xba\x17\xef\xc7\x75\x20\xa2\x49\x9d\x79\x1c\x32\xc4\xe1\x82\xd3\x33\x46\x77\xba\x3f\xc0\x89\x22\x64\xc7\x59\x37\x81\x4d\x30\x33\xcc\x14\x28\x4b\xad\x97\xb6\xd3\x57\x54\x34\x89\x08\x1c\x0e\x8d\x6b\xc8\xa9\x35\xbe\xd1\x68\x04\x44\xc7\x5c\x70\xce\x45\x47\x9b\x83\x1f\x74\x63\x7d\x68\x5a\xf5\xd3\x5d\x14\x6c\xc8\x5e\xeb\x0c\x5a\xa2\xd4\x8b\x22\xa7\xb9\x21\x2b\x03\x15\x32\x0e\xc6\xfe\x72\x0a\x61\x61\xe4\xf3\x17\xbe\x3d\x82\x0a\xaa\xa4\x2f\xf9\xae\x85\x59\xd8\x53\x1a\x10\xc6\x8c\x9b\x51\xcd\x01\xa7\x5d\x42\xfe\x55\xc1\x2d\xee\x6c\x76\x0e\xa6\x65\x5b\xfe\x68\xfc\x58\xe4\xbc\xe6\x6a\xc4\x72\xdd\xb5\x89\xa6\xf2\x06\xea\x28\x2a\xc0\x67\x21\x93\xa1\x92\x60\xd5\xed\x63\x21\xb6\x74\x9c\x37\x1e\x9f\xc9\xc4\xd2\x18\x76\x27\xc9\xe7\x72\xe7\xc5\x51\x20\xb6\xa5\xb2\x35\x08\xcc\x29\x83\x74\x81\x24\x84\x62\x03\x79\x97\x95\x9e\xcd\xb2\x7b\x77\xf1\xf9\x61\x09\xe2\x9f\xdf\xa9\x51\x77\xb7\x35\x3c\xa8\x8a\x33\x1f\x9e\x06\xfd\x28\x30\x34\xa5\x3c\xd7\x30\x76\x72\xb8\x33\x82\xe9\xef\xd1\x86\xef\x68\xc1\x50\x8d\x7b\x9e\x1d\xeb\x47\xe7\xeb\x57\xff\x9c\xf9\x49\xb2\x0f\xf6\x6b\xfb\x69\x94\x61\xa3\x27\x0b\xc1\xc4\x0f\xb2\xd8\xbb\xe4\xe2\x3d\xb7\xc1\x34\xff\x2e\x16\x1f\x3b\xe5\xa6\x82\x86\x36\x70\x4e\x6b\xa8\xb0\x8e\x03\x29\xe0\xde\x9e\x1a\xf5\xd2\xc1\x0f\x9b\x3f\x97\x0d\x18\xd7\xd2\x8e\xe5\x9d\x1e\x9d\x51\x4d\x23\x33\xdc\x12\x03\x82\x7b\xb0\x33\x85\xd1\xe8\xac\x08\xcc\xae\x7e\x29\x9d\xf2\xe2\xdd\x84\x59\x34\xae\x91\xb4\xec\x68\x4d\x8f\xdc\xaf\xab\x50\x9c\xab\x9e\xbe\x4f\x7b\x61\x62\x63\x9e\x61\x72\xb1\x48\x5b\xa6\x3b\x7e\x82\x8f\xfd\x27\x20\x4e\x42\x3f\xa2\xb0\x81\xf2\x23\xe2\x8e\x74\xa7\x1f\x2c\xf8\x7d\xf7\xd3\x73\xdc\x05\xda\x2b\xae\x3c\x81\x79\x3d\x54\x51\x51\x46\xb6\x6b\x8b\x1c\x74\xcc\x03\xb5\x42\x15\x37\x94\x54\x94\x0f\xf7\x4f\x33\xf5\x3c\xc0\x81\xfc\x35\x5b\x9f\x6c\xd5\xba\x20\xf9\x17\xb8\x53\x55\xe3\x53\xcb\x9b\x9e\x20\x98\x9c\x97\xba\x76\xa4\x6c\x8b\x3f\x2f\x9f\xbe\x6f\xb0\x90\xb9\xd7\x64\xae\xc1\xea\x57\xa7\xdc\xf7\x23\x54\xaa\x65\x3b\xb9\x78\x36\x87\xc8\x85\xe1\xac\xf8\x2c\xa6\x9d\xca\x0c\xe8\x33\xd0\x27\xca\x83\x8b\x6a\x92\xd7\x31\x91\x96\x31\x48\x94\x55\xd3\xaf\x52\x27\x3d\xe2\xf4\x49\x7f\x49\x5c\xf5\x7d\x5f\x85\xbe\xc9\x7b\xe0\xdf\x97\x27\x44\xb2\x18\x7b\x7b\xb9\xdb\x26\xef\xb2\x39\xa0\x1a\xf7\x76\x7b\xc5\x26\xd3\x35\x65\xbe\x83\x6a\xf4\xa2\x44\x24\xc3\x0b\xd8\xfc\xf3\xd0\x72\x23\xdc\x78\x3a\x66\x33\xac\xb3\x8b\xb6\xc8\xac\x52\xf3\x91\x69\x53\xf5\xc2\x81\x06\xcc\x8d\x6e\x71\x83\xa8\x3f\xc5\x40\xf3\xaf\xd6\xe8\xd8\x8e\x87\x5e\x55\x62\x26\x0f\x06\xc7\x62\xae\x8b\xa0\x69\x76\x6b\x1d\x9b\xec\xd1\x57\x88\x7e\x1a\x93\xdb\x88\xdc\x78\x3a\xa5\x15\x78\xae\xcd\xe7\x51\xf6\xa0\x07\xd4\xac\x59\xdf\xcb\xac\x64\xb4\x16\x8e\xbb\x64\xcd\x39\x33\x1e\x4f\xe1\xe6\x05\x31\x56\xa8\x01\x7b\xca\x98\xdc\x90\x3a\xab\x8c\x37\x00\x2b\x9d\xb0\xe3\x48\xfd\xf6\xac\x13\xd2\x39\x7d\xb6\x87\x7f\x10\xd2\xe3\x81\x13\x17\x5f\xd2\xf5\xa4\xaa\x2f\x9a\x69\xed\xec\x15\x34\xcc\xf3\x92\x5f\x33\x88\x3c\xcc\x85\xb4\x6f\x9c\x2d\xee\x63\xd7\x0b\xe2\x15\x0e\x18\x18\xc6\xdf\x23\x3c\x49\xfa\x5d\xdb\x0f\xbf\x92\xfc\x96\xef\xa1\x36\x51\xfa\x9a\xf8\x13\x5b\xef\xb7\x50\xcb\xbc\xce\x30\xb4\xd6\xae\x94\x2d\x6a\x44\xa8\xf2\xff\xc4\x81\x4e\xa1\xb1\xce\x0e\xba\x39\xaa\xe2\xa5\x1d\x36\x2e\xe6\x8e\x7f\x65\xa1\x7d\x2c\x2f\x4e\x7c\x34\x88\xcf\xbf\xd3\x0c\x68\xb8\x7f\x9a\x54\x9c\xf3\x51\x32\xcc\x06\xd6\x5b\xd9\xaa\x19\xd9\x33\x0d\x93\xdf\x94\x17\xf0\x26\xe9\x77\x1f\xe2\xf3\x50\x4a\x83\xeb\x3b\x49\x80\x34\xaf\xe5\x69\xb4\x89\x37\x92\x47\xa4\x7a\xe6\xe4\xbf\x6d\xb9\xc4\x0d\xe6\x45\x75\x83\xdc\x5a\x6a\xcd\x95\xa2\xce\xb3\xf7\x6b\x77\x41\x6c\xd3\xe5\x6d\xec\x52\xc0\x91\xe6\x43\x3c\xd6\x4c\xea\x29\xc1\xd0\xcb\x6d\xe7\x9f\x38\x1e\x88\xb6\xf9\xb3\x46\x19\x62\x2e\xa0\xbf\x0b\xcc\x94\xf8\x68\x71\xa3\x29\xdf\x6f\xdb\xcd\xa8\xbe\xa1\xc4\x41\x41\xae\x0a\xe4\x6b\xbc\xde\x4c\x48\xeb\x58\xf3\x6d\xdf\x48\x86\x1b\xf0\x4b\xe7\x54\x35\xda\xc7\x98\x3e\x6c\x0c\x69\x10\xaf\xe1\xf1\x4f\xfd\xc2\x72\xd6\x3c\x31\x75\x37\x22\x21\x8f\x87\xe7\x2a\x24\xd4\x3b\x7d\x92\x5c\xe2\x72\x0c\x89\xfb\x33\xa7\xf8\xc1\x02\x53\x29\x4a\xad\x50\xb0\x37\x0a\x33\x4a\x1e\x4a\x2d\x3b\x7a\x05\xcb\xef\xb8\x13\x1a\x1f\xd8\x53\xa3\xc6\x79\x83\x55\xc2\xc6\x7b\x52\x25\x04\x72\x14\x2f\x83\x7c\x25\x27\x6b\xcd\x82\x75\xe8\x90\x51\xa1\x16\x83\x17\xf7\x89\x15\x80\x2c\x43\x97\xb3\xb0\x6f\xd5\x47\x3a\x9d\xcb\x21\x76\xdb\x5e\x25\xba\x56\xb5\x0c\x30\x8b\x65\x9a\xec\x2a\xd1\x91\xfd\xb1\xde\xed\x7b\x60\x96\x5b\x86\x57\x6d\xe3\xaf\x35\x6c\xcc\x6f\x0b\x72\xf4\x9a\x95\xdd\x64\xa7\xbe\xe1\xc4\xbf\xb0\x35\x3c\x66\x8b\x6c\x49\x03\x9b\x00\xce\xa9\x88\x33\xc9\xb6\x44\x56\x64\xfc\xe6\xee\x37\x19\xbf\x16\xf0\x06\xd7\x59\x86\x1c\xb4\xf9\x5f\x05\x60\xce\x31\x0e\x0b\x07\x6d\x03\xf9\xa8\x99\x93\x1d\x44\xc4\x6c\xb1\x6d\x9c\xe4\x31\x5f\x61\x44\x14\xf3\x69\x3f\x94\x69\xfe\x9c\x98\x9f\x20\x8a\xc8\x68\xa9\x18\x95\x03\xc3\xf5\x31\x57\x1b\x1d\xeb\x4d\x98\x18\xde\xfb\x31\xf8\x2a\x0d\x02\x7e\xa1\x1f\x85\xf7\x1d\xa2\xb0\x42\xe5\x7e\xe4\x0b\x16\xb5\x49\x02\x3c\xfb\x77\x06\x68\x64\xb4\x18\x2f\xba\x8a\xd7\x12\x11\xd3\x2f\x11\xcf\x69\xe4\x17\x0a\x15\xd7\x78\xde\x18\x37\x88\xcb\x1f\x58\x20\x22\xfc\x45\xe2\xff\x42\x3d\x01\x10\x11\x68\x28\x62\x00\x89\xdb\x41\x17\xb0\xd4\x70\xcc\xbd\x5a\x41\xe5\xda\x43\x59\x63\x9c\x9f\x0e\xb2\xc8\xb9\xf4\xcd\xac\xc2\x3f\x7a\xd9\xae\xf7\x79\x11\x4c\xb9\x8f\xc0\x8e\x6f\x53\xe3\x35\xee\x2c\x19\x29\x61\x6a\x67\x23\x6d\x8b\x52\xc8\x0d\x0c\x49\xe9\x76\xbb\x20\xa6\x0d\x23\x26\xb3\x01\x99\x38\x82\x8b\x14\xc4\x4e\x4f\x28\x33\x07\x5f\x19\x2f\xd9\xec\x9e\x7f\x94\x95\x7b\x2b\xc9\x7c\xf1\x6b\x6d\xcb\x03\xd3\xaa\x99\x88\x45\x1f\x10\xe5\x4a\xfa\xb3\x6c\x49\x8a\x47\x88\x8a\xfd\xc8\x7e\x34\xf3\xe3\x28\xb9\x25\xfe\x88\xd1\x61\x07\x9b\x16\xfd\x4a\xd7\x95\x44\x08\x0c\x70\x7f\x2c\x81\x53\xbb\xc1\x4b\xad\x52\x6d\xbd\xa8\x64\x31\x0b\x12\x46\x3c\xeb\xae\x81\xc7\xb1\x08\x50\xb4\x7c\x6c\x74\x4d\xe7\x38\xfb\xfb\xd8\xfb\x2f\x40\x17\x20\x6e\xe8\x07\x16\x5f\x14\x43\xfb\x6e\x44\xd3\xc5\x2c\xb2\x7e\x69\xec\x3d\x24\x61\x5e\x55\x2b\xdb\xc9\xa9\x7d\xee\x34\xd2\x6b\x87\xb7\x61\x9a\x2d\x80\x07\xe8\x90\xf5\xdd\x22\xc8\x86\x40\x43\x30\xca\x6d\xd9\x91\x4c\x3d\x79\xc3\xd7\xc3\x26\x6f\x67\xdc\x77\xb5\x8f\xaa\x88\xb8\x70\xc2\x06\x0c\x18\x21\x58\xec\x10\x24\xae\xae\x3a\x1d\x2b\x69\xca\xcf\xde\x72\xe1\xd2\x69\x29\xf4\x5e\x19\x67\xa3\xd8\xc5\x51\xb8\x9b\x8d\x79\x81\x19\x3e\xc3\xf0\x57\xb2\x5c\x06\x74\xe9\x8d\x68\x5a\x1d\xfb\x6b\x70\x63\xb9\x8d\xe6\x69\x54\xc2\x30\x43\x84\xba\x6f\xff\xec\x1e\x93\x3e\x55\xdd\xfd\x0b\xff\x05\x40\x28\xff\x4b\xe4\xff\x33\xe4\xa4\xaf\x9d\x98\x1b\x83\x36\xb5\xf4\xfa\xa5\xfe\xcd\xfd\x54\xfe\x61\x77\xf0\x17\x8f\x9b\xa9\xc6\x5d\x91\x67\x46\x10\xb0\xa2\xc1\x9a\x80\x56\x4d\x70\xfa\xc6\x4d\x9e\x32\x2e\x27\x8f\xcb\x32\x82\x5d\x4b\xd0\x40\x4c\xe9\x34\xb4\x28\xeb\xf0\xed\x42\x66\x15\x98\xfc\xe0\x7d\x95\x60\x63\x26\x4d\xa8\x47\x80\x52\xb9\x7d\x48\x7f\x8a\x61\x58\x75\x38\xfa\x7b\x24\x90\xa8\x6f\x4a\x48\x88\xf1\xb9\x3b\xf8\xd0\x19\x99\xfa\xf8\x55\x83\xc4\x84\x05\xaa\x5b\x53\xd1\xf1\xf2\x03\xce\xc7\x37\x48\x38\x8e\xcc\x92\x6f\x4e\xb3\x65\xd7\x5c\x86\x06\x2e\xff\x9a\xf6\x2f\x6c\x17\x00\x11\x21\xff\x0f\x05\xb6\x1a\xa7\x3f\x7a\xc3\xb2\xcf\xdb\x3b\x24\xae\x4e\x2e\x08\x19\x49\x05\xcf\x7d\x2a\xda\x40\xd7\xd7\x00\x7e\x8a\x2f\x99\xcb\xf1\x93\x80\x12\x1c\x93\x70\xd8\x3a\xc5\x1f\x50\x9c\x2f\xbf\xe5\xca\x5e\xe9\x48\xa0\x2c\x73\x3f\x7b\xa3\x88\xd2\x8c\xd4\xba\xc7\x48\x87\xe4\x05\x26\xd3\x61\xef\x52\x74\x5d\x17\xbe\xf9\x90\xd5\x27\x65\x97\x64\xfc\x28\x81\xfe\x3b\x0f\x45\x40\x41\xdc\x91\x5f\xe9\xf5\xfc\x74\xe7\x3c\xc8\x24\x1c\xa7\x75\x9f\xaf\x1b\xb9\x72\x77\xb2\xc9\xfe\x71\x9f\x7c\x09\x6b\x51\xb3\x61\x76\x8b\x5e\x95\x7d\xce\xba\x43\x3e\x94\xd0\xba\xf3\x2f\xdd\xfd\xbf\xd0\x58\x00\x24\x1b\x06\x8e\x1d\x70\x0d\x89\xc3\x07\xd1\x0b\x16\xae\xb2\x1f\xe2\x5c\x93\xac\x35\x7b\x66\x0c\x8f\xcf\x37\x64\x6d\xa2\xbd\x04\xab\x22\xf7\x58\xa5\xa7\xc0\x2a\x41\xa5\x9b\xe4\xf3\x22\x54\xaa\x73\xa7\x6b\x58\xbf\x21\xa1\xf0\x78\xf8\x64\x24\xfe\x1c\x18\x43\x98\x3e\xb6\xee\x3a\xb9\xa1\x01\x53\x40\x54\xbb\xf5\xda\x01\x33\x2e\xe2\xc5\x3d\x4b\x60\x12\xf3\xbc\xa6\x68\xe1\x7a\x52\x74\x27\x6e\xce\x32\xb1\x61\x0b\x2f\xc1\xe7\x40\x52\x30\x99\x2e\xe0\x31\x92\x64\xb4\x2d\xd0\xd1\xde\x4c\xe7\x6e\x3d\x16\xc7\x0e\x55\xf1\x41\xbf\x38\xe3\x4e\xb5\x09\x8b\xff\x73\x98\x11\x27\x20\x3a\x67\x3e\x62\xd0\xc5\x66\x1a\x20\xa7\x60\xec\xcd\x98\x7d\x3d\xec\x6d\x6e\xcc\xaf\xb7\x17\xd1\x6b\x94\x8f\x11\xae\xab\x33\x81\x04\x88\x5a\xc4\x1a\x6c\x35\x59\xc1\x2a\x85\xb5\xc7\xb8\x10\x48\xe6\x25\x7d\x10\x34\xe8\x15\x29\x9e\xdc\x8f\x9b\xff\x74\x12\x65\x4d\x1e\xfa\xf7\x07\xfe\x17\x26\xfd\x3f\x29\x5c\x88\x40\xb6\xc6\x06\xd5\x36\xb6\x95\xd0\x75\x50\x4d\xbb\x2c\x35\x8d\xbd\xda\x9a\x72\x26\xd2\x2c\x7f\x43\x6e\xe6\xdd\xf7\xe8\xf1\x3a\xed\x90\x6f\x60\x69\xc3\x7b\x64\x05\xf5\x79\x14\xc1\x32\xf9\x57\x92\x0a\x89\x45\x3f\xeb\x27\xdf\xdc\xb9\x84\x0f\x13\x24\xca\x9a\x95\x5a\xcb\x41\x01\x8c\xa4\x4e\x6c\x82\xfb\xfb\xbf\xa1\x6e\x92\x30\x1a\x74\x89\x6b\x9c\xf9\xe5\xde\x7b\xdf\xab\x27\x71\xe3\xa9\xc9\xaf\x0e\x70\x56\x28\xa4\x83\x1b\x6c\xcc\x90\xc3\xd2\x50\xe5\xd7\x9b\x82\xf9\x2c\x73\x75\x43\x0d\xa9\x43\xfb\x55\x1a\x69\x1b\x9f\x17\x63\xd6\x57\x58\xa7\xa4\x6c\x7f\x0f\xe8\x7f\x82\x48\x88\x3f\x54\x90\x1f\x70\x40\x7f\x1d\x88\x47\xef\xf8\x5a\x28\x71\x84\x1c\xde\xe7\x88\x93\x68\x61\x66\xa7\xbb\xe4\x07\x5f\xe5\x52\x8a\x4f\xce\xa0\xfa\xa5\x19\xac\xfc\x53\x31\x99\x7e\x93\xc2\x78\xea\x8e\xca\xee\x99\x9d\xa8\xdd\x13\xb4\x84\xc1\xb6\x62\x56\xad\x92\x42\x5b\x0c\x7f\x75\xf2\x7b\x1b\xec\xb7\x2b\x18\x11\x48\xf5\xe0\xd4\x7b\x9c\xa7\xb6\x16\x27\x45\x01\x25\x89\x47\x76\x80\x8b\xa9\x26\x3d\xea\xb8\x36\x86\x45\x10\x9e\xaf\x03\x88\x46\x15\xfb\x7d\xef\xcd\x0b\xb4\x38\x51\xe0\xb6\xdd\xf9\x3e\xd0\x68\x1d\x2e\xda\x26\x5c\x9a\x18\xce\xed\x6b\xfd\xa5\xb2\xfb\x1d\xf8\xa4\xf0\x09\xc3\xac\x83\xcf\x71\x21\x74\xc7\x64\xb5\x34\xf9\xb6\xcc\xd5\x88\x95\xcd\xfc\x16\x3b\x36\x71\x3d\xf8\xeb\xda\xda\x4f\x6f\x83\xbf\x3f\xc4\xbf\xa0\x6c\x00\xe4\x39\x11\x14\x14\xf0\x43\x5c\xbc\xa0\x88\xd2\x3f\xb0\x47\x60\x75\x97\xe4\xfb\xda\x4d\x73\xf5\xc3\xe2\x48\x78\xee\xfc\x9b\x4a\x90\x17\x3e\x95\x5f\xe9\x1a\x18\x26\xff\x11\x5e\xa7\x89\x3f\x21\xed\x63\xa3\x46\x6a\x52\x01\x79\x8b\xea\x15\xdd\x52\x2b\x28\x2c\xe2\x40\xd4\x25\xe0\x44\x8a\xad\x03\x46\x81\xac\x21\x0e\x1c\xca\x43\x02\xfd\x43\x4e\xad\x36\x5a\x45\x03\xf3\x78\x22\x03\x1e\x0b\x6e\xf3\x5d\x1c\xbb\x77\xe7\xb2\x68\x8e\x60\xc3\xca\x1d\x2c\x8f\x52\x48\xdc\xee\x99\x9e\x89\x8a\xa5\x77\x7d\xa1\x24\xd6\x2c\x4f\x88\xe3\x88\x74\x85\x34\xe9\x8a\xe8\x0e\x9f\x26\x98\xd3\x58\xf1\xed\xc6\x4f\xfc\x33\xc1\x44\x8b\xdb\x87\x21\x76\xe8\xbd\x4a\xb2\x09\xf5\x58\xbe\xf5\x55\x14\x37\x0a\xea\x46\xe9\xc8\x47\x30\x78\x48\xfd\x59\x11\x7f\x28\x8e\x81\x87\xc8\xd6\xdc\x33\x30\x3a\xe4\xd6\xde\xf4\xab\x28\x2b\x42\x16\x92\x96\x44\x6a\xe7\xb5\xc6\xc3\x13\xad\xf5\xbf\xc0\x6f\x00\x04\x13\x19\x0e\xdc\x36\xd1\x71\x39\x6e\xd5\x65\xca\xce\x7e\x57\x5c\x7d\x83\x08\xae\xb0\x23\xac\x84\x4d\x7f\x46\x55\x55\x8a\xf5\x1f\x85\xe5\x88\xe2\x40\xd6\x9d\x86\xbc\x0c\x3e\xae\x74\x2d\xfc\x82\x6f\x98\x73\x08\xdd\x01\x94\xc7\xf7\xb0\x51\x57\x6d\x92\x54\xab\x0f\xac\xa6\x25\x0e\x1c\x46\x60\xe6\x2e\x33\x05\x2b\x52\xdd\x99\x90\x76\x9e\x7c\xa3\xfa\x0c\xe4\xb9\x2d\x52\xca\x38\xdb\x89\x8a\xc0\x0b\x01\xb1\x2b\xa9\x03\x0a\x90\xc0\x5e\x3d\x35\xd9\x5f\x84\x45\xdc\xc7\x9e\x20\xc2\xc8\xe1\x55\xf6\x1e\xd3\xe2\x5b\x2f\x76\x2b\x2a\x35\xe9\x14\x2c\x16\x0f\x52\x34\x90\xdc\x3b\x92\x94\xaf\xe6\x87\xfe\x75\x37\xb4\x8a\xaa\xf6\xeb\x12\xfa\xe0\xf8\xb9\x67\xa4\x57\xa6\xe4\x50\xf3\x05\x27\x82\x71\xcb\x17\xdc\x7f\xaf\x88\x7f\xa2\x65\x08\x26\x54\x28\x18\xfd\x7f\x8e\x01\xa5\xa2\x44\xe8\x19\x0d\xc3\xe8\xfc\x41\xbf\x67\x12\xc3\x4a\x70\xe4\xfe\x7c\xbd\x4e\x1b\xa9\xae\xd0\x8e\xe8\x99\x0b\x98\x53\xf8\x45\xf6\x5d\x2f\x4f\x7c\xcc\xf2\x31\xbf\x2a\x72\x6f\xf4\xa3\x38\x59\x3a\x1e\x1a\x4e\x96\x52\xf0\x9d\xab\xf7\x63\x96\x59\x51\x26\xf8\xb0\x71\x1c\x45\x25\xb1\xc4\x32\xeb\xef\x1a\x77\xa1\xaa\xbb\xf3\xbd\x26\x99\x8e\xa5\xa4\xfb\xf9\x15\x3e\x45\xb8\x73\xae\x3b\x04\xec\x78\x93\x2c\xf5\x6e\x72\x2a\x3e\x35\x3b\x5b\xac\x72\xe4\x43\xa4\xea\x1d\xcd\x04\xc9\x83\xd7\xe8\xed\xb5\x9c\xb4\x46\xcc\xf2\x95\x42\xd5\x45\x20\xfa\xff\x44\x41\x44\x5a\xf8\x7e\x1f\xec\x38\xf8\x0c\xf5\x85\xac\x52\x1b\xf1\xba\x53\x13\x13\x8a\x54\xda\x90\x8b\x2e\xcd\x29\x44\x6d\x4d\x5e\x04\x40\xfe\xf8\x5e\xfa\xa6\xbc\x00\x7c\x07\x1b\x5f\x3f\x74\xf3\x16\x8e\x50\xad\x29\xcd\x8f\x5a\xa2\xd2\x13\x85\x43\x7a\xba\xe7\x92\x3b\x9f\x6b\xe0\x1d\x07\x48\xb7\xc3\xad\x9f\x8e\x3c\x2f\xf6\x45\xa6\xb1\x96\xce\xcc\x9b\xdf\x7a\xa1\x68\xfa\xa3\x69\x79\xb0\x1c\x9a\x5a\xab\x5d\x54\x2c\x79\x51\x8f\x15\xc3\xe2\x40\xef\xa1\xc7\x61\x86\xc9\x7e\x56\xd7\x52\x5d\xc2\x9e\x6a\x0d\x1d\x3b\x83\x4b\x47\x6b\xcc\xd3\xa1\x5f\x31\x2f\x90\x91\xcb\x8f\x1b\x22\x2c\x40\xdf\x45\x65\xef\xd3\xba\x53\x83\xfe\x18\xbb\x45\x5c\x90\xe4\xdd\x3c\xeb\x98\x71\x36\x8e\xd6\x55\xc6\x06\xdd\xcf\x6b\xf9\x21\xc4\x16\x30\xc2\x16\xa5\x17\x56\xd3\xea\xf4\xb9\xac\x2e\x96\xfe\xf7\x10\xb2\xe2\x75\xf3\xb3\x49\x04\xc3\x68\xc5\xc9\xcb\x92\x57\x31\x4e\x86\x88\x13\x80\xe8\xab\x55\x35\xd3\x10\x1d\xb4\xe1\x49\xbe\x6a\xed\xb7\x8a\x06\xbb\x1a\x10\x9d\x36\x22\xd3\x0a\x21\xb4\xcb\xf7\x09\x33\x9b\x64\x7a\x4f\x56\x15\xcf\x7e\x0a\xfd\xb8\x52\x1e\x12\x63\xd7\x29\x1a\x6c\x40\xa0\x37\xcd\xb2\xe6\x38\x8b\x1c\xc3\x8d\x22\x9d\xf3\xdd\x41\x08\x16\x08\x31\x1d\x90\x44\xc1\x47\x65\x22\x67\x31\x67\x5f\xa8\x46\x7a\xbc\x69\xcc\x92\x59\x52\x8f\x53\xed\x17\xe9\xda\x32\x30\xeb\x92\xf3\xba\x03\x6e\x07\x1d\xd7\x67\x15\x37\x0c\x73\x8e\x08\x9b\x1f\xce\xd2\x3d\x71\x6b\x6a\x3c\xf7\xb1\x0a\xf7\x50\xb9\x2e\x91\xe9\x98\xdf\x8d\x2a\x9c\x3d\x0d\x5a\xf4\x18\xd2\xe9\x54\x71\xce\xf6\x60\xee\x34\x94\x3d\x94\x60\x7d\xe4\xbc\xb3\x70\x15\xc7\x1a\x77\x00\x71\x7d\xec\x78\x84\xc4\x82\x53\x35\x4c\x37\x00\x13\x87\x7d\xcb\x33\x7f\x18\x61\x57\x79\xe5\x80\x90\x7f\xe4\xe8\xbf\x9c\xa6\x61\xf5\x72\x8f\xd4\xf1\x82\x91\x26\xfc\x69\xc3\xe0\x58\x91\x63\xa2\x4d\x5a\xf1\xf0\x49\x42\x57\x4a\x39\x2b\x65\xa8\x6f\x0d\x07\x74\x29\x48\x85\x41\x02\xd1\x12\x68\x38\xc6\xeb\x01\xef\x45\x2c\xc6\xc6\x9a\xbd\xb9\x78\xf5\x60\xe7\xb3\x60\xc9\xd2\x36\xcb\xfc\x2f\xc9\x05\x97\x8a\x8b\x33\xdf\xec\xf1\x42\xc7\x10\x52\x20\x1e\xe2\x3b\xc2\xee\xae\xa2\xad\x25\x43\xea\xda\xbb\x45\xab\x4c\x5c\xec\x68\x8a\xf2\x92\x3b\xf8\x65\x8e\x75\xed\x35\xf7\x5e\x4f\xe1\x8b\x27\xc9\x7e\x66\x6e\x86\x8d\xd2\x1e\xf5\x8a\x5d\xdf\xc7\x7e\x15\xc7\x68\xc2\xba\x68\xcb\x83\xd9\xc4\xb1\xd0\x2e\x65\x8c\xdc\x52\x5e\xd0\x77\xe4\x79\xa1\x3a\xae\xc1\x8a\x13\xd4\x67\x5c\x54\x7b\x44\xe3\x59\x58\x4c\x55\xe2\x4c\xf1\xee\xd1\xfa\x97\x8e\xa6\x8a\x66\x7e\xeb\x7f\xd2\x1d\x48\x65\x10\xe5\x24\xee\x2a\x35\x62\x08\x46\xae\x0b\x28\x2b\xc7\x6a\xf3\xf7\xb4\x19\xa9\x2c\xe0\x7a\xdf\x0a\x9c\x84\x76\x0e\xd6\x02\xd7\x1d\x6b\x8c\xe2\x46\xa5\x3b\x4c\xa8\xd3\xd7\x5a\xdb\x42\x3d\x2e\x8f\xef\x0d\xfd\xf2\xb0\xc5\x7d\x92\x74\xf5\x41\x8d\xbf\xfd\x45\x01\xfb\x4d\xa2\x72\xb7\xb6\xf7\x53\xd2\x43\x37\xc6\x27\x7e\x5c\x25\x1f\xb9\x13\xd7\x5f\xdc\x97\x2c\x5c\x21\x48\x30\x5d\xbd\xa4\x8c\xfc\xf5\x64\x95\xe3\x89\xe8\xc6\x29\xd4\xb8\xa3\xb5\x1d\xf5\xde\x73\xf2\x14\x09\x4f\x31\xe3\xfe\xbd\x95\x0f\x7d\xf3\x7a\x13\x74\x2f\xb7\x3d\x01\xc2\x94\x8f\x34\x51\xd7\xfc\xde\x5d\xeb\x5a\xec\x46\x32\x50\x76\x2e\x26\xeb\x88\xbc\x1d\xd7\x8e\xb2\xa8\x17\xe4\x68\xb7\x50\x50\x0a\x7a\x60\xdd\x9b\x9c\x54\x84\x7c\xc6\x2a\xbc\x73\xc8\xe5\x96\x2b\xda\xb1\x99\xbd\xb8\x8e\x3f\xe3\x7b\x27\x96\x8f\xd1\xdd\xa9\x66\x0c\xac\x7b\x4f\x83\x86\xb2\xbb\xf2\x65\xae\x75\x31\xd2\xb0\xd4\xb3\xfc\x66\x1e\x30\x27\x6b\x6d\x68\x56\xe1\x15\xa0\x87\x67\x42\x2d\xff\xa8\x1e\xfb\x9f\x9d\x52\x49\x5e\xd7\x1d\x2e\x74\xf0\x53\x49\xaf\x68\x7c\x7e\x77\x06\x82\x90\x75\x7f\xc5\x55\xa7\xdf\xb4\xf5\x2d\x03\xbf\x96\x0d\x75\x01\x0c\x88\x18\xb3\xaf\xb6\x5d\x10\x2c\x62\x0f\xe9\x23\xa3\x1e\xd9\xbe\x2c\xef\xc7\xca\x86\x47\xbd\xd8\x3e\x9f\xd1\xdf\xcd\xf5\x12\x60\x05\xd8\xb2\x52\x44\xbf\xa7\x58\xa6\x3f\x46\xf4\x71\x7f\xb5\xeb\xaa\x2c\x6b\x9e\x20\xb6\x5a\x9f\xcc\x67\xe3\xc7\xd9\xca\x83\xcd\x4f\x01\x42\x9c\x53\x1f\x22\xa1\x0c\xc2\xbf\xbf\x93\xe9\xd3\x86\x8a\x11\x39\x24\xf4\xd3\xb3\xfc\x75\x57\x2a\x5e\x48\x47\xc4\x9e\x2f\x37\xc9\x64\x0a\xaa\xaa\x30\xcd\x9c\xce\x5c\xfb\x99\xb2\xbc\x56\x89\x26\x8e\x6c\x8d\x73\x27\xf6\x43\x08\xf4\x4f\xb2\xbb\xea\xb0\xf1\x1e\xca\x13\xa6\x11\x40\x54\x2c\x71\x19\x93\x59\xe9\xb0\x51\x3b\x7e\x0b\x66\x20\xc7\xf0\x64\x07\xdf\x58\xb7\x9a\x87\x56\x6a\xcc\xfc\x53\xf8\x81\xef\x00\xd0\x87\xbf\x9f\xab\xd2\x53\xc3\x91\xad\x84\x1d\x2b\x3e\xc8\x2c\x2c\x87\xd5\xb9\x9c\x62\x4d\xc6\xc3\x31\xbe\xe3\x99\xad\x96\x7c\x55\x90\x27\x98\x7b\xdc\x8c\xda\xcf\x51\x2a\x41\xd8\x78\xa2\xf5\x89\xfd\xfc\x85\xf2\xf0\xef\x79\xea\x14\x5f\xc8\x51\xbc\x46\x43\xcd\x9b\x0d\xcd\x1f\x4f\x56\x11\xd2\x07\xba\xdd\x62\x33\xd2\x59\x78\x5c\x3d\xf4\xea\x40\x07\x7d\xc7\x99\x22\x0c\xbb\x85\x5e\xf5\x43\x96\x48\x15\xfd\xda\xec\xf3\x9f\x30\x53\x45\x7c\x08\x8d\x4f\xbb\xcb\x25\x4b\xc4\x49\x31\x9c\x4b\x65\x33\xea\x59\x10\x86\x48\x37\x62\x95\xa0\xfc\x66\x5d\x2a\x3c\x09\x20\xfa\xb8\x5b\xaf\x07\x85\xca\x64\x47\x3b\x74\xbc\xef\x29\x86\xc8\x76\xf4\x28\x3c\xcb\xc9\x8d\x20\x1e\x82\x22\x8d\xd9\xa5\xe3\x04\xfd\xb4\x55\x99\x35\x3f\xdf\x39\x35\x41\x21\xad\x76\x9f\xdb\x29\xa2\x4b\x2b\x47\xaf\xfa\xb1\xad\xa8\x96\x94\x35\xe5\x4e\xbd\x60\x30\x52\xa7\x01\x4e\x95\xca\x40\x32\x86\x8a\x2b\xb4\x6d\xa4\x1a\xbf\x39\x66\x26\xc6\x86\x31\x1e\x62\x46\xbb\x80\x4a\x34\xae\xad\x59\xf1\x2e\xcb\xbc\x27\xc9\x11\x7e\x7e\x5d\xe1\x23\xda\x1b\x04\x8b\xef\x42\x0e\x92\xed\x13\x9c\x6e\x33\x3a\xea\x39\x4d\x1c\x64\x87\x57\x76\x11\xa7\x5d\xa3\xc0\x9f\x52\x89\xef\x6c\xaf\xbb\xdf\xca\x77\x03\x55\xc0\x38\x9d\x35\x63\x4a\x32\x18\xe5\x37\xb3\x81\xcf\x6b\x92\x55\x88\x28\xad\x63\x06\x40\xde\x11\x26\xea\x03\x13\x09\x68\x14\x93\xc3\x12\x02\xc8\xd0\xeb\x15\x9c\x0c\x42\xd3\x11\x4c\x46\xec\x61\xb3\xab\x29\x5e\x51\x55\xa0\x98\xf1\xbc\xd0\xa4\xf9\x5b\x79\x65\x7c\x7f\x33\x3f\x4c\x15\x47\x5d\x24\x6e\x8b\xaa\xcc\x60\x09\x07\x41\x65\x02\xed\x1c\x93\x22\xe2\x1c\x38\xa7\xf9\x0e\x71\x38\x17\x1f\x3d\x27\x29\x91\x2d\xda\xc8\xdc\x5a\x45\xad\x5f\x45\x86\xcc\xdf\x7f\x33\x5f\x90\x66\xc8\x4d\xcb\x7b\xa7\xf4\xff\x60\xff\x3f\x6f\x34\x08\x26\x26\x14\x0c\x00\xfb\x9b\x83\xb3\xf0\x4f\xac\x48\x48\xde\x96\xd4\x7c\x5a\x7f\x45\x2d\xcc\x21\x2a\xc3\x36\x29\x2e\x3e\xcb\x65\xa3\x93\x89\x52\xbc\x1c\x0c\xec\x96\x12\x12\x91\xb4\x69\x12\x21\x74\xb6\x8b\xc6\xea\x85\xb0\xcd\x04\xa7\xba\x2d\x9f\x4a\x8d\x1e\x33\xc2\x05\x0e\xd7\x8f\xe5\x64\x78\x4f\x96\x95\xd1\xe6\xd2\x22\x18\xaa\x67\x19\x5b\xab\x08\x6e\xf7\xfa\x86\x27\x8a\x5e\x90\xd3\xa9\xbd\x70\x5f\x84\x4d\xfd\xad\x27\x86\x01\x96\x53\x69\x72\xbe\xfd\xc8\xb3\xc6\x01\x17\xd7\x26\x6c\xe7\xa6\xc0\xc4\xdd\xf8\x72\x8f\x64\x99\xd4\x99\x63\xd7\x6b\x6a\xb8\x5c\x9a\xc1\xe7\x62\x0e\xe6\x7f\x77\x57\x06\x40\x30\xe9\xd9\xc1\x72\x0c\x31\xb4\xa0\x9b\x9b\x53\xc8\xfc\x2f\x82\xb7\x54\x69\xd5\x0f\x23\xc4\xcf\x08\x95\x90\x96\x48\x4c\xeb\x6d\xd1\x30\x6d\x1c\xd3\x40\x0a\x1c\x82\x0d\xcc\xeb\x0e\xb3\x01\x35\x82\x33\x47\xdf\x2d\x1c\x19\x23\xa7\x28\xc7\x98\x50\xfb\x67\x16\x8d\xae\xe7\x53\x6c\x03\xba\x60\x93\xe5\x80\x68\x2e\x52\xdc\xca\x4f\x0b\xac\xcd\x0b\xf3\xdc\x2c\xde\x6b\xc7\xe7\xf9\x79\xc6\xf8\x58\xbf\x3b\x2a\x72\x1d\x7c\x37\x74\x40\x2c\x1f\xe9\x79\x8e\x4f\x0d\x69\x4c\x8e\x1e\x9d\x50\x27\x16\x32\xb0\x5d\x6f\x56\xd5\x5a\x2d\x7e\xaf\xd9\xe5\xdc\xc6\x69\xb8\xba\xb0\x0d\x6c\xaf\x84\x93\xf7\x39\x3f\x25\x31\x13\x1d\x72\x27\x7a\x94\x74\xd8\x17\x2b\x2d\xbd\x8d\x14\x56\x34\x6f\x22\x1e\xf0\x14\x7e\xdb\xd1\xee\x3e\x4d\xed\xae\xa7\x27\x72\xf8\x2a\x7c\x0b\xee\xa5\x1d\x6d\xe5\xb6\x9d\x93\xd0\x40\xa5\x24\xec\x57\x1b\xf7\x51\xdb\x18\x81\x6b\x6d\x6e\xe0\x51\xea\x74\xf8\x7d\xfd\x41\x61\xd4\x3b\x37\x85\xce\x18\x1d\x49\x0d\xab\x3f\xfd\xd6\x0f\xaa\x7c\x15\x38\x1a\x74\x6f\x3d\xfd\x7e\xd0\x90\xfc\x7d\x75\xfd\x17\xb4\x08\x10\xa7\x16\x15\x05\x3c\x09\xda\x03\xda\x78\x95\xf4\x62\xa7\x2c\xc2\xae\xa9\x8d\x67\xfd\x6c\x49\xfd\x81\xaf\x31\xec\xab\x89\x88\x92\x51\x3d\xd5\xe2\x86\xc0\x80\x97\x87\xd7\xf5\x87\x8d\xb7\x2e\xc4\xca\xab\xbb\x06\x98\x24\xaf\xea\x95\x06\x7f\xfb\xc1\x19\xa1\xb1\x60\x5e\x9e\x73\xc7\x4c\x72\x80\x69\x9a\x5b\xd6\xaf\x73\xf5\x4d\xde\x47\xeb\xe7\x7d\xf5\x5c\x3a\x9a\xbc\x49\x9b\x7e\x9d\xcc\x6f\x60\xac\xf3\x8b\xdd\xec\xfb\x39\x14\x15\x98\xa9\x5e\x1d\x25\x67\x13\x14\x98\x71\xf2\x81\xad\x87\x98\x2c\xe8\x92\x6f\x8f\xe1\x65\x5e\x9e\x81\x97\xf7\x6a\xe7\x01\x85\xdf\x65\x05\xd8\xb3\xaa\xcd\x1a\x67\x75\x13\xea\x7d\xf3\x2e\xbf\xe1\xbb\xf4\x9b\x37\x2b\x31\x6f\xe2\x07\x71\x6d\xdb\xbe\xaa\x35\x48\x90\x1f\x30\xe9\xfa\x81\xd5\x33\x3a\xdd\xe2\x45\xd5\x42\x6b\xe3\x79\xa8\xab\xab\x18\x77\x86\xc2\xe5\xca\x21\x6a\x35\x65\x25\x45\xe1\xf8\x4b\x3f\x1c\x99\x64\xfe\x7a\x12\xff\xc4\x57\x10\x4a\x38\x3f\xb0\x41\xce\xdd\xd2\xa8\xb1\xa0\xf4\x26\xa3\xe7\xc0\x9f\x01\x78\xb6\x22\xd4\x08\x3f\xfe\xa0\x3b\xe3\x50\x05\x17\xc3\xd7\xd0\x32\xab\x1e\x84\x80\x12\xe4\x62\x28\x9f\x3c\x67\x18\x06\x38\x2d\x8c\x5d\xd7\x8f\x4f\x1a\xc3\x1a\x1e\x1a\xfa\x94\x04\x42\x3b\x82\xa9\xd0\x7b\x78\xfc\x41\xee\xdb\x75\xff\x94\x06\xf2\xc1\xa8\x88\x33\xff\xbb\x3f\xc7\x59\x01\x08\x7f\xe0\xce\xbb\x50\xb0\xa7\xf6\xbf\xcc\x2f\x15\xef\x36\x8d\xb0\x03\xa2\x2e\xe3\x93\x15\xed\xaf\xfa\x69\x7a\xbe\xfb\x9b\xe3\xc5\x0a\xf7\x6c\xeb\x06\x3b\x7e\x27\x70\x67\xd9\x79\x71\x6c\x3b\x15\xc1\x79\x0b\x46\x64\x5e\xfc\x8c\xf6\x7c\x2d\xe4\x46\x82\xbd\xc8\x2d\xf2\xc3\x94\xde\x4e\x3d\xe4\xdd\x1c\x23\x0f\x35\x69\x6c\xd9\x62\xe5\x4c\x6d\xe0\x45\x00\xcc\xff\x0e\x90\x05\x88\x07\x88\x80\x85\x7d\x86\x8a\xa4\x30\xce\xd1\x52\xc2\x6a\xbd\x9e\x9f\x92\x87\xf5\xc9\x1c\x7e\x85\x22\x10\xd7\xbf\x16\x96\x90\x4c\x37\x5b\x1c\x19\x94\x01\x0e\x1a\xbe\x58\xe7\xed\x77\x4d\x27\x47\x17\xad\xda\x89\xe7\x6d\x33\xe7\x38\x8a\x02\x8f\xb4\xf2\x29\x08\xd6\xdb\x21\xf4\x18\xef\x3c\x5c\x81\x23\xb4\x51\x2e\x86\x68\xf6\x37\x39\xe4\x46\xf5\x79\xdc\x5b\x58\x67\x7f\x27\x54\xd6\xdf\x44\xd4\x8c\x8f\x58\x42\x17\x10\xb4\x68\xb0\x84\x68\xc7\x3c\x80\x04\xd9\xc6\x52\xae\x58\x6f\x86\xc7\xeb\x67\x50\xe1\x87\x9c\x55\x24\x9e\x04\x25\xd4\x1f\x19\xb4\x02\x1e\x87\x28\x36\x60\x61\x52\xb4\xb5\x0c\x0c\xb3\x2f\x23\x12\x7b\xf7\xed\x12\x72\xcb\xa7\xc2\x8a\xe4\xe0\xcf\x55\x98\xe4\x46\x08\x2a\xbf\xaa\x8d\xf2\xa0\xff\x7a\x53\xff\x02\x65\x01\x10\x18\x63\x28\x30\xe0\x46\xbb\xa8\x54\xa4\xd8\xc2\xb8\x34\x36\xc9\xb4\x32\x67\xaa\x3b\x16\x54\x93\x82\xfd\xe6\xe7\x89\x51\x6b\xef\x2f\x28\xdb\x76\x3d\x54\xb0\xc2\xd2\x39\x27\x6b\x36\xfd\x6d\xb2\xa3\xb2\x5f\x53\xcd\xd6\x80\xc8\x4f\x65\xd2\xcb\x52\x8b\x25\x52\x85\x08\x4d\x0d\x98\x0a\x2c\xb0\x44\x2c\xc6\xbf\x56\x9d\x05\x1f\x0f\xfd\xda\xdd\xac\xac\x90\x9c\xdc\x7f\x52\x0c\xa1\x24\x0d\x2e\xf8\x9b\x86\xaa\x48\x4e\x67\xb1\xac\x1e\x98\x8a\x1e\x80\xca\x38\xe4\xc4\xee\x2d\xb6\xf2\x59\x6a\x78\x20\x41\x53\xe0\xf6\xad\xb9\xf1\x4b\xd5\xc9\x41\x25\x1a\xe9\xb6\x82\x55\xb5\xbf\x9b\xfc\x5f\x28\x2a\x00\x22\x8d\x29\x02\x56\xaf\x72\x1f\x7f\xde\xa1\x2e\x9a\xaa\x0b\xfb\xae\x50\x63\x16\x9c\x23\x3d\xa7\x8a\xd5\x80\x18\xad\x27\xf7\xa6\x82\x5b\xfb\xf5\xab\x6e\x90\x2e\x08\xb2\xea\xad\x89\x61\xe9\xfe\x26\xca\x23\x1f\xb6\x62\xb2\xea\x6b\xe2\x3a\x6d\x5a\x55\xda\x6e\xa1\xa9\xc2\x2a\xb4\xf4\x34\x17\xd8\xe0\x4a\x4e\xb8\x61\x61\xa9\x49\xe1\x61\xf5\x0d\x39\x12\xfe\x9c\x4c\xe1\xe0\x77\x5c\x3e\xf4\x67\x87\xa3\xba\x10\x6a\x1a\xb4\x45\x13\x90\x9c\x6c\xee\x5b\x54\x07\x57\xa4\x04\xaa\x52\xdb\xb4\xb4\xbb\x57\x5e\x79\xfb\xdd\x67\xaf\x0a\x2e\xec\xbb\x54\xf4\x17\xa2\x2a\x22\xbf\xc1\x63\x89\x87\xea\x55\xdd\x30\xed\x41\xb0\x2c\x02\x1d\x65\xfe\x1f\x6a\x2d\x33\x0a\x48\x14\xa6\xdf\x16\xa9\xa6\x9f\x87\x21\x6d\xf3\xd9\xee\xdf\x28\xda\x3f\x01\x22\x44\x04\xc6\x0f\x2a\xf0\x69\xeb\x52\x5e\x97\x4a\x4f\x6d\x14\xd0\xdb\x2b\x06\xff\x1c\x1d\x0f\xe7\x40\x93\x79\xfe\x75\x3f\x8a\x3b\x75\xd7\xa8\x4e\xa9\x52\x40\x15\xe8\x90\x9c\xf7\x5d\xb7\x1c\x6a\xec\x2d\x6f\xb5\xed\xe9\x36\x89\x9b\x19\x01\x33\xe2\x6e\xf2\x3d\x6b\x30\x56\xb8\xf2\xf5\x26\x03\x4d\x00\x98\x65\x62\x69\xc7\xbc\x62\xa9\xe5\x57\xea\x91\xf4\xa3\xb4\x50\xf8\x59\x5d\x55\x0a\x0f\x91\x51\xf9\x24\x17\x86\x12\x09\xaa\xda\x26\x04\xfc\xd3\x37\xe4\xab\xfb\xbd\x68\x0e\xe6\xfc\xb4\xea\xea\xd8\x85\xa7\xf2\xba\x34\x14\xe6\x7a\xf3\x97\x13\x7a\xf0\xe7\xfa\x0c\xc9\xb1\xf4\xfe\x5a\xf6\x2f\xe8\x19\x20\xce\xf8\x9f\x28\xf8\xa0\x92\x45\x8a\x28\xfd\xae\x91\x5b\xbe\x4c\xab\xed\xdb\x08\xb7\xe3\x29\x73\xe9\x05\xe6\x21\xb6\x71\x4b\x4a\xad\xdd\xa6\x91\x2f\x60\x31\x17\x4b\x73\x09\xd2\xa7\xc9\xea\xea\xba\x85\x17\x93\x79\x7d\x49\x68\x91\x99\x1b\xf4\x57\x98\xc7\x7c\xf8\x9d\xfb\x01\x5d\xe7\x61\x80\xa8\x9b\xdc\x99\x01\x11\x36\x7d\x76\x08\x5d\x59\x2a\x1a\x83\x77\x5f\x91\xe6\xe4\x8e\xca\x09\xa2\xfe\xab\xb7\x1e\xf5\x05\xe7\x73\xe0\x83\xc8\xf0\x9a\x56\xcf\xf3\x59\x06\xb5\x87\x8e\x14\x03\x4a\x1d\x8a\x39\x94\x72\x47\xf1\x70\x2e\xbf\x9b\x62\x55\xd3\xe1\xad\x8a\x2e\xdc\xbf\x3f\xe5\xbf\x90\x72\x00\x44\x16\xea\x3f\xed\x6c\x91\x3f\x3b\xa8\x97\xdb\x4d\x5d\x68\xa2\x9c\x7b\x48\x51\xe4\x68\x88\xbb\x35\xf4\x53\xf5\xa2\x0b\xba\xfa\xd1\xca\x2d\x9b\xd4\xa9\x03\x4a\xf8\x5f\x2e\x38\x0a\x8e\xe9\xf9\x75\xcd\x57\x19\xd4\x7b\x57\xcb\xfa\xd0\xe0\x9c\x61\xd4\x42\x5e\xf3\x4c\x7e\xb4\x69\xb1\x71\x01\x57\xa2\x44\x52\xaf\x22\xf6\x82\xe0\x22\xca\x9f\xda\xf7\xcd\xda\x9d\x42\x68\xd6\xd6\x27\xa3\x49\xc7\xdd\x39\x7d\xeb\x31\xcd\x69\x4d\xb0\xff\x6f\x48\x00\x8b\xd2\x54\x51\x1e\x47\x26\xd2\xa1\x85\x37\x2f\x12\x96\x22\xcf\xca\x37\x92\x1d\x0a\xe7\x92\x0a\x72\x29\x85\x39\x3c\xea\xa7\xed\xf8\x0f\x64\x1d\x20\x8e\x09\xa5\x04\x58\x96\x48\xc8\xab\x70\x75\x10\x73\xcf\x6b\x62\x11\x59\x13\xe1\x59\x8d\x5c\x39\x5d\x88\xed\x37\xee\xfe\x2a\x7d\xd0\xc0\x6e\xf4\x6e\x0a\xd0\x81\x72\x2f\x9b\xd9\x4b\x4f\x9d\xcf\xe0\xa0\xf3\x85\x2a\x0e\x36\x99\xd1\x2f\xbd\x17\x74\x0e\x97\x3c\x1b\xef\xd8\x89\x2f\x38\x3f\xbc\x03\xa3\x5d\x9c\x0c\xae\xef\x56\x6a\x19\x5a\x52\xce\xa4\xaf\xe6\xcf\x9b\xa5\x71\x47\x4f\x14\x60\x7e\xaf\x71\x05\x8d\xd7\x44\x6c\x08\x83\x3b\x97\xe3\x33\xbc\x94\x26\x3d\xef\xa8\x8f\xb0\x7e\x7b\x9c\xc8\xb8\x9c\x26\x79\x17\xad\x0c\xb2\xd1\x28\x97\x0e\x31\xc9\x5c\x54\x54\xc4\xdf\xe3\xe6\x5f\x8e\x40\x00\x04\x9b\x1c\x2a\x16\x38\x6e\x6a\xe1\xe7\x62\x7d\x61\xfb\xcf\x67\xe3\xce\xbb\x87\x43\x8c\xf9\x32\xa2\x2a\x5b\xba\x5c\x14\xcb\xa3\x68\x3d\xeb\xa3\x3a\xea\x44\xc0\x45\xdb\x50\xb0\x41\x54\x42\xe0\x67\xa8\x5c\xd3\x3c\xa5\xc3\x84\x65\x35\x36\xa7\x3b\x35\xc0\x6c\x10\x75\x7a\xe7\xb3\x6c\x6a\x0a\xd6\x21\x2e\x6f\x7f\xa6\x20\x09\x24\x99\xae\x21\xde\x62\xd9\x38\x1b\x73\x99\x50\xb7\x3e\x36\xdf\x27\x29\x34\x68\xe5\x54\x8f\x93\x95\x81\x07\x44\x4d\x8e\x47\x54\xe4\x36\x1e\xdb\xbe\x3a\xf8\xbc\x1c\xc3\x76\xb7\x97\xc7\x1e\xcf\x7d\xee\x44\x14\x51\x8b\xf9\x93\xee\xc8\x67\x0b\xa4\x42\x51\x5f\x6c\x32\xbc\x54\x08\x5e\x33\xea\xf9\xd2\xd7\x21\xca\xf5\x45\xd7\x44\x98\xce\xeb\x1d\xad\x94\xb9\x13\x35\x3e\x25\xd7\xe1\xe2\xdf\xad\xfb\x2f\x94\x1f\x00\x81\x86\x26\x27\x07\x16\xb8\xa7\xfc\x48\xd4\x71\x03\xbb\x4e\xfb\xf3\x9e\x4a\xba\x48\xf0\xb5\xd8\x91\x37\xcb\xed\x0b\x27\xbc\x13\x5a\x3a\xba\x97\xf7\xb6\x60\xa0\x54\x86\xac\x79\x32\x67\x94\x12\xca\x23\x58\xb8\x11\xda\x94\x9a\xaf\x16\xdf\xc0\x9b\xd2\xaa\xf4\xaa\x97\xb4\x81\x80\xdd\xea\x06\xec\xff\xcb\xad\xe7\x02\x8b\x18\xcf\x00\x6d\xf7\x32\xe1\x00\x79\xe6\x85\xec\x2a\xcb\xe7\x74\x11\x9d\x64\xce\x02\x18\xa6\xb0\x9a\x50\x65\xf0\x3e\xa1\xfb\x60\x6a\xc4\x85\xd6\x67\x74\x2b\xa0\x20\x22\xc1\xfc\xee\x8e\x93\xa3\x73\x1c\x35\xef\x28\xc9\x9b\x25\x53\x5a\xf8\x3d\x1c\xf3\x45\x10\xc6\xff\x15\x84\x7e\x23\x58\x82\x77\x3b\xcd\xef\xc9\x68\x47\xcb\x67\xa5\xff\xd2\xa4\x7e\xd7\x13\x9b\x3e\x47\x5e\xaf\x24\x99\xd8\xf6\xd0\x84\x30\x00\xf2\xf8\xb8\xfc\x98\x42\x0a\x3c\x97\x4f\x92\x19\xda\x3c\x13\x87\x9b\x52\xbc\xda\x98\x87\x5c\xcc\x19\x71\x9e\x6d\x94\x17\x91\x92\xf4\xa7\x10\xbb\xc9\xfc\xfa\x04\xbc\x57\x1b\xb6\xbc\xd9\xe4\x65\x6c\x69\x95\x51\x68\xdf\x63\x89\x46\x12\xe1\xc3\x91\x7a\x1b\xa9\x22\x23\xdb\xd9\xe6\xdb\xc9\x99\xf0\x15\x88\x23\x54\xcb\xdd\x44\x93\x62\x18\x75\x51\xc0\xf6\xd6\x27\x64\xcd\x8c\xb3\x5c\xda\x40\x6f\xcb\x6a\x7b\x1b\x25\x70\xb7\x38\x06\x61\x6c\x81\x2e\xd7\xe6\x4a\x0d\xca\xeb\x2e\xf9\xd2\xe5\xae\x60\xcf\xb7\x5c\x67\x79\x45\x96\xba\x1f\xfa\x36\x96\x5d\xdf\x05\xa8\xe4\x70\xfa\xc6\x57\x02\xa2\x04\xa2\xec\x59\x0d\x81\xe2\x8a\xa6\xa7\x25\x57\x31\x42\x3c\x14\x19\x12\x8d\x1f\xf6\xfa\xc6\x92\xe2\xa4\x3a\xda\xc6\xff\x78\x66\x3e\xcd\x97\x04\xb7\x02\x97\x08\x7a\xff\xc8\x48\x7d\xdf\x72\xe9\x89\x4e\x1e\x11\xb9\x09\x21\x27\xde\x3e\xcc\x8b\xc4\x05\xe6\xdc\x53\x78\x42\x50\x01\x5a\x98\x31\x14\x9f\xa8\x74\xa4\xef\x22\x98\x25\x08\x69\xb4\x13\x0e\x4c\x31\xae\xf2\x31\xf6\x38\xb9\x11\x79\x53\x6d\xc2\xf7\x38\x4f\xa3\x9a\x7f\x14\x7b\x68\x50\x44\x4e\x2b\xef\xec\x3a\x79\x39\x43\x80\xad\x99\xaf\x74\x5d\x53\xab\x99\x51\x11\xcf\x08\xdd\x89\x08\x93\x07\x8e\x1a\xc9\xe9\xf8\x79\xa0\x6b\x5c\x5a\xef\xc2\x46\xfd\xab\x4e\x35\xea\x1b\x63\x02\x7e\xc1\xe2\x4a\x13\xea\x15\x16\x0a\x8e\xcc\x80\xbb\xa7\x05\x20\x14\xfd\x26\x31\xf8\x4b\x2a\x42\xe6\xde\x7a\xcc\xdb\xc2\xb0\x62\xcb\xa3\x76\xdf\x6e\x91\x83\x63\x7e\xee\x73\xb6\x36\x95\xeb\x27\x80\xa2\xb9\x3a\x50\xd9\x4c\x84\xbe\xc1\x0d\xa7\xf0\xc4\x0b\xcd\x6f\xeb\x5d\x5a\x26\xf1\x0f\x24\xdd\x13\xd9\xb0\xcb\x4c\x69\xf8\x6a\xbd\x27\xc9\xd6\x8f\xfd\x68\x58\x46\x1f\xdf\x41\xa4\x7b\x97\x48\x1b\x21\xda\xdd\xea\xdd\xc6\x0b\x52\x25\x14\xf7\x22\xb5\xa1\x2e\x88\xc5\x20\x17\xe5\xe6\x00\x94\x20\xda\xb1\x66\xe7\x98\x2d\xbd\xd9\x58\x17\x89\xe4\x81\x28\xf3\x5a\x04\x2a\x3b\xd1\x6e\x91\xc7\x4e\x6d\xca\x79\x3d\x68\xd4\x3b\x8f\x06\xd5\x1c\xbe\x07\x9c\x45\x1a\x9f\xb0\x78\xfa\xaf\x46\x8d\x1d\xd1\xec\x61\xf2\x3f\x95\x7c\xde\x95\x0c\x24\x67\xab\x82\x04\x52\x18\xf5\xeb\x13\xd9\x90\x18\x47\x67\x23\xcf\x97\xf5\x34\x97\xf9\xa5\x70\x72\xce\x2e\x23\x9b\xd1\x6f\x28\x31\x73\xde\x16\x9b\x73\x01\x4f\xf0\x94\xe5\x1b\x9b\xd4\x9a\xd7\xec\x62\x68\x93\x7b\xd5\x32\x59\x38\xec\x5f\xef\xe1\xf9\xbf\x7e\x3e\xcc\xce\x6e\xaf\x6f\xc9\x55\x00\x10\xab\xd5\x45\x8b\x39\x96\x9c\x07\x4f\xeb\x7c\x2e\xdf\x7b\x8c\xb0\x73\x67\x66\xd1\xf9\x7e\xb5\xd2\xfd\x0b\xef\x35\xe5\x8c\xea\x6c\x54\x80\x4e\x9a\x1c\x12\x23\xa0\xae\x67\x37\x8f\xfc\x99\xeb\xa8\x33\x88\x82\x62\x60\xd8\x30\x95\x46\x8a\x3f\x89\xac\xbc\x58\x8f\x1a\xf6\x3f\x1b\x20\x15\x5b\x91\x38\x56\x39\x1f\xd5\xb1\x9a\x26\x8b\x51\xf6\x05\xb5\xfb\xaf\x37\xfd\x49\x11\x21\xe6\x30\x53\x39\x27\xf6\xf8\x1c\x3e\x80\x87\x71\x82\x3b\x51\x55\x9f\x21\x87\x6b\x8d\xa7\xc2\xb4\xbe\x30\xdf\x6e\xe3\xc6\x04\xfd\xdc\x2e\x8d\xcd\xd8\xea\xf1\x2a\x19\xf1\x13\x30\xad\x05\x0f\xda\x6d\x5e\x6b\x0f\xc9\x6d\x51\xf6\xd2\x33\x6e\x23\x5c\x54\x2a\x65\x38\x8e\xef\x39\x5e\x9c\x4e\x4b\xe6\xd0\x72\xe6\xf1\x00\x56\x29\x64\x7b\x06\x1f\x86\x92\xea\x12\x1e\x85\x77\x38\x21\x1c\x07\x3d\xf4\xc3\x6a\xbc\x8b\xe6\xaf\x2f\x19\xf5\x29\xb4\x6b\xd6\x6a\x7e\xb2\x2a\xc3\x80\xf6\xcd\x8b\x09\xf9\x88\xcf\x5d\xad\xf6\xde\x6d\x75\xc6\xef\x56\x83\x60\xb0\xb4\x56\xa8\x4b\x89\x52\xe4\xfa\x38\x74\xc0\x44\x5c\x57\x99\x43\x29\x54\x65\x49\xca\xa0\x21\x87\xc1\x66\xa5\x7b\xe6\x02\xed\x51\xc7\x6f\x59\x22\x1f\x0e\x5a\x32\x07\xfa\xab\x0a\xa4\x80\xef\x0b\x57\x8c\x60\xe4\x3a\xcf\xc3\xcd\xbe\x16\x56\x8b\xa1\xf7\xbf\xe1\xaa\x63\x6b\x77\xf3\x3e\x69\x73\x79\x1f\x75\xe4\x75\xf7\x2a\x09\xe8\xfe\x54\xc4\x0f\xdb\xda\x83\x17\xf5\xd6\xf6\xd8\xda\x56\x62\xc6\xb5\x66\xe9\x64\xbd\x54\xcb\xb1\xb9\xa1\xe5\x7d\x03\xdb\x7e\xb5\x2c\x30\x28\x96\x1f\x1d\x6f\x05\xb2\xe8\x4b\xf9\x09\xbd\xc3\x7b\xff\xd7\x12\x52\xe9\x94\xd9\x75\xc6\x6d\x50\xdd\x83\x42\xdb\x0e\xdf\x0d\xde\x3d\x0d\x4a\x5c\x71\xb9\xae\xcb\xb8\xb0\x5d\x60\x45\x62\xf0\x90\xa6\xf1\xa5\x40\x3f\xe6\xbb\x38\xce\xbb\x8b\xcc\x10\x73\x41\x8b\xc5\x97\xdb\x60\x5e\x85\x97\x88\xd0\xa1\x30\x9c\x95\xfc\x61\x27\x15\x8a\xb0\xd0\xb5\xa1\x2b\x97\xca\x64\x03\x19\x52\x8f\x5d\xc6\x68\x56\x5a\x37\xd8\xcd\x12\x5b\x6a\xe4\xa4\x03\x91\x95\xb9\x92\x70\x3b\x65\x37\x80\xe5\xc7\x18\x6c\x45\xe8\xe8\xe5\x4d\x5d\x31\x56\x5f\x68\x4d\xa7\x13\x90\xd5\x5a\x31\x82\xe3\x2d\x3d\x3e\x7e\xd6\x44\x80\xb5\xc1\xb3\x74\x47\x3c\xd9\xd0\xb0\xca\x13\xab\xb1\x9f\xce\xba\x20\xe9\x4a\x14\x97\x06\xd4\xf7\x3e\x1b\x19\x1f\x2c\xe7\x08\x44\x65\x1b\x79\x01\x4f\xf4\x98\x9f\xeb\x24\xc6\xb9\xc0\xeb\x6b\xb3\xe7\x7f\x7b\xa9\xf6\x30\xbe\x0f\x7c\x5e\x88\x14\x8f\xc0\x95\xe8\x6e\x36\x7e\xbc\x03\x26\xfd\xe2\xd3\x4a\x8a\x29\x26\x8b\xdb\x91\x3c\xf1\x21\x4b\xd7\xeb\xef\xb8\xf4\x1b\x4f\x83\xbe\x5a\xd1\xac\x31\x6c\xfc\xf4\x21\x3b\xfe\xd3\x40\x74\xcd\x30\xa4\x5b\xf0\x78\x68\xa8\xa8\xb0\xf5\x81\xfd\x92\xaf\xd5\x5f\x13\x60\xc5\xeb\xd5\x0a\x7f\x41\x9f\x59\xd2\x61\x3e\xab\x68\x47\xc7\x1b\xcf\x45\xe4\x83\x45\x75\x2d\x9c\x49\x69\xbc\x0a\x97\xfb\x20\x49\x00\xbe\xf2\x2a\x91\x9a\x5f\x6a\x5a\x74\x6c\x4f\xa7\xb4\xe5\xa6\xa9\x11\x8a\xbf\xef\x76\x2d\xa1\xb6\x1c\x68\xcb\x91\x6e\x2c\xab\xea\xaf\xaf\x05\xb7\xff\x05\xf4\x36\x74\x81\x61\xb0\xa0\xc6\xda\xa5\xeb\xad\x84\x78\xc0\xd7\xd0\x54\x0d\xaf\x9f\x7f\xc2\xdf\x65\xd3\x3d\xea\xd9\xcc\x3b\x81\x89\x7d\xd7\x7c\x3f\xa4\xb1\x65\x36\x6c\x93\x2c\x7c\xa0\x92\xeb\xcd\xf2\x7a\xdf\x22\xbf\x3a\xd0\x81\x3b\x23\xdf\x78\xdf\x11\xa5\xe5\xfd\xb4\xfc\x59\xd2\xfb\xe6\xac\xc6\x1a\x39\x4d\xee\x5a\x15\x75\x79\xe3\x72\xee\xc2\x24\x13\x17\x7d\xc1\x71\x16\xec\x85\xa1\x77\xe1\xa2\x40\xef\xb3\xc3\x58\xb3\xa5\xb6\x8c\xa9\xbd\x37\xf2\x03\x94\x6f\x90\xfa\xea\x7f\x0f\xfc\x16\x70\x30\xd4\xb2\x92\xac\xee\xe5\x5b\x1b\x42\x14\x06\x55\xb5\x39\x16\xea\x21\xf6\x1b\x46\xb4\x79\x6c\x12\x4b\xac\x26\xdb\x3b\x55\xb6\x9a\x6e\x20\x28\x3a\x39\xce\xd7\x7c\x45\x01\xf3\x2c\x14\x10\xe5\xef\xa2\xdd\x19\x38\x54\x3e\xca\xca\x3a\x7b\x1e\x30\x0f\x6b\x90\xbd\x9b\xeb\xe6\x01\x57\x40\x92\x2a\x1c\xb7\xcd\xfe\x6c\x96\xfb\x49\xd5\xc9\x3a\x3e\xef\x59\x6e\x0c\x8f\x66\x85\xd1\x90\xd6\xc3\xf7\xca\x15\xb6\x76\x53\x74\x32\x5e\x1f\xe6\xf2\x67\x1d\xdc\x68\x4b\x80\x0e\x0d\x87\xe2\xb2\x71\xf0\x7f\xbc\xf9\x8a\x50\xf0\xbd\xa6\x3c\xd3\xf8\xd9\x4c\xe1\x6b\x86\x02\x5f\x14\xf8\x6e\xab\x93\xc5\x08\xe5\xf6\xfe\x85\x59\xff\xba\xd3\x02\x20\xe4\x50\xc8\xd9\x00\xcc\x42\x16\x88\xaf\xbd\x8b\xc6\xc6\x28\xc7\x38\xff\x6d\xbb\x70\x90\xb1\x60\x78\x99\x0c\xb7\x6b\x4d\x9c\x5f\x81\xa6\xc3\x8a\x2c\x05\x96\xe9\xbc\xae\x66\x2d\x6d\x41\x73\x4f\x11\x76\xe5\x9f\xe4\xd3\x31\x69\xef\x28\xa0\x39\xbe\x95\x3e\x45\x6c\xc3\x24\x18\xb1\x70\x2a\x9c\x05\x44\xd9\x30\xb0\xbb\xf0\xc5\xfd\xe6\x1c\x9b\x36\x8f\x73\x4f\xcc\x69\xfc\x3e\x4f\x11\x2b\x3a\x90\x4c\x51\xd2\xfa\xd8\xae\x1d\xbc\x04\xd9\x9e\xeb\x6d\xaf\x70\xe7\xf1\xdb\x07\x5a\x1e\xf8\x1f\x38\x0f\x96\x19\x98\x03\x92\x86\xf9\x50\x7a\x6e\x47\x84\xba\xb7\x99\x76\xfb\xb0\x00\x51\x85\x0b\xa3\x98\xc4\x23\xa9\x7a\x2b\x06\x9c\x8a\x69\x54\xb5\xd8\xa2\x3d\x45\x0c\xdc\xf6\x8d\xca\x13\x6c\x3e\xc3\xc6\xf9\x38\xa2\xbf\x30\xeb\x5f\xd7\x75\x00\x84\xdc\x8f\x1c\xcc\x6e\xca\x94\x41\xeb\x62\xd2\x56\xbe\x2b\x82\x2e\x19\xaa\x9e\x3e\x5a\x76\xfd\xf0\x3e\xcb\xee\x3a\x78\xb8\x31\x05\xc7\xa7\x68\xf9\xea\x23\x98\xd7\xb3\x47\x0e\x33\x80\x9c\xfe\x79\x6f\x46\xeb\x74\xc2\x40\x7a\xbf\x16\x1f\x6b\x11\x0f\x96\xde\x9e\xf7\x74\xe6\xd5\x1c\x24\x04\x07\x10\xf5\xb1\x0f\xf2\xec\x7a\x60\x77\xd9\xb2\x52\xb8\xb2\x92\x12\xe4\xef\x43\x9c\xfd\x41\x2d\xe0\xf8\x81\xb3\xad\x11\x4b\xa9\x97\x10\xec\x70\xcc\x21\xf2\xb3\x82\x2b\x8f\x49\x14\xbd\xa6\x70\x89\x65\xe6\x58\xe0\x87\x68\x9e\x8a\x12\xaa\x52\x70\x54\xf0\xc4\x34\xe9\x17\xb5\xc1\xbf\x1e\xc2\xbf\x30\x43\x80\x38\x1c\x1c\x3b\x60\x99\xb4\xa2\xa7\xc1\x5d\xca\x6d\x40\xae\xb5\x27\x3f\x41\x8e\x9d\x3a\x34\x92\xc4\xc0\xb4\xdc\x25\xba\xd1\xef\x19\xe7\xd6\xbd\xa0\x12\x40\x07\xa8\xc4\x9c\x49\xd8\x6c\x89\x1c\x01\xc2\x31\x0b\x45\xf9\xfe\x8c\x02\x94\x99\x55\xbd\x13\xf7\x77\xc3\xe5\xeb\x2a\xab\x91\xfc\xa0\xba\x2a\x14\xf4\x53\x66\x0a\x72\x3d\xe8\x61\x4d\x3f\xe3\x82\xa6\x92\x04\x96\x55\x59\x46\x99\x24\x7c\x9a\xb9\x30\x7f\xd7\xb7\x8c\x82\x4d\x0b\x08\xca\xc9\xf9\x1b\x08\xda\x33\xee\xb2\x86\xd0\x5b\x6e\xa8\x0b\x27\xd7\xed\xa7\x69\xa5\x79\xd0\x13\x42\xc7\xc9\x16\x28\x30\xa8\xfe\x2e\xda\xbf\x70\x4b\x00\x44\x04\xea\x3f\xa6\xfd\xf4\xf1\x28\xb6\x8e\x1a\x16\xfe\x29\x78\x84\x3f\x2e\x4b\xec\x98\x4a\x87\x95\xc0\x77\x21\x06\x9b\x58\x59\x88\x54\x14\x71\x08\x86\xfe\xce\x2e\x1a\x26\xb2\xbe\xb7\xa8\x05\x8e\xb9\xb6\x6a\xe5\x3b\x49\xa7\xa4\x6d\xf9\x39\x5b\x7a\xe0\x50\x5e\x9a\xfc\x08\xb5\xd6\x05\xf5\xe5\x3f\xf9\x55\x55\x8c\x67\xc1\x84\xcb\xfb\xc6\xbd\x8a\x80\xd4\xe4\x96\xd5\xf0\xe0\xc7\xf8\xb2\xe5\x63\xa2\x12\x2e\x96\x93\x02\x88\xb8\x91\xed\xdc\xfb\xb6\x87\x4c\xb6\xb5\xe3\x08\x4e\x0c\x3f\x08\x94\xfe\x5c\x49\x47\x47\x63\xc5\x49\xd8\x0a\xf2\xe7\xae\xf3\x35\x4c\xfa\x6b\xda\xbf\xd0\x4b\x00\xc4\x50\xec\x3f\x61\xa4\x67\x90\xd7\xaa\x8b\x03\x8b\x2c\xf5\x33\xbe\x41\xc7\xf9\xcc\x1d\xd9\x75\x57\xe9\x55\x99\xb8\xb4\x71\x87\x15\x72\x99\xfb\x2a\x4d\x80\x12\x0f\x01\xa6\x11\x05\x93\x06\xc6\x66\x05\x51\xd7\xeb\xd3\xad\xca\x6a\x3c\xc5\x02\xe4\x9c\x06\x69\x77\xb4\x88\x68\x9b\xfc\x6c\x7b\x80\xa8\xe2\x84\x21\xc4\x49\x4d\x49\x8c\xfc\x75\xe8\xca\xf8\x37\xa9\xb2\x76\xa1\x9f\x06\x87\xd6\xf8\x5b\x37\x1a\x17\x30\xd2\x78\x3c\xbd\x80\xa8\x8e\x69\xbb\xa4\xa2\xb1\x62\xd1\x4f\x26\x4d\xd3\x8f\xe6\x1d\xc3\x05\x05\x21\xf3\xed\xb5\x72\x1f\x7f\xc1\x0c\xd1\x3e\x63\xd7\x79\xfb\xd7\xb4\x7f\xa1\xad\xff\xff\x57\xf3\x07\x4d\x23\xc7\x65\xce\xf0\xc9\x90\x28\xc8\x62\x81\xed\xb5\x55\x33\x50\x6d\xfa\x9a\xd8\x2b\x13\x4c\x83\xbc\x4e\xe1\xa1\x43\x64\x13\xde\x0a\x28\x01\xdb\x40\xc2\x64\x91\x66\x14\xf2\xdb\xe0\xeb\x12\xd7\xf3\xc7\x37\x89\x3e\x61\x8e\x97\xd9\x02\x63\xec\xee\x6f\xd2\x64\xa4\x17\x5c\xc0\xc2\x44\x34\x49\x8b\x82\x52\xab\x0f\x0e\xcf\x37\x7f\x7b\x6a\x7a\x09\x76\x4e\xb1\x14\x8b\xd2\x40\x93\xa2\xdc\x14\x22\xf7\x4b\x7e\x00\xe9\xfb\x51\xda\x12\x7f\x2c\xdd\xcd\xf8\x14\xd4\x66\x9a\xd1\x27\x79\x7f\x5a\xad\x7a\xd8\xfe\x1c\xe9\xa4\xb2\xfb\x8a\x83\xe4\x6e\x4a\x82\xe9\xc2\x1f\xe6\x7f\x87\xce\x02\xc4\x3a\xfd\x01\xc3\x24\x4c\xe1\x4d\x60\x68\xb0\x96\x77\x5f\x0d\x6a\xbb\xfe\xb1\xd0\xfb\xf1\xa5\x8b\xe4\x83\xd5\x0f\x5e\xa7\xcf\x46\x4e\x1e\xd1\xd9\x20\x7b\x0f\x57\x97\x3a\xfc\x69\x13\x85\x8a\x8f\x96\x9f\x6a\x4a\xad\x48\x53\x05\x8a\xd0\x90\x2d\xb4\xb7\x9d\x82\x28\x3d\x4c\x99\xea\xa8\x3c\xd8\xc8\xd8\xd8\x6f\xef\x03\x54\x22\x7c\x56\xa8\x7a\xc6\xe8\xaa\x1f\x8d\x90\x43\x6f\x63\x92\x2c\x22\x16\xef\x3e\x72\xe7\x3a\xff\x19\x50\xdb\x2e\xa2\xf0\x83\xd4\x98\xb0\x45\x13\xae\x29\x4d\xee\xd5\xab\x10\xdf\x9a\x1c\xe4\x0a\x66\x18\x8d\xc6\x26\xd6\x3f\x69\xf5\x70\x26\x60\xe8\xf1\x5c\x36\x5a\x28\xd8\x02\x66\xbf\x6c\xb9\x21\xc5\xab\xa5\x15\x0d\x5f\xbc\x1a\x16\x33\xc0\x7c\x50\x13\x5e\x1f\x31\x80\x97\xd4\xeb\xef\x75\xf2\xaf\x1b\x3a\x00\x22\x02\x2b\x82\x08\x5c\x27\x2d\x82\x2f\x0f\xe0\x4e\x5e\xba\x73\x5e\x51\xbd\x39\x6c\x41\x31\xe0\xae\x60\x7c\xbb\x37\x75\xa5\xa6\x5d\xa4\xe5\x03\xcb\xf7\x05\x0c\xc2\x72\x84\x9c\x2e\xa2\x3c\x8f\xeb\xe3\x4f\xb8\xa4\xe3\xb7\xf1\xab\x8a\x33\xa3\x6f\x3a\x84\x0c\x7d\xf2\x43\x58\x87\x7f\x86\x85\x29\x08\xba\xe2\x70\x76\x76\xf8\xae\x98\xb6\x1d\x66\x5c\x90\x70\x85\x67\x3f\xb5\x92\xeb\x35\xf5\x4b\x60\x90\x9c\xb6\x67\x67\x47\x26\x4e\x69\x00\x51\x79\x69\xea\xc9\xef\xe6\x7b\xf6\x16\x7a\xfb\x22\x79\x83\x73\xef\xa0\xe4\x3a\x16\xb4\x66\x28\x86\xc8\x51\xeb\x17\xd0\xe4\x93\xc0\x8d\x50\xc6\x7a\xc4\x5a\xa1\x7c\xd7\xa3\xd0\xd6\x93\xf3\xa1\x79\x0c\xc5\xfa\x4f\xf4\xfc\xdd\xb9\x25\x34\x7a\xc1\xc0\x4b\x05\xbe\x3c\xb1\xbf\x7b\xfc\x9f\xe0\x03\x42\x1e\x04\x05\x0d\x6c\x05\xe5\xf5\x5e\x8e\x93\x84\xa4\x25\x4e\x9a\x05\x92\xcf\x22\x09\xd0\x30\x3d\x3f\xa8\xe8\xb4\x4d\xde\xff\xd8\xe0\x47\x28\xff\xf3\x05\x64\x67\xa2\xd8\xce\xed\x94\x1e\xe9\x24\x8b\x9d\x33\xb5\x7e\x13\x41\x4a\xf2\xd1\xfd\x85\xdc\xb5\x67\x58\x91\xa0\xb6\x7b\xbf\xf3\x2b\x26\x30\xaa\x6a\x89\xb1\x81\xd0\x01\x21\xc8\x9c\xf8\xf8\x30\x14\x18\x3d\xbb\x2a\x7c\xb6\xf7\xfa\xdb\x97\x8c\xc9\x4a\x3f\x36\xd9\x68\xcb\x67\x60\x84\xce\xd2\x33\xe4\xfe\x02\x31\xe3\xbe\x1e\x35\xcf\xf7\xab\x4e\x0e\x66\x83\x95\x42\x1a\x6a\x83\xf5\xb6\xa1\xa6\x1d\xf7\x61\x8f\x35\xd4\x5f\xd3\xfe\x85\x6b\x02\x20\xd9\x50\x88\x60\x1d\x34\x72\xbe\x58\xdb\xd2\x2f\xd1\xba\x6f\x9e\x16\xd0\x4d\x9f\xba\xd6\xa7\x15\x43\xc2\x8f\x51\x9f\x9d\x89\xcd\x97\xb1\x78\xd6\x84\x83\x51\x2f\xe3\x98\x6e\x8b\x84\xfc\x2a\x7c\xca\xb2\x7e\xc3\xaa\x52\x15\x84\xf5\x98\x68\xc9\x3c\x2a\xdb\x08\x6c\x91\xec\xa1\xc6\x3a\x59\x30\x21\x4d\x30\x3d\x92\x60\x4e\x5c\xfc\x2d\x13\x35\x9e\x13\x35\xec\x37\x3a\x47\x76\xae\x9b\x33\x7f\x48\x9b\x7c\x34\x4a\xf4\x2b\xc6\x03\x30\xcc\xbf\x82\xcc\x75\xbc\xd9\xce\x4a\x4d\xba\xfb\xf5\xcf\x5c\xef\x47\xe9\x98\x9b\x91\x93\x7a\xd7\x59\x59\x22\xc4\x03\xcc\x6f\x2f\x1e\x06\xfe\x9a\xf6\x4f\x1c\x06\x41\x13\xf9\xcf\xa1\x4b\x86\x94\xcb\x8c\x48\xaf\x2c\xc4\xc2\xbb\xc4\x13\x35\x22\xd4\x26\x4a\x10\xce\xca\x9a\xa0\x19\xb5\x62\x20\x8b\x63\xe0\x3f\x1e\x02\x28\x21\x22\x3a\xd6\x92\x5b\x12\x8b\x12\xcb\xf1\xf2\xee\x15\xa3\xdd\x37\xd4\xc6\x2f\x93\xbf\xac\x3c\x96\xcf\x27\xe7\x91\xd2\xdf\xe9\x43\x40\xd0\x12\x14\x15\x1a\x2e\x36\xc0\x8c\xa6\xb0\x45\x03\xb5\x96\xed\xeb\x00\x47\x1a\x2f\x3f\x35\xf7\xb6\x16\x3f\x47\x1a\x73\xbb\xd7\x01\x10\x5d\xac\xb2\x58\xda\xa6\xea\x4f\x85\xfd\x49\x09\x3b\xb4\xc1\x1f\x54\xf0\x4e\xfd\xcf\x99\xfb\x79\x89\x1e\x3d\xb5\x1b\x9c\x07\x4c\xc6\xc5\xe8\xff\x74\xf8\x6f\x22\xd4\x7c\x79\x9a\x28\x4d\xe9\xaa\xa4\x97\xfe\x36\xc1\x38\xf3\x50\xc4\xe8\x84\x43\xfd\x95\x52\x6d\x1c\x16\x6b\x18\xd1\xaa\x7b\x00\x64\xb4\xe3\xf1\x31\x85\x04\x60\xfd\x91\xc1\x62\x20\x8d\xdc\x19\x37\x15\x08\x8a\xeb\x62\x09\x9c\xc1\xe0\xfc\xae\xce\x5e\x5f\xd1\xae\xb5\xcb\x12\x99\x9d\x8a\x0f\x24\x02\xc8\x3b\x08\x57\x61\x69\x1c\x3f\x5f\xde\x1e\x7f\x6e\x37\x58\x1a\xb6\x6a\x51\x44\xf6\x99\x92\x11\x2f\xaa\xd8\x40\x4a\xe8\xb2\x2e\xf5\x49\x72\x7b\x9f\xf5\x4d\x74\x81\xea\x6f\xbc\xdb\xb9\x68\x5e\x07\xb5\x68\x48\x19\x97\x95\x55\x4b\x89\xec\x90\x74\xbf\x9c\xaa\x98\xc4\x15\xd8\x3a\x19\xb7\xb2\x6c\x5b\xe9\x25\x91\x52\xd2\xf3\x49\xfb\xfe\x7a\xee\xd4\x57\xd2\x4c\x11\x0b\x0e\xfb\x5a\x19\x57\x04\x06\xf4\x53\x61\x80\xab\x21\x5e\xd7\x72\x55\x95\x38\x52\x89\xa9\xd9\x7e\xe9\xad\x90\xa5\xcb\x07\x35\x11\xfc\x60\xd2\x9b\x20\x6c\x9d\x6e\x3f\x8a\x46\x0c\x82\xf2\xda\xda\x1a\x2e\x8d\xed\xe7\xef\x68\x63\x51\xe0\x70\xa3\x97\x34\x9e\x47\x2e\x67\xf6\x2b\x40\x96\xa1\x10\x6b\xdf\xa8\x15\xbe\x16\x7e\x9a\x59\xc7\x9f\xae\xf3\x7d\x97\xf7\xd9\x9f\x4f\x13\x9c\x7e\xaa\x6e\x8e\x6d\x75\xfe\x14\xdf\x85\x58\x6d\xe8\x1d\xe3\xf6\xed\x1d\x85\x72\x80\x39\x2b\xe3\xc1\x48\x8f\x48\xf0\xe7\xaf\x60\xf0\x20\x97\xde\x77\x8a\x03\xcd\xf2\xb6\x8f\x70\x0e\x78\xbf\xbe\x30\x40\x53\x1b\xcf\x00\x65\x0c\x4d\x16\x53\x35\x9f\xbb\x04\x9f\xa7\xb1\xe9\xec\x8a\x4f\xc3\x4d\x7f\x3a\xea\x7b\x3c\x19\x9e\xa7\x0d\x32\x85\x0f\x64\xca\x23\xaa\x01\x9c\x32\x3c\xd7\x6c\x97\x25\x3e\x81\x97\x88\x6c\xdf\x08\xbd\xbc\xb3\xdc\x33\xc5\x0d\x96\xc8\xbb\x92\x6d\xee\xa6\xc5\x8e\xd6\x55\xf9\x80\xc6\x51\xf8\x47\xd0\xe9\xb7\xc6\x4d\x3f\x9a\x0a\xf1\x35\x08\xd2\x4e\xc2\x36\xb7\x66\x2e\x05\xe1\xa0\x95\x55\x37\x18\xea\x59\xd0\xc3\x00\xef\xd1\x73\x1e\x81\x32\x43\xe4\xf4\x81\x90\xa8\x55\x31\xea\xfb\xf0\x87\x5d\xaf\x6c\xbc\x8c\x6d\xdf\xc0\x3e\x67\xf3\x3e\xda\x25\xd6\x3b\xe0\xf3\x66\x96\x31\xcd\xf4\x0a\x63\x47\xee\x46\xe8\xdc\x17\xa7\x48\x7f\xfa\x02\x38\x79\x4f\xcc\xe1\xc9\x98\xca\x96\x58\x99\x0b\x5b\xce\x9f\x06\x75\xf7\x47\x5d\xc2\x0b\xd8\x72\x73\x12\x90\xc7\xd9\x6f\xbb\xd7\x48\x68\x75\x3e\x8b\xfc\x26\x1a\x22\x74\xc4\xbc\xe8\xcb\x48\x0d\x94\x85\x1d\x79\x5f\x95\x85\x84\xae\xfe\x1e\x20\xa9\x3a\x2a\x94\xcc\x36\x0d\xe0\xbf\x70\x7d\xbe\xb7\x4d\x58\xcc\x16\xf8\x92\x92\x6b\xf1\x0c\x98\xd2\xc8\xa8\x25\x2b\xf7\x9c\xa8\x1b\x83\x24\x45\x92\xab\x4d\x6e\xa1\x87\xa3\x17\xf0\xe8\x65\xe1\x1f\x4c\x9b\xca\xca\xa8\x1b\x97\xcd\x9e\x06\x5d\xd3\xa2\x97\xe7\xb5\xff\x93\x4e\x8e\x6b\x37\xf0\x82\xc7\xec\xae\x93\xcc\x3e\xb8\x61\x44\x59\xf0\xf3\xc3\x28\x09\x5f\x4f\x4a\x2a\x60\x13\x77\x1e\x35\x99\x4a\x99\x3b\x4d\x93\x8f\x39\x8c\x93\xa3\x44\xab\x32\x5c\x53\x63\x13\x6e\x8b\x7d\x61\x28\xab\x08\xdf\xaa\x1e\xc0\xd6\x9f\x28\x58\x82\xea\x9d\xc2\x46\x6d\xa2\x01\xc5\xa3\x58\x5c\x89\xb5\x35\x16\x16\x2f\xef\x68\x4b\x50\x35\x5f\x50\xea\x70\x45\x57\xf9\x24\x59\x10\xd7\xf3\x8b\x4b\x98\x42\xdc\x25\x65\x16\xae\x60\x4f\x66\x54\xee\x32\x26\xcc\xb1\xcf\x1b\x42\x15\x6c\x69\x8b\x41\xfb\x8b\xea\x3f\xac\x27\x4b\x89\xa4\x6c\xe8\xf7\x2a\x89\xfb\xe4\x1c\xe8\x6f\xc5\x21\xd2\x18\x35\xc4\xa6\x0b\x32\x8b\x62\x72\xa5\x04\x5f\xdf\xe7\x03\x9a\x0a\xbc\x35\x74\x68\xb6\x78\x26\x4e\x46\xd0\x98\x9e\xf9\xe1\x87\xab\x6d\x98\xfb\x62\xe6\x2b\x49\x63\x01\x9f\xce\xc7\x69\xa3\x2a\x80\x00\x50\xf4\x99\xce\x33\x2e\x44\x9a\x5f\xdf\x9a\x84\x3a\xdb\x79\xdf\x28\x7e\x30\xa5\xe2\x6d\x81\xa6\xe3\x3e\xb1\xa5\x14\x1f\x12\x1a\x74\x7e\x92\xf4\x4a\xaa\x93\xae\xb4\x95\x2a\x38\x4e\x8e\xaf\x7f\x55\x96\xd1\xec\xfc\xe2\xdb\xd9\x4f\x92\x0c\xda\x6f\x05\x01\x5f\xd1\x3f\xba\xfc\x87\x27\x5b\x44\x46\x4d\xe8\xb0\x4f\x01\xa6\x96\x93\xef\x54\x3b\xd8\xe8\xbb\xc8\xe4\x16\x69\x86\x44\xaa\xce\x24\x13\xa9\xfc\xdd\x59\xc7\xfa\x93\xa6\x21\x2d\x91\x08\x0e\x97\xfb\xd6\x4d\xe2\xa4\x5f\x20\x9a\x3b\x31\x31\xd3\x76\xd4\x5f\x78\x23\xf6\xac\x77\xda\x9e\xad\xd1\xf2\x30\x00\x24\x26\xbe\x38\x2b\x21\xaa\xc5\x44\x82\x41\xc1\xe5\x48\x6f\x18\x5a\xdb\xde\x2b\xa2\xfb\x67\x97\x9b\x19\xb4\x9b\x10\xba\x45\xc3\x01\xe9\x52\xbf\x03\xb9\xb3\xab\x5e\x21\x20\xa6\x93\x10\x31\x4e\xc8\x2a\xd6\xab\x93\x62\x60\xae\xa3\x99\xfb\xd2\xde\x28\x1d\xba\x06\xb3\x77\x80\x5d\x28\xf7\x2e\x66\x86\x39\x1e\x86\x1a\xb9\x88\x56\x03\x60\x62\xdb\x32\xef\xaa\x76\xc7\x13\xdc\x65\xde\x7a\x88\x4f\xa7\xc2\x49\x01\xd9\x7a\x52\x02\x6f\x1a\x13\x58\x86\x1a\x1a\xbb\x25\xab\x69\xf6\xb3\x64\xa0\x8f\xae\x90\xf5\x76\x8b\xfc\x16\x85\x2d\x9f\x57\x33\xc5\xd1\x81\x31\xa6\x17\x6e\xa8\x4b\x89\xf1\x23\xd9\x33\x79\xa8\x67\xa6\xfc\x8a\x0e\xf2\xaa\xfd\x26\x17\x3f\x08\x7c\xf6\xcd\xcf\xf2\xdb\x99\xa5\x9f\x06\xb5\x36\xed\xdf\x2a\x52\x5f\xa9\xb2\xac\x28\x9e\xd1\x2e\x86\x0a\x7b\xb6\x4a\x2f\x66\x61\x1e\xce\x24\xda\xa7\x5e\xf6\x38\xed\x80\x03\x2c\xa9\xd5\x12\x34\xe9\xed\x15\x83\x74\xe3\x57\x8c\x22\x61\x92\xf3\x61\xb9\x1c\xb7\xd3\xfc\xde\xf4\xd8\x0a\x14\xbc\xbb\x2f\x1e\x11\xab\x4f\x83\x7a\x37\xed\x44\x40\x54\xa9\x6e\x14\xbe\x9c\x4f\xdd\x05\x2d\x44\x0e\xad\x13\xb0\x64\x49\x6f\xa6\x6b\xcf\x63\x3a\x3f\x43\xc6\xbd\x7f\x92\x7c\x18\xbc\xfa\x19\xb8\xf8\x23\xda\xda\x1e\x12\x7a\x92\xc2\x84\xfe\x15\xf3\xed\xdc\x09\x06\xf3\xf7\xc7\x4f\x2c\x05\xfd\xb8\x6e\x60\x6f\xbf\xf2\x35\xaa\x63\xcc\x5a\x45\xac\xe5\x9c\xa0\xef\xcf\x57\x9c\x92\x6e\xf4\x5f\x06\x2d\x59\xe0\xfa\xf5\x79\xd5\xb3\x32\xea\x20\x01\xd4\x60\x87\x8c\xdb\x78\x69\x8f\x89\x55\x65\x94\x62\xfd\x92\xce\xa4\x6c\x93\xf1\x7d\x6a\x32\x49\x09\xcc\xfb\x89\x81\xbd\x59\x55\xdf\xd1\x81\x41\x11\x17\xaa\x57\x50\x7e\xcd\x76\x7a\xba\x37\x35\x7d\xd4\x5e\x8f\x76\x5b\x60\xf7\x40\x5c\x41\x16\xa6\xd8\xe5\x2f\x0a\x70\xde\x53\x06\x2a\x22\x71\x33\x5e\x77\x98\x12\xc1\xca\x0d\x8e\x4f\x72\xa8\x4b\x58\x4b\xff\xc1\x86\xd7\xb2\x47\x36\xfc\x66\xce\x55\xad\xfb\xd9\x17\x06\xdc\x7c\xab\x12\x95\xc7\xf0\x47\x8d\x57\x1f\x91\xbb\x99\x65\xd5\xf3\x8a\x5a\x5b\x98\x6a\xdf\xa7\xf1\xa3\x58\xd9\xc3\xbf\xe0\x7d\xab\x5f\x02\x64\xd3\xcc\x49\x2d\x87\x9a\xc1\x3e\x48\x44\x21\x99\x1b\x17\x9c\x6a\xf5\x3d\xfa\x87\x89\x91\xda\xcb\x17\xa1\xb7\x9c\xbf\xc8\x3a\x00\xb9\xcf\xf1\x28\xae\x7c\x9f\x79\x69\x51\x87\xeb\x5d\x5b\xc9\x56\xf5\x26\xb5\xfb\x3a\x9d\xdc\x12\x0c\x3a\xd9\x4f\xf8\xb8\x6e\x1b\x86\x33\x83\xc7\x29\x5a\xbd\xe8\xa4\xd5\x9d\x61\x82\xbc\xcc\x6b\xa7\xac\xbd\x4a\x96\x4b\xc1\x64\xdd\x94\x94\xf4\x57\x35\x94\x72\xa8\x7b\x40\xae\x98\xff\x1d\x06\x35\x07\xae\xb2\x0a\x99\xdf\xd8\x47\x4b\x77\xf6\xc4\xd4\x42\x39\xd6\x2f\x56\xef\x33\xa1\x43\x7a\x91\xc4\x52\x5e\x6f\x83\x45\x69\xb5\xb0\x89\xef\xa4\x3c\xd0\xb2\xdc\x85\x26\x8d\x1b\xa2\xd6\xc3\x06\xfc\x7d\xde\xeb\x1f\xee\x77\x0a\x38\xbe\x4a\x74\x5c\x04\xf6\x69\x5f\x6a\x39\x03\x8e\x1d\xd9\x23\xba\x40\x04\xfc\xc5\x2e\xb5\x1d\xd1\x85\x48\x87\x02\x49\x7e\x50\x7b\xdb\x94\x76\x0f\xdb\x95\x19\x60\x13\x05\x13\x4f\xe6\xad\x21\xcd\xa7\xaf\xa8\x5a\x8f\xa2\x57\xfd\x74\x59\xda\xda\x76\x68\x13\x6c\x58\x47\xd5\x75\x75\xe1\x11\xf5\x40\xa3\x90\x7e\x61\x28\x64\x7d\x9c\x6f\xae\x8f\xf0\x8d\x79\x18\x53\x54\xb1\x2d\xbf\xf9\xb0\xa7\xe8\x18\xf2\xa6\x37\x31\xf3\x9c\xbc\x79\x00\x0a\xb9\xa5\xee\xe5\xd6\x7b\x7d\xed\xf7\x7b\xa5\xd1\x57\x28\x3c\xa4\xda\x94\xf6\xbd\xf6\x78\x01\xc1\x05\xc9\xa9\x97\xe1\x7b\x7f\x8e\xf2\xc1\x85\xa2\x6c\xe2\x61\xd4\xfd\x36\xd1\x9e\xc0\xa8\xa5\x67\x36\x6b\x49\xe3\x5c\x1c\x78\xa9\x40\x61\x3b\xec\x1a\x71\xdb\x84\xa0\x97\x40\x06\x88\x52\xcf\x5a\xea\xee\xad\x0c\x90\xad\x18\xbe\x2e\xcd\x95\x0f\x77\xd8\x18\x7e\x11\x4e\x46\xcb\xde\x1c\x68\x93\xf0\xb2\x8d\xd5\x39\x11\x68\x02\x39\xbc\x35\x47\x62\x3d\x48\x11\x96\x37\xcf\x4d\x74\xc5\x16\xff\x82\x1f\x82\xf8\x82\x9b\x25\x2c\xe9\x20\xad\xc6\x70\x70\x06\x38\xd0\xfc\x42\x44\x0f\x8f\x1c\xef\xae\xb3\x9a\xd8\x2e\xa9\xee\x84\x7b\x5f\x60\xc9\x6f\x32\xf2\x77\x05\xff\xee\xc1\x5b\x75\x73\xfb\xba\x01\xaa\x8a\xf2\xe2\xb7\x4c\x70\x9e\xaa\x98\xfd\x7e\x03\xa9\xba\x9d\x44\x8b\xf8\xb3\xfb\x19\xdc\x19\xcb\xb1\x00\xd9\xd1\xa5\x66\x68\x4e\x13\xc0\x27\xc3\xf0\x3b\x2b\xc2\xe3\x18\xdb\xb0\x91\x9e\x34\x90\x9f\xfd\xad\x61\x42\xee\x38\xd9\xda\x09\xb7\xd2\xd9\xed\x4d\x20\x40\x00\x72\xcf\xbf\x33\xba\x8e\xf2\x22\xd2\xd7\xf6\x7e\x1e\xa0\xb1\xf7\x6a\x69\xe1\xfa\x5c\x8a\x38\x2e\x28\x31\x4c\xe2\x4b\x87\x31\x8e\x85\x36\x50\xe8\x38\xe4\xc3\x8f\x86\x0b\x33\xe7\xd5\xd6\x80\x43\x40\xe0\x27\xfa\xe1\xac\x7b\x61\x8b\x8a\xfa\x1d\xb6\x95\x89\x4f\x01\x35\x11\x77\x14\x80\x90\xfc\x95\x6e\x59\x7b\x62\x69\x03\xd0\x3d\xe2\x5c\xd9\x7e\x07\x46\xf8\x56\x64\xc8\x3f\xbc\x14\x7a\x59\x78\xf4\xab\x7f\x98\x3b\xf5\x2f\xfb\xcb\xbf\x90\x4c\x80\x38\x3e\x0c\xc8\x61\xd5\xcb\xc4\xc9\x52\x2b\xb0\x62\xde\x77\xaf\x3f\xf7\x39\xf0\x5d\x1b\x59\x44\xa1\x93\x29\x21\x54\x13\xee\x25\x31\xb6\x38\x32\x25\xf8\x02\xef\xb7\x6f\x03\xcb\x7c\xa8\x1c\x7b\xb5\x87\x7a\x69\x63\x22\x92\xbd\x89\x80\xc8\x6d\xbd\x67\xf0\x10\x02\xd3\x76\xe4\xeb\x1e\xd7\x0c\x56\x65\xdc\xfe\x1c\xf3\x98\x86\xd9\x39\x64\x8f\x4b\xae\x6f\x8f\xfe\xc2\x15\x7e\x66\xc4\x71\xb9\x54\x99\xb9\x38\x2f\x35\xf2\x4a\x02\x0a\x2c\x63\xb9\x8e\xc4\x41\x66\x15\x58\x52\x69\x0d\x4f\xcc\xc3\xce\xd8\xeb\x91\xeb\x25\x98\xab\x82\xd8\x6c\x6f\x25\x6d\x3a\xdb\x89\x29\x82\xa1\x04\x36\xd4\xf4\x5d\x68\xad\x2f\x38\xd9\x71\x14\xce\xb6\x5b\x73\x11\xce\x5e\xc4\x9c\xab\x41\xd2\x69\x25\x8e\x87\xb0\xc5\x76\xcb\x7f\x7b\x21\xfd\xeb\x46\x0d\x80\x50\x42\x51\xa3\x00\xbd\x90\xdc\xbe\xec\xab\x55\x21\x8c\x12\xcf\x45\x79\xac\x27\xd5\xe7\xa7\x91\x34\x85\x9b\x16\x43\x35\x2e\x73\xb2\x71\x69\x91\x31\xf1\xd0\x03\x4a\xe0\x27\x76\x5a\xc2\x87\x2c\x90\x74\x74\xed\x4c\x96\x37\x98\xd3\xc9\x77\x06\xb4\x29\x3b\x65\x23\x94\x0a\x0d\x7b\xad\x97\x93\xf7\x03\xa2\xb5\x96\xc3\x9f\x0d\xdf\x5b\x74\x13\x3b\xdb\x2e\x22\xbb\xea\x70\x26\x65\x04\xd5\xe9\x8b\x5a\xa3\x48\x1a\xa8\x4d\x1f\x1d\x32\x8a\x01\xa2\xd1\x78\x28\x39\x2e\x12\x07\x0d\x3e\x45\xec\xe9\x57\x52\xbe\xda\x9c\x68\x0e\x8f\x7c\x9e\xab\x58\x68\x2e\xc8\xeb\xcd\x38\x8e\x60\x8f\x76\x73\xfa\xe1\x8d\xf0\xeb\x97\xa9\xfb\x06\x44\xc1\xdd\xc8\x19\x5a\x2a\xcd\x5d\xb5\x81\x93\x3f\xbb\xcd\xf3\x11\x98\x62\x86\x31\x40\x17\xf6\x60\xd5\xfe\x06\x0e\xdf\x97\x63\xe2\xad\x87\xde\xda\xcb\x0d\xdc\x5e\x39\x63\x89\x5f\xf5\x09\xf6\xbf\xd2\xbf\xd7\x0b\x0e\x22\x80\x04\x61\xea\x52\xeb\x53\xe2\x11\x29\x87\xdf\x69\xb1\xf4\x3a\x02\x18\x07\xd3\x03\x85\xca\x59\xfa\x71\x2f\x90\x0e\x7c\xd2\x86\x35\xbc\xd9\xff\x86\x0d\xff\x85\x01\x02\xc4\xfd\xa0\xc2\x00\x5f\xc8\xe1\x73\xe6\xbe\x7a\xf8\x70\xb5\x6e\xca\xa9\xe7\x8c\xd9\xea\x42\x88\x15\xad\xfe\xb9\x81\xea\x71\x64\x71\xa2\x5a\x52\x42\x2a\x18\x55\xaa\xee\x33\xb2\x2c\x37\x2b\xac\xb8\x82\x72\x8e\xae\xae\x1a\x72\x94\x65\x64\xd4\x44\x3b\x99\x9d\x92\x55\x81\xc1\xdc\x9a\x84\x06\x1f\x93\x85\x29\x56\x62\xdc\x75\xce\x34\x48\xc4\x08\x16\x34\xcc\xf7\xdd\xa8\x05\x84\xad\xcf\xae\xfd\xa1\xdf\xc9\x51\x9b\xdd\xdc\xa2\x73\x01\xa2\x47\x1b\xdf\x10\x68\xaa\xa7\xd4\x56\x73\x36\xcc\x88\x9c\xa3\x46\x73\x63\x2c\x8a\x8d\x24\x4d\xdb\x32\x82\x87\xc7\x56\xcf\x0c\xfb\xff\xd6\x49\xfd\xeb\x82\x09\x80\x10\x92\x63\x82\xd9\x8d\x22\x69\xf6\xa8\x08\xd9\x6b\xdb\x37\x86\xcb\xdc\x5f\x8b\x14\x2c\x09\x82\xee\x0a\x3f\x0c\x9d\xd3\xd9\xdf\xb3\x47\xa9\x6b\xb9\x80\x71\x07\x67\xe8\x17\x37\xf6\xbd\x57\xed\xa5\xa6\x02\x16\x6f\xd9\x42\xfd\x3f\xe5\xc7\x0d\xaf\x9a\xcd\x60\x7e\xa3\xdb\x44\xe8\x5c\xbc\x20\x07\x44\x09\xf7\x30\x61\x6a\xb2\x54\x60\xbe\xf6\xe6\x0f\xc2\x9d\xf2\xd9\x49\x24\xcd\xaa\x1e\xac\x1d\x50\x76\x3b\xdd\x0d\xad\x27\xbe\x04\x0b\x07\x27\x74\xdf\x5c\x2d\xbd\xc4\xf4\xd8\x7c\xfb\x7c\x75\xf2\x1d\x1c\x23\xeb\xd7\x4f\x12\xbf\x8a\xdd\x27\x34\x61\x71\xfb\x22\x3a\x17\xfe\xd3\x04\x90\x60\x80\x29\xf9\x8f\x5f\xc1\xdb\x32\x8d\x8b\x5a\xe2\x69\xea\xb1\x32\x11\xc3\xc3\x71\x72\xea\x91\xe3\x19\x28\xf1\x80\x06\x30\xe4\x2e\x33\xbe\xb7\x19\xf9\x52\x2f\x49\x0d\xf7\xc3\x98\x69\xbf\x87\xc2\x81\x98\x54\x46\xa7\xac\x22\x0d\x89\x0d\x29\xc2\x2b\x62\x19\xa9\xbf\x67\xcd\xbf\x0e\xfa\x00\x71\xca\x50\xf0\xac\xc9\x39\x0b\x2d\xbf\xfb\xd3\x55\x24\xa4\xbf\xaa\x86\xda\xdc\x10\xca\x7f\xe1\x97\xe4\x97\x56\x48\xd1\xc3\xbb\x02\xff\x10\x3b\xcd\x03\xe8\xc0\x90\xf8\x53\x83\xd1\x42\xa3\x09\xeb\x99\x2e\x51\x76\xf2\x77\x86\xce\xc7\x75\x92\xd5\x2a\x66\x84\x54\xc7\x7b\x67\xc8\x37\x68\xb0\x4d\xdc\xfb\x0b\xd2\xe7\xec\x47\x91\xeb\x16\x82\x46\x33\xb6\xf5\x54\xba\xd4\x71\x8c\x85\xec\xf4\xc7\x41\xf6\x1c\xe9\x3b\x1f\x78\x11\x61\x01\xd1\xce\x69\x73\x5d\xaa\x92\x7d\x7a\x8e\xef\x21\x17\x49\xe5\xa3\x21\xb9\x78\x9b\x73\xe9\x78\x7e\x4b\x4d\xfe\x1a\xcc\x54\xb2\xcb\xb4\x80\xe8\x74\x09\xf5\x37\x22\x04\x81\x07\xa3\x71\xdf\xf2\x2f\x9d\x51\x24\x47\x92\x06\xcf\x3a\xc8\x8e\x87\x8c\x4f\xba\x05\x26\x12\x88\xd5\xfe\x4e\xc2\x3f\xaf\x30\x88\x1f\x14\x14\x0e\xf0\x43\x68\xc9\x86\x2f\xa4\xb4\x0a\xca\x75\x27\x3a\x8e\xa6\x53\xac\x28\x84\xd5\x76\xb3\x7a\x77\x85\x2d\x31\xbf\x35\xaa\xa7\xd9\x21\x01\x73\x88\xc2\x4c\xd7\x32\x0a\xab\x7f\xf0\x4e\xd1\xaf\x0e\x21\x9c\x68\x7b\x3e\xef\xa1\xfa\xf8\x8c\x29\xb5\x35\x9f\xd1\x03\xda\xaa\xbc\x02\xe4\x53\xcb\x2f\x84\x9b\xb5\xc8\x77\xb3\x95\xf3\xdd\x38\x2b\x98\x46\xe7\xd4\x95\x2a\xf4\x51\xa7\xfd\x81\x54\x53\x05\xe5\xde\xff\x3d\x1b\xec\xa7\x9c\xc0\x4b\xfc\xe1\x7b\xcd\xcc\x26\xfc\x33\x07\x5d\xea\xc7\x0c\xb2\xc8\xb0\x5e\x71\xe8\xb8\x99\xe2\xae\x30\x39\x6d\xe2\xb0\xf6\x5b\xe0\xb1\xf0\x50\x7e\xef\xe5\x9f\x43\xad\x70\xea\xfc\xb8\x15\x6a\xd6\x7a\x16\xb7\x18\x8a\xb7\xaf\x31\xfb\xa9\x0c\x2d\xce\x9a\x0b\xc6\x2d\xff\xfe\x3a\xff\xba\x47\x03\x20\xa1\x70\x6b\x60\x89\xe1\x8d\x1d\xfb\x3d\xbd\x4b\x9d\xfe\x63\x51\xf3\x30\x15\x91\x7b\xbb\xe6\xd2\xe4\xb4\x3d\x61\x04\x97\x37\x1d\xd4\xa3\x4d\xc4\x09\xc8\x39\x46\xaa\x14\x7b\xd2\x9c\x50\xa6\xaf\xde\x46\xa4\xd6\xb0\x73\x31\x13\x1d\xd5\x68\xbe\xf6\x8d\xe7\xd9\x71\x42\x76\x3e\x35\x76\x09\x58\xf2\xca\xbd\xfc\x30\xc2\xcf\x6c\x2e\xbd\x5d\x01\xb5\x4c\xdd\x2a\x13\xe4\x81\xbb\x89\x18\xe4\xdd\x19\x61\xfc\x69\xdc\xbc\x38\x6f\xed\x3f\xcd\xfa\x8a\xaa\xf5\x2e\xb8\x95\x95\x9e\xeb\xc4\xc6\x4f\x04\xb7\xbe\x73\xcb\x59\xec\xb7\x8d\xb7\xdb\x83\xce\xbc\x85\xa7\x41\xe2\x07\xf9\xe7\xe2\x1f\xd4\x52\x2d\xca\x8a\x05\x9e\x63\xb9\x08\xe4\xa8\xd7\xe8\x5c\xdc\x9f\x5b\x1f\x24\xb2\x57\x34\xfc\x28\x70\x35\xae\x9f\x07\xeb\xf0\x94\x5f\x1d\x1b\x7d\xaa\xf4\xa3\x60\x31\xf0\xba\xe6\x82\x77\xdd\x51\x11\x9b\xde\x9d\x95\xa9\x0a\xd4\xd2\x9c\x74\xbc\xdf\xeb\x22\xb8\x18\xff\x9f\xb8\xcb\xbb\x09\x46\x9c\x46\xf1\x3e\xdc\xaf\x96\x63\xe9\x56\x83\x5a\x99\x86\xdf\x1a\x48\x98\x9e\xd7\x85\x2c\x9c\x12\xf1\x97\x36\x1e\x3a\x07\x40\x7c\x1f\x1f\x1f\x53\x40\xac\xb4\x23\x74\xc2\xef\xa4\x8d\x74\x2a\x75\xc5\x62\x17\x70\xd6\x35\x06\xef\x34\xe1\xdd\x7d\xa6\x0f\x2f\x2f\xb6\x2f\x6a\xfb\x28\xe9\x04\x1c\x8e\x8e\xca\x56\xe9\x42\xd2\x5d\x2a\x82\x57\x69\xdc\x87\x53\xf3\x26\x76\xa3\xf0\x82\xb1\x74\x3b\x8d\xfd\x50\x87\xc8\x48\xba\x20\x00\xf5\xae\x08\xa5\x1b\xfe\x82\x98\xbe\x31\x6e\xb4\x89\x21\x9c\xe9\xe6\x40\xfc\xc6\xfa\xcc\xb4\xe1\x81\x7c\x08\x5a\x17\x47\xef\x3d\x40\xb7\x3d\x74\x6c\xc9\x60\xc7\xd9\x20\x72\x7c\x6f\x3d\xe5\x77\x16\xd8\x3c\x14\x32\xb1\x87\x62\x90\x9a\xf2\xb2\x9b\xae\xf5\x56\xd8\x55\x17\x00\x40\x16\xb1\xe4\x8f\x36\x1f\x9a\x95\x95\xbe\xcd\xd4\x29\x7e\x74\x39\x39\xac\xac\x6c\x4a\x91\x20\xdf\xa1\xef\x89\x79\x30\xc4\x0d\x68\x02\x9c\xcf\xea\x04\x24\xd9\x1d\x77\xbe\x18\xff\x4f\xb3\x35\x55\xe2\x89\x24\x88\x30\x6a\x77\xd6\xd5\xee\x34\xfd\x6b\xde\xa2\x7b\x57\x00\xdf\xef\x4f\xff\x0c\x5d\x0c\xcb\x5c\x26\x5c\x19\x34\x0f\x0a\x6f\xeb\x9b\x01\x28\x2d\xf6\x14\x63\x41\x2e\x7a\xa5\x37\x66\x44\x11\x68\xf4\x20\xaa\xa3\x4e\x6e\x54\xae\xb6\x4b\xd8\x5d\x61\x13\x28\x76\x0f\xe4\x30\xd8\xfd\x52\x28\x47\x61\xf1\xfd\xa4\x2e\x49\xc1\x57\x29\xe5\xa0\x0a\x7c\x62\x5d\x79\xfd\x8d\x81\x8f\x88\x3e\xd9\xdf\x0b\x9b\x82\xb6\x21\x7f\xf9\x12\x5d\xf0\x93\xe4\x07\x95\xf1\xcb\xcd\x79\x98\x88\x7b\xd0\xa9\xd1\x99\xf6\x80\x16\xc7\x75\xe8\xb5\xff\xee\xd2\x62\x79\xdc\x63\xb7\x5c\x0d\x55\xce\x9e\x40\x55\x7e\xc5\x4d\x7d\x42\x7d\xc1\xf6\xa4\x6a\x57\xfb\xf9\x66\xce\xb2\xba\x03\x27\x6a\x6e\xa5\xb8\x51\xca\xfb\x76\x4c\x44\xb6\x2c\x7d\x8e\x20\x78\x8f\xcb\x12\xe6\xea\x1d\x0a\x30\xc3\xc0\xbc\xfe\x48\x0b\xb7\x84\x74\xd0\xe4\x93\xa5\x8c\x0e\x22\xb9\xf0\x8f\x34\x3d\xc9\xa9\xad\x3e\x35\x9f\x78\x9a\x36\x8e\xef\x80\x4f\x87\xef\x5a\x04\x0f\xe3\xe2\xc1\xfb\x87\x61\x7c\xfa\x52\x78\xfa\xed\xf2\x32\x9b\x62\xe6\x8b\x33\x66\xe8\xc5\xf7\x6b\xf1\xf6\x0b\x60\xa9\x9a\x80\x30\x57\x76\x61\x80\xed\xfb\x3d\xe9\xaf\xba\xdd\x5e\x24\x3b\xa1\x19\xcf\x9c\x11\xce\x07\x13\x4e\x0f\xec\x36\x1e\xae\xcd\x98\x9e\x06\x35\x29\xd4\x1a\xdf\xf5\xaf\xe8\x42\xf1\x90\x2a\x3d\xc4\x9e\x8c\x71\xa3\xc5\x9d\x43\xe7\xdd\x37\xde\x70\x84\xc3\xc1\x36\xf9\x34\x09\x2c\x54\x2a\x5b\xe5\x47\x71\x02\x47\xcc\x0a\x7f\x97\x87\x6e\xc4\xc9\xad\x61\x7e\x4e\x29\x6a\x14\x95\x02\x0b\x33\x53\x4b\xda\x96\x30\x70\xfa\x57\x0a\x70\x78\xdf\x1d\x45\xb2\x32\xc1\x9e\xad\xa5\xef\xdd\xe7\x73\x86\xb0\xec\xaa\x7e\x94\xfc\xd6\xa7\x73\xa1\xde\xd9\x1c\xdf\x0e\x88\xce\x48\x8a\x88\x9d\x35\x4d\x54\x59\x99\x5f\x5a\x4e\xc9\xa6\x6f\x4a\x68\xf5\x17\x3d\x42\x59\xb7\x7b\xdf\x84\xf1\x4e\xe2\xb2\xed\x00\xa2\x9c\x6e\xe8\x72\x7c\x42\x9c\x91\x7b\xe8\xf2\x23\x8e\xb5\x46\x42\x6b\xa6\xd6\xe8\x73\x90\x95\x02\x67\x2e\x04\x05\xe7\x40\x0d\xb0\xf1\x60\xa7\xfe\x67\xdd\xe0\x93\x17\x1f\x59\x1d\xcc\xa0\x77\x3d\xa9\x48\x54\xac\xce\xad\xb1\xa0\x55\x97\x53\xb9\x03\x3b\xb0\xf1\x68\xcb\xc1\x0a\x30\x24\x85\x32\x7e\x6c\x05\x81\x67\x64\x3e\x09\x97\xc3\xe4\xd7\x7a\xd6\x89\x03\x8c\xe1\x6f\xa4\x8b\x0f\xf3\xe0\x96\x58\x1c\x96\x00\x51\xaf\x74\xc7\x43\x0a\x7b\xc1\x6f\x91\x65\x35\x73\xb1\xdc\x63\xcb\xee\xcf\x88\x59\x79\xea\x1e\xb0\x70\x83\x09\x51\x2d\x34\xd0\x3d\x9e\x56\xd5\xed\xae\x59\xb8\xdc\x52\xe2\x1b\xe6\x4f\xfe\x16\x5e\x44\xbc\xc4\xb7\x9d\x7e\xce\x47\x5f\x86\x0a\x24\xb2\xe7\x28\x9a\xc4\x1a\x84\x81\x0e\x23\xa3\x01\x37\x1e\x8d\x47\x11\x16\x77\x27\x5e\xc6\x02\xec\xb8\x4e\x5e\xf8\x05\x76\x5c\x54\x41\xcf\x22\xba\x56\x96\x38\x44\xc7\xc1\x69\xf5\x3b\xf6\xfb\x3a\x2a\x11\x0a\x97\xdd\xbe\x51\x16\x55\x47\xce\x78\x62\x28\x70\x19\x76\x54\x95\x96\xe8\x9c\x75\xc9\xf1\xa3\xaa\xe4\x69\x03\xa8\x98\x99\xcd\x60\x6a\x16\x0e\x78\xf9\xdd\x52\x1a\x0f\x24\xbf\xd7\x32\x49\x49\xb2\x78\x45\x58\x53\x5e\xf9\x46\x06\x72\xbf\x74\x05\x64\x16\x3b\x20\x71\xc5\x12\xf0\xb2\xb2\xfb\x71\x1c\x33\xfe\x79\xc5\xb3\x82\xb6\xbc\x2c\x73\x03\x5f\x83\xce\x32\xb1\x78\xb0\x56\x0b\xb0\xdd\x1f\x11\x95\x98\x7c\x78\x1b\x71\x55\x87\x64\x73\x88\x93\xeb\x92\x84\xbb\xfb\x75\xf2\x4f\xb9\xff\xe0\xd6\x03\x09\x3e\x2d\xbd\x27\x0a\xb0\xff\xa8\x98\x0c\x0d\x19\x2c\x0e\x67\x3d\xd2\xb3\x67\x96\x7e\xea\xe1\x95\x8e\x59\x0d\x05\x65\x1e\x1a\x71\x17\x19\x3c\xc6\x7c\xc4\x4c\x07\x48\xb6\xfa\x47\x88\x47\x49\x02\xd0\x14\xb0\x11\xff\x10\x26\x40\x6d\x53\xd9\xf3\x9a\xfe\xb2\xd7\x33\xf6\xd1\x48\xb4\xd2\x27\xfe\xc6\x01\x94\xca\xbd\x2c\x9c\x62\xf0\x3c\x9e\x38\xb9\x7f\x34\xaa\xd5\x7e\xbe\x0c\x25\xa8\xe5\x63\x91\x49\x1a\x29\x7c\x15\x1e\xc0\xfa\xae\x1e\x24\x7a\x09\x4f\xcf\xb8\x25\xc6\x15\xd5\x54\xac\xc1\xd9\xf9\x49\xa8\x55\x41\x84\xa2\xf4\xb8\x39\x2d\x85\xf9\x6a\x88\x3c\xf2\xa8\x13\xad\x16\x08\x69\x38\xfe\xf1\xad\x41\x2b\xcd\x7d\x7e\x26\xf3\xeb\x53\xed\xe7\x30\x88\x7b\x9c\x2e\xd1\x15\x13\x17\x6a\x5d\x4c\x63\xdf\x38\xd2\x6f\x70\xf6\x89\x7d\x62\xf0\x85\xdb\x45\x2b\xba\x3f\xaf\x67\x7c\x8d\xa5\xd1\x77\x35\x2c\x51\x31\x61\xac\x90\xbb\xc7\xe5\xd1\x2f\xca\x44\x7d\xfd\xf4\x7d\xbd\x77\xed\x4b\xb8\x3c\xaa\x7d\x1d\x86\x72\x01\x41\xa2\x77\xce\x8d\x08\xd3\x29\xb3\x39\xac\x9f\xed\xda\xe0\x82\xb2\x82\xe7\x62\x01\x36\xb2\x60\xee\x16\x5b\x93\x70\x03\x55\x78\x59\xa1\x93\x76\x95\x78\x97\xf3\x45\x45\xdc\xc7\xe5\x35\x6b\xac\xa1\x31\x7c\x04\xb9\x63\x60\x4e\xd3\xa5\x95\xc8\x68\x07\x58\x86\xfc\x87\xaf\xfc\xf8\x99\x6f\x58\x78\xc3\x9d\x26\x8c\x26\xbd\xf2\xa7\xbe\x38\xc8\x7b\xac\x5d\x01\x5d\xc2\x26\x5b\xac\x36\x87\xdf\x79\x54\x6e\x09\x86\x13\xd6\xa5\x7c\xf6\x68\x2e\x33\x75\x37\x71\x65\xb7\xee\x7c\x9f\x2d\xc0\x6b\xb8\x0c\x64\x42\x1d\x73\x04\xfd\x99\xaf\x84\xcc\xb5\xfe\x24\xbb\x59\x9c\x58\x0c\x1e\xc0\xf4\x62\x86\xd3\xc9\xee\xfd\xd9\xfe\xdd\x3b\x0c\x7f\xbf\x1a\x98\x53\x38\xa9\x69\x15\xb8\x49\x04\xb3\xdc\x15\xcd\x7c\x18\xee\x7c\xe8\x6f\x51\xad\x38\x39\x62\xf0\xf1\x8e\xb3\xb7\x12\xbe\xaf\x93\x44\x9f\x06\xa5\x44\xde\x48\x0b\xd1\x74\x60\x4b\x0a\xc5\xb8\x53\xc4\xbe\xcb\x36\x4f\xf4\x17\x1e\x92\xa1\xf3\x6b\x2b\x0f\x2e\x49\xcf\x0c\x06\xd3\x9b\x18\x3f\xe9\x50\xfd\x52\x0a\x47\xc0\x83\x4b\xc7\x09\xf6\xa6\xc4\xff\x30\x2e\xab\xbc\xc8\x3f\x79\xba\xd4\x3a\xaf\xea\xec\x3f\x1e\xff\x34\x28\x93\xbc\x86\xcf\x0a\x51\xd9\xd7\x0c\xcb\xdc\x1d\xa1\x16\xef\x91\x47\x66\xe8\x28\xc4\x4c\x9d\x49\x71\x87\x25\xbe\x26\xa1\xe7\x40\x26\xd2\xe6\x40\x45\xd8\xa1\x7d\x80\x74\x3f\x8f\x6b\x63\xcf\x14\x4f\x06\x77\x1f\x83\xa1\x9a\xdd\x1c\x11\xc5\x06\xb4\xfb\x2d\x01\x32\x0a\xb8\xa4\xbf\xb1\xe8\x30\xb8\xdc\x99\x5e\x0f\x09\xf5\x71\xb1\x44\xd9\xdc\x33\x9f\x55\x8a\xe9\x0f\xd2\xbf\xb5\x57\x49\x96\x8a\x54\xf0\x8c\x7e\xd2\x34\x12\xe1\x2e\xaf\xfb\x17\x2e\xc3\x67\xad\xbc\xf6\xd9\x1e\x2e\xa4\x3a\xd5\xe7\x93\xe1\xab\x29\x8d\x0a\x83\xc3\x2b\x92\x34\x3b\x40\xbb\xde\xfc\xf6\x9d\xf5\xc8\xb5\xd7\xf8\x2e\xa6\x68\xc9\x6b\x0d\x50\x0f\x75\x02\xb1\x4c\x77\xc5\xef\x84\xa8\x46\x26\x92\x67\xb3\x5d\x54\x9e\x24\x4b\x1b\x64\xb9\x92\x56\x2c\x29\x62\x77\x0f\x1b\xd7\xbe\x43\xa5\x2f\xce\x8b\xdf\x9c\x48\xd2\x47\x79\xb2\xdc\xb7\x7e\xdc\x96\x76\x00\xdb\x17\x4c\xed\x7f\x3e\xd2\x48\xe0\x47\xb0\xc3\x4f\x70\xc9\x9b\x9d\xaa\x08\xe8\xb1\xcd\x75\x7b\x86\xbf\x5c\xea\x56\xcf\x4c\x58\x4d\xf0\x34\x28\xc3\xe6\x58\xc8\x64\x14\xfd\xcd\xa4\x5e\xea\xfc\x22\x2a\xc3\x9e\x8b\x41\xc3\x62\x34\x5a\x54\x63\x72\xdf\x2f\xa1\x57\xcb\xc1\x6f\x80\x41\x1b\x05\x4e\xf5\xe4\x6e\x8b\x5e\xbc\x74\x3f\xe5\xf6\xe8\x2f\xcd\x2d\xe5\x71\x65\xca\x28\x5e\x6f\x55\x42\xe6\xcd\x7e\xd0\xbd\x9a\x06\x28\x13\x79\xad\x0a\x18\xbf\x3f\x2c\xed\xf3\x53\x09\x77\x91\x9a\xdb\xbe\x85\x77\xa6\x8e\xef\x9a\x16\xe3\x21\xff\x74\xf0\xe9\xc1\x67\x19\x58\x52\xc2\xaa\x67\x37\xad\x24\xe1\xe5\xe1\x72\xce\x4a\x68\xc8\xdd\xfd\xe5\xd0\x5e\xd3\xa7\xb3\x63\x1b\x12\xb9\x2e\xb9\x46\xf9\x3a\xdf\x9f\x06\xfd\x9a\x5d\x0a\x81\xaa\x2a\x43\x6a\xdb\xd9\xfd\x3c\xec\x87\xa1\xa9\x79\x29\x7f\xaf\xd1\x9d\xfa\xdb\xdb\x5d\x7a\x74\x67\x13\xa3\x04\x08\x52\xb1\xcd\x14\xbd\x1e\xbb\xfa\xb4\x7b\x3b\xba\x5a\xe3\x76\x58\xb1\xeb\xf9\xf9\xdd\x31\x8b\x71\x8e\x9a\xa8\x25\x1c\x79\x80\x7b\x2c\xf0\x79\x74\xce\x55\xf4\x0d\xca\xd1\x7c\xfd\xd6\x53\xdb\x90\xc5\xd0\xc8\xf1\x44\xca\xfb\xd2\xc0\x1b\xde\x32\x1a\xee\x5f\x7f\x5c\xc5\x3c\x9f\x06\x7d\xad\xc5\xdd\x81\x34\xb4\x35\x2b\x89\x55\xdc\x55\xc0\x80\x17\x85\x91\x78\x21\x67\x6c\xb6\x64\x1d\x00\x6f\xf0\xf2\x9b\x95\x3f\x10\x23\xb3\x69\x87\x42\x65\x98\x4f\x25\xa5\xfd\x18\x98\x2b\x07\x27\xdb\x53\xa3\xa9\x86\xee\x79\x71\xda\xfc\x5a\x4f\x52\x6a\x7a\xb7\xd7\xfd\xef\x0b\xf7\xbf\xf0\x59\x00\x04\x19\x4a\x12\xac\x3a\x4c\xc3\x15\xff\x22\xd7\x31\x8f\xfe\xc7\x8d\x05\xcf\x71\x2d\x24\x72\x00\xc3\xc4\x87\x77\x84\xad\xf0\x93\x1d\x47\xcf\xa2\x1e\x02\x58\xc6\x16\xf8\xba\xbf\x71\x11\xd6\xae\x4f\xd5\xb2\xeb\x2d\xc2\x41\x35\xfa\xef\x98\xae\x6b\x44\x29\xf9\xbb\x12\x56\x0a\x1a\x3e\xa7\x20\x90\x9d\xb6\x2d\x79\x8f\xcd\xd6\x58\xdd\x80\x3c\x15\xf7\x77\xe9\x5a\xd1\xe6\x75\xeb\x79\x4a\x17\x75\xb7\x38\x35\x45\x03\xff\x70\x7e\x08\x98\xea\x50\xc7\x75\x9b\x7c\x3b\x9d\x86\xf2\x85\x50\x11\x7d\x26\x84\x00\x39\x59\xdb\xed\xda\x81\x19\x3d\xd7\xe5\xaa\xfc\x86\x1a\xbe\x1e\xf4\xc7\xde\x1d\x55\xbe\xae\x7e\x4d\xb5\xd4\x36\x79\x61\x42\xfd\xfe\xf9\x5c\x6f\x4f\xe3\x1d\xbb\xcc\x17\xdd\x99\x11\xa3\xa9\xd4\x0a\xfe\xd7\x7f\xdf\x4a\xff\x85\xbd\x02\x20\xd0\x7e\xff\x69\xe1\xbe\x98\x7c\x55\xbe\x87\x94\x2b\xb9\xc4\xef\x94\x33\x9c\x10\xf3\xb1\x30\xeb\x96\x06\x42\xb6\xd4\xd3\x54\x00\xdb\x57\xce\xc4\x01\x36\xf9\xb2\xbd\x8d\x61\xea\xf6\xd0\xdb\x15\x9a\xff\x9a\x3e\x25\x56\x20\xa3\xf3\xd9\x33\x8b\xf9\xa4\x79\xdb\xc7\xdf\xa9\x84\xee\xfb\xee\x34\x20\xfa\x5c\x53\xdd\x9f\x7a\x76\x91\xfc\x3b\x9e\xdc\x0f\xf4\xff\x8f\xb1\xb7\x8c\xca\xf2\x89\xd6\x87\x69\x90\x90\x92\x6e\x10\x24\xa4\x4b\x42\x40\x78\x00\x01\xe9\xee\x90\x4e\xa5\xa4\xe3\xa1\xbb\x3b\x24\xa4\xa4\x5b\xba\xbb\x95\x6e\x90\x96\x14\xe9\x7a\xd7\x7f\xbd\xe7\xc8\xfc\x3e\x79\xbe\xef\x35\xf7\x9e\xb8\x67\xc7\x5c\xfb\xda\xa1\x39\x91\xc5\x9f\x16\xe1\xdf\x5f\x23\xbb\xfe\x29\x58\x41\x37\x16\x57\x00\xf3\x29\x2d\xb6\x6a\x58\xf1\xf3\x62\x7b\x45\xea\x8b\x73\xd6\x23\xea\xc9\x1e\x3f\x21\xe6\xdd\x6a\x8d\x23\xd6\x08\x69\xb3\x6c\x81\x99\x9b\x7f\x33\x1f\xff\xf4\x15\x21\x58\x94\x30\x22\x40\x85\x0f\xc1\xc5\xa9\x5b\x30\x66\xc8\x16\xd2\xcf\x25\xbb\xc6\x78\x48\xdb\x67\xba\x6a\xac\x35\x5e\xb5\x04\x17\x6c\x9e\x77\xcf\xe4\x26\x57\x01\x1a\xb5\x3c\xe8\xc0\xf3\x0c\x8e\xe6\x58\x3f\x3a\xcf\x2f\x76\x95\xfe\x7c\x98\x83\x9b\xef\x4c\x47\x7f\x94\x9a\x72\xae\xde\xa5\x4f\x80\x84\x27\x55\xf5\x54\x28\xe2\x70\xe8\x7a\x13\x66\xdd\x26\x47\x62\xda\xc1\xf1\xc2\x71\x77\x1f\xb6\x0d\xad\x09\xeb\x11\xb3\x03\x14\x2d\xcc\xc0\x62\x2f\x95\xd5\xde\xd9\xb9\x43\x35\x4b\x65\xe8\x6b\xad\x7b\x9d\xa5\x54\x8e\x0a\x98\xa8\x10\x37\x35\x77\x23\x79\xbd\xac\x28\xbf\xd0\xbf\x65\x9d\xff\xf2\xd8\xfe\xdf\xcc\x50\xda\x81\xa3\xeb\xf2\x62\x03\x6d\x2f\xc7\x20\x85\x91\x11\x53\x5f\x60\xda\x10\x33\xfa\x4a\xc5\x6b\xed\x8e\x16\x13\x73\x40\x89\x4e\xfd\x55\x05\x08\xe3\x74\xca\x09\x2e\xe6\x8d\x13\xd0\x99\x27\xe3\x6f\xd1\x91\xf1\x37\x97\x27\x3d\x2c\xda\x92\x3d\xd9\xa6\x90\x3e\x0d\xb0\x8a\xe4\x00\x89\xae\xa8\xbd\x3f\x2a\x28\x91\x92\x19\xb3\x54\xf3\x9a\x7f\xab\xec\x40\x41\x0b\x7e\xcb\xa2\x22\xf1\xf0\x3d\x22\xc6\x82\xfe\x30\x64\x8e\x1a\xbc\xbd\xfc\x9e\x24\x72\x7d\x52\x63\x34\x51\x94\x1d\xb0\x40\x4f\x41\x93\x98\xf4\x0f\x7e\xef\x33\x1e\xb8\xf6\xa3\x60\x88\xa9\xa1\x14\x15\xb0\x72\x1b\x0b\xcf\x8b\xa5\xd5\x37\x74\x46\x5e\x0e\xea\x95\x7e\x21\x97\xf6\x9a\xad\x08\x6d\x1c\x09\xfe\x75\x3b\x73\xe4\x3f\x6b\x0b\x66\x8a\x28\x78\xcd\x0b\xca\x71\x46\x15\x27\xe7\x0d\x8a\x99\x04\x51\x8f\xd1\x16\x9d\x64\x59\x60\x5a\x7c\xc3\xd9\x6c\x1c\xbc\x7b\x9d\x39\xff\xc6\xfc\xff\x72\x5b\xa1\x10\x58\xca\xff\x54\x34\xca\x1e\xb7\x4a\x2e\x30\x89\xa7\xb6\xf2\x3e\xcb\xe4\xab\xa2\x58\x62\x28\x7c\xe6\x99\x26\x94\x90\x5a\x70\x50\x44\x22\x8a\x63\x00\x06\xf2\x0e\x96\x72\x1b\xe5\xfb\xb1\x9c\x02\x29\x33\x7e\x59\x17\x4e\x85\x8c\xd9\xdb\x0d\x4e\x5a\xb7\x04\xe9\x50\xd9\xf2\xaf\x8d\x6b\x20\x97\x4c\x54\x82\x62\x0f\x3e\x53\x6d\xf3\xd7\xa8\x83\x45\x61\xb8\x03\x4a\x43\xb1\xfe\x52\xde\xe3\x02\xc3\xf6\xd6\x8b\x77\x61\x6f\xa5\x2e\xc0\xe8\xc5\x35\xc4\xf9\xda\xe6\x7e\x7a\x5f\xcf\x8e\xeb\x73\x41\x3f\xcd\x8b\x74\xcf\xbe\x5a\x3e\x8d\xb8\xc3\xe0\x98\x62\xe5\x18\x7d\xe0\xb6\x2f\xf1\xd2\x20\x8c\xaa\x0e\x18\xfa\xae\x0f\x3b\xc6\x00\x13\x6f\x48\x16\xa8\x76\x8a\x37\xea\xb6\xad\x74\xd4\x05\xb5\x5f\x1b\x5a\xfd\xfb\xa7\xff\xcb\x21\x87\x42\x28\x61\x60\xf0\x80\x45\xf8\xa5\x9d\xea\xa3\x82\x6c\xb9\x74\xe8\x59\x88\x34\xb7\x61\xf0\xba\x72\x21\x3d\x4a\xf1\x24\x61\x04\xd7\xd4\x9d\x98\x83\xdd\xb6\x00\x44\x7d\x9a\xc2\x5f\xc7\xb3\xd4\x55\x33\x08\xe8\xdf\xde\xa4\xae\x4d\xb5\xad\x4c\xef\x27\x96\x0c\xd8\x20\x93\x67\x75\x0e\x7e\x83\xa0\x01\xa2\x15\x91\xc6\x0a\x3e\xcc\xbf\xb1\x10\xd3\xac\x92\xd8\xa3\x4a\xfa\x77\xaa\x42\xf3\x16\x72\x7f\x8d\x7f\xce\x0d\x59\x99\x4e\x8c\x63\x07\x01\x84\x9a\xbd\x0c\x4d\xa6\xfb\x4f\x4d\x07\x6e\x2e\x94\x95\x4a\x91\x5d\xe8\x86\x9f\xad\x7d\x21\xd0\x26\xae\x2c\xd8\xb9\x96\xe4\xfc\xf6\xf7\x2a\xff\x57\x00\x01\x85\x88\x3c\x81\x05\x3b\x1b\x8c\xaf\x38\xe9\x62\xa3\xfb\x4e\xff\xbe\x8f\xa6\x1e\x1f\xcf\x69\x30\xf7\xe0\xf0\x9a\x18\x12\x3a\x0b\x72\x98\x50\xda\xda\xd0\x07\x6b\x0f\xd9\xc8\x25\xde\x7b\x94\xe8\x3e\x63\x7d\x95\xb4\x2f\x2a\x9d\x9f\x35\x10\xf4\x16\x69\x82\x68\x8a\x33\x34\x14\x47\x04\x26\xa7\x18\x6c\xdd\xa9\x12\x14\x67\x70\xd3\xa8\x54\x83\x90\xd2\x83\xa0\x29\x82\x1d\xd6\x82\xb9\xad\xf1\xee\xbc\xab\x55\x56\x9c\xdf\xee\xcc\xb4\x09\xcc\xa2\x87\x40\xc7\x6a\xf0\x24\x15\xdf\x05\x7c\xbf\x4f\xc5\x28\xeb\xf4\x0c\xb8\x4d\x47\xb7\xaf\x6c\xcd\xc3\x43\x2b\x3b\xfc\xed\x58\x03\x26\x49\x7c\x90\x14\x22\x36\xab\xd6\x13\xcc\x89\xb7\xa8\x62\xc6\xad\x04\x73\x0d\xf5\xa3\xa8\x91\x6e\xbb\x5e\x69\x28\x63\xf2\x3d\xb3\xf3\xfb\x9b\xd4\xf9\x57\x6c\x04\x85\xa0\xc0\xc2\x08\x02\x49\x1d\xa9\x64\xd5\x6a\xea\x66\x81\x67\xd6\x26\xbb\xf6\x2f\xbf\x97\xc0\x4f\xda\x95\xc5\xd4\x52\x42\xd9\x9a\x57\x88\xbe\xe2\x7c\xc6\x06\x95\xf8\x83\x33\x7c\xf2\x79\x61\x76\x3f\x29\x2a\xe4\x7a\xfb\x70\xea\x0d\xfb\x04\x86\x37\xc2\x42\xc8\xb4\x5d\xf5\x43\x54\xa0\x5f\x1e\x48\x58\x64\x31\xe6\x8c\x6f\x80\xfa\xb6\x89\xe0\x1b\xc3\xa5\xdc\xd2\xb4\xb6\xa6\xcc\xd5\xe9\x00\x87\xd5\xa7\x4d\xa5\x98\xdc\xdd\xd2\x17\x60\xc2\x9d\xbd\x0e\x05\xf6\x7e\xe1\x84\xf2\x53\xe9\xb7\xf3\xac\x33\xab\xab\x0f\x79\xbd\x1f\x14\xcd\xd4\x12\xd5\x2e\x3e\x44\x1f\xa8\xa2\x81\x49\x1d\xa7\xa4\xda\xe3\xeb\xa3\x07\x3c\x1c\xcd\x6c\xe4\x90\x20\x17\xef\x1e\xb1\x77\x5f\x4b\x69\x3f\x6f\x63\x6b\x31\xb5\x0f\x32\x15\xba\x80\xb9\x5b\xf1\x88\xba\x8b\xf3\xcd\x0f\xdd\x77\x31\x5b\x9a\x2a\xf7\x48\x04\xde\x1f\x4c\xc8\x7b\xde\xcc\x8d\x18\x74\x0a\x27\x8d\x25\xc7\xff\xfd\x23\xfe\x19\x21\x42\xb0\x60\xa2\x41\x08\x94\x8e\x63\x99\xf3\xe9\xda\xf0\x21\x4e\x4e\x12\x7c\xff\x1d\x25\xc9\x4c\x6b\xc4\x08\xa2\xf2\x70\x29\x55\x03\x46\x20\xbf\xff\xca\x1e\xa0\x84\xba\x7f\xde\xcc\x04\xa9\x24\xe1\x2d\x19\xa3\xd1\x96\x1f\x73\x0f\x5f\x56\x71\xc9\x97\xb6\x26\xe3\x80\x90\x5b\xd2\xda\xe2\x32\x46\x40\x14\x43\x63\xe5\x63\x3d\x2e\xc1\xcb\x9f\x28\x07\x6e\x33\xef\xc8\xcd\x08\xea\x33\xbd\xee\xf4\x43\x3a\x79\xdc\x5f\xf6\xef\xde\xba\x40\x01\x51\xf1\x29\x7c\xed\x05\xea\x28\xbf\x20\x2b\x43\x46\x16\x89\x7b\xed\xa2\x1a\x36\x76\x65\xc9\x22\x42\x54\x18\x02\xa7\x62\x7c\x98\x92\xbf\xb6\xef\x5f\xc1\x27\x54\xcc\xc7\x1c\x44\x40\x7d\x27\xc1\x5e\x56\x97\xae\x66\x40\xa1\xdf\xcf\x79\x6f\xdd\x42\xba\xaf\x7f\xf6\x51\x68\xc7\x80\x25\x5e\x53\x6c\x54\xf6\x7b\x3e\x58\x61\x2b\x4d\x46\x04\xcb\x8e\xf3\xaa\x05\xcb\x18\x79\xe9\x2b\x85\x31\x11\x95\x99\x1f\x45\x56\x2b\x4f\x8a\xda\x81\x3e\xef\x6f\xa7\x3c\x90\x59\xf0\x9e\xe7\xb5\x13\x4e\x77\x9e\x35\xd4\x92\x7a\x61\x92\xa1\x96\xba\x86\x92\xe6\xf7\x19\x3f\xf5\x27\xcc\xe5\xe7\xe8\x0a\x7b\xbc\x60\x83\xda\xa7\xbb\x2a\x28\x55\x39\xcf\xd7\x58\x10\xba\x16\x29\xbf\xa7\x76\x04\x1b\x12\xea\x3f\xcf\x1b\x78\xd7\x63\x5e\x19\x55\x4d\x79\x87\xf2\xf7\x5f\xff\x67\x60\x07\xc1\x82\xf3\x07\x81\x89\x56\x4c\xa4\x8a\x02\xb7\xc4\xbd\x33\x0b\xaf\xb7\x94\x68\x02\x36\x57\xee\x6f\x92\xc7\x5c\x56\x0b\xc8\xad\x5c\xb8\x79\x6f\x58\xa4\x00\x25\x04\x59\xb5\x46\x52\xda\xbe\xcb\x33\x78\xab\x93\x16\xc6\x33\xea\xb8\x3a\xbe\x96\x73\x17\x71\xa7\x25\x9f\x91\x23\xdc\xa3\x13\xf0\x05\x5f\xcc\x48\x2f\xe6\x61\xc7\x45\x43\xfb\x7f\x06\x3e\xc1\x61\xea\x35\xfb\x9e\xaa\x62\xae\xef\xb6\xbb\x73\x75\x91\xd0\xca\xd2\x6a\x0a\x07\x88\x22\xa7\x43\x62\x16\xaf\x8e\x67\x78\xde\xa3\x17\x4f\x5a\x1d\xcc\x2f\x13\xdc\xc2\xe7\xec\xc5\x10\x87\xa8\x96\xae\xd3\x0c\x25\x81\xc6\x57\x57\x16\x9f\x0e\x4a\x88\x88\x2d\xeb\xd4\xbd\x2b\x78\x81\xb6\x18\x88\x31\x5f\x1a\x94\xf7\x13\x16\x6a\xfb\x22\xf4\x0a\x1f\x22\xf9\xd7\x03\xf8\x57\x2c\x04\x85\xa0\xa0\xfa\xc3\x00\x8d\x0d\xe9\xef\xd9\x39\x14\xbe\x17\x60\xfb\xac\x07\x2e\xb1\xf3\xc3\x05\x54\xa9\x0d\x1f\xad\xdf\x9c\x6b\x84\xba\xba\x7a\x0e\x4e\x53\x00\x2c\x47\x59\xbc\x29\xe5\x82\xc7\x19\xaa\x0e\xc5\x53\x61\x87\x07\x4b\x71\xf8\x9c\x06\x3f\x7c\x7a\x87\xd0\x62\x7e\x56\x08\x53\x37\x67\x7e\x01\xd4\xbd\xac\x60\x8d\xee\xab\x51\xfc\x64\x76\xf2\xf5\x40\xd7\x62\xc9\x91\xba\x6c\xe9\xdc\xde\xdc\x3b\x51\xb0\xba\x35\x5e\x8e\x0e\x26\x06\x5c\x04\x2f\xe4\x8e\xb9\x8b\xc1\xef\x4e\x46\x99\xee\x1b\x46\xc2\x6f\xd3\x39\x3a\x53\x55\x91\xfb\xe2\x65\xb9\x47\x89\x64\xf4\x16\xc0\x72\x60\x01\x77\x98\xef\xb7\x9f\xcd\x2c\x8b\x71\xf2\xc8\xb7\xb9\x88\xb3\xfa\x2f\x05\xef\x7c\xe7\x26\x9f\xff\x9c\xb2\x4e\xb8\x1b\xbc\x02\x21\x76\x24\x54\x44\x57\x6d\xac\xa6\xfd\x3d\xeb\x52\x17\xfd\x5c\x86\x33\x0f\x23\x19\xf6\x52\xe9\xd6\x05\x03\xb6\x43\xf3\xd3\x50\x16\xe1\xf3\xdb\xff\x69\x6c\x68\xf1\xf1\x05\x3c\x23\x9e\x8d\xab\xbb\x78\xa3\x7b\x97\x87\xf9\x1d\xaa\x88\x7c\x70\x5d\x34\x0a\xd9\xfb\x1a\x96\xc0\x21\x44\xfe\x53\x28\x64\xa9\xed\xe1\x2e\x99\xf4\x31\x36\xc1\xdd\x76\x49\x2b\xdd\xd5\x7b\xb6\x4b\xa4\x71\xc3\x36\xc6\x41\x65\x84\xa4\x44\xd3\xc1\xa7\xf3\xa3\x97\x56\x5a\x66\x47\x04\xf2\xf0\xb8\x60\xea\x2f\x6d\x75\x7d\xea\x5c\x8c\x3f\x10\xbc\xd7\x36\xdf\x2f\xf0\x3f\x12\x37\xdf\x8a\x8f\x98\x7a\xab\xaf\x88\x81\x9e\xaa\x48\x08\xf4\x63\xdf\xbb\x34\x4d\xf5\xfb\x29\x4e\xba\x11\xfe\x2b\xa2\xdb\xf5\xab\x10\x41\x20\x8b\xd0\x41\x59\xfd\xa0\xa0\x6b\xc6\x18\xdd\xef\xc6\x71\x20\x34\x8a\x18\x67\x5f\x50\xac\x4b\xe0\xd9\xd6\x8c\x6f\xba\xc6\xf8\x89\x9b\xab\xfb\xa4\x97\x31\x22\x58\xb3\x55\x68\x55\xa1\xfc\x96\x1e\xc8\xb4\xce\xda\xf8\x48\x27\x58\xf1\x0c\x5a\xf0\xd3\x53\x85\x1d\xc6\xc8\x11\x2d\x48\x29\x7b\x7c\x6e\xe3\xfb\x4a\x39\x53\xaf\x28\x9b\xed\x0d\xd0\x86\xb4\x87\x60\x3f\x3b\x5c\x89\x3c\x52\x19\xe1\x5f\x71\x75\xc0\xe9\xd7\x84\x57\x9e\x4a\x6e\xc9\xd0\xfe\xc4\x70\x28\xe1\x5c\x28\x02\xe2\x2c\xb2\x30\x33\xec\xbf\x06\x39\xfe\xf4\xcb\x5a\x55\xa6\x5c\x0d\x2e\x81\xd2\x64\xd8\xf6\xa5\x3d\x7f\x8b\x87\x8f\x87\x43\x58\x01\x90\xe2\xbc\x5c\xd6\x85\x6e\x56\x77\xbc\x8a\xf6\x6d\xa1\x6f\x69\x4f\xe8\xcb\xb5\xc0\x4b\x98\x33\xc8\x6b\x18\xb7\x42\xfc\x46\x8b\xd9\x38\xff\x28\x29\xfa\xe0\x60\xe3\xe8\x19\x7b\x58\x18\x1c\x48\xe6\x96\xce\xdd\x02\x5b\x4b\xb2\x69\x45\x00\x4b\x4f\x65\xb2\xd3\x8c\x41\x15\xf9\x1f\xa2\xa1\xaf\xe6\x9c\x8c\x6c\x7e\x81\x30\xb6\x0d\xdf\xb2\xa0\x41\xb0\x09\xae\xde\x88\x07\x0b\xe5\x8b\x9b\x58\xd8\x5f\x61\x31\x9e\xd1\x41\x01\xa2\xaf\xd8\xdc\xa1\x0a\xcf\x1b\xb3\x5f\x34\xd8\x3e\xb0\xbf\xe0\x36\x9c\xbc\xae\x61\x7f\x88\x8d\xa4\x0b\x0d\x53\xa3\xec\xbb\x95\xec\x3c\x7e\xdf\x89\x9d\x1b\x42\xad\x68\x8b\x89\x5a\xe9\xee\xbb\x4c\x6c\x0d\xa7\xaa\xb8\x45\x1e\x2d\xef\x21\x5f\xee\x93\x99\x34\xe2\x82\x58\xfe\x28\x19\xe9\x96\x6d\xf0\xb2\xb2\x05\x8b\xce\xa9\x2e\x97\x20\x95\x60\xc0\x46\xfb\xcc\xce\x68\x8f\xe2\xeb\x4b\x4f\x3b\x4a\x0d\x6e\xe1\x4f\x80\xa3\x86\xb7\x7e\xf3\x27\x21\xae\xaf\xfa\x3b\x77\x94\x80\xde\xe1\x35\x73\x1e\xff\x7a\x9f\xb9\xf7\x9f\xac\xa3\x81\xd8\x32\x47\x0f\x71\xa0\xe6\x2c\x2f\x07\xe1\x43\x5e\xd7\x35\xb2\x78\x6a\x78\x7e\x53\x91\x4b\x44\x4c\xa3\x0e\x87\x98\x6f\xe7\x7e\xef\x48\x6e\xdb\x99\x85\x38\x48\xbd\x18\x9f\x8e\x4f\xe2\x69\x6c\xfa\x3e\x41\x22\x6d\x10\xbf\x4c\x58\x36\x26\x7d\x0e\xed\x27\x3e\xcb\x3b\x9c\xd2\x00\x8e\xfe\xec\x2c\x5c\x70\xa5\x18\xb9\x50\xc7\x7e\x52\x4f\x7c\x35\x46\xe5\xf9\xb2\x07\xbb\x46\xf0\xe7\x15\x34\x09\xc7\x97\xdf\xc9\x4b\xe4\x54\x12\x2a\x93\x1a\xfa\xb8\x52\xd4\x7b\x19\x44\xd4\x84\xf3\x9c\xf0\x4a\x61\x4f\x66\xaa\x86\xc7\x9f\x43\xa2\x38\x3d\x48\x42\x73\x6c\x9a\x82\x2c\xa6\xe6\xdb\xe6\x00\x40\xf9\x3a\xae\x26\x84\x9d\x55\x19\x36\xab\xc9\xa3\xd7\xb3\xf9\xcd\x5d\xc1\x6f\x69\x73\x2c\x27\x5b\xcc\xaa\x67\x68\x31\x19\xf7\x00\x23\x93\x69\x7f\xc8\x2f\xb6\x87\x60\x05\x0d\x07\x19\x09\xde\x97\x89\x73\x3d\xa4\x88\x55\xee\x92\x0e\xa1\xae\x07\xb5\x84\x67\xdd\x16\xd4\xa0\xa6\xc7\xf2\xa8\x62\x1f\x5c\x34\x9f\x73\xc3\x1f\xb2\xb7\x96\xbc\xda\x24\x4d\x75\x0d\xcc\x9f\x10\x50\xd4\x8f\x90\xa4\x73\xff\x76\xd9\xf9\xa8\x29\x77\x8b\x26\xf1\x8a\xbd\x34\x1d\xf6\x47\xa4\xd6\x0b\x2d\x8c\xb2\xa5\xc5\x79\xc2\xd7\xb4\x65\x9c\xb6\x57\x51\xc1\xef\xdd\x11\xb1\x80\xfe\x04\x36\x73\x82\x95\x7d\xf4\xe8\xa9\x66\x31\x5e\x24\x84\x5e\x75\xb3\x42\x9a\x9a\xb1\x83\x68\x1e\x09\x57\x92\x62\x9e\xb3\xca\x00\x20\x27\x39\x5b\xb5\x08\x7e\x9c\x9a\x0d\xc3\x43\xc3\xf0\xa9\x14\xbe\xa2\x44\xa8\xc5\x4b\x19\xd6\x51\xb3\xd8\xcd\xf5\x08\x86\xb3\x40\x90\x35\x56\x79\x3f\xfb\x86\x31\x88\xcd\x7d\x35\x2d\x61\x12\x6b\x4c\x74\x2e\x88\x22\x9a\xe2\x23\x27\xb3\x8c\x08\x99\xa3\xe6\x37\x99\x76\x32\x70\x52\xaf\x89\x0f\xea\x8f\xe4\x78\x7c\xe3\xb7\x71\x3b\x7d\x57\x13\xda\x64\x94\x2c\x55\x45\x86\x3e\x7a\x79\xbb\xe9\x26\x0d\xbc\x29\x23\x7a\x3c\x29\x12\xa9\x2f\x65\x56\x5e\x0f\x4b\x7f\xf9\x5e\x9a\xb6\xc6\x43\x59\xf3\x36\x69\xb9\x96\x80\xbf\x3a\x65\xa3\x96\x53\xde\x62\x10\x11\x80\xd8\xe5\x67\x5c\xe3\xa5\x85\xd9\x34\xdf\xd1\xde\x59\xc3\x97\xee\xe2\x2a\xf8\x91\x55\x86\xc1\xe7\x63\x3d\x97\xbf\x5d\xc5\x14\xac\x08\x05\x8e\x1f\xcc\xd3\x6a\xbb\xf1\xc5\xac\xd4\x1d\xad\x14\xd7\xd9\x54\xec\x2f\xbc\xb8\x2b\x61\xae\x3b\x25\x7d\x37\xbc\x6e\x8b\x1f\x25\x7f\x02\x39\x39\xb7\xe6\x19\xee\x97\x57\x68\x66\xe3\x7f\xe0\x92\xcc\xbc\x04\x3d\xa4\x72\x88\xbe\x11\xa1\x2c\xce\x21\xa5\xba\xf3\x23\xeb\x9d\xe2\x83\x93\xca\xdc\x68\x85\x69\xbb\x0d\x7a\x5d\x32\xd8\x7f\xbf\x45\x9e\xa7\x4c\x80\x4e\x49\xed\xde\x35\xc8\x63\x61\xef\xb5\xd7\x77\xfa\xec\x06\x68\x3b\x20\x08\xa3\x2a\xe5\x91\xa5\x93\x29\xd3\x58\x7a\x38\xa4\xb9\xf7\x11\xdf\xbc\xae\x43\x5c\xc0\xe2\x5c\x26\x8f\x7a\x4b\xb7\x4a\xe0\xf1\xfb\x5c\xbd\x7f\x4e\xd6\xd6\xf2\x39\xa2\x9d\xbb\xf9\x46\xa8\x5d\x44\x66\xac\x29\xd5\x32\xee\x26\x7c\x67\x99\x23\x2e\xb6\x1d\x4e\x01\xec\x4c\x52\xaa\xd7\x8e\x91\x30\xae\x4c\xcb\x61\x4d\xdb\x3b\x2c\x34\xf6\xe7\x99\xac\x2e\xd0\xf8\x9e\xb1\x95\xb9\x63\x0d\x86\xee\x6d\xd0\x39\x67\xfc\x9e\xb9\xd7\x10\x7d\x3c\xcb\x98\x8e\x1d\x54\xa9\xd4\x5f\x6f\xa3\xa1\x3f\x17\x25\x23\x8b\xc6\x96\x15\xfd\x4b\x93\x8d\x01\x64\xbf\xf9\x2d\x26\xba\xda\x83\xcc\x12\x22\x53\x21\xb8\x5f\x42\x1d\x45\x5a\x3b\xc3\xab\x78\xa5\x81\x57\xe1\xeb\xa9\xaa\x98\x1d\x9d\xa0\x04\xce\x9f\xbf\xab\xe3\x45\xdc\xd1\x67\xfa\xcf\x49\xad\x73\xad\xb3\xf3\xb5\xae\x6c\x30\xdb\x5d\xbf\xf4\xc7\x63\xd3\x8e\xb1\xfc\xab\x91\xd2\x40\xf6\xae\xc5\xa8\x21\x44\x47\x34\x2e\x24\x97\x82\x5c\x6d\xdd\xe4\x20\xb8\xe2\x7c\x07\xb8\x2a\xe5\xb6\x18\xc4\x8a\x48\xc8\x3c\x2a\xfd\xe3\x56\xa5\x7a\x3d\xbf\xa4\x71\x16\x82\xbb\xd2\xcb\xa3\xd1\x46\x14\xce\x12\xc9\xd1\xc0\x1d\xe6\x6c\x9f\x61\x25\x17\x4a\xfc\x4e\x4d\x9a\xf4\xb8\x00\x5b\xaa\x81\x0f\x67\x93\xc5\x16\x99\x0e\x87\x53\x5a\x55\x9b\xcd\x4e\xfe\x41\xa9\xea\xf9\xd2\x9e\x9f\xa2\xd5\xc4\x0f\x21\xb8\xf1\xc0\xfe\x8b\xac\xfa\xc3\xb7\xef\x4a\xbe\x86\x09\xcd\x94\x50\xee\x6d\x5c\xa2\x90\x95\xce\x84\x2b\xb3\x95\x62\xcb\xab\x4d\x97\x6e\xfd\x08\xa4\x1a\x0b\xa1\x21\xa5\xdf\x3e\x98\xc6\x26\xd7\xeb\x38\x63\xf2\x9a\x0d\xbe\xe0\x86\x6f\xb3\x0e\x2c\xfc\xe3\x36\x16\xc0\x53\xfa\x3e\x0e\x1e\xb8\xfc\xe1\x55\x3c\xfd\xb7\x04\x13\xc5\xc2\xad\x45\x2b\x56\x2b\x2c\xfe\xb0\x9a\xf1\x9d\xdd\x7f\x8b\x1a\xac\x7c\x9a\xf4\xac\x3e\xb6\x17\xa8\x0e\x37\x94\x8e\x88\xeb\x41\xef\x2d\x97\x17\xa3\xba\x5e\x38\x0f\x79\x8f\x02\x25\x0e\xe1\xb1\x10\x3c\x8b\xc4\xfa\xd8\x7b\xc6\x6e\x01\x5c\x29\x41\xdb\x03\xe5\xea\x04\xe2\xb6\xdf\xfa\x8d\x97\x6f\xe5\x46\x69\xb8\x58\x9e\x50\xf0\x1e\xe1\x22\x67\x8c\xce\x8c\x31\xd9\x88\x82\x18\x47\xb4\x1e\x27\x42\xc6\x07\x64\x2b\x45\xa5\x36\x13\x9f\x4c\x18\xa9\x3c\x5b\x3e\xd8\x0e\x0d\x92\xa7\x11\xa5\x58\x72\xcc\x24\x33\x14\x8f\x83\x0a\x09\x1e\x08\x61\xc0\x39\x4f\xbb\x98\x46\x11\xc4\x78\xfd\x42\xab\xc6\x58\x3b\xdb\x63\x67\x25\xd3\x77\x44\x77\x9b\x43\x8b\x54\x05\x3b\xea\x6a\x36\x10\xb7\xe4\xa2\x56\x9b\x5f\x8f\x9d\xb3\x41\xf8\xbb\x25\xad\xf7\x91\xef\x52\xc2\x4d\x6b\xc8\x1e\x7a\x5a\x0e\x31\x01\x3a\xf9\x3f\x3a\xac\x7c\x71\x67\x6e\x87\xde\x26\xa9\xaf\x9f\x15\xe9\x85\x6e\x2f\x0b\x53\xd0\xe2\xe1\x89\x18\x6e\x78\xd1\xee\x23\xfa\xc2\x03\x83\x92\x85\x65\x7e\xd7\x9f\x41\xd1\x26\x51\x0a\x64\x87\xb8\xe5\xbd\x12\xac\xd9\x8f\xad\x2b\x6e\xb4\xcb\xab\xa4\xa6\xd6\x6e\x92\x50\x03\xf0\x60\x79\x6d\xe4\x6e\x46\xa5\x0e\x36\x3f\xe3\x5a\xa6\x75\x2f\x5a\x1d\x50\xa9\xe6\xd3\xa1\xb2\x03\x9b\xac\xd7\xc7\x08\x68\x8a\x76\xe0\x96\xae\x5d\x77\xf3\x97\x72\x0a\x10\x4e\x05\x21\x3f\x99\x27\xec\xd8\x3d\x28\x77\x6f\xa6\xba\xe9\x1f\x49\xd1\xe2\xe7\x44\x20\x6d\x7b\x1c\xd4\xae\xd2\x2e\x75\x95\x13\xfd\x35\x69\xf1\x71\x0c\xa9\x04\xba\x17\xa9\x49\xc4\x10\x13\x89\x3d\x6e\x84\x5b\x72\x63\x6a\xc8\xf0\xc7\xf3\x19\xd8\xff\x9b\x35\x85\x8a\xc1\x05\x83\xed\xbd\x5d\x27\x38\xc8\x8e\x3d\x2c\x94\xfb\xa1\x7b\x82\x44\xd0\x01\x91\x10\xbc\xdd\xb3\x13\x9d\x29\x9d\x13\xaa\xc6\x63\x3c\x89\x26\x3a\x40\x5b\x6b\xa9\xe3\x3e\x9c\xa3\x57\xc4\x34\x32\x2d\xa6\xc6\x44\x30\x4f\x23\xd5\xb4\xdc\x33\x7d\x3b\x2c\xf5\xff\x14\xac\xce\xb0\xc7\xa1\x00\xa8\xf5\x65\x6c\xd3\x92\x74\xd4\xda\xca\x5a\x86\x42\xa3\x9e\x5c\x2e\x97\x56\x5a\xdd\x74\x78\x9c\xda\xf6\xa8\x84\xa2\xb5\x03\x74\x90\x80\x99\x42\x52\xb7\xa2\x92\x1a\xaa\xe4\x51\xcd\xd9\x31\x23\x87\x77\x6f\x20\x36\xeb\x10\xc7\xdd\x98\x9b\x55\x1a\x32\xf5\x8a\xd7\xb4\xff\x6f\x30\xf0\x2f\xe3\x07\x85\x60\x51\x42\x40\x48\x8b\x90\x99\xcf\x7b\xf2\xdd\x9b\xda\xed\xf5\x05\x1b\xa4\xaf\x59\xba\xc9\xc2\xcd\xe9\xbe\x44\x72\x30\x01\x83\xe8\x15\xbd\xeb\xfd\xd7\x80\x12\x81\x15\x55\xf2\x09\xd7\x4a\x62\x96\xe5\x69\x89\xe6\x4b\x89\x23\xe4\x2e\x7c\x47\x7c\x55\xa7\x82\xe3\x55\x41\x4a\x34\x3e\x25\xca\x80\x68\x36\xd6\xe7\xcb\x0e\xf1\x27\xdc\x45\x8e\x6c\x6a\x25\x04\x1a\xea\x6e\xd7\x8c\x6e\xe7\x37\x96\xfc\xd1\xac\x14\xdc\x52\x36\x12\x20\xd2\x2e\xd5\xc7\xb8\x73\xe7\xa9\x8c\x41\xaa\xaa\x13\x7c\xd1\xe2\x86\x82\x4a\xf7\x53\x67\xa1\x72\xf7\xf7\xcf\x7c\xf0\x7b\x4d\x03\x03\xc0\x4a\xbc\xb3\x06\x19\x0c\x05\x41\x8a\xaf\xa3\x2e\x5f\x3b\x7c\x37\x60\x1d\xc4\x9b\xf6\x38\x3b\x13\xb6\xcd\x28\xc6\xbd\x89\x91\x5a\x26\xa6\xfe\xc6\xb1\xff\x32\xac\x50\x08\x25\x2c\xcc\x1b\x20\xda\x5b\x65\x56\x43\x33\x68\x7b\xb2\xb1\x5f\x6a\x2b\xc3\xca\x6f\x17\xc5\xe7\xfa\xa6\xe4\xd7\x3a\x66\x10\x9f\x7e\x6e\x28\x67\xa7\x0b\x08\x2e\xe2\x09\xf4\x7a\xc6\x39\xb7\x14\xa3\xbb\x32\x7f\xee\x44\x8e\x0f\x4d\xd5\x9b\x1c\x9f\xc2\x97\x84\xc5\xa7\xa2\x8d\xfd\xaa\x87\x8a\x03\x88\x9e\x28\x06\x32\x5f\x16\x46\x1d\xd9\x8c\xbf\xbb\xfe\xe5\x4c\xca\xda\xa4\xad\x3f\x62\x2e\x7c\xf1\xba\x8b\x9d\x30\x62\xed\x8e\x81\x17\xc4\x4c\x75\xbf\x8b\xd7\x63\x9f\x61\x98\x5d\x78\x33\xc4\x52\x13\x7d\xdf\x3e\xe5\xdf\x80\x07\x43\x24\x30\xb9\xc3\x15\x3e\x3d\x64\x4a\xf2\x17\x19\xf8\x4f\xf3\x0a\x51\xc0\x82\x47\x04\x90\x81\x97\x3f\x51\x4a\x5c\x72\x3f\xd1\x11\x86\x59\x7c\x25\xd6\xf6\x30\xa9\x9c\x7e\xcf\xaa\xc0\x1f\x62\x4a\x48\xc4\x2f\x23\xfa\x11\x7b\x0b\x50\x62\xa5\xa9\x58\x33\xe4\x9e\xd9\xd8\xf3\x9a\x96\xaf\x47\xd9\x3f\x97\xec\x03\xe9\xe8\xf4\xab\x77\xb4\x51\x18\x64\xf8\x1c\x19\x56\x57\x60\x81\xec\x62\x02\xb9\xea\xe9\x9d\x6a\x7d\x1a\x75\x92\x9c\xeb\x53\x8a\xf6\x75\x35\xcb\xbe\xb4\xb7\xdf\x5d\x1b\x12\x9a\x9c\x65\xde\x82\x90\x92\x3b\x9a\xd4\xeb\x62\x6b\x3b\x3b\xc8\x46\x7f\x61\x71\x82\xe2\x4a\x06\x8b\xa6\x34\xe3\x1e\xee\x3d\x4f\x2d\xb1\x46\x18\x7b\x34\xc8\xa6\xef\xc6\x14\x7b\x2f\xf2\xec\xbe\x13\xaf\xeb\x39\xd7\x0c\xe2\x69\x4a\xa4\x98\xd5\x97\xfb\x4b\x81\xca\x38\x0b\xf8\xcf\x22\xa2\xb8\x60\xe0\x2f\xc1\x91\xb9\x2d\x2c\x7d\x5c\x81\x80\x55\xa5\xa2\x1b\xee\x81\x79\x34\x9b\x42\xcf\x4a\x15\x39\x12\xc2\xfd\x40\x83\x59\x53\x02\x76\x96\xc4\x87\x29\x1b\xf9\x65\xff\x09\x3d\x9c\x32\xec\x5b\xf5\x67\xf5\x55\xac\xd4\xf8\xa0\x31\x35\x6c\x23\xfb\xd8\x2f\x2e\x9b\xa4\x6f\x9a\xff\xe6\x08\xfe\x65\xe5\xa1\x10\x11\x18\x74\x90\x01\x0b\x8e\x60\x11\xae\xca\x42\x8c\xa7\xfb\xe9\xf5\x90\x4f\xa5\xe4\xe1\xd3\xc4\x15\x73\x36\x99\xa2\xe1\xea\x8b\x89\xc3\x76\xd3\x0c\x00\xd3\x5b\xdb\xa6\xbf\x36\x19\xb0\x3e\x73\x4e\x87\x5f\xf0\x59\x89\xd6\x96\x3b\xde\x97\xb5\x07\xcd\xf4\xf3\xeb\x86\x57\x18\x3c\x1d\xb0\x63\x80\xba\x6f\xf8\x64\xfa\x65\x97\x6b\x5f\x40\xc3\xa0\x24\xfa\x26\x44\xfc\xe9\xfd\x14\xe6\x34\xb4\xd2\x8e\xe6\xfa\xe6\xc9\x24\x0b\xa4\x60\xc1\x6b\x7f\xe5\x62\xc3\xaa\x9c\xcb\x6b\x88\x91\xdd\x90\x92\x49\x44\x61\x17\x66\x3f\xe4\x10\x22\xd9\x88\xa9\x77\x1b\xda\xc5\xa7\x6a\xfb\xf7\x87\xf8\x97\xfd\x86\x42\x92\xff\x5b\x00\xd6\x48\x49\xf0\x3b\x94\x0e\x95\x55\xd2\x46\xcf\x37\x7c\x43\x53\x97\x38\x46\xcf\xfd\x6c\xfa\x79\x8c\xc8\x68\xa1\xb3\x89\xe6\x4f\xb0\x85\x9c\xf6\xb6\xfc\xb6\x3b\xeb\x50\xe7\xf0\x3b\x4d\xdd\x1c\x6d\x87\x3d\xf1\xa9\x20\xc1\x0f\xc5\xae\xe4\x95\xeb\xa3\xab\x1c\x45\x2c\xe0\xfe\x7e\x40\x55\xea\xeb\x2d\x23\xde\x1e\x5c\x1e\x9e\xc8\x6d\x4d\xd2\xac\x5a\xda\x0c\xd2\xd9\x61\x59\x6f\x97\xae\xc4\x44\x34\x70\x04\x2b\xe6\xaa\x7c\x56\xb3\xe2\xfd\xdc\x0b\xb4\x6b\x9f\x64\x1f\x1e\xbe\x46\x7e\x68\x1a\x66\xe7\x5f\x80\xbd\x22\x7e\xb1\xd8\x2c\xfb\x99\xb7\xe2\xef\x8d\xf7\x4f\x7f\x03\x22\x02\x0b\x4b\x0d\xdc\x78\xd8\xef\x16\x2e\x55\xb5\xe6\xba\x51\x5f\x39\x35\xa3\x4b\x51\x06\xbb\x8f\xe7\xe0\x23\x44\x0a\x36\xe6\xb6\x15\xf5\xfa\x74\xf4\xaa\x00\x4a\x2c\xfa\xbf\xf9\x12\x91\x74\x9c\x82\x24\x1b\x7f\xdd\xbf\xcb\x8d\x89\x68\x50\x1a\xf1\x21\x9d\x57\x06\xbb\x93\x1f\xa5\x38\xf5\xeb\x25\x58\x06\xf7\x4e\x9b\xe9\x41\xb6\xb2\x95\xeb\x05\xe5\x44\x16\x42\xfb\x11\x6b\xee\x04\x09\x37\x37\xd6\xf8\x12\x01\x01\x77\xda\xc1\x8c\x23\x18\xf9\xf7\x26\x6c\x95\xb1\x92\x0c\x48\xdb\x7d\xb0\x7b\xe2\x32\xc9\xe6\x62\x13\xb7\xd7\x79\x83\xa7\x12\x80\xb8\x51\xc6\x72\xfb\x6b\x18\x10\x7d\x2d\xe0\x2c\xe4\x6f\x58\xfe\xcb\xeb\xf7\x43\x9e\x4d\xfa\xa5\xb2\x07\x03\xe9\x52\xaa\x0d\x6d\x28\x8a\x82\x7c\x57\xcb\xeb\xa6\x37\xe7\xb3\xff\x43\x08\x8e\x75\xf2\x90\x6c\xfd\x56\xf9\xc5\x45\xbe\x21\xd4\x7d\xbc\xf3\x92\xd7\x6d\x75\xb5\xae\xf0\x02\xee\x2c\xa4\xf5\x98\x66\x33\x54\x16\x0a\x79\xa8\xf7\xbe\x01\xc3\x79\xaa\x11\x5c\xfd\x51\xa1\x0e\x84\x52\x0d\x6b\xf6\xda\xfc\x53\x7e\xf3\xf6\x7b\x8e\x34\x47\xbc\x79\xfd\x3f\x7b\x1b\x2a\x1b\xe3\x40\x90\xce\x74\x26\x49\x83\x19\x61\x42\x91\x2e\xc8\x1e\x19\x11\xff\x99\x61\x7c\x28\xab\xd5\x0c\x92\x7b\x2c\x89\x60\x6c\x3b\xf9\x4e\x0a\x07\x28\xda\x39\xad\x54\x60\xe7\x8d\x3c\xcb\x98\x91\x08\xae\x1e\x41\xa0\xdf\x14\x51\xb3\xef\xbc\x96\x86\xc0\xeb\x7c\x39\x6f\x7f\xaa\x6c\x02\xb6\x3c\x43\x1b\xc3\xd9\x0e\x55\xab\xfe\xc3\x9c\xce\xb6\xf5\xa5\xe8\x88\x55\x8d\x3f\xdc\xc4\xca\x46\xb7\x6b\x55\xee\xf6\xc9\xbb\x70\x4e\x80\x1a\x44\x42\xf0\x5b\xb5\x7d\x03\x4f\x43\x6b\x4d\x3b\x95\xa9\xdd\xac\xc4\x54\x6a\xaf\x5d\xb2\x73\x4f\x3d\x2c\x89\xd2\xce\x3b\x68\xd4\xa3\xe4\xda\x83\x6f\x2b\xbb\xa1\x8f\xc1\xd6\xd7\x14\xb4\xaf\x3e\x53\xbb\x84\xb2\xa5\xbb\x51\x8e\x0c\x2f\xdb\xa4\x6a\xad\x8f\xfb\x53\x64\x41\x8f\x76\xbe\xc2\x0e\x93\xbb\x70\x8d\xf5\x41\x24\x8a\x94\xe1\xd8\xfd\xa5\xdd\xc2\xe2\x9e\x3c\xd5\xea\x0f\xcc\xa7\xeb\x0f\x9d\x64\xd0\x26\x40\x54\x8b\x23\x5b\x35\x06\x81\xcd\xdd\xfc\x2b\xd5\x37\xcf\x60\x56\xd9\xc4\x57\xf7\xa8\x09\xf8\xcb\x85\x27\xa8\xf0\x1f\x94\xa2\x08\x67\x01\xb3\x77\xf0\x61\x70\x5c\x45\xab\x88\xbd\x22\xe4\x5e\xbb\xa8\x58\x48\x02\xfd\x99\xea\xac\xb8\x01\x99\xc1\x74\x1c\x56\x1e\xd5\x7f\x68\x21\x32\xd2\xe7\x0f\xe1\x86\x79\x58\x7d\xfc\x6f\x09\xd6\x4f\xc3\xa3\x56\xce\xf6\xc9\xc2\xe7\x7f\xcd\x8e\xd5\x4b\xf1\x14\xb5\x0b\x7d\x06\x75\xf5\xb2\x2a\x42\x2b\x70\x27\x21\x16\xb2\xe2\x1c\xc9\x5f\xf5\x1c\x9f\x52\xb1\x0d\x55\x09\xe2\x8f\xfd\xda\x58\xd2\xcf\x64\xf0\x91\xef\xf1\x42\x62\xf6\xff\x4d\x36\x2f\xbf\x75\x88\x2c\x9f\x51\x63\x35\x6b\xd7\xe7\xb2\x3d\x4f\xf6\x31\x98\xf0\x01\x61\x85\x93\xfd\xb3\x4f\x56\x18\xc0\x78\x62\xf0\x27\xe2\x1c\x05\xdd\x71\x15\x85\x55\xfa\xbc\x53\x7c\xc7\x1e\xcb\xda\xd7\x86\x8e\x82\xcf\x88\xc1\x04\x21\xe2\x94\xee\x3f\x6d\x04\x09\x7c\xc9\x74\xbb\x46\x5e\xac\x4c\xd9\xeb\xf0\x59\xa3\xf1\x2e\xb6\x38\xc3\xb8\xde\x8c\xd9\x8b\xc1\x5d\xfa\x30\xce\x6d\x24\x56\x3f\x7e\xbf\x62\x3e\x90\x56\xbe\x76\x6a\x68\x1f\xcf\x51\xbc\xcb\x25\xcd\xa5\xd8\xab\xc3\xd8\x29\x42\x35\x6e\xb0\xdd\x9c\x3e\x79\xdf\x1a\x60\xd1\x19\x99\x90\x66\x20\x23\x44\x9c\x71\xb6\x8e\x11\x9f\x66\xe2\xaf\xa8\x6f\x69\x38\xed\x3d\x5c\x0e\x53\x93\x4c\x75\xd8\xe9\x69\x0a\x07\xbf\x4f\xe2\x8d\xfd\xfd\x44\x4d\xf9\x63\x9f\xf4\x0c\xe2\x7b\xe3\x5f\xf2\xa7\xb5\x8b\xfb\x61\x06\x13\x2f\x13\x4e\x82\xb4\x0e\x0d\xf8\x9f\x00\x0f\xac\x53\x81\x2a\x41\x47\x22\x6e\xbf\xc6\x5f\xe7\xd0\x30\x87\xdb\x16\x89\x34\xed\x23\x9b\x2d\xc8\x8c\x4d\x3c\x61\xb2\x37\xbf\x20\x01\xfc\x34\xbb\xd5\xda\xba\x2f\x30\x49\xaa\xab\x99\xb0\x0d\x2c\xfa\x92\x2d\xf8\x3b\x4f\x67\x72\x9a\x2c\x29\xc4\xfa\x70\xf2\xe0\x8c\xbb\x81\xb6\x63\x3e\x52\x23\x3d\x4a\x13\x69\xfc\x0c\x14\xf2\x2f\xf1\xd4\x8e\x31\xe4\xe9\x9b\xd9\x3b\xbb\xf0\x3a\x5c\x4e\xee\x7e\xed\xdf\xab\x60\xfc\xa7\xc6\x07\x51\x98\x39\x88\xd6\x08\x87\xc8\xdb\xd6\x47\x2f\x7f\x36\x87\x5c\x81\x48\xeb\x03\xac\x21\xe3\x9c\x37\x53\xf3\x13\x17\x25\xe0\xac\x30\xfd\xf6\x28\x41\xbc\xd3\x5f\x30\xd8\xdb\x08\x5e\x15\x9a\x81\xc7\xcf\xb1\xcb\xa8\x1b\xd4\x09\xe2\x6d\xc1\xc8\x3b\x47\x2c\x5a\x06\x47\xed\x57\xb2\xbc\xd3\x19\x61\xfb\xda\xff\x3e\xd6\x93\xf0\x8f\xb1\xae\x34\xc9\x6e\x35\x82\x9f\xf7\xea\x6a\xab\x06\x93\xbd\x87\x14\x31\x20\xca\x66\x11\x3e\x28\x62\x54\xde\x1f\xf9\xd3\xd6\x56\x93\xee\x43\x4b\x14\x51\xf0\x81\xbc\x22\xa6\x84\xcb\x7b\xb7\x96\x85\x9c\x46\xf2\xc7\x05\x78\x52\xbd\xbf\xb1\x59\x4e\x8f\x93\xb4\x8c\xfc\x0c\x03\x6d\x46\xa7\x8c\xb9\x90\xff\x6c\x8a\x97\x66\x75\x84\x46\xa6\x79\x74\x0c\xa8\xee\x2c\x91\x99\x20\xb6\xa3\x66\x21\x6f\x55\x3a\x4e\xd5\x7d\xa5\x53\xd5\xcc\x50\x2b\x1c\xb3\xe8\xbc\x92\x3b\xa8\x1e\x1b\xca\x37\x0d\xf6\xde\x56\x18\x4a\x59\x3c\xff\x9d\x48\x62\x99\xfc\xf9\x7e\x50\xe0\xa9\x2c\xeb\x83\x8e\xdd\xca\xa6\x4e\x83\x15\x81\xf1\xe7\xa9\x85\xf6\x26\x70\x56\x6a\xf1\x6f\xc5\x5e\x66\x31\xf0\x7d\xb2\x7f\xd2\xc9\x4a\xc2\x84\x5c\x6e\xeb\xaa\xdf\x15\xad\x7e\x03\x09\x6f\xf7\x94\xa1\x1f\xea\x07\xbb\x0e\x6e\x8e\x93\x25\xf9\xab\xed\xb9\x3a\x4a\x2d\xf3\xfd\x46\xc6\x7c\xdd\x8b\xb1\xf4\x29\xc6\x93\x27\xa9\xa3\x5f\x6d\xe4\x69\x94\xf8\xe3\xbd\x82\x55\x13\xd2\x8b\x10\xfa\x1b\xeb\x2c\x20\x3e\x27\x7c\xe7\xbb\x27\xf5\xb2\x9a\x14\x7f\xd4\xf4\x2f\x0f\x94\xb5\x66\x57\x44\x4f\x80\x1f\x8d\x4a\xe7\xc7\x55\x3d\x76\x81\xc9\xd4\x6d\x43\xfb\xca\x98\xe0\xd7\xa5\xb2\x84\x9a\xf0\x0c\xe9\x3a\xc5\x4f\x2a\x07\x4b\x9c\xdf\x37\x1e\x25\x5f\xe1\xc6\xb3\x21\x66\x11\xdb\x73\xd7\xe1\xfb\x89\x07\x93\xb4\xb4\xe0\xef\xf1\xc0\x27\xea\x25\x34\xf1\x1d\xcc\xa1\xfe\x6a\x0c\x01\x9f\x29\xbb\x84\x94\xe7\x76\x83\x5d\x2b\xd2\x96\x96\xc3\x72\x51\xe1\x1c\x04\xc8\xe3\xe1\x19\x23\xb1\x74\x10\xa3\x49\x74\x56\x46\x81\x72\x2c\x8e\x8d\x05\x9d\x16\x0b\x31\xe5\xd9\xdb\x1d\xb5\x12\xb5\x84\x36\x78\x56\x1f\x8b\x91\xee\xb5\xb5\xe7\xce\xdd\x0b\x89\x58\x3d\x7a\xc0\x5d\x29\x35\xcd\x7b\xb2\x2b\x8d\xf4\xe1\xbe\xd0\x9c\x36\x15\xc1\x6a\xef\x44\xbc\xd1\xf1\x41\xf5\x6d\xc8\x1b\x0a\xb9\xb3\xf7\x3d\x64\x40\xee\x31\x99\x5a\x55\xc9\xe1\x87\xe4\xfb\x4d\x61\xdb\xd8\x0d\x72\x2d\x48\xab\x10\x11\xb1\x71\x1d\x79\x8a\x8a\x53\x42\x95\x37\x22\x09\xe6\xa3\x64\xae\x5c\x81\x90\xf7\xf7\x1f\x83\xc2\x6d\x51\x0c\xfa\x03\x22\x9b\xf3\x7c\x5b\x10\x84\x0b\x89\x65\xb7\x02\x47\x4d\xba\xde\xd3\x48\x60\x4e\xef\x4a\x7f\xde\x14\xe9\x2d\xdb\xf7\x4b\xe7\xf9\x17\x50\x92\xf7\x75\xab\xaa\xc5\xdf\xd3\x71\x30\x6e\xeb\x9a\xb7\x5f\x38\x59\x01\x18\x4f\xeb\x15\x1a\xad\x2f\xc5\xab\xf0\x0e\x8c\xcf\x7e\x75\x85\x8d\x0c\x4a\x61\xd8\x39\xa4\x16\x2c\x05\x4f\x16\xe7\xd6\x84\x0d\x0b\x83\x7c\x57\x18\xf3\x9c\xbf\xb9\xd0\xc5\x74\xe7\x03\x66\x07\x7f\x8c\x66\xd7\xa5\x88\x86\xec\x44\x8a\xec\xd1\x5d\x7f\x6a\x89\x8a\xef\xae\xf8\xfc\x38\xa8\x2b\xd5\x2d\x43\xfd\x4e\xe0\xe0\x3c\xf3\x6a\x06\xc1\xeb\xde\x59\x53\x44\x9b\x49\xd2\xfe\xcb\xe2\x15\xa4\x9a\x09\x3b\x43\x6a\xd0\xb2\xa6\xd5\xfb\xa9\x57\x1c\x75\x4e\x64\x7f\xe0\xd8\xe6\xa1\x2a\xc3\x78\x73\xc2\xb3\xa7\xc3\x48\xf1\xf5\xc7\xa2\xd9\x71\x32\x22\x99\x14\x78\xfa\x92\x71\xfa\x0f\x49\x68\x79\x2e\x87\xb7\x22\x16\xe4\xc3\x9f\xdc\x07\x24\x7f\x53\x4f\x50\xe6\x29\x30\xb8\xf7\x92\x9c\x94\x4e\x85\xfd\x5f\xd7\xe9\x5f\x86\x02\x0a\x41\xf5\x81\x41\x00\x5c\x27\xdc\x5c\x1b\x77\xc9\x7e\xcd\x9f\xaa\x81\x69\xb0\x62\xc3\x8d\xce\x9c\xdc\x95\x0b\x6d\xc8\x1f\x3f\x06\x87\x5b\x7f\xbf\x54\x96\xee\x02\xf4\x9d\xec\x28\x56\xfd\xf5\x0d\xd7\xc5\xba\xce\xb8\x37\x9c\x75\xbf\x01\x39\x76\x90\xdc\x06\x55\xd8\x26\xcb\x2a\xfa\x13\xe2\xfb\x57\xd2\x80\xe8\xb3\xad\x78\x3b\x74\xbf\xf7\x3f\x69\xf0\x84\xb8\xaa\xbb\x3f\xe3\x19\x6a\x7d\x83\x88\x31\x7f\x19\x10\xc3\xd9\xb0\x0b\xe1\x97\x06\x1b\xfb\x38\xed\x34\x7b\x84\xa1\x7d\xee\xc9\x5b\xfa\xa0\x6e\x1b\x3a\x40\x4f\xa1\x5c\x11\x54\xff\x72\x83\x8e\x00\x56\xf6\xcd\x76\x5a\x0e\xe3\x5f\x7f\xf7\x5f\x86\x0d\x2a\x96\x45\x09\xbe\xf6\x15\x86\xfd\x42\x27\x61\x25\xb5\x9f\x2d\x23\xa0\x43\xbb\xf4\x1d\xe7\x68\x3e\x5a\x52\x69\xf5\x70\xe5\x5f\xee\xf8\xa0\x6c\xa8\x83\x04\x16\xee\x34\xe0\xa7\x46\x93\x49\x1d\x8d\xa7\xd4\x3b\x77\xbc\x8c\x61\x16\x6b\x7f\x9b\xb6\xe6\x78\xd0\x24\xfe\x16\xef\x3a\x2b\xfb\x38\x1f\x2c\x6f\x21\x98\xc4\x3a\xad\x91\x1a\x0b\x68\x71\x2b\xab\x97\x26\x73\xe7\x1a\xd6\xaf\xaa\xfa\x56\x75\x60\x29\x7b\x21\x40\xee\xf4\x07\x7c\xf3\x54\xc9\xfb\x39\x16\xb7\x41\xf3\x04\xee\xc8\x51\x7b\xa1\xc0\xba\x89\xba\x8a\x93\xc1\xa0\xa9\x85\x66\x80\xc5\xcf\xbf\x43\x5e\xf5\xd5\x5f\x7f\xf7\x9f\x16\x13\x02\x0b\x83\x06\xfa\xbb\x1f\xbc\xe5\x05\xea\x1b\xea\x76\x70\x3e\xf8\x53\x86\xce\x54\x17\xa7\x5d\xa1\xfb\xa2\xd1\xd8\xf1\x10\x8e\xa4\xc1\xc6\x7d\x5f\x41\x00\x94\x40\x82\xc9\x66\x94\x08\x6d\x72\xaf\x68\xfc\x53\xa7\x4b\xb4\xd8\xa1\x08\x5f\x00\x27\xbf\x8c\x64\xae\xe4\x5a\x57\x47\x21\x94\x17\x0b\x88\x5e\x1d\xaf\x7e\xd1\xab\x14\xd2\x89\xc7\x78\xc0\x78\x77\xf9\xc2\x0b\xc5\xf1\xc1\xa2\xc6\xd5\xfd\xdb\x0c\x2a\x5f\x1e\xfc\x2a\x5c\x3c\x20\x8a\x12\xd2\x6c\xba\x1d\xfa\x5d\x2a\x65\xbd\x37\x73\xb7\x6c\x3c\x10\x53\x62\x01\x11\x33\x5a\xd7\x9b\x6c\x3f\x91\xed\x77\x72\x9f\xc8\x23\xa1\xd3\xbf\x8c\x31\x04\x05\x86\x16\x9c\xda\xb9\x68\x32\xfa\xfe\x70\x19\x69\xf9\x26\x56\x76\x5e\x18\x6c\x27\x4b\xc2\x3b\xe2\x70\x85\xfe\xd2\x3a\x76\x1e\xdd\xfa\x02\x6a\x10\x9f\x94\xdb\xb1\x50\x96\x9f\x77\xa3\xce\x2c\x8d\xa1\xdb\x5c\x35\xa6\x9b\x7f\xb9\x53\x14\x49\x23\x9c\x38\x52\x2f\xa4\x2c\xf0\xf3\x1a\x24\x1b\xb7\x57\xb1\xce\xec\x16\xfd\x14\x26\x87\x80\xd2\xb8\x34\x2e\x25\xee\x0a\x8b\xca\xd5\x4c\xf0\xea\x94\xb1\xb3\x58\x87\xf1\x74\x46\x1e\xa4\xa9\xf0\x7f\x37\xde\xeb\x64\x8f\x08\xcb\x95\xfa\x96\xac\x88\x73\xc0\xfd\x0a\x53\x40\x85\xc9\x9b\x6d\x22\x53\x27\xf4\x49\xfa\x62\xf3\xf9\x34\xec\xff\xcd\xce\x43\x45\x21\x20\x9d\x7f\xb5\x91\x1a\xa3\x85\x44\x6f\x1e\x9a\xb2\x28\xd5\xf1\x40\xda\xc6\x5d\x9d\x7c\x18\x3b\x3c\xf7\x1f\xc8\xcd\x2d\x6f\x1e\xe1\x22\x48\xb8\xee\xcb\x71\x7c\x2c\x11\x46\x85\xcf\xb4\x60\x75\x58\x99\x16\x5e\x23\x95\xd1\xfd\x13\xb5\xe7\xfb\x77\x37\xe7\xf5\xf0\xbb\x83\x42\x07\xe0\x62\x7a\x39\xbe\xc1\xbb\x52\x33\x7b\x2e\x6f\xaf\x78\x34\x6d\x2c\x1a\xf9\xeb\x14\x6b\xb4\x95\x0a\x8a\x7b\xcb\xd7\xce\xb8\x9d\xec\x07\x14\x49\xd7\x7e\xf1\xb0\xb5\x21\x68\xe5\x7a\x67\xb8\xab\x15\x1b\x6c\x9c\xec\x1b\xb4\xb1\x4b\x67\xa2\x7e\x7f\x66\x1a\xc1\xe3\x11\x0a\x85\xfb\xbb\x65\xff\x72\x0a\xa0\x10\x4a\x18\x4a\x6c\x60\xcb\xda\xf9\x98\x48\x3f\x27\xab\x1f\x0d\x72\x18\xb6\x42\xd2\xa7\x34\x1c\x87\x82\x02\xe2\xb9\x4e\xbd\x30\x71\x8c\x42\x87\x7a\x6b\xc0\x92\xb3\xf1\x94\x3f\x9a\x9e\x35\xf4\xf9\x3b\x97\x16\xd6\x82\xd9\x99\x02\xe3\xfc\xc6\x9b\xc8\x4a\xd7\x38\xd8\x9f\x2c\xed\x79\x57\xbd\x9e\x01\xa2\x6f\x97\xf0\x85\xad\x0d\xaf\x29\x33\x51\x9f\x72\x64\x6c\x8e\x8e\x4d\x37\x18\x25\xe2\xd2\xec\x18\xc7\xcc\xa2\x19\x24\x7e\xb3\x04\xdb\x2c\x26\x2a\x61\x78\xac\xaa\x1f\xf1\x0e\xe0\x96\x5a\xb9\xbd\xd8\xb8\xa3\xf1\xe5\x21\xe1\x77\x35\xe5\x1c\x9b\xa3\xf6\x39\x37\xcc\xa9\xfe\x3b\xb5\x7f\x79\x26\x50\x08\x6c\xb4\x0f\x78\x1a\x3b\xdb\x87\x9d\x36\x71\x3f\xd7\x92\x8b\x72\x9f\x3c\xa3\x8c\xdd\xba\x44\x4d\x8d\x0e\x6a\x1a\x29\xe8\xc1\x93\xe2\x93\xaa\x20\x26\x06\x95\xa0\xde\xa6\xf0\xf1\x40\x30\x57\xab\x15\x6a\x61\x76\x25\xfd\x35\x18\x23\x84\xdb\x9a\x01\x6f\x39\x73\x5a\xf6\x5b\x58\x50\x09\x2c\xb1\x69\xff\x2d\xd7\xb8\xed\x5a\x46\xfd\x6b\x42\xf0\xc5\x1b\xde\x82\xba\xf7\x76\x71\x86\xd8\xcc\xce\x4f\xb2\xa3\x15\x7a\xab\xee\xad\xc1\x92\xc2\xfc\xdc\xd1\xe3\x6d\x7c\x9d\x6f\x1a\x9f\x7c\x3f\x3f\xa7\x98\x65\x59\x3b\x4b\xd8\xee\x1d\x8c\x7e\x56\x0e\x8d\xdd\xdd\xfa\x81\xa4\x7b\x3e\x05\xfb\x7f\xf4\xa4\x44\x45\x10\x80\x67\x37\x6a\xa4\x6c\x34\x4f\x4a\x1c\x3f\x84\xd0\x57\xaa\x50\x71\x44\x66\x63\xf9\xb2\x82\x3b\xdc\x05\xd8\x68\x24\x32\xef\x1f\xd2\x08\x00\x66\x5d\xb0\x7a\xd6\xd5\x81\x24\x20\xfd\x23\x3a\x1b\x21\xee\x6b\xbe\x7a\xee\x0c\x87\x6c\xef\x08\x41\x83\xb2\x04\x36\x1b\x6b\x29\x0e\x84\x47\xc9\x36\x33\x5f\x1b\xfe\x30\xda\x54\xf3\x0a\xaf\xfe\x68\x1e\x45\x5a\x8d\x64\x3f\xda\x39\x21\xe7\x98\x5c\x8a\xfa\x78\xb8\x4a\xdb\x62\x60\x5a\x74\xa8\x13\x46\x1e\x35\x9e\xee\xa7\xef\x35\xc6\x57\x55\xc8\x43\xa0\xaa\xe8\x3d\x67\xd2\x3d\xfd\xf4\x02\x5c\x96\xaa\xe7\x92\x4d\x7f\x77\xec\x5f\x5e\x17\x14\x02\xc5\xfa\x0f\x65\xf4\x32\xe7\x88\xc3\x13\x65\x94\xf3\xc4\x8c\x70\x1a\xcb\x5d\xa7\xf5\x2a\x17\xe1\xe6\x79\x3b\x26\x5f\x4d\x16\xbd\x7b\xee\x28\x47\xf0\x61\x9f\x94\x7e\x7b\x95\x24\x0c\xba\xc9\x4a\x2b\x3a\x51\xa4\xbd\xbb\x31\xe8\x17\xf1\x30\xd8\x5a\xc9\xd3\x3a\xa1\x26\x51\xc4\x58\x59\x0b\x88\x32\xcf\x7e\x50\x86\x6d\xa4\xc6\x18\x7f\x52\x5c\x5c\x8c\x09\x9b\x2a\x71\xe6\xec\xcc\x5b\x3b\xbe\xcd\x6a\xca\x95\x78\xd1\xf6\xec\x0c\xb4\xea\xdd\xb6\x6a\x2e\xaf\x31\x5e\x38\xed\xd0\x19\x19\x3d\x10\xb6\x5a\x76\x25\x98\xfc\xc8\xe9\xa5\x82\x37\x64\x22\xe9\xcf\x19\xbe\xfd\x9b\x0a\xf8\x97\x97\x08\x85\x10\x06\xc0\x80\x00\xd6\x2d\xb8\xcc\x7a\x4c\x2d\x2d\xd1\x04\x07\xd9\x76\xe3\x9b\x04\xb2\x39\xb4\x26\x58\xf1\x57\x1b\x14\xbc\x44\x16\x16\x07\xfb\x4f\xfe\x53\xb4\xba\x2e\xf9\x11\x83\x8f\xd3\x25\x5d\xfd\x88\x16\x29\x2b\xcb\x31\x5f\xd8\x95\x42\xd2\x56\xd9\x1e\x73\xc5\xb7\x90\x26\x4c\x43\x02\x2c\x3f\xf4\x73\x11\x27\xe7\x22\x39\x86\x8f\xa0\xe6\x64\x36\xf4\x4e\x45\xbc\xf4\x85\x57\x66\x4b\x84\x9f\xc9\x8d\x3a\x8c\xd0\x0d\x05\x5f\xf6\x1f\xfe\x2c\x0e\x0c\x0e\x90\xe7\x8f\x0c\x7c\x91\x21\x4a\x8d\x20\x52\xe7\xad\xd0\xe3\x4b\x60\x17\x3c\x53\xdf\x15\x38\x3b\x72\x06\x13\x0c\xc7\xfa\x27\x4b\xad\xe2\x3a\x2a\xe4\x45\xeb\x49\x39\xc4\xb9\xbf\x7a\x4e\xc6\x02\xc6\xa3\x07\x3a\xd3\x89\x99\x20\xf3\x45\xa3\x3f\xfe\xae\xc2\xbf\x1c\x1b\x28\x04\x41\x14\x0b\x0e\xc4\x7e\x69\xb1\x3b\xf3\xeb\xad\xe8\xe5\x66\x47\xa0\x5f\xfd\x51\xc3\xff\x11\x9f\xd1\x65\xe7\x5e\x08\x2f\x92\xf0\xf3\x86\xb4\x3f\x9e\x19\xbc\xca\xe7\x59\x74\x72\x08\x59\xc5\x14\xa0\x5c\xda\x97\x9f\x3b\x90\x9f\x46\xb7\xa6\x27\x28\xea\x10\xf5\xbc\x4c\x92\xa7\x5c\x61\x07\x1d\x16\x88\xe7\xd9\x35\x03\x2b\x71\x48\x23\x07\x31\x65\x93\x6b\x02\x74\xb6\xd6\x22\x9a\x41\xab\x66\x13\xb6\x52\xa0\xa0\xa2\x96\xab\x13\x10\xdd\x12\x2b\x6c\x8f\x56\x2a\xda\xbd\xa6\xbe\xe0\x22\xd3\x78\x63\xfd\x1b\x27\xfa\x33\x5d\x75\xc6\xde\x5b\xab\xb2\xeb\x98\xf7\x42\x9f\xc0\x64\xa2\xaf\x26\x6b\x6e\x60\x2a\x09\x5a\xf0\x1c\xef\x6a\x33\x51\x45\xe6\x33\xf9\x77\x1c\xdf\x11\xd9\x2f\x54\x2f\xd8\xa2\xac\x46\x56\xce\x47\xf1\xfe\x7f\xc1\xd4\xba\x0d\xa1\xa7\xbe\x70\xfa\x6e\xf0\x36\x19\xaf\x42\x38\xcb\x97\xcc\xb7\x96\xb5\x0f\x4f\xcb\x82\x57\x96\xd9\xd1\x69\xf3\x07\xa1\x90\x87\x87\x87\x87\x64\x4a\x30\xce\xcf\xd2\x54\x6f\x4d\x0c\x5a\xda\x12\xe5\xf9\xd8\x9d\x36\xe6\x13\x8a\x48\x68\xbf\xae\xa7\x6f\x6d\x23\x0e\x77\xe8\xbc\x2f\x77\x09\xc0\xb4\xc9\xfa\x58\xf7\xe1\x74\x47\xc9\xbf\x74\x38\x9d\x5e\xe7\xca\x86\x5f\xff\x74\xb6\xb1\x15\xe8\x73\x10\x3c\x21\x24\x4b\x8e\x03\xba\x2b\x6b\x3d\xed\x3a\x8b\x32\x73\x2d\x10\xb7\xdb\xe8\x93\xe8\x57\x8b\xf1\x1c\x7b\x5f\xaf\xfc\x2c\x28\xd2\x59\x7e\x3b\x48\x17\x95\x19\xc8\x10\xda\xe5\x64\xc8\x56\x07\xbd\x38\x65\xa9\x71\xbf\x22\xe3\xd8\xf2\x99\x96\xe7\xab\x10\xb1\x7c\x3e\x82\xf8\xcc\xe8\xbd\x83\x90\x47\x12\xe8\xbb\x06\x10\xde\x36\x6d\xbb\x1a\x5d\x73\x76\xa3\xf3\x15\x3e\xa7\x67\xc9\x7c\x22\x14\x61\xd6\xfd\x84\xee\x94\xb9\xfe\x05\x7a\x54\xbf\xef\xa3\x35\x43\xb5\xaf\x3a\x1b\x76\xe6\x70\xbe\x8d\x94\xe7\xe5\x79\xd7\x02\xe7\x10\x3e\xf9\x0e\x51\x90\xf2\x9d\x79\xc1\x87\x05\x93\x9e\x46\xe0\xe1\x58\xd6\xac\xf6\x65\xbe\x76\xf7\xd0\x75\x45\x02\x67\xb3\x9e\x23\xfd\x3b\x06\x56\xaa\x25\x13\x45\x0f\x03\x47\x9f\x77\x17\xbb\x3c\x18\x40\x3c\xc2\x14\xff\xa6\xef\xa4\x3f\x97\xf8\x7b\xf8\x47\xb7\xb9\xd9\xb2\xba\x54\x11\x91\xfa\xc8\xc4\x15\x38\x1e\x8c\x1b\x22\x6e\xa5\x1f\xc0\xa0\xea\x14\xa2\xe8\xa2\xf5\x62\xd8\x61\x6d\xea\xc3\x35\x14\x5c\x2c\xde\xe8\x29\x91\xb1\x8c\xda\x5a\x46\xc9\x75\x63\x2e\x47\x44\xc3\x8f\x92\xa9\x18\xf6\x3e\x98\x1c\x71\x48\xf1\x08\xd6\x9f\x74\xc8\x27\xcd\xf7\xfb\x1c\x9b\x8d\xbd\xab\x0c\x17\x66\xa6\xbb\xbe\xd8\xa7\xb9\x01\x16\xfa\xf9\xe7\x9f\x29\x9c\x88\x2f\x8f\x35\xe8\x45\x2c\xa6\xca\x66\xa5\x2c\x1b\x60\xfa\xb5\xeb\xdb\x64\x02\xd2\x39\x7b\xc6\x56\xa9\x80\x66\xfd\xe9\xcc\x53\x7d\xa7\x95\x93\x6c\x30\x92\x31\x92\xcb\xd3\xb3\x31\x0c\x0e\x51\xde\x45\xfc\xab\xee\xd8\xde\x64\x37\x59\x47\xa6\xbb\xc0\x9c\xb0\x23\x6d\x03\xfb\xdb\x12\x13\x6b\x7d\xc8\xcd\x55\xda\xad\x55\x39\xe9\xd7\x70\x8b\xca\x3f\x8b\x37\xdb\x2f\x45\x42\x05\xf1\x4c\x1e\x07\x85\xa2\x8a\x5e\xe8\xde\xd6\xf4\xcd\xf8\xd1\x3d\xb5\xc0\x8d\x73\x94\x6f\x5b\x49\xe1\xc7\xd5\x17\xa3\xf9\xf4\xde\x3b\x69\xe6\x17\x70\xd1\xdf\x35\x2e\x31\xf1\xda\x2b\x69\xb8\x7e\xac\xe3\xee\x63\xb4\xf5\xd9\x7d\xd6\xa0\xe1\xe9\xde\xf5\xf0\x52\xa7\x60\x07\x56\x8f\xed\x3f\x3d\xcf\xa6\x29\x78\xb6\x39\x51\x3c\x3c\x9f\xae\x72\x72\xec\x4f\x59\x9c\x6e\xf9\xaf\xd8\xc9\x43\x31\x6e\xf5\x03\x6b\x97\x19\x9a\x0f\xd9\x1e\x35\xb5\x5b\x0f\x16\x16\xd7\xde\x68\xd9\xfd\xfa\x70\xfb\x42\x66\x77\x5b\x97\x4a\x0e\x3d\xc5\xba\x9a\xbd\xec\x36\x97\x14\xc5\xf2\x16\xa8\x25\x09\x38\x77\x11\xf6\x81\x6e\x38\xf8\x70\x4c\x4e\x49\x16\xd3\xbc\x8b\x79\x57\x07\xd7\xb8\xf3\x89\x40\x30\xf9\x93\xa5\x67\x3c\x37\xe5\xa3\x64\x7b\x91\x21\x9d\xc7\x26\x71\x14\xaf\xe7\x3c\x62\x99\x02\x5b\xc5\x6c\x6a\xc1\xde\xbd\x7a\x4e\x48\xd3\x42\x95\x2e\x36\xb6\x3b\xd8\x1d\x0a\x1f\x43\x07\x4a\xa2\x78\x7a\x7c\x25\x7f\xb4\xdf\x7e\x0d\x57\xda\x81\x16\x35\x4f\x32\x72\xd2\x6f\x6c\xf1\x7a\x20\x89\x02\x15\xe0\xbf\x66\x6c\x47\xbf\x45\xa6\xab\x39\xb4\xdf\x42\x61\x1a\x5f\x47\xcd\x8b\xd6\xd1\x27\x11\x4a\x8c\x55\x2a\x6e\xb3\xd9\x0a\xdf\x53\x95\x7c\x94\x54\x2b\x3e\x21\x30\x3c\x33\x62\x9d\xca\xb2\x93\xc9\xbc\x15\x2b\xb7\xc6\x30\xfb\x32\x52\x68\x14\x34\x52\x9d\x08\x79\x67\xce\x15\x0f\x2e\xd4\x8b\x7a\x4e\xbc\x54\x26\xc5\x05\xec\x13\xe4\x25\x79\xdf\x5d\xff\x00\x2b\xbf\x7a\x2a\xbc\x8f\xf5\x53\x65\x45\x42\xa1\xe6\x24\xd5\x8f\x9a\x12\x14\xbf\x73\xb8\x0a\x8e\x45\xd9\x0f\x24\x21\x3d\x37\xc0\xc8\x82\xf9\x19\xe9\x88\xfd\xeb\x0f\x52\x75\x3f\x12\xaa\xbe\x39\x11\x40\x0d\xb3\x28\x63\xd2\x04\x87\x37\x95\x4a\xaa\x93\xf8\xfb\xa6\x7c\x4d\x50\xfd\xc5\x5d\x23\x92\x88\xb8\xea\x28\x92\x71\x66\x96\x07\x37\x90\x36\xbb\x4d\xf5\x2c\x35\x15\xe0\x74\xdd\x5c\x60\xcb\xbd\x1b\xa9\xe0\xce\xf4\x13\x35\xd6\x89\xfe\xf6\xe1\xb7\xe8\x1b\x81\xcf\x67\x73\xa0\xcf\x59\x24\x1b\x4d\xd4\xee\x48\xf7\xad\x96\x32\xf4\x5b\xca\x8f\x0f\xe6\xd3\xac\x55\x1d\x05\x75\xc3\x4c\xc3\xa9\x12\x33\xcf\x69\xf2\xf5\x81\x13\xfd\x16\x53\xa6\xb1\x83\x81\x85\x3e\x3d\xe3\x4c\xf2\x13\x7f\xae\x89\xf1\xd3\x3d\x38\x08\x4d\xec\xfd\xfa\xd3\xb0\xd3\xfa\x58\x56\xc0\xe7\x1c\x11\x2d\x6f\x3e\xfe\xe1\x6d\xca\xc4\x18\x78\x9c\x98\xe6\x64\xa8\xfd\xe3\xd3\x4b\xbc\xa6\x80\xe6\x23\x88\x21\xda\x15\xd1\xe5\x3a\x30\x28\xdc\x90\x78\x4d\xf1\x97\xf1\x06\xe7\x6a\x3a\x3b\x8c\xe1\xa2\xf7\xeb\x32\x1e\xfe\x07\x82\x21\x5f\xd1\x6f\x69\x49\x4b\xe5\xe2\xc6\x1e\x07\xd5\x65\x62\xb7\x8f\x89\x84\xbf\xdd\x6c\xa3\x7e\x8b\xbc\xb4\x64\xa9\xc2\xe1\x36\x64\x7e\x4a\x5b\x69\x37\x6a\x00\x87\x1c\x72\x40\xfb\x9f\x54\xd4\xaf\xd7\xe2\x6d\xa3\x37\xf7\x03\xd8\x16\xab\x66\x92\x2b\x31\x19\xc7\x1a\x74\xd8\xaf\x74\x85\x3d\xf1\x78\x30\x12\xa5\x72\x3d\xc1\x08\xfb\x10\xc1\xac\xb3\x68\xe2\xdc\x9a\xeb\xd2\x63\x57\x01\x7d\x93\x36\xaf\xca\x14\x13\x21\xa4\xc5\x64\xb5\x6e\xf1\x39\xf5\x8a\x23\xd0\xad\xde\x05\xf2\x5d\xf4\x93\x95\xf5\xc0\x1e\x4c\xbb\xee\x82\xe2\x74\x5d\x57\x24\xa4\xb6\xbc\x8b\xf9\x97\xe7\x8a\xa4\x45\x96\xac\xd8\xa3\xaa\x3a\xf7\x54\x24\x96\x3e\xa9\x04\x68\x39\x6d\x31\xf4\x0c\x66\x9f\x58\x89\x65\x37\xd6\x9a\x71\xc2\xb2\x2c\x51\x9a\xcb\x5a\xe5\x45\xc1\x0c\x83\xe2\xee\x5d\x4f\xe9\xdc\xc9\x31\x37\x87\xf8\xc7\xab\xaf\x6c\xa9\xd9\x70\xc7\x77\x4d\x46\x36\x3b\x19\x0d\x91\x21\x59\x86\xc0\xa2\x16\xc6\xd2\x45\x39\xd9\xfe\xba\x66\xd6\x0e\x4d\x87\x57\x74\x77\x77\x38\x0d\xa4\xe1\x50\x75\xc9\xb9\x8c\x0b\xf6\x1c\xea\xd5\xf9\xcf\xf1\xab\x60\x5b\x60\x8c\x4b\x10\x3f\x6d\x34\x2f\xd8\x09\xa2\x4b\x70\x66\xc5\x17\x49\x79\x47\x3c\xf2\x36\xba\x45\x01\x06\xed\xe5\x83\x0a\x10\x73\x50\x39\x68\xf9\x13\xb8\xaa\xa0\xdf\x3e\x30\x56\x77\x6c\xcd\x1a\x4f\xfc\x4e\xfc\x16\x47\x18\xb9\x3d\xff\x06\xf5\x5b\x73\x5f\x3b\xa0\x6a\xe6\x10\x9e\xbd\x16\xed\xe4\x21\x8e\x1f\x21\xca\x39\x2d\x4c\x45\x4a\x89\x1e\x79\xbf\x9d\xc8\x9b\xb5\x7c\x3a\xbd\xfb\x23\x0e\x29\xa0\x3c\x6c\x5b\xbe\x5d\xff\x7c\xe2\x86\x67\xb3\x8a\x39\x4e\xbf\x68\xab\x0f\x37\xb4\x9b\xd2\x7c\xea\x69\x41\x22\xae\xb8\x16\x5b\x21\x22\xf0\xa3\xd2\xc1\x18\x3c\x6b\xc3\xc7\x2c\xa2\x7f\xfb\xf5\x5c\x89\xf8\xe3\x0e\x87\xa8\x57\x63\x16\x61\x83\xa5\x65\x72\xf7\x5b\xbe\x99\x33\xc0\xcd\xe4\x2c\xbc\x8d\x63\xe6\xb5\x6b\xf8\x95\xf7\x21\x03\x1b\x5b\x8e\x43\x86\xd2\x90\xb4\x76\xa6\x89\x64\x16\xb9\x2a\x25\x83\x58\xae\xea\x51\x72\xfd\x2e\xc7\x76\x44\x55\x47\x71\x93\x34\x2b\x21\xd7\xff\x8a\x0f\x5b\xcd\x2f\x57\xc9\x98\xdd\xa3\x5b\x5f\x38\xea\x6d\x91\xa5\x37\x08\xc4\xc1\x3d\x20\x98\xe6\x93\xdf\x94\xa3\xb8\x9b\x4e\xfc\xce\xdd\xa1\x46\x9f\x5f\xa6\x2d\x71\x1e\x3d\x4c\x2b\x18\xf6\xea\xcf\x1d\xd0\xd8\x48\xe5\xa4\x46\x64\xd3\xe3\xa5\x74\xeb\xef\x57\xd4\x32\x1e\x97\x01\xda\xb6\x24\x4c\xdd\xd5\x9c\x97\xb5\x05\x51\xe8\x70\xa3\x3f\xae\x81\x41\x2b\x2f\xfa\xf4\x4a\xcd\x1f\x22\xc6\xda\x8c\xf1\xe4\xbe\x69\x9c\xc3\xe6\x0c\x37\xbc\x1e\xeb\xa4\xf7\xbc\x30\x29\xd4\x14\xa7\x04\x40\x80\x27\xc4\xd1\xbf\xb9\x32\xdc\x94\x1d\xa9\xf2\x93\x8a\x79\x8b\x9d\x71\x93\x04\x1a\xe3\xda\x93\xd8\x28\xdf\x9e\x98\x8c\xc1\xe2\x86\x03\x83\x42\xee\x1b\x4a\x11\xf7\x3e\x92\x92\x5e\x2b\xc8\xb2\x85\xbd\x96\x79\x63\x82\xa3\x12\x03\xef\x6b\x31\xba\x40\x54\xeb\x2d\x59\x0c\xe4\xec\xa4\x23\x77\x46\x03\x3a\x04\xdf\x9c\x34\x92\x7f\x61\xda\x3c\x11\x50\x47\xa5\x64\x25\xf4\x40\xdc\xff\x1c\xbe\x6e\x46\xbc\x52\xf2\x05\x58\x7d\x39\x7b\xe3\x08\xb1\xd5\x89\x4f\xb0\xbd\xf2\x51\xd8\xd4\xa3\x89\xda\xb5\x67\x38\xfe\x69\x55\xdf\x76\xe2\xf7\x3f\xc8\x93\x3a\x27\x3f\x0e\x1a\xfa\x9c\x76\xaf\xe3\x62\xf3\x49\xb0\xf7\xe4\xba\x09\x67\x07\x1a\x66\x15\x54\x77\x57\xb7\x0d\x53\xcb\x4e\x91\x11\xdb\x31\x0a\xf6\x51\xf2\x9a\x32\xf9\x82\x73\xe2\xa3\x9e\xd6\xf1\x93\xc1\xc1\xe4\xe7\xf5\xd6\xd1\x5c\x06\x75\x75\xb3\x9c\x58\x3f\x1c\x4c\x34\xe4\x24\x28\x81\x39\x41\xf5\x5d\x12\x74\xec\xb8\x62\x93\xa6\xb6\x73\xb5\x98\x7c\xbc\x48\x91\xda\x6d\x23\x30\xe3\xb0\xe7\x36\x6c\x89\xee\x5a\xf7\x5e\x01\xd5\x69\x1f\x91\xd0\x92\x05\xde\xf2\x3b\xe0\xce\xc7\x5c\x19\x95\x8f\x56\x15\x7e\x6f\x53\x82\xd9\xa3\xfc\xcc\xfb\xde\xed\x65\x9d\xc8\x37\x70\x4b\xff\x70\xed\xf2\x35\xbe\x4f\x47\x2b\x9f\xb1\xb1\xde\x7e\x91\xd0\x81\x35\x99\x73\xb5\x6e\x7b\xa0\x3d\xc9\xd2\x13\xde\xbd\x0c\xe4\x56\xeb\xa1\x0e\xb1\x1e\x17\x92\x24\x3e\xc6\x64\xdb\x5e\x98\x37\xd8\x14\x97\xe2\xf1\x86\x05\xaa\xbc\x9e\x9b\x15\x67\xe8\xd3\x73\x7f\x80\x85\x22\x0a\x7f\xa8\x9c\x3d\x70\x1c\x29\x4e\x1d\xe7\xed\x83\x39\x97\xef\x3a\x11\x7e\xa0\xb7\x7a\xc5\x0b\x63\x90\xe2\x2d\x5e\xaa\x3a\x02\x58\x09\x0d\x62\x9c\x98\xba\x8a\xfd\x88\x78\xfb\xb6\x36\xc3\xec\x03\x52\xa6\x68\x74\xde\xe9\x3e\x6c\x36\x4f\xb4\x3d\x42\x41\x13\x97\x47\x49\xbf\x39\xbc\xa9\xfd\x58\x73\x64\x86\x0b\x18\xcd\x0c\x05\x4f\xd5\x33\xf8\x36\x2d\x7f\x05\x4b\x36\x7d\x07\x7d\xc9\x45\x84\xc9\x67\xc0\xe7\x11\x31\x88\x3d\x74\xb7\xf2\x68\x18\x4e\x89\x0a\x48\xda\x36\x79\xc7\x48\x56\x3e\xc3\x6b\xd0\x73\xcb\x89\x90\x75\xf1\x37\x46\x01\x8f\x5b\x9a\x14\xe5\x27\xa5\x66\x81\x1e\x52\x11\xd0\x46\x6d\x5f\xcc\xc3\x77\x57\x59\xd1\xcf\x9e\xa8\xf3\x24\x55\xe2\xf6\xb3\x6b\x8d\x00\x55\xc1\x31\x01\x1f\x9b\xb2\x53\xfd\xc7\xea\x96\x44\x86\xa5\x89\xce\xc4\xeb\xcd\xb4\xfc\xfa\x75\x54\xe9\x22\x69\x18\xb4\x49\x1e\x8e\x0c\xc1\xfb\xc4\xc6\x8c\x06\x1f\x95\x01\x66\x90\x16\x81\xa7\x4b\x39\x60\x76\x48\xb6\xd2\x13\x13\x86\x41\xa9\xad\xf3\xe5\x53\x2c\x13\x51\xd1\x67\xff\x5b\xb1\xf3\x2f\xe7\x14\x0a\x41\x80\x81\x51\x01\xc2\x36\x14\x97\x12\xe1\xf9\x0a\x89\x6a\xda\x4b\xc9\xed\x5f\x7e\xdb\xdc\x2e\x5b\x9b\x55\xc7\x34\x19\xc9\xe2\x22\x93\x9d\x17\xa2\xe1\xe0\xbe\x3e\x0b\x19\x11\x99\x2d\xb6\xee\xc6\x2c\xf8\x84\x8a\x05\xfb\x81\x87\x83\x50\xc0\x21\x2b\x01\xdd\x7f\x1d\xfb\x5b\x44\x7f\x45\x09\xf0\x14\xa8\xf7\x74\xbf\x9c\xb7\x36\x3b\x0d\xc1\xbb\x3d\x67\xdb\x22\x36\xf4\x5c\x82\x53\x26\x99\x6a\x62\x81\x42\x59\xcd\xf7\xed\xf5\x06\xd8\xe8\x3d\x77\x25\x9e\xd5\xc1\x4e\xc9\xf0\x5a\x21\xb1\x14\x9e\xa3\x63\x2d\x1a\x85\x97\x44\x9a\xda\x5b\xd0\xc5\xb0\xf0\x86\x12\x69\xf1\x3f\xed\xd0\xa5\xcd\x99\x36\xe8\x31\xa2\x4d\x9b\xc5\x63\xc9\x15\xd2\x7f\x06\x62\x66\x2e\x8e\x76\x93\x61\xa9\x33\x0c\xc0\x29\x14\x7c\xa3\xff\x1b\xbb\xfe\xd3\xef\x85\xf8\xc0\x18\x80\x65\x4b\x2f\x49\x94\xd2\x3f\xfc\x8e\x35\x34\xa2\xaa\xe8\x9d\xed\x90\x87\x99\xfa\xbc\x69\x70\xfc\xe5\x14\xdb\xe9\xed\xd4\x39\x2b\x4e\x00\x58\x7a\x51\xc4\xfa\x94\x85\x53\x9d\x31\xc5\xa0\x57\xee\x68\x3d\x88\xba\x0a\xdb\x20\x58\x59\xb1\xc2\x9c\x32\x26\x19\x3b\xa5\x6c\x5b\x05\xec\x46\x07\xcb\x10\x1d\x65\x5b\xc5\x87\xa9\x12\x37\x9d\x5f\xca\x87\xb0\x5c\x29\xf2\x6e\xbd\x3f\x42\xe8\x41\x93\xb3\x4e\x4f\x8c\x9c\x0f\xc4\x49\xcc\xd2\x32\x42\x0c\xa3\xf6\x2d\x8e\x12\x82\x7c\xd1\x34\xbc\x25\xeb\xf1\xf0\xc7\x3d\xe3\x0e\x9f\x1e\xf1\xc2\x45\x14\xdf\x96\xfd\xf9\x1b\xb5\xfd\xcb\xff\x83\x42\xda\xa3\x61\xc0\x96\xdd\xde\x2f\x13\x8f\x23\x07\xe3\x9e\xe4\x6c\x1d\x94\xee\x1e\x2d\x6c\x95\x61\x9c\x21\x0d\x72\x65\x0a\xf3\x9e\x86\xdc\x3a\x3f\xbc\x01\x7b\xef\xb2\x7f\xe1\x8d\x74\xde\x63\xd4\x67\x4c\xca\x18\xc5\xfb\x2d\xad\xdb\x28\xf0\xf5\x0e\xaf\x8a\xba\x6f\x9e\x07\x01\x5b\x75\xe1\x1c\xa4\xc8\x92\xee\x5b\x13\x4b\x79\x59\xfb\xc3\x32\xcb\xef\xa9\xf2\xea\x18\xb5\xd0\x80\x5c\x64\x98\xb4\x38\xed\x5b\xe9\xa0\x10\x15\x08\x21\xc8\x3e\x4b\x5d\x35\xe0\x7f\x72\x9d\xda\xea\xb0\x51\xe1\x61\x5d\xf5\x7c\xf9\x15\x21\x3f\xd7\xd7\x23\x08\x32\x5c\xca\xb7\x1e\x97\x74\x02\x30\x6f\xab\xb8\x3e\x2e\x2c\x66\x15\xdc\x62\xcc\x4c\x45\x57\xb0\x8e\xb2\x11\xb1\xcd\x4f\x1a\x3e\x9b\xc1\x2f\xee\x44\xff\x6a\x8b\xc8\xc0\xf7\xef\x06\xff\xcb\xb9\x83\x42\x28\xe1\xfe\x53\x97\x36\x9f\x59\x28\x49\xbd\x19\x70\x1b\x8c\x9c\x66\x33\x4b\xb7\x4b\x8d\x0d\xb3\x34\x6b\x0e\x5b\x24\x35\x9a\xb1\x1c\x71\x86\x5d\x00\x62\xa8\xc6\x9e\xf9\x65\x99\x38\x4a\xba\xaa\xc3\xfc\x5c\xdf\x90\xd8\xad\x11\xe8\xb0\x93\x8b\xf8\xb0\xdf\x2d\x22\xa0\x6c\x94\x3d\xfe\x01\x44\x8c\xc0\x78\xde\x18\x88\xa2\xdc\x28\x1e\x18\xdc\xa5\xa2\x1b\x5d\x9d\x46\x9a\x61\x86\xc6\x76\xc1\x1f\x12\x05\xdc\xbb\x6b\x38\x4b\x39\x03\xa2\xdb\x5d\x0d\xc2\xaf\x0d\xec\x14\x6e\x29\x0a\x50\x0b\xad\x2c\xbd\xe9\x7a\xa4\x1a\xcc\xd8\xa2\xd9\x35\x7f\xf7\xb0\xf5\x0d\x94\x46\x9e\xfb\xc1\xff\xdf\x1c\x27\x28\x24\x59\x84\x1a\x64\x98\xc1\x35\x22\xc4\xef\xc5\xc4\x56\x59\x27\x11\x0b\x5b\xaa\x58\x0b\xce\x4b\x7f\xff\x8b\xc0\x2d\x02\x55\xc3\x77\x3b\x1a\xbd\xeb\x0c\xac\x93\xcc\xb2\xdd\x8a\xe0\xf5\x0a\xbe\x59\x41\x2d\xdc\xf5\x8c\x7d\xa5\x36\x23\x70\x7e\xb5\x55\x6f\x6c\xdd\x80\xc9\x9f\xa0\x65\x34\x91\x05\x22\xc9\xb2\x94\xb7\x1a\x9d\xa5\xcf\x26\xde\x44\x8a\xbd\xfd\x21\x66\x7e\x65\x9c\xad\xb9\xf7\xe9\x63\x1c\x34\x6c\xef\x87\x24\xc6\xd8\x7b\xe0\x5a\xe0\xa3\xc8\x74\x1a\x8f\xa7\xf9\xcc\x1e\xf4\x13\x1f\x2d\xa0\x40\x07\xd7\xaf\xb6\x8c\xef\x25\x2c\xd5\x87\x1f\x2e\xf0\xb7\xc8\x74\x80\x03\x25\x72\xaa\xc8\xff\x79\x52\x72\x42\xb0\x53\x8d\x30\x77\x71\x45\x3b\x21\x60\xc8\xa3\xc7\x1f\xff\xeb\xad\x2c\x55\x4c\xc4\x0e\x13\x1f\x30\xa8\x0d\x76\xe7\xc3\x7e\xc4\x0d\xc7\x5b\x43\x6a\xb3\xb5\xf9\xad\x71\x03\xb1\x0b\xe2\x1f\x9e\x7f\xd6\x7f\xcc\x16\x13\x76\x77\xfd\x54\x01\xe0\xe1\x2a\x39\x4e\x3f\x68\xe3\x7f\x23\x49\x6f\x35\xeb\x68\x06\xc4\xba\x52\x6b\x8a\x66\x5f\x88\x8e\x67\xbb\x9a\xf4\xf7\xec\xf6\x83\xdd\x47\xbd\xe9\xc4\xb9\x7f\xa3\x96\x31\xd1\x7e\xa4\xa3\xe6\x2b\x51\x1a\x27\xa7\xea\xab\x91\x64\xea\xfe\xb4\x17\x63\x2f\x3c\x6f\x43\xf9\x88\xf0\xf9\xa7\x4b\xfa\xff\xce\x17\x88\xf0\x61\x60\x67\xcb\xd3\x2e\xf0\xe7\x79\x59\x0d\x47\x9a\x5e\x9a\x21\x53\x8f\xc0\x16\xce\x14\xc0\xd7\xca\xb7\xf7\xda\x9e\x98\x46\x11\xac\x5c\xef\x41\x64\xcf\x7e\x8a\x5d\x97\xe1\x3a\xbc\x79\x7d\x61\x19\x7c\xa8\xe5\x8a\xc7\xce\xc0\x70\x96\xfc\x63\xab\x1f\xe5\x77\x25\x48\xf8\xb4\x52\xca\x36\x7c\x88\x81\x4d\x52\xf3\xf2\xf4\x4f\xd7\xee\xdc\x78\xb9\xd2\x13\xd9\x9f\x4a\xe1\x6d\x1c\x27\x59\x27\x46\x77\x05\x60\x0b\xd6\xe2\x0b\x55\xf5\x33\x9c\x91\x83\xe8\xba\x01\x0a\x43\x7a\xc6\x6e\xeb\x7e\xe6\xc1\x2f\x21\x53\x4f\xe4\x2d\x6b\xa3\x63\x71\xc9\x73\xfe\xfe\x39\xff\xf2\x4b\xa1\x10\x38\x18\x1f\x7f\xe0\xcf\x59\x4b\x93\xcd\xc0\x4d\x6e\xfe\xf6\xa9\xf4\x2c\x22\xab\xe0\x8d\xf2\x86\x35\x66\x13\xe7\xd0\x10\xf7\xe8\xae\xcd\x18\x92\x3f\x2a\x08\xd1\xfb\xcd\x5e\x79\x76\x45\x68\x56\x2d\xe2\x2f\xc3\x29\x90\xb7\x01\x33\x8b\xd7\xd5\x61\xea\xb5\x53\x58\x1a\x5a\x38\xd2\x06\xa3\x07\xf6\x1f\x2b\x32\xb5\x32\x24\x32\x0e\xce\x5f\x9a\x2f\x9b\x1c\x8a\x2d\x7d\x0d\x53\xf8\xf5\x8a\x16\x12\x90\xbb\x5d\xf8\xd5\xb6\x79\xdb\x1f\xdc\x34\xaa\x9a\x52\x42\x78\x01\xde\xda\x89\xd7\x52\xfc\xd8\x43\xc7\x7b\x27\x0f\xf1\x96\x3b\x7f\xe8\x95\x99\x7c\x66\x2f\x96\xc7\x98\x54\xff\x82\x35\xff\x65\x22\xa1\xa2\x74\x60\x9f\x30\x7f\x6e\xf6\x21\xc7\x49\x61\xfa\x82\x3e\xfb\xd2\xba\x9e\x56\xf4\x52\xcd\xa8\x23\xb8\x49\x9a\x81\x40\x04\xa9\xa9\xc8\xa3\x38\x4f\xd0\x46\x71\xe1\xe5\x5d\x29\x57\xdf\x1b\xe8\xaa\xfa\xae\xc0\xcf\x49\x41\xf5\x7a\xd3\xdf\xc3\x2a\x0e\x36\x10\x6e\x04\x4c\x95\xa7\x83\x05\x9d\xc1\x4e\xe6\xe2\x91\xbe\x43\xfb\xbf\xe5\xe5\x48\xdd\xd7\x55\xbd\x96\xf6\xe6\x2e\x3e\xd2\x1c\xa5\xf0\x50\xf4\x08\xe6\xbb\x57\x81\x8c\xd8\x1b\xd8\xdf\xe1\x8c\xe9\x7e\x5e\x04\xfa\x74\xca\xc0\x30\x4f\xef\x30\xbf\x7a\x66\xe0\x44\x1f\x6c\xd1\xc7\xec\x39\x37\xf7\x49\xd4\xf9\x7c\x0a\xeb\x7f\x26\xf6\x5c\x4f\x47\x1a\xb5\xaf\xeb\x4d\xa9\x33\xc7\x4f\x45\x6d\xad\x08\x09\x49\x4d\x9d\x57\xe7\xcc\x2d\xfb\x5e\xd9\x9f\x73\x14\xcf\xa1\x90\x87\x85\x87\x8b\x64\xb2\xc7\xe3\xa8\x1f\x41\x4c\xc8\x24\x4d\xb2\x07\xc9\xbc\x65\x19\xfb\x48\xf8\x43\x10\xd1\xb7\x48\x46\x3f\x34\x2d\xc9\xf4\x5e\x98\x1d\x3d\x1c\x40\x97\xcf\x5e\xd6\x46\xa3\x99\xd0\xa0\x44\x63\x16\x72\xb5\x09\xe0\xd7\x15\x13\xae\xb8\x15\x34\x59\x4b\xc7\x68\xb8\xbf\x0f\x5a\x17\x78\x00\x5c\x20\x12\xc7\xe2\xec\x0f\x77\x0e\x03\x4b\x55\xa6\xfa\x7e\x2e\x32\x0a\x81\x6d\x4f\xb4\x2a\x36\x55\x16\x4d\xe4\x57\xba\x59\xfb\xa9\x01\x24\x30\xe3\xc3\xf0\xe4\x13\x94\xd6\xf0\x3a\x3a\xb4\x38\xdd\x5f\x9e\x0a\x73\x42\xce\x86\x81\x92\xbc\x8b\x08\x84\x06\xa3\xb9\x11\x5a\x00\x31\x8f\xd7\x7b\x98\xb8\x8e\xaa\x07\xb9\x80\x2e\xff\x8c\x34\xec\x76\xb2\xb5\x7d\xa8\xc7\xd6\x2d\xfe\xbb\xe9\xd0\x8b\x4f\x2b\xce\x27\xbd\xc0\xe7\x15\x3a\xbb\x84\x6b\x8d\x66\xdc\x74\xba\x65\xe8\xee\x1c\xf6\xf7\x39\x9f\x36\x8d\x20\x6e\xc2\xa4\x8b\x56\xb1\xe4\x3d\x15\xde\xc8\x7e\x1c\xb4\x40\xec\x65\xcc\x2a\x4f\x56\xf4\x9c\x21\x34\x72\xef\x9b\xe3\x45\xa6\x97\x1c\xdd\x28\x13\x99\xdb\x45\xb7\xf4\x9b\xb8\x90\x09\xc5\x47\xc9\xd1\xf9\xad\x60\x4c\x0f\x39\xd2\xc5\xcb\x99\x96\xea\x19\xac\x85\xe6\x48\x09\xfd\xdf\x4f\x30\xce\xbd\xe0\xe8\x83\x62\x52\x5d\x56\x40\x0f\xac\x8d\xfb\xed\xdb\xe7\x08\x05\x75\x21\xbe\x88\x52\x0e\xe3\x89\x48\x0c\x4b\x41\xb7\x6c\x15\x77\xf3\xe5\xa5\x46\x93\x88\xea\x8e\x55\x80\x28\x4b\xf5\x4a\xca\x0c\xa6\x0e\xd2\x90\x14\xb6\x15\xda\xc2\x8f\xa0\xd6\xbc\x3b\xd1\x35\xe5\x4c\x7d\xcb\x5d\x84\x1a\x4d\xdc\x8f\x43\x80\x68\xea\x13\x7c\xcf\x4f\x14\xef\x75\x8b\xbe\xa0\xa9\x53\x15\xa0\xd8\x40\x8c\xd2\x9b\xa8\x5f\xec\x0b\x42\x2b\x14\x62\x05\x54\x3a\xd0\x00\xd1\x2a\xe5\xe3\xc1\x30\x16\xa1\xa7\x06\xd5\xed\x69\xef\x3b\xba\x25\xe8\x86\xbc\x69\x16\xd9\xf4\x96\x82\xd2\x6c\x3d\xc5\x7e\x16\xc4\x02\xa2\x41\xf4\xf4\x1a\x0f\x2c\x65\x3d\xe1\x29\x73\x50\x84\xb2\x0a\x71\xa1\xa8\xc1\x20\x7f\x87\x9c\x49\x4d\x2c\x82\xbe\xe2\x29\x21\x05\x60\x53\xdf\x31\x4c\x39\x49\xe2\x5e\x9b\xbe\xfb\x2d\xdb\x42\xf5\xa2\x69\xc1\x51\x5a\x53\x88\xec\x90\x77\x9b\x6e\xc7\x34\xc8\x93\x24\xe6\x71\xad\x6c\x05\xd5\x34\xaf\x17\x2c\x08\xd4\x32\xf5\xd9\x49\x5f\xd4\x11\xc8\x14\xee\x29\x59\xf4\xb4\xe8\x94\xf2\x60\xb9\xd6\x4c\xd1\x02\xad\x77\x8a\xe9\x7b\x46\x0c\x1f\xfc\x17\x9e\x86\x0a\xaf\x59\xac\x1b\x31\xfe\xf0\xcf\x2e\xed\xb5\xa9\x56\xbf\x1b\xdf\x42\x16\x89\x61\x06\xd9\xc9\x9a\x95\x9e\x36\x10\x34\x8a\xdc\x99\x94\x42\x03\x25\x2f\x65\xe3\x21\x52\x87\x24\x06\x85\x3e\x94\x41\x21\x64\x2e\x7c\xfd\x11\xaf\x81\xfd\x37\xe0\x09\xba\x21\x38\xb2\x23\xfa\x21\xd1\xa5\xa2\xa7\x2b\x6f\x19\x44\xe8\xab\x78\x57\x9c\x18\x24\xd6\x81\x21\x97\x93\xbf\xfb\xfa\xf1\xfb\x1f\x7c\x7d\x6c\x17\x61\xa8\xfe\xbc\x82\x0f\xdd\x14\xc5\xba\x34\x95\x76\x4f\xdf\xfa\x39\xa9\x7b\x44\xd4\x5a\xce\x83\x10\x2d\x0a\x10\xd3\x74\x24\x86\x74\xbc\xb5\x9e\xfe\x18\x82\xbd\x22\xbb\xe6\xad\x6e\xa7\x56\x6c\x95\x77\xec\xc3\xe1\x68\x5d\xdf\xd2\x72\xdc\x3b\x4b\x02\xee\xbf\x1c\xe1\x48\x4d\x07\xf7\x56\x16\x7a\x51\x1f\x2f\xec\xee\xf0\x51\x6c\x93\x88\x0a\xe1\x27\xdc\xdc\x8a\x26\x45\x3a\xa9\x06\xde\x38\x40\x14\x82\xb8\xb3\x30\x41\x70\xc3\xb1\xa7\x5b\xf6\xd1\xa5\x40\xa3\x42\xa0\xc3\xf3\x2b\xae\xc8\x6a\xe3\x80\xb3\xd4\x34\xef\x72\x25\xe4\x71\xfe\x0e\x6c\x3f\x50\x42\xe4\x44\x3f\x30\xf7\x18\x9b\xe5\xac\xe3\x98\xef\x3c\x7c\xdc\x79\xa8\x0b\x66\xdf\xd6\x21\x0b\x68\xb7\x52\x15\x06\x15\x58\x1d\xb8\xac\x65\xfd\x56\x59\xa1\x80\x64\xcc\x5d\x84\x90\xcd\x90\xbb\xb7\x8e\xb6\x32\x13\x8e\xcd\xff\x8c\xbe\x77\xa0\xb8\x6a\x19\x10\x55\xb1\x31\xb6\x6d\xf5\xa1\x79\xce\x05\xf7\x62\xe3\x90\x41\x3b\x94\x02\xf3\x53\xc7\x1d\x03\x4e\xb2\x44\x73\x19\xc9\x61\xde\xb8\xda\xe3\xaa\xf2\xca\xcb\x4a\xc3\x04\x94\xd6\xa2\x12\x05\xbd\xe2\xd7\x9c\x14\xfe\xa4\xc6\xd3\xf3\xe4\x06\xe9\x85\xb4\x11\x39\x26\x9c\xfa\x88\xc8\xe3\x5a\xa9\x66\xaa\xb6\x42\xae\x18\x95\x8b\xaa\xd3\x4d\xf1\x9b\x7f\x5a\xef\xa7\xf4\xce\x30\xad\xa6\x04\x14\xf2\x65\xac\x4d\x99\x67\x00\x2c\xf7\x19\x3a\x13\x63\x68\x18\x27\x03\xda\xf7\x2b\x26\xe9\xbd\xc3\xce\xe8\x29\xf6\x83\x72\x1f\x23\x77\xf8\xd3\x3c\x66\x3d\x8f\xe3\x25\xc1\x49\x6d\xc2\x52\xbd\xc6\xf8\x51\x46\x21\x5f\xcc\xee\xa1\x4f\x7f\xd2\x60\xa7\xa0\x3b\xe2\x4c\xbb\xd8\xdb\x36\xb4\xa0\x54\x36\xef\x9a\x07\x88\x1a\xc8\x52\xb5\xfa\xa9\x65\x04\x7e\x91\x4d\xd2\x29\x91\x6b\xd5\x73\xe5\x24\xeb\x9a\x60\x4e\x54\x8b\xd6\x59\x2e\x45\x4e\xc9\x0b\x7e\x9c\x14\x66\x03\x3d\x77\x61\xfe\x4c\xe3\xda\xf3\x83\xfd\x32\xdc\x12\x2e\xed\x82\x08\xab\x90\x46\x2e\xf3\x44\xae\x21\xff\x90\xa3\x45\x8c\x47\x55\x89\x9c\x7b\x7f\x4c\x36\x08\xe6\xab\xc3\x74\xd2\xe2\x87\x61\xd4\x44\x19\xd7\x8e\x93\x72\x75\x11\xc7\xf6\xc8\x7d\xbc\x35\x4f\xee\x7b\x94\xdc\x85\xbb\x27\xa5\x4e\x26\x3b\x18\xf5\x26\x67\xd0\x9c\x52\x39\xb4\xf6\x35\x23\xbe\x52\xb8\xd3\x0e\xe3\x96\x1b\xca\x0c\x12\x7c\x03\x9c\x54\x35\xc4\x41\xa4\xd2\x1f\x79\x70\x63\xa8\x7c\x03\xe8\x5a\x81\xdb\xb7\xaf\x1d\xba\xda\xf6\xae\x9c\x48\x5f\xfc\xb9\x7c\xbd\x60\xb2\x0d\x64\xd4\xae\xf2\x92\x29\x6c\xb8\xaf\xe6\xa2\xb1\xbb\xfb\x6e\x38\xe9\x0c\x75\xef\xa3\x6b\xb2\x4b\xc6\xdb\x74\xe8\xb2\x8d\x54\xab\x80\xa0\x36\x5e\xaa\xe4\x2a\xc1\xc9\xf4\xb7\x33\x07\xcc\x24\x07\x29\x71\xd3\x73\x8c\xf7\x25\x91\xdc\xb5\x24\x79\xd1\x45\x07\x46\xbd\x5c\x38\xe0\x9a\x4a\xc1\x66\xb4\x45\xc4\x18\xfd\x20\x79\x9b\x96\xec\xee\x69\x36\x7c\x27\x3d\xbb\x4a\xeb\x4f\x95\x56\x44\xb0\xba\x38\x34\x4a\x0d\x72\xed\x65\xfa\xe6\x23\x84\x14\x8f\xce\x13\x8d\x45\x45\x25\x86\x0b\x57\xfb\x12\x9b\x8d\x52\x76\xf1\x88\x69\x33\x10\x8a\x24\xe1\x54\x5a\x01\xa2\xf1\x72\x4b\xad\xab\xeb\x6f\x50\x63\x9e\xd9\x05\x51\xfa\xc7\x52\x6e\xe6\xd6\xd3\x99\x38\x8e\x27\xeb\x52\x0f\x3d\x57\x5a\xea\x17\x7b\xb4\x3e\x9d\x3f\xac\x59\x13\xb8\x6e\xe8\x7f\xcf\x1e\x38\x93\x44\x2a\xf6\x44\xc6\x46\xc2\x8e\x31\xaf\xcd\x5d\x7f\xcb\x2f\xb7\xd8\x14\x29\x05\x32\xdf\x74\x5d\x0d\x27\x9c\x54\x7e\xb1\x18\x49\x16\x58\x21\xb2\xea\x4b\x22\x30\x4f\x10\x89\x58\x53\x14\x4e\xd2\xcb\x0d\x3a\x8a\x93\x00\x87\x30\x23\xa6\xd9\xa7\x8d\x01\xa1\x20\xf3\xd7\xc3\x64\xac\x5d\xe5\xc3\xc7\x25\x6d\x74\xe1\x4c\x09\x45\xa2\xac\x61\xb5\x21\x39\x33\x80\x96\xba\x16\x3b\x41\xcf\xc0\x67\x27\x41\x31\xec\x04\x49\xbd\xe9\x95\xe3\xee\xc5\xa1\xeb\x41\x2d\x7e\x81\xfe\xea\xb4\xd8\x8d\x34\xd9\x39\x30\xe8\xbc\xaa\xd3\x1e\xfb\xf3\xe0\x56\x74\x92\x8a\xb7\xf2\x07\x4a\x1b\x41\xd9\x0d\x81\x0c\x4d\xfa\x42\xec\x1f\x26\x2a\xd2\xa2\x10\x60\x80\xd4\xef\xbb\x2f\xd3\xd0\x24\x3f\x17\x2e\xdc\x42\x04\x3e\x9c\x8a\xf3\x6f\x7b\x18\xb8\x9d\xa3\x62\x9e\xc7\xaf\x4d\x5b\x5f\xe2\xe4\xf7\x03\xdb\x9f\x8b\x2c\x89\x78\xf1\xe7\x9c\xcf\x53\x3e\xdf\xdb\xc6\x6a\xe2\x35\xa9\x95\xc8\xeb\xe5\x67\xf2\x4f\x34\xec\x35\x7f\x50\x11\xcd\x03\xbc\x5c\x6d\xb7\x0a\x4d\xd3\xb1\xb2\xe8\x72\xed\x38\xbd\x0e\x46\x07\x98\x4a\x01\x81\x18\x54\x6c\x8b\xcc\x83\x0f\x9e\x8b\x5b\x3f\x51\x66\x1f\x25\x97\x83\x32\x66\xd1\x29\x8d\x99\xdb\xa2\xe0\x60\xe6\xe5\xed\x85\x53\xc2\x7c\xab\xd4\x09\xa5\xfc\x48\x0d\xbf\x51\xb1\xc7\xbc\x06\xb9\x52\x51\xe1\x5c\x0d\xed\xfa\xaa\xfb\x74\x8a\x6f\xba\x31\xde\xd7\x58\x58\xa9\x22\x28\x7d\xb3\xe4\x4d\x62\x59\x77\x10\x24\xe1\x1b\x56\xfe\x4b\x7b\xf0\x2f\x83\x06\x85\x50\xc3\xd2\x81\x91\xc6\xf6\x4f\xaf\x4e\x98\x4f\x83\xb2\x3c\x08\x4a\x93\x31\x96\x19\x4a\x3f\x0f\xde\x33\x6b\xb4\x1a\x11\x97\xcf\xb0\x76\xc2\xa4\x33\x83\x1e\x93\x05\x17\x75\x29\x35\x46\xd3\xd9\xee\xa8\x8b\xfc\x6d\xf3\x5a\x03\xb6\x15\xae\x7f\xe0\xb8\x7a\x97\x8c\x63\x5a\x16\x3b\x45\x34\x48\xc8\x4b\x13\xf1\x6d\x65\x71\x51\x42\x51\x62\xc3\xd6\x24\xa2\x7d\x69\x8a\xc5\x81\xa8\x16\xeb\xb5\xfb\x10\x4f\x72\xb5\x6b\x32\xd2\x2a\x13\x20\x0a\x27\xba\xa2\x2c\x8f\x89\x1f\x46\xb1\x47\x30\x20\x3f\xcd\x85\x60\xa9\x1e\x16\xcf\x3e\x92\x2c\x45\x25\xf6\xbd\xd8\x5d\x72\x0f\x0c\x75\xe6\xe5\x96\x53\x7f\xdb\xbe\x38\x6f\x39\x23\xdd\xf4\xd5\xf8\x94\x54\xbe\x93\x75\x9e\x69\x8c\x1e\x95\x9f\x6d\x04\x57\xcb\x90\x18\x0a\x52\x4a\xc8\x12\x37\xb2\x71\x0b\xfc\x41\xdd\xb9\xcb\x66\x28\xb6\x6e\x33\x88\x13\x54\xb3\xe8\xed\x52\xd7\x86\x61\x2c\xba\xab\xc8\xfb\xf1\x17\x77\xf2\x2f\xb3\x0e\x15\x25\x02\x8b\x81\x8a\x76\xb7\x2e\x76\x17\x1c\x4b\xb6\x95\x58\xc4\xdd\xfc\xd9\x96\x4a\x1a\x43\x4d\x6b\x86\x7a\xd5\xac\xcb\xb6\xdc\xb6\x69\xac\x2e\xc0\xca\xed\x3d\x53\x1e\x1c\xe5\x69\xdf\xb2\xb9\x85\x43\x56\x19\x93\x83\x89\x76\xb9\xe2\xa3\x0b\x72\x0f\x8e\x1b\x02\x0e\xe4\xea\x21\x10\x39\x48\x40\xe8\xcd\xc0\xd0\xa6\xc9\xc1\x5d\x44\xac\xa8\x31\x23\xf4\x84\x96\xab\x9c\x56\x56\x96\xc5\xc2\xeb\x30\x60\x1f\x45\x8e\x05\xa8\x31\x93\x41\x4b\xdc\xdd\x26\xb6\x8f\xfc\x13\x01\xb3\xfb\x43\x63\x22\x5d\x77\x21\xd2\xe8\x09\x94\x42\x54\xc2\x58\x7e\x50\xf6\xbd\xe7\xce\xdf\x9a\xf8\x7f\xf9\x20\x50\x08\x9c\x3f\x02\x25\x50\x13\x6f\x6f\x6f\x7e\x2e\x49\x13\x6a\xaa\xaa\x9b\xb1\xf5\x6d\x90\xe1\x94\xd1\xf1\xdc\xa8\x37\x27\xd0\x15\xb7\x82\x93\xa6\xf6\x97\x70\x0b\xe0\x0a\x0c\xab\x54\x44\xa3\x43\x05\x71\xe4\xab\xc2\xb0\x69\x0a\x83\xbc\x83\x5b\x75\xb9\xfb\x59\x3f\x50\xbe\x0c\xc0\x3c\x27\x26\x03\xeb\x0c\x23\xe5\x62\x42\x3a\xc5\x36\x07\x44\x67\xe7\xde\x6b\xfb\x75\xa2\xdb\xbe\xb1\x76\xf8\xbe\x34\x63\x16\xd5\x2f\xd6\xb4\x14\x1d\x4e\x03\x88\x06\xd1\xd9\x79\x26\x5f\xf5\x16\xf5\x17\xd4\x9a\xe1\x38\x94\x7b\x46\x8e\x63\x42\xc4\x3c\x35\x97\xc9\xb5\xf7\x97\xd4\x3b\x57\xc0\x06\x31\x3c\xdf\x10\xc3\x8f\x6a\x37\xe6\x3a\xfb\x8e\x79\x95\xa7\xba\x1b\xbc\xf6\xae\x85\xda\x1e\x54\x79\xf3\xb6\xa4\xe6\x7f\xee\x74\x81\x4c\xb8\x06\xd4\x39\x86\x7f\x6e\x8e\xc9\xc3\x5a\x3e\x6f\xe0\x0f\x8b\x63\x0b\x08\x98\xe6\xb6\x28\xe4\x33\x2a\x75\x0b\xc5\xfc\x39\x6d\x30\xf8\x1b\x1d\xfe\xcb\x11\x83\x42\x10\x60\xd0\xc1\x93\x50\x06\xd7\xee\x58\xd1\x4f\x49\x25\x58\x47\x8c\x18\x2f\xfa\x6b\xd3\xd3\x68\xed\x7c\x39\x95\x53\xc5\x19\x4d\xeb\xab\x0f\xaf\xed\x38\xa0\x04\xda\x20\xab\x71\x30\xb5\x9f\xd5\x9b\xb0\xea\x06\x2e\x46\x27\xf9\xd4\x16\x46\xe2\x83\x3b\x17\xc1\x98\xe3\xd1\x0b\xfc\x92\x10\x5f\xe0\x24\xc0\x46\x25\x90\x2c\xe1\x32\xd9\xe9\x5d\xe0\x67\x67\xbb\xe6\xe6\x67\x17\x62\x56\xe6\x58\x6d\xfb\x94\xd3\xa2\xa6\xcd\x8c\xf8\x97\x3d\xee\xc2\xfc\x86\x98\xab\x42\xd3\xdd\x5b\x84\xe6\xa6\x7c\x25\x2b\x6f\x0f\xcb\xae\x78\x06\x8c\x52\x0a\xe7\xa9\x7d\x55\xb7\x6e\x04\xed\xf9\xbf\x27\xe1\x5f\x7e\x23\x14\x82\x85\x12\x0d\x76\xb8\x7f\xe5\xef\xd9\xd9\xc9\xb1\xe6\x85\xbb\xf7\x39\x0d\xc7\xc2\x57\x51\xbd\x24\xac\x92\x41\x2b\x1a\xd1\x2c\x5c\x7d\xc3\x95\x3f\x1f\xec\x95\x77\x48\xae\x51\x53\xc2\xa4\x92\xd3\xa9\x4a\x16\xa7\x7f\x63\xe3\x1d\x41\x67\x61\x09\x97\x7b\x3c\x02\xb1\x0f\x89\xf2\xf0\xb0\x4c\x05\x66\x06\x0f\xf7\x26\xc1\x6f\x6e\xea\x47\x0d\xa6\x4a\xa6\xb6\x29\xec\x91\x19\xef\xfc\x8c\x05\xe9\x0d\x16\xac\x22\x04\xbd\xac\x53\x0c\x70\x4a\x23\x55\x7b\xa6\xb0\x15\x2c\xc9\x39\xba\xfd\x48\x03\x64\x36\x7d\x38\x4d\x69\x6e\x3e\x4b\x7d\x43\x15\xea\x52\xa9\x71\xd4\xeb\x01\x1b\x3c\x05\x74\xb3\xc6\x65\x3a\x05\x7d\x60\x27\x53\xff\xf3\x83\x3f\x4a\xcc\x33\x52\x69\x72\x03\x6a\xb2\x8e\xf9\xa2\xd2\x20\x44\x38\x03\xdc\x04\x81\x2f\x7b\xef\x79\xf9\x8e\x6d\x6e\xfa\x6b\x6e\x67\x57\xb1\xfd\xc6\x93\x1d\xb1\xae\xdf\xef\xfe\xf6\x6c\xad\x69\xef\xdb\xce\xbd\xf9\x9b\x8d\xfb\x97\x4f\x08\x85\x3c\x81\xf1\xc7\x02\xd6\x8b\xe3\xd7\xcb\xfb\x1e\xf7\xb9\x97\x25\xed\x54\x14\x11\xe6\xef\x32\x6b\xde\xc5\x44\xb5\x63\x7f\x44\xad\xfd\x1c\xf0\x65\xa4\x98\x1e\x04\xc9\xc4\xb8\x13\xfc\xd1\x72\x27\x0e\xea\x97\x84\x0c\x71\xef\x05\xfd\x66\xc8\x67\x46\xe1\x6e\x52\xb7\x8a\x9e\x4c\x6d\xcb\xdf\x82\x80\x24\x60\xf5\x3d\x25\x4d\xcf\x52\x9e\x3c\xef\x96\xd0\x95\x47\xad\xb8\xe6\x96\x0a\x1c\x9f\xa1\x61\x68\x1d\x0a\x4c\xcc\xc9\x8b\xf0\x9e\xea\x03\x44\xbf\xeb\xa9\xbf\x58\x98\xe2\xd0\xf6\x91\xcf\x29\xee\x58\x7c\x59\x59\xa1\x00\xd9\xa6\xa9\x11\x9a\x98\xfd\xc5\x36\x64\x2c\xef\x6f\x05\x22\x33\x9c\x4b\xd9\x4c\xb5\x69\xb7\x4d\xbf\x30\x2c\x65\xcc\x46\xbd\xbe\xfa\xfc\xcc\x4b\x4a\x55\x03\xcb\x27\xb1\xb5\xeb\xac\x71\x88\xe8\xef\x2a\xfc\xcb\xdd\x85\x42\x10\x50\x60\x42\x80\x55\xe8\x76\x1b\xd4\x89\xe9\x44\xb8\xa5\xa9\xf9\xd8\x5d\xb3\x2d\x38\x18\xf5\x69\x82\x8b\xcc\x2a\x6d\x3d\xc0\xf5\xab\xd8\x70\x38\xf4\x15\xa0\x04\xee\xb2\x2f\x4b\x68\xe4\x61\xaf\xe7\x27\xfc\x1f\x6f\xa4\x08\xa9\xe5\x4a\x63\xa7\x02\x96\xf5\x59\x6f\x52\xa7\xae\xec\x2b\x47\x6c\xc1\x55\xe0\x36\xd9\x57\xd5\xd2\xbb\xb6\xe1\xc9\x4e\xd7\x39\x76\x37\xa9\x0c\xe3\xac\x90\x19\x20\xde\xe1\x2c\x08\x7a\xfe\xbc\xe6\x0f\xd8\xa8\x5c\x8b\xc9\xfc\xb6\x65\x5d\x41\x16\x0f\x2d\xf1\x49\xfc\xaf\xe5\x10\x0f\x92\xa2\x76\x0a\x47\x0c\xde\xfd\x36\x2f\x78\xd9\x3e\x72\x42\x10\x25\x6b\xb1\xc2\xcf\x61\x51\x0a\xa9\x88\x78\x51\xb7\x58\xf9\x89\x4e\x59\x27\x9c\x16\x1e\x21\xdf\xc7\xb7\x72\xb0\x1f\x49\x8c\xc6\xee\xaf\x75\xf8\x97\x7b\x0e\x15\x45\x04\x51\x89\xf8\xb6\x52\x24\x86\x5b\x7b\x85\xb9\xee\x1e\xb8\xfa\xd2\xb3\xe1\xa9\xed\x96\x77\x69\x1f\x63\xc4\x06\x1b\xfe\x10\x8a\x64\x63\xf0\x82\x79\x77\xfc\x15\xd4\x18\x39\xcb\xe4\xac\xbb\xbb\x8b\x8d\x10\x7d\x45\x7e\xde\x99\x9a\x14\xf8\x75\xf6\x26\x0f\xdc\xc9\xe1\x18\x04\xa0\x15\xd2\x4b\xc4\x2e\x89\xf8\xa7\x19\x3d\xa7\xf9\x5f\x87\x5b\x3f\xe3\x37\x36\x8a\x29\xf5\xe7\x07\xe1\x8b\xee\x1e\x64\x13\x0e\xbd\x36\x05\x29\xc2\x27\xbe\x2d\xc2\xe9\x27\x23\x5f\xd8\x53\x5b\x9f\x51\xc5\xf3\x98\x35\x60\x74\x31\xda\x0f\x17\x5d\x71\xd1\xf1\x3d\x5d\x1b\x41\x24\xff\xcb\x01\xf6\xaf\x58\x02\x2a\x46\x99\x07\x82\xa5\xce\x23\xbe\x77\xe7\x3b\x2a\x92\xfa\x95\xc5\xf4\x4a\x05\x47\xfb\xd8\x34\xc3\xa2\xee\x9b\xe2\xbe\xbf\xf1\xaf\xbb\x78\xde\x77\x00\xf2\x3e\x31\x54\x18\xeb\x6b\x35\xe3\xba\xcf\x18\xa6\xf2\x9b\x90\x89\x11\xae\xbf\x78\x71\xab\x3e\x6e\xa7\xda\xa5\x25\xb9\x73\x93\x99\x0d\xd6\x48\x5a\xae\x68\xc4\xce\xed\xc2\xe9\xb1\xbf\x36\x7a\x86\xf5\xf4\x77\xa0\x29\x7b\x0b\x6d\x2f\x5f\x83\x57\x09\x09\x37\x8b\x71\xc0\x2a\xc8\x00\x8f\x04\xd1\x57\xf5\x9d\x65\xd5\x76\x45\x1d\x9b\x95\xf0\x2c\x30\xf0\x61\x60\xf5\x82\x60\x67\x32\x9e\x21\xc1\x56\xd3\x1f\x6f\x81\x18\xdd\x01\x77\x9e\x94\xcc\x80\x49\x1b\xf3\xdc\x1b\x8f\x6d\xfb\x92\x4a\xaf\x7e\xf9\x1a\xb4\xf9\x3a\xb4\xda\x29\x0a\xcd\x39\xc6\xdc\xba\xbf\x8b\xf0\xaf\x30\x05\x0a\xc1\xfa\xef\x8b\x02\x74\x67\x09\x9e\xef\xfc\xc7\x21\xca\x01\xe6\xfc\x14\xa7\x29\x9c\x89\x68\xc8\x15\xf1\xd3\x08\x54\xa1\x94\xbb\x07\xc6\x83\xc2\x09\x10\x74\xfa\x2c\x2f\xbd\xeb\x59\xc2\x2a\x46\xb7\x45\xd4\x85\x29\xf5\x25\x91\x8a\xb9\x29\x46\xc8\x86\x8c\xa7\x5c\x78\x6b\x6d\x54\x1a\x2d\x70\x12\xcc\xce\xd9\x4a\x1e\x82\xec\x83\x6e\x77\xe0\xee\xb8\x3e\xa1\xed\x53\x94\x50\x0f\x96\xe4\x44\xa9\x39\x6b\xd6\x58\x2f\x79\xa4\x03\x9e\xf5\x35\x9b\x5d\x2f\x65\xf7\x3d\x1d\x36\xae\xfe\x61\x92\x11\xb1\xf8\x10\xef\x9d\xfa\x9f\x89\xde\x04\x4a\xea\xc4\xad\x00\x2e\xaf\x65\xe0\xfb\x7e\x48\x5c\xc4\x15\x03\xa9\x12\x05\x4d\x74\x7d\x86\x8d\x19\x6f\xd3\xdd\xba\x22\x2a\x46\x11\xcc\xba\xeb\x90\xae\xdc\x72\xde\x16\xfd\xfd\xcf\xff\x15\x80\x41\x21\x5a\x30\x30\xa0\x75\x48\xcb\x79\x37\x65\x95\xd1\x52\x83\x1e\x82\x38\x27\x1c\x31\xec\x3c\x18\x2f\x3c\x8c\x1c\x1f\x18\x8b\xed\x70\xe8\x6c\x9c\x40\xd8\x0a\x28\x71\x6b\x0a\x67\xbf\x8f\x7a\xa9\xf3\xe2\xf2\x4f\xfa\x4a\x00\xe3\xe0\x60\x85\xc4\xce\xc1\x60\xdd\x3b\x1c\x98\x26\x9f\xe5\xf6\x22\xf0\xad\x24\x24\x3b\x25\xbd\x52\x4f\xde\x98\x66\x65\x92\xb6\x60\xfb\xd5\x02\x3a\x7c\xb3\x19\x53\x25\x76\x6e\xf0\x58\xce\x86\x51\xad\xf3\x3d\x20\xea\x22\x22\x3b\x89\x83\x6a\x14\x94\xeb\x42\x2e\x87\x38\xdc\x9c\x6c\x90\x95\xb2\xb0\x20\xf2\xa9\x6d\x3a\x0f\x8e\x25\x20\x79\x0d\xa4\xa3\xbb\x20\xf6\xf5\xb3\x3e\xd9\xf4\x23\xcc\x3a\xf1\xea\xcf\x8f\xfd\xc0\x72\x2a\x1c\x37\xb2\x8a\x9a\x6c\x11\x22\x3b\x2e\xee\x63\x82\xf2\xd7\xfa\xff\x2b\xba\x82\x8a\xc1\x21\xa0\x02\x27\xe1\xd2\x92\x19\x69\x0d\x1d\x0f\xf9\x7b\xa2\xb2\xab\x96\x17\x0d\x06\xe1\x25\xdc\xc3\x40\xcc\x10\x53\xaf\x48\x72\xd6\x4c\x31\xfb\x12\xc8\x9f\xf1\x35\xbc\x2c\x5c\xec\xf9\x44\xaa\x5a\x91\xc9\xcb\x1e\xfc\xc5\x40\x01\x98\x67\x6f\x52\xcb\xf3\x17\x36\xd2\x9f\x9d\x44\xfb\x80\x88\x40\xa2\x62\x8c\x3f\xb4\xe4\x27\x48\x32\x03\xa6\x3c\x02\x26\xa2\x47\xb3\x15\xbf\x90\x1a\x79\x3d\xc4\x58\x14\x47\x09\xfc\xbe\xee\x80\x8c\x5a\x67\x6b\x0a\x2f\x59\x13\x67\x62\xed\x7b\x69\x05\x93\xc2\x16\x8b\x64\xe0\xb1\xb2\x36\x25\x5b\xad\xe9\xc5\x22\x2e\xb1\x97\xc3\x9d\xfe\xee\xef\xbf\x82\x41\x28\x24\x1a\x46\x04\x1b\xd8\x5f\x91\xee\xe3\x26\xfb\x6c\xb1\xa2\x31\x26\x9f\x37\x9e\x4c\xf5\xfd\x03\xad\xbe\xec\xd8\x53\x4c\x04\xaf\x26\x0f\x55\x8b\x3e\xd8\x82\x37\xee\xfb\xe6\x6d\x3f\x73\x0e\x43\x48\xfe\x39\x11\xf6\x1d\x55\xcd\x9a\xda\xcb\x84\xa5\xb1\x51\xd8\x20\xcb\xd2\xb8\xd0\xc0\xdc\xb5\x0e\x40\x34\xda\x98\xf8\xeb\xcb\x75\xdd\xb5\x54\xc2\x0d\xde\x24\x74\x09\x59\xfa\x8b\xa1\xb8\x87\xfd\x21\x25\x0f\x49\xde\xa7\x0e\xd8\x87\x20\x8f\x12\x94\x08\xfe\x3e\x32\xaf\xe6\xdd\x47\x97\x3d\x8e\x06\x4b\x46\x9a\x75\x38\x06\x45\x65\xe6\x1b\x28\xad\x51\x2c\x7e\x94\x70\x15\xc8\xae\xa6\x1b\x32\xa0\xa3\x9d\x26\xae\xd5\x28\xd0\xf4\x46\x81\xd3\xb8\x44\xd2\x5c\xf1\xa7\x03\x7c\xd0\x2a\xcc\x0d\x9e\x23\xd6\x1f\x1a\xac\xbf\xab\xf0\xcf\x38\x17\x42\xfc\xfc\x3f\xe8\x50\xb4\xec\x28\x49\xc2\xe7\x74\x42\x4c\x6f\xa2\xbf\x0c\x18\x5d\xe3\xbd\x89\xd3\x27\x25\x24\xf1\x55\xf1\x38\x91\x20\xfe\x59\xef\x06\xa6\xbb\x54\x0d\x83\x11\x87\x8e\xa7\x82\x5b\x84\xf7\xb1\xa4\x46\x64\xd5\x84\x27\x56\xb7\x6f\x28\xac\xf0\xe8\x60\xf1\x5e\x91\x60\x09\x83\x3e\xc8\x17\x2f\xaf\xfe\x9e\xa5\x4e\x3b\xa1\x48\x36\x5f\x83\x17\x7d\x23\xd1\x0b\xc3\xed\x44\x93\x02\x3f\x0b\x67\x25\xfb\x31\xba\xba\xde\x80\x19\x72\xc7\xe4\xe2\xe1\xbc\x91\x90\xea\x3b\x99\x8d\x94\xfe\xf4\xa3\x16\x1f\xec\x3a\xd5\x8e\x50\x9a\xb4\x75\x0a\x6a\x72\x0a\x57\x37\xd0\x09\xda\xb3\xbe\x2d\xd7\xde\x7f\x9b\x90\x87\x28\x7f\xff\x46\xfe\x33\x5f\x40\x7b\x6f\x77\xfb\x87\x28\x91\x93\xd5\x43\x59\xbc\x37\xb3\xe7\xdf\xff\x87\xf7\x69\xc0\x84\x2a\xf4\x45\xc5\x77\x54\x7d\xf7\x41\x87\x99\x90\x66\x1e\xdd\x83\x14\xb1\x38\x17\xf7\x9d\x54\x67\x9f\x1c\xcb\xd1\xb0\x8f\x50\xc8\xca\xfd\xd1\x4d\x32\x29\xd8\x9b\x3c\x98\x49\x50\x04\xf5\xcf\xb8\x52\xd3\x01\xdd\x4b\x7e\xca\x92\x26\xf7\xd7\x92\x86\x55\x30\x6f\x95\x59\xb1\x50\x4e\xbe\x0b\xb5\x03\xa2\x87\xa8\xfc\xef\x7f\xe9\x85\x45\xf1\x71\x2d\x8e\x23\xc3\x77\x16\x11\x71\x27\x2f\x79\xc2\x7f\x6d\x6c\xad\xd2\xd7\x73\x53\x7f\x63\x0b\xf0\x29\x21\xbc\xe2\x32\xbe\x7a\xbb\x2b\xfa\x61\xee\x92\x7a\x53\x32\xed\xe0\x82\xc0\x9e\xc5\x04\xfa\x3c\xc5\xda\x47\xbe\x62\x95\x02\x78\x5c\xa2\x7c\xc9\xc7\x97\x29\xf9\x5d\xa4\xf7\xf3\x3a\x87\x1f\x93\xe9\x2a\xc6\x64\xf9\x5c\xd2\x46\xed\xc0\x29\x06\x13\xea\xe8\x06\xee\xd6\xa3\xa4\x4b\x26\xe3\xb0\xfe\x5c\x40\xc4\xc9\xe4\x43\x40\x83\x3f\xb2\xbc\x61\x3f\xf1\x10\xc5\xf3\x4e\x79\x64\xc1\x0a\x0c\x39\xda\xed\x6a\x10\x43\xf8\x24\x2f\xfb\x3d\xdc\xaf\x3b\x91\xc2\x76\x1b\xa3\x3e\x48\xc6\x87\x94\xcc\xec\x18\x8d\x65\x7a\x8b\xfa\xbd\x15\x1d\x73\x19\x09\xa0\xa6\xb5\x9d\xd7\x9d\xa3\x2a\x64\x56\x43\x7b\x17\xdf\xb3\x93\xbc\x5b\x36\xec\xc4\x3f\x37\x70\x5a\x78\x51\xa2\xb3\x50\xe5\x6b\x26\x3c\x98\xa0\x71\xf6\x16\x08\x23\xd5\xb2\x97\xf9\x54\xfa\x94\xf2\x7c\x59\xaf\x44\x8b\xff\xfd\xcb\x4b\x9a\x3e\xb3\xd7\x21\xbd\xbf\x96\x76\xb4\x8f\x1f\xa7\xcf\xe1\xb6\x48\xb7\xfd\x8d\xb5\xe8\x0f\x0b\x59\x8f\x5c\xb9\xd4\x05\x84\x2b\xf9\x5a\x0e\x93\xff\xa6\xf0\xa9\xb2\x34\x7d\x9a\xbf\xcd\xe3\xf7\x9d\xa9\x1d\x7d\x1d\x7a\x54\xc7\xf6\x55\xdd\x76\xf2\x05\x94\x92\xba\x02\x1d\x59\x0e\xb6\xbe\xbe\xb5\x5e\x0f\x79\xc2\x1c\x6e\x5c\x0f\xb0\xe4\x60\xc4\x25\xb9\xc1\xac\x1a\x53\x88\xe5\x15\x9c\xbf\x95\xde\xc6\xbb\xa8\xe4\x69\xb9\x7a\x18\x3c\xfc\x0c\xf3\x06\x86\x7a\xb3\x05\x04\x6a\x7b\xf3\x65\x1b\xbc\xd3\xda\x57\x97\xcc\x1c\x11\xd9\x78\xd0\xa8\x9b\xf9\xf5\xd0\xe5\x36\xf2\x67\x81\x55\x69\x64\xfa\xa1\x5c\x12\xc8\x7a\x58\x2b\xde\xf4\xe4\x77\xf0\xbf\x30\x4c\x5e\x67\xfa\xf0\x79\x47\xd6\xf1\x03\xd7\x11\xc5\x11\xb6\xcf\x86\xe9\xb9\xf7\xaf\x95\x77\x39\x8f\xdf\xaf\x08\xbd\x61\x16\x26\x80\x3d\x93\x99\x3d\x92\x08\x6b\x08\xbe\x44\xdf\xec\xd0\x1f\x92\x10\x62\xa8\xca\xfc\xd1\xf0\x56\x51\xdc\x0d\x48\xcf\x0b\x53\xcd\x72\x9b\x94\xab\x8d\xf0\x2c\xde\xae\x17\x3e\x33\x1e\x53\x5a\x4c\xd9\x1b\x5d\x0d\x57\xb9\xb7\x5c\xd6\x6c\xf5\x6b\x01\x0b\xea\xde\xd0\xb1\x0b\x72\x5c\x1b\xd2\xf5\x5b\x9c\xf8\xca\x47\x0c\xbe\x96\x6a\x6d\x7f\xea\x44\x0b\xc5\x94\x7d\x95\x24\xd9\xae\x08\x3c\x4e\x64\x7c\x51\xc5\x57\xb0\x83\xf5\x9e\x26\xfc\xc4\x70\x89\x7b\x59\x3b\xfc\xda\x45\xe0\xab\x92\xef\x6d\xe9\x85\xbb\x20\xce\x0b\x9b\x3f\x60\x5d\xce\xd5\x42\x6f\x41\xe9\xf3\xec\x29\xe9\x94\x43\x98\x24\xb4\x1b\xa9\xfa\x34\xe2\x96\x3c\xd2\x9b\xcc\x90\x7d\x7e\xab\x79\x12\xf0\x75\x42\x29\x5f\x12\x11\xad\xec\x5e\x34\xa6\x8f\x70\x6c\xf7\xd5\x96\xea\xce\x0b\xcf\xfc\xef\x0c\x81\x75\x1d\xd2\x24\x5b\x46\x0a\x6c\xd6\x00\x4d\x1c\xdd\x13\x96\x12\x92\x4b\x2f\xc3\x3c\x0a\x4a\x98\x65\xbb\x60\x4c\xf4\x64\x3f\x87\x9a\xb1\x6e\xb8\xd8\xdb\x67\x30\xb3\xc8\x00\x9d\xd1\x9f\xda\xa8\xa3\xb4\x63\xf9\x68\x76\x84\x63\x57\x93\x61\x26\xd8\x9f\x6f\x9c\xf8\x02\xe5\x48\x78\x82\x7d\xda\xc4\x86\xd3\x67\xfd\x80\xe9\x1b\x66\xb1\x30\x19\x16\xe3\xac\x3f\xe7\xeb\x2d\xdd\xc4\xa4\xde\x43\xa6\xfd\xe6\x74\xd0\x7f\x45\x46\x7d\xc8\x2a\x27\xde\xb0\x02\x64\xc7\x8c\xe8\xd2\xe9\xcc\xe2\xf4\x60\x7b\x8c\xcb\xc9\x18\x0a\xbc\x03\x0d\x7e\x24\xf1\xef\xab\xb7\xbf\xe6\x33\xbf\x28\xc8\x8e\x30\x2a\x02\xfb\xab\x2d\x2b\x91\x92\xb7\xd4\x58\xda\xb1\xab\x56\x3b\x59\xb3\xe3\x11\xbe\xd2\xa8\xd7\x6c\x60\xb9\x4a\xf7\xdc\x25\xb9\x89\x1c\xfc\x0e\x54\x09\x6b\x9d\x4d\xec\xad\xbd\x72\x5a\x60\x49\x5c\xfb\x81\x88\x78\x15\xec\x37\x35\x59\x57\x02\xab\x61\xdd\xc3\x47\x06\xb5\x21\x02\xba\x6b\xa8\xac\x8e\x0d\xbe\xd2\x29\x0b\xab\xd8\x24\x1e\xb4\x80\x6d\x13\xae\x4f\xd3\x9a\x94\xff\xb9\xec\xa3\x7a\xca\xee\xb3\x12\xda\xc6\x02\xfe\x26\x0d\x2d\xe2\xcd\x32\x6b\xd3\x8a\xe1\x4b\x1d\x32\x5f\xd6\x1c\x22\x9d\x0b\x9c\xe8\xc2\xaa\x06\x09\xa5\x6f\xb3\x65\x0f\xe2\x0d\x5f\x3d\x4e\x9f\xf6\xf7\xb6\x93\x9c\x54\xd7\x74\x0c\x3a\x9f\x3a\xc9\xef\x29\xd7\xdf\x01\x98\xcb\x9d\x5f\x12\xe7\xa6\xa9\x83\xd3\xf1\x57\x4f\x3e\x00\x35\x9a\x9b\xdc\x8b\x2a\xf6\x41\xab\x48\x7e\x9e\x75\x65\x92\xbe\x3b\x0b\x09\x99\x9b\x41\xec\x6b\x67\x2a\xe8\x3b\x6c\x2b\xa1\xcc\x48\xc0\xf4\x91\xd3\x0c\xb7\xfc\x2c\xa3\x74\xc8\x43\xee\x53\x71\x59\xbc\xb6\x9f\x1e\x10\xbd\x46\xf6\xf3\x98\x5b\x75\x99\x12\x17\x5f\xc0\x03\x88\x97\x16\x31\xe0\x26\x14\x4c\x2e\x94\x35\x77\x48\xaa\x48\x8d\x83\x9c\xa6\x0c\xa6\x7c\x2c\x66\x7a\x5e\x1c\x4e\xcd\xba\x23\x6c\x95\x47\x3e\x4a\x1e\xc9\x46\x3f\xef\x63\xd7\xf9\x72\xec\xea\xc6\x99\x17\x28\x21\x9d\x8a\xcc\xcb\x28\xfe\xe2\xfb\xe2\x09\x76\x54\x92\x3a\xf3\x0a\x1c\xb0\xa5\xec\x7b\x9f\x5a\x47\x64\x7b\x33\xbf\xd9\x5d\x45\xb2\xa0\x31\xef\xe2\x4d\x18\x6a\xcc\xdf\x2b\x4c\x5c\x7b\xc5\x67\xdf\x3b\x98\x41\x1f\x07\x6d\x52\xac\x59\xa2\x85\x94\xdd\xc7\x3b\x68\xbb\xa0\x3f\xc1\xb4\x42\x4d\x78\x19\x62\xc3\x15\xaf\xc7\xa4\x3a\x9e\xa4\x3a\x17\x5b\x06\xcc\x89\x92\x22\x54\xe6\xc9\xef\x90\xe0\xa4\xf2\x46\xae\x6c\xee\x9e\x20\xf4\xea\xdf\x68\x53\x02\x42\xaa\x64\xec\x8e\xb0\xf4\x9c\xcb\xad\x8f\x83\x32\xa3\x4c\x45\xda\xa8\x0b\x55\x7d\xac\xa4\x46\xab\x4b\x6b\x2f\xfa\xe8\xf2\xe2\xc2\xd9\xa9\x2b\x53\x01\x0b\x6b\xf5\x1d\x06\xfa\xc4\xa3\xe4\xd7\x57\x1e\x3c\xa3\xd4\xdd\xd6\x30\xa4\x66\xd5\x17\xec\x08\x4a\xe5\x6f\xbe\x2c\x74\x94\xbe\x22\x31\x34\x52\x39\xae\xc1\x36\xf9\x4f\x39\xbd\xe2\x40\x76\x06\x61\x5d\xfd\xd3\x52\x27\x6c\xda\x2d\x0f\x3f\x7c\xca\xcd\xe9\x57\x0a\x7e\xd8\x6a\xb0\x0e\xea\xce\x59\xbf\x56\x2b\x1e\xff\xbd\x6f\xce\x61\x84\xc1\xa5\x51\x92\xe8\x7b\xed\x70\x5e\xc9\x9a\xb9\x72\xe6\xec\x5b\x3f\x71\xd4\x85\xd8\x66\x87\x4f\xb1\xe9\xd3\x25\xc0\x3e\x0c\x74\x39\x15\xc7\x30\xb0\x6f\xca\x2e\xcc\x33\xb3\x0e\x4e\x9e\x33\xa1\xd8\x38\x56\x16\x2b\x28\x1e\x0a\xa2\xe1\x1b\x37\x1e\x00\xdd\x3d\x12\x65\xb9\xb2\x65\x9f\xdf\x67\xfa\x06\xa8\xab\xdc\x86\x9f\xe0\x32\x84\x71\x10\xb1\x46\x5e\x27\x8e\x60\xd7\xe5\x67\xeb\xf9\x83\x58\xcf\xf8\x76\x3d\xe7\x2e\x68\x5b\x76\x17\xb2\x2e\x19\xb9\x81\x46\x68\xb8\xc8\x4c\x49\xbf\x73\x53\x77\x98\xdc\x8b\x77\xa4\x2f\xb2\xc0\x49\x95\x9c\x76\xec\xa1\x96\x73\xba\x9a\xa6\x3e\xbd\xd6\x51\xdd\x2d\xc1\x11\x6e\x46\xfa\xff\x18\x7b\xeb\xa0\x2e\x9f\xe8\x6d\x98\x96\x06\xe9\xee\x90\xee\xee\x6e\x49\xe9\x6e\x24\x04\x04\x91\x86\x0f\x21\x48\x08\xd2\xdd\x20\xd2\x25\x21\xdd\x2d\x48\x4b\x77\x87\xb4\xe4\x3b\xef\x3c\xcf\x4f\xf6\x3b\xf3\xcc\xf8\xfb\xff\xcc\xde\x7b\xee\xfb\xec\xbd\xd7\x9e\x3d\xd7\x75\xce\xb3\x24\x84\xdc\xe8\xa6\x36\x23\x66\x2c\x65\x9f\x66\xca\x6e\x97\x73\x92\xb5\x56\x23\x69\x3d\xfd\xbc\x4b\xaa\x01\xb9\x1e\xa3\x0b\x0f\x2d\xc8\x31\x98\xa7\x1f\xd3\x33\xbf\xbf\xaa\x98\x04\x48\x9c\x71\xd3\x14\x4a\x91\x93\x97\xa0\x2b\x58\xcf\x41\xcd\x5f\x04\x50\xf0\x3d\xbb\x50\x0c\x59\x95\xe0\x52\xf2\x1e\x8f\xeb\xc3\xe4\x01\xfe\x12\xcf\xb4\xdd\xd8\xb6\x5b\xed\xdc\xeb\x4b\x11\x56\x79\x50\xfb\xbf\xd5\xb9\xb9\x1e\x2a\x4a\x7d\xeb\x39\x9f\x8a\x17\xdf\xd3\x8b\x05\x67\x7a\x86\x44\x73\x80\xf4\xe0\x7e\xd0\xc2\x35\x2d\x4f\x7a\x03\xd5\x5c\xf9\x39\x42\xdd\x88\x90\x74\xed\x8d\x4a\xd8\x73\x8f\xfd\x39\x90\x4a\x5d\x83\x51\xbc\xfa\x39\x5e\x07\x16\x72\x08\xe1\x8f\x77\x4c\x94\x5f\xd9\x50\x65\x42\x50\x16\xbe\xf7\xfe\xb4\x8b\xa3\x24\x9e\x8c\x09\xf6\x41\x51\x30\x97\x40\xc9\x9f\xb6\xec\x5a\x49\xeb\x64\x0c\x4f\x48\x90\x69\x5b\xd5\x66\x43\xb4\xb4\xfc\xc9\x11\x0a\x67\xb1\x67\x91\x01\x98\x4a\x46\xeb\x21\xed\x6d\xd0\xff\xa4\x38\x72\x32\xfe\xaa\x6c\x39\x18\xce\xb2\xa2\x49\x13\x5a\xad\xab\x69\x1f\x16\x45\xc0\xa0\xfc\xf0\x14\xfe\x54\xdc\x94\xd2\xce\x8f\x3a\x51\x8f\x68\xd5\x5b\x89\x76\xdf\x69\x9b\xb8\x58\x7e\xce\x76\xfd\x3e\x78\xdc\x95\x9d\xba\xdf\x73\x08\x7b\x7a\x01\x93\x54\x07\x73\xc7\x93\xd9\x37\x57\xc4\x47\x3f\x38\x22\x3e\x0f\x0c\xac\x90\x51\x13\xaa\x07\xd7\xd6\xe8\x14\x41\x15\x1e\x55\x40\x2e\x67\x61\xfe\x77\x00\x05\x22\x0d\xad\x41\x01\x22\xbb\x7a\xf8\x35\xa9\xaf\x01\x5e\xd8\x4e\x14\xf7\x06\xd0\x44\x5b\xac\x73\x9d\x74\x5d\x31\xc7\x19\xa7\x32\xeb\x73\xfd\x0f\x1e\xe2\xec\x60\x7f\xd1\x9b\x3d\x44\x1c\x3c\x5b\xe6\x86\x48\x17\x28\xa6\xa9\x48\x72\x7a\x08\xee\xf0\x58\x58\xbb\xed\x51\xe9\xc1\x94\xa2\xa7\x28\xd0\x74\xbe\x4e\x16\x6a\x29\x97\x20\x20\x28\x9f\xd8\xfa\x01\x5f\xad\xfe\x5d\xba\xd5\x4a\xb7\x8f\x7d\x55\xc2\xb4\x73\x4d\x81\xbd\xbd\xa6\x31\xd8\xc9\xbe\x21\x0f\xf5\xcf\x60\x40\x50\x26\x86\x1b\x6c\xc8\x12\x4b\x77\xa1\x68\x76\x42\xd6\xbb\x8b\xb7\xc9\xc1\x64\x73\x67\x7e\x6b\x9c\x4f\x83\xaa\xbe\xba\xcf\x73\x1f\xee\x56\x81\x29\x7b\x6c\x15\x7f\xf3\x10\xb3\xde\xd5\x7f\x89\x6a\x02\x3f\x00\xa9\x54\x53\x29\xc0\x76\x07\x3b\xf0\x35\x70\x2d\x9f\x13\xb9\xe9\x29\xcb\x55\x14\xfa\x67\x29\x3f\x17\xc5\xba\x7e\x61\x58\xdf\x8f\x59\xea\x24\xad\xb8\x89\xcb\x4c\x86\x0f\x98\x1e\xc0\x55\x0f\x6c\x18\x7f\xae\xe1\x7f\x80\xe3\xc6\x71\x6d\x82\x25\x7e\xcf\x25\x09\xc7\x9c\x9e\xb8\x75\x80\x0b\x25\xbb\xb8\x3d\xf0\x17\x33\xff\x0b\xcf\x41\xa4\xc3\xa0\x60\x29\x80\x37\xcb\x64\x39\xbc\x0e\xd7\x2b\xdd\x5d\x57\x0b\xcd\xb2\xc4\x23\x9f\xac\x74\x3c\xa3\xae\xe1\xbc\xf5\x65\xfe\x0d\x03\x6b\xf4\x2b\x42\xf0\xe4\x9f\xf1\xe0\x1d\x29\x37\xd3\xef\xc9\x43\xd8\xf9\x89\x63\xb2\x1d\xdd\xfc\x45\xd0\xd1\x73\x6d\xb2\xd6\xa9\x2a\xa9\x91\xc4\x26\xae\x33\xb0\x4e\xc3\x16\xc2\xc2\xcd\x7c\xda\x3a\x51\xe4\x9d\xc8\x89\x50\x35\xee\xf3\x10\x4a\x1f\x79\x52\x0e\x8d\x51\x66\x20\xd4\xb6\x8b\x89\x08\x1e\xf7\xf8\x9c\x77\x53\x30\xb0\x59\x0e\x5a\x5f\x59\x91\x6c\xe5\xde\x78\x8e\xf5\xae\x98\xf0\xb4\x21\xa3\x4d\x7a\xb2\x3d\xc7\xb9\x04\x0b\x50\xb4\xdf\xaf\x06\x73\x71\x2c\x89\x10\xe1\xe0\x7b\xe9\x93\x9d\xc8\x7a\x9a\x7f\xad\xfa\x55\x55\x5d\x6a\x9c\x9a\x18\xfd\xf2\xd8\xe9\xe8\xef\xc9\xf0\x5f\xb0\x0e\x22\x1d\x00\x0d\x07\x56\x0d\x49\x98\xc3\x08\x11\x26\x53\x97\x28\xdd\x8d\x95\xed\x0d\x62\xc8\x5d\x22\x5b\x73\x06\x54\x75\xcb\x7c\xa9\x92\x25\x0f\x0c\x9a\x05\x90\xd0\xae\x64\xc4\x89\xff\x8d\x84\x3f\x37\x45\x7a\x53\xbf\x62\x2a\xe6\x73\x37\x24\x91\x37\x8e\x94\xc8\x66\x6f\x1a\x38\xe7\xc2\x88\xc1\x83\x43\xad\xc8\x03\x9c\x5e\xf6\xe7\xdb\x9b\x83\x38\x17\x4a\x45\x43\xc9\x7c\xbb\xd3\x10\x37\xca\xfb\xbd\xe6\x08\x92\x30\x39\x49\x8a\x60\xc0\x74\xda\x6e\x8a\x71\x1a\xe7\x53\x46\x96\x17\xcc\x39\xb3\xd3\xf9\xf6\x6d\xb6\xc4\x19\xaa\xb3\x23\xc9\x9a\x4f\x56\x37\x75\x3a\x59\xc3\xdf\xaa\xa1\x7f\xee\xc4\xd2\x70\x81\xff\x69\xe7\x3f\xeb\xf9\x52\x8c\x66\xc0\xd4\x54\x1f\x6a\x68\x83\xa5\xc2\xac\x4d\x48\x63\x6a\x64\xf9\x2e\x5a\xd0\x58\x95\xab\x25\x08\x87\x51\x00\x98\xc4\xfa\x3b\x04\xb8\xc0\x4b\x16\x76\x48\xf5\x56\x59\x8f\x9d\x73\x68\x2f\xaa\x9a\xff\x82\xb2\xe8\xec\xbc\xc0\x34\xa1\x0e\xfa\x47\x50\xf0\xd9\xaa\xde\x3a\xb1\xa7\xf0\xce\x83\x66\xc9\x89\x96\x59\x3b\xaa\x0b\xfa\x08\x56\x3a\xc2\xf5\xf0\x4f\x3e\x69\x4e\x20\x61\x04\x04\x64\xa6\xbe\x9f\x97\x3d\xe8\x1b\x3b\xd8\x08\xa8\x78\x1f\x6c\xd0\xf2\x61\xe5\x91\xd7\xd7\x13\x9f\xf0\x22\x50\xea\x95\x63\x38\xe5\x92\xce\xc2\x5f\xd7\xfe\xb5\x23\xfd\xff\xa1\x4b\x01\x03\xb8\xe6\x11\x62\x6a\x72\xc5\xd3\x11\xd4\x4f\x47\x7d\xf2\xbe\x9c\xec\x34\x59\x4f\xbb\x0a\xc6\x13\xe7\xc8\x22\xca\xe5\x0a\x73\x03\x0f\x74\x6d\xab\x96\x2c\xb7\xf6\xfd\x94\xad\xb6\x52\x8f\xd5\xa6\x52\x73\x7c\xec\xb7\x22\xb9\xb5\x11\x3a\x16\x77\x4d\x27\xff\x84\x85\x12\xb0\x25\xc0\x2f\xf6\x2d\x98\xa9\x35\x35\xe9\x9f\x14\xad\x0f\x62\x18\x1f\x83\x04\xb1\x13\xc5\x39\xfd\x04\xe1\x90\xf2\xd1\x8f\x8d\x55\x50\x41\xf6\x35\x85\x98\x92\x06\x5a\xf4\x7b\x92\x0e\x71\x0e\x78\xe5\x8d\xe6\x94\x94\x52\x5c\x91\x94\x71\x9d\x90\xd0\xe6\xb1\x8c\xb7\xe7\xe6\xd2\x7f\xe3\xf1\x5f\xfb\x12\x44\x0a\x06\xf1\x05\xe0\x59\xed\x01\xa5\x00\xa2\xf5\x6b\xbc\xea\x65\x58\xb2\x70\xc1\x29\xfb\xea\x54\xe5\x57\x56\xec\xde\x47\x77\x9a\x1a\x59\x30\x7d\xb6\xa0\x67\x5f\x5f\x30\x10\x12\x0b\x34\xb6\x78\x55\x6b\xb6\xd9\xc7\x3c\x20\x4e\xb3\x6b\xa3\xf4\x1f\x51\x7c\x5b\xd7\x3c\xdb\x61\x59\x88\xcc\x04\xa7\x4b\xe4\xda\x25\x3c\x9f\x96\x13\x35\x9e\x7a\x49\x4b\x78\x2b\xe4\xe8\x97\x4c\x47\xbc\xf2\x13\x53\xb5\x89\x20\x35\xec\xc0\x10\xd4\x7d\xa2\x73\x7b\x13\x86\xce\x27\x7c\xce\xea\x87\x23\x43\x40\xa0\xf4\xa8\xcd\x4d\xb4\x9a\x7d\x71\xff\xbd\xf2\x51\x24\xa9\x4b\x29\xfa\xf1\xef\x47\xfb\xd7\x3e\x06\x91\x16\x47\xc5\x04\xc9\xa9\xab\x22\x61\xe4\x25\xe6\xf8\xaa\x1b\xc5\xe2\x82\x97\x70\xdb\xf3\x38\x24\xdf\x92\x5e\x7f\xdd\x79\xcb\x7e\x9e\xb4\xf7\xf6\x55\x1e\x58\xd4\x99\xfc\x28\x1b\xbe\xb5\xaf\xa8\x56\x9d\x10\x77\x40\x82\xf6\xe7\xb3\xdb\x19\x1c\xfd\x1a\x6a\xc0\xab\x24\x91\x71\xd9\xc0\x39\x42\xf0\x34\x9d\xbe\xad\x63\x49\x6b\x66\xe4\xa5\xd6\x88\x3a\x1e\xea\x29\x87\x69\x4e\x09\xfb\xf8\x47\xf6\x44\xa3\x60\x31\xe5\xc6\x68\x1a\x19\xe4\xed\x8f\x69\xac\x9b\x7d\xe1\x94\x12\x42\x3c\xe1\xa7\x18\x14\x0c\xd8\xad\xae\xa0\x3a\xd1\xb7\x60\xf8\x45\x0f\xcb\x5e\x5e\x5e\x95\x96\xfb\xb7\x8a\xed\x5f\xfb\x2e\x44\x0a\x1e\x2a\x00\xc8\x23\x67\xdc\x09\x1d\x58\xea\xcd\x32\x24\xcd\xb0\x91\xf3\xc5\xa1\x76\x6e\x36\x45\xd6\x20\xe6\x29\x4f\x11\x2b\xbb\x49\xf2\x70\x5b\xa2\x00\xdb\x49\xe0\x03\xb1\x44\x9c\x5b\x0b\x94\xce\x5b\x02\x9f\xd6\xb6\x3e\x11\x01\xcc\x3a\x24\x65\xc3\xe8\x81\xb2\x17\x91\x1d\x12\x86\x6f\x95\x9e\x7e\x37\x69\x86\x5f\xa1\xa5\x1e\xd4\xa9\x18\xcd\xb3\x3e\x29\xd9\x77\xd1\x7d\xc6\xdb\x7a\x36\xd6\xd7\x22\xd1\x70\xb0\x28\xa3\x76\xb0\x28\x0a\xb2\x58\x23\xe7\x14\xe2\xdf\x50\x09\x92\xd1\x2d\xcd\x0e\x0e\xcf\x6e\x5e\x30\x54\x8d\x26\xb7\x86\x4c\xe6\x67\x6f\x5c\x51\x51\x87\xea\xfd\x4d\xa1\xfe\x0b\x25\x40\xa4\x68\xa1\xc1\x2d\xa2\xef\x64\xd1\x67\x3b\x24\x98\xe6\xd4\xae\x6d\x2f\x95\xa6\xb1\x83\xbd\x97\x1b\x99\xc0\x68\x89\x4d\xc9\xd7\x56\x36\xa4\x76\x02\x24\x09\x67\x86\x5a\xe3\xff\x7c\xe9\x6c\x41\xb4\xcb\x1a\x32\xa1\xa2\xe4\xbe\x74\x46\xd9\x4a\x85\x6d\xe5\x8c\xbb\x7f\x5f\x94\xed\x1a\x06\x16\x4a\x52\x99\xb1\x63\xd6\xaa\x40\x8a\xeb\xab\x45\xda\x55\xd0\xfb\x8e\xe1\x38\x3d\x47\x3d\x5a\xdc\xe0\xf5\xe8\xd6\xbc\xd9\x1d\x9e\xad\x02\xa6\xdd\x8a\xbc\x5f\xc2\xe9\x6a\xdb\x42\x52\xab\x76\xbc\xbb\xe3\xbe\x63\xd4\x1e\xd8\xda\x2a\x16\x5c\x1c\xf8\x06\x4c\x7c\x28\x64\x01\x6b\x86\xab\x13\xa7\x1b\xbf\xf3\xb8\x30\x0a\xc6\xa0\x58\x55\x79\xb3\x4c\xae\x62\xc2\xff\xea\x38\x45\xd4\x14\xd8\xfb\x94\xba\xa5\x58\xe1\xf5\x77\x49\xfe\x13\xff\x48\xc9\x9b\x82\x71\x6b\xc1\x47\xf5\x7a\x39\x5f\xe9\x4f\xf3\x56\x04\x94\xeb\x71\x5e\xd9\x96\xc9\xdb\x71\x51\x18\xaf\x8b\x9f\x53\x0e\x1b\xed\xa5\xe1\x60\xbf\x94\xe6\x18\x0d\x13\xeb\x14\xb9\x83\xc9\xa9\x3a\x25\xff\x07\x97\xcf\x1e\xb9\xc2\xfe\x15\xca\x63\x52\x26\x5c\xcc\x3c\x49\x3d\xd5\x60\x13\x05\x99\x8b\x4c\xc4\x22\x5a\x18\x6a\x0b\xf2\xb3\x5f\xd9\x91\x37\xb7\xe4\x69\x4a\xe3\x83\x92\xb3\x77\x06\xc1\xb7\x7a\xdd\xb4\x6c\x20\x49\xf9\xc0\x9d\xcc\xcb\xaf\xfe\x53\x66\x0a\xcf\x7e\x38\x65\x84\xe8\x55\x76\xad\xce\xdb\xb7\xe8\x7f\xfc\xdd\x87\x52\x10\x86\x88\xf1\x3f\x5c\xe6\xe2\xfd\x1f\xc3\xfe\x6b\x22\xfa\x5d\x6a\x3b\x39\x24\x49\xe4\xdf\xfd\x98\x2b\xfd\x3f\x68\xdc\x0f\x97\x9f\x53\x3f\xe4\x6c\x78\x45\xc6\x9e\xbd\x9e\xfc\x7f\x10\x69\x45\x54\x1d\x82\x66\xaa\x14\x8f\x07\xfc\x68\x7f\xf4\x69\x52\xaa\x26\x9c\x58\x18\xdb\xf4\xe1\xbd\x74\x18\x6e\x3b\x3e\x5d\x4f\xff\x04\x98\x26\x66\x3a\x0a\x1d\xc3\x2f\xee\xa4\x8e\x2c\x70\x84\x99\x14\x4e\xb1\x1c\xbe\x6b\x46\x3a\xfd\xd6\x19\x7e\x92\xe1\xee\xf2\xfe\x98\xeb\x29\xc8\xdd\x76\xca\x78\x62\xdf\x6b\xe1\xa6\x40\x39\x59\xdd\xf9\x86\xee\xd6\x7b\x33\x96\x8a\x25\x5d\x94\x71\xf8\x5c\x68\x36\x60\xc2\x02\xb4\xcb\x47\xc8\xe5\x65\xc5\x3c\x86\xb0\x97\x6d\x3a\xec\xb5\x4b\x08\x31\xcc\xc8\x98\xf5\x85\xdf\x5b\x3f\x15\x82\x54\xb4\x5c\x6a\xe6\x46\xe0\x84\x81\x90\xd2\x6f\x6e\x77\x07\x4f\xcb\xf8\xb5\x3b\xb3\xa7\x8d\x78\x2a\xcf\x07\xa6\x85\x29\x30\xcf\x46\xcc\x35\x37\xae\xd8\x0a\x1b\x60\xb2\x86\xcc\xa8\xe4\x7e\xb4\xee\xcd\x1e\xf2\x6c\x16\xa1\x41\x7a\xb6\x84\x9e\x9b\x3d\x56\x24\x62\x42\x9a\xb6\xfc\xf1\x2a\x6a\xfe\x0d\x50\x08\x9c\x1a\x1b\xa9\xf6\x52\xb6\x32\xa0\x6c\xf2\x23\xde\xb1\x2f\x59\xd9\x7c\x71\x57\xa1\x20\xe2\x85\x09\xed\x97\x02\x75\x93\xf7\x1a\x71\x20\x6e\xb7\x3a\x3f\xce\x7c\x3d\xfd\x66\x6d\xf8\x53\xc4\xeb\xb4\x48\xd1\x7c\x3b\xe5\x67\x2e\x5f\x2e\x4e\x22\x57\x43\x55\x2d\x9e\x9d\x17\xd0\x01\x90\x31\xba\x60\x57\xbc\x50\x91\xba\x2d\x2d\x14\x3b\x21\x72\x03\xf2\x5e\x90\x9b\xa6\x4a\x7f\xf2\x6b\x4b\x89\xbd\xd2\xf3\xcc\x5c\x5e\x20\x61\x54\x25\x20\xeb\x6f\x98\x71\xae\xe8\x3b\xc1\xf6\x2a\x75\x86\xa2\x8d\xcc\x10\x2d\xf1\xfa\x17\xdd\x3b\xd5\xf1\x71\xcf\x92\xf9\x2e\xc0\x7d\xf2\x89\x04\x7e\x27\xb4\xa2\x88\x09\xc9\x58\xdc\x6e\x43\xb7\x4f\x69\xe6\x26\xf3\x8f\xc7\x3a\x8d\x99\x1d\xbe\xf4\x3d\x84\x02\x80\x02\x2f\xa7\x3b\x73\x8b\xa2\x32\xea\x30\x44\x0d\x46\x60\x62\xe6\x83\x91\x59\x02\x5d\xd3\xe7\xcc\xca\xc8\xa9\x5d\x12\x19\x21\xe4\xb4\x51\x80\x73\xbb\xa6\xb0\x32\x25\xc0\xdc\xb4\x33\x31\xc8\xed\xc2\xa5\x80\xa6\x6f\x9b\x43\x77\xf7\x72\x9f\xa9\x98\xa0\x9d\x7b\x1d\x9d\x8d\x08\xf8\x6f\x11\x32\xcf\xe3\x2b\xf5\xcf\xe2\x15\x6b\xdf\x13\x34\xe6\x7d\xc3\x1a\x76\x26\x34\x4d\xed\xbf\xd5\xb2\x41\x69\xb5\x3c\x17\x47\xfc\xf0\x34\x68\xeb\x32\xab\xc6\xe8\xb8\x49\x1d\xfe\x0a\x7d\xec\xf6\xdc\x36\x19\xbc\x77\x2e\x94\xc6\xe2\xf8\x4c\xb4\x8d\xf6\x4e\x9d\x01\x1e\x28\x05\x61\xec\xe9\x3c\xd1\x44\xb0\xcf\xa5\xe5\xa9\xca\x73\x12\xba\x3e\xe2\x51\x8b\xb3\x1c\x2f\x70\xdf\xa6\xf7\x82\xea\x65\x47\xf9\x83\x3b\xf0\x7c\x2e\xc2\xe7\xe4\x31\xa8\xa9\xbb\x13\x21\x1f\xce\x2a\x5a\xbf\x1d\x7b\x63\x66\x8c\x86\x30\x11\x9a\x23\x37\x86\xd3\x5b\xf5\x2e\x00\xa9\xad\x35\x6a\x12\xd2\xdf\x8a\x5f\xee\x33\xc2\xef\xc2\xeb\xb2\x8d\xe4\x58\xd0\xbd\x54\x69\xc5\x32\x29\x4a\x5c\x9a\x2b\xe9\x5f\x44\x3a\x00\x83\x86\xb5\x0c\x7f\xd1\xbb\x4f\x44\x23\xc4\x4d\x17\x34\xad\x0d\xb6\x1a\x65\x52\x45\xfa\x66\x47\x8e\xdc\xa2\xf0\xf3\x99\x5e\xf2\x2c\x50\xce\x58\xa5\x65\x39\xd2\x7e\xdc\xba\x96\x56\x96\xac\x23\x10\xa0\x20\x73\x66\x15\x54\x5a\x25\xc0\x96\x82\x34\x81\xdb\x01\xf3\x3c\x13\xec\x9e\xe7\xaf\x6f\x14\xc2\x59\x66\x7a\xcf\x95\xae\xd2\xf3\x25\x8c\x31\xea\xf1\xa3\xb9\x45\xed\xf7\x7a\x37\xef\xd0\x6f\x29\x72\x70\x83\xca\x4f\x83\x86\x56\x6f\xde\xd9\x3b\x43\x87\xe2\x05\xf6\xe6\x18\x78\xb2\x9e\x70\xb1\x3b\x87\x2a\x52\x1d\xcd\xaa\xb6\xdb\x10\x7d\xd0\x7b\x5f\x03\xec\x05\x05\x0c\x87\xba\x43\x4a\xaa\x0b\x41\x22\xcf\xb4\x12\xf5\x3a\x39\xd8\xd9\x7d\xd3\x3e\x29\xa8\x3e\xfb\xce\xa0\x46\x8c\xe1\x03\x05\xf8\xc4\x56\x38\x61\x7c\x21\x51\xcd\xce\xfd\xfa\x1c\x73\x9b\xa8\xdb\x0d\x8a\x20\xa2\xc4\xe9\xf1\x3d\x9f\xbb\x67\x3e\x03\xd1\x86\x0d\x90\x33\xd0\x5c\x34\xce\x89\x33\x2f\x5f\xa2\x12\x8c\x59\xb8\xe7\x5f\xf0\x8a\x49\x5a\xf7\xd9\x10\x89\x5a\xdc\x60\xb8\xe0\xea\x69\xd5\x6c\x00\x7c\xa2\x25\x35\xd4\x4e\xac\x76\x8a\x08\x50\xfa\xfc\x12\x93\x76\xa3\xad\xa6\x1f\x87\xe7\xfc\x3c\x81\xec\x0b\x79\xcc\x77\x8a\xfd\x10\xf6\xa7\x41\xad\x18\x0f\xfb\x4b\xf9\x49\x04\xf0\xb0\x14\xc5\x6f\xb9\xba\x52\x4f\xad\x27\x0a\xf6\x2c\x8e\x82\x9d\xd4\x54\xc9\xa4\x26\x60\xac\x9f\x2c\x7d\xd5\x75\xe6\x7b\xc2\xc3\x63\x99\x36\xbc\x6a\x44\x8d\xbb\x5d\xda\xd7\x2f\xbf\xa3\x9d\xd6\x57\x08\x45\xdc\x6e\xda\xee\xdf\x44\x81\x97\xaf\x85\xc6\x0f\xc6\xc2\x5b\x66\xfb\xb1\x6c\x5b\x95\x16\xc3\xf9\xdf\x83\xa6\x11\x0f\xe0\xf9\x56\x89\xda\xf7\x54\xd9\x73\xa5\x80\x6a\x2e\x87\x38\x0f\xfa\x3b\xf6\xe3\xf2\x33\x96\x83\x47\x9a\xef\xfa\xe9\x7b\xbf\x9c\x4b\x11\x02\xe3\x55\xcc\x1d\xb7\x90\x83\x0b\x0b\xe5\x81\x41\x99\xa8\x46\x74\x59\x29\xdf\x6f\x1c\xad\xc9\x1d\x90\x11\x7d\x71\x15\xec\xee\xc9\x9a\x64\xc1\x39\xd2\x44\x7c\xfd\x19\x7e\x53\x10\x50\xd4\xff\x72\xf8\x2b\xf6\x76\x3e\xac\xd4\x1b\x81\x07\x2a\xb9\x97\xfb\x85\xbd\x42\x63\x9c\x96\x3e\xe7\x37\x17\x06\xa6\x3d\x6e\x05\x85\x14\x60\x50\x19\xcd\x81\xe2\x91\xc6\xa1\x8d\xfe\x1d\x72\x38\xc7\x75\x6f\xfc\x2a\x57\x02\x15\xb5\x60\xb1\xb6\xbe\xee\x9a\xd9\xe7\x82\xe1\x3a\x4f\x83\xbe\xa5\x82\xc5\xaf\xfc\xc6\xd7\xce\xea\x97\x88\x9a\x26\xa9\xba\xfb\x93\xee\x0b\xde\x99\x30\xad\x8c\xc9\x2d\xb1\x46\xe6\x96\x38\x48\xe3\xa6\x41\x57\x53\xe7\x92\xe1\xcf\x27\x94\x63\x49\x0d\xc9\x20\x3b\xdc\x3c\x86\x42\xf7\x1b\xed\x9d\x9d\xfe\xfc\xf1\x98\xfc\xfc\x73\x09\x20\x7f\xd7\x55\x2b\x30\xde\x30\x45\xb8\xbb\x88\xf7\x9a\xa3\x07\xc6\xf7\x9d\x00\xa5\x8a\x36\x72\xa8\xc0\x2f\x97\xc5\x73\x41\x66\x3b\xc6\x27\xcb\x2c\x5d\xa2\x30\x0f\xc8\xf0\x8b\x95\x00\xae\x3f\x77\x7e\x23\xf9\xdb\xfa\xf9\xdf\x65\x64\x49\xa3\x90\xcb\x8c\x1b\x5f\xc1\xd1\xd9\x03\x8f\x77\xe4\x4d\xc0\x13\xfc\xe3\x95\x15\x55\x39\xdb\xb4\x67\x5d\x22\xcf\x37\xe1\x4d\x4a\x6c\x5d\xdd\xa6\xc5\xd9\xca\x99\xda\x29\x03\x68\x8a\x45\x3a\x06\x48\x6e\x42\x75\x32\x8f\xe0\xad\x98\xec\x45\xc3\xe3\xd2\x9e\x99\x23\xb7\x93\x07\xad\xa6\x2e\x88\x1c\x2e\xc8\xcc\x00\xff\xfd\xdc\xb7\xe1\x97\x96\xd3\xf5\xe5\xe7\xea\x15\x53\x59\x81\x43\x53\x1e\xf1\xd2\xe1\x19\xa2\xa2\x7b\xee\x31\x58\x3f\xac\x2d\x96\x0e\xc1\x9a\xf3\x02\x29\x05\x1e\xc8\xae\x6d\x8e\x6a\x3c\x67\xd1\x74\x6e\x94\x5b\x1f\x22\x55\x4b\xad\x58\x03\x66\xab\x81\x48\x4e\xb9\x1b\x50\xa0\xe7\xd5\x8c\x14\x1f\x6b\xa9\x6e\x87\xf3\x18\xcd\xff\x52\xad\x90\xae\x57\xf5\xd7\xda\x45\x61\x99\xce\x7b\xde\xab\xb7\x1f\x1e\xcd\x55\x80\x9a\x63\x1e\xe7\x94\x95\x63\x03\xd9\x41\xb1\xbe\xb3\x97\x92\xf3\xf9\xa5\xf4\x63\x51\x19\xc1\x5d\x9b\x89\xfb\x9f\xe7\x37\x27\xe1\x41\x58\xe1\x57\x2b\xad\x1b\x41\xf7\x4c\xf1\x00\xd1\x74\x86\x63\x28\x28\xf4\x31\xe4\x83\x1d\xd6\x92\xe3\x54\x2d\x0e\x65\xe5\x87\x91\xad\x31\xe0\xe3\x7f\xd6\x3e\xb7\x5f\xa6\x4d\xa8\x49\x29\x84\x1c\x56\x93\x59\x66\xf9\x0a\xc0\xae\xad\xaf\xb9\x54\xf5\x69\x27\x2a\xcc\x2a\x75\x01\xcd\x2c\xaa\xbb\xde\x21\xd8\xee\xfc\x92\x45\x5f\x2c\x85\x17\x44\x33\x94\x3b\x66\x2b\x4f\x57\x9b\xef\xa2\xa9\xf6\x84\xc0\x33\x71\x6a\x83\x3f\x3e\xb9\x9c\x29\x8d\x98\x14\xcf\xd3\x32\x6a\x3a\x8f\xaf\x28\xfc\x52\x03\xd2\x32\x83\xe9\xd4\x92\x7f\xa4\x47\xcd\xb2\xc7\xb4\xef\x00\x8d\xea\x6b\xd6\x0a\x5c\x6a\xeb\x20\x6c\x56\xf3\x03\xa9\x6b\x4a\x95\x86\x48\xe4\xc3\xad\x2f\x47\xba\xd1\x1d\x66\xd4\x72\x84\xd3\x0e\xee\xe0\x66\xf6\xa8\xc9\x23\xec\x66\x8a\x3a\x2d\x8e\x6d\xd4\x81\xc3\x92\x7a\x77\x84\x98\xb0\x1d\xb5\x55\xf9\x52\xc5\xdb\xc0\x14\xa3\x7f\xbe\xe1\xe9\xf5\xa3\x68\xfd\x80\x0d\xcc\x6d\x80\xc8\xcb\x5e\x49\x66\x8c\xc0\x79\xfa\xbe\xbe\xf0\xc7\x0e\x71\xa4\xb6\x18\x25\x59\x36\x2f\xc8\x12\x04\x22\x9a\x1b\xce\x14\xbf\xd2\x58\xab\x10\x12\x13\x23\x03\xd5\x40\x30\x65\xe5\x62\x57\xe4\xf9\x41\x63\x71\xfc\x47\xfa\x47\xd1\xdb\x10\xe0\xf6\x81\x29\x6b\x57\x38\x30\x4f\x21\x56\x8b\xf3\xbb\xfa\x25\x06\x8e\xd8\x8a\xeb\x6b\x87\xc5\x16\x86\xf6\x2f\x6a\xb2\xca\x74\x06\xff\x51\x1e\x0c\x96\xa8\x1a\x7d\x16\xa2\x1b\xfc\x22\xe3\x6e\xdf\x98\x21\x99\x4c\xdf\xcf\x04\xe5\x87\x4a\xd0\x88\xcc\xa8\xc0\x0d\xee\x5a\xea\x1d\xc8\x0e\xe0\x74\x94\x46\x72\x99\x37\x99\x24\xe9\xba\x11\x7b\x1d\xb6\xae\xba\x28\x3b\xa7\x7c\x8e\x6f\xa4\x7d\x30\x3f\x17\xb2\x3b\xac\x08\x60\x89\xf2\xb7\x3d\x15\x4e\x36\x94\x17\x92\x17\xf6\xb9\x8d\xca\x27\xe5\xe5\xca\xde\x55\x9e\x75\xb2\x99\x4c\x33\xb8\x85\x50\x46\xab\x00\x8d\x42\x58\x6a\xd8\x3e\x34\xdd\x9e\x15\x5f\xda\x1d\x9d\x89\xf6\x97\x17\x03\x25\x2c\x2f\x9d\xda\x47\x5c\x8d\xec\xdc\x37\xd2\xba\x40\x0e\x30\x6e\xa4\x10\x43\x66\x5c\x29\x56\x11\x3b\xa7\x58\x8b\x71\xc1\xd5\x2d\x83\xfd\x40\xd9\xeb\x73\xee\xd0\x7b\x49\xe7\x21\x8b\x1e\x02\x20\xa4\xa9\x28\x96\x31\x87\x5e\xd0\x7d\x79\x8f\xc4\x54\xd7\xce\xde\xc3\x1f\x76\x48\x2b\x90\xb2\xec\x33\xa2\xfc\x45\xb9\x03\x79\x51\x06\x08\xd4\x91\x56\x52\x99\x3f\x81\x46\x2f\xc9\xb5\xa2\x92\x79\x29\xd1\x17\x6b\xe4\x1a\x2b\x8a\x91\xca\xd6\xe2\x95\xa8\x3d\xdf\x75\x7c\x00\xd2\xff\xbf\x9b\x84\x77\xc6\xb3\xce\x25\xc8\xf2\xb3\xcb\x6c\xd9\x47\xe5\x3e\xdb\xa6\x35\xb3\x32\x7e\x4a\x2b\xdb\x73\x98\x9c\x22\xf4\x4d\x00\x1e\x8f\x23\x3c\xe3\x7e\x80\xa0\x9c\x1f\x5a\xed\x4b\xcb\xe1\xe7\xcf\x1a\x46\x41\x49\xe3\x1a\xbb\xa0\xd1\xa4\x50\x19\xfc\xbd\xc9\x0f\x40\x52\xc6\x42\xf0\x9c\x6c\x5b\xfe\x96\x7b\xc5\xd4\x89\x6b\x1d\x33\xfe\xf6\x4d\x32\xb8\x14\x48\x1f\x71\x0c\x4d\x71\xe1\x56\xa5\x3a\x17\x9f\x2c\x9b\xa3\xee\xcc\x7a\x7b\xde\x9e\x6b\xfc\x51\x5d\xce\xc4\x3f\x43\xd1\xc6\xcb\x31\x27\x0c\xc0\x7f\x43\x60\x45\x58\xe0\x55\x3c\xb1\x0c\x44\x74\x72\xd1\x21\x22\x1e\xea\xe8\x8d\xf3\xc7\x91\x18\xbf\xac\x21\x7b\x02\x68\x15\xdc\x95\x5b\x4d\x05\x9a\x4d\xf9\x96\xd4\xf4\xdf\xc0\x3d\xc9\xce\x7a\x87\x83\x4f\x61\xb4\x3f\x1a\xa2\x4d\x25\x25\x95\xfc\x27\xa9\x85\x9d\x9f\x14\x1b\xa4\xcc\xd3\x71\xab\xf0\x8c\x72\x51\x20\x6f\x72\xfc\x54\x11\xaf\xec\xd7\x54\x71\xc9\xe2\xc6\xec\x3c\xeb\xe5\xfe\x11\xdb\xca\x43\x24\x95\xc5\xcd\x06\x4d\x3b\xf6\x80\x68\x98\xc9\x5f\xf4\xff\x2f\xc0\x0b\x91\xca\x0e\xc0\x04\xd0\x7f\xa1\x6c\x39\x9a\x78\x55\xd9\xad\xca\xcc\xe2\x52\x53\xd7\x76\x23\x17\xda\x7c\x01\x25\x45\x03\xbe\xcc\x26\x12\x86\x92\xb8\x62\x00\x30\x87\x89\xed\xf7\x81\x27\x4b\x44\x79\xce\xc4\x32\xed\xaf\x42\xe6\x47\x20\x25\xc5\x76\x12\x81\xf7\x25\x09\xdd\xe7\x2a\xec\xa2\x58\xe0\xfd\xba\xfa\x24\x51\x73\xed\x40\x47\xd1\x64\x4c\xa0\xa1\x5e\x5b\xd8\x23\xf5\xc5\xf7\x21\xf6\xe5\x4e\x48\x50\x86\xc0\x9f\x2c\xaa\xd7\x96\x60\x69\x0a\x0f\x96\x99\x09\xad\xe0\x8d\x94\x80\x61\x76\x62\x68\x30\x9f\x2a\x7a\xdb\xf3\xa8\xd9\xb2\xaf\x8a\x3c\xb2\x45\x15\xca\x8d\x56\x97\x10\x98\xff\x25\x3e\x97\x82\x69\x07\x93\x28\x33\xac\x46\x4d\xdf\xbe\xc7\x2f\x15\x27\xd5\xcc\xa4\xa9\xe8\x31\x9a\xd3\xd9\xe9\x7d\xeb\x3f\x41\xa9\x1d\x98\x63\x88\xa3\x0f\x76\x00\xe6\x80\x11\xa2\x22\x45\x53\x84\xc0\xda\xfb\x10\x94\xe1\x5e\x8d\x57\xeb\x62\x85\xff\x4e\x2d\xd4\x39\x1c\x16\x8b\x8f\x27\x26\x9a\x53\x0b\xf8\xba\xc8\xf2\xd3\x4d\x9d\x28\x63\x0a\xe3\x49\x15\x1b\x0e\x3d\xa8\x2d\x0e\x0d\x0b\x73\x4e\x10\x4d\x51\xa6\x62\xa8\x13\x2e\xa5\x5c\xbd\xa7\xaf\xeb\x52\x38\x59\x77\x56\x65\x88\x83\x1e\xce\xd9\xa4\xac\x49\x2e\x0a\xf3\x5e\x93\x7a\xaa\xd7\x72\xf5\x0f\xe2\x33\x1f\xd1\xcc\x55\x6b\xe0\xf9\x6e\x1c\x3e\xc7\xfd\xbc\x6b\xaf\xa8\x3c\x72\x04\x1c\x99\xa8\x1b\x0a\x0b\x3f\xd3\x54\xe3\x7f\x38\xce\xa3\x2d\x72\x56\xa5\x1e\x11\xfa\x7b\xc0\xfd\x27\x48\x97\xc2\x41\x8c\x01\x0e\xb8\xcb\x44\xb6\xdf\xfb\x86\x1e\x6d\x36\xb9\x06\x7f\x55\xcf\x0c\x20\xb5\x85\xf5\x7d\x9c\xc8\x90\xd2\x59\xd2\x91\xe8\x42\xdd\x46\x81\x06\xe6\xa0\xac\x37\x1c\xc7\x76\xe5\x9c\xe8\x57\xee\x93\xf3\xdd\x57\x65\x7b\xf9\xd1\x89\xd6\x12\x63\x1c\x3f\x7b\x7a\x2d\x83\x1c\x1b\x11\xd4\xa2\xde\x64\x24\xf7\x77\x1f\x74\xd0\x52\xf7\x8b\x3d\x90\x82\x6a\xf5\xb2\x97\x8c\xca\x35\x47\x78\x5e\x6a\x9a\xdc\x0e\x6f\xf7\xbc\x11\x14\xea\x5f\x71\x33\x69\x63\xd2\x86\x4a\xf9\x9d\x30\x65\x1d\xa1\x48\x83\xe4\xfd\xe9\xe0\x98\x5a\xf5\x60\xa3\x02\x8e\xd5\x83\xdb\x5a\x05\x54\x95\xf2\xcf\xfc\x4c\xa7\x15\x55\x65\x36\x3d\x79\xf8\x9a\xe8\xb7\x2d\x83\xbe\x45\x8e\xcb\x66\xa1\xda\x70\x32\xfd\x5a\xa7\x9a\xd8\xf5\xdc\xdf\x40\xf8\xd7\xcf\x1d\x22\x05\x03\x8b\x19\x0c\xdc\x72\x55\xc8\x93\x99\x34\x68\x1b\x9f\x53\x67\x67\x20\xe4\x0e\x30\xa6\xe4\x5c\xf0\x88\xde\xc9\x36\xdc\xc8\x4a\xf0\x7d\x40\x75\x01\xf6\xad\xe8\x7e\xf8\xb7\xc8\x8e\xbd\x7d\xcc\x1d\x17\xf5\x5a\x77\x9b\x51\xc8\x61\x6e\xa1\x0f\x12\xfb\x03\x06\xa1\x25\x4e\x65\xa9\xfc\x60\x5e\x13\xca\xa7\xfb\x66\x4d\x87\xb1\x44\x7f\x81\x7c\x4f\x0e\x23\x28\x33\x22\x15\x7e\xc7\xdd\x99\xa9\x1a\x2f\xb1\xdc\x95\x7e\xd3\x1b\xac\x9d\x08\x27\x1e\x63\xa8\xe6\xd8\x49\x89\x6b\xac\xd4\xaa\x4d\x42\x4a\x83\x65\xff\xfe\xee\xfd\x4d\xb5\x07\xfd\x28\xf5\x6c\x21\xca\x04\x18\x08\x22\xde\x12\xd6\xc9\x3c\x0f\x4c\x72\xe6\x66\x81\x99\x15\x04\x31\xc3\x61\xb4\xbe\x6d\x65\x33\xf7\xea\x28\x08\xf4\x91\x41\x6f\xa9\xfe\x06\xc2\xbf\xb6\x0d\x88\x34\x05\x26\x05\x05\xf0\x12\x4a\x0d\x3f\x75\x57\xa2\x9f\x58\x0c\xed\xea\xbe\xec\x23\xab\xba\x67\x36\x34\x9c\xa1\x23\xdc\x67\xec\x37\xe8\xe8\x92\xcb\x58\xb4\x04\xf2\xc0\x90\xca\x51\x07\xc7\xee\x4e\xe4\xa4\xd6\x57\xb4\x8e\xf8\x77\x24\x83\x5f\xad\xd0\x8b\xb8\xa2\xe1\xc3\xcb\xfc\xc8\xc7\xef\x0b\x80\xe9\xee\xec\x33\xbd\xf1\xda\x88\x8a\x72\xbe\x20\x61\x43\xe8\xe0\x49\x7a\xeb\x6a\xbb\x6d\x36\xae\x27\x95\x86\x99\x8a\xdb\x5b\xbf\x04\x36\x29\x44\x63\x93\x08\xb4\xff\xea\x89\x1a\x93\xf7\xfd\xf5\x40\x6e\x4e\xab\x09\x1e\x12\x79\xe3\x8a\x5c\xfe\xd8\x28\x0f\xa1\x13\xab\x3f\x58\x11\x80\x2f\xea\xec\x14\x6d\x1c\x81\xc6\x87\x8e\x7a\x67\x95\x32\xe0\x9b\x28\x17\xfb\xf9\xbb\x95\x33\xc3\x24\x16\xe4\x59\xec\xcf\xf1\x88\xbf\x0d\x08\xfe\xb5\x21\x42\xa4\x25\x29\x88\x30\x81\x06\x04\x38\xc8\x0f\x98\x4e\x0f\xcf\xf5\x15\xff\xec\xbd\x3d\x89\xa3\x3b\x10\x7d\x54\x23\x7a\xed\x6f\xff\xe6\x66\x15\xa7\xbb\x84\x5f\x50\x08\x98\xc4\xda\x84\xa1\xe1\x85\x56\x5f\xeb\xcd\x06\xbf\x47\xf0\x71\x51\xaa\x07\xcc\x51\x3a\x6b\x33\xfb\x46\xd8\x36\xf7\x1e\x82\xe5\xb2\x19\x58\x75\xdc\xf8\x2e\x7e\x31\xc7\xec\xd3\x11\xaf\xef\x07\xa6\x0c\x74\xdf\x87\x8e\x25\x9a\xa2\xee\x8d\x74\xab\xe2\xe7\xc8\xf1\xec\xb6\x60\x03\x82\xe2\xeb\x42\xcb\x89\x49\x4c\x7a\x5d\xfa\xe1\x5c\xb9\xcc\x6b\xc2\x91\x19\x8f\xf9\xde\xe9\xb2\x51\x65\xec\xbc\xbb\xc7\xcc\x83\x0c\xc0\xd4\xeb\xb2\xe5\x3e\x99\x0a\x21\x6a\x43\x83\x99\x46\x6a\x11\x93\xec\xf7\xe9\x02\x97\xae\xc9\x80\xc9\xef\x28\x31\xea\x4b\x83\x5d\x52\x70\x54\x75\x63\x18\xc3\xa2\x1b\x19\xc1\x70\x93\x57\xa1\x76\x3e\xf4\x3e\x1f\xf0\x1d\x0d\x62\xbf\x10\x79\x25\x86\x0c\xba\x0f\xec\x80\xeb\xd1\x7c\x1b\xf7\x55\x6a\x4f\x06\xb5\xf0\xf1\xb2\x4d\xad\x95\xf6\x2a\x5f\xf5\x1f\xa1\xba\xc5\xb7\xe3\x29\x01\xa5\xb3\x9f\xdf\x76\xf8\x5e\x4e\xff\xdf\xe2\x9c\xa0\xe1\x8c\xcd\x2e\xdb\x1f\xc5\x94\x52\x2f\xa7\xd4\x6c\xf2\x32\x51\xed\xac\x7e\x29\x36\x76\xd9\x12\xcb\xa0\x07\x68\x34\xef\x4c\xfd\xbf\x72\x2d\x13\xe8\x75\xb0\x64\x1c\x1f\xe8\xc8\xd7\x28\x57\x30\x34\x5e\x55\xf6\x4b\xce\x17\xbc\xdd\x7d\x1d\x55\xed\x83\xec\x52\xa1\xf0\x12\x88\x9b\xcf\x8c\x41\xf7\xbb\xec\x61\x47\xd0\x12\x44\xfd\x8a\xd4\x3c\xf5\x0b\x50\xa6\x43\x0a\x3c\xdb\x31\xf6\x69\x01\x11\xb4\xef\x8e\x80\x09\x97\x07\xcb\x55\xd8\x1b\xbe\xe7\xf0\xa5\xb8\xd6\xce\x2c\x3b\x25\xf2\x3e\xd0\x97\xdb\xce\x91\xe5\x0a\x69\xed\x22\x3c\xb6\x3d\x37\x00\xf6\x7d\xbf\x4d\x62\x2d\x7a\x35\x47\x29\xcf\xaa\xa4\x0e\x65\x63\x59\x8c\x96\xbb\xc7\x42\xc2\xa5\x4c\xd8\xf1\x80\x68\xfb\xfb\xe3\x75\x40\xe1\x2b\x85\x9b\x76\x4a\x2a\x41\x23\x21\xe2\x5b\xac\x18\xab\x2d\x73\x76\x2b\x32\xf6\x84\x81\x8e\x51\x42\x12\xe5\x4b\xdc\xc3\x0a\x65\xe0\xc0\xf5\xe7\x7a\x23\xe0\x35\x4b\xbb\x3f\x23\x7f\xeb\xdb\x44\x4e\xff\x48\xb1\x63\x14\x5b\x8b\x4c\x46\x5d\x29\x9e\x39\xfb\xe9\x17\xf8\x3b\x20\x94\xc3\x7c\x45\x35\x07\xff\x06\x19\x3a\x91\x21\x3b\xae\xe1\xe1\xd5\x7d\xa0\xc7\x84\x74\x8c\xe8\x15\xb9\xad\xd2\xaf\xef\xf5\x96\xd3\x10\xc0\x94\x0a\x07\x53\x79\x51\xab\x42\x7c\xf7\x56\x6c\x94\xb9\x89\xd3\x6f\x9f\xcf\x22\x00\xe1\xe3\xb4\xae\x6d\x36\x2b\xab\x1d\xe3\x45\x2b\xa8\x49\xe2\xc0\x67\xa5\x9f\x2e\x66\x87\xeb\x4d\x6e\x17\x73\x1b\x97\xa4\xde\x5d\x50\xc5\xe0\x17\x12\x68\x56\x41\x76\xd1\x23\x59\xf5\x34\xd5\xe0\xb3\xa1\xa6\xf8\x0f\x0d\x61\x50\x08\xfa\xa4\x9f\x99\x50\xd2\xa8\xec\x7a\xbb\x60\xc9\x6e\xdd\x1c\xde\xdd\x6c\x97\x5b\xf8\x22\x3d\x59\x6e\xbd\x0f\xc4\xc3\x8c\x97\x67\x2e\xf2\x98\x78\x64\x39\x7d\x7b\x24\xd3\xa4\x3a\x14\xd6\x29\x9a\xba\x96\x05\x69\xa5\xa7\xf6\x45\x07\xde\x29\x07\xcc\xe2\x95\x90\xce\x82\x0d\x07\x69\x0d\xf5\x41\x9e\xe5\xe2\x6e\xc6\xee\xa8\x99\x7f\x9e\xd4\xe0\xa4\x84\x63\xc9\x31\xdd\xf1\xd3\xa0\x62\x2c\xd2\x5f\xe1\x2a\xc7\xf9\x46\x75\x8a\x4f\x62\x4a\x26\x2c\x6e\x3e\x04\xff\x76\x79\x0c\xab\x30\x57\xe2\xfd\x2a\xbd\xc6\x09\x54\xc7\x40\xba\xaa\x79\x0f\x0f\xb2\x7d\xad\xbc\x36\xfc\x91\xc6\x33\x1d\xb2\x4b\x69\xdc\x38\xae\x82\xad\x31\x7f\xd0\x52\x30\xcf\xef\xfc\x47\x1a\xf9\xe2\x35\xab\x37\x03\x8b\x47\x19\x21\x04\xa2\xdd\x81\xfb\xf3\x88\x04\x3f\xc8\x1d\xcb\xe2\xd6\x03\x87\x2f\xa5\x3c\x61\x6e\xaa\xfd\xe9\x07\xc7\xa7\x3d\xe2\x94\x3e\xdf\x2e\x7b\xbb\x9f\x9e\x01\x8f\x2e\xab\x3a\x96\x14\x83\xe6\x4c\x5d\x8e\x23\x96\x3f\x06\x41\x2d\x73\x43\x79\x7a\x7e\x98\xca\x5c\x89\xcd\x60\x66\x9f\x61\xff\xb7\xaa\xad\x6b\x5a\x46\x07\xde\x41\xca\x04\xc6\x67\xb2\x1a\x1d\x5c\x41\x4e\x13\x5e\x2b\x80\xfb\x2c\x8a\xaa\x72\x62\x6c\x11\x5b\x8f\x44\x88\x9f\x8e\x85\xd5\x78\xe6\x64\xa7\x99\x7b\x3b\xa1\xba\x8d\x9f\x99\x1c\xde\xe9\x22\x00\x4c\x98\x38\x5b\xc4\xb1\x92\xf4\x81\xc8\x85\xc9\x32\x65\xc1\xd5\x5b\x65\xfd\x20\x14\x87\x03\xf5\x77\x5a\xb1\x36\x42\x5a\x9d\xbe\x5e\x19\x4f\x96\x47\x5a\x64\x34\x35\x96\xcd\xbf\x26\x83\x2c\xe3\xf1\xa8\xe2\x2f\x62\x8b\x6f\x31\x35\x99\xb7\xcb\xac\x97\x5c\xf7\x62\x6e\xb2\x09\x81\xc7\x23\xff\x3a\xa6\x83\x09\x7a\x2b\xa0\xf6\x1c\x4b\xe6\x8e\x28\x4d\xdd\xd1\x10\x91\x72\xbf\xa6\xb9\x1d\x15\x05\x2e\x77\x9e\xb2\x10\xe0\x23\x1b\x5b\xed\x58\xd5\x1b\x06\xe1\x4f\x8b\x72\xaa\x0a\x10\x5b\xa3\x3b\xea\x48\x70\x56\x8e\x87\xfd\xa2\xab\x6f\x26\xa8\xfc\x9d\x07\xd0\x65\xf6\x51\x9f\x33\x14\x06\x77\x61\x4d\x17\x5a\xa5\xba\x30\x4e\xe0\xc3\xef\x7c\xb8\x9a\xb2\x89\x8d\x6f\x3d\xd0\xc4\xda\x30\x0e\xd5\x07\xb0\x8e\xc4\xcf\xb5\x0f\xec\xb4\x45\x70\x7d\x78\x5f\x0a\x4a\x78\xf9\x6d\x7a\xe6\xac\x64\x25\xbf\x84\xcc\xc4\x7c\x08\x83\x33\xb3\x64\x04\x5a\xcd\xb9\x45\x3f\x52\xb4\x37\xd9\x53\x12\x05\xc8\xf8\x1d\xa4\xcc\x67\x0c\x7e\xd8\x8f\x0b\x4d\xfb\x81\x33\x3a\x77\x30\x1e\x8f\x37\x53\x0e\x7e\x52\xe7\xc7\x0e\x85\x48\x4e\xa7\xd2\xe7\xe4\xbe\xf7\xee\x8b\x41\x1f\xc6\x35\xa8\xe7\xe1\x02\x2f\x0b\xc4\x3d\xe4\xf4\x72\x9c\x1a\x72\x9e\x9e\xcf\xbb\xae\x9f\x03\x9d\x24\x87\x0e\xeb\x9d\x91\xaa\x17\xd6\x97\xaa\xee\x6c\xd4\xbc\x65\xfc\x55\x73\x3e\xcb\x94\xd0\xc5\x68\x12\x90\x8d\xfa\x60\x30\x20\x61\xa3\x1a\x89\xae\x40\xfe\x4d\xff\xba\xc8\x90\x4e\xa9\xeb\xf1\x27\x8e\xf8\x47\x2d\xea\x8c\x41\x9f\xaa\x31\x0b\x47\xe0\x9d\xf2\xd1\xbd\x2c\xad\xc0\x4f\xe1\xb3\xbb\x98\x2e\x38\x57\x8c\x15\xa1\x95\x95\x4e\x3d\xe2\x72\xc4\x4f\x16\x5e\x1d\xb9\xd6\x5d\x72\x02\x22\x7a\xe3\xc3\x7b\x27\xdf\xa3\xf4\xb4\x1f\x26\xc4\x81\x2b\x2d\x32\x5f\xa5\xaa\x27\x68\xb0\xf6\x39\xde\x8d\xb8\x7d\x50\x6d\xa8\x07\xba\x4c\x6a\x6d\xa3\x1e\x4a\xc0\x32\x86\xd2\x40\xcf\x68\x62\x5e\x77\x55\xd7\x6a\x18\xb1\x7a\x2a\x10\xc6\xe6\x7c\x22\xf7\x45\x1d\x37\x3a\x05\xfe\x67\x87\x35\xe2\xa4\x48\x54\x11\x4a\x7a\x13\x12\xe8\x44\x1b\x29\xce\xa6\xcc\x13\x28\x17\xc8\x5e\xae\x42\x76\x6d\xef\x1f\x9e\xad\x81\x79\xf1\x21\x06\x55\x95\xaf\x71\xcb\x37\x63\x8c\x27\xfc\xfd\xb5\x95\x82\xdf\x04\x35\xe3\x10\x66\x47\xab\x06\x2b\x35\x0a\xb7\xa9\xc6\x43\xc1\x97\x3a\xb3\x1e\x30\xb2\x15\x87\x18\x67\xc8\xd0\x5f\x53\x65\x03\xed\x8f\xce\x93\x2a\x74\xaf\x02\x37\xf0\xb6\xfa\x43\x3a\x42\x14\x0e\x68\xda\xdb\x6b\x16\x2c\x94\x83\xca\xf4\x7b\x75\xb9\x61\x7f\xe9\xc0\x86\x01\xfe\x3a\xad\x2e\xe8\x57\xbd\xdd\x35\x94\x7c\xf9\xb9\x5a\x14\x60\x6a\xc7\xea\x79\xe1\x6f\x20\x91\x4d\x60\xf9\x5e\xbf\x7b\xba\xd8\xba\x23\xaf\xe1\x32\xa8\x13\x03\xd3\x78\xa7\xbe\xf7\x4b\xe2\x41\x12\x60\x8a\x22\xc7\x32\x5d\xfd\x69\x09\x83\x85\xd4\x29\x41\x77\xde\x14\xea\x5d\x3c\xe3\x95\xee\x11\x3c\xb1\xba\x23\xaf\x30\x62\xdb\xd7\xd5\xa7\xaf\xaa\x53\xb9\x2b\xf5\x80\xaa\x70\x1c\x35\xab\x8f\x56\x9e\x29\xe5\x98\x3e\x7d\xb4\x75\xbe\xb2\xf3\x9a\x64\x18\x7a\xf4\x3c\xaa\x06\xd0\xa1\xdc\x5a\x25\x09\x26\xe6\xdf\xe7\x5e\xdf\xa3\x9d\x59\x63\xc9\xf6\x7a\x21\x24\x1d\x6c\x6d\xfc\x43\x7b\xb1\x0a\x57\xb2\x48\x6f\xd9\x15\x08\xd5\x91\x5c\x12\x93\x75\x53\x2f\x01\x7e\x4e\x56\x98\x97\x65\x89\x3b\xae\xcc\x6f\xc8\x7b\xf7\x6e\x4c\x47\xae\xf5\xa3\x90\x74\x55\x81\x1e\xe6\x0f\x83\x47\xc8\x3e\x9a\xe3\xe3\xd7\x73\xbf\xdb\x95\x4a\xb7\x55\xd5\xc2\x64\x84\xd6\x1e\x3f\xf7\xdf\xdf\xba\xee\x84\x41\x5f\x8a\x02\x83\x4a\x05\x08\x98\x05\x2b\x1a\x44\xa3\xee\x36\xe4\x72\x55\xbd\x9c\x92\x99\x20\xfc\xba\x76\x02\xa3\x44\xfa\x5d\x75\xf1\x61\xd0\x0b\xa8\x8d\x08\xf0\x25\xb8\x10\x7e\x26\x13\x57\xc6\xc2\x60\x20\xf8\xb5\x96\x5f\xd4\xad\x5a\x38\xa6\x44\xa1\x70\x58\xe6\x65\x98\x4f\x94\xf8\x23\xf8\xfe\x0b\xb0\xd3\x62\x10\xbe\x6b\xce\x3d\xde\x30\xe1\xa3\xa9\x0d\x90\x61\x0d\x90\x92\x2b\x62\x9e\x6a\x43\x56\x65\x9a\xc6\x8d\x9a\x81\x16\x16\xa6\x41\x7d\x25\x64\x68\x9e\x8d\xb9\x18\x19\xca\x25\x9d\xfb\x28\x3e\x5b\xfc\x9a\xfc\xcf\xfa\x28\x44\x9b\x9c\x5e\xd2\x9c\xf0\x02\x07\xd9\xc0\xeb\x34\x2d\xb6\x40\x09\x1a\xf2\x78\x9b\x24\x6a\x91\x51\xa7\xc7\x57\xf1\x0a\x5a\xc2\x31\x9d\x6f\xe2\xb7\x8c\xf3\x54\x73\x7e\x80\xcd\xd6\x56\xb6\xd5\x4e\xdd\x43\x35\x97\x02\x6d\x2d\xfd\xd0\x4b\x37\x9e\xf3\xf9\x0e\x7f\xe7\xa5\x8d\x27\xbb\x44\x23\x3e\x27\xa4\x9a\x07\x2e\x2f\x7c\xa3\x65\xa6\x0f\x14\x4c\x5e\xde\x8f\x7c\xe9\xa4\xe2\x4d\xa2\xf7\x2a\x76\x97\x6f\x9b\x58\x4e\x10\xe8\x84\x73\x0c\x7b\x77\xf8\x1f\xe6\x3a\x67\x39\x46\x11\xeb\x7e\x0c\xa9\xf7\x01\xa2\x4f\xf9\x1a\x66\xb7\x63\xcb\x12\x21\x3f\xf2\xd8\x51\xbc\x82\xa4\x7b\xcd\xd7\xf7\x80\xa9\xb0\x66\xd6\x12\xdc\xdd\x3c\x74\xa5\xe2\x80\x14\x09\xda\x2d\x72\xdf\x74\x64\xb6\xf8\x51\x5b\xab\x27\x59\x3d\x76\x14\x9f\x5c\x15\x40\xf3\xa8\x7a\x96\x0f\x9d\x00\x75\x93\xda\x57\xed\xed\x24\x2d\xde\x90\x8c\xa5\xc6\x33\xf0\x6d\x52\xb7\xb5\xb7\xd0\xfc\xee\x07\x1e\x1d\x38\x81\xe7\x77\xc3\x5c\xd7\x29\x81\x6d\x0f\xbe\xa3\x41\x3d\x0f\x05\x5f\x50\x87\x8a\x1d\x39\xd4\x50\x25\xdf\x4f\xa9\x35\x4b\x96\x8d\xd4\xfe\xcf\xb5\xee\xbf\x40\x0a\x44\x9a\x13\xea\x3f\x9a\xc3\xca\xdd\x16\xca\x42\x02\x94\xfd\xb1\xf2\xd5\xb2\x39\x85\x0b\x2e\x43\xf7\x57\x7f\xa2\x6c\x3f\x0b\x1e\xe3\xc3\x59\xa7\x13\x6f\x82\xc2\xc7\x27\x94\x0d\x62\x6c\xfc\xfd\x4c\xca\xf6\x95\x8e\x13\xda\x78\x39\x54\xd5\x68\x0c\x19\x6c\x9f\xb6\x30\x3e\xaa\xf2\x15\xaf\x15\xca\x83\x98\x31\xb9\x98\xc0\xf2\x2e\x27\x3f\x15\xf3\x85\xf1\x5b\x14\x21\xac\x80\x80\x38\x04\xc5\xc6\x3d\xe5\xd0\xd3\xe7\x47\xb5\xee\x04\x20\x13\xb1\xad\xba\xc8\x65\xc7\xff\x34\x30\x3c\xd5\x61\xee\x37\x19\x29\x0a\x5e\x6c\x0e\x1e\xbe\xaa\xdc\x89\x49\x46\x52\x90\x05\xb1\xc5\xd5\xdf\x1b\xeb\x7f\xe1\x0f\x88\x74\x0c\x1c\x0c\xe8\x9a\xc9\xc2\x9d\x47\x1d\x1f\xd9\x17\x53\x9b\x84\xfd\x56\x79\x62\xba\x34\x27\x65\x8b\xcf\x53\xdd\x64\x58\x53\x17\x5d\xfd\x99\x93\x56\xc0\x24\x04\xd2\x87\xae\xf3\x27\x42\x69\xd1\xdb\x55\x6d\xa9\xc7\x0e\x71\x63\xc4\x88\xf9\xa9\xee\x46\x38\xb0\x31\xf5\x15\xf0\x77\x4e\x41\xb5\xdd\x12\x0f\xba\xdc\x5b\x24\x15\x9e\xf6\xc4\x1e\xcb\x83\xcd\x29\xb5\x39\xb4\xcd\xc3\x04\x23\x9e\x9f\xd5\xc9\xa6\x8d\x28\xcf\xfa\x40\x0d\xdf\x91\xd0\x6b\x35\x83\x4e\xe4\xca\x28\xfe\x6d\xf5\x49\x0f\xe1\x77\x7b\x13\xb9\xab\x57\x52\xf9\x98\x91\x36\xe3\x7b\xbf\x1f\xf7\xe3\xfe\x1e\xf9\xfe\x85\x97\x20\x52\x92\x30\x60\x56\x63\x56\xb7\xf7\x91\x24\xe8\xcd\x06\xe5\xde\xa7\xea\x6d\x52\x2c\x23\xed\xc6\xed\xf0\x7d\xbf\x99\x5b\x6f\x87\xe6\x0e\x81\x70\xb5\x63\x60\x3d\x8c\xc2\x8e\xea\xf7\x6d\x10\x7e\x79\x7b\x3f\xac\x25\x85\x89\x18\x55\x81\x01\xe5\xbb\xaa\xb5\x15\x9d\xc4\x66\xee\x82\x6d\x99\x80\xfd\xb4\x1e\xe6\xae\x93\xea\xbd\x95\x8e\xb6\x5c\x43\xac\xdd\x49\x8e\x9c\xbb\xa6\x72\x70\x6f\x1c\x5b\xdc\x42\xc9\x86\xaf\x22\xe1\xaa\x44\x1e\x01\xc7\xd2\x76\xd7\x16\xeb\xd9\x12\xd5\x4a\x69\x89\xc6\x55\xd1\xfc\x10\x96\x16\x87\xb6\x72\x69\x9f\xff\x82\x97\x6c\xbe\x74\xf0\x51\x04\x09\x19\xc8\x65\xb3\xd9\x23\x8a\xca\xe8\xf0\xbf\x0e\x7c\xe5\x22\xab\xbe\xcc\x71\x91\x88\x5c\x3e\xae\x7b\xb4\x6b\x7b\xc4\x40\x5d\x7f\xed\xfb\x4b\xfe\xfa\x27\x14\x92\x0c\x84\x06\x2e\xed\xad\x9c\x1c\xb5\xa9\x09\xf8\x62\x34\xb9\x0d\xf5\x6b\x7e\x69\xfc\x99\xfb\xf6\xa3\xe7\xfc\x05\x4e\xdb\x82\xf0\x44\xa3\x02\x6f\x15\xd8\xa9\x53\xed\xbb\xbc\xa0\x2c\x07\xac\x95\xbc\x24\x21\x3b\x5a\xea\x8b\x40\xe9\x37\xfc\xa3\x9d\xa6\xf9\x36\x53\x96\xa3\xee\x09\x88\x04\xba\x60\xfa\xe3\xf7\x3d\x47\x29\x52\x1c\xdf\x8e\xc1\x50\xd3\x6f\x2d\xa7\xe7\x63\xe3\x44\x58\x8e\xb5\x74\x21\xea\xf2\xa9\x70\x9e\x74\xaf\x80\xd4\x5e\xd7\x37\x9e\x02\x2e\x41\x89\x2f\x02\x72\xd7\x1c\xfd\x98\xaf\xe6\x96\x68\x20\x41\x13\x6e\x5a\xdf\x0a\x1c\x0d\xc5\xfa\xf9\x5c\x65\xfe\x66\xac\xfe\x89\x07\xa4\x9e\x41\x81\x79\x9d\x06\xd7\xd4\xc4\xc0\x5a\x7f\x07\xcd\x62\xa4\x4c\x1d\x1b\x87\x63\x2d\x9d\x49\x9f\xd1\x0e\x8c\xe0\xb3\xa1\x29\x43\xc2\x88\x0e\x76\xc0\x31\x1c\x1c\x8f\x48\xaf\x57\x0b\xd6\x6e\x98\xd0\x5d\xd6\x25\x6b\x3b\xf4\x10\xee\x17\xb7\x6b\xe1\x15\x91\xf7\x41\x36\xf2\x87\x0f\xea\xe0\x2a\xf3\xc8\xe3\x50\x74\xa0\xaa\xbb\x0a\xfc\x50\x97\xc7\xc6\x42\x41\xf4\xb9\xf1\xc1\x2d\x29\x83\x98\x9b\x79\x4d\x52\xd2\x82\x09\xec\x44\xee\xfc\x73\xf3\x63\x18\x07\x92\x9a\x14\xad\x71\x16\xc6\x37\x4a\x1a\x5e\x88\xd6\xc2\xb6\x0e\xcd\x5a\xff\x95\xac\xee\x9b\xdc\xa8\xbe\xbf\x0b\xf2\x5f\x9b\x32\x44\x5a\x1c\x13\x13\x64\x74\xf1\x89\x96\x36\x31\x88\xb1\x1e\x14\x6e\x41\xbb\xa4\x37\x31\xb1\xbb\x60\x5a\xad\x76\xc9\xaf\xd7\xa0\x0b\x8c\xf6\x3e\x1c\x54\x70\x81\xd4\x4d\xc9\x7c\x6e\xfb\x28\x9d\x82\x02\x22\xda\x98\xcb\xe0\x8b\xd0\xce\x60\x3e\x2e\x1c\xf6\xad\x13\x6d\x63\x5a\x31\x81\x70\x75\x50\x4e\x8e\xc6\x1c\x79\x01\x5a\x09\xfb\x07\x2a\x4a\x32\x9b\x43\x73\x0a\x2f\xa7\xa2\x94\x07\xc6\xc1\xea\xdd\x07\x83\x73\x84\x1d\x5f\x88\x01\x60\xba\x8a\x8f\x76\xc9\x70\x2f\xd2\xc7\xb1\x83\xa6\xad\x48\xb9\x5f\x53\x51\x7d\x2b\x1d\xea\x1f\xfd\x36\x91\xa6\x6a\x0f\x85\xf8\x8e\xe6\xef\x47\xfb\x17\x88\x80\x48\x8b\x43\x43\x21\x02\xe1\xc8\xac\xcb\xc2\x38\x3d\x5c\xff\xe9\xa7\xda\x9f\x2e\x0d\x5e\x68\x44\x9d\x6c\x51\x9d\x5f\x3b\x5d\x3a\xd6\x51\xcb\x24\xe5\x43\x99\x2e\x20\x35\xf6\xb2\xee\xc0\x77\xeb\x52\x21\x2b\xcb\xde\xf6\x9c\x15\x29\x83\xcc\x50\xa7\x6d\x4a\x80\xcd\x1a\x3a\x05\x46\x08\x65\x1f\x16\xac\x5e\x6c\x48\xaf\x86\xc8\xfc\x4a\x8d\xc8\x6a\xe2\x97\x0f\x31\x45\xac\x4d\x31\x53\xde\x77\x92\x80\xcb\x4b\x82\x67\xcf\x7b\x71\x99\x4c\xfa\x14\x8e\x13\x9a\x81\x15\x72\x1d\xe5\x59\x9d\x65\xe2\xc7\xb3\x0e\xa4\xa4\x49\x6d\x1c\x97\x83\xe8\x5a\x53\xca\x30\xb7\xf6\x79\x1c\xc1\x0c\x7f\x3f\xda\xbf\x30\x0f\x44\x1a\x26\x00\x4a\x1e\xf8\x68\x2d\x8c\x6f\x4f\x1e\x17\xbf\x71\xfe\x79\x5d\x14\xd5\xc9\x5b\x59\x93\xca\x11\xe4\x66\x76\x14\x21\xe6\x54\x3e\x7d\xcc\xc4\x06\x23\x07\xa6\x45\x13\x34\x55\x52\x7e\x08\xbc\xde\x5f\x24\x4d\x84\x74\x72\xd7\x2f\x8d\x3d\xb7\x5e\x3e\x6d\x73\x8f\x4a\x73\x11\x2a\xc7\xbb\x7c\x0f\x82\xbf\x2a\xe6\x1c\xd3\xb2\x03\xfc\xbc\xe5\xb7\xa6\x25\xf5\xb9\x6c\xcf\x2f\x7c\x4d\x55\xd0\x9a\x83\xae\x65\x31\x23\xf6\xd1\xa1\xb0\x01\xd3\xe1\x1d\xbc\x3f\xdd\xe2\x49\xc5\x42\x0e\x2b\xef\x35\x2a\x92\xcd\x45\xc2\xb0\x79\xe1\xce\xe7\x51\xc3\x59\x50\x67\xf9\x6a\x0e\x19\xff\xba\xf6\x4f\x8c\x26\x2d\x0e\x07\x03\xea\x57\xe9\x61\xe9\x2c\xf3\xa7\x50\xe6\x3a\xaf\x4d\xaa\x8b\x61\xbf\x88\x87\x11\x3c\xd2\x53\x86\xbc\x27\x2e\xf3\xf2\x58\xcd\x6a\x35\x00\x4b\x9a\x02\x24\x86\x43\x15\x6e\xe8\x9f\x51\xca\x27\xe2\x1d\x8e\x0b\xa5\x68\xae\x8b\x14\x63\x88\x54\xd2\x54\x70\xc5\xe4\x75\x8c\x0c\x81\x8c\x39\x7d\xfc\xfe\x9b\x91\x86\x6f\xf9\x31\x2c\xfb\x2d\x30\x59\x77\xe1\x24\xdd\xef\xa1\x7e\xce\x9b\x63\x06\x33\x89\xd6\xa5\x98\x25\xa8\x80\x0c\x25\xb1\xd5\xd6\x9d\x60\x62\x9b\xf4\xa0\x85\xd3\xb7\xe9\xa7\xd0\xf3\x7a\x6b\xf0\x16\x1a\x4e\xc8\x29\xe5\x43\xcf\x3e\xb3\xac\xad\xfc\x75\xed\x9f\xa0\x4a\x9a\x06\x4a\x1a\xdc\xfb\x60\xc8\xf6\x55\x5d\xca\x6a\x9c\x7e\x9b\xb2\xbe\x8b\xe5\x43\x46\xaf\xbc\x82\xc7\x46\xad\x84\x7a\x21\xa0\x16\x2d\x3b\xd5\x1b\xb2\x0e\x4c\x82\xd4\xbe\x53\x2a\x14\x61\xa8\x57\x45\xf8\x45\x2c\xd1\x07\xd2\x97\xd2\x67\xdf\x6d\x3c\x11\x2a\xd1\x68\x48\x4a\x7c\x8e\x5a\x95\xc1\xdb\xb4\x04\x57\x6b\x3a\x79\x49\x0a\x6d\x83\xde\xa3\x60\x4b\xfa\xb7\xc1\xa7\x7b\x0e\x1f\xd8\x32\xc3\x76\x27\x19\x4f\xda\xde\x7b\x3c\x6c\x80\xec\xba\xa6\x32\x41\x2d\x52\x14\x42\xfa\x96\x6e\x97\x34\xc6\x95\xd4\x4d\xb2\x77\x4c\x44\x13\x21\x66\xd1\x0a\xbd\x6d\xec\x37\x12\x27\x7f\x97\xda\xbf\xa0\x15\x44\x1a\x0e\x13\x0a\x13\x58\x6a\xbe\x67\xad\x1f\x45\x2f\x5e\x95\x41\xbb\x27\x4b\xea\xe7\xf4\x9d\x38\xa9\x6d\x72\x39\x60\xac\x38\xfd\x94\x39\xfb\xe1\x59\xf0\xbc\x16\xbc\xcf\xc5\x80\xf5\x82\xd5\xf9\x3c\xcf\x64\x8f\xd7\x8c\x3e\x70\xb0\xbb\xe0\x3d\x0d\xc1\x95\x94\xe0\x48\xbf\x7d\x1f\x21\xd8\xb9\x02\xa8\xc7\x43\x70\xba\x1b\x95\x4b\x94\xe8\x52\x8f\xcb\x69\xf7\xd0\x43\xd4\x9b\xf8\x15\x3b\xbb\xaf\xf1\x94\x07\x6d\xb5\x7e\x97\xa6\xf9\x82\x3b\xda\x80\xb1\x7d\xa9\x24\x8b\x56\x60\x80\xb4\x70\xcf\xf5\xaa\x96\xfa\xb7\x9a\x85\x76\x6b\xf7\xf5\xb9\x82\x83\xdf\x0a\xe1\x08\xd7\x99\x7f\x4b\x7a\xff\x85\x04\x21\xd2\xe2\x01\x30\xc1\x40\x3a\x5b\xf0\xa7\x05\x75\xb2\xb0\x47\x47\x5a\xb4\xaa\x67\x87\xcd\xe5\xf8\x43\x53\xdb\x60\x7f\x25\xf6\xd7\x36\x3b\x25\x81\xd9\x1f\x44\x21\xc0\x24\xce\xf5\xe9\xf9\x7f\x24\xfb\x67\xd7\x08\x4c\x61\x58\x0c\x9f\x6a\x5e\xbc\x39\x39\x56\x99\x28\xd9\x5f\xda\xfe\xe1\x9a\x70\x17\x06\xa2\x10\xe1\x41\x9d\x3e\x7a\xd5\xd2\xf7\x29\x34\x46\xe9\x7b\x9c\x33\xbf\x57\xa6\x8e\x23\x12\x56\xca\x85\xce\xf3\x91\x58\x05\x5f\x49\x82\x35\x89\xbb\x98\xeb\x35\xed\x85\x42\xd7\xde\x2d\x19\x2e\x9f\x6e\xf5\x97\xdb\xa3\x76\x1e\xfb\x25\x8d\x8a\xfd\xa6\x3d\xd6\x3c\xe5\x2e\xcb\xc1\x3b\x05\x16\xc6\x2a\x69\x22\x73\x05\x0d\x61\xc4\x3a\x34\x0e\x1e\x44\x77\xcd\x49\x6e\xcd\x78\xdb\xc9\x4d\x8e\x0f\xef\x79\xfc\x70\x0f\x2e\x83\x61\xff\x77\xc8\x15\x22\x8d\x08\xf3\x31\x18\xc8\x62\x5a\x20\xb0\x9e\x0d\xdf\xda\xa5\xde\xfd\x14\x84\x3b\x41\x98\xc3\xbe\xf4\x7f\x14\x96\x58\x6b\xe5\xc0\x29\x64\xc5\xe6\x33\x0e\x8f\x05\xab\xd6\x48\x33\xa6\xdd\x67\x04\xf7\xe9\x04\x19\x62\x92\x2e\x0f\xb1\xfb\x8d\x22\x14\x91\x7d\xc2\xc6\x1d\x59\xd7\xcc\xd6\x4b\xd4\xef\x80\x50\xa8\x7c\x16\xbd\xa0\xd8\x44\x0e\xdf\x9e\x48\x93\xf0\x4b\x07\x56\x28\x93\x09\x9e\x61\x1a\xd5\x0b\xdf\xbc\x94\x8e\x2a\x5b\x34\x11\x60\x80\xb7\xa5\xf2\xb1\xa6\x53\x74\xd3\x39\x63\xde\x5c\xbd\xfb\x75\x6f\x13\x9a\xaa\x5e\x40\x18\x5a\xb8\xf1\x4a\x59\x68\x7c\xf8\x44\xd6\x08\x78\xbe\x63\x42\x27\x86\x61\xa9\x40\xe4\xdd\x19\xa5\xb2\x1b\xe7\xb0\x9d\x37\xdd\xc0\xb9\x77\x00\x23\x0b\xe9\xae\xd4\x87\xad\xe6\x76\x25\xf0\x83\xe1\x18\x92\x3a\xc6\x96\xef\x35\x6d\xc1\x0e\x0e\xb0\xf7\xf3\xc3\xc6\xc5\x6a\xc2\xd3\xd3\xbb\xcc\xc3\xb7\x62\x91\x4f\xe8\x83\x5e\x49\x42\x2f\x6b\x16\xc7\x4e\xbd\x09\x7c\x81\xe6\xc2\xf8\xed\x9d\x07\xdd\x1b\x8f\xa6\x9e\x97\xcb\xcc\x33\xe7\x22\xa3\x5a\xd0\x7c\xe0\x04\x0a\x0a\xa6\x26\x72\xc4\xf2\xfd\x32\x7a\x4c\x3e\x6d\x6d\xeb\x4e\xe3\xfd\x29\xa9\xf3\x57\x3b\x27\x93\x4f\x2e\xdc\xf8\x5d\x57\x64\x70\xf9\x15\xeb\xff\x18\x72\x71\xc2\xe8\x32\x5e\x35\x28\xb2\x7e\xd1\x41\x15\xf9\x85\x24\x8f\x81\xc0\x8e\xdd\x0c\x85\xdf\xcd\x1a\xf3\x06\x99\x26\x56\xfc\xe5\xff\xe4\x3b\x9f\x12\x09\xac\xc3\x36\xe6\x38\x7a\x55\x3e\x7c\xbd\x3e\x5e\x77\x70\x4d\xcf\x31\x57\xaa\x65\x74\xae\xff\x6c\x04\x71\x05\xe7\xe0\x5d\x7d\x01\xba\xf6\xa9\x58\xf2\x76\xec\xa6\x42\x5f\x49\x73\xcd\xb3\x33\x04\xbc\x94\x3a\xfc\x63\xb3\x9f\x12\x74\x94\xd8\xa2\xd5\xe4\x8b\x10\xdf\xbd\x02\x50\x32\xd4\xdf\xd3\x44\xfc\xd6\xd7\x8b\xe5\x3c\x13\x0e\xfb\xc8\x4d\x28\xef\x5d\xfd\xe8\xb3\x40\xff\xfd\x4a\x94\xe9\xa8\x96\x3c\x1f\xd4\xba\x68\x2c\xb9\xe4\x42\xdb\x8a\xe3\x93\xfd\x95\x4e\x90\x5a\x74\x81\x4a\x1a\xad\x62\x44\x24\xf6\xe7\xbb\xb2\xb6\x3f\xd2\x65\x59\x3c\x78\xbd\x45\x55\xde\x10\x8a\xdb\x70\xb4\x9e\xad\xea\x38\xcf\xbc\xe3\x22\xf7\x9a\xd0\xfb\x55\x10\xec\x63\x25\x46\xd8\xe5\x2b\x6a\xbd\xfd\x4b\xc0\x94\x7d\x57\xc7\xe1\xc8\xd7\xe5\x77\x76\x31\x95\xde\xe9\x2c\x8d\xa4\x83\x0c\x23\xf4\x6d\xe8\x9e\xba\x68\x53\x56\x24\xee\xea\x1b\x50\x2d\xe9\xed\xf9\xbb\x39\xa1\xfd\xfb\xb4\xa3\xdd\x3b\x9d\xeb\x0a\x82\x0a\x29\x19\x5d\x77\x58\x14\x62\xd2\xba\x59\x77\x09\x9c\x1f\x5c\x2f\x9f\xbc\x1a\x4f\xf2\x9a\x92\x4a\x9c\x6e\x1b\x61\xae\x5a\x6a\x34\xd4\x3a\xad\xbe\x64\xe7\xfe\xc5\xc8\x4b\xa9\x2b\x69\xf9\xed\x8b\x11\xfd\x1d\x78\x8e\x73\x6a\x51\xfb\x39\x06\xc1\x6a\xc7\xc1\xb0\xe2\x9b\x27\x59\xa4\x2c\xd0\xca\xae\x45\x26\x92\xe2\xe5\x6d\x20\xbd\x68\xfe\x5e\x6d\x03\x98\xee\x16\xb9\x96\x37\xb9\x7d\xaf\x62\x2c\xdd\x62\xe4\x90\xf0\xea\x69\x43\xf8\xbe\x51\x4c\xfc\x40\x8a\x53\xc1\xfc\xa3\x8b\x74\x15\xe3\xe9\x53\x71\x53\x54\x8b\xdc\x56\x6e\x35\xef\xc1\x73\xab\x55\xb3\x9b\x68\x73\xbb\x1e\xba\x18\xae\x17\x35\x06\xc9\xcf\xaa\x91\x87\x2c\x00\x0a\xd8\x89\x79\xa7\x2a\x4c\x42\x15\x4c\xd9\xe5\xbf\x19\xf6\x08\xc4\xe0\x8d\xce\x4e\x69\xf7\x3f\x3f\xaa\xae\x06\x18\xe5\xba\xa4\x87\x55\x3e\x59\x0e\xa0\x60\xdd\x9e\xa0\x5f\x30\x6b\x45\xb7\xa0\xfe\x62\x49\x62\x22\x40\xe9\x44\xe8\xb5\xa4\x3a\x84\x37\xb7\xd9\x39\x57\x13\x6d\x02\x52\x4e\x3c\x4e\xbf\xd5\x39\xc9\x9f\x17\xb9\x18\xe9\xd1\x9c\xee\xae\xb1\x04\x05\x3e\x68\x11\x61\xf7\x89\x5d\xb3\x43\xd7\xf6\x50\x4c\x3e\x7b\x1a\x94\xb7\x85\x80\x1f\xc9\x94\x3b\x44\xa7\x6b\x9f\x76\xf0\x1d\xa3\x95\x9f\xae\x22\x6e\xe3\xe7\xd3\xcd\xf2\xaf\xb9\x3d\xab\x3e\xc3\x40\x9f\x80\xeb\x22\xa3\x9a\xb5\x37\x74\xed\xc6\x5c\x2b\xfa\x29\x5c\xcf\x0d\x1f\xeb\xc3\x69\xa4\x22\xd7\x4b\xa8\xd5\xbc\xee\xd7\x5f\x51\xdf\x80\xef\xf4\x7c\x89\xcd\x61\x39\x62\xb8\x2d\x3d\xda\xf8\xd4\x61\xc7\x10\x53\x9f\xe6\x76\x47\x97\xbd\x9f\xb7\x4b\x66\xe2\x78\xe5\x85\x14\xd3\xd3\xe7\xcf\x49\xc8\xb5\x34\xa7\x14\x7d\xf6\x12\x5b\xb4\xdf\x6c\xf9\xf6\x4b\x0e\xfb\xaa\x3f\x6a\x47\xc6\x6b\x08\x53\x1c\xf3\xb3\x1d\x0f\x29\x20\x52\xc8\x35\xde\xb5\x72\x7e\xd0\xf7\xeb\xbf\xf5\x1e\x2a\x2f\xf3\xa7\xb5\x74\x65\x28\x77\xb8\x3b\x70\x21\xf8\x4d\x41\xf7\x43\xa3\x1d\x24\x4e\xe6\x4d\xdc\xab\x86\xfb\xc7\x45\x32\xdb\xab\x0b\x91\x5e\x22\x7c\x48\xb1\xa8\xa2\x98\x57\x3d\xe8\xf6\xc5\x65\xf1\x26\xd8\xcc\x07\x38\x08\x05\x7c\xe7\x07\xe5\x6b\x03\x04\xf9\x2f\xb2\xbf\x09\x4d\x1c\x07\x23\x1a\xad\xa2\x8c\x0f\xfc\xa1\xc1\xcd\xce\xa6\xe1\xcc\x25\x00\x5b\xb1\xbf\xf3\xce\x5e\xf0\x50\x12\xae\x41\xc9\x17\xae\xfa\x64\xc4\xe8\x58\xbb\x9b\xf2\xec\x4d\x2f\x2d\x12\xe7\x4a\x48\x21\xf2\xba\xd1\xf4\xd3\xa0\xf5\x77\xd8\x3b\x3a\x45\x75\x3c\xc4\xa3\x01\x55\x3a\x5c\x66\x54\x78\xda\x2f\xdb\x7e\x3a\xbd\x74\x2b\xfc\x8d\xd7\x69\xc7\xf1\xa2\xf0\x3f\xe4\xb1\x65\xdf\x22\x2c\x35\x89\xe2\x17\x67\xca\x0a\xe3\x52\x02\x0a\xaf\xc7\x16\x79\x8d\xb7\xe7\xaa\x7f\x15\x28\x60\xfb\x6c\xf5\x4a\x01\xa6\x37\x14\x52\x58\x0c\x50\x84\x3c\xda\xf5\xb9\x32\x83\x28\x78\x65\x27\xc6\xf3\xd4\x9d\x38\x0e\xe1\x89\xed\x05\x1c\x99\xe2\x50\xb5\x00\xbb\x83\x94\x8d\xd5\x72\x88\x6e\x77\xdf\x37\x8a\xd9\x77\x55\x93\xfa\xb3\x0a\x45\xbf\xc7\x91\xa1\x78\xb1\x13\x49\x77\xb5\x5a\x29\x06\xf0\x56\x73\xb8\xf4\xb0\x70\xee\x72\xb0\x74\x0f\xe9\x51\x52\x67\x4f\xde\xfc\xe9\x98\x83\xe2\x43\xca\xe5\x7a\x67\xc4\x7f\x9b\xfa\xd2\xb4\xe2\x3f\x4d\x2b\xc7\x11\xb2\xcd\x3d\x85\xff\x50\xcb\xbb\xc0\xc5\x8d\x61\xbf\x5f\x8a\xa6\xf0\xe1\xe5\x19\x31\x51\x89\x4f\x69\xe6\x22\xa1\x72\x01\x12\xa9\x9c\x70\xa4\x59\xef\xf3\x49\xfc\xa8\x1a\x10\x02\x3f\x8e\x26\x1a\xba\x46\x5a\x8c\x55\xc0\x25\x29\xe0\xc7\x7b\x9c\xfd\x66\x01\x7a\x31\x26\x39\x8e\x95\xb3\x10\xe0\xcc\x71\x42\xd1\x0f\x25\xbe\x36\x67\x67\xc4\x9e\x0e\xb9\x58\x57\xc4\xcf\x58\x96\xe1\x3f\xf8\x14\x07\xd6\x2e\x37\xff\xdc\x30\x9a\x80\xf2\x7a\xfd\xb1\x7c\x32\x9a\xc2\xbe\xaa\x4b\x9e\xaf\x61\xe7\xab\x8a\x8c\xd1\xe7\xd9\xcf\x8a\x4b\xec\x1a\x7f\xc0\xa9\xee\x63\x50\x33\xae\x46\x74\x36\x46\xd7\x38\xf9\x3c\x1f\x8c\xbc\x92\x23\x8d\x34\xc0\x0a\xff\xe5\x73\x80\x12\x7e\xad\xdc\x7c\x30\x07\xd0\xd7\xee\xc7\x53\x98\x08\xfc\x43\x96\x83\x48\x7e\xbb\x06\x74\x5d\x2a\xa7\xc6\x85\xe9\x62\x7c\x6e\xfa\xfd\x42\xa4\xba\xd4\xa2\x02\xf8\xab\x4e\x37\x3f\x9e\x34\x07\xb2\x3b\xe5\xa0\x40\x4b\x42\x09\x3b\xd0\xbd\x6a\x4f\xed\xbd\x61\x2f\x2e\xf5\xb6\x33\xca\x40\xfa\x63\x0d\x24\xb2\xb6\x9c\xa3\x0f\x8a\x0a\x59\xac\xaa\x7a\x79\xd2\x2c\x1e\x68\xe9\xaf\xac\x23\x49\xf2\xff\x40\x53\x13\x6c\xdd\x5f\x66\xf3\xfb\x71\x82\x33\x95\x35\xb5\x54\x28\x75\x0e\x1d\x88\x95\xfa\xee\x8d\xb7\x56\xd7\xd7\x6c\x1f\xb8\x6f\xd0\x28\xce\x7f\xe3\xeb\xcf\x53\x88\x89\x6c\xfa\x34\x53\x4b\x99\xc4\x18\x38\xd3\x8d\x7a\xfa\xc3\xd9\xbc\xa3\x87\xb0\x28\x62\x0b\x33\x3a\xd1\x1d\x99\xdf\x54\xf4\xed\x0b\xb8\x62\x76\x80\x08\xbb\xdf\xd0\xa2\x31\xcd\xf5\xc8\x0d\xd6\xd7\x77\xf4\x71\x44\x1c\xd3\x93\xd8\x84\x2a\xae\xe2\xc3\x14\xd3\x03\x21\xfa\x84\x75\x35\x84\x40\xdd\x18\x0a\x3e\xa6\xa8\x4b\xfe\x5d\xc8\x8f\x8f\x7e\x5b\x7f\x24\xe3\xd6\x4b\xb5\xbe\x8d\x5e\x29\x7a\x6e\xbd\xbf\x4b\x92\xb8\x2e\x39\x02\x7e\x2a\x2f\xec\x79\xe4\xc6\x27\xbd\x73\x18\xf0\x37\x4b\xf6\xd7\xbf\x78\xd4\x1b\xfb\xec\x18\xe3\x3b\x3f\xd8\x54\xa1\xe7\xb9\xf3\xb0\x85\x02\xdb\xcf\x59\xc3\x8b\xd8\xc7\x4d\x97\x25\xfa\x78\xb5\xd0\x70\x3c\x8e\xb0\x19\x38\x84\x64\x19\xe5\xe1\xa9\xea\xb1\x81\xec\x90\x26\x80\xe5\xe9\xda\xb6\x21\x6c\x43\x33\x81\x8b\xbe\xcf\x28\xa2\x35\xb3\x42\xd1\x25\x60\x44\x8d\x69\x37\xb6\x8f\x61\xff\xf9\x6b\x44\x36\xeb\x0c\xb0\xfc\xb0\xba\xfc\xe8\x56\x07\xf0\x92\x76\xc8\x18\x1b\xb6\x5f\xa3\xcb\xe4\x8b\x55\x1c\x7e\x8b\x31\xe5\x21\xf3\x55\x1a\x2b\x97\x50\xf0\x00\xea\x30\x5f\x51\xe5\x16\xce\x65\x31\xae\x39\x74\xad\xc3\xbc\x42\xec\x99\x63\xb8\x69\x10\x2c\x1a\x77\xe7\x4a\xad\x36\x1d\x35\xfc\x29\x08\x84\xd4\x92\x73\xcc\x47\x31\x6e\x62\x74\x02\xbc\xb7\xa7\xce\xe1\xd6\xf6\xcf\x6f\x0c\x0b\xdd\xcd\xca\x2d\xd8\xca\x5f\xe9\x21\x18\x28\xd1\x82\xe5\xd2\x6a\xa8\x98\x89\x03\x7d\x82\x9d\x36\x34\x4a\x6b\x7a\xd5\x1f\x9d\x15\x1a\xea\xe1\x17\x14\x49\x5f\x9d\x90\x5d\xf4\x3b\xdb\x06\x02\xee\xb3\x11\xb3\x8f\xf5\xec\x9e\xbb\x7a\x48\xfe\x39\x4d\x9e\x99\x8e\x2e\xdf\x24\xf9\x39\x6f\xce\xa0\x79\x60\x9d\xa3\x31\x8c\x03\x50\x37\xd5\x21\x6d\x47\x2a\xca\x54\x14\x5a\x9a\x21\xa8\x07\x99\xac\x23\xc2\x79\xc3\x91\x6e\x6b\x58\xf5\xe4\xe5\x6f\xac\xe9\x50\xbd\xf1\x00\xf7\x9f\x2b\xf6\xbc\x72\xd5\xfc\xaa\x26\x25\x52\x5c\xdc\x28\x9a\x47\x41\x36\xae\x92\xe3\x57\xc7\x89\x94\xe5\x69\x1d\x38\x19\xd8\xfe\xf5\x69\xd0\xa0\xb9\x47\x83\x9a\x5f\x1f\xf1\x02\xb8\x45\xee\xf6\x6c\x52\xe5\x1e\x89\xa8\xbc\xae\x2b\x62\xce\xb7\xca\x63\xfc\xb6\xd6\xc4\x0a\xc0\xe0\x8b\x21\xf6\x9b\x97\x0e\xd9\xfc\xf3\x4e\xff\xea\xda\x4c\x41\xef\xee\xad\x33\xf9\xec\x76\xb4\x99\x20\xc2\x90\x4c\xaa\xb5\xe3\xc4\xd9\x93\xfb\xc6\xeb\x8a\x06\x9e\x8a\xc3\x2f\x4b\x23\xe3\x51\x3d\x6e\x0e\x6f\xf2\x67\x09\xbf\x93\x93\x7e\x20\x37\xdf\x24\xa5\x53\xe3\x49\x04\xae\xf3\xdf\xea\x5b\xd0\x5f\x85\x91\x36\xf3\xea\x0c\x90\x91\x98\x1b\x85\x07\x36\x0b\xb8\x04\x5f\x29\x8d\xc6\x7e\x98\x5c\x56\xe3\xea\x0d\x78\xb2\x6c\xaa\x34\x6b\xe2\xea\x6f\x5e\x53\x41\x92\xa8\xf8\xd2\xa2\x1e\x1b\x69\x21\x6f\x58\x2b\xab\x30\x28\xfd\xcd\x32\x7f\xec\xf9\xcc\xf5\xdf\xe2\x83\x7f\xed\xd1\x10\x69\x54\xcc\xff\x50\x63\x8a\x28\x67\x84\x17\x2d\xd4\xfa\xad\x2d\xcb\x7f\x8f\xa0\xf2\xe2\x3f\x77\xa4\x24\x48\x4a\x4e\x65\xcf\x6f\x89\xe3\xf2\x7c\x19\x29\x06\xbc\xd8\xe0\x42\x72\x1f\xb7\xc0\x32\xf6\x37\xb1\x93\xd9\xb8\x3c\xee\xf5\x54\x32\x2d\xef\xfb\xae\xa4\xed\xef\xc3\x03\xaf\xe6\xe6\x6e\x01\x61\xcb\x2c\x74\x6f\xb5\xef\xc2\xa1\xfc\x3c\x34\x3d\x6d\x8a\x7c\x58\x2a\xc1\x4b\x27\x29\x83\x6a\x0e\x8a\xe8\x70\x51\xbe\x7b\xc3\xaf\x8a\x81\xb8\x12\x23\xc5\xb9\x79\xd6\x69\xdd\x50\xa6\xbe\xc7\x09\x3b\x34\xa9\xb5\x52\xc0\x84\xc3\xc3\xd9\x16\x1c\xc3\xdd\x88\x95\x78\x33\x84\x07\x98\xd6\xe9\xae\x13\x45\xfa\x13\xde\xc7\x22\x3f\x7c\x91\xee\x6c\xd4\x75\x7b\x61\xd8\xff\x67\x6d\xf1\x3c\x9d\x74\x8e\x56\xed\xdb\x6c\xdb\x5f\x12\xcd\xbf\xd0\x07\x44\x92\x24\x00\x7c\x05\xa7\xc5\x6d\xfc\x42\x85\x6d\xa2\x07\x97\x68\xa8\x95\x54\xee\x2d\xe2\x69\x76\x0d\xec\x78\x3b\x51\xf2\x8b\xe5\x04\x66\x2b\x60\x45\x54\x10\xab\xc6\x71\xe0\x67\xda\x7a\x24\xe9\x13\x57\xcb\xc0\x48\x67\xa3\xeb\xc7\x44\x31\x9b\xe6\x28\x1a\xd5\x07\x36\x92\xbd\x06\x50\x7a\x2e\x8f\x17\xad\xe8\x63\x2c\x44\xe4\x60\xc9\xc4\x85\x4d\x6c\xc2\xf5\xf6\x8f\x83\xba\x69\xa0\xa2\xa6\x72\xdb\x38\xb2\xdc\x69\xe3\x6b\xc0\x94\x5a\x47\x37\xa2\x3b\xc5\x2f\x9e\xc4\x50\x71\xbb\x39\x06\x79\xe9\xc8\xfe\xc5\x87\x19\xe8\x8e\x18\x3c\xe4\xf2\x9c\xb9\xc9\xb4\x9e\xbf\x8e\xfd\x0b\x2d\x40\x24\x61\xe8\x00\xc7\xee\x9e\x85\x2f\x9d\x2f\xe0\x0b\x7b\xf8\xf5\x19\xd4\xc4\x3d\x46\x26\x7c\xc9\x16\xf7\x3b\xc7\xce\xcb\x30\xd6\xfb\x45\x7e\x42\x00\xe6\xc7\x13\xbf\xdc\xa2\x1d\xaa\xa8\x41\xe7\xd5\x0e\xca\x42\x26\x5a\x58\x2a\x1f\x88\x72\x29\xca\x0e\xe8\x34\xeb\x5b\x67\x0b\x2f\x47\x41\x71\x47\x59\x7a\xa6\x9f\xa2\x96\x2f\x83\xe9\x03\x61\x3d\xda\x93\x54\x36\x76\x27\xb2\xbc\xc9\x0c\xa8\x1b\x62\x86\xae\x19\x6c\x0f\x25\xd1\x01\xd3\x07\x7d\x21\xd4\x55\x23\xd5\xfa\x39\xb4\x0e\x36\x0e\xdc\xfb\x64\x9d\x36\x48\x08\xbe\x79\x82\xc6\x8c\x48\x10\xa3\xcb\x4e\xeb\xe8\xe5\x0c\xcc\xff\x6e\x6f\x87\x48\x51\x43\x99\x82\xa7\xcd\xf6\x7b\xe6\xc6\x5f\xda\x31\x59\x5d\x3f\x7b\xd1\xc3\x84\x12\x73\x29\x21\xd8\x7a\x2b\x7c\xe3\x9f\x53\x79\x69\xcc\x3f\xaf\x83\x79\xb3\xf4\x81\xb4\xcd\x24\x3e\x64\xc1\x98\x87\xef\x02\x44\xfd\xe4\xb7\x74\x63\xe6\xf2\x5e\xbe\xd8\xe4\xd4\xc2\x5f\x2f\xf4\x3a\x21\xc9\x40\x80\x33\x40\x5f\xb1\xbc\x91\x2b\xda\xef\x27\xf3\xf9\x74\xee\x43\xc4\x2c\xa3\x06\x77\xf8\x01\x35\x2b\x4e\x61\xc7\x81\x88\x7e\xf0\x1c\xe8\x84\xa5\xc6\xcc\xc8\xcd\x71\x23\xfd\xbc\x55\x53\x9a\x45\x54\xbd\x45\x1f\xd7\xe6\x82\x63\x59\x2b\xff\x91\x83\xae\x6a\x2a\x76\xe7\xf3\x6f\x60\xd0\xea\xf9\x17\x1f\xc2\x6e\xa0\x35\x12\x60\xab\xb7\xd1\xb2\x14\x0e\x17\x59\xc3\xbd\x39\x22\x3b\x52\xdf\x08\x6e\xdd\xf7\x68\x51\xc6\x03\x3a\x7d\xd1\xb1\x3e\xfc\x22\xcb\xe8\x77\xe9\xba\x46\x84\x47\xb0\xd2\xd3\x09\x9e\x0c\xb5\xdf\x3f\xbd\x8e\x22\x5d\xe0\x1f\x26\x2a\xd1\x07\x9c\x2a\xd5\xf0\x7b\x95\x42\xce\x4a\x86\xf5\xad\xb5\x6f\x68\x06\xfa\xcf\xa4\x93\xd1\x3b\x0f\x05\xfb\xbe\xcc\x4b\xf5\xb6\xd0\x8a\x3e\xdc\xbf\xc9\x97\x7f\x21\x21\x88\x34\x0c\x14\x14\x27\x10\x33\xf4\xa6\x5c\x4a\x95\xe8\x2f\xe1\xc3\x65\x9e\x53\x41\x9d\x1e\xaa\xb7\x46\xad\xec\x0d\x65\xe8\x1a\x75\x79\x61\x15\x95\x4e\xa0\x69\x00\x93\xb0\x71\x48\x9f\x7a\x48\x26\xc3\x2b\xb1\x2d\x3e\x99\x70\x9b\x3d\xa0\x7b\xaf\xa1\x48\x1a\x37\x9f\xb7\x12\x41\xe0\x13\x03\xd7\x07\x8a\x72\xa1\xed\xba\xfd\xf9\x66\x5d\xcb\xae\x13\x22\x2d\x72\xed\xa1\x4b\x7d\xd0\x1a\x29\x33\x01\x23\xa5\xf5\x82\xdb\xba\x97\x7e\x5c\x17\x64\x27\x55\xe4\x95\x5b\x2c\x9f\x8e\xa7\x4f\x45\xe2\xaf\x09\xe0\xee\x55\xe3\x75\x9a\x40\x1d\x69\x7c\x84\xc4\xf2\xf2\x12\xe3\x57\x95\x96\xfe\x15\x30\xfd\x27\xc6\x92\x86\xa6\xe8\x0f\x00\x04\x4c\xe1\xa3\x35\x18\xf6\x6f\xb8\x09\x1d\xcb\xe2\x3e\x56\x29\xe5\xc2\x0c\x66\x18\xa8\x37\xfe\x34\x2c\x24\xde\xd3\x8c\x3e\xb7\xfe\x09\xe6\x1d\x06\xd0\x4d\xbe\xb3\x25\xb0\xf5\xf6\x42\x21\xdc\x14\x86\xf4\x1a\xad\x0d\x51\x58\x99\xce\xd5\xa0\xe3\xb8\x5c\x6d\xb2\x62\xf6\x51\x02\xa6\xad\xd7\x87\xa4\xd5\xb0\xbb\x49\x12\x47\xae\x7a\x14\x0c\x7b\x02\xf1\x11\xfa\x99\x47\x29\x9f\x98\xe3\x11\x94\x32\xb5\xda\x49\x40\x45\xff\xbe\xeb\xfd\x0d\xc6\x9a\x56\x5a\x26\xeb\xa9\xc3\xd7\xf9\x49\xd7\x9f\x74\x9d\xaa\x12\xb7\x7d\x8d\xa7\xfb\x1b\x2c\x83\xf5\x0b\x40\x02\x6b\x87\x7f\x35\xb3\x22\xde\x19\xe3\x9c\x32\x71\x5e\x6a\x6b\x8e\xd5\x14\xef\x76\x7c\xa7\x73\x41\x44\x17\x81\x5e\x34\x3b\x91\x12\x48\x8b\xfd\x34\x6f\xde\xe7\x6b\x4b\xc2\xf5\x58\xa9\xfb\xfa\xbe\x36\xed\xda\x0a\x49\xbb\x33\x8b\x10\xd7\x6f\x71\x54\xbb\x2e\xc1\x0a\x66\xe4\x6f\x2c\xfc\x0b\xe9\x41\xa4\xa1\xa1\x60\xd8\x81\x58\xd8\x19\x7e\xe7\xc4\x84\x16\xd3\x3a\xd7\xae\xf3\x79\x8a\xf0\x79\x4b\xb2\x99\xa2\x0e\x2e\x9e\x7f\x3c\xda\x8b\x03\x61\xa9\x3f\x9c\xa8\x60\x76\x5a\xfc\x96\xd0\x75\xaa\x15\x2d\xd9\xcc\xbb\x59\xf1\xfd\x0b\xf2\xdb\x8f\xd0\x67\x6f\xb1\xda\x69\x0c\x19\x10\xa4\x57\xe2\x3f\x82\x7d\x51\x96\x83\x7a\x94\xeb\xdd\x73\x71\x57\x6f\x10\xd6\x55\x8e\x67\xea\xee\xa0\xe6\xa7\x16\x96\xcc\x7d\x88\x8f\xab\x82\x7c\x97\x22\xc1\x2e\xac\x11\x2b\x0e\x21\x03\x0e\x4d\x46\x16\x67\xf6\xa7\xb4\x4b\x36\x5e\x8e\xf9\x5a\x33\x0e\xba\xd2\xc3\x0e\x17\x37\x02\x56\x4a\x86\x37\x7f\x95\x2b\xff\x05\x0d\x21\xd2\x70\x50\x66\x60\x37\xcb\xcf\xde\xdc\xec\x46\xf9\x0c\x04\x0d\xc3\x88\x4e\x1c\x7f\x16\x82\xd8\x4d\x5c\xbb\x86\x48\x05\xfd\xe5\x46\x34\xaa\x1f\x17\x8e\x40\x1a\x7c\xdf\x40\x35\x57\x93\x15\xcb\x4c\x17\x0e\xf6\xbe\xed\xe2\xac\xf4\x42\x27\xdf\x2e\xd1\xd0\x0f\x22\xd9\xd3\x94\x0c\xcd\xc2\x7c\x4f\x60\xad\x1b\xd2\x49\x43\x68\x0c\x4e\xb3\x29\xe4\xf2\xdd\x09\x19\x2f\xb1\x64\xdd\x3d\x14\x74\x13\x9c\xcd\xcc\xda\xf6\xfb\x68\xb4\x6c\x81\xa2\x90\xdf\xbe\xbb\x45\x28\xd1\xd9\x3e\x9b\x4a\xc9\x7d\x24\x08\x5f\x89\xcb\x11\x2b\x12\x1e\x86\xa2\x90\xdf\x60\x6e\xa3\xdd\xcd\x5b\x81\x02\x6d\xde\x48\x92\xfa\x64\x18\x26\x93\x1c\x50\x9c\xb1\x41\xca\xaf\x7c\xb6\x8a\x03\xd7\x83\x60\x35\xc6\xc8\xe9\xea\x1d\x8d\xd8\x2a\x41\xdc\x3f\x9f\xfa\x8e\x41\x0b\xa3\xd5\x22\x0b\xfb\x79\x56\x41\x54\x09\x07\x0f\xb4\xb4\x56\x22\x3e\x63\x9b\x0e\x0f\xfe\x6c\xe1\xcf\xa3\xf9\xbf\xa1\xf0\x2f\x34\xf3\xff\x87\x02\x02\xd8\xd4\x9b\xdb\xa0\x92\x63\xef\xf0\x97\x78\xb1\x4b\x5b\xbf\xa0\x84\x46\xa7\xbd\x71\xdc\x03\xf2\x0f\xee\x97\x49\xd9\x14\xab\xe7\x47\x49\x65\xc0\x24\xb4\xaa\x7f\xbe\x0e\xe6\xbe\x64\x2c\x32\x75\x41\x6f\x2e\x79\x45\x8c\x40\x6d\xfb\xe3\xab\x72\xcd\xe0\x7d\xa4\x4e\xce\x1f\x5e\xec\x35\xc0\x34\xa5\xb9\xd5\x6b\xf7\xe7\x6b\x77\x1d\xf8\xd4\xf7\x0c\x33\x1b\x5b\x56\xc4\x87\x1e\x5a\x58\x2f\xa4\x6e\x5b\x4c\x6d\x75\x3c\xff\x80\x3b\xaf\x49\x40\x7d\x0b\xb4\x1c\xbf\x40\x69\xa8\xd4\x77\xe4\xe0\xc4\xf1\x3e\x8a\x60\xee\x4a\xbb\xa4\xe8\xac\x88\x3a\x69\x7b\x45\xaf\xa2\xcb\xa2\xff\x9b\x2d\x62\xc6\x46\xe3\xb3\x19\x39\x19\xa8\xf6\x0d\xe1\x0f\x80\x63\xb3\x5e\xba\xcf\x50\x27\xc4\xec\xbe\x13\xc2\x88\x37\x30\xdd\x97\xc6\x86\x48\x3f\xfa\x3c\x3e\x82\xed\x12\xf4\x0e\xdc\xd0\xb1\x15\x78\x4d\xdf\xbd\x6c\xf1\xce\x6e\x67\xe8\x24\x7f\x8f\x9a\x22\x17\x84\xe3\xcf\xa6\x56\xd9\x21\x32\x56\x03\x5c\x9c\xcd\xd9\x6f\x0e\x94\xba\x91\xb3\x1e\x90\x1b\x67\x5c\xd4\xe1\xc0\xb0\x8b\x25\x19\xaa\x9f\x4f\xab\xcd\x6b\x8d\x1c\x9d\xee\xe1\x14\x00\x20\x98\x7d\x21\xac\x49\x67\x4f\x24\x34\xe2\x8c\xc5\x60\x1b\x4d\x39\x81\x85\xc2\x8f\x75\xae\xbb\x16\x7d\x54\xbd\x5a\x24\x7b\x5e\x16\x38\x03\xab\xfc\x5a\x83\x37\x79\x2d\x8f\x46\xbb\xc1\x49\x6a\x4b\x8a\xe2\xf2\x8c\x50\x52\xd2\xff\x57\xa2\x2d\x0a\xe3\x5c\x7b\x5d\xa8\x09\xc0\xc5\xb2\x1c\xc1\x0d\x59\xda\x2d\xd4\xef\xd6\x19\x1f\xd5\x63\xbb\x6e\xfb\x79\xf5\x86\xc3\xfa\x19\x23\xc7\xa2\xac\x98\x8e\x72\x6a\x30\xd8\xc5\x79\x93\xb8\xe0\x94\xce\xab\xdd\xd7\xeb\xbb\x7a\x61\x9c\xf6\xa9\x68\xdc\x90\xb0\xe2\x07\x24\x0a\x5d\x3b\xa6\x26\xe8\xd8\x82\x2d\x50\xf8\x96\x51\x5d\x86\x87\xbf\x20\x26\xd1\x74\x4c\xb0\x96\xd2\x40\x51\x96\x62\x21\xba\x8c\x39\x47\x3e\x34\xc2\x33\x82\x52\xa4\x84\xb9\x1e\x44\xc1\x2a\xea\x8e\xfb\x35\x06\xd8\x9b\x44\x4e\xf0\x91\x21\xb7\xcc\xb4\x99\x34\xc4\x95\x46\x5f\x10\xe5\x28\x6d\xa9\xcf\xed\x5c\xd1\x0c\x9e\xfc\xc7\x4e\xfd\xa5\xa4\xe7\x3c\xd8\x68\xd8\x75\x0e\xed\xef\x7a\xb4\xdf\x94\x2f\x3b\x90\x28\x92\x8a\xfc\x9c\x96\x68\xc7\xff\x03\x07\x40\x47\x6a\xfa\x88\xb4\x5f\x2e\xe6\x5a\xb3\xa8\xeb\x41\x46\x26\xef\xc2\x6e\xff\x11\xd7\xce\x80\xee\x5d\x64\xd2\xd1\x5a\xc1\x20\x33\xa6\xed\x93\xe5\x54\xf3\xd6\xfd\x44\x15\x66\xfd\x66\xe5\x77\x11\x96\x40\x6a\xd3\xa6\x2e\x3a\xb1\xe2\xdf\xc6\x3a\x82\x7b\x11\xb9\x03\x4e\xaf\x06\xc1\x99\x5a\xbf\x19\x94\xed\x8f\x0d\x7e\x3b\xc6\x53\xbe\x70\x20\x3e\xc7\xf4\xbb\x48\xf4\x0f\x5a\xe5\x41\xfe\x6f\x7a\x9d\x55\x59\xaa\xb9\x09\x80\xde\x98\x26\xba\xc7\x4b\x78\xdf\x3c\x5e\xa8\xd2\x3e\x0d\xb5\xb8\xd4\x8d\x18\x25\x66\x0f\xef\x75\x16\xc2\x67\x6b\xe5\x39\x9b\xc2\xf2\xf4\xfc\xbc\x37\xe9\x71\xfa\x90\xd3\xa2\x83\xde\x88\x59\x18\x06\x3f\xe6\x7e\xbe\x32\xcd\xbb\xed\x7c\x77\x83\xda\xf3\xfb\x01\x72\x5a\x03\x80\x89\x88\xe9\xab\xd5\xb0\xd2\xda\x02\x2f\xe6\x9b\x5a\xa8\xe4\xa5\x9d\x76\x36\xb6\x9b\xae\x38\xec\x2a\xf2\x0a\xf6\x1a\x0a\x77\x1e\x6c\x2d\xc6\x36\xdc\xa8\xdd\xa3\xb5\xe8\x86\x3e\x35\xe5\x14\x11\xa5\x74\xc6\x5e\x80\x85\xa7\xa1\x04\x15\x27\x21\xa6\x64\x6a\x8d\x8c\x00\xb0\x6c\x2a\x1c\xe1\xdc\xf3\x1c\xbe\x91\x60\x19\x57\xd3\xbe\xb3\x0f\xa2\xda\x78\x54\x62\x11\x70\xe5\xb5\x93\xd9\xd2\xe8\x5b\xa8\x5e\xec\x78\xb2\x9c\x65\x77\x3a\x77\x32\x60\x77\x89\x52\xec\x45\xf5\xde\xea\x86\x53\x27\xae\xd6\xa9\xc6\x41\xfe\x80\xe2\x69\x61\xb4\x83\xfe\x46\x0f\x78\xbc\xfc\xa9\xb4\xee\x8d\x14\x8a\x97\xcd\x4a\x17\x96\x82\x41\x37\x86\x0d\x6a\x26\xfa\x66\x41\xeb\xd7\xd5\x97\x16\x0f\x26\x4b\x08\x9e\x4f\x83\xea\xb2\x22\x16\xec\xfa\xd7\x49\x9a\x88\x94\x1f\xd5\x38\x92\x6f\xe6\x27\xd9\x1f\x24\x50\x1e\x53\x66\x88\x8f\x6d\x7e\xa5\x51\x01\xb8\xa5\xad\xc2\x5e\xb2\x8a\x5b\x4d\x6d\x0b\x26\xcf\xda\x3f\x10\x9a\xc6\x18\x96\xc2\xaa\x15\x99\xbc\xf2\x76\x8e\x0b\xbd\x8d\xa9\x68\x9a\x07\xbf\xd3\x1b\x95\xbe\x19\x85\x5c\xe4\x94\x2f\xbc\x98\x4c\x1e\x25\x68\xaf\x7a\x9a\x34\xcb\xca\x62\x88\x92\x58\xa7\x65\x05\x47\xfa\x1b\x12\x9e\x66\x0a\xc7\x1f\x8d\xd9\x12\x70\x10\x81\x01\xbf\x82\x76\xaa\x24\x52\xdf\xd1\xca\x67\x63\x3f\x0e\x79\x69\xba\x75\x62\x71\x9d\x3c\x25\xf1\xf4\x7c\x1f\xf5\xad\x53\x99\x02\x19\xbb\xba\xac\x70\xad\xa4\xd2\xdc\x13\x41\xb4\x2e\xeb\x16\x7c\x54\x08\xef\x96\x50\x96\xec\x1b\x15\x80\x85\xbb\x09\xcd\x20\xe9\xf6\x49\xd9\x6e\x8b\x51\xe8\xb9\x78\xa4\x53\x92\x7d\x78\xc4\x38\xba\xd7\x0d\xe7\x27\x4d\x1d\x5b\xcd\xb8\x06\x65\x70\xa6\x37\x85\xb0\xc5\x44\x5c\x53\x18\xaa\xa6\x77\x9f\xf9\x87\x20\x8f\xe9\x0e\xef\x64\x73\x1f\xab\x53\x6c\x8f\x92\x6a\x1d\x4b\xae\x94\xc1\xac\x1e\x6a\x61\xd2\xc0\xae\xc6\xfd\xea\x0f\xb6\x30\xe7\x97\x6b\xfc\xcc\xb4\x63\x61\xf7\x4c\xa6\x82\x61\xf5\xa8\x72\x8e\x48\x41\x60\xaf\x8e\xca\x3c\xd7\x0c\x83\x1f\xb2\x79\xc6\xdb\xc5\xb3\x96\x7d\x35\x39\xc1\x8c\x6d\xda\x6b\x4e\xa8\xb2\x85\x32\x08\x02\xeb\x2a\x59\xbd\x80\x69\x43\x8f\xfe\x72\x90\xd2\x69\xdd\xba\xec\xcc\x47\x43\xc6\x15\xd9\xb7\x8a\x1d\x6f\xdb\xc4\x4b\x92\xfc\xb6\xa2\x8c\xc8\x74\x33\x47\x9f\xfe\x68\x09\x3f\xbc\xe9\xe7\x4b\xe7\x3f\x29\x12\x92\x47\xa8\xd4\xe5\x7d\xed\x40\x6d\xcb\xf8\x82\x4f\x18\x22\x59\xd6\xe2\xb5\x1f\x7c\x07\xf4\xc0\x5b\x56\xb1\xb4\x09\xdc\x5f\xe9\xc5\x0e\x44\xe9\xd4\x1a\xce\x6c\xb8\x6a\xac\x54\x57\x3c\x98\x0a\xd1\x2f\x64\xae\x93\xd8\xda\x1f\x00\x5f\xc0\xde\x18\x4e\x47\x19\x23\x1f\xb3\xc2\x63\xe7\x38\x91\xc5\x84\xcb\x62\x8f\xa2\xec\x58\x53\xb3\xc0\x16\x07\xe9\xc1\x80\x6d\xe0\xc1\xd3\xf3\x9f\x15\x48\xd7\x33\x72\xc1\xa6\xc6\xba\xa3\x19\xcc\x9c\xb8\x6d\x36\xb8\x49\x4b\x14\xff\x32\xe9\x2e\x0d\xfa\x92\x3d\x43\xca\xb0\xf1\xf4\x7c\xe2\x5a\x8c\x18\x1a\x31\xec\x89\xb4\x1a\xbd\xb3\x96\xdd\x03\x89\xca\x8c\x8b\x5f\x93\xdb\xc2\x53\x26\x64\xb8\x18\x73\x31\xe2\xff\xc9\x54\x29\xe4\x70\xc6\x75\xb7\x42\x8a\x19\xe4\xf2\xd8\x76\x66\xb4\xa7\xad\xd3\x15\x9c\x54\x34\x37\xfb\x73\xea\x12\xd1\xf2\x49\xa1\xd4\x9f\x42\x25\xa2\x5b\xcc\x5d\xf6\x46\xd5\xe6\x1d\xe1\x59\xac\x11\x75\x69\x92\x07\x94\xbe\x46\x74\x64\xcb\x0b\x0d\x57\x1f\x56\xf3\x68\x0b\x40\x90\xac\xf7\x2e\x4b\xb8\xf6\xb8\x3e\x6c\x7d\x3a\x76\x6a\x59\x94\xd7\x54\xe6\x30\xb7\x87\xf1\x5b\x05\x01\x74\x75\x36\x97\xbc\x32\x5a\xdd\x93\xe5\x21\x06\xdd\x09\x6b\xd5\x43\x4e\x81\xe8\xc0\x6d\x0f\x1d\xd4\x4b\xb8\xf2\x5b\x2e\x66\xc3\x60\xb3\xbb\x6d\x8f\x2b\xb3\xe2\x6f\xae\xc0\x9a\x22\x69\xfe\xf0\x71\xf2\xa7\xb9\xcf\xde\x0a\x91\x85\x5b\xdb\x4d\x96\x5e\xb0\x47\x86\xa3\xf4\xb7\xeb\xe8\x48\x59\x1f\x43\xaf\x56\xe0\x8f\xfe\xca\xdf\xc1\x65\x52\x55\xbb\x1a\x35\x9e\x70\xc4\x24\x8a\xa4\x71\xde\xe8\xad\xef\xf8\xf9\xb3\x74\xe4\x6c\xed\x6a\x94\xcd\x97\x97\x00\xcb\x09\xb3\x1b\x0e\xb6\x9d\xb3\x0c\xdb\x44\xf4\x8f\x86\x97\xa3\x93\xe1\x32\x4c\x70\x4f\xe2\xa9\xbb\x52\x72\x81\x6d\x50\xdb\x97\x77\xa0\xca\x57\x97\x4e\x23\xed\x83\x2a\x9b\xf0\xbe\x02\xe5\xc3\x84\x01\xc2\x17\x2b\x62\x72\xde\x1e\x9b\x70\xcb\x96\xca\x9a\xd4\x5d\x24\x20\xff\xa3\x5f\x19\x96\x58\x74\x59\x63\x6d\xc3\x3e\x7c\xf8\x48\xcf\x81\x8f\x3e\xde\xe2\x81\xe1\x76\x4d\xe0\xf1\x79\x59\xfe\x27\x7f\xdd\xf9\x93\xe5\xb6\xf0\xe4\x68\x0f\xb2\xc7\x35\x21\xf6\x6e\xda\x24\xa5\x94\xb4\xbb\x6f\xe2\xd8\x65\x02\x9f\xad\x01\x4f\x3d\x99\xd8\x0b\xfe\x8f\x60\xa3\x20\x82\xe2\x08\x91\x13\x92\x13\x7e\x2f\xa4\x19\x36\xf4\x2f\xda\x29\x67\x59\xde\x8b\x62\x71\xb1\x45\x6c\xc5\xa6\xe7\xdc\x96\x9d\x4f\x83\x92\x8a\xdf\xbb\xbd\xe2\xef\xdd\x8d\xc8\x7e\xe9\x6f\x93\x7f\x5d\x7d\x66\xd9\x3f\xde\xdd\xf8\x23\xef\xf0\x80\x9a\xbb\xe0\xf4\x7e\xf9\xc9\xd2\x93\x39\x7e\x91\xd5\x8f\xe8\xd2\x41\xfe\x38\x4a\x60\x6f\x1c\x8f\x71\x85\xbb\x8c\xf2\xb2\x93\x3e\x48\xd0\xb7\xf9\xa0\xe5\x35\x58\xbe\x85\x6e\xc1\x2c\x2b\xd6\x65\xfc\x67\x6e\x05\x4e\x42\xec\x8a\x19\x1e\xbb\x66\x7a\x8a\xfb\x0a\x13\xda\xb4\x49\x3c\xfe\x75\x86\x3e\x78\xaf\x66\x4f\x38\xff\x3b\xd6\xfe\xdd\x9a\x8a\xe0\xf5\xac\x39\x04\x0a\xf2\x16\xf5\xad\xdb\xa7\x67\xdd\x7a\x77\xe2\x62\x97\x19\x62\xa4\xc0\x15\xeb\xa6\x16\x73\xe6\xb8\xf1\x2b\x71\x3d\xc2\xd7\xef\x2c\xbb\x7b\xf1\x9f\x35\xf3\x37\xdd\x0c\x25\x9a\x3a\x7b\x5c\x66\x53\x17\xf1\x0e\x80\x32\x1b\x7a\x43\xbb\xd8\x6e\x1f\xaa\x6d\xda\x3c\x32\x85\x32\x7e\x57\xd1\x8e\x3c\x13\x83\xfb\x3e\xfe\x59\x66\xdb\xaf\x45\x50\x4e\x34\xf1\x69\xd0\xfb\x6a\x64\x7a\xbb\x7a\x13\xe3\x89\xb4\xa2\x33\xfc\x7d\x09\xfa\xdd\xe4\xf7\x3f\x90\x45\x7f\xf0\xaf\x58\x85\x27\x91\x26\x26\x2e\x81\xb1\x4f\x18\xfa\x96\xb0\xa1\xb5\x4b\x66\x01\x5d\x51\xbc\xb5\x83\x12\x0d\xbe\xa8\xc3\x6c\x7c\xd3\x4b\xf5\x66\x3b\x44\xef\x36\xd2\x95\x09\x30\xb5\x0d\xc4\xe0\xa7\x83\x1e\x49\xa4\xa9\x9a\xcc\xfd\xe2\x77\x4d\xb2\x5b\x9b\xd7\xf3\x29\xb3\xfb\xb3\x26\x2d\x5c\x70\x4a\xef\x99\xda\xff\x60\xe6\x7f\xed\xe5\x10\x69\x58\x69\x44\x50\x0f\xcb\x81\xda\x7c\xaf\xed\xd3\x52\xc5\x37\x7e\x4f\xef\xd7\xa6\xd2\x0d\xe8\x09\x16\xd6\x9d\x2c\x56\x15\x9e\x2b\x63\x81\x68\x51\x8e\x20\x97\x81\x3f\xe2\x99\x3b\xf2\xa3\x7c\x2b\xa6\x47\xc3\x2a\xde\xd9\xd5\xda\xcf\x1d\x2e\x65\x54\xae\xcc\x8a\x05\x27\x2d\xbc\xb7\x5b\xdf\x40\xb6\x8e\x19\xbb\x92\x0c\x0d\x2e\xd1\x78\x95\x37\x53\x8b\xb1\x80\xb7\x91\x51\xa1\xf0\x21\xf1\x8b\xe9\xaf\x74\xc3\xeb\xcd\x86\x35\x79\x3f\x41\xc9\x7b\x0f\x01\xee\xc8\x02\x0b\xb1\x88\xaa\xbd\xca\xf1\x14\x64\xf5\xe8\xfa\x06\xd6\x32\x3d\x6a\xaf\x9f\x86\x14\x76\x24\x52\xa4\x80\x30\x7c\xa3\x8e\x49\xf1\xfd\xea\x73\xb6\x1f\xbc\xc5\xfd\xdc\x4d\xe2\xe8\x76\xb5\x8f\x43\x58\x43\x86\x68\xb6\x16\x9f\x48\x86\x5f\xcb\x82\x25\x38\x3f\xa1\x2c\x7d\xbf\xc4\x6a\x13\x3a\xa4\x8b\xbe\xf5\x41\x77\x34\x38\xde\x9c\x73\xa4\x6b\x0c\x49\xf7\xaf\x7c\xe5\xf7\x5d\xb3\x87\xf6\x2f\x66\xfe\x17\xa2\x80\x48\xc7\xff\xb7\x3c\x31\x4e\xc7\x73\xd5\x21\x26\x33\x26\xee\xd0\xf1\xcc\x77\xf5\xb9\x8e\xea\x84\xa2\x54\x45\x83\xbd\x60\xd7\x60\x98\xc4\x43\x99\x1c\x58\x94\xe6\x3f\x57\xa8\xf2\xba\xbc\x24\xf1\x05\x04\xdb\x95\xa2\x7a\xb9\x6f\x37\x9d\x1b\xf1\xae\xfc\x46\xd4\x35\x81\x5f\x99\xc7\x1f\x1d\x9c\x2f\x07\x66\xd9\xf4\x17\x02\x0d\x16\x7d\x79\xad\xb0\x64\xe9\xfc\x36\x2f\x37\xc2\xcf\xb6\x9d\xc4\xdf\x95\x38\x0b\xd5\x5d\x77\x65\x2a\xc1\xcb\xd8\x9f\x6a\x92\x89\x90\x59\x58\x14\xf4\xa5\x74\x34\xde\xdf\xae\x22\x90\x97\x01\x3e\xf5\xc5\x45\x4e\x8a\x41\xdc\xe4\xed\x0a\x84\x7f\x5d\xfb\xd7\x26\x0c\x91\x36\x15\xff\x4f\x79\x62\xbd\xf0\x62\x50\xaf\xd3\xad\x5c\xfd\xef\x61\x59\x79\x25\xf1\xd2\x6e\x8d\x66\x3c\xdb\x76\xc5\xdf\x01\x88\x5f\xe2\x0c\x84\xbc\x40\x5d\xf6\x09\x16\xc7\x3c\x9c\x8f\x84\x9e\x88\x6c\x17\x34\x0f\xc8\xd7\x14\x87\xa7\xae\xa8\x36\x54\x0e\x19\xa8\x58\xb4\xcf\x3a\xec\x82\xb6\xc1\xa5\x6b\x88\xa0\x84\x15\xa1\xe1\x23\x14\xad\xc3\xa7\x0b\xf3\x6c\x3d\x05\x0e\x01\x67\x84\x93\xdd\xaf\x04\xcb\x5f\x64\x33\xa3\x0f\x64\xeb\xd4\x31\x92\x8f\xb2\x87\xf3\x06\x74\x54\xd8\x4d\x6c\x7f\xcf\x68\xab\x58\x73\xde\x30\x4e\xe6\xf2\xf3\xc8\x55\xfc\x24\x47\x56\x4d\xf6\xb7\x44\xe3\x5f\xbb\x36\x44\x3a\x00\x13\x0a\x2c\xce\x2b\x6c\xda\x75\x62\x55\x91\x96\x2a\xf5\xe3\x56\x48\x36\xa5\xd5\x2f\x87\x77\xc4\x8a\x6d\x89\x0a\xe4\x8a\x90\xd5\x38\x5b\x26\x21\x07\xe2\x31\xde\xf1\xec\x70\xef\xda\xd8\x62\xfa\xe4\x4f\x8a\x4f\x7d\x98\x63\xab\x60\x74\x70\x3a\x3f\xe9\x05\x0e\x0a\xca\xfc\xd5\x7a\x1c\xd0\x82\x61\xff\x6e\xce\xcf\xf5\x96\xc7\x66\x7d\xa8\x64\xc4\x60\x4f\x81\xb1\x61\x77\x7e\xd8\x74\xc6\x9d\x6e\x30\x9b\x12\x83\xe9\x5c\x66\x07\xac\xf8\x5b\x26\xe9\x5f\xd9\x8f\x8e\xbd\xeb\xd1\x87\xdd\xd9\x2f\xf0\x38\x57\xcc\xf9\x49\xeb\xc2\x5e\x57\x70\x45\xb3\x9d\x6a\x3f\xd7\x7b\x59\x02\xf3\xbf\x03\x19\x10\x49\x76\x1a\xe0\x93\x65\x27\x2c\xcf\x7c\x3c\x60\x6d\xb5\x73\x55\xcd\x9c\x9d\x83\x22\xa2\x97\x31\xea\xf3\x94\x47\xb9\x37\xbc\x93\xc1\xfa\x35\xdb\x73\x0e\xf8\xa5\xbf\x4f\x39\x74\x42\xfb\xa7\x08\xc3\x1b\x3a\x4e\xa5\x82\x60\x4d\xe2\x43\x4f\xa3\x1a\xe1\x8f\x5e\xe4\x4c\xc5\xaf\xdb\xc7\x3f\x1a\x9f\xfc\x4a\xf8\x52\x38\x71\x42\x57\xaa\x5e\x48\xa4\x7e\x83\x03\xff\xb1\x63\xf4\x13\x69\x9a\xae\xab\x31\x12\x53\x61\x17\x71\x19\xe4\x45\x21\x30\xe8\xb7\x3e\xc7\x99\x74\xb3\x04\xbf\xca\x6f\x36\xd0\xa3\x3a\x3b\xdd\x9a\xd3\xed\x67\x33\x24\x92\x57\x0e\xf7\x6f\xbc\xba\x2a\x2c\x3f\x03\xc4\x9e\xc1\x76\x61\x48\x40\xf9\x1b\x88\xf3\xd1\x8b\xaf\xe2\x3b\x24\xca\x7f\x8a\x61\x54\x95\x64\xc8\xb4\x18\x91\xaa\xb7\x83\xc8\x07\xc1\xfa\x2a\x01\x33\xd8\xd7\x4a\xd7\xb6\x58\x70\xd3\xb9\x56\x8a\xfd\xfc\x99\x1f\x79\xb4\x7d\x93\x42\x47\x95\xac\xa8\x86\xeb\x75\x44\xca\xff\x26\x8b\xfe\x05\xb3\x20\xd2\x38\xd0\xd0\xcf\x81\x64\x91\x6e\x00\x63\xb6\x5b\xfc\xad\xd0\x3c\x1b\xd2\xe4\xe3\x73\xd4\x93\xef\x03\x9d\xee\x48\x1b\x01\xcb\x26\x52\xf5\xaf\xac\x14\x9b\xc1\xf4\xed\x75\xf6\x2d\x02\x5c\xe5\x55\xf3\x66\x31\x6e\x3e\xdb\x57\x57\x6a\x3a\x36\x7d\x53\x6d\xc6\xfe\x7d\x89\x76\x94\x12\x07\xd5\x41\x5b\x70\xf1\xbe\x60\x33\x55\xa2\xcd\x2b\x7f\x21\xc2\x31\x9d\x21\x66\xd4\x6a\xd9\xb5\x64\xdc\x71\xaf\xde\xef\xa1\x2d\x86\x8f\xb7\xd4\x0e\x66\x64\x29\xee\x4a\x7a\xd1\x49\xb9\xed\xa9\x4b\xdf\x13\x39\xed\xe5\x1c\x9b\x28\x4d\xd9\x0e\xd3\xca\xcf\xde\xc2\xf6\x7a\xdf\x10\xd1\x81\x42\xfa\x04\x22\xbe\x4c\x3e\x2b\x1c\x84\xe8\x6d\x6f\x66\xcb\xfc\xb3\xe0\x22\xcd\xcd\x02\x97\xcb\x2f\xcd\xab\x75\xed\x92\xe7\xca\x5b\x93\x01\xd3\x75\x71\x52\x55\xac\x77\x89\x83\x39\x6a\x4b\xdd\x2f\x62\x88\x36\xe8\xfa\x3b\x2b\xd4\x29\x64\x2e\xfa\xd6\xb2\xc8\xbe\x1e\xcc\x29\xfd\x2d\x7d\xf9\x27\xd8\x94\x46\x85\x91\xc4\x02\x4a\x5f\xe6\x7e\xc2\x20\x6e\x19\x57\x60\x35\x8a\xe3\x90\xc4\xf3\x11\x73\x4d\x66\xbd\xdf\x84\xaa\xd8\xd3\x59\x3c\x81\xb1\x2b\xc5\x99\x06\x53\x66\xb6\xbf\xad\x1d\xbf\xbf\xe5\x75\x48\xbf\x0e\x23\x4c\xd6\x1a\x60\x65\x47\xff\x65\xa6\xac\x02\xa7\x46\x42\x59\x95\x5e\x9e\xc3\x0e\x52\x5f\x87\xab\x2f\xb1\x18\x0f\x5e\x9c\xa8\x8a\xbb\x38\x64\xba\x12\x10\x3e\xfb\x89\x1a\xda\x40\xfa\x12\x4f\xb3\xb5\x9d\x34\xb1\x38\x1c\x4c\x16\x65\x49\x68\xf9\x0b\x35\xb7\xaf\xbf\x4f\x7e\x15\x26\xd9\x8f\x1f\x64\xdc\xda\x87\xb6\x36\xee\x0d\xfd\x7c\xa1\xde\xf9\xb2\x8d\xaf\x12\x88\x45\x6f\xc5\x9e\x60\x9a\xd2\x6c\x0d\xd8\x0a\x8f\xc4\x69\x0c\x64\xcb\xb5\xbe\x49\x18\xdd\x11\x91\xa3\x93\x91\x95\xc3\x3b\x7a\x57\xe0\x86\x2a\x30\x8d\xdd\xaf\x62\xf7\x53\x98\x00\x74\xf1\x30\xb3\x7d\x2f\xdc\x6a\x9d\x38\x9b\xe3\x1b\xcd\x51\xb4\xda\x24\x72\x2f\xcc\x5c\x90\x96\x38\xd4\xac\x80\xbe\xa9\xd8\xfd\x75\x7e\xd9\x6e\x21\x3c\xa7\x3f\x9e\x68\x98\x0e\x2e\xff\x95\x4b\xa7\xda\xf0\xd5\x8e\xc5\xb8\x8b\x09\x60\x9a\x7c\x24\xee\x5a\x7c\x18\x03\x45\xd1\x3d\xf2\x6d\x91\x8e\xa7\x53\xca\x87\x27\x65\x52\x79\x41\x09\x5e\x84\x51\xb7\x42\xc4\x04\xeb\x6f\x61\xf1\x3f\x21\xb7\x64\x36\x22\xa0\x28\xf8\x7e\xcc\x49\xee\xd0\xba\x03\xab\xef\x79\x34\x3e\x67\xdf\x54\x37\xdb\x57\xbb\xb0\xc7\x18\xdd\x01\xf5\xe0\x92\xa0\x6d\xd6\x03\x80\x15\x74\xc0\x25\xaf\x08\xa3\x8c\xc7\xf3\xf2\x33\x73\x83\xae\x2c\xe6\x56\xdb\x39\x8c\x83\x62\x92\xe7\xa2\xaa\x4f\xc6\x37\x19\xd2\x5a\x1f\xb0\xee\xe4\x63\x1b\x1c\x79\x12\x56\xb6\x8c\x08\xf2\x27\x34\x33\x0b\x9f\xc9\xb8\x6f\x72\x9c\x07\xa5\x2d\xda\x6e\xfb\xc6\x0b\x54\x7e\xe0\x65\xce\x1d\xae\x23\x84\xc4\xe3\xc3\xb8\xaf\x81\xb2\x4a\x04\xab\x62\x29\x5c\x41\x13\xcd\xfe\x14\x0d\x2f\x9d\x33\x8d\xfe\xf2\xe0\x86\xc0\x93\x8a\xfe\x3f\xa0\x3c\x44\x9a\x1d\xea\x3f\x5a\x89\x0b\x66\x82\x69\xae\x02\x96\xb6\xf6\x3f\xd3\x92\x53\x65\x4c\x99\xd8\xd8\x57\x15\xc4\xe5\xee\xef\x67\x9a\x43\x75\x45\xb1\x13\x64\x9e\x3c\xbb\x1a\x3c\xb2\x54\xcf\x09\xdf\x80\x72\xb6\xc0\xbe\xcb\x34\x73\x6a\x39\x89\xa2\x4f\x4a\x3b\x46\x48\x2f\x1e\x1e\xf5\x5f\xc2\x02\xcb\xe1\x51\xed\x33\x0a\xd4\x86\x71\x82\x58\x98\x5f\x1b\xb3\xca\x29\x6a\x1b\x25\xec\x4a\x58\x35\xa6\xfe\x5c\x93\x0d\x78\x30\xb7\xc9\x06\xb7\xa6\xba\x6e\xc9\x15\xbd\x12\xc6\xc6\x3b\xea\x0e\x9d\x51\x8f\x20\xc8\xaf\x8f\xa5\x8f\xd8\xfe\xec\x47\x8c\xad\xa4\x2e\x8a\x76\x5f\xa1\xff\x96\xc3\xff\x0b\xa8\x41\xa4\x02\x10\x09\x80\xdf\x72\x7c\x74\x7a\x67\xdd\xb5\x5b\x7a\x3d\xfa\x5d\x1e\xf4\x5b\x6e\x66\x1e\x4f\x6b\x36\x76\xc8\x21\x57\xd1\xc7\x2b\xda\xd9\x0c\x77\xb0\x55\xd6\x6d\xe6\x99\xef\x67\x6d\x64\x7a\x24\x5d\xe4\x4c\xab\x19\xfa\x3d\x73\x68\xfb\xf0\xe7\x3a\xa8\xdf\x3b\x59\x96\x9c\xa4\x98\x1e\x7e\x83\xd9\x32\x5d\xe7\xab\x39\x1c\x62\x04\x79\x89\x23\x68\x5b\x52\x3c\x49\xea\x36\xac\x37\xd8\x1d\xd5\x43\x8a\x6f\xab\x46\x11\xe2\x71\x49\x81\xb5\xe0\xf2\x89\xa8\xeb\xcf\x39\xec\xfc\xd2\x2e\x5a\xf3\xed\xaf\x70\x21\x4c\x38\x2a\x12\xdf\xc2\x77\x88\x3c\x35\x79\xeb\xe3\xcf\xc7\x80\x3b\xd8\xca\xb6\x72\x12\xda\x92\x75\x9f\x5d\x17\xce\xb0\xae\x8e\x77\x63\x56\x53\xde\xf3\x56\xa1\x7b\x24\x59\xd2\x8f\x63\x6d\x12\x56\xa8\x7f\x8b\x07\xff\x85\x40\x21\xd2\xa8\x14\x98\xe2\x00\xb2\x2c\xd2\xa3\x6e\x99\x13\xaa\xa7\x2b\x4c\xcc\x4f\x37\x2b\xa2\x4a\xad\xa6\x58\xd5\x3f\xa6\xc9\xfb\xb2\x3b\x1d\xe3\xbd\x2a\xcf\x06\xde\x7c\x44\x5d\x0f\x6e\xf8\x17\x9c\x71\xa0\x66\xf3\x78\x22\x5a\x57\xb9\x04\x6c\x31\x17\x99\xc2\xf4\x15\x1d\x98\x2b\xeb\x62\x3a\x74\x81\x4d\x12\x7a\x49\xb7\x67\x9a\xf4\x43\x3f\x3f\xbe\x1c\xbb\x28\xf6\x45\xc4\x4c\xae\x5c\xbd\xf6\x99\x95\x7d\x61\x1e\x61\x29\x4e\xd7\x85\x19\x04\x98\xda\x7f\x50\x2e\xd6\x6b\xa5\xee\xd0\xa4\x1c\xdf\x9a\xbe\x79\x9f\x54\x5d\x9d\x7f\x4f\xba\x58\xf0\xfe\xec\x63\xb1\x17\x61\x45\x2e\x58\xf7\xfa\xc6\xa4\x5f\x03\xb6\xc1\x2b\x35\x0e\xb6\xf2\x06\x69\x1e\xd7\x22\xbe\x04\x0e\x43\xff\x30\xf2\x48\xde\x7b\xec\xe1\x97\x61\x93\xf3\xe5\xfd\xff\xa5\xe9\x66\xe6\x18\x20\x09\x87\x4e\x25\xbd\x0b\x35\x9d\x1f\x31\xf6\x10\xd6\x41\x40\x87\x3e\x32\x11\xc8\x0d\xcf\xb4\x8a\x55\xce\xb7\xcb\x80\x48\x1f\xb7\x1d\x3f\x26\x93\x02\xad\xe3\x4e\xeb\xbc\x48\x27\x92\x57\x06\x27\x18\xf0\x6c\x8c\xc5\x65\x3f\x25\x60\x3f\x5b\xeb\x3d\x84\xd5\x79\x55\xef\xf4\x66\x0a\x17\x28\x99\x2e\xdb\x47\x2d\x84\xee\xe7\x66\xa7\x12\x0e\xcf\xd7\xaa\xdf\x4e\xab\x9a\x7b\xd1\x72\xc5\xf3\x66\x99\x2d\xed\x51\x8b\x62\xb9\x53\xe1\xc9\x72\xc1\x6a\x5a\x9f\xfb\x66\xbb\x20\xad\xb0\xd3\x7b\xb0\xae\xbc\xe7\x52\xd1\xdc\xd2\x07\x3d\x39\x5d\x8b\x98\x92\xd2\x77\xfb\x2b\x58\xb6\xc6\x8a\x2e\xea\x55\x2d\xc0\xad\x4c\x54\x59\xb8\xc1\x9e\x53\xa1\xea\x67\xfc\x33\xb4\x41\xe2\x1e\xb1\xbb\xbd\xc6\xdf\x3a\xa1\x95\x0c\x08\x1a\xa2\xde\x07\x99\xb8\xd0\x10\x72\xec\xb0\x7d\xd9\x4d\xf1\xfb\x15\x19\xad\xce\x6a\x06\x3c\x38\x4b\xa8\x38\x65\xa2\x63\xc9\x41\xe0\x8c\x57\x26\x8b\x2c\xb0\xdb\x46\x8e\x60\xf0\x36\x74\x6e\x2b\x62\x33\x94\x06\x43\x7f\x07\xa5\x44\xbf\x5c\xa7\x63\x8e\x65\xbf\x53\xb8\x02\x38\x38\x0a\x1c\x85\xbf\xfb\xbe\xff\x26\xdc\xb5\x03\x25\xeb\x18\xde\x22\x05\xb6\x79\xfe\x1a\x7b\xb7\xf7\xb8\xc1\x0e\x13\x63\x25\xaf\x2d\xf2\x69\x50\x13\x49\x5f\x42\xf9\x2e\x9a\x67\x3a\xb9\xc5\x6d\xec\xc9\x66\x13\x38\x2b\xe1\xc6\xf6\xa4\xe7\xb2\xa6\xea\xd3\x21\xe3\x0d\x8a\x80\x90\xf3\x8d\xdb\x9e\xd1\x47\xa6\x9f\x75\xaf\x0a\x8b\x99\x3d\x62\x1c\x93\x1b\xeb\x5d\xb6\x2f\x6c\x39\x74\xb3\xd8\x0a\xc3\xc4\x1b\x95\xb9\x00\x9f\x18\xf3\x3e\x56\xfb\x9b\xa7\x96\x43\xf4\xf6\x91\xad\x3a\x1f\x2a\xcd\x75\xe2\x67\x5f\xd2\x51\xe6\xe1\x36\x17\x6c\x9c\x56\xe0\x14\x00\x65\x13\x96\xbb\xf3\x76\x75\xaa\x59\x50\x1a\x69\xbd\xc2\x2d\x81\x1e\x6a\xca\x58\xb0\xc8\x33\xb1\x33\x72\xcc\x53\x0a\x3f\x82\xeb\x40\xd5\x00\xd1\xdf\x30\x8d\x34\x03\x12\x13\xc2\x71\xcc\x30\xa6\x5f\xb8\x4f\x5c\x16\x0c\xe9\x37\xd4\x3d\xd7\x6f\x63\x58\x89\x9e\xed\x4b\xfe\x47\x6f\xc6\x30\xd8\xa9\xbc\xd2\x73\xb6\xf1\xea\x9a\x60\x1a\x57\x82\x4b\xea\xa7\x91\xb6\x81\x65\xee\x30\xec\x8e\x3f\xe5\x76\x09\xf1\x49\xd7\xd3\x54\x89\x4d\x6a\xdf\xb9\x36\x1f\x0b\xba\xe1\xbb\x0b\xd5\xb5\xfe\x10\x32\xbe\x21\xd7\xeb\x22\x30\xb6\xec\xb2\x22\x94\xf4\x40\x63\x05\xe8\x8f\x93\xd9\x35\x9d\xdd\xec\x52\xa2\xd3\xf7\x17\x7e\xb3\x24\x94\xb8\xc3\xb5\xfe\x5f\xcb\x68\x72\xec\x4e\xb4\x6c\xb7\x8e\x72\xf2\xca\x41\x55\xaa\x49\x39\x96\xda\x9c\xc7\x5b\xf4\x0e\x28\x35\x94\xca\x5f\x93\x77\xcd\x0c\xb3\xc1\x35\x29\x57\x7c\x3a\xc9\x50\xbf\x6d\x37\x4f\x01\x4e\x65\xc0\xb1\x90\x95\x03\x37\x85\x25\x23\x97\xe6\xc3\x35\xdb\x87\x9c\x42\x47\x38\x5c\xcb\x06\x13\x5e\x23\xd1\x68\x4b\xd2\x95\x7d\x70\x50\xf1\x26\x65\x0b\x4f\xaf\xb8\x4d\x3e\xf3\x37\xa5\x32\xe6\x89\xb1\xce\xb2\xbe\xca\x82\xfb\x66\xde\x64\xf4\x66\x8e\x14\xfb\x2f\x9e\x06\x35\xcb\x87\xfa\x85\xf4\x27\xab\xf5\xe8\x0a\x0d\xe7\x15\x74\x4b\xab\x36\x74\x87\xf7\x15\xa7\xdd\xc1\x94\x3f\xde\x61\x5d\x46\xe1\x7f\x9a\xb1\xb6\x24\x08\x79\x1e\x72\x98\xc4\x0b\xfa\x3b\xbd\x40\xfa\xff\x18\x7b\xcb\xb0\x2e\x9f\xa0\x6d\x98\xee\x2e\x01\xe9\x06\x91\x10\xa4\x9b\x1f\x21\x21\x25\xd2\x8d\xa4\x34\xd2\xdd\x9d\xd2\x28\xdd\x21\x2d\xdd\x08\x48\x97\xb4\x74\x77\x83\xd4\x7b\xbc\xcf\xf3\xdc\xb2\xff\x4f\xde\xdf\xe7\xd8\x9d\x6b\xe3\x9a\x99\x73\xcf\x99\x71\x3b\x7a\x8c\x93\x1f\x25\x35\xaa\x16\xc6\x6e\x2f\x39\x2f\x3c\xb4\x38\xa5\x07\x44\x35\x3f\x24\x71\x86\xd8\xbf\x5b\x4e\xc4\xc1\x65\x62\xbc\x89\x96\x1a\x5e\xf7\xdc\xbc\x52\xdb\x81\x3d\xfa\xea\xf7\xf3\x6c\x28\x95\x0c\x10\x15\x46\x1f\xcc\x7d\xcd\x43\x12\x10\x1d\x50\x2d\x66\xfc\x65\x17\x5d\x89\x22\xe8\xdb\xfb\x6d\xd9\xfa\xe7\x1a\xab\x11\xb9\xbf\x3e\x3b\x03\xa2\xee\x55\xc2\x62\xae\x70\x82\x8b\xd8\x92\x2f\x3d\xcc\x8e\x94\x34\xc6\x73\x7e\x0a\x8a\x8e\x68\x10\x47\x64\x4e\x74\xd0\xe3\x57\x14\x3e\x1d\xea\x2f\x74\xbc\x51\xaa\x35\xdc\xee\x8e\xd1\x79\x5c\xdc\xbe\x56\xa2\xed\xed\xb4\xe7\x84\xc1\x3d\x06\x9b\x9a\x81\x38\x9b\x61\xcf\xb9\x9f\x16\xa0\x38\x8c\xfc\x25\x87\xd7\x68\x38\x5b\xee\x34\x22\x63\x5d\xe8\x79\x0f\x83\xce\xd1\xab\x68\xcd\x61\x52\xf6\x0a\x12\x6d\x38\x1a\xa0\x85\xc3\x4f\xf7\x29\x43\xfe\xdb\x8f\x91\x6d\x85\x9b\x41\x95\x44\xa7\xee\xd4\xe5\x6f\x09\xaa\xa3\x5b\x90\xb6\xee\xbe\x3b\x29\x52\xb7\xd8\x80\x4b\x95\x1f\xd1\xcd\xa4\xf4\x89\x62\x68\x46\x5a\x91\x5b\x41\x8d\xd7\x6f\x26\xcc\x98\x79\x59\x8f\xed\x97\x6c\x6a\x56\x9c\xa4\x05\xe4\xe2\x69\xab\x04\x05\xe8\x12\xc6\xcc\x5f\x66\x12\xe7\x7d\xf0\x4c\x72\x68\x3a\xfe\x69\xa4\x75\xa7\x21\xf3\x02\xb2\x84\x23\x36\x66\x66\x65\x64\xf9\x34\xff\x38\x3b\x9b\x92\x0a\xf3\x73\x6e\x73\xf1\x1a\x3a\x33\x98\x86\xae\x20\xe7\xe7\x45\x85\xf2\xbe\xd8\x3f\xa1\x06\x61\xfa\xbe\x99\x31\x02\xfb\xaf\x1b\x9c\xe0\x56\x90\xba\xfa\xa1\x5d\x2b\x77\xb0\x82\xeb\x55\xb6\x37\x4e\x58\x7e\x41\x52\xf3\xb9\xf1\x66\x7f\x29\xb5\x94\x2e\x3c\x50\x42\x8b\xea\x43\x6d\x1a\xa4\x99\x0f\xbe\x3f\x59\x53\x25\x8f\x97\x63\x3f\x0c\xaa\xc9\xf2\xab\x64\x9f\xfb\xf1\x11\x69\x03\xbe\x40\x2d\x30\xa8\x0f\xc7\x2a\xd4\x6f\x1a\x24\xbf\xd9\x0f\xd6\xef\x76\x29\xb1\x23\xec\x36\xd9\x70\xad\xe4\xbf\x3f\xc2\xaf\x66\xf8\x43\x7c\x0c\x00\x3e\x74\x88\xfd\xe7\x50\x4d\xc9\x2a\xd3\x0e\xbe\xcb\xaa\x64\x7e\x7e\x76\xb4\x1c\x08\x33\x9d\x39\xf2\x59\x53\x18\xb4\xf1\xf0\x68\x19\xd8\x4c\x46\x94\xcb\x55\xe6\xe3\xf5\x2f\x1a\xa4\x9d\xed\x54\xb7\x88\x7b\xe8\x54\xb6\x77\xbc\x22\x1e\x0b\x6e\xde\xc9\x58\xd5\x32\xb4\xc9\x20\x0e\xa1\x43\x13\x0a\xc7\xe6\xbc\x17\x97\x1d\xe9\xe3\x47\x1d\x07\xd7\x98\x18\x2e\xa8\xa5\xd3\x9f\x5e\x3b\x3d\xef\x84\x4d\x59\x70\x06\xb4\x05\x09\xa0\x5f\xba\x81\xba\x9d\xaf\x61\x33\x9d\x53\x0c\xb9\xa8\x24\xb3\xd3\x8f\x31\xc3\x62\x7e\x45\xf7\x2b\x1f\xef\x03\x35\x7a\x31\x3c\xb8\x53\xba\x0e\x72\xc4\xca\x49\x1d\x9d\x5c\x8d\x14\x79\x9f\xdc\xa5\x97\xd4\xa3\xf3\x21\x7b\xc5\x7e\xed\xfa\x08\xd8\x73\x04\x8a\x0f\x9e\x4f\x67\x8a\xe3\x9b\x4b\x59\x86\x08\x92\xd3\x4c\xdc\xc8\xb7\xdc\xef\x18\x45\x23\x1f\x5d\x25\x6e\x5e\xd5\xec\x49\xb9\xa1\xc5\x2f\x4d\x2e\x9f\x3c\xcd\x2f\x82\x5b\xcd\x66\xbd\x92\x0d\xf5\x8b\xa6\x28\xff\xfb\x4d\x62\x74\x0d\xad\x05\x0b\x15\xd1\x70\xd3\x33\x2c\x6c\x8a\xd3\xb3\xf7\x40\x2f\xe4\x7a\x3e\x86\xc4\xf7\x49\xe7\xf0\xab\x9b\x27\x0f\x9f\x9d\x64\x60\x8d\x6b\x8e\x37\xeb\xb5\xe0\xbd\x18\x15\x7a\x42\x0c\xf4\x56\x47\x41\x78\x93\x88\x6e\xdc\xc6\xfd\xd7\x5c\x66\xbf\x36\xbc\x67\xc6\x4e\x85\xe0\x59\x7c\x06\x52\xf3\xdd\x9d\x9b\xf3\xc1\x15\xa5\xda\x62\x37\x00\xf0\xad\x3d\x73\x75\x15\x69\xe1\xe9\x36\x41\xf6\x48\xbd\x8d\x8f\x91\x74\x6f\xa6\x23\x17\x17\x9c\x61\xbe\x0c\x0f\x7f\xfe\xd6\x1c\x28\x1f\x37\x44\xaa\x65\x9a\xa9\x1a\xae\x9f\xcb\x9b\xd5\xfd\xc2\x41\x87\x2f\x3f\x6f\x0f\x29\xd1\xdc\x54\xf6\x96\x92\xb2\xd5\x34\xdf\xeb\x00\xe4\x77\xb5\x28\x2e\xd1\x36\xde\xcc\xff\x2a\xf0\x51\xaa\xf1\x39\x9b\x5d\x6c\x50\xb2\x61\x33\x53\xc8\xe1\x2c\x4d\x81\x30\x8f\x9d\x00\xe9\xfc\x72\x3c\xb6\x46\x16\xf2\x2e\xe1\x84\xc3\x7b\xa8\x94\x9d\x62\x65\x7d\x5a\x42\x3f\xe8\xf3\x09\x82\xe3\x67\xee\xbe\x64\x84\x24\x94\x82\xcd\x2e\x5e\x74\x98\x09\xcb\xa6\x8a\xfc\xd6\xeb\xac\x29\x96\xdc\x68\x14\xe5\x57\xd9\x16\x19\x81\x3f\x17\xd8\x7f\x33\x82\xc1\x8e\x45\x09\x3c\x6e\x28\x5c\x98\xeb\x56\x9a\x66\xa8\x37\x79\xe2\x18\x78\xdc\x9e\x9e\xc1\x21\x88\x7a\x93\xb3\x2c\x32\xcd\x22\xfd\x2c\x09\xb8\x06\x2a\x37\x8e\x06\x5b\x2e\x46\x5c\x9a\x0b\x67\xd8\x69\x70\x60\xd6\xee\x37\x16\x9c\x8f\x71\xdd\x59\xd6\xdf\xec\x4d\x91\x77\x12\x16\x0c\x68\x81\xa5\x13\xdf\x0b\xc7\x4d\x16\x72\x54\x7d\x32\x46\x55\x97\x81\x7d\xdd\x63\xc7\x44\xde\x00\x5b\x4c\xa1\xf9\x42\x01\x1b\x57\x63\x36\x16\xe8\x0a\x72\xb6\xba\x2c\x75\xff\x71\x66\xcb\xab\x4a\xc0\xe8\x8b\xe9\x59\xf7\x96\x1f\x69\xef\x97\x84\xaa\xca\xee\xb8\x55\x8e\x6f\x52\xd2\xc6\xe0\x89\x9a\x7f\xb9\x4f\x13\x5a\x43\x47\xbb\xe8\x27\x85\x1a\x00\xa3\x98\xa4\x83\x60\xcf\xbc\x46\x6f\x90\x60\x6b\xa1\xa3\x73\x24\x8b\xf2\xf3\x69\x7e\xe6\xcc\x01\x6b\x35\xbe\xef\x6b\x0d\xd9\x85\xed\xf9\x58\xb4\x70\xad\x1c\x23\xbe\xa2\x18\x7f\x0e\x5c\xb0\x98\x83\x24\x9f\x8b\x03\x8f\x50\x96\xb5\x79\xed\x7e\x11\x9b\xb1\x34\x42\x8f\x29\x7e\xc1\x6f\x1c\x62\x5a\x07\xd2\x19\x68\x3b\xbe\x48\xde\xe6\x7b\xc9\x8f\x44\x08\xfd\xc5\x94\xfe\x69\xcd\x20\x62\x6c\x50\x20\xa6\x44\x9e\xa7\xc8\xfe\x12\xa2\xe5\x49\x08\x5b\x9c\xbb\x99\xf0\x00\xf5\x43\xdd\xe0\x3c\x52\x2d\xa6\x29\xa8\x4f\x2c\xe2\xf3\x07\x6e\x30\x79\x70\x59\x65\xb1\x5e\x47\xaa\xff\x8d\x5f\xd7\xf3\xae\xc1\x92\x4a\xe6\x0a\x58\x6d\x5d\xdc\x11\x27\x1f\x65\x91\x32\x74\xbd\xf4\x2a\x90\x79\x42\x2e\xe4\x65\xe9\x1d\x22\x06\x8b\xd1\x73\x60\x28\x69\xfa\x20\x18\xb6\x91\xf7\x91\xca\xa9\x1b\x0d\xbf\x31\xce\xa9\xcc\xdb\x96\x19\x8c\x5e\x0e\xf9\x98\x3f\x29\xfd\x9e\xde\xe4\x6a\x13\x4e\xd4\xa3\x22\xd4\xdb\x38\xa3\xc0\x9c\x29\x16\x0f\x68\xc8\x21\x95\xb5\x59\x7a\xca\x43\xfb\x97\xf9\xf1\x83\x88\x20\x41\x85\x80\xaf\xe7\x48\x1f\x0f\x4f\xbd\x30\xdf\x4b\xf5\x2d\xb4\xe9\x19\x2e\xab\xcf\xcf\x62\xa0\x07\x3b\xec\x3c\x7c\xe1\x47\x74\x46\x09\x23\xb1\x07\x94\x28\x8c\xb0\x4e\x93\xb5\x23\xe4\xd2\xee\xab\xa1\x7f\xe6\x58\xd7\x76\xfd\xb0\x14\xd1\x6a\x77\xd0\x6d\xed\x5e\x25\x30\x9e\xd6\x0c\x06\xbc\x9b\xbf\xae\xf7\xe3\xed\xca\xb4\x0e\x54\xec\xf0\x7d\xd5\x1b\x3e\xf9\xa8\x2a\xb4\xb9\xb3\xe9\x37\x9f\xa7\x8e\xe5\xfc\x5c\xde\x7e\x05\x88\xea\xc3\x8d\xf5\xa9\xf7\x44\x8c\x47\xd3\xe2\xe5\xe2\xbe\x56\x45\x8d\xf4\xd9\x54\x0f\x68\x2e\x7a\x13\x7e\xad\xcd\xa8\xd0\x61\xa8\xf1\x37\xe0\xfc\x97\xb9\xf4\x13\xa3\x02\x03\xce\xd0\xf4\x8c\x94\x72\xc2\x43\xa6\xca\x13\x4a\x07\x71\xbb\x8c\xb5\x3d\xce\x8f\xb6\xb8\xea\x5b\x18\xfa\x64\x2b\x78\x2c\xcf\x7c\x00\x47\xe4\x33\x9b\x26\x61\xf9\x56\x9d\x7f\xc7\x63\x1d\xad\x4b\xdc\x36\x2e\x24\xa3\xe1\x20\xae\xfa\x26\x51\x65\x44\xe9\x1b\xfd\x9b\x59\x30\x49\x29\x42\xad\xb5\x9d\xe0\xa6\x36\xd8\x43\xa3\xed\x42\xce\xa0\xa2\x2c\x7b\x0d\x71\xfe\xd2\x4d\xc7\xf6\xe1\x66\xb1\xa8\xb3\x25\xa9\x0d\x10\x25\xc6\x8d\x6a\x15\xf7\x16\xd1\xff\xa8\xfd\x5c\x4a\x6e\xa3\x23\xa8\xc4\xa8\x01\x09\xfa\x55\xce\x3d\x87\x9b\x63\x68\x70\xa7\x5c\xce\x5f\x82\xc8\xbf\x6c\xbb\x9f\x78\xa7\x0f\x1b\x00\xff\x6c\x96\x68\x5c\xa4\x61\xa0\x65\x85\xde\x1c\x37\xd7\xeb\xaa\x68\x4c\xae\x76\x8e\xcc\xc4\x63\x30\x4a\x7d\xd7\xb5\xf9\xb6\x3c\x56\x00\xe8\x60\x81\x6a\x69\x4d\xbc\xf7\x15\xee\x74\x6a\x85\x26\x38\x2a\x5d\xff\xf3\x25\x77\x63\x68\x13\x11\x41\x15\xec\x84\x26\x86\x67\xf9\x73\x50\x5d\xf2\x5a\xd5\x50\xff\xf9\x78\x54\xa4\x6b\xc1\xcd\xe6\x63\x15\x7b\x91\xcb\x6a\x87\x69\x7e\x1e\x78\x6c\x6d\xfb\x91\x5e\x7c\xd0\x1c\x7d\xad\x9b\xe6\x22\x09\xba\x6f\xdf\xfb\xbd\x4b\x64\x17\x8d\xc8\x69\x30\xf2\x26\xee\xa2\x2d\x8c\x55\x9f\x61\x91\xe5\xbd\x83\x0e\x48\xf7\xf7\x69\xff\x8d\x48\x71\xb3\xc8\xe4\x66\x7a\x6d\x27\x9d\x49\xcc\xa1\x1c\x3a\xab\x50\x2e\x58\x95\x2b\xe6\x26\xef\x94\xc9\x29\x0d\x16\x8f\xff\xca\x7c\x19\x86\xc2\xb1\x5f\x87\xda\xaa\x27\x2c\xa5\xfb\x06\x3d\x2b\x77\x93\xb6\xa4\xf3\xcd\x97\x5a\xd5\xe7\xb7\x6f\xe0\xe5\xd3\xff\x1e\xf1\x7f\x39\x38\x7e\x10\x18\x58\x38\xf0\xf6\x16\x66\xa2\xaa\xd0\xed\x87\xbc\x3c\x3f\xb5\xdd\x5b\x7a\xfb\xdb\x27\x5c\xea\x22\x2b\x25\x6b\xed\xf9\x04\x99\xdf\x5b\xee\xba\x7d\x90\x20\x12\xf3\x3a\x59\x87\x9e\xbd\xa8\xf9\xec\x85\xd5\x76\x86\xcc\x84\xab\x60\x5e\x78\x3e\xd9\x8c\x96\xef\xb3\x87\x66\x94\xf9\xab\x6d\x90\x9b\xf0\xf3\xfd\x09\x07\x46\x41\xb9\x0b\xbc\x0a\x8b\x8c\x31\xca\x7b\x71\xb4\xef\x85\xd6\xed\xfb\x0f\x52\x3f\x53\x7c\x30\xc6\xc3\xed\xc0\x96\x0e\x61\xf9\xa3\x09\x0e\xfd\xb4\xb7\xd8\x92\xf5\x64\xe7\xa3\x5a\xd2\x96\xe8\x0c\xb0\x21\x52\x34\x5e\xb8\x82\x94\x13\x1e\x74\x46\xc5\x7f\xa1\xc0\x7f\x7a\x44\x10\xe8\xf6\x18\x2c\xe0\x2c\x50\x8d\x38\xf2\xe1\x7c\xe0\xd0\x17\x5c\x96\x13\x61\x42\x93\x42\x5c\x95\x7d\x71\xe6\xea\x0d\xfb\x7b\xe5\xa1\x38\x0f\x36\xd4\x16\x0c\x39\xf5\xe3\xaa\x2e\x43\x38\xd4\x19\xd5\x6a\xf8\x70\xd3\x5f\x77\xef\x30\x52\x51\xdf\x84\xc5\x7a\x1d\x84\x5f\x50\x0d\xb6\xe4\x37\xa0\x80\x15\x09\x7e\xcf\x84\xbe\x7d\x1b\x61\x77\x4f\xd7\x7f\x26\x45\xa4\x24\xb5\xa3\xc9\xd9\xb7\xe9\xcc\x9b\x70\x2d\xb4\x2c\x14\x71\x79\x08\xf2\xc6\x9e\x27\x4d\xe1\x0e\xe8\x17\xfb\x71\xeb\x5d\xa4\xf5\xec\xa1\x6a\x70\xe0\x35\x1a\x50\xe8\x90\x9b\xbd\xd6\x88\x9f\xd8\x57\xd9\xd5\x07\x19\x40\xbf\x51\x92\xef\x8f\xb4\x3b\xa5\x5c\x93\xb5\xa3\x10\x8f\x8d\xc9\x89\x62\x37\x4a\x25\xe1\x88\xe2\x38\xa9\x39\x87\xd1\x45\xc0\xb6\xb1\x62\xfb\xca\x58\xa9\x5b\x08\x99\x75\x70\xb5\x55\xf1\xdf\xb5\x3f\x78\x3b\x45\xe0\x0b\xae\xec\xf2\xc8\xcb\x9e\x74\xc6\x9a\xd0\x26\xff\x3d\x0b\xff\x72\x4c\xfc\x20\x30\x78\x3e\xe0\x59\x58\xae\x62\xfb\x58\xdd\xe1\x21\xb9\x83\xb9\x4f\x12\xaf\xf6\x49\x9f\x16\x91\x9f\xca\x76\x70\xfc\xa1\x9c\xde\x65\x60\xa9\xd6\x10\x2c\xa4\x62\x46\x9e\x83\xf6\xed\x54\xd2\x82\xdf\xa7\x5b\x35\x5b\xb8\x80\xa1\x7a\xcc\xef\x28\x90\x22\x8d\x54\x77\x79\x73\xc4\x9a\x51\x2a\x0e\xfc\x3d\x17\x9d\xb8\x5c\x2b\xef\x91\xa4\xeb\x0d\x5d\x18\x1b\x72\x8a\x0e\x84\x51\x8f\xd6\x28\xf5\x35\xa2\x47\x74\x28\x7c\x58\xe4\x03\x9b\x49\xcb\x7e\x42\x4e\x4b\x46\xf0\x27\x7f\xaf\x1f\x43\x6c\xa8\xf0\xc3\xaa\x88\x37\x9e\x5f\xe4\x72\x22\x1b\x77\x52\x38\x3d\x0f\x5d\xfa\xc7\x5f\xba\xf4\x3f\x2d\xa4\x38\x16\x1c\x27\x00\x54\xc0\x50\x90\x0e\x0b\x6a\x24\x5c\xdc\x9a\x3f\x68\x50\x21\xce\xc2\x29\xc7\xb8\x7d\x43\xf6\x33\x81\xba\x99\x60\x35\xbe\x44\x4f\x00\x69\x6e\xf6\x02\x8a\x2c\x2f\x92\xce\xbe\x37\xe8\x94\x58\x3d\xd2\x66\x7c\x54\x52\x5e\xd7\x4d\x9a\x39\x31\x7f\x3f\x2f\x28\xf2\xa7\x0c\x16\x4c\x4d\x8d\xd2\x7e\x9b\x5d\x63\x8a\xb8\xee\xe7\x72\xfe\xc6\x05\x76\x3d\x6d\x01\x7e\x47\x35\x3e\x22\xab\x48\xf0\x33\x99\xfa\xe7\xeb\x02\x12\x30\x21\xf2\xb4\x3c\x03\x7f\x30\x59\x66\x85\x12\xdf\x96\xd9\xf2\xd9\x4c\x5f\x33\xbc\xc3\x67\x03\xe6\x4b\x64\xc7\xe0\x10\xdf\xe2\x21\x10\x2e\x4a\x7b\x4f\x5b\x97\xed\xb3\x15\xc5\xc0\x3f\x49\x6a\xd3\x89\x94\x78\x6d\xc7\x49\xd2\x2b\xe1\xe3\x9d\xae\x26\xac\xfb\x3d\x4c\x7c\xeb\xd2\xf7\xff\x01\x15\xdd\xac\xc4\xca\xa7\xa1\xb3\x76\x93\xb0\x13\x18\xc5\x4c\xb5\x2f\x8a\xaf\x3d\x93\xcf\xf6\xde\x45\xbe\x12\x51\x96\x43\xfd\xb0\x95\xe7\x07\xb9\x7d\x7c\x7c\x4c\x26\x07\x80\x0a\x87\x80\x06\x23\x42\x1b\x71\x8f\x78\x19\x42\x5c\x22\x9d\xe1\x74\x7d\x94\xf5\x86\x59\x5d\x6c\x6b\x39\xbd\xa0\xad\x15\x12\x00\x8d\xeb\xf4\x33\x0d\xd6\x7d\x45\x40\x51\xfa\xad\x53\xfd\x1a\xaa\xf1\xe8\x99\x89\xa7\x62\x4c\xca\xce\x9b\x8e\x8e\x07\x2c\x15\xe4\xe7\xcd\x40\x50\xe3\x33\x4a\x5a\x60\x29\x0f\xd3\xe2\xd4\xe1\x78\xaf\x2d\x95\xd1\x5b\xfd\x1e\x27\x3f\xdd\x7b\xc4\xd8\x2f\xfb\x0f\xb7\x2c\x2d\x04\x74\x6c\xb6\xd1\xdf\xee\xcc\xe4\x1a\xf3\xbd\x44\x1c\x09\x6d\xf7\x1e\x43\x5b\x71\x9d\x46\xd7\xf7\xbc\x6b\x28\x1a\xff\x28\x36\x22\x6e\x7a\xfb\xb4\x08\x4a\x17\x50\xce\x0a\xf2\x2e\x7a\xf1\x9e\x93\x13\xe4\xf9\x81\x57\x0e\x3a\x69\xa9\x4d\xce\xfe\x5c\x30\x22\x22\xc1\x5a\x5a\xa8\x87\x20\x28\xdc\x3b\xba\x60\x4e\x7d\xe8\x05\xbf\xb4\x86\x21\x25\xd2\x4d\xa7\x12\xb7\x16\xf5\xd5\x3c\x93\x32\xfe\xc4\x82\xa4\x3a\x59\x01\xc8\x2f\xfb\x75\xf7\xeb\xeb\xcc\xf9\x23\xdf\x6f\xa8\x5b\x87\x99\x8b\xc6\x8b\x09\x97\x1f\xbc\x66\x12\xa3\x56\x88\x93\xcf\x3d\xcb\x5a\xa9\xcc\x41\x55\xd9\x08\x27\xf6\xf3\xaa\x52\x7b\xe2\x35\xab\x21\xa7\xee\xfc\xd3\x8e\x66\xbc\x18\xc7\xd8\xed\x7e\x5f\x11\x0a\x57\x62\x24\x4f\x22\x80\x3a\xe7\x25\xed\x03\xb2\x9a\x35\x42\x1a\xcf\x7b\x9a\xc5\xb3\x5f\x37\x59\x3e\x2b\x8c\x7c\x65\xa4\x94\x64\x53\xdd\xff\x99\x44\x26\x9f\xe6\x69\xfe\x38\x45\x72\x24\x3e\x58\xec\x81\x94\x89\x6a\xdf\x4f\x44\xaa\x56\x79\xdd\x13\x84\xd5\x31\x8e\x0f\xde\x01\x9f\x35\x09\x7a\x58\xc1\xfc\x36\x7a\x7a\xc8\x4c\x40\xc0\xf5\x18\xf7\x04\x56\xe4\x12\x6e\x55\x81\x0a\x2e\x94\xf3\xf4\xb9\xbf\x4a\x11\xea\x9a\xc8\x58\x4b\x3f\xc0\x84\x30\x51\x42\xd4\x66\xad\x23\xd3\x7c\x94\x8e\x16\x98\x0b\x0c\xd3\xd1\xf4\xb2\xf8\x42\x2c\xba\x62\xd9\x35\xd8\xf1\x88\x65\x93\x07\x24\xe2\x0d\x39\x6b\x2d\xb8\x93\x8f\x72\x6f\x7d\xa5\x66\x1a\x5b\xe9\x49\x84\x45\x08\x8b\xf9\x66\x24\x7f\xcb\x61\x0b\x43\x95\x44\x55\x02\x56\xba\x46\x43\x39\xaa\xa9\x8b\x85\x31\xc7\x20\x16\x0d\xb6\x1a\x18\x0a\x2d\x6e\xad\x71\x76\x33\x96\xcd\xfb\x96\x39\x74\x2f\x96\x51\x0c\x80\x8b\x98\x5a\x3a\x9c\x36\x43\x99\x2a\x5c\x26\x5f\xdc\xd4\x5d\x24\x4a\x4a\x9a\x23\x4e\x58\x9b\xce\x65\x76\x03\x61\xa9\x95\x9c\x4e\xc0\x17\x45\xb9\x05\x79\x35\xbe\x2c\xec\x69\xdc\xbe\xa5\x51\xd2\x9a\x97\x2a\x44\x85\x8a\x94\xf0\x01\x8f\x16\x1e\x0a\xd7\x68\x1d\xe9\xaa\x41\x80\x68\x91\x88\x57\x83\xe0\x4d\xbe\x40\xf3\xec\x5c\xef\xc6\xde\xa4\xe5\xaf\xcc\xf4\x6b\xae\x21\x83\xc9\xaa\x88\xfb\x52\x9d\x0a\x38\x58\x40\x55\xf4\x9e\x42\x3f\x0e\xa4\x7d\x2a\x63\xbd\x51\x03\xda\xf0\xd8\x34\x3c\xfe\x5a\x84\x1b\x7e\x26\x8a\xfc\x4e\x94\x38\x75\xa4\x19\x80\x0c\x80\x75\x32\xec\xe7\x0e\x9b\xc1\xe3\x14\x3d\xda\x99\xa7\x87\xa3\xc2\xba\x23\x6d\x38\xeb\x66\x6e\x42\xc0\xef\x15\xb3\x28\x33\x50\x0d\xce\x1f\x77\xfe\x0b\xaf\xcc\x8f\x48\x46\x9a\x5c\x44\x7a\x72\xd8\x55\xff\xa7\xc7\xb3\xae\xb9\xc9\x8f\x6d\x1e\x7d\x6a\xcb\x27\x32\x91\xe0\x49\x49\xbc\xd4\x6f\xca\xcd\xee\x51\x1f\xc6\x43\xa0\xe7\xa3\xb8\x7e\x4d\x40\x78\x11\x8e\xd1\xee\xf3\xf6\x4e\xa0\x56\xaa\xf8\xad\xbb\xd3\xd3\xa6\x32\x67\x08\x35\xd5\x6d\x8f\x57\x3d\x5f\xad\x9f\xa5\xd5\xe7\xba\x4a\x53\xab\x10\x82\x6d\xa6\x22\xa2\xae\xc2\xd9\x42\x72\xef\xd9\x7b\x52\x55\xe6\xec\xb3\x66\xbb\x34\x7b\xb8\x30\x3c\x21\x27\xe4\xe5\x3e\xc5\x84\x50\x10\x49\x57\xd7\x07\x9f\x09\x91\x3e\x7c\x54\x4a\x2f\x00\x7d\xe8\xaf\x8b\xd0\xaf\x64\x0d\x2a\x46\x2a\xbd\x43\x26\xdd\x91\x52\x57\x3e\x92\x88\x1e\xa3\xde\xed\xfb\x73\xe3\x7c\x40\xb6\x56\x2e\x03\x6a\x7a\x25\xea\x3f\x5d\xc7\x76\xb1\xec\x30\xdc\x7b\x19\x47\x57\xc9\xb8\xb6\x48\x7c\x98\xe5\x1a\xa7\x1e\x79\xbb\x1a\xc9\x62\xc6\x91\x04\x94\x4f\xff\x65\xf5\x2c\x7a\x1e\xe9\x83\x5a\x03\x77\xfe\x54\x06\x4f\x3c\x7b\xea\x3d\x6a\x49\xac\xf5\xde\x04\x45\x07\x91\xcf\x1b\x35\xa0\x24\x6b\x5d\xac\x5f\x16\xff\x8e\x12\x8b\xc0\xce\x33\xd7\x76\xf9\x3d\x3b\xcb\x9d\xeb\xde\x49\x33\x81\xd3\x40\xe9\xd3\x1a\xce\xab\x41\x6e\xf0\x4d\xe8\xbc\x85\x3e\x0e\x02\x55\xc1\xc5\x94\xcd\xba\xc3\x73\x47\xf7\xb0\x37\x94\xd5\x1e\x9b\x27\xf0\xd6\x83\x67\xbb\xcf\x44\xce\x1f\x54\x15\x7d\x7a\xcb\xc1\xc6\x35\x55\xfa\x67\xe2\xd6\x16\xce\xf9\x76\xe9\x55\x5d\x3e\x41\xff\x61\x89\xbe\x02\xb3\x7b\xf7\xf1\xb6\x68\xe3\xd3\xa8\x01\xd9\xce\x21\x42\xec\x51\xcf\x7c\xbf\x4d\x15\x91\x13\x6c\xf0\x85\x73\x60\x45\x0e\x7c\x3b\x44\xce\x88\xda\x0d\x78\x1e\x44\x4b\x0f\x1c\x95\xf6\x99\xf5\xfe\xa2\x83\x74\x9a\x63\x77\xb2\x66\xc3\xdc\x17\x48\xde\xc9\xfd\x61\x2e\x48\x55\xb4\x26\x03\x10\xea\xd4\x46\x33\xa0\xd6\xf9\x25\x15\x8e\x88\xd6\x33\xfd\x72\xf3\xcc\x0a\x62\xe5\x8d\x48\x85\x65\xb1\x98\x81\x1f\x3f\xa4\xd5\xf3\x5c\xd2\xe9\x02\x36\x4b\xc1\xc6\x4d\x50\xbf\xcc\xaf\xfc\x94\x22\x73\xaa\xe3\x28\xab\x67\x26\xe8\x84\xde\x0b\x2c\x60\x61\xcc\xce\xcb\x4b\xca\x1d\xc0\xb3\x57\xc5\x33\x03\xf3\x3f\xef\x8f\x9f\x3a\xae\xb2\x7f\xc8\x75\xbf\x7d\x57\xaf\x7e\xbd\x9e\x97\x82\x5e\xfe\x7e\xfd\x28\x64\x28\xde\xde\x1f\x82\x97\x55\x00\xf0\x20\xd2\x89\xa7\xa5\x34\x7b\xa2\x7e\xa0\xcc\xa6\x91\x22\xcc\x0c\x0a\xc3\x2c\xf2\xdb\x07\xe0\xa8\x63\x46\x9e\x1a\xe1\x5e\xfb\x82\xae\x56\x12\x53\xf8\x4f\x7e\x77\x64\x87\x67\x82\x8d\x62\xfd\x4d\xab\xeb\xb3\x97\x50\x5e\x28\x2a\xfb\x87\x4b\xef\x18\xa5\xb8\x60\x8c\xe6\x00\xd1\x75\x5c\x3b\x91\x1e\x41\x8b\x4f\x21\x4a\xc7\xbb\xae\xfc\xf2\xa4\xd5\xb0\x34\xaf\xdd\x96\xd0\x0f\x48\x4e\x1b\xec\xe3\x5e\x55\x54\x83\x1b\x90\x8d\x83\xc8\x5f\x88\xcc\xde\xdd\xc7\x29\x13\x11\xb4\x7e\xf3\x2b\x07\xf3\xcb\x98\x90\x6c\xa2\x98\xff\x4d\x3d\x01\x72\x4f\x18\xc1\xd3\xa9\xb6\xbe\x95\x58\xaf\x77\x80\x84\xb3\xa1\xa0\xd2\x7a\xe4\x30\x3c\x57\xf2\xe9\x31\x86\x4a\xa3\xbb\x51\x80\x51\xc3\x59\xec\x79\x00\x8a\x8f\xf9\x84\x70\xed\x6a\x99\x38\xbc\xbe\x7a\xc1\x93\x8b\xf8\xfb\x18\xc9\x31\xe8\x0b\xec\x57\xc5\x29\x22\xe1\x72\x2b\x35\xc2\x83\x61\x00\x7f\xb9\xe2\xa5\xd6\x44\xe4\x92\x71\x3a\x0a\xc4\x35\x5e\xea\xbc\x3a\x40\xe4\x1b\x9e\x9b\x19\x40\xc9\x1f\x2c\xba\x7c\xfb\x2c\xaa\x0c\xec\x00\x7d\x01\x19\xd8\x35\x55\xee\x8c\x79\x07\x8f\x00\x6d\xd6\x45\xf4\x27\xff\xed\xc4\x97\xb8\x92\x0c\x4a\x9f\x87\x9b\x30\x68\x7f\x7e\x0a\x10\xd4\xf5\x68\xe9\xae\xca\x65\x8a\xba\x3c\xc4\x7a\x91\xa1\xec\xb2\x15\x8d\x5e\x24\xe6\x0f\x43\xfb\x32\xb2\x5d\x7e\x43\x02\x6d\x08\xec\xcc\x09\x77\x6d\xea\x90\x6f\x47\x61\xfe\xae\xbe\x51\xbc\xba\x90\xe3\xfe\x17\xfd\xc4\x15\x3b\xd1\x94\xf1\x47\x33\xc4\xb2\x3c\xa3\x4d\x80\x32\xda\xeb\xd5\x8d\xee\xfa\xe7\xe4\xd9\x2e\xa6\xdd\x8a\x74\x98\xea\x1f\xb9\x55\x74\x57\x77\xc9\xfc\xb4\xaa\x77\x6b\x41\x27\x44\x93\x60\xf1\x3f\x26\x3d\xf7\xac\x5a\xdd\x80\x23\xcc\xcf\xe4\xbf\xd4\x0a\x7e\x72\x86\xce\x4f\xf1\xcc\x69\x65\x86\x4d\x4a\xe6\x5f\xa0\x7f\x38\x02\x00\x18\x93\x86\xa5\x9b\x9a\x05\x09\x71\xc1\x46\x5a\x0e\xad\x1e\x9b\x02\xa2\x9e\x72\xaa\x79\xa1\x15\x41\x0f\xfb\xaf\x92\x68\x6b\x74\x32\x20\x61\x39\xe0\x32\xf2\xd6\xa9\x57\x5d\xc4\xc6\x05\x71\xcb\xea\x2d\x31\x4a\x95\xff\xeb\x5c\xfa\x8f\xfe\xa6\x8c\xc4\x0d\xa3\xb1\xef\x08\x80\x9c\x71\xbf\xb3\x53\x94\xf1\xd2\x2c\x1b\xdb\x12\xe6\xad\x8d\x64\x8e\xa6\xe9\xd5\x62\xb3\x8a\xcb\x2c\x6f\x24\xd2\x2c\xfe\x01\x4a\x80\xda\x3b\xdd\xaf\x3e\x47\x97\x98\x96\xb2\xbc\x7b\xb2\x21\xdf\xc4\xfa\xa6\x45\x03\x9d\x81\x01\x31\x6b\x18\x47\x93\xa8\xa6\x3d\x5a\x7a\xff\x6f\xd8\xf9\x2f\x83\xee\x27\x06\x83\x03\x70\x34\x3e\x3a\xd1\x70\xe7\x5e\x89\x50\xe7\x1c\xb0\xed\xfa\x1a\x60\x7a\x4c\x5f\xfe\xf9\x2e\xc0\xf2\xd5\xf2\xc0\x96\x66\x6d\x87\x10\xda\x08\x24\x42\x97\x7f\x97\xa7\xd3\x54\x26\xbe\x74\x60\xdd\x67\x34\x5e\x26\x4a\x72\xf5\x24\x7f\x5d\xcf\xa4\xa1\x02\xe1\xac\xec\x54\x3d\x86\x03\x96\x95\x64\xae\x34\x8c\x6f\x99\x38\x90\x5a\xf3\x82\x0e\x81\xd6\x43\x59\x77\x18\xed\x2c\xf0\x4b\x42\x0a\x09\x42\xcb\xee\xf1\xa2\x75\x11\xf0\x12\x36\x2d\x51\x32\xb9\x43\x3f\x57\x69\xfe\x89\x8e\xad\x80\x16\x5d\xa5\x2e\xa3\x2b\x6e\xe9\xf7\x66\x9f\x2c\x71\xa2\x1d\x6c\x07\xfb\x5f\xd7\xf9\x9f\xd6\x1f\x02\x81\x92\x06\x5d\x67\x25\x55\x6d\x6f\x72\x1d\xbe\x98\x12\x87\x7d\xad\x26\x08\xec\x87\x66\x4a\x17\x7c\x92\xb8\xa3\x5b\x2d\x19\x05\x5b\x78\x6e\x25\xb5\xff\xd4\x3e\x59\xee\xc2\x62\xc7\x99\x9d\x43\xbc\x37\x23\x7e\x91\x0a\x1b\xa6\xb7\x69\xfd\x4b\x16\x55\xfa\x37\xa5\xfb\xe7\x8b\x2a\x5a\x7c\x40\x74\x4a\xe0\xed\x4c\xe4\xf2\x94\xdc\xfa\x87\xb1\x62\xf2\x9b\xeb\xf0\xa4\xb8\xec\x81\x43\x1f\xd2\xec\x1a\x47\x5b\xfb\x38\x3d\xb5\x50\x90\xbd\xbf\x59\xb0\x38\x02\x39\x73\x94\x4b\x44\x90\xba\xf8\x82\x76\xce\xf6\xfb\x6b\xb9\xfe\xac\x98\xdc\x57\x0a\xa8\xe8\x8f\x99\x8e\x7a\x7f\x1f\xf9\xfe\x65\xae\xfc\x20\xb9\x58\x50\x70\x80\xef\x2c\xad\xf0\x72\xab\x1b\xf3\xc4\xba\x6e\xee\x86\x65\x9f\x77\xc1\x48\xf9\x3c\x33\x46\x65\x7a\x4e\x4f\xdc\x53\x7a\x1e\x7b\xc2\x1c\x04\x6d\xd8\x35\x37\x0b\x60\xa7\xe8\xcf\x7e\xa4\x7d\xb6\x98\xf9\xa0\x2e\x65\x6f\x4a\x20\x1d\x47\x4a\x6e\x2d\x7b\x53\x34\x46\xf2\x5a\x17\x64\x9a\xd1\xc3\xf1\x28\x0c\x20\x4a\x33\x93\xc8\x84\xe3\xbf\x77\x97\x60\x28\xe6\xb8\xc8\xc1\xe7\x96\x83\x9a\xf4\x84\x9f\xa3\xd8\x37\x06\xf3\x07\x0b\x59\x10\x6b\x71\xec\x4d\xb3\x93\x29\x5e\x1f\x0c\xa1\xe5\x8b\xd8\x97\xbe\x62\x41\x3e\x61\x7b\x6e\x86\x37\xeb\x12\xdc\x5e\x65\x0e\x92\x96\xf0\x28\x59\x5f\x13\x9f\x26\x0d\xf2\x1f\xf5\x9a\x4f\x48\x28\x95\x0b\x98\x17\xa9\x6e\x2f\x7e\x72\x44\x7b\xa7\xfe\x31\x53\x13\xfe\xef\x43\xf6\x3f\x4d\xa1\xb8\x8f\x3e\x98\x47\x81\xf4\x9d\x5c\x52\x80\x09\xf1\xb0\x66\x2b\x36\xee\xde\x45\xe2\x07\x75\x6e\x26\xba\xd5\x74\xc4\xb2\x39\x57\xb3\xd9\x7d\x37\x0b\x48\x8c\xdb\xca\xd1\x6a\x97\xb0\x2d\xa0\x62\xdc\x3d\xcc\x35\xd5\x96\xb9\x5f\xa8\x6e\x25\xc3\x68\x72\x9c\x1d\xef\x9f\xdf\xd3\x41\x97\x1c\x06\x89\x53\x75\x9b\x6e\xf2\x7e\xb6\x05\xfb\x22\x8c\xed\x95\x1c\xf9\x71\x0e\x22\xc4\xcf\xdf\x63\x49\xfc\xc9\x18\xa7\x67\xdc\xbf\x17\x07\xfb\xb1\x71\x97\x38\x28\xe0\x90\x5e\x90\x95\xcc\xb9\x62\x35\x8e\xcd\x23\x63\xf7\x21\xff\x80\xbe\xd5\xc5\xaa\x24\xad\x6f\x32\xf2\x94\x7c\xf8\xfb\x65\xff\xb2\x9c\x7e\xe2\xb0\x58\x60\x5d\xb7\x0f\x4b\xa3\x93\xfa\x84\x02\x77\x2d\xe8\xf2\x4a\x47\xa9\x81\x5a\xd1\xd7\x10\xfa\x01\x7c\xc3\x73\xce\x7b\x1f\xb3\xca\x30\x55\x90\xed\x66\x00\xe7\x18\x6c\x2a\xbe\xe4\xee\x69\x95\x82\xec\x24\x04\x7f\x24\xb4\x48\x49\x34\x79\xdb\x16\xc0\x64\x14\x8d\xe2\x28\xcf\x06\x6e\x84\xee\xee\x4f\xf8\xed\x85\xac\xd3\x09\x44\xf5\x96\x19\x03\x3e\x75\x69\x7b\xe4\x2c\x35\xbb\x2d\xe6\x0a\xf1\xa4\xf2\xf7\x87\x03\xc4\x80\x68\xc1\x67\x9a\x67\xfe\x6f\xe2\xf7\x0f\xbb\x10\x83\xb8\x34\x1f\x89\x3f\x8e\x0a\x1a\x6a\x8d\x43\x59\x97\xaf\xbe\xce\x51\xe6\x1f\x2d\xfb\x7b\x29\xff\x65\x92\xfc\x20\x28\x48\x50\x60\x82\xe8\x00\x0d\x77\x4d\x7a\xc4\xa3\x34\xb6\xfa\xe3\x61\xaf\xd6\x2b\xee\xdb\xe4\x4c\x91\x92\x22\x64\xcd\xaa\x8e\x77\x55\xde\x1f\x17\xd0\xc1\xf8\xac\x27\x09\x47\xe1\x7d\x3d\x24\x90\xdd\x81\x8a\x29\xfa\x43\x5f\xfd\x0f\x23\xb8\x41\x46\xed\x37\x29\x9d\x7d\x4c\xd0\xac\x06\x20\x00\xd0\x96\xb0\x62\xb0\xf5\x7c\x69\xfa\x4f\x30\x95\x8c\xef\xe5\xf7\x7d\x63\x3a\x36\xff\xbb\xc3\x95\x07\xbb\x09\xc4\x2c\xa9\xea\xf7\x29\x80\x68\x42\xb0\xa1\x49\x52\xd3\x5e\xc8\x2b\xfa\xb3\x0d\xc6\x47\x7a\x3f\xc9\xcb\x92\xb4\xa1\x33\x87\x17\xee\x61\xfc\x6b\x4b\x4d\x44\x8d\x97\xfe\x58\xff\x57\xf0\xf6\xfc\xdb\x87\x00\x32\x51\x32\xc1\xe2\x4a\xd5\xed\x04\xf1\x57\xd1\xc6\x18\xf6\x0b\x67\x89\x95\x17\xcd\x9a\x0f\x46\x0d\xfa\x22\x7e\x90\xc7\xab\xff\x3f\x94\x7b\x1a\xba\xfe\xa5\x3a\x6d\x3d\xe6\xee\x1f\x6d\x7e\xa8\xe7\x46\x53\x4b\xb1\x47\xd9\xca\x4d\x67\x79\x26\xaa\x6b\x29\x28\x77\xfe\x86\xdb\xef\x40\x5b\xde\x59\x7a\x8b\x18\xa9\x11\x13\x8c\xc5\xea\xf0\x39\x3b\x8e\x55\x4f\x8b\x3f\x29\xdf\xbf\x23\x36\x63\x5a\x50\x84\x6a\x6b\x8a\xef\xcf\xd3\xaf\xd4\x46\x28\x28\xed\x17\xe4\x9c\x34\xae\x23\xbe\xbd\xe0\x1d\x6b\xc9\x29\x59\xe5\x17\x92\x61\xc9\x8b\x00\x49\x45\x4b\x1a\x11\x3e\x80\x01\x5d\x9c\x0b\xc7\xcc\x4f\xae\x69\xd1\x5d\x20\xfb\x28\x44\xc0\x7c\x1c\x11\xf4\xd1\x68\x76\x13\x8e\x30\xd9\x5e\x48\x55\x50\x57\xe9\x0c\x9c\x9f\x6b\xa5\x3a\xbd\x27\xf8\x28\x11\xda\xe5\xb5\x3c\xb7\x93\xe3\x1a\xca\x96\x0b\xe3\xd0\x5c\x12\x8f\x70\x4a\x7f\xc8\xab\xbe\xb1\xbd\xa7\xaf\xda\x0b\x6a\xdf\x98\x68\x6d\x76\xf9\xf0\xbd\x32\x05\x95\x07\x52\x9e\x96\x01\xcf\x8b\xf0\x49\xdd\x60\x6a\x55\xdb\x8c\xec\xb1\x51\x0f\xf8\xeb\xab\xbc\x64\x34\x0d\x22\x40\xfd\x24\x0f\xf5\xfe\xbb\x77\xef\x6e\x78\x4e\xc7\xf2\xa4\xe2\x1c\x8b\xa7\xb7\x80\x1e\xf5\xb4\x55\xec\xee\x93\xaa\x55\xc5\x8c\xd3\x37\x4d\xfd\x9f\x39\xf0\x79\x9b\xc6\xcb\xd4\x8a\x0d\xc6\xba\x02\x0a\xae\xcc\xf6\x10\x79\x44\xf2\x5f\x8c\x8b\xcc\xfc\x27\x42\xdd\xaf\x45\x9e\xd6\x6f\x40\xd0\x8c\x6f\x84\xd6\x2f\x43\x1d\x9b\xb5\x7c\x3f\x46\xfe\x4d\x1d\xff\x74\x73\xc4\xa9\x8e\xae\x6f\xe6\xc9\xee\x9a\xa3\xf9\x1d\xd9\x11\x88\x71\x70\xc3\xd5\x36\x9e\x17\x30\xf2\x5a\xc9\x96\xbf\x69\x8b\xe7\x33\x0b\x2f\xd0\xbb\x3f\x6a\xb9\x04\x9c\xf9\x1f\x95\xe1\x3d\x8e\x8a\x8c\xcf\x8f\x55\x52\x52\x32\xf4\xc8\x2e\x30\xbf\xad\x62\x33\x93\x43\x6f\x87\x41\xdd\x49\xdc\x2a\xba\x1a\x01\x0c\xba\x8c\xd4\x08\xbc\xa9\xfc\x78\x7e\x73\x61\xe9\x30\xee\x8b\x52\x71\x92\x06\xdf\x82\x17\x26\x05\x52\xe4\x73\x88\xb1\x9f\x47\x4f\x40\x4d\xe3\x5c\xeb\xb8\xdb\x94\x5f\xcb\x37\x7c\x7b\x05\x6b\x97\xd3\x11\x72\x52\x1b\xb3\x4f\xb8\x20\xb9\xf2\xae\x31\x10\x75\xae\x86\x26\xe6\x69\xa5\x38\x49\x5d\x73\xbf\x8f\x20\xd2\x57\x37\xad\x17\x37\x66\x0c\x94\xab\xb6\x90\x6f\xa5\xb6\xc1\x9d\xaa\xe2\x06\x3e\x2b\x40\xa5\xa3\x03\xc8\xea\x5a\x06\xb0\xb3\x77\x5e\x93\x06\x4b\xa2\x9a\xf7\x66\x70\x1a\x76\x5a\x13\xb8\x05\x5a\x17\xbf\x91\x5d\x64\xd8\xf1\x0d\x06\xc1\xbe\x75\xad\x69\x05\x18\xef\x34\xdf\xe0\xf2\x99\x72\x3a\x97\xe5\x48\xc3\xe6\x3c\x3a\x6d\x8b\x22\x28\x38\x95\x63\x9e\x22\xf9\xe8\x3b\x91\x83\x25\x97\x3d\xfa\xde\xac\x44\xa9\xd4\x46\x0e\xbe\x88\xe9\xe6\xc3\x9e\xc6\x96\xab\x0d\xdc\xe1\xda\x45\x25\xcf\xc2\xf6\xc4\x93\x3e\x06\xca\x2a\x40\xf8\xbe\x2d\xee\x43\x1b\xfa\x4e\x1a\x8a\xf6\x65\xc8\x0d\x14\xa9\xeb\x6b\x5a\x51\x56\x10\x20\x96\x9a\x17\x0a\x4f\x20\x74\x03\xf9\x07\xfb\x56\xfa\x9e\x25\x76\xeb\x36\x86\xe3\x14\xe3\xae\xb8\x76\x2d\x38\xdf\x96\x66\x09\x45\xb2\x91\x44\x3f\x94\xcc\xbe\x2d\x53\x24\x02\x57\x6a\xad\xbf\x85\x52\x00\xdd\x67\xe8\x17\x47\xf6\x5c\xde\xad\x05\xe1\x0e\x7c\x37\xc1\x7b\x5c\x85\x52\x0b\x63\x63\x33\xa2\x80\xa1\x40\x40\xb4\x24\xda\x9c\xaa\xf5\x08\xa6\xb5\x63\x98\xca\xb5\xac\x05\xb3\x48\x8c\xf6\xed\x9c\xc7\x80\xf8\x32\x7b\xec\xa3\xb0\x97\x8b\xb0\x0a\xd0\x01\xa1\xe7\xad\x54\xa8\x85\x10\xb1\xf4\x82\x52\x54\x7c\x28\x09\xd6\xab\xd7\x19\xbe\x42\xfe\x7c\x74\xd8\xb7\x8b\x65\xdb\xc7\x27\x40\x8b\xff\xd1\xf7\xae\x05\xd1\x77\xa7\xf6\x19\x8d\x95\x74\x8b\x09\xd7\x0a\x01\xe3\x45\x4c\x59\xad\xc2\xa9\xac\x31\x8a\x16\xf4\x10\x4f\x2c\xb0\x3a\xb4\xd4\x4c\xcb\x21\x04\xc7\xe0\xbd\xa0\x3a\x4b\xe2\x47\x0f\x43\x4b\x83\xd5\xd2\x75\x5d\xf1\xa5\x73\x2a\x0c\x4f\xde\x62\x17\x29\x20\xe7\x78\xf7\x70\x4d\x82\xba\x8b\x08\x4b\x62\x81\x9a\xb5\xa9\x01\x12\x95\x32\xf2\x21\x70\xd1\x78\x5f\x16\x59\xe2\xf7\x16\xbe\x36\x03\xb0\x53\x1a\x86\x05\xca\x39\x65\xd7\x77\x1e\xbf\xaf\x72\xcd\xee\xfd\x67\x45\x59\x69\xa1\xe3\x93\x4b\x2c\xdb\xa0\x46\x16\x62\x8c\x27\xdb\xc1\xa5\xa2\x2f\xdb\x69\x92\x8b\xb6\xd7\x47\xe4\x29\xe4\xa3\x7a\x61\x08\x71\x94\x5c\xc9\xc8\x17\x44\x7c\xfc\x7e\xd3\x5a\x9a\x05\xf5\x67\xed\x69\x54\x67\xf6\x81\xc8\x55\x37\xdd\x7a\x22\xdf\x4b\x0e\x71\xa7\x10\xcc\x8d\x5e\x5d\xad\xca\xda\x79\x79\xb9\xa2\x8e\xe4\x03\xab\xa9\x02\x70\x54\xd5\xc0\xf6\x48\x8a\x78\x7e\x7b\x97\x87\x6d\xe5\x4a\xe7\xd1\xb6\x00\xff\xd4\x0a\xc5\xd7\xca\xb8\x89\x54\xe2\xcf\x79\xb9\xaa\x8d\xc1\x4a\xbe\x5d\x53\xa6\xe3\xa5\x58\xe2\x0b\x63\xc4\xf9\x8d\xa8\xb0\x8a\x36\x9a\xbb\x01\x66\xd7\x84\x99\x95\x65\x12\xcf\x58\x3a\xb5\xb0\x9e\x4e\x95\x09\xac\x95\x58\xd6\xb3\xb2\x55\x46\xfe\x67\x2d\xd6\x8a\x37\x1c\xc9\x49\x6a\xa3\xeb\xf4\xaa\xca\x3d\xa6\xb5\x07\xa1\x87\x8d\xbf\x81\xc7\xdc\xf0\x9f\x59\x5e\x96\x1f\x6a\xba\x77\x6f\x4a\x9e\x45\x65\xc7\x91\xac\x7e\xbc\x50\xc5\xb7\xee\x88\xe1\x77\xde\xb6\x8e\xb3\x00\x12\xc5\xd2\x0c\xe0\xec\xd1\x8f\xc5\xb1\xbf\xa3\xb4\xf9\x64\x64\xd1\xef\xf4\x8a\x97\x39\x5a\x9b\xf5\x48\xb6\x84\xff\xd8\xcf\xfb\xac\xa7\x0f\x6c\x15\x7c\x73\x1b\x92\xfb\x4f\x9f\x53\x7a\x15\x9a\x50\xb8\x68\x04\x87\x15\xe9\x13\x6e\x47\x7c\x32\xd2\x40\x0f\x86\xaa\x4a\x2c\xff\x9e\xa7\x41\x2f\x78\xb8\xef\x0a\x89\x05\x3a\xd9\x12\x34\xaa\x5e\xa3\xe3\x6f\xbe\x47\xf4\xd3\xfc\xa4\x1a\x9b\x3f\xcf\xef\x4c\x5b\x35\xfe\x07\x24\x7e\x27\x88\x86\xfa\x7c\x25\xb1\xa8\x25\x43\x90\x73\xb0\x9c\x9e\x9c\x99\xaa\x42\xd3\xa9\x2e\x76\x15\x23\x0f\x2f\x54\x4d\xbb\xc1\xc0\xf8\x4f\xfb\x72\x46\xe4\x7d\x52\x9c\x70\x06\x6b\xed\xee\xa2\x38\x82\x77\x4c\x33\x5e\x39\xc1\x7d\xba\x95\x77\xac\x68\x25\x8d\x61\x93\x4e\x66\x4f\x2b\x85\xae\x94\xcc\xd4\xfe\xe9\x88\x24\x5e\x7a\xe4\x4b\x4a\xaa\x55\x3f\xca\xcf\x88\x03\xdc\x7d\x66\x74\xdb\x5a\xf9\xa8\x8b\x93\x34\x16\xa0\xfe\xc3\x08\xc6\x8a\x67\xef\x12\x66\xa5\x95\xd5\xd1\xc7\x77\x8a\x78\xe1\xb7\x65\x58\x98\xe4\xa5\xec\xac\x02\xaf\x2c\xac\x99\x55\x80\x00\x65\xd0\x29\xf2\xa7\x52\x0c\x3b\xcd\x3b\x3b\xe4\xf1\x5f\x86\x47\xe8\x7b\xe6\x92\x07\x22\x2c\x6f\xa7\x37\xa9\xdc\x3a\x1c\x47\x20\xad\xc0\x4a\x21\x21\x61\xf7\xd4\x12\x73\x95\xf1\xbe\xc1\xda\x74\x7a\x75\xdd\x22\x51\xc1\xa6\x43\xad\xc6\x67\xc9\x87\x6c\x41\x79\x6f\xda\xa0\xf8\x34\x68\xad\xe5\x91\xdc\x20\xde\x86\x5d\x22\xe2\xdd\x10\x37\xf2\xe6\xcf\xf0\x7b\x13\xfd\x29\xea\xd7\x2d\xd3\xf6\xb3\x2a\x2e\xfa\xfd\x85\xe0\xe7\x1f\x7e\x3a\x40\x14\x77\x6d\xf1\x10\xd4\xc1\xe1\x17\x17\x71\x7f\x44\xaa\x39\x8d\x4e\x4c\x0c\x11\xf0\x52\x87\xfb\x49\x13\x26\xdc\xfc\x34\xbf\x40\xff\xdc\xed\x14\x86\x5c\x50\xd3\x11\xd2\x30\x87\x0e\x99\xe2\x0f\x87\xe1\x61\xbd\x5c\xed\xfa\xa2\x04\x1f\x1b\x9b\xfa\x31\xa0\xa8\xcc\x21\x82\x16\x01\x8a\x29\x3a\x49\xbf\x00\x4b\x50\x25\xc9\x86\xf2\x43\x0e\xd1\x1f\xd6\xf3\x02\x31\xb2\x7c\x35\x28\xec\xc1\x11\x30\xea\x2c\x42\x6e\xba\x32\x2b\x3a\xef\x68\x42\x20\xe1\x98\xa9\x6d\xee\x68\xdf\xf8\x82\x5d\x85\x49\xe7\xd7\xc0\xe6\xe0\x5a\x17\x3d\xf6\x1f\x55\xc7\x2a\x0d\xde\x5b\x26\x2b\x55\x23\x93\xf3\x93\xc5\xfe\xf8\xb2\x6b\xb3\x35\xc4\x70\xd0\xd5\x94\x18\x9f\xe8\x5a\x0f\x83\x09\xf7\xf3\x7f\x3c\xb7\x7f\x9a\x69\xf1\xe4\xff\xc0\xf5\x39\x44\x6f\x97\xa0\x93\x70\x29\x14\x6c\x75\x1d\xbe\xc2\x8d\x8d\x3d\xc0\xb5\x77\x6d\x1d\x76\x64\xb9\x5a\x4e\xfe\x6a\x7c\x3b\x04\x7a\x8f\x37\x96\x03\x6f\xa5\x62\xe7\x61\x58\xaf\xc5\x7f\xef\x72\x26\x9b\xce\x24\xce\xea\x34\xc0\xcb\x09\xc9\x45\xf1\xae\x39\x67\x2e\xd5\x00\xa2\xa8\x1d\xa6\x57\x15\x47\x01\x71\xcb\x41\xc3\x74\xde\x58\x70\xfd\x63\xa8\x0a\xa2\xd5\x0f\x7c\xbc\x2f\x25\xf8\x92\xda\x78\x98\x40\xda\x28\xe6\x31\x5c\x7f\x3b\xf3\x61\x5f\x78\x4a\xbb\xe8\x97\x1c\xe1\x4f\x47\xa4\x9b\xd4\x89\xc7\xdd\xa5\x4a\x4a\x55\xe5\x15\xf9\x43\xae\x7f\x3d\xb7\x7f\x39\x00\x7e\x90\x00\x8a\xff\x14\xa4\xa5\xf2\x9d\xda\x1c\xdc\xeb\x86\x5a\x9d\x6d\xaf\x21\x21\x35\x2a\x0e\xa5\xa6\x31\xec\x0a\xde\x63\xe7\x11\x4a\x7f\x57\x71\x10\x0f\xbe\x4a\x8d\x07\x71\x1d\x6b\x94\xe8\xc5\xf9\x93\x58\x32\x68\xe1\x90\x95\xfc\x24\x96\x29\xeb\x45\x7d\x4f\xb0\xa9\x1c\x33\xe8\x29\x85\xff\x09\x10\x8d\x93\x34\x4f\x6a\x61\x65\xa5\x84\x35\x8e\x43\x63\x59\x54\x27\x9e\xa1\xa3\x7c\xb5\x2b\x13\x6f\x08\xbb\x88\xb6\x34\xb2\x94\xe4\x0a\x56\x33\xe0\x41\xd7\x72\x95\xd1\x0a\xe3\xb8\x0a\x61\xc6\x6a\x58\xe4\xfc\xb1\x9d\x6d\xc0\xd9\xda\x74\x38\x86\x24\xae\xff\x03\x7e\xb5\xe3\xaf\xbb\xfd\x2f\x87\xc1\x4f\x1c\x19\x0a\x16\xcc\xcd\xaf\xf3\x77\x7d\xa4\xca\x67\x65\x8f\x7c\xeb\x15\x4e\x55\xba\xf5\xa9\x17\xd1\xab\x70\x14\xa9\x69\xd0\x45\x95\x70\x7b\xec\x00\x24\xf0\x32\x60\x0f\xc6\x17\xcf\x2b\x2d\x52\xa3\xc4\xb3\x9f\xc9\x0c\x4b\xee\x79\x14\x11\x04\x36\x96\x9f\x56\xde\x46\x8d\xa4\x7e\x8c\x02\x1b\xfd\x5c\x0a\xd0\x7c\x9c\x4b\x8b\x6f\xcb\x93\x5b\x39\x53\x35\xa9\xe3\xd6\x38\xc9\x8a\x5d\x3b\x32\x14\x29\x45\xa7\xbb\x8f\x09\x19\x02\x37\x4d\xb1\x9d\x83\x7c\xa2\x21\xa9\x5b\x76\xf1\xf7\xe0\x42\x6b\xdd\x60\xbe\xe8\xab\x79\x8b\x84\x5a\x45\x91\xd3\xe3\x3f\x49\xef\xf6\xeb\xfe\x6e\xda\x3f\x1d\x0c\x88\x22\xcc\x7f\xba\x87\xab\x7d\x31\x63\x41\x6c\x18\x44\xa9\x55\xc0\x93\x3a\x2c\x23\xde\x8b\xb8\xcc\x3d\x73\xa6\xb7\xe6\x53\x7c\xff\x95\x32\x45\xe2\x4a\x01\x50\x02\x5f\x6c\x54\x37\xc0\xe3\xbd\x42\xc8\x15\xae\xd5\x33\xce\x29\x21\x78\xcb\xd6\xc0\x42\x99\x98\xd9\x74\x52\x5e\xa5\xd1\x03\x46\x54\x40\xb4\xa1\x75\xd0\xea\xe0\x80\xd2\x9e\x6c\x55\x66\xa8\x7f\x08\x9d\x6f\x96\xc7\x33\xed\x24\x15\xfa\x63\x25\x0f\xe2\xfc\xd7\x0d\x58\x22\x10\x33\xc8\x99\xf5\xcc\x0a\x9e\xce\x80\x61\x45\x12\x50\xf5\x26\x26\x98\x49\xab\xab\xa3\xa5\x85\xf8\x47\x34\xe8\x43\x7d\x0e\x8a\x8b\xfe\x1b\x03\xff\xcb\x23\xf0\x83\x50\x04\x42\x21\x01\x31\xf0\xd8\x36\x6a\xde\x8b\xb1\x9b\x65\xbd\x5c\x54\xa6\xd4\xd7\x91\xce\x94\x89\x78\x2d\x9c\xc6\x13\xc6\xb4\x4a\x7b\x3b\x44\x92\xac\xe0\xeb\xbe\x9e\x72\xd3\xf2\x17\xa2\x20\xd5\x28\xad\xbd\x4b\x47\x27\xe4\xda\xbc\x91\xc0\x9b\x28\xb7\x61\x3b\xf5\x7e\x1c\x55\xa8\x6c\x75\x10\x65\x2e\xd6\xb7\xa9\x25\x78\x27\xcd\x38\xdc\xc0\x75\x42\x81\x5e\x59\xa1\xf8\x66\x99\x55\x92\xb5\xcd\x1f\x3a\x57\xb5\x67\x57\x53\x12\x6c\x56\xc6\xad\x3d\x71\xaf\xa6\x29\x26\x45\xbf\x2e\xec\xd3\xa9\xa1\x89\xd5\x00\x59\x79\xbb\x27\xeb\x1f\x7a\x86\x11\x3e\xec\x63\x93\x72\x07\x88\x06\xb9\xb9\xb3\xe4\xaf\x0a\x67\x22\xe2\xe3\x51\x68\x61\xcd\xd3\xca\xf2\x8e\x98\x28\x79\x94\xcd\x56\x1e\xba\xeb\xe5\x8c\x5b\x29\xff\xdd\xe0\x7f\x3a\x3b\x10\x0a\x28\x58\xb0\x96\x72\x7a\xe4\xf3\x10\x36\xb3\x9d\x56\xd3\x72\x8c\xc9\xda\xa2\xcd\xc0\x81\x40\x49\x79\x5f\xfb\x53\x06\x03\x9a\x2d\xd7\xb5\xc1\x18\x90\xff\x5f\x97\xe9\x48\x24\xa2\xd2\xa8\x80\x85\x45\xf9\x80\x4e\x2f\x59\x5e\x26\x60\x4c\xa6\x72\x12\xd2\x60\x5d\x84\xd7\x88\x80\x25\x0a\xbe\xa2\x99\x4e\x41\x8d\x3c\x5e\x41\x12\x0e\x77\xae\xa4\x0b\xd3\xaf\x8b\xc9\x15\x03\x8e\x5f\x04\xd4\xc8\x8e\xcf\xe7\x5d\xdd\x57\xd3\x81\xaf\x8e\x62\xd7\x3e\x78\x1c\x2e\xa9\xd3\xb7\x46\xf1\xf5\x07\xee\xcb\x0a\xf5\x7c\x8e\xdf\x78\x77\xf2\x67\x8d\x25\x0d\x89\x0d\xcc\x2a\x1c\xfe\xde\xca\x7f\xf9\x31\x7e\xe2\x48\x68\xe0\xd1\x15\x93\x80\xc3\x64\x27\x0f\x90\x5c\x79\x54\x0a\x82\x59\x89\xdd\x43\x73\xc4\xa6\x52\xa4\xa3\x80\x8e\xf4\x2e\x77\x6c\x99\xf1\xee\x06\x74\x38\xd7\xe4\x2f\xd7\xb5\x67\xb4\x1b\xf8\xa6\x39\x94\x3a\x4a\xfe\x2c\xc2\xf7\x9e\xe8\x73\x6b\xe3\x66\x80\xb9\x02\x9e\x93\x82\xfd\x08\x08\x87\xe8\x74\xbe\x33\xcf\x3f\x35\x0d\xa7\xe4\xc6\x50\x49\x3c\x8e\x74\x22\x5f\x5f\x93\x37\x49\x79\x3e\x70\xf6\x96\x7f\xc2\xfb\x3f\xa7\xfc\xe6\xdb\xa8\x5d\x04\x31\xcb\x57\x9f\x57\xe9\x21\x9a\x67\xe2\xf9\x7e\x8c\x3a\xfd\x21\xc7\x46\x6e\x8e\x88\x21\x0e\x7f\x1c\x34\x83\xfe\x6e\xda\xbf\x7c\x29\x3f\x08\x34\x14\x1c\xd8\x1e\xbe\x49\x64\x90\xec\x07\x79\x2e\x54\x66\x26\x29\xb5\x47\x10\x5c\x7c\xc1\xd5\x2f\xc3\x3d\xe5\x96\x73\xe3\x9f\x9f\x6d\x68\x7e\x0b\xbd\x00\x94\xa0\x55\x6d\xfe\x34\xcc\x48\x32\x87\x77\xf8\x4b\xd5\xcb\xac\xf7\xed\x29\x47\xd5\xf6\xca\xf8\xaf\x0f\x2f\x97\x0c\xde\x1c\x7a\x22\x2f\x00\xa2\xfb\x68\x5f\x42\xcb\x20\x2c\xc7\x53\x2a\xa7\x8c\x2f\x11\x96\xef\x09\x0f\x70\x8d\xb7\xfc\xdb\x32\xe2\xd1\xb7\x3f\x07\xd4\x98\x83\x29\x5f\x67\x94\x7e\xda\x89\xc3\x12\xfc\xbd\x0d\x9f\x6c\x24\xd2\xbb\xb5\x6e\xe4\x79\x92\xd3\x75\xcf\xdc\xc2\x52\xd2\x67\x94\x13\x21\x06\x7f\x6f\xe5\xbf\x7c\x3f\x3f\x88\x08\x15\x16\x78\x2b\xe5\x3e\x42\x9d\x9c\x85\x1f\xa9\xc8\x73\xe3\xbb\x6f\xa1\x42\xee\x7f\xa8\x6a\x7d\xbf\xa9\x69\x8d\xf8\x2d\xa9\x5e\x0e\x37\x34\xb1\x01\x28\x21\x92\x3a\xc4\x61\x7f\x79\xa6\xc0\xc7\x43\x53\x3d\x46\x1d\xb2\xe6\xe5\x84\xb3\x5c\x2e\x65\xcc\xac\xa4\xf6\xdd\x13\x9f\xd7\xc5\x10\x24\x24\xc8\x84\x47\xf7\x47\xa9\x8d\x41\xa3\xbc\xf7\xc3\xdb\xeb\x18\xd1\x19\x7a\xf7\x99\xa8\x42\x19\xeb\x67\xd2\x19\xd6\xca\x04\xe2\x37\x40\x54\x13\x4b\xe4\x1c\xf1\x5d\x72\x6d\xc1\x59\x7e\xf6\xfd\x1a\x5a\x06\x7a\x66\x84\xc8\x02\x5c\x5c\x00\xfa\x2f\x01\x21\xa9\x68\x66\xb0\xe9\xfc\x4b\xc2\x17\x90\xbb\x2f\xb0\x94\xd9\x90\xb5\x5e\x9f\x9a\xa6\xf5\xc5\x6e\xd4\x5e\x2b\x64\x44\xb4\xd9\xae\x44\x1e\x12\xee\xd5\x88\xbf\x1b\xfc\x2f\xbf\xce\x0f\x82\x04\x03\x0d\xa2\x1c\x95\xfd\x7a\x5c\x64\x1d\xe2\x28\xd4\x66\xbf\x60\x33\x7e\xa2\xc7\xbe\x72\x8c\xd3\x71\xf9\x00\x11\x15\x08\x7e\xe9\x6e\x47\xd2\x0e\xe6\xaf\xf8\x21\xa4\xbd\xe5\x63\xde\x8d\x30\xd4\xc8\x47\xa8\x63\x97\xf8\x65\xf7\x31\x67\xf9\x75\x8d\xe0\xdd\x67\x88\x9c\x0c\xfd\x3b\x0c\x90\xcf\x44\x7c\x85\x86\x6a\x2f\x89\xd5\x55\x22\x15\xaa\xf3\xc7\x7f\x44\xd0\x14\xe2\x6f\x6d\x44\xc6\xef\xd4\xab\x84\x6b\xfc\x86\xe1\x1b\x0b\x20\xfa\x42\x93\xc2\xcb\x12\x37\x8c\x91\x2f\xe1\x4b\x67\x87\x3b\x55\xda\xd8\x6c\x6b\xb1\x53\xae\x00\x39\xe5\x19\x5f\x56\x1c\xf4\x52\xfb\xdf\x1c\x8b\x7f\xfa\x6c\xe2\xa2\x30\xe0\xad\x4c\xce\x31\x4b\x0c\x67\x3f\x78\xdd\xea\xd2\xdc\x6c\xf1\x9b\xcf\x08\x26\xd5\x7b\x3c\xd5\xa4\xe9\x95\xf3\x9f\xdb\x72\x29\xeb\x01\xb0\x97\xfc\x5e\xd1\x77\xfc\x68\xb7\x67\xd1\x19\x32\x86\x1a\xc6\x53\x02\xa4\x05\x42\x5a\x9a\xed\xee\x17\x08\x9b\xfa\x39\xac\x66\x27\x43\xe7\x20\x09\xad\x17\xde\x5f\x35\x42\xd0\x7b\x55\x53\xde\xaa\x65\xd1\xa2\x85\x2b\xfe\x1b\xa2\x1b\xd3\x07\x74\x53\x81\xb0\x09\x13\xf5\x4f\x86\x60\x0b\xe9\x5c\xaa\x3a\x16\xff\xc1\x41\xce\x15\xfa\xd3\xee\x9c\x0e\x23\x76\x33\xa5\xba\x07\x91\xab\x0f\x6f\xb5\xf4\x7e\xe7\x34\x1f\x4f\x3d\xb9\x8e\x0f\x0d\x2b\x0e\x93\x3d\x71\x09\xf2\xb9\xcf\x62\x14\xcf\xea\x3c\x1c\x49\xe5\xf9\x05\xfb\x24\x8b\x37\xe5\x03\x9a\x48\xeb\xc8\x14\xfe\x36\x58\xfb\x97\x33\xe8\x07\x11\xc9\x65\x80\x03\xf2\xb3\xaa\x35\xb1\x74\x3e\xdb\x31\xc4\x8c\xa1\xf0\x63\x28\xf4\xa3\x7d\xb4\x73\xd6\xf6\xdf\x23\xb8\x9f\x3a\x80\x11\xab\xa1\x1c\x52\x01\x2b\xcd\x26\x48\x33\x2d\x70\x93\x1e\x6d\x2b\xac\x50\xe0\x2e\x5c\x7e\x84\x51\xd8\x2e\x74\xc0\x0c\x14\xaa\x4b\x22\xf0\x49\xad\x25\x26\x00\x09\x2f\x87\x5a\x44\xb9\x82\x3a\xa1\x77\xb5\xfc\xe8\xbf\xae\x68\xcc\xdb\x5f\x54\xff\xe4\x2a\x7d\x69\x17\x1b\x7a\x1f\x6b\x4b\x81\x24\xd1\x09\x9e\x84\x31\x44\x76\x79\xfd\x73\x51\x46\x44\xbb\x74\x0e\x7b\x6d\xfe\x44\x49\x06\x4a\x3e\xb4\xdb\x19\xff\x7a\x12\xd5\xd1\x04\x3e\xb0\x76\x1a\x87\xab\x52\x19\xc6\xbd\x70\x0d\xbb\xcc\x9f\x05\xbc\x97\x47\xb1\x65\x81\xee\x8e\xb9\x0b\x82\xac\x94\xfd\xb0\x0c\x2c\x3b\xf0\x60\x06\x20\x92\x7a\xaf\x40\x18\x4f\xdd\xda\xd7\x25\x6c\xe4\x1d\xd1\x26\xd8\xf3\x5e\x6e\x84\xe9\x5f\xb7\xe1\x94\xbf\xe2\x79\xbb\xb2\xcd\x40\xb3\xfe\x12\xd9\x6b\xb1\xff\xca\xa7\xe2\xf3\xc0\x56\x36\x7b\xcd\x95\x8b\x85\x5e\x97\x2c\x47\x07\xdb\xd5\x6b\x15\x87\xaf\xad\xf7\x55\xe8\x97\x77\xb8\xff\x57\xd0\xd2\xea\x1c\xc3\x87\xc3\xf9\xc4\xec\x35\xca\x62\xed\x4d\xac\xbb\xf2\x83\x22\x9f\xf0\xa8\xcb\x6f\x82\xef\xf0\xd6\x8d\x87\x9c\xba\xff\x53\x70\xf8\x69\x83\xcd\x6d\xf2\x8e\x0b\xa4\x39\x1c\x24\x43\xc5\x22\x32\x0a\xb6\x97\x15\x54\xb4\xad\x22\x8f\x3d\xde\x66\xe3\xe2\x37\x54\x2c\xd4\x02\xf9\x10\x2d\x75\xf3\xf8\x95\x70\x47\x6a\x42\x29\x3f\x05\x1e\x52\xb6\x5d\x17\x1a\xae\xc3\xd8\x4b\x76\x08\xf2\x36\xa9\x06\xcf\xf8\xcf\xa8\xc0\xee\xc7\xb2\xc3\x53\xb5\xe1\xf2\x34\x79\x34\x42\xa9\x9a\x43\x16\xcd\x21\x26\xf1\xe9\x02\x08\x73\x84\xdd\x0a\x72\xea\x9a\x98\x4d\x00\xde\xb2\x44\x63\xb1\x71\xba\x44\x8b\x56\x25\xb8\x74\x78\x34\x13\x6f\x3d\x74\xe4\x72\x8d\x78\xf4\x12\x8a\x3a\x36\xae\xa7\xc8\xc1\x19\x68\xaf\xb6\xc9\x3a\xfb\x01\xf2\x87\xac\x8a\x90\x76\xc3\xc5\xb6\x65\x4f\xd0\xf0\x81\x8c\xa9\x85\x43\xf7\x6e\xcb\xb8\xa0\xca\x77\xee\x1e\xcc\x2a\x34\x43\x7c\x03\x4f\x3c\xd2\x6b\xa2\xf9\x35\x3c\x7f\x28\xe1\x39\xb7\x4a\xcd\x86\xe9\xf7\x56\x41\xd3\x87\x6d\x44\x91\x5f\xa3\x27\x61\x60\x68\x22\xa0\xeb\x78\x0f\x17\x36\xa0\x7a\xdb\x27\xe8\x4a\xb6\x23\xcb\x4a\x39\xec\x54\xe7\x7f\xff\xe9\x75\xc8\xa5\xde\x9c\x00\x97\x8f\xd8\xd3\x47\x61\x2b\x3f\xf6\x0c\xa7\x1d\xc3\x86\xa4\x06\x7e\x3a\xea\xe0\xd2\x46\xd7\x70\x86\xe8\x4b\x39\xa1\xb8\x89\x7f\xe8\x84\xab\x1b\x00\x6a\x1e\x7e\xae\x36\x19\xae\xe7\x70\xac\x4f\x90\xba\xc0\x96\xdb\x55\xf8\x85\xdc\x1f\xcc\xb8\x81\x73\x65\x1a\x1f\xaf\x8d\xd6\x1c\x22\x3d\x0b\x50\x72\xa3\x55\x0a\x3a\x61\x7d\x19\x74\xc3\xb9\xb7\x5a\x74\xd3\x76\x04\x33\x3f\x30\x6b\xf7\x79\xbf\x34\x4f\xc2\x8d\x3c\xdd\x85\xb6\x03\x6e\xa2\xd2\x6a\x85\x17\x4e\xe8\x9b\xd5\xf8\xa1\x97\xaf\x06\x17\x8d\x30\x9d\x3e\x95\x65\x24\x65\x50\xcb\xbd\x71\xb6\xd2\x4a\x8e\x1d\x17\x06\x36\xea\xe5\x33\xe4\x81\x67\xc3\x4c\x62\xc9\xb7\xbf\x2a\x75\x51\x8c\xaa\xb7\x34\xba\xc9\x75\x10\xba\x65\xb1\xdd\x38\xda\x3d\xd8\x7d\x81\x41\xfb\x58\x49\x03\xbf\x60\xcd\x68\x33\xac\x4f\xbc\x84\x79\x01\x11\xf6\xf0\x5b\xed\x4a\xaf\xaa\x6a\x48\x58\x0d\xd2\x53\x9d\x6e\x02\x80\xb9\xf1\xc3\x2f\xa2\xdd\x3f\x60\xaf\x2c\x61\xeb\x8d\x67\x45\x0b\xf9\x02\x73\x44\xa1\x12\x25\x7e\x51\xc2\xb1\x5b\x34\x61\x9e\x3d\xb7\x04\xd7\x74\x8a\xd7\xe3\x7d\x43\x91\x3c\xf6\xc0\x87\x2d\xe9\x1b\x94\xc4\x9f\xc2\xf4\x2a\x62\x31\x09\x98\x36\xcb\xb7\x75\x06\x96\xeb\x13\xa2\x4f\xf3\xff\x56\x76\x16\x60\xbd\xeb\xf5\x4c\xde\x48\x9e\x9e\x95\x53\x84\x14\xbf\x60\xf1\x56\x9f\x3e\x0c\x31\x39\xb9\x27\xec\xdf\x7d\x03\xa4\xfd\xfd\xd1\x1b\xfb\x04\xab\xe4\x73\x40\x2e\xaa\x81\x09\xb1\x51\x83\xfd\xf8\xc3\x90\x75\x41\x56\xdc\xb4\x6a\x77\x9e\x7d\x92\x97\xe1\x3d\xd8\x76\x5f\x29\x06\xe5\x4c\x4f\x24\x5a\xef\x33\xf3\x29\x0e\x9a\xce\x7a\x00\x5f\x6b\xf5\x57\x68\x65\x1f\x1f\x73\xa4\x5f\x92\x62\xf2\x32\x4f\x83\xf2\x9d\xc4\x5c\x7c\xb2\x24\xce\x4b\xcb\xa5\x1b\xdf\x4f\x98\x9b\x86\x87\x37\x49\xe2\x09\x17\x15\x11\x5b\x70\x96\x31\x21\xc1\x2a\x03\x3f\x2a\x35\x48\x89\xf2\xe8\x04\xd1\x55\xa1\xf6\xa8\x76\x20\xbc\x90\xcc\xa7\x4e\xbc\x15\xe9\xac\x5f\x0a\x91\x0b\x46\x81\x99\x51\x7a\xf3\x69\x7e\x0b\xb8\x1b\x79\x81\x91\xd4\x13\xbe\x0f\xa4\x50\x13\xa9\x79\xc5\x25\x08\x23\x11\xd9\xd3\xe8\x13\xa2\x95\x72\xf0\xa5\xab\x01\x54\x00\x30\xc6\x66\x6e\x8f\xd9\x98\x76\x8e\x1e\xd7\x32\xbb\xbb\x63\x92\x6b\x4c\x19\xd5\x04\x6f\x60\xa7\xac\x03\xed\xdd\xc9\x86\x7c\x7a\x0d\x7c\x54\xed\xfe\x91\xbd\x4f\x64\xc7\x6f\xae\x0b\xcd\x3e\xdc\x10\xd5\xfc\x48\x2d\xa7\xe7\x35\x9c\x50\xf1\xcf\xb6\x4d\x4f\x7d\x35\x3a\x34\x9f\x06\xed\xb9\xcb\xbe\x99\x59\x29\x78\xd9\xdd\xb5\x0f\x39\x43\xe7\xcb\x96\xda\x28\x4a\x54\x62\x5d\xb9\x17\xa3\x46\xa6\x4a\xc9\x28\xf8\x0f\x30\xb8\x6e\x8d\xc3\x0b\x9b\xe8\x78\xda\xe1\x37\x7a\x21\x10\x16\x4b\xdd\xdf\xb8\xfa\x51\x39\x99\x2d\x08\xb1\xde\x53\xc6\xae\xcf\xd5\x05\xe8\x28\x7e\x26\x68\x2f\x69\xfd\x82\xc4\x89\x2e\xc5\x7b\x92\x9a\x53\x1b\xa5\x85\x04\x7b\x39\xeb\xcc\x3f\xe5\x8f\x81\x6b\xe8\xed\x58\xf6\xd3\xfc\x81\x89\x98\x0a\x46\x9c\xd5\xd8\x44\xb3\x7f\x5a\xb5\x56\x30\x42\xb4\x10\x7a\xe3\xf1\xc3\xd9\x52\xa1\x66\x39\x78\xf5\x62\xa7\x80\xba\x3c\xcb\xd7\xd3\xea\xe1\xe5\x71\xa7\x23\x3a\x74\xca\xce\x3c\x34\x61\x1a\x7c\xd8\x9b\x06\x44\xa8\xa7\xa5\x8e\x70\x5b\x9d\x8d\x36\xe3\xc0\x1f\xe5\x85\x6d\x58\x0b\x81\x49\x34\x96\xde\x97\xed\x24\xbe\xd2\x9c\xef\x69\x2a\x58\x21\x1a\x18\x12\x92\x0f\x8f\x0f\x83\xa6\xbe\x9d\x40\x36\xc6\x9b\xd0\xf7\xef\x22\xd0\xe8\xae\x32\x3b\x18\x2d\xa5\x21\xfd\xcf\x97\xa5\x15\xc4\xec\x92\xac\xc9\x2b\x44\x2f\x98\xf1\xd6\x74\x11\x00\x45\x17\x53\xf4\xed\x9b\x8b\x46\x59\x2b\x33\xdb\x94\x3b\x0d\xe1\x65\xfb\x97\xa9\xdb\x2d\xd0\xca\x0b\xbb\x3e\x34\x99\x19\x04\x0a\x80\xdd\x9f\x83\xda\xc5\x65\xb7\x09\xdb\x8d\x1e\x4d\x2d\x37\x50\x53\x73\x73\x3e\xe1\xcc\x46\x89\x55\xeb\xb1\x2d\x78\xa1\x07\x67\x5b\xf0\x3e\x0d\x4a\x51\xe9\xe5\x76\xcf\x35\xf8\xd1\x91\xbc\x0f\xc3\x25\xc9\x56\x87\x29\x09\x7a\x88\xe0\xed\x74\x69\xf1\xcf\xb5\xfa\x1b\xf5\x0b\x00\x15\xe3\x29\x5f\x9f\x23\x79\xe3\x80\xdc\x64\xdd\x17\xce\x4b\xd7\x76\x8a\xb6\xf3\x36\x81\x27\x2d\xad\x35\xa6\xe5\x47\x42\x0f\xeb\xe0\x0c\x30\x3d\xc7\x1c\x13\xfa\xb0\xdb\x5a\x3f\xbc\xdc\xa5\xef\x7e\x5c\x2f\x2b\x4c\xf6\x69\x08\xfc\x87\x3d\xd4\x86\x56\xdd\x67\x6a\x5c\x53\x1b\x4f\x83\x72\x26\x44\x2e\xb8\x64\x77\xf5\xf6\x8e\x27\x1a\x89\x62\x68\x6e\xa9\x0e\x2f\x06\x1b\x9b\xa8\x48\x58\xac\xd4\x12\x4c\xb4\x35\x46\x03\x09\x26\x8c\x45\xd0\x6a\x0b\x62\x36\x49\xc7\x4e\x19\x85\x1a\xca\x1b\xe3\x45\x4d\x9a\x24\xf0\x5f\xfe\x6c\x1c\x9e\x5a\xe9\x7e\x57\xc3\x07\xce\x9e\x11\xc2\x8f\xa0\x06\xe6\x00\x05\xe5\xf1\x6e\x33\x84\x01\xc6\x0a\x34\x7e\x2b\x0b\x63\xb8\x0e\x73\x5a\xd4\xf8\xd7\x1f\xa4\x36\x80\xaa\x44\x33\xa2\x8c\x2f\xc2\xc5\x66\x02\x18\xdf\xc5\x68\x19\xe3\x6b\xf6\xbf\x33\xfe\x70\x38\x67\x6b\x8f\x35\x8a\x79\x7f\x75\x29\x4f\x4e\x0c\x9e\xbd\xa8\x25\x78\x42\x0c\x95\xaa\x7b\x93\x9d\x43\x8e\xab\x33\xef\xd4\x86\xc2\x81\x53\xd6\xec\x17\x96\xa3\xce\x58\x09\xbc\xda\x6a\xcd\x80\xf9\x13\x0c\x9e\xb3\x0a\x8d\xe1\xb1\x90\x3e\x77\xd7\xea\xff\x94\x76\x2d\x9a\xba\x7b\x83\x39\x5f\x46\x90\x35\x1e\x9a\x0c\xdb\x1f\x0c\x8e\x2a\x9c\x74\x6b\xda\x4e\x97\x67\x69\xa6\x1d\x54\x72\x2f\x79\x91\x35\xc2\x72\xdd\xe9\xf9\x2c\xfc\x82\xac\x31\x46\x46\x8c\xb0\x01\xec\x2e\xc7\xda\x19\xb2\x4b\x24\xa1\x21\xd1\x19\x08\xeb\x2d\x35\x34\x27\x86\xd7\x27\x11\x26\xdb\x74\x6b\xc6\x56\xfe\x40\xd1\x69\x56\xb5\x0a\x14\x86\x11\x58\x2c\x22\xfe\xe5\xb5\x62\x27\x28\xda\x35\xb6\xad\x2a\xe7\xcc\x52\xcc\xd2\x6f\xec\x6a\x94\x4f\x30\x28\x77\x9c\x9a\x00\x1c\x7e\x32\xc5\xa1\x9c\xf1\x04\x83\xd2\xba\xc6\xbb\xc1\x44\x81\x2e\x37\xa1\xe4\x3e\x57\xd8\xda\xe3\x2c\x32\x95\xa3\xf4\xfd\x52\x18\x80\x0a\xc2\x10\x9a\x48\xbe\x58\xdc\x61\x9f\xe6\x61\xd1\xcb\xe7\xd8\xd0\xe1\xe4\xf6\xf2\x3e\xac\xed\x67\x81\x3d\x0c\x6c\xe8\xa9\xb4\x5f\x22\xb0\xfe\x1f\x7d\x7f\xb3\xb6\xdd\x61\x56\x13\x87\xe8\x16\x42\x3d\x46\x4b\xef\x5a\x46\xef\x49\xbd\x1b\xb5\x3a\xb8\x0b\x53\x4f\x2b\xfa\x6c\xf8\x34\xe8\x6e\x0d\x99\xdd\x46\xbb\xb3\x0b\xc1\xf7\x77\xce\x15\xd8\xd2\x41\xda\x2a\xf9\x8c\x8e\x92\xf5\x8a\x1f\x69\xc8\x8c\x2e\xb0\x4e\xfe\x83\x74\x9f\x48\x12\x08\xa4\x07\xbc\x9e\x58\x51\x57\xe5\xca\xde\xf4\x5c\xc0\xf4\x2c\x20\x96\x1e\xfd\x48\xde\xbf\xf5\xc3\x97\x18\x55\xae\xf4\x69\x7e\x49\xda\x81\x35\x56\xf1\xa8\xfb\x02\xba\x23\xd4\x60\x73\x34\xf6\x4b\x4a\x5c\x02\x9f\x31\x51\x76\xb1\x35\x5e\x49\x59\xb7\x7b\x0c\x80\x0b\x15\x54\xa7\xa7\xfd\x86\xf0\x84\xac\xa2\x17\xc3\x48\x6e\x97\xd8\xa8\xe7\xcc\x4f\x8e\xd7\x42\x46\xd4\xc1\x93\x66\x87\xce\xf6\x19\x38\xbf\x5e\xa0\xbb\xb9\x31\xc9\xb5\xc8\x50\x9f\x95\xf5\x6b\x41\x32\x68\x46\x5f\xba\x03\x65\xb8\x9e\xd0\xde\x97\xfa\x14\x17\xd2\x21\xb9\x4f\xcb\x0f\xa5\xdb\xed\x1f\xa7\x2a\x47\x4a\x9c\x98\x7e\x48\x99\x54\x6b\xae\x0d\x1d\x79\xb7\x4d\x6e\x6b\xcb\xe3\x76\x85\x20\x61\x69\x67\xf1\x34\x3f\x8b\x27\x0e\x6f\xa0\x40\xcb\xab\x4f\x38\x89\x1e\xc3\x87\x2e\x8c\x2f\x89\x0f\x60\xb7\x57\x3b\xbd\xe5\x54\x77\xbc\x6f\x38\x5c\x00\xa0\xbb\xcc\xf7\xf5\x1e\xae\xb8\x71\x9f\x32\x29\xa2\x50\xa9\xa0\xff\xd7\xf1\x60\x21\x1f\x84\x89\xe9\xb0\xf0\xa0\x5c\x1c\xbe\x6f\x3e\x5c\x80\x3b\xa1\xfa\xce\x40\xa6\x3b\x58\xae\x2f\x5b\x32\x66\xdd\xb8\x9d\x8e\x20\x82\x55\xe1\x45\x09\x2b\xd7\x18\xd7\xb4\x8c\xd5\xe9\x2b\x68\xd5\xff\xb4\x16\x1d\x0f\x78\x45\x9f\xea\x95\x28\xe4\x11\xc2\x39\xa5\xe6\xa9\x1e\x6a\xf8\x0a\xf9\x0b\x81\x0e\x42\x7a\x72\x14\xa2\x4f\x1a\xf9\x02\xb0\xa8\x88\x53\x70\x3f\x66\x10\xe3\x70\x66\x39\x97\xb4\x91\x6b\x58\xf8\xd4\x5d\x09\x0e\xa5\xec\x65\x99\x17\x64\xf3\xf8\xca\xd2\xf7\x9f\x54\xd5\x48\x84\xbe\x14\xf6\x71\x0b\x1e\x7c\xb8\xdc\x46\x0f\xd3\x79\x1b\xbd\xd4\x5d\x43\xc3\x2a\x66\xf6\x52\x92\x54\x9f\x6a\x44\xe4\xea\xaf\x67\xfd\x2f\x5f\xc6\x0f\x42\x89\x85\x06\x56\x3e\xb0\xa7\x87\x88\x50\xad\xeb\x0c\xe0\x58\xbf\xa3\xe1\x2a\xd7\xb2\x32\x4c\x86\x4a\xc8\xd3\xad\x64\xaf\xd8\x9e\xe2\xf7\x29\x97\x04\xc3\xdd\x7b\xf2\xe8\x7a\xe5\xa1\x16\xbb\x9d\xcb\x37\x16\x7c\x3b\xa2\x17\xd6\x62\xf7\xe6\xab\x83\x8b\x63\x92\xfd\x23\x3e\x6d\xf2\xdc\x39\x20\xc9\x6a\x3d\xf2\xf3\x86\xd5\xf9\x9e\x61\xbe\xc3\xbd\x5d\x68\xd1\xbc\xbc\x72\xd8\xef\xbe\xb5\x2e\xf8\xb4\x9b\xf4\xfa\xe8\x9e\x08\x2c\x40\x74\xa7\xd7\x11\x23\x09\xad\x3c\x4a\x8d\xa7\x8a\xbe\xe4\xe1\xce\x87\xfd\x47\x54\x34\xaa\x3f\x31\xa1\x5e\x6e\x07\x83\xdf\x92\xf4\x04\x20\x8a\xf2\x2c\xc6\xff\xd5\xc2\xad\xea\xd7\x45\xe3\x8c\x8c\x45\x6f\x1a\xb7\xd9\x13\xe7\xfb\x14\x03\xbd\x3f\x2c\xce\x31\xf7\x6f\x88\x7e\x01\xa2\xda\x48\x08\x74\x9e\x14\xd6\xcb\xd1\x43\xcb\x44\x2f\x56\x52\x34\x32\xa8\xa1\x49\x88\xd7\x6d\x60\x76\xd3\x6d\x56\xf9\x7f\xbc\x02\x5f\xbd\x03\xef\xb4\xf8\x62\xdf\x3b\x70\x1c\x5e\x86\x9d\x45\x74\x0c\xdb\x18\xc7\x8c\x3b\xbc\x71\x3f\xb0\xa5\xff\x34\xb1\x52\xba\xbc\x37\xf0\x97\x7b\xff\x4f\x9f\x06\x42\x0b\x8d\xf5\x1f\xee\x3d\xf6\xbe\xc9\x31\x44\x61\x0a\x0d\x4e\x38\x05\xbf\x0b\x9a\x92\x60\x83\x58\xa4\xcd\x8a\x57\x15\x47\x37\x80\x25\xf8\xc4\x14\x04\x9c\x37\xb1\x72\x0e\xc9\x70\xd1\xb2\xfd\x4c\xae\x28\xb5\xc2\x7d\x8b\xbe\x35\x22\x2a\x8b\xeb\x1d\x1d\x05\xe7\x91\x30\xef\xe6\x2e\x82\xad\x47\x1e\xe8\xf2\x4a\xcb\xdc\xb4\xf5\xcd\x78\x34\x29\xf2\x21\x96\x08\x1f\x6e\xb9\xc3\x28\xd5\x3a\xab\x13\x7e\xac\x51\xbd\xc4\x61\xfc\x0e\x88\xba\xd4\xbf\x6f\xa3\xe5\x5c\x38\x72\x2e\x6c\x1b\x8d\x32\x28\x16\x3c\xa5\x6f\x65\xf1\xf1\x91\x9d\x34\xca\xe1\x88\xe4\xb4\xb7\x6b\x02\x44\x3b\x3b\xd8\x3b\x2d\xa1\x7a\x8c\xf8\x0c\x3a\x0c\x92\xec\xc4\xc2\xbf\x4e\xbe\xd4\x2c\x26\x5e\xb1\x24\x70\xd0\xe1\x2f\xb3\x2d\x06\xcb\xbb\x92\x5f\x3a\x4d\xc6\x34\x8e\x92\x1a\x3f\xde\x61\xfd\x6c\xf3\x63\xbb\x60\xb3\x83\x91\xee\xc3\x6f\xbf\x2c\x2a\xb4\x20\xc0\xff\x1a\xf5\x17\xcb\xf8\xa7\xbf\x04\x81\xd3\x86\x02\x8b\x34\xe9\x25\x9e\x3d\xb0\xb9\xda\xf7\xeb\x97\xdf\x98\x45\x94\x9d\xb3\x20\xfd\x3a\xcb\xf0\x1b\xed\x16\xc5\xd3\x6f\xa8\x43\x5a\x43\xc9\x07\x94\x68\x3c\xf7\xd7\xa4\x90\x2b\xb3\x2e\x94\x54\x75\xcf\x37\xf2\x89\x73\xb1\x2a\x6f\xbc\x47\x2f\x42\x7b\xac\x60\xe8\x9f\xf5\x28\x02\xa3\x78\x7e\x9b\xa0\x3b\xe5\x1c\xdb\x94\x97\x57\x6c\x7b\xcc\x31\x12\x2e\xf5\xad\x8f\xf5\x7c\xbb\x8e\x15\xba\x26\xde\x42\xa1\x18\x64\x60\x1e\x86\x29\x72\x0e\x7d\xe3\xfb\x75\x9a\x9a\x17\xd3\x31\xca\xcf\x52\x53\x3e\x14\xd3\xb8\xde\x30\x7c\xec\xd0\xbb\xed\xc3\x6d\xe2\xf3\x06\x73\xf9\xff\x64\x63\x7e\x0f\x95\x0b\xb1\x3d\xf5\x09\xd3\x72\x0b\xe9\xd5\xb0\x98\xb8\x0d\x51\x95\x19\x98\xee\x87\xa5\xcb\x48\xb5\xc6\xf1\xba\x9c\x81\xfd\xdf\x39\x58\x7e\xe2\x06\x94\xa1\x21\x4f\x03\x67\xbe\xc4\x65\x30\x37\xbd\xff\x99\xe1\x8f\x47\x29\x24\x3b\x47\x12\x23\x19\xfe\xcb\x6d\x85\xeb\x2c\xe1\x71\xaf\xc2\x6f\x07\xb3\x11\xd0\xc1\x59\x57\xaf\x16\xe9\x98\x76\x82\x88\xd1\x97\x07\x22\xe0\x1d\xd3\x0d\x7d\xe0\x8c\x5a\x5d\xd6\x75\x4b\x8f\x73\xe5\x79\xf6\x05\xec\xd5\xf2\x72\x70\x34\x73\xef\xf7\x0f\x82\x0e\x76\x1a\xdc\xb4\xe0\xa4\xe0\x92\xea\xce\xdd\xc7\xe4\x3a\x61\x8e\x1a\x37\xd4\xda\x46\x0a\x90\x95\x64\x7e\x73\xa1\xff\x2e\xc8\xb7\xfc\x0d\x36\x36\xbe\x16\x4a\x41\xe0\xce\x57\x95\x07\x21\x0d\x9a\xc0\x38\xfd\x2c\xa6\x5f\xca\xea\xe9\x20\x99\x34\x9f\xf8\xf7\xfa\x98\x44\x21\x7b\x9f\xf2\x85\x93\x07\x0b\xac\x33\xb9\x09\x1a\x9b\x86\x32\x21\xed\xf7\xcb\xca\x02\x76\xf3\x11\x20\x97\xbb\x44\xfa\x2d\x4c\xa3\xee\x46\x64\x96\x77\x22\xef\xdc\xbe\xc0\x71\x30\x82\x8c\x29\xfc\xcb\x55\x6b\xf1\x28\x43\x12\x39\x23\x2a\x60\x50\x5b\x2d\xd2\x94\x89\x24\xfd\xac\x04\x9a\x4c\xdf\x04\x87\x85\xc6\xce\x6c\x43\x98\x33\x6b\x1d\x1a\x4c\xf2\xa9\xd1\x01\xce\xd1\x1b\x20\x76\x2a\xef\xd6\x27\x42\x10\x8b\x65\x66\xcd\x5b\xca\x6a\xb1\xfe\xe2\x92\x67\x1a\x5c\x33\x14\x37\xe9\x4c\xcc\xce\x20\x3c\x51\x03\x9e\x97\x2b\xd4\xcb\x4c\xb1\x79\x2a\xac\x37\x42\xa1\x47\xba\x18\xf9\x03\xcc\xc4\xee\x71\x93\x3e\x73\xc5\xd4\x17\x21\x58\x86\x95\x4d\x20\x99\xb4\x76\x4b\xa6\xee\x7d\x6e\xfb\x8f\x77\x66\xca\x34\x24\xed\x0d\x64\x3a\xfc\xb4\xb8\xbe\x56\x75\x7c\x90\xbb\x67\xbc\xad\xcd\xfe\x4b\x7f\x51\xaa\x7f\xb9\x2f\xff\x27\x95\x8e\x0a\xc0\x72\x76\x5e\x66\x38\x0e\x0e\x5d\xf2\xc2\x6f\xb8\xbd\x32\xbc\xcb\x45\xc7\xb8\xf0\xdf\xd8\x4d\x0c\xd9\xb3\xe4\x6c\xc8\x61\x19\x0b\xce\x04\x94\xc8\x9a\x9c\xef\x97\x91\xae\xc2\xf4\x37\xe4\xe4\x2b\x49\x12\xa2\x86\x60\x48\x0a\x39\x23\x3f\x8a\x42\x3b\x75\xb5\xd1\x6c\x35\x83\xf5\x1f\x02\xdd\x64\xfb\x4f\xb7\x3e\x6f\xbd\xcd\xb9\x69\xd4\x3a\x76\x39\xb1\xa3\xd5\x68\x24\xf9\xc6\x95\xe2\xb8\x11\xfb\xa6\xf8\x75\xcf\x3c\x20\x7a\x14\x15\x6b\x16\x53\x6f\xac\xae\x8e\x59\x11\xda\x0e\xc9\x25\x62\x8a\x25\x94\xc5\xb6\xbf\xac\x99\x82\x36\x17\xbc\xc4\x93\xb6\xf9\x8b\x1d\xff\xcb\x87\xf2\x13\xc7\x85\x42\x0a\x00\x4d\xb9\x1b\x3a\x1f\xa2\x90\x77\xd2\x99\x3e\x0a\xb1\x48\x31\x6b\x6f\x4e\x9f\x00\xcc\x77\xdf\xa6\xd1\x57\x96\x82\x76\xe4\xc7\x8b\xe7\x00\x69\xe2\x9e\xb8\xe8\xbc\x82\x27\x04\x27\x24\xdb\xd9\x36\x3c\x90\xb7\xdf\xa7\x64\x80\xf3\x94\xe4\xda\x76\xcf\xf1\x59\x62\xa7\x08\x88\x8a\x4b\xb6\x15\x59\x1b\x30\x66\xd5\xfa\x7d\x34\xa9\xce\xcf\xc1\x4b\xa4\x52\xc4\x10\xa7\x39\x1d\x14\xc6\x1b\x5b\xf0\xb9\xde\x7a\x05\xa2\x7a\x8b\xcc\x86\xd6\xe7\x3a\xe4\x78\x82\x8b\x4a\x54\x47\xb7\x3b\xac\x10\x65\xa5\xa5\x85\xf7\x8a\xce\x89\x08\x8a\x25\x68\x38\x17\xfe\x7f\x37\xed\x5f\x8a\xfa\x41\x7c\xa0\x50\xc0\x67\x38\x2c\x3f\x02\x6a\xc4\x6d\x0f\x47\x8b\x1b\xc8\xd7\xcf\xce\xcc\x34\xe9\xe7\x01\x96\x90\x4d\x85\x19\xfe\xb2\x26\x68\x25\xdd\x62\x01\x40\x89\x61\x84\xf4\x42\x27\x8e\xb1\xf7\x68\x6d\x44\x99\x03\x93\xcf\xfd\xe6\xfb\xbd\x6d\x9b\xcf\x5f\x4d\xe2\x55\x0b\x50\x2d\x7b\x90\x80\x58\x2c\x21\x3f\xc2\xcf\xe5\x6b\xd2\xbe\xfb\xe2\x8a\xc8\xda\xa8\x62\x2c\x2c\x3f\xf8\x4d\x18\xc4\x4d\x65\x14\xa1\x0c\x2d\xe8\x4b\x24\x21\x40\x94\x97\xeb\xa1\x20\xb8\x3f\xbe\xf1\xd7\xb0\x91\xcf\x02\x69\x8b\x85\xc7\x54\x8a\xeb\x65\x0b\x9d\xa8\x5a\x57\xde\x9e\x6d\xfc\x92\xe3\xe5\x2c\xcc\xff\xce\x9b\xf5\x83\xe0\x41\x89\x18\x03\x06\x8a\x9c\x85\x60\xf8\xb1\xf4\xaa\x9f\xa0\xb6\x28\x7e\x92\x3a\xf6\xc7\x92\x19\x32\xe1\x9a\xe0\x5c\x0e\xc9\x28\xf9\x6f\xf4\x8f\x0f\x20\xe2\x6f\x73\xf7\xdd\x7b\x1e\x1d\x61\x9a\xe4\x8e\x85\x8f\xfd\x50\xaf\x3d\x34\xd8\xe0\x2a\x63\x0c\x61\x85\xd1\x3b\x1f\x56\x18\xda\x12\xb4\x0f\xc5\xe9\xe5\xa4\x4d\xcd\x7a\xf8\xe4\x89\xd4\xf5\x0d\xf7\x51\x78\x93\x84\xbd\xae\x4c\x26\x45\x07\x77\xe2\x3e\x85\x0c\x07\x66\xa0\x4b\x11\xef\x55\xb7\xb8\x0c\x57\xd5\xeb\x22\x6b\xe8\x26\xd7\x29\x9a\x7f\x22\xb9\xde\x14\xe7\x3c\xbd\x88\xb7\xb6\xa7\x58\x25\xf7\x4a\x0d\xf8\x2b\x04\xeb\xc9\xbd\xcc\xbc\xf4\x54\x33\x51\x64\xef\xbb\x2b\x9f\x96\xd5\x85\xe1\x2d\xe5\x5b\xa3\x62\xe7\xb6\x77\xa1\xba\x29\xed\x06\x88\xbb\xf5\xa3\x6f\x9b\xbe\xd3\x71\xd6\xb6\x4b\x86\x85\x78\x22\xb9\xc1\xb2\xb0\x51\xbd\x7b\xcd\xb7\x1f\xd2\x2e\xc8\x1c\xac\x21\x9c\x31\x09\xe6\xb1\x4d\xae\x69\xa5\xbf\x44\xd2\x7f\x8f\x55\x24\x79\xbb\x9a\x63\xc7\x7d\x32\xcb\xd2\x60\x75\xde\x6b\x0f\xf7\x55\x0a\xdd\x01\x9e\xe2\x6f\xae\xd5\x3f\x3d\x65\x88\x08\x14\x4c\x48\x00\x90\xe6\x4f\xc0\xee\xd9\x2e\xaf\xfc\xe1\x53\x68\x1b\x4d\x50\x6e\x55\x56\x48\x41\xdf\x5b\xa9\x97\xb9\xb6\x3f\x0d\x87\xe3\x96\x30\x3e\x03\x00\x50\x7f\xa1\x6a\xa2\x42\xf8\x84\xac\xeb\x27\x8f\xa6\xc5\xdc\x7e\x0f\x2f\x63\x5e\x38\x19\x64\x83\x7c\x7c\xa8\x59\x3b\x82\x18\xdb\x08\xf0\xd9\x25\x46\x74\xf4\x56\x22\xee\x2a\xac\x89\x25\x25\xc2\x09\x0a\xbd\x11\xc7\x9f\xc1\xa4\x26\xcb\xc6\x0d\xe3\xeb\x2d\xfc\xe9\x47\x90\x7b\xf8\x02\x05\xf9\x12\x61\x33\x97\xa9\x93\x1b\x4b\x60\x27\x17\x8b\x4f\x20\x2a\x37\x64\xa4\x27\xce\xdd\xc7\x26\x20\x84\x50\x25\x08\xec\x3b\x1a\x5f\x2d\xa4\xf3\x2d\x5d\x2e\xa7\xb3\xe6\x92\x8f\x7b\x4c\x91\x58\xf2\xfa\x6b\xe8\x61\xe6\xc5\xfb\x14\x1a\x0a\x5a\x9e\x21\x93\xeb\xbf\x3f\x85\x7f\xb9\xeb\x7e\xe2\x14\x70\x28\xc0\xcd\xf1\x36\x5b\xc3\x0f\x82\x0f\xc7\x77\xa1\x5b\x79\xec\x3a\x8a\xa0\x53\xd0\xd4\xd3\xe3\xef\xb9\x88\x8a\xa0\xb2\xa5\x5c\x83\x53\xf0\x02\x74\x80\x7e\x03\x05\xbb\x14\x36\xe5\xfe\xe9\xde\x17\x5e\xd8\xa4\x3a\x57\xbd\x50\x53\x80\x14\x15\x56\xee\xf1\x73\x52\x36\xf6\x3a\x04\xac\xdc\x9f\x2d\xce\xb0\xf5\x0b\xf9\xf2\x3b\xef\xe8\xe8\xd5\x54\xcf\xb7\xa0\x0a\xe9\xb2\x9a\xec\xb4\xab\xd3\xa2\x43\xe5\xb3\xae\x07\x15\x46\x40\xf4\x11\x52\x2d\x91\x84\xb8\x0c\x85\xab\x40\x11\xf1\xcd\x8a\xa4\xf8\x35\xc2\xdb\xce\x79\xf8\x96\x17\x92\x6b\x25\x9d\x77\x03\x7b\x4f\xdb\xfb\x4f\x9f\x5d\x9c\x10\x16\x1a\x70\x54\x76\xaa\x27\x33\xc2\x66\x49\x5d\x15\xa0\x93\x60\x3e\xf6\x95\x76\xa0\x59\xb0\xb5\x04\x67\x9a\x2b\xf3\x87\xc4\x5d\xf5\x61\x48\x1f\x01\x3a\xe4\xca\xc4\x90\xb4\xee\x89\xaf\xb9\x77\xb1\x0f\x42\xc7\x8a\x5d\x57\x93\x48\xc6\xcb\x19\x63\x26\x95\x32\xb7\x7c\x56\x66\x25\xc6\x01\x44\x29\x97\xda\x47\x25\x0d\x3c\x39\x14\xc9\x06\x47\x2f\xb5\xfb\x5b\xcd\xf1\xf1\x8a\xa1\x4b\x10\x72\x96\xc4\x94\x58\x82\x93\x31\x41\xe6\x99\x57\x86\xf3\xcc\xd8\xc4\x46\xa8\x7b\x2b\x9d\xdd\xad\x36\x62\x05\x63\x79\x80\x0d\x1b\xf9\xa8\x64\xb4\x3b\xb4\x30\x12\xdd\x0e\xf8\xcf\x8f\x25\xa1\xec\x10\x39\xc7\xdb\x97\x5b\xf9\x7e\x10\x2c\xad\xb9\xb1\x9a\xf8\x33\xf0\x59\xa4\xf4\x5a\x5e\x40\x9e\x70\xbf\x5b\x78\xdb\xdf\xe2\xe3\x7f\x36\x35\x1f\x68\x6f\x1b\xbf\x3f\x70\x8e\x7f\x96\xcb\x33\xd0\x61\x13\xe4\x59\xb7\xf4\x95\x88\x4d\x76\x5b\xff\xc5\xc2\x09\xb9\xf4\x83\xdc\x3e\x8e\xfc\xa7\xf8\xf8\xb3\x34\xcc\x9e\xba\xa0\x8b\xdf\x46\x37\xb7\xb6\xb1\x9c\xc4\x0f\x58\x92\x36\xb0\xd0\xb2\x27\xde\xde\xc8\xbd\x8d\x3e\x0f\xd9\x00\xab\x64\x0b\x07\x99\x0b\xfd\xf4\xc5\x42\x6b\x40\xa1\x71\xa8\x4b\x71\x4b\x17\x12\xde\xe0\xc4\x11\xf3\x48\x7c\xca\x97\xaa\x06\x54\x49\x10\xe6\xc2\x76\x9a\xc6\x20\x8d\xfc\xf0\xf0\x5e\x00\x65\xc1\x8f\xde\xf3\xdd\xdb\x8b\x71\x37\xb1\x32\xf8\x8d\x0c\x87\x62\x77\xf2\x87\x6b\x34\x80\xa9\x04\x81\x3d\xf7\x7b\xf1\x83\x5e\xee\x08\x17\xe5\x2b\xf7\xac\xc8\xad\x9b\x19\x2d\xf3\x2b\x28\x3c\x5b\x44\xe3\xda\x29\xf7\x05\x6d\x30\x2a\x53\xf3\x56\x0f\xe0\x9b\xe4\x61\x8a\x33\x46\xdc\x95\x79\xf5\x3b\x59\xf7\x62\xc5\xbf\xb8\xa1\x39\xb8\xac\x2a\xb3\x94\x1d\x33\xe6\x37\x20\x1a\xb9\x3f\x93\xc4\x49\x97\xaa\x91\x7b\xc8\x96\x18\x2a\x6a\xed\xc6\x73\xab\x58\x1a\x0d\xbd\x00\x6f\xd6\xf0\x5b\x47\xfc\xeb\x98\x01\x10\x95\xe2\x4a\x36\xf4\x1e\xf5\x21\x34\x2b\x86\xb2\x23\x45\xce\x97\x3d\x0e\x88\x98\x3a\x59\x2b\x76\xc1\x40\x8f\x10\x9e\xd9\x96\xac\x01\xa0\x00\xdf\x8d\xff\xcc\x27\xc6\x8c\x7e\xf8\x3f\x6d\xcc\xa3\xd0\xc2\x0d\x25\x4b\x46\xc2\x76\x32\xef\xc2\x5a\x58\xc7\x1b\x91\x45\x81\xc2\x0b\x2f\x14\xe6\xa2\xae\x6a\x92\xa8\x98\x8f\xd3\x75\xd2\x1c\xc9\x43\xef\x31\x7f\xf9\x8d\x26\x23\xdd\x84\xb0\xf7\x05\xf3\x5d\xfd\xd6\x07\x30\x21\xbf\xa1\x8b\x6f\xf1\x02\xdc\x4b\x06\xb9\xd9\x1a\xd2\xfd\xc1\xee\x1a\x86\x12\xa8\xe4\x9c\x76\x16\x8c\xc3\x55\xa3\xe5\xe1\xa1\xab\x40\x7e\xa2\x26\xa7\x5c\x09\x9b\xe5\xcc\x09\xd7\x26\x7f\xa9\x10\x63\x53\xbe\xbc\x80\x40\xc3\xac\x88\x77\xd4\x71\x4a\xd5\x81\x42\xd4\xe2\x93\xe4\x7c\xf4\x3c\xc1\xa8\xa1\x1f\xdb\x05\xa3\xd0\xc6\xf7\xb7\x8a\x8c\x5d\x9e\xf8\x83\x94\x31\xa1\x8b\x29\xcf\x7e\xc5\xca\x54\x89\xb0\x00\xd3\xcb\x9a\xa9\xea\xdc\xa0\xc4\x7e\x2d\x9e\x4f\x62\xa6\xb2\x6d\xa1\xc0\x0d\x6f\x91\xb5\x91\x5d\x2f\xb5\x36\x48\xe1\xb2\xa2\x94\x07\x7a\xe3\xbb\xd8\x4b\x19\x37\x5a\xc2\x6d\x8b\xca\x55\x46\xc3\xb7\x57\xd6\xe4\x9e\x87\x25\x55\x30\x79\x30\x19\x25\xaf\xc1\x04\xfb\x0a\x00\x89\x24\x3f\x63\x09\xc5\x0b\xbf\x3a\x71\xf8\x71\xe6\x0c\xf8\x12\xd9\xa1\xc9\x1f\xe9\x48\x41\x11\x48\x93\xe8\x68\x98\xb7\xc6\xa8\xfc\x06\x6b\xd5\x46\xb1\x4e\x51\xbd\x75\x92\xd7\x9a\xed\xb2\x36\xdc\x2d\x2d\x46\x66\x60\x7e\x2d\x54\x24\x12\x3b\x7b\x29\xac\x8f\x70\xe9\x9a\x67\x0b\x04\xfa\x04\xa1\x4b\x87\xf7\x7b\x37\x66\x0a\x14\x08\x4a\x95\x22\x41\x73\x42\x5e\xaa\x52\x08\xbc\xe5\x05\xa1\x94\x24\xbe\xee\x43\x92\xe0\x39\x49\xd2\x6f\x3c\xd4\xfa\x66\xd1\x61\xd1\x3b\x21\x6f\xa3\x68\x46\xb1\x90\xdc\xe3\x69\x90\x97\xa7\xac\x9f\x5d\x54\x83\x47\x96\x04\x94\x5e\x87\x7d\x03\xdd\xe0\x6c\xa8\xa8\xb8\x0b\x1b\x7f\x18\x6e\x17\xbc\xd6\xd0\x97\xdf\xca\x9d\xaa\x86\x05\xcb\xc1\xbb\xdc\x91\x54\x87\xfa\x34\x7f\xf6\x3a\xc7\x70\x27\xef\x4c\x80\xc7\xc5\x82\xf6\xfc\xa8\xc2\x05\x8a\x87\xb0\x0d\x4e\xa2\x8b\x02\x59\x75\x1f\x7c\x6a\x48\x1b\x50\x3d\xf2\x38\x07\x26\xb6\x47\x80\x66\xd2\x5a\x8e\xd2\xea\x75\xb3\x3b\x74\xa9\xee\xb1\xb2\x7f\xba\x37\x89\x6f\x7d\xc9\xd7\x2c\xbf\x35\x49\x60\xf5\xb3\x32\xa5\x5f\x74\xd6\x32\x3a\xbc\x45\x1f\x3d\xe7\xa3\x96\x29\xae\x37\xd4\x76\x0b\x84\x7e\xbf\x3b\xb2\x43\xa0\x1b\x37\xd9\x0b\x14\x27\xca\xaa\xc7\x57\xce\xd1\xdf\x9f\xdc\x0b\x3c\x24\xfb\x3e\xe7\x82\xb6\x67\xb0\xa7\xe5\xac\xb6\x4f\xca\xbb\x79\x90\x3b\xee\x64\x62\x0f\x60\x47\x9d\xb4\xe4\x64\x92\x9e\xf6\xdb\xbe\xa5\x72\x65\xfd\xe5\x86\xd5\xb8\xf8\x62\x57\x5f\x64\xbb\xe8\x28\x27\x6b\xc2\x09\xd4\xc3\xc1\x85\x6a\x2b\x46\x3e\x76\x94\xb0\x52\xef\x98\xff\xde\x88\xcb\xfc\xf6\xce\x22\x29\x03\xc5\x25\x59\x04\x97\xdd\xb8\x94\x93\x68\x60\x5f\xe4\x69\xa3\x22\x34\x8f\x8b\x51\x86\x0f\x26\xb0\xb2\xc7\xf2\x33\xda\x42\x5f\x3a\xc0\xbe\xe2\xd2\x95\xe1\x7e\xf1\x83\x90\x4a\x7f\x96\xa7\xcf\x04\x48\xce\xbc\xcd\x8c\x84\xdf\x35\x83\xf4\xc3\x6d\x9e\x11\xac\x62\xdd\xcc\xe1\xf6\x97\xd8\x45\x2d\xb2\x2f\x57\xfb\x7e\xc2\xde\xb1\x8e\x01\x76\x3f\x63\x1a\x3d\x6a\x82\x99\x2f\x53\x36\x9e\xf9\x76\x80\x31\x0c\x33\x8a\x81\xfd\x47\xee\xd6\x23\xc7\x84\xd0\xda\x4f\x4f\x15\x61\xa0\xa0\xfb\xf9\xcb\xee\x2c\xe2\xde\xef\x5b\x43\xe2\xda\x28\x65\x71\xaa\xeb\x57\xf4\x6e\xc4\x5d\xe1\x18\xa8\xc6\x08\xa6\x21\xfe\x02\x8c\x2e\xc0\xa0\x0d\x6c\x4b\xd8\x24\x8c\xd0\xdc\xa8\x1b\xf3\xb6\x50\xb2\x53\x3a\x7f\x7e\x7f\x61\xb3\x51\xb7\xa8\xaa\x51\x6d\xd0\xcb\x46\x4f\xf4\x06\xae\xc9\x6a\x85\x9b\x38\x63\x0a\xa4\xac\xd1\xfe\xf7\xbc\xa5\x83\x96\x71\xaf\xcb\xe4\x4a\xe8\x4a\xdd\x4b\x9e\x24\x7f\x7a\x51\x37\x30\x29\xa5\x9d\x52\x48\x5e\xa6\x2e\xdd\xf9\xac\x36\x0e\x9e\xcf\xa9\xe0\x77\xdc\x64\x81\x7e\xdb\xa7\xc7\x0f\x03\xfd\x25\x5a\x90\x37\xde\xf5\xc0\x9e\xf2\x57\x08\x98\x25\xfb\xcb\xa2\x8d\x3b\xd1\xe8\xed\xb9\xae\x10\xb7\xba\xb4\x72\xf3\x16\x1c\x7b\x44\xce\x0b\x8b\x88\xa0\x9c\x03\xd7\xd4\xdf\xb1\x37\x24\x72\x7d\x9c\x24\x2d\xa4\x29\xce\x13\x4e\x6b\xfb\xd7\x2b\xf3\xc1\x85\x3f\xcf\xd6\xcf\x82\x7f\x6a\x35\x0d\xb2\x78\x3e\x49\xc6\x2f\x11\xcb\x57\xf6\x97\x1b\xe1\x55\x58\x0c\xb1\x9e\x71\x1f\xfb\xd2\x1c\xae\xf2\x37\x26\x8e\xd1\x07\x6e\x9d\x37\xc3\x2a\x58\x82\xe1\xa4\xcc\x19\xc5\xeb\x0c\x6c\x73\xae\x64\xc6\x28\x36\x02\x21\x44\x7c\x9c\x92\xeb\x36\x0e\x8d\xc7\x76\xd8\xe5\x2d\xaf\x68\x31\xeb\xff\xa4\x51\x76\xa5\x60\x72\x1f\x7e\xff\xca\x41\xa9\xcb\xec\x23\x25\x5a\xa8\x51\x6e\xd5\x36\x30\xdd\xc4\xa6\xbf\xb8\xfd\xe2\x0d\x17\x4a\x37\x20\xfa\x8e\x60\xd8\xa2\xf5\xd8\x8b\x06\x07\xde\xad\x9c\x8c\x18\x37\x27\x92\x71\xdf\x9a\xd6\x33\x6a\xc3\x58\x4a\x03\xce\x86\x4a\xea\xe4\x49\x81\x93\x5d\x7e\xe3\xc1\x01\xb5\xb8\x41\x4d\x42\xed\x73\x21\xb6\x37\x42\x1a\x6f\x0d\xa7\x37\xa5\x6b\xcc\xf9\x7f\x73\xfe\x5a\xeb\x00\x59\xa2\xd7\x9d\x82\x3c\xdc\x8c\xd4\xf8\xc1\x68\xad\xa2\x85\x09\x46\x18\x6c\xe7\xfa\xc6\xcc\x54\x27\xe7\xd5\x50\x28\x74\x9e\x2f\x2f\xc0\x26\x05\xd6\x47\x31\x15\xc7\xe2\x79\x5b\x83\x5d\x0d\x4a\xfc\x6a\xc3\x25\x5e\x65\x1e\x0a\x52\xa2\x9a\x96\xd6\xcf\xbc\xa8\x6a\xb3\x04\x38\x9e\xd6\x2a\xe6\x36\xdf\x84\x6b\xd2\xe1\xf7\x1b\xd3\x95\xca\x37\x78\x2b\x2f\x7c\x85\xd4\x43\x37\x24\xbd\xa7\xce\x09\x13\x4c\xe9\xf3\x74\x01\xe8\x36\xa3\x86\x2a\x2a\x2f\x94\xe7\xa7\x3a\x27\x4a\x69\xdf\xd7\x49\xae\x96\xb3\xb4\x46\x03\x9a\xa2\x85\x66\x25\x11\x4f\x54\x15\x36\x35\x70\xa9\xe0\x3d\x62\xde\xec\x52\x8d\x2a\xa8\xc0\xbe\xe5\x7c\xcd\x6f\x4c\x56\xb6\xf7\x87\xfc\xa1\x82\x90\x35\x7c\x81\xd1\x7d\x38\x7b\xe7\x01\x34\x3d\x63\x84\x6d\x0f\xfa\xd6\xec\x03\xb5\x3b\x24\xec\x41\x18\xf4\x3b\x84\xce\x89\x8b\xee\xa7\xf9\xbd\x56\xee\xa3\xfc\x9e\x96\xd6\x4f\x1f\xf5\xc6\xc3\x8b\x26\xc1\xd4\x90\xf9\xeb\x8a\x43\xd8\xd7\xb4\xca\x88\x0f\x07\x29\x77\x3c\x3c\xcd\x0d\x07\xb9\xdc\xf5\xe2\xb7\xd8\x35\xc0\x2f\x95\x07\x39\x28\x3f\x75\x1a\x99\xbe\xc2\xc8\x8d\x9a\x8a\x87\xf4\x35\x07\xb4\x17\x5e\xbe\x44\x72\x7b\x7e\xa4\x0f\x75\x38\x3c\x60\x7a\xa6\x54\xa9\x66\x73\xdb\xb8\xf4\x49\x60\x33\x1d\xa8\x14\x0c\xb5\xdf\xd8\x1f\xfc\x5c\xfc\xa4\xca\x57\x7f\x37\xf9\xd2\x99\x61\x9a\x00\xfc\xa8\x0f\x39\x96\x88\xa3\x98\x5d\xce\xb3\x33\xc7\x6f\xcb\xa7\x39\x08\x1a\xf4\x55\x2f\x96\x3a\x0c\x24\x3d\x90\x8a\xad\x5e\xdf\x67\x30\x01\xcc\xf7\x78\x7d\xf4\x9f\x2f\x76\x71\x3f\x16\x3b\x05\x23\x7f\xb0\x2e\xf1\x4f\xc0\x69\x49\x6e\x9a\xe0\xcd\x72\xd1\x3e\x57\x58\xe9\x24\x7b\x9a\x9f\xc3\x46\xd5\xdc\xab\xec\x47\xfd\xcd\xdd\x52\xd3\xe9\x4a\xf0\x7e\x6c\xc7\x57\xe1\x55\x93\x3b\xa3\x03\x5b\xf8\x69\xf5\xe1\xfa\x42\x60\xf9\x61\xf6\x9e\x13\x09\x47\xf6\xb0\x71\xb9\x3c\xbf\x67\xed\x40\x67\xf0\xca\x9f\x4a\xe1\x3c\x42\x8d\x18\xe7\x31\x58\x6d\xec\xcb\x04\xee\x74\x07\x71\xa2\x19\x73\x52\x11\x74\xb7\xbd\xf4\x0a\x01\x34\xe1\x71\x60\x9a\xce\xa9\xf9\x4a\x51\x0f\x09\x35\xc5\xb6\xc3\xf8\xdb\x03\xe0\x7d\x73\x50\xf9\xab\xe5\xc3\xdb\xf9\x1f\xdf\x8a\x9c\x30\x82\x06\x15\x47\x26\xb1\xc4\xde\xf3\xac\x42\x25\xfe\xdc\xa4\xd2\xc2\xf2\x87\xfa\x1b\x42\xfe\xcb\x97\xf0\x83\x20\x41\xc1\x83\x1c\x0e\xb2\x31\xab\x03\x35\x1f\xf4\x17\x1e\x1f\x9a\x9c\x35\x87\x02\x35\xb2\xf5\xcb\x03\x76\xdf\x0c\x29\x09\x6f\xe8\x58\x90\x22\xc6\x81\xad\x62\x7e\xe6\xe5\xf7\x16\x95\x2d\x96\xbb\x52\xdb\x87\xcf\x7a\x9c\x22\x21\x99\x55\x76\x74\xab\xca\x33\xb9\x9f\x9c\xb6\x15\x24\xca\x81\xad\xa8\x49\xb3\xbe\xae\x6e\x65\x31\xf0\x7f\xef\x80\x7a\xdf\x9e\xc8\xfe\x8a\x5b\x46\x6c\xbc\x02\xe1\xc3\x6d\xbb\x68\x4a\xea\x1c\xb7\x02\x78\x5b\x62\xe0\xd8\x14\x20\x9e\xe2\xfe\x74\x34\xa6\xd2\x8f\x6b\x8e\x75\x65\x86\x61\x7d\xbf\xc9\x72\x62\xdc\x27\x53\x16\xda\x08\x8b\xd9\xfe\xba\xf8\xff\xf2\x7d\xfc\xc4\x29\xb0\xc1\xc4\x29\xe3\x87\x41\x33\xa7\x65\xdb\x18\xdc\xe8\xb8\x1c\x13\x83\xc0\x2c\xd8\xe6\x4f\x93\xad\x53\xeb\x8c\xf8\xc6\xe8\xa4\x52\x73\xce\x60\xe1\x5c\xbd\x8e\xea\xf9\x5a\x56\xf5\x96\x1c\xbd\x3b\xbb\xb3\xa5\x89\x05\xb5\x87\xf5\x6a\x86\x50\x65\x9b\x70\x05\x89\xef\xfd\xc2\x69\x20\x99\x86\x24\xbe\x8b\x21\x9a\x3c\x8c\x22\xed\xe3\x6e\xec\x5b\xc7\xac\x56\xbd\x41\xbf\x3b\x6c\xf9\xbb\x3d\xe4\xae\x15\x2d\x2d\x94\xf9\x66\x40\xb4\x1f\x6d\x8f\x85\xed\x8f\x89\x98\xa1\x9e\x7f\xd3\xde\xf5\x85\x01\x71\xe6\xcd\x65\xab\x53\x82\xdd\xfc\xa5\x01\x04\x32\x2e\x7d\xf3\x77\xd3\xfe\x65\xd8\xfd\x20\xf0\x58\x50\x70\xc0\xa7\x39\xc3\x9d\xe8\x85\xee\x48\x38\x7d\xdd\x8a\xd9\x66\x6d\x21\x3b\x2c\x47\xb0\xd8\xff\xa3\x5c\x78\x23\x1f\x7c\x31\x2f\x99\x9b\x02\x36\xd5\x87\x0b\xed\x81\xd7\x21\x81\x43\x6e\x2f\x4d\x89\xed\x90\x7c\x9f\x10\x2b\xe3\xd3\x20\xc0\x58\x00\xfd\xae\x38\x27\x70\x3f\x26\x15\x2c\x04\x62\x76\x9e\x3c\x99\xc4\xb4\x87\x3b\xba\xee\xa6\x91\xe4\xf3\x2a\x10\x97\x7a\x95\x88\x69\x69\x47\xe0\x4b\xee\xfe\xa6\x54\x93\x14\x3b\x48\xac\xa2\xed\x62\x31\x21\xa5\xec\x3d\xc9\xb2\xef\xc0\x52\x45\x88\x5d\xd6\xbf\xf3\xfc\x8c\xe1\x18\x1d\x19\x3b\xf9\x48\xfc\xe6\x1d\xcd\xdf\x4d\xfb\xa7\x29\x16\x6f\x87\x12\x05\xbe\x6c\xad\xc8\x95\x63\xf4\x03\x32\x65\x00\x81\x8f\xe8\xc6\xa3\xb9\xba\x6e\xa3\x8a\x0e\x9f\x0e\x8d\xb2\x3a\x73\x91\x6a\xe5\xb0\x2e\x0d\xa8\xae\xb8\x2d\x99\xa2\xbb\xc6\x54\xcd\x60\xbd\x5e\x4a\xa7\xd7\xcc\x4e\x42\xde\xec\x1d\xb4\x4e\x3c\x51\x3c\x63\x5e\x9d\x12\x02\x98\xac\x8a\x2c\x09\xc7\xeb\x70\xfa\x9a\xeb\x4e\x50\x56\x64\xb2\x29\x54\x91\xa0\x75\xf0\x1d\x4e\x1d\x82\x61\xaf\x22\xbe\xbf\xa7\xad\x3e\x58\xd1\xc9\xce\x6e\x39\x2a\xee\x52\x88\x1c\x7e\xf8\xf3\xfb\x9d\xa1\xad\x6b\xef\xec\x6b\x59\x15\x55\x9d\x05\x21\xe9\xc3\x18\x3a\x2a\xcf\xf3\xa7\x0c\xc5\x7f\x58\x19\x3f\xf1\x10\x0a\x90\x06\xf6\xc6\x62\x15\x53\x5e\x36\xdd\xc6\xbe\x74\x7a\xc0\x7e\xe9\x35\x77\xaa\x25\xe7\x25\x6d\x8e\xd3\x41\x9e\xa3\x85\xd4\x56\xfb\x76\x07\xa0\x83\xa1\x5c\xf6\xdd\x26\x9a\x65\xf2\x6c\x48\xcf\x2f\x28\xd3\xae\xc2\x04\xa8\x10\x8e\x92\x59\xbb\x54\xdb\xf4\xb8\x26\x52\xa3\x9f\x20\xa3\xa7\x97\x62\xa3\x4d\x20\x53\x4f\x96\xe0\x61\x2f\xc7\x4a\xe8\xe2\xf6\xd9\x37\x67\xe9\x3f\xcf\x13\x02\xda\x97\x45\xb1\xbd\xf4\xc3\xf2\x00\xd1\x4f\x1e\xfd\x47\x52\xdb\x3a\xbd\xb5\xcd\x3d\xb3\x11\x34\x12\x58\x92\x66\x27\x76\xf1\xf1\x18\xc7\xb0\x3d\x53\x8d\x23\x2f\x02\x45\x2e\xbf\xc1\xfe\xef\x8c\xa2\x1f\x84\x30\x56\x1f\x09\x80\x85\x57\x6f\x53\x64\x59\x95\x93\xa7\x02\xa9\x1b\xfc\xf0\xa5\x50\x5d\x27\x6f\x46\x5e\xf6\xbb\x62\x5d\x8a\xe2\x08\x70\x39\x15\xca\xd5\x03\x4a\xb4\xa8\x48\x04\x1c\x38\x16\x6e\xf7\x63\xa1\xc4\x30\xd3\x61\x0e\x47\x32\x70\x84\xc6\x39\x78\xf5\x31\x7d\x53\x74\xdf\x7c\x94\xb0\x05\xfe\x8e\x8a\x92\x45\x2c\x91\xea\xdf\x51\x3f\xde\x31\xb8\x85\xf7\x7d\x8b\x23\xa1\x5f\x43\x82\xc7\xba\x7b\xec\x1c\x75\xaf\xe2\x5c\xba\x04\xaa\xb6\xce\xf7\x35\x2f\x76\x5e\x65\x56\x0a\xf4\xf8\x55\xc2\xf6\x9a\x99\xf0\xbf\xb6\x39\xf1\x63\x7a\x05\xa7\xdf\x66\xae\x8a\xc4\x2c\x4c\x08\xcc\xbf\x34\xe0\x32\x78\xde\xdf\x2c\x30\x28\x1e\x68\xe7\xf1\x0d\xe1\x40\x33\xff\x8d\xde\x8b\xe4\x36\x95\x2b\xec\xc1\x9c\x0c\x5c\x08\x88\x3d\xf0\xde\x6d\xf9\x2b\x4a\xdb\xf2\x0a\x64\x0d\x45\xcf\x19\xbe\x98\x4a\x19\x0f\x65\xef\x56\x5b\x4d\x67\x18\xa5\xf8\x28\xfa\xd3\x14\x44\x70\xad\x7b\xaa\xe8\x99\x06\x65\xd6\x23\x11\x2b\xf0\x08\x86\xaa\xde\x4f\xc1\xec\x93\xfe\xe8\xa3\x36\x1a\xad\x44\x5f\x62\xf9\x59\xd8\x05\xd2\xf7\x29\x28\xd3\xd6\xff\xf4\xa8\x5f\x4d\xf7\x60\xc6\xab\x25\x39\xa2\xe3\xc6\xa5\xcb\x7f\xc6\x46\x1b\x59\xd9\x25\x51\xe9\xbe\x02\xc1\xee\x40\xc1\x66\x78\x1a\xe8\x19\x8c\x00\xc8\x61\x15\x5e\x89\x56\xae\xc2\x95\x9d\x98\x33\xd3\xf3\x5c\xf3\xb3\x23\x69\x3f\x2c\xc9\xba\xbf\xe0\xda\xbf\xac\xb8\x1f\x84\xca\xc7\x87\x01\x00\xd7\xc6\x2a\xf1\x10\x38\xe3\x4c\x17\x98\xb5\x5e\xad\x0c\x30\xb9\xc0\x41\x53\x5b\x1a\xe0\x6d\x30\xce\x85\x1b\x48\xd1\xb3\xd1\x66\xbf\x03\xdf\xc0\x9c\x1d\x2c\xde\xf6\x19\x75\xf3\x47\xba\x32\xd5\xa7\x15\xc4\xcc\x7d\x67\x37\xcc\x79\x8f\xf6\xdb\x43\x81\xeb\x38\x4d\xea\x01\xcc\xb9\xc8\xca\xac\xe7\xf9\xb2\x9b\xc5\xad\xcc\xf8\x28\x73\xe9\x23\x4f\xdb\xa9\x45\xea\xb5\xbd\x39\x3d\xbb\xf8\x6e\x19\xe9\xb3\x6c\x45\x3d\xb0\xb7\xa3\xfa\xa1\x66\xda\x7e\xd9\xcf\x65\x1a\x1a\xec\xa0\xa2\x72\xef\x4c\xb9\x5f\x0f\xd2\xb4\xae\xf9\x30\x49\xcd\x22\x0f\xc6\xfd\x00\xde\xec\x8f\x82\x85\x55\x14\xb5\x22\xbb\x02\xbe\x07\x7a\xba\x3d\x5b\x49\xd9\x33\x4a\xec\xe9\xf3\xc8\x0e\xb9\xd1\xc1\x25\x5a\x44\x37\x13\x01\xe6\xff\x40\x90\x99\x14\x1e\x79\xe0\x1e\xba\xff\x51\x8f\x55\xeb\xf9\x12\x0a\x1a\xd4\x94\x2f\xd3\x3a\x4c\x85\xb9\xfe\xe0\xa1\x7d\x1f\x88\x56\xad\xbe\xd0\xbc\x55\xe0\x60\x56\x8f\xe4\xe5\xb4\xda\xb7\xf1\xa3\x7b\x67\xde\x43\xcb\x91\xaa\xb7\xf7\xd2\xd7\x23\x96\x9f\x94\x76\xf5\xef\x3b\xd1\xbf\xbc\x1e\x3f\x08\x15\x02\x14\x05\x00\xbf\xf4\x61\x09\x58\xdd\x86\x99\x4f\x5f\xdd\xbc\x84\xf1\xc1\xd9\x39\x0c\xbf\x9c\x82\x5b\x66\x0c\xb2\xbc\x9d\xc1\xac\xe4\xc4\x69\x9e\x05\x2d\x1f\xfc\x6f\x54\x3e\xee\x24\xb6\x43\x77\x2e\xe7\x62\x72\x5d\xc8\x28\xdb\x9f\x37\x4c\xdb\x3f\x36\x0c\x76\x83\xdd\xde\x31\xda\x81\x0d\xdd\x52\xdd\x5a\x76\xd6\x02\xe1\x86\x76\x6a\xf3\x46\x6f\x6d\xbf\xcc\x5b\xda\xb1\x7f\x27\x5e\xdf\xb3\xae\x5a\x3f\x32\x89\xb8\x8c\xdb\x07\x45\xf9\x22\x62\xbf\xd6\x33\xe8\x99\x19\xee\x66\xf3\x4d\x56\xa9\x7f\x7c\xb6\x37\x36\x47\xa6\xc6\x2e\xed\x5a\x61\x36\xd7\x4b\x06\x66\xca\xaa\x04\xd1\xd7\x6e\x2a\x9f\xa3\x9a\x57\x0e\x69\x7f\x43\x25\xaa\x13\x39\x2e\x4a\xcb\x91\x5a\x1d\xcd\xef\x2a\xcf\x9c\x6a\xed\xfd\xf3\xd7\x40\xfd\xcb\xa3\xf2\x83\xc0\xd3\xfc\xa7\xe6\x60\xf9\x56\xd2\x4d\xe1\xed\x25\x59\x2d\xd1\xed\x4f\xc3\xe9\xe0\xc0\x6d\x0f\x06\x12\x08\xa6\x61\xeb\x9c\x98\x37\xed\x1e\x6e\x3a\x48\x87\x53\xc0\xb9\xfb\x60\x1d\xe9\x95\x86\x1f\x7d\x75\x8d\x63\xec\x20\x2a\x87\xaa\x71\xe4\x2e\xf2\x4d\x67\x31\x52\xc5\x62\x5f\xd5\x77\x0d\x10\x7d\x1e\x0e\x45\x05\xbf\xeb\x25\x81\x05\xcf\xd2\x54\xfa\xf9\x8b\x61\x23\xa3\xa8\x47\x9b\x8e\xaf\xf5\xbb\x3f\xbf\xca\x9f\x93\xa7\x3b\x02\xa2\xb8\xde\xc6\x9c\xa5\xc3\xd7\x1a\x5f\xe2\x82\x7f\x7a\x60\x7d\x6c\x1c\x52\x36\x3c\x6d\x8d\xb8\x8b\xfe\x8a\xe6\x1b\x29\xd2\x73\x49\x7f\x59\xfa\xff\x32\x7b\x53\xae\x08\x60\x4d\x24\xeb\x0b\x6f\x82\x29\xe7\x36\x84\x05\xfb\x22\xb5\xf8\x0f\x16\x58\xd7\x3e\xa3\x12\x0a\xf3\x7f\x72\x53\xd4\xf2\x83\x7c\x7f\x7c\x7c\x4c\x06\xeb\xd9\xa2\xeb\xcc\x44\x8d\x35\xa6\xa9\xbc\xd4\xc7\xe8\x23\x91\x18\xf1\xe7\xc4\x9e\x28\x74\x14\x47\x59\x42\x68\x0d\x3d\x31\xb9\x86\x35\x02\x5b\x2b\x5d\x51\xdd\x7c\xfc\x55\x1c\xcf\xc9\x0a\x6f\x91\xe0\xf6\x9b\x22\x45\x70\x7b\x2a\x94\x73\x4a\x64\x6b\x97\xba\x6e\x50\x64\x2c\xf6\xc9\x15\x45\x22\xbd\x99\x2a\x2f\x12\x1c\xd3\x1a\xb3\x19\x1d\x87\x2c\x0c\x0b\x0f\xb9\xc3\x68\x6f\x0c\xee\xe4\xb2\x66\x77\xac\xc3\x29\x86\x3e\xdd\x08\xd3\x38\x98\x32\xba\x2e\x1b\xea\x8a\xf1\x58\xff\x4f\x11\x70\x3b\x51\xf5\x37\x41\x2e\x1c\x57\x33\xa8\xda\x89\x52\x3b\x99\x15\x8d\x4f\x92\xe6\xe7\xe3\xf7\x10\x32\xc5\x79\xc3\x5b\x52\xb5\xc8\x39\x7b\xac\x98\xe8\xd9\xb2\xfb\xad\xf3\x71\x84\xb0\x4f\x1d\x37\x62\xa5\x20\x27\xd2\x3d\xde\x96\x67\x9b\x3b\xa0\x4b\xeb\xf6\x4f\x79\x24\x6c\x57\x0f\x95\xbe\x3f\x21\x43\x14\x92\x9e\xd3\x3b\x82\xb4\xc7\x02\x39\x20\x5b\xaf\xfc\x27\xac\xcd\x5e\xdc\x44\xa6\xd5\xa9\xb5\x1f\x2d\xc4\x3e\x7d\xb6\xf3\x54\xda\xa3\x1c\x6e\x5c\xf1\x91\xe1\xd9\x61\xde\x3c\xe0\xb3\xcf\x1c\xb4\xf2\x39\x9c\x69\x4c\x1c\x64\x7b\xbe\xcd\xcb\x9d\x7f\x08\x33\xdb\x85\x86\xa1\x46\x7a\xb5\x49\x61\x60\x1b\x10\x8c\x03\x5a\x3c\x95\xfa\x15\xab\x87\x11\x89\xb6\x9d\x17\x53\x78\xee\xd8\xb7\x6a\x6a\xe6\x16\x2c\xbd\x3f\x07\xb7\x09\xa2\x56\x64\x2e\x4a\x13\x6c\xff\xc3\xcc\xb1\x85\x6f\xea\x97\x68\xc6\x32\x12\x4c\x98\x51\xcb\xba\xd1\x6c\xe0\x7c\x2d\xd1\x57\x85\x68\xe4\xd9\x28\xcf\x75\x08\x95\xc4\x01\xc2\x20\xfe\xd0\xbe\x4a\xfa\x5c\x12\xaa\x72\x6a\xe3\xa8\xbe\xc8\x08\x73\x9e\xf3\x73\xd0\x3e\x23\x1a\x55\xdb\xbc\x9b\x07\xe4\x67\x4f\xaa\x4a\x75\x71\xef\x34\xae\x53\x22\x10\xe2\x6b\x38\x84\xa7\x73\xdd\xdc\x61\x7f\x56\xf1\xf2\x6c\x8b\xed\xe6\xf6\xa5\x3f\x65\x64\x05\xa2\xeb\xac\x77\x88\xcf\xb6\x20\x73\x55\x39\x0e\xdd\x3c\x01\x88\xce\xac\x05\x7e\x18\x73\x3d\x29\x95\x25\x04\xa9\x7a\xfb\x33\xca\xf3\xff\xe9\x56\xbf\x72\x23\x16\x91\xc2\xf1\x0a\x41\xc8\x56\xec\x56\x9f\xfc\xf2\xd8\xe9\x22\x63\x76\xd1\x39\xea\xd1\x33\x42\x4b\x10\x06\xa6\x15\xec\xac\xef\x6c\xec\x64\x48\x2b\x1f\x60\x39\x1b\xf3\x2a\xe5\xd2\x2b\x13\xdd\x9a\xfc\x16\x1f\x0d\x5d\x48\x8c\xe4\x63\x86\x54\x1f\x89\x77\x0e\xd8\x31\x9b\x9b\xc0\xff\x78\x85\x9e\xb3\x42\x4f\xe4\xd9\x00\xfc\xb8\x21\xd4\x46\xdc\xf1\x5e\xc1\xc1\xbe\x37\xd3\xf9\xf2\x12\x93\xfa\x77\x80\xc4\xb1\xb1\x9c\x3e\x91\x55\x83\x57\x3b\xc6\x6b\xa4\x8c\x22\x34\x7a\x83\x7b\x20\xfc\xc1\xfb\xbd\xa1\x2e\x83\xc9\xbd\x87\x8d\x58\x2f\xc0\x5f\xc4\xca\x9d\x1a\x2b\x66\xfe\xe4\xf4\x9a\x42\xed\x54\x49\xb0\xc4\xa5\xeb\xb5\x3c\xc3\xf7\x36\xe5\xf0\x2f\x50\x30\xc1\x07\x6a\xf0\xc0\x49\x41\xce\xa5\xe1\x18\x3b\x22\xc7\xfb\x68\x5b\x15\x99\xb0\x76\x96\xf2\x32\x67\xeb\x8b\x74\x19\x75\xb3\x7b\x1d\x9d\xa7\x59\x2d\x0b\x21\x50\x79\x45\x16\xde\xc7\x22\x8b\xed\x66\xbd\xb0\x3a\xa1\x4d\x4f\x4b\xa8\x95\xd4\x18\xbe\xe8\x3d\xad\x9b\x1f\xde\xf3\xd7\x31\x37\xdf\x01\x5e\xd8\x54\x71\xd9\x88\x4c\x58\xd0\x28\x4d\xed\xde\xe3\x8c\x56\x14\x63\x71\x57\x64\xf8\xf3\x56\xc4\xc3\xd5\x9b\x73\x79\x07\xf6\x1b\x54\xc0\x72\x38\x51\x0e\xac\x0c\xce\x6e\x2a\x8b\x84\xbb\xc2\x52\x25\xf4\x6a\x27\x94\x3c\x5b\x88\x41\xf6\x24\x5c\x60\x26\x1f\xbe\xe2\x7c\x05\xc4\xc1\x7b\x77\x8b\x56\x04\x2a\xd8\xe4\xcc\x50\x95\x55\xa3\x85\x9f\xd5\xb3\xbf\x45\x8c\xce\xf0\x7b\x9d\xb7\xf7\x7f\x8b\x50\xbe\x40\x10\x04\x77\xea\xe6\x98\xac\xdf\x6f\x60\x9d\x94\xb8\x2c\x5f\xa6\xc0\x29\x57\x05\x16\xf9\xc5\xfa\xc8\x14\x82\x65\xf9\x24\x44\x30\xf1\xb9\x62\x08\x48\x4a\xe4\x6a\x8f\xb4\x99\xac\xf8\xff\x18\x7b\xab\xb0\xac\xa2\xa7\x7d\x98\x6e\x90\x14\xa4\x05\x04\x91\x96\xee\x0e\xe9\x46\xba\xbb\x1b\x69\x1e\x3a\xa5\xbb\xa4\x41\xa5\xbb\xbb\xa5\x04\xe9\x06\xa5\x91\x2e\x81\xef\xfa\xbf\x21\xeb\x77\x7d\x07\xbe\x27\x78\xe0\x7d\xad\xbd\x67\x3f\x2b\x66\x66\xcd\xdc\x77\x7d\x27\xd3\xf2\x54\x50\x8b\xdf\x8a\x43\xfb\x97\x49\x63\xcc\x10\xe9\xe8\x54\xcd\xcc\xd7\xf4\xad\x14\x00\x74\x99\xa5\x79\x81\xb8\x0e\xf6\x9d\xb5\x0f\xeb\x37\xb7\x51\xf7\x34\x17\x52\xed\x78\x79\xc3\x0e\xcf\x47\xc1\xed\x4b\x39\x3e\xa8\x1b\x40\x2d\x30\x2e\x8c\x2f\x48\xb4\xf4\xb6\x25\xae\x42\xc9\xf9\x7c\x89\xa5\xc7\x2f\xfa\x27\x27\xc4\xbd\x87\x03\xb9\x37\x3f\x8e\x3c\x10\xea\xc9\xaa\x14\x62\xfb\x9d\x1d\xec\x57\x5f\x82\xbd\x66\x7e\xdf\x6e\xd3\xda\xbf\x0b\x6f\xd3\x16\x6b\x0b\x1e\x21\x98\x15\xe8\xef\x5c\x0c\x04\xaa\x9d\xae\xa2\xed\x19\x82\xf1\x6d\xf3\xa9\x53\x72\x75\x67\x97\x83\x82\x3e\x1e\xcf\xdc\x17\xce\xc1\x4f\xfd\xb8\x56\xda\x40\xa2\xbc\x4a\x02\xed\xc7\x2e\xbd\x1d\x47\xd1\xd1\x39\xd3\xf2\x18\x9b\xac\x08\x16\x6d\x5f\x95\x67\xbb\xb0\xe9\xcd\xcc\x44\xbb\x9a\x5f\x59\xa0\xe3\x8e\x07\x6a\x62\x91\x82\x2a\x19\xcd\x66\xc6\xf1\x59\xf8\xf3\xe4\xbe\x72\xc5\x05\x6a\x08\x5a\xb5\xaa\xcf\x28\x9e\xa7\x26\x5d\x54\xa9\xf0\x02\xaa\x92\x9b\x44\xfa\x02\x5f\x14\xde\x75\xbc\x8b\x31\x31\xa3\xd4\x77\xce\x1e\x15\xaf\x0f\x16\xff\xae\xed\x26\x9d\x0f\xc5\xb3\x39\x5c\x0d\x01\x9f\xef\x63\x15\x12\x96\x0a\x07\x1b\xf1\x55\xdd\xa2\x31\xcd\x98\x61\xbb\x6c\x34\x3c\x60\x0e\x83\x84\x41\x9a\xb1\x44\x31\xae\x73\x2f\x19\x80\xf2\xb6\x95\x18\x3e\xe6\x2a\xeb\x0a\xde\x4c\x1f\xf0\xe7\x23\xc3\xeb\xc7\x9b\x9a\xc8\xe5\x27\x9f\xae\x7e\x98\xe8\x35\x8c\xd5\x00\x0a\xb3\x4a\x0f\x96\xb4\xf6\x6e\xb2\x35\xc5\x37\x9d\xea\x2a\xb0\xd1\xd0\xd7\xb5\x5f\x42\x48\x4e\x95\x2f\x8c\x2d\x3c\xa8\x77\xde\xee\x01\xdc\xc3\x03\xfc\x8a\x91\x82\x4b\x56\xfa\x4c\xc4\xb5\x12\x89\xfc\x53\x2b\xda\x73\xbd\xe8\xa7\x71\xea\x9f\xa6\xe8\x4c\x49\x53\x2b\xad\x45\x9e\x90\x83\x5b\xb9\x9c\x1e\x74\x8d\x9b\x53\x6a\x68\xba\x78\xd6\x2a\x78\x84\x9b\x6f\xc3\xdd\x53\xba\x5c\x6e\x3b\x69\x92\xb8\xa4\xec\x85\x41\xa3\x0e\xeb\xc9\x9d\xbd\x30\x95\x6c\xcb\x3c\xbf\xf1\xef\x1c\xf7\x34\x2d\x29\x2e\x2f\xcc\x67\x7e\x32\x24\x2e\xd3\xc6\x24\xe4\x6b\xf9\xfa\xb4\xfd\x55\x3e\x4f\x98\xd9\x51\x2c\x20\x75\x40\x40\x23\x37\xb4\xa6\x2c\xae\x40\x8c\x8b\x3b\x50\xb0\xa0\x2d\xa6\x75\x62\xdf\x42\xec\x9d\xbc\x04\x4b\x30\xe6\x5d\x87\xce\xbb\xe2\x0d\x7f\x70\x5e\xe1\x18\x35\x1e\xbc\xb8\xd9\xe0\x86\x35\x8a\x7b\x5d\x1e\x49\x1d\xa8\x66\x46\x70\x05\xbe\x80\xba\x8e\x5d\x6e\xe3\xc5\x12\x3d\x77\xb9\x3b\x0e\x25\x09\x93\x59\x72\x48\xfd\xb1\x64\x81\x8c\x6e\x60\xf6\x64\xb9\x48\xcc\x33\x28\x20\x36\xe8\xd1\xb2\x46\xae\x38\x54\xe4\xfa\x46\x25\x28\x68\xef\x44\x2c\x2d\x4f\xdf\xbb\x83\x9a\xeb\x23\x46\x16\xd8\xb8\xf1\x29\x1e\x5c\xff\x28\xd8\x28\x25\x2f\xc9\xc5\x46\x0e\xf7\xcf\x30\x76\x20\x37\x46\x9a\x79\x9f\x36\x0f\xd0\x90\x53\x3f\x50\x42\x8c\x92\x25\xd5\x4c\x81\x8b\x85\x16\xb5\xf8\xf0\xd9\x9f\x90\x6d\xe3\x37\x2b\xcd\x85\xd8\xd2\x44\x79\x9f\xde\x78\x5e\xd4\xdd\xee\x1d\x9a\x43\xad\x30\xdb\xe8\x3f\x21\xf5\xaa\x84\x3b\x14\xb9\x7b\x9b\x96\xd6\xc7\x35\x51\x49\xba\x1d\xf8\x31\xa5\x3e\xe9\x94\x7c\xc6\x46\xc7\x28\x62\x5f\xa2\x35\xf9\x01\xac\x7f\xb5\x00\x07\x11\x4a\xb2\xf0\x3e\x85\x97\xe6\xb4\x39\x76\xee\x38\x81\x3d\x12\xd3\x5e\x62\x41\x2a\x30\xdd\x35\x33\x56\x96\x94\x4a\x40\xa5\xb1\x3a\x5f\x32\x3e\xac\x32\xaf\xfd\x58\x79\x24\x7c\xbb\xd5\xef\xb6\xb7\x52\x5a\xd0\x69\x7c\x7b\xae\xaa\xb4\x85\xb0\x82\x29\xbb\xe0\x97\xb2\xf9\x78\x7e\x87\xa7\x20\x6f\x27\x1e\x1a\x8a\x16\x03\x7b\x70\xfa\x36\x31\xc2\xb6\xd7\x34\x89\x3e\x59\x23\x62\xfa\xbb\x75\x5f\xf6\xff\x3a\x42\xff\x3a\xfa\x21\x62\xe4\x50\x48\xf0\x80\x23\xb4\x9a\x9b\xaa\x1c\xce\x33\xe8\x91\x4f\x7b\x18\xc4\x19\x85\x4d\xa1\x99\xba\xcc\x02\x97\xf1\xbe\xd5\x75\x5a\xd5\x05\xa6\xe7\x03\x48\xbe\xac\x44\x93\x1f\xc0\x4e\xe9\xbe\x1e\xcf\x3a\x39\x3f\x1d\x65\x7c\xbd\x02\xb7\x95\x28\xa2\xe5\x20\x37\xb4\x8e\x1f\xe0\xa3\xa2\xef\x07\x40\xdf\xa7\xb8\x26\xef\xeb\x5c\xbb\xe2\x47\xc5\x04\xf2\x5e\xbe\xac\x4d\xb7\xd0\xbf\x82\xf1\xe6\x57\xc9\x22\x8a\xe4\x65\x1d\xde\x06\xa9\x71\x1b\x92\xf0\x66\x6d\x6e\xb5\xf9\x16\x32\x29\x85\x4b\x3e\xaa\xc0\x62\x7b\xbc\x59\xe4\x1a\x7f\x63\x2a\xbb\xc1\xfd\xc1\xf3\x9b\xed\xd9\x5f\x1f\xef\x5f\xae\x0a\x44\x0c\x13\x1b\x1a\xf4\xf1\x24\xa6\x52\x26\xef\xf1\xf0\xce\x30\xcd\x4e\xf5\x53\x34\x0f\x10\xec\xfd\xa8\xb5\x0d\x4f\x94\xed\x8a\xcd\x58\xa7\xa0\x50\x05\xc1\x42\xba\x9f\x6f\xb1\xaa\x4a\x4a\xbe\xa7\x98\xb1\xa5\xa7\x66\xea\xf4\xc4\x04\xca\x04\xca\xbc\xfe\x8a\x69\xd8\x72\xd8\xc4\x45\x1e\xb0\x08\x3a\x6e\xdb\x98\x9f\x4b\xcd\xfb\xe9\x4e\x25\xb9\x08\xbc\x24\xbf\x29\x4a\xa8\x31\x3f\xa7\xfd\x82\x4f\x01\x11\x62\xa9\xd5\x5c\xdd\x51\x06\x4b\x1a\xae\xd2\xd2\xde\x75\x40\xef\x2c\xfd\x1e\x4e\x50\xa3\xff\x60\x47\x35\x45\x21\x16\x1c\x87\xba\xcc\x6d\x7a\xfd\x60\x34\x18\xe8\x89\xf2\xd7\x89\xff\x97\xc7\x00\x11\x9b\x80\x82\x01\x9d\x78\x67\xa2\x6c\x4f\x36\xf4\xf8\x0f\x8c\xee\x02\x8d\xf3\x27\xc7\x6c\x6e\x50\x13\x59\x77\xc6\x98\x1d\xa9\x6a\x4b\x8f\x25\x15\x5a\xa0\xb8\x47\x96\x56\x7d\xed\x3c\xeb\x8d\xa5\x9a\xae\x20\x6c\xe0\xaf\xc9\x98\xc5\x60\xaa\x5e\xd1\x2f\x44\xfd\x37\xe5\x29\x01\x2a\x57\x74\x30\x00\x14\xfd\x6b\x53\xd2\xc4\x22\x57\x0e\x64\x7c\xde\x26\x28\x31\xa5\xa5\x6b\xe0\xe8\xf9\x87\x05\xe7\x35\xed\x11\x3c\x73\x51\xf8\x7d\x90\x8e\xf4\xc5\x43\xee\x7b\xd2\x8e\xd8\xf4\x2e\x18\x7e\x18\x5e\xb4\xb2\x67\xb5\x18\x85\x37\xb5\x7c\xab\x16\x5c\x16\x2c\x2e\x07\xf5\xcd\x20\x9d\x51\xb1\xc0\x5e\x99\x87\x30\xc6\x0a\xdf\x8c\x9c\xdf\xfb\x98\x23\x82\x1f\x5f\x4b\x22\x52\xea\x96\x53\xf1\xf0\x84\x97\x6a\x8e\x30\x23\xfe\x5e\x24\xff\xcb\x1b\x81\x88\x3a\x90\x63\x02\x1f\x61\x76\x20\x0a\x56\xa6\xbb\xc5\x54\x05\x55\xf1\xa3\x1f\xdb\x8c\x79\x7b\x1c\x96\x84\x71\x48\x80\x39\xf6\x8e\xf1\xed\x05\x92\x66\x24\xf0\x0e\xa7\x3b\x9b\x2a\x85\x89\xc9\x1c\xb5\xb0\x99\xf0\x3c\xf0\x2c\xb0\x4e\xdc\x03\x81\x43\x32\x26\xaf\x67\x0e\x4f\x71\xd3\x3b\xbe\x81\xf3\xd1\x41\x3c\x3d\x55\x6f\x16\xa9\x76\x29\xfa\xe6\x59\xea\xa2\x9f\xe2\xbb\xe9\x85\xe4\x5c\x92\x78\x04\xd3\x04\x1c\x8a\x41\x42\xd8\x3c\xf0\x76\xf8\xb2\x18\x31\x8c\xe4\x5c\xa0\x49\x56\xc0\x23\xc4\x67\xfb\xd7\x16\x44\x2b\x68\x56\x8b\x1c\xd5\x6a\xf6\x5a\x6b\x7c\xb2\x14\xac\x51\x6c\x44\x5f\x2c\xeb\x2c\xa8\x21\x1d\xb8\x82\x19\xb1\xb8\x7a\xdc\x44\x2e\x31\x71\x71\xb7\x3d\x90\x91\x47\xb0\xa2\x1b\xdc\xbd\x59\xfe\xfb\x11\xfe\xe5\x67\x41\xc4\x0c\x90\x90\xc0\x59\xfe\xa9\x60\x4d\x42\x8c\xa2\xc7\xd7\x38\x87\x5c\x97\x3e\xe0\x10\xb5\xf0\x76\x6a\xf5\xd9\xe4\xb3\xf4\xcd\x6e\x8c\x7a\x6a\xe1\x8f\xba\xc0\xd6\x34\x69\x4a\x45\x60\x1c\x1f\xf7\xb5\x95\x2f\x7c\x68\xde\x7f\x66\x22\x47\x34\xf2\x68\x45\xc4\x76\x12\x02\x8f\x65\x91\xb9\x64\xf1\xe7\x69\x6b\x3a\xc9\xbb\x2e\x1b\xe3\x17\xef\x46\xf4\x0d\xdf\x8b\x69\x62\xe5\x5e\x99\xaf\x3d\xc8\x0a\xdf\xd9\x17\x7e\x1e\xd9\xc8\xb9\xd6\x0a\x52\xee\xf6\xfe\x92\x24\x8b\x82\x59\x28\xdf\x71\x44\xe3\x52\xff\x2c\x87\x59\xe7\xf0\x0e\x3d\x87\x92\x97\x8c\xaf\xcc\x01\xd9\xbc\x4a\x94\x09\x80\x86\x5a\x67\x57\x07\x98\x50\x8a\x72\xe6\x31\x64\x7c\x87\xc2\x97\xa5\x7d\x49\xf3\xd2\x49\x71\x93\x0e\x19\xdf\xa0\x77\x95\xc4\x95\xf7\x32\x10\xf6\xff\xe8\x41\x8a\x61\x41\x53\x42\x85\x3c\xed\xf9\x9a\x22\x7b\xbe\xce\x70\x88\xeb\xa2\x5d\xf2\x5e\x4e\x27\xbd\x4a\x04\xc7\x33\xef\x09\xdf\x2d\xff\x32\xfd\x40\x96\xc2\xe6\xdd\x0d\x94\x38\x17\xba\xde\x10\xbf\xe3\x41\xa6\xf6\x79\x23\x76\xe5\xbd\x33\x43\x91\x10\xb6\x9c\xa8\x14\x11\xa8\xfe\xaa\xa2\xba\xe7\xdd\x3a\x3f\xc0\x65\xd1\x64\xd3\x28\x9b\x2c\x25\xf7\x56\x74\x3f\xa9\x03\xe9\x57\x12\x71\x19\x0f\xe7\xe5\xa7\x71\x19\x68\x32\x9d\xa6\x8c\xfb\xd9\x19\x4d\xb0\x9e\xf1\x50\xfc\xfe\x27\x17\x72\xf7\x29\xb9\x94\xdd\x9f\xa2\xa1\x88\x11\x77\x1a\x91\xb5\x79\x45\x5e\x37\xcf\x44\x3d\xf8\xdb\xe0\x2a\x30\x3d\xcb\x6a\x9e\xe5\x63\x12\xf0\xfe\x5c\x75\x7a\x87\x7d\x58\xd8\x6a\x35\xa8\x55\x13\x69\x98\x8e\xb2\xd2\xd6\xf9\xe0\x5b\x15\x05\x58\x25\x19\x84\xb8\xa9\x40\x10\x8c\xab\xb3\xfd\x9a\xad\xe1\x19\x33\x39\xa6\x5a\x50\xd1\xaa\xb0\x64\x64\x76\xe1\xc5\x47\x6d\x97\x2c\x3b\x30\x50\x16\xeb\x74\x90\x4f\xbc\xf9\xb1\xb0\x6e\xa6\xb6\x55\xee\x2a\xab\xec\xe3\x9b\xf3\xa5\x37\x53\x1c\x76\x64\xac\xc4\x23\x5d\xf8\x2b\x98\x24\xf7\x61\xae\x9d\xfc\xbd\x35\xcc\x58\xa2\x35\xd2\x31\x75\x1e\x05\x27\x53\x2a\xfc\x2a\x83\x34\x47\x8d\x09\xdf\x19\x76\x57\x93\x2f\xf0\x6f\xfe\xf0\x5f\x2e\x27\x44\x14\x0e\x1a\x17\x98\x88\x04\x6f\x49\x84\x6f\x1a\x14\x7b\xa8\x45\x31\x5f\xd6\xd4\x78\x3f\xa2\xfb\x54\x67\xff\x61\xaa\x7f\xbe\xee\xb3\xc6\xee\x7d\x98\x68\x0b\xbc\x83\x26\x0b\x15\x87\xec\x79\xef\x5a\xc6\xe0\x49\xfc\xed\xe0\xc3\xe2\xdc\xce\x4d\xf9\x0f\xaa\xf7\x87\xee\xf6\xa7\x6c\x24\xd5\x7a\x60\x5d\xc7\xf9\x33\x34\xe1\x57\x1d\x63\xac\x65\x2a\xed\x26\x07\x5b\x22\x30\xb1\x84\x5a\xac\xe4\xe8\xe9\x3d\xc8\x78\x3d\xdb\xde\x37\xbf\x40\xe1\x3c\x87\x3f\xa8\x93\x1e\x3c\x37\x84\x49\xeb\xe8\x08\x46\x68\x11\xb3\x4d\xf3\xb7\x26\xe2\x66\x47\x14\xc9\x5a\xb5\x6f\xf4\xa1\x7a\xa1\xff\x16\x23\xff\xcb\x43\x86\x88\x89\x07\x41\xc1\x00\xe9\x28\x3d\xa8\x58\x91\x4f\x1f\x69\xa9\xbc\x3c\xa2\x4b\x6c\x46\x7b\x11\xd0\x85\xac\xad\x99\xfa\x91\x9b\xaa\x84\x0e\x88\xd2\xb5\x39\x40\xdd\x1f\xaa\xf7\x0a\x19\x3b\xc6\x48\xdf\xde\x15\xbe\x63\xb7\x74\x3c\x64\x42\x1c\xcb\x99\x96\xc8\x4c\x24\x2c\x1d\x95\x8f\xbc\x79\xf6\x08\x72\xd4\x16\x95\x43\x84\x9b\xcf\x29\xb6\xd8\x62\x99\x54\x84\x51\x56\x07\xae\xfb\x79\xee\x5c\xd1\x30\xfc\xc6\x3f\x71\x74\xd3\xc0\x96\x82\x15\x7a\x43\x19\x3e\xa5\xb6\x67\xa1\x2f\xa0\xaf\xdf\xaa\x05\x4f\x5c\xe7\x91\x58\x4a\x21\xcf\xe2\x4b\xa9\xe2\x34\xbc\x9a\x6e\x38\xf8\x0f\xdd\x83\xe6\x53\x72\xa1\x07\x39\xbb\x3f\xf5\xaa\xb1\xfe\x9f\x5b\x57\xfb\xae\x43\x74\x1b\xbf\xe2\x7e\x68\x78\xdd\xf3\xbb\x3e\xa0\xe2\x3f\x96\xee\x86\xc5\x2a\x9c\xbe\x83\xc5\xc9\x1e\x56\x92\xbf\xec\x33\x67\xbf\x23\x24\x3b\xcc\x25\x21\x89\xc6\x4f\x28\x9b\xbd\xc3\xbc\x21\xfa\x7f\xa7\xc2\xbf\xe2\x04\x88\x98\x10\x14\x14\x01\x20\x0f\xa0\xb9\x4f\xf2\xde\x9a\x0d\xdf\xa9\xcd\x87\xe7\xab\xbe\x33\x4a\xcd\xab\x30\x8d\x98\xd7\x01\x7f\xb6\x21\x32\xb6\xac\x89\x09\x8b\x80\x16\xee\xd7\x67\x46\x77\xd7\x8b\x6a\x88\xa6\x76\xdf\x29\x05\x68\xdc\xd7\x39\xf2\xd4\xaf\xeb\x91\xf9\x48\xa1\x8e\xaf\xb9\xd6\xa9\xd7\xf1\x81\xd7\x7d\xc3\x79\xf4\x52\x6b\xb1\xc1\x3b\x15\x41\x58\xfe\x87\x8d\x87\x55\x6e\x1a\xaa\xc1\xbb\x18\xad\xb7\x88\xb1\x29\x67\xa6\xee\xbf\x41\xad\x2e\xba\xa8\x61\xbf\x3d\xe9\xaf\xd4\xe1\xf0\x8b\x1f\x23\xe0\x22\x83\x2c\xbb\xa1\x0e\x8b\xc6\xa0\xdf\x59\x47\x1a\xaf\xcd\x3b\x7d\xd0\xfd\xdb\x51\xfc\xcf\xb8\x42\x84\x85\x0a\x38\x72\x96\x86\xe7\xa4\xd0\x20\xd5\x04\x07\xd5\xac\x56\xbe\x73\xac\x85\x83\xeb\xb7\x74\x0d\xeb\x1f\x5d\xbe\xbf\x85\x99\xab\xc7\x54\xac\x06\x5e\x21\xf5\x0a\xd5\xc7\xdc\x77\x26\xfb\x79\xb3\x38\x85\x3a\x2a\x55\x79\xce\x51\xd0\xa7\x66\xe8\x76\xd4\xd3\xa8\xc3\x9e\x0b\x8d\x0a\x50\xb9\xb8\xb3\x8f\xa4\xc1\x1f\x15\x06\xdf\xf7\x5c\x57\xd9\x22\x73\xbf\x99\x8f\xc6\x3d\x87\x4f\x9e\x0f\x22\x41\x3a\x57\x99\x81\x1d\x33\x0b\x40\x45\x46\xf8\xc4\x9e\xe7\x33\xec\x6b\xc0\x3e\xbb\x89\x34\xc7\x95\x9d\x88\x7a\xc9\x93\xc6\x7a\xaa\xd4\x80\x99\xea\x66\x39\x94\x1d\x01\x96\x22\xef\x04\xc3\x2d\x78\xd9\xe5\x4b\xce\x37\x5f\x5a\x49\x7e\xc4\x66\x36\x9e\xee\x49\x61\x17\x9c\xab\x68\x9d\xd6\xf8\x30\x8f\xba\xf9\xd7\xb1\xfa\x57\x6c\x03\x11\x93\x86\xfa\x0f\x72\x95\x17\x16\xd5\x3f\x0d\xbc\xa7\xef\x1c\x67\x8b\xae\xa2\xb7\xda\x75\x86\xd2\xdb\x22\xb5\x13\x59\x64\xf4\x08\x50\xe1\xbe\x4b\xc6\x81\x2b\x9d\xcb\xa8\xbd\xb6\xc6\x77\xa1\xae\x1b\x82\x1a\x27\xf8\xed\xfe\xf6\x5d\x14\x06\xfe\x28\xc1\x21\x92\x74\x42\xba\xb8\xa3\x81\xc8\x10\x00\xed\xa3\x1a\x42\x7a\xf1\xa1\x67\xfe\x55\xcb\xa0\x56\xc7\x9f\x05\xa2\x17\x05\xb6\xd1\xd7\x42\x30\xce\x69\xdb\x0a\x50\x7c\x2f\x86\x84\xc1\xeb\x30\x93\xd7\xa1\xb8\x49\x7f\x78\x0e\x78\xd5\x43\x0a\x57\x54\xf1\x06\x4a\x75\x25\xf6\xf7\x47\x93\xa6\x24\x3a\x26\x7f\x1e\x53\x2a\xfc\x3d\x4d\xff\x15\x8b\x41\x44\x61\xc9\x63\x81\xdf\x37\x99\xa7\x3a\x32\x6a\x37\xca\x3d\x93\xf5\xc3\x1b\x13\x94\x63\xe4\x53\xf9\x5a\x9a\xc6\xea\x5e\x89\xa4\x06\xd9\xef\x01\xe1\x16\xe0\xb5\x20\x66\x3c\x03\xe3\x38\x85\x82\x63\x47\xde\xf6\x91\xea\x64\x1f\x5f\x3d\xdc\x55\x51\x21\xc6\x12\x3c\xc7\xd7\x8d\x60\xf1\x08\x54\x30\xef\xfc\xf0\x2e\xac\xc5\x9c\x29\x40\x7d\x3e\x15\x2e\xa9\x21\x13\x5d\xa7\x3b\x20\x49\xe9\x9c\x66\x03\x9b\x3e\x19\x39\x54\xdd\xb1\x0d\x07\xbc\xc2\x24\x1a\xac\x91\x69\xb8\x85\x87\x43\x1e\x31\xd3\x23\x38\x7b\x77\x15\x0a\x13\xa7\x39\xe5\xa4\x59\xae\x28\xf3\xea\x00\x5a\xc0\x14\xbc\xe2\x22\x57\xc9\x7a\xb3\x3e\x71\xa8\x51\xd2\x83\x81\xe6\xc6\x07\x63\x31\xd4\x86\xcc\x6e\x71\x6e\xf1\xc9\x2e\xc3\x02\xdd\xc9\x44\xe3\xaf\x77\xf9\xaf\x30\x0f\x22\x06\x87\x8a\x09\xb6\x12\xfc\xc4\x38\x4c\x7b\xf3\x7c\x56\x35\x31\xfb\x9a\x49\xd6\x9f\xd7\x9d\x47\x46\xb6\xf6\x3d\x8c\x16\xf6\x8f\xfd\x3b\x2e\x89\x87\x0f\xa0\x68\x2d\x22\x56\xcd\x43\x74\xa3\xd2\x88\xfe\xf8\xdb\x38\xab\xe0\x43\x1a\xea\xad\xfb\xe0\x61\xd7\x93\x05\xba\x2b\xe1\xee\x6d\x7f\xc8\x16\x00\x9d\x93\xe3\xac\x5d\x2a\xf2\x76\xf7\x25\x64\x78\x3f\xc5\xc8\x0b\x2d\xdd\xaa\xfc\xe5\x14\x26\x98\x8d\xc3\x83\x2e\xf6\xd6\xf6\x12\xa4\x3d\x8c\x47\xed\xce\xc4\x40\x64\x9e\x39\x1e\x0a\x51\xeb\xc2\xa8\x91\x09\xf6\x31\x7a\xb9\x90\x82\xf4\x25\x8f\xe7\xce\x3a\x29\x8a\x09\x14\xe1\x48\x19\x23\x67\x7d\x18\xe1\x2a\x6a\x7b\x64\x1b\x2c\x31\x24\x62\xb3\x99\xa4\x74\xbd\xca\xcc\x2a\x46\x69\x3b\x48\xdd\x66\x5d\xb5\xff\xcb\x34\xfb\xaf\x58\x13\x22\x62\x80\x09\x30\xcd\xc2\xa5\x28\xc3\xb1\xf4\x34\x64\xbc\xd9\xdb\xe0\x79\x36\x99\x29\xf4\xcb\x50\x90\x18\x9e\x8d\x71\xe4\x1e\x81\x58\x08\xbd\x53\x04\xa4\xd9\x99\x54\xa5\x41\x55\xe9\x27\xb7\x8c\x3f\x36\x72\x5c\x1f\xce\x56\x8b\xfa\xae\x8d\x15\x3c\x77\x02\x55\x07\xb5\xec\xf3\x5e\x6e\x77\x15\xf0\xc0\x7a\x14\xbc\xda\xe8\x7b\x97\x04\x9d\x49\x03\x2a\xef\x1f\x6d\x1c\x18\xcc\x0f\x08\x9e\x4f\x72\x29\xa3\xf7\xdf\xb4\xa7\x72\x40\x03\xf7\xf9\xf3\xa7\x94\x3f\xa2\xdb\xb9\xad\x88\x96\x7b\x48\xb0\xec\xf9\xd3\x59\xbc\x2b\xa2\x3a\x22\x87\x16\xbf\xe6\xb5\x89\xa1\xc9\xe3\xfc\xf8\xbb\x37\xff\x2b\x32\x84\x88\x0a\xfb\x93\x83\x9c\x96\x7b\x8e\x70\xac\xbc\x4c\x26\xcc\xe4\x2b\x9e\x63\x78\xfc\xda\x31\x3f\x4b\xc6\x1e\x61\xf8\x06\xfa\xca\x83\x5f\xf4\xf9\x0a\x83\xbe\x0a\x5f\x9f\x64\x82\x95\xda\x6b\xa1\xb2\xf2\x1e\xbc\x8f\x41\x39\x23\x86\xfc\xb2\xac\x35\x5d\x5a\x09\xb1\xd9\xc8\xf6\xf6\x37\x1b\x20\xf4\xb9\x57\xe2\xf9\x0b\x9c\x7e\x83\xb4\xe7\x1e\x9f\x0f\xe8\xd1\xf7\x45\x65\xbc\x67\x95\x94\x31\xf6\xf7\x36\x6b\xf5\x24\x79\x44\xc0\x1b\xc1\x5f\x21\xf2\xa6\x6b\x27\xca\x6c\xda\x85\xc9\x1f\xc8\x34\xd9\x57\x5b\x35\x98\xb6\xda\xa8\x9b\x08\x1e\xaa\x8e\xb5\xef\xda\x78\xe9\x2e\xc7\xff\xa7\x1b\x1f\xd3\x40\x4a\x52\xa4\x12\xc6\x38\xf3\x82\xf8\xa3\x61\xd5\xb8\xac\x76\x37\xd1\x25\x35\x6e\xba\xbf\x14\xc7\x7e\xba\x25\xbc\x2a\x39\x44\xec\x78\xb5\xe3\x3f\x74\x14\x99\x35\x92\x2d\x1a\xf7\x32\xfc\x62\xeb\x35\x57\xb5\xd4\xfc\x5b\x1a\xb3\x6a\xe2\x2c\xae\x6a\xb1\x06\x70\x87\xb9\xb2\x96\x7e\xf3\x3e\x7d\x5e\x77\x2d\xec\xe7\x0e\x39\x66\x99\x3d\x53\x84\x85\xba\x87\xac\x87\x24\xcc\xf7\xf0\xb3\x79\xdb\x3a\xa4\x47\x19\xbc\x72\xdf\x83\x95\x81\xbb\xbb\xfe\x62\xb9\x42\x78\x63\x74\xa4\xcf\x6f\xad\x14\xbc\xc8\x27\x5b\xc7\xe1\xd6\xed\x8a\xb2\xaf\xed\xa6\x0b\x30\xbe\x07\x4c\x1c\x83\x51\x7a\x48\x75\x97\xd0\xd0\x2f\xc1\xea\x92\xf0\x59\x68\xb5\x43\x82\x72\xaf\x17\xcf\x8d\x1f\xaf\x07\x5c\xe0\x6f\x0c\x49\xac\x77\x06\xbd\x00\x57\x98\x8f\x40\x9a\xb0\x0e\x87\x36\x3a\xeb\x8f\x69\x1e\x59\x38\x35\x49\x9a\xe3\x91\xb9\x5a\x4a\x5b\x63\xa8\xf1\xe2\x07\x45\xdc\x1b\x70\xd4\x7b\xe2\xe7\x95\x49\x1d\xb9\x47\x8d\x70\x04\xce\x4d\x2f\x10\x37\xe4\x8c\x9d\xab\x68\xc9\x3e\x47\xd8\x2f\x1c\x18\x0b\xbe\x74\xbf\x7e\xb2\x5f\xc4\xf0\xd2\xbc\x00\xc7\xf0\xe7\xca\x19\x7b\xd6\xa6\x49\x8f\xcf\xb6\x40\x77\xcd\x1d\xc3\xf1\x64\x6d\xf4\x2b\xed\xf8\x64\xb3\x4f\x4f\x56\x29\x48\x33\xd2\xcf\x1c\x29\xa8\x5e\x93\xfa\xc5\xcd\x94\x74\xb9\xf2\x13\x23\x1c\x24\x4a\x63\xc3\xe4\x57\xe2\x0b\x1e\x6c\x37\xf0\x3c\x21\xb3\xc8\x66\x25\x49\xb0\x37\xe9\x75\x1f\x51\xb0\x37\x30\xfd\xc6\x7f\xd5\x45\xfb\x10\xc0\xcd\x48\xd1\x4a\x2e\xae\x88\x2a\x37\x9e\x83\x9a\x03\x8e\x27\x0d\x4c\x2a\x18\x6f\xfc\x6b\xd0\x50\x44\xb1\x4f\x74\xee\xb5\xd5\xa4\x2c\xc9\xfe\xa4\xb9\x93\x13\xf6\x92\xcd\xa1\x03\x42\x06\x8a\x36\xee\x75\x3e\xc6\x30\xf1\x89\xee\x83\xb5\x38\x0c\xf8\xc7\x51\xe3\xc7\x66\x24\xda\x04\x84\xee\x5c\xfc\x46\x2a\xd2\x0b\x40\x9d\x6a\x3e\xc6\xfa\x0a\x77\x14\xdf\x9b\xa6\xa8\xdb\x52\x87\x7c\xd1\x02\x11\x49\x44\xc4\x94\x69\x49\x68\x71\x23\x36\x87\x95\x71\x01\x4c\x90\xc8\xfa\xe0\x8c\x18\xea\x2e\xf1\xac\xc4\x4a\x7e\xee\x9d\xf7\x9e\xba\xcc\x5a\x29\x56\x5b\xbc\x3e\xa2\x78\xe8\x48\xc8\xfb\xbd\x40\x16\x80\x26\x72\x3d\xcc\xa8\xbe\x64\xfa\x1d\xfb\xfb\xaf\xb1\x05\x65\xe7\x81\xd9\x23\xea\x3b\x2b\xce\xf4\xb0\x72\x06\x30\xcf\xdd\x9c\x7e\x03\x89\x1f\xeb\x4c\x79\xde\x32\x8a\x84\x57\xb9\xad\x53\xfc\x17\xe4\xa9\xb6\x11\x61\x77\x38\xb0\x22\x88\xb9\xef\x8f\x45\x19\x6c\x46\xe4\xec\xc0\x26\x67\xc2\x44\x7e\xc3\x02\x46\x9e\x57\x1e\xf8\xca\x0f\x03\x82\x63\x03\x72\x9a\x64\xe3\xa6\xb2\x92\x10\x7a\xd2\xc8\x56\x1e\x7d\x58\xa0\x02\x07\x2b\x2b\xb6\xc5\x23\xf4\xb8\x7a\x71\xf7\xeb\x18\x01\x39\x4d\x3c\xbf\x11\x1a\xf4\x8e\x6a\xa0\x16\xc5\xe9\x9e\xd1\xe0\x63\x30\xc0\xe7\x89\x67\x7e\xc3\x68\x4b\x2c\xbc\xfd\xaa\x2e\x71\xfa\xf6\x8b\x61\x52\x15\x45\x9f\x3d\xf9\x2d\xc9\xd0\x08\xd7\xd6\xe2\xc7\x40\x2f\xd0\x45\xd4\x95\xac\x84\x9c\x6c\x77\x24\xc1\x34\x53\x74\xee\xbe\xd4\xb1\x52\x90\xf1\x75\x54\xf5\xa2\x78\x19\xce\x7a\xa4\xb1\xe5\xb2\x0d\xec\x42\x72\x1f\xe8\x9f\x7f\xa1\x96\x1d\xcc\x85\x83\xeb\xe5\xe9\x50\xde\x9a\x79\x16\x1c\xbf\x26\xd3\xc2\x96\x14\xf4\x6b\x58\x22\x77\x13\x48\x91\x16\x39\x25\x14\x27\x33\x37\xfb\xbb\x56\xaa\xe0\xa7\xfe\xd2\x52\x5c\x50\xbf\x92\x9f\x40\xbc\x7b\x61\x8b\x65\x6f\x91\x51\xfc\xbb\x1b\x30\x1f\xcd\x05\x7b\x6c\x7e\x5c\x9a\xbe\xef\x81\x1d\xa1\x10\x81\x7b\x29\x8e\xc6\xe2\xd2\x7f\x65\x17\x73\xcd\x35\x22\xa3\xe1\x59\x6a\xfd\xd3\xa0\x31\x89\x38\x91\xdf\xdb\x4a\x69\xaf\x3a\x46\x1d\xc6\x3e\x0e\xb3\x9a\x41\x98\x98\x73\x33\xc4\xfb\xfb\x3a\xa4\x61\x61\xdc\x1e\xda\x00\xe7\xf0\xf3\x2d\x1a\x99\xc3\xdc\x54\x75\x3f\x05\x8e\x46\x9f\xd4\x9a\x73\x7b\xc9\x81\x11\x8e\x26\x4a\xfb\x2d\x6e\x73\x21\x7a\xb8\x29\x28\xc9\x7e\x44\xba\x75\x2f\xf8\xb9\x26\x01\x8b\xbd\xfb\x4e\x44\xc7\xb2\x80\x3f\xc3\x8d\x53\xc9\xcb\x64\xf6\x86\xda\xd2\x30\x33\x1f\x10\xb1\xec\x84\xfe\xc1\xd9\x56\x14\x3f\x36\x5b\x46\x68\xf7\xc8\x4c\x31\x70\xb1\x96\xf7\xbb\x4f\xdb\x59\x83\xf5\x63\x7f\x07\xab\x85\x7d\x02\x30\xa8\xf9\xa7\x0e\xcc\xec\xc0\x36\x21\x42\x64\x64\x98\xc7\xdc\xa0\x04\x75\xc2\x82\xd5\xd3\x8f\x68\x2f\x36\x84\x78\x30\x93\x30\xf5\x6f\x81\xfd\x04\x13\xa5\xbb\x3c\x9e\x55\x7a\x76\x53\xc4\x86\x32\xb4\x48\x6c\x5c\x80\x24\x5b\x4d\x4f\x29\xf8\x80\xe9\x02\xe1\xcf\xe0\xa3\x3d\xf0\xa1\x0c\x2a\x8f\xa1\x96\xf5\xa8\x79\x5d\x8d\x54\xd3\xdb\xdb\x7e\xe9\xe2\xae\xc1\x1b\x56\x04\xdd\x2f\xa8\xb9\x62\x25\x4e\x2e\xea\x90\x03\x4b\x2f\x12\x95\x54\xf9\xf9\x82\x82\x60\xc0\x48\x56\x97\x8e\x40\x30\x59\x83\xc7\x79\x98\x17\xb2\x1d\x11\xb1\x1b\xb2\x5e\xcc\x3d\xd0\xb5\xdf\x15\x6f\xe4\xe0\x5b\x5f\x8e\xe7\x37\xab\xa4\xce\x54\xeb\x98\x74\x37\xb6\x54\xb9\x48\x44\xc6\xac\x6c\x3b\x2e\x39\x9f\x7e\xb9\x0a\x3c\x9e\x61\xdc\x94\xca\x05\x9b\x2d\x12\xd5\x1b\x2b\xca\xa5\xb3\x81\x24\xd6\xe9\xd1\x69\x65\x6c\xc8\x90\xbf\xbb\x73\x25\x4a\x49\x09\xd8\x23\x65\x5b\xb2\x2b\xc6\xe4\xd9\xfa\x8b\xab\xc9\xde\xa1\x8f\x8d\x53\x35\x90\x20\x5e\xae\xc1\xec\x3b\xee\x4e\x98\xca\x3f\xf2\x7e\x64\x7f\x42\xca\x5d\x1f\x6a\x7e\x22\x29\xeb\x7b\xbe\x0d\x35\x5a\x11\x93\x4d\xe9\x15\xc5\xd2\xaf\x64\x95\x47\xc1\x2f\x9f\xda\xaa\x05\xef\x2a\x04\x7c\xd2\x57\xce\x5e\x09\x17\x9c\xbc\x1f\xb3\xd3\x5b\x3e\x09\x57\xe0\xb8\x42\xac\x4d\x97\x0d\x9c\x67\x05\x08\x07\xd9\x32\xfd\x35\x70\x11\x40\x46\x1c\x15\x66\xda\x47\x0a\xc4\x7b\x42\xec\x69\xda\xa4\xe5\x87\xbd\x12\xa1\xda\x5d\xf1\xf1\x31\x4f\xcc\xf2\x4f\x50\xfc\x62\x16\xc0\xa0\x22\xab\xcb\xb3\xfb\x70\xb5\x7e\x54\xcf\x16\xc5\x5f\xef\x64\x7f\x37\x90\xb9\xa4\x44\x8b\x7a\x73\x83\xdc\x35\x52\x51\xae\x40\x9c\x04\x10\xb8\x47\xf2\x45\xb6\x09\x10\x9f\x78\x6e\xfd\x1e\xbe\xb0\x18\xc9\x19\xab\x7e\xc8\xdb\x75\x7c\x21\xa4\x0e\x55\xa7\x8a\x7d\x59\xb9\x0f\xee\xbb\x1b\x78\x88\x2d\xe4\x9d\x52\x8a\x88\x74\xfb\xcc\xea\x52\xb6\xe2\xeb\x67\x09\xae\xe6\x75\xe2\x6d\xc7\xe1\xa7\xbe\x4b\xc1\xa3\xc8\x4f\xdf\x14\x01\x6a\xe6\x52\x09\x8f\x6c\x45\x25\x5d\xd4\x95\x6a\x81\x78\xf4\x2d\x9d\x82\x5d\x0f\x84\xd4\x73\xd1\xc4\x70\xe6\x24\xad\x3c\x01\x48\x24\xfb\x70\x33\x46\x30\x70\x21\x75\xab\x94\xb1\xa8\xfc\x6c\x27\x7e\x78\xfb\x59\x72\x6e\xea\xb1\x6d\xe8\xbd\xe8\x3b\xc9\x71\x9a\xf7\xc0\x3d\x1e\x1b\x34\x7c\x99\x8c\xed\xd4\x51\xcf\x23\x96\xa2\x4e\xe7\x6b\x5e\x65\x45\x64\x87\x92\x17\x7a\x46\xa7\xb5\xf2\xba\x39\xfc\x66\x80\xf9\xb5\x01\xa4\x05\x69\x2b\x6b\xe4\x91\xbd\x4b\xdd\xb5\x09\x5c\xb4\x5f\x63\x56\xa6\x4c\x9e\xb3\x7e\xce\xa9\x1f\x1d\x6c\x35\x1b\x57\x03\xf8\x62\xde\x40\x14\x62\x9b\x7e\xf1\xc3\x21\xab\x3a\x2c\xc7\x69\xbf\x39\xc8\x61\x4d\xa5\x3b\xbf\x65\xc6\x3e\x17\x32\x71\xf1\x9a\x67\x03\xcd\x67\x91\x6c\x75\x3d\xf2\xb1\x3a\xbb\x14\x87\xa6\x57\x93\x5b\x87\xe3\x9a\x6d\x4b\x49\x5c\x1e\xd3\x60\xd3\x9a\x24\x84\x2a\x0f\x67\x04\xa0\x73\xd2\x8c\x44\xfc\x0a\xab\x04\xc5\x6f\x66\x13\x0a\x33\xfb\x75\x0c\x1d\x98\x13\x48\x3f\xfa\x28\x42\xa7\x3c\x43\x21\x9b\x49\xb3\x7d\xda\xa5\x74\x33\x23\xa2\x73\xaf\xf5\x6c\x95\x3b\xfd\x9e\x71\x8b\x9b\x1b\xc5\xcb\xfc\x40\x9f\x77\x15\xfa\x31\xa5\x90\xf8\xc5\x53\xe1\xe5\x2f\xc0\x2a\x5f\x82\xa4\xd8\xe8\x56\xfc\xcd\x98\x0a\x44\xce\x17\x38\x9f\xe7\x45\x88\xaa\x0c\x49\x1d\xa9\xec\x5e\x7f\xab\x15\x40\x7c\x5d\x4f\xf7\x64\x55\x6f\x85\x8b\xb8\x42\x74\x9c\x65\x12\xc2\x78\x25\x91\xf9\x76\x7d\xf0\x18\x12\x3f\x17\x8a\x7e\xef\xa7\x63\x84\xba\x77\x7c\xe9\x60\x0c\x19\xc9\x5e\xdd\x6a\xea\x17\x59\x54\xa8\x8d\xce\xeb\xf4\x53\x1c\x71\x43\x51\x48\x3e\xd7\x03\x83\x56\x94\x0b\x3b\x2c\x17\x25\x9c\x16\xfc\x00\xec\xbd\xd1\xdf\xd7\x5a\x86\x8a\x22\xc9\x8a\x2e\x0f\x1c\x7e\x2d\xe2\xd3\x11\xfe\xf8\xb5\x62\x39\xf9\x12\x89\x04\x6f\x4f\x17\x8f\xed\x69\xd4\xb2\x32\x21\x47\xb8\x12\xc2\x3b\x56\x95\x60\x6a\x18\xf6\x31\x6e\x7e\x87\xfd\xf5\x96\xf6\x7d\x46\xcd\xf5\xba\x58\x93\x8f\xb6\x72\xc0\xf2\x93\x62\xa5\xd8\xb2\x78\x49\x11\xb5\xa2\xd6\x4f\xa7\xa5\x96\x2c\xb1\x66\xb6\xc1\x77\xca\x29\x5a\xd1\xc3\xe9\xc7\x2a\xe7\x7e\x39\xfd\x64\x95\x6b\x3d\x37\x9d\xd6\xf4\x8a\xd3\x29\xec\xbb\x04\x63\x2f\xe7\x3e\x21\x83\xb0\x7c\x3e\xf9\x6c\xf1\x2a\x5c\xdc\xb7\x1c\x5e\x83\xc0\x45\xa2\x47\x3d\x57\x7c\x5c\xa6\xe4\x86\x1b\xdf\xd9\x72\x4a\x67\xd1\x6e\xb2\xd7\x09\x31\xb4\xac\x62\xdc\xa7\x0b\xf6\x39\xe8\x31\xd7\x32\xe0\xf1\x5c\xad\x17\x13\x77\xe9\xc8\x43\xab\x08\x48\x32\x8a\x4d\x35\xf0\x97\x8d\xe8\x3f\xd8\xf3\x7e\x8e\x57\x71\x2e\xc7\x66\x42\x09\x00\x81\x79\x75\x07\x79\xa2\xad\xc6\x87\x5e\xa3\x94\xbb\xd4\x3f\xcb\x9c\xa3\x0a\xf8\xf1\x4e\xb9\xb9\xb4\x58\xbb\x62\x2f\x54\xb7\x0b\xa6\xd3\x80\x0a\x98\xd9\xd2\x12\x71\x62\x71\x2d\x54\x3c\xb2\x82\xc1\xfb\xb7\x8a\xf1\x26\x14\xbe\x45\x28\xf2\x88\x44\x5f\x15\x06\x8c\xa6\x92\x11\xff\x06\x9a\xff\x72\x8f\x20\x62\x52\x50\xc8\x60\x6e\xf3\x2d\xe1\xca\x2b\x8a\x15\x2f\x93\x5c\xfb\xf0\x17\x38\x22\xb1\xec\x57\xa5\x31\x44\x59\x3b\x76\x32\x42\x96\x1d\x75\xa1\x3b\x18\x20\x81\x65\xd5\xad\x92\x09\x5a\xcd\x4d\x64\x2a\x25\x72\x58\x1d\xb2\x9a\x40\x42\x55\x96\x01\xc6\xd1\x74\x77\xe7\x01\xeb\x62\x77\xe5\x3d\x98\x4c\x59\x9a\xe4\x0d\x7b\x51\x4d\x4c\xbe\xdd\x4c\x07\xcb\xe7\xf2\x0d\x59\x39\x95\xa1\x46\x65\x66\x4c\xa7\xc3\x2d\x47\x66\x2f\xb0\x06\x64\x21\x84\xe9\x66\x4e\x44\xf5\x3f\xa4\x24\x7f\x81\xf9\x85\x05\x23\xe0\x3b\x5e\xd1\x51\xef\x19\x3b\x6d\xc9\x4d\x48\x6d\x96\x80\x0a\xb7\xc8\x5f\xd3\xfe\xe5\xa3\x41\xc4\x30\xd1\x30\x41\xd3\x42\xb8\xdd\x71\x51\xfb\xed\x11\x95\x3f\xe6\x50\x28\x0c\x89\x9f\xd7\x25\xf9\xa8\x79\x66\xc1\x67\x04\xc3\x38\x88\x50\x63\x48\x80\x12\xf4\x9d\x2a\xfd\x21\xbf\xe8\x86\xdb\xb6\xbc\xba\xf2\x69\xdf\x36\x48\xea\x30\xf3\x20\xe1\xd9\x27\x3f\x50\x68\x95\xbc\x5e\x9c\xb2\x03\x09\xf6\xe7\xd7\x16\x21\x33\x6c\x06\x18\xa4\x3f\xd7\xe3\x5c\xc6\xd8\x15\x11\x4d\x33\x25\xfc\xbc\x55\xe9\xc3\x09\x8f\xf0\xcb\xbd\xd1\x4e\x01\x68\x46\x72\x48\x1c\xb6\x80\x3f\x31\x07\x7d\x55\x76\x1b\xff\xc5\xd6\x37\x64\x41\x21\x14\x92\xe4\x5a\xbf\x96\x05\x6a\xde\xe6\x37\xe7\x7f\x63\xe8\x7f\x6d\x83\x10\x31\x4c\xa1\xff\x10\xbd\xdc\x7e\xf8\xc3\xc6\x15\x89\x0b\xa7\xdd\x51\xff\x20\xb0\xfe\x81\x98\x5f\x7a\x54\xae\x6e\x52\x3b\x36\xa0\x4b\x17\x0d\xb9\x3d\x11\x94\xde\x7e\xff\x91\x7b\x31\x98\x19\x3f\x23\x77\x50\x5e\xff\x83\x95\x64\xaa\x3c\xaa\x59\xa4\x45\x0f\x11\x63\xf1\xf2\x30\xea\xd8\x0e\xfa\xcf\xa7\x49\xe6\x3d\x9d\x0b\x73\x22\x81\xa8\xfc\x72\xd8\xde\x22\xbf\x37\x33\x4e\x62\x25\xc4\x42\xf7\xd2\xa5\xac\x38\x2b\x27\x2f\xeb\x40\x02\x64\xc5\x2c\x14\xeb\x09\xb8\x48\xc3\x41\x45\x3a\xbb\xf2\x19\x80\x2f\xd1\x3e\x45\xd7\x0c\xd9\xf3\xdc\xda\x63\xb1\xd1\x66\xea\x4f\x2c\x84\x02\xab\xf6\x69\xd1\x52\x42\x95\x5a\x79\x3d\x9e\x95\x8a\x2c\x88\xb0\x66\x58\xe7\x71\x68\xe6\x4a\xb8\x32\xf5\xcc\x0d\x68\x7b\x7a\x41\x1a\xff\x7e\x84\x7f\x6d\x86\x10\x51\x61\x64\x18\x20\x84\x36\x56\x92\x68\x08\x65\x36\x4c\x63\x0b\xc4\x44\x7b\xa0\x0e\x8a\x40\x3a\x4d\xea\x13\x4f\x13\x56\x30\xf8\xa8\xbd\xa1\x80\x86\x08\x72\x12\x54\xac\x5e\x63\x44\x39\x33\x5a\x47\x88\x3a\xa8\x44\x50\xa1\xd2\x2c\x4a\x07\x41\x75\x8a\x06\x42\x85\xe1\x27\x95\x67\x19\xe2\x83\xca\x7d\xae\x95\xb9\xa6\xab\xa8\xad\xab\x3b\x54\x17\x69\xdd\x30\x7a\x0c\x19\x61\x58\xad\x91\x7a\xd4\x52\xe4\x41\xf3\x5b\x3b\x3b\xcb\x60\x77\xe8\xc5\x54\x2f\xdb\x9e\x5f\xe5\x2a\xaa\x84\x02\x0d\x07\x3b\xa9\xff\x59\x70\x63\xc0\xcf\xb0\x25\x22\x78\xab\x8c\xde\xa2\x0c\x6b\x38\x30\x25\x9d\xcd\x59\x84\xc0\x31\xf1\x15\xf6\x30\xf6\xeb\xae\x61\xe6\x38\x61\x73\x7e\xad\x86\x58\xd3\x19\x47\x20\x1a\x63\xaa\xd8\x3c\xd3\xdf\x50\xf3\x5f\xdb\x3c\x44\x54\x04\x09\xa4\xfb\x74\x9f\x5a\x33\x59\xb3\x6e\x22\xe2\x50\x23\x27\x8f\xf8\xe4\xd7\xbb\x5b\xe4\x98\x80\xba\x28\xd4\x64\xaf\x63\xf7\xfc\xc4\x8d\x0d\x2c\x0a\xeb\xf1\xcd\x57\xc1\xc2\x8a\xc3\x12\xdc\xd5\xb8\x35\x68\x5b\xe0\xf7\x34\x68\x7e\xd0\x09\x1e\xe1\xa4\x3b\xf3\x3f\x7e\xf5\x3b\xe1\x04\x80\xbe\xca\x7a\x46\x45\x98\xbc\xc6\xae\x60\x69\xba\x2a\x28\x3f\xe8\xf9\x9e\x47\x88\x56\x9a\x01\x4b\xc2\xef\x1e\xe7\x5e\x76\x46\x16\x2c\x9b\x16\x83\x5a\x84\x75\xc1\x51\x78\x53\xce\x8c\x90\x3c\x5d\x53\xae\x7a\x03\x75\x45\xa8\x24\xc4\x69\x2d\x20\xcc\x57\x34\xd5\x69\xfa\xf3\xaf\x65\xff\xda\xea\x21\xa2\x83\x50\xa0\x9a\x47\xce\x54\xbc\x93\x34\x36\xb6\x83\x87\x26\x7e\x8b\x42\xdd\x70\x27\x79\x73\x38\x2d\xbe\x7d\x48\x05\x6d\x92\x6a\x59\x70\x3d\x2d\xa8\xd6\x92\x72\x2a\xae\x2e\x1c\x53\x66\x4d\xf5\xf9\x6a\x08\x76\x11\xce\xed\x3a\x46\xdb\xa2\x9a\xde\x71\xb3\x80\x48\xc8\x98\xb2\x2b\x09\xac\x3d\xdd\x4b\x62\x92\xf9\xd3\xc2\x3b\x11\x51\xde\x51\x67\xa8\xb8\x93\xe6\x68\x12\xba\x49\xaf\x63\x6f\xf9\x73\x63\x8f\x54\x37\xbe\xef\x06\xcc\x2e\xf6\x16\x04\xa3\xff\xd6\xe3\xa8\xf1\xce\x8c\xa6\x96\xc8\xbb\xd5\xe4\xf1\xcb\x17\xb7\x7e\x2f\x6d\x81\x3d\xda\x24\x2e\xcc\xc2\x7d\x59\xf6\x3f\x8d\x89\xd8\x47\xab\x3e\x88\xc3\xf0\xd7\xb6\xc7\x19\xd8\xfa\x6b\x78\xd4\x0f\xbf\xa0\xec\xd5\xe5\x87\x2e\x14\x82\x11\x1c\xa9\x69\x4f\xcd\xff\xff\x94\x76\xa4\xed\x7a\x29\x43\x70\x9f\xe7\x78\x6a\xc4\x26\x94\x09\x8a\x46\x39\x2f\xcd\x69\x65\x31\xa7\xec\x2f\xef\x6d\xfe\x18\x9f\x4f\x02\xa5\x1e\xf7\x2f\xe8\x3e\xcc\x14\xf9\x18\xa4\x09\x4b\xb0\x99\x62\x8c\x04\x10\x3e\x34\x8a\x9c\xcb\xc3\xbe\x08\x95\xf7\x60\x22\x18\x8a\x78\x0b\x2c\x74\x75\x37\x91\x17\x0a\x7b\x72\x6e\x86\xda\x50\x15\x5f\xa0\xe3\x44\xe8\xfa\x50\x88\xa3\x5c\x5a\x96\x96\xdd\xb9\xbf\x4a\xc1\x09\xc1\x01\xe7\x0e\x26\xfc\xcc\x5b\xdd\x9b\x3b\x55\xbe\xc9\x58\xca\xe9\xbc\x67\xf2\x7d\xf6\x94\xbe\x09\x38\x99\xb2\xab\xbb\xc6\xf6\x76\x7e\x48\xa0\x76\x73\x25\xd9\xc5\x5c\x55\x4b\x71\xe7\xdc\x3a\xdd\x5d\x40\x19\x6f\x62\x1a\x02\xd6\x6e\xd4\x6e\x04\x7d\x23\x54\x70\x90\x38\x6b\x35\x10\xc4\x4b\xd6\x0b\x97\xc4\x4b\x56\x7d\x4b\xca\x36\x6c\xd6\x1a\xa9\xcd\x41\x99\x42\xbf\xdb\x96\x30\xf6\x96\x26\xcb\x44\xe9\x90\x02\xda\x58\x1e\xd7\xc8\xe8\xfd\xba\xce\x90\x1a\x86\xfd\x92\xac\x34\x0f\x45\xf5\xa9\x5e\xd5\xf2\x7b\xdf\x31\x30\x62\x58\xe8\x5b\xb0\xb0\xb6\x00\x36\x11\x10\xca\xbe\x27\x99\xa0\xd7\xb6\x6a\x7c\x4e\xec\x44\xb6\xc9\x21\x10\x9b\xce\x9a\x0c\xd7\x36\xa4\x3c\x59\xaf\x2b\x65\xf3\xda\xeb\x69\x50\x21\x1b\x2a\xc4\xda\x7c\xb7\xc5\x85\x45\xd7\x68\xb5\xcf\xd9\x85\x9d\xbd\xdb\x28\x63\x2f\xf3\x4c\x11\x19\x7c\x2b\xae\xf4\x71\xfe\xa3\xe3\x85\x8e\xbd\x81\xa9\x03\x9d\x24\x5a\x99\x36\xda\x94\x9b\xb3\x2d\x36\xd5\x43\x5d\x45\x51\xf6\x13\xeb\xdd\x17\x68\x76\x75\x12\xa4\xe9\xa7\xe7\x93\xbd\x6a\xa2\x0a\x9f\xd9\x1f\x36\x9b\xdb\x08\x9a\xd0\x90\x5d\x52\x51\xb4\x0b\x33\xff\x94\x93\x52\xe4\x11\x73\x95\x83\x45\x07\xd4\xa8\x36\x31\x0c\x9d\x91\x30\xf9\x1d\x69\xa1\x0c\xcb\x51\xae\x92\xe3\xf0\x91\x53\x35\x56\x7d\x0b\xce\xe3\x3c\x97\xec\x9d\x69\xf0\x07\x1b\x7e\xa0\x28\x43\xfc\x09\x66\x5d\xef\xc8\xe2\x85\x6b\x84\x05\xcb\x5e\x17\x91\xf0\x16\xe3\xce\x85\x62\x39\xe3\x0e\x55\x14\x88\x12\x5e\x3d\x0d\x4a\x36\x70\xb2\xbc\x12\xcf\xd7\xc6\xca\xf5\x80\xf5\xd8\xf3\x38\x13\xc3\x3b\xe8\xa4\x92\x17\xf0\xb2\x3f\x53\xf5\x67\xaa\x40\xdb\x1a\xc0\x5f\xc1\x8f\x71\x9d\xa7\x7f\xc5\x7e\x66\x2e\x24\x38\x57\x6f\x14\x42\x9a\x16\x70\x85\x1a\xac\xf0\xe3\x94\x43\x0b\x5d\x25\xb3\x47\x1c\x98\xd7\x10\x32\x8e\x60\x42\x28\x4b\xec\x1f\xae\x73\x28\xa7\xde\xd9\x7b\x92\x5d\x1e\xf5\xd1\xf9\x43\x6f\xb6\x44\x69\xe4\x21\x42\xa8\x20\x41\xcb\xb1\xe0\x64\x7c\x3a\x7f\xe0\x12\xc6\xe0\xdc\x4f\xed\xb8\x8f\x83\x05\xe4\xb3\xcf\xfd\x29\x27\x8d\xa8\xc7\x3e\xac\x63\x06\x8c\xff\x01\x8c\x22\xdb\x2e\x5e\xcf\x5c\xce\x20\xd4\x0e\x46\xed\x51\x58\xdb\x3b\xe4\xa9\x2f\x58\xac\x89\xb0\x88\xe1\x1b\x5d\x4c\xf4\xa3\xe3\x73\x07\x66\x5f\xd7\x09\x79\xdb\xa7\x99\xa8\x8d\xec\x6e\xea\x77\xd9\xd4\x47\xf9\x75\x48\xbf\x5a\xdf\x1e\x1b\xaf\xc4\xa2\x97\x90\x2e\x95\xcb\x3d\x21\x3b\x58\x3e\x38\x8d\x8d\xcd\x2d\x12\x57\xeb\xa1\x8a\xa9\xf6\x19\x58\xf2\xe7\xcd\x38\x6b\x57\xea\xe7\xf2\x94\xf6\xdc\xf8\xd3\xaa\x01\x8f\xf7\xa5\x42\x20\x4b\xc0\x0c\x48\xe9\xd7\xe2\xdf\xb4\x8a\x1e\x90\x8f\x6b\xa2\x8e\xa6\xbe\xf5\x7c\x54\xcf\x43\xe4\x71\x5d\xfd\x7d\x0c\x10\xd8\xf3\x4f\xa0\x10\xdb\xf2\x38\xdb\x54\xf7\x23\xea\x3e\xa7\x45\x7a\xbd\x89\xf9\xc5\xd0\x19\xee\xc3\x1f\xf3\xdf\xcc\x90\x25\xc4\x06\xa0\x22\xa8\x4a\x2c\x18\x4b\x4a\xf6\xf3\x79\x55\x72\xd3\x8f\x39\xd9\x99\x88\x49\x06\x87\x8b\x8a\x0d\x0a\x6f\xa3\x48\x9a\x19\xf6\x8a\x2e\x70\x4a\x61\x42\x9a\x4e\x4e\x67\x85\x0d\xa7\x75\xa6\x88\x5e\x57\x5c\x88\x50\x84\xc0\x25\x12\xf8\x7d\x53\xbf\x81\x68\xc6\x22\xe0\x77\x03\xaa\x99\x14\x56\x04\x44\x65\x2d\x30\x49\x0a\x0f\x3f\x28\x63\xce\xe3\xcf\x22\xb8\xc2\x17\x5a\x39\xb6\x9b\xd7\x35\xfe\x18\x16\x35\x2b\xf7\x02\xb3\x1f\x33\xee\x79\x94\x4e\xde\xa0\x7f\x7e\xd6\x33\xc9\xcd\xa8\x4d\x51\x83\xdf\x6a\x13\xef\x2d\x98\x18\xde\xfe\x48\x77\x15\xee\xcd\x06\x64\x23\x9b\xd4\xbc\x63\xaa\x4c\xca\xe5\x03\xf9\x7b\xb2\xe5\xa1\x2f\x98\xce\x17\x8f\x32\x0e\xf2\xbe\xde\xd0\x97\x18\x8e\x10\x70\x0b\xf6\x80\xaf\x6a\x62\x65\xb3\x53\x63\x4d\x49\xfb\x83\x27\x78\xa7\x27\x5c\x46\xc6\x82\xed\xab\xb0\x9b\xb5\x61\x63\x15\x5b\x7b\xaf\x50\xaf\x74\x12\x20\x46\x3f\x6a\x11\x68\x1b\xa0\x6a\xbe\x11\xcd\xe7\x16\xe6\x6a\xde\x5f\x86\xd5\xcd\x75\xf4\x56\x8a\xbb\xc5\xaa\x10\xde\x94\x49\x49\x1d\x88\xf9\xa6\x32\x42\x44\x2a\xc6\xf0\xbe\x6e\xd2\xe4\x8c\x16\xca\xdb\x9f\x94\xa0\x9b\xbd\xb2\x63\xe1\x91\x5c\xfc\xdc\x54\x59\x60\xbc\x0b\xa4\x5b\xfa\x30\x56\x2a\x36\x42\xf9\xaa\x34\x0d\x15\x14\x49\xa3\xee\xde\x7a\x22\x64\x70\x93\x10\xa9\x33\x9f\xbe\xd3\x9e\x13\xb8\x1b\xfe\x0f\xd5\xfe\x13\x5c\xcb\x03\xc5\x83\x8f\xc5\xd5\xd4\xd9\xf2\x19\x2d\x33\x59\x37\x9c\xea\xbc\x5f\x56\xca\xa5\xe5\xa7\xde\x90\xa2\xbf\x33\x79\xfa\xa8\xa2\x0c\x54\x8d\x45\xe5\x97\xc3\xa8\x5c\xcd\xba\x19\x6a\x76\x06\x5f\x4c\x1d\x3d\xcc\x6b\xb6\x85\xff\xf8\x8c\xd5\xdf\x90\xe3\x2a\x02\x73\x5a\xf7\xdb\xca\x2e\x35\x23\xdf\xf3\xf6\xc2\xe9\x88\x12\x12\x65\xd3\x69\x0e\xbf\x96\xac\x37\x73\xe4\x91\x37\x15\xa2\xb7\xd0\x08\x24\xff\xa1\xdf\x62\x11\xf9\xb2\x53\x0f\xdf\xf2\x80\xbf\x9e\x19\xdf\xde\xd3\x17\xa6\x17\x8a\xf2\x70\xcc\xd2\xd0\x43\x6b\x62\x80\x59\x60\x96\x0b\x80\x86\xfd\xcc\xb7\xf8\x09\xc5\x8a\x7f\xee\xf2\x7d\x22\x58\xf7\x79\x92\xbf\x77\x1e\x6c\xdd\x4f\xa9\x35\x4d\xa8\x34\x18\xb2\xc8\x5d\xe4\xa7\x5f\x35\x2e\x8b\x17\x87\x0b\xdd\x46\xe5\xa4\x57\x5f\xa3\x8f\xe1\x5d\x2e\xfc\x7a\xe5\xd0\x6b\x69\xc2\x4b\xc8\xf3\x69\xc1\xc4\xc9\x41\x20\x8d\x32\xf0\xa9\x9a\x6c\x71\x71\xb4\x7a\x85\x67\x74\x97\x52\xea\x3d\xef\x46\xc8\x87\xa0\xfb\xd9\xca\xce\xc7\x7e\x73\xb1\xe4\x87\x9c\x67\xc0\x54\xb1\xde\xf1\xa0\x33\x48\x88\xa3\x46\x18\x81\xa4\xc5\xba\x2b\xf0\xc6\x04\x45\xa9\xaf\xb0\xfa\x25\xbe\x7d\x6f\x1b\xae\xd4\xd7\x08\x90\x2f\xe6\x94\xad\x49\xa3\xee\xbf\x6d\x8a\x24\x74\x40\x1f\x55\x7b\xe1\xb5\x84\xf7\x40\x36\x29\x16\x02\xb3\xd9\x5c\x58\x9c\xd8\x44\x0b\xde\x8e\xc7\x97\xb7\xe4\xae\xb4\x31\x05\x08\xd3\xe3\xa6\xc6\x74\xc9\x7f\x9e\x08\x77\xde\xa6\x97\x3a\x85\x3f\x50\xee\xc0\x0e\xd2\xe9\x09\x00\xd6\x9f\x39\xbc\x2c\x61\x6b\xf4\xf7\x6e\x03\xb4\x3d\x8e\x4a\x14\xc7\x57\xd9\x36\x73\xae\xe3\xe5\xef\x3f\x05\x84\xbc\xea\xf4\x6e\x86\xf5\x7c\x7a\x7e\xc3\xb3\x0f\x5c\x94\xc7\xf2\x31\x43\x3c\x61\x2a\xee\x38\xd7\xad\xed\x2e\xad\x3a\x5a\x85\xf5\x3b\x22\xd8\xfd\x2c\xb6\x1a\x2a\xc0\xa4\xbe\x5b\x7f\x33\x9e\x88\xdf\x53\xea\xe0\x5c\xe8\x1f\xa6\x66\x83\xf2\x5a\x78\x46\x4f\x5a\x94\x34\xdc\xce\xae\xef\x38\xfa\xb7\x0e\x48\xbd\xfe\x28\x75\xf4\x89\xd2\xe4\x72\xf3\xb7\xf7\x3b\xa8\xbb\x04\x36\x7d\x9d\x9c\xa4\x48\xd5\xf5\x82\xe9\x5c\xfd\x52\xd7\x3f\x49\x67\x20\x95\x03\xaa\x48\xef\x60\xdd\xcd\x5a\x5f\xf8\xf8\x88\xd7\x9d\x46\xe4\xc7\x37\x4c\x32\x52\xe5\x9c\x37\x37\xc7\x10\x2a\x37\x11\x2e\x8e\x0c\xc0\x28\xcd\x29\x35\x5c\x99\xc0\x76\x84\xa2\x8c\x88\xb1\x31\x25\xbb\x77\x63\x84\xe5\x9f\x7d\x1e\x6e\x1b\x15\x09\xc7\x83\xa3\x96\x38\x00\x51\x1c\xdf\x9e\xcf\xec\x93\x66\xf7\xc4\x11\x4a\xe7\xb3\xcc\x79\x48\xbb\xfb\x41\xa1\x3f\xbd\x46\x42\x72\xb0\xfc\x0d\x27\x3c\xd3\x68\xa2\x80\xf9\x4f\xa0\x51\x31\x39\x63\x6b\x47\xd2\xa8\xb0\x17\xa8\x2a\x30\x44\x81\x51\xf8\xfc\xb5\xa6\x45\x4d\xd0\x76\xcf\x7b\x5c\xea\x63\x1f\xe0\x37\xad\x26\x16\x5b\x55\xd8\xfe\x63\x4a\xab\x84\x2a\x13\x26\x2e\x88\x23\x0f\x13\xca\xa7\xff\x01\xb5\xc2\xfb\xe1\xd7\x17\xb3\xf2\xf8\xac\xa7\x41\x8f\x44\x78\xd3\x0d\x90\x4e\x6b\x09\x5d\xcd\x14\x9b\x76\x1b\x8a\xab\xb7\xc6\xb6\x1f\x72\xc3\xb3\x92\x26\x61\x42\x85\x4c\x7b\x2e\xc0\x39\x1d\x1b\xf6\xb9\xf9\xf3\xab\x91\x14\xee\x98\x10\x67\x91\x8e\x66\xa2\xcc\xcf\x9e\x08\x6f\x9f\x21\xae\xa0\x5f\xfd\x16\x09\xeb\x54\xd4\x7a\xfa\x52\x3c\x9e\x18\x57\x6a\x01\xac\x25\xdc\xf7\x66\x30\x63\x91\xb2\x24\xf8\x43\xce\xd8\xc1\x70\x97\xbf\x90\x2c\xed\xdb\x8a\x59\xe1\x41\x11\x3c\x8a\x29\x39\xed\x47\x29\xe2\xbd\xbe\x84\x0a\x51\xfe\x43\x1e\xc4\x8a\x6a\x89\x54\x71\xc2\x56\x4c\x54\x8d\x31\x2c\x8c\x88\x1b\xea\xbf\x41\xdc\x3f\x8f\x5e\x31\x68\x72\x28\x2c\xc0\x0d\x7c\xbc\x37\xb1\x6d\x5f\x87\xb4\x5d\x0d\xa4\x5c\x3a\x73\x0c\xa8\x08\xe8\x05\x22\x1c\x90\xaf\x1b\x98\x24\xd1\xe0\xd4\xa2\x17\x80\x6d\x2a\x39\x25\x9d\x9b\x6f\xc7\xf2\xf7\x5b\x76\x51\x1a\x9a\xb6\xce\x3d\xdf\x57\x32\x46\x6c\x94\x4f\x57\x9b\x1f\x95\x6e\xae\x04\xa6\x80\xa1\xec\xd4\x8f\xb5\xd9\x4f\x9d\x28\xf1\x91\xed\x13\x44\x1d\xec\xa3\x15\xb2\x3a\x2b\x18\x9b\xc6\x97\x95\xdf\x3f\x25\xae\x5a\xb4\x16\x04\x00\x50\xce\x68\xd8\x56\xef\xb0\x1a\x56\x39\x6e\xf9\x95\xe2\x44\x63\x25\xc4\x44\xcd\xe9\xad\xb5\xb3\x4d\x39\xa7\xef\x81\x6c\xdb\x34\x93\x7f\x4d\xfb\xd7\x11\x00\x11\x43\x82\x82\xc2\x01\x4c\xd3\x45\x85\x8f\xb6\x40\x86\xcd\x81\x5e\x57\xb7\x29\x46\xd2\xc8\x23\x89\xd4\x0d\x41\x62\x9f\xc1\xe6\x16\x54\x15\x75\x15\x5d\xc7\x05\x3b\x70\x74\x9f\x79\x96\x4b\x6e\x7f\x60\xf9\xcc\x8e\x55\x18\x64\xbb\x13\x6b\xaf\xf6\x82\x6f\x76\x20\x45\x7e\x53\xab\x37\x44\x7e\x1c\xec\x80\x99\x2e\x78\x27\x4d\x25\x34\xb0\xe6\x03\xf3\xf8\x7c\xb2\xdb\xbd\xdd\x65\x6c\x37\xc3\x38\x03\x47\x0f\xef\x96\xdf\x4b\xb2\x9e\x0e\xcc\xd4\x90\x5a\x25\x6b\xb3\xee\x35\xd4\xac\x19\xd9\x12\x11\x8e\x72\x24\xd1\x6d\x79\x65\xf6\x99\x91\xd2\x29\xa4\xd7\x50\x5f\x27\xda\x64\xfc\xf5\xdd\xff\x75\x64\x40\xc4\xfc\xa1\x30\x31\x81\xe2\x04\x29\x28\x24\xdb\x32\x9f\x28\x7e\x18\x31\x84\x86\x37\x59\x44\x90\x35\xb3\x17\x7e\x5d\x8e\xcd\x85\xe9\xea\xe5\x3f\xb7\x69\x0a\x01\x52\xee\x41\x11\x01\xce\x54\x53\xaa\x7e\x4b\xbd\x82\x5d\x21\x8b\x90\xf4\x63\x5e\x7d\xd9\xda\x49\x23\x2a\xf7\x4d\x6c\x29\x5d\x14\x64\xd0\x1b\x79\x49\x9f\x8b\x3b\x24\x54\xa1\xe4\xb1\x8a\xad\xf0\x59\x80\x99\xa3\x5b\x99\x88\xfe\x5c\x14\x63\x16\xf9\x01\x83\x5f\x53\x18\x15\x0b\x80\xf2\x8f\xe4\x70\x31\x3a\xe4\xb9\x29\xc0\x60\x04\x31\x69\x53\xdf\xe7\xf9\xb8\x26\x51\x71\x88\x0c\x51\x70\xbc\xc6\x20\x44\x74\x7e\xfe\xa4\xbf\xfe\x8f\x23\x06\x22\xe6\x8f\x89\x0d\x26\x15\xbc\xcd\xcb\x17\x17\x69\xf1\xc8\xf7\xe0\xc5\xbc\x5e\x33\xe0\xd8\xa6\x28\x18\xa5\xc2\x54\x11\x38\x5e\xd9\x56\xf4\xa3\x18\x9c\x83\x15\x43\xbd\x01\x71\x25\x95\x3c\x17\x9a\xf9\x61\x84\x31\x1a\x3a\xa4\x9a\xfb\xd2\xc5\xe8\xfc\x0f\x9c\xbb\x18\xfd\xd8\x6d\xf7\xc4\xbe\x20\x13\x8c\x4b\xe1\xa0\xdd\x2e\x5d\x90\xfb\xc1\xeb\x56\xab\x83\x92\xf3\x8e\x80\x6c\xd4\x18\xbb\x8d\x71\x1c\x7d\xdf\x53\x04\xe9\x94\x67\xe0\x6d\x6c\xed\xe2\x9f\x2f\x06\xc1\x63\xed\x3a\x8d\xa1\xc7\xaf\x59\x9e\x07\x3d\x83\x78\xa3\xa9\x29\xc9\xd0\xef\xbf\x3f\xbd\x11\x60\xdd\x58\xf8\x1b\x4f\xff\xeb\xf0\x82\x88\xb2\x91\x83\x4c\xfd\x16\xe6\xcd\xa1\xe5\xb0\x5a\x5a\xd9\x3b\x3a\xb4\x22\xf5\xf5\x16\x62\x9c\x7c\xcb\x2a\xf4\xc9\x4d\x1e\xbb\x2b\x61\xfa\x24\x2d\xfe\xc0\x3b\xf0\x6e\xbe\xaf\x56\x47\x60\x40\x4c\x36\x8e\x88\x49\x72\xab\x94\x50\x19\xcc\xb1\xfd\x4e\x25\x26\x55\xa5\x7d\x81\x39\x85\x84\xb9\x07\x40\xcf\xd2\x73\x62\xee\xa3\xf3\x2c\xdb\xcc\x2b\xbf\x08\x79\xf7\xff\xa8\x19\xb5\xb7\x95\xff\xbc\x89\xea\x3e\x9e\x13\x32\x29\x91\x5d\x00\xf6\xcc\x47\xe3\xe2\x06\x74\x14\x3b\xc2\x79\xbc\x96\xfc\xac\x02\xa5\x2f\xc3\x19\x11\xcf\xf1\xd2\x17\xda\xc6\xe8\xc0\x49\xe2\xbd\x37\xc8\x77\x8e\x43\x31\x60\xf5\x65\xb7\x2c\xe1\xf1\x31\xe7\x00\xa5\x81\xa9\x8f\x28\xb6\xf7\x6e\x5b\x99\x5b\x4e\xd3\xa4\x21\xc0\xf0\x3b\xb9\xd3\x65\x39\xcc\xff\xf1\x58\x16\x23\x47\x81\x06\xb3\x0a\x6e\x9e\xaf\x3d\xc7\x57\xe9\x67\x3e\x0f\x38\xf7\x5f\x90\xe3\x3a\xe8\x1b\xa0\xb7\x5c\x74\xf0\x05\x0a\xb6\x59\x0f\x26\x3d\xbc\x8c\x05\x5e\xe2\x6d\x74\xff\xc2\x00\xe7\xf6\x2c\xda\x54\x8f\xbb\xb1\xa2\xa6\x83\x0d\xdc\xa3\xa5\xa3\x8e\x78\x9e\xd4\x9f\xf3\xe1\x9a\x1b\xcf\x78\x60\x2b\x97\xb9\xf1\x13\x72\x8d\xd5\x8c\xfc\x95\x32\x5b\xb7\x7d\x86\xc7\x96\xb4\xda\x35\xcb\xaf\x71\xaa\xed\x52\x09\xcd\x83\x77\x0a\x0b\x48\x85\x7f\xaa\x5f\xf3\x90\xe3\x90\x59\x57\xb3\x4d\xbe\x67\x17\xbd\x43\x9a\xde\x8d\xe3\x1e\xc3\xfe\xe9\xcf\x9a\x36\xac\xb7\xdf\x14\x00\x6a\x35\xff\x46\x9e\xf1\xe2\xa2\xf2\x24\x09\x71\xda\x0e\x4e\xad\x67\xf8\xe0\x7c\x55\x19\x02\x67\xc4\xe7\x88\x62\xda\xf6\x6a\x43\x91\x15\x4c\xb2\x1d\x09\x5b\xf4\x1d\xb6\xd7\xda\x43\xb2\x2f\xb7\x9e\xfb\x18\x8b\x10\x52\x16\xef\xc9\x8c\x51\x4e\xbd\xbc\xfc\x81\x01\x5f\x73\xe3\xf6\x77\x3d\xfc\xeb\x74\x80\x88\xc1\x40\x75\x82\x2d\xad\xae\xd5\x1a\x8a\x78\x58\xc1\xe7\x63\xe3\xfd\xa5\x64\x6f\xcd\x87\x4b\x53\x74\xfb\x1b\x8c\x18\xd2\xf1\x56\xa3\xc7\xfb\x39\xf6\xc1\x1a\x9c\xd5\x8e\x23\x85\xee\xec\xd6\xb3\x44\x85\xc9\xcd\xb7\x2a\x76\xa7\x61\xf6\x9c\xe5\x44\x2f\x77\xf5\x6b\xf0\xce\x75\x19\x3f\xd6\x81\x4e\xda\xd8\xc7\x3a\xcf\x8f\xb3\xd1\x44\xa9\x57\x16\xe6\x2e\x1f\xd6\xe8\xd0\xc4\xdd\x15\x7c\x90\xc3\x50\x34\x9c\x6d\x11\xce\xbf\x23\x49\x03\x50\x9a\x02\x6c\xfb\x2b\x8b\x5c\xc7\x94\x61\x6d\x45\xf3\xb4\xcb\x97\xdc\x07\xb5\x86\x33\x9e\xc3\x0c\x13\x76\x42\xa5\xfc\xe2\x8a\xae\x97\x63\xb8\xff\x0d\x44\xca\xbc\x0b\x24\xde\xc2\x91\x7f\x48\xed\xeb\xc6\x1d\x31\xf1\xc0\x97\xfc\xe1\x4d\x59\xcd\x3a\x10\xba\x7a\xf3\xa8\x83\x92\x90\xf2\xff\xc2\x74\xbf\xe3\xff\xe8\xf2\x4a\x36\xac\x50\x1f\xbc\x3e\x46\x90\x21\xc8\xba\x3f\xf0\x08\x1a\x54\x69\x38\xa4\x73\xbd\xcd\x65\x77\xd5\x59\x3b\xd1\xc4\x99\x24\x7c\x72\x15\x48\xba\xb2\x1e\xa9\x96\xd4\x9b\x49\x62\x49\x52\xa9\x6e\xe0\xb4\x95\xed\x8e\x23\xd2\x11\x54\x6f\x44\xc3\x74\xd2\x8c\x16\x26\x00\x57\xe1\x13\x55\x64\xca\x7b\xd6\x2b\x87\xd2\xfd\x3d\x28\xf6\x0c\xa5\x98\x77\x9f\x3a\xa4\x10\x2d\xfd\xa3\xde\x33\x7f\x7b\x76\xb2\x73\x00\xd0\x9d\x54\x9c\x51\x94\x8a\xe5\x9f\x9b\x69\x3e\xd6\x92\xd7\x5e\x9d\x89\x70\xe2\x2d\x5e\x43\x2d\x37\xec\x7d\x0f\x31\xa7\x3e\x2e\x4e\x91\x01\x3c\x15\x52\xc7\x44\x35\x81\xda\x38\xf5\x19\xcf\x83\x45\x42\x58\xb8\x73\x3d\xbd\x6a\x6c\xca\x0b\x65\xd4\xb1\x94\x85\xd3\xb4\xd2\xc2\xec\xa7\x41\x29\x5e\xb1\xee\xb5\xe9\x7e\x93\xf3\x34\xe7\xc5\x33\xfa\x05\x87\x43\x2e\x3f\x4a\x09\xd7\x02\xf5\x96\x08\x99\xc3\x65\xab\xb1\xb3\xe0\x09\xf9\x3d\xd9\x1c\xbe\x32\x7b\xbf\xfa\x8b\xe3\x46\xe8\x83\x27\x2b\xdb\x8c\x6e\x3a\x99\xb2\x5d\xfa\x96\x3a\x4a\xda\x08\xe6\x11\x9d\x11\xf0\x78\x79\x2f\x82\xaa\x9d\x67\x7a\x5a\xad\xa6\xc6\x9b\x2c\x9f\xbb\xe2\xd2\x16\x23\xa6\xf2\x04\x46\xc6\xac\x4a\x5d\xd6\xf6\x76\xfa\x1a\x9f\x06\xb5\x59\xae\xda\xfe\x85\xba\x7e\x49\xf0\xc1\xaf\x99\xcc\x5e\x90\xef\x97\x0f\x4c\x0d\x6d\xb7\x0a\x7d\xd7\x86\x40\xd2\x89\xd6\x4f\xdd\x27\xe4\x68\xcf\xb3\x43\x16\x0a\xd8\x8a\xad\x29\x13\xa7\xe3\x5a\xb2\x00\xbc\xd9\xa5\xba\xd9\x16\xf6\x5d\x74\x96\x5f\x48\x1f\x51\x7e\x84\x01\xab\x2b\xfb\xa3\x8a\xff\x54\xb9\x57\xcc\x37\x38\x87\x1a\x21\x76\xda\x2d\x53\x89\xb9\x1f\xc6\x24\xaa\x5e\x58\xeb\xbf\x0b\xfc\x72\xf1\x01\xae\x99\xe6\xe7\xeb\x89\x36\x32\x26\xa3\xe1\xa2\xaf\x8b\xc7\xec\x66\xeb\xa2\x08\xf6\xd3\x35\xcc\xb6\xe9\x02\xdf\xac\xbb\x6e\x06\xeb\xf3\x01\x83\xe2\x60\x72\x42\x22\x30\xdb\x94\x20\x01\xe7\x7d\xd0\xbe\x1b\x50\x66\x69\xae\xdf\xcc\xd0\x38\x67\x74\x3a\xf3\x17\x56\x38\x17\xd2\x9f\x06\x15\xf6\x95\x55\x15\x3d\xf1\x91\x9a\x2b\xcb\x37\xd4\x64\x4c\xe8\x6c\xe7\x65\xb8\xe9\x59\x1a\xa8\x83\xef\xb4\x43\xb9\x9c\xcf\x03\x69\xb2\x2d\xff\xc4\x62\x3e\x86\x30\x3b\xc3\x5d\xf7\x2b\xf0\x99\xf6\x8b\x7d\xdb\xdc\x40\xe9\x64\x22\xdd\x6d\xc3\x22\xb7\x4f\x1a\xec\x01\xae\xa5\x7d\x6d\x05\xda\x20\x07\xf7\x2f\x67\x64\xad\x06\x7e\x8c\xb9\xae\x12\x0a\x9b\x31\x54\x24\xa0\xf3\x7f\x95\x7f\x2d\xc8\x1f\xc6\x4f\xff\x84\x4c\x6d\x4f\x2c\x1e\xac\x64\x0d\xa3\x5c\xca\x5c\x72\x7d\x20\x69\x80\xe9\xb4\xa6\x8b\x13\xa1\x1d\xde\x8d\xc8\x75\x12\x70\xc4\x07\x15\x6c\xde\xf2\xa3\x8a\xe3\xac\xc4\x49\xc8\xf3\xfa\x96\xb1\x1d\x85\x38\xe3\xdd\x99\xe4\xa7\xbf\x49\x64\xf0\xc8\x09\x63\xfb\x26\x76\x21\x0f\x98\x8f\x9d\x50\x47\x85\x46\xc7\xc6\x63\x4e\x44\xda\xec\x05\xef\x5a\x59\x1a\x39\xb2\xd1\x9b\x9b\x4b\x77\x4d\xc6\xcc\x9d\x34\xdc\x03\x48\x67\xbe\x8c\x1b\x24\x5f\xd2\x68\xb4\x61\x2c\x54\xae\x23\x9d\x47\x88\x71\xcf\x64\x36\xf0\x92\xcd\x14\xd7\x98\xb6\xc5\x0a\x99\xa3\x8c\x06\xcc\xf7\x51\x14\x25\x2b\x5d\xcc\x0a\xd5\x6c\x32\x1c\x3f\xe7\x3b\xd6\x72\xef\x2a\x79\x57\x1e\xf0\x52\x1a\x4a\xac\x0b\x3a\x13\x06\x87\xf2\x69\xd0\x80\xc4\x47\xe5\xfe\xde\x62\x54\xac\xfd\x17\x6e\x11\xdc\xce\xc2\x73\xcd\x9d\x0f\x2a\x97\x39\xd6\x14\xbb\x4c\xe7\x99\x56\xa5\xc3\xc0\x3c\x79\x4f\x2f\x34\xbc\x4b\x69\x76\x6b\xac\xba\x6b\x08\xd1\xbe\x55\x1d\x4f\xc8\x1a\x3f\x79\x10\x6a\x12\x12\x44\xf5\xa4\xd6\x02\x73\xbb\x7e\x02\xec\xed\x93\xb2\x99\xef\xa2\x6f\x72\x23\x3e\xc2\x50\x10\x7f\x28\x74\xd1\x7c\xaf\xb3\x0a\xe1\xce\x75\x78\xe9\xd4\x79\x8d\x0a\xba\xc9\x72\x07\xce\x44\x65\x6b\xf5\x0b\x45\x8c\x7d\x67\x1d\x51\x0a\xd5\x91\x69\xd9\x2f\x52\x63\x3d\x92\xb3\x7f\x2f\xe2\xea\x0f\x8b\xa8\x01\x39\x2a\x95\x8f\x6f\x19\x75\x92\xeb\xa7\x57\xcc\xb4\x5c\xde\x0c\xc3\xde\x4c\x29\xc0\x98\x8e\xf0\x6c\x54\x3f\x4c\x1e\x8b\x85\xe3\x02\x29\xb2\x93\x18\x3f\x2c\x83\x8f\xde\xcc\xc3\xae\x81\xe5\xbc\xbd\xd2\xa4\xf9\x2c\xf9\xc6\x12\x6c\x2d\x81\x2b\x45\xc1\x50\xdc\x49\x5d\x0e\xc0\x97\xd2\xe2\x97\xa4\x99\x17\x36\xc3\x5e\x58\xd8\xda\xbe\x1b\x94\xb1\x6b\xb6\xac\x64\xff\x38\x3c\xb9\x21\xba\xe8\x69\x33\xed\x92\x0e\x48\x39\x74\x45\x16\x85\x43\x37\xe1\xdd\x35\xc0\xad\xd7\x3e\x34\x93\xe7\x71\x91\x37\xda\x32\x61\xd7\x86\x31\x64\x2f\x38\x35\x2f\x5e\x56\x3d\x21\x7f\xa4\x67\x64\x0c\x99\x72\xf8\x5e\x8e\xd0\x9c\x47\x38\xe0\x3a\xd4\xb9\x7e\xb3\x99\x77\xb4\x7f\xf1\xb9\x92\x22\x7f\xf8\x9a\x7e\x1a\x34\x9f\x4d\xe2\x2b\xcd\xcd\xb9\xbe\x80\x3d\x07\xa2\x3f\xdc\x72\xc3\xe9\x34\x0d\xe7\x69\x90\x64\x86\x75\x66\xef\x70\xa6\x14\x39\x47\xce\xd3\x47\x55\x0a\xdf\x39\x3d\x78\x79\x1d\xb1\x67\x49\xcb\x29\x60\x24\x57\x72\x6b\xf2\xe9\x00\x43\xac\xdf\x2e\x7a\x37\xcd\x29\xd9\x8c\xe0\x1e\x30\x8a\x0f\x6b\xe7\x5e\x5b\xeb\x0e\x81\x45\x6d\x14\xda\x25\x6b\x14\xe1\xcb\x2d\xf5\xfb\x70\xca\xf6\x78\x36\x16\xe8\x68\x8e\x90\x9c\xfc\xa7\x57\x85\xf8\x6f\xad\xe5\xf6\x3d\xe2\x26\xd5\xfa\xbc\x7f\x07\xa7\xac\xc3\x28\xec\x6c\x4a\x57\x14\x2e\xbd\x12\x23\xa8\xfe\x36\x56\x40\xf4\x09\x79\x11\x96\xf4\xeb\x67\xf0\xfd\x95\xc9\x35\x42\x7f\x3d\x1b\x61\x4d\xe1\x8e\x04\x99\xce\x8d\x51\x78\x05\xcc\x8f\x77\x2d\xc1\xce\x30\xa0\x51\xdb\x7b\xd6\x3f\xbc\x75\x2c\xdd\xae\x82\x36\xff\xbc\x8b\x72\x6c\x95\x51\xfa\xde\x62\xa2\xe6\x4c\xb5\x20\xca\x77\xd7\xaf\x86\x74\xf2\xf4\xa6\xec\x75\xf3\x21\x15\x18\x38\x3f\x75\xf5\xe8\xd0\x7e\xf1\xa9\xe6\x21\x8a\xa7\x7f\x1a\x79\x10\xb3\x33\x0a\xbb\xb5\x2b\x88\xa4\x4b\x04\xba\x26\x25\x0d\x3d\x73\x19\xcb\xea\x66\xe5\x72\x20\x6a\x65\x2f\x6d\xde\xfc\x16\xb4\xb5\x13\x36\x3d\x0f\x63\x19\x45\xf4\x20\xa4\x03\x98\x8e\x1e\xc9\x72\x5e\x73\x1a\xe3\x4b\xc4\x9a\x98\x76\xf1\x99\xbd\xa2\xd1\x6c\xca\xf2\x58\xbd\x2f\x94\x16\xa5\xa2\xdf\x36\x30\x1b\x22\x01\x26\xaa\x4d\xa2\xf7\x34\xdd\x68\x10\xfd\x00\xd6\x43\x5e\xe2\xc7\x03\x5b\xdb\x29\x6b\xdd\xf1\xb6\xaf\x2e\x7c\x77\x51\xf4\x12\x99\x38\xe9\x00\x54\xb9\xdc\x76\x66\xb4\x1e\x2b\x3d\x62\x49\x00\xa9\xed\xa2\xdd\x9a\xa9\xd7\x67\xe9\x0a\x9d\x6e\x48\x49\x59\x63\xc7\x2e\x69\x88\x0a\xb4\x3f\xdf\x70\xe5\xac\x45\x68\x3d\xef\x4c\x00\xad\x17\x9a\x5e\xd4\x62\x3b\xb6\xb0\xde\x10\xb1\x13\x86\xa3\x28\xbe\xcb\x66\x47\xcf\x11\x28\x33\x52\x27\x10\xda\x97\x4b\xff\x93\x2f\xc0\x88\xbf\x8c\x14\x64\x37\xf4\x43\x8a\x27\x1d\x35\x43\xa0\x85\xb5\xb9\x9e\x3c\x2c\x65\xe8\xc9\xaa\x6c\xa6\x20\xc3\x79\x6e\x74\xe4\xbe\x9d\xd6\xc9\xdf\xb8\x7f\x48\xdc\x83\x7e\x47\xa8\x5b\x76\x44\x4b\xc3\x24\x20\x9b\xc7\xb7\x7f\x05\x68\xc6\xec\xb9\x69\x3c\xf7\x95\x7c\xe1\x2d\xa2\x61\xbc\x0b\x17\xf3\x5b\x16\x0d\x5e\x4d\xd4\x71\x08\xd5\x14\x15\xdd\x0d\xd8\x1a\x27\x02\x13\xc5\x84\x8b\x7f\x67\x9f\x01\x8e\xdc\xce\xe5\xf2\x39\x9c\x3e\x37\x59\x07\xf6\x6c\x91\xe9\x2a\x86\xb7\x0c\x21\x42\xa2\x82\x77\xb5\x25\x70\x9e\x48\xad\xe2\x38\xf1\xb1\x4e\xbc\x5e\xd1\x52\xab\xec\x91\x4e\xde\x75\xd5\x1f\xbe\x85\xe6\x59\x34\x0e\x4f\x31\xca\xeb\xa3\x04\x28\xfe\x6e\x44\x77\x62\x88\xf9\xde\xc4\x90\x16\x8f\xb5\x90\x38\xeb\x71\xd9\x1a\x63\x4d\x18\xbf\xfc\x78\x8f\xf6\xed\x4b\xf4\x9e\x92\xfd\x12\xb0\xf7\xa5\x91\xd3\x0a\x9b\x22\x60\x70\x95\xfe\x34\xec\x1d\xfe\x6d\xa9\x31\x16\x27\x82\xe4\x48\xf9\x82\xef\x9d\xb3\xa1\x38\x6f\x9e\x30\xd0\x87\x9d\xb3\xa5\x60\x8f\x2d\x96\x2c\xc6\x87\xf0\x10\x20\x9e\x59\x8a\xe0\x28\xc0\x3a\xc6\x4b\xab\x46\x37\xdc\x8a\xf4\x21\x25\x3f\xc7\x1c\xb0\x49\x44\x93\xe1\xa2\xec\x2a\xca\x80\x60\x58\x65\x2c\x0a\x87\xb9\x34\x6e\x54\xcf\xf0\xe3\x96\x55\x53\x68\xb2\x22\x5a\x35\x44\x09\x50\x9c\x11\xcd\x32\x4a\x3e\xb8\x7d\x2d\x24\x4c\xbb\xc5\xf6\xc3\xa0\x6e\x8c\xe7\xdb\xe3\x18\x46\xf2\x9c\x63\x42\x81\xbc\xf8\x0c\x1e\x16\xe6\x13\x32\xd2\x44\x60\x19\x56\xf5\xb1\xa0\x90\xb7\x2a\x60\x15\xce\xea\x21\x79\xcc\x62\xad\xbc\xc7\xe5\x11\x22\x81\x09\x6f\x68\x7a\x27\x06\x3c\x9e\x3e\xbf\xd3\x33\x47\xf7\x44\xac\xef\x3a\x10\xaf\x7f\x47\xf2\xbe\x24\xc0\x74\xc9\x8e\x2b\x66\x3a\x00\x99\x85\x4e\x57\x7d\x03\x38\x79\x12\x8e\x10\xc4\x84\x03\x34\xbf\xd8\x39\xc2\xc0\xfc\x34\xcf\x8b\xd8\x5b\xe3\xbd\xb1\x16\xfd\x8c\xf8\x0d\xfe\xf8\x0d\xda\x3e\xdb\xf5\x13\x72\x7c\x46\x81\x78\x17\x59\x44\xc9\x64\x55\x4f\x05\x56\x30\x4f\x8e\x54\xf5\x17\x8c\x5b\xe6\xc2\x89\xe0\xf4\xef\xd1\x0a\x9f\xa2\x2d\xe0\xf1\x18\x0b\xb6\x35\xd9\xd1\xc5\x7e\xb5\x3f\xa3\x3e\x9f\xec\x79\xf3\x26\x45\x6a\x24\x74\x12\x8e\xbf\x7a\x49\x82\xd4\x67\x0b\x37\x0b\xd4\xa4\x58\xc9\xca\x32\x33\xee\xc5\xff\xe6\x3c\x98\xa3\x82\xd3\x44\x65\x38\xcc\x34\x31\xef\x71\x22\x1e\xb1\xdd\xe2\x29\x2d\xa4\x17\xc9\x7d\x42\x3a\xcd\x2f\x19\xb2\x99\xb7\xbe\xc4\xff\x44\x4e\xd2\x18\x9f\x30\xcd\x27\x69\xbc\xa1\xa1\x9a\x81\x87\x2c\x58\xa2\x63\xa9\xd6\x04\x4a\x45\x7e\xc4\x50\x67\x6e\x5d\x50\x3a\x4e\x44\x35\x9d\x4c\x76\xa9\x18\x82\x23\x9e\x73\x78\x11\xe0\xfe\x73\xcd\x53\x67\xf0\x4d\xc2\xae\x25\xb8\x4a\x20\xcb\x49\x50\xe4\x68\x9e\xb6\x48\xda\x67\xc7\x86\x03\xb0\xd9\xb2\xea\x5e\xec\x6a\x83\xe6\xc1\x8d\x98\x95\xfd\x5d\xb6\xe4\xd6\x7f\x45\xfa\xff\xe1\x1c\x42\xc4\x20\x48\x30\x60\x33\x55\x03\x82\x22\xda\x2c\x2c\xa3\x78\xe1\x57\x55\x3f\xd6\xab\x0a\x59\x4b\x5a\xe3\xb3\xa4\x39\x84\x46\xed\x83\x47\x2c\x2f\xcd\x2e\x50\x6f\x5d\x2c\x3b\x68\x6e\x38\x15\x96\x8a\x7b\x69\x4e\xd0\xfc\x08\x3b\x5f\xd8\xb8\xf6\x0d\x57\x86\x0f\x9f\x63\xa3\x40\xa6\x44\x01\x11\x78\x1f\x4d\x74\xe2\xf8\xa2\xd1\x4f\x6d\xa9\x67\x35\xd5\x32\x32\x23\x32\x1f\xb9\x6f\x5d\xa2\x7c\xdc\x70\x71\xfa\xb1\x97\xec\x67\x80\x31\x37\x00\x0d\xa7\x84\xd2\xe2\xf9\x25\x84\xb2\x71\x2d\x9a\x18\x58\xf3\x45\x95\xa3\xcb\x3e\x23\x3a\x01\x7d\x2d\x3e\xc3\x9c\x68\x4a\x30\x1b\xbc\x24\xc0\x6e\x41\x5b\x31\x4f\xbc\x7f\x59\x53\xbe\x8c\xb9\x24\x73\x73\xc5\xd8\xf5\x19\x77\xb8\x90\x8d\x48\xb5\x63\xe0\x2d\xf4\x1c\x63\xe4\xe5\x2c\xf4\xff\xf1\x9c\x14\x25\x17\x86\x02\x8a\x7e\x45\xd7\xb5\x45\xd4\x91\xd8\x44\x59\x7b\xc2\x11\x86\x1b\x2c\x4a\x31\x68\x7d\x1c\x91\xc9\xe2\x45\xb5\x7e\x14\x94\xa0\x14\xf9\x8f\x00\xcb\x10\x5d\x78\xe6\xf4\xa3\xef\xc2\x1f\x75\xac\xee\x5f\x59\xde\x2f\x84\xf6\xb7\x6c\xdf\xa0\x6e\x9b\x4f\xc5\xa4\xbc\xca\x1c\x39\xf4\x3f\x7a\x9a\x09\x87\x07\xeb\x36\xb1\x9a\xf6\x13\x39\xc9\xb3\x28\x82\x45\xf1\x71\x55\x9d\x97\x2c\x13\x47\x69\xea\x5f\x60\x85\xf1\xbd\xdb\xff\xa3\x3a\x85\x62\xc8\x69\x12\xe6\x2e\x6a\xfb\xbd\x8b\x04\x9c\xb8\xae\x25\xca\x32\xbb\x6a\x6d\xf8\xf7\x68\xd3\x6f\xcb\x42\x9e\xda\x10\x38\xd7\xcb\x60\xd8\xff\xdb\x09\x08\x11\x43\x8b\xc7\xf2\x07\x18\x70\xb2\x36\xb2\x7e\x88\xde\x37\x4c\xb2\x5d\x1b\x50\x95\xd7\x16\x9c\x1c\xf1\x76\x1b\x20\x31\xbd\x9f\x3a\x6c\x6f\x3b\xd7\xfd\x4c\x00\x46\xba\xc7\xe2\xbb\x2e\xb7\xb4\x85\x47\x15\xa5\xdd\xf4\xf7\xe2\xe3\xc1\xf3\x49\xe2\x6f\xd8\x56\xda\xb3\xd0\xfa\xda\x7c\x3a\x4f\xf6\xea\x01\x28\x82\xe7\xfa\x55\x8f\x87\x85\xaf\x9f\x9f\xe8\x77\x4a\xab\xda\xc3\x2c\x46\xce\x35\x43\x38\x8c\x0f\x10\x5c\x5b\xfc\x1b\x08\x0f\x48\x8d\xf1\x06\x2b\xac\xf4\x70\x2e\x5d\xce\x2f\x7a\xb4\x70\x05\xde\x7c\x92\xfe\xca\x01\xca\x55\xd1\x73\x10\x3a\x7b\xe2\x3a\xd0\x8c\x0e\xf4\x84\x18\x3e\xa7\x08\x4e\x94\x2d\x46\x35\x5d\xdd\xf3\xb9\x42\x9a\x18\xf6\x0c\x1e\xdd\x7f\x8f\xbc\x65\xd4\x1b\x92\xad\xef\x39\x9b\x05\x9b\x1b\x89\x91\xfc\x3f\x04\x56\x36\x6b\x8b\xc6\x4d\xfc\xa1\x4c\x43\x94\x8d\xab\x42\xc7\x2b\x9c\x68\x34\x69\xb3\x39\xea\x53\xf7\x6d\x25\x07\xbb\x6d\x0c\x21\x59\x6e\xbc\x8f\x6d\x9f\x57\xa6\xe0\x85\x7c\x56\x6b\xea\xef\x7c\x97\x76\xe8\x34\x54\x8f\xcf\x45\x0b\xdd\x04\x5b\x65\xc0\x5c\x0e\xca\x7b\x6f\x3f\x62\x7c\xa4\x16\x98\x9c\x31\x54\x17\xf1\x8d\x1e\xfe\x04\x53\x67\xf5\x81\x00\xff\x2c\x05\xff\xbd\xfa\xeb\xa6\xbf\x59\x8c\x7f\x9d\xd9\x10\x51\x4c\x4c\x51\x60\x91\xd1\x4b\x8e\xef\x51\xbe\x5f\xf2\xa5\xa3\xf9\x14\xce\xc5\xb9\x17\xbf\xe7\xeb\xe0\x59\x15\x72\x75\xf2\x96\xb4\x1a\x7f\x83\xd5\x15\xa4\xf1\xa2\x35\xf3\x1e\xed\x2a\x7e\x68\xb2\x43\xed\xb9\xb6\xd7\x23\xe0\xaf\xf7\xad\x0c\x4e\xfc\x22\x9d\xec\x96\xc0\xec\xf3\xad\x5e\x1f\x6c\x5e\x4d\x26\x98\xb8\xc4\x50\xeb\xbb\x69\xf0\xce\x11\x2b\x64\xaa\xee\xb9\x8a\x34\xf8\x32\x66\xf5\xb2\x70\xf7\xc0\x00\x0b\x01\x1a\x17\x3c\xbb\x61\x58\xb0\x4c\x0f\x7a\xc3\x1c\xf5\xa2\xe3\xf8\x9d\x2e\x74\xa8\x0c\x8b\xe4\x1b\xba\x6c\xe0\xc6\x9f\xd1\x0e\x33\xb8\xe9\xb7\xd0\x00\xd0\xd1\xae\x92\x30\x7e\x5a\x94\x93\xfc\xa3\xc3\x52\x39\x23\x56\x4a\xd9\xa3\x8f\x0e\x82\xfd\xae\x27\x76\x72\x81\x8f\x71\xd9\x4e\xea\x7f\xdb\x0b\xfe\x75\x70\x43\xc4\xe0\xa0\x20\x52\xc0\x57\xf0\xd6\xc9\x98\x0b\x8a\x82\xe2\x44\xd5\x57\x21\xbe\xca\x27\x6a\xf0\x2f\xe2\x11\xa2\x74\x61\x32\xeb\xb9\xd4\x69\x0c\x5b\x6b\x34\x00\xeb\x59\xd6\x63\x2d\x30\x4a\x43\x53\xe7\xb6\x34\x71\xa4\xa7\x7f\x0d\x0e\x8c\x9f\x6d\xa1\xd0\xd0\xbf\xc9\x0c\x99\xb5\x1e\x5e\x5e\x03\x9b\x99\x50\xe2\xf4\xb1\x43\x14\x79\x50\xdc\x66\x6c\xd9\x86\x3e\xcc\xaf\x78\x0c\x87\x16\x42\xed\xd1\xb8\xb1\xf5\x4e\x7a\x43\xb1\x1b\x81\x05\x0f\x99\xe5\xb8\xe9\xcf\x61\x5d\x0b\x1c\x45\x1c\xf4\x2c\x55\xef\x46\x46\xc6\x1c\xc9\x0d\xda\xa0\xaf\x8f\x8c\xb2\x1d\x3d\x5b\xaf\x40\x92\x6b\xf1\x23\x91\x51\x05\x49\x62\x7a\x4a\x67\xfe\xb5\x9b\xc5\x67\x73\x01\xaa\x1b\x95\x74\x7e\xd6\x81\xea\x5f\xeb\x56\xec\xe6\xeb\x86\xff\xb6\x17\xfc\x6b\x63\x86\x88\x08\xbd\x06\x72\x90\xac\x59\x86\x17\xba\x14\x1a\xf5\xe5\x28\xf2\x29\x14\xe7\x4d\xa7\x56\x01\xcf\xd1\x22\x76\xe9\xc5\xd4\x66\x55\x44\x2f\x16\xde\xab\x3c\x6d\x1f\x23\xeb\x68\x68\xb4\x32\xc5\xde\x77\x43\xdc\xec\xfa\x0d\x04\xe6\xe7\x2f\x2b\xb7\x64\x37\x94\xa3\x78\xad\xa0\x8b\xd5\x2d\x9b\x40\x2a\xb5\xc5\x12\xdd\xe6\x9f\xd2\x4e\x24\x95\xe6\xc5\x04\xbd\x43\x52\x98\xf8\x52\xac\x41\x2a\x7c\xe2\xa5\x19\xe2\xac\xf3\x39\xfc\xf6\x92\x60\xab\x6f\x6d\xe9\x91\x12\xbd\xe5\x1b\xb9\x16\x38\x36\x8e\xeb\x06\xeb\xbc\xb3\x80\xe7\x2f\x30\xf0\xb5\x92\xb6\xda\xd9\xfc\xf0\x4a\x43\x2f\xef\xfe\xa7\x08\x7f\xd1\x81\xba\x47\xfd\x76\xad\x53\xe0\x57\x86\x93\x23\x4f\x59\xb7\xb7\x45\x73\x06\x0a\xe4\x43\xb7\xd4\x33\xe3\x99\xed\x72\x1d\x58\x88\xd8\xe3\x63\xc7\x63\x2a\xd9\xd3\x69\x4a\xd8\xac\x06\x27\xf2\x75\x65\x5a\x59\xf5\xdb\x04\xcf\x9b\x0c\xee\x06\x36\x66\x7b\xcc\x70\x0b\x28\x15\x23\x7b\xd7\x66\x7c\x03\x20\xe4\x60\x3b\xa2\x6a\x5f\x1f\x4d\x68\xc2\xef\x51\x10\xff\xfd\x32\xb7\xff\x75\xf1\x63\xc4\x4a\xf3\xe5\x0b\xef\x5a\x31\x78\x7b\x86\x9a\x93\x27\xe4\x2e\xa5\xb9\x2f\xc6\x3d\x9b\x6d\x15\x16\x05\x5d\xb1\x9f\x8d\x5e\xf7\xdc\xfd\x2b\x98\xec\x3f\xb9\x92\x3d\x75\x39\xeb\x59\x16\x7f\xc0\x23\x32\x55\x97\xc7\x03\x81\xcc\x50\x8e\x2c\xa3\xaf\x9a\xd7\x7b\xc0\x5c\x11\xf7\x68\x12\x77\x01\x97\xa3\xb0\x5d\x98\x63\xb1\xf1\x01\xa0\x1f\x41\x27\xd5\xfa\xa6\x8b\x5e\xf0\x81\xb7\x53\xef\x79\x75\x67\x43\x6a\xa4\x52\x0e\xe4\x00\x35\x1e\xbd\x1b\xe3\x93\x63\xb9\x38\x2b\x40\x6f\xf8\x03\xd1\x11\xf7\xfe\x1d\x8c\xa9\xa8\x75\x2a\x1c\xde\xaf\x21\x07\xdd\xf8\xd6\xe4\x0c\xfa\xbd\x3e\x82\x8c\xf7\x89\x56\xc3\xe3\xef\xc0\xe7\x6f\x7a\xad\x57\x9b\x9f\x2c\xfc\xa0\x41\x69\x28\xb0\xb6\xed\x27\x61\x29\x6d\x19\x5c\xcf\x61\x3d\x88\x77\x25\x92\xa8\xef\xf2\x03\xbe\x14\xfa\x08\x92\xa9\x93\x23\xc1\x15\xbc\x7c\x9d\x9c\x80\xe9\x9c\xf6\xc2\x17\x72\x66\xc8\x26\x9a\x57\x75\x8f\xcd\x6a\x59\xd3\x30\x40\xea\xf2\xb1\x7a\xe2\x19\xfa\x35\x07\x07\xc1\xac\x06\x92\x74\xb3\x9e\xc2\x84\x6e\xc2\x0d\x95\x29\x1b\x96\xa9\xd9\x4b\xad\x14\xf2\x22\x20\x36\x2d\xb2\xa7\x2e\x38\x13\x96\xdc\x62\x38\x18\xf7\x28\x17\x8d\xaa\xc5\xd3\x9d\x8e\xe7\xd0\x1f\x51\xcc\xb1\xc2\x46\x35\x73\x3c\x7c\x04\xdc\x1e\xf8\x8a\x9c\x66\x0c\x33\x73\xb5\x19\xb1\xaf\xfd\xe1\xb4\x5e\x28\xe5\x3b\x59\x11\xf3\xce\xa4\x43\x90\xa4\xba\x34\x3d\x43\x54\x60\x50\xbf\x9c\x40\x11\x55\xa5\x8b\x04\x0b\xa1\x4d\xf5\x6f\x13\xdd\xc9\x62\xc1\xd1\x5e\xc2\xe7\x7e\x2f\xfe\x5c\x68\x51\xa1\x5f\x04\x20\x01\x77\xad\xb6\x24\xf5\xd7\x57\x11\x15\x8f\x57\x64\x48\x98\x2d\x38\xe1\x2c\xbd\x89\x39\x06\xfa\xaf\x09\x11\x8b\x8b\x70\xb3\x5e\xfd\x34\x05\x3f\xd4\xd8\x60\x57\x9c\xe4\x22\x7a\x6b\xaf\x02\x9c\xab\xb4\xfa\x00\x4a\x7d\xea\x8d\xef\xe4\xcb\x6c\x64\x34\x57\x6b\x1c\x7d\x67\x21\xab\xa7\xd9\xaa\x9d\x37\x8c\x25\x39\xe2\xc1\x40\xea\xaa\x79\x45\x5a\x9f\xc2\xac\xf6\x8b\x47\x4d\x7b\x40\x7e\x4d\x25\xdf\xcb\xcd\x24\xe0\x27\x04\x38\x97\x05\x37\xd0\xac\x72\xfd\xd0\x7d\x9b\xbb\x5b\x1e\x24\xdc\x4e\xf4\x99\x36\xa0\x20\xd2\xcc\x56\xfa\xe7\x9f\x24\x1b\xd6\xa1\xd4\x81\xa2\xe5\x02\x49\x4b\x78\xf1\x46\x9c\x42\xe8\xf6\xa2\x70\x82\x65\x5d\x0f\xfc\x95\x05\xd2\x6f\xd0\x0c\x0f\xcb\xae\x9f\xa0\x72\x13\x49\xcd\xfe\x83\xb1\xf3\x32\x53\x55\x16\x4a\x7a\x1e\xf6\xf3\x49\xd2\xc7\x91\xe9\xd3\xc6\x01\xc5\x41\xca\x3f\x72\x54\x94\x51\xfa\xa6\xa2\x29\x9d\x21\x00\xb4\x8c\xe7\x5d\xc4\x52\xcc\x68\xd3\x4c\x3c\xf4\xa1\xa9\xc6\xd4\x87\xb7\x3d\xc4\x1e\x95\x2b\x06\xe6\xcb\xfe\x66\x14\xef\x7b\xec\x1e\x01\x68\x55\x24\xaf\xce\x95\xf1\xda\xcd\x24\xce\x39\xec\xee\x72\xe3\x06\xdc\xa7\x5b\xfa\xbc\xe9\xbb\x77\xdf\x42\x51\xb9\xad\x67\x5f\xfb\x03\xd9\x7a\x3d\x27\x6f\x3e\x42\x6a\xbd\xfc\xe6\x9a\x29\x1b\x7a\x19\xf2\xb2\x8f\x74\xac\x08\x0c\x85\x45\xfe\x49\x8e\xc4\x30\xc4\xfc\xac\xc0\xaf\x5a\x4d\x1f\x40\xb3\x3e\xfe\x2b\xc4\x75\xfa\x51\xc3\x4d\xc4\x29\xad\x35\xca\xb0\x40\x64\x39\x77\x38\xf4\x65\x29\xbe\x52\x3f\x01\xa0\x1f\xd7\x4c\x3b\xbc\x67\x85\x80\x1c\xb5\x8d\x3a\xe4\xd2\xe2\x34\x5f\xf4\x3c\x78\x2b\x85\x88\x86\x8a\x6a\x8b\xcf\x9f\x52\x82\x9e\x11\x28\x1b\xfe\x36\xf1\x15\x4b\x6b\xbb\x2a\x0f\x9e\x2f\x76\x6a\x45\x0e\x46\xa8\x4d\xb2\xfa\x47\xdb\x0b\x54\x57\x38\x65\xe9\x78\x1b\x8d\xcb\x5c\x30\x89\xd4\xd9\xdc\xcd\xb8\x10\xb9\x4b\x89\x60\x26\xd9\x30\x70\x17\x44\x23\x94\xed\x7d\x9e\xd8\xb5\x45\xec\x56\xe0\xa1\xbe\xda\x1d\xf8\x34\x68\xf7\x1f\x29\x64\xa1\x2f\xab\x4c\x84\x85\x2b\xa9\xa7\xb8\xe5\x84\x1a\x53\x32\x27\x33\xa4\x0b\x05\x3f\x5c\x85\xfb\xbe\xac\xee\x02\x62\x53\xbf\x69\x7b\xdc\xf7\x0a\x2f\x0e\xdc\x98\xbd\xa4\xed\x99\x53\x61\x83\x11\xec\xd2\x68\xed\x21\x35\xed\x5f\x82\x7b\x70\xf7\x8d\x40\xf1\xa4\xc9\x9f\x93\xc9\xa7\xdc\x8e\x36\x17\xbd\x4b\xd7\x55\xef\x88\x9d\x59\xbd\x13\xb3\xb2\x11\xba\xfb\x6a\x8b\xb6\x44\x42\x96\x73\x78\x81\x37\x55\x60\x63\xaa\xf2\x28\xfc\xcc\xfc\x67\x25\x55\xbc\x74\x99\x7d\xc7\x24\xc9\xf9\x60\x15\x63\x6a\x2c\x9c\xa2\xf0\x6b\x0f\xaf\x31\x90\x17\xd4\x81\xe6\x21\xf5\xdb\x47\x1d\xd7\xb1\xa2\x85\x75\x7a\x7d\x54\xff\x1d\xf7\x18\xaa\xa0\x48\x50\x75\xfc\x4a\x75\xdf\x4a\x45\x11\x50\x6a\x31\xc7\xbc\xca\xb5\x6a\xcc\xe1\xe1\x83\x84\xc6\xf9\x79\x29\xc8\x45\x69\xa4\x21\x7f\x41\xdc\x93\x63\x6a\x34\xf3\x8a\x3b\x6a\x41\x00\x1e\x1f\x63\x8d\x1c\x82\xbd\xc4\xff\x3d\xa4\x16\x35\x58\xea\x3d\x25\x6b\x7c\xdd\x8b\x6b\x04\x7b\xd4\x3f\x49\x11\xd3\x7a\x68\x3b\x91\x80\x03\x59\x6c\x76\xbf\xda\xf7\x85\x26\xf4\xc5\xe8\x43\xa8\xd1\xb8\x1e\xd6\x59\xc1\x54\x21\x8a\x15\xb1\x0e\xce\xd1\xa1\xa5\x25\x6d\x13\x50\x32\x5c\x2b\x9e\x3a\x85\xc4\x06\xa9\x72\x3d\x3a\xe4\xe8\xf5\x6f\xcf\x3a\xa4\x47\xdb\x70\x48\x14\x08\xa1\x33\xba\x4e\x9a\x63\xe0\x44\x02\xa7\xf4\xab\xa3\x6d\xd2\x07\x08\x9a\x89\xea\xe9\x32\xff\x2b\xe5\x6e\xae\x33\xbf\xe6\xac\x2e\xc1\xba\x39\x74\x3f\x7a\x04\x26\x44\x6f\x06\x00\xca\xea\xd2\x45\xc2\x2c\xa8\x70\xa7\xed\xe4\x48\xaa\xf2\x9d\xa8\x7d\x7e\xc9\x26\xc2\x11\x23\xa9\x66\x18\xa1\x04\xdf\x67\x8e\x5f\x11\xa8\xcd\xfb\x31\xb1\x83\x27\xff\x83\xd6\xf4\x6e\x39\x96\x29\x09\x33\x2c\x43\x6d\x7e\x4f\x8e\x85\xa9\x80\x3e\x81\xbd\xb1\x47\x8a\x45\x1e\xf8\xa5\x24\x9b\xbe\xb0\xa4\x99\x06\xee\x7d\x89\xa0\xb6\x0e\xd9\x32\x24\xa3\x16\x1e\x1c\xfe\xb9\xb2\x66\x9a\xb1\x92\x97\x4b\x48\xed\x0f\x56\x69\x32\xa6\x0b\xa9\x71\x11\xf8\x6b\x47\x9d\x47\x43\x0d\xba\xc7\x6b\xed\xa0\x0e\x50\x90\x2b\xe5\x74\xcd\xf4\x84\x5e\x95\x52\xbc\x03\xb3\xad\xe9\x29\x31\x36\x68\x97\x2e\x3f\x8c\x2d\x93\xac\x7a\x12\x0c\xbc\x1f\xbf\x97\x37\xd5\xe3\x25\x3f\x1b\xaf\x3e\xd3\xfd\x04\x69\x0f\x03\x96\x3f\x4b\xe2\xe7\x9c\xa8\x85\x71\x55\x44\x15\x76\xa9\xeb\xb3\x2f\x4a\xdb\x08\x2c\xc5\xac\xb0\x30\xd8\x99\x53\xd8\xe8\x30\xf1\xfd\x60\xc8\x8d\xea\x77\x65\x28\x5c\x20\xe6\x23\x61\xce\xde\xac\x67\xdf\xf4\xce\xa0\xfe\xe7\x86\x6e\x2f\x14\x0a\xbd\xa5\x8f\x74\x46\x0b\x50\xbf\x50\xed\xbf\x24\x9c\x73\x6e\x1a\xf0\x8b\x43\xab\x8c\xf2\x39\x54\x5f\x1a\xd5\x57\xa2\xb9\x95\x04\xf6\xfa\x45\x84\x2f\x93\x19\x6f\xe9\x80\x41\x21\x0a\xd3\x8d\xf7\x45\xaa\xac\x8e\xc2\x7b\x24\x77\xf0\xc2\xdc\xb2\x2d\xd6\xbd\xe3\x3e\x69\x39\x4c\x5d\x5d\x84\xcf\x93\x35\x6c\x00\x9e\x18\xf2\xe7\xbb\x16\xa2\x70\x7b\xa8\xbf\x47\xa1\xe2\x47\x4e\xce\x77\x1f\x96\xa1\xfc\x3f\xc7\xcb\x6d\x71\xe0\xc3\xbb\xe5\x9a\xdd\x02\x93\x8a\x65\x25\x2a\x0c\x53\x4b\xc2\x6c\xea\xec\x6d\xcd\x76\x64\x60\x1b\x9a\x7c\xf2\x1e\xab\xed\xd6\x54\x0a\x77\xba\x5e\x92\x28\x1d\x20\x9f\xa8\xe6\xfe\x05\xd9\x64\x64\x26\xf4\x46\xa5\x39\x1f\x26\x03\xaa\x73\x0a\x69\x0e\x47\x1e\xcf\xda\x6f\x70\xae\xe4\x82\xa2\xc1\x14\xa0\xa9\x71\x17\xe4\xf8\x8a\x96\x35\x71\x52\xe3\x5c\x5b\x29\x68\x7f\xac\x97\x26\xc4\xa6\xe9\x1c\x64\x94\x92\x63\x4d\x8a\xb4\x56\xef\x08\x07\x3c\x1e\x35\xdf\x74\x77\xb6\x7b\x5e\xda\x72\xa2\xf8\x2c\xe1\x7d\x46\x54\x53\xbe\x5b\xb6\x38\xc9\xfe\xe9\x48\x95\x61\x42\xc2\x3b\x53\x80\x7a\x47\x0a\x07\xf9\xe6\x80\xce\xdb\x52\x2b\x13\xeb\x58\x6b\x83\x4b\x5a\x7b\x1b\xa6\x98\xe7\x3b\x5f\x48\x77\x88\xc4\x41\x6e\x19\x4a\xe7\x13\xd2\x30\x81\xff\x38\xa1\x03\xf1\x25\x1e\x17\xe3\xf1\xae\x7c\x05\x73\x08\x0e\x01\x5b\xa8\xda\x20\xf6\x17\x18\x37\x4a\xc2\xe5\x28\x50\xb9\x14\x55\x35\x76\xa9\x1e\xcf\x29\xe4\x14\xd9\x2d\xcc\x7d\xa2\xf9\x9c\xc7\x56\xbc\xa5\x8a\x35\xba\x0a\x67\x6d\x98\x77\xc8\x32\xa3\xee\x69\xd0\xf7\x02\xbf\x27\xa0\x2d\x72\xe4\xdb\x33\x1e\x6a\x69\xab\x28\xfb\x9f\x6d\x32\x90\x62\xd2\xf3\x3d\x96\xd6\xf3\x13\xfd\x0e\x88\xd7\x05\x6c\x8a\xf7\x64\x6e\x9e\xb5\x59\xfa\xfd\xe8\xf6\x73\x72\xb2\x8f\x56\xea\x4f\x88\xfa\x58\x02\xdd\xfb\x29\x85\x4a\x96\xc3\x14\x51\x66\x80\xaa\x7e\x29\x9e\x4f\xe6\xd9\xe7\x7e\x18\x12\x9c\x5d\xb8\x83\x3c\xc4\xfe\xd9\xd4\x47\x32\x8e\x83\x61\x74\xfc\x3f\x21\x0d\xad\xaf\xa5\xc9\x80\x6c\xdb\x57\x65\x54\x09\x77\x47\xa7\xdb\x62\xee\x64\xb4\x8f\x09\xb1\xa7\xc3\xf3\xb4\x4e\x66\x15\x70\x88\x64\x07\xc5\x75\x6e\x19\x9b\xc0\xe3\x19\x45\xc5\xd0\xca\x38\x0c\x5b\x61\x05\x09\x04\x3f\x8c\x7c\xcb\x4b\xfa\xfa\xdb\x27\xf2\x05\x45\xbf\x4d\x29\x57\xdb\xc6\x20\x39\xc0\x11\xe5\x7d\x07\x05\xdf\x65\x12\x24\xd7\x95\x1f\xec\x80\xb1\xfc\x59\x2b\x5d\x33\x14\xd2\xaf\x0d\x79\x43\xd8\x52\x13\xcd\xe3\xcc\x26\xfc\x84\x2c\x95\x22\xe1\x55\x99\x76\x3f\x6d\x59\x80\x67\xe9\xa7\x24\x93\xe3\xb2\x97\xb4\x10\x45\xb7\xa2\x54\x2f\x09\xe5\x7a\x3e\x99\xab\xfa\xd7\xb5\xff\xa7\x2b\x25\x06\xd3\x09\x25\x02\xb8\xf6\x57\xce\x38\x26\x4a\x98\x0a\xc8\xd4\x2a\x11\xbf\xf7\x5a\x68\xb6\xfa\x04\xbc\xe7\xed\x17\xe9\xb5\x45\x75\x73\x4e\x9f\x13\x23\x88\x00\x8b\x3a\x21\x57\xf8\x13\xcc\x9f\x2c\x38\x8e\x0f\xe1\x5e\x56\xc9\x96\xe2\xe5\x23\xb9\x8e\xfb\xac\xdb\x4d\x3b\x34\x44\x2f\x9e\x09\x6a\xc1\x83\x17\xe6\xa2\x0a\x08\x38\xa9\xbf\x7e\x2e\x31\x31\x46\x4d\xf4\xab\xbd\x43\xfa\x29\x02\xa1\xf8\x3d\x20\x6b\x42\x6f\x7e\x4c\x97\x38\x09\x52\xd8\x5c\x65\x11\x70\xd1\xbd\x71\x88\x54\xb9\x21\x1e\x2f\xa2\x55\xb7\xbe\x1e\xbf\x7e\x37\x1e\xa8\xa3\x90\x52\xdc\xdb\xf8\xb9\x79\x1f\xd4\x5e\x4f\x2b\x6a\x48\xd0\x99\xac\x3a\xe5\x77\x6b\x24\x16\x42\x55\xbb\x3d\x51\xa0\x9b\x2b\x0b\x6a\x1c\xaa\xf7\xfd\x42\x05\x03\x0f\x8f\xf0\x57\x17\xf0\x5f\x0e\x1d\x44\x4c\x94\x1c\xc9\x00\xd0\x05\xe4\xe8\xaa\x1c\x3a\x76\xc5\x34\xd7\xc0\x5c\x55\x5d\x72\x8c\x55\xe0\xc3\x58\xa6\x66\x75\xa1\x78\xbc\x50\xe3\x95\x38\x81\xb2\xeb\x03\x7b\x11\xd4\xe7\x88\xde\xb8\x7b\xf6\xc0\x0a\x9d\x27\xcb\x3f\x6f\x88\xda\x14\xf6\xb2\xbc\xb9\xb5\x62\xdb\x58\x36\x67\x2e\xda\xac\x03\xa5\xd8\xae\xfd\x4f\x5c\xc2\xb1\x7f\xa1\xfd\x9c\xf5\xf0\x7b\xad\xf7\x7b\xc7\xb9\xed\x87\x13\x67\x48\xb6\xa1\xe8\x84\xab\xd5\xca\x00\x2c\x17\xd8\x9b\x6e\x4a\x4a\x8c\x60\x13\x80\x66\x88\x48\x7f\xa0\xd6\x78\x2b\x65\xbc\xe7\xf1\xa7\x06\xbf\xe2\xb6\x21\x8e\xf9\x5b\x8a\xa1\xf2\x6b\x00\xfa\x9d\x70\x93\x9d\xf9\x85\xa8\xd9\x27\x72\xa3\x56\x8b\xf0\x52\xbf\xd0\x63\x33\xc1\x15\x0d\xbc\xb2\xa6\xb3\xa3\x4f\x69\xe1\x1f\x0e\x01\xa8\x46\x50\xb9\x98\x57\x91\x3d\xec\xbb\x8e\x4a\x5c\x5c\x11\x19\xa2\x05\x07\x17\x7d\xc6\x7a\xbf\xf2\x5c\x74\x7e\x15\x45\xde\x67\xe0\x2f\x96\x5c\x3d\xfc\xdd\x48\x24\x42\x98\xdc\xc8\x65\x0f\xa9\x43\x88\x6f\x43\xee\x38\xf3\xc3\xf3\x5d\x6d\xaf\x75\x83\x81\x4a\x32\x07\x91\xbf\x57\xe0\xff\xf2\x01\x21\x62\xe4\x61\xb1\x60\x6f\xba\xee\x30\x69\xfa\x4b\xcf\x6f\x9b\xdf\x58\x4c\xd2\xcd\x0e\x8a\x69\xb7\x95\x03\xd8\x2c\x2e\x84\xdd\xbc\x89\xae\x78\x44\x26\x07\x9a\xc0\xee\xbd\x9f\x28\x33\xf5\x94\x6e\x18\xb9\xaf\xb9\x21\xda\xb8\x94\x3d\xcf\x12\x72\xe2\x67\xda\x6c\xab\xd7\x45\x73\x48\xfe\x90\x19\x01\xf7\xda\x8b\xee\x19\x5e\x0f\xc1\x9a\x6c\x03\x1c\x67\xcd\x4c\xe2\xcc\x47\x59\xa1\x52\x78\x3a\x6f\x0f\x0c\x59\x86\xf8\xaa\xbe\xd9\x62\x44\x03\x96\xc5\xec\x6a\x78\x43\x71\xcd\xfd\x2e\x2c\x53\x66\x99\xf1\x41\xe0\x57\xae\xf3\xfa\x8d\xba\xfc\xfb\xb5\x07\x97\x62\x4e\x6b\xc9\x22\xc8\x89\x1a\xb1\xb9\xb8\xab\x19\x1b\x3c\xc3\xfa\x4a\x80\x68\xd6\x5e\x79\x20\x8d\xa8\xc6\xe3\x55\xde\xd9\xa8\x68\x72\xdb\x10\xb2\xf3\x37\x0c\xb0\x79\xd3\x7e\xe1\xa7\xc4\x22\x17\x7f\xdc\x46\x08\xe9\xad\xc0\xc0\xf7\xe3\x80\x13\x4b\x9b\xde\x7a\x5e\x38\xb3\xbb\xdb\xb5\x87\x66\x9f\x27\xa2\xd3\x7f\x38\xa2\x10\x31\x18\x7f\x28\x64\xe0\x0a\x7c\x22\xa4\x4d\x29\x44\xff\x2e\xb3\x94\x1d\x41\x37\x98\x28\x89\x95\x2a\x58\x05\x5f\x8b\x01\xcf\x78\x2a\x2c\x30\x0f\x7e\x45\xa8\x1f\x78\x89\xe2\x6f\xeb\x24\xc9\xf2\x47\x06\xa5\xa8\xcf\x52\xcd\xcd\xa7\x69\xd3\x77\xa6\x10\xe0\x74\xae\x69\x38\xaa\x55\xde\x94\x70\x41\x81\xf4\xe9\x42\xdf\xe4\x95\xfc\x62\xb2\xd5\x39\x2e\xe4\x8d\x1b\x6e\xfe\xbc\x2d\x8a\xf3\x61\x7d\xeb\xb3\x57\x45\x63\xa1\x75\xe1\x86\xf7\x09\x8c\xa0\x9d\x9b\x14\xbe\x6a\x65\xb7\x50\xaf\xcb\xcf\x6a\xe3\x71\x53\x3f\xb3\x9e\x86\xe7\x9b\xf1\x15\xf5\xd1\x39\x86\xe2\x58\xe0\x0d\x5c\xff\x6b\xda\xbf\x1c\x67\x88\x18\x39\x34\x12\x48\x32\xce\xbd\x0f\x7d\x1b\x27\x92\xaa\xf4\x99\xfd\x5a\xa8\x9a\x15\x3d\x83\xaa\xc6\x5b\x2a\x03\x0e\x19\x83\x9f\x2d\xcb\xbd\xf9\xfc\x88\x02\x78\x89\xb8\x0e\x91\x59\x9e\x1e\x97\x2f\x06\x51\xd8\x96\x64\x5d\x69\x3a\xbc\xa4\x76\x69\x62\xb7\x59\xc2\x6d\xcf\x2c\xfc\xb0\xb9\xac\x06\xc1\xc2\x98\x43\x55\x7e\x8b\x98\x5b\x62\x3f\x54\x3d\xba\xeb\x9f\x02\x27\x3b\x70\xb2\x1a\x0f\x5d\x03\x4b\xeb\x0d\x49\xc2\x13\xb7\xfb\x60\xe1\x13\x7e\xca\x0f\x5e\x32\x02\xcd\x93\xaa\xd8\x47\xa4\x3f\xa9\x74\x6e\x97\x41\x16\x25\xd8\x46\x70\xdf\x78\xf8\xdf\xde\x1b\x0e\x1d\x7c\xfe\x3b\xcb\xff\xe5\xe8\x43\xc4\xe0\xe0\x84\x60\x83\x9f\xa6\xae\xde\xdc\xe1\x8c\x52\xd8\x50\x68\xe8\x68\x60\xed\x77\xcf\x48\xe7\xb0\x43\x38\x04\xf6\x37\xa7\x24\x36\x3d\x7f\x68\x17\x64\xeb\x01\xc1\xae\x00\x5f\xc2\x5b\x4a\xce\xc4\x4a\x4d\x56\x93\x3c\xa6\x3d\xa4\x2f\x5b\x8c\x08\xd7\x18\xe1\x4d\x72\x0b\x89\xdc\x53\x8e\xf9\x2c\xa0\xb6\x18\x7d\xaf\x61\x23\x53\x8b\xbc\xae\xfc\xb7\x91\xb0\xa0\x8f\x3e\x96\x5c\x1e\xba\x32\xd4\x5b\x8c\x5e\xa9\xbc\xcd\xa3\x9d\x06\xfe\xa0\x02\x16\xc5\x4f\x56\xd9\xe0\x8b\xc3\x45\xce\xb1\x11\x8c\xb1\xf4\xfc\xcf\x7f\x6a\xeb\x7e\x38\x65\x69\xff\xae\x38\x9f\x56\x7c\x55\xd2\x0d\x56\xbb\x34\xcc\x2a\xda\x36\xbc\x72\x74\x9a\x23\x9d\x4a\x42\xf8\x78\x4e\x1d\xb0\x42\x88\x25\x52\x37\x45\xc7\x70\xe6\x44\x0e\x7b\x8a\x0d\x92\xb2\xa3\x96\xf6\xd0\xad\x32\x9e\x5c\x0c\x68\x1f\xc0\x4e\xbb\x0c\x56\x26\x86\xf8\xee\xe7\x5b\xd6\x1b\x19\x6e\xc8\xa7\x57\x30\xcb\x6c\xfc\x9d\x0a\xff\xf2\x4d\x21\x62\x06\x50\x70\x20\x23\x09\xd5\xf2\x6b\x8b\xd6\xed\xc1\x59\xcb\xb2\x99\x8d\xc8\x4e\x49\x71\x61\xab\xb7\x76\x6f\xa2\xdc\x5b\xa7\xe1\xc3\x54\xfb\x35\x5e\xec\x83\x8d\x62\x57\x88\x7d\xbb\xed\x2a\xad\xef\xda\x55\x52\x04\x65\xec\x42\x37\x0a\x24\x70\x54\x1c\xe5\x6c\x74\x9c\xcc\xe2\xe2\xa8\x97\xc7\x00\x68\x2b\x9d\x97\xf7\x49\x14\xde\x7c\xa5\xbd\x61\xdd\xb9\xf3\x9c\xb0\xb1\xcf\xef\x0e\x7b\xe5\x2c\x15\xea\x0c\xdd\x5d\x12\xde\x52\x52\x00\x5a\x46\x1b\x73\x32\xa6\x69\x44\x81\xe6\x37\xe9\x21\x40\x85\x97\xcb\x83\xbf\xaa\x18\xab\xd9\x41\x7c\x31\x46\xbc\x09\xc7\xad\x2a\xf1\x37\x73\xfb\x2f\x5f\x1a\x22\x86\xcd\x0c\x4d\x08\x64\x6e\x1b\xac\x31\x4e\x7a\x3e\xb1\x1b\x68\x87\x66\xef\x33\x2a\xe7\x77\x57\x35\xa2\x37\x32\xee\x49\x95\xfd\xa1\x69\xf1\xee\x36\x34\x00\x49\x6a\xed\x35\x92\x97\xe1\xc6\xac\x8c\x94\x8d\x4b\x12\x8f\xd2\xf2\xca\x0c\xfb\x23\x18\x94\xe0\x5f\x40\xb8\x73\xa0\x45\xc4\xa8\x0d\x41\x16\x79\xb8\x9b\xd2\x5f\xa2\xe3\x7a\x52\x36\xed\x2d\x86\xd3\x8c\x8e\x4a\xa1\x93\xe1\x83\x6d\x4e\x88\xca\x7d\xc4\x87\xbb\x9a\x05\x1f\x5f\x01\x50\xd3\x3f\x64\x70\x45\x4d\x3f\x68\x7e\x09\xa4\x85\xdc\xbe\xd6\x66\x93\xa0\x24\x45\xff\xdc\x69\x41\x4f\x5e\x4f\x60\xc7\x87\x4b\x08\xb2\xd3\xb0\x6c\x48\x2b\x1f\x70\xd7\xce\x49\x57\x1b\xc6\xbc\xf8\x6a\x9e\x29\xab\x90\xec\x5c\x23\xd8\x8a\xb7\x52\x5f\xee\x9c\xcc\x3a\x0a\xd2\xe3\x98\xc7\xba\x94\x47\x89\x06\x54\x86\x9e\x49\xaa\x48\x9f\x04\x1e\x1c\xe6\x08\xae\x63\xae\xd5\x66\xa6\xa6\x71\xf5\xc9\x7b\x87\x2d\x83\x66\x35\x29\x3f\x97\x9f\xf9\xea\xf6\x8d\xf7\xbb\xac\x19\xe9\x6a\xf3\x18\x77\x4b\xfc\xaf\xc8\xdd\x8d\x10\x9b\x26\xb2\x34\xce\x3c\xf0\x8c\xf4\xf8\xa4\x1e\xac\x15\x39\x34\xec\x6d\xea\xff\x7b\x2b\x43\x77\x03\x85\xdd\x7c\xc3\x9b\xf9\xb2\xd5\xa2\x47\x84\x66\xd3\x00\xb9\xfd\xd2\xf7\xbf\x71\xca\xaf\xb5\xd8\xa4\xbf\xb3\xeb\x65\x85\xbe\x8c\x9a\x8b\xba\xe8\x65\xf1\x5a\x6a\x61\x53\x12\xed\x73\x73\xb4\x14\xf5\xe0\xed\x86\x81\x48\x19\xe1\x62\x42\x43\x09\xc1\x21\x47\x06\x40\x44\xa1\xf6\x10\x85\x20\x10\x11\x28\x4b\x21\x88\x28\xd4\x21\xa2\x50\x00\x44\x04\xca\xf4\xbf\xfe\x9a\x0b\xfd\xbf\xff\xde\x41\xfc\xaf\x7f\xf6\xff\xfb\x9f\x83\xff\x06\x98\xfc\xd7\x5f\x8b\xff\xfa\x6b\xf6\x5f\xff\xb1\x8b\x28\x14\x83\xfa\x3f\x61\xea\x1b\x69\x57\x24\x66\x08\xc2\x56\xdf\x65\x40\xbc\x87\x3e\xca\x70\xdf\x89\x61\x7b\x03\xd9\xc8\x4c\x2c\xd3\x68\xb5\x69\x31\xec\xff\x76\xe5\x00\x41\xd8\xf4\x92\x81\x40\xf1\x2d\x23\xe6\xd4\xa0\x5a\xcb\x69\x7e\x56\xd1\x16\x59\x2b\x7a\xb6\x50\xbd\xe9\x39\x1b\xfc\xe1\xa6\xf4\x8f\x70\x00\x8a\x3a\xb4\x17\x78\x71\x4a\x41\xb3\x1a\xd6\x3b\x45\x89\xf2\xf0\x2d\xb4\x62\x8d\xef\x7c\xc8\x47\x23\x6a\x5a\xcf\x7a\x81\xf1\xf7\x37\x30\x05\x41\x39\x77\xf8\x05\x1f\xd7\x38\xe8\x25\x91\xb3\x44\x92\x21\x93\xa7\x81\xc5\x03\x61\x13\x19\x27\x04\x63\x79\x03\x89\x7f\x20\x18\x80\x16\x7b\xd3\x6e\xd2\x22\xd6\x86\x0e\x5b\x2c\x53\xbe\x95\xd6\xae\xfa\xb0\x52\x81\xf5\x78\xb0\xa7\x08\xab\x0b\x2d\xdf\x01\xcd\xfa\x0c\x80\x0e\x76\x34\x21\x50\xb7\xfe\xf1\xe2\xb9\xcf\x80\xba\xcd\xc7\x83\xad\xbc\x29\x8f\x5b\x14\x88\xc6\xd3\x46\x9b\xcf\x7f\x4e\x9a\xf0\x11\x2c\x4d\x67\x17\xd8\xde\x7a\x16\x61\xb9\x23\x1e\x16\x6f\x75\x92\xb2\x9c\x3d\xc7\x4f\x76\x7e\x1c\xb7\x21\x4a\xee\x7d\x7f\xeb\xab\x89\x08\xb2\x6b\x8c\x60\x1c\x57\x5b\x52\x4a\x3c\x93\xfd\x13\xa9\x7a\x13\x3c\xb4\xc8\x47\x9c\xec\xd2\x4b\xec\x69\x92\x5b\x78\x42\x76\x8d\xf5\x12\x80\x7e\xf2\xd5\x5d\x12\x1f\xd8\x56\x91\x24\x5e\x3b\x93\xc7\xd7\x6a\x3a\x23\x65\x82\xfd\x66\x9c\x63\x9b\xbb\xf0\xba\x3c\x0e\x47\xf9\x14\x80\x62\x11\x73\xe7\xbc\xbc\x8b\x7c\xb9\x77\x52\x13\xb5\x97\x55\x3b\x7d\x8b\xb5\x50\x8a\xee\x17\x7d\x82\xee\x13\xf0\xf2\x03\xf3\x24\x58\x71\xb5\xc2\x2e\x88\xb7\x1a\xc6\x7c\x16\xe8\x9b\x6a\xb3\x2f\x37\x4a\x8a\x36\xc2\x24\x40\x6a\xbd\x4d\x33\xe3\xa6\x55\xce\xaf\x1a\x0c\x0b\x40\x45\xde\xa8\x44\x56\xda\x64\x1a\x98\x48\x0b\x8f\x48\xbc\x22\xfd\x26\xae\x37\x5e\x6a\x3e\x82\x2e\x59\xe1\x37\x7a\x70\x43\xb6\xb3\x06\x6a\x5e\x67\x13\x1e\xd0\x8b\x91\x2f\x97\x79\xf3\x88\x0d\x9c\xdc\xcc\xcf\xb7\xb1\xbc\xc2\x0e\x0a\xca\x21\x4b\xb1\x37\x47\xd0\x9b\xc7\x05\xa0\x6f\xb6\x49\x75\x0a\x61\x2e\x8d\x1b\xe7\x87\x35\xba\x75\xc8\x7d\x74\xdf\x7f\xc5\xf8\x6d\xf3\xbc\x8c\x7a\x24\x2b\x8e\x14\x56\x37\x0e\x80\xc2\x6e\xe7\x40\x7b\x97\x13\x93\x5c\x88\xac\xbf\xa1\x59\x6e\xa5\x80\xea\x6d\x41\x55\x90\x6b\xa1\x9c\x56\xb7\x7b\xa3\x48\xfc\x21\x12\x14\x72\xd7\x72\x2e\x48\xf7\x7f\xe0\xcd\x71\x75\x5d\xd0\x29\xc1\xc9\xe8\x70\x50\xfc\x44\xc2\x7c\x42\xe5\xd2\x37\xc2\xdf\x35\x82\x01\x8e\x7a\x98\x21\x41\x90\x7a\xd4\x7d\xd7\x9b\x55\x52\x2f\xdf\x6b\xab\xb5\x47\x7d\x34\xe8\xcd\x50\xfd\xbd\x3b\xf0\x8b\x91\x8c\xdf\xd7\x5f\x00\x94\x73\xcc\x3c\x13\x83\x30\x7c\x52\xb4\x04\x26\xa0\x37\xfa\x61\x67\x94\xd0\x4e\xc2\xd8\xec\xab\x6d\x53\x75\x8a\x81\x69\xab\x2f\x0d\xd8\x9f\xc2\xce\xaf\x82\xd0\x7d\x6b\x48\x42\x6f\x3c\x06\x6b\xb4\xbb\x17\xec\xe2\xdf\x7d\xa5\x1e\x22\x36\xaa\xae\x6e\x8e\x22\x42\x90\x09\x40\x5f\x6b\xb5\xa4\x19\x9d\x3d\x6e\xf5\x71\x6c\xa6\x2c\xe1\x2f\xac\xcd\xcc\x8a\x26\x84\xc2\x0e\x6c\xd8\xca\x96\xe4\x4b\x3f\x13\x06\xb3\x6b\x95\x6d\xed\xa4\xcc\x6a\xbe\x70\x89\xc6\xf3\x6c\x14\x78\x74\x7b\x8e\x6a\xad\x2c\xc9\xc4\x93\x01\x38\xfa\xda\x84\xa3\x57\xae\xe0\xcc\x92\x28\x0b\x70\x1b\x76\x0a\xa6\x2f\x9c\xe3\x2e\xbc\x69\xf2\x70\x17\xbc\x6f\x50\x30\xc9\x2c\x9c\x6a\x94\x53\x80\x7b\xdd\xf6\x16\x84\x32\x14\xc1\x16\xab\x7a\x44\xe9\x9e\xb8\x9c\xae\xf3\xd0\x8f\xf5\x20\xe6\x2c\x0c\x6a\x32\xca\x4a\xf9\x2a\xda\x31\xa7\xd1\x13\xe6\x00\xd0\xeb\xf4\xad\xd9\x57\xf5\xe2\x58\x35\x76\xc2\x9c\x1e\xb4\x68\x1f\x1f\x9d\x4d\x39\x0e\xeb\x71\x09\xb0\x55\x78\x7e\x45\xb8\xf9\x7b\x82\x32\x4f\x16\x52\x5f\xf9\x57\x26\x13\x18\x44\x2d\xdd\xfd\x3f\xc3\x75\xbe\x8f\x1e\xb2\x11\x25\x4e\x78\xc5\x3e\x89\x60\xcc\xf5\x95\x66\x04\x5c\x30\x85\x96\x7a\x78\x11\xc4\x2c\xe9\x92\x64\x34\xd5\xf9\x91\x5e\xfa\xe1\xf7\x0e\x6a\xb7\x55\xf5\x2d\xdd\x3a\x89\x6a\x90\x48\x2b\x00\x5a\x11\x8b\x56\x6a\x8b\x94\x52\xd0\xb8\x23\x37\x64\x30\x68\x6b\x5f\x0f\xb1\xf1\xf6\x18\x0e\x2a\xce\xb5\xc1\xd5\x31\x54\x27\x1d\x02\xa0\xbf\xba\x09\x27\x93\xa7\x64\xe8\x0d\x51\x38\x54\x0d\xa2\x36\x45\x59\xc6\x4a\x4a\x55\xe3\xb4\x93\x5d\x27\xd3\x47\xfb\x2b\x70\xda\x40\x7e\xe9\xef\xa1\xff\x1f\x63\xd7\x1d\x8f\xe5\xf7\xfe\xed\x9d\x50\x46\x56\x48\x51\x46\x46\xa2\x52\x72\x1b\x2d\x1a\x2a\x95\xc8\xca\x48\x66\x94\x26\x9e\x43\x92\x6c\x32\x23\x42\xc8\xc8\xde\x3b\x64\x65\xef\x64\x66\x84\x8c\xcc\xcc\xdf\xcb\xe7\x79\x9e\xfb\x7b\x7e\x7f\xdd\xfd\x7f\xde\xf7\x7d\x9d\xeb\x5c\xe7\xba\xde\xd7\xfb\x9c\xe7\x7e\x7c\x38\x0f\xa8\xc5\x47\x0e\x1c\xf3\xa3\x70\x79\xf2\x37\xb0\x22\x9a\xc6\xe5\x77\x46\x89\xd0\x2c\x98\x14\xde\x7a\xf3\x1d\xbe\xa8\xa3\x14\xf3\xa4\x29\x25\x16\xbc\xf6\x0c\x3a\xf4\xd3\xb8\x6c\x89\xbc\x2e\x55\x43\xb9\x20\x49\xfe\xd2\x15\xb3\x5d\x57\xb9\x46\x2f\x41\x43\x9d\xaf\x06\x7b\xb0\xfd\x88\x96\x3c\xc5\xfd\xfd\xf5\xf2\x62\x39\x4b\x1e\x38\xcf\x65\x1b\xfe\xe8\xd7\xe8\xe1\xb3\x99\x6b\xa3\xbb\xd7\xa0\xa1\xde\x1e\x53\x4a\xa9\x94\x67\xc5\x9f\x53\x54\x1a\x5e\xd5\xb4\x90\xb6\x4e\xdc\xef\xf9\xa6\xd2\x6a\xee\x9c\x9e\x21\x53\xa8\x56\x50\x21\x34\xd4\x49\x43\x59\xb3\x8e\xae\x72\xd8\xf4\x65\x67\x49\xf4\xd7\xde\x90\x40\x1f\x95\xd1\x67\x35\x26\xf6\x37\x38\x1e\xe6\xc9\xcb\xf6\x84\x15\xec\xfe\xb7\xe4\x0a\x94\xb7\x36\x4a\x36\x83\x79\xa0\x47\x6b\xd9\x0b\x14\x30\x0b\x91\xbe\x78\x50\xc8\x62\x4f\x81\x7b\x96\x69\x57\x78\x53\x65\x83\x99\x3f\xc4\xf2\x33\x19\x9d\x9f\x89\xb9\x1f\x00\xc8\x67\x46\x68\x7c\x4a\xba\xda\x70\xfd\x83\x9b\x65\xbc\x4b\x96\xd1\xf3\x5f\xf9\x1e\x2c\x54\x7c\xe8\xa3\xa0\x50\xa7\xec\xf1\xbd\x67\x39\x7c\xd4\xcf\x1a\x20\x39\x64\xd0\x70\x36\xff\x17\xfb\xce\x7b\x64\x85\x85\x4d\x06\xe6\x5f\x94\x5e\x71\x70\x21\x53\xb7\x5f\xfa\x7e\x3f\xd7\x81\x6e\xb8\xe9\x9a\x67\xb5\x2c\x0e\x20\x89\xbb\xa0\xf1\xad\x64\x7b\x29\xbd\xf4\xdc\x97\x1f\x95\x07\xdf\xc4\x69\x8a\xec\x48\xb9\xdb\xb4\x18\x93\x28\x4f\x79\xec\x8d\xb5\x7c\x46\x3b\x5b\x1d\x0e\x20\xef\xe9\xa0\xf1\x85\x89\x7e\x69\xfb\x96\xb6\x02\xf4\x45\xaa\x6b\xde\x71\x96\xe8\xba\xbe\xa9\xb0\x26\x15\xae\x15\x7b\x78\x9b\xe4\x4c\x5f\xda\x61\x26\x67\x80\xf8\xec\x80\xe5\xc2\xf3\xc7\x8f\xf6\xf1\x5a\x3f\xad\x50\x93\xbf\xcf\x27\xa0\xfc\x9c\x97\xee\x5a\xfc\x09\xe3\xbc\x47\xa9\x4b\xd4\x0f\xfb\xb2\x40\x0d\x40\x7c\xe1\xd9\x96\xd6\xa6\xea\xdd\x74\x2e\x14\x77\xb9\xc3\x2f\x9f\xa8\x2a\x4e\x77\xe8\xef\x0b\x65\x9d\x7b\xc2\x72\xe3\x23\xe7\x6f\x06\x7b\x3f\xea\x04\x48\x1f\x2b\x9c\x01\x78\x0f\x3c\x8e\x88\x4c\x4a\x7e\x76\xb5\xa2\xee\xdc\xf4\x5c\x8f\x9e\x00\xe9\xd3\xbd\x0a\xce\x61\xfc\x7b\x7b\x68\x25\x99\x23\x26\x01\x50\x84\x8d\xaf\xb4\x8d\xb6\x4a\x3e\x22\x15\x42\xc1\xa3\xd8\x9e\x7e\xe3\xfd\xd7\x33\xa2\x40\xe9\xc2\x8e\xb7\x73\xa2\xde\x57\xa4\x59\x0b\xa9\xde\x00\xc4\x87\x12\x2e\x9d\x07\x79\xc8\xf8\xd4\x97\xb4\x6e\x51\x35\x5f\xa7\x99\xca\x67\x53\x73\xff\x79\x55\xc0\x87\x56\x6c\xf0\xe5\x70\x95\xda\x5a\x4b\x9a\x33\x40\x3c\x99\xa1\xf1\x75\x17\x4e\x2c\xb6\x58\xdd\xbc\xf0\xe9\x1d\x97\xb8\x71\xf3\xee\x23\xa1\xa9\x31\x0d\xbf\x0e\x92\x0c\x1f\x9a\x5f\xba\x6b\x2f\x67\x1c\x02\x90\x77\xa4\xd0\xf0\xb5\xd8\x57\x1b\x3f\x76\x9b\x17\x7b\x9c\xf0\x3e\x2a\xfe\xe4\xe0\xd8\xf5\x9b\xa7\xac\x19\xce\x24\x29\xc7\x4a\x4a\x5f\xc3\x29\xea\xaa\x03\x64\x93\x06\x1a\xfe\x94\xbc\x49\xd4\x83\x24\x46\x53\x59\xdd\xbd\x3f\x51\x9d\xdb\xae\x45\xa8\xca\x4e\x30\x21\x40\xeb\x6b\x78\x6c\xcd\xb2\xcc\x29\x3b\xd8\xe9\xb3\x61\x59\xad\x95\x25\x7f\x8e\x17\x98\xca\xca\x2d\x81\xe0\xfd\xf5\xec\xaf\x4e\xf1\x19\x72\xbe\xec\x72\x3a\x46\xbe\x5a\x41\x85\x03\xc8\x10\x6c\xf8\x4e\x55\xf9\xa0\x5a\x87\xc7\x46\x62\xa3\x92\xcf\xf4\x9f\x5b\x39\x9b\x3c\xfb\x56\xf7\x73\xc2\xd1\xf5\xa3\x1b\x1b\x8f\xe0\xe8\xbe\x58\x00\x90\x46\xd8\xf2\xcf\x22\xe2\xd7\xf4\xbf\xf7\x04\xb7\xe6\xb5\x91\xe8\x2a\xd5\x96\x49\x67\x51\xbc\xba\x9b\x15\xf5\xb9\x3c\x3b\xca\xf5\x73\xfa\x96\x26\x40\xe6\x19\xa0\xe1\x4a\x54\x53\x0c\x8c\x97\x1b\x72\x28\x07\x56\xf9\x23\x5f\x75\x57\x2c\x28\x56\x0b\xc9\xf1\x33\x1f\xcb\x56\x2b\x8d\xe2\xda\x7a\xfc\x09\x00\xc4\x07\x8e\xc9\xaf\xd3\x9b\xfb\xae\x8e\xb1\xf2\xb6\xc6\x16\x2e\x9b\x2a\x4d\xfa\xbb\x0e\xd0\x3e\xae\x17\xed\xa8\x14\x89\xff\xb8\x3f\x4a\xbf\x54\x0b\x20\xd9\xf0\x32\x49\xd4\x34\x17\xfa\x85\xef\xbb\x5c\x85\xd0\xef\x3d\xa5\x5e\xbb\x2f\x36\x3f\x28\xe9\xb0\x7b\x55\xc3\xed\x33\x8f\x82\x3a\x5f\x9a\x1f\x74\x06\x48\x02\x1c\x34\x8b\xfe\x07\xbe\x06\x3c\x1b\xe1\x66\x61\x2f\xbe\x64\xd1\x69\xff\x35\x6e\x5a\xab\xb4\x69\x4e\x86\x4f\xdc\xcc\x94\xfd\x9d\x3d\x8d\x33\x40\xf2\x28\xe0\x73\x39\xa9\xbe\xba\xea\x63\x8f\xaa\x26\xaf\xbf\x62\xa9\xb0\xc1\x85\x7b\xcd\xc9\xf1\xfd\xea\x4c\x9e\xbf\xdc\xdd\xff\xf2\xc7\x6e\xce\x48\x80\x94\xc3\xcb\x74\xc6\x9a\x81\xc3\xf3\x51\xdc\xd2\x85\x63\x7a\x75\x15\x66\x19\x5d\x31\x32\x59\x01\x19\xd7\x9f\x5b\x24\x5b\x8e\x87\xaf\xc4\xc9\xb6\xc3\xc1\x6e\x2c\x3f\xd9\xad\x50\x20\xac\x6d\x78\xc7\x3a\xc4\xcb\xfe\x0f\x6e\x56\x4e\xe6\xd7\xb7\x5b\x54\xfb\xdc\xd4\xcf\x5d\xe1\x6d\x85\x13\xd2\xf5\x2b\x5a\xa1\x88\x30\xae\xf8\x1b\x1f\xa8\xbc\xfa\xe7\xe9\xe4\xc2\x49\x61\xeb\x5e\xe4\xe0\x7e\x9b\xfb\xc6\x26\x67\x2e\x5a\xcc\x41\x43\x27\xe8\xef\xd0\xe6\x8f\x67\x08\x6e\x9d\x10\xa4\x12\x71\xb7\xd2\x67\x76\x77\xf8\x56\xd4\xf9\x97\x77\x73\x2d\xc0\xf3\x49\x4b\xf2\x3e\x67\x80\x94\xfe\xbf\xc5\xa4\x1c\x60\xc9\x3b\x60\x44\x3a\xd4\xe9\xf7\x39\x7e\x2f\x29\x77\x39\xdf\x0e\x06\xbe\xbb\xbb\x5b\xd9\x72\xa9\x6f\xe8\xaa\x66\xb4\x02\xa4\x93\x05\x1a\xce\xf8\x46\xdb\xdd\xf1\xc8\x5b\x4f\x21\x26\xf5\x37\x5f\xd2\xbf\x44\x6f\x92\xbc\xf0\xea\x5e\x8a\x7c\x7b\x2a\xcc\xf6\xb3\x54\xed\x0d\x72\x80\xf4\xc3\xa1\x65\x3f\xee\x7b\x21\x26\xd0\x63\x6a\xf7\xa4\x98\x55\x08\xff\xd3\x9c\xfd\xb1\x9e\x3f\x58\x83\x9c\x76\x7d\x70\x3b\xad\xf4\x30\xdb\x84\x0e\x00\xa4\x0a\x4e\x00\x7a\x1f\xbb\xef\xf7\x87\xb9\x8d\xb1\x94\x59\x77\xb8\xf2\xee\x39\x39\xc9\xc0\x1f\xb2\x75\x48\xdc\x8d\x93\xdc\x98\xe7\x06\x77\xf6\x00\x40\x96\x61\x6f\x0f\x5c\xe3\x9c\xd0\x50\x70\x7b\x67\x39\xbc\x19\xe4\x73\x54\xec\x9c\x06\x6d\xe0\x8c\x2d\xe9\xb7\x3b\xdd\x11\x67\x72\x98\x52\xd6\x5d\x70\x00\x09\xa5\x85\x57\x87\xea\x79\x26\x47\xe8\xab\x93\xe7\xcc\x12\xaf\x06\x05\x7d\xa4\xef\x56\x31\xba\x8d\x0b\x7e\x73\xac\x99\xf1\x67\x78\xfb\x05\x27\xb8\x62\xb7\xb9\x93\xfb\x5e\x22\xb9\x6b\xcb\xf9\x47\xf2\x4f\xea\x80\xea\x73\x9d\x23\xbe\x22\xed\x89\x33\x9e\xd1\x5c\xab\x55\x5c\x9c\xb7\xdc\x9c\x01\xe2\x4b\x05\x8d\xe7\xac\x88\xd0\x32\x38\xb0\x96\xf2\x59\xc2\x81\xfc\x6f\x07\xcf\xbc\x7d\x2d\xb5\x03\x8f\xfe\xe8\xb0\x52\xf1\xf1\x99\xe1\xaa\xf9\x8b\x00\xe9\x84\x39\x59\xcf\x9a\x0b\xf3\xf5\x56\x0f\xb5\xc5\x2d\x53\x1d\x24\xf3\xf8\x17\x59\x03\x63\xae\x3b\xa6\xbf\x42\x59\x86\x02\x7d\xfa\xd5\x6d\xce\x01\xa4\x0b\xf6\x4b\x12\x6f\x1c\xe7\xd8\xcf\xf1\xfe\xa7\x99\xec\xe9\x35\x73\x72\x0e\x11\x77\x3a\x3a\x4a\x48\xdd\xdd\xea\x63\x5f\xa8\xb9\x3e\x9c\xec\x71\x06\x48\x1d\x4c\xa5\x1d\x14\x2e\x38\xb2\xe5\xc4\x1f\x5d\xfc\xba\x6b\xce\xfb\x83\x9a\xaf\xdb\xc4\xb8\xea\x95\x89\xc3\xc3\x33\xa2\xb3\xb7\x3b\x7f\x92\x0d\x00\x64\x0e\x4e\xd3\x3b\xd8\x37\xbc\x7f\x7c\x9d\xb9\x67\x67\x50\x90\xf6\xb8\xeb\xe1\xab\x58\x03\x9d\xab\x59\xba\x0f\x90\xc3\x22\x0a\xc7\x4e\x53\x64\x86\x00\x64\x0b\x1e\x5e\x70\xa4\x42\x4d\x3b\x5c\x96\x23\x47\x63\xe4\x17\xd3\xd9\x91\x43\xa3\xc7\x6f\x9f\x38\x28\x16\x17\x6b\x3f\x7b\xdf\xc4\xaa\xef\x46\xa9\x33\x40\x3e\xc1\x51\xf0\x67\xbf\x14\xb5\xc7\x00\x13\xc9\xa7\xdf\x7d\xf1\x53\xe1\x76\x01\xb1\x26\xe2\xe5\xe4\x3b\x27\x4e\x9a\x34\xe5\xbb\x73\x38\x8f\x55\x02\x24\x11\x2e\x62\x89\xf3\xc2\x69\x15\x55\xab\xb6\xbd\x7c\xe9\xc7\x2f\x1f\x6c\xda\xf9\x22\xb1\x9c\xcb\x29\xa6\xfa\xb1\x8b\x82\x85\x0c\xcf\x29\x91\x78\x80\x64\xd2\x43\xc3\x4f\xbb\x0a\x2c\xf0\x3c\xa0\xe3\x62\xa3\x2f\xd3\xe6\x9e\xde\x32\xbc\x91\x53\x2b\xda\xf0\x25\xe0\x58\x8e\x36\xbb\x64\xb4\xa2\x57\x1b\x34\xb4\xfd\xa6\xd4\xb2\x8f\xb2\xac\xcc\xcb\x92\x25\x99\x45\xca\x02\x39\xbf\x85\x17\x0f\x2f\x71\x9d\x3d\xd5\xbd\x14\xcb\xc9\x1a\xdb\xd2\x83\x03\xc8\x67\x38\x15\xc5\x71\xad\x56\xa4\xcf\x57\x50\xc5\x7c\x98\x0c\x35\xb0\xa3\xab\x1d\x8e\xaa\xf8\xb3\xfa\xd7\x37\xf4\xed\x61\x7b\x76\xbf\x33\xa4\x1b\xd0\xd0\xfa\xdc\xb4\x63\xbe\xd9\x67\x0f\x74\x56\x1f\x20\xf5\xfb\x3e\x26\x29\x5d\x50\xa9\x94\x31\x67\x99\x6a\xcd\x9d\xf2\x7d\x86\xe4\xec\x80\x33\x40\x3e\xc2\xfb\x6e\xce\xe2\xad\xcc\x59\x8a\xe3\x37\x1d\x0d\xee\x3d\x28\xf9\xba\x57\xe1\xc3\x78\x33\x05\x9f\x45\x69\xf1\xc1\x36\xd9\x9f\x1a\xcf\xed\xbe\x01\x24\x95\x0d\x1a\x6e\x52\x39\xbf\x74\x74\xc8\xc6\xae\x5a\xc8\x39\xdb\x45\xfa\x08\xf2\xc1\x46\x9c\x41\x84\x9d\xed\x99\x72\x0b\xe3\x35\xd6\x5f\xe1\x1d\x00\xa9\x84\x5d\xa8\x5d\xe3\x21\x5d\x71\x91\xf1\x98\xad\xcf\x67\xd3\xc6\x32\x05\xa6\xea\x0b\x37\xc2\x04\x93\xdf\x1e\xfb\xc1\xa9\x56\x55\xfb\xc9\xac\xd2\x19\x20\xce\xf0\xe3\xd9\x92\xef\x1c\x3e\xe7\xc8\xaa\x9b\x10\x5a\xc8\x15\x74\xfb\xdc\x80\xaa\xef\xde\x5b\x0c\xf7\x74\x9e\xa8\x34\xab\x35\xd4\x17\xa9\xe8\x01\xc4\x1b\xee\x53\x9c\x85\x37\x59\x3e\x8c\x99\xe5\x7f\xc7\x9d\xc8\xfc\x31\xd3\x79\x2a\x37\x99\x9c\xa9\x2c\x7e\x2e\x81\x8f\x51\xe3\xcb\xd6\xb5\xdc\x42\x80\x0c\xc2\xdb\x2e\xd1\xa4\xe6\xe8\x72\xbe\x7a\xed\x7e\x19\x59\xc6\xca\xbf\xd9\x55\x21\x62\x12\x5b\xc7\x07\x37\xce\x52\x31\xa4\xbe\x78\x12\x60\xbc\x0c\x00\x52\x0e\x17\xea\x93\x6d\x17\x53\x3d\x6e\x07\xde\x5b\x8c\x38\xca\xbb\xc4\x17\x9e\x9d\x7e\xeb\xcf\xa7\xa6\x47\x0a\x93\xec\x3a\xa2\x1f\x63\xdc\x2c\x5a\x00\xd2\x01\xa7\x68\x8a\x99\x31\xd2\x22\x1a\xf2\x32\x9e\x21\x15\xea\x28\x16\x1a\x9a\xe7\x5f\x7b\xfc\xdc\x36\x6b\x33\xab\x3a\x96\xa8\x44\x39\xe9\x9e\x39\x03\x24\x0c\x0e\x47\x15\x83\x26\x4f\x9e\x47\x41\x2f\x72\x3c\x98\x48\x96\xed\xc1\x86\x88\xe8\x9b\xa8\x46\x26\x56\xbb\xbf\x66\xe7\x9e\x5b\x7e\x0e\x13\x01\x48\x22\xbc\x97\x34\x26\x3f\x6f\x28\x33\x54\x55\x57\x08\x3d\x0f\xed\xd9\x9d\x75\x59\x55\xc1\xbb\xb2\xa3\xe2\xc8\xa1\xca\x17\x35\x4f\xdd\x98\x45\x63\x01\xd2\x06\xe7\xa4\x07\x77\xcf\x37\xcd\xc9\xee\x8d\x6f\x1c\x90\x55\x62\xd5\x5b\x2f\x6a\xca\x4a\x31\xac\x3e\xc3\x9c\x1a\x3e\x4c\x66\x53\x4d\x97\xfe\x26\x9c\xec\x1f\x99\xa0\xb2\x1e\x89\x9b\xd3\x4b\x1c\x40\xbc\xe1\xbc\xc4\x54\x11\x97\x43\x26\xb6\x68\xd2\x88\xab\x53\x3a\x98\x20\xdb\xbc\x36\x32\x2a\xd2\xac\x55\x49\xa3\x48\x45\x47\xe6\x28\x7e\x85\x12\x07\x90\x75\xd8\x97\xc6\xaf\x96\xea\xed\xf6\xcc\x1d\xda\xb8\x7c\xfe\x3b\xa7\x12\xa9\x6a\xe7\x9d\x92\xe8\xb9\xdb\x97\x25\x32\xf6\xe8\x36\xeb\x46\x44\x9f\xc4\x01\xa4\x1d\x8e\xcb\x95\x8a\x7a\x39\x3d\x43\x1d\x5d\x13\xb1\x62\x7a\xd2\x33\x7a\xfb\xb5\x3b\x79\x9b\x3b\x02\xad\x8e\x37\x75\xe7\xa5\x77\x9c\x5c\xe2\xc2\x01\x64\x04\xce\x05\x49\xe4\xb5\x55\x4e\x82\x17\xaf\xeb\x76\xf4\xb6\xf3\x1b\x79\x58\x38\x70\x55\x3e\xab\xf5\x08\xd1\xac\x69\x8c\x96\x0d\x10\xae\xf1\xc6\x01\x24\x10\xce\x64\xb6\xbf\xe2\xa6\x1a\x43\xce\x18\x92\xc5\x9c\xb0\xb2\x76\x6b\x50\x94\xed\x0a\x69\x31\xcf\xec\xd5\xf6\x8d\xca\x0e\xdd\x90\x2c\x0c\x96\xf8\xb7\x69\x02\x45\x52\xdc\x7f\xae\x59\x92\xf8\xb7\x79\x12\x00\xeb\x74\x44\x00\xd6\x44\x09\x80\x76\x52\x22\x00\x6b\xa6\x04\xc0\xc8\x0e\x22\x00\x6b\xaa\x04\x40\x20\x23\x11\x80\x49\xf6\xf1\x80\xcf\x28\x00\x8b\xee\x13\x00\x39\x64\x44\x00\x16\xdf\x27\x00\x12\x77\x11\x01\x58\x84\x9f\x00\x78\x8f\xba\x15\x93\xf1\xe3\x01\x3e\xa8\x97\x30\x39\x3f\x1e\xe0\x8b\x4e\x1a\x93\xf5\xe3\x01\x7d\xac\x4b\x87\xff\x91\xf7\xff\x07\x50\x44\xa7\x80\x45\xfc\x89\x53\xa0\x24\x02\x30\x99\x3f\x1e\xe0\xc9\x4c\x04\x60\x72\x7f\x3c\xe0\x1d\x1a\x7b\x58\xec\x9f\x00\xd8\xa4\x59\x0a\x23\xfb\xb7\x26\x00\x28\xf1\x39\xf9\x6d\x67\x97\x55\x38\x53\x27\x8b\x45\x59\x38\x1d\x11\x32\x38\xa9\xa1\xd6\x63\x2f\xb7\x27\xca\xae\xd2\x90\x65\xd4\x68\xff\x81\xf9\xf3\x95\x85\x7f\x87\x90\x0f\x38\x80\xb8\xc1\xac\xc7\xe1\x5e\x16\xe3\x41\xbf\x5d\x93\xab\x65\xbf\x19\x63\x7d\xd5\x2b\x42\x4c\xed\x15\xd3\xa5\x4e\xfd\x6a\xa6\xd9\x8c\xd0\x57\xfd\xbe\x9d\x2d\x3e\xc2\xf4\x51\xfc\xea\x22\x30\xe1\xa3\x32\x48\xc0\xcd\xd1\xfc\xde\xf9\xb3\x56\x78\x23\x8d\x2b\xef\x46\x10\x95\xd5\x53\x12\xd6\xea\xe9\x44\x47\x1c\x50\x7c\x06\x0d\x57\x43\x36\xdd\x2e\x25\xf0\xa4\x66\x71\xf4\xb2\xe4\xae\x68\xe9\xdf\xdd\xef\xa3\x97\x3f\x7b\x20\x8e\x41\x2e\x2c\x96\x4d\x33\xfa\x04\x0e\x20\x35\x30\x15\x08\x6b\x7c\x23\xfb\xcd\x5f\xec\xce\x35\x4b\xb3\x07\xf2\xf5\x2f\x78\x90\xa2\x43\x81\x4f\xef\x75\xec\x90\x6a\x8c\xe4\x6e\x3e\x90\x35\x28\xf1\x6f\xb3\x24\x78\x73\x95\x96\xe8\x7e\xac\x69\x12\x00\x6e\x54\x44\x00\xd6\x3c\x09\x80\x8f\x2c\xc4\x18\xc5\x9a\x29\x21\x46\x9f\x11\x5f\x80\x35\x53\xc2\x0b\x6a\xe8\x89\x00\xcc\x26\x0f\x0f\x18\x42\x63\x14\xb3\xcb\xc3\x03\x1a\xd1\x18\xc5\xec\xf3\xf0\x80\x79\x06\x22\x00\xb3\xd1\x23\xec\x33\x34\x19\x61\xb5\x7a\x04\x40\x36\xba\x31\x31\x7b\x3d\x3c\x20\x81\x95\x08\xc0\xec\xf6\xf0\x80\x3c\x0a\x22\x00\xab\xdf\x23\x00\xca\x69\x96\x88\x75\x1f\xab\xed\x03\xca\xa4\x24\x64\x6c\xdb\x3b\xd3\x03\x6e\x18\xf4\x8a\x5d\x16\x0e\xba\xff\x61\xac\xfb\xb2\xec\x2d\x6a\x72\x21\xa9\x7b\xc7\xd8\xc2\xe8\x77\xf6\xdf\x1d\x87\x12\xba\xbf\x9e\x3c\xe3\xbc\xbd\x14\xf0\xf8\xe8\x9d\xed\x74\xb2\x27\x5f\xdf\x90\x6c\x75\xee\xd2\x19\x90\xeb\xeb\xd5\xea\x6f\xf7\x1c\x94\x0f\xf4\xbd\xd2\x49\xbd\xe4\xb9\x74\x1a\x07\x90\x5a\xb8\x8e\xa7\x0d\xdc\xe4\x34\xf9\xad\x52\xa2\x7a\xf8\xc5\x7d\x91\x43\x2a\xd4\xa1\xc7\x5e\xb7\x7d\x72\xe8\x28\xd0\x95\xb6\x2a\x98\x7c\xdb\xd3\x86\x03\xc8\x30\xcc\x43\x64\x1d\x77\x4f\x83\xc0\xcc\x08\xbe\x99\x50\x47\xd3\xfd\x1e\x5c\x9f\x6b\x1a\xed\x2e\x4e\xfe\xe1\x6f\xbb\x2e\xb0\x26\xdf\x21\x6d\x8a\x03\xc8\x12\x4c\xa5\x4d\x9e\xc9\xd4\x0a\xec\xba\x99\x72\xc2\x3c\x22\x68\xe4\x18\xd3\xa9\x72\x45\xb3\xbb\xad\xac\x66\xc9\xeb\xfe\x53\x12\x6d\xab\x32\x0f\x24\xfe\x6d\x9a\x04\x7f\x7a\xec\x26\x2e\x00\xd6\x3c\x89\x61\x8a\x02\xb0\x26\x4a\x00\xd4\xa2\x05\x0a\x6b\xa6\x04\xc0\x30\x4a\x45\xb0\xa6\x4a\x00\x2c\xed\x5a\xaa\x27\xfb\xb7\xfe\x1e\x28\x53\x08\x93\xf2\x6d\xc7\xc4\x3b\x98\xb5\xf3\x1c\x8f\xf0\xbc\x43\xc9\x18\x12\xec\xca\x75\x8b\xd1\x78\x28\x49\xe1\x46\x72\xb0\x81\xe4\x7b\x2f\x9f\xa9\x92\x92\x7b\x74\x9c\xda\x38\x80\x04\xc3\xd4\x34\x7b\xec\x41\x84\x1f\xc7\x83\xc5\xb3\x73\x93\xf9\x01\x9a\xb2\x0d\x53\x2c\x9c\x93\x54\xe4\x32\xf1\xcf\x68\x9f\xdf\x8d\x6f\xcf\x4a\xc0\x01\x24\x12\x26\xd6\xa7\x96\x9f\xaa\x58\x9e\xb4\x3d\x41\xb6\xc7\xe2\xe9\xed\xd1\x94\x1a\xa7\xc7\xfa\x1b\x7e\x00\x48\x8c\xa4\xee\xe4\x10\x9a\x5a\x5f\x02\x00\x89\x81\xab\x47\xb3\xff\xbc\x3f\x47\x99\x57\xd4\x44\x42\xf8\xd5\x45\x17\xaa\x17\xa3\x11\x7b\xb6\x46\x0d\x71\x5c\x34\x59\x4f\xb7\xca\x7d\x13\x9c\x00\x52\x0e\x2b\x31\x2f\xbb\x99\xe9\x78\x3e\x0a\x1b\x97\xc9\x51\x73\x77\xb9\x59\x9f\xcf\x55\x7f\x30\x52\x0f\xa8\x6d\xb4\xc5\x49\xf8\x28\xcc\x56\x97\x70\x00\x59\x83\x89\xf8\x41\x2b\xbd\xd3\xef\x78\xbb\x9e\x5d\x9c\xcd\xbe\xed\xfd\x9e\x61\x2c\x44\x4f\x5c\xe7\x4b\xa6\xf3\x31\x16\x6e\xf3\x38\x3b\xe6\x9d\x2b\x12\xff\xe6\x15\x62\x71\x65\x23\xae\x17\x96\x5b\x08\x80\x60\x1a\x22\x00\xd3\x2f\x78\x40\x24\x9a\x25\x30\x1d\x83\x07\xc4\xa0\x05\x07\xcb\x35\xc4\xb4\x82\x26\x2e\x2c\xdf\x10\x00\x6b\x3b\x97\xde\x91\xfd\x9b\x50\x04\x94\xd3\x48\x48\x28\xb6\x63\xae\xe0\xff\x29\xc0\xa3\x33\x9c\xbf\x68\xdf\xcc\xda\xa7\x4a\x6e\xda\x5f\xd5\x53\xa9\x7e\xfe\xb6\xa8\xbe\xc5\x70\xf2\x9e\xd2\x0e\xea\x1e\x63\x12\xdd\xed\xfc\x0b\xab\x7f\x37\xfe\x5e\x7b\xcd\x79\xe7\x40\x4c\x5f\xea\x44\x61\x76\xbc\x70\xc5\xab\xaa\x33\x8b\x2c\x38\x9b\xb9\xfb\x32\x82\x14\x49\x8c\xcb\xfb\xb7\xf7\x26\x13\x2c\xfe\xaf\xbd\xdb\x7f\xf6\x77\xb5\x77\x93\xe2\x6f\x50\x1c\x75\x32\xad\x7f\x3d\x53\xef\xdb\x46\xe8\x10\xb7\xbb\x9d\xf6\x1b\x51\xf9\x31\x1c\x50\xb4\x85\xdb\x68\x59\x06\xcf\xa1\x85\x2b\xa3\xcc\x19\x97\x9b\xd6\x75\xd5\x8e\x54\x54\x44\x0e\x79\x8a\xf7\x6a\x7d\x26\x3b\xbe\x5f\xbe\xaf\x64\xf7\x76\x8f\x00\xc7\x10\xd5\x45\x27\xd9\xb4\x05\x1f\x9b\x9f\xa4\x51\x47\x96\x3b\xe6\xb5\x7e\x71\xf9\xb6\x34\x57\x5c\xf0\x7d\x7e\xe6\x2d\xe5\xc5\xfe\xd6\x93\x12\xff\x36\x4b\x82\x3b\x0b\x50\xce\x88\x35\x4d\x62\x69\x42\x8b\x1f\xd6\x3c\x89\x79\x8b\x89\xc8\x10\xb0\x66\x4a\x60\x08\xb6\xc4\x17\x60\xcd\x94\xd8\x41\xed\x44\x0b\x3e\x96\x12\x88\x07\x94\xa2\x05\x1f\x53\x0b\xc4\x03\x3a\x59\x88\x00\x4c\x35\x10\x0f\xe8\x47\x39\x08\xa6\x1c\x88\x07\x54\xa1\xbd\x01\x96\x20\x48\x00\x2c\xa3\x5b\x19\x4b\x11\x24\x00\x42\x69\x97\xa6\x48\xff\x4d\x18\x04\xca\x08\x13\x09\xc9\x76\x3d\xfe\x08\xc7\x75\xd6\xb5\xe3\xd5\x8d\x2f\x5e\x3f\x10\x33\xa6\x3a\x96\xcc\xaa\xfc\x4b\xce\xec\xfb\x0f\x26\xeb\x3e\x96\xd4\x90\xa7\x21\x7a\x9f\x13\x4f\xe1\x00\x92\x01\x07\x2a\xfb\xda\x9c\x8b\x3b\x49\xc3\x8d\x62\x89\xde\x93\x9b\xfb\xae\x8c\xef\xbf\x1d\x53\x78\xa9\xc2\x3b\xab\x37\x3f\x4d\x54\x3a\x6b\xee\x32\x00\x88\x13\x9c\xab\x4f\x86\x98\xe2\x38\x24\x1f\x70\x85\x48\x4f\xcd\x2e\x17\x88\xc9\x3a\x72\x7c\xdd\x73\x7d\x8a\x97\x23\xd3\x28\x51\xae\xd7\xb5\x50\x1a\x20\x3d\xb0\x6a\xbe\x75\xaf\xdb\xda\x8e\x2d\x35\x39\x55\x5e\x6c\x98\x99\x4f\x89\xbd\x8b\x9e\x35\x83\xef\xf8\xfd\xaf\x33\x63\x0a\x5d\xaa\x2a\x95\xde\x12\xff\x66\x35\x91\xc7\x32\x11\xfd\x89\x69\x36\x1e\x90\x81\x46\x1d\xa6\xdd\x78\x80\x13\x9a\x4b\xb1\x2c\x27\x00\x7a\x50\x12\x88\xa9\xcc\x12\x1a\x4c\x94\xbc\x63\x6a\xb3\x84\xb8\x46\x29\x05\x96\x3a\x4b\x00\x74\xa1\x61\x8a\x29\xcf\xe2\x01\x75\xa8\x97\x30\x05\x5a\x3c\x60\x0e\x25\x2d\x58\x12\x2d\x01\xb0\x85\x02\x30\x35\x5a\x3c\xe0\x13\xba\x37\x31\x55\x5a\x82\x94\x80\x6a\x0f\x58\x3a\x2d\x01\x90\x49\xbf\xf4\x9b\xf4\xdf\xe4\x5a\xa0\x8c\xa3\xf8\xef\x2f\xa6\x90\x7e\xb8\x29\xdd\xd1\x6c\x75\x37\xc6\x48\xa3\xb9\x71\x8f\xee\x04\xaf\xd7\xf1\x5b\xa6\xaf\x29\x76\xc8\x1a\x54\xb8\x18\xca\xd6\x7b\x7e\xbc\x73\xc5\x12\x07\x90\x20\xb8\x29\x95\x17\x5a\xa4\x69\x94\xe7\x13\x77\xbc\x09\x36\xc9\xb3\x65\xaf\xd7\x95\xdd\x3c\x1f\xab\x33\x8d\x13\xfe\x75\xba\x2d\xab\x38\xa8\x6f\xfb\xf9\x70\x49\xf3\xf9\xe3\xfc\x4a\xe9\x45\x1a\xc9\x96\xda\x81\x3d\x0c\xd2\xd7\x8e\x66\xdc\x01\xbd\xec\x0e\xd1\x06\x53\x57\xaa\x1e\xef\x4e\x21\xaf\xdd\x2e\x0c\x30\x55\x4e\xbf\xf6\x2b\x33\x31\x47\xf9\x4d\xd7\xaf\x82\x7d\x4f\x37\x2e\x48\x8a\x92\x7e\xb7\x70\x76\x7c\xdc\x56\x50\x3e\x3e\xd6\xce\x1e\x17\x20\xf1\x6f\x66\x13\xb3\x23\x1a\xa7\x58\x76\x13\x00\x41\x68\xfe\xc5\x32\x9c\xf8\x06\xb4\x48\x61\x59\x4e\x2c\x83\x28\xf5\xc5\x12\xcc\x89\x0a\xd6\x2e\x34\x9d\x62\xe9\xe6\x40\x89\xcc\x85\x69\x7b\x89\x27\xe1\x6e\xa5\xd5\xd1\xa4\xaf\xcb\xe7\x15\xeb\x5f\x4e\x16\x31\xdf\xfc\x54\xfa\x6a\xea\x7c\x92\xa1\x1a\xa1\x9e\x8f\x1b\x56\x1c\x3b\x6a\x7e\x4a\xe1\x00\xd2\x06\x67\xdf\x36\xed\x36\xed\xe7\x5b\x52\x57\xa8\x8a\xbe\xb6\xcc\x66\xf6\x9b\x3a\x36\x3f\xbc\x63\x69\xd7\xbf\xe3\x77\xe1\x19\x56\x99\x07\x1f\xa8\x70\x00\x89\x87\x25\xe2\x61\x5d\x52\x2a\xb1\xe0\x66\xab\xf8\x0b\xe2\x3f\xaf\x4e\x96\x0e\x8c\x7a\x7f\x77\x89\x2d\x2e\xb4\x2f\x2c\x08\x4a\x53\x6a\xa2\xbf\x8a\x03\xc8\x02\x1c\x42\x45\x85\x4d\x54\xd5\x64\x2f\x6c\x8c\x4b\xcb\x7f\x69\x14\xa8\x7a\x9c\xfc\xee\xb4\x7e\x69\xba\xbc\xeb\x53\x75\xc9\x8e\xb4\xdf\x40\x40\xe2\xdf\xcc\x26\xb8\x67\x12\xdd\x95\x58\x76\x13\x00\x6d\x68\xfe\xc5\x32\x9c\x00\x88\x47\xb7\x31\x96\xe5\x04\xc0\x02\x1a\x44\x98\x07\x17\x84\x92\x80\xd2\x04\xcc\xa3\x0b\x3c\x20\x15\xe5\xe3\x58\x87\x17\x04\x40\x25\x9a\x59\x30\x4f\x2f\xf0\x00\x67\xf4\x0d\x98\xe7\x17\x04\x6e\x44\x8e\x26\x3b\xac\x13\x0c\x3c\x60\x10\x25\xf0\x98\x47\x18\x04\x02\x8f\x12\x48\xac\x43\x0c\x02\xa0\x03\xad\x83\x98\xa7\x18\x78\x40\x18\xba\xd2\x98\xe7\x18\x84\x84\x8d\x16\x1d\xac\x93\x0c\x62\xf0\xd1\x2c\x05\x10\x3e\x1b\x8e\x75\x85\x10\x28\x3b\x6e\x6d\x6e\x06\xf3\xe0\x80\x22\x7c\x9c\x94\xfb\x5d\x95\x79\xe9\x09\xd3\xf0\x89\x7a\x52\x92\xd5\x97\xa5\xd6\xa6\x6a\x4f\xbb\xcd\x82\x14\xf8\x27\x57\x05\xca\x29\xc2\xd2\xe2\x01\x40\xf2\xe0\xd3\x2d\x9f\xa2\xbf\x46\x6c\x1f\xe5\x36\x77\x2a\xb3\x30\x34\x5f\xbf\xd1\x10\xb1\x97\x5f\x54\x62\x86\xfd\xfc\xab\xdc\x8f\x35\x67\x7f\xaa\xf0\x00\x24\x1f\x96\x1e\xc8\x9b\xbf\xdc\x62\xd3\xe7\xbb\x99\xa2\x42\xf6\x85\x7d\x68\xed\x35\x1d\xa3\xba\x5e\xcd\x8e\xc4\x04\x3b\xb7\x37\x87\xf8\xbe\xa9\x3e\x01\x40\x51\x1d\x3e\xc0\xf9\xf0\x1d\xb8\x6e\x99\x04\xfa\x2f\x7d\x77\xcc\x4e\x7f\x1b\x78\xac\xd0\x67\x7a\xe6\x0c\xa0\xb9\xe3\x1e\x58\x4f\x29\xe2\x6a\x0c\x90\x3f\x70\x6a\xc9\x8c\x8d\xec\xb9\x9e\x4a\x12\xfe\xc8\x6e\x5c\xa8\xf0\xb2\xbe\x5b\xbf\x9c\xd5\xdd\xcf\x96\x25\x77\x6e\x0d\xd9\x90\x7d\x1f\x5e\x1c\x81\x86\x6e\xae\xcc\x73\xe4\x3d\x7f\x67\xe3\x23\x6d\x47\x46\x9d\x5c\x70\xe9\xa9\x92\xed\x83\xd6\xda\x23\x91\x8a\xd4\x87\xed\x26\xd4\x77\x53\xe2\x00\x32\x00\x1b\xae\xd8\x1f\x4d\x7f\x76\xe0\x84\xc9\x94\xed\xde\xa3\xc3\x3c\x66\x86\x8f\x91\xd2\x80\xfb\x0f\xc6\x79\xbd\x74\xea\x65\xe5\x67\x0f\x1d\x84\x6f\x37\x6d\x48\x7f\xac\x1c\x0d\x3e\xf2\xf1\x60\xc6\xe4\xcf\xd0\xd8\xe7\x4a\x09\x7d\x87\x0e\xd0\xb7\x9e\xce\xdf\xd7\xf0\xe0\xd3\x22\xf7\x17\x1c\x50\x14\x84\x4f\x64\x83\xcc\xde\x9b\x44\xd5\xbd\x68\x6a\x28\x4e\xbc\x5f\x54\x76\xcf\x3b\xad\xc7\x40\x38\x35\x85\xad\xd5\x6d\x86\xf6\xef\xe1\x11\x16\x67\x80\xa4\xc1\x74\xf1\x4e\xb6\x4e\x8e\x60\x06\xd9\xb7\xbc\x97\x9c\xd2\x9f\x9e\x92\x7e\xe3\xb0\x39\x93\x14\xfc\x09\xc8\xfb\x57\xe9\xf9\xcd\x85\x7d\x32\x05\xc8\x77\xb8\x49\xbc\x9f\xb5\x77\x88\xca\xc6\x73\xc0\xf7\xd8\xc5\x93\x6f\x7c\x0d\xce\x52\xe9\x9e\x7d\xc9\x61\xed\x65\x68\xe5\x13\xb3\x57\x7b\x2a\x3d\x1a\x20\x7f\xe0\xf5\x4f\x2c\x9a\x90\x37\x7a\x26\x9c\x42\x4d\x79\xd7\xf0\x8d\xc3\x13\x69\xc1\xde\xaf\x1e\xec\x6f\x1f\x69\x1a\x35\xbb\x6b\x9d\x9c\xad\xdc\xe9\x0c\x90\x48\x58\x67\x50\x9d\x18\xf5\x39\xb6\x61\xc8\xaa\xd9\x77\xef\xe4\x91\xfc\xab\xfe\x01\xc7\x2c\x0f\x0e\x87\x8c\x5f\x0e\xd0\x96\x94\x73\xe7\x3e\x44\x05\x90\x5f\xb0\x35\x62\x9d\x0a\xde\x27\x13\xa3\x97\x62\x2e\x17\xde\xa7\xad\x11\x3b\xd4\xee\xef\x56\x5f\x34\x48\x4e\xd7\x73\x59\xfd\xee\xc8\xc7\x1a\x3f\x80\xcc\xc3\xca\x59\xe9\x1d\xc3\xd1\x9d\x6e\x83\x31\x92\xe6\x6a\x2f\xd9\xbc\x74\x43\x62\xb7\xba\xdd\xae\xd0\x39\x0d\x91\x3f\x70\x9c\x62\xb2\xda\xe8\x85\xbb\xc9\x63\xa1\xf4\x5d\xd5\x87\x7c\x35\x19\x37\x2e\x70\x1b\x1c\xcb\xe7\x32\x9a\x32\x49\x31\x75\xeb\x92\xe2\xe4\xd1\xaf\x6a\x58\xd8\x09\x00\xf2\x05\x2e\x2b\xc7\x86\xc9\x4b\x3a\x19\xae\x94\x8b\x5a\x73\x91\x58\xf2\x24\x3d\xf0\xed\x12\xa1\x0e\xc8\xfb\x7e\xe4\xb1\xaf\xca\xa6\xbc\xd2\xdf\xfb\x00\x59\x82\x7b\x80\x89\xa7\x51\x7e\xf5\xc6\xcd\x33\xc1\x96\xa4\x72\x6f\x6b\xce\x95\x25\x0d\x2e\x4e\xe1\xbc\x32\x2b\x2c\x5b\x9e\x96\x4e\xb1\x07\x4e\x03\x80\x44\xc0\x3d\xc0\x3b\x89\x2f\xc1\xf7\x55\x5f\xb7\x96\xee\xdf\x9c\xbf\x7b\xe1\xe3\xd9\x82\xc8\x77\xa2\xa3\xc5\xf7\x96\x05\x4f\xcb\x8f\x1a\x88\xfc\x70\x07\x48\x2d\x3c\x7c\x9f\x74\x65\x5d\x1d\xb5\x7f\x91\x75\xde\xfd\x28\xf3\xf0\x55\x32\xa1\x9a\x33\x36\xcc\xda\x43\x57\x23\x1a\x91\x54\x97\xf8\xb9\x6b\xce\x00\x89\x87\x79\xcc\xb2\x84\xa3\xeb\xc5\xd4\xb2\x82\xf7\x47\xe2\x48\x05\x5c\x4d\x75\x3a\x1b\x4c\x6f\x53\xf8\x3b\x8f\x52\x05\x98\x45\x72\x33\xb7\xdd\x02\x48\x3e\x2c\xef\x38\xd8\xf5\xdc\x11\xe8\xad\xff\xbc\x70\x71\x2c\x84\xeb\x46\xa5\x98\x8b\x48\xf3\x57\x96\xb9\x9e\x23\x15\x0f\x6f\x93\x5a\x1b\x2e\xa7\x03\xa4\x1a\x3e\x18\xfc\x2e\xd7\x31\x11\x5d\xfb\xad\x5b\x44\x88\xb4\x8f\x6e\x20\x6e\x77\x34\x83\xcf\x2f\xf7\x4a\xd1\x7a\x4a\x83\x30\xf7\xce\x40\x6b\x4e\x67\xa0\xf8\x10\x96\xfa\x99\x98\x05\xdb\xb4\x59\xea\x55\xf3\x66\xf2\x06\xe3\xb9\xdb\xef\x17\x2b\x0c\x0b\x7f\xd0\x4a\xe4\xe8\xa5\x0e\x61\x78\xd6\x44\x02\x90\x30\x78\x97\xc6\xb7\xf8\xd6\xee\x36\xb6\xd3\x3e\xd4\xca\xd4\xf2\xe1\x9a\xd3\xdf\x7b\x92\x4a\x3c\x93\x8f\x0d\x47\x54\x02\xdd\xb6\x64\xb3\x35\x03\x01\x92\x00\xc7\x80\x5c\x61\x18\xa5\x85\xf0\x40\x41\x49\x9c\x0c\xe9\x88\xfb\xf9\xb3\x21\x7b\x3a\xd8\x0a\xe3\x77\x9f\x6e\x2a\xa3\x19\xef\x97\x49\xb6\x02\x00\x71\x86\xf7\xc7\x6c\x88\x10\x6d\x48\x86\xea\xfc\xbd\x9c\x4b\x13\xe7\xc5\xde\x7c\x32\xef\x54\x24\x8d\x18\xc2\x19\x97\xb7\x39\x90\x34\x76\x1f\xe8\x02\x48\x10\xcc\x20\xef\xe7\x89\x5c\x70\xfb\x7b\xce\xfd\xd3\xee\x39\xe3\x2e\x99\x2b\xc9\x06\x65\x75\x82\x4a\x46\xea\x06\x0b\x4a\x29\x97\x90\xc1\xd8\x1f\xd0\x50\xa9\x00\xc7\x6f\xb6\xd4\x0a\xbf\xd2\x27\x16\x59\xdf\x98\xa5\x38\x9a\x8b\xbb\x8d\xee\x8b\xd7\xd3\x68\xe0\x2c\x3c\xd2\xfd\xb6\xf3\x00\x34\x94\x55\x4a\x2e\xcc\xa7\xf4\x80\xe1\xfc\xab\xdd\xb5\x6a\x95\x0d\x4d\xe7\x77\x94\x75\xe5\xd4\x5c\xcc\x6a\xbe\xf4\x32\x72\x91\xa6\xfc\x02\x34\xd4\xb7\xbf\x24\x62\x67\x75\x29\x63\x45\x51\xb6\xcb\xe2\x4d\xab\x93\x6a\x2b\x4f\x28\xb2\x7e\xbc\x15\x8a\x7c\xa1\xdc\xe9\xee\xe2\x96\x03\x00\x52\x05\x87\x8a\x86\x73\xd2\xb3\x2e\x05\xc3\xce\x42\xeb\x59\xc6\x87\x4a\x9f\xd6\xd7\x9f\x68\x1f\x59\x8a\xdd\x8c\x66\xe2\xcd\x6c\xa7\x7c\x53\x5b\x03\x90\x2a\xd8\x7d\x53\x75\x5a\x79\xdf\x2c\xc2\x82\x2e\xfe\x29\xd9\xf3\xa0\xbb\x98\xb6\xec\x84\x4a\xd2\x08\xc3\xa4\xa4\x91\x77\x3c\x47\xb5\xeb\xa1\x37\x00\x20\x09\x30\x7d\x3a\xf0\xdd\xd7\xdd\xc2\x19\x69\xbf\x4f\x9b\x48\x7b\x37\x3b\x8e\xaa\x49\xc4\x49\x9d\xfc\xea\xb5\xf4\x65\xfe\x5e\xfb\x9a\x5b\x2f\xaa\x00\x92\x0e\x07\x62\x83\x1c\xb3\x66\x64\x1b\x73\xee\xdb\xc9\xcf\x2c\x5d\x12\x60\x1f\xfd\xe3\xfd\x2e\x9a\x93\x47\x72\x9f\x27\xd4\x96\x31\x21\x7f\x60\x9f\x94\x69\xfc\x88\x7d\xfa\x4b\x54\xbf\xaa\x74\x34\x41\xd2\x0f\x5c\x09\xe2\xb8\xc5\xd9\x7c\xb0\xc9\xd3\x84\xd7\x35\xbe\xe3\xeb\xfb\x47\xce\x00\x09\x81\x77\x68\xb7\xda\xa5\x92\xc0\x69\x9e\x5c\xd2\xb1\x33\x0e\xed\x1c\xbf\x6b\xf7\x37\x0e\xec\x3a\x5b\xa6\xc9\xaf\x67\xb9\xa3\xe4\xb6\xfb\x55\x75\x80\xbc\x83\x15\xd5\x67\xc5\x0c\x92\x64\x4f\xb2\xc5\xd5\x02\xae\x34\xdb\x47\x3d\xcd\x72\xea\x0c\x67\xf8\x1b\x10\xba\x95\xd0\xc2\x2d\xfa\x5a\x9c\xfd\x23\x40\x8a\x61\xc3\xd3\x7e\xde\x10\x60\xe3\x72\x0d\xdb\x79\xda\x34\xe8\x97\xf3\x4e\xf2\x1d\xbe\x86\x9d\x3b\x73\xf9\x86\x07\x6c\xdc\x16\xbe\x7c\xe2\xa8\xda\x66\xeb\xb0\xdb\x19\xbf\xda\xc7\xda\xe6\x9e\x9e\xdb\x2f\xd5\x35\x92\xb2\x6e\x1e\xcd\x2e\x13\xc8\xea\x2b\x9b\x25\xa4\x44\x3a\xdc\x49\x5e\x7e\x27\xde\x19\x20\x2f\xe1\x3d\xd4\x31\x1b\x45\x76\xb7\xe8\xb0\x36\xe5\xa2\xb7\x7c\xf7\x52\x7f\xed\x3b\x7d\xe6\xa2\x6c\x0b\xa9\xb5\xb8\xbe\x38\xe7\x2e\x2a\xe1\x05\x80\xf8\xc2\x8f\xcf\xa7\xca\x93\x59\x7f\xcf\x3a\x7b\xfa\xb2\x4e\x9f\x68\xa4\x83\x57\xc5\x44\xa0\x93\x5d\x07\xd9\xc4\xe6\xb2\xd9\x85\xe0\xfa\xe3\x57\x01\xd2\x07\x9f\xae\x31\x77\x16\xe6\xb4\xa8\x9f\x77\x9b\xf0\x66\x4b\xa2\xef\x58\x6f\x70\xed\xa6\x49\x3d\x21\xff\xd4\x76\x91\x75\xcf\x5f\x2f\xbb\xe9\x52\xb8\xe5\x79\x7a\xfd\xfe\xad\x83\xe7\x56\x8c\xee\x4f\xee\xa7\x37\x13\x62\x3d\xa1\xc9\x75\x4e\xbb\x89\x69\x57\x73\xe2\x49\x69\xd2\x92\x8f\xea\x00\x20\x39\xf0\x86\x90\x78\xde\x3c\xd7\xc7\x1d\x3e\xfb\x7c\x9d\x26\x4b\x3f\xc0\xd3\xcf\xea\xb1\x6d\x84\x62\xe9\xa5\xd7\x5b\x66\xee\x8f\x5f\x68\x74\x17\x01\x64\x15\xde\x6e\xbe\x93\xaf\x54\x98\x7b\x7c\x7b\x9a\x12\xa2\x77\x96\x27\xae\xf8\xd7\x1b\xde\xee\x0c\x08\xe2\xb7\xee\x49\x3a\x65\xf1\xd0\xdd\x18\xae\x74\xd7\xe3\xb9\xb8\x22\x8a\xfb\xea\x26\x84\xae\xed\xab\x0c\xb4\x75\x7a\x66\x96\x6c\xc4\x9c\x7c\x54\x87\xc6\x42\x61\xf5\xc2\x29\x87\x0d\x1c\x40\xfa\x60\x9f\x4c\x50\x5d\x53\x8e\xe7\x9b\x9c\x91\xa3\x0d\xdf\xb3\x26\x2e\x4a\x75\x85\x92\x35\x31\xf4\xb2\x65\xdc\x08\xeb\x4e\x97\x15\x4d\xc3\x1c\x68\xe8\x93\xe3\xa6\x7f\xf7\xaa\x5e\x7d\xbe\x53\x3d\x6e\xb6\x2c\xf0\x7c\xb8\x81\x30\xcb\x00\x8d\x91\xb4\x84\xab\xf5\xd6\x71\xf0\x0b\x41\x0e\xff\x23\xbb\x51\x24\xc3\x6d\x13\x22\xb4\x4b\xc3\x62\x37\xff\x8d\x47\xf2\x50\xfa\x8b\xc9\x6f\xf0\x80\xfc\x5d\x44\x29\x11\x93\xe1\xe0\x2d\x52\x27\xbe\x00\x8b\xe2\x10\x5e\xf0\x87\x09\xed\xdc\xb1\x98\x0e\x50\xa6\x04\x24\x24\xdb\x6d\x1d\x0e\x6e\xeb\x9e\x79\x5d\xe0\x1b\x9c\x7d\xeb\xf7\xd6\x98\x51\x62\xed\xda\xeb\xa5\x81\x09\x33\xe6\x9c\x83\x62\x77\x65\xd2\xfd\xfb\xae\x0c\xfc\x78\x8b\x03\xc8\x38\x9c\x67\xb2\xc8\xcc\xe5\x93\x8d\x85\xf4\x2f\x1c\xf9\x8a\x3b\x91\xfd\x7b\x7a\xe2\x0d\xff\x87\xde\x26\x37\x46\xa1\x7a\x31\x2e\xbd\xf9\x5f\x86\x38\x80\x34\xc0\x84\x2a\xb3\xeb\x51\xa5\xf0\x45\xd9\x5f\xce\xb3\x1a\x6f\x54\x68\xbf\xfe\x7c\x07\xc8\x41\x5e\x71\x52\x9b\x5f\x9a\x94\xc2\xda\x57\xdc\x5e\x1c\x40\x8a\xe0\x88\x57\x5e\x5f\x78\xed\x71\xad\xd1\x69\x34\x4e\xc4\x2c\x9a\x41\x82\xf7\x75\xcf\xa9\x96\xbd\xcd\x3f\x8f\x86\x38\x0c\x86\x86\xd0\x97\xf6\x48\xfc\x9b\xd9\x04\xff\xe0\xd0\xb6\x0e\xcb\x6e\x02\x60\x1c\x55\x98\xb0\x0c\x27\x00\x1a\xd0\xa3\x52\x2c\xcb\x09\x80\x22\xf4\x7c\x18\x8b\x6b\x12\x00\x03\xff\xeb\xdc\xb1\x28\x27\x50\x3a\xf8\xdf\xbf\x1f\x21\x45\x70\x8a\x2a\x1c\x5e\x19\xab\xe3\x60\x7d\xe7\xe8\x54\x3c\x44\xe7\xb7\x39\xfa\xf8\xb9\x21\xc9\xe7\xf6\x27\x19\x2f\xb5\xbc\x2f\x6a\x18\xb7\x55\xe0\x00\xd2\x0f\x2f\xd9\x0d\xb9\x7c\x67\x4d\xc3\x35\xb1\x7e\xd1\x53\x51\x8d\xf6\x22\x89\x4f\xee\xe4\xb9\xdc\x68\x6a\x09\xf6\xeb\xce\x23\x13\xff\xa1\x15\x8f\x03\x88\x1f\x9c\x91\xc3\x1c\x1f\xb4\x04\xd7\x51\x5f\x1e\x6f\x8d\xaa\x5a\x64\xad\x79\x71\xf7\xa5\x5a\x0e\x97\x76\x61\x36\xf7\xe4\xb7\x05\x25\xe3\x90\x42\x1c\x40\x16\x61\xee\x49\x22\x24\xf0\xf6\x20\x8f\x0f\xe3\x1d\x2f\xfd\xc3\x6f\x7a\x79\xdf\xec\x6c\xc9\x61\xda\xcd\x23\x57\xe8\x17\xa1\xcf\x65\x54\x99\xdb\x28\xf1\x6f\x66\x13\xfd\x89\x4a\x7c\x58\x76\x13\x00\xfd\xe8\x8a\x61\x19\x4e\x00\xf8\xa1\xd2\x35\x96\xe5\x04\xc0\x22\x39\x71\xdb\x63\x91\x7e\xc2\xb6\x17\x24\xbe\x00\x93\xf4\xe3\x5f\x90\x86\x2a\xad\x98\xb4\x1f\x0f\xf8\x8e\x36\xbd\x58\xc4\x9f\x98\x58\xd0\xdc\x88\xc9\xfc\xf1\x80\x48\xb4\x0f\xc7\xe4\xfe\x78\xc0\x2f\xd4\x24\x2c\xf6\x4f\x00\xcc\xef\x5e\x5a\x27\xfb\xc7\x26\x40\x49\x5b\x98\xf4\x15\x0e\x20\x4e\xb0\x48\x99\x73\x4b\x49\x99\x62\xcf\x6c\xe6\xa7\xbb\x63\x37\x45\xee\xb2\x59\x70\xef\x69\xb5\xaf\xe6\x98\xff\xad\x92\xd6\x1a\xf7\xf9\xee\x67\x72\x1c\x40\x96\xe1\xba\x94\x30\xf7\xfb\xca\xe5\x2a\x09\x72\x81\xfd\x15\xc7\xda\xc6\xb3\x74\x6e\x70\x26\x57\x0b\x47\x6a\x9e\x8d\x12\xf7\x66\xe9\x08\xc4\x31\xe1\x00\xf2\x0d\xa6\x1a\x5c\xe7\x77\x8c\xe9\x89\xad\x4e\xea\x9b\xed\x3d\x82\xb3\xe8\x79\xf6\x93\x61\x5a\xa4\x89\x96\x29\x77\x79\x53\xee\x92\xc3\x51\xce\x28\x1c\x40\x5e\xc1\xcf\x3f\xf8\xfc\xc5\x60\x60\x96\x52\x9e\xf2\xb3\xbd\xcc\x5b\x82\x6d\xe7\x4d\x2c\xcd\x2a\xda\x56\x42\x95\x77\x55\x3a\xf3\x3f\x0e\x94\x42\x70\x00\x59\x87\xef\x09\xb6\xd0\x9f\x66\xd7\x7e\x34\x65\x7a\x25\x40\x7c\x02\xa9\xb1\xe2\x3f\x95\xcc\xbc\x36\xc9\xfe\x2b\x91\x43\xb8\xa9\x43\x62\xcc\x59\x75\xdb\xa9\xf0\x78\xae\xdd\xc9\x17\x99\x3e\x07\x57\xd9\x87\x94\x7e\xbb\xa1\xef\xde\x37\x13\xde\x31\x36\x9b\xd4\x74\x42\x4f\xc6\xd7\x5c\xea\xda\x1b\x0e\x1c\x40\x12\xe0\xf1\xb2\x46\x7a\xeb\xa2\x94\x74\xc9\x63\x7f\xe6\x8f\x18\x4f\x8c\x55\x73\xbf\xad\x64\xa0\xe3\x6c\xc9\x6c\x59\x59\xe3\xdb\x3b\x5e\xbc\x29\xf1\x6f\x6e\x24\x2c\x97\x13\x2a\x9a\x62\xf9\x91\x00\x58\x46\x75\x16\x2c\x47\x12\x00\xdf\x50\x0d\x14\xcb\x93\x04\xc0\x2b\xf4\x0d\x58\xae\x24\x00\xd6\x51\x45\x0d\xcb\x97\xc4\xa0\x46\x01\x58\xce\x24\x00\x12\x50\x00\x66\xa3\x8a\x07\x7c\x41\xc5\x25\xcc\x56\x15\x0f\x58\x42\xc5\x25\xcc\x5e\x15\x0f\x88\x40\xbd\x84\xd5\xad\x12\x00\xb5\x28\x00\xb3\x5d\xc5\x03\xe2\xd1\x85\xc3\x6c\x58\x09\x3c\x0a\x3d\x74\xc7\x6a\x59\x09\x80\x6a\x46\x62\x06\xc6\x6c\x5a\xf1\x19\xf8\x21\xf1\x05\x98\x5d\x2b\xfe\x05\x61\xa8\xfc\x8b\xd9\xb7\x12\x16\x1a\x25\x16\x98\x8d\x2b\x1e\xe0\xfc\xbf\x1c\x8f\xd1\xba\x12\x00\x41\x0c\xe8\xe5\x16\xac\x0e\x16\x28\x9f\xae\x26\xa1\x79\x89\x03\xc8\x08\xac\xda\xb0\xd2\xa9\x9e\x56\x74\x8c\xac\x35\x7a\xa0\x75\x21\x89\xff\x83\xa7\xf8\x08\xa3\xfd\xa3\xd0\xb4\x5f\x7f\xa5\x5f\xab\x20\x9f\x42\x78\x00\x40\xea\x60\xee\xe8\x7b\x26\xe8\x21\x65\x54\xe3\x44\x4b\x1d\x2f\x4d\xac\xce\xcc\xe0\xc3\x71\xdd\x3b\xb3\x39\x6a\xdd\xba\x64\x5a\x92\xbd\xf9\xcd\x45\x00\x99\x82\x1b\xbd\xe4\x27\x2b\x92\x77\x4e\x87\x05\xbc\xa3\xf1\x8a\xbe\x74\xf3\xf2\xb9\x3f\xef\x32\x68\x43\x07\x85\xad\x4e\xe6\xed\x3d\x52\x31\x4c\xbe\xb9\x5d\x9b\x61\xcd\x49\x8d\x77\x27\xce\xa2\xa7\xe9\x79\xd7\x62\x51\x9f\xcc\x6d\x8d\xf6\x30\x77\x85\xa6\xc1\x62\x65\x25\xe6\x27\x5f\xbd\x71\x56\xef\x18\x71\x00\xa9\x83\x3b\x1a\x4f\x2a\x73\x72\x87\x05\xff\xa2\x8f\xe9\xfa\x97\xf5\x1e\x6e\xa5\x2b\x34\x45\x25\xa4\x9f\xb6\x5b\xb8\x72\x47\xe5\xf7\xf5\x46\x85\xfa\xed\xb8\x80\xeb\x81\xd3\x4c\x6e\xf8\x93\x40\xe6\x20\x5a\xba\xdc\x06\xf2\x74\xd9\x3b\x9a\xd7\xab\x70\xde\xf4\x54\x1b\xac\xe2\x7c\x7a\x2d\x8d\x9c\x21\x12\xff\xe8\x15\xbc\xfb\x47\xd0\x7a\x86\xe9\x16\x3c\xa0\x0e\xe5\xa6\x58\x8e\x21\x00\xa6\xd0\xad\x8f\xe5\x19\x22\xd3\x41\x6b\x32\x96\x6b\x88\x26\xa1\xc7\x50\x58\xbe\x21\xee\x33\x2a\xb4\xff\xc0\x92\x42\x80\x32\xe0\x23\xa1\xd8\x26\xa7\x69\x30\x39\x4d\x54\x5c\x77\xf4\xcf\x4d\xb3\xd6\xbc\xe2\xb4\x32\xe8\x3f\xf0\xeb\x6e\x22\xae\x68\x71\x58\x7f\xeb\xeb\xef\x07\xca\x8d\x87\xf7\xf7\xe3\x00\xd2\x08\x0b\x74\x93\x91\x26\xb6\xbd\x1c\x11\x4e\x9a\x2b\x97\x7e\xfb\x8e\x8e\x7e\x94\x36\x6d\x33\xf3\xbc\x14\x29\xd5\xb6\x4f\x66\x9e\x93\xfd\x9c\x13\x0e\x20\x1b\x70\xdf\xaa\xc2\xac\x32\xbb\x2a\x68\xd0\x50\xf1\x50\x52\x72\x26\xbf\x3b\x5b\x3d\xf5\x1e\x55\x51\xd7\x27\x06\x65\xe3\x56\x19\xc1\x07\x6f\xdc\x71\x00\x49\x85\x63\x5a\xc3\xea\x89\x99\xac\x60\x6b\xd2\x7e\x7d\xe1\xd1\x21\x8a\xab\xde\xa1\x73\x7a\xef\x5b\x9b\xd8\x58\x45\x36\x92\xc8\x18\x94\x0e\x09\x49\xfc\x9b\xd9\x44\xa2\x86\x92\x53\x2c\xbb\x09\x80\x46\x34\x5b\x63\x19\x4e\x00\x6c\xa0\x69\x02\xcb\x72\x02\x20\x75\x07\xba\x64\x98\x92\x94\x32\x29\x09\x1f\xd5\xf6\x92\xd5\xc0\xd2\xd1\x66\x42\xae\x6c\xf1\x42\xa0\x99\x96\x8e\xf5\xcd\xd6\xa4\xeb\x0a\x11\x16\x06\x45\xe1\x53\x6d\x8c\xd3\xfe\x8b\xa5\x6c\x67\xb9\xb7\x79\xd4\x14\xcc\xf7\x25\x66\x16\x27\x76\x71\xd1\x4e\xcd\xc6\xcf\xed\x59\x3f\x58\xd5\x0f\x6c\x35\xde\xcb\x2b\x15\x5e\xd5\x35\xee\xb4\x15\xbd\x12\x30\xbf\x9d\x4e\xe1\x90\xe8\x74\xd1\xaf\xfa\xfe\xbb\xf2\xc5\x20\xbb\xd8\x9e\x8d\xbc\xe1\xb9\xeb\xf2\x73\x3b\x3d\x5f\xbd\x58\x29\x53\x61\xe7\x2b\x19\x06\xb3\xdb\x35\x0a\x6e\x19\x55\xed\x92\xb3\xae\x69\x89\xbd\xe0\x4e\x8b\xd8\x38\xee\x38\xe2\x45\x41\x3a\x95\x41\x7e\xad\x85\xe3\xe7\xab\x8c\xf5\x2f\x92\x79\x0f\x25\xfe\xcd\x6c\x82\x7f\x6a\xd0\x63\x37\x2c\xbb\x89\xdb\x12\xa5\xca\x58\x86\x13\x6b\x07\x1a\x14\x58\x96\x13\x2b\x32\xda\x32\x62\x8a\x82\x78\x40\x15\x5a\x91\x31\x65\x41\x02\x00\xad\x4e\x98\xba\x20\xa1\x9c\xa1\x5e\xc2\x52\x06\x09\x80\x74\x6a\xb4\x8b\xc5\x12\x08\x81\x32\x05\xc9\x69\x0a\x67\x1c\x40\x26\xe1\xb6\xf4\xaf\xf6\x82\xc0\xf2\xce\x70\x01\xab\x1e\x4e\xef\x65\xc9\x29\x7d\x7d\xe1\x90\xf9\xc9\x33\x27\x48\x0c\x3f\xc8\x58\xea\xbc\x25\x57\x05\x00\x29\x83\x77\xfe\x4e\x5c\x79\xfb\xaa\xfa\x4e\xcd\xcb\xaa\xd9\x99\x72\xbc\x87\x6f\x54\xe2\x42\x33\x2c\x4d\x12\x4c\x0d\xcc\x06\xe9\xa7\x79\x1d\xe5\x00\x32\x0a\x9f\x70\x65\x27\xce\x33\x97\x1e\xd2\xa3\x9d\xa2\xb5\xa3\xcd\xbc\xf2\x26\xeb\xbc\x9b\xb7\x7d\xa6\xe0\xcb\x98\xc8\xc7\x0d\x8b\x4f\xc4\x33\x2a\x71\x00\x89\x81\xab\xd9\xaf\xc5\x1b\x05\x82\x81\x23\x9c\x32\x43\xc9\x8e\xef\xb4\x24\x1f\x3a\xc6\x31\x75\x68\x02\x99\x64\x7d\x2e\x41\x89\x03\x42\x7f\xc2\x24\xfe\xd1\x6a\xbc\x7b\x26\xd1\xa6\x14\xd3\x6c\x3c\xa0\x0c\xdd\xf7\x58\x86\x13\x00\xa3\xa8\x78\x85\x65\x39\x01\x10\x83\x96\x1b\x4c\x85\x16\x0f\x08\x41\x01\x98\x1a\x2d\x1e\xf0\x0e\x6d\xac\xb1\x54\x5a\x02\xa0\x18\x25\x8e\x58\x32\x2d\x91\x13\xa1\x1b\x01\x53\xa7\xc5\x03\x5e\xa2\x7b\x13\x53\xa9\xc5\x03\x7c\xd1\x37\x60\x69\xb5\x04\x40\xdf\xff\x2e\xdb\x60\x4a\xb6\xca\x7c\x4e\x14\xa4\xdb\xf9\x37\x00\xce\xbf\x0f\x5e\xbe\xb7\x97\x6f\x77\x17\xaa\xec\x9d\xbb\xba\xab\xc5\xdf\xf0\x25\xfd\x07\x11\x26\x41\x43\xdd\xdc\x12\x7a\x7a\x9d\x7e\x9e\x16\x1c\x40\x7a\x60\x1e\x35\xf4\x25\x3f\x41\x4e\xb7\xcf\xfb\x49\xda\x5d\xb9\x04\xd2\xb3\xd7\xdd\x8f\xd2\x9f\xf8\xb3\x2b\xbf\xe2\xdc\x79\xb6\x1c\xf5\xae\xec\xe8\xed\xf0\x83\x4b\x6c\xc9\x83\x8d\xb9\xf4\x4a\xc1\x46\xf1\x57\x87\x29\x8b\xd5\x19\x9f\xfb\x7d\xde\x21\x15\x6e\x8b\x5b\xbd\xc1\xff\x91\xe4\xcf\x46\xea\x76\xbe\x4e\x82\x37\x1a\x85\x1f\xb5\x51\xe1\x1f\x41\xa7\xfb\x29\x05\x01\xf5\xcc\xd1\x3b\xa2\xd4\x2b\x8a\x6d\x92\x7a\xc6\xbf\x58\x1d\xfb\xed\x70\x45\x91\x51\xe2\xdf\xcc\x26\xf8\x27\x00\xcd\x2c\x58\x76\x13\x00\x3d\x28\xcb\xc1\x32\x9c\xb8\xd7\xd0\x1a\x8b\x65\x39\x01\x90\x84\xee\x35\x4c\xd1\x1c\x0f\xc8\x41\x79\x14\x96\x6c\x4e\x00\xac\x52\xa2\xd9\x11\x4b\x3d\x07\x4a\x91\x4e\xff\xdd\xce\x71\x86\x63\x22\x37\x21\xfe\xd3\x82\xcd\xf9\xa0\xfd\x0a\x8f\x5d\x6d\xf5\x3d\x97\xd2\xf6\xd4\x68\xed\xd8\xd9\x68\xa6\xb1\x92\x2c\xa7\x5a\x2e\x3a\xb4\xbd\xdb\xe0\x35\xb6\x8f\x6a\xdb\xf1\xfa\x7e\x6b\x0d\x93\x52\xf6\xb5\x86\xa8\xa1\xb7\xfa\x07\x0b\xb3\x06\x77\x0b\x93\x1d\x0d\x2f\x39\x48\x9e\xc0\xb3\x1d\x13\x0b\x70\x0c\x71\x18\x3d\xaf\x6a\xf9\x20\xad\xc7\x77\x59\xca\xcc\xf7\x04\xbf\xf0\x54\x75\x83\xd1\xa3\x5d\x0d\x74\xcf\x7f\xe7\xcf\x06\x14\xd2\x45\xe2\x00\x12\x0d\x27\x6b\xae\xfe\x18\x36\xdf\xcd\xa0\xa8\x70\xf1\x71\x8d\xa3\x52\x37\x44\x8c\x1a\x05\xb3\xdd\x2e\x04\xdf\xed\x1b\xf8\x6e\xe7\xf9\x99\xe4\x90\xc4\xbf\x99\x4d\xec\x85\xfe\x77\x9f\x15\xc3\x6e\x62\x66\x41\x97\x18\xcb\x70\x02\x60\x01\x0d\x22\x2c\xcb\x09\x80\x68\x34\x61\x63\x1d\x5f\x10\xf7\x3d\x05\xba\xef\xb1\x4e\x31\xb6\x79\x17\x05\xff\xf6\x1a\x97\xc0\xfa\xd2\x05\x92\xcf\x06\xb4\x8f\xef\x89\xfc\x2c\x4d\xed\xb1\x32\x32\xfd\xe6\xd7\xc1\x1f\x20\xd1\x46\x96\xaa\x29\xf3\xd4\xe7\xc3\xdf\x9a\x7c\x1c\x40\xc2\x61\xa9\x9e\x33\x12\xb0\xbb\x9f\xef\x99\xf5\xdc\x79\x67\x89\xdf\x4c\x46\x41\xf5\x33\x2d\x5d\xc4\x80\x63\x5e\x8d\x87\x0d\x3f\xb5\x89\x73\x38\x0e\x20\xf3\xf0\x81\x2d\x55\xcf\x42\xae\x47\x08\x29\xed\x95\xc7\x38\x9a\x01\x96\xf7\xbf\x4c\xe9\xb2\xa6\x44\x1b\x6c\x9e\x28\x59\xcf\x3d\x67\xb0\xba\x6a\x81\x03\x48\x27\xac\x17\x25\xfc\x7c\x96\x7e\xb6\xe3\x75\xac\xb5\x65\x63\x9a\xb8\x70\x31\x2d\x5b\x9d\x7c\x86\x8a\x6a\x5d\x21\xc5\xcc\xc9\xf7\x5b\x31\xfb\x4e\x4b\xfc\x9b\xd9\x04\xff\x94\xa0\xb9\x1d\xcb\x6e\x02\x20\x1c\xe5\x2c\x58\x86\x13\x05\x44\xb4\x67\xc7\xb2\x9c\x00\xe8\x24\x5d\xaa\x23\x7c\x5d\x1f\xeb\xf3\x5b\x40\x79\x6d\x6b\x6b\x2b\x78\x2f\x00\x08\x0e\xde\x97\x3f\x0b\xa2\xb8\x43\xc6\xe2\x2d\x82\x96\x99\xd3\xf4\xba\xa9\x5a\x55\x2c\x8e\xbc\x67\x72\x78\xd7\x70\xf3\x8d\x26\x45\x6a\xaa\x40\x12\x40\xc2\x60\x29\xfd\x6d\x5b\xef\xad\x69\xef\xca\x77\x72\x7c\x71\xca\x5f\x2e\x1d\x48\x08\xd5\xd6\x70\x75\xaf\x60\xb9\xb8\x47\xe1\xaf\x6b\x38\xe3\xe8\x90\x33\x40\x5c\xe1\x25\xbb\xe1\xb0\xf9\xf7\x6f\x1c\x45\xc9\xc2\xfb\xfb\xa9\x72\x7c\xdd\xf5\x71\xbf\x3b\xb2\x84\xaf\xcb\xdf\x0d\xbb\x7a\xd5\x42\x8e\xfd\xc3\x28\x40\x52\xe1\x08\xb2\x32\xbb\xec\xd3\xba\x9f\x42\xea\xa3\x80\x0d\x87\x04\x7b\xf3\xf1\x4f\x03\x8e\x1a\xd9\x3b\xf8\xa2\xd5\x67\x96\x1e\x26\x0f\xee\xce\x00\x48\x16\x6c\x8d\x6d\x57\x2e\xab\x8b\x6a\x4d\x15\x62\xf0\x57\xd9\xf4\x47\x7b\x68\x4a\x79\x19\x35\x87\x43\xfa\xe3\x73\xf5\x17\x02\x82\xd5\x5d\xe1\x6f\x60\x88\x5d\x29\x74\x00\x83\x39\x92\x54\x4c\xbf\x6f\x07\x67\x7d\xdc\xbb\xe3\x6d\xdf\xa6\x8f\xf2\x61\x32\x56\xff\x85\x37\xfc\xd4\xe1\xa1\x00\x20\x95\x70\xef\x9d\x7a\x27\x49\x8e\x51\xd1\xb8\x7f\x6e\xc9\xd2\xfb\x5b\x8f\xc3\xd9\x84\xec\x8f\x91\x29\xae\x4f\x1e\x5a\x38\x1f\xab\xbe\xbd\x6b\x8f\x02\x40\x7e\xc3\x96\xd8\x99\xb6\x0b\x66\xb8\x79\x17\xaf\xd7\x74\x07\x1b\x86\xc5\x17\xf5\xdc\x56\xc8\x6c\xa8\x48\x44\x3c\xd5\x3c\x25\x27\xef\xc8\xeb\xe0\x00\xe2\x0f\x4b\x01\xfa\xd5\xd3\x49\x8e\xce\x1a\xad\x05\x56\xfb\x93\x8c\x71\x45\x26\x8d\xbb\xbd\x2e\x45\xa6\x9e\x8a\xb4\xd4\x1e\x8a\x72\x9f\xd5\xbd\x0a\x0d\xd5\x62\xbe\xd5\x52\xf2\xd0\x59\xd1\xa2\x64\x84\xdb\x4f\xff\xd8\x73\x36\x2e\x45\xb6\x65\x83\x1f\xde\xb6\x4f\x93\x71\x0b\x02\xe7\x34\x00\x40\x32\x60\xd5\x76\x51\x1c\xb4\xc7\x3f\xa9\xdd\xd8\x64\x01\xf7\x2e\xf2\x3a\x24\x17\xc6\x2b\x09\x1f\xcf\x2e\x1e\xe2\x96\xf1\x5d\xe1\xba\x3e\xa2\x03\x90\x66\xd8\x92\x68\xe3\x5a\x41\x1d\xdd\x36\xd3\xcb\x9d\xa6\xe2\xb2\x13\xa1\xab\x0a\xa7\x0f\x8a\xbc\x4d\x5e\x2e\x7d\xf8\xc1\xf1\x1e\x7f\x8f\x58\x1e\x00\x48\x24\x4c\x43\x15\xd2\x8f\xe0\x8c\x8f\x3e\xe4\x8e\x55\xb9\xf4\x78\x70\x5e\x96\x7a\x4f\xe2\x19\xbb\x73\xaf\x1b\xa3\x9d\x83\x99\x7e\xb3\x18\xc7\x9d\x03\xc8\x2c\xcc\x42\x11\xbf\x4a\x19\xb7\x80\x62\x21\xdd\x83\xbd\x54\x24\xa7\xde\x28\xe7\x66\xc6\xfe\x39\xe8\x7d\x5c\x4a\x92\x8a\xee\xbb\x9b\xea\x37\x0f\x67\x80\xc4\xc3\x79\x5c\xe7\x74\x51\x70\x17\x89\x23\xcf\xc1\xd6\xbb\x27\x66\x55\xef\x44\xc5\x27\x76\xc4\xa5\xd7\xd5\xb6\xe4\x29\x5d\x13\xcf\x4c\x08\x69\x01\x48\x22\xfc\x78\xa9\x84\x4f\x9a\xfb\x78\xc6\xe9\xb7\x12\xe9\x9b\x52\x55\x1a\x8e\x0c\xdf\x5a\x4f\x65\xf4\x78\xad\xae\x9f\x98\x22\xef\xa5\x56\x79\x05\x20\xc3\x70\xc6\xb1\xe2\x3e\x58\x63\x65\xe9\x68\xf1\xaa\xb2\xfb\xb0\x4b\xf0\x4e\x97\xe1\x56\xe1\x18\x36\x23\xb3\xbf\x17\xfd\x86\x6b\x03\x8a\xa2\xa2\x9c\x01\xf2\x01\x66\x0e\xfd\x63\x79\x5f\x8a\xe9\xdf\x2f\x3c\x09\x91\x76\x57\xdf\xe7\xf0\x2a\x4c\x55\xb8\xd2\xe0\xb2\x83\x7e\x68\xe6\x4e\xef\xe7\x0d\x1c\xd4\x00\x69\x83\x83\xa6\xb1\x00\x08\xd2\x4c\xbb\x9a\xb5\xe9\x2d\xae\xa6\x09\x5c\xfc\xec\xba\x9c\x42\x5a\xdf\x99\xe1\x94\x90\xbb\x14\x98\xb3\xdf\xba\x16\x20\x5d\x70\x7e\x6a\x9c\x70\xd8\xa0\xb8\xb9\x72\xcb\x60\x44\x5d\x4b\x0d\x84\x57\x66\xe6\xad\x80\x16\x0a\x9d\x30\xbb\xeb\xdc\x2f\x04\x5e\x7e\x30\x80\x86\x7a\xb4\x1f\x70\x3a\xf0\x97\xfb\xdd\xd0\xc1\xc6\x02\xbe\xdb\x56\x02\xc2\xe7\x6f\x71\x79\xd7\x76\x8b\x76\xba\x65\xcd\x49\xe6\x48\xc1\x43\x6f\x2c\x3f\x3e\xc3\x2d\x15\x53\xb5\xe7\xbc\xc2\x7a\x42\xad\x8f\x4f\xe3\x4a\x42\xc6\xd9\xe3\xef\x6a\x6e\x1d\xde\x1b\xbc\xfa\xfb\x4d\x3e\x34\x74\x6d\x5f\xdb\xee\xc3\x12\x40\x7b\x25\x27\xc5\xbc\x90\x44\x9e\x9f\xc7\x5e\xe5\xb2\x19\x93\x99\x82\x91\xd2\xd1\x34\xbf\xfc\xd2\xa7\x00\x20\x73\xb0\xb7\xe3\x06\xc0\xce\x67\x51\x01\x8b\x11\x34\xdd\x47\x3f\x2d\xb4\xb8\xcc\xdd\x9e\x7b\x75\xa0\x5d\x96\xba\x97\x76\x9f\x8d\xcf\xe1\x93\x03\x00\xf9\x0b\xaf\xe5\x89\x93\x96\xd1\xeb\x3a\xc9\x33\xa4\x14\xda\xba\xa7\xa9\x6b\x5f\x5f\x51\x1c\xb5\xf0\x58\xe1\x5c\x2b\x13\x10\x21\xd3\x62\xb9\x38\xed\x0c\x90\x10\xd8\x1f\x4d\x29\x01\xce\xba\x3c\x9d\x7d\x12\x14\x4a\xc7\x9c\xed\x8b\xa7\x34\x24\xd3\x8b\xde\x67\xf2\x5a\xcc\x99\x5e\xba\xe8\x9e\xf3\xda\x14\x20\x65\x70\x6e\x41\xc2\x4a\xf7\xdb\x57\x2f\x1e\x39\x79\x73\x71\x97\x84\xfb\x53\x8d\xfb\xf5\x21\x22\x6d\x05\xdf\x5f\xd3\xc4\x30\x59\xec\x64\x6f\xb9\x00\x90\x99\xff\xf7\xeb\x89\x17\x0e\x1b\xd3\xd9\x48\x44\xb7\x9c\x12\xed\x42\xaa\xf1\xb5\xc4\x18\x85\xfe\x83\x64\xb7\x3f\x3b\x3c\x54\x7a\x45\x36\xbc\x72\xd9\x19\x20\x9f\xe0\x40\xef\xf4\x49\x58\x56\xac\x18\xb6\x32\xb5\xb6\x6f\xa8\x16\xe1\x7b\xb2\xc4\x73\xb8\xf2\x62\xe9\x1e\xb7\x0a\xe3\xb1\xa1\x70\x91\xfc\x35\x80\xb4\xc1\x84\xc2\x66\x81\x7e\xd1\xd3\xf3\x63\x34\x2f\x3b\xa3\x80\xaf\xd6\x09\x9a\x1e\x6f\x7e\x97\x66\xc6\x55\x32\x07\x26\x1c\x6f\xcd\x2c\xa3\x3c\x40\x16\xe0\x9b\x50\x56\x39\xae\xed\x21\x91\xa3\x83\x4a\xa5\x09\x02\x5c\xa3\x4e\xa1\x92\xe7\x0e\x4d\x9e\x8f\xac\x79\x7e\xd9\x50\xd7\x94\xe5\x66\x1c\xfc\x65\x45\xd2\x90\xc1\xc2\xe5\xbf\xf7\xed\x63\x35\xc5\x68\x1b\x0b\xee\xeb\x1f\xfb\x39\x43\xad\xf8\xe1\xee\x05\xad\x7b\xf5\xbd\x27\xb2\x13\x98\x00\x40\x82\xe0\x24\x7a\xcd\x77\xb4\x8e\x6b\x31\xf5\x7b\x6a\x9d\xeb\x2e\xb2\xf5\xee\x57\x23\x65\x1c\x62\x67\xa2\x3f\xf9\x1a\x35\x5f\xd6\xe3\x54\x36\xb6\x07\x48\x13\x9c\x2f\x52\x7e\x9f\x08\xde\xb8\xc0\xa5\xa7\xf3\x29\xce\xdf\xbe\x22\xfe\xa8\xbc\xf2\xa8\x69\x5f\x97\xcf\xaf\x2a\x81\x83\xd2\x54\xaf\x27\x44\x00\x50\xb4\x86\x86\x33\xec\xa6\xea\xd4\xa1\x9a\x51\xf5\x74\xaa\xa8\xa1\xe7\x97\x73\xfd\xcd\xeb\xf6\xa5\x63\x7f\x4c\x6e\x44\xaa\xd6\x4e\xed\xb2\xae\x40\x80\x54\xc3\x31\xa0\x31\xf8\x64\xcc\x30\x2e\xa9\xec\x80\x24\xad\xf4\xf5\xad\xf7\x87\x43\x73\xae\x59\x92\x93\x65\x17\xcf\xa8\x5e\x4a\x25\x57\xb4\x3e\xbd\xdd\x29\xc2\xda\x0a\x7d\x8f\xea\xe5\xf9\x9b\x1e\xc7\x3d\x6f\xb9\xe2\x54\xeb\x86\xb4\x92\x2f\x28\x70\x89\xc6\x1e\x52\xbc\x7d\xa7\x4f\xec\x59\xee\x6e\x78\xb7\x6d\xfc\xa1\xed\x11\x12\xe4\x6a\xfa\xfe\x38\xe1\xe6\xbe\xab\xc3\xae\x05\x66\xcf\xe2\xa8\xb7\xfc\x33\x6d\xfc\x28\xc6\xa6\xaa\x7e\x65\xc3\x17\xc9\x6e\x96\x97\x1d\x12\x7d\x64\xba\x75\x25\x7e\x24\x91\x49\xe5\x66\xef\xed\x0f\x32\xb6\xb7\x32\x9f\x6c\x45\x77\xdf\x9e\xdb\xba\xbb\x09\x37\x23\xd2\x8c\x27\x78\x2e\x99\x1a\xee\xd3\x2a\x1c\x72\x37\x63\xae\x3e\x1c\xef\x95\x92\xfa\x93\x8e\xef\x47\x61\x28\xdb\x3b\xfb\xd3\x86\xd0\xd0\x50\xd9\xa9\x98\xc7\xfb\xf3\xdf\x8f\xcc\xe8\x08\xdb\x1e\xe6\x72\x2e\x10\xf8\x7d\xed\x05\x75\xbd\xda\xfb\x45\x8e\x4a\x96\xca\x97\x93\x38\x80\xc4\xc2\x9e\xa6\xd9\x72\xed\x61\xcc\x37\x18\x78\x51\x35\xa6\xb0\xf7\x98\x72\xd0\xc8\xf3\x23\x1a\x23\x2d\x21\x62\xc9\xcb\xe7\x44\x5d\x6f\x6f\x25\x40\x43\x9d\x77\x0f\xff\x7d\x14\xc5\xef\xe8\xe7\x68\x9a\xfa\x2a\xa4\x35\x53\xed\x5e\xb8\x6a\xda\x43\xb6\xb6\x8a\xd1\xad\xc3\x9a\x3b\xa3\x38\xa1\xa1\xae\xcc\x13\xfe\xe2\x8b\x7e\x23\xb8\x8f\x67\x8f\x17\x9d\x0e\x2f\x09\x93\x56\x98\xe1\x74\x72\x49\x1c\x5e\x09\x0a\xcb\xfb\x4e\x2a\xe1\x0c\x90\x2f\xb0\x80\x28\xec\xc4\x49\xb6\xc2\x2f\xdc\x7c\x6c\xe6\x8c\xc3\x99\x36\xef\xcf\x0e\xe2\x5c\xe5\x3f\x35\x0e\x7c\x0a\xb3\x91\xbe\xfa\xe4\x63\x3d\x29\x40\xbe\xc2\x29\x53\x38\x32\x4d\xc5\xc8\xf3\x0b\x90\xd1\x69\x7f\xa3\xe0\xad\xa5\x16\x19\xb0\x74\x99\xc6\x41\xe8\xe5\xdf\x79\x8b\x5a\xf0\x20\xd1\x1c\x20\xb3\xb0\x96\xf6\xcb\xfa\x94\x8c\x57\xed\x0e\xf6\x4f\xa3\x2d\xe9\x53\x1a\x5e\x52\x83\x61\x67\xd8\x1d\xdc\x15\x54\xfe\x90\xd4\xbe\x9b\xe2\xd5\xb5\x01\x00\xc9\x82\xf9\x87\x20\xeb\x8f\x15\xa7\xb0\x7d\x96\xd9\x86\xe1\xae\x06\x43\xef\xbf\x5f\xbf\x78\xd3\x73\x8c\x4e\xd6\x4c\x60\xe0\xb8\x8f\xc8\x66\xaf\x20\x40\xbe\xc2\x09\x99\xe5\x12\x7d\xa0\xa0\xd0\xa9\xaf\xa6\x21\xa2\xe9\x34\x81\x5a\xfb\x4d\xf8\xd9\xe6\x17\xab\x9a\xde\xdd\x71\xb7\x79\xa9\x7e\xc9\xa3\x0c\x00\x24\x18\x3e\x31\x88\x52\x5b\x95\xf6\xdd\xf0\x33\x8d\x2a\x9f\x54\x20\x1f\x2b\x6b\xcf\xf0\x54\x7f\xf9\xb4\x34\x9a\xcf\x4b\x47\xd3\x76\x25\xf6\xd1\x0a\x40\xde\xc1\xd6\x4b\xb3\x16\xbb\xaa\x1d\x9f\xb8\x36\x95\x2b\x29\xf0\x44\xd1\xce\xaf\x42\xe6\x89\xf6\x03\x0b\xd7\xf8\x0b\xb4\x37\x23\x5b\xde\xa5\xc9\x02\x80\xf8\xc2\xbf\xb6\x15\x1f\x0b\x75\x39\x6c\x4a\xcb\x7e\x48\x49\x45\xbc\x21\x49\x92\x63\xf9\x9e\xd7\x47\xe1\xa3\xf4\xd7\x3c\x38\xbf\x26\xcb\x0d\x9a\x14\x02\x64\x0c\x4e\x29\xb7\x19\x0c\xdd\x32\x3b\x6b\x4d\x53\x1a\xd2\x36\x12\xd4\xcf\x8a\xa7\xb2\xdf\x63\x8c\xbc\x21\x53\xce\xdb\x95\x90\x90\x4e\xdf\xc8\x23\xf1\x8f\x9c\x4c\x91\xe2\xbf\xbb\x23\x68\xd3\x81\xc5\xca\x08\x80\x30\x54\xce\xc0\xa4\x65\x78\x80\x2b\x4a\x48\x31\x89\x19\x1e\x90\x8a\x72\x64\x2c\x6a\x46\x00\x64\xfd\xef\x47\xf0\x98\x0c\x4d\x99\x92\x94\xec\xbf\x8f\xdf\x34\xc1\x69\xbd\xdc\xea\xa7\xf6\xa1\xec\x0b\xf2\x73\xef\x85\xee\x14\x34\xf2\xd1\xd9\x2b\xb8\xb6\xd5\x58\x7d\x8a\x11\xf3\xbd\xb8\xfe\x2a\xa2\x2e\x13\x07\x10\x1f\x98\xa9\x3d\x9a\x8e\xe3\x1c\x4e\x48\x31\x8e\x95\x4c\xa5\xba\xaa\x66\xfe\xe8\xac\xfc\xa3\x13\x75\xa7\x9b\x02\xae\x14\xd5\x38\x3e\x59\x73\x70\xc0\x01\xc4\x0f\x4e\x60\x79\x97\x4f\xbe\x4f\x57\xa7\xe7\x25\xad\xfe\xe1\xdb\x29\xbb\x71\xe2\x8e\xfb\x6a\x14\x33\x95\x32\xfd\xc0\x78\x52\x4a\xe2\x29\xdd\xbb\x38\x80\x8c\xc1\x75\x60\x7e\x52\x69\xfa\xc9\x69\x6f\xf0\xe1\x96\x43\x6e\xa6\xe3\xbb\xb7\x1c\x2a\x42\xb5\x12\x0f\x7e\xaa\x76\xe3\x86\xef\xb2\xef\xf1\x76\xc7\x01\xa4\xe7\xff\xdd\xff\xf3\x62\x79\x95\x1c\x26\x92\xfe\xae\x9f\xb3\x2c\xb5\x44\xee\x91\xa5\x64\x35\x3b\xb9\x03\x05\xcf\x00\xc9\x74\x21\x85\xa2\xf7\x73\x89\x7f\x9b\x26\xc1\x9f\x4d\x68\x5f\x89\x35\x4f\x02\xc0\x07\x8d\x09\xac\x89\x12\x00\x7e\x68\x23\x8a\x35\x53\x02\x60\x0c\x6d\x44\xb1\xa6\x4a\x00\xf4\xa0\x41\x84\x49\xc2\xf1\x80\x4a\xf4\x24\x1f\x8b\x86\x13\x00\xbf\xd1\x49\x63\xf1\x70\x02\xc0\x9f\x01\x95\x3f\x30\xe9\xb8\x32\x05\x1d\xfe\xb7\x9e\x11\x70\xbd\xdf\xe0\xbf\xfb\xc1\xf9\xc4\x51\xe3\x1d\x53\x6c\x09\xd5\x5d\x9e\x7b\x26\x38\xfa\x1f\xaa\x0e\xa5\x59\xd1\xdf\xaf\xdd\xab\x54\xde\xbe\x89\x03\xc8\x27\x98\x96\x0b\xd4\x5c\xb0\xe7\x44\xae\x16\xf2\x5a\xc7\x3f\x39\xef\xa1\x19\x11\x9e\xd2\xcc\xb6\xd2\x9e\x61\x72\xd9\x3f\xee\x92\xd9\x9d\x89\x26\x00\x90\x46\x38\xab\x07\x85\x20\x7c\x5d\xb7\x37\x39\x0f\xfd\x48\x56\xd0\xb4\xd9\xb1\x97\x29\x64\x2b\x73\x87\xf4\xd7\x6c\xf9\x0f\x0f\x42\xd4\x12\x9d\xe3\x00\x32\x00\x97\xa2\x03\xfc\x4a\x61\x15\xfb\xca\xb9\x18\xc8\x5f\x8e\xfd\xb1\x88\x3e\xa8\x0b\x7e\x65\x96\x3e\xbc\x23\x5b\x2a\xa7\x26\xa1\xef\x7f\xff\x88\xc4\xbf\x59\x4d\x70\x4f\x04\x7a\xfc\x8d\x69\x36\x1e\xf0\x09\xd5\x9f\x30\xed\xc6\x03\x1a\xd1\xb3\x48\x2c\xcb\x09\x80\x01\x54\xf6\xc4\xec\x87\xf0\x80\x0c\x14\x80\xd9\x11\xe1\x01\xcd\xe8\x1c\x30\x5b\x22\x3c\x20\x12\x15\xb8\xb1\x9a\x22\x02\x60\x16\xd5\xab\x31\xbb\x22\x3c\x20\x1e\xdd\x9b\x98\x7d\x11\x1e\x90\x88\xbe\x01\xab\x33\x22\x00\x86\x51\x4d\x03\xb3\x35\xc2\x03\x3e\xa0\xd2\x24\x66\x73\x84\x07\xb4\xa1\x9b\x19\xab\x3d\x22\x00\xba\x48\xd1\xef\x17\x60\x75\x49\x40\x49\x99\xf4\xec\x76\x05\x69\x85\x19\xce\x97\xdb\xf9\x0b\x75\x0b\x4f\x0f\x48\x89\xa7\xbc\x18\xfd\x98\xcf\x49\xb7\x50\x6c\xf2\xb4\x92\x6d\x10\x51\xe8\x73\x95\x63\xce\x2d\xc7\x01\x24\x09\xce\xf0\x63\x97\x92\xf8\xd8\x48\x0e\x71\xc5\x5d\xb2\x39\xde\x15\x7b\xd2\x83\x2e\x65\xf5\x96\xb3\xad\x46\x7f\xab\x40\xfa\xf3\x17\x79\xa9\x8f\xb7\x67\x0d\x53\x1c\x8d\x68\xb2\xf4\xa1\x9f\xf2\xaa\xfd\x01\xbd\x43\xe6\x93\x05\xe4\x0e\x09\x9d\x91\x2b\x46\xa3\x22\xf7\xf6\xf6\x94\xe7\x1c\x4f\x17\xdd\x9e\x03\xdc\xd7\x1c\x92\x18\x5b\x79\xb6\xd5\xa5\x31\xf1\x22\x3d\x81\xab\xe1\xc0\xec\x6d\x92\x18\x29\xea\x8b\x8c\xd6\x24\x4f\x13\x22\x87\xd8\x53\x12\xb6\x93\x30\x3c\x5e\x94\x4b\x9b\xd9\x23\x28\x3b\xdd\xbb\x46\xbe\xfd\x6c\xd9\xcd\x5d\xa6\xcb\x37\x36\x54\xd8\xa8\xc3\x8c\x2e\x64\xf2\xef\xfb\xf0\x5c\x5f\xe2\xdf\xa6\x49\x70\x67\x2b\xba\xc2\x58\xf3\x24\x00\x92\xd0\xfc\x8e\x35\x51\x62\x48\xa0\xbc\x05\x6b\xa6\xc4\x15\x46\x69\x08\xd6\x54\x89\x35\xea\x7f\xb7\x8e\xb1\xba\x61\xa0\x4c\x46\xc6\xf2\xdf\xad\xe3\x3e\xb8\x2a\x4b\x5e\xbb\xf6\xcb\x38\x45\x54\xf8\xbe\xf6\x13\x26\xde\xbc\xd3\x1c\xa2\x94\x34\x59\x23\x23\xe7\x5c\x16\x3b\xf3\x9d\x8f\xb2\x05\x9f\xdf\xde\xff\x70\x3e\xd5\x2d\xfb\x5c\xac\x21\x69\x31\x7d\xff\xe1\x0b\xe7\x91\x4e\xd7\xba\xbb\x01\x0c\xe3\x35\x6c\xe3\x4a\x0c\x5d\xf3\x27\x2c\x45\x4e\xc8\xe1\x00\xb2\x01\xa7\xf7\x87\xbf\xf7\x30\x46\x90\xf1\xad\x0a\x76\xad\x8a\x14\xc8\xa4\x24\x4c\x2a\xb5\xcb\xa8\x16\x85\x7f\x7e\xbf\x7f\xb8\x7d\x71\x75\xee\x0b\x0e\x20\x0b\x30\x73\xf4\xe0\x2a\x3f\x95\x80\x5c\x20\x39\xa0\xd2\xbe\xc0\x7d\xcb\x4a\x8d\x5e\x23\x57\x6b\x7c\x7f\x32\x8f\xa1\xc3\xee\xbd\xf4\xba\x73\x38\x89\x7f\x33\x9b\xe0\x9f\x3e\xb4\xc2\x62\xd9\x4d\xcc\x75\x68\x72\xc4\x32\x9c\x00\xd8\x40\x93\x23\x96\xe5\x04\xc0\x02\x19\xba\x64\x98\xaa\x84\x32\xcd\x65\x92\xff\x4e\x18\xea\xe1\x25\xc8\xd4\x28\x10\xcd\x2b\x37\xac\xa8\x9e\xa7\x10\x2a\xac\x94\xde\xf7\x8e\xa4\x88\x9d\x8c\x44\xbd\x6d\xe8\xf4\xf4\xf5\xe4\x41\x5f\xb7\xed\xf1\xf0\xa9\x7c\x33\xd9\x55\xdc\xdd\x87\x5d\xca\xd5\x07\xe9\x0d\xce\xc9\x02\xf5\xb1\xb8\x04\xb2\xfe\x57\x54\x4b\xf3\xb1\x35\x0a\x65\x15\x11\xae\x38\x80\x24\xc3\x44\x70\x84\xf2\xc5\xc3\x63\x01\x24\x8f\x6c\xdc\x6a\x3c\xcf\xf7\x8c\xc6\x1d\xac\xa6\x25\xcd\x94\x4b\x3e\xf2\x95\xf9\xac\x18\xe9\x8f\xc6\x39\x1c\x40\x6a\xe0\x8a\x3f\xeb\x75\xd9\x7c\xf4\xa5\xcc\xa3\xeb\xae\xec\xd7\x0f\xce\x24\x52\x73\xff\x0c\x8d\xef\xd0\x68\x7a\xa3\x9c\x56\xe3\xfe\x52\x8f\xee\xab\xc4\xbf\x99\x4d\xf0\x4f\xfd\xff\x3e\x1c\x83\x61\x37\x11\x80\x9e\xc9\x63\x19\x4e\x00\x24\xa3\xc5\x03\xcb\x72\x02\xa0\x06\xad\xfa\x98\xba\x10\x1e\x30\x87\x56\x1b\x2c\x65\x88\x00\xf8\x8b\x9a\x84\x29\x0d\xe1\x01\x21\xe8\x6d\x45\x4c\x71\x08\x0f\x28\xfb\xdf\x57\x2a\x30\xe4\x21\x02\x60\x06\x25\xd8\x98\xfa\x10\x81\xea\xa0\x55\x1f\x53\x21\x22\x14\x40\x34\x9f\x62\x69\x44\xc4\xad\xc3\x8a\x92\x53\x4c\xa9\x48\x89\x94\xce\x69\x7b\xe7\xe4\xc3\x3b\x61\x4d\x3e\xe7\x77\xef\x61\xb3\xfc\xec\x49\xa9\xa7\x26\x0e\x37\x2c\x9c\x7a\xb4\xf4\xa5\x1b\x73\x18\x5c\x17\xfb\x9a\x5c\x47\x7e\x6c\x27\xaf\x62\xb8\xe5\x32\x39\xf2\x41\x3c\x25\x22\x60\x27\xbd\x6f\xe9\x25\xd5\xe9\x7d\x83\x83\xa3\xe4\xdd\x29\xf3\x73\x0b\x9c\xe3\xc5\xca\x56\xec\x6e\x12\x38\x80\xfc\xbf\xef\x26\x57\x28\xf9\xf9\x4c\x07\xbf\x4d\x1a\x75\x2d\x3b\x1c\x99\xec\x7e\xab\xe8\xbd\xec\xbc\x73\xc3\xab\x94\x03\xce\x31\x11\x3d\x16\x85\xa7\xb6\xa3\x15\x4e\x8e\x81\xf5\x0e\x97\xce\x1f\xdd\x3d\x72\x33\xf2\xb1\xe5\x70\x96\x79\xa7\x02\xcb\x84\x87\x9a\xd5\x4f\xf7\x68\x4d\xfe\x2f\x9b\x9f\x0f\x3e\x95\xf8\x37\xb3\x09\xee\xc9\x47\x37\x02\x96\xdd\x04\x40\x31\xba\xc4\x58\x86\x13\x00\x4e\x68\x3a\xc5\xb2\x9c\xb8\x37\xd1\xec\x88\xa9\xd5\xe1\x01\x41\xe8\x1b\x30\xd5\x3a\x42\x1f\x48\x41\xbc\x5f\x8a\xa9\xd7\xfd\x07\x50\xb4\x46\x8b\x38\x86\x60\x47\x78\x41\x35\xba\x35\xb1\x14\x3b\xe2\x4e\x63\x44\x3b\x7d\x2c\xe1\x0e\x28\xf3\x09\x3a\x91\x6d\xf3\xb4\x25\x98\xe7\x28\xd2\x8c\xec\x13\x30\x5d\x29\xaa\xfa\xd2\x4f\xa6\x7c\xa9\xea\x75\xac\xd6\x5b\x5f\xa3\x2d\xa5\x11\xce\x9a\x28\x1a\x7e\x81\xdc\x1f\x38\x80\x64\xc2\xfa\xe0\x79\xd1\x05\x77\xf5\xae\x5d\x67\x68\x47\xde\x76\x33\xf7\x7c\xfb\xb0\xa1\x79\x8e\x4b\x2c\xdf\x93\xe3\x9d\x42\x68\xad\xea\xa7\xa1\xb2\x6d\x2a\x02\x8b\x39\x59\xcc\x7c\x39\x46\xdc\xfd\x33\x89\x06\x8f\xaa\xde\x57\x28\xdd\xd8\x95\xdd\x35\x5e\xcb\x97\x3a\xe8\x35\x16\xa7\xf3\x93\x4b\x71\xbb\xd3\x77\x82\x79\xdd\x74\x78\x40\x1a\x6b\x20\x9d\x54\xf8\x2f\x3a\xf3\x9d\xbf\x67\xe4\x33\xd6\x4d\xa5\x93\x66\x0e\xdd\x05\x66\xb2\x8c\xe9\x7b\x8a\x7a\x71\x00\xe9\x85\xb5\x28\x8b\xab\x2b\xad\x7d\x75\xed\x9c\xb2\x8a\xa6\x1d\x79\xfe\x0c\xe7\x8a\x7b\xee\x34\x20\xfc\x8d\x3a\xb9\x7d\x66\xeb\xbc\xed\xdd\x75\x12\xff\x36\x4d\x82\x3f\x97\xd0\xcc\x85\x35\x4f\x02\x20\x13\x25\xd6\x58\x13\x25\xf2\x34\xf4\xdb\x08\x58\x33\x25\xee\x03\x94\xd8\x61\x4d\x95\x00\xe8\xa5\x43\x63\x02\x4b\xa1\x05\xca\x64\x7c\xbb\x49\xb7\x63\x62\x1c\x56\x73\x9e\xb4\x36\x5d\x4c\x75\x58\x6e\xd3\x5b\xf8\x3d\x6d\x7f\x3a\xab\x3c\xaa\xa5\x98\xc2\xfe\x00\x4e\xa4\xb3\x74\x85\xac\xf6\x91\x7e\x16\x0e\x20\x38\xf8\x04\x43\x8e\x62\xd7\x54\xda\xdb\x95\xbd\x3c\xa4\xa0\x38\xb7\xb2\x38\xd4\xbb\x3c\xdf\x30\x7a\x1f\x63\xa0\xeb\xf7\x29\xb6\xf9\xf0\x55\x6d\x1c\x40\x3e\xc3\x45\x7f\xf4\x64\x83\xbe\xc3\xb5\x7b\x43\x9a\x51\x6b\x46\xc2\xc7\xab\x96\xbf\xa4\xdd\x35\x62\x91\xdd\x79\x66\xd7\xd2\xd1\x8f\x0f\x75\xaf\xda\xe0\x00\x12\x07\xeb\x93\xcf\xea\x0d\x27\x6b\xb9\x83\xcf\xf7\x9f\xdb\xeb\x14\xe1\x79\xd7\xda\x84\x94\xf2\x54\x78\x42\xc6\x4b\x12\xf3\xba\x1f\x9b\x5f\x2d\x9d\x70\x00\x49\xf9\x7f\x3f\xa2\x3f\x73\xc2\xfa\x51\x7e\xc8\xf1\xb3\x40\x39\x48\xd9\xe1\xd1\x99\x5b\xb3\x26\x57\x57\x9d\x8c\x2a\x9a\xaa\x6f\x72\x7f\x7d\x6e\x7c\x40\xe2\xdf\xa6\x49\xf0\xe7\x38\xaa\x6b\x60\xcd\x93\x28\x21\xa2\x15\x19\x6b\xa2\x04\xc0\x67\x74\xdb\x63\xcd\x94\x00\x88\x43\xfb\x3f\xac\xa9\x12\x00\x29\x94\x68\x3b\x87\x25\xc5\x03\x65\xd2\xd3\x24\x88\x0b\x00\x48\x3c\x2c\x85\x54\xb5\x5e\x75\x2d\x9f\xdf\x74\xb2\xaa\xad\x3b\x9a\xfe\xcc\xa2\x22\xa9\xd6\x82\xb3\xf5\x95\xfb\x88\xe2\x77\x7b\x52\xcb\x02\x9d\xd7\x00\x59\x80\x43\x62\xd7\xcf\xd2\xf9\xd7\x63\x1c\xea\xd2\x9b\x52\x63\x62\xef\x5b\x4f\xcd\xec\x72\x7a\x16\xbe\xaf\x37\x94\x25\xef\xa6\x42\xf2\xfc\x1e\x53\x1c\x40\x7e\xc3\x54\xfc\xad\x66\x71\x8f\xc3\x97\x6f\x1e\x97\xc7\x75\x98\x8b\xc4\xca\xff\x46\x8b\x96\xe9\xbc\x97\x8d\x94\xd4\x5c\x73\xdf\xa8\x92\xa7\x61\xc3\x01\xe4\x1d\x7c\xa2\x21\xe0\xa7\x78\x8e\x3f\x60\xfc\x5a\x51\x4a\x66\x51\x46\x18\xb5\x6c\xf3\x8c\xd1\x8e\xe0\xdc\x9e\x73\x3b\x32\x85\x7e\xb0\xf7\x65\x15\xe1\x00\x32\x0d\x3f\x5f\xa4\xfd\xc7\xc7\x4f\x05\xb4\xb7\x3a\xa8\x14\xdf\x29\xbf\x5a\xe5\x61\x95\xff\x24\x9b\x62\x7e\xb2\x29\x69\x8c\xc5\xdf\x7d\x52\xe0\xb6\xc4\x3f\xce\x92\x20\x09\xa0\xc2\x09\xd6\x3c\x89\x6c\x02\x0d\x09\xac\x89\x12\xc5\x34\x94\xe0\x60\xcd\x94\x00\x78\x87\x5e\x61\xc3\x9a\x2a\x01\x30\x4d\x86\xfe\xb0\x0a\xeb\xc8\x05\x28\x93\x33\x53\x91\x6c\x73\xf7\x2c\x98\x51\xec\x97\x08\x3a\x78\x2d\xeb\xe4\x55\xad\xdd\xee\x93\xf7\xc4\x77\x8c\x7e\x55\x15\x33\x09\xaf\x26\xf3\x5d\x9a\x7a\x56\xcf\xb0\xa7\xf5\xd8\xf6\x56\x80\xd7\x2c\xbc\x69\x2d\x38\x5e\x5d\xed\x6d\xb0\xb0\x8e\x66\xff\x35\x03\x87\xae\x5b\x61\x6c\x0f\xf4\x70\x45\x19\xf3\x0c\xce\xe4\x15\xfd\x2a\x38\x80\xb8\xc1\xdb\xf8\xa2\xaf\x15\x5f\x45\x47\x6b\xc9\x83\x68\x43\xbd\x47\x92\x9d\xcb\x9b\x8d\x8b\xdd\x37\x37\xf4\xdf\x0e\xda\xbc\xfd\x4e\xc1\x64\x12\xbe\xcd\x2a\xe0\xb4\x95\x3b\xa4\xe4\xf9\xfa\x90\x2e\xe5\xfc\x0a\xaf\xe4\x25\x76\xbf\x9d\x3c\xe9\xae\xe7\x99\x6b\xec\x53\x97\x48\xb3\x4e\xa7\x8d\x1f\x59\xc1\x01\x24\x11\x66\x68\x37\x3e\x69\x0d\x1f\x6f\xcc\x17\xbe\x12\x53\x57\x38\xa4\x77\xfe\x59\x9d\x94\x5a\x88\x49\x68\xf5\xd5\x3e\x13\x79\xed\x0b\xc9\xaf\x6d\x01\x40\x3e\xc1\xa5\xcf\x42\xee\x8c\x1d\x39\xff\xfb\x37\x53\x7c\xe6\xf4\xc9\xd7\x26\xa2\x3f\xc6\x5c\x1c\xdf\xb5\x5e\x5e\xf3\xab\x3b\x45\x69\xcc\xdf\xd5\x07\x20\x89\xb0\x7b\xb6\x9e\x92\x56\xdd\xeb\xe3\xd1\xa9\x52\xea\x10\xb0\x91\x5c\x3c\xff\x92\xcb\xe7\x79\x4c\x89\x0d\x77\xdf\xce\xc7\xfd\xd5\xcd\xca\xc4\x1f\x1a\x60\x79\x91\xa8\xe9\xa3\xec\x06\xcb\x8d\xc4\x2c\x84\x06\x04\x96\x1f\x09\x00\x37\x34\xa9\x60\x39\x92\x48\xe9\xfe\x77\xf2\x81\xe5\x49\x82\x30\x86\x92\x46\x4c\x57\x12\x68\x3e\x5a\x5d\xb1\x9c\x49\x7c\x03\xea\x25\xac\x63\x41\x02\x20\x96\x62\x29\x89\xf0\xd7\x8f\x58\xa7\x83\x40\x19\x57\xc1\xf4\xdf\xef\x0b\xc7\xe1\x65\xd6\xd3\x57\xda\xc7\x30\xaf\xfc\x1e\x0c\x2a\x0a\x0a\xcc\xbd\x39\x27\x76\x8f\x3e\xc2\x2e\xf1\xea\x91\x80\x4f\x93\xb6\x11\x3a\xa5\xf6\x38\x80\x0c\xc1\x3c\x7f\x56\xaf\x3a\xc7\xbe\xae\x20\xf2\x10\xd3\x9b\x21\x96\x93\x4f\x3a\x3d\xcd\xab\xe4\x64\x6c\x05\x46\xab\xb3\x32\x84\xc7\xf7\xcc\xf8\xe1\x00\x32\x01\x77\xe0\x63\x51\x20\xf6\x61\xa2\xd0\x62\xd8\xdb\x92\x72\xc7\x1d\xad\x76\xd9\x4a\x71\x5f\xbb\x82\x6c\xf6\xd3\xbd\xff\x72\xc6\xc6\x7e\x71\x01\x07\x90\x42\x58\x78\xab\x7a\x2f\xb4\xbe\x23\x99\x82\x4c\x72\x47\x96\x46\x6a\xc4\x8a\x6b\x73\xde\xd5\x98\x67\x27\xec\xba\xb7\x3c\x1e\xaf\xe8\xc4\xf2\x9d\xc7\x01\xc4\xeb\xff\x1d\xb1\x27\x74\x4d\x5f\xfe\xbc\x67\x75\x9a\x57\x49\xf7\xef\xa8\xaf\xd4\xce\x0c\x53\xb6\x94\xd2\x2f\xe6\xdf\x3d\xc7\x57\x7d\x84\x9a\x68\xb7\x1b\x40\x78\x97\x4d\xb9\xbd\x1d\xac\x55\x6f\x18\x15\x51\xd5\x88\x60\x6d\xa7\x15\xae\x13\x09\xed\xf0\xc9\x90\x76\xde\x08\x0a\xef\xb4\x3b\xee\x74\x04\x00\x24\x00\xce\xbc\xe4\x69\x0d\x94\x25\xe2\xb1\xdc\xdf\x46\xc7\x76\xb1\x51\x69\xfd\xf0\xd0\x4f\xb0\xac\x13\x4f\xd1\xf6\x5f\x79\x75\xc6\x3c\x82\x8c\x12\x20\xcd\xf0\xe3\x8b\x3d\x07\x5f\x44\xbb\xb3\x7e\x20\x5f\xbf\x11\xe1\x7d\xbf\xe8\x6b\x7b\x49\x7a\xdb\xc5\xf3\x5d\xf7\x83\x68\x8f\xef\x15\x2d\xea\xe0\x92\xf8\x37\xaf\x13\x6b\x37\x1a\x0f\x58\x6e\x27\x00\x86\xd0\x36\x05\xcb\xef\x04\xc0\x04\x2a\x21\x60\x39\x9e\x00\x28\x44\xa5\x40\x2c\xcf\x13\x00\x5e\x68\xeb\x8a\xe9\x7a\x42\xbf\x8e\xee\x4b\x4c\xdf\xe3\x01\x01\x68\xb1\xc1\xf2\x3e\x51\xb9\xa2\x41\x75\x25\xac\x83\x72\xa0\x4c\x0a\x48\xff\x93\x02\xdf\xc3\x6d\x41\x85\x72\xe1\xf1\x83\x4b\xef\x2d\xa8\x0f\xbc\xe6\x69\x4a\x19\xe5\x7f\x31\x7a\x98\xaf\xcf\xa0\xf3\xba\xd6\xa7\xf4\x57\x03\x7d\xc6\x1b\x38\x80\xf8\xc1\xbb\xe0\x46\x5f\xf7\x4e\xf6\xd1\xb4\x90\x17\xf6\x47\x7a\x6b\xd9\x87\xed\xff\x2c\x2b\x7e\xc9\x64\xdf\x77\x03\xc9\xee\xb6\x74\xe0\x1d\xb6\xc4\x01\x64\xf1\xff\x5d\x1d\xfb\xc6\x3a\x13\x78\xf1\xec\x20\x1b\xc3\xb3\xcb\xc6\x3d\xb8\x91\xe9\xbf\x5e\xf2\x11\xfa\x37\x67\x72\x5b\x92\x59\x74\x93\x06\x6e\x6c\xe7\x3b\xb8\x0d\x92\xd9\xfb\x92\x3e\x3b\xa0\xf3\x78\x89\xdd\x8d\x23\x48\xc6\x2d\x43\xa5\x91\xd8\x37\xd4\xb9\xde\x07\x45\x58\x99\x52\x74\xb8\x2d\x8d\x25\xfe\xcd\x6c\x82\x7f\xde\xa3\x24\x1f\xcb\x6e\xa2\xb6\x8a\x46\x11\x96\xe1\x04\xc0\x22\xba\xc6\x58\x96\x13\xb3\x3b\xda\xd9\x60\x5e\x55\xc0\x03\xbe\xa0\x1c\x07\xf3\xb2\x02\x1e\xf0\x15\x0d\x6c\xcc\xeb\x0a\x84\x93\x18\xf4\x27\x34\x98\xf7\x15\x08\x35\x10\x6d\x85\x30\x6f\x2c\x10\x4c\x42\x4b\x1a\xe6\x95\x05\x3c\x20\x18\xfd\x39\x1f\xe6\xa5\x05\x02\xed\x42\xe7\x80\x79\x6b\x01\x0f\xf0\x45\x43\x03\xeb\xde\x02\xf1\xa4\x97\x6c\xe9\x25\x1b\x41\x11\xc4\xf8\x8b\x57\xa0\xec\xb8\xb9\xb5\x15\xcc\xeb\x0c\x10\x77\xb8\xe4\xf8\xcf\xf7\xb9\xb2\x2b\xc5\x47\xf0\x4e\x57\xb7\xc7\xb5\x9e\xaf\xd8\x33\x46\xbd\xc3\xd2\x6a\x65\xcb\x5f\x34\x53\x47\x43\xf1\xeb\x5e\x80\xf4\xc2\x37\xc6\x2a\x1f\x99\x83\x7d\x66\x2e\x37\xc7\xe6\x49\xae\x59\x28\xe4\xec\x9f\xe2\xfa\x5d\xff\xfe\xa3\x1d\xd7\xd2\xce\x79\x96\xe8\x1a\x4a\x2a\x80\x8c\xc3\x09\x5e\x92\x93\x7a\x72\x25\x3f\x3a\x73\x4c\x52\x46\xe5\xee\xd9\xc9\xd4\x27\x9d\x17\xb9\x4a\x87\x2d\xc8\xc7\xd4\x29\xda\xbe\x3f\xa1\x6e\x01\x00\x01\xf0\x75\x90\xe9\x27\x3b\xe2\xf2\xc7\xee\x2c\x5d\x34\xbb\x74\x2c\xc1\xd7\x96\x64\xc9\x32\xc6\x5e\x9d\x4c\xf5\xa1\xaf\xea\x8d\x07\x74\xb2\xe9\xcd\x00\xc9\x81\x75\xae\x0d\xdf\x92\x56\x9e\xf2\xb0\xc2\x91\x89\xe5\x34\x75\x5d\xdb\x03\x73\x03\x12\x62\xb4\x59\x8f\x67\x6e\x57\x3f\xbc\x55\xea\xaf\xad\x0d\x0d\x6d\xff\x26\x44\x62\x12\xa4\xdc\x23\x37\xfc\x54\xfb\x8a\x02\xc8\x16\x28\x3b\xef\xa9\x95\xf0\x37\xfb\xfe\x72\xa1\x97\x60\xa1\xf6\x4e\x67\xa0\x78\x0b\xbe\x03\x9a\x9b\xa5\xfc\x85\xeb\xf7\xe3\x93\xe3\x24\x26\x0a\x47\x55\x48\xbc\x63\x1d\x9b\x3c\x9e\x7f\x4d\xa9\xd6\x7d\xed\xf4\xac\x2a\x45\x09\x20\x85\xb0\xd2\x60\xf4\xfc\xe6\x56\x7d\x2f\x2d\x93\xa0\xab\x9c\xb1\x65\xa7\x60\x1c\xa3\x17\xbb\x2d\xfb\xfe\x33\x7c\xaf\x4f\x73\x7c\x30\xd1\x3e\x24\x00\x90\x1e\xd8\x2d\xe1\xb7\x7e\x87\x0a\xee\x3d\xf8\xe4\xb5\xe5\x47\xd3\x1b\x8f\xa7\xea\x2f\x72\x9e\xff\xca\xbe\xdb\x7d\x4c\xfc\x95\xf1\xeb\xd0\xca\x31\x11\x67\x80\xd4\xc1\xe3\x4f\x4e\xd0\xf7\xfc\x71\x21\x0f\x90\xe2\xda\xe5\xff\xfe\xd3\xb9\xc8\x1b\xd3\x6d\x6b\x65\x0d\x77\xd7\x6a\x02\x63\xb2\xca\x8f\xaa\x9a\x03\xa4\x05\x26\xd3\xcb\xaf\xc2\xfd\x32\xdc\xeb\x6d\xb4\x6c\x1a\xdf\xec\x08\xb0\x51\x49\x75\x1b\x3b\xbf\xea\xe5\x52\x9f\x6e\xb7\xbf\x77\xcf\x95\x8d\x36\x80\x6c\xc1\x5e\x1c\xd0\x2b\x55\xbc\x29\xeb\x33\x37\xc0\x57\x97\xa8\x95\xd3\x5f\xf4\x85\xe1\x06\x5d\x32\xfb\xde\x7b\xa6\x3d\xbe\x2f\x4f\xb5\xc6\xf8\xc0\x4f\x06\xf9\xec\xc3\x9f\x7d\xc5\xe4\x4d\xcf\xbf\x88\x2e\x7b\x72\xfd\xd0\xc1\x8b\xcf\xf7\x3c\xd4\x39\xbe\x9f\x1d\xfc\xb8\x04\x6c\x5a\x9d\x01\xf2\x1a\xb6\x24\x78\xf0\xa2\xf4\x4d\x4f\xd7\x5a\x47\x76\x76\x86\xe0\x1f\x52\xed\xde\x0f\x67\x9f\x3d\x4c\x8c\xb9\xf4\x71\xcb\xee\x56\x89\x66\xa0\x09\x40\x3a\xe1\x79\x76\x8d\xdc\xfc\xb9\x21\xee\x71\x5f\x86\x6b\x4e\x47\xce\xb8\xfd\x29\x8e\xb4\x25\x5a\x8c\x97\xd7\x8b\x5b\xd8\x76\xff\xed\xeb\x9e\xe2\x00\xe9\x83\x87\x7f\x0f\x32\x65\xb1\xb8\xad\xdb\x74\x63\xeb\xf9\xac\x7f\xab\x97\xdd\x2f\x96\x3d\x85\x36\xac\xd5\x7e\x9e\xda\xd6\x6f\xee\xe8\x3c\x22\x03\x00\xf1\x86\x13\x7f\x35\x6e\x24\x38\x47\x3d\xf8\xbc\xb3\xde\xb9\x2b\xba\xaf\xdb\x48\x06\x8e\x07\x99\x52\x3d\x99\x3a\x73\x43\xa0\x2a\x2c\xd0\xbe\x51\x10\x20\xad\xf0\x79\x02\x8b\x75\x40\x90\xd8\x95\xa6\x6b\xb9\x05\x52\xd7\xce\xb0\xb8\x8f\x26\x59\xa8\x0f\xcc\x65\xaf\xf9\xb4\x50\xfa\x4c\xe9\xbd\x3f\xf5\x13\x07\x90\x0a\xf8\xf1\x6a\xbb\xd2\xe5\xa3\x9e\x08\xed\xb8\x9c\x33\xc9\xef\xc2\x73\x5b\xf9\x14\x7f\xb3\xba\xbb\x7f\x58\x68\x06\xc3\x7d\x39\xd7\xe5\xa4\x37\x00\x20\x3e\x70\x8f\x31\xbd\xe3\x73\x42\xe9\x2a\xcb\x2d\x97\x71\x53\x83\x7e\xf2\xc1\x8e\x73\xe5\x8a\xd3\xd7\x22\xde\x2e\x66\xf5\xee\xf9\x9c\xcb\x23\xc2\x04\x90\x04\x78\xf8\x9f\xdf\xe6\x2c\xce\xe5\x12\x37\x8f\x75\x7a\x89\x1f\xd7\x68\x4a\xd2\xe7\x4e\x60\xe2\xef\xbd\x83\xbc\x68\x78\x76\xfc\xf8\xdb\x5b\xde\x00\x20\x5e\x70\xd9\x6a\x4f\x9b\xcb\x28\xbd\x9c\xa2\xb4\x6c\xa8\x84\x53\x38\xe6\xd9\xcc\xde\x9e\xfd\x20\xe4\xc8\x5a\xd2\xbc\x74\xff\xf2\xa6\xdf\x96\x04\x40\x16\xe1\x8e\x2a\x42\xdc\xc5\x43\x5d\x65\xfa\x46\xb5\xf5\x73\xd7\x89\x75\x2b\xfd\x77\x3b\xd7\xce\x96\x47\xd4\x9d\x13\x74\xfa\x71\xd9\x26\xd6\x43\x0a\x00\xa4\x16\x76\x3e\xe5\xab\x54\x32\xfe\x92\x2c\xaf\xbf\x0b\x5f\x1c\xac\x16\xc7\x84\x5c\xab\x7d\x5b\x15\x14\x47\x1a\xcc\x1c\xb6\x92\x12\x84\x68\x4d\x01\xb2\x09\x5b\xff\xf2\xe6\x32\x9f\xc7\xae\x74\x3a\xcb\xd5\xde\x70\xb7\xee\x4a\x26\x46\x1a\xfb\xbb\x1e\x26\x7b\x55\xcd\xcf\xe4\xad\x26\xe9\x8f\xac\x38\x03\x45\x4b\x68\xf8\xee\xbf\x2e\xd5\x4b\x94\x92\x2b\x06\xb6\x7f\xad\xbf\x9f\xde\xdd\xbd\xae\x2e\x21\xa8\x35\x9d\xd0\x6f\xe9\x92\x1a\xde\x7d\xe9\xa5\x22\x40\x42\x60\xca\x70\x6b\x20\x76\x37\xeb\x42\xd3\xf3\x42\x1a\xde\xdd\xcf\x6d\xf9\x0d\x15\x38\x7e\x75\x15\x7d\x3b\x9b\xeb\xff\x4d\x2b\xca\xb8\x71\xc8\x15\x20\xd1\xb0\xed\xa6\x41\xca\x97\xb3\xcd\x38\xb9\x3f\x87\xae\xe7\x78\xd3\x4d\x46\x93\x97\x6b\xdf\x79\xa0\x7b\xfc\xc7\xe1\x35\xc5\x33\xa4\x77\xce\x8c\x42\x43\xa9\x02\x6b\x3c\xa4\x9d\x8c\xae\x74\x99\xd3\x19\xb0\xcd\x7d\xd5\x68\x15\x5f\xf7\xa8\xfc\x39\x73\x9d\x77\xff\x14\x9f\xfa\x59\x8d\x67\xce\x00\x71\x83\xe7\x79\x94\x62\x42\x98\xb9\x67\xf4\xce\xf3\x4e\xae\x85\x68\xce\x84\x80\x72\x9b\x17\x7f\xb9\x1f\x86\xd3\x76\xc8\x7b\xdc\x63\x6e\xb6\x15\x07\xc8\x00\xdc\x37\x96\x9a\xdc\xdc\x4a\x3f\x5c\xe0\x53\xf4\xf4\x63\xc8\xb3\xbd\x64\xd2\xd3\xac\xde\x12\x3a\xcc\x12\x74\xf4\xd2\x32\x59\x56\x7f\x2b\x02\x01\xb2\x04\x6f\xd5\x45\x4b\x06\xa9\xc0\xd6\x39\xa9\x23\x2f\xe8\xd3\xcf\x69\xa8\xef\xe1\x1c\xab\xdc\x97\xc8\xcb\x5b\xb0\xf7\x2f\xa7\x8c\xea\x93\x95\x09\x1c\x40\x5a\x60\xc2\xff\xe1\x2c\x55\x38\xaf\xe4\x81\x58\x6d\x1a\xe7\xc5\x2e\xf9\x67\xe7\x0a\x28\x6b\x3a\xf7\xb8\x1c\x12\xb7\xb5\x3d\xf2\xe3\xa0\xbb\xda\x14\x0e\x20\xe5\xb0\xfa\xe6\x7a\xe4\xe2\x15\xf1\xa7\x3e\xd2\xb3\x06\x9a\x27\xe8\x6f\x75\x08\x9f\x62\x51\xb7\xa2\x17\x1a\x75\xfa\x6d\x25\x91\xb5\xc9\x56\xaf\x03\xdf\x35\xb6\xe8\x67\xb2\xd7\xa2\x3c\x2f\x7d\x95\x35\xb2\xfc\x01\xd3\xaa\x0c\xcb\x15\x9b\x17\xdf\x1a\x6d\xf7\x7b\xbb\x70\x1e\x70\x72\xde\xde\x7c\x1b\x70\xe5\x30\xab\xcd\xee\xdd\x7f\x88\xf7\xab\xea\xe6\x31\xe1\xcb\xc2\x1d\x9b\x17\x2a\xef\x8b\x2e\x92\x34\xb7\xac\x9e\x9a\x3d\x92\x77\x78\xca\x00\x20\x5b\xf0\x12\x6d\xd8\x8c\x91\x79\x91\xca\x8e\x1d\x7d\x1f\xae\x5a\x65\xbe\xbf\x36\x5b\x40\xa1\x80\x57\xf2\xca\x1e\x3e\x6d\xe6\xb3\x86\xc5\x45\xeb\xce\x00\x71\x82\x67\xda\x6d\x55\x22\x5a\x6e\x45\x3e\xfe\x6d\xba\xe4\x09\x59\x17\x9d\xfa\xe4\x58\x5a\xbb\xbc\xe7\xe5\xf5\xae\x33\x47\xe6\x3f\x1d\xfe\x61\x02\x90\x18\x78\x73\xa8\x6a\x2e\xee\x10\x9f\x91\xd2\x55\xbb\x7e\xee\xf5\x39\xdc\x20\x8d\x37\xd3\x58\xcc\xdd\x73\x16\xc7\x0f\xba\x91\xce\xee\x4b\x3d\x2c\x0d\x90\x5e\x38\x8f\xa9\x4c\x2b\xb0\xec\x5d\x8c\x66\xd7\xb4\xf6\x3c\x74\xf8\x5d\x01\x69\x25\xcd\xb8\x63\xd0\x7c\x07\x89\x4d\xd0\xda\x2b\xca\x33\x14\x42\x38\x80\xb4\xc3\x8f\x57\xdb\xe9\x41\xc9\xfb\x34\x79\xe5\x62\xc3\x09\x7b\xff\x69\xbe\xe5\x2a\xdf\x93\x95\xb5\x61\xc6\x31\x09\x24\x89\x1f\x9c\xeb\x8c\xe3\x71\x00\x29\x83\x95\x6d\x0e\xad\xc3\xb5\xaf\x3d\xbe\x93\xef\xba\xfa\x76\x88\x29\x44\x6b\x48\x22\xff\xde\xb3\x2a\x9f\xfb\x6a\x7d\xce\xda\xf5\xc8\x5b\xd9\x7c\x67\x80\xb8\xc0\xeb\x14\xbf\x14\x3c\x38\xad\xaa\x7d\xbb\x4d\x96\xeb\x33\xfd\xb9\xa4\x27\x16\xc6\x95\xb8\x20\x01\x86\x7e\x07\x9f\x1f\xb4\xaf\x04\xf8\x69\x00\x12\x03\x9b\x9f\x99\x37\xfe\x77\xe2\x3d\xcb\x70\x36\x77\xc7\x55\x26\x45\xaf\xbd\x51\x42\x27\xdc\x07\xef\x9d\x99\x29\x99\xcd\x11\xf8\x51\x4a\x27\x0d\x90\x51\xb8\x6d\x75\x36\xbb\x99\xc5\x45\x25\xa8\x99\xbb\xd3\x89\x64\xac\x53\xcb\x88\xe1\x5b\x69\x9c\xc6\x5b\xf2\xb8\xea\x6b\xb7\x87\xfc\x6d\x01\xad\x33\x40\x4a\x61\x0e\xa1\xac\x4b\xa3\x98\x28\x74\xd8\x31\xbc\x8c\xfc\xb6\xc4\x0c\xc7\x5e\xf6\xd0\x0b\x8f\xd3\x26\x75\xf7\xab\x16\xed\x5e\xca\x36\x99\x53\x04\x48\x25\xec\x9c\x86\xae\x89\xf6\x79\x19\xd7\x82\x0a\xbe\xe2\x22\x4d\x9c\xca\x24\xe5\x25\x55\xba\x93\xab\x62\xa1\x96\x95\x3c\xc5\x6e\x1b\x47\x29\x00\xd2\x01\x27\x26\xa9\xaa\x58\x52\xeb\x43\x91\xf4\xd4\xbb\x96\xc8\xe2\xa5\xb2\xc2\x24\x57\xa6\x0e\x54\xf5\x94\x7c\x0f\xa7\x17\x1f\x0c\xba\xde\x0a\xd3\x87\x25\xa3\x26\x55\xe1\xaa\xc7\xf7\xd6\x95\x9e\x73\x7d\x72\xbc\xde\x73\x96\xf5\x80\xdd\xca\x64\xd5\xe8\xa6\xd3\xc2\xc0\x3e\x39\x3f\xc1\xed\x16\x0b\x7e\x74\x42\xdb\xcb\xb8\x66\x21\x23\xc5\xe9\xf2\x9b\xf4\xf2\x41\xfe\x89\xe2\xbe\x72\x1e\xb2\x6d\xaf\x1d\x85\x72\x0e\xa5\xf4\x1d\xaa\xd3\x74\x06\x48\x0e\xfc\x7c\x2e\xaa\x6a\x01\x5b\x12\xd9\xfe\x97\x06\x13\x67\x53\x82\xff\xfe\x3e\xca\xb7\xbe\x67\xc0\x4a\xa5\x49\xfe\x4e\x13\xb5\x7c\x56\xea\x49\x80\xfc\x84\x73\x01\x62\x9e\xf3\xf7\xcf\x3a\x49\xce\xad\xe3\xc5\xb8\x4f\xce\x4f\xd4\x33\x5d\xbe\x7f\x51\x3f\xd1\x93\x1e\x21\xfc\x25\xe4\xb9\x5b\xc2\x2a\x40\xa6\xe1\x5c\x30\xc7\xf3\xa6\x7b\xe4\x58\xb9\x6f\xe7\x97\x4c\xdf\x22\x11\x8e\x23\x07\x7b\xc8\x1b\xc7\x58\x32\xa5\xee\x2d\xff\xf2\xb8\xae\x4c\x95\x0b\x80\x22\xfc\x2f\xd6\x67\x3f\x84\x0b\x49\xe6\xef\xab\xfc\x72\xba\x8f\x5c\x88\x49\xff\xa8\xdd\x1c\xbf\x4c\xb8\xe6\xa9\x1f\xca\x1a\x5b\xbb\xc2\x52\x1d\x0d\x01\x92\x04\x2f\x52\xbe\x79\x96\x44\x26\xfd\x25\x93\x03\x76\x87\x48\xaa\xae\xa8\xf8\xba\x04\x4d\xbe\x22\x3b\xe5\xec\xd2\xc8\xef\x7f\x4d\xf7\xc4\x9f\x77\xce\x00\x09\xfb\x7f\xd7\x30\x35\x55\x6a\x3e\x20\xcd\x87\x5a\xcf\xf9\x8b\xd2\xd3\x7e\xd1\xa9\x0b\xd8\x97\x78\xbd\x2a\xf3\x55\x17\x37\x75\xc9\xc7\x13\xfa\xce\x00\xe9\x85\xf7\x9f\x34\xf7\x31\xf2\x18\x1f\x37\x89\xa3\xa5\x1f\x0d\xcc\x02\x69\xde\x6a\x33\x16\x35\xb0\xf7\x7b\xac\x08\x5f\x58\x2b\xe5\xb0\x93\xbf\x0e\x90\x41\xd8\x93\x74\x3d\xbd\xb6\x95\x27\x69\x8e\x4d\x9c\xd7\x0b\xdd\xa5\xcb\x63\x35\x75\x36\xf3\xc3\x8b\x20\x6e\x4e\x95\x3f\xa2\xe7\x56\x0d\xa3\xdb\x71\x00\x09\x82\x1f\x3f\x37\xae\x28\x24\x18\x26\x72\x56\x83\xf5\xfc\x91\xd7\x0f\x52\x32\x1f\x3c\x7d\xb1\x1f\x29\x50\xa1\x78\x2a\x7d\x4e\xa2\x81\xff\x74\x82\xc4\x3f\xb2\x59\x45\x9a\x6d\xde\xec\x8e\x76\xf2\x98\x7c\x16\x0f\xe8\x45\x8f\xb9\x31\x19\x2d\x1e\x30\x8e\xb6\xcd\x98\x94\x16\x0f\x00\x68\xb3\x80\x45\x6a\x09\x80\x1c\xea\xa5\x50\xb2\x7f\xe3\xb6\x40\xa9\xd4\x8f\xe4\x25\x0e\x20\xf3\x30\xbd\xb1\x9e\x9b\x74\xdc\x3c\x45\xf2\xf6\xe7\x6c\x76\xb6\x67\xfa\x86\xc4\x94\xdf\xf0\x4c\xde\xbe\xf0\x5f\x24\x73\xa4\x5d\x8a\x6d\x79\x77\x71\x00\x59\x82\x93\xc8\xd8\x57\x3f\xf2\xc7\x5e\x89\xaa\xa3\xb6\xdd\xef\x9b\x9b\xd7\xe2\x23\x69\x8d\x26\x06\x66\xac\xc4\xd6\xb6\x62\x9a\x1f\x8e\xc8\xa9\xe1\x80\x22\xfc\x0f\xf6\xbf\x77\xed\xdd\x55\x2a\x66\x2f\xed\xcd\x26\x4e\xa9\xe0\x6e\xcb\x52\xb9\x63\x65\x5d\xb5\xbe\x21\x64\xbd\x14\xa7\x6b\x40\x92\xbd\x85\x03\x8a\x77\xe1\x8b\xdd\x27\x8b\xcf\xe4\x50\x06\xe8\xbf\x7f\xf5\x74\xe6\x71\xba\x8c\x9f\x79\x50\x9c\x47\xa5\x9a\x66\x16\xcd\xc3\x2f\xe6\x6c\xc1\x7b\xde\xe1\x00\xe2\x0d\x1f\x22\x1c\x0d\xa5\xfa\x5c\x26\x9a\x71\xf9\x81\x22\x7b\xb5\xd2\x0b\x59\x9b\x1e\x5e\xf3\xb5\x3d\x0f\xff\x2c\x2e\xf5\xce\x19\x71\x2e\x8d\x12\x3f\x4d\x85\x35\x49\x82\x33\xe7\xd1\x9b\x15\x58\xb3\x24\x00\x96\xd0\xcf\x09\x61\xcd\x13\x0f\x50\x34\x23\x8e\xc7\x9a\x28\x61\xfc\x5d\xa2\x41\x58\x13\x25\x18\xe4\xcd\x4c\x7c\x01\x66\xeb\x82\x7f\xc1\x2d\xe2\x0b\x30\x7b\x17\xfc\x0b\x0a\xd1\xf6\x17\xab\x7b\x21\x00\x7a\xd0\x2d\x80\xd9\xbe\xe0\x01\x75\x28\x00\xb3\x81\xc1\x03\x5a\xfe\xf7\x97\x33\x18\x2d\x0c\x01\xb0\xf5\xbf\x4f\x4e\x60\x75\x32\x40\x99\xcf\x89\xe9\xbf\x3b\x4f\x81\x70\x56\xfc\x73\x2c\x5a\x99\xd7\x48\xcc\xbb\xe2\x8d\x1b\xc2\xdb\xac\x3f\xfa\x82\x65\xb0\xa4\x70\xd5\xc9\x86\xfe\xd5\x16\xf5\x11\xb7\xee\x21\x1c\x50\x3c\x06\x0d\xff\x9c\x64\xc3\x5b\xc8\x63\xac\x13\xfd\x83\x33\x2d\xf6\xd1\x57\x93\xb6\x06\x39\xa9\x2a\x51\xa4\x5e\xff\xd7\xe0\x8e\x13\x94\xbd\x03\xdb\xa9\x05\xe6\x01\x66\x31\x2c\x9c\x67\x8b\xa3\x3a\x96\x0f\x15\x5f\x9b\x0d\x98\x8f\xbd\xda\x31\xa1\x13\xdc\xf2\x5c\xdd\x20\x30\x5d\xff\xda\xc7\x66\x51\x1c\x40\xd6\xe1\x3d\xa9\xe3\x2b\x2f\xb8\x35\x5b\x2d\x48\xef\x40\x61\x9a\x7c\x23\xa8\xe9\x80\x51\xdf\x5e\x8b\x23\x36\xc2\x01\x76\x51\x96\x0f\x76\x35\x9b\x49\xfc\x9b\xd5\x04\xf7\x04\xd2\x12\x63\x08\xcb\x6e\x42\x0c\x1d\x23\xfa\x1f\xcb\x6e\x62\x1a\x45\x45\x1a\x2c\xc3\x09\x80\x75\x74\x85\x31\x3b\x49\x3c\xe0\x35\x0a\xc0\xec\x25\xf1\x80\x4e\x34\xe8\x30\xbb\x49\x3c\xa0\x0f\x05\x60\xb6\x93\x84\x9d\x89\xca\x71\x58\x0d\x25\x01\xd0\x8a\x26\x23\xcc\x8e\x12\x0f\xa8\x40\xdf\x80\xd9\x52\xe2\x01\x3e\xe8\x61\x0b\x66\x53\x89\x07\x24\xa0\x00\xcc\xae\x12\x0f\xf0\x42\x25\x45\xcc\xbe\x12\x0f\x58\x44\xe5\x38\xcc\xc6\x12\x0f\xa8\x45\xd7\x01\xab\xb5\x24\x00\x36\xe9\x89\xd1\x8d\xd9\x5c\xe2\xa3\xdb\x92\xf8\x02\xcc\xee\x12\xff\x82\x10\x54\xbe\xc3\xea\x2f\x09\x80\x68\x32\x34\x1d\x61\xb5\x99\x40\x89\xc5\xe9\xbf\xef\xb8\x7e\x80\x19\xe3\x45\x89\xc3\xac\xbb\x53\xa2\x6e\x29\x5f\x70\x7b\x93\x77\xb2\xc6\x54\xb6\x51\x74\xee\xee\x09\xfe\x7b\x53\x9b\xca\x3f\x36\xf2\x7e\x3c\xdb\xce\x91\x30\xdf\xe5\x38\xd3\x10\xfb\xa5\x9d\x36\x65\xe7\x42\x90\x79\x9e\x64\xb4\xa5\x5d\x47\x9e\xc9\xd1\x5d\xa3\x0f\xc7\x29\x8e\x19\xd7\x5b\x08\xa6\x6e\xe7\x00\x58\x59\x5f\xbe\x65\x60\xf4\xd2\x21\xbd\x64\x66\xd7\xa3\xc6\xe9\x2c\xc7\xd6\x5c\xef\x9f\x1a\x3f\x1e\xe5\x50\xe7\x5d\x39\xbc\xc8\x26\x5e\xb6\x3d\x07\x4f\x98\xf0\xce\xb2\xe0\xf4\xd7\xe2\xfd\xb5\xa2\x3b\x68\xaf\x1a\x32\xf3\x9c\xf3\x33\x27\x33\xff\x3d\x14\xd9\xc5\x7d\xa9\x2e\xb8\x54\xe7\x60\xb7\xc4\xbf\x99\x4d\x70\xcf\x07\xf4\x84\x0f\xcb\x6e\x62\x3d\x40\x63\x08\xcb\x70\x62\xc2\x43\xa5\x75\x2c\xcb\x09\x00\x4f\x74\x1f\x60\xf6\xf9\x78\x80\x1b\x0a\xc0\xec\xf4\xf1\x80\x01\x74\xd2\x58\xbd\x3e\x91\x89\xa0\x37\xd5\xb0\x9a\x7d\xa2\x97\x50\x2d\x1e\xab\xdb\x27\x00\xca\xff\xf7\xbf\x6b\x98\x4d\xbf\x12\x93\xde\x7f\x5f\x74\x7b\x05\x87\xe9\x53\x69\xa3\x26\x7b\x81\xeb\x25\x16\x7f\x15\xa8\x37\x06\x8b\xab\x71\xed\xaa\x3a\x9b\x4d\xdd\x46\xcf\xe4\x48\x24\x2c\xde\x6e\xfa\xe3\x00\xf2\x0b\xae\x6a\x51\x5d\xb7\x02\x48\x9b\x0f\x14\x4b\x8b\x6d\xf8\xff\x7d\xc5\x9c\x50\x59\xfb\xeb\xa3\xa1\x86\xd8\xc9\xb7\xb4\xe0\x14\x35\xd3\x8b\x8f\x38\x80\x64\xc1\xcf\x57\x13\x66\x39\xfa\x92\x22\xe1\x37\xc9\xaf\x01\x32\xfa\x1a\x81\xe4\x1e\xd1\x58\xcf\x23\x3b\x9e\x65\x55\x78\x26\x2b\x59\xac\xb1\x67\xe1\x00\x12\x0b\x6b\x0b\x52\x97\x14\xc7\x5c\xdf\x7f\x49\xa5\x72\x8e\x7a\x47\xba\x71\x31\xab\xab\x53\x80\x95\x56\xe0\xf8\x26\x73\x44\xde\x31\xe6\x80\xfd\xd7\x25\xfe\xcd\x6c\x82\x7b\x5e\xa1\x2b\x86\x65\x37\x01\xf0\x0b\xad\x51\x58\x86\x13\x00\x59\xe8\x1b\xb0\x2c\x27\x00\x62\xd1\xdc\x88\xa9\xba\xe0\x01\x1b\x68\x7f\x83\xa5\xbb\x10\x99\x14\xfa\x06\x4c\xe1\x05\x0f\x70\x42\xa3\x0e\x53\x7a\xc1\x03\x62\xd0\x0a\x82\x25\xbe\x10\xc9\xc5\xff\xdc\x8a\xa1\xbe\x10\x00\xed\xe8\x1b\xb0\xe4\x17\x02\xa0\x0c\xa5\x2f\x98\xfa\x0b\x1e\xe0\x82\x5e\xde\xc2\x54\x60\x08\x93\x46\xe7\x80\xa5\xc1\x10\x00\xa3\xe8\x21\x36\xa6\x08\x83\x07\x94\xa2\xad\x2f\xa6\x0c\x83\x07\x54\xa2\x5e\xc2\x12\x62\x08\x80\x0e\x4a\xf4\x00\x18\x4b\x8f\x01\xca\x08\x09\xdf\xe9\xff\x7e\x58\x00\x4b\x15\x37\xd6\xcd\xfe\xdc\x1c\x27\xb9\xbc\x72\x2f\xdb\xb0\xeb\xbb\x91\x93\x6f\x60\x7d\xe4\x8b\x4d\x4d\x16\x0d\xb5\x7b\x73\x81\xdf\xf8\xd2\x70\x00\x29\x82\x05\xa5\xf1\x90\x20\xc4\x24\xf3\xb6\x4b\xfc\x55\xfd\x0c\x11\xfb\xef\x3b\xaf\x3d\x70\x68\x2c\x2c\xbf\xff\x97\xc9\xeb\x82\x8c\xf7\xf9\x2b\xd1\x38\x80\x84\xc3\xcf\x27\xa5\xeb\xb8\x37\x2d\xd2\x6d\xfb\x47\x34\x61\x2a\xfc\xd3\x5b\x4b\xb5\x33\x45\x4e\x9d\x5b\xfc\x6b\xce\x14\x2d\xb4\xee\xb2\x13\xaf\x71\x00\x49\x87\xc7\x37\xd5\xd5\x71\xa9\x7c\xd1\xd1\x69\x4a\x57\x1f\x97\x3d\xf2\xd9\xe0\xf5\x90\x2e\x6f\x84\x8f\x48\x71\x3f\xf9\x8d\x0f\x2f\xaa\xba\x88\x2c\x1b\xcb\x6c\x82\x7f\xea\xd1\x15\xc0\xb2\x9b\x00\x28\x42\x57\x00\xcb\x70\x02\x20\x1c\x7d\x03\x96\xe5\x04\x40\x3a\x0a\xc0\x52\xc4\x88\xcd\x20\x5a\x69\x31\x25\x31\x82\x5a\x81\xca\x1b\x98\xa2\x18\x1e\xf0\x13\x2d\x9c\x98\xb2\x18\x1e\x30\x4d\x45\xa4\x77\x98\xc2\x18\x9e\xde\xf1\x10\x5f\x80\xa5\x8c\x11\x5e\x90\x84\x3a\x09\x53\x1a\xc3\x03\xc2\xd0\xdd\x8f\x29\x8e\x11\x32\x18\x9a\x23\xb1\xe4\x31\x02\x60\x10\xf5\x2a\x96\x3e\x46\x00\x04\xed\x5e\xfa\x43\xf8\x9b\xb0\xea\x92\x3c\xaa\x03\x85\xeb\xcf\x8e\x6f\x84\x91\xac\x46\xb3\x92\xa7\xfe\x4d\xf1\xfd\x7e\xca\x93\xf5\x36\x43\x77\x34\x1b\xaf\xbf\x37\x50\xde\x5a\x23\x7c\xbf\xc8\x1d\xbe\xec\x59\xf3\x7a\x97\x53\xf8\x28\x75\x23\x0b\xaf\x49\x64\x7f\xe6\x58\xee\x31\xb7\xde\x97\x46\xf9\x2f\xf7\x7a\xb9\xd9\x92\x01\xba\x02\x6d\x80\x7c\x86\x87\xcb\x38\xc5\xea\x97\x5d\xa4\x52\x69\xcd\xa0\xb6\x0a\x93\x5d\x28\x78\xfa\xe5\xce\xe4\xa8\x94\x0b\x25\xb2\x67\x50\x96\x34\xd5\x7f\x15\x00\xa4\x08\xae\xcd\x46\x8d\xa1\xda\x27\xbf\xd9\xad\x33\x9d\x79\x9f\xa2\xe1\x9c\xa0\x78\xcb\x24\x41\xe7\x54\xa2\x62\xcc\x3e\x33\x27\xcd\x3d\xeb\x26\xb3\x00\xa9\x82\x1b\xe6\xad\x86\x30\x8e\x07\x4e\x83\x2d\x01\xae\x76\xb4\x0d\x41\x6c\xb6\x26\x7a\x2e\x32\x97\x2b\x5e\xd6\xf0\xca\x96\xb5\x71\x7b\x26\x7d\x82\x86\x52\xdc\x5c\x6e\x35\xb5\x64\xf8\x59\x9a\x8d\xd8\x0b\x50\x67\xf6\x5e\x39\xee\xa4\x7f\x3f\x40\x4d\xfe\x19\xd7\xb5\xa2\x59\x85\x39\x5e\x00\x90\x8c\xff\x77\xf9\xc9\x74\x23\x27\xc9\x53\xa9\x70\xa0\xa5\xe5\xb0\x97\xa5\x68\x9c\x2c\x99\xf9\x7e\x4d\x36\x67\x1e\xfb\x02\x36\x13\x17\x61\x33\x03\x80\x7c\x87\xb9\xef\xeb\xec\x0d\x27\x1a\x99\xe5\x4b\x72\xbd\x0d\xc6\x59\xe6\x35\xfe\x25\x73\x8c\xee\x4e\xd7\xda\x37\xea\x82\xb9\x9a\x94\x3e\xb5\x8d\x3b\x03\x24\x03\x26\x39\xf7\x67\x5d\x8f\x2f\x8c\x88\x49\xae\x14\xc5\x74\x51\x3e\x94\xeb\xc9\xb4\x4a\xf6\x12\xf7\xd8\xe7\x7a\x75\xed\xca\xed\x66\x76\xde\x50\x80\x14\xc3\xd4\xfd\xfd\xb8\x63\x6d\x5c\xeb\x92\x61\x5b\xbf\x5d\xc7\xea\xeb\xcd\x5b\x45\x3c\x9f\xc2\x19\x9e\xbf\xd1\xd7\xcc\xf5\x38\x10\x3f\x38\x4d\x02\x90\x6e\xf8\x40\x3a\x6e\xe3\xae\x77\x9f\x10\x83\xd4\x41\xff\x81\x40\xf7\x64\x89\x13\x1c\x69\x89\xb5\x0c\x7a\xeb\x03\xe7\xac\xab\xbe\x74\xa6\x0c\x7a\x6c\xe7\x21\x58\x8f\x6d\x36\xbe\xed\xa6\x98\x7d\xf8\x2b\x43\x4e\xa2\x6d\x57\x7b\x9c\x82\xd7\x67\x0e\x03\x41\x8f\x28\x06\xcd\xb7\x06\xf5\xeb\xe6\x24\xd1\xd0\x50\xce\x4c\xee\xe1\x7d\x0b\x9c\x6c\x62\x37\xdb\x48\x24\xa8\x2e\x31\xc7\x84\x6c\x2d\x5c\xc7\x3d\x79\x1b\xf2\xe0\xbd\xa1\xf8\x73\x03\x73\x00\x90\x98\xff\xf7\xc3\xea\xf3\x19\x27\x0c\x79\xcd\xae\x91\x1f\xdf\x3b\x73\xdb\x3d\xc2\xbf\xf3\xab\x57\xf2\x9a\x97\xc1\x83\x90\x87\xb3\x3d\xcb\xab\x79\x75\x00\x59\x83\x15\x96\x77\xf4\x2e\x4f\xad\x1d\xdf\x65\xda\xe9\x0a\x52\x1a\x14\x3f\xb3\x49\xf3\x0e\xcd\x2c\x9f\x61\x3c\xf5\x26\x4a\xaa\x2f\xa4\x38\x3e\x04\xe6\x89\xd2\x6d\xeb\xa5\x61\xbf\xba\xbf\x4c\x8c\x3d\xb6\xd6\x7d\xa5\xcf\x28\x69\x47\x45\x3f\x4a\x7f\x63\x85\x91\x43\xc3\xc2\xaa\x49\xcb\x19\x20\x3f\xe0\x58\x1c\x41\x78\xc6\x05\xce\xce\x4f\x0a\xe7\x94\x07\xed\x65\xcc\xfb\xf9\x25\xa5\xe1\x98\xf3\x91\x49\xca\xf8\xd1\xd8\x8c\x03\xe7\x35\xbe\x02\xe4\x27\x7c\x9e\x5b\x68\x11\xe9\x68\x4e\xab\x6d\x7d\x69\x55\xcf\x39\xf6\xbc\x76\xc7\x4f\xb6\xae\xd9\x15\xf6\xd1\x09\x92\x6a\x0a\x69\xf9\xa9\xab\x4b\x00\x99\x81\x15\xc9\xa0\x49\x1b\xf9\xd5\x36\xa1\x38\xa6\x15\x23\xa3\xe2\x03\x5e\x39\xb3\x64\x21\x16\xb3\x6d\x6f\xc2\xc8\x99\x3f\xd8\x51\x2d\x7d\x88\x02\x00\x71\x83\xad\x31\x4f\xa3\xb9\x6f\xa2\x42\x47\x7b\xcc\x5d\x43\xeb\x44\xb5\xab\x15\x23\xc5\x6c\xee\x4b\x4e\xe3\x80\x9e\xba\x5f\x46\x4c\xf1\xaa\xc5\x00\x89\x82\x1f\xaf\xb9\xa1\xac\x3c\xe5\xf5\x20\xaa\x4e\xee\x75\x46\xdc\x43\xde\x7b\x3e\xf6\x23\xf2\x91\x51\x63\x2a\x2e\xa1\xbb\x47\xf6\xd6\x1f\x85\xeb\xe1\x61\x66\x49\xd3\xbd\x55\xc1\x0f\x54\xbb\xbd\x5c\x3a\xba\x90\xa2\xcb\x7e\xbf\x4f\xd4\xaa\x4a\xa5\xb2\x16\x45\xe6\xbf\xe4\x3e\xcc\x82\x03\xc8\x27\xf8\xf4\xd4\xca\xfc\xf5\x0d\xb6\x6a\x4b\x73\x81\x53\x8c\x6e\x9c\xcd\x4a\x14\x8e\x64\x83\xd6\x5d\x07\xc2\x4e\x5d\x1a\x19\xa6\x4b\xeb\x3e\x13\x08\x0d\xb5\x5c\xe0\x6b\x17\xd8\x4d\x52\xca\xb1\x79\xd5\xe1\xf0\x71\x91\x13\x14\xc7\x86\x9a\x7c\x1f\x4d\xbd\xb1\x1f\x32\xf7\x65\xe4\xf0\xda\x00\x00\x69\x82\x45\x66\xa7\xc8\xce\x99\xf4\x04\xa5\xf3\x0a\x77\x8f\xaa\x4c\x32\xdd\x73\x12\xb5\xb0\xca\x09\xae\xcd\x71\x62\x7b\xfd\x35\x77\xe5\xd6\x4d\x3d\x80\xac\xc3\xb1\xe2\xba\x96\xa8\xd6\x62\xad\xfb\x21\xec\xe3\x50\x48\x8c\x4f\x9d\xe9\xee\x04\x99\xa2\xd5\xe0\xfb\x76\x42\x0c\xd6\xd7\xd5\xfe\x8f\xb1\xeb\x8e\xc7\xea\xff\xe2\x48\x09\x0d\x91\x51\xf6\xa8\x08\xa1\x08\x19\x71\xa9\x8c\x28\x19\x91\x4a\x49\x28\x3b\x85\x10\x9e\x8f\x99\x19\xc9\xde\x7b\x45\xc9\x5e\xd9\x7b\xef\x99\x2d\x84\xec\x59\xf9\xbd\x7c\x9f\xc7\xfd\xdd\xfe\xba\xfd\x7f\xdf\xcf\x3d\xe7\xdc\xf3\x39\xe7\x7d\xde\x9f\xcf\x73\x2f\x8b\xb9\xad\x23\x80\x62\x90\x9b\x8a\xb5\x26\xf6\x79\xd2\xcf\x31\x5a\x3b\xeb\xb1\xe4\x53\x7c\x3b\xec\x5e\x34\xfa\x4b\x85\x0b\xcf\x03\xe3\x37\x3a\x63\x86\xb8\x8a\x14\x00\x94\x8c\x5c\xd2\x5f\xc3\x8e\x2c\x87\x7d\xa9\x50\xbc\xf1\xf3\xd2\x88\x77\x9f\x9a\xed\xcd\xc9\xeb\xe7\xc6\xea\x43\x98\xba\x54\x08\xa8\x87\xae\x2b\x74\x01\xa8\x03\x59\x5c\x3e\xe7\x5d\x35\x58\x7b\xf2\xdb\x75\xa0\x64\x3d\xc2\x89\x5a\x29\xe2\xdc\xcf\x36\x99\x87\xf7\x5d\xd4\xef\x1b\xe9\x5e\x9e\x62\x0e\x44\x9e\x17\x19\x95\xdf\x8c\x77\x0d\xed\x98\x54\xb7\x3d\x9c\xa4\x21\xa1\x33\x17\x9e\x46\xf5\xf8\x1c\x75\x2f\xf8\xac\x1b\xe0\xb6\xd9\x7c\xfd\x19\x72\xdb\xff\x1a\x43\xec\x97\x7c\xe1\xf8\xa3\xbd\xae\xe6\xdb\xb7\x6e\x37\xb9\x2b\x9f\x4b\x2a\x19\xad\x3f\xe9\x99\x2e\xe4\xfc\x27\xad\x78\x18\x00\x28\x1c\xb9\x94\xf9\x6c\x4f\x8d\x29\xb1\xd1\x9b\x1c\xbd\xe3\x9c\xaa\x9e\xd5\x29\x68\x7f\xfc\x7c\xb2\xe0\xa2\xbe\x9e\x57\x6a\xb1\x7e\xca\x03\xc6\x11\x00\xb5\x23\xeb\x50\xc3\xb9\x13\xe4\x8f\x6d\xad\x08\xdc\x2b\x02\x2b\xbb\xbf\xff\x61\xfc\xc4\x71\x46\x74\xba\x2e\xe4\x46\x5b\x4a\x6f\xc5\xa3\xcd\x67\xa4\x00\x48\xea\x22\x2e\xcf\xf9\x3e\xe7\xe5\x40\xbf\xa6\x68\x5f\xee\xc0\x4f\xf3\x93\xe4\x7e\xde\xaf\x9d\x97\xd3\x21\xa3\xe2\x69\xb1\x77\xc6\x08\x06\xb6\xd2\x01\xf4\x1e\x99\x5a\xc9\xbc\x80\xf2\x56\x60\x30\x65\xf6\x79\xaa\xe8\xea\x03\xbe\xa7\xa3\xcb\xd2\x4c\xae\xdf\x6b\xe4\x0d\x32\xa8\xb3\x93\x39\xa8\x40\x82\x01\x50\x0b\x72\x34\x0b\xff\x72\xc1\x9c\x6f\x27\x46\xb2\x50\xfe\xe8\x51\xaf\xf5\x26\x9e\x2b\xfa\xae\x07\xd3\x14\x47\xce\x6a\x9d\x9e\x1d\xf6\x5e\x67\xa0\x45\x5c\x9a\x46\x98\x2e\xb7\x6b\x13\xf7\x58\xd4\xc2\xf3\x7a\xd7\xfb\xd0\x8c\xc4\xdc\x03\x25\x72\x8b\xf3\xc9\xd5\x77\x78\x1a\x2e\x09\x95\xd4\x39\x02\xc8\x15\xb9\x7e\x26\x8e\x99\x54\x65\x91\xce\x0d\xae\x5d\x31\xd1\x5d\x67\xf6\xb1\xb9\x65\x42\x69\xe3\x5a\x6c\x95\xe0\x1e\xcd\xa4\x8c\xdf\xa2\x7c\x0e\x40\xb1\xc8\x30\x6a\x5e\xb5\xd7\xcb\x75\xf3\xac\x3f\x64\x21\x85\x5f\xfa\xa5\x71\xa6\xb0\xae\xf4\xba\x39\x7d\x36\xde\xf3\xbc\x97\x31\x1d\x4e\x04\xa9\x00\xca\x46\x72\x3e\x28\x64\x31\xd5\xad\x3a\x40\xb6\x77\x3c\xab\x4d\x96\xd9\xe4\x45\xd4\xc4\x1f\x9f\x4b\x97\xa6\x29\xd7\x23\x04\x19\x9e\x3c\x08\x7b\xb4\x47\x74\x91\x65\x6b\x97\x5e\xb6\xc3\x96\x50\xd0\xcb\xbb\x83\x8f\x3c\xe5\xd3\x22\xc1\xe0\x83\x43\x69\xcb\x9f\x89\x6f\x4f\x30\x1d\xbe\xd8\x7c\xbe\xeb\x29\xe2\x52\x1f\xcb\xa5\xad\x95\x1f\x2c\xc1\x5e\xd2\x32\x3c\x2f\x44\x4f\x12\x7d\xcd\xe4\x48\xb1\xe3\xba\xeb\x4e\x77\xd1\x34\x49\x6a\x34\xce\xc5\x11\x40\x5e\xc8\x4d\xff\xa3\x49\xb4\xbf\x3d\xe9\x2f\x24\x47\x11\x09\x7b\xe4\x1d\x15\x30\xb5\xd5\xa6\x5e\x3a\xd8\xdf\xa4\x33\xd7\x42\x23\xb0\x19\xa2\xda\x0e\x20\x5f\x64\xa1\x10\x54\x75\x90\x3e\x7c\xfc\xc9\x5b\xd7\x60\x8e\x9b\x32\xa6\x8c\xa1\x17\xb9\xfb\xdf\xd8\xfb\xa7\xfb\x57\x7a\x2e\x0e\x4e\x5f\x30\x5f\x00\xd0\x47\xa4\xc6\xf3\x8c\x23\x50\x60\x39\x7e\xcd\x76\xab\xe1\x9d\x05\xa6\xe9\x90\xe3\x85\x13\x24\x35\xda\xd9\x3d\xee\xd5\x62\x77\xbe\x4c\x1b\xd0\x23\x1f\x66\xfa\xab\x7b\x6f\xef\xaf\x93\xf4\x5f\x97\x7d\xea\xed\xa2\x61\x71\x1d\x8f\xa8\xda\x69\x21\x92\xb8\xea\xca\x11\xe6\x4e\xca\xeb\x3a\x7b\x75\x25\x01\x59\x57\x84\xb6\xdc\x59\xa4\x35\xd5\xfb\x47\xa5\xec\x5f\x42\x6f\x0e\x93\x25\x8e\x2a\x0b\xa7\xdf\x09\x9f\xe1\x38\x24\x6b\x18\xd8\xb8\x46\x04\x00\x14\x82\x4c\xdd\x00\xb2\xda\x30\x9b\xb2\x82\x00\x83\xb5\x61\xce\x45\xca\xaf\xb2\xd1\x57\xaa\x46\x3a\xe5\x63\x1f\xe6\xb0\x19\x3d\x76\x7c\x67\xe0\x04\xa0\x22\x64\x07\xd5\x93\x29\x16\xad\x9c\xc1\x3f\xe8\x1c\x13\xaf\x25\x90\xe9\xee\x98\xbb\x26\xf9\xf6\x83\xec\xab\x6d\x5e\x73\xf9\x20\x7e\xeb\xa1\x26\x00\xa0\x22\xa4\x39\x4a\xa9\x27\x5f\x9f\x69\x7b\xee\x68\x4f\x33\x22\xbd\xae\x36\xdb\xe4\xff\xf2\x0c\x6f\x67\x57\xdd\x18\x49\x76\x49\x8f\x5c\x66\x6f\x23\x80\x06\x91\xc5\x42\xf1\xc8\x8f\xbc\x1f\x42\xcd\xae\xa3\x95\x26\xdf\xff\xcc\x6b\x9f\xbf\xa4\xff\x80\x85\xee\xc8\xfa\x8d\xd2\xf5\x22\xe2\xc0\xf5\xbf\xfe\x6f\xc9\x18\x7a\xe1\x4b\xc0\xb6\xb4\x77\x64\x09\xed\xf4\xfa\x0f\xb9\x1c\xee\x91\x1a\xa5\xcb\x18\x3a\xfe\xfa\x73\x8f\x25\x89\xf0\x5a\xf7\x05\x05\x54\xea\x24\x49\xf6\xdf\xee\x24\x7c\xba\x12\x95\x3c\x61\x01\x19\x30\x00\x95\x3d\x61\x01\xc5\xf0\xf4\x8e\xc6\x9f\x70\x80\x6a\x72\x58\x02\x42\xa5\x51\xd2\x87\xf0\xf0\x98\x1c\x31\x00\xda\x41\x36\x53\xbe\xa7\x97\x1f\x31\x5c\xf4\xb8\x73\xfa\x62\x32\x1f\xd9\x3d\x4f\x9e\x11\x22\xa1\xb9\xa0\xed\x2f\x6e\x5b\x3d\xdf\x4f\x24\x9f\xc8\xbb\x06\x00\x94\x89\x8c\x3e\x1f\xd5\x4b\x52\xd3\xea\x17\x1a\x77\x39\xe2\x8f\x0b\xe6\x2d\x8f\x1c\xfd\x9e\xc4\xda\x75\xd9\xb5\xe5\x48\x4b\x0f\xd5\xb3\xb8\x36\x7d\x00\x35\x20\x53\x67\xf8\x20\xf9\x19\x56\xe5\x1c\x27\x16\x9a\xd1\x09\xfd\xa4\xc1\x5e\xbf\xd7\x65\xe1\xdd\x57\x1c\xbb\x05\xec\xc6\x42\x98\x19\x56\x04\x31\x00\xaa\x47\xd6\xb1\x05\x8a\x84\xd1\xcb\x6e\x6b\x8b\x0c\x89\xce\xf3\x67\x7c\x0c\x4c\xd5\x5e\xda\x6a\x12\x1f\xb9\xd6\xce\xdf\x9b\x7c\x99\x5f\xe8\xea\x08\xef\x3f\x5a\x8d\x0d\xcf\x0e\x2c\xc0\xa3\x9a\x8d\x05\x64\xc2\xe7\xb6\xd1\x0c\xc7\x01\x1a\xe0\x71\x08\xcd\x72\x1c\xa0\x1e\x1e\x1a\x51\x79\x2c\x16\xf0\x05\x36\x09\x8d\xc9\xe2\x00\x03\xb0\x49\xa8\x54\x16\x77\x07\x58\xdc\x40\x25\xb3\x58\x40\x09\x3c\x65\xa2\xd1\x59\x1c\xa0\x0f\xde\xa3\x44\xe3\xb3\x38\x40\xe3\x01\x58\xab\x40\xa5\xb5\xd2\xfe\x78\x12\xff\x1d\x56\x1f\x45\xf6\x09\x4c\x06\x3d\xd7\x48\x7b\xcc\xea\x94\x81\xb7\xb9\x01\xd7\x71\x59\x3d\xe9\xe9\x8d\xf7\x94\x44\x1e\x24\xac\xb1\x27\xbe\x97\x18\x8f\x63\x00\xb4\x8a\x5c\x07\x05\x99\x35\x9e\x78\x7d\x4e\xd4\x46\x1f\x57\x54\xa6\x1d\x4d\x5d\x3b\xee\xc5\xd9\xde\x76\xb8\x28\xf6\xb9\x2c\xfe\x5c\xb3\xdf\xa3\x2e\x0c\x80\x7c\x91\x04\x8a\x39\x84\x4d\x29\xc3\xf3\xae\x52\x68\x59\x0c\xed\x87\x4a\x9f\xaa\x9e\x70\x8a\xd4\x46\xf5\x93\xcc\xb2\x85\xa5\xce\x78\xc7\x2c\xe2\xf7\xec\x41\x96\x73\xf6\x0e\xc2\x7b\xbf\xef\xfa\x64\x0b\xd0\x2a\x5d\x97\x7c\x7a\xd9\x9d\x80\x5e\x78\xf1\xa8\x4a\x8f\x58\xcd\xa2\x00\x66\xd4\xe8\x77\x24\xef\xbf\x99\x8d\x8b\xcf\x28\x3c\xf3\xa2\xd9\x8d\x03\xac\xc2\x2b\x01\xcd\x70\x1c\xc0\x17\xde\xec\x42\xb3\x7c\xdf\x24\x58\xb3\x47\x1d\x2c\xb0\x80\x38\x58\x22\x43\x1b\x2d\xf6\x57\x33\x31\xfc\x87\x48\xb4\x09\x03\x48\x95\x4a\xdc\x76\xc6\x00\xa8\x08\x59\x5c\xe8\x48\x4d\x8b\xa5\xee\xb1\xb0\x4d\x28\x48\xaa\x44\x67\xf1\xbe\x88\xbe\x76\x63\x60\xec\x50\xbc\xe3\x58\xa4\xd6\xf5\x60\xdd\xb7\x61\x7b\xeb\xf9\xaf\x61\x6d\x62\x7d\xad\x8b\x7f\x8d\x4d\x96\x0e\xf4\x78\x1e\x77\x72\x38\x8c\xd9\x0c\x15\xfe\x2e\x76\xa3\xb8\x88\xda\x80\xfa\xd7\xd7\x85\xbd\xb8\x22\xdb\x4d\x05\x93\x66\x28\x9d\x83\x27\xe3\x8d\x64\x53\xd7\x8b\x9b\xca\x86\x19\xf7\x76\x93\x42\xd7\x74\x35\xe8\x74\x36\xc4\x75\x3d\xd8\xa5\x30\x00\x6a\x42\xe6\x44\x73\x84\x5f\x5f\xde\xa9\x0f\xc5\x74\x9e\xba\xcc\x1c\xd6\x37\x9e\x91\xce\xb0\xd7\x6b\x78\xf7\xbf\xb7\xb2\xc2\x67\x96\x34\x76\xdc\xb3\x3f\xf4\xaf\xd7\x38\x47\x08\x1f\xb7\xf6\xad\x09\xe9\xce\x10\xee\x0e\x91\x0c\xce\x79\x36\xaf\x91\x6f\xda\x93\x70\x94\xd5\xec\xcd\xa9\xc1\x64\xe2\x4d\xde\x7f\x73\x13\x17\xce\x22\xb8\x12\xa1\xf9\xb9\x5f\xeb\xe0\x55\x8c\xe6\xe8\x7e\xd2\xc1\x5b\x20\x68\x9e\xe2\x00\x4d\x70\x0e\xa1\xb9\x8a\x03\x84\xc2\xfa\x38\xea\x0c\x89\x05\x0c\xc1\x2d\x19\x75\x8a\xc4\x02\x26\xe0\x85\x83\x3a\x47\x62\x01\x3f\xe1\xbf\x8d\xa2\x0e\x92\x58\x80\x1b\x6c\x12\xda\x28\x89\x03\x44\x9f\x80\xd7\x01\xda\x44\x09\xa4\x88\x69\xfe\x7b\x7f\xc0\x2c\x72\x1d\xf0\x2b\x97\xaa\xdc\x16\x37\xda\x2d\xa5\xea\xa0\x0f\x0f\x1d\x5a\x3f\x26\xd6\x43\x22\xb8\xf2\xc0\x07\xaa\x5a\x78\x8a\xe7\xcf\x2a\x8d\x01\x90\x23\x92\x5f\xd6\x1b\xae\x2a\xea\x6b\x31\x9e\xeb\x0a\x67\xf6\x2a\xad\x4d\x7f\x12\x65\xcf\xca\xaf\xf7\x90\x21\xa8\xc6\x70\x8b\xac\xd8\x6e\x38\x02\x03\x20\x3f\xe4\xba\x91\xbb\xe5\x2a\x56\x12\x28\x8a\x67\x37\xf5\xc5\x9b\x2c\x99\xd1\xa1\x68\x3d\xdb\x35\xcc\x3f\xb3\xbf\x85\x63\x3d\x3e\xd6\xc6\xb2\x1b\x03\xa0\x2a\x24\x47\x1f\x4c\x8d\xb3\xbb\x5e\xaa\xaa\x15\xc1\xd0\x3a\x6d\x5c\xfb\xa4\x99\x58\x96\xa1\x8a\xf9\xe7\xf4\x73\x0b\xc1\x58\x85\xc3\x55\x3f\x14\x31\x00\xf2\x46\xd6\xde\x09\xdd\x47\x67\x97\xc9\xae\x61\x1e\x15\xce\xed\x9e\x6d\xbd\xe6\xa7\x90\xd3\x5e\x47\xce\x52\x94\x24\x3b\x16\xee\x45\x94\xb4\x54\xce\xfb\x6f\x6e\xe2\xc2\x39\x0b\xaf\x03\x34\x3f\x71\x00\x47\x78\xdb\x07\xcd\x51\x1c\xc0\x0f\x5e\x38\x68\x9e\xe2\x00\x55\xb0\x42\x89\xe6\x2a\x0e\xe0\x0d\x57\x6b\x34\xcd\x00\x07\x48\xa1\x82\x4f\xa9\xa1\x4a\x07\x50\x94\xd3\x5e\x7b\x5d\x47\x0a\x02\xad\xcd\xa2\x4a\xcc\x1c\xc7\x62\xdf\xbe\xbe\x32\x1b\x9f\x30\x93\xcd\x1d\xd3\x23\x66\xaa\x40\x75\xb1\x48\xd8\xfe\xd2\xb6\x50\xda\x25\x0c\x80\xc2\x91\x8f\x4c\xaa\xab\x29\x56\x57\xdf\xf4\xc4\xd6\x6f\xe1\x3e\x9f\xd2\xb7\x37\xa2\x28\xbe\x24\x1d\x0a\x0e\xac\xb8\x90\x6e\x98\x38\x66\xf9\x66\x71\x8f\x55\x20\x87\xc8\xae\x04\x96\xee\xb7\xae\x22\x1d\x44\x94\x47\x8b\xc2\x5e\xf0\x6e\x14\x13\x13\x7e\x1e\x2a\x3f\x34\x7f\x28\xf2\x76\x3b\x07\xa3\x45\x24\x00\x90\x37\x52\x86\x7b\xf2\xab\xb7\xdd\x73\x61\xdb\xc0\x4e\xfa\x6e\x9d\xfb\x03\xfc\x13\x0a\x8e\x6a\xb7\x5a\xcf\x9a\x79\x48\x9d\xa1\x58\xfa\x6e\xf2\x5e\x19\x40\x65\x48\x73\xec\x27\x9f\xf1\xb5\x3b\xfe\xfc\xb8\x28\x96\x65\x18\xb4\x2e\xba\xb0\x6d\x33\x3b\x44\xf3\x9a\x26\x59\xec\x92\x80\xdc\xe3\xf5\x0d\x1a\xde\x7f\xf3\x12\x17\xcc\x75\xb8\x93\xa1\xb9\x89\x03\x84\xc3\x8f\x0b\xd5\x4f\x1c\xe3\x82\x6b\x04\xaa\xa3\xb8\x84\x80\x29\x1a\x9a\xab\x38\x40\x19\x6c\x12\xaa\x34\x84\x05\xb4\xc2\x00\x34\x71\x08\x07\xf8\x05\x47\x09\x55\x1d\xc2\x02\x62\xe0\xe2\x8e\xaa\x0f\x61\x01\xc9\xff\x7f\xc1\x26\x8a\x42\x84\x03\x74\x90\xc3\x34\x13\x4d\x28\x02\xd2\x6e\x78\x84\xff\x9d\xf4\x28\x45\x4a\x51\xc9\x16\x0b\x94\x4c\xa5\xb9\xc4\x55\x3e\xb9\x43\x81\x86\xc7\x98\xed\x1f\x68\x7d\x5a\x11\x48\x2f\xac\x11\xf4\xf7\x97\xaf\xb7\x65\xd8\x6b\x08\xc8\x96\x4f\x52\x7e\x97\x86\x27\x4c\x3c\xf1\xb7\x79\xba\xbb\x5e\x45\xa0\x6a\x30\x6b\x69\x68\x07\xf9\x8b\xc8\xfb\xea\x31\x47\xd9\xd2\xf3\xf6\x28\x42\x31\x32\xaf\xc5\x0e\x6c\xfa\xd9\xed\x48\xea\x8c\x5c\xe6\xca\xe3\x48\x7c\xf5\xdc\x71\xe6\x78\xe0\xe9\x68\x71\x4a\xe5\xd5\x1b\xfc\x6e\x10\x6d\xf1\x5e\x98\x90\xa5\xdd\xae\xa4\xf4\xe9\x4e\xe4\xa3\xb9\x3b\xfe\xd7\x36\x9e\x24\xa9\xef\x4a\x45\xf6\xa6\x87\xf5\x13\x10\xad\x5e\xaf\xfe\x61\x2a\xf9\xb5\x8a\xf7\xdf\xcc\xc6\xc5\xa7\x14\xde\x58\x45\xb3\x7b\xbf\xf9\xc1\x0d\x1c\xcd\xf0\xfd\x89\x17\xce\x53\x34\xcb\xf7\x93\x82\x0c\x9e\x78\x51\x05\x3b\xe9\x13\x78\x27\xfe\x9b\x0c\xaa\x90\x21\x8d\xba\xb8\x43\x91\xc2\x94\x63\x5d\xff\xdc\xe8\x8a\xe5\x79\xee\xa3\xef\xa9\x3a\x69\xe9\xb3\x6a\x82\x67\xc5\x9e\xbd\xd9\xf0\xd4\xbb\x86\x01\x92\x9a\xc8\x88\x16\x57\xfc\x6a\xb1\xde\x61\x7a\x7a\xf9\x84\x7b\x9a\xd7\xe4\xc2\xec\xe1\xf6\x1f\xea\x79\xf1\x17\x15\x9c\x86\x6d\x28\x4f\xcb\x94\x61\x00\x94\x80\x1c\x3c\x36\xb7\x93\xeb\x1d\xb9\x9c\xfa\x39\x39\xaf\x3a\xc7\x27\x66\x81\x8f\x56\xb9\x65\x32\xf7\xfa\xfe\x5c\xd7\x31\xd8\x32\x70\x2c\xfb\xb4\x47\xa4\x90\xa4\xb1\x93\x2c\x2f\xc3\xf2\x64\x87\x70\xeb\xd7\xad\x14\xbb\xba\x85\x7b\xc4\x03\xe7\x69\x49\x55\xcd\xf8\x45\x3a\xdb\xb7\xce\xf3\x89\xef\x6b\x14\x68\x56\xef\x77\x8e\x83\xfb\xbb\x6d\x68\x76\x63\x01\x92\x9a\xfb\xf1\x47\xb3\x1b\x77\x83\x04\x78\xf2\x40\x33\x7c\x9f\x35\xc2\x24\x10\x55\x30\xc5\x15\x47\xb8\x5b\xa2\x4a\xa6\x58\x40\x3b\x7c\x80\x0c\x55\x34\xc5\xfa\xac\x0b\xb3\x4c\x14\xd5\x14\x77\x83\xf7\x30\x43\x40\x93\x4d\x71\x80\x96\x43\x70\x92\xa2\xa9\xa7\x40\xea\x88\xe4\x7f\x39\xea\x86\x94\xc4\x64\x6b\x05\x44\x4a\x96\x42\x37\x35\xcd\x7d\xf2\x06\x19\x44\xbb\x27\xa6\xf9\xbe\x94\x2d\x8d\x69\x52\xb4\xdb\x7d\x50\xff\x65\x1c\x88\x01\x50\x0e\x92\xa1\xd9\xea\x36\x6a\x50\xb9\xc7\x5e\x20\x2e\x39\x28\x31\xc2\xf1\x1a\xc3\x25\x75\xf7\x06\xc1\xb7\xe9\x2c\xf7\xa0\xc5\x7c\xcb\xab\x97\xaf\x61\x00\x14\x89\xec\x7f\xfa\x3b\xfa\x05\x79\xf5\xb5\x4f\xcf\x1f\x64\xa9\x9d\x8e\xad\xa0\x70\xb8\xf3\x2d\xe8\x5b\x5f\x7a\xc0\xf1\x3f\x3f\xc9\x66\x49\xec\xf4\x31\x00\x2a\x40\xee\xfe\x4d\xd4\x28\x3f\x4a\x73\x68\x5d\x19\x2e\xc9\xee\x74\x30\x19\xcb\x1a\x8a\xbd\x57\x48\xf5\xf5\x41\xa6\x73\x40\xe8\x0e\xd7\xee\xe6\x09\xde\x7f\x33\x7b\x9f\xf1\xc2\x07\xf2\xd0\xec\xc6\x01\x72\x60\xc6\x85\x66\x38\x0e\x10\x09\x37\x27\x34\xcb\x71\x80\x02\x58\x79\x43\x95\xaf\xb1\x00\x57\xb8\x23\xa3\x0a\xd8\x58\x40\x2c\x9c\xd6\x68\x12\x36\x0e\x90\x0d\xaf\x34\x34\x0d\x1b\x07\xe8\x26\x86\xdf\x0e\x83\x26\x65\x03\xe9\x47\xf8\x65\x4c\xae\x18\x00\xcd\x21\xbb\x87\x08\xc5\xe0\xc9\x5b\x53\x0d\x3f\xbc\x6c\x98\x5b\x8e\x7c\xb2\xea\xda\x2e\x3c\xe2\x58\x67\x2b\x26\x22\xf4\xb4\xea\x91\x8a\xe4\xf6\x8b\x3d\xb6\x8c\x4c\xbb\xc3\x4c\xad\x32\xf7\xb2\xcc\x4a\xc8\x1c\x97\xf8\x73\x6d\x79\x7c\x9f\xd5\x0b\xb5\xaa\x41\x3f\xe9\x8e\x56\x39\x1f\x39\x3e\xa2\x1f\x8d\x01\x50\x00\x32\xad\xed\x1f\xd2\x66\x7a\x9d\x2b\x3b\xc0\x93\x60\x71\x2c\x8b\xbb\xf0\xc2\xea\x50\xf9\xe8\x95\x87\x23\x78\x69\x6b\x53\x3b\xc7\xfe\x64\x49\x63\x80\xe4\x39\xc4\xe5\xc7\xa7\x7b\x85\xe5\x4c\xdc\x23\x94\x18\xd9\x57\x8f\xdd\xb0\xaf\xd3\x04\x06\x04\xea\x3d\x93\x87\x2f\xd0\x6a\x9e\xcc\x7e\x6a\xfb\x64\xaf\x43\x21\xe7\x88\x36\xdf\xeb\xdc\xb9\x0e\x0a\x8e\x33\x8b\x80\x8f\x84\x2a\xcc\x9b\x92\xbf\x77\xa5\xeb\x5c\xda\x20\xf8\xd8\x15\x44\x6b\xa2\x47\x8d\x01\x50\x33\xb2\x54\x67\x64\xf8\x5e\xeb\x1e\xbf\x62\x75\x22\x60\xb5\xa0\xe6\x09\xc5\x8b\x51\xfd\xc0\xe8\x47\xea\x41\xed\x99\xe7\xca\x31\x09\x29\x85\x1e\x7b\xed\x06\x29\x6c\x97\xa9\x08\xbe\xf8\xc5\x0c\x78\x8b\x72\xd6\xf2\xe8\xff\x38\xd6\x7b\xd8\xee\xdc\x9e\xab\x21\xaa\x3d\x3d\x30\x46\xfd\xe3\x5b\x07\x1e\xef\xbf\x45\x11\xf7\xb8\xe6\xe0\xaa\x82\x16\xc6\xfd\x41\x05\x5e\x05\x68\x71\xc4\x01\x02\xa8\xf6\x0b\x23\x5a\x24\x71\x85\xf1\x1c\x2c\xd3\xa1\x44\x72\x9f\x1f\xc0\x73\x0a\x5a\x28\x71\x80\x66\x38\xa7\xd1\x62\xb9\xdf\xee\x61\x6d\x12\x75\xb7\x05\x0b\xf0\x82\xdb\x0d\xea\x7e\x0b\x4e\xe8\x82\xe7\x75\xb4\x1d\x17\x1c\xe0\xe3\xff\x3f\x0f\x86\xb6\xf1\x02\xa4\x99\x0e\xb3\xfd\x57\xdd\x3d\x90\x2d\xff\xd9\xcd\x0f\xf8\x79\xf6\x1f\x13\xd5\xc8\x88\xb4\x74\x6c\x44\x6c\x07\x5f\x5f\x3b\x75\x85\xef\xb4\x40\x08\x44\xde\x44\xd0\x9b\x41\x88\x01\xd0\x30\x92\x64\x9a\x38\xf7\x4b\x13\xf5\x4c\x7b\x1e\x1b\x7b\x5b\xe8\xf3\xfc\x60\x0a\x5b\x6b\x6d\xf4\xb1\x32\xf3\xc8\x9e\x6a\x15\xf2\xc7\xda\x37\xeb\x30\x00\x9a\x41\x56\xf7\xe1\x09\xe2\x3f\x82\x05\x7e\xd4\xee\x1c\xf6\xa5\xcd\x77\x46\xf0\x35\x46\xaa\x1f\x0a\xd5\xa9\xcd\x8f\x8a\xe7\x3f\xd0\x26\x64\x53\xdb\x4b\x0d\xe4\x32\x1e\x5c\xdc\xc5\x3f\xf9\xd2\x9c\xdc\x48\x27\x4c\xc4\xeb\x12\x4b\x33\x8f\x7b\x52\x50\xd4\x3a\xe5\x76\xfd\x77\xf7\xa2\xd7\xbe\xf1\x97\x78\xff\xcd\x6c\x5c\x7c\x3c\xe0\x27\x80\x66\x37\x0e\x30\x0c\xb3\x4c\x34\xc3\x71\x80\x19\xb8\xba\xa3\x59\xbe\xbf\x10\xe0\x95\x83\xba\xf5\x85\x63\x39\x70\x87\x42\xdd\xfb\xc2\x02\x42\xfe\xff\x6e\x4d\xb4\xdd\x2f\x9c\xfa\x06\x27\x36\xea\xf6\x17\x0e\x00\x9b\x84\xb6\x01\x86\x03\x0c\x52\xc0\xef\x14\x44\xdb\x07\x03\xd2\x87\x75\xf0\x98\xfe\xd3\x89\x90\x3a\x4e\xb3\x2b\x55\xdd\xb3\x21\x41\x8b\x88\x4f\x9d\x15\x6d\x71\x4e\xcb\x0f\xde\x2f\x8b\x90\x4d\x68\xff\x90\x4b\xb9\x2c\x7c\x4b\xca\xf2\xf7\x5e\xcf\x41\x1e\x56\x59\xbb\x31\x65\xf8\x65\xdc\x9e\x25\x14\x93\x14\x71\x8a\x8e\xb4\x7f\x5d\xf0\xe2\xa3\x7e\x91\xdb\x7e\xa6\x03\x41\x6c\x32\xe7\xbf\x8f\xee\x4d\x8d\xc8\xbc\x36\xae\x16\x05\x2e\x4c\x2d\xf7\x63\x04\xe6\x3c\x4b\xfb\x49\x56\xdd\x05\x5b\x4c\x98\xe4\xfd\x31\x57\x49\x8e\x49\x93\x39\x5d\x0d\xd8\x5b\xce\xc8\xe1\x49\xd5\x48\x85\x36\x8d\x45\x2f\xdf\x96\xbf\xf9\x0f\x89\x2c\x38\x44\xdc\x29\x62\x7c\xad\x87\x63\xd3\x6b\xf9\xda\x02\x33\x7d\xe6\x7d\x0c\x80\xda\x90\xac\x25\xf2\xa6\xa6\x94\xed\x68\xdd\x60\xe4\xea\xa7\xde\x4e\xaf\xb4\x13\x24\x9a\x5e\x39\x23\xfc\x4f\xbd\x8e\x24\x7f\x04\xde\x8d\x3d\xac\xbc\xff\xe6\xe6\x7e\xf9\x85\x1b\x38\x9a\x9f\xfb\xfd\x18\x3e\x05\x86\xe6\xe8\xfe\x48\x0d\x2f\x04\x34\x4f\xf7\x8b\x1d\x3c\x6e\xa1\xb9\x8a\x03\xb4\x11\xac\x27\xe3\xbe\x93\xe7\x26\x20\x3e\x39\x71\xdc\xfd\xd9\xf4\x35\x37\xbf\xe7\x4b\x81\x43\x11\xbd\x62\x8c\xab\x3f\x7d\xc7\xa4\x98\x6c\x7f\x6f\xdb\x69\x10\x01\x69\xfb\xdd\x5d\xfb\x20\x06\x00\xa0\x8f\xc8\x26\x78\xc9\xfb\x46\x66\xd2\x88\x7d\x23\xa6\x86\x4d\x4d\xee\x6e\xd6\xd1\xbb\xa6\x49\x82\x9c\x13\x5a\x91\xe3\x1e\xaa\x81\x6e\x6d\xb9\xab\x00\x5a\x47\xe6\xc4\x09\x1f\x05\xe3\x0d\xab\x62\xd3\x8b\xca\xd3\x8c\x1d\x77\x27\x31\x16\x1d\x26\xa3\x65\x1d\x11\x9b\xa1\x9d\xc9\x93\x2f\x9b\x96\x63\x1c\x01\x54\x88\xfc\x43\xa9\xd2\x87\x68\xfc\xe6\xc0\x2f\x44\xaf\x3c\xb2\x25\x8f\x8c\x66\x9b\x54\xcb\x4d\x56\x15\x9d\x79\x79\x95\xf6\x87\x55\xea\x93\x07\xa6\x74\x00\xea\x47\x96\x3a\x09\xd1\x51\xc6\xd4\x53\x43\xa9\x43\xa3\xa9\xe6\xad\x4a\xea\x10\x93\x6e\xd8\xad\x98\x7e\x95\x96\x12\xbe\xb2\xb3\xf3\x5d\x42\xeb\x00\x5a\x41\x56\xba\xa0\xd7\x7f\xa8\x39\x76\xb4\x4f\xec\x3e\xab\xb9\xf6\x50\x32\xf6\x30\xef\xcf\x0b\x9b\x93\xd7\x16\x76\x88\x30\x24\x52\xf6\x55\xb1\xa7\x31\x00\x1a\x45\x5a\xf3\xb4\xf9\x54\xed\xef\x43\x27\xe5\x7a\xc9\xec\x67\xcf\x05\xf1\x33\xff\x74\xad\x5c\xbd\xef\xe3\xfc\xa9\xc2\x3e\xf0\xbb\x9d\x7d\xef\x0b\x47\x00\x35\x21\x33\xce\xc8\x3b\xa0\x52\xe3\x6c\xd3\xf9\x13\xa3\x2e\x02\x81\x92\x81\xbe\x9c\xbf\x93\x07\xe8\x6f\xb2\x53\x7e\xbb\x4d\x80\xf1\x30\xd9\x71\x00\x50\x3b\x92\x80\x1c\x2b\x20\xfc\xe1\x2c\x91\x76\xb7\x25\x23\xc9\x58\xa8\x89\x94\xd4\xf1\xc0\x7c\xed\xcc\xd9\xa3\x47\x34\x3b\x88\x17\xc7\x1e\x0e\x59\x00\xa8\x1f\x29\x8a\xa5\x3b\xab\x91\x06\xf8\xbe\x90\x09\x21\xcf\x1c\x5d\x39\xd8\x10\x4d\x3d\xc6\x69\xc8\x2a\x40\xe4\xfd\xde\xb5\x6e\x86\x85\x3f\xee\xa8\x23\x80\xdc\x91\x9b\xaf\xde\xaa\x21\xb1\xbd\x3c\x47\x23\x2e\x4f\xf2\xdc\xce\x3c\x2d\x2d\x3a\xa7\xef\x70\xc8\xfe\x94\x87\xf1\xa2\xe9\x25\x62\x47\x66\x7e\x7c\x00\x79\x21\x63\xa9\x13\xc1\xb1\xa1\x4f\xcd\x10\xef\xeb\x35\xe1\x2d\xf6\x38\xfc\x4f\x8d\xe1\xda\x1c\xef\xd0\x49\x9a\x49\x33\xd3\x33\xd9\x61\x8b\x0a\x00\x5a\x41\x5a\xb3\xee\xfe\x5c\x51\xc3\xbd\x4c\x22\x48\xf5\x46\x45\x0d\xb8\xf6\xb2\xda\x37\x30\x3d\x49\x83\xcb\x39\x3a\x81\x84\xe3\xd1\x76\xea\x2a\x32\x8c\x33\x1f\xef\x26\x90\x0a\x2a\x15\x9a\x68\x1e\x17\xde\xa6\x31\x22\xa8\xbe\xcd\x2c\xff\xac\x87\xa3\x31\xd5\xfc\x9a\xe2\xe3\xfb\x3b\x7b\x53\x1f\x52\x5d\x1c\xae\x79\x33\xf0\x30\xa8\x31\x85\xf8\x8e\xc2\xe3\xdb\x7e\xeb\xae\x4f\x1c\xfd\x83\x3a\xc2\x19\x48\xb3\xe7\xa9\x36\x0b\xa9\x0f\xae\x00\x00\xb5\x23\x93\x6c\xcc\xff\x30\x6b\x87\x8c\xed\x3c\xa1\x62\x86\xfb\xe7\x7b\xfe\x3e\xee\xcf\xf5\x5a\xaf\x65\x36\x0c\xb8\xbe\xd4\x5b\x56\x77\x3c\x7b\x1c\x40\x3f\x91\x59\x30\x24\x24\x5a\x54\x2f\x7a\xb4\xc6\x02\x53\x5d\x50\x96\x67\x59\x17\xf8\xea\x69\x9b\x39\x2d\x77\xc9\xec\x05\xdd\x97\x72\x69\x99\xb4\x7f\x5d\x9a\x63\x71\xf0\x2a\xff\x01\xb9\xca\xdf\x3e\x8f\xf2\x2b\x13\x8c\xde\x5f\x73\x0c\xd7\x16\xb3\xb2\xed\x1b\xe9\xd1\xbf\x64\x1c\xb4\x37\x9c\x20\x19\x74\xba\x82\xe2\xdd\x33\x37\x99\x8d\x6c\xe6\x96\x77\x62\x03\x6e\x0e\x3c\xc4\x6c\x45\x1d\x7d\x11\xc6\xfe\x22\xfa\xcb\x06\xab\xb8\xf1\x3a\x00\x50\x18\x32\xe6\x97\x05\x69\xa5\xd9\x36\x83\x1b\x0e\xd6\x88\x74\xcb\xaf\xbd\xbe\x23\xfb\x94\x26\xa8\xad\xd2\x29\xfc\x45\x8e\x25\x43\xc5\xc0\x08\x23\x80\x32\x91\x8b\x4f\xee\x76\x4d\x2f\x5b\xb3\x03\x33\x51\x7f\x28\x43\xbc\x73\x9f\x9f\xd0\x84\xac\xb0\xa9\x5b\x5c\x7c\x94\x7e\x95\x52\x75\xb7\x4c\x08\x00\x90\x23\x32\x7f\xbd\x73\x3f\x7c\x92\x1a\xd7\x59\xdc\xfc\x5a\x44\xa7\x70\x21\xa9\xff\x1b\xcb\x6e\x22\x5f\xc6\x5b\x8f\x55\xe6\x03\x8d\xb4\x0f\x24\x09\x00\x34\x82\xfc\x79\xa1\xd6\x52\x43\x9b\xf4\x8f\x35\x1e\xa3\xbe\x09\xd3\x2a\x97\xc2\x89\x73\x3a\xd6\x3c\xb6\x3a\x42\x09\xb3\xc7\x49\xbe\xfb\x1a\xe5\x00\x20\x89\xe4\xdb\x5a\x6f\x87\x76\x7b\xea\x87\x88\x4e\xbf\x71\xdb\x3a\xaa\x6a\x53\x71\x92\xe4\x6d\xba\xa6\xe3\x63\xcf\x98\xe4\xb9\x72\xb7\x29\xcd\x5c\x00\x0d\x20\x9f\x92\x9d\xd6\xc6\x85\x7c\x4f\x05\xc1\x3a\xf7\x41\xa5\xc4\xf2\xcd\xd3\xbf\xbf\x10\xaa\x29\xfa\x57\xb6\x11\xfa\x50\x4a\xeb\xbe\x1c\x60\x06\x00\x6a\x44\x1a\x7f\xb9\xdb\x6b\xb9\x6d\x06\x3f\xe3\x03\x91\x83\xda\xe2\xa3\x06\xae\xb3\x3c\x6a\x03\x5c\x31\xdf\x93\x5e\x96\xfa\xd9\xfc\x92\xbc\xd7\x0c\xa0\x3e\xe4\xee\x58\x81\xcb\x8e\x56\x63\xd0\x49\xf5\x5b\x5b\x7f\xd2\x9d\xb4\xad\x3d\x2c\xdc\x5d\xd5\x6f\xbe\xab\x68\x50\x0d\x28\xb1\x7c\x0c\x72\x14\x01\x80\x32\x90\x3a\x90\x94\xf5\x40\x98\xd1\x31\x99\x9b\xb6\xfa\xe0\x42\xfb\xd7\x4f\x3e\xb1\xaa\xb9\x87\x8f\xd7\xd6\x4d\x4a\x40\x24\x03\xfe\x2b\x69\x4b\x00\x2a\x44\x26\x8d\xdf\xe1\x77\xa3\xea\x4e\xfc\xbf\x95\xe4\x5e\xb3\xe6\x47\xe8\xf2\xd8\x2e\x53\xb1\x73\x7f\x3d\xc7\x70\x80\x6a\xbc\x28\x26\x5b\xf0\x09\x00\xd0\x00\x72\x6d\x8b\xb5\x87\xde\xc8\x35\x38\xb9\xf5\xe8\xfe\x88\xfc\xea\xfa\x64\x7c\x92\x14\xcd\x83\x7b\x8f\x7a\x0d\x5b\xd5\x22\x4e\xd9\xca\xa8\xa9\x03\xe8\x3b\x32\x71\x6e\x85\xff\xc9\xeb\x08\x6d\xa1\x70\x16\x4d\x7d\xe2\xde\xa6\xa4\xd9\x32\x3d\x1f\xae\x55\x10\xde\xe1\xf1\x88\xd8\xf6\x82\x02\x55\x3d\xb2\x6a\x94\x55\x49\x42\x89\x5f\x82\xa5\xcf\x54\x84\xba\x6d\x6e\x8b\x17\x6d\xab\x0b\x74\xd9\x89\xd2\xa6\x84\x7e\x68\xa7\x4b\x2c\xd8\x46\x9e\xac\xec\xf3\xd9\xca\x98\x72\x39\xf0\xfd\xdb\x09\x23\xb3\x1d\xed\x9b\xd4\xee\xba\x53\x39\x56\x84\x57\xbc\xf3\xad\xca\x25\xee\x8a\xdf\x43\x5c\x6a\x76\xd8\xe7\x73\x66\x1a\xdf\x99\x5b\xb7\xc5\x99\xe4\xe7\x58\x7d\xad\xc5\xbf\xf8\xbf\x1d\x92\x0e\x94\x1c\xb7\xfb\x95\xd5\x65\xd3\x0b\x00\x14\x8b\x24\xb1\xa7\xe5\x89\x0f\x5e\xbc\x52\xf4\x52\x56\x9c\xdc\x51\x46\x4c\x64\x65\x99\x8d\x3c\x88\x50\x3e\xe5\xe9\x6b\x6b\x72\xe7\xa8\xc1\x98\x36\x00\xfd\x44\x46\x9b\xd3\x8b\x3b\xf1\x4d\x60\xaa\x50\xc1\x2f\xe1\xd1\x83\xd4\xbd\x45\x51\xa5\x2a\xb9\xf1\xc7\xbf\x9e\x67\x7f\x75\xc4\x7d\xac\x4d\x1e\x79\x90\xf5\xfd\xb6\x75\x4f\x6c\xae\xa3\x5b\x1d\xc9\xeb\x90\x17\x7c\x5e\x17\x8f\xe6\xb7\xad\xb5\x89\xca\xc5\xdf\x8d\x69\xb2\x5c\xc1\xb7\x09\x75\x04\x90\x2f\xb2\xe8\xfe\xf0\x6c\xa4\xe5\xa5\xba\x28\x16\x9f\xdd\x1a\x3b\x78\xc0\xa8\x2c\x6f\xbe\xa1\xdd\x62\xc8\x5e\x3b\x52\xe8\x4b\x3d\xf4\x51\xca\x0f\x40\x7e\xc8\xb4\xba\x1b\xca\xe7\x6b\x7e\xe5\xda\x2e\xde\x25\x86\xe6\xc9\xe6\xdf\x23\x5a\x6a\xed\x9c\x4f\xb2\xf8\x3f\x8e\x7e\x7d\xe9\x10\xac\xf7\x8e\x0d\x40\x0d\xc8\x24\x5f\x3b\x4f\xbb\x55\x1c\x75\xef\x6c\xc6\x63\x5d\x0d\xd2\xdb\xce\xcc\xaa\x8b\x27\xb2\x0e\x6a\x3e\x8f\x08\xd9\x79\xee\xf0\x8b\x7d\x58\x07\x00\x28\x0a\x79\x40\xa6\xe5\x67\x49\xee\x59\x8d\xbe\xd3\x89\x5f\x95\x8f\xde\x31\x3f\xe7\x42\x3e\xe0\x9c\x9d\x3b\x49\x62\xfc\xae\x4e\xcb\x52\x40\x6e\xae\x0a\x40\x59\xc8\xcb\xd3\xdb\x0c\xcf\xcf\x92\xac\x1d\x7b\x77\x20\x63\xbc\xd6\x89\xd5\xdc\xce\x1c\x8c\x44\x6a\xd7\xd5\xd5\xcf\x8f\x5c\xb4\xd3\x2f\x10\x43\x1e\x7c\x22\x79\xf1\x92\xf3\xaa\xc0\x78\x9e\xe6\xab\x27\x6d\x3e\x45\xc3\x92\x9b\x13\xa7\x8a\x92\x43\x7f\xcc\x3e\x6b\xb5\x69\x3b\xf7\x49\x0c\x00\x49\xe4\x47\xf9\x18\xd2\x1e\x74\xdc\xd7\x72\xf4\xbd\xa7\x19\x47\x75\xa9\xca\x93\xd9\xc7\x98\xcf\x81\xff\x6d\x75\xb5\xb7\xe3\xf6\x6c\xd6\x5a\xc7\x5d\x00\x7d\x45\xfa\x39\xc4\x72\xfe\x9d\x97\x05\xcb\x47\xdd\x44\xff\xe4\x20\x26\xff\x70\xcd\x0a\xde\xa9\x40\x6e\x1b\xad\x69\x46\x25\xcb\x97\x95\xd6\x06\x00\x40\xb9\xc8\xfc\x0e\xb3\xa3\x08\x5f\xc8\x7a\xfc\xfa\x2c\x75\x6b\xdd\xbd\x1c\x26\x41\x47\x93\x65\x3e\xf3\xae\x82\x03\x4f\xe9\x44\xce\x48\xa8\x60\x88\x00\x54\x87\x5c\x3e\xf3\x23\xf9\x13\x4f\xcd\xe8\x5a\x16\xd4\x1f\xa7\x75\x37\xc5\x45\xd5\x7d\xe9\x36\x3f\x96\xbf\x21\xdc\xf0\x43\x69\x44\xd6\xee\xa5\x3d\xe2\xd2\x9d\xe1\x51\xdf\x1e\x4f\x0a\x9f\x42\xd5\xaf\xa3\x37\x45\xd4\x1f\x9c\x54\x2e\xbd\xbd\xb9\x75\xbf\x78\xa1\xbe\x8b\x58\x33\xa4\x69\x04\xb9\xed\x13\x36\xe5\xc7\xae\xce\x36\x62\xd9\xf2\x51\x7f\x7b\x88\xb6\xc5\xa9\x32\xf0\xb6\x99\xc9\x9b\xc9\x7a\xab\x4e\x65\xd5\x1b\x5a\xb6\x18\x00\x39\x23\x19\xe4\x56\xce\xf4\xf8\x1d\x5a\x35\x92\x04\x5b\xb3\x27\xc3\x2f\x54\x74\x43\xb2\x9d\x32\xba\x75\x69\x9f\xe5\x9a\x06\xae\xb1\xa8\x0e\x37\x39\x02\x28\x10\x79\x66\x6f\x9d\xcc\x9b\x78\xe3\x94\x39\x9f\x39\xc1\xb9\xc9\xe1\xf4\x0b\x5d\xe1\x86\xb1\x87\x0b\xf9\x3d\x32\x92\x46\x68\xbb\x44\x15\xce\x0b\x03\x28\x15\x79\x88\x64\xdd\x3c\xef\x8a\x57\x85\xc9\x6f\x5e\xe3\x83\x4e\xfc\x55\x52\x8a\x4a\xf5\x1e\xea\x6f\xae\xd5\x68\x69\xc9\xcd\x04\x3d\x27\x4e\x3e\x05\xa0\x09\xa4\x35\x8c\x7a\x82\x6a\x76\x8d\x5a\xe3\xca\x09\x13\x96\xde\xd6\x75\x99\x26\x4c\x45\x7e\x9c\xbb\x6f\xee\x15\x4a\x9b\xf2\x6b\xb0\x4e\xca\xf2\xfe\x23\xe3\x92\x64\xfa\x6f\x2e\x85\x27\x0a\x34\xce\x85\x03\xac\xc3\xfc\x14\x95\x74\x61\x01\x85\xf0\xff\x20\x50\x69\x17\x16\xd0\x0f\x0f\x6a\x68\xc4\x0b\x07\x58\x81\x07\x35\x34\xe6\x85\x03\x8c\xc2\x26\xa1\x52\x2f\x2c\xa0\x09\x16\xfa\x50\xc9\x17\x16\xd0\x0e\x4b\x16\x68\xf4\x6b\xdf\x69\x58\x19\x44\xe5\x5f\x58\x80\x3b\x3c\x3b\xa2\x32\x30\x2c\xc0\x0b\x0e\x2b\x1a\x07\xdb\x0f\xeb\x51\x78\x14\x44\xa3\x62\x40\x9a\xd0\x01\xdf\x69\x6f\x14\x1c\x40\x16\xcd\x5b\x45\xaa\x65\x3a\x79\x3c\x1b\x26\x44\xf3\x8a\x7d\xd5\x2b\x3c\xb6\x5a\xec\x1a\xa7\xca\x1d\x20\x46\x76\x6f\xb5\x9e\x7b\x93\x2f\x31\x00\xaa\x44\x8e\x8e\x74\x73\x5e\x65\xb9\x79\x83\x92\x7c\x42\x32\x89\x99\x10\x01\x8b\x1e\x75\x90\xa1\xe0\x45\x7b\x81\xb0\xf6\xf3\xb2\xfd\x7c\xf2\xec\x18\x00\x85\x22\xbb\x09\x6f\xbc\xcb\x98\x32\x93\xff\xbb\x62\xaa\xa9\x1f\x6f\x82\xec\xaa\x1f\x5b\x9a\x75\x9d\x9a\x8b\x79\x79\x80\xfc\x4d\x19\x47\xfa\x55\xfc\xbd\x01\x18\x59\x4e\x84\xd9\xb4\x9a\x4c\x4b\xce\xae\x59\xe1\x35\x1e\xbe\x02\x52\xf2\xee\x5b\x38\x4c\x92\x9d\x95\xdf\x98\x33\xc9\xbe\x32\x56\x2f\x1b\x8c\x01\xd0\x0e\xd2\xfe\x2a\xd1\x8e\xde\xe7\xa1\xd4\xae\xb5\x97\xce\x6b\xd9\xa5\x4b\x5a\x35\x65\x98\x65\xfa\xae\xaa\x77\xe7\x3e\x93\xdc\x4c\x79\x61\xba\xff\x7a\x79\x34\x37\x71\xf1\x1c\x80\xb3\x0e\xcd\x4f\x1c\xa0\x12\x9e\x1d\xd1\x1c\xc5\x01\x42\x61\x11\x05\xcd\x53\x1c\xa0\x08\x5e\x39\x68\xae\xe2\x00\x3b\xff\xff\x80\x19\x1a\xdb\xc6\x02\xc2\xe1\xfd\x5b\x54\xba\x8d\x5b\x39\x70\x7d\x41\x23\xdc\x38\xc0\xcf\x43\xb0\xb2\x86\xc6\xbb\x81\x34\x13\xde\x61\x5e\x27\x0c\x80\xfa\x90\x4d\xac\x59\xd0\x37\x43\x90\xfb\x4a\xde\x92\xad\x70\x62\x6a\x40\x73\xb8\xba\xc8\xa5\x84\x97\x77\x7e\x68\xd4\xcb\x1c\xe9\xe3\x0a\xb0\xba\x8e\x01\xd0\x16\x72\x86\x51\x30\x99\x21\xa3\x17\xe6\x7a\xfb\xda\xe1\xdc\x53\xd3\xf9\xcb\x6a\xda\xf4\xc6\x10\x67\x66\x54\x4c\xc8\xb1\x3a\x39\xd2\xef\x33\xfc\x18\x00\x45\x21\xd3\x68\xa6\x8d\x52\x6e\xc0\xa0\xe9\xf5\xd3\xf0\x69\x93\x97\xdc\xe4\x67\xd8\x88\xee\x49\x13\x48\xac\x37\x34\x77\x90\xb3\xe5\x65\xbe\x3f\x87\x01\xd0\x3c\x92\xf2\x0a\x55\x6f\xd4\xcf\x30\xbe\x11\x9e\x62\xa0\xda\x91\xaa\xd0\x30\x78\xea\xde\x45\x7d\xc1\xa0\x4f\x74\x9d\xd8\x24\xdf\xb0\xf1\x7c\x22\xef\xbf\x99\x8d\x8b\x4f\x1f\x2c\xb7\xa2\xd9\x8d\x03\x6c\xc1\xa5\x08\xcd\x70\x1c\x20\x0a\x4e\x0a\x34\xcb\x71\x80\x79\xf8\x19\xa3\x4e\x3e\x58\x40\x0e\xac\x7a\xa3\x8e\x3e\x58\x40\x18\x5c\xec\x50\x87\x1f\x2c\x20\x13\xee\x83\xa8\xd3\x0f\x16\xe0\xf8\x7f\xa7\xd1\xe6\x1f\x2c\x60\x04\x7e\xc9\x10\xea\x04\xf4\x1f\x40\x12\x7e\x6e\xa8\x23\x10\xae\xbe\xc0\x51\x45\x9d\x81\xb0\x80\x46\xd8\x05\xd4\x29\x08\x97\x4a\xf0\xd9\x0a\xd4\x31\x08\x0b\xc8\x80\x37\xea\x51\x07\x21\x1c\x59\x80\x0b\x12\xea\x24\x84\x73\x1a\x6e\xb4\x68\xb3\x10\x0e\xf0\x9d\x6c\x7d\x06\xff\xdf\x46\x22\x20\x75\x08\x0f\x0f\x00\x20\x29\x84\xfc\x6b\x88\xc7\x93\xd0\x1d\xaa\xca\xde\xb8\x73\x57\x86\x44\x2c\x4e\xc5\xdf\x66\xe2\xa9\xfc\xdc\x2a\xcc\x03\x1d\xfa\x54\xa8\x60\x31\xdd\x01\xa0\x68\x24\x5b\x7b\x64\x9a\xfc\x42\x2d\x32\x89\x35\xd9\xad\x68\xc3\xf8\xa2\x78\x3a\x6b\x96\x93\x3e\x33\x47\xe1\x99\x9a\xa7\x53\xde\x76\x3f\xeb\x64\x00\x80\x72\x90\x64\xf0\xe7\xec\xf6\x4f\x9e\x1a\xaf\x63\x6a\x11\xfc\xcc\xbc\xf2\xf4\xdd\x49\xce\x52\x56\xb7\xc8\x5e\x5e\x4f\x36\xa9\x3c\x25\x65\x77\x47\x19\x40\x7d\xc8\x0e\x98\x53\x9b\x7b\xfe\x72\x2f\x95\x91\x36\x83\x47\xfe\x85\x23\x43\x6f\x39\xe8\xeb\x67\x0e\x2b\xf8\xef\xaa\xd7\xfe\x21\xe8\xf8\x74\xe0\x33\xcf\x3f\x1a\x8d\xcd\x38\xa1\xfd\x58\xa2\x5a\x8d\x8d\x65\x34\xac\x24\xa2\x9a\x8d\x5b\xc7\xf0\xb9\x48\x34\xc3\xf7\x33\x8e\x68\xfd\x07\xfe\xbf\x4d\xa5\x00\xba\xed\xb6\x57\xda\x7d\xff\xfa\xc3\x6a\x64\xbe\x81\xb6\x36\x19\x7e\xeb\xe7\x76\xef\xbe\xe6\x31\xed\x77\x7c\xe6\x0c\x03\x49\x25\x86\x90\xeb\xb5\x5f\x4d\x3e\x21\xbf\x30\x00\xfa\x82\x0c\xff\x9f\xae\x59\x1b\xea\xda\x8a\xe9\x7e\xef\xb7\x6a\x74\x42\xed\xd1\xc6\x54\xa3\x46\x3a\x78\x6f\x87\x63\xee\xac\xb7\x3f\x38\xe2\x7d\x12\x03\xa0\x60\xa4\x58\xa6\xc2\x77\x50\x33\xa8\x42\x4a\x42\xef\x4a\x0c\x6d\x45\xbb\xc1\x9b\x70\x09\x03\xb1\x4b\x62\x5c\xd4\x0d\xd2\x65\x9f\x82\x84\x62\xc7\xf7\xd6\x3d\x52\xa3\x5a\x55\x79\xf2\xe7\x54\xd6\xab\x51\x17\xae\x0f\xcb\x6f\xac\xdc\xa6\xb6\x88\x58\x4d\x2f\x5e\x52\x27\x5e\x57\xb1\x5c\x50\x54\xdd\x92\xe1\xfd\x37\xb3\x71\xd1\xf1\x85\x2b\x35\x9a\xdd\x38\xc0\x17\x38\xfe\x68\x86\xe3\x00\xc1\x30\xcb\x44\xb3\x7c\xbf\xca\x1d\x81\xbb\x31\xaa\x36\x20\xed\xc4\xc4\x84\xfd\x76\x24\xf2\x11\x24\xd3\xc8\x1f\x4a\xd0\xff\xc1\x72\x5f\x9b\x9f\xf6\x98\x49\x4b\xeb\xfa\xaa\x3a\xad\xc1\x26\x8d\xfe\xfb\x44\xff\xc4\x8d\xaf\x49\x09\x18\x00\xc5\x21\x35\x02\xe1\x37\xcb\x35\x67\xf0\xc9\x18\x44\x78\xa3\x69\x45\xbb\x45\x09\xea\x76\x7e\xeb\xe2\x6f\xa4\xda\x5e\xe8\x23\x48\x2d\x5d\xd9\xad\xc7\x00\x68\x16\x39\x82\xf2\x7f\x7d\x50\x1c\x26\x53\xfb\xb9\x58\xd1\x4b\x90\x46\xe8\x96\xd9\x85\xcf\xfc\x9c\x75\x93\xe7\x04\x59\xce\x49\x5d\xbf\x29\xb9\xf0\x0a\x03\xa0\x2a\x64\xf7\xce\x22\xf9\x31\xcc\x4a\x21\x4f\xfe\xe7\xc4\x13\x16\x5b\x5a\x42\xd7\xa8\xc4\x4b\xa3\x5f\x62\xa9\x6d\x5f\x62\xfc\x75\x2f\x7d\x9d\xdc\xdf\xbf\x45\x33\x1b\x17\x9f\x6f\xf0\x13\x40\xb3\x1b\x07\x88\x83\x4b\x28\x9a\xe1\x38\xc0\x2c\x5c\x11\xd1\x2c\xc7\x01\xaa\xe0\x36\x80\xaa\xce\x60\x01\xb1\x30\xcd\x44\xd3\x67\xf6\x29\xda\xff\x3f\x4a\x84\x26\xd3\x00\x69\xcc\xe1\x43\xff\xbd\xde\xb0\x01\x59\x46\x17\x21\xb5\x58\x92\x01\x91\x23\xa4\x82\xe7\xae\x9c\x14\x18\xad\xef\x0a\xc7\x1c\xfd\x39\xb8\x12\x11\x24\xfd\xe2\xf4\x41\x2a\x9a\xbd\x87\x1c\x86\x64\xfa\x45\x14\x14\x92\x39\x7a\x06\xc1\x26\xa5\x0a\x63\xe7\x4f\xde\xdd\x20\x39\xeb\xf6\xcd\xff\x2e\xe7\xf1\xe2\xb4\xdb\x40\x99\x6e\xd8\x15\x03\xa0\x18\x24\x05\x14\x5f\x4e\xe1\xca\xa3\x57\x8f\xcb\x4b\xa4\xb9\xd1\x4f\x23\xef\xc2\xff\x23\xf4\xcd\xe3\x25\x71\x8d\xed\x90\x64\xda\x5f\x35\x1c\x07\x31\x40\xd2\x0a\x71\x39\xfe\x5d\xad\xdb\x6a\x2f\x5e\xf2\x3e\x56\x75\x77\x90\xe3\x9b\xdf\x62\x4e\xee\x3b\x72\x4d\x9e\x5b\xa3\x35\x6a\x11\x0c\xa7\x10\xa8\x61\x00\xf4\x09\x99\x43\x32\xfc\x5d\x39\x0b\xf8\x8f\x74\xd3\xab\x2a\x42\xa5\xd6\x05\x73\x6a\xb6\x37\xae\xb6\x45\xbd\x95\x6c\x4b\xb1\xc3\x87\xcc\x15\x2f\xf3\xfe\x9b\x97\xb8\x70\x36\xc0\x65\x17\xcd\xcd\x7d\x36\x04\x77\x55\x34\x3f\x71\x80\x18\xf8\xdd\x71\x68\x9e\xe2\x3a\x87\xd5\xfe\x0d\xd0\x3c\xc5\xdd\xe0\x13\x9c\x73\xa8\x3a\x1c\xae\xd4\xc1\x13\x38\xaa\x12\x87\x05\xf8\xc1\x77\x40\xd5\xe2\x70\x51\x85\xf9\x16\xaa\x18\x87\xa3\xbd\xf0\xc1\x51\x34\x39\x0e\x07\xc8\xa2\x80\x0f\x78\xa1\xaa\x72\xd2\xf8\x0e\x84\xff\x7d\x06\x3d\x09\xa9\xfb\x91\x76\xb1\xf3\xab\xee\xbe\x3c\x5d\x70\xac\x75\x6c\x3a\x06\xaf\xfb\x5b\xec\x92\x80\x12\x43\x25\xfe\x14\xf8\x4c\x34\x3f\xb2\x6a\x0e\x00\x54\x81\xac\xa5\x55\x9f\x13\x01\x83\x9f\xd1\x79\xb9\x1c\x01\x86\x77\xe5\x05\x90\xd9\xef\x5a\x15\xc3\x4b\x0f\xcd\x66\x66\xa5\x26\xae\xb7\xba\x3c\x04\xd0\x06\xb2\x34\x7e\xb3\xb4\x19\xea\x36\x3d\x49\x1c\x2b\x1b\x18\x35\x4a\x25\x44\x03\xfd\x6a\x7e\xe9\xf4\x29\xe8\xb5\x6f\xa9\x94\x1d\xbe\x62\x93\x2c\x06\x40\x53\x48\xf1\x5c\x34\x2e\xa1\x2b\x8b\x37\x23\x53\x70\x6d\x38\xe2\xc9\x83\x4f\x9d\x16\xad\xda\xde\x67\x42\x2e\x8b\x58\x94\x14\x17\x3f\xa3\x70\x69\xe6\xfd\x47\xab\xb1\xe1\x49\x82\xe3\x89\x6a\x36\x16\x50\x01\xd7\x52\x34\xc3\x71\x80\x0d\xb8\x34\xa2\x59\x8e\x03\x4c\xe1\xef\xaf\x03\x54\x5d\x14\xbb\x0e\x9e\xc0\xc3\x2b\x9a\x30\x8a\xbd\xc1\x57\x38\xe9\x50\x95\x51\x2c\x20\x17\x76\x01\x4d\x1b\xc5\x01\xea\xfe\x7f\xaa\x10\x4d\x22\x05\x52\x34\x87\xff\x7b\xdf\x57\x3d\xf2\x21\x3f\x13\x8a\xee\x89\x15\x3b\x10\x56\x38\x12\x9a\x92\xa0\x48\xb0\xb6\x94\x3b\x25\xf2\xf1\x75\xf8\xcd\x60\xab\xdf\x21\xd7\xe7\x02\xf2\xf7\x68\x3e\x32\x89\x54\x94\xcd\x73\x53\x23\x52\x1b\x8c\x65\x78\x54\xf9\xc8\x02\xc8\x4e\xdd\x4f\xcb\x79\x81\xb1\x26\x1f\x49\xd6\x96\x4f\xcd\xeb\x2e\xc6\x00\x28\x0d\x79\xbc\x8b\x44\x94\x50\x90\x5f\x8e\x8a\x7e\x8e\x3e\xe1\x07\xbb\x76\x8e\xb5\xf8\xeb\x88\x32\x0d\xe6\xa7\xbd\xfd\x9c\x59\x49\x4e\xca\xd5\x7b\xa5\xda\x0b\xb9\x06\xe6\x6d\x25\xf0\xf0\xe9\xf0\x5f\x07\x4a\x56\x34\x87\x9a\xc8\x06\x5a\x5b\xab\x48\xe4\x13\xbf\xca\x57\x8b\xfc\x51\x07\x5e\xd7\x9f\xe7\xfd\x37\xb3\x71\xe1\xa9\x87\x47\x1a\x34\xbb\xf7\x47\x1a\xf8\x01\xa0\x19\x8e\x03\xa4\xc1\x47\x30\xd0\x2c\xdf\x17\xea\x28\xe0\x7f\x59\xa0\x29\xd5\x40\xea\x30\xd3\xbb\xbd\x27\x96\xf2\x97\x42\x7c\xc5\xf6\x9d\x1c\xef\xd3\x02\x12\xaf\x79\x3b\x77\x09\xda\x43\xb6\x76\x64\xec\xea\x5b\x11\xe3\x2c\x49\x1f\xa4\xf2\xd3\xd5\x20\x0c\x90\x44\xee\x26\x3e\xfc\xb6\x4c\x57\xc1\x36\xea\xd3\xe3\xc1\x18\x19\x7c\xd0\x47\xc6\x83\xf9\x12\x97\x83\xc5\x9b\x71\xa9\x09\x1d\x67\xa6\xb7\xf9\x6f\x01\x80\x7c\x90\xbd\x95\x54\xcb\x8b\xc6\x5d\xea\xdc\x93\xad\x84\xd3\x2c\x5e\x16\x8d\x1e\x47\x33\x3d\xa6\x0e\xad\xdf\x2b\x3a\x74\xf5\xb0\x84\x51\xe9\xca\x47\x00\x7d\x40\xaa\x19\x73\x1a\x3b\x22\x11\x4e\x85\x8f\x99\xb4\x97\xae\x52\x7e\x16\x78\xeb\x1c\xbc\x41\xaf\x42\x65\xfa\xfb\xcf\x0b\x9f\xa1\x37\x61\xe3\x1a\x18\x00\x35\x23\xd5\x73\xee\xe9\x9d\x9f\x04\x39\x72\xef\x15\xb2\x75\xf2\x33\xa6\x6e\xaf\xaf\x92\x2c\xd7\x5d\x7f\x16\x33\x78\x86\xe1\xe4\xc9\xb9\x5c\x75\x49\xde\x7f\x73\x12\x17\xcc\x14\xf8\x4b\xae\xa8\x6e\x62\x57\x30\x2c\x1c\xa0\xba\x89\xbd\x81\x0f\xdc\x5b\xd1\x1c\xc5\x01\x3e\xc0\x63\x3a\x9a\xa7\x38\x40\x33\x7c\xd6\x0c\x6d\x23\x02\x07\x70\x86\xf9\x01\xea\x4e\x04\x16\x10\x08\xdf\x01\x75\x2f\x02\x0b\x48\x85\x2b\x2f\xda\x6e\x04\x0e\x30\x41\xb8\x5e\x7a\x12\x8b\x70\x69\x38\xf6\x33\xf3\x19\xeb\xf5\xe3\x37\x7f\x79\xa8\x6c\x39\xd7\x0d\x88\xd2\x05\xbc\xac\xa4\xb3\xd6\x89\x8a\x5f\x62\xdc\x3c\xc1\x0c\xa4\x37\x76\x70\xdf\xb6\xc9\x46\x8e\x5a\x5f\xfa\x58\x22\x64\xcb\x58\x13\x56\x86\x8c\x67\xe2\xf4\x6c\x1b\xfe\xd0\x08\x35\x6e\x52\x29\xfb\xbd\x93\x6c\xaa\x5a\xa4\x8d\x96\x02\x50\x1f\x72\x2c\xe0\xd3\xef\xf7\x60\xca\xc9\x77\x25\x12\x55\x33\x7b\x77\xf3\xc0\x7d\x39\x39\x6f\x86\xa1\x37\x4a\x54\xed\xe4\x05\xc2\x8f\xad\xa3\xf2\x01\x34\x8c\x5c\x33\x5d\xa7\xe3\xde\x9d\x78\x77\xd8\xe2\x8c\xf1\xd7\x0b\xb6\x9e\x9e\xe1\x46\xf5\xc7\x38\xc5\x6c\xc8\x97\x82\xc5\xbb\x56\x25\x17\x35\xd7\x01\x80\x9a\x91\x55\x91\x1d\x3f\x5c\xee\x16\xff\x84\x82\x24\x69\x0c\x97\xe5\x65\xa9\xc6\x76\x69\xed\xd8\xe7\xc5\xe2\x26\xdc\x64\xc9\xec\x86\x33\xdf\x4c\x00\x34\x88\x9c\xfb\x0c\x3c\x69\x8c\xfb\x98\x0e\x2a\x71\x7e\x66\xfd\x5a\x11\x43\x16\xca\xf2\x71\x8b\xe0\xeb\x1c\x77\x33\x61\x6c\xa9\x7e\x5f\x62\xf1\x71\x47\x00\xf5\x21\xe7\x56\x9b\x00\x2f\xb5\x7c\x73\x8b\x97\x41\x84\xf1\x57\xba\x26\x54\x05\x5d\x0b\x13\x2c\xdc\x04\xac\xa3\xc1\xbb\x85\x58\xba\xab\xe9\xee\x00\x5a\x41\x6e\xc1\xb7\xd5\x8b\xa9\x9f\x2e\x3a\x32\x8d\x7f\x4c\x35\x5d\x76\xac\x66\x49\xf0\x6b\xdf\x4f\x47\x4e\x85\x83\xa2\x63\x6f\x99\x69\xc8\xf9\x4f\x01\x68\x03\xa9\x1a\xcc\xb5\xa8\xed\xca\x26\xf3\x9c\x21\x9a\x5c\xd3\xd5\x54\xe9\xde\x2c\x49\x66\xe4\xb6\x51\xae\x66\x5c\x61\xa9\xf6\x90\x78\x69\xf6\x1d\x00\xa8\x12\x79\xe4\x0a\x6f\x2e\x4a\xeb\x42\x62\xc0\x84\xde\x78\x99\xbb\x63\xbf\x51\x12\xdf\x4f\xcd\x7c\xab\x40\xbb\x4e\x3f\xad\x43\x6e\x3a\xf7\x2f\x29\x00\x68\x0d\x59\x20\xf4\x6e\xac\xdc\x1b\x09\xa4\x2c\xe5\xe3\x53\x29\x53\x34\x34\xd3\x88\x7e\xc3\xd7\x4e\xed\xc2\xc6\x3d\x9b\xb6\xeb\x53\xd2\x21\x48\xb7\xd7\xf7\x90\xb1\x3f\x7f\x9b\x8a\x6f\x7c\xa2\xdd\x25\xd9\xc8\x60\x60\x35\xe1\x3a\x85\x9f\x56\x2a\xb9\x96\xac\x90\xef\x11\x36\xed\x47\xae\x21\x67\x14\xf6\xba\x18\xb2\x03\x94\xda\x2f\x27\xfe\x79\xb1\x66\x14\x20\xec\xe1\x78\xed\x1e\x7e\xd6\x11\xf1\xc5\xb5\xa6\xf4\xf1\xd8\x4b\xbf\x54\x5c\xb6\xfb\x9b\x1e\x02\x00\x05\x23\x83\x59\x90\xdd\x15\xcc\x21\x53\xf3\x54\x42\x95\xc6\x29\x1a\x50\x0d\x4c\x1e\x38\x97\xf4\x54\x38\xe5\x79\xf7\x19\x2e\x7c\x76\x23\xe9\xaf\x00\x6a\x43\x7a\x7b\xd0\xe8\x75\x57\x6e\xde\xc7\x34\x25\xc7\xf0\x1f\x97\xe9\xdf\x50\x30\xbc\xa2\x59\x67\x98\x3f\xff\x85\xe9\xca\x83\x45\x4d\xe2\x5a\x4f\xc4\xa5\xed\xe9\x9d\xce\x11\x35\x4a\x89\xf6\x36\x77\x28\xfc\xc4\x13\xf4\x54\x44\xf8\xb3\x4c\x09\xc6\x1e\x75\x8c\x8e\xbe\x77\xed\x3c\x4d\x0d\x00\x14\x85\x8c\xcc\xe5\xa9\x5b\x0e\xdc\xb6\x05\x4e\x84\x94\x1b\xf3\x2f\x47\x28\x8f\xc4\x3a\xce\x08\xb4\x58\x98\x35\xbe\x6c\x0e\xe5\xb8\xc0\x29\x9b\x0e\xa0\x24\x64\xd6\x3c\x7b\xf5\x23\xad\x86\xa6\xa0\xb6\x1d\xb0\x53\x1a\xcc\x67\xc9\x1b\x25\xfb\x4c\x3d\x19\x3d\xa9\x6d\xe5\xfd\xbd\xa0\xa4\xc7\xba\x08\x71\xe9\x38\xc7\xdc\x85\x9b\xc1\xf5\xa2\xb5\x2c\x19\x1f\x28\xb5\xee\x48\xd3\xdd\x0f\x11\xa9\x7b\x38\x72\x61\x77\x2c\x7b\xc0\x84\x58\x8f\x1b\x00\x08\x83\xec\xba\x92\x33\xc9\x3e\xac\x49\x59\x4f\x66\x16\x8c\xd6\x9f\x97\xf2\x1d\x53\x4a\xf5\x1f\x9f\x3a\x70\xc0\xe4\xc2\x83\xc1\xcc\xc1\xf7\x6f\x15\x00\x94\x8e\x9c\x8f\x0c\xdd\x83\x26\xa2\x4a\x3e\xe0\x99\x92\x99\xe6\x77\x3d\x3b\xbb\xbb\xe8\xd9\x24\x74\x54\x7f\x40\x32\xb9\xae\x21\xda\x55\x5c\x5b\x09\x03\x24\xd9\x91\x33\x73\xc4\x2b\xcb\xfe\xa7\xaf\x5f\xfe\x9e\xed\x2b\xe3\xc3\xa7\x36\xe6\x78\xc3\x3e\x41\x20\x2a\x60\xfa\xfc\x7c\x7f\xdb\x35\x92\xb2\x8f\x8e\x40\xf2\x06\x92\x32\xdc\x26\x21\xba\xfe\xc2\xa2\x92\x69\x4b\xc8\xfa\x39\x3e\xb9\xa1\xf3\x97\xa3\xee\xae\x6a\xb5\x81\x29\xac\x3f\x2d\x17\x63\xa6\xae\x00\x28\x1b\x99\x2f\x61\x79\xc5\x4e\x41\x6e\xb7\x1f\xcf\xad\xb4\x8f\xba\x6e\x5a\xc4\x25\x5d\x6e\xf7\x02\x79\xd9\xe5\x0c\xf7\x18\xc7\xbc\x86\x27\x0f\x01\x68\x17\x69\x7b\xac\x0b\xc3\x11\xdd\xb3\x22\x4e\x3c\x98\xd8\xde\x84\x9e\x24\x9d\x07\x12\xde\xa7\x6e\x2b\xcc\xd9\x0f\x7d\x76\xa9\x79\xa6\x7c\x1e\xb9\xaa\x8f\x9c\x97\x67\x8e\x0e\xfd\x7c\xca\x41\xa7\xe8\xfe\xf0\xe3\x33\x32\xa5\x5b\x11\xf1\x2d\x5a\xab\xd1\xde\xc9\xbe\xd3\x8a\x54\x37\xa3\x1c\x01\x14\x81\xec\x6d\x0c\x84\x9e\x64\x3b\x56\xee\xb6\x3e\xb1\xb6\x0b\xb1\xb7\x77\x6f\xd2\x70\x55\xdc\x33\x8f\x9b\x39\xdb\x8c\xd9\xf6\x5b\x7f\x35\x7e\x1a\x40\x19\xc8\xc7\x7f\x7f\xa8\x76\xe9\xbc\x7e\x52\x88\x26\x91\xa5\x99\xdc\x5b\x3f\xd2\xae\x07\xae\x7c\x39\xf9\xd9\x8a\xc1\x42\x3c\x55\x09\x89\x5c\xef\x00\xb4\x88\x3c\xa2\xe0\xf8\x6a\x89\x90\xd1\xf3\xf1\xf3\x52\x35\x97\x09\xf1\xc5\xb7\x17\x43\xa8\x1d\x75\x03\x3b\x5a\x8f\x2f\x5d\xb7\x70\x69\x49\x95\x3b\x87\x01\xd0\x02\x72\x59\x2f\x94\x56\xda\x53\xbc\x2c\x74\x0f\xc1\x80\x33\x87\x4f\x07\xd9\x32\xd8\x96\x12\xaa\xb4\x27\xea\xf4\xcb\x9f\xbb\xc6\x72\xc9\x71\x19\x00\xc8\x1d\x19\x98\x1f\x64\x89\xb9\x3f\x73\x95\x46\xd8\x9b\x2b\xd9\x37\x8d\xdc\xa8\x89\xc5\xc2\x4f\x99\xeb\xdd\x79\xb2\x71\x69\x53\x8b\xc7\x6b\xb3\x0a\x40\x93\xc8\x8a\x2a\xc0\xcc\x3f\x6d\xcc\xde\xc4\xf5\xae\xa9\x85\xfb\xcb\x7b\xbe\xfc\xd0\xf0\x7b\xe5\x6e\xbf\xa0\x6c\x82\x4a\x96\x51\x96\x67\xce\xcd\x00\x40\x99\x48\xf3\x79\x7d\x69\xef\x4c\x7b\x50\x09\x5d\xb3\xa5\x6e\x36\x7b\x46\xc4\xf4\xf4\x77\x47\x82\x1e\xe5\xaf\x91\x3f\x77\x25\x67\xa0\xab\x2e\xf2\x00\x2a\x42\xae\xd2\x66\xd1\x0e\xd5\x8a\xc1\x0b\x9a\xbc\x81\x18\x9d\xb9\x82\x27\x8d\x32\x8e\x7e\x6c\x42\x0c\xc5\xd7\x0f\x9c\x61\xec\x9e\x15\x6d\xb8\x08\x00\x04\x90\xfd\x00\x9f\x2d\xf6\xfb\x68\xde\x87\x1c\xe5\xb4\xbc\xab\x82\xb7\xe4\x4d\xf5\x06\x2a\x14\xe7\xba\x0b\x45\x8c\x86\x02\xee\x32\x65\x38\xb9\x03\x68\x0b\x39\x82\xcf\xf6\xfc\x52\xe1\x2f\xd6\x22\x76\x4d\x55\x2a\x91\x8c\x8d\xe4\x6b\xd3\xc9\xd5\xdd\x29\x37\x9b\x30\x78\x70\xf7\x64\xf5\xaf\xe3\x86\x8e\x00\x9a\x45\xb2\xa2\x50\x9f\xe9\x73\x85\x6b\x78\xeb\x64\x05\x5b\x8b\x3c\xe5\x0c\xec\xb7\x7f\x2b\xd0\x28\xcc\x0e\xb3\x76\xd5\x2e\xad\x3d\x73\x24\xfe\x04\xa0\x65\x64\x2c\xaf\xd3\x5c\x8b\xfc\xe3\xea\x17\xac\xc3\x25\xca\x51\x6b\x49\x82\x2f\xaf\x2a\xee\xe9\xae\x96\x1d\xb5\xd5\x7a\x52\x81\x1a\x5a\xb7\x03\xd0\x32\xb2\x84\x25\x08\xdd\x27\x3f\x32\xdf\x6a\x99\xe5\xcb\xda\x7e\xe9\x7b\xd7\xed\xce\x33\xcd\x1c\xbd\xc9\x1a\xc1\xef\xbb\x88\xec\xf5\x4b\xaa\x6f\x01\x00\x65\xff\xd5\xcd\x12\x9d\xf5\x8b\x98\xee\xf8\xe3\x45\x92\x2d\x70\xf1\x29\xc6\x2d\xd1\xda\x2c\xdc\x6d\x5f\x6b\x13\x97\xbf\x23\x77\x4d\x2e\x51\x08\x40\x15\x48\x0e\x9e\x7c\xaa\x80\xf4\xa2\x72\xa1\x9c\x84\xc6\xa2\x40\xf7\x20\x77\xae\x1a\x65\x85\x67\x41\xd5\xac\x01\xfe\xa9\x78\xce\x19\xf9\x7e\x45\x00\x20\x17\x64\x62\xae\xc7\xc9\x06\x58\x54\xff\x14\x97\x7a\x6d\x5d\x57\x77\xee\xa9\xfd\xa4\x61\x99\x63\x65\x7b\xc4\x58\xd9\xd3\x67\x8f\x03\x37\x98\x5c\x00\x34\x8c\xb4\x66\xe5\xca\xc8\xcd\x32\xfd\xcb\xe9\x34\xfc\xf8\xcb\xdf\x68\x72\x2d\xbd\xf2\x5a\x18\x38\x75\x95\x6d\x68\x38\x09\xc8\xba\xa2\xa6\x87\x10\x97\x5e\xfd\x7e\xc3\xc9\x31\x4c\xe7\x42\x7c\xf2\x74\x55\xe5\x2c\x95\x8a\x75\xfd\x8b\x62\xa5\x43\xf2\x1d\xbf\x44\x5d\x62\x5d\x6d\xda\x14\x90\x8b\x4f\xd3\xe1\x4e\x6b\x74\x69\x44\x0d\x95\xe1\xb1\x85\x54\x39\x22\x9b\x76\x5d\x37\xc6\xb4\x37\x1f\xbe\x9e\x9f\xe4\xaa\x7e\xff\x47\x06\x29\x07\x55\xcd\x5c\xe5\xa4\x90\xc7\x44\x31\x7f\x25\x7d\x93\x5d\xf7\xaa\xe3\x58\x83\xd5\xdd\x1a\x29\x83\x1f\x41\x6a\x61\x67\xac\xe5\x7b\x10\x97\xf6\x6c\xaf\x69\xbc\x25\xcb\x1c\xe8\xb4\x3a\x79\x63\xde\xf8\xfd\x63\x41\xad\x2a\x21\x02\x0f\xbf\x39\x16\xc7\xeb\xee\x1e\x0f\xd9\x3b\x1d\x01\x14\xfa\xd7\x71\x61\xa6\x98\x83\x4f\x85\xc3\x7d\x24\x9d\x82\xac\xbb\xac\xfd\xa8\x6d\x8e\x8b\xde\x37\x92\xfc\xe5\xb6\xa8\xd9\xa7\xf6\xbd\x58\xa6\x0c\x40\x1f\x91\x6c\xd5\x3d\xde\x18\xb2\x7b\x7d\x7a\xd8\x3a\xe4\xab\x9f\x4c\x2f\xff\xf5\x3e\x11\x3e\x87\xa4\xb8\xea\x78\x15\x33\x55\xa9\xa1\x4d\xca\x0d\x00\x55\x20\x9f\xbb\x77\xbd\x6d\x06\x99\xd3\xfa\xab\xda\xc0\xe6\x9c\x5c\x96\x8d\xe4\x2c\x8c\xfe\xec\x4a\xe6\x89\x08\x9d\xa1\x77\xcb\x20\x5a\x42\xc0\x11\x40\xce\xc8\x2c\x14\x6b\x98\x2e\xb0\x52\x8d\x08\x67\xa3\xf9\x29\x63\x78\xe0\x4d\xf8\x73\xcb\x92\x48\x39\x9e\xa7\x43\x26\x4f\x0c\x3f\xbe\x4e\x8c\xa2\x00\x50\x09\xb2\x75\x3d\xe9\xb3\x55\x24\x55\xd6\x5a\xbe\xa8\xac\xa4\x20\x2a\x6a\x62\xc2\xbe\xad\xc8\xf3\x92\x80\x89\xa4\x9e\x72\x1e\xe4\x77\xe3\x9d\x03\xd0\x04\xb2\x60\x38\x3a\x92\x6e\x46\x56\xaa\x6f\x92\xfe\x4a\x61\x1c\xb5\xc8\x2f\x4f\x39\xc2\xcd\xdd\x9d\x52\xba\xfd\xc4\xe8\xcf\x60\xde\xe9\xf9\x74\x0c\x80\xde\x22\x9d\x4d\x7f\xb4\x1e\x4b\xd5\x68\xf4\x8d\x27\x74\xf9\x05\xc5\x65\xeb\x6d\x83\xe2\x59\xb2\x9b\x44\x9f\xf9\x04\x3a\xc2\x84\xcc\xa6\xec\xdf\x01\x00\xb9\x22\xaf\x1f\x3b\x7d\x84\xe7\xc5\x71\x86\x3f\xda\xca\x71\x21\x42\xd7\xdd\x89\xee\x29\xaf\x74\x9a\x5a\xbd\x2a\xef\xab\xbe\x6b\x10\x62\x26\xfe\x11\x40\xa1\xc8\x82\xe1\x9e\x2c\xd2\xcc\xd1\xc0\xee\x52\x6b\xd4\x4a\xc9\x53\x3c\xca\x97\x56\x6f\xf9\xf8\x0a\xbd\x4b\x77\x8f\xa2\x09\x71\x92\xc1\xc4\xfe\x57\x40\x50\x89\xa0\xa4\xc4\x7f\xff\x84\x82\xa5\x6b\x54\x2a\x88\x05\xf4\xc1\x4a\x2b\x2a\x19\xc4\x02\x86\x61\x9e\x8d\xca\x06\xb1\x80\x66\x78\xd8\x44\xe3\x83\x38\xc0\x20\xbc\x7b\x8e\x4a\x08\x71\x3e\xc0\x3b\x02\xa8\x94\x10\x0b\x58\x81\xf7\x3d\x51\x49\x21\x16\xb0\x01\x8b\xbf\xa8\xac\x10\x0b\xa8\x84\xcf\xa7\xa3\xf1\x42\x1c\x60\x0d\x9e\xa8\xd0\x88\x21\x0e\xf0\x15\x7e\x0e\xa8\xcc\x10\x0b\xa8\x83\x95\x26\x54\x6a\x88\x05\x04\xc3\x61\x45\x23\x87\x38\x40\xdb\xff\xff\x23\x8e\xca\x11\xa5\xd9\x68\xf0\xfe\xdb\x06\xa9\x41\xae\xcd\xb4\x4b\x52\x8b\x09\x5a\xb7\x55\x53\xa5\x5f\x9b\x34\xd4\xea\x54\x3b\xe4\xaf\xd5\x13\xbc\x8d\x7d\xf8\x2b\x54\x1f\xdf\x44\xb2\xf7\x16\x06\x40\x71\x48\x42\xd7\x1c\xfa\x5e\x10\xdf\x3c\x9f\xd1\xa4\x9e\x88\xeb\x99\xbc\xf0\x43\xab\xc2\x8b\xd7\xf9\xdc\x87\xa8\xdd\x83\x8e\x3d\x7c\xf7\xa3\xd8\x1a\x03\xa0\x50\x64\x8b\x18\x38\xb9\x40\xef\xb4\x7a\x48\xe7\x8b\x94\xeb\xa6\x1b\x71\x73\xff\xf3\x9b\xac\xe1\x39\x23\x43\xf9\x9a\x16\x15\x93\xaa\xbb\xb1\xd1\x18\x00\xed\xfc\xf5\x3a\x8f\x70\xc6\x21\xe7\x08\x49\x93\xcf\x9a\x86\xd9\x25\xd2\x0a\x1c\x95\xec\x04\x25\x85\x43\x7e\xea\xf1\x44\x36\xda\x9e\x41\xd5\x6e\xbc\xff\x66\x36\x2e\x3e\x35\xff\x7f\xc9\x0b\x8a\xdd\x38\x40\x1c\xac\xa2\xa0\x19\x8e\x03\x84\xc2\x3a\x0d\x9a\xe5\x38\xc0\x0e\x9c\x76\xa8\x2c\x1d\x0b\x88\x82\x01\x68\x3c\x1d\x07\x48\x3a\xb2\xfe\xf1\xc0\x3f\xd2\x75\xe9\xa8\x4f\x12\x2c\x6e\x18\x00\x55\x20\x93\xc2\x13\x3f\x51\x5b\x4b\x9f\xa7\x2a\x93\x2e\x1e\x62\x96\xf4\xe1\xac\xe0\xed\xfb\xf5\x74\x90\x86\x30\xea\x61\xa7\x08\xa9\x59\x05\xd9\xde\xf0\x8f\xd4\x7f\x13\xe3\xd9\x1a\xcf\xee\x0e\x1c\x32\x16\x57\x2b\x77\xd5\x3f\x03\xa4\xb7\xec\xee\x25\x24\x54\x2b\x32\xf0\x7d\x1c\x75\x2d\xb6\x17\xc3\x00\x28\x02\xc9\x7f\x5d\xb2\x79\xf2\x14\x43\xfb\x64\xee\xf3\x3c\xb7\x9a\xbc\xa1\x3e\x1e\x37\xfa\xc7\x54\x9b\x82\xd1\x3f\x2a\x87\x9a\x93\xdc\xe1\xc1\x7b\x0c\x80\x62\xfe\x7a\xf7\xf6\x77\x59\xf7\x71\xde\xd5\x3f\xdb\x55\x15\xb3\xa7\xb4\x13\x9d\xa3\xae\xc8\xfc\x60\x5f\x56\xe0\x5e\xa8\x76\xa6\x8a\x03\x7d\x7c\x18\x00\x75\x22\x0f\x78\xb9\xf4\x7d\x08\xb9\x0c\xf8\x8d\x45\xa9\x95\x6d\xe8\xc2\xba\x3f\x0b\x5d\x8b\x1f\xbd\x13\x50\x4f\xfa\xe1\xee\xd9\xd3\x2a\x6d\xdc\xfd\x18\x00\xb9\x20\x7f\xbf\xe4\xb2\xa3\x67\xee\x4b\xb2\x2f\xb7\x83\xaf\x14\x7c\x7e\x62\xa6\xea\x21\x28\x92\xdc\x2d\x1e\xcf\x77\x3c\x21\x66\x27\x68\xa3\x3e\x03\x03\xa0\xd8\xbf\xfe\xcb\xb9\xe8\x6f\xcd\x11\x7e\x76\x6b\xd4\xc9\xaf\x20\xec\xc3\x79\x9a\x47\x1f\xc7\xeb\x3d\x0e\xe9\x31\x3a\x47\xde\xa2\xe7\x33\x61\xea\xc5\x00\xe8\x33\xb2\xbd\x92\x96\x0e\x5b\x09\xc9\x3d\xf1\x7a\x97\x7e\xb5\xb9\xa6\xb1\x47\x66\xd5\x2e\x53\xa7\xcd\x79\x42\x7e\x53\xd2\x39\x63\x5c\x86\x77\xff\x13\x17\x68\x61\xc7\x3d\xdf\x0a\x38\xa9\xd1\xe2\x8e\x03\x38\xc3\x32\x0a\x5a\xe0\x71\x80\x08\xb8\x81\xa0\x45\x1e\x07\x88\x81\x57\x01\x5a\xe8\x71\x80\x4e\xf8\xcc\x19\x5a\xec\x71\x00\x17\xf8\x0e\x68\xc1\xc7\x01\x62\x61\xc9\x1b\x2d\xfa\x38\xc0\x67\x58\x92\x43\x1d\x5a\xb1\x00\x0c\x5c\x2b\xd0\xc6\x56\x1c\x20\x1d\xde\xee\x42\x1b\x5c\xb1\x00\x49\xf6\xfd\xeb\x51\x27\x57\xec\xf5\x37\x60\x95\x1f\x6d\x74\xc5\x71\x17\xb8\xa3\xa1\x0d\xaf\x38\xc0\x2e\xf1\x7a\x23\xc1\xbf\xcd\xb0\x40\x5a\x9a\x0d\x0f\x72\xc1\x00\x49\x56\xc4\x4a\x20\x7a\xff\x2a\xec\xc8\xc3\x05\xd3\xb5\x33\xda\x4a\x3d\x5c\xdc\xc4\x75\x45\x4f\xea\xe7\x3d\xd7\x7a\xbe\x48\x47\xf7\x81\x23\xa7\x8b\x30\x00\x5a\x42\xd2\x64\xfb\x05\x8f\xb7\x1b\xfe\x07\xde\xf7\x3a\x2c\x14\x01\x43\xa3\x21\xcb\x98\xe0\xa9\x36\xab\x6e\x76\x03\x8d\x1a\x89\xab\xe5\x9c\x4c\x18\x00\xb9\x22\x2b\x51\x60\xb4\xc4\x58\x9e\xf1\x94\xd3\x7d\x36\x21\x97\xe2\xf3\x9c\x55\x42\xbe\xcd\x3b\x35\x79\x1e\x6b\xc1\xdc\xaf\xbf\x14\x2c\xbf\xd9\x6b\x67\xb9\x48\x45\xab\x86\xea\x99\xb1\x85\x1f\x39\xfb\xa9\x8b\x64\x9c\x6b\xf8\x8a\x1c\xe2\x04\xf6\x18\x27\xd6\xd7\x0d\x4b\xe7\x36\xe8\x1a\x7e\x1b\xc5\x62\x00\x14\x80\x1c\x49\xae\xfa\xa5\x17\x19\xdc\x25\xc0\x27\xde\x6a\x9d\x35\xfd\xd2\xfe\xca\x73\x6c\xe6\xb3\xdc\xa7\x58\x69\x33\xc9\x17\x01\xb4\x2e\x5e\x8c\x18\x00\x75\x21\xed\xe1\xd6\x05\x21\xef\x1e\x2d\x11\x2d\x54\x2c\xdf\xcb\x5d\x8e\x48\x61\x7c\x47\xc1\xbe\x4e\xf2\xf5\xe0\x73\x89\xe3\x27\x44\x1f\x8b\x38\xf3\xfc\x5b\x58\x70\xcf\x97\x15\xfe\x8f\x35\x4a\x58\x70\x8f\x6b\x09\x7e\xbe\x68\x71\xc1\x01\x5c\xe1\x4a\x81\x16\x18\x1c\x20\x17\xe6\x75\x68\x91\xc1\x01\x02\x60\xf6\x8b\x16\x1a\x1c\xa0\x0b\x36\x09\x55\x05\xc1\x15\x2f\x58\xf8\x46\xd5\x41\xb0\x80\x0c\xb8\xc1\xa2\x29\x21\x38\xc0\xe2\xff\xbf\xd3\x88\x26\x85\x60\x01\x0b\x70\xc5\x46\xd5\x42\xb0\x00\x77\xb8\x78\xa1\xaa\x21\x58\xc0\x24\x1c\x56\x54\x39\x04\x0b\xc8\x84\x7d\x40\x15\x44\xb0\x80\x22\x98\x9b\xa2\x2a\x22\x58\x00\x80\x07\x23\x34\x4d\x04\x07\xd8\x82\xb7\xd2\x51\x45\x11\x2c\x60\x16\xae\xd8\xa8\xb2\x08\x16\xb0\x0c\x87\x15\x55\x18\xc1\x01\x60\x06\x8f\xaa\x8c\xe0\x2a\x2a\xfc\x1c\x50\xb5\x11\x5c\x33\x87\xfb\x1a\xaa\x38\x82\x6b\x84\x70\xb6\xa2\xc9\x23\xfb\xe3\xe3\xc1\xf5\x59\xfc\x7f\x53\x49\x80\xa4\xea\xde\x80\xe0\x88\xe4\x3a\x33\xa2\xb4\x94\x84\x44\x09\x11\x52\xb4\xd3\x3a\x13\xfe\xe3\x6f\x7e\x68\xce\xf0\x3e\x59\x6a\x08\x75\xf7\xa7\x91\x32\x24\x28\x1f\xc5\x00\xa8\x05\xa9\x0d\xbc\x21\x95\x54\x8c\xa6\x36\xaa\xcb\x5b\x37\x82\x76\x43\x75\xb3\xc5\xa6\x7e\x79\x53\x48\x3c\xff\xaa\xaf\x2c\x17\x94\xed\xb3\x7e\x16\x03\xa0\x1e\x64\x85\x27\xce\x77\x51\xed\xef\xe6\x3f\x68\x38\xfd\x82\xa8\xf3\xdd\xb2\x9f\x29\xc5\x8e\x5d\x2d\xa7\x78\xee\xdd\x85\x8a\xdc\x1e\xd1\x1a\xf3\x3d\x42\x8b\xe4\x76\xc2\x57\xf3\xa7\xc4\x38\x02\x82\x59\x1f\xf3\x51\x68\x71\x9f\x5e\x34\x6c\x77\xbb\x6e\x9c\x58\x22\xd9\x2e\xca\xa9\x17\xf3\xeb\x76\x0e\xef\xbf\x99\x8d\x0b\x8e\x23\x9c\x11\x68\x76\xe3\x00\x2d\xf0\x98\x89\x66\x38\x0e\xd0\x03\xd7\x60\x34\xcb\xf7\xe9\x3b\x09\x7c\x8a\x09\x4d\xaa\x02\x52\x64\x47\xff\x7b\x83\x62\x25\xf2\xdf\x7a\x03\x7f\x22\x8e\xd5\x48\x8c\x0d\x17\xd6\x9c\xb8\x42\xb4\x49\xd1\xcb\xf7\x80\xbe\x46\x46\xf7\xf9\xcb\xca\xfc\xbe\xe1\xef\xad\x71\x7b\x3d\x2d\x1b\xc9\x4e\x19\xfc\x63\xda\xf5\x07\xeb\xc9\x63\xe2\x27\x3c\x9e\x55\xc7\x30\xd7\x1e\xd0\xe2\xb3\x4a\xb8\xb0\x6a\x7e\x3a\xfe\x72\xa3\x7b\x08\x39\x06\x40\x3f\x91\x4f\x80\xdd\x3d\x36\xee\x71\x5b\x41\x69\xa5\xff\x41\x3f\x9e\x31\x3d\xb6\x52\x62\xa0\xfc\xe6\x3c\xb7\x9a\xcb\x20\xe7\xfd\x50\x96\x00\xc5\xbd\xb6\x80\xec\x99\xce\xf7\x2f\x30\x59\x19\x94\x8b\xa8\x6e\xe3\xb5\x90\x69\xb2\x7e\x77\x34\xc7\x4f\xb1\x61\xdb\x2d\x49\x7d\x15\x30\x22\x4e\xa6\xe4\xb3\x57\x51\x91\xdb\x11\x6c\x63\xb4\x2e\xcf\xe5\xdd\xc5\xce\x9e\xf9\x3e\x55\x68\x07\xbe\xc5\x0d\xa5\x9b\x9d\x7e\x14\xf9\x54\x32\x5a\x76\xf0\xb6\x5e\xbb\x00\xef\xbf\xb9\xb9\xaf\x0b\xc0\x67\xba\xd1\xfc\xdc\x5f\xc2\xff\x7f\xb9\x2c\x8a\xa3\x38\xc0\x4f\x98\xcb\xa2\x79\xba\xdf\x34\xe1\x22\x81\xe6\xea\x7e\xc3\x39\x02\xa7\x04\x9a\x24\x09\xa4\x98\xd8\xdd\xf6\x52\x22\x00\x29\x62\x5f\xec\x7d\x3b\xf0\x22\x6e\x7a\xd2\x81\x38\xf6\xcb\x41\xe1\x25\xf5\xbe\x0b\xb7\x24\x34\xe9\xec\x1c\x6e\xd4\x9c\xbe\x7b\xb4\xd7\xa4\x6e\x8f\x2f\x23\x07\x34\x92\x20\x41\x3b\x03\x6e\x6e\x87\x13\x7d\x59\xfa\xce\x56\xf8\x34\x83\x03\x64\x73\xfd\xbc\x2b\x64\x09\x84\x0d\xc5\x96\x8e\xb4\xbf\x30\x00\xfa\x84\x5c\xf4\x5e\x17\xcd\xdf\x1c\x6d\xff\x40\xa8\xd0\x99\xa4\x5e\x3c\x03\xf4\x66\x6d\x67\x49\xec\xcb\x0d\x2b\x6d\x3c\x4f\xc8\xe9\x5f\x2d\xb9\xbd\x47\xaf\x91\x29\xfa\x88\x62\xbc\x7b\x45\xf5\xb5\x8f\x60\xee\x4d\xb2\x77\xac\x77\x39\x2c\xa2\x7e\x9c\x79\x57\x69\xcd\xce\xf3\xb1\xeb\x95\x47\x8e\xda\x31\x0c\x80\x8a\x91\x0a\xdf\x87\x14\x1d\xe6\x40\xc3\xce\x88\xfc\xf6\x72\x03\xf5\x6c\x6b\x8f\xa8\xfe\x68\x73\x79\x31\xf3\x15\x17\x0e\xb7\x30\xb6\xa5\x31\x77\xde\x7f\x73\x73\x9f\x83\xc0\x9d\x09\xcd\xcf\xfd\x59\x02\x9e\x87\xd0\x1c\xc5\x01\x3e\xc1\x55\x02\xcd\xd3\xfd\xe1\x03\xce\x52\x34\x57\x71\x80\xe2\x13\xeb\xa1\x04\xff\x26\x3d\x03\x69\x09\x25\xac\xf2\x93\x8b\x5c\xf6\x87\x5f\x37\x52\xea\x5b\xe4\x91\xe3\x77\x75\xa4\x2b\xa7\x08\x8c\xd1\xbd\xa7\x51\x50\x1a\x7d\xec\x67\xf6\x14\x9c\x1b\x3e\xd6\xdf\x89\x01\x92\x4c\x48\x11\xd7\x82\x56\xc7\xc7\xc3\x46\x80\xde\x9b\xba\x9f\xd6\xf6\x50\x91\xe3\xb4\x85\xc5\xc3\x1f\xb6\x4e\x0a\x47\x77\xe2\xba\xa9\xae\x57\x63\x00\xd4\x8f\x14\x72\x8e\xff\x7c\x23\x72\x7d\xca\x39\x8e\x35\x69\x7e\xbd\xd8\x8b\xe8\xc0\xb5\xb1\xef\x0f\x64\xfa\xc8\x99\x9a\x5d\xe5\xc5\xdf\x90\x47\x65\x00\x00\x95\x23\x53\x48\xfc\xab\xd0\x4d\x2e\x1b\xb2\xb0\x4a\x9a\x2d\x6a\xe9\x75\xd2\x2a\xdd\x9c\x63\x8b\x4f\x1e\xdf\xbc\x4d\x95\x36\xdc\x17\xd9\xc8\x70\x09\x40\x15\xc8\x9f\x1f\x6f\x3c\x31\x29\xf2\x47\xf2\x51\x49\x21\xed\xbd\xcb\xe6\x44\xe6\xa9\x02\x87\xbe\xb9\x8c\x29\x1e\x6f\x5e\x21\x52\xb9\xc2\x49\xe5\xc2\xfb\x6f\x4e\xee\xaf\x48\xca\xfd\x49\x0b\xcd\x4d\x1c\x13\x67\xda\x7f\x5c\xa8\x6e\x62\x6f\xd0\xff\xff\xa3\x91\x68\x7e\x62\x01\xe5\x70\x06\xa1\x79\xba\x4f\x24\xe0\x3b\xa0\x6e\x2d\xe0\x94\x2b\xb8\x31\xa1\x6e\x2e\x60\x01\x1f\xe1\xe3\x1b\x68\xdb\x0b\xfb\x26\xc1\xec\x09\x75\x7f\x01\x27\x54\xc0\xa5\x17\x75\x87\x01\x0b\x28\x81\xa3\x84\xb6\xc7\x80\x03\x4c\xc0\x4c\x1c\x75\x93\x01\x0b\x78\x0b\x3b\x8d\xba\xcb\x80\x1b\xa1\x60\x00\xda\x3e\xc3\xfe\x73\x20\x58\x0f\xa7\xc4\x22\xa2\xed\x1e\x0c\x5e\xab\x99\x54\xbe\x41\x37\xb2\xa2\x48\x7d\x2f\x7f\x85\x81\xe7\x40\xd3\x93\x48\xa3\xa8\x7e\xf6\x74\x5f\x8a\x3b\xcb\x40\x7a\x77\xf8\xe7\x6e\x10\x03\x72\x59\xce\x38\x32\x46\x1d\xa8\x9f\x15\xc7\xbb\x31\xf0\xfb\x0c\xa3\x43\x66\x8c\xf6\xd9\x32\x3e\xcf\x8b\xc3\xaf\xdc\xfe\x44\x4c\x9f\xde\x5b\x66\x7e\xc8\xe6\xfa\xd1\xfb\xf5\x32\x31\x2f\xe3\x35\xe6\x71\x17\xc9\x94\xe4\x9a\xab\x2c\x05\xb1\x8a\x75\x3a\x0c\x74\xa6\x17\x0c\x2a\x0f\xf3\x06\xe5\x03\x68\x1a\xa9\x8c\x25\x35\x64\x87\x89\x8f\xd2\x86\x95\xb3\xe7\x1d\x31\xdb\xed\x11\x9b\xfc\xd1\xfb\xda\xa8\xba\x39\xb6\xf8\xfa\x5c\x8e\x0a\x98\x63\xdb\x2b\x8e\xc8\x79\x3a\xb2\x62\x56\x92\x8b\x82\x3a\xfe\x55\x34\xc9\xe6\xfb\xb2\xdd\xfe\x57\x3c\xb9\x77\x34\xb5\xd9\xf0\xc6\x2e\x25\x0e\x7d\x28\x8c\x6c\xc4\x00\x28\x07\xc9\xfe\x0a\x8c\x2d\xba\xec\x14\x15\xf3\x74\x3b\xb6\xd8\x96\x8d\x99\x36\x8e\xb5\x4b\x18\x78\x8f\xbc\x14\x0e\xa7\xcf\xf6\xf6\xa5\x6e\xad\x46\x5c\xda\xa4\x95\xb6\xfc\xb4\x6c\x52\x76\xfd\x0a\x43\x01\x35\x89\xe9\x08\x67\x8c\x84\x3b\xc9\x29\xee\xda\xd1\x78\x05\x72\xde\xa2\xc9\x1c\x00\x24\xb9\x11\x97\xd3\x6d\xcb\xca\x6e\x2d\x4e\xf9\xd2\xcc\x2a\x45\x29\x55\x44\xc6\x07\xbd\xb2\xe4\x72\x14\xcd\x24\x62\xd3\x24\x48\xf5\x74\x69\xfb\x0d\xa0\x69\x24\x49\xa1\x98\x22\xd9\x90\x0e\x77\x27\xa8\xaa\x7d\x63\x21\x3d\x78\x5d\x4d\xb0\x86\x53\xa2\xfd\x05\xb3\x46\xf0\x1f\x0f\x7a\xce\x7e\xd6\x65\x00\xa0\x5e\xa4\xe1\xce\x89\x4a\xa7\xdc\xbe\x0d\x28\x0d\xb4\xf4\x35\x1f\x8d\xa8\x2f\xb6\xa5\x54\x61\xe2\xef\xbd\x58\x6e\x19\xb5\x61\x6b\xe0\x9a\xb6\x09\xa0\x1d\x64\xb1\xfd\xd2\xb9\xce\xde\xe1\xba\xd1\x29\x92\x1d\x7e\xe5\x5e\x23\x19\xe1\xc4\x89\x3b\x73\x42\xdd\xaf\x85\x24\x1a\x68\xfe\xd0\x69\x57\xed\xee\x35\x79\x64\x83\xd4\x7f\x9e\x72\x5c\x3f\xba\xbb\x37\xe2\xc7\x4d\xb5\x8d\xaa\xfb\x0a\x8f\x52\x97\xee\x6e\x59\xaf\x40\x56\x31\x7a\x0d\x2c\xde\xac\x2e\x8e\x00\x8a\x47\x36\x78\xe3\xc7\xcd\x9f\x17\xcc\xd7\x6d\x2d\x4b\x2f\xd6\x51\xc8\xb5\x49\x10\xdf\xe4\xc8\x32\xde\xee\x96\x7c\x91\x1b\xcd\x7f\x87\x21\xd6\x0b\x40\xb3\xc8\xc7\xa4\xde\xe9\xe7\x99\xc4\xde\x57\xc2\xa8\x25\x5f\xc6\xb8\x40\xbb\xba\x43\xf2\xd0\x5f\x81\xd7\xaa\xda\xd2\x45\x65\x72\x30\x7a\xf6\x2d\x80\xe6\x90\xce\x72\x9b\xab\x76\xf0\x7e\xf0\x00\xad\x2b\x33\x3e\xfa\xcc\x91\x1a\x09\x8f\x8c\x1a\xd8\x0d\x1a\x0e\x9c\x38\xdd\x63\xbc\x74\x6f\x60\x0c\x00\x28\x05\x69\xfd\x24\xcd\x9b\x06\xdf\x6d\x4f\xf5\x05\x41\xa9\xd6\x0e\xba\xfa\xe3\xe5\xa4\x4c\xcf\xfa\x5c\x55\xfb\x6d\x2b\x97\xb7\x95\xd4\xde\x27\x03\xe8\xf3\x5f\xaf\x42\x2a\xe4\x3a\x68\x49\x72\x6f\x2b\xa8\xf2\x7e\xf6\x87\x93\xe6\x8b\x23\xe7\xbb\x1d\xcc\x2e\x05\x9f\xbf\xa2\x66\x3a\x71\xf2\x93\x99\x92\x23\x80\x52\x90\x7b\xec\x5f\xeb\x3d\xc4\x58\x88\xab\x2e\x50\x30\xdd\x9b\x56\x5d\xb5\x5b\x64\xbf\xb3\x18\xd4\x18\x3c\x7c\xe2\xe7\x58\x5e\xa1\xac\x42\x39\x15\x80\x9a\x91\x3f\x7f\xa5\x9c\xc2\x30\xd8\x5d\x4e\x93\xb9\x9f\x78\x6b\xb6\x8b\x8f\x9a\x76\x3e\xe0\xad\x2a\x34\xb8\x99\x32\xbe\xf9\xe8\xd1\x49\x7c\x5b\x00\x4d\x23\xf7\x4e\x1f\xdf\x4e\x8f\xbe\xf4\x6b\x6b\x66\x98\x13\x93\xb0\x08\x6a\x5a\xd3\x52\x64\xa9\x98\x6b\x39\x3e\x84\x5b\xdd\x19\x9b\xe8\x2b\x51\x46\x5c\xca\x1f\x7e\xea\x37\x35\xc9\xd4\x5b\x3d\x5b\xf9\xf2\x23\x5c\xbf\x92\x8f\x76\x33\x7d\xec\x4f\xce\x6f\x3d\xff\x65\xee\xf0\xd8\xd8\xae\x96\x23\x80\x5c\x91\x86\x3b\x98\xf1\xdb\x71\x4a\xf7\xdf\xb3\xec\x5b\xb4\xe4\x6f\x02\xa9\x0b\xcd\xa6\x87\x5f\x38\x51\x11\x89\x1b\xc5\xbc\xe2\xed\xca\xa0\x05\x50\x19\xf2\xd8\x47\xac\x46\xf1\xdc\xe2\xbc\x93\x10\x9f\x98\xf4\x4b\x5b\xcf\x9b\xe7\x78\xf5\x1e\x36\x3e\xa0\xcf\xd6\x69\x11\xd8\xca\xa5\x62\x35\x8d\x00\xd0\x26\x72\x52\xdb\x38\xf7\xc8\x38\x5a\xa1\x48\xc5\x5e\xf9\x87\x5c\x82\xf9\xef\x37\x69\x74\x94\x9f\x2d\x29\xda\xca\x7b\xf9\x45\x83\x9a\x2b\x93\x91\xc7\x78\x62\x24\x66\x7b\x88\x78\xf1\x9d\x9c\xd9\xd7\xcc\x39\x7e\xcd\x46\xac\x1d\x27\x1c\x6f\x6a\x30\x8b\xa6\x8e\x27\x94\xbf\x72\x43\xaf\x0d\x79\xa4\x6c\x5b\xdc\x7b\xc7\x3b\x6c\xec\xb5\xfe\xdb\x84\xa6\x08\xe2\xaf\x84\x74\x79\x13\x02\xdc\x55\xc2\x1d\x2c\xa3\xa1\x1f\x63\xe4\xf6\xd8\x7e\x29\x32\xda\xf8\xab\x37\xdb\xa4\xb9\x74\x5f\xa4\xc6\xfa\x2c\x90\x68\x8d\xdd\xc2\xcb\xd4\x8f\x39\xfb\xc0\xef\x8a\x99\xac\x52\xc3\xf9\xb4\xf9\x72\x47\x00\x79\x20\x33\x97\xfe\xb0\xd9\x85\x79\x0f\x17\x2d\x15\xa3\xd6\x88\x63\x19\x2d\x57\xfb\x8c\xf0\x9b\x56\x9c\x3d\xab\x35\xc4\xa8\x38\x7e\xc7\x6a\xb3\x01\xe8\x1d\xb2\xef\x9f\xba\x7b\x24\x94\xb2\x77\xb3\xe3\xb4\xee\x27\x7a\xb3\xfe\xdd\x05\x1a\x99\xd2\x75\x3a\x1a\x75\xfa\x6f\xa7\xdd\xe9\x39\x44\x75\xed\x00\x34\x82\xcc\xc4\x8f\x76\xe6\x87\x4f\x8e\x7d\x7e\x8d\x5f\xf3\x80\xe9\x8e\x2f\x61\xbc\x63\xaa\xda\x80\xc7\x89\xf6\x93\x15\xab\x72\x4c\x82\xbe\x9b\xec\x7b\xe5\x11\xb9\xbd\x95\xe7\x7b\xeb\x73\x81\xac\x71\x65\xfe\x64\x4c\xbe\xea\xd4\xd5\x27\x1c\x43\x9d\x49\x1c\x8b\x9a\xdc\xab\xf1\x97\x53\xcf\x09\x34\x9b\x02\xa8\x10\xe9\x6c\xc8\x54\xa7\xdd\x00\x23\xe1\x4d\xd2\x4b\xe1\x61\x27\xcb\x2c\xbe\x50\xd2\x87\x68\x35\x9d\x13\xd7\x68\x15\x2d\x96\x69\x8c\xc4\xbf\x0b\x00\x54\x83\xe4\xd5\xd6\x81\xf3\x76\x1e\xc3\x9f\xce\x9a\x10\xb4\x6b\x06\xaf\xf3\x1c\xa3\x7f\x53\x3b\x71\xca\xff\x7d\xba\xd6\x42\x14\x25\x65\x9e\x86\x24\x80\x36\x90\xc5\x7a\xf7\x9e\xf6\x49\x97\x43\xee\x87\xdd\x16\xae\x67\x91\xcf\x2d\xe9\xbd\xfd\xfd\xe4\xfd\xea\x9a\x3c\xa1\xe1\x39\xea\x33\xbf\x18\x84\xcf\x02\x00\x39\x20\xaf\xd7\x5f\xff\x1a\x75\x5c\x3e\x2e\x48\x06\x7f\xb1\x48\x9b\x3d\xf7\x98\xbc\x45\x7a\x1a\xc4\x2b\x51\xda\x51\x53\x46\x62\x73\xf9\xea\x61\x00\x95\x20\x8b\xd2\xb7\x4f\xef\x5a\x26\xdc\xe7\x29\x7a\x2b\x13\xb6\xec\x8a\x5c\x89\xbb\x5f\xe8\x44\x86\x74\x8c\xbf\xbe\x3a\x72\x73\x4d\x26\x80\x96\x04\x00\xa8\x98\xea\xaf\xc1\x4c\xf9\x94\x80\xa0\x06\xa4\xe2\x11\xa9\x11\x70\x80\xf7\x01\x8d\xb9\x46\x91\xc1\xa4\x09\x0f\xc5\x2b\xd9\x51\xf3\xf4\x1b\xbd\x00\x1a\x41\x92\xf6\x64\xc3\xee\xd4\x1b\x4f\xd2\x63\x68\xbe\x69\xda\x94\xd7\x3c\xca\x1a\x5a\x9f\x88\xbf\x6e\x7e\x8d\xaa\x48\x88\x85\x7f\xdc\xcf\x71\xdb\x11\x40\x1f\x91\xc1\xa4\xa4\x1f\x09\xc8\xf1\x68\x68\x64\x60\x1e\x97\x53\x24\x7f\x7a\x51\xb6\x3f\xc0\xc3\xe3\x7a\x95\xd1\x03\x8b\x98\x3b\x77\x57\xa2\xe3\x00\xd4\x87\xac\x61\x99\x21\x7a\x8b\xc3\x29\x93\x3d\x8a\x3d\x16\x97\x2f\xb9\xa4\x1b\xdc\x37\x25\x75\x50\x32\xf0\x11\x01\xad\x1d\x79\xa7\x46\xc2\x5f\x03\xe8\x1b\xf2\xdc\x0f\xbe\x1b\x6b\x03\x71\x76\x2e\x90\xe3\xad\x85\xec\x0e\x76\x87\x65\xc5\x28\x7d\xde\x9a\xd1\xdd\xc4\x13\x9e\x54\xca\x25\x26\x19\x46\x5c\xfa\x7e\xbb\x8c\x4e\xdc\x93\xd2\xef\xcf\x9b\x0b\x81\x59\xab\x23\x7c\x20\x55\x96\x49\x25\x2e\xe6\xf4\x51\xff\x57\x5f\x2a\x68\xd4\xe9\x1c\x01\xe4\x86\x8c\x63\xea\xf9\xe5\xa5\xb8\x5d\x96\x21\x39\x3f\x31\xa3\x21\xc6\x99\xf5\xad\x26\xaf\x34\x52\xe9\x48\xf1\x67\x83\x6a\x1f\xb8\x2e\x1f\x51\x01\xd0\xd0\x5f\x49\x93\xdb\x6c\x21\xa4\x7d\xfa\xc9\x6e\xd5\x9f\x96\x90\xad\x58\x73\xd9\xab\x9d\xc7\x28\x7a\x4e\xb1\x35\x8d\xd8\x0d\x1d\xa8\x53\xe3\x01\xd0\x16\xb2\xf8\x5e\xb2\xb9\xe8\x62\xef\xcd\x97\xc5\x18\x5f\xba\xd3\x92\x74\xf7\x45\xa8\xb0\xa1\xaf\x7f\x80\x6c\xec\x3b\xbd\x40\xe2\x98\xa2\x24\x69\xc4\xa5\x8c\xe6\x21\x96\x04\xeb\xd5\x97\x58\x94\x63\xa2\x4b\xf1\xd7\x42\x9e\x31\x0b\x1c\x55\x1b\x8b\x11\xe3\x5b\xcc\xa8\x56\xe9\xef\x14\x71\x04\xd0\x3c\xb2\xe9\xdd\x5c\xd0\x74\x2e\x8f\x4f\xdd\x72\xe9\x20\xe4\xaa\xb8\xf1\xd6\xaa\x31\x70\xe7\x0a\xb3\x6c\x3b\x19\xef\xf4\x6b\xd7\xf7\x42\x7c\x21\x00\x5a\x42\x52\xf4\x80\xcd\xb4\x96\xcf\xad\xab\x0d\xda\xa2\xd1\x4d\x9d\x87\x94\x07\xd2\x1c\xe6\x6e\xa5\x55\xd1\x5c\x57\x74\x68\x6e\x6d\x21\x2a\xfe\x00\xa0\x0d\xe4\xda\x9b\x61\x5d\x1d\xd1\x8c\xd1\x51\xfd\x3d\x40\xa1\xbf\xbb\x44\x7a\x71\x24\x4d\x40\x84\xc6\x3e\xe7\x0d\xe6\x02\x37\xd9\x32\x29\xdd\x27\x47\x20\x89\x34\xde\xda\xea\x7d\x8a\xe8\x81\x97\x72\x94\x07\xf4\xe9\x23\xf9\x7e\x95\x2d\xe6\x4a\x32\xdf\x72\x7f\x8d\x17\x09\x6d\xb6\xc7\xe2\xaf\xc4\x02\xc8\x09\xb9\x94\xd2\x96\x5b\x92\x73\x22\x2d\x55\x94\x35\xb5\x06\x73\x9c\x3b\x0f\xcc\x29\xa6\x9b\x45\x3d\x97\xcf\x67\xb1\x89\x4c\xde\xf5\x2f\x8f\x03\xd0\xca\x5f\xaf\xa9\x3c\x3d\x39\x9c\x93\x2a\x6c\xd2\x29\x4f\x1d\x91\x55\x6b\x71\x6c\xfb\x0a\x5b\xba\xed\xd9\x5c\x49\x19\x33\xe1\xa3\xd4\xa1\x34\xc1\x00\x48\x22\x3f\xb7\xd6\x77\x7e\x5c\x2b\xde\x46\xc5\x89\x70\xf4\x69\x67\x93\xb8\x66\x4b\xbe\xcb\x52\x03\x74\xab\x02\x8a\x55\xaa\x59\x13\x92\x15\x69\x05\x50\x3b\xb2\x2a\xf5\x10\x7e\xbc\x2e\xb9\x13\x7a\x7c\xe2\x59\x98\xf5\xdd\x1c\xea\xef\xc1\xaa\xa6\x09\x54\x93\x9c\xaa\xd3\xdf\x18\x92\x12\xee\x52\xf9\x3a\x02\x28\x0f\x99\xbb\xf1\x67\x3e\x50\xfb\xf0\x5c\xda\xad\xce\x3f\xbe\xc9\x26\xf9\x34\xf8\xa0\xcf\x8c\xff\x78\xc3\x29\x35\xfb\xce\xe0\x1b\x62\xdf\x29\xa5\x00\x34\xfa\xd7\x0b\x25\x44\x75\x9b\xaa\xee\xbf\xb2\x78\xb4\xee\xd1\x34\xdd\xd0\x5f\x7a\x74\xe5\x2e\x57\x5b\xd0\xe5\x3b\xdf\x9e\x51\xd0\x67\x65\x7f\x53\x06\xd0\x0c\xb2\x83\xdd\x8d\x79\x50\xc9\xda\x73\xeb\xb0\x7f\xfc\xe1\xb8\x9f\xc4\xf6\x0b\x1a\x37\x1f\x7f\x11\x58\xb8\xfa\x0e\x53\x4a\xd5\x7c\x2b\xa8\x04\x0f\x03\xa0\x2c\x64\x9f\xf9\x7e\xfb\xa4\xcf\x87\x9b\xeb\xfc\x3f\xbf\xcf\x96\x13\xd0\x8b\xeb\xd4\x04\x46\xbf\xae\x67\xb2\xbf\x9e\x06\xb6\x7d\x46\xad\xb7\x84\xeb\x09\xfe\x91\x6b\x4a\x1f\x92\xc0\x23\x73\x02\x40\x12\xf9\x66\x20\xb2\xcf\xe9\x53\x8f\x7c\x7e\xdd\xfa\x14\x6f\x1d\x42\xa5\xc0\xd1\xc8\xd9\xd2\xe1\x2f\xf2\xb2\xb7\x46\x9f\xdf\x31\xd7\xa0\x77\x31\x13\x40\x11\xc8\xbd\x67\xe0\xa9\xc7\x4a\x88\xdf\xd8\x1b\xf3\xab\x85\x31\x5d\x3c\x94\x7b\xc1\x78\x62\xf0\x9d\xab\x13\xbf\xb3\xcf\xf4\xd6\x90\xd2\x31\xc3\xbd\x41\x04\xe9\xac\xca\xf4\x92\x29\x81\xd2\x93\x40\x5d\xc2\x21\x23\x05\xa5\x9d\x6f\x53\x03\x37\xe4\x0c\xb4\x5b\x6f\x3d\x1f\xcf\x67\x7b\x48\x7c\xa9\x14\x00\xc8\x1f\x59\x07\x8e\x7f\x57\x5f\x9f\x6c\x1b\xb8\xa9\xae\x47\xb0\x38\x48\xbb\x3d\xa4\x6d\x3b\x1d\xcc\x12\xd1\x54\x7e\xb7\x94\x30\xf9\xea\x24\x0d\x37\x80\xba\xfe\xfa\xb8\xe4\x81\x3b\x33\x71\x36\x91\x8a\x85\x57\x0c\xa0\xa1\x88\xc4\xcf\x06\x2e\xfd\x8a\x25\xa1\xbb\xf6\x67\xf2\x25\x09\x98\x97\x1a\xfe\x60\x00\x94\x81\x4c\x4b\xb3\x7a\x91\x64\xc3\x76\xa7\xd3\x11\x3f\x73\x1f\x99\x7a\xd5\x50\xc9\x3c\xe3\xfa\x7d\x40\x5d\xed\x91\xce\x67\xb9\x5e\x85\x57\xf3\x16\x3c\xff\x18\x14\x49\x87\xbd\x31\x53\x6c\x7f\x96\x40\x8b\x0a\xf6\x7a\x28\x02\x1e\x6f\x50\xc3\x82\x05\x7c\x84\x47\x34\xd4\xb8\x60\x01\xfe\xf0\x36\x00\x5a\x64\x70\x80\x2e\xf8\x6c\x11\x5a\x68\x70\x80\x0c\x58\x6c\x41\x9d\x55\xb0\x00\x3f\xf8\x0e\x68\xd3\x0a\x0e\x30\x0d\x6b\xee\x68\xe3\x0a\x0e\x10\x0b\xef\x72\xa1\xcd\x2b\x38\x40\x0e\x21\xfc\x6f\x28\xd4\xb1\x45\xca\x4d\x82\xc0\x09\x03\xa0\x66\xe4\x2a\x50\x9e\xfc\xdd\xfb\x44\x54\xea\x60\x40\xf0\xdb\x6f\x24\xa2\x37\xcf\xa4\x13\x3d\x6c\x69\x8c\x55\x5e\xa8\xf2\xe5\xa6\xbe\x13\xfe\x9b\x06\x03\xa0\x3c\xe4\x3e\x63\xdb\xc5\x91\x4a\xbd\x81\x39\x6e\xd5\x63\x7a\x72\x54\xda\x67\x67\xe6\x2e\xbb\x09\x77\xdc\x63\x9f\x14\xb8\x7d\xd5\xe4\xee\x55\x12\xdf\xbd\xeb\x91\xad\xdc\x36\xda\xb6\xf0\xa4\xd8\x4e\x3d\x9d\x70\x6f\xe4\xe6\xf7\x36\x17\x8e\x94\x24\x83\x53\x0c\x83\xe3\x4e\x7d\x71\x03\xcf\x33\x30\xa7\x30\x00\xea\x45\x72\xcb\x53\xa1\xf6\x67\xc6\xcc\x4c\x94\x22\x48\x5f\xc7\xcb\x12\x01\xad\x25\x8d\xd7\x8b\x69\xa4\xaa\xfc\x5c\xb9\x8c\xba\xea\x5d\xae\x8e\xbc\xff\x66\x36\x2e\x3c\xcd\x70\x9a\xa2\xd9\x8d\x03\xe4\xc1\x9b\x80\x68\x86\xef\x03\xe0\xbd\x79\x34\xcb\x71\x80\x5e\x78\x6f\x1e\x75\x70\xc4\x2e\x4d\xee\xfd\x1b\xa0\x4e\x8e\xb8\xa4\x83\x45\x5f\xd4\xd1\x11\x67\x11\xac\xcf\xa0\x0d\x8f\x38\xc0\x0e\xac\x9e\xa0\x4d\x8f\x38\xc0\x22\x2c\x3a\xa2\x8e\x8f\x58\x40\x3c\x2c\x9c\xa2\x0e\x90\x58\xc0\x2c\xbc\x70\x50\x47\x48\x2c\x60\x0e\x76\x1a\x75\x86\xc4\x02\x52\x60\x1f\xd0\xa6\x48\x1c\xe0\x33\xbc\xf1\x89\x3a\x46\xe2\xee\x00\x6f\x4b\xa2\x0e\x92\xb8\xec\x86\xef\x80\x36\x4a\xee\xa7\x06\x05\x7c\x8a\x0f\x6d\xa2\x04\xd2\x0e\x04\x78\xe4\x7b\xe5\xc2\x1d\xd9\xa5\xaa\x5f\x5c\x96\xba\xb6\x23\x1e\x7f\xce\xda\xe7\xab\xd7\xd1\x43\x17\x1d\xd4\x56\x98\xef\x48\x26\x13\x7b\xda\x16\x86\x6b\xee\xde\x70\xdf\xb3\x0a\x49\x28\xe4\xd5\x2b\x38\x95\x06\x7f\x84\xd1\x1e\x28\x12\xcd\x08\x4e\x77\x1a\x08\x1c\x79\xe3\x92\x3a\x26\x56\xc8\xf4\x6d\xb0\x72\x71\x65\x00\x03\xa0\x15\x24\x07\xa5\x3f\x7e\x2c\x89\x2f\xae\xd4\xf8\x1d\xd9\x87\x53\xf3\xae\x1c\xa6\xb7\x31\x63\x5b\x2c\xfd\x77\x7d\x8a\xac\x02\xe2\x02\x38\xf3\xd9\xf6\x18\x05\xf2\xfa\xcf\xc7\x23\x28\x3a\x63\xfa\x4e\x08\x37\x29\xe7\xc4\x45\x7c\xa4\xf2\x4e\xeb\x66\x6b\xb2\xc2\x13\xac\x8c\xfd\x75\x41\xe6\x49\x6b\x0c\xef\xbf\x99\x8d\x8b\x8f\x3b\x5c\xe0\xd1\xec\xde\x7f\x02\xb0\x16\x8a\x66\x38\x0e\xb0\x02\xa7\x1d\x9a\xe5\x38\x40\x16\x0c\x40\x9d\xe9\xb1\x00\x57\x38\x8b\x50\xa7\x7a\x2c\xa0\x0c\x3e\xc6\x80\x36\xd7\xe3\x00\x9b\xff\xff\x02\x21\xda\x78\x0f\xa4\x79\x1d\xf0\xff\xdb\x11\x08\x43\x8e\x03\xd9\xe4\xbd\x8d\xe4\x8a\x89\x5f\x7d\x5c\xf2\xf1\xbe\xb8\xf3\xcd\x4f\xdd\xfd\x9a\x21\xd8\x50\x30\xac\x92\xab\x45\xb6\x95\x73\x37\x09\x00\xa8\x0e\xd9\x14\xa4\x58\x3a\x79\x95\x85\xbe\xcb\x0b\x9d\xfb\x93\x7f\x55\x42\x6f\x50\x95\xec\xa8\xd8\x75\x39\x50\xa2\x90\x65\x7a\x62\xde\x32\xce\x0c\x40\xe3\xc8\x24\xf5\x3c\x48\x79\x25\xee\xd7\x84\x23\x69\x14\xf9\xb5\xa2\xfb\xe7\x6c\x24\xd7\x9f\x86\x56\xb7\x35\x29\xd0\xe6\xb7\x3c\x5d\xb9\x49\x59\x81\x01\x50\x27\x92\xb2\x97\x04\x5f\x95\x01\x79\xca\x96\x5a\x79\x4b\xa1\xfe\x8a\x4b\xe4\x7c\xf2\x91\xf7\x82\xc5\x77\x92\xbf\x4d\x29\x1b\xd3\x86\x91\x52\xee\xf1\x1d\x64\x0f\xf4\x1f\xba\x41\x1a\xac\x43\xdd\xf7\x1a\x5f\x36\xef\x4b\x01\x85\x4b\xc0\xe7\x7b\xc2\xf7\x9f\x8b\xdf\x4b\xbd\x75\x9c\x23\x4c\x75\x89\x8a\xf7\x1f\xbd\xc4\x86\x33\x0c\xae\xd7\xa8\x6e\x62\x01\x75\xf0\x56\x32\x9a\xa3\x38\xc0\x38\x9c\xd6\x68\x9e\xe2\x00\x9d\xb0\xda\x8d\xe6\xea\x3e\x1d\x3c\x0c\xd3\x10\x34\x19\x07\x48\x39\x38\x39\xec\x65\xc4\x12\xf2\x91\x29\xc8\x3c\xfb\x21\x7e\xff\xb4\xbe\xd8\x84\x6b\xb5\x70\x0f\x01\xf3\xac\xfb\xdb\x15\x4f\x02\x1d\x8d\xac\x36\xb6\x42\xb5\x04\x9b\x5a\x0c\x80\xe6\x91\x75\xc5\xbe\x6c\xb9\xc0\x3b\x38\x51\xed\x91\xde\x63\x8a\xab\xeb\x9a\x15\xb7\x7b\x3a\x17\x63\x35\x3e\x48\xcb\x34\xf2\x6c\x36\x25\xd5\x1e\xc7\x00\x28\x1b\x49\x43\x2a\x55\x3b\xe4\x3c\x1e\x1f\x61\x0a\xf0\xf3\xc2\x5c\x38\xfb\x94\x32\x8b\x82\x75\xed\xd0\xd6\x6f\x49\x43\x35\xbb\x34\x92\xd1\x8e\x13\x18\x00\x05\x20\x27\xed\xf3\xc4\xb4\x4d\xab\x9a\x7d\x27\x6a\xf3\x38\x9c\xde\xa8\x71\x50\x3c\x36\x60\xb4\x38\x1b\xd1\x37\x79\x07\x4f\xca\x64\xec\xa1\xbe\x30\xef\xbf\x99\x8d\x0b\xcf\x12\xfc\x00\xd0\xec\xc6\x01\xe6\xe1\xba\x82\x66\x38\x0e\x90\x0d\xd3\x10\x34\xcb\x71\x80\x00\xb8\x87\xa3\xe9\x68\x38\x40\x29\xdc\x6c\x50\x85\x34\x2c\xc0\x03\xee\xe1\xa8\x52\x1a\x16\xf0\x0e\x76\x1a\x55\x4c\xc3\x02\x46\xe0\x96\x8c\xaa\xa6\xe1\x08\x3c\x1c\x25\x54\x3d\x0d\x0b\x28\x84\x9d\x46\x15\xd4\xb0\x80\x1a\x78\xa6\x40\x95\xd4\xb0\x80\x0d\x38\x35\x50\x35\x35\x2c\xc0\x01\x06\xa0\xaa\x6a\x58\x40\x09\xe5\xff\x0f\x01\xa0\xc8\x6a\x58\x40\x31\x1c\x25\x34\x61\x6d\xff\x39\xc0\x3b\x51\xa8\xca\x1a\x6e\x18\x84\xc3\x8a\xaa\xad\x61\x01\x7d\x30\xbd\x43\x53\xd7\x70\x80\x6f\x47\xd7\x77\x08\xfe\x4d\x64\x03\xd2\x07\x63\x08\xf1\x5c\x30\x00\x2a\x47\xca\xc5\x2d\xa2\xf3\x33\xbc\xfa\x6c\x0e\x41\xbb\x43\xe3\x4a\x82\x63\x49\xc3\x24\xbe\x1a\xbc\x03\x11\x46\xd4\xac\xa4\x69\x91\xd7\x08\x56\x30\x40\x52\x1b\xf9\x5f\x1f\x09\x06\x06\xab\x07\x1e\xf9\xdc\x9c\xa4\x2e\x45\xd9\x32\x3a\x79\x76\x63\x86\x65\x2f\x9d\xfc\xbc\xff\xac\xef\x16\xfc\x5c\x35\x00\x00\xf2\x43\xfe\x7c\xb8\xcc\xc7\xf2\xbc\x2e\xfe\x56\x8a\x1b\xaf\x06\x14\x3f\x5d\x4e\x26\x9c\x73\x4d\xe5\x4c\xf9\x1c\xea\xf7\xeb\xf7\xaf\x25\x33\xcd\x67\x00\xda\x40\x0a\xfa\xd7\x15\x23\x8c\x83\x52\xbb\xe8\x35\xae\x94\xd2\xd6\x14\xe1\x59\x11\x87\xd5\x5c\xb8\x43\x7a\xe0\x55\xc9\x5b\xa5\xa6\x05\x11\x81\x4f\x18\x00\x15\x20\x3b\x26\x47\x18\x43\xd1\xf5\x99\x27\xd6\xf1\xbf\x56\x34\x88\xcb\x97\x3e\xb0\xeb\x0d\x42\x26\x05\xe5\x9f\x73\xd7\x0f\x25\x3a\xb0\xb7\x04\x63\x00\x94\x8f\xfc\x7d\x42\xba\xa4\x57\x9d\x1f\xbc\xc7\x99\xf3\x1b\x36\xcd\x76\x49\x99\x4e\x73\x25\xe8\x8e\xf1\x05\x3e\x5a\xac\xbf\xac\xfa\x62\xa4\xa6\x07\x03\xa0\x54\xa4\xb8\x61\xcf\xd8\xe8\xf4\x84\x85\x93\x8c\xe0\xe8\x2f\x77\x4d\x37\xc6\xb2\xb6\x00\x75\xcf\x10\xf2\xc8\x72\xbf\xfc\x62\xc9\x4f\xbf\x82\xe2\x78\xff\x2d\x88\xb8\xa7\x55\x0e\x7f\xbb\x0c\x35\x8c\xd8\x99\x48\x7b\x3f\x1d\x50\xc3\x88\x5b\xf8\x70\x2d\x42\x0b\xe4\xfe\xb2\x84\x59\x14\x5a\x24\x71\x80\x02\xb8\x29\xa3\x85\x12\x07\xc8\x87\xef\x80\x16\x4b\x1c\x20\x15\x16\x44\x50\x65\x60\x2c\xc0\x0d\x5e\xf8\xa8\x42\x30\x16\x30\x04\x2f\x4b\x34\x29\x18\x07\xd8\xfa\xbf\xfa\x80\xa6\x08\x03\x29\x42\x09\x9a\xbd\xb6\x3f\x8e\x54\x6e\x57\xd8\x8f\x07\x10\x61\xd2\x5e\x7a\xbd\xd5\xa1\x6a\xb5\xa1\xcf\xcf\xef\x7b\x57\xc9\xbc\xcc\x19\x77\xb6\x3f\x67\xa4\xdd\x44\x9e\x60\x6f\x14\x44\xa6\xe9\x8a\x4e\x83\x4b\xd8\xa1\xd5\x99\xa8\x0e\x7a\xbe\x4b\x46\xc1\xcc\xbc\x62\x09\x8e\x8d\xdf\x32\x9d\xe7\x0f\x36\xea\x89\xc7\xa8\x38\x60\x00\xd4\x83\xd4\xec\x64\xa2\x8a\x0c\x48\x66\xe8\x62\x1c\x05\x56\xde\x77\xc8\xb4\x7c\x32\xb8\x7f\x7e\x41\x7a\x73\xab\x3d\x7a\xb9\xd5\xdb\x4b\x50\x95\x7b\x8f\xc2\xff\xf5\x4e\x06\x62\xaa\xd4\x43\xc6\x07\x32\x49\x1f\x2c\x88\x72\xc4\x35\x8c\xd3\xc7\x26\xf8\xd1\xae\xa5\x8c\x16\x5d\x49\xde\x38\x56\x23\x72\x91\xf7\xdf\xcc\xde\xe7\x5d\x70\x7f\x42\xb3\x7b\x7f\xec\x85\x73\x02\xcd\x70\x1c\xa0\x07\x56\xd5\xd0\x2c\xdf\x1f\x58\xe0\x85\x80\x2a\xc9\xe3\x98\x08\xcc\x4e\x51\x45\x79\x1c\xd7\x81\xb9\x23\x9a\x2c\xbf\xbf\xd4\xc8\xf6\x17\x3f\xaa\x30\x8f\x5d\xfc\xd2\xfb\x37\x40\x55\xe6\xb1\x37\x70\x82\x7b\x32\xaa\x36\x8f\x1b\xd2\xc8\xf7\x2d\x42\x55\xe7\xb1\x16\x3d\xdd\xbf\x01\x9a\x3c\x8f\xbb\x41\x3b\xcc\x74\x50\xf5\x79\x9c\xca\x04\xf7\x3f\x54\x85\x1e\x0b\x18\x85\xef\x80\xa6\xd1\xe3\x00\x33\x70\x26\xa1\x89\xf4\xfb\x83\xe9\x81\xf5\x1e\xdc\x47\x74\x4e\xd0\x09\x47\x32\xef\x78\x30\xcf\x2e\x7d\xf1\x9c\x0d\xcf\xea\xdc\x3e\xd1\x9f\x7c\xd4\xde\x6b\xe9\xe8\x1b\x0c\xf3\x6b\xde\x36\x06\x20\xbd\x6b\xff\x67\x37\x88\x01\x03\xa0\x56\x24\xe9\x87\x4c\x62\xfb\xe4\x56\x1d\x38\x8a\xa9\x62\x3d\xc4\x1e\x5d\xa0\x51\x5c\x96\x76\x72\xa4\xba\xb0\xf3\xe3\xeb\xfb\x6c\x05\xa5\x43\x6b\x8e\x00\x6a\x44\x9e\x07\xe5\xba\x46\xf7\xe3\x80\x70\xc6\x42\xac\xbd\x00\xc9\x98\xdd\x3b\x46\xb3\x0a\x46\x26\x92\xcc\x95\x4b\x96\xb3\x3d\xd7\x32\x32\x64\x7e\x00\x68\x0e\xd9\xa3\x78\xbd\xb7\xb4\x97\xa5\x42\xf3\xae\xe8\xbe\xa7\x70\xbb\x10\x12\x1a\xbd\xc4\x58\x94\xda\xdc\x54\x95\xbb\xe4\x4d\xc0\x46\xa4\xff\x01\x40\x1b\xc8\x5a\xf1\xdb\x00\x64\x93\x7b\xcc\x05\xb2\xfa\x5a\xb3\xf1\x47\x9c\xb5\x13\xbc\x5a\x95\xd6\x96\x9e\x2a\x4f\xa4\x9e\xd0\x53\x68\x6b\x69\x87\x14\x29\xa5\x1f\x12\xe6\x7e\x5d\x18\x75\xce\x57\x6c\x10\xfa\xd3\x75\xe8\x87\xef\xd1\x20\xa2\x63\xf4\x6a\x67\x05\x53\x34\xee\x1f\xcb\x9e\xc1\x00\xa8\x1b\x69\x78\x0e\xe1\x85\xa0\x0c\xc3\xb8\x0f\xd9\x87\x13\xb6\x85\x37\xcb\x42\x5e\x89\x5e\xfb\xfe\x5d\x54\xd7\x51\x5a\x7a\x6a\x6a\x6a\x34\x29\x6c\x8f\x69\x22\x77\x6d\x56\x3d\xed\x8c\x30\x8f\xab\x7e\xb3\x12\x87\x31\x15\x68\xdc\x8e\x85\xee\x06\xe7\xa5\xd8\xf1\xc4\x0e\xe6\xdb\x7e\x63\xb7\x1f\x8d\x01\x00\xca\x44\x06\xb2\x47\xb0\x48\xf1\xce\xd4\xfa\xbd\xed\xaf\x50\x1b\xdb\xb3\xcd\x6b\x61\xb5\x3f\x03\xdf\xad\x70\x2e\x15\x85\xc7\xf9\x7b\x14\x16\xf2\x02\xa8\x15\x59\xe5\xec\xe5\x56\xdc\xd3\x68\x2f\x9d\xc2\x23\xca\xf5\x75\xb6\xfe\xf3\xfc\xc5\x84\x32\x47\xef\xa9\x55\x36\x0e\x16\xad\x6e\xd3\xde\x2f\xbf\x01\x90\x14\x41\x9e\xe1\x08\xc4\xf7\x5b\x51\xf0\x96\xa2\x36\x61\x7d\x1e\x6a\x70\x02\xcf\x92\x3f\xd8\x39\xe7\x7c\x41\x24\x53\xe4\xad\xa5\x6d\x7f\xee\x43\x00\xda\x45\x9e\xe4\x39\x22\x75\x67\x24\x8c\x87\x7d\xc4\x94\x9d\xad\xf8\x54\xb0\xa0\x33\x83\xea\x9c\x08\xe1\x78\xdd\xb5\xb0\xd6\x23\x9e\x37\xc4\x32\x34\x1c\x01\x14\x84\xdc\x14\x1a\xd1\xec\x33\xf4\x73\x72\x7c\xed\xb7\xc6\x3a\x56\xa5\x64\xf9\xbc\xa9\xaf\xac\x35\x48\x6c\xe1\x46\x9e\x81\x4c\xe9\xf0\xa3\x33\xa9\x00\x8a\x42\x5e\xfe\x70\x85\x30\xfd\x40\x6e\xc9\xa1\x95\x77\x76\x6b\xae\xd1\xd1\x5f\x31\x8f\x3c\xe5\x1e\xbd\xfc\xde\x94\x5f\xe0\x3a\x40\x4e\xa2\x50\x0f\xa0\x0c\xe4\xac\xfe\x85\xfd\xf4\xea\xef\x49\x51\x11\xa3\xc5\x3b\x69\xb5\xae\x87\x13\x0b\x1f\x85\xd2\xe7\x75\x52\xb9\x77\xc5\xef\x4c\x73\x79\xf1\x5c\x02\x00\x4a\x44\x5e\xff\xae\x8f\xd8\xf0\x84\x08\x49\x7a\xad\xc5\x6c\xd2\x82\x80\x54\xf1\x76\x6f\x24\xe7\x83\xab\x2e\xba\xd2\x02\x98\xcb\x8a\x64\x04\xa5\x00\xaa\xf8\xeb\x23\xf2\x37\x87\x53\x8f\xb7\xdc\x94\x58\xe2\x60\xde\xe4\xbd\x72\x51\x22\x53\x99\xac\x43\x69\x51\xbb\x40\x2e\x5f\xab\x95\x5d\xc2\xc9\x0d\x00\x28\x12\xa9\x7c\xc4\x77\xd9\x1c\xc9\x5d\xa8\x76\x18\x88\x3e\x12\xc9\xb7\xee\xb7\x6c\x75\x9f\x86\xab\xf0\x75\xce\x05\xbd\x41\xa3\x13\x37\xab\x31\x9f\x00\xb4\x8c\xbc\xbc\x24\xed\xb9\xe1\x53\x88\xdf\x57\xf5\xab\x93\xf3\x4e\x7e\xfa\x9f\x33\x43\x75\x4a\x60\xe9\x1d\xc7\xf7\x1c\x3b\x9f\x60\x5d\x91\x39\x47\x00\xc5\x21\x13\x6d\x64\xd1\x7d\xed\x81\x52\x80\xf5\xd1\xe7\xd6\xef\xa0\xe6\xb0\xe0\x3a\x39\xda\xce\x89\x2d\xb7\x30\x83\xac\x8a\xf3\x5a\x25\x11\xe9\x00\x8a\x43\xa6\xbc\xac\x28\xb9\x46\xcf\xa5\xdd\xdd\xf2\xe9\x2a\xd5\x6f\xc2\xdf\x0d\xcc\x3f\xde\xda\xe8\xe7\xfa\x54\x06\x61\x14\xba\x4f\x5e\x29\xe0\x00\xd0\x06\xd2\x9a\x3f\x4a\xf3\x9f\x68\x8f\xf7\x0c\xbb\x44\xb9\x3a\x8f\x4f\xfa\xe4\x53\x4a\xb3\xa5\x7e\xf4\xcf\x3c\x9c\xc5\x59\xef\xf3\x27\xc2\x25\x03\x71\xe9\xb2\x8e\x95\xb1\xda\x43\xdd\xec\x19\xaf\xc3\x12\x0f\x6d\xad\xed\x98\x3c\x2f\xe8\xee\x5a\x4a\xc7\x98\xbe\xff\xf8\x51\xfc\xa3\xb3\x9b\x23\x80\x5c\x91\x86\x07\xe0\x41\x2f\xee\x8e\x67\x1b\x5a\xba\x76\x17\x3c\x3d\x3b\x29\x90\xec\xe7\x45\xcc\x76\xf5\x8a\x2b\x0f\x8f\x8d\x7a\x0d\xbe\xda\x27\x00\xe5\x23\x73\x4c\xf0\x5a\x5b\xcb\xa7\xbe\x80\x70\x20\x4d\x2f\xc9\x45\x2a\x21\xdb\x5f\x73\xcc\x4d\x45\xfd\x60\x86\xdb\xd6\x0f\xe3\x2e\x87\x4c\x3f\x00\xed\x22\xf7\xca\xf0\xa3\x12\xcc\xce\x1a\x36\x87\xb3\xde\xa6\xbb\x5e\xd4\x1f\x19\x2f\x14\x6b\xb4\xf1\x62\x31\x50\x27\x34\xae\xa5\x36\xd9\x58\x30\x17\x00\x28\x10\x99\x63\x31\xa7\xcd\xbd\xfa\x38\x52\x06\x82\x4c\x2a\xaa\x0c\x5e\x28\x1e\x70\x62\xa7\x7f\xc5\xfd\x71\xb5\xcd\xfe\x94\xf3\x89\x27\x07\x6d\x99\x01\xd4\x86\x0c\xa3\xf1\x2b\xd1\xb3\xd5\x97\x5c\x86\xcf\x9f\x52\xb5\xf4\x61\x08\x49\x97\xd8\xd4\xb9\xb8\x82\x97\xe4\xf0\xe8\x4b\x6c\xbc\xba\x59\xd7\x91\xbd\x8c\x47\x5e\x5f\xa7\x11\xe5\xad\x77\xd4\x8d\x2e\xe6\x5b\xd7\xb1\x63\x4a\x43\x21\x29\x56\xc5\xb3\x67\x7c\xa3\x57\x94\x79\x5d\xfd\x0f\x5d\x8c\x10\x01\x50\x1a\x92\xcb\x2f\x1d\xb5\x90\x11\xf8\x55\x1c\x3a\x9c\x95\x69\x71\x91\xf5\x88\xac\xb8\xf4\xad\x21\xa1\x9b\x74\x59\xbc\x49\x0e\xfe\xea\xad\x4f\xea\x01\x54\x8b\x54\xb3\x64\x17\xdd\x7c\x32\x2e\xa9\x64\x09\x99\xcf\x3c\xf0\x15\x48\x75\xcc\x0b\x39\x73\xe0\x7b\x9a\xf4\x70\x5e\x26\xe3\x9b\xd8\x6e\x3b\xdd\xbd\x94\x44\x66\xfc\x91\x9e\xa6\xf8\xb9\x7c\xb1\xd3\x37\xd6\x23\xed\x6d\xde\x7a\x36\x5d\xaf\xf7\xab\x60\x09\xd8\x7e\x96\xfa\xc6\xdd\x4a\xe5\x3e\xfd\x55\x00\x4d\x23\x63\x19\x70\xd5\x98\x42\x80\x74\xf9\x54\xc7\x65\x6f\xba\x9b\xad\x5a\xca\x0c\x3b\xa2\x3f\xc9\xcc\xce\x1f\xb3\xd7\xf9\x33\xee\x51\x14\x83\x87\x3c\xf8\x3b\xf5\xfd\xeb\x84\x69\xfe\xe7\xef\x3b\xba\xe9\x32\x11\xb1\xb2\x54\x64\xa9\x86\x74\x57\xf9\xc8\x68\x2a\x33\x83\x39\x35\xde\xc7\x02\x20\x89\x7c\x09\x06\x3f\x9f\x93\xe0\x53\xce\x94\x77\xf4\x9c\x4a\xef\xd5\x28\x69\xf8\x2f\x6a\x0a\xcc\xed\x2e\x4c\x75\x93\xbf\xbf\xe5\xf4\x3b\x2a\x4f\x0f\x40\xc3\xc8\x9d\x2b\x11\x2a\xff\x93\x17\x4a\xb4\xfa\xce\x1a\x45\xee\x98\xc7\x1d\x52\xd0\x93\x65\x78\x95\x1a\x56\xb0\xfb\x4e\x6b\x6b\xea\xfc\xea\xf5\x12\x47\x00\xa5\x23\xaf\x2f\x53\xfc\x9c\x6f\xe1\x22\xd0\xb9\xad\x7f\xef\x43\xc8\xef\xe8\xc2\x3b\xb7\xca\xad\x6f\xad\x3c\x4d\xb4\xf3\x28\xd5\x94\x91\x61\xd4\x02\x50\x3e\xb2\x7b\x6c\x70\x0d\x90\xbc\x7f\xbe\x6c\x3d\xa9\x9d\x64\xc5\x2b\xf0\xd9\xf3\x90\xf7\xfd\xaf\x35\x07\xe6\x1b\x95\x9a\x53\xf3\x24\xa0\xce\x6a\x00\x0d\x22\x53\x46\xa1\x7e\x60\x68\x54\x96\x35\xe0\x9d\x55\x92\x59\x0b\x70\xdb\xfa\xa6\x9a\x49\xee\x4d\xa8\xf3\x7c\xee\xc8\x97\x19\x6e\xbe\x9a\x75\xc4\xa5\x78\xaa\x73\xd7\x92\x94\xbb\xa3\xf2\x32\x3e\xad\x9b\xfa\x42\xdf\xc9\x6d\x7a\x79\xce\x88\xf7\x52\x5d\xba\x51\xab\x6a\xbe\xa1\x4d\x0f\x80\xe4\x0b\xe4\x21\xb4\x5a\x3d\xb7\xf0\x40\xdb\x48\xbb\xb4\xd1\x88\xd7\x55\xf8\xe1\xb1\xfc\x1b\xab\xc6\x35\xbb\x5c\x2f\x18\xc2\xbe\xba\xef\xc6\x7e\x06\xd0\x32\x52\xb9\xf2\x12\x2e\x5e\x14\x3e\x1a\xab\x48\xa8\x7f\x31\x8a\x6c\x37\xf1\x93\xf9\xd3\x54\x41\xc3\xf0\x8d\x6e\xf1\x17\x3b\x9b\xaf\x7f\x38\x1f\xd8\x63\x13\x48\x3f\x25\x74\x37\x2f\x68\x96\x5e\xfd\xbe\xe6\xfb\x94\xed\xbe\x0f\x65\xb1\xc6\x73\xca\x3f\x3c\x54\x6f\xce\xeb\xfe\xd8\x59\x28\x0c\x5d\xba\x88\xb8\xf4\xe0\xb9\x77\xa4\xef\x99\x47\xe9\x42\xd3\xe5\x27\xd9\x5d\x5b\x7e\x47\xb9\x8d\x9d\x1b\xfb\xf4\xe3\xe3\xe5\x31\xe7\x72\xfe\x3c\x4b\x08\x00\x08\x20\x8b\xa3\x93\xa5\xf1\x7c\xe1\xc2\xe7\xd3\x99\x01\x12\xbf\xd3\x5e\xdf\x5d\xac\x3e\xdd\x73\xf1\x8b\x13\xd7\x81\x6d\xed\x3f\x55\x3d\x0d\xe7\x74\x01\x94\x8f\xcc\xac\x32\xaa\xcf\xc6\xa3\xdf\x93\x52\x1e\x07\x7f\xc9\x19\xb4\xc8\x71\x9e\xfc\x7c\x35\xf1\xbe\xfd\x55\x92\xb4\x26\x3c\x3d\x93\xdb\xde\x57\x11\x97\x5e\xcc\xac\xb8\x62\x30\x47\xd1\x27\x7b\x28\xe3\xfd\x35\x5f\x16\x3e\xdb\x77\x39\xa2\x65\x35\x37\xf9\x3e\x2d\x87\x35\x96\x2c\x2b\xaa\x20\x2e\x4d\xf7\xc5\x04\x51\x5b\x79\x17\x13\xcc\xa9\x15\x9e\xec\xc8\x7f\xd2\x9b\x12\xf8\xfb\x53\xb4\x50\xa2\xda\xab\xbc\xb5\xa8\x67\x49\xbe\x00\x40\x83\xc8\xc3\x44\xbf\xce\xa4\x73\x1b\xbe\x55\xf9\xfa\x3c\x26\x93\x87\xbc\xc3\x3d\xd3\x23\x32\x72\x67\x28\xb5\xef\xf6\x4b\x1a\x76\xf1\xd6\x86\x60\x0a\x00\xfd\x44\x9e\xb1\xa9\x8c\x74\xb3\xeb\x98\x9b\xec\xf0\x8c\x38\xe2\x71\xc1\x4e\xd4\x79\xb6\x76\x9a\x20\x5b\x41\xe7\x60\x11\x73\xa7\xf0\x83\x69\xbb\xdb\x00\x40\x8e\xc8\xd6\xae\xf5\x68\x29\xb3\x3e\x27\x43\x5d\xe7\x20\xf7\x19\x30\x2b\xb0\xf6\xaa\x7c\xb4\x5e\x59\xe5\xb2\x4d\xef\xed\x31\xc1\x69\xb7\xfe\x44\x00\x95\x20\x7f\xbe\x8d\xdf\xfd\x99\xe7\xa4\x7d\x47\x47\x62\x38\xa9\xec\xa1\x23\x87\x07\xbe\x3e\xda\x6e\x29\xde\xe1\xe8\xa8\x4e\x2f\xe1\xb9\x66\x7b\x1e\x71\xa9\x78\xf9\xb3\xdd\xe0\x37\xbc\x78\x17\x65\xb9\x9a\x28\xb2\xb2\x4e\xba\x7b\x67\xfb\xd9\x3c\x1c\xe4\x5a\x3d\xfd\xc1\xf4\xcf\x21\x63\xe4\x57\xae\x4e\x7a\xf0\x7d\x57\x10\x94\xdd\xc9\xbd\x4c\x7c\x27\xa9\x21\xca\xc1\x37\xb6\xa2\x66\x58\x96\xef\xad\xfe\xd2\x63\xab\x49\xcd\xda\x0a\xbe\x7f\xe3\x67\x00\xc2\xc7\xc3\xfc\x47\xea\xd6\xf9\xfe\x95\xa1\x61\x11\x8d\x24\xfb\x08\x74\x92\x86\x45\xcc\x1d\xdd\x47\xa0\xf1\xb4\x7d\xc4\xc6\xff\x37\xbb\xd0\xf8\x1a\x90\x76\xc3\x23\x60\xda\x9b\x4e\x0b\x90\x4d\x89\xfa\xba\xf8\xc6\x83\x4d\x8f\x55\x3f\x99\xb0\xc0\x67\xac\x52\xfc\xa9\xd6\xf8\x01\xd9\x2e\xc6\xb1\x9f\xbf\x1a\x4b\x97\xf2\x9e\x90\xc4\x00\x28\x12\xf9\xb0\xa2\x78\xcd\xcd\xeb\xec\x4b\x87\x64\x97\xca\x1e\x1d\x56\xeb\xb5\x1b\x22\x0a\xb0\x66\x7c\xe7\xca\x64\x73\xd2\xd2\xdc\x8a\x8c\x4b\x13\x03\xa0\x28\x24\x0f\x8b\xb1\xe9\x26\x0d\xf5\x6f\xf2\x94\xcb\x35\xb9\x77\x6a\x4c\x44\xe1\xd5\x6a\xbc\xb5\x59\x3c\xcf\x01\xc1\x0c\x21\x56\x96\xef\xd1\x37\xf6\xe6\x35\x64\x65\xbf\x71\x29\x4b\xec\xb6\xf5\x6e\x88\xd8\x6c\x18\x75\x13\x0f\x53\x06\xd5\x8a\x7b\x40\x84\xd5\x43\xfe\xf1\xf7\x83\x17\x32\x2a\xaf\xb9\xf3\xfd\x9b\xd9\xfb\x01\x2a\x80\x1f\x02\x9a\xe1\xfb\x88\x48\x82\x7d\x04\x9a\xe9\xfb\x88\x28\xd2\x7d\x04\x9a\xf1\xfb\x88\x66\xf2\x7d\x04\x1a\x6b\xde\x47\x74\xc3\x7e\xa0\xf2\x66\x1c\xa2\xf0\xd8\x3e\x02\x9d\x39\x63\x11\x99\x70\x8a\xa3\x92\xe7\xfd\x45\xf1\xff\x2d\x6c\x54\xfe\xfc\x1f\x42\x52\x64\xff\x16\x68\x0c\x7a\xff\x16\xbb\xc7\xff\xc7\xd8\x75\xc7\x63\xf9\x7e\x7f\x23\x42\x84\xec\x15\x09\x19\x25\x84\x4a\x84\x1b\xa1\x22\x65\xa4\x21\x23\xa3\xb2\x25\x19\x19\xcf\x85\x88\x32\xcb\x4a\x94\x90\x4d\x92\x91\x91\x4d\xf6\x5e\x21\x25\x24\x2b\xb3\xec\xdf\x4b\x3c\xf7\xf7\xfa\xfc\xf3\xbb\xfb\xff\x7e\xbb\xcf\x39\xd7\x75\x9d\xf3\x3e\xef\x73\xb9\x1f\x3c\x02\x9b\x43\x6f\x23\x22\x88\xf1\x08\x6c\x1a\xbd\xb3\x80\x28\x02\x93\x49\xef\x20\x32\xc9\xf0\x08\x6c\x2e\xbd\x8d\x78\x83\x22\x30\xe9\xf4\x0e\xa2\x82\x06\x8f\xc0\x26\xd4\x3b\x5b\x97\x04\x8f\xc0\xe2\xd4\x78\xc4\x1c\x8a\xc0\x66\xd5\xdb\x88\x78\x74\x23\x62\x13\xeb\x1d\x04\x1d\x1e\x81\xc5\xad\xd1\xac\x46\x82\x66\x35\x2c\x8e\x0d\x14\xb9\x88\x68\xc8\xb6\xb2\xda\x0f\x98\xa9\x54\xf3\xb8\xac\x3f\xf9\xc5\x61\x86\xe3\x49\x8c\x07\x23\xd5\xa7\xc2\xa5\xc9\xad\xfa\x8b\x3f\x5e\xa7\xd5\x4b\x24\xb0\xbe\x30\xfb\x13\x07\x90\x01\xb8\x62\xb1\xd0\x8e\x1e\x22\x34\xfb\xa4\x49\xd5\x71\x51\x56\xc8\xe6\xc4\xb7\x42\xed\x40\xe7\x41\xe2\xc0\xcb\x51\x48\x9a\xaa\x5c\x43\x37\x11\x0e\x20\xc9\xf0\x48\x9e\xf4\x56\x7b\x06\x72\x94\xa6\xf2\x95\xdc\x0d\x0e\xea\x5d\x61\x74\xee\xac\x21\x93\x72\xe5\xee\xc2\x43\x1a\xbd\xcb\x9f\xbc\x97\x6b\x70\x00\x79\x0b\x97\xfd\xca\x4e\xcd\x89\xe0\x51\x3e\xc9\x10\xf1\x27\xc1\x14\xeb\xa3\xb7\x05\x7d\xc7\x4a\x6d\x0b\x7a\xf2\x9f\x69\x78\x2f\xf6\xf7\xc4\x8e\x89\xfe\x9b\xd9\xf8\x00\xfd\x40\x37\x2c\x96\xe1\x78\xc4\x00\x9a\x0d\xb0\x4c\xc7\x23\x92\x77\xe1\x11\x58\xc6\xe3\x11\x6f\x09\xf1\x08\xec\x4e\x67\x1b\xe1\x83\x6e\x26\xec\x66\x67\x1b\x51\x80\xa6\x03\xcc\x7e\x07\x9f\x40\x50\xab\xb0\x3b\x9e\x6d\x44\x38\x1a\x5d\xac\xa6\x07\x8f\x68\x45\xb7\x38\x76\xdb\xb3\x93\xa4\x50\x04\x76\xe7\xb3\x8d\x48\x23\x47\x0f\x1e\x56\xf3\xb3\x83\xa8\x45\xab\x0c\x76\xfb\xb3\x93\x40\xd0\x24\x85\xd5\x01\xa1\x3b\x91\x10\xfd\xad\x17\xcc\x4e\x48\x41\x9e\x88\xc0\x13\x00\x24\x18\x56\xbb\x3b\xe9\x98\x47\xec\x1f\x34\xe3\x0c\xc5\xcd\xd7\xfa\x9c\xc3\x4f\x28\xa6\x6f\x56\x51\xc9\xb8\x64\x14\x50\x38\x3e\x39\x1d\x10\x18\x0f\x90\x75\x98\xc9\x0b\xb9\xb6\x5b\xec\x69\x40\x9a\xf2\xe7\x65\xcf\x9d\x10\x38\x7f\x35\x3f\x34\xcb\x7a\xc4\xae\xd7\xa1\xad\xe9\xcc\xfe\x4a\x77\xeb\x41\x1c\x40\xbe\xc0\x89\x60\x50\xdb\x8c\xb3\x7a\x0f\x17\x97\xa0\xec\x71\x36\x96\xf4\xfb\xed\xde\xfc\xa7\x25\xe4\x2b\x74\x0b\xfc\x75\x05\x4e\x9c\xea\xfa\x75\x08\x07\x90\x5c\xb8\x81\x42\xee\x76\x3f\x23\xf4\xe8\x77\x63\x96\xb7\xd7\xd7\x73\x08\x75\x92\xc1\x85\xba\xff\x2e\xfc\x94\xed\xc5\xa5\xac\x1c\xb5\x1c\x66\x2a\xfa\xaf\x56\x6f\x87\x27\x98\x1e\x1f\x50\x2c\xc3\xf1\x88\x75\x94\x03\x62\x99\x8e\x47\x7c\x41\xb7\x2b\x96\xf1\x78\x44\x2e\x7a\x63\x10\xbb\x1d\xdd\x2e\xdb\x2a\xf8\x57\x60\x35\xa4\xa8\x51\xbb\xf1\x08\xec\x96\x74\x1b\x91\x81\x22\xb0\xbb\xd2\x9d\x5c\x80\x86\x0a\xab\x31\xc5\x23\xfa\x89\xd1\x59\x0e\x66\x83\xaa\x48\xc6\x45\xf8\xf7\x2a\x69\x3f\x9c\xf8\x93\x09\xe9\xe5\x42\x4d\x79\x43\xa6\xf4\x74\x1d\x09\xdd\x95\x0c\x76\x4b\x47\x93\xc5\x0d\x46\x96\x53\x95\x8e\x47\xbd\xde\xd5\xcd\x83\x03\x48\x3b\xfc\xfc\x1e\xb7\x6b\xa0\xf9\x6b\xe0\x1d\xef\xa7\xeb\x33\x62\x76\x3a\xd6\xd7\x5e\x27\x9e\x32\x7f\x9b\x70\x42\xdd\xc0\x7c\xe5\xf5\x8c\xe0\x02\x0e\xc8\x33\x43\x8f\x53\x7c\x29\x94\x7e\xae\x02\xd4\x2b\xef\x7f\xa7\xd6\x54\x2a\x16\x9f\x71\x4c\xbd\xf9\x81\xe4\x9d\x0a\x89\x21\x5d\x77\xd0\xd4\x4b\x19\x1c\x40\xc2\xe0\xd3\xc3\xe2\x24\xcc\x1d\xb6\x91\x70\x6d\xee\x87\x4f\x95\x6c\x10\x8d\x12\x4d\x97\xee\x01\xee\xdf\xb4\x8e\xf4\x5d\xda\x8f\x7f\xb6\xbe\x2e\x16\xfd\x37\xab\xd1\xf8\xa0\x39\x1f\xcb\x6e\x3c\xa2\x1d\xbd\xba\x85\x65\x3a\x7e\x2b\x31\xa3\xa5\x0b\xc3\x76\xfc\x2b\xc2\xd0\x81\x11\xb6\x4a\xb0\xfd\x0a\x3b\xfc\x2b\xb0\x74\x02\x94\x06\x31\xe0\x11\x58\x4a\x01\x1e\x91\x4f\x85\x52\x14\x4c\xc5\x40\x51\x8e\x9b\xe6\xef\xfd\xb0\x76\xb8\xf1\x7a\x3d\xff\x4a\xfc\xd1\xc7\x0d\x77\x37\x5c\x28\xcd\x83\x29\xd1\x03\x7f\x06\xd6\x94\x3d\x0d\x6f\x1c\xba\x1a\x27\x41\xeb\xd5\xcd\xa5\xb1\x55\xb4\x61\xcd\x43\xa0\xce\xce\xb6\x5d\xf0\xf5\xaf\xe9\x8b\x8a\x39\x8b\xc1\x36\xc6\xf2\xc6\xdf\x8b\x69\xd6\xc6\xeb\x05\x83\x8d\xae\xad\xdd\xea\xf9\x83\x03\x48\xdf\x7f\x12\xeb\x1d\xf7\x3d\x92\x5a\xca\xa2\x01\xef\x37\xde\x88\x10\x36\x93\x34\xd4\xe1\xc6\x46\x04\xfb\x18\x02\xe8\xd7\x16\x3d\xdd\x02\xea\x70\x00\xc9\x82\x1b\xb5\x61\x2d\xd9\x9f\xe2\x3f\x76\x9f\xf3\x5b\x92\xae\xdf\x88\xf7\x1d\x5d\x0b\xbd\xd2\x18\x20\xd9\x1f\xec\xd0\x2a\xbb\xc8\x49\xff\x14\x88\xfe\x9b\xd9\xe8\xc6\x40\x4b\x3b\x96\xe1\x28\x45\x41\x17\x01\xcb\x74\x3c\xa2\x0f\xcd\xae\x58\xc6\xe3\x11\x59\x68\xab\x86\xad\xdb\x6c\x23\x00\xca\xc2\xb1\xa4\x1b\x34\x2d\x11\x2e\x35\x12\xfd\x9b\x84\x03\x14\x49\x08\x35\xb8\x1e\xe2\x00\x12\x07\x27\x0d\xd5\xf0\xc9\xd5\x0b\x9d\x7b\x23\x5b\xaa\x4f\x48\xe9\xef\xa6\xb5\xab\x96\x73\xab\x1e\x73\x6c\xf2\xf7\x6b\x3a\xab\xe6\x2a\x78\x7f\x09\x07\x90\x46\x58\xdd\xa4\xf3\x22\xd2\xf1\xe9\xf8\x75\xf7\xba\x86\x90\xc2\xa7\x35\x83\x0b\xed\x84\xf7\x3c\xde\x51\x3c\xa0\x4e\xbe\xb6\x5e\x2a\x95\x44\xaf\xbf\xe5\x38\x3c\x4a\xd9\x78\x35\xe2\x5f\x77\x4d\xfc\x25\xc9\x6b\xde\x93\xc4\x17\xed\x4c\x1b\x46\xef\xd2\xf0\x9d\x53\x08\x73\xd7\xf3\x5e\xcb\x5e\x58\xdd\xc0\x01\x64\x1a\x66\xc7\x31\x7d\x91\xda\x97\x0b\xbe\x4d\x7f\x9e\x3c\xda\xce\xed\x42\xff\xd4\x66\xe3\xcb\x54\x85\xbe\xcb\xf3\x83\xec\xc6\xc1\x8e\xc3\x9b\x22\x5b\xbd\x23\x5c\x74\xaf\xcd\x28\xb1\x0f\x9b\xbb\x51\x75\x98\x53\x28\xf0\xbf\x90\x26\xf8\x11\x66\x48\x9d\x49\x4d\xb5\xc6\x7b\xbc\xb8\xdf\xff\xfb\x9d\x37\x5b\xbc\x01\xde\x7a\xfe\x1c\xcd\x87\x04\x3c\xf6\xe6\xdf\xd3\x2e\x31\x55\x61\x3b\x2b\x19\x27\x96\x4f\x57\x94\xbb\x72\x6a\xf8\xae\xd3\xe9\x21\x01\x97\x83\xa2\xff\x16\x16\xfc\x02\xc4\xa1\x59\x0c\x2b\x30\x78\x44\x23\xca\x7b\xb0\x42\x83\x6e\x24\xb4\x57\xc6\x0a\x0e\x1e\x31\x8d\x32\x70\xac\xf0\xa0\xfd\x38\x5a\xd8\xb1\x02\x84\xb2\xb1\x3d\x68\x7d\xc3\x94\x04\x15\x88\xc8\x48\xb6\x92\xd2\x67\x58\x7d\x29\x95\x4c\xbf\x77\xf0\xb6\x50\xef\xed\x40\x3a\xce\x81\xfb\xec\xfa\xd3\x54\x59\x4b\x42\x8a\x06\xc1\xdc\xd9\xa4\xbf\x8a\x12\x34\x92\x71\x00\x59\x86\x93\x98\xd6\x99\xa9\x73\xf5\xaf\xf8\xd8\x02\xcb\xb3\x22\x1a\xa6\x12\xaa\x52\xbc\xac\xfc\xfb\x58\xdf\xa8\xd9\x27\x52\x34\xb2\x87\xb4\x29\xe0\x00\xf2\x1c\x9e\xae\x5c\x40\xf6\xf8\xee\xd5\x5a\x95\x55\x8d\x3d\x18\x15\xc9\x73\x8c\xa2\x24\xd9\x79\x79\xd5\xf9\x52\x4b\xce\x30\x33\x39\x79\x90\xf4\x17\x1c\x40\xa6\xe0\xbe\x09\xe1\x51\xb9\x21\xb3\xf6\x70\x92\x86\x41\x94\xec\x86\x58\xce\xc7\x7a\xc6\x80\x32\xd9\xba\xb0\x93\x2e\x72\x46\xc1\x0f\xb9\x25\x19\x44\xff\xcd\x6c\x7c\x7c\x3e\xa3\x8c\x18\xcb\x70\x3c\x62\x19\x4d\x63\x58\xa6\xe3\x11\xcf\xd1\x96\x1a\xcb\x78\x3c\x62\x0a\xed\x50\xb0\x75\xd9\x9d\x3a\x4d\x8b\xf6\x66\x58\xd2\xec\x0e\x62\x06\x55\xb5\xb0\xc5\xd9\x6d\x84\x27\xba\x5f\xb1\xf4\x59\x3c\xa2\x84\x08\xfd\xed\x69\x2c\x9d\x16\x28\x7a\x20\x04\xa4\xde\x5b\x07\x09\x4e\x64\x96\xf7\x72\x2f\xbd\xd2\xbc\xcf\xa9\x6b\xd3\x2f\x75\xa4\x43\xc1\xcc\xef\x55\x5b\xf8\x84\xa2\x49\xd9\xd1\xa0\xaa\xdf\x49\xf3\xe3\x71\x38\x80\xf8\xc1\x89\x52\xf3\xc8\x8f\x5f\x4b\x77\xda\xd5\xb3\x3f\x52\x5d\x39\x53\xc3\x51\xc1\x19\xf9\x8e\xa9\x3b\xbf\xff\xb1\xda\xc9\x42\x9f\xa2\xb8\x51\x26\x1c\x40\x66\xe1\x44\xa3\x81\x4c\xec\x7b\xd9\xb3\x6e\xdd\x94\xd9\x9c\xd4\x63\x24\xa3\xb6\x7a\x97\xea\xd5\xf9\x77\x6d\x4e\xe7\x77\x3f\x6e\x41\x66\xbf\xd9\xe1\x00\xd2\xf1\x9f\x9f\x11\x14\xbb\xbd\x9c\x10\xc8\x92\x1a\xf3\x63\x42\x66\xd7\x26\xd3\xc3\xa2\x13\xbe\xfb\x9b\x46\xa3\x5d\x1b\x22\xa3\x3e\xdb\x45\x96\x99\x6f\x11\x01\x78\x8a\x25\x4b\x15\x5a\x6d\xe9\xac\xd2\xbd\x8f\x9d\x9c\xf1\x68\x9f\xdd\x9d\xee\xd2\xf1\x94\x83\xfb\x7f\x9c\x55\x16\xc9\x69\x25\xd6\xf8\x51\x27\xfa\x6f\x6e\xa2\x49\x06\x4d\x4b\x58\x8e\xe2\x11\x7e\x68\xea\xc3\x72\x15\x8f\x98\x45\x2b\x22\x96\xb3\x78\x44\x07\x5a\x75\xb1\xdc\x45\xc9\x12\x39\x4a\x96\xb0\x54\x79\xa0\x48\x78\x60\xd7\x5f\xb2\xe4\x07\xe7\xa5\x75\x09\xef\x46\x09\xcd\xfd\xb4\x16\x5d\x8f\x56\xf7\x12\xdd\xdc\xbb\x6a\xe5\xf5\x91\x61\x77\xaf\x3d\x87\x5a\x5f\x7a\x72\x47\xf2\x75\x1c\x40\xaa\xe0\x36\x6e\xf1\x89\xf0\xf1\xc1\xa1\x71\xa9\x28\x37\xc5\xc8\xc1\x56\xc3\x0d\x49\x83\xb8\x66\xdb\x3a\x65\x55\x8b\xe8\xe0\xe1\x5b\x91\x1c\xf5\x38\x80\x8c\xc0\x57\xad\xcf\xee\xa1\x24\xbe\x31\x75\xb6\x73\xa6\xf3\x6d\x5b\x70\x5a\xeb\xd5\x74\xb7\x9b\x9f\x78\x0d\xea\x52\xf8\x7c\xfc\xde\x86\x51\x1f\x73\xc0\x01\x64\x18\xde\xa8\x6b\x89\x66\x17\x46\x14\x27\x72\xc4\x8f\xe4\xe1\xf6\x28\x8c\x93\xef\xbe\x33\x25\xe7\x65\x79\x79\xa2\xff\xe4\xcc\x2b\x35\x22\xcf\xdf\xa2\xff\x66\x36\xba\x6c\x68\x5e\xc2\x32\x1c\x8f\xa8\x42\xbb\x25\x2c\xd3\xf1\x88\x11\x52\x34\xcb\x60\x18\x8f\x47\x0c\x93\x2d\xcd\xec\xdb\xe9\x45\x25\x64\x19\xbe\xf8\x8a\xcc\x7b\xba\x45\x58\x4c\xa8\x35\xec\xa7\xac\x3f\x7a\x7a\xbf\xf9\xc8\xa1\x4e\x87\xab\x19\x32\x5a\xde\xc4\x40\x71\x73\x63\x73\x33\x82\x13\x1e\x5d\x7e\xb6\x5e\x30\x94\x79\x10\xbf\x38\x33\xd4\x60\xfd\xf4\xdd\x1a\x4b\x5f\xb2\x1f\x8e\x5f\x48\x90\x3d\xfa\x78\xcd\xb1\xb5\x30\x43\x38\xfa\x2c\x32\x62\xc8\x47\xce\x43\x3c\xf5\xc3\xf3\xca\xdd\x9b\xc5\x17\x8f\xde\x7c\x48\xd4\x19\x5d\xbd\x24\xc2\xe9\xac\x35\x52\x5c\x8d\x03\xc8\x20\xcc\x47\x3a\x25\x2c\xbc\xb8\x4f\x71\x93\xbb\xc5\xda\x5c\xa1\xfb\x3c\xf2\xf8\x1d\x9f\x99\xb9\xa6\x91\x7b\x6a\xb9\x45\xcd\x43\xb6\x98\x1b\x88\x27\x40\xfc\xfe\xf3\xe3\x57\x49\x6b\xa9\x92\xd7\x7d\x92\x92\x1e\x31\xb1\xcc\x65\x85\x5e\x28\x2c\x76\xaa\x21\x17\x23\x55\x6f\xb9\xc6\x77\xc1\xec\x1d\xb9\x17\x40\x32\xe1\xcd\xa3\xb6\x44\x9f\x27\xac\xfa\x9d\x37\x80\x31\xf5\xc5\x4a\xb4\xb5\xba\x5d\x75\x61\x6e\xae\x2e\xd5\x7b\x19\x07\xfa\x3b\x87\xa8\xf6\x84\x00\xa4\x19\x7e\xfc\x5b\xcb\x87\x86\xf4\x36\xaf\x4a\xc1\x68\x09\xa3\x32\xee\x30\x69\xf1\xd6\xdb\xe5\x8c\x72\x36\x06\x02\x6d\x7b\xb4\xa2\x5f\x76\x84\x7b\x02\xe4\x29\x7c\x4d\x7f\xef\xab\x73\xf3\xcb\xc6\x35\x24\xdf\x74\x9f\xbf\x19\xf3\x7e\x46\x4d\x70\xb8\x24\x87\xc0\x4f\x76\xe8\xc7\x38\x90\x54\x2f\xa4\x51\x02\x48\x22\xec\xec\x32\x45\xb3\xdb\xde\xc2\xf2\x1b\x79\x16\x66\x46\x15\xe5\x0b\x1f\x78\xe8\x57\x57\x7f\x19\x1b\xf2\x37\x2d\xa7\x8f\xb4\x9d\x5b\x65\x05\xc8\x00\x6c\xcd\xa1\xc7\xe4\x65\x75\xf9\x7b\xae\xcc\x36\x4a\xc5\xc8\x7e\x6f\xcf\x2a\x4f\x5c\x3c\x22\x39\xfe\x55\xe4\x43\x40\x6f\x1a\xdf\xc6\xa9\x59\x00\x90\x68\xb8\x82\xcb\xfe\xaa\xa5\x67\x1e\xfc\xca\x10\xa6\x15\x16\x12\x10\x90\x94\xee\x9e\x97\x97\x5f\xc1\xdc\xbb\xfb\x55\xdc\x86\xd8\x58\xae\x5a\x0e\x40\x86\xe0\x83\xb8\x2a\x3a\x5d\xd7\x2b\xde\x1b\xab\xae\xb4\x90\x75\x91\xd1\x63\x44\xc5\xa9\xa2\x20\x3a\xa8\xab\x93\x24\xa0\x4c\x92\xfd\x42\x7e\x0d\xf4\x28\xf5\xc5\xb9\xe1\xae\xa3\xfd\x60\xc2\xca\xc8\xb9\x81\x66\xed\xac\x52\x98\xf1\x2c\xb3\x6e\x92\x9c\xdf\x4b\xf3\xe3\x49\x52\xec\x3e\xb0\x11\x1b\x79\x47\x49\xce\x05\xba\xf1\x25\xaf\x37\xa8\x24\xcd\xa5\xe7\x75\x5c\x90\x38\x7b\x84\xbf\xe8\x85\x81\x4d\xef\xaa\xb8\xb2\x05\x0e\x20\xdd\xf0\xf1\xdb\x2b\x78\xfe\xb0\x99\x36\xff\x6b\xf6\xa1\x8d\x5b\x7a\x97\x97\x15\xfa\xd8\x27\x9d\x59\x10\xcd\x42\xbf\x9f\xf7\x49\x54\xac\x99\xe1\x8e\x9a\x6d\xba\x7c\x3a\xa7\xa9\xd5\x65\x85\xe0\x6c\xc8\xe1\x63\x6e\x6f\x10\x0a\x02\xc5\xdb\x7b\xd8\xad\x8c\xfc\xed\xef\x8d\xab\x09\xe8\xe0\x00\x32\x0f\xff\xe9\xa1\xdf\x32\x81\xbd\xef\xab\xa9\xef\x55\x08\x2f\x28\xdf\x52\xdf\xfc\xfd\xf9\x26\x91\xa4\xa9\x04\xc9\xd1\x76\xe7\x03\x8c\xf2\x1c\xcf\xa1\x47\xf3\x1e\xd8\xdd\x8f\x30\x25\xcc\xd4\x69\x10\x6c\xb9\x12\x28\xdf\x8c\x0c\x79\x05\x89\x5c\xab\x25\x7a\xc9\x7c\x69\x52\xa7\xf8\x1c\x5c\xa8\x5e\x0d\xad\x45\xfd\x51\x69\xd0\xea\x5d\xea\x53\xae\xb9\x43\xa2\x41\x42\xed\xd4\x70\xb1\xfa\xbc\xe8\x2c\xf1\x19\xfa\x9a\xfb\x19\x9b\x00\xc8\xeb\x42\x8f\xdf\xbf\xcb\x21\xe2\xc6\xc6\x3c\x04\xd2\xdc\xe3\xcb\xf9\x25\xb4\x8e\x29\x4a\x19\x36\x68\xf2\xea\xab\x9d\xca\x16\x4e\x50\xd5\x89\x00\xc8\x08\xcc\x92\xc8\x8f\xb5\x18\x1d\xbe\xbf\x76\x99\x90\xb5\x42\x28\x97\x2f\x82\xd3\x02\xb7\xd6\x3a\x6c\x3d\xbb\x57\xd8\xff\x3d\xaf\x4d\xaa\x03\x8b\x27\x40\x3c\x61\x6b\x62\x7d\x9c\xcd\x1e\x0a\xc5\x4b\x99\x57\x8a\xe8\x74\xcc\x1d\x54\x71\x1c\xae\x94\xbb\x68\x5b\xff\x78\xd2\x4e\xfe\x0a\x47\xee\xb5\x28\x80\x04\xc1\x6b\xbe\x72\xec\x7e\xf3\xd3\x19\x06\xe7\x7d\x7f\xba\xb3\xdb\x5c\xab\xdc\x58\xee\xf4\xaa\x7e\x3b\xac\xa7\xcf\x7b\x96\x20\x60\xdc\x9d\xa3\x1c\x20\x1d\x70\x11\x3c\x2c\x43\x7b\x83\xcd\x5c\x86\xee\xd4\xdd\xa3\xf3\xbd\x9a\xdf\xaf\x95\x69\x5d\x4a\x8f\x17\xf3\x21\x78\x37\x28\x49\x2d\x70\xf8\x14\x15\x00\xf2\xb0\xf1\x86\x2b\x6b\x99\x82\xdf\xe8\x0d\x39\x13\x1b\x57\xc5\x72\x4f\x9d\x9a\x73\xb1\x7a\xb2\x6e\xa6\xd4\x2d\x87\x08\x2c\x98\xb6\x77\xfa\x00\x24\xf0\x3f\x4a\xfa\xfe\xc7\x1a\xea\x64\xd1\xc7\xab\x7e\x87\xe9\x8d\x46\x92\xc5\x5c\xac\x9a\x8e\x37\x28\x53\x2b\x6b\x32\x1d\x58\xcf\x8c\xdd\xbf\x1f\x00\xa4\x14\x2e\xf9\xcf\x40\xb1\x31\xa1\x39\xfb\x27\x79\x07\x8a\xf1\x63\x33\xb1\xfb\x13\x44\x14\x1a\x04\x23\x0e\x73\xf6\xbc\xcf\x27\x4e\xee\x72\xd5\x05\xc8\x32\x7c\x7c\x14\xdf\xd9\x72\x2c\x7e\x0d\xf9\x56\xa9\x1d\x6e\x70\xfa\x68\xd0\x43\x2e\x92\x96\x34\xea\xcb\x6c\xf4\x19\x42\x8a\xbb\xea\x42\xe9\x34\x01\x90\x77\x80\x4f\x5b\xe9\x65\x5a\xde\xaa\x21\x5d\x95\xb7\x84\x8a\x07\xc5\x4c\x09\xf6\x79\x0a\xf3\x98\xc9\x17\x52\xca\x5c\x9e\x99\xa3\xa9\xa1\xbd\x02\x90\x7e\xf8\x4a\x4f\x65\x23\x19\x87\x7a\xf7\x2d\xd1\x23\x4e\x62\xeb\x72\x93\x93\xb4\xf4\x4c\x9f\x6d\x0e\x19\x59\x37\xa6\x45\x31\x99\xb3\x8d\x14\x4d\xe3\x00\x92\x00\x1f\xce\xa3\x67\xc4\x0c\x28\xdd\xe9\x47\xfd\x86\x1a\x77\xe9\x3a\x2f\x04\x19\xff\x5c\xe1\x09\xd3\xff\xed\x59\x3b\xed\x58\x16\xae\x26\xb3\x6b\x2b\xb5\xc0\x8d\x17\xdf\x15\x9e\x26\xa2\xa7\x96\xf1\xb5\x1e\xa9\xdf\xde\x88\x48\x97\x1c\xdb\xb7\xb4\xeb\x2a\x2f\x61\xfb\x9f\x1b\xee\x8d\x73\x7b\x47\x1e\x00\x24\x12\xa6\x37\xed\xaf\x78\x37\x53\x0e\xc5\xb0\x0d\xd1\xd4\xd5\x52\x2f\x3a\x7f\x5e\x38\x42\x1b\xb6\xde\x73\x71\xa0\xe7\x8a\xda\xee\xf5\x29\x82\xe7\x00\xc9\x81\x43\xef\xf4\x34\x72\x4d\xdd\xa5\x82\xd2\xf9\xfa\xe4\xe4\xe8\xcf\x10\x8a\x80\xee\xe5\xfc\xc9\x9e\xee\xdd\x02\x77\x92\x29\x22\x8b\xa3\x11\x00\xe4\xe1\xc4\x45\x69\xf8\xc4\x94\xbf\x3c\x53\xd5\x23\xf2\xb9\x87\xe8\xb3\x22\xe7\x16\x41\x31\x96\xb4\x82\xba\x32\xc5\x89\x90\xd7\x4b\x37\xca\x6a\x01\xe2\x0f\x27\xe9\xb2\xd8\x1c\x11\xe2\xe3\xfd\xd1\x17\x24\xf6\x3e\x9b\xb5\xf9\x79\xed\x18\xd5\x7e\xdf\x02\xdb\xf4\x9a\xf4\xfd\xe9\xe5\xe5\x79\x64\x14\x9e\x00\x69\x83\x95\x60\x0d\x6d\xca\xdf\xe5\x92\x3e\xec\x49\xe7\x52\x42\x7d\xde\xb3\x84\x5d\x2b\x03\x87\x8e\xe5\x6f\x48\xe7\xc6\x07\x7b\xf7\x78\xb6\x97\x00\xa4\x1b\x96\x4f\xbc\x83\xea\x52\x96\xdd\xac\x26\xbe\xf9\x83\xe1\x3d\xa1\xfe\xc3\x83\x57\x79\xde\x2a\x9d\x20\xf0\x65\x7f\x83\xbb\xc4\xee\x46\x12\x05\x90\x29\x38\x34\xba\x69\x4b\xcf\xdb\xe9\x0a\x26\xf4\x8b\xd6\x4f\xfe\x51\xfa\xcc\x67\x72\xf0\x33\x19\x0d\x1f\xa8\x25\xf2\xbb\xc6\xbf\x5b\xfb\x4f\x3f\xf4\xe8\x1d\x16\xe2\x1f\x4f\x2c\xde\xbd\x31\x09\x92\xb1\x18\xfb\xe4\x99\xb0\x2b\x3f\xc0\x72\x75\x7f\x4d\x75\xf9\xe5\xb3\xc6\x8d\x1b\x2d\xe9\xd0\xa3\x2d\xe9\xac\x9a\x1a\x5c\xd6\xed\xe6\x05\x19\xca\x86\x5f\x95\x2c\x2f\xd6\xf1\x2c\xb7\xb0\xd1\x9f\x19\x99\x7f\xc6\x18\xe1\x5e\x1a\x0b\x3d\xea\x68\xd5\x95\x8e\x73\x21\x57\x6e\x7f\x75\x33\xdd\xc5\x22\x7a\xc9\x29\x96\xd2\x21\x2a\xf8\x9c\xb8\xed\xd8\xbd\xf0\xea\xe8\x0a\x3a\x1c\x40\x16\xe1\xad\x42\x56\x39\x39\x52\x12\xf7\xc5\x2d\x3b\xff\x61\x96\xe6\xad\x16\xf5\xb7\x3d\xf5\x1f\xaf\x5f\x9a\x99\x0a\x0d\xc9\x7d\xc1\x20\x52\x06\x7f\xe5\x4c\xb4\xfd\x08\xf3\xf0\x5d\x1f\x2e\xb1\x7c\xe9\xf6\x3b\x2f\xa2\x52\x74\x5e\xd8\xa4\x46\xe4\x7d\x79\x78\x5e\xcf\x64\xc3\x84\x8b\xbf\x05\x07\x10\x0f\x78\xdd\x71\x64\x76\xcc\x60\x75\xd6\xcb\xce\x6c\x81\x67\xcf\xea\xf3\x89\xe3\x24\xc3\xec\x7e\x9b\xac\x37\xca\xff\xdc\x35\xa4\xaa\x17\x88\xf0\x04\x48\x2a\xbc\xf0\x2d\xc4\xbf\x38\x0c\x1e\x5b\xad\x4d\x1c\x5d\xe6\x0b\xa2\x4f\x3b\x39\x91\x73\xdb\x2c\xda\x3c\x91\x64\xd7\xf4\x33\x99\x71\x17\x44\x14\x20\xed\xf0\x42\xf2\xd8\xaf\xb3\x15\xa7\xb2\x13\x7f\xeb\x0e\x59\xcb\x21\x98\xde\x35\xef\x7e\xc8\xc1\xe5\xbc\x85\xf0\xa0\x92\xa6\x6b\x20\xf2\xdd\x12\x20\xb3\xf0\xca\x84\xaa\x0c\x5e\x8e\x50\xbd\x97\x5f\x26\x71\xe3\xdb\xd5\xbc\xc6\xcc\xe1\x40\xa1\x42\x9a\x01\x99\x97\xaa\xd7\xe3\x0e\xb8\x1d\xb2\x76\x03\x00\x49\x87\x17\x7e\x60\x8a\xb1\xbe\x96\x68\xfe\x91\xb8\x70\x28\x8e\xac\x29\x54\xfd\x2c\xae\xc2\xa9\x8e\xce\x6d\x72\x59\xbf\x8d\x35\xd3\xb5\x7c\x1d\x20\x1d\xb0\xb3\xe5\xad\x2e\xca\x94\x08\xa5\xd8\x49\x62\xe5\xa9\xf4\x53\x99\xbe\xe1\x9c\x2d\xa6\xa5\x97\x89\xc6\xd9\x85\x2d\x7a\x1b\xc3\xde\x84\x01\x80\x00\xf8\x48\xd7\x70\x05\x3a\xf4\xa6\x3b\x90\x1d\xeb\x8d\x92\xd8\x7d\x8e\x62\xb9\x3e\xea\xea\xa9\x2b\x1f\x9f\x8e\x93\xa7\xb5\x71\xbe\xa1\xae\xa5\x07\x48\x3d\x6c\xbd\xa0\x4c\xe4\xc2\x62\x4b\x57\x49\x9d\x07\x52\xf9\x42\xc1\xf5\xfd\xc7\xfb\x17\xd7\xe6\x65\xb2\xfd\x6e\xd3\x11\xc8\xf8\x95\xbe\xba\x8d\xe7\xc9\x58\xec\x09\x28\x52\x92\x11\xfc\x95\xa7\x27\x60\x65\xc7\xf7\x38\x75\x3e\xef\x68\x73\xc9\x83\xb6\x93\xd2\x62\x3f\x53\xb5\x2c\x41\xc8\x91\xcd\xe4\x32\xff\x1f\x44\xee\x3e\x97\xde\x88\x59\xe3\x00\xd2\x08\x67\x47\xf2\x91\xcf\x5f\xcf\x11\x70\x2e\x99\xce\x53\xc9\xe7\x52\x3b\x73\xf7\x1e\x9c\x38\x4c\x3e\x1c\x71\x24\x25\xfa\xa0\xd8\xa9\xec\xf2\x0a\x1c\x40\x9a\xe0\xca\x31\xa2\xfb\x51\x38\x28\xd6\xdc\x4c\x63\xbf\x42\x86\xaf\x68\x41\x34\x57\xcf\x81\x2b\x62\x27\x8b\x4c\x96\x9e\x3a\xf5\x3c\x95\x3b\x47\x83\x03\xc8\x43\x38\xf8\x93\x2e\x87\x4e\xdd\x8d\x66\x69\x52\xfb\x70\x04\x79\x6f\x5a\xd5\x17\xa6\xe2\xd1\x63\xb0\xf0\x87\x47\x41\xec\x79\x78\xd8\xa9\xeb\x82\xa2\xff\x66\x36\x40\x88\xfe\x32\xd2\x09\x54\x75\xc1\x32\x1c\x8f\x68\x44\xdb\x1b\x2c\xd3\xf1\x88\x26\xb4\x85\xc2\x32\x1e\x8f\x78\xc8\x80\xf6\xbd\x58\x4c\x16\x28\x72\x11\x73\xed\xda\xea\x7b\x8b\xe1\x5d\x51\x69\x7a\x66\xff\x91\x8f\xc6\xa2\xfb\x73\xf8\x4f\xff\x42\x12\x34\xac\x7f\x18\x5e\xbc\xdd\x72\x8f\xa0\xb2\x7a\xfd\x19\x7d\x9a\x8e\x0a\x0e\x20\xe3\xf0\xb2\xd5\x0e\x8f\x1a\x4e\x06\x2f\x92\xa6\x50\x92\x86\x3d\xf3\x7d\xcf\x14\xe2\x1c\xc3\xb6\x6b\x5f\x6c\x80\x38\x53\x9e\xea\xc4\x60\xa5\x3e\x0e\x20\xe5\xf0\xa5\x1d\xff\x05\xeb\xaa\xd2\xc0\x5a\x83\xc1\x44\xce\x4f\x2f\xdf\xfd\xe1\x08\xf5\x67\x7e\x12\xee\xfa\xfa\x7e\xd9\xed\xe3\xfe\xd3\x77\x13\x78\xb7\xba\x3a\xb8\x0a\x92\xc9\x34\x72\x84\x36\xa7\x09\x13\x5c\x12\xe7\xe9\x8a\x8c\x6a\x4b\xfb\x6d\xb5\x9b\xbc\x9f\x49\xb7\xf3\x7d\x11\x0d\x4b\xf1\xe2\x56\xfb\x14\x0a\x53\x5a\xaa\xd2\x45\x46\xa4\x35\xf7\x3e\x79\xb1\xd4\x13\xcd\x5b\xce\x09\xe3\xb5\x2e\x06\x8c\x56\x7f\xb8\xbf\x14\x1b\xbf\x51\x35\x33\x63\x15\xfd\x37\x37\xf1\x01\x2d\x46\x3b\x4c\x2c\x47\xf1\x88\x71\x74\x99\xb1\x5c\xc5\x23\xca\x51\x41\x04\xcb\x59\x3c\xa2\x03\x6d\xb9\xb0\xdc\xc5\x23\x42\x19\x51\x45\x1b\xa3\x63\xc1\x23\x06\x51\xd1\x05\xbb\x67\xd9\x46\xf8\xa1\x6d\x1d\x76\xdb\xb2\x8d\xc8\x44\xfd\xc0\xea\x5c\xf0\x88\x66\x14\x81\xdd\xbb\x6c\x23\x9e\xa2\x9e\x63\xb7\x2f\xdb\x88\x44\xd4\x73\xcc\x0e\x66\x07\x31\x80\x5a\x85\xdd\xc3\x6c\x23\xa2\x51\x31\x0f\xab\x8d\xc1\x23\x86\xf6\xa1\x5a\x3e\x56\x3b\x03\x14\xc9\x48\xe8\xfe\xfe\x8b\x65\xf6\x7f\x68\xca\xb7\xea\x43\xbc\x7b\x2a\xfb\xa2\xe2\xe7\xe6\xaa\x65\xcc\x27\xcf\x84\xc4\x30\xc9\xce\xd0\x52\xaa\xd6\xf9\xb4\x5c\x0c\x39\xea\x88\x03\x48\x29\xdc\x7f\xb4\xb4\x0c\xd9\x1d\xff\xc4\xbf\xa1\x59\x69\x91\x55\xf2\xed\xf3\x8f\x28\xf1\xaf\x33\x2c\x2c\x1b\x19\x4a\x8b\x66\xb9\x35\x57\xc5\x97\x70\x00\xe9\x82\xeb\x95\xfe\x98\x1e\x69\xb4\x3a\xe1\x35\x45\xf5\x42\xb9\x9a\xac\x7c\xc3\x88\x1f\x61\x69\x72\xd7\xa5\x6c\x62\xd7\x4d\xae\x06\xe9\xf3\x7f\xc5\x01\x24\x0f\xb6\xe7\x7c\x99\xce\x69\x71\x07\x32\xee\x63\x26\x1b\xac\xc9\xe6\x3e\xf6\x94\x63\xc5\xcc\xef\x7a\xeb\xdf\x6e\x04\x16\x04\xd1\x6b\x84\x8f\xe3\x00\x92\x03\xdf\x6f\xe5\x50\x3c\x44\xab\x4a\x40\x74\xf6\x9a\xaf\xe1\x6a\xfc\x6d\xe7\xd2\x18\x3e\xc4\x84\xed\x69\xb5\x90\x02\xb2\x18\xd6\xf0\xa0\x9c\x11\x07\x90\x97\xb0\xc2\xfb\xc1\x69\x5c\x3b\xfa\xdd\x0c\x3b\xe3\x85\xe7\x55\x24\x6a\xfb\xbe\x58\xf3\xe6\x1c\x5a\xe7\x59\x91\x56\x35\xfd\xc6\x3b\x63\xe4\xf3\x5e\xf4\xdf\xc2\x82\x5f\x80\x6c\x74\xc6\x8b\x15\x18\x3c\xa2\x14\x15\xcd\xb0\x42\x83\x47\x74\xa1\xfa\x2b\x56\x70\xf0\x88\x3c\xd4\x2a\xac\xf0\xe0\x11\x39\xe8\x18\x09\x2b\x40\x78\xc4\xcb\xff\x5d\x82\xc2\x6a\x8f\x81\xa2\x87\x07\x01\xc5\x16\x19\x98\x82\x8b\x75\xb3\x79\x92\x7c\xd8\x93\x40\x95\xb7\xb4\x36\xaf\x83\x8f\x90\x3f\x09\x19\xe6\x91\xaa\xba\x7f\x4d\xed\x6b\x6d\xfc\xa0\xc2\xdc\xa0\x18\x0e\x20\xbf\x61\x06\x5e\xfe\x9b\x49\x43\xff\x81\xe8\x1f\x8b\x03\x1d\x0b\x86\xcf\x37\x39\xd3\x43\x38\x2a\xa4\xc8\xaf\xb6\x0e\xde\x1b\x11\xda\xe3\x4e\xa8\x8c\x03\x48\xe4\x7f\xb6\x06\x42\xd5\xdb\x5c\x7c\x66\xe2\xbe\xb3\xa1\x9f\x62\xf5\x17\x40\xc5\x51\x3f\xd4\x63\xd4\xd6\x61\x54\x58\x70\x57\xfc\xee\x93\xbd\x38\x80\x78\xc3\x54\x89\x57\x9a\xb2\xb7\xe2\xea\xd5\xeb\x22\x9a\x0b\x06\xbb\xb9\x6a\xf4\x07\x23\xbf\x18\x7d\x7b\x7e\xe3\x10\xaf\x93\xa7\x2f\x8f\xea\xec\x2d\xd1\x7f\x33\x1b\x1f\xa0\x29\xb4\x50\x63\x19\x8e\x47\xfc\x46\x73\x25\x96\xe9\x78\x44\x24\xba\x6c\x58\xc6\xe3\x11\xde\xe8\x05\x25\x2c\x91\x02\x8f\xe8\x26\x43\x3f\x35\x82\x25\x56\x00\x45\x9a\x5d\x95\x04\x5b\xf4\x21\x11\xce\x19\x99\xac\x72\x0d\x7f\x5c\x6b\x0b\x44\x13\xbf\x0b\xbd\x2c\xf3\x34\xe0\x15\x25\x93\xa2\x94\xf1\x88\xfb\xbe\x3c\x95\xd2\xd3\x55\xf9\x08\x07\x90\x3e\xf8\x7f\x33\x3e\xcc\x14\x72\x0c\xe5\x22\x2d\x65\x62\x77\x8e\xbb\xae\xf9\x3b\xe6\x2a\x37\x03\xd5\x67\xc7\x2f\xdf\x56\x05\xe5\x5d\x6b\x43\x6a\x38\x80\x3c\x83\x37\x46\x30\x3b\x85\x99\x94\x87\xe8\xad\x91\x90\x1f\xcd\x9f\x3d\x5d\x88\x8f\x46\xc6\x5d\x73\x2d\x3a\xc8\xa5\x6f\xfe\x80\x4e\x82\xb1\xfe\x2d\x0e\xc8\xc3\xb7\xcb\x7f\x9f\x12\x4b\x9d\x1f\xd1\x34\x08\xbb\xe9\xb2\xef\xbb\xe5\xef\xaa\x3b\x7c\x3a\xa7\xf2\xf6\xf4\xdc\x98\x9c\x21\x3f\x9f\xf1\x48\xae\x06\x07\x90\x64\xb8\x6b\x15\x69\x74\xf2\x13\xf2\xd0\xb9\x97\xb0\x22\x71\xe9\x3c\xe3\xe9\xbe\x9a\xdd\x67\x12\x3c\x9a\x3e\x17\x5c\x13\x54\xab\x18\x9a\xa0\xc6\x5f\x62\xc0\xf2\x12\xad\x24\x68\x02\xc0\xf2\x13\x8f\xe8\x43\x2f\x63\x61\x79\x8a\x47\x3c\x43\xff\xf5\x10\xcb\xd9\x1d\x84\x3c\x3a\xb1\xc1\xf2\x16\xff\x8a\x64\x74\xfa\x87\x25\x49\xe1\x11\xf3\xff\xfb\x40\x09\x96\x34\x05\x14\x69\x68\x08\x5e\x6e\x65\x8c\x7a\x78\x63\x38\xc7\x08\x64\x95\xdf\xb9\x1a\x74\xe1\x59\xed\x19\xff\x29\xd1\xd5\xcf\x4a\xfd\x49\xfb\xc6\xb4\x3b\x48\xeb\x6d\x6e\x2d\x84\x4a\xda\xe2\x00\x02\xe0\xa6\xf3\x2a\x9b\x4a\xa7\x36\x93\x0b\x89\xa8\xf1\xa9\x8b\x82\x05\xa7\x02\xe2\x05\x7c\xa9\x3a\x76\xc9\xc7\xcd\x35\xfa\x27\xef\xf6\xbd\xa5\x8c\x03\xf2\x17\xe1\xda\xa3\xf3\xa9\x54\x33\xb5\x45\xa0\x91\x80\xb5\xfd\x48\x46\x75\x2c\x53\xee\x7e\x36\x95\xe3\x0c\x12\x69\xcf\x58\xe9\x39\xdc\xfe\x94\xe0\x00\x32\x0c\xd7\x2a\x93\x2a\x21\xe9\x3e\x5b\xc6\x9f\xf3\xa6\xc6\xd5\x15\x62\xc1\xf6\xd6\xf7\xae\xf3\x67\x74\x19\x1d\x56\x55\x73\x3c\x1f\x2c\xf9\x29\x4b\xf4\xdf\xac\xc6\xc7\xa7\x1e\x5d\x66\x2c\xbb\xf1\x08\x80\xfe\x18\x05\x96\xe9\xf8\x65\xbe\x88\x7f\x05\x96\xed\xf8\x57\x0c\x53\xa1\x8b\x86\x29\x12\x2a\x12\x9d\xf9\xfb\xd3\x03\xf2\xe2\x70\x47\x59\x7c\xaf\x62\xc9\x95\xc1\xa8\x4c\xa9\x9f\xac\xe1\x5d\x51\xdc\xe2\x80\x7a\xf6\x0c\x49\x4f\xa6\x1e\xe5\xae\x31\x87\x92\xb6\x38\x1c\x40\x36\x60\xc2\x20\x79\x75\x5c\x27\x4d\x4c\xe0\x78\xa0\x32\x1d\xff\x6b\x5a\x72\xf1\xf8\x16\xdf\xb3\xf1\x95\x02\x4f\x59\x6b\xa8\x24\x6f\x4e\xb6\x87\x6c\xf1\x56\xf8\x34\x53\xe7\x12\x87\x83\x82\x0b\xef\xd9\x38\x96\xba\xaf\xc7\x7e\x88\xb0\x9f\x55\x7e\x28\x08\x2e\xf7\xd8\x18\x69\x7e\xd7\xb0\x7b\x34\x8a\x03\xc8\x24\x4c\x00\xee\xbc\x6d\x7f\x96\xe1\x91\x44\xd7\x4e\x9c\xf6\x69\xf1\x14\xa2\xf3\xac\x37\xec\xb1\x4b\x52\xed\x1b\xdc\x1d\x4f\x9e\x88\x7d\xe3\xe5\x22\xff\x66\x36\x3e\xa0\xe2\xf8\x80\x62\xd9\x8d\x0f\xe8\x06\x5a\xcd\xb1\x2c\x47\x69\x3a\x7a\x36\xb1\x6c\xc7\x23\x26\xd1\x7f\x18\xc7\x56\x6a\xb7\xdd\xd0\x45\x1b\x57\x0c\xad\x16\xff\x8a\x11\xd4\x0d\x6c\xb5\x76\x1b\xe1\x89\xd6\x43\x6c\xc1\x76\x1b\x11\x84\x8e\x9d\x30\x35\x5b\x7c\x0f\x84\x7e\x01\x02\x5b\xb6\xdd\x76\x1c\x75\x03\x53\xb8\xdd\x79\x45\x20\x8a\xc0\x96\x6e\x77\x18\x1f\xda\xfc\x61\xaa\xb7\x3b\x88\x65\xf4\x02\x24\xb6\x80\xbb\xed\x86\x03\xea\x06\x86\x84\x8b\x7f\x45\x3f\xca\x03\xb0\x44\x5c\x3c\x22\x01\xed\x4e\xb0\x65\xdc\x9d\x2e\x0b\x2d\x11\xd8\x4a\xee\x0e\x9f\x41\x3b\x6b\x4c\x31\x17\x4f\x5c\xd1\x0f\x0b\x60\xeb\xb9\xdb\xa1\x42\x1b\x39\x2c\x45\x17\xff\x0a\x7f\x94\x96\x61\x6b\xba\xdb\x88\x36\x94\x7f\x63\xcb\xba\x3b\x24\x0b\xbd\x5c\x86\xa5\xec\xa2\xf4\x92\x1e\xa5\x65\x58\x0a\x2f\x50\x90\xa3\x0c\xda\x62\x65\x31\xff\xf9\xe5\x28\xa5\xd7\x0b\x13\x92\x1c\x02\xdd\x01\x59\xc1\xd7\xac\x8c\x15\xe8\x56\xc5\x47\x8b\x2c\x04\xbb\x79\x59\xda\x64\xfb\x78\xdb\x68\x71\x00\x99\x85\x13\xe7\xdb\x73\x12\xb6\x0c\xf4\x7b\x95\xbf\x89\xc9\x1e\xfd\x2a\x2d\x16\x7e\xdf\xdc\xe5\x6c\xcc\x6b\xab\x5f\x45\xf3\xee\x27\x0f\x0d\xd7\xbf\xc7\x01\xa4\x18\xae\x8e\x04\x9f\x22\xcd\xf6\x38\xc9\xcb\xfc\x68\x5a\x22\x9a\xf5\x17\x38\xef\x50\xe5\xbc\xaa\x43\xee\xf8\xec\x53\x60\x70\xa0\xcb\xcb\x5a\x02\x1c\x40\x0a\x61\xfa\x9d\xc3\x11\xd3\x53\x96\x5b\x74\x5d\xbf\x51\xdd\xe8\xab\x81\xad\xc8\x08\xcd\x7d\xfb\x3d\x5e\xda\x6f\x18\x85\x7a\xba\x5d\x7e\x20\x2c\x38\x80\xf8\xc1\xc5\xdd\xb7\x92\xab\x20\xd6\xe9\xb8\xf5\x2f\xee\x4f\xed\xda\xef\x0e\xf5\xbd\xa4\x1a\xa0\x30\x96\x5b\x2c\xb5\x3a\x56\x57\xc0\xc9\x94\x7a\x49\xf4\xdf\xdc\xc4\xc7\x33\x06\xa5\xd2\x58\x8e\xe2\x11\xb3\xe8\x4d\x1a\x2c\x57\x51\xe1\x08\xdd\x17\x58\xce\xe2\x11\x85\xe8\x31\xc5\x72\x17\x15\x5c\x28\x96\x22\x89\xfe\x4d\xce\x07\x08\xbf\xaf\x17\x00\xf2\xc7\xa0\xa8\x06\x28\x2d\xc8\x53\xbc\xeb\x54\xa2\xd1\xfd\x4e\xca\x29\xb9\x6b\xb2\x1a\x57\xf3\x69\xfc\xa5\x99\x51\x25\x89\xc1\xc7\x56\xc5\x0f\x05\x00\x79\xf6\x9f\x6f\x3f\xa6\xf2\x7b\xcc\x30\x9f\xdf\x34\x94\x48\x89\xbb\x60\xbf\x34\x9d\x43\xf0\xfe\xc9\x49\xc7\xeb\xf3\x34\xf5\xc7\x9c\xc4\x92\x29\xe9\x71\x00\x99\x81\x95\xc1\xa0\x96\xdf\xa1\xa4\xed\xb3\xd5\x33\x62\x27\xb2\xfc\x64\x6b\x3d\xaa\x7f\x95\x88\x6b\xaf\xc8\x84\x33\xd7\x52\xc9\x79\x49\xbf\x99\xd9\xe2\xae\xf0\x22\xab\x74\xda\x30\x98\x3b\x0d\xe8\xda\x58\xb8\x95\xce\xfe\xa1\x77\x98\x6e\xa3\x8a\x34\x3a\x58\x4a\x56\xf1\xd4\x51\xc3\x42\xff\xef\xd5\xc4\x75\x58\xa9\x94\xa0\xce\x2e\x09\x1c\xd7\xdc\xb0\xff\x53\x27\xb7\xd2\x18\x6b\xd0\xb7\x2f\x9f\x9d\xc1\xab\xe2\xb5\x66\x2e\x31\xef\xbd\x72\xbe\x44\x91\x7f\xf5\x72\x3b\x57\x1c\x43\xf7\x04\x86\x9f\x28\xf1\x46\x8b\x1c\x96\xa7\x78\xc4\x0c\x5a\x1d\xb0\x7c\x45\xdf\x81\x26\x62\x2c\x6f\xf1\x88\x75\xfa\xa5\xa8\x9d\x3d\x81\x35\xb7\x01\x88\x87\xcd\x5f\xd9\x1e\x3e\xfa\x2e\x2f\x59\x1e\x3b\x89\x98\x31\x1f\xd1\xd6\x64\xd6\x4d\xaf\xa2\x88\xf4\xcc\xe4\xc1\x31\xa8\x1d\x88\x25\x2a\x7c\x3d\x29\xe8\xad\x0c\x00\xf2\x04\xd6\x5b\xd9\xaa\x9d\x78\xbc\x24\x82\x6e\x2b\xeb\xf1\xe7\xcf\x7e\xd0\x3e\xd0\xc7\x97\xf2\xdd\x72\xbe\x90\xd0\xca\x5b\xd7\xb0\xc1\x5a\x60\x01\x20\x1b\xb0\x9c\xeb\x56\x7c\x70\x57\x0e\x01\x99\xec\x65\x92\xda\x4d\xaf\xa9\x3d\xf7\x72\xa2\xb5\xb3\x18\x9f\x4c\xdb\x85\x3f\x88\x18\xa5\x52\x70\x6f\xdb\xa2\x02\xf0\x22\x9f\x93\x1c\x98\x76\xd6\xa6\x0c\x34\x37\x66\xf2\x52\x70\xe3\xb5\x3f\x41\x6d\xde\xb2\xce\x7f\xf9\xc4\x71\x77\x9c\x69\xb6\x85\xe9\x6b\x1c\x40\xc6\xe1\xcc\xd2\x91\xfb\x21\xe6\xa0\xe9\x63\x73\x21\xf9\xc2\x2e\x2f\xe2\x1f\x1f\x37\xe5\x3c\xd4\xc5\x12\xe4\x1c\x3d\x79\xd4\xf6\x45\x37\x52\x9d\x15\xfd\x47\x2f\xf1\x2a\x3f\x7a\xee\xb1\xfd\xdc\x46\x3c\x41\xe5\x46\x2c\x57\x51\x96\x88\x8a\x87\x58\xce\xa2\x64\x09\x2d\x9d\x58\xee\xa2\xa2\x34\x9a\x5b\xb0\x86\x73\x78\xc4\x22\xc5\xd2\xfa\xce\x3e\xc2\x1a\xd2\x01\x45\x7a\x1a\x44\xde\x07\x07\x90\x6c\x78\x27\x09\xf1\x27\xcb\x59\xc6\x3a\xf2\xe9\x10\x2d\x8d\x65\xdc\x91\xa8\xf0\x8a\x27\x69\xb3\x6d\xa7\xa2\x3c\xa4\x70\x8d\x37\x94\x53\xc1\x6a\x2b\x11\xc3\xad\xfd\x4d\xe2\x4a\xe2\xd9\x92\x83\x7e\x67\xfa\xfd\x27\x77\x1f\xda\x4c\x9f\xbb\x63\xe0\x4c\x15\xda\xb6\x11\x52\xaa\x66\x7f\x39\xa2\x99\x02\x07\x90\x0c\xb8\x7b\x90\x29\xfb\x7e\x87\xe9\xd8\xa9\x2b\x3d\xe2\x9c\x4c\xcf\x89\xc7\x1e\xec\x25\xf2\x28\xd4\x9b\xfa\xb2\xf0\x06\x1c\xf8\x1e\xc8\x77\xb2\x75\x8b\xc0\xc1\x03\xa9\xe7\x24\xae\x33\x71\x34\xd6\xf2\x8a\xcb\x81\x32\x82\x1f\xbb\x3e\x32\xa7\x87\x1d\x79\x5c\x39\xcd\xe6\xef\xa5\xe3\xf1\x43\xc3\x78\x63\x2b\xb0\x70\xbe\xf3\xd8\xe3\x7f\x8b\xc0\x8f\x7b\x40\x55\xe1\xd1\x0f\x45\x96\xb7\x35\x36\xf2\x74\xe3\x83\x0a\x5a\x0a\x2b\xca\x25\x45\x12\xfe\x71\x99\x5b\x4b\x07\x4f\x36\x74\x1b\x4a\x14\x16\x0b\x69\xd8\x2d\x8a\x08\x35\x97\x59\xfb\xe5\x4c\x1e\xac\x68\xfd\x92\xb9\xc8\xbd\x2b\xa5\xf5\x40\x44\x7b\x87\x21\x0e\x20\x38\x58\x2a\x71\x37\x79\xba\x08\xc2\x82\xcc\xbf\x3a\xde\x24\x65\x35\x75\xe8\xd1\x62\xe9\x6d\x64\x1e\x94\x94\x0a\xd5\xe1\xbe\xfc\xe8\x6c\xe4\x4f\xd1\x7f\x0b\x23\x2a\x4f\xa2\x5b\x15\x2b\x90\x68\x19\x44\xc9\x0e\x56\x28\xf1\x88\x0c\x94\x10\x63\x05\x13\xa5\xd0\xe8\x98\x0c\x2b\x9c\xe8\xe6\x46\xd3\x2a\x56\x40\xd1\x03\x84\xce\x4f\xb0\x42\x8a\x47\xe0\x50\x5d\x06\x6b\xa0\x8c\x47\x78\xa0\x9e\x63\x8f\x94\xb7\x11\xa9\x28\xf9\xc4\x9e\x2a\x6f\x23\xda\x51\xca\x80\x39\x58\xc6\xd3\x12\x34\x11\x60\x8f\x96\xb7\x11\xe9\x28\xf9\xc4\x9c\x2e\xe3\xfb\x2c\xd4\x73\xec\xf9\xf2\x8e\x54\x81\x26\x1b\xac\x11\x33\x2a\x87\xd0\x2f\x0d\xec\x7c\xdc\x0a\x11\xd4\xf4\xcf\xb2\x88\x36\x30\x3e\x2b\x5f\x7f\x86\x77\x7f\xa3\xd2\x8d\xe6\x64\xb3\x7a\x2a\xe5\x4c\xf7\x86\xc9\x65\xce\x1f\x43\x40\x71\x73\xf3\xe8\x66\x04\x87\x27\x40\x42\xe0\xd3\x67\x78\x3e\x53\xc4\xcb\x98\xce\x11\x8c\x34\xde\xdf\xff\x98\xff\x77\x5b\x69\xac\xf8\x1e\x66\x9f\xc3\x33\x8c\x4f\xac\xea\xc4\x52\x32\x00\xf2\x1e\xbe\x18\xf0\xf1\x65\x33\x63\x13\xd5\x23\xce\xde\x52\x35\xf5\xa4\x90\x65\x8e\x7d\x47\x97\x85\xd5\xf8\x37\x7b\x6c\xbb\x3d\x59\x6c\x6d\x59\x24\x01\xd2\x0c\xab\x51\x81\x44\xbb\x8b\x0a\xa9\xce\xee\x36\xee\x10\x6b\x5c\x77\x39\x6c\x3b\x65\x96\xad\xf5\x21\x20\xb1\x46\x2b\x84\x8a\xe7\xde\x93\x47\xc0\x13\x20\x9e\x30\xf7\x11\xb6\x2d\x7b\x5f\xfe\x50\x7c\xdc\xfe\x7d\x71\x17\x67\x73\x16\x19\x32\xf6\x3d\xbd\xef\x9c\x6c\x42\x4a\x62\x6d\x8b\x8c\x60\xe1\x6d\x80\x0c\xc1\x55\xeb\x6c\x4a\x8c\xac\xd0\x71\xef\xbc\x07\x91\x04\xa2\xaf\xaf\xec\x5e\x75\x5c\xf7\x70\xd3\xf8\x42\x73\xd7\x40\xf1\xfb\xc7\xdb\xbc\xaa\xe6\x00\x19\x86\x33\x53\xd3\x0f\xc4\xee\xf3\x95\x63\x2f\xca\xee\xb5\x11\x5b\x5e\xad\x79\x1f\xb6\xc2\x92\x51\xd8\xbc\xeb\x65\x41\xd1\x4c\x1d\xad\x27\xbd\xb3\x27\x40\x32\xe0\xd8\xdc\xa0\x7b\xb5\x1c\x54\x2c\xd3\xb7\xb6\x9c\x29\x14\x2d\xdb\x64\x74\xea\x64\x54\xa4\xf3\x38\xce\xe6\xe8\xfa\xd5\xb4\x41\xa1\xbd\xc2\x00\xe9\x86\x65\x96\x31\x0f\x05\xc9\xfd\x49\x6b\x5c\x77\x54\xf6\x28\xf3\xdf\x73\x09\x8e\xd0\x3a\xfe\xf3\xf0\x89\xa0\xc7\xbc\x21\x59\x77\x48\x4e\x0c\x9e\x05\xc8\x0a\x7c\x27\x2b\x3e\x8b\x25\xff\xd6\xd5\x88\x2a\x8a\x78\x92\xc8\xdd\x14\xa3\x9f\x5c\xc9\x8e\x18\x2e\x3f\x50\x69\x50\x48\x39\xec\x76\xad\xe6\x0a\x7c\xe9\xe4\xe5\x02\xb5\x59\xa6\xe2\xd4\xc7\xd4\xe5\xf5\x8a\x92\xd1\x58\x42\x82\xfc\x45\x9f\xa1\xc4\x4c\xea\x66\x76\xc6\x8b\xed\xc3\x76\x79\x9e\x00\x89\xfd\xcf\x6f\x08\x27\x24\x4e\xc8\x4a\x76\x87\x89\x5c\xb0\x7c\x3b\xa3\xc5\x31\x19\x77\xe7\x9d\x4b\x99\xe3\xc7\x55\x21\x1e\xa5\x1f\x74\xec\x8f\x7d\x00\x52\x05\x67\xf8\xfd\x8b\x84\x64\x67\xfa\xb2\xf7\x55\x4b\x6f\x22\x7e\x7a\x82\xcc\xa3\x24\xeb\x97\x28\x2a\x59\x1e\x8a\x0e\xa9\x11\x8c\x1e\xb6\x55\x00\xc8\x38\xcc\x45\x6e\xa6\x87\x8c\x0d\x99\x8c\xef\x9a\xc8\x10\x37\x75\x5f\xed\xd7\xff\xae\xe7\x74\xfe\x3d\x6d\xd3\x79\x52\x02\x36\x63\x35\xc6\x76\x7e\x4f\x80\x04\xc3\xcf\x27\x8f\x7f\xa3\x3b\xf0\x85\xef\x84\xce\x45\xbe\x42\x5e\xf5\x8c\x3d\x29\x6c\x1e\xf6\x44\x97\x55\xf8\x69\x84\xf5\xdd\x34\x52\x5c\x32\x01\xf2\x1a\x6e\x8a\x2a\xd5\x08\x63\x2d\x82\x2a\xfb\x38\x29\x6f\x10\x95\x72\xf6\x8a\xfb\x25\xa5\xbe\xa8\x26\xd7\x88\x7d\x72\x26\x4c\x28\x4c\x37\xe0\x1d\x40\x46\x60\xe3\x09\x23\x73\xbb\x1b\xbe\xfb\x25\xbc\xcb\x9d\x14\x0a\xf2\xbd\xf3\xae\xf0\xcc\x11\xee\x81\xfc\x45\x1e\xab\xa4\x70\x8b\x6c\x22\x75\x43\x4f\x80\xe4\xc1\xe5\xaf\x57\x08\x77\x21\xc9\x92\x36\x8a\x5c\x42\xbc\x5f\xf6\x21\xe5\xab\xca\xb0\x1b\x4b\x84\xa6\xb5\xef\x6e\x25\x4a\x78\x17\xbd\x30\xfb\x08\x90\x52\x78\x07\xe7\xd5\xbb\x06\x7a\x64\x7d\x5e\xcb\x37\x21\xa6\x61\x30\x69\x62\x9f\x34\x79\x1f\xef\x71\xfe\x8e\xe6\xf7\x77\x51\x4f\x53\xc8\xbe\xae\x02\xe4\x27\x5c\x9c\x62\xc3\x62\xaf\x78\xf5\x55\xf9\x54\x87\x9c\x78\x59\xaa\xbe\x47\xa5\x8d\xa3\x30\xcf\x50\xd0\x38\xc1\xc1\x43\xb1\x3b\xf3\xe6\x59\xe1\xad\xd4\x0e\x9f\xa7\xc2\xa4\x9f\x9e\x54\xbc\x57\xdd\xdc\x62\x07\xcc\x56\x24\x4a\xb5\x42\x06\xcf\xbe\x37\x67\x3c\xf9\x2e\xe5\x85\xd2\xc5\xc2\x0f\x6b\xf0\xaf\x30\x05\x11\x5f\x79\x32\x9a\x32\x6b\xb0\xa1\xe7\x16\xbb\x5c\xa4\xc4\xf1\x69\x5f\xde\x63\xe7\x80\x07\x45\x3f\xac\xd7\x25\x24\x2c\xb4\x5c\x01\x40\xbc\x60\x0a\xd8\xa0\x6b\xab\x57\x35\x9c\x73\x62\xff\x27\xd6\x89\x3e\xeb\x25\xaa\x57\xfb\xc6\xd4\xa5\xa5\x9e\x07\xa4\x0d\x94\x4a\xc7\xf2\x16\xb9\x01\xe4\x11\x4c\x23\x6a\xd4\x26\xc9\x0e\x4a\x9b\xe7\x45\x7e\x69\xb7\x4d\x26\xe2\x6f\x79\xf1\x8d\x27\x8d\x34\x44\x67\xed\x38\xbb\x2a\xcf\x6d\x6f\xda\x26\x1c\x40\x7c\x61\xc9\x5f\xbc\x61\xf8\xc0\x78\x71\x9a\xad\xa9\xca\xa4\xc5\x49\x87\x81\x8b\xba\xac\xcb\x3c\x71\x6f\xa5\x69\xeb\x76\x19\xad\x5b\x70\x9a\x0a\x41\x8f\xf6\xbc\x93\x2c\x2f\x62\x60\xe7\x92\x10\x3d\x7b\xa2\xa3\x53\xe6\xc3\xb9\xb2\x7b\x32\x4a\x3e\x5e\xe9\x43\x7b\x69\x58\x1f\x11\x44\xc3\x1f\x57\xfa\xec\x25\x1c\x96\x31\xe6\xb8\xc1\xbc\x29\x7e\xfb\x95\x83\x5b\x0c\x8b\xd8\x2d\xd3\x52\x62\x8b\xce\xd4\xd8\x5b\x27\x05\xeb\xbf\xf6\xe2\x00\x52\x04\xdf\x4e\xb1\x8b\xec\x51\xa3\xf8\x4e\x79\x2b\x7b\xa8\xe5\xe7\x05\x82\x4b\xdc\x2a\x4d\xd3\x5c\x76\x7a\x0f\xd7\xde\x05\x4f\x3b\x8b\x6d\x1e\x17\x04\x00\x79\x0c\x1f\xba\xc3\x33\x3c\xa6\x95\xc4\xa7\x42\xdc\xa8\xbe\x67\x96\xfa\x19\x07\x16\x2b\xcc\x05\xdf\xcd\x03\x27\x5f\x29\x32\x5d\xe9\xa5\x9c\xe7\x07\x48\x25\xbc\xb9\x38\x94\x9c\xd2\xa9\x19\x46\x62\xae\x65\xf5\xac\x96\x86\xc8\x5a\xbe\xf5\x6d\x3b\xd1\xce\x91\x18\x35\xab\xfd\xf6\xa4\x8e\xd4\xf8\x0a\x00\x48\x28\xbc\x77\x87\xfb\xfd\xe3\x0f\x3d\x9c\x56\xe0\x98\x23\x94\xa6\xde\x7b\x56\x56\x30\xc5\xe8\xdb\x4b\x89\xaf\xf7\x57\x92\x36\x9f\x70\x7e\x12\xb6\x07\xc8\x04\x9c\x60\x7e\xf1\xb7\x39\xc8\x04\xba\xa6\x3f\x93\x7e\x95\xe0\x4b\x75\x49\x92\xe4\x18\xa3\x33\xfd\x6c\x4f\x33\xcd\x9e\xae\xc6\xc4\xf0\xb7\x32\x38\x80\xf8\xc3\x4d\x43\x92\x6d\x84\x70\xe1\xac\xb7\xe1\x35\x5f\xb1\x3f\x3e\x7e\x67\xef\x86\x3e\x2f\x91\x07\x1a\x17\x34\x18\x85\x09\x5b\x27\x71\xe6\xa9\x00\x20\xc1\xf0\x3d\xce\x8b\x1a\x45\x07\x45\x85\xa2\xb8\xeb\x85\xaa\x3a\x9b\x55\x29\x83\xed\x9e\xd5\x08\x0d\xdf\xf2\x23\x66\x08\x12\x5a\xd0\xeb\x6f\x57\x02\xc8\x0a\xbc\x05\x9a\x44\xab\xf9\x77\x9f\xd0\xe7\xdb\xa3\x7e\xd4\x9e\x51\xee\xb4\xc5\x8b\x67\xee\x5a\xed\x42\xed\xad\x8e\x97\x92\xdf\xe1\x2a\x89\x1f\x41\x8f\xbe\x79\xa5\x38\x70\xb5\x9f\x74\x64\x51\x27\x7e\x77\xd8\xca\xa8\xdc\x52\xab\x7a\xc5\xf4\x05\x6d\x8a\x6b\x17\x9d\xb3\xae\xf8\x34\xe6\x7b\x02\x79\x79\xe8\x71\x2b\xc9\x4f\x49\x76\x43\x55\xe7\x97\x17\x6a\x8d\x9e\x65\xaf\x15\x9c\xb9\xd0\xd7\xe4\x30\xdf\xc9\x90\x30\x39\xfa\xbd\x84\x05\x49\x01\x48\x0e\x7c\x8a\x64\xed\x1b\x2e\x87\x02\x6d\x65\xf6\x8b\x1f\x44\xa8\xf2\x5a\xa9\xc8\x09\xa5\x38\xca\x3c\x9a\x0f\x44\x5f\x4a\xda\xdb\xc8\xde\x1a\x05\x90\x32\x38\xf1\xd6\x54\xaf\x29\xf7\x67\x99\x97\x69\x27\xd0\x4d\x1d\x4d\xbc\xb7\x18\x6c\x21\xd1\xf5\x8d\x24\xc1\xd3\xb6\xfe\xd9\x41\x9e\x03\x7a\x9e\x5b\x2d\x24\xbc\x09\xce\x44\x98\x48\xf7\x34\x89\xbb\xd5\xb0\x69\x7c\xdc\x5b\xea\x22\x8d\x93\x16\xbd\x1e\x62\xcd\x0e\xb4\xf7\x4b\x5d\xad\xda\xfd\x76\x19\x7a\xf4\x69\x7f\xf9\x9f\xe2\x3c\xcb\xcf\xab\xce\x41\xa4\xea\x6b\x7b\x19\xbb\xb3\xde\x96\xb7\xc9\x79\x7c\x7c\xca\x75\x8e\x83\xe5\xf6\x6b\xf8\xf7\xba\x3a\xcf\x99\x39\x50\xbf\xd5\x89\x14\xa9\xef\xca\x50\x5f\xa9\xbe\x9f\xdc\x35\xcb\x29\x21\x61\xa7\x66\x24\x0f\x7e\xa4\x1f\x4a\x4b\xc5\x01\x24\x05\x5e\x1c\xfe\xbb\x4e\xc9\xb8\xe6\xc3\x26\x7a\xb1\x65\xfa\x4b\x59\x2d\x7e\xf1\xd4\xe4\x7c\xcd\x2d\x05\x2f\x19\xc7\x91\x26\x93\x4c\xf1\xef\x00\x20\x93\xf0\xea\xfc\x76\x7b\xfc\xc7\x33\x50\xd8\x29\x22\xeb\xc4\xf0\xd3\x53\x17\x22\xb9\x56\xee\x07\x9e\xb3\xfc\x62\x6a\x1d\x58\x1e\xfb\x7a\xb0\xc4\x13\x20\xd3\x70\xe2\xba\x61\xb8\xd0\x2b\x44\x74\xe1\x37\xad\x71\x59\xc3\x67\xa7\xc5\x50\x8b\x6f\xcf\x98\x85\x4a\x93\xe9\x94\x66\x62\xef\x58\x6d\x4e\xad\x40\x8f\x4e\xbb\xe1\x08\x47\xb4\x55\x62\xb4\x07\x9c\xda\x6c\x97\x0f\xdf\x6f\xf5\xcd\x7f\xcd\x7b\xe4\x6a\xad\xdd\x43\xc9\x5a\xe7\x43\xe6\x8d\x00\x20\x25\x70\x79\xd9\x3f\x4b\xfe\x55\x5a\xd9\xc4\xcb\xb9\xee\x57\xdc\xa4\xc7\x05\x9b\x17\xfc\xdf\x8e\xb8\xff\xd8\x38\x96\x92\xd9\x17\x69\xef\x4f\xf6\x13\x20\x9b\xf0\x19\x35\x1b\x39\x5a\xdb\x94\xe6\x95\x61\x83\x74\x0a\x0d\x88\xba\x7d\xa5\x7b\x78\xa0\x8f\xc5\x9f\x5b\xc6\xe4\x8c\xd2\x85\xc3\x55\x7f\x96\x3d\x01\x12\x04\x57\xf5\x05\xc1\x5d\xbc\x84\x24\xf6\xea\x2d\xbc\xf3\x06\x0a\x5f\x54\xd9\xcc\x67\x49\xf4\x92\x1f\x12\x84\x5a\x1d\x71\x53\x65\x6e\x29\xa2\x04\x48\x2b\x9c\x88\xae\xbb\x5a\x33\xbd\xdc\x2d\x92\xc3\x10\x73\x82\x83\xdd\xc5\xda\x88\x82\xe9\x8e\x70\x86\x5b\xce\xea\x69\xc9\xc0\x92\x2b\x25\xb4\x5a\x00\xe9\x87\x29\x46\xec\x3d\x7a\xa2\xd0\x9e\x4d\x2d\x4e\x86\xca\xd6\x34\xd6\x7e\x37\xe3\xf0\xd6\x28\x8d\x91\xb2\xf5\xc9\x7c\x8a\x0a\x26\x2d\x6a\x62\x4f\x80\x3c\x84\xd3\xe8\xc3\x6b\x63\x1f\xb5\x93\x0e\x33\x3c\x2a\x28\xcb\xbf\x30\xf0\xc9\x60\xa3\xfc\xb4\xe9\xc1\x13\xfe\x1b\x3c\x71\x51\xdf\xf6\x2a\x79\x51\x01\xa4\x1b\x5e\x25\x66\x36\x4f\x6e\x23\xe7\x14\xc3\xc4\x8b\x4a\x5f\xb3\x17\x0c\x74\x5f\xf6\xf8\x6a\x1a\x11\xd2\xf1\x79\x6a\x69\x18\x15\x11\x7a\x27\x01\x64\x06\xde\x04\xcf\x0d\x1a\x07\x9a\xee\x4f\x79\x0d\xf5\x15\x73\x5a\x19\x8f\xf4\x1c\xbe\x22\xfb\x5d\xe7\x87\x48\xd7\xaf\x0f\x54\x1d\x22\x5a\xc5\x9c\xa2\xff\xca\xd2\x76\xfd\x25\x84\x21\x28\xa5\xc7\x26\x6a\xdb\x88\xf7\x28\xdd\xc6\xe2\x6a\x78\x44\x33\x3a\x83\xc3\x66\x6b\xdb\x08\x4f\x54\xbf\xc1\x26\x6c\xdb\x88\x21\x94\x0a\x63\x71\x36\x3c\x62\x18\x6d\x7f\xb0\x59\xdb\x36\x22\x03\x8d\x15\x36\x71\xdb\x46\x74\xa3\x53\x26\x2c\xee\x86\x47\xac\xec\x43\x7f\x95\x1c\x8b\xc3\x01\x05\x66\xc2\x97\xde\x5b\x4d\x16\x7c\x8a\xf7\x19\x70\xb6\x9d\x0a\xec\xa7\xf1\xaf\xdc\xd7\x11\x9d\xcd\xc0\xda\xb5\xc2\xfa\x67\xf3\x13\x38\x98\x5a\xe6\x2d\xba\x3a\xe4\x7e\x02\x07\x90\x12\x58\xb1\xce\x88\xf0\x42\x4e\x45\x0b\xb4\x6d\xae\x54\xd0\x3d\xd7\x5a\x71\x23\x13\xa5\xed\x25\x64\x3b\xea\x60\xa9\x2a\xbf\x71\xf0\x4c\xe2\x11\x1c\x40\x72\xe1\xbf\x3f\xbe\xd7\xd0\xe0\x88\xb1\x3f\x12\x60\x91\x60\x3d\xfc\x76\x65\x38\xc8\xf1\x7e\xcc\x90\xac\xbd\x6d\x16\x0d\x8e\xbd\x3c\x72\xc2\x06\x07\xe4\xef\x43\x8f\x4b\x1d\xb5\x78\xc1\x6d\xa8\x70\x38\xba\xdf\x59\xc0\xc0\xec\x59\xe3\x72\x5e\x5e\xa4\x1a\x8e\xfd\x8c\xe9\xea\x95\x62\x7f\x41\x73\x11\x1c\x40\xd6\xe1\x4c\x4b\x3a\x38\x8d\x34\xe2\xda\x8e\x79\xcc\x9a\xce\xa9\x9d\x65\x7b\x3a\xd5\x7a\xd7\x2e\x62\x9f\xd7\xb2\x71\x19\x49\x98\x62\x26\xb7\xb9\xe8\xbf\x79\x89\x0f\x27\x0e\xdd\x7a\x58\x7e\xe2\x11\x25\xa8\x64\x8d\xe5\x29\x1e\x91\x8b\x7e\x61\x18\xcb\xd9\x1d\x84\xfc\x7d\xfc\x2b\xb0\xbc\xc5\xbf\x62\x1d\x1d\xda\x61\x13\xf5\x6d\x44\x2c\xba\xbb\xb1\xb9\xfa\x36\xa2\x0a\x15\x10\xb0\xe8\x3a\x1e\x31\x8e\xea\x69\xd8\x84\x7d\x1b\x11\x8c\x22\xb0\x39\xfb\x36\xe2\x35\xda\xaa\x63\xd1\x76\x3c\x62\x04\xf5\x03\x9b\xb8\x6f\x23\xf2\xd0\xc6\x1b\x9b\xbb\x6f\x23\x4a\xd1\x6d\x85\x45\xdf\xf1\x88\x9f\xa8\x10\x82\x45\xe0\xf1\x88\xc0\xbd\xe8\x0d\x63\x4c\x22\xaf\x48\x46\x04\x88\xb6\x52\xc1\x4b\xf8\x68\x87\x8d\x52\x1e\x2e\xe4\xa0\x9d\x67\x9b\xd1\xab\x20\x77\xe6\x27\x98\x94\x55\x11\x49\x24\x7a\x49\xac\xa6\x47\x51\x47\x32\xdb\xd3\x89\x03\x48\x1d\x7c\xb4\x65\xa8\x02\xdb\x48\xdb\xae\xd8\x30\xc9\xb3\x2b\x31\xb1\x28\x17\x9e\x16\x6b\xd6\x11\x6b\x0a\xfb\xf6\xc6\x9c\x6c\x2e\xa7\x41\xb8\x68\xeb\x3c\xc1\x7f\x5f\x95\xca\xf6\x8c\x6a\x5c\x73\x02\x01\x63\x20\x6f\x4d\xa4\xf1\x79\x2f\x87\xd1\xa9\x2c\xf2\x67\x0a\xc7\xf4\xbc\x7f\xde\x95\xb1\x1c\xc7\x01\xa4\x09\x2e\x5d\xe7\xc6\xb3\xb4\x89\xa2\x44\xda\x1b\xc6\xe2\xaf\x9b\xd2\x85\x4c\x68\x3d\x60\x25\x28\xa0\x92\xe2\xd7\x0d\xe9\x3b\xfc\x3e\xed\xc3\x41\x1c\x40\x56\x61\x5d\x93\xfe\xf5\xc7\x9b\x3d\x86\x39\xeb\x39\x87\x1d\x5e\xb7\x15\xda\xe8\x5f\xe4\x51\x3b\x76\x7f\x97\xdf\xe3\x38\xba\xeb\x2a\xfe\xb3\x47\xf3\x44\xff\xcd\x4d\x7c\x40\x5f\xa2\x27\x1b\xcb\x51\x3c\xa2\x0e\x5d\x66\x2c\x57\xd1\x7c\x83\xbe\x03\xcb\x59\x3c\xa2\x09\xfd\xc4\x13\x96\xbb\x78\xc4\x2a\xaa\x3f\x62\x37\x6c\xdb\x08\x2f\x54\xbd\xc2\xea\xd9\xf0\x88\x47\xa8\x62\x89\xd5\xb5\xe1\x11\xbe\xc4\xa8\x8c\x8d\xd5\xbd\x01\xc5\x67\x5c\x1e\x64\x3e\x38\x80\xb4\xc1\x1c\xbe\xc6\xf1\xdc\x77\xef\x8c\x42\xc0\x2c\xfc\xb1\xb0\xf5\x51\x57\x1b\x9f\xde\x12\x9b\xc1\x84\x89\x5a\x47\x54\x99\xea\xeb\x8f\x15\xbc\x38\x80\x4c\xc2\x7d\xb9\xf0\xa7\x4e\xcd\xcf\xde\xa7\xc2\xa9\x7d\x93\x98\xac\x5d\x23\x2d\x07\x0a\x2f\x5f\xf0\x03\x39\xcf\x8e\x28\x2d\x06\x3d\xbf\x2c\x51\xb6\x95\xa1\x60\xda\xc7\x61\x3c\x56\xce\x72\x23\xf2\xa4\x76\xc3\xa7\x0e\x91\x4b\x4d\x1c\x1d\x5f\xa5\x4c\xc5\x65\x4f\x81\x44\x47\xfb\xd3\xcf\x96\x6e\xfd\xc2\x01\x24\x1f\x26\x66\x99\x1a\xb2\x2e\xb2\xfc\x43\x8a\xc7\x55\xcf\xad\x70\xb8\x4f\xf0\x3c\xb9\x4f\x55\x76\x97\x52\x2b\xb8\x2b\x8c\xee\x67\xed\xc6\xf7\x08\x1c\x40\xda\xe1\xde\xcc\xc8\xeb\xcd\xb8\xe4\x6b\x87\x5f\x2a\x3e\x3d\x89\x8b\x63\xf7\xdc\xda\xee\x19\xf7\xee\x22\x17\x68\x2e\x09\x8d\x71\xcf\xbe\x1f\xa0\x87\x03\x48\x21\xec\xef\x87\xa7\x0f\x68\x8e\x57\x0c\x04\xdd\xa5\x9d\xdb\x7f\x3f\xf3\x16\x4b\xd5\xcd\x3f\x96\x04\xa4\x6d\x3a\x6f\x47\x1d\x65\x29\xab\x63\x24\x70\x00\x59\x82\x79\xa8\x82\xde\xc6\x42\x4e\xdc\x18\xad\x84\x12\xad\x4c\xb3\x08\xbf\xc7\x8f\x1b\x45\x46\xb9\xef\x2e\x70\xd8\xc9\xb6\xf3\x65\x2a\x7b\xcc\x89\xfe\x5b\x18\xf1\x0b\xd6\x86\x66\x24\xac\x40\xe2\x11\x93\x68\x9e\xc4\x0a\x25\x5a\x21\xd0\xcb\x0a\x58\xc1\xc4\x23\xf2\xd1\x8d\x87\x15\x4e\x3c\xa2\x1d\x65\x65\x58\x01\xc5\x23\x0a\x51\xcf\xb1\x42\x8a\x47\x2c\xed\x41\xef\xe5\x62\xe9\x0d\x40\x51\x84\x00\xfc\xfd\x67\xf6\x72\x78\xb3\x86\x9e\x4c\x6a\x1f\xd7\xb0\x4d\xcf\x1d\x7d\x1c\x32\xc5\xb7\xca\xfe\xd5\x20\xda\x20\x98\x2f\xb5\xe4\x9e\xb0\x91\x54\x64\xe7\x53\xc5\xad\x13\x04\x4b\x60\x25\xea\x13\x57\x78\x85\xc2\x4e\x69\xcc\x81\x99\x15\x6a\x4d\x26\x50\xa6\x13\xd1\xfb\xa8\xe6\x41\x0c\x62\x6e\x7b\x87\x2b\xfc\xe4\x56\xa1\x83\x37\x87\x27\xae\xac\xab\xc7\xf5\xc5\xca\x9e\xf3\x46\x6d\xe3\x0b\x07\x4e\x52\x44\xf5\xcc\xa6\x16\x1f\xb3\xce\xa7\x3a\x9a\x6b\xd7\x25\xec\x8c\x03\x48\x0f\x3c\x03\x2e\xe1\xfe\x50\x4c\xf3\x2c\xdf\xeb\x92\x43\x45\xe8\x8c\x39\xc1\xee\x78\x93\xef\x85\x54\x2f\x5c\x8c\x6c\x2f\xd6\x39\x21\x7e\x34\x24\xa2\xff\x66\x36\x3e\x40\xe5\xe8\xd6\xc0\x32\x1c\xcd\x17\x28\x15\xc0\x32\x1d\x2d\xec\x68\x53\x80\x65\x3c\x1e\xd1\x83\x0e\x75\x31\x55\x9f\x1d\x44\x11\xaa\xda\x63\xeb\x3e\xdb\x88\xc7\x28\x35\xc3\x94\x7e\x76\x10\x95\x28\x41\xc1\x16\x7f\xb6\x11\xa1\x28\x09\xc2\xd2\x7f\xf0\x88\x09\xf4\x50\x60\x2a\x40\x3b\x08\x7f\x74\x9c\x8a\xad\x01\xed\x90\x39\xb4\x72\x61\xc9\x40\x68\x73\x43\xba\x54\x4f\xf4\x6f\x72\x10\x50\x20\xa1\x20\xf3\x06\x00\x29\x82\x1b\xfd\xea\xe0\x16\x5a\x33\xa2\xe5\x27\xdd\x82\x31\x87\x3e\x1f\xd8\xd3\x7c\x65\x98\x39\x51\xfa\x38\xaf\x01\x37\xc1\x47\xd3\xd7\xeb\x97\xc2\x00\x32\x07\x77\xe2\x76\xde\xac\x3f\x9f\x7d\x29\x1b\x7c\x15\x25\x61\x70\xd1\xb0\xfe\x8a\xff\xa7\xd8\x3d\x25\x27\xba\x3f\xcb\x90\x3f\x08\xae\x1b\x67\xbf\x84\x03\x48\xce\x7f\x7e\x6f\xdf\x3a\x4e\xe0\x3c\x11\x35\xff\x4f\x67\xc3\xd8\xa0\xec\x55\xa1\xc4\xb4\xf6\xec\x5e\x62\x82\xde\x77\x23\xab\xde\xec\xc6\xcc\x37\xb6\x7a\x40\xb8\x42\xc8\x04\xdc\x26\xbd\xfc\x95\xa7\xb4\xe6\xc7\xf7\xc3\x87\x45\xbe\x96\xf6\x52\x71\x3c\x75\x3c\x61\x43\x0f\xda\x5c\xcd\x59\x4c\xaf\x76\xe1\x00\xd2\x05\x37\x37\xae\xd7\x67\x6c\x28\x0e\xdd\xd2\x97\xb6\x1a\x2a\x95\x52\xe2\x3a\x43\x9e\x71\x91\x48\x7c\x5d\xeb\x3c\xb1\x61\xf7\x68\xdf\x74\x8a\xd5\x16\x6f\x87\x09\xd3\xe2\x50\x64\xe0\x66\xc6\x85\xe4\x22\x93\xf4\xdb\x3f\xde\x37\x4e\x4c\xce\x89\x1c\xca\x91\x58\x78\xac\xed\x72\xe9\x49\x4d\xce\x7e\x45\xd1\x7f\x8d\xca\xce\xe6\x46\x7b\x64\xac\xc0\xe0\x11\x73\x28\x71\xc0\x0a\x0d\x1e\x91\x83\x76\xbc\x58\xc1\x41\xbb\x6a\x34\xe3\x63\x85\x07\x8f\xe8\xfa\xdf\x97\x33\x30\x02\x84\x76\x43\xe8\x15\x46\x6c\x5d\x71\xbb\x45\x93\x47\xff\xcf\x08\x53\x59\xdc\x71\x1c\x2d\x2a\x58\xe2\x22\x1e\x51\x86\x86\x0a\x4b\x5e\xc4\x23\x66\xf6\xa1\xf7\x86\xb1\x64\x46\xa0\x40\x2b\x47\xb3\x55\x85\x2a\xff\xf3\xeb\x92\xca\xf3\x71\x8a\xe7\x9b\xc9\x16\xaf\x88\xd3\x4d\x8b\x6a\x14\x05\x30\x7a\x14\xb2\xb8\x7b\xd2\xf5\x6a\x51\xf5\xdd\xe7\x3a\x99\x85\x03\x08\x80\x37\xac\x86\xcd\xe3\xe3\x87\xaa\x83\xa9\x0d\x55\xa3\xf6\x7e\xc9\xac\xf4\xd5\x7e\xd5\xd4\xb4\xfc\x9c\xca\xac\x04\x79\xe7\xdc\x64\xa5\x77\x62\xab\x15\x82\x3b\x82\xfe\x7e\x1d\x43\x3f\x51\xa7\xcb\x57\xda\xae\xad\x56\x27\xf4\x86\xd5\x9d\x2f\xd4\xf6\xf1\x4a\xfd\x7c\x3c\xf1\xad\xe8\xf8\xe7\xde\xad\x03\x57\x00\x53\xa0\x04\x5e\xd3\x2b\x83\xbf\x6a\x5e\x90\xd7\xd2\x0e\x30\xb2\xf5\x8d\x17\x8f\x14\x06\x0b\x06\x3d\x44\xdc\x1e\xef\x8f\x7b\x48\xf6\x22\x56\xf4\xdf\xcc\x46\x33\xeb\xff\x2e\x15\x62\x18\x8e\x47\x00\x74\x2b\x61\x99\x8e\xb6\x7e\xff\xfb\x42\x33\x86\xf1\x78\x44\x01\x19\x4a\x1e\xb0\x14\x5f\xa0\x48\x44\x40\xfc\xf7\xcb\xc6\x19\x70\x1e\xab\x53\xeb\x5e\x2a\xfa\xd1\xf9\x89\xc5\x41\x3f\xff\x80\xc9\x3b\xcb\x59\x55\x12\x25\xa1\xea\x9c\x7b\x1d\x24\xd1\x41\x4b\xda\x4f\xf2\x71\x00\x59\x83\xf3\x98\x73\x00\xe1\x6a\xe5\x84\xe0\x71\x77\x6b\x1f\x02\xaf\xc1\xc0\xf7\x02\xe7\x9e\xf9\xb9\x28\x0d\x06\x86\xb1\x10\xb2\x2c\x3d\xf8\x99\x88\x03\x48\x00\x4c\x36\x58\xcc\x9b\x47\x2f\xfb\xfe\x99\x18\xf9\x55\x73\xa7\xbc\x85\xa3\x9e\x60\xc3\x4c\xfb\x5c\x85\xb4\x7b\x88\x95\x0b\x09\xe3\xdc\x1c\x29\x0e\x20\x35\xb0\x9c\x6b\xe8\x8e\x2b\x27\x5e\x69\x1d\x14\xb0\x12\xce\xba\x6c\x5d\x48\xd0\xda\xe7\xc1\x55\xa3\x28\x2f\x99\x90\xf2\xe0\x88\x97\x59\x28\xfe\x93\x47\x58\x66\xa3\x19\x00\xcd\x32\x58\x86\xe3\x11\x6b\xe8\xd1\xc1\x32\x1d\x8f\x08\x40\xe9\x06\x96\xf1\x78\x44\x0d\xaa\xa0\x60\xea\xee\x3b\x88\x14\xb4\x20\x62\x2b\xef\x3b\x8c\x1a\xdd\xb0\x58\xe2\x3b\x1e\x31\xfd\xbf\x8f\xff\x63\x8a\xf0\x8a\x64\x5c\xb8\xbf\x4c\xd4\x17\x9e\x50\x09\xd1\x16\x4f\xdc\xcc\x24\x6f\x79\xab\xf9\x86\x69\x99\x3f\x46\x49\xed\xc2\x10\xe1\x55\x3f\xfe\xef\x0a\x5f\x0b\xa3\xa5\x7c\xc3\xb7\x8a\xd6\x53\x58\x8c\x9f\x9e\x26\xe5\xed\x70\x26\x75\x4e\x35\x2b\x54\xbf\xc5\xc3\xd3\x6d\xec\xbe\xe9\x1f\xc5\x4d\xcd\x69\x3d\xf8\xcc\x4a\xbd\x96\xcd\x60\x8b\x67\xc1\x9b\x75\x34\x69\x65\x6f\x65\x43\x06\xa7\x9b\x19\xf9\x97\xe4\x77\xc1\x82\x47\xb5\x6f\xd0\x44\xca\x13\xbe\x2c\xe0\x3b\x58\x7a\xca\x9b\xad\x74\xab\xac\xc0\xcc\x95\xb9\xf2\x40\x07\x61\xf9\x17\x0e\x77\xad\x98\x2e\xd5\x14\x57\x57\x2d\xde\xc0\x4a\x44\xe3\xa3\x6e\xce\x65\xaa\x3b\x3d\xeb\x6c\x09\xa2\xff\x66\x36\xca\x2b\x51\x76\x85\x65\x38\x1e\xf1\x14\xe5\x7c\x58\xa6\xa3\xbc\x12\xdd\xb0\x58\xc6\xa3\x85\x14\xe5\xae\xd8\xa3\x90\x1d\x1d\x12\xdd\x7e\x58\xd3\x10\x3c\x62\x13\xf5\x03\x7b\x1e\xb2\x8d\x08\x42\x09\x01\xf6\x48\x64\x1b\xd1\x8a\x36\x74\x58\x53\x11\x3c\xa2\x1f\xf5\x1c\x7b\x2e\xb2\x8d\x78\xf8\xbf\xe8\x62\x8e\x46\x76\x64\x76\xf4\x18\x61\x4d\x47\xd0\x4a\x4a\xbe\x14\xca\xb8\xc3\x21\x62\x58\x27\x0f\x2b\x72\x0d\xa4\x3c\x90\x52\xac\x99\x5d\xee\xed\x2d\x16\xe5\xdd\xe7\xe5\x15\xcb\x19\x6e\x6d\x46\x7a\xa3\x97\x1e\x28\x6e\x6e\x6e\x6e\x46\x70\x79\x02\xe4\x11\xbc\x6f\xcf\x73\x13\x3c\x4a\x17\xb9\xae\xc2\xf3\x7e\xc3\xfa\xd0\x9b\xc0\x8f\xee\xd1\x91\x17\xe6\x97\xc7\x0b\x0e\x58\x4f\x6a\x8f\x56\x3f\x0b\x02\xc8\x53\x38\x67\x16\x37\x3c\x13\x4c\xfa\x9d\x41\x27\xc4\x9b\xae\x86\x1b\xd8\x53\x2c\x31\x64\xd2\x8a\x78\x59\xe8\xb3\x7b\x5f\x89\x58\x0f\x16\x2e\x04\xc8\x53\xb8\x92\x96\xe5\xda\xea\x9e\xe5\x50\x5d\x18\x5f\x4a\x8b\x17\x3c\xff\x94\x3f\x68\x2e\xc8\xe4\xec\x9b\xb2\x23\x24\x29\x48\xf0\x48\xfb\xfe\xee\x2d\x6b\xe0\x7e\x2e\xf5\xf1\x93\x95\xa5\xc6\x3b\x11\x41\xcd\x61\xe3\xb4\xaf\xc3\x6b\xc9\xdb\x6c\x71\x1a\x21\xc1\x27\x8e\x05\x8a\x9d\x38\xa2\xf2\xc2\x02\x20\x5f\xe1\x5b\x04\xd5\xb8\x7c\xce\x2c\xfe\xfc\x9a\xe6\xe3\xd6\x5e\xd1\xfe\x47\x4b\x48\xbf\xdd\x60\x34\xb1\xcb\x9f\x34\xa6\x0c\xec\xd1\xa4\x1a\x2f\x02\xc8\x37\xd8\x9a\x69\x6b\xcf\xcc\x3e\x55\xf7\x82\x9c\x80\x8f\x81\x07\x9a\xc6\x8d\x10\x21\xaf\xe0\xa5\xcf\xf1\xa1\x95\xe2\xb4\x13\x6c\x01\x2c\x5a\x38\x80\xcc\xc2\x3c\x83\x88\x5b\xac\x53\x89\xe4\x69\x93\xd9\x3b\x1d\x9e\xef\x27\xce\x1a\x9f\x34\xbc\x11\x25\xd7\x3c\xb7\xe7\xcd\x19\x23\xbb\x4d\x5b\x53\x21\x4f\x20\xcf\x0a\x3d\x3e\x72\x39\xc7\x7d\xd1\xb6\x03\x17\xb3\x6f\xcc\xad\x7b\x36\x35\xae\x3d\x8f\x64\xa6\x28\x53\x32\x54\xe1\xe1\x9c\xd7\x67\xf1\x0a\x4a\x80\x78\xc1\xd6\x38\x7c\xfa\x82\x7b\x3e\x3b\x14\x6f\x34\xd4\xc9\x58\x3a\xd3\x3a\x90\xfb\x7d\x4d\x93\x49\x39\x59\x2e\xed\x20\x85\xc1\xc9\xd1\xf3\xb7\x01\xd2\x07\xeb\x3e\xc7\xae\xd6\x77\x2a\xbf\x98\x12\xd5\xda\xcb\x38\xc1\xa4\x20\xd4\xf2\x3a\x73\x94\xde\x50\xa7\xbf\x88\xce\x60\x14\xa7\xf2\x5a\xa7\x14\x00\xa4\x15\x6e\x32\xa8\x13\x10\xb2\xb3\xb2\x27\x84\x5f\xea\xed\xdb\x63\x97\xb4\x4b\xf4\xab\x24\xd3\x23\x37\x3a\x0e\xef\xeb\xcd\x1f\x24\x6a\x8d\xe9\x8c\x00\xf2\x7b\xdf\x7f\x9a\x06\xa7\xc4\x85\x11\x63\xa0\xd4\x75\xff\x53\x75\x95\xd5\x69\xc5\xcb\x3f\x7f\x57\x7a\xdf\x7c\x4a\x37\x1f\x5e\xb7\xdb\xf1\xe3\x20\x0e\xc8\x3b\x43\x8f\x4b\x7f\x37\x62\x58\x0d\x95\x64\xcc\x6b\x3d\xb2\xb7\xaa\x2c\xe5\x9b\xf4\x69\xcb\xc1\x67\x0c\x7b\xdb\x78\x28\x46\x6a\xf3\xa4\x34\x83\x01\x40\x7c\x60\x11\xd4\x6c\x75\x3d\xf1\x5a\x83\x8f\xaf\x14\xbf\x5a\xfc\xdb\x81\x3b\xdf\x49\xe3\x6f\xb8\xdb\x9e\x3c\xb2\x4b\xc1\xb1\xd5\x35\x63\xde\x59\x09\x20\x1f\x60\x67\x47\x1c\xf4\x9a\x2d\x90\x34\xe2\xee\x22\xe9\x06\xeb\x55\xe6\xe5\x10\x67\x3b\xb2\x0b\x14\x31\x92\x53\xbd\x5c\xef\xa2\xd8\x2a\x32\x01\x40\x3e\xc0\xf7\x0f\xcc\x1e\x9d\xe9\x29\x55\x24\x63\xff\x40\x7d\x56\xef\xb9\x65\x46\x81\xae\xc3\xe0\x3e\x7a\x8b\x0d\x61\x63\xfd\x2e\x26\x1a\xbf\x0a\x0e\x80\x94\xc2\x0b\xbb\xdc\x95\x12\xfc\xf8\x4a\xdc\x1f\x07\x47\xd2\xc0\xb3\x25\xf7\x46\xb3\x5a\x34\x57\x9a\x53\xf8\x15\x97\x7f\x8e\xfc\x8a\x9b\xfb\x98\x0c\x3d\x9a\xe2\xa2\xe2\xa5\x15\xaa\xf6\x49\x59\x9f\x95\xef\xd4\x27\xc3\xf3\x9a\x8c\xa9\x53\xdc\x9d\x66\x35\x52\x45\x4f\x5b\xe8\xed\x87\x13\x3d\x01\xe2\x09\x93\x10\xcd\x3d\xbd\x61\xf1\x84\x62\xba\xf7\x98\x75\xd5\xe4\xa7\x0e\x5c\x0e\xef\xfc\x73\xe6\xb0\x59\xbc\x5e\x93\xf3\x35\xe9\x5f\x4f\x14\xa3\x00\xf2\x18\x2e\x4b\xf7\xf6\x79\x2a\x65\x10\x5c\xcd\x27\x34\xff\x61\x96\x4b\xe6\x3e\xc1\xf1\x50\xcf\x7a\x73\x99\x25\x42\x34\xfa\x56\xd4\xeb\x3d\x2e\x6f\x01\xf2\x11\xd6\xb6\x83\x38\xe4\xd9\x58\x69\xe7\x23\x36\x9e\xfd\xce\x51\xa1\x38\x24\x98\xfe\xe5\x20\x55\xfa\xa6\xd9\xc9\xf5\x16\xba\x4c\x1d\x96\xaf\x85\xd0\xa3\x03\x13\x5f\x19\x96\xa6\x04\x7a\x59\x27\x75\x2a\xce\x54\x1b\x51\xdf\x3f\x36\x94\xaa\xa1\x4b\xf0\xa3\xf2\x6a\xda\xef\x63\x2c\x8b\xf0\xe7\xce\x5e\xa6\x93\x7e\xcd\x67\x15\x7b\x9b\x25\x6a\x32\x4f\x3e\x6b\x72\x9c\x82\xe7\xa9\x6a\xf7\xb9\xcc\xba\x07\xdd\x14\x3d\xb2\x55\x3d\x1c\x9e\x00\x49\x87\xaf\x63\x68\xd0\x11\xaa\xfa\xfc\xc1\x55\x36\x39\xda\xf3\xf4\x5e\x18\x74\x65\xdf\x77\xee\xfb\xee\x43\x2c\xab\x74\x46\x1f\xa9\x78\x2d\x2d\x25\x00\x92\x0d\xfb\x38\xb4\xf1\x84\x7d\x61\x6d\x77\xc3\xf1\xb7\x5f\xac\xed\xc7\x86\x94\xb8\xf4\x1d\x05\x2b\xc2\xd7\xf9\x54\x09\xff\xb0\x9e\xfc\xf3\xde\x07\x20\x25\x70\xbb\xc8\x68\x43\xfd\x9e\xd1\xe2\x1c\xa9\x7d\xbd\x5d\xbf\xfa\x1e\x4d\x66\x4b\x79\x59\xd9\xfe\x63\x69\xbf\x4b\xce\x1a\xed\x21\xbd\x11\xf2\x0a\xbe\x5e\xe1\xf9\x52\x42\xf6\xa2\xf4\x98\xd3\xae\x58\x83\xdf\x4b\xe5\x74\x7b\xe3\xc2\xef\x25\xd6\x05\x93\xc8\xcf\xbe\xd7\xbc\x78\x6c\xe6\x02\xbc\xa3\x58\xde\x8c\xdd\xda\x7b\x6a\xce\x50\x79\x37\x79\x96\xc0\x27\xb2\xd2\xb6\xe9\xf9\x96\xb6\xb2\xd9\x93\xb4\xdc\x9f\x5d\xf6\xf5\xb2\x7a\x02\xe4\x2d\xcc\x2f\xfa\x03\x2e\x8f\xdf\xb2\x7c\x37\xb1\x14\xd2\x57\xf5\xfd\xd6\xeb\x54\xd7\xc4\x63\x6f\x6b\x34\x7f\x7a\xb6\xf0\xbe\xc9\xfd\xfd\x6e\x80\x18\x20\xb5\xf0\x86\xcd\x38\x7a\xeb\xda\xee\xe9\x64\x1d\x9e\xaf\x6d\xfd\xb4\xcf\xbb\x39\xbd\x79\x67\xe6\x4f\x8c\x16\x2c\x05\xdc\xfb\x69\x9d\x6f\x73\xe1\x27\x40\x7e\xc2\xfb\xd5\xf1\xc5\x73\x67\x3f\x9e\x3d\x61\xb8\x3f\x37\x58\x1e\x08\x5e\x3b\x9f\xc6\x4a\xac\x3e\x17\xc9\x5c\x70\x22\xd2\x48\x8b\xc8\x8e\xc9\xcc\x13\x20\x11\x70\x4c\xce\xbc\xfa\x4a\x22\x7b\xa7\xaa\xeb\x9b\x60\xf1\x31\x71\xd3\xef\x27\x4a\xe6\xbf\x92\xef\x3f\x1d\x77\x7b\xc4\xe3\x52\xc6\x8f\x1c\xf5\x08\x80\xc4\xc2\xa9\xe5\xee\xc4\x89\x4e\xf6\xac\xd8\x57\x99\x17\x47\xa7\xf4\x06\x6a\xdd\x68\xe2\x49\x9d\x6b\x0b\xc0\x91\x48\x1f\xdc\xe7\x32\x17\xdb\x7a\x80\xfc\x84\xff\x7a\xb0\x68\x70\xd8\x62\xa1\xe3\x44\xa5\xa2\x3f\x8e\x7e\x9e\xd5\x89\xa3\x46\xe3\x6e\xf6\xaf\x85\xb9\x5f\x83\x35\x44\x47\xac\x9b\x3e\x78\x02\x79\x0d\xe8\xf1\x2c\xde\x85\xd8\x12\xb7\x70\xd7\x71\xcb\xbe\xa1\xbb\xe4\xd4\x4d\x45\x1c\xc6\xc6\xef\xc2\x4e\x8f\x79\x70\xdc\x32\x36\x4a\x47\x2e\x00\xe4\x23\x5c\x61\x0c\x37\x06\xa6\xcf\x8c\x5c\xe1\x38\xa4\x7b\x05\x20\xe5\x2d\x31\xd1\x2c\x1d\x6d\xfe\xe2\xaf\x5c\x0b\x72\x06\xef\x3b\x9c\xca\x19\x05\x48\x17\x9c\xd3\x67\x5e\xbb\xdb\xc8\x04\x2d\xf2\xe5\x39\x00\xf7\x4b\xf3\x7d\xce\x35\x5a\x8f\x6c\x0f\x37\x59\x14\xeb\x8f\x84\x9f\xfa\x92\x77\x5b\x1c\x00\x24\x02\x4e\x5c\x56\x76\xb3\xb4\xe0\xe6\x68\x94\xb1\xcf\x59\x0a\x5e\x32\x1d\x05\x12\x89\x13\xa4\x8d\x41\x73\x15\xb1\x0c\xa7\x44\x38\x7a\xc4\xed\x01\x92\x0b\xcb\xdb\x6b\x97\x1e\x87\x87\xf6\x2e\xf2\xd8\x94\xbd\x29\x35\x6a\x97\x55\x5d\x25\x73\xee\xfb\xf1\xd6\xc3\xcd\x6b\x0e\xf7\xc3\x89\xf6\x0f\xbc\x65\x76\xdd\xa0\xb2\xd5\x36\x31\x13\x39\xdf\x7c\xca\x8e\xae\x53\x20\x80\xf6\xa5\x49\x20\x61\xe0\x72\xf8\x5d\x41\x7f\xf1\x29\xfd\x35\x25\xe8\x51\x9a\x26\x97\x44\x5f\xae\xa0\x25\x16\x4b\xd7\xcb\x99\x8f\xca\x1a\x9b\x69\xe3\x42\x63\x1f\x1a\xcf\x0b\xba\x1a\x37\x1d\x57\xce\x85\x7f\x89\x5c\xbe\xce\xa8\xa4\x5e\xe4\xeb\x70\x5d\xf5\xab\x4f\xad\xfb\x27\xaf\xe5\x58\xf2\x7d\x71\xc6\x3d\x9b\x3e\x7b\x95\x39\x36\xe1\x41\x4d\x9d\x27\x40\x72\xe1\xc3\x56\xe8\xf9\x5b\xf5\x92\x21\xb7\xd0\x98\x7c\x21\xee\xc8\xfe\xea\x71\x0f\xea\x5a\x15\xd1\x87\x41\xd9\x0d\x4d\xeb\xe3\x5c\x34\x1d\xa5\x00\x29\x80\x0f\xdb\xa2\xab\x58\xe4\xe7\xdd\x0a\xfe\x51\xb4\x7f\x64\x54\xef\x10\xd8\x71\x65\x3d\x9f\x28\x9f\xec\x7b\xa5\x70\xbf\x77\xc5\x22\xe3\xb4\x3c\x40\xc6\xe1\xa5\x3f\x90\xf3\x21\xe0\x88\x2d\x13\x97\xf6\xcd\x5a\xd9\x8f\x3a\x2f\x86\x0f\xf4\xd9\x28\x3e\x12\x11\x78\x78\xaa\x36\xf0\x73\xb5\x89\x90\x01\xf4\x68\x5a\xc1\x33\x56\xd9\x5b\x56\x3f\x7d\x66\xc3\x92\xc3\xe5\x6f\x84\xe6\xc8\x9a\xf9\x7f\x8e\x62\xcb\x64\xe6\xf5\x92\xc9\x55\xda\x25\xb0\x75\x82\xe0\x24\x5b\x11\xaa\xfc\x2a\xd6\xc2\x7c\x9e\xb6\x43\xa7\x34\xfc\x87\xf8\xb3\x43\x03\xfb\xa4\xf3\x7a\x2d\x74\x1f\x1b\x97\x7d\x89\x7d\xc0\x7c\x00\x20\x0b\x70\x6a\x93\xdb\xff\x9b\xdd\xf3\x4f\x2f\x55\x94\xdf\xde\x52\x07\x8a\xd6\xd6\x3d\xbb\xd8\xfc\x6d\xc3\x2d\x03\x07\x2d\x55\xc7\xa2\x45\x47\x3f\x03\x64\x1d\x36\xbc\xe9\x54\xcd\x75\x52\xa5\x5d\xd9\xc1\xc5\xd6\xb8\x16\xa9\xe6\x1a\x53\x67\xbd\xbb\xa4\x43\x77\x83\x9b\x3c\x1c\x4f\xd6\x7f\xad\x7f\x00\x00\x12\x08\x9f\x38\x83\x12\xdc\xd5\x37\xd9\xb5\x59\x79\x38\x30\x90\x4d\xfa\x5b\xe9\xeb\x81\x69\xe0\x1a\x78\xf3\xd7\x97\x1e\x21\x9b\x01\x9c\xeb\x75\x80\x74\xc2\x8f\xd7\x73\xd7\x1f\x23\x36\x60\x39\x1f\x7c\xe2\x55\xfc\xb5\xfc\xeb\x5d\xf4\x46\xa2\xbd\x69\xbf\xc7\x1f\x13\x34\xfb\x94\x3c\x24\xbb\x3d\x09\x3d\x3a\x47\x98\x49\x2a\x35\xcf\xba\x7b\x53\x66\xef\x83\x49\x92\xb2\x73\xeb\x31\xf7\xdc\x0f\xfa\xdf\x38\x9e\x39\xcb\x2d\x90\x1d\xc7\xf7\xc2\x13\x20\x51\x30\xc7\xd9\x17\xb7\x28\xdc\x64\x72\x6d\x65\xd4\xc9\x26\x98\x57\xd5\x35\x4d\x58\xe0\x9e\xb1\xd8\x93\x4d\xfd\xa4\x53\x8c\xc7\x2e\x08\xbf\x7f\x02\x90\x89\xff\xfc\x0c\x43\xd1\x91\xbd\x32\xce\x47\xbf\x87\x9c\xb7\xf2\xf7\xed\xc9\xbd\x28\x7f\xbb\x2f\x6e\xbf\xfe\x63\x31\x55\xae\xcb\xec\x4a\x42\xaf\xe2\x00\x32\x0f\xff\x75\xc3\xb7\x57\xe5\xfd\x17\xbf\x6e\xb6\x71\x9a\x78\x25\xc8\xfb\x1f\xe4\x33\x57\x4a\x3d\xdb\x14\x18\x4e\xae\x4d\x92\xdc\x50\x40\xde\x04\xdf\xaa\x4b\xa6\x4c\xe3\x65\xb9\xbc\x27\xea\xb1\x7c\x24\x8b\xbf\x61\xe4\x9b\xdb\x91\x43\x0f\x99\x9f\x8a\x9c\x4c\x6e\x29\x69\x60\x8c\xbc\x8d\x03\x48\x02\x5c\xda\xa8\x25\xad\x97\xe2\x49\x52\xd8\xd2\x2b\x64\x19\xcb\xcd\x4f\x07\x10\xa7\xad\x10\xda\xc4\xcd\xd3\xe9\x72\xc7\x14\xf7\xcc\x2b\xc8\x03\x80\xd4\xc3\xfd\xbb\x83\x5e\xd8\xfd\x92\x8c\xfe\x5b\x6d\x8c\x3c\x5d\x45\x22\xe4\x57\x34\x65\x13\xe7\xc2\x09\x1b\x0c\xb5\xaa\x1e\xbb\x94\xd5\x19\x8a\x01\xe4\x17\xbc\x73\x7f\x65\x8b\x35\x7b\x9b\xf5\x2b\x59\xd5\xd0\xc9\xce\xee\xdd\x77\xdf\xe4\x32\x1d\xf1\x4a\x05\xbb\x5e\x11\x83\xb6\x94\x96\xc7\x8d\x83\xd0\xa3\xa6\x97\x8e\x6f\x5e\xb8\x22\x35\xbf\x7a\x50\xe6\x39\x69\x7f\x68\x40\xc9\x7e\x71\x75\xfb\x04\x99\x35\xdd\x5e\xa7\xf5\xdf\x3d\x21\x66\xa2\xff\xca\x6d\xc9\xb6\xc7\x84\x28\xb9\xc7\xa6\xb7\xdb\x88\xa7\x68\x5b\x83\xc5\x70\x51\x04\x2a\xb8\x60\x73\xdc\x1d\xab\x50\xd9\x1f\x9b\xe6\x6e\x23\xbe\xa2\x77\x9a\xb0\x98\x2e\x1e\xf1\x0d\xb5\x0a\x8b\xeb\xe2\x11\xb3\xe8\xe7\x23\xb0\xe9\xee\x5f\x84\x3c\x2b\xfe\x15\xd8\x84\x77\xfb\x15\x5e\xa8\x51\x98\x9c\x77\x07\xd1\x87\xf6\x73\xd8\xac\x77\x1b\xd1\x4a\xfd\x3f\x49\xf8\xff\x27\xbe\x78\xc4\x6f\xf4\x87\xd3\x31\xb9\xef\x8e\xe3\xce\x68\xeb\x8b\x49\x7e\xb7\x5f\xe1\x83\x8e\xc4\x31\xf9\xef\x0e\xe2\x03\xea\x38\x36\x03\xde\x41\xa0\x43\x18\x2c\x12\x8c\x47\x94\x92\xa2\x77\xb9\xb0\xc8\x30\x50\xc0\xd1\xc8\x79\x6d\xed\x2b\x78\x68\xd8\xf8\xed\xe1\xd4\x71\xc3\x9e\xce\x20\xc3\x49\x85\xb1\xd3\xcf\xbc\xba\x05\xaf\xf5\xde\x1a\x8a\xcc\xdc\x65\x3d\x66\x62\x5e\x21\x63\xb1\x75\x3a\x60\xea\x45\x74\x85\x84\x22\x4a\xd4\xc2\xf8\xd6\xa9\x49\x13\xde\xee\xeb\x47\x4f\xc5\xa9\x50\xa5\x28\x8b\x1a\x1f\xb5\xb3\xa3\x09\xf4\x55\x3e\x83\x03\xc8\x24\x9c\xf2\x42\x6b\xfd\x8d\x3a\x94\xd4\x89\x01\xff\x81\xe0\xcd\x39\xd9\x33\xae\xa5\x1d\xc5\xda\x38\x4a\xc6\xc7\x14\x84\x52\x9e\xef\x2d\x77\x03\x80\x14\xc2\x15\xf5\x23\xef\xb0\xc5\x3d\x45\xa5\x37\x05\x1a\x77\x4f\xa6\x3a\xfa\x0f\xd0\xfe\x9c\x64\xf8\xe0\x8c\x9c\x1e\x23\xb8\x3f\xad\x5d\x52\x95\x05\x90\x92\xff\xf4\xa4\x4d\xc6\x77\x8a\xac\xae\x6b\x08\x4d\xf7\xbb\x95\x16\x5a\x7e\xf3\x6a\x5c\x66\xff\x64\x78\x84\x62\xec\xce\xc5\x9c\x4e\x1f\xbf\x74\xd1\x7f\xf3\x12\x3d\x72\xe8\x8c\x11\xcb\x4f\x34\x75\xa0\x5a\x10\xa6\xa7\x3b\x88\x49\x34\x75\x60\xfb\xba\x8d\x28\x44\xe7\x66\x58\xee\xe2\x11\x25\xe8\x3b\xb0\x5b\x9e\x6d\x84\x27\x2a\x5e\x62\x77\x3d\xdb\x88\xc7\xa8\x16\x84\xd5\xf8\xe0\x11\x1f\xff\x27\x2c\x62\x35\x40\x40\x91\xcb\x83\x80\x7b\x6b\xb7\x86\xc2\xf5\xf6\x62\xc7\x95\x8e\x3b\x9d\xe9\xb7\x37\x2f\xe4\x93\x21\xe9\x31\x2f\xe3\x3d\xce\xc6\xab\xfe\xfe\x42\xd6\xb4\xd6\xca\xfa\x95\x1c\x6c\xbd\xa4\x17\xee\xb3\x2d\xbd\xa4\x1e\x74\x3b\x46\xb7\x54\x9d\x70\x8e\x4e\x53\xac\xd5\xd1\xc5\xbd\x21\x7f\xd7\x96\x99\x4e\x3e\x57\x42\x78\x99\x50\x2b\x01\x07\x90\x10\x98\xdf\x96\x04\xb4\x7f\x33\xbe\xad\x40\x18\xcb\x7f\x58\x27\x78\x29\x49\xf6\xc2\x07\x0f\xdc\xee\xb3\x35\x17\x7c\x7b\x53\xb5\x1f\xbd\x91\x9c\xc0\x01\x64\x00\xae\xa2\xd3\xa4\xba\xe1\x64\x0f\x58\xc7\x27\x05\x75\xa8\xca\x2a\x1e\x2d\x74\x28\x4c\xcd\x26\x1f\xd4\x1c\x64\x2a\x59\xce\x2f\x27\x4b\x15\x15\xfd\x37\xb3\xf1\x01\x0a\x45\x2b\x17\x96\xe1\x78\x44\x2f\x9a\x2a\xb1\x4c\xc7\x23\x42\xfe\x57\x87\x30\x8c\xc7\x23\x06\x68\xd1\x65\xc3\x6a\x46\x81\xe2\x01\x02\x2e\x8f\xad\x65\x6b\x84\x97\x81\x9c\xaa\xf2\x8d\x79\xc5\x3a\xf1\xbc\xa3\x6a\xf8\x2d\xb5\x68\x49\x1f\x7b\xab\xdb\x0f\xa6\xae\xf8\x16\xab\x08\xbc\xaa\xdd\xcc\xe4\xc4\x01\x04\x07\xeb\xbb\xe9\xd9\x05\x3e\xf7\xf6\x37\x20\x4f\x88\x1e\x9a\xe9\xd6\x17\x09\xdf\xd5\xfe\x72\x53\xf8\xb9\x84\x1d\xcd\xb5\x48\xfb\x56\x59\x97\x1f\x38\x80\x2c\xc1\x59\x40\x60\x79\xfd\xce\xf4\x9b\xe7\xc3\xc4\xbb\x6f\x2f\x74\xc7\x59\x2d\x57\xba\xfe\x5e\x2b\x3c\x18\x62\x71\x25\xc4\xf7\x5a\x91\xf7\x20\x3d\x0e\x20\x1d\x30\x9b\x99\xd8\xd3\x27\xd8\xef\x1b\xa7\x3a\xa1\x2e\x1a\xa7\xa1\x68\x71\x20\x70\x4d\x49\x22\x49\x71\xdc\x45\x44\xf9\x3b\x59\x55\x97\xb7\xba\xe8\xbf\x99\x8d\x0f\x50\x23\xba\x08\x58\x86\xe3\x11\x38\x54\x7f\xc4\x32\x1d\x8f\x58\x42\x4f\x34\x96\xf1\x78\x44\x07\x7a\x3e\xb1\x25\x81\x6d\x44\x3a\x9a\x67\xb0\x55\x81\x6d\x44\x36\xfa\x0e\x2c\x61\x00\xcd\x4c\xe4\xe8\x7c\x11\x4b\x20\x00\x0a\x34\xa4\x7f\x0b\x56\x3d\x3c\xcf\x3b\x43\x99\x9e\x9d\xdc\xc0\xb7\xb6\xd7\x20\xa8\x38\xa1\xc9\xfe\xf8\xb9\xab\x01\xb8\x56\xd9\x0d\xfd\x8b\xfe\x27\x5f\xdb\x48\x17\x6e\xad\xf5\x17\xb8\x59\x60\x1a\xfb\xe0\xee\x75\xe8\xbd\x6d\x96\xd9\x9b\xc7\x8f\x28\x87\x72\x9f\x1f\x24\xf5\xd5\x23\xb9\xec\xd9\x4e\x1e\xa6\x7c\x43\x9f\x5f\x08\x07\x90\x58\xb8\xc0\x51\xae\x6c\xbc\x4e\x95\xf0\x49\xe6\xea\x3c\xd8\x7a\x80\xed\xfc\x54\xb8\x20\x9b\xc0\xe0\xfb\x92\xd7\x29\xb2\xce\x69\x47\x2d\xb4\xc3\x70\x00\xa9\x83\x89\x37\x61\x5b\xf4\xd5\x94\xd0\x28\xe1\x95\xcf\x02\xcd\x6a\xef\x3e\x21\xb1\x6b\x9a\xf7\x8f\x7e\x78\x32\x9a\xb6\x74\xd5\x89\x57\xf9\x6b\x9f\xe8\xbf\x99\x8d\x8f\x4f\x3d\x3a\xe3\xc5\x32\x1c\x8f\xf8\x82\x92\x06\x2c\xd3\xf1\x88\x58\xb4\x66\x61\x19\x8f\x47\xd4\xed\x46\x53\x00\x96\x56\x03\x14\xb9\x08\x5e\xfe\x4d\x01\x31\x70\x07\xf9\x86\xcd\x69\x78\xf0\x93\xb3\x8f\xd0\x3c\x0d\x65\xbd\xbf\xf2\x53\x37\x07\x9b\xd7\x1c\x63\xd7\xcc\x3b\x04\x1d\x7f\x3f\x0e\xdf\xab\xb8\xb5\x61\x61\x4d\x72\x8a\xaf\xc3\xd7\x75\xb6\xf0\x8d\xb6\x8a\xcf\xbe\x57\x4c\x84\x27\x93\x04\x8a\x58\xd4\x19\xec\xe7\xd5\xbe\x19\xb2\x86\x55\x35\xbc\xc7\x01\x64\x13\xd6\x78\xa2\x4e\x12\xd6\x48\x71\xa5\x7e\x65\xd4\xbf\x72\x61\x22\x5e\x7f\x5f\x99\xb7\xf2\x9c\x98\xca\x65\xb6\x22\x66\x87\x54\x35\xe7\xc1\x2d\x7b\x16\xe1\xcc\x5d\xce\xa6\x55\xdd\xf3\x4a\xd8\xc2\x3f\x5b\xee\x0e\xb5\x5c\xf0\x4f\xe6\xe5\xc3\x52\xbf\x1e\xd5\x85\x65\xb3\x59\xea\x8b\x20\x40\x47\xf4\xdf\xcc\xc6\x07\x28\x06\xbd\xc6\x89\x65\x38\x7a\x3c\x51\x3e\x89\x65\x3a\x1e\xb1\x89\xf2\x49\x2c\xe3\xf1\x88\x45\x74\x86\x89\xad\x98\x6d\x23\xde\xa2\x5b\x03\x5b\x34\xdb\x46\xd4\xa2\x56\x61\xe9\x66\x78\xc4\x4f\x74\xc3\x62\x2b\x67\xdb\x88\x08\x74\xea\x89\x2d\x9e\xed\x6c\x71\xb4\x4d\xc1\xd2\xcf\x50\xab\xd0\xfb\x1b\xd8\x12\xda\x76\x0b\xa1\x81\x8e\x7b\x31\x45\xb4\x1d\xfe\x83\xb6\xb2\x98\x3a\xda\x0e\xa2\x0b\x2d\xd6\xd8\x4a\xda\x4e\xa8\xd0\xdb\x06\x58\x62\x1a\x1e\x91\x4b\x84\x9e\x6d\x2c\x51\x0d\x28\x92\xec\x22\xf8\x7b\xe5\x23\x03\x56\x34\x5f\xad\xe7\x21\x8a\xd1\xcd\x4f\xb5\x22\xc6\x7e\x92\xe9\xcd\xb4\x1d\xef\x3a\x50\x99\x2c\x49\x27\x76\xfa\xcb\x9e\x5c\xba\x1b\x4f\x0c\x70\x00\xf1\x86\x53\xb2\x75\x45\xd8\x42\x60\xf6\x52\xda\xae\x21\x61\xbe\xb6\x05\xf3\x88\x14\x5f\xda\xb8\x42\x4e\x3f\x8e\x1b\xdf\xd5\xd4\xdb\x2c\x07\x08\x70\x00\xa9\x81\x9f\xb7\x9a\xaa\x3a\x62\x76\x51\x52\x22\xf5\x99\xc6\x91\x8b\x69\x31\x56\xca\x9e\x83\xf1\xba\xc8\x53\x13\x13\xea\x87\x27\x77\xb9\x6f\x3a\x6e\xd9\x03\x9f\xed\x53\x9c\x62\xdf\x98\x99\x69\xbe\xaa\xda\x8c\xf6\xfd\xae\x33\xfb\xa4\x4c\xb2\x59\x3c\x31\x75\xee\x4d\xc5\x3d\xe3\xc0\x14\x42\x89\x09\xd1\x7f\x33\x1b\x1f\xa0\x0c\x74\x2f\x61\x19\x8e\x47\x78\xa3\x3b\x1c\xcb\x74\x3c\xa2\x06\x45\x60\x19\x8f\x5a\x45\x8b\x5e\x86\xc6\x12\x38\x81\x22\xd7\x2e\x9e\x3d\x3e\x38\x80\xe4\xc1\x1a\xe0\xa6\xef\xed\x64\x40\xac\xa8\x3a\xca\xe6\xe5\xa7\xfb\x6b\x8c\x72\x5f\x2e\xe5\x52\x79\xfd\x9f\x07\xb1\x8f\x18\xd3\x62\x54\xa6\xc6\xb6\x6a\x0b\xcc\xe2\xe2\xad\xe6\x5d\xd6\x7e\x56\xe9\x96\x64\x37\x44\x56\x57\xdd\x75\x18\x65\xf1\xf5\x3c\x73\xa0\xd5\xf4\x53\x6d\x39\x6e\xc9\x5f\x6d\x1c\x07\x90\x24\x58\x5b\xe6\x34\xe7\x66\xea\xd6\x91\x53\x96\x8d\x3f\x56\xe1\x3e\xe2\xf3\xd9\xf1\xc3\xfe\x24\x69\xf3\x9e\xb9\x8c\x84\x5a\x37\x6d\x22\xa5\x2d\xda\xfb\x15\x2e\x11\xb4\x61\x69\xd2\x4a\x49\x7b\x41\x36\xa1\x83\x94\xb5\xe3\xca\xd4\xdc\x77\xb6\xc7\x3d\xf4\x21\xdd\xd9\x8a\x65\xa3\x7b\x1f\xff\xfd\x37\xe5\x5c\x98\xc5\x81\x4a\x9e\xe2\x14\xe1\x47\x77\x65\x8f\xb6\xea\x5f\x15\x96\x0a\x23\xa4\xb6\x3b\x9a\x64\x7f\xbf\x98\x52\x26\xd3\x96\xec\xeb\x45\x2e\x1c\x40\x3e\xc1\x2c\x31\xad\xda\xd0\x30\x2f\x48\xf2\x73\xcb\xde\x93\x2e\xef\x8d\x93\x97\xad\x7e\x8c\x3d\x16\xca\xd1\xb8\xe5\x51\x7c\x4c\xd0\x71\xd6\xf8\xef\xe7\x4c\xe1\x6d\x1d\xd2\x4b\x64\xb1\xd0\x64\x21\x6f\xc6\x96\x4e\x96\xef\x6b\x5e\x62\xc3\xc2\xd9\x71\xcd\xf9\xeb\x3b\xbe\x5e\x31\xd9\x7a\xf9\xc1\x07\xa2\xff\x16\x46\xfc\x82\xe5\xa1\x13\x64\xac\x40\xa2\x95\x1d\xe5\x95\x58\xa1\xc4\x23\x92\xd0\x0c\x83\x15\x4c\x54\x96\x42\x0b\x17\x56\x38\xd1\x7c\x81\x72\x3e\xac\x80\xe2\x11\x9f\x50\xee\x8a\x15\x52\x54\x33\xa2\x41\xff\x31\x05\x4b\x92\x07\x8a\x34\x04\xe4\xb4\xde\x38\x80\x2c\xc3\x39\x40\x20\x25\x5c\x8a\x8c\xb4\x32\x33\x7a\xc8\xfa\xd5\x7d\x7d\x31\xd6\x89\x58\xc9\xdc\xe3\x17\xd3\xd2\xb8\x85\x6c\x95\x66\x3f\x45\xf3\x6c\x99\x05\x8f\x1e\x76\x1f\x2c\x78\x4f\xa9\xaa\x76\x53\xab\xfd\x0d\xfd\x53\x63\xc6\xd9\x81\x78\x0d\xe6\x14\xba\xec\xd9\x97\xf6\x2e\x51\x29\x0c\x8e\x74\x38\x80\xa4\xfc\xe7\xf7\x1c\x1a\x69\x1f\xee\x3f\xf3\x39\x78\x94\x6f\x38\xd8\x8e\x85\xec\x47\xfa\x6a\x94\x9e\xe1\xf9\x35\xdd\x8a\xf3\x1a\x8f\x32\x82\x8b\x6e\x6d\x71\x02\x58\xd7\x38\x44\x33\x7b\xe5\xd2\xed\x11\xb5\x5f\xdf\xb8\x82\xbf\xda\x7c\x39\x2b\x40\xc4\x3a\xb7\xa8\x28\x2d\xf5\x84\xe5\x66\xf8\xe4\x48\x08\x37\x0e\x20\x93\xff\xb1\x87\x17\x64\xf6\x3e\xb5\x92\x1f\xbb\xac\x51\x34\xbd\xfa\xb6\xfa\x4e\x48\x3c\xb5\xe6\x2f\xb6\x3a\x1b\x77\xd3\xfa\x33\xfd\x3f\x8f\x8a\xfe\x9b\x9b\xf8\x80\x2e\xa3\x4c\x00\xcb\x51\x74\xd1\xd0\xeb\xbd\x58\xae\xe2\x11\x29\xa8\x78\x82\xe5\x2c\xca\x9a\xd0\x86\x03\xcb\x5d\x54\x3c\x41\xad\xc2\x1e\xbd\xec\x6c\x57\xf4\x1d\xd8\xd3\x97\x6d\x44\x01\xba\xc1\xb1\x06\x30\x78\xc4\xf8\xff\x9a\x1a\xac\x41\x0c\x50\x24\x23\x92\xfb\xfb\x73\xe5\x4f\xe0\xed\x74\xda\x90\xf2\xd1\xe3\x21\x9a\x7c\x35\xfe\x69\xf6\x09\x86\xca\x27\x59\x2c\x9c\x42\xab\xf4\x6e\xfa\x82\xc3\xe2\xca\xcf\xcf\x3f\xba\x0a\x90\x40\x38\x55\xba\x6a\x49\x69\x06\x95\x8a\x3e\xca\x76\x0e\x23\xe2\x09\xf0\xa6\x3f\xc7\x54\x72\xd2\xa6\xbe\xe9\xd2\xc7\x18\xd3\x49\x27\xe7\xb3\xd1\x5b\x15\x05\x66\xc7\x57\x2a\x8c\x87\x3d\xc7\xec\xd4\x0f\x54\x8c\xfb\x4c\x5d\x2d\xa0\x1f\xef\x77\x9a\xf2\x0d\x61\x5d\x20\x26\xb6\x6b\xfb\x45\x45\xf4\x07\x07\x90\x4e\x58\x07\x79\xed\x51\x41\xde\xa7\x5a\x6f\xab\xcb\xcb\x19\x72\xfc\x10\xf5\x2c\x8b\xc3\xc3\xe1\x4b\xc4\x0e\xe7\x39\xeb\x9f\x8e\x2a\x92\x0e\x50\x8b\xfe\xab\xd5\xdb\xf1\x79\x82\xee\x0c\x2c\xc3\xf1\x88\x40\x34\x2d\x61\x99\x8e\x56\x50\x94\x87\x62\x19\x8f\x47\x74\xa2\xe4\x0a\x7b\x1a\xb6\xc3\x8e\xd1\x14\x8e\x3d\x10\xdb\x46\x2c\xa0\x7e\x60\xce\xc4\x76\x10\xeb\x28\xd7\xc5\x9e\x8a\xed\xc4\x0a\xe5\x0e\x58\x83\x31\xd4\x73\xaa\xa5\x86\x9d\xf4\x8a\x35\x20\x03\x8a\x72\xfc\x44\x7f\x6f\xc9\xfb\xc0\x83\x5d\xf1\x9b\x26\x7f\x3e\x06\x1a\x4c\x92\x09\xa4\xde\xb5\xb5\x4b\xbd\xd9\x7a\x5d\x55\xfc\xfd\x51\xa6\xf0\x94\x7a\xeb\x1c\xf7\x07\x3e\xc3\x00\x89\x81\x05\x9d\xfd\x31\xd2\x72\x83\xbe\xad\x81\x72\x14\xe6\x8a\xb2\x0a\x3d\x9d\x39\xeb\x47\xfa\xb8\x2b\xbd\x24\x3f\xb6\xcc\x1c\x5d\xf2\x4c\x72\xc3\x01\xc4\x17\xd6\xf9\x2c\x1b\xa2\x3a\x53\xc8\xbf\x08\x45\xf1\xf4\xea\xa9\x4c\xc8\x3a\x0a\x6f\x38\xec\x23\x91\x3a\x50\x78\x5e\x26\xe9\xeb\x09\xaa\xd0\x83\x5b\xb9\x03\xce\x96\x29\xea\x7a\x95\xd5\x31\x59\x4f\x4d\xde\xbf\x3c\x51\xba\xfe\xda\xca\xe8\xc8\x5b\x99\xe6\x6e\xe2\x3b\x5c\x03\x76\x4e\xfa\xb4\x15\xed\x38\x80\x78\xc2\xc7\x8d\x69\xff\x1d\x0d\xff\x7a\x57\x8d\xbc\x43\xdc\x7f\x2e\x7a\x5c\x70\x3c\xe5\xed\x63\x7e\xe7\xf9\xc4\x70\x63\xac\xe8\xa1\x5e\xe6\xec\x93\x38\x80\xac\xc0\xa2\x80\x22\x81\xd2\x9f\x87\x7c\x0c\xb4\x8a\xb7\x6f\xd3\x54\xb8\x30\xd1\x8b\x6b\xc5\x88\xe5\xe1\x2c\x58\xf9\x3a\x6f\xad\xb1\xcf\xf6\xda\x8b\xfe\x6b\x54\x76\x66\x09\x28\x49\xc7\x0a\x0c\x9a\x29\x51\xc1\x08\x2b\x34\x78\x84\x2f\xaa\x25\x62\x05\x07\x7d\x07\x9a\x5b\xb1\xc2\x83\x8a\xc6\xe8\xb9\xc6\x0a\x10\x1e\xb1\x82\xf6\x97\xd8\x93\xd6\x6d\x44\x14\x4a\x1e\xb0\x87\xad\xdb\x88\x09\xd4\x73\xac\x79\x2b\x1e\x31\x4f\x81\xfe\xd3\x08\xd6\xdc\x15\x28\x12\x11\x6e\x7f\xe1\x3c\x09\x96\x2b\xe4\xb9\x27\x94\x2e\xbe\xe4\xb8\x9d\x46\xd7\x1a\xb7\x36\x96\x05\x36\x6a\xa3\x94\xe8\xc6\x47\x8e\xbe\x94\xa1\x35\x7e\x30\xa5\x94\x84\x03\xc8\x10\xcc\x45\x1f\x17\x33\x70\xdf\xff\x76\xfa\x03\x83\x60\xf8\xd8\xd7\xa8\x88\x39\xdd\xe6\x41\xdb\xbc\xdd\x12\x45\x39\x6c\x8b\x5e\x9b\xee\x0e\x27\x3d\x01\x12\x09\x27\x7c\x1f\xc5\xe4\xd3\x9f\x83\x16\x2f\x45\xea\xe8\x55\x18\xc8\x7f\x74\x11\xb7\x96\x6f\x7a\x9e\x43\x68\x25\xb5\x17\x58\xd3\x97\xaf\xdf\x00\x48\x33\x9c\xef\x9d\xa5\xd4\x85\x79\xc3\x5c\xd2\x9a\x4c\xef\x2e\xe7\x92\x9e\xfe\x52\x59\xef\x77\x38\x7a\x43\x7f\x69\xf4\xaa\x1d\x4f\xbd\x81\xb1\x38\x40\x5a\xff\xf3\x9b\xee\x61\x7e\x8e\x5d\x02\x4e\x2a\xf6\x24\xeb\x69\xfb\x48\xad\x7b\xe8\x16\xc6\xdf\xe7\x82\xf7\x0f\x6c\x06\xcb\x97\x3c\xd4\x49\xc2\xb7\x52\x06\xdc\x39\x7c\x59\xf2\xa5\x9c\xe2\x1b\xd4\x4b\x7c\xd4\x69\x09\x04\x0a\x68\x6c\xa5\x64\x4a\x33\x67\x76\x29\x88\x32\x36\xe6\xe6\xfc\x54\xc4\xff\x4c\x29\x56\x50\x50\xd6\x8a\x4a\x21\x58\x61\xc1\x23\x86\xd0\x4d\x81\x1d\x98\x6d\x44\x24\x9a\x88\xb1\x63\xb3\x8d\x68\x46\x0b\x0a\x56\x78\xd0\xb9\x25\x7a\x48\xb1\x02\x84\x26\x62\xb4\xa0\x60\xce\xef\x77\x10\x09\xe8\x9c\x06\x7b\x82\xbf\xa3\x28\xa2\xd4\x0f\x6b\x88\x8f\x47\xfc\x62\x40\x3f\x3b\x8a\x35\xcc\x07\x0a\x1a\x44\x7f\x35\x5a\x6f\x98\x7c\x3f\x52\x44\x02\x8b\xff\x9c\x4e\x3a\x15\x13\x12\x52\xc4\x1b\xce\xfb\x33\x99\xfa\xdd\xda\x8d\xd3\xfa\xbf\xd4\x92\xdc\x8d\x78\x92\xb7\xc8\x7a\x14\x9c\x5e\x2b\xa8\x57\x65\x26\x4a\xec\xc9\x93\x6a\x2d\xee\x2e\x72\xa5\x73\xda\x9f\xbb\x72\x70\x77\xaa\x75\xe6\xa8\x3c\xab\x6b\xb2\xf0\xda\x1d\x1c\x40\x56\xe1\xd3\x73\x89\xd9\x24\xfe\x79\xc0\xc3\x27\x04\xee\x69\xbf\x6d\xdc\x16\x78\x3c\x9a\x6c\xbe\xd0\xa6\xca\xfe\x08\xf5\xfd\x7e\xd2\x6c\xc0\xc9\x0e\x00\x79\x11\xe8\xf1\x2e\xb5\xae\x53\xa0\x42\xce\x9e\xef\x97\x8d\x45\xe8\x58\xac\xa2\x3c\xa3\x58\xfb\xd9\x6f\x41\xcd\x6a\x8f\xd3\xdb\xbe\x32\x08\x9b\x03\x24\x00\x2e\x0e\xad\x5e\x17\xb4\x8e\x26\x1b\xda\x1f\xee\x64\xab\x4a\x93\xbc\xb7\x2e\x26\x54\x70\xd6\x9d\xea\xb0\x54\x55\xe3\x91\xb8\x1b\xbc\x91\xd2\xa2\xff\xe6\x24\x2a\x06\xa0\xf1\xc7\x72\x13\x4d\x79\x68\x92\xc4\x74\x74\x07\xb1\x8a\xfe\xa0\x00\xb6\xaf\xdb\xe2\x95\x08\xfe\x15\x58\xde\xe2\x5f\x11\x40\xb8\x14\xb3\xf3\x59\x3f\xc1\x91\xfd\xd7\x13\x88\x96\x6e\xe6\xf7\xd6\x5d\x2e\xbf\xce\xe5\xaa\xa7\x9b\xbe\xf7\x97\x05\x63\x0a\x5f\xfd\x8b\xe0\xfd\xc4\x7a\xc1\x40\x71\xf3\xe3\xe6\x66\x04\x27\x00\x48\x29\x2c\x95\xf3\xa9\xb4\x5f\x4f\xc6\xb1\x1e\x33\x21\xbd\x9c\xab\xe1\xc7\xa0\x61\x73\xf2\xc8\xf7\xd7\x31\xa7\x2d\x09\x52\x18\xfc\x85\xb4\x57\x7f\x03\xe4\x3b\xbc\xca\xaf\x6d\xd4\x8d\x9f\xcf\xe5\x48\x79\xab\x16\x2a\x34\xdc\xba\x77\x79\xae\xfc\xd9\x40\x52\x15\x8d\xda\xcd\x59\x99\xac\x02\x96\x4b\x08\x0e\x20\xdf\x60\x12\xa0\x1d\xd3\x31\xf1\x21\xaf\xf9\x87\x18\x47\xd6\x69\x0e\x2e\x09\x55\x13\x15\x8e\x29\x5c\xd6\x31\x47\x40\x44\x37\x9b\xa6\x2b\xeb\x0e\x00\x12\x00\xcb\x4a\x55\x41\x63\x19\xfd\x9a\x2a\x0f\xca\x6a\x1e\xda\x3d\x63\x3e\x73\x38\xac\x5f\x73\x44\xea\x94\x25\xf1\xa7\x72\x0e\xdf\xdf\x87\xf6\x32\x00\x64\x15\x96\x03\xf2\x98\xc3\x8f\x68\xa5\xf8\x9c\x26\xbe\x76\xb7\xee\x2c\xa7\x55\xf1\xef\x1c\xbf\xe4\xe2\xc3\x15\x42\x17\xeb\x9f\x0b\x2e\x26\x28\xc2\x1f\x0c\xd3\x8b\xcb\x61\xdf\x55\xff\x67\x24\xd0\x78\xda\x52\x34\xad\x36\xae\xa7\x9b\x79\x7a\x62\xa1\xd6\x7f\xe8\x74\xb1\x77\xde\x8a\xd0\x00\x7c\x09\xfb\xc7\x4b\x31\x0d\xdf\x6b\x69\x86\x1a\xd7\x1b\x87\x2e\x9d\xb3\xce\xfd\xa2\x2f\xfc\x44\x57\x88\xc9\xcf\xb7\xb0\xa8\x74\x68\x4c\x17\x00\x24\x13\x26\x5e\xf7\xef\x52\xcd\xc9\xa8\xe4\x3a\x2d\xdf\xfb\xc9\x33\x2b\xfd\x55\x30\xed\xea\x11\x92\x3e\xc3\xcc\x54\x77\x9a\x77\xf6\x5c\x82\xa1\x92\x00\x59\x84\x63\x92\x3f\xff\x6b\x77\x0c\xc8\x5f\xa4\x9e\xb8\x66\xad\x4c\x5d\xc8\x3d\x97\x48\xe0\x1b\xcd\x02\xac\x3a\x55\x94\x2e\x9a\x5c\xea\x9f\x00\x00\xf1\x80\xa7\x2b\x27\x79\x8f\x92\xd5\x6a\x8c\x4b\x2b\x30\xfd\x58\x3e\xbb\x29\xfb\xbd\xcd\xb5\x8b\x83\xe3\x85\x32\x3f\xd3\x4f\xcf\x47\xfb\xdd\xde\x0f\x02\x24\x01\x96\x84\x8e\xbe\x09\x58\xbd\xfb\x7b\x50\x2e\xef\xf1\x3e\xdd\xf2\x65\x89\x57\xbc\x0e\xbb\x0e\x9e\x66\x98\xc5\xbd\xe9\xd5\x9f\x3d\xbc\x22\xc2\x0e\x3d\xfa\xe7\xf8\xdd\xa9\xb2\xe7\xcb\x41\xee\xea\x92\x6d\x35\x93\x7f\x3e\x0a\xa4\x94\x3f\xff\xd9\xd2\x74\xfd\x24\x03\x51\x69\xbe\xc5\x39\x01\xe8\x51\xfe\xa2\x44\x5e\x2f\xa2\x47\x20\x80\x54\x75\x25\xe0\x60\xc1\x67\x73\x3f\xbb\xa5\x3a\x05\x95\x7e\xcb\xce\xc0\x25\x96\xbd\xae\x1d\x38\x80\xbc\x84\x63\x32\x49\x6d\xa1\x57\x94\x79\xca\x74\xf7\x70\x57\xd9\x8d\x07\x57\x1d\xc9\xef\x28\x58\xd7\xbe\x50\x9b\x35\x6d\x31\x48\x13\xb3\x91\x63\xc7\x01\xf9\xd3\xd0\xe3\x1e\x53\xa5\x02\xd9\x6f\x47\xe5\x36\x75\x48\x5f\xe9\x10\x90\xaf\xfe\x00\x2d\x09\xba\x17\xce\x05\x1e\x30\x70\xeb\x8a\x8f\x56\x9a\xf5\x04\xf2\x96\x30\x57\x54\x10\xf1\x39\xb7\x4b\x49\xff\x9a\xb6\x2c\x95\xfd\xea\x09\x87\x9b\x46\x37\x0b\xf3\x2f\xab\x51\xf0\x66\x8e\x68\x26\x90\x76\x8d\x03\xa4\x13\xbe\xfb\x36\x8b\x3b\x39\x35\x78\xf8\xa6\xac\xa5\x37\x17\xdb\x2b\xf7\x6b\x03\x2b\x5f\x2e\x49\xb3\xc9\xb5\x79\xcb\x75\xb4\x73\x0f\xad\xec\x5a\x01\xc8\x34\x4c\x1c\x48\x1b\x23\x94\xcf\xd8\x3e\xe6\x0a\xd8\xd0\xb1\xbe\x1f\x6c\x9a\x4c\x20\xbb\x3f\x7a\x5f\x6c\xf8\x72\x0b\x25\x5d\xae\x9b\x32\x52\x05\x00\xf2\x0e\x16\xbd\xe6\xa6\xcc\x79\x9b\x85\x68\xca\xa3\x5a\xc3\xc4\x8a\x0b\x58\xaa\x7a\xd8\x59\x26\xbd\x07\x8c\xaf\x66\xf4\xcf\xc7\x58\xbb\x4c\x4c\x00\x64\x04\x5e\xcf\x7a\x99\x85\x05\x23\x81\x5a\x9b\x95\xe5\xa6\x4b\xc2\x9d\xf7\x1f\xf5\x0c\x9b\x75\x05\x05\x09\xd0\xac\x95\x89\x2a\x5d\x2a\xe0\xc9\x87\x1e\x7d\x56\x54\x53\xfe\xa8\x24\x30\x66\x61\x92\x47\xa2\xf2\xad\xe8\x63\xab\x5b\xe7\xfb\x16\x67\x42\xc2\xac\x44\x79\xf2\x2c\x2f\x16\x6b\x00\x80\x34\xc3\xf2\x1e\xbb\x7a\xb9\xba\x8b\x1d\x9f\x13\x67\x84\xe6\x68\xba\xa0\x37\xed\xdc\xf3\xf2\xea\x89\x9b\x86\xd1\x42\x9f\x3e\xe3\xf6\x75\x68\x3e\x07\xc8\x00\x6c\x09\xe5\x87\x13\x43\xd3\xdd\xec\xec\xeb\x53\x5a\x0e\xa7\x3b\x1d\x59\xc8\x24\xbe\x3b\xd2\x75\x31\x4d\x4c\x9e\x14\x13\xcb\x1f\xbf\x73\x16\x7a\x74\xef\x8c\x17\xf2\x79\xb4\x84\xa0\xbf\xdf\xc0\x46\x63\x32\xf1\x79\xb0\xc2\x0b\x9d\xa3\x1b\xc4\x9e\x5d\x02\xbf\xec\xd8\xee\xed\x39\xbd\xb5\x69\xe1\x5d\xe8\x73\xf7\xe0\x81\xa1\x0c\xc7\x5b\x15\x6e\xba\x62\xac\xaf\x1f\x79\xa7\x69\x3f\x97\xa2\x30\xcb\x30\xfe\x33\x96\x10\x78\x6e\x56\x92\x12\x20\x69\xf0\xb9\x37\x16\xdf\x57\x93\x72\xee\x32\x7d\x51\xd5\x4c\xce\xc7\x5a\xea\x6b\xa9\xcf\xdd\x64\xb2\x0f\x2a\xcb\xa8\xd9\x48\x30\xee\x69\x23\xd9\x8d\x03\xc8\x00\x5c\x9d\x38\xd7\x67\x03\x04\x81\xd1\x4d\x99\x3a\xb5\x07\x0a\x11\x7c\xc3\x3f\x29\x4e\x9a\xa4\xcf\xb6\xdb\x1c\xb9\x9b\xe2\x72\xb0\xd8\xbb\x16\x7a\x34\xf6\xc9\xbd\xb7\xdf\xb8\x67\x8d\x58\x96\xe3\x08\x3d\x26\xba\x88\x5e\x24\x2f\x57\x32\x28\x93\x98\xb2\xb6\x32\xd3\x5b\x2c\xc9\x3f\xf1\x04\x88\x17\xbc\xfa\x1a\x01\x07\x24\x65\x46\xce\x12\xdd\x2a\x62\x7d\x98\x4b\xf6\x2e\x72\xf4\x7a\xd2\x44\x38\x59\xbc\xb4\x6f\xcd\x80\x69\x2d\x61\xe3\x0f\x80\xa4\xc1\x21\xb7\x77\x22\x62\xf6\xfc\xf5\x5c\x82\x2c\x86\x5f\x72\xd6\x8a\x55\x75\x7c\xc3\x72\xc9\xfb\xcb\x9c\xc6\x97\xf2\xa1\x7d\xdd\x35\xa6\x04\x00\xe9\x84\xbb\xa8\xf9\xd7\xae\xe7\x27\x87\xbc\x74\xdf\x66\x7f\x9c\xce\x70\x76\x54\x35\x7c\x20\xab\xeb\xaf\x14\x7d\xed\x45\xda\x5d\xdd\x3d\x31\x2c\xb6\x00\x20\x9e\x70\xd9\x76\x2d\x2d\xbe\xfa\xca\xd0\x21\x91\x48\xe2\xbd\xf4\x91\x84\xd3\xa1\xdc\x8c\xe9\x20\x81\xa1\x44\x8f\x49\xcc\xa1\x51\xcd\xa3\x58\x1b\x20\xab\xf0\xe3\x3f\x2d\x2a\xeb\x5c\x85\x39\x0d\x49\x12\x47\x25\xe5\x17\xc2\x9d\xe8\x8d\xf2\x54\xce\xd3\xbf\x0d\x0a\x29\x50\x8c\x96\x2a\x99\x86\xbf\x4e\x7f\xc5\xc4\x91\x8b\x46\x68\x97\xbd\xc0\xb9\xee\x76\x23\x11\xc3\xa7\x42\xf6\x7f\x02\x0c\x13\xe8\x0a\x95\x6b\x7c\x26\xfd\x2d\x8f\xd9\x79\x02\x79\x6b\x38\xc9\x55\x59\x18\x27\x20\x2a\xf9\x6d\x01\xc1\x44\x8c\x9e\x13\x3e\x0a\xe0\x79\x53\x60\x87\xe8\x13\xf1\xfb\x07\x6f\xc9\x07\x19\x8e\x02\x24\x02\x4e\x72\x67\x18\x70\x29\x6c\x3a\xec\x94\x1e\x4f\x3f\x1b\xc4\x19\xfd\x4a\x94\x2f\x13\x5b\x6a\x6b\x7f\xa2\xef\xe3\x24\x7c\x28\xef\x78\xe9\x1b\x80\xa4\xc0\x51\x3c\x94\xd1\x76\xf9\x85\xdf\x03\xad\xa4\x8a\x79\xba\x2c\xcd\x13\x9d\xbc\x47\x06\x6e\xd0\x9e\x8f\x88\x88\x3a\x26\xc2\xa1\x25\x23\x77\x0b\x26\x1a\xc9\x3f\xf9\xd2\x5b\xea\x9b\xbd\xed\x22\x1b\xd9\x77\x1f\xe6\x34\xfe\x58\xbd\xef\xae\x7e\xfb\xe0\x89\x67\x71\xbb\x35\x98\x57\xed\xa1\x47\x13\x39\x0e\xf7\xf2\xfd\x7a\xa7\xf7\x41\x3f\xba\xca\x24\x97\x92\xa8\x45\xfb\xcb\x08\x89\x7c\x90\x75\xa5\x47\x90\xce\xe5\x1b\xcd\x4c\x00\x20\x63\x70\x31\xd4\xf5\x24\xbd\xf4\x45\x99\xf9\x3c\x0f\x21\x4f\xbe\x42\x63\xf2\xa7\x7b\xf2\xa5\xc3\xbe\xa9\xc4\xb2\x25\xcf\xc7\x5e\x89\xab\x09\xcc\x02\x64\x1d\x66\xf4\x57\xd7\x55\x05\x1a\xc7\x28\x4a\xa6\xfe\x54\x5c\xb0\xe7\x22\x93\xfc\x32\x49\x65\x21\x3f\x72\x4c\x0a\x59\xa5\xbe\x9c\xbc\x66\x8f\x78\x02\xc4\x03\x2e\x9e\xfb\x85\x4f\x73\xc4\xbd\x3e\x4b\x75\xe5\xdb\xa2\xfb\xf9\xd1\x03\xda\xfc\xb4\x37\x3f\x88\x1f\xb4\x15\x70\x38\x56\xd7\x27\xc6\x10\x93\x0b\x10\x7f\xf8\x71\xe6\x4b\xb7\xb8\x19\x12\x9d\x4a\x14\x58\x69\xfc\xe5\x29\x63\xc5\x0b\x7c\x9f\x88\xc6\xda\xcb\xb1\xcd\xde\x6f\x16\x9b\xcc\x0d\x1a\x01\x48\x0c\x7c\x84\x3a\x14\x8a\x5f\xb7\xef\xbb\xf7\xa9\xe2\xf2\xeb\xf6\x72\xb5\x43\x9a\x73\xc4\xfc\x2b\xbb\xbb\x17\x6c\xce\x1c\x3c\x94\x19\xff\x9b\xae\x72\xab\x34\xc3\xce\x12\x97\x5c\xdc\xf8\x48\xea\xe2\x46\x57\x98\xca\xfd\x46\x96\x5c\x34\xef\x9b\xd3\xef\x16\xbd\xd9\xd4\xbe\x84\x86\xd2\x4c\x13\xeb\xb7\x9e\x40\x1e\xee\x2f\xcc\xaa\x2e\x9c\x2e\x57\xd5\xd1\xf3\x09\x39\x6d\x3e\x96\x3a\x90\xf1\x60\x6d\xea\xfc\x3b\xd1\xc8\xb8\xeb\xe9\x79\xea\x77\x35\x9e\x8f\x01\xa4\x1c\xae\xcc\xc5\xc4\xad\x57\xc5\xf7\x18\x0a\xd6\x67\x7d\x5a\xe4\x9a\x5f\x8d\x38\xca\xe9\x6c\xfd\x33\xe5\x92\x09\xb9\x6e\x72\x78\x8b\x4e\xec\x27\x80\xac\xc3\xc7\x62\x25\xdd\x52\x4a\xee\xe6\x13\xc3\xa0\x03\x34\xfb\x0c\xbe\x5c\xee\x7d\xb3\xff\x91\xe4\x8d\x2b\x24\x5d\xc4\xe7\xa4\xe6\xa8\x09\x4b\xe0\xbb\xac\xf2\x43\xae\x6c\x6c\x79\x0b\x73\x36\x3d\xb2\x19\xf5\x8e\x39\x4f\x26\xe2\x27\x3f\xc7\x17\xca\x14\x48\x5f\x62\x1f\x7f\x59\xff\xf0\x81\x27\x40\x9e\xc1\x7e\x46\x8d\x80\xa2\xc6\x9c\x84\x6f\xdf\x56\x97\x49\x04\xc4\x48\x54\xb4\xe3\x55\xfd\x4c\xe4\x09\xd5\x47\xd5\x4f\x5b\x73\x32\x67\x3f\x04\x48\x24\x5c\x2b\x58\x55\xeb\xd5\xa2\x1c\xfe\x78\x58\x39\xee\x23\xba\xf4\x66\x33\x78\xa6\xe4\x95\xf9\xf0\xed\x26\x8a\x32\x26\x26\xea\x6b\x2e\x9a\xdc\x00\x99\x80\x17\xe9\xc0\x86\x79\x54\x4f\x93\x6c\xa7\x30\xd5\x23\x16\x87\x93\xb9\x1b\x67\x28\x69\x0f\xf9\x13\x1f\x62\xf2\xd0\x0c\x02\x0f\x02\x8c\x0f\x8b\xfe\x2b\xcd\xa2\xd9\xbe\x3b\x88\xb6\x12\x58\x4c\x0b\x8f\xf8\x8e\xb6\x5d\x98\x5c\x6b\x07\xf1\x0d\xd5\x14\xb0\xd9\xd6\x36\x22\x00\x55\xb3\xb0\x08\x17\x1e\xb1\x4a\x83\xde\x81\xc4\x22\x5e\x40\xc1\xc3\xc3\x77\xab\x5d\x49\x87\x57\x2d\x74\x3a\xf7\x50\x43\xd6\x80\xf4\x3c\x41\x1b\xab\xe9\x04\xfb\x80\xca\x13\xa2\xbd\x9a\x44\x9b\x74\x99\x9b\x9b\x32\x19\xef\x1e\xec\xc3\x01\x64\x18\xce\xda\xc9\xb9\x86\x8f\x64\x0f\x33\x9c\x38\xc2\x45\x55\x70\x69\x4a\x72\x89\xe3\xf0\xb1\xce\xf0\x3b\xd2\x1b\xde\x9f\xd7\xad\x7e\x56\x64\xc5\xe1\x00\xd2\xf4\x9f\xb3\x9b\x58\x68\xec\x4c\xa8\x1d\xd5\x60\x24\x53\xbe\x62\xf7\x27\x4e\xbd\x73\x3a\xee\xc1\xf5\x37\xd5\x57\x7e\x8c\x76\x26\x7e\xe7\x5a\x00\x00\xf9\x0c\xff\x7d\x5f\xd9\x9a\xfd\x44\x23\xd2\x55\x8d\x8f\xd2\xeb\x0e\x29\xaa\x3d\x1c\xff\x54\x38\xa0\xa8\x5b\xf9\x21\xf8\xd6\x4f\xe9\x36\x33\xde\x87\x00\xf9\x03\x8b\xb5\xe3\xe6\xe2\x1f\x1c\x85\x37\xaf\xdf\x13\xf0\x99\xb8\x46\xb9\xde\x78\xb1\xa8\x67\x44\xf4\x1d\x7b\xde\xd9\xdb\xe4\xfe\xd6\x47\x48\x4a\x45\xff\xcd\xcb\xff\x63\xec\xba\xe3\xb1\x7a\xdf\xbf\x19\xb2\x65\x96\x8a\x50\x12\xe5\xa9\x94\xd1\xe0\x50\x8a\xca\x2e\xab\x92\x52\x4a\xd9\x94\x64\x3c\xb7\x3d\xb2\xf7\xde\x7b\xef\x1d\xd9\xc9\x0a\x91\x4d\x56\x88\x50\x76\xfc\x5e\xbe\x3a\xa7\xf3\xf9\xe7\x77\xfa\xff\xbc\x9f\x73\x5d\xd7\xb9\xef\xeb\xba\xde\xef\xeb\x7e\xce\x81\xc3\x99\xfe\xf7\x95\x6b\x18\x7e\xc2\x88\xaf\x08\x7f\xc7\xf4\xf4\x0f\xa2\x05\xe1\xd6\xd8\xbe\xee\x22\xfa\x90\x7b\x60\xb9\x0b\x23\x56\x69\x90\xb9\x36\x66\x93\x2d\x45\x4f\x42\xf0\x3f\x1a\xbb\x80\x7e\x6e\x41\x3e\x2a\xca\x7c\xe7\x3f\x53\x18\x96\x53\xaa\x6a\xf1\x9d\x0b\x06\xae\x57\x4e\x66\xbb\xd3\x7f\x33\x7f\x93\x76\x86\xdc\xa9\xed\x16\x1e\x40\xdb\xe8\x82\x38\xa8\x33\xf4\xde\x9a\xf2\xf6\x18\x79\xeb\x3d\x91\x72\x4a\x1f\x6f\x69\xc9\xea\x2e\x23\xfe\xe8\x95\x62\x26\xa2\x27\x0a\xaa\x0b\x32\x3b\x84\x1f\x2d\xbb\x70\xdb\xca\x31\x7a\x59\x99\xee\x51\xd9\xaf\x42\x18\x56\xf4\x36\x83\xd8\x25\x8a\x96\xb3\x91\x57\xb5\x2e\x35\x45\xc7\x75\x6b\xf8\x31\x1e\x40\x13\xe8\xde\x2f\x7b\x22\xfa\xed\xd8\xf0\xbd\x40\xf1\xde\x3b\xb7\x5e\x57\xab\x58\x19\xf7\x1f\x11\xe5\xcc\x51\xab\x28\xda\xa3\x24\x53\x41\xd8\x00\x9f\x36\xc4\x32\x1b\x0e\xd0\x02\xf2\x10\xb0\x0c\x87\x11\xdb\x08\x95\xc5\x32\x1d\x46\x74\x21\x92\x08\x96\xf1\x30\x62\x02\x99\xbe\x60\x53\x9d\x5d\x44\x26\xa2\xa6\x62\xb2\x9d\x3f\x88\x5f\x48\x56\xc2\xe6\x3b\xbb\x08\x5b\xe4\x58\x16\x16\xe5\x81\x11\xf1\xb4\xc8\xf2\xc3\xa2\x3e\x40\xca\x96\x80\x40\x75\x67\xf9\xd5\xa3\xab\xe0\x3e\x1a\xcb\x02\x3d\x43\xd1\x5a\xaf\xf7\x21\x51\x82\xf2\xb3\xf9\x4e\x9f\x6a\x23\xa3\x68\xaa\x89\x1a\xbe\x4c\x41\xd4\xa4\x7e\xcc\x78\x00\x15\xa2\x3b\xec\x83\xef\x45\xf2\x36\x6e\x80\x8a\x23\x4b\x26\xa4\x62\x73\xbf\xca\x99\x25\x82\x04\x98\xa4\xe7\x12\x43\x6e\x9f\x78\xfd\xa8\x7c\xc8\x61\x27\xe5\xa3\x8b\x78\x9e\xc2\x6b\x96\xef\xaa\x7e\x9e\x4f\xdb\xfa\x02\x18\x9c\x9e\x48\x48\x0d\xa6\xae\xf2\x1c\xff\x74\xf4\x38\x61\x2d\x49\x99\x60\x17\x17\x1e\x40\x5b\xe8\xe5\xf7\xc0\xd8\x43\xf9\xfc\xd9\x12\x5b\x93\xeb\x01\x75\x96\xd9\x41\xd9\x32\x2c\xcd\x4c\x7e\x24\x7e\xd3\x13\xc7\x09\xe9\x6c\x02\x75\x58\x71\xff\x66\x36\x1c\xa0\xfa\xbf\x5f\x4d\xc5\x30\x1c\x46\x14\x22\x0f\x01\xcb\x74\xa4\xc4\x21\xc5\x04\xcb\x78\x18\xb1\xc5\x84\x8c\xf2\xb0\x68\x28\x90\xa2\xa0\x23\xe0\xb0\xc7\x03\x09\x1b\x54\x94\x8c\x4e\xaa\xd9\xf4\x28\x54\x7f\x4d\x30\xfe\x30\x66\x73\xb3\x3f\x25\xfb\xf7\xf5\x1a\x97\xcf\x32\x8d\xca\xa7\x92\x6e\x5e\x1a\x57\xde\xd9\xd4\x45\xe8\x24\x23\xc9\x94\x4a\x67\xf9\xa5\x60\xfc\xd7\xeb\x7c\xf6\x18\x33\x1a\x5a\xcd\xbc\xab\x0c\x16\xcb\xa3\xee\x87\x99\x6e\xbe\xdb\xf0\xfb\xea\x82\x07\xd0\x37\x74\xb3\x73\xa6\x8d\xbf\xfd\x5a\xce\x5e\x29\x96\xa9\x07\xaf\x2e\xdd\xd5\x6b\xaf\x70\xee\x70\x95\xd0\xaa\xdf\x56\x3e\x7a\x67\xf6\xfa\x13\x3a\x7e\x3c\x80\xaa\xd0\xdd\xee\x95\xd5\xb8\xd1\xd7\x81\xcf\x3b\xbe\x16\x56\x3c\xfc\x9c\x5c\x5a\xb3\xc9\x3f\x32\xcf\x7b\xf4\x33\x9b\x8b\x1e\xb5\x03\x6f\xe8\x63\x67\xc1\x7f\x33\xfb\x4f\x7c\x24\x6c\xe0\x80\x62\xd9\x0d\x07\xb4\x08\xc9\x32\x58\x96\xc3\x88\x6f\xc8\x79\x1b\x2c\xdb\x61\x44\x15\x72\xec\x01\x4b\x0a\x80\x11\x51\xc8\x1f\x46\xb0\xd4\x00\xd8\xf1\x4b\x30\x00\x5b\x0f\xd8\x05\xbc\x80\x6d\xc2\x56\x04\xfe\xe4\x4a\x64\xf2\x87\x29\x0a\xfc\x41\xcc\x21\x45\x11\x5b\x16\xd8\x45\xe4\x22\xd9\x15\x4b\x19\x80\x11\xe3\x7f\x3f\x23\x8c\xa9\x10\x48\x71\x10\xd0\xe1\x77\xf2\xd8\x10\x7a\x05\x3a\xee\x61\x70\x0b\x0d\x8d\x0f\xbf\x73\x33\x45\xb3\x3f\xec\xb3\xdf\x34\xa4\x41\xf4\x63\xb6\xd3\xe0\x4b\xd9\x75\x9f\xd1\xea\x34\x0e\x3c\x80\xea\xd0\x3b\xc2\x4b\xbb\xe7\xc2\xf5\x63\x75\x93\x81\x2c\xd6\x84\xe7\x5b\x5a\x29\x3f\xba\x51\x18\x77\x50\x05\x13\x7e\xf1\x69\x3b\xcf\x1a\x52\x2f\x00\x00\x54\x8e\xee\xe7\xf5\xcf\xf6\x4d\xcd\x3e\xaa\xa6\xf6\x20\x20\xb6\xbc\xdc\xd4\xc8\x9a\x75\x69\x66\x55\x9e\xde\x95\x3e\xbc\x0a\xdf\x13\xee\x49\x1a\x0c\xa0\x65\x74\x95\x9e\xe9\x9d\xe5\xbc\x39\xec\x70\x5f\x02\xc2\x33\x1c\xd8\x6c\x90\x3e\x79\xc3\x8d\x24\xb1\x99\x3e\xde\x44\x9e\x39\x9f\xf9\xd2\x80\x3c\x1e\x40\xcd\x68\xfa\x3f\x34\xaa\x60\x74\xd6\xda\x29\x69\xa5\xf1\x95\x6b\xba\xb6\xd4\x21\x07\xe5\x58\x9a\x88\xac\x1e\x8f\xa0\x37\xe4\x83\x63\x01\x80\x13\xf7\x6f\x5e\xc2\xf1\x1c\x42\xd6\x2a\xa6\x9f\x7f\x10\x75\xc8\x0e\xc2\xf6\x74\x17\x51\x8e\x4c\xc0\xb0\x9c\x85\x11\xcb\x48\x65\xc7\x72\x17\x46\x34\x23\x22\x35\xb6\x10\xb4\x8b\x68\x45\x3c\xc7\xd2\x82\x60\xc4\xc0\xdf\x2f\x0f\x63\x6a\x42\x92\xb6\xe4\xf2\x3b\x4b\x6f\x12\xad\x0c\x45\x9f\xb4\xcc\xaf\xe0\x1f\x60\xe3\xf9\xa1\x3e\x36\xa2\xa7\xeb\xa9\x8b\xeb\x19\xd1\x1d\xd8\xbf\x26\x13\xe4\x9d\xb6\x1d\x70\x3e\x0f\x0f\xa0\x10\x74\x49\x5c\x7e\x02\xd1\xf2\xcb\x8c\xcb\x0b\x6e\xfe\x88\x9d\x73\x61\x20\x01\x07\x74\x52\xdf\xae\xaa\xb1\xce\x3f\xee\x7a\x1e\x77\xe1\x44\xea\x4e\xd7\x84\x2e\xb9\x31\xb4\xe9\x1c\xb9\x92\x1c\x19\x63\x04\x5c\xd3\xf6\x0a\xbd\xa3\x99\x76\xc9\xbd\x3a\xa1\xc4\x74\x24\xf2\xe5\xc4\x74\x1c\x86\x6d\x78\x00\x8d\xa0\x95\x4a\x8d\x84\x6f\x7b\xb3\x5c\x7c\x5a\x1f\xba\x25\x05\xf4\x08\xf6\x12\x15\xd4\x9c\xe4\x76\xf0\x74\xbb\xf4\x9c\xf6\x4b\x09\x19\x1f\xd3\x47\xdc\xbf\x99\x0d\xc7\x67\x12\x39\x20\x86\x65\x38\x8c\x08\x41\x0a\x22\x96\xe9\x48\x97\x88\x14\x5d\x2c\xe3\x61\xc4\x08\xd2\x8f\x61\x0b\x73\x7f\xba\x2b\xc4\x0f\x2c\x6d\x0e\x46\xa4\x21\x7e\x60\xa9\x73\xc8\x5a\xa2\x5a\x9e\x21\xfc\x37\x95\x0e\x40\x5a\xa4\x3b\x4b\xa9\x0a\x4d\xbe\x87\x92\x4a\x02\xc8\x6e\x7b\x7e\xcb\x26\xb0\xbc\xfc\x8c\xe5\x50\x9e\x05\x51\xdb\xc3\x23\xdf\xfc\x96\x8a\x8b\xbe\x3e\x38\xed\xa3\x78\x14\x0f\xa0\x08\x74\x9a\x39\xf0\xa5\xf3\xf1\xa7\x18\x7b\xad\x97\x69\x61\x49\x45\xb7\x13\x28\xdc\x23\x5a\xf9\xa9\x0f\x17\x2d\x9a\x69\x27\xfc\x7e\xfc\xa0\x9d\x04\x0f\xa0\xea\xff\xbc\x2e\x85\xfb\x07\x4d\x3a\xc7\xa0\xfb\x2b\x9e\x13\x86\x9e\x83\x3e\x77\x02\x03\x5f\xa4\xc7\x57\x12\xf3\x79\x8d\x25\x8c\x24\x55\xf9\x1b\xed\x24\x6f\xf4\xef\xf7\x7a\x1f\xe2\xe9\x88\x69\xa9\x0a\x7e\xd9\xf8\x5c\x28\x7b\xb8\x5d\x38\xf7\x67\xe1\x3d\x73\x07\x13\x2f\xef\x5b\x55\x63\x36\x61\xbe\xb8\x7f\x33\x1b\x29\xa1\x08\xb5\xc7\x32\x1c\x46\x44\x20\x29\x03\xcb\x74\x18\x51\x8d\x1c\xb8\xc1\x32\x1e\x29\x57\xc8\x3d\xb0\x95\xd2\x5d\x84\x3d\x52\x12\xb1\xc5\xd2\x3f\x4b\x09\x49\x4b\x98\x7a\x29\x5c\xa8\x91\xf4\x8a\xad\x98\xee\x22\xec\x10\x3f\xb0\x44\x53\x44\xd4\xf8\xfb\xa7\x2b\x2c\xf1\x14\x48\x09\x12\x88\xef\xf4\xa1\x90\x27\xba\x51\x2c\xeb\xa7\x9d\x53\xad\x7c\x67\xe3\x98\xa1\xc7\xf8\xcc\xc3\x3e\x7a\xb2\xe8\x94\x8d\x5d\x0e\x7f\xd1\xe5\x88\x27\xa9\x17\x25\xf9\x76\x6e\x32\x85\x5e\x80\x7e\x94\x41\xec\xf3\x94\x04\x4c\x39\x8f\x4d\xb8\x87\xa7\x0a\xf1\x22\x5a\xd4\x99\xd3\x49\x0e\x9e\x64\xde\xfc\x1d\x74\xa6\xa1\xfd\x78\x00\xa5\xa3\x37\x04\xaf\xb8\xfe\x61\xda\xef\x3c\x23\x4b\xdf\xeb\xbf\x2b\x88\x6a\x9f\xa3\xe5\xe8\xad\x49\x20\xbe\xdc\x9b\x03\xa2\xf6\x32\x8e\x8d\xe7\xe2\x01\xe4\x8b\xfe\xfd\x07\x25\x43\xab\x63\x42\x1e\xaa\x42\x26\xcb\x13\xac\xac\xcf\xf6\xa4\x3e\xec\x0d\x35\xf1\xeb\xbf\x65\x5a\xe6\x78\x9e\xb7\x9b\xde\x1e\xf7\x6f\x66\xc3\x01\xf2\x44\xba\x44\x2c\xc3\x61\xc4\x14\xb2\xfc\xb0\x4c\x47\xa4\x10\x64\x53\x60\x19\x0f\x23\x7c\x69\x90\x2f\x78\x63\x6a\xd8\xbb\x6d\xa2\x01\xf2\x67\x08\x4c\x15\x7b\xf7\x16\x41\x08\x79\xc5\x12\xb2\x61\x44\xca\xdf\x57\x0b\x63\x09\xda\x40\x8a\x8e\x84\xc0\x6b\x67\x2d\xc5\xa0\x7b\x20\xca\x54\xc3\x00\x81\x23\xbc\xa6\xe5\x34\xaa\xa5\xde\xd2\xe7\x16\x8b\xe8\x6e\xf3\x75\xbb\x5f\x5a\x2f\x38\x23\x25\xdf\xfa\xb2\x71\xa7\x67\x5a\x43\x3f\x6b\x05\xa2\x6e\x8d\xe8\xa3\xc7\x15\xb5\x12\xeb\x48\x54\x69\xdf\xc4\x35\x2c\xf4\x6e\xd1\x0a\x9e\xda\x8a\xef\x3d\x59\x44\x58\x18\xa1\x80\x07\xd0\x57\xf4\xc8\x3d\x4a\x7f\xc2\xad\xcd\x98\x2d\xe0\x5c\xa4\x66\x88\x90\x36\x9b\xd6\xc4\xe9\x93\x0a\x59\xc2\x83\x65\x14\x11\x34\x15\x64\x6a\x71\x87\xf0\x00\xaa\x45\xd7\x75\x7d\xe6\x6e\x16\x1e\xee\x1f\x07\x4c\xa9\x93\xa2\xcb\x59\x52\x57\x9e\x28\xac\x07\xb3\x1a\x32\xc5\xbd\x49\x7b\x44\xc8\xb9\x57\xeb\x3b\xee\xdf\xcc\x86\x03\x14\x83\xf4\x32\x58\x86\xc3\x88\x35\x64\x2d\x61\x99\x8e\x88\x64\xc8\x59\x29\x2c\xe3\x61\x44\xed\x5f\x05\x01\x73\xb8\x20\x45\x6e\xbb\xfb\x1e\xbe\x71\x74\x27\x9d\xf0\xf0\x74\x87\x19\xd3\x0f\xae\xac\xab\xd6\x3f\xa5\x28\x0e\x8c\x76\x2a\x05\x6d\xaa\xce\x27\x12\xe5\x73\x1d\x59\xcd\x16\xbd\x7a\x05\x0f\xa0\x25\xb4\xf0\xe8\x3d\x56\xe6\x5f\x2b\x66\xfa\x2d\xf0\xf1\xa3\x01\x7d\xb7\x9a\x85\xb0\x36\x7e\xdd\xf5\x18\xc9\x2a\x8a\xbb\x3e\xfb\xf7\x0d\xf9\xd6\xe3\x01\x94\x88\x56\x04\x5e\x8e\x14\xab\x74\x71\x4b\xcb\xbf\x58\xbf\xf4\x69\x60\xe6\x79\x01\x1b\x3e\xf6\x9a\x47\x96\xe3\x37\xa9\xb4\xd5\x81\x66\xe9\x8f\x55\x78\x00\xad\xa0\xaf\xf7\x70\x39\xcd\x79\x88\x5c\x83\xbc\x64\xd5\x32\x45\x70\xaf\x3c\xd7\x3d\x3e\x01\x01\x93\x83\x03\x31\x01\xef\x78\xcf\xbf\x94\xcc\x7a\x8e\xfb\x37\xb3\x11\x6a\x82\x34\xc6\x58\x86\xc3\x88\x25\xa4\x3a\x60\x99\x0e\x23\x12\x11\xc2\x84\x65\x3c\x8c\x58\xf9\xfb\x49\x70\xcc\x11\xcf\x9f\x36\x0e\x51\x5c\xb1\xa6\x3c\x30\xe2\x37\xe2\x39\xf6\x9c\xe7\x4f\x8b\x85\xa4\x32\xec\x51\xcf\x2e\xc2\x0d\x41\x60\x4d\x7b\x90\x8e\x00\x69\xca\xb0\xe6\x3d\xc8\x78\x00\xf9\x60\x3e\xf6\xc8\x67\x37\x5d\x22\xa2\x11\xf6\xd0\x67\xf7\x16\xef\x91\x3a\x81\x35\xf7\x41\x82\x4b\x82\x74\x8a\x58\xf3\x1f\x00\x91\xf8\xfd\xef\x1f\xaa\xe8\x64\x16\xd0\xcd\xec\xd7\xad\x7f\xdc\xf0\xa1\x19\xb3\x17\xdb\xb7\xf0\x37\x0d\x27\xdb\xf6\x8a\xba\x70\x2c\xaa\xa4\x5e\xeb\x14\xbf\x76\xb8\x78\xe7\x7a\x74\xb2\x74\x55\x25\x16\x16\xbe\xdf\x23\x30\x9e\xdb\x70\xfe\x30\xfb\xe3\x6b\x02\xa9\xa5\xda\x37\x0e\x8f\x6e\x68\x3a\xdf\xe8\xd9\xaf\xdb\xc1\x82\x07\x90\x33\x3a\xf9\xd1\x3f\x68\x2f\xb9\x60\xac\xe0\x29\xd3\xac\xa7\x3b\xa2\xb7\xa2\xfb\x35\xad\x64\x92\x94\x3a\x12\xdc\x3c\x76\x67\x5a\x83\xe2\x7f\x1f\x5c\x1f\x42\xff\xfe\x7d\x4f\xfc\xc7\x5f\xb4\x5d\xcb\x32\x47\x1e\xa7\xc8\x70\x3e\x57\xd4\x10\xb7\x2f\xb5\x1e\x78\x48\x4e\xdf\x36\x56\xf5\x91\x8b\xf6\x01\xee\xdf\xcc\x86\xc3\xd3\x84\x24\x32\x2c\xc3\x11\x04\x92\x2c\xb1\x4c\x87\x11\xce\x08\x21\xc0\x32\x1e\xa1\xd5\xc8\x3d\xb0\x67\x70\xbb\x08\x7f\x64\xd7\x61\x8f\xe1\x76\x11\xc1\x88\x40\x83\x35\x89\x83\x11\x33\x7b\x97\xdd\xff\x1c\x9a\x22\x1e\x8f\x24\x7c\x93\xc1\x7e\xf0\x17\x34\xc2\x77\x6c\xa0\xec\x08\x41\x4d\x29\xa5\xdc\xcd\x52\xae\xce\xdb\xfa\x7c\xf2\xec\x16\x6e\x40\x6a\x68\x7b\x7b\x3b\xe8\x30\xfa\xa0\xca\xfa\x3d\x92\xcf\x87\xde\x28\x3c\x77\x66\xca\xbb\xd7\xc8\xbc\x49\x7e\xca\x60\xdb\xfb\x4b\xf2\xc7\x95\x33\x62\x64\x9f\xac\x8c\xd0\xc7\x88\x84\x5b\x72\x70\xfa\x1e\x72\xf6\xe7\x74\x5a\xca\x0e\xf8\x95\xd0\x91\x5c\xe0\x15\x93\xf3\x79\x2b\x79\xba\x8e\xcf\x7a\xc6\x9c\xe0\xa9\x1d\x90\x60\x43\x5d\x9e\xe5\xd6\xa9\xfd\xeb\xa8\x19\xe9\x84\xcc\xbb\xe4\xf8\x83\x69\xe2\xe5\x8d\xc4\x9f\x94\x5c\x95\xbe\xa6\x13\xde\x54\x52\x3d\x2c\x27\x0e\x20\x1f\x34\x6d\x3d\x76\x9c\x3b\x67\x9f\xaf\x7f\xcb\xf4\x48\xae\xad\xac\x33\x6f\x07\x87\x65\x55\xd0\x89\x76\x1d\xd0\xcb\x28\xac\x68\xee\x70\x7d\x2f\x80\x66\xd0\xac\x78\xa3\xfa\x97\xca\x95\xf6\x2f\x77\xd3\x4f\xe5\xe7\xc8\x5d\x24\x98\xda\xf0\x54\x4d\x2c\xef\x58\x20\x94\xcf\x5d\x5e\x33\xc1\xf5\xa1\x5f\x57\xf6\x5d\x45\x9b\x43\xac\xe1\xda\x6d\xca\xd8\xe7\x13\xb7\x9b\xe2\x64\x8c\x3f\x52\x1a\xba\xbf\xe9\x7c\x1d\xff\x66\xdf\x46\x65\x24\xaf\x28\x00\x50\x23\xba\xa2\xe1\x25\x57\x3a\xef\xee\x4d\x33\x1a\x4a\x9a\xef\x3d\x40\x6f\xfa\xd3\x77\x9c\x27\x41\xc7\x42\xa9\xad\xf3\x9c\xaf\x87\x6c\x00\x6f\x15\x80\x06\xd1\x3d\xb0\xb0\xb0\xa0\xac\xd4\x8d\x53\x1d\x11\x41\x4f\xf8\x6c\xba\xe7\xbf\x68\x1c\x81\x12\x7e\x27\xaa\x31\xb6\x1a\x8f\x4b\xb5\xf4\xd2\x3f\x47\x5d\x1a\xdc\xc4\xbc\x9f\x59\x06\x57\xd2\x9d\xe4\xee\xa4\xf0\x48\xd3\x9e\x67\x5b\x8f\x4e\x4a\x27\x66\x61\xae\xca\x4c\x69\x58\xb4\xfb\xc1\x4e\x3b\x88\xb6\x84\x2a\x7a\x3c\xd3\x2f\x8f\x9b\x46\x92\xda\x86\x95\x30\xbb\xe1\xa2\xd8\xb9\x1c\xef\xf5\x16\x6a\x41\x0d\xc0\xf5\xba\xe0\x81\x6a\xd8\x0e\x7b\x41\x9b\xa2\x79\xa7\xbe\xf5\x74\x26\x1f\xcf\x7a\xe9\x92\xd3\xaa\x18\xb1\x84\x9c\x64\x7b\xca\x12\x99\xee\x73\x12\x47\xca\xae\xe2\x83\xd4\xe8\x77\x9b\x25\xb1\x54\x3e\xdd\x3e\x29\xb4\x58\x7e\xaf\x56\xb1\xe1\x52\x6c\x27\x55\xc3\x33\x35\x02\x3e\xd5\x4f\xd7\x98\x29\xef\xbe\x2c\x3e\xa5\x8f\xba\xf4\xc7\x23\xc7\xf0\x3b\x0a\xef\x2f\xd8\x94\xee\x51\x97\x2e\xc4\xbd\x9d\xd1\xd5\x69\xa0\xe1\x8d\x5a\x2d\xbb\x40\xf6\xce\xb3\xc3\xbc\x0d\x75\xa9\x58\xdb\xa9\x14\xa7\xe9\xe8\xa4\x48\xbf\x4c\x59\x46\x57\x0f\x13\x25\xe9\xf7\xaa\x16\x14\xe9\xea\xd5\xe7\xc9\x6e\xbc\xf1\xd8\xa7\x02\x00\xe4\x81\xee\xf9\x64\x24\xf4\x62\x39\x32\x28\xf7\x5b\xc6\x91\xd9\x4e\xc8\x0f\xf4\x28\x6c\x1c\x56\xf8\x6e\x47\x31\xc6\xe9\x9e\xfa\x8e\x54\xd0\xd8\x06\x40\x31\xe8\xda\x1e\x5b\xbf\x8f\x41\xa5\xf1\x47\x88\x46\x86\xb6\x56\x5e\x50\x1c\xbf\xd2\xf8\x92\xfa\x88\xda\x1b\xd7\x76\x3b\x56\x63\x4b\xd3\x53\xfa\x76\x40\x42\x12\x75\xf9\x97\x02\xd2\x97\x05\x2d\xbe\x8a\xd4\x4a\x46\x2b\x93\x1b\x75\x4f\x3b\x94\x5a\xb5\x39\xbd\x1a\x88\x9b\x7f\x84\xdc\xe0\x7a\x96\x94\x0c\x20\x3c\xfa\xd7\x83\xbb\x64\xaf\x9d\x18\x6a\x6b\x3d\xf7\x92\x56\x2d\xad\x2e\xf4\x89\xda\x27\xfa\x12\x41\xd5\x58\xe9\xb0\xe2\x7a\x17\xff\x2e\x49\x1c\x80\x06\xd1\x0b\x96\xab\x42\x77\xb8\xdc\xe9\xe1\x6b\x92\xe6\xed\xfc\x97\x3a\x0c\x4f\xaf\xca\x76\xa4\x93\x69\xd7\x6e\x65\x1d\x4a\x29\xd8\xf7\xa3\xe1\xb4\x1d\x80\x9c\xd0\x13\xe0\x9e\x8e\xae\x8e\xde\x12\x57\x8b\xf7\x4f\x4c\xe6\x1d\xfb\x4b\x98\xd6\x17\x4a\xef\xde\x02\x8e\x4d\x55\xba\x2f\x6f\x96\x8a\xb6\x64\x01\xa8\x0e\x3d\xb7\xbf\xac\xad\xcf\xbc\x1d\x7e\xdb\x91\x6b\x88\xe1\x2b\xfe\x7b\xed\xe7\x9e\xea\xac\xfb\xea\x4f\x92\x35\x9c\xd3\xa5\x55\xb3\xcf\xca\x0c\x02\x68\x00\xdd\x56\x71\x50\x38\x6e\x1c\xe9\x75\xb2\xb8\x71\xb6\xa0\xae\xe3\x61\x9a\x21\x6f\x01\x7f\x98\xda\x84\x24\xdf\x92\xb8\xda\x9a\x8d\xa2\x4e\x16\x3a\xb7\x6b\x72\x84\xbe\xb6\xb5\xf8\x7a\xe1\x03\xb7\x7a\xa7\xd0\x63\xf1\x3c\x6a\xe2\xe6\x8a\x2d\xf5\xad\x84\xb0\x95\xfc\x8b\x86\x0e\x17\xec\x00\x14\x84\xd6\x56\x87\x55\x66\x6e\x27\x79\xc6\xde\x3a\xfe\xf8\xc1\x42\x15\x27\x2e\xb5\x4e\xb7\xb7\x49\x04\x7f\x5c\x98\x64\x8b\x6a\xf3\x43\x1f\xc9\x35\x00\xe5\xa0\x27\x8e\xf7\x45\x5e\x3d\xa4\xdc\xfa\x70\xbd\x47\xcb\x59\xdb\x86\x47\x87\x8f\xe7\x4e\x89\xbb\x45\x58\xc2\xa9\x9f\x85\x1f\x32\xa8\x46\xbc\x04\x01\xf4\x05\x1d\xf5\x0b\xb9\x59\x4f\xb3\x78\xea\xb9\xbf\xd6\xf0\x6a\xe7\xbc\xde\xea\xa8\xa9\x97\x27\x89\x4a\x68\xe0\xcc\x12\xf6\x19\x3f\x24\x34\x35\x08\x00\x94\x89\x5e\x32\x0e\x27\x7a\xbc\xd7\x22\x96\xfb\x3b\x17\x8f\xe5\x55\xa7\xbe\xce\x68\xba\x7a\x6e\x80\xb2\xd4\x9f\xc9\x13\x7f\x36\xfb\xb3\x32\xd7\x1a\x80\x6a\xd1\x3f\x9f\x62\xf4\x55\xe2\x0c\x7e\x90\x58\xbe\xca\x92\xff\x33\x99\x16\xc5\x12\xa1\xf9\xcc\x96\x75\x63\xd3\xfa\xef\xe0\xcb\x6a\x52\x07\xd5\xed\x00\x14\x85\xfe\x79\xf9\x73\xda\x0b\x37\x4a\x53\x62\x4a\x79\x2a\xe7\x8d\x7c\x6e\xbe\x10\xe3\x21\xd6\x0c\xef\x88\x3a\x12\xfe\x48\x54\x4c\xb9\x72\x2c\x0b\x40\x2d\xe8\xba\x27\xdd\x1b\xf1\xa6\x8d\xa6\xb8\xf0\x04\xd7\x44\xe2\x19\xba\xe2\xcc\x28\x92\xa5\xd2\x5a\x51\xb3\x8c\xed\x8f\xf5\xb1\xc1\x24\xa7\xae\x01\x68\x0b\x3d\x6e\x7b\xb6\xb7\x93\xb9\x5e\x3c\xf8\x94\xaf\x86\x47\xee\x67\x0b\xbc\x9c\x7f\xd6\x0a\xa9\x0e\xd3\x39\xae\x58\xf0\xc1\x64\xaf\x73\x78\xa4\x1d\x80\x5c\xd0\x6b\xc6\xc2\xe6\xee\xa0\x4b\xd7\x22\x5f\xd4\x91\xa3\x9c\x89\xc7\xc9\xa8\x5e\x8f\x5c\xc9\x74\x0c\x10\x70\x28\x7c\xd8\x31\xe5\xdb\xd5\xb2\x07\x40\x25\x68\x6b\x0a\x95\x1f\x28\xad\x5c\xaf\x39\x78\x28\xde\xd3\x52\xa5\x5c\x83\xff\xbb\x9d\x3f\x55\xcb\x4f\x26\xee\x4b\xda\xee\xce\x19\x1d\xae\x6f\x01\x54\x86\x6e\x22\x9e\xd9\xaa\xa5\x17\x2e\x3f\x0d\x37\x1c\x2c\x4e\xe3\xe3\x56\x38\xc5\x47\x67\x38\xc6\x6d\xad\x93\x46\x71\x4f\xad\xe4\xa2\xfa\xb4\x1e\xfa\x29\x69\xad\x39\xe4\x11\x0d\x5f\x19\x4a\xef\x73\xa7\x54\x4f\x7d\x42\xef\x66\x58\xd4\x48\xa1\x48\x30\x46\x73\xe3\x78\x8a\x7f\xe1\x53\x3b\x00\x01\xf4\x71\xa9\x5f\xd9\xe6\xe3\xd3\xf1\xa1\xdc\xb7\xee\x6d\x1c\x39\x1b\xeb\x7e\x26\x49\xc3\xc6\x4c\x4d\xfa\x66\xf2\x24\xbb\xc6\x05\x25\x7a\x0b\x6a\x00\x45\xa3\x17\xfb\x5e\xe6\xd8\xc2\xe9\x3e\xb3\x23\x76\x13\xfa\xa3\x1a\x47\xef\x75\x5c\xcc\x1a\x96\xaf\xfb\x7a\xf0\x61\xf6\x01\x3b\xeb\xc3\xb4\xd4\x45\x00\x9a\x41\x6f\xbd\xbb\x7c\x03\x01\x0f\xe7\x70\x23\xed\xc7\x3a\xe9\xa9\x19\xeb\xd3\xa1\xaa\xcf\xe3\xdf\xcf\xd9\x93\x3a\x59\x55\xb7\xd8\x5b\xac\x5e\x46\x5d\x4a\x11\x65\x23\x24\x2f\x33\xe0\x13\xd3\x55\x3d\x98\xe2\x79\xd4\xa9\x92\x78\x8d\x33\x5e\x2b\x7a\x23\xf7\xd7\xd9\x12\x50\x2a\x11\x87\xba\x34\xb3\x81\x44\x6d\xf6\x70\x96\xe4\x4c\xe2\xf6\xeb\x9c\xcd\x05\xae\x0f\x3f\x35\x36\xf0\xf5\x14\x04\xbe\xb5\x29\xcc\xf9\xf5\x8a\x0e\x78\x00\xa5\xa1\xb3\xb3\x4e\xc0\x26\x9f\xfa\xb0\xeb\x82\xb6\x2e\xd5\x53\x5a\x5e\x71\xb1\xb5\xfb\x07\xd9\x71\x4d\x1d\x7b\x23\x88\x22\x4c\x4d\x32\x68\x7c\xd1\x5c\xf5\xc0\x1a\xc7\xc9\xf8\xf4\x15\x22\x47\x3a\xeb\xed\x9b\x1d\x91\x7b\xca\x57\xd9\x16\xca\x49\x9b\xda\xf6\xb8\x33\x26\xda\x51\x6d\xdb\x01\xc8\x16\xfd\xd3\x84\x73\xb1\xf6\xf3\xb7\xb3\x8b\x2d\xcb\x2f\x40\x47\xc9\x8c\x1f\x66\x1e\x31\x98\xcc\x8e\x48\x71\xd0\x1f\xbc\x79\x39\xe5\xe7\xa9\xb3\x00\x72\x43\x6f\x7e\x9d\x0e\x19\x9d\xea\x84\xfb\xe4\xbf\x62\xe9\x5e\x9f\xf5\xce\xfa\x9c\x57\xd4\x79\x9d\xe8\x83\xe7\xc6\xcb\x19\x05\xdd\xdb\xbc\x79\x9d\x00\xda\x46\x97\x09\x96\xa3\x63\xb7\x6b\xa1\xe0\x81\x30\xdd\xaf\x12\xd7\x3f\x8e\x68\x90\x92\xce\x16\x7f\x94\xef\x16\x9d\xd4\xd3\x65\x9d\xa3\x4d\xbd\x66\x07\x20\x3f\xf4\x1f\x43\x0c\xd8\x89\x7f\x2f\xba\xcb\x5a\x9b\xf6\x7d\x49\x65\x2c\xb9\xe6\x7e\x66\x36\x90\xad\x50\xea\x0d\x81\xee\xb2\x8d\x8c\x6f\x88\xfd\x3a\x80\xe2\xd1\xcb\xca\xe6\xba\xba\xdc\xa1\x2c\xba\xba\x64\x83\xb2\x0f\x69\xaa\x73\xb3\xf7\x69\xd7\xda\x89\x49\xe4\xc6\xb3\x9e\x3c\x1b\xc4\x5d\x98\x9d\x02\xd0\x17\xb4\xc8\xc8\x39\xff\xe0\xac\xcc\xdb\x03\x0c\x79\xef\xd2\x52\x1e\x70\xb1\x0a\xe8\x30\x44\x7c\x67\x17\x7d\xba\xf0\x34\x58\xf8\x40\xc1\xe5\x93\xe8\xef\x29\x3b\xbf\xf6\x92\xbf\xab\xd6\x63\xdd\xd3\xd7\x4e\xae\xbf\xee\x63\x48\x3d\x66\xaf\x57\xc3\xfd\xab\x45\xf9\x63\x65\xe5\x0c\x87\x02\x3a\xc9\x39\xaa\xf2\x15\xd0\x71\xfb\xe5\x25\xdc\xbb\x77\xf3\xec\xca\xeb\x96\x96\x03\xe4\x2f\x68\x75\x05\x7e\x18\x5a\xd3\x5a\xcd\xb1\x98\x5f\xde\x21\x06\xff\x79\xbd\x0f\x01\x27\x7f\xba\xa0\xe7\xfa\xcb\xd8\xd8\xea\x8d\x69\xe7\xd6\x87\x4f\xb7\x2c\x62\xa6\x65\x58\x0a\xf5\x06\xdb\x6a\x97\x22\x5b\xd1\x55\xf6\xe3\x73\xca\x4c\x0a\xfc\xdd\xd3\xd7\x88\xe7\x17\x9c\xf5\x52\x4e\x28\x67\x11\x24\x4f\x8e\x16\x9f\x53\xa8\xbb\x95\xf2\xdb\xa3\x0b\xfe\xdb\x1b\x56\x6b\x05\xa4\xc4\xc9\xe9\x18\x77\x96\x55\x22\x3a\x1e\x42\x84\xb9\x53\xe7\x0d\x62\x87\xd8\xb9\x57\x8d\x25\xc6\x1f\x5f\x5c\x24\xed\xf8\xd0\xa6\x74\x88\xac\x72\xac\x64\xa3\xd6\x2a\x64\xa7\xb5\x7f\x8b\xde\x6a\x78\x43\x8d\xd3\x69\x26\xd2\xad\x2c\xf4\x5d\xed\xb4\xce\x82\x6d\xaf\x78\x8c\x3c\xeb\xd9\xb6\x4a\x49\xde\x79\x2b\x31\x99\xcf\x7f\x04\x00\xfa\x8c\xce\x88\x14\xf1\x81\x51\x97\x23\xe4\xcd\xe7\x79\x2f\x36\x9f\x35\x23\xb8\x25\xbc\x2f\x94\x37\x7f\x7c\x35\x68\x63\x36\xec\x2b\x57\x7e\xfd\x53\x00\x6d\xa1\xd7\x96\xb9\x90\xb7\x44\xcd\xc1\xaf\x45\xd1\x61\xe5\x61\x52\x64\x6f\x92\x2f\x5b\xc4\xeb\x6d\xb9\xb8\x4a\x1e\xad\xe1\x97\x66\x2c\xc8\xa0\xdc\xe1\x7d\xe8\xc5\x12\x4c\x5b\x74\xff\xe9\x3e\x7b\xb9\x21\x75\x46\x4f\x2f\x9b\xf7\x47\x2c\x0d\x6b\x6d\xe8\x3b\x2d\xd3\x45\x7f\xdf\xce\x7c\xfe\x31\xa2\x06\x0f\xa0\x4a\xf4\x64\x6d\x6f\x87\xfd\x85\xf8\x9f\x7e\x67\x1e\xf1\x29\xae\x52\xab\xee\x8f\x3b\x70\xb4\xe2\xc2\x7d\x5b\x19\xff\x10\xa3\xfd\xef\x4c\x7b\xbd\x78\x71\xff\x16\x15\x00\x71\xec\x72\x69\x44\x05\xc5\x8c\xcb\x1f\xc4\x5b\x44\xeb\xc2\x8e\xcc\x2e\xe2\x33\xc2\xbe\xb1\x82\x03\x23\xb6\x10\x4d\x00\x2b\x3c\x30\xc2\x16\xf9\x2f\x11\x56\x80\x60\x44\x25\x09\xf2\x07\x33\xac\x4e\x1d\x48\x8a\x3b\xb3\x3b\xe2\x01\xf4\x0e\xfd\xa4\xf5\x2e\x2e\x93\x77\xc7\x69\xc9\xfd\x7e\xb1\x15\x3c\x9c\x92\xfb\x46\xb9\x19\xba\xd1\x38\x3d\xa6\x43\xbc\xea\x63\x3a\xa0\xfd\xf8\x1b\x1e\x40\xee\xe8\x41\xd6\xfb\xe1\xe9\xb0\x4d\x8a\xf1\x6f\xc7\x0f\xaf\x7f\x62\x78\xf9\xc3\x33\xa1\xaf\x3b\xd2\xdb\x44\xa7\xb5\xf9\x5d\x64\xe6\x8d\x51\xdd\x24\x3c\x90\xe0\x43\x77\x63\x99\x69\xbf\xf5\x7a\xa1\xc0\xa3\x9b\xcf\x64\x1a\x53\x9d\x4a\x5f\x25\x13\xad\xb3\xa6\xbf\x0b\xc5\x11\x50\x85\x90\x6b\x9d\xcf\xc5\x03\xa8\x05\xbd\x4e\xa9\xae\xb8\xf4\xa7\x8d\x0f\xb1\x5c\x72\x11\x38\xb1\x8f\xe0\xfa\x70\x94\x57\x91\x7d\xed\x2a\xbb\x49\xd3\xaf\xe3\x49\xe1\x42\xbd\xe7\x76\x48\x1f\xba\x28\x18\x66\x3f\xf6\xe1\xe6\x11\x6f\x8f\x28\xda\xff\x66\xc0\xb7\x4a\x6e\x9f\xdf\xe5\x26\x81\xf8\xf2\x73\x77\x03\x57\x1e\x25\xd3\x1c\x9e\xc1\x03\xc8\x13\xbd\xe3\x15\xaa\x1a\xb9\x84\xb8\x3c\xd3\x03\xf4\xb2\x29\x48\x14\xf6\xf4\x6e\x98\x90\x76\x24\x6a\x1b\x8c\x25\x4f\xe5\xec\x13\xfe\x52\xb2\x86\xfb\xb7\xa8\xc0\xe1\x7f\x87\x3c\x62\xac\xb8\xc0\x08\x77\x6a\x58\x98\xc0\x0a\xcd\x1f\x84\x04\x1f\x32\xdc\xc4\x88\x0d\x7c\x8b\x16\x64\xa5\x62\x45\x07\x46\x34\x21\x83\x35\xac\xf8\xc0\x08\x4f\xe4\x7f\x41\xd8\x8c\x6f\xd7\x0d\x36\x44\x5c\xc6\xe4\x7c\xbb\xb7\xf0\x41\x8c\xc2\xa2\x7d\x30\x62\xe6\xef\x54\x17\x93\xfe\x49\x71\x13\xd0\x11\xd8\xe1\x01\x34\x81\x6e\xd5\x52\xc7\xba\xf5\x05\x45\x13\x38\x1d\x6c\xbf\x94\x25\xa9\x78\x52\x37\x3d\x3c\x2a\x72\x57\xa1\xc2\xf2\x90\xa7\x91\x8f\xc2\xb8\x62\xfc\x0e\xf7\x42\xef\x86\xf2\x0a\xe1\x7d\xc6\xfe\x38\x2e\x32\xab\x88\x1b\x0e\xb1\x2c\x3e\x36\xcb\x2f\x46\xa4\x5d\x3b\x0c\x48\xe8\xb8\xb9\x49\xf8\x7f\x4b\x01\x00\x35\xa1\x7f\xff\x05\x77\xd4\x10\xf5\x65\xa1\x4d\x11\xd2\x04\x79\x8a\x4b\x67\x1e\xf7\x5b\x86\x27\xc5\x69\x08\x48\xca\x5a\x88\x9a\xd9\x64\x3c\x9b\x04\xd0\x26\xba\x66\x37\x87\xa4\xfc\x4a\xb1\x1d\xcd\x19\x54\x39\xe1\xdf\x6a\xce\x7a\x73\x5a\xf8\x5a\x15\x33\x91\x92\xe5\x4d\x9f\x87\x82\x1b\x36\x51\x3d\xb8\x7f\xb3\x1a\x8e\xcf\xc4\x5f\x8d\x0b\xcb\xee\x3f\x88\x5c\x44\x78\xc3\xb6\xfc\xcf\x52\x42\xee\x81\x65\x3c\x8c\xd8\x44\x74\x34\x6c\x0e\xbe\x8b\x68\x44\x44\x4a\x2c\x1a\x0e\x23\x06\xe9\x90\xb3\x26\x58\x74\x1c\x48\xd1\x91\x5c\xfb\x9f\xe2\xdd\x80\xce\x93\x3f\xf3\xdf\xe5\x3e\xa5\xb2\xda\x77\x8e\x22\xf3\x51\xf5\xb4\x74\xc3\x89\xe1\x95\xee\xed\xfa\x71\xc2\x9a\xc7\x73\x36\x5a\xa5\xd5\x0b\x3b\x5b\x1b\xad\xa5\x5d\x18\x4a\x0b\x8f\x3a\x36\x7f\x86\xac\x91\xbd\xbb\x85\xf3\x1d\xf1\x82\x37\xc7\x26\x75\x8b\xe9\x43\x15\xf5\x29\x75\x9a\x92\x93\x35\x00\x40\xcb\xe8\xdf\x8f\x0f\x0f\x80\xee\x51\xc4\x28\xe8\xd8\xc6\x2d\xde\x27\xc9\x71\xe1\x34\xfb\xca\x9d\xf5\x7e\x55\x7b\xe4\xd0\xa6\xb2\xe3\x33\x9b\x20\x00\x6d\xa2\xf9\x56\x69\xbc\xf0\xcf\xf7\x7c\x7a\x9f\x9d\xab\x9d\x46\x13\x7f\xab\x0f\x6a\x37\x31\x0a\x0c\xbb\x0c\x4e\x67\xdc\xa2\x68\xec\xfe\x22\xd3\x86\x07\x50\x08\xba\xbf\x08\x64\x17\xd9\x8e\x2d\x93\x09\xf3\x75\x98\xa1\x23\xca\xe8\x7d\x17\xd2\x7f\x98\xa6\x6e\xf4\x5d\xd9\xe3\x20\xea\xfb\xd7\x49\x2d\x01\xee\xdf\xbc\x84\xe3\xd9\x80\xe4\x3d\x4c\x3f\xe1\xbc\x87\x08\x6f\xd8\x9e\xee\x22\x96\x91\x7b\x60\x39\x8b\xac\x24\xe4\x4c\x28\x96\xbb\x30\x22\x04\x69\x1c\xb0\x54\x17\x18\x91\x8e\xac\x3d\x2c\xdd\x05\xd9\x43\x74\xcb\x9b\x44\xff\xa6\xbf\x00\xa9\x6b\xdc\x82\x04\x3b\x35\xba\x08\x5d\xb4\x94\xee\x1d\x22\xf6\x27\x3a\x81\x0b\x36\xbc\xe1\x28\xb4\x57\xab\xbb\x87\x70\x96\x44\x26\x3f\xea\x57\x7a\xec\xa3\x7c\x0d\x9f\xb0\xd9\x9d\x64\x89\xce\x32\x05\x07\x15\xb4\x0e\x51\xd5\xa9\xfc\x7e\x5d\x3e\x67\x28\xcc\x61\x23\x58\xfe\xc9\xf1\x6e\x38\xc1\x74\xa8\xd5\xcf\x55\x02\x09\x3e\x0d\x00\xa0\x34\x74\x37\x16\xc3\x75\x9c\x53\x85\x67\x98\x3b\x9e\xf9\xa2\x9b\x95\xa1\x83\xa2\x77\x88\x83\x5c\x83\xb4\x7e\x07\x79\xc7\x09\xe7\x6b\x4d\x74\xea\x00\x9a\x40\xf3\x36\x9e\xd0\x0c\xee\xb8\xc2\x54\x92\xe3\x3e\xf7\x26\x07\x4b\xbd\xb2\xaf\x32\xb9\x26\x91\x1a\xdc\xd7\xac\x1c\xf3\xce\xd0\x7c\xc9\xec\x8c\x07\xd0\x38\x7a\xed\xb5\xee\xb9\xa2\x1b\xd3\x51\x25\x7f\xfb\xbc\x5f\x50\xef\xd0\xc8\xf3\x4e\xd7\x21\x61\xa2\xbb\xd7\x09\x71\xb4\x64\xe5\xf7\x81\xf4\xfa\xce\xea\x40\xb3\x71\xb6\xf3\x8c\x50\x6a\x09\xd1\xc9\xa5\x31\x5d\x6a\x4b\xbe\xc7\x4d\xc9\xf5\x7d\x29\x9e\x71\x01\x42\x1c\x94\x33\x22\xb1\x1e\xfe\xb7\x76\x28\x19\xba\x07\x30\x85\x32\x4b\x8f\xc4\x7a\x5f\x75\x65\x35\x3f\xef\x7a\x91\x8c\xc8\xf7\xb1\x04\xbf\xff\xf5\xfe\x1f\x8c\x6e\xd9\xe4\xd1\x02\x5a\xaa\xb8\x7f\x8b\x22\xfc\xbc\x8a\x90\xf1\x04\x66\x1c\xe1\x4a\x85\xe4\x3c\xec\x48\xee\x22\xd2\x90\x41\x3f\x56\x30\x91\xdc\x8d\x48\xc4\x58\xe1\x84\x11\xe3\x7f\xbf\x33\x86\x11\x50\x64\x8f\x22\xd3\x4a\xac\x90\x22\x7e\x30\x20\x79\x15\x4b\x30\x04\x92\x31\x04\xdc\x3b\xbc\x27\x01\xbd\x96\x58\x84\x7c\x95\xcf\x12\x5f\x13\xed\xb3\xae\x15\xf9\x48\xbe\x95\xe3\x60\x25\x37\x22\xec\x44\xdc\x2e\xc0\x1c\x47\x93\x3c\xac\xc4\xb8\xc3\xd8\xd0\xcf\xfa\x9a\xc6\xdb\xd5\xe0\xee\x5f\x37\x96\x6e\x36\x48\xa6\xc9\x86\x5f\x7a\x2e\xbf\x50\x21\xd9\x9d\xe1\x1a\xbe\xa2\x00\xbd\x7e\x2a\x50\x88\x07\xd0\x6f\x34\x31\xe9\xca\xe7\x68\xd3\x55\x32\x63\x68\x2b\x3b\xab\x18\xe5\x5c\xff\x63\xf0\xf4\xc6\xfa\xd7\xaf\xe4\xd5\x24\xb8\x2e\x59\x9b\xb7\x86\x57\xf1\x00\x8a\x42\xbf\x4d\xc9\x76\x48\xff\xee\xf5\xf5\x16\x51\x7b\xb1\x74\xd3\x2f\x2e\x4f\xda\x84\x63\x59\x7e\xcc\x59\x8d\x9d\x7b\x45\x58\x56\xe0\x54\xf4\x26\x6a\xc7\x67\x74\xbf\x5a\xe9\xf8\x82\x5d\x72\xb1\xe4\xdc\x94\xc7\xf1\xf0\x93\x24\x86\x54\xd6\x8d\x8a\xb8\x4f\x13\x53\x61\x91\x61\x1b\x29\x05\x7e\xf4\xf0\xfb\x6c\xb0\xdc\x84\xe3\x99\x80\x3c\x65\x2c\x47\x61\xc4\x28\xd2\x25\x61\xb9\x0a\x23\x7e\x23\x24\x03\xcb\x59\x18\x11\x85\xbc\xe9\x08\xcb\x5d\x64\x5d\x30\x21\xeb\x02\x53\x1d\x96\x62\xe6\x20\xf8\x5f\xbd\xf5\x47\x17\x38\xae\x90\x3c\xa1\xe8\xf9\x7d\x8d\x9b\x47\xf2\x3a\xbf\xe8\x68\x2a\x70\x7c\x92\x70\xb8\x17\xc2\x1b\x22\x5a\xa7\xcc\xe1\x6f\x47\x4e\x8e\x07\x50\xf6\x7f\x88\xc0\x09\x25\xc5\xf3\x95\x9e\x2e\xac\xcb\x12\xfd\x1f\x23\x42\xde\x8c\x07\x1e\x7a\xfd\x7c\xd4\x52\xf7\xce\xb1\xeb\xaa\x67\x86\x8f\xbc\x05\x00\x4a\x46\x8f\x12\xfc\x8e\xd1\x1e\x26\xf0\x20\x68\x57\x7d\x4d\xfc\x3a\xf2\xd9\x1b\xa6\xbc\x7d\x73\xd9\xf6\x51\xc9\x1f\x74\x0a\x98\x9e\xe4\x04\xb2\x9e\x00\x50\x1a\x9a\x6f\x9f\xd8\xb3\x76\x8d\x54\xdf\x50\xe9\xc1\xa9\xd3\xf1\xf4\xd1\xbf\x9c\xa6\x17\xf4\x53\xbc\x38\xc5\x75\x83\x2e\xa9\xb6\xef\xbb\x4f\x4f\x86\x07\x50\xcc\x7f\x06\xe4\xc1\xaf\xda\x03\xc3\x07\x18\x64\xe2\xa4\x32\x4e\xee\x79\x57\x3c\x19\xe6\xad\x26\xa3\xa6\x64\xd2\xa5\x79\xdd\x31\x38\xf0\x4b\x0d\xee\xdf\xbc\x84\xe3\xe9\x8f\x54\x36\x4c\x3f\xff\x20\xb2\x91\x75\x81\xed\xe9\x2e\x22\x19\x39\x8f\x87\xe5\x2c\xf2\x94\x11\x12\x8d\xe5\x2e\x8c\x88\x41\xaa\x27\xf6\x10\x60\x17\xe1\x81\xe4\x24\xac\x39\x00\x72\x0f\x26\x84\x61\x61\x8e\x02\x76\xa9\x89\x24\xc2\xd3\x31\x87\x01\xbb\xb7\xc0\x23\x0c\x0b\x6b\x1e\x80\x34\xa0\xc8\xe3\xc0\x9e\x08\xec\x22\x9c\x90\x29\x22\xf6\x50\x60\x17\x51\x87\x24\x0f\xac\xb9\x00\x8c\x18\x20\x45\x06\xd2\x58\xf3\x01\x20\x45\x47\x40\x70\xcd\x0e\x0f\x24\x70\xa8\x65\xae\xd2\x99\xf7\xf9\x80\x2e\xce\x64\xfb\x92\xc6\x27\x51\x49\xdd\x1f\xd6\x5d\x4f\x3b\xea\x2d\x06\x27\xbb\x49\x86\xbd\x2b\x83\xac\x6c\x01\x80\x5c\xd0\x84\xa6\x2d\xd9\xa9\x48\x60\x90\xa4\xe2\x53\x84\xcc\x22\xd9\x9b\xd3\x5b\x8f\x9d\x9c\x7b\x33\x98\xd6\x69\x35\xe9\xfc\xf7\xc5\x3f\xf9\xe6\x05\xa0\x1f\xe8\xa6\x38\xe3\x50\x90\xce\xc4\xb7\xdc\xfa\xcb\xa1\x12\xa9\xe6\x9b\x53\xb5\x99\xd1\xe4\x77\x45\x36\x71\x21\x93\x7e\x06\x96\xbe\x1f\x4e\x3a\xed\x10\x51\x74\xd2\x18\xbd\x4b\x7d\x36\xeb\xa4\x96\xa5\xcd\x5b\xce\xa5\x03\x8a\xe4\x6a\x96\xc4\xa7\x3d\xf5\xf9\xdb\x57\x45\xbe\x56\x2d\x95\x27\x4f\xae\x0a\xfe\xa3\xd5\x7f\xd6\x05\x0e\x8e\x27\xb6\xd9\xbb\xf1\x74\x41\xa8\x0c\x96\xe5\x30\xe2\x07\xd2\xe4\x62\xd9\x8e\x30\x6f\x24\x15\x60\x8f\x68\x76\x11\x41\xc8\x39\x44\xec\x29\xcd\x2e\x22\x07\xb9\x07\xe6\xa0\xe6\x0f\xe2\x0b\xb2\x23\xb0\x47\x35\xbb\x88\x4c\x64\x63\x63\x4d\x6b\x60\x44\xed\xdf\xf7\x8e\x63\xce\x6b\xfe\x14\x2e\xe4\x1e\xd8\x23\x9b\x3f\xda\x09\x32\xed\xc7\x9a\xda\x20\x2a\x1f\xd2\xfc\x61\xcf\x6d\xfe\xac\x12\x64\x67\x63\x8f\x6e\x76\x11\x25\x7f\xad\xc2\x98\xde\xc0\x88\x32\x42\x64\x67\x63\x4d\x71\x80\xa4\x38\xf1\xee\x7b\x03\xd1\x8d\xd9\xd7\xfb\x1f\x85\xdf\x44\x45\x04\x5e\x32\x27\x7e\x5b\xdf\xa8\x4c\xb8\x7c\x2f\x55\xfb\xd6\x19\x11\x9e\x9b\x01\xe1\xef\x9a\xb5\x44\x1b\x00\x94\x8a\xde\xd8\x57\xb5\xf5\xcb\xc6\xf9\x3d\xdf\x53\x94\x9e\xbf\xbe\xac\xf7\xe3\x9b\xe7\xde\x44\x9b\xba\x0c\x67\xb6\x95\xdb\x57\xef\xa4\x5a\x95\x74\xe2\x01\xd4\x83\xa6\x28\x16\xcf\x44\x9b\xd4\x93\x05\xe9\xca\x18\x32\x37\x63\xe2\xcc\x3a\xee\x27\x88\x1e\xb9\x73\xd5\x3a\x4b\x6c\xc9\x8e\x39\x31\x2c\x47\x66\xa7\x17\x42\x53\x20\x1a\x76\x85\xf5\x54\x09\xf5\x3e\x3a\x8d\xf1\xef\xf5\x79\x6f\x89\xea\xb8\xa9\x74\x37\x07\x25\x79\x4e\xb4\x90\x47\xf5\xa6\x46\xc3\x2f\x43\xc7\xb6\xfa\x8f\xfc\x8b\xa4\x4a\x2c\xc3\x61\x44\x2a\xb2\xb5\xb1\x4c\x87\x11\x3d\xc8\xc2\xc0\x32\x1e\xe9\xfe\x10\xe6\x81\x3d\x49\xdb\x45\x00\xa4\x02\x63\x0f\xd3\x76\x11\xd1\x88\xe7\x58\xf3\x34\x44\x55\x63\x40\x4e\x0b\x62\xcd\xd5\x80\x14\x31\x07\xe1\xff\x7a\x39\x80\x6e\xaa\xab\xbf\x84\xde\x5f\x0f\xac\xa5\x50\x24\x78\x7c\xd2\x3f\x63\x4f\x76\xfc\x22\xe5\x67\x79\x8f\xd5\xcb\x75\x0c\xc7\x7f\x7a\x72\x79\xec\x90\x82\x18\xf4\xec\xd9\x41\xf6\x8c\xcd\xa7\xcc\x97\xc9\x6f\x35\x95\x72\x9f\xd0\x08\x69\xd1\x48\x4a\x7c\x66\x2b\xf7\xd1\x39\x5c\xf2\x35\xc7\xa0\x9f\x81\x04\x0f\xa0\x40\xf4\xe2\xa3\xc2\x47\x7d\x66\x4a\x18\xbe\xb7\x91\xc1\xf1\xb3\x51\x82\x53\x46\xfa\x85\x7f\xfc\x72\x64\x53\x1d\x0f\xe7\x7e\x4b\xc9\xa3\xfe\x27\xf0\x00\xf2\x43\x97\x15\xb1\x3b\xbd\x1c\xf3\x8b\xc4\xcc\xfb\xbf\x3c\x69\xb6\x97\x1f\x6b\x4e\xcb\x22\xf0\x37\xb0\xa1\x0e\x3d\xb7\xff\xf4\x15\x99\x5e\xba\x4f\xb8\x7f\x33\x1b\x79\x08\x48\x7b\x8c\x65\x38\xd2\xa2\xfc\xfd\xc3\x0a\x86\xe9\x30\x22\x10\x59\x7e\x58\xc6\xc3\x08\x3f\x52\x44\x0c\xc5\x9a\x71\x02\x29\x5b\x52\x02\xa2\x9d\xc7\x16\xf0\x9f\x2f\xf2\xdc\x2c\xa0\x3b\xcb\x0d\x7d\x64\x53\x19\xbb\x70\x6e\xcd\xe4\xc0\xf6\xf3\xa0\x83\x27\xa6\xf5\x16\x22\x4c\x2e\x12\xe3\x0e\x79\x0d\xe1\x01\xe4\x86\x7e\x0c\x2a\xc5\xd6\x97\xb8\xf6\x4b\xa5\x7e\xb7\x7b\x10\xb5\xff\x87\xbe\x63\xf6\x76\x8c\xe2\xe6\xbe\x83\x6e\xef\xbf\x56\x36\xc5\x07\x3a\x91\xe2\x81\x04\xfa\x65\x2c\x4b\xf1\x8f\x48\x84\x92\x0b\xd3\xcb\xfa\x3f\x0a\x0c\xb3\xb3\x9c\x77\x97\xde\xef\x5e\x75\xe6\x72\xa0\xee\x11\x4a\xe6\xa3\xb9\x4f\x63\xf1\x00\xf2\x42\x9b\x93\xf4\xeb\xc4\xca\xd9\xfc\xa2\xae\xf7\xd3\x9f\x2f\x8a\x8e\xde\xca\x63\x0e\x7e\x71\x4d\x88\x41\xc5\x93\xd3\x99\x2f\xd4\x10\xa7\xf7\x12\xf7\x6f\x56\xc3\xf1\x09\x40\x6a\x03\x96\xdd\x30\xc2\x8d\x0e\x6e\x2c\xb1\x4c\x87\x1b\x08\x19\xf8\x16\x58\xb6\xc3\xb7\xf0\x42\x8c\xc2\x9a\x33\x23\x3d\x38\x31\xf2\xc6\x4d\xac\x79\x33\x90\xe2\xe6\xa4\xb3\x75\xdc\xa9\x59\x68\x0d\xdb\x23\x3c\x5d\x6e\xb0\xbc\xe7\xe6\x5e\x0d\x12\x32\xf2\xa5\x64\x25\x67\x95\xc5\x2b\xae\xe9\xa1\xef\xf3\x4a\x5b\x5f\x0d\xcb\x5a\xcf\xe1\x01\xe4\xf0\x9f\x97\x08\x70\x5e\x9a\xf2\xe5\x5c\xb2\x51\xb1\xdd\xff\x96\xd4\x5d\x3b\xaf\xd6\x3d\xe9\xe5\xda\xed\x03\xc9\xaa\xc7\xf0\x4a\xb1\x0a\xfe\xcc\x3b\x91\x42\xff\xfe\x54\x7c\xd1\x26\x9b\xb1\xfa\x8d\xe9\x64\xe0\xae\x4e\x41\x54\x66\x19\x7f\xba\xbd\x4c\x62\x72\x58\xbe\xb0\xce\xf9\xd8\x19\x11\xdf\x9d\xaa\x8b\x6e\xe2\xde\x1d\x4d\x33\x7c\xc0\x6d\x29\x0f\xd1\xad\x6d\x3a\xd4\x4e\xf0\x5e\xcc\xb9\x56\x55\xed\x1c\x67\x92\x40\xd9\x9b\xf8\x6c\xbe\xf0\x33\x1e\x48\x10\xa0\x93\x4b\x50\x16\xc8\xcb\xd9\x16\x61\x38\xe4\xec\x9f\xce\xfb\x6c\xd9\xc6\x66\x61\xc4\x86\x87\x5f\xf2\xf9\xa5\x02\x29\x17\xa3\x4a\x26\x3c\x80\x86\xd0\x83\xea\xc9\x9c\x57\xca\xa1\xd3\x7b\xa9\xd6\x6b\x6b\xf1\xeb\x0c\xef\xe6\x68\x89\xee\x9f\x50\xf7\xe8\xfb\x19\x69\xe2\x1f\x52\x5a\x8d\xcb\xc1\xfd\x5b\x54\x90\xf2\x8f\x28\xe4\x58\x71\x81\x11\x0e\x48\xcb\x87\x15\x19\x64\xe1\x21\xf7\xc0\x8a\x0d\xd2\xc6\x30\xc2\x4b\x15\x2b\x3c\xf0\x52\x25\x80\x6f\x81\x15\x1f\xf8\x16\x43\xc8\x69\x4d\xec\x73\x0b\x7f\xa6\x9b\x08\xf9\xc3\x3e\xba\xf0\xc7\x71\x24\x54\x58\xa7\x17\x60\xc4\xf6\xdf\x57\xea\x63\x9e\x5f\xf8\x93\x27\x11\x39\x04\xfb\x08\xc3\x2e\x22\x1e\xf1\x1c\xeb\x14\x03\xd2\x1d\xd3\x23\x6f\x1d\xc7\x3a\xcd\x00\xa4\x24\xbc\x08\x88\x76\x4a\xe2\x32\x5a\xae\x10\x15\x54\x6d\xba\x7e\x24\xd9\x2f\x39\x9d\x66\x66\x61\x9a\xd5\x79\xde\x9e\xa6\x5a\xe6\xc2\xe4\x35\x57\xf7\x20\x6a\x01\x97\xf4\xc3\x78\x00\x8d\xa0\x75\xa9\xa6\x91\x9a\x81\x30\x03\xb9\x3c\xe7\x53\xdb\xbf\xdf\x04\x2e\x88\x33\x09\xe9\xa8\x8c\x2e\xbe\x59\xd7\x78\x73\x4f\x3c\x3b\xab\x5d\x19\x0f\xa0\x74\xf4\x26\x9d\xff\x3c\x9a\x4c\xf7\x30\xb3\xdc\x43\x84\x87\xd3\x64\x69\x24\x9d\xe4\xf3\x87\x47\x05\xe7\xd5\x44\x8f\x4c\xcf\xb8\xaf\xd2\x57\x34\xe1\x01\x34\x8e\xce\xf5\xcb\x77\x93\xae\x5d\xba\xa8\x47\xfb\xb9\xc6\x36\xc8\xfa\xf8\xd2\x16\xfd\xf1\x9e\x96\xa4\xce\x16\xc2\xa9\x94\xfa\xfc\x9f\x51\x47\x49\x77\x12\x2c\x7a\x1c\x32\x9e\x74\xa4\x2b\xe2\x62\x69\x7c\xc7\x2d\xe1\x47\xbc\x6b\xcb\xd4\x8b\x91\x0a\x0e\x5c\xac\xad\x1c\xab\x51\xdf\x58\xf4\x47\x44\x2f\xe1\xfe\xcd\x4d\x64\x36\x80\x68\x15\x58\x8e\xc2\x88\x11\x84\x3c\x60\xb9\x8a\x28\xfd\xc8\xae\xc3\x72\x16\x51\x5c\x91\xc5\x87\xe5\x2e\x52\x84\x68\x91\x6f\x2d\x60\x9d\x5d\x01\x52\xe2\x37\x88\x18\x76\x28\x6f\x2f\x5a\xbb\x3f\x3d\x2a\x24\xcc\xca\xbb\x0d\x39\xf5\x79\x1d\x58\xbc\xcf\xec\xf5\x5a\xb6\xfb\xa1\x01\xc9\xe7\xb9\xeb\x38\xf6\x87\x55\x56\x1c\x6c\x78\x00\x55\xa1\xab\xe8\x15\x91\x8f\x66\x45\xa7\x09\xcb\x54\x73\x49\x49\xcd\x46\xf5\xfc\xca\x59\x19\x97\x57\x3f\x8a\xcf\x45\x5c\x51\x7d\xca\x6f\x70\x80\x06\x0f\xa0\x39\xb4\x78\xff\xfc\x76\xce\x42\x6a\x44\xa1\x24\x09\xdf\x16\x75\x7a\x2a\x63\x8b\x71\x15\xf3\x61\xde\x19\xd1\xea\x8b\xf1\xda\x63\x36\xa7\x08\xf3\xf0\x00\xf2\x45\xa7\xd7\x9e\x13\x24\x4d\x2f\x24\x8f\x92\x32\xed\x2f\xfe\x44\xa1\xf8\x2e\x3f\x53\xa8\x47\xcf\xd6\xb8\x6e\xb1\xd6\x45\x85\xfd\x57\x51\x6e\x18\x1e\x40\x1f\xd0\x0b\x75\x69\xe6\x82\x9f\x83\x62\xf3\xfa\xd3\x14\x7a\x36\x22\xeb\x4c\x11\x0d\xc2\x10\xf5\x6b\x32\xa7\xae\x9c\xdd\xff\xe5\x6b\x84\xb3\x0b\x31\x1e\x40\x0b\x68\x5e\x62\x19\x72\xb5\xa3\x24\xae\xd2\xfa\xee\x5b\x7a\x9f\x96\xbe\xfb\x17\x64\xb7\x64\x08\x6c\x0f\x57\x2f\x85\x45\xae\x6a\x13\x49\x93\xf1\xec\x3c\x6a\xb4\x70\xe7\x50\xf0\x5d\x6d\xd4\x51\x4e\x7b\xe6\x5b\xff\x8b\xa0\xee\x15\x82\x38\xd1\x13\xd7\xd3\xac\x56\x3d\x5f\x7f\xa2\x7d\xc1\xcb\x50\xe2\x8f\xfb\xb7\x30\xc2\x0f\xac\x17\x11\xee\xb1\x02\x09\x23\xaa\x90\x92\x8e\x15\x4a\x18\x31\x87\x08\xf7\x58\xc1\x84\x11\xbe\x48\x46\xc2\x0a\x27\x8c\xf8\x80\x6c\x07\xac\x80\xc2\x88\x05\x84\x38\x60\x85\x14\xd9\x72\x08\x39\xc1\x3a\x67\x85\x88\xd9\x7b\x91\x3c\x89\x75\xde\x0a\x48\x91\x13\x52\x71\xec\xe4\xc9\x0a\x74\xf3\x30\x4d\x56\xed\xf7\x96\x5b\x3a\x71\xff\xfb\x27\x09\x81\xcb\x31\xb6\x0e\xbe\xb6\x6b\xe0\xa7\xbf\xca\x94\x82\x83\xcf\x65\x69\xb6\x3d\x3b\x25\x02\xcd\x43\x05\x93\x48\xef\xd1\xbe\x48\x37\x7a\x5c\xc9\xd6\x97\x6c\x9a\xc1\x4f\xea\xfb\xa4\x8d\x64\xfa\x99\xa6\xc1\xab\x6f\xcd\x79\x59\x07\x46\xf1\x00\x8a\x43\xcb\xcc\x0e\x75\x13\x2f\xca\xe8\x66\xc3\x55\x84\x38\x4d\x33\x3c\x1b\x18\x88\x5e\xb5\xfa\xa4\x31\x1d\x54\x96\xfb\x72\xc5\x4b\xe8\x46\xd9\x67\x3c\x80\x36\xd0\xdb\x33\xa1\x47\x8e\x2e\xd3\xec\xe9\xa6\xc0\x38\x24\x41\x26\x9d\xbf\xb4\x67\x3e\x92\x67\x4f\xfa\xd8\x47\x1f\xed\x53\xc2\x2e\x4f\x1a\x0c\xf1\x00\x4a\x46\xe7\xc9\x7d\x27\x55\x63\xfb\xea\x6b\xe3\x69\x13\x13\xd4\xbb\x28\x0a\x62\x96\x95\x68\x6b\x3c\xcf\x89\x14\x55\xd9\x3e\xa5\xb3\xbc\xf4\xa8\x1f\xf7\x6f\x6e\xc2\x01\xad\x40\x84\x1c\x2c\x47\x91\x02\x8a\xb0\x56\x2c\x57\x61\x44\x1c\x22\x6d\x62\x39\x0b\x23\x36\x90\x4d\x84\xe5\x2e\xa2\x4d\xd3\x2e\xf7\xd1\xed\x42\x4e\xa9\x9b\xc4\x85\xd8\x6e\x89\x45\x9a\x99\xf5\x6a\x26\xed\x0b\x7d\x67\x28\x1f\x7d\x50\x70\x81\xdb\xb4\xb6\xe9\x62\x55\x13\x8d\x37\x90\xfa\xbd\xb5\xfd\x2e\xe8\x20\xfa\xd0\x8f\x6f\x89\x72\xc4\xd2\xfb\x0e\xb7\xce\xfe\xb5\xac\xa8\xd1\x6d\x11\xc3\x5f\x64\xb3\x61\x1b\x0e\x56\x84\xda\x62\xa1\x86\x8f\x2d\x50\x97\x9e\x0c\x93\x9e\x5f\xbf\x32\x91\xf7\xe0\xd1\x5e\x1b\x91\x8a\x42\x2f\xaa\x3b\x4e\xb2\x9c\x67\xdf\x45\x7e\x1c\x08\xbf\x74\x83\xc9\x6f\xc3\x0e\x40\x91\xe8\xe7\x65\xfb\xa2\x90\x3b\x8d\x8f\x4a\x6f\x59\xf7\x04\x91\xcd\xb3\xef\x35\xc6\xfc\x2f\x6d\xfa\x4a\xae\xae\xcc\x30\x0d\xad\x7d\x7b\x59\xf1\x1d\x40\x6d\xe8\x6c\xca\xe0\xc5\xfd\x55\xba\x76\x95\x68\xff\xe2\x13\x13\xc9\xf7\xc6\xb8\xe4\x7b\x37\xce\x65\x51\x97\xe8\x17\x37\x98\x5b\x58\xbf\xbb\xd6\x01\xa0\x9f\xe8\x2a\xfb\x4a\xe7\xc2\x5d\xab\x4b\xf5\xfb\x1a\xe4\x38\xb3\x67\x05\x85\x94\xe4\xef\x72\x39\x1d\x1a\x52\xce\x1a\x8f\x2d\x19\xae\xb2\xca\x82\x00\x80\x62\xd1\x44\x7b\xcf\x7b\xf9\xb0\xaf\x7c\x4b\x53\xa7\xb3\x64\x8f\x15\x1e\x7e\xd7\xba\xc7\xdb\x9c\x5f\x5d\x35\x7f\xfb\x1d\xc9\x4c\x85\xee\xa7\xe8\x49\x00\xa5\xa0\x3b\x79\xa9\x57\x73\x9e\xb9\x1e\x89\x89\x1d\xa7\xb8\x6a\xe3\x35\xa3\xb7\x65\x38\x45\x96\x48\x5c\xc6\x0b\x84\x6c\x83\x06\x25\x85\x6c\xfd\xd1\x94\x79\xb4\x71\xce\xdc\xe4\x6a\x5f\x4c\x79\x72\x0a\xef\x44\x4a\x93\x89\xe8\xcd\xd3\x71\x91\xb9\xdf\xae\x73\x25\xa8\x10\x37\xba\xec\xd4\xfb\xdf\x68\xbd\xc6\x9a\x7e\x61\x14\x77\xeb\xc3\x42\x96\x05\x8b\xdc\x87\xbb\x45\x6e\xdc\xee\x79\xad\xe5\xa6\xb7\xce\x64\x6d\x3e\x3a\xb0\xc5\x0d\xe5\xee\x34\x5e\xe8\xeb\xdb\xd5\x65\x4f\x48\x5d\xf8\x49\xd1\xcc\x7b\xe9\xec\x56\x16\xd9\x21\xc7\x8f\x31\x21\x0f\xcc\x02\x9e\x52\xe6\x8e\x0c\xd6\xb1\xa8\x30\xe0\x01\x54\x83\x8e\xbb\x1e\xd1\x60\x64\x6f\xee\x44\xd0\xad\x21\xbf\x5b\x5e\x03\xe7\x22\x23\x85\x5b\x43\xcd\xfd\x7f\x7a\xdc\x14\xbc\x57\x27\xcc\x73\xbf\x0c\x00\xc8\x17\x3d\x8f\x79\x2c\xf7\x46\xce\xac\x61\xee\x45\xdf\x09\x82\x2e\x31\x2f\x7f\x9f\xf0\x6f\x8f\x5c\x25\xc6\x69\xed\x45\xab\x03\x28\x5f\xbb\x30\xe4\x00\xa8\x07\xfd\x9c\xba\x99\xbe\x99\xed\x4b\x54\xe0\x0f\xa2\x20\x18\x62\xd0\x09\x57\x32\xcd\xec\x6f\x7f\xe4\xcc\xed\xf9\x61\x53\x7a\xdc\xeb\xc3\x29\x74\xc1\x0b\x37\x90\xec\xb3\xac\x64\x32\xae\xe5\x60\xba\xa5\x2a\x66\xcb\x1c\xa0\x22\x5a\xaf\xb3\x66\x31\xfc\x05\x28\x77\x9d\xf3\x17\xc5\xd9\x01\x89\x1b\xa8\xcb\x1f\x4d\x1e\xd9\x37\x76\x5e\xb1\xc6\x39\xd4\xae\x44\x7d\x52\x44\x4d\x53\x74\x5d\xa7\x7b\x4a\xf4\x47\x7c\x75\x14\x4d\x36\xcf\x01\x41\x00\x95\xa2\xa5\x10\x15\xbc\xdd\x45\x07\xf6\x3b\xcf\xc3\x1b\xa1\xcb\xb7\x5d\xd5\xdf\x7f\xdf\xe7\xa5\x21\xd6\x6d\x3f\x14\x63\xf9\xd9\xd7\xd9\x95\xed\x27\x80\x16\xd1\x6d\x9c\xed\x84\x54\x7f\xe6\x1d\x95\x19\x5b\xcd\x09\x36\x06\xea\xcb\x0d\x53\xb3\x1d\xb3\x5e\x41\x05\x6e\x92\x2e\x14\x4d\x87\xd7\x0f\xde\xb4\x03\x50\x10\xfa\xfa\x8f\xcf\xa6\x26\x5d\xcb\x05\x8b\x86\x23\x0b\xec\x15\x71\x11\xa4\xf7\xf6\x9e\x4c\xba\xdd\x77\x9b\xe3\x35\x41\x37\x91\xa1\xb9\x85\x2d\x80\x12\xd1\xd9\x32\xf4\x80\xfa\xa9\x2b\x0e\x35\xaa\xb6\x5a\x77\xb2\xf5\x0a\x36\xdb\x05\x7a\xd2\x2d\x1e\xef\x6d\x9a\x62\x0a\xf6\x56\xd3\x63\x7f\x38\x0f\xa0\x72\x74\xad\xa6\x25\xad\x75\x7c\x54\x2a\x5b\xfb\xa9\x3b\x9a\xeb\x77\xf1\xd0\x67\xdd\x1f\x65\xf9\x59\xc2\xfb\x71\x97\x3f\x98\x7b\xf4\x36\x54\xaf\xa3\x2e\xcd\x9d\xb7\xe1\x34\xf7\xe8\x35\xfe\xb0\xe1\x37\xb2\xfa\x8c\xd0\x31\xbf\x48\x44\x54\xf7\xba\x8d\x5c\xc8\x9d\xe8\x91\x0e\xd5\xd9\x05\x3b\x00\x85\xff\xe7\x9f\x40\x13\xc7\xcf\x6a\xce\x25\x3f\x4d\x68\xb0\x91\xeb\x55\x2a\xb8\xfb\xc3\xe0\x31\xd9\xcb\x5b\xab\x79\xd9\xbf\x97\xc5\x1e\xd0\x78\xf1\x00\x28\xf1\x3f\x7e\xde\xce\x28\x5e\x13\x7c\x7e\x33\x4b\x7a\x5a\x42\xe9\x59\xce\xab\x18\x7c\xa0\xca\x62\x12\x7b\xad\x68\xd1\x7d\x86\xfb\x0b\xab\xa2\x00\x9a\x43\x5f\xbe\xea\x47\xb5\xca\x41\xe0\xe7\x21\x5f\x71\x6c\x1f\xdb\x01\x1f\xe8\x16\xa3\xc1\xaa\xd9\xb1\xb3\xc4\x6c\x23\xd5\x72\xcb\xa1\xb9\x35\x78\x00\x6d\xa2\x57\xe3\x61\x89\xbd\x92\xeb\x99\xfb\x95\x2c\xac\x42\x24\x5a\x08\xbd\xe5\x6b\xe5\xc4\x53\xdf\xbc\x8d\xc9\xdb\x93\x75\x29\xf6\x47\x4d\x7d\x11\x00\x90\x1f\x3a\x30\x83\x6f\xc7\x5f\xc8\x96\x3f\xe7\xbd\xe6\xbe\x9c\xf4\xab\xf8\x78\x09\xc5\xd0\x6d\xf6\xad\xa7\x47\x5c\xfc\xb7\x9f\x96\x24\x44\x53\x1e\x02\xd0\x32\x7a\x89\xb9\xe7\xf0\xaf\x00\xb1\xb7\x15\x3e\xe6\xf4\xb6\x4d\xf6\x65\x54\xf2\x85\x7d\xc1\xde\x25\xe4\xaf\x47\x36\x6a\x3e\xbe\xbf\x57\x70\x16\x0f\xa0\x3a\x74\xda\xa0\x0e\xe1\xbe\x50\x7b\xe6\x91\x96\xa1\x2e\x29\x4b\x77\xd0\x01\xeb\x4e\xaf\x8b\x5b\x7a\x45\xc1\x85\xcb\x22\x0f\x04\x69\x82\xd3\xd3\xd1\x67\xce\x6f\xf4\x36\xda\x72\x79\x98\x56\x53\x2f\xbe\x4c\xac\x94\x0d\xa6\x2d\x31\x2b\xcd\x4a\x7e\xd8\x2f\xea\x68\x45\x94\x19\xbd\x71\x07\x0f\xa0\x7a\xf4\x9f\x0d\xd6\x07\x48\x69\x8d\x34\xef\xea\x8b\x31\x52\x9b\xfa\x07\x2d\x91\x6e\x88\xa9\x7b\x7b\xb9\xd9\x15\x3d\x0d\xda\xd3\xcf\x13\x74\x53\x07\x7d\xe4\x48\x53\x20\x23\x3f\xe6\xeb\xeb\x48\x5b\xb7\xbe\xd3\xee\x45\xda\x62\x01\xfa\x8e\xdd\xc6\xec\x9c\x12\x10\x3d\xa3\xa6\x6f\xa8\x18\xea\x52\x0d\x62\xb2\xd6\x5b\xf4\xbe\xc6\x39\x77\xed\x7b\xa2\xd7\x95\xa5\xea\x46\xf8\x17\x25\x7e\x3f\xfb\xa5\xf5\xbc\xbe\x90\x8a\x97\xc0\x08\x0f\xa0\xc4\xff\x7c\x4d\xb7\xce\xfa\x8d\x9e\xba\x36\x47\x40\x7d\x45\xb3\x1c\x51\xc3\x83\x13\x02\x2f\xc5\x42\xae\xbc\xe0\x08\x7e\x99\xb6\x69\x2f\x17\xb5\x53\x85\x27\xd1\x5d\xc1\xaa\x7a\x81\xfe\x8d\x45\xa6\xe4\xf3\x6e\x17\x3f\xcd\x96\xb5\x7c\xcd\xdb\xb6\x70\xf2\x0d\xb8\x13\x7d\x77\xa3\x40\xfe\xc8\xcd\xd5\x0b\xa8\x4b\x57\x02\x70\xfd\x5f\x06\xce\x2e\xb2\x15\xcd\xf1\x57\x33\x72\xfb\x3c\xba\x4c\x77\x9a\x47\x32\x62\x8b\xdf\x53\xd5\xe9\x73\x88\xf1\x23\x00\x20\x3c\xba\x9f\x1e\x08\x90\x6b\x0f\xf3\xf9\xcc\xb9\x2a\x57\xc2\xc5\x28\x63\xa3\x71\x34\x1b\x1a\xe9\x22\xe1\x6b\x48\xba\x78\xf0\xc8\x83\x1c\xeb\x67\x00\x72\x41\xf7\x03\xd2\x9f\xaf\x93\x1c\xc9\x78\x64\x9b\x31\x20\x9d\x9f\xac\x40\x42\xb9\xf1\x41\x7a\x80\x2b\x97\x3d\x04\xd7\x3a\x48\x20\xe3\xda\xb5\x08\x00\xf4\x16\xbd\xce\xb5\xd5\x6e\x66\x14\x98\x13\x38\x3f\xfe\xfe\x7d\x4e\xac\xc3\xf1\x6d\x98\xcd\x41\x6a\x82\xda\xde\x4b\x07\x92\x9b\x33\xa4\x16\xc2\xda\x00\xd4\x81\xb6\xe6\xf1\xea\xb4\x6c\xa9\x7f\x86\x69\xb8\x6b\x86\x8e\xff\x03\x2d\xc9\x28\x41\x29\xb9\xd7\x57\xa7\xdb\xcc\x27\x14\x6b\x9c\x1e\xb2\xcc\x01\x00\xf9\xa0\xbb\xef\xbd\xb2\xde\x0c\x77\x45\x6e\xcc\x99\xdb\xe8\x44\x76\x6b\xbf\x48\xd8\x93\x34\xed\xa6\xf9\xf0\x8c\xd8\xdb\x6b\xaa\xd9\x07\x0f\xee\xdd\x03\xa0\x66\x74\x1c\xd9\x86\xb3\xc3\x72\x4a\x0f\xdb\xaa\x9f\xe6\xad\x9f\x15\xab\x6c\xf4\x34\x3a\xb8\xaf\xb2\x3a\xab\xc2\x62\xda\xbe\x7c\xe1\x4a\xc7\x5b\xd4\xa5\x02\x4a\xa7\xca\x5f\x45\x05\x42\xf4\xe5\x2e\xdd\x4f\x59\x18\xef\x88\xde\x0b\xaa\xf8\x59\x13\xa7\xc6\x33\xe3\x24\x13\x37\x55\xb4\x62\x07\x20\x2f\x74\x9f\x9e\xf3\xd3\xda\x2e\xc4\xe3\xac\xe8\xa2\xcd\x51\x32\x75\x79\xd6\xc2\xb2\xe7\x1b\xa9\xd1\xaa\x41\xb3\xb4\x16\x07\x70\xef\x4d\x9b\xe8\x01\x54\x8f\xbe\xfc\x40\xb9\xf1\x2c\xbf\xbd\x48\xb7\xbe\xd2\x35\xeb\x26\xa9\x14\xfb\x67\x7c\xc9\x8f\xec\xaa\xac\x4e\x7d\x23\x79\xca\x99\x4b\xf1\xe8\x3e\x80\x96\xd0\x3b\x08\x57\x25\x60\xc6\xa1\x7a\xed\x83\x41\xe2\x35\x7a\x7f\x47\xbe\x4c\x56\xa3\x4f\xae\xcf\xd2\x46\x2e\xab\x4c\x6c\x67\x17\x34\xe7\xe1\x60\x81\x1b\xab\x53\x00\x52\xe2\x44\xf6\xff\x13\xb8\x7b\xd0\x85\xb4\xe0\x48\x22\x97\xa2\x35\xd5\xac\x1a\xab\x73\x88\x69\xf0\x15\x9f\xe8\x5a\xe9\xc2\x6b\x77\x79\xf2\xbd\xb5\x83\xe5\xd6\xe7\xc9\x5f\xe2\x01\x14\x85\xce\x17\x2d\x4d\xa7\x14\x29\x37\x6f\xff\x36\x94\x37\x6d\x7a\x90\x53\xac\xce\x83\xa3\x1d\x12\x94\x3e\x99\x24\xc2\xa5\x9a\x74\x82\xac\xc2\x0b\x0f\xa0\x6f\xe8\x55\xf3\xec\x3b\xc7\x9a\x59\x38\xd5\xd1\xbb\xe6\x03\x6c\x8d\x93\xee\x5c\xf6\x89\x37\x5e\x1e\x3c\xc3\x7f\xdb\x58\xf5\x80\xb9\xc1\x1c\x55\x15\x1e\x40\xb9\xe8\x3c\x3d\x59\x3c\xf1\xbd\x7c\x12\xca\xff\x76\xd0\xe5\xfb\xf0\xd1\xf8\xc4\x91\x7a\xfd\x4c\xa1\xc3\x36\x1a\xea\x5e\x27\x3b\x3c\x8e\xd5\xc0\x1f\x2f\xc7\x32\x1b\x40\xe2\xbb\x93\x0c\x44\x86\xc1\x32\x1c\x46\x44\x21\xa7\xfd\xb0\x4c\x87\x11\xdf\x90\x9e\x10\xcb\x78\x18\x91\xbb\x67\xb9\x99\xe8\xdf\xba\x36\x20\x45\x6a\x5b\xf5\xbf\x73\x75\x83\xff\xf9\xf6\xc9\xfd\x2a\x3a\xae\xa1\xd2\x47\x01\x94\xa1\xe2\x06\xb1\x4f\x88\xa9\x7f\xb7\x1f\x65\x37\x5d\xab\x37\x96\xac\x92\x2a\x49\xd4\x7f\xbe\xe3\x08\xfa\x8f\x59\x1d\x4c\x63\x3d\xc7\x62\x19\xaa\x9f\x4b\x98\x4a\x1b\x95\x7b\x86\x27\x91\x2f\x17\x7b\xc4\x06\xb9\xca\x7d\x53\x6e\x1a\xed\xc9\x53\xd9\x21\xf4\xe8\x32\xf2\xcd\xe8\x64\x6f\x49\x67\xa7\x6c\x47\x81\x71\x17\xd5\x7a\xc6\x99\x30\x86\xc1\x28\xbb\x18\x09\x61\xdd\x17\xe3\x95\x5a\x2d\xf7\x6a\xf1\x00\x72\x44\x77\x1d\x54\xa6\x86\xb8\xb5\x39\xd3\xc6\xf9\x10\xba\x11\x45\xf7\xba\x09\xa3\xfd\xf7\xcf\x4b\x4a\xe7\x67\xbe\xef\x3b\x2f\xb3\xff\xf5\x97\x48\x3c\x80\x32\xd0\xc9\x81\xae\xcf\xf5\x25\x4b\x63\xe6\x59\x59\x91\xab\xe4\xd4\xf2\x96\x39\x27\xad\xc7\x6e\x6b\xa9\xce\x1f\xd7\xa7\x50\x6f\x2d\x95\x5e\xa9\xc4\x03\x08\xa0\xb7\xaf\x43\x78\xa1\xf4\xb0\x0b\x7e\x46\xfa\x0d\xd1\x6f\x85\xe1\xd6\x8c\xa9\xd8\xfb\xfc\x8f\x5a\xbe\x7c\x4b\x5f\xf7\x7c\xfd\xb9\x61\xcf\x4d\xdc\xbf\x85\x05\x7e\x00\x83\x88\x72\x86\x15\x18\x64\x59\x20\x93\x4f\xac\xd0\xc0\x88\x80\xbf\xdf\x20\xc6\x08\x0e\x8c\x70\x44\xd8\x33\x56\x78\x60\x44\x06\x22\x26\x61\x05\x08\x46\x00\x84\x56\x61\xf7\xff\xbb\x88\x48\x64\x43\x60\x53\x80\x5d\x44\x1b\xe2\x07\x26\x0b\xf8\x83\xf8\x89\xc8\x4f\xd8\x3c\x60\x17\x11\x8b\x4c\xae\xb0\xa8\x00\x8c\x48\x21\x45\x18\x3a\x16\x25\x00\x52\x51\xbc\x04\xb6\x3b\x0c\xbd\x19\x9d\x9b\x84\x22\x80\xec\x7a\xcb\xb7\x7d\xe5\x69\x2a\xd1\x17\x9e\x6a\xb1\x1c\x0e\x3b\x9e\xe1\x24\x48\x7c\xe2\x9d\xc6\x2b\xed\x0b\x3f\x3b\xe4\x76\x96\x09\xba\xd6\x47\x2a\x15\x19\xc6\xef\xd3\x3e\x3a\x33\x1a\xff\x95\xc1\x4e\x82\xd1\xee\x92\x51\xcf\xc1\xe0\xd6\xe6\x2d\xe6\x67\x64\xc7\xdc\x5a\x76\x9a\x1f\x4f\x74\x49\x8b\x79\x6e\x7a\xc0\xf2\x21\xb7\xab\xef\x8f\xe8\x0c\xed\x4b\x42\xa4\x4b\x7e\xf7\xaa\xe9\xa8\x06\x65\x56\xaa\x06\x7c\xc7\x6e\x28\x68\xec\x3c\x70\x34\x67\x8a\x65\x75\x6c\xc8\x8c\x38\x22\x38\xf4\xf6\xfd\xa3\x90\x0f\x72\x0e\xed\x66\xa2\x65\xa7\x03\x88\x0b\xa8\xf1\xbc\x8c\x81\x96\xe2\x85\x3b\x9c\x18\x9d\x34\xae\x45\xec\xbb\xea\x74\x2b\xeb\xe1\xab\x3b\xe2\x8f\xaf\x86\x37\xb3\x1d\x1f\x98\xaa\xed\xa9\x34\x6e\x3d\x3d\x4f\xea\x21\x41\x3d\x0c\x7f\xdf\x19\xcb\x4d\x38\xa0\xcd\x08\xdf\xc6\x72\x14\xd9\x44\xc8\x61\x00\x2c\x57\x61\x84\x27\x22\xf6\x60\x39\x8b\x6c\x09\x64\x61\x60\xb9\x0b\x23\xb6\x91\x64\x80\x45\xfd\x60\xc4\x6f\x64\xda\x8d\x45\xfe\x60\x84\x1f\x82\xc0\xa4\x7f\x7f\x10\x35\xc8\xb6\xc3\x26\x80\xbb\x08\x5f\x64\x48\x81\xc5\x01\x91\xea\xf8\xf7\x85\x5a\x58\x5c\x10\x48\x11\x72\x90\x90\xef\xb4\x0f\x2b\xe8\x25\xfe\xc5\xf9\x51\xd6\xb5\xfe\xc9\x41\x41\x31\x9f\x26\x5b\x1d\xf0\xf5\xcb\xe2\x52\x16\xfb\xfb\xa0\xda\xbc\x6b\xb4\x36\x2c\xfd\xf6\x64\x78\x00\x85\xa0\x45\x28\xe3\x6c\x13\x8a\xfc\xd2\x0f\x13\x9c\x44\xb4\x7e\xba\x8e\x84\x56\x41\x56\xd3\xdb\xca\x65\xa6\xa1\x45\xe4\xd6\x7c\xe4\x2f\x17\x4a\xf0\x00\xda\x40\x2f\x59\xd9\xd1\x6a\x91\xac\xd3\x46\x7e\x7a\xa3\x22\xf3\xfb\xbc\xc9\xd3\x12\x99\xb9\xf7\xff\x74\x94\x08\x91\x18\x7f\xf0\x74\x94\xaa\x9f\x13\x0f\xa0\x65\xf4\xef\xbf\xb0\x08\xe5\x3b\xa7\xbe\x26\x9e\xaa\xc9\xea\x22\x55\x5e\xc1\xfc\xdb\x34\x27\x2f\x3d\xfd\xde\x54\x84\xec\xa7\xcf\xd5\x11\xdc\x15\xb8\x7f\x33\x1b\x0e\xd0\x0a\xb2\x60\xb1\x0c\x87\x11\x21\x88\xa4\x84\x65\x3a\x8c\xd8\x40\x96\x1f\x96\xf1\x30\x62\x19\x79\x51\x2b\x36\x25\xff\x1f\x42\xe2\x06\x32\x30\xc6\x24\xe5\xbb\xb7\x28\x45\xc6\xfc\x58\xbc\x1c\x46\x2c\x22\xe5\x0e\x9b\x99\xef\x22\x82\x10\x04\x36\x39\xdf\x45\x24\xfe\xfd\x34\x18\x06\x3f\x87\x11\xe5\x14\xc8\x61\x22\x2c\x9e\x0e\x20\x29\xd6\x9d\xf5\xed\x81\x16\x5f\x32\x44\xcd\xfb\x0f\xb1\x9d\xaa\x98\xbb\x92\xe6\x43\x36\x6f\x7f\x76\x40\x9d\xde\xf4\x11\xad\xe8\x0d\x47\xcb\x41\xad\x2b\x7b\x9f\xed\xa4\xfc\x55\x74\x5f\x73\x2b\x71\xf4\x7b\xb5\x6f\xe8\xec\xf4\x59\x31\x60\xa9\xaa\x77\xd4\x43\x8a\x4d\x56\x49\x96\x7b\xdc\xe6\xa8\x35\x77\x23\xf8\x25\x89\x07\x50\x25\xba\xfd\xee\x88\x5b\x39\x91\xd4\xae\xa5\x8d\x63\x7f\x3c\x62\x5d\x34\xfc\xa1\xf2\x63\xcd\x8b\x8a\x53\xab\x42\x36\xba\x47\x45\xba\xf2\x3f\x04\xe0\x01\xd4\x87\xde\x0f\x7e\x9e\xb7\xf3\xa8\xc2\x2c\xf5\xd8\x4e\xed\x8d\x1f\xa8\xd7\x7d\x15\x22\x9a\x4d\x70\x96\x7d\x55\xe3\x62\x71\xa8\x4f\xd0\x58\xcb\x2d\xdc\xbf\x99\x0d\x87\xc7\x03\x49\x19\x58\x86\xc3\x88\x55\xa4\xe3\xc0\x32\x1d\x46\x54\x22\x2d\x38\x96\xf1\x30\xa2\x0f\xd9\x11\xd8\x5a\xc9\x2e\x22\x1c\xb1\x0a\x5b\x2e\xf9\xb3\x94\x90\xc5\x87\xa5\x98\xc0\x88\xb9\xbf\xaf\xd7\xc4\xd2\x4c\xfe\x20\x36\x91\x14\x8e\xad\x9a\xfc\x29\x13\xc8\xa4\x02\x4b\x38\x41\x72\x01\x32\x3f\xc1\x92\x4e\x60\x44\x1d\xdd\xf2\x34\xe1\xbf\x49\x28\x40\x52\x9c\x40\xca\x0e\x00\xa8\x0f\x4d\x60\xed\xaa\x03\x29\x7d\xbc\xbe\x35\x90\x68\x3d\x74\x93\x28\xdf\x37\x30\x3e\xb6\x97\xf9\x9a\xa7\x20\xf5\xd0\x67\xf2\x6f\xeb\x82\x41\xad\x00\xda\xfa\xcf\xab\x99\x4e\x8f\x09\xd4\x2a\x29\xfb\x6a\x90\x17\x35\x7f\x4f\x72\x31\xa2\x91\x9c\x55\xbd\x39\x4f\x5f\x52\x87\x1f\x22\x32\x09\xca\x68\xc6\x03\x89\x7b\x68\x41\xaa\xc6\xaa\xa9\x43\x93\x58\x32\x9e\x5e\x64\xc0\xf7\xad\xf2\xd9\x69\x65\xe6\x0b\xe3\x90\x92\xf5\xe2\xbb\xce\xb0\x75\x67\x53\x21\x3c\x80\x06\xd0\xf2\xeb\x34\xf1\xf3\xda\xb6\x60\xcb\xa7\x83\x35\x3d\xf3\xf5\x6f\x8c\x6d\xa5\xb8\x4a\x67\xf8\xdb\x5d\x08\xcf\x4e\xfd\x48\xb5\xda\x22\xf1\xc0\xfd\xab\xd1\x7f\xd6\x1e\x32\xf9\xc1\xb2\x1b\x46\x6c\xd1\xc2\xd9\x18\xcb\x74\x38\x1b\xdf\x83\x6f\x81\x65\x3b\x7c\x8b\x01\xa4\x7b\xc0\x12\xb1\x60\x44\x3d\x0d\x72\x84\x0a\x4b\xcc\x02\x92\x10\xdd\xff\xde\x94\x19\x88\xee\x2d\x8b\x04\xd8\x06\xd6\xfa\x6d\x87\xeb\x38\xad\xac\xa4\xae\xa7\x5b\xf6\x13\x54\x72\x3c\x18\x23\x7b\xa6\xab\x76\x8f\xd0\x2a\xb8\xd0\x17\x0f\x20\x2f\x74\xef\x5a\x51\x71\x99\xbb\xfb\xa8\x51\x84\x48\xce\x3d\x83\xfb\xeb\xc5\x03\x71\xfb\x2f\x74\x6f\x0c\x4e\xd5\x99\x84\x55\x6f\x9a\xda\x3c\x55\xc0\x03\xa8\x03\xdd\x38\x84\xb1\xd1\xdd\xb4\xb7\x4c\x3e\x6f\x4d\xa5\xd5\x44\xe6\xa3\xef\x73\x50\x9b\x96\xab\x4e\x66\xd5\xa4\x3c\x22\x50\xfa\x89\xff\x4b\xaa\x9d\xe4\x84\xb6\xa7\x37\x5b\xa6\xc5\xca\x25\x53\xbb\x7c\xb6\x71\x92\x69\x6d\x6a\xb3\xe1\x30\xcf\xc7\x3e\xa3\x80\x8a\xca\xb5\x85\x25\x61\x9e\x33\xf9\xb8\x7f\x33\x1b\x8e\x4f\x20\xd2\x25\x62\x19\x0e\x23\xbc\x90\x4e\x14\xcb\x74\x18\xd1\xf1\xf7\xd5\xae\x18\xc6\x23\xe9\x98\x79\x39\x8d\xf8\xdf\x74\x45\x20\xc5\xe1\x4a\x49\xe0\x84\x07\x50\x27\x5a\x6e\xa1\xa1\x7f\xb7\x8f\x82\xab\xff\x9e\x07\xd5\x48\xb5\xd8\x54\x01\x13\x59\x6f\x6c\xaf\xba\x30\x79\x6d\x5d\x66\xc7\x5a\x4b\x62\xd3\xf5\x9d\x06\x19\xdd\x2f\x51\x7f\x49\x6e\xcd\x6a\xdf\x67\xc7\x7a\xeb\x7c\x70\x3b\x61\x3e\xbe\xd2\x96\x52\xf3\xb3\x92\xbd\x5a\x44\x96\x12\x78\x4f\x3b\x52\xb6\xc3\x63\xd1\x3c\x9f\xf6\x88\x1f\xdb\xd5\x9b\x24\x9f\xd8\xf3\x14\xe5\xc2\x82\x73\x21\xfe\xd6\x4b\x63\xc9\x07\xbe\xcf\x9a\x0e\xa7\xee\xe7\xf4\x36\x81\x76\xf2\x24\xba\x7e\xfa\x05\xe9\xe9\x38\x78\x72\xb7\x9f\xe9\x8d\xf9\x6a\xb2\xcc\xa5\xf5\x40\x8c\x07\xb8\xb2\x3f\x9c\xfd\x9a\xd9\x3c\xa4\xfd\x3b\xfa\xcc\x0e\x23\x45\xd7\xc3\x17\x3c\x22\x22\x96\x87\x0c\xd3\xcf\x3e\x71\x09\x7e\x22\xe5\x78\xa3\x76\x7a\xf0\xbe\x91\x1f\xd5\x42\xfb\x9c\xd6\x94\xed\xda\x87\xcb\x78\x00\x79\xa3\xaf\x87\xd2\x4e\x6e\xed\x5d\xf5\xea\x7b\xa4\xdc\x93\xa3\xec\xf1\x80\x6b\x2a\x8d\xa4\xd1\x28\x92\x62\x63\xf3\x6b\x51\x4f\x41\x80\xd3\x3c\x00\x50\x21\x5a\x47\x78\xc2\x2f\x9d\xfb\xf3\xcb\xc9\xcd\xea\xd0\xa6\xda\xdb\xd9\xcf\x87\x8d\xa8\x37\x14\xac\x2c\x1c\x4b\xdb\xaa\x2a\x73\xf6\x2c\x5c\x49\x03\xd0\x1a\xda\x7c\x91\x51\x0a\x82\x21\xcd\x08\x72\x85\xb2\x90\xa7\xfa\xa3\x02\xdc\x16\x2d\xa9\x06\x47\xf9\x4e\x9b\x57\x0c\x8c\x41\x25\x8e\xf1\x7b\x71\xff\x16\x75\xf8\xf9\x76\x22\x4a\x11\x56\xdc\x11\x36\x83\xb4\x93\x58\x91\x47\x64\x07\x84\x7c\x63\xc5\x1e\x29\x6c\x48\x13\x80\x15\x7d\x44\x44\x40\x4a\x3a\x66\xfc\xff\x20\xbc\x11\x04\xf6\x13\xd8\x45\x14\x22\x42\x05\xd6\x43\x80\x11\x6b\x88\x1f\x58\x22\x3b\xd2\x04\x20\x3b\x14\x4b\x66\x87\x11\x93\x8c\x48\x3f\x89\x29\xb7\x4b\x92\x13\x48\xd8\xe1\x01\xe4\x88\x9e\x8a\x99\x71\x51\xf2\x68\xa4\x11\x56\xaf\x7d\xc0\xa9\x4a\xf3\x88\x5e\x92\xfc\x96\x30\x53\xf9\x38\x3d\xab\xeb\xc3\xaf\x3d\x5b\xbc\xba\xce\x00\x40\x99\xe8\xbc\x27\x55\x17\xdc\x29\xd5\x4b\xf0\xe3\xac\x59\xf7\x73\xe3\xd3\xfb\x1f\xdd\x8d\x28\xa5\x61\x62\xf7\x31\x14\x14\x14\x6e\x0e\x4e\x9b\x7c\x00\xa0\x06\xb4\x8a\xfe\xfc\x1c\x11\xad\xcc\x3e\x28\x3b\x85\x8c\xd4\xe4\x28\x6f\x7e\xd5\xc0\xc8\x6b\xf9\x9f\x03\xfe\x63\x9c\xea\xb8\x58\x06\xe2\xa2\x49\x3c\x80\x8a\xd1\xd5\xb3\x64\xfe\x66\xb1\x9b\x4c\x76\xd3\x2d\x39\x77\x0f\x03\x3b\x3b\xab\x2b\x44\x26\xd0\x06\x65\x9e\xd0\xbc\xa7\x1e\x9d\x8e\xb0\xc7\x16\xee\x1f\xad\x86\x15\x2c\x84\x36\x60\xdb\xbd\x8b\xc8\x44\x12\x31\x96\xe9\x30\xa2\x01\x39\x95\x82\x65\x3c\x8c\x28\x46\xca\x27\xf6\xc8\x63\x17\x81\xff\xfb\xef\x0b\xac\xa9\xc7\x1f\x84\x0b\xb2\xb5\xb1\xe7\x1e\xbb\x88\xb7\x48\xcf\x8a\x39\xfa\x80\x0b\x0a\x62\x15\xf6\xf0\x63\x17\xe1\x83\x14\x2d\xac\xf9\x07\x22\xea\xfc\x5d\xe0\x58\x73\x10\x20\x29\x4e\xb8\x77\xa7\x71\x48\x45\x57\x94\xfc\xa2\xf6\x63\xe3\x87\x2e\x4f\x1e\x2e\xef\xc8\x92\x0a\x10\x21\xc9\xaa\x09\xfa\xf1\x8c\xf5\xa2\x36\x43\xe2\xcc\x64\x4b\x34\x4f\x21\x1e\x40\x0e\x68\x51\x8d\x87\xe2\xe7\xef\x43\x6e\xbc\xa7\x2e\x31\xc9\xe8\x8c\xa9\xa7\x7f\xe2\x63\x7a\x97\x38\xc7\xf0\xea\x1a\x73\x9a\x4a\x02\x7e\x56\x6a\xa7\x42\xb8\xa3\x2b\x10\xe5\xf8\xf9\xfb\x26\x33\xfe\x13\x4e\x94\xcd\xc5\x36\x45\x71\x22\x26\x15\x01\xba\x13\xa3\x9c\x81\x46\x54\x1a\xfc\x4a\x66\x84\x77\xf0\x40\xe2\x00\xea\xf2\xb7\x50\xa8\xbe\x0d\x69\xd3\xf1\x67\xcc\x02\x6b\x43\xcd\x9c\x7a\xf3\x65\x3a\x42\xdf\x5f\x66\x67\x67\xf4\xd3\xd5\xb4\xbc\x8e\x62\xc4\xfd\x9b\xd5\x70\x78\x52\x91\x7c\x8c\x65\x37\x8c\x70\x40\x38\x2b\x96\xe5\x30\xc2\x9d\x1e\x6e\x28\xb1\x8c\x87\x1b\xca\x03\xf0\x2d\xb0\x47\x51\x7f\x9a\x19\xa4\xcb\xc5\x9e\x46\xfd\x69\x28\x11\x04\xd6\x40\x0a\x46\x2c\x11\x2e\x37\x32\xec\x42\xbe\x87\x5e\x65\x0d\x9a\x7b\xbf\x51\x13\x9e\x54\x70\xab\xe6\x85\xfa\xf4\xd1\xb9\x86\x37\x02\x39\x1d\xef\xed\xd2\xb4\x65\x6d\xd2\x27\x81\xd4\xd0\xb6\xcd\xd6\x7f\x0e\xbe\xf0\x1e\x67\xd7\xb1\x37\xda\xa3\xa5\x52\x17\x48\x3a\x7e\xce\x89\xba\x2b\x7b\x90\x4e\xcb\xe9\x8a\xeb\x29\x46\x12\x5d\x5e\xf3\x09\xf4\x23\xe6\xea\x93\x39\xbb\x8f\xba\xd1\x2d\x3f\xf0\x8b\xf2\x44\x0b\x4d\x64\x99\xd8\x76\x5c\x39\x4e\xcb\x5c\x36\x61\x83\xf2\x65\x5f\x7f\x2d\x00\x50\x2f\x7a\xa2\x16\x9d\xd7\xac\xee\xf2\x31\xdb\x0d\x90\xd4\x3d\x3a\xde\x24\x96\xbe\x12\x96\xc1\x99\xa6\x3b\x3a\xf4\xc6\x30\x9d\x65\xae\x88\xfd\x04\x80\x46\xd1\x2d\x46\xd9\xc9\x57\x11\x3a\x85\xad\x32\x2c\x7e\x26\x2b\x3e\x04\x61\x7c\x94\xb4\x27\x3e\x34\xe5\xb3\x50\x65\x85\xf1\x0a\x44\xde\x3c\x36\x6b\x07\x24\xce\xa3\x4f\x35\x4e\x7d\xa8\xa8\x56\xa6\xe0\xa2\xd6\x8c\x4a\x24\xed\x6e\xfb\x95\x7f\xd1\x3b\x65\xac\x4a\x53\xed\xb9\x79\xb8\xde\x5a\xd2\x7b\x2a\x00\x95\xa0\x97\x7f\x59\x59\x8a\xf1\x37\x61\xeb\xd9\xb7\xa4\x41\x17\x1f\x0a\xcf\x38\x64\x3c\x70\x16\xb9\xce\x1a\xaf\xf1\x2c\x55\xf0\xe4\x93\xb7\xbd\x0d\x00\x5a\x43\xb7\xd9\xca\xcf\x7e\xb2\x95\x25\x44\x92\x0b\x8b\x2f\x5b\x9c\x54\x3c\xa8\xb7\x66\xfe\xcb\x9f\xf8\x4b\x3a\x4e\x8b\xc0\xca\x8f\xaa\xd0\xa8\x13\x0f\xa0\x72\x34\xf9\x7a\xcb\x66\xe8\xd8\x77\xfa\xf9\x76\x1d\xa5\x73\x1c\xe3\xc5\xce\xeb\x0c\xa3\x65\x57\xa6\xcc\x88\x4b\xcc\x44\x0f\x46\x1c\x78\x7c\x74\x04\x00\xa8\x03\xad\x2f\x9c\x63\xbd\xf2\xce\x74\xf3\x4d\xdd\x39\xdd\x7b\x1c\xab\xc1\x56\x6c\x51\x84\x72\x7d\xef\xd5\x68\xa8\x8a\x57\xf4\x3d\x46\xbe\x37\xbc\x06\xd0\x12\x7a\xac\xf4\xd3\xce\x46\x67\x64\xd3\xc2\x6d\x21\x44\xec\x3c\x0d\xad\xb5\xfd\xfc\x6c\xbd\x9f\xf5\xdb\x68\xd6\x46\x09\xc3\x5b\x35\x07\xa3\x04\xf0\x00\x72\x43\xff\x3c\xfb\xbe\x1c\x27\x19\xca\xb3\x4f\x38\x7e\x19\x67\xcb\x98\x58\xd1\xb9\x81\xc9\xc4\xd6\xf6\x65\x3a\xbf\x8b\x2d\xde\x64\x95\xf9\xe5\x76\x00\x8a\x43\x53\x4d\x51\xe6\xf5\xf6\xc9\xc5\x1c\xd6\x78\x43\xe5\xcf\x07\xb2\xd2\x78\xb8\x37\xa2\x62\x85\x43\x89\x7f\x0e\x92\x1d\x3f\x60\x49\xda\xca\x05\xa0\xb1\xff\x9c\x1e\xf0\xa1\x3c\x5d\xe7\x97\x50\xa6\xe2\x1c\x2d\xc4\xff\xe1\xe1\xf3\xe3\xd7\x6b\x45\xdf\x36\x6b\x5e\x75\xb6\xf8\xf8\xf9\x4a\xf2\x27\x21\x00\xad\xa1\x53\xd5\xc0\xb4\x02\xf7\x11\xd3\x56\xde\x7d\x9c\x54\x93\x26\x2c\x99\xdf\x93\xf7\xa6\x13\x6a\x98\xe8\x5e\xdd\x0e\xb8\x99\xd7\xb2\x29\xc5\x81\x1e\xda\x56\xe9\xc5\x35\xbc\x13\xb7\xc8\xa4\x2f\xec\x0d\xbb\xa2\x3a\x74\x86\xc6\xd4\x28\x78\xe3\x5c\xf0\x19\xda\x0b\x02\x16\xba\x6f\xce\x01\x00\xc5\xa1\x9f\x53\x00\xe5\xe8\xcc\x7b\xb9\xea\x46\xc5\x87\x8e\xeb\xd1\x9f\xc4\x15\xc5\x9c\x92\x7f\x3c\xcb\x3a\x73\xea\x01\x8b\xf2\xcb\x6f\x1f\xf9\xb6\x00\x54\x8c\xae\xf2\x26\x81\x9f\x87\x21\xc6\xc2\xbb\xdd\xda\x27\xce\x3f\x7e\x34\xd9\x65\x5f\xce\x53\x26\xf5\xf5\x6a\x45\x4c\xc5\xcc\x95\xdc\xb2\x64\x6a\x3b\x20\x61\x8d\xba\x9c\xdf\x51\x5f\xcc\x69\x86\x2a\xa0\x70\xf3\x42\x3e\xeb\x7e\xad\xe0\x76\xbc\x20\xd1\x5b\xa7\x30\x92\xcb\x8e\x14\xa2\xfc\x8b\x04\xf2\x00\xca\x42\x77\xb1\x82\xaa\x7d\xb6\x97\x05\xec\xe2\x3a\x2e\x74\x82\xac\x47\xcf\x1a\x46\x3c\x82\xe2\x1f\x6e\xa8\x9e\x9e\x64\xa4\xdf\xbf\xf6\x8a\x24\x14\x40\x39\xe8\x23\x1e\x46\x92\x09\x45\xbf\x45\xfd\x27\x88\xbc\x5a\x8a\x8e\x29\x76\x55\x91\xb6\xf5\x9c\xdd\x23\x72\x7f\xc5\xf0\xc6\x36\xf7\xb9\x1f\x92\xaf\xed\x00\xe4\xff\x9f\x7f\x49\xf8\x30\x1d\x22\xb5\xd0\xa7\xeb\x3c\xc3\xf3\x48\xc1\x2f\xee\x68\xa1\xe0\xb0\x45\xcf\xdd\xd3\x1d\x21\x43\x02\x54\xc4\x36\x82\xe1\x00\xca\x43\xaf\x99\xd3\x9b\x44\x92\x5f\xc9\xb2\x1c\x6a\xa3\xd2\x55\xe8\xd6\xd8\xc8\x2e\x78\xfd\xae\x78\xf1\x7d\xf3\x68\x66\x2f\x95\x63\x8b\x32\x73\x3c\x80\xca\xd1\x0f\xe9\x9c\x56\xcc\x19\xda\xee\x91\x22\x6a\xd7\xfd\xef\x75\xed\x4b\x40\x67\xb1\xe0\xa1\x6d\x4a\x5b\x6b\x77\x32\xa6\x0f\x35\xa1\x1d\x8e\x76\x00\x0a\x45\x47\x9e\xc9\xf3\x9d\x94\x27\xa1\xd5\x74\xd7\x4d\xa7\xb5\x26\xc7\x0b\x8b\x24\xed\x73\x16\xb1\xb3\x73\x4f\xa9\xfb\xbd\x2e\xab\xf8\x1e\xba\x0f\xa0\x22\xf4\x92\x19\xf8\x56\xdd\x13\x24\x62\x3f\x11\x62\x28\xf0\x62\x81\xc4\x54\x53\x93\xac\xab\x6b\x5d\xd6\x4f\x76\x69\x20\xb7\xc0\xb5\x2f\xcf\x10\x40\x9b\x68\x5f\xaf\x65\x86\x49\x48\x93\xfe\x74\xa6\x7d\xaa\x35\x61\x50\x64\x16\xfc\x73\x31\x2c\xfb\x62\x6b\x21\xa9\xfb\xd2\x6f\x79\x5c\xbd\xd5\x33\x3b\x00\xe5\xa1\xfb\x2b\xd9\xe0\xea\xe6\xd2\x22\x3a\xc6\x63\x72\x0a\x2f\x6b\xe4\x42\x9c\xac\x0e\x6c\xf0\x74\x1d\x9a\x97\xd0\xe5\x17\x1b\xec\x31\xbf\xe9\x01\xa0\x01\xb4\xb3\xbc\x6a\x19\x0c\xcc\x5b\xfc\xfa\xcb\xb7\xc9\x7a\x1b\xa4\xda\x6f\x4b\x9b\x53\xeb\xa7\xcd\x5e\xe3\xbf\x6c\x63\xd2\xb0\x1d\xd4\x36\x0a\xa0\x11\x74\x6a\xa2\xf6\x66\x5b\x4c\x37\x63\x4f\xee\x58\x0b\xdd\x7b\x77\x46\x47\xec\x52\xbf\x5b\x8d\xe2\xc8\x11\x8d\x37\x77\x52\x39\x6a\xbe\x4e\x16\xda\x01\xc8\x13\x7d\xbd\x41\x96\x75\xfc\xa5\x54\x4e\x4f\x83\x96\x9b\x54\x2a\xac\xe7\x66\x3d\x52\xa9\xa2\xef\xd9\x70\xda\x64\xdb\x50\xb0\x0a\x7b\x4d\xdf\x07\x50\x10\xfa\x72\x76\xdb\xb2\x2c\x87\x7d\x6d\x5f\x82\xdf\xe5\x54\x91\xb0\xf8\x91\xf3\x94\x9a\x84\x5d\xbf\xc1\xe1\xe2\x6e\x9b\xf2\x2d\x73\xd9\xea\x25\x80\x0a\xff\xf3\xca\x27\xb2\xfc\xfc\xea\xf0\x56\xd6\x93\x3a\x8b\x97\x1e\x34\x92\x8b\x40\x89\xfc\xba\x0a\xaa\xcd\x0f\xc8\x26\x6d\x9b\x3c\x67\x9e\x1c\x42\x87\x65\x60\xbb\xb6\x56\x78\x0a\x47\x94\x16\xfc\xf0\x87\xff\x67\x9c\xd1\xdd\x0b\x51\xd7\x1d\x85\x7c\xb7\x09\x06\xcd\xdd\x79\x2e\xbe\x07\x40\x02\xbd\x3d\x5c\x3a\xa5\x0f\x13\xce\xb7\x57\x7a\x8c\xd6\x84\x5e\x48\x33\x6d\xa9\x32\x34\x32\x99\xe2\x9e\x8c\x19\xd2\xca\x3a\x46\x79\xc7\xf9\x07\x80\x82\xd1\xeb\x5d\xce\xc2\x26\x29\x65\x7f\xe9\x78\x62\x23\x53\x4f\x05\xbb\xc2\x9c\x39\x23\xd3\x0c\x4b\xf1\x32\xf8\xce\xde\xa6\x1c\x6a\xf0\xe4\x39\x00\x50\x10\x5a\x8b\xd8\x6f\x34\x70\x37\x6f\xce\x5a\xe6\x21\x91\x53\x47\xff\x45\xce\xad\xd5\xd2\x2a\xe1\x20\x92\x53\xa1\x20\x0f\x68\x9e\x6c\xfa\x94\x07\xa0\x62\x74\x0b\x1f\x73\xbe\xb0\xde\x6a\xcf\xcf\x35\xb2\x6f\xc5\x71\x6b\xc5\x52\xe5\x07\x92\xdd\xe5\x75\x12\xd3\x27\x6b\x94\x59\xc0\x53\xbd\xbd\x9e\x78\x00\x05\xa2\x93\x98\xd7\x7c\x10\x9d\xf5\xcb\xe6\x68\x1f\x8e\x29\x05\xaa\x11\xde\xcf\x8d\xb7\xa4\x4e\x89\xaf\x98\x19\xad\x70\x33\xe8\xba\x25\x9d\x78\x82\x07\xd0\x17\x34\x87\x77\x64\x3b\x29\x19\xae\xdc\x39\xd9\xf7\x53\x2a\x7c\xcb\x63\x90\xb8\xca\xe7\x3a\xa7\x1b\x59\x8a\xf4\x8f\x5c\xbe\xfd\x71\x3f\xb4\x7a\x50\x97\x66\x3d\xbc\xc7\x6b\x42\x43\x51\xa3\x6f\x7a\x37\x34\xa2\x48\x20\xd2\xce\xe0\x85\x45\x8e\x48\x89\xbf\x4d\x37\x45\xa5\xc9\x77\xa9\x37\x3b\xad\x2c\x7a\x6b\x6f\xdc\x0a\x53\x74\xf9\xae\xa8\xb1\xa1\x46\x5c\xa0\xfe\xf1\xfe\x8b\x27\xef\xb5\xca\x8f\x38\xc4\xd8\x2e\x79\x47\x47\x16\x55\x69\x18\xe0\x01\x54\x85\x36\x9d\x25\xf6\x22\x09\x8f\xe6\xc9\x9e\x47\xfd\xda\x54\xf3\xdd\x5e\x77\x6f\xcb\xf5\x05\x5e\x70\x69\xf5\x3a\x4d\x25\xa0\xd7\xbd\xff\xfb\x20\x00\xd0\x04\x7a\x6f\x4f\x47\xb2\x86\xdc\xdd\xf8\x75\x80\x4e\xb9\xf2\x69\x1a\x75\xdd\xaf\xce\x0b\x8c\x99\xc4\xc3\x7d\xfa\x4d\x15\x96\xc9\xf2\x5a\x8f\xc4\x01\x34\x85\x5e\xee\xa1\x13\x2e\x33\xfc\x81\xe3\x1e\x7a\x2a\x53\xae\x0f\x63\x4c\x8b\x2e\x3a\xae\x38\x24\xe7\x74\xe7\xcd\x0f\x85\x89\x6f\xfd\x72\xb7\x43\x33\x71\xa5\xa3\x42\x55\x4a\x57\x1e\xf6\xf3\xad\xd2\x79\x0e\x08\xf1\x3a\xc7\x1e\x2e\x2f\x88\x78\x3c\x77\xe4\x51\x73\x51\x93\x98\xe5\x3b\xd4\xa5\x2f\x37\x45\xe6\x4b\xcd\xb2\x9d\x6e\xda\x46\x7f\x3b\xd3\x67\x59\xa8\x94\xd7\x5e\x13\xc8\x47\x88\x17\x92\x95\xce\xb3\x89\xb0\x81\xd0\xe3\x2b\xfd\xab\x49\x72\x1e\xb7\xd8\x46\xa7\x68\x0f\xcd\x89\x5c\x5a\x92\xce\x20\xcb\xee\xeb\xe5\xca\x0c\x3c\x30\xaa\x95\xbe\x4e\x6b\x85\xba\xb4\x90\x41\x49\xd4\x9b\xd6\xdf\xd3\x3d\xdd\xdc\xb4\xb5\x97\xba\x29\xa6\x28\x3b\x01\xa7\x7b\x88\xcb\x5d\x22\x49\xcf\xe1\x2c\xa3\x15\x00\x50\x36\x7a\x12\xa0\x58\xb9\x2e\x13\xb9\x8f\x68\x2d\xd0\x6b\xb3\x4f\xdc\xf5\xe8\x2b\x77\x7d\xa7\xb6\x73\x29\x6e\x7a\x67\x24\x88\xe9\x96\x45\x9d\x0a\x00\x34\x86\x4e\x2c\x05\x84\x9c\x96\x2f\x7a\x42\x78\x92\x34\x9b\x0e\xba\xa6\xd7\xac\x2e\x50\x87\xdc\x32\x3c\x0b\x5d\x15\x8e\x7b\x43\x19\x18\xe9\x73\x0a\x7e\x27\x09\x56\x5f\x04\xa4\x18\xfe\x7c\xf8\x66\x14\x6d\x8d\x81\x57\xcd\x3a\xa7\x11\xf5\xb2\x78\xa7\xc7\x8b\x36\xb7\xb6\xf6\x3d\xc2\xe6\xbd\x0b\xb2\xce\x44\x86\xa4\x97\x1b\xee\x19\xdf\xcb\xc2\x03\xa8\x00\xdd\x65\x27\x9e\x9a\x34\xa4\x73\x7b\xf0\x50\x6d\xba\x98\x86\x24\xc6\xff\x07\x6b\xad\xb1\xf1\x8d\x52\xc6\xdf\x2e\x57\xbd\x63\xce\x94\xf9\x32\xe0\x01\xb4\x80\x7e\xf0\xa9\x7b\x18\x67\x2a\x93\x93\x5e\x9f\x1b\x99\xe1\xaf\x21\xfd\xfd\xfe\xb6\x91\xd0\x8d\xa5\x44\x46\xef\x4f\x29\x62\xf4\xde\xf3\x44\x87\x01\x80\xca\xd0\xd7\x1b\x16\x8e\xb0\x9e\xbe\xe3\x9c\x72\x69\x98\xa8\xc0\x8a\x3c\x80\x79\x93\x99\xbb\xdf\x79\xfe\xfe\x77\xdd\xf8\x3b\xe2\xe7\x47\xae\x6d\x00\xe8\x27\x9a\xd6\xba\x95\x18\x67\x7a\x98\xa7\x1f\xab\x53\x60\x5b\x3d\x2a\x40\xa1\x78\xd2\xf2\xd5\xa5\xaa\x67\xd4\x24\x1a\xb5\xd6\x6a\x1f\x6e\x33\xb5\xe3\xfe\xcd\x4b\x00\xd9\xee\x1e\xd6\x47\xa8\x17\x96\x9f\x30\xa2\x00\x51\x55\x30\x3d\xfd\x83\x58\x40\x0e\x8c\x60\xfb\xba\x8b\x28\x43\x10\x58\xee\xc2\x88\x9f\x54\xc8\x57\x9e\x31\x9b\x60\xc9\x68\x42\x02\x7b\x00\x20\x80\xee\xc7\x8a\x92\xfa\x4b\x7e\xc9\xff\x7c\x92\xc8\x7d\xf9\xe5\x97\xd4\x7b\x2e\xdd\xa3\x4d\x8a\xdb\xc9\xfa\x3f\x5f\xd8\x2a\x31\x4c\x39\x50\x7f\x04\x90\x2b\x3a\x1d\x44\x3d\xba\xf6\x39\xd4\x14\xd2\xad\x1e\xf0\xdb\x48\xcb\xce\xfa\x2d\x54\x72\xfa\xeb\x68\xff\xe3\x4b\x5c\x9e\xdc\x0f\x57\x5c\xc4\xdc\xf1\x00\x2a\x41\xab\x6d\x6d\x01\xdd\x66\x69\x61\x55\x0f\xd2\xaa\x75\x4a\x8c\x5f\x9c\x3f\x34\x2a\x1d\x99\x23\xba\xff\xcc\x03\xb2\x3a\x55\xa2\x91\x10\x19\x2b\x3c\x80\x5a\xd1\x05\x67\xc5\x7a\x34\x60\x79\x39\x41\x82\x7c\x8c\x4e\x24\xc6\x30\xc5\x20\xe6\x5d\xf9\xaf\xef\xcf\x43\x5d\xe5\x7c\xf2\x69\x07\xa6\xf1\x5f\xf0\x00\xb2\xfd\xcf\x27\xd7\x5d\x82\xc6\xa4\x7d\x0b\x8e\xf8\x84\xd6\xfc\x12\xb8\x5d\x96\xe8\xff\xc3\x47\xe7\x4a\x99\x61\x8b\xae\x58\xdb\xc5\x15\xc5\x74\xf8\xdf\xd0\xd8\x5e\xee\x86\x13\x20\x73\x27\x2c\x47\x61\x84\x2b\xc2\x8a\xb0\x5c\x85\x11\x25\x88\xac\x85\xe5\x2c\x8c\x68\x45\xa4\x33\x2c\x77\x61\x84\x2d\x32\xa9\xc2\xa6\x3a\xbb\x88\x5e\x64\x8a\x84\xc5\x76\x90\x2d\x44\x0a\x93\x54\x6c\xc2\xf3\x3f\x84\xc4\x79\xe4\x16\x98\x94\xe7\x4f\xa8\x10\xe6\x8c\xc5\x7a\x60\xc4\x1a\x22\x77\x60\xf2\x9e\x3f\x88\x72\x64\x44\x87\xcd\x7c\x76\x11\x1d\xc8\x22\xc1\x22\x3f\x30\x62\x09\xd9\xd7\x58\xf4\x07\x46\xb8\x21\xf7\xc0\x26\x40\xbb\x88\x38\x64\x21\x62\x73\xa0\x5d\xc4\x18\x72\xe4\x0a\x8b\x06\x21\xd1\xfd\xfb\x36\x05\x4c\x3a\x24\xc5\x48\x48\x40\xf7\xbf\xaf\x37\xa3\xd3\x8d\xf2\x85\xa1\x73\x84\x69\x09\x77\x84\x3f\x4e\x87\xba\xbb\x68\xd0\x38\x7a\xbf\x3c\x4c\x7e\x8f\x3e\x9b\x3c\x6f\x82\xd0\x82\x4e\xe2\x1d\x1e\x40\x9d\xff\xa1\x7f\x4b\x92\xf7\x29\xfb\xc7\x04\x43\x6f\x1a\x34\x52\x33\x7a\x18\xcb\x0b\xbe\x0c\x51\x74\x72\x93\x70\x89\x87\x46\xa9\xb4\xf9\xee\xe1\x01\x94\x83\xee\x13\x6d\x4e\xc7\x95\x5a\x2f\xb5\x12\x65\x3e\x98\xaf\x25\x9e\x5b\x56\x73\x98\xff\xda\xce\xae\x70\xdc\xa5\x82\x9c\xcd\xb0\xc5\x26\xf8\x07\x1e\x40\x9b\x68\xf2\xdd\x2d\x2a\x14\x6e\x7a\x9e\xc2\x92\xfd\xca\x5b\x6f\x92\x37\xc2\x87\xb4\xce\x94\xe6\x31\xde\xb1\x7a\x36\x22\xad\x49\xed\xc0\x10\xb3\x07\xf7\x6f\x66\xc3\x01\xaa\xff\xfb\xd8\x30\x0c\x87\x11\x9d\xc8\x63\xc3\x32\x1d\x46\xe4\x20\x7a\x29\x96\xf1\x30\x62\x13\xd9\x46\xd8\xa4\xf4\xcf\x62\x42\xb6\x11\x16\x2f\x85\x11\xc5\xcc\x70\x36\xc0\xa6\xa6\xbb\xd9\xc0\x1a\xf9\x77\x17\x26\x39\xdd\xbd\x45\x16\xa2\xee\x63\xf1\x53\x24\x54\xc8\x30\x1d\x9b\xa1\xee\x22\xfc\x91\xc4\x89\x4d\x52\x77\x11\x79\xc8\xde\xc6\xe2\xa9\x48\xc6\x41\x14\x44\x6c\xa6\xba\x8b\x08\x45\x1e\x07\x36\x59\xdd\x45\x14\x21\x7b\x1b\x8b\xaf\x22\x8b\x04\xf1\x1c\x9b\xb1\xfe\xf1\x1c\x11\xd5\xb1\x49\xeb\x2e\x62\x00\xf1\x1c\x8b\xb7\xc2\x88\x11\xa4\xf4\x61\x33\xd7\x5d\x84\x27\x82\xc0\x26\xaf\xbb\x88\x20\x04\x81\xc5\x5f\x61\x44\x21\x1d\x92\x07\x31\x79\xac\x14\x85\x2d\x01\xc9\x4e\x1e\x74\x44\x77\xe3\xdc\xb2\x6a\xac\xca\xaf\x1d\x52\xf9\xf6\x3a\x9f\xa1\xd5\xb9\x2d\x37\xb2\xce\xae\xe6\xd6\xa5\x91\x95\x74\xa9\x22\x5b\x65\x70\x99\x00\x0f\xa0\x1e\x74\x1e\x7c\x14\x57\x32\x90\xdf\x68\x2a\xa8\x59\x67\x33\xf8\xdb\x7b\x4d\x67\x88\xc0\xcf\x3e\xaf\xe2\x38\xab\xc7\xf0\xb6\x7a\xee\xc2\xac\x09\x1e\x40\xef\xd0\xbc\xea\x64\x7f\x6c\x4b\x44\x22\x4b\x39\x8d\x38\xcd\x9a\xa6\x77\x3c\x7d\x93\xa4\x9e\x1d\xbb\x8d\xd7\x49\xe2\xf5\x32\x57\x45\xde\x4d\x0f\x3c\x80\xd2\xd0\x2a\x85\x8a\x14\x65\x7b\x73\x93\x51\xbe\xed\xb4\x62\x9d\xe4\x5e\x09\xb1\xca\x19\x59\x16\x4f\x92\x03\xbe\x5e\xdc\x17\x63\xd4\x36\xa4\x0d\x70\xff\x66\x36\x1c\x20\x47\xa4\xbd\xc6\x32\x1c\x46\xf4\x20\x79\x10\xcb\x74\x18\xf1\x0e\x59\x4c\x58\xc6\xc3\x88\x34\xe4\xbd\xdf\xd8\x72\xc2\x6e\x8e\x42\x52\x2d\xa6\xa0\xf0\xe7\x16\xc1\x48\x8e\xc2\x96\x14\xfe\xac\xbe\xbf\x27\x62\x31\x54\x05\x24\xd5\xfe\xfd\x56\x36\x86\xae\x00\x23\x02\x91\xe0\x62\x29\x0b\x30\xe2\x0b\x09\x72\x7a\x04\x4b\x61\x00\x52\x24\x84\xb6\xff\x7b\x1b\xb9\x2f\x9a\xdf\x9d\x12\x7d\xe1\x2f\x53\xaf\xc2\xa3\x37\xc1\x91\x0a\x3d\xce\x78\x59\xd2\xab\x73\xe8\xee\x0d\x6b\x83\xa0\x7d\xdd\xc5\x59\xe7\xc3\x6b\xf0\x00\x4a\xf8\xcf\x9f\x05\x8f\xcf\x32\xb8\x6b\x3b\x3f\x9d\x4e\x7b\xdf\x68\x9b\x92\x6c\xc0\xf2\xfe\x8d\xc6\xd4\xd8\x80\x74\x81\xde\x81\x08\x9b\xa5\x3d\xbc\x00\x40\x0e\x68\x0d\xdf\x88\x37\x22\xa4\xd6\x6c\xcb\xa2\x4f\xd4\x53\xac\x44\xaf\x24\x3c\x2e\x57\xe9\x6c\xfd\xa7\x5f\xe7\x45\x97\xdf\xb2\x3e\xd7\x1c\xa7\x01\xd0\x77\x74\xe3\xa1\x9b\x6a\xd1\x25\x43\x3b\x75\x17\x6f\xb2\xfc\x45\x0a\x1c\x32\xf9\x34\xc7\xa2\xa8\x4b\xc9\xee\x72\x66\x6f\x0d\x07\x59\x8a\x5a\x09\xee\xdf\xac\x86\xe3\xe3\x8b\x64\x7d\x4c\xbb\xff\x20\x12\x90\xa7\x86\x6d\xf9\x2e\xc2\x01\x69\xc9\xb1\x8c\x87\x11\xdf\xff\x1e\x9b\xc3\x90\x79\x60\x04\x1e\xa9\x90\x98\x42\xcf\x1f\x44\x15\xb2\x96\xb0\xa5\x9e\x5d\xc4\x04\x12\x2b\x2c\xb5\x07\x46\x4c\x31\x20\x07\xf5\xb1\x54\x1f\x20\x85\x3f\x42\x44\xe0\xb0\xc3\x79\xd0\x3c\xb2\xaa\x2a\xe8\xf2\x31\x0a\xda\xd2\xd3\x46\xa1\xc6\x47\x35\xe6\x75\x4e\x27\x04\x12\xf2\xb7\x35\xaf\xe0\xaf\xba\xa4\x14\x96\x1f\x6e\xc7\x03\xa8\x1d\xad\x5c\x8a\xdf\x64\xa3\x09\x16\x3e\xb5\xff\x95\x96\xe5\x47\xa5\x3c\xe2\x27\xd5\x0f\x84\xcf\x90\x96\x37\x30\x3c\x99\x35\xa7\xca\xbd\xc6\x65\xb4\xd3\xa9\xa1\x79\x67\xf8\xfd\x28\xfa\x40\x8b\x71\xed\x01\x7c\xd9\x47\xf5\x0e\xc6\xa8\x6f\xc3\xa7\xb9\xc4\x84\xc5\x5f\xf4\x7e\x37\xce\x23\xc8\xbf\x59\x82\x07\x50\x24\x9a\x07\x5b\xac\x96\xad\x0b\xa5\x5f\xca\x98\x35\x34\xd2\x1b\x28\x7a\xd0\x7c\x8c\xbc\xd3\x58\xc6\xed\xdb\xb8\x94\xce\xc1\xc7\x6a\xf8\xb7\x42\x78\x00\xfd\x40\x2b\x80\x87\x6d\x7e\x35\xa6\x8a\x64\x54\xdf\xb7\xe0\x35\x3f\xb6\x38\xb4\xb7\x72\x2e\x58\xe0\xc7\x49\x46\xee\xeb\x44\x8b\x46\xb7\x2d\x39\xe1\x53\x9e\x58\x6e\x22\x7c\x10\x29\x71\x58\x8e\xc2\x88\x76\xa4\x81\xc0\x72\x15\xe9\x64\x91\x06\x02\xcb\x59\x18\x11\x89\x30\x61\x2c\x77\x61\xc4\x0f\x12\xa4\xf0\x62\x69\x7c\x40\x8a\x84\x48\xfe\x7f\xff\x76\x5b\x44\x17\x3a\x73\xfe\xbb\x85\x66\x1e\xb8\xf3\xd6\x46\x04\x29\x8f\x79\xbe\xdf\x29\x69\xbe\xac\xf2\x24\xea\x9c\xea\xbb\xa4\xa6\x2f\x8a\x34\x9a\xd3\x78\x00\x85\xa0\x0b\xef\x92\x8a\x30\xeb\xb1\x0f\x16\x0f\x9b\x38\x2c\x54\xe3\x7d\x3a\x97\x13\x99\x8b\x71\x54\x6a\x63\xac\x1f\x4a\x29\x8d\xb6\x93\xbc\xce\xef\xe4\x02\xb4\xbe\x7a\xc0\x66\xee\xc1\x2b\xfb\x83\x65\x2c\x75\x6e\xef\x97\xda\x98\x3a\x8e\xad\xfc\x7c\xf2\x98\xa6\x20\xf7\x40\x03\xf3\x11\xc2\x92\x78\x8d\x9d\xe6\x1a\x9d\x26\x79\x1d\x8f\xc6\xd3\xec\xd1\x3b\xfb\xb2\x43\x07\xa2\x7f\x79\x2e\x5e\xa7\xd1\xae\x42\x9a\xef\xd3\xda\xa7\x9b\x19\xfb\xe7\xca\x04\xdc\x71\xff\x66\x36\x1c\xa0\x45\xa4\x27\xc3\x32\x1c\x46\x84\xfc\x1d\x04\x63\x98\x8e\xe4\x3e\x24\x67\x60\x19\x8f\xd0\x09\x32\xe4\xb1\x61\xe9\xad\x40\x8a\x83\x83\x80\x77\xe7\xb1\xc5\xa3\xe5\x3f\x95\xa1\xd8\x85\x0b\x94\x0c\xe4\x49\x35\xb3\x77\x82\xfb\x8d\xc6\xe6\xfd\xa6\xbf\xc5\xb5\x3c\x1b\x3f\xf4\x44\x4b\xf5\xeb\x9d\xb9\xef\x3b\x85\x94\xf6\x3f\x63\xc6\x82\xa6\x5e\xbe\x83\x3f\xc8\x12\x0e\x2b\xbf\xda\xc7\x33\xbe\xdf\xd1\x63\x8f\x59\xbc\xa4\x5b\xf9\x34\xd1\x74\xf2\x31\x23\x33\x3c\x80\x92\xd0\xfb\x33\xb9\x32\xfb\xca\x89\x83\x64\x81\x82\x5f\xbb\xce\xd5\x5e\x5d\x94\x3d\x16\xbc\x2a\x96\x1f\x1a\x72\xf1\xe5\x5e\x5c\xf6\x95\xad\xc5\x0f\x78\x00\xe5\xa2\xfb\x2b\x7f\xe1\xb6\xe8\xe6\xda\xf0\x77\x6f\xf6\xa4\x9b\x19\xcf\xd2\xe5\xca\xc6\x70\x47\x91\x18\xc7\x18\x56\x87\xf9\x45\x3b\x05\x07\x7e\xc0\xfd\x9b\xd9\x70\x80\xe2\xa9\xfe\x0a\x04\xff\xbf\xe1\x48\xdb\x80\xc8\x16\x58\xa6\xc3\x88\x24\x64\xb7\x61\x19\x0f\x23\x72\xff\xa6\x61\x4c\xed\x5b\x8a\x8a\x9c\xe4\x7f\x6f\x7e\xea\x42\x87\x49\xb8\xe1\xed\x22\x87\x10\x8d\x72\xe1\x05\xd3\x8b\x1b\x4b\xf1\x67\x9f\xd3\x8c\x37\x1b\x39\xef\xe9\x6b\x7f\x2a\xec\x12\x36\x90\x44\x84\x07\x90\x1b\xba\x2d\x7e\xc6\xf6\x94\x9b\x71\x32\x83\xef\xc9\xbc\xa5\xc2\x04\x2f\xed\xc4\xf1\x53\x92\x6f\xd8\x45\x2a\x58\x48\x7c\x65\x7e\x7f\xfa\x9d\xea\x85\x07\x50\x2a\x7a\x37\x6b\x73\x3c\x30\x09\xdf\xcb\xd3\x1a\xfd\x66\x7f\xaf\x91\x90\x01\xf3\xfd\xec\xfe\x63\xdb\x9a\xe6\xd4\x4f\xcb\x14\xfc\x86\xb4\xef\x72\xe3\x01\xf4\x1e\xfd\x98\x55\x1d\x5c\x49\x56\xbb\x72\xad\xd8\x06\x94\xf8\xd8\x7f\xb7\xe6\xbd\x72\x57\x7f\xaa\x96\xba\xd1\x7f\x38\xf5\xde\x07\x41\x95\x5f\xb5\x78\x00\x25\xa2\xcb\x02\xfb\x82\x51\xce\x85\x93\x33\x81\x41\x71\xa5\xab\x38\xff\x38\x05\x6f\x25\xb1\x75\x9b\x27\x14\x77\xca\x4c\xb5\x8f\x2d\x5c\xfb\x65\x8e\xfb\x37\x37\xe1\x80\x76\x21\x2d\x2b\x96\xa3\x88\x0e\x84\x34\xd2\x58\xae\xc2\x88\x54\x24\x03\x60\x39\x0b\x23\xde\x23\x0b\x03\xcb\x5d\x18\x91\x88\x14\x07\xec\x19\xc7\x2e\x22\x1b\xf1\x03\x6b\xcc\x81\xa8\x53\xd4\xcb\xcd\x4c\xbb\x90\xf3\x2d\x4f\xc2\x68\xf6\xbb\xb4\x4b\x26\x11\xe1\x6b\xde\x6e\x4d\x7d\xdc\xaf\x7f\xf5\xe1\xe3\xf4\x17\xc5\x39\x81\x5a\x3a\x65\xd6\xc7\x80\xd4\x50\xf7\xf6\xf6\x7f\x0e\x8f\x5c\x5d\x14\x0f\x7b\x28\xd9\x15\x53\x3c\xb1\x99\x75\x89\xaa\xd0\x20\xf0\x4b\x9d\x56\xee\x45\xfe\x40\x7f\x89\x73\x1f\x0b\x78\x43\x5d\xec\x00\x94\x89\x4e\xf3\x79\x22\x0b\x6d\xbc\x9e\x1d\x23\x59\x3e\xcd\x5b\x9c\xc5\x94\xfd\xb3\x11\x43\x5b\x6f\x5f\x88\x86\xe8\xf5\xe3\x24\x7c\xa3\x25\xce\x00\xe8\x13\xba\x3c\x9b\x44\xd4\x5b\xb0\xf7\xca\xfb\x25\x32\x66\x4b\x1f\xc8\x8e\xce\xd3\x8f\x1c\x14\x5f\x31\x23\x48\x4b\x2b\xe4\x3b\x7c\xb6\xa7\x50\x08\x40\x33\xe8\x5e\x75\xc0\x3a\x74\xb6\xb5\x55\xa8\xa6\x71\x74\xe5\x6b\xd0\xed\x9c\x18\x7f\x4b\xbc\x8a\x70\x8c\xc8\x07\x7a\x15\x6f\x1e\x42\x61\x3d\x1b\x3b\x00\x79\xa3\xc7\x97\xf5\x03\xe1\x15\x9e\x53\x9f\x73\x23\x3e\xb1\xf3\xd8\x39\x29\xbb\x85\x8b\xf9\x3b\x3f\x08\x4a\x0d\x3d\x3b\xb2\x38\xc0\xcc\xcd\xa8\x06\xa0\x10\xf4\xae\xf1\x7d\xfe\x31\xd0\x65\xbc\x28\xc4\x7b\x7b\x8b\x60\x7f\x4b\xca\x4d\xde\xa2\xfc\x5a\x0e\xe3\x83\x21\x55\xd3\x45\xd4\x7d\xcf\xf6\x9c\x00\x50\x24\x5a\xf3\xba\xef\xfa\xd0\xe5\x85\xb0\xe2\x9b\xb7\x21\x13\xa4\xc2\x93\x27\x5c\x7f\x42\xd6\x32\xf3\xfc\x67\xec\x57\xe2\x87\xc3\x6e\xc8\x36\xa3\x5f\xf8\xb1\xaf\xee\x63\x8e\x04\x99\x41\xde\x05\x4d\x5f\x62\xa1\x81\x96\x2a\xb5\x63\x87\x15\x58\xf6\x84\x66\x31\x6c\x70\xef\xf5\x10\x97\x62\xb6\x03\x90\x2b\x7a\x7f\xd5\xe7\x48\x0d\x38\xae\x56\xbe\xff\x1e\x7f\xa8\x46\x91\xf9\x53\xbe\x56\x5e\xca\xaf\x0b\x65\xa1\x25\x0d\x92\xad\x47\x16\xbf\x2b\x67\x03\x28\x18\x3d\xa9\x8f\xcb\x94\xba\x3c\x77\xb8\xfa\x06\xfb\x8d\x85\x6b\x27\xb7\x8e\xe3\x06\xbe\x80\x95\xfb\x07\x39\xc8\x26\xba\xed\x9b\xf7\xf9\x3c\x99\x02\x50\x29\xba\x87\xb7\xd4\xf3\x3f\xc1\x2f\xd3\xea\xf7\x26\xe8\x67\x9b\x45\xb3\xfe\x72\xe7\x06\x54\x75\xf1\x06\xeb\xc4\x31\x5c\x39\xdd\x15\xbb\x75\x62\x3c\x80\xec\xd1\xb5\x95\xb5\x80\x7d\x33\x83\x7f\x2b\x49\x85\x2a\xe5\x49\x27\xf5\xf5\xf7\xfb\x35\x53\xea\x78\x33\x2a\xe8\x5d\xeb\x7f\x5d\xc9\x9d\x2c\xbd\x8a\x07\xd0\x3c\x3a\xec\x02\x87\x0f\x71\x3a\x3c\xf0\x30\xca\x2b\xd9\xb6\x14\x66\x6f\x39\x2c\x56\x5a\xe9\x54\x15\x54\x97\x23\x6b\x7b\x3a\xf5\xe9\xbe\xb8\xa7\x3b\x14\x12\x5d\x94\xcc\xa3\xbe\xde\x55\x8f\xbf\x3b\x13\x58\x0c\x9e\x37\x5a\x92\x9e\xd8\x6b\x68\x98\xa8\xcf\x6c\x65\xcf\xa5\xc2\x7c\xb8\xe3\xc0\xc2\x25\x00\xa0\xb7\xe8\xa6\x91\x50\x3f\x6d\x66\xe8\x53\xcd\x8a\xfa\xcc\xb3\x73\x56\x4a\xd9\x8f\x14\x83\x5d\x3b\x08\x6f\xbe\xd9\x7b\x72\x21\xbd\x94\xee\x57\xe2\x2b\x00\xf9\xa2\xd7\x64\x4f\x52\xfc\xe9\x9f\xba\xe7\x45\xc9\x7f\x28\xea\xaa\x17\xcd\xa4\x0d\x76\x55\xcc\xe2\xf8\x70\xb9\x21\x6b\x57\x0c\x12\x64\x94\xe4\x00\x90\x40\x7f\xf0\x32\x58\x63\xf5\x7e\x6a\xf3\x31\xf5\x2f\x5e\x92\x05\x51\x26\x03\x10\x3e\xaf\x74\xcd\x27\xc6\xd1\xfe\x6b\xe7\xa4\xdc\x3b\xc1\xb3\x77\x00\x84\x47\xa7\xce\xc9\x27\x97\xf7\xaa\x08\x1c\xba\xfa\xf5\x4c\xf5\xe7\x37\xa1\x51\x0c\x67\x84\x16\x9c\x9b\xae\x4a\xf5\xeb\xb5\x73\xe1\x04\xad\x52\x33\xec\x00\x94\x80\x7e\x56\x49\xd2\x43\x94\x4d\x5f\xce\x48\x38\xdd\x70\xab\xdc\xbe\xa7\x9c\xbd\x16\x18\x96\x20\x4d\x7c\x32\x26\x6f\xfd\x89\x96\x5c\xf6\xf9\x14\x00\xb5\xa1\x97\xfc\x36\xcb\x4d\x8f\xcd\xcc\x98\x58\xd9\x20\x1d\x9e\x7e\x69\xab\x0b\xad\xca\x44\xa5\x9b\x33\xf9\x3f\x22\x5e\x9c\x88\xd3\xcf\x6e\x56\x01\x50\x2f\x9a\xfd\xf5\x67\x16\x88\xa8\xae\xab\x78\x7b\x7f\xfa\xd1\xd2\xb5\xfc\x8b\xa9\x91\xdd\xf8\x94\x9a\x63\x49\x9d\x27\xb7\xc1\xc9\x43\x8f\xdc\x0c\x77\x76\x08\x7a\x29\x3c\x94\x16\xd1\xbf\x1a\xf3\x4d\xde\xae\x46\x2b\x5a\x4e\x39\xf9\x66\x7c\xb0\xde\x21\xb9\xdc\x96\x9a\x6a\xcf\xc7\xe1\x6a\x17\x13\x33\x01\x14\x86\xce\xe3\x42\x5c\xe2\x35\x71\x54\x81\x22\xa9\x01\xcf\xca\xf4\x1b\xed\xd2\xdc\xce\xe4\x2e\xb0\x36\x1f\x79\x35\xcc\x42\xc0\xac\xc1\xbf\xe2\x0e\xa0\x7e\xf4\x83\x32\x33\x3c\x6e\x90\x76\xdd\x2f\x26\xfa\xf2\x08\x7b\xfb\xc9\x2e\xb6\x5e\xfd\x90\x95\x57\x94\xed\x50\x45\x69\x13\xd1\x36\x64\xff\xca\x0e\x40\x01\xe8\x9f\x2f\x3b\x2c\x77\xc5\xd6\xeb\x30\x30\x6f\x2a\x3e\x7f\xc7\xa3\x4e\xf3\x1d\x85\x51\x73\x01\x99\xcd\x80\x88\x42\x5f\x4f\x23\x8e\xf9\x28\x80\x22\xfe\xf3\xa1\xdc\xc1\xcf\xad\x66\x02\xa9\xcb\xf1\xa9\x21\xe9\x5d\x03\x0d\xbf\xd9\x64\x9c\x8e\x9b\xce\x0b\x24\xd4\xa5\x7e\x99\xd5\x27\x2e\x15\x01\xd0\x47\x74\x11\x3d\xe5\x63\xe9\xe6\x7e\xaa\xb8\x5b\xc3\x64\xc8\x5f\xfc\x11\xfd\x42\xb9\xbb\x97\x54\xc7\x55\xcb\x92\xe5\x1f\xcb\x8b\xca\xb3\xab\xa7\x77\x3a\x69\x74\x6c\x82\x44\x25\xbe\x5f\x58\xa3\xe3\x13\xba\x1b\xfd\x61\xd8\xf2\x74\xd1\xf1\xdc\xea\x10\x16\xdd\xa0\x69\x51\x93\xe9\x48\x5c\x53\x12\x2b\xea\x52\x09\xd5\x5b\x9a\x24\x1a\xb1\xa5\xfc\x0a\x67\x0d\x0e\xb2\x36\x75\x41\x84\xb7\x08\xbf\xfb\x13\xbb\xd1\xb7\x17\x94\x77\x76\xb7\xee\xb5\x03\x50\x07\x3a\x75\x78\x8d\x57\xa6\xaf\xa7\xc5\x46\xda\x55\x59\x9c\xf7\xb7\xc9\x64\xd9\xbf\xa7\x81\xad\xf3\x2a\x74\xf8\xa3\xdd\x87\xe2\x3a\xd6\x7e\x5b\x00\x8d\xa0\x17\xc1\x30\xf8\xb8\x55\x7a\xee\xb4\xe0\xc7\x4f\x37\x53\x92\x14\x56\xba\x27\x92\xf6\x6c\x47\x47\xb5\x4e\xbc\xe0\x78\x15\x78\xba\x75\x7f\x22\x80\xbe\xa3\x1d\x6d\xa4\xb8\x07\xa9\x0f\x7a\x79\xf4\x45\x2e\xfc\xa4\x5c\xdf\x04\xf6\x3a\x0f\x69\xee\x1b\x58\xfa\x3e\xab\xce\x5e\xcd\x7c\x17\x55\x88\x07\xd0\x16\x3a\xdb\x1c\x66\xbd\xe9\xda\x23\xdb\x23\xcd\xdd\x7b\x78\xc8\x51\x3c\xb6\xe8\x39\xb1\x7d\xd1\xcf\xb8\x9a\xac\x33\x74\x2d\x07\x06\x3d\x6d\x9d\x00\x80\x3c\xd0\x4d\xe1\xa5\x92\x14\xf3\x52\xca\x0e\x4b\xed\x81\xf9\x82\x58\xbb\x42\xd2\x90\xfa\x0d\xc3\x6b\xd6\xc6\x61\x19\x27\x49\xf9\x6c\xf2\x83\x16\x01\x54\x8c\x8e\xe3\x6f\xb5\x12\xf7\x52\xcd\x9e\xed\xe7\xbc\x45\xbf\x88\xa5\xd9\x9f\xd9\x4b\x53\x88\x0d\x83\x95\x5f\xe1\x04\x07\x41\xa2\xa2\xeb\x61\x3b\x00\x39\xa2\x8b\x02\x9b\x93\x43\x16\x5e\xa1\x79\xbb\xe2\x39\x11\xd3\xb4\xd0\x55\xb6\x73\x0f\x44\xf2\xae\x30\x93\x1b\x73\x5c\xe8\x30\xdc\x6a\x19\x57\x00\xd0\x57\x74\x2c\x7f\xbd\xe5\xd4\x2e\x8e\x5f\x8d\x38\xd6\x6d\xae\x99\x4c\xef\x2b\x3e\xc9\x2b\xa9\xa0\x66\xcb\xd9\xef\x39\x63\xf1\xfa\x49\xc2\x95\x61\x00\x4d\xa3\x77\x88\xec\xde\xdb\x01\x8b\x6d\xf9\x9f\x92\x83\xd4\x41\xc1\xde\x19\x95\x5b\x66\xbf\xee\x15\xbd\xe0\x1d\x33\x78\x3f\xfe\xe0\xf9\x19\x37\x45\xf4\xf1\x94\x41\x21\x0d\xc2\x5c\xea\x1c\xae\xcb\xb1\xa1\x6b\x76\xe4\x38\x93\xbc\x37\x32\xb4\x90\xa5\x99\x02\xb9\xa8\x4f\x4c\xd8\x91\x30\x00\x20\x57\xf4\xe9\x17\x81\xc0\x2a\xc3\x38\xeb\x8a\xe2\x01\x92\x6a\xff\x99\xc1\x43\xa3\x56\xe7\xb2\x66\x5f\x73\xe5\x7f\x2b\x34\x93\xf6\x66\xe4\x90\x12\x01\x50\x2f\x3a\x8c\x73\x5c\xe0\xd5\x91\xb2\x67\x5f\x0f\x06\x7e\xb6\x76\x7f\x6e\xe6\xe1\x70\x8d\x9b\xe6\x78\x88\xc7\x92\xd3\x5d\x17\x2a\x8a\x17\x15\xc6\xe8\xfe\x6f\xc8\x50\x33\xf1\xcc\xd2\xc4\xe3\x59\x01\x97\x88\x80\x01\xb6\xad\x67\xb3\x23\xc3\x49\x86\xd4\xd1\x2b\xc4\x53\x31\x54\x2b\xe5\x76\x00\xc2\xa3\x7f\x5a\xaa\xe9\x2d\x35\xc8\x7c\x59\x2b\xa9\x66\x24\x52\xe9\x10\xab\x76\xf0\x43\xf5\x03\x95\x28\xde\x13\xb8\x3b\xcd\x1e\xbe\x6e\xe7\xe5\x00\x94\x8a\x66\xf9\xb5\xa7\x78\x7b\xc3\x15\xbe\xcd\x6b\x34\x9e\xd1\xba\x73\xdd\x8c\x6a\xfc\x22\x2b\xee\xf3\x15\x05\xab\xe9\xee\xc7\xac\x8f\x5b\xbf\xf3\x00\x68\x0a\xfd\x80\x2e\x84\x0b\x6b\xd3\x56\xb7\x5e\xf1\xf3\xd3\x58\x17\x1d\xbf\x11\x26\xeb\xe2\xc1\xad\xa5\xfb\x74\xde\xcf\x5a\xf9\xc9\x15\xdf\x04\x52\x3b\x00\x39\xa1\xb7\xb5\xac\xb6\x78\xd2\x5b\xb2\x36\x73\x05\x37\xfb\x23\x15\x31\x9d\x6d\xa9\x3c\x19\x25\x23\xae\x27\x3e\xe1\xac\x5e\x9c\x0a\xde\x1b\xa5\x01\x20\x27\xf4\xec\x69\x90\x44\x7c\x82\xe0\x8a\x20\x7d\x61\xd8\xd8\xc2\x8d\x12\x3f\x3a\xbf\x1e\xef\x37\x3f\x95\xda\x5a\x12\x0d\xb6\x83\xec\xb7\x19\x2b\x01\x94\x82\x4e\x32\xa7\xdf\x70\x45\xd2\xfb\x2b\xcf\x3f\xbb\x4a\x35\x7a\xc3\xdc\xe5\x6e\x94\x6e\x53\x75\x58\xc0\x5b\xce\x31\x2e\x41\xaf\xf0\x36\x5d\xf4\x87\x28\x93\xd4\x7c\x7c\x68\xc7\xce\x79\x06\xcf\x4b\xe9\x09\xe6\xaf\x92\xd1\x36\x9a\x50\x1d\x0d\x18\xea\xdb\xef\x6c\x5c\x9c\xbc\xa1\xbb\xb3\x12\x6d\xff\xa3\xa5\xcd\xad\x1f\xfc\xac\x74\xe5\xb9\x65\xc0\x1e\x11\xf2\x3b\xd7\x80\x4c\xff\xdc\xd9\xe7\x29\xfe\xa4\x09\x87\xb3\xe6\x16\x49\x62\x34\x01\x54\x8c\xae\x7b\x4b\x65\x51\x2c\x03\x46\xea\xc6\x09\x4d\x47\x06\x44\x43\x62\x95\x1a\x2d\x92\x8c\x14\x7e\xf0\xa7\xf2\xab\x47\xd2\x75\xa8\x35\x97\x02\xa8\x05\xdd\x6e\x3c\xd5\xaf\xcf\x30\x90\x0d\xdf\xe8\xbc\x77\xee\xbe\xaa\xc8\x1e\x2a\xf9\x4b\xdc\x13\xe1\x83\x97\x35\x93\xf7\x19\x5b\x11\x87\x4c\xe0\xed\x00\x54\x84\xae\x63\x9c\x2c\xf1\x15\x17\x33\x38\xc8\x37\x82\x0b\x48\x8e\x3e\x94\x6d\x1a\x8b\x12\x2c\xcc\xda\xbc\x7f\x61\x4f\x7d\xaa\x96\xe4\xd6\x86\x3a\x80\x5a\xd1\x85\xc6\xe9\xcb\xa7\xaa\x9f\x6d\x4f\x07\x5d\x44\x26\xb9\xea\x7d\x26\x65\xbe\x96\x54\xdc\x08\xbc\x72\x52\xc0\x5d\x51\x6f\x62\xc5\x51\xe1\x3c\x80\x36\xfe\xf3\xd6\xa0\x47\xed\xb6\x21\xea\x31\xf7\x0d\xea\x0d\x0f\x5c\xf8\xa8\xa4\x9b\x37\x7b\xac\x50\x8d\x83\xe2\x1c\xc5\xff\x31\xf6\xe5\xf1\x54\x7d\xdf\xfb\xe6\x24\x19\x22\x43\x0a\x0d\x42\xca\x14\x4a\x25\x1c\x44\x29\x64\x1e\x92\xb1\x28\xa2\xc1\x98\xc4\xdd\x97\xcc\x42\x12\x91\x79\x16\x99\xe7\xb9\x48\x22\xf3\x2c\xf3\xac\x14\x42\xe6\xdf\xcb\xe7\xf7\xbd\xdb\x79\xff\x75\xfa\xff\x3c\xf7\xae\xb5\xf6\xda\x6b\xad\xe7\xd9\xfb\xde\x53\x7d\xd2\xf9\x71\xf9\xfd\xe3\xe8\x30\x0e\x95\x4f\xca\x2f\x2f\x79\xce\x7d\x98\x6d\x51\xfe\xc2\x98\x6b\x60\xc0\x56\xf1\xa1\xd2\xd6\xe7\xf2\x9e\xf7\xe3\x96\xba\x97\xbc\x00\x40\x7c\xd1\xfb\x62\xd6\x8e\x69\xe0\xd6\x1d\x77\x75\xa3\x99\x08\xbe\x2f\xc8\x10\x11\x73\xd1\xf9\x14\x85\x73\xec\xc5\xc1\xf1\x08\x0d\xaf\x5b\x8a\x33\x40\x96\xd0\xe5\x6b\xba\x2b\xb3\xe3\xf0\xd5\xd0\xd3\x55\xce\xb7\xa5\xe9\x1d\x73\x2c\xe5\x1d\x82\x75\xcd\xfe\x94\xde\x73\xbe\xbc\x5d\xba\x6e\xc2\x88\x27\x50\x60\xac\xd9\x14\xc8\xee\xa5\x24\xfa\xdf\x05\x9e\x6a\x74\xbe\x3c\xba\x62\x67\xa9\x59\x4e\x52\xc2\x93\xab\xce\xf1\x92\x8f\x65\xc8\xae\x6a\x4e\x5b\x31\xa4\x20\x9c\xdc\x7c\x56\xa5\xef\x08\x1b\x3b\x0e\x20\x53\xff\x51\x3a\xac\x1e\xc4\xd7\x6d\x1b\xad\xd0\xa9\x20\xbc\x73\xf9\x4e\x99\x29\x5f\x6c\x45\x35\x6b\xb4\x12\xa6\xcd\xf4\xfa\x97\xae\x9f\xff\x85\x03\x48\x0d\xfa\xf9\x75\x93\xfe\xe9\xfe\xd6\x84\x3b\xd2\x7e\xb4\x11\xf8\xe7\xb5\xc5\x6a\x63\xc7\xd3\xdf\xd0\x1f\xcc\xcc\x58\xce\xfd\x36\xd9\xc0\xb4\x8c\x03\x48\xf3\x7f\xfe\x9c\xb4\xf8\xef\x34\x65\xcc\xe6\xf8\x9d\xcb\x3a\x1f\x66\x72\x45\x47\x3d\x19\xed\xcd\xe4\x0e\x00\x5a\xfc\x03\x0d\xae\xbd\x9c\xf7\x67\x85\xff\xcd\x6c\x20\x43\x4c\xf4\xff\x69\xc8\xfe\x65\xe1\x7f\xb3\x1c\x42\xa6\xa8\x08\x10\x2c\xe3\x21\xa4\x06\x42\xb0\xec\x87\x90\x66\x12\x02\x04\x93\x25\x10\x20\x1f\x20\x04\x93\x29\x10\x20\xad\x64\x04\x08\x16\x5b\x80\x90\x59\x62\x02\x04\x93\x30\x10\x20\x81\xa4\x04\x08\x26\x69\x20\x40\xde\x52\x12\x20\x58\xc4\x01\x42\xa2\x28\xe0\xe9\x01\x16\x83\x00\xb2\x64\x44\x64\x94\x78\x1c\x40\xf2\xd1\x25\x89\x32\x6c\x9f\xf7\xf0\x0f\x81\xd9\x27\x2c\xa9\x26\xde\xc3\x8e\x97\x8d\x37\xc4\x79\x65\x62\x0b\xa2\x64\x48\xe5\xa8\xe5\xa9\xab\x01\x0e\x20\x33\xe8\xdb\x6a\x99\x41\xee\x5a\x82\x27\x38\x1b\x4c\xee\x4d\x0d\x78\xe7\x0c\x9a\x6b\x24\xa5\xb6\xe9\xbd\x0b\x7a\x6c\x1d\xf1\xd7\x59\x69\x6c\x63\x67\x14\x08\x45\xd7\x6a\x36\x1e\xad\x2c\x5c\xa6\x87\x8f\xe6\x1e\x46\x23\x6b\xed\x03\xd1\x3e\x20\x71\xaf\xe0\xd1\x18\x8f\x87\x2e\xb5\x41\x3e\x17\x9b\x4c\x00\x52\x8b\xde\x1b\x42\xf7\x4f\x2c\x5e\x19\xe8\x0f\x51\x7e\x4c\x4a\x45\x5d\x73\x4f\xee\x64\xf3\x96\x46\x71\xe4\xd6\xaa\x9a\x69\x25\x51\x22\xcd\xf9\x76\xe1\x7f\xb3\x1a\x06\x28\x1f\x2e\x03\xa6\xe1\x04\xc8\x0c\x3d\x01\x82\x69\x3b\x01\x12\xca\x44\x80\x60\xd9\x0f\x21\xb5\x70\x7b\x60\x52\x39\x02\xc4\x9b\x91\x00\xc1\xa4\x73\x04\x48\xd8\x41\x02\x04\x8b\xd2\x41\x48\x09\x03\x01\x82\xc5\xea\x20\xc4\x6d\x0f\x01\x82\x45\xec\x20\xe4\x17\x5c\x17\x4c\x6e\x47\x80\xbc\xa7\x26\x40\x30\xe9\x1d\x01\xe2\x07\x2b\x1d\x26\xc5\x23\x40\x5e\x41\x95\x16\x93\xe6\xfd\x1f\x44\xda\x82\xf0\x25\x58\x4c\x0f\x7e\x09\x0e\x2e\x3e\x26\xd9\x23\x40\x12\xe1\x4a\x62\x12\x3e\x58\x4e\x61\xd5\xc2\x22\x7d\x10\xd2\xbb\x8f\x00\xc1\xe4\x7d\xb0\xd0\xc1\x7c\xc1\xe4\x7e\x04\x48\x04\x1d\x01\x82\xc5\xff\x20\xa4\x1f\xae\x24\x26\x05\x24\x40\x42\xe0\xb7\x60\xd2\x40\x02\x24\x72\x2f\x01\x82\x45\x05\x21\xa4\xe1\x00\x01\x82\xc5\x06\x77\x8b\x36\x03\xfc\xdd\x1f\x16\x2d\x04\x32\x9c\x2c\x74\x6e\x38\x20\x8d\x66\x63\x9b\x37\x5e\xc6\xf6\xdd\x29\x9f\x14\x3b\xd5\x77\x73\xff\x65\x47\x24\xdd\x6a\x60\xba\xc8\xfd\x85\xbe\x49\x8f\xe7\x21\x3c\x71\xfd\x13\x1c\x40\xfa\xd0\xd3\xd5\xca\x72\xa7\x3d\xff\xd7\xc5\xb8\xfb\x9e\x27\x25\x52\xec\xa4\xde\x1c\xca\x3b\x7c\xe5\x1d\xb3\x5a\x34\xc9\x71\xa5\x46\x22\xd9\xe0\x7a\x1c\x40\xba\xd0\x43\xed\xea\xf0\xdf\x84\x57\xab\x49\x02\xeb\xda\x85\xee\xaf\x89\x93\x9f\x97\xd5\xbd\xc5\x5d\x93\xeb\xc7\x73\x7f\xed\x97\xae\x16\x59\xba\x88\x03\x48\x31\x7a\x30\x8c\x5e\x7a\x82\xdf\xd7\x4c\xd1\xcc\xe4\x59\xe0\x22\xae\xbf\xbc\xb6\x29\xfc\xce\xeb\x56\xb9\xdb\xaf\x50\xf1\x8f\x88\x38\x69\xf3\x63\xa1\x7f\x33\x1b\xee\x27\x58\xe6\xb0\x0c\x87\x11\xed\xa3\x21\x40\xb0\x6c\x87\x90\x2e\x98\xe9\x58\xe6\x43\x48\x31\x2c\x40\x98\xec\x9c\x00\x69\xa3\x20\x40\x30\x19\x3a\x01\x32\x0c\x77\x2d\x16\x4b\x87\x90\x9f\x30\x07\x31\x89\x3a\x01\xb2\x05\x83\x8c\xc9\xd5\x09\x10\x7f\x5a\x02\x04\x8b\xaf\x43\x48\x11\xac\x0d\x98\x94\x9d\x00\x79\x01\xa7\x33\x4c\xda\x4e\x80\x8c\xc2\x20\x63\x51\xf7\xdd\x1e\xbf\x0f\xfe\x2b\x24\x26\x87\x97\x35\x27\x23\x22\x7f\x81\x03\x88\x07\x9a\x40\x6f\x0d\xf6\x7e\x7b\x60\x9f\x10\x70\xd9\x8e\x8e\xa9\x36\x31\xcc\xda\x9f\xef\x6c\x32\x55\x4c\xc2\xef\xdb\x81\x1f\x2c\xad\x94\xdd\x73\x70\x00\xf1\x41\x2b\x34\x17\xe3\x54\x5a\xfb\x82\x22\xac\x4d\xbc\xda\xc8\xde\x1f\x2b\xca\x4f\x7d\xaf\x59\x7e\x84\xdd\x7c\xaa\xbe\x68\xb3\x53\xaa\xe0\xe5\xce\xf3\x9f\xd1\x94\x98\x36\x23\xc8\xa5\x72\xc4\xdb\xf9\x7e\xca\x57\x19\x39\xde\x63\x4c\x9d\x2e\x45\x76\xac\x06\x79\x85\xa9\x12\xcf\x37\x19\x44\x29\xf4\x76\xfc\x46\x0f\x4e\x29\xe7\x9b\x3f\xe6\xdb\x9e\x11\x59\xd4\xed\xa1\xdc\x4b\x6c\x1a\xc6\xf7\x70\xe5\xeb\xc1\xc4\x2a\x5d\xaa\x2a\xda\x8b\x5f\xc5\x73\x39\x71\x00\x89\x43\xcf\x71\x4a\x82\xbf\x8f\x70\x4f\xf5\x6e\xbf\xf5\xdd\x4a\x1a\x38\xf6\x8d\x9d\x65\x6a\x24\xf4\xb0\x82\xeb\xc8\x67\xff\x82\x2e\xee\xcf\x8b\x51\x3b\xdd\x13\x3d\x27\xd6\x38\xd3\x8e\x90\x53\x3e\xe8\x91\xa1\x08\xa1\x6d\x1c\x7c\x51\xae\x32\x6c\x90\x3c\xfb\xe2\xc0\xea\x2f\xce\xd8\x85\xee\xea\xa7\x77\x84\xff\x2d\x2c\x70\x05\x3c\x60\x36\x61\x45\x06\x42\x7c\xe0\xce\xc0\x0a\x0e\x84\x7c\x86\x3d\x00\x2b\x3e\xbb\xd9\x04\x7b\x33\x56\x88\x20\x24\x0e\x4e\x8c\x58\x51\xda\x9d\x4c\xe0\xfc\x83\xa9\x09\xc1\xf1\x0f\x16\x39\x2c\x5d\x68\xb7\x9d\xd3\x42\x7a\x80\x25\x10\x01\x99\x00\xba\xff\xbd\xdc\xab\x14\xad\x40\x44\x3f\xf4\x9d\x91\xe0\xa1\xed\x04\x02\xaa\xb5\xa9\xf4\xd6\x8c\xbf\xfa\x45\xa5\xfa\xec\x27\xcd\xe4\x27\xda\x53\x7d\x25\xe7\xfd\x70\x00\x19\x43\xb7\x82\x55\xfa\x28\x7d\xea\xbf\x7e\xe9\x56\x63\x1d\x47\x73\xab\xc2\x99\xef\xf6\x06\x15\x2e\x4f\x21\x61\x3a\x25\xd5\x1f\x39\x1b\x6d\xee\xe2\x00\x02\xd0\x42\x51\xea\x4c\x96\x73\x5c\xaf\xe6\x48\x4c\x61\x55\x89\xc0\xc5\xd9\x62\x9b\x24\x4e\x06\xe5\x62\xde\xa3\x79\x6f\xce\x1c\xbb\x69\xa2\xf0\x17\x07\x90\x42\xf4\xf3\xb3\x19\x89\x21\x91\x8e\x1b\x26\xe6\xe3\x95\xa6\x5e\x95\xae\x3a\xfb\x70\x67\xab\x86\x33\xef\x4b\xce\xf7\x35\xa5\xf9\xde\x0d\x4d\x12\xfe\x37\xb3\x61\x80\x4a\x21\xe5\xc2\xb2\x1c\x42\xc6\x60\x17\xc0\x32\x1e\x42\x00\xac\x69\x58\xf6\x43\x48\x21\x84\x60\x2a\x75\x70\xa8\x84\x3b\x0a\x53\xad\x23\x40\xd2\xc8\x09\x10\x2c\xc5\x6e\x57\x09\x80\x86\x61\x8a\x76\x70\xab\xc3\x4d\x88\x29\xdc\x41\x08\x24\x54\x58\xe2\x1d\x84\xa4\xee\x87\x2f\x93\xc6\x52\xf1\x80\x6c\x25\x11\x11\x83\x3b\x0e\x20\x83\x68\x3d\xec\xbb\x13\xdd\x92\x51\xd1\xd1\xd3\x13\x97\xfa\x29\x26\x34\xd9\x6f\xbd\x55\x7f\xa9\xa3\xff\x5e\xa4\x4d\x83\xb2\xef\xae\x04\x63\x11\x09\x0e\x20\x8b\xe8\x16\xc0\x63\x86\xd7\x29\xd5\x65\xed\x34\x2c\x4f\x09\xfb\x99\x39\x7f\xa1\x86\xb3\x4d\x57\xef\x33\xf1\x5d\x77\x35\x5e\x39\xb6\x8e\xab\x07\x70\x00\xd9\x46\xcf\x61\xef\xbf\x37\x3a\x71\x6c\x45\xfb\xff\x28\x78\x7a\x5c\x29\xc3\x5c\xea\x8e\x2f\xed\xd4\xa3\xeb\x9a\xf7\x49\xa3\xb9\x5f\xf6\x35\x27\xee\x94\xe8\x04\xb4\xcc\x65\x1b\xfe\xb4\x93\xdc\x7c\xa1\x3c\xfa\x4e\x6b\x68\x35\x9d\xe3\x92\xb1\x41\x98\xfb\xde\x85\x3d\xaf\xd9\x4c\x1f\xae\x47\xbd\x76\xb8\x88\x03\xd2\x8a\xe8\x0e\xc3\xe7\x7f\xec\x73\x15\x79\xf3\x1f\xd2\x46\x62\xeb\xe7\xfa\xb1\xd3\xd5\x23\xac\xf5\x0c\x0e\xfb\x75\xef\x99\x77\x5a\xbf\x63\x32\x16\xfe\x37\x2f\x61\x40\x07\x21\xe3\xc0\x72\x14\x42\x16\x61\x0a\x62\xf9\x0a\x21\xdb\xb0\xaa\x61\xb9\x0b\x21\x09\xf0\x70\x1f\xcb\x65\x38\x52\x2a\x12\xbe\x04\x53\xb0\x25\x7c\x89\x2b\x9c\x0f\x31\x45\x5b\x38\xed\xc0\x9a\x8e\x25\xdc\x42\xc8\x37\x58\x7f\x30\xb5\x5b\x58\x19\xa0\xe2\x85\xa9\xdf\x12\x20\x4d\x70\x25\xb1\x34\x5c\x08\x59\xa7\x86\x1c\x05\x53\xcc\x95\xa1\x20\xa2\xc3\xe3\x00\xe2\x85\xde\x1c\x87\xfc\xf1\x01\x2e\xa7\x5a\x86\x3e\x24\xdf\x2f\x0a\xa9\xea\xa3\x3a\xed\x90\x63\xca\xb6\xec\x68\xf2\xfe\xa9\xbe\x9d\xe7\x75\x61\x17\x00\x10\xaf\xff\xbc\xcf\x2f\x99\xee\xe9\xa5\xc3\x53\x2e\x2c\xaa\x97\xbc\x53\x82\x0a\xb6\xe8\x14\x6b\x0e\x8d\x07\xeb\x0e\xd1\xb0\xf8\xbb\x9e\xb2\xb3\x52\x01\xc8\x2c\xfa\x64\x0f\x09\x50\xbe\x95\xba\x55\x50\x34\x9d\x73\x4a\xbe\x76\xe8\xae\x95\x12\x77\x17\x4f\x15\x0f\xbd\xf5\x85\x58\x06\xf6\x10\x63\x79\xd6\x9d\x40\xa1\xcd\x09\xc3\x8b\x5e\x1b\xaa\xd9\x3c\xaf\x3c\x34\x6d\x10\x76\x8d\x3e\xf6\xa5\x6a\x05\xa5\xe2\x0c\xd3\xea\x42\x54\xc6\xc6\x60\x89\x9c\xbf\xf0\x3f\x5a\x4d\x88\x8f\x17\xcc\x74\x4c\xc3\x21\x04\x8e\xdc\x58\xc6\xef\xea\x8e\x90\x8f\x62\xd9\xbf\x9b\x1e\xd0\x30\x4c\x51\x9d\x00\xf1\x85\x5b\x10\x4b\x58\x87\x90\xa5\x03\xcb\x1d\xf4\xff\x1f\x43\x27\x2a\xa1\x46\x51\xbd\x66\x74\xe4\xb4\xc9\x37\x52\xe3\xe9\x19\x77\x1b\xd7\xea\x15\xcd\x17\xb2\x0d\x9a\x9a\x66\x54\x08\x4b\x04\x90\xdd\xde\xde\xde\x0e\xdd\xa9\x6e\xa9\xe8\x81\xd5\x4f\x7b\x2e\xf6\x30\xb7\x98\x57\xd3\x0f\xaa\xe5\x63\x4f\x8e\x7e\x11\x56\x29\x7d\x71\xea\xd8\xf4\x51\x4d\x55\x7f\x87\x33\xaf\xdf\xa3\x4f\x65\x22\x6a\x29\xdf\xf0\xe1\x63\xb2\x5d\x8b\xcf\xf9\xb7\x10\xa9\x98\x27\xd6\x0e\xcc\x46\x74\xdc\x4c\x30\x13\xe8\x53\xf6\x3b\xa2\xdc\x8f\x7a\x94\xd9\xf3\xa1\xbc\xdc\x7d\xda\x91\x53\x95\xc2\x5c\xfb\xd3\xb3\xa2\x01\x79\x75\x7d\xb2\x2f\x9f\x96\xd3\xe4\x03\xd9\x14\x8f\x71\xf4\x5b\xc9\x49\x46\xc7\x04\x8b\x6f\x1e\xb9\x52\x3e\xdb\xf2\xec\xfd\x05\x65\x9a\xd8\xb0\xcc\xf1\x4a\xbd\x91\x20\xf1\x9f\x22\xe0\xf0\xf7\x94\x01\x3c\x40\x92\xfe\xf3\xff\x02\x4f\x2b\x71\xdb\xd5\x75\x2f\xe5\x69\x0f\xca\xd9\x8d\xe7\xb7\x2b\x4e\x18\x0e\x99\x44\x69\xb5\xfd\x52\xf3\xec\xf9\xc2\xe9\xe0\x0b\x90\x2a\x74\x86\x7a\x9c\x20\x53\x7e\x2a\x7c\x03\xcf\xaa\x76\x01\x64\x86\x59\xc7\xfa\xf5\xc4\xe5\x93\x5b\x1f\x3f\xf2\xd9\x69\x42\x96\xe9\xba\x63\x27\x40\x46\xd0\x93\xd3\x12\xb1\xf6\x40\x58\xdd\xc1\x74\xe9\x1c\x64\xf1\x87\xa9\x45\xf2\xde\x5e\x6d\xb0\x7c\xf5\xb8\xf1\x87\x16\xb7\x05\x67\x95\x57\xc3\x38\x80\xe4\xa2\x75\xd5\x67\xb7\xc3\x7e\x55\x5e\x31\x79\x49\x75\x4e\x5c\x4d\xc2\x62\xa6\xef\x84\x5d\x2d\x7f\x59\xe8\xdc\xde\xef\xa4\x1f\x5e\xf9\x23\x9d\x53\x00\x20\x1e\x68\xfe\x51\x6a\xe6\x2a\x3c\xf6\x77\xbc\x26\x67\x49\x46\xab\x47\x57\x92\xd2\xb7\x2e\xd2\xca\xec\x6d\xba\xf9\xe9\xc5\xdf\xf4\xa9\xc6\x2a\x6f\x00\xd2\x86\xd6\x00\x3c\xc6\xd7\x45\x56\x1e\xc9\x88\x1e\x8f\x1a\x6e\xe5\x9a\x8c\x9c\xc1\x95\x30\xfd\x6d\x16\x68\x45\xbe\x48\x6e\x28\xf3\x4a\x8c\xca\xe1\x01\xf2\x16\x7d\x03\x24\x4b\xfc\x66\x6f\xcc\xfb\xfe\x5a\xa1\xd5\x62\x97\xde\x9b\x8f\x7e\x4d\xff\x35\x15\xbe\x4d\x27\x5b\x97\x48\xb5\xf6\xc3\x4b\xa1\x91\x0c\x20\x55\xe8\x23\xd9\x67\xae\xc3\xc3\x8f\x2c\x9f\xdf\x28\x14\xf4\xea\x69\xe7\x90\xfe\xf4\xc3\xda\xa9\x86\x3b\xae\x6a\xab\x58\xfe\x26\x97\xc5\xb1\xa8\x53\x00\x69\x41\x1b\x4f\xd7\xf2\x47\x65\xd2\x79\x3f\xab\x98\xd1\x3d\xd7\x70\xaf\x3b\xc1\xc5\x23\xfa\x87\xd8\x8e\xf4\x99\xa4\x36\x55\x1c\x2d\xa2\x52\x5d\x46\x5f\x54\xa3\xbd\xc1\x3e\x5d\x79\xca\xf3\xba\xa2\x7f\x92\xad\x7d\x8c\x59\xb0\x8f\xe4\xbd\x4c\x23\xe4\x23\xdf\x17\x55\xf1\x56\x45\x81\x22\xf4\x39\xcf\xc5\x6b\x88\xe1\x76\x89\xb0\xf5\xf7\x63\xcb\xf7\xc8\x1a\x8a\xcd\xe7\xd7\x13\x7f\x32\x1e\xbc\xb4\xf1\xb0\xcd\x68\x5e\xa8\xe4\x2e\x0e\x48\x4b\xa2\x1e\x77\x49\x2b\x6c\x3d\xbb\x29\x76\x5c\x5f\xdd\x21\x70\xfc\x6b\xa3\x74\x7c\xa9\x98\xe9\x4f\xef\xe1\xcc\x5e\xa6\x85\xf0\xae\xb1\x86\xcf\xe8\xdb\x75\xf7\x0f\x0d\x73\xb7\x1a\xef\x6f\xe1\x6d\xcf\xa0\x79\xea\xa8\xd5\xf6\x5e\xb8\x32\x8b\x6f\xcc\xa0\xa1\x4a\x5e\xf5\x78\xce\x6d\x13\x00\x90\x56\x74\xae\xec\x6f\xb3\xbf\x7a\x44\x6c\xcf\x55\xad\x4d\x35\x61\xce\x99\xbf\x5f\xdd\xbf\x49\x3e\x54\x2c\xb5\x2a\x74\x5f\x39\xd8\x67\x39\x37\x49\x0b\x90\x05\x74\xae\x1c\xfb\x79\x1a\x9c\xa0\x8c\x6d\xbf\xc3\x1d\x2b\xcb\x27\x17\x10\x78\x8a\x97\xe1\xcb\x03\x23\x99\x8d\x63\x7b\x9c\x34\x49\x87\x28\x26\x50\x8f\x56\xb7\xeb\x9d\x6a\x3b\x4c\xc2\xf5\x84\xff\xab\xd8\xe6\xd4\xdb\xa9\xcb\x89\xab\xb4\x7e\x61\x5f\x04\x7f\x0d\x8a\xb0\x3e\x4d\xbe\x7d\x7b\xa7\xc8\xa0\x17\x46\x9c\xac\x2f\xe3\x8f\xec\x4c\x08\x51\xde\x70\xb4\xeb\xc0\x0c\xcf\x52\xf9\x07\x1b\x5c\x6f\xe9\x7c\xd4\xe8\x57\xe5\x70\xe2\x35\x27\xd4\xa3\x95\xed\x71\xdd\x9b\x1f\x4b\xce\x85\x76\xfe\xe8\x2a\xa8\x53\xe5\x26\xcb\xd7\xae\x51\xd5\x62\xd3\x3f\x7f\x85\xab\x46\x15\xef\x42\x81\x07\xd2\xe8\xb3\xf2\x5b\xe3\x7f\x02\x34\x2a\x6b\xe6\x85\x46\x17\x84\xee\x1a\xdf\x7e\xa6\x71\xf4\x38\xcd\xc7\x83\x13\x6a\x9b\xd6\xb5\xed\x19\x2c\x97\x84\x01\x52\x81\x66\x1e\xa1\x0e\x5c\x77\x0e\x50\x45\x9f\x9e\x36\x28\x40\x96\x9a\x33\x2c\x53\x34\x8f\xbc\xd5\x4e\xe6\x26\x5f\x09\xd4\x5a\x89\x3e\x2f\x2f\x01\x90\x4f\xe8\x0c\x21\xf7\x72\x63\xfc\xc0\xc2\xcd\x54\x82\x74\x7d\x2e\xbd\xb7\x6a\x5c\xbc\xf2\xe3\x6f\xda\x05\xbd\xe8\xa2\xa2\xcb\xe2\xcf\xba\x37\x8f\xec\xb0\x34\x34\x9d\xfd\xc2\x7a\xbe\xdd\x34\x6f\x5f\x2f\x8e\x08\x1f\x77\xad\x94\xfe\x7c\x6e\x8e\x4a\xd7\x97\xa2\x47\x9c\xda\x4c\x9e\x43\x88\xe2\x4d\x63\x3c\x40\xa2\xd1\xb3\xa1\xeb\x9b\xf6\xae\xbb\x74\xe5\x67\x43\x0e\x86\xe5\x64\x9e\x2e\xa8\x7e\x35\xdf\x62\xc2\x2b\x78\x9b\x41\x77\x5b\xc8\xdf\xf6\x08\x77\x00\x40\x32\xd1\x0b\xea\x53\x6f\x63\x5c\x33\xae\xe5\xac\xa9\xf1\xe9\x96\xce\x91\xa9\xf2\xdb\xd3\x1a\x42\xf8\x9e\x6d\xce\x47\x96\x64\x4d\x07\x4d\x5b\x95\x01\xf2\x03\xdd\x9d\x56\xf1\x5b\x3f\xfe\x68\xa4\x65\x99\x28\x16\xf0\x96\x3b\x76\xb0\x1b\xf2\x8b\x77\xb4\x7e\xe5\x4c\x4e\x62\x98\x17\x5d\xf2\x2e\xeb\x04\x40\x5a\x09\x7d\x27\xd6\xe3\xbb\x72\x1c\xe3\x72\x44\x9c\xf5\x7c\x2e\xb9\xa0\x24\xf9\x9b\xe7\x14\x96\xe1\x54\x3e\x36\x6f\x63\xed\x84\xe3\x78\x2d\xa9\x00\xd2\x87\x5e\xd3\x9c\xb0\xf4\xc3\x6d\x13\x67\x0f\xb7\x7d\x47\x52\x8e\x89\x5b\x99\x49\x8a\xb8\x54\x6e\x2e\xec\x77\xd7\xfe\x16\xa2\x8f\x9f\xa0\xba\x8c\x7a\xd4\x33\x4e\xd4\xfc\x98\x5e\x87\xbd\xdf\x00\x32\x9f\x25\x98\x64\xbe\x9e\x30\xf0\x92\x72\xf6\xd3\x35\xef\xe8\x76\xfd\x47\x73\xb1\x56\xe8\x43\xd8\x40\x2a\x29\x33\x72\xce\x62\x12\xa5\xf4\x63\xc6\x99\xd7\xf5\x69\x5d\x78\x99\x71\xc7\xaf\x5f\xc5\xb5\xc5\xcd\xbc\x89\x90\x3e\x85\x07\xc8\x1b\xf4\x25\x0f\xc9\x7c\xf2\x31\x76\xb9\xc6\x27\x4c\x03\xb7\x2e\x4c\x9d\x6d\xa4\x0b\xba\xaa\xb9\x5e\x13\xf1\x96\x66\x76\x8b\xe4\x52\xa8\x32\xf5\x7d\x80\x8c\xa1\x43\x52\x95\xa4\x68\x40\x9f\x12\x42\xce\x7a\x4d\x3f\x99\x75\xfc\xcf\xf4\x5f\xb5\xb3\x01\xf5\x3f\xa4\xae\x3f\xe9\xfb\xde\x16\x7c\x55\x65\x03\x20\xeb\xe8\x33\xdb\x42\xda\xe0\xa9\x64\xf1\x3a\xc1\x3a\x9c\x58\x7d\x82\x76\x6a\x7b\xe0\xb1\x9e\x0d\x51\xca\x8f\x13\x74\xe4\x21\x57\x03\x0b\x2f\xf4\xa1\x1e\xdd\xa7\xc0\x12\x27\xf9\xc8\x3f\x7b\x49\x47\x7f\x92\x32\x8b\xbb\x8f\xfa\xaf\xae\xee\xd1\x9f\x4a\xbf\xa9\x66\x57\x9e\xbd\x8d\xe7\x5a\x45\x1f\xef\x17\x24\x09\xef\xbb\xd6\x5d\x95\x20\x84\x2b\x58\x2c\x55\x0d\x62\x5e\xd1\xdc\x7c\xaf\xd4\xab\x4a\x74\x2b\x92\xa7\xf3\x44\xca\x23\x00\x90\xd7\xe8\x2c\xf1\xda\x6f\x2b\x47\xfc\x93\x21\xb0\x35\xff\xad\x47\xb2\xbc\x8a\x7c\x51\x68\xb8\xc2\x03\x6d\x6b\xe5\xda\xc0\x05\x06\x4f\xf5\xe4\xcb\x00\x69\x44\x13\x02\x01\xdd\xee\xcb\x0b\x11\x87\xac\x62\xea\x1b\x6b\xc7\x68\x3b\x35\x9b\x7e\x1f\x14\xa8\x68\xba\x1f\x4f\xa3\xab\x34\xde\xf3\x41\x3a\x70\xe7\xe3\xd1\xb7\x30\x74\x36\x07\x17\x5b\x4e\xab\x99\x9a\x6b\xb7\xd2\xac\x8f\xb1\xfe\x3a\xae\x12\xfd\x8d\xbe\xfc\xda\x3b\x67\xfb\xf1\x70\xad\x77\x9f\xdf\x01\xe4\x3d\x7a\xa4\xba\x7c\xf4\x05\xfd\xe1\x8c\x6c\xc1\x93\xdf\x78\x8f\x33\x90\x8a\xdf\x53\x3e\xa6\x3f\x5e\xc0\x72\x73\x6e\x31\x5c\x42\xcc\x3a\x53\xeb\x2e\x00\x48\x1c\xda\x7a\x85\x0d\xdf\xc9\xe7\x7d\xdf\xe4\xbf\x1b\x3d\xa2\x3d\x29\xfe\x4d\x6b\x99\x92\xf3\xdd\x59\x91\x3a\xd6\x0c\x62\x23\x59\x21\xaa\x0d\x6f\x80\x94\xa3\xab\x50\x99\x6b\x6d\xee\x93\x54\x2f\x7c\x44\xd5\x74\xc3\x6b\xae\x85\xfb\x8d\xb7\xc5\x54\x4a\xf3\xf9\x4e\xbd\x6a\x7a\x7b\xa8\xfd\x23\x39\xfa\x04\x3b\x69\xde\xc5\x4c\xf5\xe6\xc9\xa8\x87\x2d\xbd\x64\xfb\x43\x02\xfb\x9e\x80\x7d\xef\x99\xda\x0d\xd4\xbf\x94\x38\x96\xcc\x27\x06\x8b\xe1\x00\xf2\x02\xfd\xd1\x12\xa7\x2a\xbf\xdf\x39\x3d\x46\xb3\x1e\x51\x9b\x65\x7f\x57\x1b\x77\x92\x73\x93\xca\xc5\x2e\x65\xfa\xca\xba\xf0\xa0\xfb\xf1\xe3\xa7\x70\x00\x69\x45\x3f\xcf\xc3\xf8\x4d\xcd\x52\xcc\xce\x26\xf7\x9a\x76\x54\x15\xaf\x4e\x19\x19\xcf\xa2\xa1\x7e\x21\x49\x09\x27\x07\xff\xbe\x8e\xb1\xf3\xe8\x17\x41\x67\x97\x0e\xb4\xfb\xab\xf6\x98\x1b\xa9\x71\x99\x9f\x4e\x71\xd3\x15\xe2\x74\xf4\xeb\xae\x2e\xf6\xb3\x66\x64\x4a\x95\xaa\x2e\x4f\x15\xfe\xb7\xe9\x04\xc8\x90\xfc\x1f\xed\xa4\x82\xb4\x13\x6b\x4c\x01\x32\x0a\xb2\xff\x7b\x17\xe5\x04\x9a\xe5\xcd\xad\x1c\xe4\x57\x26\xf1\xa3\x13\x0f\x48\xb4\xbb\x98\x48\x52\xaf\xdd\xc2\xc1\x7f\xff\x66\xbb\xb8\xeb\xcf\xc4\xdc\x17\xee\x71\x9b\x38\x80\x24\xa1\x57\xf5\xbd\xe4\x50\x25\xed\x05\xa3\xf6\x03\x47\x52\xd3\xef\x38\x51\xa6\x4b\x8c\xb8\x73\xe7\xcc\x09\x25\x7f\xca\x7d\xe9\x24\x57\x9d\xdc\x86\x03\xc8\x10\xba\x33\x6f\xb5\x28\x7f\x66\x8c\x96\x7f\x77\x42\x82\x7c\x21\x6b\xe9\xd0\xbe\xf7\xa9\x0a\xe3\xcf\xa6\xce\xe1\xad\xbe\xfd\x55\x7d\xb8\xcd\x79\x10\x07\x90\x1c\xf4\xf3\x66\x67\x59\x62\xde\xf4\xd5\x28\xc7\x3e\xbb\xd8\x4b\xda\x25\x73\x53\x9f\xe5\x52\xdd\xa5\x47\x5f\x28\xf9\xec\x35\xbb\x95\xc4\x7c\x59\x70\x00\x79\x85\x9e\x14\x5a\x2a\x1c\x0c\x39\x63\x29\x75\xb8\xf5\xbe\x26\xd2\xcc\x99\x92\x86\x0b\x5f\xcd\x59\x4f\x1d\x6e\x19\xda\xbf\xaf\xdb\x9e\xf3\x06\x8f\xf0\xbf\xb9\x09\x03\x3a\x01\xc5\x6c\x2c\x4f\x21\x24\x09\x4e\xd6\x58\xce\x42\xc8\x10\x3c\xb2\xc4\xf2\x17\x42\x72\x20\x04\xcb\x65\x08\x79\xb5\x2b\x33\x63\x0d\xa6\x40\x56\x8a\x84\xac\xfa\xc5\x0e\xf5\x42\x47\x37\x46\xa4\xa1\x73\xe1\x5a\x7c\xc5\x53\x4b\x76\x45\x96\xa6\xb5\x6e\xbf\xeb\x64\x3f\xf7\x46\x96\xbb\x4c\x16\x5a\x24\x97\xbe\xaf\x8d\xc6\x01\x24\xf9\x3f\xef\x4d\xa1\xd4\x90\xec\x1e\x31\xd7\xf0\xff\xb3\xbc\xe7\xfe\x5d\x2b\x23\xae\x36\xd5\x86\xe4\x52\x6e\xe3\xaa\xd4\x9e\xc1\x4a\xc3\x00\x01\x1c\x40\x32\xd0\x75\xd3\xfe\x92\x71\xc7\x52\x04\x95\xe4\xca\x86\x81\x9a\x2b\x73\xb0\xa5\x6f\x07\xd3\xe3\x32\x45\x69\xa2\x76\x0d\xb1\xde\x57\x38\x2a\x73\x1c\x40\xdc\xd1\x3b\x6d\x6b\x44\xe4\xa3\x63\xa1\x40\x86\xdb\xa0\xfb\x1b\x45\xa5\x01\x2f\xfc\xb1\x2a\x62\xeb\xeb\xec\x1c\x1d\xf8\xb4\x37\x75\x06\xe5\xff\x93\xbd\xd1\xd9\xea\x60\x1f\xfd\xe8\xe9\xfe\x6f\xfa\xf7\x74\xae\x87\x6a\xce\xbe\x77\x6d\x67\xbd\x6d\xd0\xeb\x6a\xe2\xbf\x61\xf4\xd4\x71\xec\x84\xe6\x4e\x5f\x0e\x43\x97\xfd\x52\xb1\x8f\x76\xab\x4f\x14\xce\xc9\x3d\xef\x3f\x16\xe8\x91\x16\x7b\xb5\xb0\x6c\x3d\xae\x3d\xb0\x2d\x5b\x72\x76\x5e\x2e\x7a\x84\x90\x4d\x58\x61\x81\x2b\xb0\x0e\x69\x3c\x56\x64\x20\x24\x19\x1e\x27\x60\x05\x07\x42\x32\xe0\xe9\x24\x56\x7c\x20\xc4\x1d\xca\x88\x58\x21\x82\x10\x1f\x98\xe6\x58\x51\x82\x90\x30\x5a\x58\x9d\xb0\xe8\x0e\x90\xa9\xe2\x24\xde\xa9\x4e\xbf\xd0\x3d\x81\xaf\xf0\x24\x95\xca\x8b\x57\xb6\xcf\x6e\xd7\xb9\x06\x46\x4d\x39\x71\x4f\xbe\x32\x48\x64\x4b\x22\x3e\xb3\x4f\x23\x25\x33\xef\x3d\x09\x0e\x20\x9f\xd0\xcf\x5f\xad\xad\x14\x5c\x7d\x2d\x5a\x7f\x92\x54\xe0\x61\x68\x7c\x9b\x45\xce\x48\xd3\xb2\xd5\x26\xc9\x13\x65\xaa\xbc\xfd\xab\xd4\x3e\x4b\x38\x80\x74\xfe\xe7\x4f\x10\x5f\x5a\xc4\x3c\xba\xc2\xd8\x3c\x19\xaa\x71\x7e\xb4\xdc\x48\x56\x0e\x31\x37\x27\x1f\x8d\x72\xf9\x44\xf5\xb5\x82\x22\xb1\x59\x05\x07\x90\x05\xf4\x58\x38\x76\x65\xe6\x56\x7b\x80\xca\xdc\xb5\x12\xf2\x20\xef\xb3\xda\x22\xd7\xc6\x72\x91\xa3\x87\x04\xed\x6f\x5a\x8f\x44\xe5\xe2\xf7\x9c\xdf\x59\x3f\xf4\x31\x4a\xb6\xd2\x89\x5e\x59\x2b\x41\xfc\x2b\xda\xb7\xdc\xab\xdc\x8b\x76\xfb\x2b\xfb\xbd\xf8\xdd\xd2\xb9\x49\x2c\xff\x3c\xa0\x59\x0b\x5a\x11\xfe\x37\x37\x61\x40\x7f\x41\x29\x05\xcb\x53\x08\xf9\x04\x21\x58\xce\x42\x48\x27\x3c\x37\xc3\xf2\x17\x42\x16\xa0\x92\x84\xe5\xf2\x6e\xa2\x43\x5d\x16\x93\xda\xc2\x4a\x0b\x0f\x47\x30\xe9\x2d\x01\x52\x05\x35\x0c\x2c\x8a\x0b\x21\x23\x70\x6f\x60\xb2\x5c\x02\x24\x17\x0a\xc6\x98\x44\x97\x00\xf1\x80\xc7\x49\x58\x64\x17\x42\xda\x60\x35\xc1\xe4\xbb\x04\xc8\x5b\xd8\x35\x30\x39\x2f\x8c\x18\x2c\x40\x58\xbc\x17\x42\x5a\x88\x97\x53\x49\xff\x8d\x00\x03\x59\x12\xb2\x03\x86\x3b\x8d\x66\x04\x7d\xb2\xd2\x31\xe5\x64\x63\xce\xc7\xc4\x2c\x5b\x72\xe6\xe7\xe9\x74\xc9\xc9\x74\xe9\x19\xd1\xcf\x44\x5c\x38\x8e\xf2\x3b\xb6\xa9\xf2\x6b\xdb\x00\x20\x09\x68\x86\xd3\xae\x48\xe9\x4a\xe7\x73\xb5\x50\x3d\x58\x77\x6f\xf5\x77\xce\xe7\x22\xb1\xaa\x97\x35\x33\x2f\xe4\x66\x3d\xb7\x25\xbe\x75\xf1\x87\x36\x40\x96\xd0\x7d\xcc\x48\xe5\xfe\x5d\x89\x38\x45\x7b\xb7\xb2\x33\x3f\x54\x1c\x7b\x9f\x27\x39\xfa\x89\xe6\x72\xdf\xba\xd0\x54\xf5\xa0\x6a\x64\x9f\x81\x25\x0e\x20\x4d\xe8\x89\xf1\xdc\x3e\xe5\x60\x06\x5d\x2a\xee\x5f\x22\xd5\xab\xfd\x65\x6f\x9f\xfb\x70\xca\x11\xf7\x06\xd8\x30\xa4\xfa\x0b\xe8\x31\x67\x6e\x9a\xec\xe4\x22\xba\x2f\xcd\xad\xf2\x56\x04\x8a\x0e\xc5\x9f\xa1\x4e\x7a\xaf\x7d\xfb\x01\x77\xee\x53\x4a\xcb\x70\x8d\x2c\xc9\xcb\x3e\x79\x5e\x94\xdf\x1d\x4b\x00\x40\xaa\xd1\x53\x4e\x02\xfb\xd0\x69\x99\xf7\x12\x82\xcf\xd8\xcb\xd5\xa6\x3b\xc6\x02\x5a\x93\xc3\x62\x2b\x49\x99\x1d\x59\x88\x45\xea\x4e\x3d\xde\xba\x06\x90\x41\xb4\xf6\x73\x62\x56\xe9\xc6\xc4\x89\xfd\x11\xc3\x25\x22\x16\x7b\x73\x8a\xe5\x9b\x02\xb2\x5f\x76\xe6\x16\xdd\x96\x16\xb0\x72\x35\xe5\x7e\x9a\x81\x03\xd2\xc7\xd0\x6a\x08\x6b\x43\x93\x92\x53\xa7\x83\xca\x9a\x23\xd3\xad\x5a\x2e\xff\x96\x87\xfb\x9a\xdf\x64\xa8\xdc\x2b\xc9\xed\xb4\x2b\x0f\x21\x95\x10\xfe\xc7\x98\xc3\x0d\x01\x0f\x5d\x30\xc3\x4e\x80\x24\xc0\x6d\x87\x15\x7a\x08\x59\x82\xd9\x8d\x15\x7d\x08\x69\x82\x62\x34\xe6\x02\xc0\x12\x02\x37\x37\xe6\x1a\x10\x20\xd5\x70\x0f\x61\xad\x03\x84\x0c\xc2\x1f\xe7\x61\xad\x05\x01\x22\x7d\x0c\x2a\xde\x58\xc2\x10\x90\xa5\xa4\x73\x25\xc2\x03\x20\x2d\x80\x5a\xf4\xe3\x2e\xc4\x45\x59\x02\xf7\x22\xa8\x6e\x5d\x7b\x25\x67\xc4\x5b\x2b\xc2\x5f\xa6\x90\x78\xae\xe2\xc7\x42\xd6\x32\x5d\x5e\x76\x6d\x08\x40\x96\xd0\x9d\xcf\xe8\xab\x96\xa6\xaf\xeb\x97\x0f\xf8\x37\x65\x05\xc1\xb8\x2f\xe5\x5e\x0a\xf7\x3f\xb2\xd7\x9d\x7f\xa4\xee\x89\xd4\x44\xcf\xf8\x53\xe2\x00\xb2\x85\x7e\xde\x22\x31\x2c\xeb\xec\x70\xc1\xf6\x84\x97\xb6\x4d\x8f\x13\x9d\x53\x12\x1d\x47\xca\x9a\xd8\xb3\x8c\x89\x7d\x34\xf7\x3d\x89\xf7\x9e\xdc\xe9\x34\xe8\x1d\x57\x96\x58\x99\xb9\x56\xcf\x91\x1b\x68\x56\xab\xc6\xf1\x3a\x96\x89\x48\xc6\x9b\xbd\x80\x44\xe8\xc8\x89\xe2\xa3\x17\x58\x70\x51\x9d\x42\xff\x68\x35\x21\x3c\x02\x30\x9f\x30\x0c\xdf\xcd\x27\xd8\xc5\xb0\x6c\x87\x90\x2d\x08\xc1\x32\x7f\xb7\xbd\xc2\xbf\x7b\xc0\x12\xe8\xa0\x2b\x92\xcb\x7d\xa4\xff\x28\xd4\xc9\x92\xa8\xec\xf5\xf4\xd8\xe9\xaf\xe8\x62\x29\xcc\xcb\x07\xf0\xde\x05\x17\x85\x54\xfc\xac\xb6\x8e\xf8\x0a\x85\xee\x49\x73\xb9\xf1\x82\xad\x80\xc7\x57\xcc\xf2\x5d\xd0\xe1\xda\x9d\xee\x82\x5e\xbb\x33\xed\xd9\x6a\x3f\xff\xc6\xba\x2e\x79\x0a\x9d\xd6\x8d\xb4\x17\x48\x61\x59\xae\x6e\xec\x4b\x5f\x74\x79\xc2\xa4\xf5\x75\xfb\xef\xd7\x9d\x41\x15\x5d\x9d\x28\x46\xac\x05\xd8\x8b\x6e\x9b\xc9\xcc\x3e\x7a\x3a\xfd\xd2\x54\xb6\x60\x2b\x29\xec\x0f\xe5\xda\x05\x81\xa4\xb7\x67\x67\x44\x3f\xef\x70\xc2\x74\x34\x87\x8c\x4b\x73\xa3\x7b\xf6\xa4\xe6\xd6\xfe\x5b\x8c\x94\xe0\x95\x26\x31\xfd\xed\x20\x5f\x8e\x6d\x8a\x52\xad\xad\x94\x6b\x07\xda\x06\x69\x70\x00\xd9\x40\x4f\x69\x49\xd1\x6d\x93\x1f\x5a\x33\xfb\x6a\xce\x5a\x7a\x9d\x96\x1d\xfb\x1a\xef\xa8\x99\xcd\xdf\x90\x79\x99\xf6\xa7\xb9\xd2\x94\x40\xa4\x2e\x1e\x20\x6f\xd1\xea\x9a\xf9\x8f\xc6\x35\x99\xb3\x73\x87\x9e\x14\x9e\xf9\x48\x5b\x6c\x6f\xb4\x4c\x4d\x8b\xb7\xf0\xc8\x70\x1c\xeb\xa4\x7f\xbe\xf4\xd3\xb1\x1b\x20\xc9\xe8\xe2\x3d\x99\xc5\x72\x3f\xbc\xe0\x08\xd9\x4b\xbe\x5c\x8e\xfd\x45\x8e\xcf\x85\xd3\x74\x7d\x1c\x35\x57\x44\xa4\x6c\x04\x75\xb2\x7b\x19\x9d\x01\xf2\x11\xfd\x78\x9f\x9b\xbc\x7e\x50\x7f\x6a\x48\x69\x67\xbc\xf9\xf2\xc3\xc2\x7d\xda\xb3\x73\xb8\xac\x3d\x60\x24\x24\x61\xbb\xeb\x04\xb7\xf8\x4e\xf4\x47\xd1\xde\x8e\xd3\xff\xe1\x09\xfc\x7a\x70\x4e\x27\xe2\xee\x4f\x1f\x35\x95\xf4\xab\xfd\x9e\x99\xc7\x71\x4f\xfd\x25\x63\xb7\xf7\x1c\x39\x17\xf7\x5b\xf8\xdf\x16\x69\x77\x74\x82\xd5\x15\x6b\x9d\x76\x67\x07\x98\xa7\x58\x4b\xb5\xcb\x44\x60\x11\xc3\x5a\x2d\x08\x49\x87\x54\x18\x6b\xc1\x20\x64\x03\x0e\x9b\x98\x6b\x06\x27\x14\x38\x07\x61\xae\x1b\x9c\x1c\x61\xd9\xc7\x5a\x3b\x08\xf9\x08\x21\x58\xcb\x07\x21\xa3\xd0\x7d\x4c\x7d\x9c\x00\x69\x85\x5d\x0f\x4b\x23\xdf\x5d\x7d\x6a\xf8\xdb\x7b\x2c\xb1\x1c\xc8\x1a\x13\xb1\xfc\xef\x2f\x50\x02\xd1\xf9\xf8\xfc\x00\xe7\x44\xd1\xeb\xec\xaa\x97\xe3\xa3\xb3\x65\x72\x4e\x0e\xc5\x38\x62\x1e\x56\xe5\x8b\x2c\xee\x31\xe5\x8a\x64\xea\xcc\xfd\x38\x80\xe0\xfe\x73\x56\x22\xa4\x34\xf8\xb7\x8a\x62\xb3\x3c\x1c\x21\xaf\x3c\xc2\xec\x78\x2e\xcd\xcf\x5f\x4b\xf0\x5c\x68\xe2\x25\xe1\xf3\xe1\xe7\x18\xb7\x71\x00\xc9\x47\x8f\x5a\xc7\xef\xbe\x23\xb7\x3b\xf6\xb5\xf3\x8f\xc1\x9a\x49\xd5\xea\x0a\xc3\xe5\xa2\xd4\xe6\xb1\x8f\xe7\x8d\xba\x48\xb7\x6c\xdb\x83\xbe\xac\xe3\x00\xb2\x86\xde\xad\x5f\xae\xe4\xf8\x59\x3b\xdd\x2d\xa0\x7d\xd1\xc7\xf5\xe9\x28\x6f\xee\x34\xd5\x49\x16\xb7\xd9\x1b\xc9\xfd\xe5\x49\xd3\x14\x66\x8b\xfa\x38\x80\x44\xa2\x67\xa7\xb0\x8d\xf4\xeb\xde\x8e\x8c\xb7\xf0\x5b\x6a\x0f\x3a\x85\xd2\xdc\x82\x4d\x4b\x92\x1d\x83\xad\x6e\x9c\x31\x7a\x68\x78\xa8\xe8\xc0\x15\xe1\x7f\x73\x13\x46\x34\x10\xae\x1b\x96\xa7\x10\x82\x83\x9b\x03\xcb\x59\x08\xc9\x87\x4b\x8d\xe5\x2f\x84\xac\xc1\x4c\xc7\x72\x19\x42\x22\xe1\xb4\x82\x75\x32\x02\x21\xb3\x14\x70\x90\xc0\x3a\x22\x01\x32\x9c\x44\xf4\x78\x1c\x40\x22\xd0\xf5\xb0\xea\xd2\xe7\x0a\x2b\x5e\xa2\x3f\x7f\x2e\xfe\x24\x36\xd1\x6b\x63\x7b\xc0\x71\x7c\x74\xa1\x7b\x53\x2a\x70\xc1\xac\xef\xfa\xad\x74\x26\x00\x10\x7f\xf4\x55\xbe\x05\x0d\xc7\x1b\x97\x35\x8a\x85\xc6\xbb\x65\xf9\x75\x5b\x2f\x25\x4b\xf8\x86\xdf\x30\x99\x8d\x32\x62\x31\x18\x95\x60\x58\x48\x39\x05\x90\x36\x74\xfa\xc9\x0e\xe8\x53\xb8\x90\x84\xfa\xff\x90\xfb\x19\xeb\x61\x7f\x93\xd6\xff\x66\xb4\x4f\x3a\x85\xa3\xd2\x7c\xc1\x21\x75\xbf\x2a\xba\x6f\x3b\x81\x42\x4b\x44\xb9\x07\x57\xc8\x47\x45\x8e\x93\x74\x91\x3f\x72\xc6\x2d\x92\xd3\x2a\x04\xab\x9e\xc4\x5b\x8b\x69\x50\xad\xcf\x97\x25\x91\xc8\xe8\x08\xff\xa3\xd5\x84\xf8\x44\xc0\x4a\x80\x69\x38\x01\xe2\x0f\x2f\xd8\x61\x19\xbf\x4b\xd5\x60\x46\x61\xd9\xbf\x9b\x1e\xf0\x7f\x75\x30\xcf\xaa\x08\x93\x84\x2a\xbc\xfc\x8d\x75\x5c\x45\xf8\x92\x0a\xc8\xd3\xb1\x8e\xac\x76\x27\x9c\xdd\x1b\xc1\x18\xa7\x56\x10\x12\x07\xaf\xa2\x60\x1e\x5c\x11\x20\xd1\xb0\x73\x60\x1e\x5e\x11\x20\x99\x70\x0b\x62\x1e\x60\x11\x20\x3f\xe0\xbf\xa9\x60\x1e\x62\x11\x62\xac\x44\xf8\x12\xac\x73\x2c\xf8\x25\x7d\x14\xcb\x0d\xff\x57\xd2\xb1\x0e\xb4\x80\xac\x8c\x14\x27\xe5\x0e\x1b\x6e\x42\xf3\x3d\x32\x6e\x0a\x3d\x7f\x3d\x71\x9f\x63\xdf\x66\x55\xbf\x89\x0a\xcb\x95\x9c\x9a\xcc\x07\x61\x8e\x0b\x7b\xee\xf4\x78\x34\xf4\x5d\x70\xc0\x01\x64\x1c\x3d\xe0\x1d\x68\xa0\x3f\xc8\x2a\xba\xf4\xc8\x5c\xe2\xb5\xf2\xc6\xe8\xc1\xe7\xe9\x1d\x11\x34\xf1\xd1\xe3\x12\xfd\x26\xac\xac\x6e\xb3\x37\xf2\x71\x00\xc9\x45\xb7\x8c\x09\xb1\xfd\xf4\x16\x8e\xb4\xe1\x29\x5b\x57\xd3\x73\x48\x23\x2e\x3d\xd0\x2b\x62\xd4\x67\x25\xe6\xfe\x5d\x5f\x3a\x1b\xa9\x82\x1f\xc0\x01\x64\x19\x3d\xb0\xf1\xde\x33\x0f\x14\x6a\x39\x51\x7d\x42\x35\x45\xe6\xc2\xaf\x2c\x9f\xb6\x26\x72\xa0\x5f\x28\x16\xda\xf3\xa6\xe1\xfe\x4d\xb2\xaf\xdf\x71\x40\xda\x10\x7d\x8c\x17\xbe\xb5\xfc\xf4\xde\xa9\xe9\x3b\x1b\xbf\xc7\x5f\xdb\x90\x33\x47\x7a\x51\x1e\x1b\x7b\x2e\x30\x30\xe1\xc2\xc2\x6d\x17\xab\xce\x8e\x03\xc8\x00\xba\x82\xbc\xf6\xca\xec\xf4\xfe\x18\xf7\x48\x5f\xb3\x99\x37\x40\x24\x29\x82\x48\x39\xd4\x40\xb9\x5b\x5f\x6e\xa4\x85\x51\xf0\x37\x89\x2f\x4e\xf8\xdf\xa2\xb2\x4b\x0b\xa1\x4c\x84\x15\x18\x08\x19\x87\x13\x15\x56\x6c\x76\x35\x1f\xd8\x67\xb0\xc2\x03\x21\xcb\xf0\xff\x3d\xb1\x42\x04\xd3\xcf\x90\xf0\x25\x58\x41\x82\x5f\x32\x40\x0f\xd3\x0f\xeb\x90\x14\xc8\x92\x11\x1f\xfd\x9f\xea\x5a\x8e\x5e\x8f\x63\x76\x19\x7b\xda\x38\x24\xea\x22\x63\x3a\xd5\xb5\xb8\x4c\x39\xbd\xb2\x80\xfb\x66\xc4\x8b\xb3\xb3\x77\xf6\x22\x7a\x66\x3c\x1c\x38\x80\x64\xfd\xe7\xd5\xcd\x77\xa8\xef\xc7\x48\x5d\xd0\xb8\x16\x60\xea\xd1\x35\x6b\x7f\xb0\xaf\xc3\x37\x89\x4b\xa2\x71\xe8\xf2\x49\xbf\x00\xda\xa9\x4f\xdf\x01\x40\x5e\xa1\x4f\x09\xcc\x07\x28\xbf\x2f\xcf\x0f\xb1\x8e\x96\x5f\x58\x23\xba\x7f\x7b\x0f\xe3\xa1\x78\xd5\xe7\xab\x95\xd4\x6f\xf4\x26\x6f\xfd\xbd\x6c\x69\x04\x90\xbf\x68\x11\xbf\x76\x21\xe9\xa8\xb1\xd1\xfe\x5b\x11\xe7\x47\xc4\xaa\x5e\xd5\x9c\xbc\x5b\x77\x7e\xd3\xa1\xf6\x81\xbf\x02\xb5\x5c\xab\x59\xbb\x87\x0c\x0e\x20\xa5\xe8\x06\x66\x67\x1a\xf2\xd4\x49\xf9\xa0\xd7\x2d\x72\xd5\x49\xb9\x70\x8e\x42\xbe\x94\xe4\x63\x05\x5b\xac\x76\x5c\x86\xb2\xd5\xd4\x2f\x36\xca\x77\xcc\x47\x77\x24\xcd\x2b\x39\x05\x7c\xa1\xeb\xfc\x5c\xc5\xe3\x13\xf7\x68\xe7\x9a\x3b\x85\x3f\xa5\x3e\x94\xf1\x5e\xfa\x76\x31\x36\x31\x96\x6b\x6b\xaf\xf0\xbf\x45\x05\x2e\x40\x39\x6c\x17\x98\x81\x21\x40\xb2\x60\xfa\x61\xc6\x06\x1e\xee\x40\x99\x0e\x2b\x3e\x10\xf2\x17\x2a\xf8\x58\x21\x82\x90\x52\xd8\x2d\xb1\xa2\xb4\xeb\x0b\x6c\x7d\x98\x67\xee\x04\xc8\x1b\xe8\x3e\xe6\xb9\x3b\x01\x32\x06\x2f\x9a\x61\x9d\xbd\xef\x52\xa0\xfd\xf0\x9d\x9b\x58\x87\xf0\x40\x96\x22\x90\x85\xce\x13\x07\x90\x14\xf4\x28\x5c\xe8\x1e\x46\xfc\xf1\x7b\x53\xe2\x9d\xaa\xa7\x5c\xa9\xb8\x56\x2b\x6f\x06\xc6\x3a\x7f\xea\x33\x3e\xaa\x43\xdd\xee\xd6\xbe\xfe\x44\x38\x80\x34\xa2\xeb\xac\x1b\x12\x5a\x70\x8c\x2d\x4a\xd9\x4c\x86\xae\xf3\x4c\xc5\x62\x98\xa7\xf2\xef\x7d\xc7\x0e\xb5\x08\x74\x78\xc5\x99\x1f\xff\xd6\xff\x18\x07\x90\xd7\xe8\x8d\xe7\xff\xe1\xe7\x4c\x40\x5f\xc1\xe3\x56\x72\x05\xea\x92\x1c\x9c\x6a\xcd\xef\xc3\x06\x3f\x68\x2b\xd9\xbf\x7d\x1a\x23\xf9\x2e\x7b\x5e\x0a\x07\xa4\xd5\xd0\x17\xd3\xee\xc9\xc6\x23\x77\x0a\xcd\xd3\x4e\xec\xe3\x8e\x52\x7e\x9d\x2d\x76\x7d\x54\xf9\x8e\x4b\xe3\xcf\xbe\xf0\xc3\x23\x0b\x2d\xd1\xa5\x38\x80\xc4\xfe\xe7\xcf\x54\xf8\xe4\xd8\xf3\xdf\xc9\xa9\xab\xf2\x32\x5d\x15\xb7\x26\xaf\x5a\xff\x4c\xb4\xf2\x95\x2c\x5d\x5d\x48\xfb\x95\xaf\x48\xbc\xf7\x0d\x1c\x40\xba\xd1\x93\xf9\xf3\xfc\x27\xce\xbf\x8a\x1f\x26\x30\x31\x1d\xec\x2b\x2f\xd6\x4e\x19\x5b\x49\x4b\xf5\x1d\x5e\xe3\xc3\x89\x5f\xfe\x71\xeb\x02\xbf\x23\x0e\x20\x3d\x68\x77\xc9\xe3\xf7\x98\x7d\x3e\x22\xfc\x6b\xf8\xf1\x99\x2d\xc4\x70\xe1\x7d\xc2\xf2\xfd\x3c\x21\x1d\x49\x51\x95\x2c\xed\x0c\xf5\x20\x41\xee\x9d\xe2\x84\x0e\x27\x09\x69\x88\x5b\x2b\x77\xf8\x22\x3b\xdb\xcd\x82\xa1\xc3\x62\x9c\xb4\x01\xcc\x47\x95\x49\xb5\x4f\x30\x78\x7f\xd3\x8d\x5c\x1f\xa5\x15\xfe\xb7\xa8\xc3\x05\x4e\x81\x03\x01\x56\xe0\x21\xa4\x11\x16\x71\xac\xd8\x43\xc8\x6b\xf8\x82\x08\xac\xf8\xc3\x22\xae\x06\x7f\xd6\x88\xb1\x02\xf0\x4b\x62\xe1\x8e\xc0\x5a\x04\x08\xe9\x86\x5c\x01\x6b\x1d\x20\xa4\x07\x7a\x8f\xb5\x14\xbb\xdd\x65\xef\x72\xfd\xff\x75\x17\xcc\xeb\x29\xb2\x64\x24\x94\x64\x6e\x78\x80\xbc\x41\x0f\x37\xee\x71\x6d\xeb\xdd\xdc\x93\x2c\xce\xbf\x4c\xa3\xb7\xbb\x7f\x5e\x21\xa9\x3a\x15\x71\xda\xe5\x8d\x8c\xef\x6f\xbe\xa4\x8d\x7d\x51\xc4\x00\x89\x43\x37\x0b\x1a\xae\x7b\x4d\xc7\x55\x4f\x1d\x3b\x30\x26\x74\x73\x5f\xf7\xbd\x71\x9a\xc7\xad\x74\xdb\x2a\xe9\x65\xe5\x95\x5c\x2d\x57\xde\x08\xec\x03\xc8\x1c\x3a\xa7\xde\xe9\x93\xfe\x3e\x21\xa7\x91\x1d\x2f\xce\x4b\x91\x5d\xe7\x4e\x6c\xe1\xf3\xfe\xcc\xda\x72\x68\x50\xf6\x47\xf2\xa9\x78\xb3\xc7\x5d\x3b\x0c\x00\xdd\x5c\x14\x24\x06\x9a\x45\x34\x7e\x69\x0b\x9a\xfb\x4f\x5c\x5b\xa2\x39\x32\xdc\xe3\x9b\xcd\xbd\xf2\x8e\x1c\xf0\x45\x6c\xbc\x55\xb9\x1b\x89\x03\xc8\x36\x5a\xd7\xe4\x66\xca\x0e\x0f\x5a\x07\x61\x76\x1f\x24\x1e\x9e\xe0\xc0\x85\x44\x39\xfd\x10\x48\x1c\x94\x57\x22\xe1\xb9\xb9\x21\x72\x8a\xe8\x09\x0e\x48\x3f\x42\x5f\x1d\xfc\xe3\xfe\xcd\x43\x8c\x76\x92\x4b\xad\x59\x31\xc2\x8d\xa3\xae\xf6\x16\xe0\xfb\xda\x3a\xf7\xc5\xf9\xc7\x37\xea\x5a\xa5\x33\x4c\xc2\xff\x18\x13\x58\x29\xe1\x68\x83\x19\x17\x38\x8c\xc3\x46\x81\x15\x1b\x08\x99\x83\x1b\x09\x2b\x3c\xbb\xb4\x0a\xf6\x16\xac\x08\x41\xc8\x36\x94\x4e\xb1\xa2\x04\x37\xd2\x23\xc2\x97\x60\x5e\x75\x82\xbb\x15\xf2\x0a\xcc\xeb\x4e\xb0\x26\xc0\x0b\xc9\x98\x37\x9e\xe0\xb7\xc0\x5f\xb2\x60\xde\x7a\x22\x40\xde\xc3\x80\x61\x5e\x7c\x82\x2b\x09\x7d\xc1\xba\xfc\xb4\x3b\x8b\x50\xc3\x13\x78\xac\x5b\x50\x40\x96\x85\x08\xf7\xbf\x61\xd0\x0d\x2d\x36\x5f\x50\x57\xc8\xeb\x17\x73\xcd\x17\x49\x6f\x63\xd7\x7e\x79\x68\xe6\xec\xf1\x5b\xdf\x05\x7f\xde\xae\x09\xa8\x63\x73\x64\x3f\x10\xab\x88\x03\xd2\xcc\xa8\xc7\x97\xaf\xac\xa4\x79\x6a\x30\xbc\x28\xb1\x3c\x1e\xf2\xf6\x63\xff\xc2\xd5\x3d\x0c\x65\x45\x91\xa6\x72\xfd\xce\x99\x46\xe3\xaf\xf7\x5d\xde\xa9\x3a\xe8\xed\x7d\x92\x63\x2f\xb9\xec\xc5\xa6\x6f\x77\xe2\x5e\x9e\x39\x7a\xa9\x4e\x43\x8a\xf1\xb3\x22\x27\x89\xea\xb9\xb1\xf2\x6e\x22\x83\x62\x9b\x4b\x38\x80\xb4\xa2\x4f\xd4\x97\xa9\x0d\x79\xd9\x38\x3a\xd8\x84\x17\x96\x34\x06\x7d\x47\xa3\x67\xb7\x56\xfa\x32\xdd\x3f\x45\x1c\x8c\x0d\x66\xe5\x53\xaa\xcf\xdc\x31\x1f\x7d\xd3\x32\x7e\xa0\x4d\xd6\x8a\x4a\x39\xe4\x88\x24\x4b\x68\x5e\xb5\x8b\x88\x64\x5f\xe6\xc3\x62\x9e\xb5\x4f\xdc\x0a\x51\x4a\x2f\x72\x16\x13\x85\xff\xcd\x4b\x18\x50\x37\xf8\xf6\x57\x2c\x4f\x61\xd2\x32\x13\x56\x0d\xcb\xd7\xdd\xba\x0c\xb7\x2c\x96\xbb\xbb\xd2\x23\x3c\x4d\xc7\xf2\x78\xd7\x15\xc8\xd2\xb1\x2e\xbc\x41\xc8\x0b\xd8\x63\xb0\xee\xbc\xed\x1a\x46\xbd\xbc\xf9\x7f\x19\x88\x75\xf9\x0d\xc8\xd2\x2b\x90\x90\x7a\xe0\x00\xe2\x8e\x9e\xcf\x33\xef\x29\x94\x56\x6d\x5e\xf6\xd9\x5c\x64\x7b\x47\xf6\x4a\x46\x6b\x2d\x59\x39\x52\xb9\x46\x2f\xc1\x86\x44\x7d\xee\x4f\xe3\xcc\x43\x1c\x40\xea\xd1\x97\x34\x0a\x59\x4a\x58\xe2\x7a\xbb\xce\x93\x99\xd7\xce\xd4\x5f\x6e\x7d\xf9\x4b\xe0\x88\x48\xa4\xf5\xe9\x79\x1f\x5f\xa0\xe7\x44\xf7\x5e\x17\x07\x90\x60\xf4\xe7\x1b\x76\xd4\xc8\xd9\x7f\x0a\xa6\x94\x58\x74\x18\xe1\x2b\x92\x50\xa1\xb1\x92\x9d\xb4\x24\xce\x91\xd2\x5f\x92\x60\x7d\x7c\xd1\x82\x0c\x07\x90\x4d\x34\xbf\xb0\xb9\xe6\x2a\xe7\xed\x6b\xbf\xd7\x23\xeb\xf0\xf8\x9c\xae\xf3\xdb\x5b\x36\xaf\x49\xd3\x3f\xcc\x6f\x48\xb2\x34\xfa\xfc\xb6\xd8\x0e\xc5\x01\x24\x1f\xdd\x32\x5e\xfd\x66\x58\x4c\xea\xd8\xeb\xbc\x89\xdb\x23\xc5\x71\x5f\xa7\xda\x30\x4a\xe8\x40\xe7\xc3\x8f\xfb\x9e\x5f\xe0\xb4\x9e\xd3\xdc\xc3\xb6\x13\x57\xf4\xdd\x7a\x0d\xd3\x75\x6e\x8f\x14\xb1\x52\x7c\xeb\x97\xea\xe7\xa6\x1b\x94\x44\x9c\x1f\x85\x17\x9e\x35\x6d\xe5\x5e\x08\x78\x7f\xed\x10\xab\xf1\xce\x8c\x8d\x9e\x1a\xa9\xb8\xea\x74\xb9\xad\x5f\xba\xd3\x68\x9e\x96\x29\xe9\x5a\xdf\x67\x7c\x62\xad\xba\x84\x43\x99\xe3\x91\xeb\xe7\xf3\x6a\xdf\x59\x33\x85\xff\x2d\x8c\xbb\x77\x83\xe0\x00\x8f\x15\x49\x08\xa9\x87\xb2\x12\x56\x30\x21\x24\x18\x7e\x0b\x56\x3c\x21\x64\x13\x92\x11\xac\x90\xee\xca\xb4\xf0\x50\x19\x2b\xaa\xbb\x39\x0e\xef\x72\x60\x05\x76\x97\xf2\xd0\x2f\xaf\xfd\xdf\x7f\x98\xf2\xe8\x96\x84\x19\x2f\x6e\x8f\xd5\x88\x8d\xbe\xe9\x67\xee\x1d\xea\xe8\x92\x79\xe5\x41\xfa\x79\xe4\xc1\xf5\xe4\xb8\x6b\xb4\xd2\xdb\x84\xdf\xa3\xa0\xd6\x2f\x3d\x53\x4b\x8f\x88\xa1\x7a\x2b\xa1\x7f\xc1\x4e\xb6\xb5\xa0\x4d\x72\x7a\xa0\x4a\xc0\x6e\x92\xfb\xc3\x79\x45\x72\x25\xf1\x9a\x0f\x78\x80\x00\xb4\x22\x9a\xb1\x27\xf5\x63\xbc\x5b\x6b\x2a\xd3\x65\xdb\x84\x8a\xa5\xc1\x1a\x86\xf2\x24\x55\xe2\x50\x09\xfb\xd2\x7c\x36\x5e\x69\xb9\x1e\x77\x80\xa4\xa3\xef\xb4\x39\x08\xd0\x77\xfc\x56\x0a\x5c\x9a\xce\x10\xd6\xca\x0c\xab\xf8\xed\x4a\x2e\x42\x7b\xb3\xeb\x84\xf6\x0d\xa6\x67\x81\x8b\x57\x06\xce\x03\xe4\x33\x7a\x80\xea\xa7\xa9\x17\x2c\x9e\x8f\x37\xbc\xa8\xdf\x57\x27\x6a\x3b\x60\x9b\x8d\xa3\xc9\x91\x93\x55\x4f\x14\x5e\x09\x2e\x92\xf2\x91\x12\xc1\x03\x24\x06\x7d\x2b\x78\xf8\xf9\x45\xe9\x57\x39\x7c\xb7\xb7\xc9\xf6\x3f\x95\x88\x8c\xb0\xd1\x78\xe2\xca\x78\x85\x39\xd0\xda\xa3\x98\x28\xd4\xe7\xfd\x34\x2f\x40\x0a\xd1\xf3\x56\xd2\xfa\xcb\xae\xd9\xef\x31\xc5\x62\x2d\x5d\xb4\x1f\x0d\x0b\x88\xba\xf9\xef\x7f\x68\x1d\x66\xde\xee\x12\x3a\xf2\xbd\xaa\x8e\xc2\x1c\x20\x6d\xe8\x72\x7f\x25\xfd\xb3\x67\xc4\xa2\x47\xdd\xa9\x29\x8e\x24\x7e\xd9\x24\xf1\xea\x60\x7d\x62\x49\x26\x27\xcd\xb9\x43\xe3\x33\xef\x7e\x67\xff\x42\x3d\xaa\xa4\x3b\x5b\x7f\xf3\x96\xa2\xd8\x63\x1c\x83\xd3\x17\x59\x09\xca\xd7\x3a\xa2\x31\xdb\x9c\x72\xe2\x89\xc4\x27\x03\x47\xbe\x74\xbd\x02\x00\xa9\x43\x9f\x53\x3c\xb6\xce\x69\x96\x2c\xb0\x3f\xb5\x30\x40\xdf\xc7\xce\xae\x72\x6b\xf1\xf6\x44\xf7\x38\xcb\xbd\x07\x87\x38\x2b\x34\x9a\x33\x6e\x57\x03\xa4\xf5\x3f\xef\xc9\x13\x7b\x41\x34\xa6\x2b\x70\xd8\x47\x2f\x92\xed\xab\x95\xb9\xd8\x2f\xf5\x5f\x74\x63\x1c\x07\x5f\x00\x61\x5b\xa5\x7d\xc4\x72\x4d\x78\x80\xe0\xff\xf3\xae\xd4\x1b\xb1\x61\xc3\xaf\xac\x0d\x3f\x79\x71\x99\x9f\x62\x71\x4d\xdb\x52\xe0\x3d\xe7\x56\xc1\xf2\xea\x51\x57\x69\xd8\x02\x93\xd8\x2b\x80\x94\xfc\xe7\x7f\x34\xc5\xad\x4c\xec\x6a\x1d\x2c\x7e\x1c\x0a\x6d\xce\x91\x0f\x9d\x95\x3b\x70\xa2\x3a\x7b\xf1\x39\x6b\x4f\x14\xf1\x3e\x09\xa3\xc7\x25\x00\x59\x44\xb7\xb5\xd2\x7b\x22\x29\xae\x8c\xf7\x4f\x7c\x5b\x8e\x3f\xc2\xaf\x37\x1f\x47\x96\xc3\xd6\x1a\x9a\xa2\x7c\x2b\xcc\xd9\x2a\x93\xbb\x5d\xbb\x02\x00\x24\x02\x5d\xe3\x4e\x2c\xf5\xcc\x8d\x9c\xc9\xdd\x1f\x1f\xc4\xfa\xe0\xdd\xbd\x2e\x4b\x49\xa2\xe2\xc1\xa4\x23\xf6\xcc\xa4\x11\x1e\x75\x1e\xfe\xd1\xe7\x00\xb2\x89\x7e\xdc\xf8\x20\x7b\xc3\x9f\xc9\x91\xfa\x4b\xeb\x83\xb1\x97\x82\xce\x1d\xdc\xea\x95\xa1\x5b\x1c\x9c\x15\x8d\xd4\xcf\x3b\x49\x79\x4e\xad\x18\x00\xc4\x1b\xcd\x2c\x03\x68\x63\x33\x24\x02\x66\xac\xce\x52\x3c\xb0\xf8\x4c\xee\xf0\xa9\x3c\x60\xa4\x67\xe0\x72\x7f\x4b\x4c\x99\x85\x3c\xed\x8b\xc9\x20\x80\x54\xa1\x2b\x74\xf5\x7c\x3a\x15\xe9\x9a\xec\xfb\xd3\xb6\xfc\xbc\x7f\xb7\x5e\x49\x6c\xba\xae\xa8\xe5\xbd\x4f\x5f\xe8\x32\xe5\xee\x7a\x14\xec\x52\x0e\x00\x52\xf6\x9f\xd7\xda\xd6\xd7\x51\x0e\x86\xbc\xa9\xe4\x36\x7b\x86\xbb\x5b\x79\x7c\x95\x98\xd2\xb6\xec\x12\x57\x88\xf7\x52\xfd\x92\x62\x82\x0a\xbb\x00\x40\xaa\xd0\xa1\x5f\x3a\x33\x22\xfe\x3c\xff\x86\xf1\x0f\x07\x85\x9b\x94\xf3\x51\xc6\xb2\xd2\xeb\x3f\x1a\x66\xc7\xf9\xb9\xb4\xa4\xc7\xff\xb6\xe6\xd1\x02\x80\x34\xa3\x53\xb8\xa0\x99\xd8\xae\xc5\xe2\x88\xe3\xd5\xd3\x53\x1e\x35\xba\x43\x2b\xae\x3f\xa5\x83\x73\x0d\xad\x8e\x19\xff\x94\xd5\x4a\xb6\xb5\x94\x07\x48\x2f\x9a\x16\x5f\x18\xe7\x61\xe4\x99\x53\xf3\x7f\xe5\xb2\xf1\xca\xeb\xb5\xcd\x61\xf2\x67\x6c\xf6\x22\x07\xb5\x2d\xe6\x32\xf6\xf5\xc7\xac\x32\x97\xe3\x00\x52\x89\xbe\x67\xff\x2b\xe4\x05\x7d\xaf\x60\x5a\xa9\xe6\x57\x85\x1c\x9d\xac\xcc\x58\xfc\x1d\x67\xf7\xe2\x77\xaf\x9c\xfc\x85\xa7\x4d\xf6\xb0\xc4\x7d\x03\x00\x49\x41\x9b\x4f\xe9\xee\xdf\x22\x67\x19\xda\x37\xf1\xfc\x11\x79\xd1\x4a\x53\xf6\x57\xf3\x4f\xba\x37\x0f\x68\x3f\x35\xde\x78\x7b\x56\xd7\xd0\x2e\x19\x20\x7f\xd0\x13\x54\xc9\x1d\xcd\x91\xb0\xc5\xad\xc9\x38\xff\x4d\x7d\x96\x15\x39\x55\xcb\xd5\x74\xdd\xe9\x40\xd7\x1f\x59\x06\x47\x6f\xf8\xdd\x08\xe7\x01\x00\x09\x46\xb7\xa3\xd0\x03\x7a\xac\x26\x87\x32\xf8\xb7\xdc\x6d\x97\x67\x8b\xfa\x92\x96\xc5\x0f\x71\x5c\x51\xa3\x77\x13\xae\xf8\xb8\x50\xe0\x20\x72\x04\x20\x13\xe8\xf2\x61\x50\x4f\x6d\x65\x5a\x17\xa4\xff\x5c\xfa\xee\xcf\xd0\x03\xdc\x05\x5e\x51\x43\xf7\x56\x12\xba\x15\x93\xfe\x82\x27\xf9\x5f\xba\x7e\xa2\x1e\xfd\x60\x2b\xd0\x91\x1d\x7b\xaf\x5b\xd7\xb3\x5b\x2b\xe7\x78\xce\x9c\xe4\x61\x3a\x3b\x0e\x4a\x19\xb6\x12\x0d\xc6\xec\x27\xf4\x3a\x37\x77\xe6\x51\x74\x60\x52\x0f\x8a\xd9\x93\xeb\x0c\xb3\xb9\xa8\x98\x88\x6e\x79\x8f\x88\x5c\xd8\x76\x9b\xf7\xfe\xf4\x48\x2b\xef\xa4\x1f\xbf\xa6\xc2\xa7\x41\xd4\xa3\xd7\xfd\x92\x0c\x6f\xb7\x08\xb7\xa6\x3c\x64\x58\x59\x78\xdc\x66\xe2\xeb\x4d\xfc\xfd\xf4\x52\x9a\x46\x9d\x88\xf8\x6d\xfd\x8f\xc4\xc2\x00\x20\x2f\xd0\x55\x8c\xde\xa3\xc4\x1c\xf7\xa2\xf0\xf0\x57\xb3\xf5\xc7\x95\x88\x38\x87\x56\xb7\x73\xc1\x1f\x91\xcb\x32\x5c\xed\x3f\x8e\x9f\xa1\xfc\x7e\x08\x20\xbe\xe8\xc7\x85\xbf\xdd\x1d\x78\x4e\x4c\x76\xb5\xa3\x40\xf1\x19\x59\x99\xcd\x47\xa3\xd3\xf5\xe7\xe3\x6e\xd7\x09\xf0\x1a\x50\x2f\x27\x74\x72\xa1\x7f\xbf\x61\x25\x11\x30\xe6\x5c\x46\x6c\xc4\xa5\xbb\xec\x4f\x21\xf9\x37\x21\xf8\x9a\xfc\x0d\xa2\xcc\x3e\xb3\xcb\x41\xfd\xac\x38\xc7\xef\x3a\x38\x80\xe4\xa1\x73\x17\x88\x7a\x04\xcd\xb3\x6a\xee\x15\x6c\xd9\x4e\x36\xe8\x72\x8b\xb2\x10\x11\x53\x8b\x70\xec\x72\x0e\x14\x3b\x1d\xd6\x2a\xa7\xe7\x81\x7a\x34\x6d\xff\xbd\x30\x9a\x3c\x11\x2f\xd1\x67\xb6\xdc\x71\x8d\x25\x1f\x7e\x97\x3d\x64\xd2\x2c\x1f\xcc\xee\x6f\x7a\x3d\xd2\x34\x47\xbf\x80\x7a\xf4\xc8\xb0\xcc\x95\x2f\x65\x5f\x53\x66\x95\xda\xfd\xec\xf0\xc7\x3a\x1c\xc7\xef\x33\x99\x69\x36\xdd\x92\xf8\x76\x76\xb2\xc6\xf3\xe5\x0c\x1e\x20\x29\xe8\x14\xe7\x6a\x9f\x66\xf5\x58\xfb\xe4\x79\x8d\x23\xef\x0c\x49\xb4\xc6\x9e\x6a\x30\x11\xcd\xe5\x3e\xc5\x11\x26\x5a\xef\x93\x69\xd9\x2e\x07\x90\x1a\x74\xb1\xcb\x5a\x3d\xd4\xa8\x9b\x6e\xfe\xce\x49\xd3\x19\x9c\xed\xd5\xda\x48\xcc\xe2\x57\xa1\x7e\x49\xf6\x28\xc4\x63\x7b\xc9\x93\x7a\xc6\x03\x20\x7f\xfe\xf3\x96\x0c\xf3\x46\xf1\xef\x07\x06\x0c\xab\xdf\x3e\xb3\x7c\x7d\x58\xf7\xe8\xde\xc3\x77\x8e\xbf\xcb\x91\x30\x9b\x9a\xd7\x6e\x4c\x60\x26\xfd\x09\x00\xe2\x81\x4e\xc1\x39\xfb\x31\x7a\xbc\x53\x4b\x99\xf7\xe3\x4f\x2f\x84\x34\xa6\x6c\x5e\xea\x3e\xf1\x6c\xb6\xea\x99\x7b\x7e\x5c\x40\x9b\xfb\xe6\x87\x29\x80\x4c\xa3\xad\xc9\x65\xf7\x50\xa5\x55\x57\x5c\x8a\x5e\xa0\x21\x79\x9a\xa2\x9c\xf9\x6e\xec\xc2\xe7\xf4\x18\x95\x1a\x1b\xde\xc9\x17\x01\x54\x5b\x4e\x78\x80\xe4\xa2\x57\x53\xf9\xfa\xb9\x5b\x75\xb7\xe3\xf7\x30\x6b\x51\x07\x17\x5b\x8e\xb5\x9a\x65\xb6\x1f\x3d\x29\xd7\x24\x97\x2a\xf8\x9b\x38\xb5\x1c\x0c\x03\xa4\x14\xfd\xf1\xef\x8c\x99\x17\xbf\xa4\x33\xca\xd8\xb2\x0f\xbd\x39\x18\x29\x54\x73\x25\x39\xe0\xa2\xc2\xe9\xbe\x95\x5b\x7f\x72\x0e\x91\x46\xe2\x62\x01\x32\x83\xae\x8d\x75\x81\x4c\x1d\x55\x48\xf6\x89\x49\xb9\xfa\x08\x87\xa4\x33\xd9\x1b\xf2\xbd\x2f\x6d\x2b\x1d\x2f\x2a\xb1\x06\x5d\x22\x0d\x89\x61\x07\x00\x49\x46\x17\xbb\xa6\xf9\x7a\x39\x7a\x87\xcb\xb6\xef\xfd\xb6\xb9\x1f\xbb\xdd\xe3\x7c\x62\x59\x23\xe4\x2c\x6f\x28\x16\xb3\x69\x7c\x0b\x39\x46\x21\x09\x90\x7c\x74\x83\x3c\xe9\xf8\xc1\x22\x6d\x35\xef\x70\x56\x6a\x51\xed\xf8\x96\xe0\xd7\x63\x85\xb8\x3c\xf7\x67\xcb\x39\xca\x5e\xf3\xd3\x64\x39\x7c\x0f\x01\x90\x46\xbf\x5f\xd9\x74\xcb\xce\x31\xc0\x4d\x91\xff\xa4\x66\xbf\x4d\x49\x88\xd0\xd5\xfe\x53\x78\x59\x03\x6f\x2b\x77\xce\xb2\xad\xe3\x38\x16\x91\x10\x80\x8c\xa0\x4f\x72\x44\xc9\x70\xc7\x0d\x02\x9c\xcf\x9b\x56\x84\xa8\x75\x6d\x72\x4d\xb4\x5b\xb0\x48\xd1\x16\xdf\x48\xac\x9c\x97\x21\xba\x33\x4a\xf2\x0d\x0f\x90\x1c\xb4\x58\xc3\x15\xd8\xf0\x7d\x40\x8f\xb7\x5b\x56\xd1\x8d\x85\x77\x9b\x9d\xa3\x92\xe7\x97\xf8\xaa\x4b\xa8\x56\xf8\x89\x09\xc5\x96\xc0\x3b\x9e\x00\xa9\x42\x17\x0b\x52\x2a\x2d\xfb\x43\x82\xf2\x15\x3e\x71\x31\x55\x4b\x05\x54\xed\x1b\x9f\xdd\xdc\xf3\x78\x5d\x2c\xb7\x34\x69\xed\x39\x3b\xc6\xa4\x00\x52\x83\xce\x03\x97\xd2\xeb\x94\x99\x07\xff\x14\xb1\x28\xde\xde\xa6\xd8\x14\xb1\x4c\xcc\x30\x12\x4b\x7e\x03\x4a\xd8\x2e\x76\x0f\x32\x99\x59\x4a\xe3\x00\xd2\x8c\x9e\x06\xa6\xbc\xbf\x64\x56\x87\x65\x86\xdf\x93\x9e\xdd\xd6\x1b\xdb\xd8\x73\xbf\x20\xc6\xd6\xb8\xb8\xe6\x93\x7e\x8b\x41\xf6\xef\x68\xd1\x5a\x00\x90\x54\xb4\xb7\x8d\x67\x62\xb4\x84\x17\x6e\xdb\xf2\x95\x72\x39\xd5\x58\x86\xc7\x56\x3e\x72\xca\xf3\x39\xf3\xe9\x8f\xf0\x5b\xd6\x31\xc3\x00\x76\x4a\x80\x0c\xa3\x57\x96\xb1\xb6\x86\xd2\x7a\xe5\xb6\x81\xe9\x5b\xb1\x35\x31\x13\x31\x5e\xde\x7a\x11\x2a\xd1\x82\x22\x25\x9e\x04\x53\xa1\x16\xe1\xae\x51\x3c\x40\xdc\xd0\x69\xcf\x82\x6f\x0c\x12\x7a\xe8\xd3\x28\x76\x45\x4b\xfe\x7d\xf4\xb5\x9f\x2f\xc9\x55\x34\xbf\xa9\xb6\x59\x9a\xb5\x6a\x2e\xea\x64\xfa\xe8\x00\x64\x02\x5d\x09\x92\x06\xde\x12\xcb\xfd\x4d\xb5\x73\x27\x2d\x3c\x71\x46\x6b\xfe\xd9\xbb\x46\xfc\x35\xea\xd3\xde\x7a\xca\x29\xb7\x83\x5d\x4d\xe9\x03\x00\xf2\x17\x9d\x96\x4f\xb5\xf5\x1f\x90\x7f\xa9\xd4\x5d\x8c\x18\xa2\x2b\x3d\xe6\x44\xd3\x7b\x57\x38\x91\xec\x4f\x64\xb2\x50\x66\x6c\x5f\x7b\xc6\x46\x3b\xea\xd1\xcf\xd6\x67\xb2\xd8\x62\x9c\x46\x53\x9f\xa5\xd4\x51\x28\x17\x4f\xfb\x77\xcd\xf8\x8c\xf9\x0e\x19\xf4\xf9\x77\x4b\x70\x44\x05\xff\x00\x00\xf1\x45\xb7\xeb\x99\x70\xb5\xbb\x53\xc1\x92\xbc\xe9\x62\x27\xcd\x99\x6f\xce\xbc\x8c\xcf\x5d\xae\x08\x1f\xeb\x36\xf1\xf7\x12\x3d\xc6\xfe\xa0\xea\x2c\x40\xe2\xd0\xc5\xe3\x65\x89\x4c\xdd\x11\xde\x67\x4d\xd7\x0f\x29\xfd\x9c\x5c\x37\xd8\x4a\x4d\xa7\xb7\xe5\x7a\x3c\xa2\xa1\xb7\xd7\x9b\xd3\xa8\x26\xba\x8c\xa0\x30\x60\x0d\xb2\x40\x56\x8a\x88\xc5\xd5\x0d\x07\x90\x14\x74\x1b\x38\x2c\xc7\x6b\xc8\x99\xbd\x55\x5f\xb5\x7a\xe6\x77\xe0\x74\x6b\x95\x8b\xc5\xb2\x3e\xed\x53\xb3\xdf\xbf\xb8\x83\x68\xae\x32\xb4\x2e\x00\x80\x44\xa1\xe3\x38\xb3\x4e\xfc\xb8\xc1\xf3\xb0\x51\xc2\x23\xef\xb9\xd4\xa0\xfc\xfe\x6a\xdd\x21\xb7\x6f\xed\xae\x3f\x4d\x7f\x1a\xad\xb7\xaa\x1e\x89\x05\x48\x2d\x7a\x55\x57\x2f\xe5\xde\x1d\x33\x67\xcf\x7a\x16\x66\x1d\xa0\x1e\xe3\x78\x86\xe7\xa2\xb2\xb3\x83\x6c\x8c\xe1\xdb\xf2\xfb\xfb\xf7\xbf\x58\xb9\x8c\x03\x48\x1d\x3a\x69\xb2\x5c\xa3\xf6\x05\x18\x2f\xfd\x69\xf9\x20\xc2\x90\x71\xda\x55\xf7\x94\xdc\x91\x0c\xf9\x7e\x7c\xa5\xb7\x8f\xc8\xbb\xce\x9c\x53\xed\x38\x80\xfc\x40\xef\x6f\x5b\xf2\x7c\x96\xe1\x88\x86\x70\x1c\xd7\x76\xdb\xe9\x13\x8c\x5f\xcb\x94\xe2\x9f\x3d\x63\x7b\xb1\xd6\xbb\x54\xd1\x6c\x71\x88\x4a\x44\xf8\x1f\xbd\x94\x21\xfb\x3f\x15\x1b\xca\x4f\x98\x8e\x12\x20\x51\x90\xc9\x63\x39\x0b\x21\xb5\x90\x7e\x61\xf9\x0b\x21\x75\x50\x7e\xc2\x72\x19\x42\x7e\x40\x5e\x88\x49\x5a\x08\x10\x00\x7f\xcc\x82\x49\x5c\x08\x90\x74\x78\x16\x84\x45\x5e\x20\xe4\x33\x54\x38\x31\xf9\x0b\x01\x12\x03\x35\x3e\x4c\x0e\x43\x80\x14\x42\x8d\x0f\x8b\xc7\x40\x48\x1b\x1d\xbc\xbe\x83\x49\x68\x64\x5c\xc9\xfe\xf7\xcf\x17\xf9\xe8\x8a\x4d\x35\xd5\x1e\x5f\xce\xcb\xd5\xef\x33\x75\x65\xbb\xed\xe9\xa7\x63\x42\x5f\xca\x03\x43\x1a\x25\x62\xbc\x35\x16\x6c\x70\x74\x42\x6d\x00\x20\x9e\xe8\x7e\xb3\x6c\x7f\x4b\x99\xa3\x69\x92\xff\xf6\x1e\xab\xc4\xc8\x6d\x4e\xe9\x0d\x83\x3e\xcf\x46\x36\x8d\x0f\xdc\xe7\x97\x18\xbc\x79\x66\x26\x01\x32\x8d\x1e\x7e\xf9\x54\x3e\xbc\x63\xbb\xe6\xea\xe9\xfb\x50\xe2\xda\xe7\x8b\xb7\x36\xaf\xef\x3d\x72\x69\xb4\xa0\x5a\xd9\xc7\x67\x68\x64\x50\x5d\x38\x1b\x07\x90\x4c\x34\xaf\x51\x57\xe4\xd3\xad\x64\xf9\xee\x79\x23\xb3\xb0\x2a\x46\xf6\x01\xad\xce\x21\xfd\xbc\x3a\x2b\x9a\x4b\x05\x9a\xa5\xbe\x5d\xa5\x3c\x36\xc2\xff\x68\x35\x21\x3e\xf9\x50\x00\xc7\x34\x9c\x00\xf1\x84\xab\x80\x65\x3c\x84\x4c\x43\x9d\x0b\xcb\x7e\x08\xc9\x84\xd7\x64\x30\x89\x25\xdc\x50\x10\x82\x45\x2e\x21\xa4\x15\x9e\x2d\x63\xf2\x4b\x02\x04\x0f\x37\x14\x26\xc7\x24\x40\x4a\xa0\x61\x98\x3c\x93\x00\x59\x84\x25\x08\x93\x6a\x12\x20\x11\xb0\x04\x61\xd2\x4d\x02\x64\x13\x42\x30\x19\x27\x01\xe2\x0d\x4f\xd2\x30\x59\x27\x01\x52\x05\xab\x16\x26\xf1\x24\x40\xca\xa0\xfb\x98\xe4\x13\x7e\x0b\x5c\x17\x4c\xfe\x49\x80\x34\xc3\x12\x84\xc5\x41\x21\xa4\x17\x66\x32\x26\x0d\x25\x40\x2a\x61\x03\xc2\x64\xa2\xb0\x67\x41\x5f\x30\xd9\x28\x01\xf2\x07\x6a\xdc\x98\x84\x94\x00\x09\x86\x62\x1e\x16\x29\x85\x90\x09\x5a\xf8\x46\x32\x2c\x76\x0a\x64\x49\xc8\x28\xff\xf7\x26\xeb\xbf\xe8\x7a\xfa\x59\xb2\xad\xbf\xf8\xab\xb3\xcc\xf7\x17\xcf\xe3\xfc\x96\x7e\x71\xc6\xab\x8e\x76\x65\x35\x3c\xca\x28\x79\xbd\x12\x71\xfe\xb4\x8c\xd3\x0e\xa9\x45\xcf\xb4\x97\xc6\x6b\x7f\x77\x8c\x75\x79\x4e\xd4\xcd\x96\x09\xf4\xd0\x1e\xd8\xd8\xe2\x0f\xff\xb4\x36\x32\x2b\xb1\xa9\xa0\xa5\x26\x52\x5d\x87\x03\xc8\x1b\xf4\xf4\xf3\xd7\x68\x7f\xce\x98\x3a\xb8\x13\xf9\x76\xa4\xe1\x71\xba\x84\x2a\xe7\x89\x71\x8d\xb7\x1b\x71\x6f\x12\x0f\xdf\x63\xed\x77\xaa\x4c\xc3\x01\xc4\x07\xad\x3e\x7b\xd6\xba\xd3\x0e\x3a\xcf\x84\xd0\xd1\x9b\xd7\xc8\x1d\x4d\x1b\xc8\x12\x6a\x7d\x50\xd8\xcb\x3f\xb0\x99\xa9\xc2\x19\xfb\x20\x30\x44\xf8\xdf\xcc\x86\x11\xfa\x0b\x0b\x2a\x96\xe5\x10\x52\x0e\xd7\x01\xcb\x78\x08\x79\x03\x73\x0a\xcb\x7e\x08\xf1\x81\x6a\x2f\x96\x4e\xb0\x6b\x18\x0d\x3c\xed\xc2\x14\x0c\x64\x5d\x89\x29\x89\x77\x56\xbb\x18\x7d\x85\x41\xee\x32\x6b\x21\xbd\x6b\x72\x7d\xf3\x3e\xdf\xad\x7b\xf3\x6b\x5b\x55\xc9\xad\x0e\xe7\x42\xde\x9d\x7a\xdc\xcd\x1c\x9c\x20\xa8\x1b\x0c\x00\xe2\x87\x7e\x7e\x85\x8f\xd6\xfb\x73\xa8\xd7\xe3\x1c\xd7\x90\xad\x7e\x9b\xc2\x28\x36\xe3\x63\x75\x06\x85\xf8\xbf\x27\x44\x83\x1b\x59\xbe\x53\xd2\x01\x24\x17\xbd\xd8\xdd\xba\xda\x1c\xcb\xf2\x42\x42\xe4\xed\xc3\xf2\x15\x73\x7f\x23\xe3\x64\xab\xda\x3b\xd5\x74\x55\xe3\x7a\x94\xeb\x95\x83\x42\xfb\x71\x00\x99\x47\xcf\xa2\x1b\xa3\x31\xa3\xcf\x6b\x1c\x44\x9d\x24\xf4\x7b\x5e\x49\x3f\x29\x9d\x66\xd7\x90\xa5\x18\xe0\x9f\x12\x9a\x3e\x71\xcf\xac\x4f\x7d\xdf\xce\x06\x47\xcf\xa2\xfd\x5e\x4f\xc5\xef\x89\xba\x58\x72\xde\x3e\xfc\xf0\x14\x4e\x9f\xff\xeb\xa5\x59\xcb\xaf\x36\xa3\xf2\xe3\xae\xcc\x05\x33\x94\x4f\x3f\x09\xff\xa3\x97\x84\x80\x16\xc3\x0b\x02\x98\x8e\x12\x20\x7e\x10\x82\xe5\x2c\x84\xe4\xc2\xe4\xc0\xf2\x17\x42\xe6\xe1\x2c\x8a\xe5\xf2\x6e\x25\x84\x55\x1d\x53\x1c\x22\x40\x5e\xc0\x29\x11\x4b\x20\x82\x10\xdf\xbd\xf0\x3f\x2f\xb1\x94\x22\x20\x43\x45\xfc\x3f\x36\x94\x89\xde\xdf\xaf\x9f\x29\x4d\xc5\x9b\xa6\xf2\xb1\xfb\xcc\x3a\x27\x86\x66\x74\x97\xf8\x33\x34\xb4\xa4\x99\xdd\xde\xd8\xeb\xf8\xc2\xe4\x1c\xe3\xce\x77\x84\xa3\x33\xf0\x6e\xa4\x09\xd1\x70\xae\xa1\xe7\xeb\x3f\x6c\x22\xd1\x2f\xb3\x5e\x1f\xe0\x88\xed\xcb\x6e\xba\x73\x5a\xad\x70\x8b\x52\x3c\x90\xf9\x3c\x0e\x20\x7d\xe8\x01\x8e\xf1\xef\x01\xbd\xee\x71\x63\x9f\x80\xa6\x11\xf6\x4e\x01\x27\x0d\x83\xd6\xca\xfc\xed\x81\xb3\x49\x1f\xf7\x90\x2b\xf0\x2c\xd8\x18\xe1\x00\x92\x88\x3e\xff\x95\x13\xeb\xd3\xf5\x53\x19\x79\x1c\x36\xae\xf8\x80\xfa\xe2\x67\x5d\x2e\xfe\x1b\x54\x51\x3e\x67\x26\xef\x39\xb1\xed\x63\x38\x2b\x64\x2b\xfc\x6f\x66\xef\xce\x49\x70\x5b\x63\x59\x0e\x21\xe1\x30\xa5\xb0\x8c\x87\x90\x3e\xd8\xf6\xb0\xec\x87\x90\x44\xf8\x3b\x1c\x2c\xc9\x0e\x42\xf2\x48\xe1\x62\x63\x69\x77\x40\x46\x9a\xa8\xf2\x7f\xcd\x05\x2d\x68\xd0\xbd\x55\x6c\x39\x7f\x36\x2f\xff\x5b\xeb\x52\xa8\x8b\xf4\x90\x9c\xb1\x9f\x91\x58\xf6\x74\xcb\xe8\x79\xf9\x37\x1b\x8f\x89\xa2\x9f\xec\xb4\x56\x74\x33\xf2\x3e\xc6\xf5\xe4\x7b\x96\xdc\xc3\x11\x7e\x5d\x33\xfe\x73\x64\x05\xae\x77\x5c\xad\x98\x6e\xae\x14\xdf\x3e\x46\x77\x98\x6f\x2f\xd2\x83\x03\xc8\x20\xba\x1e\x1c\x56\xc9\x95\x70\xfa\x7b\x77\x9f\x50\x51\xdc\xab\xdf\x91\x73\xd4\x5f\x9c\xed\x11\x5a\x81\xa3\x7b\xdf\x5c\x3c\x21\x71\x82\x6e\xbe\x19\x07\x90\x52\xf4\x62\x7b\x7c\x6f\x7f\xdb\xdf\x54\x53\x9d\xb0\x50\xf6\xf0\xc2\x4f\x7f\x19\x6e\xd3\xdf\x7a\xab\xe7\xc9\x3d\x9f\x65\xc8\x7d\xca\x5c\x6d\x21\xfc\x4f\x1d\x96\xd9\xbb\xcd\x05\x9e\x4a\x63\x59\xbe\x3b\x4a\xc0\x7e\x84\x65\x3c\x84\x0c\xc2\x9d\x8d\x65\x3f\x84\x94\x92\xc1\x4e\x81\x25\xa5\x02\x59\x61\x32\x29\x22\x77\x1c\x90\x3e\x89\x8a\x94\x33\x7e\xcf\xdb\xf8\x17\xba\x15\xd3\x2e\xef\x8b\x53\xb5\x52\x8d\x39\x4f\x1a\xcc\x5a\x35\xbf\x28\xb9\x7f\x9c\x27\xeb\x9d\xb7\x27\xd9\x4e\x03\x43\x47\x36\xe0\x5a\x60\x05\x7d\x82\x00\x57\x11\x67\x98\x87\xe5\xb2\x05\x99\xb5\xc2\x87\x25\xdf\x70\x33\xbb\xca\xc9\x28\xd1\x90\x86\x5b\x07\x77\x8a\xed\x7f\xa4\x2e\x1c\x2e\x8f\xe5\xc5\xa5\x5b\x0a\x37\x12\xb3\xcf\xea\x28\xee\x63\x7a\x38\x41\xcb\x75\xc5\x37\xd6\x65\x2f\x75\x41\xfc\xb6\x98\x33\x0e\x20\x35\xe8\x95\xfe\x6d\xf5\xe6\xeb\x2d\x1e\xce\xb8\x2d\x41\xd6\x3f\xe4\x6f\x5f\x7a\x71\x4b\x39\xf3\x79\x14\x30\xab\xdf\xcf\xe9\x09\x30\x60\x5b\xdc\xd9\xd6\x53\x68\x55\xe4\xe2\xe9\x98\xf0\x59\xe3\x13\x3e\xa3\xd2\x86\xd2\xf3\x67\x1c\xa7\x8a\x78\xd5\x82\xcd\x55\x43\x0a\xa9\x6d\x49\x0a\xff\x18\xdf\x12\x11\xfa\x37\x37\x09\x01\x95\x3e\x09\x07\x73\x0c\x47\x77\xfb\x3b\xdc\x6f\x58\xbe\xee\xb6\x23\x98\x4e\x58\xee\x42\x48\x0d\xcc\x0d\x2c\x8f\x21\x64\x0a\x92\x0c\x4c\xd5\x1c\x26\x2d\x1c\xcc\x31\x95\x73\x68\x18\x64\x72\x98\xea\x39\x1c\x99\xe1\x94\x8d\x29\xa0\x13\x20\x1e\x70\x54\xc3\x12\xd1\x77\xb9\x2f\x34\x0c\x53\x47\x87\x0d\x1c\xf6\x49\x4c\x2d\x1d\x6e\x40\xf8\x2d\x98\x7a\x3a\x01\x32\x03\xd7\x05\x53\x52\x27\x40\x92\xe1\xea\x63\xca\xea\x50\x60\x80\x6f\x49\xc5\x94\xd6\x09\xb9\xcf\x4e\xf8\x12\x2c\x75\x1d\x7e\xc9\x08\x1c\x5f\x30\x05\x76\x02\x24\x07\xd6\x45\x4c\x91\x1d\x32\x4c\xa8\x8b\x61\x09\xed\xbb\x59\x09\xf3\x05\x53\x6b\x87\xa4\x14\x6e\x4a\x4c\xb9\x9d\x00\x49\x85\xee\x63\x49\xee\x10\x32\x0c\x17\x1f\x53\x75\x27\x40\xdc\xe0\x76\xc1\x54\xde\x21\x5d\x84\x34\x1e\x4b\x7d\xdf\x6d\x71\xf4\x90\x61\x62\xca\xf0\xb2\x94\x52\xae\xff\x63\x98\x5e\xe8\x63\x84\xc0\x3c\xdf\xac\x3f\xae\x48\xb0\xba\xe6\xd7\xf0\x11\x16\x6a\xed\x32\x89\x6d\xdf\x40\x0b\x52\xb9\xd9\xb4\x2f\x2e\x34\xd3\x96\x34\x38\x80\x04\xa0\x4b\xb7\x3f\xae\x79\xd4\x79\x80\x6a\x33\xc0\x94\x6c\x28\x34\xde\x9c\xcf\xdb\xd0\xb3\x65\x48\x39\xd6\xc2\x27\x91\xee\x55\xc8\x40\xd6\x4e\x6b\xc8\x43\xb7\x92\xa2\x38\xd1\x6e\x9f\xe9\x47\xde\xfa\x63\x2a\xa2\xa3\xae\xc5\x45\x15\x49\x64\xcb\x53\x6c\x61\x9c\xbf\xce\x47\x06\x0d\x70\x3e\x6c\xc0\x01\x64\x09\xfd\x3c\xcf\x3d\x70\x47\xd9\x73\xfb\x47\x7c\xff\x8c\x42\x74\x9e\x75\xb6\x90\xbf\x81\x26\x1b\xce\xed\x8f\x9f\xd4\x5e\xbb\x41\x7e\xde\x2e\xe1\x7f\x33\x1b\x46\xc8\x0b\xae\x03\x96\xe5\x10\x12\x00\x57\x1b\xcb\xf8\xdd\x59\x0c\xa6\x21\x96\xfd\x10\xb2\x04\x21\x98\x07\x22\x70\xbc\x87\x6a\x12\xd6\xa1\x08\x84\xc4\x91\x2f\xbf\xfb\xbf\xcb\x41\x99\x65\xe5\xec\x82\x1a\xcf\xc9\x82\x4d\x7a\x44\x8e\x1d\xe4\x9b\x79\xa4\x51\x2a\x14\x72\xb8\x05\xc7\x60\xa0\x77\xa8\x61\xc5\x76\x0f\xe1\x72\x10\x00\x88\x1b\xfa\x28\xa8\xfd\x97\xf0\xef\x13\x92\x91\xc7\xc7\x8b\x40\x9d\xcb\xb3\x5f\xe6\xe4\xd2\x4e\xa5\xd1\x66\xc4\xa5\x36\x1c\x2b\x97\xee\xca\x2f\x1a\x01\xc4\x0f\x7d\x0a\x57\xfb\x7a\xc9\x12\x49\xc3\xbf\x9f\x10\x1a\xba\x16\xe5\x50\xdd\xaf\x5a\xc2\x11\x37\xd4\x11\x74\xf4\x34\x11\xfb\x71\x3e\x79\x71\xf4\x5f\x0c\xe6\xa7\xd4\x53\x49\x5e\x7d\xf7\xa3\xb3\x89\x3b\xd7\xc9\xc0\x9b\x7e\x8a\xba\x03\x9f\x92\xf0\x39\xbe\x67\x3f\x73\x80\x94\xf5\x2c\x2b\x1e\x20\x2f\xd0\xb9\xfa\x42\xfb\x9d\x84\x7f\x7a\x46\x2b\xae\x3b\x70\x60\xb4\xcc\xf8\xbc\xd7\xe7\xb9\xa7\xaf\x59\xe2\x4e\x3a\x34\x9b\x8a\xbe\x8b\x7c\xa6\x07\x90\x00\xb4\xfa\xbb\xf8\x2d\xc6\xf3\x69\x6b\x1b\x2d\xeb\x60\x88\x18\x7e\x88\x51\xab\xb4\x5e\xda\xf7\xee\x71\x91\xfc\xa5\x5f\x6b\xeb\x1f\x74\xd4\x1f\x00\x24\x14\x9d\x79\x3a\x4f\xaf\xf3\xff\xa8\xf7\xad\x18\x20\xe5\xb2\xbb\x20\x74\x95\xc8\xba\xd9\x22\x25\x54\x41\xea\x63\xd3\xe5\x8f\xe3\x4d\xfd\xf8\x0f\x00\x20\x91\x68\x3a\xcd\xf0\x2a\x93\x68\xd6\x1b\x7f\xef\xc4\xb5\x1a\x63\x69\x66\x09\xbb\x78\xb1\xfb\x96\xc9\xf1\xb3\x13\x8f\x8f\x04\x32\x5f\x2e\x34\xe9\x07\xc8\x0c\x9a\x5a\x71\x0c\x72\x3e\xb1\x3b\x2b\x77\xdf\x82\xf2\xa5\xd6\x13\x6f\x1f\xea\x89\x4e\x60\x80\xcb\x76\x61\xec\x70\xa9\xdd\xb0\xf2\x3a\x82\xfe\x9f\xbe\x03\x61\xbc\x8f\x0b\x5e\xb2\xdb\x8b\x3c\x14\x32\x0a\xe7\xa9\x60\x31\xa8\x8d\x2c\xbf\xc3\xd4\xf3\xda\x9b\xb5\xd6\x8d\xb9\x29\xf3\x2a\x0e\x20\x0b\x68\x16\xe6\x24\x79\x29\xda\xb6\x3f\x6c\x2d\x92\xee\x9c\xf3\xa2\x4c\xbf\xe1\xbd\x86\x3e\xea\xfd\x22\x7f\xe7\xd5\x16\x46\x16\xf8\x49\x0f\xe8\xe2\x00\xf2\x1b\x3d\xc8\xb3\xfe\xbe\xd2\x29\x39\x2c\x28\xf5\xf1\x45\xe1\xad\xde\xf2\xf3\xe7\x25\xb8\x0d\xd6\xe5\x7b\x79\x6d\xfb\x17\x7a\xae\x1c\x90\x4a\xbd\x01\x00\xe2\x8d\xce\x80\xa8\xf4\x91\xea\xa1\xb6\xc1\x25\x2f\xb3\x0a\xee\xfb\xde\x66\x6a\x6a\xaf\x0d\xc3\x74\x7b\x8f\x9f\x65\xbf\x67\xb6\x5f\xe0\xb5\x97\x3e\x40\xd2\xd0\x27\xe0\xe0\x06\xad\xca\xd4\xbd\xb1\x77\x56\x69\xda\xcf\x66\x0e\xde\xbe\x70\xe4\x22\x5b\x27\x2f\x78\xe6\x0c\xf6\xeb\xfc\x5d\xf5\xfa\xdf\xab\x64\x27\xd0\x81\xdc\xcf\x75\xfe\xf2\x26\x9d\x71\xc7\x63\x0e\xf1\xa2\xcc\x33\xc6\x4c\x56\x34\xa1\x1a\x97\x79\xfb\x4e\x79\xfa\xb1\x2d\x9f\xac\x08\xb6\x04\x00\x49\x40\x5f\x51\x3c\xd3\xd3\xaf\xf2\x95\x58\xb3\xe1\x9b\xd5\xbc\x51\x4f\xf0\x1b\x93\x92\xfd\x07\x9c\x25\x49\xe3\xad\x9a\xe4\x4d\x46\x9a\xa6\x38\x9c\x00\xf2\xfd\x3f\xaf\x0c\xea\x22\x4a\x58\x61\x09\x9e\x17\xcf\x1c\xcb\xfd\x5d\xff\x71\x52\x40\x76\xf0\x36\xe3\x51\xf7\x7a\xe5\xa0\xd7\x6a\xf3\x0a\x65\x7f\x50\x8f\x26\xeb\x98\x86\xe8\x7f\xa0\xa8\xc0\xb3\x25\xb8\x58\x95\xdb\x24\x3e\xae\x32\xe9\x3d\x1a\x55\x48\x7f\x89\x51\xbb\x2c\x6c\x7f\x78\x1c\x00\x48\x00\x3a\x65\x62\x52\x83\x92\x32\x19\x52\x2d\xee\x5d\x60\xab\xcc\x3e\x1b\x32\xdc\x23\x39\x36\x53\xce\x37\x65\x76\xda\x3f\xf2\xf7\xfd\x28\x2e\x0d\x80\xd4\xa0\xd7\xe9\xba\xdc\x64\x51\x8b\xc1\x9b\xe0\xe3\xe2\xdd\xa6\xdc\xcc\x95\x55\x56\x4d\xc5\x33\x85\x0d\x3a\xeb\x75\x92\x53\x1f\xc2\xbe\x8d\x6b\xe1\x01\xf2\x06\x1d\xc8\x92\x2f\xdb\x9a\x2f\x1b\x54\xc3\x9e\xbb\x4a\x7d\xf7\x88\xa5\xb3\x8c\x5b\xfb\x19\xd5\x38\x11\x3f\x86\xe3\x69\x9f\xf6\xee\x88\x13\x01\x48\x23\x5a\xaf\xf1\xb5\x78\x57\x7d\xa8\x2a\x24\x4f\x86\x81\xaf\x35\x7f\x8d\xb2\xe3\x57\x49\xcc\xc8\x5d\x19\x27\x8d\x73\x97\xa9\x78\x16\x4e\xf6\x79\x00\x64\x0c\x6d\xcd\x66\xcb\x18\xfe\xc0\xbd\x83\x67\x80\x58\xad\xe8\x6b\x7f\x4a\x39\x93\xcf\x2c\xde\x07\x7c\xf2\xf3\xf8\xcf\xda\x9f\x6c\x05\x2e\x75\x38\x80\x74\xa2\xb5\x45\xaa\xfb\xee\xa9\x93\xa6\x26\x42\xda\x27\xe9\x4c\x22\xfd\x62\x17\xb6\x8f\x09\xf7\x6f\x68\x2e\x8a\x7a\xd6\xf4\xcd\x53\xbe\x1a\x3f\xb4\x93\x35\xe8\x93\xd2\xd7\x44\xd3\x5f\x85\xf9\x9a\xc7\x2e\x89\x3b\x24\x4f\xcb\xdb\x71\x3d\x78\xe4\xe6\x1d\x8c\xcf\x7f\xcd\xb8\x00\x3e\xfa\xfd\x79\x39\x07\x90\x4d\xf4\xc7\xc7\x2f\x8f\x6c\xb8\x1f\x0e\xa9\x58\x63\xca\x53\xae\x89\x2b\x8d\xa6\x12\xe9\x56\x37\x28\x99\x9a\xba\x9c\x35\x46\x9b\x76\x55\xd1\x7c\x27\x0b\xd0\x37\x8f\xf2\xd3\x19\x8a\x63\xbd\x02\x9e\xaf\x7d\x74\xfd\xf9\xe5\xd3\x06\x5f\x5b\x67\x96\x1b\xa3\xfa\x0d\xb7\xbf\xbc\xba\x3c\x6f\x1e\x57\x59\x00\xa4\x02\x5d\x3b\x2c\x1c\x6a\x7e\x2d\x68\xcc\xea\x0a\x1f\x20\x8d\xc8\xb4\x25\x6d\x6b\xf5\xfd\xde\x1f\x90\xa6\x18\x43\xdb\xd5\x4a\x9e\x98\xd5\x27\x81\x07\x48\x30\x9a\xd2\xac\xea\x67\x75\xf6\x1c\x7c\xa3\xfc\x27\x5b\xf2\xa6\x54\xeb\xf4\x62\x2c\xdb\xa3\x94\x02\x12\xab\x50\x27\xf7\x36\xf5\x51\xff\x0b\xec\x00\x89\x44\x6f\xa9\xd8\xb1\xfc\xd3\x29\x07\xdd\x67\xc8\x1b\xff\x1c\x69\xe7\x55\x3c\x71\x41\x64\xe9\xbd\x8b\x86\x79\xa0\x6a\x83\x9d\x23\x8d\x9e\x21\x17\x40\xea\xd1\x3b\x6a\xac\xd0\xe4\x22\xc9\x97\xb5\xcf\xfa\xd6\x61\xa9\xe2\xe2\xfe\x5c\x77\x34\x05\x5e\x2b\x5d\x18\x39\xfe\x6d\x92\x41\xbf\x49\xd1\xa3\x1f\x07\x90\x50\xb4\x6e\x32\xed\x14\x6e\xf3\xee\x54\x84\xef\xe9\x6c\x6e\xaf\x0e\x09\xde\x55\x2a\xcb\x91\x03\xac\x31\x77\x84\xf1\x1b\x0c\xdf\xaf\x9a\x17\xad\xe3\x01\x12\xfa\x9f\x8b\x8e\x73\x1a\xdd\xea\x61\xe4\xb2\x74\x15\x89\x5b\x5b\x43\xa9\x1d\xca\x6d\xaf\x71\xd1\x43\xaa\x0e\xe3\x76\xcf\xdf\x38\x12\xdf\x4b\x03\x48\x34\x3a\x38\x0f\x82\x1d\xe3\x99\x97\xeb\x84\x29\xa4\x82\x06\x93\x6e\x94\xad\x67\xea\x32\x9f\xb0\x1f\x12\x74\x7f\x4c\x7e\xb4\x45\x00\xef\x76\x0d\x20\xcd\xe8\x95\x7d\x5a\xb2\xd8\xb1\x36\xc9\xd4\x1e\xf1\xfd\x49\xae\xb1\x56\xf3\xb9\x16\xf5\x45\xa6\xb1\x73\xe9\x1c\x39\x17\xf7\x7c\x2f\x11\xca\x69\x40\x3d\x6a\xc9\x88\x6b\x12\xce\x7b\xba\xc2\xc6\x68\x2a\xb2\xff\x08\xeb\xd5\x26\x9c\x6c\x61\xad\x87\xb9\xde\xe9\xaa\x30\x53\x12\xbe\x13\x6b\xe8\x88\x0b\xaa\xaf\x98\xbf\x61\x1f\x8b\xc9\xf9\xec\xbe\x9d\xa3\xcf\x71\x6e\xbd\x25\xaf\x20\xf0\x79\xa1\xc5\x56\xd1\x3a\x63\xc9\x99\x30\x3c\x40\x5c\xd1\xe9\x3e\x9a\xf6\xf1\x11\x29\x9f\xbc\xbf\xc4\x4d\x8b\x30\xaf\x12\x12\xe2\x79\x91\x9b\x24\x0f\x55\xd3\x5e\x0f\x7d\x65\xf2\xbd\x50\x16\x62\x01\x90\x37\xe8\x6e\x90\x2e\x33\x6e\x2a\xf7\x70\x83\x7b\x26\xd9\x43\x0f\xdf\xf3\xea\xa6\x46\x04\x83\xe9\x9a\xe6\x46\x38\x0d\x95\xa2\xe9\x12\x47\xae\x36\x40\x3e\xa1\x57\x48\x67\x59\x71\xc9\x50\x9e\x86\xc1\x76\xcf\x5d\xc7\xd5\x34\xdb\xd2\x12\x3e\xe1\x3e\xd1\xd3\x39\xfd\xd4\x5f\xf8\x5d\xfa\x0e\x9f\xbd\x0c\x00\x12\x83\xce\x17\x53\xd1\xed\x98\x10\x97\x3c\xff\x84\xad\xbb\xd3\xd2\x75\x5f\x28\xca\x4b\x0b\x1b\xb9\xe6\x57\xb7\x23\xc8\x89\x1e\xc6\xab\xcb\x31\x03\xe4\x0b\xba\xe6\x75\x8d\x49\x50\x7b\xaa\x7d\xdb\x1e\x6f\xb2\x53\xf7\xa0\xe2\x1e\x13\xd6\x31\x1c\xd5\xa6\x4b\xb4\x2d\x35\x8d\x3f\x53\xb3\x20\xce\x85\xde\xd6\xeb\x2e\xef\xf7\x85\x68\x6b\xe6\x2b\xe7\xc8\x49\xd9\xbe\x20\x2d\x25\x5d\x4a\xe4\x2a\x16\x58\xdd\xec\xea\x3c\xba\x41\x36\xeb\x00\x00\xe2\x8e\x5e\x9d\x9b\x0f\x66\x18\x75\x0e\x06\xbd\xd2\xb6\xff\xb5\xe4\x45\x4b\x74\xf2\xac\x52\x3e\xc9\x5b\x81\xac\xd3\x49\x91\x5f\x54\x06\x52\x9f\x6e\x03\x64\x1c\x9d\x2a\x5a\x13\x67\xab\x37\xaa\x6a\x9c\xd8\x25\x9f\x7a\xba\xb6\x0c\x49\xa8\x34\xa5\x53\xb6\xe5\x6f\xa6\x6c\xd8\xc9\x77\x6f\xea\x8f\xf2\xa0\x1e\xf5\xb2\xa1\x0b\x31\xc8\xae\xf9\xab\xa8\x63\x7b\xac\xff\xfd\xf1\x9a\x87\xa2\xdc\x1d\x97\x48\x6e\x30\x38\xa6\x1f\x67\x20\xbd\x78\x6d\x16\x0f\x90\x08\x74\x0c\x6f\x9e\x31\x92\x9e\xe3\x15\x28\xe7\xbd\x2e\xf5\x83\x64\x7f\x5f\xcf\xcb\x56\xc5\xcf\xd1\x96\x7c\x5e\x74\xfd\x3c\x8f\x9a\x0f\x68\x4f\x00\x24\x17\x6d\xc9\xdd\xa7\x72\x91\xf7\x72\xe2\xf6\x90\x7e\x3c\xdf\x25\x6d\x76\x91\xae\x5b\xdf\x61\x6f\x6c\xd3\xea\xdc\x84\x72\xd0\x68\x53\xc6\xe6\x59\x80\x94\xa3\xfd\x4c\x2c\x0c\x1b\x0f\x7f\xd3\x7e\x8b\xd5\xe9\x8a\x28\x7d\x1b\x57\x00\xfd\x7c\x9f\x31\x7f\x1b\x09\xef\x96\x59\x49\x5b\x71\xda\xdd\x28\x00\x90\x12\xb4\x08\x72\xff\x66\xef\x45\x7c\xf4\x0d\xc0\xfa\xa9\xdd\x6f\xba\xea\x86\x00\xdb\x69\xa0\x77\x44\x74\x40\x26\x7c\xe8\x6a\xa2\x42\xd7\xaf\x34\x80\x7c\x47\xcf\x31\x22\x82\xa1\xcc\x4d\x47\x19\x8e\x92\x1d\x6e\x1c\x2b\xee\x0a\x20\x77\xfa\xbb\x98\xd0\xff\xd1\xf3\xf7\x03\x8b\xcb\x7a\x77\x52\x1e\x58\xa3\x1e\xfd\x4a\xc1\x55\xf3\x28\xa9\x80\x5f\x62\xa8\x4f\xfa\x53\xd3\x59\x9a\x7b\x19\x7d\x5f\x05\x5c\x52\xaf\x50\xe4\xbd\xdd\xff\x75\x32\xe3\x36\x1e\x20\x45\xe8\xba\x2e\x52\xfe\xa0\xe5\x73\x84\x52\x9b\xea\xdf\x1b\x63\x6e\x5b\x3f\xe8\x1e\x71\x7e\x9a\x08\x12\xa5\x1b\x6d\x6b\x28\x2f\x51\x03\x51\x76\x00\xa9\x45\xef\x4e\xe6\xfa\x5f\x19\x4e\xcf\x6c\x9f\x74\xd8\xf9\xe2\x7f\xb9\x55\xea\xf8\xb6\x9a\x2f\xcd\x57\xa7\x9f\x58\xbd\xae\x19\x62\xb3\x25\x3b\x0c\x90\x25\xf4\xe3\xfe\x73\x4a\xb4\xe7\x2e\x7a\x64\x5c\x56\xbb\x28\x54\xbd\xb9\xed\xdb\x7b\xf7\x46\x40\x52\x42\x3f\x55\x6c\x8f\x8f\x83\xc8\x93\x04\x7e\x00\x90\x32\xf4\x3e\x3a\x5c\xef\x4a\x25\x7a\x8b\x5f\x6b\x53\x79\x61\xcb\xea\xc7\x81\x29\x49\xa3\xc5\x07\x07\x9e\x31\xc6\xd3\x39\xb3\xbd\xd8\x92\x53\x59\x00\x48\x05\x3a\x73\xa5\x45\x06\xa5\xdc\x67\x5b\xba\x0e\x4c\x44\x29\xca\x26\xa8\x6c\x29\xf4\xb6\x33\xc7\xa7\x1d\x08\xca\x59\xb6\x5d\x37\x30\x67\xab\xc2\x01\xa4\x05\x9d\x04\x2a\x77\x3f\x52\x70\x32\x6b\x7b\x24\xae\x68\xe2\x83\x35\x6e\x00\xf5\x5f\xce\x11\x3a\x51\x57\x38\x68\xe7\x22\x42\xe6\xea\x11\x67\xe1\x7f\x9c\x32\x65\x28\xff\x8f\x58\x41\xee\x8e\x35\x69\x42\x88\xdf\xee\xab\xa0\xb0\x46\x4e\x20\x43\x47\x24\xbc\x43\x92\x66\xd1\x3e\xe8\x4f\x2d\x9d\x9e\x94\xd3\xef\x0c\xcd\x6e\x5e\xa3\x67\xbf\xda\x30\x57\xc3\x46\xa5\x4c\xbf\x57\x7a\xd3\x2f\x49\x9e\xcb\xbe\x65\xff\x0e\xdd\x45\xa7\xda\x1d\x07\xe5\x94\x02\xd5\xd5\xec\x58\xf5\xc4\x87\xe3\xbf\x8e\xaf\x3c\x7c\x9e\x6c\xcd\xf1\x51\xf9\x16\xe3\x37\xa9\x0c\xf6\x52\x06\x7a\x1c\x40\x3e\xa3\x73\xad\xfc\xc3\xad\x8a\xdf\x8f\xd3\xcd\xe5\x68\x44\xa5\x1f\x9b\x29\x16\x6b\x9b\x8a\x54\xfd\x30\x70\xb4\x8c\xa1\xa2\xd1\x2e\xd4\xf5\xef\xc2\x01\xe4\x1d\x7a\x96\x2c\x53\xb2\x77\x3d\x9f\xbf\x74\xd7\xff\xbd\xe1\x82\x4d\x92\xe9\xd1\x59\x1e\x9d\xea\x73\xaf\x23\x1b\x03\xaf\xe7\xd9\x8d\x4d\x15\x30\x0a\xff\x9b\xd9\x30\x40\xb3\x30\xa6\x58\x96\x43\x48\x15\x14\xd0\xb0\x8c\x87\x90\xcf\x50\x11\xc0\xb2\x1f\x42\xde\x41\xbd\x1e\x73\xf6\x27\x40\x5e\x40\xc2\x87\x39\xff\x13\x20\x01\xf0\xc6\x01\x26\x07\x20\x40\x42\x21\x7b\xc3\xa4\x01\x04\x48\x24\x3c\x68\xc2\xa2\x02\x10\x32\x43\x02\x85\x62\x2c\x4e\x00\x64\x88\x19\x28\xdd\x71\x00\x49\x40\x6f\xd6\x28\x13\x6a\xd1\x8a\x0a\x37\xfc\xd0\xeb\x26\xc6\xf8\x83\xdd\xbf\x9e\xb4\x09\x6a\xc6\x0f\xf2\xc5\xd8\x69\x3e\x3e\xd0\x38\x94\x97\x87\x03\xc8\x1a\xba\xa6\xbe\x78\x73\x39\xf7\x4f\xab\xa6\x5a\x8d\xfd\xfa\x1b\xd5\xeb\xbf\x92\x49\x5c\x6e\x4a\x85\x8f\xb3\x19\x16\xcf\x27\xbb\x5b\x5a\xbc\xfd\x5f\x22\xa2\x2b\xd9\x0c\x4f\xe9\xda\x85\xe9\xc4\xb5\x0f\xf8\x48\xef\x07\x8b\xfd\x61\xc5\xf3\xec\x33\x83\x9a\x57\xf6\xff\xfc\x71\xa1\xe5\xcc\xa1\x40\x17\x1c\x40\x7a\xd1\x1b\xe9\xa8\xdc\xa2\xda\x48\xed\xa3\xc3\x74\x6f\x95\xbe\xd6\x32\xe5\x3b\xbd\x6c\x64\x52\xaa\x26\x7d\xdc\x43\x71\xa3\x5e\x19\xd8\x9f\x1c\xc4\x01\xe4\x2d\xba\x25\x24\x76\xd9\x87\x9f\xac\xe2\x3a\x33\xdc\x3a\xaf\x63\xbb\x67\xf1\xee\xa3\xf1\xdb\x5a\x45\x86\xfb\xe4\x29\xdf\x30\x58\x1e\x6d\x88\xef\x10\xfe\x37\x37\x61\x40\x13\xe0\x1a\x60\x79\x0a\x21\x6b\x50\x95\xc1\x72\x76\x37\x6b\xa1\x22\x89\xe5\x2f\x84\xf4\xc2\x1d\x88\xe5\x32\x84\xbc\x85\x37\x8b\xb0\xf8\x1f\x84\x2c\xc0\xb3\x2c\x4c\x0a\x48\x80\xfc\x86\xca\x1f\x26\x0b\x24\x40\xbc\xa1\x2f\x58\x4c\x10\x42\xd2\x60\xc4\x30\xc9\x20\x01\x32\x01\x97\x12\x93\x0f\xc2\xd5\x87\x3f\xae\xc2\xe2\x84\x10\xf2\x9d\x11\x0a\x6c\x98\xe4\x50\x56\x50\x90\x88\x68\xa7\x77\x74\xa0\xef\xaf\x7e\x96\xf0\xdc\x1b\xa6\x37\x84\xcf\x95\xc8\x2f\x5e\x4f\x69\xcf\x04\x0e\xb4\x7a\x39\xf1\x0b\x37\x48\x33\x18\xfc\xe3\x03\x7b\x47\x71\x00\x79\x8f\x1e\x24\x41\x5d\x52\xd7\x1e\xea\xee\xf9\x39\xcb\xc3\xdf\xae\x05\xd5\x1c\x90\xf6\x1b\x98\x1d\xe7\xe3\x77\x90\xa8\xc2\xb9\x6a\x5f\x33\xbe\x86\x03\x08\x0e\xbd\x65\x03\x79\x42\xda\xf9\xa9\x0f\x39\x79\x7e\x7b\xa3\x53\x49\x86\x0f\x4d\x92\x54\x65\x56\x6f\x5e\xec\xe7\xdd\xea\x6d\x24\x3a\x7b\xd4\x1f\x07\x10\x3c\x9a\xa9\x5c\x8f\x95\xd4\x18\xe0\x99\xf3\xc8\xd2\x49\x36\xef\xa3\x71\x55\xfa\x7c\x38\x45\xc2\xe5\x18\xf1\xcf\x60\x91\x9b\xdf\x1c\xd3\x83\xde\x0a\xff\x9b\xd9\x30\x42\x1d\xf0\xf4\x01\xcb\x72\x08\x79\x0f\x85\x71\x2c\xe3\x21\x04\x07\x77\x21\x96\xfd\x10\x82\x87\x99\x8b\x49\xd3\x61\x23\x80\x55\x1d\x8b\xaa\x43\x48\x0d\xdc\x52\x98\x6c\x9d\x00\x79\x03\x93\x1d\x93\xb1\x13\x20\x8d\x50\xb3\xc6\x62\xed\x10\x32\x06\x0d\xc3\x24\xee\x04\x48\x27\xd4\xdf\x31\xb9\x3b\xdc\xeb\x70\x5d\x30\xf9\x3b\x01\xb2\x09\xbf\x05\x93\xc2\xc3\x8d\x0b\xaf\x6b\x61\xd1\x78\x08\xa9\x80\x63\x00\x26\x93\x27\x40\x82\x61\x5a\x62\xb2\x79\xd8\xd3\x61\x8e\x61\x31\x7a\x08\xa9\x87\xd5\x11\x8b\xd4\xef\x0e\x1b\xf0\x3e\x01\x26\xaf\x87\x10\xd8\x1c\x30\xb9\x3d\x01\x12\x0d\x23\x86\xc5\xef\x21\xa4\x99\x14\xfe\x7f\x24\x16\xd1\x07\xb2\x74\xae\x14\x64\x3b\x03\xca\xef\x03\xff\x39\x7e\x78\x56\x7a\xd2\xe8\x61\x99\x8b\xaf\x78\x5d\x45\x16\xcf\xb1\xd7\x32\xdb\x17\x9a\xf6\x18\x0c\x90\x98\x45\x7c\xa5\xaa\xac\x7d\x8d\x03\x48\x09\x5a\x71\x73\x50\xbf\xb6\x72\x90\xd1\xbd\xd8\xb3\x7d\x55\x4b\x4f\xe1\x4b\x8f\xf5\x53\xe7\xf5\x5b\x7b\x66\x0a\x49\xe7\xf4\xcf\xfc\x5c\x6f\xd0\xdb\x61\x1f\x68\x32\x54\x12\xce\x6f\x7e\x60\xe6\xe3\x64\xe8\xc3\x24\xf1\xdf\xeb\x25\x47\x35\x8c\xc1\x78\xfe\xfb\x27\xc5\xc3\x08\xeb\xfb\xe7\x9b\x91\xe6\x38\x80\x84\xa1\xab\xf5\xb9\x85\x8b\x53\x35\x7e\x7a\x41\xa3\xae\xba\xcd\xe5\x4f\x34\xcc\x9e\x7c\x7a\x70\xa3\x5e\xd7\xe7\xea\xbe\x94\xa3\xdc\x36\x89\x86\xd5\x38\x80\xf8\xa3\x27\x71\xea\x1a\x45\x96\xb1\x7b\xa2\xcb\xe9\x02\x47\xa3\xc5\xc2\xc6\x12\x68\xde\xca\x4e\x2f\x8e\x6b\x4a\x3c\x77\x6b\xf1\x0b\x65\xbd\xc5\x27\xfc\x6f\x6e\xee\xb6\x5b\xb8\x6b\xb1\x3c\x85\x90\x12\x58\xb4\xb0\x9c\x85\x90\x16\xb8\xd4\x58\xfe\x42\x48\x18\x2c\xf3\x58\x2e\x43\x88\x3f\xc9\x72\x38\xc9\xbf\x69\x3b\x40\xc6\xd5\xcb\x75\x27\x39\x26\xd1\xad\xea\x9d\xfe\xc7\xe8\x5f\xee\xad\x86\x9e\xea\x45\x2c\xb8\xe4\xb6\x90\x2d\x09\xd1\x78\x55\xce\xf4\x2a\xa9\xc6\xbd\xef\x14\x02\x78\xfe\xf7\x5a\x3d\x34\x8d\xa2\x58\x76\xbc\xf1\xc6\x5f\x22\x32\xb4\xb1\xfb\xd7\xf8\xd9\x25\x4f\x1d\xca\x67\x7b\x8d\x94\x6a\x83\x38\x69\x1a\xb5\x42\x78\x99\x9b\x70\x00\x09\x47\x4b\x88\xc7\x1a\xae\xb4\x58\xe8\x96\xf8\x12\x67\x6c\x7b\xe3\x5c\x5f\xeb\xa9\xe9\xcc\xa7\xd9\x66\xcb\xc4\x74\xb0\x28\xb6\x86\x26\xae\xbe\xc5\x01\x69\x74\x2e\xe5\xf4\xd3\x16\xbf\xdb\x38\x23\x73\xbe\x8c\x57\x14\x39\x9d\x27\xf0\x72\xe0\x49\x32\x99\x64\x2d\xa7\xc6\xc6\xd7\xbb\xbd\x1f\xae\xed\x7c\x7c\x05\x3a\x37\xaa\x9d\x19\x7b\x9e\xd7\xb2\x45\x53\xe5\xca\x6e\xf3\xbb\xc8\x1d\xdd\xf0\xbe\xab\xc9\xd2\x25\xe1\x77\x69\x43\xcc\xa2\x46\x89\xf9\xa8\xf0\xbf\x79\x09\xe3\x39\x09\x8b\x0d\x96\xa3\x10\x92\x0a\x29\x17\x96\xaf\x10\x12\x4e\x41\x38\x82\xc6\xf2\x97\x00\x91\x86\xd9\x84\xe5\xf1\x6e\x75\x86\xbc\x0e\x53\xc5\x23\x40\x5c\x61\x0b\xc4\x54\xf2\x60\xa3\xdd\xe5\x75\x58\x6a\x1e\x01\xf2\x09\x56\x67\x4c\x41\x8f\x00\x89\x81\x6d\x03\x4b\xd4\x83\x90\x2f\x34\x70\xaa\xc4\x54\xf7\x64\x53\x88\xfe\xff\x54\xb9\x85\x56\x18\x6c\x7e\x1e\x1d\xac\xe4\x16\xb5\xda\x20\x9a\x92\x71\x6d\xa5\xf7\x68\xf0\xc9\x5e\xb8\x29\x3b\x4a\x91\x5a\x4c\x1d\xbc\xaf\x40\x78\x0a\x07\x90\x42\x74\x5d\xd3\xd7\x8b\x4e\x77\x9e\x70\xa9\xbb\x7c\xe2\x3b\xe5\xd8\xcb\xa9\x2c\x7a\xdb\x21\x5c\x2c\x9b\xa4\xec\xc5\xbb\x61\x4e\xdf\xb8\xe3\xf2\x77\x5a\x06\x9a\xa8\x45\xc4\xb2\x79\xf8\x5a\x6f\x58\x28\x19\x89\x65\xd6\x70\x17\xaa\xc8\x4b\x3b\x99\xe2\x6c\xa8\x2f\x78\x73\x4b\x55\xd4\x69\x5c\xe6\xc3\x01\x64\x0a\x5d\x97\x65\x04\x02\x9d\xf6\x2b\x75\x7d\xfd\xde\x36\xeb\x0e\xe8\x72\x87\x68\x9d\x78\x62\xfe\x9a\xb5\x6b\x32\x6e\x5a\xe0\xaf\x26\x99\xbe\x13\xfe\x37\xb3\x61\x84\xb6\xa0\xbc\x80\x65\x39\x84\x14\xc2\x0a\x85\x65\xfc\x6e\x97\x84\xab\x8d\x65\x3f\x84\x4c\xc1\x6a\x8b\xa9\xb3\x12\x20\xee\x70\x46\xc2\xd2\x5a\x21\x64\x9c\x11\x36\x56\x2c\xd1\x15\xc8\x92\x55\x12\xff\xaf\x76\x56\xa0\x55\x3d\x8a\x36\x46\x3b\x5a\xea\xdf\x77\xf4\x6d\x34\xc6\x3b\x62\xee\x4c\xdc\xd3\x24\xba\x6d\x72\xeb\x66\xf8\x82\xd0\xe2\x71\x5b\x76\xbd\x33\x38\x80\x0c\xa1\x13\xa4\x4f\x43\xc8\xcc\x8e\x8b\x9c\xc3\xf8\x94\xee\xb0\x99\x35\xcd\xde\x07\x26\xde\x2e\xc4\x8b\x32\x89\xc6\xfe\x7a\x6d\xdb\xc4\xf7\x9f\xec\x30\x2e\xf4\xaf\xf8\x94\xae\xc6\x0b\xbe\x24\x0d\x55\x08\x0b\xb3\xbb\x4b\xcd\x7d\xad\xf9\x7b\xe6\xf2\x32\xeb\x9e\xc2\x3f\xe1\x89\x0e\x19\x1f\xf6\x9d\x20\xc1\x01\xa4\x00\x7d\xbc\xd3\x7a\x81\xf2\xab\x89\xdb\x3d\xaa\x4f\x0d\xdc\x0c\xf2\x91\x5a\x3a\x34\x9f\xd3\x7f\xf2\xe8\x90\x8a\xf6\xc4\x1e\x2c\x65\x12\x8a\xc9\xc3\x01\x24\x0f\xfd\xf9\x9f\x3f\xb5\x26\x1d\x3e\xd9\x76\x4d\xfe\xc9\x44\xe4\xe2\xb8\x59\xaf\x6e\x6e\x7b\x2e\x8e\x5d\xf1\x29\xe7\x52\x37\xe3\x4c\xef\xcd\xb3\xc2\xff\xe6\xe6\x6e\xc5\x81\xe5\x03\xcb\x53\x08\x19\x82\x09\x85\xe5\xec\x2e\x29\x85\x27\xf4\x58\xfe\x42\x48\x01\x1c\x87\xb1\x5c\x86\x90\x3c\xf8\x2d\x98\x0a\x3b\x01\x12\x01\x33\x1d\x53\x65\x27\x40\x72\xe1\x08\x89\xa9\xb4\x13\x20\xe5\x30\xd3\x31\xc5\x76\x38\xbd\xc0\x8d\x8e\x25\xb8\xef\x72\x72\x5a\xf8\x2b\x35\x2c\xe5\x1d\x20\x2a\xa4\x3b\xb5\x73\x0d\x9d\x8a\x2b\x33\x37\xce\x45\x44\x0b\xbd\x3a\xd8\x8d\xa8\xcc\xa9\xec\xf9\x52\x6b\xcd\xbd\xd6\xc4\x3f\x52\x5c\x75\x44\xa6\xe6\x55\xc1\xbe\x07\x3b\xdc\x11\x9d\x8a\x9c\xd2\x2a\x46\x97\x5f\x3f\xf3\xbc\xc6\xd0\x4d\xfe\x72\x99\x64\x4a\x50\xea\x14\x0b\x3f\x47\x77\x43\x5e\xd3\x69\x1b\xb9\x3f\xcf\xb2\x71\x00\xa9\x45\xf7\x7d\xca\x6f\x32\xc4\x5b\x87\x1a\xf3\x05\x8e\xd5\x0c\x1a\xeb\x36\x8e\xea\xd7\x30\xe2\xbf\x4c\xf2\x59\xf5\x39\xd1\xd1\x3e\x73\x72\xdf\x99\x39\xab\xd1\x63\xc8\x3e\x13\xd1\x65\x46\x43\x97\x7b\x4c\xae\x92\x49\x1b\x7a\x26\x7b\xfb\xbd\x83\x8c\xd3\x38\x0b\xad\x82\x0f\x1d\xd0\x09\xec\xe9\xec\x11\xfe\x37\xb3\x77\x15\x2b\x98\x51\x58\x96\xef\x72\x65\x98\x51\x58\xc6\x43\x48\x2d\x6c\xe1\x58\xf6\x43\x48\x35\xa4\x71\x98\x27\x20\x04\x48\x11\xe4\xca\x98\xa7\x20\xd0\xb0\xdd\x1b\x3f\x58\x27\x21\x04\xc8\x12\x84\x60\x1e\x86\x10\x20\x65\xb0\x9e\x60\x1d\x88\xec\x96\x20\xa8\x58\x61\x9d\x89\xec\x0e\xea\xf4\xcb\xb5\x2c\xff\x1f\x73\x25\x15\x67\x57\xff\xd8\xfd\x74\x42\xb7\x78\xc2\x6a\x91\x83\xbd\xe4\x66\x81\xb2\x69\x44\x42\x6b\xe1\x0d\x65\x32\x9e\x32\xe1\x3d\x40\x76\x7b\x65\x7b\x3b\x94\x03\x0f\x90\x20\xf4\x85\xad\x54\x56\xeb\xf1\x84\xf1\x32\x0e\x61\x51\x37\x8e\xa0\x76\x47\x0f\x29\x52\x89\xa4\x87\x8d\xb6\xd3\xcc\xdc\x4f\xcd\x58\x32\x56\xd3\x00\x92\x89\x9e\xb9\xb5\x8b\x1d\x8e\x87\xdc\xff\xd9\x3c\x68\x7f\xf3\xfb\x8d\x34\x12\xea\xf5\x9e\xf5\x96\xcb\x05\xdb\x71\x9d\x77\x5e\x1d\x95\xec\x22\x36\x01\xc8\x00\x7a\xe4\xbe\x66\x51\xc7\xe5\x75\xcd\xd1\x54\x74\x9e\x97\x02\x7f\x50\x62\xf8\x43\xe2\x9f\xec\x07\xef\xd7\x35\x9e\xd9\x6f\x73\x1d\x62\x54\x4d\xc1\x03\x24\x0b\x2d\x18\x9f\x0a\x36\xa2\xa7\x8d\xed\x3f\x64\xd0\xb5\x5a\x2f\xb0\x76\x87\xd4\xc1\x7c\x4f\xde\x51\x85\x43\x0a\xee\xbc\x0e\xb8\xdf\x38\x84\x1d\x20\xd9\xe8\xad\xe1\x6b\xf4\x27\x9f\xe5\xfa\xbd\x04\x4d\x86\xc3\x8d\xb6\x52\xe1\x21\x82\x4f\x45\xbf\x50\x9e\x75\xd6\xf6\x19\x54\x7d\xe0\x5a\xc9\x68\x01\x90\x2e\xb4\x16\x66\xf1\xcb\x1e\x74\x86\x1e\x68\xbc\xe8\x35\x60\xf2\xd5\x20\x78\x2d\x3b\x6a\x83\xec\x84\x02\xe7\x8f\x8f\xb3\x82\x76\x07\x8a\xce\xca\xe1\x01\x52\x80\x66\x9f\x96\x64\x32\x72\x21\x89\x66\x7f\x5a\x3e\x89\x7f\xa8\xa0\xa8\x90\x1b\xfb\x51\x93\x3e\x42\x16\x1a\xb0\x97\xa5\x92\x65\x8a\xad\x2c\x00\x20\x0d\x68\x02\x60\xe5\x36\xd3\xea\xb0\xe6\xae\xf4\x87\xa5\x2c\x4c\xe9\x8a\x07\xb9\xea\x6b\xfe\x8c\x0a\x77\x92\xe3\x1b\x87\xf4\xce\xd6\x97\x95\x32\x03\xe4\x17\x5a\xc9\x9b\xc8\x31\x95\xae\xef\x9f\x65\x3b\x4f\xf6\x60\x59\xca\x52\xe0\x94\x11\x8f\x6d\x6a\xf2\xb2\xbb\xe2\x87\x1b\x44\xc3\x8a\xcb\x36\xeb\x78\x80\xb8\xa1\x9f\xff\xcb\x64\xf8\x70\xd8\xb0\x43\xd1\x42\x61\x22\x7b\xf9\x4d\x9b\x97\xa7\xfa\x47\x19\x9b\xf4\x5a\xff\x66\x4e\x0f\x41\x1b\x0a\xe2\x39\x80\xbc\x44\x87\x32\xe2\xa7\x82\x1f\x1f\x9d\x82\xc5\x80\xe1\x27\x17\xaa\x7c\x8b\xe1\xdf\x1f\x23\x6c\x18\x24\x4b\xf9\x7f\xae\xdf\xe6\x35\x3a\x2b\x0b\x00\xd2\x87\x9e\x18\x8f\xdc\x2d\x79\xaf\xe0\x55\x1f\x70\x9e\x43\xfd\xc8\x79\x9a\x6d\xe7\x24\xad\xcd\x71\xe5\xd7\x2e\x6b\x99\xcd\x77\x8b\x18\x1d\x2e\xae\xe1\x01\x92\x86\x8e\x65\x71\x9b\x79\xc6\x93\xd3\x9f\x4e\x9f\x0b\xd6\xa6\xe3\x93\xe4\x8b\x01\xf7\xe5\xaa\x39\x6c\x54\xf9\xad\x3b\x96\xd8\xa8\xaf\x36\x15\x00\xa4\x00\x3d\x30\xd2\x66\xc4\xdb\xe4\x9f\x69\x8c\x9a\xb3\xd6\x3a\x32\xc6\xcd\xc6\x1f\xe8\x11\x50\x5b\x96\xda\x90\xf3\x9d\xf9\x6b\x5f\xdb\x7a\xe8\x43\x80\xd4\xa1\x85\xfd\x6f\x75\x23\x2b\xac\x17\xe2\xe8\x6a\x85\x14\x49\x54\x74\x55\x2a\xfc\xd3\x79\x87\xb6\xfb\x69\x5a\x84\x66\xcc\x73\xfd\x49\x68\xaf\xee\xc4\x06\x7d\x01\xc2\xd3\x7b\xec\xd3\xef\x03\xdc\xa2\x75\xb2\xfb\x55\x5d\x28\x35\x42\x53\x36\x72\x97\x92\xbf\x30\x2d\xec\xe9\x3a\x75\xf0\xe7\x8d\x94\x72\x80\xb8\xa3\x3f\x7e\xc1\x7c\xb1\x97\xb4\xb3\x67\x78\x1f\x9f\x42\xfc\xe0\xaa\xc7\xde\x4f\x54\x0b\xfb\x3e\xfa\x67\x48\x4c\xac\x39\xfe\x1e\x88\x4c\x42\x00\xf2\xf2\x3f\x6f\xe8\xba\xb4\x1c\xa2\x3e\xbc\x11\x1b\xc4\x55\x15\x74\x7b\xd1\x75\xad\x7f\x30\xee\x20\x3b\x8e\xd2\x9e\xfb\xc3\x9f\xfc\x8b\xd2\x61\xe7\x50\x8f\xd6\x45\x76\xc7\x3f\x56\xb8\x91\xbc\x22\xf1\x1a\xa8\xb5\x5d\x49\x10\xfa\x62\xdd\x78\xe3\x80\x70\xc5\x37\x51\x47\x57\xed\x89\xa5\x51\x00\xa4\x1d\x51\x8f\x1b\x9e\xbb\x9c\x4a\xfa\x4a\x43\x2f\x39\x4a\x30\xbc\x89\x24\x3b\x69\xbb\x5d\x32\xae\x4a\x98\xa2\xd2\xb9\xce\xdb\xd3\xfc\x4e\x3a\x31\x40\x1a\xd0\xad\xa3\x92\x7f\x29\x9e\x5c\x6d\x78\x7c\xa5\x54\xf4\x38\xfd\xab\x54\xca\x61\x8e\x52\x3b\x66\xd2\xbb\xf7\x9c\x9e\x4b\x7d\x9f\x8a\xab\x52\xc7\x03\x04\x8f\x1e\xbb\x07\x2e\xf9\xc6\x65\xf7\xd0\x3c\xd4\x8c\x26\xa3\x6e\xe8\x7c\x70\xb1\x54\x87\x2c\x5b\xfd\x68\xf4\x1e\x99\xc9\xa7\x1f\xe4\x70\xb3\x05\x00\x79\x81\xae\x05\x87\xd5\x3e\x7c\xd1\xf9\x75\x7c\x78\x72\x70\x45\xf1\x9b\xe3\xc5\xd2\xbb\x74\x97\x2a\xce\x47\xe7\xbc\xc2\x25\xe4\x24\xbf\x92\x94\xb8\x03\x90\x4e\xf4\xe3\xfd\x5d\x2a\xe6\x22\x89\xcf\x8e\xb5\xa9\x11\x3f\x0e\x4c\x0a\xcf\xbc\x3a\x54\x69\x2c\x77\x79\x3b\x68\x56\x4f\xd9\xfb\x8c\xe2\x59\xf4\x55\xbe\xef\xc6\x5b\x7b\x5b\x4d\xe5\x27\xa3\x52\xe9\x4d\x74\xb8\xf7\x15\x5c\x8f\x9a\x67\x5f\x12\xb5\xb7\xb1\x0a\xea\x36\x3d\x4b\xe7\x77\x1f\x00\x24\x1c\x1d\xf1\x3c\xb6\x39\x1d\x92\x94\xd8\x92\x9f\x52\x6d\x4c\x22\x23\xd6\x8b\xc2\x69\xb7\xb2\x0e\xc6\x8d\x06\x85\x90\x92\x98\x9b\x36\x8e\x06\x00\x24\x0b\xbd\x9e\x99\xdb\xa2\xc9\x86\x8e\x4d\x41\x65\xc4\xcb\x1f\x57\xd3\xb9\x8a\xee\x96\x0d\x2e\xb1\x76\x1c\xce\x4b\x4d\x2d\xee\xf6\xdb\x6e\x61\x01\x00\xf1\x42\x5f\x11\x8b\xf2\x55\x51\xce\xd2\x13\x8d\x6a\x5b\xe7\x5f\xb5\x7b\x61\xa8\x7a\xee\xa7\x4a\x11\x33\x5b\x5e\x95\x5c\xc1\x15\x0a\x6e\xf7\xd3\xc4\x00\x99\x40\x27\xaf\xe4\xb6\xa0\xd4\xad\x8f\x94\x51\x2c\xb4\x44\xab\xc4\xd4\x83\x64\x4d\x4a\x86\x01\x3c\xfc\x3c\xfa\xbf\xb2\xf8\x3e\x86\x9b\x0f\x9e\xc6\x03\x69\x3e\xd4\xe3\xcf\x1b\xf7\xa9\xdd\x48\x70\xb4\x49\x4b\xa5\x71\x70\xd3\x37\x3b\xf4\x5e\xf9\xc3\xe8\x09\xfb\x3b\x93\x74\x5c\x87\x90\x4d\x21\xf9\x66\x80\xa4\xa3\x17\xe9\x3b\xc3\x5d\xe9\x41\x47\xf1\xda\x22\xb5\xa5\x0f\x07\xbe\xbe\x2a\xda\xcf\xed\x14\x56\x1b\x76\x7e\xf6\xa9\x58\x0a\x57\xdf\xbe\x9e\x7b\x00\x59\x46\xef\xeb\xdc\xd2\x3c\x45\x37\xd5\x30\xe3\xd3\x47\xae\x64\x2b\x53\x91\xe9\x5c\x53\x17\x6c\x61\x14\xf3\x99\x3f\x21\x48\x14\xaa\x1e\x50\x99\x80\x03\xc8\x3b\xf4\x78\x92\x74\x31\x7e\x58\x6a\xcb\xe7\xa1\x95\x7b\xfb\xfb\x57\xbe\xa4\xe5\x76\x8f\xad\x71\x2f\x0a\xfb\x6d\xa4\x35\x9d\x7f\xf4\xc4\x38\x7d\xc1\x03\x04\xa0\x6b\xaa\xd4\xd8\x8d\x8f\x67\x9c\xcf\xf9\x29\xb0\xaa\x6f\x08\xf2\x56\xfb\x12\xff\xfc\x3d\xdb\xe1\x27\xa9\x21\x52\xee\xbe\xc2\x38\xb7\xa2\x04\x90\x20\x74\x6c\x7e\xbc\xcd\x41\x7a\x05\x3c\xe5\xd3\xb4\x0c\x8d\xe6\xa8\x45\x0b\x15\x6e\xb8\x7b\x3d\xd2\x66\xfb\xf6\xb3\x81\x4a\xfe\x50\xce\xe1\x13\x00\xf9\x8c\xde\xa8\xef\x4c\x27\xa4\x58\xf3\x9b\xf7\x0c\x5e\xb9\x73\x35\x42\xfa\x8d\xd9\xed\x61\x39\x2b\xeb\x3c\x17\x01\x46\x22\x3d\xee\x3e\xbd\x98\x07\x00\x20\x1f\xd0\x2b\x3b\xdf\xe1\xc8\x6d\xda\x41\xaf\xa8\xd3\xdc\xca\x47\x2f\x4a\xbf\x5f\x35\xc3\xa4\x94\x3f\x43\xda\x3e\x7b\xb0\x53\x65\xa8\x7b\xfe\x19\x40\x7e\xa3\x4b\xf0\xdf\x33\xaa\xa5\xbd\x9b\x22\xad\xf1\xd2\x1a\x0d\xcf\x5c\xff\x0c\x1a\x5c\x67\x18\x14\x74\x61\x2a\xd6\xbf\xf9\xac\x59\x5e\x4e\xd0\x60\x67\x3a\x46\x07\x33\xd6\xb2\x5d\xbc\x4e\x77\x8b\xc3\x31\x49\xe1\x82\xc9\xdc\x6d\x31\x8f\xd7\xa4\xd7\x79\xa4\xf9\x7d\x5f\x49\x71\x18\x47\xad\x19\xdf\x46\x4b\x91\xe9\x91\x13\x12\xd3\x5c\xed\xcd\x64\x4f\x9a\xcc\xf6\x3f\xb4\x30\xbd\xe4\xc6\x12\x40\x71\x34\xf0\xa7\xc5\xe3\x34\x09\xe6\x1f\x22\xe8\x22\x40\x96\xa4\xf9\xd6\x2f\xa2\xf3\xa1\xee\xf2\x44\xb2\x6d\xba\x31\x93\x78\x96\x1a\x45\xc7\xad\xd7\x34\x05\xdb\xa3\x44\xa4\xa7\x6b\xd0\x97\x37\xdc\x2f\xfc\xe4\xba\xe3\xf2\xe7\xf9\x86\x4f\x61\x59\x02\xa5\x5c\xc6\xf4\x64\x5a\x43\x4d\xd2\x1c\x13\xff\x2a\xbe\xf7\x90\x69\x2c\x00\x88\x37\xba\x09\xa8\x0a\x9c\x8c\xd6\x3a\x61\xc3\x5e\xbf\x5c\x53\x92\x7d\x40\x44\x28\x84\xed\x8c\xe7\xe3\x27\x17\x5c\xe8\x3b\x98\xb4\xb8\x75\x1d\x3a\x01\xd2\x84\x0e\xf7\xd7\x7a\x1e\x3f\xf3\x3b\x71\xf9\x6e\xf9\xc3\xf2\x03\xea\xd4\xa7\x29\xf3\x5b\xd7\xca\xfd\xfe\x32\x3e\x0a\xa2\x79\xb4\xff\x84\x29\xfa\x7e\x95\xce\xf1\xc4\xf2\xcb\xe6\xc2\x7b\x55\x9a\xb7\x0f\xea\x86\xb9\x1c\xba\x9e\xd4\x44\x79\xb6\x8f\xfc\x4f\xb9\x93\x65\xba\xc2\x13\x27\x46\x3c\x40\x32\xd0\x0d\x60\x9f\x18\xf9\xa2\x79\x71\xcd\xdb\xb9\x3b\x39\xc1\x4f\x0a\xcc\x5c\x56\x98\x15\xfa\xb7\x55\xf2\xd6\x3b\xed\xef\xfa\xdb\x5e\xff\xd4\x06\x90\x2c\xf4\x24\x50\x74\x51\x47\x92\x5c\x59\xda\xb7\x93\x8a\x4c\x71\x82\xd6\x72\xff\xa3\x17\x27\x35\xd3\xac\x53\x73\x93\xf0\x7d\x2f\x1e\xa8\xed\x35\x07\x48\x36\x3a\xad\x14\xdb\xb4\x0f\x46\x13\xbd\x68\xf8\x41\x02\x54\xdb\x1b\x18\x1c\x69\x2e\xbf\x7f\xd9\x59\xd9\xc0\xb4\x6e\xe2\x70\xc2\x85\xf2\xa5\x20\x00\x48\x1a\xfa\xfa\xd6\xea\x19\x76\xce\xc8\x63\xef\xae\x2e\xd1\x3e\x28\x0a\xcb\x8a\x51\xe2\x74\x62\xe0\x7c\x17\xae\x3e\x4f\x8a\xf4\x0d\x3b\x27\xcc\x0c\x01\xa4\x02\xfd\xf1\x81\x74\x37\xca\xcb\x28\x5c\xc4\x80\x0d\xa5\xc4\x59\xe5\x37\x2a\xaa\x06\xe2\x03\x1b\x1b\xa7\x86\xf8\x9f\xb0\x39\x1a\xec\x0f\xff\x81\x07\xc8\x3b\xf4\x24\x20\xe0\xb4\xd9\xce\x0d\xf8\x5e\x6e\x68\x34\x5c\xdb\x32\x39\x10\x48\xdb\xc9\x51\xda\x7f\x5b\x2a\xa1\x7a\x39\x63\x54\x24\x89\xab\x1a\x20\x6d\xe8\x8f\x67\x9e\xc8\xdb\x9a\x7e\x5f\x5f\x7d\x03\xff\x72\x3b\xcf\xdc\x30\xd9\x81\xbc\x41\xda\xc1\x9a\x2d\xdd\x4d\x5c\x3e\xc4\xdb\xf1\x59\x3f\x40\xbe\xa3\x7b\xef\x8f\x0e\xd3\xff\xc7\xd8\x77\xc7\x63\xf9\xbe\xef\x5b\x65\x15\x32\xa2\x24\xab\x32\xd2\xb0\x47\x29\x6e\x44\x24\x0a\xc9\x96\xca\xce\x8c\x24\xe1\xb9\x6c\x91\x9d\x3d\xb2\x47\x28\x33\x51\x14\x49\x56\x56\x88\xec\x91\x4d\xb2\x32\x7f\x2f\xef\xdf\xf7\xb9\xdc\x9f\xbf\xee\xfe\xbf\x8e\xe7\x3e\xaf\xf3\x1a\xe7\x71\x9c\xe7\xf9\xdc\xb7\xa2\xc4\xa1\xdb\x85\x0c\xdc\x83\x03\xbe\xcf\x3d\xcf\x92\x24\x2a\x7a\x6b\x1b\x54\x04\xea\x25\xbc\xef\x70\xa3\xf5\x5b\x02\x00\xe9\x43\xef\x5a\x91\x0e\x87\xa4\xdb\x7e\x13\x06\x9e\xd5\x8e\x5e\xc4\xfb\xac\x78\xaf\x3b\x64\x3b\x3e\xf7\x7f\x99\x5e\xc2\xcb\xe4\xc1\xc3\xdc\x40\x08\x90\x15\xf4\xcf\xcb\x5c\x3f\x96\x4d\x76\x75\xab\xf5\xd4\xea\xfd\x28\xce\xe2\x2b\xad\x7e\x56\x0b\xa1\xb7\x7f\x36\xb4\x86\x8e\xe8\x9b\xf8\x12\x7d\x89\xf7\x00\x48\x00\x7a\x8f\x95\xcc\xe9\x89\x3d\x9e\x58\x7b\x9f\x96\xc3\xab\x63\x98\xa6\x78\xfc\xcf\x29\x91\xbf\x56\x79\x2e\x73\xa2\x63\x6b\x3b\x0c\xae\x53\xd4\x00\xf9\x85\x76\xfd\xf0\xf2\x77\x0b\xbe\xcd\xa8\x5b\x7d\xaf\x39\x95\xe3\x34\x16\x77\x4a\xfd\xef\x84\x18\x89\x3e\x22\xf2\x7d\xeb\xa3\xb9\xef\xc6\x4b\x39\x80\xac\xa1\x87\xdf\xb5\xfa\x23\x2b\x48\x79\x4f\xff\x84\xf2\xda\xef\xea\x98\x4d\x3b\x59\xba\x36\x96\xd6\xac\xe3\x54\x7e\x26\x6f\x8c\x88\x4d\xb4\xf3\x00\x40\x7e\xa2\x33\x0f\x8c\x67\xb3\xe9\x2c\xca\x0b\x9a\x7a\xe9\x59\x6f\x32\x9c\xef\x59\x56\xda\x48\x6f\xab\xbe\x25\x1d\x29\x76\xfc\x36\x0b\x99\xc9\xc4\x1f\x80\xac\xa2\xb7\xe5\x5d\x7a\xd1\xea\x37\x49\x6b\x65\x57\x68\x94\xf2\xbf\xd0\xc9\x85\xe7\x6c\x26\x2a\x32\x2b\xd4\x39\x7e\x39\xb0\x65\x62\x5a\x79\x1d\x1d\x94\xae\x94\x89\x1c\x53\xd9\xa8\x0b\xb6\xf6\xe8\xd1\x6a\x91\x3b\x6c\xd1\x76\xfd\x86\xd3\x35\xf1\xe3\x36\x23\xcc\xab\x16\xc3\xda\x82\xef\x01\x40\xaa\xd0\x77\xd1\xf9\xe3\x72\x34\xb2\x09\x2b\x06\xdf\x06\x3e\xd2\x68\xe4\x95\x05\x9c\xde\xd2\x11\x6b\x5a\xe9\x62\xe1\x70\x1c\xa2\x76\xfe\xac\x58\x0f\x90\x1e\x74\x73\x45\x03\x75\x5e\xbf\xcc\x44\x7f\x7e\x85\xd4\xd7\xdf\xc2\xbf\x8f\xa6\x4d\x77\x2b\x38\x1a\x6d\xcf\x9e\x20\x2c\x33\xfe\x9e\x9b\xef\xef\xe0\x01\x10\x6f\xf4\xf8\x89\x60\xd3\x44\xff\xf3\xf2\x57\x08\xdf\xce\x6f\x0c\xb0\x66\x0a\x78\x98\xdd\x0d\x66\x8a\x61\x0e\xe7\xdf\x90\xd3\xaf\x3e\x1f\xb1\x09\x90\x3c\x74\x88\x0c\x49\x8f\x5a\xfb\x71\x4c\xdf\x41\x85\x9c\x74\xf9\xd4\xb5\x57\xed\x35\x84\xdf\x46\x1d\x01\x73\xd4\x76\x72\x6c\x62\x30\xb3\x54\x34\x40\xba\xd1\x09\x1f\x1d\x39\xfa\x4a\x8d\xaa\xec\xcf\x57\xe2\x4b\xe9\xe7\x7a\x9e\xb3\x73\xb2\x9f\xa1\xda\x5a\x73\x5b\x6d\xf1\x37\xe8\x28\x8e\x94\x75\x12\xf8\x47\x39\x20\x43\xf3\xff\xa5\x47\x28\xfc\x17\x04\xa6\x24\xc0\x43\x5e\xc3\x04\x35\x96\x2c\x80\x90\x7e\x98\xa0\xc6\x54\x06\x78\xc8\x9b\xbd\xf2\x29\x96\x3a\xc0\x43\x0a\xf6\xea\x87\x18\x0a\x01\x42\xba\x60\x2a\x03\x53\x24\xe0\x21\xa5\xb0\x76\x83\x29\x14\xf0\x90\x46\x28\x3c\xb1\xc4\x02\x84\xcc\xc3\x74\x33\xa6\x5e\xc0\x43\x3c\x21\x04\x53\x33\xe0\x21\x41\xd0\xc9\x58\xba\x01\x42\x7a\x61\x26\x07\x53\x3a\xe0\x21\x39\xd0\xc9\x98\xf2\x01\x3a\x19\x26\xb2\xb0\x24\x04\x84\xd4\xc1\x44\x16\xa6\x8a\x80\x1e\x83\x15\x57\x4c\x25\x81\x87\x78\xc1\xa7\x60\xa9\x89\x3d\x27\x53\xc2\xbe\x44\x4c\x59\x21\xe3\x49\x23\xe5\x89\x03\xc8\x12\xfa\x2e\xfc\xfd\x69\xce\xba\x62\xe0\xa3\xfc\x83\x26\xf1\xc6\x4d\xfd\x43\x9a\x94\xdd\x4e\x14\xc1\x03\xb7\xfd\x9a\x89\x3c\x45\xf8\x7f\xe6\x2d\xe0\x00\xf2\x12\x1d\xa3\x4f\x32\xdf\xda\xf2\xd7\x7d\xc6\x79\xae\x8f\x58\xa2\x3e\x8e\xc6\x21\x33\xf2\xd1\x70\xea\x93\x53\xcc\x7c\xfe\xe4\x17\x4d\x54\x98\x2a\x70\x00\x89\x41\x5f\xcd\xdf\xaf\x14\xb1\x93\x8c\x7b\x54\x7d\x92\xaf\xb1\x7b\xbf\x76\xab\x6c\x36\x59\xce\x3c\xa2\xbb\x81\xc4\x4b\xe5\x6b\xa4\xcb\xef\xae\x27\x38\x80\xa4\xa2\xa9\xe5\x3e\x7b\x15\x65\x96\xd0\xbe\xdf\x0b\x9f\xca\x42\x47\x1d\x7c\x4a\xdd\x14\xa2\x44\x3b\xb4\x23\xa9\x97\xce\x69\xdb\x4d\xd3\xdb\xe1\xbf\xfd\x8b\x65\x36\x74\xd0\x12\xdc\x1f\x58\x96\x43\xc8\x4b\x78\xa1\x60\x19\x0f\x21\x31\x30\xcf\x8b\x65\x3f\x84\xa4\xc2\x22\x19\xa6\xc0\xfb\x3f\x88\xf4\x63\xfc\x43\xb0\x34\xde\xde\xe5\x00\x33\x6c\x98\x32\x0f\x0f\xf1\x80\xd5\x09\x4c\xa9\x87\x87\x78\xc3\x7b\x1e\x4b\xee\x41\x48\x27\x29\x4c\xc0\x62\xea\x3e\x19\x1a\xd9\xff\x5e\x33\x11\x85\x16\x96\x1a\x13\xdd\x1b\x75\xec\xb2\xe7\x99\xcf\xfd\x8a\xb5\x0b\x9c\x6f\xd3\xa9\x4b\xb1\x79\xe8\xfa\x52\xfc\xed\xf1\xd2\xc8\xd0\x59\xa7\x33\x38\x20\xad\x81\x1a\x4e\x64\x46\xbe\xed\x12\x7f\xbd\x7f\x4b\xf3\x5e\x3b\xc7\x9f\x4d\x05\xea\x17\x26\x7d\xc7\xdf\x65\xda\x1e\xba\x7b\xc2\x3d\xe0\xcb\xa1\x5d\x45\xd4\x88\x66\x67\xa7\x84\x56\xbf\xda\x55\x76\x66\xe6\x45\x9e\x5f\xf4\x3f\xf9\xd4\xfd\x8d\x89\x02\xc3\x67\x9f\x9f\xcb\x0d\x54\xde\x55\xe9\xb6\x62\x1c\x38\x80\x7c\x41\xe7\xbc\xc2\xf2\x05\x7e\x66\xc4\x98\x5e\x26\x48\x59\x16\x0d\x66\x5b\xab\x1c\x92\x29\x9d\x56\x63\xd2\x99\xd1\x50\x0d\x8f\x7c\xa1\xcf\x51\x2a\xf0\x6f\x56\x43\xff\x44\x91\xe2\x77\x07\x96\xe5\x70\x77\x68\xc0\xbf\x0a\x63\xd8\xbe\xb7\x3b\xe0\x45\x88\x65\x3e\x84\x7c\x81\xf1\x19\x53\x7e\xe3\x21\xb1\x30\x97\x8c\x29\xc1\x61\x7c\x86\x17\x21\xa6\x0a\xc7\x43\xfc\x60\x63\x1e\x96\x12\x87\x90\x71\xf8\x21\x1c\x4c\x35\x8e\xf7\xf1\x69\xfc\x43\x30\x05\x39\xfe\x21\xb9\xf0\x38\x61\x89\x72\x08\x59\x81\x81\x13\x4b\x97\x43\x48\x3c\x4c\xbe\x63\x4a\x73\x3c\x04\x40\x42\x83\x29\xcf\x21\x9f\xdb\xfb\xcb\x3f\x96\x44\x87\xfb\x05\x46\x41\x4c\x95\x8e\x87\xe4\xc3\xc5\xc7\x52\xea\x10\xb2\x00\x39\x10\x96\x58\x87\x90\x62\x72\x58\x3f\xc7\x52\xed\x40\x96\x8c\x84\x8c\x68\xf7\x06\xf2\x44\x93\x6b\x33\xfa\x0f\xd2\x74\x8a\x33\xd6\xbd\xf6\x5d\x2d\x13\x89\x5d\x74\xd5\xc6\xfc\x86\xcd\x27\xf6\x87\xe4\xc6\x9e\x3c\x58\x91\x75\xf4\x3b\x0e\x20\x35\xe8\xc4\x1c\x67\x42\x57\x7e\xf1\xfd\xfb\xfa\x7e\x52\x7f\x6e\xbd\xbd\xf4\xe2\x57\x81\x89\xc6\x2d\x33\x7f\x63\xe3\xbb\x9c\x44\x54\x87\x2d\x16\x43\x77\x7f\x1f\x3d\x5e\xf5\x8a\x88\x88\xe3\x69\xa2\x7c\x7f\xad\xbb\x7e\x22\xe3\xb9\x21\x0c\xc9\x4f\x9e\x3f\x28\x9c\xd5\xbc\x63\xcc\xf0\xee\xb1\x9f\x4c\xca\xee\xc5\x8b\x8e\xb4\xb1\x5d\x67\x5c\xbc\xe9\x94\xa9\xa6\x42\xcd\x48\x54\x3f\xf4\x71\x11\x37\xbe\x5b\xf1\x7a\xf1\x2d\x94\x27\xac\x43\xe3\xc5\xcf\x96\x0b\x02\xff\x66\xf6\x1e\x81\x81\xe7\x16\xcb\x72\x08\xa9\x81\xe1\x06\xcb\xf8\xbd\xa7\x40\x08\x96\xfd\x7b\xe1\x66\x1f\x5c\x3a\xac\x2c\x0a\x90\xa5\x20\x23\xf8\xef\x2d\x59\xab\xe8\xdb\x9a\x56\x2d\xc7\x73\xfc\xfc\x3b\x81\xf8\xe5\xc7\x36\x97\x19\x4f\x4f\x5c\x16\xbb\xd8\x5b\xfa\x65\xb1\x87\xdc\x5f\xb8\xb4\x95\xcd\x23\x18\x07\x90\x59\xb4\x98\xe6\x7a\xc3\xc2\x1a\xf4\xdd\x92\x53\x98\x24\x9c\x2c\xeb\xa5\xd7\xab\x88\xb3\x0d\x2d\x5c\xda\x6e\xdb\x91\x25\x01\x0f\xec\xc7\x2f\x0c\xe0\x00\x12\x8e\x26\x31\x7a\x61\x6e\x23\x81\x72\xf1\x04\x3d\x19\x79\x0e\xb2\xa7\xd7\x95\x9c\xc5\x32\xab\x3b\x44\x83\x58\x73\x3e\x5c\xcb\x57\x35\x5a\x66\xc4\x01\xa4\x1e\x3d\x7e\x99\x85\xb5\xdc\xb4\x2f\xcb\x6d\x3a\x98\xc4\x68\x36\xfc\xbb\xe3\xac\xab\x63\x5b\xeb\x73\xfa\xe3\x6f\xc6\x65\xbc\x02\x46\xdd\x12\x04\xfe\xcd\x6c\xe8\xa1\x55\x78\x4b\x63\x59\x0e\x21\xb3\xf0\xd2\xc1\x32\x1e\x42\xc2\xe1\x0d\x82\x65\x3f\x84\xd4\xef\x5f\x09\x20\xf9\xc7\xac\x96\xac\xc2\x1d\xda\xf3\x7e\x38\x80\x54\xa0\xf9\xea\xe4\xaf\x96\x59\xc6\x23\x4f\x07\xbe\xc4\x14\x8d\x3f\x3f\x56\x32\x64\xde\x44\xa3\x6a\x07\xcc\xd5\x86\xca\xbf\x6b\x33\x67\xbb\x35\xe0\x00\xf2\x1d\x9d\xda\xb4\x25\x95\x7b\x28\x33\x95\xe1\x15\x78\xea\x5a\xa6\x67\xdf\x8c\xa8\x57\xc4\x94\xd0\x7e\xe5\x7d\x7a\x12\x99\x38\xbd\xd7\xd2\xdf\xee\xe0\x00\xf2\x13\x7d\xea\x78\x4d\x9d\xdb\x24\xee\xdf\x8e\x64\x62\xb3\xa5\xcd\xad\x61\xb9\xf8\x96\x36\xd7\x24\x5d\xc9\xfa\xb8\x48\x75\x96\xe0\x97\x0f\xb3\x54\x38\x80\x64\xa1\x89\x42\x8d\x8e\x88\x10\x41\xe4\x9a\xc2\xac\x39\x75\x0d\x71\x81\x51\xd8\x96\xb1\x9e\xda\x8d\xf6\x8d\x48\x8d\xed\x24\x2d\xcb\xac\xea\x9f\xbb\xa1\x09\x9d\xda\x38\x1a\x78\xfb\x61\xd2\x91\xbb\x3c\x44\x9a\x54\xc3\x22\x6f\xfd\x5f\x3f\xe5\xa2\x29\x39\x7d\xe5\xea\xc6\x9b\xe1\x2a\xdc\x46\x8a\xc6\xee\xd6\x9b\x47\x67\xe7\x56\x9e\xdc\x28\xe7\x2f\xcb\x92\xd5\xf2\x97\xdc\x4f\x4d\xed\x7a\x6b\xa8\x21\x5d\xc0\xe4\x59\x0e\x6d\xcb\xcc\xf6\x32\x3d\x79\x66\x2f\x00\xc8\x57\x34\x3f\xff\xfa\xe6\x63\x81\x73\xd4\x51\x83\xed\x76\x81\x51\x8d\xcf\x62\x06\x62\xaa\x24\xa4\xef\xf8\x76\x54\x4f\x44\xb0\x3e\xff\xfa\x48\xbd\x1a\x20\x9d\xe8\xc4\x72\x3c\x63\x08\x42\xc7\x5c\xf9\xd0\xfa\x0b\x6b\x67\xc3\xbd\x21\x4f\x22\xbb\xc3\xfd\xca\x17\x2b\x64\xa3\xed\xc4\x6c\x69\xfd\x7e\x65\xe0\x00\xe2\x8f\xa6\x5d\x2d\x4b\x17\x7e\x7b\xfe\x10\xb7\xc8\xe5\x59\xf1\xcb\x59\x76\x35\xe1\x64\xde\x51\xda\x76\xa2\x12\xb1\x69\x76\x21\xfd\xb4\x9e\x3f\xb9\x3b\x5d\xf4\x72\x2d\xaf\x09\x8a\x3e\xfe\x9c\x46\xfd\xeb\xdb\x97\x06\xda\xc2\xa6\x21\xcf\xc1\x91\x2f\xd7\xf5\xae\xe2\x8a\xa9\x46\x1d\x16\xc8\x62\x4f\x09\xfc\xdb\xaa\xc2\x0d\x54\x01\xe9\x3c\xd6\xc2\x42\xc8\x77\x18\x1b\xb1\xd6\x16\x42\x7e\xc2\x4b\x09\x6b\x79\x21\x24\x0b\xc6\x46\xac\x15\xde\xa3\x2c\xb0\xb7\x0c\x73\x91\xa1\x72\x87\xe1\x14\x73\x9d\xf1\x90\xaf\x50\xcd\x60\xad\xf5\x1e\x39\x87\x9c\x05\x6b\xb9\x21\xc4\x1f\x4a\x00\xac\x15\xdf\x9b\x3e\x5c\x4a\xcc\x84\x35\x7c\x0a\xcc\x42\x60\x25\xad\x21\xe4\xdb\x01\x28\x90\xb1\xb2\xd7\x40\x86\x42\xea\xbf\x58\xf1\x13\x9d\x14\x4b\x61\xc3\x8d\x59\x2d\xff\x8c\x3f\x7c\xd6\xcf\xf3\xc9\xaf\x64\xce\xb4\xae\x69\x4b\xbd\x3f\xab\x23\x2e\xb7\xde\x9d\xf6\x8a\x6f\x61\xc0\x01\x24\x02\x7d\xa2\xe8\xc4\x71\x1d\x3f\x3c\x13\xed\x03\xed\x56\xbb\x25\x2d\xce\xbb\x14\xaf\xf9\x3f\xe6\x72\x9d\x22\xa7\x9e\x54\x17\x59\x9a\xdb\xc9\xdd\x25\xf7\xe8\xcc\x6b\x84\x4a\x3d\x9d\x18\xf1\xd2\x8f\xf3\x45\xd3\x6a\x77\x0f\x3f\xe1\x4b\x76\x78\x1a\x70\x3b\xe2\xc5\x42\x6e\x01\x59\x2c\x53\x29\xa2\x8d\x03\x48\x03\x3a\xcc\xf3\x46\x13\x1d\x79\xc8\xab\x3d\x37\x4b\xa2\xd5\xe9\xf8\xf8\xeb\xbb\xc8\x47\xec\xa1\x17\x0e\x76\x7a\x5c\xd5\x76\xd5\x78\xb0\x59\xd4\x27\xf0\x6f\x66\xef\xed\x75\xd8\x85\x80\x65\x39\x84\x44\xc0\xfd\x81\x65\xfc\x9e\x9e\x81\x99\x1d\x2c\xfb\x21\xa4\x01\x6a\x6a\xcc\x32\x02\x1e\x92\x07\xb7\x14\x66\x29\x01\x4a\x0d\x78\x3c\x30\xcb\x09\x30\x15\x08\x8f\x3a\x66\x45\x01\x66\xa9\xe0\x51\xc7\xaa\x2a\x40\x48\x25\x7c\x0a\x66\x61\x01\xaa\x00\x98\x3d\xc4\x2c\x2e\xe0\x21\xed\xf0\x29\x98\x05\x06\x3c\xa4\x0f\x2e\x25\x66\x8d\x01\x42\x20\xb9\xc0\xaa\x33\xec\x89\x20\xf8\x14\xcc\x52\x03\x1e\x12\x00\x6f\x07\xcc\x72\x03\x1e\xf2\x0b\xae\x0b\x66\xc9\x01\x0f\x59\x83\x10\xcc\xaa\x03\x3c\x62\x70\x27\x63\x55\x1e\xf6\x18\xdc\xde\xdf\x22\x30\x4b\x10\xb2\x07\x09\x48\xfe\xeb\xde\xec\x47\x73\xca\xaa\x9b\x0c\xd7\x45\x7f\x5e\x18\xf9\xbb\xf2\xea\xa1\x9e\xa6\x1e\x67\x6f\x6c\x81\x09\x5f\xfa\x28\xb3\x44\x8f\x34\x81\xdd\x91\xc9\x13\x38\x80\x24\xa3\x23\x7b\xb8\x4d\xc8\x5d\xa1\x87\x35\xc3\x91\x59\x82\x46\xf6\x94\xf9\xab\x63\x84\x25\x89\x79\x4c\x3b\x1c\x71\xb5\xe9\x27\xc9\xce\x0c\x1e\xc2\x01\x64\x14\x7d\x0f\x69\x48\xd7\x31\x39\xb5\x58\x77\xa7\x4a\x2d\xd4\x2a\x7a\xf1\xdc\xef\x50\x68\xcf\xba\xd1\x95\x78\xa9\x25\x3f\x35\x95\x4e\xde\xd0\x68\x77\x41\xd0\xbf\x2f\x38\xd9\x81\xb8\xe6\x5b\x79\xf4\xf9\x93\xbf\xfa\x25\xe8\xce\x9d\x51\xd2\x5a\x25\x35\x7f\x83\x46\x37\x7e\x2e\xc3\x5c\x40\xf5\x0c\x0e\x20\x9b\x68\x79\x45\x39\xca\xdf\x9e\x11\x26\x52\xdf\x96\x24\x50\x39\xcd\xaf\x16\xad\x47\x46\x3c\xe7\xf5\xc0\x76\xce\x6f\xf3\xa9\x99\xb7\x6f\x81\xaf\xc0\xbf\x4d\x73\xaf\x4c\x00\xd9\x2a\xd6\x4c\x21\x24\x19\x06\x35\xac\xc9\x42\xc8\x28\x5c\x6a\xac\xf9\xee\x6d\x5b\xf8\x14\xac\x29\x43\xc8\x26\x94\x66\x98\xf5\x26\x3c\xa4\x0a\xaa\x6a\xac\x9a\x13\x84\xf4\xc0\x66\x33\xcc\xb2\x13\x94\x66\x10\x82\x59\x7a\x82\x77\x36\x9c\x0b\x56\xf9\x09\x42\xba\x19\x56\x00\xfd\xff\xc7\x9c\x49\x27\xce\x50\x77\x0a\xd0\xfb\xfd\x70\x71\x48\x82\xaf\xb9\x9a\x34\xb1\xa7\x4e\xeb\xec\x35\x05\x57\x55\xab\xf3\xd1\x7c\x47\x13\x81\xec\xd6\xce\xce\x4e\x14\x2b\x6a\x63\x29\x44\x52\x9c\x1c\x74\xc9\x1a\xac\xe4\xdc\x3a\xf0\xa3\xd9\xc4\x88\x11\xc9\xf0\x9f\x36\x2a\x9f\x18\xde\x88\xf1\xeb\x37\x22\x5f\xf0\x00\xc8\x5b\x34\x01\x50\x70\x4d\xe2\x3f\xb9\xa6\xb8\x15\x81\x78\x72\xad\x84\x25\xbf\xb3\x32\x22\x59\xa3\x23\x8d\x3c\xfa\x64\x78\x39\x98\xe2\x06\x65\x30\x40\x7e\xa2\xcf\x1d\x79\xf4\x1d\xeb\x5b\x9d\xc9\x77\x1e\xb2\x19\xf9\x7b\xe9\xd3\x97\x95\x29\x5a\x66\x3f\xef\x1a\x4d\xb4\xd6\x90\x60\x12\x69\x5b\x3f\x0f\x90\x51\xb4\xb4\x7c\x97\x7f\xfa\x5d\xdd\x23\x87\xa8\x2b\x45\x3a\x15\x34\x9c\xf2\x0d\xa3\x7f\xbb\xaa\xf6\x5b\x7d\x2a\xcf\x10\xaa\x4d\x7f\x19\x72\x05\x5d\xfc\xe3\x76\xab\x8f\x3f\x11\xef\xf5\x32\x60\x5c\xdf\x28\x82\xb5\x2e\x85\x72\xb9\xea\xd0\xdd\xb1\xed\xc0\xda\x04\xa3\xc5\x5b\xcb\x6a\x02\xe8\xbe\xb1\xea\xba\x9e\x7a\xca\xcc\x4f\xb2\xea\x05\xd7\xb4\x8e\x9b\xbf\xfe\xd4\xd0\x10\x7f\x3c\x60\xe4\x19\x23\x12\xd6\x4a\xe9\x31\x7a\x0e\x00\x69\x5d\x74\xa7\xb4\xc4\x9f\xec\x41\x83\xc3\x91\x9f\x13\x4d\x07\x4e\xff\x1d\x60\x12\x1c\xca\x6a\x4b\x2c\x78\x2a\xb3\xf2\xf1\xd0\x85\x5a\x5e\x73\x11\x80\xd4\xa1\x35\xd5\xc4\x8d\xe0\x4b\x5e\x80\x3f\x5b\x0a\x47\xbb\x7c\x4a\x5f\xb1\x59\x74\x44\xb1\x83\x7b\x21\x25\xf1\x88\xf8\x7d\x02\xb7\xed\x35\x11\x00\x90\x54\x74\xc7\x05\xf9\x02\xf7\x88\x5a\x06\x8d\x7c\x2e\xcb\xad\x6b\x2a\x55\x39\x2f\xc3\x90\x33\x0a\xfb\xe4\x94\x39\x8e\x5c\xc9\x25\x5a\xfb\x66\x75\x0b\x20\x99\x68\x89\xc4\x6d\xf2\x91\xf0\x8e\x45\x43\xf7\xfd\x0e\x7f\x5f\xe3\xee\xaf\xcb\x71\xf3\x52\x47\x1e\x65\x1f\x73\xf0\x14\xbe\x22\xbf\xf8\xfa\x05\xfa\xf3\xc4\x55\x94\x6e\xce\x87\xf9\x1a\x7f\xac\x8b\xf2\xc8\x33\x73\x6e\x65\x3d\x54\x3a\x7e\xfc\xf2\x31\xdb\x97\x89\xdd\xe5\xe7\x98\x03\x84\x0e\x7a\x00\x69\x39\xd4\xf0\xa7\x9d\x03\xe7\xb7\xc2\xda\x2b\xcc\x29\xba\x6b\x62\x6a\xfb\xa4\x0f\xb5\x0f\x6f\xb7\x32\xb3\x66\xc8\x3b\xdd\xb3\x6d\x30\x3d\xec\x0f\x10\x2f\xb4\x16\x3c\x5c\x2c\x7e\x50\xe7\x83\x29\x83\x3e\x31\x61\xde\xef\x54\x84\x4c\x8b\xaf\x42\x72\xeb\x2f\xd1\xca\x43\xa4\xf4\x58\x51\xb6\xd2\x10\x40\x5a\xd0\xb5\xdf\xfe\xad\x8e\xae\xaa\x93\xee\xeb\xb7\x9f\x2a\x84\x59\x97\xe7\x67\x4f\x56\xde\x2c\x88\x55\x48\x6d\x3a\x44\x36\x6e\xef\x16\xf3\xb4\x16\x00\x24\x01\x2d\xd5\x18\xd8\x65\xe5\x15\x56\x9f\xbe\x24\x7e\xf6\x56\x44\x25\x60\xe6\x83\x93\x32\x97\x30\x4d\xe2\x4c\x3e\x53\x1f\x47\xcf\x2d\x91\x8e\xf3\x00\x79\x89\xee\x2f\xb0\x2e\xf5\x9c\x60\x49\xd1\xd9\x57\x79\x29\xc9\xe6\xf2\x28\x27\xe1\x9d\x84\x96\x28\x51\xeb\xd4\xe2\x5f\xfb\xde\x1c\x8d\x11\x70\x7a\x8d\x1a\xfa\xc4\xe1\x69\xfc\xfb\x52\xdc\x87\xcb\xb9\x0e\xd9\xa1\x61\x12\xa7\xce\x3b\x3d\x2e\xd3\x0d\xff\xc5\x38\x93\x49\x67\xa3\xe8\xce\x75\xcb\x03\x48\x9b\xa2\x86\x87\xde\xe9\x2c\x6f\x3b\x4b\x79\xf1\x66\xe3\x05\x2a\x4d\x67\xa4\x3d\xcb\xf8\xf4\x53\x39\xee\xb2\x5b\x5e\x49\x37\x92\x82\x6e\x38\x47\x00\x24\x0c\x5d\xfb\xaf\xc9\x12\x2b\x37\xc9\x37\xd9\x87\xdc\x27\x8c\x17\x0a\x67\xfb\x69\x9c\xec\x4d\x5c\x18\x57\x4f\x7c\xc7\x4b\xc1\xa2\x3e\xfc\xe7\x01\x80\x8c\xa2\x97\x33\x6c\x2e\xb7\x68\x29\x23\xfb\xf5\x0c\x9b\xf5\xa5\x13\x9e\x02\xaf\x6c\xc6\x48\x3e\xfe\xd1\x91\x3e\x29\xe7\x33\x9d\x9c\x9f\xb5\x2c\x88\x03\x48\x1b\x7a\xfc\xad\xe8\xf6\x4b\x47\xa4\x7d\x9f\x19\xea\x84\xdc\x66\xbd\x77\x37\x86\xaa\xd5\x21\xd2\x51\xd8\x61\xf1\xcd\x8f\xbf\x7e\x4b\xae\x6f\x85\x3d\x00\x92\x8f\x26\xdc\x2e\xa7\xec\xf3\x69\xd9\x3e\x1e\xcb\xc8\xe0\x40\xb6\xda\x2b\x9b\x8f\xa8\x70\xd4\xea\x52\xe4\x19\x87\x1d\x19\xe3\x5f\x0a\xdf\xff\x17\x20\xef\xd1\x82\xba\xe5\x98\x33\x05\x6f\x8c\x65\x98\xdd\xbd\x35\x65\x33\x0b\xc1\x65\xe7\xc8\x70\x57\xb7\x4f\xdd\x6a\x4a\x6f\x0a\xff\x30\xfd\x4c\xa7\x01\x48\x23\x7a\xaf\xbb\x1e\x5b\x62\x24\xf9\x12\xc2\xfe\x29\x93\x8e\x5a\x94\x5a\x92\x2a\xc9\xf1\x8a\xe5\x41\x9f\x26\xc2\x56\x23\xb2\x27\x26\x3a\x49\x4c\x1e\x00\xf1\x45\x9f\xe7\xcb\x43\xf6\xa4\x5f\x45\x0e\xc9\xcc\x97\x7d\x0d\xee\xf7\x55\x6a\x32\x3e\x75\xa5\x61\xc8\xda\xdf\x57\xde\xbd\x96\x5b\x5e\xfc\xfc\x07\x80\x24\xa3\xd3\x07\xa7\x6d\x76\xec\x59\xae\xef\x37\x39\x58\xe1\xec\x29\xc6\xbd\x94\x84\xf0\x0f\x2d\x52\xc7\x4f\x76\xdf\xbf\x73\x88\xb6\xed\xcf\x54\x15\x40\xfa\xd0\xd6\x00\xaf\xd9\x2d\x52\xb1\x41\xb6\x23\xbc\x9f\x6a\x14\x78\xdc\xa9\xbc\x87\x0f\x09\x29\x29\x9b\xe9\x93\x5e\xe5\x6d\x7d\x99\xcf\x8c\x36\x44\x82\x89\xeb\xfa\xbe\xa3\x29\xf9\xa5\x45\x57\x0f\x94\x3d\x89\x34\xe6\x7f\xe5\xc3\x46\x12\x19\x3d\x5b\xa0\x2f\x61\xe6\x3a\x7a\xfb\xbf\xbf\x88\xa0\x6f\x17\x41\xc1\x5b\x46\xa9\xc9\xa3\x7c\x7c\x63\x36\x3a\x17\x0f\x7f\x7a\x63\x6c\x52\x91\x31\xde\x9c\xad\xff\xc7\x91\xc7\xbe\xf0\xef\x59\x4f\x00\x10\x1c\x7a\x99\x7e\x9d\x3a\xae\xf5\x4e\x98\x4b\x28\x82\x5b\x3e\x64\x6d\x5b\xee\xb3\xf0\x76\xf5\x23\xa2\xa1\x0b\xa9\xac\x97\xad\x95\xa6\x57\x43\x6b\x00\xb2\x89\xde\x34\x6d\x95\x43\x14\x53\x9b\xb1\x93\x4e\x81\x3b\x99\x97\x3b\xed\x1e\x9b\xd2\x53\xec\x80\xcc\xd4\x68\x81\x74\x75\xb5\x45\xd3\x69\x16\x74\x0f\x05\x73\xa2\xad\xfa\x8d\x7d\x27\xbd\x6a\x5c\x38\x3a\x45\x08\xbd\x42\xea\xe4\x1d\x2c\xd5\xf7\x17\x79\x6b\xf1\xbc\x47\x4e\x3a\x4b\xa2\x86\x7a\xc9\x5a\xcf\xdd\x4c\x9a\x69\x1b\x8a\xd5\x53\x5b\x48\xe5\x5b\xdd\x71\xfe\x7c\xc1\xe8\x92\x51\x66\xce\xe3\x30\x67\x3a\xf6\xfb\x2d\x38\x80\x6c\xff\xcf\xfb\xaa\x5d\x74\x78\x5d\x13\x0d\xca\x5b\xb6\xd7\x47\x7d\x7a\xfb\x39\x23\xb4\x54\xcb\x9e\xb2\x3f\xee\x0b\xae\x1a\xee\x4b\xfd\x73\xda\x16\x07\x90\x4c\xf4\xdd\xff\xb0\xf2\xbe\x2d\xfb\xf9\x32\xf1\x07\xab\xaa\x77\xe6\x15\x67\x15\xe9\x2c\xb5\x73\x74\xcb\x59\x0f\x86\x6a\xb9\x2c\xd5\x3b\xb5\xe9\xa1\x86\x3e\x3f\xba\x62\x2f\xe7\x79\xfd\xa0\xb8\x65\x5a\x02\x8e\x91\x97\x25\xd0\x95\x6a\x70\xc5\xb7\x20\x5e\xce\xc4\x3d\x0a\xac\x9f\xa7\x02\x00\xf1\x45\xe7\x20\xff\xa4\x7d\x4d\x7d\x1b\x6f\x98\x21\x1c\x6b\x6c\x4c\xed\xc9\x37\x28\x54\xd9\x2a\xd6\x1b\xff\xe0\x90\xe9\xe1\x27\x04\x5c\x16\x97\x3d\x01\x32\x8b\x5e\x1e\xed\xa2\x87\x63\x55\x31\xf4\xb7\x9a\x9f\xea\xc4\x13\xee\xd3\xef\x2c\x72\x6c\xee\x39\xcb\x42\xb6\x62\xf6\xb1\x58\x4e\x94\xdf\x96\xd7\x03\x20\xaf\xd0\x61\xa8\xc7\x73\x3e\x62\x73\xf4\x9c\x3e\x77\x26\xcb\xdb\x91\xe7\x5e\xbf\x2a\x7b\x08\xe4\x12\x09\xdb\x49\x7f\xd9\xc9\x14\xa5\xbe\xbc\x12\x02\x90\x49\xf4\xf2\x10\x86\xbb\x6d\x2b\xf9\xdd\xf7\xe1\x51\x0f\xca\x7b\x23\xee\x2d\xab\xfe\xad\xcc\x98\x8e\xa9\xda\xeb\xd7\x51\xd5\x2f\x06\x4f\x02\xe3\x00\x32\x85\x4e\xeb\x34\xf1\x8e\x05\x69\x17\xd7\x6b\x9f\x6f\xe8\xa8\x49\xe1\xad\x99\xf2\x1a\x79\x11\x69\xf6\x74\x4e\x9d\x5a\xdf\xed\xdb\xfa\x44\xe1\x6d\x0f\x80\x78\xa1\xfd\xee\x43\xbe\x2a\x56\x56\x23\x32\x7b\x06\x6c\x55\x15\x3f\xe7\x37\x93\xda\x26\x2f\x10\xde\xba\xf7\x2b\xd3\x88\xc0\xad\xc3\x3e\x23\x0b\x20\xcb\xe8\x9b\xf1\x05\x42\x77\xd7\xe9\xcb\x3b\x96\xc7\x19\x87\x1e\xd1\x7c\x3b\x6e\xee\xca\x12\x3a\xf9\x56\xe9\xeb\x11\xd7\xfc\x54\xf5\xe8\x8d\x32\x2a\x80\xac\xff\x4f\x57\x8c\xb7\x62\x51\x8b\xc2\x4e\xe2\x84\xef\xf7\xb3\x51\x01\x6c\x5c\xf6\xb3\xdf\xf2\xd3\x2e\xa6\x3d\x9a\xfd\xcb\x94\x55\x56\x59\xa7\xb1\x1b\x8f\xd0\x93\x35\xeb\xd9\x4f\x7f\x8d\xd2\xd8\x45\xb4\x2c\x63\xbb\xd6\x46\x1d\xa7\x7f\x71\xec\x60\xca\x68\xb5\x0b\x95\xcb\xd3\xc9\x30\xf3\x2b\xd3\x00\x59\x43\x5b\xa3\x56\xfa\x21\x97\x8b\xf3\x5d\x6e\xc5\x99\x2f\x05\x7a\xf1\x39\xe2\x61\x05\x2c\x07\xad\x06\x2a\x5e\xb5\xcb\x4d\x64\xb5\xa4\xfc\xd7\x26\x5d\x88\xee\x1c\xa5\xf3\xaf\x4f\x07\x1f\x0e\xa5\x28\x81\xaa\x86\x76\x82\xd6\xae\xee\x53\x37\xc2\x9f\x32\x46\xda\x7c\x8e\x8e\x18\xb6\xbc\x5a\xb5\x09\x90\x3f\xe8\x33\xdd\x7d\x2e\xfe\x0c\x63\x51\x39\xee\x08\xc9\x82\xc5\x59\xdd\x5f\x47\x71\x1a\xe0\xe7\xe7\x45\x7d\xfa\xa7\x1f\xea\xfc\x0e\x1a\xc6\x88\xee\x0a\x3b\x34\x91\xbe\xee\xc1\xbd\x21\xfd\xf3\x7b\x0e\xd1\xe1\x13\x81\x5f\xef\x98\x14\x90\x33\xdf\x05\x57\x1e\x51\xfc\xf1\xf7\xac\xa0\x49\x2b\x59\xd4\xc2\x01\xa4\x1e\xed\x9d\x50\xd6\xc5\xdb\x5b\x05\xce\x69\x07\xca\x0e\x99\xcb\xd1\xb9\x14\xb9\xf7\xa4\x57\x68\x48\x33\x64\x96\xe4\x5f\xfa\xf9\xa6\x6a\x7b\x15\xdd\x47\x25\x17\x48\xc6\xb9\xf3\x64\x5f\x78\xec\xb8\x5b\x15\xa7\x9b\x00\x42\x6b\x3b\x9b\xda\x7f\x3f\x90\xeb\xbb\xcc\xbc\xe2\x84\x73\xa1\x07\x40\x3c\xd1\x3f\x6d\xf8\x38\x14\xb9\xe6\x6c\xc7\xd0\x2d\xb7\x98\x2f\xc8\x9c\xae\xb0\xca\x37\xfa\xfd\x48\x6b\x42\x58\xde\x2d\x27\xf2\xb0\x31\x22\x36\x80\x4c\xa3\x87\x9b\x26\x83\xfe\xed\x4e\x21\xbb\x1b\x1e\x97\xd8\xf9\x06\x5b\xad\x09\x52\x02\x3e\xc5\x35\x94\xe6\xac\x34\x94\x28\x69\x6e\x7d\xe6\x03\xc8\x22\x3a\xfc\x9e\x22\xf9\xf2\x5d\x4b\xd1\x7f\xdd\x55\x49\xa0\x53\x5c\x6a\xad\xe6\x7d\x0a\xcf\xcb\x73\xdd\x1f\xee\xc8\x87\x47\xaa\x90\xff\xc0\x6d\xe0\xf3\x3a\x58\x84\x0e\xc8\x22\xee\x52\xff\xfd\xff\xf1\x19\xfa\x6c\x67\x77\x3a\x7e\x3a\x95\x2f\x68\x5f\xab\xac\xbc\xb1\x7c\xe8\xe5\xb1\x02\xe9\x9e\xf3\x81\x97\x5c\x68\x53\xdf\x51\x67\xf2\xd3\xf4\x9a\xe3\x00\x52\x83\xb6\xfe\xc9\x99\xfb\xd3\x3f\x0a\x6f\x9c\x6b\x8b\x57\xb6\x6a\x6e\xef\x59\x5e\xc1\xf1\x9e\x78\xa4\xf2\xbd\xe6\x18\x83\xc8\x3d\x3d\xf3\x9b\xc3\x38\x80\x7c\x46\x27\x76\x1c\xcf\xf3\x9c\xeb\xdd\x21\x2f\x73\xf5\x6f\x13\xeb\x2f\xcd\xcf\xc1\xa9\x59\xb6\xb3\x5d\xbf\x78\x3e\x3c\xaa\xbf\xe6\xd7\x2f\xd0\x85\x03\xd2\x57\x51\xc3\x3b\x0a\xf4\x9f\xdf\x93\xb8\x3a\xc8\xc4\xd8\xa7\xe6\xdf\xec\xa5\x92\x22\xd9\xd1\x92\x3f\x99\x50\x3f\x5a\x64\x5c\xe8\x63\xdc\xff\x5e\xe0\xdf\xac\x06\x32\x6c\xff\x9f\x24\x3f\x83\x79\x1d\x2c\xc3\x21\xa4\x06\xb2\x77\x2c\xdb\x21\xe4\x33\xfc\x9c\x3c\x96\xfd\x78\x88\xf4\x55\xfc\x43\x30\x89\x35\xfe\x21\x6f\xe1\x54\x30\xc9\x35\x1e\xf2\x13\xaa\x3d\x2c\x82\x0d\x21\xa3\xe4\xb0\x25\x01\x8b\x69\x03\x19\x29\x36\x32\x0f\x00\x90\x72\x34\xb3\x20\xf6\x12\x78\xf3\xaa\x04\xb9\x99\xa5\x5f\xfb\xe9\xc0\xd7\x67\x62\xca\xe2\x87\x87\xed\xd8\xaf\xd4\x2e\xce\x7a\x31\x30\x68\xdf\x97\x01\x48\xfd\xff\x08\xdc\x54\x4a\x6f\x35\xbf\x33\xac\x9f\xd8\x4f\x67\xde\x1a\x64\x94\x96\x37\x98\x32\x62\x73\x8f\x1b\x9a\xf2\x45\x6c\xcc\x53\x14\xc2\x71\x00\xc9\x42\x9f\xfb\xa0\x99\x52\x41\xd1\xcb\xc1\x7e\x3f\x4c\x82\x22\x98\xee\xf7\x9a\xfa\xcc\x02\x85\x4d\x86\x23\xed\x97\xe8\xa5\x24\x4a\xd3\x8e\x54\xe1\x00\xf2\x03\x6d\xce\x93\xeb\xc9\xc7\x68\x6e\x58\x1b\x28\xa6\xd3\x5e\x20\x18\x3f\x17\x7c\xfa\xf5\xc2\xf3\x30\xf1\x21\x4f\x9b\x48\xbe\x4e\x5e\x7f\x72\x1f\x81\x7f\xb4\x1a\xef\x9f\x72\x98\x7b\xc6\xb2\x1c\x42\xea\xa1\xb6\xc3\x32\x1e\x42\xb2\xa0\x1a\xc6\xb2\x1f\x42\x7e\xec\xa5\x78\x31\x75\x8f\xac\x07\x01\x01\xc1\xee\xca\x7d\x42\x1f\x6d\x3d\xc7\xc0\xa2\x00\xf6\x93\x26\xf1\xe2\x96\xb8\xa5\xa3\x0a\x06\x63\xac\x87\x0b\x8f\xcf\x67\x74\x78\xc7\x0d\xe8\x68\x64\xc7\x2a\x03\xe4\x27\x7a\x25\x54\x89\x3e\x0c\xe4\x71\x2b\x9c\xf6\x74\xb9\x98\xfa\x55\x61\x9e\x65\x35\xa8\x3a\x80\xb6\xdb\x68\xcb\x39\x9e\xb7\xe3\xd7\x58\x50\x2b\x0e\x20\x49\x68\xaa\x24\x7a\x53\x86\x49\xf8\x2c\x47\xef\x4b\xa5\xcf\xbf\x0f\x32\xfe\x6e\x6f\xe0\xc8\x88\x8a\x19\xc0\xe1\x24\x8e\x2b\x5a\xa4\xb1\x7c\x67\xc3\x01\x64\x1d\x4d\x0d\xa4\xf5\x78\xa6\xaf\x51\xf2\x55\xcc\xea\x70\x3e\x6e\x3d\xe2\xce\x64\xfc\xf6\xab\xf2\x34\x81\xff\xe5\xd8\x37\xaf\x73\xdd\xbb\xdc\x83\x05\xfe\xd1\x6a\xbc\x83\x3e\xed\xfd\x6b\x0c\xc3\xf2\xbd\xf3\x03\x97\x01\xcb\x78\x08\x49\x82\x89\x31\x2c\xfb\x21\x64\x9d\x02\x7f\x7b\x60\x2a\x50\xfc\xed\xa1\x0b\x73\x12\x58\x22\x14\xff\x90\x3a\x58\xff\xc1\xd4\xa1\x78\x48\x2a\xec\x27\xc0\xd2\xa2\x10\x92\x49\x08\x37\x21\x96\x28\x05\x32\x52\x44\xdc\xbb\xe1\x28\x05\xcd\x32\x4a\x99\x08\xc2\x6f\xfb\x32\x22\x72\x81\x5a\xbe\x1d\x27\xdf\x34\x36\x1e\x9f\xfc\xa1\xfa\x31\x4c\xb9\x56\x49\xa2\xaa\xaf\x35\xfa\x1e\x0e\x20\xc5\xe8\xe8\x98\x96\xca\x5f\xfc\xc0\x6c\xb9\xfa\xa9\xc9\x0b\xfb\xfc\x8d\xd7\x95\x37\xa2\xbe\xc7\xc8\x3f\xf8\xac\x6f\xea\x42\xea\xd9\x25\x57\x7f\x19\x07\x90\x49\xf4\x78\xe3\x97\x64\x31\xc8\xb7\x3b\x85\x2f\x5f\x1a\x1e\xa1\x65\xbc\x15\x72\x2d\x2d\x59\xf0\x01\xf2\xa5\x84\x6b\xbe\xe5\xd2\x55\xbd\xd7\xf9\x38\x80\x34\xa1\x29\x1e\xc3\x25\xe9\xea\x54\x90\xdb\x17\xa1\x7c\x61\x9e\xb9\x41\xa1\x4a\xc5\x36\xd5\xfc\x2f\xf1\x91\xa0\x7b\xf9\x87\x06\x79\xc6\xf8\x9d\x05\xfe\xcd\x6c\xe8\xa0\x14\x98\x68\xc7\xb2\x1c\x42\x8a\xf7\x3e\xb5\x83\x61\x3c\x84\x4c\x42\x08\x96\xfd\x10\xd2\x44\x8c\xdf\x84\x98\xe9\x01\xfc\x26\x94\xc3\x3f\x04\x33\x43\x80\x7f\x88\xd7\x5e\x23\x1e\x56\x96\x00\x0f\x69\x81\x19\x3b\xcc\x44\x01\x1e\x92\x00\x7d\x8c\x95\x2c\x80\x90\x97\xb4\x2b\x4d\x44\xff\x96\x35\x00\xb2\xc9\x04\x14\x64\xde\xbb\xc2\x11\x7d\x1b\x2e\xa4\xce\x5e\x90\x4a\x48\x59\x8b\x4a\xf1\x54\x3b\xbb\x30\xfd\xb4\x56\x6d\x8d\xdf\xd9\x7b\x73\xf6\xce\xcb\x8f\x1b\xd7\x37\x18\xdf\xec\x9e\x27\x74\xdc\xa3\xfd\xe2\xba\x71\xf0\x5a\xfe\xe5\xb9\x5b\x7f\x9e\x27\xc5\xdd\xb0\xb1\x5c\x99\xa4\xaa\x88\x24\x63\xd4\xff\xf0\xd2\xbd\xf6\xf7\x7b\x5d\x1c\x40\x22\xd1\x6c\xdd\x2f\x59\x82\x9d\x57\x5c\xe2\x7d\xf9\x87\xe9\x51\x16\x7d\xcf\x51\x35\x0d\xf6\x87\x5f\x24\x97\x5d\xe8\x07\xab\x42\xaf\x24\xb2\xc8\xe0\x00\x52\x8b\x8e\x7b\xe1\x79\xb2\xc7\xd5\x6b\x5b\x6f\x2c\x59\xf8\xbc\xfa\x6e\x7f\x57\xf2\x00\xf1\x91\x2c\x15\xad\x1b\x9d\x7a\x7e\x67\xce\x9a\x09\x5f\x21\xc2\x01\x64\x10\x6d\x0f\x89\x93\x25\x97\xf1\x37\x3a\xdf\xa4\xfb\x7a\x8f\xdd\x0b\xeb\x49\x3f\x08\xe2\x46\xe3\xd9\x14\xc6\xa2\x56\x25\x88\x6c\x54\x8a\x22\x71\x00\x01\x68\xde\xf8\x81\x9e\xe8\x42\xcf\x42\x3a\xa1\x6f\xcc\x03\xc9\x78\x19\xa2\x72\x42\x3e\xe5\xf4\x9c\x88\xee\x9b\x9f\xe9\xda\xb9\x91\xa2\x0a\x2f\x81\x7f\x73\x0b\x5c\x81\x31\x78\xd5\x62\x79\x66\xef\x7e\x82\x71\x15\xcb\x39\x10\x12\x09\x8b\x23\x58\xfe\x81\x90\x5a\x18\xf0\xb1\x5c\x04\x21\x83\xd0\x30\x2c\x2f\x41\x08\x60\xc0\x1f\x3f\xcc\x34\x14\xfe\xf8\x99\xc2\xea\x3c\x56\x26\x0a\xff\x90\x30\x38\x7b\xac\x6c\xd4\x1e\x1d\x84\xe1\x0c\x2b\x21\x05\x21\x6d\x10\x82\x99\x93\xc2\x43\xf2\xf7\x4a\xed\x58\x79\x29\x3c\xe4\x3d\x5c\x16\xac\xdc\x14\x84\x34\xc2\x10\x88\x99\x9e\xc2\x43\x7c\x61\xc9\x0e\x33\x45\x85\x87\x24\xef\xbd\xb4\x11\x23\x4d\x05\x21\x7d\x74\x2b\xf5\x44\xff\x96\xaf\x02\xb2\x44\x34\x44\x34\x9e\x00\x48\xa3\xc5\x73\xbf\x6c\x93\xb5\xa0\x9a\xc7\xf4\x5b\x55\x96\xb0\x3e\x46\x46\x81\x08\x82\x1b\x13\xe9\x57\x79\xb8\x53\xe5\x6c\x8d\x59\xde\x7a\xca\x01\xa4\x17\x9d\x87\xd8\x61\xd2\x92\xae\x7b\xb0\x64\x70\xbd\xcf\x62\xda\x5f\x66\xe4\x68\xfe\x32\xed\xcf\x67\xd4\x6f\x68\x67\x45\xf9\x8e\x9e\x32\xd6\xb9\x8d\x03\xc8\x38\x7a\x7c\x3d\xdf\x97\xf9\xf7\x97\xab\xf9\x17\x33\xfd\x02\x89\x6e\x4d\x4b\xd9\xb9\xee\x6b\x6d\x16\xfb\xa6\x24\xd3\x2a\x3b\xf3\xd4\xe1\x80\x24\x00\x48\x17\x9a\xb9\xd1\xab\xd9\xaa\x66\x3b\x6b\x74\xf4\xb0\xaf\xb5\x32\x02\x31\xc4\x21\xae\xe8\xa1\xf4\x92\x7b\x42\xc4\xa7\x58\x51\x6a\xed\xb1\x71\x80\xf4\xa1\x7f\x9e\xf8\x50\xa8\xe3\x84\x74\xd3\xd5\xc7\xfb\xaa\x0e\x9c\xcd\xda\x47\xbb\x09\xa2\x5e\x4c\x70\x9d\xa5\x17\x77\x3a\x37\x39\x92\x95\xf9\x0e\x07\x90\xaf\xe8\x0c\x73\xdf\xb9\x00\x1a\x26\x01\xa3\x92\xa3\x56\x66\x95\x35\x82\x76\x6a\x6d\xa1\xb7\xc8\x8f\x32\x77\x93\xbb\xe5\xa9\x94\xbd\x65\xf6\x3d\xcc\xff\x8f\x4e\xc1\x1f\x24\xb8\x2d\xb0\xfc\x02\x17\xac\x17\xee\x57\x4c\xd7\xe0\x21\xe3\x10\x82\xe9\x1d\x3c\xa4\x6b\xef\x5b\x41\x18\x1e\xda\xdb\x49\xf0\x29\x58\x4e\x82\x90\xaf\x30\xc0\x62\xe6\x3e\xe1\x5d\x0d\x99\x34\x66\xfa\x13\x0f\xc1\xc1\x4b\x01\x2b\x05\x0a\x21\x9b\x64\xf0\x9d\xbd\x58\xb9\x50\x20\xeb\x2e\xc5\x46\xb6\x4b\x26\x7b\xd0\xfb\xf0\xab\xc1\xc9\xeb\x15\x2c\xed\xdf\x0a\x77\xbc\x79\x8d\xcc\x6f\x78\x35\x9e\xd0\x54\x71\xa8\x0c\x4c\x1d\x5e\xbb\xf0\xe0\xe3\xdf\x7a\x02\x00\x90\x1e\x74\x6d\xe1\xab\xa0\xef\x51\xdc\x0f\x9f\xc2\x83\xf1\x4c\x7f\xfb\x8f\xf1\xcf\x33\x30\xca\xe5\x17\xe6\xf1\x1c\xe7\xdb\x78\x56\xf0\x32\xbc\xac\x00\x20\xcb\xff\x93\x8c\xac\xf5\xba\xda\x91\xf9\x5a\xe3\xc1\xbb\xb3\x91\xac\xee\xa7\x8e\x4e\xb3\x8c\x38\x7c\xab\xb5\xc1\x9d\x15\xc9\xcd\x3b\x66\xef\x16\x86\x03\x48\x2c\x3a\x23\x56\xb7\xb3\xfe\x69\x44\x8a\x40\xdd\x43\x2a\xef\x00\xc1\xf7\x4b\x17\xae\x91\x21\x5e\x8c\xa1\x32\x6f\x93\xf2\x7d\x85\x54\x5c\x57\x94\x77\xd9\x0e\xfa\xf7\x4b\x86\x53\x74\xc7\xda\x48\x69\xc3\xae\xfb\xa6\x2a\x66\xb6\x6e\xac\x87\xc9\x5c\x2e\xfe\xf3\xfd\xc9\xc3\xbb\xde\xe0\xc8\xc1\x16\x0e\x81\x7f\x9c\x25\xde\xa1\x3d\x70\x3f\x61\x4e\x14\x42\x60\x2f\x05\xd6\x64\x21\x64\x19\x6e\x0e\xac\xf9\x42\x48\x2c\xec\x5a\xc7\x9a\xf2\x1e\x2d\xa4\x5a\xd9\x20\xfa\xb7\xec\x37\x90\x25\xaa\x42\xdc\x77\x09\xdb\xab\xff\x79\xa7\x7e\x82\x97\x52\x28\x3b\x2e\xb4\xd2\x6e\xf2\xf6\xa4\xd0\xe8\x0b\xfe\x37\xa4\x27\x2c\xce\x9d\x5e\x27\x6a\x8c\xd5\xc8\x6a\xee\x0d\x03\x00\xa9\x41\xdf\xb1\x93\x19\x5c\x29\x2c\xb1\x12\x27\xb4\x9b\x28\x32\xbd\x98\x8c\x7d\x72\xd7\x47\x3a\x26\x49\x70\x8b\x49\x9c\xb6\x2b\x1d\x3b\xc5\x3f\x01\xf2\x0b\xfd\xf3\x92\x24\x77\x59\x8c\x64\xef\xcc\x0c\xf5\xee\x3c\xe1\x22\x64\xb4\xe2\x9f\x67\x8d\x89\x35\x8c\xce\x18\x4a\x13\x9c\x18\xf7\x92\x1a\xc3\x01\x64\x18\xcd\xbf\xc6\xc9\x55\xa5\x44\x25\x44\x8a\x2d\xa5\x4b\xdf\xbe\x2b\x14\x92\xfb\xb0\x76\x2b\xd1\x8f\x34\xfc\xb3\xbb\xa9\xd5\xcb\x25\xb7\xd7\x5f\x71\x40\xda\x12\x35\xfc\xc0\xf1\x94\x1c\xe5\x3f\x31\xa4\x7a\x6e\x9b\x0e\x95\x8f\x2e\x07\x5a\x3a\x3e\xf6\x89\x9e\x26\x5e\x9b\x91\x3f\x4c\x53\x4e\x1b\xba\x81\x03\x48\x1e\xfa\x28\x94\x3e\x24\x2a\x52\xea\x20\xdb\xea\xec\x10\x2c\xfb\xcd\xf0\xd3\xb4\xe5\x05\xc5\xfd\xfa\x9a\x6a\x45\xed\x0f\x8c\x3f\xda\x9b\x17\xe5\x71\x00\x79\x86\xde\x7b\x45\x84\x8c\x31\xb3\x16\x23\x47\xbf\x1a\x5d\x15\x2e\x0a\xf5\xa6\xc1\xc9\xe5\x8c\x32\x30\x4f\xb4\xa4\x3f\x3a\x42\x7f\x3d\x4b\x0f\xdf\xb1\x88\xe9\x44\xfc\x7a\xbd\xda\x7b\x59\x27\x96\x1f\x61\x1e\x0e\xde\xcb\x58\xbe\x84\x90\x5f\xf0\x29\x58\xee\x84\x90\x61\x4a\x3c\xf1\xc2\x72\x29\x8c\x17\x96\xf8\x87\x60\x39\x15\x3e\x24\x0f\x9e\x3c\x2c\xbf\xee\x25\x2e\xe1\x31\xc2\xaa\xd6\x40\xc8\x36\xbc\xfc\xb1\x0a\x36\x7b\x7a\x9d\x61\x65\xea\xff\xf4\x3a\x66\xe5\x46\x46\x8a\x80\x06\x78\x00\xc4\x03\xad\x8f\xef\x3d\xd9\x39\x9a\xb3\xb9\xe3\xed\xf4\x69\xfe\xc8\xe8\x72\xe2\x59\x95\x0f\x67\xd4\x85\x08\x77\xee\x66\x30\x98\x1c\xb0\xbc\x95\xac\x01\x90\x64\xf4\x36\x64\x8d\x32\x3b\x98\x5e\xb8\xf0\x6a\xbd\x22\x64\x66\x8e\x5a\xe9\x36\x4b\x75\xf8\x33\x0d\x2d\xae\x30\x86\x9b\xe5\x1e\x33\x13\xbf\x0a\x01\x52\x80\x16\x3d\x71\xa3\x1c\xb1\x4a\x65\x04\xb2\xc4\xdc\x4a\xb8\x77\xde\x8e\x8f\x3e\x9f\x78\x51\x15\x2a\x88\xd3\x7f\xb3\x84\x5c\x92\xa5\xbe\x0f\x70\x00\x79\x8b\x3e\xa3\x3f\xd9\xe8\xc3\xf9\x09\xce\xd9\xd8\xd6\x14\x6e\x26\x4c\xb5\x2f\x89\xd7\x08\xba\x69\x1d\x72\xb1\x9a\x89\x55\x15\x7e\x5f\x56\x6d\x20\xf0\x8f\x46\xe3\xdd\xe3\x01\x3b\xe9\x30\x0d\x87\xf4\x0f\x2e\x35\x96\xf1\x10\x52\x00\x69\x39\x96\xfd\x7b\xb9\x60\x78\x36\x30\x0b\x68\x90\xca\x42\xc3\xb0\x8a\x68\x10\x32\x0b\xf7\x20\x66\x1d\x0d\x9e\x73\x98\x71\xc6\xac\xa5\xc1\x64\x05\x9c\x3e\x56\x3d\x0d\x42\xa6\xe0\xba\x60\x96\xd4\x60\xea\x01\x1e\x0e\xcc\xb2\x1a\x8c\x64\x30\x8f\x80\x59\x5a\x83\xa9\x3c\xe8\x31\xcc\xea\x1a\x54\xb1\x70\xfa\x98\x15\x36\x3c\x64\x0d\x1a\x86\x59\x64\xc3\x43\x0a\x61\x88\xc5\x2a\xb4\x41\xc8\x1f\xb8\xc7\xb0\x6a\x6d\x10\x12\x0f\x45\x3c\x56\xb9\x6d\x2f\x39\xbe\xf7\x06\x4f\xac\xba\x1b\x90\x35\x24\x20\xfc\xef\x1f\x48\x53\xe8\x16\x3c\xd2\xba\x0e\x87\xa0\xfe\xbb\x8b\x34\x25\xb7\xdf\xfb\x78\x7e\xf9\x52\x69\x4c\x21\xd3\x26\x2d\xbc\x48\xb9\xa8\x71\x36\x31\x88\x61\x7c\x77\xf6\xe8\x48\x1b\x4c\x95\x90\x26\xc1\xfe\xac\xd0\xa7\x46\x65\x81\x9d\x39\x29\xa6\x32\xbd\xae\x4c\x5f\x49\x7e\x96\x35\xcb\x81\x35\x00\x24\xe5\xed\xce\x03\x1d\x0a\x1d\x2f\x1e\x67\xe4\x3c\x60\xfa\xbc\x62\xf3\x7a\x8d\x68\x93\xc8\xa2\x04\xff\xb8\x9b\x75\x7d\xb0\x74\x73\xc7\xf0\xa3\xd7\x11\xfd\x4e\xbb\xc2\x1a\xcd\x22\xef\x9d\x93\x79\xc1\xac\xa6\x65\x4b\x93\xe9\xc9\x4e\x4c\x64\x37\x20\x98\x69\x17\xba\x20\x16\xf0\x91\x47\xc5\xae\x42\x65\xb6\xd1\x4c\xe0\xdf\xcc\xde\xdb\xec\xb0\x99\x0e\xcb\xf2\xbd\xd5\x86\x09\x08\x2c\xe3\xf7\x96\x0e\xee\x5c\x2c\xfb\xf7\xd2\x09\x90\x1c\x62\x56\x40\xf1\x10\x4f\xf8\x14\xcc\x2a\x28\x1e\x32\x0d\x21\x58\x95\x50\x08\x59\x24\x5a\x69\xa5\xfd\xff\x98\xb5\x98\xd1\xae\x93\x25\x72\x87\x0a\xad\xa4\x45\x9d\x78\x0e\x04\xed\xd8\xdf\x17\x99\x2d\xa1\x67\xa2\x55\x93\xf8\xe5\xef\xe8\xee\x0c\x64\xb7\x77\xdc\x2a\xa3\x58\x00\x40\xde\xa0\x03\x15\xd3\xaf\x5a\x0b\x2e\x71\x83\xa4\x90\xb9\x82\x32\x37\xb2\xad\xa9\xee\xbb\x3b\xe5\xc4\xda\x4e\xa7\x3c\xbb\x0d\x6d\xa4\xfd\xcc\xc6\x01\xf2\x0b\x1d\x06\x15\x9c\x3e\xc7\x28\x2e\x5b\xfd\xbd\xcd\x1f\x3e\x56\x6c\x65\xa1\x70\x84\xf9\x50\x6c\x2b\x99\xef\xbb\x05\x92\x85\x4d\xe2\x29\x1f\x74\xb3\x46\xb0\xf3\x2b\xf2\x0e\x87\x86\xd8\x8f\xbd\xe4\xd7\xba\x0a\xee\x36\x5c\x7e\x5e\x15\xa4\xbd\x8f\x7c\x3d\xc1\x86\xea\x4b\x58\x96\x76\x0b\x0e\x20\xbf\xd1\x31\x2d\xd9\x68\x39\x9a\x6d\x80\xfc\xec\x59\xef\x72\x1b\xf5\xbf\xcf\x6e\x88\xfe\xe6\x0a\x3d\xa0\x1b\x1f\xa7\x39\x55\x51\x2d\x7a\x3e\x92\xd3\x03\x20\x01\xe8\x96\x87\xbe\x82\x41\xc3\x70\x11\xd1\xe3\xa1\x4e\xac\xef\x2f\xbe\x6e\x75\x3b\xcd\x7c\xbc\xc9\xb9\xc3\x71\x89\xa1\xc2\x09\x5c\x9a\x64\x94\x06\x48\x0c\xba\x3e\x2b\x5e\xa7\x5d\x7c\x12\xc1\x59\x1d\x71\x67\xea\x35\x17\x70\x79\x24\x52\xa9\xf5\x44\xfb\xb3\xf0\xd5\x38\x47\xa5\x43\x5f\xe8\xea\xde\x02\xa4\x1a\x7d\x78\xf6\x3f\x6a\x4a\x18\xb8\x4a\x6b\xfd\x28\x50\xbe\xef\x41\xaf\x8b\xa5\xac\xcd\x7b\xf9\xe2\xef\xba\x3d\x34\x49\xc4\x3d\x77\xe8\x4e\x4b\x78\x00\xc4\x13\x6d\x8d\xc4\x19\x71\xbb\xac\x0c\x5b\xc5\xe0\xce\xfb\x27\x7c\x33\x18\xcc\xdc\xad\xcb\xf4\xd3\xa8\x7e\x1c\x9e\xa6\xa8\xeb\x30\x7b\x12\x6a\x07\x90\x58\x74\x8f\xdc\xb7\xf8\x27\xcc\x02\x32\x19\xd6\x71\x4a\x5f\x19\xe8\x4e\xd9\x14\xd5\xfd\xed\xab\x09\x49\x15\xe1\xfc\x70\x86\xfe\x02\xc5\x72\x8a\x3e\x40\x0a\xd1\x49\xce\x32\x06\xce\x9b\x9f\xd7\x16\xf4\x42\xf8\x2e\xd4\xaa\xaf\xc6\x09\x0d\x26\xb8\x47\x96\x19\x7f\x4f\xe3\x39\xa4\x70\xee\x83\xb6\xfa\x24\x6a\xe8\x70\x0c\x9d\x02\xd5\xb8\xad\x0f\x2b\xd7\x21\x7b\x6f\x97\x70\x27\x31\x07\xf6\xd3\x35\xcd\x8f\x9f\xab\x29\x73\xdd\xbc\x9a\x61\x3b\x00\x00\x12\x8f\xf6\x0b\xe3\x89\x8c\x0c\x0d\x49\xbf\x91\xc9\x11\xc9\xc7\x4a\xcd\x99\x8f\xf8\x0e\x70\x34\xbd\xac\xb8\xb7\x71\x75\x26\x59\x38\xad\xeb\xd4\x4d\x80\x4c\xa3\xd3\xa1\x0d\xa4\x61\x33\x84\xfe\xba\xbd\xe4\xc7\xaf\x9b\x2a\x00\xaa\x90\xe4\x99\x62\xb7\x18\xb1\x13\xa6\x82\x6c\x3b\x12\xee\xa3\xfe\xde\x00\x20\x29\xff\xf3\x61\x23\xdd\x4f\xdd\xcd\x8b\x8d\x15\x87\x13\xba\xb6\x8c\x48\xca\x6e\xb0\x97\xa9\x7f\x3c\xfd\x47\xda\xe0\x14\x8b\xdb\x7d\x49\x8b\x91\x40\x80\x94\xa3\xdb\x98\xe2\x6d\xec\x67\x24\x73\x33\xab\x06\x37\x1d\xf9\xb6\xf3\x05\x5d\xbd\xf7\x67\x1c\x3e\x13\x2c\x7f\xaf\x98\xf4\xda\xe4\x10\x79\x53\xac\x07\x40\x0a\xd0\xcb\x74\xf1\x04\xb3\x85\x44\x6f\xef\xa1\x9f\x47\xa5\x34\xcb\x4f\x2a\x7d\x7d\x41\x2b\xa7\xf6\xdb\x2e\xdc\xa9\xf7\x8c\x47\xa0\xf9\xd4\xb5\x74\x80\xb4\xa2\x93\xd7\xef\x22\xe5\xa7\x96\xf7\xdb\x8c\x09\x35\x97\x4a\x68\xae\xd0\x8b\xaf\xdc\x35\x5c\x2b\xf5\x08\x5a\x50\x9a\x94\x2a\x10\x13\xea\xb8\x04\x90\x2d\xf4\x8d\xe8\x4d\x97\xb8\x55\x28\xef\xd8\x51\x4b\x48\xe5\x36\x98\x35\xbc\x2f\x81\x23\x8d\xa0\xe9\xd1\xce\x07\xdd\x86\xb1\xa2\x6f\x75\x94\xb1\x38\x80\xfc\x45\x17\x5d\x5a\x1f\x11\xf0\xc5\xe5\x9b\xb0\x88\xa4\x2d\xd9\xa9\xbe\x3c\x63\x2b\x14\xa7\xdc\xc6\x38\x93\x2b\x5a\x99\x40\xfc\x47\x36\x2c\xf7\x3e\x00\xc8\x5b\xf4\x0d\x9a\x53\x31\xf2\xe9\x6a\x9c\x46\x88\xaf\x77\xb3\x64\x0a\x4b\xc2\xab\x33\x2f\x3f\xe3\x18\xd7\xe9\x2a\xc2\x8b\x5e\x2c\x72\xbe\xe0\xbd\x00\x90\x16\x34\x4b\xb4\xbe\x70\xe3\x74\xde\x65\xcb\xce\xa0\xa6\xb7\xef\xa7\x5e\x58\x57\xb8\xd0\x12\xfb\x69\x44\xb0\x1c\x12\x1e\x4d\xce\xe8\xce\xf4\xe2\x01\x00\x89\x44\x3b\x87\xdf\x9e\xc6\x4d\x6e\x92\x2d\x82\x43\x69\xf5\x6a\xc3\x2b\x01\xc5\xa0\xef\x8e\x45\x35\x3a\x52\x96\xc3\x04\xbe\x32\xea\x1b\xe1\xc6\x00\xf9\x8c\x9e\xed\x11\x66\xf3\x40\xd6\x5c\x5d\x87\x13\x52\x4e\xee\xe3\x5c\x32\x16\x06\x26\x5f\xee\xbb\x88\xa4\x52\x73\x9e\x0e\x62\x21\x48\x8f\x8a\xc3\x01\x24\x0b\x2d\xf3\xe5\x64\x5b\x11\xfa\x14\xad\x67\xb2\x54\x7d\x1f\x4f\x4e\x37\xf9\xb5\x79\x8a\x6a\x16\x3c\x6e\x4d\x7f\x5b\xcb\x46\x45\xfc\x27\x7c\x77\x7c\x22\x5a\x29\x66\xf4\xdb\x6c\xd2\xcf\x3d\x3a\xd8\xce\xef\xf4\x6d\x7b\x3d\xac\x2e\x5d\xa8\xf1\xd9\xe8\x86\xbd\x61\xac\x9f\x94\x8b\x43\xb0\xae\x3b\x0e\x20\x39\xff\xf3\x32\x39\xe3\xcf\xdd\x65\x06\xc3\x0d\x3d\x56\x5e\x1d\x72\xd3\x79\x17\xb2\x37\x8e\x5d\xaf\xfa\xa1\xaa\xd1\x50\x96\xe5\x5b\x51\xf9\x40\x18\x35\x74\x6c\x45\xa7\xfa\xa5\x66\x4c\xa3\x65\x64\x33\x9d\x6d\x9b\x39\x0d\xd3\x7d\x95\xa4\xce\xe7\x6d\xea\x0f\x38\x6a\xca\x78\xbd\x0b\x84\x00\x40\x42\xd1\xa1\x94\xc2\x79\x42\x25\xeb\xd5\x0d\x71\xa6\xc9\xa6\x1e\xc6\x7d\x89\x21\x2c\xb1\x12\x01\x4f\xa3\xe3\xa6\xc7\x7a\x28\xe8\xf8\xc7\x83\x1a\x00\xd2\xf4\x3f\x9f\x82\x8c\xfc\xca\xfd\x99\xf1\x83\xae\xd4\x37\xca\x74\xd2\x0f\x17\xcf\x54\x66\x4a\x19\x3e\xd8\xa1\x3c\x7c\x88\x9e\x21\xd2\xda\xef\xaa\x27\x00\x88\x37\xfa\x2a\xd3\x1c\xd3\x17\xe3\x48\x2b\x4b\x2a\x99\xd0\xe3\xda\x0a\x37\xe2\x51\x7f\x27\xdf\x40\xa9\xbf\x4c\x58\x5c\x1b\xe9\x6d\x7e\x87\xfe\x0b\x40\x9e\xa1\x1d\x33\x54\xa5\xfc\x30\x95\x86\x33\xc5\x9b\xea\x56\xa3\xfb\xc6\x21\x65\x0f\xbf\xda\xcd\x3c\xd5\x46\x22\x8f\x6e\x81\x47\x6a\xc9\xb7\xfc\x01\x40\x62\xd0\x3f\xcf\x4e\xf7\xc9\xf3\xe9\x5d\xcf\x25\xf7\xcf\x05\x23\x6f\x7c\xdb\xa5\x1e\xd6\x15\x79\x69\xb3\x34\x8b\xde\xfe\x44\xe1\x0b\x9c\x3a\xa7\x01\xf2\x03\x3d\xdc\xbe\xdc\x24\xd0\xcf\x7f\xba\xe4\xf1\x50\xd7\x52\x2f\xe5\x46\x76\xc2\xe4\xfb\x8f\x34\x2f\x0b\xef\x4e\x3c\x73\xfb\x49\xeb\x18\x34\x8b\x1a\xfa\x2a\xc1\x74\xda\xaa\xe8\x77\xd9\x11\xe9\x6a\x0d\x35\x69\x8a\x57\x19\x07\xe4\x89\x15\x19\x37\xe3\xb6\xdc\x9b\xee\x72\xbd\xae\xff\x8e\xee\x4d\xac\xe3\xa8\x89\x78\x17\x5e\xd7\xa1\xeb\xe8\xc9\xfb\xbd\xd8\x88\x71\x74\xd4\x46\xd4\xfa\xad\xea\x1f\xd1\xeb\x74\x3d\x2f\xaa\xdb\x3c\x00\xd2\x8e\xae\x8a\xcf\x38\x34\x0e\x5f\xc8\x11\xd1\x20\x1a\x48\xbb\xf9\x30\xf9\xf6\x62\x23\xb7\xe1\xdc\xc1\x12\x1e\x56\xd9\xa6\x4f\xba\x57\x96\xbe\x4f\x00\x64\x0e\xbd\xd7\x11\xa2\xca\x78\xc1\xde\x70\x7b\x03\x67\xcf\xc5\x73\x31\x2c\x3b\x47\xd3\xcb\xa4\x58\x7f\xe4\xf6\xdd\xcc\x7e\xa2\x6c\xb4\x43\xee\x0b\x90\x15\xf4\x0a\x49\xad\x5f\xfb\x46\xc0\x1c\x69\x42\xcf\x9d\xfe\x76\xe8\x92\x59\x6d\xfc\xd7\x46\x03\xda\x57\xf5\xad\xfa\xdc\xba\xcb\xfe\xea\xe9\xda\x00\x20\x19\xe8\xbd\x25\xf7\xcb\x2b\xd3\xdb\x26\xf4\xca\xea\x58\xed\xd5\xf2\xfa\x10\xe6\x60\x73\xc3\xa6\x06\xf7\x30\x23\x29\x92\x63\xba\x83\x0f\x1b\xb4\x01\xb2\x89\xde\x2f\xaa\x5c\x85\x14\x33\x05\x5f\x1a\x1c\x18\xea\x32\x3c\x2b\xee\x4c\xbc\x99\xde\xea\x6f\xac\xdf\xe7\x38\x58\xb6\xcf\xbb\x59\xe2\x71\x9d\x07\x40\x42\xd0\x99\xde\x5c\xd2\x43\xe1\xaf\x6e\x77\x49\x72\x16\x7e\x13\x3c\xaf\x93\x98\xb7\x91\xf8\x8a\x37\x2d\x62\xb2\x74\x80\xd8\x75\xdb\xbe\x74\x59\x04\x20\x31\xe8\x4b\xf5\xfc\xef\xe0\x60\x0a\x95\x60\xbd\x18\x85\x03\x24\xf5\x15\x77\x2d\x05\x9d\x82\x32\x3b\x97\xff\xca\x75\xb9\x48\x36\x38\x49\x21\x77\x01\xd2\x8a\x3e\xd7\x44\xbc\x66\x7d\x31\xfb\x3c\x28\xde\xc7\xa4\xaa\xf2\x39\x6b\x1c\xde\xf6\x44\x0e\xbc\x51\x8c\x35\xfe\x26\xa5\xa9\xfb\xfc\xf0\xa6\x08\x6a\xe8\xd9\x95\xa1\xc1\xfd\xdb\x37\x66\x23\x9e\xc8\x2d\x73\xb1\x12\x32\x3a\x44\x2f\x5f\xed\xad\xf6\xf1\x48\xbf\x31\xe3\x5b\x19\xf6\x4b\x10\x35\x34\xf3\x63\x8a\xad\xeb\x64\x23\x5d\x5c\x44\xda\x01\xe1\xb0\xc1\x33\x66\x39\xba\xe9\xa7\xe5\x3f\x5c\xa8\xee\x58\x25\x3b\xff\x44\xb1\x14\x07\x90\x39\xf4\x82\xfe\xd4\x19\xad\x3b\x31\xd6\xfa\xfb\x6e\x7f\x93\x79\xa8\x17\xc9\x37\xaa\xf6\x23\x27\xee\xb2\xc8\x99\x06\xac\x1f\xfb\xfc\xfb\x40\x72\x95\x07\x40\x5e\xa0\x57\xb4\x22\xd5\xf9\xb1\x59\x33\x05\x8d\x90\x7a\xd4\xbc\xa1\x89\x48\x51\xdf\x93\xd2\x08\x91\xa8\x6e\x81\x6c\xc9\x67\x23\x17\x47\xeb\x5f\x00\xa4\x08\xed\x93\xb3\x96\x86\xfd\x8f\x86\xa3\x6e\x9b\xe6\x1c\xf0\xf4\x9d\x2e\xc8\x73\xbd\xc3\x3d\xfe\xf4\xa3\x60\xd2\x7e\xb7\xfe\x77\x24\xf7\x97\xa9\x00\xd2\x8f\xb6\x86\x41\xd3\xbb\xf1\xbd\xc8\x6b\x21\x06\x57\x8b\x3f\xdd\x72\x6f\x2c\x54\xb9\x85\x4e\xcb\xde\xf2\x17\x49\x71\x93\x97\x35\x5f\x8a\x70\x44\x0d\x7d\x2b\x57\xb6\xba\xee\x74\x74\x94\x82\xcb\xa2\xbf\xca\xc4\x34\xf7\x18\x43\xb2\xad\x18\x57\xe8\x48\xa8\x95\xf5\xb8\xe2\xd1\xb6\x68\x81\x7f\x64\x46\x32\x52\xff\xf7\x9f\x32\x28\x38\xb1\xd8\x11\x84\xfc\xda\xfb\xbf\x0f\x16\x4d\x02\xb2\x44\x6c\xdc\xff\x7d\x06\xa5\x0e\xbd\x81\x4d\xb5\xda\x0a\x08\xd9\x23\x78\x62\xd5\x9d\x98\xd8\x3a\xfe\x0e\xdc\x5d\x5f\xde\x64\x1a\xbf\xa8\x67\x54\xe5\x2f\xc6\xef\x9f\x2e\x84\x03\xc8\x0f\x34\x71\x23\xbc\x2c\xa2\xd5\xef\x6f\x71\x4d\xab\x63\xe1\x78\xd6\x29\x8e\xb3\x39\x3e\xa5\xf4\x13\x3b\x3a\xb4\x27\xb6\x1f\x7f\xa7\xb1\x97\xe7\xc1\x01\xa4\x1c\x1d\x9a\x90\x90\xf3\x86\x1b\x97\x04\x78\xef\x50\xd7\x0f\x4e\x19\x28\xbe\xb8\xc4\x1d\x39\xf2\x5e\x6a\x90\xbe\xdf\xeb\xf7\x2b\xd7\x90\xb5\x24\x1c\x40\x00\xfa\x0e\xb3\xbb\xd6\xf6\x5c\xa6\x8b\x4b\xeb\x5b\x3f\x55\xa5\x45\x67\xb4\x7a\x2c\x9b\xc6\xba\x39\x91\x41\xa7\xa4\x35\xf5\x0d\x4f\xdb\x83\x6f\x71\x00\x09\x44\x9f\x10\x02\x85\x17\xbf\x12\xa2\x9a\xcc\x82\xb2\x0e\x56\x5c\x1c\xa3\xbd\x51\x7e\x94\x95\x53\x32\xe2\xc3\x2b\xd2\xd6\x87\x84\xaf\x99\xab\x3a\x04\xfe\x6d\x9a\xd0\xa3\x75\x50\x91\x61\xcd\x14\x42\x7e\x40\x71\x8d\x35\x59\x08\x29\x87\x4a\x00\x6b\xbe\x10\x02\x60\xaa\x0e\x6b\xca\x10\x12\x08\x25\x3c\x16\x27\x86\x90\xdf\x50\xc3\x62\xd2\x62\x3c\x24\x00\x66\x30\x30\xa9\x31\x1e\x12\x03\xff\xa5\x87\x45\x8f\x21\xa4\x1a\x2a\x34\x4c\x86\x8c\x87\x78\x42\xc3\x30\x59\x32\x1e\x12\x0b\x3b\x78\xb0\x98\x32\x84\x14\x1e\x80\x7a\x1c\x93\x32\xcb\x12\x4b\x91\xfc\xd7\x51\x1a\x87\xe6\xaa\x5d\xfd\x91\xc5\x37\x69\x58\x7b\x63\x2a\xbe\x2b\x76\x4b\xaa\xb2\xb8\xbe\xbd\x18\x29\x62\x39\x7a\xca\xde\xe7\x27\xc5\xe5\xb6\x9c\x1d\x1c\x40\x52\xd1\xe5\x3c\x13\x92\xfd\x9a\x45\x37\x94\x7b\x92\x15\x4a\x70\xbd\x8d\xaf\x49\x9a\x89\x87\xeb\x9c\x38\x13\xaa\xe5\x5e\x11\x7b\xf0\x76\xb6\x8a\xe0\x00\xd2\x89\x96\x14\xd1\x0b\x7f\x56\x0a\xef\x84\x0d\xaa\xa5\x90\x33\x1b\x88\x71\x04\x9b\xba\x85\x75\x10\x0e\xdf\xb4\xf8\x31\xc9\xc7\xfb\x47\x3b\xa6\x1d\x07\x90\x32\x34\x7f\x33\x9f\x6f\xb9\xbc\x60\x17\x58\xd6\xab\xfa\xb9\xfe\x42\xf8\x9b\xdb\xcb\x8b\xa4\x38\xa2\xba\xa9\x28\x26\xa2\x4b\x26\x06\xb9\x63\xf8\xf7\xf9\x61\x99\x0d\x3d\x14\x07\x6b\xc2\x58\x96\x43\x48\x2a\xac\xb1\x61\x19\x0f\x21\x9d\x70\xb5\xb1\xec\x87\x90\x32\xa8\x94\x31\xc5\x0b\x1e\x12\x0f\x77\x2e\xa6\x80\xc1\x43\xa6\x61\x1b\x2a\xa6\x86\xc1\x43\x52\xe0\x53\xb0\x74\xcc\xde\x8d\x02\x9d\x8c\x29\x65\xf0\x90\x02\x78\xa4\x30\xe5\x0c\x1e\xd2\x0a\x6f\x47\x2c\x49\x03\x21\x5b\xd0\xc9\x98\xaa\x06\x0f\xf9\x0b\xbb\x9e\x30\x85\x0d\x1e\xf2\x16\x5e\xa8\x98\xe2\x06\x0f\x69\x81\x79\x44\x4c\x7d\x83\x87\x44\x42\x8f\x61\x69\x1c\x08\xf9\x0c\xa7\x8f\x25\x73\x20\x24\x0b\xa6\x1e\xb1\x94\x0e\x84\x24\xc2\xe0\x80\x25\x76\x20\x24\x87\x14\x76\x1e\x62\xaa\x1e\x59\x29\x02\x77\x32\x0f\x1c\x40\x46\xd1\x54\xe0\xf8\x72\x83\xbe\xe4\xd3\x13\x25\x1f\x22\x4f\xe3\xa6\xed\x82\x24\x02\x53\x8d\x64\xec\x0e\x2d\x74\x7b\x29\x1f\x3b\xc3\xaa\x7e\x16\xc1\x01\x64\x02\xcd\xad\x97\x24\x59\x3f\xf2\x4a\x1a\x79\xea\xc6\x75\x1f\x48\x7b\x9c\x1b\x1c\x95\xba\xf1\x23\xe0\x6e\x35\x89\xa9\x61\xff\xe7\x0b\x82\x97\xe9\x01\x40\x7a\xd1\x54\xe0\x0b\xa3\xd2\xec\xd2\xcd\x5c\x93\x99\x52\xde\x0f\x4a\x3b\x2a\x3b\x34\x26\xdb\x07\x44\x72\x88\x9a\x6f\xff\x78\x09\xd2\x5c\xd7\x99\x00\xb2\x8c\xce\x6d\xec\x57\x1f\x2f\x1d\x93\xf2\xf2\x61\x1c\x9d\x79\x32\x77\x2a\xea\x6c\x3a\xb5\xde\x93\xe1\xcf\xb9\x7e\x24\xcc\xc7\x0f\x50\xba\xe9\x4b\x08\xfc\x9b\xd5\xd0\x41\xa3\x30\xac\x63\x1a\x8e\x87\x4c\xc0\xf0\x81\x69\x3b\x1e\xd2\x0b\x57\x0e\xcb\x7e\x08\x59\x86\x9d\x3c\x98\xf2\x13\x0f\x09\x85\x29\x51\x4c\x09\x8a\x87\x34\xc1\xb9\x60\xaa\x50\x3c\xc4\x1b\x92\x07\x4c\x25\x8a\x87\x3c\x83\xd3\xc7\x14\xa3\x90\x3c\xc0\xa7\x60\x09\xd2\x3d\x86\x46\x07\x7b\xf4\xb1\x94\x29\x90\xa1\x75\x27\xd8\xdd\xea\x2d\xe8\xec\xe6\xe3\xc0\xd5\xaa\x2a\x5a\x4d\xb6\x94\x5a\xb6\x39\x21\xd6\x8f\xf5\x7e\x9e\xb3\xeb\xd2\xd6\x3d\xfb\x12\x42\x0d\x8f\x76\x46\xef\x93\x00\x00\xf9\x84\xde\x8b\x40\x81\xa7\xfe\x60\xfb\x04\x52\x77\x6f\xc3\x6d\xe4\x20\x25\xd3\xcc\x07\x49\x9c\xdb\x03\x0d\x93\x33\xef\x94\x1f\x7b\x65\x1c\xf7\x05\xc8\x20\x9a\x01\xd4\xde\x94\x94\xac\x9e\x3b\xdf\xe6\xd7\xee\x4b\xd3\xf5\x9c\x4f\x2d\x94\x8f\xa3\xe7\xae\x4d\xd0\x34\xcd\xb2\x8a\x7c\xea\xeb\x1c\x57\x1c\x40\xb2\xd1\xa4\x7a\x25\xa7\x3e\x3e\x38\xa4\xa9\x4c\xca\xb5\xfe\xe4\x7a\xa6\x53\xc4\xfa\x71\xd5\x74\xfb\xb5\xd9\x78\xb2\xe0\xc6\x87\xbf\x8a\x4e\x5c\x13\xf8\x47\xab\xe1\x55\x08\x95\x07\xa6\xe1\x78\xc8\x27\xb8\x09\xb1\x8c\x87\x90\x41\x18\xa2\xb0\xec\x87\x90\x6c\x5a\xd8\xd2\x82\x95\x27\x00\x32\x72\x84\xff\x7d\x86\x7a\xf8\x7f\x5e\x69\x6f\xf8\x46\x63\x93\x2a\xe8\x7b\xb0\x13\xeb\xf9\xcb\xb7\x9d\xd3\x87\x8c\x06\xd8\xe5\xc5\xcf\x4c\xbd\xf3\x18\x48\x3d\xc7\x3e\xa7\x88\x03\x88\x17\x3a\xc7\x71\x49\x13\x80\x89\xc4\xcd\x16\x4b\x3d\x1f\x2b\xa7\x46\x87\x1b\x3b\xe9\xfd\x3d\x84\xc5\x5d\xde\x9f\x74\xbd\xc3\x63\x5a\xf5\x8d\x77\x4f\x2c\x5a\x2e\xda\xb7\x8f\x69\xb8\xe4\x3c\xca\x1c\x93\x67\xdb\x4c\xaf\xa8\xb3\x7f\x33\xd5\xcc\x4c\x58\xc6\x88\xdb\x59\xa5\x9c\xae\x7b\x00\x58\x70\x00\xc9\x40\xe7\xba\x5e\x8a\x5d\x78\xb8\x73\xf2\xbd\x05\xc1\x0f\x6b\x0d\xe4\xd1\x75\xfb\x5f\x2f\xb7\x29\x3f\x3c\xd3\xd3\x92\xf6\x91\xb1\x3c\x1e\x60\x40\xbd\xcb\x41\xd1\x1b\xcf\xf2\x78\xba\x80\xc9\x51\xe6\xd3\x23\xb3\xdd\xb5\xaa\x9e\x01\xb6\xe9\xd6\x6f\x09\xa9\x3c\x83\xb2\x9e\x9f\xf1\x9a\x27\x30\xa3\x6e\x10\xf8\xb7\x69\x42\x87\x0e\xc3\x35\xc0\x9a\x29\x84\x78\xed\x9d\x37\x8c\xc9\xee\x5d\x6a\xb0\x79\x09\x6b\xbe\x10\x92\x01\x83\x1e\xd6\x94\xf7\xc8\x3a\xdc\xb5\x98\x39\x21\x3c\xa4\x1d\x1a\x86\x99\x17\xc2\x43\xe6\x20\x4d\xc0\xcc\x0d\xe1\x21\x2b\xf0\xea\xc4\x4c\x0f\xc1\xe9\x43\x62\x85\x95\x22\x82\x90\x4d\x78\xa7\x63\x66\x89\xf0\x90\x10\x28\x08\x31\x33\x45\xf0\xb6\x85\xec\x15\x2b\x5b\xb4\x47\x12\xf7\x5e\x2e\x8c\x95\x36\x02\x32\x24\x04\xfe\xff\xbd\x22\x11\x7d\x08\x07\xb4\x3e\x98\x6b\x5b\xe0\x72\xca\x8b\xac\x23\x93\x11\x3a\xe1\x14\xdb\x15\x17\xe7\x91\x97\xf3\x42\x88\xf1\x15\xe3\xe1\xd7\x07\x76\x9f\x81\xce\xaa\x95\x06\x3c\x24\x16\xfd\x7d\xc1\x70\xe9\x95\xfa\xa2\xc4\xa5\x5e\xf9\x0b\x09\x14\xd7\x07\x14\x66\x9e\x86\x7a\xe8\x2a\x1f\x20\x0d\x7a\x8e\x03\xc8\x2c\x9a\x58\x08\x89\x7b\x44\x47\xd5\xb0\x71\x09\x9a\xfb\xf3\xc5\xfe\x4a\x89\xf5\xe9\xfb\x4d\xf8\x74\x3e\x8a\xaa\xcf\xb5\x68\x4a\xdd\x41\x38\x14\x07\x90\x46\xf4\x25\x42\x1a\x5c\x74\xa9\xe0\xd0\xf1\x6a\x55\x27\xc9\x1f\x09\xd3\xd5\x3b\xb7\x8b\x9f\x6c\xc5\xae\x31\x9c\x26\xe1\xe0\xf4\x9b\x22\x99\xdb\x10\xf8\x37\xb3\xf7\x84\x29\x3c\x51\x58\x96\xef\xf9\x14\x2e\x36\x96\xf1\x10\x32\x0b\x43\x2b\x96\xfd\x10\xd2\xb8\xf7\x76\x4b\xac\x2c\x1e\x90\x25\x27\x20\xf8\xef\xef\x28\xad\x68\x57\xed\x5c\x1b\x17\xbf\x27\x3e\x11\x79\x23\x44\xa6\xb1\x5e\xc2\xff\x74\x50\xd6\xe2\x86\x8e\x8e\x48\x97\xc7\x89\x07\x17\x9d\xdc\x65\x24\x71\x00\xe9\x47\x2f\xdd\xb4\x98\xca\x3c\x92\xfc\x9a\x78\x46\xa5\xe6\xdd\xfb\xfb\x5b\x67\xc6\x09\x59\xbe\x54\xe9\x6e\x72\xb6\x25\xb0\x79\x66\xca\xe9\xbb\xe1\x00\x92\x8b\xd6\xbe\x12\xaf\xd3\xd6\x77\x6c\xcf\x89\x7d\xf6\xc9\xcc\xfa\x44\xa0\x9d\xd7\x3b\x3a\x18\x60\xd6\x59\x59\x72\xc1\x5d\x53\xf2\xe2\x81\x49\x66\x1c\x40\x5e\xa3\xb5\xef\xf6\x97\xe4\xcd\x17\x97\x14\x69\x10\x03\x0f\x82\x4b\xc1\xda\x49\x65\x4b\x2c\xfc\x86\x65\x0b\x4f\xf7\xfd\x21\x20\xcd\x1c\x3b\xd0\x2e\xf0\x6f\x66\xef\xad\x03\xbc\x3f\xb1\x2c\x87\x90\x7e\xb8\x74\x58\xc6\x43\x48\x2e\x94\xbf\x58\xf6\x43\xc8\x6b\x28\x7f\xb1\xf2\xa9\x7b\x37\x1b\xbc\x0c\x31\x53\xaa\x78\xc8\x0b\x78\x19\x62\xa6\x55\xf1\x90\x22\x78\x81\x60\xa5\x56\xf7\x3c\x46\x08\x7b\x15\xb1\x72\xac\x40\x86\xac\x9e\xc4\x7b\x97\x7b\xfe\xcf\xab\x40\x88\xb2\x7a\xe4\x7d\xa8\xae\x1d\xbe\xe4\x4a\x9a\x1b\xb1\x44\xb8\x6d\x16\x4f\x3b\xf8\x5a\xd4\x54\x52\xef\x80\x7a\xd5\x8f\xeb\x97\x77\x2f\x5c\xf4\xf8\xab\x7a\xa4\x1a\x41\xd7\x1a\xd5\x09\xf9\xc3\x54\x3a\x75\x05\x13\xe7\xe6\xbe\x9e\x9d\x70\x39\x27\xf0\xdc\xbd\x0f\x17\xda\x21\xaf\x87\x03\xc8\x38\x3a\x71\x4e\x71\xb3\xc0\x9a\x3d\xb8\x42\x71\xe3\xf9\x09\x33\xf1\xc5\x6b\x8b\x3f\xae\x2a\x1c\x94\x74\x12\x90\x08\xfb\x7e\x23\x43\xe7\xae\x61\x0d\x00\x48\x00\x3a\xea\xcf\xb0\xca\xee\xfc\x28\x9b\x35\x18\x92\xfa\xc1\x94\x3e\x4c\x31\x68\xca\x6d\xce\x78\x85\xd0\x1f\xf1\xd9\x31\x3c\xb3\xa2\xf9\x57\x1c\x20\x5b\xe8\x94\x75\xfb\xcb\xfd\x27\x5b\x0e\x85\x3d\x67\x37\x21\x0c\xff\xd3\xcc\xd1\x4d\x49\xc9\x79\xe9\x64\x6d\x3d\x87\x7d\x77\xac\xe0\xe0\xfb\x17\xa3\x38\x80\x14\xfe\x4f\x4e\xb6\x82\xa5\xcd\x3b\xc6\x34\xbf\xed\x4a\x56\xd4\x72\x59\x15\x19\xdd\xa2\x76\x72\x6a\xe5\x08\x9b\x6f\x61\xdb\x62\x5c\x77\x48\x15\x0e\x20\x4b\xe8\xe9\x96\x9f\x8d\x3a\xde\xe2\xa3\x32\x53\xd5\x21\x1e\xed\x74\xfe\x06\x91\x97\xda\x16\xbb\xa2\xc1\x91\x9b\x4c\x19\x03\xb9\x2f\xf6\x53\x76\x09\xfc\x9b\x17\xf7\x78\x3f\xdc\x48\x58\x8e\xdc\x8b\x77\x10\x82\xe9\x4b\x3c\x64\x1c\x8a\x6f\x4c\x77\xc2\xd4\x24\x24\x15\x58\x2e\xdd\x4b\x57\xc0\xed\x8a\xe5\xd5\xbd\x0c\x20\x14\x8a\x58\x8e\x85\x90\x25\xc2\x15\xf0\x7f\x0d\x17\xea\xa6\x0a\xb9\x92\xfd\xad\x61\x67\x64\xcc\x1e\xb9\xe7\x90\x54\xdd\x0e\xfc\x6a\x29\x73\x2c\xec\xa4\x70\xeb\xfe\xbb\x62\xb9\x5c\x0d\x40\x76\xa7\x72\x7b\x27\xea\x38\x6a\xfd\xa8\xad\xa4\xe4\xc3\x75\x3e\x4d\x1f\xf0\xf5\x10\x2d\xb1\xe1\xbc\xda\xc2\x74\x89\xe0\x65\x96\x1e\x71\xee\x59\xa7\xf9\xa3\x95\xd3\x16\x00\x20\x8d\xe8\x1c\xb9\x86\xd6\x1d\x51\xa6\xde\xbe\xe0\x5b\x4c\xe5\xdf\x65\xfd\xce\x9a\x53\x7d\x89\x97\xf8\x60\x45\x69\x4d\x33\x48\x70\x85\x5f\x7e\x30\x0f\x20\x4b\xe8\x52\x7b\x7b\xe3\x1a\x9d\x1d\xc5\x5f\x1d\x2f\xf3\x10\xaf\xb6\xa2\x55\x25\xb5\xeb\x02\x0d\x3e\x97\x8d\x4c\x77\x54\x9f\x7c\xe9\x1d\x9d\x15\xf4\x00\x08\x0e\x7d\x87\x87\x87\x0c\x2e\x15\x1a\x4e\xbc\x9d\x97\x7b\x69\x3c\x1b\xac\x91\xd9\xf7\x8a\xe3\x7a\x94\xfa\xe1\x53\x09\x0d\xd4\x3b\x31\xa5\x95\x4f\x01\x52\x89\xa6\xb4\xfe\x64\x55\x27\x09\x58\xb6\x7c\x42\xb4\x5d\xff\x30\x90\x35\xb0\x33\xe8\x06\x3d\x50\x8f\xce\x12\x53\x1b\xa8\xe1\xe1\x2e\x75\x35\x03\xc8\x1a\x5a\xeb\x1c\xbe\x4b\x56\xa8\xb3\x40\xcf\xef\xf9\x21\xb8\xa6\x97\xd7\x22\x45\xb5\x67\xea\xe6\x9f\x2d\x31\x5e\x9f\x36\xf1\xd0\x2c\xa7\xeb\xed\x00\x20\xbf\xd0\xd9\x4b\x66\x51\xaf\xcd\xa6\x10\x05\xf3\x2b\x62\xaf\x8f\xa6\xd6\x7f\x78\x70\xca\xaa\xcf\x6b\xea\x94\x1c\x08\x30\x4e\xbe\x49\x37\x64\x77\x02\x20\xb3\x68\xa5\x56\xf4\x90\xc8\x32\x6b\xe8\xec\x69\xbe\xbf\xa6\xb4\xa2\x76\x99\x35\x6f\x78\xd8\xe9\xf4\xea\xde\xd0\x95\x71\x9f\x1a\xb4\x6b\x1a\xe2\xf6\x00\x48\x26\xda\x39\x6e\x9a\xc9\x1a\x97\x4a\x0e\x70\x51\xbc\x31\x97\x79\x56\x5d\x65\xd7\xa1\x5e\x67\xd9\x3e\xb5\x2a\xc1\x39\x9d\x5a\x51\x9e\x2d\x31\x02\x90\x4a\x74\xfc\x99\x09\xa7\x13\xb8\x55\x3c\xef\x8a\xa3\xcf\x0f\xf4\x90\xbe\xb8\x3f\x4b\xa4\x79\x25\xd0\xe7\xf4\x61\x12\x27\x42\xbf\x7b\x7f\x2c\xed\x01\xb2\x8e\x66\x3e\x57\xb4\x72\xe9\x0b\x66\x5a\xc4\x68\x2d\xbc\xfc\x4c\xa9\xe5\x8d\xd2\x46\x85\xbb\xcb\x08\x4a\x23\xb3\x4b\x09\x3c\xdb\x27\x85\xb2\x51\x43\x9b\xc9\xd4\x7a\x38\xca\x15\x72\xaf\xf4\x5c\xb5\xad\xd1\xe3\x2d\x93\x70\x9d\x0a\xe4\x49\x88\xed\x8e\x96\xb4\xf2\xa2\xb3\xc7\xfd\xc0\x01\x64\x19\x7d\xe8\xbb\x71\xea\xc3\x2a\xfc\x1f\x9d\x2c\x43\x37\x2e\x7c\xb6\x1e\x28\x4a\xcf\x95\x2d\x20\xcc\x38\xf5\xe4\xa0\xb1\x42\x80\x85\x90\x20\x02\x00\x92\x8e\x26\x49\x94\x84\x13\x08\x57\x67\x60\xa7\x90\x97\x7b\x52\x6f\x79\x0f\xf9\xba\x41\x30\x5d\xb6\x85\xd5\x69\xde\xb6\xcf\x25\x19\xd1\x1b\xaa\x00\xd9\x41\x6f\x02\x12\xbd\x1f\xd9\x0b\x9b\x0f\x48\x3f\x29\x09\xdf\xca\xfe\xb5\x5a\xc4\xd0\x73\x71\xf3\x22\xf3\xfa\xbb\x34\x03\xaf\x16\xa6\xf1\xf8\x46\xd4\xd0\x3b\x56\x24\xac\xdf\x19\xb9\x76\x2c\x8e\xd6\x28\x46\xd3\xd3\x9c\xe1\x33\x0f\x9e\x88\x65\x3b\x25\x9f\xdb\x41\x3d\xa6\x72\x63\x31\x12\x35\xf4\xcc\x8b\x4f\x42\x4f\xaf\x8a\x99\x3a\x11\x19\x78\x1d\x28\x2b\x4f\x57\x79\x35\xa7\xaf\x7f\x38\x3c\xe1\xfd\xa3\xce\x7e\x6a\x5d\x8a\xb7\xe8\xa6\x06\xcb\xef\xc6\x0f\xa2\xee\xe3\x0c\xbc\x6d\x9e\x1d\x61\x8e\x30\xc5\x49\x24\x9d\x72\xce\xd6\x3c\xa9\xf4\xb2\x29\x27\x6a\xfd\x8a\x21\x0e\x20\x0b\x68\xa6\xa2\x11\x37\x2d\xcd\xb3\x7d\x9e\xa3\x4d\xd7\x2f\x6e\x3b\xa3\xab\x65\x7f\xb6\xf1\x1b\xff\x89\xc6\xa2\xaf\x2a\xef\xc6\x05\x9a\x4d\xb5\xd0\x15\xc7\x45\x87\x0b\x93\x81\x4a\x2f\x1b\x29\x27\x1e\xd2\x57\x7c\x67\x3f\x38\xc4\xbd\xa1\x70\xd2\x4b\x45\x66\xfd\x4f\x5f\xc6\x15\xd9\x2b\xe8\xc2\x37\x0f\xf5\x9d\xef\x04\xa9\x74\x39\xb4\x89\xa9\x17\x3d\x6d\x69\x34\xce\x33\xbf\x3a\x95\xbd\x61\x15\x79\x7f\xa6\x73\xd5\xa7\x55\xd1\x03\x48\x9f\x44\x07\x9e\x5b\xe4\x41\x67\xec\xd8\x0a\x0f\xb3\x35\xec\x8f\xad\xe4\x49\x39\x72\x12\xe1\x36\x38\x78\x33\x5e\x8e\xb0\xf9\xbc\x8b\x19\xaf\x26\x90\xd6\x46\x37\xca\x25\x94\xd5\x6a\xf0\x65\x7d\x5c\xd0\x60\xfc\xcb\x7f\x22\xc4\xd5\xbf\x90\x3a\xd4\xd8\xe5\xf3\x07\xbb\xc4\x4b\x96\x9f\xaf\xb8\x14\x02\x24\x04\x7d\xd0\xbc\x8d\x5f\x24\x27\xcb\x53\xca\xd7\xbc\x3c\xae\xf3\xa2\x22\xdb\xd5\x59\xf8\xac\xe1\x25\xd5\x46\xdf\x76\x9b\x0e\x0b\x77\x42\xc1\x3e\x0f\x80\xc4\xa3\x77\x88\xab\xbf\x51\x0c\x81\x53\x75\x33\x61\x91\xe7\x1c\xff\xc3\xea\xcb\x01\xb7\x75\x04\xee\x1e\xa0\x2a\x48\xdc\x0c\x29\x3b\x51\xf8\xa4\x12\x20\xbf\xd0\x27\x47\x27\x73\x7f\x64\xf2\x9b\xcb\x71\xcd\x4a\x05\x9c\xf9\x3b\x79\xec\xa7\xdf\x8b\xdd\xde\x0a\x74\x78\x16\xec\x5f\x60\xcd\xab\xc0\xe1\x0c\x90\x29\xf4\xaf\xdf\x7b\xf4\x93\x64\x82\x58\x93\xe4\x65\x3f\x53\xf9\xd6\x18\x13\xad\x79\x90\x73\x80\x8d\xd0\xdf\xc7\xb1\xd2\xc2\x03\x46\x4f\x4b\x3d\x01\x40\xd2\xd0\x97\xd6\xa5\xc5\x16\x82\x7d\xde\x8f\xbb\xd2\x1f\x96\xf0\xf6\x56\x9b\x1d\x73\xd2\x08\x75\x4c\xea\x0e\x8b\x90\x3e\x9b\xbe\xfd\xe4\x07\xd5\x27\x80\x54\xa0\x43\xf2\x68\x45\xa4\xad\xbf\xfd\xfc\x91\x75\xd6\xeb\x1f\xb5\x3e\xae\x11\x89\x3a\xe7\xf2\xfe\xbd\x94\xc2\xfb\x69\x76\x7e\x3d\x73\xd0\xcf\x1a\x1d\x2e\xb3\xa9\xdc\x9c\x55\xac\x9a\x13\x67\xbf\x86\x8a\x3b\xb9\x37\x38\x6e\xb1\x2a\xff\x5e\x79\xf1\xb2\xbd\x3a\xf3\xf9\x89\xb3\xa7\x1a\xd0\x79\x1c\x09\x29\xb6\x9a\x9e\x21\x29\xde\x85\x24\x96\x11\xf7\xe4\xaf\xb2\x62\x66\x2b\x9e\x79\x33\xe7\xa2\x93\x7d\x1f\xd5\x1a\xc4\x5d\x47\x0d\x15\xd3\x55\x54\xb5\xb5\xa9\xad\xa2\x26\xdc\x5f\xfc\x97\xaf\xc4\x04\xd8\x9c\x38\xf6\x3d\x8d\x7d\x65\x88\xed\xb5\xa6\x87\x52\xf6\x53\x1c\x90\x3e\x86\x26\xa6\xb3\xdf\xee\xd5\x5b\xdd\x3b\x26\x9c\x73\x25\x5a\xe9\xc1\x5d\xba\xc8\x2b\xc3\xae\x3e\xf1\xd7\x2c\x23\x38\x7b\xf8\xf6\x37\x79\x36\xa3\xf7\x94\x27\x79\x35\xe5\xc3\xae\x6b\xfa\x42\x12\x3b\x31\x39\x4c\x7f\x5d\x63\xca\x7d\x1e\xa7\x31\x0f\x31\x31\x31\x34\x88\xb9\xfd\xbc\x8b\x1a\xca\x37\xfc\xe9\x74\x5b\xc6\x48\x04\xa3\xd9\x1c\xc7\x52\x92\xe6\x8e\x0c\xa2\xe6\xe7\x12\xce\x23\x94\xde\x58\x57\xa8\xd5\xcb\x31\xe3\x01\x90\x32\x74\xf5\x17\x2c\x7e\xf9\xed\xa2\x65\xe2\xa1\xab\x9a\xcf\xf1\x64\xc0\x21\x8f\x66\x92\xb2\x61\xcb\x25\xbd\xbd\x8a\x2a\xe4\x4c\x12\xb1\xfc\x5d\x80\xd4\xa1\x2f\xbf\xb3\x38\xb7\x77\x0a\x65\xce\x6b\xe6\xe7\xbc\x9f\xbc\x3d\x9b\xed\xed\x95\x22\xff\x78\x11\x47\xed\xc0\x5e\x64\x2d\x66\xf7\x99\x55\x15\x20\xbd\x68\x1e\x33\x50\xb3\xe0\xd9\x77\x9f\x79\xe0\x9a\x59\xe8\x89\x90\xf2\x90\x2e\x25\xea\xb9\xdb\x5f\x7b\x16\xd7\xb2\x19\x71\x83\x4f\x1f\x8d\x74\x01\x80\x78\xa0\xdb\x9e\xb2\x6f\x3f\xb5\x5f\x9d\x2b\xa4\x20\x98\x46\x68\xaa\xc6\x9e\xff\x3d\xed\x1d\x3c\xca\x3f\xdb\x4a\xee\xa1\xb8\x18\xf4\xee\xcf\xe4\x06\x40\x9a\xd1\xfb\xbb\xb9\x42\x8e\xc8\x55\xe0\xd2\x45\x60\x29\xc6\x9d\x43\x2c\xfe\x58\xcf\xd7\x86\xcd\x9d\x6a\x44\xc5\xed\x47\x49\xf5\xfb\xec\x67\xe8\x9e\x04\xf9\xde\x55\xda\xc2\x13\xba\x94\x3b\x05\x91\xdf\x0a\x2f\x0a\x7f\xad\x1c\xa7\xa4\x17\xe0\xcc\x9b\x1f\x8f\x96\x71\xe4\x38\x79\x42\x1e\x00\x24\x0a\x6d\x79\xf7\x64\x81\xdd\x61\x3d\x5d\xc1\xde\xe9\xa0\x96\x52\xc3\x80\xa5\x77\xeb\x3a\x77\xd3\x2c\x09\x3b\x8b\xd4\x39\x9c\x39\x6d\x82\x3a\x01\x52\x8d\xde\xdb\xca\x47\x33\xd5\x73\xcf\x8b\x27\x39\xd4\x98\xac\xb5\xe3\x1e\x31\x3d\x31\xaa\xcc\xe3\x91\x32\x34\x26\x3d\x99\x92\x53\x40\x50\xbd\x0c\x00\x52\x86\x8e\x0a\xec\xa6\xf7\x0f\x10\x8a\x56\x2d\x32\x24\x37\xe2\xc2\xe8\x4a\x3c\xce\xf1\x7b\xb0\x3d\x72\x93\x7d\xfa\x93\x3c\xbc\xe0\xaf\xfc\x14\x1f\x40\xe6\xd0\xd6\xc8\x48\xee\xcb\xcc\x95\xe2\xe9\x98\x1b\x63\x32\xf5\xf6\xf0\xb8\x64\x50\x32\x99\x7e\xfb\xb0\x5b\xe7\x99\x30\x41\x26\x46\xa1\x7e\x02\x0f\x80\x34\xa1\xa3\x88\x60\xed\x94\x72\x93\x85\x84\x42\xf1\xc3\x23\xa6\x87\x2b\x57\x99\x06\x26\x3e\x8a\xcd\xee\x3f\x9c\x1b\xd7\x3e\x92\x1b\x1c\x3d\xae\x00\x90\x6f\xe8\x55\xfd\xe1\x95\x23\xa1\x24\x2c\xae\xb9\x79\xbf\xf4\x98\x8d\xb0\x38\xd9\x00\xa5\xd5\xc2\x73\x09\xa7\x35\xa2\x2e\xe1\x06\x61\xd2\xf8\xfd\x00\x59\x45\x4f\xb6\xe9\xc2\x3c\x59\x45\xcd\x5b\xce\xdf\xad\xf4\xe6\xaa\xf4\xdf\xbd\xc8\xcf\x1e\xf1\xdc\x8e\x39\xf4\xf5\xa1\xf0\xd1\x13\x87\x55\x25\xd1\x9f\x2c\x4d\x5b\x88\xbb\x70\x21\xa4\x4f\xe9\x4f\xf8\x71\x5f\x53\x83\x9a\x5c\xeb\x0b\x37\xf2\x35\x74\x07\xda\x2b\x87\x5a\x5c\x1e\x64\xfd\xe8\xc1\xff\x85\x1c\x93\xd0\xc8\x72\xb3\x85\x12\xec\xd2\xfc\x2e\x74\xa8\x7f\x7e\x26\x46\xdc\xe7\xa0\xd6\xaf\x8b\xe3\x12\xfb\x74\xe7\x7b\x35\xdf\x24\xe7\x1f\xf0\xd2\xcd\x79\xc5\xa4\x79\x3d\x41\xd6\x69\x76\x97\xb6\x8f\xfd\x4f\x7b\x4c\xc5\x2b\xfb\x72\x1a\x17\x2a\xa5\xe5\x60\x3a\x4b\xa1\xe9\x94\xfb\x1b\x39\xde\x97\x1f\xb9\x2b\x1e\x1f\x8a\x9f\xd8\x08\x9b\x6a\xc1\x01\x24\x93\xf8\x7f\xa8\x84\xfb\xb5\x4f\x43\x4b\x2f\x12\xe9\xae\x98\xa8\xc9\xdb\x52\x7c\x53\xb3\x01\x23\xb9\xd5\xf3\xe9\x81\x85\x2c\x01\xce\x24\xbb\x62\x33\x13\x6d\x4f\x97\x2c\xf3\xb8\x69\xc4\x3b\xf3\x95\xa8\x8c\xae\xad\xfb\x88\x6b\x81\x50\xfb\xb5\xf8\xc3\xa1\xd4\x75\x4b\x7d\x4f\x57\x1f\x5f\x7c\x86\x03\xc8\x2a\x7a\xbf\xdb\xf1\x48\x68\xb9\xa8\x3b\x8f\x70\x5f\x15\x3a\x32\xe8\xa8\xea\x73\xaa\x6d\xeb\x94\xce\x76\xe5\xef\xe2\x27\x72\x2f\x9a\xc6\xac\xfd\x70\x00\x79\x89\x5e\xd7\xea\xe2\xec\xd8\x4b\x4f\x13\x99\xb6\x73\x6e\x73\x8b\x7d\x97\xd3\xda\xff\xf7\xf7\x87\x89\x3b\x56\xfe\x8f\x3a\xe5\xcd\x98\xac\x48\xf0\xaf\x66\xc1\x72\x0b\x90\x71\xff\xbf\xff\x4b\xc2\xda\x14\x96\x67\x20\x64\x0c\xd2\x63\x2c\xe7\x40\x48\x26\xa4\xc7\x58\xfe\xd9\x83\x40\xc3\xb0\x5c\x04\x21\xab\xb0\x66\x88\xe5\x25\x08\x79\x09\xd3\x30\x98\x04\x19\x0f\x69\x84\x09\x34\x2c\x92\x0c\x21\x4b\xb0\x96\x8b\xc9\x93\xf1\x10\x1c\xcc\x18\x60\x72\x65\x3c\xa4\x12\xe6\x42\x31\xf9\x32\x1e\xb2\x46\xbb\xb7\x94\x18\x94\x19\x0f\xf9\x05\xd7\x05\x8b\x36\x43\xc8\x2c\xac\x13\x60\x32\x67\xb8\xfa\xd0\x63\x98\xec\x19\x4e\x1f\x66\x3f\xb0\x18\x34\x84\xac\xd3\xc1\x2c\x25\x16\x95\x06\xb2\x6c\x04\x04\xdc\x1e\x38\x80\xc4\xa3\x29\xef\x79\x9a\x35\x1e\x21\x2a\xdd\x2f\x39\xb5\x1a\x0c\x56\x07\x03\x0e\xd3\xcb\xbe\x52\x6f\xef\x1d\x48\x70\xea\x7b\xca\x17\xa1\x79\xf1\x0f\x0e\x20\xdf\xd0\x8c\xfa\xc4\x11\x02\x8e\x3b\x79\x1c\x86\xbc\x36\x1c\xdb\x66\x40\x8a\x3f\x32\x5b\x38\xd0\x7b\xf4\x8a\x92\x26\xe9\xc9\xc9\xbb\xe7\x46\xce\x02\x80\xe4\xa2\xa3\x44\xce\xd8\x9d\x26\x3d\xe5\xc1\xb3\x5d\xf4\x9a\xac\x2b\x8d\xcf\x12\xce\x0a\x3c\x97\x61\xba\x73\xde\x6f\x2c\xcb\xf6\x8a\x8f\x55\x0a\x1d\x40\x96\xd0\x0c\xa8\xff\x52\xd5\x64\xc4\xed\x03\x67\x89\xfa\xca\x7f\xb0\xb2\x11\x56\x4f\x1d\x4b\xa4\x4c\x18\x3c\xfb\xe1\x6b\x83\xe4\xf9\xaf\x2e\x2b\xf8\x37\x81\x61\x59\x0d\x1d\x14\x0f\x77\x21\xa6\xe1\x78\xc8\x37\x98\x72\xc4\xb4\x1d\x0f\xc9\x85\x2b\x87\x65\xff\xde\x89\x82\x89\x00\x4c\x4d\x83\x87\x2c\xc3\x74\x03\xa6\xac\xc1\x43\xd2\xe1\x5c\xb0\xa4\x0d\x84\xec\xec\x5b\x69\x24\xfa\x37\x8d\xb3\xbb\xa5\x82\x3d\x76\x23\x5a\x30\x7a\x8b\x5c\xdd\xf8\x36\x69\xf5\xf4\xca\x49\x46\x37\x9e\xa9\xe2\xc0\x05\xe3\x4f\x54\x27\xbf\x9e\x8a\x1e\x33\xd8\xc9\xf9\x3a\xf6\x66\xfb\x30\x25\x0e\x20\xd9\x68\xfe\xf6\xb9\xfa\x8e\x1c\xf3\x8b\xe1\x17\xca\x73\xf7\x4a\x89\x44\xaf\xd5\xb8\xdc\x50\xab\x1a\x0e\x74\xc9\x3a\x36\xc7\x56\x91\x69\xe7\x70\x7e\x77\xea\x68\xd1\xf3\x20\xe9\x71\xad\x19\xfd\x7b\x11\xf6\xa6\x23\x7d\x16\xc9\xba\x43\xd4\x85\xbd\x1d\x7c\x04\xfa\xe7\x5a\x7e\x39\xfb\xab\xf1\x2f\xa9\xe0\x00\xb2\x81\x8e\x68\x16\xee\x2e\x97\x35\xbe\xdb\x6c\x94\xfa\x66\x27\x9e\x9a\x13\xdb\x6f\x63\x77\xd5\x79\x39\x95\x8b\x28\x58\x73\xb5\x4a\x35\x3d\xb1\x14\x07\xa4\x79\x50\xc3\x3d\x2e\xde\x2b\xb4\xf1\xda\xef\x13\x67\x70\x92\x2f\xcc\x93\xcf\x72\x4e\xfb\xb9\x7f\xd6\x59\xef\x16\xb7\xf7\x54\x4d\xac\xe2\x54\xee\x38\x80\xf8\xa3\xa9\xc4\x68\xe4\xc6\x8c\xeb\xf3\x21\x4a\x8a\x67\xca\x17\x8f\xaa\xf1\xb7\x7b\xfc\xce\x26\x52\xfb\x19\xe7\x51\xc4\x84\x3b\xea\x38\xff\xac\x42\xe0\xdf\xbc\x02\x17\x20\x18\xae\x19\x96\x63\x20\x24\x1b\x16\x5e\xb0\x7c\xb3\xb7\x99\x60\x0e\x18\xcb\x3d\x10\xb2\x41\x85\xff\xd3\x2c\x96\x8b\xf0\x10\x69\x1e\xfc\x43\xb0\x9c\x04\x1f\xe2\xbf\xf7\x2e\x29\x2c\xdd\x0c\x64\xaa\xd8\x48\x3c\x71\x00\x09\x41\xbf\x4b\xea\xf6\x2c\xf9\xa5\xa9\xa3\x85\x23\xb7\xf6\xdf\x8a\x7a\x84\x7c\x61\x19\x5d\x30\x3a\x42\x11\x5e\x2c\xa9\x93\x2e\x30\xc3\x68\x25\x45\x85\x03\x48\x04\xba\x13\xf7\xb0\xc5\xd5\x9e\xf0\x4b\xe5\x99\x6e\x3f\xcb\xaf\x93\xaa\x37\x73\x3d\xeb\x12\x7e\xfe\x93\xac\xf4\x51\xf0\x92\xe7\xf3\x89\x4f\xd1\xf1\x38\x80\x44\xa3\x09\x3b\x19\xfd\x69\xdd\x6f\xc2\xad\xb7\xbc\x0b\x18\x7e\xd5\xd3\xcf\x7f\x9e\xa2\xb9\x3e\xf2\x5e\xb1\xfc\x2a\xb5\xae\xc6\xfd\x4b\x86\xd9\xea\x38\x80\xb4\xa2\x77\x1f\x5d\x9e\xa1\x4e\xb2\x98\xf8\xe1\x0b\xfb\x4b\x32\xc3\x2f\xc7\xd1\xb9\xfc\xb1\xce\x94\x78\xf6\xc4\xc9\x9a\xeb\x4d\xa9\xa5\xf1\x58\x88\xc0\xbf\x99\x0d\x1d\x14\x02\xff\x06\x88\x65\x39\x84\x44\xc0\x84\x37\x96\xf1\x10\x12\x0d\x43\x31\x96\xfd\x10\xd2\x4a\xb5\xb2\x45\xf4\x6f\x69\x0c\x20\x7b\x95\x60\x9f\xb4\xcf\xee\x66\x47\xbb\x36\xe8\xc0\x0d\xb7\x18\xee\xf8\x4a\xed\x33\x6f\xeb\x99\xde\x54\xfe\xd6\x14\xb4\x30\x4f\x2b\x0f\x0b\xa9\x08\x6c\x2e\x15\x3a\xbf\x28\xb7\x4b\x77\xd0\xd4\x96\x88\x9f\xb3\x78\xb0\x50\x5d\xde\x38\xb1\x68\xac\x85\x5c\x7e\x8c\x45\x71\xbf\x85\xc2\xf9\xb7\x5c\xe1\x75\x1f\xbe\xfc\xfa\xfc\x3c\x0e\x07\x90\x2f\xe8\xa5\xbe\x70\x90\xf6\xdb\xb2\x4e\xa6\xe7\x9c\xbf\x1b\xf5\xc5\xa5\x5b\x44\x16\xec\x5e\x2b\x47\xc0\xbd\x6b\xb2\x65\x25\x02\xb2\x2f\x03\xa3\x71\x00\xf9\x81\x1e\xef\x74\x22\xc2\x83\x2d\x47\x95\xe1\xae\xfa\xed\x8d\x28\xc1\xab\xce\x2f\x6e\x78\xae\x3a\x93\xba\xb7\xae\x1d\xe4\x4a\x8d\xbb\xde\xa6\x8a\x03\xc8\x34\x5a\xed\x93\x85\x6d\x0f\x27\x50\x2d\x9f\x22\xcf\x55\x37\xaa\xe0\xa9\x8e\x9e\x65\x65\x32\x69\x5e\x25\xfb\xf2\xc8\x58\xb0\x58\xf7\xe2\x21\x72\x1c\x40\x36\xd1\x59\x41\x82\x98\xc3\xcc\x4a\x11\xca\x33\x43\x0b\x99\x8b\x0c\x0f\x4e\x97\x24\x13\xbe\xb7\xf7\x52\x93\xce\xbf\x1a\xe7\xae\xc1\x9c\x4e\x93\x8c\x03\x48\x1e\x7a\x6b\x27\x7f\xb9\xe5\xc4\xb6\xef\xbd\x52\x3f\xcd\x8e\xc1\xb5\x9d\xc6\x18\x5a\x4e\x46\x17\x4e\x47\xb3\xd3\xf2\xde\x07\xff\x1e\xee\x9c\xb4\x15\xf8\x37\x37\xee\xdd\x34\x70\x91\xb1\x3c\xb9\x47\x37\x21\x0f\xc6\x72\x26\x84\x7c\x81\xbb\x0f\xcb\x9f\x10\xf2\x63\x6f\xc3\x62\xb8\x14\x42\xa6\x21\xa9\xc5\xf2\x2a\x84\x6c\x42\xee\x88\xe5\x58\x08\xc9\x83\x87\x0f\x2b\xf3\x06\x21\x0b\xe4\xf0\x42\xc3\x4a\xc1\x01\x59\x22\x69\x82\xff\x3e\xf7\xe9\xf5\x3f\x29\x02\x3f\xd2\x4a\xf9\xaa\xdb\xc3\x13\xd7\x3d\xc8\xc6\x7a\x00\x83\xad\xe1\x50\xf7\x74\x97\xde\xea\x58\x27\x1d\xa5\x31\x41\xd0\xfa\x2e\x0d\x46\xb7\xa8\x09\x48\x48\x67\x46\xba\x12\xdf\x5a\x18\x9d\x3f\xb1\xf1\x85\x5f\x98\x3d\x60\xf8\xef\x7c\x70\x6c\xe3\x3e\xb3\xd2\x3b\x35\x83\x47\xef\xe3\x00\x12\x87\x56\x64\xba\x12\xd9\x5a\x7d\xd6\xbc\xb5\xab\xb9\xf2\xf1\xaf\x67\x13\x5d\xbd\xb7\xa2\x39\xc9\xaf\xc6\x0e\xad\x1d\x9e\x0c\x6b\xbf\x47\xdc\x80\x03\xd2\xec\xa8\xe1\x75\x94\x39\x93\x59\x3a\x4a\x7a\x93\xca\x23\x61\xb7\x1c\x65\x58\xa9\x8e\x9d\xed\xcf\xa1\x79\x47\xf6\x30\xfe\x95\xc1\x63\x43\x92\x46\x81\x7f\xb3\x1a\x3a\xc8\x0b\xee\x42\x2c\xc3\xf7\x58\x3f\xec\x4d\xc0\xb2\x1d\x42\xe2\xe8\xf0\xc1\x0b\xcb\x7e\x18\xbc\xd8\x57\x5e\x11\xff\x5b\x42\x14\xc8\x92\x90\x12\xfa\xee\xde\x67\x03\xe8\x3a\xef\xfc\x9b\x6b\x9b\xcd\x0f\xaa\x96\xae\xb1\x57\x6f\xdd\x95\x9e\xcd\x10\x73\x8f\x13\x7d\x9e\xfb\x81\x3a\xba\x79\x48\x46\x54\x26\xc6\x74\x97\xa0\xa1\xef\xb3\x07\x92\x3e\x71\xcd\xdd\xe6\x27\x7f\x13\x29\x87\x8d\x28\x18\x4c\xf0\x64\xff\x61\x33\xa3\x75\x23\xdd\x56\x10\x50\xc8\xf9\xbc\xd9\x85\x03\x88\x0f\x3a\x79\x79\x84\x73\x92\xee\xd3\xb7\x02\xdc\x6a\xfe\x4e\x57\x92\x01\x4b\xf3\x4e\x7d\x6c\x9e\x62\x93\xc1\x0f\x92\xb3\x81\x79\x8f\xb9\x72\x56\x00\x40\x02\xd1\x1b\xa9\xdb\x3b\x6d\x38\xf5\x66\xe3\x12\xc3\x93\x9e\xc9\xf1\x34\xd7\xc7\xd2\x95\xb6\x59\xaf\x1d\x78\xbc\x54\x03\x3f\xa7\xcf\xf4\xf2\xaa\x01\x64\x11\xcd\xe3\x2e\xa5\x7e\xe8\xc9\xa4\x5c\x48\xf6\x1f\xd3\x14\x4d\x62\x59\x7f\x25\xdf\x8f\xc4\x9f\xb3\x19\x0e\xe0\xe9\xcd\xbb\x3e\xc9\x40\xf4\x1a\x07\x90\x7e\xf4\x74\x49\x3a\x02\x7f\x27\x70\xb9\x51\xc4\xfe\x79\xa0\x92\xdc\x67\xb3\xba\xd9\x68\xe0\x5d\xc6\xa5\x09\x26\xd5\x8d\x35\x66\x5e\x68\xee\x5e\x67\x1d\xe8\xc8\x18\xf6\xfd\xbe\x8f\x68\xf3\x7a\x4a\xb2\x69\x65\x7b\xf6\x81\x23\xf5\x2d\xb2\x53\x43\xb3\x97\x99\x36\xbe\x88\xb0\xa4\x71\x2d\x5d\xd9\xc4\x01\xa4\x16\x6d\x4f\x41\xfd\x7a\xb5\xa7\x0b\x75\xae\xe1\xf5\x5a\xdd\x3a\x96\xb1\xa0\xa5\x55\x37\x09\xb3\xf0\x87\x0b\x2a\x1b\xdd\xdf\x3c\x24\x2e\xc7\x0b\xfc\x9b\xd7\xe1\x96\x18\x80\x05\x6a\x2c\xc7\xef\xf1\x69\x78\xfd\x61\xfa\x1e\x0f\xf1\x81\xda\x11\xd3\xfd\x78\x48\x20\x3c\x11\x58\x4b\x00\x21\x8b\x7b\x44\x1f\x63\x15\x20\xa4\x1f\x4e\x1f\x6b\x21\x20\xa4\x03\x4a\x67\xac\xb5\x80\x90\x5a\xf8\xa1\x59\xcc\x32\x01\xfe\xdc\x9d\xc4\x23\x30\x4b\x05\x78\x84\x36\x6c\xe8\xc6\xa8\x16\xec\xb1\x28\xe8\x62\xcc\x82\x01\x94\x92\x50\x7e\x61\x16\x0d\x60\xaa\x01\xae\x3d\x66\xe1\x00\x0f\x99\x82\x4f\xc1\xac\x1d\xe0\x21\x69\x30\xf4\x61\xd5\x0f\x20\xa4\x82\x12\xf6\xc8\x60\x15\x12\x80\x2c\x19\x05\xc1\x7f\x6f\xd9\xea\x46\x73\x91\xc4\x93\xa4\x2a\x86\xd1\x42\x11\xc8\x61\x2f\x1d\x52\x1f\xba\xbf\xe9\xa3\x6b\xfb\xfb\x2a\x06\x28\x5b\x2c\x13\x0f\xb8\x2b\x84\xec\xd2\xec\x62\xb4\xc8\x2b\x7d\xcf\x41\x7f\x28\x80\x7b\x56\xd9\x48\xe1\xdb\x6f\xf2\x83\x5c\x25\xf3\xda\x05\xb5\x6b\xc6\xe3\xd6\x14\x9e\x85\x82\x2a\xc6\x6a\x38\x80\xf8\xa1\xb9\x51\x9e\xa1\x41\xd9\x89\x6f\xe9\x03\x44\x49\x26\xe3\x8c\x2b\xd6\xd5\xda\xce\xa9\x87\x3e\x35\xd3\x91\x7b\x39\x46\xe0\xe2\x24\xb7\xb2\x77\xa5\x02\x3a\x8f\xa1\x60\x45\x7a\xda\xe2\xf0\xb1\xdc\x57\x54\x97\xcb\xed\xb9\x26\x4f\x08\x35\x13\x25\xd4\x76\x0e\xf6\x2c\x3c\x1f\x4d\x76\xa4\xcd\xc2\x7f\x84\x1a\xcb\x6c\xe8\xa1\x6e\x18\xe9\xb1\x2c\x87\x90\x62\xa8\xc2\xb0\x8c\x87\x10\x3f\x48\x41\xb0\xec\xdf\x13\x48\xfb\x20\x9f\xc0\x2a\xec\x00\xd9\x43\x24\x04\xff\xf5\x01\xff\x45\xd3\x5a\xa3\xf3\x5f\x09\xa7\xc7\x70\x62\x9d\x3d\xee\xb6\x66\xab\x17\x97\x28\x78\xdf\xcc\x0f\xc4\x0b\x14\xb0\xd0\x9f\x7b\xaa\x72\x55\xa6\x1d\x07\x90\x2c\x34\xad\x8d\xd1\x8a\xbd\x49\xf5\xb0\xf5\x7c\x86\x67\x0a\xeb\xec\x29\xa5\x30\x59\xdc\xb7\x45\x73\xfb\xf8\xec\xa0\xe5\xc9\x20\x39\xfd\x05\x5f\x00\x90\x44\x74\x0e\x47\xc7\x82\xf9\x67\x9d\x40\x52\x49\x32\x45\xd7\xe1\xeb\xea\x8f\xd7\xd8\xbf\x96\xf5\xec\x94\x56\x16\x37\x33\x89\xb3\xb7\xce\x45\x71\x00\xa4\x10\xbd\x72\xed\xfe\x8b\xb5\xca\x26\xdb\xa9\xba\x17\x91\xfc\xb0\xcf\x4b\x16\xdb\xc9\xf9\x91\x8a\x99\xe5\xc5\x0d\x59\x23\x47\xbd\x13\xe8\x97\x05\xfe\xcd\x6a\xe8\xa0\xbf\x90\x3c\x62\x1a\x8e\x87\x64\xc1\x13\x84\x69\x3b\x1e\x92\x08\xf3\x37\x58\xf6\x43\x48\xe1\x3e\xf8\xba\x59\xac\x3a\x1b\x90\x95\x22\xf0\xbd\xe3\x8d\x03\xc8\x12\xda\x55\x02\x94\x1e\xd9\xe4\xe1\xb9\x4c\x0b\x9a\xc9\x31\x23\x2a\x13\xc6\x09\xb2\x37\x6d\x08\x99\x57\x9b\x53\x9b\xc3\xc8\x8e\x75\x6a\xc9\xe3\x00\xf2\x0e\xdd\xb2\xb3\xd9\x30\xbf\x43\x7a\x40\x92\xe4\xf8\xc5\x33\x4f\x7f\x32\x32\x99\x59\x12\x58\xb1\x6a\x05\x7e\xd7\x5f\x18\xe7\xcf\x6a\x6e\xbf\xb3\x1b\x91\x73\xd1\x84\x22\xf8\x9c\xe5\xa5\x22\x25\xee\xc4\x9f\x8a\xd9\x1e\xbc\x6e\xca\xc7\x6f\xc6\xdc\x5c\xe8\x0f\xaa\x93\x19\x3d\xc2\x78\xf0\x76\x67\xe9\x41\x1c\x40\xbc\xd1\x87\x74\xee\xed\xf0\xad\xaf\x7d\xaf\xb9\x43\x1d\xbe\x0d\xf8\xa6\xea\x39\x5e\xfb\x61\xd9\x14\xda\x3e\xf6\x08\x48\x8c\x85\x2c\xd8\x6c\x59\xe3\x00\x92\x82\xde\x79\xb3\xaf\x28\xf7\x1f\x23\xf8\xb2\xe9\x18\x1d\xf9\xeb\x15\xf9\x05\xa1\x1b\x2c\x41\x95\xe7\xa3\xd4\xe3\xef\x79\xf3\xa8\xfa\xc4\x8a\xed\x0a\xaa\x49\x34\x93\xfd\xaa\xa4\xef\xe2\x6a\xac\x12\x11\xf7\x29\x50\xbc\x98\xf3\x5a\xe2\x60\x36\x69\x50\xba\xd2\xda\xb1\x01\x02\xa2\x19\xbb\x8b\x29\xa6\x02\xff\xe6\x96\xbd\xa4\x1b\xcc\x06\x62\x79\x06\x42\xde\xc1\xee\x1b\x2c\xe7\xec\x65\x03\xe1\xad\x8f\xe5\x1f\x08\xf1\x86\xf7\x00\x96\x8b\x20\x24\x05\x6e\x73\x2c\x2f\x41\xc8\xe4\x41\x7c\x64\xc5\x2a\xdc\xc2\xc8\x7a\x0c\xc6\x09\xac\x02\x2e\x90\x75\x27\x40\xfe\x7b\x4f\xcf\x0b\xb4\xb8\x20\x27\x8f\x6d\xfa\x05\xae\xdf\x14\x61\xce\xb4\x9b\x0e\x08\x9b\x16\xd5\x92\xa0\xad\x60\x3d\xa3\x39\xe6\xee\x45\x1b\x9c\x0f\x5a\x71\x00\x59\x45\x5f\x1e\xbc\xe6\xe4\xdc\x7a\x45\xeb\x1c\x8b\xc2\x55\x5b\x8c\x43\xb1\x6a\x8f\x03\x32\x38\x3d\xd8\xa3\xba\x5c\x5a\xec\xae\xe7\x9e\x5f\x7e\x88\x03\xc8\x36\x9a\x33\x97\x9c\x74\x50\x3a\x85\x74\xc7\xd4\x10\x2c\x68\xdf\x69\x13\x7f\x2e\xf1\xcc\xf1\x70\xf5\x65\xd5\xb9\xf0\xe6\x26\x25\x7e\x59\x89\xdd\xcb\xaf\x02\x9d\x3c\xb4\xd6\x1f\x49\xf3\xcd\x9c\x8c\xfd\xa4\x7c\x2e\xd5\x56\x20\xad\x49\x2d\x93\x45\xf3\x49\x00\x7f\x93\x35\xe1\xea\xa5\xf7\x7c\x6f\x1e\x0b\xfc\x9b\xd9\xd0\xa7\x2f\xf6\xbe\xb0\x8b\x61\xf9\x5e\x95\x07\x5e\x1d\x58\xc6\x43\xc8\x36\xe4\x9d\x58\xf6\xef\x85\xf8\x3d\xdd\x89\x55\x50\x07\xb2\x84\x84\x44\xff\x7d\x19\x20\x05\xcd\xe7\x0b\x7e\xc8\x21\x1c\xd4\xcb\x47\xfe\xfc\xb0\x5d\x66\x77\x1f\x28\xc2\x71\xb7\x04\x32\x3c\xbb\x74\xfe\xc9\xe8\x61\xdf\xa7\x55\x21\x6a\x00\x69\x43\xab\x0b\xb9\xe8\xb7\xe7\x92\x8f\x31\x08\xab\xbf\xdc\x27\xa9\x64\xb1\xf0\x84\x30\x85\xce\xfc\x97\xda\xeb\xe4\xbb\xfc\xe3\xee\xac\x5c\x1b\x61\x38\x80\x54\xa1\xe9\xfc\x0b\xb1\x0e\x23\x59\xad\xab\x0b\x2d\x3c\x47\xfc\x14\xba\xa5\x26\x89\x0f\xd1\x96\xfb\x2a\x17\x4d\x0a\xf3\x1a\x32\x9b\x3a\x67\x65\xe1\x00\xf2\x11\xcd\x20\x4c\x52\x36\x0a\xf2\xcf\x54\x26\xd9\xb7\x3d\xec\x75\xb9\x3d\x47\x1d\x6f\x11\x74\x9a\xd2\xbf\x90\x78\xa3\xb1\xe6\x71\xc7\x1d\x8d\x6c\x81\x7f\xb4\x1a\x1e\x20\xc8\x7f\xb1\x2c\x87\x90\x36\xc8\x1a\xb1\x8c\x87\x90\x2a\x48\xcc\xb1\xec\x87\x90\x8f\x90\x47\x60\x76\x36\xe0\x21\x65\x10\x82\xd9\xdd\x80\x87\xd4\xc1\x02\x15\x66\x87\x03\x1e\xd2\x0b\xeb\xa6\x98\x4d\x0e\x78\x88\x07\xac\x68\x62\x35\x3a\x40\x48\x33\x05\xfc\x9f\x13\x66\xc7\x83\x0c\xb7\x3b\xcd\xee\x95\x33\x8f\xbe\x72\x8e\x0e\x66\x52\xdd\x8c\xbc\x2e\x79\xe3\x53\xd4\xd1\xec\x3b\x8d\xc6\x27\xef\x5e\x0c\xd1\x36\xb5\xb7\xd0\x67\x20\xfe\xf8\x3b\x7f\xb9\x13\x07\x90\x61\x74\x89\xca\xf0\x14\xfb\x0e\x13\xdf\x45\x53\xc2\x60\xaa\x70\xc3\x33\xd6\xe3\x2a\xe2\x3f\xbe\x72\xff\x4d\xab\xb0\xef\x50\x12\xf0\xcd\xb1\x24\xc4\x01\x24\xec\x7f\x3a\x13\xee\x81\x7d\x04\x91\x6d\x2b\x67\x44\x28\x0b\x24\x38\x1c\x99\x6c\x42\x29\x4f\xc5\x78\x14\x49\xa6\x3c\xb6\x4d\x1e\x89\x9c\xda\xc0\x01\x69\x74\xd0\xfb\xea\x14\xfb\x30\xc3\x92\x30\xd0\x54\xcd\x39\xf6\x2c\x8f\xcc\xc7\xf4\xda\xd4\x8c\xf6\xa7\xe7\x4e\x5c\x0d\x17\x7c\xcc\x6b\xfc\xa8\x4e\xe0\xdf\xac\x86\xfe\x99\x87\x37\x0e\x96\xe1\x10\x32\x0c\xeb\x53\x58\xb6\x43\x48\x18\xcc\x97\x60\xd9\x0f\x63\x05\x0c\x48\x98\x8d\x27\xf8\x87\x44\xc1\x0d\x85\xd9\x7c\x82\x87\x54\x43\x7d\x84\xd9\x7f\x02\x0f\x07\x9c\x3d\x56\x0f\x0a\x84\xcc\x41\xc3\x30\xdb\x50\xf0\x90\x26\xb8\x2c\x98\xad\x28\xb0\xd2\x08\x8f\x20\x56\x3b\xca\x5e\xec\x20\x84\x01\x19\xab\x2f\x05\xc8\xaa\x12\xb0\xfd\x77\x3a\x96\xd0\xc2\xad\xdf\xfb\xda\x88\x45\x7c\x80\xe1\xc9\x16\xb2\xa3\x1f\xbd\xe2\x49\x1e\xcd\x0f\x18\x3e\x2c\x1f\x1b\xf9\xd8\x59\x21\x41\x74\x22\xe7\x18\x0e\x20\xed\xe8\xf1\xcf\xc5\xf2\x6c\x6f\xd0\xcc\x0c\x74\x0a\x0e\x50\x19\x74\xdd\x57\x4a\x3a\x51\xb5\x2a\xce\x9a\x98\xc6\xad\xca\xcf\x99\x67\xd1\xa2\xb8\x7b\x61\xa1\x4f\xc7\x77\xa5\x35\x0e\x46\xc2\x6c\x81\x58\xc3\x70\xe2\xd3\x74\x7f\xe9\x16\x79\xe2\x0d\x9a\xa7\x46\xe5\xcd\x5c\x7f\x37\x4c\xce\x73\x0f\xed\x12\x61\x74\x40\x76\xa5\x3a\xb4\xa2\x13\xe4\x22\x16\x67\x38\x2a\x49\xfb\x9a\x58\x28\x1d\xe8\x30\x7a\x88\x72\x0d\x0b\x27\xb1\xca\xad\xea\xa7\xe2\xfb\x41\xb0\xcc\xde\xe3\x78\x50\xb8\x61\x59\x0e\x21\xed\x10\x82\x65\xfc\xde\x1d\x0d\x57\x1b\xcb\xfe\x3d\xfa\x4f\xbe\x32\xfc\x7f\x5f\x6e\xf5\x4d\x33\xd3\x67\xf0\x3f\xc6\x1f\x23\xcf\xca\x55\x90\xf2\xec\x89\x81\xdf\x96\x8d\xc6\xfa\x9b\x92\xf2\x4f\xba\xe1\x1a\xe0\x99\x39\x90\xdd\xd9\xd9\xd9\x89\x62\xc3\x01\x24\x00\x4d\x76\x8e\x9e\x30\xd8\xbc\x9e\x35\x12\x31\x7a\xbc\x86\x4c\x27\x7f\xc5\xdf\xff\x77\x76\xdc\x4e\xb2\xea\xc5\xde\x38\xbd\xd8\x98\x81\xf8\x27\x00\x20\x5f\xd1\x21\x73\xe3\x34\xd3\xd1\xa3\xb1\xb2\xe6\x19\x24\xcb\xbe\x05\x41\x64\x42\x46\x92\xda\x32\x7a\xca\x0f\x2a\x56\x3d\x7e\x16\x08\x8b\xb5\x76\x00\xe4\x0f\x7a\x29\x28\x04\xbd\x7f\x6a\xdf\xbf\x63\xf5\x8a\x74\xbc\x5b\xd9\xf8\x38\xf2\xda\xfe\xbb\x85\xfe\x31\x37\xf0\xe2\x2c\xb9\x0e\xbd\x9e\xb6\x94\x07\x40\xa2\xd1\xf4\xbf\xf2\x31\xb1\xf8\xf5\xd5\x65\xc1\xd4\x80\x11\x9e\xfc\x6d\x6b\x8a\x43\xbe\x03\xbf\xb5\x9b\x75\x7c\x8f\x53\x64\x94\x0e\xa9\xca\xf1\x00\x24\xf9\x7f\xde\xeb\xba\xbf\x4b\xd7\xd8\x31\x8f\x43\x3b\x76\x55\x83\xeb\xaa\xc4\x8b\xb9\x5e\x9c\x4a\xa9\x99\x2c\xff\xf2\x66\x04\x1f\x61\x5a\xff\x5d\x80\xf4\xa3\x27\xfb\xd7\xeb\x9a\x73\xa3\xf6\x0d\xfe\xfd\x12\xae\xdf\xa2\x28\xd4\xfa\x18\xe8\xc7\xaf\x2c\x1f\x7b\x5f\xaf\x69\x6c\xbb\x63\x10\x70\x63\xce\x03\x20\xaf\xd0\xe9\x44\x92\x65\x3e\xa3\xed\x17\x5e\x93\x5a\x5a\xd6\x42\x14\x43\x31\xe6\xa9\x35\xd1\x9a\xd5\xb3\xc7\xba\x1c\xc3\xc5\x3e\x68\xfb\x49\x8a\x00\x64\xe8\x7f\x5e\x08\x49\x3c\xfc\xec\x58\x68\xc9\x92\x13\x6d\x2e\x4b\xc2\x0d\x4f\x2f\x9e\xb7\xdf\xa9\xee\xea\x7c\xd0\xf8\xf3\xe5\xa0\xd5\x3e\x77\x16\x23\x80\xcc\xa2\xa5\x08\x99\xe4\xe9\x6b\x67\xbe\x95\x6a\x73\x1a\xa7\xf0\xf6\x79\x0d\xb3\xbb\xd3\x17\x1e\x29\xb9\x60\x3f\xfb\x4e\x74\xcc\xe0\x66\x3d\xf3\x32\x7a\x9e\x8c\xaf\x49\x2f\xdb\x05\x68\x4f\x9f\x8f\x25\x1e\x8e\x6d\xd5\x6e\xd4\x20\x89\x3d\x4b\xad\x2a\x8a\x2b\x59\xb4\xb3\x73\xf3\x0e\x43\x0d\x2d\xb4\xd3\x96\x7c\x72\xc7\x3b\x23\x3d\xac\x71\x0a\xd9\x98\x12\xb1\x5c\x45\x7c\x32\x03\x13\x88\xb9\x09\x1e\xee\x9c\x67\xa2\x33\x04\x00\xf1\xfc\x9f\xcf\xeb\xed\x4f\x93\xb9\x27\x70\xe5\xb2\xf7\x72\xe5\x85\xf1\x1e\x53\x3b\x33\xc2\xa9\xa4\xec\x35\x5b\x99\x0f\x2e\x0e\x9e\x22\x9a\x73\xde\x00\x29\x46\x33\x38\xe7\xe6\x62\x89\xfe\x03\x7e\x1e\x36\x2f\xd5\x17\xdf\x0f\x15\x3d\xee\x57\x1d\x60\x01\x5a\x0f\xc5\x1c\xa6\x6f\x5d\x3e\xfe\xf1\xc8\x1f\x74\xb2\x37\x3f\x43\x5f\xf3\xea\xb7\xe4\xb8\x5e\xce\x89\xa5\x79\x12\x8a\xb9\xf0\x88\x92\x51\xcd\x85\xf9\x9f\x73\x12\xb4\x12\x4c\xcf\x6f\xa3\x29\xba\xd9\xf3\xe1\x5b\xef\x2b\x7e\xfe\x8e\xaf\x0a\x7a\xd7\x2b\xb9\x65\xa5\x30\x23\xba\x72\xd7\xd1\x5b\x94\x7a\x25\x58\x32\xda\xc8\x1e\x00\xe4\x23\xda\x0a\x41\xa7\xc7\x07\xad\x3e\x9d\xe4\x4b\xcc\x92\x18\x78\xad\xda\xf3\x8e\x2e\x59\x26\x80\xbf\x52\x8f\x35\x89\x43\xdb\x26\x39\xb2\xb8\x06\x20\x3b\xe8\x5d\xd5\xfe\x65\x2e\x74\xb6\xa6\x53\xaf\xc9\x88\xba\x4b\xf8\x3c\x43\xa1\xe1\xb2\x49\x5e\xa2\x95\x05\x0b\x93\x16\xbb\x8e\x16\x6e\xf5\x2b\x0e\x20\x5e\xe8\x85\x6c\x70\x29\x21\xb1\xfb\x99\xdf\x43\xb8\xf0\xb6\xd3\x63\xe0\xba\xd1\x80\x7a\x34\x9d\xe8\x18\xef\xd7\xfa\x13\x7e\x92\x46\xfb\x17\x5e\xa1\xdb\xa5\x49\x9e\xc4\x99\x4d\x66\x2d\xcf\x6c\xb5\x56\x33\x90\x2a\x31\x58\x14\x9b\x7b\x3e\xd3\xc8\x8b\xf2\xd5\xb9\xd6\xf4\x30\xdb\x22\x0b\x35\xd4\x85\xbd\x8f\xb3\xbb\x7c\xd3\x82\x67\x81\x83\xef\xd0\x6c\xd9\x2f\xbf\x72\xb2\xeb\x8d\x57\xc3\xe8\x35\x13\x07\xce\xd9\xd0\x35\x05\x03\x20\x2d\x85\x1a\x5e\xd4\xf5\x39\xea\xbc\x2f\xae\xc2\xeb\xc2\xcd\x83\x14\xf1\xf7\x4b\x8e\x36\x6f\xac\x0f\x3c\x27\xcb\x55\x23\x3f\xa0\x4e\x18\x2f\xd8\x0c\x90\xbf\xe8\x9e\x81\xf9\x9b\xc2\xa6\x83\x66\x5c\xc1\x2e\xa0\xb5\x19\x90\xf8\xbf\xbd\xa1\xb0\x21\x7d\xa3\xb6\x82\x7b\xa5\xd0\x2d\x55\x20\xc9\x8d\x1b\x35\x14\x37\xd1\xeb\xe1\xc3\x54\x13\x75\xaf\x60\xb5\xa6\x62\x35\xb4\xf3\xcf\x41\x7b\xcb\xe9\xec\x6b\xd4\x07\x48\x7a\xc6\x1e\x5e\xf3\xe7\xf3\x00\xc8\x0f\x74\x3f\x9e\xaa\xb7\x8d\xd8\xd3\x90\xb5\xb5\xef\x36\x1d\x9d\xaf\x5d\x52\x9f\x6e\xa5\x9c\xfc\x73\x21\x99\x85\x9b\x37\x3f\x47\xf4\xba\x73\xf4\x3a\x40\xa6\xd1\xa7\x8c\x6b\xd0\xc9\xc8\x97\x47\xd3\x91\x6e\x8a\x20\xb4\xc2\xf4\xbd\x92\x47\xe1\x10\x57\x7b\x6f\x17\x47\x24\x52\xf0\xf3\xc0\x84\x85\x24\x40\x16\xd1\xd1\x60\x42\xd4\xef\xe0\x56\xee\xe2\x27\x2b\xd6\xcc\xb0\x5c\xb2\x57\x6d\xce\xe4\x4c\x93\xee\xa9\x5e\x07\x12\xaf\xca\xf1\x2e\x1b\x85\x71\xe3\x00\xd2\x8f\xce\x28\x08\x84\x4f\x3e\x32\xcd\x1f\x93\xc8\x7e\x2e\x7d\xf9\xdd\xc3\x51\x91\x71\xee\xe2\x9a\xb9\x53\x59\x2d\xa9\x4b\xaf\xa8\xd7\xae\x0c\x29\x79\x00\x69\x15\xd4\x70\xcf\xb7\xe6\x1e\x9d\x9e\x56\x41\x6d\xcb\xd3\x87\x0d\x29\x1e\x24\x2a\x95\x20\xef\x12\x94\xd9\x3a\xaa\xb6\x9c\xec\x52\xef\x97\x1e\x01\x48\x3d\xfa\xd7\x15\xf2\x36\x95\xa6\xc4\x3e\x53\xf2\x1e\x63\x92\xb7\x7e\xa9\x77\xf9\x8f\xff\xc4\x35\x45\x13\xb5\xdc\xe5\xe9\xc8\x68\x89\x09\x32\x2d\x80\xcc\xa0\x37\xe2\x03\x9e\x3b\xf1\xc7\xc6\xf7\x1d\x9b\xd0\x9d\xfb\x59\x95\x48\x4f\xec\xc9\xe0\xcd\x90\xad\x50\xad\x2c\xfa\xe6\x67\x65\xca\x7b\xf9\x43\x00\x20\x63\xe8\xc9\x36\x9a\xb5\x74\xb5\x9e\xa6\x74\x48\x74\x9f\x95\x95\x89\x21\x9f\xfb\x6c\xf6\xf6\xb4\xf3\x43\x95\x57\x35\xc4\xdb\x5d\x4d\xf7\xa5\x8a\x01\xb2\x81\xde\xb8\xbf\xd3\x6a\xc5\x86\xee\x91\xe3\x5e\xf1\x98\x9e\x3e\xce\x7e\xf5\x68\x7c\x92\xce\xe9\xa9\x87\x42\xd3\x39\x62\x94\xa3\x6a\xf9\xee\x73\x38\x80\xbc\x43\xff\xfc\x39\xf1\x4b\xe2\x5a\x65\xef\x6e\x64\x6e\x30\xf5\x86\x7c\x3b\xa6\xf4\xf1\xe8\x96\xc5\xd3\xb8\x1d\xc5\x32\xc6\x0f\x33\x01\xa3\x02\x6b\x1e\x00\x89\x40\x47\xd6\x07\x0e\x72\xb1\xb1\x3b\x5c\xdd\xaf\xdf\x2f\x46\x3a\x6b\x24\x1a\x93\x6d\x97\x94\xf4\x15\x7b\x31\x11\xf7\xc4\x09\xc5\xbe\xe0\x3a\x0c\x90\x28\xf4\x1e\x7b\xbc\xbd\x26\xe8\xb6\x19\x1c\xbb\x24\x55\x1e\xc7\xfe\xfe\x64\xd5\x90\xa9\x7b\x09\xdb\xf6\x8f\x50\x82\x7a\xa9\x1c\x12\xe2\x93\xbf\x01\x52\x84\xb6\xe6\x10\xeb\xcc\x24\xdd\x4f\x83\x13\xc2\xd7\x4e\x18\x0f\xdb\x25\xcc\x4c\xf0\x6d\x54\x08\x5e\x65\xdf\xdc\xfe\xf6\xd6\x67\x8b\x6f\xe0\x22\xba\x07\xcc\xc6\xe1\x88\xae\x6f\x6f\x5c\x57\xb9\x6b\x6b\xaa\xd0\x54\x71\x62\xbd\xa4\xed\xa3\x4a\x7a\xaf\xad\x9b\xc0\xe9\xcc\x9b\x63\x4f\x01\x40\x82\xd0\x5b\xf2\x74\x28\x69\xdd\x48\x0a\xd3\x46\x1c\x31\x7f\xf1\x6c\x95\x6c\xbf\xea\x88\x4a\xae\xd4\x6c\x46\x79\x7c\x68\xe7\x5f\xb7\x14\xab\x54\x80\xe4\xa0\x2f\x39\x87\x7e\xea\xc9\x5e\xda\x6c\x45\x3a\x4f\x9b\xa1\xf2\xb9\x8f\xd1\x2c\x7f\xf7\xdd\x2d\xbf\x92\x93\xf2\x6e\x6d\xb6\xde\x38\x42\x38\x05\x00\x24\x11\x7d\xf1\xbf\x32\xd3\x31\x61\xa7\x77\xcd\xf2\x53\xd7\xd1\x35\x20\xf1\xa6\x35\xfc\xeb\xd7\x7b\xe1\xf6\xa5\xee\x14\x4a\x9f\xbc\xa7\x94\xbc\x4a\x00\x59\x43\x5b\x43\xc8\x61\xab\xfc\x5d\x72\xad\xe1\x7d\xd4\x6c\x3a\xc9\xc5\x76\x86\x0d\x43\x6b\x97\xde\x33\x64\x26\xe9\x6d\x41\xa1\xe6\x95\x91\x00\x00\x24\x12\x7d\xf3\xdb\xb6\x12\x11\x38\xb6\x28\xed\x6f\xdb\xa9\x64\x9a\x96\xf9\x58\x28\x14\xa8\x50\x5c\xe6\x2e\x3b\x8c\x2b\x0d\xb8\x72\xa5\xa7\xf9\x37\x40\x86\xd1\xd6\x1c\xad\xaf\xa6\xef\x66\x69\x7e\x30\x1e\x80\x38\xd8\x1f\x2b\x6c\x0e\x93\xd7\x31\x6d\x99\x88\x49\xb2\x88\x47\x2c\x1b\x6e\xc9\x9c\xdc\xb5\x1e\xbd\x6b\xbe\x7c\x4b\x8a\xaf\x01\x27\x09\xc9\xfc\xda\x0f\x1c\x93\x34\x4f\x26\x15\xdf\x0a\x8e\x30\x98\x54\x37\x1b\x29\x9d\x23\x20\x7c\xf8\x07\x20\xc9\xe8\x3d\x7c\xe8\xf3\xa5\xf5\x37\x56\x69\x0b\x01\xc4\x53\x06\x9c\x8b\x33\xf1\x9e\x4b\x04\xde\x05\x1b\xfa\x3f\x69\x84\x89\x0d\xfd\xcf\x9d\x74\x46\x0d\x0d\xf8\x84\xc8\x36\x4b\x26\x4a\x0a\x6d\xf3\x25\xc7\x7f\x4b\xea\xdd\xb8\x15\xd7\x79\xc4\xac\xf0\x86\x6f\xd7\x6b\x7b\x11\xa2\xdb\x1c\x00\x20\xe9\x68\x1d\x94\x12\x43\xa9\xd7\x32\x70\x68\xff\xf1\x78\x97\x6f\xae\x45\xdc\x7e\x0e\xe2\x37\x8b\x3c\x02\xf2\xea\x89\xa4\x62\x36\x92\xa4\x79\x92\x00\x52\x80\xd6\xfb\x46\xc2\xaf\x6d\x56\x5d\x24\x34\x8e\xd9\x9b\x37\x5d\x68\x38\x3b\x5f\x1f\xa3\x78\xa1\x66\x69\xf4\xc4\x24\xfd\xda\xb0\xa2\x4e\x57\x2c\x00\x48\x3c\x5a\xef\x33\x96\xf8\x33\x3d\x5a\xcf\xaf\x4a\x30\x96\x1e\xbb\x14\x6e\x69\xde\xf6\xae\x38\xd2\x31\x6e\xf0\xc2\x47\x0d\x95\xc4\x5f\x16\xf9\xd9\x00\xc9\x40\xfb\x45\x8a\xfd\xca\x94\x72\xff\xff\x63\xec\xbb\xe3\xb9\xfc\xde\xff\xad\x92\x51\x66\x89\x86\x91\x94\x06\x4a\x44\x65\xdd\x34\x54\x46\x12\x85\x48\x14\x2a\x8a\x6c\x8a\xd7\xb1\x47\xf6\x5e\x59\x89\x64\x64\x64\x67\x95\x15\x21\x2b\x15\xd9\x19\x59\x21\x9b\xdf\xc3\xfb\xf7\xed\xdc\xe7\xf3\xd7\xdd\xff\xf7\xd3\x7d\x5d\xd7\x39\xe7\xba\x9e\xd7\xf3\x3a\xaf\x5b\x81\xf4\x4e\x96\x13\x14\x27\xec\x9c\x92\x72\x84\xee\x6a\xfb\x6a\x54\x04\x0a\x39\x5b\xcb\xeb\x2f\xef\x7f\xef\x04\x30\x2f\x34\x17\xcc\xa9\x47\x4d\x48\xb5\x9e\x3b\xc7\xb9\xef\x4f\xda\xcc\xdb\xe5\xbe\x70\x65\xdd\x3f\x55\xaa\x5d\xbd\xc2\xda\x4c\xce\xee\xe2\x4e\xd6\x00\x7b\x89\x6e\x77\x7e\xa1\x71\xc7\x6d\xf7\xd8\xab\xbe\x9f\x89\x62\x51\xe4\xba\x96\x5f\xc2\xf5\xde\xeb\xb3\xea\xe9\xad\x8a\x07\xbe\x51\x5f\x51\xb1\xce\x07\xd8\x12\xca\x5d\x26\x5c\xb0\x73\x76\x82\xf4\xae\x25\x69\x24\x07\xf5\x38\xdf\x77\xb7\xbe\xcf\x2d\xaa\xe7\x9a\x09\xdf\xf0\xfe\x58\xa0\x79\x5d\xb3\x08\x00\x2c\x10\xfd\xf3\x1e\x2d\x83\xdb\x5f\x66\xac\x9b\x69\xaa\xde\xe6\xe9\x6b\xa6\xcf\x75\x66\x48\x5d\x0a\x17\x50\xa8\x3c\xa6\x35\xf1\x5d\xe0\x9c\xd2\x47\x80\x55\xa2\xb7\xd7\x0f\x2a\x34\x90\xdb\x14\xc8\x5d\xa2\x61\x2e\x8e\xd7\xa4\x1e\xf4\x54\x2e\x14\x6a\x57\xf9\x40\xe5\xb4\xab\x74\x35\xb3\x2e\x9f\x16\xfd\xba\x67\xbd\x58\xb5\x7e\x87\x47\xb2\xf3\x30\xfb\x13\x5e\xec\xd8\x0c\xcf\x56\xc5\xf1\xda\xd2\x4f\xf7\x2f\x3c\xb1\x79\x42\x73\xde\x1f\xcb\x10\xfe\x47\xaa\x28\x47\x4e\xf6\x7f\xbf\x2f\xa4\xfc\x23\xfc\x8f\x74\x11\x62\x6a\xa9\xff\x62\x88\x38\x23\x8e\x99\xa1\xf9\x8b\x21\xe4\x8d\x10\x13\xce\xfc\x17\x43\x48\x1e\x21\x26\x7e\xcb\x5f\x0c\x11\x83\xc4\x31\xdd\x30\x06\x84\x2c\x12\x62\x5e\x6f\xfb\x8b\x21\xa4\x92\x10\xd3\x4b\xf7\x17\x43\xc4\x27\x71\xcc\xf8\xd6\x3f\xa9\x94\xff\xc6\x2c\x81\x9c\xf4\x09\x32\x65\x57\x12\xc0\x92\xd1\xcd\x58\x9c\xbb\x79\x6a\xca\x85\xde\x7d\x49\x4f\xdb\x45\xdc\x2d\xb8\x64\x89\xd2\x22\xe0\x68\xd0\x41\xe3\x72\x3d\xa6\xc2\x0f\xec\x5d\x9e\x1b\x75\x0f\xcd\x90\xd2\xba\x5f\xb8\x4b\x79\x8f\xb0\xc7\x37\x4f\x7d\x50\x2b\x60\xde\xa1\x9e\xf3\xae\xd9\x97\x26\xee\xfe\x57\x36\xf3\x8a\xf1\x9d\x63\xf9\x00\x9b\x44\xe7\x43\xd9\x98\xa6\xae\xeb\xf8\x70\x56\x77\x81\x8f\xc9\x84\xca\x0c\x9d\xca\xda\x07\xcb\xcd\x8a\xda\xd2\xe7\x96\x0d\x84\x68\xc4\xb6\x8e\x91\x00\xd6\x84\xd6\xb1\x93\x11\x62\x0e\xda\x73\x32\x82\x7e\xf1\xd5\xbe\xbb\x9f\x3f\xba\x91\x9f\x5d\xef\x98\x70\xb2\x53\xff\x60\x97\xe1\xb2\xcb\x54\x52\x26\x00\x98\x2b\x6a\x8e\xd0\xd8\xcf\x57\xe1\xf4\xc1\x19\x2b\xe3\x91\x71\x6b\x9e\x1f\x68\xb6\xdf\x88\x56\xdb\xa9\x99\x37\x72\xaa\xd1\x27\xf2\xe8\x67\xe3\x00\x80\xc5\xa1\x8f\x9f\xea\xd3\x92\x56\x16\xd0\xb4\x31\x26\x7d\x64\x4e\xa3\xb1\xe7\xad\xeb\xa8\x8b\x52\x37\xfc\x42\xfd\xf6\xea\x29\x09\x35\x13\x32\x1f\x12\xc0\x12\xd1\x3a\x99\x77\x7a\xaf\x79\x82\x00\x4f\xc9\x91\x90\xd9\x02\xdb\x6d\xda\x51\xe4\xaf\x87\x67\xd4\x43\xd8\x1e\xec\xfa\xd3\xb3\xdd\x58\xdb\x77\x8a\x04\xb0\x76\xf4\xef\x17\xef\xb2\x61\x4c\x67\x51\x6c\x1d\x79\xb3\x95\x9e\x5a\x90\xc2\x2a\x8b\x47\xe4\x5a\x03\x5f\xf7\xf7\xc7\xbd\xfa\x6b\x52\x9e\x75\x6c\xc2\xff\x18\x74\xb8\xc0\xc9\x0c\x7f\x37\x05\x61\xe0\x21\x66\x90\xe2\x2f\x86\x28\xfa\x38\x66\x92\xf1\x2f\x86\x70\x05\x20\xa6\x89\xe5\x2f\x86\x70\x15\x20\xc6\x15\xda\x46\xb4\x14\x38\x26\x0e\x62\x88\x96\x03\xc7\x24\x92\xff\xc5\x10\x2d\x09\x8e\x69\xa7\x80\xb7\x9b\x09\x7b\x2f\x39\x56\x66\x32\x47\x17\x12\xc0\x92\xd0\xe5\xb7\xe7\x03\xfd\xc1\xcb\x6c\x9f\x8a\x52\x95\xa6\x74\xc5\xf9\x3f\x99\x32\xb6\x69\x84\xaf\xdc\x88\x72\xf8\xf0\xd4\xcb\xf7\x6c\xec\x0e\x12\xc0\xbc\xd0\xc3\x67\xcf\x60\xd5\x76\x65\x27\x9b\xdf\x31\x6e\x29\x96\xa6\x2c\x3d\x06\x85\xdb\xcb\x71\xe7\xc4\xbd\x2f\xcb\x3c\x6e\xde\x6d\xba\x47\xa0\x9b\x04\xb0\x09\xb4\x14\xe8\x49\x05\x44\x66\x5c\x25\xf7\x38\xc8\xb3\x3b\x75\xde\xda\xe9\x03\x2d\xf5\x72\xf6\x75\xb7\x44\xe3\x7c\x45\x11\x9a\x82\xf5\x87\x57\x48\x00\x9b\x43\x7b\xfc\x46\x32\xef\x89\x10\xda\x3a\xb2\xf3\x72\xcc\xa1\xbb\x9f\x0e\x0f\x1e\x70\xda\x44\x5f\x6c\x4b\xc6\x75\x67\x69\xa0\xd3\x20\x4a\x6a\x1e\x00\x0c\xa0\x75\x32\xeb\xd6\x71\xe9\xf6\x3f\xe3\x3a\x02\xe3\x77\x9d\x29\x25\xc2\x52\x4f\xfe\x7c\xac\xe4\x9c\xf6\x30\xb1\xa3\x5c\x42\xfe\xf8\x3e\x3e\x66\x80\x0d\xa3\x3f\x37\xea\xa8\x28\xdc\xc5\x70\xa0\xd9\xc8\x9e\xdf\xd6\x60\xe9\x06\xb5\x87\x5b\x53\xa0\xce\x5b\xf6\xd0\x91\x67\xbd\x5b\x6e\x9a\x7d\x49\x63\x11\xfe\xb7\xa8\xe0\x2b\x90\x04\x57\x9a\x28\x32\x38\xc6\x0b\x9e\x10\xa2\xe8\xe0\x98\x09\xaa\xbf\x18\xc2\x08\x41\xcc\x1c\x2c\x6b\x84\x51\x82\x18\x40\xff\x17\x43\x14\x2a\x1c\x33\xbc\xfd\x2f\x86\xb0\xa1\x87\x18\xe7\x1d\x7f\x31\x44\x5d\x3d\x8e\xc9\x65\x85\x33\x20\xa2\xfe\x1e\xc8\xca\x31\x72\x39\x93\x00\xf6\x1e\x1d\x38\x1f\xcc\xd9\x75\xb4\xf5\xf0\x7e\xd3\x2f\x35\xd6\xd1\x9b\xce\xa4\x77\xb3\xdc\x7a\x41\x97\xc6\x6d\x65\xe5\xea\xaf\xc4\x71\x42\x39\xbd\x9d\x04\xb0\xcf\xe8\xe1\xf8\x15\xf3\x43\xf2\xe2\xd9\xb5\xd8\x3b\xbb\x3b\x3b\x97\x1f\xb4\x4c\xcd\xc9\xcf\x57\xe6\x6f\x62\x0b\xff\xd8\x56\xbd\x4d\xa9\x44\xc4\x94\x04\xb0\x45\xb4\x74\x88\x30\xd6\x33\xe4\x67\x16\x9e\xba\x7d\xc1\x7f\x8a\x6d\x5e\x84\x21\x22\x48\xeb\xbe\x93\xe7\xf3\x31\xd9\x2c\x36\x23\x57\xa9\xd2\xaf\x1b\x19\x08\xa5\xa8\x47\xb7\x55\x1e\x26\xdb\xe5\xc2\xe1\xb9\xf8\xf5\xcb\xb1\x32\x09\x43\x16\xb7\x67\xc1\x86\x7d\x9f\xcd\x86\xbb\xf2\x0f\x34\x4f\x04\x3c\x17\xfe\x37\xb3\xf1\x08\xbd\xdf\xf4\x37\xaa\x44\xa6\xe3\x98\xcf\x70\x07\x13\x99\x8f\x63\x16\x61\xee\x25\x72\x01\xc9\xbd\x9b\xe1\x77\x91\x09\x25\x17\x39\x69\x32\xca\x9d\x1b\xb9\x2a\x14\x0d\x97\x7d\x46\xa6\x0f\x93\x3d\x87\x60\xf8\x85\x3d\x86\x4b\xa3\xb2\x26\x1f\x44\xa4\x2a\x77\x76\x4a\x77\x67\xcb\xfb\x6e\x4e\xa9\xd6\xc9\x25\x01\xac\x1e\xed\x5d\x58\x8d\x9e\xea\x5e\x6c\xb0\xa6\xbc\x55\x59\x65\x4c\xea\x5c\xe5\xc9\xe1\x7e\x5a\x2d\x31\x41\xde\x5f\x93\xf0\xa6\xe7\x80\x30\xfd\x4d\x12\xc0\xa6\x50\xe9\xc5\x6c\xa9\x24\xf0\x90\xb9\xfe\x96\x5d\x16\xec\xa9\x7a\x1c\x6e\xaf\x0c\x04\xcf\xcc\x3c\x7e\x4e\x57\x38\x72\xfa\x1c\xcf\x7e\x2f\x1b\x77\x12\xc0\xde\xa2\xad\xd4\x8c\xa8\xa6\x78\x8d\x9d\xea\xfb\x6d\x67\x3a\xef\xdf\x68\x95\x49\xda\xb6\x79\x14\x90\x82\xbc\x7a\xe3\x7f\x3e\x1b\x1e\x12\x3b\x9e\x40\x02\x58\x35\xda\x32\x58\x25\xf5\xf0\x9c\x8c\xdd\x3d\xa1\xae\x9d\x59\x7a\x34\xe6\x89\x54\x5d\xaa\x0c\xc3\xcf\x4d\xaa\x0c\x1f\xcb\xe5\x58\xae\x2a\x2c\xb7\x0b\xff\x9b\x9b\x78\x48\x43\x37\xff\x5d\x06\x22\x57\x71\x4c\x3d\xe4\x79\x44\xee\xe2\x98\x29\xc8\xf3\x88\x5c\xc6\x31\x6f\xb7\xfe\xc5\x10\xb9\x8d\x63\xaa\x99\xfe\x62\x08\x45\x36\x88\x29\x67\xfd\x8b\x21\x52\xda\x70\xcc\x3a\xe4\xe1\x44\x6a\x1b\x8e\x71\xc1\xbf\xa0\x45\xa4\xbb\x6d\x80\xb6\x38\x3a\x01\x80\xe5\xa3\xa5\xcd\xa9\xed\x34\x4d\x8a\x2a\x6d\x40\xef\x6b\x89\x50\xd7\x4f\xfd\x3d\xc6\xc5\xa2\x63\xa4\xc5\xe4\x2e\xfd\xec\xa5\x4c\x7f\xa3\xad\x77\x00\xb6\x82\x4a\x59\xc2\x45\x0f\x47\x0c\x52\x5e\x46\xfb\xeb\xe4\x15\xcb\xde\x2e\x4a\xa1\xa0\x97\xdd\x13\x71\xf6\x39\x85\x4b\x3d\xf7\xb5\xd5\x4c\xd5\xeb\x1b\x9c\xfd\x7f\x3e\x26\x61\x2b\xd3\xd5\xaa\x90\x4c\xc5\xf8\xe4\x25\xb7\xca\x3b\xfb\xa3\xf6\xef\xf5\xaa\x49\x7c\x46\x7b\x2c\x3a\xa8\x34\x46\xec\x6b\xbc\x49\x00\xab\x40\x2b\x39\x35\xe5\xb7\xf4\xa0\xc1\xf2\xc1\xc6\x9c\xb1\x86\x4b\x52\xae\x29\x9f\x3b\x7f\xd1\x56\x30\x47\xb5\x57\x45\x6f\xfb\x80\x09\xfe\x1a\x16\xfe\x47\xab\x61\x84\xf2\x61\xb9\x21\x32\x1d\xc7\xac\xc0\x4e\x85\xc8\x7c\xa4\x53\x81\x44\x89\xc8\x05\x1c\x53\xc1\x00\x57\x8f\x50\x0a\x95\x75\xe4\xa2\xdd\x28\x1d\x3f\x51\x1e\xf3\xe8\x66\xa2\x60\x58\x99\xa4\x59\x57\xbf\xfa\xc9\xd2\x0f\xf2\x06\x6f\xf5\x2b\x52\xf2\xa2\xbc\x04\x79\x9a\xee\xe4\xd8\xcc\x69\xef\x25\x01\x2c\x06\x2d\x35\x0f\x6c\x65\x03\x4f\x37\x50\xb2\xe4\xf1\xb4\xdc\x2a\x51\x4f\xcf\xa3\xe0\xa5\x2c\x8a\xbc\xe8\xda\xee\x40\xce\xef\x56\x18\xfa\xda\x97\x04\xb0\x51\xb4\x8b\xb8\x76\x6e\xea\xae\xf7\xc1\xe1\xd3\x3f\x0a\xc8\xbd\x75\xc5\x07\x7e\xce\xcc\xec\xec\xeb\xfa\xbe\x69\xf1\xed\xad\xed\x42\x60\x4f\x9d\x20\x09\x60\x85\xe8\x6a\xcf\x3d\x20\x9f\x5f\x38\x7e\x46\x23\x79\x7d\x5b\xd9\xa1\x07\x0d\x85\xb1\xe7\xb4\xba\x63\x12\x4b\xb5\x15\x1f\xef\xfb\xf5\x56\xe7\x7c\xa7\xf0\xbf\x99\x8d\x47\xe8\x27\x24\x18\x44\xa6\xe3\x98\x18\x58\x6e\x88\xcc\xc7\x31\xa3\x90\x82\x13\xb9\x80\x63\x0a\xe1\x94\x94\x50\x98\xfe\x8b\x91\x91\xfe\xfb\x1a\x22\x71\x1a\xa9\x6a\xf8\x8f\xb5\x88\x64\x6a\x20\x2b\xcd\xc8\xb3\xb1\x49\x16\x50\x76\xa9\xac\xb1\x7f\x5b\x9a\x30\x85\x07\x57\xbe\x34\x53\xfa\x87\x19\x96\xf4\xaa\xc9\xc7\x8c\xaf\xc9\xa2\x39\xf5\x7e\xbb\x9c\xd0\x90\x30\x21\x01\x2c\x1d\x2d\x50\xb2\xa1\x75\xfa\xd7\xee\xff\x4a\x2a\x9d\x3d\x2c\x90\xbf\xc5\x55\xef\xf9\xba\x1f\xd5\x6e\x0f\xcd\x93\xa3\x8e\xcf\x6b\xc4\x3c\xb8\xbb\x48\x00\x1b\x41\x0b\xa0\xea\xdc\xbe\xc6\x1b\x1d\xbe\xb7\x5d\xd7\x8d\xf9\x59\xbf\xfc\xd8\xfe\xde\x79\x77\x66\x52\x89\x40\x6b\x50\x2d\xab\xce\x3e\x23\xba\x8d\x02\x18\x8d\x4a\x8f\xcf\x19\x34\x8f\xdf\x1b\xf9\x7e\x55\xfd\x01\x45\xdc\x3b\xbb\x37\x25\xf7\xb4\x73\xc5\x36\x4f\xad\x3c\x50\xe3\x7e\xfb\x29\xe3\x48\xde\x80\xf0\xbf\x99\x8d\x47\x68\x01\x32\x3d\x22\xd3\x71\x4c\x3a\x2c\x38\x44\xe6\xe3\x98\x11\x58\xd8\x88\x5c\xc0\x31\xd1\x90\x51\x12\xce\x0c\x20\xa6\x13\x72\x1f\xc2\xc1\x01\xc4\x8c\xc1\x94\x45\x34\x3d\xc0\x31\xbf\x21\xe3\x27\x9a\x20\x20\x22\x0e\xbc\x77\x47\x38\x46\x80\x9b\x5e\xe9\xef\x6b\x08\x47\x09\xf0\x35\x75\x90\xf0\x13\xce\x13\x20\xe6\x17\xac\xb9\x84\x33\x05\xbc\xc5\x87\x21\x20\x1a\x2c\xe0\x98\x65\x58\xa7\x89\x86\x0b\x48\xae\x80\xef\x21\x1c\x30\x40\x4c\x30\xcc\x49\x84\x53\x06\x88\x09\x83\x55\x88\x68\xd4\x80\x63\x72\x18\xe0\x5d\x20\xc2\xa1\x83\x9c\x34\xd9\xe6\xff\x2e\xb1\x79\xa0\xc2\xed\x6f\xe3\x96\xf2\x8a\x99\x9b\xa6\x9f\x95\xfd\xab\xeb\x4e\xb3\xdf\x64\x57\xbc\xd6\x1d\x99\x64\x2d\x73\x61\xf7\x38\x0f\x17\xef\xf6\x7e\x80\x75\xa0\x0c\xf5\x62\xc3\x65\x99\xd3\x6b\xce\xd2\x86\x71\x03\xeb\x46\x9a\x94\x16\x96\x92\x39\x8f\x03\x06\x6e\x0c\x5f\x1b\xdf\xd4\xc4\x53\xf3\xc2\x8c\x04\x64\xd0\xfe\xe5\xfa\xa4\xdf\xe8\xb5\x97\x2a\x47\xf7\xa4\x1b\x35\xea\x07\x89\x2e\x89\x3c\xe6\xf6\xcd\xde\x59\x5a\xed\x7c\x51\x5c\x35\x94\xe5\x42\x01\x09\x60\xbe\xa8\xa8\xfd\xed\x42\x1a\xcd\x1f\xd6\xc5\x48\x6b\xb9\xea\x07\xa1\xda\x8f\xaf\xa4\x5d\x39\x58\xbb\xaa\xca\xea\xc9\x71\xee\xb9\x58\xa3\x97\x6d\xb6\xf0\x3f\x1a\x0d\x03\xe4\x01\xc5\x4e\x22\xcb\x71\x4c\x07\xfc\xf5\x14\x91\xf9\xf8\x39\x81\xed\x0b\x91\x07\xf8\x6b\x7c\xe1\x5e\x24\x9c\xff\xe0\x18\x98\x5e\x08\x87\x40\x10\x93\x0a\xd3\x18\xe1\x20\x08\x62\x9e\xc3\x14\x4b\x38\x0d\xc2\x53\x39\xb4\x8d\x70\x22\x84\xf7\x1b\x90\xd3\x13\x8e\x85\x20\xa6\x0f\xda\x46\x38\x1a\xc2\xfd\x81\xb1\x26\x9a\x0f\x21\x3a\x39\x2b\xbc\x4a\x44\x38\x29\x92\xe3\x22\x73\x64\xdd\xa8\xde\xe9\xdb\xff\xe7\xe2\xdc\x30\xab\x83\xf6\xd2\xa7\x9a\x30\xe9\xe7\x43\x3f\x0c\x15\x9c\x0e\xbd\xbf\x5e\xa3\x51\x39\xbf\x7c\xa2\xe7\xf9\x45\x37\xf3\x75\x12\xc0\x72\xd1\x76\xce\xb0\x61\xb7\x62\x4d\xde\x55\xf1\x87\x6d\xd5\x2c\x3b\xb7\xdb\xe4\x06\xb9\xa8\x88\xe6\xcc\x7e\x3c\xb3\xeb\x67\x1c\x23\x4b\x24\x6f\x25\x09\x60\xd3\xe8\xe9\xaa\x3f\xff\x80\xe7\xe7\x8a\x01\xd7\xd7\x93\xb2\xdf\xd5\x06\x40\x94\x02\x9f\x41\x3f\x65\xa0\xf2\xd4\x4e\x52\xc6\x9c\xcf\xab\xd5\x4c\x12\xc0\x96\xd0\xbf\x2f\xe3\xb3\xfd\x5a\x72\x5d\x40\x9f\xb0\x70\x56\xaf\x82\xcd\xcf\x0f\x0c\xf2\xe5\xa5\x9d\xe2\xdb\x1f\x48\xf0\x33\xd7\xbc\x19\xfd\xc0\x21\xfc\x6f\x66\x23\x95\x18\x56\x6f\x22\xd3\x11\xcd\x05\xb6\x64\x44\xe6\xe3\x98\x69\x78\xbc\x88\x5c\xc0\x31\x4b\xf0\x3d\x84\x73\x3b\x5c\x7b\x83\x2c\x81\x70\x78\x07\x31\x59\xb4\x7f\x31\x84\x03\x3c\x9c\x59\x40\xdb\x88\xa6\x78\x38\xe6\x25\xdc\xc2\x84\x93\x3c\x5c\x17\x84\xa5\x98\x70\x9c\x87\xbf\x07\x96\x3b\xc2\x99\x1e\x1e\x6b\x98\x65\x09\xe7\x7a\x10\x13\x08\xdf\x43\x34\xdc\xc3\x31\x95\x54\xf0\x4b\xf1\x44\x63\x3e\x20\x27\x4d\xce\xf8\xdf\xd7\x0f\x2a\xd1\x1e\xd8\x6b\xe6\xd0\x2a\xc6\x21\x76\xc2\x5e\xea\x2c\xb5\x6f\xc8\xe9\x0f\x3a\x47\xfa\x14\x25\x78\x6f\x37\x39\x9f\xac\x16\x0f\x89\x13\x35\x01\x00\x0b\x41\x5b\x6c\xf1\x95\xe5\xcb\x5b\xd7\xa9\x17\x27\xe6\xca\x7b\x55\xba\x5a\xda\xed\xc3\xa4\x56\x23\x6a\x5c\xae\x27\x72\x0d\x1c\xd0\x51\x4b\xd9\x04\xb0\x9f\x68\x79\x0c\x3f\x9c\xb8\x7d\x8e\xeb\x26\xa7\xef\xdd\x68\x1a\xb3\xa2\x87\xd6\x72\x01\x3f\xed\x42\x23\xa8\x12\x19\x7a\x42\xd9\xf6\xfe\x0e\x48\x27\x01\xac\x15\x35\x87\x8e\xba\x20\x36\x53\xe0\x28\xb8\x34\xbc\x6b\x44\x82\xc2\x71\x5b\xf0\xf3\x3a\xae\xed\x25\xb7\x7e\xb0\xb6\x87\xa8\x06\x33\x2a\x06\x6d\x98\x8f\x4e\xb7\x9f\x5d\x6a\xf0\xf2\xf9\x2a\x63\x4e\x71\xd5\xdb\x3e\xf7\xa7\x5a\xf4\xd3\xc8\x7e\xcd\xa4\x1b\x9d\x54\x97\xba\x17\x77\x5b\x85\xa4\xbb\x0a\xff\xa3\x97\x78\x44\x21\xf7\x24\xf4\x14\x62\x42\x60\x5b\x4e\xe4\x2e\xd2\x0c\xc2\x44\x4f\xe4\x32\x8e\x69\x85\xb6\x11\xb9\x8d\xf8\xc3\xfa\xc7\x97\xe5\xff\x83\x32\xfc\xe8\x53\x8c\xb7\x84\x26\xe6\x0f\x2b\xd4\xde\xaa\x31\x7e\xf8\x16\x3c\xb0\xb7\xae\x73\x7e\x19\xfb\x80\x55\x4b\x57\x6d\x6f\xed\x7f\x97\x08\x7f\x84\x71\x3a\x01\xac\x06\x65\x44\xa1\xea\x29\x0c\x01\xc1\x8f\xf8\x9a\x8f\xce\xfa\x61\x07\x5b\x33\xd2\x3d\x4b\x95\xc8\x12\x22\xc4\xee\x26\xec\xcc\xc9\xaf\xe6\xf5\x05\xd8\x34\x3a\xe6\x97\x39\xbf\x38\x65\x5d\x19\xcc\x78\x71\xbb\x6e\x0a\xe3\xb1\xbd\x2d\x0e\xc5\x7b\x19\x04\x18\xa8\x35\x86\xb7\xdd\xad\x9c\xbf\x79\x50\x13\x60\xeb\xe8\x78\x41\xf4\x6c\x6e\xe8\x23\x06\xc3\x01\xcc\xc3\x34\x44\x71\xf9\x32\x4d\x6b\x2a\x67\xe8\x9a\xcc\x87\x0b\x45\xbf\x0e\x7e\xca\xfe\xc6\xfb\x6b\x23\x43\xa2\x3b\x6a\xd8\x38\xad\x2a\x7b\x61\x6d\x74\x26\xfb\x4e\xb4\x80\xf3\xe2\x4b\x65\x4a\xcb\xfa\xc0\xf8\xc3\xa1\x17\x7f\xb0\x3a\xdd\x30\x62\x8c\x44\xcb\xc7\xc3\x97\xfb\xba\x96\x5d\x7e\xba\x68\x2b\x75\x51\x1d\x9e\xe5\x8f\xd0\x73\xe9\x56\x6e\x1c\x4f\x64\xd8\x94\x66\x7a\xf2\x0c\x9b\xad\x13\xc0\x2a\xff\x67\xd2\x71\x57\x85\x56\x75\x8b\xc3\xd7\x91\xad\x22\x7a\x94\xa7\x24\x0e\x75\x75\x27\x2c\x2f\xe8\x44\xad\xd0\x7a\xea\x9f\xda\xed\x56\x75\x04\x60\x75\x28\x37\x13\xd7\x75\xd8\xac\xc9\xd2\x74\x51\x22\x93\x6e\xbf\xd2\x79\xda\xb6\x3b\x1f\x67\x2e\x7f\x48\xde\xf1\xdb\x3f\x72\xcc\xd5\x63\x78\xeb\x22\xc0\x16\x50\x7d\x83\xda\xf1\xd8\xa9\x2f\x14\x32\xd7\xfb\x7b\x7b\x7b\xe9\x34\x2d\x6a\x77\x7c\x2a\x17\xd7\x7e\xd7\x41\xbd\xac\xbd\xd7\x96\x7e\x80\xf4\x1b\x1d\xd1\xfc\xf2\xe4\x1b\x9d\x9b\x92\x6e\xe5\xe2\xee\xda\xc6\xee\x64\x72\xdc\x94\xed\xd7\x5b\xe1\x22\x92\x6e\x8e\xea\x4f\x3b\xf3\xc8\x69\x00\xb0\x45\x54\x56\x95\xe4\x20\x0b\xdb\x6c\xf9\xab\x95\x82\xaf\x60\x28\x4b\x66\xce\x90\x99\x52\x5a\x74\x80\x91\xcc\xaf\x95\x5d\x81\x4a\x86\x3e\x7c\x37\xc0\x56\xd1\xb2\xb7\xc9\xc9\xad\x33\x7d\x56\x48\x37\xc1\xb4\x73\x7f\x0f\xe3\x68\xf6\x64\xe6\x9c\x3f\x1b\x99\x60\x53\x8b\x93\x9f\xb7\xfd\x54\x5e\x33\x7a\x39\x65\x77\xb2\x65\xf2\x02\x97\x58\x8a\x6a\xb6\x5c\xab\x2a\xe8\x1b\x69\x38\x37\x5a\xb4\xda\x5d\x2c\xe3\x6e\xc9\x79\x93\x19\x44\x90\x80\x0c\x9a\x1d\xa4\x59\x53\x14\xc2\xc6\xaf\xfd\x88\xef\x79\x2b\xd5\xcb\xa8\xe5\xae\xf0\xa7\x7f\x56\xde\x76\xa8\xfb\x08\xc3\x91\xc5\x0a\x11\x4d\x12\xf2\xe8\xa0\xcb\xe1\xc1\x9a\xd4\x23\x69\x4d\x2c\xee\xdc\x15\x63\xc7\x74\xef\x9f\xfa\xc6\xb2\x57\x71\xe8\xf4\x50\xff\xd9\xc7\x43\x22\x8a\x4d\x4e\x40\x46\x17\x79\xdc\x68\xdf\xbb\x7c\xb9\xa3\xf4\x16\xf4\x77\xac\x45\x16\xfb\x17\xee\x3f\x38\xea\x97\x64\x9d\x2a\x85\x85\xad\xdf\x7f\xc8\xda\x5a\x67\x03\xb0\x67\xe8\x52\xe6\x35\xad\x29\x5e\xf0\xce\x5e\x9f\x52\xa2\x4d\x56\xa5\xfc\x16\xb1\x6c\x75\x88\x67\x30\x5a\x5a\x34\x85\x77\x47\x40\x9a\x60\x59\x06\xc0\x7e\xa0\x63\x88\x04\xdf\xae\xce\x2f\xef\xa9\xb1\xd2\x61\x71\xbf\x98\xaf\x86\x25\x5b\x4e\x94\x50\xc7\x4e\x68\xbb\xf4\x44\x19\x0d\x2a\xb6\x94\xbf\x75\x02\x58\x30\xda\xf6\x53\x39\xd9\x7c\x7d\xb1\x8d\xce\xa2\xc3\xc9\x99\x74\xb1\x41\x31\xb0\xe5\xc3\xb6\x95\xe5\xdd\x6e\x7a\x6b\x9b\x2e\x6c\xbe\xe0\xc2\x68\x07\xb0\x1a\xf4\x48\x58\xa4\x44\x4a\xc7\xe5\xfc\xe2\x08\xaf\xca\x64\xed\xa0\xd7\x0f\x78\x63\x14\x94\x4d\x7f\x30\x7c\xf8\xee\x54\xa9\xe2\xe9\xe8\x1b\xd9\x00\x6b\x45\x75\x43\x19\xcb\xc0\x77\x3f\x17\x17\x2c\x75\x6e\xec\x9e\x65\x4a\x37\x95\x10\x57\x59\xcf\x39\xfd\x5b\xc5\x56\xe9\x92\xb9\xec\xc9\xd7\x95\xaf\x00\xc0\x9c\xd0\xe7\xb5\x75\x05\xed\x2c\x13\x0f\x1e\xdd\xe7\x73\xa0\xda\x8e\x01\xa3\xbc\x3a\xef\x46\xf6\xf2\x02\xfd\x71\x5b\x9e\xc1\x4e\xa6\xd0\x0f\xa5\x00\x5b\x41\x85\xb0\xa7\x7b\x2b\x30\xe9\xe8\xf0\x58\x3e\x33\xe3\x97\x92\x49\x47\x87\x24\x4e\xf0\x84\xbe\xb9\x6f\xf9\xb3\xdc\xea\xd2\x38\x59\x97\x54\x2b\x2a\xb7\x0c\x65\x36\x18\x51\xea\x4e\x74\xbf\xcb\x08\x17\xff\x75\x89\xda\x8e\xff\xc6\x23\xea\xae\x2d\xa4\x45\xed\xb3\x97\x66\x77\x9d\x51\x02\x00\x73\x43\xe3\x68\x60\xd1\xf2\xa7\x6b\x93\x9d\x96\xa0\x4e\xce\xbc\xe9\x4f\xbd\x77\xd6\xbe\xc3\xa4\x4e\x0f\xb2\x9b\xfc\xa9\xbe\x71\x6f\x05\x9d\x0e\x02\x6c\x1c\xe5\x6b\xc7\xd9\x4f\x79\xc7\xf6\xeb\xd3\x08\xd7\xc8\x85\x7d\x91\x68\x5b\xfd\xa6\x3b\x27\x7b\x4b\x22\x45\x6f\x50\x8c\xc7\x1f\x24\xa5\x0c\xa3\x21\xbc\x37\xfc\x4a\x93\x3f\x5d\xc4\x81\xe5\xd8\xdb\x9c\x9e\x95\x76\x8b\x51\x41\xcf\xe7\x55\x34\x96\x07\xab\xcd\x22\xcd\xd2\xcf\x5e\x23\x01\xcc\x07\x2d\x0c\xd8\x6a\x9f\x78\xfa\xfd\xb6\xc9\x72\xd3\xe6\x89\x4c\xdd\x91\x2e\xd7\x78\xf9\xfc\x83\xf9\x19\x3b\xf5\x0b\x02\x47\xf6\xfd\xa2\x41\x2f\xc8\x1c\x09\x3f\xb4\xb8\xfd\x13\x96\x7f\xbb\xfe\x3b\x45\x8e\xc1\x31\xde\xea\xa9\x16\x57\x96\x0c\xdb\xd8\x3f\x56\x5c\xca\x9f\x83\x69\x3f\x20\x8f\xfe\x98\x0e\xea\xaf\xd2\x61\x77\x5f\xd3\x1f\x37\xec\x7d\x51\xbf\xa0\xc1\x8c\xb1\x30\xaa\x55\x07\xec\x15\x9f\x0d\xae\x09\xdb\xf7\x12\x79\x74\x8f\xd4\x75\x95\x08\x5d\xce\xa7\x2c\xa7\x38\x04\x24\x85\x66\x38\xdf\xf9\x53\x46\xea\x04\x55\xf1\xbc\x9f\x4f\x0a\x89\x4f\x2a\x43\xaf\x8e\xfe\x5c\x3b\x44\x7f\xd9\x3a\xc1\x3c\xab\xa2\xeb\x0a\xd5\x5c\xd3\xd2\x4b\xdf\x63\x26\xdc\xa2\x81\xdb\xee\x86\xab\xd5\xde\xe8\xb1\x56\xdc\x68\x51\x51\x1a\xcd\xa1\xdd\xf9\xdc\xac\xae\xd9\x32\xe2\xaa\x75\x50\xff\x44\xe1\x51\xeb\xcb\x8c\x53\xcc\x9e\x13\x59\xca\xb7\xbb\x58\xc2\xf3\x3d\xdc\x01\x16\x80\x6e\x8f\x37\xb2\x31\x47\x5e\x8f\xee\x15\x56\x99\x4f\x9e\xbd\x25\xfc\xf2\xcc\x5e\x61\xc6\xf4\xbe\xe6\xdf\x31\x7a\xb9\xbf\xcc\xf2\x1f\x58\xca\x39\x01\x19\x01\xe4\xf1\x8c\x2f\xbe\xef\x58\xaa\xad\xb7\x2d\x51\xaa\x32\xba\xc9\xae\xbf\xe6\x6d\x0e\x59\xff\x15\xd9\xcd\xc8\x1b\x11\xfa\xac\x4d\xe7\x4b\x28\xc0\xb2\xd1\x25\x7f\x1a\xf4\x48\xf6\xec\x9f\x04\x9e\x6e\xf5\x41\x67\xd9\x1a\x19\x69\xd1\x14\xbb\x47\xfd\x35\x79\x14\xe4\x12\x49\x25\xe9\x86\xfc\xe4\x00\xeb\x43\x0b\xfc\x55\xce\xcb\x4d\x74\x95\xfe\x83\xa6\xcb\xd5\x5b\x7b\x56\xe9\xc2\x2c\xcd\x0f\x7c\xf4\x8f\x16\xd3\x39\xd6\xea\xf9\x6c\x5f\xf9\x23\x49\xe4\xd1\xce\x2e\x26\x8f\xd3\x11\x0f\x3a\x83\x37\xd9\xeb\x3e\x34\x94\x9c\x3d\xdb\xfd\xec\x6c\xb7\xf6\x05\x2f\xca\xab\xdb\xd3\x7b\xe9\x65\xd1\xdd\x31\x96\x67\xbe\xce\x41\x3e\x4f\x1b\x3e\xf9\x2e\x70\x64\x66\x8f\x48\xba\xbd\x8b\x95\xc1\xe0\x8a\xa3\x51\x84\x5c\xe5\x8a\x78\x9c\xf7\x46\xa6\x47\x2f\xae\xab\x04\xdf\x4c\x32\x48\x7f\x27\x33\x2e\x99\xab\xf0\xee\xd8\xab\x20\x26\x1e\x0b\xf2\x57\x7c\x1f\x4b\x23\x38\x45\x34\x68\xde\xbf\x7f\x0f\xb0\x0f\xa8\xd1\xdc\x4a\xdb\x18\x98\x2b\x9e\xc8\x3e\xdc\xd9\x6f\x6f\xbf\x25\xe2\xf8\xd3\xc2\xaa\x02\x3f\x59\x13\xbf\xe0\x58\xd1\xcf\xc7\x3b\xea\x14\x00\xf6\x07\xdd\x7b\x37\xbc\x44\xab\x04\xdf\x69\x33\x8f\xf0\x67\x2b\xa5\xc7\xd6\xe5\xbc\xcd\x1c\x7b\x16\xe7\xee\x14\xff\x5c\x37\xe5\x4e\x5f\x6f\x71\x02\x00\x58\x05\x9a\x8f\xad\xa3\x93\x7f\x71\xce\x75\x17\xf7\x63\x5d\x9b\xf6\xee\xae\x90\x34\x54\x3f\xa2\x70\x31\x2a\xee\x4d\x06\x07\x75\xed\x8f\x03\x72\x11\x00\xeb\x40\xd7\x53\xe1\x88\x54\xfc\x01\x79\x79\xb1\xb7\x8f\x05\x25\xf8\xff\x98\x8c\x37\xae\xec\x61\x14\x96\x6a\xa9\x18\x66\x28\xd4\xa1\x7d\x43\x73\x18\x79\xb4\xc9\xf4\xd8\xaf\xfe\x77\x8f\xee\x4f\xda\x70\x4b\x87\x1e\xdf\x5f\x3c\x5a\x32\x21\xb3\x34\xf0\xe4\x58\x6c\xa2\xfe\xde\x0f\x2d\x11\x42\xe8\x64\x95\xd3\xe1\x48\x24\xef\x2b\x9d\x2d\xbd\xcd\xcf\x56\xb8\xd5\x12\xc4\xb4\x24\xf6\x94\xf4\x87\x9d\xe7\x56\xb4\x5e\xb3\xdf\x55\x40\x49\x02\x98\x1f\x1a\x93\x94\xbe\x1e\xf3\xc4\xce\x65\xea\xa8\xb0\xbe\x58\x13\xdb\xa3\xdd\xe6\xa2\x0b\xc5\x5a\x59\x60\xe7\xa0\x40\xbc\x1e\xc3\x9d\x23\x14\x4e\x40\xe6\x26\xf2\xf8\x90\x3e\x85\x49\x5a\x93\xbb\xbe\x59\x41\xc4\x9c\xd9\xe5\x7d\x91\xee\x45\x5d\xcd\xae\x01\xe6\x97\x53\xbf\x55\xf8\xea\x28\xb5\x6b\x01\x6c\x0a\xd5\x6d\x13\xe4\xc3\x85\xad\xfd\xa8\x79\xee\x6b\x0f\x2f\x1c\x4f\xd9\x54\xac\xbd\x12\xaf\xf3\xae\x28\x6e\xe1\x8c\xc5\x30\xeb\xb5\xb4\x26\x59\x80\xcd\xa2\x09\x76\x68\xc8\x33\x62\xc6\xe6\xcf\xb1\xa6\xb1\x92\x48\xbf\x09\x47\x9a\x4a\x4a\xa3\x33\x2f\x8d\x31\xa3\x81\xfc\x8a\x0e\x87\xd4\x73\x47\x9c\x00\x96\x86\x52\x9a\xf7\x59\x95\x62\x03\x43\x42\xb1\x9f\x5e\xf1\x49\x7b\xbc\xe2\x94\x76\x66\x4e\x76\x30\x9d\xb6\xb8\x92\xdd\xd2\x02\x48\xfd\xe7\x78\x01\x36\x80\xee\x71\x93\x86\xdf\x25\xe2\x4c\x92\xa3\xd9\x4d\xcd\x8e\x6f\x25\x22\x66\x8d\x6f\x44\x54\xf2\x66\x6d\x6f\xf2\xe3\x8a\x1c\xd3\xd9\xfc\x3e\x18\x60\x53\x68\x82\x0d\xcb\xe0\xec\x32\x2a\xda\xa7\x5f\xfc\xed\xfa\xbb\xcd\x24\xbe\xd8\x32\x17\xa5\x07\x32\x79\x92\x85\x17\x1c\x73\x4e\x6d\x3b\x98\x69\x25\xfc\x8f\xbc\x4a\x8e\xe2\xff\x48\x5c\x0d\x6c\x27\x08\xc9\x15\xc4\x4c\xc3\x36\x8c\x88\x61\xe1\x98\x75\xd8\x1e\x11\xb1\x2c\x1c\x93\xbb\x15\x2a\x6e\x44\x7c\x0b\x60\x8c\x2e\x1b\x0d\xc8\x4b\x94\x16\x75\x51\x5b\x7e\xe4\xa0\xf8\x32\x99\xb5\xfd\xea\x95\xcd\xd9\xc1\x8f\x82\x4e\x30\x7d\xfd\x82\x79\x9b\x29\x90\xbb\x30\x06\x45\x1f\x11\x24\x01\x6c\x11\x0d\xae\xb9\xff\x00\x4d\x54\xb8\x59\x1a\xcf\xf8\x6e\xa9\xd1\xaf\xd5\xe7\x2a\x93\x1b\x56\x44\x0f\xd0\x0c\x8a\x5e\x7b\x3c\x51\x9f\xc7\x4c\xb7\xd1\x85\xa3\x4c\x80\x2e\x52\xda\xcd\xa7\xa3\x49\xe6\xc5\xb6\x61\x26\x37\x5e\x41\x2d\xff\xe7\x76\xe9\x2b\x1e\x73\xee\xe7\xf7\x66\xcc\xbd\x7d\x38\xe1\x40\x02\xd8\x02\xfa\xf7\xf7\x4e\x87\xbb\xb7\xd4\xf7\x74\x69\x89\xab\x1a\x28\x14\xec\xd1\x13\x37\x39\x3e\x7b\xa8\xad\x32\x5a\x5e\xce\xea\xc0\x55\x77\x79\x32\xe1\x7f\x33\x1b\x0f\xd0\x4b\x38\xf6\x21\x32\x1d\xc7\x2c\x42\xb9\x94\xc8\x7c\x1c\x93\x0e\x17\x8f\xc8\x05\x1c\xb3\x00\xdf\x43\xc8\x7d\x21\xa6\x12\xbe\x87\x90\x00\x43\x4c\x1d\xec\xd5\x89\x58\x30\x62\x1b\x15\x9c\x15\x11\xf2\x61\xd9\x9d\xd2\xff\xfd\x92\x3c\x03\x4d\xab\xa6\xbc\xed\x49\x56\xd1\xa5\x73\xd1\x99\xe2\x2e\x4f\x66\x4e\x3c\x5a\xaa\x3e\x91\x1d\x64\x79\x92\x42\x9a\xf5\x37\x75\x8c\xa4\xb4\x35\x09\x60\x5f\x50\xf2\xaa\x6a\x12\x73\x89\xee\xca\x01\x67\x03\xcd\x5b\xb6\x2f\x9e\x36\x93\xe9\xcb\x8f\x47\xb3\x39\x73\x25\x31\x0c\x8b\xdc\x71\xd8\xd1\xf3\x67\xe3\x80\xa0\x49\xc4\x71\xa0\xcb\xb0\x9b\xc2\x35\x3c\x5d\xd3\x4b\xe8\xa0\xb9\xd8\xef\xdc\x53\x57\x77\x94\xa7\x9d\xe8\xaa\x66\xdc\x5a\xfe\x3e\xea\xf6\xad\x8d\x83\x8b\xb2\xf4\xbd\x1f\x7f\xb4\xfd\xbe\xe3\x79\x2c\xed\xf8\xe1\x43\x3c\xdd\x05\x93\x41\x7b\xb9\x6b\x8b\xf2\x2f\x5f\x30\x9d\x11\x13\xe4\x4d\xaa\xd0\x16\xfe\x37\xb3\xf1\x08\x65\x40\xd5\x84\xc8\x74\x1c\xf3\x05\xf6\xaa\x44\xe6\x23\x69\x01\xa6\x1f\x22\x17\x90\x94\x05\x2f\x34\x10\x36\x27\xf8\xae\x87\x18\xa2\x0e\x05\xc7\xac\x32\x41\x51\x92\xa8\x57\x01\x72\x5b\xb8\x28\xff\xfb\x47\xc4\x61\xe8\xc8\x6f\x26\xda\x7c\x53\x5a\x66\xfa\xcd\xe6\x45\x3d\xb0\xae\x79\x21\x35\xde\x61\xfe\x66\x71\x5f\x6d\x75\x9c\x3c\xdf\xad\x42\xbb\xef\x72\x1b\xce\xa0\xdb\x2a\x8d\x9c\x5c\x27\x57\xa2\x7c\x39\x9e\x5e\x6e\x01\xbb\x1f\x28\x1c\x7e\x2a\xbc\x87\xa3\x37\xfa\xe7\xd8\x1e\xf9\x13\x25\xa7\x9b\x1f\x92\x00\xd6\x80\x92\xdc\xef\x7c\xc3\x03\x74\x9a\x16\x9c\xa7\x3d\xfc\x67\xf7\xbd\x5b\xe2\x91\x5f\x4f\xf0\x2b\x6d\x18\xb2\xd8\x25\x6a\xf1\x29\xf5\xec\x50\xeb\x86\x13\xff\x53\xde\x6d\x99\x42\xa9\x87\x8e\xea\xdf\x65\x5f\x38\x29\x14\xfb\x35\xb1\xdf\xe6\xee\xd0\x85\xe0\x1f\x72\x4f\x6d\x99\x2e\x34\xbc\xa2\xe3\x13\xfe\x37\xb3\xf1\x10\x85\x41\x11\x8f\xc8\x74\x64\xf9\xe0\xd6\x22\x32\x1f\xc7\x34\x40\x51\x92\xc8\x05\x64\xf9\xe0\x2f\x29\x89\x5a\x47\x88\x91\xa1\x86\x2b\x4e\xd4\x43\x02\xb9\x4d\x64\x64\xff\xdd\x34\x88\x43\xbb\xb7\x89\xf5\xd8\x70\xa3\x62\x9f\x53\x06\xbb\xd9\xbb\x1e\x6c\x1d\xbd\xe2\x55\x95\xb5\x60\x29\xbc\x55\xc8\xc9\x4e\x7c\x8b\x02\x9b\x94\x2e\x09\x60\x4d\xa8\xe4\xa0\xc2\xbb\xc9\x8b\xca\xeb\x7d\xad\x82\xcd\x66\x6d\x86\xe4\x3d\xc2\x4b\x6f\x79\xb1\x8c\x78\x65\xdd\x81\xda\x56\x8f\xb3\xcf\xae\x38\x92\x00\x16\x81\xae\xa0\x51\x61\x90\x3f\x59\x5d\x3e\x57\xe6\xc9\x3f\x21\x54\x81\x64\xbe\x7d\x0f\x04\xaf\x7d\x91\x0a\x19\xcb\x10\x5b\xa9\xab\xa7\x8e\xaa\x25\x01\xac\x07\xe5\x8b\x24\xf2\x1e\xce\xf5\x53\x11\x17\x56\x94\xb7\x5b\x18\x4d\x92\x57\x4d\x5e\xd1\xbb\xe3\x72\x94\xc2\x68\x9f\xda\x85\x53\xf7\xde\xa6\xc7\x08\xff\x9b\xd9\x78\x54\xe3\xe0\x84\x83\xc8\x74\x1c\xd3\x04\x05\x29\x22\xf3\x71\x4c\x04\x94\x2c\x89\x5c\xc0\x31\x3d\xf0\x2b\x0a\x84\x2d\x3d\x5c\x71\x5d\x78\xd7\x97\xa8\xad\x87\xaf\x79\x06\xab\x14\x51\x6f\x8f\x63\x7e\xc0\x81\x0d\x61\x7f\x0f\x31\xc1\x30\xd4\x84\x4d\x3e\x7e\xb8\x20\x35\x23\xec\xf4\x21\xa6\x15\x86\x9a\xb0\xdb\x87\x18\x27\x88\x21\x6a\xf9\x71\xcc\x0a\x0b\xbc\x43\x48\xd8\xfc\xcb\x31\x92\x91\xb9\xb9\x90\x00\x56\x81\x12\xa8\xa1\xc6\xcf\x64\x87\x47\xa9\x80\x73\x43\x76\xad\xf6\x63\x1a\x65\x07\xea\xc3\xf4\x4f\xc7\x39\xb3\xab\xbc\x1e\x2d\x1b\x1e\x0b\x13\x27\x01\xac\x19\xe5\xee\xde\x12\xc3\x77\xc5\x9f\xad\xbf\x70\x79\xf5\x2b\x34\x89\x6a\xaa\x7c\xc2\xd7\x5d\x8a\x2e\x91\x4f\x3b\x59\xe6\x51\xbc\x10\xff\x2c\xd9\x46\x67\x8f\x96\xd1\x27\x5f\xad\x3a\xa6\x28\xae\x07\x62\xf9\x49\x9a\x1f\x65\x9f\xbe\xf6\xca\xfe\x90\x6d\x0e\xb4\xa7\xe6\x72\x84\xad\xec\x37\x9d\xd2\xde\x78\x1e\xcd\xef\x2f\x9b\x62\x5e\x7e\x55\xeb\xdc\x2c\xe0\x7b\x7f\xb7\x01\xe9\x45\x9f\xee\x49\x36\x2a\xad\xdb\x3f\xf8\xba\x1f\x9c\xba\xbb\xfd\xf0\xb9\x38\x12\xc0\xc2\x51\xb2\xdf\xc4\xb6\x4a\x1f\x64\x14\x41\xf9\x40\x98\xf6\x49\x69\x26\x36\x4f\x3f\x78\x41\xed\x54\x1e\x7d\xf2\x9e\x9b\x65\x07\x2e\x32\x1c\xee\x15\xfe\x37\x37\xf1\x90\x56\x40\x92\x45\xe4\x2a\x8e\x69\x86\x5b\x84\xc8\x5d\x1c\xe3\x03\xcb\x27\x91\xcb\x08\x06\xd6\x06\x22\xb7\x71\x4c\x38\x3c\x26\x84\x72\x0f\xc4\xb8\x41\x0c\x91\xe6\x83\x63\xc6\x19\xe1\x70\x83\x48\xfd\x01\x72\x7e\x54\x5b\x28\x36\xb6\xe2\x1a\xca\xfd\xc9\x26\xf6\xed\xcc\xaf\x38\x7d\xf2\x91\x13\x9f\xb6\xef\x39\xc3\xab\xd9\x4c\x49\xe4\xd4\xee\x6f\x5a\x03\xfd\x32\x22\x27\xbc\x24\xdb\x49\x00\x2b\x40\xaf\x94\xc5\xa4\x5f\x76\x96\xed\x6f\x89\x61\x97\x49\xcf\x9c\xfb\x54\x5a\xae\xf2\x6b\xb9\xe5\x90\x57\xf4\x6f\x4a\xbe\x77\xae\x9f\x9b\x4e\xdd\x21\x01\x19\x7b\x94\x30\xce\x64\x62\xaf\x4d\xc9\x99\x46\x7c\x0e\x3d\x5f\x29\xff\xa4\x73\xb1\xb7\x36\x20\x51\x78\x99\xc1\x21\xda\xe1\x4a\x01\x0d\xf9\xd3\x8d\xee\x08\xdd\xe9\xec\x7c\x7f\x5a\x28\x7f\x5a\xa7\xf4\x4b\x18\x4c\x6e\x52\x6e\x73\xbf\x9f\x98\xe2\xd8\x98\x29\xed\x2a\x43\x75\x29\xf7\x40\x3f\x43\x3c\x09\x60\x5d\x68\x8b\xdd\xc9\xfc\x38\xfc\x41\x68\x9f\x3c\xc3\x74\x86\x93\x5e\xf1\xa3\xc8\xf6\x4f\xee\xd4\x07\xea\xdf\xdc\x74\xd1\xff\x35\xd2\xe6\xb5\x5f\x5d\xf8\xdf\xbc\xc4\x23\xba\x06\x93\x22\x91\xa7\x38\xa6\x00\x7e\x02\x8b\xc8\x5d\x3c\x5f\xdb\xff\x7d\x0d\x91\xc7\x48\x1b\x09\x37\x3c\x91\xd7\x38\xa6\x0b\xce\x43\x88\xd4\x3e\x64\xc3\xb3\xc2\xfc\x46\xa4\xfb\x01\xb9\x4d\x54\x64\xb1\x1b\x9b\xaa\x00\x95\xfd\x97\x75\xbd\x9f\xbe\x14\xae\xc9\x4e\xff\xfd\x22\x8c\xf5\x66\x6a\x46\xd3\x51\x63\x13\xb5\xfa\x51\x3a\x95\x94\x5f\x6d\x36\x16\x9b\xd4\x48\x00\xeb\x40\x37\x61\x1b\xf3\xae\x15\x97\xc2\x1a\xbd\xde\xdf\x53\xcb\xf7\x75\x82\x18\x02\x33\x3e\xd7\x2d\x5d\xb3\xa9\x36\x2d\x7b\xb7\xb4\x6c\x95\x97\x48\x02\x58\x08\x9a\x7f\x22\x74\xc8\x6b\x37\xbf\xa9\xd4\x7e\xb5\x5c\xc1\x95\xaa\xe2\xfd\xfe\x16\xe5\x96\x54\xf2\xdc\x4f\x1a\x89\x97\x6a\xad\xe8\xbe\xee\x1b\xdc\xa8\xa1\x28\x3b\xc9\x1a\x93\xeb\x78\x77\x8b\x6b\x79\x4b\xff\x3b\x1a\x99\x57\xd9\x99\x26\x15\xba\x9e\x3a\x54\xca\x34\x9d\xeb\x6a\x8e\x57\x3d\xef\x9d\x20\x01\xec\x05\xfa\x3c\xeb\xbc\xfb\xdb\x11\xfb\xc8\xcf\xbd\x9b\x1e\xca\x34\xaf\xd9\xcd\xc5\xb5\xa6\x8f\xff\x52\xbf\x22\xd3\xe6\x2f\x34\x63\x75\x64\xeb\xdf\xfc\x46\xe4\x26\xb2\x43\x60\x73\x47\xe4\x2a\x8e\xe9\x80\x3b\x91\xc8\x5d\x1c\x13\x02\x73\x08\x91\xcb\x08\xdb\x80\xac\x86\xc8\x6d\x1c\xf3\x62\x2b\x24\x98\x44\x7a\x2f\x90\xa3\x20\x27\x63\xda\x20\x98\xee\xe8\xd5\x51\xc6\xe5\x14\x9f\x87\xe6\x19\x0c\x03\xd1\xea\xf5\x96\x4f\x13\xef\x6f\x31\xed\x31\xfb\x56\xe8\xa3\x76\x4c\xf4\xc5\x40\x5d\x93\x0e\x2d\x09\x60\x13\x28\x61\x1c\x5a\x35\xaa\xb8\x48\x27\xb4\xeb\xcd\x8e\xc8\x92\xcf\x66\x07\x8f\xd0\xa7\x2a\xbc\x97\xfa\xf4\xf4\x2d\x67\xb8\x0f\x4b\x87\xe8\x51\x07\x12\xc0\x02\x51\xc2\xf8\xf5\xf7\xad\x5d\x3e\x74\xab\xd2\x89\xf1\xae\x45\xcc\x91\x37\x6e\x9e\xbf\x1c\xa3\xfa\xe7\x5e\xd3\xa7\xa7\x9e\x14\x64\xd8\x78\xa7\x14\x09\x60\xe9\x68\x49\x2e\xb3\xd6\x16\x76\x09\xb3\xa7\x79\x1f\x5b\xfb\xaa\xb2\x7b\x2c\xcc\xea\x74\xae\xb6\xdf\x0b\xf9\x6a\x6e\xab\x4d\x8d\x2f\x8e\x4a\xae\x0b\xff\x9b\xd9\x78\x88\xdc\xe1\xd5\x2c\x22\xd3\x71\xcc\x04\x64\x23\x44\xe6\xe3\x98\x40\x78\x0d\x8e\xc8\x05\x44\x07\x61\x81\x65\x83\x48\x83\x07\x72\x14\x65\x64\xd2\x1b\xcb\x57\x8c\x9e\x58\x96\x68\xfb\x22\xc3\x6f\x9c\x61\x83\xdc\x71\x72\x67\x3b\xfd\xb1\x6b\x5f\x2b\x04\x0e\x1b\x88\x50\xde\x48\x9e\x59\xff\xa8\xe1\x53\xbf\xb1\xaf\xd0\x3c\x2d\x10\xb3\x9c\xb5\xa9\x7b\x5a\xe5\xda\xfc\x8b\xbb\xb7\x02\x0a\xa9\x5f\xea\x5b\xfa\x8f\x3f\x5b\x38\xd9\xb0\x5a\x2f\x25\x6e\xd9\x22\x4d\x02\xd8\x24\x2a\x34\x7c\xd6\xc9\x48\xc8\xa3\x0a\x49\xbd\x42\x75\xfa\xd1\xb3\xcd\xc9\x4d\xb5\x9c\x6b\xae\x15\xba\x66\xaf\x6c\xc9\x54\xb4\xcb\x44\xc8\x31\x00\xb0\x10\x34\xe3\xf0\xab\xeb\x4a\x54\xa5\x19\xad\xf6\xc8\xde\x7b\xb8\x58\xb8\x59\x48\x4d\x43\x32\xbd\xd4\x6d\x46\x7f\x97\xc2\xf7\x9f\x05\x1a\x32\xf5\x00\x7b\x8f\xee\x8e\x29\xae\xb4\x74\xeb\x6b\xb3\xdf\x94\x5e\x0f\x47\x1f\x3b\x3a\x94\x91\xa7\xc6\x22\xb5\xa0\xdd\x6d\x64\x52\x29\x75\xb7\x8b\x54\xb0\x59\xf8\xdf\xbc\xc4\x23\x5a\x0c\x0f\x2b\x91\xa7\xc8\xc1\x83\xb9\x99\xd0\x5b\x88\x99\x84\xda\x04\xa1\xc7\x78\x52\x80\xc9\x87\xc8\x6d\x1c\xf3\x9e\xf5\x4f\xc4\xff\xed\x10\xc2\xd1\x8b\xec\x2d\x72\x2e\x67\x12\x90\x31\x40\x03\x7c\xc2\x72\xde\x21\xcc\xa4\xd3\xba\x7c\x41\x65\x5c\xc5\x4c\x42\x88\x43\x72\x6e\x2a\xbd\xf1\x3a\x5b\xdd\x97\x70\xc5\x02\x1f\x79\x12\xc0\xda\xfe\x87\xb1\x92\x9f\x90\xd2\xac\xbf\x2b\xb5\x44\x19\x90\xdf\xf7\x92\xcc\xd2\xee\x8e\x2b\xfd\xf9\xf5\x9e\x83\xc9\x9b\x6a\x2d\x93\x65\xa9\xd6\x49\x00\xcb\x47\x9f\xd7\x78\x5e\xee\x63\x73\x39\x74\x30\xc7\x95\x9b\xab\x27\x7c\xf8\xee\x03\xaa\x33\xcf\xe2\x57\x58\x98\x73\x6a\x4e\x63\x29\x61\xf6\x56\x00\x60\x25\xe8\x7e\x1a\xe3\x4f\x8d\xcb\x67\xa5\xd7\xeb\x5f\xf2\x0e\x60\xa2\x63\xf5\xb2\xf5\xae\x93\x90\x4b\xc9\x0c\xd7\xf8\x3d\x17\x21\x43\x7f\xe8\x31\xc0\x46\xd0\xed\xc4\xf7\xcd\x77\xd0\x96\x49\xf9\x41\x87\xdc\xa5\x6c\x5a\xd6\x2c\xc3\x76\xd3\xf8\x1b\x6b\xdc\x2f\x1e\x0c\xab\x30\xf1\xf1\x9f\xb6\x4f\x39\xfe\x6f\x5e\xe2\xe5\xde\x00\x72\x55\x02\x47\xf1\x25\x68\x83\x5c\x95\xd0\x59\x88\xc9\x87\x18\x42\x87\x21\xa6\x04\x6e\x29\x22\xaf\x71\xcc\x08\xdc\x52\x84\x83\x36\x88\xf1\x80\x17\xbf\x88\xa6\x6d\x38\x26\x00\x6a\x1f\x84\x23\x37\x18\x6a\x01\xd8\xd1\x11\x8d\xdd\xe0\x6b\xb2\x61\xd9\x24\x9a\xbd\xe1\x98\x3e\x4a\xc8\x92\x88\xa6\x70\x40\x8e\x91\x8b\x8c\x6f\x83\x25\x75\xa3\x5c\xd7\x4d\x32\x87\xf5\xc2\xf4\x91\xe8\xe6\x2e\x65\x1f\x73\xd1\x07\x54\x5a\x97\x73\x12\x5c\x0e\x6c\xce\x29\x51\xf4\x95\x6c\x2a\xf8\x99\x45\x02\xd8\x0c\xca\x7a\xce\x0a\x66\x1b\x57\x3d\xf8\xac\x31\xed\x2b\xb3\xbb\xf9\x4d\x70\x19\xc7\x5d\x1a\x4a\x9a\xdc\xec\x13\x9c\xfe\x54\x63\x82\x4b\xc7\x8f\x91\x00\xe6\x8f\x96\xd8\x85\x60\xc9\xe7\x56\xdf\x0b\x6d\xb9\x5a\x36\x69\x7c\x57\x2e\x9a\xb6\x14\xcd\x2d\xd2\x58\xd9\xd7\x58\xf4\x35\x7e\x42\xda\xf1\x87\x30\x09\x60\x45\x68\x8e\xee\xab\x12\x34\x77\x93\x9a\x64\xc8\x6f\x18\x7a\x3e\xfa\xb6\x3a\x77\x17\x23\xad\xd2\x6e\xd1\x8f\x1a\x7d\xef\xce\x6f\xad\x0d\x35\x8c\xd9\xe8\x51\xd0\x01\xd4\x8a\xfa\x9e\x65\x81\xd3\x54\xb6\x7b\xe2\xd9\x02\x79\xec\x38\x36\x85\xef\x71\xe6\x72\xa1\x0f\xa7\xb9\xf3\x6a\xef\x2f\xe5\x74\x6d\x7e\xe1\x7f\x73\x13\x0f\x69\x37\x24\xb8\x44\xae\xe2\x98\x19\xb8\x74\x44\xee\xe2\x18\x7f\x58\x9a\x89\x5c\xc6\x31\x45\x30\x59\x13\xb9\x8d\x74\x74\xdb\xa0\x3c\x4f\x34\x7d\x05\xb2\xd2\xe0\xbf\x2a\x3b\x81\xee\x90\x4b\x51\x5c\x8e\x55\x01\x33\x32\x09\xbf\xb6\x26\x5e\x90\xec\xf7\x6f\x09\x1c\x36\x8b\xd9\xf9\xc8\xf7\xa9\x27\xe7\xcf\x2c\xb3\x82\x04\x12\xc0\x1a\xd1\x15\xb1\xe9\xa8\x4d\x71\x59\x28\xfd\xd9\x13\x7d\x78\x4f\x69\xb9\x27\x65\xf7\xb9\x5e\xcf\xdc\x0b\xe7\x39\xec\xdc\xc5\x94\x3a\xa5\x86\x98\x48\x00\xab\x45\x77\xc8\x60\x8c\x18\x1b\xc7\x53\x73\xaa\xf4\x3a\xdd\x2c\x06\x7f\xea\xd5\xa0\xbc\xf3\x02\x49\xd6\xd9\xb9\x7b\x86\x9f\x30\x51\x54\x51\x3b\x92\x00\x96\x8c\xaa\x82\x8e\xc2\xa1\x32\xe6\x73\x23\xa7\x5e\xb4\x1f\xdc\x37\xf8\xc6\x56\x64\xda\xf5\xb3\x30\xfd\xe1\x93\xcb\x6f\x17\x07\x46\x1f\x98\x2f\x5c\x17\xfe\x37\xb3\x11\xc2\x03\x57\x9c\xc8\x74\x1c\xd3\x08\xef\xf2\x12\x99\x8f\x63\x6a\xe1\x8a\x13\xb9\x80\x63\x92\x71\x85\x90\x68\x14\x8e\x0f\x7e\xe0\xf7\x38\x08\xe7\xe1\x10\xf3\x01\xee\x2c\xc2\xa1\x38\xc4\xfc\x81\xa4\x8f\x70\x30\x8e\x6b\x2c\x50\xaf\x26\x9a\x8e\x23\x3d\x08\x03\xe4\xf9\x44\x73\x72\x20\xe7\x48\xc6\xfb\xdf\xaf\x9d\x87\x51\x69\xe9\xd5\x38\xa9\xee\xc2\x2f\xf6\x77\x5b\x39\x94\x4e\x54\x06\x1d\xdf\x77\x79\xc2\x91\xcc\xaf\xed\x4c\x6d\xae\x45\x86\x7c\xb7\x7a\x38\x35\x09\x60\x51\x28\xb1\x0c\xcf\xde\x2b\x92\x24\x47\x2f\x14\xa4\xa2\x95\xfa\xd6\x26\x51\xfa\xe0\x6d\xa3\x63\xf5\x99\xb9\x6a\x91\x0d\x14\xa7\x0e\x3f\xf7\x14\x20\x01\x6c\x09\x9d\x8d\x96\xa7\x6a\xdf\xb6\x92\xb7\x9f\xb7\x54\x09\xfc\xf4\xe6\xe6\x25\xc5\x45\x3f\xc5\xca\xbe\x88\x87\x9f\x8e\xcc\x95\x97\xf0\xd0\xb9\xb2\x90\x00\x16\x8e\x12\x01\xf3\xbd\x0b\xb7\x16\x1b\x37\x6b\x47\x75\xd6\x19\x71\x2e\x8f\x1d\x7a\x2c\x69\xf4\xab\x79\x9c\xd6\x3b\x7a\x5e\xdd\x26\x93\x3c\x91\x4b\xf8\xdf\xcc\xc6\x43\x34\x0c\xe5\x21\x22\xd3\x71\x4c\x14\x64\x8b\x44\xe6\xe3\x98\x25\x7c\x46\x4a\xe0\x02\x22\x43\xe1\x73\x00\xa2\xbb\x0b\x40\x8e\x42\x5a\xfa\xbf\x7f\x49\x00\xd0\x70\x35\x1f\x9b\xae\xff\xfc\xe8\x31\x45\x08\xe9\xfb\xf7\xba\x1d\x79\x5c\x56\xa4\x8b\x22\x9b\xbe\xd5\x5e\x1f\x39\x4c\x47\x93\x47\xe3\x96\xb3\x51\x08\x51\x62\x4d\xee\x61\x78\x2c\xe5\xda\xa9\x8b\xb7\x8c\xe8\xaf\x1f\xfa\x73\xb1\xdf\x48\x5c\xb6\x92\x2c\x02\xf4\x5a\x7a\x69\xb8\x60\x7c\x67\xef\x90\x00\xd6\x8a\x2e\x77\xfa\x37\xda\x38\x72\x7e\xd3\x6f\x2f\x7d\x97\x8e\x5a\xfd\xd0\xbc\xd2\x5b\x5d\x9c\xcd\xe8\xf8\xa2\x9e\xe7\x5c\x3b\x6f\x68\x2f\xdd\xd3\x0d\x7e\x82\x0e\x14\xe3\xad\x6e\xe4\xc6\x1e\xea\xc7\xe8\x39\xa4\xa4\x3a\x6a\x6e\xf9\x05\xbd\x1b\xb0\x9f\xe6\x1e\x5f\x63\x37\xb6\xb8\x3e\xa5\xf1\xca\x5c\xf8\xdf\xcc\xc6\x43\x04\x20\xfb\x21\x32\x1d\x29\xfd\xf0\xf4\x11\x99\x8f\x88\xd3\x70\xc9\x89\x5c\x40\x98\x19\x1c\x2a\x12\xdd\x24\xc1\x31\x7e\xf0\xab\xd6\x84\xd7\x49\x20\x63\xba\x09\xe7\x00\x44\x57\x4a\xe0\x6b\xa6\x60\x12\x26\xba\x57\x82\x63\x66\x61\xb2\x27\xbc\x5b\x02\x31\x69\x30\x04\x84\x17\x4c\x20\x66\x00\x52\x02\xa2\x5b\x26\x88\x3f\x2c\x7f\x7a\x76\xfc\x5f\xbf\x53\xc1\xd1\x1c\xf2\xf9\xd2\x11\x5d\x5a\x51\xd5\x5b\xde\xfd\xb2\xc7\x3e\x25\xa7\xa8\xfa\x6b\x86\x58\x34\x47\xd4\x57\x65\xb0\x94\x00\xb9\xf5\xc9\xf5\xf5\x30\x4e\x64\x57\x1e\x52\x5b\xb8\x65\x30\xb8\x9b\x55\x69\x87\x5b\x67\xa7\xa5\x40\x4c\xee\x53\x2f\xce\xe8\x7b\x89\x91\x0a\xbe\x41\x9d\x4f\xf3\xae\x19\x91\x00\x16\x83\xb6\x17\x91\xa3\x57\x6a\xa7\xa7\x6e\xca\x5d\x7e\xea\xcf\xa5\x95\xdd\x17\x59\x6a\x16\xfb\xa5\xf0\xa9\xca\x60\xe1\x53\x9a\xc1\x35\xc6\xd4\x18\x00\xb0\x14\xf4\x94\x98\x1a\xc9\x3d\x4d\x10\x9d\xeb\xb7\xe7\xb1\xc8\x3e\x15\xa1\xc0\xb8\xa5\x31\x28\x63\xf2\xba\xf0\x29\x41\xa7\x54\xbb\x90\x19\x85\xdd\x00\x9b\x40\xc7\xa9\x69\x86\x16\x3f\x5f\x05\x8a\x75\xf2\x48\x1b\xe7\xe4\x3f\x62\xad\xbe\x31\x25\xc1\xe1\x19\x29\x1d\x79\xcd\x7d\xcf\xb5\x0a\xfb\x36\x0a\x00\xb0\x4c\x54\xfb\x88\xcf\xf8\xd8\xad\x97\x44\x3b\xba\xa7\xf5\xbb\xce\xed\xe5\xdb\x42\xb1\xea\xd6\x16\xd1\x8e\xd7\xf7\x72\xda\xdc\xb9\xfc\xa6\x36\x4d\x05\x60\x95\xa8\x04\xcc\xe2\x33\xb9\x74\xeb\xe8\x91\xde\x36\xb3\x8f\xf9\x2b\x7e\x7a\xcc\x0a\xba\x2e\xad\x4b\x56\x2b\x8d\x09\x4f\x4f\x49\x18\x6e\x5f\xb8\xe7\x04\x64\x9e\x20\x8f\x57\x7f\x5b\x70\x9c\x55\x60\xf9\x76\x3a\x37\x90\xf3\x21\x4f\x2c\x39\xbf\xff\xa2\xba\x80\x55\xd3\xd7\x5d\x16\x87\x44\xaa\xce\xca\xd9\x02\x2c\x18\xe5\x24\x9e\x99\xce\x95\xa9\x39\x19\x9e\xdb\x9e\x06\xea\x99\xd0\x90\xc7\xd4\xa8\x44\x38\x50\x85\xe5\xf8\x52\x85\x1e\x1b\x6b\x58\x7f\x4f\x0d\xb0\x4e\x34\xe1\x38\xac\x3c\x54\xd5\xf7\xcc\x0a\x54\x9a\xa5\x5b\x5e\xcf\x3a\xab\x7a\x67\x2d\x7d\xf7\xf1\xf0\xb7\xf7\x9d\x0c\xd7\xbf\xc9\x5d\xce\xeb\xd9\x68\xa4\xd0\xd1\xf4\x3c\xdb\xa7\x19\xf5\x3f\x1f\x67\x05\xeb\xb6\x5d\x1b\xbc\xe6\xf3\xd9\xd8\x35\x48\xd9\xad\x82\x71\x7e\x28\xc8\xc7\x96\x95\x5b\x83\x0f\x9d\x7a\x4f\xc9\xd4\x65\x72\x1c\xb0\x3a\xfb\xfd\xce\xd0\x53\x5f\x35\x7b\xfd\x1d\x87\x66\xf5\x5d\x75\xcc\x2e\xee\x1b\xd0\x51\x2c\xfc\x1e\xea\x04\xb0\x24\x34\x57\x7a\x45\x7d\xa9\xef\x3a\xca\x94\xd2\x1b\xa8\x7f\xce\x5e\x23\x44\xaa\xa8\x53\xe6\x4d\x1f\x5f\x42\x41\xaa\xfc\x37\xc9\x47\x89\xb9\x6c\x00\xfb\x88\x5e\x51\xc4\x6c\xbf\x26\xca\xac\x9c\xf9\xd5\x6b\xc5\xd6\xff\x22\xee\xf0\x09\x5a\x81\xb8\xe3\x87\xcb\x1d\x94\x1b\x96\xa9\x67\x4e\x3a\xcf\x66\x02\x6c\x10\xbd\x8f\xa7\xb8\xfa\xe6\x83\xdc\xb7\xa3\x67\xd5\xa6\x73\x85\x0f\xe8\x7e\xb8\xd1\xcc\x71\xaf\xf0\xe7\x16\x37\x0b\xff\x26\xee\x33\x39\x46\x67\xbc\x9c\x00\x16\x80\x2e\x6a\xa2\xd9\xab\x7b\xf3\x0c\xb5\xfe\x8f\xef\xdd\x5d\xbc\x4f\x11\x51\x2f\xdf\xb9\x45\xa9\x4b\x43\xa1\xf3\x86\xfe\x05\xe9\x76\x77\x43\x51\x80\xbd\x47\xff\xfc\x8b\xee\x98\x67\xf5\xc5\x61\x27\xc4\x57\x2a\x4f\x88\xbb\x48\x6b\x44\xbd\x94\x38\x49\xe9\x85\xcd\x31\x05\x05\xec\x0d\xd1\xaf\xac\x01\x58\x3f\xfa\x78\xbf\xca\xc9\x80\xde\x91\x94\x8a\xab\x5b\xe5\xa5\x3f\x1e\x48\xa1\x2b\x7f\x4e\x36\x68\x12\xd9\x3d\x15\xab\x95\xe9\x3a\xc9\x6e\xb2\xd1\xbb\x0c\xa0\x61\x2f\xf7\xec\x99\xf6\xdf\x5a\x3a\x12\xc2\x59\x7f\x6c\x4c\xe5\xb7\xe1\xec\x85\xb5\x73\xde\xf6\xac\xe2\x37\xd6\x0f\x62\x3c\xad\x3c\x2d\x00\x60\xa5\xe8\x16\x1e\x8c\x7a\x46\xab\x3e\x92\x4f\xfd\xa0\xfe\xd4\x55\x8f\xee\xa6\xc7\xfc\x1a\xd9\xf3\x51\xdd\x46\xe1\xc1\x87\x9f\x74\x2f\x72\xdd\xb7\x02\xd8\x20\xca\x02\xa4\x5c\xc7\xb6\xba\xb0\x0b\x3b\xde\xa8\x5c\x3d\x57\xe2\xc5\xc1\xf2\x4d\x59\xa1\xe1\xd0\x3e\xbf\xd4\x7b\x01\x34\x23\x8e\x4b\x3b\xaf\x38\x01\x19\x1d\xe4\x71\xae\x2d\x39\xed\x7e\xb6\x3e\x2a\x86\x56\x72\xf9\xac\xaa\x2e\xca\xc6\xef\x45\xcd\xcd\xf2\x0d\xb5\xcd\xa6\x8d\x03\x6f\x90\xe9\xb8\x01\x2c\x11\x6d\x8c\x6a\xef\x84\xbf\x75\x2b\xa9\xf5\x61\xf6\x7e\xa1\x70\xe4\x65\xc4\xa9\x8c\xec\x67\x8b\xb4\xef\x23\x19\xde\x5e\x96\xd8\xd9\x62\x1d\xfe\x1a\x60\x5f\xd0\x1a\xe5\x91\xfb\xe8\x5b\x4d\x9e\xf6\x05\x32\xe6\x5f\x7e\xaa\xd3\x7c\xfa\xa9\x0f\x0a\xe9\x84\x77\x3e\x69\x8c\x8a\x72\x24\x6b\x3a\xff\x3c\xc6\x09\x60\xe1\xe8\xe9\x8e\xab\x62\x65\xae\x2f\x30\x7e\x7c\x24\x24\xdb\x61\x67\x54\xc1\x34\x76\x58\x30\x7e\x6f\x63\xcc\x96\xfd\xe5\x75\xcc\x16\x9d\xbb\x7c\x00\x16\x8d\x8a\xd3\x37\xfe\x74\xd5\xb1\xcf\x51\x93\x16\xb3\xf8\xc9\xad\xb3\x86\x0e\xdc\x93\x14\x49\x3d\xf7\x44\xfb\xcc\x4e\xff\x9d\xea\x02\x46\x77\xf6\x00\xac\x1f\xed\x09\x04\x33\x45\x33\xa7\xa3\x34\xee\xdc\x79\xb1\xab\xba\xa3\xb0\xe6\xe3\xea\xbb\x3d\x3e\x01\xef\x6b\x2e\x5a\xd0\xff\xca\xa9\xd0\x39\x7a\x17\x00\xcc\x03\x5d\xd9\xb8\xcf\x65\x63\x45\xbe\xe9\x1a\x31\xf4\x12\xe0\xcc\xae\x4a\xd1\xd7\xb2\x4d\x83\x4f\x48\xe1\xcf\x9d\x1e\x64\x5f\x37\x3c\x7e\x77\x1b\xc0\xea\xd1\xe3\xda\xae\x9b\x6b\xd9\x1b\x7a\x2e\xb3\x7a\xfa\xb1\xa0\xd0\xc1\x91\x0a\x5b\x4f\x8a\x67\xe3\x2b\x52\xe7\xd8\x18\x07\x6e\x36\x07\x5c\x7f\x0c\x00\xe6\xf6\x3f\xdf\x46\xad\x4d\x33\xff\x49\x21\xf2\xb2\x68\xc8\xe4\x23\xd3\xed\x62\x97\x26\xfa\xef\xcf\xbf\xbc\x7a\x17\xc4\x7c\x95\xbb\x3e\x49\x32\x6b\x17\xc0\x56\xd0\x9e\xb7\xeb\x40\x5e\x95\x3b\xab\xc2\x87\xf7\xec\xea\xfc\xba\x09\xdd\x25\x23\x87\x0f\xf8\x1c\x94\x15\x74\x67\xe6\x7f\xcf\xd1\x6d\x5a\xff\xdb\x09\x60\x55\x68\x6e\xfa\x9a\x20\x4a\x41\xca\x33\xe1\xf7\x31\x5d\x63\x14\x7c\xaf\x33\xd0\xb7\xc7\xea\x15\x6f\xa7\xaf\xe5\x2e\xf5\x3e\xd6\x7a\x1f\x87\x42\x80\x7d\x43\x63\x29\x07\x92\x4f\xd8\x25\xd2\xcb\xee\x93\x5e\x94\x62\x6d\xa3\x8c\x95\xdd\x7e\x6e\xbd\x72\xea\xce\xf1\xf2\xfe\x28\x32\xea\xd2\xfb\xf5\x00\xfb\x83\x5a\x13\x1c\xca\x58\x99\xef\x4a\x39\x7f\xd1\x78\x60\x52\x35\xd7\x3a\x37\x2c\xd2\xbb\x4a\x70\x56\xfc\x2c\xf3\x2e\x49\x87\xdd\x21\x25\xed\x4e\x00\x73\x44\x9f\x7f\x68\x42\x7b\xb8\xd0\xf2\xe8\x4a\xf3\x0e\x3b\x9e\x0f\xf6\x9f\x4a\xf6\xa5\x79\x1c\x3c\x5f\x2b\xa5\xb5\xcb\xf1\x81\x82\xe1\x6d\xaf\x1d\x00\x6b\x40\x43\xff\x63\xb4\x7e\x78\x57\xbd\x9e\x4d\x17\x3f\x9f\x98\x04\xed\x78\xc2\x15\xb6\x94\xfc\xeb\x7a\x67\x07\xf6\x32\x05\x28\x54\x7d\x7c\xed\x03\xb0\x4e\xf4\x8c\xec\xf8\x9c\xb7\x64\xe3\xfc\xce\x9e\xd3\x22\x28\xb2\x22\x2f\xdd\xd2\x74\x6b\xc5\xc1\xc8\x6f\x74\x2f\xb6\x46\xfb\x78\x76\x76\x96\xa3\x1f\xe9\x75\xbf\xe7\x78\xa2\x3a\xe7\x40\xef\x90\x6f\xd6\xba\xfe\x4b\xa7\xc5\xdb\xe1\xc6\x3a\x22\xf9\x01\x0c\xf3\xa7\x13\xaa\xea\x97\xf4\x55\x91\x47\xfd\x97\xd2\xbb\xb6\x5f\x39\xcd\x39\xa7\x2e\xa3\x9b\x7e\x5c\x93\xbb\xd6\x38\x82\x9f\x51\x57\x5d\xcf\xb3\x4a\xef\x9a\x11\xc7\x97\x2d\x1b\x27\x15\xdd\x00\xa2\x17\x1e\x39\xd9\x9f\x7f\xad\x70\x26\x24\xf7\x8d\x60\x80\x56\x4d\x49\x4e\x4d\x59\xd5\xc7\xa1\xa5\x92\x03\x0b\x8d\xd9\xed\x7b\x16\x00\x36\x80\x66\xbd\x1f\x3f\x6d\xf7\x6d\x66\x8f\x91\x8e\x63\x9a\xd0\xd0\xe3\xf0\x5d\x57\x23\x7f\x4f\xbe\xd9\x53\x9c\x27\xe3\x62\xca\xd0\x6e\xec\xf5\x20\x00\x58\x30\x1a\x13\x96\x60\xe9\xf1\xe8\x38\xc5\x24\xe9\x7b\x97\x24\xac\x1f\xe9\x9a\xd0\x1c\x99\x77\xf6\xb4\x8e\xf5\x8c\xfc\x61\x3e\x13\xe8\x5b\x2a\x01\xb0\x4c\x74\xfd\x9f\xa8\x3d\x59\xe4\xe8\xec\x4e\x7b\x65\x9f\xbc\x6b\xa9\x80\xef\x6d\xec\x2f\x5e\xcc\x84\xa2\xb3\x46\x62\x42\x5b\xe0\xa2\xb1\x9e\x04\xf2\x68\x60\xc0\xb4\xe6\x90\xa7\x5c\xef\xa9\xaa\x38\x9f\x86\x9b\x32\xca\xdb\x65\x4a\x6b\x69\xfc\xa7\xb6\xff\x78\xd6\xe6\x30\xa8\xef\x95\x08\x00\xd6\x8e\x1e\xeb\xe2\x9b\xd7\x0c\xcb\xfe\x50\x1c\xb0\xea\x88\x30\x3d\xa0\x20\x2d\xb6\xa5\x46\xab\x47\xb6\x78\x50\xeb\xc7\x36\xa7\x9a\xc7\x99\xef\x4f\x01\x6c\x09\x75\xf4\xfe\xc0\x73\xd5\xd3\xf2\x65\x8f\x4e\xee\x8e\xdd\xc5\xdb\x9f\xbd\x6d\x93\x8a\xe8\x16\x4b\xf0\xfc\x72\xde\x27\xa9\xa0\xfe\xa8\xfe\x22\x00\xb0\x66\xb4\x51\xf2\xf6\x54\x9d\x36\xce\x39\x7f\xa0\x6a\xa7\x12\xa5\xa6\xdc\x2e\xed\xf3\x3c\xd4\xc2\xae\x57\xad\xb3\x79\x27\xed\xcc\x3a\x57\x72\xad\x00\x36\x80\xd6\xbd\x02\x7d\xd1\x85\xb6\xad\xf3\xf6\x67\x83\x87\xa5\xbf\x5e\xde\x99\xa2\x9e\xeb\x26\xd9\x26\xf2\x59\x4b\x23\x46\x61\x91\xe3\x0c\x75\xb9\x13\xc0\x02\xd1\xc0\x04\xdd\x67\xfe\x43\x57\xc1\x60\x18\xd3\x97\x7d\x9a\x7c\xf5\xce\x32\x65\xce\x0f\xcd\x9c\x68\x59\x61\x32\xad\x32\x37\xc9\x26\xaa\x11\x80\x7d\x41\xab\xc7\x2b\xf9\x93\xb7\xfd\xfa\x7c\xcd\x97\xb6\x91\x19\x69\x79\xfb\xcf\x75\x33\x51\x9d\x59\xa4\x32\x1a\x4f\xb1\xea\xf3\xdd\xdb\x59\xdd\x06\xb0\x25\xea\xff\xb9\xd0\x70\xaa\xac\xd5\x55\xdb\xfc\xdc\xd3\x35\x4b\xee\x78\x93\x22\x0e\xf1\xd9\xd7\x5b\x4b\xe3\xc7\x0b\x97\xdf\x91\x0e\x85\x9c\x76\x04\x00\xf3\x44\x83\x63\xf0\xf8\x60\x95\xe9\xf6\xfd\x54\xf7\x97\xb6\x68\x2a\xf7\x0a\xfd\xa6\x5c\x0f\x71\xe3\x62\x3a\xe1\xc9\xf7\x91\x5a\xeb\x52\xf7\xe9\x13\x00\xeb\x44\xd5\x5e\x97\x3d\x82\x0e\xbb\x18\x5f\xb6\x92\x94\x31\xad\xad\x19\x2f\xbf\x6b\x9b\xcf\x75\x0e\x63\x07\x5e\x53\x0a\x95\xde\xe3\x9b\xbd\x5d\x8c\xde\xb9\xce\xe1\x7c\x5d\x69\xbf\xa2\xfc\x41\x8d\x41\xab\xd1\x78\x72\x54\xc6\xf3\xb2\x58\xdd\x6e\x49\x56\x9a\xe7\x9c\xe6\x1e\xfe\x85\xbb\x48\x00\xcb\x40\x2d\xa9\x4d\xd5\xba\x2d\x61\x39\x39\xc9\x6e\x7f\xc4\xc1\xb5\x55\x82\x9e\xa2\x8b\xd6\x8f\xdf\x94\x7f\xd4\xc8\x54\xac\x70\x75\x87\x1a\xab\x13\xc0\x5c\x50\x09\x64\xf1\x8f\x7a\x5c\x47\x8e\xa0\xdf\x83\x0a\x66\x56\xe5\xc1\x58\x61\x49\x4a\xbb\x2f\xe7\xfc\xdd\xd6\x5b\xd4\x2e\x5b\xf8\xfd\xd8\x27\x0f\xb0\x6c\x74\x99\x46\xeb\xb2\x5a\x8a\x59\x53\xaa\xce\xbb\x7f\x16\xe2\x07\x67\x8e\xca\xf7\x25\xbc\xb9\xbe\xe3\xdc\x55\x15\xf7\xb2\x6f\x85\xda\x97\x94\x00\x36\x8a\x96\x02\xb5\x34\x41\xdf\xd5\xa7\x57\x8f\xef\xb0\xa6\x78\x33\x7f\xef\x62\x1c\x1b\xab\xbc\x4a\x92\x84\xaa\xb1\x69\xfc\x77\x7e\xd5\xaf\x42\x0b\x00\x60\xa9\x68\xdd\xe3\xc5\x94\xca\x4a\xd9\x3a\x3a\xde\xd1\x33\xed\x20\xbb\x96\xe4\x43\x75\x41\xc3\x2d\x78\x7a\x7d\xed\x51\xa7\xc1\x03\x49\xfd\x2b\x4f\x00\x36\x80\xd6\x82\xde\x9b\x7e\xd4\x46\x55\x16\x21\xb3\x03\x99\xea\x9b\x86\xbf\x2a\xec\x3d\x7f\xf9\x21\xc3\xc2\x03\x6e\xfa\x8b\xab\x66\xb7\xb4\x6e\xc7\x03\x80\xa5\xa1\x9b\xc6\x7e\x21\x50\x6f\xdf\x87\x6d\xfc\xbf\x28\xd3\xb3\xc8\x3f\x64\x64\xed\xb1\x9b\xdc\xc2\xc6\x77\x43\x94\xb7\x21\xef\xb6\xf3\xd2\xf5\x76\x80\x4d\xa2\xa9\xe0\xd8\x17\x27\x76\x8a\x54\x31\xad\x57\xbc\x21\xd7\xd8\x3d\x32\xe2\xc9\x1f\x9f\x0a\x12\xde\x7d\x72\xd7\x90\xc1\x6e\x83\x7c\xef\xad\x4d\x7f\xbf\x12\x48\x44\x97\x81\x1c\xd5\x16\xe9\x4c\x57\x12\xc0\x9e\xa3\x7f\xde\x92\xfa\x45\x38\xa5\xd2\x75\xc6\x9c\xa6\xd2\x49\x92\x8e\x7d\xdc\xce\xdb\x7d\x87\x36\x9b\x34\x0b\xa7\x98\x45\x2b\x66\xd7\xd1\xd4\x92\x00\xf6\x1e\x0d\xce\x87\x2c\x91\x34\x87\x4b\x09\x29\xef\x2f\x8d\xa6\xd6\x53\xbc\xac\x2d\x71\x0e\xb5\x8b\x56\xfc\x48\xd7\x7c\xad\x8d\x8f\xb6\xbf\x24\x80\x04\xb0\x60\x34\xf8\xc1\x2c\xdc\xfb\x16\xef\xbe\x7f\xd3\x7a\xe5\x7b\x5d\xd1\x09\x91\x53\x26\x9f\xca\xd7\x66\x4b\xbe\xca\x7f\xcf\x5e\xed\x67\x1c\xe6\x13\x25\x01\x2c\x04\xb5\x27\x48\xfa\x61\xab\xdc\x43\x0e\x81\xaf\x26\x27\x63\x0a\x0f\x73\xd0\x0d\x1d\x10\xae\x8c\x8a\x92\xa5\x32\x97\xbe\x75\x97\xee\xb3\xd3\x7d\x12\xc0\x3a\xd0\x7c\xdd\x2e\x77\x4a\x62\x7a\xd7\xc0\xf9\x57\xe7\xbe\x33\x7d\x0b\x79\x78\xe3\xfc\xe3\xb7\x35\xf2\x3e\x54\x03\x8b\x1f\x5e\x3c\x6c\xbe\x46\xff\x95\x04\x64\x8e\xa0\xee\x0e\x7a\x7b\x85\xdf\x17\x6e\xdc\xe3\x59\x1b\x5d\x90\xfe\x32\x5c\x78\xc7\xce\xb3\x55\xb7\xe3\x65\x36\x3f\x5b\x91\x3a\xf2\x40\x73\xb7\xf0\xbf\x45\x05\xc8\x51\xfd\xfd\x41\x3b\x14\xc1\x88\x22\x83\x63\xde\x43\xd5\x81\x28\x3a\x38\x26\x18\xb6\xba\x44\x11\xc2\x31\x21\xd0\x36\xa2\x28\xe1\x98\x0e\xf8\x1f\xe6\x88\x42\x05\x31\x32\x47\xfe\xbe\x86\xb0\x05\x83\xaf\x89\x81\xb3\x0e\xc2\x36\x0c\x62\x52\x60\x08\x08\x7b\x31\x88\x99\x80\x77\x43\x09\xfb\x31\x88\xc9\x84\xf7\xa6\x88\x9a\x32\x1c\x53\x09\x6f\xab\x10\x76\x66\x30\x6c\x4f\xfe\xbe\x86\xb0\x3b\xc3\x77\x01\x5c\x51\xa2\x16\x0d\xc7\x74\x42\x61\x85\xa8\x4d\xc3\x31\x6d\xf8\xed\x66\xa2\x86\x0d\xc8\xf1\x92\x6d\xf9\xef\x7f\x41\x07\xa1\x59\x91\x34\xb7\x6d\xea\x6e\x1b\xb3\xd7\xe1\xa5\xc0\x5e\x49\xcd\x3e\xd1\xd9\xe8\x9d\xbe\xb4\xc2\x67\x2f\xf1\xd1\x6c\xbd\xc6\x38\x1e\xa4\x4d\x02\x58\x35\x5a\x32\xac\xcb\x02\x6e\x04\x91\x17\x79\xd9\x9f\xfb\xf2\x68\xbe\x75\xd8\xcb\xb4\xdd\xe4\x75\xdb\x8b\xad\xf5\x99\xeb\xbc\x29\xd5\xfb\xd8\x4d\x48\x00\xf3\x46\x59\xa0\x19\x5d\xa4\x75\x86\xef\x2b\x91\x13\x02\x6d\x95\xdb\x83\xe7\x0a\x7d\xde\x15\x2f\x88\xfe\xbe\x93\x3f\xa9\x62\x71\xee\xc9\x15\xaa\x40\x12\xc0\x9a\xd1\xbf\xef\x5e\xec\x52\x52\x7e\xb0\x6b\x8c\x2a\xa7\xc4\xff\x51\xcc\x99\xdd\x95\xaa\x4a\xdb\xee\x8b\xe6\x78\xd8\x6d\xa7\xd4\xbf\x5d\xb9\x90\x2c\xfc\x6f\x66\xe3\x21\x0a\x82\x62\x0d\x91\xe9\x38\xa6\x1a\x4e\xeb\x88\xcc\xc7\x31\xde\x50\x78\x21\x72\x01\xc7\x34\xc3\xf7\x10\xb6\xcf\x10\x93\x04\x35\x3b\xc2\x1e\x1a\x62\x3e\xc2\xf7\x10\x35\xd2\x38\x66\x10\xaa\xf9\x84\xcd\x34\xc4\x04\xc0\x13\x49\xd8\x51\xe3\x49\x16\xbe\x87\xa8\xad\xc6\x31\xfd\x10\x43\xd8\x5a\x43\xcc\x00\x9c\x00\x10\xb6\xd7\x10\x53\x0a\xb3\x12\x51\x8f\x8d\xc4\x0d\xfe\x0f\x26\xc2\x46\x1b\x66\x18\x9d\xbf\xaf\x21\x6c\xb6\xe1\x6b\x12\xe1\xe0\x84\xa8\xe3\xc6\x31\x5f\xa0\x9e\x48\xd8\x75\x43\x4c\x38\x4c\xe6\x84\xad\x37\xc4\x44\xc3\x4b\x55\x84\xfd\x37\xbe\xa4\xf0\x98\x12\xf6\xe0\x10\xe3\x01\xb7\x01\x61\x23\x0e\x31\xf5\x30\x33\x13\x36\xe3\x10\xe3\x06\x63\x4d\xd4\x91\xe3\x98\x15\x98\x0e\x08\xbb\x72\x88\xa9\x82\x1f\xf3\x23\x6c\xcd\x21\xe6\x1b\x8c\x35\x51\x7f\x8e\x63\xfe\x40\xdb\x08\x7b\x74\x88\x71\x84\x18\xc2\x46\x1d\x62\x1a\xe0\xfa\x10\x75\xeb\x48\x15\x64\x84\x63\x63\xa2\xbe\x1d\xc8\x51\xb8\x93\xfd\x37\x74\x8b\x40\x99\xa6\x11\x2d\xcb\xbb\xc5\xbb\x9b\xa4\x59\xfd\xac\x3f\xed\x25\x39\x78\xae\x78\x69\x7f\xc4\x8a\xb4\x05\xd4\x16\xee\x0d\xfe\x4c\xd1\xde\x60\xa6\x13\x28\xf3\x35\x0a\xd6\x09\x59\xf6\x88\x95\xec\xba\x1c\x75\xa2\x6b\xa0\xa0\x88\xf6\xa2\xa5\x5e\x54\x8b\x5b\x91\x7d\x5e\xf6\x6f\xd5\x7e\x72\x2e\x12\xc0\x26\xff\xe7\x1f\x37\x75\x35\x09\xc5\x7b\xcd\x5f\x96\x66\xdb\x7c\x2b\xa7\x55\x28\xe7\xd2\x65\xb3\xcd\x1a\x22\xbf\xcd\x42\xb9\x0b\x6c\xd8\x54\xbc\x83\x49\x40\xe6\x38\xf2\xb8\xf8\x57\xeb\x5d\x9a\x07\x6d\x24\xf8\x5e\xfa\xde\x33\xe7\xd6\xb7\x08\xd2\xea\x17\x70\x9d\xcb\x7f\x64\xbb\x55\x75\xce\x72\x78\x97\xa3\xf0\xbf\x59\x8d\x47\x28\x02\x26\x25\x22\xcb\x11\x7a\x05\x4f\x31\x91\xf5\x38\x66\x12\x7e\xd5\x8b\xc8\x05\x3c\x91\x1d\x87\x74\x84\x50\x49\x91\x73\xe4\xe6\xfa\xef\xc7\x56\x75\xa8\x42\x76\xe2\x62\xb7\xbc\x69\xbd\xd2\xda\x57\xce\x6b\x14\xfb\xd6\x1a\xd9\x4b\xc8\x65\xc2\x98\xbe\xbc\xde\xc1\x94\x75\xf0\x05\x4d\x79\xa9\xde\x06\xb7\x42\x87\x09\xc6\x23\x53\xdc\x91\x09\xa9\x9c\xdb\x82\xe3\xd3\x2e\x39\xa6\x8c\x15\x57\x6b\x4b\x66\x8c\x76\x58\x36\x71\x3c\x31\xa0\xb5\xd8\xac\xb3\x91\xf5\xd0\xbf\x2f\xf9\x82\xbb\x9c\xc3\xdd\xc4\xfe\xaa\x8f\xf0\x01\xb1\x0f\x2b\x29\x9b\xf7\x2f\x2d\x89\x9c\xa1\xcb\xdb\x27\x66\x2f\xc0\xaa\xfb\x95\x8a\x04\xb0\x29\xb4\xb7\x57\x34\x3e\x16\xa0\xd4\x55\xa2\xd8\x53\x4f\x55\x6e\x79\xe7\x5b\xd0\xb2\x3f\x5d\x55\xd3\xc7\x2f\x59\xb4\xce\x83\x5c\xe6\xed\x76\x97\x85\xff\xcd\x6c\x3c\xaa\x75\x30\x97\x10\x99\x8e\xb0\x49\x48\xc2\x89\xcc\x47\x72\x3d\x7c\x0f\x91\x0b\x38\x66\x0a\x52\x0b\x42\x5d\x0b\x2f\x91\x30\x9f\x12\x8a\x5b\x78\x29\xc6\xbf\x56\x4e\x24\x70\xe1\x31\x80\xb9\x84\x48\xe5\x42\x1a\x84\x4d\xf0\x96\x12\xa1\xde\x25\x47\xce\x4e\x4e\xe6\x42\x02\x58\x24\xaa\x04\x39\x3f\x4c\x9f\x14\x1b\x18\x8f\x13\x24\xbb\x38\x57\x62\xa2\x58\xff\xec\xf5\x26\xe5\x33\x76\xe3\x3b\x6a\x57\x7a\x1a\xee\xbf\xb9\x59\xb6\xc1\x5f\xd0\xdc\x70\xeb\x5d\xd9\x83\x23\x5a\xfd\x63\x93\x09\x2e\x33\x02\xed\x2b\xbf\x4e\x38\x6a\x5d\xe0\xd9\x73\x98\x46\x41\x65\xfb\xdd\x1b\xfe\xa2\xc6\x24\x80\x79\xa1\xdb\xd1\x5f\xab\x2d\x9a\xcb\x76\xdb\x43\xbf\xfc\x09\x2d\xf9\x72\xca\x48\x27\x53\xdb\x19\x9a\xcf\xb7\x07\x6b\xf3\xf6\x0d\xaf\x89\x6f\xbe\xbd\x91\xe0\xd1\xed\xb8\x6a\x7b\xac\xe1\x8e\x48\x58\x0b\x49\xa0\xd5\x58\x93\x85\xec\xfa\x59\x9f\x23\x6b\xde\xdc\x92\x2c\x5c\x9f\x2f\x38\x28\x92\x7e\x76\x6d\x2c\x08\xaa\xc0\x28\x45\x8c\xd9\x39\x1d\x9d\xcb\x78\x26\x02\x3e\x71\x73\x08\x08\x68\xe8\x1c\xec\x14\xbd\x7d\x7e\xe4\x8f\x52\xe6\x0f\xfb\xc1\xad\xee\xc2\xff\xe6\x26\x1e\xd2\x48\xc8\xf0\x88\x5c\x45\x18\x1e\x2c\x51\x44\xee\xe2\x18\x2f\xb8\x7d\x89\x5c\x46\x4a\x21\xdc\xbe\x44\x6e\x23\xdb\x17\x36\x5d\x84\x0a\x27\xc4\xb4\x43\x1a\x45\x28\x73\x42\xcc\x12\xdc\xf2\x84\x52\x27\xde\x1d\xc0\xcb\x15\x44\x7a\x27\x72\xb4\xa0\x3f\x84\x9a\x27\xc4\x04\x42\xda\x41\x28\x7c\xe2\xe9\x05\xee\x03\x42\xf5\x13\x8f\x01\x5c\x1f\x42\x05\x14\x62\x3c\x61\xdc\x88\x64\x50\x84\x42\xd0\xc1\x0b\xde\x44\x82\x28\x90\xa5\xd8\x44\xda\x38\xf5\x99\x68\x0f\x3a\xc2\x37\x9b\xd2\x92\xaf\x30\x79\x1b\xb4\x17\x5c\xe5\x74\xfb\x3d\x2f\xa0\x40\xce\xfc\x63\xa7\xe1\xd8\xc7\xb8\xcd\xaa\x0a\x45\x02\x24\x80\x15\xa3\x45\x48\xaf\xe8\xf3\xa4\xca\x9d\x02\x37\x5d\xe0\xac\xdc\xda\xaa\xa8\xeb\x7b\xa5\xd2\xed\x29\x7d\x45\xcf\xb2\xe0\x70\x32\x6d\x64\xb5\xc4\x46\x8c\xd1\x9b\x6d\x4d\xaa\xa5\x0b\xfb\xef\x1a\x51\x16\x6b\xd4\x67\x7f\xac\xf4\x7a\x16\x18\xb8\xdd\x35\x5d\xe1\xc6\x66\x4e\xb6\x1c\x8b\x78\x31\xbb\x15\x12\xc0\x66\xd0\xf9\x61\x87\xf8\xce\xdc\xc8\x92\x99\x4b\x91\x72\x2e\xf3\x65\x8f\x0e\x4a\xe4\x6d\xfd\x8c\xb1\xe9\x44\xf8\x1c\x4e\x0d\x3a\x32\x26\x69\xb7\xc1\x68\xdc\xd0\xb1\x01\xf7\x0f\xf3\xe5\xe5\xed\x5b\x9f\xe4\xfd\x28\x76\x55\xe0\xdd\x24\xb6\xce\x2d\x55\xf7\x67\x29\x45\x84\xbe\xeb\x75\x85\xd3\xd3\x44\x11\xe1\x7f\x73\x13\x49\xa4\x70\x15\x88\x5c\xc5\x31\xc5\xb0\x68\x11\xb9\x8b\xec\x44\x78\x49\x82\xc8\x65\x1c\x33\x03\xfb\x3a\x22\xb7\x11\x42\x0f\x8b\x09\x91\x02\x8e\x63\x32\x60\x0c\x08\x55\x70\x88\x71\x81\xb7\xe8\x08\xa5\x70\x88\xc9\x86\x27\x98\x50\x0f\x87\x98\x51\x48\xef\x08\x35\x71\x88\x49\x85\xe2\x26\xa1\x30\x8e\x67\x17\xd8\xa4\x11\x8a\xe3\x10\x93\x06\xb3\x0b\x91\x42\x8e\x50\x4f\xf2\x3f\x6d\xff\xf7\x51\xba\x81\x16\x37\x3f\x0e\xbe\xcb\xc9\xb1\x3d\xe2\x01\x54\xce\x36\x8b\x21\xef\x13\xb6\x38\x8f\x67\x97\x1e\x98\x02\x63\x07\xd7\xbd\xbe\x01\xb9\xc9\xe5\xf5\xc9\xb0\x3d\xe8\xcf\x27\x86\xa4\x8c\x84\x5c\x9f\xb8\xc4\xcd\x1b\xcf\x4d\x2b\x35\xaa\xad\x07\x6a\x29\xe6\x53\x5b\x5f\x8c\xd6\xfe\x8d\x91\x2a\xaa\xe3\x9c\x00\x16\x8e\x4a\xe5\xcb\x26\xbf\xa2\x84\x79\x35\x2d\x98\x53\x7f\xf0\x85\xaa\x8a\x6d\xe2\x4d\x7f\xb0\xb7\xf2\x8c\x81\x58\xeb\xbc\xcd\x22\x96\xf2\xb5\x1d\x60\x99\xe8\x69\x24\x3f\x20\x66\xd0\xfa\xae\x77\x62\xc1\x6c\xe7\x21\xc3\xc6\x50\x97\x0a\xd1\xd2\xe7\x0f\x44\x97\x33\x72\xbb\x05\x07\x82\xd2\x2e\x5a\x02\xac\x00\x7d\x7c\x4f\xfb\xd1\x9c\xd4\xaf\x66\x97\x9b\x62\x49\xef\xf9\x59\x54\x03\x0f\x27\xc6\xd0\x51\x73\xfb\xde\xf3\xd9\x11\x4c\x62\xb3\x2e\x4d\x77\x02\xd8\x7b\xb4\xc4\x7f\x9c\x19\x7d\x4d\xa6\xc7\xec\x57\xdd\x35\x46\x3b\x47\xbe\xc5\xd6\x84\x53\x65\xb3\xf0\xd4\xa5\xfb\x59\xaa\xce\xe6\xd1\xea\x64\x32\x00\xab\x47\xa7\x14\x0e\x5b\xa2\xd9\xa3\x76\xe9\x0c\xb8\xf1\x5a\xb3\xa8\x07\x0e\x66\x85\xc4\x50\xf4\xdd\x7e\xf7\xb0\x4b\xec\x87\x6f\x98\x86\x60\x6a\x0a\xc0\x26\x50\x42\x70\xe7\x59\x21\x47\x79\x9b\x05\x5f\xd3\x31\x6d\xe7\xa2\x40\xcf\xcf\x8c\x96\xd6\x29\x67\xae\xfb\x5e\xf0\x1e\x65\xb8\xd7\xf4\x98\x7d\x0b\x00\xd8\x18\xfa\x7c\xa3\xfc\x0d\xaa\x7c\xfe\x1f\xd5\x12\x64\x2a\x66\x05\xba\xcf\x46\x7b\x2f\xb4\xd8\x2a\xc6\x71\x64\x71\xcb\x95\x5d\x14\x0e\x1d\xdf\x06\xb0\x29\xf4\xf1\xdd\xbb\xe8\x22\xcf\x92\x19\xf6\x71\xe8\x1b\xd8\xa6\x87\xb2\x67\xc7\x58\x8c\x2c\x5e\xf1\x3b\x7e\xe3\xf7\xec\xc5\xfc\xaa\xfb\xcd\xd5\x4e\x00\x8b\x44\x9f\xe7\xf8\xca\x55\xc9\xa5\x75\x3f\x60\x87\x32\xcb\x36\x81\xd4\xb3\x0e\x09\x66\x92\x3b\x22\x2f\x39\x34\xda\x1c\x12\x39\xa2\x51\x6a\x64\x05\xb0\xe7\x28\xbd\x32\xa1\xd1\x6d\x8a\x78\x2b\x74\x22\xe3\xd9\x33\x1b\x8a\x89\x9c\xa7\xc9\x71\x1d\x27\x9c\xee\x68\x49\x86\x45\xec\x50\xde\xbf\xae\x7d\x16\x60\x15\x28\xbb\xe2\x37\x6e\x2d\xb4\xdb\xde\x16\x71\x58\x80\xbb\x35\x56\xcd\x3b\xec\x7e\xf8\xde\x6c\x56\x03\xf9\x9b\x47\x96\x13\x87\x0e\x9f\x94\x0e\x05\x00\x8b\xfd\x9f\x7b\x1a\x1f\x0f\xbf\x29\x79\x59\x7a\x96\x93\xed\xda\x00\x8b\xdb\x65\x46\x1b\xe6\x77\xa9\x3e\xa6\x0e\xb4\x8d\xcb\xc6\xaf\x72\x0b\xde\xfe\x06\x58\x05\xba\x6f\x9e\x8d\x1c\x60\x64\x5e\x08\xca\xcd\x56\x54\xf6\x2e\x4d\x70\x72\xbd\x19\x7d\xc4\x88\xca\x2e\xcf\x33\xee\xd0\xda\xb7\xd1\xeb\xb9\x2e\x00\x60\x1e\x28\x99\x2c\x6a\xac\x56\x6c\xdd\xb2\x2d\xc4\xbc\xe5\x80\xd8\xb9\x3b\x2d\x0f\xae\x4f\x5e\x65\x9b\x53\xd4\xa9\xa8\x10\xa1\xd5\xa7\xca\xed\x3c\x09\xb0\x55\xb4\x8f\xf5\xbb\x4f\x3f\x2b\xb0\x27\xf9\xd8\x8e\x1b\x34\x2d\x74\x33\x35\x5f\xe9\xc8\x49\xf2\x76\xdb\x96\x98\x4d\x84\xee\x7c\x10\xb6\xd2\xf0\x24\x01\xac\x06\x7d\x3e\xa9\xe9\x8f\x1c\x47\x47\x93\x78\x77\x7d\xa5\xc6\x63\x8a\xa5\xda\xf3\xe5\x96\x1f\x0f\xcc\x8e\x96\xd2\xcc\x28\x17\x18\xe4\xdb\xca\x39\x01\x2c\xe3\x7f\x3e\xac\xb3\xea\x29\xf0\x0b\xdb\xcd\x71\x4e\x92\x8c\x27\x8e\xd2\xdb\xfa\xed\x53\x72\xcd\x88\x58\x6f\x0b\x5f\xdb\x72\x5f\xda\xb0\x01\x37\x80\xe5\xa0\x1b\x8d\xa6\xe1\x27\x8b\x50\x9f\x58\x28\x4d\xab\xe9\xc4\x33\xa9\x71\x2e\xff\xe3\x17\x12\xc4\xe7\xe9\x5f\x59\x95\xc5\xa5\xc8\xa4\x4e\x8c\x00\xac\x1d\x8d\x65\xe1\x3d\xa5\xb1\xe7\x65\x42\x37\xb7\x1d\x2d\x28\xdf\x2e\xa2\xee\x15\xb1\x6a\x4b\x33\x21\x9e\x6c\x3f\xed\x99\xdc\xe3\x21\x9c\x72\xcb\x09\xc8\xa0\xff\x01\x94\x64\x7f\x29\x69\x5d\xf0\xae\xc1\x32\xdb\xa5\x97\xd7\xcc\x34\x1b\x9c\x6d\xaa\x6e\xeb\xf4\xa8\x9d\xd4\x2e\x95\x51\x12\x37\x99\x59\x01\xd8\x27\x74\x23\x38\x4a\x26\xb1\xd2\x45\x24\x4d\x65\x51\x45\x5f\x35\x48\x98\x18\xbe\x31\x79\xf7\xd3\xe3\xb3\x92\x0f\xe5\x19\x44\xf3\x5b\x7f\x94\xd0\x00\x6c\x0d\x35\xa6\x8d\xa5\xcf\xed\x62\x2e\x8f\x58\xf4\x55\xd3\xf4\x9c\x62\x2b\x8e\x43\xb5\xb3\x53\x66\x37\xef\x57\x3b\x69\x59\x9e\xec\xbe\xec\x5c\x04\x00\xe6\x8b\xce\x39\x0d\xd3\xac\xd7\x3b\x27\x6b\x02\x9d\xf4\xfb\xa6\x3b\xd6\xb6\xbb\xd4\x0d\xdc\x2f\xa9\x72\xcc\x96\x9c\xdb\x2e\x2f\xf9\xc7\xec\xba\x00\xc0\x4a\xd0\x85\x6d\xd6\xb6\x7d\xd2\x2b\xb4\xfb\x6c\xdb\xaa\xab\x88\xdb\xc5\x95\x15\x55\x5f\xbf\x31\xea\x00\x69\xc5\x79\x72\x31\xc6\x2d\xda\xce\x06\x4e\x00\xab\x45\x87\xe9\xa3\x79\x5a\x89\xb7\xe7\x0f\x5d\x95\x53\xba\x77\x2e\x2b\xd6\xc3\xce\x2f\xa3\xb9\x62\x53\x40\x82\xe0\xcd\xb3\xcd\x51\xaf\xcb\x55\xc6\x01\xf6\x0b\x15\x28\xf2\x3d\xd7\x7b\x73\xc4\x1b\x96\x4c\x0c\x3f\x4d\x53\xbb\x71\x37\xea\x5c\x2a\xbc\xb1\xd3\xd5\xcc\xd0\x9c\xec\xd3\x79\xc1\x7a\x83\x4c\x80\x8d\xa3\x3f\x16\x8c\x5a\xb6\x14\xda\x51\xdc\x46\x1d\xaf\xa3\xf2\x6a\xe5\x9a\xc3\x7d\x51\x61\x7f\x81\x8f\x46\x8e\xc1\x4f\x4b\x0b\x07\xfb\x1a\xc6\x69\x49\x00\x5b\x40\x17\xf6\xac\xf3\xb1\xca\xd6\x47\xa3\xa6\x2f\xac\x5e\x6c\x9e\x48\x5f\xbb\xad\xe0\xe2\xe1\x2c\xd6\x7e\x67\x2f\xb0\xe9\x48\x2d\x3b\x50\x55\x88\x66\x56\x5d\x71\xfd\x37\x1d\xa9\x06\xde\xbe\xcd\x52\xe7\x3c\xc5\x8e\x45\xaa\x6d\xed\x6a\x1a\x05\xc2\xe1\x6b\xcf\xa9\x27\x47\xf2\x74\x48\x40\x06\xd5\xfe\xb5\xbe\x63\xd4\xca\xc7\x93\xc4\x29\x1b\xf4\xd6\xe2\xdf\x05\x06\xa4\xe6\x0d\xce\x9a\x7c\x2e\x53\xe5\xa6\x14\x2a\x3e\xb6\x63\x76\x10\x79\x94\x56\xb0\x7b\x6f\xdd\x5e\x1e\xfd\x92\xd7\x77\xeb\x03\x14\x38\xd9\xb6\x5d\xa7\x04\xb5\x7e\x2e\x3b\x6c\x12\xea\x8d\x62\x0e\xf6\xf5\x3b\x01\xcc\x03\x35\xda\xe0\xf2\x7c\x72\x43\x32\xe5\x74\x6f\x8e\xef\x62\xe5\xe5\x0a\x67\x66\x4d\x0e\x86\x94\xfc\x63\x3e\x05\x7a\xc5\x97\x96\x3f\xf4\x72\x01\x2c\xf4\x7f\xfe\x61\xe1\xf8\x01\x87\xa3\x27\x3b\x2e\x80\x95\x2b\xbe\x6a\x66\x89\xed\xb3\xf3\x7d\x42\xac\x17\x72\xa8\xd4\xcb\x53\x44\xe2\xa4\xb3\xeb\x00\xd6\x8f\x3e\x6e\x76\xa6\xf8\xe0\xaa\xdc\x15\x19\xd3\xdd\xa5\x17\x5e\xfe\x19\x5a\xe3\x59\x1b\x63\x3a\x96\xb3\xcf\x40\x4f\xf2\xc1\xbb\x79\x36\x76\xf4\x23\x74\xce\xbb\x96\x76\x37\xe9\x3e\x5f\x4d\x90\x0e\x0f\x98\xfe\xb4\x87\x8a\x9a\x67\xa7\xe1\xe1\xa2\x36\xaf\xe2\xae\xba\x20\xa3\x4a\x21\x41\x74\x3a\x3f\x38\xa7\x7f\x95\xd6\xe6\xde\xeb\x85\xf8\x6f\xbb\xf4\x5d\xd7\x7f\xf2\x14\xff\xa8\x94\xd2\x6d\xed\xdd\x7a\xcb\xb8\xf6\x81\xe6\x3b\x12\xc0\xd6\xd1\xe4\x68\xce\xf6\x5b\x75\xb6\x98\x31\x80\x82\x73\xf6\x8a\x14\xb8\x5c\x4d\x29\xf5\xbc\xe2\x68\xf5\x1d\x7e\x46\x5e\x37\x2a\x15\x7f\x11\x8d\x0d\x82\x81\xd2\xbe\x05\x5a\xef\x13\x1c\xf4\xb1\x32\x55\xd7\x6f\x9d\x0b\x7e\x53\x9f\x31\xa4\x43\xf1\x4a\xf2\xe4\x6c\x5d\xb9\xe7\xe4\xdb\x90\x2f\xc7\x68\x9d\x00\x06\xd0\x6d\x38\x63\xae\x77\xa7\xf3\x9e\x4a\x24\x17\xff\x98\x2c\x59\x0a\x7f\x69\x78\x66\xd9\x82\x8c\xae\xe4\xa9\x7a\x4a\x31\x7d\x8e\x3d\x9f\x7e\x00\x2c\x14\x0d\xf9\x22\x6b\x9a\xa1\x48\xcb\xcb\x72\x41\xbb\xee\xbd\x87\xaa\x72\xb7\xeb\x2b\xe6\xe9\x35\xae\x52\xcd\x3c\x1f\x7a\xd3\xbd\xda\xe3\xdb\x07\xb0\x26\xb4\x8e\x31\xd5\x35\xec\x2f\xcf\xf9\xe0\xba\xcf\xc9\x6e\x57\x3a\x55\x48\xc3\x38\xad\x88\x74\x42\xeb\x07\x2f\x0a\x5b\x86\x5c\x43\x03\x07\x37\x00\xb0\x37\xe8\x99\x3b\x7e\xf8\xfb\x65\xad\x73\xdf\xba\x45\xee\x65\x19\x75\x7c\x35\x76\xa7\x10\xdb\xbf\xd7\x66\xaa\x6d\x75\x27\x6b\x94\x94\xc5\x42\xc5\x75\x80\xad\xa0\xd9\xcb\x36\xfd\x37\x8b\xdf\x3e\xbd\x2d\xa7\xdc\xde\x4f\x0a\xc9\x5f\x50\x36\xed\xb1\xe2\xe5\x37\xeb\xe0\xb9\x77\xdc\xba\xee\xfc\xa6\x13\x0a\x00\xc8\xa8\x21\x8f\x57\x36\xd7\xa7\x9c\x33\x3b\x56\x7f\xe9\x3b\xb3\x22\x4b\xca\x72\x58\x49\xa1\xdb\x29\xc7\xe0\x1f\x96\xd3\xaf\xaa\xef\x38\x1d\x4f\x55\x05\x32\x46\xe8\x4d\x84\xda\x33\x69\x7a\xfb\xf8\xe4\x36\x9f\x62\x60\xbd\xd2\x21\x50\xbf\x5d\xcf\xf7\x46\x32\x4b\x38\x2d\x69\x67\x84\x96\xce\xb6\x33\x56\xc8\xa3\x01\x7b\x79\x7b\x9b\x7f\x0f\xf1\xdc\x78\xe2\x78\xfc\xa0\x70\x74\x2f\xdd\x15\xd6\x9c\x4d\xca\x71\x17\xf5\x69\x9c\x4a\x4f\x2f\x5f\xb3\x75\x02\x58\x19\x5a\x93\xa6\x12\xdd\x7d\xa3\x72\x96\x24\xe2\x39\x79\xea\xec\xe8\x3f\x34\x78\x19\x90\x17\xf5\x07\x97\x24\x0f\xe4\x68\x7d\x6a\xc9\xf9\x6c\x0a\xb0\x9f\xe8\x1a\x95\xf5\xb0\xad\x6c\x8b\xfe\xe9\x3b\x3a\xb5\x53\x23\x6d\xcc\x39\x95\xfa\xd4\xc9\x9c\xf2\xc7\xb2\xac\x77\xbd\xa8\xb9\x32\xbe\xf7\x35\x01\x6c\x1a\x3d\x71\xe5\x61\x43\xfe\xe1\x47\xd9\x0f\xa6\x2d\x4a\xae\xac\xaa\x8d\x67\x30\x6a\xf8\xfb\x7c\xb2\x79\x9c\x2a\x7c\x63\xa9\x9e\xce\x9e\x11\xfd\xff\xec\x29\xd9\x8f\x02\x6e\xd9\x61\x9e\x35\x9d\xda\x51\x12\x87\x43\x1f\xf7\x79\x28\x2a\x33\xa9\xd0\x9c\x1f\x8d\x3f\x79\x53\x7c\xfa\x22\xfa\xf5\x44\xeb\xdd\x59\x73\x99\xba\x79\x87\x8c\xee\x25\x1f\x9f\x2f\xfd\xea\x42\xce\x6a\x12\xf4\x25\xad\x77\xb0\xd9\x41\xaa\x47\x73\xb1\xa7\x01\x79\x34\xfd\x1b\xc7\x9e\x8c\xe5\xb3\xdf\x65\xe4\x24\x62\x93\xcf\x69\xef\x8a\xd1\x71\xfb\xc1\xf4\x48\x2a\xf3\xf4\x66\x2f\xb7\xda\xec\x6b\xb4\x91\x14\xff\xc6\xd1\x80\x6c\x2c\xf9\x7f\x3f\x09\xfa\x80\xa6\xfd\x41\xaf\x9f\x39\x91\x21\xb4\x14\x07\xd4\x39\x63\xa4\x15\x6b\xb2\xaf\x54\x5e\xd5\xd6\x6f\xd4\xcc\xbf\xc0\xc8\xea\xb9\x63\x5e\x68\x37\x09\x60\x59\xe8\x26\x71\xfe\xe3\xe7\x4c\x6f\xd4\x71\x51\x70\xc7\xa7\xb6\xc7\xd8\x0f\xbd\x28\xf3\x3b\xbe\xa3\x9c\x97\x5f\xaf\x30\x0b\xfd\x7a\x9b\x9d\x56\x02\x00\x96\x81\x36\x66\x62\xaf\x97\xdf\x67\x26\xb5\xb7\x5c\xf5\x94\xa0\x2b\x0d\xbb\xbf\xab\x40\xae\xc0\x21\x9c\x71\xe7\x99\xbb\x66\xa7\x6e\x26\xbf\xb1\x0e\x03\xd8\x17\xb4\xef\x4b\x7d\xa9\x85\x19\x3f\x7b\xe9\xd7\xed\x57\xe9\x34\x5a\xb3\x53\x76\xd3\xd1\x88\xc6\x67\x4f\x43\xee\xd2\x18\x0f\xb9\xfc\xfa\xb0\x33\x85\x04\x30\x1f\x74\xd6\x2a\xdf\xc5\x11\x7f\xb6\x68\x33\xc3\xa6\xbb\x87\xce\x3e\x9a\xff\xb3\x3b\x73\x31\x64\x8a\x22\x7c\xaf\xb6\xe1\xc5\xfa\xe8\xc2\x32\xae\x42\xe1\x7f\xf3\x12\xc8\x6d\xf9\xfb\xeb\x19\xa8\xac\x10\x7a\x0a\x31\x59\x90\xf7\x13\x7a\x0b\x31\x19\xb0\x2f\x23\x72\x19\xc7\x7c\x81\xfd\x1f\x91\xdb\x38\xc6\x07\xf6\x17\x84\x9c\x1c\x62\xc2\xa1\x3f\x84\xc4\x1c\x62\x32\x61\xcf\x48\xc4\xce\x71\x4c\x01\xc4\x10\x32\x74\x88\x79\x0f\x15\x0f\x42\x9a\x0e\x31\xf5\xb0\x5f\x22\xe4\xea\x10\x33\x01\x7b\x46\x42\xbe\x0e\x31\x63\x10\x43\x44\xda\x71\xcc\x14\xc4\x10\x12\x77\x88\x89\x84\x18\x42\xf6\x0e\x31\xcf\xe1\xbe\x26\xa4\xf0\x10\x53\x01\x15\x43\x42\x1a\x0f\x31\xb1\x70\x4d\x09\xb9\x3c\xfe\x1e\xb8\xdf\x08\xf9\x3c\xc4\x78\x40\xb5\x8c\x88\xd4\xe3\x98\x55\x38\xe6\x21\x22\xf6\x38\xa6\x06\x62\x08\xc9\x3d\x7e\xb6\xa1\x3f\x84\x0c\x1f\x62\x72\xe0\x1e\x25\xa2\xf9\x38\xa6\x9d\xe9\xef\x38\x89\x90\xeb\xff\xc5\xc8\x9c\x81\x3f\x5c\x24\xe2\xfb\xf0\x35\x9f\xe0\xd6\x21\x24\xfd\x10\xb3\x06\xb7\x01\x21\xf1\x87\x18\x5f\x28\xed\x10\xb1\x7f\x1c\x53\x02\xb7\x01\x61\x07\x00\x31\xb5\x50\x6c\x26\x6c\x03\x20\xe6\x17\x94\x83\x88\x7a\x01\x1c\x33\x0e\xbf\xbe\x41\xd4\x0f\xe0\x98\x85\x4d\x50\x68\x25\xea\x0c\x80\xac\x10\xd7\x2d\x17\x12\xc0\xa2\xd0\xab\xad\xc3\x5a\xe3\x83\xdf\xaf\x3f\x7d\x2c\x7a\xc2\x4f\x6b\xb3\xaf\xc9\xe9\x93\xca\x14\xea\xbd\x8c\x27\xa9\xdc\xef\xde\xa9\xea\xd9\xb9\x76\x8c\x04\xb0\x21\x94\x82\x5a\xbf\x4b\x1c\x8e\x70\x52\xe1\xfd\x6a\x4e\xbd\xc3\xe7\x15\xd7\xcc\xab\xe4\x8b\xbc\x59\xc2\x1e\xde\x17\x7f\x19\x2d\x45\xfe\x6c\x2c\x23\x01\xac\x01\xad\xe7\x7b\x28\xa7\xf9\xb5\xe6\x77\xf2\x1f\x12\x2c\x3b\xac\x30\xb8\xd4\x1d\xbd\xea\xfe\x3c\x68\xa7\xfc\x9f\xb0\x3f\x06\x6a\x1d\xc9\x95\x59\x1b\x69\x1d\xed\xb4\xba\x95\xc1\xbb\x5f\x0f\xee\x09\x8f\x1c\x92\x64\xd9\x86\xfd\x09\x91\x62\x6a\x8b\x98\xd9\xff\x21\xb7\xb9\x7f\x9f\xb4\x66\xc9\xb4\x19\x09\x60\x7d\x28\x1f\xe1\xb4\x10\xf0\xbf\xeb\xde\x30\x11\x11\x3c\x62\x74\x2b\xec\xe9\xdb\x48\x9f\xfe\xf4\xfc\x57\x9a\xe9\x9b\x7f\x7c\x6d\xd5\x7f\x24\xc5\x2c\xfc\x6f\x6e\xe2\x11\x8d\x82\x9f\x30\x20\x72\x15\xc7\x0c\xc1\xc3\x48\xe4\x2e\x8e\x69\x80\x05\x9d\xc8\x65\xa4\x00\xc2\x5d\x45\xe4\x36\x8e\xe9\x83\x33\x64\xa2\x5e\x10\x3f\xf4\xf8\x3f\xd4\x26\x6a\x0a\x81\x9c\x1c\x17\xad\xa3\x2b\x09\xc8\xa0\xcd\x5b\xf3\xad\x8f\x65\x4d\x3e\xca\x6c\x1f\xa7\x2f\xd1\xb8\x5b\xbc\xaf\xe8\x7f\xb5\x70\x9e\x5d\x56\x48\xff\x6b\xe7\x9b\xae\x7c\xb1\x38\x03\x12\xc0\x5c\xd1\x4d\xd2\xd5\xcb\xcb\x87\x8d\x14\x86\xd4\xbb\x85\x5f\xd3\x7d\xac\x76\xe3\x68\xe3\xda\xd5\xd6\x2f\xeb\x1f\x2d\x37\x6f\x35\xfd\x6a\xa4\x3f\x4c\x02\x58\x32\xca\xfa\xd6\x72\xf8\xee\xdc\x79\x28\xf1\x8e\x29\x48\x92\x0b\x38\xd5\xf1\xf0\x97\x1e\xab\x38\x51\x99\xbe\x57\x29\xf0\xce\x15\xe6\xad\xa7\xb2\x49\x00\xcb\x43\x1b\x1b\xef\x31\x95\xdf\xbf\xa9\x4d\xee\xad\xdd\xf8\xce\xf0\xd0\x9a\x7b\xf5\x6a\xdf\x96\x14\xf7\x6f\xa6\x2e\xa5\xad\x6b\xcd\x16\x2a\xab\x0f\x36\x0e\x12\xda\x38\xb1\xf5\x05\xf6\xdf\xa3\x28\x52\xa8\x51\x8f\xf5\x2c\x1e\xa9\xa1\x7c\xb5\xe6\x37\x1e\xec\xf3\x64\x29\x3a\x7d\xb6\x50\x9b\xfd\x92\xd1\xc6\x01\x47\xa7\x15\x91\x6d\xd6\xe3\xf1\x7a\x95\xd7\x05\xcf\xba\x96\x1e\x27\x19\x15\x1b\x0e\x3b\x26\xa5\xe8\x9d\xaf\x91\x5f\xfc\xdc\x2e\x7e\xd7\x91\xea\xf8\xbf\x85\x05\x5f\x00\x98\x09\x88\x22\x83\xaf\xb3\x2b\xdc\x4f\x44\xd1\xc1\x31\xc9\x90\x20\x12\x45\x08\xc7\xe4\xc1\xac\x4b\x14\x25\x24\x4b\x41\x12\x46\x14\x29\x24\x83\x42\xb1\x9f\x50\x68\xc0\x8b\x3c\x3c\x87\x84\x6a\x03\xc4\x84\xc2\x58\x13\x49\x0e\x38\xa6\x9f\x01\x4e\xb5\x89\xc4\x07\x20\xe7\x78\xdc\xf1\xbf\xa9\x76\x00\x7a\x77\xdb\x94\xcf\x8e\x4c\xa5\xfb\x60\x6f\x93\xbc\xf0\x34\x2b\xe6\x10\xac\xf9\x3b\x7d\xfd\xb7\xf6\x61\xb3\x2f\xf6\xa7\x2b\xd8\xb2\x3c\x64\x37\x18\x25\x9a\xa6\xf3\xe3\xfc\x8f\x8f\xb0\xa8\xd4\x9a\x86\x68\x08\x1e\xcd\xd6\x39\x1b\xfc\xec\xea\xab\x65\x39\x46\x3f\xbb\x8c\x83\xcf\x6e\x5c\x6d\x1d\x20\x01\xec\x0d\xda\x76\x65\xfb\xcd\xd8\x37\x5f\x90\xec\xc1\xf8\x77\x4d\xf5\xfe\xb0\x5a\xf7\x6a\x5c\xe5\xfb\xfc\x6a\x4d\xdd\xde\x4b\x55\x7d\x26\x36\x6d\x9d\x04\x30\x2f\x54\xb8\xc8\x61\xf5\x79\xc3\x70\xbe\x74\xd7\xf5\x90\xb3\x8d\xb6\x51\x07\x13\x97\x1d\xb2\x7c\x4e\x87\xe8\x53\xb3\x1d\x9c\x31\x3d\x2f\x53\xa5\x4a\x02\xd8\x2b\x54\x6f\xd3\x21\x6d\xbb\x79\x8e\x96\xf1\x75\x00\xf7\xf6\x36\xa1\xd9\xcf\xa3\xe5\x42\xd8\xf8\x3d\xe1\x93\x3b\x5a\xed\x5f\xfd\x69\x79\x8e\xf9\x09\xff\x9b\x9b\x78\x48\x03\xe0\x25\x06\x22\x57\x11\xce\x0d\x53\x35\x91\xbb\x38\xe6\x0d\xe4\x5a\x44\x2e\xe3\x18\x2f\x38\xab\x22\x72\x1b\xc7\xbc\x62\x81\xf7\x70\x88\x44\x27\x20\xc7\xe8\xfe\xff\x3f\x71\xd5\x8b\x8a\xc9\xbc\xd2\x25\x9a\x3d\x47\x57\x36\x9f\xb4\xcd\x58\x09\xf0\x71\x36\xad\xa3\x6b\xfd\x18\x24\xfe\x72\xf2\x92\x92\x9a\xfa\xcb\xe2\xe1\x39\x12\xc0\xb2\xd1\x2d\x85\xe5\x50\x0c\xbd\x25\xa3\x8c\x75\x63\xb3\xdb\x91\xb6\x3f\xa2\x94\xc1\x7f\xe5\x76\xd5\x95\x12\x63\xb3\x4f\x64\x5f\xa6\x8b\x8d\xd8\x49\x00\x4b\x42\x97\x90\xfe\xe0\xf6\xc9\x8a\xdf\x12\x79\xb7\xaf\xbb\x4c\xdc\x3a\xc8\xfc\x29\x9a\x67\xdb\x4d\xe5\x7d\xa4\xf7\xd7\x7f\xdc\xae\xcf\xba\x26\xd9\x40\x02\xd8\xeb\xff\xf9\xf6\x76\xe3\x90\xa9\x62\x03\x7b\x33\xd5\x87\x46\xe5\xb3\xea\xf5\x69\x93\x07\xb7\x26\x2e\xef\x1f\xad\xfd\xca\x6d\xbc\x6d\x4e\xc8\xe1\x94\xf0\xbf\x99\x8d\x87\xa8\x17\x52\x65\x22\xd3\x71\x4c\x36\xdc\x26\x44\xe6\xe3\x98\x24\xc8\xf9\x88\x5c\xc0\x31\xaf\x61\xc6\x22\x92\x00\x71\xcc\x3a\x6c\xb3\x88\x64\x40\x1c\xe3\x02\xb7\x16\xa1\x14\x08\x31\x00\xf2\x51\x42\x3d\x10\xcf\x72\x30\x33\x12\x8a\x82\x10\xd3\x04\x63\x40\x28\x0c\xe2\xc7\x0b\x56\x07\x42\x75\x10\x62\x56\xe0\x75\x5d\x42\x89\x10\x16\x48\xb5\xbf\x10\x22\x9d\x10\x87\x18\xc1\x03\x49\x24\x18\x02\x39\x4a\x32\x46\xf2\x8d\x03\xd9\x8a\x8e\x30\x42\x6f\x7a\xd1\x9f\x29\xdd\x14\xba\xc7\x5b\x6f\xe6\x90\xd0\x98\xc0\xc8\xc2\xf7\x84\xa3\xf3\x94\x29\x7a\x59\x17\xe2\xaf\xf9\x1f\xce\xdb\x28\x0c\x28\x2b\xe8\xb9\xfc\x89\x6a\x73\xbc\x5d\xdb\x07\xb9\x03\x4a\xd7\xa7\x5a\x14\x12\x6b\x55\x76\xed\xed\x99\xca\xd2\x3c\x47\x9e\x66\xf7\x5a\xb2\x70\xa3\x33\x47\xa9\xaf\xd6\xd1\x8f\x7d\xdb\x33\x62\x9f\x5e\xd2\xd3\x28\xeb\x1a\x39\x13\xa0\xea\xa1\x73\x75\xbf\x42\xa2\x81\x31\x5b\x58\x1a\xfd\xc3\xf9\x71\x12\xc0\x66\x51\x71\x3a\x37\xde\xa1\xb1\xa8\xb6\xc7\x30\xe9\xaa\xe6\x60\x4b\x96\x44\x91\x37\xe5\x6d\x7f\x86\xe2\x67\x7a\x53\xd2\x15\xac\xc3\x37\xf5\xed\x85\xff\xcd\x6c\x7c\x21\x5a\x61\x13\x46\x64\x3a\x52\x0a\x61\x99\x26\x32\x1f\xd1\x23\x20\x8d\x25\x72\x01\xc7\xcc\xc2\xc3\x45\x28\xdf\x42\x4c\x19\xd4\x23\x08\x35\x5c\x88\xf9\x09\x0f\x17\x91\x90\x8b\x63\xa6\x29\xe0\x85\x59\x22\x49\x17\xc8\xc5\x92\xc9\xfc\x77\xe7\x72\x15\xd5\x98\xcd\x46\x53\xbe\x6c\x2b\x36\x8d\x2d\x72\x8f\xde\x69\xa9\xaa\x51\xea\xda\xb2\x29\xad\xf8\x6a\xca\xcf\x23\x0c\xfa\x5b\x78\x8d\x94\x37\x6d\x70\x28\x54\xc2\x96\xbf\x2c\xf0\x2b\x75\x52\x3a\xb5\x21\xc7\x3e\xcc\x5a\x66\x42\x35\x74\xfe\xa8\xc6\x76\x96\x9a\xdb\x1f\xc6\x1a\x85\x72\x03\x55\x5f\x93\x00\x56\x88\x6e\x5d\x73\x86\xe7\xd7\xec\x45\xb3\xaf\xba\x5e\xb0\xa5\x55\xae\xc9\xd0\xd3\xfe\x94\xe2\xdd\x54\x2d\xd3\x2c\xea\xb6\xde\x4d\x19\xf6\x40\x83\x04\x64\x30\x74\x44\xdd\xe4\x24\xf6\x5d\xab\xf5\xde\xa3\x05\x76\xd9\xd7\x03\x97\xcd\x43\x9e\xcd\x6b\x5a\x3d\x9e\xac\x12\xbd\xc3\x6f\x6f\xe3\xe0\xfb\x4d\xf8\xdf\xac\x46\x94\x14\x18\x55\x22\xcb\x11\xd2\x08\x57\x8f\xc8\x7a\x1c\x53\x08\x15\x0e\x22\x17\xf0\xbc\x80\x41\x2e\x47\x24\xb2\x03\xb9\x2d\x4c\xd8\x7f\x5c\xee\x03\x5a\x48\x1b\x1d\xc9\x7e\x0f\x8e\x2e\x99\x9a\xca\xdb\x86\x44\xcf\xb0\x88\x1a\x85\x08\x68\x45\x5b\xa4\x71\xb9\xcb\x05\x1a\x16\x1f\x2e\xa1\x26\x01\xcc\x0d\xcd\x0b\x87\x47\x99\xd9\x57\xac\xf2\x39\x7f\xf2\x58\x64\x73\x3e\x4a\xed\xbb\xd4\x71\x23\xa3\xfd\xab\x17\x77\xf1\xd5\x5d\xbc\x83\x3b\x5a\xf6\x92\x00\x16\x8c\x4e\x14\x4a\x86\xc4\xf5\x34\xef\x09\x06\x67\xd8\x73\xb2\x77\xf8\x5a\xed\x7f\x6e\xb4\xaf\xa9\xf9\x29\xdf\x34\x6d\x79\x4a\x95\xed\x90\xfa\x46\xde\x99\x43\xf3\xc2\xb8\xe0\x88\x39\x97\xdc\xf5\xca\xa3\xe6\x3d\xd7\x26\xcd\x6e\xad\x6f\xa5\xea\x51\x6b\xdb\x19\x63\x36\x77\x28\x25\xa0\x3d\xdd\x83\x92\x04\xb0\x31\x94\x5b\xd6\xba\x3f\x8d\x18\xda\x13\x5e\x75\xda\x66\xfa\x0d\x25\x4b\x8e\x96\x12\xdb\x15\xd3\x2b\x53\xca\x45\xbe\x42\xec\x18\x7b\x69\xb0\x9b\xf0\xbf\xb9\x89\x68\xe2\xb0\xe0\x12\xb9\x8a\x63\xdc\x60\x1e\x21\x72\x17\xc7\x04\xc3\x0b\xf1\x44\x2e\xe3\x98\x39\x98\x47\x88\xdc\x46\x74\x5a\x3a\x78\xbe\x89\x86\x2b\x40\x96\x8a\x7c\xf3\xc6\xf1\x8e\x47\x57\x10\x4b\x62\x48\xad\xa0\x3c\x20\x74\xf2\xba\xa0\x40\xce\x51\x16\xaa\x0a\xfa\x3d\x36\x51\xad\xfc\x69\xa7\x9b\x52\x1e\x37\x91\x02\x4f\x92\x00\x16\x8e\xfe\x16\x5b\xe5\xa7\xdc\x1f\x32\xd7\xb2\x3d\xa7\x6f\x2d\x35\x1c\xe3\xbf\x31\xb8\xdb\xeb\x1a\xd5\x15\xf7\x34\xd9\x5f\x8d\x2a\x87\x2f\x78\x28\x06\x93\x00\xb6\x84\x52\x45\xd6\xa6\xb6\xb2\x51\xf2\x15\xd2\x89\x85\x93\x7c\xdb\x25\xd6\x32\x42\x75\xbb\x92\x6e\x8f\xfb\x31\x2b\xf0\x97\x66\x15\x38\x6b\x0b\x91\x00\xb6\x88\x56\x9a\xc8\x96\x13\xf9\x76\x81\xe6\x2f\x0c\xa6\x24\x0d\x64\x73\x95\xa6\xf5\xf8\x8c\xfc\x0e\x18\x78\x60\x92\x47\x67\xe2\xc5\x43\x1d\xbc\x85\xff\xcd\x6c\x3c\x42\xf1\x70\x25\x88\x4c\x47\xa6\x06\xf0\x6e\x25\x91\xf9\x38\x66\x09\x52\x46\x22\x17\x70\xcc\x22\xfd\x9f\xf5\xff\xfb\xb4\xce\x09\xd9\x44\x9b\xa6\xf4\x17\xc0\xe3\x59\xe8\xa1\x81\xbb\xe5\x7f\x28\x3f\x66\xaa\xc8\x15\xbd\x3e\xa3\x74\xe5\x1e\xcb\xd5\x5d\x43\x4a\xff\xfd\x7b\xcd\xf5\x30\xae\x8d\xba\x86\xa6\xcf\xab\xb7\x22\x72\x58\xac\xa7\x77\x67\x96\xd1\xb1\xdd\x98\xa0\x7b\xcf\x5c\x11\x99\x7b\x2e\x44\x84\x2f\xfc\x5b\xdb\x99\x07\x52\xdd\xe3\x4e\x00\x8b\x40\xd7\xef\x47\x98\x03\x45\xd9\x78\xfa\x67\xc9\x7a\xb5\xdc\x3b\x2b\x2d\x36\x58\x9d\x5e\xc8\x98\x77\xd5\xbd\x83\x62\x9b\x32\x44\x73\x7e\x6a\x00\xec\x27\xfa\xb8\xc0\xa2\xf1\x04\x8b\x51\x7a\xf2\xf9\xb5\x9d\x1f\xab\x54\xf6\x52\x08\x16\xda\xc4\x8d\x7d\xea\x1a\xe4\x7c\xe2\xa8\xb2\x26\x52\x17\x0d\xb0\x35\xb4\x57\xfb\xa4\xfa\x30\xe9\x52\x26\xf3\x47\x86\xcb\x3d\x9e\x47\x0f\xa5\x9a\x50\xfb\x0b\x9c\x8b\xda\x32\x5b\x22\x19\x20\x1b\x1c\xc7\xdf\x36\x0d\x00\x16\x8d\x9e\x6f\x3b\x60\x22\x52\x5a\xf9\xf1\xd0\x50\x8a\xcd\xde\x1a\x8e\x96\x5f\xfb\xe5\xee\x17\x6f\x7e\xd2\xc7\xf0\xf0\x8d\xf9\x4d\xe3\x13\xf4\x00\x60\x71\x68\x7a\x7a\x59\xd6\x75\xca\xfe\xa6\xd2\x2d\x4f\xee\x83\x03\x4f\x58\x18\xe2\x38\x5c\x66\xf6\x5c\x9d\x92\xa8\x5c\x49\xba\xa6\x32\x23\xa0\xc0\xe1\x04\xb0\x42\xb4\xd5\xfc\x11\xbe\xac\x7e\x28\x8e\x6c\xd2\xed\x6a\xfb\x30\x63\x08\x87\xa1\xe8\x27\x31\xe3\xe7\x31\x3b\xd9\x9f\xef\x65\x4a\x59\xfd\x3e\x61\x0f\xb0\x3a\xd4\x7a\x35\x87\x0e\xef\xdd\x56\x3b\x8a\x77\x30\x6e\x96\x7d\x38\xf1\xb0\x2d\x83\x7f\x6f\x59\xfc\xa3\xc1\x05\x93\xa1\x85\x4c\xe5\x6e\x9a\xdb\x00\xfb\x8e\x6e\x6d\x9b\x12\xa5\xbd\x8f\x63\xb5\x1c\x6e\xf2\x5d\x8b\xb9\x78\x5a\xdc\xd2\xad\x21\x53\x26\x6f\x59\x71\xef\x3d\x13\x7a\xdf\x63\x3f\xb4\x62\x49\x00\xcb\x44\xa5\x27\x1f\xbd\x20\x03\x19\xd1\x52\xbf\x98\xb7\x67\x4a\xdf\xe8\xe5\x59\xc8\x46\x3f\x2a\xcf\x39\x71\xeb\xeb\xa7\x6b\x13\x74\x8b\x6c\xc9\x36\x4e\x00\x7b\x89\x9a\x23\x9b\x7a\xfa\xc5\x8d\x10\xfa\x07\xa7\xcf\xb9\xb6\xea\xc9\xa9\xac\x34\xdc\x4e\xe7\x31\x3b\xb1\x39\xf3\x41\xc9\x97\xa1\xb2\xfd\x14\xdd\x00\xab\x43\xe5\x4f\x5d\xa7\x17\xae\x4a\x66\x59\x31\x1c\x9d\x77\x57\x76\x49\xd9\xf5\x6b\xf6\xec\x64\x9a\x4a\xea\xca\xa3\x6d\x70\xcb\x58\x78\x52\x20\x03\xb0\x46\xf4\xaf\x33\x7d\xa8\x7a\xf7\x84\x52\xef\x6b\xe6\x91\xf8\xec\xd2\x13\x97\x4e\x30\x0a\x19\xb0\xc8\xae\xf4\xef\x0e\x0c\x55\x6f\xa7\x2d\x35\x10\xd9\x60\xbf\x68\x8f\x75\xf3\xda\x50\x8c\xf6\x8b\xda\x73\xbf\x3b\x0e\x54\x09\xec\xe3\xff\xe6\xf1\x4d\xbf\xfb\xc5\x3e\x5a\x83\xa0\x52\xd7\xa4\x24\xc6\x6a\x1d\x27\x80\xf9\xa1\x7f\xff\x41\x7e\x53\x74\xf8\xdd\x74\x76\xdd\xd7\x8a\x19\x65\x53\xee\xe9\x4b\x1c\x8d\x8c\x14\x97\x52\xea\x30\x8d\x57\x43\xe3\x8f\x6d\xf6\x00\x6c\x04\xb5\x5e\x4d\x46\xae\xe0\x71\x6d\x5e\xe2\xf3\x91\xa8\xde\xae\x85\x77\x6c\xf2\x9d\x6f\xc3\xb4\x7e\x4a\x27\xcc\x87\x4d\x29\x02\xad\x64\x17\x80\xcd\xa0\x1b\x27\x78\x53\xc3\xf5\x10\x26\xce\xe6\x97\xd1\xa3\xa7\x43\xe9\x72\x25\xc8\x8f\x37\xd4\xb6\xb8\x5f\x90\xec\x95\x0a\x7a\x5d\xc4\x9b\x2f\x85\x6e\x1a\xf1\xc7\x3f\xc5\x39\x18\x35\xc4\xbc\xeb\xf4\x63\x94\xf8\x3b\xf6\x5f\x7b\xd6\x1f\xae\xb0\x9d\xfd\xfc\xc9\x68\xee\x23\x9c\x85\x43\x4e\x00\x4b\x40\x33\xd0\x54\x6a\x8c\x23\xab\x04\xc7\xe2\xc4\xcd\x43\x9e\x4f\x85\xb7\xb5\xb1\x8f\x5f\x7e\x7b\x85\xc2\xd2\x25\x4d\x6d\xfe\xe2\x29\x03\xab\x42\x80\x95\xa3\xbd\x6d\xcf\xb0\xc7\x7d\x81\x28\xa7\xd9\x92\xe2\x8e\x53\x4a\x94\x6a\xee\x60\xfb\xf3\xdd\x87\xbb\x58\xe6\x5d\x65\x77\x5c\xb7\x95\x2a\xa7\x06\xd8\x00\x5a\x91\xa9\xa2\x42\x3e\x0a\xf9\x88\x1e\x68\x35\xb7\x8c\x08\x96\x5f\x8c\xd1\x95\x2e\x79\x20\x2d\x9c\x59\x7d\x55\x77\x35\xf6\x59\xed\x87\x25\xe4\xd1\xac\x4b\x47\x0e\xe5\x8c\x8d\x54\x92\x07\x58\xa6\x14\x50\x1d\x4b\xd1\x39\xd7\x12\xfa\x30\x38\xfc\x92\x6f\xe7\x7c\xd5\x96\x9c\x9e\x02\x00\xb0\xb7\xa8\x25\x72\x58\x7d\xd7\xc7\x21\x4d\x6e\x5a\x1f\xdb\xaf\x19\xaa\x57\xa4\xae\x9c\xcd\x8b\x3a\x62\x78\xae\x4a\x68\xb2\xea\x6b\x85\x17\x43\x1f\xc0\x16\xd0\xa3\x7d\x80\x72\x8f\xa8\x44\xbb\xfc\xc2\x11\x7f\xc9\xac\x7b\xa5\x7b\x58\x17\xdf\x33\x09\x6f\xe7\xb5\xf8\x18\x1f\x70\xbe\x82\xef\xd2\xd9\x39\x00\x30\x12\x5a\x29\xc2\x98\x2c\xa6\x58\x79\x47\x3a\x7f\xab\xad\xb2\x24\xba\x33\xd4\xb8\x78\xd5\xfd\xe4\xb4\x1c\xbb\xb0\x9e\xca\x5e\x38\xc1\xde\xf1\x12\x60\x00\x5d\x7f\x4f\xfa\x98\xe2\xeb\xab\xb4\x6c\x93\x1c\x1d\x4d\x7c\xf9\x9e\x07\x2a\xdb\xfd\xee\xd5\xc5\x6a\x99\xf6\x96\xcc\x0c\xa8\x90\x76\xae\x3b\x01\xec\x19\x3a\xfe\xfe\xe0\xd6\xdc\x21\x2a\x9f\x80\xa5\xfb\x9f\x6c\xb7\x08\x03\x09\xc7\x07\xfc\x17\xac\x4f\x09\xb2\xfe\x1a\xd9\x91\xb8\xb9\x68\x56\x06\x60\xf1\xa8\xb8\x5e\xc1\xdf\xe0\x48\x1d\x78\xe1\xb5\x70\x8c\xea\xa0\xab\xfd\x82\x6c\xba\x86\xc9\x13\x5b\xa1\xb2\x46\xbb\xac\x05\x17\xee\xfb\x16\x1d\x00\x4b\x42\xb7\xd7\x33\xb6\x5c\xfa\xab\xe7\xc5\xd7\xb8\x2a\xcb\x4e\xbe\x9b\x2c\x21\x8d\x9c\x63\x58\xe2\x68\x76\x0b\x90\x8c\xef\x3c\xb9\x63\x3f\xc3\x29\x54\x6f\x2a\x3a\xc9\x1a\x23\x72\x66\xab\x80\x6e\xd2\xbd\xb4\xeb\x8b\x41\x81\x3b\xcc\x34\x3b\x14\x84\xda\xc5\x69\x32\x73\x6e\x57\x65\x6a\x3a\x01\x2c\x18\xdd\x8a\x4a\x82\xd7\x0e\x0b\xd5\x27\xfc\x48\x4e\x9d\x18\xef\xb6\x0e\x8e\xcc\x6d\x0a\x10\x17\x3f\xff\xee\xea\xbd\x78\xb7\xe1\x37\xd9\x0c\xb2\x00\x7b\x81\x26\x6c\xe7\x66\x86\xbc\xc9\x19\xd3\x29\x91\x84\x1b\xbc\x1e\x02\x5a\x2d\x0c\xa7\x85\x72\x7e\xe5\x9c\xad\xf8\xea\x1e\xae\x96\x63\x10\xfa\x1a\x60\xfd\xe8\x7e\xf1\xa1\x06\xe4\xd6\xf5\x63\x37\x6f\x88\x7a\xf2\x54\xf8\xb1\x2e\xfa\xad\x08\xed\x8f\xea\xe6\x2a\x9f\xd7\xcb\xfd\xbc\xe5\x26\x93\x91\x13\xc0\xbc\xd1\xa4\x74\x58\xf5\xf2\xa9\x8c\xac\xcf\xe9\x43\x59\xb4\x5b\x99\x24\x06\x2f\xed\x8f\x56\xf8\x32\x5a\x6b\x62\x53\xc6\x7d\x50\xdd\x4c\xfb\x95\x2a\xc0\xfc\x50\xf9\xd9\xdd\x97\x5e\x62\x52\x2d\xcb\x7e\xc4\x31\xa5\x6c\xb4\xcf\x25\xed\x52\x54\xf7\xb1\x08\x9e\xc9\xb2\xc3\x17\xdb\x97\x2f\x9b\xff\x3a\x02\xb0\x62\xd4\x1a\x11\xdb\x7b\x73\x34\xda\x49\x34\xe4\xd6\xd1\x4f\x4a\x5e\x58\x4f\x9d\x69\xbf\x68\x7e\xb6\x44\xda\x9b\xe9\xe3\xc4\x97\x68\xc6\xfb\x15\x4e\x00\xf3\x42\xd5\xf0\xa6\xd2\x9a\xbe\xfc\xaa\x2e\x0d\x81\x42\x53\x92\xcc\xca\xd2\x56\x9d\x03\x5c\x6c\x69\xf7\x67\x9e\x0f\x15\x9d\xbe\xcb\xfc\xa2\xe5\x15\xc0\x0a\xd1\x1c\x63\x1d\xf4\xea\x77\x5a\x1a\xc3\xa3\x7a\x32\x4b\x7a\x4f\x8e\x52\xd5\x98\xd4\xe3\x85\x57\x7e\x4b\x08\x25\x5c\x29\xaa\xa2\x8f\xb5\xef\x02\xd8\x3a\xaa\xcd\x5f\x64\xbe\x7d\xf8\x5e\xee\xd4\x73\xe6\x2b\x9d\x36\xfc\x34\x4a\x33\xaf\xbf\x5b\xeb\x35\x68\x06\x84\x2e\xe5\xf9\x7d\x25\xeb\xa2\x79\x83\x2a\x56\xbf\x15\xef\xdf\x0d\x28\x65\x12\x74\x0e\x8f\x58\xf3\x54\x17\xda\x71\xaf\xb1\xf6\xa5\x4c\x09\xbb\xe1\xef\x03\x49\x8c\xa9\x0d\x55\x00\x60\x25\xff\xf3\x6f\xa8\x15\x6d\x98\xad\x3c\xe4\x87\x66\x49\xc5\x47\xd8\x97\xa8\xef\xd2\x9d\xbc\xc4\x99\x90\xe1\x74\xfc\x75\xee\x25\xf3\xc4\x13\x46\xd5\x00\x5b\x45\xcf\x92\x9d\x41\x49\x45\xbd\x98\xd4\x00\x43\x85\x98\x4f\xc4\x36\xe9\x76\x85\x5b\xae\x3f\x96\xde\xc8\x7a\x44\x2a\x9f\xaf\xa6\x91\x4d\x53\x03\x40\x06\xad\x4b\xcc\xe4\x5b\x99\x74\x4e\x5d\x77\xba\x7c\x98\x3a\xb8\x59\x4e\xe5\xbd\xf0\x4f\xf6\xe5\x96\x93\xdb\x32\x27\xc7\xd2\x78\xb2\x43\x9d\x8a\x01\xe6\x88\x6e\x99\x93\x54\xad\x23\x0c\x14\x31\xfb\x9c\xa6\x1f\xbe\xad\xe9\x0f\x6d\xac\xe9\xdc\x1a\x78\x6f\xc6\xe8\xae\x00\x2f\x5d\x6b\xcb\x52\xd7\x3e\xf4\xa6\xe4\x41\x16\x0e\xff\x4a\xcd\xc4\xb7\x99\xc9\x57\x75\x4e\x5e\xca\x69\xf4\xe6\xef\x6a\x3c\xc2\xb8\xf7\x67\x65\x6c\x95\xbc\xe9\x31\x09\x27\x80\xd5\xa3\x86\x57\xac\x75\x07\xba\xf0\x6b\x7b\x7b\x7e\xbb\x34\xdb\xf0\x78\x28\xe0\xad\x1d\xcf\x15\x66\xc6\xba\x37\x46\x22\x36\x99\x32\x03\xe6\x59\x00\xeb\x41\x9b\xc1\x38\xe7\xea\xe8\x85\x03\xdc\x53\xf7\x12\x37\x8b\x64\xe9\x37\x88\x28\x5f\x7f\x1c\xf8\xf4\x71\x45\xc8\xf9\x21\xc9\x41\x9f\x67\xb7\x18\x00\x36\x81\x2e\xff\x99\x5f\x36\x14\xa2\xdb\xe2\xfc\xc2\x45\x35\x8a\xe9\x38\x87\x35\x4a\x56\x95\x76\xa6\xe6\x15\xcc\xfb\x66\xd2\x57\x8e\x08\x5c\x9b\x44\x1e\xf5\xe0\x4e\xd8\x79\xbf\xfa\xd3\x33\xe3\x0c\x2d\xf6\xa7\x2f\x30\x01\xef\x1a\xc9\xfb\x0a\x7f\x8e\xd6\x3d\xa9\xfd\xa5\xa3\x20\xeb\x57\x0f\x80\x0c\xfa\x29\x26\x91\xa5\xaf\xec\x14\x0d\x82\x5b\x99\x5c\x04\xbb\xe7\xfa\x8c\x69\x17\xc6\x8a\xb2\xe8\x1f\x32\xb7\x5c\xe0\x21\x4b\x17\xbf\xfc\x93\x0d\x60\xb1\xe8\x72\x9a\x4e\x70\x19\x9f\xac\x88\x57\x77\x6a\x9c\xe3\x75\x10\xa0\x15\x4d\x0b\x38\x71\x10\x04\xce\x4e\x9e\xf0\x37\xe4\xe0\xb7\xf4\x9a\x40\x2f\x8f\x66\x7a\xd4\xa9\x7c\x62\x0b\xbd\x15\xfc\x65\x72\x62\xda\x72\xb8\xaf\x91\xc4\x9f\x10\xb3\x8d\x6b\xf0\x45\xab\xfa\x9b\x56\xc6\x03\x24\x80\xd5\xa3\x21\xd9\x25\xc6\x8a\x8d\xf0\xf2\x8a\xaf\x0b\x1b\xdd\x51\x58\x48\xbc\xfb\x5c\x6b\x21\x92\x95\x24\xfd\xff\x28\xfb\xf2\x70\xac\xba\xef\xfd\xc7\x2c\x54\x42\x65\x4e\xa6\x4a\x03\xa5\x28\x22\x0e\x95\x24\x89\x0c\x99\x8a\x44\x91\xa9\x4c\x15\xe5\x39\xe6\x21\x99\x42\x86\x32\x64\x28\xf3\x98\xc8\x90\x92\x79\xce\x4c\xa6\xcc\xb3\x64\x1e\x7e\x97\xf7\xf3\x7d\xf7\xd9\xfd\xf1\x5e\xa7\xdf\x7f\xef\x7b\xb5\xef\x7d\xd6\x5a\x7b\x9f\xb5\xee\x75\xef\xed\x3c\x32\x8f\xd2\x3f\xbd\x2b\xfd\xda\xa9\x0f\x0d\x9d\xd7\x7a\x3b\xc6\xf3\xd2\xd4\xf1\x03\xb2\x3a\x19\xc0\xdb\xd4\x45\x29\x74\xe7\x40\xca\x3b\xdf\xf1\x32\xf3\x5f\xd6\x4a\xfe\xcd\x0b\x4e\x28\x12\x05\x2f\x4e\xdd\xf5\xa6\x5b\x8c\xe6\xb3\xc5\x37\x97\xc7\x12\x08\x76\xfb\x5f\x68\x8e\x2b\xec\x78\x30\x11\x5a\xbb\x8f\xce\x3e\x05\x29\xb8\x82\xa0\x48\x16\x5c\xb8\xf6\x86\x04\x51\xe4\x85\xbf\x38\x76\x4a\xa1\xfc\xc8\xa2\xc5\x8c\x1c\x93\xfb\x2e\xaa\xb2\x93\xa2\x48\x6d\xf8\x49\x25\x3a\xca\x26\x1b\x14\x59\x81\x7b\x31\xbe\xa3\x29\x9f\x83\xae\xe5\x72\x53\x6b\x1b\x8e\x4f\xf5\xa0\x8b\xdd\x0f\xac\xe4\x6e\x72\x4e\x08\x0d\x7c\x74\x2b\xd8\x7f\xa7\xb6\x19\x45\xa5\xe1\x0c\xfa\x7b\x2a\x3d\x77\x8e\x61\x3c\x71\x59\x20\xee\xac\xda\xd8\xdb\x90\x63\x22\x1e\x27\x33\x69\x16\xd6\xcf\x7c\x73\xda\x91\x17\x24\x64\x82\x22\xad\xf0\xab\xcc\x68\x80\xe8\x09\xf0\xd5\x95\xea\x25\x2a\xa7\xcc\xfa\x78\xc9\xd6\x18\x5e\x9c\x7e\x1b\xd3\xf3\x91\xe8\x98\x57\xe1\x3d\xbe\xe8\x8b\xa2\xd2\x70\xd2\x95\xce\xbf\xe6\x74\xf6\x1b\x22\xa8\x75\xf0\x07\x55\x7a\xe1\x91\x53\x23\xeb\x26\x2c\x09\xce\xe6\x3a\x75\x1a\xeb\x64\x62\xb1\xa2\x49\x28\x52\x07\x07\x5d\xf1\x2c\x63\xd7\x8a\xda\x74\xf5\x8e\xaa\xb3\xdc\x7c\x6c\xd5\x9c\x97\x5f\xb4\x6b\xca\xd7\xfe\x3c\xca\x73\xe1\x5a\x0d\xe9\x8f\x83\x3f\xa0\xa1\xa3\x63\x9b\xbf\x15\x62\xa9\x48\x54\x29\xb4\xb4\xc7\x3d\x32\x66\x43\xf5\xd3\x26\x48\xfa\x87\x0e\x87\xf4\x8e\xd9\xe6\x46\xdb\xec\x13\xfe\x3b\x1e\xfd\xcf\xcf\x55\xfd\x4f\x56\x02\x52\x14\x2e\x97\x06\x98\x50\xd0\x50\xe0\x12\x6a\x80\x19\x06\x18\x5c\x56\x0d\x30\x1b\x40\xb3\xc5\x65\xd6\x00\x13\x81\xfd\xf0\x13\x0e\xbd\xc6\x30\x51\xa0\x25\xc6\xa5\xd8\x00\x93\x07\x8e\x37\x70\x79\x36\xc0\x54\x02\x7f\xf0\xc8\x36\x86\xe9\x02\x8d\x18\x1e\xe1\xc6\x30\x69\xe0\xa4\x0d\x97\x74\x03\x4c\x3c\xb0\x0d\x97\x79\x63\xfe\x60\x5a\x37\x0e\xfd\xc6\x30\x75\xe0\x39\x78\x14\x1c\xc3\xac\x01\x7d\x1c\x97\x86\x03\x8c\x2f\x78\x0e\x2e\x17\x07\x98\x51\xe0\x0f\x1e\x21\xc7\x30\xbf\x68\xc1\x11\x3e\x1e\x35\x47\x65\x28\xde\x72\xb9\x12\x51\xa4\x17\xee\x02\x5f\xe6\x0e\x7c\xb5\x34\xa0\x29\x39\xba\x2e\xc9\x4e\xdd\xc8\x51\x37\xcf\xc6\x90\xdc\x79\xba\x52\xb4\x2a\x69\x63\xf1\xb1\xe9\x5b\x2d\x22\x8a\xac\xfe\xa1\x48\x8e\xc9\x4e\xea\x9c\x45\xac\xc3\x28\x02\x92\x05\x64\x35\x5c\xd6\xa3\xab\xbc\xde\xa0\x2d\x0e\x03\xdb\xeb\xb8\x2f\x4c\x7f\x7b\x42\x44\x11\x77\x38\xb9\x2c\xef\x36\x7d\xc8\x34\xd0\xd6\x79\xed\x3c\xe3\x69\x1f\x1d\xe3\xfd\x39\xdc\xc8\x03\xa1\x2b\x53\xc6\x2f\x1c\x89\xea\xab\x64\xff\xcc\x5f\xfb\xc7\xbd\x10\xb2\x25\xe2\x58\xe1\x5d\x3d\x99\xae\x64\xfe\x83\xe2\xe4\xf2\x6f\xe3\x06\x52\x1d\x1f\x5c\x96\x46\x45\x06\xe2\x6d\xf5\xcc\x58\x89\x28\x92\x0b\x97\xf3\x03\xe7\x95\x0b\x1c\xd6\x7e\x90\xee\xe1\x92\x3f\x7e\x34\x3e\x32\x22\xf6\x7b\xc2\x2d\x21\x1f\xc1\xdc\x79\x97\xa9\xd2\xd2\x4c\xf6\x22\x22\x8a\xcc\xc2\xcc\xb8\x6e\xf7\xb3\x35\xc3\x3b\x71\x9f\x51\xdb\xde\xe3\x72\x77\xab\x22\x27\x1e\x50\x6e\x04\x89\x86\x2b\x2f\xf6\xc7\x2b\xd0\x86\xaa\x32\x0b\xff\x5d\x58\xb0\x15\xe8\x05\x6f\x2f\x5e\x68\x30\xcc\x2a\x90\x3c\xf1\xc2\x83\x61\xdc\x81\xb4\x8a\x17\x22\x0c\x53\x0b\x04\x78\xbc\x30\x61\x98\x5c\x90\x91\xf1\x42\x85\x61\x66\xc1\x65\x52\xdc\x7e\x0f\x60\x62\x80\x6d\xb8\x4d\x1f\xc0\x7c\x06\xa7\x82\x78\x9d\x1f\x86\xf9\xc9\x08\x44\x3d\xdc\x1e\x50\x06\x21\xfd\xe7\xb7\x8b\x07\xe0\x1d\x6f\x4c\xcc\x78\xcd\x21\x91\xf5\xaa\x9d\xaa\x86\xcf\xf1\x16\x69\xbe\x55\xd1\xeb\x37\xdd\x57\xd7\x6f\xee\x53\x9a\xbc\x59\x53\x74\x5a\x91\x88\x22\xcb\x30\xd1\xb0\x9a\x90\x7b\x4d\xce\xcf\xb8\xe3\x4e\x7c\x74\x1b\xbb\x6c\x85\x82\x5c\xb2\xb3\xbf\xd6\x61\x45\xd3\xf4\xe3\x4b\xb1\x44\x5b\xae\xe4\xad\xf1\x30\x17\x10\x9b\x9f\xfa\x74\x5b\x6e\x85\xc5\xc7\x32\xad\x4a\xa1\x78\xcf\x27\x52\x93\xb8\xfe\x9f\xac\xc6\x35\xde\x06\xb4\x42\x7d\x52\x05\x76\x44\x14\xf1\x84\xbb\x0c\x95\x85\x65\xfa\x3b\xef\x0e\x1d\x5f\xda\xbc\xd6\x2f\x11\x31\x7e\x58\xfe\xca\x83\x27\x6e\x23\x1b\x1f\xe4\x56\x3b\xa6\x56\x63\xf2\xaf\x0b\xff\x9d\xd9\x50\x0d\xc6\x04\x78\x1c\xd3\x31\xcc\x32\xa8\xa7\x78\xe6\x43\x18\x90\xdf\xf0\x5c\xc0\x30\x9e\xe0\x9c\x11\xb7\x21\x07\x98\x1c\xec\xbb\x33\x78\x5d\x39\xc0\x2c\x01\x7f\x70\x3b\x73\x80\x21\x02\x31\x14\xaf\x3d\xc7\x30\x28\xa8\x0b\xb8\x2d\x3a\xc0\x3c\x07\x6f\x17\x6e\x9f\x0e\x30\xd1\xe0\x6e\x26\x5e\xb3\x8e\x61\xe2\xb0\x3b\x86\x78\x6d\x3b\x2a\xcb\xea\x48\xfa\xcf\x09\x89\x1f\xdc\xbd\xeb\x04\x97\xa2\x33\xce\x6d\xb5\x91\xb2\xa6\x43\xcf\xa7\x38\x6f\x3b\xb3\xc7\xc8\x85\x4d\xee\x58\xe1\x57\x73\x1b\x1e\xbc\x75\x52\x6e\xab\xd0\xc3\xe3\xc5\x44\xc2\x2c\xb8\x49\xda\xd8\xe2\x3f\xd1\x31\xcd\x9d\x15\xe8\x2a\x22\x3b\xd1\x9e\x3c\x1b\xec\xb9\x44\x92\x72\xb3\xd1\x27\x22\x73\x6b\x7e\xb8\x38\x1c\xe7\x49\xd6\x37\xaa\x44\x1e\x0e\xfc\xa8\x9f\x8e\x3c\x32\x27\x37\xfc\xe1\xd4\x33\xeb\x9d\xa9\x73\x6d\x85\x76\xea\xea\x1d\x71\x69\x5b\x85\x17\x4e\xf6\x32\x7b\x2d\x19\x3f\x7c\xf9\xb9\x23\x4c\x3a\x94\x3b\x20\xd1\x44\xd9\xc8\xef\x9b\xab\xa8\xb5\xca\x30\xf9\xc0\x74\xf7\x4c\x7d\x29\x19\x11\x95\xb6\x82\x86\x9b\xaf\x54\x48\x9c\x77\xe0\x38\x42\xb7\xe7\x81\xfc\xe2\xca\x33\xa9\xe7\x6b\x47\x07\x7b\x19\x6e\xd3\xdd\xdd\xbb\x4b\x4a\xb4\xdf\x98\x4f\xf8\xef\xbc\xc4\x22\xea\x07\xd8\x20\x9e\xa7\x10\x13\x02\x18\x3c\x6f\xa1\xe7\x80\x5c\x8a\xe7\x31\xc4\x50\x76\xfc\x7b\x84\x86\xe7\x36\xc0\x48\x5b\xfd\xfb\x18\x5c\x99\x06\x3c\xe6\x25\x70\x07\x57\xab\x01\x98\x58\x50\x82\xf0\x04\x1b\x28\x89\x61\x67\x51\x78\xa2\x0d\xc0\x78\x03\x72\x8b\xab\xdc\x60\x61\x03\x09\x09\x4f\xbe\xc1\x30\x9f\x80\x6d\xb8\x12\x0e\xc0\x78\x81\x2b\x7b\xb8\x3a\x0e\xd6\x14\x00\xa2\x8a\x27\xe6\x60\x98\x4d\x9a\x85\x75\xd2\xbf\x94\x75\x64\xb9\x58\xae\x11\xdc\x88\x28\xb2\x08\x8b\x87\x0d\x69\x4e\xed\xe6\x57\x82\x34\x9b\x08\xb7\x3a\x98\x2f\x1e\xf2\x3f\x2e\x10\xea\xf7\x78\x6c\x9f\xfd\xc5\xac\x2a\x8b\x0c\xca\xae\xfb\x44\x14\xa9\x80\x45\xb5\xc5\x6d\x13\xe3\x3a\xf6\x51\xec\x85\x8a\xf4\x67\x74\xa5\x8d\x62\x7d\x3a\xe6\xdf\xcc\x1f\x18\xf2\x50\xe1\xbd\x64\xa0\xc8\x7b\x8e\x97\x88\x22\x13\xb0\xf6\x19\x68\x4a\x52\xc3\x31\xe7\x53\x68\x71\x58\xfe\x69\xb9\x5a\x99\xa9\x1b\x1f\xad\x45\xb2\x6a\x28\x5d\x70\x78\xb8\xba\x35\xc7\xfb\x94\xad\xcc\x05\x27\x89\x2f\x34\x5f\x1e\x34\x44\x0f\x5c\x4c\x2c\x6d\xd2\x52\xfe\x6a\x2b\x2f\xc1\x43\x45\xfd\xbb\x8b\x21\x70\xbd\x2a\x32\x73\x5f\xea\x9b\x6f\x5b\x15\x02\x4e\x12\x3c\xf2\x07\x0b\x8d\x2f\xee\x69\x6a\x8d\x7e\xee\x5b\xf8\x36\x4d\x63\xb1\xce\x75\xf0\x7c\x85\x91\xf6\xbd\x6c\x9e\x84\x07\x49\xd5\xc3\x44\x14\x69\x86\xe5\x0f\xf3\xda\xf1\xc7\x9f\x18\x8d\xfc\x79\xb8\xf7\x7f\x5f\x78\xe5\xac\x96\xbf\xfa\x3b\xb6\x19\x7d\xf5\xc9\x8a\xa3\xa3\xef\x83\xda\x83\x7f\x3e\x92\x05\xd7\xeb\xb4\x82\x01\xce\xe6\x43\x81\xa9\x62\x8e\x66\xd4\xfb\xa4\x73\x7c\xdb\x8d\x65\x8e\x97\x57\x99\x58\x2e\xf2\xd3\xf4\xf7\x6c\x13\x08\x17\xfe\xbb\x30\x62\x4b\xb6\x08\x72\x3b\x5e\x28\x31\x4c\x05\xd8\xea\x78\xe1\xc4\x30\x13\xa0\x56\xe1\x85\x14\xaa\x21\x20\x13\xe1\x85\x15\xaa\xd7\xa0\xbe\xe1\x85\x16\xc3\x34\x83\x5b\xb0\x78\xe1\x85\x74\x03\xf0\xea\xe2\x0a\x92\x00\x53\x00\x9e\x83\xab\x4a\x02\xcc\x3a\xe5\xbf\x99\x15\x57\x9a\x04\x99\x15\xb4\xf3\x78\xf2\x24\xf6\x18\xc7\x5d\x0b\xe3\x24\x7f\x27\x54\xa2\x88\xc7\x3f\x1f\x6f\xeb\x84\xdf\x2b\xc1\xb6\x6d\xf2\x55\x5d\x0d\x6c\xac\x32\x55\x9a\x33\xcd\xb9\x11\x1f\xdf\x9a\x9b\x1e\xf1\x64\x0b\xd9\xae\xbf\x74\x52\x6f\xbc\x66\xab\x33\x1b\x86\xf5\x47\x5b\x24\x79\xf4\x4b\xf9\x69\xa9\x47\xe2\x6d\x6f\xe4\x87\xc8\x35\xc9\x3c\x4d\x3a\x59\xc8\xf9\x92\xf3\x0f\xba\x7f\xe2\xbd\xa4\xb5\xb6\xb5\xcb\xe0\xce\x4c\x8f\xec\xa0\xf3\xc7\xaf\xa3\x9e\x06\xf7\x39\x29\x29\x58\x7f\xa6\x2a\x4d\x6c\xae\xaa\x10\xbe\x6f\xfb\xd5\x97\x19\x39\xab\x6a\x3d\x4d\x44\x91\x39\x98\x37\x9b\x57\xb1\xa5\x3c\x5d\xef\x12\xdb\xd8\x5f\xdd\x4e\xb1\xea\xc6\xb9\x3d\xd7\xce\x30\xac\xed\x39\x29\x8b\xef\x94\x41\x8a\x9d\x66\xba\xf0\xdf\x99\x8d\x05\xa8\x13\xec\x5f\x3c\xd3\x21\x9d\x08\xa4\x5d\x3c\xf3\xa1\x77\x0b\x94\x2b\x3c\x17\x30\xcc\x1c\xe0\x9b\xb8\xa2\x31\xc0\x54\x03\x0c\xae\x72\x8c\x75\xa7\xa0\x6b\xc4\x93\x8f\x31\xcc\x14\x03\xe8\x98\x70\x85\x64\x59\x12\x1a\x02\xc1\x89\x88\x22\x6d\x30\xaf\x6b\x8a\xbe\x75\x68\x9c\xef\x05\x4b\xa2\x5f\x51\x33\xd3\xf4\x81\x26\x7e\x2d\x9f\x0f\x3b\xd2\x96\x59\x34\x5a\x8b\x37\x33\x82\xc4\xab\x50\x14\xc9\x80\x4b\x42\x39\x85\x46\x8a\xee\x0b\xe9\x60\xce\x37\x9c\x3b\x5e\x53\x08\xa5\x55\xc8\xba\x28\x5d\x17\x78\x47\xe3\x3e\x37\x7a\x2e\xb0\xec\x47\x3e\x8a\x64\xc0\x3b\xf1\xfc\x67\x47\x6b\xea\xd6\xdd\x95\x48\xa5\x67\xd6\xe1\xee\x39\x31\xbd\xfa\xd8\x0f\x0d\x77\xd9\xcc\x14\xa3\xeb\xc5\x6f\xac\xf2\xdd\x25\xa2\x48\x3d\xbc\xd3\x85\x3b\x35\x7d\x98\xbc\x2a\xd2\x4d\x1e\x39\x9c\xf8\x2a\xe7\x96\xae\x21\x23\x5e\x3a\x19\xfe\xe1\x26\xc3\xca\xd3\xc7\x4f\x9c\xf2\x05\x84\xff\xd2\x6a\x10\xa1\x36\x40\x6a\x70\x2d\x07\x98\x0c\x90\x81\xf1\xcc\x87\x30\x60\x37\xe2\xb9\x80\x61\xea\xb7\xfd\x9b\x7d\x70\x65\x7d\x90\x7d\xae\xff\xfb\x18\x3c\x69\x1f\x7b\x4c\x24\x0d\xd8\x24\x78\x22\x3f\x2a\xcb\xc5\x45\xfa\xcf\x26\x09\x86\x95\xa7\x09\xda\xa7\x52\x07\xa6\xe6\x28\x6f\x47\xf3\x68\x12\xde\x1f\x4b\x79\xbc\xf7\xfb\x06\x97\x77\xe3\xfb\xae\xcb\x0f\x33\xbb\x78\xf9\x6f\xa1\x28\xb2\x06\xaf\xe2\xf6\x5b\x4e\xd7\xa3\xd4\xe8\xe2\x39\x4d\x47\x1e\x59\x45\x14\x1b\x3c\xc9\xae\x3f\x27\x5e\x1d\x13\xc3\x65\x4b\x9e\x6f\x49\x13\x15\x89\x22\x9b\xf0\xb1\xd0\xbb\x52\xd1\x8b\x1f\x27\x3f\x7c\x38\x3f\x64\x91\xc4\xc3\x9c\x7d\xe9\x6a\x44\x8d\xb2\x48\x5c\xb0\x2f\x69\x17\x6b\x11\xa7\x1a\xd5\x16\xcd\xf8\x00\x9f\xc6\xd5\xef\x0a\xad\xe1\xd4\x59\xcc\x73\x60\xca\xfc\x16\xbb\x73\x4d\x93\xfb\x50\xcb\x0b\xc1\x73\x11\xc9\xe7\x8d\x68\x73\x82\x42\xfc\xff\xbd\x65\x89\x6b\x35\x88\x50\x30\x10\x86\x70\x2d\xc7\xa4\x46\x90\xb2\xf0\xcc\x87\x18\x1c\xa8\x1d\x78\x2e\x60\x98\x0f\x80\x91\xe2\x9d\xb8\x40\xe9\x87\x1a\x5c\xac\xc5\x3b\x7b\x41\x65\x1d\x09\x24\xe8\x3f\x4c\x08\x56\x52\x24\x46\x45\x94\x6a\xd3\x4b\x1f\xe8\x3f\x60\x3f\x2e\x80\x72\x64\x23\x71\x2a\xb7\x3d\x76\x8e\x74\x1f\x9f\xeb\x6e\x53\x2e\xb9\xb4\x35\x7e\x05\xbe\xe3\xc1\x20\x35\x65\x58\xbe\xa9\x64\x73\xc3\x95\xb9\xb1\xb2\x42\x9c\x4c\xb7\x7b\x07\xc3\x68\xdc\xde\x2f\xa2\xfe\x57\x6e\x70\xdc\x36\x9e\xdd\x32\x0a\xde\x51\x8a\xca\x61\x25\xb1\xce\xa2\x3f\xd6\xc6\x83\x07\xbd\x99\x93\x74\xd7\x8e\xb3\xe5\x0a\xdc\x2d\x98\x0f\xbc\xa5\x59\x7a\x25\x67\xef\x14\x11\x45\xfa\x60\xa6\xb8\x7c\xfd\x5a\x75\x07\x89\xe9\x51\x53\x7d\xaa\xb7\xda\x11\x22\xab\x52\xe1\x39\x49\x3f\x17\x2e\xee\x73\x1d\xf4\x0b\x9a\x7d\x7e\xf8\xdf\x9f\x99\xc4\x33\x1b\x62\x18\x40\x49\xc1\x33\x1d\xc3\xac\x00\xb5\x1c\xcf\x7c\x68\x29\xb0\x0f\x64\xe1\xb8\x80\x61\xfa\x00\x33\xc3\x3d\x09\xc3\x4e\x26\x40\xc5\xc1\x3d\x0e\x03\x98\x2c\xf0\x1c\xdc\x33\x31\x2c\x06\x4c\xff\xe6\x2c\xdc\x83\x31\x90\xb3\x80\x98\x84\x7b\x38\x06\x1e\xd3\x4a\xf5\xef\x63\x70\x4f\xc8\xc0\x63\xc4\xc0\xea\xe0\x9c\x92\x41\x67\x0c\xd4\x80\x98\xe1\x9d\x97\xa1\xb2\xcc\x04\x42\xf1\xd6\xc6\x6f\x85\x25\xc1\x1f\x07\x63\x24\x0e\x91\x98\x3c\x7a\x1c\x4d\x88\xd7\xe5\xd1\xd4\x66\xde\xe5\xb6\x64\xe3\x41\xe4\x30\xaf\xbb\x24\x12\x10\xd2\xc3\x43\x44\xa5\xe1\x72\x4b\xb6\xc3\x79\x4a\x2c\x21\x6d\x7b\x5e\xb8\x97\x46\xf5\x8b\xe5\xa3\x63\xb1\x26\x67\x05\x2f\x7e\x8d\xf9\x55\x5a\x12\x93\xbd\x2b\x92\x9b\x88\x4a\x8b\x40\xc3\xd7\x45\x4f\x47\x92\xae\xa3\x4d\x69\x6f\xcc\x9f\x85\xd6\x16\x8c\x93\x2a\x3f\x99\x58\xd2\xba\x33\x3b\xe3\x55\x61\x1c\x62\x63\x1b\x4c\x44\x91\x6c\xf8\x2a\x8c\xd4\x77\x13\xfd\x9d\xde\xb9\xec\x4a\x6c\x92\xd2\x9d\xac\xed\xe5\x77\x8b\x9f\x9b\x44\xd2\xfa\x1f\x2a\x28\xfd\xd9\x56\x73\xd8\x63\x97\xf0\xdf\x19\x0d\xad\x03\xf8\x65\x00\x3c\xcb\xb1\x75\xa0\xfd\x17\x82\x67\x3d\x06\x11\xf9\x77\xe9\xf0\x1c\xc0\x2c\xcb\x26\x59\xe8\xf8\xbf\xaf\xa1\x39\xa9\x84\x78\xef\xe9\x8e\x39\x2e\xc9\xde\xe9\xb1\xf8\xbb\x84\xe1\x23\x2a\xcf\xf6\x30\xc2\x66\x74\x48\x50\x2e\x6b\x75\x88\x69\xf5\x9f\x3b\x84\x45\x21\xfb\x50\x14\x99\x80\xdb\x49\x43\xaf\xf7\x74\xdf\xcb\x92\xdf\x7e\xfe\x3c\xcd\xcf\x41\xf6\xf5\x43\xfe\xd3\xa4\x03\x97\x36\x5a\x5b\x9f\x7f\x14\xb7\x36\x8c\xbb\x18\x80\x22\x1b\x30\x97\xd1\x52\x92\x3d\x75\x32\xd4\xec\x90\x92\x06\x21\xb1\xbd\x21\xa3\x7f\xbc\x4c\x29\x60\xfd\x57\xba\x6e\x2d\x21\x88\xd9\x58\x48\x3e\x95\x88\x22\xee\x30\xab\x7e\x48\x54\xa0\xb0\x0a\x32\x1c\x1b\xbe\x2e\x7b\xc0\xaf\xab\x5c\x54\x2d\xe9\x96\xea\xf0\x67\xab\x41\x1b\x0d\xea\x7b\x2e\x35\x6c\x7d\x5b\x1c\x16\xde\x4a\x06\x87\x4f\x54\x3a\x5b\x79\x85\x45\x7b\xff\xe8\x51\x78\x94\xb0\xa4\xce\x13\x27\x25\xe5\xd1\x3a\x18\xfc\xa1\xc9\x49\xa1\xef\xa3\x86\x13\x8a\x44\xc0\x54\x8c\xbb\x7d\xb9\xb2\xec\xa5\x9d\x58\x2e\x8b\x81\xd6\x57\x41\xb5\xe4\x8a\x4b\xe3\xb2\x76\x68\xa4\xa1\xa0\xd8\xa3\x99\x4f\xe7\xbf\x96\xa3\x48\x1a\x5c\x65\x77\xb8\x31\x24\x07\xbc\xa7\x52\xb0\x49\x3d\x75\xce\xb4\x6c\xd4\x23\x67\x3f\x4d\xde\xe0\x11\x7a\xcb\x5e\x5e\xd4\x6a\xce\xba\xe1\x20\x8a\x7c\x83\x39\x7e\xda\x71\x8f\x61\x6d\x2f\xb7\x13\xba\xf4\xa9\xca\x2b\x6d\xa1\x3a\x2f\xc9\xa4\xf8\x9b\x3a\xaf\x25\x50\x51\xf6\x94\x5d\x15\x7e\x66\xe1\x84\x22\x44\x78\x67\x7b\x5a\xa5\x9c\xd3\xd4\xcf\xb9\x78\x90\xe3\x74\x17\xf9\xda\x48\x8e\xe4\xb0\x6a\x66\x8f\x06\xf2\x76\xbf\xfa\xc7\xc9\x8d\x5b\x94\x31\x28\xe2\x0e\xc7\xbe\xf1\x8a\x87\xd8\x8f\x17\xed\xd5\x92\x87\x6b\x0d\x8c\x44\x35\x99\x0c\x39\x28\x3b\xed\xb5\xdf\x52\x56\xcb\x6b\x3d\x72\x30\xa3\x09\x41\x91\x78\xb8\xe4\x67\x45\x4c\xcc\x64\x38\x0b\x5e\x7a\xa1\x9e\x24\xfa\x50\x93\xa1\xf0\x14\x75\x4a\x3f\xed\xbe\xb6\xdd\xbf\x9c\x46\xfa\xd0\xf2\x13\x9f\x9c\x50\xa4\x16\x8e\x65\xf5\xad\x87\x4f\x98\x6b\x85\x3b\xda\x89\xd6\xb2\xf1\x9b\x49\x1f\xa3\xf2\x7d\x5f\x98\x86\x7f\xb3\x9f\x65\x73\xde\xaf\x4f\x99\x7a\x06\x45\xbe\xc3\xc6\x77\xd2\xf7\xd4\xe7\xcf\x66\xf2\x5c\xad\x9f\x76\x30\x5b\xf0\x0b\x7f\x46\xaf\x59\x75\x9f\x7c\x8d\xd5\x56\xdd\x6f\xf3\xcd\x8d\xed\x54\x28\xd2\x0c\x5f\x09\x73\x33\xe2\x89\x4d\xec\x70\xd2\xbe\xdc\xea\xb8\xcd\xd7\x75\xa6\x8a\x61\xe0\x64\xeb\xce\x0f\x12\xd4\xda\x3d\xce\x2b\xb7\x6b\xe9\xbc\xb7\xf2\x24\x3c\x7e\x47\xf8\x53\xc7\xdf\x4f\x1e\x8c\x1f\x7f\xee\x9e\xb5\x98\x3c\x2c\x68\xf2\xae\xf7\xc2\x89\xaf\x01\xab\x3c\x5f\x59\xbf\x35\xbd\x3b\x73\x0a\x45\x91\x34\x38\x38\x17\x37\x22\xaf\x1e\xff\x19\x1a\x80\x70\xee\xa4\x72\x9e\xba\xd4\x52\xf1\xdb\x2b\x4b\x22\x5b\xbb\xbe\xfc\xd5\xbd\x73\xa7\x2e\x17\xe4\xa2\x48\x0e\x5c\x7c\xd7\x23\xbd\xbb\x17\x1e\xf1\x64\xb3\x58\xdf\x58\x0e\x69\x74\xf7\xd9\xde\x71\x93\x7e\xcf\xe3\xda\x34\x15\xb2\x77\x2f\xf4\x1e\x8e\x6f\xa0\x28\xb2\x00\x2f\x6d\x57\xb2\x5c\xc7\xee\x44\x3f\x51\xa1\x68\x76\xeb\xdc\xa3\x1b\xef\x83\xc6\x4e\x17\xa4\x9b\x05\xe8\x0c\x7c\x5c\xac\xbe\x51\x13\xb8\x8a\x22\xab\xb0\xf5\x74\x9d\xd2\x7d\x8a\x86\x07\xa2\x4b\x0b\x2f\x88\xb6\x9b\xb3\xce\x4a\x1f\xd1\xd2\x96\x2d\x1f\x76\x17\x3f\x94\x20\x39\xe7\xcc\x37\x0b\x0d\xdd\x57\x69\xab\xd8\x13\x36\x64\xcb\xc1\xf9\xf2\x78\x89\xf9\x42\x2a\x93\xcb\x95\x9f\xd4\xbf\x83\x73\x4e\xbd\x5c\x59\x52\x7f\xde\x46\x85\xa2\xc8\x37\x38\x5f\xa9\x17\xd8\x4f\xac\xeb\x29\x5c\xa9\x98\xbe\x48\x5c\x0d\xdd\x7e\xef\xc5\xe5\xc9\xe7\x43\xe3\x7b\x4a\x56\x8d\x4f\xff\xb8\x7f\xab\xaf\x0f\x45\xca\xe0\x37\x50\x30\x46\xae\x84\x74\x1f\x7d\x14\x4f\xf3\xa5\x9c\xb2\xb0\x83\x75\xf7\xa7\x55\x44\x03\x77\x7b\x71\xd6\x10\xd8\xe8\x6f\x0c\x7f\xdb\x4d\x44\x91\x38\x58\xef\x52\xe1\xc8\x7e\xdc\xbd\xe8\xe6\x14\x22\x3f\x49\xf4\x62\x75\x5a\x95\xe8\x56\xbf\x4a\x70\x67\x79\x7e\xaf\x87\x86\xf7\xde\x64\xaf\x02\x8a\x22\x51\x30\xcb\x60\x67\xbb\x72\x79\xce\xa8\xd1\xa2\x7c\x5e\x6b\xa2\x5b\x88\xdc\xb3\x68\x57\x7d\xf2\x31\x0f\xf1\x27\x8c\x3f\x37\xf4\x07\xb4\x87\x1a\x51\xa4\x10\xb6\x9e\x6a\x64\xdc\x5a\x79\xa0\x5f\x2e\x48\x63\x6c\x62\xc3\xaf\x45\x21\xee\xa3\xcb\x0e\x3b\xcd\xae\xe7\xbb\x7a\x05\x76\xf5\x08\xc7\x7c\xdc\x62\x6f\xf0\x1b\x38\xca\xff\x84\x25\xc9\x81\x3a\x23\xf3\x2c\x69\xd2\x35\x31\xb2\xec\x2a\x63\x05\x2d\x3f\x32\x43\x9b\xf7\x5f\xc3\xe7\x08\x77\x5e\x1d\x73\x42\x91\x20\x98\x84\xb9\xbd\x70\x9a\xbb\x98\xdd\xd7\x11\xdc\xfc\x66\x80\xdf\xfc\x9b\x2a\xfd\xee\xf8\x07\xb9\x02\xbe\x69\xda\x43\xdb\xe8\x9b\x3d\x9f\x7c\x41\x91\xd8\x3f\x86\xb7\xc4\xa9\xe7\xac\x7d\xce\xb9\x29\x4f\x58\x24\x37\x35\x79\x38\x1a\xea\x98\x97\xa1\x4a\xe2\x34\x50\xf8\xcb\xfb\xcd\x8e\xd3\xc1\x28\x52\x02\xbf\x22\xa4\x26\xd3\xeb\x6a\x0f\xb2\xc6\xe4\x6f\x28\x24\x3d\x4c\xcb\x8a\xcb\xbe\x7a\xe6\xab\xe0\xbe\xf4\x37\x6e\x76\x36\xec\x5a\x16\xdc\xca\x4e\x28\x92\x0e\xbf\x23\xeb\x4f\x0b\xe8\x98\xf7\x06\x9e\x88\xb0\x5d\x6c\x7f\x23\x29\x71\xff\xe8\xb1\x83\x8d\x42\x07\x12\x9a\xde\x31\x06\x48\xa9\x0e\x1a\x4f\xa3\x48\x0b\x7c\xcd\x46\xff\x16\xad\x9a\xe1\xad\xf6\x3b\xf9\xdd\xd2\xb6\xb7\x1c\xe5\x7a\x91\x03\x89\x59\x27\x82\xd9\x5f\xee\x66\x16\xf9\xf2\xe4\x59\xc8\x73\x14\x19\x82\x97\x8a\xe4\xf0\x9d\x5f\x2a\xb6\x1b\x05\x29\x75\x74\xd5\x9f\xed\xe2\x85\xde\x1c\x30\x8a\xa8\xb5\xa0\x9e\xdc\x5b\x21\x43\x32\xae\x17\x7d\x15\x45\x91\x58\x38\x21\x10\x45\xc3\x0e\xb3\x33\x1c\xa2\x94\xe5\xe0\xb4\xd2\x6a\x50\x4a\xe4\x7c\xfc\xc3\x64\x80\xa4\x63\x35\x6b\xdf\x4c\x9f\x53\xa1\xea\x6f\x14\xc9\x85\x97\x2a\x63\x2f\xdf\x85\x19\x93\xa7\xdb\x0c\x16\x96\xd8\xf7\x1f\xe4\x4f\x14\xe0\x3d\xea\x74\x54\x7e\xcf\x09\xe7\x33\x31\x3a\x06\x96\xc7\x76\x6c\x4d\x0f\xf3\x53\xc6\xb6\xe9\x2b\xcf\xf6\x48\x14\xde\x69\x28\x9f\x8f\x18\x5a\x92\x9c\x9b\xcc\xb6\xcb\xb8\x49\x86\xae\xff\x62\x4a\xed\x2d\x36\xbb\x82\x22\xb5\x70\x2a\xb6\xdb\xf9\xf9\xab\xed\x54\xce\x50\xaf\xf7\xe0\xe5\x16\xa3\x1f\xc7\x22\x73\x6e\x5f\x28\x6c\x3f\xdb\xab\x6f\xba\x7a\x3a\x87\xe6\x54\x0d\x11\x45\xde\xc3\x47\xed\x3f\xc7\xcf\x66\x77\xd2\x8c\x09\xb1\x2a\xa7\xcc\x45\x49\x6f\xc6\x6e\xee\x26\x7e\x24\xfd\x5a\x70\x2f\x8e\x8d\xb7\xaf\xdd\xe9\x12\xfc\x0d\xc0\xab\xdf\x4b\xcf\x14\xa1\x0e\x88\xd6\xab\x1a\xe6\xa4\x24\x71\xc5\x80\x50\x4a\xc7\xbe\x84\x6f\x0d\x81\x37\x05\x53\xcf\x0c\xbe\xee\x81\xaf\x70\xe5\x77\xe6\xbf\xd3\x0b\xa7\xf9\xb4\x2c\x4f\x21\xd3\xa8\x40\xc8\x19\x33\xb9\x4b\x3d\x7d\xde\x42\x4b\x20\x59\xd4\xc6\xb6\xe9\x36\x11\x45\x7e\xc3\x4e\x5e\xe2\x55\x48\x20\xe4\x38\x3c\x19\x09\x7b\x7a\x29\xf0\x08\x31\xc8\xfd\xe8\xb9\x2b\xfa\xc2\xed\x85\xc7\x0b\x9e\x15\x98\xdd\xc8\xaa\x73\x42\x11\x47\x38\x2d\xe9\x58\x57\xbf\x2d\x29\x14\x24\x14\x68\x7d\x0a\x1c\xda\xd4\xde\x26\x2d\x7b\xdb\xe5\xd2\xf6\x29\x1a\x8a\x66\xe9\xda\xb1\xdf\x21\xce\x28\x32\x04\xef\x00\x8f\xb4\xa2\x75\xc4\x97\x5b\x7d\xf8\x03\xb3\x71\x7c\x3a\xfb\xa3\xb6\xf8\xf5\xd3\x7b\x4e\xff\xae\xd5\x92\x99\x0b\x6f\x59\xf1\x2f\x42\x91\x65\x38\x8b\xc9\xfd\x3a\x2e\x98\x67\x6c\x3c\x4b\x5a\x68\xbb\xdd\x76\x54\x58\xc0\xfa\xa7\xf7\xc4\x65\xa6\xec\x8e\x74\x8a\x64\x9e\x12\x16\x55\xf8\xd3\x5b\x06\x4e\xda\x99\xf1\x5e\x02\x6b\x0e\x4e\x36\x32\xbf\x02\xbb\x3d\xc7\x1f\x84\x66\x39\xf8\x64\xab\x7e\x9f\x09\x8e\x0d\x7f\x9f\x31\x09\x0d\x4d\xb8\xe0\xfe\x3b\xa5\xef\xd0\xdd\xc6\x0f\x89\xcb\xc6\xa7\xe8\x2f\xa4\x77\x87\x98\xcd\x54\x70\x25\x3d\x1c\xbf\x7d\x67\x25\x2b\x9f\x12\x45\x91\x42\x38\x37\x5e\x3f\x53\x7d\xbb\xb9\x2b\xe8\xe4\xe1\xb7\x25\xc3\xa6\x1f\xc4\x82\xe8\x9c\x9a\xe6\xb7\x33\x6d\x8f\x2e\x57\xf9\x6c\xbc\xa8\x2a\xc2\x8a\x22\x3f\xe1\xe1\xe3\x8c\x2f\xdf\x28\x2d\x0a\x68\x4b\x9d\x7e\x25\x69\x93\xac\xf8\x5d\xe5\xe6\xbd\x5d\xbf\xf7\xd7\xc8\xba\x7f\xaf\xa6\x38\xd0\xe1\x11\x06\x0d\xf5\x7a\xaa\xd4\xbc\x33\x69\x84\xea\x0d\xda\xcf\xf6\xe8\xd0\xd3\x86\xed\x28\x12\x63\x2f\x72\x46\xb9\xba\x98\x64\xc5\x5c\xa0\x4b\x1a\x1a\x5a\xc5\x19\x76\x78\x22\x85\xda\xd6\x6d\xd9\x6c\xc0\x0a\xe9\x73\xa9\xb3\xe0\x2b\xe6\x6b\x0b\x49\xaf\xaa\x1a\x8b\x4e\xf2\xe1\x92\x73\x42\xa5\xe1\xb4\x15\xa4\xa7\x31\x52\xb8\x74\xdf\xfd\x5e\x70\xe6\xf9\x11\x5d\x72\xe5\x2b\x7b\xbc\x2b\x5e\xc6\x1d\xb0\x96\x09\x45\xd3\x95\xdc\xe5\x5f\xa3\x48\x14\xfc\x22\xcb\x2d\x70\x9f\xb9\x2a\xa6\xb3\x6e\xb7\xbf\xc5\x4f\x72\xad\x6c\x37\xcb\x8d\x4b\x51\xc2\xa6\x8c\x17\xf3\x19\x53\xc6\x76\xab\xff\x5e\x40\x91\x02\xd8\x45\x3e\x09\xab\x81\x16\x39\x2a\xd6\x5a\xb7\xde\x97\xa3\x1e\x61\x9e\xfb\x1a\xa4\x87\xd8\x1b\x5c\x1e\x2f\x4e\xa6\x37\x31\xbc\x7e\x19\x09\x0d\xfd\xa5\x74\x7b\x82\xb7\xf2\xda\xde\x0f\x37\x27\xa6\x47\x3e\xb0\x05\xf2\x99\x96\x17\xea\x04\x55\xa7\xc9\x8d\x5d\xb3\x7e\xd0\xb0\x01\xff\x92\x6e\x88\x5c\x87\x53\x51\x38\xbd\x0d\x91\xf1\x07\xb9\x11\xd7\x6f\xf9\xdd\x8a\xd6\xec\xe7\x8c\xe9\x03\xfd\x4e\xdd\x24\x6b\x76\xa3\xdd\x14\xfe\x4b\x8a\x26\xcb\xf5\xaf\x04\x0e\xa4\x69\x3c\x9e\x86\x61\x36\x80\x68\x83\xc7\xd5\x30\x8c\x3b\x90\x10\xf1\xf8\x1a\x86\x19\x06\x1d\x10\x2e\x67\x03\x98\x08\x20\x42\xe1\x12\x37\x80\x49\x03\xfa\x02\x1e\x7b\xc3\x30\xdf\x40\xe3\x88\xcb\xe0\x00\x86\x08\x44\x35\x5c\x1a\x87\xc5\x0d\xac\x0f\x1e\x97\xc3\x30\xf1\x40\xfb\xc0\xe5\x73\x00\x53\x0b\x62\x8d\x4b\xea\x00\xe6\x3b\xf0\x07\x8f\xd9\x61\x98\x66\x70\xa5\x00\x97\xdd\x01\xcc\x0a\xc0\xe0\x32\x3c\x6c\x4d\x41\xdc\x70\x69\x1e\xc0\xe4\x00\xa1\x02\x97\xea\x01\xcc\x02\xd8\x07\x78\x7c\x0f\xc3\xac\x92\x82\x3f\xd4\xc4\x65\x7e\xb2\xdc\xee\xff\xfb\xe8\x46\x0b\x5c\xf6\x1f\x2e\xdc\x3b\xfe\x3c\xe3\xa8\xe9\x82\x88\x83\x84\x7b\xb2\x49\x9a\xe0\x5d\xdb\x02\x5e\x72\x3f\x7d\xea\x56\x8e\x0c\x87\xfd\x56\xd3\x44\x14\x09\x84\xeb\x78\x2e\x95\xa7\x37\xe1\x9a\x1d\xf3\xf6\xde\x97\x9c\x6b\x53\x96\xe8\xc1\xa8\xfd\x25\x65\xf4\x3c\x24\x36\x3a\xba\x1c\xb7\x59\xf5\xee\x12\x51\xa4\x09\x56\x22\x8b\xdc\xc6\x82\x2e\x7f\x1f\xe7\x50\x89\x2e\xa7\xa5\x2f\xb8\x38\x12\xfe\x7b\x88\xb7\x65\xf9\xd2\xe9\xe5\x7b\xaf\x5c\x43\x6b\xba\x18\xb7\x36\x19\xcc\x75\x95\x1a\x9b\xb3\x0f\x66\xee\x32\xeb\x6b\x36\x54\xa7\xda\x5f\x5d\x4f\x5d\xfc\xb8\xa1\xad\x3c\xb4\x92\xd1\x2a\xfb\xb1\xc5\xe7\x43\xf1\x44\x14\x71\x85\x39\x17\xfd\xc7\xc6\x6d\x23\x8d\xce\x3b\x73\x8b\x0b\xc3\xbf\x7f\xda\x35\x19\xea\x8c\xee\x6b\x94\xd7\x66\x20\x9b\x1c\x17\x9c\x0c\x55\x2a\x17\xfe\x3b\x37\xb1\x90\xb6\x80\x13\x43\x3c\x57\x31\x4c\x20\xb8\x45\x83\xe7\x2e\x86\x69\x02\xf2\x25\x9e\xcb\xd0\xeb\x08\xb6\x2f\x9e\xdb\x18\xc6\x15\xe8\x6c\xb8\x5c\x1f\x4b\x49\xc0\x1f\x3c\xc2\x8f\x61\xca\x40\x2a\xc7\x25\xfd\x00\x13\x07\x62\x8d\x4b\xfc\x01\x26\x0a\x68\x66\x78\xec\x1f\xc3\x14\x02\x7f\xf0\x3a\x00\x0c\xf3\x01\xa4\x72\xdc\x2e\x00\x60\x82\x40\xac\x71\x5b\x01\x80\x89\x05\x18\xbc\x7e\x00\xc3\x94\x80\x14\x8b\xdb\x13\x00\x4c\x3a\x48\xb1\xb8\x8d\x01\xf6\x2e\x80\x3f\x0c\xc6\xed\x0e\x00\x66\x08\xac\x29\x6e\x87\x80\xc5\x00\x94\x19\xdc\x36\x01\x60\x72\xc1\x9a\xe2\xb6\x0a\xd8\x73\x80\x16\x8c\xd7\x2f\x40\xe5\x0c\xd0\x00\xbc\x9e\x01\xc3\xbc\xc7\xe4\x7f\xbc\xee\x01\x95\x25\x25\xdc\x22\x77\xde\x0a\x1c\x7c\x71\xc2\xb8\xf3\x55\xed\x81\xda\xd1\x6b\x46\x4f\x0d\xd3\x66\x52\x4c\xbc\x4c\x7e\x45\x99\xdf\x1e\x1b\xdd\x2d\x34\x72\x45\xae\xc6\xe6\x11\x81\x88\x22\x83\x70\x63\x2e\xf7\x5b\x32\x58\x8f\xff\x89\xb0\x1d\x3f\x4d\xf5\x21\xe5\x89\x99\x2a\x4e\x65\x74\x27\x85\xdc\x85\xc8\x0b\x5e\x42\x0c\x35\x2a\x3f\x88\x28\x32\x0a\xb7\x06\xc7\x66\xa2\x13\xee\x3e\x4f\xe7\x5e\x7a\xda\xfe\x35\x2e\x53\xb9\xd3\x44\x5a\xe2\x8c\x19\x63\x7b\xc7\x2d\x9b\x83\x4d\xb9\x51\xeb\x9f\x89\x28\xe2\x01\xa7\xe5\x70\x2d\xe9\x38\x95\xb1\xc6\xcf\xa1\x79\x7c\x75\x24\xbb\x1e\xf0\xae\xa6\x1c\xaa\x51\xb2\xab\xe7\xe4\x7e\xb3\x5f\xe5\x6e\x76\x31\xad\xf0\xdf\x99\x0d\x6d\x13\x70\x59\x00\xcf\x74\x0c\x33\x08\x52\x0c\x9e\xf9\x18\x66\x14\x6c\x61\x3c\x17\x30\x8c\x07\x56\x55\xf1\x3a\x3a\x54\xd6\x91\xd4\x71\xd7\x56\x55\x75\x87\x97\xa3\x6e\xec\xc3\x3b\xd7\xb4\x87\x13\xad\x68\xd4\xcf\xf8\xb1\xe9\xf1\x28\x12\x7a\xd1\x09\xda\xb1\xc3\x21\x97\x72\xcd\x5a\x9e\x4c\x6e\x55\xc9\x46\xb8\x11\xac\x1d\x3d\xb1\x31\x40\x74\x71\xaf\x7a\x15\x7e\xe3\xec\x5e\xbe\x9e\xb3\x43\xad\xba\x87\xb5\x97\xd6\x1f\x7f\x69\x11\x21\x3d\xec\x32\x41\x44\x11\x1f\x78\x7b\xe8\x3a\xea\x0b\x85\xc5\xda\x44\xcc\x70\xc4\x34\xfa\xac\xec\x53\x7f\x54\xb1\x2e\x25\x49\x12\x76\x97\xa6\x33\x3e\xab\xa0\x23\x82\x86\x88\x22\x4e\xf0\xfc\x6b\x62\xd2\x0d\x5f\x2f\x9e\x5d\x72\x12\x4e\x95\x0c\x28\xd9\x51\x31\x4d\xf3\xfa\xb6\x33\x07\x41\x47\x9c\xc7\xe3\xf5\xc7\x6b\x19\xa7\x88\x28\x52\x05\xb7\xd3\x07\xbe\x5f\x58\x61\x8a\xab\xb1\x0b\xd9\x3e\x92\x1c\x28\xba\x79\x71\xc6\x5c\x84\x26\x9f\x2a\xea\x68\xb9\x27\x9b\x85\xb0\x85\xc9\x21\xe1\xbf\x73\x13\x22\x9f\x60\xe9\xf0\x5c\xc5\x30\x8d\xe0\x6d\xc5\x73\x17\xc3\xf8\x80\x6d\x85\xe7\x32\x86\x71\x02\xcf\xc1\x73\x1b\xc3\x54\x81\xac\x80\xd7\xc3\x63\x98\xdf\xe0\x39\xb8\x7d\x3c\xc0\x38\x02\xf2\x89\xdb\xcc\x63\xaf\x16\xd8\xf2\x78\x1d\x3d\x86\x59\xde\x09\x32\x16\x5e\x6f\x8f\xca\x0a\xd1\x13\xfe\xb9\xfa\xdd\x07\x2b\x2a\x0f\x49\xb5\x32\x59\xdf\xf7\x52\x99\x49\x90\x32\x65\xc6\xf6\x9b\x2c\x99\x31\xd2\x76\x9d\xca\x99\x7a\x6a\xfa\x4b\xd2\xf2\xe9\xb9\x2f\x44\x14\xe9\x87\xf5\xa3\x05\x52\x76\x93\x9c\xaf\x13\x91\x6b\xfd\xd3\xce\x12\x96\x0d\x3c\x4f\xa5\x2e\x7d\x52\x68\xcf\x7b\x56\xfe\x48\x8b\x47\x88\x2c\x7a\x64\xab\xd4\xc3\x44\x35\x7e\x27\x95\x25\xd7\x9d\x73\x47\x8d\x8c\xc3\xee\xd8\x1e\xfc\xd0\xd1\xd3\xc5\xa6\x45\x6b\xfd\xfc\xae\xcf\xf4\x94\x78\x5a\xf0\xf6\x2d\x7b\x1c\x61\xe2\xa9\xb3\x6c\x59\xad\x51\x30\xcf\x5a\x54\xad\xfc\xf5\x47\x6a\x50\xe4\xd5\x52\xee\x48\x75\x61\xf5\xac\xe6\x7c\xb2\x53\xda\x2f\xd4\xe2\x84\xff\xce\x6c\x2c\x44\x7d\xe0\x7a\x08\x9e\xe9\x18\xa6\x1f\x14\x36\x3c\xf3\x21\x82\x03\x0a\x28\x9e\x0b\xd0\x36\xd9\x06\x32\x16\xae\xde\x22\xab\x84\x50\xff\xd3\x07\x7c\x83\xc5\x1f\x41\x56\x7b\xbb\x9b\x37\xdf\x9e\x69\x3b\xd9\x11\x7c\x56\xec\xa3\x83\x19\xbb\x6c\xc1\xd1\x61\x75\xb1\xb2\xc8\x5a\x56\x2e\x5b\xd7\xd9\xad\x00\xc0\xcb\x31\x72\xfc\x08\xa3\x37\x39\xb3\xf2\x5d\x41\xd7\xd1\xdd\x3c\x84\x55\x39\xc7\xc9\xde\xcb\x8e\x7b\xfd\x62\x0e\x8c\xde\x93\x26\x5d\x48\x23\xa2\xc8\x3c\x2c\x5d\x69\x0e\xab\x0b\xae\x32\x65\x98\xbc\x35\xda\xae\x21\x74\x4e\xf4\xdd\x64\x3b\x7b\xc0\xc3\x3d\xe9\xb7\xdc\x34\x5c\x7f\xf1\x76\x29\xf4\x6d\xed\xdb\x3f\xfe\xe0\x53\x75\xf5\x5d\xf1\x85\xfe\xaa\x23\xfa\xdf\x06\xcf\x08\xdf\x7d\xfc\xf3\xfc\x1b\x05\x0b\xcd\x29\xce\xe0\x4f\xf3\xb5\xbe\x9e\x9f\x64\x88\x28\xd2\x05\x8f\x9f\xea\x3e\xb5\xe0\x47\x4a\xef\xe4\xef\x25\x3a\xa7\xd0\xeb\xef\xdc\x2a\x2b\xfe\x23\x6b\xc7\xe3\xb8\xf1\x91\x2e\xe3\x90\x29\x9e\x7f\x33\x16\x9e\x9b\x10\x07\x06\x2d\x1c\x9e\xab\xd0\x16\x01\x4b\x87\xe7\x2e\x86\x99\xc7\x7e\x61\x16\xc7\x65\xe8\x0d\x07\x5b\x11\xcf\x6d\x0c\xd3\x05\x30\xb8\x0a\x1b\xc6\x9b\x41\x4b\x8a\x27\xb3\x61\x98\x9f\x94\x60\x2b\xe2\x09\x6e\xa8\x2c\x35\xfd\xdb\xff\x6d\x45\x78\x29\x79\x96\xb8\xce\x7e\x69\xac\x6b\xbe\xf5\xa2\x53\xf7\xda\xef\x6b\x41\xc3\x4f\x1d\x96\xe8\xda\x38\x5f\x88\x45\x5d\x6b\xb8\xd4\xc3\xaa\xbb\x45\xce\xe1\x62\xf8\xc8\xa3\xf3\x66\xca\xb6\x4a\xa7\xf5\xc6\xdd\xd6\x92\x77\x68\x55\x4d\x5a\x34\x9f\x7e\x08\x2f\x0c\x3b\xa7\xa0\x4f\x47\x68\x54\xe4\xdf\x4a\xd7\x70\xcb\xd8\x44\x7d\x42\xc9\xba\xf6\xec\xfc\x39\xf2\x5b\x6f\xb8\x48\xbf\x6c\xeb\xbf\x76\x79\xe5\xb0\x9f\xe8\xac\xfe\xca\x8e\xc3\x54\x47\x9b\x25\x89\x28\x52\x09\xcf\x2f\xc3\x66\xc2\xff\xc4\x40\xaa\xf1\x34\x3f\xb9\xb8\x5e\xf4\x9e\xe7\x29\xed\x6b\x83\x96\xf6\xd7\xda\x06\xaf\x4b\xd0\x89\x4a\x46\x6d\x6d\xc5\x0a\xf8\xd5\x60\xf9\x68\xdf\x1f\xb7\xcd\xf1\x6e\x19\xf3\x93\xf3\x25\x96\x22\xab\x6a\x7c\xf3\xdb\x7b\x4e\x7f\xce\xd9\x76\xad\x77\x99\x68\xbf\xf9\xef\xe5\x3c\x3c\x37\xa1\xad\x08\x96\x0e\xcf\x55\xa8\x7d\x01\x85\x10\xcf\x5d\xa8\xa8\x81\x56\x04\xcf\x65\x0c\x53\x09\x9e\x83\xe7\x36\x86\xa9\xd8\xbe\x50\x41\xfa\x77\x42\x2b\x2a\xa3\x24\x4b\x70\x46\x51\x24\x0a\x16\x21\x1e\xbe\xea\x2a\x7a\xb7\xa1\xac\x5d\xf9\x9d\x4b\xbd\x33\xba\x95\x60\xaa\xcc\x41\x56\x16\x42\x6f\x74\xf6\x56\xb3\xa6\xae\x6c\xe6\x5b\x14\x79\x0f\x2f\x38\x43\xc6\xed\x80\xef\xfa\x75\x07\x5b\x4d\x3c\xed\xf9\x18\x06\xc9\xac\x77\x76\xeb\x4b\xd9\x47\x4d\x99\xe6\xdb\x4f\x64\x06\x7c\xa4\x44\x51\x24\x06\xd6\x67\xc9\x15\x1a\x1a\x05\xfb\x0e\x97\x2d\x49\x9a\xcd\xae\xe5\xe8\xef\x47\x9f\x96\x4d\x06\x73\x5c\x3d\x3e\xd1\xff\x55\x51\x3a\xeb\xa4\x20\x8a\xb4\xc0\xa9\x33\xe4\x47\x8b\xb4\xc8\x6a\x8c\xb9\xb0\xdd\xeb\x25\x05\x1b\x81\xa2\x8c\xbe\x26\xf7\xf3\xd2\x75\xfe\x1d\x31\xda\x65\xaf\xa3\x04\xaf\x13\x51\x64\x0c\x26\x87\x79\xa4\x37\xab\x7d\xbc\x9f\x7f\xdd\xb7\x26\x96\x68\xab\x2b\xd6\x11\x9b\xe8\xcf\x1e\xef\xa4\x53\xb2\xa6\x43\x38\xcd\x13\x43\x59\x46\x44\xa5\x4f\x41\xc3\xa9\xab\x75\x6b\x57\xd7\x2c\x94\xf6\x30\xf0\xdc\x2c\x29\xab\x15\xef\x33\x76\x74\xda\x5b\xac\xa9\x7a\x8d\xbb\xb3\x4f\xe2\xaa\x56\x8f\xf0\x5f\xc6\x04\x2b\x30\xa0\x73\xc2\x0d\x0c\xd6\xd1\x80\xad\x81\x1b\x1c\x80\x89\x01\x1d\x27\x5e\x84\xa0\x8e\x13\x64\x5d\xbc\x28\x61\x98\x31\x86\x7f\xef\x3b\xe0\x85\x0a\x60\xa4\x4f\xfd\x0b\xc1\x95\xee\x01\x04\xe8\x0e\xb8\xf2\x3d\x16\x69\x10\x01\x3c\x0d\x1f\xc3\x14\x50\x02\x26\x86\xa7\xe6\xa3\xb2\x67\x08\x84\x7f\x3e\x9c\x57\x00\xbf\x1d\x99\x9b\xd9\xc6\xc6\x7e\x0a\xda\xf2\x01\xf2\xaa\x7b\x5b\xcd\xaf\xe8\xd0\x8c\x6e\x0a\xf4\x57\x78\x54\x3e\xeb\xf1\x35\x0b\x2a\xd2\x26\xa2\x48\x37\x3c\x7e\x58\xe1\xcd\xf9\xdf\x05\xdb\xea\x72\x5f\xab\x7f\xd1\xe4\xb2\x1b\x14\xbc\x96\x7a\x65\x21\xb1\x7b\x8f\x50\x62\x13\xa9\x64\x82\x79\xdd\x16\xbf\x80\x2f\xe9\x77\xab\x89\xf7\x0d\x92\xd7\x05\x10\x0d\xbb\xf8\x27\x87\x06\xa6\x9d\x14\xdf\x3f\xae\x8c\x5f\x36\xcd\x3f\xfd\xa3\x5a\xa8\xa8\x89\x87\x88\x22\x35\xf0\x39\x67\xa9\xf3\x31\xa5\x5f\x93\xb6\x2b\xe8\xc2\xd2\x46\xb2\x8c\x24\x89\xca\xf1\xa0\xa8\x8e\xc6\xa5\xca\x18\xce\x14\x1a\xc3\xe6\xf4\x5a\xe1\xbf\x33\x1b\x0a\x11\xd8\xc0\x78\xa6\x63\x98\x6e\x80\xc1\x33\x1f\x62\x55\xe0\x12\x3c\x9e\x0b\x18\xa6\x86\x02\x2c\x1f\xde\x09\x0b\x2a\x2b\x44\x20\x38\x6f\x2d\xdf\x7b\x98\x29\xc9\x6e\x66\x10\x5f\xb0\x5e\x1f\xa9\x9c\xff\xf1\xb4\xef\xa5\x4f\xe2\xd7\xc0\x84\xdc\xeb\x53\x79\xad\xfb\x1b\xec\xb7\x9d\x7d\x11\x5a\x4a\x44\x11\x7f\xb8\xdc\xb8\x8c\x67\xd2\x89\x88\x85\xaf\x68\xdb\xf7\x5c\xfc\x2c\xf9\x9a\x69\xaf\x20\x75\x59\xc5\xa1\x9e\xab\xf3\x8c\xd5\x67\x36\x0e\x3e\xce\x21\xa2\x48\x16\x3c\xde\xe1\x64\x66\xaf\x61\x36\x3b\x47\xb1\x45\x73\x41\x50\x7f\x98\x89\x70\x7d\x4b\x20\x7d\x73\xe6\x85\x8f\x03\x19\xf5\xd4\x7d\xbd\x5b\xe5\xcf\x1d\x6e\xfd\xdf\x1e\x2f\x29\x8e\x70\xf2\xa3\xbc\x32\xc6\xea\x69\xab\xdc\xc7\xd2\xaf\x7f\xef\xd7\x98\x80\x0b\x13\xb3\xc5\xd5\xc8\x67\xf3\x07\x58\x84\xff\xce\x6c\x28\x97\x00\xc6\x83\x67\x3a\x86\xf1\x07\xcc\x0a\xcf\x7c\x0c\x93\x05\x30\x78\x2e\x40\x7d\x2a\xe9\xc2\xc2\xce\xff\x81\x5e\x78\x4f\xc8\xa4\x51\xc8\x1d\xb3\x27\x2f\xbd\xad\xa2\x66\x2a\x6c\x91\xc8\xf7\xdc\xab\xd4\x7c\xf6\xd2\xad\xdb\xf4\xa1\x9a\xc1\x9f\x50\xd9\xc5\x4d\x87\xd5\x10\x76\x14\x45\xbe\xc1\xd5\xe3\xd3\xbd\xdc\x34\x79\x2b\x97\xde\x1c\xc2\x7b\x2f\xdf\x0c\x9d\x10\x0f\xf7\x8d\x23\x03\xfc\xea\x37\xa4\xf6\xf6\x6b\x1d\xde\x26\x73\x09\x45\x46\xe0\x3e\x65\x3a\xd9\xe6\xfb\x4d\x0a\xa5\x9d\xc2\x36\xbe\xb4\xd4\x95\xdb\xca\xaf\xd1\x3f\x9a\x54\x69\x9b\xb5\x9a\x11\x39\x7b\x40\x35\xf9\x94\x90\x13\x8a\x78\xc2\xad\xb9\xd3\x3b\xa1\x34\x95\x77\x1f\xcf\x06\xd8\xc4\xcc\x37\x51\xb6\x7d\xc9\xb6\xad\x88\x49\xaa\xad\x15\xd9\x5f\x10\xf2\xfb\x5d\xca\x4d\x1d\x14\x79\x03\x7f\x0e\xa3\x7e\xfb\xd1\xe1\x7c\x41\x2f\x32\x93\x7b\x06\x0b\x87\xb3\x74\x94\xd1\x83\xd9\xb2\x3d\x92\x09\xa7\x08\xf4\x53\x47\x07\x99\xde\x9f\x43\x91\x0d\x98\xeb\xac\x3b\x9d\xef\xdd\xe1\xcc\x92\x3c\x23\xec\xcf\xdc\xa5\xa3\xa6\xff\xfd\xfb\x33\xa9\xb1\x4e\x79\xd2\xf3\xe6\x7d\x27\xaa\x8d\xa4\x93\xe0\xc3\xeb\xd5\x47\x7a\xdf\xa5\xd8\x62\x0e\x45\xd0\x1e\x08\xf0\xcd\xfc\xf1\x7d\x36\xe4\xd5\x76\xf1\x31\x8b\x80\x2b\x0e\x11\xc6\xc5\x96\x8f\x9d\x50\xe4\x0b\x3c\xf5\xd3\xae\x1f\xd3\x77\x49\x12\xed\x98\xc2\x6c\xd8\xfc\x10\x4e\x9b\x5d\xb7\x52\x23\xfb\x0f\x85\xea\x3a\x14\x0b\x4b\x93\xf3\xed\x52\x46\x91\x1a\xf8\xf2\x16\x77\x5d\xc4\x1a\x65\x91\x0f\x7f\x02\x31\xf2\xe7\xac\x15\x9f\x67\xc0\x4d\x7e\x67\xc6\xf6\x98\x92\xc1\x3d\x89\xf4\x03\xd7\x4d\xeb\x50\x64\x11\x1e\x6e\x4c\x29\xff\xf1\xd1\xd3\xbe\x57\x1a\xb2\x59\xa4\xcf\xe6\x05\xbb\x79\x43\xca\x62\xec\x3f\x06\x87\x08\xc8\xdd\x0f\xdf\xb9\x20\xfb\x10\x45\x91\x3c\x38\x29\x1d\x52\x6c\xaa\x99\x53\x68\x1d\x97\x3d\x76\xa9\xed\xf6\x1d\x4d\xb9\x7e\x03\xef\xe4\x08\xb2\x4c\x89\xc7\xbb\x0f\xb7\xbc\x90\x3d\x6a\x81\x22\xc5\xb0\x80\x92\x7b\x7d\xee\x8e\xd1\x99\xae\x9f\x93\xa8\xcf\xc6\xe1\x7e\x8e\x78\xd2\x2c\xeb\xed\xf7\xcf\x72\xbf\x9a\x2f\xcd\x3f\x56\xbc\x41\x27\x8a\xa2\xc8\x00\xfc\xd2\x1c\xaa\xfc\x16\x70\x67\x42\x84\xa1\xa1\xed\xa5\xef\xa2\xb9\x99\x4a\xc1\x3b\x5d\x3f\x53\x26\xbd\xe8\x84\xdf\x94\x36\x7b\xe9\x5e\x16\xa0\xc8\x2c\x4c\x21\x78\xe4\xf4\xa2\x4f\xd5\x05\x29\x25\xc9\xf6\x9c\xff\xbc\xae\x6f\xb2\x60\x7c\x30\x44\xe4\xc3\xc4\x7b\x8b\x40\x23\x6a\x7e\xed\x87\x67\xb6\xf8\x3b\xbc\x69\x02\xaa\x49\x8c\x86\x95\xca\x7d\x29\x44\xbd\x05\x4d\xb3\xb6\xff\xf8\xd1\xcf\xbc\xa2\x94\x49\x1d\xb6\xcb\x7b\x50\xfc\x12\x6f\xe5\x16\x45\x0e\x87\xdf\xf9\x14\xb1\x67\x4f\x07\x24\x2a\xd8\x0f\xc9\x49\x06\xcf\xe5\x18\xcf\x3f\x2c\x98\xf0\xaa\x72\x4b\xb4\x9d\xb1\x6d\x08\xeb\xed\x90\xbb\x89\xa2\xd2\x30\x43\x61\xe5\xa7\xcf\x53\x61\xe6\x5b\xd9\x4b\xde\x38\xf4\x31\x6a\xed\xb3\xdf\x4b\xd7\x63\xbd\xcf\x03\xb9\xc6\xf3\xf7\x87\x5e\xfe\x35\x26\x8a\x22\xd3\xb0\x98\x38\x30\x96\x7c\x8e\x4e\x8d\xba\x8d\xd5\x22\xa3\xd7\x7d\x6e\xc7\x0b\xff\xf6\x6d\x9f\x53\x56\x0f\x50\x7e\xc8\x24\x08\xda\xec\xd1\x89\x21\xa2\x48\x24\x4c\xf0\x0d\x9c\xaf\x76\xed\xbf\x67\xe3\xd5\x38\x6b\xc8\x66\x5f\x67\x77\x88\xfb\x5c\x00\x6b\x57\xf9\xde\x67\x4c\xd2\x3b\xa3\xbb\xc6\xad\x04\xe0\x5d\x50\x3b\x40\x6b\xc1\x23\xfb\xaa\x24\x3a\x3d\xe8\x0a\xe7\x77\xd7\x4c\x52\x79\xfe\x41\x5b\x9f\xef\xe7\x6d\xc9\xbd\x0a\x62\x68\x8c\xb6\x8a\x2c\xfc\x76\xdc\x54\xaf\x13\x3a\x11\xb4\xb2\x74\x64\xb0\xe0\xdc\x0d\xb7\xb0\x99\x93\xae\x2e\x7c\x17\xc2\x6d\x56\x0f\x47\x72\x72\xe6\x74\x3f\xf6\x46\x51\x24\x16\xde\x06\xdd\xc2\x03\x17\xa3\x8e\x93\x0e\x90\x91\x19\x1d\xa4\xe6\xb7\x30\xd6\xf4\x53\xe1\x48\x08\xbf\x62\xf9\x50\x58\x7c\xff\xc0\x36\x05\x2f\x14\xa9\x80\x2f\x10\x75\xb9\x0c\x59\x99\x76\x31\x09\x3c\x37\x6f\x60\xd8\x2b\x7c\xf2\xc6\xb0\x50\xa1\xe3\x9d\xe5\xa8\x17\xc9\xb7\x82\x39\x19\x4d\x7b\xce\x40\x43\xb7\x4d\xea\x3b\xf6\x84\xcf\xaf\x53\x74\xbf\xb9\xd1\xe8\x5e\xee\x3b\xf9\x80\x23\xbd\xf8\xfd\xae\xb0\xd3\xbc\xb7\xe3\x84\xc3\x4d\xfc\xa0\xa1\x4c\xdf\x4e\x1e\xf8\x82\xb8\x72\xab\x24\x5c\x3d\x98\x11\x3b\xf5\xf9\x34\xaf\x34\xb3\x90\x94\x08\x71\x88\xbe\xa3\xc8\xdc\x7a\x93\xcb\x09\x45\xa2\xe0\x78\x2b\xdb\xa8\xf9\x22\xb6\x02\x3f\x44\xe3\x8e\x98\x1a\xf8\x38\x2e\x7f\x2d\x6b\xdc\x37\x71\x3f\xad\x8c\x6e\xf8\xfb\x4c\x90\xe0\xba\x04\x8a\xc4\xc2\xe1\xb6\xf5\x90\xa0\x08\xcf\x3b\x49\xed\x71\xe1\x29\x43\xd0\x7c\x61\x5e\x70\xb8\xf3\xa6\x8e\xe2\x89\xe2\x87\x47\xad\x4d\xae\x18\x6b\xbe\x46\x91\x66\x38\x63\x74\xa6\x8f\x28\xef\xd9\x73\x9a\x7a\xef\xab\xc0\xa5\x82\x8d\x40\xdd\x4e\x71\xf1\x13\xae\xd7\x4f\xda\x04\x44\xc6\xe5\x2a\x5f\x54\x87\xbf\x89\xfb\xca\x48\x45\x57\x42\x69\xf9\xcb\xfb\xc6\x09\xf1\xa7\x6e\x7d\xee\x6f\x3b\x52\x92\xc8\x2b\x8a\x06\xb8\xf6\xfc\xda\x79\xd2\x8c\x5a\x9d\x88\x22\x4d\x30\x11\x4f\xf2\x7b\x98\x2b\x96\x6e\x96\x25\xe7\x37\xc6\xdb\xf5\x7b\x6d\xbd\xa3\xb7\xfd\x47\xcd\x50\x3c\x43\x87\x56\x64\x82\x4d\xc3\xc0\x56\xca\x70\xfc\xe3\x73\xef\xcf\xde\x38\x93\x46\x3b\x8e\xd8\x45\x97\x87\x7d\x6e\xc8\x70\x6d\xa2\xd4\xde\xeb\xfc\xc4\xbb\x56\xf9\x24\x5d\x55\x9e\xc9\xfd\x61\x14\x41\x61\x22\xf3\x62\xcf\xae\x59\x26\xdd\x57\x9d\x1b\xd5\xfb\x04\x2e\xeb\xee\x3a\x6f\x53\x46\x95\xf0\x44\xd7\x6a\x48\x7f\x70\xe6\xb0\xe9\xd1\xe9\x6e\x14\x09\x83\xad\xb9\xde\xde\xb7\x87\xf3\xf1\x82\x82\x6f\x82\xe5\x39\x53\xda\xa9\xa7\xc1\x19\x5a\xef\x8b\xea\x8f\xc4\xf9\x36\x3e\x22\xd4\x8c\x27\xc2\x97\x25\x9a\x7d\xda\x5f\xcc\xec\xe6\x8c\x91\x57\xd1\x36\x0d\xf9\xa9\x21\xa4\xd2\xef\xdc\x26\x75\xec\x46\xdc\x2d\xe3\x7b\xe9\x43\x95\xb7\xe1\xc5\x69\x7d\x9d\x35\xae\x80\x06\x1e\x16\x54\xbf\xd3\xed\xc4\x30\x95\xa5\x6c\xfd\xc8\x50\x20\x9b\xbb\x6b\x2e\xbc\x57\x70\xba\x26\xf5\x31\x34\xb4\xb8\x7a\xee\x36\x61\xf6\x8e\xd9\xab\x8c\x8f\xb2\xfd\x2f\xab\x9d\xac\xfb\x88\x4c\xe3\xbe\x08\xb3\xf7\x31\xf6\x34\xfe\x7d\xbc\x1f\x50\x54\xfa\x02\x34\xfc\xbc\xe0\xe7\x97\xb4\xac\xf7\xac\x85\x18\x37\x84\xa5\x0b\xee\xc6\x47\xb0\x44\xb3\xde\x7d\xb6\x68\x9e\xf4\x23\x91\xcd\x5a\xfb\x8c\x10\x8a\xf4\xfd\xf1\x0b\xbf\xcc\x9b\x47\xfd\xd7\xba\x77\xa7\x5e\x5d\x56\x32\xdb\x79\xf8\x3c\x79\x54\x6f\x6c\xca\x35\xa5\xc7\x02\x8a\x7b\x8f\xb6\x18\x19\xc3\x43\x3b\x34\xb5\x1e\xea\xdb\x3f\x97\xbb\x7f\x4f\xd8\x40\xe3\xec\x5c\xfa\x55\x01\x1f\x51\xce\xee\xc3\xbf\x38\xd5\xf3\x9e\xef\x16\xd2\x28\x47\x51\x24\x00\xce\x86\x7a\x42\x34\xc9\xe5\x6f\x8a\x0c\x6f\xdc\x8c\x8f\x14\xdf\x4b\xe5\x32\xce\xe3\xe5\xce\xe9\x97\xdd\xf6\xa4\x84\x49\x42\x36\x76\x35\x08\x45\x92\xe0\x65\xa4\x34\xa3\x3c\xdc\x4e\x9b\xaa\xb2\xff\x92\x6f\xed\x58\xcc\x47\xc5\xa0\xb4\xdd\x66\x6b\xe4\x8e\xf3\x0f\x49\x07\xef\xf0\x6a\x5b\xf0\x11\x51\xa4\x19\xce\x86\x06\xc6\x74\x11\x74\x52\xdd\x2c\xdd\xaf\xf6\xf0\x76\xfd\x64\x7f\x2c\x76\x78\xe1\xfc\x95\x3b\xe1\x81\xe4\x8b\x81\xd9\xed\x66\xc7\x73\xe1\x3b\x74\xe7\x2e\x4e\x1e\xe8\x11\xba\x28\xdb\xe2\xac\xa6\xee\xaa\x21\x24\xd2\xf0\x36\x5b\x6f\xf9\x50\xba\xd4\xa6\xe1\x48\x74\xba\x23\x33\x1c\x0f\x99\xb7\x6d\x9f\xbc\xcf\xea\x59\xea\x04\xeb\xa6\x72\xd8\xdc\xd7\xa8\xb9\xd7\xcc\xd5\x29\x4f\xe7\x41\xe5\x5a\xea\x27\x61\x95\x26\xfc\x97\xe5\x5b\x56\xea\xdf\xb6\x1c\xb0\x7b\xbc\x1a\x8e\x61\x46\xc0\xa9\x2f\x6e\x1d\x07\x18\x4f\xa0\x35\xe3\x16\x73\x80\x79\x03\xfe\xbc\x19\xaf\xa2\x63\x98\x0d\x1a\xf0\x4d\x03\xbc\xda\x8e\xca\x92\x50\x1f\xfc\xa7\x2f\x8f\x81\xeb\x86\xe9\x39\x66\x6d\x5e\xf3\xe5\xf7\x4a\x59\xac\xe7\x4d\xcf\x04\x2a\x84\xf2\x7a\xd1\x28\xe9\xed\xe7\x38\xeb\x20\x52\x7c\x92\xe0\xf0\x01\x45\xe6\x60\xa6\x2b\xc6\x28\xcf\x4a\x47\x83\x24\x25\x25\x57\x72\x15\x9e\x36\xa5\x0b\x31\x62\x7c\x16\x37\x53\xc1\xd4\xc0\xeb\xf0\xd9\xe2\x72\xd4\x49\x22\x8a\x78\xc3\xd9\x37\x79\x40\x8a\x61\x95\xbe\x3c\xb5\x60\xd0\x39\xe1\xf1\xdd\xde\x3d\x4e\x74\x27\xb5\x38\x09\x12\x1e\xc4\xa0\x52\xa2\x21\x39\x15\x33\x11\x45\x02\xe1\x7d\x54\x7d\x56\x60\x32\xa0\xd7\xf6\x96\xc8\x72\xe3\xfb\x20\x8b\xe7\xef\xdf\x36\xf6\x27\xba\x1c\xd9\x39\xf7\xec\x24\xc7\x8e\x85\x80\x5f\x35\x5b\xe9\x09\x4e\x94\xb5\x2a\xf7\xe4\x42\x4c\xda\xbf\xa7\x84\x98\xcc\xb7\xbb\x84\x54\xec\xbb\x4d\x6a\xb9\x46\x66\xd7\x5e\xd6\x76\x88\xf6\xcc\xf2\x43\x25\xe1\xbf\xf4\x12\x44\x34\x06\x9c\x7a\xe0\xb9\x8a\x61\xe6\x00\x3b\xc6\x73\x17\xc3\x78\x83\xb3\x6a\x3c\x97\x31\x4c\x20\xe8\xb4\xf1\xdc\xc6\x30\x4d\x40\x88\xc2\x25\x73\x00\xf3\x05\x08\x44\xb8\x8c\x0e\x60\x6a\xc0\x15\x2f\x5c\x5a\x07\x30\x8b\x00\x83\x4b\xed\x00\x26\x0f\x9c\xa3\xe3\xf2\x3b\x80\x29\x06\xa7\x38\xb8\x1c\x0f\x60\x06\xc0\xbd\x0d\x3c\xa2\x87\x61\x66\xc1\xfa\xe0\x91\x3d\x0c\xd3\x05\xb2\x0b\x2e\xe1\x03\x98\x70\xf0\x5b\x58\xb8\xac\xef\x5f\x8c\x34\xd8\xd6\x78\xcc\x0f\x7b\xcc\x34\x38\x94\xc2\x63\x7f\x18\x26\x12\x3b\x46\xc7\xe3\x81\xa8\x2c\x0d\xc3\xff\xa4\x90\x22\xb8\xc4\x2f\x16\x24\xd3\xd2\x8b\xd0\xbd\x8d\x4e\x0c\xcb\xb7\xba\xb8\x8b\x3c\xf7\xdb\x4b\x4b\xf3\xce\x8b\x96\xd7\x6f\x88\xec\xd0\xf1\x34\xfd\xbc\x35\x1e\x96\x36\x98\x9f\x1d\xfc\x72\x63\xe6\xe4\x7c\x72\x67\x92\x74\x45\x02\x0d\xb1\x83\x3c\xb9\x67\xc7\xc3\xee\x30\x9b\xdc\xf3\xe2\x9c\x36\xa7\x54\x89\x28\x92\x08\x17\xc2\x73\x4a\xb2\x6b\xde\x29\xe5\x17\xa2\x4a\xe5\xf7\x9b\xa5\x68\xfc\xe6\xd0\x7e\x2c\xc4\x1c\x3a\xe6\xdb\x2a\x1b\x65\xe1\xe1\xde\x3f\x4a\x44\x91\x50\x38\xe3\xe5\x9f\xa3\x9d\x0e\x3b\x74\xdd\x54\x61\xd1\xc5\x8e\x4b\x27\xc2\x18\x31\x39\xcf\x54\x52\x5a\xd6\x52\x36\x9d\x7f\xec\xbe\xc6\x45\x75\xe1\xbf\x33\x1b\x0b\x51\x11\xd0\xe5\xf0\x4c\x87\x30\x40\xd6\xc0\x33\x1f\xc3\x24\x82\x5d\x8f\xe7\x02\x86\x09\x05\x99\x0c\x97\x95\x03\x4c\x14\xf6\x53\x91\x78\xcc\x1c\x60\x62\xc1\x5b\x8c\x47\xcf\x31\x4c\x05\x39\xa8\x75\x78\x44\x1d\x95\x55\x26\xfc\xef\xbc\x33\x11\xe6\x79\xda\xda\xc4\x07\xdc\x92\xbf\x16\x78\xf8\xe7\xef\xbf\x7a\xa0\xb9\xbb\x36\x5b\xf1\x1b\xb9\xbd\x41\x7c\xec\xb5\xec\xe9\xe2\xe6\x17\x1b\x28\x8a\x38\xc3\xc5\xa8\x83\xe3\xe4\xc8\xae\xc2\x06\xc6\x7b\xd6\x6d\x46\xe6\xe1\x72\x92\xfe\x67\x63\x6d\x54\xe8\x13\xc7\x09\xae\x0f\x23\xe7\x72\x95\x87\x50\xe4\x0b\x5c\x4a\xed\xf6\x9f\x3a\x66\x27\xb7\xf4\x4b\xc2\xc1\xa4\xf0\xe0\x10\x7d\xfa\xe9\xba\x83\x9c\xa5\xa7\xaf\x5e\xd2\xb1\x3f\x1f\x5f\xaa\x9f\xb3\x42\x44\x11\x0f\xf8\x0a\xf2\x87\x47\xf9\xcc\x43\x5f\x75\x6b\x4c\x42\xbf\x64\xed\xba\x72\xe1\x3c\x4d\x2b\x37\xa7\xdd\xb5\x86\xec\x72\xed\x6b\x8e\x29\x93\xd2\x1e\x44\x14\x29\x84\x8f\x5f\x9f\xf9\x2e\x9b\x16\x86\xac\xde\x0b\x9b\x13\x71\xd8\xcc\x7b\xcb\x73\xb0\xde\xc5\xde\xbf\xed\xc0\xaa\xe9\xa3\xb3\x0d\x87\x77\x33\x1a\x0b\xff\xa5\x97\xd8\x0e\x01\x2f\x38\xae\xa7\x00\xe3\x0c\x72\x1c\x9e\xbb\x50\x3d\x01\xc9\x07\xcf\x65\x0c\xe3\x01\xb4\x5b\x3c\xb7\x31\x4c\x21\xf6\x63\x55\x78\xfd\x19\x2a\x4b\x4e\xa0\xde\xbf\xb5\x43\x0a\xe1\x64\xf2\x4d\x31\xc4\x53\x50\xf9\x41\xe6\x05\xb3\x04\x26\x81\x27\xc4\xb9\x10\x89\xd2\x07\x4e\x95\xea\x93\xd9\x59\x0d\x54\x3f\xee\x44\x3d\x23\xa2\x48\x10\x2c\x90\x2c\x35\xe4\x6c\xba\x0b\x3b\xf0\x48\xb5\x18\x6d\xdc\xa3\xa4\x51\x5b\xe3\xf1\xb9\xb7\xba\x78\xb3\xd6\x33\x28\xeb\xa9\x73\xd5\xeb\x07\x44\x14\x19\x86\x45\x80\xd7\xd1\xd1\xdd\xa2\x75\xfb\x3b\x92\xe9\xec\xbc\xd6\xd8\xab\x9b\x06\x2a\x6a\x7a\x54\xc7\xd8\xca\xfc\x54\x3a\x53\x4f\x56\x44\xdd\x20\xa2\xc8\x0c\x7c\x8f\xfc\xae\xa1\xba\xe7\x0e\x63\x7f\xff\xc6\xe5\x56\xf6\x66\xfe\x03\xf9\xba\x15\x66\x94\x0b\x32\xcd\x6b\xf2\x7b\x2f\xe4\xd0\xaf\x64\xf4\x0b\xff\x9d\xd9\x50\x88\x40\x22\xc1\x33\x1d\xc3\x04\x01\x3a\x80\x67\x3e\x86\x19\x06\x65\x0d\xcf\x05\x0c\x33\x03\x8e\x2e\x71\xbb\x65\x2c\xf9\x80\x2d\x8c\xdb\x32\x63\xc9\x07\x50\x22\xbc\xbe\x19\xc3\x34\x53\x81\xef\x01\xe0\x75\xd0\xa8\x0c\x0f\xe1\x9f\x5f\x5d\xca\x83\x89\xaa\xa4\x43\x55\xec\x3d\xa7\xe2\xe2\xfb\x1a\x24\x2e\x9a\xeb\x6a\x9c\xfb\xca\x65\x48\x1c\x5c\x0f\xd2\xe4\x3b\x35\xef\x73\x38\x51\xbe\x6f\xcb\x7f\xb8\x31\x9e\xdd\x36\x7b\x6b\xc1\x75\x61\xf7\x00\x83\x2e\x8b\x6e\x52\xdc\x79\x81\x65\xcf\x81\x4f\x32\x35\xb3\xbf\x36\x0a\xef\x06\x3b\x71\xbd\x26\xa2\xc8\x2a\x3c\xfe\x6d\xe0\x2b\xc7\x16\xc5\xb9\xab\xcd\x95\xb9\xbb\xb8\xd7\x63\x8e\x89\x1b\x70\x49\x72\x3a\xf2\xb6\x79\x12\xb3\x9f\xb0\x91\x4d\xda\x11\x51\xe4\x23\xdc\xe0\xa9\xa7\xe9\x3c\x2f\x58\x18\x43\x8f\xb5\xeb\x9f\x2b\xbe\x55\x76\xae\x9e\x31\x81\x41\x97\xda\xe0\xf7\x81\xe3\x57\x50\x71\x5d\xf9\x5e\xe1\xbf\x33\x1b\x22\x66\x20\xaa\x78\xa6\x43\x2b\x0e\x14\x7e\x3c\xf3\x31\xcc\x2a\xc0\xe0\xb9\x80\x61\x3e\x82\x12\x85\x27\x67\x40\xc4\x19\x94\x69\x5c\x49\x03\x60\x1c\xc1\x73\x70\x75\x0d\x80\x41\x81\x3f\x78\xe2\x06\x86\x09\x23\x03\xa5\x10\x4f\xe6\x40\x65\x19\x08\xd4\xf4\x5b\xdb\x71\x04\x96\x0f\x02\x8d\x5c\xaf\xf0\x77\x17\x71\x9a\x6c\xaf\x1b\xd9\x66\xbe\xa1\x40\x79\x68\xf3\xc3\xb7\xd1\x95\x17\x32\x47\x65\xb8\xf8\x0e\x0a\x05\x11\x51\x64\x02\x56\x98\xf8\x4a\x99\xe8\xbe\xb5\xd3\xc9\xa7\xdd\x15\x71\x33\xda\x37\x45\xc7\x1b\x29\xb9\x97\xc3\x4e\xe9\xde\x47\xae\xbc\xe0\x50\x62\xdf\xbb\xad\xde\x1a\xae\x55\xa6\x6b\x6a\xc7\xcc\xd8\x78\x4b\x96\xf6\x3e\xea\x10\x08\x6e\xf8\x4d\x69\xe6\x60\xf2\xb8\xed\x51\xe0\xb0\x16\xd3\xb9\xba\xb9\xa1\x6c\x14\x45\x5e\xc0\x7d\xa2\x44\xe2\xb9\x77\xdc\xf9\x7c\x83\xc7\xcb\x56\xf4\x82\xcb\x7c\x5e\x51\x1b\x1d\xc8\x7b\xbe\xff\xfa\xf1\x86\x0d\xbd\xba\x77\xe9\x09\x87\x50\xa4\x06\xde\xed\x5e\x9d\xb5\xfb\xa8\x24\xe9\x1f\xb4\xc5\xed\x97\x71\x95\x4f\xec\x53\x7a\x9a\xab\xf0\x62\x3a\x3f\x3a\xe0\xa6\xbd\x74\x59\x8f\xc8\xb2\xf0\xdf\x79\x09\x35\xf9\xa0\x15\xc1\xf3\x14\xc3\x4c\x80\x86\x1d\xd7\x5b\x4c\x80\x00\xb7\x8b\x70\x3d\x06\x98\x17\xa0\x55\xc4\x73\x1b\x6a\xc7\x48\xc0\x0e\xc1\x53\xb7\x50\x19\xe2\x36\x12\x97\x2d\x82\x05\xab\xac\x33\x5e\x41\xde\x86\xd6\x55\x8b\xbb\x69\x28\x2f\x3f\x2c\x0f\x58\x7a\x73\x9e\x33\x71\xce\xfe\x88\xea\x48\x57\xf5\xad\xaf\x95\xd1\xfd\x44\x14\xe9\x83\x2b\x61\x81\xad\xe8\x99\x9d\xf3\x96\xf1\x3e\x27\xbc\xbf\x9f\xea\xca\x3d\xf9\x95\xb9\xb1\xf5\x5d\x5d\x93\x88\xcd\xae\xba\x6a\xe5\xa3\x9b\x4e\x44\x14\xa9\xfc\xa3\xd1\x9f\x38\xe4\xa0\x14\x58\x54\x21\x17\xbe\x61\xba\x93\x79\xb7\x1d\x72\x1f\xbd\xd7\x5c\x14\x3c\x13\xf2\xfc\xd9\xe5\x34\x6b\xba\xdb\x44\x14\xe9\x85\x57\xfc\xd7\x4e\xeb\x1b\x73\x94\x34\xf9\xcb\x7d\x0f\xae\x87\x78\xbf\x0b\x3b\xd2\xe0\x3f\x7a\xc6\x28\x7e\x92\x5b\x73\xc2\xec\x2a\xc5\x74\xf8\x56\xcd\x81\x69\x7e\x99\x4d\xad\x1b\xc3\xb1\xb9\x6f\x22\x29\x41\xd9\x1c\x7b\x8e\xac\x5a\xb6\xfa\x59\x88\xf1\xee\x0b\xb9\xd1\xc3\x9e\xfa\xc0\x22\x58\x47\xf8\xef\xdc\x84\xe8\x27\xa0\xac\x78\xae\x62\x98\x3e\x50\x39\xf1\xdc\xc5\x30\x95\x80\x60\xe1\xb9\x8c\x61\x7a\x41\x0e\xc1\x73\x1b\xaa\xd0\xbb\x17\xd6\x48\xff\x52\xd4\x94\xe5\xee\x25\x25\xb8\xa2\x28\x32\x01\xf3\xdd\x68\x06\x95\x7d\xde\x67\xdd\x87\x6d\x03\x39\x3f\xaf\x17\x4c\x8f\x1f\x79\xb4\x59\x92\x94\x1a\xbf\xad\x36\xe4\x74\xcf\x92\x85\x27\x29\x8a\xcc\xfc\xf1\xf7\x9b\xcf\xf9\xd8\x55\xaa\xaf\x5d\xbb\xf7\xfe\xe9\xeb\xca\xde\xb3\xbe\xd9\xd1\x0e\x1e\x4b\xf9\x99\x84\xa7\x1c\x19\x56\x07\x2c\xe3\xb7\x11\x51\xa4\xf1\x8f\x1f\x04\xf8\x2c\x7a\x35\xcc\x56\x2b\x4a\xc6\xdd\xd8\xf7\xfd\x7d\x7e\xd7\x41\xe5\xb8\xaa\x70\xb1\x7a\x17\xd6\x5c\x46\xa6\xfb\x16\x0b\x1a\x44\x14\x49\x85\x1b\x47\x87\x6c\x89\x28\x76\xce\x47\xf2\x92\x62\x7e\xb4\xe9\x4e\x2f\x45\xfa\xbc\xcf\xb5\xab\x7d\x1a\x4b\x7a\x9f\x97\x6f\x5f\x9e\xa9\xa3\x48\x44\x91\xaf\xf0\xf8\xa7\x76\xf9\x06\x2f\xdb\x2f\x47\x19\x2c\xef\xa2\xfb\x59\x7e\x65\xf1\x36\x3d\x8b\xf4\xbc\xab\xdb\x4f\x23\xb3\xaa\xdf\xdb\x94\x88\x89\x44\x14\x79\x07\x9f\x0f\x91\xf4\x6b\x98\x49\x3c\x37\xbc\xed\x55\x50\xc4\x53\x2d\xfe\xec\x88\x6c\xbd\x8d\x80\xcb\x6a\x01\xd3\x73\x86\x7a\xc3\x3a\x67\x5f\x09\x22\x8a\x44\xc0\xf3\x0f\x5a\x3c\x1c\x6d\xb9\x3f\x10\x39\x3b\xd2\xb4\x48\x2d\xc3\x38\x4c\x3b\x78\x39\x83\xa9\xf0\x34\x79\xd1\x07\xab\x25\x85\xb8\x0f\xa3\xc2\x7f\x19\x45\x2c\xdf\x00\x1a\x8d\x17\x4a\xa8\xc2\x62\x1f\xc8\xc2\x09\x27\x86\x69\x04\xcf\xc1\x0b\x29\x86\x49\x05\xd5\x12\x2f\xac\x18\xe6\x2b\xc0\xe0\x85\x16\xc3\xbc\x03\xb2\x0c\x5e\x78\x31\x4c\x04\xd9\xbf\x72\x09\xae\x1c\x0f\xe4\x92\x0b\xff\x3e\x06\x4f\x92\x87\x5e\xf6\x5d\x0b\x55\xa4\x7f\x29\xce\xcb\x50\x93\x29\xb9\xa0\x28\xe2\x0d\xa7\xb8\x79\xfa\x5a\xe4\xd4\xca\xeb\x93\xa2\x8d\x14\x23\xeb\x9f\x1b\x39\xa6\xc6\xfd\x3d\xbc\x3e\xf6\x2a\x54\x57\x7a\xf1\x1b\x88\x74\x74\xa1\xc8\x37\x38\xc3\xdd\xd1\x5a\x36\x9d\xdd\x1d\xfd\xd2\xf7\xae\xc8\x99\x8d\x6e\xa1\x4e\xb7\x38\xe7\x03\xc3\xe9\x6a\x72\x52\x26\xf3\xec\xa3\x91\x7a\xa1\x44\x14\xe9\x81\x19\x9f\xc0\xe4\xac\xf0\xb1\x81\x38\x9f\xa7\xe5\x1b\x35\xe3\xad\xf9\x31\x72\x87\x5e\x11\x63\x2a\x12\x63\x3c\x2e\x53\xae\x24\x74\x3a\x9b\x13\x51\x24\x0d\x1e\xff\xa2\x5d\xcb\xb7\x89\xa7\xe3\x8c\x9c\xb0\x4d\x3e\x07\x0b\x3a\xf1\x6e\x1f\xaf\xe9\xc5\x21\xca\x92\x25\x56\x11\xf7\xe0\x86\x5d\x1f\x89\x28\x12\x08\x53\x8a\x7c\xff\x27\x2f\x3b\xae\xf8\x26\xaf\xd9\x8f\x72\x22\x42\x57\xaf\x3c\x29\xfc\xa4\x48\xa0\xf8\xb4\xad\xd2\xd7\xb2\x2a\x56\xa3\x6f\x64\x2b\xb7\xc1\xdd\x78\xb0\xff\x61\x9a\x0a\xc9\xa4\x90\xc2\xe7\xbf\x1e\x85\x92\xd2\x5d\xf3\xda\xb7\xfd\xfc\xeb\xeb\x11\x12\xd7\x1b\xd1\xdb\x3c\xfd\x9d\xaa\xc2\x7f\x19\x15\x4c\x52\x05\x59\x10\x2f\x34\x50\x3d\x06\x22\x09\x5e\x78\x30\x4c\x0f\xc6\xf2\x70\x42\x84\x61\xd2\x00\x06\x2f\x4c\x90\xdc\x0b\x38\x09\x5e\xa8\xa0\xea\x01\xfa\x21\xdc\x03\x1f\x80\x09\x00\x31\xc0\x3b\xf5\xc1\x30\x49\xc0\x1f\xbc\x93\x1f\xa8\x87\xda\xb9\x90\x44\xf6\x3f\x10\xde\x19\x10\x2a\x4b\x5f\x2c\xe5\xe1\x86\xa2\x48\x3e\xbc\xe5\x97\x1e\x4f\x90\xea\x4e\xe7\x98\x8d\xdc\x78\x2f\xd8\xda\x35\x2b\x6b\xbd\xd8\xfe\x51\xd5\x59\x49\xe4\x4b\x93\x6e\x56\xc2\x4c\xe6\x65\x14\x69\x86\x87\x7f\x39\x9d\xac\x43\x2e\x46\x20\xf7\x53\xf9\x3d\x2a\xf9\x66\x97\x8e\xeb\x13\xc3\x79\x34\x2f\xcc\x55\x67\xd8\xdf\xc3\x87\x6d\x7f\x00\x11\x45\xc6\xe0\x1d\x19\x3b\x1b\x36\xc3\xcd\x3a\x4f\xc8\x96\xcb\xf8\x79\x59\x29\x79\x5e\x84\x85\x5b\x8f\xef\xd0\xd4\x39\xb9\x31\xfa\x2b\xe6\x2a\x3b\xb6\x32\xbc\x3f\x9c\xe1\xa9\x0f\x8f\xdd\x0e\x7b\x42\x24\x0b\x10\x27\x95\x54\xa8\xde\xfd\x5d\xac\xe3\x65\xe1\xc6\x9e\x19\x93\xdc\xa3\x9e\x9f\xda\x54\xd8\x69\x89\x28\xf2\x12\x96\x12\x7f\x9d\x4c\xd8\x78\xa6\x37\x45\xe6\x78\xbf\xec\xa7\x9e\x99\x91\xd5\x40\x7d\x6c\x6e\xac\x8d\xe3\xf5\xa7\x4d\x45\xca\x69\x9b\x13\xea\x44\x14\xf1\x81\x49\xf1\xf1\xc5\x7d\x92\x84\x80\xf7\x86\x89\x8c\x97\x4b\x39\x87\xa9\x6d\x49\xf3\x6b\x2d\xe6\xc9\x5c\x6c\xf4\xd8\x79\xfb\x9d\xa5\x05\x32\x88\x28\xb2\x01\xcf\x7f\xcb\x77\xcc\x65\x0f\x6b\x19\x61\x60\x60\x62\x45\xa1\xd3\xee\xc1\x61\x17\x8b\x93\x22\x42\x65\xaf\x8b\x8d\x7f\x5f\x63\x60\x75\xfc\x42\x44\x91\x5c\x58\x80\x8a\x2f\x53\x3f\xc2\xee\x37\x94\x89\xec\x2c\x15\x5b\x09\xf2\xda\x3e\xdb\xc2\x78\x99\x84\xc3\xa2\xe8\xe7\x41\xd9\x1d\xa7\xd2\x2e\xda\x0a\xff\x65\xd4\xc1\x0a\xe7\x83\x9d\x84\x17\x7a\x68\x57\x00\x0c\x5e\xf8\x31\xcc\x18\xd8\xe5\x78\x4b\x80\x61\xfc\x41\xb5\xc1\x5b\x06\x0c\xf3\x12\xc8\xa1\x78\x4b\x81\x61\x7c\x00\x5b\xc7\x5b\x0e\xe8\x18\x0f\x3c\x07\x6f\x49\x30\x4c\x2e\x1d\x10\xbb\xf0\x8e\x49\x51\x59\x2e\x2e\x02\xf7\x56\x0f\xe8\x0e\xf7\x68\x4c\xb5\xa2\xc4\x8b\xcc\x4d\xe7\xeb\x9f\x49\x5b\x3d\xcf\xdf\x54\xf1\x95\x45\x3e\x77\x55\x05\x14\x87\x8f\xb0\x66\xef\xe2\xb7\x12\x24\xa2\xc8\x12\x7c\x4b\x4a\xcb\xe8\x5d\xea\x48\x6b\xc2\x8e\xb6\x67\xa7\x5d\x5b\x9d\xba\xe2\xf2\x53\xbe\xf9\x76\x5c\x8d\x31\xd9\x31\x6d\x7f\x75\xb6\xb9\x84\x8b\x88\x22\x31\x70\x01\x21\x2d\x3f\x1d\x72\x80\x83\x4e\xaf\xb8\xb0\xf5\x78\x27\x5d\x11\xe5\xee\x63\x32\x23\xd3\x65\x6f\xeb\xea\xe6\x05\xf7\xe6\xee\x62\x5f\xd8\xa2\x1a\x70\x8f\x79\x53\x91\xf4\xdb\xf8\xcb\xf1\xb1\x9d\x82\x29\x9d\x48\xf0\x0d\x9f\xd4\x88\xd7\xe5\xd5\xfb\xa9\x47\x3c\xe4\x05\xaf\xd1\xcc\x0c\x0e\x0b\xff\x9d\xd9\x58\x88\xdc\x41\xb3\x85\x67\x3a\x86\x59\x02\x27\xc4\x78\xe6\x43\x67\x86\x20\x19\xe2\xb9\x00\x91\x2c\xaa\x05\x77\xa6\xff\x81\x1c\x95\x65\xd5\xaa\x68\x4a\x07\xee\xba\xb4\x16\xc5\x94\x75\xbd\x0a\xf2\x3d\x3f\xf4\xa4\xc2\xc8\x56\x9d\xd9\xfa\xe3\x59\xd1\x8e\x30\x54\x76\x73\x73\x63\xf3\x9f\x4f\x71\x79\xc3\x2d\xda\xf1\xdf\x16\xca\x65\xef\x1d\x17\xc2\x23\x67\xb6\x6b\xbb\x9f\xba\xf3\xe9\xb7\x22\xc5\xa4\x77\x98\xfa\xcc\x53\x23\x64\x2f\xc3\x9d\x59\x14\x49\x81\xb3\x09\x7d\x69\xac\x6b\xea\xe5\x33\x23\x5c\xfd\x0b\x43\x34\x72\x25\x5f\x65\x56\x1c\x4b\x6d\xa2\x2e\x90\x99\x98\xd6\xda\xee\x3d\x47\x52\x0b\x5f\x3f\xe1\x77\x4c\x54\x97\x3e\xb0\x87\x9a\xba\x45\xe8\xf5\x62\x01\xdd\xa3\x9f\x44\x52\xfd\xa2\x8e\x88\xf4\x59\xc4\xbd\xc8\x92\xff\x23\x8a\x22\xb3\x30\x73\xe9\x56\x09\xf4\x2f\x7e\x42\x7c\xe9\x3a\x5f\xa9\x99\x61\x2d\x5f\xde\xd5\xd5\xc5\xe4\x65\xee\x37\x92\x66\xae\x10\x17\x47\xd5\x33\x82\x22\x73\xf0\xf0\x9b\x0e\xf7\x5d\xf8\x8f\x0a\x33\x52\x8e\x70\x4e\x55\xff\x50\x35\xb3\x4b\xed\xfa\xfa\xf0\x75\xa0\xad\x25\x07\x99\x11\xc3\xc1\x83\xaf\xa0\xa1\x36\x83\xad\xa3\x61\x7d\x1f\x1e\x52\xbd\x9c\x95\x6a\xbb\x19\xee\x52\xdb\x3e\x96\xfa\x33\xfb\x63\x23\xb2\xc9\x66\x1d\x7f\xee\x36\xfc\xd1\x97\x39\xd7\x58\x55\x56\x9f\xfd\x3e\x5a\x9b\xdb\xad\x3f\x3d\xe8\x51\x60\xd9\xf8\x2c\x6c\x9c\x2a\xf6\xf5\x40\x3b\x29\xab\xe8\x8d\x9b\x15\x28\x8a\x3c\x87\xb5\xd5\xd5\xcd\xfa\x93\xe9\xf4\x59\x65\xf7\xf8\x3d\x7d\x92\xb4\x47\x13\x0a\xc7\x1c\x54\x42\x24\x48\xe7\x51\xea\xb2\x3e\x26\xe6\x4f\x5a\x28\xf2\x1b\x0e\x5f\x87\x41\xf5\x8d\xb5\xbc\x95\xdc\x2b\x64\x3e\x17\x37\x35\x1f\x0a\x92\x6a\x4b\x57\xdd\x72\x8b\xad\xdd\xa8\x9a\x75\x61\x88\x7d\x7c\xd8\x09\x45\x9c\xe0\xe4\x2a\xcc\x1d\x57\xea\x21\x90\x68\xb2\x97\x40\xc5\x9a\xac\xd4\x29\x95\x48\x6c\x9e\x59\x94\x14\x3f\x51\xc1\x21\x97\xf9\xd4\xda\x3f\x14\x45\x8a\xe0\x7e\xb8\x45\x33\x49\xfd\x56\x50\xcd\x92\xdc\xe9\x07\xad\x79\x86\x31\x91\x7e\x99\xfe\x29\xb2\x8a\x9d\x47\xe2\x3c\xf2\x62\xc4\xbf\x57\x54\xa2\x48\x37\x6c\xfc\x55\xd1\xee\x8a\xc1\xa5\x95\x59\x85\x1f\x5a\xe7\x67\x6f\xcd\xa0\x53\xf7\x26\x86\x3e\xa5\x96\x0c\x5a\x16\xfa\x8b\x34\x58\x89\x75\x6f\x51\x65\x78\xbc\x63\xf0\x99\xc8\x94\x6f\x77\x0f\x2b\x1e\x1e\x4a\xb9\x46\xf4\x26\x89\xcc\x1d\x4d\x68\xf4\xd1\xd8\xf7\x9b\xb4\x34\x33\x96\x46\xc4\x13\x45\x11\x67\xb8\x74\x16\xd7\xe4\x2f\x1c\xdc\x3b\x59\xc6\x9d\x6a\x67\xd9\x4b\x26\x48\xd3\x70\x48\x6c\xa2\xc4\x3e\xbe\x35\x27\x64\xc0\xe4\xe4\xeb\x68\x02\x8a\x8c\xc3\xaf\xae\x9f\xfc\x0f\xb7\x2b\x0e\xab\x3b\xce\xa4\xf0\xef\x1b\xba\x6d\x13\x40\x1e\xe2\xd6\xf1\xee\x66\x37\xe5\x89\x8d\x0c\x9a\xa6\xb4\x8d\x47\x4e\x28\x42\x84\xcd\x51\x15\x95\xa7\x95\xb4\x52\xba\x7b\xe7\x28\xbf\x0a\x72\x99\x9d\x68\xcf\x1a\xf3\x5c\x7d\x53\xfc\xd7\x85\x13\x63\x2a\xa5\x2d\x04\x4a\x14\x71\x86\x5b\xc1\xd7\xca\x01\x85\x3e\x82\x2e\xb5\x57\x1f\x0f\x45\x04\xa6\x2c\xf4\x8e\xbc\xa3\x39\xfd\x9b\xe4\xd0\x7c\x8e\x84\xe7\x87\x73\x7b\xf2\xdc\x51\x64\x08\x5e\x2a\x23\x7b\xa3\x81\x0e\x96\xd5\x1d\x14\x0d\x3e\x75\x1e\xfe\xfb\x23\xfb\xaf\xec\x14\x7b\xb7\xb4\x30\xa5\x24\xf1\x25\xb4\x8a\x4f\x32\x1e\x45\x11\x27\xb8\x33\xdd\x2e\x24\xf0\xce\xe3\x56\xd2\x78\xab\xf9\x50\x7b\xdf\xd9\xa9\x78\x29\xab\xc0\x99\xb7\x9a\x0e\x73\x72\x44\x6a\xb3\x76\x4a\x61\x0e\x14\x69\x84\xf3\xe6\xe9\xa7\xa3\x82\xbe\xfd\xce\xcf\x32\xab\xa4\xab\x97\x5e\x1c\xd5\x59\xd9\x17\x24\x43\x41\x2f\xf5\x91\xbc\x86\xcb\x52\xae\xc8\x5c\x05\x45\x91\x22\x78\x27\x74\x56\x7e\xb5\xd7\xe7\xb7\x62\xe1\x3f\x62\x13\xdd\x27\xc9\xbe\xd3\xe3\xe5\xf5\x02\xf9\x3a\x8d\x6d\xec\x3e\xa7\x35\x69\x6f\xa4\x6a\xa1\xc8\x24\x1c\xfa\x3e\x75\x3d\x35\xef\xd7\x56\x31\x2d\xd6\x37\xef\xd9\xcd\x7b\x4c\x0f\x1d\x91\x0d\x09\xf2\xe7\xcb\xf9\x9d\x47\x7b\x89\x8d\xba\xd3\x0b\x1a\x8a\x7a\x59\xf7\xee\xaa\xc8\x7d\x9d\xd8\x17\x2c\xe1\xee\xcf\xe2\x26\x39\x30\x38\x2d\x77\xe8\x71\xfc\xf0\xc7\x03\x35\x0a\x2c\xcd\xb1\xd0\x50\xb9\x93\xe2\xd7\xa8\xa9\x28\x8d\xf8\xca\x0d\x52\x2f\x51\xde\xa9\xda\xf1\xa1\x27\x5f\x87\x2f\x7b\xc7\xe8\x03\xaa\x1e\x8b\xf3\x33\x6d\x4e\x28\x92\x0a\x27\xfb\xb2\x01\x19\xa1\xfc\x0f\x89\xeb\xbd\xf1\xdf\xb3\x1a\xda\x2f\x30\xb3\xfc\x4c\x32\x24\x08\xcc\x05\x30\xf7\xf8\x17\xba\x7a\xea\x15\xa3\x48\x2b\x7c\xb0\x91\xbb\xd4\x9b\xd9\xc3\x45\x5c\xfb\xf4\xe5\x68\x5d\xff\xa5\x9f\xcf\x72\xf6\x9b\xb5\x9c\x8e\x9f\xe3\x8f\xfa\x1c\x1e\x55\x4a\xaf\xe8\x8b\x22\xc3\xf0\xec\xe2\x68\x48\xf6\xcf\xd7\x3f\xdd\xda\x03\x97\x7a\x9d\xf4\x7e\x3d\xfa\x8e\x46\xbc\x11\x35\xe8\x3a\x71\x4a\xa3\x33\xf2\xed\x34\x93\xf7\x56\xed\x85\xdf\x0e\x16\x9a\xb2\xd5\x82\xa2\xba\x46\x91\x2a\xae\x01\xa7\x68\xb5\xe8\x61\x72\xbe\x0d\xea\xa3\x35\x43\xc6\xe9\x0e\x6b\xd7\x19\x32\x2e\x6e\x75\xba\xf0\x78\x61\xb5\x53\x77\x68\x04\x12\x2c\x6f\x54\x9d\x55\x62\x49\x1c\x34\x6b\x18\xbf\xa5\xa2\xf2\x8e\xb2\xf3\xfa\xc4\x40\x68\x5e\x70\x91\x0a\x8a\x4a\xab\x43\xc3\xef\xcd\x3f\x75\xea\x0d\xeb\xab\xdf\xcf\xaa\xda\x42\x6b\xef\x58\x2b\x6d\x1a\xce\x3c\x17\x7b\x42\x7c\x77\xff\xa5\xd3\xbf\x2e\x6c\x3a\xa2\xc8\x1c\xbc\xdb\xd5\x2a\x73\xb6\x91\x99\xae\x39\xb6\x04\x9d\x7b\xf1\x75\x76\xf7\xe9\xc9\x6a\x85\xc9\xab\xbe\xcf\x4e\x8c\xfb\x21\x23\xb3\x1f\xae\xdf\x46\x51\xe4\x15\xcc\xcb\xb4\xaf\xf8\x1e\xf9\x2d\x4a\xe8\x62\x7f\x79\x45\x4b\xaa\x29\x87\x7c\xfa\xc0\x37\x6d\xc2\xa5\xa0\x0b\xf7\x6b\xd4\x0e\x4f\x34\x64\x97\xa3\x48\x05\xbc\x5f\xe2\x6e\xf8\x6a\x31\xf8\xfb\xed\x08\x38\xbf\x4f\xdf\x71\xed\x81\x0a\x99\xa9\x8b\xab\xae\x57\x8a\x1e\x2f\xff\xe6\xbd\x65\xd2\xca\x23\x28\x8a\xa4\xc3\x34\x54\x6b\x6d\x63\xac\xb9\x66\x89\x44\x2c\x57\x81\x6d\x8c\xdd\xbd\xbb\xdc\x04\x2d\x6d\x08\x6e\xeb\xcc\x13\x71\x55\xd5\x11\xc9\xcf\x43\x91\x26\xb8\x6c\x5c\xfb\xc8\x4d\xee\x9d\x27\x54\xa5\xb6\x76\xed\x6c\x4b\x0c\x71\x81\xf4\xc7\xe7\xeb\xf7\x2f\x5d\xf2\x1f\xb1\xd2\xcf\x8d\xab\x54\x8b\x77\x42\x91\x62\x58\xd9\x7b\x2c\xc1\x93\xb8\xec\x31\x46\xcb\xb1\x66\xe8\x36\x9a\xf3\xcd\x58\x98\x9e\x71\xff\xa4\xee\xf1\x30\xd3\xf5\x7c\xae\xb7\xe6\x54\xd1\x28\x52\x0e\xdf\x5b\x8d\xd6\x49\x54\x59\xb6\xd2\xfd\xb0\x5d\xa1\xe4\xb1\xf7\x23\x4f\x82\x5a\x23\xc9\x5a\xd7\xc0\x2e\xef\x95\x8c\x84\x9e\x72\xfd\xe6\x3e\x14\x99\x84\x67\x6f\xd9\xeb\xe0\xad\x6f\xbd\xa2\xc8\x78\x3f\x55\xe5\x44\x45\xc5\xc5\x8c\xd9\x3d\x4f\xf6\xd1\x5d\x2e\xeb\x4e\x7e\x3b\x7b\xcb\x6c\x97\x1d\x34\x94\x5c\x76\xae\x57\x4a\xc2\x52\x75\xb1\x69\x0f\xdb\x29\x12\xee\x1b\x52\xaf\xca\xca\xac\xc5\x22\xd4\x9f\xfe\x5c\xa6\xa9\x96\x75\xd1\x41\x51\xc4\x07\xde\x93\x59\x3e\xc3\x47\x99\xad\xda\xd8\x32\xe5\xba\x2d\x9f\x9d\xfb\x75\x4f\xaf\xeb\x70\x55\xf6\xa2\x9d\xff\xe6\xae\x03\xba\xe1\xcc\xba\xc1\x28\x12\x0e\x27\x19\xfb\xe7\xfb\x0d\x05\x73\xb4\x0e\x08\xd7\x9a\xbc\xf2\xf4\xca\xbb\x5d\x4c\xf2\xca\xf6\x4a\xc7\x3b\x92\x9f\x7c\xea\x94\xe5\xb2\x25\x5b\x7b\xf2\x2d\x9c\x65\xb8\xec\x0f\x7c\xbb\xae\x5d\x15\x46\x3b\x67\x3b\x20\xa8\x28\xe7\x8f\x66\x68\x87\x25\xc5\x26\x1d\xd7\x38\xea\x79\xac\x3b\xbb\x2f\x1c\x2e\x4d\x65\xa3\x13\xaf\xbc\x93\x76\x4a\x36\x5c\xcc\x8c\x3d\xab\xc6\x2c\x90\x37\x63\xa3\xa7\xc6\xc6\x9b\xa6\x45\xd2\xd7\x10\x69\x38\x4b\x44\x91\x01\xf8\xf5\xd8\x6b\x79\xc9\x63\x54\xd5\x97\x6c\xd5\xbd\x7b\x37\x93\x9b\x22\x39\x8b\x5f\xc9\xcb\x28\xa3\x5f\x6f\x7e\x2f\x08\x7f\xfd\xcc\xb9\x63\xce\x09\x45\x02\xe1\xc6\xc5\x2a\xe0\x04\xc5\x89\xde\x57\x2e\x94\x6d\xa6\x37\x6e\x56\x1b\xd2\x68\xd9\xc7\x48\x15\x73\x5e\x8c\x27\xdb\xf9\xfa\x17\xd9\xbb\x64\x6f\x14\x89\x87\x37\xcc\x87\x98\x5e\x22\xeb\xcc\xc9\xfa\x05\xcf\x07\xd6\x5e\x54\x9e\x65\xfe\xaf\x84\x26\xdd\x22\xf2\xa8\x38\xcf\x12\xdf\x69\x33\x1c\xa2\x45\x91\x7c\x78\xc3\xec\x2d\x9c\xbc\xaa\xcd\x54\x62\x4e\x7b\x66\xf1\x71\xc1\xa4\x36\x2b\xf9\xa0\xa4\x00\xed\xd9\x0b\x79\x2b\x83\x56\x21\xb2\x77\xcf\x27\xa0\x28\x92\x08\x27\x77\xa9\xcb\x0e\x59\x0b\xd6\x7b\x34\xbc\xac\x7f\xfa\xd2\x14\x3f\x3e\x93\x60\x6e\x38\x18\xb2\x5e\x60\x6b\x16\x9c\x71\x6a\x40\x5c\x30\x02\x45\x8a\xe1\xed\x9e\xfb\xab\x92\xb3\x90\xe1\x12\x51\xb8\xc9\x38\x8f\x38\x4d\xc3\x75\xc2\xfd\xcc\x92\x7b\xe6\x9d\xa9\x57\x2a\x37\x68\x62\x8d\x2c\xcb\xa0\xa1\xc3\x47\xa4\x72\x8d\xc4\x58\x85\x7b\xbc\xa8\x57\xe4\xea\x2f\x79\x7d\x2d\xcb\xe8\xba\x48\xbc\xd1\x34\xb3\x59\x9e\x3d\xed\x78\xad\x12\x1a\xea\x4a\xe9\xf9\xa8\xec\x44\x97\xf4\xc8\xee\x15\xb6\x8f\x1d\x0c\x37\x76\xa7\xa5\xa9\xea\x7d\x1a\xbc\xac\x1d\x7c\xfd\xd3\x81\xa9\x9b\x9c\x4e\xa8\xf4\x3e\x98\xab\x7e\x9a\x17\x6f\xbc\x6a\x2e\x67\x48\xa7\x69\xff\x21\x4e\x5b\xb3\xf6\x41\xa1\x7c\x9e\x38\xbb\x9c\x4f\xed\x5a\x61\x94\x3c\xb7\x3c\x8a\xa4\xc3\x9b\xdc\x38\xeb\xe0\xf8\xfd\xf5\xf1\x23\xf7\x0d\xb2\x74\xc6\x7e\xf1\x37\x48\x66\xc4\x51\x97\x92\xa4\x2d\xa6\x9b\x71\x3a\xd9\xb5\x76\x59\xa2\x48\x0b\xec\xa2\xfb\x67\x43\x1d\x35\xe1\xc5\x50\x0a\x12\xae\xeb\xb4\xa3\xfe\xc2\x52\x44\x6b\x57\x23\x21\x8a\xf4\xcb\x9b\xbd\xdf\x98\xec\x73\xac\x84\xff\x92\xd0\xc9\x3a\xfe\x2b\x75\x00\x31\x1a\x8f\xd5\x61\x98\x14\x72\x70\x84\x89\xcb\xef\x64\xb8\x49\xff\xf9\x45\x85\x2c\x58\x00\x3d\xa9\x91\x7c\x1b\x9d\xdb\x2f\x1e\x77\xee\x9b\x4a\xb2\x9c\xc7\x95\xe7\xb2\x11\xd5\xe2\x54\x09\x9a\xd2\x97\x24\x27\xa2\x2d\x95\xf2\x89\x28\xe2\x07\x97\x55\xc1\xd8\x83\xf5\x4d\x85\xa6\xa3\x1f\x4a\x7a\x1f\xa7\x4e\xe4\x53\xa8\x86\xae\xb1\x9a\x7a\xd5\x28\xf5\x51\x6c\xca\x6a\x17\xf2\x11\x88\x28\x12\x05\xa7\xd5\x4b\xed\xa4\xcd\x6d\x56\xa5\xd2\x14\xd6\x4d\x94\xdc\x5d\xe4\xf6\x62\xad\x6f\x42\x24\x47\x76\x7a\x26\xb5\x3d\x19\xf0\xf2\x3a\x66\x41\x44\x91\x72\x38\xc9\xdb\x2f\x3f\xe4\x6f\xf6\x53\xf3\x37\xe0\xdc\x39\x53\xef\x46\x92\x62\x74\x5e\x32\xf6\xad\xb9\x27\xc3\x50\xc0\x71\xeb\xbd\x39\x54\x0a\xc2\x7f\x67\x36\x16\xa1\x2c\x20\x2e\xe2\x99\x8e\x61\xfc\x80\xc0\x8a\x67\x3e\x86\x89\x02\x07\x47\x78\x2e\x60\x98\x72\x70\x2c\x80\x4b\xb6\x01\x66\x16\x08\x62\x78\x8c\x1b\xc3\xcc\x91\x80\xb6\x12\x8f\x7b\xa3\xb2\x5c\xa4\xcc\xff\x5c\xe0\x72\x81\xf3\x28\x8b\x3f\x75\xdc\x00\xaf\xe6\x07\xf9\x81\xfa\x73\x97\xfb\x07\x3c\xa9\x13\xfb\x58\x34\x7b\x9f\xee\x5c\x8d\x21\xba\x44\xae\xc7\x4d\x12\x51\x04\x85\xab\x63\xb7\xdc\xf4\xc9\x29\x26\x16\x9d\xe0\x1d\x9f\xcc\x15\x46\x49\xcf\x90\x39\xc9\x5c\x58\x54\xd8\xaf\xa8\xf1\x9c\xa7\xd3\xd3\xe5\x4d\x00\x11\x45\xa6\xe1\xf1\xa1\x36\xca\x3b\x3d\xc8\x76\xb0\x89\x53\xbe\x95\xf4\x24\x89\xd1\x8e\x2f\xe4\x7c\xc4\xb1\xcd\xb2\xe4\x69\x90\x92\xba\x71\x4f\xb2\x14\x11\x45\x26\x60\xba\x76\xcb\xc8\x74\x99\x21\xe1\xf4\x42\x04\x69\x92\xbe\x96\x67\x0b\xb9\xa6\xd9\xee\x81\xa0\x9c\xf9\xc4\xef\x2d\x72\x45\x04\xf6\xfc\x71\xe1\xbf\x33\x1b\x0b\x91\x0b\xd0\xc7\xf1\x4c\xc7\x30\x28\xe8\xf0\xf1\xcc\xc7\x30\xd3\x00\x83\xe7\x02\x86\x99\x60\x04\xe7\x7e\xb8\xfd\x90\x2c\x35\x29\xc9\x3f\x27\xc3\x93\x70\xed\xe9\x1f\x4d\x3c\x1e\xc8\x78\x67\xe2\x2c\xdb\xa4\xe4\xb3\x6d\x1a\xe2\xaa\x27\x7b\xf9\xdb\xce\xdd\x47\x16\x82\x7b\x2b\xcc\x9e\xc4\xae\x12\x51\xa4\x0c\x1e\x2f\x6d\xc6\x5e\xdb\x7c\x83\x2d\x41\x5f\x38\xe2\x46\x8a\xc4\x81\x76\x23\x0b\xda\x80\xb4\xbc\x84\x0c\x66\xf1\x7a\xa5\x74\xc7\x2c\xe9\xad\xb6\x0b\xae\x55\x0e\x1b\xda\xe6\xcf\x6f\x8f\xb6\xbe\xff\xe1\xeb\x42\x4d\x33\xa5\xc7\xab\xb5\xb7\x7d\x57\xa7\x42\x63\x51\x5a\x62\xb8\x68\xdd\x3b\x6f\x14\x89\x80\x8b\xc9\xc8\x98\x47\x4d\xbd\xd1\xe4\x93\x81\x75\x6a\x4b\xf5\x7b\xbb\x63\x48\xf9\x59\xa4\x58\x42\x72\xa4\xa5\x05\xb9\x87\x13\x19\xdb\x1e\x6d\xf9\x0c\x9b\x73\x26\x81\xdb\x80\xb4\x23\xe6\x70\x49\x71\xf1\x55\xa6\xd8\x8e\xed\xad\xd9\xb2\xa3\x1d\x6b\x57\x44\x7d\xb8\xae\xab\xc7\x72\x4e\xda\x09\xff\x9d\x97\x58\x44\x27\x81\x20\x80\xeb\x29\xc0\x94\x01\x0c\xae\xb7\x00\xf3\x1c\x68\x5a\x78\x2e\x63\x98\x08\x70\x63\x06\xcf\x6d\x68\x87\x00\xdb\x70\x1b\x60\xcc\x36\xf0\x1c\xbc\x2e\x18\xc3\xfc\x06\x3a\x18\x6e\x27\x0c\x30\x4e\xe0\xd2\x17\x6e\x3b\x0c\x30\x45\x20\x31\xe2\xf5\xc4\x18\xa6\x1b\xf8\x83\xdb\x17\x03\xcc\x3b\x80\xc1\xed\x8d\x01\xc6\x19\x68\x9b\x78\x0d\x32\x86\x19\x07\xc5\x01\xb7\x49\x06\x18\x22\xb0\x0d\xb7\x53\xc6\x6c\x03\x59\x0c\xb7\x5d\x06\x98\x21\xb0\xa6\xb8\x2d\x33\xb6\xa6\xa0\x40\xe2\xf6\xcd\x00\xd3\x08\x84\x3b\xdc\xde\x19\xdb\x07\x60\xef\xe0\x35\xd0\xd0\xbb\xbd\x7b\xa1\x8b\xec\xef\x5a\x69\x54\xb6\x58\x29\x92\xc2\x9d\x88\x22\xa5\xb0\x94\x15\x28\xf7\xeb\xc5\x49\xb5\xb1\x6c\xbb\x71\xae\xe3\x4b\x0e\xcc\x59\xe3\x33\x14\x17\x5a\x3c\x03\x83\x14\x34\x36\x25\x2f\x70\x7a\xf4\x6c\x55\x7b\xb8\x78\x1d\xbd\xfb\xac\x5c\xbf\xba\x78\x9d\x79\xf6\x22\xd3\x99\x4d\x0e\x87\xd7\xef\x12\x53\x4e\x9d\xe2\x58\xe5\xbd\x13\x7c\x2a\x5f\xee\x58\xf0\xd6\xf8\x3f\x9a\x2f\x06\xeb\xfb\x31\x6c\xb4\xbb\xe3\x25\xfa\xf7\x1e\xb7\xf3\x0c\xde\xa0\xf5\x49\x61\x8c\xfd\x6c\x46\x25\x6f\x19\xc9\x20\xc4\xa8\x4c\x44\x91\x64\xd8\x9e\xfa\xdd\x5c\x57\xf6\xd4\xf3\x30\x2a\x91\x86\x3d\x48\x65\xd3\x68\x31\x89\x39\x76\x7c\x2c\xfb\x80\x21\x69\xd5\xc9\xae\x8d\xf5\x23\x12\x5b\xe3\xe1\x74\x59\xff\xc6\x7e\xea\xdd\x61\x49\x96\x90\xbe\xfb\x71\xc1\x89\x21\x0e\xad\x4a\xdf\xd6\xe4\xa2\x62\x19\x48\x76\xa8\x6e\x73\x79\xe6\x1c\x46\x44\x91\x2f\xb0\x38\x31\x23\x16\xf8\x54\xde\x72\x1f\x55\x49\xe3\xb7\xc4\x56\xce\xe6\x54\x6f\xa7\xc0\x9f\xd6\x91\x26\x5f\x65\x32\x13\xd0\xc2\x2b\x34\x86\x44\x14\x09\x87\x9b\xa4\xa8\x00\xfe\x12\xc3\xd2\x61\x25\x7e\x5d\x51\x0f\x1a\xb4\xc6\x6b\x5c\xb3\xcd\x33\xcc\x23\x82\xe1\x61\x52\x5b\x8a\xbc\xb2\x57\x2e\x8a\x22\xce\xb0\xbf\x31\xef\xee\x3b\x33\xe5\x7c\x3f\xb8\xfb\xd5\x03\xd7\x47\x0d\x52\x5a\x2e\x72\x9a\xe9\x61\xd6\x6d\x13\x02\xba\x67\x4d\x06\x3b\x64\xbb\x51\x24\x1f\xe6\xe1\x79\xb7\x0a\xd5\xb2\x0b\x13\xbe\x58\xfa\x3a\xbb\xed\x3b\xf1\xf4\x4c\x73\xb2\x63\x44\x6f\xcb\xe5\xde\xb3\xf6\x16\x0e\x91\x4b\x47\x89\xc2\x7f\xb7\x4a\xd8\x8e\x28\x05\x94\x09\x6f\xa5\x20\x3a\x07\xea\x34\xde\x6a\x41\x18\x70\x33\x04\x6f\xc5\x30\x4c\x32\xb0\x0d\x6f\xd5\x20\x0c\xc8\xf6\x78\x2b\x87\x61\xbe\x80\xac\x85\xbb\x7a\x00\x13\x0e\x32\x03\xee\x0a\x62\x19\x08\xc4\x00\x6f\x19\x31\x4c\xfe\x76\xf0\xa9\x1a\x3c\x45\x0b\x95\xdd\x46\x4d\x4d\xea\xb2\x55\xbe\xe0\x6e\x96\xb6\x78\xe7\x89\x9c\x7a\xae\x17\x36\xa7\xc4\x26\x32\x53\x5a\xef\x3f\x4e\xbf\x58\x26\x4f\xb7\x57\xaa\xde\x80\x32\x4b\x76\xc1\x49\x65\x2b\x9d\xc2\x3b\x78\x85\x83\x27\x3d\x90\x9b\x8d\xd4\x3c\x5a\x7e\x78\x22\xae\xd8\xee\xf0\x27\x1b\x79\xc5\x9e\xb3\x14\x8b\x24\x17\x17\x36\x12\xae\xcb\x6f\x75\x63\x7f\x7c\x89\x24\x9b\x68\x18\xd0\x5f\x2a\xfa\x52\xe4\x9e\x70\x68\x2a\x4d\xdc\x61\xf7\x9f\x9e\x8e\x9d\x5c\xef\x25\xef\x97\xdd\xfa\x46\xcb\xa5\xb0\x95\x76\xe0\xae\xe7\x59\xf7\x75\x71\xfd\x9b\x63\xde\xf7\x1b\xf2\x7a\x13\xe5\x32\xa9\x1c\x84\x3f\xb3\x7f\xfd\x4e\x1c\x1d\x77\xa5\xd1\xe4\x3a\x56\xc0\x42\x44\x11\x1f\x98\x5e\x0f\xd8\x5c\xa2\x47\x34\xc2\xee\x0a\xa7\x30\x54\x5c\x70\xca\x5f\xaa\xf8\x3d\xb3\x66\x6f\x44\xc7\x61\x1a\x69\xaf\x98\xbc\x69\x64\x21\xfc\x77\x6e\x42\xc5\x1d\xf4\x92\x78\xae\x42\x05\x07\x2c\x37\x9e\xbb\x50\xcf\x0a\xb6\x22\x9e\xcb\x50\x82\x06\xc5\x10\xcf\x6d\x0c\xe3\x03\x0a\x1b\xae\x86\x09\x30\xa9\xc0\x36\x5c\x21\x13\x60\x5a\xc1\x15\x67\x3c\x35\x13\xc3\x0c\x83\xe7\xe0\x29\x9a\x18\xe6\x25\x20\x38\xb8\xaa\x26\xc0\xcc\xec\xfc\xf7\xca\x0b\xae\xb4\xf9\x2f\x46\x5a\xfd\xdf\xc7\xe0\xca\x9b\x58\xb3\x08\x96\x07\x57\xe2\x04\x98\x57\x20\x5b\xe2\xea\x9c\x00\x53\x01\x6a\x3b\xae\xd6\x09\x30\xe9\xe0\xbc\x17\x4f\xf0\xc4\x30\x4d\xe0\x55\xc0\x15\x3d\x01\xa6\x18\x64\x31\x5c\xe5\x13\x6b\xe6\xc1\x67\x2e\xf0\xe4\x4f\xe8\x55\xa0\x01\x8d\x39\xae\x10\x2a\xeb\x4c\x20\x20\x5b\x9d\x5d\x0e\x9c\x39\xf4\xe5\x5f\x5b\x9d\x3e\x16\xfb\xe9\xe5\x5a\xe2\x79\x75\x1e\x0d\xde\xab\x4a\xeb\xb3\x8c\xc1\x45\x29\x39\x43\x67\x5b\x2e\x1f\xf9\x12\x48\x44\x91\x6a\x38\x33\x29\x8a\xb0\xc9\x0f\x4f\xeb\xac\x35\xe7\x3b\x4e\x05\xbf\xbb\x7f\x61\x51\xa9\xcb\x47\xe8\x29\xd5\xb9\xb6\x8f\x0c\x3b\x8f\x0f\x1c\x3d\x4b\x44\x91\x66\x58\x56\xe4\xa3\x7c\xe3\xe1\xf5\xd6\x4f\x43\x9e\xd1\xae\x9d\xd8\x7d\x20\xc3\x41\x96\xec\xa4\x7e\x77\x73\xd3\xaf\x2a\x2f\x6b\x87\x6c\xfa\xec\xad\x77\x13\xd6\x87\xb4\xaf\xbe\x3b\x9e\xe1\x72\x7d\x50\xba\xe0\xa2\x49\xda\x5c\xb7\xf1\xf5\xf4\x0b\x83\x9a\x87\x9f\x29\x18\x9c\xa9\x70\x2c\x5e\x4d\x0f\x16\xfe\x3b\xb3\xb1\x10\xe5\x80\x37\x1f\xcf\x74\x0c\x53\x0d\xb6\x30\x9e\xf9\x18\xa6\x19\x6c\x2d\x3c\x17\xa0\xac\x04\x68\x30\xae\x2c\x8d\x61\x40\x86\xc1\xd3\xa6\xa1\x42\x0c\x62\x80\xa7\x4f\x63\x98\xb7\xe4\x60\x6b\xe1\x29\xd5\xa8\xac\x1c\x29\xe9\x3f\x9a\x4f\x3e\x7c\xf7\x6b\x49\x8c\xec\x0a\x41\xf4\xc5\xee\x49\x5d\x2a\xc5\x3b\x03\x31\x77\x35\xdf\x70\xe9\xa9\x30\x6b\x6f\x94\xa8\x7d\xb6\x51\x13\x7a\x74\x95\x88\x22\x9d\x7f\xdc\x05\x55\x5a\x29\x6a\x0a\xbf\xdf\xf5\x7e\xf1\x4a\xf0\xe5\x73\x0e\xcb\xd3\xbd\xe7\xbf\x1c\xe3\x7c\x73\xd9\xf3\x3c\x4a\x7a\x29\x52\x95\x89\x88\x22\x19\x30\xad\x75\xdb\x79\x2a\xad\x3f\x53\x49\xe8\x3b\xbb\x82\x4c\xa9\xce\xd8\x69\xc5\x6b\xd1\xf9\x1f\xb5\xa7\x06\x04\x3f\x65\x39\x56\x9f\x54\xe1\x25\xa2\x48\x1b\xcc\x0b\x79\x22\x16\xe3\x97\x64\xc6\x0f\xeb\x3d\x3a\x9b\x4c\xf2\xc3\xc8\x73\x53\x71\x8a\xbe\xae\x94\x2f\x27\x43\xed\xc7\xfa\x03\xd2\xfa\x62\xe1\xbf\x33\x1b\xe2\x1d\xe0\x2e\x16\x9e\xe9\x18\xa6\x13\x2c\x39\x9e\xf9\x18\x26\x03\x70\x3c\x3c\x17\x30\x4c\x1b\xc8\x26\x78\xe7\x06\x18\x66\x00\x14\x22\xdc\xb3\x03\x80\x09\x04\x0a\x05\xee\x01\x02\xc0\xc4\x83\x57\x05\xf7\x14\x01\x8b\x35\xc8\xc2\xb8\x27\x09\x00\x93\x08\x3a\x60\xbc\xe3\x04\x28\x73\xd3\x01\xad\x0c\xef\x60\x01\x95\x21\x45\xdd\xb7\xa8\xa4\x37\xdc\xac\x5c\x5a\xf8\xb4\x5a\xc4\x5f\xce\x6b\x45\xd2\x76\x50\x91\xef\x21\x7f\x85\xa2\xda\xed\x94\xf7\xdc\x53\x9c\xcb\xcf\x91\x67\x95\x7b\x4d\x89\x28\x12\x07\x4b\x5f\xc5\x45\xf7\x12\x4d\xf6\x3d\x73\x0d\x36\xe0\x0f\xaf\x5f\x08\xd1\x65\x6c\x98\x66\x96\x67\xe5\x43\x1b\xe7\xca\x04\x34\x0c\x67\xc4\x89\x28\xb2\x08\x1f\x60\xd5\xa7\xce\xd7\xc8\xd7\x3f\xe2\x39\x57\xe0\xab\x58\x24\xb8\xe4\xc0\x57\x33\x2d\xb0\x5d\x3c\xc6\x24\x67\x5e\x98\xe1\xc1\x4f\x9b\x0c\x22\x8a\x74\xc3\xd4\xf3\x7b\xa1\xc4\x95\x11\x2a\xad\x30\x8b\x7b\x99\x79\x0d\x29\x4e\x75\xcc\xb4\x5a\x3e\x0f\x22\x55\x4e\x1f\x25\x8b\x6c\x5f\xbc\xcb\xb5\xf5\x16\x2e\xc1\xc7\x12\xeb\xe4\x34\x56\xf5\x6a\xc6\x47\xd6\x0f\x0e\x97\x5a\xc6\x36\xcb\x90\x04\xd2\xae\xf9\x05\x53\x79\xbc\x7f\x39\x19\x12\xcc\xc8\x57\x28\xfc\x77\x6e\x42\x14\x0f\xd4\x42\x3c\x57\x31\x4c\x1c\xd8\x55\x78\xee\x62\x98\x45\x90\x18\xf1\x5c\x86\x34\x1f\xb0\xe3\xf1\xdc\xc6\x30\x4b\x74\x0b\x63\xff\x97\x18\xf1\xce\x93\x50\x84\x9b\xde\x89\x88\x22\x1f\xe0\x05\x0c\xd7\x13\x5b\x3d\xa6\x1c\xea\x4a\x73\x96\x59\x5f\x2a\xbf\x76\xf8\xa2\xac\xa2\x66\x5b\xe2\x36\x79\xf5\xb7\x42\x06\xac\x97\x54\x92\xb6\x72\x2f\x7c\xa2\x71\x79\x28\xf1\x5c\xc8\xfa\xdd\xd6\x9c\xd9\xbd\xbc\x5f\x5d\x43\x76\x71\x7f\x3b\x1a\xe4\xce\xb2\x6e\xf7\xe1\x21\x97\x47\x71\x1f\x27\x3b\x8a\x22\xe5\xf0\x89\x4c\x10\xb9\x5d\x8d\xa9\x32\xad\x5b\xde\xcd\xdb\x0f\x2c\x9c\xc6\xcf\xb4\xdc\x5c\xeb\xfe\x46\xcd\x9b\xca\x49\x16\x1a\xd8\x7e\xdb\x3b\x0d\x45\x7a\xe1\xe1\x9e\x31\x2d\x33\x9f\x8e\x92\x50\xba\xd0\x07\x9e\xd6\x8a\x2d\x28\xa8\xee\x40\xeb\x1c\x48\x1d\x75\xf9\xe5\x92\xec\xdc\x42\x73\x32\x85\xff\xce\x6a\x2c\x3e\x1f\xc0\x3a\xe0\x5a\x8e\x15\x1b\x40\x67\x71\xad\xc7\xf8\x12\x38\x98\xc1\x73\x01\xc3\xf4\x92\xfe\x4b\x81\x71\xcf\xf6\x00\x05\xde\xf7\xef\x63\x70\xcf\xf7\x30\x9a\x09\x92\x2f\xde\x21\x1f\x86\x69\xa1\x5b\xe0\x22\x51\x25\xec\x30\xbc\x77\x5f\x50\x44\xd0\xd4\xfa\xbe\xd5\xbd\x87\xf7\x8c\xfe\xfc\x3f\xad\xff\xa3\xfc\xc6\x9c\xe7\x5f\xe6\x22\x37\xa7\x89\x69\x3c\x03\xaf\x86\x99\xd9\x1a\x7e\x5e\x78\x26\x8f\xe8\xce\x21\xd9\xf9\xf4\x2d\xa1\x9b\x6e\x44\x84\x60\x4c\x42\x90\x22\x10\xa0\x75\x66\xde\x30\xae\xd6\x8b\x89\x31\xa1\x13\x3d\x2b\x2f\xe6\x13\x77\x99\x78\x78\xae\x32\x4c\xd9\x51\xc9\x37\xdc\xee\x3b\xb5\xaa\x27\x1d\x33\x89\x2a\x81\xe6\x7f\x8f\xbb\x67\x76\xcf\x0a\xfb\x2f\xfd\xff\xe1\x5b\xfd\xb8\xf4\x38\xa7\x29\xfd\x04\x1c\xae\x04\xfd\xd8\x58\x1d\x89\x6d\x9e\xa8\xf0\x4b\xf0\x6e\x88\xf5\x77\xad\xa0\x4e\xcc\xbe\xe6\x04\xff\x95\x86\x54\x6a\xfa\x81\x44\x4f\x5d\xbe\xc6\x90\x42\xe3\x30\x83\x47\xce\x67\x26\xf3\x45\x2d\x2a\x85\x72\x99\xeb\x5d\x9c\xc6\x29\xbf\xb2\x90\x4d\xdd\xd7\xb7\xb6\xb2\xba\xf3\xc0\xf0\xfe\x23\xb3\x3b\x56\x95\xe4\x7f\x87\x43\x65\x49\x3c\xb9\xb5\xbc\x88\xa8\xc6\x71\x32\x5f\xd3\x9c\xbc\x27\x67\x88\x8b\x77\x47\x9f\x4b\x06\x10\xd1\xcb\x43\x5c\x7c\xbe\x93\xd6\xef\xaf\xcf\x89\x07\x0c\x4e\x98\x4f\xda\x25\xd6\x21\x07\x46\x26\xfc\x79\x1e\x66\x71\xff\x28\xb1\x77\xaf\x62\xbe\x87\xa2\xaa\xa4\xe4\x05\x3c\x2d\x81\xc7\x99\x3a\x7e\x89\x9d\x29\x75\x9f\xdb\xf3\x68\xf9\x7e\x45\x21\x0b\xd9\xc8\xd6\x84\xf1\x2b\x23\x97\xd9\xde\x90\xb6\x16\x94\x9a\x06\xea\x4c\x35\x51\xb9\xa5\x87\x4a\x2f\x95\x37\xb8\x79\x4c\x39\xc6\x45\xa5\x37\x2a\x2c\xb9\x2a\x11\x0b\xac\xae\x77\x85\x97\x54\x7b\xc6\xa7\xa5\xc5\x33\x1b\xfc\x63\x47\x8c\xe6\x85\x55\xbe\xfe\x62\xf7\x09\xbf\x70\xd9\x3b\x37\x78\x54\xed\x1b\x3d\xbb\x50\x51\xfd\xed\x92\x0d\x8d\x8c\xe9\x7d\x42\xaf\xca\x7a\xa8\x77\x74\xf6\x65\x32\x99\xb3\x9b\x7f\x7b\xc7\x50\x5c\xcd\x6c\x48\x44\x55\x49\x47\x76\x08\xed\x73\xb5\xaf\xcd\x98\x8c\x3b\x9d\x41\x15\xfa\xed\x0b\x3b\xa7\xe0\x1a\x0b\xd9\xc4\xd6\x3f\x99\x5c\x7e\x3b\x7f\x31\x2e\x42\x95\x75\xa1\xcd\x44\x93\xeb\xd8\x0b\x3e\xc9\x63\xb4\x2c\x64\xe3\x5b\xd6\x77\x38\xaf\x5c\x4c\x8d\x9f\x16\x2d\x32\x7f\xc9\xab\xf5\x84\x32\xf0\xdd\x82\xca\x2a\x0b\xd9\xe8\x96\x19\x2f\x47\xbc\x25\xbc\xf5\xba\x2a\x4f\x27\xe4\xf1\xda\xd2\xa8\x37\x27\x4f\x44\xc9\xaa\x6f\xe7\xd6\x4b\x54\xfc\x7a\x36\x7e\xb9\x71\x66\x4a\x7f\xd2\xbd\x31\x6f\xd4\x51\xae\x9e\x7b\x93\x71\x48\x70\x88\xd9\xe8\x9f\x09\x7d\xd3\xee\x96\x4d\xb8\x13\x83\x68\xb4\xab\xed\x4d\x07\x1a\xaf\x5c\xb8\x3a\xc9\x42\x36\x89\xaa\x92\x4e\x3b\x24\x86\x6c\x6c\x6f\xdd\x2f\xfa\x72\xe9\x1e\x12\xed\x39\x31\xe4\xa9\x24\xc2\x42\x36\xf6\xbf\xd0\xdf\x6c\x28\x17\xfd\x68\xfa\xa6\x6c\xf5\x85\x9d\xfc\xf1\xdf\xce\xbf\x1c\x1c\xdc\x86\x3e\xfa\x96\x17\xa9\xb8\x24\xf1\x23\xf1\xe9\x3b\xeb\x4d\xdf\x38\x1c\xb0\xac\xfb\x2e\xa9\x73\xba\x5b\xf5\xc4\x1d\xe6\xbb\x44\x54\x95\x44\x2c\x4e\xb5\xcb\x32\x6b\xd6\x9d\xe9\x8d\x9f\x9d\x7b\xb1\x4c\x73\xd1\x95\xf6\xc3\xcc\xc6\x5b\xff\x72\x39\xf9\xa8\x79\x51\x0a\xaf\x74\x7b\xd8\x99\xe1\xc8\x9f\x14\x65\x1b\xf7\x99\x93\x99\x35\xff\x79\x14\x6a\x70\xe7\xbd\x0c\x69\x9d\xe6\xe2\x50\xe0\x24\x41\xba\x59\x84\xea\xe1\x38\x63\x2b\xb7\x6d\x74\xc1\x9e\x4f\x1f\xa7\x0b\x5e\xd3\xdc\xc8\xda\xf9\xe5\x59\x89\x06\x69\x77\xc7\x4d\x5a\xd6\xf4\xa0\x36\xe6\x3b\x7d\xff\x57\xbd\xb3\xa9\x28\x63\xa7\x5a\xc6\xf4\x2d\x3e\x74\xf8\x98\xbd\x39\xc8\xf3\xe5\x8b\x1a\x0f\xe9\x13\xdd\x4a\xb2\x81\xf2\x57\x79\x11\x6e\xc8\x0b\x68\xbf\x72\x37\xa3\x47\xc7\x64\xdf\xdd\x5b\x3f\x29\x7e\xf3\x56\x57\x41\xbd\x7c\xdb\x23\x36\xe5\x9b\xc7\xab\xce\xe8\x6e\x08\xcb\x90\xed\x57\x96\x92\x82\x06\xef\x61\x7e\x7c\xd3\xbe\x4c\x7a\xa9\xd9\x2e\xdb\x73\xd1\xc7\x21\x42\xc4\xe3\x30\x6a\x56\xed\xa6\xf4\x5d\x33\xac\x75\xbd\xeb\xfe\x71\x29\x19\x02\x49\xef\xff\xc7\x8b\x07\x0d\x7d\x18\x4d\xae\x83\x96\x0f\x39\xec\x48\x32\x2a\x19\x8b\x65\x77\xcb\x9e\x89\x65\x38\xb1\x31\xa7\x36\xad\x54\x18\x76\xc4\xb9\x03\x26\xb3\xe7\x03\x95\xda\xe6\x5f\x9f\x5f\xca\x91\x98\xf6\x6a\x8d\x92\xf8\xc6\xea\x76\x89\xaa\xad\x33\x91\xa3\x4b\x2b\x41\xd5\x3f\x64\x13\xfe\xe8\x55\xf7\xab\x80\x8c\x9e\x36\x4b\xbf\x87\x37\xe6\xe4\xc4\xc4\x1b\x10\x46\x91\xb6\x30\x62\xeb\xcb\x86\xce\xb2\x41\x3f\xab\x27\x15\xaf\xce\x90\xdc\x83\x0f\xd7\xd6\xb4\x5a\xd5\xe2\xcb\x3c\xfa\xbf\x32\x0c\x74\xe4\xad\x9f\x32\x7d\x25\x5a\x2c\x7d\x9d\xbe\xe6\x91\x73\x85\xb1\x85\xfd\x89\x6a\x33\xa9\xdf\x7a\x7f\x17\x35\x2f\x84\x60\x84\x10\x8c\x1c\x17\x34\xf8\x09\xbc\xd4\x24\x0c\x5c\xa5\x15\xb2\xbf\x27\xba\xba\x06\x0b\x44\x1d\x5e\xbf\x69\xc9\xa6\xdd\x9c\x39\xc0\x98\x25\x3c\xd2\xe7\x18\x6a\x1b\x29\x44\x94\x77\x76\xa4\x62\xe5\x22\x10\x08\xa4\x5c\x0b\x1f\x29\xfe\xce\x74\x67\x0a\x12\x16\x92\x5e\x27\xd9\xcd\x67\x04\x02\xbc\xa0\x61\x8c\xa2\x79\x86\x66\x81\xe7\x2f\x5e\x78\x7b\x9b\x3b\xa8\x24\xdd\xfa\xd1\x81\x6f\x93\xe5\x12\xbb\x64\xb8\x58\x43\xaa\x0f\x9e\x2a\x82\x86\xea\xfd\xda\xc7\xf1\x2a\x66\x21\xf6\xb1\x13\xef\xc9\x2f\x0d\x94\x4f\x9d\xac\xb5\x6e\x1b\x38\x34\x4b\x4c\x6f\x18\x19\x18\x04\xc4\x35\x40\x43\x0d\xe4\xf6\xf0\x51\x70\xb7\xdf\x49\x1f\x1e\xcf\x2f\x91\x38\x5f\xbb\x14\xeb\x16\x7c\xdd\x81\x4e\x3a\xe1\xf7\x81\x77\x4f\xaf\x96\xc2\x37\x4d\xee\x7c\x75\xbc\x61\x73\xa0\xda\xa5\xc1\x61\xff\x91\x31\xc2\x38\x3f\xc7\x83\x84\x7e\xcd\x77\xb9\xea\x0c\x1e\x83\x5f\x47\x52\xd7\xdf\x43\x43\xdf\x28\x7e\x4d\x11\xe6\xe0\x4c\x35\x22\x3e\xb3\x1b\x1f\x5d\xe7\x6f\xb0\x9f\x52\xf4\x0b\x43\xc3\x5f\x8d\x5c\x7c\xfb\x98\xc0\x07\x7f\x8b\x2e\x36\x8d\xfd\xfb\xd5\xaf\xbd\x9b\xc6\xaf\x99\xf6\x32\x74\x85\xde\x1d\xdf\x59\x3a\xb8\x2b\xca\x4f\x79\xa7\x2d\xa5\x47\x86\xe2\x85\x93\xd0\xd0\xc5\x26\x65\xf3\x29\xd4\xbd\x5b\xea\xe9\xb3\xea\x96\x53\x72\x1d\x83\x07\x0d\x7e\x5a\x67\x87\x19\x1a\x47\xf2\x56\x1d\x10\x1f\xfc\x09\x0d\x6d\x15\xd7\xf7\xde\x2e\xa1\x6c\x5a\x53\x70\xbc\x37\xb3\xcf\xd6\xbc\x6d\x7e\xdb\x3d\xc1\xcf\x0b\x53\x6f\x85\x3b\xef\x9e\xd0\xed\xb4\x80\x86\x12\x9e\xc7\x2f\x9c\x99\xdd\xa6\x61\xaa\xa7\xd2\xdd\xfa\x38\x7a\x8f\x19\xcd\xa8\xb2\x70\x36\x69\x72\xef\x31\xdb\x59\x74\xd8\xa4\x1a\x3e\x02\x7e\x1c\xd9\x33\x73\x92\x99\xc5\x4f\x4e\x9e\x87\xd8\xbd\x4c\x5f\xeb\xbf\xfa\xfa\xa7\xd0\xdb\x00\x77\xb6\xf5\x76\x9f\x00\x92\x67\xd0\xd0\xcd\x62\x21\x61\x42\x74\x9d\xf3\x75\x45\xd1\x0d\xa3\x97\xd6\x0e\x64\xee\xc2\x0b\x75\xef\x77\xc7\xaa\x9f\x3c\xdc\xb3\x34\x41\x69\x09\x0d\x7d\xa4\x13\x1c\xd3\xb7\x79\xb1\x85\xf3\x77\x77\xab\x5f\xe4\xcd\x48\xd9\xf7\x7b\x2c\xf9\xde\x68\xf1\x53\xf3\x74\x7f\x62\x2d\x7e\xa3\x01\x0d\x3d\x64\x74\x86\xdd\x20\xc2\xe4\x02\xa7\x75\x5b\xcd\x97\xe4\x75\xb5\x40\xc1\xaf\x5f\x73\xef\x68\x2b\xb9\x1c\xaf\x1d\x3c\x64\x35\x06\xff\xda\x6a\x9b\xcd\xcd\x70\x3b\x79\xd1\x73\x91\xfe\x62\x64\x33\x0b\xfe\xbc\x99\x05\xa1\xb6\x9f\xf7\x1d\x50\xaa\x8f\x5a\xb5\x55\xdd\xd8\x0c\x84\x86\x92\xa4\xd8\x94\x39\x8e\xf3\x29\xb6\x7c\x6e\xf4\xf0\x67\x70\x0b\xf8\xe6\x33\xf4\xa0\x3a\xbd\x34\xc4\x4c\xf9\xe9\xf1\xf8\x74\x7b\x0d\xc7\x60\xc6\xbf\xdb\x82\x4e\xb2\x9b\x9b\x9b\x9b\x8e\x21\x5c\xcf\x09\x54\x6d\x02\x1a\x87\x08\x24\x68\x3f\x19\x71\x84\x94\x6b\xa8\x52\xe4\x53\x9d\x88\x54\x80\xdf\x9c\xfc\x4c\xd6\x6e\x2d\xc7\x2c\x3d\xce\xfd\xbf\xba\x9c\x09\xf6\x2f\x2d\x35\x1e\xdc\xb2\x3c\x4f\x64\xa1\x88\x24\xb0\x12\xf6\xa6\xa8\x4a\xc9\x11\x48\x7f\x57\x46\x12\x08\x04\x84\x40\x22\x25\x45\x90\x7a\x4e\xf2\xe7\x54\x8b\x9c\xa1\xfd\xeb\xb2\x5a\x9b\xdf\x17\xa2\x39\x52\x77\x5c\x5f\xda\x41\x23\x53\xd6\x28\xa7\xa8\x44\x73\xa8\xe4\xc9\xb9\x98\x44\x56\x22\x0b\x45\xd4\x7f\x4d\x45\xfa\xe7\x54\xcf\xe5\x2e\xfd\x08\x4e\x3f\xc5\x4a\x21\xd7\xaa\xd3\x51\x18\x7f\xeb\xe4\xc6\x9a\x58\x86\x21\x9b\x57\x88\xe2\xfd\x07\xe1\xdf\xa2\xae\x11\x59\x28\xa2\xff\x6b\x2a\xb2\x3f\xa7\x92\xd7\x98\x45\x50\xde\xb4\xd7\xbf\xb9\xee\x34\x9e\xba\xba\x32\xa0\xcb\x1c\xbb\xad\x68\xbe\xf5\xf4\x93\xb8\xab\xb4\xa8\x4d\x8f\x1e\x91\x85\x22\xe6\xbf\xa6\x22\xff\x73\x2a\x3f\xa9\x15\xef\x51\x1f\x77\x82\xf7\x69\x0a\x55\x99\xf3\x37\xc4\x5f\x32\x87\x1b\xec\x34\xa8\xb3\xa3\xa2\xf2\xaa\xfb\xf1\xa8\x4c\x92\xc8\x42\xf1\xf6\xbf\xa6\xa2\xf8\x73\x2a\x87\x77\xce\x07\x0d\x39\x42\xf7\x2c\x1b\x46\x1f\xf4\x72\x8d\x14\x5b\x58\x21\x2b\x1d\x62\x3e\x3f\x68\x6b\x75\xde\xe7\x0a\x97\x91\x05\x91\x85\x22\xf6\xbf\xa6\xa2\xfc\x73\xaa\xdb\xdf\xd7\xbc\x2e\x3b\xfa\xc7\x26\xf8\xbc\x91\x7f\xaa\x76\xe8\xc4\x65\xe9\xc9\x79\xd2\x3c\x3e\xe3\xb5\xb4\x56\xda\x27\xe1\x74\x74\x44\x16\x8a\xb8\xff\x9a\x8a\xea\xcf\xa9\x22\x35\xd0\x74\x1d\xa3\xd8\xdd\x9e\xbc\xfa\x33\x86\xdf\x0e\xd5\x27\x70\x12\x9b\x07\x64\x9a\x3c\xd3\x9b\xa9\x04\xbb\xd0\xdc\xad\x15\x8c\xff\xaf\xa9\xa8\xff\x9c\xaa\x55\x77\x97\x81\xb3\xdb\x7b\xc7\xc1\xbd\x3a\xa5\x85\x09\xb5\x71\x46\x3b\x82\x04\x5f\x07\x51\xe5\x96\x0a\xb8\xaa\x88\x3e\xfb\xc6\x4f\x64\xa1\x48\xf8\xaf\xa9\xb6\xfd\x39\xd5\xad\x43\xee\x6f\xba\xde\x14\x5e\x1e\x66\xf5\x75\xf3\x88\xdd\x7b\x9f\x23\xda\x6d\xa1\x4b\xee\x88\xc9\xab\xee\x2a\x4f\xed\x38\x73\x71\x22\x0b\xc5\xbb\xff\x9a\x8a\xe6\xcf\xa9\xac\xc4\x38\x47\x97\xac\x38\x0c\xbf\x7c\x9a\xd6\xec\x6b\xe9\x3d\xad\xa1\x60\xd1\xff\xa9\x8d\x6a\x2c\xea\xc6\x0b\x21\xb3\x72\x0d\x2d\x22\x0b\xc5\xfb\xff\x9a\x8a\xf6\xcf\xa9\x06\x9a\x28\x88\x57\x39\x4e\x2a\xcb\xec\x50\x9f\xdb\x7b\x4b\xba\x25\x62\xf9\xb9\x34\x1b\x8d\xf8\xee\xfd\xaf\x2d\x98\xec\xeb\x24\xb9\x88\x2c\x14\x89\xff\x35\x15\xdd\x9f\x53\x05\x6f\x58\xd0\x3f\xc8\x3d\x9a\x51\x42\x72\xda\xa0\xfd\x66\xc4\x33\x2e\x36\x8d\xd7\xdf\x22\x9e\x15\x30\xa6\x16\x5e\x20\x74\x14\xdc\x26\xb2\x50\x24\xfd\xd7\x54\xdb\xff\x9c\xaa\xbe\xd2\xbe\x64\x44\x2d\x78\xe1\x45\xa1\x7e\x08\xa5\xe3\xf7\x34\x0d\x05\x46\x0d\xa1\x82\xce\x1c\x1d\xf3\x28\x97\xd9\x01\x9e\x2d\x07\x93\xff\x6b\xaa\x1d\x7f\x4e\x25\xa0\xf4\x33\xad\xa2\x68\xca\x65\x76\x24\xea\x97\x58\xc3\xdd\xc0\x37\xad\x72\x97\x68\x0c\xac\xeb\x6e\x34\xea\x26\x78\xd9\x73\xd0\x12\x59\x28\x52\xfe\x6b\xaa\x9d\x7f\x4e\xa5\xd2\xd9\x13\x51\x73\xe5\x89\x38\xfd\x03\xbd\x07\xe6\x3e\xa7\x13\x32\x3e\xe6\xca\x5d\xb5\x95\xd0\x64\x33\xf9\xf9\xfa\xaa\x97\x80\x14\x91\x85\x22\xf5\xbf\xa6\xa2\xff\x73\x2a\x7b\x65\xea\x27\xed\x47\x97\x54\x29\xe4\xa9\xcf\xde\x8e\x0e\x58\xb9\x51\x2d\x39\x9d\x2c\x2a\x20\x64\xbe\xfd\xfb\xd5\x43\x5f\xce\x9d\x20\xb2\x50\xa4\xfd\xd7\x54\xbb\xfe\x9c\xca\x3b\x31\x93\x86\xf9\xe8\x97\x96\x93\xb6\xcf\xcb\x82\x0b\xfa\x79\xfb\x7b\xdc\x7a\x8b\x55\x55\x0d\x0e\x29\x4b\xe4\xd5\xc4\x07\x5b\x12\x59\x28\xd2\xff\x6b\x2a\x86\x3f\xa7\x62\x73\xfb\x5d\x7e\xf9\xc4\x21\x06\x0d\x2e\xe5\x60\xe9\xe8\x47\x75\xac\x8e\x23\x0a\x8d\x42\x93\x7a\x4c\x71\x06\x5d\xab\x8f\x6e\xee\x21\xb2\x50\x64\xfc\xd7\x54\x8c\x7f\x4e\x95\x7e\x74\xf0\x67\xe6\xc5\x1f\xaa\xc1\x17\xdb\x34\x98\x49\x95\xfe\x1f\x63\x7f\xe2\x4d\xd5\xfb\x3f\xfe\xff\xb6\x61\x1f\x33\x51\x72\x95\xcc\x73\x86\xa8\x28\x32\x65\x8a\x64\x88\x48\x94\x59\x86\x32\x93\x29\xec\xcc\x52\x99\x0b\x19\xca\x50\x86\x8c\x99\x32\x0f\xa9\x28\x43\x64\x28\x32\x54\x48\xe6\xa9\x68\xf0\x5b\xe7\xb3\xd6\x7b\xfd\x5e\x67\xaf\x75\xad\xe7\xf7\x1f\xb8\x3b\xe7\xd8\xfb\xda\x8f\x6b\x9f\xed\x86\x81\xa9\xab\x5e\xd0\xfd\x56\x79\xc0\x36\x50\x5a\x31\x95\x08\x90\xc3\x00\x55\x25\x2c\xb5\x97\x34\x35\x4e\x71\x93\x62\xfe\x2d\x47\xea\xc7\xa1\x1b\x2f\xe8\x9f\xa9\x14\x6c\x0c\xe7\x59\x0d\x08\xde\xe5\x0c\xa1\xaa\x54\x32\x0e\x0c\xb9\x8a\x01\xaa\xe7\xb0\xd4\x3e\xd2\x94\x08\x5d\xed\xd1\x9b\x96\x7f\x47\xe7\xf5\xeb\x82\xde\xb8\xee\xda\x8d\x7d\x6d\x53\x39\xaf\xf3\xe7\x9f\xd6\x70\xc5\xb9\x3b\xd7\xc8\x28\x30\x40\x55\x05\x4b\xb1\x91\xa6\x24\x37\x9a\xb1\xac\xeb\xfa\x77\x0b\xf7\x66\x1a\xff\x54\x28\x7d\x22\x74\xf0\xbe\x59\xfa\xd1\x3c\x7f\xab\x1b\x3a\x1d\x67\x44\x98\x79\x30\x40\x55\x0d\x4b\xed\x27\x4d\x31\xb6\x04\x6f\x56\x54\xdd\xe5\x18\x76\xda\xa4\x8d\xef\xcd\x18\xaa\xbd\xe4\x29\x28\x7b\xc0\x22\xe7\x53\x39\x63\xaa\x24\xfb\x13\x01\x0c\x50\xd5\xc0\x52\xec\xec\xa4\x2d\xcf\xfc\x92\x7b\x45\xbc\x2f\x95\x13\xb8\xa2\x34\xcd\x9f\xb4\xc5\x99\x27\x07\xff\xf8\xae\x4b\x76\x7c\x3a\x34\x85\x67\xaf\xb4\x26\x15\x06\xa8\x6a\xa1\x2d\x40\xda\x5a\x48\xef\xb8\x74\x61\x30\xf5\xc0\xb5\xfd\xbc\x96\xd9\x9c\x2a\x5c\xd6\x4c\xbf\x6f\xbb\xdd\xd2\xef\x56\x2b\xd9\xd5\x78\x74\xbf\x90\x19\x03\x54\x75\xd0\xd6\x01\xd2\x96\x71\xca\xe9\xd7\xdd\x52\x08\x79\xd3\x60\x81\xd2\x8c\x2e\x16\x55\x35\x16\xab\x9a\xd0\x70\x7b\x90\xe2\xd7\xa7\x1e\x86\xbd\x53\x04\x0c\x50\xbd\x80\xb6\x0e\x92\xb6\x4e\x06\xa7\x05\x47\x5c\x3c\x6f\x37\xe1\xcc\x19\x19\x9b\x74\x63\xf9\x53\x9b\xb0\xf7\xbf\x3e\xde\x94\x1b\x0f\xb3\xf4\x64\x2f\xae\x5d\xc1\x00\x55\x3d\xb4\xc5\x41\xda\x8a\xbc\x7c\x51\x7f\xfe\x49\xf8\x2b\x11\xd7\x22\xa3\xbf\xef\xee\xed\x0d\x3d\x70\xca\xe4\x53\xe5\x06\x73\xd1\xe7\xdb\x41\x7c\xfa\xa2\xc4\x43\xbe\x01\xda\x3a\x44\xda\x0a\x08\x3b\xbd\xee\x71\x78\xfa\xcc\xf4\xeb\x37\x2d\x73\x0b\xa5\x56\xed\x87\xe8\xef\x39\x18\xe7\x0d\x1b\xc7\xd0\x2b\xd9\x1f\xcf\x97\xc0\x00\x55\x23\xb4\xc5\x49\xda\xba\x4c\x5e\x5b\x77\x5b\x38\xba\x55\xe1\x57\xf6\xd2\xaa\x78\xb5\xb4\xcb\x7c\x77\x20\xd9\xe0\xda\x43\xfb\x74\x53\x2b\xc5\xc4\x66\x21\x0c\x50\x35\x41\x5b\x5c\xa4\x2d\xbb\x8c\xfb\x5d\x1a\xad\x77\x7c\xdc\x74\x55\x0b\x05\xd4\xde\xea\x2a\x31\x05\x66\x5e\x3d\xb8\xed\xdb\xa3\xe8\x39\xb6\xc1\xe3\xa5\x8a\x01\xaa\x66\x48\xab\x94\xf5\xff\xdb\xc0\xff\xff\x1f\xcc\xd8\xb9\x71\x57\x85\xce\x35\x9a\xfa\xcc\x91\x94\x1f\x1d\x49\xf6\xd1\x4f\x39\xf6\xa8\xcf\x7a\x72\x9e\x30\x19\xc9\x3d\xe4\x31\x39\x18\x4b\x5f\x6f\x8a\x01\xaa\x16\xe8\x1b\xe1\xc1\xfd\xe2\xdf\xbd\x50\x7d\x7b\xd7\xf7\xd4\x60\x05\xaf\xf8\xf7\x14\xa3\xe1\x87\xbe\xac\xf5\xec\xdf\xb9\xad\x6a\xad\x55\x1b\x1f\x0c\xad\x92\x63\x80\xaa\x15\xda\xe2\x25\x6d\x9d\xdd\xef\xd5\x47\x43\x37\xfc\xef\xdf\xdc\x42\xd3\x4f\x0d\xa6\x15\xee\x35\xd1\x06\xf7\x93\x36\x76\xe7\x1e\x2a\x30\x9c\xb4\xe0\x26\xce\x66\x6d\xd0\x16\x1f\x69\xab\xa9\x21\x70\xa4\xad\xa8\x79\xf7\x04\xe1\x76\x7a\x5a\xef\xeb\x92\x01\x2f\x8e\x60\xd3\xd6\x93\x1e\x61\xbf\x84\x06\x83\x7e\x84\xa8\x61\x80\xaa\x1d\xda\xe2\x27\x6d\x15\x9b\x92\x3d\x14\xfa\xf6\xea\x03\xed\x9f\x36\x8a\xeb\x91\x15\x5f\xf6\xd3\x55\x65\xf8\x86\x25\x07\x7a\xba\xc6\x7f\x74\x99\x8e\x22\xbe\xae\x0e\x68\x4b\x80\xb4\x15\xbc\xa8\xaf\x72\x43\x90\xf6\xed\xcf\xe1\x20\xed\xe1\xcb\x9c\x79\xbc\xdc\x8f\x18\xae\x7c\x73\xf0\x77\x3c\xba\xfa\x50\xcd\xf2\x14\x8a\x01\xaa\x97\xd0\x96\x20\x69\xab\x1e\xe8\x6d\x50\x14\x0d\xb1\xac\x89\x37\x3a\x78\x89\x8b\xc9\xa4\xb2\xda\x59\xef\x18\xcc\x38\x34\xb9\xfb\x1f\xac\x6e\x17\x22\xce\x67\x9d\xd0\x96\x10\x69\xab\x39\xf6\xcb\xa6\xc1\x45\x01\x5f\xed\xab\xd2\x21\xad\xf9\xf9\xad\x36\x81\x14\x07\x3e\xa9\xdf\xa2\x43\xf3\xca\x7f\xd5\x2d\x6a\x0a\x63\x80\xea\x15\xb4\x25\x4c\xda\x7a\x13\xbf\xdf\x63\xb4\x53\xfb\x77\xab\x51\xb4\x41\x6d\xef\xd6\xd3\x73\xb2\xda\xd3\xe2\x0d\x02\xe5\xe0\xc1\xa7\x89\xe2\x67\x3a\xa7\x31\x40\xf5\x1a\xda\x12\x21\x6d\xbd\xd3\x08\x6d\x32\x21\xb8\xde\x1d\xd0\xfa\x48\xcd\xdd\xa5\x2f\xa2\x29\xe4\xe5\x2b\x17\x69\x6d\xfe\xd9\xe6\x49\x85\xd4\x75\x27\x3e\x0c\x50\xbd\x81\xb6\x44\x49\x5b\xd5\x95\xb7\xda\xce\x55\x7d\xe6\x17\x70\xbf\xe4\xf2\x4f\x6c\x0f\xc7\xf5\x4b\x35\x8d\x89\xdf\x5c\x5c\x62\x9d\xc5\x37\xe3\xc2\xa3\x89\xaf\xab\x0b\xda\x3a\x4c\xda\xaa\x7c\xbb\x69\xcd\xe8\x5a\x9c\x59\x59\xd3\xf6\x6c\xfe\xd3\x2f\x7b\x8f\xdf\xdf\xda\xab\x96\xf6\x2b\x7d\xba\x55\xb9\x41\x2b\x9b\x7f\x12\x03\x54\xdd\xd0\x96\x18\x69\x6b\x88\xe6\xec\x76\x78\x5a\xf1\xbc\xf7\xf6\xe8\x98\x8c\xbc\x2e\xb9\xec\x9d\x14\x83\x68\x75\x9d\xdf\x6e\xb3\xed\xfa\x5a\xa5\xfc\xc4\xf3\xf1\x2d\xb4\x25\x4e\xda\x1a\x1d\x11\x16\xda\xb6\x9a\x76\x4b\x3e\x79\x95\x25\x4d\xa2\xe2\x58\x82\x1c\x3f\x1f\xe5\x0f\xab\x3b\xf6\x04\x7e\xc6\x97\xa2\x2a\xc4\x85\xf8\x1d\xb4\x25\x81\xbb\x70\xcd\x2f\x87\xc4\xf7\x12\xbc\x83\x0a\xc9\x8c\x9a\xfe\xcd\x95\xbd\xf8\x5d\x4e\xa3\xbf\xca\x15\xed\xca\x7b\x75\x90\x82\x27\x4d\x09\x03\x54\x3d\xd0\x96\x24\x69\xeb\x95\x8a\x67\x8b\xba\xe6\xb5\x12\x42\x6f\x29\xe7\xc5\xba\xed\x4b\xb4\x77\x27\xe9\x90\x40\xa3\x83\x16\x09\xdc\xaf\xc6\x8f\x92\x69\x60\x80\xaa\x17\xda\x3a\x42\xda\x0a\xfb\xcd\xd0\x58\xc5\x49\x43\x96\x74\xa5\x7f\x2c\x60\x66\xaa\xbd\x9c\xbd\x7b\x33\x2c\xf7\xae\xc1\x05\x17\xeb\x84\xaa\xd6\x77\xc4\x63\xa2\x0f\xda\x92\x22\x6d\x1d\x6d\x70\xa5\x08\xba\x33\xc5\x78\xf9\xf4\x68\x4e\x14\xf3\x1d\xf6\xfc\x33\x7b\x5e\x58\x1d\xce\x4b\xdb\x7d\xa2\xff\xd1\x7c\x75\x8c\x38\x8b\xf6\x43\x5b\xd2\xa4\xad\x27\xe7\x65\x9c\x14\x6a\x3e\xf3\xa4\xaf\x75\x15\x4c\x0c\x7e\x16\xd2\x0e\x32\xf1\x66\x8d\x58\x8e\xb3\x49\xd4\x4c\x33\x12\xb4\x72\xc5\x00\xd5\x7b\x68\xeb\x28\x69\xeb\x71\x44\x46\xc3\x12\x41\x28\x38\xbe\xff\xa3\xeb\xec\x87\x2f\xc1\x97\x5a\x9e\x1f\x1a\xb0\x9d\xdd\xcd\xa1\xea\x1d\xce\xb0\xfe\x4b\x3c\xb7\x07\xa0\xad\x63\xb8\xb5\xf0\x4a\x89\x7a\xb6\xe9\x01\x16\xe6\x43\xba\x64\x6c\x32\x02\x74\x8a\xf4\xf1\xae\xcb\x8e\x84\xd6\xe9\x60\xcb\xf1\xb0\x61\x51\x04\x03\x54\x83\xd0\xd6\x71\xd2\x56\x17\x67\x55\xba\xc3\x1b\xe6\x5c\x8a\xac\x48\xca\xab\xda\xf2\x63\x1e\xe2\x1b\x65\x73\x3e\xfc\x5d\x01\x5f\x43\x37\xad\x76\x6f\x13\x8f\xd5\x0f\xd0\x96\x0c\x69\x4b\xf5\x83\x89\x7f\xac\xf6\xe3\x89\x09\xaf\xd5\xb5\x44\xa7\x32\x33\x91\x33\x16\x7c\xd2\xdd\xb7\x59\x9e\x3c\x12\xd5\xb1\xfc\x5a\x46\x5c\x0b\x87\xa0\x2d\x59\xd2\x16\xfa\xa2\x86\xfd\x5a\x50\x77\xec\xbc\x24\x7b\x12\x45\x43\x5d\xb6\x40\xdd\x65\x65\x55\xd3\x77\x23\xe3\x8f\x05\xaf\xbe\xfb\xea\x49\xdc\x08\x0c\x43\x5b\x27\x48\x5b\x89\xa5\x21\xce\xe5\x9b\x14\x14\x16\x54\xae\x72\xd4\x99\xef\x3c\xf7\x39\x26\x07\x3f\x71\xbd\x59\xb1\x5d\x8f\x9c\x34\x30\x99\xbd\x8c\x01\xaa\x11\x68\xeb\x24\x69\x2b\x2a\xbf\xad\x9f\xdd\x73\xdf\xc6\x70\x71\x39\x53\x48\xca\x2a\xf9\x72\xa1\x29\x9b\xec\x49\x31\x95\xc6\x25\x13\xba\x74\x13\x46\x5b\x0c\x50\x8d\x42\x5b\x72\xa4\x2d\x1f\x21\xa7\x9c\xcd\x23\x0d\x1f\x56\x77\x46\xd3\x18\xf4\x03\x5e\x25\x4a\x77\xf4\xce\x3c\x6b\x66\x7a\xad\xf4\xe2\xbe\x43\xe3\x98\x13\x06\xa8\x3e\x42\x5b\xf2\xa4\x2d\x69\xf7\x13\x2e\x37\x93\xff\xea\x32\x4d\xda\x78\x34\x2f\x33\x4e\xac\x78\x6e\x51\xae\xa9\x0b\xac\xf4\xd2\xab\xad\x3e\x0e\x51\xe7\xc5\x00\xd5\x27\x68\xeb\x14\x69\xeb\xd7\xcc\x4d\x3e\xa6\xac\x60\xf2\xf1\x11\xbf\x82\x5f\xf9\x7a\xe5\x1a\xf2\x92\x11\x97\x0e\x49\x5a\x2c\xd9\x2d\xea\x75\x47\x8e\x38\x62\x80\x6a\x0c\xda\x52\x20\x6d\x75\xef\xaf\xaf\xf9\x5a\xd1\x91\xfe\xcc\xbb\xf2\xce\xd2\x9e\x04\xab\xfb\x48\xb2\x2b\x83\xde\x83\x3c\x35\xe6\xa3\xe2\x7e\x2a\x46\x86\x18\xa0\x1a\x87\xb6\x14\x71\x7b\x72\xd5\xf7\x05\x53\x0e\x75\x81\x1a\xb5\xf7\xd7\x14\xc7\x1e\x99\x28\x3b\x95\xb8\x06\x07\x64\xd2\x2e\xce\x55\x05\x30\x14\xf1\x12\x5f\xd7\x67\x68\x4b\x89\xb4\x45\x55\xc8\xcc\xd7\x66\x74\xe2\x4a\xf2\xea\xd5\x60\x8a\x98\x34\xd5\x03\x1a\xbc\x60\x36\x3c\xee\x4c\x4a\x62\xfd\xd6\x0c\xad\x24\x17\x06\xa8\x26\xfe\x63\x60\xfb\xaf\xdb\xae\xff\x33\xb0\x29\x93\xfe\x70\x93\xef\x5d\x64\x12\x0f\x98\x38\x9a\x3f\x1e\x96\xb1\x75\xa6\xd7\x47\x4a\xad\x14\xd5\x3b\x2f\x55\xde\x9a\x72\x1e\x8a\x5e\x9c\x21\x6e\xe3\x27\xa1\x6f\x44\x85\xb4\xc5\x71\x7f\x09\x58\x1e\x3d\xe0\xa4\x7d\x84\xb7\x5c\x7a\x29\x53\xdf\x8d\x22\xf7\xa1\x67\xd7\x26\xaf\x34\xd5\x3f\x1a\x93\xb5\x2d\x80\x01\xaa\x29\x68\xeb\x34\x69\x8b\x66\xe6\xc5\x69\x53\x82\xd4\x75\x59\xa3\xdd\x34\xad\x07\x01\x56\x55\x7d\x4f\xe6\x35\xcf\x5a\x7b\xc6\x79\xed\xdf\xca\x19\x3d\x44\xfc\x80\xa7\xa1\x2d\x55\xdc\xa4\x1e\xb8\xa0\xff\xd8\xf6\xf8\x27\xbd\x89\x33\xa7\xc2\x9c\x06\x28\xfc\xdd\x4b\x4f\x07\xfb\x4b\x15\x9f\xfd\xa0\xcf\xa0\xb1\x72\x80\xb8\x67\xfe\x02\x6d\xa9\x91\xb6\x2c\x1c\x19\x06\x1f\x49\x1f\x67\xa7\xa9\xfe\x4c\x3b\x27\xd6\xbc\xf7\xc8\xe2\xd9\xc4\xf5\xc3\x67\xcf\x2e\x74\x18\xbe\x94\xa7\xf1\x3c\x83\x01\xaa\xaf\xd0\x96\x3a\x69\x4b\x86\xe1\x91\x70\xbd\x68\x7b\x13\x7f\xdf\xf4\x95\x78\xda\x37\x75\x6e\x2c\xcc\x81\xad\x31\xdf\x68\x99\xf3\x0d\x73\xcd\xd5\x24\x0e\x61\x80\xea\x1b\xb4\xa5\x41\xda\x0a\x52\x5d\xe7\xfc\x6a\xa3\xe3\xfc\x60\xf2\xa8\x8a\xa4\xf1\x33\x99\xab\xc6\x31\x0e\x0b\x99\x11\xaf\x69\x25\xf3\xc4\x32\x29\xc6\xad\x31\x40\x35\x03\x6d\x69\x92\xb6\xa8\x57\xe6\xed\x84\x66\x6b\x1a\xe5\x66\x3a\x23\xed\x4f\xef\x0a\xf5\xbd\x34\xb8\x23\xd4\x5b\x55\x3c\xee\x5d\x59\x1c\x98\x9a\xcb\x8a\x01\xaa\x59\x68\xeb\x0c\x69\x4b\x87\xef\xe6\x58\x96\xcf\x68\x36\x5a\xeb\xba\xa6\x2f\x7c\x2b\x43\x37\x26\x89\xf5\xd8\x39\xd1\xa8\x47\x3d\x0b\x81\xd9\xfe\xde\xce\x18\xa0\x9a\x83\xb6\xb4\x48\x5b\xee\xc1\xff\xa2\x4c\xc2\xdc\x0c\x59\x13\xc3\x07\x0c\xef\xa5\x2b\xf3\x27\x70\x5f\xf8\x37\xf2\xf3\xe6\x32\xe5\x98\x5f\xc7\xd6\x80\x0a\x06\xa8\xbe\x43\x5b\xda\xb8\xcf\x5e\x3e\x63\x7f\xe1\xe8\x2d\x59\xbf\xec\x36\x6a\xe9\xa8\x08\x87\xe1\xf0\xee\xde\x88\x60\x72\xbb\xf2\xa3\x85\x7f\xc9\x3a\xcf\x10\x77\x6f\xf3\xd0\xd6\x59\xd2\x56\x0a\x5f\xb1\xaa\x61\x31\x19\x8b\xd8\x19\x0e\x81\xd5\xa3\x7a\x87\x23\x0f\x56\xd7\x8a\x9c\x78\x32\xf1\x35\x42\x91\x42\xfb\x08\xcb\x05\x0c\x50\xfd\x80\xb6\x74\x48\x5b\xb6\x4f\x15\xeb\xd6\x13\x78\xa3\xac\x98\x84\xde\xb5\x87\x7e\x31\x49\x71\x7f\x38\x70\xa7\x63\x5c\xdf\x54\x74\xd9\x22\x6d\xe3\x08\x71\x21\x5e\x80\xb6\xce\x91\xb6\xd2\x02\x19\xea\x5a\x76\xb2\x9d\x59\xcf\x28\x86\x39\x3e\xfb\x1b\xee\xa8\x95\x3c\x13\x69\x1b\x64\x5e\xf0\xc5\xa3\x72\x4f\xb0\x2f\x03\x06\xa8\x16\xa1\x2d\x5d\xd2\xd6\x0d\xaf\xf5\xa5\x29\xc1\x7c\x9e\xfa\x67\xbb\xd9\x86\x7b\x3d\x52\xa6\xc6\xaf\xc5\x69\x2f\xea\xfc\xdb\xe0\xef\x7c\x70\x2c\x9e\x96\x19\x03\x54\x4b\xd0\x96\x1e\x69\xeb\xa9\x65\xe6\xb7\x9c\x70\x6a\xe1\x41\xe1\xf5\x82\xcf\xb4\x47\xd3\x73\xc2\x4e\xc5\xef\xca\x1d\x7e\xb3\x15\x49\xcd\x54\xeb\x14\xb7\x17\x03\x54\xcb\xd0\x96\x3e\x69\x6b\xc3\x20\x55\x75\x89\x3a\xfe\xb1\x99\x3e\x6f\xf1\x1d\xf7\xf3\x39\xda\x4d\x82\x9c\xee\x05\x6e\x1b\x23\x6c\xc8\x7b\x2f\x32\x2e\xe2\x26\x71\x05\xda\x32\x20\x6d\xc5\x15\xed\x57\x1f\x11\x7f\x75\xfa\x51\x0b\xc5\xe0\xd3\x4f\xd1\xc7\xbb\x77\x52\xe7\xfe\x56\xb7\xe9\x38\x8e\xfb\xbb\x6c\x31\x17\x8b\x62\x80\x6a\x15\xda\x3a\x4f\xda\xa2\xa4\xbb\xa8\xc8\xd9\x6b\xfe\x8b\x46\x3e\x6c\x6c\x27\xa9\xeb\x67\xd8\xc7\x9b\x13\x5b\x54\x02\xbc\x63\x73\x86\x4d\xea\xd9\xa3\xc4\x75\x75\x0d\xda\x32\x24\x6d\xf9\x75\x51\x22\xfa\xf9\x47\x0e\xbb\x3e\x5d\xd8\x3a\x21\x59\xf5\x83\x7e\xbc\xda\x26\x2d\x77\xb9\xeb\x6d\x2b\xd3\x92\x49\x1b\x30\xc1\x00\xd5\x3a\xb4\x65\x44\xda\xfa\xa0\x17\x56\x38\xbc\x24\xd8\x70\x2e\x01\x11\x3d\xf5\x9a\xb7\xc5\x3e\x4c\x4e\xde\x59\x28\x27\x48\x7e\xb9\xb5\x67\xd2\x59\x9e\xf8\x79\x6d\x40\x5b\x17\x48\x5b\x7f\x7c\x93\xbe\xea\x0e\x0f\x64\x98\xa6\x9f\x51\x93\x9e\xfc\x7d\xf0\xad\xf3\x49\xef\xe9\x84\xaf\x8e\x01\x1c\x69\xff\xf4\x46\x94\x88\x9b\xd7\x4d\x68\xcb\x98\xb4\x35\x72\x28\x82\xea\x47\xf8\x8a\x94\xa8\x81\x03\x2a\xf2\x27\xc7\x31\xe8\xd9\x8e\xd6\x83\x19\x15\x66\x3d\xce\x7c\x27\x35\x0b\xc4\x0e\x03\x54\x5b\xd0\x96\x09\x69\xeb\xa2\x71\xfd\xb3\xec\xd9\xe0\xdb\xe6\x6f\xd9\xb9\x3f\xdd\xd2\x5d\x2d\x64\x63\x55\xd1\x7e\x10\xf7\x85\xa5\x5b\xa7\x6a\x6a\x25\x91\x05\x03\x54\x3f\xa1\xad\x8b\xa4\xad\x75\x67\xb9\x10\x37\xc5\xf2\xd0\xaa\xf6\x32\x63\xab\xa4\x08\x23\x09\xc5\x41\x11\xc3\xe3\xa5\xa2\x72\x34\x4b\x0d\x73\x11\xf1\xc4\x63\xf5\x17\xb4\x65\x4a\xda\xe2\xbf\x89\x56\x2e\x90\x07\x5a\x96\x39\x0b\xb9\x9f\x63\xc8\x6f\x8e\x0e\xbc\x39\x52\x94\xde\x19\x43\x96\x76\x43\x73\xbe\x73\x95\x09\x03\x54\xdb\xd0\xd6\x25\xdc\x35\xed\x22\xff\xe3\x41\x5e\x4d\xba\xbc\x78\x9a\x8d\x88\xa7\xb9\x5f\x53\xcc\xde\x1e\xed\x37\xb9\x69\x40\xe6\xde\x9e\x33\x7a\xa3\x9b\x78\x7d\xdc\x81\xb6\xcc\x48\x5b\xff\xee\x4d\x68\xec\x6a\x67\xd1\x7c\x76\x5e\x3d\xb6\xa6\xe0\xbf\xdd\xd9\xc6\xc9\x7a\x81\x42\xc0\x30\x43\xe9\x67\xcb\xbd\x39\x6a\x0a\x0c\x50\xfd\x86\xb6\xcc\x49\x5b\x7f\xa7\x6e\x3e\x38\x3d\x23\x75\xd5\x21\x6f\xe2\xee\x9c\xd8\xed\x09\x3d\xaf\x48\x93\x65\x67\xf1\x84\x63\xec\x5b\x7d\xde\xd7\x64\x04\x31\x40\xf5\x07\xda\xba\x4c\xda\x5a\x71\x88\xb1\x13\x13\x12\x51\x1e\xe7\x0a\xc3\xe2\xad\xd8\xe9\xbe\xb8\x64\xc6\x2a\xdf\x8c\x7f\xf6\x30\x78\x05\x34\x8d\xc6\x08\x63\x80\xea\x2f\xb4\x75\x05\xb7\x7e\x71\x8c\x87\x22\xc1\x67\x2c\xcf\x9f\xa7\xa8\x7d\xa5\x4a\x50\x28\x12\x7e\x50\x54\xfc\x42\x0d\xac\x16\x9c\x55\xbc\x70\xf1\x2f\xf1\x75\xfd\x83\xb6\x2c\x48\x5b\x53\x8b\x98\x29\xbb\xd8\x0f\xbb\xd4\x1f\xf5\xf3\x34\x8d\xa6\xcb\x37\x1b\x58\x3b\x0b\x54\xc5\x12\x8d\x7e\xbf\x0e\xba\x83\xfc\x25\xae\x13\xbb\xff\x31\xb0\xfd\xd7\x97\xdf\xff\x33\xb0\x59\xe2\x16\x75\xa7\x3f\x76\xdf\x32\x59\x4f\x89\x73\x4d\x69\x0d\x9a\x99\x7d\x0a\x9a\xff\xfa\xbc\xac\xf4\xaf\xa4\xc1\x23\xaf\x6f\xf2\x71\xf3\x47\x31\x80\x92\x41\xdf\x88\x15\x69\xab\x96\xd5\xbd\xa3\x60\x4b\xf0\x0d\x4b\xf9\x13\xe3\x5f\x21\xba\xfe\x26\xb9\x5c\xd1\x7b\x8d\x93\x2d\xf6\xc9\x0c\xa6\xed\xfb\xb9\xc0\x88\x01\x14\x81\xb6\xac\x49\x5b\xa1\x0f\x3f\x0a\xa4\x12\x9e\xa5\xa5\x5c\x31\x63\xb5\x2f\xda\xe1\x6d\x3f\x70\xfd\x92\x42\x9b\xa7\xa3\x6a\x72\xc9\x3b\xad\x72\x31\x13\x0c\xa0\xe4\xd0\x96\x0d\x6e\x91\xea\xd9\xac\x1e\x56\x79\x65\x95\x2b\xe2\x6b\xc1\xf8\xfe\xe7\xf9\x8f\xe7\x7c\xba\x52\xb9\xa6\x32\x37\xa7\x83\x2f\xd2\x89\x09\x30\x61\x00\xa5\x80\xb6\x6c\x49\x5b\xbc\x17\x2f\xaf\xe9\xb6\x71\x08\xd1\xbc\x7f\xee\x98\x5c\x15\x00\x7e\x53\xbb\xf8\x58\x13\x04\x0b\x66\xf3\xe6\x8c\xe8\xbd\x78\x65\x30\x80\x52\x42\x5b\x76\xa4\xad\xa2\xfb\xd4\x66\x3f\xfa\x1c\xcf\xbc\xbd\xee\xf6\x73\xbc\x2b\xf1\x2f\xf5\x57\xf6\x83\x26\x7d\xed\x13\x66\xc1\x1e\xd9\x4e\x8f\xc8\x4e\x60\x00\xa5\x82\xb6\xec\x49\x5b\xb2\x27\xef\xd2\x1d\x62\x53\x55\xfa\xce\x35\xcb\xf8\x28\x84\xb2\x62\x64\xe5\x75\xd8\xf8\xfb\xe6\x5b\xb6\x7d\x33\xd4\x63\x9f\xda\x4e\x63\x00\x45\xa1\xad\xab\xa4\xad\xce\xad\x4e\xce\x2b\x61\x16\x9e\x87\xff\x8c\x45\x1d\x3a\xdd\x29\x70\x49\x63\xe6\xbd\xe9\x95\x96\x73\x8f\xd4\x00\xdf\xeb\x74\x4f\x11\x0c\xa0\x04\x68\xcb\x81\xb4\x75\x68\xfc\x44\xca\xfa\xe8\x83\x13\x4d\x0b\x46\xff\xe2\x95\xb9\xb0\x1f\x75\x63\xd9\xa3\xec\x3a\x3d\x02\x62\x56\x93\xfd\x9c\xba\xa2\x18\x40\xa9\xa1\x2d\x47\xd2\x56\x84\xe6\xca\x70\xe3\x87\x2b\x84\x71\xa3\x93\x15\x32\x16\x37\xcd\xab\xc9\x6e\xc6\xc5\xff\xf2\xff\xb3\xfe\x71\x45\x86\xa1\xf6\xae\x30\x06\x50\x1a\x68\xcb\x89\xb4\x55\xd1\xf0\xbe\x5b\x87\xb6\xe3\xdb\xb1\x17\x3e\x73\x03\x39\x8e\x86\xee\xc5\xcc\x02\xe4\x4f\x39\xc4\x1a\x1a\x16\x04\xae\x38\xed\x11\xc2\x00\x4a\x0b\x6d\x39\x93\xb6\x3a\xb2\x9e\x24\x7d\xca\xe0\x7e\xa6\x99\x9e\x17\xee\x53\x22\x6d\x72\x56\x44\x55\x5b\x2c\x8c\x4d\xec\x1f\x45\xd5\x92\x5d\x44\x28\x27\x06\x50\x3a\x68\xeb\x1a\x6e\x91\xfa\x1c\xf7\x8e\xbf\xbf\xe8\xda\x7c\xb9\x9a\x60\xdf\x27\xf2\xa8\x41\xab\x96\xe4\xd4\x3b\xea\x5a\xba\x53\xc7\xce\x9b\x88\x84\x09\x62\x00\xa5\x87\xb6\xae\x93\xb6\x12\xd0\xbb\xd6\xa2\x1b\xc8\xd0\xe3\x8b\x76\x4e\x7d\x03\xa5\x52\xfc\xf3\x8e\xd4\xbb\x2b\x91\x67\x2c\xf3\x67\xb8\x74\x6b\xcd\xcc\x31\x80\x32\x40\x5b\x2e\xa4\xad\x89\xa4\xe5\x41\xb5\x8f\x27\x5f\x98\xab\xbd\xd0\xef\x8b\x3e\xe0\x39\x7a\x2a\xc4\x36\x44\xea\x61\xd7\x8b\x2e\x49\xae\xe9\xc7\x1e\xfb\x31\x80\x32\x42\x5b\xae\xa4\xad\xe8\x37\x42\x95\x0d\x8f\x05\xda\x3a\x8e\xff\xd6\x0b\x1d\x2e\x37\x7d\xbc\x97\xea\x4b\xff\x85\xb6\x5d\x7f\xd6\x1e\xf5\xbe\xcb\x72\xba\x18\x40\x99\xa0\x2d\x37\xdc\xef\x31\x8c\xfd\xd9\x2f\x9b\x42\xa5\x55\xf1\xe6\x3f\x62\x71\xf3\xe9\xce\xaf\xb5\x6d\xf8\x5a\xfc\x7f\x24\x14\xd7\x82\x76\x06\xdb\xeb\x18\x40\x99\xa1\x2d\x77\xdc\x1d\xb6\xab\xfa\x16\x35\x43\x29\xef\x13\xe6\x9d\x09\x3d\x7e\x36\xb6\xa7\xa2\x91\x15\xaa\xbd\x9b\x3b\x2d\xca\x8d\x64\xfa\x3b\xd4\x5a\x18\x40\xf7\x40\x5b\x1e\xb8\x3b\x33\x5c\xf5\xb7\xf6\x95\x9a\x15\x7b\x9c\xf8\xa2\xb2\xa3\x37\xcb\x6b\xe2\x44\xf6\x75\xa7\x75\x97\xf1\xc3\x49\x6f\x76\x24\xbd\x50\x1a\x03\x28\x0b\xb4\xe5\x89\xfb\x66\xb5\x9e\xc0\xc8\x69\x1e\xed\x95\x4b\x7e\xa0\x6d\xb1\xb0\xa1\x9b\x7e\xa9\xdd\xd9\x73\xb6\x7c\xd1\xb4\xf2\xc5\x87\x4e\x19\x16\x0a\x0c\xa0\xac\xd0\x96\x17\x69\x4b\x80\xf6\x8d\xb5\xea\x9a\x91\x9c\xf0\xdd\xaa\x98\x99\xe1\xd4\x17\xb4\x05\x9a\xc9\x8c\x72\xb1\xd5\xdd\x2a\x7e\xb4\xf4\x57\x83\x19\x30\x80\xee\x85\xb6\xbc\x49\x5b\x99\x0c\x55\x04\x0b\x45\x83\x06\xd3\x39\xb6\x88\xe2\x36\x4e\xcd\x6d\x0e\x69\xd7\xa9\x86\x85\x8e\xa5\x89\xef\xed\xdd\x43\xf9\xc4\x75\x75\x1f\xb4\xe5\x43\xda\x72\x88\x97\xb2\x7c\x5b\xda\xb7\xca\x8a\x5c\x9c\xe6\x56\x61\x19\x3c\xb3\x25\x76\xef\xcf\xc8\x46\xc0\xc3\xf7\x93\xc9\xac\xb1\xd2\xea\x18\x40\xd9\xa0\xad\x1b\xa4\xad\x02\xc9\xca\x7a\x8d\x31\xbb\x30\x8b\xe4\x84\x6f\x32\x25\x11\xe1\xcd\x52\x91\x37\xee\x6d\x4d\xf4\x07\x90\x37\xf6\x27\x9c\xa6\xf4\xc0\x00\xba\x1f\xda\xf2\x25\x6d\x1d\xb9\x68\x3c\x91\x2c\xff\xd9\x43\xfe\xde\x51\x09\x07\xad\xc3\x01\x6d\x99\xe3\x26\xdd\x0f\x5a\xd0\x3d\x47\x6e\x5a\x37\xbf\xa4\x25\xae\xab\xec\xd0\x96\x1f\x69\xeb\x8c\x0d\xf9\x99\x78\xea\x97\xaf\xbb\x58\x14\xde\x73\x1f\xf0\x8f\x65\x3a\xf2\xe1\xc6\x1f\x0b\x56\xbf\x57\xc9\x7e\x73\xb3\x8d\xfd\xc7\x30\x80\x02\x68\xcb\x9f\xb4\xc5\x53\x74\x9b\xc9\x97\x8a\xdf\x2b\x35\xca\x25\x34\x24\xef\x14\xef\xc2\xb8\x54\xc2\x81\xf9\x58\xae\x86\xf3\x57\xdc\xe8\x6a\x14\xa5\x30\x80\x1e\x80\xb6\x02\x48\x5b\xce\x2f\x8f\xf1\x4d\xdd\x3a\x4e\x6e\xe0\x18\x37\xf2\x81\xa9\x8e\xc2\xe8\x7e\x9c\x6f\xd9\xb3\x02\xd6\x22\xe6\xe8\x71\xc6\x8f\x19\xd6\x18\x40\x0f\x42\x5b\x81\xb8\x3b\x7f\xa1\x3f\xf7\xcd\x7e\xf5\x2d\x58\x8c\x6c\xdf\xeb\x95\x90\x9c\xfc\x47\xda\xe7\x68\x7b\x75\xbb\xe3\x7a\x8c\x16\xc1\x65\x52\x90\x15\x03\x28\x07\xb4\x75\x93\xb4\x15\xd2\xbe\x3f\xdf\x93\xd7\xa3\xc8\xa2\xa2\x2a\x25\xa1\xb7\xa6\xfa\xd0\xf8\x70\x64\xe7\x59\xee\xb9\x7c\x26\x95\x6e\x01\xf2\xcb\x9e\x18\x40\x0f\x41\x5b\x41\xb8\xbb\x62\x77\x06\x09\xd6\xb2\x97\x96\xf7\x3c\x19\x96\x59\xfc\x75\x47\xc3\x89\x26\x57\xfe\x3e\xc3\x07\x49\x99\xc8\xd9\xbb\xef\xe2\x73\xe9\x30\x80\x72\x42\x5b\xc1\xa4\xad\x8f\x59\x68\x36\xcf\x0b\x35\x29\x89\xfd\xb5\xf5\x99\xee\x1a\x32\x4d\x39\xca\x73\xd1\x64\x81\x8a\x87\x32\xa3\x42\xb7\x1f\xf8\xda\x61\x00\xe5\xfa\x8f\x81\xed\xbf\x1e\x41\xfc\x9f\x81\x2d\x04\xb7\x1b\xf9\xf2\x32\xc2\xec\x1c\x9f\xcd\xd6\xde\x85\x0b\x04\x7b\xc6\x37\x0f\x7f\x8f\x58\xfc\x94\x8f\x20\x73\x9b\x6d\xb1\x38\xb1\xd2\x72\x04\x03\x28\x37\xf4\x8d\x60\xb8\xc7\x5b\x9a\x5b\x51\x24\xb6\xa7\xb6\x40\xf0\x5e\x3d\xeb\x93\x95\x70\x4a\x3b\xdb\xda\xdf\x07\xae\xf8\x48\x7a\x4b\x9d\xbc\x58\x2b\x41\x1c\xfe\x78\xa0\xad\x5b\xa4\x2d\x6f\xc1\x8c\x30\x86\xc9\x1e\xf2\xe2\x5b\x7c\x81\x37\x82\x02\x2b\x11\xb2\xc3\x67\xff\x18\x28\x61\xaa\x45\xe1\x2a\x69\xa3\xd4\x0e\x18\x40\x79\xa1\xad\x50\xd2\xd6\x15\x54\xf6\xc5\xca\x3e\x5f\x11\x1d\x41\xe5\xcf\x5e\xcb\x6c\x73\x5d\xe5\xfb\x74\x6c\xe6\x02\x3c\x85\x5d\xde\xcd\x68\x37\x46\x10\x17\x4f\x3e\x68\x2b\x0c\x37\x80\xac\xb0\x5d\x9a\x4c\xcb\xe5\xd7\x5e\xfd\xa6\xe8\x9d\x13\xe4\xd0\x7c\x3c\xb2\xf5\xbe\xe3\xd5\xc7\x0e\xad\x5c\xbb\xfd\xae\x29\xfb\x30\x80\xf2\x43\x5b\xe1\xa4\xad\xd9\xdf\x39\x1a\x27\x27\x0d\x2a\x51\x9e\x94\x60\x0a\xd9\x86\x74\xaa\x38\x8b\x3d\x92\x39\x6a\x41\x4f\xee\x77\x3a\x9b\x97\xf5\x12\x87\x19\x01\x68\x2b\x02\xf7\xf5\x97\x48\xd1\x05\x1d\x9e\xf8\x97\x34\xc1\x7d\xa6\x55\xa2\x3c\x77\xd5\x6a\x73\x2d\xda\xba\x24\x3d\xc3\x9f\x09\xa4\x36\xd3\xa3\x17\x31\x80\x0a\x42\x5b\x91\xa4\x2d\xb7\xee\x85\xdf\x4e\x9a\x6c\x2d\xe1\xa7\xd2\x3f\xc8\xe5\xcc\x7e\xf5\x32\xf6\x59\x29\x75\xda\x1b\xd2\x97\xa6\xfe\xa5\x71\x7d\xe5\x30\x06\x50\x21\x68\x2b\x8a\xb4\xf5\x68\xe9\x9c\x1a\x17\xa5\x4f\xfe\xeb\x39\x3e\xba\x3b\xd9\xb5\xd4\x85\x03\xd5\x7a\x27\x37\x1f\x49\xca\xdb\xf0\x0d\xb0\xa1\xb9\xe2\x18\x40\x85\xa1\xad\x68\xdc\xe0\xed\xf1\xed\x60\xef\x29\x57\x6f\x11\xb7\x9e\x36\x99\x66\xad\xd8\x71\x2f\x1e\x79\x06\x8f\x4b\x5f\x3b\x69\x97\x9a\x33\x17\x6c\x8d\x30\x80\x8a\x40\x5b\x31\xa4\xad\x7d\x49\x71\x8b\x19\xe5\x27\xc6\x5c\xf9\x03\x1d\xa9\xb3\x47\x84\x59\x32\xeb\x26\xad\x27\x83\x8b\x95\xfc\xf8\x4e\x7f\xe6\x8b\xbd\x80\x01\x54\x14\xda\xba\x4d\xda\xba\xf4\x49\xe4\x5f\x45\x29\xca\xf6\x6f\x59\x74\xb4\x75\x9a\x47\x63\xcf\xb3\xe6\x82\xb7\x15\x4c\x35\xf3\x51\x72\xac\x66\xa5\xe6\x0a\x18\x40\x0f\x43\x5b\xb1\xb8\x67\x95\xbe\xfd\xf8\xfb\xed\xb2\x33\xb5\x1d\x15\x5f\xbc\xa6\x3b\xd7\x4f\xd9\x05\xef\x15\xf5\x5b\xd1\x03\xd6\x3d\xad\xe9\x87\xbe\x1c\x57\xc2\x00\x2a\x06\x6d\xdd\x21\x6d\xe5\xae\x32\x98\xeb\x84\xdb\xdd\x1b\x48\x65\x5e\x3a\x12\xe6\x7e\xb1\x97\xce\xb3\x54\x79\xa4\x39\x88\x75\xd2\xd0\xcd\xd5\xbf\x5e\x1e\x03\xa8\x38\xb4\x75\x97\xb4\x25\xb5\x78\xf2\xa7\xf1\x8c\x98\x19\x9d\x8c\xd9\x85\x4e\xce\xb3\xf2\x2c\xae\x8f\xf3\xae\xbb\x9f\x1d\x64\xdd\x5f\x73\xe9\x57\x89\xb2\x2c\x06\x50\x09\x68\xeb\x1e\xee\x8e\x51\xfb\x68\x81\xe1\x77\x7a\xd9\xe7\x3d\xf9\x49\x15\xaf\xd5\xd7\x8b\xed\xba\x96\xac\xff\xc6\x39\xdd\x7b\xb1\x93\x25\x50\xf0\x85\xb8\xb1\x93\x84\xb6\xe2\x48\x5b\xab\x3e\x17\xee\x7c\x7b\xc1\xf0\xe7\x43\x2e\xaa\x24\x7a\x37\xe9\x49\x34\xfb\x69\x85\xe7\xfd\x4a\x5f\x27\xcf\xd1\x3e\x91\x64\x5f\x27\x1e\xf7\x47\xa0\xad\x78\xd2\x16\xc5\x27\x6d\xce\x0a\xce\x01\xcb\x9e\xd4\xef\xdc\x47\xa3\xfe\x64\xbb\x4f\x7f\x7b\xdd\xc0\xa5\xee\x22\xb7\x7c\x6b\x64\x6f\x34\x13\x71\xa3\x22\x05\x6d\x25\x90\xb6\x54\xc2\x28\xa4\xfc\x8e\x9f\xd1\x15\xfd\x43\xf1\xf2\xe7\x59\x27\x7b\x4d\xa6\x87\x6c\x27\x2a\xea\xae\x27\xe6\x33\x87\x74\x32\x48\x9a\x61\x00\x95\x86\xb6\x12\x49\x5b\x07\xee\xdd\xaf\x74\x9a\xcc\x60\xcc\x54\x62\x30\xa1\x13\x39\xb0\x16\x51\x77\x95\x23\xa6\xd2\xc7\xc4\x90\xe2\xf4\x75\x35\xe5\x09\xe2\x9a\x73\x14\xda\x4a\xc2\x5d\x50\x69\xeb\x27\xae\xfa\xaf\x82\x77\x0d\xc8\x5f\xac\x59\xe0\xb2\x85\xb8\xa0\xe4\xaa\x46\x65\xf2\xa1\xf1\xc2\xc6\x23\x60\xd8\x0d\x03\xe8\x31\x68\x2b\x99\xb4\x75\x5e\xeb\x0c\xaf\x42\x5b\x65\xde\x91\xc5\x0c\xa6\xb8\x03\xba\x91\xc7\x13\x42\xba\x75\xd5\x7e\x0a\xe9\x88\xb7\x92\x99\x1e\x0c\x3f\x8b\x01\xf4\x38\xb4\x95\x42\xda\x5a\x9a\xb6\xeb\xaa\xf0\xbb\x9d\x97\x51\x5a\x47\x16\x73\xf1\xea\x90\xdb\x72\xaf\xfa\x21\x7b\xcb\x89\x3d\xd5\x9c\xb5\x9c\x4e\x35\x1c\x18\x40\x65\xa0\xad\xfb\xb8\x4d\x0f\x22\x47\xa1\xe6\x95\x9e\xf9\xe6\x9d\xac\x15\x2a\xea\x72\x63\xf4\xee\x0d\x76\xbb\x20\xc1\x9f\x23\x5f\x5c\x4d\xc9\x5f\xda\x10\x37\xc2\xb2\xd0\xd6\x03\xdc\xd0\xd0\x57\x7d\x40\x58\xd0\xc3\x99\x6b\xb7\xc7\x64\xfa\x57\xe9\xf6\xe7\x50\xed\xf9\x1d\x9d\xa3\xaf\xaf\xcf\x67\x0e\x96\xdd\x93\xb3\xc1\x00\x7a\x02\xda\x4a\xc5\xdd\x75\x75\xa2\xdf\xa2\x55\x88\xf9\x52\x77\x24\xce\xca\x4e\x3c\x68\x73\xb6\x24\x49\x98\x4c\xe1\x46\x9e\xc6\xc3\xed\x4b\x62\xa7\x99\x55\x30\x80\x9e\x84\xb6\xd2\x48\x5b\x2e\xa2\xe6\xe5\x97\x73\x16\xac\xe9\xec\x59\xe4\xc6\xed\xa3\xde\x3c\xbe\x18\x5c\x5c\xc5\x97\x6b\xa3\xd4\x35\x6e\x3b\xad\xde\x6a\x89\x01\x54\x0e\xda\x4a\xc7\x6d\xec\x38\x3c\x9b\x35\xb3\xd7\xf7\x26\x91\x45\x76\xc5\xc8\x2f\x9d\x32\xfc\x6e\xfc\x81\xeb\x91\x18\xcf\x9e\x9d\xcf\xca\x8e\x7e\x8b\xfa\x18\x40\xe5\xa1\xad\x87\xa4\x2d\x57\x29\xdd\x87\x25\x6b\x57\x85\x2d\x7c\x6e\xda\x13\x2e\x0e\xfb\xd1\xa9\xf5\x48\xd0\x2f\xfe\x8d\xa1\x19\xda\x66\xcc\x4f\xfe\x60\x80\x01\xf4\x14\xb4\x95\x81\x3b\x1f\x25\x8d\xd3\xad\x62\xed\x96\x3e\x58\x7d\x09\x6e\xd1\xf8\xe1\x6f\x5f\xf7\x7b\x95\x10\x37\x36\x13\x59\x6d\xa2\x76\xfb\xfc\x08\x19\x06\x50\x05\x68\x2b\x13\x37\xe7\x6c\x18\x13\x2e\x4f\x59\xfc\x19\xd3\x24\x2f\x34\xcf\xd5\xd0\x09\xa5\x49\xaf\xd7\x72\x37\xfd\xe9\xfd\x50\x57\x85\x1c\xb4\x4b\x62\x00\x55\x84\xb6\xb2\x70\x77\x24\x9f\x44\x84\xba\x34\x37\x35\xa5\xe7\x1b\x5e\x13\xa2\xef\xa9\x7a\x0a\x92\xcc\xa3\xef\x37\x05\x75\xd0\x86\x12\x44\xdc\xc9\x89\x9f\xbd\xd2\x7f\x0c\x6c\xff\xf5\x87\x20\xff\x33\xb0\x65\x93\xfe\x70\xed\x07\x93\xe7\x57\x94\xe7\xef\xd3\x1a\xff\x7d\x90\x48\x7f\x22\xeb\xd8\xa8\x96\x66\xf6\x04\x5f\xae\xde\x98\xcb\x9a\x07\x57\xb5\x3b\x06\x50\x65\xe8\x1b\x79\x44\xda\x6a\x93\xf0\xd5\x11\xf1\x95\x7b\xaf\xb9\x20\x26\x54\x17\x1a\x57\xca\xcb\x1b\x23\x36\x27\x35\x4c\xe1\x54\x99\x7b\xf9\x7b\x6f\x00\xf1\x22\xa8\x02\x6d\x3d\x26\x6d\x09\xe7\x49\x85\x8d\xe9\x9d\xca\x3b\xf3\xfe\x6d\x5e\xb7\x43\x83\x3f\xe7\xa3\x5e\x21\x11\x25\xa5\xfe\x01\x09\xcf\xa4\x9c\xa3\x43\xc4\x81\xed\x34\xb4\x95\x83\x1b\xfe\x3c\x10\xaa\xe1\x0f\x15\x6f\xa5\xfb\x94\x4f\x1a\xd2\xe4\xb2\x5b\x8a\xf2\xf1\x35\xed\xa3\x59\xcf\x7c\x43\x26\xda\xc7\x73\x6a\x2f\x06\x50\x55\x68\x2b\x17\x77\x41\x7d\x6f\xb4\x59\xcd\x96\x52\xc5\xb8\x3f\xda\xf9\xe2\x7d\x36\x49\x55\x67\x46\x27\xcb\xcf\x1c\xbe\xdc\x57\x09\xd9\x29\x1d\x11\xc4\x01\x57\x0d\xda\xca\x23\x6d\xdd\x3d\x70\x5b\xdb\xa2\x6f\x4d\x64\xc3\xd4\x76\xd6\x63\x26\x72\xe2\x1b\xca\x92\x21\x73\x8b\xf6\xf2\x4b\x7f\x9f\xb5\xdf\x17\xdb\x1c\x31\x80\xaa\x43\x5b\xf9\xa4\x2d\x8f\xdb\x79\x4f\x22\xd2\xee\x49\x1f\x78\xfb\xc4\x2f\x55\xa9\x43\xc1\xa8\x5d\xa1\x25\xaa\xf5\x05\xe3\x6a\xee\x65\x0a\x3d\xc3\x72\xe2\x89\xa2\x01\x6d\x3d\xc1\x3d\x7f\x93\xc0\xb4\x58\xd3\xeb\xec\x9d\x0b\xfa\x0a\xeb\x95\x2a\xb4\x7e\xef\xad\x8a\xfd\xce\xce\xf4\xfc\x62\xb4\x79\xd0\x5c\xe8\x19\xe2\x80\xab\x09\x6d\x3d\x25\x6d\x95\x46\xd4\xdb\xb3\x65\xac\x45\xab\x9f\x74\x19\x49\x3a\xb7\xf8\x8d\x83\x4b\xa5\xa4\xd4\xab\x24\x4e\x21\x71\xa5\xe6\x9a\xc8\x57\xe2\x30\x73\x06\xda\x2a\xc0\x5d\x04\x15\xee\x4f\x4f\x57\xc7\x67\x8d\x14\xd6\xa8\x74\xfd\xc9\x31\xf1\xf9\xc8\xd1\xde\xee\xca\x20\xf7\x98\x49\x76\x66\xd7\x97\x9f\xb8\xe3\xd2\x82\xb6\x0a\x71\x27\x5d\x1d\x57\x0c\x99\xa2\x57\xec\xa3\x7b\x6e\x93\x57\x28\x75\x65\x24\x9f\x83\xc9\x47\x2a\xf4\xaf\x7f\x7c\x93\x64\xac\x33\xf8\x40\x8d\x01\x54\x1b\xda\x2a\x22\x6d\x99\xdd\xbf\x73\x47\x91\x99\xcf\x2e\xeb\x9e\x40\xeb\xd7\xc3\x5d\x9b\x65\x3b\x43\x49\x49\x84\x9d\x3f\x6c\x1c\xda\xc5\x9e\xc7\x22\xe4\x30\x80\x9e\x85\xb6\x8a\x49\x5b\x8c\xeb\x7b\x15\x84\x1a\x58\xbd\x7e\xaf\x1e\x54\xd9\xaf\x7a\x72\x83\xf3\x71\xc3\xb1\x9c\x43\xe1\x8a\x7e\xca\x83\xed\xe4\xaf\xf4\x88\xbb\x5d\x1d\x68\xeb\x19\x69\x2b\x78\x19\x14\x3e\xa3\x39\xcb\x6b\x7d\x44\x8c\x51\x5b\x52\xee\x89\x53\x7c\xb2\x66\xe9\xb9\xa5\x96\x2c\x3a\x19\x0e\x9e\x6f\xc1\xc4\x85\xf8\x1c\xb4\x55\x82\xbb\xbb\x19\xe3\x7b\xa1\xce\x8e\x66\xc5\xb8\xbf\xbf\x23\x38\x79\xb1\xe2\x0d\xe1\x1f\x63\xe5\x0f\xce\x97\x1a\xe1\x85\x9d\xac\x6f\x5f\x5e\xc3\x00\xaa\x0b\x6d\x95\x92\xb6\xe8\x7d\xaf\x8c\xea\x70\x9e\x61\x2f\x64\x48\x95\xa2\x94\x16\xdc\x50\xdc\x17\x4a\xb9\xb1\xbd\xdf\xee\xb4\xad\x05\xb9\x90\xc7\x35\xe2\x90\xa5\x07\x6d\x95\xe1\xbe\x1a\xfa\x22\x17\x26\xfa\xa7\xc0\x68\xc7\x4b\xaf\xfc\x4d\xa3\xe8\xcd\x70\x0b\x5d\xe9\x46\x2e\xab\xa8\x6e\x86\xcc\x24\xd5\x7f\x6f\xb5\x30\x80\xea\x43\x5b\xe5\xb8\x6f\x08\x8e\xd6\xb0\x5f\x54\xfa\xe2\x96\xf4\xac\x67\xab\xd4\x58\x8d\xfc\x70\xa4\x04\xdd\xe1\xb7\x49\x1f\xc9\xde\x04\xcd\x5e\x6a\x21\x10\x37\x17\x06\xd0\x56\x05\xee\xf9\xae\xb7\x02\x1f\x08\x42\xfd\xfd\x01\x02\x52\x5a\xf6\xfd\xbf\xd4\xdf\x3d\x64\x88\xe6\xf8\xb2\x48\xdf\xa5\x80\x5c\x89\xae\x1c\x20\x6e\x2e\xce\x43\x5b\x95\xa4\x2d\x89\x77\x84\x85\x22\x99\xc2\xa6\x8c\x80\x8c\xe2\x8c\xd8\xd6\xfc\x89\xd7\xef\x3e\xf9\x5c\x0f\x1f\x93\x0a\x31\x8f\xec\xef\xe9\x26\xae\x5f\x86\xd0\xd6\x73\xd2\xd6\x75\xb5\xb3\xb1\xbe\xd5\x7f\x14\x55\xc2\x62\xfd\xfa\x9e\xee\xff\xa4\x5a\x7d\x62\xb1\xb7\x69\x5b\xa4\x39\xf5\xb8\x5c\xcb\xb5\x7a\x65\x0c\xa0\x46\xd0\x56\x15\xee\x11\x05\xca\x9b\x6f\x7c\x25\x65\x9e\x5f\xa7\x71\xfd\xb4\xfa\x47\x83\xd3\x55\x42\x73\x6a\xb3\xc0\xc7\x4d\x24\xf5\x1b\xcf\xb2\x98\x9a\x00\x06\xd0\x0b\xd0\x56\x35\x69\xcb\x9a\xad\xfd\xc7\xef\xe0\xa8\xa0\xec\x90\x58\xfa\x0c\xbe\x30\xd9\xce\xf4\x77\xbc\xb2\xab\x3c\x9b\x6b\xef\xc6\x69\x76\xe4\xaa\x4c\x30\x80\x1a\x43\x5b\x35\xa4\x2d\xd3\x1b\x8d\x37\xe7\x15\x7f\x6f\x30\x8d\x9e\x7d\x19\x7b\x2f\x76\x60\xe5\x90\x5a\xba\x61\xc5\xdc\x8c\x0b\x4f\xf8\xd2\x7a\xcf\x02\xf1\xb8\x37\x81\xb6\x6a\x49\x5b\x49\x74\xc6\x02\x56\x6b\x8e\xfa\x32\x43\xec\x52\xe1\xdd\x03\xfd\xff\xe8\xf6\xfa\x8f\x0b\xcc\x86\xef\xcd\x74\x4d\xd1\x8e\xbb\x41\xfc\xec\x2f\x42\x5b\x75\xa4\x2d\x5a\xfe\x92\x12\xe5\xf1\xe3\x99\x15\x2d\x35\x4e\xd4\xd9\xa5\x8b\xfb\x66\x03\x1f\x37\x39\x4c\x5f\x9b\x91\xa1\x8c\xe1\x19\x2d\x3e\x88\x01\xd4\x14\xda\x7a\x41\xda\xda\x39\xe7\xe6\xf3\xd4\x31\xe6\xde\x1f\x8f\xe2\xa9\x03\x66\x72\x25\x8a\x36\x06\x61\x6d\xfb\x0a\x47\x3e\x8c\xf6\x52\xcf\xa4\x86\x12\x37\x3d\x97\xa0\xad\x7a\xd2\xd6\x5c\xf0\x57\xb2\x9c\xa7\x25\x7e\xee\x8c\xf4\x49\x8f\x14\x74\xff\xd0\x8c\x15\xf1\x11\xd8\xd2\x67\x7d\xcb\x1c\xd8\xc5\xaa\xb4\x8d\x31\x80\x9a\x41\x5b\x0d\xa4\xad\x77\x5e\xdb\xa1\xcf\xde\xc7\x1a\x8a\xac\xc6\x3c\x67\x66\xfc\x58\x25\xca\x54\xca\x5b\x76\xcc\x37\xd1\x91\x3a\xbe\x74\xd0\xcb\x9d\x78\xdc\x9b\x43\x5b\x8d\xa4\x2d\xe5\x5a\x0a\xc5\x14\x8f\xb9\xbf\x0f\xba\xa8\xfa\xae\x93\xd7\x1e\x7d\x2c\x1f\x27\xb1\x7a\xcd\x90\xc9\x89\xdd\xad\xff\x83\xd6\x6f\xe2\xe0\x7d\x19\xda\x6a\xc2\x0d\x7f\xef\x19\xf8\x1f\x9b\xaf\x23\xbc\x89\xf5\xbb\xac\xac\x43\xfc\xdf\x26\x3f\xcd\x8a\x69\xf6\xbb\x8d\x51\x88\xa6\xa5\x67\x54\x7b\x60\x00\xbd\x02\x6d\x35\x93\xb6\xf4\xd6\x27\xa3\x26\x1b\xaa\x57\x6f\x7d\x12\x6f\x3b\xae\x75\xc3\xeb\x82\x46\x63\x7e\xf2\xca\x73\xb2\x73\xfb\x25\x3b\xaf\x37\xf0\x13\x37\x17\x16\xff\x31\xb0\xfd\xd7\x9f\xe3\xfe\xcf\xc0\xd6\x42\xfa\xc3\xef\xa3\x76\x5a\x5c\x02\xe0\xd1\x85\x1b\xab\x67\x4b\xbf\x55\x53\x5e\x4a\x7d\x38\x15\xd3\x7b\x65\x4c\x32\xdb\xe2\xde\xcc\xc5\xef\xc4\x5d\x92\x25\xf4\x8d\xb4\x92\xb6\x6e\xe6\x9d\x2a\x4b\x59\xab\x46\x98\x6b\x28\x2e\x56\x1c\x26\xff\xa4\x28\xf3\x37\x85\xfa\x63\xfd\x96\xfc\x38\x99\xe4\x97\xde\xb8\x3d\x18\x40\xad\xa0\xad\x36\xdc\xb3\x4f\x45\x1f\x67\x82\x67\x54\x9f\xdc\xdd\xe6\x57\x18\x7e\x7e\x78\xf6\x9a\x78\x02\xa0\x3d\xf0\x26\x6a\xa7\x81\x40\xb6\xff\x74\x22\xf1\x80\xb4\x86\xb6\xda\x71\xaf\xcb\xf2\xed\xad\x4c\x8e\xf8\xe4\x9c\xc6\x0a\x7a\x91\x68\x9a\xdc\x99\x8b\xb4\xd9\x92\x94\x66\x4b\xfb\xce\xce\x46\xe5\x64\xb9\x12\x77\x36\x36\xd0\x56\x07\x69\x4b\xf7\x7c\xef\xe1\xe7\x17\x35\x16\x6c\xaf\x5b\x45\x9d\x63\xa6\x6c\xb3\xa2\x7f\x32\xde\xe1\x3b\xae\xf6\x6c\x03\x7b\x76\x4a\xd6\x86\x78\xa1\xb7\x85\xb6\x5e\xe2\xee\x64\xad\x5e\x7e\xac\x95\x14\x5e\x23\x93\xab\xf4\x99\xfa\xdc\xc2\x36\x5a\x36\x61\xc5\x3a\xe3\x7d\xbe\xce\x54\x3d\x45\xb8\xef\x07\x71\x07\x61\x07\x6d\x75\x92\xb6\x16\x04\x3d\x44\x4f\x45\x1b\xd9\xbe\x91\x2e\x0e\x25\x5f\xc9\x3d\xfe\x3d\xd2\x8f\xbc\xe9\xd4\xa7\x2b\x95\x06\x15\xed\x73\x34\xd9\x34\x18\x40\xed\xa1\xad\x57\xa4\xad\x73\x59\x34\xa7\x36\xd6\x5b\xc6\xe3\x22\x08\x1f\x2e\x4d\xcc\xed\x67\x7e\xc6\x25\x9c\x1d\x6d\x3f\x63\x32\xf5\x55\x49\x1e\xf5\x26\x1e\xdc\x57\xa1\xad\xd7\xa4\xad\xc6\xd2\xb4\xb7\x97\xde\x3c\x98\xba\xe6\x56\x40\x16\x5f\xe6\xa4\xdd\xda\x72\xa4\xf0\x91\x58\x09\x2b\xe7\xf5\x13\x4f\xff\xdd\x38\xe7\x8a\x01\xd4\x01\xda\x7a\x43\xda\x7a\x7c\x29\xe0\x34\x4b\xee\xc8\xc6\x15\xdb\x3d\xfa\x76\xe3\xe9\x8f\xdb\xf2\x35\xee\x3c\x39\xd5\x11\xd2\x14\x7d\xf4\xa3\x52\xa1\xbb\x2d\x06\x50\x47\x68\xab\x8b\xb4\xa5\x50\xd5\x5e\x97\xd3\x13\x22\x47\x7d\xfe\x55\x82\x56\x20\xa7\x9e\xc3\x07\x6c\xf0\xd8\x22\x70\x0b\x7e\xdb\xd5\x92\x10\x1d\x43\xfc\xbc\x9c\xa0\xad\x6e\xd2\x56\x46\xf1\x9c\x96\x86\x6e\x29\xcb\xd9\x0b\xde\xd7\x8e\x87\x91\x8b\xff\xaa\x0f\x95\x19\x2a\xbc\x60\x72\xcf\x6d\xfd\xf5\xca\xe3\x57\xac\x18\x40\x9d\xa1\xad\xb7\xb8\xf3\x51\x3d\xd6\xc6\x6b\x6b\x3e\xa2\xed\x44\xe8\x41\x0f\xb1\x8c\x36\x59\x23\x63\x65\xfe\x0b\xe7\x0f\x3f\x75\x65\x36\xe0\x39\x74\x90\xb8\xa8\x5f\x83\xb6\xde\x91\xb6\x02\xb3\xa9\x26\x0a\xc1\xcb\x3c\x71\xec\x30\x4d\x6e\x8d\x74\xe5\x9f\x70\xb1\xdc\x92\x57\xab\x5e\xb3\x8a\xd3\xb7\xd7\x2f\x19\x13\x37\x63\xd7\xa1\xad\x1e\x5c\xeb\xba\xc9\x50\x99\xd2\x7b\xd3\x04\xd3\x16\x3d\xdf\x46\x45\xe6\xef\xbf\x9a\xf6\xfc\xbc\xfa\xb7\xef\xf3\x87\x74\x45\xc3\xbc\x03\xc4\x21\xcb\x05\xda\xea\xc5\x0d\x46\x0d\x2a\xb7\xac\xd7\x95\x3e\x4c\x57\x85\xfa\x38\x70\xa6\x91\x25\xfa\x8d\xc6\x9f\x3b\x77\xaf\xc5\x14\xf1\xbc\xd3\xa1\x57\x6e\x81\x01\xd4\x15\xda\xea\xc3\x0d\x6c\x79\x71\x04\x0e\xcf\x9c\xaf\xdb\x12\xb7\x26\x0b\x8a\xf3\xf7\xf8\x1e\xba\xd5\x73\x0b\xb9\x22\x75\xff\xf0\x86\x56\xe1\x6b\x61\x53\x0c\xa0\x6e\xd0\x56\x3f\x69\x8b\xbc\xc5\x7e\x50\xd7\xc8\x85\xdb\x24\x25\xf2\xdd\x75\xa7\xac\x83\x96\xbf\x58\xe8\xad\x8e\xee\xb9\x3d\x65\x51\x77\x38\xe0\x91\xc6\x29\x0c\xa0\xee\xd0\xd6\x7b\xdc\xe6\x62\xca\x99\xca\x6e\xe0\x45\xe5\x36\x18\xf1\xd1\x95\x90\xe5\xd1\xaf\x8e\x56\xd2\x14\x3c\x97\x64\x64\x52\xd8\x79\xaf\xc0\x84\xb8\x19\xf3\x80\xb6\x06\x48\x5b\x1b\x12\x0d\xc5\xa9\x75\x86\x94\x3c\x59\x4c\x96\xf7\x87\xa9\x04\x13\x1d\x5c\xaf\xab\x14\x23\x7c\x16\x39\x9f\x03\x4c\xad\xfb\x0e\x61\x00\xf5\x84\xb6\x06\x71\xcf\xf2\x54\x46\xf1\x7f\x57\xf3\xb3\x3e\xef\x1e\xe9\xc4\xaf\xa5\xec\x3c\xcb\x6a\xd7\x6f\x67\x27\x55\xe2\x9f\x34\x18\x49\xb8\x97\xb1\x1f\x03\xa8\x17\xb4\xf5\x81\xb4\xf5\xa6\xda\xac\xae\x94\x4a\x6d\xf6\xa9\xb5\xfc\xbf\x06\x32\x1e\x49\x8a\x1b\x4e\x8e\x37\xef\x5c\x4f\x2d\xfa\x30\x10\x43\x57\xfe\x9a\x12\x03\xa8\x37\xb4\x35\x44\xda\x12\x53\x98\xa3\xb5\x90\xd9\x34\xbe\xdb\x2b\x4f\xf1\xe7\xaf\x96\xf3\x9f\x17\x14\x84\xa8\x34\xbd\x77\xf5\x6d\x9b\x47\x78\xd3\x0c\x75\x31\x80\xfa\x40\x5b\xc3\xb8\x0d\xba\x61\xcf\x05\xf5\xfd\x1b\x37\x3a\xd4\xf8\x1f\xa4\xd2\x91\x0b\x78\x34\x9b\xdd\x73\x4f\x8c\x3d\x63\xf2\xee\x53\xab\x52\xea\x9a\x06\x06\xd0\x1b\xd0\xd6\x08\xee\x4e\x3c\xbb\x4c\xaa\xd5\xe6\xbd\xd0\xa0\xb6\xc7\x9e\x67\xbf\xbe\x6f\x7e\xcb\xac\x12\x59\x71\xda\x6f\xb2\xf5\x18\xdd\x6e\x48\x73\x20\xf1\xda\xe1\x0b\x6d\x8d\xe2\xbe\x72\x3f\x14\xfb\xe6\x65\xca\x2f\xff\xca\xb1\xa1\xe6\xaf\xd3\x4b\x7e\xdb\x5e\x55\x54\xa1\x77\x65\x7c\x13\xe8\x7e\xbe\x7f\xb4\x53\x44\xdc\xbc\xfa\x41\x5b\x1f\x49\x5b\x93\x36\xfe\x63\x21\x6d\x8a\x27\x4e\xc4\xc6\x76\xdd\xe2\xa5\x3a\x3c\xe8\xb9\xc9\xf0\xea\xb5\x6e\x76\x24\xe7\x56\xe4\x91\xa8\x4f\xc4\xa1\xd4\x1f\xda\xfa\x44\xda\x52\xaa\xd8\xec\x8d\xc9\x7b\xd2\xca\xd6\xeb\x91\x7c\xdf\x54\x71\x79\xbf\x6d\xe3\xdd\x22\x8e\xd8\x49\xee\x27\x63\xbf\x37\xde\xbb\x10\x8f\xd5\x00\x68\x6b\x8c\xb4\xd5\x37\xbd\x99\x3f\xbf\xe6\x77\x94\xef\x44\xfb\x63\xb7\x91\xb6\x36\x6d\xa1\x65\xa1\x94\x06\xf6\xcf\x26\x03\x5e\x79\xa7\x1e\xba\x13\xcf\xc7\x40\x68\x6b\x9c\xb4\x75\xed\x44\x02\x9d\xd8\x76\x90\xab\x6d\x4a\xd4\x3d\xad\x4f\xe7\x78\xbe\x3a\x06\xf9\xb2\x8a\xab\x70\xa9\x74\xb8\xe9\x89\xa7\x36\x9d\xc1\x00\x7a\x13\xda\xfa\x4c\xda\x92\xa7\x5e\x4d\x91\x16\x8d\x09\xcc\x17\x2c\xb2\x79\xd9\xc3\x2e\x1d\xc8\xc4\x6a\x26\x75\x50\x8c\x55\x84\x46\xb7\xf8\xf2\x8a\x30\x33\x06\xd0\x20\x68\x6b\x02\xd7\x9a\x11\xbf\xa1\xc0\x7f\xa1\x98\xc2\xf2\x41\xc6\x81\xb4\x81\x98\x84\x7f\xce\xb7\x36\xee\xe7\x1d\x3c\x7a\x82\x4c\x4c\x3d\xce\xcb\x00\x03\x68\xf0\x7f\x0c\x6c\xff\x85\xa2\xfc\xcf\xc0\x36\x49\xfa\xc3\xff\x9a\x3e\xd1\x4a\x62\x66\x73\xbe\xa1\x3c\x7f\x3f\x27\xe9\x88\x64\x77\x12\x4f\xc3\xed\xc1\xce\x3d\x1f\xbe\x8b\x35\xf1\x29\xdd\x25\x4e\xc4\x21\xd0\x37\x32\x45\xda\x8a\x3c\x53\x36\xf0\xa4\xdf\x30\xe1\x14\x8b\xff\x94\x0e\xaa\xf5\xaa\x4c\xe4\xd4\x44\x1e\x9d\x9a\x61\xd0\xb8\x47\xdb\x89\x9a\x36\x1e\x0c\xa0\x18\xb4\x35\x8d\x3b\xe9\x54\x5c\x8f\xff\x1d\x68\x2d\xde\xb3\x14\xf6\x4b\xf4\xed\xb2\xeb\x1d\xde\x7c\xb9\x17\x69\x64\xb4\xca\x87\xa9\x0b\xe9\x7f\xde\x20\x5e\x20\x6e\x41\x5b\x5f\x70\x5f\x89\x32\x27\x4a\xa5\x6e\x4e\xf4\xbc\x5c\xff\x25\x6f\xba\x43\x7f\x5a\xd3\x56\xd5\xab\x80\x0e\x35\x70\xbd\xa7\x7d\x4e\xe5\x33\x35\x2d\x06\xd0\x50\x68\xeb\x2b\x69\x2b\x5c\xf1\xcb\xe5\xac\xfe\xe9\x0b\x16\xc6\xd1\x69\x6e\x3f\x4c\xdf\x57\xff\x64\xda\x18\xbc\xbe\xb8\x3f\x58\x20\x47\x58\x3a\x45\xf0\x00\x06\xd0\x30\x68\xeb\x1b\x69\xcb\x44\xe4\xfa\x17\x9f\x1b\xf7\xe5\xe7\xcf\xe7\x09\x06\x09\x72\x97\xbf\x94\x52\xb9\x5c\x79\x6e\xaf\x30\x37\xbf\x84\x05\x19\x27\x25\x13\x06\xd0\x70\x68\x6b\x86\xb4\x55\x97\x20\xd6\x74\xe9\xa0\xe5\xf9\xe2\x6b\x6c\x7f\xa4\xc3\x05\xac\x14\x3a\x4c\x67\xdf\x18\xed\x51\x99\x08\x68\xaf\xf0\xa6\xb9\x29\x82\x01\x34\x02\xda\x9a\xc5\xdd\x29\xcd\xee\x0c\xc4\xa4\x6d\xed\x2e\x73\xd4\x58\x2f\xd7\x6b\x05\x07\x9c\x94\xdd\x9c\xea\xe6\x95\x52\xbd\x6f\x7d\xfc\x54\xd6\xec\x65\x0c\xa0\x91\xd0\xd6\x1c\x69\xcb\xa8\xc2\x8d\x71\xae\xfa\x56\x00\x7d\x2a\xef\x6f\x5e\xf7\x1f\x9b\xc1\x1c\x35\x8d\xeb\xf9\x0e\x16\x4b\x96\xad\x6c\x2f\xf3\x54\x0e\x63\x00\x8d\x82\xb6\xbe\x93\xb6\xb8\x5f\xb0\x66\x2d\x9b\x07\xbf\x35\x95\x9d\xe8\xe9\x7e\xea\x9e\xea\x3e\xb9\xd0\x6f\x66\xe1\x65\x37\x38\x5e\xfe\xb8\x65\x03\x63\xc1\x00\x1a\x0d\x6d\xcd\x93\xb6\x9e\x47\x75\x52\x4b\x0d\xa8\xfb\x39\x4a\xd9\x73\x99\x33\x61\xde\x2c\xb9\xeb\x1d\x6d\x1a\x59\xcd\x53\xcf\x12\x92\x02\x04\xba\xc4\x30\x80\xc6\x40\x5b\x3f\x70\x77\x11\x9f\xbb\xbc\x77\x5f\xec\x64\x59\x7f\x66\x6a\xe7\xe9\xe7\x92\xf3\x32\x6f\xca\xa8\xbb\x8c\x66\xac\xe9\x85\x55\xb5\xbd\xf5\x92\x36\x06\xd0\xdb\xd0\xd6\x02\x69\xeb\x96\x9c\xbc\x97\x8f\xdf\x26\x85\x74\x56\xd9\xe7\xd3\x21\x3c\x7d\x46\xf1\xdf\xb6\x7b\xbe\x67\xbf\xa7\x4f\x9f\x37\x5e\x0b\xea\x23\x5e\xb8\x62\xa1\xad\x45\xdc\x73\x41\xf4\xd3\x87\x39\xf4\xf6\x9f\xb5\xa3\x7c\x98\x28\x21\x33\x93\x74\xb8\x90\xb2\x65\xeb\x1b\xad\xc1\xd5\x94\x5d\x87\x57\x35\x4f\xad\x31\x80\xde\x81\xb6\x96\x48\x5b\xdd\x03\xf9\x2f\x0f\x4d\x71\xc5\xa4\xc4\x5e\xa1\x35\x65\x78\xc7\x29\x60\xf1\x95\x3e\x3f\xee\xb7\xca\xa9\x1f\x2b\xc9\xfc\x58\x86\x32\x06\xd0\xbb\xd0\xd6\x32\x6e\x33\x66\x20\xe1\xe3\x71\xf3\xe9\xaf\x38\x6e\xcb\x85\x9a\xe8\x27\x66\x97\xe6\x25\x1f\x32\x1c\x5e\xfd\x2a\x69\xf3\xb2\xc2\x4e\x2a\xc8\x06\x03\xe8\x3d\x68\x6b\x85\xb4\xa5\xd8\x91\x5f\xe8\x70\x5a\x84\x63\x5b\x09\x1c\x2d\x79\xa7\x12\x50\x5b\x6c\x7a\x4d\x61\xdd\xfe\xa6\x9a\x55\xf0\xe9\xe3\xf2\xa7\xe9\x30\x80\xc6\x41\x5b\xab\xb8\xa1\xa1\x74\xa3\x84\xa2\x61\x93\x35\xfa\xdb\xf3\xa5\xb8\x7d\xe6\x4a\x07\xac\x1a\x45\xab\x0b\x1b\xdf\xae\xc4\x33\x5a\xbe\xf5\x8a\x38\x8a\x01\x34\x1e\xda\x5a\x23\x6d\x25\x8f\x69\x77\x04\x99\x5e\x1d\x73\x94\x5b\xa4\xff\x63\xd0\xe2\xf1\x6f\x33\x5b\xdb\x40\xdc\xc6\x56\xff\xca\xd0\x3a\x8d\x68\xbf\x25\x06\xd0\x04\x68\x6b\x9d\xb4\xd5\xff\xd3\x9d\x6c\x8a\x47\xd4\x81\x32\x8c\xf3\x60\xe6\xde\x7f\xe3\x68\x63\xd0\x13\x9a\x16\x0f\x1b\xa5\x42\x59\xfe\xfe\x96\x32\x14\x03\x68\x22\xb4\xb5\x41\xda\x3a\x7b\xdb\x61\xb2\x93\x3f\xb0\xbf\x4d\x26\xbd\xa7\xe9\x8f\x5e\xc0\xf3\x8e\xcf\x20\x49\xa1\xf0\x53\x0e\xcb\x4a\x1e\x85\x63\xca\x15\x0c\xa0\x49\xd0\xd6\x26\x69\x0b\x61\xd9\x94\xfd\x98\xaa\x42\xbf\x3f\x4b\xfe\x89\xef\x03\xbf\xdb\xa9\xdd\x2d\x37\x6f\x5b\xba\xf8\x2e\x74\xe6\x08\xf2\x7f\x95\x53\xc7\x00\x9a\x0c\x6d\x6d\xe1\xee\xea\x87\x75\xcb\xd4\x6e\x8c\xd3\x3d\x26\x0f\x64\x0e\xb9\x85\xf0\x5b\xf5\x0d\x24\x3f\x3c\xca\xf7\xd3\x4d\x35\x9a\x4f\x30\x4b\x83\xb8\x4e\xa4\x40\x5b\x3f\x49\x5b\x53\xcb\x8d\x7d\x46\x8d\x7b\xae\xc5\x3f\xee\xdc\xf3\x74\x61\xd2\x5a\xd3\xdd\xf9\xb6\xa2\xe0\x39\x2c\xb6\x67\x6f\x54\x89\x30\xbf\x39\x06\xd0\xfb\xd0\xd6\x2f\xdc\xfa\xd5\x3f\xc1\x99\xc0\xe5\x2c\x68\x79\x9e\x42\xd4\x76\xf0\xd0\xd9\x8f\xec\xb3\x6f\x39\x51\x79\xd4\x15\x63\x72\xa9\x9e\xbc\x4f\x1c\x4a\x1f\x40\x5b\xdb\xa4\xad\x7b\xae\xec\xbb\x2a\xe1\x2f\x13\x05\xfc\x03\x0e\xca\x71\xd1\x3f\x76\x88\x54\xfc\xf2\x43\x6d\xa3\x30\xca\xcd\x8f\x79\x67\xf8\x0b\xf1\xf7\x98\x0a\x6d\xed\xe0\xee\x8a\xc9\x38\xd6\xaf\x94\xe6\x4c\x75\xd0\x2a\x46\xed\x0f\xc8\x3d\x77\x61\xfc\x5f\x4d\x68\xe5\x4c\xf8\xec\xbe\x9d\x03\x6f\x05\x56\x1d\x30\x80\xa6\x41\x5b\xbf\x49\x5b\x72\x1f\xed\xee\xf2\x54\x5f\xa9\xbd\xd8\x37\xb7\x55\x78\xcc\x10\x49\xe6\x7e\x27\xb5\x5a\x67\xd2\xa2\xc9\x7e\x4c\xeb\x4d\xa8\xdb\x31\x0c\xa0\xe9\xd0\xd6\x1f\xd2\x96\x10\x28\x18\xee\x8b\x33\x4b\xb4\xaa\xd7\xea\x0d\xea\xac\x99\xdf\xc3\x73\xe8\x90\xd7\x30\xff\xa4\xc1\xa3\x34\xd5\x43\xb5\x5d\x4a\x18\x40\x1f\x42\x5b\x7f\x71\xcf\x8a\x5d\x68\x8a\xf2\x3e\xbb\x42\xf6\xd2\xff\xd0\x83\xdf\x8a\x4e\xd6\xc7\x7a\xd5\x4f\x3f\x3d\xef\xb7\x42\xa0\x37\x7b\xd7\x2f\xfe\x99\xb8\xd9\xcf\x80\xb6\xfe\x91\xb6\x58\x77\x5c\xb4\x86\x16\x3c\x92\x9b\xce\x4e\xed\x4a\x8c\x5c\x89\x7d\xfc\x28\xf4\xfa\xcd\xbb\x01\xde\x57\x86\xdb\x1e\x8b\xc7\x8a\x0a\x62\x00\xcd\x84\xb6\x76\x49\x5b\x23\xbf\x28\xbc\x9f\x73\xbf\x0c\x33\x21\x70\xb8\xfc\x59\xda\x89\x36\xbb\xc0\xd2\x4e\x4b\x9d\x7c\x9b\xa5\xd2\x7c\xe8\x6c\xcd\xff\xbb\xe3\x9d\x05\x69\xf5\xb2\xfe\x7f\xa3\xe9\xfe\xff\x03\x1b\x40\x70\xe2\x9a\x62\xf9\xc7\xaa\xa8\x0d\xdf\xab\xe6\x49\x71\xe2\xd1\x59\x0d\x27\x5b\x72\x5f\xbe\x26\xd3\x6c\x25\xa7\x0b\x2c\x3d\xa8\x4b\xa9\x4e\x1c\x89\xa1\xe2\x1a\x40\x70\xe6\x5a\x5d\xde\x57\xc2\xec\xa8\xc7\xd3\x20\x8e\x21\xf0\x57\xe3\x51\x89\xb7\x41\x5e\x5d\x7b\xb2\xdd\x29\xf9\x1c\xac\x7f\x2e\x3e\x8d\x38\x66\x41\xcd\x35\x80\xe0\xd4\xb5\xb5\xc2\x57\xdd\xf7\x55\x73\xbf\xff\xe3\xaa\x15\xfc\xbe\x22\xd6\x69\xdf\xb4\xf3\x59\xf7\x60\xb5\x91\xbe\xd6\xe3\x9b\xed\xb4\xe2\xe2\x18\x40\xa1\xea\x1a\x40\x70\xee\x9a\x1c\xc1\xb2\xf0\x64\x87\xe5\xef\x21\x3f\x9d\x8f\xf9\xf6\xf9\x67\xad\x50\xcf\x5b\xfb\x87\x64\xc3\x08\x7f\x4f\x61\xdc\x23\x35\x42\x18\x40\xa1\xee\x1a\x40\x70\xf2\xda\xe6\x1c\x5f\xa6\xa3\x83\x7c\x16\x33\x1d\xe3\xf9\x63\xcc\xd2\x51\x52\xb6\xb2\xc9\x5f\x65\x53\xd5\x55\x9e\x6a\xd2\xd9\xc8\x98\xb8\x63\x00\x85\xca\x6b\x00\xc1\xd9\x6b\xcc\x67\xc9\x6c\xdb\x46\xf5\x1a\xda\x03\x79\x02\xf7\x24\x97\x97\x78\x5e\x12\xdd\x5c\xfa\xb0\x73\xe0\xa9\xdc\x9c\xca\xdb\xbb\x5c\xc6\x18\x40\xa1\xf6\x1a\x40\x70\xfa\xda\x36\xfd\xc0\x1d\xf3\xbf\x95\x59\x60\xd9\xf4\x50\x86\x21\x38\x8f\xcc\x1c\x30\xef\xd6\xf9\xbb\xf7\x2c\x81\xad\x4f\x31\xac\x8b\x78\x2d\x84\xea\x6b\x00\xc1\xf9\x6b\x6f\x3a\xe3\xea\xe8\x85\xc8\xfd\xbc\xb4\x7c\xf8\x2e\x4f\x1d\xb2\x90\x8e\x2e\x4f\x94\x57\x9d\xfa\x52\xb8\x1a\x5a\xa5\x59\xf5\xca\x1e\x03\x28\xd4\x5f\x03\x08\x4e\x60\x9b\x39\x5f\xf0\x53\x61\x1c\xb0\xef\xaf\xa9\x50\xae\x90\x49\x96\xd0\xb8\x21\x26\xb1\xc9\x32\x45\x3b\x9f\xd2\xad\x20\xee\x14\xa4\x88\x01\x14\x2a\xb0\x01\x04\x67\xb0\xb9\xfc\xed\xb9\xcb\x42\x7b\x91\x10\x8b\x70\x6d\xd9\xcd\xe9\x6e\x45\x81\x3f\xd6\x75\x5d\x19\x4d\xb3\xac\xa2\xd6\x6c\xa1\x6c\xc4\xcf\x0c\x6a\xb0\x01\x04\xa7\xb0\x89\xfb\xd3\x05\x2c\xbf\x7f\xde\xda\x2a\x8c\xe6\xcf\x1e\xdf\x7a\x20\x16\x1e\xad\xaa\x1a\x43\xfe\x48\x9d\x3a\xdc\x7e\xfc\x4a\xb0\x1b\x06\x50\xa8\xc2\x06\x10\x9c\xc3\x16\x4c\x5d\x82\xee\xd2\x7b\xd8\x73\xdc\x36\xd9\xf7\x3b\xfd\x2d\x7b\xe4\x54\x85\x27\x75\xfd\x42\x66\xe3\xa0\xb2\xb6\xb6\x18\x85\x16\x06\x50\xa8\xc3\x06\x10\x9c\xc4\x66\xf8\x56\xae\xcb\x41\xad\xe0\x50\xd1\x5f\x91\xae\x5f\x6c\xbf\x92\x59\xa6\x6c\x87\xbe\x95\x3f\xbc\xe9\x6a\x28\x69\x70\xfc\x8d\x14\x71\x2b\x07\x95\xd8\x00\x82\xb3\xd8\xda\xbb\xc7\xd2\x8f\x96\x73\x28\xf6\x9f\x7d\x4e\x55\x19\xcf\x16\xf0\x5d\x5e\xec\xd2\x22\x5d\xa1\x98\xf3\xa5\xa2\xba\xda\xfc\x0e\x67\x0c\xa0\x50\x8b\x0d\x20\x38\x8d\xed\xed\xe2\xf2\x95\xf7\xbc\x52\x65\xdc\xab\x76\x03\x21\x57\xb3\x8e\x97\x5e\xea\xb4\xc9\x8c\x7b\x6e\x1d\x7d\x55\xab\xe4\x79\xd8\x31\x01\x0c\xa0\x50\x8d\x0d\x20\x38\x8f\x2d\x9f\x7f\x7f\xbf\xec\x9a\x5b\x60\x00\xc7\x94\x02\xeb\x8b\x47\x2d\x95\xae\xcf\x78\x62\xde\x5f\xe4\xe6\x3f\xaa\x16\xf1\xe5\x75\x3b\xf1\xa0\x85\x7a\x6c\x00\xc1\x89\x6c\x74\x5b\x9e\xb1\x1c\xcd\x49\x34\x11\xdc\x8f\x45\x5b\x0f\x65\xd8\x6d\x4b\x56\x38\xcf\x0d\x3e\xde\xc6\x8e\xdc\xcb\x36\x37\xd4\x26\x5e\xf9\xa1\x22\x1b\x40\x70\x26\x1b\x5f\x51\xfa\xcf\xde\xf5\x59\x3b\xb3\x69\x2f\x82\xe5\x6f\x09\x1f\x7d\x4b\x7e\xc9\x77\x83\x46\x65\x7f\x28\x13\x84\xb2\x16\xe3\xf8\x31\x80\x42\x4d\x36\x80\xe0\x54\x36\x45\x0b\xe5\x8f\xc7\xcf\xac\x66\x9c\x48\x3c\x9a\xf0\xbc\x30\xf4\xfb\x0c\x43\x77\xb5\xfb\xbe\x8d\x23\x31\xb6\x8b\x37\x23\xff\x84\x52\x60\x00\x85\xaa\x6c\x00\xc1\xb9\x6c\xd7\xe3\x32\x8d\xf6\xc6\x6c\xec\xec\x15\xe3\x54\x2c\xfa\xf6\x30\x6e\x4c\xee\x8b\xec\x33\x33\x7f\xad\xbc\x1b\x88\x95\xff\x66\x96\x0a\x06\x50\xa8\xcb\x06\x10\x9c\xcc\x66\x4f\x69\xc0\xad\xb1\x31\x3b\xc0\x5a\xa7\xa0\xa4\x9f\x3b\xf9\x93\xe2\xca\xeb\x6d\x95\x2b\x1d\xfe\x87\xb2\x8a\x02\x79\x58\xf5\xd9\x30\x80\x42\x65\x36\x80\xe0\x6c\x36\x09\x4a\xc7\xac\xbb\x42\x42\x74\xd4\xac\xb4\xe6\x31\xce\x57\x7e\x9f\xa1\xd7\x0d\x09\x7d\x7e\xe2\xb7\xc9\x02\xea\x7d\x7b\x56\x8b\x78\x3a\x41\x6d\x36\x80\xe0\x74\xb6\x7e\x5f\x1e\xfd\x97\xb5\x02\xd4\xb1\xc2\x5d\x96\xa1\x7e\x19\xe8\xa6\xa8\xb6\x84\xe2\xbf\x97\x8f\x67\xf5\x4b\x9d\x84\x53\x8e\xd3\x63\x00\x85\xea\x6c\x00\xc1\xf9\x6c\xf7\x47\x95\x6e\x9d\xd7\xcc\xbc\x69\x15\x98\x2a\xac\x50\x11\x4c\xa7\x2c\xa0\x92\x91\x6b\x6e\x46\xa7\xeb\x5f\xa8\x9a\x60\x7d\x69\x0f\x06\x50\xa8\xcf\x06\x10\x1c\xd0\xc6\xd0\x71\x56\x6c\x44\xaf\xe7\xad\xe5\x0d\xcd\x4e\x7d\xb3\xea\x01\x75\xfb\x8b\x2b\xa6\x17\xc5\xaf\xfb\xe4\x0a\xbe\xfe\xec\x45\x20\x1e\x1a\x50\xa0\x0d\x20\x38\xa1\x4d\x72\xf7\xc4\xb9\x67\x61\x85\xc7\x0e\x2c\x69\xe6\xab\xe7\xca\x5c\x7f\x51\xe9\x21\x9c\xad\x81\x05\x04\x8f\x5f\x2d\x1e\x8e\xcd\xa0\xc2\x00\x0a\x15\xda\x00\x82\x23\xda\x5c\xc4\x97\xcc\x9e\x6e\xe8\x0d\xf6\xd8\xf9\x6c\x0e\x6c\x2b\x4f\x9f\x31\x1c\x64\x5b\x17\xcb\x6c\xae\x8c\x0a\xfc\x12\xfe\xef\x22\x2b\x06\x50\x28\xd1\x06\x10\x9c\xd1\xa6\x16\x32\x27\x73\xab\x8c\xc1\xa0\xa0\xec\x13\x8d\xd1\x75\x1a\x35\x0d\x6a\x8d\x4a\xf5\x50\xc6\x74\x6b\x86\x03\xac\xb2\xa5\xab\x32\x18\x40\xa1\x46\x1b\x40\x70\x48\x1b\xc6\x2e\xa9\x35\x2d\x77\xd3\x51\x82\x2e\xa0\x69\x4f\x5d\xe0\xbe\x7f\x54\x3a\xca\xa2\x84\xf6\x93\x86\x36\xbf\xc7\xfe\x1a\xca\x11\x77\x90\x50\xa4\x0d\x20\x38\xa5\x0d\x4b\x61\xbc\xdf\xd4\xa2\xa7\x30\x40\x38\xc5\x73\xfa\x9f\x55\xd5\x40\xd9\xa7\x2c\x4e\xfd\x8a\x5f\x0f\xe3\x0e\x48\xed\x7b\x35\x43\xbc\x08\x43\x95\x36\x80\xe0\x98\x36\xe3\x1c\x9b\xe7\xd9\xae\x46\x27\x8c\xf2\xcc\xc2\xef\xb8\xb4\xc7\xd4\x38\x96\x0b\xb6\xd9\x29\x72\x7e\xa7\x9f\x77\x94\x7b\xb1\x6e\x87\x01\x14\xca\xb4\x01\x04\xe7\xb4\x59\x71\xf7\xe7\x5f\x4f\xb3\xdf\xf4\x6b\xfa\xdb\xed\xf2\xea\x97\xfe\x8a\xa1\x53\xad\xd6\x8c\xc7\xd0\x79\x2d\xfe\x5d\x4c\x8b\xfe\x1c\x06\x50\x98\xd3\xf6\x7f\x03\xdd\x7f\x01\xc2\xff\x3b\xd0\xe1\xa0\xb6\x82\x91\x11\xf1\xf9\x32\x1a\x11\xfa\x97\x7b\x0e\xc9\x05\x73\xea\x16\xa7\x0e\x65\x47\x66\xff\x75\x94\xfc\x49\xd6\x45\x9f\xfd\x98\x1a\x03\x28\x14\x6a\x03\x08\x4e\x6a\x73\x1d\x9c\xb9\xdc\xb4\xdc\x29\xc8\x20\x2d\x95\x51\x72\xc5\x6a\xa3\xd5\xf6\xf0\xbe\x93\xef\x74\xac\xda\xde\xdb\xd8\xb1\x2d\x6c\x10\xf7\x77\x50\xa9\x0d\x20\x38\xaa\xcd\x7e\x50\x50\xd6\x8e\x55\x62\x81\x79\x85\x2e\x7a\x39\xce\x7f\x9b\x5a\xe0\x35\x0d\xdf\xb9\xde\x9b\xfd\xd4\x34\x63\xe2\xfa\xc5\xd2\x18\x40\xa1\x54\x1b\x40\x70\x56\x5b\x5b\xc9\x31\x6e\x06\xfd\xd2\xc7\xe3\xda\x8a\xd5\xe9\x8a\x97\x7c\x2e\x91\xa7\x6e\xd7\x88\xad\xb4\x48\xc4\x70\xef\x12\xf8\x0e\x13\x7f\x63\x50\xab\x0d\x20\x38\xac\x4d\x33\x7a\xbc\xe6\xcd\x15\x9a\x80\xd0\xdf\x8c\x06\x9d\xd6\xd4\xd1\x8f\x43\x03\xcb\xa3\xb8\x17\x8e\x61\xde\x2b\x64\xdd\x52\x8b\xba\x18\x40\xa1\x58\x1b\x40\x70\x5a\xdb\xc0\xd9\x4f\xcd\xfc\x8d\xb7\xd0\x56\xd7\xe2\x89\xfc\xd8\xf6\x06\x0e\xdd\xf3\x92\xae\xbb\x7e\xa6\xe5\x1d\x5b\xb3\x57\xd4\xbe\x13\x97\x19\xa8\xd6\x06\x10\x1c\xd7\x16\xb0\xbb\x2f\xe8\x61\xff\xd1\xed\x7f\x39\x2f\xc5\x38\x6b\x78\x33\x03\x33\xc7\xb4\xfa\xbe\xaf\xe8\xd0\x59\xbd\x78\x8c\x2e\x3e\x20\x4e\x3a\x50\xae\x0d\x20\x38\xaf\xcd\xa7\xe3\xe2\x21\x55\x5b\xca\xb0\xb7\x1e\x1f\x6b\x9f\x28\x93\x95\xf3\x3f\xa5\x50\xfa\x5d\x77\x66\x21\x4d\xac\x6f\xf6\xcb\x86\xee\x25\x0c\xa0\x50\xaf\x0d\x20\x38\xb0\xed\xe6\xb1\x57\x37\x59\x44\x43\xa3\x9f\x26\xd6\x7f\xb5\x90\xfc\x64\xe7\xb9\xe7\xbe\x22\xc7\x2f\x61\x41\x76\x0e\x2b\xbe\x80\xe8\xff\xb7\x35\x83\x82\x6d\x00\xc1\x89\x6d\xc3\xfb\x59\x34\xdd\xaf\x90\xb9\xf2\x67\x97\x1e\x65\x4f\xa9\x3f\x1f\x7f\xc0\xf0\x8d\x12\x57\xba\xe2\x9e\xee\xe7\x7d\xe9\xeb\x27\xd9\x31\x80\x42\xc5\x36\x80\xe0\xc8\x36\x96\x0b\xef\x62\x8b\xc2\xa4\x0c\xd6\x91\x2d\x9f\x63\x75\x07\xf2\x39\x37\x32\xa6\x7f\x32\x14\xaf\xdb\x13\x84\x8e\xbd\x59\x66\x3b\x84\x01\x14\x4a\xb6\x01\x04\x67\xb6\x7d\x7b\x64\x94\x6a\xb9\xb6\x21\x55\x14\xe8\x97\x24\xaa\xb5\x76\xb5\x40\xab\xe6\xe3\x33\x5f\x77\x26\x66\x8a\x30\xc9\xf6\x5f\x75\xc4\xa5\x19\x6a\xb6\x01\x04\x87\xb6\x95\x48\x38\x7b\x8d\xd8\x9b\x9f\x9b\x30\x1f\x13\x9d\xfe\x3c\x98\x62\x60\xed\xb8\x9a\x73\x2f\x34\xed\xa2\xf4\x9e\x81\xe9\xcc\x83\x47\x30\x80\x42\xd1\x36\x80\xe0\xd4\x36\x89\xbe\x71\x77\xfd\xdc\xe5\xa8\xfd\x4e\x62\x92\x4c\xd5\x3d\x82\x43\x77\xe4\x55\xe4\x0b\x72\xab\xb9\x8a\xfe\x98\x3b\x8d\xae\x4b\x61\x00\x85\xaa\x6d\x00\xc1\xb1\x6d\xe6\x05\x7b\x44\xa2\xd7\x23\xbb\x1b\xc8\x2c\x0e\xd5\x56\xf0\xb1\x7f\xb8\xb2\xc5\x19\x79\x34\x6b\xec\x12\x33\xdf\x06\x4d\xeb\x93\xab\x18\x40\xa1\x6c\x1b\x40\x70\x6e\x1b\x19\x99\x2e\x58\x0f\x7a\x68\xfb\x5c\x83\xe2\x6e\x3e\x99\x57\xd3\xe1\xab\x71\x21\xcf\x29\x7d\xab\xec\x8e\xd9\x05\x79\x6a\x72\x9c\xc5\x00\x0a\x75\xdb\x00\x82\x83\xdb\x02\xb6\xe5\xb5\x67\x58\x03\xa8\x9e\x2f\x08\x57\x93\xe9\x16\xed\x17\x9f\x00\x54\x4d\xcf\x47\x6c\x93\x3f\xc8\x9c\x79\x75\x14\x25\x0e\xc1\x50\xb8\x0d\x20\x38\xb9\xad\xe7\xcd\x31\xf5\x81\xb6\x7f\xc3\x27\x66\x15\x1f\xbc\xb6\xe5\x64\x34\xe6\xa2\xdd\x29\x88\xb2\xfa\x1c\xf9\xe3\x8c\x75\x79\xe6\xff\xbb\x1f\x0a\x95\xdb\x00\x82\xa3\xdb\x8a\x7e\x4d\x99\x27\x2a\x15\x1c\xdf\x29\x02\xc3\x6f\x58\x0f\xf3\x76\x8f\x1f\xa5\x7d\x62\xa3\x3c\xf4\x35\x74\xed\x8a\xd2\xae\xc2\x65\x0c\xa0\x50\xba\x0d\x20\x38\xbb\xad\x78\x7f\x55\x37\xe3\x4b\xa3\x33\xd5\x7d\xb7\x36\xf3\x6a\x0f\xfa\x87\xbc\x54\x24\x4b\xcb\x2f\xdc\x0a\x33\xa4\x51\xee\x90\x9b\x22\x0e\x74\x50\xbb\x0d\x20\x38\xbc\x2d\xfb\xa7\xe8\xf7\xce\xd8\x0a\xc3\xc1\xa6\xdd\x25\xab\x98\xb5\xf0\xf7\xda\xfd\x66\x7b\x8d\x79\xaf\xcd\x97\xcc\x33\x75\x6a\x28\x5f\xc3\x00\x0a\xc5\xdb\x00\x82\xd3\xdb\xd6\xa7\x8e\x2c\x0e\xdb\xed\xbc\x90\xe3\xd6\x19\x61\x9d\x3d\xd3\x2c\x79\xc4\x68\xf7\x0f\x4b\x37\xfd\x59\x99\xdb\xfe\x07\x8c\x6b\x89\xaf\x0c\xaa\xb7\x01\x04\xc7\xb7\xc5\x77\xb2\xa0\x37\x78\xf4\x76\x3e\x45\xfd\xdd\xfb\x6c\x94\xbb\x23\xb0\x76\xdc\x25\x58\x54\x75\xfa\xc8\x23\xcf\x54\x7e\x24\x89\x38\xd0\x41\xf9\x36\x80\xe0\xfc\x36\x17\x83\xd4\x62\xf7\x54\xca\x9e\x56\xf9\x6d\xae\x11\xab\x65\x69\x9b\x13\xb1\x6a\x60\xa3\x7d\xec\x5e\xbc\x71\xf9\x8c\xe2\x05\x05\x0c\xa0\x50\xbf\x0d\x20\x38\xc0\x6d\x2a\x72\xf6\x64\x30\x79\xa6\x2b\x05\x37\x56\x68\x6b\xa2\x39\x7d\xf3\x64\x17\xba\xb9\x72\x27\x8a\x26\x41\xd6\xfe\xe1\x47\xef\x0b\x18\x40\xa1\x80\x1b\x40\x70\x82\x5b\xff\xbf\x81\xbc\x18\x1f\xfb\xc0\x5f\x1a\xd5\x5f\x6d\x8e\xcb\x3a\xf3\x7d\x2f\xb9\xf8\xc6\x59\x46\xea\xe4\xe3\x17\x5c\xfc\x1e\x59\x00\x03\x28\x54\x70\x03\x08\x8e\x70\x1b\x5a\x3a\xa3\xf4\x3e\xce\xaf\x5b\xec\x59\xf7\x3d\xca\xe6\x34\xbf\x84\x21\xe3\x1b\x07\xec\x05\xa2\x18\x72\xa8\x65\xb4\xd0\x2e\xe2\x44\x0d\x25\xdc\x00\x82\x33\xdc\x8e\x19\xec\x2b\x1a\x07\xfb\xfe\x3a\x07\xa5\x92\x77\x89\x54\x0d\xef\x86\xa5\xcf\xec\x6d\x2f\x29\x09\x0a\x8f\xbd\x73\xf9\xa9\x05\x39\x06\x50\xa8\xe1\x06\x10\x1c\xe2\x46\x51\x57\x1f\xda\x28\xce\x51\xc0\x7b\xfd\xf8\x64\xd5\x23\x69\x99\xc1\xbf\x61\xe6\x81\xc6\xa2\x93\x8c\xa3\x91\x7f\x9e\xd1\x6e\x98\x62\x00\x85\x22\x6e\x00\xc1\x29\x6e\xa7\x5e\x77\xbe\xfe\x2d\x51\xb2\x60\x2f\xa4\xa3\xc8\x4c\xa0\x31\x88\x13\x08\x1b\x7d\x74\xf5\xe0\xd1\x95\xb0\xa2\x13\x47\x8c\xfb\x1d\x31\x80\x42\x15\x37\x80\xe0\x18\x37\xc1\x1b\x27\xf8\xd3\x39\xe7\x3c\xfc\x38\x3e\x2c\x45\x66\xad\x25\x76\xbb\x0d\xa1\x4c\x16\x75\x96\x1b\x1b\x07\x37\x57\xca\xaf\x13\x0f\x0d\x28\xe3\x06\x10\x9c\xe3\xe6\xb4\xff\xe4\x19\x8d\x47\x9d\xdf\xee\x68\x96\x3f\x8d\xdd\xb3\x7b\x35\x84\xb9\xf8\xcc\xf8\x99\x81\xef\x2f\x5e\x05\x3f\xcb\xba\x53\x42\x83\x01\x14\xe6\xb8\xfd\xdf\x40\xf7\x5f\xff\xe6\xe1\x7f\x07\x3a\x1c\xe4\x26\x24\x3f\xd8\x69\x23\x2b\x2c\x72\x60\x60\xf8\xe1\x47\xd3\x93\x76\x3e\xd9\xc6\x4f\x19\xca\x0a\x9a\x0c\xe3\x84\x12\x85\x16\x45\x89\x1b\x77\x28\xe4\x06\x10\x9c\xe4\x26\xc1\xa0\x1f\x4e\x51\x45\xb3\xd4\xce\xae\xb0\xdd\xbd\x78\xc2\xcf\xdf\x97\x2f\x54\x2f\xa0\xa8\xe2\x6f\xe0\x7e\x83\x95\x67\x15\x94\x18\x40\xa1\x92\x1b\x40\x70\x94\x1b\x72\xea\xab\x55\xa9\x8c\x52\x35\x8b\x44\x4a\x44\x72\x19\xed\xb2\xf6\x9e\x81\x4d\xf5\xf1\x54\x8a\x9b\x6a\x77\x4d\x16\xe9\x45\xf5\x30\x80\x42\x29\x37\x80\xe0\x2c\xb7\xf9\xba\xe1\x9f\xe9\x6e\x07\xae\x7c\xd0\x73\x3a\x92\xd1\xfa\x7c\xf8\xb2\x7f\xff\x42\x7b\xe7\xf5\x98\xb5\xd7\x62\x57\xc3\x9c\xbd\x88\xe7\x1f\xd4\x72\x03\x08\x0e\x73\xd3\xa7\x93\x32\x38\xf2\xa3\xd4\x7d\xbd\x7e\xc7\xdd\xed\x96\xf3\xd3\x36\xaf\xfb\xd1\x43\x2d\x0c\xec\xd2\xdf\xde\xb4\x9f\xbd\xcc\xeb\x8a\x01\x14\x8a\xb9\x01\x04\xa7\xb9\xe9\x59\x52\x52\x04\xb3\xd0\xa7\x29\x54\xa7\xab\x5c\xce\xe4\xf4\xed\x2c\x75\xdf\x97\x64\x17\x5c\x90\x36\xcf\x9d\x2a\xee\xd7\xc3\x84\x01\x14\xaa\xb9\x01\x04\xc7\xb9\x8d\x4c\x31\x0e\xd0\xa7\xbb\xbe\xfe\xf6\x74\x9b\xeb\xfe\x90\xf4\xb1\xc7\x26\x04\x49\xdf\x77\xd8\xe8\xd2\x3d\x96\x73\x2d\xb7\xeb\x88\x57\x6d\x28\xe7\x06\x10\x9c\xe7\xa6\xaf\x3e\x0e\x3e\x70\x34\xe6\x9a\xc5\x3e\x4d\x13\xb2\x24\x37\xd0\x45\x6c\x9c\x1e\x3a\x1d\x7a\xdc\x93\x5a\x52\xa8\x2a\x27\x44\xfc\xcc\xa0\x9e\x1b\x40\x70\xa0\x9b\xcb\xbb\x63\xdb\x3c\xf7\x9f\xc5\xd8\xc7\x74\x96\x48\x2e\x5b\x32\x14\xfa\xbc\x18\x0d\xe4\x7c\x6d\x7d\x4e\x91\xf1\xcd\xed\x64\x2f\xe2\xd8\x04\x05\xdd\x00\x82\x13\xdd\x12\x7b\x92\x4c\xb6\xdc\xca\x42\x19\x8b\x2b\x4f\x96\x62\x83\xc7\x15\x66\x35\x9e\x89\xfb\x35\xcd\xe5\x5a\x26\x60\x32\x92\x71\xc4\xad\x1e\x54\x74\x03\x08\x8e\x74\x63\xd0\x35\xaf\xc2\x44\xb7\x07\xb3\xaf\x65\x20\xb4\xfa\xb3\x2f\x9e\x96\x5d\x97\xaf\x8f\x55\xad\xa5\xd5\x3d\x69\x7f\xd4\xd6\x98\x1b\x03\x28\x94\x74\x03\x08\xce\x74\x93\x79\xf1\xce\x76\x27\x85\x9e\x03\x58\xb9\xca\x21\x4f\xc8\x79\xc8\x53\xbf\x5f\x2b\x6b\x7e\x5e\xbc\xb5\x27\xf1\x96\xf0\x84\xae\x18\x06\x50\xa8\xe9\x06\x10\x1c\xea\x26\x2e\xe0\xdb\xad\x36\x9c\x56\x9d\xc6\xa7\x92\x65\xe3\x76\x9f\xe7\xae\x5b\xc9\xc7\xd7\xa6\xee\x68\xfb\xe2\xbe\xa7\x62\xdb\x59\xc4\xcd\x16\x14\x75\x03\x08\x4e\x75\xf3\x3e\xb8\xa7\xe3\x1e\x08\x54\xab\xb4\x3c\x3e\x5d\x5b\x1d\xe4\xfc\xe7\x2b\x05\xe7\x96\x90\xa5\xfc\x2f\x93\x72\xa7\xaa\xba\x40\x1d\x0c\xa0\x50\xd5\x0d\x20\x38\xd6\x8d\x9c\x4f\x8b\xbf\x6b\xe4\x6e\xb9\xc6\x85\xb2\xfa\xef\x1f\x8c\x95\x92\x02\xc5\xdf\x2b\xbe\x38\x7d\xde\xf8\xf3\xb9\x0f\x26\x27\x18\x59\x30\x80\x42\x59\x37\x80\xe0\x5c\xb7\xb3\x43\xeb\xc1\xcc\xfb\x9a\xb5\xd3\x55\xa4\xbf\xb6\xb5\xd1\x7b\x96\x70\x29\x5c\x1d\xa6\xfd\x60\xe7\xf7\x6e\xa0\x6e\xdf\xc7\x19\x3e\x0c\xa0\x50\xd7\x0d\x20\x38\xd8\xed\xcd\xa3\x2b\xe1\xa5\x7e\x19\x6e\x31\xe9\x45\x33\x13\x8c\x56\x04\x03\xb1\x85\x67\xc7\x04\x1f\x38\x72\xd0\xde\x69\xa1\x9c\x8d\x24\x9e\x4e\x50\xd8\x0d\x20\x38\xd9\xad\xed\xd6\x64\x93\xb1\x02\x61\x25\x42\xed\xaf\xf2\x31\xb5\xb2\xdb\xa5\x11\x83\x9f\xbe\x72\x9e\x7f\xaf\xaf\xc1\x3b\x3a\x52\x25\x6a\x88\x01\x14\x2a\xbb\x01\x04\x47\xbb\xfd\x68\x76\x3f\x17\x6a\xc7\x12\xbe\xf7\x88\x7d\xba\x58\xfa\xaa\x72\x7e\xb9\x7a\x62\x03\x75\x91\xcc\x22\x93\xb0\x34\x27\x6d\x01\x27\x06\x50\x28\xed\x06\x10\x9c\xed\xf6\x75\xd9\xb8\xeb\xfd\x31\x6b\xd9\x8e\x94\x28\xbd\x9d\x9d\xc1\xa5\x99\x14\x7f\xed\x08\x6f\x02\x55\x8c\xa4\xa2\x25\xb5\x4a\xa6\x16\x06\x50\xa8\xed\x06\x10\x1c\xee\xc6\xf7\x7d\xb9\xe8\xa8\x93\x5e\x6d\x12\x41\xad\x8f\xe2\xbb\xc7\x89\x63\x57\x7f\x66\xa1\x0c\xbd\xfe\xf2\xde\x35\x97\x7b\x59\xa2\x0f\x62\x00\x85\xe2\x6e\x00\xc1\xe9\x6e\x56\xb6\xac\x47\x9e\x6b\x3f\x9e\xfc\xf2\xe9\x3c\xe3\xe2\xc8\x9d\xe3\x9e\xdd\x3e\x2c\x6f\x33\xc6\x7c\x0e\xc4\x8b\x2c\xb9\x30\x95\x6a\x63\x00\x85\xea\x6e\x00\xc1\xf1\x6e\xff\xf4\x32\x8b\x1b\x77\xb6\xd0\xcc\xa0\x8e\xf7\x9e\xaa\x47\xf6\xbe\x55\xe7\x3a\xf2\x84\x7b\x53\x8a\x9b\x6a\xce\x35\x71\xa0\x8d\x0b\x03\x28\x94\x77\x03\x08\xce\x77\x93\xdd\x5a\xf0\x12\xe6\x27\x04\x7d\x63\x5b\xdd\x7f\xa9\x71\x6c\xd7\xb7\xa0\x4b\x50\xfe\x79\xd4\xd9\x1b\x87\x47\x9b\x1b\x46\x9c\x88\xdb\x40\xa8\xef\x06\x10\x1c\xf0\x16\xef\xd0\xac\x4d\xb9\x7d\x29\x4f\xe8\x9e\x69\xc9\x29\x4d\xeb\x95\x0b\x95\x21\xe5\x47\xa7\x83\x52\x29\x1c\xe4\x63\x15\x02\x73\x89\x73\x2b\x14\x78\x03\x08\x4e\x78\xf3\xce\xe7\xb8\xfd\x28\xec\x62\xe6\xa5\x9c\x5f\xde\xc1\x1e\x6c\x37\xb7\x7a\xdd\x3b\xfd\x12\x9b\x03\x7d\x9b\x07\x5b\xb1\x97\x72\x82\x18\x40\xa1\xc2\x1b\x40\x70\xc4\x9b\x38\x81\x5e\x96\xfa\xb8\x8e\x7d\x7f\x8b\x86\xe5\xc2\x67\x11\x31\x71\x63\xb6\xf4\x97\x73\x1d\x4c\x2a\xd4\x6a\x39\x3f\xdc\x7c\x88\x4b\x10\x94\x78\x03\x08\xce\x78\xb3\xb8\xf0\xc3\xc9\x45\x83\x5e\x2f\xb1\xeb\x74\xc3\xda\xfd\x77\x8c\xf1\xaf\x57\x82\x56\x78\x4c\x3a\x66\x46\x1d\xec\xea\x53\xdc\x88\x31\xa8\xf1\x06\x10\x1c\xf2\x96\x34\x99\xf1\xf2\x20\x67\xe3\x47\x73\xfe\xa6\xda\x81\x13\xc9\xa6\x8e\x8e\x76\x86\xa8\x77\x64\x77\x54\xd3\xc4\x92\x51\xe6\x96\x1a\x06\x50\x28\xf2\x06\x10\x9c\xf2\x76\x72\xe6\xa3\x70\x41\xda\x4b\xad\x5a\xb6\x0b\x8b\x88\x62\x4e\xea\x73\x2b\xa5\x0a\xa1\x53\x2e\x36\x92\x36\xdf\xcd\xb7\xc9\x12\x89\x63\x13\x54\x79\x03\x08\x8e\x79\x13\x70\x50\xe5\xae\x4a\xa9\x4b\x08\x33\x6b\x0c\x36\x9e\x31\x5c\x63\xef\x33\x91\x77\xa3\x50\x1a\xf0\x1c\x1c\xaa\x49\x73\x71\x20\x1e\x1a\x50\xe6\x0d\x20\x38\xe7\x8d\x7b\xc2\x25\x69\xf7\x06\xf5\xa0\x7b\xc4\x7b\xf5\x6c\xbe\x60\xff\x6a\x76\xb1\x97\xdf\xce\x26\x71\xe7\x3d\x75\x3e\x7b\x2c\xf9\xb2\x1d\x06\x50\x98\xf3\xf6\x7f\x03\xdd\x7f\xfd\x33\xae\xff\x1d\xe8\x70\xd0\xdb\xdb\xb0\x13\xb1\x69\x3d\x39\xc7\xc6\x28\x7f\x8c\x39\xba\x95\x8f\x17\x76\x36\x98\x1c\x16\x78\x45\x6f\xb7\x75\x90\x6c\xfe\xd0\x35\x5b\x0c\x10\xa0\xd0\x1b\x40\x70\xd2\xdb\x65\xbb\x65\x4a\x31\xa5\xc3\xaa\xfd\x3b\x0d\x8e\x87\x86\x4c\x66\xa2\x62\xa4\x7b\x32\xb9\x66\x9e\xdb\x96\xf3\xcb\xfd\xc2\x0e\x59\x61\x80\x00\x95\xde\x00\x82\xa3\xde\x7e\x23\xeb\xed\x31\x95\xaa\xdd\x51\xd4\x55\x5a\xa5\xc8\x61\x2e\x87\x79\xc6\x25\x1a\x06\x5a\x5e\xa6\xc3\x22\xce\x65\x7f\x47\x09\x18\x20\x40\xa9\x37\x80\xe0\xac\x37\x67\xd9\xe1\x71\x1f\xe5\x30\x81\x73\x8f\x92\xb4\x7c\x3d\x3e\xdc\xdd\x73\x6a\xbf\x9b\xae\xd5\xcd\xd3\xd7\x7e\xbb\xff\xa3\x91\x65\x95\xc0\x00\x01\x6a\xbd\x01\x04\x87\xbd\x0d\xb2\xec\xe8\x04\x7d\x7b\x5a\xc5\x74\x91\x5c\x82\x7b\x4e\xad\xd8\x91\x5a\x2a\xe7\x64\xe8\x24\x4f\xe2\x09\x31\x4c\x67\x22\xf0\x1a\x06\x08\x50\xec\x0d\x20\x38\xed\x8d\xb6\xf6\xa7\x75\x60\x94\xb1\xc5\x49\xa9\x83\x49\xcf\xe4\xc8\xc5\x87\x0f\xb6\x44\xda\x26\xff\x9b\x61\x62\xbd\xa2\x7b\xc3\x2b\xdf\x12\x03\x04\xa8\xf6\x06\x10\x1c\xf7\xd6\xae\x9a\x60\xcf\x18\xcb\x66\x74\x2d\x6c\x97\x7c\x2a\xf2\x91\xa5\xee\x19\xcb\x27\xcf\x83\x65\x14\x16\xd5\x8c\x5e\xfe\x9c\x6d\x43\x31\x40\x80\x72\x6f\x00\xc1\x79\x6f\xa3\x5d\xea\xf7\xd4\x2f\x96\x2b\x4b\x27\x19\xdc\x49\xd3\xb5\xf0\x3e\xbd\x5e\x58\xfb\xb0\x91\xad\x6c\x34\xac\xa8\x4b\x6c\xd3\x75\x2f\x06\x08\x50\xef\x0d\x20\x38\xf0\x2d\x9f\x36\x62\xdf\x17\x9d\xa1\xe7\x77\xf3\x35\xf5\xbf\x6c\x07\xf6\x52\x77\x1b\xac\xec\x66\x67\x94\xa4\x2c\x08\xeb\x7f\xd3\x92\xa5\xc3\x00\x01\x0a\xbe\x01\x04\x27\xbe\xc9\x68\xbd\x4e\x51\x9e\xac\x52\xfe\xeb\x9e\x2a\x18\x71\x5f\x44\xcf\xca\xca\x6d\x5f\xc4\xb5\xb7\x55\x67\x31\xfa\x85\xa1\x04\x27\x41\x0c\x10\xa0\xe2\x1b\x40\x70\xe4\xdb\x1b\x6e\xa3\xc8\xa0\x33\xbf\x7a\x02\xcc\xfc\x1b\x05\x2d\xb6\xf2\xfe\x31\x5e\x37\xfe\x46\x1f\x2b\xdb\x7b\xf4\xda\x73\x4e\xd9\x2d\x71\x0c\x10\xa0\xe4\x1b\x40\x70\xe6\x9b\x7e\x79\x88\xa3\x7a\xc6\xa4\xbb\x40\x54\xc2\x44\x4e\x15\xf7\x54\x7e\x1a\xa3\xdd\x98\xb0\xce\x5e\xcb\xfc\x64\xce\x8d\xfd\xec\xc4\xb7\x09\x35\xdf\x00\x82\x43\xdf\x52\x5c\x2c\xde\xbd\x31\xbc\xb0\xe9\x3a\x4f\x11\x80\x2d\x25\x6e\xff\x3c\x9e\xf0\x55\xfe\xc8\x86\x0d\x6b\x8e\x64\xaa\x94\xec\x49\x1a\x0c\x10\xa0\xe8\x1b\x40\x70\xea\x5b\xf1\x29\x24\xe2\x99\xfa\xec\xf2\xb8\xa1\x60\xfe\xfe\xbb\x06\x06\x5b\x7a\x2f\x0e\xbf\x0e\xdc\xff\xaf\xa7\x43\xc3\x72\xe4\x52\x02\xf1\x95\x41\xd5\x37\x80\xe0\xd8\x37\xa7\x2f\x21\x0e\x4e\xfd\x66\x9d\xd9\x19\x02\xe7\xb3\xb6\xad\x96\xd2\xea\x8b\xcb\xa2\xbe\x33\x3b\xac\xfc\x33\xe6\xe4\xf6\x11\xb8\x84\x01\x02\x94\x7d\x03\x08\xce\x7d\x13\x8d\xac\xff\xea\x6a\xf9\x6a\xb9\x3a\xa6\x39\xb3\x5d\xbc\x7e\x51\x32\x43\xde\xf4\x85\xaa\x7c\x4d\xce\x95\xc3\x7b\xc9\xb6\xd9\x4f\x60\x80\x00\x75\xdf\x00\x82\x83\xdf\xa2\x5e\x34\xf6\xee\x3c\x7f\x58\xd2\x41\x3e\xe8\xcd\x3b\xf0\x2e\x30\x3c\x3c\xf6\xd3\xf5\xcb\x79\x6d\xaf\x93\xcb\x2c\xe4\xdb\xce\x92\x61\x80\x00\x85\xdf\x00\x82\x93\xdf\xba\x76\x62\x93\xd2\x6a\x34\xd6\x4f\x7d\x8f\x7e\x72\xd9\xb9\xe5\x49\x32\x99\x4b\x83\x19\x9b\xb2\xcb\x67\x31\xcd\xbb\x5b\x1e\x89\x2e\x18\x20\x40\xe5\x37\x80\xe0\xe8\x37\x81\x3f\x39\x5e\x87\xae\x7a\x3f\x7f\x2d\xf1\xec\xc6\xae\x64\xb2\x9c\x64\x00\xf7\xeb\x23\x7b\x05\xcf\xb9\x4f\x2e\x74\xf5\xc6\x9a\x12\x0f\x5a\x28\xfd\x06\x10\x9c\xfd\xb6\x47\xf6\xc3\xce\x1b\x6f\xb1\x57\x13\x52\x2d\xc7\x6d\xd6\xf8\x26\x6e\xee\xe4\x31\xcc\xbf\xb3\xd8\xea\xf4\x2a\x9b\xe8\xe0\xcc\x35\xc7\x00\x01\x6a\xbf\x01\x04\x87\xbf\x0d\xa6\x4a\x6a\x8e\x06\x7c\xb9\x5f\xe6\x6b\x6d\x47\x9b\xac\xf8\x5c\xc0\xb6\x5a\x95\x22\x4d\x9f\xb6\xf3\xdb\x3e\xcd\x1e\x9d\x0d\x47\x0c\x10\xa0\xf8\x1b\x40\x70\xfa\x5b\xdd\x40\xef\xe2\x9f\x12\x6d\xf1\x37\x87\xce\xbb\x90\xad\x86\x7f\xb3\x44\x92\x39\x8c\x62\x25\x3a\x33\xc2\x6d\x72\xd9\xb6\x92\xf5\x31\x40\x80\xea\x6f\x00\xc1\xf1\x6f\x97\x23\xe2\xbb\xeb\x0b\xbc\x94\x6a\x5d\xae\x66\xd6\x2d\xed\x29\xee\xcc\xea\xd2\xb6\x48\x8c\x51\x2e\xdc\xff\xe0\xec\xde\x00\xfa\xd3\x18\x20\x40\xf9\x37\x80\xe0\xfc\xb7\x11\x87\x6f\x6a\x91\xda\x19\x0b\x7b\x36\xd2\x94\xa7\x18\xf3\x95\xaa\x7d\xef\xb8\x3e\x29\x6d\x5f\xb5\xa6\xb7\x62\xaa\xa4\x14\x32\xc4\x00\x01\xea\xbf\x01\x04\x07\xc0\xb5\x32\x6e\x4a\x2d\x9b\xa9\xdb\xbf\xd2\x4c\xd9\x3b\x5c\x23\xc0\x99\xc5\x6d\x3d\xb7\xbc\xaf\xcd\x62\xe1\x97\x2f\xd2\xd1\x39\x24\x86\x01\x02\x14\x80\x03\x08\x4e\x80\xeb\x48\x0a\x46\x28\xbe\x16\xff\xf2\x1e\xb8\x79\x7b\xc3\x57\xe8\xa8\x5c\x99\x03\x93\x67\xb7\x7d\x52\x95\xd3\xe9\xb5\xd1\x20\x3d\x01\x0c\x10\xa0\x02\x1c\x40\x70\x04\xdc\xfa\xf1\x97\xe2\x6b\x81\xa5\xcd\xe5\x39\xef\x35\xf2\x63\xeb\x7f\x38\x33\x2c\x34\xac\x75\x7e\xb0\xb1\x7d\x70\x6e\x5f\xdd\xd5\x17\x16\x18\x20\x40\x09\x38\x80\xe0\x0c\xb8\xeb\x27\xe7\xbb\xb4\xea\x0f\x05\x1f\x94\xce\x65\x7f\xab\xa8\xc5\x46\x23\x13\xfd\x55\x77\x27\xe8\xf5\xa1\x2d\x93\x65\x9f\xc9\xbb\x1c\x18\x20\x40\x0d\x38\x80\xe0\x10\x38\xe3\xaa\x32\x67\x29\x8e\xca\x0a\x3d\x16\xe0\x1f\x5b\x35\xe7\x4e\xf5\xf9\xfd\xf9\xae\x13\x5a\xe1\x21\x69\x72\xc6\xab\x47\x3c\x24\x31\x40\x80\x22\x70\x00\xc1\x29\x70\xd7\xd2\x2f\x98\x01\x2e\x85\x0b\xa1\x8f\x33\x4e\x77\xf4\xeb\x29\x19\xeb\x83\xf2\x64\xc3\x8f\xc2\xdb\x95\xcc\x89\x4b\x99\x0b\x08\x06\x08\x50\x05\x0e\x20\x38\x06\xae\xf4\xbc\x2d\x13\xcb\xc4\xe1\x5c\xf5\x2e\xb4\xe8\xde\x81\xcd\xdd\xfe\xfc\x4c\x85\xbb\x20\x2b\x69\xa6\x50\xe7\xdc\x6c\xa8\x15\x71\xd6\x80\x32\x70\x00\xc1\x39\x70\x34\x86\x1f\x1a\x45\x2e\x28\x33\x77\xc6\xf3\x9f\xe6\x5f\xdc\xae\x5c\x28\x2e\xd9\x4d\x72\x7c\x56\x7f\x39\xd7\xd8\x9c\x66\xfb\xfc\x01\x0c\x10\x60\x0e\xdc\xff\x0d\x74\xff\xf5\x2f\x53\xff\x77\xa0\xc3\x41\x70\x95\x67\xca\xa6\xcf\xdb\x9e\xfd\x21\xba\x3f\xfd\x68\x52\x6b\x8e\xc4\x0f\x71\x07\x15\xfa\xe1\xae\xcf\xca\x51\xf1\x33\xcf\xd2\x87\x55\x30\x40\x80\x42\x70\x00\xc1\x49\x70\xbd\xa7\xc9\x7d\x7b\x1f\x1c\x0b\xb2\xa5\x60\x6a\x17\xf1\x48\xbf\x3e\x3f\xb0\x76\x66\xe7\x06\x35\x63\xf2\xcf\xc4\x86\xf4\x8b\xc1\xae\x18\x20\x40\x25\x38\x80\xe0\x28\xb8\xde\xcb\xb6\xaf\x3d\x32\x6a\x58\xd5\xcc\x68\x08\x0f\xa4\x5e\x0e\x0a\x27\x90\xc9\x4d\x4b\x07\x8c\x7a\x19\xd6\x4c\x84\x32\x9f\x33\xc1\x00\x01\x4a\xc1\x01\x04\x67\xc1\x4d\x7b\x24\x2f\x5d\xa5\xfb\xa1\x50\x2b\xfa\xb0\x53\xca\x27\xa4\x26\xb1\x33\xfd\x45\xa3\x6c\xb4\x0c\x65\xb9\xf7\xca\xd6\x0b\x1f\x80\x01\x02\xd4\x82\x03\x08\x0e\x83\x1b\x5e\x95\xbc\x95\xa7\x34\x24\xd3\xe5\xf8\xf5\xa3\x47\x6c\xda\x15\xa6\xa2\xc7\x25\x6a\xb9\x89\x09\x7b\xba\xe7\x63\x2f\x9d\xd8\x22\x2e\xcd\x50\x0c\x0e\x20\x38\x0d\x4e\xd4\xba\xd3\x65\x52\x60\xd6\x3a\x2c\xb3\x47\x94\x49\x88\xeb\x5e\x8a\x54\x71\xd9\x69\x17\xbf\x8c\xc5\x00\x1b\x33\x25\x95\x26\x2e\x0c\x10\xa0\x1a\x1c\x40\x70\x1c\x1c\xf5\xf9\xba\xdd\x85\xc1\xf1\x8d\x9d\xb7\x62\x0a\x11\xee\x51\xc9\x5b\x5d\xe9\xaf\xb6\x37\x58\x40\x69\x1d\x27\xab\xc5\xfb\x7a\x29\x0c\x10\xa0\x1c\x1c\x40\x70\x1e\xdc\xf8\x5f\xf0\x4d\x7e\xe0\xb4\xcc\x83\xa7\x5e\x92\xce\x86\x49\x47\x82\xaa\x4c\xc8\x7c\xfd\xc7\x0e\xbd\xe3\xbd\xa9\x24\xe1\x18\x40\x89\x01\x02\xd4\x83\x03\x08\x0e\x84\x73\x15\xb8\x2d\xdb\x74\xa1\x67\x58\xc4\x29\xe7\x4f\xcf\xb9\xb4\x30\xa1\xe5\x0f\xde\x49\x3a\x8d\x2f\xe4\x6a\xd1\xfc\x3f\x01\xbd\xc4\xa3\x1c\x0a\xc2\x01\x04\x27\xc2\x1d\xf2\x57\xfd\x5c\x40\x5f\x48\xde\x6a\x8e\xb6\xa8\x98\xae\xf8\xcc\xb7\xf5\x77\x1e\x0f\xff\x18\x11\x37\x14\x3f\x3d\x7e\xdb\x93\x1f\x03\x04\xa8\x08\x07\x10\x1c\x09\xd7\x51\xd6\x98\x39\x24\xb0\x5b\xa6\xc3\xbc\xaf\x45\x8a\x2f\xb0\x3e\xe4\xa3\xa6\x7a\x6e\xc1\xa2\x30\xa1\xe4\xe2\xf5\x91\x83\x31\xd7\x31\x40\x80\x92\x70\x00\xc1\x99\x70\xde\xbd\xf1\x92\x7b\x25\x96\x63\x7b\x75\x8b\x55\x3f\xae\x65\xd4\xf0\xfe\x18\xe9\x48\x2a\x18\xcc\xd2\x71\xa3\xec\x72\x0b\x90\xdb\x87\x01\x02\xd4\x84\x03\x08\x0e\x85\xbb\xcf\x1c\xc6\xc3\xd3\xf6\xea\x69\xf1\xa1\xec\xd6\x5d\xa1\xce\xc9\x1c\x6e\xa1\xe7\xfc\xa5\x8c\x0e\x77\xa5\x5a\x85\xf2\x6c\x72\x19\x31\x40\x80\xa2\x70\x00\xc1\xa9\x70\x35\x96\x61\xc7\x15\xa9\x6c\xfa\x77\xc3\x4e\xf6\x18\x1d\xf9\xf4\xe9\x96\x3b\xa1\xf0\xfb\xf4\x07\xe5\xd8\x55\x87\x8f\xd9\x9e\x5f\x29\x30\x40\x80\xaa\x70\x00\xc1\xb1\x70\xcf\xf7\x8c\x5a\x16\xfb\x3c\x2b\x7c\x5d\xdc\x7c\xa0\xd6\xd7\xd9\xdb\x72\x4f\xdf\xe5\x86\xce\xe3\xaf\xce\xe5\x97\xea\xae\xfe\xfe\x4b\xbc\x36\x42\x59\x38\x80\xe0\x5c\xb8\xa3\x1a\x18\x97\xec\xdd\x97\x32\x2e\x8a\xcb\x47\x26\xcb\xc3\x64\x52\x3b\xae\x05\x36\x2c\x99\xef\x4b\xf1\x38\x5c\x12\x74\x5d\x8e\x38\x9c\x40\x5d\x38\x80\xe0\x60\x38\xa3\x11\x7b\x03\x2b\x6e\x15\x49\xcb\xdf\x47\x55\x1e\x9d\xe3\x1d\x52\x9a\x79\xa4\xc0\x1e\x45\xe6\x6d\xdc\xf4\x99\xbb\x4b\x5d\xf1\x08\x06\x08\x50\x18\x0e\x20\x38\x19\xee\x97\x4a\xe3\x81\xbe\x1c\x67\x33\xc2\xe2\xef\x2b\x25\x87\xc7\x4c\xcd\x92\xbf\x1f\xec\x38\x6b\xdf\xb1\x7f\xfe\xd7\xe6\x93\xa2\x52\xe2\x89\x0e\x95\xe1\x00\x82\xa3\xe1\x3c\x14\xd7\xa3\xd6\x75\x46\x42\xd5\x07\xaf\x67\xbd\x62\x72\xcd\x72\xe8\xb9\xce\x14\x3b\x99\xd4\x86\x39\x95\xb2\x5d\x4e\x9e\x55\xc4\x00\x01\x4a\xc3\x01\x04\x67\xc3\x5d\xae\x53\xf4\xd7\xbc\xb7\x87\xaf\xb5\x22\xac\x7a\x8e\xd9\x35\x76\xc6\x96\x5f\xe0\xd6\x54\xff\xa6\xeb\xdf\xb0\x5f\xcc\x89\xed\x9e\x18\x20\x40\x6d\x38\x80\xe0\x70\xb8\xc0\x1f\xd6\x6c\x36\x61\x05\x7e\x59\xd9\xc6\x62\xb1\x69\x79\x01\xb9\x73\x3a\x7d\xdf\x96\x36\x2f\x24\x7f\x56\xfe\xf9\xaf\x85\x49\x1a\x03\x04\x28\x0e\x07\x10\x9c\x0e\xb7\xce\x57\xd7\xa2\x7c\x27\x17\xe1\x99\xb2\xbf\xde\x11\x61\xee\x18\xdc\x68\x49\x5b\xab\x2f\xd4\xb5\x20\xb5\x4d\x77\x2c\xc8\x97\x38\x4f\x40\x75\x38\x80\xe0\x78\x38\x33\xcd\x3d\xbb\xaa\xa7\x2f\x2d\x59\xb2\x4c\x46\x5c\x19\x70\x25\x6c\xfd\x31\x3c\x6a\xf9\xcc\x5a\x61\x4e\x58\x40\x7d\xef\x0b\x3d\x1b\x0c\x10\xa0\x3c\x1c\x40\x70\x3e\x9c\xc5\x51\xbd\x0f\xb1\xbd\xab\x36\xff\xa4\x23\x6c\xc7\x9e\x7a\x1f\x30\x94\xac\x5d\xd3\xbd\x44\x45\xa7\x7b\xf6\xaa\xfb\x4a\x1d\xf5\x71\x0c\x10\xa0\x3e\x1c\x40\x70\x40\xdc\xd4\x1d\x11\x7b\xeb\x07\xa2\xaa\x56\x1d\xff\xae\xee\x0d\xb1\x4e\x0b\x5f\xa4\x97\xa2\xe6\x91\xaa\xba\xfd\xa3\x23\xed\x62\x16\x25\x0b\x06\x08\x50\x20\x0e\x20\x38\x21\x8e\x21\x20\x6d\xd7\x20\x62\x53\xf0\x4f\xbe\x93\xe8\x44\xbe\xec\xc0\x9d\x2a\xfe\xd8\x37\x8c\x23\x5f\x6a\xe7\xb2\x73\x94\xc0\x2e\x3b\x06\x08\x50\x21\x0e\x20\x38\x22\xee\x52\x4b\x45\xcc\xe3\x7f\xa5\xfb\x2a\xeb\xbb\x85\xa8\xc2\x13\x5b\xed\x73\xfd\x34\xf2\xf2\x77\x7b\x2b\xae\xf6\xcc\x31\x21\x43\xee\x18\x20\x40\x89\x38\x80\xe0\x8c\xb8\xe2\x44\x1b\x31\x46\xda\x11\x4a\x4d\xd5\x15\x5a\x8c\xbe\x29\xe3\xde\x97\xf6\xdd\xa9\x67\x69\x18\xbd\x0a\x9b\xa6\x75\xe5\x14\x71\x4b\x03\x35\xe2\x00\x82\x43\xe2\xa6\x53\xf6\xdb\x99\x51\xfa\x51\xa6\xac\x45\x45\x06\x86\xbf\x2e\xfa\xb4\xd1\xf5\x73\x77\x71\x84\x27\x90\x8b\xb2\x44\xf4\x47\x1b\x71\xd5\x80\x22\x71\x00\xc1\x29\x71\xbc\xb7\x4c\xdb\x4e\x65\x14\x3c\xfc\x94\xae\xd3\x74\xdb\xea\xec\x95\x66\xdf\x3d\x26\xfb\x8a\x6f\xd9\x07\x3e\x93\x28\x0f\x7e\xea\xc7\x8a\x01\x02\x54\x89\x03\x08\x8e\x89\x6b\x0a\x4a\x7d\x4a\xd9\xc1\xd5\x1c\x20\x73\xf2\x51\x98\x3f\x1f\x92\xfd\xb5\x86\xee\x92\xeb\xa5\x61\x9b\x1d\x09\xe3\x9e\xd3\x8f\x88\x87\x06\x94\x89\x03\x08\xce\x89\xf3\xd6\x3e\x96\x7a\x6b\xe3\xf6\x0d\xce\x16\xbb\x37\x1f\xb8\x7a\x68\x62\x4b\x7f\xa4\x47\x09\x49\xff\xf9\xc1\x22\x4c\x69\xa2\x7a\xc0\x1a\x03\x04\x98\x13\xf7\x7f\x03\xdd\x7f\xfd\x63\xfb\xff\x1d\xe8\x70\x50\xdc\xe7\x60\x61\x69\x1b\xf3\x3d\x25\x6e\xff\x96\x5d\x75\x5c\x45\x5a\x5f\xa7\xa5\x72\x64\x49\xf5\x7e\xea\xa3\xed\x73\x15\x30\xb0\xf1\xc0\x00\x01\x0a\xc5\x01\x04\x27\xc5\xb5\x8e\x8d\x7e\xf4\xd4\x76\x25\xaf\x56\x3f\xc9\x3b\xb5\xb2\xb2\x72\xf8\x4e\xde\xf4\x0f\x7e\xff\xa4\x3f\xb1\x61\x7d\x14\x21\xa6\x42\x18\x20\x40\xa5\x38\x80\xe0\xa8\xb8\x67\xc2\x7c\xdc\xe1\xc8\x6b\x69\xe5\xa9\xc6\x39\xef\xe8\x89\xcd\x7b\x98\xbb\xd2\xe5\x47\x06\x25\xef\xaf\xae\x3c\x4e\xed\xff\xac\x81\x01\x02\x94\x8a\x03\x08\xce\x8a\x7b\x11\x39\x1c\xcd\x91\xed\xb3\xe3\x28\x9c\xde\xa8\x7f\x40\xd8\xb0\xc6\x5a\xa3\x36\x90\xdf\xf3\xc4\x0e\xe0\x14\x5e\x2b\xf8\x42\x83\x01\x02\xd4\x8a\x03\x08\x0e\x8b\x73\x95\x96\xce\xdc\x67\xfd\x91\x9c\x57\x7b\xdc\x47\x49\x26\x45\xb4\xc8\x68\xbd\xac\xe8\xc0\x1d\xb7\x24\x91\xa7\x0d\xd1\xa2\x83\xc4\xd5\x14\x8a\xc5\x01\x04\xa7\xc5\x69\x7f\x98\xe5\x77\xd8\xef\xd4\xcc\x87\x56\x85\xa4\xd2\x31\xc6\xee\x96\x6a\x7b\x28\x1b\xff\x62\x9b\xfb\xe9\x3e\xfb\xf6\xf3\xa0\x28\x06\x08\x50\x2d\x0e\x20\x38\x2e\xce\xff\x6e\xf9\x69\xb3\x33\x43\x3e\x25\x09\x4c\xb4\xbc\xa8\x4e\x0a\x57\x72\x70\x94\xd4\xfb\x2f\x32\x81\xbb\x9e\xf4\xd7\x3f\x9f\xd4\xc5\x00\x01\xca\xc5\x01\x04\xe7\xc5\xbd\xcf\x93\xb2\x34\x61\xdd\xfb\xf6\xee\xf2\x33\xe7\xfd\x1e\xbf\x87\xd2\xfb\x6f\x79\xce\x50\xf9\x99\xa7\x8b\x9f\xd1\xe1\x78\xd7\x70\x18\x03\x04\xa8\x17\x07\x10\x1c\x18\xe7\xc2\x36\x49\x08\x67\xeb\x8b\x41\xc9\x73\x93\x3e\x65\xb3\xee\xd9\x51\x69\x51\xf8\xbe\x0c\x1a\xbc\x7e\x4a\x1e\xaf\x99\x9f\xd7\xc6\x00\x01\x0a\xc6\x01\x04\x27\xc6\x15\x90\xed\xda\x31\x3f\xb6\x8a\xef\xb5\x1d\xcb\xcc\xac\x76\x63\x5a\x0b\x60\x6f\xfc\x72\x4d\x64\xb2\x2a\x26\x78\xca\x2d\xf9\x2f\x1b\x06\x08\x50\x31\x0e\x20\x38\x32\xee\x5b\x5d\x57\x0a\xe5\x67\xf3\xdb\x72\x5a\x49\xb3\xea\x91\x0d\x98\x80\xed\xa4\x51\xf7\x53\x49\xb3\xfd\xaf\x24\xb9\xb9\xcf\x3f\xd4\xc2\x00\x01\x4a\xc6\x01\x04\x67\xc6\xfd\x11\x0e\xb6\xbb\xc7\x6a\x27\x52\x74\x47\x25\xfc\xe8\x9f\x90\xa6\xd7\x8b\xe7\xe3\x4e\x76\x2b\xa1\x12\x60\xe8\xdd\x8a\x7e\xf2\x55\x0c\x10\xa0\x66\x1c\x40\x70\x68\x5c\x5f\x34\xdf\xb1\xfb\x8b\xc7\x62\x1e\x88\xbe\x49\x2d\xcd\xe4\x3a\x61\x48\x4b\xde\x50\x52\x97\xa8\xe3\x3f\x1d\xf2\x8e\xfb\x3b\xcf\x09\x0c\x10\xa0\x68\x1c\x40\x70\x6a\xdc\xc6\x3f\xe6\x11\xb6\x7c\xf7\x37\x0f\xc3\x7e\x3c\xbc\xba\x18\xd7\xb4\xc2\x46\x3b\x91\x7f\x99\xb6\xff\xc7\xee\x72\x6b\xa2\x95\x2c\x71\xd6\x87\xaa\x71\x00\xc1\xb1\x71\x3f\x65\xab\x07\x53\x6f\xb3\x48\xbf\x7d\xe0\x64\x56\xff\x6d\x94\x32\x2d\x73\xe2\xb2\x11\x27\x53\xb8\xb0\x4f\x64\xfc\x64\x48\x32\x71\x04\x80\xb2\x71\x00\xc1\xb9\x71\x45\x31\x47\xef\x96\x9b\x0f\xbf\xfd\x64\x57\x35\x70\x50\xcc\xab\x60\x4c\xf5\xe2\x80\xd1\xf2\x5d\xb3\xf1\x04\x97\xe7\xfb\x52\xf8\xce\x61\x80\x00\x75\xe3\x00\x82\x83\xe3\x24\x7a\xed\x0e\x07\x1d\xf8\x77\xd0\xd2\xf2\x84\xb2\xfe\xe5\xae\x03\x6c\x52\x92\x32\x0a\xf5\xf2\x5d\x7e\xdd\x71\x7f\x17\x79\xc2\x89\xeb\x3c\x14\x8e\x03\x08\x4e\x8e\x7b\x68\x55\xdb\x94\x44\xdd\xd6\x5c\x93\x73\xdd\xb7\x21\xa5\xf9\xa1\xcd\x1d\xdd\x4b\x3b\x89\x34\xf6\xe6\x5e\xed\x1a\xcd\xf9\xf6\x9a\x18\x20\x40\xe5\x38\x80\xe0\xe8\xb8\x15\x85\x85\x4e\xb7\xcf\x27\x3e\x53\xf4\xfc\xe0\x5e\xbb\x5b\x11\xcc\x95\xa4\xa7\xe7\xe3\x45\xae\xf5\x86\x35\xa1\x2e\xbe\x22\xfd\x24\x06\x08\x50\x3a\x0e\x20\x38\x3b\xee\xb3\xe6\xed\x6c\x1b\xef\xf6\x57\x76\xdf\xbd\x4e\x35\xa5\x66\x27\x9d\x1c\x1b\xfa\x29\x2a\xdc\x2e\x79\x78\x71\x3c\xb8\xf2\xd5\x9c\x15\x06\x08\x50\x3b\x0e\x20\x38\x3c\xee\x6b\x7c\x7f\xc7\x11\x1e\xff\xad\x17\xa3\x0b\x3a\x4f\xa7\x54\xde\x37\x49\xb7\xbb\x30\x8d\x8e\x49\x4d\x5e\x62\x5c\x3b\x76\xd2\x8e\xb8\x71\x80\xe2\x71\x00\xc1\xe9\x71\xb6\xae\x5e\xcf\x6e\x89\xbf\x1c\x50\x8a\x7f\x7b\x55\x9a\xed\x7b\xe4\xcf\x99\xc0\x16\x97\x8f\x8e\x6e\xbb\xc7\x39\x4a\x84\x58\x7a\xe4\x30\x40\x80\xea\x71\x00\xc1\xf1\x71\xc2\xc5\x11\xc6\x5d\xb5\xc7\xf5\x4c\xef\xfc\x5b\x07\x4d\xec\x3f\xfa\x43\x4c\x87\xec\x41\x60\xf6\xcd\x2f\xe2\x41\xc1\x2a\x52\x6e\x18\x20\x40\xf9\x38\x80\xe0\xfc\xb8\x0b\xbe\x85\x14\x61\x1f\xea\x5f\x9a\x95\xf8\x52\x7b\x69\x50\xf4\x1f\x1c\x16\x96\x0d\xa2\xef\xac\xb8\xa9\x75\x87\xe9\xb6\x8c\xd8\x31\x0c\x10\xa0\x7e\x1c\x40\x70\x80\xdc\x84\xfc\x12\xed\xd6\x94\xde\x57\xca\x12\xf3\x9a\x10\x26\x6e\xa5\x92\xee\xb8\x78\xee\xd7\xbc\xbf\x85\x16\xa7\xd7\x6e\x19\x86\xa0\x18\x20\x40\x01\x39\x80\xe0\x04\x39\x33\xac\x53\xc4\x59\x59\x26\x73\xfa\x4a\xa2\x5f\xd3\x8d\xb0\x4f\xda\xb7\xbd\x35\x54\xc7\x6f\x3b\x1f\x8c\x38\xf2\xf3\xef\xa5\x19\x65\x0c\x10\xa0\x82\x1c\x40\x70\x84\x9c\xa2\x2f\x9f\xc3\x95\xc9\x24\xb9\x8c\xa8\xfb\x6b\xc7\xe3\x7a\x74\xe4\xca\xd2\x4f\x30\xbf\x98\xf9\x59\xe8\x1e\x22\x67\x11\x54\x25\x8f\x01\x02\x94\x90\x03\x08\xce\x90\xa3\xfa\x41\x2b\xfa\x5d\xe9\x4c\x51\x96\xd5\x35\x07\x97\x97\x4e\x7a\x63\x12\xbc\x40\x86\x3b\x44\xcc\xea\x6a\x85\x70\xad\xce\x5e\x35\x0c\x10\xa0\x86\x1c\x40\x70\x88\x1c\xf7\xa7\x4a\xbd\x9b\xb7\xc2\x38\xa6\x5c\xdd\x8d\x5e\x9d\xa7\xb6\xbc\x67\x87\xe8\x3c\x88\xbf\x74\x50\xad\x81\xab\xbc\x4e\x7a\x9b\xb8\x75\x86\x22\x72\x00\xc1\x29\x72\xae\xce\x2e\xe6\xd3\x12\x8d\xd1\x6a\x8d\x51\xb9\xcf\xb5\xbc\xb7\x6e\x88\x78\x05\x96\x52\x25\x20\xbf\x4f\x1f\x9b\xdc\xc3\x5c\x4d\x8e\x01\x02\x54\x91\x03\x08\x8e\x91\x8b\x30\x98\x59\xe7\x71\xd1\x6d\x4d\xa0\x60\x67\xa0\x09\x1c\x6e\x1b\x33\x19\xb8\xc9\xf8\xb3\x21\xcc\x4f\x20\xac\x4e\x5d\x46\x82\xb8\xa7\x84\x32\x72\x00\xc1\x39\x72\xbf\xaf\x4f\x37\xf8\xd8\xc7\x1a\xa6\x15\x6c\xdd\xcb\x52\xe4\x2f\xf2\x9f\x94\x4c\xac\xfc\x53\x76\x4c\xb6\x91\x3c\xf2\x8b\x44\xb5\x30\x06\x08\x30\x47\xee\xff\x06\x3a\xa4\xc4\xe7\x55\xc8\x0f\x01\xdd\xa1\xd6\xf7\xd1\x09\x2c\x91\x89\x9d\x77\x67\x3c\xde\x96\xbf\x7c\xe0\x72\x3e\x48\xea\x49\x79\x20\xc9\x57\xae\x38\x48\x6e\xe2\xb6\xad\xc5\x09\xc2\x77\x89\x29\xa5\xb7\xae\x5b\x8c\xac\x51\xc2\xc7\xcc\xb9\xa7\x2b\x8f\xff\x8d\x32\x8d\x68\xd4\x6c\xf1\x24\xae\xf3\x50\x48\x0e\x20\x38\x49\x4e\xd1\x41\xe8\xdb\x27\xae\x08\xfe\x5f\x81\xa3\x64\x0c\x34\x58\x1a\x0f\x55\xea\x73\x8f\xbf\x0c\x41\x89\x0a\x83\x16\x7d\x7f\x1d\xaf\x61\x80\x00\x95\xe4\x00\x82\xa3\xe4\xc8\x72\x51\x53\xb6\xa3\x4b\x9f\x4b\x0f\x52\x6b\xde\xdc\x57\xe8\xf3\x7e\xaf\x56\x3e\x47\xfa\xff\x8f\xb9\xbf\x8c\xaa\x6a\x6d\xff\xf7\x61\xba\x4b\x40\x4a\x09\x41\xa4\x1b\x69\x69\x04\x11\x94\x92\x0e\x69\x50\x1a\x09\x05\xe9\x12\x45\x40\xba\x95\x90\xee\x06\x09\x09\x29\x69\xa4\xbb\xbb\xa4\x11\x78\xc6\xbe\xef\x7b\xad\x2f\x7b\x82\xce\xfd\x7b\xfe\xbc\xd8\x63\xec\x97\xc7\x38\x17\xd7\xf2\xd8\x57\x7c\xe6\x35\xcf\xc5\x52\xfe\x24\x53\xad\xe5\x2e\x1d\xf9\x2d\x77\x62\xe4\xdf\xb6\x92\x23\x86\x05\xf4\x92\x93\x73\x19\xe3\x1e\xb1\x1c\xac\x24\xaa\x71\x36\xc2\x75\xb1\xf4\xb5\xbd\x35\x25\xf5\x53\x65\xd5\x6a\xb7\x87\x43\x1a\x3f\xfe\xc3\x5f\x67\xed\xdf\xf6\x92\x23\x86\x05\x34\x93\x63\x53\xf7\x62\x94\x9d\x5e\x14\x4a\x57\x21\xc0\x88\xb8\x85\x16\xa5\x49\x5a\xa4\x49\xa2\xdb\x9a\x43\xea\x02\x8b\xfa\x6e\x16\x5b\xcc\x9d\x18\xf9\xb7\xcd\xe4\x88\x61\x01\xdd\xe4\xb8\x18\x18\x28\xb0\x1e\x0f\xc0\x34\x34\xd8\x4f\x7e\x4c\xeb\x7a\x8e\xe4\x35\x3f\xf5\x91\xbd\x4d\x0e\xb1\x3d\x80\x30\x67\xc0\x4f\xdd\x9d\x18\xf9\xb7\xdd\xe4\x88\x61\x01\xed\xe4\x6e\x45\x17\x31\x87\x1f\xd1\x3f\x4b\x54\xef\x9e\xa0\xa6\x5a\xee\x5c\x88\x1f\x17\xec\xb6\x5f\x0e\x42\xb7\xef\x6a\x83\x8f\xe1\x83\x71\x27\x46\xfe\x6d\x3b\x39\x62\x58\x40\x3f\xb9\x8f\x41\xfa\xb1\x3f\x1a\x17\x34\xf7\x31\x1f\x18\x21\x39\xba\x14\xe2\xf5\x95\xb5\x3c\xea\xc2\xf7\x23\xb6\x3d\xe4\xc0\xf6\xfb\xf6\xd7\x42\xfb\xdb\x7e\x72\xc4\xb0\x80\x86\x72\xce\xf1\x22\x45\x74\x9d\xb7\x05\x8f\x52\xc2\x5a\x23\x32\x05\x34\x19\x3e\x0e\xf9\xa5\xbd\x90\xd8\x87\x57\xe6\x72\x0d\xc0\x71\xfe\x6b\xaf\xff\xdb\x86\x72\xc4\xb0\x80\x8e\x72\xb9\xf3\xa8\x21\xa3\x99\xb9\xe3\x91\x95\x2a\xd1\x22\x2a\x58\xb1\x0c\xed\x88\x3f\x68\x6f\xb8\x97\x3e\xf6\xeb\x6a\x90\x27\x53\x83\x77\x27\x46\xfe\x6d\x47\x39\x62\x58\x40\x4b\xb9\x1f\xd7\xf8\x43\xa4\x22\x0d\xe2\xee\x2f\x8e\x2b\x9c\xb1\x65\x8a\x8c\x64\xb4\x1d\x65\xc8\xf5\x22\xa5\xfe\x7a\xba\xa0\x6c\x90\xc5\xe1\x4e\x8c\xfc\xdb\x96\x72\xc4\xb0\x80\x9e\x72\xf8\x8f\x6b\xec\x8a\xab\x14\xc5\x3b\xbf\xb2\xb1\x17\xdc\xb9\x33\xe5\xf8\x21\xf7\xa9\xcb\xfe\x16\x45\xd8\x5e\x6c\x02\xd2\x3e\x83\xaa\x3b\x31\xf2\x6f\x7b\xca\x11\xc3\x02\x9a\xca\xbd\x6c\x2a\xd7\x34\x1e\x97\x24\x3f\xa9\x1f\xe0\x91\xb4\x09\x4f\xc9\x8e\x89\x7b\x2e\x82\x73\xb0\xa5\x23\xfe\x6a\x74\x88\x02\x95\xd9\x9d\x18\xf9\xb7\x4d\xe5\x88\x61\x01\x5d\xe5\x62\xa7\xc6\xb5\x1d\xaa\xee\x6d\x7a\x10\xbf\x9a\xab\x0d\xcb\xc6\xe4\x16\xcc\x9f\x1c\x5a\x7a\x33\xff\x10\x2b\x70\x70\x1c\xf5\x98\xc9\x9d\x18\xf9\xb7\x5d\xe5\x88\x61\x01\x6d\xe5\xf4\x85\xc9\xa8\x3e\xa8\x2a\xc6\x67\xd6\xa0\xde\xec\x08\xd6\xa6\xbd\xc7\x33\x9b\x49\xbe\x2c\x9c\x6d\x22\x37\x88\x15\x5f\xaf\xfa\xd7\x59\xfb\xb7\x6d\xe5\x88\x61\x01\x7d\xe5\x76\xaa\xbf\xe3\xdf\x1b\x79\xe2\x83\x6b\x19\x5f\x3b\xfc\xda\x76\xfc\x8d\x4e\xab\x47\x13\xc7\x5a\xe8\x56\xb0\xbd\xd6\xeb\x3d\x64\x2e\x77\x62\xe4\xdf\xf6\x95\x23\x86\x05\x34\x96\x6b\xfe\x36\x46\xc0\x3f\x14\xe9\xaa\xe9\xb2\xcb\x89\x6f\xe5\x81\x93\xf8\x22\xf6\x88\xee\xc0\xf9\x6d\x0e\xa7\xa9\x01\xdd\x64\xe6\x5f\x47\x9a\xdf\x36\x96\x23\x86\x05\x74\x96\x13\x6a\xf1\xbf\xbb\x8d\xd0\xff\x36\x2e\x1d\xf1\xc8\xb7\x4b\x74\xa7\x7a\xd0\xdb\x80\xc2\xcc\xfa\xb4\x7c\x86\xea\x70\xfd\x97\xcb\x5f\x87\xad\xdf\x76\x96\x23\x86\x05\xb4\x96\x23\x31\x94\xba\x4d\xb9\x67\x89\x2d\x45\xd6\xa5\xb7\xf2\xf6\x9e\xc2\xf0\x03\x76\x31\xf2\xb6\x23\x67\x45\x7f\x2b\x3d\x21\xaa\xa9\xbf\xd4\xf8\x6d\x6b\x39\x62\x58\x40\x6f\x39\x7d\x83\xcd\x9e\xcc\x88\xe4\x57\xeb\x19\xcb\x65\x82\x6e\xb7\xef\x3c\x9a\xd6\x9d\x5c\xf3\x8a\x52\x92\x2f\xa8\x81\xc5\xf5\x71\x96\x73\x27\x46\xfe\x6d\x6f\x39\x62\x58\x40\x73\xb9\x4a\x92\xed\xb7\xca\x8a\x66\xd5\x8f\xe8\x56\xc9\xb6\x92\x26\xb9\x70\x12\x52\x99\xd6\x4d\x1e\x68\xf0\xf6\x07\xdb\x45\xd4\xb0\x73\xbb\x13\x23\xff\xb6\xb9\x1c\x31\x2c\xa0\xbb\x9c\x44\xa9\x13\x07\x85\xe1\x68\xc0\xb5\x78\xca\x9a\x1d\x6c\x4f\xb5\x42\x85\x69\x46\x78\xa2\x3a\xed\xe5\xdc\xe0\xb8\xe1\x36\x42\x32\x77\x62\xe4\xdf\x76\x97\x23\x86\x05\xb4\x97\x93\xad\xba\xa6\x38\x12\xfb\xed\xe3\xc3\xb2\xa2\x40\xea\x0c\xdc\x94\xe2\xf1\x6a\xdf\x09\x92\x0f\x98\x28\x61\x41\x37\xa4\x7b\x85\x31\xdc\x89\x91\x7f\xdb\x5e\x8e\x18\x16\xd0\x5f\x0e\x49\xa8\xf3\xa7\xcb\x12\xcb\x2d\x83\x5a\xf8\xe6\x0a\xf6\x9e\x67\x1b\x22\xa1\xad\xd1\xc7\x15\x5f\x3a\x05\x86\x15\xee\x77\x9b\x5b\xbb\x13\x23\xff\xb6\xbf\x1c\x31\x2c\xa0\xc1\x9c\x7d\x57\xf9\xa1\x09\xaa\xa0\x45\xe0\x9b\x83\xc8\xd0\xee\x79\x52\x1f\x3f\xdc\x50\x11\x23\x7f\x65\xcf\xa3\x1c\xc6\x63\x1c\xca\xbf\xbe\xb3\xdf\x36\x98\x23\x86\x05\x74\x98\x73\xc6\x37\xff\x52\x71\x64\x6e\x75\xcb\xb7\x93\xf0\x5a\x7b\x2b\xb5\x75\x70\xed\xfc\x29\x2f\x76\x4e\x4e\x41\xce\xbb\x5d\x53\xf9\xbf\xce\x47\xbf\xed\x30\x47\x0c\x0b\x68\x31\xa7\x9d\xd0\x89\x02\xef\x9e\x35\x10\xbe\x85\x6d\x40\xe7\x8c\xb4\x18\x81\xfd\x1c\xb7\x1f\x49\x0a\xeb\x59\x28\x42\x01\xac\xbd\xe4\x5f\xab\xd3\x6f\x5b\xcc\x11\xc3\x02\x7a\xcc\x85\x9e\xb5\x13\xba\x51\xde\xa7\xe1\x0c\x1a\x4e\x77\x9e\x27\xdf\x93\x2a\x90\xfd\x29\xdb\x68\xc7\xe5\x7d\xec\x10\x97\x48\x85\xf8\xd7\x5f\xf6\xdb\x1e\x73\xc4\xb0\x80\x26\x73\x8e\x96\x0b\xad\x14\x19\x04\xe8\x3a\xd4\xd8\x4b\xb1\xf9\x5f\xfa\x5f\x98\xc7\x47\x90\x12\x4f\xfd\xb0\x64\x58\xf5\x7d\xac\x8a\xf6\xd7\xc1\xe1\xb7\x4d\xe6\x88\x61\x01\x5d\xe6\xac\xb9\xa8\x48\x3f\x21\xda\xa9\x86\x05\x1a\xce\x5a\xe0\x7c\x3b\x7d\x6e\x81\xe5\xc4\x4a\x63\x54\x8e\x46\x1d\xac\x91\xa6\x90\x03\xeb\x4e\x8c\xfc\xdb\x2e\x73\xc4\xb0\x80\x36\x73\xae\x1a\xfd\x5b\x0c\xfe\x6f\xc6\xd6\xb7\xad\xdf\xd7\x66\x25\xe2\xa3\xf5\xaf\xa2\x7e\xae\x98\x2d\x6a\xfb\x0e\x63\x5a\x1f\x00\xf7\xd7\x8e\xfa\xb7\x6d\xe6\x88\x61\x01\x7d\xe6\x44\x33\x13\x16\x1c\x52\x06\x92\xcf\x4e\xaf\x05\x88\x47\x3f\xa7\xd9\xb4\x12\x68\xe4\x71\x0c\xd1\x6c\xf5\xac\x43\x53\xaf\x1b\x65\x75\x27\x46\xfe\x5d\x9f\xb9\x72\x9c\xff\x6e\xe8\x7e\x69\x0c\x28\xa7\x36\xbd\x99\x6e\xc0\x9d\x19\xae\x38\xb9\x6b\x1e\xc5\x5d\x2b\xa2\x84\xd3\xfe\xd2\xab\xe5\x99\x95\x33\xfb\x77\x0b\xf7\x48\xd6\x41\x7a\x55\x1a\x98\xff\xd2\x7a\x45\x98\x29\x2e\x53\xd5\x25\xc8\x38\x71\x27\x88\x03\x68\x01\x33\xcd\x4b\xc6\x3a\x71\x93\x6d\xee\x85\x83\x5a\xfe\xc4\xcc\xc9\xe7\xd0\x9e\x8c\x4e\x79\xf6\xb5\x80\x9b\x2a\x12\xc8\x2f\xfb\xa8\xc6\x5c\xef\x10\x8d\xcb\xda\xe6\xf6\x04\x26\x5a\x27\x27\x8e\x69\xb5\x8e\x9d\x43\x25\x35\x75\x29\x6e\x30\x24\x77\x05\x67\x15\x08\x3a\xdb\x59\x29\x67\x5c\x7f\xb9\xc6\x46\xa9\x56\x8f\x8e\xe0\xec\x17\xf6\xf4\x1b\xea\x39\x54\xe0\x80\x0f\xe3\xce\x57\xff\x1c\x3d\xf9\x82\x49\x95\x80\xed\x75\x1f\x8f\x4f\xd4\xbe\xba\x88\xad\xce\x52\x8f\xe0\x6b\x3f\x5a\x2b\x9d\x43\xe7\x6d\x4d\x88\xba\x1a\x9c\x85\xd6\x2b\x56\x77\xe1\xb7\x9c\x16\xa5\xf1\x4a\xb8\x34\x9f\x27\x8c\xd6\xf5\x71\xad\x76\x45\x24\x3a\x9d\x43\xa3\xb2\xd7\xb2\x28\x3d\xc4\x31\x73\xbf\xfd\xa4\x7a\xbe\x55\x81\x4a\x8e\x6b\x97\xd9\x8f\x39\xd4\xf6\x6d\x32\xf1\xa7\x7d\xe6\x20\xd2\x39\x74\xdd\x58\xf1\x7a\xfa\xf7\x4a\xdd\x7b\x2d\x62\xfd\x4a\x7b\x3b\x65\x5a\x0c\x2c\xa9\xb1\x29\x07\x65\xc8\x29\xe9\xfb\x53\x4d\x34\xd1\xff\xff\xa1\xd8\x1b\x5a\x8d\x4f\xf0\x42\xb6\xc8\xbd\x16\x2c\x14\xef\x2c\x93\x1a\x44\xf2\xab\x50\xb5\x51\x63\xdc\x5d\x3f\xe2\x3e\xb8\xe7\xff\xf1\x1c\x8a\xe4\x7f\x43\x5b\x8b\x8b\x3f\x22\x30\xfb\x4d\xae\x45\xb2\x50\xd5\x37\xf3\xe9\xcf\x4f\x49\xa4\x54\xf8\xb0\x4d\x86\x73\x84\x19\x69\xce\xa1\xf1\x47\xef\x4c\x87\xbc\x8a\xbe\x71\xf3\x9f\x3c\x31\xe7\x08\x9b\x46\x51\x75\xad\xc3\x3b\x7a\x49\xd0\x84\xc1\x33\xde\x68\x61\x61\x72\x0e\x8d\x3b\xdd\xf1\xb5\x6f\xf3\xc4\xa7\xe8\x16\x47\x7b\x8f\x37\x2a\x29\xdc\x4d\x99\xd8\xfe\x8d\x83\xdc\x7d\xad\x4c\x3d\xf6\xc6\x51\xd7\x39\x54\x5b\x45\xaa\xb5\x3b\xa5\x81\x52\x62\xbd\xa3\x95\x8c\x5d\x96\xa4\x39\xd6\x4f\xb0\x22\xff\xfb\xd3\xc8\x2e\x8d\x90\x7b\x3a\x0f\x0b\xce\xa1\x23\x19\xe3\x54\x5a\x23\x35\x39\x12\xc2\x47\x1d\xdd\x1c\x24\xc2\x2b\x55\x49\xfd\x53\x46\x83\xf9\xaf\xca\x45\x70\xe2\xb2\xf1\xc7\xcf\xa1\x1f\xb9\xd3\x87\x48\x1f\xf3\x05\x37\xe3\xa4\x54\x57\x25\x89\x8e\x3e\xce\xb7\x77\x2d\x7b\x25\xc0\xf5\xb8\xf9\x1a\x6a\xb5\xe3\xda\xf9\x2f\x4b\xcb\x4e\x44\x62\xee\x41\x73\x15\x51\x49\xd6\xfd\x9b\xe2\xd6\x79\x77\x1d\xab\xba\xa5\x37\x98\xe9\x39\xd1\x11\x1e\x30\x46\x3b\xde\x3f\x87\x4e\x86\xee\xfa\x7d\xf8\xfa\x94\x9f\x3e\x21\xb2\x93\xfe\x70\x01\x8d\xcf\xaf\xac\x7f\xa1\xe8\xfb\x51\x16\x5c\xa9\x9f\x2a\xc1\xba\xe1\x39\x14\xe3\x15\x81\x3f\xd1\x9a\x53\x4a\xd7\x77\xf9\x98\x09\x81\x89\xe6\x92\xa9\x83\x25\x2b\x6d\xf5\x52\x5b\x81\x45\xef\x59\xa9\xee\x4f\xe7\x50\xb8\x27\xa6\xc9\xe9\x7b\x55\x28\xcd\x94\x1f\xed\x27\x54\x99\xd5\x42\xd3\xde\x63\x33\x1b\xa3\xe4\xc8\xaf\xa8\xe1\xfc\xaa\xd1\x55\x3d\x87\xbe\x7c\x78\x3c\x3b\x6f\xd9\xd0\x2c\x11\xd9\x9b\x5e\xe3\xe3\x87\xe5\xaa\xcb\x30\xd5\x71\x8d\x77\xac\x48\xff\x29\xe2\x60\x8f\xbc\xcb\x39\x94\x99\xe3\x13\xe3\x57\xf6\x34\x1c\x0b\x15\x4e\x0b\xc1\x48\xb7\x61\x35\x1b\x1e\x97\x0d\xe6\xae\x09\xc7\x52\x95\x6a\x77\xe1\xa7\xc4\xe7\xd0\x4f\xf8\x2f\xa8\x15\x14\x25\x9e\xeb\x61\xf2\x20\x2a\x2d\x76\x3d\x7e\x48\xb2\x87\x4b\xfc\xe8\x08\x55\xc0\xde\x1f\xd9\xf9\xee\xd7\xf3\xbe\x9a\xc4\xcc\xab\x3f\xd1\x84\xcd\x3c\xfb\xdc\xad\xaa\xba\x14\x25\x00\x23\xc6\x6e\x99\x81\xf6\xb5\x71\xcd\x14\xe1\xda\xc2\xf2\xd1\xca\x39\xf4\xf9\xd4\xf4\x7b\xf4\x2a\xaa\x67\xdb\x1d\x44\xd7\x2a\xab\xf5\xf6\xe1\x29\x61\xa8\xc7\xee\xf1\x4a\x24\x27\x06\x6a\x8f\xf3\xb2\xc8\x9f\x43\xe1\x0b\x32\xbf\x2e\x27\x73\x9a\x27\x71\xbd\x0f\x81\x4d\x27\x23\xea\xbb\x99\x3b\xf0\x60\x02\xae\x91\xa3\xe5\x81\x07\x49\xa4\xf7\xfc\x39\x14\x56\xbb\x34\x28\xc8\x97\xdf\x97\x68\x56\xb9\x81\x27\xee\x93\xb6\xf8\x10\x52\x1f\x63\x4d\x62\x43\xc0\x2f\x47\xf2\xd6\x2f\xdc\x64\xe7\xd0\xde\xc6\x43\x56\x72\x8c\xfe\x4c\xa1\x37\x74\x69\xf7\x70\x63\xdf\xb0\x2d\xb6\x2e\x8a\xf9\x89\x32\x86\x52\x49\x23\x58\x70\x36\x8e\x9c\xff\x87\x1d\xa5\xd9\xfa\x2c\x69\x5f\xc6\xd9\x4e\xc9\x41\x10\xa4\x7f\x88\x5d\x70\x2f\x3c\xd3\xb0\xd9\x8f\x34\xa1\x4e\x5c\x0a\xe9\xb6\xc3\x39\x34\x0b\x8d\x56\x3d\x8d\x01\x26\x2f\x69\xe8\x03\xbd\xf7\xd4\x47\x54\x67\x7a\xa6\xb4\x26\xae\xa9\x3b\x51\x2e\xbd\xbb\xea\xd7\xee\x59\x9f\x9f\x88\xbe\xad\x38\x18\x6e\x33\xeb\xda\x2d\x05\xb7\xfc\x62\xaf\xb6\x31\x41\xc3\xba\x23\x50\x27\xe7\x61\xfc\xe5\x49\xbd\x16\x5a\xaf\xe9\x39\x74\x8a\xd5\x8d\x74\xa9\x48\x28\xf4\xda\x3e\xde\xd6\x5b\x46\xb9\xcf\xe9\x45\x19\x8f\x0f\x47\xe4\x0b\x36\xcb\x97\x67\xc7\x55\x84\xf4\xcf\xa1\x73\x3a\x0f\xdd\x9f\x71\xf3\xb0\x1c\x2b\x5c\xef\xa3\x47\x7d\xc8\xee\x09\xdf\x6d\x98\xae\xb1\x10\x70\x53\x32\xfe\x61\xb3\x44\xcd\xfb\xf3\x6a\xdf\xf1\xe3\x43\xb1\x9a\xed\xb7\x0c\x8d\x10\xc0\xb5\xb9\x3d\x3b\xed\x35\x6c\x54\x52\xff\xd0\x4c\x2f\x78\x2f\xe8\x1b\xf9\x21\xc7\x39\x34\x56\x4c\x20\xd2\x5a\xd9\xeb\xc7\x91\x32\xbd\x7e\x12\xfb\x41\x04\xbf\x6d\xb2\xb7\x7e\x3c\x3c\xdb\x4c\x60\xfc\x8e\x14\x2b\xc5\xde\x39\xb4\x18\xbe\xba\xf3\xa6\xbc\xa7\x04\x52\xeb\xc7\xf2\xae\x86\xaa\x83\x60\xb8\xfe\xc1\xbd\x85\xb5\x45\xf8\xa1\xb7\x87\xb5\x4f\x4d\x7f\x9e\x43\x67\x2c\x94\x5d\x10\xeb\x86\xb2\x97\xb1\xa5\x36\xa4\x10\x0e\xdb\xcd\x3c\xd6\x2b\x17\x7b\xd7\x4c\x2a\x16\x6c\x0c\x0c\xb7\x3d\xce\xa3\x35\x6b\x05\x06\x51\x1a\xe6\xd6\xb8\x9f\xe9\xe9\x1d\x27\x18\x0b\x57\xd7\xc9\x2b\xa6\x08\x3e\xa5\x7b\x7d\xef\xa1\x99\x9f\x52\xf2\x39\x87\x22\x17\x04\xf3\xe7\xe9\x25\xd0\x0d\x0c\x21\xbc\x2d\xfa\x2a\xbc\x3f\xd4\x95\x16\x68\xd2\x09\x57\xe3\x44\x85\xb8\xe5\x42\xa5\xf8\xe8\x1c\xaa\x7a\xa7\x21\xf4\x10\xe9\xf6\xaf\xf4\xb2\x69\xd1\x18\x72\x41\x96\x80\x43\x5b\x0b\xf9\xbb\x9b\x5f\x3c\xe5\xf3\x72\x83\x54\x1c\xcf\xcf\x59\x05\x87\x6f\x18\x84\x45\x5d\xe2\xb6\xda\x5a\xb6\x0e\x6f\x67\x20\x8e\xdf\x94\x7f\x79\xd6\xc2\x74\xfb\x97\xfd\x76\x60\x52\x00\x01\xfd\x39\x54\x45\xd9\xaa\xcd\xc1\x64\xcb\x41\x63\x86\x3c\x23\x5b\xaf\xb8\x9d\x80\xd1\xd1\x42\xe3\xfb\x20\x65\x41\xf5\x27\x56\x8b\xe0\x90\xf3\xb3\x0b\xf1\xbb\x33\xa5\x25\xe6\x38\x71\x58\x24\xce\x5c\xf9\x88\xd4\xe2\xec\xde\x5d\x65\xea\xd7\x4b\xe3\x42\xa6\x5d\x76\x46\x4f\xd2\xbf\x9d\x43\xd5\x9d\xb3\x79\x8d\xd9\x13\x1c\xc8\x25\xd2\x2d\x47\x76\x82\x12\x25\x9e\xfb\x0c\xcb\xf8\x8b\x8a\xbe\xaf\x21\x19\xf3\x35\xe3\x95\x38\x87\xda\x11\x6f\xe6\x7a\x77\x08\x22\xad\xbf\x63\x0e\xf6\x27\x47\xb2\x3f\x4a\x78\xae\x5c\xab\x88\x6e\x5d\xde\xb7\x8b\x99\x1b\x62\x22\x72\x0e\xd5\xd0\xc1\xbc\xf1\xe2\x25\xaf\x7d\xb9\xe0\x80\x7f\xfa\x92\x42\x74\x8a\xb2\xc4\xb7\x20\xdb\x94\x7a\x51\x61\x93\x0f\xb2\xdb\x2a\x1f\xce\xa1\x21\xd6\x91\x86\x9e\xa1\x18\x31\x47\x0c\x6e\xfa\x78\xd1\x9c\x44\x54\x89\x1f\xef\xe6\x51\x12\xcf\x62\xd2\xd1\x4c\xc6\xcc\x4c\xe4\x9d\x43\x1f\x21\xb4\x7d\x6b\xc9\xf3\x65\xd2\x8a\xcd\xad\x4d\xf6\x8f\xee\x24\x0b\xdd\xab\x15\x46\x95\x7e\x4f\x3b\xcf\x8d\xc0\x5f\x64\x17\x78\x0e\xf5\x9c\xbb\xc7\x45\xd4\xaf\x25\xc3\x28\x96\x3e\xf5\xf5\x83\x68\x66\xe1\xd8\xf6\x81\x06\xb5\xa1\xc8\xfc\xfb\xe0\x05\xc2\xe6\xd7\x0b\xde\x70\xff\x6c\x33\xe0\x7f\xae\x66\xf7\x90\xb4\x7b\xa8\x8f\xc4\xf5\xe7\xef\x6e\xfd\x80\xff\x54\x1c\x4f\x3b\x3f\x12\xdc\xbd\xd9\xc7\x8c\x69\xcd\xd2\x9a\x7a\x7b\x43\xea\x1c\x2a\xfc\x5d\x6f\x2f\x13\xd1\xcb\xdb\x89\x72\x34\x82\xa2\x6e\xdf\x69\xbf\x8e\xc2\x55\x32\x2b\xf2\x17\x03\xd5\xc8\x6d\x2e\x43\x8b\x1e\x61\x61\x0c\x0c\x0f\x61\xe1\xf3\x2b\xd2\xf5\x93\x0f\xdc\x51\xac\x56\x2d\xdf\xd6\xbf\x7d\xb7\xd8\x59\x38\xbe\x85\x96\x96\x6a\xda\xa8\xa4\xe0\xd7\x91\x51\xb2\x68\x7e\x7e\x57\xd2\x15\xe3\x1a\x99\x28\xb8\xf4\x63\x7c\x44\xba\x2a\xd6\xea\x87\x64\xb4\xfe\x5e\xf5\xe7\x81\x8e\x06\xf2\x82\xc6\xed\xe2\xce\x55\xd1\xff\x87\xaa\xbb\x88\xff\x6c\x68\x5e\xf0\x30\x48\x9e\x22\x42\x6e\x3e\x6f\x45\x94\x84\x85\xff\xf6\x87\xb3\x60\x13\x30\x49\xb4\x90\xa9\xf6\xc8\x78\x0c\x7e\x22\x7c\xe3\x75\xd6\x56\xe4\x10\xe6\x79\x56\x84\x78\xf3\x80\x18\xa1\xf0\x85\xf1\xff\xc3\x1f\xee\x21\x01\x23\x0c\x03\x03\x73\x1f\x06\xce\x0d\x06\x06\xc6\x43\x58\xf8\xbf\xff\xbd\x15\x73\x7b\x08\x0b\xf8\xd4\x0e\x3e\x84\x9f\xbf\x30\xa2\x55\xf9\xee\x86\x5b\x7e\x60\x0f\x9a\x5d\x8e\xf5\xec\x76\x88\xd6\x96\x97\xf8\x6e\x58\xbd\x41\xe9\xe3\x71\x05\x9f\x2a\x0e\xc3\x2d\x0c\xfc\xd8\x7c\x9b\x12\x9d\xa6\x45\x53\xa7\x95\xb6\x3a\x2b\xb2\x10\x46\xa5\x60\x8a\x28\xaa\x47\x37\xab\x8f\xd9\x7e\x8e\x22\x72\x32\x8b\xbd\xbc\x8a\x8f\x75\x53\xb8\xf0\xb1\x02\x1f\xfb\x74\x6d\x69\x2b\xba\x2a\x46\x43\x8e\x77\x7f\xa8\x58\x0c\x1f\x0e\xef\x2c\x33\x1a\x60\x5b\x6e\xf9\xde\x08\x9a\x0b\x63\xbc\x92\xd1\x6a\x5f\xf8\x58\x1a\xe2\x9b\x6a\x03\x08\x7d\xd6\x94\x9e\x01\x8f\x66\xad\xbf\xcf\x19\x0f\x72\xfb\x4d\xed\xe4\x5a\x29\xd4\x4b\xa2\xd9\x6c\xf2\x3b\x5c\xc9\x68\x5f\x5e\xf8\x58\x1d\x64\xad\xcc\x9d\xd7\x8a\x7c\x77\xc6\x43\x99\x8b\xb4\xad\xd8\x19\xf6\xb2\x67\x9d\xe8\xae\x71\x2c\x20\x0d\xea\xd1\xfd\x94\xd2\xf8\xff\xfe\xb1\x1a\xff\x4c\x5d\x2f\x04\x44\x58\x4f\x51\x38\x18\xf7\x73\x9f\x38\xee\x24\x6c\xab\x89\x22\xb6\xb6\x4a\x7b\xcd\xcc\x9f\x76\xba\x2e\xb2\x3f\x01\x75\x67\x0d\x49\x20\x8d\x65\x30\x0f\x89\x6d\x44\xc5\x4d\xe5\x9f\x71\x9e\xa2\x6e\x7f\xab\xfb\xa8\x92\xa4\x2f\x61\x01\x75\xcf\xbc\x26\x41\x6f\xd6\x70\x7b\x06\xdb\xa9\xa6\xca\x73\x63\xa6\x03\x6b\x91\xb6\xb6\x7b\x9b\x6c\x09\x52\x17\x8c\xf3\x14\x85\x41\x38\x5f\x77\x31\xb2\x3d\xa9\x56\x54\x8c\xf8\x8d\x7b\x9a\xf0\xe6\x7b\xc5\x17\x69\xce\x2f\xc3\xfd\xd7\x7c\x48\x18\xed\x77\x88\x7a\x25\x90\x5b\x20\x75\xc1\x38\x4f\x51\x18\xe1\xf3\x75\x17\x04\x91\x6a\x30\x71\xe4\x16\x60\xfa\x31\x76\x7e\x3e\x2a\x1b\xc8\xca\xdf\x50\xfa\x74\x0d\xaf\x50\x62\x3e\x1e\x6b\xa3\xcd\xb5\x00\x52\x17\x8c\xf3\x14\x85\x81\x3b\x5f\x57\xa3\x73\x30\x6f\xc7\xe9\x2b\x8d\x7b\x06\x4a\x58\xe0\xcf\x5b\x9b\xe9\xc3\xd1\x9f\xc5\x97\xbe\x47\x29\x59\xff\xb2\x7f\x7f\xdd\xbd\xc1\x4d\xfc\x9f\x71\x7f\xfd\xbb\xb9\xb9\x7b\x8b\x28\x09\x8b\xc2\xc0\x5d\xd0\x40\xe3\x9f\xcd\x22\x97\x09\x20\x53\xf2\xe4\x76\xbe\xb3\x6c\x36\x7d\xc7\x7b\x41\x45\xff\x88\xee\xfb\x32\x1b\xe9\x9f\x3e\x70\xf1\x76\x0c\x6c\xd0\xf7\x07\xe1\x9b\x40\x06\x0e\xc6\x01\x05\x80\x8f\x1a\xa4\x48\x2d\x6d\x29\x5e\xbc\xeb\xb3\xed\xf7\xfa\x99\xd1\xfd\x82\x9b\xa9\x6c\x8f\x7b\x29\xc5\xf7\x54\x8c\x1f\xab\x44\x10\x40\xea\x82\x71\x40\x01\x78\xed\x82\xf0\xf7\xf9\x6c\xb7\xad\x08\x38\x57\x2c\x16\x17\x5a\x8b\xcd\xdf\x6d\x6b\x1e\x3f\xaf\x50\xdc\x71\x44\xbf\xff\x48\x63\x04\x52\x17\x8c\x03\x0a\x50\x3c\x6c\x54\x27\xef\xa1\x9a\x72\xef\xf9\xc4\x0d\x76\x2b\x94\x05\x2d\x9d\xe8\xd1\xac\xdc\x6b\xaf\x60\x06\xd9\x22\xbe\x9e\x7a\x04\x41\xea\x82\x71\x40\x01\xee\x2f\xdb\x3f\x68\x6f\x8d\x76\x98\xd9\x3a\x55\x5b\x7f\xa7\xa7\x38\xb8\x7f\x77\xc1\x5b\xa9\xdf\xda\x6e\xe0\x50\x31\x6a\x99\xf2\x97\xdb\xfd\x7f\xc6\xfd\x4f\x80\xff\xac\x1d\x7f\x50\x00\x6c\x46\xbf\x4c\x01\x97\xaa\x77\x61\x27\xb4\x1e\x6a\x9b\x2d\x9a\xe9\xdc\xad\x59\xd9\x66\x27\x96\x05\x4e\xd1\x29\xf8\xef\x7f\xba\x18\x06\x14\xbb\x67\x43\x86\x0e\xc6\x01\x15\x38\x4a\x75\x23\x32\x42\x74\x55\xc4\x60\x98\x60\x6d\x24\xf7\x0f\x1c\xf7\x7f\x3f\xed\x44\xfa\x00\x0d\xdd\x0b\x8e\x37\xcd\xb5\x1e\x03\x52\x17\x8c\x03\x2a\x20\xc3\x3b\x44\x8a\xe9\xac\xe8\x91\x5f\xd0\xf8\x92\xbc\x78\x7b\xc8\x5d\xb7\xb0\x6b\x04\xab\x70\xe4\xac\xfb\xf3\x4d\xcb\xa6\x67\x63\x50\x65\x41\x38\xa0\x02\x1a\x4f\xac\x36\x55\x7d\xfb\xb4\xdb\xf5\x3a\x16\xaa\xf6\xa7\xc3\xd7\xeb\x6c\x3f\x85\xba\xc6\x77\xe2\x96\xc0\xc2\xb3\xe4\xc7\xed\x42\xea\x82\x71\x40\x05\x5c\x47\x19\x75\x89\x42\x38\x0a\x25\xd9\xe0\x5b\x6f\x0a\xa6\xaa\x70\xd3\x67\x38\xb9\xbf\x2a\x46\xca\x98\x83\x35\xcc\x90\xe7\x16\x72\x93\xfc\x67\xdc\xff\x14\xf8\xef\x42\xfe\x07\x07\xc0\x96\xd7\xcb\x1c\x58\x0e\x34\x84\xbd\x66\x91\xf9\x42\x60\xa3\xf5\xe6\x0d\xf7\x3d\x57\xf8\x1d\x84\xca\x81\x13\xcc\x63\x43\x91\x75\x21\x4a\x17\x02\x7d\xc8\xd8\xc1\x38\xa0\x03\x09\xd7\x4c\x17\x67\x4a\xb7\xe8\x37\x9b\xc8\xb3\x8a\x35\xc4\x10\x1f\x15\x3c\xa1\x95\x65\xfa\x15\xe5\x43\xb3\x66\x60\x86\x1c\x42\x07\xa9\x0b\xc6\x01\x1d\x98\x0d\x5b\x41\xaf\xc4\xff\x81\xcd\xf2\x16\x85\xbc\xfd\xe8\x1b\x1d\x06\xc9\x5e\x95\x61\xdd\xcd\xc8\x29\x83\xac\x86\x29\x8d\x12\xe8\x3a\x00\xc6\x01\x1d\x68\x7e\x12\x9e\x47\x83\x21\x3f\x03\x3f\x28\xb9\xd6\x90\x91\x3a\x4e\x6a\xf1\x60\x80\xe8\x67\x8d\x8a\xbd\x42\xfd\xd3\x37\x7b\xc7\x96\x90\xba\x60\x1c\xd0\x81\xcf\x42\x4c\xbe\xac\xe6\xa7\x16\x31\xea\x6e\xb5\xb9\x18\x2f\xfb\x32\x0a\x94\x32\x63\x25\x48\xe0\x0c\x0b\xf0\xe3\x9a\x55\x82\x71\x21\x0e\x80\x71\x10\x07\xfe\xb3\xab\xfa\x83\x03\x60\x7b\x9d\xcb\x1c\xa8\xb1\x11\x6b\x5a\x2f\x0c\xad\x77\x99\xce\x68\x7b\x8a\x86\x42\xfd\xdd\xd8\x1d\x7e\xa8\x37\xa4\xfd\xda\x2c\xc3\x8b\x9e\xc7\x18\x4a\x90\xb1\x83\x71\x40\x07\x0e\xf9\xc3\xe8\x48\xf5\xee\x19\xda\x26\x05\x50\xdf\x6e\x0b\xbc\xc6\xba\xd4\xfd\xd2\x32\xac\x5e\x5b\x8c\x60\x88\x07\x8f\xae\x0d\x3a\x65\x83\x71\x40\x07\x1e\xcd\xfd\x72\x5a\x19\xc5\x12\xea\xd6\xf3\x62\x6c\xd4\xb4\x41\xc0\xe0\xde\xb6\x50\x43\x96\xfb\x51\x58\x2d\xc1\x4d\x3c\x42\xaa\x06\xdd\x63\x80\x70\x40\x07\xa8\x8a\xb9\x56\xc5\xa8\x94\xe6\x3b\xc2\xaf\x7f\x8c\xea\xcd\x94\x1e\x80\x17\xb4\xfe\x45\x40\x8a\xc4\x42\xb4\x2e\xd7\xf5\x35\x34\x18\x52\x17\x8c\x03\x3a\xa0\x64\x9f\xef\xb9\x8b\x5a\x63\x9a\x91\x1b\xad\x99\xb3\x60\x86\x87\x70\xd8\x3f\x22\x64\x9f\x2e\xe7\xb1\x41\x1b\x7b\x9f\xea\x7e\x3d\xc4\x01\x30\x0e\x3a\x0f\x68\xff\xd9\x01\xb0\x8d\xe7\x65\x0e\xac\x18\x44\xa1\x1f\xf3\xa6\x22\x4e\xed\x2b\x58\xad\x89\x3c\x7a\xf3\xfe\xc7\xd2\xce\x35\x18\xaf\x24\x04\x96\x04\x03\xa5\x30\xf2\x26\xc8\xd8\xc1\x38\xa0\x03\x30\x27\xd4\xa7\x1a\x55\x04\xe4\x3e\x63\x5e\xf7\xbb\xa7\x48\x79\xde\x10\xe6\xb0\x1c\x71\xb1\x7d\xaa\xf3\xdd\x4c\x23\x9c\x2e\xb1\x81\xd4\x05\xe3\x80\x0e\x14\xa4\x71\x61\x48\x96\xe3\xc3\xb5\xd1\x3b\x21\x60\xb1\x62\xca\x33\x61\x32\x46\xaf\x29\xbd\xe2\xac\x66\xeb\x9d\x9d\x6f\xf6\x1c\x85\xd4\x05\xe3\x80\x0e\xc8\x07\xd4\x7f\xd8\xf7\x8b\x2e\xd3\xc5\xdf\xe9\xe3\x92\xc6\xa7\x49\x3c\xa5\x41\xd5\x4d\x15\x2c\x47\xee\x2b\x5c\xfc\x7c\x2c\x9c\x09\xa9\x0b\xc6\x01\x1d\x38\x59\x2a\xfa\xe4\xfe\x69\x5b\x9b\xaa\xbf\xae\x81\xc6\x53\xc6\xc8\x0a\x93\xae\xeb\x0d\xe2\x23\x58\x9b\x15\xc5\x6f\x76\xb2\xb9\x2d\x10\x07\xc0\x38\xe8\x3c\xf0\xf2\x37\x0e\x68\xfd\xb3\x93\xbb\x17\x22\x02\xac\xa7\x38\x1c\x0c\xcc\xdf\xfe\xb5\x68\xcb\xdc\xdb\x4f\x9d\xee\x1c\xb6\xfa\x76\xd7\xbf\x2e\x9a\x7d\xbb\x6a\x8a\x29\x49\x8f\xd8\x72\x8f\xc2\x6f\x4b\xae\x23\xc5\x0e\xd5\x4d\xed\x9f\x71\x9e\xe2\x30\x6e\x7f\xaf\x1c\x9e\x82\xa6\x64\xc3\x59\xc0\x6d\x57\x40\x49\x9c\xb3\xa1\xdd\xd0\x85\x8a\x4b\x80\xf4\x69\x52\x4b\x06\xa3\x9b\x4e\x79\x11\xf3\x03\xa4\x32\x18\xe7\x29\x0e\x83\xf2\xf7\xca\x21\x6a\x12\xed\x6c\xae\x2d\xf0\xa4\x38\x92\xfa\xcd\xb7\x95\x87\x45\x45\x58\x60\xae\x63\x5f\xd3\x7a\xe1\x9f\x83\xca\x51\xc5\xc0\x0b\xa9\x0c\xc6\x79\x8a\xc3\xc0\xe0\xc0\xfc\x7d\x5f\xf0\xf2\xb6\xff\xe7\x5f\xdb\xbf\xd4\xe3\xcb\xeb\x4b\x03\x52\x28\xd5\xc5\x63\x9c\x8f\x23\x1f\x49\x25\x5a\xec\x77\x8e\x55\x63\xba\x41\xd2\x17\xb0\xe7\x2b\xe7\xd3\x17\xdf\x30\x02\x22\x21\xf2\x67\x9c\x95\x0d\x41\xaf\xed\xd5\xc5\xe8\x6e\x46\x6a\xf2\xb6\xa7\xe0\x2f\x3a\x4a\x94\x9b\xdc\x78\xd5\xa4\x75\x0e\xe5\xca\x7c\xba\x43\x20\xe4\x1c\x28\x7c\x03\xa3\xf7\x9a\x25\xfe\xa9\x60\x43\xe4\xbb\x7b\x04\x99\x29\xb2\xb6\xf6\x3d\x01\x0e\xe1\x6a\xff\x96\xf4\x65\x0f\xf1\x9f\x0d\xed\xff\xd2\x17\x51\x39\x7c\xc0\x61\x19\xd6\xd7\x06\x33\x33\xc6\x60\x4c\x60\x30\x61\x73\x8e\xf7\x4d\x34\x5c\x03\xc2\x37\x93\x78\x83\x4f\x9a\xf4\xd9\xaa\xb7\x71\x1a\x60\xae\x22\x7e\xa9\xbd\x10\xbf\xf8\xd2\x53\xd0\xe0\x9d\x75\x63\xa0\x7e\xb5\xb1\x83\xa9\xc2\x92\xe5\x8b\xf2\x11\x27\x52\x0e\xd1\x0a\xf7\x89\xb2\xb6\x2d\x4e\x46\xbc\x8a\x64\x40\xf8\x62\xfc\x32\x78\x7d\xdd\xe2\xa3\x91\x04\x29\xef\x3d\x7d\x3c\xdf\xae\x46\x4f\x8a\x74\xca\x63\x16\x76\xd6\xd3\xd7\xd8\xca\x4f\x98\x62\xe5\x2c\xaf\xe2\x63\x6b\x2f\xc6\x2f\x8b\x6f\xbd\x3e\x24\xa7\x39\xd9\x8c\xfa\xc4\xe3\x05\xab\xcc\x60\x3d\x9c\xad\xb6\x8e\x0a\xbe\x63\x1a\xed\x04\x17\x22\xab\x6f\x63\x78\x25\xa3\xbd\x18\xbf\x88\x25\xf4\xe1\xe1\x39\x16\x7a\xac\x79\xff\x78\xae\xe5\xf5\xd4\xe4\xe6\x67\x72\x2b\x95\x84\x88\x6e\xdd\xef\xed\xa6\xc2\xfb\xad\x62\x57\x32\xda\x8b\xf1\x0b\xda\x4d\x96\x3d\x9a\x33\x21\x2a\xd2\x62\xdd\x69\xfc\xe8\xe6\x12\xb3\x09\x91\xd0\x36\xb4\x75\x01\x92\x59\xe6\x2c\x61\xc2\x63\xde\x2b\x8b\x5f\xc0\xd4\xbd\x6c\xb9\x35\x18\x92\x44\x59\xb6\x43\x4e\x4c\xcb\x3c\x3e\xb2\x54\x34\x4e\xde\x1d\xe3\x98\x08\x9a\x14\x7a\x2b\x34\xf8\x03\xe9\x6e\x7d\xd7\x7d\xc8\x32\x03\xc6\x01\x97\xdb\xdc\xd8\x8c\x86\x17\x34\x5e\x4a\x4c\x8e\xd4\xcb\x7a\x9f\xdd\xbc\xad\xc8\xf9\xd3\xd5\x2c\x72\x18\x19\xec\x16\xfa\xa5\x67\xd4\xd4\x21\x75\xc1\x38\xe0\x72\x4b\xfb\x4a\x51\x10\xb9\x3a\x94\x76\x8f\x8e\xac\x2d\xe4\xa0\xea\xd3\x41\x1f\x9c\xc2\x66\xd0\x46\x48\xa1\x7c\x90\x8d\xe3\x02\xe2\x27\x48\x5d\x30\x0e\xb8\xdc\xc2\x36\x8e\xe3\x33\xbd\x95\x60\x2e\xe3\xb4\xc7\xf0\x32\xb7\x9b\xb7\xd9\x5b\x3a\x12\xcb\x5c\xd0\xf3\xd0\x8c\xca\x5a\xbf\x39\x55\x07\xa9\x0b\xc6\x79\x8a\xc2\xe0\xfc\xed\x08\xaa\xd7\xec\x81\x9a\xaa\x4e\x65\x46\xa3\x40\x30\xc3\xf7\xf0\xc8\x07\x63\x2d\xd8\x50\x15\x36\x26\x49\x62\x80\x42\xe5\xa7\xfc\x33\x37\x89\x7f\xc6\x79\x8a\xc2\x50\xb8\xb9\x7b\xff\x35\x5f\xfd\x61\xc3\x05\x36\x8d\x5c\x7a\xf8\x3e\x3a\x2c\xe9\x6a\x7d\xea\x88\x4f\xc1\xe6\xcf\x20\x81\xf5\xe9\x6d\x98\xd1\xad\xeb\x98\xd9\x8c\xaa\xa2\xfd\xcf\x8f\x5b\x68\x02\xa1\x87\x6f\x10\x0e\x68\x40\xde\x22\x1e\xb7\xa7\xec\x0a\xca\xc2\x54\x31\x92\x33\xde\xa9\xb7\xc8\x3c\x95\x65\xa9\xd8\x4e\x78\x45\x2c\xad\x5c\xf7\xb3\x14\x33\x48\x5d\x30\x0e\x68\x00\x73\xef\x57\x5a\xeb\x84\x60\x36\xc2\x53\x1b\x5f\x3c\x4b\x84\x79\xe1\x02\x7d\x1b\xf3\x9c\x4c\xf9\xa8\x07\x23\x7d\xdc\x2d\x9e\xdc\x90\xba\x60\x1c\xd0\x80\x61\x76\x9d\x61\x2b\xdc\x5a\x71\xc5\xa8\xca\x1f\x70\xf0\x0f\xe7\x26\x03\x82\x87\x26\xde\x22\x8b\x8c\xd3\x7f\xb7\xed\xb6\xf0\xeb\x82\xd4\x05\xe3\x80\x06\x68\xd3\x4b\x6e\xef\xfe\x3c\x2c\x73\xc9\x61\x3a\x7d\x2f\x64\x5c\x95\x27\x73\xa4\x15\xe5\xff\xab\xd6\x2e\xfa\x76\x40\x09\xe1\x43\x27\x48\xfe\x02\xc6\xfd\xcf\x80\xff\x2c\x1e\x7f\x50\x00\x6c\x4a\xbf\x4c\x01\xc9\x10\x56\x8e\x75\x7c\x56\x03\xca\xe8\x98\x26\xd2\x37\x0a\xb4\x0d\x6f\x51\x75\x0a\x4a\x5b\x5e\x30\xe8\x73\x8d\xbd\xa9\x51\xaf\x86\x0c\x1d\x8c\x03\x2a\x80\x1a\x4f\x26\xfe\x5e\x45\xd6\x6f\xee\x8c\x27\xcf\x71\xc1\xaf\xe4\xd9\xad\x0a\x71\x16\xd2\x5f\x0f\xb5\xf0\x1a\xe2\x1d\x75\x70\x25\x20\x75\xc1\x38\xa0\x02\x4f\xc4\x9b\xeb\x8c\xf0\x05\xf3\x37\xb0\x57\x8b\x17\xe4\xa5\x98\x16\x0b\xc3\x1f\xb4\x1f\xab\xda\x92\x68\xa1\xde\x76\x3f\x11\x47\x80\xd4\x05\xe3\x80\x0a\xec\xa6\xa1\x65\xd9\x10\x71\xf3\x1b\xbd\x95\xd1\x0a\xa1\x4b\x7d\x6b\xf0\xe3\xba\x73\xf9\xe0\x7e\x30\x59\xce\x03\xe9\xae\xfd\x40\x57\x48\x5d\x30\x0e\xa8\x40\x25\xa2\x72\x32\x8a\x1e\xfd\x90\x96\xa5\x44\x63\x45\xc0\x12\xac\x74\x7f\x90\xa3\xc6\x40\x46\x34\xd1\xe0\x7b\xd3\x84\x8d\x00\x65\xc8\x9e\x1b\x8c\xfb\x9f\x02\xff\x5d\xc9\xff\xe0\x00\xd8\xfa\x7a\x99\x03\x55\xb9\xb3\x65\x3b\xb6\x7d\x6a\xd4\xf5\x3e\xf2\x92\xf1\x69\xa1\xf0\xf8\x89\x78\x4a\x8a\x2a\x68\x8f\xe6\x49\x8b\xa6\xf2\x27\xf8\x20\x63\x07\xe3\x80\x0e\x90\xef\xad\x21\xe7\x75\x89\x7b\x85\xcc\xb4\xe3\xa3\xf0\x13\x46\x49\xe7\x66\x2b\x18\xdb\x36\x2a\xed\x1d\x3f\x7f\x27\xfc\xba\x2f\x04\x52\x17\x8c\x03\x3a\x20\x1e\x44\x89\xec\x3d\x82\xae\xdb\x22\x7f\x5f\x28\xd6\xce\x59\xe4\x70\x11\x53\x7c\x13\x4d\x61\x18\x11\x5e\x35\xcc\xe3\xb4\x79\x0f\x52\x17\x8c\x03\x3a\x70\x4f\x7b\x77\x74\xf3\xb9\xd4\xa3\x26\x69\x07\x6a\x9f\xcf\xd2\xd1\x84\x96\xb5\x07\x76\x9d\xa7\x4c\xbd\x8f\x50\x7e\x9e\x08\xa9\x32\x41\xea\x82\x71\x40\x07\x74\x60\x9d\xba\xe1\x11\x31\x1e\xc8\xc3\xe6\x4e\x37\x05\x04\x49\x0c\x73\x09\x90\xd8\x4a\x6c\xd8\x06\x63\x09\x22\xc3\xcf\x7b\x3f\x85\x38\x00\xc6\x41\x1c\xa8\x05\xc9\x5f\xc0\x36\x3b\x97\x39\xa0\xa4\x2f\x3c\x36\x3e\xd6\x5f\xfd\x8d\xe2\xd3\x7b\x4f\x6b\x03\x24\x98\x66\x84\x0c\x0b\x46\xc6\x53\xa3\x5b\x93\x19\x63\x98\xa9\xec\x90\xb1\x83\x71\x40\x07\xa4\x28\x94\x05\x69\x1f\x84\xd1\x89\x0d\x84\x1f\x69\xb9\x5d\x8b\x5d\x38\xa6\xd7\xe4\xbf\x89\x6d\x81\x55\xbb\x1a\xf9\xcb\x8d\x5e\x19\x52\x17\x8c\x03\x3a\x50\x8a\xdd\xcf\x0d\x2b\x88\x56\x44\xaa\xcc\xa0\x94\x25\xbe\x24\x7d\xb2\x12\x91\x7e\x73\x00\x3b\xc2\xba\x2a\x3b\xdf\xb3\xa6\x86\x01\x52\x17\x8c\x03\x3a\xf0\x6c\x20\xd0\x18\x8b\x4e\xe7\x5b\x7e\x42\x01\x5b\xd7\x3b\xe9\x6f\xae\x6d\x99\x48\xbc\xcc\x34\x9c\xed\x6f\x09\x33\xcc\x0a\x93\x7a\x21\x75\xc1\x38\xa0\x03\xd3\x6d\x51\xcd\x7d\x51\x69\x9f\x0b\xf5\xbc\xfb\xde\xf0\xab\xc5\xab\x71\xa5\xe1\x5d\x8f\x58\x3b\x68\x8e\xba\x49\xc3\x42\x6f\x74\x0f\xe2\x00\x18\x07\x9d\x07\x40\xf2\x17\xb0\x9d\xe7\x65\x0e\x68\xf3\x64\x2c\x85\x6a\x13\x8a\x7e\xea\xff\x85\x0c\xbf\x10\x5a\xfd\x95\x05\x03\xf5\x7a\x2c\x27\x62\xac\xc0\x76\xa4\x7f\xa9\x8f\x31\x64\xec\x60\x1c\xd0\x01\x4c\x6d\xdf\x88\x22\x89\x49\xba\x45\x84\x02\x06\x0e\x09\x82\x46\x9e\x86\xef\x81\xe3\x8e\xf2\x73\x53\x3c\x3a\xb5\xde\x18\xf6\xd0\x8d\x1b\x18\x07\x74\xa0\x67\x2e\x8b\x63\xc3\x71\x81\x2c\x71\xba\x77\x98\x6f\xe7\x83\xd3\x41\xd6\xe4\x61\x8a\x62\x6b\x5f\x55\xa9\xde\xb1\xab\x5b\x40\x0c\xa4\x2e\x18\x07\x74\x60\x59\x24\xca\x21\xfd\x16\x29\xa2\xc1\x11\x03\xcb\x1d\xdd\x70\xf5\xa8\x72\xdf\x79\xd1\xaa\xf4\x9b\xc4\x42\xc6\x8d\x0a\xf6\x93\x50\x07\xc0\x38\xa0\x03\xbb\xe9\x96\xd2\x03\xa5\xd4\x2d\x1c\xb6\xaf\x42\xc3\x33\x6b\x68\xbf\x45\x30\x11\x35\x8a\x7c\x36\x96\x1f\xe1\xd1\xa1\xc0\x7a\x6a\x06\x71\x00\x8c\x83\xce\x03\x20\xf9\x0b\xd8\xd9\xfd\xf2\xfc\x65\x5f\xce\xd1\xa8\x39\x4c\xe7\xdd\x42\xa6\xd8\xcd\xed\x97\xc5\x3b\xe6\x72\x2b\x9f\x53\x28\x52\x16\xbe\xcc\x24\x7d\x3a\x98\x78\x1a\x0e\xc9\x32\xc0\xb8\x8b\xf9\x0b\x79\x79\x02\x5d\x0e\x41\x9d\xce\x5d\x55\xbb\x8a\x4a\x63\x65\x98\x9a\xee\x8f\xdc\xd4\x35\x01\x76\x1f\x10\xbf\x24\x1d\x27\xcc\xcd\x43\x2a\x83\x71\x17\xf3\x17\x8f\x45\xb4\xa4\xf6\x8d\xc7\xe3\x32\xcf\x74\xf7\x2c\x52\x36\x59\x7d\x5e\x3c\x89\xfa\x44\xc2\x14\xcd\x3f\x15\x9a\x45\xc4\x89\x75\x02\xa9\x0c\xc6\x79\x8a\xc3\xc0\x08\xff\xad\xb2\xcf\xad\x15\x3d\x22\xf3\x9d\x80\x88\xcd\xd0\xd1\xe6\x37\xa4\x27\x19\xf7\xec\xef\xd4\x98\x33\x78\x73\x1f\xc2\x2f\x17\xb8\xc4\xbd\x83\xe6\x2f\x60\x97\x56\xcf\xe7\x2f\xf8\xfa\x5b\x53\x09\x79\xac\x02\x0e\x0c\x89\x06\x48\xf5\x2c\x71\x4b\x02\x9f\x0d\xfa\x93\xaf\x13\xc3\x0f\xcc\x91\x49\xd0\x6d\xd8\x9c\x43\xfb\x7c\xbe\xd5\x4b\xb9\xef\x3e\xb8\x53\x39\x86\x5a\x65\xd5\x13\xb3\x1f\x49\x4d\xbf\xec\xb1\x7b\xfb\x71\xc5\x47\x91\x03\xe4\x16\xea\x7f\x5b\xfe\x02\x36\xb4\x73\xf9\x4b\x10\x30\x7f\x59\x09\xfb\x39\x8f\xf6\xe3\xae\x8a\x73\x70\xed\x40\xbe\x39\xa5\x4f\x7f\xa2\x94\x8f\x49\x19\x5c\xd6\x13\x7d\xd3\xb1\xb3\x47\x8f\xdc\xaf\x22\x7f\x81\x91\x01\x9e\xd1\x33\x07\x65\x11\x17\xc4\xcb\xcf\xf2\x28\x31\x77\x68\x8c\xcd\x2a\x6f\x28\xee\x6e\x84\x16\x3f\x45\x4d\xac\x70\x0a\x5c\x77\xd9\xad\xb9\x92\x9b\x19\x17\xf3\x97\xe9\xa6\x8a\x28\x0c\xd6\x09\x58\x61\x75\xdd\x52\x78\x61\x24\x3b\x37\xe2\x8c\x9d\x66\xf7\x6f\xea\x28\xd7\x96\xea\x0b\x5a\x22\x88\xae\xe4\x1e\x8a\xe2\x85\x8f\xad\xd2\x85\x81\x5f\x3a\xbb\x1e\xac\x48\xa3\x9b\xd1\x15\xa5\xc9\xa3\xc9\x3d\xcb\x22\xc6\x9b\xad\x19\x55\xe4\x5d\x3c\x16\x68\x72\xef\x4a\x46\x7b\x31\x7f\xd1\xca\xe1\xcb\xad\x62\x9b\xcd\x17\x43\x98\x97\x8c\x3d\x9d\x52\xbb\xe3\xf4\x2e\xed\x60\xa2\x8c\x2f\x4f\x88\x95\xe0\xfb\xfd\x71\xbc\x2b\x19\xed\xab\x0b\x1f\xfb\xca\x2b\x87\x4a\x45\x34\xaf\xdc\xd7\x0a\x87\x36\x9a\x50\x40\x81\xac\x3e\x95\x1b\xff\x6b\xa5\x2d\xd2\xc4\x9a\x68\xbe\xc3\x17\xbe\x2b\xcb\x5f\xc0\xd4\xbd\x6c\xb9\x7d\x4d\x48\x53\x25\x84\xdf\xdf\x25\x72\x5f\xcf\xaa\xff\xf0\xb5\x56\x21\x1e\x0b\x4b\x50\xcb\xd0\x0f\x99\xbe\xd7\xab\x11\x1c\xb0\xd0\x2d\x17\x18\x07\x5c\x6e\xf5\x46\xc9\x34\xfa\x3b\x36\x8f\x10\x58\xbe\x87\x37\xdf\xbf\x06\x9b\x76\x40\x7d\xef\x8b\x1e\x39\xb2\x2a\xa1\x00\xbd\x76\xc0\xe6\x11\xa4\x2e\x18\x07\x5c\x6e\x71\x29\xb1\x4b\x53\xf3\xc7\xd0\x8e\x34\x3e\x6a\x32\xd7\xde\x2d\x37\xdf\xf3\xd5\x79\x77\x22\x49\x2d\xcf\x6b\x1a\xf5\x6a\xdf\x0a\x7a\x44\x02\xe3\x3c\x45\x61\xdc\xce\xd7\xa5\x18\x6b\x25\x60\xd2\x47\xa1\x9a\x6a\x90\x33\xdc\xc9\x34\x7c\x35\x36\x3b\x96\xed\xad\x98\xfe\x34\x52\x5a\xcc\x9d\xf7\xbe\x36\x32\xa4\x2e\x18\xe7\x29\x0a\xfb\xb7\xef\x01\xd6\x9a\xb2\xe3\x97\xc9\xab\xc7\x77\x65\x56\xd4\xdf\xfb\x65\x61\xa1\x24\x7d\xef\x29\xcb\xfa\x30\x95\x2c\x20\x14\xfe\x2e\x8d\xb8\x1b\x92\xbf\x80\x71\x9e\xa2\x30\x70\x6e\xee\xde\x7f\xcd\x57\x7f\xd8\x70\x81\x4d\x23\x97\x19\xd0\x51\x9c\xf4\xe4\xb1\x36\xa2\xb7\xad\x1b\xd9\x33\x85\x65\x8c\x37\xaa\xb3\x4f\x5e\x89\xca\x62\xfb\xbe\x91\xb1\xf0\x2e\xc5\xaf\x7b\x02\x19\x39\x18\x07\x34\x60\x47\x76\xda\xc2\xb5\xd6\x32\xee\xdd\x13\xad\x83\x3b\xcf\x76\x5e\xc9\x08\xcb\x23\x54\x1a\x68\xf4\x4d\xa8\xbd\x29\x48\xe3\x19\x5c\x87\xd4\x05\xe3\x80\x06\xa8\xc4\x3d\x4b\x9b\xb5\x7a\xfb\x2c\xf6\x8e\xaf\x2e\x8e\xa4\x3b\xbd\xb3\xfe\x9c\x6e\xa9\x0c\x09\x6b\x75\x59\xbd\xe2\x56\xc5\xcc\x38\xa4\x2e\x18\x07\x34\x60\xf4\x7b\xf0\xad\x17\xde\x37\xad\x13\x54\x6b\x77\x3e\x7a\x4b\x97\xf4\xaf\x32\x18\x66\x06\x60\xa4\x58\x6d\xf8\xea\xea\x94\xbe\xdf\x82\xd4\x05\xe3\x80\x06\x48\x79\x11\x84\xaa\x09\x23\xb9\x88\x7f\x15\xfc\x9e\x3b\x53\xaa\xc5\xac\xcc\x65\x97\x2b\xf1\x34\x6a\xa6\x68\xda\x06\x4b\x13\xf6\x10\x92\xbf\x80\x71\xff\x33\xe0\x3f\x8b\xc7\x1f\x14\x00\x9b\xd2\x2f\x7d\xe6\xe9\x9e\x3c\x51\x25\xf8\xb6\xfc\xc7\xe7\xca\x71\x2b\x46\x82\xa7\x83\x3f\x58\xd7\x84\xa5\xd3\x99\x61\x2b\xd0\x05\x78\xbb\xe3\x8c\xa0\xcf\x3c\x41\x38\xa0\x02\x76\x56\xb6\x1b\x49\xbf\xf6\x4f\x74\x6f\x98\x61\x92\xab\x76\xb5\x3e\xdb\xe4\xf7\xa0\xc3\xa0\x91\x4c\xde\x62\x34\x7a\x9a\xe0\xdd\x03\xa9\x0b\xc6\x01\x15\x18\x99\x38\xb4\x6c\x79\x8f\xc7\xc6\x5b\xe6\x95\x57\xfe\xda\x26\x3b\xc9\xad\x99\xf5\xd1\x5e\xb6\xd8\xd7\x23\x5d\x73\xc9\x98\x55\x43\x48\x5d\x30\x0e\xa8\xc0\x67\x56\x37\xb5\x03\xea\x50\xb7\x81\xb0\x90\x68\xd3\x2a\x05\xaa\x55\xbd\xad\x8e\x21\x56\xc7\xe4\x7e\xcb\x50\x86\x84\xd6\xf2\x9b\x90\xba\x60\x1c\x50\x01\x5e\xf3\x10\x49\x0e\xd3\xdc\xd9\x27\xb4\xc5\x04\x24\x6a\xc9\xbd\x62\xa8\x87\xb0\xda\x3e\x0f\xda\x05\xd2\x66\xfa\xe5\xe9\xe3\x59\x20\x7b\x6e\x30\xee\x7f\x0a\xfc\x77\x25\xff\x83\x03\x60\xeb\xeb\x65\x0e\xa0\xcb\x11\x2f\x07\x15\x0b\xe4\x7d\x10\x0b\x66\x2a\xf0\x63\xf3\xf0\xd0\xbc\xbe\x42\x1d\x58\x4e\x31\xe8\x36\xd2\x47\x1b\x69\x2b\x00\x19\x3b\x18\x07\x74\xa0\xc2\xdd\x77\x3a\x39\x6c\xea\x0b\x55\xc2\x51\xb6\x42\x87\xd5\x0d\x95\x97\x8d\x65\x4c\x7a\xe3\x0f\x91\xe8\xcf\x98\x7c\xe8\x50\x93\x20\x75\xc1\x38\xa0\x03\x2f\x6c\x0f\xc4\x14\x43\xf1\x02\xcb\x7e\x79\x5a\x22\xcb\xb8\x08\x6c\xab\xe4\xee\x30\x66\xe4\x54\x3f\xd4\x7a\x88\x3b\xe6\xda\x20\x0a\xa9\x0b\xc6\x01\x1d\x48\xd5\x3e\xfd\x1c\x72\x4a\xb6\x82\xa0\x65\x24\xdc\xc2\xaf\x14\x73\x54\x6b\x11\x11\xb3\xf4\x98\xac\x3d\x62\x70\xba\x58\xb4\xfe\x21\xa4\x2e\x18\x07\x74\xc0\x5d\x73\x5d\xb6\x7f\xa8\x92\x72\x00\xf7\xe5\x37\xe3\x42\x6f\xb2\x42\x92\xf1\xc0\xa7\x30\x7e\x6d\xcc\xab\x23\x5b\x7a\xe2\x2a\xdf\x21\x0e\x80\x71\x10\x07\xfe\xb3\xad\xfa\x83\x03\x60\x9b\x9d\xcb\x1c\x70\xea\x28\x21\x47\x8e\x89\x2b\xeb\x1f\x53\x9a\x2a\x56\x34\xfe\xb5\x74\x24\xc8\xb8\x62\xe2\x21\x98\xe2\xc7\x86\xc1\x4c\x9c\xdb\x01\x19\x3b\x18\x07\x74\x60\x7d\xd9\x25\x7b\x68\x54\x64\x45\x21\x95\xd8\x49\x9b\xa5\xe9\xf9\x61\x4c\x0a\xbb\xaf\x50\x3c\x75\x85\xed\xc9\x28\x15\x0f\x2f\x74\x7e\x01\xe3\x80\x0e\x08\xad\xdd\x59\x12\x7a\x3b\xb8\xb6\xbe\x28\x24\xf5\xd4\x46\xa4\xfa\xdb\x33\x81\xb4\x5a\xc9\x2a\x1d\xce\x57\x7b\x85\xf3\x1f\x3f\x40\x17\x6d\x30\x0e\xe8\x00\xd5\x5b\xc6\x80\x9d\xdc\xb2\x53\xe4\x33\xba\x69\x87\x20\x1c\x66\x07\x72\x84\x31\xcf\x57\x52\x78\xce\xe6\xf0\x45\x56\x98\x6c\xd0\xac\x00\x8c\x03\x3a\x20\x43\x50\xf8\x90\x8b\xf2\x45\x51\x9b\xf6\x58\xec\x68\x7f\x91\x34\xc6\xeb\x99\x92\xed\xf0\x2e\x96\x9a\xb4\x2f\x4a\x81\x5f\xd0\x48\x20\x0e\x80\x71\xd0\x79\x00\x24\x7f\x01\xdb\x79\x5e\xe6\x40\xe9\x03\x75\x66\x14\xda\x9b\x55\x1e\x15\xd1\x93\x0d\x7d\xb7\xee\x59\x86\xa7\xf2\xad\xc1\xa5\x3c\x6c\xad\x5d\xfa\xac\x27\xd5\xe3\x0f\xcd\xb4\x40\x38\xa0\x03\x67\x7b\xdc\x07\x73\x4d\x42\x89\x1f\x13\xf3\xf1\x75\xa6\x16\x55\xc4\x93\x6e\x6f\xe5\xaa\x0a\xb1\xdc\x93\xf0\xbc\x1f\xa6\xf6\xdd\x00\x52\x17\x8c\x03\x3a\xf0\x8b\x69\xd3\x22\xb6\x75\xf2\x3b\x06\xbf\x47\x54\x57\x4e\x68\x4a\xf8\x86\xe3\xe2\x99\xc3\x88\x52\xac\xa9\x93\x83\xdf\xdd\x97\x03\x90\xba\x60\x1c\xd0\x81\xe2\xb7\x94\xf0\x55\xe3\xbc\xf8\x48\x1f\x71\x3a\x28\x5e\x6b\xd2\x0d\x4f\xae\x7a\x9e\x9e\xe9\xcb\xc6\xe7\xc4\x9c\x2a\xc6\xee\x41\xb7\x03\x60\x1c\xd0\x81\x80\x9f\x18\x8a\x5c\x12\x8f\xcb\x53\x23\x7f\x32\x93\xf0\x77\x10\xeb\x73\x8b\xb0\x3e\x6d\xd7\xe6\x55\x7c\xff\x4a\x98\x42\x48\xf3\x05\xc4\x01\x30\x0e\x3a\x0f\xbc\xfa\x73\xfe\x02\x76\x76\xbf\x3c\x7f\xf1\xd8\xa4\xf7\x79\xe8\x6b\xd3\x37\xda\xb6\x12\xcf\xcc\xfd\xe6\x47\x35\x6f\x49\x42\x6a\x0c\x5d\x02\xaa\xb0\xc5\x11\xa3\x0f\x92\x08\x34\xcb\x00\xe1\x2e\xe6\x2f\x04\x6b\xaf\xfd\x92\x77\x61\x1b\xc7\x45\x8f\x4a\xb6\x93\x7e\x39\xe2\xda\x44\xe1\xdd\xad\xf5\x75\xe5\x3f\xb0\x3f\x9e\x79\x67\xf1\x08\x52\x19\x8c\xbb\x98\xbf\xc8\x69\x3e\xbe\xa9\x5f\x2d\x9b\x36\xc0\x5f\xf7\x88\xcc\xcc\x39\xd4\x55\x93\x36\xf3\x9e\x11\x73\x36\xc7\xa1\xae\xab\xad\x6f\x9a\x32\xa4\x32\x18\xe7\x29\x0e\x03\x03\x03\x7b\xbe\xf2\x3b\x6d\xb3\xb1\xc6\x91\x8f\xea\x8e\x6e\xcd\xa5\x36\x77\x3d\x3e\xd6\x37\x6e\xe2\x85\x9f\xa9\xe1\x31\xf1\xf9\x46\xa9\x9c\xdd\xef\x82\xe6\x2f\x60\x6f\x02\x9f\xcf\x5f\x6a\xb4\x83\xb6\xe5\x06\x48\x87\x28\x8a\xbc\xb8\x7f\xbe\xfb\xf0\x7e\x1a\x09\x76\xbd\x33\x67\x8b\xb1\x87\x89\x69\xae\x7b\xd7\xe1\xfc\x1b\xce\xc8\x8d\x1d\x0e\x0c\x0a\x92\x0b\x9d\xf8\xf2\xa1\x22\x02\x70\x9b\x76\xe4\xe2\x74\x1e\xf5\xb4\x03\x4b\x61\xd9\xbd\xd6\x9d\xc4\xd7\xfe\x6d\xf9\x0b\xd8\xd0\xce\xe5\x2f\x5d\xc0\xfc\x45\x79\xb4\xf8\x01\xcf\xe3\xc2\x1b\xb1\x35\x45\x0d\xfd\xc3\x79\xbf\x92\x54\x29\x4d\xaf\xbf\xfc\x9c\xf5\xfc\x93\xa2\x60\x07\x5e\xe8\xe3\xab\xc8\x5f\x84\x2f\xe4\x2f\x96\x1f\xe3\x14\x55\xb4\xb2\x2d\x89\x23\xa7\xbe\x90\xce\xe5\x6f\x89\x08\x3c\x46\x45\x69\xb6\x71\xe3\xc0\x5c\xf6\x57\xb3\x94\x21\xb8\x92\xab\x19\x17\xf3\x97\x92\x51\xa3\x1f\xa9\x24\x0c\x1d\x67\xf1\x04\x74\x4e\xc1\x87\x04\x49\x13\xc1\xeb\x75\x26\x0b\x56\xaf\xe1\xbb\x7a\x31\x0c\x4e\xe1\xaf\xe4\x22\xca\xc5\xfc\x85\x8b\xf3\xbb\x61\x60\x93\xd3\x6a\x4e\xbe\x5d\xb0\xec\x6c\xf2\x7b\xd7\x49\xfc\xf2\x14\x2c\xf1\xb9\x46\x57\x14\x75\x58\x38\xf6\xf2\x2b\x19\xed\xc5\xfc\x25\x53\x2e\x32\x96\xd3\x50\x65\xb7\xd4\x65\x56\x3c\x62\xad\xfa\xdd\x8b\x98\x6d\x38\xa1\x44\x49\x91\x47\x62\x53\xdf\xc9\x5f\xa5\x50\x5d\xc9\x68\x2f\xe6\x2f\x6f\x87\xec\xc9\x68\x90\xa8\x1d\xe8\xe3\x0c\x65\x94\x4b\x6f\x53\xe5\x91\x60\x0f\x8b\x79\xde\x0a\x0b\x4d\xa3\xb2\xfb\x40\xdc\x84\x74\x65\xf9\x0b\x98\xba\x97\x2d\xb7\x8d\x5e\x86\xd6\x46\xb9\x77\x61\x1a\xc2\x51\xc7\x44\x63\xf8\x7f\x2d\xe3\xd2\x53\x7a\x79\x39\xc8\xe8\xd2\x76\x44\xbb\x8e\x34\x90\x42\x96\x19\x30\x0e\xb8\xdc\x96\xb1\xa2\xda\xe9\x34\xbf\x1b\x22\x8a\x72\xcb\x0c\xd7\x45\x4a\x39\xd2\xf0\x3a\xac\x30\x4f\x8b\xf6\x24\x40\x2d\x3e\x7b\x22\xe3\x0c\xa9\x0b\xc6\x01\x97\x5b\xc2\x77\xd4\x88\x58\x93\xb4\x58\xc4\x5f\x2c\xf2\xb3\xe3\xfa\x9f\xfa\xee\x4e\xda\xef\xc1\x33\x72\x48\xb0\x7d\x17\xd7\xad\xf5\x8d\x82\xd4\x05\xe3\x80\xcb\xed\xee\xe7\x71\x7e\xf5\x93\x08\xb2\xb3\x5b\x4d\xed\x44\xa3\x58\xeb\x5a\xa9\x44\xe2\x77\x56\x03\x4a\x58\xda\x0e\x1a\x9f\x12\x6d\xf6\x41\x1f\x7d\x83\x70\x9e\xa2\x7f\xbf\xba\xf8\x23\x77\x89\x57\x5c\x2d\xee\x88\x91\x6d\xf2\xf6\x9c\xa9\xbc\x03\x8d\x0e\x96\xfa\xa9\xdd\xb1\x6b\xa3\xd8\x83\xda\x87\x24\x82\x8a\x90\xfc\x05\x8c\xf3\x14\xa5\x80\x71\x73\xf7\xfe\x6b\xbe\xfa\xc3\x86\x0b\x6c\x1a\xb9\xcc\x80\x6d\x4e\x66\x93\x3d\x65\xac\x97\x04\xfe\xea\xab\x28\xd7\xfb\x99\x5f\x0a\xba\x4e\x73\x39\x7d\x1b\xd2\xa5\xf6\xcb\x62\x35\x1a\x80\xbe\x78\x00\xc6\x01\x0d\x10\x5a\x33\xe8\x57\x42\xd8\x4e\xab\x9b\x7f\xc4\xcb\xed\xbc\x42\x50\xf9\xee\xd7\xc1\x19\x26\x3e\x82\xee\xae\x9d\x33\x75\xbe\x57\xf4\xff\x6d\x8e\xff\xcc\x01\x0d\xf8\xe4\x3d\x94\xb9\x9b\xfc\x2c\x9f\x20\x32\xb5\x4f\xf1\xbe\x25\x8e\x53\xe5\x1e\xf6\x92\x3a\xb6\x7b\xcf\x9e\x0b\x7a\x91\xdd\xfb\xef\x90\xba\x60\x1c\xd0\x00\x95\xc8\x46\x9c\xd3\x91\xa0\x9b\x63\xb6\xba\x33\xde\x1b\x68\x09\xd7\x33\xc9\x2a\xe3\x9e\xf3\x7a\x39\x0f\x30\xe6\xe7\x5b\x38\xde\x86\xe6\x3a\x20\x1c\xd0\x80\xa3\x19\xe1\xcf\xd5\xea\xf8\x9b\xfc\x1c\x77\xbc\x15\x6e\xd8\x71\xb3\x13\xbc\x6d\x52\x61\x98\xea\x85\xd9\x32\xcb\x84\xa3\xf8\xf0\x09\x92\xbf\x80\x71\xff\x33\xe0\x3f\x8b\xc7\x1f\x14\x00\x9b\xd2\x2f\x53\xe0\xb0\xf8\x8d\x7f\xd8\x63\x99\xa5\x17\x67\x4b\x9b\xf7\xd5\x9c\x3e\x3e\xe6\xb7\x33\x21\xf8\x98\x44\x8f\x0b\x4b\x99\xfa\x54\xbd\x9e\x0c\xfa\x7e\x00\x08\x07\x54\x80\x2a\x64\x81\xf4\x38\x85\x40\xe4\x56\x73\x5e\xd8\xab\x27\x09\xc4\x27\x56\x61\xb9\x19\xc2\x6f\x1e\xaf\x0e\x38\xb3\x52\xee\x47\x88\x43\xcf\x31\x20\x1c\x50\x01\x45\xb2\x47\x3a\x1d\x31\xe5\xaa\x5f\xd5\xca\x37\xa9\xed\x65\x5b\xfd\xe3\x56\x9f\xcc\xd4\x5b\xdd\xc3\xd5\x40\x94\x5c\x7e\x89\x79\x06\xa9\x0b\xc6\x01\x15\xa0\xdc\xca\x47\x71\xf1\x9f\xa2\xf5\x5a\x7f\xa3\x82\x31\x6f\xd4\xac\xa4\xce\x1c\x21\x7d\x1c\xdc\x91\x4e\xd3\xbd\xc5\xda\xf0\x5d\x03\x52\x17\x8c\x03\x2a\xe0\xe4\x38\x8b\x36\x69\x97\xb1\x9b\xe4\x3a\x41\x71\x86\x63\x96\x32\xb0\xc5\xf1\x59\x34\xf9\x9e\x4f\x34\xce\x22\xe1\xa4\x7b\xe1\x6d\xc8\x9e\x1b\x8c\xfb\x9f\x02\xff\x5d\xc9\xff\xe0\x00\xd8\xfa\x7a\x99\x03\x37\x12\x99\x2d\x7a\x56\xda\xfb\x72\x97\x3f\x7f\x4b\x20\x32\x50\xe6\xbf\x5b\x41\x7a\xbd\x6a\x22\x44\x32\x99\x31\xcb\x90\xc6\x12\xfa\xbc\x17\x8c\x03\x3a\x60\x2e\x6b\xf3\x24\x37\x93\xd5\xee\x69\xf5\xb6\x7c\x62\xb8\xcc\x48\x1e\xc5\xb1\xeb\x6b\x57\x1f\xb1\xf2\x4a\xd1\x6d\xab\xb3\x1b\xc9\x90\xba\x60\x1c\xd0\x81\x37\xc3\x96\xe8\xfa\x98\x76\x65\xca\x87\x87\xb3\x30\x69\x2f\xc6\xb3\x7f\xda\x4c\xeb\xaa\xa2\x8f\xbb\xe4\x20\x27\x20\xa1\xd3\x79\x43\xea\x82\x71\x40\x07\x7a\x0e\xf7\x64\xb2\xbb\xe4\xc6\xb2\x85\xa7\x2d\x27\xf8\xc8\x34\x38\x3b\x3e\x61\x86\xf7\xa9\x13\x91\xd1\xf5\x13\xa1\x6e\xac\x68\x41\x9f\xa7\x83\x70\x40\x07\x0a\xe9\xf1\x54\xbf\xa7\x7d\x1d\x10\x36\x45\xf6\xca\x17\x4f\x87\x55\x1d\x6d\xed\xc4\xee\x39\x96\xcb\xff\xf0\xf4\x75\x92\x9d\x78\x38\xc4\x01\x30\x0e\xe2\x80\x30\x48\xfe\x02\xb6\xd9\xb9\xcc\x81\x49\x11\xea\x8d\xee\x8c\x92\xf9\xa7\x14\x4d\xfa\xa3\x1f\xa4\x91\x79\x8c\xbf\xca\xbc\x15\x79\x92\x7f\x8b\xb3\xa0\x79\x71\x38\x5c\x1a\x32\x76\x30\x0e\xe8\xc0\xca\xad\x20\x2c\x99\x53\x1e\x5c\xb7\x93\xf9\xef\x19\x6a\x83\x95\x9c\x8f\x5f\xdc\xd7\xb5\x8b\xaa\x61\xf9\xda\x10\x03\x7b\x38\x01\xbd\x5f\x07\xc6\x01\x1d\x58\x55\x11\x74\xc1\x65\x74\xad\x74\x3b\xc2\x8e\xa8\x45\xf0\x96\x0a\x6c\x0b\x0b\x78\xb5\x44\xf3\x6b\xf9\x6c\xe3\x24\x48\xb6\x02\x3a\x65\x83\x71\x40\x07\x88\xa2\xaa\xc2\x5b\x07\xef\x6f\x1d\xd1\x78\xa1\x6b\x54\x10\xd1\x0b\x2c\xa3\xbc\xa2\x89\xfc\x2a\xbb\x2c\x8c\x73\xeb\xd1\x03\xe9\x0d\x48\x5d\x30\x0e\xe8\x80\xc7\x57\x9e\x77\x34\xdc\xa1\xc7\x26\x72\x04\x6d\xa3\xcb\x11\x81\xb5\x16\xa7\x6a\x8b\x74\xf6\x46\x3b\xdb\x77\xca\xe3\x7a\x6e\xd8\x43\x1c\x00\xe3\xa0\xf3\x00\x48\xfe\x02\xb6\xf3\xbc\xcc\x01\x16\x1c\xd7\x48\x8b\x58\x11\xff\x30\x4c\x9d\x78\xf8\xc1\x5d\xa1\x91\xe4\x8a\xd3\xc1\x89\x6a\x03\x26\x3d\x8f\x02\x86\x91\x2f\xef\x21\x63\x07\xe3\x80\x0e\xdc\xec\x47\x78\xc2\x69\x9c\xba\x1e\xea\xca\xbc\xec\x52\xbf\x86\x85\x19\xbb\xa0\x25\x62\xc0\x57\x2a\xc9\x16\x5d\xc4\x97\xc0\x38\x0d\xa9\x0b\xc6\x01\x1d\xc8\xdf\x46\x7f\xfe\xba\xf0\xe6\xdd\xd5\xad\x96\xb4\xb6\x88\x1f\x22\xd3\xc7\x30\x9e\x9d\x21\x8c\xa9\x92\x11\x96\xcb\xd8\xf5\xf0\x5c\x90\xba\x60\x1c\xd0\x81\x0f\xfb\x7d\xda\x43\x94\xcc\xc8\x08\x8a\x1c\x9a\x69\x52\xd3\xcd\x95\x9e\x56\xbc\x23\xdb\x4f\x16\xd0\xe9\xc5\xd8\x37\x85\xa6\xa0\x0f\x26\xc1\x38\xa0\x03\xfc\xcb\x6c\x85\x1e\x14\x0e\x3e\xd9\x48\x23\xc6\x30\x83\xdb\xd7\xbc\x8c\x3b\xbe\x0b\x17\xb1\xda\xef\xb3\x7c\x8a\x58\x37\x0d\x14\x87\x38\x00\xc6\x41\xe7\x01\x90\xfc\x05\xec\xec\x7e\x79\xfe\x22\x4e\x03\xfb\x83\xc7\x90\xbe\x84\xaf\x57\x36\x00\xcd\xd3\x12\x47\xc5\xfc\xc3\x78\x5a\xed\x56\x08\x59\x46\x5a\xd5\xd7\x45\x42\x04\x48\x96\x01\xc6\x5d\xcc\x5f\xf6\x97\x5c\x43\x95\x5f\xa2\x94\x18\x52\x73\x68\x75\x9b\xbb\xc5\x50\x98\x50\x20\x26\x61\x5f\x7f\x64\xa8\x1b\x36\x98\x84\xa2\xd4\x07\xbd\x59\x03\xc2\x5d\xcc\x5f\xda\x7a\x7c\x70\xb5\x49\x47\x59\x0c\x14\x62\x67\x0f\x5f\x7c\xeb\x7a\x46\x35\x51\x6f\x23\xcd\x13\x47\x95\xa1\x88\x97\x82\x5d\x4e\x06\xa9\x0c\xc6\xfd\x27\x7f\xf9\x9b\x63\x95\xa5\x25\x8f\xec\xd2\x4a\x8a\xbc\x79\x3e\xac\x26\x2d\x28\x60\x57\x34\xd5\x7c\xbc\x37\x04\x93\x8a\x77\xe4\xe6\x6b\xdb\x3a\x30\x03\xcd\x5f\xc0\xda\xab\x9d\xcf\x5f\x10\xfc\x45\x4b\xfb\xaa\x93\x4c\x57\xb3\x51\xcd\x30\xf0\xce\x12\x71\x1d\xcd\xa2\x77\xb4\x58\x9e\x6d\x06\x90\x7e\xad\x46\x28\x38\xff\x36\x86\x4f\xf7\xd4\xcb\xc1\x2a\x91\xcf\x3f\x9f\x3b\xe9\xe6\x62\x12\x16\x0f\x54\x6f\x2c\x1d\x30\x49\x60\x7d\xfd\xf4\x65\x0c\xa1\xc4\x30\xe4\xdf\x96\xbf\x80\x0d\xed\x5c\xfe\x82\x73\x1d\x70\x5a\x76\x18\x14\xb0\x22\xfd\xc1\xae\x85\x4b\xea\xcc\x8c\x7c\x8b\x7f\xa5\xff\x8e\x88\xfc\x0b\x9f\x89\x30\xfc\x70\x0e\xa7\xf7\x4f\xc9\xdb\xae\x22\x7f\x71\xbb\x90\xbf\x14\xfe\x14\xe9\x4d\x5f\x1f\x55\xb5\xa5\x80\x8b\x79\xc3\xf8\x83\x11\x55\xb5\x5f\x7c\xa4\x77\x4b\x3e\x8c\xaf\x53\x10\x77\x48\x6d\xee\x4a\xae\x66\xf0\x5c\x88\x06\x0c\x22\xb9\xf0\x96\xd2\x65\x75\xfc\xe2\x76\x32\xc8\xcb\x1f\x1e\x2c\xc5\x1e\xf5\xd4\x73\xee\x13\xc8\x7a\x8d\x89\xab\xb5\x1d\x27\x5e\xc9\x45\x94\x8b\xf9\x8b\x30\x4d\x84\xd7\x83\x57\x4f\x1e\x2e\x55\x34\x8b\x8b\x1f\x9d\x66\xad\x1d\x34\x5a\x13\x86\xad\x69\x97\x55\xa2\x0f\xbc\xee\xbb\xbd\x7f\x25\xa3\xd5\xb9\xf0\xb1\x3c\x71\x93\xc7\x4c\x5c\xa2\x42\x55\xab\xd2\xdf\xe7\xc3\x9a\x10\x83\x4b\x8c\x7c\x88\xae\xc5\x3f\x9c\x41\x61\x45\xf6\xff\xf5\x3d\xff\x4a\x46\x7b\x31\x7f\xd1\xc9\xe2\x75\xd3\x7c\xad\x44\x97\xf7\x48\xc0\xcb\x8a\x91\x12\x23\x0a\xa6\x91\x67\xdd\x4d\x54\x45\xd6\x4a\x4a\x1e\xed\xb4\xe1\xe8\xca\xf2\x17\x30\x75\x2f\x5b\x6e\xef\x7b\x96\xa0\xea\x20\x3d\xa8\x5e\xae\xe3\x59\x8b\xaa\x51\xcf\x5a\x7c\xa5\x15\x5a\xf8\xd5\xe5\xb9\x65\xe6\x29\xdb\xe4\x70\x1e\xf4\x2a\x3f\x18\x07\x5c\x6e\x55\x76\x1a\x15\x68\x42\x05\x3f\x68\x2d\x0d\x8e\x91\xbe\x84\xcd\xe2\x66\x19\x6b\x83\x3d\xab\x41\x14\xe8\xbe\x4b\xcd\xad\x10\xa9\x08\x3d\xcd\x82\x70\xc0\xe5\xd6\x9c\x82\x44\xc8\xbf\xd6\x3e\xe8\x15\x95\x86\x8b\x4c\x93\x9b\x87\xcd\x57\x15\xe1\xb6\x1e\xbe\xe0\x83\x60\xbd\x86\x95\xf7\x75\xf2\xd0\xed\x3c\x08\x07\x5c\x6e\x5b\x61\x2d\x33\xc2\x7e\x62\x6c\xfb\x7b\xce\xb0\x14\xcc\x7b\xc4\x3b\x4a\xe0\xf6\x9e\x7c\x41\xe5\x7e\x11\x19\x66\x4f\xa4\x78\x13\xba\xed\x00\xe3\x3c\x45\xff\x1e\x9d\x3f\xf3\x98\x4e\xbb\x61\x3c\xef\x8c\x96\xbf\x2b\x37\xf7\x86\x6c\x4a\x36\x9c\x98\xd6\xde\x11\x21\x2a\x6f\x5c\x57\x8e\xfd\x7a\xa7\x28\x24\x7f\x01\xe3\xfe\xf7\xba\xef\x5f\xf3\xd5\x1f\x36\x5c\x60\xd3\xc8\x65\x06\xcc\x65\x48\x2b\x3c\xb7\x7a\x2a\xf9\x25\x72\x83\x17\x3d\x20\x7c\xfa\xe6\x20\xbb\x8a\xd8\x20\xf5\xd3\x67\x73\x1a\x54\x5d\x0e\xd9\xc7\x90\x91\x83\x71\x17\xf2\x17\xbf\xd2\xce\x68\xd8\x5f\x2b\x12\x9f\x62\x0d\xf3\x50\xbc\xad\x71\x6d\x99\x38\x66\xfa\x49\x24\xb7\x62\x49\xe3\x5f\x4b\x97\x42\x2f\x32\x83\x71\x40\x03\xb4\x6d\x89\xbc\xfc\xed\xd2\xf8\xc9\x43\x8f\x9d\xca\xa4\xf8\x76\x83\xb0\xd7\x86\xbf\x15\x50\x78\x54\x30\xbc\x4b\x52\x97\x8f\x53\x80\x5e\x90\x06\xe1\x80\x06\x08\x0d\x38\x96\xb0\xa3\x48\x0d\xac\x6f\x94\xfa\xa3\xca\xe2\x7e\x96\xf1\x9e\x54\xc5\xc6\x2d\x3a\x42\xa3\xa1\x7b\x8a\x9b\xd8\x21\x0b\xfd\x7b\x41\x38\xa0\x01\xad\xde\x79\x24\xb3\xb0\x73\x93\xe2\x16\x0e\x6f\x79\xbe\xa0\xf0\x99\x21\x1c\x86\xe5\xb0\xc3\x35\x67\xf0\xb4\x99\x1f\xec\x44\x88\x42\xf2\x17\x30\x0e\xda\xff\xe5\xcf\xf9\x0b\xd8\x94\x7e\x99\x02\x13\xc9\xd1\x79\xa1\x91\x15\x1d\x33\x04\xec\x5e\xdf\xa6\x6a\x99\xe9\x87\xd3\xd2\xe7\x66\xc3\x53\x45\x93\xcc\x02\x0b\x3f\x14\x65\x41\x86\x0e\xc6\x01\x15\x68\x57\x86\xf3\x25\xdf\x34\x24\xd9\x78\x64\xd6\x51\xb5\x23\xf8\x78\x2b\xd4\x78\xb2\xca\x67\xd9\x92\xe7\x70\x6b\x8e\x37\xac\x31\x0d\x52\x17\x8c\x03\x2a\xb0\x9e\xbc\xd6\x82\xdc\xf5\x9a\xfc\xec\x91\x05\xf7\x1c\xec\xbd\xbb\x9b\x37\x52\xcb\x8a\xb2\x6f\x14\x47\x65\xe8\x78\x69\x97\x36\x69\x43\x9f\xa7\x83\x70\x40\x05\xc2\xa8\xa9\xc8\x42\xda\x4a\x6f\x5d\xf7\x55\x6e\x1f\x61\x3e\x24\x92\xd6\x2c\x7e\xbd\xb7\xca\x53\xcf\x52\x09\x27\x1e\xae\x28\xf0\x11\x52\x17\x8c\x03\x2a\x10\x5b\x6f\x1a\xac\x58\xfc\xd5\xbb\x79\x97\x53\x9c\x96\x3e\x71\xb6\x68\xf1\x99\x20\x7a\x01\x42\x51\xe8\xb4\x78\x2b\x3e\x89\xa9\x39\x64\xcf\x0d\xc6\x41\xfb\x3e\xf0\xfc\xf9\xdc\x05\xb6\xbe\x5e\x1a\xc4\x57\x15\xd0\xc1\x3e\xdc\x12\x0d\x37\x43\x15\xde\xbf\xbb\x65\xc5\x6a\xf3\xb2\x2b\x38\xab\x1c\xdd\xa6\xc3\x43\xb4\x7d\x2a\xf3\x2d\x34\x88\x07\xe1\x80\x0e\x30\x94\x11\x0e\x79\x3e\x9f\x60\x90\xda\xd2\x37\xc6\xd7\x16\x3c\x39\xa4\x0a\xfa\x2e\xa1\x56\xb9\x21\xdd\x1d\xf2\xda\xc5\xbf\x89\x11\x52\x17\x8c\x03\x3a\xf0\x99\xfe\x4d\x1a\x0b\x8b\xb4\x78\x15\xbe\xcd\x34\xaf\xaa\x54\x89\x44\x97\xc8\xbd\xa0\xe4\x38\xae\x96\x3a\xd5\x6f\xc3\xd6\x06\xc3\xd0\xbb\x4a\x20\x1c\xd0\x01\x24\xb2\x7c\x97\xd5\x05\x11\xc2\x67\x4a\x81\xb3\x0b\xdc\x6f\x9c\x79\xf4\x17\x36\x8b\x4a\x47\x5a\x16\x61\xd1\x33\xe9\x68\xbf\xcc\x42\xea\x82\x71\x40\x07\x0c\x1d\xd5\x8f\xda\x84\x83\x4b\xc8\x3a\x5a\x58\xb4\x1c\xe7\x3f\x1a\xfa\xf3\xe3\x71\xd1\xe4\xf6\xc3\x0f\xdc\x63\xf6\x62\x2e\x98\x81\x38\x00\xc6\x41\xfb\x3e\x80\xe4\x2f\x60\x9b\x9d\xcb\x1c\xe0\x8f\xf5\xe1\xf5\x65\x77\xa3\x34\x60\x87\x2b\x57\xeb\x71\x91\xc2\x0d\x60\xad\x81\x39\xda\xac\xcd\xb8\xfe\xb3\x86\x50\x1f\x05\x15\x32\x76\x30\x0e\xe8\x40\x31\xd5\x43\x19\xc5\x3b\xf6\xb6\x44\x3b\x16\xb5\xa2\xcd\x0f\x7a\xed\xc9\x61\xa8\x48\x82\xdb\xb8\x7a\x42\x5d\xdc\x95\x3d\xf0\xe7\xa0\x77\x09\x40\x38\xa0\x03\x33\x9c\x9b\x6f\x9e\x4a\x19\x3a\x4d\x23\x9d\x11\xf3\x8b\xc2\xec\x08\xac\x6e\x9e\xdd\xf6\xed\x8f\xb9\xcf\x29\x77\x90\x4c\x55\x15\x06\xa9\x0b\xc6\x01\x1d\xe8\x56\x3a\x12\x09\xf0\xdc\xe8\xce\xa1\x33\x1c\x64\xfa\x24\x17\xb0\x7f\xc4\xa0\xef\x01\xbf\x60\xe1\xa1\x15\xb0\xd5\x46\xc3\x03\xdd\xbc\x80\x71\x40\x07\x64\xb5\xad\xf5\x1b\xcb\x8c\xc3\x23\xae\x93\x14\xf2\xc4\xaf\x33\xb6\xb4\x3a\xdc\x91\xb5\x68\x3a\x98\x4b\xd5\xd8\xd3\x45\x4b\x78\x0b\x71\x00\x8c\x83\xce\x03\x3a\x20\xfd\x5f\x40\x76\x9e\x97\x39\xd0\xbe\x2e\x16\x39\xd9\x48\xfb\x85\x5d\xe6\xce\x7b\x79\x9f\x6d\x61\xc3\xed\x28\xa1\xd9\x50\x1c\x31\x5c\x4c\x87\x55\xb8\x89\x99\x4e\xe8\x9c\x0d\xc2\x01\x1d\x90\xcd\xf4\xd7\x22\xaa\xc2\xd0\x65\xd7\xb5\xb3\x6c\x5b\x96\x9e\x7f\x33\x55\x91\x37\xf4\x4e\x63\x9d\x66\x46\xaa\x3c\xe1\xa3\x03\xb4\xaf\x0c\x18\x77\xe1\xfe\x4b\x40\xdf\x93\xd1\xa2\x11\x9d\xad\xf7\x58\xcd\xda\xcd\xb0\x62\xcf\xf0\xb5\x6b\x9d\xba\x69\x1d\xe9\x92\xaa\xe2\xa9\xee\x33\x2c\x43\xef\xbf\x80\x70\x40\x07\x62\xd9\xe5\xb0\xae\xdb\x9b\xcb\xd5\x08\x1f\xdf\x15\xd9\xaf\x21\x1b\x69\xdb\xfb\x62\xfe\xe1\x0c\xee\x91\xa1\x6c\x61\x9d\xe2\x08\xf4\xdd\x59\x30\x0e\xe8\x80\x3e\x17\x9b\x64\xe0\xd1\xf0\xb3\xbd\x07\xf3\xa3\x9c\x86\x2a\xbc\x0e\xba\x04\xf1\x1f\xef\xbb\xa0\xbf\xaf\x95\xfb\x80\x2b\xad\x9e\x0c\x71\x00\x8c\x83\xce\x03\x20\xf9\x0b\xd8\xd9\xfd\xf2\xfc\x05\x8e\x2f\x26\x60\x10\xc3\x75\xda\xa0\xf7\x75\xe0\x2d\x15\x4a\x2c\x03\x8d\xb9\xc6\xd9\x37\x9f\xef\x9c\x89\xf7\x74\x52\xad\x6c\xbe\x82\x64\x19\x60\xdc\xc5\xfc\xc5\x07\xcb\xd1\x6b\xc3\xc5\xce\xdb\x30\x1c\x66\xc1\xf1\xfd\xfc\xa2\x91\x66\x5c\x6c\x20\xf7\x6d\x4b\x18\xc6\xf9\xf2\xe6\xea\x40\x0a\x48\x65\x30\xee\x62\xfe\x12\x9c\xe9\x27\x8f\x39\xaa\xa0\xba\x6e\x1a\xad\x7e\xa0\x17\xd4\x3a\x8d\x54\x38\x38\x63\x7a\x62\x62\xfa\x5e\xeb\xec\x85\xc4\xab\xeb\x90\xca\x60\xdc\x7f\xf2\x97\xbf\xbd\x33\x56\xdb\x32\x57\xe1\x73\x1a\xad\x23\xf7\x6c\xa7\x73\xea\x87\x18\x42\x67\x37\xcb\x80\x9b\x6c\x50\x86\xf7\x93\x52\x7e\xe5\x95\x4f\x4d\xd0\xfc\x05\xac\x67\xfd\xf9\xfc\x05\xb3\x65\x1a\xef\x06\x19\xca\xc6\x36\xb2\x13\x9f\xab\x94\x03\x36\x7c\xfa\x7b\x59\xe2\x0c\x1a\xe3\x57\x1f\xef\x2a\x04\x88\xd7\x9f\xbf\x0d\x80\xbd\xa6\xb6\x88\x68\x97\xa8\xbb\x6c\xfc\x18\x4d\x22\x54\x0e\xb5\x94\x48\x91\x5c\x66\xb8\xe1\xe7\xeb\x59\xb1\x17\xfa\xe8\xf7\xb4\xff\x6d\xf9\x0b\xd8\xd0\xce\xf7\x7f\x01\xe6\x2f\x13\x34\xda\x3f\x94\x42\x13\x43\xd5\x56\xe5\x86\xa5\xf4\xc4\xfd\xa5\xd6\x95\x14\x24\xc9\x93\xbf\x8f\xae\x38\x55\x7b\x0c\x92\x5c\xc9\xfd\x97\xda\x0b\xf9\x8b\x1e\x7e\x1d\xba\x8e\x88\xaf\x46\x6d\xa1\xd6\xa3\x3d\x66\x1f\x81\x3e\x93\x1c\x01\x31\x29\xfe\x74\x5d\xc2\x3b\xd7\x13\x8c\xfa\x71\xaf\xe4\x6a\xc6\xc5\xfc\x05\x57\x6c\xb0\xbd\x72\x61\xb7\x7e\xa2\xa4\xf5\xe6\x94\xfa\xa9\x6b\x81\x65\xaf\x17\x6a\x16\x76\x6c\xbb\x2e\xa3\xca\xb3\x69\x97\x96\x2b\xb9\x88\x72\x31\x7f\xb1\xbb\xff\xa1\xa8\x00\x97\xa1\x81\x10\x9b\x01\x96\x28\x9e\xcf\x7a\x67\x21\x7f\xc4\x43\xa1\x87\xb4\xd8\x71\xac\x5d\x4c\x27\x24\xe0\x4a\x46\x7b\x31\x7f\xb9\xff\x79\xc5\xe6\xf9\xd1\xbd\x2f\x93\xc1\x2b\xa3\x66\xb4\xdc\x85\xed\xc5\x32\x88\xe5\x22\xcf\x62\x14\x61\x58\x66\x92\xbd\x78\x1e\x5c\xc9\x68\x2f\xe6\x2f\x35\x44\xf2\x5e\xf4\x91\x5b\xf8\x4a\x44\x0d\x55\xe4\x2b\x6c\x88\xd7\x1d\x48\x6e\xa7\xa2\xeb\x59\x7d\x72\x20\xc1\xb9\x6e\xc3\x19\x73\x65\xf9\x0b\x98\xba\x97\x2d\xb7\x85\xbc\xa7\x6a\x47\x3f\xa4\x1a\xd7\x92\x46\x06\x93\x55\x15\xa8\x68\xfa\x70\x64\x72\x8d\xc7\xae\x85\x2d\xdd\x38\x19\x92\x6a\x85\x1e\x91\xc0\x38\xe0\x72\xab\x23\xb8\x53\x79\xaf\x99\x8c\xcb\x00\xbf\x53\xec\x68\x55\x62\x42\x3d\xbd\xb7\x4d\xea\x81\x8d\xa4\xd8\x0b\xad\x3c\xf5\x1b\x46\xd0\x2d\x0c\x18\x07\x5c\x6e\x5d\x52\xd6\x1a\xe3\x8b\x7e\xac\x55\x84\xb7\xc1\xa9\x2b\x9a\x77\x3e\xf2\xe5\x47\x21\xa5\xdd\xfe\xb5\xe6\x94\x38\x80\xe1\x20\x04\x6d\xbd\x09\xc6\x5d\x78\xe4\x55\xe5\x5a\x5a\x0a\xc3\x58\x06\x1b\x7d\x62\xf5\x6e\x96\x6f\x75\x1b\xce\x54\x25\xd9\xa9\x01\x3e\x4a\x61\xac\x5c\x52\xb1\xec\x14\xfa\xc8\x0b\x84\xf3\x14\x85\x41\x39\x5f\x17\x47\x6d\x49\x5c\xf7\x20\xcd\x75\xe4\x7d\x35\x83\x7e\xcc\xd3\x93\xc6\x5a\xad\xc2\xd8\x08\xef\x93\x0d\x43\x81\xdc\xda\x92\xdb\x01\x90\xfc\x05\x8c\x83\xf6\x7f\xf9\x63\xfe\x02\x36\x8d\x5c\xfa\x06\x1a\x71\x0c\x96\x23\x0f\x7a\x5a\x33\x1a\x4b\x95\x51\xa6\x08\x96\x1e\x86\xa2\xb3\x8b\x23\x43\x86\x21\xef\x6a\x39\x17\x69\x37\xf4\xc2\x31\x18\x07\x34\x80\xd8\x38\xb7\x54\xa9\x22\xac\xac\x59\x7d\x99\x6f\x25\x8e\xea\xe3\x0d\x42\x34\xb7\x47\xe2\x37\xb2\xba\xfb\x2b\xdd\x1f\x3e\x3f\x21\x87\xd4\x05\xe3\x2e\x34\xff\x08\x1a\xab\xd6\x17\xc4\x41\x7a\xb1\xfb\x41\x96\x3f\x41\x55\x5c\xba\xbd\x97\x6c\x3b\xcd\xa8\xb7\xbc\x33\x9e\xb8\xb0\x38\x11\xda\x28\x19\x8c\x03\x1a\x10\xef\x32\x95\x5f\xc2\xd1\x02\xf7\xd8\x43\xb8\x21\xfa\xbb\x5b\x31\x05\xb3\xa5\xe9\x70\xb2\x2d\x0d\x81\x3a\xa2\x94\xa1\x17\x16\x1c\xa4\x2e\x18\x07\x34\xe0\x93\x25\xc7\xdd\xdb\xd7\x94\x0f\x3b\xba\x0d\xe3\xb9\x7a\xc2\x42\xcc\xee\x06\x74\x1b\xc7\xf8\x38\xc3\xd8\x66\xb7\xdc\x9e\x80\xed\x87\xe4\x2f\x60\x1c\xb4\xff\xcb\x9f\xf3\x17\xb0\x29\xfd\x32\x05\xfa\xce\x1c\xc4\xdb\x36\x2c\xb1\x10\x1e\x8c\xb2\x99\xca\x7f\x59\x16\xd7\x32\xe8\x69\x2e\x33\x7b\xa1\x21\x80\xbd\x9c\xf5\xf5\x1e\x74\x6f\x0c\xc6\x01\x15\x38\xf6\x0a\x0c\x7a\x5f\x27\x7a\x8f\x3f\x06\x13\x39\xe4\x71\x44\xa0\x50\xaf\xd7\x7d\x93\xa8\x82\x22\x55\xef\x67\xd8\x2c\xbb\x19\xd0\xcb\x6a\x60\xdc\x85\xde\xab\x27\x8a\x77\x32\x78\xa2\x9a\x7c\xbf\x6c\xd1\xd3\x1c\x7c\x22\x88\x1d\x23\xdb\xd0\xe7\x84\x95\xf9\xcc\x6c\x86\xb6\xf3\x33\x97\x19\xda\x7b\x15\x84\x03\x2a\x70\x7d\xf4\x14\x55\xb6\x3f\x5f\xdb\xa3\x3e\x25\x38\x8f\x49\x5c\xe4\xba\x74\x93\x18\x91\xa8\x9d\x16\xb3\x7f\x86\xea\x50\x8f\x3e\x16\xa4\x2e\x18\x07\x54\x40\xa6\x77\x03\x53\x0e\xe1\x88\x6d\x68\xff\x5b\xc6\xb6\x1b\x16\x06\x16\x0b\x61\xcc\xe6\xea\x6d\x82\xcd\x7d\x34\xa3\x44\x23\x58\x7e\xe8\x7b\x07\x20\x1c\xb4\xef\x03\x48\xfe\x02\xb6\xbe\x5e\xe6\xc0\xf0\x69\xa6\x0f\x6c\x17\x33\x0f\xf7\xa3\x96\x60\x46\x52\xb6\x3b\xd2\x7e\x5e\x44\x2f\x7d\x95\x2c\x5e\xa8\x13\x3c\x14\x4f\xa2\x9c\x84\xb6\x3f\x02\xe1\x80\x0e\x9c\x74\xef\xa6\x59\x08\xc4\xa3\xb3\x66\x33\xdd\xd0\xc3\xb1\x23\xff\xf0\xe4\xdd\xb7\x6e\xed\xf8\xc7\xdf\xc7\xc6\xac\x4f\xbb\xb6\x9e\x43\xea\x82\x71\x40\x07\x34\xfc\x1b\x47\x28\xe8\x3a\x38\x85\x58\xad\x2d\x77\x4f\x5e\xa3\x9a\x54\x31\xb3\x3f\x5f\xcb\x37\x4c\xae\x9b\x37\x76\xd4\xd1\xa5\x87\xf6\x4a\x06\xe1\x80\x0e\x94\x27\x37\x84\x1b\xfb\xc6\x0b\x08\x3c\xef\xf1\xfe\xf1\xec\x98\x6a\xa8\xc6\x25\xca\x6c\x6f\xcc\x2b\x91\xae\x26\x77\x23\xea\x1a\xb4\x9f\x27\x18\x07\x74\xe0\xf1\x7a\x94\xba\xb2\xc7\xd4\xa9\xef\x83\x32\xf7\xbb\x78\x39\x0e\xb5\x6c\x11\x4d\x6e\x31\x3f\xf4\x62\x92\x56\x4b\xee\xa8\x66\xf5\x43\x1c\x00\xe3\xa0\x7d\x1f\x40\xf2\x17\xb0\xcd\xce\x65\x0e\xc4\xc5\xc8\xce\xde\xe4\xb3\xde\xe0\xa8\x11\x66\x5e\x9c\x6e\xa4\xcb\x4a\x43\x36\xc0\x0a\xd7\xcb\xe4\xc8\x68\x42\xba\x93\x10\x94\x0e\x19\x3b\x18\x07\x74\x80\x23\xb8\x06\xe7\x78\xae\xd4\xee\x6b\xf2\xe7\xde\x57\xa6\xf2\xcb\xa8\xc1\x2d\x19\x2c\x98\x95\xd9\x93\xdd\xd8\xd7\xa7\x5c\x12\xf2\x20\x75\xc1\x38\xa0\x03\xdd\xd3\xa6\x22\x62\x96\x8f\x91\xb2\xa9\xb0\xb4\xad\x66\xc2\xec\x18\x02\x52\x73\xd0\x1d\xcb\x9b\xd5\xec\x5f\x26\x87\x3c\xa2\x84\x3e\x8c\x01\xe3\x80\x0e\x6c\xe9\x4f\x62\xca\xe8\x73\xba\xab\x72\xbe\x79\x39\x9a\xed\x39\x9d\x8b\xe6\x24\xfb\xe2\x39\x51\x23\x19\xba\x65\xbf\xb9\x76\xe1\x0f\x48\x5d\x30\x0e\xe8\xc0\xb3\xd3\xa8\x81\x1b\xb2\x6b\xeb\xec\x89\x64\x2f\x60\x7d\x6a\x32\x82\x8d\x14\xb9\x8d\x5e\xc7\x1d\x7d\xf2\x0b\x51\x53\xdc\x20\xcb\x87\x38\x00\xc6\x41\xe7\x01\x90\xfc\x05\x6c\xe7\x79\xe9\xbb\xa8\x91\xdb\x9c\x8e\x37\x50\x1e\xc5\xf6\x2f\x4f\xc1\xaf\xf8\x7f\xec\xe4\x8b\x72\x79\x11\xc0\x2c\x19\x32\xa8\x75\xcb\xdf\x4c\x53\x17\x7a\x57\x09\x84\x03\x3a\x90\xa1\x8f\xd3\x44\x96\xcf\xa7\x22\x7b\x5f\x64\xf6\x44\xed\x51\x32\xfe\xb5\xfa\xfe\x86\xa2\x2a\xe7\xb4\x01\x14\x0a\x94\x78\x22\xe8\xff\x57\x60\x1c\xd0\x01\x85\x1b\x06\x0e\x02\x43\xb4\xb0\x8c\x68\x47\x55\x43\x14\x82\x04\x1a\xfd\xca\x7b\x6e\x30\x2b\x4b\xfd\x5a\xcd\x19\x36\x63\x31\xd0\x07\x88\x60\x1c\xd0\x81\xbe\xad\x5b\x2f\x8d\x42\x4a\xf9\x1f\x3e\x74\x3c\x92\x3d\xe4\xec\x59\x45\x2f\xe0\x37\xf9\x9e\x65\x16\x9d\xf6\xe8\xb0\x8f\x7e\x85\x15\xba\x26\x82\x70\x40\x07\xe0\x59\x3d\x27\x50\x0a\xdf\x3f\x7c\xfa\xcc\xdc\xd0\x36\x46\x8a\xb6\x61\x53\x30\x40\x60\x01\xf7\xeb\x20\x8a\x73\xb7\xa6\xc9\x18\xb4\xff\x2e\x18\x07\x9d\x07\x40\xf2\x17\xb0\xb3\xfb\xe5\xf9\x4b\x61\x3a\x76\x93\x89\x65\x5d\x3a\xa6\xbd\x50\x7e\x61\xc6\x7b\x35\x32\xc2\xcc\x59\xae\x49\xf1\x93\x09\xd2\x86\x20\x78\xf7\x14\x25\x48\x96\x01\xc6\x5d\xcc\x5f\x5c\xca\x89\x64\x6e\xb3\xbc\x10\xdd\xd0\x6f\x4d\xe9\xc2\xe2\xa4\x4e\xdf\x1f\x21\xd6\x6c\x6f\xfe\x1c\x68\xdf\xf9\xe9\x59\x0f\xaa\x1a\xa4\x32\x18\x77\x31\x7f\xa9\x92\xc7\xb5\x79\xb3\xcd\x88\xb4\x2e\xb7\xc1\xd4\x83\xa8\x2a\xf5\x35\x23\xd8\x7f\x63\x1c\xf7\x8b\x32\xc7\xa4\x7c\x42\xf5\x67\x4c\x48\x65\x30\xee\x3f\xf9\x0b\xc5\xf9\xca\xae\x7c\xe1\xa9\x6e\x02\x1f\x10\x0c\xf7\x45\xb1\x52\xbb\x64\x8f\x87\x07\x62\x97\x9b\xb1\x4d\x87\xac\x0c\x3f\xc4\x6f\xec\x78\x64\x41\xf3\x17\xb0\x9f\xec\x3b\x9f\xbf\x8c\xf3\x28\xdf\x1a\xd7\x1c\x3f\x9a\xdc\x47\xf3\x1b\x5a\x7a\x56\x98\x9a\x29\x3c\xee\x29\x8d\xe6\x2d\x6c\xd0\x37\xb8\x31\xc7\x1e\x74\x0e\x35\x59\x17\xd6\xfa\x16\xfc\xe5\x13\x83\x45\x13\x96\x13\x32\x5b\xfc\xe8\xac\x84\x3c\x95\x05\x72\x9d\x2a\x33\x81\xdc\xab\xdb\xd3\x68\xff\xb6\xfc\x05\x6c\x68\xe7\xfb\xbf\x00\xf3\x97\x07\xa5\x2a\xa5\xd9\xfc\x83\xae\x7d\xed\xf9\xf7\x34\x0d\xe0\x0e\x09\x48\x53\x0b\x30\x6b\x83\xf0\x3c\x52\x5e\xbf\xcf\xae\x7c\x31\x7e\x15\xf9\x0b\x8c\x2c\xf0\x8c\x1e\xcf\x8e\xf1\x6a\xf7\xed\xdc\x2c\xa3\xb2\xbe\xf9\xae\x3e\x3b\xa6\x33\x59\xe9\xbb\xc0\xc5\x57\x8f\xcd\x0b\xbb\x37\x18\x6f\x92\xdf\xbf\x92\xab\x19\x17\xf3\x17\x3c\xc2\x0e\xc1\x53\xc2\xfc\xc3\x37\x9f\x1b\xf2\xea\xec\x5a\x7b\x13\x09\x05\x1a\x5e\x71\xd9\x3d\x5b\xac\x7c\xd0\x40\x22\x25\xd3\x77\x25\x17\x51\x94\x2e\x7c\x2c\xe1\xad\xd5\x75\x83\xfa\x82\xd9\x49\x4b\x91\xfe\x59\x11\x5d\xdd\x87\xf2\x2b\x6c\xe2\x1f\x97\xcc\x44\x58\x57\xda\x28\xcc\x38\x66\xaf\x64\xb4\x17\xf3\x97\x07\xed\x5c\xb2\x37\x51\x6a\x1e\xb0\x60\x6e\xb6\xe4\xbd\x2b\x28\x09\x5a\xfb\x58\x70\xe3\x67\xd5\x60\x80\x6a\xdf\x69\x58\x68\xe7\xf1\x95\x8c\xd6\xe9\xc2\xc7\xa2\x06\xa7\x7c\xde\x72\x49\x7e\xdc\x71\x6a\x50\x42\xe8\x7d\x1c\xf0\xd4\x0e\x49\xf7\xc1\x13\x7f\x8e\x1a\xfe\x00\x82\x74\x4d\x06\x9b\x2b\xcb\x5f\xc0\xd4\xbd\x6c\xb9\xcd\x2c\x65\xdf\x31\xf0\x8a\x21\xd4\x17\x35\x31\x1b\x2e\xdc\x4e\xc8\xcd\x8e\xc7\x79\x67\xf5\x3a\x64\xba\xb4\x67\xfe\xa7\xa6\x90\x08\x64\x99\x01\xe3\x80\xcb\x6d\xa9\x9d\x9c\x5d\x83\x44\x65\x6b\x47\x43\x8a\x40\xd7\x0f\x94\x82\xbc\xe3\x58\xfb\xcd\x36\xd4\x0a\xaa\x03\x62\x54\xe6\xb3\xc0\x09\xe8\x6b\xc4\x20\x1c\x70\xf9\xaa\xf7\xf3\x3e\xcd\xa0\xcf\x5c\x9a\x5f\x18\x0a\x71\x0a\x89\xcc\xe1\xc8\x96\x52\x09\xa5\xe4\x45\xd0\xee\x08\x10\x18\xd6\x4e\xd3\x81\xd4\x05\xe3\x80\xaf\xe5\xde\x6a\x5d\xe1\x5f\xf3\xa8\x09\x67\x1b\xe4\x79\xe1\x87\xe4\x7d\x42\x95\xf9\xb6\x20\x30\xbb\x93\x70\xf2\x50\x3d\x11\x2e\xaf\x11\xfa\x56\x0b\x18\x07\xfc\x1e\xc2\x96\xe5\xa2\x8f\x1e\xf4\xa5\xa2\xf1\xce\x7e\x7a\x4b\xa4\xfd\x2c\xbb\xb8\xd0\x43\x4e\xa1\x5f\x4a\x10\xcf\xeb\xed\x58\xc0\x31\xf4\xfd\x23\x30\x0e\x72\xff\x25\xe8\x8f\xf9\x0b\xd8\x34\x72\x99\x01\x28\xd9\x23\x63\xd9\xd7\x69\x8f\x72\x2a\x02\x4a\x18\x8b\x54\x6b\x8e\x67\xc6\x49\x24\x69\xf2\x5a\x5f\x9b\x06\xb9\xbb\x58\xbc\x1c\x82\x8c\x1c\x8c\x03\x8e\x5c\xd4\x7d\x6c\x64\x3b\xc9\x68\xd6\xc7\x09\x87\x1c\xeb\x49\x8f\xce\x71\x5d\xb9\x0d\x4c\x29\x7c\xc5\x48\x68\xfd\xd9\xbd\xe9\xb0\x1c\x48\x5d\x30\x0e\x68\x00\xc7\x4d\xb3\x85\xd7\x2d\x37\xdb\x6c\xcd\x75\x93\xcb\x46\xfd\x6e\xd3\x89\x60\x0f\xf5\x1b\x30\xb4\xa2\x3e\x69\x7f\x39\x56\xf7\x00\x7a\xe1\x18\x8c\x03\x1a\xe0\x8a\x83\xe4\xb0\x5b\xd7\xa6\xbc\x6c\xd5\x96\x4b\xc3\x66\xd4\x81\xf7\x63\x36\xb4\xf4\x6b\x01\xa1\x8d\x80\x2b\x1c\xea\xcc\x2e\x21\xa4\x2e\x18\x07\xfc\x1e\xf4\x19\x1c\x8a\x75\xde\xf5\xd0\x1b\x46\x6b\x7d\x5f\xd8\x5b\xc7\x6b\xc5\x22\xdb\xc9\xd4\x93\xae\xab\xe9\x65\x63\x80\xc7\xcf\xb0\x86\xe4\x2f\x60\x1c\xe4\xfe\xcb\x5f\x8b\xc7\x1f\x14\x00\x9b\xd2\x2f\x53\x60\xad\xd1\x92\x33\xb4\x62\xeb\x87\x4b\x12\x92\x87\xce\x17\x4e\x56\xbb\x8c\xd7\x5c\x1c\x0c\xf6\xdc\x94\x01\x7e\x36\xc4\xdd\x3a\xd4\x90\xa1\x83\x71\xc0\xa1\xa7\x4c\x4f\x4e\xa0\x68\xbd\xd3\xaf\x6d\xc1\xf8\x34\xa6\xce\x74\xc7\x75\xab\x2c\x67\xfa\x03\x9f\xce\x7c\x25\x9c\x86\xa5\x7a\xf2\x0c\xa4\x2e\x18\x07\x54\x40\x74\x41\xf8\x91\xe4\x56\xd6\x40\x88\x8e\xe5\x07\x98\xf5\xde\xbe\x37\x8b\xfa\x79\x15\xa5\x09\x5b\x81\x9f\xab\xfb\x07\x26\x68\xa0\x21\x2c\x18\x07\x54\x40\xa1\x2a\xc8\x01\x3b\xeb\x0d\xd9\x3d\x52\xf9\xbb\x05\xe9\x70\x66\x5a\x12\x7a\x8d\xea\xfc\x65\x75\x59\x42\x2b\xac\xee\xa7\x0f\xa0\xef\x35\x81\x71\xc0\xef\x41\xad\xa7\x75\xf8\x65\x0a\x61\xfb\xc4\x8a\x45\x3b\x7f\xd1\x82\xc1\xe7\xef\x08\x19\xf3\xe3\x6e\xf6\x67\x5f\x3e\xa1\x99\xa0\xdf\x5e\x81\xec\xb9\xc1\x38\xe8\x33\x4f\x90\xfc\x05\x6c\x7d\xbd\xcc\x81\xbb\x95\xa7\xb7\x24\x5e\x7a\x7a\xac\x7d\x78\x62\x4d\xf7\xd3\xe3\xed\xc6\xe9\x0d\x75\xef\x97\x44\x4f\x64\xa2\xdc\x5f\xbb\xe6\x38\x97\x43\xc6\x0e\xc6\x01\xc7\x7e\xed\xed\xbb\x1b\xa5\x07\xfc\x61\xe5\x06\x4b\xe5\x65\xa7\xe6\x0c\xb2\x5f\xb9\x94\x76\xc7\x92\x64\x0e\xc8\x2b\xeb\x84\xee\x0b\xf2\x40\xea\x82\x71\x40\x07\xcc\xf9\xcf\xda\x0a\x04\xeb\x8d\xd2\x30\x7b\xed\xb7\x32\xeb\xa7\x13\xf6\x72\x11\xb1\xbf\x19\x7e\x94\xe0\x68\x69\xe1\x21\x9d\xde\x86\x5e\x84\x04\xe1\x80\x0e\x34\x68\x4b\x07\x39\xbf\xb4\xc1\x76\x4e\x71\xe7\x95\x3a\x58\x7c\x76\xfc\xaa\x19\x9d\x16\xeb\xbd\xd9\x50\x90\x52\xb3\xa1\x95\x17\x31\xa4\x2e\x18\x07\xfc\x1e\xfc\xb9\xdf\xd6\x0e\xfe\xaa\xb3\x9f\x66\x3c\x78\xef\xf1\xba\x8c\x8b\x73\x5f\xf3\x00\xdf\xde\xf5\xf9\x74\x20\xd3\x4c\x05\x81\x48\x13\xc4\x01\x30\x0e\x7a\xf7\x41\xe9\xcf\x0e\x80\x6d\x76\x2e\x73\x40\x47\xb7\x9c\xa1\x14\xed\x7b\xc3\x7d\x26\x73\xa9\x03\x5d\x7b\xb6\x58\x2e\x58\xc4\xb3\xe9\xdb\x83\xcb\x08\xcf\xad\xfd\x6e\x72\xc7\x41\x1f\x9a\x80\x70\xc0\xb1\x37\x0b\xbd\x76\xa0\x96\xe1\xc6\x5f\xf5\x25\x72\xf5\xec\x7f\x99\x21\x5e\xc5\xdc\x38\x37\x53\xb3\xb3\x6e\xc8\xd0\xb5\x33\x6e\x0c\xbd\xaf\x06\xc6\x01\x1d\x50\xca\x41\xf1\x9a\x6a\xab\x67\x4b\x9b\x41\x69\x47\xf5\x0d\x15\x0b\xb5\x8b\xa5\xd1\xa0\x6a\x84\x79\xfb\xa4\x46\x3a\x5b\xeb\x89\x1e\xb4\x5f\x30\x08\x07\x74\x00\x46\x00\xe9\x59\xf3\xe7\x1b\x4c\xe8\x37\xcc\x0e\x33\xba\xd7\x2c\xb5\x9a\xec\x78\x47\xe0\x55\x32\x91\x88\xef\x8b\xde\x93\xd3\x83\xfe\xbd\x60\x1c\xf0\x7b\xe8\x9b\x42\x65\x7c\x5f\x91\xe8\x60\x66\xdc\x2e\x6a\xbd\x47\xb4\x7d\x27\x79\x6a\xa4\x90\x93\xbb\x53\x52\x81\xbf\x97\xde\xc0\x34\x00\xe2\x00\x18\x07\x9d\x07\x40\xf2\x17\xb0\x9d\xe7\x65\x0e\x0c\x0e\xde\x44\x77\x9d\x0a\x1c\x8a\x0c\x21\xb6\xb2\xac\x51\xeb\x89\x51\x46\x4e\x44\x39\xc2\xb1\x1c\x52\x7a\x61\x22\x6d\x8b\x08\x7d\x5f\x10\x8c\x03\x8e\x5d\xcc\x22\x6c\x37\x85\xad\xe8\x41\xed\x54\x3b\xc9\x2d\xd7\x8d\xfd\x3b\xe9\x48\x12\x2f\x8b\x69\x6a\xec\xd0\x19\x36\xa9\xa5\x27\xa9\x20\x75\xc1\x38\xa0\x03\x06\x5d\x1f\x09\xac\xac\x57\x62\xd6\xd4\x3a\xbc\x47\x93\xf2\xa8\x7d\x83\x6f\x92\x70\xff\xd2\x5f\xae\x90\xf0\xb2\x22\xfc\x92\x0d\x7d\x70\x06\xc6\x01\x1d\x48\x0f\xe4\xc3\xf9\xa5\xd7\x6b\x41\x66\x33\xd5\xd8\x53\xe3\xa3\x61\x95\xf2\x91\xd9\x48\x49\x95\x64\x96\x62\x91\x92\x52\xd6\x04\xfa\x6e\x1b\x18\x07\xfc\x1e\x9a\x4a\xf0\xa5\x27\xe8\xc2\x2d\xb7\xa5\xfa\x78\xb3\xe7\x83\xec\x5f\x8a\xce\x7d\x0a\x99\x9e\xec\x47\x60\x85\x4f\x74\x31\x7f\xe0\x0c\x71\x00\x8c\x83\xce\x03\x4e\x7f\xce\x5f\xc0\xce\xee\x97\xe7\x2f\x0b\xe5\xdb\x09\x1f\x16\x92\x17\xdc\x34\x99\x6e\xbc\x7b\x3e\xa0\xdc\x38\x60\x58\x30\x4f\xfe\x4b\x8c\x58\xef\x66\x4b\xf0\xba\x77\x22\x24\xcb\x00\xe3\x2e\xe6\x2f\xad\x95\x0d\xf6\x71\xb8\xc8\x85\x56\x4f\x2b\x42\x6f\x98\x3e\x16\x52\xda\xce\x44\x2e\x0b\x62\xe3\xf0\xd0\x16\x65\xe8\xd5\x7e\xa6\x00\xa9\x0c\xc6\x79\x8a\xc3\xe0\xfc\xbd\x72\x02\xf1\xb1\x1d\x96\xb7\x70\x35\xa9\xc1\x36\xdb\xea\x8b\xf2\x6a\x4e\x2e\xc4\x2d\x3a\xbf\x21\x2d\x52\xd1\xc6\xe0\xb7\x73\x77\x72\x20\x95\xc1\x38\x4f\x71\x14\xc0\xb7\xf1\x8f\x7f\xff\x08\xc9\xff\x86\xb6\x16\x17\x7f\x44\x60\xf6\x9b\x5c\x8b\x64\xa1\xaa\x6f\xe6\xd3\x9f\x9f\x92\x48\xa9\xf0\x61\x9b\x0c\xe7\x08\x33\xd2\x9c\xcf\x5f\xde\x8f\x7a\x4a\xa6\xbc\xf0\xe1\x1c\x7e\xfe\x16\x9b\x91\x2e\x8a\xc1\xf1\xfb\x0f\x35\x63\x1f\xbc\x6a\x37\xd3\x23\xf2\x53\xfc\xd5\xa2\xf3\xff\x1a\x42\x45\xc1\xdf\x26\x4d\xd0\x64\xe3\xf1\xb9\x5a\x33\xe7\x9e\x3d\x5b\x8a\x1c\xc2\xb2\x53\xfd\x22\x39\x8e\xc4\x11\xba\x49\x51\xf0\x6f\xcb\x5f\xc0\x86\x76\xbe\xff\x0b\x30\x7f\xa9\xe2\x16\x51\x40\xad\x8e\xf7\x80\x47\xcf\x6c\x96\x1a\x8e\x8f\x2d\xf4\xa5\xb6\x95\x7f\x90\x15\x3c\x41\x7d\xe4\xd0\xc3\x94\x61\x7a\x15\xf9\x8b\xf0\x85\xfc\x85\x7f\xb5\xe9\xf3\xa1\x83\x9c\xf1\xda\x4f\xfb\x00\x53\x5f\x24\x9c\xf4\xf0\xdc\x12\xa1\xc7\x81\xde\x28\xe3\xf1\x51\x27\xaa\xc4\x5f\xae\xe4\x6a\xc6\xc5\xfc\x45\x5b\xa9\x23\xf9\x0b\xcf\x13\x5a\x76\x5f\x51\x73\xe6\x95\x6e\x2f\xe1\x46\x7f\xb4\x54\x82\x5c\x0c\xf9\x87\x73\x52\x2e\xed\xaf\xb5\xaf\xe4\x22\xca\xc5\xfc\x65\x81\xbe\x8f\x61\x37\x3d\x10\x53\x26\xa3\xaf\xbe\x7e\x3e\xe7\x1d\x5f\x91\x60\xe8\x73\x2e\xf9\xd7\x6b\xd4\x6f\xba\x46\xe2\x4c\xe3\xae\x64\xb4\x17\xf3\x17\xd4\xb7\x41\xfb\x73\x66\x2e\xb5\x0c\xf6\xd9\xed\xfb\xd2\x42\x15\x3c\x28\x56\x5e\x6e\x1d\x42\x28\x18\x46\x9d\x5f\x15\x5b\xc9\x16\xae\x64\xb4\x17\xf3\x97\x0a\x22\x2a\xe5\x81\xd2\xd7\xfa\x1d\xe8\x5c\xf1\x8e\xb2\x2d\xaa\x77\x95\xb7\xf4\x84\xa6\xe3\xe8\x8c\x45\x8d\x70\x93\xdb\x72\x76\xae\x2c\x7f\x01\x53\xf7\xb2\xe5\xd6\xef\xc1\x0e\x6c\xf5\xbd\xfd\xe5\xfd\x84\x71\xc6\x34\x63\xb9\x39\x37\x9e\xd1\xbb\x8c\x56\x39\x47\x92\xf6\xb8\xac\xb4\x5e\xad\x55\x90\x65\x06\x8c\x03\x2e\x33\xd6\x53\x64\x30\x62\x1e\x11\xad\xd8\x70\x6a\xb6\x59\x23\x03\x73\x27\xde\xf3\x7a\x22\xe2\xcc\xc4\x1d\xf3\x04\x7d\x2a\xaf\x3f\xc1\x42\xea\x82\x71\xc0\xe5\xf6\x23\x73\x3f\x65\xbb\x61\xed\xd7\x5b\xb0\x55\xa9\x26\x33\x93\x47\x14\x5d\x37\xfa\x30\xe3\x9a\xc7\xb2\xad\x57\xe2\x1a\x9a\xc4\xef\x42\xea\x82\x71\xc0\xe5\xb6\xd0\xb2\x32\x9f\x26\x79\x2c\xa1\xd6\xc5\x77\xab\xb9\xcc\x8f\x9a\x44\x01\xa5\xa7\x75\x3f\x95\xc6\x48\xf9\xfa\x6a\x2e\x1c\x07\xf4\x31\x0a\x18\x07\x7c\x3c\xe3\x45\x33\xcd\xb3\xec\xc0\x51\x53\x88\xb1\x5e\xc0\x36\x27\xb6\xcf\x31\x1c\x2f\xba\xc7\x44\xe6\xdc\x89\x74\xa3\xb0\xe9\x34\x64\x1f\x92\xbf\x80\x71\x90\xfb\x2f\x5d\x7f\xcc\x5f\xc0\xa6\x91\xcb\x0c\xf0\xcf\x52\x0f\x7b\x41\x58\x9e\xf3\x2e\x5f\x0f\x97\xae\x52\x26\x7f\x8a\xd5\x1e\xa7\xd8\xdd\xc9\x64\x46\x6d\x3d\x4e\x07\x93\x31\x05\x32\x72\x30\x0e\x68\xc0\x2d\xb6\xea\xf8\x05\xbe\xb9\x40\x1e\x18\xa5\x91\xe2\x5c\x31\x39\xf2\x38\x83\x46\xbe\x6d\xfe\x09\x7c\xcd\x5d\x43\x0a\x23\x7f\x1c\x68\xa2\x05\xc2\x01\x0d\x58\x8f\x85\x4d\xae\x82\x73\x9b\x6a\x6c\x09\x3d\x10\xe5\x90\xc2\xfd\xf8\x9d\x8e\xe9\x6e\x8a\xe2\x44\x49\xe3\xfc\x81\x02\xef\x38\xf4\xe0\x05\xc6\x01\x0d\x20\x7e\x99\x5d\x63\x3b\xf4\x40\x26\x5a\xf5\x54\x35\x05\x7e\xdc\x41\x89\xe9\xed\xba\x65\x6d\x60\xbd\x58\xca\x00\x1a\xfd\xc6\x2c\xf4\x7d\x29\x30\x0e\x68\x00\x47\x1c\x46\x56\xd6\x63\xaf\x40\x04\x3d\xcf\xa8\x13\xd5\x87\xfa\x15\x46\x07\x1e\xd8\x0a\x4f\x70\xdd\xc3\x56\xeb\xe9\x7a\x4c\x5e\x41\xf2\x17\x30\x0e\x72\xff\x45\xf8\xcf\xf9\x0b\xd8\x94\x7e\x99\x02\x22\xb5\x16\x6b\x49\x8d\x92\x53\x30\x03\x23\x26\xd6\x21\xf8\xf0\xfe\xc5\x7e\xb3\xaf\x24\x29\x68\x38\xf3\x9f\x2c\xb0\xac\x7c\x83\xfe\x54\x38\x18\x07\x54\xa0\x75\x5f\x32\x0f\x71\xe9\x27\x42\xa7\x39\x13\x56\xc6\xc9\xa9\x6a\x47\x97\xad\x84\xc6\xe7\xdb\x39\x4f\x83\x34\xee\x97\x74\x75\x7d\x86\xbe\xd4\x07\xc2\x01\x15\xb0\x51\x28\x73\xfa\x75\x26\xa4\xc7\x26\x18\x5c\xe8\x66\x31\xed\xc4\xeb\xc9\x2d\xa0\x3b\xbb\xd9\xa7\xc0\xcc\xaa\x37\x4b\x2c\x08\xfd\x8d\x60\x30\x0e\xa8\x40\x35\x4e\xb8\x0d\x32\xf6\xb5\xe0\xe6\x0d\x39\x45\xba\x98\xda\x80\xe7\x44\xa7\xc2\x61\xf6\x1c\x92\x2a\x52\x33\xd3\xfd\xbe\x8b\x09\x90\xba\x60\x1c\x50\x81\xb5\x43\xdd\x18\xce\xcc\xd1\x24\x79\xd7\x2a\xdd\x54\x9a\x87\x73\xb4\xb7\x9d\x1f\x7f\x55\x6a\xd7\xb4\x8d\x6c\xa5\xbb\xcf\x29\x83\x0a\xd9\x73\x83\x71\xd0\x67\x9e\x20\xf9\x0b\xd8\xfa\x7a\x99\x03\x65\xde\x9a\x2a\x44\xc4\x52\xe8\x2e\x05\x81\x3a\xed\xa5\x9a\x2f\xe0\x7f\xb9\x21\x13\xfe\xa0\x9a\xa0\x0c\x3f\x81\xf3\xe8\xc3\x80\x9e\x65\xc1\x38\xa0\x03\xbf\x82\x5f\x11\x14\xf0\x4c\xdd\xf3\x1d\xbe\x59\x28\x88\x16\xb2\x22\x3c\x53\xed\x1c\x25\x7d\xa2\x9c\xdb\xa8\x14\x74\xea\x7b\xbd\x1b\xfa\x7e\x00\x08\x07\x74\x20\x32\x83\xbe\x13\x51\xda\x2a\xf2\xfa\x99\xe1\x7a\xe7\x49\x40\xff\x7c\x94\xc6\x48\xc1\x48\x5b\x82\x16\xd7\xd8\x57\xd7\x43\x65\x16\x48\x5d\x30\x0e\xe8\x00\xcf\xdc\xe7\x64\xdc\x8f\x77\x09\x39\x67\x59\xef\x28\x9f\xa1\x1a\xa1\x39\x2f\x1a\x27\xf9\xe2\xb7\xbf\x58\xa5\xab\xf2\x95\xae\x92\x84\xd4\x05\xe3\x80\x0e\xc4\x6e\x97\xb5\xbf\x68\x74\x21\x8b\x79\xd5\x6a\x58\xb9\x79\x82\xae\xf3\xe8\x90\xd8\x27\xb0\xfc\x0c\xef\x1b\x41\x31\x91\x72\x71\x36\xf4\x1d\x34\x10\x0e\x7a\xf7\x01\x24\x7f\x01\xdb\xec\x5c\xe6\x80\x5a\x6b\x0f\xac\x97\x17\x81\xc8\x4f\x24\x1c\xf7\xfc\x14\x0b\x33\xc5\x33\x3f\x58\x02\xfd\xaa\xdb\x3d\x5e\x5c\x91\x76\xac\xdd\xb5\x90\xb1\x83\x71\x40\x07\x62\x23\x10\x69\x6e\xf2\xb6\x29\xc9\x69\x28\xbc\x5c\xb1\x0e\xc0\xa8\xb5\x24\x91\x30\x6a\x8b\xae\x2a\x4a\x60\x5a\x2b\xc8\xdc\xc9\x85\xbe\xcb\x01\xc2\x01\x1d\x20\xa7\xca\xe0\x7a\x81\x4b\xf1\xc6\xd3\x90\x05\x5b\xce\xee\x33\x5b\x85\x3f\xf6\x27\x2f\x1b\xfb\xf6\x0d\x6d\xa9\x23\x75\xd3\x7d\x5a\x48\x5d\x30\xee\x42\xaf\xe4\xd8\xca\xc1\xd6\x16\xc9\xe5\xc0\x2e\x12\xce\x77\x95\x21\xd8\xb7\x99\x0c\x3b\x19\xd4\xb4\x93\x5e\x1e\xa5\xb1\xb3\x76\xf8\x42\xef\xc1\x81\x71\x40\x07\x34\xb3\x5d\xf5\xfa\x96\xdd\x86\x5d\xfb\x5b\x3f\x8e\xdd\x64\x33\x75\x3e\x25\x21\x68\x9b\x75\xa1\xe0\xa0\xbd\xbb\x71\xeb\xc1\x73\x64\x88\x03\x60\x1c\x74\x1e\x00\xc9\x5f\xc0\x76\x9e\x97\x39\x60\x33\x46\x49\xa4\x9b\xb2\xf7\x58\xcd\x18\xfd\x91\x7d\xa9\xe1\xd1\xc7\xe7\xd2\x62\xaa\xb0\x24\xdf\x14\xbb\x3e\xd5\x75\x54\x93\x42\xfb\x65\x83\x71\x40\x07\xe2\xa8\xa3\x9c\x72\xcc\xfa\x78\x14\xa3\xbf\x90\x0f\x48\xdc\x1d\x11\x55\x76\x2c\xbb\xc6\xf6\xe6\xd4\xcf\x73\x78\xf1\xe1\xa6\x6d\x31\xf4\x6e\x15\x08\x07\x74\xc0\xf8\xd5\xb3\x6f\xbc\x95\x4d\x08\x44\xa2\x23\x15\x04\xfc\x3c\xb5\x48\x42\x12\x71\xbb\xd9\xcb\x79\x67\x9d\xf0\xb7\x9c\x07\xf1\xfb\x21\x75\xc1\xb8\x0b\x8f\x63\x12\x7c\x30\xcd\x5b\x96\x9f\x5f\xab\x3a\xa3\x9d\xb8\xb9\x7c\xdf\xf1\x41\x31\xd9\x11\x61\xea\x9e\x06\xcc\x20\x5c\x37\x0d\x52\x19\xf4\x71\x0c\x08\x07\x74\xc0\x9b\xf4\x73\xaf\xe1\x31\xd7\x72\x55\xab\xbe\x69\xfa\xa3\x50\x98\x2e\xd9\xa6\x02\xcf\x77\x7d\x9d\xcc\x67\x52\x7c\xe4\x36\xe2\xe9\x10\x07\xc0\x38\xe8\x3c\x00\x92\xbf\x80\x9d\xdd\x2f\xcf\x5f\xea\x68\x33\xc7\x6b\x56\x9a\xdb\x93\x1e\x0e\xd6\xfa\xfd\xb8\x43\x73\x87\xce\xa0\xc3\xb9\xc9\x30\x86\xd0\xa2\x44\xc2\x6d\x24\x37\x14\x92\x65\x80\x71\x17\xf3\x17\x38\xd7\x32\x3c\x4f\xef\xfb\x32\x30\xdb\x9d\xd7\x4c\xd9\x08\x5d\x65\x1f\x8e\x4d\xe0\xf4\xb5\xb8\x8c\x1e\x33\x17\x27\xa5\x30\xe4\x41\xdf\x6c\x02\xe1\x2e\xe6\x2f\x37\x88\x6b\x0b\x6e\xda\x0d\xdf\xe2\xe3\x17\x48\x2a\xda\xaa\xb4\xfb\xe0\x2b\x15\x05\xeb\x6c\x7c\x5d\xd7\x86\x68\xbb\xbd\x22\x5c\x02\x52\x19\x8c\xf3\x14\xa7\x00\x7c\x1b\xff\xf8\xf7\x8f\xe2\x8f\xde\x99\x0e\x79\x15\x7d\xe3\xe6\x3f\x79\x62\xce\x11\x36\x8d\xa2\xea\x5a\x87\x77\xf4\x92\xa0\x09\x83\x67\xbc\xd1\xc2\xc2\xe4\x7c\xfe\x92\x26\x73\xe7\x5d\xb4\xab\xfa\xd7\xe8\xca\x89\xf6\x7b\x5c\xd5\xd4\xc1\x54\xe1\x85\xd7\x52\x02\x91\xe7\xc5\x4a\x2d\x45\x06\x17\xcf\x37\x3a\xc1\xbb\x45\x58\xbf\xf5\x04\x56\x49\x76\x1c\x6d\xd9\xd1\xff\x1e\x2d\x6d\x39\xd3\x54\x35\xcb\xc1\x36\x92\x49\xf8\xaa\x46\xda\x8c\xcc\xbf\x25\x7f\xd9\x47\xfc\x67\x43\xfb\xbf\xfc\x45\x0c\x46\x14\x78\x5c\x26\x1b\xa1\x50\x95\x09\xae\xd8\xeb\xda\xe5\x62\xdf\x5e\x8f\x36\x46\xf2\xa5\xa8\x30\x66\x9b\xc8\xd5\x66\x2e\xfa\x90\xc1\xd8\x73\xed\x2a\x02\x18\xb7\x0b\x01\xcc\x07\xb1\xad\xaf\xfe\x47\xf4\xe8\x2d\xdd\x31\xb4\x13\xf0\xb7\x76\x85\xf1\xfd\xb2\x0b\x77\x27\x62\x85\xf2\xe9\xb2\x36\x4f\xb4\xec\xae\xe4\x6e\x06\xef\x85\x6c\x20\x57\x66\xa9\x84\xab\xbe\xcd\xf8\x56\xe5\x28\x42\x31\x0f\x7a\x67\x72\xea\xac\xf5\xe9\x6d\xf4\xb2\xeb\x78\xcf\x7b\x6a\x0c\x2a\x59\xaf\xe4\x26\xca\xc5\x00\xe6\x15\xd2\xbb\xd9\x09\x5b\xe5\x13\xf4\x90\xa4\x00\xe4\x21\xb4\x4d\x9f\x26\xbe\xe6\x2f\xd1\xf4\x9d\xf2\xed\x9d\xa8\x15\xf6\xb7\x5a\xaf\x64\xb4\x56\x17\x3e\x36\x11\xb9\x43\xa2\xf1\x6c\xc9\x96\x79\xef\xfd\xd3\xe4\xa7\x4c\x4f\x8a\x49\x8c\x43\x39\x8f\x7a\xab\xec\x90\x3c\x97\x2a\xf1\xf8\xe2\xaf\x64\xb4\x17\x03\x98\x94\xeb\x9d\x78\xd3\xab\x1f\x63\x99\xf4\x5e\x4e\x2c\x5b\x2f\xeb\x71\xbc\xa7\x5e\x80\x8f\x61\x33\x26\xfe\x5a\x2c\x34\x4c\x12\x14\x79\x65\x01\x0c\x98\xba\x97\xad\xb7\x0a\xc7\x29\x7d\x63\x5b\xeb\x3d\x67\xa6\xc6\x38\x08\x11\x3b\x08\xba\x94\x07\x23\xe8\x94\xfb\x0f\x1b\xc2\x1a\x7b\xcd\xaf\x8d\xa8\x41\x9f\xf9\x82\x70\xc0\xf5\xb6\xbc\x76\x1a\x9f\xf5\xe4\x6e\x67\xf5\xe1\xc8\xb8\x13\x1e\xc2\xc3\x8d\x08\x09\x84\x99\x2c\x29\xb3\x9a\x37\x83\x2a\x7e\x45\x75\xd0\x86\x2a\x60\x1c\x70\xbd\x95\xe7\x8c\xdb\x90\x17\x22\xe3\xe4\xe7\x4e\x2f\x61\xe6\x50\x2b\x0d\x2d\x37\xef\x64\x51\xa6\x38\xa4\xa1\x88\x9a\x14\x98\xf0\x2c\x84\xd4\x05\xe3\x80\xeb\xed\x73\x3e\x93\x2c\xc4\xfa\xb3\x33\x57\x5d\xf3\x42\x53\x32\xd7\x0d\x5e\x96\xb2\xf9\x3b\x81\x82\xe2\xaa\x0b\x49\xb1\xce\x77\xcd\xd7\x20\x75\xc1\x38\xe0\xef\x18\xb2\x50\x36\x55\x7f\x4d\x9b\x9c\xb7\xac\x90\x0e\xa1\x90\x93\x63\xc0\xc3\xdb\x0e\x77\x6d\xd0\xc1\xb2\xa3\xa3\x95\x88\xcf\x36\x41\x83\x1c\xbf\xc1\x38\xe8\xcf\xdf\x88\xfe\x71\xcb\x05\x36\x8f\x5c\xa6\x00\x3b\x66\x0c\x47\x47\x8b\x2d\x9f\x78\x59\x9d\xa6\xc4\x4e\x21\x29\xe1\xc8\x31\x5a\xd4\x6b\xf7\x80\x5b\x5f\x73\x18\x68\x9c\x9b\x0e\x20\x43\x07\xe3\x80\x0a\xb0\x77\x65\x4c\xa2\x04\x1f\x95\x66\xeb\xed\x94\x4f\x3b\xdc\x7f\xcc\x33\xd9\x7f\x8a\xde\xad\xe8\x48\xb3\x64\x25\x75\x6c\xb5\x00\xfd\xa5\x22\x30\x0e\xa8\x80\x96\xfb\x01\x7f\xa4\xae\xad\x53\xe9\x8d\x2f\xec\xaf\x73\x5c\xd1\xa4\x98\x31\x5c\x83\xad\xfb\x8f\x49\x15\xd7\x62\xbe\x08\xf7\x41\xef\x6c\x81\x71\x40\x05\xea\x98\x7a\x7c\x6b\xac\x97\x6c\x13\x6e\xd8\xf3\x2c\x87\x92\x18\x8b\xb9\xfe\xc2\xe7\x9c\x78\x75\xab\x38\xb4\xce\x1a\x5e\xc2\x12\x1f\x52\x17\x8c\x03\x2a\xa0\xaa\x7f\x67\x98\xc5\x86\xa0\x65\x44\x29\xf1\x4e\x61\x17\x2d\xb5\xa8\xfa\x7b\xd5\x12\xdf\xbb\xb4\x32\x75\x58\x18\x6f\x99\x53\x54\x20\x0a\x80\x71\x10\x05\xdc\xfe\x9c\xc0\x80\xcd\xe9\x97\xbe\x86\xc8\x8d\xe6\xd9\x6a\x64\x4a\xa3\xee\x30\x31\xf9\x3d\xa0\x50\x9e\x2b\xfc\xad\x70\xe2\xe3\x9f\xd6\x42\xf9\x9d\x8e\xbd\xc7\x94\xd0\xae\x17\x60\xdc\x85\x9f\xa1\x5f\x78\xce\xfd\x44\xca\xf8\x3a\x12\xb9\x80\x47\xcb\x87\xb5\x48\xc4\x0f\x3d\x7c\xbe\xb6\x79\xbf\xda\xe3\x7c\x1c\x39\x1b\xef\x95\x40\xea\x82\x71\x40\x05\x12\x79\xca\x37\x4a\x49\x67\x66\x97\x6b\x17\x85\xfd\x73\x4c\xca\x63\x1e\xbe\x3a\x46\x27\x40\x64\x83\x5d\x78\xa9\x23\x12\xec\xfd\x05\x52\x17\x8c\x03\x2a\xa0\x71\x57\xfb\x75\x48\x61\x64\x12\x3d\xc5\x63\xa3\x16\x49\x52\x37\x22\xb3\x1f\xdc\x95\x84\xb2\xcf\xb4\x24\xd9\x9a\x77\x42\x3e\x60\x40\xdf\x6a\x01\xe1\x80\x0a\x70\x3a\xd0\x59\x20\x8f\x7d\xec\xa0\x37\x8a\x68\x65\x97\x82\x3b\xbe\xdb\xf6\xc0\x5d\xa4\xc1\x4c\xfe\x30\xf9\xe8\x33\x67\xb3\x8b\x24\x64\xd7\x0d\xc6\x41\x7f\xf5\x82\x17\xe4\x97\x4f\x40\x16\xd8\xcb\x1c\xa0\x4e\xe3\xc4\x45\xc2\xd9\x6c\x5a\x0f\x7e\x53\xa8\xb6\xd8\x5b\x73\x6f\x5d\x2b\x2c\xd6\xef\x1e\xcb\xae\x11\x7a\xd8\x2d\x84\xbb\xd0\xb4\x0c\x8c\xbb\xf0\xd4\x9f\xa3\xfb\xba\xf2\x10\xcd\x90\x7b\x2d\xf5\x56\x84\x71\x42\xd6\x41\xed\x75\x9c\x46\x76\x45\xe4\x4f\xda\x29\x65\xe3\x9b\x96\xd0\x93\x17\x18\x07\x74\x20\x01\xc9\xac\x3c\xb1\x06\x3d\x6f\x3b\xd4\x57\xab\x28\x7b\x5f\xfe\x6e\x7a\x31\x4e\xb3\x9a\xde\x2a\xd9\xd4\xd0\x93\x7a\xdb\x44\x37\x48\x5d\x30\xee\x42\x02\x03\x37\x9e\xd7\xb9\x5b\x55\xc8\x1d\x55\xe1\x45\xf2\xda\x80\xff\xeb\x66\x58\xed\x03\x23\x46\xc1\x3d\xd7\xb2\x80\x99\x7d\x3d\x3c\x68\x02\x03\xc2\x01\x1d\x98\x7a\x85\x3e\xbd\x18\xef\x7e\x16\xfa\x1e\x8e\x3d\x9e\xdb\xe1\x23\x15\x7c\xaa\x64\xaa\xc3\x56\xbd\xca\x48\xdc\xcf\xe9\x2a\x6b\xe8\xe9\x1b\x8c\x83\xfe\xfa\x0d\x48\x02\x03\xb6\xdb\xb9\xcc\x81\xef\xce\x7b\x5c\x49\x37\x9d\xf2\xb2\x62\x19\xe1\x42\x07\xda\x1c\x0b\xdf\xfc\xd2\xe9\x94\x0f\xd6\x14\xf9\xc5\xbe\x73\x27\xdd\x0f\xfa\xf3\x82\x60\xdc\x85\xd7\x91\x3b\x0a\x8b\x0d\x47\x92\xcc\x79\x91\xa5\x7c\x7f\xb1\xf2\xb7\xa9\x87\xdd\x30\x9b\x66\xeb\x67\x24\xec\x7d\x95\x22\xc8\x6f\x0e\xed\xec\x0b\xc6\x01\x1d\x70\x70\xfe\x58\xc7\x32\xb5\x16\x9e\x97\x23\x25\xf9\xdc\x90\xa7\x76\x79\x94\x71\xf7\x74\xef\x7e\xcf\x75\x2c\x7d\xc7\x86\xfd\xea\x4d\x48\x5d\x30\x0e\xe8\x40\x76\x26\x59\xb3\x26\xd7\x96\xa3\x6b\x29\xd6\xda\xb2\x3d\x4d\xcf\x6e\x5f\xfc\xe1\xb7\xca\x11\xbf\x78\x39\xea\x9b\xb7\x8a\xeb\xa0\x3f\x4b\x00\xc6\x01\x1d\xb0\xff\xe9\x90\xb6\x32\x5e\xd1\x57\xe6\x4c\xba\x70\xfd\x01\x87\x5b\x41\x96\x36\xcc\x62\x35\xdf\x16\x1b\x49\xf8\x0d\x3b\x6e\x9d\x4f\x10\x07\xc0\x38\xe8\x3c\x60\xf5\x67\x07\xc0\xb6\x9e\x97\x39\x10\x62\x65\xf1\x34\xcb\x5c\x63\x13\x75\x2e\xb3\x81\xb2\xec\xda\x44\x5c\x30\xb1\xed\x4b\x14\x76\x67\x15\x0a\xab\x3d\xaf\x4c\x59\xe8\x0b\xbe\x60\xdc\x85\x86\x70\xda\x19\x0d\xa9\x70\x19\x0b\xf6\xcc\x95\x1a\x77\xf2\x6e\x9f\x0e\x49\xf6\x92\x55\xdf\xf5\x90\x98\x7e\x1f\xf1\xf1\x57\xab\xdb\x6b\x68\x83\x35\x10\x0e\xe8\x40\x44\x5e\xa2\x61\x9b\xe8\xf7\x19\x9a\xfb\x9b\x67\xd4\x9c\x13\x82\xe5\x91\xb9\x25\xf3\x66\x77\x1f\xbc\x43\xa6\x3c\xe5\xfb\x34\xf7\x02\x52\x17\x8c\x03\x3a\x90\x38\x20\x2c\xe4\xcc\xca\x67\x21\xed\xeb\x81\xe3\xb0\x1c\x98\x8c\x59\xad\x26\xe6\x7e\x68\x26\x9a\x35\xd4\xa5\xb3\x7c\xf7\xff\xba\x97\x81\x71\x40\x07\xfa\xf0\xf1\x4e\x4c\x7c\x22\x1a\xb9\x14\xe0\xc4\x4c\xe0\xb2\x58\x90\x5c\x3c\xeb\xf5\xd2\x06\x29\x5e\xbd\x58\xdc\xfc\x95\xab\x58\x08\xbd\x05\x05\xc2\x41\xe7\x01\x90\x04\x06\xec\xf4\x7e\x79\x02\xa3\xd8\x8a\x4f\xe3\xc6\x35\xf6\x5c\x5d\x5d\x75\xfd\x4d\x70\xd3\x91\xac\x30\x8e\xc3\xcc\x1d\xc5\xb0\xaf\x73\xc2\x12\x47\xec\xcb\x3b\x90\x34\x03\x8c\xbb\x98\xc0\x1c\x0c\xce\x48\x7c\x3d\xd9\x2a\x7e\xc3\x82\xe6\x21\x88\x06\xc3\x54\xc0\x89\xd5\x0c\x1f\x40\x97\x5b\x62\xdf\xf3\x78\x47\x87\xbc\x1c\x52\x19\x8c\xbb\x98\xc0\x38\xad\x6f\x0d\x7a\x72\xd2\xaa\xf8\xf4\xd1\x8a\x3f\xa6\x57\xd4\x7c\x80\x59\x8a\xc7\xe2\x9a\x40\x7e\xcf\x44\xe1\x83\x27\x5e\xa2\x26\xa4\x32\x18\xe7\x29\xee\x06\xf8\x36\xfe\xf1\x2f\x20\xc5\x9d\xee\xf8\xda\xb7\x79\xe2\x53\x74\x8b\xa3\xbd\xc7\x1b\x95\x14\xee\xa6\x4c\x6c\xff\xc6\x41\xee\xbe\x56\xa6\x1e\x7b\xe3\xa8\xeb\x7c\x02\xb3\xda\xea\xd8\x52\x3e\xc8\xdc\x55\xb5\x1d\x38\x32\xa8\x3d\x62\x2d\x71\x5d\x4a\x10\x43\x3e\x57\xe9\xdb\xb3\xb4\xe0\x4a\xfa\xb4\xc0\xf3\xff\x4f\xaa\xd6\x44\x74\xd1\xcc\x0e\x21\x59\x35\x0c\x67\x13\xf5\x2a\x44\x3c\x34\x1f\x5d\x6c\x89\xb2\x09\xcb\x57\xaa\x66\x4a\x12\x5e\xf9\xb7\x25\x30\x60\x43\x3b\x97\xc0\x08\x5f\x48\x60\x7a\x7f\x51\x7b\xf1\xbc\x8e\x96\x88\x7e\x36\x4d\x2f\xb4\x56\x73\x97\x2f\x24\xa8\x5a\x4b\xd4\xba\xe6\x00\x03\x7b\x53\xbb\x9b\x70\xf1\x2a\x12\x98\xda\x0b\x09\xcc\x5c\x47\xf7\x0b\x5b\x5f\x8d\x45\x8b\xb1\xdb\x30\xa9\xd1\xed\x53\x95\x87\xb4\xa9\x61\xe6\x41\xf1\xd2\x5e\xff\x3f\xe6\xce\x3b\x9c\xeb\xef\xff\xff\x56\x32\xb3\xf7\x4e\x66\x66\x52\x42\x92\x3d\xb3\x47\x64\x93\x11\xb2\xb2\x57\x88\xec\xca\x88\xec\x99\x4d\x36\x99\x45\x46\xf6\xde\x2b\x11\x92\x50\xd9\xf9\x5d\x9f\xef\x75\xbd\x9e\x9f\xde\x4f\x7e\x9d\xcf\x1f\xfe\x78\xff\x7f\xbb\x1e\x2f\xe7\xb8\x3f\xcf\x39\xf7\x73\xce\xe3\x71\xea\xc8\x44\x89\x53\xfa\xce\xe4\x76\xc6\xc9\x1d\x18\xd2\x2b\x92\x8a\x2f\x13\x3a\x64\xb6\x71\xf7\xea\xc7\x59\x95\x79\x5b\x23\x8e\x77\xdd\x72\xd4\x3e\x18\xc5\x2f\xfc\x7e\xf6\x49\xa5\xfd\x4c\xee\xa2\x9c\xdc\x81\xe9\xd9\x2a\x09\x36\x17\x1e\x2c\xe6\x7d\x7d\x15\xf7\xf7\x74\x46\x4c\x06\xc6\xa3\x27\x0f\xad\x82\xf9\xce\x95\x61\xc8\x26\x86\x78\xe6\x9c\x49\x6b\x4f\xee\xc0\xa4\xfa\x39\xf9\x2b\x8b\xd1\x93\x94\x75\x84\xcc\x50\xac\x58\xae\x0b\x15\x2b\x9c\x63\xdb\x92\xba\x93\x7c\x7f\x9b\x79\x6a\x26\xf4\x6c\x6e\xde\x9c\xb2\x03\x43\x3b\xfa\xb8\x40\x6c\x55\x4c\xf4\x73\x76\xa2\x5a\x15\x2f\x7a\xe1\x1c\x47\xc7\xf4\x6d\x0e\xb6\xac\xd5\x64\x85\xc7\xdf\x0e\x46\xcf\x6c\x07\x06\x24\xdd\x53\x33\xff\xf5\x0b\xb3\xfa\x8e\x4b\xee\x18\xef\xa7\x44\x5d\xef\x4c\xdf\xfd\xb8\x24\x2b\xcd\xa9\x5f\x61\xbe\x64\xa5\x70\xf1\x22\x95\x05\xf4\xf4\x0f\x88\x83\xcf\xb7\xd6\xce\xfa\xf8\x9d\x8e\xb2\x31\x59\x8e\xe2\x68\x36\x9d\x4b\xe8\xfd\x7a\x79\x56\x29\xac\x33\xa9\x5c\x1a\x26\x48\xb5\x54\xfc\x50\xa1\x54\x10\x07\x9f\x6f\xef\xa0\xe1\x6d\xae\x97\x72\x3c\x0e\xa6\x49\x18\x3a\x14\xef\xda\x4e\xae\x0b\x93\xba\x4b\x8a\x56\x4a\x67\x18\x37\x25\x55\xa8\xe4\x8d\x88\x0b\xe2\xe0\xfd\x40\xf9\xc9\xa8\x39\x7c\xb6\x9c\x55\x39\x68\x90\x29\xdc\x78\xb8\xf5\x52\x4b\x37\xea\x12\xa9\x54\x59\x4a\x07\xd3\x6d\x1c\x49\x4f\x74\x44\x5c\x10\xe7\x2f\x86\xf6\xcf\xec\x77\x11\x7a\x5e\x6f\x3f\x6d\x9b\xb8\xb7\xca\x94\x3c\x92\x16\x25\x5a\x68\xf7\x9d\x96\xbc\xd3\xcc\x1e\x30\xef\x5d\xf7\x66\xac\xfb\x00\x5d\x80\x00\x70\xd0\x03\x38\x7f\xdf\x81\x01\x8d\x23\xa7\x49\x40\x46\xe8\xcb\x72\x9a\xc2\x24\x13\xae\x6b\x49\xc2\xf4\x86\x83\xa4\x64\xd7\xe7\x6b\x17\x47\x3c\xac\x7f\x91\xf7\x50\xc4\x13\x1b\x41\xc9\xd9\x20\x0e\x2e\x81\x71\xa4\x58\x2a\xa2\xef\x0e\xde\xed\x28\x87\x26\x4f\xbd\xeb\x9f\x5c\x56\x50\x4a\x45\x39\x7a\x76\xa0\x69\x7f\x58\xae\xd6\xfd\xb1\x03\x11\x17\xc4\xc1\x25\xe0\x34\x91\x65\x17\x51\x40\x15\x69\xd4\x86\x4b\xc2\xfd\x7d\x59\xfc\xe6\x11\xf7\xb3\x75\x01\xb4\x14\x0a\xb7\x6f\xcf\x5f\x5c\xff\x6f\xd6\x1c\x88\x83\xf7\x83\xd6\x04\x81\x48\x7b\xae\xd6\x4a\xd5\xad\x2a\x5a\x8c\x11\xfd\x45\xe5\xa0\xa2\x46\x15\xfe\xa2\x06\x34\xe3\xd2\x3a\x32\x3e\x14\x28\x6b\x0e\xc4\xc1\x25\xc0\xe4\xe7\x19\xa3\x7b\x47\x36\xa9\xdb\x6b\x6a\x59\x7a\xfd\x2e\x87\x51\xcf\xa7\xc2\x1b\xd2\x37\x9d\x02\xf8\x97\xd2\xa7\xf3\xa7\x89\x10\x12\x00\x71\x08\x09\x34\xfd\x7d\x07\x06\x34\xa6\x9f\x26\x81\xe9\x60\x1c\xa2\x57\xf1\x6f\x39\xb7\x02\x25\xef\x52\x3c\xa4\xd3\xd5\x3f\x26\xeb\xb8\xef\x25\xc2\xb0\x11\x9c\xdd\x74\xf8\x40\x1c\x7a\x86\x1c\xc4\xc1\x25\xb0\x42\x48\xbb\x2c\x71\x9f\xea\xfe\x9d\x7d\x5b\x36\x11\xaf\x98\xef\x82\x58\x15\x66\x72\x03\xcf\xcf\x5f\x6d\xbf\x12\x68\x98\xf9\xe0\x2b\x22\x2e\x88\x83\x4b\x20\x27\x71\x4b\xfd\xe7\xc1\xfe\x1a\x03\x59\x7a\xfa\x87\xec\xcb\x8d\x2e\x14\x2c\xa2\xbc\x92\x3f\xda\xf4\x49\x97\x0c\xd3\x1f\xee\xae\x21\xe2\x82\x38\x78\x3f\xfc\x7c\x6f\x6d\xdb\x51\x12\xfd\x13\xc3\x6b\xa2\xfd\xb5\x45\xe9\xaa\x73\x15\x86\xe9\x76\xda\xc5\xc2\xdf\x1c\xb3\x18\xd6\xa1\xb6\x50\x82\x23\x88\x83\x4b\xe0\x47\xd7\xa7\xda\x05\x03\xc1\xe4\x26\xfd\xcf\xee\x4e\x97\x03\xc7\x7e\x4c\xb9\x6a\x94\x50\x09\x96\x7a\xcf\xb7\xd0\x10\x72\xf4\x43\x79\xff\x20\x0e\x7a\xf7\x02\xb0\x03\x03\x9a\x60\x4f\xd3\x00\xf2\x75\x7d\xf6\x6a\x4f\x74\x0c\x52\xd5\xb5\x84\x97\x84\x6e\x21\xc6\x58\xb5\x16\x53\xa5\x1c\x8f\x9a\xf5\xf3\xda\x9e\x8c\x29\x3d\x47\xb4\x1d\xc4\xc1\x35\xb0\x58\x42\x48\x7e\xfd\x06\x6f\xc0\xdd\x7b\x1d\xf5\x6c\x2c\xcb\x6c\x1b\xbb\x47\xa3\xfc\x1f\x1f\x49\x7e\xb3\xb2\x91\xdf\x6c\x33\x81\x2e\x43\x82\x38\xb8\x06\x4a\xbc\x79\x8a\xd0\x8e\x42\xe5\x13\x5e\xe9\x58\xe3\x28\x6b\x7b\x56\xc5\x6f\xb9\x0d\xec\x3a\x6e\x68\xe0\xdb\xb4\xfd\xde\x33\x82\xf2\xdb\x40\x1c\xbc\x1f\x1c\x55\x58\x46\x73\x29\x9f\xbc\xba\x29\xc4\x22\x66\x40\x19\x54\x19\x5c\x82\xf2\xb1\x85\xf0\x6d\xb8\xc7\xfe\x0d\x09\x99\xea\x30\x06\x44\x5c\x10\x07\xd7\x80\x58\xe2\x2f\xda\x97\xfe\xde\xb6\x92\x11\x81\x33\x3c\xfe\x62\x02\xb2\x53\x24\x42\x05\xe1\xed\x14\x11\x14\x09\xf2\x03\x74\x66\xee\x08\x0d\x80\x38\xe8\xfd\x1b\xc0\x0e\x0c\x68\xb5\x73\x9a\x06\x12\x7d\xa3\x23\xa9\xd4\xbf\x18\x49\x27\x8b\x1b\xab\x7f\xe2\x49\xf2\xf5\xe1\x22\x59\x7a\x20\xf3\x42\x54\x54\x21\xc0\x8e\xbe\xca\x15\xba\xab\x02\xe0\xe0\x1a\x50\xba\x7d\x8b\xb9\x38\x22\x40\x55\x73\x82\x03\x63\x72\xc2\x5b\x30\x91\xbd\x83\x68\xe8\xd6\x17\x62\x2c\xb9\xb7\xa8\xed\xb4\xd7\x9e\x22\xe2\x82\x38\xb8\x06\x7a\x1f\x8e\xbe\x0c\x9d\xa0\x69\x74\x95\x73\xe0\x15\x92\x3c\xff\x74\xd5\x63\x3e\xc2\x09\x03\x7d\xab\x6e\xee\xae\x81\xfe\x8f\xed\x77\x88\xb8\x20\x0e\xde\x0f\xf7\x37\xb9\xc7\x24\x8e\x97\xc8\x44\xf4\x7b\xa6\x46\x56\xee\xe7\xf4\x3f\xb2\xf8\xfc\xbc\xd8\xb6\xd3\x84\xea\x5b\xfd\x3b\xf9\x8b\x79\x88\xb8\x20\x0e\xae\x01\xea\x47\x59\x94\x7d\x87\xab\x64\x61\xa2\xd7\xab\x16\x96\x38\x6d\xbf\xd3\x9b\x0c\x6a\xf3\x0c\x16\x21\x6b\xd1\x12\x70\xdc\x11\x9d\x42\x68\x00\xc4\x41\xe3\x00\x68\x07\x06\xb0\xf4\x3c\x4d\x03\xdf\x96\x68\xb8\x08\x5c\xbe\xe8\x52\xda\x1a\x53\x8b\xfd\x6c\x70\x53\xbf\xc5\xb7\x50\x15\xc7\xd6\x6b\xd2\x13\x70\x73\x4b\x7b\x08\x7a\x03\x0c\xc4\xc1\x35\xb0\x4b\x37\xf3\xc3\x40\xb7\x13\x63\x20\xd1\x92\x54\x71\x77\xac\xa0\x64\x8d\xea\xe9\xef\x73\x01\x33\x51\x57\xde\x1d\x5c\x5f\x53\x81\xc6\x01\x10\x07\xd7\x80\xc7\x71\x32\xff\x54\x1b\x0b\xce\x57\xf2\x3b\x97\xd2\x86\x62\x83\xd8\xdb\x9f\xbd\x76\x59\xdf\xa1\x37\x88\x7c\xbd\xa2\x84\xdd\xfa\x12\x11\x17\xc4\xc1\xfb\xc1\x13\x57\x44\x35\x86\xf5\x01\x61\x43\xb9\xf6\x78\xba\x97\xfe\x77\x26\x8b\x9e\x7b\xde\xc1\x4d\x1a\xa3\x53\xdf\x72\x2a\x28\x18\xa1\x9c\x29\x10\x07\xd7\x40\x4a\x3c\x0b\x83\xcf\xbb\xb6\x0b\x97\x0b\x53\x45\xd3\x30\x5d\xd2\xe9\x27\x2c\xbf\x2c\x11\x5c\xfc\x22\xf8\xed\xda\xe6\x4c\x62\xe4\x2e\x42\x03\x20\x0e\x1a\x07\x00\x3b\x30\x20\xf7\x7e\xfa\x0e\x8c\xe0\xb3\xa2\x12\x4a\x6d\x29\xbc\xd2\xdb\x35\xc6\xd2\xef\xd6\xf1\x88\x5e\x48\x38\xc4\x57\x31\x30\x25\xa8\xba\xbc\xb1\x37\xfa\x2c\x84\xd8\xcd\x00\x71\x27\x77\x60\x62\x9d\x79\xde\x09\x44\x0b\x1e\xad\xba\x37\xaf\x3a\x92\xe9\xab\xc8\x6b\xca\x17\x44\x97\x7d\x8f\xc2\x74\xd7\x73\xf7\xe9\xe6\x4a\x40\x44\x06\x71\x27\x77\x60\x96\x7f\x26\xf1\x49\x25\x3e\xa4\xad\xe8\x7d\x18\x74\x6b\xd1\x85\x22\x72\xf2\xc8\xf4\xcb\x63\x2a\x7f\x82\xad\xb0\xdf\x8e\x6a\x5c\x0f\xa1\xbc\x29\x00\xe7\x2f\x81\x84\xf2\xcf\xc8\xff\xf3\x1b\x48\xfa\x5a\x32\x9d\xfd\x59\x2d\x17\x25\xbf\xf5\x74\xd2\x5e\x51\xa4\x6c\x4f\x7c\x2a\x52\xfb\xa6\xcb\x30\xae\x4f\x37\xea\xa6\x81\x7c\xe9\x9f\x3b\x30\x35\x14\xee\xd1\xab\xf7\x6c\xe6\xde\x1e\x5e\xd1\xbd\x22\x5f\x76\x8b\xbf\xed\x79\xec\x47\x64\xe2\xd1\x7b\x32\x6f\xa3\xa4\x7e\xbc\x5e\xf8\x03\xc5\x68\x51\x2b\xbe\x3a\xf6\xc9\x0c\x2b\x80\xaf\xd7\xff\x03\x51\xbe\xb7\x80\xf5\x4d\x33\x71\x3f\xb2\x60\xd6\x6e\xd1\xb5\xf0\x63\x2e\x51\x51\x2c\xac\x7f\xc3\x0e\x8c\xef\xb9\xff\xad\x69\x01\xa8\x48\xe7\xfc\x6f\xd3\xf9\x3e\x09\x15\xf7\x3d\xb1\x03\x63\xb8\x7e\x8f\x4a\xc6\xb7\xef\x05\x25\xe6\xd2\xef\xf3\xc6\x8d\x41\x93\xa1\x1c\xc8\x74\xc7\xe1\x54\xc3\x13\xa2\xaf\x02\xe3\xf7\xc8\xce\x62\x07\x06\xe9\x0e\xfc\x57\x19\x90\x27\xc3\x43\x79\x2a\x9f\xa8\xdf\xfa\xfa\x03\x57\x5e\xc3\x9c\x17\xdd\xb7\xdf\xd7\xe1\xeb\xb0\xcc\x46\x89\x3a\xeb\x6f\xbd\xec\x33\xb9\x9e\x71\x72\x07\xc6\x6d\xb4\x5e\x2c\x27\x62\x47\xb8\x48\xdd\x6d\x5a\x39\xd2\x6b\x92\x85\xd7\xca\x6c\xf9\x18\x9d\xac\x6a\x54\x52\xb9\x5c\x2e\x65\xe3\x4c\x2e\xa3\x68\x9c\xf8\xd9\x38\xb7\x5e\xa1\x1a\x37\x14\x16\xc6\xab\xbe\x1f\x7a\x24\x3f\x0b\xc5\xd5\xe9\x5b\x96\xf6\x4e\x38\x72\xd5\xe6\xfe\xa6\xa1\xc5\x39\x8b\x42\x3b\x12\xbe\x27\x77\x60\x2e\xd7\x16\x9a\x2c\x7b\xde\xbf\xe6\xf7\x5a\x76\xa8\xac\x4e\x92\xc7\xe2\xa6\x9f\xe0\xea\x33\xba\x72\x25\x5d\x24\xf3\x80\xa4\x6d\x8b\x33\xdb\x0a\x01\x69\xe8\xb4\x89\x0f\x89\x19\x8d\x78\x82\x7a\xf3\x27\x57\x41\xb9\x6a\x97\xf5\x34\xa6\x2c\xba\xec\x5b\xca\xc1\x25\xb3\x03\x72\x76\xe7\x8d\xb8\x3c\xe8\x52\x35\x88\x83\x4f\x7c\x7b\x86\x97\x43\x7a\xbf\x79\x0a\x45\xb6\x08\x50\x6c\x7e\x1d\x6e\x4e\x28\xc6\x7e\xff\x60\xdd\x3e\xcc\x4f\x1b\x8f\x65\xf4\xeb\x2d\xa8\x16\x2a\x88\x3b\x51\x54\xf0\x32\xca\xb5\x3b\xbc\xde\xc9\x62\x9f\xd8\xf0\xca\xdb\x94\x6f\x3f\xb5\x63\xd3\xeb\x53\x67\x2d\x18\x45\xfb\x14\x85\xdd\xd0\x34\x00\x2d\xaa\x00\x1c\xbc\x1f\x6a\xf4\x51\x98\x45\x7c\x87\x12\x6c\x90\x34\x3f\xf1\x15\x9b\xc5\xa1\x31\x3a\x5e\x38\x7e\x17\x3a\x19\x88\xc3\x8a\xd3\xe7\xcc\x00\x99\x2b\x10\xe7\x2f\x26\xfa\xcf\x44\xf4\xa4\xcf\x99\x6e\x58\x57\x6a\x6f\xdc\xf3\x1a\xc2\x92\x33\x3a\xd6\x49\x5a\xa6\xa9\xca\x53\x35\xf9\xd6\xf0\xf8\x17\xc7\xaa\xfe\x57\x84\x0f\x06\x71\xd0\x5b\x34\x7f\xdf\x0a\x01\x7d\xd0\xa7\x49\xa0\x19\xc7\x23\x75\x30\x09\x5b\x7d\x26\x5e\xcf\x32\xa9\x7a\xb8\x35\x99\xa5\x43\xf0\xd3\xb7\x5a\x1c\x91\x9d\x4b\x32\x0d\x09\x16\x96\x88\xa6\x83\x38\xb8\x04\x2a\x2f\xd5\xda\x2b\x7f\x4b\x96\x68\x31\xd2\xa1\x20\xdb\x91\x17\x51\xbd\xd7\xe5\x46\xf6\x3c\x36\x19\xf9\xdd\xeb\xca\xab\xa1\xf5\xfb\x88\xb8\x20\x0e\x2e\x01\xa9\xdd\x27\xa4\xe5\xa4\x2c\x7c\x09\x0f\xdd\xda\x88\xb1\x43\x33\xb0\x22\x82\x13\x29\xd3\x58\x6c\x37\x29\x8f\xde\xbd\xfe\x76\x80\x84\x88\x0b\xe2\xe0\xfd\x60\x81\x62\xf9\x75\xc1\x78\x44\x4b\x15\xc3\xd6\xe4\xe7\x81\xeb\x16\x9e\xb0\xd4\xbc\xe5\xa3\x48\xf1\x9e\xb8\x96\x55\x6d\xc5\x0e\xe8\x5e\x16\x88\x83\x4b\x80\xec\x32\x99\x83\xd2\xfc\x9a\x9c\x07\x71\x4e\xca\x65\x71\x5f\xe7\xbb\x42\xf7\x1e\xc5\x66\xfb\x2a\xec\xa0\xf5\x05\x0c\x90\x4b\xa4\x23\x24\x00\xe2\xa0\x72\x2c\x77\xfe\x2a\x01\xd0\xe0\x7a\x9a\x04\x28\x4d\xae\xde\x7a\xdc\xa9\x41\xc8\xdb\x91\x82\x29\x73\x5d\xaf\x55\x75\x14\xb9\xd3\x3c\x6f\x4b\x57\x66\x24\x5e\xe8\xdc\x0c\xb9\x03\xb4\x11\x08\xe0\xe0\x12\xb8\x80\x76\x5c\x53\x42\xf1\x5a\xb1\x46\xc7\xe7\xba\x88\x4a\xa9\xe0\x4c\xca\x25\x61\x81\x8e\x07\x7e\x3d\x3a\x2b\x2d\x9c\xec\x5d\xd0\x86\x28\x88\x83\x4b\x80\x4a\xa9\x50\x1b\xbb\x82\x20\x60\xf5\x9e\x87\xe4\xf8\x3a\x1b\xf3\x3b\x59\x0e\x62\xef\xfd\x0b\x4a\xb9\x44\xac\x02\xfa\x6c\xae\xd0\xe8\x02\xe2\xe0\xfd\xe0\xcb\xbf\x78\x97\x4d\xb6\xe5\x41\x72\xd6\xec\x73\xa6\x44\x8a\x61\x6f\x2f\xbd\x0b\xbb\x6f\x92\x69\xb1\x71\x72\x74\x92\x14\x2f\x40\xcf\xb1\x80\x38\xb8\x04\x2c\xa6\xd8\xba\x52\x93\x4c\xfa\xb7\xb8\x93\x89\x15\x27\xc5\xb2\x22\x89\xbf\xbc\xd8\x1e\x12\x7c\x98\x2b\xd5\xf7\x72\x1e\x55\x88\x08\xb1\xfc\x05\x71\x50\x19\x06\xc0\x56\x08\x68\xa6\x3b\x4d\x03\x38\xbe\xe9\x6e\xd3\x8f\xf4\x86\x37\x78\xcf\x51\x7c\xa9\xe5\xa7\x0c\x94\xcd\x55\xc4\xfe\xc4\x9a\x73\xf5\xc9\x47\xe4\xe7\x52\x22\xd0\x45\x04\x10\x07\xd7\x00\x19\x5d\x9d\x9d\xb3\x0e\xce\xa8\x5c\xbd\x73\xd4\xbd\x1b\xd1\xdd\x47\xc7\x25\x52\x76\x2a\x84\xde\xa1\x7c\xad\xcd\xbc\xc6\xee\xcb\x88\xb8\x20\x0e\xae\x81\x7b\x9c\x28\x8d\xb6\xc6\xaf\x7e\xf0\x68\xc5\xa9\xba\xb8\x75\x26\xc4\x8d\xe9\xa2\x39\x35\x74\xdf\xbf\x80\x2a\x9d\x48\x5d\xc9\x0d\x5d\x9e\x01\x71\xf0\x7e\xd0\x46\x62\xf0\x38\xb7\x73\xc4\xdc\x73\x59\x42\x0b\x9f\x57\xbc\xe6\x57\xe8\xdb\x51\xd7\x08\x3f\x15\x0b\xda\xee\x1f\xc3\xfb\x64\xd0\x30\x00\xe2\xe0\x1a\x58\xc3\xe5\x25\x8b\xe4\x68\xb3\x69\xf7\x9a\x5d\xa0\xc5\xd2\x7e\x23\x27\xc5\xfa\x84\x84\x29\x78\x89\xa0\xe1\x23\x6a\xd4\x27\x2f\x02\x84\x06\x40\x1c\x54\x86\x41\xe3\xef\x1a\x00\x2d\x3b\x4e\xd3\x40\x5e\x6d\x17\x86\x2a\x16\xa1\xeb\x00\x8a\xf4\x36\x6d\x98\x3b\x46\x43\xf1\x46\xea\xf9\x97\x44\xad\x49\x9d\xd4\xe1\xcb\x13\x63\x91\x50\xc9\x52\x00\x07\xd7\x80\xd9\x65\x52\xbb\x1b\x82\xba\x2e\x7c\x9e\x94\x3d\xfa\xf7\x2e\xa3\x46\x73\xa0\x2c\x52\x12\x97\xe0\x1e\x5c\x67\x3a\x4f\xdc\x62\x09\x6d\x85\x80\x38\xb8\x06\x9e\x2f\x7c\xf1\xa1\x99\x0e\x18\xfa\xd6\xb8\xf5\x24\xb7\xb6\xc5\x85\x42\xd8\xed\xf3\x4f\x74\x0e\x9d\xd9\xb8\x80\x9b\x5c\x2e\x9c\x58\x88\xb8\x20\x0e\xde\x0f\x91\x44\x0f\x6a\x3f\xb8\x53\x18\xb9\x5d\x92\x7a\xb3\x5c\x11\x3a\x15\x6f\xdd\xea\x59\x92\x79\x4c\x59\xc3\x89\x46\xdf\xc2\x38\x0e\xbd\xd0\x07\xe2\xe0\x1a\xc0\x19\xce\xdd\x74\xd3\xe1\x48\xc5\x78\x78\xb7\x40\xf7\x25\x8f\xb6\x84\xfd\x6f\x2e\xc6\xe2\x04\xde\x5b\x07\x98\xc1\x26\xd5\xf4\x68\x08\x0d\x80\x38\x68\x1c\xf8\xff\x6d\x85\x20\xac\xd9\x64\xde\x0c\xa3\xde\x64\x63\x91\xa4\xe8\x7e\x4f\x3f\x1f\xa5\xe8\x5a\x7d\xc6\xc8\xfc\xfd\xb1\x37\xee\x35\xb7\xf1\x93\x0a\x89\x67\xfe\xb4\x66\x7e\xfc\x61\xec\x5f\xcd\xcf\x95\xe7\x15\x7b\x08\x9a\x87\x5d\xeb\xbd\xbd\xb3\xc3\x94\xbb\x2e\x15\x90\xdb\x81\x8d\xe3\x69\x18\x44\xf1\x07\xfa\xb4\x41\x31\xd5\x92\x96\xeb\x8a\xf3\x0b\x17\xf2\xa7\xf6\xca\xbf\x1b\xec\x44\xd1\x82\x71\xca\x74\xe2\x2a\xd1\x8c\xa8\x39\xdb\x85\xfe\x6d\xd6\x0c\xd4\xb4\x3f\xac\x59\xd3\x09\x6b\x16\x6a\xe1\x6e\xb1\xe7\x8f\xef\xe9\xbd\x59\x45\x8b\x74\x5e\x58\x72\xd0\x70\x5a\x8d\xb5\x06\x4b\xcb\x53\xea\xb2\xb5\xb8\x86\x5b\xec\x59\x58\x33\xd1\x13\xd6\x2c\xba\x37\xe8\x7c\xf1\xf9\x27\x6f\xcc\x6e\x28\xf9\x53\xf8\xf0\x12\xe0\x2b\x33\x77\xca\x69\xed\x2d\x31\xc5\xf4\x12\xee\xf4\x3f\xd8\x3c\x93\x73\xdb\x93\xd6\x4c\xf9\x1e\xd7\x4f\x8e\x61\x35\x9a\x79\x6a\x9f\x61\xb5\x86\xf7\xba\x77\x64\x5f\x59\x93\x1d\x69\xde\xa3\x98\x7e\xa6\x91\x70\x54\x19\x7c\x26\xa7\xd4\x27\xad\xd9\xbb\x2b\x53\xdc\xb3\x37\xb8\x3f\x99\x95\xea\x49\x94\x11\xa2\x34\x86\x7f\xcf\x9b\x91\x58\x6e\xac\x56\xbc\x94\xf1\xcc\x74\xb0\xe4\xf8\x4c\x5a\x7b\xd2\x9a\x5d\x1a\xf9\x52\xf3\x52\x57\x23\x32\x28\x88\x87\x2f\x46\xbe\x5d\xa7\x8f\x00\xed\x22\xd3\x0f\xc5\xfc\xda\x5d\x71\xba\xd4\x9e\xe3\x33\xb8\x0a\xa0\xfb\xbf\x69\xe8\xb4\xc1\xb8\xee\xb5\x74\x86\xd5\xec\xad\x8e\x9b\x7d\x33\x25\x24\xca\x4d\x94\x1a\xb8\x38\x9a\x19\x5d\xa8\x1b\x7a\xcf\xde\xe7\x10\x17\x67\x43\x79\xb4\x20\x0e\x3e\x18\x33\x0f\x5b\x1f\xb6\x51\x7f\xa7\xfe\x1a\xd7\xff\x02\xc7\x58\xab\xc0\x4c\x31\xa1\x0e\x9b\xa7\xcb\x80\x89\xc8\xec\xcb\x01\x5a\xcf\x2b\x44\x5c\x10\x77\xc2\x9a\xf5\x93\xb4\xa5\xb6\x04\xb3\x67\xf5\xb3\x10\x1f\xe3\x6f\xed\x2c\x72\x04\xf5\x70\x04\xef\x3e\x10\x79\xf5\x89\xb2\x6d\x80\x54\x04\xb2\x66\x00\x0e\xde\x0f\x82\xe6\xdb\x92\x93\xca\x79\x29\x11\x14\xe7\x96\xd8\xee\x13\xef\x0f\x0c\x39\x3f\xf9\x90\x2a\xb4\x22\xd7\xf4\xea\xe3\xd0\x7d\xad\x23\x44\x5c\x10\xe7\x2f\x86\x84\xf2\x8f\x89\x5e\xfc\x83\xc9\x03\x7e\xd1\x86\x58\x4e\x49\xfa\xb4\xa7\x41\xa8\x96\x13\x32\xab\xdd\xc9\x9d\xf7\x69\xbc\xde\x64\x14\x45\x7a\xf4\x43\x97\xc4\x01\x1c\xf4\x4c\xc5\xdf\xad\x19\xe8\x83\x3e\x4d\x02\xcf\x48\x46\xb3\x93\x69\x3a\x0c\xb4\x33\x17\x6c\x3d\xe5\xad\x2b\xcd\x3c\xec\x33\xa6\xb2\x1f\xbf\x48\x72\x7a\xd6\x14\xe6\xc8\x0c\xa5\xe7\x82\x38\xb8\x04\x32\x9b\xa5\x52\x0d\xdf\x72\x9d\x1f\x3c\xf4\xdf\xf3\xa2\xa8\xae\x25\xb3\x28\xfc\xf0\xe4\x6d\x2a\xe7\x68\xc1\xcb\xd6\xbd\xaa\xd8\x64\x44\x5c\x10\x07\x97\x40\xdd\x38\x87\xdb\x82\x91\x93\x1b\xae\x52\x72\xe2\x82\x49\x3f\xe6\x44\xae\xdc\xb4\xe4\x7c\xb5\xdb\x2f\x9b\x44\xce\x1f\x69\x93\x9b\x90\x64\x01\x1c\xbc\x1f\x92\xaf\xdf\x59\x7e\xbf\x6f\xd5\x67\xc3\xe9\x65\x26\xbe\xb4\x24\x5b\xa4\x7b\xe1\xc3\x85\x72\x81\xa8\xcf\x56\x58\x73\x29\x99\x6b\xca\x88\xb8\x20\x0e\x2e\x01\x6c\xf5\x55\x01\x62\x27\xf3\xbd\xfb\xad\x26\xe2\xbc\x3c\x75\x1d\x6b\xe4\xd3\xc4\x01\x2c\x09\xb4\x87\x02\xd4\xa9\x77\xa3\xac\x86\x11\x12\x00\x71\x50\xa5\x86\xbf\x5b\x33\xd0\xe0\x7a\x9a\x04\xca\x89\xaa\xf2\x16\x7d\x9b\xca\xd6\xb3\x46\x2e\x3d\x66\x18\xc3\x5b\xc9\x78\x73\x5e\x2c\xb1\x67\xf2\x52\xd6\xc6\x73\xe5\xd8\x0c\x13\x44\xd3\x41\x1c\x5c\x02\xef\xf6\x28\xc2\x2f\x7e\xd7\xe4\xf1\xd0\x42\x6a\x72\x9d\x47\x75\xb2\xfc\x35\xb5\x7b\xa3\xea\x01\x25\xba\xd1\x67\x29\x14\xc7\x7e\x6a\x28\xf5\x02\xc0\xc1\x25\xc0\xca\x19\x42\x25\x93\x8c\x6b\x49\x7c\x59\x26\x51\xe6\x41\x8e\x4b\x20\x7b\x95\xf5\x8d\x96\x7a\xdd\xab\xde\x04\xc1\x04\x59\x25\x90\x04\x40\x1c\xbc\x1f\x02\xa5\xa2\x6b\x77\x8e\xad\x0e\xd0\xb0\x0a\x78\x46\x95\x5e\x15\x24\x72\xdc\xb9\x6f\x83\xad\xc0\x76\xb4\xb8\xdb\x9a\x1d\x12\x05\x9d\xd2\x81\x38\xb8\x04\xa4\x66\xbe\x7e\x7a\xce\xfd\x50\xb0\xc8\x37\xe5\xb3\xe5\xe8\x5d\x59\xa2\x6b\xba\x39\x1c\x0f\x7b\xb0\x4a\xa6\xa8\xef\x37\x5e\xb2\x85\xee\x07\x83\x38\x28\x43\x1b\x60\xcd\x40\x33\xdd\x69\x1a\xe0\xe3\x41\x17\xf8\x7c\xde\x92\x49\x5f\xb4\x6f\xf5\xf1\x92\xa0\x67\x81\xb9\x7b\x72\x3e\x33\xbd\x48\x45\xee\x23\x54\x15\x15\x64\x37\xa8\x00\x2d\x80\x83\x6b\x40\xaa\xb6\xd5\xea\x97\x6e\x78\xe6\x31\xcd\x82\xca\xa7\xc9\x6d\xe7\x73\x9f\xf4\x31\x69\x86\xa9\xe2\xb1\xf1\x46\x78\xcc\xa5\x3d\xed\xa1\x9d\x14\x00\x07\xd7\x00\xb3\x24\x55\x55\x86\x70\xc6\xfe\x42\x1e\xd2\x4f\x22\xcf\x61\x31\x9a\x1f\x35\xac\x43\x63\xd6\x1a\x29\xde\x2f\x8e\x87\xb8\x62\x1e\x41\x33\x0c\x80\x3b\x51\xb1\x42\x83\x65\xac\xa5\x43\x5d\xd1\x67\xfe\x22\xdd\xd8\x20\x5b\x5a\x58\xea\x0f\x01\x0b\xce\x0f\xe8\x77\x98\x1c\x23\xb8\xdd\x24\xa0\x57\x35\x40\x1c\x5c\x03\x3a\xfe\xeb\x54\x0d\xd9\x3f\x26\x0b\x23\x75\x89\x67\xd1\x2b\xe2\x44\xe6\xb3\x6a\x3e\x0e\x1b\x5a\xd9\x45\xad\xb8\x93\xa5\xd9\x40\x1a\x00\x71\x50\x86\x36\xc0\x9a\x81\x96\x1d\xa7\x69\x60\xdb\xd6\x78\x2f\xf2\xc5\xb5\xb2\xec\x8b\x5c\xb8\x91\xf1\x6e\xcd\xb2\xc3\xe3\xd3\x37\xf5\x8f\x0e\x0d\xda\xd7\xeb\x75\xee\xe2\x40\x79\x32\x20\x0e\xae\x81\x32\xa3\x95\xe8\xb7\x26\xc4\xb7\x7f\xb4\xab\x23\xe3\xa1\x78\x50\x6c\x3c\x4e\x0f\x97\x73\xad\x53\x5e\x09\xd0\x5e\xef\x91\x27\x3d\x84\xf2\x90\x00\xdc\x89\x4a\x99\x4f\x71\x7f\xd8\x5f\x9f\x44\x8e\xce\x20\xb6\x37\x22\x9b\xc1\xca\x57\x25\xd7\x15\xf9\xfe\xec\x8d\x34\xf7\xfe\x9d\x24\x39\x96\x41\xa8\x52\x26\x80\x83\xf7\xc3\xeb\xbe\x85\x82\x57\xfc\xed\xa5\xb6\x36\x25\x01\x8f\xbe\xe7\x2e\x56\xe0\xa6\x6b\xbc\x3b\xb7\x5e\x2f\x31\x29\x50\xd8\xe2\xdd\x0f\x55\x2b\x00\x71\x70\x0d\xbc\xe5\x8f\x29\x7c\xd8\x8e\xfa\xe2\xb7\x1c\xa1\x9d\x55\x91\x9a\xd5\xfc\xb9\x5b\x7d\x61\x5d\x1f\xa4\x75\x14\xc2\x9a\xd1\xfa\x22\x57\x11\x1a\x00\x71\xd0\x38\x00\xb2\x66\xa9\xd7\x73\xc7\x69\x94\x04\x9f\xb7\xe3\x67\x35\xd4\x67\x88\x4d\x29\xbd\x71\xf6\xa9\x76\x17\xbe\xa6\xd4\x4e\x80\xd9\xe0\xba\xfe\xea\x4f\x6b\xc6\xce\x59\xe2\x80\xff\x20\x5a\xba\xf2\xe9\xfc\xf7\x83\x64\xcb\x5e\xf1\x0c\xfc\x92\xac\x31\xfa\x5f\x53\xc1\x22\x65\xbb\x0b\xad\x18\x7f\x5a\xf8\xc9\x08\xb7\xb7\xa2\x89\xc7\xad\xec\x48\xa6\x01\xb9\x32\xf9\x5c\x15\x04\xc8\x7d\x63\x2c\xad\xdd\x4b\x2e\x48\xab\x4f\xd0\xef\xfc\xdb\xac\x19\xa8\x69\x7f\x58\x33\x24\x71\xf8\xfa\xfd\x46\x76\x14\x4e\x5a\x28\xad\xbf\xad\x49\x15\x37\xc6\xf5\x40\xaf\x73\x19\xb4\x3a\xeb\x8c\xbf\xdd\x8f\x09\x22\x3f\x51\x7f\xf5\x2d\x39\x0b\x6b\xe6\x7b\xc2\x9a\x11\x35\xce\x36\xd5\x22\x6f\xfb\xe4\x76\xb8\xa9\x79\x9b\x3d\x32\xb7\xf4\x43\x35\x4b\xf3\x4e\x25\xd1\x50\x3d\x2c\x96\xa2\x9f\x6d\x3c\x93\xe3\x2b\xc1\x93\x1e\xe9\xb0\xd4\x4b\xf8\xf1\xbd\xe3\x86\x4e\x92\xe3\x2b\xe2\x2c\x8b\xf7\xc7\x7e\x5a\xcd\xd1\x9a\x09\x45\x27\x99\xc5\x90\xf4\x4d\x5f\x3b\x93\xe3\xab\x93\xd6\x0c\x7b\x2a\xaa\xab\xb6\xe5\xa5\x8c\x4f\x82\x1b\x8b\xdf\xaf\x45\x0d\x85\x7b\x4d\x5a\xfe\x63\x8d\x57\xed\xb5\x96\xd5\x47\x89\x43\xce\xe4\x96\x36\x92\xfd\x89\x9f\xa5\x97\x4b\xe7\x89\x2e\xae\xd4\x6a\x61\xa8\xd4\xf0\xa4\x11\xeb\xbd\x7c\x6e\xd3\x4d\x8b\x5e\x5b\x2e\x2e\x7a\x8c\x74\x7c\xee\x8a\xcc\x99\x59\x33\x90\x86\x4e\x1b\x8c\x69\x0f\xed\xe2\xe2\x59\x48\xa6\xb9\x28\x8e\x49\xa4\xb8\x24\x25\x97\xcc\x25\x74\xf2\xce\xa3\xbe\xcf\xdd\x72\xb8\x5b\xed\x63\x0e\xe5\xad\x82\x38\xf8\x60\xec\x2d\x22\x96\xc3\x31\x67\x49\xe2\x8f\x11\x41\x4b\xf5\x38\xd4\xf6\x12\xdf\x86\x56\xdf\xb2\x0f\x11\x19\xb5\xef\x54\xab\x27\x6a\x01\x22\x2e\x88\x3b\x91\xc2\x9d\xaf\x7a\xc9\xc5\xc9\x57\x2f\x21\x8c\x32\xc1\xd5\xe8\xd7\x02\x55\xb6\x86\x61\xc3\x2b\x93\xba\x4b\xfe\x4f\x7f\xe6\x5e\x4b\x83\x7c\x04\x88\x83\xf7\x43\xe6\x13\x0f\xbc\xa2\xd7\x22\x9d\xbf\xe8\x56\x77\x16\xe5\xbe\x0b\xfe\xbc\x95\x38\x90\x51\xb5\x4b\x17\xff\xc8\xbf\x85\x37\xfb\x08\xea\x07\x10\xf7\x9f\x41\xf3\xcf\xb8\x3d\xd6\xe6\xfb\x06\xcc\x3f\x06\xbb\xc4\x08\x2c\x69\xb5\xf0\xbb\x5a\x8d\xfc\xc2\x32\xb2\x82\x4c\xd5\xf9\x56\xe9\x42\x07\x9b\x03\x10\xeb\x72\x10\x07\xa5\x70\x8b\xff\xbd\x82\x3d\xe0\x83\x3e\x4d\x02\x56\xd2\x66\x5f\xc7\xa2\xe7\xb8\x76\xfb\xf7\x59\x71\xb2\xca\x96\x2e\x74\x9e\x57\xe1\x5b\x20\x12\x1a\x65\x66\x59\xc7\x44\x33\xec\x43\x34\x1d\xc4\xc1\x25\xd0\x72\x24\x92\xe9\x95\xeb\xc7\x57\x4b\xd9\x3c\xca\x62\xae\x5e\xa4\xaf\x5b\x49\xe2\xff\x9c\xca\x89\x7a\x96\x15\xb7\xf5\xfb\x31\x94\xc5\x0f\xe2\xe0\x12\x10\xe8\xe8\x25\xe5\x1a\xc5\x16\x18\xa1\x51\x23\x6e\xe8\x5e\x71\x5e\x97\xce\xcd\x68\xe7\xc8\x47\x57\xb0\x42\x1e\xa9\xec\x9f\x3c\x07\xe5\x58\x02\x38\x78\x3f\xf4\x32\xdf\x98\x46\x8b\xb7\x60\xfa\x21\xce\xa2\xf6\xe1\x9b\x10\x3d\xf6\x05\x8e\xe3\xf1\x1f\x2f\xe9\xd5\xc6\x53\xd6\x07\x59\x7d\xa0\x47\x17\x40\x1c\x5c\x02\xf7\xae\x84\x4a\xbf\x54\xf6\x4b\xbe\xcb\xe2\x4a\x70\xd0\x6f\xbc\xc1\x55\xbf\x7f\x7d\x4d\xce\xb8\xf3\x0e\x85\xe9\xe3\xd0\x52\x7f\xe8\xd4\x0c\xc4\x41\x29\xdc\x7f\xb7\x66\xa0\xc1\xf5\x34\x09\x74\x6e\xd0\x1f\x9f\xbb\x83\xac\x4a\xc0\x47\xf2\x1e\x65\x9f\x55\x36\x7c\x5c\x4c\x88\x47\x6f\x5e\xbd\x81\x2c\x5c\x67\x98\x45\x0d\x3a\x29\x00\x71\x70\x09\x78\x6e\xaa\xbd\x93\xf2\xd4\x5b\xc6\x70\x58\x88\x67\x47\x0e\x3b\x9c\xd2\x43\x0e\xc3\xc2\xbf\x69\x7f\xc9\x23\xf4\x81\xe0\xcb\x22\x31\xe8\x12\x16\x80\x3b\x91\xb6\x67\x62\xa1\xe5\x6f\x7c\xee\x9d\xb4\x37\x2e\x3f\xb7\xa6\xaf\xa2\xfb\x34\x4d\x3b\xbb\x92\xca\x63\x46\x8f\x8b\xce\x9e\x13\x57\xa1\xcb\x5d\x20\x0e\xde\x0f\xc2\x3d\x9b\x2f\xc9\xac\x8b\xa4\x06\x36\x74\x73\xbf\x5a\xc7\x6c\x35\x8b\x2f\x90\xb1\x90\xb2\xd7\x6d\x06\x70\x1a\x3c\xb2\x2a\x86\x2e\xa3\x81\x38\xb8\x04\xa2\x6e\xec\x72\xfd\xba\xfa\xfc\x57\x74\x25\xab\x0b\xca\xdd\xa9\x18\x74\xf7\xa0\xa3\xcd\xb6\x46\x1e\xf5\x60\xe3\xe8\xec\x27\xd3\x3f\x11\x4b\x32\x10\x07\xa5\x6e\x0a\xfe\x7d\x59\x0e\x9a\xe9\x4e\xd3\xc0\xe8\xfe\x70\xc3\xb0\x5c\xe9\x57\xcc\x6b\xb7\x86\xe6\xbb\x1e\x8d\xb6\xde\xe3\xd7\xfe\x69\x83\x2d\x9f\x72\x63\x4d\xbb\xb0\xb6\xef\x22\xa2\xed\x20\x0e\xae\x81\x6d\x0f\x8d\x7e\xde\xae\x5f\x73\x9f\x75\x0d\x34\x66\x94\x5d\x0f\x5d\xd2\x29\x5f\x78\xc8\x0e\x6f\xb9\x1b\x7c\x5d\x7c\x84\xfe\xfe\x33\xb4\xdc\x07\x70\x70\x0d\xec\xfc\x6c\xe5\xf5\xf3\xce\xaf\xac\xad\x21\x7a\x45\xe6\xa1\xa7\x87\x4c\xff\x1d\x4d\x2b\x77\x29\xfa\x6d\x9b\x57\x83\xec\xb7\x0d\x5a\x44\x5c\x10\x07\xef\x07\xd2\x84\xa8\x29\xf9\xd1\x32\x7f\x5a\xbf\xb9\x61\x3d\xbe\x70\xc5\xb2\x8f\x52\x19\x36\x76\xdc\xdb\xe7\x0b\x7c\x4b\x99\xb4\x32\xa0\x7b\x24\x20\xee\xc4\x4c\x10\x1e\x9f\x3a\x19\xb1\x57\x10\xb5\xbb\xdb\x6a\x25\x27\x5e\x58\x99\x45\xbc\xc0\xc5\xe1\x20\xa2\xb1\x2c\x80\x26\x4f\xfb\x21\x0e\xa1\x01\x10\x07\xa5\x6e\x02\xac\x19\x68\xd9\x71\x9a\x06\x2e\x28\x37\x77\x8e\xbd\x8f\x49\x9c\xaf\xfc\x64\xf6\x53\x45\xa1\x5a\xba\xb0\xa4\xda\xbe\xcb\x3f\x8e\xcb\x32\x44\x98\x6c\x62\x82\x1c\x3a\xe5\x06\x70\x70\x0d\xe8\x08\xbc\x69\x99\xd4\x61\x53\xfa\xfd\xc0\x15\xff\x4a\x09\xc9\xcc\xd0\x11\x85\xab\xe9\x5c\x12\x21\xf6\x58\xae\xef\xc5\xac\x37\x90\xb6\x40\x1c\x5c\x03\x33\x6b\xed\x14\x6b\x89\xd5\x21\xaa\x37\x0d\x7a\x44\x69\x24\xac\x34\x64\xf3\x99\x4b\xf5\xc3\xa2\xe3\x29\xb0\xa4\x1f\x96\xc4\x7c\x44\xc4\x05\x71\xf0\x7e\x58\x70\x7b\xfc\x75\xa6\xcf\x28\x8e\xee\x66\x73\xcb\xea\x28\x57\xcd\xa2\xae\xbd\x5c\x6c\x80\xd4\xfe\xaf\xb9\xf7\x55\xd5\xa8\xcd\xcc\x88\xb8\x20\x0e\xae\x81\x44\x03\xd7\x26\x43\xc3\x86\x6f\xf7\x43\x6f\x7e\xaf\xe9\x4c\xc8\x99\xfa\x2d\x12\x4c\x73\xeb\x6e\x7f\xcb\xcb\x74\x2d\x8b\x1b\x06\x41\x50\x21\x45\x00\x07\x8d\x03\xf6\x00\x6b\xa6\xf7\xe8\xb6\xe4\x67\xd9\xf6\x7a\xf2\xca\x02\x29\x6a\x09\xfb\x12\x7e\xd7\xfa\x7e\xb9\x0d\x2e\xf6\xab\xd8\x68\xb2\x1c\xaf\x5c\xa5\xfe\xb4\x66\x26\x1a\x8a\x55\xfd\x78\x99\x68\x8f\xf1\xd9\x12\x5b\x49\x77\xca\x8c\x38\xb1\x86\x8a\xef\xd4\x58\x66\x9c\xff\xf8\xc0\x9b\x4b\x98\xeb\x0f\x54\x4e\x42\xf2\x1e\x79\x32\xf1\xf5\x94\x99\x2f\x42\x0d\xdc\xfa\xe8\x5f\xe4\x18\xf5\x0f\x9e\xf1\x73\xd7\xa1\xe9\x3f\x53\x37\x20\xa9\xfb\xb7\x59\x33\x50\xd3\xfe\xb0\x66\xa2\x27\xac\x59\x2e\x69\xea\x83\x83\x20\x77\x9a\x45\x06\xad\xfd\x37\x1e\x7e\xc4\x03\x72\x39\xb1\xbf\x86\xca\xef\xef\x91\xab\xcc\x1e\xbb\x27\xef\x9e\x85\x35\x6b\x3a\x61\xcd\x84\x2c\x3e\x6a\x37\x2f\x26\xc5\xf7\x07\xc5\xb0\x6b\x5c\xfc\x6a\x59\xe8\xbd\x94\x23\xb9\xb9\xea\x25\xa3\x5f\xfc\x6b\x5b\xe4\x87\xe0\x99\x1c\x5f\x9d\xb4\x66\x14\x84\x96\x53\x53\x5f\x71\x36\x33\x3f\x26\x2e\x2d\xea\xe4\x38\x21\xf3\x9c\xb3\x78\x3d\x28\x9a\xd9\x9d\xbd\x69\xa3\x2b\x80\x89\x79\x26\xc7\x57\x27\xad\x59\x21\x15\xf6\xbe\xe2\x1b\x4a\xd3\x41\x0b\xb3\x8d\xc2\x19\x2a\x8a\xc0\xdf\x65\x97\x1b\x83\x22\xb0\x18\x55\x33\xa8\x94\xaf\x05\x9f\x4d\x79\xf3\x93\xd6\xac\x45\x4a\x54\xdc\x32\xec\x83\xfb\x01\x56\x02\x53\x7e\x23\x49\xa5\x85\xfa\x72\x79\x41\x06\x86\xe5\x94\xc4\xe0\x35\x8f\x56\xb2\x33\xa8\x9c\xa6\xfb\xbf\x69\xe8\xb4\xc1\xf8\x97\xab\xb3\xae\x45\x05\xcf\x41\xa0\xe7\xb0\xf8\x1c\x52\x6b\x3c\x96\x2a\xdb\xcb\xe1\x02\xae\x08\x9e\x9e\x37\x49\xd2\x36\x7e\x81\x88\x41\x08\xc4\xc1\x07\x63\x7d\x2b\x7d\x1c\x8d\x31\x6b\xc9\x24\x26\x0b\xff\xf7\x8e\xe9\xb6\x17\x9f\x27\x04\x6a\xbd\x7d\xf9\xb2\x15\xeb\xa9\x4c\xad\x95\x03\xf4\x42\x2e\x88\x83\x0f\xc6\xd4\xcf\xb9\x1f\xbc\xc4\x2a\x68\x38\x97\x59\xea\x34\xd9\x76\x58\xc2\x2b\x61\xb9\x45\x77\xec\xa7\xf9\x3a\x33\xb2\x48\x4e\x37\x8d\x0f\x11\x17\xc4\xc1\x6f\xdc\x5b\x8d\x65\x5c\xbc\x2f\x8c\xee\xa5\xb9\x29\x5b\xc9\x90\xb0\x1d\x45\xf3\x55\xae\xc3\xab\xd6\xa3\xff\xa8\xae\x50\x3f\xcf\xe1\x01\x54\x36\x1d\xc4\x9d\x38\x8d\x5b\x2e\xb6\xfc\x6e\x44\x5d\x2b\x53\x6d\xf9\xbd\xb1\x42\x4d\x84\x9e\xe5\x62\x2b\xd2\xcb\x77\x17\xd0\x39\x5b\x51\xa7\x54\x1e\x72\x23\xd6\xe5\x20\x0e\xca\xed\xfc\xbb\x35\x03\x7d\xd0\xa7\x49\xa0\xd8\x79\xfc\x27\xbe\x64\x7a\x28\xae\x92\x8f\xc0\x6b\x61\xd9\xc7\x38\xa1\xd7\x6e\xfd\xf0\x7f\xa1\xd9\x4b\xfb\x64\x21\x47\x1a\x13\xca\xed\x04\x71\x70\x09\x1c\x67\x34\x29\x2f\x8f\x2f\xf1\xe6\xf6\x2a\x5c\x8c\x8a\x60\x9d\xb4\xb5\x7e\x6a\x17\xd8\x26\x22\x86\xdb\xbc\x71\x34\x2b\x80\xa4\x80\x88\x0b\xe2\xe0\x12\xf8\x95\x54\x9b\xde\x5d\xa8\xa2\x33\x37\xe4\xe5\x97\x27\x1a\xa1\x91\x6d\x74\x65\xab\xe1\xe9\xe3\xec\x4b\xd5\x98\xd4\x38\xfb\xf5\x63\x90\x64\x01\x1c\x5c\x02\x94\x6c\x98\x1b\xb3\x2f\xc9\xa2\xa7\x2a\x4c\x25\xba\xe5\x69\x88\xcc\x52\x37\xf1\x57\xb0\x5f\x4d\x79\x09\x48\x91\x96\x10\x5d\xff\xef\xad\x3e\x00\x77\xc2\xf5\x37\x24\xec\xbe\xcf\xd1\xd9\xd1\xc7\x25\x58\xf9\xfe\xf6\xbd\x82\x91\x34\x0d\x05\x11\x1d\x43\xb8\x42\x41\x3a\xeb\x33\x64\xdc\x58\x84\x04\x40\x1c\x94\xdb\xf9\x77\x6b\x06\x1a\x5c\x4f\x93\xc0\x4c\x7e\xef\xc1\xd0\x13\x87\x75\x7e\xf1\x71\x06\x89\xce\x6f\x05\x32\x8f\xe2\xaa\x7e\x5f\x0b\x7a\xfb\x60\x79\x51\xef\x67\x9b\x13\xf4\xaf\x02\x71\x70\x09\x64\x27\x76\xfa\x8e\x92\xb2\x97\xae\xeb\x49\x52\x70\xbc\xe4\xfb\x12\xfb\x8c\xbf\xea\x9a\x88\x9c\x4d\x7a\xb9\xcd\x8f\x5a\x7e\x3b\x49\x44\x5c\x10\x07\x97\x00\x13\x53\x96\x11\xa5\x57\xfa\x3c\x7f\x07\xad\x57\x25\x4b\xfc\x25\x9c\x41\x02\xd1\x06\x57\x4a\x1b\x14\xb5\x2b\x2c\xb3\x85\x31\x90\x3b\x07\x71\x70\x09\x88\x9a\x5d\xf4\xfa\x39\x78\x25\x87\x8c\x7a\x86\x4f\x7f\x25\x76\x66\x06\x43\xae\xf2\xc8\xdb\xa4\x5e\x70\xa2\x9e\x21\x22\x28\xc9\x0f\x11\x17\xc4\xc1\xfb\xb7\x2d\x50\xcd\x9d\x09\x4d\x9e\x3d\x2a\x49\xf1\x0e\xd2\xa6\xa5\x0e\xb9\x9c\xc6\xd3\xeb\x99\x3f\x9e\xe5\xd4\x8f\x54\x87\xf1\xbf\x58\x81\xde\x14\x02\x70\x50\x4e\x17\xc0\x9a\x81\x66\xba\xd3\x34\x50\x5a\x4b\x6d\xe9\x76\x7e\xa9\xb5\x4f\x8a\x4b\x30\x9e\x92\xff\x2a\x65\xee\xc2\x85\x4b\x23\xf1\xf9\x36\xda\xc7\x0d\xcd\xee\x17\xa0\x13\x08\x10\x07\xd7\x80\x6c\xdc\xe0\x51\x97\x96\x26\x2e\x7b\xc6\x92\x78\x6a\x48\x00\xdf\x3d\xa7\x82\xd8\x8b\x42\xe1\x5b\x98\x0b\x51\xda\xc7\x81\xfa\x3f\x11\x71\x41\x1c\x5c\x03\x0a\x37\xd1\xc6\x82\xbc\x3f\xcc\x5c\x94\x89\x19\x40\xf2\xe4\x7c\xb6\xe3\x88\xb4\xc9\xdf\x11\x63\x9f\x90\x16\xa5\x70\x54\x51\x05\x7d\xae\x20\x0e\xae\x01\x91\x3b\x0f\xf2\x6b\x30\xbf\x6d\xa4\x14\x5f\xa8\xea\xad\xf0\x53\xed\xed\x3d\x8c\xbf\xa6\xbd\x48\x45\x7b\xf7\x40\x13\x63\xc4\x1e\x3a\x3c\x07\x71\xf0\xfe\xed\xc9\x6a\xab\x93\x3a\xc0\x09\x8b\x33\x64\x74\xdf\x23\xcd\x73\xdf\xb3\xc6\xac\x97\xa6\x93\xbc\x8f\x7f\xf7\xf8\xf1\xe4\x27\xf1\x39\xc8\x9a\x01\x38\x28\xa7\x0b\x60\xcd\x40\xcb\x8e\xd3\x34\x60\x89\x31\xcb\xe1\x30\xe6\x51\x1d\x42\xc1\xde\x86\x5f\xf2\x41\xcd\xf9\x99\xb3\xba\x78\xc5\xe4\x18\xc7\x4a\x66\xd6\x4f\x3c\x17\x35\x44\xdb\x41\x1c\x5c\x03\xb1\x96\xad\x5d\xbc\xe2\x8b\x2c\x22\x26\x29\xa2\x1c\x7a\x7d\xfb\xed\x6a\xaa\xfe\xc9\x0f\xe7\x16\xcf\xdf\x7d\x7c\xae\xb2\x4a\x13\x7a\xbf\x12\xc4\xc1\x35\xf0\x9b\xf7\x53\xef\x05\x09\x24\xff\x10\x7a\x49\x2b\xa6\x23\x65\x4a\x05\xf4\xc0\x27\xbb\xb4\xfa\x09\x9e\xc3\x13\xb4\xb1\xcd\x2d\xd0\x7b\x78\x20\x0e\xae\x01\xfc\x83\x4f\x12\xc3\x4a\x1f\x67\x0f\x6e\xf8\xf0\x5e\x7f\xf6\x71\xc8\x43\x4d\x3c\xe3\xf9\xcd\xe5\x1b\x81\x21\x64\x87\x44\xcf\xb3\xa0\xdd\x4a\x10\x07\xef\x5f\x66\x0c\x9d\xfa\x85\xef\x5c\xbe\xe6\x9c\x82\xba\x51\x03\xb9\x69\xb6\x59\x46\x2b\x7e\x6a\xc6\xf9\x46\xdb\x66\xf3\xf4\x2f\x37\x3e\x21\x34\x00\xe2\xa0\x71\x00\x64\xcd\xe6\xa2\x7f\x3e\x7d\xd1\x6c\x28\xc4\x9e\x12\xd7\xcb\xbe\xb7\x8c\x25\xf8\xb4\x7a\x64\xb9\xbc\x6b\xbf\x00\xa5\xea\xa9\x36\xe9\x37\xb3\x3f\xad\x19\x2a\x8a\x33\xa6\x5c\x7c\xbe\x53\x49\xaa\x8e\x1d\xf9\x79\xca\x38\x0b\x9d\xcf\x7b\x8d\xe2\xa6\x64\xe4\xb9\xb6\x55\x5e\xd3\x5a\x1c\x7f\xa0\x8a\xcf\x66\xfb\x1f\x7b\x06\x6e\x49\xae\x28\x50\xf5\x46\x3d\xa9\xd0\xd3\xcf\x9c\x20\xdf\x79\x16\x1e\xf8\xa8\x93\xff\x88\xc6\x2a\xe3\xdf\x66\xcd\x40\x4d\xfb\x33\xd7\xec\x84\x35\xbb\xdc\x97\xe7\x8d\xf3\xe1\x0e\x45\xd5\x97\x89\x76\x37\x9b\xe1\x3c\x7a\x94\x97\xbd\xb8\xdd\xeb\xa6\xe7\x44\x7e\x60\xeb\x15\x28\xfd\x3c\x0b\x6b\x86\xa4\x04\xff\x55\x71\xee\xb1\x39\xd3\x20\xa2\xd6\xcf\x1e\xbb\x86\xe4\x38\x4e\x64\x0b\xbc\x6f\xd0\x3b\xe4\xc4\xf0\xbc\x57\xfc\x42\x84\x27\x8f\xba\xce\xe4\xf8\xea\xa4\x35\x33\xd9\xd4\xad\x68\xf7\x71\x18\xea\x67\x79\xc6\x53\x5a\xf1\x85\x2c\x62\xeb\x7a\x5c\x9d\xfa\x15\xf9\x96\xf5\xcb\x18\xa9\xdf\x36\x34\xcf\xe4\xf8\x4a\xf3\xc4\xcf\x4a\x92\xdb\x31\x64\x3a\x48\xf6\x5c\x16\x89\xa2\xa1\x8a\xa7\xee\xea\xcd\x3b\x27\xd1\xe9\x3e\x54\x96\xc4\xab\x31\xca\xc0\x96\x41\x73\x26\xad\x3d\x69\xcd\x28\xc5\x2e\x6d\xb6\x68\x30\x1b\xfb\xa7\x09\xfb\x1c\x88\x1d\x34\x49\xa7\x54\xe3\x0d\xb6\x31\xa9\x6b\x61\xc4\xb6\x61\x35\x57\xde\x3e\x33\x6b\x06\xd2\xd0\xa9\x35\x57\xc6\xef\xbf\x7a\x7a\x0e\xff\xe6\x3d\xe4\x59\x4c\xe6\x15\xfe\xcc\x9c\x8b\x6f\x6a\xc7\x3f\xdf\xa7\x9b\xb5\x11\x14\x15\xc5\x50\x83\xca\x3c\x82\x38\xf8\x60\x7c\x27\xe7\xe9\x6b\x72\x77\x24\x99\x0c\x35\xf1\x27\x59\x3c\x24\x69\x51\x52\xf7\xe4\x9d\xac\x99\xdf\x3f\x69\x91\x50\x89\xc8\x39\x7c\x00\x95\xc7\x01\x70\xf0\xc1\xf8\x56\x3d\xe6\x5b\xda\x94\x86\x3e\x23\x33\x1c\xd2\xd4\x08\x87\x9a\xc1\x8b\x5b\x48\xfe\x17\x25\x18\xe3\xae\x39\xbe\x10\x2a\xd4\x87\x12\xa3\x40\x1c\x7c\x30\x7e\x85\xfa\x54\x89\x98\xd9\xb3\x49\x76\x30\xe2\x5a\x37\x92\x78\x7e\xfc\xb3\xe3\x56\xb2\x1e\xba\x5c\xfd\xa1\x10\xa2\x9b\x59\xd4\xee\x88\xb8\x20\xee\x3f\x83\xe6\x9f\x71\xbd\x96\x1f\x84\xab\x87\x11\x0f\xa6\x1d\x46\x89\xa0\x64\x5a\x77\x09\xdc\xfe\x7c\x7e\x41\x4b\xbd\xe2\xa9\xff\x5d\x4a\xb7\x5d\x79\x32\xc4\xba\x1c\xc4\x41\xb9\x66\x7f\xb7\x66\xa0\x0f\xfa\x34\x09\x7c\xfa\x4e\x7c\x77\x80\x70\x9f\xcc\x96\x95\xe5\xd5\x27\xdd\x05\xb7\x97\x9e\xb2\xdd\xfb\xbe\xb6\x0f\x98\xa3\xbe\x5c\xbf\x3d\xf8\x74\x1e\xd1\x74\x10\x77\xe2\x26\xd3\xfe\x07\xf2\x57\xc6\xc5\x73\xa4\xca\x57\x5f\x25\xf8\x3f\x6b\xb4\x54\xac\xe2\x38\xb8\xe3\xb0\x3f\x9a\x93\x64\xe0\x7e\x78\x04\x55\x50\x04\x71\x70\x09\x30\x10\xeb\xe7\xeb\x93\xb7\x5c\xdb\x2d\xbe\x3d\xc8\xc2\xa2\xd0\x3e\xae\xa5\x93\x41\xf3\x7b\xb9\xb5\xdd\x52\xe0\x02\x91\x8d\x16\x74\xc0\x09\xe2\xe0\x12\xa8\x18\x59\xf1\xdc\xc3\xa4\xf6\x90\x20\xa0\xd4\xa2\x98\x46\x6e\x51\x95\x1d\x96\xe9\x7a\xa1\xbb\xca\x7a\xb8\xbc\x89\xae\xa7\x14\x8d\x88\x0b\xe2\xe0\x12\xc0\x35\xaf\x2e\x21\x98\x7e\x5b\x86\xca\xfa\x50\x62\x71\x64\xd7\xd1\xf9\xc6\x1a\x4d\xad\x62\x7f\x03\x5d\xf2\xdd\xeb\x0c\x94\xf3\xab\x08\x09\x80\x38\x28\xd7\x4c\xe9\xaf\x12\x00\x0d\xae\xa7\x49\xe0\xe2\x3a\xd6\xa5\x9d\x3a\x64\x02\x3e\xab\xf5\xed\xeb\xa3\x73\x03\x7a\x47\xf8\x35\x14\x23\x35\xc6\xa1\x83\x9e\x55\x36\xf7\xaa\x7b\x11\x4d\x07\x71\x70\x09\xb0\x8f\x8f\x30\xc4\xc5\x71\xad\xdf\xb2\x49\xa3\xcb\xfd\xd8\xcc\x69\xd2\xb8\xd3\x6a\xc2\xf1\x3c\x4f\x71\x61\x5f\x3d\x64\x4d\x06\x2a\x76\x09\xe2\xe0\x12\x30\x22\xc5\x35\x11\x2e\x58\x4f\xa4\xbc\x70\xcd\x84\x2d\x61\xfc\x7d\xdd\x03\x65\x82\xe1\x07\x82\xbd\xe3\xce\xb3\x4a\x6d\x5b\x75\x0d\x88\xb8\x20\x0e\x2e\x81\xed\xb5\x9e\x6e\xff\x49\xa4\x47\xa6\x6b\x3a\xe9\xb3\xf1\xf3\xa2\x5c\x78\x0b\x0c\x3a\xf6\x8b\x19\x57\xc6\xf2\x9e\x17\xff\x7a\x60\x05\x9d\xf0\x00\x38\xb8\x04\x0a\xf0\x6d\x91\x59\x2d\x6e\x6d\x5f\xb2\x26\x27\x10\x66\x0c\x55\x9d\x23\xa2\xec\x5e\xea\x2e\x25\xae\x99\x6f\x12\x7d\xf9\x76\x08\x5a\x92\x81\x38\x28\xc7\x04\x60\xcd\x40\x33\xdd\xa9\xe5\x36\x9c\x5e\x90\x07\xfa\xe4\x97\xdf\x10\x69\x97\x53\x8b\xf8\x5c\x6b\x4c\x6a\xfd\x23\xaa\xac\xfc\x5d\x63\xfd\x07\x3c\xad\xfa\x40\xe8\xe5\x35\x10\x07\xd7\x00\xa5\xb2\x4f\xe1\x80\x0a\x75\xc0\x45\xf3\x07\x9a\x5c\x37\x87\x7f\xe3\xba\x49\xfa\xa7\x90\x04\xda\x2d\x99\x22\xf7\x08\x7e\xe7\x4b\x80\x76\x3c\x00\x1c\x5c\x03\xb5\xaa\xcd\x65\xd9\x74\xd7\xc4\x1e\x71\xbf\xd8\xd3\x9e\xb8\x46\x5f\xca\xc9\xfb\x21\xb6\x46\xc2\xeb\xca\x9e\x1f\xe3\xe0\x50\x18\xf4\xe4\x0c\x88\x83\x6b\xe0\xfd\x0d\xf2\xac\x1d\x4d\x2b\x86\x63\xc3\x2d\x63\x55\x82\xc3\x8c\x55\xec\x1f\x57\xb6\x56\x26\xaf\x69\xb5\xcb\x0a\x2a\x95\x7c\x80\x66\x02\x10\x07\xd7\x80\x91\xca\xa0\x87\xdb\xe4\x51\x74\xab\x66\x44\x4e\x81\x6b\x9f\x2e\xb3\xd6\x36\x05\x86\x77\x7e\x84\x67\xad\xcf\x8a\x1c\xb6\xed\x75\x84\x06\x40\x1c\x94\x6b\xa6\xf9\x77\x0d\x80\x96\x1d\xa7\x69\x20\xe6\xa6\x69\x22\x93\x80\x43\x4f\xf7\xd3\x34\x55\x5c\x4f\x66\x13\xfe\x05\x94\xf4\xe4\x3c\xe4\xfa\xbd\x27\xb3\xdb\x82\xd3\x83\x61\x88\xb6\x83\x38\xb8\x06\x82\x3a\xcc\xd9\xdd\xef\xe4\xdd\x9a\xd3\x4f\x2a\x66\x21\xce\x5b\x51\x2e\xdb\x6d\xe8\x66\xe8\x77\x79\x1b\xe9\x8b\x1b\xac\x21\x08\xc5\x05\x71\x70\x0d\xb4\xe3\x61\xe6\x38\x9e\x7f\x45\x57\xec\xd0\x58\x67\x8c\x73\xbe\x7a\x9e\xf7\xb3\x1a\xc7\xd5\xd6\x2e\x7c\x79\x46\xda\x8d\x95\x1c\xe8\xbd\x48\x10\x07\xd7\x40\xa9\xae\x03\x86\x28\x76\xf4\x70\x95\xf2\x3d\xa4\x3e\xa6\xe4\xf3\x19\xd7\x48\x55\x49\x5a\x1e\x63\x71\xbc\x7e\x64\x51\xc9\x12\x03\x95\xdd\x01\x71\x70\x0d\xb0\x70\x44\xc5\x04\x18\x6b\xd6\xeb\xf1\x1b\x48\xcf\xe4\x90\x84\x45\x7e\x3e\xda\xf1\xca\x49\x8d\xd0\xb8\xfa\x70\x57\x76\x3c\xc6\x0f\xa1\x01\x10\x07\x8d\x03\xff\x3f\x6b\xa6\xf7\xbf\x59\xa8\xd3\x4b\xae\x3c\xad\x19\x79\x2c\xf7\x6a\xf4\x8a\x19\xb2\x49\x14\xb6\x0c\xd3\x79\x5c\xce\x97\x96\x33\x6c\x82\x47\xb7\x9f\xc9\x37\xb5\xc9\x07\xe4\x21\xca\x97\x80\xb8\x93\x25\x57\x98\x24\xf7\x97\xdb\x96\xbe\x8f\xdf\x7a\xce\x15\x20\xd7\x8f\xaa\x22\xf7\x34\xa8\x72\x38\xee\xf3\xee\x68\x7a\xd1\xad\xf8\xc2\xa1\x0f\x88\xc8\x20\xee\x64\xc9\x95\x03\xbd\xe3\x77\xe8\x81\xe2\x19\x83\xc6\xc4\xfa\xda\x8b\x13\x8d\x05\x5e\x53\x61\xbb\xf9\x9f\x09\x08\x7a\xc5\x22\xdb\xbf\x3d\x24\x42\x44\x06\x71\xfe\x12\x48\x48\xff\xd4\x82\x5b\x79\x86\xf8\xdb\x78\x14\xb1\x65\xe1\x0b\x06\xea\x45\xfc\x78\xbf\xb4\x09\x27\x65\xcd\xe2\x6f\x76\x07\xec\x4a\x7f\xcb\xbb\xf0\x15\x2a\xb9\x82\xe3\x4e\x1a\x42\xbe\xee\x91\xd5\xd7\xa5\x92\x30\x2b\x3c\xdb\x5e\x39\xbf\xbb\x62\xa7\xaf\x53\xe5\x28\xfc\xe5\xc9\xa2\x4c\x7f\xda\x9f\x36\xf8\xe0\xfd\x97\x6d\xa7\x8f\x32\x46\x64\xac\xbd\x3a\xa6\x2e\xfc\x37\x83\x9f\x75\x21\xd9\x73\x86\x76\xef\x62\x86\x07\xac\xfc\x64\x55\xfc\x03\xfd\xd2\x67\x55\x5d\x90\x54\xce\x1e\x6c\x4b\xca\xf9\x34\xb2\xc7\x87\x34\x6a\x7a\x7e\x22\x04\xe5\x1d\xd2\x56\xab\xd3\x48\x90\xdb\xe5\x7f\x9b\x0d\x06\x35\xed\xcf\xbc\xbe\x13\x36\x78\x0a\xbd\x8b\x3f\x58\x6a\x48\x24\x14\xfd\x11\x53\x2f\x5d\xc6\xb7\x03\xd9\xf6\x20\x9a\xca\x27\xdf\x9b\xd5\x04\xef\x72\x34\xaa\x52\x9e\x85\x0d\x16\x3d\x61\x83\xc7\x49\x9d\x3c\xc7\x3e\x32\x57\xf2\xb3\x58\x56\x6c\x59\xe9\x7c\x78\xc0\x11\x60\xa0\x25\xd6\x94\x7c\xe9\x3c\x4f\x3a\x15\x7a\x2f\xef\x99\x1c\x15\x9e\xb4\xc1\x82\xc8\x23\xe9\x35\x57\x6b\xc4\x6a\x9d\xd9\xd3\x97\x7b\x0e\x22\x33\x22\x03\xb1\x27\x32\x13\x75\xea\x9e\x55\x65\x3e\xbd\xd9\x75\xf1\x4c\x8e\x0a\x4f\xda\x60\x3b\xc6\x32\x07\x46\xf4\x83\x17\xee\xc8\xb9\x73\x0b\x2e\xb2\x74\x2a\xb4\x9a\xb9\xa4\x49\xe6\xb4\x11\x6c\xec\xa6\x14\x3a\xe2\xe6\x67\xd2\xda\x93\x36\xb8\x23\x3e\x44\x4c\xd5\x2b\xe1\x6b\x18\xee\xc2\xee\x8b\xcb\xdb\xa6\xba\xe2\xef\x71\x7f\x7a\x95\x47\x67\xdf\xb1\xb0\x5c\x38\x3e\xdf\x70\x66\x36\x18\xa4\xa1\xd3\x26\xbe\x1a\x49\xaa\x0e\x74\x0f\xef\x99\x02\x6e\xdc\xb9\x62\x61\x16\xf2\x09\x0c\x32\x4d\xa3\x61\x3e\xdb\x87\x81\xcc\xc5\x41\x18\x5b\xd0\x9e\x3c\x88\x83\x4f\x7c\xea\xcf\x6c\x16\xcb\x2e\x31\x79\xc7\x8f\xd4\xda\xd0\x57\x5a\xbd\x2c\xff\x7d\xcc\x3a\xd0\xda\xaa\xb6\xa8\xde\x14\x1c\xb8\xf4\x76\x09\xba\x71\x0f\xe0\xe0\x13\x1f\x2f\x8f\x1d\x4b\x4f\x24\x92\xea\x8f\x18\x26\x96\x0b\x5e\xef\x52\xb0\xb8\xcc\xb7\x1b\x6f\x9e\x7b\xe3\xda\x51\xb7\xcd\xc6\xc2\x98\x88\x88\x0b\xe2\xe0\x13\x9f\x3e\x35\xca\x98\x62\x27\xd2\x6d\xf5\xd9\x84\x4f\xbc\x79\xba\xbf\x18\x66\xfd\x65\xab\xb0\x65\xdd\x1a\x39\xdf\x8e\xeb\x14\xb4\x77\x41\x27\xaa\x00\xce\x5f\x0c\x09\xf9\x1f\xd7\x50\x16\x77\xad\x18\x96\x28\xd1\xd4\x2c\x0b\xc2\x85\x79\x24\x8b\x89\x51\x46\x07\xdd\xbe\x6c\x60\x5c\x30\x1a\xf4\x1b\x78\x30\x6d\x8c\xf0\x40\x20\x0e\xca\xeb\xfb\xbb\x0d\x06\x7d\xd0\xa7\x49\x00\x65\x46\x8e\xa2\x4a\xc6\x28\x8c\xf7\xb0\xac\x0e\xb5\xaa\x31\xd0\x15\x8b\x9c\xb9\x27\x05\x8f\x0d\x67\x28\x8b\x89\x89\x94\xe7\x12\xa2\xe9\x20\x0e\x2e\x81\xb7\xbd\xaf\x65\xda\xc6\x8e\xf3\xd9\x1c\xa5\x5f\x6b\xc7\x3a\x0b\x24\x6a\x78\x8c\xbe\x6e\xcb\x63\xb8\x1c\x2a\x98\x19\xc3\x23\x0a\x3d\xfa\x00\xe2\xe0\x12\xd8\x10\x55\x34\xb8\x90\x72\x35\x5d\xd8\x42\xab\xde\xef\xce\xfb\x8f\x8f\xf0\x44\x54\x98\x2e\x85\x99\xf7\xbc\x61\x0c\xa0\xba\x15\x03\x55\x9f\x05\x71\x70\x09\x58\x37\xa0\x89\xa4\x31\x6a\x51\x4f\xd9\xbb\x1d\x3e\x92\xde\xf1\x94\x2b\x0f\xfc\x6d\x7b\x59\xaa\xa3\xee\xc9\xb7\xbe\xe4\xba\x11\xe8\xc6\x10\x88\x83\x4b\x40\x0a\x5b\xe7\xeb\x1b\xc6\x8b\x26\x32\x09\xac\x7b\x6f\xd8\x96\xf0\x0c\xd2\x98\x2d\xca\xd9\xed\x73\xd9\x14\x31\x1e\x8e\x1d\x5e\xf5\x40\x48\x00\xc4\x41\x79\x7d\x7f\xb7\xc1\xa0\xc1\xf5\xd4\xec\xde\x52\xeb\x1b\xf6\x9b\x44\x5f\x6e\xf7\x3f\x8b\xa9\x8a\x54\x6a\xc4\x19\x9f\x31\x73\x20\xe1\x8a\x4a\x7a\x79\xa8\xe0\xa5\x3d\x0b\x9d\x24\x82\x38\xb8\x04\xea\x54\x0e\x75\x06\x1f\x7a\xe9\xf9\x8c\x6e\x6e\x94\x4e\xc4\xeb\x5e\x34\x1c\xd0\xf0\xb9\xe3\x12\x35\x52\x72\x3b\xb7\x89\x38\xb4\x11\x8a\x0b\xe0\xe0\x12\x60\xf1\x0f\x7c\x35\xb3\xfb\x3a\xec\xd3\x3d\x42\xdb\xe1\x6d\x85\xab\x29\x9d\xe1\xad\x1f\x07\x70\x54\x63\xe7\x62\xce\x95\xf7\x98\x39\x22\xe2\x82\x38\xb8\x04\x88\xee\x62\x64\x1b\x5f\xa7\x9b\xbc\xc8\xf8\x8a\x50\x08\xc7\x89\x79\xa7\x28\xee\x91\xea\xf0\x8f\x8a\x25\x0b\x5e\xc3\x06\x7b\x0f\xe8\xb2\x2b\x88\x83\x4b\x00\x95\xda\xda\xf6\xba\x6a\x38\x45\x8a\x00\x6e\xbb\xcf\x8b\x8e\xaf\x86\x83\xbf\xd4\xe8\x84\xcf\xd3\x67\xcd\x78\x33\x68\x4a\xf2\x57\x21\x96\xbf\x20\x0e\xca\xe7\x01\xd8\x60\xd0\x4c\x77\x9a\x06\x74\x2e\x6f\x34\xac\x1e\x4e\x9c\xe3\xab\x24\xa2\x4f\x6c\xf6\xc1\x9c\x0a\x9e\x7c\x69\x4d\x29\x62\xd7\x3c\xd5\xec\x4e\xe7\x8b\x0e\x3d\x03\x06\xe2\xe0\x1a\x40\x71\xc4\xaf\xf0\xd3\x69\x59\x14\xff\xc6\x10\x3e\xe3\xe2\xdb\xca\xb5\x7d\x4b\xce\x36\xea\x86\x87\xef\x37\xbc\x42\x5b\x19\xf7\x0f\xd0\xf0\x02\xe0\xe0\x1a\x60\xcb\x7d\x6b\xce\x23\x6f\xfc\xc8\x71\x42\xfb\xab\x1f\x66\xc6\xa5\x19\x45\xc1\xad\xb4\x01\xb7\xcc\xf7\x58\x52\x7a\xb2\x2d\x52\x37\x11\x71\x41\x1c\x5c\x03\xe8\xfe\x3e\x0f\x6f\x12\x3a\x53\xc6\xb5\xec\xee\x4c\x52\x90\x49\x3e\xe2\x2f\x29\xb5\xaf\x97\x1b\x3a\x67\xe1\x7a\x35\x8e\xdf\x01\x03\x11\x17\xc4\xc1\x35\xd0\xc8\x7b\x73\xf8\xd7\x61\x75\xb9\x04\x25\x0e\x93\xa5\x99\xe9\x93\x4c\xac\xfd\x9e\x02\x29\x1e\xb2\xab\x38\xe4\x9b\xc5\xbc\xf8\x0e\x08\x0d\x80\x38\x28\xaf\x0f\x60\x83\x41\xcb\x8e\xd3\x34\x70\xae\x34\x15\xa7\x4f\x7a\xae\x9a\xda\x98\x79\x8c\xdd\xd4\x3b\xe4\xea\xd7\xfd\x60\xd5\x30\x7c\x41\xcb\x90\xe9\x77\xca\x43\xae\x50\x36\x3e\x88\x83\x6b\x80\xe8\x35\xaa\xc0\x6c\x60\x2a\x73\xd1\x9c\x57\x71\xb7\x8f\xe6\x93\xfc\x4b\x11\x87\x39\x3c\x04\xb4\xee\xea\xdd\xd9\x63\x02\xd5\x28\xd0\x77\x05\xe0\x4e\x5c\x20\x2e\x5d\x74\xdb\x94\xd8\xbb\x34\xba\xe6\x6e\x6e\xd2\x38\x78\x25\xbc\xbe\x0c\x33\xe5\xce\xab\x1c\x69\x8e\xf9\x03\xdd\xb8\x72\xa8\x9c\x0f\x88\x83\x6b\x60\x28\xd7\x73\x4c\x64\xd1\xe6\x95\xc2\xb5\x0e\x1b\x61\x17\x7a\x2a\x4c\xfc\x27\x5b\x4a\xf6\xaf\x4a\x54\xda\x2a\xe8\x5b\xac\xd0\x15\x11\x71\x41\x1c\x5c\x03\xf4\xf4\x2a\x26\x56\x6a\xf2\xce\x6b\xe7\x0a\xb9\x93\x93\x1d\x29\x1b\x25\x77\x6d\x88\xbb\xe9\x6c\x84\x3f\x3f\xfc\x68\xe1\x5c\x80\x8d\xd0\x00\x88\x83\xc6\x01\x80\x0d\x06\x59\xa8\xd3\x6d\x70\x85\xdc\xc0\xf8\xa3\x2b\xf7\xd2\x86\x5f\xa6\xa9\x7d\x63\x56\xc0\xa6\xc8\x65\x16\xd9\x29\xe9\x39\x3a\xef\x48\x60\xc8\x22\xcc\x24\x86\xb0\x94\x20\xee\xa4\x0d\xce\x20\xd5\xbf\x35\x7f\x2d\xb7\x26\x2e\x7d\x99\xce\x2b\x5f\xc2\x43\xf8\x60\x3a\x4c\xf3\x11\x7d\x85\xd2\x1b\xbc\x1d\xef\x44\xe5\x47\x88\xc8\x20\xee\xa4\x0d\xfe\x86\x9e\x8b\xad\xf8\x6b\x1b\xcf\x2f\xbb\xe0\x61\x29\x71\x54\x49\xb7\x07\x19\xd2\x39\xb2\x87\x49\x72\x96\x37\x9a\x18\x2e\xe5\x7c\x47\x44\x06\x71\xff\xb1\xc1\xf8\xff\x88\xac\x8b\xfb\x45\x73\xea\xc8\x41\xd3\x7e\x59\xe4\x23\x56\xc8\xf7\x98\xb4\x81\x66\x07\xb7\xb4\x46\x2e\x27\xd9\x64\x1c\x3b\x97\xcc\x9b\x90\x0d\x46\xd1\xb0\xcc\xcc\xfd\x55\x8f\xd1\x7e\x31\xd5\x79\x56\x9b\xeb\x6e\x74\x4e\x04\x1e\x97\x39\x46\x91\xca\xda\x5d\xfc\xc3\x46\x23\xed\x3f\x6d\xb0\x69\x25\x5f\x3e\x65\xb2\x50\x62\xea\x74\xe1\xc0\x87\x09\x6d\x01\xdb\x66\x26\x6c\xa2\xd8\x20\x8c\xcc\x6f\x8d\xb5\x49\xa1\x24\x5b\x7f\xa0\xda\x34\x4f\xc6\x67\x75\x58\x02\x28\x0d\x03\xdd\x91\xd1\x8e\xf5\x4b\x5a\x53\x49\x6c\x2a\x0a\x82\x8c\x75\xc3\xd2\xfa\x59\x97\xcd\xfe\x6d\x36\x18\xd4\xb4\x3f\x73\x28\x25\xe0\x5e\xe9\x88\x4e\x9c\x91\xb2\x40\x9a\xcb\xde\x2e\xc6\xb3\x66\xcb\x6f\xf2\xd5\xdb\x55\xd5\xb0\x79\x6c\xa7\x64\xad\x81\x3c\x13\xa1\x89\x33\xb9\xa8\xeb\x7b\xc2\x06\xcf\x77\xe3\xd2\x6b\x48\x2c\xd9\x8c\x92\xb9\x36\xbc\x41\x6d\x5e\x7b\xf5\x69\x7b\x94\xfe\x38\xb0\x00\xab\x26\x27\x02\xdd\x62\xf4\xe1\x99\x1c\xcb\x0a\x9d\x30\x86\xc3\x3c\x0e\x64\xec\xf8\xfa\x12\xb9\x74\x96\xa4\xe9\x25\xe4\x81\x0b\x99\x3c\x07\x02\xaf\xbf\x48\xba\x0f\xdc\x34\xe3\xa1\x58\x63\x3c\x93\x63\xd9\x93\x36\x38\x0c\xed\xa5\x87\x18\x9d\xbf\x7f\xaa\xd1\xf5\xd2\x9e\x94\x68\x76\x8d\x37\xce\x43\x46\x68\x18\x24\xd9\x97\x9a\x3d\x5d\x85\x48\xe6\xce\xa4\xb5\x0e\x27\x7e\xf6\x60\x21\x4c\xd2\x2a\xb3\xe4\xf0\xeb\x9a\x44\xe5\xa4\x4e\x50\x50\x7d\xfb\x15\xf7\x91\xe1\x1f\x6f\xd9\x17\x93\x5b\x3d\xf2\xe4\xcf\xa0\x98\x8f\xee\xff\xa6\xa1\xd3\x26\x3e\x5c\x25\x57\xbc\x98\xc1\xf3\x98\xe9\x49\x9a\x3b\x31\x1d\xf8\x47\x43\x33\x11\x7a\xb1\xb7\x15\xb1\xec\x12\xa9\x50\xcc\x47\x08\xa0\xab\x2e\x20\x0e\x3e\xf1\x3d\x27\x54\x12\xc7\x58\xb2\x4f\x79\x6a\x9e\xae\xab\x19\x67\x7f\xff\xc6\x03\x96\x8e\x4a\xd6\x10\xf3\x1c\xcd\xa9\x52\x75\xbe\x2b\x50\xb1\x04\x10\x07\x9f\xf8\x3e\xad\x9b\x1d\x3f\x27\xbd\xa7\x45\xb2\xcb\xbb\xe0\xc2\xdd\x79\xcd\x8f\x10\xcd\xd1\x83\x4e\x32\xe7\x4b\xdf\xd8\xdd\xc6\x56\xd7\x34\xe8\xe8\x12\xc0\xc1\x27\x3e\x01\xb2\xd7\xe2\xaf\x99\xd8\x33\x42\x7d\x74\xcd\xf3\x7a\xd1\xe6\x2f\x0b\xb0\xb0\x44\x6d\x32\xb2\x9b\x6c\xd0\x2a\x78\xca\x2f\xf8\x43\x89\x79\x00\xce\x5f\x0c\x09\xff\xcf\xb8\xbe\x17\xaa\x59\xe3\x71\x27\x77\x6e\x7f\xc3\x7a\x6d\xfc\x96\x89\xf1\x6b\xcd\xfd\x65\xd1\x34\x8e\x49\x5b\xfa\xb5\xb2\xea\x3d\xe5\x6d\x84\x07\x02\x71\x50\x0e\xa5\xc4\x5f\xd7\x3e\xa0\x0f\xfa\x34\x09\x70\xa1\x07\x48\xcc\xac\x22\x75\x23\x9b\x78\xf9\x15\x36\x4a\x87\x75\xa4\xb6\x0c\x84\xd9\xdc\xe8\xd5\xd2\x9c\x09\xf8\x21\x54\x0c\x75\x29\x88\x83\x4b\xc0\xee\xfa\x20\x23\x2f\xb1\xaa\x5f\x8f\xeb\x74\x95\xe8\x95\x63\x0d\xdf\x50\x49\xa3\xe6\x6a\x87\xd9\xdd\xbb\x52\xa9\x43\x8f\xd0\xa1\xb7\x4a\x41\x1c\x5c\x02\x3d\xfb\xa2\x8f\x07\x14\xa3\x13\xe3\xd3\x62\x8b\x14\x6d\x98\x9b\xbe\x54\xeb\xa6\x6e\xb2\x2f\xd5\x84\x5d\x78\x2e\xde\x3d\x29\x2f\x8c\x88\x0b\xe2\xe0\x12\x40\xc2\xb8\xf9\xd6\x41\xf0\xe8\xbd\xb5\x7d\xbd\xa5\x56\xf4\xe1\xcb\xba\xf6\x23\x64\xd6\x1e\x43\x5f\xa5\x61\x57\xd6\xe7\xa9\xf4\xd0\xc5\x08\x10\x07\x97\x00\xf3\xb3\xa8\xc8\x3d\x21\x8b\x4a\xb3\xe9\x68\xe3\x67\x18\x8f\x13\x31\x0c\x16\x68\x38\x7f\xd8\xbb\x8b\x10\x27\x0c\xe0\xe3\x69\x7c\x43\x48\x00\xc4\x41\x39\x94\x7f\xb7\xc1\xa0\xc1\xf5\x34\x09\xa0\x17\xe5\xad\x3a\x8a\x7e\x94\x56\x98\xf8\xde\x71\xdc\x86\x12\x19\xcc\x6a\xb4\xe9\x7e\xa1\x97\xc7\x7c\x59\xec\xc6\xf1\x4f\xa1\x6d\x68\xe9\x0f\xe0\xe0\x12\x88\x0e\x0b\xfc\x51\x14\xca\x4e\x31\x1c\x7e\xbd\xff\xd9\x2b\xec\x46\xfe\xdd\xf6\xab\x54\x4a\xad\x41\xe3\x9d\x35\x25\xd7\x0a\x65\xa1\x47\x12\x40\x1c\x5c\x02\xca\x21\x06\x59\x4f\x3d\x5b\x99\xec\x88\x88\xf4\xd9\xdb\x66\x0f\x99\xab\xb6\xb3\x07\xae\x3a\x2c\x49\x36\x59\xa1\x97\x52\x54\x43\x17\x02\x40\x1c\x5c\x02\xba\xd8\x22\x31\x59\x38\x0b\xfb\x8f\x30\x87\xce\x97\xe2\x67\x58\x99\xd0\xb2\x72\xbf\x0f\x1a\xbd\x92\x6a\xe0\x4f\xd4\xc2\xe2\xe0\x81\x88\x0b\xe2\xe0\x12\xf0\xe7\xbe\xfa\x7b\x5e\x86\x81\xfa\xc0\x94\xec\xf2\xb7\x05\x3e\x01\xe3\x52\xc6\x20\x6e\x36\x6e\x4f\xba\xe9\xb7\xc8\xe7\x95\x99\x47\x10\xcb\x5f\x10\x07\xe5\x4e\x09\xfd\xdd\x02\x81\x66\xba\x53\x9f\x40\x5d\xa6\x9f\xeb\x16\xa0\x6e\xa0\xb0\x7e\xc6\xab\xec\xcd\x88\xc4\x95\x57\xda\x71\x64\x20\xcc\xb8\xf0\x29\xb6\xc2\x6c\x63\x0d\xca\x1f\x05\x71\x27\x52\x36\x1e\x24\x06\x68\x7e\xf5\x28\x75\x29\x23\x36\x75\x11\xbd\xb1\xb2\xf4\x78\xf4\xb6\x4f\xe1\x6d\x36\x6f\x4e\x2f\x49\x01\x11\xc1\xff\xa6\x6c\x00\xb8\x13\x55\x27\x31\xf0\x3f\x74\xdb\x0d\xce\xb5\xcd\xcd\x7c\xbb\xd1\xf3\xbd\x94\x89\x4f\x48\xff\x41\x9e\xe2\xfc\xcb\xfb\x93\xdd\x74\xad\x23\xd0\xc6\x25\x88\x83\x6b\x40\x95\xfc\x41\xdd\x0f\x53\x9c\x8c\xfe\x2b\xda\xa4\x2a\xdd\x07\xd7\x31\x2a\x7e\x13\xf6\xc5\xea\xf9\x1e\xca\xa8\x69\x18\x5c\xd1\x90\x42\xc4\x05\x71\x70\x0d\x84\xa6\xdd\x72\x72\xdb\x7b\xf2\x7c\xb9\xb0\xd1\x89\xdb\x4e\xd5\x4d\x2e\x2c\x50\xa9\x3d\xbd\x36\x05\xed\xbd\x49\xff\xb5\xa2\xb2\x51\x84\x06\x40\x1c\x94\x43\x09\xb0\xc1\xa0\x65\xc7\x69\x1a\xa0\x5e\x37\xbd\x3e\x73\x3e\xd9\x7b\x7d\xf0\xcd\x16\x4a\x1f\x31\x51\x14\x87\x52\x5e\x72\xb0\x91\x7e\x41\xf8\x18\xd2\xc7\x27\x54\x99\x50\x1a\x0c\x80\x83\x6b\x40\xe0\x2b\xaa\xb6\xf2\x2d\xd6\xae\x08\x22\x7e\xd4\xca\xc6\x81\xed\x02\x6f\x5f\xe1\xd8\x84\xad\x23\xdd\x2f\x49\x6f\x2e\xe1\xbe\x85\x1e\x63\x02\x71\x70\x0d\xa0\x49\x8c\xb6\x2c\xde\xc7\x9d\xab\x3a\x98\xa2\x09\x11\x7c\xcd\xd9\x66\xb7\xea\x29\xbf\xb3\xb8\x58\xde\x77\xe9\xd7\x2f\x17\x47\x7a\x44\x5c\x10\x77\x42\x03\x11\xa3\xe3\xbd\x37\xc3\x24\xe9\xc9\x24\x3b\xde\x54\x28\x8e\x1f\xd1\x12\x58\xfb\xc8\x4f\x19\x6a\x14\xe4\xbb\xbd\x91\xfb\xc5\x0e\x69\x00\xc0\xc1\x35\x80\x86\x22\x89\x5a\x7b\xa1\xe0\x77\x7e\xae\x7d\x4d\xec\x58\xd7\xd2\xf9\x0c\x3a\x2d\x1e\xcc\xb7\xb6\x1b\x9c\xb4\x49\x6b\x77\x33\x85\x11\x1a\x00\x71\xd0\x38\xe0\xf0\x77\x1b\x0c\xb2\x50\xa7\xdb\x60\xd4\xef\x4b\x2f\x0c\x90\xfd\x2c\x3e\xa0\x0f\x6f\x44\x0c\xe3\xd4\x0e\x5e\x4f\x56\xce\x42\xa9\xe4\xa4\x4a\x64\x73\x98\x49\x3e\x44\x46\x58\x4a\x10\x77\xd2\x06\x7f\xbc\x91\x63\x7e\x3f\xba\x7e\xa5\x2e\x68\x4e\x73\x5f\x81\xe4\xa1\xd3\x9c\xae\xe1\x98\xd7\x6c\xdb\x0a\x2b\xc3\xa7\x4f\xe7\x27\xde\x23\x22\x83\xb8\x93\x36\xb8\xd1\xe0\xa8\x2b\xe4\x5e\x2c\x03\xa6\x75\xf4\x85\xdb\x23\xce\xe5\x9c\xfd\x63\x7d\x48\xdf\xb6\x85\x22\x48\x5b\xbc\x0d\x14\xa5\x08\x10\x91\x41\xdc\x7f\x6c\xf0\x3f\xab\xc5\xba\x53\x17\x3e\x57\x1a\x3b\xd0\x66\xf0\xf7\x96\xdc\xc8\x91\x65\x37\xed\x26\x41\xb2\x6b\x1f\xcf\x7b\xa3\xfd\xdb\xa3\xf2\x2a\x95\x39\x64\x83\xdd\xe4\x0f\x16\x97\x1e\xb6\xb4\x4b\xc6\x0d\xe6\x36\x06\x3e\xbd\xe0\x63\x74\x79\xbe\x87\xe0\xc6\x74\xb9\x89\xe1\xb9\xb1\x01\x15\xef\x3f\x6d\x70\x83\xe1\xef\xaf\x85\xe2\x24\xde\xd4\xe2\x29\xac\xfa\xef\x70\x90\xd5\x04\xbf\xac\xd4\x31\x2c\xa8\xe8\xaf\xcc\x4e\xde\x7a\x53\xbe\xf8\x07\x2a\xaf\x3d\x8e\xbf\xac\xc6\xd7\xad\x80\xf6\x4b\xde\x67\xca\x13\xc7\xbd\xc4\x43\xe5\x71\xa6\xc5\x5e\xe8\xb6\x17\xdb\x02\xb1\x30\xcf\xbf\xcd\x06\x83\x9a\xf6\x67\xbe\xea\x09\x1b\xdc\x28\xb7\xcb\x2c\x77\xf1\x76\xb2\x51\x1f\xc3\x4c\x59\x68\x08\xcf\xf7\x32\xdb\xc5\x95\x85\xf0\xb4\x4a\x76\x62\xc2\x22\xfd\xde\xa2\xb3\xb0\xc1\x4d\x27\x6c\xb0\x5e\x50\xce\xf0\xcb\xd1\xa2\xc7\x38\x76\xfa\xd6\xd7\xdc\x26\x38\xd9\xb9\x2b\xec\x0b\x89\xdf\x38\xe0\xf3\x26\x79\x6a\x6c\xe5\x7b\x9e\xc9\xb1\xec\x49\x1b\x5c\x36\xca\xb8\x9b\x91\x20\x3a\x4a\xf4\xa9\x76\x85\xd9\xca\xca\xb0\x8b\x9f\xe0\x22\xc5\xa3\xeb\x65\xe8\x46\x57\x25\x98\x26\x53\xce\xe4\x76\x72\xd3\x49\x1b\x4c\xdc\x42\x34\x6c\x13\xbd\xca\xf2\xd6\x53\x85\xf1\xb6\x70\xa3\x2b\xb5\xbc\x5a\x76\x0c\x3a\x09\x65\x9d\x1b\x12\x26\x8f\x67\x58\xd4\x99\xb4\xf6\xa4\x0d\xbe\xf4\xf5\x76\x85\xf9\x02\xd5\xd1\xad\x8f\xd3\x2c\x06\xa4\x86\x66\xa2\xd7\x82\x5d\xb8\xb7\x8e\xda\x94\x1a\x3f\xbb\xc6\xd8\x36\x73\x9d\x99\x0d\x06\x69\xe8\xb4\x89\x2f\x3b\x9f\x2f\xcf\x7f\x23\xa9\x57\x7c\xd8\xd3\xdb\x4b\xbe\x1a\xab\x28\xd3\x0e\xad\x53\x99\xf0\x33\x09\x76\x59\x4c\x35\xfd\x14\x94\xa1\x02\xe2\xe0\x13\x9f\x1b\xff\x78\xcb\x8f\x6a\xf9\xf7\xd7\xdf\xc7\xac\x51\xae\xfe\x72\x93\x9d\x79\x65\x42\x7e\xb3\xbb\xa3\xb7\x6b\x30\x7a\xd9\x31\xcc\x19\x11\x17\xc4\xc1\x27\xbe\x3c\xa4\x21\xd2\x6b\x0b\x86\x31\xc9\xe6\xf1\x11\xb7\x45\xf6\x08\xb8\xad\xdb\x04\x23\x5f\x63\xe5\x3f\xe7\xd1\x30\x51\xf2\x6f\xd3\x81\x4a\x84\x03\x38\x7f\x31\x8c\x7f\xfc\xbd\x13\xec\x43\x44\x02\x44\x2e\xa3\x49\x4e\x22\xe5\x2a\x49\xc6\x41\x38\xef\x1d\xf2\xd5\x3c\x57\x7d\xdc\x6e\x0f\x99\x2b\xdc\x8e\xc5\x47\xc4\x05\x71\xf0\x37\xc5\xaf\x7c\x90\x5c\xca\xb8\x70\xfb\xf3\x50\xaf\x17\xda\xb8\x00\x7b\xa1\xe2\xe7\x4f\xc5\x44\xb1\xbb\xe5\xf9\x49\x9a\xb8\xf8\xaf\x19\xf9\x10\x1e\x08\xc4\x41\xf9\xaa\x7f\xb7\xc1\xa0\x0f\xfa\x34\x09\x10\x71\x4e\xb5\xbb\x28\x2f\x47\x76\xbf\x2a\x5f\x64\xfb\x1c\xee\x5d\xef\xe4\x2c\x8e\x3c\xea\x80\xfa\xe1\x33\xb6\x39\x0a\xd5\x01\x74\xba\x0a\xe2\x4e\x78\xa0\x74\x01\x9c\xee\xc1\xd2\x2c\x55\x21\x74\x3f\xfd\xce\x25\xe4\x54\x0c\xee\x7d\x5c\xa1\x57\xa6\xd7\xd8\x89\x1c\x47\x51\x82\xa0\x5b\x96\x20\x0e\x2e\x01\xf6\x6a\xc5\x3e\xbb\x9b\x8e\x75\xf1\x02\x92\xe7\x14\x8a\x25\xfc\xf1\x24\xba\x82\x5d\x15\x7e\x13\x46\xa8\x58\xf6\xe6\x25\x60\x7c\x81\x6e\xda\x02\x38\xb8\x04\x12\x78\x87\x64\x2a\x53\x68\x09\x71\xa8\x22\xcf\x2b\x2c\xfb\x35\x6c\x11\x4c\xb1\xbc\x70\x75\x78\x52\x5b\x36\xe7\x9c\x63\xc4\x03\x25\x29\x81\x38\xb8\x04\x4a\xdd\xb2\x2d\x3a\x77\x5a\x0f\x09\xe2\xef\xdf\x24\xa5\x72\xb7\x4c\xdc\x5a\xd2\x3a\xd6\x3d\xfe\x71\xe8\x37\x70\xd9\xd6\xaf\x9f\x12\x21\x01\x10\x07\xe5\xab\xfe\xdd\x06\x83\x06\xd7\x53\xdf\xa1\xa4\x97\x50\x64\xe4\x2e\xf8\x9e\xf8\x92\xc4\x25\xe9\x31\xf5\x8b\x51\xcd\x5b\x21\xe6\xce\xf7\xd1\x23\x9f\x44\x53\xaf\x13\xec\x43\x85\xf7\x41\x1c\x5c\x02\x3e\xc4\x76\x1b\xc6\xc3\xce\xf8\x6f\x91\x6f\x26\xe0\xbe\xfe\x66\xe9\xf7\x63\xeb\x33\x85\x64\x54\xc7\x78\xcd\x71\xdc\x92\xe9\x3a\x74\x29\x1a\xc4\xc1\x25\xb0\x10\xf2\x3a\x8b\xc4\x0e\x75\xf6\x01\x0f\x61\x77\xf2\x51\x1f\x95\x55\x48\xf2\x9e\xe0\x05\xf9\x26\xce\x8f\xa9\x16\x29\xb6\x6b\xd0\xbb\x99\x20\x0e\x2e\x81\x5b\x8f\x16\xa7\x30\x6e\x6e\xfb\x35\xcb\xfa\x3d\x1e\xa8\xfb\xa2\xe5\x69\xc1\xc8\x7d\xf4\x9b\xdc\x4e\x80\x26\x6e\x90\xe6\x32\x12\x64\x83\x41\x1c\x5c\x02\x32\x94\x2e\xc5\x3f\x77\x90\x55\x05\x8e\xd6\x46\x62\xe7\xf0\xd6\xb1\x30\xaf\xb1\x1a\xc6\x7b\x8b\x3d\x20\xa5\x51\x5c\xcb\x66\x55\x44\x2c\x7f\x41\x1c\x94\xa7\x06\xb0\xc1\xa0\x99\xee\x34\x0d\x90\x3b\x60\x7c\xda\xab\x16\x9e\xc7\x43\x96\x76\xcd\xd4\x78\x9e\x8d\x95\x4f\x82\x95\x1a\xf0\x9e\x34\x16\x0f\x2d\xe6\x18\xf7\xdc\x1c\xa2\xed\x20\x0e\xae\x81\x02\x8e\x6c\x2a\x27\x33\x2a\xa3\x12\xac\x03\xc6\x24\x7e\x6a\x01\x3a\xe5\x85\x5c\x41\x8c\x83\xc8\x88\x94\x5e\xe7\x75\x4c\xbd\x16\x44\x5c\x10\x07\xd7\x80\x0d\xbf\xf1\xba\x33\x19\x4d\x80\xe0\x77\xe3\x7a\x61\xd1\xdb\xda\x5f\xfb\xc8\xde\x2c\x7b\x69\x09\xd3\xea\x18\x56\xfe\xbe\xd2\x0b\xed\xde\x81\x38\xb8\x06\xa4\xc3\xcd\xdd\x5e\xfb\xd1\x7d\xf9\x58\x6e\x9d\x8e\x51\xe3\x4c\x2b\x43\xff\xa4\xf3\xe0\x7a\xaf\xc1\x47\xd1\x52\xcc\x95\xd8\x6f\xd3\x88\xb8\x20\x0e\xae\x01\x6e\x46\x0d\xa4\xd5\x67\xd8\xd7\x6f\x9b\x39\xcd\x72\x27\xfc\xe0\x50\x4f\x37\x53\xb8\xd5\xde\x97\xbc\xc4\x1c\xfa\xfd\xb3\xf4\x98\x13\x42\x03\x20\x0e\xca\x57\x05\xd8\x60\xd0\xb2\xe3\x34\x0d\x94\x98\xdc\x4b\x0d\xfe\x31\xa4\x30\xd4\x1b\xf3\x94\xf8\xc6\xa3\xca\xf1\x29\x1c\xff\x26\x21\xcb\x82\x11\x77\x83\xe1\x2b\x6a\x36\xa4\x88\xb6\x83\x38\xb8\x06\x08\xbd\x4c\x58\x0d\x9e\x1a\x3d\xd4\x35\xb4\xb8\x47\x94\x24\xc2\xf4\x8e\x71\xfb\x82\xb3\x66\x9e\x6c\x3c\xb9\x7f\x7b\x66\x8d\x0d\x54\xed\x19\xc4\xc1\x35\xe0\x92\x9e\xa4\xc3\xd4\x90\x85\xa2\x74\x23\x10\x53\xfb\xa7\x7d\xbe\x25\xb6\xd0\xb3\x4d\x29\x25\xfd\xfb\x3d\x57\xa3\x9a\xce\x0f\xe5\x22\xe2\x82\x38\xb8\x06\x4a\xca\x55\x38\xd5\x87\x4c\x3f\x08\xe1\x68\x06\x9f\xab\x99\x93\x32\xf3\xd3\x1c\x38\x7f\x3e\x45\x02\x8d\x58\xd4\x5b\x39\xff\x78\x0b\xea\x07\x00\x07\xd7\x40\xdb\x61\x97\xee\x1d\xd4\xb7\x2b\xda\x12\x4d\x72\x15\xec\x28\x0b\xd3\x84\x47\xfa\x58\x61\x6a\x3a\x81\x02\xd7\xce\x3f\x74\xd2\xc4\x80\xf2\xd6\x01\x1c\x34\x0e\x00\x6c\x30\xc8\x42\x9d\x6e\x83\x4d\xee\x39\x3f\xe5\xd1\x93\x8a\x6c\x94\xd7\xaf\xee\x6e\x8b\x29\x2f\xbe\x73\x63\xaa\xa9\x7e\xf8\x6d\x4b\x49\xa6\x3d\x8a\x1e\x6d\x17\xc2\x52\x82\xb8\x93\x36\xb8\x51\x9f\xb4\x37\x3e\x83\xe2\xce\xb3\xd4\xd9\xe0\x11\xa5\x8c\x6b\x7e\x5d\xfe\x4b\x54\x6f\x39\xf0\x39\x05\x78\x9f\x62\x9e\x93\x82\x4e\x83\x41\xdc\x49\x1b\xcc\xd5\xaa\x48\x2d\xd1\x88\x4b\x67\x1e\x54\xad\x97\xba\x75\xb3\x7f\xb3\xd8\x40\x1d\xbf\x53\xd4\x05\xf5\x2d\x59\x2b\xbf\xe3\x76\x27\x22\x32\x88\xfb\x8f\x0d\xfe\xe7\x09\x7e\xa0\x2f\xbe\xdf\xe3\x2f\x15\x9f\xba\x23\xd8\x28\x8b\xf9\xc3\x23\x23\xbd\x4a\x67\x76\x3f\xf0\x1d\x6c\xe9\xad\x7a\x59\x29\xba\x85\x43\x36\x98\x8b\x2f\x8d\xa3\xf9\x4a\x0e\xbe\xad\xd6\x55\x5b\x91\x38\xdf\x89\xbb\x0e\x02\xde\x1b\x5c\x7d\xb3\xae\x55\x5a\x0d\x8f\x45\x0d\x29\xfe\xb4\xc1\xe1\xd4\x19\x41\x06\xd1\x82\x96\x11\x38\x8b\xd8\xaf\x6b\x62\xd3\x45\x7f\xbe\xfe\x74\xff\xf0\x76\x0d\x2a\x61\x78\x85\xa1\x9e\xc1\xc1\x1f\x28\x25\x4d\x69\x56\x57\x4d\x74\xe2\x8e\x34\xa1\x68\x07\xca\x9c\xd5\xee\x76\x5d\x54\xd7\xfa\xdc\xab\x78\xf4\xc2\x7b\xfd\x3b\xeb\xd7\xfe\x2d\x36\xf8\xf1\xb9\xff\xad\x69\x7f\xe6\x06\x9f\xb0\xc1\xe7\x9f\x7f\x1b\x7f\x53\x46\x59\xf0\x75\xe1\x9e\xbf\xb4\xae\xa8\x58\xbf\xe3\xb8\x57\xd4\x15\xbc\xfb\x37\x7c\x02\xab\xdc\xaf\x8b\x9f\x49\x49\x21\x24\x9e\x13\x16\x6d\x3d\xca\xcb\x1d\x43\x57\x4f\x01\xcd\xac\x3d\x7c\x78\xa8\x82\xa3\xf5\x36\x71\xd5\xd5\xdb\xaf\x35\x54\x0f\xd7\x87\xa7\xc5\x78\x7e\x9c\xc9\xb9\xec\x49\x1f\x1c\xa0\xd3\xb5\xf4\x25\xc9\xff\xbb\x36\xf1\x9b\x2b\x0e\xfb\x3a\x1d\x59\xd5\xc1\x1d\x73\x83\x19\x45\x1d\x1c\x41\x4d\xa3\xe4\x86\x4c\x67\xd2\x5a\xad\x93\x97\xb1\x3f\xc7\x63\xef\x99\xe1\x61\x11\x10\x2e\x6a\xd8\x26\xf3\x94\x2a\x09\x06\xbf\xae\x2e\x55\x6b\x6d\xf2\x34\x79\x18\x21\x6e\x25\x7b\x26\xad\x3d\xe9\x83\x91\xa2\xdf\xdf\x55\x43\xef\x6c\x14\x8f\x48\x69\x23\xd9\xa5\xaf\x8f\x50\xb6\x71\x56\xb6\xce\xad\x2f\x31\xfa\xe2\x8e\x3c\xea\x4e\x7e\x66\x3e\x18\x24\xa2\xd3\x66\x3e\x62\xf2\x76\x2e\x0a\xfa\xf6\xa8\x06\x46\x3b\xc6\x4c\x19\x67\xcd\x6f\x48\x6d\x85\xfa\x0a\xa6\xe6\xed\x57\x51\x6e\x6c\xed\xe6\x42\x2f\x90\x83\x38\xf8\xcc\x37\xba\x13\x33\x6b\x2e\x42\xa6\x1b\x3c\x1a\xeb\xb6\xc4\xd8\xe0\x22\xa4\x4d\x2e\xdc\xcd\xcf\xd0\x15\x8a\xca\x34\xc6\x2b\xfb\x18\x3a\x08\x02\x71\x27\x9e\x1f\x0b\xe9\x41\xfe\x5a\x80\x67\xfc\xba\x96\x35\x97\x30\x7e\x99\xc7\x50\x7b\xfa\x56\x2f\xdd\x25\xd2\xeb\xb2\xe7\x38\xd9\x0e\x63\xc3\x11\x71\x41\x1c\x7c\xe6\x9b\x71\x66\xaa\xba\xed\xcf\xf5\xc4\xd5\xc7\x37\x67\x23\x15\xf5\xb1\x1c\xdd\x75\xb1\x70\xb9\xed\x88\x9d\x4f\x0c\x1a\x0b\xf7\x6c\x65\xa0\xca\x35\x00\xce\x5f\xec\x9f\x77\x6a\x24\xeb\x1d\xc5\xae\x95\x9c\xdb\xba\x67\x4d\xbe\x72\xa7\x7e\x51\x8a\xfb\xfa\xd0\xfb\x92\x89\xf8\x35\xd7\x0f\xdf\x95\xb8\x2b\xb8\x53\x10\x26\x08\xc4\x41\xc9\xc1\x7f\xf7\xc1\xa0\x0f\xfa\x34\x09\x64\xd2\x44\x2a\x94\xbc\xac\xe2\x9c\x77\xa6\x74\x25\x23\xef\x15\x1e\xf3\xab\x90\x37\x4b\xcf\xa5\xb5\xa9\xda\x37\x7f\x71\x9f\x20\x04\xaa\x26\x0c\xe0\xe0\x12\xe0\xe1\xb2\x60\xf0\xae\x8b\x70\x93\xb2\xb8\x76\xcd\xa3\xeb\x41\x69\x6a\xac\x39\xb7\x51\x2c\x61\x3e\xdd\x03\x46\x6d\xa4\x2d\xa7\x36\x44\x5c\x10\x07\x97\xc0\xb9\xa6\x9f\x53\x34\x54\xe8\x2e\xec\x2e\x17\x52\x7b\x77\x84\x83\xcb\xcf\x0d\x51\x49\xa5\xde\x72\x8b\x11\xac\x33\x7c\xb3\xe5\x76\x0f\xba\xba\x07\xe0\xe0\x12\x68\xe4\x61\x88\x31\x1c\x30\x5b\x4d\x37\x70\xcb\x64\x7f\x7f\xd8\x27\xf4\xd9\xf2\xde\xea\x77\xa4\x74\x7e\x09\x6e\xfc\xc9\x7e\x5b\x48\x5a\x20\x0e\x2e\x01\x85\x0f\x7c\x96\xed\xe4\x26\x9c\xdf\x8f\x68\xb3\x18\x83\xe3\xb6\x48\xfc\x7e\x54\x4f\x35\x7c\xea\x0f\xda\x63\xa0\x73\x91\xb7\xb2\x41\x2c\x7e\x40\x1c\x94\x15\xc8\xf3\xf7\x05\x30\x68\x74\x3d\x35\x33\x54\xae\xb7\x12\x3d\xb0\xe4\x79\xe3\x58\x71\xa0\xa5\x0b\x06\xf6\x84\xf2\x0d\xd4\x48\xfe\x47\xc6\xb4\x81\x92\x9d\x75\xa5\xb1\x6f\xa0\xcc\x50\x00\x07\xd7\x00\x01\x2a\xda\xc7\x8e\xe3\x36\xda\xa1\x87\xbd\xb7\xaa\x3a\xa2\xae\xdc\x91\xf1\x7b\x52\xf2\xae\x06\x17\x6b\x70\xb1\xd0\x20\x8b\x0c\x7a\x88\x1d\xc4\xc1\x35\xa0\x58\xee\x8c\xb5\xbc\x21\x19\x4a\xde\x9e\xed\x69\xf2\x16\x7d\x47\x44\xda\x2d\x9e\x52\xeb\xe8\xc2\x04\x35\x8a\xa3\x55\x41\x22\x94\x15\x08\xe2\xe0\x1a\x68\xba\x11\x32\xee\x5f\x60\xf2\x8b\xb4\x0a\x7b\x60\x67\x42\x46\xdb\x91\x43\xba\x87\x68\xfd\x92\x6c\x0c\x35\x2d\x91\xab\xd8\xec\x7b\x44\x5c\x10\x07\xd7\x80\xf8\x92\x0c\xb5\xe3\x0f\x8f\x51\x15\x8e\xd7\x09\xd3\x4b\xb7\x43\xac\xe5\x7b\xe6\x62\x5e\x3e\xf4\xa3\xf7\xa5\xe2\xd0\xab\xea\x22\x43\x68\x00\xc4\x41\x59\x81\x00\x23\x0c\x9a\xea\x4e\xd3\x80\xa9\x5b\xc5\x97\x2b\x38\x82\x97\x15\x54\x9a\x74\x14\xdc\x5a\x43\x99\x1e\xe6\x09\xdf\x91\x97\x0c\x56\xc7\xc3\x6f\x8a\x12\x6e\x88\x42\xb4\x1d\xc4\xc1\x35\xd0\x7a\xb8\xb8\x51\x38\xff\x79\xe2\x3d\x8e\x18\xaa\x51\xba\x20\xcd\x5d\xd1\x14\x7b\xd4\x9f\x6c\x99\x9b\x9f\xa4\xdf\x61\xe4\xce\x41\xd7\x97\x41\x1c\x5c\x03\x11\x5b\x77\xb6\x3a\xbd\x4a\x0b\xac\xf1\xb2\x26\x9d\x7c\x8c\xeb\xae\x52\x85\x24\x33\xd7\xdb\xb7\x30\x8f\x44\xd2\x05\x09\xf3\x40\xf5\xdb\x40\x1c\x5c\x03\xaf\x97\x04\xe7\xc9\x5a\x63\xdf\xb5\x32\x60\xb8\x3a\xee\x5c\xcd\x6e\x9a\x0a\x5c\xad\x61\x26\xcc\x79\xfa\xfe\x7c\x35\x61\xd1\x23\xa8\xa6\x2e\x88\x83\x6b\x40\x7b\x7e\xd3\xc1\xd9\x27\x53\x94\xde\x2b\x6d\x96\x1e\xab\x20\x46\x78\x92\xdf\xe1\x0b\xce\x51\x83\xb6\x25\xbd\x8b\x1d\x1e\x35\x3e\x42\x03\x20\x0e\x1a\x07\xb4\xfe\xae\x01\xd0\xba\xe3\x34\x0d\x34\x3c\xaf\x5e\x76\x60\xaa\x50\x48\xd0\xd6\xfe\xf4\xb1\xbb\x4e\xc4\x9e\x50\xd5\xbd\xa4\x4f\xe5\x85\x45\x1d\xde\x2d\xbd\x34\x05\xa8\xa6\x07\x88\x83\x6b\x80\x98\x22\x22\xa3\xa9\x3d\xe8\xc5\x78\x3a\x05\xa5\x65\x61\xc8\x2f\xf1\xc5\xd4\x3d\xb3\x16\x24\x3e\x9d\xdf\x47\x17\x96\x57\x85\x2b\xa0\x65\x06\x80\x83\x6b\x60\xa0\x16\x6f\x34\xcc\xb6\x93\x17\x3b\x30\xe3\x72\x6c\x42\xe3\x91\x50\x81\xa3\x4a\x40\xd7\x0f\xa4\x31\x9f\xc7\xd1\x13\x05\x46\xf5\x88\xb8\x20\x0e\xae\x81\x69\xd1\x99\xcf\x0f\x2e\x6d\xbd\x7f\xd4\x27\x7e\x64\xa0\xf1\x04\xb9\x5d\xc9\x44\xfe\x83\x99\x6e\x90\xdb\x33\x97\x66\x0c\xf6\x3c\xe8\x0e\x03\x88\x83\x6b\xe0\xc7\x4d\x85\xa2\x6e\x59\xe2\x59\xf1\xd9\xc4\xf9\x99\x56\xcc\x75\x8c\x0f\x96\x3b\xd9\xad\xb1\x54\xde\xf4\x5f\x72\x93\x1b\xde\x37\x20\x34\x00\xe2\xa0\x71\x00\x60\x84\x41\x26\xea\x74\x23\xac\xb6\x7e\x2f\x2e\x31\x49\xd6\xa4\xea\x9b\x74\x52\x78\x02\x07\xaa\xcb\xd6\xd0\xbb\x97\x1b\xfa\x32\x6b\x37\x3f\x0a\x44\x88\xce\xb2\x21\x4c\x25\x88\x3b\x69\x84\x7b\x7f\xcf\xaa\x79\xa2\x6d\x0a\x0c\x13\x84\x2e\xfc\x10\x0e\x91\x53\x1a\xc3\xb0\x96\xbb\xbd\x34\x73\xd9\x90\x8b\xf5\xae\x02\xbf\x25\x22\x32\x88\x3b\x69\x84\xbb\x8a\x0d\x76\x6b\x8b\x50\x3b\xf7\xdb\xeb\xdd\xef\x63\xf6\x50\xcd\x3a\x15\xf1\x19\xde\x95\x29\x34\xbe\x55\xb4\xe3\xe2\xc4\x64\x8d\x88\x0c\xe2\xfe\xcf\x08\xa3\xfd\xe3\x0c\x3f\x89\x30\x7b\x7d\x78\x96\x88\x6d\x8f\xcf\xf5\xf0\xa7\x7e\x95\x0f\xee\x4d\x01\x03\x5a\xbc\xe1\x0d\xcd\xad\x1b\xdb\x12\xed\xb4\x90\x11\x4e\x23\x76\x62\x52\x55\x93\x7c\x60\x8c\x2b\x70\x4e\xfd\x4b\x9f\x92\x3c\xe5\x2f\x42\x8a\x3b\xfb\x98\xc2\xce\x21\xe7\x3d\xf9\x9b\xd1\xff\x34\xc2\xd9\x1b\x6f\x44\x24\xa2\x09\x7f\x29\xa9\xe8\x4a\x61\x16\x27\x19\xbc\x1e\x73\xa5\xbf\xe2\xb5\xf0\x62\xb0\x69\xe4\xc8\x33\xc7\xf3\x4f\xe7\x95\xcb\x3c\xbf\xa7\x98\xed\xff\x6e\xdb\x29\xec\x22\xda\x67\x6e\xa4\x6c\x55\x1a\x8a\x99\xab\xb2\x5b\x98\xfb\x7c\x1d\xe4\x79\x49\x8c\xff\x36\x23\x0c\x6a\xda\x9f\xd9\xc1\x27\x8c\x30\x86\x96\x5a\x24\x43\x3f\x3f\x3b\x15\x93\x85\xcc\xe5\x1b\xa4\x58\xdc\x2a\x78\xde\x9d\x35\xd8\x66\x6f\xc9\x0a\x22\x5e\xc4\x15\xd5\x9f\xc9\x59\xe5\x49\x23\x6c\x3d\x77\x33\x07\xa7\x12\xfd\x93\xdd\xfc\x0c\x27\x5b\xea\xe1\xe3\xe7\xe8\x46\xf6\xeb\x17\x18\x55\xac\xed\x33\x8e\x75\xa7\xac\xf3\xce\xe4\x64\xf6\xa4\x11\x66\x50\x36\x23\x3b\x94\xc1\xbe\x81\xc5\x8d\x39\x6d\x14\xbc\x79\xde\xb0\xfc\x1c\xe9\x17\x9a\x22\x85\xaf\x8a\xe9\xeb\x0e\xeb\x75\x2c\x67\xd2\xda\x93\x46\x98\x5f\x43\xcb\xbd\x72\x65\xe0\x29\xb2\xa8\x78\xbd\x75\x33\x4d\x5d\x2a\x56\xb9\xd3\x0e\x1f\x5f\x2c\x6a\x56\xb0\x56\xa1\xaa\x43\xd6\x99\xb4\xf6\xa4\x11\xfe\x9e\xe5\x11\x96\x98\x53\x2d\x41\x44\x34\x32\xf3\x61\x64\xfc\xa2\xe6\xe5\xd1\x95\x5b\x29\x05\xf1\xc6\xf7\x1c\x83\x27\x19\xcb\xde\x9d\x99\x11\x06\x89\xe8\xb4\x99\x2f\xd1\xcc\xdc\xc8\xca\xbc\x6c\xcc\xc1\x7c\xba\xe2\xb7\x5d\xbe\x22\xf5\xa3\xe4\x94\x5a\x6d\x61\x9c\xce\x14\xc2\x54\x3b\xa6\x5b\xd7\x10\x23\x3e\x88\x83\xcf\x7c\xd3\x66\x13\xb5\xfa\x8e\x29\x47\x32\x2b\xd6\xcf\x66\x45\x9f\x6e\xf7\x48\xec\xe2\xda\xaf\xa8\x29\xd9\x58\x5e\x89\xc5\x7c\x20\x74\x19\x9a\x49\x00\x1c\x7c\xe6\x9b\x60\x33\x44\xeb\x53\x89\xbf\x9f\x8e\xee\xd0\x6e\x71\x31\xc2\x69\x25\x52\x91\x75\xd9\xf9\x9e\xbd\x8a\xfa\x51\xf8\x9a\x62\x36\x74\x20\x0c\xe2\xe0\x33\x9f\xb6\x97\xc2\x37\xe7\xfc\xbb\xf7\x67\x5a\x3d\xe4\x6e\x61\x0d\x77\x74\xb3\xd1\xcf\x8c\x7e\xbc\x64\x1f\x62\xe2\xcc\x58\xed\x30\x0c\xcd\xa8\x20\x0e\xde\x0f\xd6\xf3\x72\x33\xd1\xc4\xec\x6a\x91\xe1\xc1\xbe\xc3\x41\xb7\xb1\x26\xd4\x8e\xdb\xe2\x43\xb2\x2c\xee\x63\xb9\xeb\x13\x49\x0c\x46\x21\x8c\x30\x88\x83\xd2\x83\xff\x6e\x84\x41\x1f\xf4\x69\x12\x08\x56\x52\xb2\x4d\xf1\x8e\x27\x89\x6f\x1e\x50\x24\xee\x88\xa9\x3e\x10\xb8\x53\xc6\x17\xf4\xe3\x7d\x18\xea\x78\x91\xeb\x47\x42\x4d\x44\xd3\x41\x1c\xbc\xe9\x6f\x88\x71\xd6\x2c\xfd\x93\xe3\x3f\xc8\xad\xe8\xde\x3a\x50\xb6\xc9\xf2\xaf\x65\xbd\x30\x16\x69\xcf\xe7\x93\xe3\x21\xf5\x36\x1d\x2a\x8f\x03\xe2\x4e\x54\xad\xd4\xf1\xb3\xbb\x58\x8f\x49\x5c\xfc\xfb\xcb\x7b\x82\xdd\x1b\xde\x0f\x7f\xa4\xfd\xcc\x18\xa9\x11\x58\x0d\xbc\xa4\xc0\xdc\xf3\x14\x4a\x67\x06\x71\x70\x09\x50\x5e\x2a\x08\x74\xb5\xcd\xaf\x53\xa0\xba\x73\x35\xc4\x30\x5b\xcb\x49\x6f\x49\x41\xc2\xd1\x1d\xcb\x6f\xe9\xf7\x10\x52\x42\x0d\xb4\x60\x07\x71\xf0\x7e\x98\x65\xf4\xf8\x6e\x57\x20\x74\x58\xdd\x57\x58\x61\xde\x6b\x64\xea\x2f\x53\xb9\x7f\x4e\xed\xc1\x62\x18\x3b\xcb\xba\xa5\x79\x84\x19\x62\xf1\x03\xe2\xa0\xbc\x40\x80\x11\x06\x8d\xae\xa7\x69\x20\xe3\x8e\x54\x64\x67\x0c\xf2\xa4\xe8\x22\xe1\xba\xfa\xd7\x8b\xf3\xcf\xd4\xa5\xf8\xe5\x95\x24\x52\x9d\x2b\x35\x74\xe9\x97\xf6\x51\x11\x6d\x07\x71\x27\xda\x3e\x23\xe6\x40\x6d\x49\x95\xfd\x9b\x19\xff\x8e\xba\xa3\x29\x37\xe3\xaf\x37\x11\xa5\x32\xbb\x07\xc1\x7d\xe7\x38\xed\x77\x9d\x58\x10\x71\x41\x1c\x5c\x03\x9e\x3b\x1b\xbd\xea\x5f\xed\x86\x02\x3e\xe3\x39\x69\x67\x97\xbc\xdb\x9e\xc3\xab\xe5\x0b\xf7\xab\xbe\x19\x54\x41\x16\xb2\xdd\xa0\x82\x88\x0b\xe2\xe0\x1a\x60\x59\x18\x51\x77\x34\xcb\x7a\x7f\xce\x81\xf3\x2b\x46\xb9\xac\xc1\x1d\xa4\x41\xc1\xdf\xf5\xde\xc8\x37\xde\xae\x25\x20\x67\x1a\x41\x7f\x2f\x88\x83\xf7\xc3\xcd\xfe\x18\xb5\xde\xec\xf1\x7e\xa3\x9a\xfa\x75\x1f\xbf\x41\xe3\x2d\x92\x1b\xd4\x45\x4d\xcd\xb3\xcb\x05\xbb\x98\xcc\xd4\x4e\x50\x79\x1c\x10\x07\xe5\x05\x02\x8c\x30\x68\xaa\x3b\x4d\x03\x7a\xfc\xdd\x1b\x55\x56\x98\x9d\xbf\x3f\x62\x54\x3a\xf0\x10\x56\x04\xf1\xca\xdf\x49\xce\x3e\xb2\xfe\x4e\x92\xd0\x73\x73\xf8\xbf\x17\x98\x41\x1c\xbc\xed\xb7\x43\x49\x7d\x28\xef\x52\x1c\x78\x5a\x46\xb0\xb4\x3e\x2c\x90\x2c\xdc\x78\xe4\xe8\x53\xfc\xd4\xfa\xea\xf7\x9e\x0d\xf4\xba\x76\x0a\x44\x5c\x10\x07\xd7\x80\xa4\x8f\xe6\xde\xc1\x62\x99\x4b\xd4\x8a\x41\xa2\x93\x75\x56\xb7\x7e\xe8\xb0\x86\xb1\xc6\x8b\x27\xd7\x4d\x25\x79\x2f\x23\x2d\x43\x7b\xad\x20\x0e\xae\x81\xcc\x92\x61\x35\x83\x86\x50\xf6\x4b\x54\xaf\x43\x13\x34\xc5\xe9\xea\xfa\xec\x9e\x0f\x07\xf6\x9b\xbd\x20\x39\xae\x48\x30\x62\xd5\x83\x36\x06\x01\x1c\xbc\x1f\xf0\xec\xd1\xb2\x46\x77\xd6\xab\x73\x56\x91\x37\xa3\x0b\x3f\xb8\xee\xbb\x30\xfa\xd2\x8d\x28\x60\xb3\x88\x4a\x3d\x71\x21\xd8\x85\x1e\x97\x01\x71\xd0\x38\x00\x30\xc2\xa0\x75\xc7\x69\x1a\xf8\xc9\x5f\x30\xa6\x31\x35\x55\xad\xe7\x84\xdc\xb5\x2f\xa5\x38\x2f\x3b\x8c\xd6\xf9\xd6\xf6\x1a\x79\xb9\xe8\x26\x75\xc1\x79\x37\x2a\x44\xdb\x41\x1c\xbc\xed\x39\xfa\x13\xf3\xcf\x5e\x34\xe2\xff\xc4\x55\x63\x28\x92\xa9\x3e\x2f\x1c\x16\xbe\x91\xe5\xea\x7d\xc8\xf3\x61\x3a\x82\x65\xaa\x73\x03\x11\x17\xc4\xc1\x35\xf0\xd8\xfc\xf7\x3b\xe1\xab\x6a\x99\x5a\x97\x1e\x7d\x1b\xf2\xd5\x8f\xc1\x44\x33\xb5\xae\x1f\xb9\x4d\x11\x5d\x65\x2d\x75\x21\xd7\xed\x19\x22\x2e\x88\x83\x6b\x00\xbf\x24\xfc\xd3\x86\x66\xca\x8d\x73\xc9\x52\xdc\xd9\xf5\x57\x26\x86\x6e\x61\xe0\x72\x9e\x4f\x0b\x8d\x67\x69\xda\x20\x7d\x6a\x06\x3d\x59\x0d\xe2\xe0\xfd\x50\x5e\x54\xce\x81\x1c\xf8\xa9\xd1\xd0\x35\x74\x7d\xa3\x91\xe7\xb9\x2a\xcf\xc4\x70\xcf\x80\x3d\xbf\x5e\x27\x29\xd3\x70\x81\x3b\x64\x84\x41\x1c\x34\x0e\x00\x8c\x30\xc8\x44\x9d\x6e\x84\x65\x1b\x4b\xd0\x31\x6f\xec\x7d\xb2\x0f\xb7\x5d\xe1\x90\xfa\xa6\xf9\x7e\xf6\x79\xef\xda\x87\xc5\xc7\x29\x5c\xfc\x59\x62\x6e\x0a\x4f\x11\xa6\x12\xc4\x9d\x34\xc2\xc4\x76\xb9\x7d\x3f\xf7\x73\xf3\x44\x89\x6e\x54\xd5\x52\x5d\xb5\xbf\x1a\xf5\x9e\xf5\x9c\x97\xd0\x28\x47\x50\x4c\xb4\xa0\x15\x32\x03\x22\x32\x88\x3b\x69\x84\x6d\xf5\x03\xfa\xb5\x6a\x9d\xda\xa8\x78\xa4\x34\xc7\xa6\xfb\x05\x77\xf9\xf1\x2d\x3b\x7e\x3d\xa0\x20\xd3\x39\x8e\x6e\x65\xbe\x98\x86\x88\x0c\xe2\xfe\xcf\x08\xff\x43\x63\xcd\x82\x2d\xe8\xd6\xd3\x41\x0f\xa4\x45\xa7\x95\xb2\xb3\x8a\xf4\x74\xd2\xe9\x08\xf2\xe4\x33\x4c\xa9\xe6\x2f\x58\x28\x31\xea\xbb\x40\x46\xd8\x22\x61\x49\x47\xe3\x1e\x72\xfe\x71\x76\xbf\xb6\xf6\x4a\xbc\x30\x92\xf8\x95\x87\x79\x58\xcd\xad\xeb\x96\x68\x04\xcb\xab\xfb\x6b\x7f\x1a\x61\xf7\xfa\xad\x22\xdd\x68\x4e\x8c\x8b\xa3\xa3\x1b\xdb\xda\x39\x5f\x7e\x5d\xfe\xf6\xee\x7e\x99\xa0\x9e\x10\x76\x53\x19\x01\xe5\x85\x8d\x3f\xd7\x25\x65\x17\xcc\x7b\xfc\x08\x3d\x70\xdc\x9d\x7b\x24\xf9\xc5\x50\x5d\x35\xbf\xd4\xeb\x62\xcf\xb5\x88\xc5\x15\x10\xb1\xf4\x1f\x9c\xff\xb7\x19\x61\x50\xd3\xfe\xcc\x0f\x96\x84\x9b\x25\x4d\x06\x4f\xd3\x03\x1a\x2d\x25\xed\x11\x2d\xa6\x9d\xb5\x86\xc2\x73\xb3\x8f\x9a\x9b\x45\x22\xc3\x28\x63\xee\x57\x89\x23\x0d\x16\x9e\xc9\x61\xe5\x49\x23\x4c\x52\xc1\x37\xbb\xe9\xee\xba\x8e\x85\xa4\xb2\xc2\x81\xf9\xba\xc8\x5c\xe5\x2b\xf6\xc3\x09\x36\x61\x1c\x89\x66\xbb\x9e\x24\xc5\x89\x33\x39\x9a\x15\x3e\xf1\xb3\x0a\x01\xe4\x92\xc1\xa3\x4f\x98\xb4\x74\x64\x3c\xe5\xd9\x95\x86\x62\xef\xe7\xf3\x50\xd1\x9a\x3e\x47\xef\xab\x8a\xb8\x2b\xb0\x5a\x7a\x26\xad\x3d\x69\x84\xf1\xb0\x66\x32\xb8\xdd\x71\x5d\x56\xf2\x99\x17\x75\x0e\xb6\xb6\x52\xd4\x8c\xee\x6d\xd8\x21\xb1\x70\x08\x5d\x75\xea\x90\x5e\x49\x38\x93\xd6\x3a\x9e\xf8\xd9\x44\xcd\xeb\x71\xdd\x15\x43\x15\xde\x5e\x19\xdf\x6f\x07\xbd\xe5\xce\x73\xea\x67\x79\xbe\x44\x3b\x22\xa4\xb5\xc1\x15\xfc\xf1\xe7\x19\x14\xc7\xd6\xfd\xdf\x44\x74\xda\xcc\xe7\xfb\x8d\xf3\xe7\x00\x65\x7d\x45\xa3\xa1\x39\x25\x51\x87\x2e\x35\xc3\x18\x57\x19\x4d\xde\x48\x97\xf5\xb0\xc9\xe0\x00\xe1\x3d\xe8\xde\x1a\x88\x3b\x71\x17\x6a\xf4\xdd\xf0\xfa\xb8\x70\x2e\x09\xb9\x06\x03\x9b\xe2\xd0\xb3\xb1\xde\x88\x49\xe3\x5f\xea\x96\x3d\x1f\x0b\x86\xa5\x57\x5e\x5b\x40\x77\xa1\x00\x1c\x7c\xe6\x23\xc3\x9b\x0f\xe6\xa9\xbd\x84\x85\x3e\xc9\x61\x25\x66\x71\x8f\xdd\x07\xbb\x93\x25\x20\xaa\xff\x26\xbf\x29\x5d\xb8\x8b\xf6\x2c\xf4\x64\x1f\x88\x83\xcf\x7c\xab\x6f\x86\x37\xf5\xb0\x45\x73\x42\x94\x78\x2a\x4a\x86\xee\xd8\xf6\x20\xd5\x90\x44\x35\xa5\x6d\x4f\x65\x95\x5c\x13\x6b\xf5\xad\x46\xc4\x05\x71\xf0\xbf\xb7\xe4\x43\xa7\x3f\x8f\xde\x2a\x5f\x19\x96\x98\x7e\x6a\x14\x87\x81\x54\x51\xaf\x07\xf7\xb3\xce\xe9\xa0\x9e\x2c\xae\x02\xd5\x88\x5c\x84\x11\x06\x71\x50\x82\xb0\xe4\x5f\x17\x3f\xa0\x0f\xfa\x34\x09\xe0\xf0\x0e\x0d\x2f\xbc\x0a\xb0\x31\xaa\xe1\x19\x15\x58\x58\x36\xe2\x41\xd7\xc6\xd3\xbd\xd3\x6e\xa3\xfb\xea\xe1\xf2\x40\x46\x0c\x94\x65\x05\xe2\xe0\x12\xd0\xa6\xea\x90\xfe\x50\xfe\xab\x3c\xfb\xbb\xb9\xde\x84\x9b\x4f\xdd\xea\x6b\x9a\x5d\xc2\x8f\x79\x54\xa8\x85\x71\xa1\x2e\xef\xba\xa0\x13\x1b\x10\x07\xef\xd2\x45\x93\x07\xde\xf4\x18\x04\xf8\xe1\x31\x97\x6e\xbf\x7e\xbe\x54\x98\x1a\x90\xa9\x31\x2c\xd5\xf7\xdb\x59\xfb\xe2\x58\x06\xbe\x39\x64\xda\x40\x1c\x5c\x02\x39\xa8\x4d\xf7\x8c\x58\x2b\xd2\xb9\x48\x17\xf9\x85\x0e\x48\x47\xd0\x3a\x77\x94\x84\x1d\xf7\x2c\x6d\xd6\xe8\xd9\x7f\xcd\xfc\x1e\x82\x16\x6b\x00\x0e\xfe\xf7\x5e\x89\x48\x54\xf3\xd3\xfb\x82\xfc\x52\x43\x45\x98\x86\x7a\x30\xc7\x47\x5d\xa6\xb8\x42\x34\x35\xe5\xb7\x4b\xea\xf2\x10\x45\x9a\x35\x62\xf1\x03\xe2\xa0\xcc\x40\x80\x11\x06\x8d\xae\xa7\x69\xe0\xf8\x38\xde\x81\x92\xf1\x99\x5b\xce\x65\x0d\x77\x0c\xeb\xaf\xac\x87\x56\x45\x6d\xd3\x64\xc8\x0d\xef\x55\xa9\x28\x72\xa3\x25\xa0\xe7\x56\x40\x1c\x5c\x03\x66\x77\xd4\x90\xbb\x64\x1e\xb0\x64\xe4\xf8\xee\x65\xbc\x8d\x09\x49\x48\x1d\x7b\x78\xac\x6b\xc6\xbb\xf3\xc4\xdb\x34\x3e\x50\x13\xba\x6d\x0e\xe2\xe0\x7d\xda\xb1\x4d\x29\x1a\x48\xe4\xeb\x30\x65\x23\x76\x6c\x38\xa4\x2e\x93\x99\x5d\xb8\x20\x15\xcb\xa5\xd6\x5e\x52\xa4\xa9\x88\x35\xe7\x84\x88\x0b\xe2\xe0\x1a\x40\x8b\x45\x7e\x83\x61\xa9\xd1\xbe\x67\xd6\x98\x4b\x9a\x41\x90\x2a\xa2\x73\xa4\x3f\x1f\x5e\x47\xd7\x8c\x4e\x82\xed\xfb\x22\x35\x0e\xca\x38\x04\x70\x27\xea\x5b\x6f\x8f\xd0\x5e\x60\xdb\x57\xc4\xa7\xac\x6d\x95\x73\x11\x41\x0d\xac\x69\x36\xaf\xee\x6d\x0b\xfd\xe1\xc1\x58\xfc\x81\xa6\xc6\x12\xaa\x15\x0c\xe0\xa0\xcc\x40\xe1\xbf\x6b\x00\x34\xd5\x9d\xa6\x01\x82\x37\x1f\x3f\xaa\x6b\x5f\xfd\xee\x3a\x10\x1d\x46\x30\x24\x9e\xe9\x67\xf6\xf3\x9e\xf4\x81\xee\xb7\x0f\x68\x36\xb9\x45\xca\x31\xd0\xd0\x0a\xe2\xe0\x1a\x98\x64\x4b\xd4\x56\xa8\x33\x42\x71\x97\x08\x58\x43\xcd\xa7\xbd\xbd\x67\x6d\xee\xfc\x7c\xf7\xb8\x8b\x14\x83\x50\x06\xd7\x97\x07\xda\x13\x05\x71\xf0\x3e\xf5\x55\x22\x26\x26\x7f\x17\xe0\x68\xb0\xb1\x20\xcb\x73\x37\xa4\x53\xf6\xde\x06\xde\xf4\x93\xf5\x9f\x6f\xbd\x95\x8b\xa6\xe5\xdc\xa1\xb8\x20\xee\xc4\x86\x58\xa8\x01\x47\x92\xcf\x8b\x1e\x6d\x4e\x81\x57\x16\x12\x89\xf2\xf6\x3c\x8b\x8f\xe9\x0e\x75\xa3\x35\x23\x8d\xfa\x19\x96\x5d\xa1\x32\xf7\x20\x0e\xfe\xf7\x7a\xd0\x37\xd8\x6f\x29\x85\xc4\xbe\x8a\xfa\x68\x9f\xfe\xd3\xb1\x77\x66\xe7\xf9\x1a\xcb\x41\xa1\xa1\xb7\xe3\x47\x5c\x75\x47\x93\xaf\x08\x0d\x80\x38\x68\x1c\x00\x18\x61\xd0\xba\xe3\x34\x0d\x34\x3f\xb1\x75\x6e\x23\xd6\x0a\x09\x25\x74\xc8\x52\x3d\xaa\x75\x7a\x8e\x56\xcf\xe8\x7a\x71\x59\x21\xe6\xaa\xa5\x8f\xf5\x2e\x25\x74\x1a\x0e\xe2\x4e\x24\x4a\x21\x7b\x67\x95\x7c\xab\x18\xee\x78\x7b\xde\x69\xf0\x7c\x56\x9d\x2f\x66\xe0\xbb\x8c\x4a\xe5\x3d\x3a\xbd\x63\xe6\x97\x7c\x98\x22\x50\xa2\x14\x80\x83\xf7\xe9\xde\x31\xb2\x47\x58\x6d\xc2\x3b\x1a\xfc\x8f\x12\xb7\xb8\x37\x77\x0e\xb5\xb3\xf4\xb9\x36\x1f\x15\x87\x96\xee\x75\xc5\xae\xd1\x42\x85\xed\x40\x1c\x5c\x03\x5d\x05\x29\x3a\x56\xe5\xd3\x95\x7d\xf5\xab\x03\x4f\x25\x85\xee\xd8\x7c\x53\x22\x10\x92\xbf\x52\x6e\xc4\xf9\x70\x68\x41\xc7\xe7\x37\x94\x2d\x0f\xe0\xe0\x7f\xef\xea\x8b\xf9\x17\x1c\x1b\xaa\x32\x9a\x9c\x24\x3e\x7b\xef\x4b\x47\xa9\x50\x97\x6d\x0f\xf4\x62\xf3\x58\x8e\xe8\x1f\xf1\xa7\x50\x1d\x20\x34\x00\xe2\xa0\x71\xc0\x11\x70\x22\x0c\x30\x51\xa7\x1b\x61\xc5\x0f\xb6\x93\xc5\x39\x8e\x38\xc9\xe4\x96\xc2\x98\x3f\x4d\xf9\x73\xee\x5d\x72\x32\x31\xe0\x0b\x2d\xec\x39\x6e\x5e\xd3\x94\xbe\x8c\x30\x95\x20\xee\xa4\x11\xbe\x2b\x49\x91\xc2\xca\xf1\x9e\xfe\xe9\x8c\xfb\x55\xe9\xfe\x48\xdd\x92\xd8\x87\x02\xee\xeb\x2e\xcf\x7e\x7a\x08\x1b\x27\x0b\xf9\x3b\x23\x22\x83\xb8\x93\x46\x38\xb6\xdc\xa2\x96\x5a\x93\x34\xe4\xd6\x72\x52\xb2\x44\x48\xa1\x74\xd0\x38\x4a\xb5\xb3\x8b\x94\xc9\x79\xd6\x5f\x51\x11\x1a\xcd\xfd\x88\xc8\x20\xee\xff\x8c\xf0\x3f\x5e\xc6\xf5\x40\x1f\x0b\x89\x9a\x7d\x2a\x4e\xf0\x33\xcd\x4f\x5b\x53\x45\xf5\x79\x2b\x9a\xd9\x0b\xf4\xbb\x73\xbd\xb5\x3a\x2a\xd9\x1a\xda\x78\x90\x11\x7e\x30\xbf\x10\x81\x5d\xcf\x68\xb5\xd5\x43\x4e\xf0\xb6\xc1\x78\x07\xf5\x22\x12\xd3\xf4\xcd\x1b\x92\x99\xe9\x91\xfa\x33\x37\xb8\x55\xfe\x34\xc2\x23\xce\x17\x33\x9e\x17\xb5\xe3\x44\x59\x0d\x4a\xf2\x14\x3e\xa2\x1e\x30\xc5\x27\xcc\x2c\xa6\xaf\x8e\x8a\x3f\x3f\xd6\x67\x15\x7a\xe5\x0f\xb4\xfe\x5c\x43\x95\x71\x70\xa7\x80\x0b\x79\x23\xaf\x18\xbd\x65\xc2\xf6\x45\xe2\x3b\xec\x48\x9b\x51\x32\x58\x5d\x26\xb7\x16\x56\x15\xff\x6d\x46\x18\xd4\xb4\x3f\x33\x84\x4f\x18\x61\x83\x7b\x5e\x64\x2e\x19\x4b\x83\x68\xe3\xad\xea\x03\x31\x57\x51\x30\x14\xea\x2b\x2e\xf9\x06\x5c\x1b\x55\x7a\x57\x13\x4c\x73\xbd\xe6\x4c\x0e\x2b\x4f\x1a\x61\xe3\x5e\xdf\xa1\x83\x39\x94\x57\xfe\x2d\xed\xcd\x8d\x8f\xab\x2e\x34\x07\xa6\xb9\x8d\x32\x2c\x4e\xed\x72\xa4\x58\x54\x8c\x30\x9d\xc9\xdb\xb2\xa2\x27\x8d\x30\x97\xb8\x89\xdc\x6a\xad\x3f\xaf\x79\x44\xc0\xef\x46\x6c\xe4\x26\x57\x49\xee\xd8\xe3\x91\xe2\x8a\x2d\xbf\x06\x23\x99\x9d\x9a\xa7\x67\xd2\xda\x93\x46\xb8\x24\xfe\xb9\xda\x57\x6e\xdf\xa4\xc7\x9e\x6b\xef\x65\x9f\x0c\x63\x7e\x91\x36\xad\xd3\x4f\xce\x4f\xcf\xcc\xde\xd2\xcc\xa3\xfc\xd8\x74\x26\xad\x3d\x69\x84\xd3\x6e\x45\x1e\x04\xf8\xb5\x28\x5f\x88\xa8\x91\xac\x58\xbe\x5c\x24\x17\x75\x14\x91\x2f\x12\xfd\xc1\x0b\x09\x03\xf9\x8a\xaf\x4b\xf8\x99\x19\x61\x90\x88\x4e\x9b\xf9\xcc\x66\x6e\x6a\xa5\x54\xaa\x3c\xf2\x6b\xfe\xdd\xca\xd5\x1e\x93\xc9\x16\x92\x9b\xba\x47\xe8\x92\xd9\x39\x54\x6d\xfa\x20\x4a\x3d\x1f\x5a\xa9\x02\x38\xf8\xcc\xe7\x11\x9f\xa5\xbd\xfa\x90\xb9\x34\x93\xc6\x26\x13\x89\xc7\x0d\x99\x79\xcd\x82\xb7\xab\xea\xb0\x7e\xa3\x4b\x26\x9f\xf7\x5a\xd7\x3a\x22\x2e\x88\x83\xcf\x24\x59\x78\x59\xd7\xf0\xbb\x2c\x59\x4a\xad\x8e\xc3\xe3\xee\xf4\x76\x56\x0a\x7b\xb0\x07\x34\xe5\xaf\xd8\xb8\xf2\x7e\x95\x9a\xc0\x89\x41\xc4\x05\x71\xf0\x99\x2f\x6d\xd1\xa7\x4e\xcb\x83\x7c\x4c\xa0\x2a\x59\x63\x90\x09\xbd\xff\xa6\x14\xd3\xca\xcf\x81\x3b\x59\xf5\x9d\x64\x87\x9e\x94\x7b\x50\xaa\x34\x88\xf3\x17\x43\xf2\xfd\x33\x6e\x52\x19\xd7\xa5\xc2\xf2\x7d\x33\x5f\xcd\xa7\x36\x75\xb6\x85\x1f\x83\x46\x3f\x95\x34\x5d\x29\xc5\x8d\x57\xd5\xc3\x64\x17\x3a\x2c\x42\x18\x61\x10\x07\xa5\x08\xff\xdd\x08\x83\x3e\xe8\x53\x53\x84\x9f\x8a\xdc\x5b\xf9\x50\xc9\x66\x42\xac\xf0\xe6\x6e\xe3\xf0\xd5\xcd\x49\xeb\x2a\x24\x24\xce\x09\xec\xa7\x0c\xe5\xbd\x18\x39\x9b\x50\x8a\x30\x80\x3b\x71\x12\x44\x26\xfd\xf1\xbc\xdb\x71\xb7\x70\xb5\xe9\x67\xce\x8b\x83\x45\xf4\xce\x1c\x3c\xf9\x4e\x57\x2e\x5c\xf6\x36\x2c\x9e\x7e\xa1\x5b\x00\x9d\x04\x01\xb8\x13\x46\xd8\xd1\x0d\x35\x2e\x7d\xf7\x4b\xd0\x2b\x87\xef\x58\xaf\x6a\x12\xae\x1c\xa2\x3c\xec\x40\xfe\x4a\x30\xee\x7f\x79\x7c\x20\x2c\x11\x2a\xc2\x06\xe2\xe0\x12\x98\x13\xea\x94\xe9\x09\x1b\x8d\x7c\x5c\xda\x36\xba\xea\x53\xd6\x5f\xbd\x47\xa6\x75\x73\x1f\x79\x34\xc0\x9e\xa1\xed\xc7\xf0\x1a\x25\x22\x2e\x88\x83\x4b\x40\x8d\x92\xa4\xc9\x88\x80\x6d\x30\x3d\x4d\xdf\x53\xd8\xd4\x78\x4f\x8f\x02\xe5\x22\x5d\x99\xaf\x1a\x5a\xd9\x7b\xa7\xc0\xbd\x05\x22\xc4\xe2\x07\xc4\x41\xb9\x81\x00\x23\x0c\x1a\x5d\x4f\xd3\x80\xd1\xe3\x7a\x01\xde\xce\x05\x97\xef\x45\x9b\x2f\x45\xe5\xae\xe1\x2d\x6a\xaf\xf1\x68\x98\x6e\x0c\xf2\x1b\x9a\x08\x05\x77\x76\x42\xb9\xb1\x20\x0e\xae\x01\x67\x12\x61\xa6\x01\x7e\xbf\xdb\x14\x4a\x0a\x15\x01\x79\x12\xbb\x97\x04\xb0\xb8\x3e\xd1\xa6\x28\x35\x07\xab\x99\xce\x9a\xa0\xdc\x45\xc4\x05\x71\x70\x0d\xbc\x8c\x7a\xbe\xb9\x87\x86\xfb\xfd\x8d\xde\xcf\xda\x8f\xdc\xed\xcf\x7b\x6f\xac\xb2\x5b\x0f\x6f\xbf\xd7\xfa\xba\x9f\xe4\xb9\xcf\x01\x55\xb8\x06\x71\x70\x0d\x2c\xac\x47\xb6\x99\x5c\x3e\x9f\xb2\xdf\xa6\x85\xac\x5a\xa7\xac\xd0\x4e\x3d\x7a\x71\x7c\x6e\x69\x71\xcc\xdf\x72\x60\xff\xdd\x65\x6c\x28\xf7\x18\xc0\xc1\x35\x80\xea\xb9\xec\xfe\x4a\x06\xff\xae\xf6\xf6\x03\x03\x59\xff\xbb\x16\x98\xd8\x89\x28\xd8\x3f\x9f\xe5\x6c\x5d\x97\x34\xcc\xdb\xfb\xf5\x04\xaa\x18\x0d\xe0\xa0\xdc\x40\x80\x11\x06\x4d\x75\xa7\x69\x20\x8d\xcb\x67\x47\x6b\x30\x76\xbb\xcc\xc1\x57\x32\x24\x7e\x63\xc3\xe6\x5c\xa3\x02\x57\x2a\x67\xe5\x45\xfe\xea\x51\xde\xcd\xeb\x9f\xa0\x21\x10\xc0\xc1\x35\xa0\xc1\xb6\xc6\xaa\xbb\xf6\xa8\x61\xf7\xd3\x54\x93\xb0\xa0\xc1\xf4\x1c\xf1\x28\x61\x59\xd1\x1a\x8a\x15\xc3\x15\xf9\x88\x2f\xde\xab\x88\xb8\x20\xee\x44\xb9\xb4\x09\xdf\x1e\x5f\x1a\xff\x2f\x74\xb8\x04\xb7\xec\x37\xc3\xed\x72\xcc\x5b\x82\x3d\x7e\x31\x86\x1b\xf5\xe2\x1c\x4c\x25\xfc\xf7\x94\x11\xc4\xc1\x35\xf0\x95\xa4\x74\xb9\x7d\x4f\x81\x39\x45\xa8\x0a\x9b\x2d\x54\x79\x6c\x9c\xd5\x67\x05\x33\x76\x44\x9d\x80\x6d\xd6\x7e\xf7\xbd\x3f\x54\xe8\x1e\xc4\xc1\x35\x50\x8d\x9d\x46\x48\xea\x35\xd2\xd7\x2c\xa4\xc0\x7e\xe9\x5e\xbd\x33\xb2\x9f\x7f\xdc\xa4\xf1\xa0\xc0\x9b\xda\xee\x6c\x72\x53\xbe\x6b\x08\x0d\x80\x38\x68\x1c\x00\x18\x61\xd0\xba\xe3\xd4\xe7\xcd\x93\xa2\xc6\x8f\xdc\xba\x1e\xbb\x2e\x0b\x30\xb4\x10\xd2\x3b\x94\x77\x75\x28\xd9\x51\x52\xfa\xf7\xd8\xab\x32\x93\x4a\xee\x49\x23\xda\x0e\xe2\xe0\x1a\x78\x8d\xed\xf6\x79\xde\x34\x6d\xeb\xdc\x07\x0b\x9e\x8d\x89\xfe\x48\x74\x3b\xb9\xfa\xf8\x86\x69\x89\x5a\xa1\xb0\xfe\x5f\xbf\x87\xa1\x1b\x1c\x20\x0e\xae\x81\x83\xa9\x38\x16\x2c\xff\x5f\x23\xbe\x45\xd6\xae\x8f\xd3\x2f\xde\x29\x40\xf6\xb1\x4e\xb3\xeb\x56\x48\xa5\x4b\x3f\xa8\xa4\x5a\x8a\x47\xc4\x05\x71\x70\x0d\x44\x7f\xe5\x98\x3d\xf0\xfc\xf2\x76\x24\xbc\x81\x10\x37\x94\xe0\x7e\xc5\x4c\x3c\xf9\xdb\xdc\xcf\x7d\xfc\xba\xde\x6b\x7c\x91\x35\xff\x2d\x6f\x01\xe0\xe0\x1a\x90\xae\x37\x1b\xb2\x28\x66\xf1\xc7\x1e\x5c\x5d\xb5\xe1\x56\xaf\xb1\x9e\xe7\x10\xf1\x8f\x9b\xbe\xac\x87\xfa\x79\x09\x93\xe0\x63\x39\x42\x03\x20\x0e\x1a\x07\x00\x46\x18\x64\xa2\x4e\x37\xc2\xf4\xb6\xb1\x9d\x7a\x17\x98\xde\xe8\xd2\x77\x68\xe8\xc4\xd7\x55\xbf\x08\xcc\x1e\x43\x9b\x8c\xdf\x68\x49\xe1\x16\xf5\xe1\xe1\x98\x40\x98\x4a\x10\x77\xd2\x08\x0b\x06\xe8\x7b\x1a\x5b\xd9\x91\x97\x3c\x5f\xb0\xd2\x22\x6a\x22\xe1\x36\xf5\xe0\x97\x67\x2e\x26\xa5\xe2\xa6\x39\x12\xbd\x65\x43\x8b\x88\x0c\xe2\x4e\x1a\x61\xb2\x2c\x3e\x09\xbd\x95\x74\x31\x3c\x76\x6e\xab\x17\x24\xf9\xe6\xf3\x4c\xbf\xd9\x2f\xe0\x84\x58\x52\x96\x11\xdf\xcd\xfd\x4c\xaa\x84\x88\x0c\xe2\xfe\xcf\x08\xff\xe3\x7f\x96\xa8\x2f\x22\xa3\x53\xc5\x61\xb7\xc3\xa6\x7b\x61\x22\xef\x8b\x2d\x5f\x09\x5e\x46\x04\xe9\xa8\xe6\x68\xb1\x49\xfe\xfc\xf3\x16\x0e\xc8\x08\xa3\x96\xe6\x37\xaf\x66\x5e\xb5\xc9\xb8\x16\x11\x85\x9c\x4b\x4b\x3e\x44\x5d\x3c\x2a\x3b\x8b\xd2\xca\xd7\x21\xeb\x47\x19\xf7\x64\xe9\x4f\x23\x1c\x1f\x21\x22\x9a\x80\xdd\xb7\x9e\x4a\x7e\x69\x3a\xdb\xe0\x56\x8b\x7a\xd7\xe0\x87\x65\xe4\x3d\xea\xd9\x78\xc3\xcf\x11\xee\xd4\x5e\x7f\xa0\x33\x8c\x2f\x79\x4c\x17\x6a\x9e\xed\x8f\x52\x7e\xb8\xd0\xef\xe3\xb3\xa4\xff\xbb\xd0\x73\xae\xe9\x4a\x71\xb7\x25\x89\x36\x97\xfd\xff\x63\xee\xbd\xc3\xb1\x7e\xff\xff\x7f\x7b\x66\x64\x96\x99\x55\x11\x92\xbd\xc9\x88\x22\x21\x21\x64\x8f\x44\x99\xa1\x24\x7b\x8f\x6c\xd9\x9b\xac\xb2\xb3\xf7\xca\x4a\x92\x4d\xf6\x2c\x24\x64\xf7\x3b\x3e\x7f\x5c\xcf\x77\xaf\xe7\xe5\xdb\xf9\xfa\x1d\x87\x3f\x5e\xff\xdf\x8e\x07\xe7\xe5\x76\x9d\xe7\x79\x77\xae\xae\xff\x5a\x10\x06\x35\xed\xcf\x33\xc2\x48\x41\x38\x4f\x4a\x30\x85\xf2\x15\x63\x12\x3b\xea\xe3\x56\xa6\xde\x58\x87\xd7\xc9\x4b\xbe\x93\x4f\x0d\xc7\x9e\xc7\x8f\x32\x2a\x24\x17\xa6\x9f\xca\x62\xe5\x35\xa4\x8c\x36\x7e\x68\xf6\xb0\xdb\x6b\x2f\x3d\xaf\x94\xaa\x9a\x63\x3f\xd6\xa6\x81\x5d\xeb\x91\x1c\x97\x92\x40\x6f\x91\xb5\x8d\x62\x2b\x81\xf9\xa9\x2c\xcd\x22\x07\x61\xb9\x8a\x87\x58\x18\x67\xb6\xa3\x96\x86\x5f\x49\xa0\xa0\x78\xbb\xec\xfc\xb2\xfd\x16\x46\x26\xb6\xbc\x42\x4b\x35\x3e\xac\xdb\x74\x74\x2a\xad\xd5\x44\xfa\xb1\xc6\x16\x8a\x61\x1f\xd8\xde\x68\xda\xdc\xd3\x7e\x4a\x93\xaa\xbf\x43\xba\xb4\xaf\x8e\xe5\x3d\x4b\xe3\x56\x2a\x44\xaa\x21\x73\xc9\xfb\x54\x5a\x8b\x1c\x84\x6d\x9f\xb8\x07\x6d\xa5\xf9\x6f\x12\xc8\x63\x07\xd0\x3d\xba\xe1\xbf\x53\xc2\x35\xa6\xd3\x73\x6e\xf2\xdb\x48\x73\x53\x3c\xce\x62\xd6\xa9\x05\x61\x90\x44\x27\x8d\x7c\xd2\xd1\xaf\xac\x0a\x16\xbc\x71\x94\x2d\x29\x03\x13\x96\xca\xe2\x29\xc2\xbe\x05\xb7\x53\x0d\x55\x66\x73\x59\x95\xa8\x3d\xed\x9b\x43\xf4\xf8\x20\x0e\x3e\xf2\xa9\x04\x9e\x51\x44\xc5\xb5\x9f\xd1\x24\x89\x67\x66\xf6\xda\x12\x4c\x66\xa0\xcf\xc5\x9e\xf5\xcf\x48\xff\x1c\x24\x40\x3e\x6b\x09\xbd\xc3\x01\xe2\xe0\x23\x5f\xb7\x6a\x00\x9f\xab\x91\x09\x86\x37\xc7\xa4\x08\x4d\xc5\x28\xa9\x48\xe3\xe8\xc2\x4b\x6f\x3e\xdb\xba\x48\xdb\x6c\xd3\x44\x14\xe8\x56\x1f\x10\x07\x3f\xbc\xe3\xfa\xe4\x71\x59\xfa\x77\xc6\xa8\xa3\x16\xd5\xe7\x28\xb5\x07\xe4\x4e\x29\x0c\xaf\x78\x12\x2f\x8f\xe3\x9b\x30\x44\x6e\x32\x49\x41\xf7\x1b\x83\x38\xf8\x88\xaa\x4f\xda\xf0\x6a\xcb\x9f\x87\xfe\xb9\x4e\xb5\xf8\x86\x24\x79\xfc\x57\x65\x69\x45\x2a\x02\x14\x93\xd6\xf0\xed\x77\xc1\xa6\x7d\x1b\x88\x20\x0c\xe2\xa0\x33\xc2\x7f\x0f\xc2\xa0\x2f\xf4\x49\x0a\x4c\x48\x99\x7f\x5d\x95\xd7\x1b\x6b\x66\x23\x5d\x26\xdc\x56\x51\x37\xea\x5c\x18\x75\x4c\xfb\x56\xc6\xaa\x9c\x3a\x92\xf8\xdd\x12\x7a\x35\x15\xc4\x21\x3d\x20\x9c\x88\xe1\xa3\xf7\xf2\xa6\xed\xf7\x17\x03\xb6\x8f\x4c\x3f\xe9\xb2\x3e\xd3\x9b\x1f\x64\x7b\xa8\xf0\xd6\xd4\xfa\xdb\x39\xa5\x15\x03\x44\x5d\x10\x07\x57\xa0\x89\xe3\x6e\x59\xa9\xdf\xfe\xfa\xfc\xf0\xf8\x2f\x0d\xbd\x55\x16\x3d\x0d\x92\x46\x47\x06\x42\x94\xc2\x1f\xa5\xce\xef\x30\x32\xd9\x11\x75\x41\x1c\x5c\x01\xe3\xdb\xac\x2d\x63\x3d\x8d\xaa\x7c\xe2\x74\xbd\x7b\x2a\x21\x29\x1a\x37\x45\x63\xcf\x84\xf8\x97\x7c\x98\xb9\x88\x4f\x57\xeb\x0f\xad\x08\x83\x38\xb8\x02\x7c\xf6\x69\x1b\x34\xe2\x9f\x43\x02\x7e\x33\x65\x4c\xc8\x0b\xd8\xff\xac\x34\xb4\x50\xb0\x67\xb8\x96\x1f\xd4\x73\x9e\xf6\x7b\xf6\x43\xc4\xe4\x07\xc4\x41\x67\x03\xaf\xfd\x7d\x02\x0c\xea\x5d\x4f\x72\x20\xce\x23\x6b\x35\xd6\xf0\x32\x73\x38\x6d\x8f\xf1\x97\xe6\x4f\xcb\xda\x56\x77\x74\x29\x58\x65\x5f\x89\x67\x8d\xd1\x26\xac\xdc\x84\x36\x70\x80\x38\xb8\x03\xbf\x15\x9b\x87\xbd\x4a\x73\x6b\x0d\x89\x68\xf7\x2f\x46\x7f\x11\xcc\x27\x73\xda\xa6\xf3\x6d\xe4\xe4\xde\xe6\xa7\xb8\x1f\xb3\xf2\x18\x5a\x69\x06\x70\x48\xf7\x05\xd7\x12\x93\xf1\xd7\x0a\x72\x58\x8e\xdf\xec\x5d\xce\x91\xfb\x98\x80\x5b\xdd\xe2\xfe\xd5\x65\x72\x8b\x0d\x67\x3a\x4d\x3e\x16\x7a\xe5\x0a\xc4\xc1\x1d\x68\x34\xc6\x4f\x6c\x1b\xc4\xce\xb2\x75\xe5\x7c\xa1\x55\x61\xfa\x09\xc5\x5a\xe4\x75\x7b\x1c\xf7\xf5\x1b\x81\xb6\xd1\xb7\xc6\xef\x42\x57\xfc\x81\x38\xb8\x03\x73\x1a\xe3\x67\xa9\xbe\x3b\x92\x9f\x39\x3a\x44\x5b\x3a\xa2\xf0\x98\xa2\x2d\x6c\xa2\xc9\xbf\x6b\xe6\x55\x3d\xbc\xfc\x2a\xb5\x30\x1a\xe1\x00\x88\x83\xce\x06\x02\x82\x30\x68\xa8\x3b\xc9\x01\xa9\x3d\xe1\x20\xfc\xd2\x41\x66\xa3\x29\xfa\xfe\x2e\x81\xd7\xd3\x2d\x53\x24\xe1\x73\xc5\xb7\x23\xb3\xee\x6d\xf0\xa3\x3c\x4b\x5b\x43\xb4\x1d\xc4\xc1\x1d\xf8\x38\xb8\xf0\xba\x7e\x6b\x22\x97\xc1\x4b\xf7\x75\xdb\xed\xe5\x08\xee\x69\x95\x42\xfe\xe5\xb1\x9d\xee\x32\xda\x45\xe2\xe6\x3a\x5c\x44\x5d\x10\x07\x77\x20\xb5\x98\xf9\xa6\x9a\xec\x0f\x4c\xb1\xd9\x51\xeb\xfe\xf5\x85\xd4\x9b\x77\x2c\xad\x73\x9b\x48\x12\x6a\x67\xa2\x3d\x48\xee\x1d\xf3\x41\xc1\x1d\xc0\xc1\x1d\xb8\x24\x60\xf9\x16\x8b\xc4\x8a\x63\x45\x53\xc1\x91\xba\x9d\x8f\x49\x9e\x2f\xab\x2d\xc5\x50\xce\x8d\x9b\xd3\xa6\x35\xf7\x85\xa9\x0f\xb4\x3d\x1e\xc0\xc1\x1d\x48\x88\x4f\xe2\xb1\xe6\x36\xd5\x0f\xb6\x24\xfc\xfe\x2b\x9e\x70\xa5\xaf\xdd\xa5\xde\xab\xeb\xd3\x01\xe6\xd9\x68\xe7\x86\x60\xe7\x0c\x84\x03\x20\x0e\xea\x07\x34\xff\xee\x00\x68\xde\x71\x92\x03\xbe\x6e\xf1\x5f\xe3\xbc\xc7\x5f\xa4\xb3\x0a\x9c\x7b\x14\xb0\x90\xac\xb1\x66\xe8\xcb\xa8\x81\x6d\xc2\x2b\x7a\x77\xb3\xb4\x68\x16\xba\x3b\x1e\xc4\xc1\x1d\x20\x5e\xb3\xf0\x7f\xfc\xe6\xea\xf5\xdb\xc4\x1b\x84\xe1\x01\xb4\x91\xd7\x87\x55\x2c\x66\x5f\x7c\x4d\xd9\xf4\x48\xb8\x5d\xed\xf8\x08\x7a\xe2\x08\xc4\xc1\x1d\x90\x9f\x19\x8c\x1a\xfb\xf1\x4a\x1d\x77\x8b\x74\xf8\x7c\x91\xc6\x7e\x74\x66\xe7\x7d\x4d\x96\xe9\x42\xac\xb9\x70\x9b\xf2\xa2\x41\x2b\x44\x5d\x10\x07\x77\x60\x98\x2c\x49\xdd\xbf\xca\x5f\xe0\x28\xea\x09\xc9\xba\x68\xb6\xdb\x02\xdf\xae\xe6\xaf\xe8\xfb\xef\xea\x7f\x31\x45\x3d\x2f\x1c\x86\x82\x30\x88\x83\x3b\xb0\xf3\xf1\x3e\xd3\x78\xf4\x5d\x86\x90\xba\xd6\xea\x9e\x49\x3d\xd2\x47\xd2\x67\x06\x42\xee\xf2\xcf\x26\xbd\x8c\x7c\xee\xfe\xb6\x7e\x00\xe1\x00\x88\x83\xfa\x01\x40\x10\x06\x85\xa8\x93\x83\xb0\x8e\x93\xe4\x15\x09\x4f\x71\xfe\x30\x39\xb7\x8b\x5f\x38\xcf\xbe\x7b\x52\x9a\x1e\x7d\xe8\xf7\xc0\xf4\x51\xfd\x9b\x4f\x72\x89\xe6\xd7\x11\xa1\x12\xc4\x21\x07\xe1\x66\xb5\x89\x47\xbf\xcc\xf9\x37\x36\x9e\xa0\xd1\x69\xd2\xd8\xcb\x3e\x36\xef\xb4\x52\xcb\xe0\x71\x4e\x7b\x21\xf5\x2b\xfc\xdc\xf5\x76\x44\x65\x10\xe7\x29\x83\x72\xe1\x9f\x95\x55\xd8\xce\x1a\x9b\x89\x4d\x59\x4c\x9e\xf7\xfc\x38\x5f\x94\x7f\x4c\x7e\xe7\xa9\x61\x8c\x1e\x53\x84\xba\x92\x66\x8d\x73\xe0\xcf\x01\x44\x65\x10\x87\xfc\x69\xfc\xeb\x17\x84\x51\x75\xdf\x87\x86\xfa\x8a\xf8\x9e\x9b\x53\x6f\x11\x4c\x4c\xd5\x95\x19\xc1\x1a\x60\xaf\x4f\x6b\x09\x3e\x74\xa2\xef\xac\x11\xa0\xfb\x33\x08\x3f\x11\xf9\x52\xb1\xe2\x2b\x64\xa2\xe4\x3d\x86\x86\xaa\x55\xe1\x4a\xcc\x50\xdc\xa0\x6f\xa4\xf5\x51\x97\x3c\x7e\x7c\x03\x67\x1c\xf5\x0f\x94\x37\x86\x03\x43\x99\x77\x2c\x17\x77\x84\x21\x84\xba\x69\x8b\xf7\x59\x69\x8f\x35\x61\x20\x76\x8d\x59\xdc\xea\x76\xa5\xc7\x8a\xfa\x7f\x2d\x08\x83\x9a\xf6\xe7\x19\x61\xa4\x20\xbc\xba\xf2\xa8\x53\xf3\x4b\xd8\xee\xc7\xd6\x5c\xcc\x57\x8f\x2c\x2d\x8e\xd6\xc5\x8f\xf7\x67\xf6\x2b\xe4\xf4\xf0\x2a\x9d\xdf\x26\x1b\x9e\xca\x62\x25\x72\x10\xbe\xd6\xc5\xb8\x7f\x23\x32\x26\x2b\xdc\x91\x72\xa5\xd6\x20\x67\xa6\x1e\x6d\x30\x46\x40\xf4\x78\xb0\xfd\xb0\xf5\x39\x75\x62\xf0\xad\x53\x59\x9a\x45\x0e\xc2\xd3\x32\x93\x09\xc4\xfc\xb7\xb9\x9f\xbd\xd9\x37\x79\x98\x22\xcb\xed\x22\x31\x8c\x5b\x7c\xe5\xba\x3a\x77\x07\x67\xdb\xcd\xc4\x8a\xd3\x78\x28\x4a\x46\x12\x39\x08\xff\x28\x59\xec\x7f\x10\xcc\xf7\x74\xfd\xbb\x06\xa1\xd5\xd3\x61\x0a\x2a\xea\xde\xd5\x6e\xce\x49\x3f\xd5\xf9\x2e\xfb\x4a\x59\x4e\xcf\x53\x69\x2d\x72\x10\x76\x2c\xea\x9f\x50\xc4\xf6\x50\x5d\x78\x62\x8d\xfb\xf8\x77\xe5\x23\x52\x8b\xc5\x57\x43\x39\x84\x8f\xea\x13\x13\xa8\x31\xb7\xef\x9f\xc2\x15\xd9\xda\xff\x4e\xa2\x93\x46\xbe\x1b\x0e\x1d\x84\xbd\x32\x51\xac\x46\xe5\x1d\xb1\x23\x75\xe7\x70\x74\xb7\xf4\x92\x05\x92\xeb\xd1\x1f\x67\xfe\x7c\x22\xbb\x81\x0e\xdd\x94\x04\xe2\xe0\x23\xdf\xe5\xfd\x1b\x31\x62\x5f\x48\xc9\x1a\xde\xc4\x5e\xe7\xdb\x31\x37\xe3\xc2\x60\xe0\xe6\x12\x7f\x67\xfd\x41\x85\xc4\x59\x63\x38\x13\x5a\x69\x06\x71\xf0\x91\x8f\xca\x56\x7f\xdb\xc4\x35\x50\xe0\xce\x75\x99\x83\xc4\x6e\x19\x3b\x7b\x53\x8f\xcd\xa8\x96\x78\xf2\xf4\x27\xe6\x98\xe2\xba\x26\x99\xd0\xbe\x35\x00\x07\x1f\xf9\xac\x98\xd6\x28\x2e\xfc\xd4\x73\xb7\xb0\x78\x27\x17\xb1\xe0\x88\xa5\x4b\xbb\x2d\x69\x12\x95\x13\x41\x52\xd9\x20\x26\xd2\xfd\x1c\x7a\x94\x14\xc4\x79\x4a\xfd\xf3\xe6\xfd\x6f\x82\x21\x9e\x15\x34\x36\xab\x8a\x41\xab\x4a\x1f\x04\xfc\x3b\x95\xe3\x8a\x13\xbc\x8d\x6f\x04\x4c\xfa\x6c\x34\x52\xc4\x46\x40\x6f\x27\x81\x38\xe8\x8c\xf0\xdf\x83\x30\xe8\x0b\x7d\x92\x02\x3b\xc1\x0e\x41\x37\x1b\x62\x1e\xdb\x1f\xb6\x7e\xf3\x10\xc6\xd2\xd9\xb1\x0f\xf4\x60\xb8\x61\x4a\x10\xff\x8e\xa7\x89\xb7\xe6\xe9\x7b\x44\xd3\x41\x1c\x5c\x01\x0e\xb4\x1b\xbf\x43\x89\xf9\x5c\x62\xc2\xa5\xbc\x14\x24\xbf\xeb\xad\x8f\xf0\x55\x86\x2c\xd6\xf5\x48\x35\x5d\x60\x12\xa6\xa9\x81\xb6\x2e\x82\x38\xa4\x77\x23\x33\x3f\x52\xac\x49\xed\x7b\x3f\x9b\xf5\xa6\x44\xaf\x7d\xf6\x7d\x8a\xcb\xa2\xdd\x4c\xcd\xf7\xae\x27\x83\x28\xd3\x15\x02\x2e\xe8\x91\x17\x10\x07\x57\x80\x61\xe7\xa6\x0d\xa5\xcc\x99\x09\x89\x3e\x4b\x1a\x86\x9b\x65\x8c\x96\x59\xfc\x61\x85\x73\x9f\xa8\xce\xfb\xe0\xde\xd7\x3e\x58\x85\xb6\x86\x82\x38\xb8\x02\xd2\x43\x3d\x3b\xc5\x76\x41\x5b\x35\xcb\x0d\x67\xa8\xeb\xcc\xc9\x29\x5b\xd9\xc2\x23\xfd\x02\x79\xea\xce\x05\x9b\x28\xc7\x2e\xc5\x43\x17\x25\x01\x38\xe8\x6c\x20\x20\x08\x83\x7a\xd7\x93\x1c\xf0\xd4\xa4\x2f\xc8\xb2\xda\x72\x08\x5f\xda\x18\xa5\x65\xbd\xe9\x1a\x80\x8b\xda\xe1\xd9\xd2\x51\x84\xaf\x4f\xc5\x30\x53\x42\xe6\x86\x68\x3b\x88\x83\x3b\xc0\xc9\xf7\x7c\x61\xec\x6a\x6c\xe3\xd3\x7b\x29\x8e\xb1\x45\x82\x54\x1e\x3a\x82\x93\x57\x58\xea\x58\x22\x39\x0b\x7e\xe6\xa8\xfc\x6f\x75\x0d\xc4\xc1\x1d\xd0\xd2\x55\x5e\xbe\x7d\xe7\x3d\x7a\x18\x0f\xc7\xf7\x94\x4a\x4c\xb5\x8d\xa5\xeb\xae\x0f\x8c\x26\x2e\x10\xd8\x51\x18\x38\x8a\x16\x29\x23\xea\x82\x38\xb8\x03\x59\xbf\x6d\x38\xbf\x75\xe4\x09\x97\x7c\x7d\xa4\xb0\x9c\xa4\xe5\x95\x7d\x80\x22\x27\x76\xe1\xe1\xc3\x47\x33\x95\xca\x37\x68\xd6\x07\x11\x75\x41\x1c\xdc\x01\xfe\x4e\x5c\x16\x7d\xdb\x16\x45\xb4\x1f\x71\xea\x7d\x4f\xb4\x9c\x8c\xb4\x5b\xc8\x06\xd6\x2f\x9d\x3b\xaf\xc0\xc8\x5f\x6d\x54\x0d\x6d\x8d\x06\x71\xd0\xd9\x40\x40\x10\x06\x0d\x75\x27\x39\x10\x45\xf7\xc5\xb6\x6d\xe8\x09\x63\xc4\x1d\x34\xff\x35\x76\xbe\x3e\x79\x01\x76\x47\x43\xf5\x5e\x9d\x4b\x6f\xf6\x9e\x7e\x14\x09\x92\x44\xb4\x1d\xc4\xc1\x1d\x08\x3e\xc8\xba\x40\x38\x73\x5f\x8e\x63\xce\xab\xfd\x4e\x8d\x27\xb7\xb5\xd3\x15\x8b\xf4\x60\x31\xac\x6e\x87\x15\x9d\x72\xbf\x38\xe8\xfb\x0a\xe2\xe0\x0e\xbc\xf2\x5d\xbe\xfa\x8e\xd8\x57\x9b\x5a\x9b\x24\xf4\xdb\xb5\x34\x95\x8a\xfc\x70\x15\x01\xa5\xb8\x7e\x43\x6c\x2f\xfa\x6b\x95\x02\xd0\xf7\x15\xc4\xc1\x1d\xa8\x17\x88\xee\x37\x2e\x5e\x5b\x9b\xc5\xb0\x6b\x34\xfc\x12\x55\x52\xe0\x9b\x2d\x70\xa1\x56\xd5\x6f\x64\xba\x91\xb5\x6c\x93\xa9\x0a\xba\x34\x0f\xc0\xc1\x1d\x28\xcb\x5c\x2e\x25\xed\x88\xe9\x31\xb4\x67\xf8\x3c\xc4\x8f\xda\x8a\x96\x29\xfa\xb9\xc0\x71\x2c\xff\xb3\xa1\x0b\x81\xcc\x6a\xe1\x0c\xc2\x01\x10\x07\xf5\x03\x80\x20\x0c\x9a\x77\x9c\xe4\xc0\xd4\xe4\xe4\x07\xa5\x96\xbc\xbe\x1f\x38\x5d\xbf\x7b\xe3\xd7\xce\x37\x32\xcf\x36\x91\x5a\xb5\x93\xad\x7c\xe8\xa0\xb1\x13\xb9\x12\x04\xed\x8a\x01\x70\x48\xbb\x02\x94\x1d\x0c\x87\xec\xbc\x35\xb9\x25\x39\xd8\xaf\x14\xc9\xd8\xb3\xb1\xdd\xa6\x9e\xf8\x7c\x39\x83\x27\x56\x26\x94\x2d\xe1\x4d\x07\xb4\x2b\x00\xc0\xc1\x1d\x58\x2e\xc7\x7b\x70\x7b\x6d\xa3\x28\x98\x5f\x36\x23\x7c\x25\xcc\xa1\x46\x30\x47\x4f\x44\xe6\x2d\x4b\x16\x87\xd5\xe5\x5f\x8f\x7d\xba\x10\x75\x41\x1c\xdc\x81\x9b\x1f\x8e\x02\x56\xb8\xe2\xb6\x77\x48\x3a\x37\x02\xf5\x72\xd5\x84\x53\xcf\xbe\x5e\xc9\x58\x49\xad\x14\x78\xa9\xfd\xf3\x0e\x2e\x74\x54\x04\xc4\xc1\x1d\x30\x11\xf3\xc6\x7b\x6a\xe2\x34\x4c\x44\xe7\x5f\x67\xa7\xf3\xb0\x7e\xaa\xf3\xfd\x99\x4f\xe1\x54\x21\x2a\x1f\x0b\xe2\x1a\x37\x0e\xe9\x11\x0e\x80\x38\xa8\x1f\x00\x04\x61\x50\x88\x3a\x39\x08\x6b\x48\x0b\x67\x1c\x3b\x0b\x56\xa4\x9b\xbc\xbd\xac\x86\xd2\xd1\x53\xd9\xe2\x76\xf1\xcd\xe6\xd3\x81\x4c\xc9\x55\x4d\x52\xee\x9c\x34\x44\xa8\x04\x71\xc8\x41\x78\xfc\x90\xe5\x4a\xb9\xb3\xcd\x86\x82\xa1\xe7\x37\x47\xf3\x61\xc3\x97\xa3\x71\x8c\x2f\x1f\xdf\x74\x6a\xdd\x2a\xf4\xcd\x53\xe3\xdd\x42\x54\x06\x71\xc8\x41\x58\x9e\xe4\x59\xdf\x1a\x11\xda\xb2\xd2\x21\xa7\xa9\x54\x6c\xb1\x9c\x7b\x1b\x7b\x22\x8e\x49\xce\xa0\x8d\xad\x5f\x51\xd4\xca\x4d\x0a\x44\x65\x10\xe7\x29\x83\x03\xfb\x34\xfe\xf5\x1b\xc2\x9f\x5b\xf7\xb8\xe8\xcf\x0c\xe6\x49\xf8\xb3\xbe\x11\x23\x49\xf0\xbf\xb6\xd4\xb9\x24\xed\x27\xc5\x1e\xc9\x74\x0b\xe3\x09\x6f\xeb\xd8\x9f\x41\xd8\xf3\x69\x8b\x62\xff\xa7\xa2\xe0\x7c\x2e\xdd\x2e\xf4\xd1\x96\x49\xb9\x1a\xd5\x2b\x56\xfa\x5c\xdb\x76\x0a\x4b\xa4\x25\x9b\x4e\x98\x7f\xa0\x11\x37\x36\x8c\xbb\x89\xf0\x48\xb6\x17\xb5\x64\x9d\x48\x46\x48\x96\xf9\x6f\xfc\xca\xe0\x51\xc8\x9c\xdf\x41\x73\xfe\xc6\xfe\xc5\xec\xbf\x16\x84\x41\x4d\xfb\xf3\x8c\xf0\x0d\xa4\x68\xc8\xb3\x50\x73\xd6\x28\x72\xbd\x18\x4b\xec\xe6\x44\xe9\xba\x70\x70\xf3\xf1\xc7\x16\x47\x63\x7f\xfb\x10\x45\x92\x7b\x47\x91\x5a\xa7\xb2\x58\x89\x1c\x84\x9d\xe5\xa9\xa3\x54\x47\x70\xf6\x65\x65\xa8\x4a\x44\x56\x6f\x97\xdd\x8f\xc6\x50\x0e\xd3\x25\xf8\x3c\x4a\xa1\x34\x88\xdd\xff\xca\xf7\x54\x96\x66\xc5\x90\x7e\xec\x98\x8a\xaa\x66\x2a\xfb\x85\xc4\xa8\x34\x51\x9a\x99\x8e\xb8\x01\x41\xd3\xb0\xca\x3b\xf7\xbf\x48\xd6\x9f\xb7\x98\x0e\x4d\x26\x7a\x7c\x2a\xad\x45\x0e\xc2\xf8\x0f\xf6\x29\xae\xb5\x15\x8a\xc7\x17\x74\x2a\x3f\x8c\xfb\xb4\xf6\x00\xa3\x7a\x6e\xb8\x4b\xac\xd4\x2a\x39\xd6\x01\x6d\xd2\x57\xe9\x54\x5a\x6b\x8f\xf4\x63\x9f\x0b\x7a\xd5\x3a\x9a\x12\x9e\x79\x78\x16\xaf\x57\xf6\xc9\xb2\xef\x95\x04\xea\x77\x4a\x73\xf2\x8a\x96\x6e\xf7\x28\xd5\x8b\x6e\x3c\x38\xb5\x20\x0c\x92\xe8\xa4\x91\x4f\x05\x97\x6d\x32\xe8\x8e\x4d\x52\x29\x57\x5d\xe9\x5e\x65\x75\x9d\xd6\x56\xaa\x87\xe7\xcc\xc0\x0c\x59\xf5\x56\x26\xe1\xe2\xa5\x56\x68\xe5\x16\xc0\x21\xed\x8b\xad\xde\xa4\x54\x3c\xc7\xd8\x51\x2a\x8b\x15\xb4\x5d\xe6\xf4\x85\xa6\xc3\x51\x87\x55\x9f\x1b\xb3\xb4\x34\xf7\xab\x5d\x15\x2b\xf4\x38\x31\x88\x83\x8f\x7c\x57\x98\x66\xf2\xb3\x8d\xf2\x37\xdc\xf1\xe9\x4a\x0b\x8f\x1f\xa0\xef\xeb\x16\x17\x99\xd3\xde\x7c\x17\x21\xd6\x9e\x6e\xab\x51\xb2\x87\xa8\x0b\xe2\xe0\x23\xdf\xbd\xc3\x24\x6b\x5e\xb6\xe9\xe5\xa2\x9b\x1d\x41\x05\xf8\xa9\x34\xa2\x42\x35\xa4\x02\x36\x81\x63\x54\x2f\x07\x62\xc8\x25\xf9\xde\x40\x23\x35\x80\xf3\x94\xfa\xe7\x95\x83\x13\xd6\x36\x06\x3d\x97\xb9\xd8\x0b\x66\x33\x99\x0b\x77\x95\xa5\x98\xad\x66\x8d\xa4\xde\x66\xe2\x73\x15\xc9\xbc\xa2\x63\x97\x65\x46\x04\x61\x10\x07\x9d\x11\xbe\xf1\xd7\xc9\x0f\xe8\x0b\x7d\x92\x02\x2e\xf7\x3e\x26\x7e\xdd\x12\x7d\x30\x64\xda\x26\x7d\x27\xd5\xc7\x0e\xeb\x47\xdf\xeb\x2e\x3b\xfe\xe1\x4f\x91\x5f\x3f\xe4\xaf\xed\x1a\x21\x9a\x0e\xe2\xe0\x0a\xcc\x7f\x7e\xb5\x99\x12\x39\xb0\xaa\xb0\xe7\x11\x37\xf5\x3b\xbc\xe1\x2b\x63\xfe\xb3\x69\x15\x76\xdc\x8a\x8e\xad\x31\x76\xbd\x45\x68\x85\x09\xc4\xc1\x15\x60\x21\x93\xd1\xee\x6c\x23\x73\xfa\x8e\x9e\xbf\x6d\x64\xd9\xb4\xa6\xe0\xba\xf9\x25\x87\xe5\x9a\xa4\xe9\x97\x1b\x98\xa5\x4a\xb8\xd0\x2b\x9f\x20\x0e\xae\xc0\x7e\x50\x86\x21\x79\x4b\x4d\xaa\xee\x91\x20\xd7\xf4\x03\xe3\x38\x1c\x36\xb6\x99\xc7\xb5\xc1\x81\x61\x4e\x1d\xe6\x95\x31\x1f\xa1\xd0\x06\xe2\xe0\x0a\x48\x62\xa6\x06\xbe\xae\xbb\xd0\xe2\xb0\xfc\xc1\xe6\xb3\x58\x7e\x90\x44\xca\xf9\x67\x2b\x36\xd7\xe3\xd3\xf4\x68\x12\xe5\xef\x32\x96\x20\x26\x3f\x20\x0e\x3a\x1b\x08\x08\xc2\xa0\xde\xf5\xc4\x67\x53\x6e\xcd\xea\x30\xd4\xe5\x09\x96\xb6\x38\x08\x5b\xf7\xd2\x2a\x47\xf8\x7c\xaf\x18\x09\xe1\x72\xbf\x99\x7e\xfc\x54\x38\xb5\x5b\x03\xd1\x76\x10\x07\x77\xe0\x51\xb9\x53\x5b\x5a\xa8\x97\xc9\x87\x8a\x6f\x89\x19\x6a\xde\xbd\x38\x47\xb2\xf4\x7b\xc2\x0a\x5d\xe5\x6a\xed\xc9\xb5\x7c\x38\xd0\x4a\x33\x88\x83\x3b\xf0\x51\x9f\xb7\xb8\x5f\x83\x6a\x13\xf5\x5b\xfa\xc3\x5e\xb5\xf2\x9c\x19\x0a\x35\x9b\x00\xe2\xe6\x21\xd3\x87\x2e\xa9\xd2\x85\x28\x67\xa1\x55\x46\x00\x07\x77\x40\x58\x58\xa3\x9c\xf2\x96\x4a\xfe\xb9\x89\xed\x14\x3a\x1d\xc2\x1a\x97\x27\x5a\x3f\x3e\xfa\x62\x33\x53\x62\x32\x7e\x73\xc3\xde\xc8\x46\xd4\x05\x71\x70\x07\x66\xb6\x27\xdf\x19\x4a\xd7\x1a\xbd\x30\xfc\xa8\x39\x32\x73\x9d\xcb\x50\x63\xc2\x04\xfd\x42\xca\xf5\x85\xbb\xf5\x09\x06\xa8\x99\xa1\x08\x07\x40\x1c\x74\x36\x50\xec\xef\x0e\x80\x86\xba\x93\x1c\x78\xef\xc6\xca\x3a\xd6\xa9\x3f\xeb\xa5\xb3\xb4\x1c\x54\x7f\x05\x2f\x05\xd5\xe9\xf5\x76\xa2\x0e\xb5\x96\xe3\x1d\x7a\xe6\x8e\xfb\xd0\x4e\x0b\x10\x07\x77\xa0\xb0\x31\x8e\x95\xda\xc8\xa9\x3d\x37\xd3\xda\x94\x58\xe5\x39\xc9\xf9\x5c\xca\x51\xbc\xc0\x09\x26\x27\xd1\x5c\xb5\x5f\x6e\xb5\xe4\x90\x5b\x00\x0e\xe9\xd2\x3c\xf9\xa0\x84\x6a\x59\xd2\x45\xa7\x1d\xf2\xf5\x82\xcc\x21\xe1\xf3\x86\x2b\x19\x23\xc7\x51\x24\xef\x02\x02\x03\x54\xf3\x88\xa1\x27\xb4\x40\x1c\xdc\x81\xbe\xe7\xe4\x0c\xae\x99\x84\x43\xfa\x0d\x85\x7a\xd6\x62\x29\x66\xb7\x54\xe8\x44\xce\x13\x8f\x30\xe8\xbf\x1f\x60\x75\x20\xd7\xfc\x85\xa8\x0b\xe2\xe0\x0e\xc4\x72\xd9\x06\x89\x0b\xe8\xa6\xf7\x86\x33\x2d\xcb\xcf\x70\xff\x20\x18\x9b\x1b\xbf\x98\xe1\xf0\x3c\x9d\xa5\x76\x75\x4e\xb2\xe1\x23\xc2\x01\x10\x07\xf5\x03\x80\x20\x0c\x9a\x77\x9c\xe4\x00\xde\xd1\x9d\xf3\x73\x4b\xa6\x9a\x31\x97\xef\x79\x11\xba\x64\x6c\x0e\xea\x6e\xe5\xe9\x8b\x3d\x63\x7d\xb0\xd9\x96\x72\x36\x7a\xe3\x32\xa2\xed\x20\x0e\xee\x00\xa5\x16\xa1\x39\x37\xbe\x25\x53\x5f\x8e\x80\x95\xf4\x17\x9f\xa1\x1c\xf5\xae\x91\xdb\x42\xd3\xc1\xa9\xe7\x0b\x30\x88\xed\xdf\xe1\x40\x57\x7b\x00\x38\xb8\x03\x2a\x1b\xfa\x92\x42\x5d\x8d\x0f\x30\x1e\xb0\x76\x69\xd6\x5d\x23\xad\xd7\xae\xdc\x4d\x28\xf1\xa4\x60\x6e\xa9\x9d\xda\x3a\xda\x82\x6e\x3a\x07\x71\x70\x07\x0e\x58\x53\xb1\x7d\x15\xdb\xa2\x84\xd1\x8a\xa7\x47\x3a\x9b\x2c\xf8\x7a\x74\x99\x4c\x8a\x5c\x34\xce\xb1\xbe\x7a\x7e\x61\x54\xc9\x1d\xda\x72\x0d\xe0\xe0\x0e\x78\x9e\x63\xb6\x1f\xee\x68\x3e\x8f\xd6\x7a\x93\xab\x20\xd1\x57\xb4\xee\xc0\x5d\x42\xc2\xed\xf8\x66\xf3\x86\x9e\xfd\xf3\x4a\x3c\x17\xe8\x35\x71\x00\x07\xf5\x03\xf6\x7f\x0f\xc2\xa0\x10\x75\x72\x10\x3e\x74\xdf\x08\xc7\x29\x88\x71\x37\xb0\xec\xb2\x51\xfd\x7c\x6d\x6d\x35\x46\x91\xf9\x42\xcf\x91\xd6\x62\x8b\xb9\x41\x7d\x5d\x4f\x0b\x22\x54\x82\x38\xe4\x20\x2c\x7e\xf4\x72\x53\x3e\x7a\x77\xce\xf1\xa0\xfb\x9b\xf0\x78\xde\x3e\x5e\x79\xd6\xa8\xc9\xb5\x98\x70\x63\xa9\xfb\x54\x0b\x54\xd5\xd9\x88\xca\x20\x0e\x39\x08\x8f\x0a\x3b\x11\x91\xcb\xe1\xa0\x24\x9a\xfe\xa2\x3a\xea\x89\x2e\x9a\x4f\x91\xc1\x15\xe7\x65\x12\x4d\x3b\xdc\xa7\x64\x35\x68\x7d\x89\xa8\x0c\xe2\x3c\x65\x2e\xc0\x3e\x8d\x7f\xfd\x8a\xf0\xd4\xf8\xa5\x1f\x59\x72\x0e\x15\xbc\x3d\x8c\x3c\x14\xa1\x46\x7b\x44\xc5\x62\xd1\x79\x26\x1d\x7e\xb4\xc9\x4d\x32\xf2\x58\xcc\x8e\x7f\x06\x61\xae\x1a\xdd\xa5\x73\x36\xf6\x79\xcc\x3a\xd7\x57\x2f\x6b\x1a\x62\x7f\x22\xc9\x3a\x17\xad\x94\xe6\xc7\x9b\xf7\x81\x30\x35\xd7\x86\xf8\x0f\xd4\xdc\x78\xf0\x8e\x53\xc4\xdb\xe0\x6e\x6e\xc5\x28\x4f\x8d\xf7\x4c\xbd\xf9\x8d\xc7\xf7\xc2\xf5\xb1\x8f\x27\xa4\x05\x74\x50\xbb\x83\xff\x6b\x41\x18\xd4\xb4\x3f\xcf\x08\x23\x05\x61\xc2\x44\xeb\xab\x18\x24\xef\x87\xfc\x72\xd0\x5c\x02\x24\xc3\x6b\xbd\xb8\x34\x56\x47\x9d\x76\x44\x3f\x61\x4b\x85\x53\xd9\x5a\xe5\x9f\xca\x62\xe5\x09\x5b\xa3\x35\xa5\xb1\x56\x5e\x3a\xda\x72\x38\x9e\xdd\x0e\xb8\x8f\xfa\x9e\x2d\xf9\x51\x6e\xd6\x4d\x19\xf1\xae\xfb\x02\x6e\x8e\xde\x7b\x01\xa7\xb2\x34\x8b\x1c\x84\xe3\xd9\x6d\xa6\x1c\x9e\x70\x93\xd1\xa2\x1a\xd2\x3d\x8a\xa0\x68\xf8\x30\x97\x6a\x7f\x75\x02\x2d\x7b\xfb\x5c\xc6\xa7\xb0\x5e\x1c\xf6\x53\x69\x2d\x72\x10\x46\xf7\x60\xbc\xcb\x8f\x9a\xdc\xe6\xb4\x27\xc4\xda\x7a\xc9\x6d\xca\xce\xae\xb4\x44\x1a\xbf\x5d\x1f\x97\x29\x72\xee\xe7\xe5\xe3\x2f\xa7\xd2\x5a\xe4\x20\xec\xdb\x28\x64\x96\xff\xe2\xc8\x42\xfb\x4c\x9e\xc1\x83\x34\xa6\xea\x9b\x67\x04\x39\x36\x73\x6b\x5e\x0e\x6b\x97\x10\x09\xdf\x21\x27\x3f\xb5\x20\x0c\x92\xe8\xa4\x91\xcf\xdd\xe3\x0b\xd7\x75\x67\x7d\x75\xb6\x65\xd5\xf1\x91\x23\xbb\xc8\xfb\x0b\xcd\x91\xda\xc4\x49\x12\x0f\x49\x63\x9d\x6f\x35\x76\x86\x40\xd7\x2e\x02\x38\xa4\x37\x64\x45\x7d\xec\x2e\xdf\x8a\xf9\xe0\xb6\xdf\x54\xdf\xb3\x6c\x72\x11\x7f\x9a\x67\x45\xb5\xe5\x09\x49\xad\x27\xf1\xc6\x01\x8b\xb7\x07\x74\xc8\x06\xc0\xc1\x47\xbe\xd5\x89\x73\x7d\x8a\x72\xf6\xd7\x99\x7d\x5e\x04\x5c\xce\x50\xe6\xfd\x66\x96\xb7\x33\x9b\x85\xe6\xff\x78\x7b\x7b\xb8\x9c\xcd\x19\x7a\x3b\x07\xc4\xc1\x47\x3e\x96\xc2\x5d\xc3\x5b\xf9\x04\x67\x30\xc6\x2a\x8b\x22\xb0\xdb\x26\x47\xea\x8d\x51\x2b\xcf\x5f\x2b\x7c\xa1\xe7\x38\xb3\x4c\x93\x64\x0e\xa5\x2b\x00\xe7\x29\x85\x22\xf9\x67\x5d\xae\x00\xee\x73\xda\x6f\x92\xf9\xe9\x3b\xeb\x53\xc9\x5a\xd8\x67\x2a\xaf\xec\xeb\xbe\x43\x35\x7c\xff\x70\x49\xdd\xe0\x6e\x48\x30\x1b\x22\x08\x83\x38\xe8\x8c\xf0\xdf\x83\x30\xe8\x0b\x7d\x92\x02\x44\xf2\x7a\x5c\x04\xaa\x8b\x7b\xcd\x62\xb6\x26\x47\x17\x3d\x3b\x28\x53\x76\x9f\x38\xb6\x3f\x08\x6f\x65\xdf\xe1\xb3\xaa\xc6\x86\x56\xc1\x40\x1c\x5c\x01\xec\x2b\xa6\x28\x1e\x6c\x0f\xd3\x31\x87\x37\x33\x3f\x5e\xb9\x1f\x44\x8a\x91\x45\x3a\xca\xdf\x70\xf8\x60\x01\x17\x27\x90\xd9\x65\x03\x51\x17\xc4\xc1\x15\xf0\xf0\xe2\xc3\xed\x33\xbb\x4c\x42\xa1\xb5\x40\x76\x51\x53\xb9\x39\x9b\xd7\x33\xf8\x1e\x66\x73\xfb\xab\xf5\xee\x92\x8b\x5c\x47\xd0\xea\x25\x88\x83\x2b\x70\xd5\xdf\x68\xde\x3a\x36\xe5\x40\xf4\xe3\xb0\x72\x47\x28\x6b\x23\x0d\xed\xfc\x48\x7f\x55\x47\x5a\x02\xd5\xa5\x09\x82\x67\x43\x6c\x88\xba\x20\x0e\xae\xc0\xe7\x37\xe1\xb2\xb9\x24\x1e\x1c\x38\xe4\x89\x8f\xf5\xcd\xc3\x7d\x67\x6e\x08\x9c\x89\xe5\x59\x19\xce\x9c\x9f\x7f\x4f\x2f\xd9\x75\x13\x31\xf9\x01\x71\xd0\xd9\x40\x40\x10\x06\xf5\xae\x27\x39\x10\xd3\xde\x86\x27\xae\xad\xda\x9b\xd3\xb8\x6f\x28\x49\xcc\x7a\x49\xa4\xc7\xdd\xbb\x97\x49\xfe\x1d\x33\xb5\xb8\xa0\x02\x6b\x28\x74\x13\x37\x88\x83\x3b\x30\xba\x78\x9f\xea\xfc\xad\x5a\x5b\xc3\x66\xed\x65\x8e\x9d\xbb\xbf\xd0\x14\x6d\x04\xcf\xaf\x6e\xb7\xd4\x48\xfe\xfa\x19\x4b\x47\x40\x04\x5d\xf2\x0e\xe0\xe0\x0e\x8c\x28\xf0\x52\x5d\x77\x48\x92\xfa\x9a\x3b\x5f\x8e\x45\xcc\x3a\x3f\xf1\x93\xfb\x58\xcd\x5c\xdf\x1d\xaf\x82\xfd\xf9\x9e\x63\x91\x0d\xa2\x2e\x88\x83\x3b\x90\x7f\xd6\x98\xeb\x82\x4a\x1b\xba\x02\xfd\x9b\x78\xf5\x5d\xe1\x90\xbd\x59\x8d\x95\x15\x13\xb2\x98\xc0\xf2\x76\xff\x8a\x3c\x21\x5e\x44\x5d\x10\x07\x77\x40\xd6\x41\x96\x90\xb0\xc3\x05\xc7\x60\x83\x56\x28\xad\x80\x9d\x4d\xf6\xd3\x75\x3c\x23\x11\xaf\x99\x31\x8b\x8c\xd6\xf1\xc5\x20\x4f\x84\x03\x20\x0e\x3a\x1b\x08\x08\xc2\xa0\xa1\xee\x24\x07\xca\xd9\x34\xf0\xde\x57\x11\xe6\x0c\xaa\xbf\x12\xf4\xd8\xc7\x5d\x6b\xb2\x15\xa5\x5c\x51\x22\x7b\x77\x1f\xc5\x95\xb1\xc8\xfe\x3e\x74\x0b\x33\x88\x43\x7a\x3e\x89\x9d\xf5\xa6\x83\xfe\x4c\x80\xc9\xd7\xa3\x71\xc5\x7c\xc6\x72\xbf\x15\x7f\x2c\xe3\x8c\xea\x87\xbd\x98\x75\x36\x19\xc9\x9d\xdf\x10\x75\x41\x1c\xdc\x01\xfa\xa4\x3a\x33\x71\x34\xb7\x47\x5e\xcc\x96\xc4\xa1\xac\xd5\xea\x26\xf8\xa3\x51\xf4\xe7\x03\x0f\xef\xbd\x0d\x7c\x61\xf1\xb9\x0f\xea\xb7\x40\x1c\xdc\x81\x0b\x26\x18\xc3\xf5\x87\x54\xbe\x72\x66\xf7\x73\x34\x8b\x6e\x90\x96\x44\xa7\x2f\x54\xb9\x16\x7e\x7e\xd6\xca\x95\x8a\x35\xd1\x00\x0d\x89\x20\x0e\xee\xc0\x3a\xde\x37\xfb\x1e\x8a\xcf\xd8\x8d\x77\xeb\xc3\x27\x58\x0e\xd0\x76\xec\xdd\xf2\xdc\x53\xcd\x5c\x3d\x28\x73\xa5\x25\xce\x39\x40\x97\xe6\x81\x38\xa8\x1f\x00\x04\x61\xd0\xbc\xe3\xc4\x0d\x62\xac\x98\xc6\xef\x5f\xbe\xe6\xb8\xfd\x92\xe3\xa7\x04\xb5\x12\xba\x69\xe6\x68\x64\x86\x98\xcb\xe6\x59\x65\x07\x51\x9f\x32\x1f\x68\xe5\x16\xc4\xc1\x1d\x68\xd9\x60\xc7\x1f\x7f\x68\xc8\x60\xab\x69\xad\xcd\xd6\x47\x7d\x18\xfa\x79\x4e\x3c\x77\x75\x6f\x9d\x5b\x2b\xbf\x21\xce\xb3\x0a\x3a\x7e\x03\xe2\xe0\x0e\x78\x25\xb6\xb9\x7d\xfb\xad\x8d\xfa\x53\xc1\x5d\x4b\x1d\x7d\xc9\xd0\xbf\x83\xd2\xba\x15\x9d\x78\x21\xff\x11\xbb\xb6\xd4\x67\x0c\x21\x44\x5d\x10\x07\x77\x80\xfc\x0b\x57\x60\x75\x1e\x0d\x8b\x38\xa6\x2f\xae\x6e\x45\xc9\xa5\xaf\x6b\x3a\xba\x79\x37\x82\x37\xb1\x3f\xa0\xd7\x6c\x16\x2a\x9f\x43\xd4\x05\x71\x70\x07\xc4\x49\xbf\xd9\xfe\x22\x09\x27\x32\x3a\x5b\xcc\x59\x90\xd5\xc2\xe0\xfa\x3a\x3f\x2b\x52\x9f\x04\xad\x4a\xd6\x39\x54\xe8\x0e\x7b\x0d\xc2\x01\x10\x07\xf5\x03\x80\x20\x0c\x0a\x51\x27\x07\xe1\xac\x40\x4b\xdc\x7a\x9d\xe1\x63\xaf\xdf\x91\xf7\xec\x70\xda\x0d\x77\x8a\x14\x3c\x4b\x4b\x54\x12\x69\x31\x2c\x45\x68\x44\x2b\xa1\x2b\xad\x40\x1c\x72\x10\x7e\x6c\xad\x8d\x83\xc1\x60\xcc\x8c\x9b\x55\x1f\x6c\xb6\x3d\xc2\xfc\xed\xf0\x7d\xbe\x14\xd9\xac\x3b\x86\x83\x51\x40\x0b\x86\x87\x1a\xa2\x32\x88\x43\x0e\xc2\x0b\x84\xd2\x6f\xaf\x3a\xe0\x6e\x46\xdb\x39\x0c\xfb\xf1\x9b\x4b\x49\x69\xf3\x06\x88\x98\xd3\x65\xdf\xcc\xc6\x5d\x18\x7c\x7c\xcc\x84\xa8\x0c\xe2\x3c\x65\xdc\x60\x9f\xc6\xbf\x7e\x47\x38\x1f\xef\xb2\xd6\x9b\x2b\x28\x85\xe9\x23\xe1\x6c\xde\xd3\x29\xb8\x2f\xd8\x38\xde\xb4\xf3\x4f\x5f\x8c\x7d\xf9\x79\x5b\xeb\xac\x98\xcd\x9f\x71\x6a\xae\xf1\xd0\x87\x31\xaa\xf7\xc0\xfe\x22\x0f\xe1\x1b\x42\x7d\x07\xd5\x0e\xe3\x97\xdc\x01\x67\x78\x34\x6e\x5f\x9c\xd7\xa3\xcd\x99\xfb\x03\xc5\xda\xfe\xc6\xd6\xc6\xe9\x77\x44\xdb\x24\xfb\xc2\xf6\x7b\xeb\x1e\xea\x4a\x82\xae\x67\xd4\x93\xf5\x03\x66\xf2\x9f\x94\x37\x1a\xed\xff\x6b\x41\x18\xd4\xb4\x3f\xcf\x08\x23\x05\xe1\x91\xd7\x5f\x30\x0d\x79\xa3\x24\x4b\xae\x5d\xdf\x7c\x9e\x63\x24\xca\xa8\x3a\x29\x97\xcd\x4f\x37\xbb\xe1\xe0\x3c\x22\xfe\xce\x44\xe3\x54\x16\x2b\xb9\x91\x32\x1a\x4d\x99\xc8\x8d\x2c\x94\x57\x09\xd7\xce\xf6\x19\x88\x04\x6b\xd6\x66\xa5\x2e\xe3\x18\xb9\x3c\x2c\x67\x6c\x09\x6c\x10\x63\x9e\xea\x3b\x95\xa5\x59\xe4\x20\x7c\x4b\xe1\x75\x6e\x86\x5c\xdf\x85\x8a\x68\x34\xd1\x73\x2f\x50\xad\x71\xfc\x6a\xb6\x9f\x78\xbe\x49\xee\xd1\xb0\xc0\x6e\x58\x60\xe2\x3b\x95\xd6\xde\x47\xfa\xb1\x4c\xc9\xaf\xbb\x24\x30\x3b\x30\x95\x75\xd3\x73\xab\x9b\x58\xe7\xa4\x52\x08\x44\xd6\xcc\x43\xe8\x98\x59\x42\x1a\x8c\x9e\xbc\xb9\x7e\x2a\xad\x45\x0e\xc2\xac\x5f\x8d\xd9\xeb\x7e\xdd\x72\xd2\x36\xb5\x38\xe4\xa1\x27\xe4\x28\x17\x08\x20\x74\xe2\x3a\xd4\x9b\x75\x35\xe9\xff\xa5\x5a\x74\x78\x6a\x41\x18\x24\xd1\x49\x23\xdf\xf1\x1b\x2f\xaa\x4d\xc1\x3a\xfa\x4b\x5a\xdb\x86\xf4\xd8\x18\x1d\x89\x09\xf2\x13\x4c\x39\xe8\xd6\x94\xf9\xa4\x7a\xef\x12\xb3\xe3\xa0\x7f\xab\x03\x38\xf8\xc8\xd7\x47\xb1\x65\xfa\xcc\x11\x13\xcf\xbf\xa5\x9c\xdd\xe7\x50\xa7\x8d\x13\xfb\x5a\xb5\x85\xb0\x66\xf6\x41\xf8\xf9\xd6\x83\x58\x2d\xe8\x11\x59\x10\x07\x1f\xf9\x38\x3a\xd2\x24\xbe\x7f\xaa\x25\x75\x2d\xd6\x95\xa8\x93\x24\xeb\xb8\x65\x34\xe2\xba\x70\x44\x70\xdb\xac\x51\x47\x9c\x9c\x67\x12\x7a\xdb\x02\xc4\xfd\xdf\x48\xf2\x67\xdd\x80\xdf\xbc\xe8\xfb\xaa\x7d\xcd\x72\xbd\xf6\xbf\x58\x9c\xa6\x19\xfc\xf9\xc9\x89\x7f\x2e\x14\x37\x44\xae\x76\x28\xe9\x8f\x85\x41\xcb\xa2\x20\xce\x53\x0a\xe3\x1f\x75\x69\xef\x15\x1c\xe4\x67\x98\x4e\x62\x3b\x86\x9a\x14\xbe\x4c\xcc\x0a\x2e\x88\xff\xe2\x9e\x5b\x13\xac\xae\xd1\xfd\xb1\x8c\x46\x84\x1f\x11\x84\x41\x1c\x74\x46\xf8\xef\x41\x18\xf4\x85\x3e\xf1\xed\x48\xca\xc0\xc4\x94\xfb\xa1\x13\xae\x59\x5f\xdf\x8b\xfd\xa2\x39\xd3\x45\x97\x33\x3b\xbc\xa6\xce\xb5\x7c\xd1\x3f\x85\x91\x07\xbb\x1f\xd1\x74\x10\x07\x57\x40\xc7\xc8\xe0\x32\xab\x61\x40\xf2\x3c\xb5\xdc\x98\xd2\x83\xaf\xa4\x8f\x62\x5a\x2e\xbe\x2d\x7a\xcd\xc5\x39\x5c\xc1\x7d\x51\x4d\x00\x7a\xa2\x1a\xc4\xc1\x15\x88\x96\x97\xa9\x69\x52\x94\xd3\x43\x29\xab\x2f\x92\xdd\x19\x3a\xff\x61\xc6\x50\x06\x55\x77\xc1\xda\xcf\x4c\xba\x7a\x53\xfb\x37\x74\x53\x28\x88\x83\x2b\x70\x51\x5b\x71\x00\xe5\xec\x79\xfc\xef\xd3\xd6\x55\x54\xb1\x6f\x03\x7e\x4f\x1a\x2c\xc6\xcd\x95\xf5\x5a\xde\xc9\x7c\x6d\x93\xf7\x00\x52\x00\xc4\xc1\x15\x10\x2f\x0c\xc1\x7e\x37\x67\xf4\x6e\xa8\x8c\x8d\x22\xb8\xc3\xec\x5a\x3d\x65\x3c\xd3\xf3\x8b\xad\x73\x47\x2c\xbf\xa4\xa8\xcf\x98\xed\x40\x93\x1f\x00\x07\x9d\x0d\xe4\xfe\xfb\x04\x18\xd4\xbb\x9e\xe4\x40\x13\xce\x23\x72\x83\x6c\x5a\xce\x50\xb3\x8c\x37\x04\x6b\x2c\xf3\x31\xb9\x66\x02\xe9\xc6\x4d\x05\x3e\x36\x14\x67\x9f\x2e\x63\x43\xaf\xa8\x81\x38\xb8\x03\xcd\xa8\x81\xf7\x08\x23\xc2\xa7\xb1\x4c\xf7\xc4\xf2\x5e\x3d\x91\x0d\x5e\x2c\x22\xf2\x49\x93\xaf\xb2\x34\x3b\x62\x6a\x9f\x79\xe3\x8f\xa8\x0b\xe2\xe0\x0e\xac\x67\x76\x66\x46\x2a\x1a\xb9\x76\x04\x54\x2e\x95\x77\xf5\x4b\xfa\xbc\x7a\x2e\x1e\x70\x45\xec\x85\x9d\xe9\x99\x69\x26\xba\xab\x2c\x88\xba\x20\x0e\xee\x40\xe4\x55\x76\x1e\x4d\xf5\xb7\x3f\x35\x68\x8b\xc3\x4d\x9e\xc6\xf6\xbc\xf8\x10\x66\x5f\x4b\xc9\x23\xf7\x38\xd4\x28\xac\xa9\xfb\x4a\x0a\xf4\xff\x3b\x00\x07\x77\xe0\x2a\x5e\xe5\xce\x6b\xf4\x64\xb5\xb9\xed\xd4\x81\xf7\x1c\x3e\x47\xbb\xbb\x23\x8e\x09\x42\x37\x6f\x12\x7d\x58\x79\x8d\xf7\x96\x53\x00\xe1\x00\x88\x83\xce\x06\x02\x82\x30\x68\xa8\x3b\xc9\x81\x82\x85\x44\x62\x33\x81\xb1\xe9\x2f\xe8\xf7\xf0\x5e\x2b\xd8\xd2\x46\x50\x2e\x12\x8b\x5e\xfd\x1d\xc8\x68\xfc\x24\x52\x4a\xfa\x1b\x1a\xa2\xed\x20\x0e\xee\x00\xfb\x53\x9c\x16\xae\xe7\xcf\xd9\x52\xf8\x3f\x0a\x52\x31\x91\x18\x1d\xe0\x2b\xec\x7a\x75\x5c\x20\xa9\xd7\xc6\xf6\x66\xb7\x6d\x7c\x87\xa8\x0b\xe2\xe0\x0e\x78\x0a\x5c\xe8\x20\xe2\xca\x8f\x70\xcd\x40\x6b\x7a\xb9\x98\x7d\x76\xc5\xf6\x88\x6d\x2d\x79\x79\xf6\xd2\xa8\x8f\x94\x1f\x4a\x67\x0f\xb4\x9d\x1f\xc0\xc1\x1d\xb0\xbb\xd6\x35\x25\xd2\x65\xda\x32\x85\xa6\xa0\x8b\x63\xe5\x5f\xd5\x20\x9e\xa7\x97\xc9\xe0\xd1\xce\x93\x56\xbe\xf3\x86\xdd\x09\xba\x36\x03\xc4\xc1\x1d\x20\xb8\x2d\x23\xc3\xa7\x61\x2f\xec\x2e\x5b\x14\x46\x13\x76\xac\xda\xda\x34\x8a\xe2\x94\x4d\x56\xc5\x24\x5c\xe5\xfb\x0c\xdd\x17\xda\x1e\x0f\xe2\xa0\x7e\xe0\xfe\xdf\x1d\x00\xcd\x3b\x4e\x72\x60\xc8\xce\x5e\x9c\x31\x1a\x33\xf9\xb5\x02\x91\xdf\x70\x6f\x09\x61\x8f\x9a\xdb\xe5\x34\xba\xb4\xe2\x15\xa9\x4c\xcd\xc4\x91\x6e\xe8\x44\x13\x88\x43\x7a\x44\x42\x85\xab\x64\x79\x36\x83\x64\x40\x77\x22\xf1\x7c\x7f\xad\xae\xd3\x59\x2f\x69\xf2\xdc\x7e\x99\x0f\x5e\x06\xa1\xae\xef\xcf\x41\xef\x89\x83\x38\xa4\xbb\x02\xaa\xc5\xa8\x9c\x9c\x5e\x25\x19\x9f\x0b\x47\xb9\x5e\x61\x73\x40\xd2\xe1\xd3\x20\x9c\x7c\xed\x5d\x7f\x9a\x59\x43\xaf\xc0\x47\x68\x23\x17\x88\x83\x3b\x20\x33\xc0\x26\x52\x58\x2d\x70\x23\x06\xaf\xf4\x53\xff\x10\x3f\x1a\xb3\x58\x86\x3b\xcb\x80\xf0\xdd\xec\xa5\xa7\x62\x43\x93\x21\xd0\xc6\x33\x10\x07\x77\x20\x43\x76\x5f\x8f\x2f\x9d\x55\xc2\xde\xac\x58\x5a\xcb\xf1\x46\xf8\x0b\xe9\x98\xaa\x54\x92\x49\xa6\xa4\xe9\x6f\xd9\xfa\xa6\xe2\xd0\x9b\xf2\x20\x0e\xea\x07\x00\x41\x18\x14\xa2\x4e\x0e\xc2\xa9\xa6\xba\x06\x44\x16\xe6\x8c\x64\xed\x73\x7c\x8b\x4a\xb6\x74\xa3\x89\x57\xc5\x9f\xb5\x44\x61\xdc\x2a\xb7\x8b\x5f\x2d\x2f\x71\x42\x84\x4a\x10\x77\x42\x10\x4e\x2f\x42\xe3\x3f\x13\x96\x9d\xda\x4b\x39\xe2\xf2\x63\x87\xef\xc2\x96\xdf\x93\x4c\x8a\xf7\x0f\x30\x46\x8a\x27\xa7\xa2\xb1\x56\xa1\x20\x0c\xe0\x90\x83\x70\xb4\xe9\x40\x94\x03\x5a\x11\xaf\x40\x70\x0b\xc5\x23\x85\xed\x7b\x71\x98\xbb\xd3\xf2\x99\x53\x61\xef\x79\xab\xbe\xb4\x64\x13\x5b\x41\xb7\x46\x03\x38\x4f\x19\x14\xb4\x7f\x56\xfe\xd7\xef\x08\xcb\xb5\xad\x3a\x9a\x6c\x72\x1a\x3c\x5d\x0e\xfb\x70\xc8\x5d\x67\xfb\x10\x8f\xf0\xa2\x68\x93\xb2\x87\x59\xcd\xbd\xe6\x07\x78\x9f\xcd\xff\x0c\xc2\x22\xcd\x6f\x57\x25\xea\xd8\x32\xb4\xed\x6b\x89\x2b\xb5\xa5\xc2\xe3\xb0\xcd\xbf\x38\x3c\x8f\xd9\x35\x0e\x0e\xcc\xb3\x21\x41\x33\xfe\x03\x7d\x96\xd7\x94\x33\x1b\x5f\x36\xb8\x3f\x87\x35\x54\x48\x8f\x1d\x12\x27\x2f\xf6\xd5\x0f\x5d\x24\x2d\x5e\xfb\x9d\x33\x51\xd7\x55\xd3\xff\x5a\x10\x06\x35\xed\xcf\x33\xc2\x48\x41\xb8\x3b\xdc\x45\xb3\xfb\x92\x9e\xc6\xaa\x49\xa0\x54\x00\xc3\x21\x8f\xfa\x55\x3b\x8d\x94\xc1\xda\x6f\xd1\x67\x3f\xe1\x47\x98\x7a\xfc\x3a\x95\xc5\x4a\xe4\x20\x1c\x7d\xa9\xf8\x98\xe3\x80\xe3\xba\x2c\xdd\xad\xe4\x31\xa7\xf7\xd2\x5f\xe7\x4b\xae\x6f\xe3\xeb\xa3\x91\x86\xd7\xd5\x4e\x88\x28\x61\x9e\xca\xd2\x2c\x72\x10\xde\x9a\xa8\x9b\x18\x88\x90\x7c\xc1\x3f\x31\xb7\xda\xfe\xec\x83\x50\xb9\xb2\xe1\xee\x04\xdd\x66\x08\x57\x25\x17\x11\xe6\xc2\xc3\x53\xb9\xb5\x4a\x12\x39\x08\x9f\x39\x62\x59\x0c\x7a\x12\x97\xed\xd8\xd1\x7e\xeb\x46\xe3\x21\xaa\xc1\x6f\xcb\x57\x82\x3d\xba\xbb\xeb\x16\x9a\x2f\x8b\xb9\x53\x2a\x4e\xa5\xb5\x27\xac\x08\x8b\xd4\xca\xce\x5b\xca\x9e\xd3\x33\x37\xcb\xd1\xf3\x1c\x97\xfc\x1a\x23\x9a\x1a\x14\xe0\x45\x21\xee\xf8\xcd\xbd\x7b\x66\x6b\xea\xd4\x82\x30\x48\xa2\x93\x46\x3e\x9b\x1f\xb2\xd2\xd2\xa9\x92\x29\x9d\x95\x2f\x0f\x63\xab\x7e\x49\xeb\xa1\x1f\xaf\xf2\xcf\x89\x24\xd1\x78\x9d\x77\xc4\xee\xd1\x23\x41\xf4\xf8\x20\x0e\x3e\xf2\xa9\x8e\xf3\x09\x48\x95\x1d\xf0\xf2\xf7\x14\x3c\x2a\x19\x30\x7c\xfb\x22\x70\x03\x7f\x36\x7f\x9c\x41\x88\xc1\xdb\xc5\xdd\xc6\x7b\x02\x51\x17\xc4\xc1\x47\xbe\xca\xe6\xb4\x5f\x3d\xea\xa6\xc3\x17\x7c\xaf\x4f\xce\xdb\xc6\xde\x4a\xbb\x35\x45\xa3\x1b\xe3\x88\xed\x69\xfe\x8e\xd5\x30\xa5\x98\x1e\x51\x17\xc4\xc1\x47\xbe\x85\xf8\x7b\x82\x81\xb6\xa3\x45\xcf\x3b\x43\x98\xf7\x1e\xac\x54\x6f\x6f\x0c\xa7\xb2\x30\x6f\xd3\xe3\x05\x7d\x77\x3d\x8c\xde\xaf\x47\xd4\x05\x71\xf0\xba\x26\xc1\x95\x85\xa8\x6c\x0f\xde\x72\x68\xf7\x36\xf9\xa0\xae\x7b\x65\x29\xdd\x4e\x91\x8a\xb5\x20\xbf\x48\x2b\x6f\x34\x32\xa4\x13\x87\x08\xc2\x20\x0e\x3a\x23\xfc\xf7\x20\x0c\xfa\x42\x9f\xa4\x80\xe0\xef\xdd\xd6\xf4\x76\xa3\x7c\x29\x82\xbc\x81\x02\xbc\xcb\x36\x77\xd7\x1f\xe4\xe8\x5d\x1a\x2c\x2b\xb7\x45\xeb\xe8\xd2\xc2\x29\x47\x34\x1d\xc4\xc1\x15\xd8\xfc\xfa\xd6\xf1\xc2\xa7\xf8\xc6\xbb\x2e\x9f\xce\x8f\xb1\x9a\x5b\x93\x0e\x46\x1d\xd1\xa5\xa8\x34\x26\xcb\xd5\xbc\xd7\xbe\xa7\x06\xed\x8e\x07\x71\x70\x05\x48\x64\x5b\x5d\xc6\x9a\x23\xdf\xb2\xac\x9f\xf3\xbc\x48\xf2\x0c\x0f\x9d\x65\xd7\xcd\xa1\x38\xb9\xe8\x50\xd5\xbf\x83\xbe\x47\x0f\xba\x38\x1c\xc4\xc1\xff\x54\x67\x27\xe3\x5f\xe6\xea\x65\x33\x06\x9a\x08\x51\x88\x95\xf3\xe2\xd4\xfa\xbe\x97\xbe\x6d\x6a\x11\xa1\x25\xc4\xe3\x52\xee\xa2\xfa\x1c\x51\x17\xc4\xc1\xeb\xb6\x44\x1f\x11\x87\x4b\x0f\xad\xfd\xf6\x8c\x22\x79\xa4\x5f\xa8\xaa\xb9\x48\x96\x68\x18\xe5\xe4\xe2\x93\x4a\x88\x8a\x13\xc5\x89\x8f\x98\xfc\x80\x38\xe8\x6c\x20\x20\x08\x83\x7a\xd7\x13\xcf\x08\x63\xca\xb3\xd7\x62\xd2\xef\xcd\xbe\x7f\x79\x69\x0d\x95\x95\x30\x61\xec\x6d\xb7\xba\x20\x5e\x89\x4a\xed\xc8\xd6\x7b\xd5\xfc\x4e\x28\x54\x00\x38\xb8\x03\x16\x19\x7e\x91\x0f\x7b\xf4\x56\xaf\x19\x6e\x5e\x10\xe3\xeb\xf8\xb9\x7f\xbf\xff\xbb\x29\x4b\x54\x37\xc3\x85\x5b\x5d\x6b\x24\xe6\xd0\x0a\x2b\x88\x83\x3b\x10\x69\xfa\xcb\x63\xe9\x60\x9b\x58\x2d\x51\xf9\x50\x6a\xba\x42\x7d\xe0\xf9\x99\xa2\xa7\x6b\x25\xea\x6f\x24\xda\xf9\xca\xaa\x7e\x60\x41\x81\x15\xc0\xc1\xff\x56\x7c\xee\xf3\x31\x69\x8f\x83\xed\xf7\xbf\x4c\x8e\xf0\x86\xbe\x24\x27\x9b\xdc\x28\x9a\x3f\xb3\xd6\x42\x1c\x3f\x87\x63\xf8\x46\x05\x0a\xd8\x20\x0e\x5e\x57\x62\xea\x42\x6a\x4e\x89\xd2\x1a\x7a\xc1\x3a\xa3\x2e\x13\xf9\x85\x4e\x32\xb7\x4b\xe3\x49\x5e\x1c\x2f\x96\xa6\x92\xac\x48\x3f\x29\x22\x1c\x00\x71\xd0\xd9\x40\x40\x10\x06\x0d\x75\x27\x39\xf0\xf5\x3b\x99\xf1\x33\xd7\xd4\xd5\xb2\xb5\xe8\x6b\xe1\x18\x77\x2d\xe7\x7e\x89\x1b\xd7\x33\x0f\x92\x49\x85\x2d\x34\x12\xc6\xea\xe5\x20\xda\x0e\xe2\xe0\x0e\x68\x10\x45\xe6\x2c\xaa\xaa\x2e\xf3\xec\x92\x71\x90\x7e\xf6\x7e\xc7\x52\x19\xaf\x5a\xff\x36\x8d\xe2\x69\x2a\x4b\x3d\xc3\x81\x11\xf4\xb7\x02\x71\x70\x07\x1e\x9a\xcc\xa4\xce\xd4\x3e\xc2\xf6\xeb\x2f\x49\xbd\x37\x9f\xfb\x43\xd4\x28\x6a\x68\xa8\x9e\xb9\xee\xe7\xd9\xe7\xb1\x58\xe9\x5b\x87\x88\xba\x20\x0e\xfe\xb7\x62\x7e\xcf\x3f\x67\xdd\xe6\x26\xb1\xdb\x50\xfe\xfd\x4d\x77\x1a\x11\x21\x0f\xd5\xa1\xd7\xc7\xab\x4d\x14\x34\x3e\x1e\xfd\x4b\x95\xd0\x1b\xb2\x20\x0e\x5e\x17\x7f\x3d\xb6\xe4\xf0\x19\xe5\x60\x02\x2f\xce\xeb\x74\x63\x87\xfb\x05\xca\x44\x73\xf6\x3e\x9f\xb0\x35\xa8\xb6\x1e\xb6\xfc\xa0\x97\x47\x38\x00\xe2\xa0\x7e\x00\x10\x84\x41\xf3\x8e\x93\x1c\x70\x62\x20\xa0\xb9\xb4\x91\x42\xef\x86\xd1\x80\x8a\xb7\xe4\x5f\xfc\x65\x98\xdc\x2d\x02\x9d\x44\x58\xf4\x92\x3f\x51\x97\xff\x01\x74\x01\x19\x88\x83\x3b\x60\x5f\xfc\x2c\x50\x96\xcb\x44\x9c\xf8\x4e\xb3\x14\x7f\xfa\x9d\xa4\xc0\x43\x85\xd1\x80\x6e\x2c\xe7\x74\x89\xce\xa0\xc2\xee\x73\xd0\xca\x2d\x88\x83\x3b\x40\x67\x26\x62\x77\xe3\x42\xb5\xc2\xf1\x55\xc9\x90\xee\xf1\xe3\x6f\x16\x85\x56\x97\xdf\xa0\x0e\x3c\x13\x4c\x8e\x9a\xeb\xb5\xd9\x1e\x42\xd4\x05\x71\xf0\xbf\xd5\xee\x05\x69\x94\x50\xad\xf3\x82\xc1\x16\xb3\xbb\xa3\x3d\x42\x57\x72\x0a\x4d\x39\x98\x03\xab\x29\xee\x6d\x1c\x56\x17\x79\x69\x42\xeb\x03\x20\x0e\x5e\xf7\xc6\x0d\xc6\x72\xa7\x32\x17\x07\x5a\x8d\xbd\x08\xd7\xa5\x84\xf0\x5a\x5e\x4a\xb4\x22\x07\x3e\xdd\xfa\x71\x7c\x8b\xb6\xbc\xda\xbb\x08\x07\x40\x1c\xd4\x0f\x00\x82\x30\x28\x44\x9d\x1c\x84\x07\xc2\xa7\x2f\x7f\xd2\xf3\xb8\x73\x58\x9f\x73\x58\xf1\x41\x6b\xfc\xc9\x3b\x73\x1e\xde\x49\x36\xfd\xd6\x7d\x97\x42\xf5\xe7\x56\x84\x88\x50\x09\xe2\x90\x83\xb0\x1a\xdb\xb2\x75\x10\xfb\xe4\x27\x42\xa9\x28\xaf\x7b\x35\x81\x78\xf8\x58\xbb\xdf\xd3\x47\x3e\x11\xaf\x1c\xe4\xe5\xa6\xee\x69\x85\x22\x2a\x83\x38\xe4\x20\x9c\x6a\x2d\x27\xb9\xd0\x43\x15\x20\x3f\xd5\x28\xe4\x86\xc9\x9f\xc2\x80\xa9\xd7\x4f\xa1\x55\xd2\xd6\xcd\x42\x1c\x86\x1f\xa4\x9f\x03\x85\x77\x00\xe7\x29\x83\x82\xf1\xcf\xca\xff\xfa\x1d\xe1\x69\x2e\x37\xda\xe5\x52\x89\xc8\xb3\xbf\x48\x7f\x04\xb2\x2b\x67\xe5\x94\xe6\xde\xd9\x1b\x53\x29\xde\xa8\x5c\x99\x9b\xd4\x90\x30\xfa\x33\x08\xe7\x2a\x16\xff\x8c\xfe\x72\xb6\x20\x90\x7d\xf7\x13\xda\x91\x9a\x74\xa8\xfb\x1b\xed\xbb\x1b\x95\x5a\x85\x31\x9d\x54\x1c\x13\xad\xfb\x7f\x6e\x56\x5c\x0e\x7a\x38\xc1\xaa\xd6\x4c\xfe\x4b\x36\x37\x4e\xf2\xd2\x9d\x0b\x0a\x5c\xbd\x81\x04\x89\x9e\x5b\xca\x4a\xb4\xe2\x04\xcf\x98\xfe\x6b\x41\x18\xd4\xb4\x3f\xcf\x08\xcb\xc1\xc3\xd2\xab\x46\xd4\xb3\xb8\x99\x24\xb7\x8d\xb0\xb5\x6d\x42\xca\x66\x67\x14\x46\xef\x3f\xb5\x71\xe9\x3e\xae\xa6\x6c\xd1\xd3\xc2\x09\xfe\xff\xf3\xab\xff\xbf\x17\x2b\x91\x83\xb0\xd8\x75\x95\xb9\x87\x3d\x6f\xd6\xa9\x32\xa6\xbf\x72\x74\x27\xd4\x09\x5f\xd6\xac\x4c\x17\xbb\x16\x25\xfc\x90\x3a\xf0\xd3\xac\x92\xf5\xa9\x2c\xcd\x8a\x23\xfd\xd8\x14\x79\x52\xd5\x66\x2a\xb4\x1c\xe2\x1b\xed\xa8\xf1\x32\x2f\x8a\xf1\x77\xfa\x87\xcf\x9b\xd0\x07\x53\x69\xa1\x2a\x33\xde\x28\x13\x3a\x95\xd6\x22\x07\x61\xad\xb3\x67\xaf\x78\x19\x93\xa1\x3d\x0f\xb9\xfa\xdb\x51\x56\xab\xe9\xb2\xec\xbb\x57\x18\x47\x56\xcf\x22\x4a\xdf\xbe\x4a\xad\x50\x7c\x72\x2a\xad\x7d\x8a\xf4\x63\x6f\xb0\x75\x7d\xae\x1c\x7e\xc2\xaa\xa6\xa4\xcd\x9d\x40\x3f\xf3\x28\x80\xb3\x95\xd5\x75\x77\xe6\xad\x5a\xa7\x48\x93\xab\x2b\xdf\x29\xac\x7f\x6b\xff\x3b\x89\x4e\xbc\x2e\xd6\xfd\x29\x95\x50\x08\xfa\x13\xe7\xe7\x2d\x5f\xc9\xab\x18\x71\x7c\x7d\x9d\xb0\x26\x5f\x5a\x96\x55\xf7\x14\x66\xca\xba\xcd\x2b\x42\xd7\xc5\x02\x38\xf8\xc8\x97\x76\x6c\x5c\x28\xf3\x56\xfb\xe9\x4a\xf9\xaf\x64\x49\xba\xb0\xc3\x99\xc5\xdf\x18\x53\xfa\xeb\x11\xcd\xce\x41\x64\xf6\xc6\x3a\x94\x88\xba\x20\x0e\x3e\xf2\xbd\xff\x38\x14\x3a\xc3\x92\x23\x5c\x51\x2f\x74\xeb\x1e\x9e\x53\x89\xeb\x2b\xed\xd7\xc9\x64\x55\x04\x12\xf4\xca\x2f\x25\x6c\x19\xa0\xcb\xb2\x40\x1c\x7c\x84\x4a\x72\x28\xe0\x51\xb4\xce\x35\x5a\xb8\xcc\xdb\xc0\x16\xca\x8d\x35\x87\xfa\xbc\x4a\x88\x0b\xb3\xdb\xb6\xe1\x79\x03\x01\xbb\xe1\x28\xa2\x2e\x88\xf3\x94\x42\x41\xfb\xc7\x98\x32\x5f\xfa\x6c\xb5\x23\x86\x60\x7c\x49\x83\x7b\xf9\x42\xd2\xd9\xeb\x09\x1e\xe6\x21\xb4\x53\x75\x78\xfb\x5e\x22\xef\x88\x9f\xaa\x20\x82\x30\x88\x83\xce\x08\xcb\xfd\x75\xf2\x03\xfa\x42\x9f\xa4\x80\x29\x1b\xda\xaa\xad\x00\x5e\x8f\x2b\x71\xf0\xbc\x36\x3f\xe7\x0a\xce\x40\x6a\x81\x23\x75\xc4\x3c\x47\xfa\x0f\x4a\x0f\x26\x83\x50\x44\xd3\x41\x1c\x5c\x01\x47\xde\xd2\x17\xd7\xbf\xa7\x14\xc7\x94\x79\xab\xc4\x59\xe9\xe3\xda\xb0\xdf\x94\x9f\x0f\xdd\xad\x44\x1b\xf3\x70\x1a\x15\x69\x5d\x45\xd4\x05\x71\x70\x05\x7a\xd4\x1c\x2c\x44\x48\x29\xcd\x89\x1c\xc9\xc2\x83\xe2\x96\x0f\x14\xf1\x7c\xc3\x04\xbb\x63\x53\x83\xeb\xc3\x96\xf5\xf5\xf4\x1b\x10\x75\x41\x1c\x5c\x81\x1f\x4f\x04\x93\xa6\x64\x23\xd1\x32\x5b\xb6\x82\xf7\xf1\xa7\x87\xc8\x99\x1e\x5c\x6e\x4c\x2b\x6b\xfe\x24\x6d\x6c\x87\xba\x55\x0f\x6d\x0b\x04\x71\x70\x05\x14\xac\x16\x56\x07\xab\xba\x5a\xda\x4b\x03\xf4\x75\x25\x95\x43\x73\x23\xdb\x58\x39\x6a\x64\x09\x12\x88\xf0\x35\xa7\x9d\xa7\x6c\x10\x93\x1f\x10\x07\x9d\x0d\x04\x04\x61\x50\xef\x7a\x92\x03\x33\x14\xfa\x1a\xf1\x45\xe4\x43\x47\xdb\xc1\x4a\xdb\xc5\x16\x5d\x1a\x0a\xa3\x97\x54\x4a\xde\xe0\x72\xd6\x7e\x1d\xe7\xad\x9b\x86\x2e\x1e\x02\x71\x70\x07\x16\x50\xd9\x6f\x3c\xa8\xaa\x24\x49\xde\x0c\xab\xcf\x7e\x73\x2e\x8f\xd5\x8a\x9c\xc0\x66\x1b\x43\xe2\x8d\xa9\xf5\xd3\xc2\x20\x3e\x4d\xe8\xff\x4b\x00\x0e\xee\xc0\x36\x5f\x3b\x56\x1c\x3f\xfb\x83\x43\x26\x9e\x66\xa6\xa4\x52\xe2\xde\xdc\xdf\x5e\xf8\xbf\xe4\xc7\x47\x6e\x12\xe0\x4c\xd7\x61\xfd\x46\xd4\x05\x71\x70\x07\xc8\x88\x6f\xf9\x7e\xe4\xc6\xe6\x71\xeb\x9d\x5c\x77\x25\x6f\xf5\xb2\x46\xef\x3d\x0a\xf2\x2a\x52\x1e\xff\x5e\xd6\x1e\xb4\x6f\x03\x3d\xcd\x05\xe2\xe0\x0e\xf4\x7b\x87\x7b\xca\xeb\x9d\xe1\x73\xbb\xc3\xaa\xb1\xcc\x20\x90\x4e\xbb\xd4\xde\xbc\x21\x1c\x34\x76\x37\x48\xc2\x7e\xca\x19\x55\x06\xe1\x00\x88\x83\xce\x06\x8a\xff\xdd\x01\xd0\x50\x77\x92\x03\x46\xef\xb3\xdb\x38\x0e\xaf\x7e\x18\x2f\x78\x1d\x8a\xa1\xa2\x8d\x93\x7d\xa6\x32\xb4\xdc\xfb\x4c\x19\x33\x59\x9e\x01\xad\x0c\x3a\x74\x69\x1e\x88\x83\x3b\xe0\xe4\x96\x2d\xa2\x15\x5d\xa1\x68\x23\x87\x97\xdd\xd0\x34\xb4\xba\x85\xc6\x3f\xdc\x6c\x6b\xbf\x8f\xbb\x80\x1f\x25\xbd\xba\xb4\x00\x85\x2b\x00\x07\x77\xc0\xe2\xe3\xeb\x36\xa3\x8f\x6d\xb9\x9b\xf3\x76\xe2\x09\xb9\x5f\x2e\xba\xa8\x7a\xe5\x8d\x9d\x7f\x16\x54\x39\x38\xca\x2b\x84\x5a\x0f\x5d\x94\x04\xe2\xe0\x0e\xf8\x28\x38\xa7\xf1\x7f\x6b\x3c\xb7\x50\x5a\xf5\xb0\x24\xe8\x03\x5b\x0a\xa3\xdc\x1b\x9e\x68\x93\x31\xb5\x89\x1d\xef\x16\xc6\x31\x28\x5c\x81\x38\xb8\x03\xcf\x6f\x3f\x48\x52\x76\xca\x67\xbf\xcc\x8e\xe5\xbb\x15\x76\x9c\xb6\x20\x92\x80\xd6\xd0\x1e\xfa\xfe\x53\xd9\xf9\x25\x85\xac\x0d\x4c\x84\x03\x20\x0e\xea\x07\x00\x41\x18\x34\xef\x38\xc9\x81\x7b\x9f\x56\x1e\xcb\xca\x2e\x9b\xeb\xc7\x30\x7d\x3e\x20\x7a\x2e\x78\x53\xc4\x40\x94\xae\x57\xe9\x40\x77\xc8\xaf\x3f\xfe\x29\x0b\x34\x6c\x83\x38\xb8\x03\xbe\x82\x17\xbe\x96\x7f\xc1\x5f\x49\xf3\xda\x9a\x8b\xaf\x13\xa1\xd9\x26\xc9\x3a\xee\x4e\xfa\xfd\xb4\x45\x5d\xd0\x46\xcd\x1a\x15\xda\x6d\x00\xe2\xe0\x0e\x3c\xbd\x80\x22\x91\xf0\x85\x9b\x46\x43\x72\x7d\xb9\xce\x20\xf7\xfe\x83\x1f\x6a\xf8\x21\x26\x77\x66\x6f\x85\xb6\x29\x9a\x04\x12\x8d\x20\xea\x82\x38\xb8\x03\x1c\x21\x3d\x8f\x3e\xce\xdc\xfd\xf9\x41\x98\x44\x88\xe4\x38\x8b\xb2\x59\x8f\x5a\xfc\x9e\x76\x33\x7e\x89\x78\x30\x67\x37\xf7\xca\xff\x2e\x7a\x04\x70\x70\x07\xba\xd6\x76\x6a\xb6\xaa\x29\x6e\xad\x05\x3d\x3b\xf6\x8b\xbb\xed\xab\xc3\xbd\x46\x1d\x18\xc1\x47\x3b\xe2\xd4\xde\xe9\xcb\xc0\x05\x6d\x8f\x07\x71\x50\x3f\xf0\xf4\xef\x41\x18\x14\xa2\xfe\x1f\x5b\xa3\x7f\x8e\x6c\x56\xd4\xf8\x16\x9d\x4d\x09\xc8\xc9\xb1\xf3\x2c\xa3\x73\x58\xf1\x60\x8d\x50\x98\xe5\x2c\xa0\xaf\xbe\xfe\xf9\xee\x1c\xb4\x35\x1a\xc0\x21\x07\xe1\xc9\xa0\x65\x8c\x7b\xd4\xf6\xb7\xa8\x75\x9e\x5b\xaf\x32\x31\xa9\x1f\x64\x0f\x98\xf5\x6e\x7d\x73\xf2\xb9\xd3\xff\xf8\x7e\xea\x46\x20\xa2\x32\x88\x43\x0e\xc2\xb7\x6a\xf9\xf6\x69\x7b\x02\x9b\x3a\xf5\x3a\xd9\xa3\xe4\x58\x5e\x54\x3c\xb8\xa0\x94\xff\x5c\x90\xf2\x86\xfc\xf7\xb4\x2d\x96\x38\x3c\x44\x65\x10\x87\xfc\x30\xd3\xbf\x7e\x47\x78\x5e\x4f\xc1\xfd\x91\x80\xe0\xd5\x03\x55\xf2\x01\x36\x5c\x05\x6e\x4f\xf4\x4f\x26\x39\xda\x8b\xc1\x34\x72\x49\x0a\x1d\xb2\xf5\x21\x7f\x06\xe1\x87\x62\x3c\x1f\x5b\x2c\xa6\x5d\xe7\xeb\xf9\x3f\xca\x07\x1e\x1f\xf9\x95\x10\xb0\x31\x12\x50\xad\xb7\x7c\xaf\xe9\x27\x25\x8d\xb9\xfc\x67\xbf\x11\xa2\xaa\x98\xf4\x85\x56\x3c\xd1\x80\xfa\x47\xed\x92\xf3\x52\x38\x06\xe1\x99\xb8\x57\x6e\x4d\x68\x72\x0a\xfb\x0e\xd5\x09\x4f\xfe\x6b\x41\x18\xd4\xb4\x3f\xcf\x08\x23\x05\xe1\x81\x47\x0b\x79\xbc\x7b\xae\xe9\x55\x8a\xf1\x6e\x0c\xc6\xf7\x6b\x51\x3c\xeb\x51\xce\xd1\x7f\xee\x60\x32\xe5\xbf\x4b\xe0\x7b\xb0\x74\x2a\x8b\x95\xc8\x41\x78\xfb\xe3\xcb\x40\xd9\xcd\xda\xee\x1b\xb3\x68\x9d\xec\x37\x44\x76\x1f\x04\x2d\xcc\xc7\xd8\xbb\x69\x6a\xf0\x1d\x71\xbe\xdf\xb0\x7c\x7a\x2a\x4b\xb3\xc8\x41\xd8\x30\x99\x50\x4b\x48\xd5\x5d\x86\xd0\x7c\x8f\x97\xc3\xea\x6b\x48\xa2\x18\xff\x35\xf2\xdc\xf6\xd7\xac\x79\x83\x77\x7d\x56\xfc\xcb\x4f\xa5\xb5\xc8\x41\x98\x9b\xac\xef\xaa\x32\xe9\xbc\x6a\x01\xdf\xc5\xfb\x4f\x23\x2b\x4d\xe4\xfc\x3d\x58\x3a\x86\x3e\xa8\x89\x7d\x7a\xdb\xf2\x18\x5b\xe5\x14\x0e\xeb\x06\xca\x48\x22\x07\xe1\xaa\xa0\x84\xd7\xdd\x3b\xeb\xbe\x7d\xf7\xc8\x66\xdf\xc8\x1b\xae\x6c\x71\xac\x61\xa3\x10\x6d\xba\xc4\xe1\xd1\x2e\x52\xdf\x18\x4b\x3a\xb5\x20\x0c\x92\xe8\xa4\x91\x0f\xb5\x0b\x8b\xf0\x6b\xd3\x96\x51\xb2\x9e\x30\x8e\x08\x69\x52\x90\x6b\x1e\x6a\xad\xd1\x4c\x9c\x47\xaf\x7c\x35\x6f\xfc\xf5\x03\xe8\xbd\x10\x10\x87\x94\x82\xd4\xb3\x2f\xe9\x30\xc4\x12\x3c\x37\xf9\x56\xb8\x31\x1f\xb0\x47\x5c\xd2\x11\x3f\xb6\x34\x8e\xc7\xf6\x88\xda\x95\x25\x28\xe4\x13\x94\x82\x00\x1c\x7c\xe4\x7b\xab\x37\xe4\xc2\x46\x7c\x1c\xf3\xb6\xdd\xb9\x79\x8a\xe4\x4c\xf7\x5c\x5f\x85\xd5\x00\xf3\xca\x10\xaf\x49\xbc\x1f\x9d\xd5\x22\x34\x4b\x01\x71\xf0\x91\x8f\x74\x86\xef\x9c\xf7\x9a\x60\x10\xde\x1d\xe5\x4b\xa5\x1a\x29\xb3\xf7\xe4\x26\xe6\x2d\x1c\xc4\x0b\x71\x8b\x1f\xdc\xc7\xea\xd0\xdc\x47\xd4\x05\x71\x9e\x52\xff\x7c\x8d\xbd\x78\x51\xe5\x05\x5f\xf7\x9a\x75\x84\x03\xb9\x70\xd2\xed\x10\x57\x2d\xff\x62\xea\x37\x36\xb3\xef\x0e\x86\xab\x05\x5e\xee\x52\x1d\x21\x82\x30\x88\x83\xce\x08\xff\x3d\x08\x83\xbe\xd0\x27\x29\x90\x58\x2d\xa4\x21\x86\x19\xc6\xc1\x25\x87\x7a\x5f\xfc\x12\x8e\xed\xe8\x07\x42\x97\xb4\x9c\x67\x0a\xfe\x9b\xaf\xef\x65\xdc\x0d\x83\xce\xc6\x82\x38\xb8\x02\x87\x5c\xef\x1f\xa9\x19\x7c\x8d\x4b\x11\x93\xff\xca\x8a\x6e\xe9\xab\x8b\x62\x94\x75\xe9\x75\xd9\x4d\x8a\xa2\xb1\xf6\x6d\xe6\xa7\xd0\x6a\x20\x88\x83\x2b\xe0\x5a\x31\xe7\x7e\x67\xf4\xd6\x81\x67\x1f\xd1\x9d\x16\xb4\xd5\xb9\xd5\x41\xc6\x4b\xc7\x06\xef\xbd\x3d\xe9\x22\x79\x35\x13\xca\xa1\x10\x04\xe2\xe0\x0a\x7c\x18\x62\x7f\x36\x73\x65\x57\xd6\x9f\x99\xb6\xc6\x7e\x4d\xd1\x62\xb7\x8d\x30\xf5\x79\x94\xd5\x0f\x11\x69\xad\x89\xe0\x2a\x8a\x52\x44\x5d\x10\x07\x57\xa0\x92\xeb\xc9\x71\x2a\x2d\x9e\x78\x8e\x6b\x04\xfa\xa6\xf1\x04\x81\xc4\x4d\x83\x54\xbc\xdd\x03\x61\x35\xdb\xc5\xbb\x17\xa2\x3d\x95\x10\x93\x1f\x10\x07\x9d\x0d\x04\x04\x61\x50\xef\x7a\x92\x03\xe8\xd3\xe6\x31\x62\x76\xe3\x6a\x92\x19\xa1\xbb\x36\x9b\x77\x71\x65\x31\x2f\x56\xb9\x6a\xa6\x48\x52\x2f\x15\xc4\xbb\xfb\xfc\xef\xce\x3c\x10\x07\x77\xa0\x63\x0d\x95\x5a\xa8\x45\x48\x54\x9f\xb4\xf3\xf0\xad\xbf\xfd\x5b\xce\xaa\x77\xea\x8a\x7b\x69\x1d\xb2\xe6\x9e\x8a\xa3\x4f\xce\x6a\x23\xea\x82\x38\xb8\x03\x0d\x75\x86\x41\x6c\x86\xc9\x17\xe2\x8e\x26\x30\xe5\xe6\xda\xe4\x3f\x34\xaa\xc9\xd6\x55\xd5\x56\x4d\x0c\x18\xaa\xa4\xda\x7f\x17\x45\xd4\x05\x71\x48\xbb\x02\x68\x95\x3b\xfa\x7d\x3a\x4b\x73\xd5\xca\x6c\x3e\xae\x69\xf7\xbf\xa7\x5d\x24\x20\x2b\xd9\xa2\x25\xd3\x92\xbc\xaa\xac\x70\xec\x0a\xed\x0a\x00\x70\x70\x07\x76\x70\x7f\xdf\xd0\x11\x54\xa8\x41\x19\x61\x5b\xb5\x20\x60\x2b\x2a\xb3\x7d\x2b\x78\xf1\x08\xa5\x13\xb5\xe8\x63\x19\xe1\x30\xf7\x25\xe8\xd9\x14\x00\x07\x9d\x0d\x04\x04\x61\xd0\x50\x77\x92\x03\x07\xb8\x93\xb1\x46\xa8\xb5\xbb\x3c\xa2\xfa\x23\x83\x14\x28\x9f\x19\xed\x3d\xbe\xfa\x91\x70\xc5\x34\xd1\x10\x49\xbd\x34\x70\xab\x84\x2e\x08\x02\x70\x70\x07\x2e\x19\x38\x8a\xea\x52\xc8\x27\x0c\xd5\xff\x6e\x55\xf5\x7f\xd7\x69\x26\xa2\x6c\xbf\xcc\x10\x22\xe1\xfc\x72\x9a\xe7\x53\x03\x33\xb4\xe9\x08\xc4\xc1\x1d\x78\xa6\xd6\x6f\x11\x7e\xf1\x41\xed\x3d\xe5\xd9\x6b\xb6\xe8\xd7\x7d\xd7\x5a\xbf\x44\x8d\xee\xf4\x84\x11\x56\xbf\xe8\xf9\xd9\xe5\x04\x85\x36\x10\x07\x77\x40\xb5\xf7\x88\x43\x0c\xd3\xb8\x78\x82\x75\x93\x1c\x55\x64\x77\x47\x42\xf9\xe6\x5e\xcd\x1e\x2d\x71\x7b\xf7\xf5\x94\xac\x9d\x95\x0c\x68\x33\x13\x80\x83\x3b\xe0\x45\x74\xd0\xe9\x5b\x7e\xe3\xe3\x0a\xa1\x42\xc3\x46\xf3\x76\x3e\x3e\x31\x43\x9f\xa0\x56\x19\x86\xbe\xa4\xc4\xcb\x3d\xe3\x48\x49\x84\x03\x20\x0e\xea\x07\x00\x41\x18\x34\xef\x38\xc9\x81\x67\x5f\xbf\x05\xba\xea\x29\x30\xa9\x38\x4c\xbd\xbe\x7d\x91\xb9\x90\x83\xfa\xbc\x48\xfb\x47\x21\x51\xfb\x9b\xf4\xc5\x33\x26\x52\x6d\xd0\x67\x0a\xe0\x90\xc6\x02\xf4\xc0\x47\x0e\xdb\x71\xeb\x8c\x46\x99\xfa\xe7\x4d\xb7\xca\xbb\xb7\xd0\x50\x37\x04\x2a\x78\x44\x74\x12\xd0\xfb\xcd\xb7\x39\xa0\xb1\x00\xc0\xc1\x1d\x10\x76\x45\x39\x12\x0c\xb8\xf5\xe0\xb7\xa3\x9a\x80\x60\x11\x7b\x1f\xf7\xee\xd4\xdb\xd7\x4a\x68\x1f\x0a\xde\xf5\xdb\xe1\x9a\xcd\x40\xd3\x0c\x10\x87\xb4\x91\xeb\x7d\xd4\x8f\x17\x1e\xf3\x6a\xdc\xdf\x9f\xdc\xb7\xd2\x8d\xec\x15\xdc\x1a\x5b\x3e\xb7\x38\x40\xf9\x94\xeb\x26\xfd\x19\x3b\x85\x61\x44\x5d\x10\x07\x77\xc0\x4f\x21\xfd\x62\x98\x6f\x46\x60\xcc\x5b\x5e\xed\xf2\x95\x38\x0f\x8d\xba\x68\x5c\x7b\xfd\x3a\xf9\x8e\x87\x2a\x11\x49\xa5\x42\xd0\xf6\x78\x10\x07\xf5\x03\x80\x20\x0c\x0a\x51\x27\x07\x61\xaf\x7d\x4e\x6f\x31\xcc\xf2\xd8\x01\xab\xdf\x0d\xeb\xfe\xc5\xba\xf9\x44\x4c\x52\x68\x41\xd1\xb5\x0b\x2a\x42\x58\x83\x01\xdd\x21\x88\x50\x09\xe2\x90\x83\x30\xf5\x9a\x24\xf9\xda\x93\xeb\x45\x2a\xfe\x19\xf9\x49\x41\xc9\xbf\x47\xb9\x1e\xb1\x39\x93\x0c\x32\xcd\x5d\xe0\xf3\x4e\xd4\xb3\x83\xee\x76\x06\x71\xc8\x41\x58\x70\x7d\x75\x63\xbf\xb6\xf4\x4c\x66\x23\xc7\xf4\xc1\x0b\xae\xd6\x05\xfe\xd5\x4c\xbd\xc7\x5f\x15\x9c\x04\xa5\x35\x9e\x5c\x0e\xb5\x46\x54\x06\x71\x9e\x32\xff\xf7\x49\xfe\x59\xf9\x5f\xbf\x23\xfc\xe0\xa2\x9f\x30\x8e\xf5\xdc\xa0\x55\x64\x8c\x28\x89\x2d\xf3\xdc\x8c\xd7\xa8\x69\x79\xb3\x82\xa5\x61\xd8\x4e\x68\x1b\xfd\x1e\xcf\x9f\x41\x38\x74\x4e\x6b\x88\x30\xe0\x00\x33\x38\x88\xcf\x9e\x61\x6b\xa5\xa9\xfd\xda\xeb\xf8\x96\x37\xf4\x29\x86\xc6\x41\x36\x5a\x75\x9c\xe7\xff\x40\xb3\x9b\x09\xbc\x79\xb5\x0f\x3b\xf7\x06\x97\xac\x7a\x2e\x26\x9f\xdf\x5f\x52\x3f\x68\x08\x3e\xce\x95\xca\xb0\x11\x73\xbe\xa6\x9b\xfe\x5f\x0b\xc2\xa0\xa6\xfd\x79\x46\x18\x29\x08\xf3\x88\xbc\x3a\x4f\x53\x4b\xf7\xf9\x82\xa2\x16\x8b\x9f\x5e\x9f\xb4\x73\xbd\x5f\x5c\xf4\x9b\x60\x39\xe7\xd5\xda\x7b\x55\x76\xa5\x39\xa7\xb2\x58\xc9\x83\x94\xd1\x46\x8e\x7f\x97\xd6\x0f\xbf\xa2\x2a\xb7\x8f\xa0\xfb\xba\xbd\xb1\xfa\xcd\xfe\x7b\x46\x42\xec\x26\x8f\xb3\x8a\xba\x09\x2f\xbf\x12\xf5\xa9\x2c\xcd\x22\x07\xe1\x1e\x85\xec\xdf\x3a\x56\xb8\x3f\x24\x94\x1e\x69\x19\x1a\x8b\xdf\x60\xde\x2b\xc7\xfb\xcc\xb1\xfa\xd8\x60\x80\xbc\x95\x27\xa1\xbb\xe6\x54\x5a\xab\x85\xf4\x63\x71\x9a\x32\xf7\x7a\x7a\x82\xf3\x63\x1b\x15\x82\xef\x71\x0b\x7f\xbf\xa1\x8c\x6b\xc0\xad\x55\x6f\xf6\x3c\xfa\xb3\x04\xd9\xf9\xe5\xbd\x53\x69\x2d\x72\x10\x5e\x49\x71\xf9\x10\x1c\xd8\xf9\x98\x12\x77\x96\x85\xbc\xfa\x86\x35\xc6\x22\xbf\xc3\xba\xdb\x15\x33\x05\x11\x3e\x3d\xc3\x3b\xd1\x14\xa7\x16\x84\x41\x12\x9d\x34\xf2\x6d\xa6\xde\x93\xa4\x4b\x29\xec\x63\x5b\x18\xe4\x57\x63\xda\xb4\x6e\x91\x70\x6e\xc7\x18\x27\x2e\xf9\xe8\xd1\xf1\xcd\xef\x83\xf9\x77\x68\xff\x2a\x80\x83\x8f\x7c\xa5\x65\xd3\xcf\x9b\x49\x4c\x13\xd9\xa3\x62\x0f\x0e\xf3\xcc\x6c\x7f\xa1\xbe\x28\x52\xc4\x54\x8e\x7b\x59\xdf\x39\xc0\x5e\x61\x87\x8e\xa8\x0b\xe2\x90\x66\x3f\xe3\xc1\xc1\x54\xd5\xab\xad\x15\x68\x04\xe5\xa9\x76\xc4\x2c\xc2\x07\x8e\x73\xda\x52\xd7\xe5\x92\x82\x1f\x49\x7d\x2c\xf1\xe7\x81\x46\x6a\x00\x07\x7f\xd7\x80\x86\x5d\xa0\x14\x33\x37\x48\x4e\x40\xc3\xa7\xda\x43\x89\xc9\x42\xe7\xf6\x63\xfa\xe7\xee\x43\x77\x3e\xb5\x86\xf5\xcd\x27\x25\x42\x2b\xcd\x20\x0e\xfe\xf9\x52\x37\x95\xf3\xa1\xa5\xca\x34\xe7\x9f\xe3\x18\xae\xa0\x94\xe0\x6d\x3c\xaa\x0f\x51\x1c\x2d\xa5\x59\x0b\x73\x17\x90\x40\xd9\x77\x47\x04\x61\x10\x07\x9d\x11\xfe\x7b\x10\x06\x7d\xa1\x4f\x52\x40\xd5\xa8\x5d\x88\x33\x38\x33\xe8\x12\xbb\x66\x47\x06\xb3\x0b\xdd\xb2\x9a\xa8\xe6\xc1\x75\xa6\xa0\x84\xb2\x2e\xc2\xef\x44\x1d\xde\xd0\xc4\x0f\xc0\xc1\x15\xe8\x59\x8b\xc9\x6f\x6e\x51\xd1\x69\x2c\xe1\x6b\x48\xed\xe7\x9f\x8d\x99\xdd\xb3\x96\x3e\x5b\x42\x91\xcd\xb0\xfe\x4e\x33\xf0\x4b\x20\xb4\x72\x0b\xe0\x90\x56\x01\x6e\xd7\x17\x60\x91\x5f\x6b\x20\x21\x78\x9a\xff\x01\xa3\x95\x55\x9a\xc6\xfd\x35\xce\x7d\xe2\x8b\xc6\x8a\x99\xd9\x53\x32\x5d\xd0\xed\xce\x20\x0e\xae\x00\xc7\x9e\x22\xad\xfc\x2c\x5b\xcf\x97\x7c\x0c\xce\xc5\xd1\x6b\x36\xd6\x8a\x1c\xe1\x96\x3e\x59\x8f\xea\x33\x67\x05\x75\x71\x96\x73\xa1\x55\x00\x00\x07\xff\x7c\xc9\x27\x9e\x06\x1c\x61\x12\x19\xc9\xfa\xc4\xf8\x15\x16\x36\xef\x06\x3e\xcd\x3e\xa3\x4d\x30\x7f\xe1\xf5\x9b\xa3\x82\x73\xab\x7d\xaf\x10\x93\x1f\x10\x07\x9d\x0d\xe4\xf9\xfb\x04\x18\xd4\xbb\x9e\xe4\x40\xff\x2e\x89\xb2\x0e\xaa\x2e\xdd\x03\xb6\x1a\xee\xed\xb6\x74\x4c\x52\x1b\x6a\xd4\xd8\x91\x77\x0e\xd2\x7b\x36\xf4\xd7\xae\x4b\x41\x01\x10\xc4\xc1\x1d\x30\x98\xed\x60\x71\xa7\xf9\x4a\x6b\xdf\x51\x1d\x88\x2b\x23\xf5\xe0\x36\xee\xf9\x5e\xbe\xc4\xdf\xb4\xb2\x01\x0a\xb6\xac\xbe\x87\x50\xf7\x02\xe2\xe0\x0e\x3c\x78\x21\xdf\xaf\xe3\x4e\xf7\xf2\x80\xc3\xfa\x41\x42\x47\xb5\xec\x82\x3d\x21\xad\x01\xfb\xf1\x6e\x43\x92\x05\xff\x6e\x32\x99\x35\xa2\x2e\x88\x83\x3b\x50\xa9\x9c\x14\xad\xf9\x64\xfe\x6e\x1e\x93\x7c\xc9\x97\xeb\x59\x0c\x76\xfc\x73\x36\x55\xaf\x94\x97\x5d\xcf\x88\x7e\xbe\xaa\x1c\x0e\xdd\x18\x0c\xe2\x90\x2e\x21\x92\x8e\x71\x95\xa3\x77\xd9\xcd\x31\xbe\xcd\xc0\x60\x12\x59\x33\x96\x74\xd8\x56\x74\x58\xed\x1c\xcc\xc2\x13\xe3\xfa\xfa\xc8\x0d\xda\x12\x09\xe0\xa0\xb3\x81\x80\x20\x0c\x1a\xea\x4e\x72\x80\xa1\x77\x92\x84\x6b\xeb\xe7\x7d\x77\x76\x77\x34\xda\x5b\xae\x89\x8e\x06\x18\x26\x19\xf3\xe9\x4f\x42\x4d\xad\xcd\xcd\xa8\xf3\x58\x11\x6d\x07\x71\x70\x07\xd6\x2f\x04\xf0\xfe\x14\xcf\xc5\xee\x72\xa8\x0b\x7c\x6f\xb8\xea\xaa\xec\x56\xc8\xda\xf3\x09\x85\xec\x6a\xf0\x17\x19\x55\x2d\xbe\x17\xd0\x79\x6e\x00\x07\x77\x60\xd2\xf9\xd1\xd3\x97\x4e\x64\x53\xc3\x99\xb7\x84\xbb\x9c\x9b\x9b\xf7\x14\x04\x14\xde\x33\x5f\x5f\xa6\x7f\xd1\x66\x7d\x96\xfe\x0a\x27\xa2\x2e\x88\x43\x7a\xf1\x4e\x2e\xd2\xf5\x3e\xda\x8d\xab\x86\xe2\xbb\x4f\x38\xbe\x4d\x34\x2c\xb7\xb4\x1c\xde\x74\xd4\x61\x54\x54\xd3\x34\x1b\xc4\xa5\x80\xce\xb3\x82\x38\xf8\xe7\x7b\x35\xef\xdc\x52\xb9\x0e\x79\xf2\x4d\x9b\x57\x91\x2f\xe5\xb0\x59\x9b\x96\x89\xd2\x03\x2e\xb6\x3f\xb4\x3a\x7a\xff\x38\x82\x7c\x79\x11\x3a\x27\x0e\xe0\xa0\x7e\x40\xeb\xef\x0e\x80\xe6\x1d\x27\xde\x1c\x5e\xa6\x1a\x17\xdf\xd4\xaf\x93\xb2\x57\xb6\xe7\xe1\x21\x35\x26\x2c\xf4\x84\x44\xd7\x0e\xdf\x97\x54\xfb\x00\x75\xda\xcc\x06\xda\x12\x0c\xe2\xe0\x0e\xf0\x09\x8a\xd5\xc8\xcc\xfe\xba\xe0\x7e\xb8\xfa\x82\xf7\x25\x86\xe6\xa4\x7f\xbf\x01\xab\xc2\x41\x57\x6b\x87\x1a\xa3\xbc\xf4\x55\xe8\x38\x0b\x88\x83\x3b\x40\x7d\xd8\xfb\xd0\x3b\x76\x26\xef\xb0\x30\xc8\xdc\x6f\x4a\xf7\xdd\xa6\x71\x5d\xfd\xd2\x37\x14\x52\xe5\x77\xdb\x6e\x9e\x81\x2c\xf7\x11\x75\x41\x1c\xdc\x81\xa3\xf2\x35\x73\x37\x21\xc6\x28\x2f\x06\xb4\x92\x2e\x95\xf6\x8e\xbb\x8c\xa1\x43\xf4\xb9\x47\xf5\xec\x85\x24\x3e\x54\x24\xba\xd0\x3f\x06\x41\x1c\xfc\xf3\x3d\x7b\xd5\x4a\x5d\x00\xbd\x3d\xf3\xaa\x94\xf0\x86\x4d\xcd\x15\xb7\x2b\xa3\xa8\xb9\xba\x7e\x12\x5f\xc2\xa6\x67\x71\xf6\x50\x83\xa0\x9d\x21\x20\x0e\xea\x07\x00\x41\x18\x14\xa2\x4e\x0e\xc2\x4b\x1e\xd9\x03\x67\xc4\x6c\x2c\x03\x1f\xcf\xbe\xda\xd6\xeb\x0d\xbf\x6f\xc9\x77\xff\x5e\x7d\x98\x5e\x76\x2d\x25\x2b\xda\xde\x21\x01\x22\x54\x82\x38\xe4\x20\xec\x2a\x5a\xf1\x75\xad\xb2\xf3\x67\xf0\xd5\xfb\x77\xb7\xa8\x0a\xbb\x3d\x78\x51\x27\xfd\x43\x15\x78\x32\x0f\x1d\xd7\xa5\x25\x05\x59\x10\x95\x41\x1c\x72\x10\xde\xeb\x22\x98\xf3\x1a\x1f\xe9\xcc\x71\x79\x70\x37\x4c\x7f\xc5\xbe\x48\xdd\x62\xfb\xf5\x7a\x17\xaa\x95\x45\xc0\xb7\xf8\x97\xce\xd0\x5a\x33\x88\xf3\x94\x41\x41\x41\xfd\xe7\x3f\x87\xfe\xed\x3b\xc2\x09\xd2\xa2\xaf\x6d\xd4\xbd\xbe\xec\xab\xb3\x19\xa5\x73\xef\xc6\x88\xd8\x65\x78\x1b\x25\xa1\x5f\x9b\x7d\x95\xb4\x25\xcf\x75\x61\xe7\xcf\x20\x8c\xbe\x7c\xf8\x96\xea\x35\x46\xee\xf0\x79\xaf\x57\xde\x92\xd5\x31\x5c\xfe\x64\x16\x11\xee\x84\x0e\xd8\x95\x31\x86\xcc\x02\x33\xef\xfe\x40\x6b\xe6\x5e\xb7\x27\xf4\x77\xed\x35\xce\x7f\xcc\xd4\x0c\xb0\x1d\xf7\xbe\xf2\x5b\xe2\x2a\xe6\xdb\xf0\xd9\x4f\x63\xed\x25\xf2\x91\xa2\xff\xb5\x20\x0c\x6a\xda\x9f\x67\x84\x91\x82\x30\x03\x8a\x73\x9c\xed\x6d\xd9\x36\xd4\x52\xf3\xe3\x58\x33\x77\xc7\x1c\xa1\x96\xec\x8e\x6a\x19\x51\xa1\x33\x7b\x77\xd6\x69\x13\x4e\x65\x45\x58\x12\x39\x08\xdf\x7f\xed\x55\xc9\xb5\x62\xf0\x78\xb1\x4a\x98\x10\x7f\x7d\x4b\xa7\x29\x8a\xf2\x6e\x93\x7b\x11\x66\x4d\xca\xf9\xfe\x07\x0d\x3b\x6d\xa7\xb2\x34\x8b\x1c\x84\x25\x3a\x1e\xc9\xfb\x95\xd0\x2d\xf4\x7d\x13\x41\x29\xac\x64\x4d\x9f\x5e\x8b\x6d\x2d\x1b\x6b\x59\x50\xea\x4f\x51\x0d\x67\xa4\x38\x9d\x13\xd1\xc8\x41\x58\x8d\x34\xf9\xca\x85\xdb\xc2\x86\xe9\xb2\x2b\x8a\x4d\x8a\x77\xdd\x8f\xd7\x45\x5e\xb6\x51\xa2\x68\x8a\xca\x5e\xa6\x9f\x6f\x28\xc4\x3a\x95\xd6\x22\x07\x61\x95\x18\x19\x0f\x4e\x5f\x34\xc9\x90\x7a\x0b\x4f\x22\xb7\x90\xbe\x29\x52\xe3\x28\xbf\xdd\xc1\xb2\x37\x2e\x06\x58\x14\x1d\xbd\xcc\xa7\x16\x84\x41\x12\x9d\x38\x03\x1e\xdb\x13\x2b\x2a\x99\x0f\x9a\x64\xe7\x96\x8c\x24\xc7\xe9\x67\xb5\x8e\xc7\x5d\xa0\x5c\xfc\x60\x78\xcc\xda\x70\x55\x5d\x0c\x05\x9a\x01\x03\x38\xf8\xc8\x47\xfa\x60\x33\x7d\x7f\x93\xe8\xe5\xb3\xd0\x8b\x28\x87\x57\x76\x62\xc2\xc5\x0f\xae\xc4\xe8\x93\xad\x31\x9f\x4f\x25\xe4\x5c\x73\xfc\xdf\x0a\x2b\x80\x83\x8f\x7c\xe8\x0c\x5a\xf1\x86\x3e\x4e\xe2\x94\x1e\x93\xa2\x45\x45\x7b\xb6\x1f\xc5\x25\x6a\x8a\xa9\xbe\x34\xd0\xee\x5c\x5d\x32\xf1\xfc\x61\x0b\x2d\x5d\x01\x38\xf8\xc8\xc7\xb7\x5a\xc7\x91\xc5\xf5\xf1\xe7\x0f\xa5\x98\xa9\xa0\xa0\xe6\x0b\xb7\xcb\x2f\x46\x5a\x72\x8f\x5b\x75\x61\x47\x76\x7e\xad\xb7\x53\x80\x46\x6a\x00\x07\xbf\x7e\xf2\xeb\xbb\x9c\xa2\xb2\xb7\x2f\xd7\x69\xf1\xae\x52\xa7\x2d\xfc\x38\x3b\xc6\x4c\xb8\x4e\xfd\xa5\xc4\x3f\xe5\xc5\xae\x78\x59\x45\x5e\x15\x22\x08\x83\x38\xe8\x8c\xf0\xdf\x83\x30\xe8\x0b\x7d\x92\x02\x1f\xd1\x4b\xef\x39\x2a\xa7\x49\xf5\x1d\x4f\x92\xe7\xf7\x73\xf8\x84\xd3\x46\x31\xe0\x5f\x33\x73\x50\xc4\xaf\xa2\xd7\x26\x90\x84\xee\x1f\x03\x71\x70\x05\xf0\x2f\xa3\xda\x66\x5e\x2d\x31\x4e\x0b\x3d\xff\xf8\x27\xbf\xcb\xdd\xb7\x12\xef\x89\xdb\xa8\xe8\x36\x87\x5d\xcf\x7c\x31\xcb\x4f\x84\x56\xed\x40\x1c\x5c\x81\xbb\x68\xa3\xef\xde\x34\x3d\x99\x60\x10\xb2\x38\x3a\xdf\x45\xc4\xe6\x17\x5c\xca\x80\xf9\x34\xf1\x48\xca\x65\x34\xdd\xb2\xa9\x0d\x5a\xb9\x05\x71\x70\x05\x46\x63\xe5\x8e\x64\xc8\x31\xcd\x54\x2b\x78\x9a\x42\xf3\xb1\xfd\x67\xfb\x15\xee\x3c\xd1\xbf\x85\xc5\x11\x7a\x47\x24\xaf\xf3\x1e\xb4\xc2\x04\xe2\xe0\x0a\x8c\x05\x30\x8a\xf9\x47\xa8\x08\x75\xa8\xe1\x54\xb6\xbf\xe4\xe6\x69\x3f\xe6\xc2\xcc\x43\x11\x6d\x45\xcf\x69\xdc\x8a\xdb\x52\x26\x47\x4c\x7e\x40\x1c\x74\x36\x10\x10\x84\x41\xbd\xeb\x49\x0e\x44\x4b\x3e\x52\x56\xbc\x85\x89\xfe\x4b\xe2\x0c\x51\x54\x00\x2b\x47\xea\x0c\x6a\x77\x73\xe3\xf4\x85\xd2\x2b\x6a\x6b\x5e\x49\x2a\x50\x37\x00\xe2\xe0\x0e\xdc\x17\x46\x31\x9a\x7e\x92\x82\xe7\x52\x60\x17\xdf\x30\xa6\x3c\xa3\x91\x3f\xc8\x39\xcd\xb9\x46\x77\x6c\xd0\x51\x37\x78\xe6\xbc\x20\xa2\x2e\x88\x43\x3a\x27\xde\x30\x74\x77\x4a\xe9\xb3\xca\xc6\xb3\xfe\xbb\x39\x5b\x98\x28\xe5\xbc\x95\xcf\xcf\xd1\xbd\x15\x11\xe8\x62\xd9\xa4\xdd\x5e\x82\x6e\x24\x07\x71\x70\x07\x3c\x07\x22\xa2\xcb\x30\xda\x3e\xbb\xf9\x2e\xdc\x4a\x08\xb8\x1e\x95\x4d\xa8\x93\xbc\xdf\xeb\xe9\xc7\xfa\xac\x6f\xf5\x0e\x27\x46\x31\x74\x56\x1a\xc0\xc1\x1d\xc8\x4d\xf8\xf2\xfd\xad\xde\x26\x2a\x67\x3f\x45\x49\xb8\x16\xc7\xf5\xbe\xb8\xb3\xa2\x0f\x9f\xbf\x9e\xf8\xed\xb2\xa8\xa4\x9d\x43\xd4\x87\x70\x00\xc4\x41\x67\x03\x01\x41\x18\x34\xd4\x9d\x78\x5d\x84\x8d\xf7\x97\xe1\x1f\x37\x68\xdc\x84\x12\xa7\x27\xab\xba\x82\x0f\xcf\x1c\x15\xaa\x4e\x60\x6a\xcd\xa1\xe0\x08\x44\x6c\x1a\x0d\x40\xd7\x45\x00\x38\xb8\x03\xfc\x5b\x13\x5e\x67\x68\xe8\xe3\xb0\x83\x24\x26\x02\x57\x1a\x27\x18\xfc\xe2\x36\x5e\x8c\xc8\xe5\x57\xc7\x4d\x62\x95\x16\xbe\x80\x56\xed\x40\x1c\xdc\x81\xbe\x4c\x15\x7e\xfb\xed\xc4\xc3\x9f\xc2\x86\xd6\x57\x9e\xa4\xb3\x90\x72\x6d\xe4\x59\x8a\xf1\x46\x19\x69\xef\x8e\x9e\xa9\x5d\x8f\x86\xee\x63\x04\x70\x48\x41\x98\x58\x27\x89\x4b\x24\xe0\x32\xb6\xc6\x1b\x6c\xf4\xf8\x8b\x98\x49\x91\x21\xb3\x91\x43\x6e\xb2\xd6\x95\x4a\xee\xbd\x41\xe1\xc1\x50\x10\x06\x70\x70\x07\x76\x83\x13\x1c\xcb\x2c\xbd\x85\xbe\x30\x5a\x1b\x96\x19\x12\x4b\xb9\xdf\xad\x23\x0a\xe1\x6a\x0d\x50\xaa\xe1\xd4\xc7\xb7\x8f\xfc\x8c\x70\x00\xc4\x41\xfd\x00\x20\x08\x83\xe6\x1d\x27\x39\x10\xaf\x42\xf8\x0b\x5d\x58\xf5\x59\x98\xb5\x56\xbe\x72\x6d\xc9\x62\xc2\xac\x0d\x3f\x07\xf5\x2e\x8a\x13\x9f\x8f\x54\x42\x06\xf3\x05\x44\xdb\x41\x1c\xdc\x81\xac\x77\x2f\x8c\x71\xdb\x73\xf0\x37\xeb\xed\x5f\x25\x57\xec\x99\xbe\x63\xa1\x58\x7e\x9f\x83\xc9\xe0\xa9\xf7\xda\xcf\xba\x83\x03\x7a\xe6\x08\xc4\x21\xbd\xa6\x78\x21\x45\x22\xd8\x48\x11\xd7\x38\xa4\xc2\x0c\xef\x56\xe3\xa4\xd8\x77\x9c\xb7\x41\xe7\x2d\x03\xbe\x54\x97\xba\x96\xe6\xbe\x3c\x8f\xa8\x0b\xe2\xe0\x0e\xe4\x17\x24\x10\xe3\x71\x47\x54\x6f\x6b\x5a\xf6\xbe\xa6\x7b\x68\x2b\xe5\xdb\x9f\xfd\x76\x2b\xed\x71\x83\xa0\x69\x75\xad\x1e\x1a\x74\x5c\x08\xc4\xc1\x1d\x78\x7c\x86\x34\xbe\x99\xbe\xc5\x80\x2a\x8d\x2a\x99\x47\x89\xb4\xdb\xad\xb2\x51\xaa\x22\xfa\xb2\x96\x05\xab\x3f\x9b\xb6\x5c\xb6\x03\xc2\x01\x10\x07\xf5\x03\x80\x20\x0c\x0a\x51\x27\x07\x61\xe9\x34\x4c\xcb\xf4\xb9\xc9\x74\xde\xc9\xe4\x98\x64\x61\x21\x47\x2b\x6b\x33\x21\x9f\x54\xa7\x87\x49\x4a\xf5\xcf\x55\xef\xc4\xb3\x23\x42\x25\x88\x43\x0e\xc2\x78\x1a\xd7\xd7\x1d\xf7\x55\x31\xa4\x18\x8f\x94\xef\x5e\xcf\x19\xda\x93\x64\x2b\xd3\x16\x5f\x4e\x63\xcb\x7a\x90\xa8\x67\x16\xa7\x8b\xa8\x0c\xe2\x90\x83\x30\xa7\x4a\xe4\xf2\x95\x5f\xad\x83\xa1\xbd\x1a\x16\x16\xe3\xee\xe1\xe4\x97\xd2\x7e\x2a\x88\x33\x2b\xee\xa2\xbe\x68\x6e\x0d\x51\xe2\x45\x54\x06\x71\xff\x17\x84\xff\x79\xc1\xd9\xbf\x7e\x47\xb8\x0c\xbd\xee\x23\x8d\x8a\xa7\x2c\x56\x67\x4a\x65\x5f\x4b\xed\x6e\x18\xda\xe0\xf0\xce\xe2\xf7\x25\xf4\x91\xc0\xbd\x06\x7d\xf3\x9f\x7f\x06\x61\x8d\xb6\xc5\x20\x6c\xf3\xd9\x88\x40\x72\xc9\x65\x14\xc6\x02\x97\xb8\x7a\x9c\x6f\xed\xa5\x75\x92\x97\x66\x6e\x08\x0c\x7e\x60\xb2\xff\x03\x4d\xe6\xa9\xef\x78\xcc\x3c\x18\x2b\x43\xa9\x50\xd0\xe9\xf2\xb5\x46\x88\xd1\x96\xaa\xd5\xd2\x8a\xfc\x4a\xbd\x47\xf9\x76\x7c\x71\xd8\x7f\x2d\x08\x83\x9a\xf6\xe7\x19\x61\x79\x78\x58\xb2\xdb\x97\xb3\xb4\xb6\xc5\x65\x17\xb2\xc6\x4a\x8a\xd0\xf1\xbb\x73\xbe\x35\x8c\xca\x0f\xff\x5a\x5f\xb1\x0d\x16\xc5\xc7\x8d\xed\x53\x79\xd0\xd7\x0d\x39\x08\x8b\x3a\x3e\x2b\xcf\xb9\x54\x2f\x18\x13\x20\xcb\xfc\xd4\x73\xea\x11\x91\x8d\x49\x6c\x4a\x5e\xcc\x1b\x0a\xd5\xc0\x0f\x35\x66\x11\xa7\x72\x6b\x15\x8a\x04\xd2\x8f\x65\x18\x26\xd5\x94\xf0\x11\xc8\x24\x41\x6d\x42\xa1\x4f\xa7\x0c\x7b\x65\x82\x29\x56\xc5\x22\xd0\xeb\x62\x44\xda\xf4\x2a\x42\x63\xf5\x54\x5a\x8b\x1c\x84\x67\xdd\xc9\x32\xe3\x95\x6e\x7b\x8f\xe6\x1b\xdb\x2f\x62\x8e\x9a\xc6\x64\x34\x58\x1f\xbd\x7a\xa7\x3b\x71\xe3\xa1\x05\xfa\xd4\xc4\xf9\x53\x69\xad\x03\xd2\x8f\xfd\x56\xdc\x5f\xf9\x79\x38\x7e\x42\x04\x2d\x22\x5a\x30\xc0\x24\xed\x4c\xe4\xf5\x21\x8a\x71\x53\xe7\x7a\x61\x42\xf5\xc0\xe6\x8a\x90\x53\x0b\xc2\x20\x89\x4e\x1a\xf9\xd8\x97\x76\x4d\x2a\x55\x85\x06\xf8\x1f\x75\x11\xb9\x7f\x7a\x6a\xa3\xd9\x5c\xd5\xe3\xf4\x22\x4c\xf2\x9c\xf9\x87\x57\x35\x0a\x8b\x50\x5a\x01\x71\x48\x4b\x41\x6d\xbb\xda\xf5\x2f\x96\xcc\xa8\x2d\x98\x1c\x7b\x4a\x13\x62\xcf\x29\xb2\xe2\x33\x34\x60\xa4\x0a\xe1\x49\xeb\x3e\x8e\x6b\x80\x56\x6e\x41\x1c\x7c\xe4\xdb\xa4\x90\x57\xb9\x25\x3d\x6b\xa0\xdf\xc0\xf0\xd4\xec\x4b\x7f\x46\xc4\x38\x96\x3f\xdd\xe5\xbe\x7c\x8d\xab\xa3\x06\xe4\x93\x3e\x37\xa1\x15\x6c\x00\x07\x1f\xf9\xbe\x73\xd3\x9c\x1f\x7f\x56\x73\x90\xe8\xc6\x5c\x6b\x2e\x77\xd6\xe4\x72\x9f\x64\x30\x09\x27\xc7\x8b\xb0\xa3\xa9\xf9\x2c\x5f\x31\x15\x44\x5d\x10\xe7\x29\x85\x82\xfa\x8f\x65\x00\xcd\x73\xc1\xbf\xd3\x5e\xee\x67\x45\x35\x18\x4e\xff\x78\xfd\x70\x59\xb0\xbd\x08\x45\x66\xc6\x73\xfa\x15\xba\xbe\x79\x39\xfe\x45\x44\x10\x06\x71\xd0\x19\x61\xf9\xbf\x4e\x7e\x40\x5f\xe8\x93\x14\x48\x88\x63\xdb\x79\x6d\x39\xb6\x72\xcd\x5a\xe9\x22\x57\x44\xba\x48\xe8\x80\xf1\x5d\xea\x7e\x0b\xf5\x33\x1f\x0b\xef\xdc\xfc\xfd\x16\x5a\x09\x02\x71\x70\x05\x78\x1d\xd6\xb6\x54\x74\x9a\x43\x77\x74\xc4\x6b\xdf\x4d\x63\x6e\x58\x87\x37\xeb\x61\xb0\x78\x17\xbf\x11\xbe\x78\xa6\x5d\xe6\x7f\x67\xed\x40\x1c\x5c\x81\x17\x19\x91\x2f\x7a\xbe\x6d\xa2\x2b\x2a\x3e\xfb\xf5\x34\x4b\xfc\xfe\x40\xd2\x38\x61\x93\xd1\x8b\x73\x92\x28\x84\x55\x53\xa4\x2d\x15\x88\xba\x20\x0e\xae\xc0\xef\x8d\xd7\x18\x33\x17\x08\xdc\x5a\x6f\x9a\x33\xe6\x93\x74\x2a\x8b\xfc\x14\xc8\x9e\xa1\xb4\x9b\x57\x64\xfa\x80\xd3\x88\xad\x0b\xbd\x77\x0a\xe2\xe0\x0a\xa8\x5c\x35\x9c\xa5\xc1\x5b\x46\x61\x29\xdf\x16\x79\x2a\x83\x72\x45\x8a\x56\x6e\x8c\xa9\x21\xbb\x2a\xd6\xdc\xbb\xec\x93\xb8\xef\x03\xc4\xe4\x07\xc4\x41\x67\x03\x01\x41\x18\xd4\xbb\x9e\xe4\xc0\xa4\x2f\xb3\x99\xe9\x19\x15\x49\xf1\x82\xfc\x04\x2b\x02\xe1\x6b\xf1\xb5\xce\x2a\x84\xb7\x8e\xa7\xc6\x92\xb4\xe8\xac\x5d\xb3\xa7\xa1\xd5\x35\x00\x07\x77\xc0\x79\xd9\xb0\x7d\xc4\x52\xc5\x5e\xe5\x43\x68\x95\x3f\x4d\x81\x35\xfe\x63\x51\x2b\x5b\x49\xaf\xcb\x59\xb8\x19\x9f\x6e\xd3\xd7\xf5\x22\xea\x82\x38\xb8\x03\xf3\x79\x55\x0c\x9e\x1a\xca\x16\xec\x37\x51\xc4\x32\x49\x57\x1c\x59\xc8\xca\x04\x8c\xdf\x3c\x35\x4e\x92\x63\xae\x5a\x62\x8b\x80\xba\x01\x10\x07\x77\xe0\xba\x68\x8a\xaf\xd5\xb4\xb5\xce\xce\xd5\x48\x0b\xc7\x8d\xf3\xc4\x53\xde\x9c\x94\x58\x47\x12\xe5\xd4\x8a\x91\x49\xbe\xc6\x84\xff\x7b\xfe\x1c\xc0\xc1\x1d\x60\x7b\x21\x5b\x9e\xf8\x3b\x3d\xf2\x1c\x7a\xb9\x8b\xac\x16\xd6\xb8\x4c\x50\x25\xd1\xd7\x45\x9f\xbc\xe7\x5e\x86\xda\x4a\x15\x77\x1d\x11\x0e\x80\x38\xe8\x6c\xa0\xc4\xdf\x1d\x00\x0d\x75\x27\x39\xa0\x83\x77\xf4\x91\xb3\x25\x2f\x6d\x17\x73\xcf\x6d\x34\x74\x32\x75\x3e\x1c\x63\xa2\x25\xd6\xee\x4b\xcd\x95\xe6\x4b\xba\x58\x67\x82\xa0\x5b\xde\x01\x1c\xdc\x01\x5b\xfd\xeb\x54\x29\xad\x6e\xc2\x45\xaf\x9a\x23\xc2\xa4\x6a\xce\x15\x39\xfe\xb2\x12\xcb\x28\x23\xe1\xbe\x76\x7d\xf6\x35\x26\x3b\x74\x51\x12\x88\x83\x3b\x20\xc7\xac\xfc\xdd\x80\x8e\x6b\xe3\x9b\x46\x57\x2f\x81\x8a\xe4\xd5\xdf\xe1\x6d\xa3\x4d\x7b\xe9\xe2\x5d\x0c\x6c\xb2\x4f\x1e\xd1\x42\xe7\x4e\x41\x1c\xdc\x81\x34\xc9\xb9\xab\x41\x89\xcb\xc9\x16\xa4\xad\x76\x4f\xb0\x6c\x3d\xb3\x76\x8a\xef\x78\x1f\x5c\x2c\xed\xe4\x3f\x7f\xe7\x7d\x59\x3c\x2e\x74\xbd\x05\x80\x83\x3b\x60\x79\xe1\xb9\xb0\xa7\x94\xe8\x04\x6e\x5e\xf5\xc2\xb1\xee\x34\xe3\x03\x8e\x2a\x8e\x46\x27\x83\x3a\x4f\x4e\x8c\x65\xd9\x99\x4f\x9d\x08\x07\x40\x1c\xd4\x0f\x00\x82\x30\x68\xde\x71\x92\x03\xac\xe3\x75\x94\x56\x95\x6f\x5a\xc8\xb9\xbb\xb6\x6e\x5e\x3b\x6b\x30\x38\xfa\xe4\xbe\xa7\xc9\xda\x8a\x29\xd7\xc2\x87\xfe\x6e\x1c\xe8\x9e\x04\x10\x07\x77\x80\xc1\xac\x42\x1e\x85\x24\x57\x99\x9a\xfe\x68\x26\x82\x4b\xad\x98\x51\xc8\x65\x70\x5d\x45\x40\x28\x43\xe9\x83\x89\xd8\x0d\xfb\x46\x68\xb7\x01\x80\x83\x3b\x60\x18\x58\x26\x62\xed\xf4\x63\x26\x84\xdc\x2c\xb8\x3f\x6f\x40\x62\xa0\xad\xc8\x3b\xce\x52\xd5\xb9\xa9\xeb\x13\x85\x6b\xfc\x0e\xd4\x0f\x80\x38\xb8\x03\xa5\x83\x56\x84\xce\xd4\xac\x61\x12\xde\x01\xb4\x5e\xc7\xb7\x9f\x11\xc5\x0a\x59\x85\x1f\x7f\x65\xbb\x56\x30\xa2\x34\xb1\x33\x0d\xfd\xbe\x20\x0e\xee\x40\x69\x69\x08\x6d\xf5\xdd\x07\x2f\x2b\xcd\xde\x39\x38\xee\x25\x7f\x27\x70\xb0\x21\x0a\xfc\x76\x1d\x53\xd3\x70\x48\xf4\x36\xfd\x0b\x3a\x84\x03\x20\x0e\xea\x07\x1c\xfe\x1e\x84\x41\x21\xea\xe4\x20\xcc\xf3\xd8\xbb\x5f\x53\x67\x91\xe4\xec\x01\xed\x39\xcc\xef\x35\x37\x30\x1c\x5c\x16\xad\xc7\x18\x7c\x85\xd5\xad\x29\x93\x70\xc7\xb5\x10\xa1\x12\xc4\x21\x07\x61\x29\xed\x85\xc5\xc6\xfb\x74\xbe\x5f\x97\x87\x9c\x7a\x55\x0b\x94\x6a\xc8\x0a\x50\x71\x3c\x24\xfc\x4b\x26\xd3\xc2\x65\xae\x3a\x44\x21\x2a\x83\x38\xe4\x20\x3c\x3e\x44\x4f\xc4\xf5\x4b\x86\x84\x71\x81\xf3\x80\xe1\x5c\xaf\x7a\x2d\xdf\x40\x93\x49\x78\xcf\xc3\xa9\x96\x64\x9b\xf4\x16\x63\x37\x44\x65\x10\xf7\x7f\x41\xf8\x9f\xff\xbc\xf8\xd7\xef\x08\xcf\x3e\x51\x7f\x89\xd9\x34\x52\xb0\x42\x24\xbf\x2e\x8f\xb1\xd7\x63\xe9\xb1\x56\xbd\xf4\xf9\xfb\xc3\xaa\x45\x5b\x63\x93\x4d\x8f\x7f\x04\xe1\x91\xd6\x60\x5e\x49\x72\xd3\xc9\x1f\xd2\xb3\x2b\x19\x05\xf2\xae\x0a\x77\xba\x24\x1d\x98\xb6\x16\x45\x4c\x76\x7b\xc3\xf7\xd1\xfe\xdc\x26\xba\x35\xb2\xe4\x93\x32\xfa\x5e\x1b\x83\xf0\xb1\x49\x51\xcb\xcc\x92\x6b\xd9\xf8\x4a\xf5\xf1\x22\x23\xbe\x66\x4b\x3f\xfb\xb7\xc3\xf0\xff\x5a\x10\x06\x35\xed\xcf\x33\xc2\x48\x41\xf8\xfb\xcf\x24\xec\xbb\x71\x46\x5d\xf3\x66\x01\x47\x21\x06\x2a\x68\x57\x7a\x94\x13\x1a\x04\xd3\x69\x3e\x94\xd4\xf6\x6f\xf1\x55\x3d\x38\x95\xc5\x4a\xe4\x20\xdc\x7b\x51\x1c\x05\x9f\x82\xc8\x5b\x8f\x2a\xdf\xca\xe5\x2e\xb9\xd1\xf2\x68\x1a\x8f\xbd\xdc\x8d\xf1\xaa\xb6\xdf\x37\xf5\x2d\x48\x16\x4e\x65\x69\x16\x39\x08\xdf\x0b\x6f\xbd\xeb\x5a\x5f\x64\x5f\x24\x38\x55\x79\xbe\xea\x7e\x8f\xd9\x86\xa9\xb0\x1f\xf5\x45\xac\x8c\x5b\xcd\xe7\x22\xf0\xf7\x1b\x4f\xa5\xb5\xc8\x41\x38\x5e\x2c\x48\xf2\x42\xba\x21\xa7\x60\xc3\x6d\x81\xdb\x1f\xb2\xac\xd2\xed\x2e\x0b\xf8\xb0\x7a\x0c\xb6\xe5\xe2\xed\xf6\x99\x99\xbf\x38\x95\xd6\x22\x07\xe1\x64\x5b\x7c\x07\x77\xdb\xb3\xfe\x06\x6d\x9c\xb9\x2c\x63\x0e\xc6\xd8\x49\x8c\x9c\x3f\x6a\x93\xe4\x98\x08\x07\xaa\x0b\x76\xe9\x22\x4e\x2d\x08\x83\x24\x3a\xf1\x60\x18\xe1\x99\xb6\x27\x75\xc5\xd4\xfa\x12\x53\xdc\x5a\x7d\xb7\xab\xfa\x78\xde\xb0\xdd\xe2\x18\xe5\x2a\x3c\xf7\x90\x80\x6f\x5f\x68\x0b\x3a\x18\x06\xe0\xe0\x23\x1f\xed\xfa\xab\xca\xaf\x13\x26\xf1\xcd\x2f\xd2\x8c\x78\x1c\xac\xd5\x0d\xac\x30\x26\xd5\x25\x9f\x5d\x1c\x4f\xb4\xb8\xfc\xf9\xeb\xe1\x55\x44\x5d\x10\x07\x1f\xf9\x16\x25\x59\x69\xef\xa2\xe5\x15\x34\x50\x1c\xd2\xa9\xfe\x60\x4f\x98\x34\xd2\xa2\xe6\xbc\x5f\x18\x1b\xcc\xb3\x50\x70\x0d\x4d\x1c\x7a\x3b\x07\xc4\xc1\x47\xbe\x2f\x3f\xd3\x7e\x64\x0e\x48\xc7\x8e\xb7\xfd\x66\x25\x24\xdf\xcf\x31\xec\xf1\x51\x1f\x28\x9c\x50\xec\x8b\x19\x62\x52\xae\x6c\x39\x42\xd4\x05\x71\x9e\x52\x28\xc4\xff\x98\x55\x99\x08\x59\x1e\xe2\xd2\xa3\x4b\x5d\x4f\xbb\xcc\xd1\x44\xbd\x31\x5c\xf3\x7d\xc9\xcf\x9d\xef\x40\x44\x68\xe0\xe9\x4c\x92\xb7\x15\x22\x08\x83\x38\xe8\x8c\xf0\xdf\x83\x30\xe8\x0b\x7d\x92\x02\xdc\x8a\x1a\xe6\x81\xca\x4a\x76\x5b\x84\x81\xfd\xf9\xe3\x63\x7a\x7e\xe2\x8f\xef\x97\x9d\xa1\xd6\xf9\xdc\xe2\xc3\xda\xa2\x90\x62\x8a\x68\x3a\x88\x83\x2b\x30\x71\xcd\x52\x91\xbb\x5d\xb7\xed\x87\x62\x12\x5f\xf6\xa6\xcb\xa1\xb3\x04\x6a\xc3\xa5\x10\xc2\x1e\x13\x34\xb3\xec\xee\x06\x2f\xe8\x9c\x15\x88\x83\x2b\xb0\xe7\xf0\xfd\x96\xc9\x8f\x99\x5f\x3c\x0f\x33\x9f\xbb\x8c\xd5\x5a\x7c\xc3\xd0\xc4\xdf\xd7\x48\xec\xa5\xb3\x34\xb3\xa8\x8c\x7e\x2e\x8e\xa8\x0b\xe2\xe0\x0a\xd0\x2d\x32\xe7\xb3\xad\x1e\x56\x1c\xed\x30\x4e\x3d\xf8\xd0\x13\x9a\x8e\xad\x54\x96\x19\xe5\x4d\x79\x91\xae\xa4\xf7\x4e\x08\x33\xb4\x6a\x01\xe2\xe0\x0a\x04\xfe\xaa\x73\xca\x0e\x53\x57\x2b\xf6\x54\x28\x37\xff\xf4\xb1\xd9\x6d\x45\x10\xf5\x16\xf9\xe5\x36\xa9\xab\x66\x5b\x1e\x47\x86\xa8\x88\xc9\x0f\x88\x83\xce\x06\x02\x82\x30\xa8\x77\x3d\xc9\x01\x73\x8b\x74\x8f\x35\xd6\x92\x08\x03\x34\x94\x24\x1a\x54\x92\xb8\xaa\x47\x5a\x76\x2c\x47\x82\x18\x44\xfe\x1c\xed\xbe\x76\x42\xd0\x25\x51\x20\x0e\xee\xc0\xd1\x03\x9a\xc6\xc1\x14\xfd\x1d\xa1\x37\xd9\x37\x8d\x5b\x23\x36\xce\x0b\xe7\x07\x2a\x91\x75\xf2\x5a\x86\x36\xca\xa9\x7e\xd3\xfd\x08\x6d\x31\x04\x70\x70\x07\xac\xba\x39\xc3\x4b\x3b\x1e\xf6\xb7\xbd\x1e\x1f\xb8\xf4\xf6\xac\x18\xe6\x5b\x83\x27\x5d\x47\x36\xd4\xfc\xd1\x2c\xe2\xd3\x85\xaa\xd0\x33\xe5\x20\x0e\xee\x00\x7e\x05\xf9\xd9\x89\x3e\x69\x5e\x54\x13\xe7\xb7\xa2\x1b\x59\x1b\x04\x28\xd9\x1a\xac\x1c\xa2\x6d\x3f\x9c\x1f\xe6\x44\x4f\xdd\x33\x86\x76\x31\x00\x38\xb8\x03\x54\xe7\xf2\x98\x23\x6e\x0e\x17\xd8\x5e\x25\xe1\x10\xc8\x5e\xe5\xeb\x65\x23\xc6\xdc\xcc\xe0\xf2\x24\x60\x4c\xc6\x18\xca\xc0\x81\x1c\x00\x71\xd0\xd9\x40\x40\x10\x06\x0d\x75\x27\x39\x10\xf1\xb6\x4b\x26\x7e\x9b\x8d\xeb\xd8\x54\x40\x20\xe9\x97\x40\x0d\x89\x8f\xfe\x26\x9b\x26\xf6\x17\x96\x70\x4d\x4e\xf2\x71\x71\xe8\x52\x2b\x10\x07\x77\xe0\x72\x5e\x91\xf5\x8f\x05\x15\xb3\xca\x47\x0a\x49\xbe\x0a\x83\xd4\xc2\x65\x1d\x01\xdd\x3e\x49\x11\x1d\x3f\x7c\xe8\x75\xee\x6d\x41\x61\x05\xc4\xc1\x1d\xe0\x4c\x7d\x75\xd3\xe6\x9c\x8f\xd9\x8d\xa6\x80\x88\x3e\x12\x03\xc9\xdb\x1f\xd0\x2c\x09\x92\x3d\xe4\x5f\x4c\xfc\x50\xcc\xeb\x79\x4d\x88\xa8\x0b\xe2\xe0\x0e\xd4\x0c\xa6\x2b\x3d\xbd\x43\x76\x1e\x9f\x60\xe0\xbd\x2c\xde\xe0\x19\x15\x83\xcf\xcf\x96\x33\xba\x82\x9a\x50\xcb\x9d\x6d\xdc\xaf\x41\xcf\x27\x81\x38\xb8\x03\x6e\xac\x62\x43\xc1\x43\xa3\x12\xf4\x87\x6b\x6d\x62\x5d\xfd\x1e\x2e\xfa\xbc\xef\x92\xdd\x55\x3d\xb7\x5c\x2e\xd3\x07\xf3\xbb\x43\x97\xe6\x81\x38\xa8\x1f\x00\x04\x61\xd0\xbc\xe3\x24\x07\x62\x89\xb4\xf4\x0c\x6a\x95\x7f\x0c\x7a\xb7\xf3\x18\xa6\x3d\x5a\xee\x11\x77\xf2\x42\xe1\xe7\xb8\x4c\xe6\xe2\xa4\x24\x64\x4d\x1a\x83\x68\x3b\x88\x83\x3b\x50\x90\xce\x40\xa1\x81\xa2\xd1\x58\x20\x68\x61\xca\x10\x64\xb3\x3b\x48\x2b\x8c\x46\xe3\x64\xde\xa4\x4d\x6e\x30\x27\x6c\xdd\xe3\x85\xa8\x0b\xe2\xe0\x0e\x88\x12\xa7\x6c\xba\x7a\x17\x49\xdd\x90\xa2\xaf\xff\x2e\x52\xdc\x2b\x8f\x23\x82\xe3\x7f\xd6\xa1\xb2\x75\xad\x4c\x54\x52\xcf\xe3\x25\xa2\x2e\x88\x83\x3b\xf0\xac\x3b\xc7\xb2\xb8\xbc\xe7\x5a\xa6\xf7\x51\x49\x20\x0e\x6e\x40\xda\x48\xb7\xf0\x3b\xb9\x8c\x88\xf6\xec\xca\xb4\x7b\x59\xb7\xa0\xfe\x05\xc4\xc1\x1d\xf0\x59\x1d\xc8\x33\x46\x8b\x71\xb2\xec\x50\x28\xbd\xaa\x4d\xe8\x3e\xc4\x88\x2e\xd5\xa8\xd0\x32\xec\xf1\x68\x6d\xaa\x43\x79\x53\x17\xe1\x00\x88\x83\xfa\x01\x40\x10\x06\x85\xa8\x93\x83\x70\xdb\x12\x35\x6b\xb8\xa3\x30\x43\x5a\x57\x86\xee\xfd\xef\xbc\x22\xa5\x8a\x35\x0b\xa1\x24\x3f\x62\x43\x2b\x78\x64\x06\x25\x77\xab\x10\xa1\x12\xc4\x21\x07\xe1\x50\xfa\xd0\xa8\x50\xc2\x67\xcd\xf2\x2b\xd2\xb8\x24\x5f\x8a\xed\xce\xbd\x78\x50\x2a\x13\x45\x2f\x8e\xd3\x9e\xd6\x26\xee\xd0\xf3\x19\x51\x19\xc4\x21\x07\x61\xde\x28\xa2\x8c\xb1\x37\x0d\xd5\x3c\x3c\x37\x73\xc5\x22\x3a\x07\xab\x3f\x66\xf1\x90\x57\x7f\xe2\xd7\xfe\x98\x79\xbc\xf6\xce\x22\x1b\x51\x19\xc4\xfd\x5f\x10\xfe\xa7\x0b\xff\xfa\x1d\xe1\xfa\xef\xc5\xc6\xb1\xda\x8f\x6d\x48\xb2\xd8\xd8\x9c\xbe\xb2\x97\x7c\x5b\xa3\xaf\x9a\xa6\x48\xcd\xf1\xea\xee\xbf\xb4\x30\xad\xe6\xf3\x67\x10\x2e\xbb\xd4\x2d\x29\x70\xff\x49\x0b\xa5\xc2\xe7\x9f\x21\xcf\x8c\x3a\x51\x66\xde\xcf\x5d\xde\xe6\xa5\x53\xb9\xdb\xbf\xf8\xe1\x95\xe4\xd6\x1f\x68\xc0\x24\xe7\xab\xce\x2f\x45\x45\x0c\xe1\xe4\xcf\x51\x4a\x2d\xb1\xb8\x7f\x1e\xa1\x4c\xb7\x7c\x9b\xb1\x1c\x4b\xb5\x17\xba\xe9\x1c\xf1\x5f\x0b\xc2\xa0\xa6\xfd\x79\x46\x18\x29\x08\xff\x12\x8e\x35\x2e\x4b\x57\xb7\x2c\x27\xa9\xdb\x7f\xf6\x85\x4c\xdd\x3e\x2c\xa4\x09\x45\x65\x96\x4d\x11\x53\xe7\x6b\x71\xa9\xd9\x87\x53\x59\xac\xe4\x45\xca\x68\x24\xf1\x82\x8f\xf0\x85\x69\x63\x6a\x85\x02\xc8\xd5\xcc\x93\x27\x3b\x4a\xce\xcd\xfb\xfa\x6c\x72\xa5\x11\xf8\x55\x1d\x61\x31\x6d\x9f\xca\xd2\x2c\x72\x10\x56\x50\xe4\x35\x5d\x32\xc2\xda\x31\x69\x2b\xe7\x0e\x39\x62\x95\x9c\xc0\xd5\xf6\xf2\x5e\x79\xf8\x8d\x28\x57\x92\x85\x68\x7c\xe1\x54\xb6\x46\xa3\x68\x23\xdf\xd1\x55\xea\x7c\x79\xf8\x87\x45\x9c\xde\x61\xa5\x41\x82\x4e\x98\x91\xd0\x6b\xe6\x50\xac\x14\x92\x1c\xa1\x20\x5b\x69\xef\xef\x42\x34\xa7\xd2\x5a\xe4\x20\x9c\xae\x43\x1e\x26\xcb\xd8\x18\xe0\xfd\xac\x77\x33\x07\x2d\x0f\x5b\x3d\x8d\x0f\xe5\xbe\x28\x46\x42\x62\x89\xf5\x6d\x9c\xad\xaa\x53\x78\xac\x59\xfb\xdf\x49\x74\xd2\xc8\xa7\x4d\x38\xf9\xe3\xf6\x87\xdb\xbe\x69\x38\xeb\x6d\xa9\x56\xcc\x5d\xd2\x94\x91\x76\x81\xd1\x97\xef\x72\xe3\x3a\xeb\x9d\xbb\x4a\x53\x84\xe8\xf1\x41\x1c\x7c\xe4\xf3\xa8\x6a\xd4\x75\x8c\xad\xd5\xce\x5c\x97\xe6\x50\x88\xa8\xd5\x57\x93\x32\xe3\x13\xaa\xab\xaa\x20\x58\xba\xec\xa4\xd4\xa8\xb8\x84\xa8\x0b\xe2\xe0\x23\x9f\x1d\x0b\x55\xfa\xd9\x1b\x77\x3c\xec\xc6\xbb\xe2\xa3\x1e\x66\xe8\x19\x16\x1c\x62\xf1\x9d\xb1\xbc\xda\xdd\xce\x86\x3a\x59\x27\x51\x82\xa8\x0b\xe2\xe0\xbf\xaf\xfa\x6f\xae\x36\x0b\xbc\x8a\xc5\xf7\xdd\x9f\x78\x7e\x09\x3d\xf4\x6f\xde\xe7\x6b\x9f\xda\x9d\x36\x5c\xbd\xf3\x01\x83\xfe\x77\x20\xb4\x1c\x08\xe2\x3c\xa5\xfe\x79\xc0\xc4\x67\xba\x50\xd6\x72\x8e\x26\x20\x21\x95\x8a\x8b\x94\xfd\x95\x65\x64\xbb\x86\xb6\xc7\x93\x98\xd9\x62\x85\x9b\x6b\x51\xb3\x6c\x68\x88\x20\x0c\xe2\xa0\x33\xc2\x7f\x0f\xc2\xa0\x2f\xf4\x49\x0a\xcc\x5b\xf7\x5a\x31\xe6\xbf\x5f\x15\xc9\x74\x14\x1e\x7e\x51\xb6\xf3\xd5\xf2\x9b\x86\x67\xb3\x26\xad\x8e\x45\xf3\x7b\x0b\x0a\x2c\xe8\xe2\x70\x10\x07\xff\x48\x4d\x05\xe9\xc3\xd9\xb3\x47\xa3\xa2\x47\x6b\x5c\xd9\x45\x1a\x09\x82\x36\x6e\xe2\x87\xb4\x6b\xdc\xcc\x5a\x7c\x4e\x72\x16\x7b\x02\xfa\xaf\x3a\x88\x83\x2b\x70\xfe\xa5\x45\x62\x01\x4a\xb2\x84\x19\x2d\xc5\x6d\x1d\x4c\xac\x28\xbf\x94\x22\x27\xf7\xd4\x67\x1d\x8b\xe2\x7c\x59\x0e\x1e\xab\x3a\x88\xba\x20\x0e\xfe\xfb\x0e\xa5\x5c\x13\x4c\xaa\xa7\x7b\xf4\x96\xfe\x22\x29\x31\x95\xdd\x3a\x7b\xb7\x34\x1e\x59\xeb\xc0\x62\x5c\xb6\x71\xf0\x96\xb7\x96\x2e\xa2\x2e\x88\x83\x2b\x30\x1a\x13\x93\xe2\xfe\xe1\xa1\xe3\x54\x63\x14\x76\xdf\xe3\x83\x98\x48\xe7\x75\x92\x05\xb4\xad\x33\x77\x63\x0a\x0e\x47\xf0\xa9\x38\x10\x93\x1f\x10\x07\x9d\x0d\xe4\xfd\xfb\x04\x18\xd4\xbb\x9e\xe4\x40\xf8\x25\x47\xf1\x39\xfc\x65\x89\xc1\x1b\x8b\x15\xb9\xc7\x43\x0b\x9b\xee\x61\xf7\x7c\x57\xf0\x2f\xdf\xf9\xb9\x67\x5e\xb1\x1f\x8e\x8f\x68\x3b\x88\x83\x7f\xa6\x89\x95\xe2\x25\x3a\xea\x8f\x83\xa3\xc9\xe8\x3c\x0d\x2f\x45\x1e\x16\x9b\x0d\x1d\xad\x77\x8f\xb1\x7f\xd0\xd0\x23\x67\x53\x9a\x87\xde\x90\x05\x71\x70\x07\xaa\xb3\x27\x99\x44\xda\x56\xcd\x1e\xa2\x47\x15\xda\x04\x58\x67\x5f\x4e\xde\xfd\xfa\x36\xb6\x4d\x59\xaa\xaa\x90\xc5\x47\x9f\xa9\x0c\x51\x17\xc4\xc1\x7f\x5f\x95\xaf\xbf\xe2\xcf\xd1\xad\x17\x7d\x7c\x2e\x63\xe8\xd0\x5c\x2c\xa2\x5a\x9e\xfe\x08\xd3\x6c\x7d\x71\x45\x8a\x55\x6f\x69\xe3\x02\x74\x71\x1c\x88\x83\x3b\x80\x46\xbf\x7a\x0d\x45\xa4\xf2\xd6\x6d\xca\xfc\x9a\xd6\xee\x9d\x8b\x03\x54\x52\x79\x0d\xf7\x7a\xa2\x97\xd5\xd3\xec\xc2\x34\x70\x1a\x11\x0e\x80\x38\xe8\x6c\x20\x20\x08\x83\x86\xba\x93\x1c\x90\xbb\x46\x45\x46\x93\xac\xb3\x47\x29\xc3\x9d\x47\x1c\x42\xd6\x77\x27\xb7\x5f\x4f\x83\x22\x42\xcc\x46\xc8\xcb\xfc\x6b\xa7\x3e\x0e\xb4\xc2\x0a\xe0\x90\xb6\xc7\x47\xf4\x8e\x9e\xf9\xec\x9e\x96\xde\x4d\x43\x1e\x19\x23\xdc\xe2\xcf\x16\x7f\x81\x4f\x25\xe2\xb1\x01\x09\xa3\x46\x34\xa5\xa8\x39\xb4\x3d\x1e\xc0\x21\xfd\x4f\x34\x1f\x7f\xba\x28\xae\x98\x3e\xab\x01\xab\xe1\x2c\xf6\xd2\xc3\x8b\x65\x07\xbb\xfd\x98\x9c\x62\xfa\x92\xaf\x1f\xb6\x2b\xe0\x6d\x43\xff\x13\x05\x70\xf0\xdf\x77\x32\xe3\x67\xd0\x8f\x20\x33\x6a\x23\xc6\x9c\x94\x70\xfa\xac\x47\x72\x64\xad\xe7\x2e\x27\xbe\xa9\x9f\xb7\xe3\xb5\x99\xf3\xfc\xd2\x02\xed\x8e\x00\x70\x70\x07\x32\xaf\x78\xd7\x44\xde\x52\x40\x49\x65\x9d\x5d\xd7\x71\x3c\x5a\xda\x0b\xf1\xe8\xb9\xac\xa8\xf6\x3b\xe8\x7d\x5a\xe1\x05\x63\xca\x26\x84\x03\x20\x0e\xea\x07\xb4\xff\xee\x00\x68\xde\x71\xe2\xff\xc5\xed\xfd\x31\x49\x3e\x7b\x8f\xe5\x1a\xce\x0d\x37\x5d\x5f\x7c\x97\x73\xf0\x58\x7c\xf3\x19\x13\xf5\x65\x11\xa5\x48\xb2\x92\x24\x68\x17\x0f\x88\x43\x7a\x4b\xfa\x8c\x95\xc2\xaf\x39\x96\x8b\x7e\x4a\x1f\x36\x13\xfd\x50\x68\xc8\xf1\xaa\x1c\x5d\x79\x58\x59\xa8\xc2\x9d\xa6\x56\x31\xc5\xa1\x80\x0d\xe2\x90\xee\x0a\xe0\x77\x52\x5c\x14\xce\x95\xb8\x7b\x40\xe5\x57\x30\xd4\xad\x86\x59\x9c\xee\x9e\x47\xe0\x5c\x21\x41\xae\xd5\x87\xe7\x9b\xa4\x04\xdd\x15\x00\xe0\xe0\xbf\x6f\xb9\xd6\x7b\x14\x57\x3a\x2d\xb1\x6f\x34\xd2\xea\xec\x26\x06\x99\xfd\xe9\xd4\x1b\xa4\xd5\x21\xdf\x0e\x3f\xa2\xe5\xb9\x5d\xbb\x00\x4d\x8b\x40\x1c\xdc\x81\x48\xf1\x8e\x8d\x86\x1d\xeb\x03\x7d\x39\x1d\x5c\x3c\xc1\x94\x3b\x85\x38\x5c\xcf\x2d\x98\x54\x77\x3a\x71\x6e\x7f\x32\xc6\x8d\xb5\x42\x38\x00\xe2\xa0\x7e\x00\x10\x84\x41\x21\xea\xe4\x20\x4c\xd9\x72\x45\x1a\x9d\xa3\x33\x40\xda\x68\x28\x79\x66\xc1\xd4\xe0\x18\xd5\xb0\x82\xfe\xe1\x2d\xba\x47\xf9\x44\xd6\x78\x2b\x8b\x1e\x88\x50\x09\xe2\x4e\x78\x47\x78\xfe\xb5\x16\x5e\x29\xaf\xc9\xb3\xab\xc1\x52\x65\xab\x8d\x0f\x49\x85\x79\x1c\x42\xc8\xe6\x92\xdc\x75\xc2\x77\xb9\xf2\x32\xf0\xa1\x77\x84\x01\x1c\x72\x10\x4e\xe4\xf2\x28\xf2\x3a\x18\xa7\xb4\x99\xc1\x5d\xa7\x72\x39\xba\xe7\xa0\x9f\x75\x6b\x7b\xe7\xf6\xdb\xbe\xed\xbb\x1d\x71\x71\x01\x68\x88\xca\x20\xee\xff\x82\xf0\x3f\x57\xf1\xff\xf5\x3b\xc2\xd8\xc5\x61\x22\x85\x86\xc9\xac\x43\x23\x18\x81\xa5\x8d\x92\xbf\x46\xfa\xde\xbc\x7a\xf8\x11\xad\xde\x99\x09\xf3\xc7\x4b\xa6\xbb\x4a\x7f\x06\xe1\x2e\x14\xbd\x5d\x67\xf4\x46\xb1\x68\x3b\x2a\xba\x9a\xde\xfa\x29\xb1\xc8\x96\xab\x89\x33\x7e\x5c\x75\xef\x73\xd2\x87\xe8\x2f\xa6\xfd\x03\x7d\x2c\xe1\x65\x1f\x2a\x79\xe3\x58\xb9\x67\x9d\x47\xed\xff\x63\xee\x4d\xc3\xa9\xec\xfe\xf7\x7f\xca\x98\x21\x73\xb6\x39\xf3\x3c\x24\x4a\xca\x2c\x33\xc9\x3c\x0f\x19\x0a\x91\xc8\x50\x66\x42\xe6\x31\x33\x99\xe7\x39\x22\x32\x64\xce\x3c\x13\x4a\x92\x12\x65\x4c\x86\xf0\x3f\x3e\xbf\xe3\xbf\xaf\x2f\x7b\xeb\x5e\xf7\x03\x0f\xee\xe7\xaf\xe3\xdc\xd7\xba\xf6\xb9\xd7\x5a\xe7\x5e\xeb\xbd\x56\xb5\x14\xec\x55\x12\x93\xc4\xea\x1f\x7e\xc3\x8c\xbd\xeb\x25\xbc\xff\xb9\x53\xa3\x41\x4d\x3b\x5a\x23\x8c\x14\x84\x05\x44\xed\xda\x7f\xe9\x50\x78\x08\x6e\x99\x8f\x36\xd4\xbd\x67\x81\x5d\x95\x3c\x33\xb4\xa3\x4e\x35\x2a\xa8\xe6\xb8\x88\x41\xc2\x7f\x2a\x8b\x95\xc8\x41\xd8\x87\xbb\xa3\x18\x9d\xb7\x18\xef\x0c\x19\xfe\xec\x2b\x7f\x65\xf1\x7b\x8f\xc6\x97\xb4\x5f\xd6\xac\x4f\xb0\xae\xc2\x6a\x08\xf0\x4d\x4e\x65\x69\xf6\x84\x20\xec\x5b\x4f\x1d\xdd\x84\xe7\xe4\xd9\xf2\xb3\x49\xf8\xd2\x1b\xa3\x90\x78\x47\x13\x91\x81\x99\xfb\x95\x78\x0b\xdd\xfb\x35\x7d\x22\xa7\xd2\x5a\xe4\x20\xec\x5f\xfa\x44\x80\x1b\x35\xc0\xbe\x8d\xcf\x96\x0a\x53\x5a\x90\xd9\x30\x26\x4a\xf3\x4d\x9b\x5b\x70\x30\x4b\xec\x73\x0c\xb2\x19\x86\x53\x69\x2d\x72\x10\x76\x5d\x36\x8e\x6c\x34\xcf\x69\xf8\x6e\x1b\xeb\xd0\x5a\x83\xa9\x73\x5d\x46\xfc\x2a\x69\x67\xad\xa7\xd3\xe6\x6b\x09\x1c\x13\xd8\xe9\x5d\x9f\x04\x32\xd1\x49\x23\xdf\x15\xd7\xe7\x2f\xa6\x3f\xb0\xa8\xa1\xf5\xe7\x13\xb9\x4e\x27\xc9\x17\x4a\xad\x55\xa2\xba\xbb\x17\xa7\x2a\x44\x07\x0b\xa3\x7f\xbb\x09\xef\xf1\x41\x1c\xe2\x48\xa2\x4f\x94\xfc\x3c\x2e\xa3\xe4\xe6\xf9\x5b\x07\x16\x86\x6f\xab\xc8\xfd\x69\x34\xa2\xce\xc8\x0b\xf9\x09\x8d\x07\xa4\x63\x46\x47\xe4\x42\xfb\xec\x00\x1c\xe2\xc8\xa7\xe0\x5e\x4f\x6a\xa9\x84\x5b\xc1\xb4\x13\x26\x99\x1d\x92\x4b\x58\xab\x85\x53\x2c\x63\x47\x5d\x93\xbc\x59\x51\xd7\xf7\xea\x2a\x74\x83\x3e\x88\x43\x7c\xde\x84\xd0\xc7\x86\x34\x95\x1a\x4a\x4b\x07\xdc\x5d\x9d\x0c\xb3\x8c\x96\xc3\x23\x85\xe1\x03\xdd\xd7\x76\x47\x2c\xbc\xcc\x86\xf3\xa0\x19\x3b\x88\xf3\x95\xc0\x3a\xa6\x4b\xff\xc6\xca\x3d\xb5\x8a\xd5\x2b\x68\xcf\x5b\xd7\x49\xdd\x9b\x92\x2f\x3d\xa9\x8c\x8a\x40\x5b\xa2\xd4\x69\xcb\xb8\xc8\x97\x38\x04\x1e\x84\x41\x1c\x54\x23\xfc\xcf\x41\x18\xf4\x83\x3e\xc9\x02\x25\x6a\x89\xb0\x51\x9a\xbc\x71\x1c\x45\x03\x56\xb6\x3b\xe6\x04\xf5\x37\x06\xcb\x1c\xbf\x06\x61\x09\xf3\x78\x59\x71\x13\x9a\x41\x65\xd7\x20\x0e\xf1\x95\xbe\x48\xed\xab\xba\x40\xf1\x9d\xd9\x28\x21\x92\xca\x21\x59\x9e\xba\x5f\xa2\x9d\xd8\xa2\x22\x90\x85\x66\xa3\x42\xd2\xbd\x40\x9b\x17\xae\x0b\xe2\x90\xfe\x0b\xc9\xe7\xcd\x15\xc8\x2d\x4f\x7a\x72\xc1\x2d\xa3\xc2\xa5\x84\xc5\x69\x99\xe0\xea\xe0\x96\x5a\x06\x87\x8b\xbd\x90\xde\xb3\x3e\xc8\x02\x20\x0e\xf1\x79\xb9\x0b\xe2\x07\x2a\x79\x7f\xe9\xe1\xc1\xc6\xb9\xcf\xbe\xbd\x92\x73\x49\x83\xf6\x77\x0a\x7b\x90\x9b\x76\x8f\x8e\x61\x1f\x75\xe0\x45\x68\x85\x09\xc0\x21\x5a\xc0\xa6\x29\x3c\x91\x5b\xf6\xb9\xa8\x04\xfb\x8c\x9d\x88\x50\x8a\x62\xf6\x15\xbd\x45\xa2\x0b\xdf\x47\x16\xf2\xa4\x51\xc6\xef\xb5\x6f\x41\x5b\x22\x01\x1c\x54\x1b\x08\x0a\xc2\x80\xde\xf5\xc4\x03\xd3\x76\x4c\x44\x4d\x48\x8c\x89\xf7\x87\xf3\xa6\x14\xde\x36\x7c\x5f\xe1\x2d\x5a\xb3\x44\xcd\x87\x09\x7f\xc7\xfd\x7c\xc3\x44\xe2\x2b\x74\x60\x1a\x80\x43\x7c\xa7\xf8\x9e\xd3\x6e\xee\x6d\x92\x8c\x17\x75\x3b\xbc\x87\x4a\xde\x13\x1b\x53\x16\x2f\x3e\x8b\x89\x60\x08\x62\x17\x1d\xaf\x66\x5c\x10\x86\xeb\x82\x38\x44\x0f\xdc\xdf\x4d\x2f\xd9\xc5\xa9\xb5\xe2\x34\xa7\xbe\xc8\x2a\xe2\x3f\x6e\xbe\x4b\x64\x92\xec\x5a\x89\xe1\xfe\xa6\x79\x8e\x24\x94\x09\x3a\xd4\x0a\xc4\x21\x3e\xaf\xda\x9c\x91\xd2\xbe\x7d\x37\x91\xe0\xcb\xa9\x62\xfa\x6e\x3b\x9e\x64\x9b\xb4\xfd\x87\x75\xb3\x77\xfc\x46\x02\xf5\x07\x8c\xcd\xc3\xa1\xfa\x73\x00\x87\xe8\x01\x87\x5f\x68\xfd\xe4\x16\x21\x13\xe7\xbd\x7d\x61\x96\xa2\x09\xf5\xf9\x2f\x5b\x5f\x2a\xd7\x2d\x2f\x8a\x69\x19\xf6\xdf\x9e\xe0\xf7\x81\x7b\x00\xc4\x41\xb5\x81\x80\x20\x0c\x1a\xea\x4e\xf2\x80\x33\x29\x97\xa3\x3c\x1a\x3b\xec\xe9\xf9\xba\xf7\xaa\xe9\x3b\x7d\xae\xc9\x67\xdf\x8e\xb3\x49\x49\xa2\xdf\xff\xe6\x47\xe3\xd8\x7a\x0d\xde\x76\x10\x87\xf8\x4e\x5b\x2e\x5e\x37\xc7\xa3\x62\xa1\x6a\xd4\x0e\xdb\xea\xf7\x30\xa8\x60\xcd\xbe\xf6\x73\xf4\x6b\x9f\x4e\xf5\xa7\x22\x4f\xf9\xec\x3f\xd0\xa9\xd1\x20\x0e\xd1\x03\xee\x87\x12\xb2\x02\xcd\x79\xf6\xcf\xd0\xef\xee\xd4\x38\x65\x49\xc4\xcc\x8f\xdd\xa6\x7f\x18\x7a\xf8\x66\xe5\x76\xe3\x90\x64\x82\x2c\x5c\x17\xc4\x21\x3e\xaf\x97\xc1\x6d\xd6\x02\x69\x26\x4e\x87\x79\x69\x91\x15\xba\x86\x2a\xf9\xc8\x98\xa1\x29\xe9\x58\xd5\x37\x37\x88\x18\xf2\x5d\x29\xa1\x13\x8e\x41\x1c\xa2\x07\x78\x94\x0d\x24\x68\xef\x48\xab\x26\x50\xd6\xde\xbc\x5f\x1b\x35\x71\x86\x2d\xda\xa9\xc8\x39\xfa\xe3\xf0\xae\x64\x72\x23\x4b\xf2\x0c\x74\x58\x16\x80\x83\xfa\x01\x40\x10\x06\xcd\x3b\x4e\xf2\x00\x8d\xe4\x6b\x96\x6f\x95\xda\x89\xd4\xaa\xb7\xbe\x59\x65\x90\x4d\x2f\xa1\xc7\x4d\xd8\xe1\xe9\x16\x7f\x9b\xf2\xbd\x58\x41\x1c\x79\x00\xed\x8a\x01\x70\x88\xef\xb4\xb6\x5a\x57\x74\x81\xdc\xbe\x94\x4e\x93\x74\x21\xb5\xad\x3f\x2a\xa4\x76\x5d\x28\x94\x26\x7d\xd7\xbf\xfa\x21\xad\x14\x76\x08\x74\x00\x19\x88\x43\xf4\x40\xb2\x5b\xa1\xe2\x15\xaf\xe7\x1d\x9f\x8d\x7f\x5e\x57\x92\x61\xb6\xec\x73\x73\xdd\xe1\xea\x1f\xb6\x26\x92\x65\xdc\xf2\xf6\xaf\x2b\x83\xca\x7a\x00\x1c\xe2\xf3\xc6\x2e\xef\x62\x86\x4e\xe4\x0c\x3e\x38\x94\x3c\xe7\x3f\x46\x14\x97\x3d\x4f\xf7\x64\x51\x7a\x53\xf4\x9a\xc1\xc0\xfc\xab\x62\x59\x68\xdb\x3d\x88\x43\xf4\x00\x6a\x4a\xd6\x79\xf7\x4f\xfd\xc9\xdf\x13\xdd\x08\x58\x9e\x2d\x7b\x64\x53\x6b\x4b\xac\xfe\x0e\x65\x09\x1a\x6f\xc2\xbc\x4f\xe6\x44\x02\xf7\x00\x88\x83\xfa\x01\x40\x10\x06\x85\xa8\x93\x83\x30\xce\xe6\x37\x1a\xbf\x44\x37\x5b\xc2\x89\x40\xb4\x16\x09\x96\x3f\xc5\x83\xb6\xcd\x44\xf6\x2c\xc2\x71\x41\xe7\x1a\xa5\x62\xf0\x67\xe0\xa1\x12\xc4\x21\x07\x61\x9b\xdb\xbd\x0d\xc6\xef\xc2\x34\xec\x51\x95\x3b\xca\xf7\xe3\x56\x89\xdd\x9c\xfd\x3f\xb4\x7e\x55\x7d\x39\xff\xe8\xa5\x8e\x22\x5b\x20\x5c\x19\xc4\x21\x07\x61\x99\xdc\x39\xea\xb1\x77\xa3\x6f\x49\x43\x9c\x69\xd7\x5e\xf2\xee\x57\x3c\x62\x56\x88\x2b\x0d\x9c\xde\xbf\x70\x3f\xa2\xfd\xb9\x4d\x32\x5c\x19\xc4\xfd\xbf\x20\x7c\xec\xca\xab\x7f\x7d\x8f\xb0\x36\x73\x6b\xcc\x0e\x06\xe3\x9f\xfc\x9a\x39\x89\x24\x5a\x11\x9e\xd0\x1d\x07\x5b\x55\x81\xd5\x7a\x5f\xd5\xb2\xd2\x08\x2d\x97\xbb\x47\x83\xf0\xef\xec\xdd\x00\xbc\xcd\x61\x7b\x3b\x3e\xf2\x3a\x1c\xd2\x9b\xb2\x55\x1a\xd1\x15\xdd\xb3\x0b\x43\x35\xde\x61\x0f\x7a\xe6\x5f\x79\x1e\x41\x0b\xbe\x58\xae\xe2\x85\x15\x31\x53\xd2\x2a\xbc\xd2\xcd\x53\xfd\x64\x2d\xc6\x8c\xe7\x1d\xa8\xfe\x23\xa4\x5a\x2d\xd1\x6a\x8a\x27\xf4\xbf\x16\x84\x41\x4d\x3b\x5a\x23\x2c\x87\x18\x96\xba\x8a\x7e\x98\xcc\xd3\xd3\x7e\x5f\xb9\x17\x20\x4c\x6f\x6f\xbc\x21\x59\xcc\xf2\x5a\xea\xf9\xae\x86\xcf\xeb\x46\x6f\x8a\xe2\xb3\x17\x4f\x65\xb1\x12\x39\x08\x3f\xf2\xd2\x0a\x7c\x28\xf1\x8e\xdd\xaa\x78\x59\x45\xec\x8e\xf5\x04\xb3\x7a\xf2\xc4\x0c\x25\x2f\x83\x12\x2d\x26\x7e\x79\x35\x3a\xc1\xa9\x2c\xcd\xde\x42\xfa\x58\xc3\xcb\x78\xbd\x6b\xa5\x07\x54\x4a\xa9\x46\x6f\x2f\x4c\x0e\xe0\x3e\xce\x20\xb7\x33\xbc\x93\xf3\xde\x9f\x47\x72\x27\x14\x4b\x84\xf0\x54\x5a\x8b\x1c\x84\x6d\x42\x57\xab\xb5\x19\x48\x88\x4a\x38\x95\x94\x6e\xe3\x8d\xee\xda\x8f\xab\x26\x39\x3f\x51\xb3\x78\x7a\x6b\x5c\x37\xfa\x67\xd4\x95\x53\x69\xad\x33\xd2\xc7\x52\xaa\x09\x3f\xb0\x7d\x70\xc7\xe6\x0d\x9d\xb5\x68\x21\xcf\x55\xee\x9c\x14\x6d\x89\x57\xb9\x12\xdf\x17\x85\x3c\x64\xb7\xa9\x6d\x4f\xef\xb0\x2c\x90\x89\x4e\x1a\xf9\x3e\x11\x15\x04\x8b\x92\x9f\xb3\x6f\x22\xd7\x4e\xb2\x53\x58\xbb\xe3\xdf\xbc\xad\x36\x95\x6e\x22\x12\x69\x6c\x1a\xae\xa8\x71\x19\x9a\xf9\x81\x38\xc4\x91\x44\xc8\x5c\x62\xbd\xe3\xf2\x15\xdc\x67\xd1\x26\x17\x3c\xf3\xb7\x06\x65\xbe\xa0\x62\xd1\x4d\x3f\x99\x2c\xf8\x14\x1c\x1c\x96\x3a\x9e\x01\xd7\x05\x71\x88\x23\x1f\x3e\x6f\x5c\xa0\x41\x01\xeb\xbc\x21\xfd\x72\x76\x75\x95\x72\x46\x99\x4d\x54\x54\x95\xb7\x5d\xc8\x9f\x2f\x7c\xf7\xbb\x35\xb6\xa1\xa5\x20\x10\x87\xf8\xbc\xdb\xba\x78\xb9\x4d\x6b\x9c\x8c\x75\xbb\x55\x13\xc1\xd8\x6e\xa9\x35\x7e\x3b\x8f\x67\xa6\x18\xf1\xf1\x13\x7a\xfa\x9e\xc5\x4c\x40\xa7\xfa\x80\x38\x44\xdd\xa1\xbb\x9f\xed\x48\x9a\xcd\x8b\x8c\xa4\x14\x1e\xa6\xba\x56\xaf\xb5\xb8\x38\xac\x15\xae\x19\x60\x71\x8f\x26\x07\xb0\x44\xd0\xd1\xc2\x83\x30\x88\x83\x6a\x84\xe5\xfe\x71\xf2\x03\xfa\x41\x9f\x64\x01\xdb\xce\x7e\x29\x66\xb2\xc7\x6c\xaf\x28\x4a\x05\x2f\xba\x0a\x71\xb8\xfe\x16\x4e\xf9\x21\x7b\x39\xba\xc5\x33\x62\x69\x43\x6f\x1d\xaa\x0f\x05\x71\x88\x4d\xb7\x09\xb2\xf4\xd9\x12\x5b\xfc\x25\xf9\x2e\x36\x7f\xa5\x71\x8d\xea\x0a\xaa\xdd\x57\xd6\x52\xbd\x71\xb1\x38\x76\x94\x8f\x13\x51\x18\x70\x5d\x10\x87\x74\x7d\x92\xcf\x3d\x09\x1d\xbb\x58\xfd\x19\x39\xbf\x24\xad\xe5\xc2\x4a\x2e\xee\x96\xc9\x7b\x9d\x1c\x5a\x03\x7c\x2d\xef\x1c\x8a\xd3\x3f\xc3\x75\x41\x1c\xe2\xf3\x9e\x79\xde\xa3\xfa\x33\x41\x5c\xe0\xd6\xb2\x22\x3d\x5d\xc9\xa7\x46\x32\xda\x5a\x6a\x09\x56\x27\xdf\x15\x8d\xf7\x97\xb1\xab\xc5\xa2\xe0\xba\x20\x0e\x51\x37\xa9\x5a\xca\xe1\x4e\xcf\xe0\x5d\x1e\xb3\xa6\x39\xd2\xb8\x77\x25\xf1\xe2\x07\x96\x4b\x39\xec\x31\xb2\xdf\x5e\x26\x3b\xa9\xcb\xbf\x87\x4f\x7e\x40\x1c\x54\x1b\x08\x08\xc2\xa0\xde\xf5\x24\x0f\xec\x7a\x7d\x97\x7f\xe1\x71\xe5\x12\xc1\x75\xdf\xc6\xf7\x77\x53\x8b\x0d\xab\x6b\xf2\x5e\xcd\x13\xb5\xf0\x47\x3e\x2b\x46\x43\xeb\xd3\x85\xb7\x1d\xc4\x21\xd5\x87\x36\xf9\x2b\x24\xb8\xf4\x7e\x60\x64\x7f\xb9\x8b\xa1\xed\x44\xf6\xc5\xee\xed\xea\x23\x8b\xdb\x6d\xb8\xa8\xc3\x1b\x84\x4b\xb2\x50\xa8\x00\x71\x48\xdd\x00\xc7\x81\x04\xbd\xa1\xe5\xba\x4e\xa1\xb2\xa1\x49\xfa\xb7\x9d\xe9\xce\xec\x41\xa2\x00\x7a\x87\xe8\x44\x7c\xac\x51\x92\xf5\x21\xa8\x1b\x00\x70\x88\xcf\xfb\xb8\xe0\x3b\xd5\x52\xe8\xa2\x4e\x88\x57\xe9\x41\x67\x32\xf1\xae\xcb\x72\x00\x45\xe0\xb6\x53\xe5\x9d\x1b\xc1\x58\x44\x34\x2b\xd0\x81\x69\x20\x0e\xa9\x56\x3a\x5f\x91\x9e\x24\x50\x52\xf4\x12\xda\x8d\x79\x6b\x8d\x80\x15\xdc\xeb\xd3\xfe\x4e\x39\xe5\x89\x1f\x1e\x79\x06\x30\xff\xfc\x32\x05\xf7\x00\x88\x83\x6a\x03\x6f\xfd\xb3\x07\x40\x43\xdd\x49\x1e\xb8\xdc\xc6\xba\x16\xc1\xae\xf5\x89\x9e\x8e\x17\xa3\xdc\x5c\xa1\x66\x9c\x0f\x4b\x96\x47\x29\x81\x28\x70\xeb\xa9\x9e\x21\x71\x33\x74\x62\x30\x88\x43\x6c\x7b\x5f\x57\xdb\x95\x86\x07\x6f\x19\xf3\xcc\x53\x71\x7b\x43\x67\x9e\x36\x3b\xbd\xe7\x0e\xce\x0f\xe9\x6f\x5a\x5a\xf5\xdf\xf8\x9a\x08\x0d\x05\x20\x0e\xd1\x03\xbc\x73\x5a\x2e\xfd\x73\xaf\x31\x7c\x0f\x43\xdc\xb8\x7c\x56\x2d\xae\xcb\xee\xf2\x27\xdb\x08\x65\xe5\x08\x44\x64\xf5\x8a\x24\x43\xfd\x16\x88\x43\x0a\x6d\xaf\xb8\x25\x1b\x57\x19\x0f\x5f\x5f\x7a\x5c\x16\x49\x4b\xf2\x4b\x99\xf7\xc9\x40\x83\xa2\x63\x78\x82\xff\x05\x7d\x9b\x6b\x2f\xa0\x21\x06\xc4\x21\xea\xf2\x12\x59\x93\xf7\xef\x8f\xd6\x8a\x14\xc7\x7f\xc7\x1d\x9a\xb1\x90\x8c\x5c\xb7\xc8\xfd\xea\xff\xab\xea\xb0\x02\x03\x9d\xea\x22\x74\x60\x1a\x88\x83\xfa\x01\x40\x10\x06\xcd\x3b\x4e\xf2\x40\x66\x46\x83\xb7\xb0\x7c\x31\x07\xef\x2d\x0c\xec\x0c\x33\x98\x7e\xa9\x62\xcd\xfa\x00\xba\xbd\x86\xe3\xf4\x1e\xbf\xc5\x64\xa0\x24\xbc\xed\x20\x0e\xb1\xed\x45\x49\x31\x4c\x3f\x42\x34\xcf\x7c\x11\xc0\xfe\x40\xe8\xff\x86\x4d\xcc\x40\x45\xc7\x71\x1e\x16\x40\x17\x50\x5f\x50\x88\x93\x32\x07\x1d\x3e\x05\xe0\x10\x3d\xd0\x2e\xd8\xf9\x58\xbf\xc5\xeb\x97\xc3\xc2\xee\x6e\x5f\x06\x5f\x00\x0f\xb1\x7b\x11\x8b\x6b\xe5\xcc\x79\x82\xa7\xca\xab\x0f\x5e\xb8\xc3\x75\x41\x1c\xe2\xf3\x8a\xa0\x18\x05\xe9\xdc\xfb\xf0\x6a\x01\x4b\x73\x59\x04\xc6\x4d\x90\x95\xe8\x2a\x86\x85\x6a\xa0\xff\xa8\xf9\x86\xda\x82\xa6\x9e\x28\x5c\x17\xc4\x21\xea\x56\x91\xb6\xa0\x45\x72\x26\x2b\xc8\x0b\xa5\x35\x9a\x58\xff\x69\xf8\x55\xbb\xcc\x49\x1c\x37\x98\x79\xef\x62\x1a\x6b\xc2\xd3\x3f\x6b\x70\x0f\x80\x38\xa8\x1f\x70\xfe\xe7\x20\x0c\x0a\x51\x27\x07\xe1\xc2\xdb\x5a\xcd\x09\x2f\xe6\x5e\x4c\x8d\xbf\xf3\x4f\x49\xe7\xde\x15\xf6\x9a\x9a\xa0\x36\xad\xa3\xe9\x0d\xda\xaa\x74\x48\xf1\x8a\x81\x87\x4a\x10\x87\x1c\x84\x3d\x4a\x51\xeb\xac\x1f\x10\x4f\xdd\x98\xd8\xbb\x30\x69\x5d\xd4\xe3\xef\xcf\x9f\x99\xc6\x18\x1d\x6a\x3b\x59\x9b\x82\x85\x0b\xfb\x01\x57\x06\x71\xc8\x41\x58\xe7\xa0\x04\xab\x49\x71\x35\x8c\x85\x29\x25\x88\x82\xd6\x79\xa0\x91\xbe\xf5\x16\x66\x90\xdb\x13\xf4\xb3\x56\xe8\xaa\x38\x85\x17\xe0\xca\x20\xee\xff\x05\xe1\x63\x1e\xfb\xd7\xf7\x08\x57\xec\x3c\xe3\x10\x93\xf0\x48\x59\xeb\xee\x5a\xdb\x61\x2c\x40\xff\x40\xa5\xea\x7a\xd8\xc5\xc5\xf8\xc7\x69\x3d\x3c\x33\x94\x8c\xfd\x68\x10\x66\xdf\xee\x52\x71\xa6\x89\x4f\xbf\xce\x6f\x79\xfb\xe7\x25\x0d\x53\xeb\x6f\x09\xde\x74\x28\xa6\x01\x54\x77\xdf\xe7\x2d\x61\x2e\x1e\xad\x0e\x75\xbf\xe8\x92\xa8\xbd\xda\x18\x37\xa6\x68\x31\x1e\xa0\x68\x9d\xd3\xd4\xcd\x37\x8d\x9f\x6a\xd0\xd1\x30\x8a\xa9\xdb\x3a\x64\x7c\xf5\xbf\x16\x84\x41\x4d\x3b\x5a\x23\x8c\x14\x84\x73\x57\x4c\x63\x06\x56\x2b\x85\x99\x5a\x8a\x9d\xb5\xe4\x5c\xce\xb6\x56\x9e\xeb\xc1\xa3\xf4\xd7\xe2\xd2\x4b\x72\xba\xdc\x57\xe7\x7e\x2a\x8b\x95\xc8\x41\xd8\x2e\x6f\xe0\xdb\xa2\x14\x7b\x70\xa5\x65\xa3\x3d\x37\x56\xdc\xa4\x01\x03\xf3\xf9\x25\xbd\x84\xb1\x84\x14\xd5\x4f\x1a\x43\xc1\xcf\x4e\x65\x69\x16\x39\x08\xf7\x95\xa4\x85\x8d\xaf\xef\x37\xa8\x27\x3f\xda\xfc\xc8\xfb\x80\x4e\x9e\xed\x3b\x8e\xfe\xcd\x0d\x53\xab\x5b\x39\x8f\xe7\x48\xf9\xbc\x4f\xa5\xb5\xc8\x41\xf8\x2e\xcd\x67\xd6\x9f\xb1\x2b\xed\xbe\xc5\xea\x1f\x36\x6f\x5d\x39\x0c\x71\x1c\x88\xd8\xbc\x99\xf3\x41\x54\x7e\x11\xff\x06\x1d\x5f\xed\xa9\xb4\x16\x39\x08\x6f\x07\x5c\x54\x7f\x21\xd1\xcd\xc2\x7d\x28\xb5\x85\x9a\x41\x7e\x45\x46\xa4\xd2\xcd\xa3\xb0\x80\xc2\x02\x8f\xed\xce\x1b\xb3\xe0\xd7\xa7\x16\x84\x41\x26\x3a\x71\x45\x58\x9f\xd3\x2b\x71\x51\x53\x82\xf6\x4c\x76\x5c\x56\x56\x26\x7a\x5e\x93\xf2\x37\x19\xc5\x6d\xb3\x27\x1f\xeb\x32\x56\x95\xee\x8c\x41\x2b\xc2\x00\x0e\xb1\xc7\x9f\x44\x97\x14\x35\xba\xe2\x5d\xfb\x69\xc5\x37\xf9\x0b\x8e\x1b\x1f\xc1\xf3\xb4\x59\x5f\x79\x5b\xa7\xe2\xa7\xbe\x2f\x6e\x84\xd0\xb8\xc0\x75\x41\x1c\xe2\xc8\xc7\x23\xb5\x68\xc0\x44\xbf\x81\x8f\x79\xe3\xd2\xec\xfd\xbe\x40\xb6\x94\x70\x8b\x59\x6b\x1d\xb7\x15\x4c\x0d\xce\x28\x63\xf9\x09\x66\xb8\x2e\x88\x43\x7c\x5e\xf1\xf0\x91\x16\xc3\xba\xe4\x80\x0e\x55\x54\x1a\x2f\xbe\x46\xd7\x8b\xd7\xdf\xad\xf3\xb0\xc8\x0b\x35\x3e\xbe\xa4\x75\xf5\xab\x7c\x3e\x74\x4a\x0e\x80\x43\x7c\x5e\x6d\xa2\xec\xaa\x31\x4e\xce\x11\x85\xf5\xcb\x5a\x2b\x6f\xa9\xcd\x68\x30\x6c\x5f\x53\x16\xad\xa1\xe9\xea\x5f\x2c\x19\x5a\x0e\x0a\x86\x07\x61\x10\x07\xd5\x08\xff\x73\x10\x06\xfd\xa0\x4f\xb2\x80\x8b\x49\x78\x53\xb9\xcf\xce\xa5\x83\xe1\x43\xb4\xb2\x43\x86\x28\xf1\x3e\xfc\xf1\x8c\x16\x3e\x6d\xab\xe6\x92\x58\x75\xd7\xe6\x20\x78\xd3\x41\x1c\xe2\x2b\x25\x8a\x3c\x6c\xdf\xcd\xb3\x7d\xb5\x2b\x6e\x0e\xab\xd2\x5f\xa0\x58\xed\x56\xbb\x3e\x78\xce\xb1\xb9\x50\x9e\x83\x8d\xd2\x34\x9e\x1a\x3a\xd9\x17\xc0\x21\xbe\x52\xba\xef\xc6\x4f\x85\x45\xf9\x82\x94\xeb\x1c\x7b\xc6\x93\xf6\x7c\x57\x6d\x54\xbc\xf7\x43\x9e\xe8\x60\xb6\x98\x18\x85\x44\x5f\xe0\x83\xeb\x82\x38\xc4\xe7\x6d\x88\xff\x16\x44\x1f\x6b\x39\x8c\xc1\xf0\x6d\x78\x24\xaa\xa9\x7a\x69\x73\xf3\xfb\xf5\x18\xae\x6f\x21\xd5\x8f\xd8\x84\x0b\x83\x5b\xe0\xba\x20\x0e\x69\xc2\xce\xf8\x5c\xf9\x52\xa1\x62\x62\x35\x6c\xf5\xb0\xde\x4c\x35\x4f\xfd\x0e\x31\x7f\x76\x69\xe2\x8f\x10\x1f\x6f\xf6\xd6\x88\x75\xe8\xfe\x50\x10\x07\xd5\x06\x02\x82\x30\xa8\x77\x3d\xc9\x03\x76\x16\xb5\xd9\xcc\xa6\xd7\xce\xe6\x89\x3e\x3b\x08\x78\x83\x91\x53\xfd\xfe\x06\xc5\xfe\x66\xba\x5e\xfb\xdd\xad\x58\x62\x27\x54\x4b\xa8\xe6\x16\xc0\x21\xbe\x53\x57\x17\xe5\xfb\x86\xbd\x43\x18\x8f\xe3\xe3\xaf\xdd\x1b\xa2\xcd\x4e\x2d\xc9\x3b\xe4\xf7\x34\xe5\x44\x19\xfb\x91\x23\xf9\xa7\x86\x09\xaa\xb5\x03\x70\x88\xef\x94\x93\x90\x2a\xb0\xd8\xbf\xef\xd3\xe5\x86\x91\x86\x98\xe8\x30\x8d\xf2\x0e\xbd\x6c\x4f\xad\x4e\x17\xe7\x25\xd3\x69\x33\x25\xb4\x7a\x68\xab\x25\x80\x43\x7c\x5e\x0f\xea\xb7\x94\x85\xa6\x45\xa8\x4f\x50\x97\x50\xfd\xbf\x53\x78\x47\x6a\x8a\xa3\x3d\x61\xa5\x7e\x29\xc3\xc6\x21\x73\xe9\xab\xce\x28\x5c\x17\xc4\x21\x3e\xef\x96\x9b\xaa\xc4\xf9\x58\x1c\x09\x6f\x5c\xc1\xcc\x12\x06\xee\x40\x3b\x03\xd6\x99\x00\x89\xbd\x0d\x7f\x7c\x92\x48\x0f\xa1\x0f\x36\xd0\x3d\xc2\x00\x0e\xaa\x0d\x04\x04\x61\xd0\x50\x77\x92\x07\xca\x08\xd2\xb5\xc9\x8c\x5f\x47\x9a\x0b\xd9\x8a\xfc\xa1\x46\x73\xe8\x2c\x99\xb2\xb9\xd3\x2b\xf6\x13\x47\x93\x5f\xf7\xac\xab\xcb\x17\x78\xdb\x41\x1c\xd2\x76\xf3\xf3\x18\x85\xbf\x7f\xd7\x27\x92\x10\x5c\x1b\xab\x8f\x7d\xb0\x91\xfe\x19\x36\xd7\x91\x15\x3d\x93\x6b\xe2\x34\x5f\xed\xcd\x03\x1d\xeb\x00\xe2\x10\xdf\xe9\x37\xa9\xee\x1f\x35\x37\xdf\x5a\x2a\xa4\x5c\xf6\x7c\xb6\xc8\x48\x1f\xc7\xeb\xa5\xf3\x2c\x44\x84\x86\x85\xec\xc2\x48\x26\xb9\xc5\x14\x5c\x17\xc4\x21\x3e\xef\x6b\xea\xbe\x82\xe7\x3f\x3e\x5b\xb7\x62\x8a\x0f\xfc\x0a\x48\x61\xf0\x55\xf2\xa6\x10\x6b\x2e\xa8\x2c\xc1\x23\xca\x9d\xa9\x75\x80\xce\x4d\x04\x71\x88\xcf\xeb\xcc\x9c\x30\xf6\x3a\xab\xc0\xbb\x53\x3a\xfc\xda\x15\xde\x59\xed\x3d\xfe\xde\xce\xb0\x45\x7c\xc7\x82\xc4\xdf\x0a\xaf\x9b\x47\x22\xe0\x1e\x00\x71\x50\x3f\x00\x08\xc2\xa0\x79\xc7\x49\x1e\xd8\xbf\x15\xf6\x3e\x9c\x4b\xb8\x67\xda\x83\x0d\x03\xf7\x9c\xd8\x2d\xda\x77\x0c\xed\x5a\x0b\x14\xe5\xb5\x0b\x44\x95\xd5\x38\x8a\xd5\x50\x4d\x3f\x80\x43\xfa\x33\x30\xf6\x36\xea\x42\xc0\x0f\xaf\xb3\x9c\x76\xcd\x37\x89\x5f\x38\x31\x4e\xe8\xbc\xef\x42\xa1\x66\x2a\x36\x4d\xe0\xe4\x67\x6e\xa1\x82\x4e\xa3\x06\x70\x88\xef\x94\x4c\x2e\xbd\xeb\x3d\xb5\x75\x98\x0f\x77\x2f\x89\xe6\x8a\x93\xf5\x8e\xca\x76\xa9\x94\x82\x3c\xc5\x1f\xae\x47\x12\xc6\xf1\xe6\x50\x3f\x00\xe2\x10\x9f\x57\xa1\x61\x65\x9a\x03\x4d\x48\xb1\x62\xb3\x1f\x9b\xae\x86\xc2\xbe\x92\x39\x45\xa4\x52\x46\xa9\xe6\x7e\x43\xf2\x72\x27\x35\x21\x74\x1a\x35\x88\x43\x7c\xde\xa2\xdb\xb6\x16\xaa\x9c\xd1\x9d\xd1\xfe\x15\x65\xbb\xef\xad\x94\x5c\x4c\x63\x56\xf7\xca\xd5\xf2\x05\x3f\xd8\xfc\xa0\x9f\x73\x5a\x86\x7b\x00\xc4\x41\xfd\x00\x20\x08\x83\x42\xd4\xc9\x41\xd8\x99\x23\x86\xfa\xc1\x78\xee\x7a\x72\xdc\x5e\x1f\x2f\x2d\xe1\xb7\x92\x56\xd9\xa8\xa9\x57\xbf\x02\x30\x0c\x66\xbe\x33\x1c\xbc\x15\x81\x87\x4a\x10\x87\x1c\x84\x3f\x28\xb8\xd7\x3a\x52\x48\x4a\xb6\x7b\xe0\x1d\x48\x38\x04\xe9\x8e\x3c\x97\x57\x99\xee\x9b\x1f\xc1\xfe\xfa\xbc\xfe\xeb\x92\xf8\x16\x5c\x19\xc4\x21\x07\x61\x89\xe2\x9c\xc8\x29\x87\x5f\x57\x08\xf4\x2d\x16\xcf\x64\xc6\x39\x06\x87\xc8\xfb\xb9\xdf\x3a\xff\x51\x91\xeb\x01\x36\xf5\xd9\x31\x14\xe8\x18\x2e\x00\xf7\xff\x82\xf0\xb1\xbb\x9f\xff\xf5\x3d\xc2\x5a\x9a\x0f\xba\x9d\xef\xae\x39\xeb\x7d\xa6\x2d\x28\x36\xad\xea\x25\xe3\x74\xb1\xd5\xeb\x99\xa0\xaf\x68\x48\xe7\xb5\x8d\x8c\x4e\x3c\x1a\x84\x53\x43\x9c\x45\x13\xd5\xa4\x53\xc5\x67\x57\xef\xa2\x75\x70\xa9\xba\x6c\x17\x7f\xb4\x67\x3a\x14\x34\xa7\xb4\x29\x38\xaf\x78\x5e\xfe\xe8\x94\x97\xd9\xb3\x56\x64\xfa\xf2\x7b\x13\x6e\x87\xcc\x99\x44\x79\x46\x54\x5e\x2a\xcf\x37\x36\x15\xb3\x5e\xfa\x8f\xe8\xb3\xb0\x5f\x84\xfc\xd7\x82\x30\xa8\x69\x47\x6b\x84\x91\x82\x30\xe5\xeb\xfd\x0e\x0b\x11\xf4\x35\x9b\x19\xe7\x3b\x37\x7b\xab\x72\xd6\xc8\x2f\x11\x0c\xe9\x33\x3a\x8a\x8b\xa7\x0c\x54\xfd\x2a\x7a\x74\x2a\x8b\x95\x02\xc8\x4b\xb3\x7a\x9d\x2e\xa9\xc3\x99\x07\x26\xf4\xa3\x55\x4f\x15\x6e\x4f\xa7\x45\x67\xee\x5d\x96\x18\x7b\x5d\x20\x73\xf8\xe5\xf2\x7b\x6c\xfd\x53\x59\x9a\x45\x0e\xc2\x43\xef\x70\x6f\xd9\x90\xf0\x1d\xce\xb0\x4d\x56\x58\xbf\x6a\xa8\x6c\xb6\xa5\x0a\xf3\x5a\x30\x0f\xd8\x10\x66\x78\xfe\x6c\x56\x36\xfd\x54\x5a\xab\x8f\xf4\xb1\xf1\x05\x5c\xdc\xee\x18\x2e\xb4\xf6\x9f\x2b\xe8\x25\x97\x46\x39\xc2\x6c\x9c\x69\x50\x76\x4a\xc2\xd7\x8a\xdc\x0e\x2d\xf1\x65\x77\x4f\xa5\xb5\xc8\x41\xd8\xff\x9a\x5f\x74\x28\xfb\xa7\xe1\x04\x4b\x83\xf1\x89\x77\x6e\xef\x44\xd0\xa7\x6c\x2f\x1b\x8f\x36\x28\x7b\x8f\x90\xee\xa1\x2d\x5d\x3e\xb5\x20\x0c\x32\xd1\x49\x23\x5f\x0b\xf5\x2d\x0c\xb5\x2f\xa4\x65\x23\xf7\x62\xd9\x76\x76\xb7\xa6\x5f\xd2\xae\xef\x0b\x99\x65\xab\x25\xc8\x0f\x15\x3f\x0f\x62\xd2\x86\xf6\xad\x01\x38\xc4\x91\x64\x6a\x5b\x7c\x46\x5f\xd0\x91\x85\x23\x96\xc7\x8d\xe6\x0b\x97\x7b\xd4\xc0\x0c\x01\x57\x21\xc5\x5e\x9d\xf6\x28\x59\x57\xc2\x7d\x68\x36\x01\xe2\x10\x47\x92\x30\x0a\x23\x42\xae\x37\x75\x2f\x8d\x92\xab\xb6\xa8\xfd\xcf\x07\xeb\x49\x7b\x50\x6d\xa0\x72\x35\xd8\x7d\xef\x72\x54\xab\x37\x52\x87\xeb\x82\x38\xc4\xe7\x6d\x64\xd4\x19\xc7\x30\xb9\x90\xf9\xd5\xd2\x30\xf9\x86\x13\xb1\xc8\x56\xcf\x42\xef\x8b\x98\xe9\xc8\xc7\xae\x0e\x25\xea\xfb\xfb\x50\xe1\x29\x88\xf3\x95\x40\xf1\x3a\xaa\x7b\xf6\xea\xb7\x14\x51\xa7\xdc\x87\x77\x0f\xa4\x55\x86\x3f\x7b\x3a\x5f\xd6\xbc\xaf\xd6\x59\x36\xf8\x34\x34\xca\xb2\x40\x8e\x50\xf4\x06\x3c\x08\x83\x38\xa8\x46\xf8\x9f\x83\x30\xe8\x07\x7d\x92\x05\x0c\xc3\x9e\xc8\x48\xa6\xe7\x34\x50\x25\xa9\xd9\xf2\xb8\xf3\x09\x55\xc6\x60\x49\x78\xd9\x0f\xf1\x93\x06\xb4\x09\x14\x99\x2b\x43\x5b\x0c\x41\x1c\x52\xb0\xdc\xe8\xe7\xe7\x6d\x92\x79\xe4\x6a\x11\x34\xac\xad\x51\x66\xd2\x54\x9b\x92\xc8\x88\xc2\xcc\xe3\xbf\x96\x38\xf5\x71\x90\x0b\x1d\x0a\x96\x00\x0e\xe9\xe0\xf0\x8c\xa6\x61\x5b\xf3\x9f\x81\x9d\x4b\x59\x56\x11\xcc\xcb\xbe\xcd\x97\xdc\xc4\x71\x84\xd9\x7e\x76\xbd\xbe\xae\x29\xb6\x72\x03\x5a\x0d\x04\x71\x88\xcf\x2b\x6f\x7c\x0b\xa6\x56\x4e\x54\xe3\xfa\x5b\x71\x38\x5a\xf3\xc3\xb7\x00\x36\xeb\xe1\x6a\x3b\x5f\xb7\xab\x15\x1b\x76\x86\xba\x41\x7a\x70\x5d\x10\x87\x68\x01\x27\xca\x97\x76\x74\xb7\x30\xe8\x9e\xea\xe9\xc9\x53\xf8\xf4\x38\x73\xde\xf9\xd4\x84\x5f\x71\xed\xbb\xef\x5a\x4e\x87\xca\x65\x6d\xa8\x2e\x0c\xc4\x41\xb5\x81\x02\xff\x3c\x01\x06\xf5\xae\x27\x79\xa0\x57\x42\x1d\x25\x09\xc7\x09\xd6\x7e\x2e\x86\x0c\x0d\x75\xfb\x46\x8b\x96\xbe\xe8\x83\xba\xd6\x03\xd2\x14\x92\xe6\xf7\x92\x11\xd0\x3d\xc2\x20\x0e\x69\x43\x44\xd4\x04\xe6\x41\x31\x1a\xe1\x8f\x75\x8a\x85\xef\xaf\x70\x2a\x96\x7c\x58\xd5\x82\xff\x9c\x51\xc5\xc3\xf3\x79\x3d\xfa\xc7\xf4\x10\xae\x0b\xe2\x10\x3d\x70\x27\xee\x30\xba\x1a\x8d\x97\x94\xd7\xe6\xa3\x22\xbd\xf0\x4d\x4e\x7e\xa7\xc9\x6e\xfc\xad\xa8\x3c\x02\xe7\xa4\xf1\xef\x06\x9c\xd0\x77\x05\xe2\x10\x9f\x37\xd8\x92\x28\xd5\x34\x9f\x60\xd5\x4e\xb2\x17\xa3\xde\xc3\xdf\xa0\xaa\xe9\xe1\x4f\x2b\xb9\xd8\x61\x9a\xbd\xc9\x43\xe6\xfd\x85\x76\xb8\x2e\x88\x43\xf4\x00\x8f\x9a\x40\x40\x8a\x42\x2c\xbe\x7b\xd4\xa5\xbd\x5e\x16\x94\xe9\xd7\x8d\x38\xbe\xc4\xfd\x6d\xfc\x2c\xa3\xb2\xa6\xfe\xa1\x69\xd0\x04\x18\xc4\x41\xb5\x81\x80\x20\x0c\x1a\xea\x4e\xf2\x40\xf5\x05\xa2\x52\xba\xf8\xb3\x2d\x8a\xd7\x73\xca\x6f\xb0\xd8\x4c\x0e\x61\x8a\x7f\xd1\xf7\x55\x71\xf1\x28\xf2\x89\xd4\x8c\xc5\x7f\x06\xd5\x45\x02\x38\xc4\x77\xea\x67\xf0\xa1\xd4\xa1\xf5\x6c\x97\xd8\x73\x46\x9d\xc7\xf4\x34\xb7\x38\x51\x83\xbe\x64\x3c\x10\xa9\xeb\xfa\x13\xb2\xd0\xe6\xe7\x09\xd5\x08\x83\x38\x44\x0f\xd0\x48\x25\xbf\x33\x88\x30\xb1\x1c\xfe\xfd\xdb\xdc\x8f\xb1\x1c\x07\xef\xfa\xba\x14\x36\x8c\xd5\x50\x39\xf7\x22\x83\xcb\xf8\x4c\x13\xb4\x8d\x17\xc0\x21\x3e\x6f\xe1\x2b\xa1\xad\xba\x65\x21\x67\xed\x89\xce\x09\x98\xb8\x07\xb6\x0c\x85\x4e\x96\x0e\x51\xef\x66\x68\x79\xc2\xc2\x82\x91\x37\x54\x27\x0e\xe2\x10\x3d\x50\xf6\x42\x86\xab\x51\x41\x5a\x74\xe0\x7c\xcd\xfd\x0e\xa6\x52\x3b\xdc\xa7\x7c\x26\xe9\x2a\x0d\xd6\xaf\xcd\x82\x12\x02\x3f\x3e\x78\x01\xf7\x00\x88\x83\xfa\x01\x7d\xc0\xf6\x78\xc0\xbc\xe3\x24\x0f\x34\x4c\xfa\xab\x94\x44\xc6\x0b\x72\xdd\xbf\xed\x15\x19\x07\xfb\x7d\xd5\x8a\x4e\xae\x98\xf6\xf7\x38\x61\x56\x2b\xd3\x97\xef\x06\xb8\x50\x9f\x0d\xe0\x90\x6a\x6e\xf3\xab\x4b\xc6\x46\xbc\xe6\x0c\x09\xcb\xed\x92\x22\xc3\xe8\xf3\x78\xac\x48\x17\x9b\x9b\xdf\x72\x3e\x63\xf3\x25\x21\xf8\x0a\x5d\x49\x05\xe2\x10\x3d\xc0\xe5\xe7\x90\xc1\xa2\xf0\x8c\xb4\xfc\xa2\xf7\x45\x81\xc5\xbb\x1f\xd4\x0a\x89\x63\xef\x5f\x59\xc6\x78\x9a\xef\xc6\xdd\x92\x27\x2c\x03\xd7\x05\x71\x48\x67\x7d\xe6\x92\xd0\xe1\x97\x54\xb0\x58\xab\xc7\x38\xd4\x28\xd3\xb0\xec\xe5\xa2\xcf\x8a\x57\xe8\x48\x87\x25\x4b\x3a\xa6\xa4\xb3\x33\x40\x67\x7d\x02\x38\x44\x0f\xe8\x8b\xf2\xa6\x61\x1c\xaa\xfc\x16\xfb\xb9\x61\xf7\x76\xcc\x46\xdd\x0a\x7b\xa3\x6b\x32\x4d\xc4\xaa\xf2\x4d\xe0\xd7\x25\x65\x1e\x68\x45\x18\xc4\x41\xfd\x00\x20\x08\x83\x42\xd4\xc9\x41\x38\x25\x1d\x9b\x77\x72\xc7\x11\x8f\x50\x67\xe7\xa6\x99\xd8\x05\xd6\xb9\x4f\x33\x26\x5f\x5a\x7a\xec\xef\xae\x2e\xd7\xbb\xc7\xa4\xba\x42\xf5\xb6\x00\x0e\x39\x08\x27\xc5\x71\x10\x9a\xf1\x26\x56\x92\x70\x1c\x64\xc9\x30\xef\x2a\x65\xd6\xda\x85\xaa\xe5\xfe\xa1\xbc\x61\xb4\x5b\x66\xf9\x61\x38\x08\xae\x0c\xe2\x90\x83\xf0\xb7\xc7\x83\xb8\x55\xd9\x9c\xee\xe9\x8d\x42\x7d\x5b\x49\x1a\x94\x3a\xa6\x12\xe6\x38\xfd\x6f\x7d\x9c\xa6\x3e\x5c\x7c\xb7\xfa\xec\x26\x74\xf7\x31\x80\xfb\x7f\x41\xf8\xd8\x77\xf6\xaf\xef\x11\x86\x85\x1c\xaa\x2f\x72\xa7\x48\xa1\x62\x5c\x2e\x55\x8d\xcb\xad\x2a\x1e\xfe\xa5\xc9\xe4\xbe\xf8\x41\xf4\xde\xc0\x23\x0b\x8d\xfc\xf6\xa3\x41\xf8\x15\x4b\x45\xa6\x88\x7c\x7e\x37\xee\xf8\x79\x8f\xe5\x36\xb7\xba\x14\x98\x0e\x57\xc6\xe7\x85\xe6\x96\x49\xee\xf1\x7a\x0d\x16\xae\xa3\x3b\x54\xbc\x39\x1a\xcb\x2a\xf4\x3a\x97\x8d\x0c\xed\xc9\x85\xe4\x42\xf1\xf1\x6e\xf2\xf1\xb8\xe3\x1b\xf9\xe6\x12\x7a\x08\x90\x9b\x28\xfd\xd7\x82\x30\xa8\x69\x47\x6b\x84\x91\x82\xf0\xc3\xf3\xfa\x2c\x6d\x99\x5a\x6d\x30\xe3\x11\x6d\xbf\x29\xdb\x34\x6b\x3f\x9d\xb5\x35\x5c\xcf\x16\xd9\x1f\xdc\xca\xcc\xb9\x37\x26\x4f\x65\xb1\x12\x39\x08\x57\x73\xdb\x1d\x90\xd3\xe3\xa2\xa2\x74\xdb\xc7\x4b\xb5\x0e\x9f\x79\x4f\xa5\xf0\xe6\x6c\xf9\xd2\xa4\x6d\xd9\xe2\x98\x42\x4e\xab\xc7\xa9\x2c\xcd\x22\x07\xe1\x03\x51\xdc\x55\x55\x25\x22\xa5\x0f\x26\x92\xd6\xe7\x4d\xcf\x5b\x69\xdb\x58\x94\xcd\xd3\x07\x08\x2a\x5e\x3f\x1b\xc3\x2a\x56\x57\x73\x2a\xad\x45\x0e\xc2\xd3\xe6\xe3\x8a\x25\xb0\x27\x61\x7f\x9c\x64\xe8\x98\x0f\x74\xfd\x86\x2e\x05\x9b\x31\x24\x7b\x0a\x14\x57\x28\x2f\x4d\x38\x2d\xa5\x9e\x4a\x6b\x91\x83\x70\x93\x29\x9b\xdd\x2d\x4a\xc7\x46\x66\x93\xb1\xaa\x6b\xd3\x78\x24\x7f\xea\x2a\x29\xba\xd0\x8c\xe8\xb4\x6d\x33\x18\x25\xb3\x4d\xbf\x9e\x5a\x10\x06\x99\xe8\xa4\x91\xef\x3b\xf1\xdc\x74\x65\x8d\x47\x17\x4e\x2f\x57\xe3\xc1\xbd\x8e\xc2\x3d\x87\xa6\x2b\x8a\xd6\xdf\x39\xec\xde\xce\xa0\xb3\xb7\x94\x7a\xc1\x7b\x7c\x10\x87\x38\x92\x98\x1a\xf4\xec\x5a\x0e\x64\xf4\xf3\x3b\xfe\x74\x62\xa8\x78\x10\xdf\x12\x39\x4a\xb9\xbd\x9c\x20\x4b\xa1\x0e\x5b\xf2\xf9\x84\x05\x2d\x03\x80\x38\xc4\x91\xef\x8f\x9a\xa4\xb1\xd5\xf2\xb9\xd6\xfe\x4f\xe4\xb9\xd9\x1f\x7d\x99\xee\xfa\x30\xde\x50\x68\xb5\xf7\xbb\x7e\xd3\x8b\xb5\xf7\x4b\x50\x26\x5c\x17\xc4\x21\xde\x6b\x40\x87\xf6\x30\xc6\xf9\x7a\x5c\xec\x9c\x3c\x1f\x73\xba\xb7\xd5\x33\x85\xdc\x91\xe9\xb4\xc3\xd7\x02\x32\x99\x4e\x17\x93\x84\xd6\xa1\x43\xb8\x40\x9c\xaf\xc4\xf1\x4b\xe8\xc6\x79\x1d\xc5\xfd\xfd\xee\xf0\x7f\xba\xf6\xa3\xa5\x2b\x4d\xf7\x75\xaf\x4f\x34\xce\x3b\x1f\x6f\x99\xd1\x25\xcd\xd1\x87\xc2\x99\x3e\xf0\x20\x0c\xe2\xa0\x1a\xe1\x7f\x0e\xc2\xa0\x1f\xf4\x89\x27\x85\x52\x6b\x6a\x35\xb8\x24\x11\x6e\x55\x46\xee\xe0\xdc\xba\x77\x7e\xf7\x8c\xef\xd3\x99\xb0\xa1\xe7\x4f\x77\xea\x03\x1e\x12\xb0\x42\x27\x06\x83\x38\x44\x0b\xcc\xbf\xba\x4c\x87\xc1\x42\xb2\xa7\xb2\xa3\x75\x2b\x68\x76\x27\xcd\xd8\xae\xf2\x29\xb1\xea\x0f\xb7\x45\x8c\xa9\xe4\x8a\xbb\x0d\x77\xe1\xba\x20\x0e\xd1\x02\x09\x37\x7c\x6d\x1b\xd5\x19\x78\x5e\x05\xf4\xea\xdd\x50\xda\xa8\x0d\xda\x7b\x58\x18\xeb\xcb\x94\x74\x4e\x12\x73\x6c\xca\x79\x03\x3a\x90\x1c\xc4\x21\x5a\x40\x2e\xda\xb1\xd8\xed\xda\x44\x8b\x7a\xc1\xad\xd5\x7a\x93\x6a\xdc\x5a\x0c\xe6\x73\x76\x96\xd7\x7b\xa2\x36\x52\xf3\x7d\x24\x4c\xa1\x15\x6c\x10\x87\x68\x81\xb7\xab\xe5\x82\x66\x55\x59\x0c\x4d\xd2\x16\xd7\xf1\xda\xdf\x38\x78\x48\x9b\xe2\x5b\xb2\xee\xbd\x7c\x2d\x25\xd4\xfa\x31\x84\x12\x9a\xfc\x80\x38\xa8\x36\x10\x10\x84\x41\xbd\xeb\x49\x1e\x10\x42\x49\xd2\x19\x7f\xa8\x94\x5e\x67\x67\xa7\xa0\x7b\x96\x95\x30\xd0\x3c\xee\x17\xd6\xa1\x46\x3c\xeb\x5c\x18\x03\x8b\x4b\x2c\x14\x58\x41\x1c\xa2\x07\x56\x45\x97\x7b\x0b\xf1\x42\x3d\xef\x61\x0f\x2c\xbe\x78\x5c\x9f\xd7\x3b\xa7\x62\x34\x42\x13\x38\x4d\x2d\xb6\x73\x61\x68\x36\x18\x3a\x84\x0b\xc4\x21\x7a\x20\x46\xee\xc9\xc3\x05\x7e\x6d\x9c\x54\x65\x31\x96\x0a\x8a\xe4\x7b\xaf\x78\x49\x14\xb2\x9e\x5e\xd2\xb0\x51\x2e\xcf\xb6\xf3\xa7\x87\xfe\xbc\x01\x71\x88\x1e\xb8\xdd\xb3\x3a\x72\xf1\x70\xe3\x7a\x95\x21\x7b\x75\x87\xc7\xe0\xb7\xe0\x45\xb7\xfd\x33\x5f\x18\x18\xf5\x07\xd6\x12\x14\x7f\x77\x43\xf5\xac\x20\x0e\xd1\x03\x52\xb9\xf1\xf4\x79\x8a\x5a\x68\x13\x52\x38\xdd\x30\xbf\xd7\xc3\x6a\xa3\x0d\x5f\x25\xd1\x3c\xc5\x56\x6f\x4a\x91\x6d\x86\xef\xc8\xc3\x3d\x00\xe2\xa0\xda\x40\x40\x10\x06\x0d\x75\x27\x79\xc0\x7a\xff\x5d\x7e\xcd\x1b\x58\x81\xed\x2a\x71\x43\x34\xa3\x01\x25\x4b\x98\x94\x4b\x4a\xa3\x68\x92\x2e\x8f\x14\xde\x6d\xf7\x21\x28\x08\x83\x38\xa4\x9b\xf4\x32\xfa\x76\xb3\xda\xbc\xb0\x27\xd8\x5d\xa4\x3e\xdc\x89\x88\xfe\x4e\xa9\xdf\x4a\xcb\xbe\x73\x5e\x36\x77\x86\x3c\xfb\x02\x0b\x74\x08\x1d\x88\x43\xf4\x00\x23\x6d\xf9\x87\x1e\x4c\xa1\xd0\xec\x6a\x2d\x72\xa7\x62\x5f\xad\xd4\x4b\x41\x67\xc3\x7e\x2c\xd4\xe7\x51\xfb\xbc\x8f\xe1\xe2\xba\x01\xd7\x05\x71\x88\x1e\xb8\xfa\xf3\x55\x48\x0d\x8e\x6b\x4d\xc8\x4c\xdb\x1c\x79\x49\x5c\x8a\xd8\xe0\xbe\x6c\x61\xa9\x7e\xcd\x36\x83\x9d\xd3\xe3\xc4\xda\x1d\xb8\x2e\x88\x43\xf4\xc0\x62\x5c\xf9\xef\x1b\x23\xec\xc9\x58\xcf\xb3\x8a\x48\x17\x3c\xc8\x38\xa2\x22\xce\xa6\x4b\xbd\x1c\x43\x17\x24\x1b\xd9\xbd\x9a\x34\x04\xf7\x00\x88\x83\xfa\x01\x40\x10\x06\xcd\x3b\x4e\xf2\x00\x59\x6d\xbd\xbf\x26\xac\x76\x69\xc5\xbd\x9d\x70\xfb\xdc\xf5\x70\x76\xce\xd6\xa8\x34\xfd\x97\xf9\xa8\x0f\xb7\x0b\xc6\x69\xa8\xa0\x93\xfe\x41\x1c\xa2\x07\xd8\xc9\x51\x68\xeb\x93\x09\x93\x43\xf2\xa4\xd9\x71\xa5\xcf\x73\x9d\x57\x0e\x8b\x8d\x97\x9e\x31\x7b\x51\xa5\xc1\x62\x14\x35\xf0\x00\xae\x0b\xe2\x10\x3d\x10\x1f\x5b\x2c\xad\x15\x26\x82\x9f\x15\x96\xc7\x8a\xea\x87\xf6\x23\x9f\x94\x47\x5b\xaf\xfe\xe3\xbc\xa7\xfb\x4a\x7a\xb9\x46\x36\x3d\x5c\x17\xc4\x21\x7a\xe0\x97\xd9\x9a\xff\x88\x4d\x27\xfa\xf3\x86\x2b\xbf\x75\x3d\xa8\xb3\xdc\x89\x69\x46\xf7\x87\x5f\x48\xfb\xee\xbc\xdb\x7d\x3c\x60\x9d\x06\xd7\x05\x71\x88\x1e\x60\x89\x89\x5d\x64\x0c\xec\x58\xaf\x11\xb5\xa6\xe2\x46\xdf\x21\xb3\x61\x62\x1c\xb9\xc3\x7b\x8f\x33\x84\x2d\x71\x62\xeb\xa6\x8c\x06\xdc\x03\x20\x0e\xea\x07\x00\x41\x18\x14\xa2\x4e\x0e\xc2\x9f\x08\xbb\x7a\x13\xe4\x44\x6f\x76\xcd\x57\x98\xf9\x92\x3c\x7c\x46\xe9\xd8\x83\x21\xce\xfe\x23\xef\xab\xf7\xf6\xcc\x28\x11\x5a\x26\x3c\x54\x82\x38\xe4\x20\x9c\xc2\xe6\xf3\xb0\xe8\x8e\xff\xc7\x04\x9e\xca\x6b\x3f\x5b\x3f\x6b\xe2\xae\x14\x4a\xbf\x16\xfe\x16\xfc\x95\xc9\x79\x5b\x3c\xa2\xab\x04\x8a\xd8\x00\xce\x57\xea\x7f\xed\x3d\x16\x84\x27\xb1\x67\x72\x86\x0b\xe8\xed\x02\xbd\x50\x29\x65\x3d\xb8\x7b\xcf\x5e\xeb\x18\x52\xe7\xc7\xee\xb6\x67\x4c\x29\x7b\x70\x91\x12\x0a\xc2\x00\x0e\xf9\x6d\xfc\xeb\x7b\x84\x75\xdd\x8a\x85\x2c\x2f\xa5\x39\xd3\x4a\xe7\xdb\x4d\x6d\x46\x64\x48\x5b\xfb\xbf\x57\x0c\x92\x90\x08\x6b\xa4\x98\x09\xb0\x11\x92\x3e\x1a\x84\x03\x83\x5b\xab\x74\x1d\x6e\xca\xa6\x8d\xd3\x5a\x99\xed\x92\xb2\x4c\xbd\xd7\xb7\x0f\x7d\x3d\x5d\xc0\xc2\xdb\xd6\x8b\x7b\x99\x41\xed\x68\x10\x4f\x37\xf2\x9e\x0d\x3c\x1f\x5e\x16\x5f\xe3\x40\xd5\xfc\x4a\x5f\x3e\x88\xcf\x8a\xf3\xd3\x55\x55\xde\x96\x0b\x3e\x9c\x0d\x1d\xba\xff\xb5\x20\x0c\x6a\xda\xd1\x1a\x61\x79\xc4\xb0\xc4\x2a\x48\xcb\x4c\xc9\x23\xff\xe9\x4a\xd2\xb9\x72\x47\xbd\x55\x7c\xff\x3a\xf7\xb6\xdd\x28\x6b\xfd\xce\x22\x6a\xb9\x85\x35\xaf\xee\x53\x59\xac\x44\x0e\xc2\xb3\xcb\x95\x32\xcd\x8c\x66\x8c\xba\xef\x17\x63\x53\x7e\xbb\x2f\xbe\xdc\xc8\xa8\x7f\x1f\x6b\xad\x23\x40\xf2\x76\x4a\xc8\xf3\xdb\xa9\xec\xc8\x46\x51\x45\xfa\x58\x16\xdd\x97\x34\xef\xbc\x71\xbf\xb5\x8f\xdc\xd3\xcc\xb9\xf8\x23\x56\x64\x8d\xb5\x27\x46\xe5\x46\x80\xe9\xef\x87\x46\x30\xba\x39\xda\x53\x69\x2d\x72\x10\xb6\x28\xed\xc2\x7b\x72\x28\xf7\x94\x5a\x2d\x67\x67\x2d\x19\x57\x6c\x56\x57\x7f\x06\xff\xb2\x93\xad\xfe\x46\xdd\x46\x57\x6a\x52\xce\xa9\xb4\xd6\x05\xe9\x63\x65\x6a\xd8\x99\xae\x59\xe0\x5e\x63\x63\x61\x86\xe5\xee\x6e\x8d\xd8\xef\xb4\xc8\x17\xfc\x1c\x78\x20\x78\xb1\xf7\x09\xae\x95\x08\xcb\xa9\x05\x61\x90\x89\x4e\x5c\x0e\x74\x56\x70\x4b\xff\x5a\xa1\xe2\xe4\x67\x38\x1d\x44\x65\x41\x27\x7d\xe1\x40\x40\xac\x91\x2b\xce\xd2\xd5\x5a\xbc\x46\x8a\x12\xba\x39\x1e\xc4\x21\x8e\x7c\x6b\x1a\xe5\x68\x53\xc1\x6f\x7c\xe6\xa4\x3c\xde\x55\xe4\x9a\x1e\xde\x9d\x7a\x1e\x51\x7d\x03\xbb\x93\x17\x5b\x61\xbc\x98\x88\x32\x0c\xae\x0b\xe2\x10\x47\x3e\xf5\x06\x0b\xea\xea\x00\x8b\x4c\xbb\x73\xd1\xf3\x33\x28\x62\x0a\x36\x5e\x6d\xfb\x05\xe2\x57\xeb\xaa\xc3\xe7\x68\x3d\xf5\x89\x93\xe0\xba\x20\x0e\x71\xe4\xc3\xfd\x34\x51\xbe\x43\x54\x7d\x71\xd2\x63\xb6\x31\x54\xd7\x66\xd5\x83\x34\x91\xdc\xf9\xa9\xc1\x3e\x4f\xee\x5e\xfb\x7a\xbc\xbe\x26\x5c\x17\xc4\x21\xde\xc3\xc0\xfe\xe6\x39\xbe\xd8\x6c\xc3\xee\x82\x78\x90\x6e\xc7\x7c\x7a\x32\x87\x79\x61\x93\xd9\xa6\xb3\x72\x55\x56\xc4\xaf\x6d\xeb\x14\x61\x78\x10\x06\x71\x50\x8d\xb0\xfc\x3f\x4e\x7e\x40\x3f\xe8\x93\x2c\x30\x10\x95\xcf\x23\x2b\x66\x78\xc3\xc8\x56\xc7\xd7\xe8\x49\xfa\x35\x4a\x5e\xce\xe1\x67\x07\x1b\x61\xbc\x93\x37\xde\x87\x4d\xfb\x9a\xc0\x9b\x0e\xe2\x90\xb6\x44\xce\xf7\x08\x0f\xf7\x5e\xb5\x42\x7d\xa8\x34\x73\xed\xab\x22\x76\xf5\xa5\x96\x15\x26\xf3\x1b\x58\xaf\x37\xd9\x22\x1e\x27\x5c\xd9\x80\xb6\x44\x02\x38\x44\x0b\xf4\x3f\x62\xb6\xae\x1a\x7d\x6b\x8a\x2f\x24\xdb\x24\x30\xee\x72\xcf\x3a\xa3\x54\x18\x23\xde\x91\xb4\xad\xb1\xb5\xbd\x6b\x5b\x1e\xaa\x0d\x04\x71\x88\x16\x88\x12\xd1\xcb\x9c\xd7\x5d\x2d\x31\xf2\x2c\x69\x2f\x22\x4e\xbf\x38\x3f\x10\xae\x63\xcf\x36\x81\x32\x6e\x72\xd8\x76\x58\xc9\x41\x02\x9d\x9c\x0c\xe0\x10\x2d\xc0\xe3\xfd\x62\x8e\xa2\x71\xf9\xc1\x97\x9f\x2f\x69\x71\xbf\xe0\x06\x5e\x15\x6c\x5b\x76\xab\x5f\xb5\x41\x97\xbf\xb7\x15\x9b\xae\x70\x0d\x5a\x0d\x04\x70\x50\x6d\x20\x20\x08\x83\x7a\xd7\x93\x3c\xc0\xca\x58\xf9\xda\xba\xbc\x80\x82\xab\x95\x5b\x28\xeb\xe1\x60\xf1\x7b\x4d\x52\x63\x6f\xdb\x96\x0b\xd7\xaa\x94\x57\x49\xc8\x7c\x56\xe0\x6d\x07\x71\x48\x47\x05\x90\xcf\x56\x7b\x28\x12\xe7\xaa\x49\x45\xc8\x17\x71\x55\x66\xcd\xde\x14\xc2\xe6\x2b\x59\x2b\x57\x1b\xe8\x7d\x74\x66\x13\x0b\x3a\x7c\x07\xc4\x21\x7a\x60\x50\x77\x85\xf1\xbc\x42\xb3\x3b\x2b\x71\x75\x88\xf1\x6a\x40\x3c\x83\xbd\xf0\xb4\x8e\xa2\x35\x96\x83\xa7\x32\x47\xf2\xca\x14\x74\x6d\x0a\x88\x43\xf4\x80\xf6\x56\x89\x36\xd9\xf2\x45\xec\x46\xb9\x4b\xb4\xc2\x11\xf6\xbf\xa8\x86\x3d\xd8\x5f\xbd\xea\x3f\xef\x86\x9f\xd1\x49\xa0\xed\x07\x4d\xd8\x41\x1c\xa2\x07\x34\x3f\xaa\x1e\xaa\x34\xbb\xdc\x52\x25\x8a\x0a\xf1\xea\x2d\xfc\x9a\xb0\xb4\x64\xa8\x45\xa1\x7a\xb8\x39\x16\xaf\xf9\xa4\x96\xc8\x09\xee\x01\x10\x07\xd5\x06\xaa\xfe\xb3\x07\x40\x43\xdd\x49\x1e\xc8\x13\x21\x77\x92\xc6\x3f\x70\x37\x9d\xc1\xb7\x90\x70\x11\x36\x7b\x94\x6d\x4a\x1f\x5f\x50\xe2\xc2\x87\x19\x56\xbe\x26\x27\xf0\x18\xde\x76\x10\x87\x74\x81\x00\xb7\xaf\xc0\x82\x08\x77\xf0\xef\xf6\x71\xe3\xca\x2d\x9c\x60\xd9\xfe\x2e\x9e\x82\xf3\x2f\x18\x0a\x72\x32\xa3\xed\xd4\xc6\x0a\xe1\xba\x20\x0e\xd1\x03\x65\xc6\x32\x5f\x08\xe3\x4a\xd9\xce\x46\x0e\xda\x59\x8c\x2e\x7e\x7c\xbd\xef\xab\xcc\xf6\xdc\x9a\xbe\x2c\xbc\xc4\xee\xbb\x2b\x86\x06\xb4\x95\x1b\xc0\x21\x7a\xc0\x53\xae\x8f\x2d\x33\x43\xa5\x87\x25\x88\xd2\x00\xd5\x2c\xfe\x96\xa4\xe5\xd5\xb5\xf7\x5a\xc1\xd7\x49\xed\x60\xd1\xa2\xe7\x8c\x66\xa1\x33\x08\x00\x1c\xa2\x07\xb0\xff\x8c\x87\x30\xa6\x77\x18\x26\xb4\x3e\x79\x79\xff\xea\x45\xb5\xdb\x7f\x56\xf0\x9d\xfa\xb4\x07\xa7\x72\x3f\xd4\x61\xdc\x48\x4c\x81\x7b\x00\xc4\x41\xfd\x00\x20\x08\x83\xe6\x1d\x27\x79\xe0\x8e\xc3\x0d\x9d\xc3\x11\xc1\x54\x9f\x00\x56\xf5\x16\xe9\xb4\x87\xf5\xfe\x9c\xd9\xaf\x82\x3f\xe0\x39\x2b\xaf\xb1\x71\x97\xaf\xdd\x87\x76\x5a\x00\x38\x44\x0f\xf4\x50\x87\x64\xcc\x49\x13\x56\x94\xf5\x84\x0f\xa8\xd0\xf6\x71\xbe\xda\x25\xcf\x10\x3e\x77\xf5\xf7\xe4\xcf\xa7\xab\xa1\xef\x0d\xec\xe0\xba\x20\x0e\xe9\xac\x80\x12\xd4\x15\xc6\x73\x7a\x09\x25\x8d\x9a\x32\x44\x74\xa2\x2f\xe6\x36\x95\xfe\x48\xe3\xf2\xf3\x79\xf0\xe8\x12\x98\xf0\xcd\x07\x43\x67\x05\x00\x38\x44\x0f\x60\x72\xe9\x8f\x7e\x3f\xff\xa3\xa7\xdf\x72\x55\x95\xee\xee\xa5\xc9\x77\xaa\xaa\x97\xc8\x87\x50\x5f\x2b\x16\xa3\x2f\x2d\x54\x2d\xe0\xc1\x75\x41\x1c\xa2\x07\xd2\x5d\x7e\xc2\x52\x1e\xde\xce\x89\xfe\x13\x18\x4d\x9e\xc6\x4e\xe4\xf7\x96\x8d\x63\xed\xad\x20\x97\x57\xda\x62\x93\x52\xca\xa6\x28\xdc\x03\x20\x0e\xea\x07\x5c\xfe\x39\x08\x83\x42\xd4\xc9\x41\x38\xef\x77\x33\xa3\x21\x9d\xea\x6f\x6f\x2a\x29\x1c\x32\xaf\xd6\x7e\x3b\x6d\x2c\x4d\x53\xc6\x3b\xaf\xb1\x9b\x6e\xd6\xcf\x6b\x4b\xc8\xc2\x43\x25\x88\x43\x0e\xc2\x1d\x13\x54\xac\x9a\x26\xee\x09\x2e\xfb\xbd\x55\xb7\x73\xea\x30\x67\x99\x2e\x11\x4d\xfc\xc9\xad\x0e\xd7\xb4\x60\xff\x83\x41\x23\x08\x57\x06\x71\xc8\x41\x38\x0a\x5d\x8c\xa8\xa3\x82\xfd\xea\xf9\xb4\x80\x62\xea\xf0\xcc\x7e\xe9\x51\xa6\x2f\xe4\x9f\x2e\x39\x9c\x19\xe8\xe7\x3d\x98\x51\xd0\x82\x2b\x83\x38\x5f\x29\x2c\x84\xb7\xf1\xaf\xef\x11\x7e\x04\x5b\x2d\x7d\xda\x27\x82\xf1\x33\x84\x3b\x32\x88\x16\xc3\x69\x37\xcd\x5a\xb3\x49\x0d\xc7\xbe\x76\xe4\x17\x5e\x69\xf4\x5d\xf1\xa3\x41\xd8\x38\x9e\xdb\xc6\x1d\xbd\xe5\xcd\x40\xf8\xd8\xe2\x46\x61\xef\xc5\x77\xa6\x4f\x8c\xf0\x2f\xf8\x6d\xab\x6d\x26\x93\x6a\x25\x4c\x1a\x1e\x41\xdb\xbf\xc5\x28\x92\xb2\xed\x4c\x37\x11\x6b\xb2\x9a\x46\x24\xa7\xa0\x28\x7d\x5c\x16\x2e\xcb\xb6\xeb\xf1\xd8\xba\x62\x81\x6f\xc1\xfc\x5f\x0b\xc2\xa0\xa6\x1d\xad\x11\x46\x0a\xc2\x4f\x42\x1a\x32\xc5\xc4\x71\x13\xe6\x31\xbe\x2f\x97\x3c\xb3\xa7\xab\x12\xfe\x5d\x71\xb0\x46\xc0\xbd\xc8\xb0\xd5\xb7\x67\x32\x17\x76\x2a\x8b\x95\xc8\x41\x38\x85\xdc\xbc\xaa\x50\xb8\x7b\x1f\x76\x99\xec\xc5\x7b\x73\x83\xfa\x40\x23\xad\xa7\xdf\x1b\x28\xb7\xdc\x59\x1d\xca\xb5\x3f\xb5\x63\x9f\xca\xd2\x2c\x72\x10\xd6\x25\x51\x5b\xf9\x45\xe6\xc2\x59\x49\x0b\x7b\x40\xd5\x8c\xf7\x29\x9e\x46\x4e\x48\x41\x3f\x2e\xd1\x22\x74\xce\xe4\xa7\x43\x65\xcb\xa9\xb4\x16\x39\x08\xeb\x3e\x32\xf0\x51\x3e\x38\x90\x95\xbb\xf6\x12\x25\xa5\xc3\x91\x93\x9f\xec\x7a\x1a\x46\xfa\xfb\x9c\x8f\xa9\xe2\xb5\xdb\xbf\xe5\x34\x4f\xa5\xb5\xc8\x41\x58\xef\xac\x3b\xa9\x5c\x09\xc1\x9e\x92\x78\xe5\x7a\xe7\x5a\xc0\x4f\x3f\xa9\x24\x58\x9b\xb4\xeb\x7a\x14\x85\xdf\xfc\x9b\x41\x73\xc1\x53\x0b\xc2\x20\x13\x9d\x34\xf2\x25\x26\x5d\xd5\xff\x6a\xe9\x99\xe0\x22\xbf\xb4\x91\x74\x2b\x7f\x95\x5d\x56\x25\x62\x53\xc9\xd8\xaa\x23\x13\xf6\xae\xc4\xe4\x01\x07\xbc\xc7\x07\x71\x88\x23\x5f\x78\x8d\x69\xbd\xe2\x72\x99\x29\x56\xd2\x67\x94\x47\x0f\x93\xeb\x09\xa7\xc2\x7d\x82\xa8\x63\xfd\x1c\xa7\x67\xad\x1e\x5a\xf5\x8d\xc0\x75\x41\x1c\xe2\xc8\xf7\x0b\x77\x58\xe8\xd7\xe6\x59\xaf\x4f\xfb\x0d\x2e\x7d\x36\x0f\x56\x39\x1f\x75\x8a\x89\x52\xd0\x7a\xda\x4d\xc4\x9f\x0b\xf0\xbb\x02\xdd\x6d\x01\xe2\x10\x47\xbe\x8e\x04\xba\x73\xda\x97\x66\x07\xb1\x6e\x8e\x3f\x0a\xe4\x49\x0c\x0b\xb3\x28\xa5\x2f\xe4\xc4\x44\x4d\xe5\xf3\x39\x13\x54\xe5\x6a\x0f\xd7\x05\x71\xbe\x12\x28\x68\xc7\x6a\xb0\x3b\xb9\xb0\x9e\x53\x3a\xf3\xfb\x62\x52\x78\x1a\x98\xef\xae\x84\xdd\xbd\xa5\x38\x5a\xfb\xf5\x73\xca\xa8\x8b\x7b\x0d\x6a\x7a\x20\x3c\x08\x83\x38\xa8\x46\xf8\x9f\x83\x30\xe8\x07\x7d\x92\x05\x52\x0a\x74\x29\x6f\xda\xfc\xb2\xe5\xd0\xfd\xfa\x36\x3f\x2b\xc5\xf8\xd9\xd5\xf0\x30\xf2\x52\xdb\x2d\xb6\xba\x0f\x1e\x92\x98\xe5\xe6\xf0\xa6\x83\x38\xa4\xc3\x61\x82\x62\xe4\x1d\xbb\x5a\xea\xf8\x29\xb9\x6a\x0c\x7c\x31\xd6\x1e\xa1\xee\x61\x6f\xdc\x8c\x70\x26\xb2\x27\x8d\x94\x0c\xa4\x85\x56\x56\x40\x1c\xa2\x05\x66\xd0\x82\x2a\xec\x15\x27\x3e\x99\x1a\xde\xa4\xea\x76\xb9\xbf\x7e\x73\x4e\x86\x12\x93\xbd\x56\x23\x5c\xb0\xa8\x8e\x59\x3f\x1f\x9a\x00\x83\x38\x44\x0b\x68\xde\xcd\xd1\xa9\x63\x2d\xd3\x1c\x26\x4f\x0c\x78\xf1\x85\xac\x2a\xc9\x32\xb6\xb2\x55\xab\xa6\xc9\xbd\xee\x4e\x6c\xd5\xc5\x9f\x90\x65\x41\x1c\xa2\x05\x32\x36\xd5\x0f\x6f\x39\x9b\x97\xd0\xa0\xb2\xce\x1d\x88\xfc\x50\x0c\xd6\xe6\x08\x6b\x1c\xf4\x47\xad\xc8\x92\xa1\xff\xa4\x2f\xf6\x14\x3e\xf9\x01\x71\x50\x6d\x20\x20\x08\x83\x7a\xd7\x93\x3c\xc0\xb1\xd7\xfd\xd0\x26\x72\x35\xf6\x53\x76\x97\x68\xb1\x98\xab\xc9\xb7\xfc\x46\x7c\xc6\x97\x7d\x8d\x66\x5f\x5f\xca\x12\x72\xf8\x45\xc2\xdb\x0e\xe2\x10\x3d\x10\x98\x71\x87\xab\x49\x77\xb2\x97\xd8\xd6\x6d\xe9\xf3\x81\x5c\xbc\xb2\x6c\xa0\x1e\x96\xa7\xac\xb6\x74\xd7\xb4\x65\x37\xcd\x7d\xa8\xe6\x10\xc4\x21\xd5\xda\xc9\x5a\x3e\x88\x66\x8a\xb7\x37\x3b\x27\x20\xdf\x9b\x79\x49\x2b\x47\x8b\x01\x8d\x29\x65\x70\xf3\x43\xb6\x84\xcb\xca\x46\x20\x14\xae\x40\x1c\xa2\x07\x48\x96\xf7\xae\xbc\x57\x79\x4a\xdb\x87\x25\x73\x56\xfe\x5a\xe8\x07\x77\x1d\xd4\xdf\x54\x55\xa1\xcd\xe4\xe6\xe7\xe8\x52\x73\x5e\x41\xd7\xc7\x80\x38\x44\x0f\xd4\x0c\xe4\x0d\xcf\x3e\x7e\xf3\xf9\x3c\x3a\x89\x5d\xe3\xad\x7c\x4b\xb7\x5f\xa1\x77\x84\xd9\x52\x9e\xcf\xd1\x27\xcd\x31\xdd\x13\x67\x87\x7b\x00\xc4\x41\xb5\x81\x80\x20\x0c\x1a\xea\x4e\xf2\x80\x81\x02\x87\xa7\xe8\x93\xb1\xc0\xb6\x9f\x7f\x48\xa6\x26\x08\x87\xf5\xbb\x85\xea\x24\xc8\xba\xb5\x8d\xa4\x96\xd4\x1e\x7c\x7f\x04\xad\x06\x82\x38\x44\x0f\xf0\x19\xf3\x8d\x68\x12\x3a\x9b\xac\x2f\xa3\x5c\x48\xd3\xa0\x7b\x66\xa6\x60\x98\x76\x7b\xac\x41\xcc\xcf\xee\x6e\xc3\x4f\x73\x8c\x61\xb8\x2e\x88\x43\xf4\x40\xae\x5c\x98\x84\x74\xae\xd7\x1b\x22\xbd\x64\x37\xbe\x7c\xa6\xdc\xfa\xba\x59\x87\x0a\x7b\x93\xc9\x8c\xaf\x56\x52\x9f\xfe\xbc\x80\x74\x41\x1c\xa2\x07\x92\x04\x12\x77\x13\x72\xa3\x50\xee\xb3\xce\x71\xad\x1e\x70\x62\x34\x07\xa1\x3a\x5e\x0b\xb8\xd7\x3c\xc1\x83\xef\xfd\x4e\xb6\x10\x3a\x41\x1d\xc4\x21\x7a\xc0\x8b\x2c\x84\xb5\x96\xb3\x69\x2b\x01\x37\xae\xa5\x01\xd3\x69\x5d\x6f\x81\x9d\x8a\xef\x86\x5e\xa4\xd2\xe2\x50\xf4\xa6\x9f\x2d\xb4\x35\x1a\xc4\x41\xfd\x00\x20\x08\x83\xe6\x1d\x27\x79\x80\x7e\xa1\xda\xf9\xa1\x24\xc6\x55\x03\x12\x3a\xc5\xb1\x7a\x8b\x78\x96\x4b\x0f\xd8\xf8\x02\x31\xbe\xa5\x8b\x84\x30\xed\x30\x38\x41\x77\xca\x83\x38\xa4\x3f\xc4\x50\xfe\x08\xe7\x2e\x65\x7d\xf5\x74\x42\xe9\x73\xe5\xd7\xc5\x1a\xbf\x9f\xaa\x79\x4e\xee\x73\x2d\x1a\x0a\x51\x49\x8f\xa3\x7e\xfe\xff\xed\x38\xf9\x67\x0e\xd1\x03\x4b\x77\xe9\x68\x64\xaf\xcc\xba\x8d\xd7\xcb\x1e\x9e\xd1\xfd\xd0\x59\x26\x7e\x3d\xe1\x1c\xb9\xab\xb0\x01\x0a\xe6\xba\x3a\xc5\xc7\x12\xb8\x2e\x88\x43\xf4\xc0\xe1\xe2\x6d\x0c\xd2\x70\xc2\x8c\x84\xca\xbe\x14\x15\x72\x73\xc5\xec\x96\xce\x72\x3d\xc1\x2b\xcf\xae\xcd\x64\x64\xae\x1e\x08\x58\xc1\x75\x41\x1c\xa2\x07\xbe\xc6\xa8\x2f\xcc\x92\x92\x27\xc9\x99\x38\xae\xe8\x7e\xd9\xb9\xbf\xf7\x54\xef\xf7\x40\x99\x5e\xf2\xd4\x8f\x8e\x72\x22\xee\x14\x1e\xb8\x07\x40\x1c\xd4\x0f\x00\x82\x30\x28\x44\x9d\x1c\x84\xc5\x4b\x67\x13\xbb\x4c\x44\xb9\x63\x1d\xa9\x29\xaa\xf1\x5d\xce\xfc\x6c\x89\x0a\x22\x2f\x9a\xdf\x7b\xce\x6a\xbc\x55\xc9\x6a\x66\x08\x0f\x95\x20\x0e\x39\x08\x1b\x14\x7c\xbb\x4c\xe0\xb9\xc2\xba\xc0\x48\x78\xaf\x89\x03\xd7\x8f\x8b\xdb\x6a\xd6\xb8\x34\x36\xf3\x8b\x0b\xe1\x7a\xeb\x28\x53\x3f\x5c\x19\xc4\x21\x07\x61\x31\x25\xa3\xa2\x0c\xd4\x00\x79\xba\x54\xde\xfc\x8a\x9e\x5a\x62\x99\xaf\x5f\xea\x38\xfa\xda\xbc\x5a\x7b\x19\x0f\x9f\x2f\x27\x32\xc0\x95\x41\x9c\xaf\x14\x1d\xc2\xdb\xf8\xd7\xf7\x08\xeb\x19\xe1\x51\x3a\xba\x0a\x39\xd5\x8a\x8c\x07\xe5\x2f\xde\x4e\xcc\xd6\x94\x6e\x8f\x70\xc8\x6e\x91\x10\xbb\x1b\xa5\xb4\xae\x15\x75\x34\x08\x9b\x5d\xfd\xb8\x3b\x58\xd7\xcf\xf5\xe0\x56\xe1\x80\x7f\x51\xc7\x95\xe5\x47\xb0\xa9\x35\xe3\x3f\xd5\xe1\x5b\x63\xb0\x37\x73\xb5\xa3\x47\xa7\xbc\x36\x0b\xdc\x97\xcb\x7b\x63\x48\x79\xbf\xd5\x19\x95\x5e\x62\x59\x36\xf1\x4b\x0a\xbb\x30\xc9\xf1\xd0\xd3\x13\x7b\xa4\x70\x6e\xf7\xbf\x16\x84\x41\x4d\x3b\x5a\x23\x8c\x14\x84\x0b\xa4\x8a\xa8\xda\xeb\xe3\xb4\x1b\x50\xa8\x6b\xdd\xd5\x9d\xd3\x1b\x2c\x0e\xf6\xf1\x6b\xca\x7e\x7f\xb7\xa0\x7b\x14\x3e\xf8\xc4\xec\x54\x16\x2b\x05\x91\x32\x9a\xe6\xad\x16\xb4\xc7\xb7\x15\x17\xf4\x92\x3f\xd9\x7e\x7c\xac\x34\x37\xe1\xca\x63\xe3\xf4\x3c\x5d\xe9\xae\xdf\x5a\xd6\x9c\x9c\xf5\xa9\x44\x43\x2f\xe4\x20\xec\x13\xc2\x62\xdd\xfb\x88\xe0\xdd\x95\x9a\xd7\x4e\x23\xbf\x23\x75\x73\xd2\x9e\xf1\xdf\x0d\x74\x20\x78\x51\x8c\xf7\x76\x94\x4f\xe6\xdc\xa9\xb4\xd6\x00\xe9\x63\x9f\xb2\x3b\x27\xa7\x3e\xce\xf3\x11\x50\x79\xb5\xb4\x5e\xb0\x3a\x56\x32\x63\xe7\xc0\x38\xe2\x9a\xec\x48\xeb\x92\x23\x26\xed\x91\x76\x2a\xad\x45\x0e\xc2\xf6\x99\x75\x8d\x8f\x2f\x1b\x63\x94\xca\xeb\x3a\x9b\xfd\xae\x14\xe9\x8a\x2c\x75\xb6\xef\xd5\xb4\x0b\x3a\x10\xe9\x17\xff\x94\x1c\x7e\x6a\x41\x18\x64\xa2\x93\x46\xbe\x47\x34\x79\x91\xce\x1f\x9a\x39\x06\xbf\xfe\xe1\x59\xd9\x8b\x11\x26\xff\xd5\x6e\xe5\xbc\x70\x9d\x76\x64\x6b\x23\x97\x6e\x56\x01\x5a\x5a\x01\x71\x48\xc7\x44\xee\x25\x89\xcc\x55\x38\xf2\xb8\x57\xb9\x10\x3d\xea\x8f\xaf\x79\xf5\x8a\x59\x4d\x60\xc2\x88\xd8\xf2\x52\x95\xd8\xda\x1f\x5c\x68\x36\x01\xe2\x10\x47\xbe\xcd\x6c\x8b\xf6\x76\xda\xca\x67\x3c\xfc\x7b\x57\x07\x9e\xe8\x7f\x76\x95\x99\x4a\x3b\x4f\x8a\xd5\xb2\xda\xbd\x9b\x61\xb0\x8f\x4a\x03\xd7\x05\x71\x48\x2b\xc2\x9b\x0b\xb3\x96\x05\xe7\x37\x79\x68\x89\x28\x23\x83\x1e\x6e\x31\xd7\xe3\x76\x50\x72\xd6\x56\x6a\xbe\x8d\x76\x0d\x88\xd4\xca\x82\x56\x84\x01\x9c\xaf\x04\x8a\xd8\x51\x5d\xa5\x38\x1a\xfb\xd7\x6d\x86\x23\x73\x30\x81\xa2\x76\x7a\xaa\x3f\xea\x6c\x24\xc5\x02\x31\x9a\xaf\x23\x94\xa5\xbd\x53\x25\x5c\x3e\xc0\x83\x30\x88\x83\x6a\x84\xff\x39\x08\x83\x7e\xd0\x27\x59\x60\xd0\x06\x6d\x56\xc3\xae\xe3\x5d\xf9\x05\x12\xb9\xb1\x66\x9a\xfc\x11\xea\xae\x24\x87\x2c\x66\x4b\x3f\x31\xfa\x14\xf5\xd9\x50\x68\x25\x14\xc4\x21\x5a\x60\x57\x0b\xc3\xb1\x32\x53\xa6\xb3\x56\x3e\x5d\x7f\x33\xa4\x6e\x86\x7f\xc3\xce\xe4\xf2\x85\x74\xf7\x9a\xbc\x76\xef\x2f\xad\x6c\x14\xd0\x49\xc4\x00\x0e\xe9\xbf\x10\xf3\x05\xb1\x42\xad\xf5\xf6\xf3\xae\x2d\x98\x6d\x59\xcd\xea\xbd\x4d\x28\x5e\x4d\x29\x02\x96\xfa\xfe\xbc\x49\xf7\x2a\xd3\xa0\xaf\x0a\xc4\x21\x5a\x20\x5a\x6c\x24\x0e\x77\x40\xd0\xf6\x4b\xe0\xc2\x3a\xa7\xf0\x3a\x69\xa0\xed\x0d\x9a\xec\xeb\x1f\xed\x7c\xfc\xe5\x03\x3f\xa2\x91\xd4\xc2\x75\x41\x1c\xa2\x05\xd2\xef\xe6\x92\xd5\x0e\x79\xfc\x5a\xfe\x34\x41\x62\xe4\x98\xf1\x5b\xdd\xb4\x32\xdf\x5a\xf9\x7d\xb2\xa5\xb7\x54\xaf\xa2\x75\x39\xb4\x35\x1a\xc4\x41\xb5\x81\x82\xff\x3c\x01\x06\xf5\xae\x27\x79\xc0\xeb\x11\x5e\x6c\x30\x65\xb6\xdc\x22\x65\xc8\x9a\xfe\x0d\x52\x65\xfa\xcf\x3a\x9d\x1f\x18\xe3\xfb\x34\x1f\x25\x08\x10\x3c\xf8\x03\xdd\xf3\x09\xe2\x10\x3d\x50\xbe\xf4\xc7\xb5\xfb\xdd\xce\x46\xca\xbe\xed\x4c\xa2\x95\xef\x73\x41\xac\xe9\xae\xf4\xc8\x91\x2c\x83\x73\x1f\xa5\x66\x31\xfb\xa1\x53\xa3\x41\x1c\xa2\x07\x3e\xfa\xb9\xeb\xad\xe1\x4d\x6f\xc8\xf9\xa5\x45\xec\x63\x0b\x59\xa6\xa8\x12\x10\xc7\x54\xca\x9c\x15\xa4\x0b\x8a\x7d\xa7\xea\x19\x03\xd7\x05\x71\x88\x1e\x70\xef\x24\x2f\x77\x3e\x93\x46\x92\x2b\xbc\x11\x61\x39\x76\xd9\xe0\xe5\x80\xea\x43\x94\x73\xb7\x29\xfc\x87\x39\x1e\xbc\x0a\x22\x86\xae\x12\x03\x71\x88\x1e\xe0\x5a\x29\x12\xbd\x96\x81\xc5\xa4\x79\x5b\xef\xc7\xcc\xc6\x5a\x78\xcc\xba\xc7\x4e\x5e\x67\x08\x45\x5b\x8f\x68\x1c\xfe\x8d\xb8\x73\x70\x0f\x80\x38\xa8\x36\x10\x10\x84\x41\x43\xdd\x49\x1e\xc0\x40\x4b\xfa\x83\x4e\xc3\xa8\x97\x9d\x90\xed\x6b\x32\xf2\xca\x45\x58\xc5\x28\x90\x63\xfb\xa9\xc6\x56\x8f\xbd\x60\x79\x11\xe3\x47\x78\xdb\x41\x1c\xa2\x07\xda\x23\x6f\xa3\x8e\x2c\xb9\x8a\xbf\xf6\x5b\x8a\xc2\xaf\xc6\xab\xd3\xb7\x0f\x4f\xf3\xda\x4b\x1e\x1f\x57\x50\x11\x63\xbb\x31\xc1\x08\x9d\xec\x0b\xe0\x10\x3d\xd0\x60\x3a\x6f\xb2\xd3\x7b\xc1\xe6\x89\x19\xd1\xc1\x3b\x99\x74\xd7\xb7\xa6\x73\x89\x4a\xa9\xd2\x05\x53\x8e\x25\x4b\xdb\x78\x0a\x66\x50\x3d\x2b\x80\x43\xf4\x40\x83\xcd\x4d\x61\x4a\x56\x81\xd4\x24\xb3\xfe\x3c\xb5\x6b\x7f\x7e\xb4\x4e\x84\x92\x13\xfc\x71\x67\x6f\xbe\x3f\xf5\x8d\x81\x92\x0c\xda\x1c\x04\xe2\x10\x3d\x20\x68\x96\xcf\xd5\x90\x23\x9d\x91\xb6\x9f\x2e\xbc\xb6\x51\x97\x21\x4f\x7d\xd5\x35\x0a\x67\xd6\xe5\x89\xd7\xad\xfe\x00\xfc\x24\x4d\xb8\x07\x40\x1c\xd4\x0f\x18\xfc\xb3\x07\x40\xf3\x8e\x13\x2b\xa5\xca\xf8\xed\xc8\x23\xb4\x5b\x2a\x54\x98\x18\x57\xec\x63\x25\x1b\x31\x08\xc7\xd4\xc9\xcf\x7f\x8c\x8b\x41\xf9\xba\xd4\x79\x0e\x3a\x2c\x0e\xc4\x21\x7a\x40\xe3\x0a\x8b\x76\xa4\xca\x82\xd3\xdd\x75\x7b\x91\x43\xfd\x65\x1e\x32\xdf\xb5\xc0\x21\xb1\x67\x7c\x2f\xed\x50\x98\xc9\xb1\x95\xa1\x93\xfe\x41\x1c\xa2\x07\xa2\xeb\xcc\xdb\x31\x9e\xe4\x39\xb1\x89\x60\xef\x5b\x31\xb0\xce\xbe\x17\xc5\x4d\x92\x30\xd1\x80\xb5\xf8\xb4\x50\x9a\x2d\xb4\x40\xdb\xf9\x41\x1c\xa2\x07\xce\x1f\x4a\x99\x09\xb7\xdc\x16\x22\x74\x1b\xb4\x2b\x2a\x08\xea\xe0\xb1\x32\xdb\x08\x20\x2f\xbf\x6c\xe5\xb7\x14\xf5\x64\xc2\x05\x1a\xbb\x40\x1c\xa2\x07\x70\xf9\x02\x03\xbd\x26\xc7\x48\x2e\xcd\x85\x2d\x11\xce\x39\x7f\x24\x59\xba\x3d\xcd\x1e\x2f\x2b\x14\x98\xac\xe0\x5d\x4d\x41\x3a\x06\xf7\x00\x88\x83\xfa\x01\x40\x10\x06\x85\xa8\x93\x83\xf0\x00\xe3\xfa\x97\xb2\xe0\x95\x1c\xd5\xab\x39\x8e\xe4\xe1\xb6\x03\x55\x42\x4e\x79\x81\x23\x55\x23\x9d\xd7\x24\xcb\x12\x26\xbc\xca\xe1\xa1\x12\xc4\x21\x07\xe1\xaa\x06\xb4\x00\x94\x2f\xcf\xb6\x6b\x2f\x31\x63\xbb\xb5\x97\xb3\x7c\x24\x70\x62\x7d\xb2\x32\x1e\x37\xcc\x13\x6b\x3e\x9e\xaa\xd6\x06\x57\x06\x71\xc8\x41\xb8\xaa\x99\x15\x33\x82\x44\xae\xa4\xf4\x63\x50\xdb\xb6\xe5\xc0\xd6\x30\x49\xb9\x89\x96\x39\xf1\xa1\x29\x83\x9b\x53\xec\xa8\xd0\x07\x48\x19\xc0\xf9\x4a\x79\x21\xbc\x8d\x7f\x7d\x8f\x70\xb4\x7d\xbc\xb9\x6f\x0c\x6e\xd2\x2e\x87\xd7\x1d\xe2\xc4\xcb\xe4\x0c\x19\x2f\x04\xca\xe8\x61\xf3\x78\x6c\x2c\xb3\x49\x9f\x3f\x96\x1d\x0d\xc2\x98\xd1\xb7\x88\x43\xf2\xab\x34\x27\xb2\x1a\x76\xda\x5c\xbf\x11\xf9\x7f\x1f\xf0\x6f\xd4\xad\x6c\xc6\x1b\x8c\x90\x64\xbb\x6d\xd3\x76\x04\x7d\xc5\x89\x3b\xd8\xea\x61\x2a\xb5\xfd\xa6\x73\xf9\xc7\x72\xea\xa6\x4f\x7b\xdb\x88\x38\x57\x6a\x6b\x68\xa4\xa2\x42\xc5\x19\xfc\x4b\xff\xb5\x20\x0c\x6a\xda\xd1\x1a\x61\xa4\x20\x7c\x58\x22\x99\xa7\x50\xf8\xe1\xec\x6f\xd6\x85\x1f\x37\xd7\x29\xd7\xe7\xcc\x9a\x6d\xae\xe0\x95\xec\xc5\xed\x56\xa8\xf7\xa7\x91\xd9\x9c\xca\x62\x25\x72\x10\x76\x17\xe0\x53\xc8\x0d\x9b\x31\xbd\x9c\xca\xf1\xc7\xcf\x32\x95\xf8\x53\x5b\x81\xeb\x7c\x81\xdd\xf3\xcb\xd3\x7b\x1f\x45\xa8\x6e\x2a\x9f\xca\xd2\x2c\x72\x10\xde\xc3\x97\x92\x7d\x74\x89\xa0\x75\xf5\x31\x59\x96\xaf\xfb\xed\xcd\x28\xc6\xfe\xb5\x69\xeb\x4e\x37\xb5\xc1\x1b\x64\xae\x5c\xf8\xa7\xb3\x34\x8b\x1c\x84\x47\x61\x29\x2c\x16\xec\x52\xaa\x4a\xed\xd9\x2f\x1d\xf6\xd8\xa6\xcb\xce\x66\xbe\x9f\x7b\x21\x43\x7d\x81\xb3\x09\x3f\x52\x3e\xe4\x54\xf6\x9f\x37\x21\x07\xe1\xe9\x03\x4f\x91\xe2\x0b\xf1\x26\x67\xb8\x3b\x85\x2d\x98\xed\x77\xe8\x57\x57\xaa\x57\x17\x94\x2b\xf6\x6c\xc9\x09\x7d\x16\x18\x3e\x9c\x5a\x10\x06\x99\xe8\xa4\x91\x2f\x94\xff\xf2\x86\xbe\xac\x61\x49\x19\x3b\xa5\x4d\xc8\xed\x25\xaa\x82\x9f\xa6\xdf\xb0\xf8\x14\x8d\x3e\x6f\x1b\x93\xef\x06\x58\x41\xf7\xe7\x82\x38\xc4\x91\x4f\x20\x57\xd2\x88\xd1\xf0\xea\xf3\xb3\x78\x0b\x95\x5a\x3d\xf6\xf4\x0d\x5f\x4a\x25\x3d\x53\xcd\x13\x61\x44\x92\x87\x52\x1c\xbc\x50\x21\x27\x88\x43\x1c\xf9\xc2\x2d\xcf\x17\x51\x1b\x71\x66\x9e\x1f\x3b\xcb\x89\x4f\x30\x9d\x2f\xe7\xa0\x46\x5b\xc7\xbc\xe1\x41\x53\x1c\xfd\x7b\xf1\x62\x3b\x74\x8a\x05\x88\xf3\x95\x38\x7e\x59\xdc\xf5\xaf\xa4\x9f\x61\x1f\xb0\xf4\xf1\xc3\x31\x28\x58\x44\x15\xf1\x6a\x2f\x64\xca\x10\xdc\x7e\x98\xdb\x23\xc0\x48\x75\x97\x38\x19\x3a\xd9\x09\xc4\x21\xbe\xdf\x15\x3a\x0d\x93\xf4\x2f\xd4\x36\x66\x4d\x53\xd7\xe2\x0e\xf4\x04\xf1\x24\x95\x9c\x6b\xea\xf1\xdf\x0d\xad\xbf\x54\x9a\x69\xdd\x50\x82\x07\x61\x10\x07\xd5\x08\xff\x73\x10\x06\xfd\xa0\x4f\xb2\xc0\x43\x15\x92\xc9\x5f\xef\xd3\x0b\xdb\xda\xc4\x5e\x85\xb1\xff\xa4\x1a\x4d\x20\xe0\xd0\x97\xfb\x41\x1a\xeb\x8c\x82\x43\x3b\xa9\xd7\x0c\x6f\x3a\x88\x43\xba\x93\x75\x43\x90\xa9\xa7\xa4\xa9\x95\xf9\xb0\x6a\xe1\xd7\x78\x06\xf1\xb3\xaf\xec\x39\x09\xb3\x6f\xd2\xfd\x3a\x4b\x35\x79\x56\xef\x40\xe7\xa5\x81\x38\x44\x0b\xbc\xba\xcf\xfe\x34\xff\xe1\xaa\x37\x03\x09\x76\xff\x73\x8f\x00\x2e\x0e\x4a\xbf\x11\x32\xca\x88\x45\x32\x8b\x15\x56\xb1\x61\x22\x68\xd5\x02\xc4\x21\x5a\xa0\x76\xf5\x03\x2a\xca\xec\x39\x92\xcf\x94\x4f\x50\xd4\x3f\x6b\xc8\x88\x27\xbe\x98\x42\x2f\x1a\xe3\x2e\xa3\x31\xba\xaf\x34\x4a\xfe\x7f\xd7\xa6\x00\x38\xc4\xf7\x2b\x3d\x12\x9c\xb5\x73\x18\x2e\xe3\xcd\x65\xbf\xe0\x8c\x86\xba\x9e\x5b\xeb\x7f\xb1\x44\x8c\x38\x65\x4b\xe2\xeb\x2f\x67\xcc\x36\x28\x08\x83\x38\xa8\x36\x10\x10\x84\x41\xbd\xeb\x49\x1e\xb8\x87\xc1\x74\x65\x89\x05\x23\x82\xa8\x41\x62\xbd\xca\x8e\xbc\x3b\x43\xeb\x8e\x8e\xe1\x5a\x1e\xf3\x4b\xc6\x79\x59\x83\xc7\x51\xd0\x1d\xca\x20\x0e\xd1\x03\x37\xd2\x33\xe9\xf0\x6a\x2c\x04\xbc\x49\x6d\x13\xd9\xba\x09\x9e\xca\x60\x33\xbc\xe5\x36\x13\xba\x1d\x9f\xa4\x79\x67\xc6\x58\x19\x0d\xae\x0b\xe2\x10\x3d\xb0\x51\x42\x94\x4d\x9c\xcd\xf2\x52\xd9\x8b\xc3\x25\x70\x92\x7c\xe3\xca\x60\x57\xb5\xae\x0a\x23\x16\xdf\xc3\x50\x2f\x98\x49\xf5\x77\xb8\x2e\x88\x43\xf4\xc0\x61\xa3\x2c\xfa\x54\x27\x77\x75\x69\x12\x0e\xd9\x56\xf4\xf4\x17\xde\xd4\x27\x54\xe7\xb4\x79\x63\x71\x47\xa5\x89\xcf\xf2\x29\x42\x47\x26\x80\x38\xc4\xf7\x4b\x3c\x50\xcc\x0c\x33\x49\xd2\x0b\x61\x74\x12\x25\x1e\x62\xde\xc6\xdc\xd2\x93\x27\x50\xe9\x47\x7b\xd8\x11\xdb\xa5\xef\x9b\xd6\x05\xf7\x00\x88\x83\x6a\x03\x01\x41\x18\x34\xd4\x9d\xe4\x81\x67\xe5\x2e\x95\xfc\xbe\x85\x97\x3c\x77\x42\xc8\xd0\x46\xa3\x82\x36\xb3\x50\x32\x3e\xd9\x5e\xec\xa1\xe0\x2f\x91\xfc\x85\x45\xa7\x0c\x6f\x3b\x88\x43\xf4\xc0\xc0\x80\x91\x69\x9b\xd4\xb8\x59\x96\x40\xee\xdb\xb5\xf4\x3c\x0a\x7b\x5f\x91\xc3\x31\xcc\xa5\xcc\xcd\xde\xbb\x74\x4c\x8f\xf5\xa0\x13\x83\x41\x1c\xa2\x07\x34\x96\xa6\xfa\x66\x2a\xfb\xca\xc4\x74\xc7\x31\x4c\x03\x13\x65\xd1\xcd\xf4\xc5\x45\x59\x2a\x7f\xed\xd6\x1b\x73\x5f\x43\x21\x1a\x84\xc2\x15\x80\x43\xf4\x80\xb4\x5d\x8c\x8c\xd1\x4c\x94\x9e\x5b\x33\x4e\xf9\x8e\x9a\x7e\xfe\xb2\xd9\xe1\xd8\xe0\xf9\xeb\x7f\x6c\x94\xdd\xd2\x58\x72\xa4\xa0\x3f\x6f\x40\x1c\xd2\xb9\x94\x03\x2a\xdd\x26\xfd\x8e\xa9\x25\x5d\x4e\x7a\xa9\x7e\x21\x2d\x99\x4b\x2f\xda\x3e\xba\x66\x4d\x66\xbf\xf6\xac\x22\xe5\xf2\xeb\x83\x7b\x00\xc4\x41\xfd\x00\x20\x08\x83\xe6\x1d\x27\x79\x20\xe6\x4d\xfe\xfb\x57\x8b\x62\xba\x0d\xbe\x3e\x83\x92\xd6\x6d\x14\x37\xe3\x9b\xa9\xf8\xc9\x15\x1c\x37\x9f\x9b\x33\x26\xb0\xf7\x9f\x87\x6a\xef\x01\x1c\x52\x10\x76\x74\x74\x98\x13\x64\xe5\x93\xe8\x79\x94\x54\xb2\x94\x4d\x28\x39\x64\xec\xfd\xe8\x8b\xb4\xa9\x66\x5c\x44\x5a\x67\xa8\x5b\x08\xf4\x5d\x01\x38\x44\x0f\x4c\x9c\xfd\x82\xb7\xc0\x59\xe2\x52\x36\x24\xb0\xd7\x29\x8e\x95\xa9\x3b\x5a\x34\x64\x67\xeb\xdb\xcb\x43\xcb\xc5\xb4\x4f\xfc\x1d\xfa\x43\x0c\xc4\x21\x7a\xe0\x7c\x77\xc0\x7e\xc3\xc5\x5b\xf3\xf6\x73\x24\xe1\x7d\x07\x71\xde\x96\x11\x9a\x97\x1f\x3d\x4c\x54\x61\x34\x52\x11\x20\x6f\x5f\x78\x0d\x05\x61\x00\x87\xf8\x7e\x2d\x7d\x38\x1f\xd8\x92\xcb\x3e\xc1\x61\xb6\xae\x21\x10\x58\x1e\xae\xbd\x78\x20\xf1\xf5\x0a\xda\x63\x34\xf6\x56\xe1\x69\x4d\x8f\x2b\x70\x0f\x80\x38\xa8\x1f\x00\x04\x61\x50\x88\x3a\x39\x08\x2f\x51\xbd\x9c\x62\x8d\xcb\xe0\xde\xdc\xe8\x6d\xf9\x82\x9e\xee\x71\xf0\xda\x99\x3b\xf7\xb5\x6b\x0e\x9a\xa7\xcb\x56\xab\x8e\x5c\x23\x3c\x54\x82\x38\xe4\x20\x6c\x4c\x9b\xc8\xea\xe9\x33\xbf\x4e\x47\xd9\xff\xf5\xd1\xd5\x9e\xd6\xe6\x45\x54\x34\x3a\xdd\x9d\x34\xbc\xf4\x99\xdb\xdd\xbd\xd9\x04\x70\x65\x10\x87\x1c\x84\xfb\x43\xa3\x9a\x1f\x0c\xfb\x4d\xcb\x3d\x57\xe5\x8a\xee\xf7\xed\x88\x96\x3a\xfc\xc1\x59\xd7\xf0\x81\xed\x7c\x6c\x66\x55\x44\x01\x1d\x5c\x19\xc4\xf9\x4a\xa1\xa0\x1e\x57\xfe\xd7\xf7\x08\x2b\xa3\x75\xb7\x77\x95\x05\x70\x19\x24\x97\x36\x65\x05\x25\xf6\xd3\xc4\x6c\x35\x89\x61\xcb\x87\xb1\x2e\x5c\x41\x13\x7e\xf9\x28\xfc\x68\x10\x7e\x86\x5d\x99\xdd\x4c\x4f\x1b\xb2\xd0\x55\xd2\x7c\x57\x84\xc9\x05\x43\x82\x53\xec\x8e\xda\xc1\xa2\xd4\xa6\x48\x90\xe4\x5d\x2f\x85\x23\x68\x02\x5a\x45\x61\xd0\x90\x44\x5b\x96\x69\x70\x6b\x40\xf7\x7b\x51\xbb\x6a\x9f\x15\x49\xab\x50\x62\xf5\x7b\x9a\x33\x2b\xbb\xe8\x3c\xff\xb5\x20\x0c\x6a\xda\xd1\x1a\x61\x05\xc4\xb0\xc4\x28\x5d\xeb\x26\x79\x55\x36\x2e\x82\x1b\x8d\xa7\x84\xbc\x10\x5d\x52\x86\x28\x7e\x95\x68\xb8\x6f\x84\x7c\x79\x78\x58\x7b\x5a\xed\x54\x16\x2b\x91\x83\xf0\xcf\xe7\x0f\xd8\x5c\x56\x16\xa4\x0b\x8c\x0f\x77\xf3\x2f\x84\x10\x6b\x3e\x69\x08\xbd\x1b\x18\xf8\xe6\x8a\xa4\xb8\x61\xd7\x77\xd2\x83\x53\x59\x9a\xbd\x8d\xf4\xb1\x56\x6b\xe7\x6a\xf9\x31\x6c\x0f\x55\xf4\x42\x86\x31\xec\x3f\x5a\x15\x32\x0e\x05\x97\x54\xd7\x6e\x69\xe2\x57\x78\x2d\x64\x50\xd7\x9f\x4a\x6b\x91\x83\xb0\x3b\xd3\xf0\xf5\x8b\x2d\x30\xc9\x39\x31\x1d\xe9\xaa\x29\x56\x77\xb2\x78\xa1\xb0\xd0\xb3\x89\x9a\xa2\x89\x2b\x72\x37\x51\x4d\xaf\x9e\x4a\x6b\x5d\x91\x3e\x36\xf0\xa9\x8e\x8f\xe4\x4c\x9e\xa5\x60\xf8\x90\x83\x23\x66\x4b\x29\xe5\xca\x94\xcd\xe8\x98\x9d\x36\xb7\x86\xa8\x52\xef\x23\x8e\x88\x53\x0b\xc2\x20\x13\x9d\x34\xf2\xdd\x08\x95\xa5\x12\x34\xb9\x16\xda\x9a\x9c\xd8\xcf\x67\x3a\x3a\xa0\xf2\x9d\x66\x4c\x15\x46\x60\x27\xac\x62\xf6\x8d\xf3\xde\xda\x65\x68\xa6\x0a\xe0\x10\x47\x3e\x89\x8b\xc9\xbf\xf1\x74\x9e\x62\x10\x95\x51\x31\xd5\x5b\x94\xf4\xdb\xb6\x7f\x8c\xa5\x30\xff\xc2\x4f\xb2\x99\xa0\x5b\x55\x4a\x0b\x1d\xed\x0b\xe2\x10\x47\xbe\x94\x84\x92\x99\xcc\x25\x5b\x2f\x96\x79\x2d\x85\x1f\xdb\x0d\x76\x3e\x25\x7e\x31\xbe\x21\x4f\xdf\x50\x56\x98\xce\x37\x72\x31\x5e\x87\xf6\xf1\x02\x38\xc4\x91\xef\x6e\xa1\xf3\xb9\x42\xcf\x99\xdf\xb5\x15\xb7\x19\xbe\xa4\x4f\x6e\x47\x12\x7f\xff\x2e\x44\x11\xf2\x30\xea\xe5\xef\x50\xb3\xe4\x57\xd0\xc9\x2b\x20\xce\x57\x82\xee\xd8\x7b\x78\xc3\x67\xbd\x97\x78\x50\x43\x81\x7d\x28\xe6\xf1\x5a\xe1\x86\xe8\x7b\x76\x25\x26\x71\x56\xc5\xcb\xa5\x03\x5f\x59\xaa\x1e\x69\x24\xc2\x83\x30\x88\x83\x6a\x84\x15\xfe\x71\xf2\x03\xfa\x41\x9f\x64\x81\xe1\x15\x83\xce\xf7\xca\xe5\x9d\x0f\x02\xf9\x61\x3d\x86\xc2\x1e\x6a\x62\xd2\x25\xf4\x6e\x7c\x2d\x59\xf2\xf9\x59\xea\x0e\xee\xc4\xf0\xa6\x83\x38\xa4\x83\x92\xec\x3b\x86\xb9\xd1\xbb\x82\xbe\xc7\x1b\x9e\x9f\x18\x4d\x97\xdb\xa4\x3a\xbc\x44\x61\xc4\x8f\x35\xe9\x50\x89\xef\x2a\x1f\x0e\xad\x04\x81\x38\xa4\xad\xd1\xb7\x25\x99\x93\xea\xc4\xfc\x8b\xe7\xdb\x0c\x85\xbf\x2d\x16\x86\xbf\x36\xca\x29\x4a\x70\x70\x89\xbb\x73\xd9\x74\xe5\x25\xbf\x2f\xb4\x35\x1a\xc0\x21\x5a\xa0\x70\x9c\x3f\xc3\x58\x6c\x7a\xbe\xa0\x5f\xe1\xdd\xdb\x95\xd7\xd5\xce\x78\x3c\x98\x22\x4a\x45\x2f\xca\x30\x9a\x17\xd5\x59\xf1\x0d\xa0\xd3\x62\x01\x1c\xa2\x05\x0a\xb0\xeb\x03\xfc\xd5\xd6\x51\xed\xd7\xd5\xec\xb1\xd8\x66\x42\xbb\x19\xac\x51\x92\x5d\x64\xde\xf1\xf5\x52\xdc\xbf\x3d\xf9\x50\x0f\x3e\xf9\x01\x71\x50\x6d\x20\x20\x08\x83\x7a\xd7\x93\x3c\x10\xd8\xaa\x6b\x3a\x52\x5e\xe0\x6d\xe5\xfd\xc2\xc4\x22\xf0\x33\x57\xd5\x8e\xd3\x68\xcc\x90\x40\xe1\x06\x6a\x76\xd8\x85\x29\x47\xe8\x7f\x2b\x10\x87\xe8\x81\x1c\xc2\x95\xec\xae\x77\x57\xd9\x2b\x3e\x8c\x0a\x94\xbc\x48\x35\xa2\xac\xdf\xf6\xb1\xcc\xc1\xc6\x4e\xbc\xb0\xf1\xee\x26\xc5\xff\x6d\x8b\x05\x71\x88\x1e\xb0\x50\xd6\xd7\x4e\xdd\xc2\x43\xdd\xd1\x6a\x67\xa0\x12\xd5\xa8\xbf\x5f\xac\xe1\xc2\x24\x8a\xb1\x64\x36\x99\xf3\xdc\x63\x07\x9f\x12\xae\x0b\xe2\x10\x3d\x50\x35\x53\xb9\xf6\x6d\xb3\x2e\xd4\x97\x06\xa5\x9e\x47\x94\xae\x8f\xda\xd7\x0a\x47\x24\x04\xed\xa1\x10\xb9\xf0\xbd\xe2\x7b\x0f\xeb\xe0\xba\x20\x0e\xd1\x03\x42\xa8\x83\xd4\xa4\xee\x76\xa4\x5e\x3e\x38\x64\x2d\xa4\x62\x45\xbd\x74\xb9\x1d\x29\xae\xad\xdf\xf9\x7b\x4d\x59\x05\x2e\x33\x72\xc2\x3d\x00\xe2\xa0\xda\xc0\xdb\xff\xec\x01\xd0\x50\x77\xe2\x05\x02\x63\x24\xe4\xef\x6f\x27\xf9\xe8\x4b\xa7\xfd\x62\xe2\x6a\xfd\xb6\x60\xdd\xbb\xca\xbf\xf7\x81\xf7\x05\x15\xad\x6f\x3a\x93\x0b\x74\xa5\x3c\x88\x43\x3a\x8d\xfd\x43\x8f\xcc\xdb\x89\xc6\xee\x1c\xa9\x9b\xe7\xf4\x2d\x04\x9e\xf6\x79\x58\x7b\x2e\x06\x16\xe8\xa2\xbc\x3d\x17\xde\x2a\x53\x06\xdd\x21\x0b\xe2\x10\x3d\x80\x19\x2e\x7e\x69\x33\x38\x4a\x27\x1a\x9d\x4e\x4a\xdb\x97\xd7\x80\x7e\x19\x06\xfb\xf5\xfd\x4a\x83\x04\xb5\x7e\xdf\xfb\x9e\x41\x68\x27\x0b\x88\x43\xf4\xc0\x62\xf3\x42\x4f\xd0\xd7\xf8\xd7\x6f\xea\x99\xb9\x5d\xdb\x5f\x2e\x3f\x2e\xd6\xea\xa8\x0d\x49\x96\x82\x0d\x7d\x1b\xeb\x98\x62\xc0\x82\xeb\x82\x38\x44\x0f\x68\x11\xef\x7b\x8c\x1a\x89\x79\xfe\xbe\xf2\x18\x55\xc0\x8d\x60\xe7\x0c\xdd\xb4\x2c\x9e\x6e\xc9\x6e\x46\x9c\xf9\xf5\xa4\x03\x95\x40\xb8\x07\x40\x1c\xd4\x0f\x00\x82\x30\x68\xde\x71\x92\x07\x74\xd7\x29\xeb\x58\xd6\x69\x0a\x7a\x39\x70\x65\xdd\xd2\xbe\xdc\x2a\xd5\x31\x97\x7b\xb6\x62\xdc\x3f\xe8\x77\x77\x74\x26\x89\xe4\x3d\xbc\xed\x20\x0e\xd1\x03\x4e\x3b\x66\x4a\x6c\xb0\xf2\x9e\x1d\x9e\x24\x77\x7b\x62\xc1\xb7\x9c\x79\xd4\xad\xfa\xec\x3a\x9c\xed\x64\x25\x78\x7f\x0e\xfb\xd4\xe0\xba\x20\x0e\xd1\x03\x3d\xe1\x84\xdd\xce\x54\x78\x6b\x03\x78\x77\x5f\xee\xf2\x95\x07\xd3\x04\xc8\xdf\xa3\x7d\xab\x6b\x60\xf1\xfd\xfd\xe7\xba\x83\x4f\x0e\x50\xed\x31\x80\x43\xf4\xc0\x07\xdc\x33\x94\x1f\x37\x7f\x3d\xa9\xcc\x31\x57\x20\xf6\x38\x98\x4e\xb9\x20\x73\x8f\xba\x29\xb7\x50\x93\xda\xec\x92\x8f\xcb\xcb\x6e\xb8\x2e\x88\x43\xf4\x80\x7e\xba\x2f\x4e\xb7\x63\x27\x7e\x63\xbf\x27\xf1\xe2\x7d\xea\xb5\xb6\xc5\x97\xaa\x33\x68\x1b\x2a\x7c\x04\x7f\x18\x36\x05\xee\xed\x43\xa7\x46\x03\x38\xa8\x1f\x70\xfd\xe7\x20\x0c\x0a\x51\x27\x07\xe1\x1f\xf5\xf8\x14\x77\x79\x7f\xe6\x8d\xf9\x45\xcd\x1a\xf4\x73\x13\x07\xd7\xfb\x3e\xd3\x67\x9c\x8b\x6b\xdd\x0e\xd0\x7f\xb2\x52\x01\x9d\xc0\x0c\xe2\x90\x83\x70\x4c\x7c\xbb\xbb\xd1\x2d\x4c\x03\xba\x48\x03\x43\x71\x05\xab\x41\x82\x9b\x69\x33\xd6\x71\xd4\xf3\x46\xc4\xe1\x2f\x1d\x6e\xbb\xf4\xc0\x95\x41\x1c\x72\x10\x56\xbe\xfe\xa5\x42\xba\x32\xb6\xf9\x93\x95\xb5\x69\x90\xb1\x1f\x2a\x96\x13\x11\x9b\xf6\x13\xf4\x9e\x5f\x42\x2c\xa2\x0f\x94\x45\x48\xe1\xca\x20\xce\x57\x0a\x05\xed\xb8\xf2\xbf\xbe\x47\xd8\xf7\xcb\x0d\x41\xf2\x31\x03\x45\x4e\xc9\xfc\x4f\xcd\x51\x12\x85\x95\x33\xeb\xdb\x7a\x4c\xe6\xe2\x0b\x61\x91\x5f\x2f\x74\xba\x7f\x3d\x1a\x84\xbd\xe4\xcf\x27\x0f\x05\x7b\xff\xd8\x3c\x77\xe3\xb3\xbb\x9f\xcc\xd5\xf0\xe4\x3b\xfa\x93\xfa\xf9\x4b\x3f\x39\xf2\x93\x18\xd6\x47\x8b\x8f\xa0\x0b\x18\x03\x33\x2c\x98\x37\x66\xd9\xba\x1f\x1f\xca\x76\x0f\x0e\x1a\xe0\xb2\xb8\xdb\xe5\xf9\x6e\x4b\x7c\x49\x6f\x21\x92\xc4\xe8\xfd\xaf\x05\x61\x50\xd3\x8e\xd6\x08\x23\x05\x61\x0f\x94\x33\x75\xf3\x7e\xdc\x58\xd1\x3b\xbf\x5b\xbb\x6c\xcf\x18\xc7\x71\x7f\x08\xd0\x4d\x45\xc7\x0f\x25\xfd\xfc\x38\x78\xc5\xe6\x14\x0e\x54\x0a\x96\x6a\x42\x0e\xc2\xf8\xbf\x3b\xce\x93\xff\xd0\xb9\x98\x37\x13\x17\x70\x58\xcf\x77\x63\xff\xd7\xf5\x0b\x3d\xbb\xe8\x21\x36\xaf\xd4\xa3\xe3\x35\xb3\x4f\xe5\x42\x21\x31\xe4\x20\x4c\x1e\xb7\x2e\xe6\xf0\x4e\x91\xf9\x63\xbf\xc5\xbb\xb9\x2b\x77\x1e\xdd\x43\x95\xda\x1c\xfd\x16\x99\xcf\xea\xff\xb6\x1d\xd5\xab\x86\xe7\x54\x5a\x8b\x1c\x84\x79\xd4\xc8\x07\x56\x57\x2e\xee\x26\x2a\xf6\x37\x5f\xb0\x4a\x35\x2b\x33\x70\x4a\xd7\x90\xec\x97\x2d\x8f\x0a\x7b\xb1\xda\x78\xcd\xf1\x54\x5a\x8b\x1c\x84\xf1\x48\xf2\x63\xc7\x42\x1a\x05\xdf\xce\xa1\xfd\xba\xa9\x15\x40\xf7\x7b\xf2\x6b\xf5\x76\x61\xed\xb6\x80\xe4\x77\xeb\xe8\x0b\x3f\xb1\x4e\x2d\x08\x83\x4c\x74\xd2\xc8\x67\x9b\xe3\x9e\x1f\xe6\x38\x38\xf0\x75\x59\xb7\xb0\x12\xc3\x21\xa0\x60\x98\x53\x9b\x92\x30\xcd\x24\x77\xe0\x39\xed\x77\xea\x4b\xd0\x3d\x24\x20\x0e\x71\xe4\x7b\xef\x62\xc4\x71\xa3\x18\x63\x81\xe0\x76\x5a\xb1\x48\x4f\x50\x8e\xf1\x63\x1c\xe9\x71\xfd\xed\x4a\x29\xfc\xba\x80\xf3\x39\x23\xe7\xe0\xba\x20\x0e\xb1\xc8\x06\x3b\xd2\xf1\x33\x67\x00\xe1\x4c\xa4\x08\x47\x33\x13\xd7\x24\xe6\x90\x03\xbe\x6c\xbe\x49\xc3\x93\x1a\xe5\xa6\x18\x1f\xd6\xa7\xd0\xb2\x05\x88\x43\xdc\xb3\xf4\xd4\xbd\x55\xa2\x44\xaa\x4d\x80\x71\x5f\x32\xce\xf6\x65\xcf\x7c\x91\x96\x42\x51\xc1\x66\xef\x98\x46\x1d\x7f\x18\xc7\xfc\x23\xe8\x54\x1f\x10\x87\x38\xf2\xcd\x75\x35\x72\x2d\x5d\x7f\x16\x30\xd4\x2c\xa4\x4f\xd4\x76\xf7\xcc\x5d\x97\xfb\x44\xb7\x76\x07\xa6\x3c\x48\x88\x83\x6e\xc2\xe4\x52\xe0\x41\x18\xc4\x41\x35\xc2\xff\x1c\x84\x41\x3f\xe8\x93\x2c\xc0\x52\xbd\x37\xa5\xb1\xd9\xb8\x36\x57\x4a\x55\x23\xac\x7c\x99\x85\x7c\x47\xf2\xdd\x96\x0a\x7e\xc9\xad\xcf\xdc\xd1\x86\xe5\x1b\x5d\xf0\xa6\x83\x38\x44\x0b\x60\xcf\x88\xa2\x7a\x0e\x79\x6d\x16\x99\x8c\x9f\x1b\x7a\xbf\x51\xe4\xe6\xbd\x9f\x2e\xe7\xc0\x62\xda\xcc\x53\x91\x8e\x9f\x89\xb6\x06\x7d\x55\x00\x0e\xd1\x02\xcf\x08\x06\xed\x0e\x04\x51\xd6\x5a\xe9\x79\x33\x05\xbd\x70\xf8\x78\x27\xd1\xe4\x68\x9b\x6a\x18\x29\xeb\x52\x82\xd0\x84\xa5\xa3\xa0\x95\x2b\x00\x87\x68\x81\xeb\x1d\x17\x82\xb4\xe9\xe5\x8b\xfb\x5c\x60\x6a\x8a\x7d\xfb\x66\x85\xd6\xf6\xe1\x99\x53\x16\xe2\x84\xf6\x0f\x55\x68\xa3\xea\xd3\xa1\x4d\x01\x00\x0e\xd1\x02\xcc\x37\x3b\xca\xcb\x0f\xa6\x5b\x98\xab\x9e\xfe\x2e\x10\x91\xa9\xbd\x66\x17\x2e\x3b\x57\x89\xfb\x6d\x7d\xb1\xf5\x20\xb3\xd4\x7b\x0e\x3e\xf9\x01\x71\x50\x6d\x20\x20\x08\x83\x7a\xd7\x93\x3c\x70\xc1\x98\x52\xed\x75\x57\x47\x3d\xba\x50\xc2\x00\xcd\xf9\xc3\xc4\xa1\xf2\x30\x6d\x86\x6a\x7e\xf1\x1e\x51\xe2\xaf\x26\xc2\xb4\x50\xa8\x00\x71\x88\x1e\xf0\xdc\x9a\xd4\xee\x38\xcb\xf5\xe9\x89\x51\x31\xdd\x25\x8c\x2c\x57\xff\xbd\x9d\xf4\x04\x76\xfc\xcd\xf2\x28\x2d\x5f\xb1\x02\x9e\x54\xe8\xe0\x21\x00\x87\xe8\x01\xde\x99\x38\x81\x92\xf8\xec\x29\x2d\x82\x01\x37\x75\x02\x57\x1b\x5c\xc2\x37\xbd\x2e\x51\x77\xae\xd4\xdd\x2d\xb9\x2a\xd4\xff\x0a\xba\x92\x07\xc4\x21\x7a\xa0\x42\x50\xd3\x63\x55\xa0\x3b\xc5\x5d\xbb\xbc\xbf\x24\xbb\x5d\x78\x1f\x55\xe9\x97\xb0\x70\xd8\xeb\x0b\x36\x0d\xdb\x23\xd5\xb1\x09\x70\x5d\x10\x87\xe8\x81\x97\x2f\xa5\xf7\x92\xc7\x18\x30\x18\xf2\x04\xfa\x15\x82\xb5\x5b\xca\xbf\xef\x44\x90\x2c\xb6\x3c\x6a\x79\x8d\xd2\xbe\xd1\xb0\xf0\x04\xee\x01\x10\x07\xd5\x06\x02\x82\x30\x68\xa8\x3b\xc9\x03\xef\x87\xaa\x0f\xa4\x5e\xf9\x31\x4b\xfe\xa8\xc0\x9f\xa4\x8a\x32\x74\xae\xae\x5c\x1a\x2d\xe5\xda\xfe\x35\xa6\x75\x0d\xfd\xcf\x4f\xe8\xea\x28\x10\x87\xe8\x81\x0b\xf1\xa1\x11\x8b\x37\xa3\xc3\x2f\xdc\xc9\x89\x1f\x77\x5f\x4b\xb7\x19\xe0\xb6\xc8\xf3\x56\xa9\x5d\xde\x63\xc8\x4b\xbb\xeb\x08\xd5\x5d\x83\x38\xa4\x7a\x4b\x31\x9c\x0f\x79\xe8\x26\x1f\x85\x6f\x7e\x1f\x35\x97\x0c\xa4\x74\xa1\xb9\xd0\x90\x21\x4a\xd8\x40\x76\x4e\x57\x46\x14\x65\x60\x0b\xae\x0b\xe2\x10\x3d\x40\xf6\x78\xea\x1e\x0e\x75\x5b\xf5\xcb\x71\x1c\x2a\xcc\x0b\x46\xb7\xa3\x7c\x65\xdf\x1c\x66\x45\x58\x97\xac\x29\x79\x7c\x51\xa9\x82\x42\x1b\x88\x43\xf4\x80\x33\x2a\xbb\x83\x78\x1f\xc9\xae\x68\xe4\xb6\xea\x46\x49\x64\x26\x86\x5a\xa2\xe4\x0f\xf5\xc1\x07\x5e\xde\x77\xb3\xea\xe4\x04\xfb\xa1\x7b\x84\x01\x1c\xd4\x0f\x00\x82\x30\x68\xde\x71\x92\x07\x6c\x64\x2a\xfb\xa9\xa9\x31\x1c\x05\xda\xcf\xea\x12\xb8\x8c\x0b\x5e\xa1\xe1\xc1\xac\x23\xc6\x98\xce\xe3\x0c\x1b\x53\xe9\xcb\xcf\x83\xb7\x1d\xc4\x21\x7a\xa0\x33\x67\x98\xc5\x4a\xa9\x88\x65\x4c\x89\xbe\x0d\x5d\xe1\x20\xdc\x5f\xbc\x9d\xde\xaf\xb6\xf4\x59\xd5\xb5\x58\xc9\xac\xb6\xe8\x69\xb8\x2e\x88\x43\xf4\xc0\x9b\xad\x40\xee\x9e\xf9\x75\xfc\x67\x13\x82\x1b\xea\xc9\xd4\xf6\xef\xcc\x1b\x6a\x9f\x30\x7c\x5a\xc4\xad\xec\xb1\xb5\x24\xba\x38\x0f\xd7\x05\x71\x88\x1e\x88\xba\xc5\x7f\xb3\xcb\xf5\xea\x61\xe6\xb5\x69\xee\x3b\x61\x9f\x45\xb3\xa5\xdd\xf1\x29\x66\x56\xab\x19\xe5\x7f\xf0\xe8\x2a\x63\x18\x43\x07\x27\x02\x38\x44\x0f\x10\xe9\x72\xe1\x70\x94\xd7\x95\x9b\x5b\x04\x14\x6e\x17\xb2\x92\x3a\xaf\x4e\x55\x08\xab\xaa\x7f\x2d\x75\x56\x8f\xc2\x29\xbe\x97\x04\xf7\x00\x88\x83\xfa\x81\xbf\x05\xe1\xb9\xff\x3f\x9c\x99\x35\xe1\xed\x1d\xac\x5a\x35\x6a\xde\xbf\x76\x45\x3a\xcc\x56\xd7\x68\xa0\xd8\xba\x3b\x2d\xbf\x4d\xf9\xfd\xdc\x70\xca\xe1\x24\xfa\xd1\xc2\x3c\x58\x6b\x17\xc5\xfd\x2c\x5c\x8e\x9e\x58\xcf\x6f\xcd\xde\xf1\x57\x2e\x28\xc2\x46\x82\x3f\x63\x4b\x90\xd1\xb7\x12\x5b\xa9\x98\x79\x1f\x9b\xd5\x92\x91\x3f\x36\x72\xeb\x10\xdf\x1e\x75\xa9\x0a\xfa\x1d\xe6\x9e\x22\xf8\x8c\xc3\xc7\xb6\x27\xe0\xd6\x88\x6e\xd2\xf8\xfe\xb4\x0d\x9f\x98\x24\x0a\xea\xec\xd1\x39\xff\x81\x55\x8f\x49\x66\xa6\x35\xee\x95\xeb\xf2\xd7\xc2\x72\x14\xbc\x39\xd6\xdf\x25\xdd\xf6\xba\x15\x91\xec\x32\x82\xa5\x11\x84\x7b\x04\xd5\x31\xbf\xbf\x12\xd0\xcc\xf3\x6d\xd2\x6d\x74\x5d\x49\x49\x9d\xf4\xa3\x5f\xdb\xe8\x6d\x43\x74\x9b\x9b\x42\xdf\xaf\xe1\xe6\xeb\xdf\x3a\xba\x7b\x23\xe6\xd6\xc4\x66\xaa\xf4\x76\xf5\x8d\x95\xe0\xf1\xf4\x1b\xed\x14\x01\x72\x98\x13\x53\x85\xd4\xd3\x7a\x79\x1a\x51\xf1\x87\xcc\x47\x50\x8e\xa8\x27\x4f\x26\x03\x30\x93\x6d\x23\x99\x8b\x54\x14\x7a\xda\xe2\x4c\x52\x2e\xcf\xcf\x5d\xf9\x70\x45\xd6\xb1\xbb\x98\x8b\x67\x52\x08\x0b\x87\x9c\xfe\xe8\x12\xf3\xcb\xce\xe1\x99\x8c\xc7\x96\x01\xac\x45\x9e\x2b\xbc\xc5\x05\xee\x83\x85\x97\xb1\xc2\x6b\xe5\x3f\xa1\xdc\x96\x16\xcc\xc6\xdc\x10\xfb\x65\xf2\xef\x5e\x5b\xb0\x04\xca\x5d\x09\x94\xbb\x5e\x5b\xda\xcc\x28\x8c\x58\xa8\x44\x74\xa8\xd7\xc6\x94\xce\x54\x0f\x25\xc7\xfe\xd1\xa6\x2e\x0d\x4c\xd8\x30\x78\x4c\x9a\x5b\x5f\x6f\x95\xdf\x71\x45\x0c\x65\xa9\x22\xde\xc2\x0b\x93\x82\x0e\x05\x05\xe5\x0c\xdd\x56\x2d\xfa\xbf\x7b\x76\x3f\x74\x54\x18\xea\xac\xaf\xd4\xa1\x27\x0a\xca\xd1\x6f\x74\x6c\xbf\x27\x96\xfa\x27\x6c\xd8\x6c\xb6\x32\x60\xa3\x9b\xc5\x8d\x81\x5e\x02\x7f\xd0\xa2\x5a\xc8\xaf\xf5\xf9\xc3\x25\x6f\x81\xa3\x2f\x5d\x45\xdc\x2c\x72\xcd\x58\x99\x66\x5a\xcd\xfc\xe6\x5d\x97\xb2\x6e\xfc\x80\x1a\x07\x39\x6b\xeb\xe1\xab\xb6\xc1\x41\x69\xfd\x31\x63\x47\xe7\xb4\x57\xe9\x2a\x32\x64\x2b\x75\x94\xeb\x9b\xdb\x30\x6f\x06\x31\x8b\xf3\x2b\xe3\x59\xa6\xdf\x66\xb5\x4a\xa9\x97\x6b\xed\x54\x48\x3a\xba\xb8\xd0\x35\x12\xfe\x5c\xfc\xea\x1b\x0b\x2a\xa6\x94\xe7\xd9\x51\x97\x3c\x46\x36\x2e\xe2\x77\x25\xba\xda\x1d\x24\xfe\xca\xf6\x79\x08\x3b\xfa\xdf\x53\xf5\x82\x3e\x4e\xbf\x70\xf7\x84\xda\xdb\x74\x1a\xfe\xbd\x31\xfa\x21\x18\x39\xce\xfe\x1b\xb3\x38\xd2\x15\x1f\x33\x79\xcc\x0b\x47\xf7\xd8\xb6\xcd\x95\x2c\x8d\x71\x5f\x56\xb5\xde\x16\xcb\x22\x54\x24\xb5\xd3\xdb\x7b\xa9\xa5\x52\x4d\x13\x15\xf2\xeb\xc7\x67\x0d\xb9\x89\xa3\xdf\x22\xea\xaf\xbb\xe2\x3a\x9a\xad\x57\xfd\xd5\x0f\x9f\xfc\x60\x12\xc6\x5a\x51\x6f\x53\x94\xf6\x4e\x7f\x12\xea\x5a\x6f\xd8\x81\xa3\x77\x04\x9d\x2f\x23\x0e\x2c\x1e\x92\x3d\xe7\xcb\xf3\x9b\xf4\x45\x49\x4d\x12\x41\x85\x99\x7c\xdf\x93\x4f\x7e\x56\x1f\x26\xfc\x2c\x6d\xec\x8e\xe6\xb4\x33\x1f\xe6\x97\x95\x78\x86\xeb\xa7\x87\x7a\xd4\xaf\xd6\x2c\xe7\x3f\xa2\x7f\xfc\x53\x70\x6a\x97\xdf\x9e\xa9\x89\xa3\x93\x49\x5c\xe3\xe8\x7e\x02\x8e\xf6\xf3\xc6\x2f\xd1\x1c\xa6\x12\x08\x4d\xd5\x32\x51\xb4\xa6\xca\x6a\x2e\x9b\xcb\x84\xa5\xac\x74\x4c\xad\x92\x31\xff\xf1\x3d\x82\xb6\x6b\x04\x1f\xec\x7d\xa5\xae\xf9\x88\x82\x76\x73\xe8\x9e\x25\xaa\x64\xe2\xd3\x04\x7a\x27\x34\xae\x47\x17\x3f\x2f\x84\xad\x87\x1e\x55\xad\x57\x9e\xc6\x38\x1f\x98\x6f\x15\x84\xd9\xc4\x1b\x6d\x9d\xb7\xcd\x8f\x4a\x28\x85\x5d\x7b\xe9\x0a\x89\x74\xad\xf1\xfe\x14\x07\xdf\xd1\xff\x0a\x3b\x74\xf7\x24\xe9\x29\x2e\x62\x3c\xbc\xd4\x8e\xf3\xe2\x46\xdf\x61\x03\x73\x44\xc6\x0b\xa2\xd2\xeb\x54\x36\xbf\x16\x13\xcc\x1f\x1e\x0d\x83\x22\x86\x11\x13\x78\x19\x3f\x49\x9d\x3f\x48\x59\xca\x85\xbe\x1c\x89\xdf\x17\x60\x35\xb4\x21\xe7\x92\x62\x18\x9a\x7c\x1f\xbc\x70\x04\xad\xe1\x79\xdb\xd5\x60\x32\xfd\xfa\x67\x70\x95\x84\x5e\x8d\x70\xd4\xe1\xc7\x03\xb6\x05\xe6\x07\xc2\xb0\x37\x5e\x83\xd6\x87\xbe\x2f\xbc\xe2\x88\xff\x9d\x05\x7d\xa5\x0e\x0f\x0f\x0f\xbd\xe2\xe9\x42\x51\x30\x27\xd8\xb5\xd9\x50\x50\x7d\xe6\xce\x7a\x7f\x3b\x43\x97\x20\x43\x8d\x7e\xf6\x65\x72\x82\xd4\xd8\x73\x3e\xf4\x41\xdd\xd5\x1e\xd6\x7b\x16\x84\xad\xea\x67\x84\x28\x17\x3b\x3f\xb0\xaf\x9d\xf1\x86\x61\x7a\xa1\x50\xa0\x5c\xc8\xad\x14\x93\x45\x39\xb3\xb9\x65\x8c\x82\x82\x22\x81\x82\x2a\x26\x86\x22\x16\x8a\x7a\x5c\xea\x82\x98\xb5\x49\x9d\xe4\xd9\x5a\xde\x94\x6e\x5b\xf1\xc7\x8e\xe6\xaf\x5b\x6a\x65\x29\xfb\xcd\xa8\x3a\xae\x9e\xdd\x78\x70\x8d\x41\xcf\x1b\x86\xe9\xfd\x37\xa9\x33\xc7\xa5\xd4\x42\x65\x64\x65\x5c\x86\xf7\xf1\xd0\x3a\x1c\xf1\x17\xf5\xac\x65\xb1\x51\x62\x47\x3b\x33\x48\x48\x64\xd6\xe5\xa9\x8d\x56\x04\xbd\x61\x98\x3e\x7f\x93\x3a\x7b\x5c\x8a\xb2\xdf\xb7\x65\x7e\xe9\xf7\xb3\x2d\xaa\x01\x77\xa7\xce\x3d\x9b\xdb\xd6\x03\x6d\x2f\x4a\xa3\xfa\x1c\x7f\x8c\x33\x18\x3c\xef\x91\xf6\x86\x61\xfa\xfe\x4d\x0a\xed\xb8\x94\x46\xec\xa0\xca\xc2\xf0\x24\x85\x0f\x5b\xaf\x79\xb5\x9d\x4d\x11\xe9\x63\x21\x75\x8d\x49\xf4\xf0\xd1\x60\x6d\x67\xbd\xe6\xab\xf4\xde\x30\x4c\xbf\xbf\x49\xa1\x1f\x97\x22\x6f\x50\x0c\xea\x65\x6e\x67\x50\x4b\xfa\x04\xd3\xea\xac\x98\x16\x76\xdb\x96\xeb\x4f\x1a\x32\x6a\x33\x76\xb8\xf6\x66\x05\xfd\x92\x37\x0c\xf3\xe9\xdf\xa4\x30\x8e\x4b\xf1\x70\x3a\x2b\x56\x73\x72\xe5\x8e\x17\xc8\x77\x5c\x91\x79\xcb\x37\x77\xe7\x63\x56\xac\x19\x5e\xed\x2b\xab\x67\xbf\x0c\x30\x45\x88\xbc\x61\x98\xfe\x7f\x93\xc2\x3c\x2e\xe5\xd5\x44\x64\x5b\x27\x1e\x7a\xa6\x6b\xe4\x51\x29\x2f\xdd\xf3\x39\xb7\x85\x4f\xa8\x1b\xd2\x54\x69\x6b\xef\x9e\x7f\x78\xc3\x83\x73\xd3\x1b\x86\x19\xf0\x37\x29\xac\xe3\x52\x59\x39\x2b\xd3\xd5\xae\xe6\x44\x77\xaa\xd3\x3c\x7e\x37\x3e\x8d\x8f\xb7\xf5\x9e\x54\x39\x7f\xb6\x88\xa7\x0b\x6f\x9c\xb0\xb1\x01\xdb\x1b\x86\x19\xf8\x37\x29\xec\xe3\x52\x42\xf1\x7e\xea\xf5\xe8\xdb\xea\x17\xdc\x86\x07\xad\xd7\x8d\x3c\xbe\x37\xc4\x73\x7d\x34\x36\x2a\x76\x91\x9b\xe7\x23\x49\xaf\xfd\xdf\x53\x3d\xfb\x9b\xd4\xb9\xe3\x52\x57\xef\xdf\xd1\x34\x0d\x14\x1d\xda\xf2\x96\xea\xb9\x6e\x9b\x87\xde\xca\xd4\x63\x32\x52\x47\xc8\xd0\xa5\x38\xf4\xf0\x93\x51\x8f\x88\x37\x0c\x33\xe8\x6f\x52\x38\xc7\xa5\x92\x75\x08\xd8\x60\x52\x55\x81\xb7\xc7\xcf\xb9\x7e\x6f\xa1\x15\xd7\x52\x9f\x22\x2f\xd5\x5c\xfd\x44\x33\xfc\x6a\x6b\xb8\x4c\x5c\xd9\x1b\x86\x19\xfc\x37\x29\xdc\xe3\x52\xaf\xde\x12\x0e\x29\xc8\x70\x2d\xeb\x4c\xee\x84\x94\x29\x5b\x65\xed\x70\x96\xec\x89\xf6\xab\x18\xbd\x78\x14\x51\x34\x28\x58\xe9\xe0\x0d\xc3\x0c\xf9\x9b\x14\xde\x71\xa9\xca\xe9\xe0\x1f\x4c\xbd\xfa\x39\x26\x1e\xcf\xb7\xca\x03\x2f\xcf\x3e\xe9\x3c\x1b\xf1\x4c\x24\x2d\x3c\x4e\x5e\x97\x16\xbb\x43\x91\xc0\x1b\x86\x19\xfa\x37\x29\xfc\xe3\x52\xf7\x9f\x13\x44\xaa\xb2\x5f\xca\xfb\xb4\x9b\x94\xc8\x08\x4b\x45\x97\x7b\xa1\xf6\xc3\x0f\x6b\x9e\xff\xce\x6f\xea\x29\x42\x27\x7d\x46\x6f\x18\x66\xd8\xdf\xa4\xce\x1f\x97\xf2\xbc\x20\x28\x67\xa8\xba\xad\xa3\xe1\xd9\x6a\xff\x87\x97\x0f\x53\x29\x84\xce\x87\xe4\xe9\x63\x1f\x72\x15\xd1\x39\xa7\xf9\x79\x36\x6f\x18\x66\xf8\xdf\xa4\x08\x8e\x4b\xb9\x6c\x0f\xb8\xd8\xc0\xfe\xec\xab\xbd\x1c\x36\x69\x3a\x93\xb3\xd9\x19\x50\xd2\x9e\xa8\xbf\x5b\xa0\x31\x5c\x20\x11\x24\x9c\x2d\xe7\x0d\xc3\x8c\xf8\x9b\x14\xe1\x71\xa9\x3b\xc2\x59\x65\x12\xf2\x41\x8b\x6c\x9b\xf1\x64\x02\x3f\xf5\x77\xa6\x6b\xec\x5f\x1c\xdc\x91\x24\x7b\xcf\x5a\x95\xee\xb5\x5d\x60\xef\x0d\xc3\x8c\xfc\x9b\x14\xd1\x71\x29\x4d\xb9\xcf\x82\x7b\xac\x57\x76\x0f\x32\x08\xb2\x48\x18\xc3\x8d\x24\x87\xae\x30\x7c\x76\x3a\xeb\x4b\xa3\xe0\x27\x4a\xd4\x84\x7f\xc1\x1b\x86\x19\xf5\x37\x29\xe2\xe3\x52\x8f\xb8\xaf\xf3\x2b\x89\x6b\xe3\x94\xc9\x95\x32\xce\x98\xde\x92\x2e\x52\x17\xd6\xb1\xb9\x8d\xc3\x1b\x4c\x54\x7e\xf5\xad\x6f\xc5\xff\x7a\xd1\xe8\xbf\x49\x91\x1c\x97\x7a\xbf\xc0\x41\x82\x59\x2f\x64\x8b\x9d\xfc\x7a\x03\xdf\x8f\x92\x77\xde\x09\x1b\xe3\x92\x4e\xb1\x5d\x5c\x64\xc5\x50\x02\x75\xc7\xff\x7a\xd1\x98\xbf\x49\x91\x1e\x97\x42\xed\xe4\xfd\x12\xbd\xf2\x56\x92\xe4\x67\xd1\x5d\xff\x65\xa9\x3c\xcc\xc2\xa4\xab\xa5\xae\x51\x3a\xf7\x6f\x92\x93\x28\x32\xeb\x5b\x7b\xc3\x30\x63\xff\x26\x45\x76\x5c\xea\x6d\xf2\x6f\x89\x06\xc7\xe8\xb6\x90\x9d\x26\xea\x1f\xf3\xbe\x1c\x84\x1d\xd9\xe5\xd7\xbf\x61\x2d\x36\x3d\xfa\x24\xa6\xbc\x5e\x65\xe3\x0d\xc3\x7c\xfe\x37\xa9\x0b\xc7\xa5\x6a\x7c\x97\x9e\x3c\xaf\xe7\x0f\xd4\x1e\xd0\x7a\x2d\x66\x9b\xa7\x7e\x46\xc0\x73\x79\x68\x57\xa4\x8e\x2b\xa7\x78\xad\x2b\x95\x54\xd3\x1b\x86\x19\xf7\x37\x29\x72\xf2\xe3\x5a\x49\xf7\x25\x42\x18\xa7\x17\x75\xd6\xf7\x70\xbf\x84\x3d\xae\x7e\x20\x45\xb9\x61\xf3\x4b\x61\xdf\xe7\xb2\xa7\xa4\xd4\xbc\xa3\xaa\xaa\x37\x0c\x33\xfe\xaf\x5a\xb0\xe3\x5a\xbe\xa3\x28\xc6\x55\x9e\xee\x62\x99\xe9\x7e\x0b\x8e\xb1\x0b\xf3\x24\x49\x1f\xe8\x35\x17\x70\xb3\x83\x32\xe2\x2e\x9e\x3f\x1b\xc1\xe1\x0d\xc3\x4c\xf8\xab\x16\xc5\x71\xad\x1b\xbf\xbf\xc5\x14\x4a\xd6\x28\x77\x66\xa0\x4f\x2f\x3a\xdf\xe8\x71\xe7\xe8\xec\x8f\xcf\xa7\xed\x21\xcb\xba\xfd\xfd\x26\x3a\x11\x93\x37\x0c\x33\xf1\xaf\x5a\x94\xc7\xb5\x9e\x8c\xf0\x27\xff\xb4\x8f\x5b\xf9\x93\xea\x79\xd0\xa0\xca\x67\xfa\x8b\x89\xb8\x51\x05\xb5\x3d\xda\x3a\x73\x76\x43\x2a\xa2\xc5\xc2\x1b\x86\x99\xf4\x57\x2d\xaa\xe3\x5a\x0b\x77\x72\x87\x89\x0d\x1f\xb3\xdf\x18\x79\x7e\xb6\xb3\x16\xe3\x02\xdf\x35\x57\xec\x73\x6b\x77\x27\x49\x9f\xad\x45\x38\xa0\x55\xf0\x7a\xc3\x30\x93\xff\xaa\x45\x7d\x5c\xcb\xa0\x73\x0e\x1f\x76\xe3\x0c\xa5\x3a\x6a\x8d\xd5\xab\xac\xe0\x2a\xfb\xda\x7e\xe3\x97\xae\xaf\xba\xf0\xf9\x4c\xa4\x69\x0a\x2f\x71\x79\xc3\x30\x53\xfe\xaa\x45\x73\x5c\xeb\x77\xef\xa7\xbb\x22\xe6\xe7\xba\xfc\xf6\x7a\xc9\x0e\x86\x13\x9f\x6c\x61\x08\x95\xa5\x85\xb6\x85\x62\x54\x2d\xa0\x05\xde\x13\xe1\xf6\x86\x61\xa6\xfe\x55\x8b\xf6\xb8\x56\x89\x1b\x7d\xc9\x4a\xd6\xc7\xb7\x89\xfb\x97\xbe\x98\xbd\x41\x0d\x09\x09\x55\xb9\x46\xfd\x00\x35\xfa\xf9\x5b\xae\x62\xd5\x2c\xa3\xff\x8d\xd2\x69\x7f\xd1\x2a\x25\xfe\x77\x13\xfe\xff\x9b\x98\x91\xd3\x1d\xff\x70\x95\xb7\x0c\x55\x9b\x69\x86\x8f\x33\xcf\x2b\x91\x19\xce\x3d\x7b\x38\xf7\xed\x1a\x5b\x45\xfa\x1c\x2c\xcd\xec\xd9\x38\x35\x0a\x19\x86\x37\x0c\xf3\xc5\x5f\x1b\x72\xf1\xb8\x96\xe8\xfb\xe1\x77\x63\x05\xe2\x59\xb7\x8c\xb8\xc6\x6c\x5e\x2f\xba\xdd\xeb\x35\xcf\x95\x7f\x6e\x8b\x13\x29\x3b\xd7\x20\xbc\x67\xf3\x3f\x13\xa5\xff\x55\x8b\xfe\xb8\xd6\x6e\xea\xa0\xea\xc3\x8f\x1a\xe7\x66\xbf\x6b\xcb\xe2\xf3\x5c\x51\xe5\xd1\xba\xdb\xed\xc3\xd7\x7d\xde\xa9\xe8\x80\xa2\x79\xfe\x31\xa7\x37\x0c\x33\xe3\xaf\x5a\x0c\xc7\xb5\x04\xe3\x57\xbf\xae\x3b\xce\x57\xc8\xb3\x1e\x1e\x30\x3f\xec\x8f\xe1\xca\xf7\x71\x1c\x26\xd5\xc2\x12\xe4\xe5\xef\xa6\x26\xb5\xb5\xf4\x86\x61\x66\xfe\x55\x8b\xf1\xb8\x96\x3b\x6f\x4a\x80\xb7\x5d\x37\x5f\xa7\xc7\x27\x4c\xa9\x5f\x7c\xee\x71\x8f\x05\x8c\xe8\xe3\xd7\x3f\x7a\xd8\xd0\x5f\x34\xb8\x96\x43\xea\x0d\xc3\xcc\xfa\xab\x16\xd3\x71\xad\xc5\x4b\x83\x09\x57\xf3\xed\x45\xef\xed\x7f\x2c\xb7\x78\xdd\xed\x68\xf4\xfc\x15\xab\xe7\x24\xab\xb4\x71\xf8\x8b\xc1\x15\x79\x74\x49\x6f\x18\x66\xf6\x5f\xb5\x98\x8f\x6b\x4d\x27\x4b\x0d\x8d\x32\x8d\xee\xec\x7c\xd2\x5a\x43\x11\x0f\x2b\x69\x7d\x1b\xd6\x23\x9e\x75\xcb\x20\x47\xe8\xb3\xee\xad\x01\x5a\x12\x6f\x18\x66\xce\x5f\xb5\x58\x8e\x6b\xf5\x5f\x13\x60\x8a\x96\x49\x6a\x2f\x2a\x5b\x7a\xf9\x95\x65\x82\xe7\xc1\xec\x92\x5c\x58\x50\xa1\xd0\x80\xac\xe0\xb7\xbe\xca\x50\x76\x6f\x18\x66\xee\x5f\xb5\x58\x11\xa6\x55\xb4\x5a\xbe\x30\x6d\x56\xf3\xc7\xa6\x94\xd8\x24\x6b\xb9\x30\xeb\x1f\xc6\xa9\x56\x3c\x0e\x29\x01\x3e\xa1\x6a\xef\x7c\x76\x4d\xbc\x61\x98\x79\x7f\xd5\x62\x3b\xae\xb5\xb4\xf8\xf9\x8d\x78\x32\x31\x09\xff\x8e\x63\xb6\x01\xc6\xbd\xc7\x17\xc9\xeb\xb7\xb3\x44\xe4\xa5\xea\x1a\x57\x9d\xb0\xf8\x93\xe9\xbc\x61\x98\xf9\x7f\xd5\x62\x3f\xae\xf5\x20\x49\x74\x36\xe0\xa7\x54\xc9\x6f\x0c\x32\x05\x23\x85\xa0\x24\xa6\xcf\xcb\xe5\xbb\x6c\x66\xb8\x8e\x82\x31\x86\x4e\x73\xb5\xe8\xde\x30\xcc\x82\xbf\x6a\x71\x1c\xd7\x2a\x97\xc8\x50\x31\xcf\xbe\x7d\x39\xf7\x1c\xde\xcf\x55\xf4\x8b\x64\x77\xde\xe0\xe6\xe1\xad\x70\x60\xad\x66\x1d\xf2\xdd\xa5\x2a\x65\xf6\x86\x61\x16\xfe\x55\x8b\xf3\xb8\x56\x3a\xfe\x03\xcf\x3e\xed\x99\x5f\xf9\x2c\xfb\x0a\x6c\xa2\xdd\x0f\xb7\x54\x15\xb1\xc3\xbe\xeb\xc6\xe4\xd2\x19\x76\xfc\x5a\xa4\xa4\xf0\x86\x61\x16\xfd\x55\x8b\xeb\xb8\xd6\x8b\x73\xdb\xb9\x97\xab\x3f\x29\x58\x3c\x23\x94\x95\x4c\xe9\xc0\x2d\x33\x98\x7d\xaf\x17\xc3\xf1\x18\x76\x36\xff\x5a\xa9\x82\xce\x03\x6f\x18\x66\xf1\x5f\xb5\xb8\x8f\x6b\x1d\x38\xa1\x6a\xd5\xaf\xb8\xb6\x88\x38\xc8\x57\xed\x3c\x24\x7a\xa7\x14\x7a\x0b\x35\x3f\xc2\x8f\xcb\xa6\x76\x7f\xe9\x6a\x7a\xfe\xff\xfa\x89\xff\x8f\xb1\x3b\xff\xa6\xea\xfd\x1f\xff\x6f\x1b\xf7\x29\xc9\x58\x5d\x12\x09\x85\x32\x95\x79\x9e\xa9\xcc\x64\x16\x11\x32\x4f\x29\x51\xd8\x91\xb9\x22\x43\x68\x30\x95\x21\x65\x4a\x22\x63\xc6\x48\x19\xa2\x64\x1e\x22\x43\x99\x92\x29\xc3\x77\x9d\x1f\xde\xeb\xfb\x3a\x7b\xad\x6b\x3d\x3f\xff\xc0\xbd\x33\xec\x7d\xed\xc7\xb5\xf7\xe9\xa6\x00\xda\x12\x22\x6d\x5d\x65\xf8\xfc\x61\x8a\xdc\x24\x29\xc3\xa0\xc5\xa6\xf8\xf5\xe9\xbb\x33\xb6\xb5\x45\x5c\xd3\x94\x42\x81\x41\x0d\xa1\x0a\xe2\x6d\xc4\x75\xa2\x10\xda\x12\xc6\x9d\x43\x76\xc7\xbe\xf5\x19\x4f\x4e\x16\x4f\x57\x0c\xcf\x4a\xeb\x73\x99\x4a\x7f\x20\x6f\xb4\x94\x88\x78\x7e\x6a\xe2\xf2\x54\xf4\xdb\x23\x18\xa0\x29\x82\xb6\x44\x48\x5b\x63\x64\x74\x9f\xd1\xd4\xe2\xab\x47\xb2\x3b\x31\x57\x6b\x26\x9b\x07\xd4\x0c\x7f\x6b\x1d\x24\x84\xc2\x59\x82\x5c\x5c\x5e\x7b\x11\xa7\xbe\x62\x68\xeb\x34\x6e\x6f\x59\xd2\x2a\xf2\x79\x3e\x9c\x75\xfd\xec\x5c\xab\xf1\x31\xb5\xd3\xfb\xb9\x25\x99\x1d\x2f\xb9\xa8\xdc\xcf\xd4\xdf\xff\x93\x35\xf9\x3c\x06\x68\x4a\xa0\xad\x33\xb8\xb5\xf0\xd7\xcc\xb5\x20\x43\x8c\x2e\x62\x6a\xd2\xd7\xd0\x8e\xb2\xce\xf7\xe6\xde\xca\x3c\x31\x0a\x79\xe9\xfe\x03\x71\x2f\x6d\x2a\xe9\x30\x40\xf3\x1a\xda\x12\x25\x6d\x8d\x7f\x93\x4b\xee\x38\xab\x77\x2f\xe7\xb2\xbb\xef\x60\x6d\xff\x48\x4a\xb6\x5c\x62\xbf\xb6\xab\x90\xb1\xb3\x8b\xb7\xd4\xee\xcc\x7e\x0c\xd0\x94\x42\x5b\x62\xa4\xad\x42\xe6\x58\x89\x84\x9a\x93\x11\x9f\xcb\xff\x75\xa4\xcf\x52\xfb\x1a\x86\x79\x1b\xa3\xa6\x07\xfd\xdf\xee\x6a\x1a\x2f\xe7\xe8\x59\x61\x80\xe6\x0d\xb4\x25\x4e\xda\x4a\x74\x50\x60\x14\x44\x35\x6b\x24\x7e\xa5\x38\x2a\xef\x84\xae\x0c\xbe\x71\x07\x7a\x7f\xf4\x7f\x4a\x9f\xa9\x3c\xba\x1a\xe6\xce\x86\x01\x9a\x32\x68\x4b\x82\xb4\x55\xab\x16\xc4\xdd\x3c\xb5\xc2\xf8\xd4\xc2\x8f\x2a\x8e\xfe\x9c\xcb\x9d\x85\x2b\x87\xa8\x46\x95\xf4\x8d\xd6\x82\xeb\x0d\xaf\xf2\x71\x62\x80\xe6\x2d\xb4\x25\x89\x1b\xdf\xad\xb9\x85\x7c\x5a\x62\x33\xaf\x56\x09\x33\xd9\x4b\xc9\xf4\x9d\x69\xa9\x62\x11\x97\xc9\xb9\xcf\x52\x76\x59\x5d\x82\x8a\xdf\x12\x03\x34\xe5\xd0\x96\x14\x69\x4b\x33\x2c\xee\x8b\xf1\xfb\x22\x73\xc6\x55\xc6\xa3\x27\xbf\xb1\x7c\x9d\x08\x51\xfc\x28\xf8\xb3\xf7\x57\xc1\xda\xa7\x40\x45\xa7\x6c\xe2\x85\xbe\x02\xda\x92\x26\x6d\xfd\x5d\x92\xea\x0f\x59\xd6\xfb\xb7\xf5\xf1\x48\x2e\x4f\x92\x82\x8b\x12\xdd\xb7\x39\x4a\x61\x76\xc2\x71\x5a\xd5\xfa\x87\xd2\x89\xf6\x18\xa0\x79\x07\x6d\xc9\x90\xb6\x30\xb4\x6f\xa7\xb5\xf5\xe8\x57\xdb\x97\x7a\x7e\xfc\x04\xd9\x6e\x23\x4e\x43\xa5\x68\x0f\x7d\x05\xf3\x3d\x9c\x51\x5b\x35\x3a\xc4\xcf\xbe\x12\xda\x92\x25\x6d\xe5\x7d\x75\x34\x18\x0f\x2f\x78\x28\x6a\x2c\xd0\x47\x37\x7d\x9b\x5d\x50\xf3\xc0\x6d\xd7\x3f\x64\x56\xe7\xae\x9a\xe7\x7a\xfe\xfc\xc7\x88\x01\x9a\x2a\x68\x4b\x0e\x77\xac\xf6\x21\x4d\x5d\x19\xd5\xdd\x95\x6d\x79\x2f\xe2\xe2\xf6\xd5\x49\xf9\x5e\x22\x4f\xa1\x26\xbf\x5c\xfe\x25\xfa\x84\xfd\xc6\x7b\x0e\x0c\xd0\x54\x43\x5b\xf2\xa4\xad\xdd\x95\x96\xd0\x5b\x8c\x37\x12\x9b\xda\x75\x03\xbb\x04\x15\xc6\x04\x6c\xf6\xa7\xcb\x0e\xc4\x2a\x51\x99\xdc\x6b\x94\xf9\x7b\x82\x16\x03\x34\x35\xd0\x96\x02\x69\xab\x9d\xcd\xa9\x79\xe7\xac\xa6\x66\xc8\x1d\xce\x1d\x2d\xa3\x78\xce\x83\x27\x8d\x66\xf3\x07\xd4\xdb\xec\x07\xbe\x24\x9c\x3a\x55\x4b\x5c\xbf\x6a\xff\x63\x60\xfb\xaf\xdb\xae\xff\x33\xb0\x29\x92\xfe\xe3\x0c\xa6\x0c\x2b\x0a\x47\xd9\xbc\xf5\xba\xad\x2e\xaf\x85\xec\x7f\x26\x7c\x76\xc5\xd8\x75\x16\xf5\x9f\xa6\x39\xda\x3b\x29\x97\x4e\xdc\x6e\xd5\x41\xdf\x88\x12\x69\xcb\xb1\x3d\x65\xdc\x3b\xe5\x2a\xe5\xad\x35\x9f\xdc\xc3\xc3\xe6\x3b\xcc\xa6\xc1\x3d\x8b\x96\x8d\xc5\x62\xb9\xd9\xcc\x06\x65\xbf\x88\x17\xe7\xf7\xd0\x96\x32\x69\x2b\x3e\x74\x5a\x75\x92\x7c\xd0\xee\x98\xc6\x93\xd0\xd5\xe3\x4c\x96\x7b\x0e\xeb\x30\x77\xef\xc9\xd9\x3b\x60\x34\xfc\x21\xc4\xee\x17\xf1\xc2\x55\x0f\x6d\xa9\xe0\x26\xe2\x22\x9a\x94\xe3\x31\x42\x1f\xa2\x86\xf4\x23\x1f\xbb\xaf\x30\xe4\x21\xe3\x3c\xe6\x2e\xa5\x47\x3e\xfa\xbf\xfa\x54\x45\xd8\x52\xc2\x00\x4d\x03\xb4\xa5\x4a\xda\xe2\xb9\x72\x5e\x39\xd8\xf5\x47\xd2\x3d\xda\x6a\xf7\xe2\x6f\xea\xa9\xff\xb4\xb8\x8f\x7c\x30\x5f\x66\xb4\x0c\x99\x75\x52\xdc\x78\x67\x8d\x01\x9a\x46\x68\x4b\x8d\xb4\x75\xd3\x9a\xf6\x93\xf6\x8f\x30\xd6\xc6\xaa\xf7\x64\xcd\x02\x99\xd7\x76\x78\x6e\xa3\x51\xc3\xb9\x8e\x2d\xac\xd6\x86\x9f\x26\x36\x88\xbb\x91\x26\x68\x4b\x9d\xb4\xf5\xa4\x22\x9e\x7e\xc4\x54\x7a\xaa\xe2\x6d\x5d\xd8\x31\xd1\x37\x1a\x0b\x9f\x5c\xbb\x96\xef\xe4\xb9\xde\xae\x0a\xfd\xc7\x32\xc3\x4e\xfc\xbc\x9a\xa1\x2d\x0d\xd2\xd6\xe5\x6b\x96\x1e\x5f\x57\x3c\x82\xfc\x28\x29\x0a\x1d\x92\x1c\xf4\xa4\xa6\xc8\x03\x37\xf7\x53\x15\xfa\x04\xf1\xc8\x38\x94\x8c\xca\x61\x80\xa6\x05\xda\xd2\x24\x6d\xfd\x9c\x1e\xe5\xe9\xa4\xec\xc9\x68\x1e\x79\x6d\x7a\x42\x5d\x73\xef\x73\x93\xa6\xc2\x6f\x54\x42\x5d\x79\xd6\x1c\x65\x2d\xdd\x9a\xc4\xcf\xfe\x03\xb4\x75\x16\x37\xfc\x15\x75\xeb\x8b\xcd\x72\x33\xc4\x6d\x66\x65\x1a\xdb\xfd\x99\xb5\xf7\x1c\xb5\x0b\x60\xbc\xa8\x2d\x69\x71\x69\xee\xcc\x95\xe7\xc4\x85\xb8\x15\xda\x3a\x47\xda\xba\xd8\x20\xfb\x23\xe6\xdc\xbe\xb2\x71\x8b\xf4\x34\x51\xee\xc7\x9d\x5b\xec\xaa\x9e\xc8\x1b\xbd\x17\xfb\x3d\x90\x9c\x26\xda\x7f\xc4\xc5\xa0\x0d\xda\x3a\x4f\xda\xca\x3e\x24\xa2\x95\xfb\x69\x9c\x69\x57\x31\xc6\x5b\xc8\x23\x8e\x90\x7c\x31\xed\x3e\x35\x0b\xe5\x1c\xa1\xf4\xc7\xbf\x29\x32\x1b\x45\x0c\xd0\x7c\x84\xb6\xb4\x48\x5b\x2f\x3a\xe4\xdc\xb9\x8f\xfa\xc8\x48\x16\x26\xb0\x3f\x4d\x8d\x6a\xf5\x2d\x7c\x60\xae\x12\x91\xd2\x1d\xc9\xbb\x2b\x3c\x6e\x91\x6f\x86\x01\x9a\x76\x68\x4b\x1b\x77\xe1\x12\x8f\x13\x74\x7a\xe7\x73\x2d\xa2\xff\x6b\xc7\x15\x6d\x9b\x73\xbd\xbe\xcd\xce\x6a\x61\x17\xc5\x44\xae\x0d\x55\xb7\x59\xca\x13\x07\x90\x4f\xd0\x96\x0e\xee\x7c\x7c\xf6\x46\x88\x9f\x90\xe1\x38\xcb\x30\x7e\xb0\xc1\x2b\x80\xea\x49\xac\x2a\xe7\xe3\x54\xf4\xe9\x18\x63\x70\x07\xe3\x7d\x32\xe2\x60\xf4\x19\xda\xd2\x25\x6d\xe9\xe5\xfd\xab\x76\xb6\x79\x15\x35\xf4\x7d\xc3\x64\xb4\x4f\x5f\xc2\x6e\xe7\xd9\xee\xa3\x42\xcd\xe2\x06\xac\x4c\x7c\x52\x29\xe9\x20\x06\x68\x3a\xa0\x2d\x3d\xd2\x56\xce\xb6\xf7\xd9\xb7\xcf\x2a\xd2\x6b\xa2\x56\xba\x28\x33\x7f\xa8\x28\x05\xcb\x95\x67\x06\x16\xd4\xdb\x2a\x7e\xf6\xcb\xeb\xb9\x42\xfc\x1e\x3b\xa1\x2d\x7d\xd2\x56\xe5\xdf\x98\xfd\xde\xa3\xfb\xd8\x8b\xa7\x87\x02\xe9\xb4\xee\x50\xa6\x30\x0a\x1c\xbe\x21\x42\xd6\xce\xb1\xb6\xe1\xd4\xd5\x93\x2c\x83\x01\x9a\x2e\x68\xcb\x80\xb4\x15\x97\xc3\xb1\xb8\x57\xcb\x2e\xc4\xeb\x8b\x79\xad\x2e\xf3\xad\x73\x9e\xa1\x45\x49\x95\x66\x54\xe5\x0a\x9d\xdf\x73\x1e\xa6\xdf\x38\x89\x01\x9a\x6e\x68\xcb\x90\xb4\xd5\x3c\x94\x70\x8f\x59\x73\x2e\xaf\x6a\xb8\xf6\x88\xc3\x41\xb7\x5b\x3c\x27\x44\x3a\x87\x6e\xcd\xdc\xd4\xf0\x28\x73\xbd\x79\x41\x40\x1d\x03\x34\x5f\xa0\x2d\x23\xd2\xd6\x27\xc9\xe7\xf3\xac\xa9\x7f\xd2\xca\x2d\x6a\x79\x0d\xdc\xd6\x1f\x65\x5c\x52\x90\xfe\x7c\xbf\x75\x4e\xff\xd0\x68\x5c\x63\x0c\x0b\xc0\x00\x4d\x0f\xb4\x75\x01\xf7\x94\xc2\xd3\x6c\x4c\x97\xc0\x72\x67\xd8\x97\x7b\xe7\x04\xed\xfd\x9a\xf6\x63\x5c\x17\x58\xd5\xfe\xee\x3b\x37\x94\xf5\x32\x6e\x0b\x1c\xc3\x00\x4d\x2f\xb4\x65\x4c\xda\xe2\xed\xfc\xe2\x56\xd0\xfe\xdc\xb6\xee\xc7\x97\xec\x7f\x79\xea\xa7\xc5\xce\x65\x8d\xf9\x71\x5f\xd4\xfb\xc0\x34\xa1\xf4\x91\x39\xce\x16\x03\x34\x5f\xa1\x2d\x13\xd2\x96\xab\x15\x77\x75\xce\xc7\xbf\x52\xd7\x6f\x9e\xf5\x54\x91\x97\xe0\x95\x25\x54\x38\x74\x36\x96\x18\xcf\xf6\xa8\xbc\xb4\x53\xd8\x24\xae\xd1\xdf\xa0\x2d\x53\xd2\x16\x61\x6c\xe6\x2e\xab\xee\xf9\x90\xd7\xd7\x59\x76\x93\xaa\xe4\x1e\xcc\x3c\x29\x29\x6a\x4f\xe2\xf1\x78\x7c\xe4\xcb\x8f\xd1\x9a\x0e\x01\x0c\xd0\xf4\x41\x5b\x66\xa4\x2d\x9a\x8e\x9b\xf7\x14\xf9\x0d\xda\x2f\x5f\x3d\x32\x3b\x7c\x71\xa9\x67\xb6\xe2\xd7\xe7\xc7\x37\x0e\x2d\x90\xed\x6a\xb6\xb1\x9f\x3e\x41\xdc\xec\x7f\x87\xb6\xcc\x71\x43\x96\x50\xb6\xe4\x05\x37\x07\xdd\x90\x0b\x33\x34\x47\x06\x4e\x09\x76\xbf\xb8\xb6\xfd\xf0\x85\x38\x6d\x7d\x9b\xd2\xf0\x5d\x81\x0a\xe2\xeb\xea\x87\xb6\x2c\x48\x5b\x27\xca\x63\x3a\xc9\x35\xec\xa9\xb3\xb4\xaf\x6b\x8f\xe4\x0c\x74\x45\xf1\xd8\xa4\x5e\x9f\xa5\xae\xe9\xd1\x7a\x47\x23\x46\xfb\x90\xb8\x7e\x0d\x40\x5b\x96\xa4\x2d\xf9\xfe\xda\xd1\x87\x83\x6e\x07\x33\x8a\x5f\x94\xfb\x7b\xec\xe1\x13\xec\x7d\x34\x77\xb3\x4c\x62\x2e\x53\xe1\x44\xd8\x74\x42\xff\x61\x0c\xd0\x0c\x42\x5b\x56\xb8\xfb\xb7\x8b\x9c\x86\xca\x2c\xa8\xf7\xc2\xf5\xc9\x48\xc1\xc9\x97\xb6\x4a\xb5\x96\xa7\xa3\x19\x06\xd5\xa3\xcd\xfa\x44\xcd\x04\x2d\x28\x31\x40\x33\x04\x6d\x5d\x24\x6d\xb1\x8e\x7c\x13\x52\x49\xba\x5c\xa0\xf3\x3b\x8d\xdc\xce\xbe\xc0\xc0\x45\xb3\x2d\x24\x42\x3c\xde\xec\x8d\x66\xbc\x14\x0b\xf6\x9c\x38\x48\x0e\x43\x5b\xd6\xb8\x8d\x5d\x40\xcf\x4a\xce\x88\x23\x7f\xeb\x42\x18\x8b\xc4\x89\xb0\x14\x84\xa3\x30\x4e\xb0\xe8\x8f\xf2\xcb\xc9\xe2\xcc\x3c\xd5\x36\x7d\x0c\xd0\x8c\xfc\xc7\xc0\xf6\x5f\x0f\xbf\xff\x67\x60\xb3\x21\xfd\xc7\x75\x36\x0b\xde\x69\xd8\x2f\x9c\x69\xf7\xdf\xa2\xa5\xdc\x75\xa2\x2f\x9a\xab\x3d\xb2\xa7\xcf\xa8\xf1\x57\x1f\x22\x7c\xd0\x21\x5c\x1a\x03\x34\xa3\xd0\x37\x72\x89\xb4\xe5\x6e\xd7\xaf\x44\xa3\x20\xc3\xb0\xb1\xa1\x22\x50\xe9\xf1\x7a\x24\x55\x30\xc2\xdc\xda\xaa\x65\x1f\xad\x6b\xda\xf7\xeb\xb7\xc9\x88\x27\xf0\x18\xb4\x65\x4b\xda\x3a\x7d\x6f\x82\xcb\x9d\xde\xf9\xc5\xe9\x56\x8d\x5f\xba\x94\xdb\x2b\x9b\x69\xf1\x9c\x6b\x6a\x65\x9e\x2c\x4a\x1b\x88\xc9\x33\xb9\xe3\x18\xa0\x19\x87\xb6\xec\x48\x5b\xfa\x07\xfb\x53\xc6\xe4\xbe\x58\xe8\x79\x7e\x18\xb0\x52\xe9\xee\x63\xe7\x48\x5d\xdc\xaa\xbe\xab\xce\x7d\x2d\x8d\x4f\xef\xc1\x75\xe2\xce\x66\x02\xda\xba\x8c\xbb\x7d\x3c\xd2\x3f\x93\x7e\x63\x2a\xe1\xb9\xd2\xc9\xed\xfa\x5f\xcf\xee\xd7\x7c\xee\xbb\xf0\x33\x59\xa2\xdb\x31\xce\x6e\x30\x2d\xfd\xa8\x2c\x06\x68\x7e\x40\x5b\xf6\xa4\x2d\xed\x83\x7d\xa7\x52\x0e\xa8\x24\x2a\xce\x73\xdf\x69\x6f\xed\x1f\xcc\x37\xa7\x5a\x3d\x67\xde\x04\x5c\x3d\x0b\xc6\x3f\x0c\xd9\x10\x77\xce\x93\xd0\x96\x03\x6e\xc1\x23\x7c\x62\xff\xf3\x5d\x2f\xe5\xe6\x7d\x36\xfa\xf5\xa8\x7f\x7f\x46\x28\x7b\xfb\x6b\xc3\x45\xee\xcc\x1b\x8f\xfd\x3d\xd6\x77\x96\x78\x02\x4f\x41\x5b\x8e\xa4\xad\x57\x17\x38\xb6\xf3\x5d\x4f\x4b\x66\x79\x3b\x8d\xfc\x5b\x6f\xb3\x3e\xbe\x7b\xee\x2e\xb5\xc9\x78\x87\xbd\xf8\x4b\x7d\x85\x90\x8b\xc4\x85\xe5\x27\xb4\x75\x85\xb4\x35\xf4\x76\x6f\x75\xe0\x91\xe6\xeb\xb3\xb2\xd6\x36\xc2\x1e\x67\xee\x5a\x7f\xf8\x9b\xa9\xac\x9a\xc4\x1f\xf4\x3a\x36\xe5\x8e\x1a\x9f\x07\x06\x68\xa6\xa1\x2d\x27\xd2\x96\x93\x13\xe7\x42\x37\xdf\x96\xf0\xc0\x79\x8f\x60\x9b\x37\x47\xb1\x7d\x4e\x2a\x8f\x0c\xbd\xeb\x83\xa8\xb6\xef\xb3\xe9\xd4\xb3\x1f\xc0\x00\xcd\x0c\xb4\xe5\x4c\xda\xfa\x4a\x57\x17\xcc\x1c\x16\xff\x2c\x2f\x70\xb1\xbe\x46\xd6\x4b\xa5\xe2\x03\xe7\xea\xd0\x76\x7f\x23\xf9\xf5\xca\xc7\x2c\x7b\xd5\x88\x83\xd1\x2c\xb4\xe5\x42\xda\x92\x38\x1a\xfd\xb2\x34\xe6\x8f\xe5\xea\x34\x13\xc1\x7f\x71\x7e\xe1\x49\x75\x52\x41\x57\xdf\xc8\x98\xbd\xdf\x9a\xa2\xfb\xa7\x30\x3e\x0c\xd0\xcc\x41\x5b\xae\xb8\x87\xe2\x32\x93\x43\x6d\x1b\xd4\x23\x1c\x37\xcf\xbd\xa7\x7f\x27\xbe\xde\xe3\xd7\xa9\xdc\xcc\xdd\x9d\xdf\xac\x5e\x09\xd4\x07\xac\x88\x17\xfa\x5f\xd0\x96\x1b\xee\xf3\x5a\xca\x13\x35\xbb\x74\xb7\xce\xd9\xfd\xa2\xec\xdd\xaf\x98\x6d\xb9\xd5\x91\x13\x95\x23\x6f\x26\xf5\xae\xd1\x32\xde\xea\xa0\xb6\xc3\x00\xcd\x6f\x68\xcb\x9d\xb4\xb5\x7e\x61\xbf\xb3\xf2\x8b\xfe\x74\x9d\xab\x11\xff\xd6\x39\x99\xa2\x42\x59\xc7\x86\x29\xbe\xc4\x04\xf4\xdc\x53\xcc\xd3\x1d\xd9\x22\x0e\x33\xf3\xd0\x96\x07\x6e\xcd\x19\x88\xc9\x6f\xa5\x5c\xfd\xdb\xf9\xae\x77\x5e\x77\xf6\x4f\xd6\x09\x4d\xa1\x01\x76\x56\x47\xef\x8c\xa7\xc9\xc7\xc9\x84\x27\xb5\x30\x40\xb3\x00\x6d\x79\x92\xb6\xd8\x6f\xd7\x45\xe6\x7d\xfe\x8e\x26\x2c\x31\x84\x15\x5c\xe4\x6e\xc8\x17\xca\x1a\x79\xad\x11\xf8\xf1\x5e\xe3\xf3\xae\xd6\x0b\x9c\x17\x31\x40\xb3\x08\x6d\x79\x91\xb6\x3e\xc8\x5c\x50\xa5\x3c\xe3\xe3\xf5\x24\x2e\xaf\xef\x85\x94\xd3\xd3\xb0\x07\x9f\x6f\x19\x2c\x5c\x44\x1c\x5e\x1f\xa5\xfa\xb9\x73\x65\x2f\x06\x68\x96\xa0\x2d\x6f\xd2\xd6\xc7\x24\xb1\xcb\x3b\x74\x5b\x8d\x3f\xe3\x62\x84\xe9\xd6\xa3\x7d\xf2\x59\x2c\xbb\xf6\x6f\x45\xf6\x9e\x75\xba\xfe\x37\xe5\xaa\x8a\x3b\x06\x68\x96\xa1\x2d\x1f\xd2\xd6\xf7\x7f\x57\xe7\x15\xbf\xf0\x3b\xd5\x48\x30\x35\xa3\x41\xbe\xd2\x14\xf2\xbd\x2f\xac\xbb\xc2\xf6\x52\x06\xde\x8a\xd9\x0e\x48\x26\x1e\x5f\x7f\xa0\xad\xab\xb8\xc7\x72\x9a\x6e\xef\x29\xaf\xd4\x58\xc4\xb8\x5d\x17\x94\x6b\x1c\x38\x95\x98\x4a\xd6\xad\xcd\x12\x70\x25\x7b\xaa\xcb\xcb\x7c\x9e\x9b\x38\xcc\xac\x40\x5b\xbe\xa4\x2d\xf4\x78\x9e\x5e\x2e\xaf\x43\x8f\x68\x7a\x96\xb2\x52\xef\xf1\x5b\x5f\x85\x4f\x7f\x6e\x56\x60\x3f\xfb\xa9\xf2\x5d\xa0\x2f\xb5\x3d\x71\xf8\xfb\x0b\x6d\x5d\xc3\x6d\xa0\xe6\xe3\xa4\xfa\x1f\x74\x5e\xdd\xf9\xfb\x6b\xc4\x39\xb8\x23\x5d\xe8\xb7\x28\x5d\x9c\xe4\xc1\xc5\xa7\x7b\x6a\x3f\x1f\xd6\xa6\x31\xc5\x00\xcd\x2a\xb4\x75\x9d\xb4\xb5\x2f\x7e\xf9\xbc\x4f\xcd\xd2\xe5\x17\x77\x5f\x39\x2c\xd5\x72\xb1\x5e\xf7\x67\xfa\x75\x21\xd6\xd7\xe2\x9a\xa3\x7b\xe0\x37\x35\x3d\xe2\x46\x78\x0d\xda\xf2\x23\x6d\x25\x94\x86\x2a\x45\x0d\x48\x4b\x27\x31\x96\xd3\x7e\xcb\x5c\xb4\xde\x13\xd1\xba\x2a\xb8\x5f\x5f\x2b\x4a\x82\x27\xb0\xd9\xc8\x92\x16\x03\x34\xeb\xd0\xd6\x0d\xd2\xd6\x80\xa3\xb6\xec\x91\x79\x86\xd2\x6b\x8f\xd8\x15\xb5\x03\x4b\x7e\x70\x25\xea\x22\x9a\x7d\x1b\x3e\x6b\x92\xd1\x12\x0b\x6e\x6f\x89\x43\xe9\x06\xb4\xe5\x4f\xda\xba\x41\x96\x3b\xe5\xca\xa3\x2f\xf4\xe6\xae\x4e\x02\xd3\xf3\xf5\xe7\xba\x37\x58\x0f\xc4\xbc\x8a\x13\x38\x78\xae\xc7\x30\x3c\x85\x01\xc5\x00\xcd\x26\xb4\x15\x40\xda\x6a\xed\x59\x72\x91\x74\xf3\x96\x5c\x92\xde\x55\xd9\xa3\x48\x61\xf1\xef\x3c\x5d\xd5\x60\x7f\xc8\xec\x7d\xad\xaa\xd3\x74\x89\x92\xa7\x30\x40\xf3\x0f\xda\xba\x89\xfb\x99\x83\x1e\xed\xcd\x86\xaf\xf5\x37\xe3\x5f\x9a\x7b\x2a\x5e\x6d\x8e\x31\xee\x19\x5f\xea\xe6\x0a\x34\xb8\xfb\xc0\x7e\xd8\xf7\xd2\x14\x71\x8d\xde\x82\xb6\x6e\xe1\x6e\x68\x98\xff\x4d\xf1\xa5\xe5\x98\xa2\x33\x69\x7c\x16\x46\x19\xb0\xe4\x87\x74\x18\xbc\xbc\xcb\x81\x89\xfa\x3f\xcc\x60\x6d\x0b\x23\x7e\xf6\xdb\xd0\x56\x20\x69\x2b\xf2\x3a\xd5\x8a\xba\x56\x9b\x74\x97\xc0\xab\xc5\x95\x13\xd4\x76\x85\xcf\xbf\x76\x5b\xa4\x7e\x79\x73\x8d\x2b\xb4\xe2\xdb\xa3\x08\xe2\xf9\xb8\x03\x6d\x05\x91\xb6\xcc\xb9\x0a\x87\x6d\x38\x5c\xec\x09\x3a\xb5\x0e\xf5\xbd\xac\x35\xa6\x81\x93\xb2\x5c\xef\x55\x15\x92\x4e\x4b\xcf\x35\x81\xcc\x2b\x18\xa0\xd9\xfd\x8f\x81\xed\xbf\x7e\x82\xf8\x3f\x03\x5b\x30\xee\x56\xa1\xa4\xd3\x89\x7f\x33\x6d\x7f\x54\x0c\x12\x65\x3e\x64\x9f\x4c\x0e\x7e\x13\x2f\xed\x7f\xd9\x7b\x58\x64\xd0\xae\x56\xdd\x54\x95\x15\x03\x28\x19\xf4\x8d\x60\xb8\x2f\xde\x7a\x48\x78\x39\x5f\x27\x84\x8c\x36\x28\xbd\xf6\xd0\xbb\x25\x95\x23\xf4\x69\xf7\x1c\x33\x9a\xdb\x1e\xdf\x65\x89\xe1\xd4\xa5\xc3\x00\x8a\x40\x5b\xb7\x49\x5b\x47\x0b\xbf\x5f\xe0\xff\x92\x90\xfe\x72\xe6\xf2\x18\x7f\xe7\xcb\x2b\xc9\x31\xa3\x79\x1f\x4f\x65\x7e\xcf\x6b\xd2\x3a\x9c\x32\xe3\x60\x82\x01\x94\x1c\xda\x0a\x21\x6d\x9d\xfd\xd7\xb4\xae\x7b\xa1\xa9\xab\x45\xb5\x58\x9f\x32\x20\x78\x66\x9b\x63\x99\xe7\x74\x98\xcb\x11\xed\xa3\x9d\x89\x67\xb6\x03\x89\xaf\x8b\x02\xda\x0a\xc5\x5d\x50\x7b\x6d\x95\xc8\x37\x24\x1a\x92\x79\x1f\xc7\xbc\xd3\xeb\x51\xb5\x72\xa0\x34\xdd\xe2\xbc\xa0\xd5\xe8\x7a\x84\xea\xe4\xea\x61\x3b\x0c\xa0\x94\xd0\xd6\x1d\xd2\x96\xcf\xc5\x06\x03\x9f\xf2\x6c\xe6\x17\x8f\x36\x16\x53\xc8\x62\x96\xdd\x66\x4c\x84\x3b\xd3\x33\xd8\x8c\x5c\x2e\x4a\xcd\xed\x3f\xa8\x83\x01\x94\x0a\xda\x0a\x23\x6d\x3d\xb4\x54\xb6\xab\x93\x0c\x3e\x36\xbb\xce\xa5\x42\xdb\x00\x22\x42\x04\x2e\xa5\x44\xf3\xbc\xfc\xbb\xa7\xe8\x7c\x5c\xd6\xb1\xca\x53\x18\x40\xa9\xa1\xad\x70\xd2\x56\x6c\xd3\xfa\x75\xcb\xd4\x8b\x29\xe4\x2c\xa5\x3d\x0a\x9f\xba\x6a\x25\x06\x0f\x5b\x92\xeb\xe4\xcb\x82\x53\x94\x87\x36\xe8\x6d\x9d\x30\x80\xd2\x40\x5b\x11\xb8\xdd\x88\x24\x45\x7c\x14\xcd\x64\xb4\x59\x4c\x71\xc4\x08\x7d\xc7\x08\xf9\x1b\x81\x5a\x35\xb2\x35\x3d\x8b\xe1\xeb\x84\xcf\x9f\x8f\x7b\x60\x00\x45\xa1\xad\x48\xdc\xb0\xcc\xe5\x3b\x9b\x99\xea\xac\xfa\x2a\x7e\xbe\x6c\x51\x8a\xd7\xa3\xca\xeb\xe8\x9a\x1f\xad\x5d\x90\x28\xc3\xf7\xa7\x46\x5f\x2f\xc9\x62\x00\x25\x40\x5b\x51\xb8\x0b\xc4\x27\x0e\xc6\x59\x9d\x0f\x41\x4d\x6f\xe4\x13\x6d\xde\xee\x5d\x8c\xd4\xbe\x24\xb4\x4c\x1f\xff\x6e\x30\xec\xd3\x85\xcc\x90\x4a\x36\x0c\xa0\x7b\xa0\xad\x68\xd2\xd6\xdd\x84\x0e\x3f\x71\x2e\x0b\x4a\xf3\x57\xdf\x7c\x5b\x4b\x33\xe6\xee\xcf\xaf\x75\x8a\x1e\x0e\x91\xa0\xfd\x44\xcd\xf6\xc8\x57\x5e\x11\x03\xe8\x5e\x68\x2b\x86\xb4\x15\xc8\xf5\x25\x5e\x65\xb5\xa3\x28\x5e\x74\x5e\xa4\x66\x82\xce\xee\x1b\xa3\x28\xed\x1d\x57\x53\x65\xb5\xb5\xc3\x2b\xdf\x97\x05\x4c\x31\x80\xd2\x42\x5b\x77\x71\xb7\xee\xf9\x16\x56\xb3\xdf\xd1\x04\x13\xbe\x75\x76\xf9\x95\x89\x66\x96\x74\x2b\xd7\xae\x2a\xea\x76\x32\xd0\xda\x3e\x64\x10\xb9\x4d\x8e\x01\x74\x1f\xb4\x75\x0f\xf7\x3d\x1e\x7c\xf8\x43\x28\x6c\xe2\xa4\x70\x7c\xef\xcc\x65\x93\x1b\xf6\xd8\xc3\x89\x85\x7b\xfa\x67\x63\x25\xcf\xb4\xee\xbb\xee\x47\x73\x1a\x03\x28\x1d\xb4\x75\x9f\xb4\x75\xbf\x52\xf5\x52\x29\xff\xe6\x52\x74\x95\x82\xa3\x7f\x7d\xe8\x56\x5b\xfc\x2f\x79\x56\xa9\x47\xe5\x25\xef\x58\x6c\xf3\x0b\x35\x88\xc7\xd7\x7e\x68\x2b\x16\x77\x47\xf2\x8f\xa7\x47\x6e\xf9\x1d\xe1\xf1\xb7\x8d\x2f\xc3\xe5\x15\x77\x3e\x78\x0e\x0a\x4b\x26\xa7\x3d\xea\x3e\x67\xdd\xed\x7c\x2b\xf9\x0c\x06\x50\x7a\x68\x2b\x8e\xb4\x15\xbe\xb4\xa4\x9c\xf0\x9a\x6d\xb9\x6a\x39\xe9\x57\x6e\x8e\xac\x80\x93\xd9\xcd\x77\xb9\xdf\x1a\x72\xbc\x66\x8f\xfc\xb0\x3a\x9c\xb9\x1f\x03\x28\x03\xb4\xf5\x80\xb4\x35\xe9\x7d\x3b\x78\x27\x7c\x2a\xed\x5f\xeb\x0f\x67\xe9\x33\xf1\x1f\x0a\xf4\xc3\xf3\x06\xeb\x3a\x8f\xb7\xe9\xb8\x1d\xe7\xae\xcd\x66\xc0\x00\xca\x08\x6d\xc5\x93\xb6\x26\x94\xe2\x8e\xdd\x6b\x8d\xae\x16\xe9\x4b\xa9\x7f\x49\x76\x9f\x2b\xff\x9a\x99\x36\x65\xcf\x33\x72\x87\xb8\x34\x9e\x37\xf9\x8a\xc4\x63\x82\x09\xda\x4a\x20\x6d\x19\x28\x65\x2a\x92\x17\xb4\xfe\x4b\x93\x52\x3d\x63\xd0\x52\xa5\x9c\x53\xb5\xc6\xe5\x36\x89\x19\x1e\x64\x51\x0e\x6a\x72\x79\x6c\x84\x01\x94\x19\xda\x4a\x24\x6d\xf9\xbb\xd3\x06\x7d\xac\x09\xba\x4f\x76\xd9\x2c\xf6\xa7\xac\x8c\xba\xec\x5e\x6e\x9b\x87\x0e\x09\xfd\x99\x1c\x57\xbe\x45\xb7\x1b\x4a\x61\x00\x65\x81\xb6\x92\x70\xaf\xeb\xb2\xd2\xd5\xa7\xa6\xd2\x2d\xef\x0e\x1f\x29\x16\x7b\x24\x6d\x73\xca\xf6\xa3\xe8\xe1\xec\x0e\x21\xaa\xce\xe5\xaa\x81\xeb\x29\x07\x30\x80\x1e\x80\xb6\x1e\x92\xb6\x72\x4d\xbf\x05\x8b\x71\x6e\xd3\xff\xe9\x06\x31\x5d\x4b\xf1\xf7\x6e\xf8\x49\x1d\x4f\xce\x94\x79\x9c\x83\x5e\xbe\x2d\x6c\x16\x4a\x83\x01\xf4\x20\xb4\x95\x8c\xbb\xc3\xf6\x0f\xb3\xd2\x3f\x9c\x39\x14\x60\x57\x38\x68\x26\xfc\x47\x35\x8a\x7e\xe0\x50\x24\x9b\x32\xd7\xbd\x9c\xb9\xcc\x52\x30\xc9\x83\x01\xf4\x10\xb4\x95\x82\xdb\xd8\xb5\x48\xd3\xdd\xcd\x5b\x4a\x79\x6d\xab\x57\x7c\xaa\x3a\xe3\x41\xda\x94\x34\xe5\x35\x2e\x71\x97\x2b\x4a\x45\xe7\xbd\x7f\xac\x69\x61\x00\x05\xd0\x56\x2a\x69\x8b\x76\x96\x77\x76\x5b\xa0\x65\x33\xa9\xdf\xe5\xcc\x5b\xcd\xf1\xc6\xbd\x4d\x21\x34\x2b\x87\xdf\x2f\x04\xbf\xbe\xbe\x41\xdb\x27\x46\xbc\x76\xb0\x42\x5b\x8f\x48\x5b\x15\xcf\x6e\xf7\xce\xe9\xff\x6a\xdc\x32\x5a\xfa\x70\xfa\xc2\x5d\x9a\x88\xe1\x78\xee\xa4\x25\x57\x81\xac\xa5\xcd\x14\xa9\xbd\xb9\xb4\x18\x40\x0f\x43\x5b\x8f\x49\x5b\x5d\x95\xc6\x3a\xb3\x4f\x8a\x4a\xce\x56\x25\xb1\xf9\xb9\xa6\x3f\xbd\xc6\xe5\x99\x72\xa8\x50\xe7\x43\xf2\xe3\xbb\x4c\xf5\x2a\x4a\x1c\x18\x40\xd9\xa0\xad\x27\xa4\xad\xe1\xc9\x05\xb6\xe5\x03\xa2\x09\x2b\xcf\x57\x59\x76\x1b\x8f\xb6\xbe\x3a\xcc\x6f\x3e\x70\xfd\xd4\x32\x99\xda\x91\x13\xcd\xde\x4a\xe7\x31\x80\x1e\x81\xb6\x9e\x92\xb6\x7e\x50\x6c\x15\x3c\x61\xdf\x0a\x0a\x39\xcc\x49\x77\x23\xc6\xfd\x61\xe2\x87\xe0\xdc\x4e\xae\x49\xe6\xc2\x34\x51\xcd\x83\x21\x95\x56\x18\x40\xd9\xa1\xad\x34\xd2\x56\x1d\x67\xb8\x59\xa2\x20\x5d\xc6\x6d\x6e\x67\xe5\x94\x6b\xe8\xc7\x56\x82\x5d\x69\x39\xb9\xaa\xdc\x31\xb5\x3d\xb1\x7d\xae\xd1\xba\x18\x40\x39\xfe\x63\x60\xfb\xaf\xff\x08\xf2\x3f\x03\x5b\x3a\xe9\x3f\xde\xfb\xd3\xab\xd3\x6d\x65\xb8\x6d\xc0\xd9\xe6\xa2\xbd\xb9\xa7\x93\xc6\xf1\x18\xa9\x4b\xf1\x66\xfb\x5c\x50\x8b\xc6\xcb\x35\x18\x71\xf1\x3c\x0a\x7d\x23\x19\xa4\x2d\xc1\x27\xde\xfe\x07\x7c\x35\x5f\xd0\x55\x48\xf8\xba\xb3\xd3\x77\xe5\x1e\x70\x38\x4c\x99\x50\x5f\xa2\x94\x53\xb3\xe8\x7b\x27\xe8\x20\x06\x50\x4e\x68\x2b\x13\xf7\xba\x50\x8b\x57\xe1\x3f\xd8\x6e\x8a\xe7\xda\xfa\xbc\x71\xcc\x4f\x7a\xde\x2a\xaa\xda\xbd\xa2\xd1\xb4\x9d\xb6\xf2\x7c\x3d\x44\x8e\x78\x11\x3c\x06\x6d\x65\x91\xb6\x92\x6d\x84\xd7\x5d\x6b\x55\x37\xb2\xab\x84\x65\x87\x52\xcf\x4a\x8a\xb4\x3c\x5b\xbd\xa7\x21\x25\xdc\x95\x7d\xc0\xd9\x84\xb1\x44\x00\x03\x28\x17\xb4\xf5\x8c\xb4\x95\xda\x5b\x4f\x65\x5f\xfd\x21\x5a\x81\x90\x6e\xfa\xe8\xee\x4b\xfd\x54\x29\x1d\xfd\x7d\x15\x60\xa2\xbf\x4d\x76\x70\x63\x63\x0f\x27\x06\x50\x6e\x68\xeb\x39\x69\xcb\x24\x7c\x86\x66\x81\x6e\xee\xf9\x5e\x66\x9a\xfe\xbd\xd9\x9a\xde\x96\x63\x6a\x9a\x7f\x91\x33\x89\x85\x2e\x43\x32\x8f\x02\xfa\x84\x31\x80\xf2\x40\x5b\xd9\xb8\x47\xb5\x11\x7b\x7a\xde\xec\x24\xb2\xad\x79\xf9\x97\xde\xd0\x31\xc8\x7a\x5d\xa3\xb9\xe4\x20\x1d\xa7\xd1\xa9\x65\xdb\x45\xf8\x1a\x4c\x1c\xbc\x8f\x43\x5b\x39\xa4\x2d\xaf\x3f\x9e\xbd\x9b\x0c\x0d\x72\x6b\xe1\xca\x45\x89\x63\xe5\x2a\xfc\x31\xd7\x22\xd5\x1f\xa6\x7c\x92\x79\x92\x07\x54\x2e\x15\x70\x61\x00\x3d\x01\x6d\xe5\x92\xb6\x7c\x7b\xdc\xaf\xe6\x55\x77\xd8\xef\x2d\xf7\x69\xd3\x2b\x2f\xf1\x2c\x7d\x58\xba\x1a\xd4\x70\xe4\xc3\x01\xca\xfa\xfb\xc5\xfe\xed\x54\x18\x40\x79\xa1\xad\x3c\xd2\x96\xc3\xfa\xe0\xcc\x0f\xf6\x7a\xe7\x92\x04\xab\x0d\xaf\x71\xaf\x08\xe6\x7b\xc7\xf3\xfc\xf7\x2e\x53\xa0\x02\xfb\xa4\x15\x6d\xec\x88\x0b\x0b\x1f\xb4\xf5\x82\xb4\x45\x79\xe7\xf6\xd5\xd5\x9b\xf2\x1f\x77\x79\x8b\x82\x55\xdf\x2a\xc6\xe7\x5b\x6d\xd0\x5b\x8c\xc6\x53\x16\x3b\x1c\xe7\x9d\x7e\x66\x2c\x86\x01\x94\x1f\xda\xca\xc7\x0d\xb8\x03\x8d\xa7\x4a\xe6\x14\x7f\x3f\x28\xdb\x3b\xf3\x83\xfe\xe4\xe3\x26\xae\xf2\xfd\x63\xd9\xf5\x8f\x98\x1a\xb5\x26\x6c\x33\x25\x88\x0b\xcb\x49\x68\xeb\x25\x69\x4b\x24\xe0\xb3\x42\x51\xf3\xf4\x64\x1e\x22\xdc\xe9\xaa\x57\x23\x5e\x60\x5f\x1a\xf4\x40\x92\x2a\xee\x92\xd7\xb4\x7d\xef\x1e\x0d\xe2\xa2\x7e\x0a\xda\x7a\x45\xda\x7a\x26\xf0\xdd\xcd\x30\x6a\x6c\xbd\x5d\xa5\x9f\xd0\x7c\xee\x91\xf8\xd5\xdf\x37\x38\xaf\x2e\x8c\x17\xc7\xe7\x31\x97\xda\xfe\x6e\x22\x1e\xf7\x02\xd0\x56\x01\xee\xb1\x6f\x08\x61\xd7\x46\xed\x5c\xe1\xd5\x09\xaf\x44\x65\x47\x8a\xec\xab\x6c\x26\x49\x7d\x2a\x8d\x5d\xa8\x38\xaf\x68\x9e\xe0\x94\x10\x06\x50\x41\x68\xab\x90\xb4\x35\x3b\xa5\x31\x72\xe9\xec\x89\x99\xf2\x9f\xf4\x98\xef\x4f\xe1\x88\x94\x6f\xed\x5b\x15\xca\xe7\x7b\x58\xaf\x44\xc7\x18\x19\x9e\xa2\xc0\x00\x2a\x04\x6d\x15\xe1\x36\x63\x86\xbb\xbd\x61\xd6\xe1\xea\x39\xb1\x83\x98\x67\xd7\x53\x6a\x66\xea\x69\x09\x5d\xbb\x78\xb9\x7f\x0b\x7b\xd2\x63\xdb\xbd\xe5\x31\x80\x0a\x43\x5b\xc5\xa4\x2d\xae\xa5\xe3\x6f\x24\x3d\x13\x0c\xd4\xd2\x7c\xe6\x32\x8b\x04\x28\x36\x55\x1e\x27\x2f\x25\xae\x3c\x4e\x6a\xd2\x6b\xf8\xf2\xcc\x86\x12\x03\xa8\x08\xb4\x55\x42\xda\xaa\xe2\x2b\xa7\xb7\xe5\x72\x0e\x7c\xb5\xc2\x7b\x5e\xa1\x7c\xaf\x8a\xbb\x89\x58\xdc\xfe\x83\xa9\x85\x82\xcc\x62\x1e\xfd\xe6\x39\x87\x31\x80\x9e\x86\xb6\x5e\x93\xb6\x84\x6d\x6e\x94\x86\xc8\xe9\xf1\x97\x59\x95\x84\x58\x2c\xc8\x8e\xee\xbb\xab\x77\x72\x27\x3b\xd8\xb5\x58\xa7\xee\x8a\xed\x28\x25\x71\xcd\x39\x03\x6d\x95\xe2\x1e\x93\x7b\xe7\xd6\xbf\x37\xcd\x28\x48\x0b\xe0\x57\xe6\x76\x3e\x2b\xe6\x17\x35\x05\xb4\xcf\x24\xdd\x1b\x4b\x9f\x60\xd3\x56\x5f\xbc\x88\x01\x54\x14\xda\x7a\x83\xfb\xe9\xc4\x79\x96\x5f\x5f\xe4\x76\x02\x68\xcf\x38\x9f\xfc\xdd\x7b\x3f\xef\x53\x84\x70\x93\x9a\xb8\x86\xf7\x4a\x76\x33\xe7\xf1\xf6\x7c\xe2\xa6\x5a\x0c\xda\x2a\x23\x6d\x2d\x94\xde\x3a\x39\x46\xc8\x6f\x53\x61\x8a\x71\x1b\x2a\x78\x23\xcd\xed\xec\xa1\x6b\xbe\x87\xac\x48\xbf\xd3\xcd\x6d\x66\x8e\x97\xf8\x79\x89\x43\x5b\x6f\x49\x5b\xe9\x92\xc7\x32\xe2\x3b\x5e\xce\x7c\x0b\x70\xa8\x24\x7f\xf1\xbb\x51\x43\x21\xde\xea\xa8\x70\x6f\x78\xda\x8d\xbe\xaf\xd1\xd4\x76\x86\x18\x40\x25\xa0\xad\x72\xd2\x96\x33\x6d\xca\xfa\xd4\x39\x81\xca\xaa\x5e\xcb\xc5\x82\x77\xd1\xb5\xb9\xc2\x47\xd0\x9b\xc7\x05\x8b\x52\xef\x0d\x5e\x3d\x39\x5c\x69\x8f\x01\x54\x12\xda\xaa\xc0\x3d\x26\x5f\x4a\x8c\x26\x67\x0d\x88\xe4\x91\x27\x94\xee\xb8\x8b\x1d\x59\x76\xbb\xf9\x4a\x2c\xbe\x6c\xe9\x9a\x47\x4b\x78\xa6\x19\x3b\xf1\xb8\x97\x82\xb6\xde\x91\xb6\xc2\x06\x68\xea\x2c\xbe\x60\x07\x1c\xd5\xdb\xda\x36\xbf\x6f\xc4\xac\x89\x1e\xaf\xc8\x21\x04\xae\xf6\xc4\xdb\x61\x9b\x9a\x43\xae\x18\x40\xa5\xa1\xad\x4a\xdc\xb0\x7c\x83\xcc\x75\xd0\x55\xae\xea\xe0\x4a\x95\x58\x6a\x99\x14\x7d\xe1\xa1\x98\x8e\x8f\x69\x96\x6c\x4d\xff\xc6\x4f\x29\x74\xe8\x11\x30\x80\xca\x40\x5b\x55\xb8\x47\x8f\xc7\xbd\xaa\xeb\xd7\xab\xf4\xbe\xcf\x35\x5e\xa8\x94\xff\x7b\x35\xda\x35\xa9\xdc\xe9\x75\x0d\x6f\x0d\xf5\x56\xc8\xb4\xe9\x38\x71\x73\x21\x0b\x6d\x55\xe3\x8e\xd5\x26\x5b\xd3\xb6\x73\xd3\x7b\x84\x44\xc9\x86\x63\x25\x1b\x8b\xb6\xbf\x6d\x97\x35\x4b\xaa\xb1\xbd\x7c\xc0\xb8\x35\x70\xbd\x83\xf8\x3d\xca\x41\x5b\x35\xb8\xf5\x6b\xf6\xdd\x31\x81\xf4\xf3\xa9\x8d\xae\xf2\x6a\x65\xb7\xd6\x42\x6d\x2c\x5f\xbe\x88\x1b\x2d\x52\x7b\x40\x75\xf3\x52\xc5\x41\x19\xe2\x20\x29\x0f\x6d\xd5\x92\xb6\xb6\x9e\xb3\x08\x90\x85\xf0\x8e\xdb\x1b\xf5\x1d\x38\x9d\x32\x30\x92\xca\x74\xab\x20\x83\x7e\x98\xdf\x60\x4c\xc0\x64\xc5\x4e\xc5\x16\x03\xa8\xc2\x7f\x0c\x6c\xff\xf5\xdf\x71\xff\x67\x60\xab\xc3\x5d\x6c\xae\x4c\x14\xd2\x6a\xfc\x0d\x37\x2e\x6f\xf6\x4f\xb2\xcc\x4a\xa4\xe0\xd9\x93\xcb\xe8\x27\x9d\x3d\x6a\xd8\x6c\xd2\xd6\x91\x61\x86\x01\x54\x11\xfa\x46\xde\x93\xb6\x6e\xfb\x0f\x8d\xfe\x4c\xb2\xa5\x3d\x34\xe5\xb8\x7c\xde\x5a\xaa\x7a\xf7\x26\x67\x7e\xeb\x76\x6e\xb5\x3f\xdd\x76\xb4\xf7\x31\x07\x39\x0c\xa0\x4a\xd0\x56\x3d\xee\x31\x40\xaf\xc3\xb3\x3d\x75\xfd\x57\x06\xd8\x0e\xd6\xf2\xdf\x7d\x5a\x12\x7a\xf4\xad\xb4\x35\xcf\xd3\xf9\x6b\x81\x3f\x0a\x3d\xcc\xdf\x1b\x63\x00\x55\x86\xb6\x1a\x48\x5b\x57\xa9\x1b\x56\x6c\xb4\x07\x2e\x8d\xa5\x55\x8f\x0e\x3c\xae\x24\xbf\x52\xc6\xda\xc2\x23\x1a\x77\x23\x7c\x54\xe1\x51\xe5\x42\x98\x24\x06\x50\x15\x68\xab\x91\xb4\xe5\xdd\x68\xe0\x74\xcf\xf0\xd7\x78\x5f\x72\xa8\x48\x47\x6a\x17\xdd\x56\xaf\x73\xe4\xcf\xab\x61\x89\x47\xfd\xb8\xa6\xae\x99\xcc\x08\x62\x00\x55\x85\xb6\x9a\x48\x5b\xef\xcf\x17\xbf\x70\x92\x2c\xfd\xf2\xd9\xff\x06\x55\xc3\x7c\x75\xd8\xf9\xc3\xa2\x53\xe7\x1c\x3f\x28\x74\xfa\x47\x2a\x56\x3a\xd6\x13\x17\x3c\x35\x68\xab\x99\xb4\x45\x9e\xf2\xf2\xcb\x25\x5d\x4a\x96\x7a\xea\x47\xca\xa6\x12\x4d\x09\xda\xf1\xd7\xb8\xf7\x04\x77\x60\x09\x7c\x57\xec\x23\xca\x73\x88\x53\xbf\x3a\xb4\xd5\x82\xbb\xbb\x19\x38\xb8\xc7\x36\x34\x72\x62\xa8\x04\xe9\xdb\x39\x76\x61\xcb\x6c\x8f\x3e\x95\x4d\x66\x0e\x99\x38\xfb\xa4\xb4\x0f\xf9\x35\x0f\x0c\xa0\x1a\xd0\xd6\x07\xd2\x56\x92\xd9\x60\x9e\xfd\xd0\x66\xbc\xf2\xe1\xbe\xab\xe9\x67\x9d\x76\xda\xed\x26\x72\x5d\xdb\xa3\x3c\xfb\xd2\xf9\x68\x6d\xe3\x7d\x94\x30\x80\x6a\x42\x5b\xad\xa4\xad\x9d\x53\x28\x8f\x86\x93\x49\x80\x33\x93\xcb\x23\xbf\x27\x06\xd8\xa4\xea\x93\xcb\x0a\xfb\x4c\x66\x97\x08\x0c\x87\x5f\x5e\x0f\x3c\x87\x01\xf4\x2c\xb4\xd5\x86\xbb\x1b\xcc\x48\x7d\x9f\xe9\x9e\xca\xbe\x99\x1a\xcd\xfd\x74\xe7\x3f\xa7\x5d\x5c\x78\xaa\x53\xf1\x65\x0f\xa5\xfb\xa9\xad\x81\x86\xad\x54\x16\x0c\xa0\xe7\xa0\xad\x8f\xa4\x2d\x0d\x64\xa4\xe4\x8b\x71\x48\x94\x51\x6f\x1c\x1f\x67\xa1\x6c\xfd\xcd\xc5\xc8\xec\x97\x8a\x77\x7a\x0f\x1e\xf0\x18\x26\x8b\xcc\x40\x31\x80\x9e\x87\xb6\xda\x49\x5b\xf4\xca\x1b\xb9\x42\x5d\xe4\x59\x13\x23\xb4\xc1\x76\x27\x1b\x6e\x67\x7b\x1c\x67\xcc\xa3\xca\x26\x2b\xa7\x0b\x55\xd7\x7a\x7f\x9b\x0e\x03\xa8\x16\xb4\xf5\x89\xb4\x25\x17\xe2\xf8\xd4\x55\x6f\x3c\x28\x86\xf3\xbe\x97\x5f\x9e\xce\xcf\x98\xcd\x21\xd0\x5b\x9b\x65\xad\xc0\xc2\x65\x39\xfd\x66\x1f\xf1\xdc\xd6\x86\xb6\x3e\xe3\x7e\x17\x44\x6b\x92\xf4\xfc\xc5\xac\x6e\xce\x0f\xe6\x76\xfd\x60\xfd\xef\xa2\xb4\x8c\xd3\xc7\x3a\x09\xb7\x2f\xba\xd7\x4d\x65\x8d\x8b\xa8\x60\x00\xd5\x81\xb6\x3a\x70\x3b\x67\xb6\x0b\xa3\xf7\xd6\xe8\xe3\x15\xa4\xd5\x44\x19\xd2\xdc\xb2\xef\x0e\xd9\x5d\xff\x26\xe6\xdc\x4d\x36\x9c\xc3\x30\xb7\x2f\xcf\x1b\x03\xa8\x2e\xb4\xd5\x49\xda\x12\xe7\xba\x59\x35\x26\x21\x98\x92\x7b\xec\x95\xf3\xf8\x6d\xf3\xbe\x87\xe6\x99\x16\xa9\x9e\xa3\xcf\x1d\x5a\xe5\xd7\xb6\x4c\x9f\xb1\x63\x00\xd5\x83\xb6\xba\x48\x5b\x96\x4e\xfd\x1d\xcf\x7a\x67\x3e\x55\x16\x32\x85\x27\xcb\x36\xc7\xb7\xc9\xdc\x4d\xfd\xad\xf4\x23\x2e\x6b\x72\x14\x91\x5a\x5a\x21\x0e\x33\xfa\xd0\x56\x37\xee\x11\xb2\x65\x5f\x37\xcb\x0d\x0e\xd7\xb7\x42\xa1\xdd\xe5\x14\xd2\x8f\x9c\x31\x81\x59\x3e\xa1\x20\xeb\xeb\xa2\x27\xd6\x7f\x3a\x1c\x24\x6e\x2e\x0c\xa0\xad\x2f\xa4\x2d\xaa\xe4\x6e\xad\x67\xb1\x2e\x97\xb2\xc7\x3c\xe4\x28\xaf\x61\x2b\x8f\x91\xb0\xf5\xb6\xb8\xe7\x8f\xac\xd1\x4c\x42\xcf\x5e\x03\x03\x0c\xa0\x86\xd0\x56\x0f\x69\xeb\x9c\x23\xcf\x01\x7a\xd3\xcd\x91\xd0\x29\x77\x9f\x27\xf2\x69\xc3\x4f\x0c\xdd\x14\x62\xc2\xff\x4c\xa5\x88\x59\xae\x53\x49\xa9\x51\x63\x00\x35\x82\xb6\x7a\x49\x5b\x4b\xd1\xb7\x80\xf8\x7d\x73\x11\x5b\xb3\x67\xab\x03\xa2\x0f\x4b\x7e\xcb\xc4\x0e\xc4\x33\x3a\xa6\xef\xb2\x44\xae\x66\xc4\x2e\xab\x63\x00\xbd\x00\x6d\x7d\x25\x6d\xf5\x5c\xbb\xb9\x23\xf5\x37\x6c\x3d\xa2\x2b\x30\xb2\x3f\xe5\xd1\x66\x3e\x87\x4c\x40\x30\xc8\x96\xa6\x40\x6c\xbf\x49\xf4\x29\x13\x37\x89\xc6\xd0\xd6\x37\xd2\xd6\x9a\x42\x87\xff\x89\xda\xd0\x2b\xd3\x17\x4e\xe6\x08\x4d\xbb\xaa\xd8\xd7\xe4\xfa\x5b\x69\x06\xb7\x3f\x77\x7e\x60\xfd\x8b\x6e\xea\x0a\x06\x50\x13\x68\xab\x0f\xf7\x68\x5b\xf7\x3e\xef\xb3\x8a\x43\xa9\x4f\xac\x63\xdc\x8d\x32\xea\xb5\xba\x8f\x66\x5b\xaf\x76\x0b\x07\xc6\xfe\xb0\xa5\xce\xeb\x8f\x66\xc0\x00\x6a\x0a\x6d\x7d\xc7\x9d\x43\x33\x7d\x14\xf5\xc9\xcb\xc7\xce\xf7\x4c\x6c\x5e\x6c\xaa\xa1\x13\x97\xd3\x38\xa1\x9e\x1e\x2f\xf9\x37\x25\xb2\xb7\xee\xb0\x35\x71\x98\x31\x83\xb6\xfa\x49\x5b\xd4\x37\x83\x0a\x1f\x58\x0f\xb2\xd3\x32\x5f\x1c\xda\x39\xc3\x57\xdc\x93\x33\xa4\x3c\x19\x2d\xe7\x65\xe3\xb2\xcd\xa6\xf5\xf9\x35\xf1\x1c\x32\x87\xb6\x06\x70\x3f\x3f\x52\x7a\x6f\xba\x29\xa0\xfb\x7c\x77\x23\xde\x28\x86\x2b\x43\x76\x98\xfb\xbd\xbe\x52\x57\x44\x7a\xfe\xed\xe4\xe8\x17\xb5\xb3\xc4\x96\x05\xb4\x35\x88\x7b\x1c\x2d\x11\xfc\x63\x8f\xd1\xf3\xed\x07\xe9\xda\x5f\xaf\x08\xf1\x09\x0e\x52\x1f\xd9\x88\xfe\x11\x47\xfd\xe9\xcb\x92\xec\x6b\xbd\x02\xe2\x31\x61\x09\x6d\x0d\x91\xb6\xa2\x3b\x55\x02\x26\x25\xc3\x26\x17\xce\xeb\xf8\x56\xa9\x5f\xd7\xcd\xfa\xb7\xd6\x2a\xe6\xdf\x57\xbb\xc6\x71\x92\xff\xe7\x1b\x35\x3e\x0c\xa0\x56\xd0\xd6\x30\x6e\xc0\x9d\xd5\xfd\xd9\xa2\xb0\x59\x16\xfb\x4d\xe4\xec\xb5\x3d\x7c\x89\x15\x11\x67\x1b\x24\xda\xfd\xdb\x4a\x94\x5e\x6d\xd2\x37\xa2\xc4\xf3\xf1\x22\xb4\x35\x42\xda\x4a\xf4\x74\xf8\x72\xe0\x15\x9d\x45\xee\x91\xad\x1f\xf9\x5d\x53\x9c\x9f\xe2\xd5\xb8\xd3\x31\x93\x88\xa1\xa7\xae\x4b\x1a\x55\x29\x76\x18\x40\xad\xff\x63\x60\xfb\x2f\x14\xe5\x7f\x06\xb6\x51\xdc\xc2\x42\xa9\xdd\xf0\xd8\xa9\x4a\xd0\x2c\xf4\x46\x36\x08\x3d\x2d\x13\xe4\xf8\x9e\xbd\xad\x67\x72\x52\xa9\x2e\x87\x1d\x39\x5c\xc6\x86\x01\xd4\x06\xfa\x46\xc6\x48\x5b\xcc\xa6\xec\xe7\xef\x53\x2f\x4c\x9b\xde\xaa\x53\xed\x0c\xee\xc8\xd2\xdc\x23\xcb\xae\xea\x5f\x7d\xf7\x26\x32\x94\x8f\x9d\x23\xd3\xc7\x00\x7a\x09\xda\x1a\x27\x6d\x65\x7e\xb5\xea\x39\x2c\xa6\xe1\x3a\x1e\xd0\x21\xeb\x9b\xa5\x32\xb5\x1c\x69\xb4\x93\x94\x9f\xe5\x71\x21\x53\xcd\x68\xf2\x3a\xa3\x2a\x06\x50\x5b\x68\x6b\x82\xb4\xf5\xee\xce\x75\x32\x72\x46\x3b\x67\x11\x33\x1b\xda\xcf\xf7\x93\x57\xb4\x5d\xf5\x37\xa9\xcd\x02\xc9\xe5\x7f\x51\x5b\x2e\x2e\xfe\x23\xee\x6c\xec\xa0\xad\x1f\xa4\xad\x8d\x22\x7f\xb2\x56\x73\x07\x7a\xb6\x02\xab\x70\xe3\x93\x12\x18\xbd\xc9\xef\x77\xd9\x63\xf7\x9a\xbc\xbc\x9f\x60\xf6\x8b\xee\xc4\x41\xf2\x32\xb4\x35\x49\xda\x2a\xfe\xa3\x39\xa5\xcb\x74\xff\x9f\x6e\xe7\x47\x11\x9f\x7f\xd9\x13\x7a\xfa\xa6\xf2\x31\x97\x9e\x6a\x51\x91\x49\x8b\x44\x5e\x78\x24\x83\x01\xd4\x1e\xda\x9a\x22\x6d\x95\x66\xba\x59\x34\xe4\x4a\x55\xd1\x9a\x27\x98\xac\x2c\xc8\xb4\xfe\x1e\xd8\x3d\x54\x7f\xe1\xc9\x16\xe3\x5a\xdc\x09\x7d\x37\x0b\x11\x0c\xa0\x0e\xd0\xd6\x4f\xd2\x16\x4d\x22\x41\xc5\x79\x9c\xec\x78\x8e\x2f\x4f\xfd\xe7\x0b\xe8\x09\xaf\x61\xc5\x85\xa8\xf3\x62\xc5\x3e\x59\x72\x61\xd3\x55\x3e\xc4\x5d\xa5\x23\xb4\x35\x4d\xda\x12\x13\xed\x6a\x63\x9f\xf1\x09\x28\xcb\xd8\x48\x9e\x58\x47\x9c\xe6\x82\xcb\x38\xa4\xc3\x75\xfb\xf5\x13\x4a\xe2\x87\x3f\x16\xca\x62\x00\xbd\x02\x6d\xcd\x90\xb6\x04\x56\x7a\x1c\x2b\x6e\x79\xfa\x06\x9f\x38\x23\x85\xaa\x7b\x9d\x33\xdf\x54\xea\xf9\xbc\x37\xc3\x8f\xb2\xe8\x32\x43\xe0\x6a\xfa\x09\x0c\xa0\x4e\xd0\xd6\x2c\xee\x04\x0e\x75\xb2\xab\xad\x56\xea\xfe\xf4\x28\xe5\x45\xb4\xcc\x93\xb4\xd3\xc5\x77\x6e\x3d\x6e\x11\xbe\xb8\xec\x4f\x46\x57\x78\xd0\xc6\x0d\x03\xa8\x33\xb4\x35\x87\x7b\x1c\x9d\x75\x24\xbc\x94\x2f\xd7\x7f\xf1\xfb\x33\x27\x3d\xc2\xbc\x73\x92\xe5\xf6\x2b\xee\x51\xf5\xb3\x27\xdd\x39\x32\xa4\x95\x1f\xf8\x60\x00\x75\x81\xb6\x7e\xe1\x16\x4f\xf9\x85\x12\x2a\x7d\xd6\xa3\xd2\xfb\x6d\x38\x33\x45\xe3\xe7\x33\xc3\xa2\xd0\x62\x13\x91\x87\x92\x4b\x1b\x54\x1d\xe5\xf4\xc4\x41\xd2\x15\xda\xfa\x4d\xda\xda\x33\x18\x7e\x32\x5c\xb7\x23\xaa\xb9\xe5\xda\x7e\xb3\x9a\x49\xb7\x3f\x66\x2d\x65\x97\x33\xef\x29\xf2\x44\xc5\xf5\xe6\xf0\x2e\x88\x61\x00\x75\x83\xb6\xe6\x71\x8b\x54\x2e\xa7\xaf\x4c\x81\x9a\xd1\x25\x43\x17\x15\xca\x4d\xaa\x8f\x23\xa5\xf3\xde\xac\xfb\x25\x7d\xb3\x2e\xcf\xc7\x7e\x1d\xf7\x3b\x85\x01\xd4\x1d\xda\x5a\xc0\xfd\x96\xc7\x41\xd9\xa5\xaf\x36\x67\xe8\x8e\xab\xbd\xf3\x92\x7b\x47\x6e\x7a\xed\x9d\x6d\x96\xca\xe3\x94\xb2\xef\x7b\x37\xea\x10\x06\xe2\x05\xc2\x03\xda\x5a\x24\x6d\x5d\xf8\xfc\x40\x66\x33\x83\x41\xf9\xce\x9b\x7f\x7f\xe4\xf7\x37\xdf\xb7\xf1\x9e\xf6\xee\x3f\x47\xc7\xf5\xb5\xe8\xbd\x0b\xa8\xe0\x70\xc6\x00\xea\x09\x6d\x2d\xe1\x7e\x9b\x62\x3f\x19\x6d\x71\x20\x77\xeb\x5f\xd5\x87\x76\xfa\xe7\x0a\xa3\x4c\x47\x98\x63\x59\x5d\x67\x2e\x2f\x64\x1d\x00\xb9\x2c\x64\xe2\x18\x40\xbd\xa0\xad\x65\xd2\x56\xda\xb5\xc7\xb6\x8e\xbb\xbc\x45\x5b\x01\xd4\x35\xea\xac\x09\x77\x42\x3f\xe8\x54\x95\x6e\x94\xd4\x32\x74\x70\x82\x86\x8c\x3a\xe2\x3a\xe1\x0d\x6d\xfd\xc1\xb5\xa4\x4d\x0b\x14\x75\x47\xe5\x2d\x46\x1a\xcb\x1d\x44\x2e\xbd\x8e\xf3\x8a\x79\x93\xe9\x6d\xb8\x78\x64\x66\x21\x6a\x76\xca\xde\x1d\x03\xa8\x0f\xb4\xb5\x42\xda\x3a\x9f\xfa\x9e\x6a\xeb\xac\x4c\x60\x5b\x4f\xa2\x81\x51\xce\xd9\xf3\x0f\x1f\xd2\x86\x79\xdd\xda\xbe\x74\x6a\x9c\x89\x83\xa3\x3a\x64\x2f\x06\xd0\xab\xd0\xd6\x5f\xd2\x96\x90\x7b\xd1\xae\x5f\xff\x0f\x67\xce\x82\xa1\xaf\xfe\x02\x4c\x75\xee\x91\x5f\xca\xbe\x0a\xeb\x76\x1c\x7f\x6d\x24\x15\x72\x85\xe6\x20\x06\x50\x5f\x68\x6b\x95\xb4\x15\xb5\xb0\x4b\xce\xc1\xf6\x3e\xef\xe0\x2b\x7f\xb7\x70\x1e\x36\x36\x17\xa7\x56\xcb\x90\x37\xf2\xd2\xe2\xe5\x15\xd8\x71\xb2\x4c\xe2\x1a\x7d\x0d\xda\x5a\x23\x6d\x45\x34\x07\x5d\x54\xa5\xa9\x4c\xd3\x2a\x79\x67\x28\xee\x3b\x75\xf9\xc3\xd6\x44\xe8\x2b\x47\x7f\xba\x71\x4e\xd6\x46\xce\x1b\xc2\x5a\x18\x40\xaf\x43\x5b\xeb\xb8\x81\x8d\xf3\xf7\x88\x0f\xf7\xcf\x5b\x33\x25\xe6\x73\xcf\xc5\x42\xf7\xff\x9d\xfb\xca\x90\x49\x1f\x6a\x6c\x57\x6c\x70\x7c\xb0\xe2\x3e\x71\x88\xf7\x83\xb6\x36\x48\x5b\x0a\x5e\x8f\x85\x4f\x0c\xb5\x8e\xc7\xac\xed\x2c\x04\x67\xbd\xba\xc3\xa6\x94\x18\xe5\xb7\xf7\xc6\x5c\xf5\xc7\xf9\xb6\x58\x91\x67\x4e\x18\x40\x6f\x40\x5b\x9b\xb8\x0d\x67\x62\x7b\x34\x4d\x47\xff\xc2\x05\x46\xd5\xe0\xe3\xae\x86\x55\xf5\x53\x85\xe7\x3d\x07\x79\xfd\x0d\xf5\x54\x7a\x28\xf4\x03\x89\xc3\x8c\x3f\xb4\xf5\x0f\xb7\xae\xca\xd9\xf3\xab\xc7\x4e\xc6\x8a\xa6\x3e\x57\xb3\xbd\x9c\x71\xf9\x5b\xba\xe5\x1b\x45\x3a\xa3\xab\xc8\x71\x99\xc9\xa5\xc7\x5f\x89\xeb\x57\x00\xb4\xb5\x85\x3b\x87\xf6\xd1\xde\x3c\xd9\xfe\xe2\x4f\xf5\x61\xb9\xfd\xfc\xe2\x46\x31\x2b\x0f\x4e\x65\xb6\x9d\xfb\x48\xfb\xd7\x46\x8d\x49\xa6\x5f\x58\x10\x03\xe8\x4d\x68\x6b\x9b\xb4\xf5\xea\x99\xea\xbf\xdd\x7f\xa7\xb5\xfb\x26\x53\xe4\xb2\x17\xd6\x35\xfe\xe9\x9c\xbc\xab\x35\x7c\x98\x50\x2f\x1d\xc3\x21\x1e\x3a\x60\x81\x01\xf4\x16\xb4\xb5\x83\x7b\x7c\x7f\xaf\xf2\x30\xb3\xa8\x90\x6f\xb4\xbd\xd8\x9f\x79\x69\xce\xb9\x7e\x44\xb2\xde\xf4\x51\xd8\xa8\xa3\xff\x89\x11\x4b\xca\x5a\xe2\x31\x11\x08\x6d\xed\xe2\x9e\x1a\x0d\x46\xb6\x75\x89\x5b\x85\x55\x0d\xaf\xd7\xbc\xe0\x49\x88\xe8\x64\x19\x99\x5f\x75\xec\x10\x14\x7c\xfb\x87\xf3\x41\xf6\x4f\x01\x0c\xa0\x41\x90\x56\x07\xd3\xff\x1b\x4d\xf7\xff\x0f\x6c\x00\xc1\x89\x6b\x12\xef\x7e\xb8\x2d\xb9\xa9\x7d\x7d\x95\xc3\x88\xc4\x97\xf4\x44\xa3\x1f\x2e\xe5\x6b\x7d\xad\x5a\x7d\xb8\xc2\x40\xa6\x14\x7a\xdd\x1c\x03\x28\x54\x5c\x03\x08\xce\x5c\xfb\xe3\x46\xfd\x32\x3a\x3f\xb7\xf7\x4f\xe3\x4b\x6d\xdd\xeb\x93\x9e\x05\x14\xd6\xe6\xd2\x4d\xe4\xb9\x15\xbf\x02\xfe\xc5\x27\x6a\x51\x62\x00\x85\x9a\x6b\x00\xc1\xa9\x6b\x3f\x3d\xde\xdd\x35\xa1\x50\x0f\xb3\xff\x74\x29\x81\xf2\x26\xcf\xcb\x86\x4a\x91\xd3\x11\x5c\x23\x32\x9f\x97\xe2\x14\x9c\x5e\xcd\x32\x61\x00\x85\xaa\x6b\x00\xc1\xb9\x6b\x5a\x05\xdc\x95\xe7\xb2\x9f\xb0\x6c\xbf\x93\x69\xe4\x4a\xfa\x5e\x48\x91\x94\x37\x2a\x9d\x6c\xc3\x7d\xed\x54\xc1\x09\x45\xb2\x21\x51\x0c\xa0\x50\x77\x0d\x20\x38\x79\x2d\x64\xf0\x10\xe1\xe6\x59\x3b\x8a\xc6\x4f\x52\xf7\x3c\x95\xd3\xa4\x3b\xd5\xba\x93\xef\xaa\xdf\x89\x7b\x9a\x95\xcb\xf3\xac\x71\x1f\xf1\xaa\x0a\x95\xd7\x00\x82\xb3\xd7\x08\xf4\x66\x4f\x24\xb3\x37\x68\x52\x39\x4d\x8d\x5f\x4e\x57\x9d\x32\xa7\x75\xfe\x15\x46\xb5\xa8\xb6\x74\xf5\xfe\xa1\x37\x4b\x43\x87\x30\x80\x42\xed\x35\x80\xe0\xf4\xb5\xeb\x5a\xc5\x3c\x2d\x69\xd5\xe2\x9e\x7e\xef\xf6\x2e\xa9\x48\x85\xf6\xfe\xc8\xb5\x48\x1a\xba\xa1\x34\x66\xc3\xe6\x7c\x2a\x92\x8c\xf8\x6d\x42\xf5\x35\x80\xe0\xfc\xb5\x98\x96\x66\xa3\xd7\x15\x4c\x81\x84\xef\x3d\x52\x3d\xf3\x82\xeb\x5e\x33\x85\x95\x86\x42\x3f\x0f\x75\xa8\x70\x77\xd9\x7d\x15\x3b\x8f\x01\x14\xea\xaf\x01\x04\x27\xb0\x6d\xba\xcb\xfb\x89\xe6\xed\xd2\xe6\x0e\xd1\x28\x51\xd1\xbe\x06\xdd\x94\x3a\x17\x8f\xdb\x16\x07\x6c\x25\xb7\x1f\xe5\xae\xf3\x72\xc0\x00\x0a\x15\xd8\x00\x82\x33\xd8\x5a\xdc\xa7\xd4\x1c\xfa\x3f\x79\x9f\x07\x1f\x22\x69\xc5\xf5\x87\xf5\x02\x3a\x9e\x82\x3f\x17\x47\x5d\x92\xee\x0f\x18\x66\xbd\x54\xc0\x00\x0a\x35\xd8\x00\x82\x53\xd8\x3a\x79\xe3\xb6\x68\x34\xae\xbf\xb8\xbb\x56\xbc\x15\xd8\x42\x57\xee\x73\xcd\xd5\xc8\x5e\x36\xc4\xf0\xbb\xf3\x3f\x1f\x23\xa9\xee\x03\x18\x40\xa1\x0a\x1b\x40\x70\x0e\x5b\x09\xad\x48\xf3\xeb\xd7\xba\x52\x4d\x3d\x79\x81\xe2\x65\x95\x91\x6c\xf3\x8b\x07\xe5\xd4\x23\xca\x86\x1e\xc4\x7a\x58\x30\xec\x3b\x82\x01\x14\xea\xb0\x01\x04\x27\xb1\xe5\x84\x54\x5c\x35\xb7\x4f\x55\x5a\x64\x2d\x72\x5d\xe7\xb5\x45\x2e\x2e\x54\x5a\x9b\x15\x1f\xaf\x1c\xf9\xc6\xbb\x48\xd1\xac\x41\xdc\x16\x42\x25\x36\x80\xe0\x2c\xb6\xce\x67\xbf\xa6\xfd\x6e\x70\x9f\x3a\x90\xb2\x6d\xfe\x31\x8a\xcb\xe7\xe1\xe0\x5b\x13\xaa\x17\x2a\x71\x53\xb6\xe9\xbf\xaa\x1a\x34\x8e\x63\x00\x85\x5a\x6c\x00\xc1\x69\x6c\xe4\x2f\xa2\x9e\xc9\x32\xdb\x7c\x0e\x93\x55\x55\x7f\x16\xa4\x54\x6a\x92\x59\x26\xe3\x4d\xae\x7a\x22\xc9\x82\x59\xfb\xf0\x5e\x0d\x80\x01\x14\xaa\xb1\x01\x04\xe7\xb1\x79\x38\x48\x3e\xa4\x8d\x67\x0b\x4f\x2f\xd8\x91\x5b\xc1\xac\x67\x87\xa3\xab\xf2\x5d\xde\x47\x6c\x6f\xdf\xd4\xba\xab\xca\xcd\x4e\x1c\x6e\xa0\x1e\x1b\x40\x70\x22\x5b\xd2\xa0\xeb\x69\xed\xd9\xf2\x5b\x0e\x41\x5e\xae\xc6\x34\x19\x55\x91\x9d\x3e\x4c\x93\x0f\x67\x19\x7d\x3e\x4f\x53\x1e\x7f\xea\x6d\x85\x01\x14\x2a\xb2\x01\x04\x67\xb2\xad\xdb\xbb\xf0\xfd\xb4\xcd\x7c\xf4\x52\xeb\xbd\xe4\xbd\xd3\x8c\x2f\x59\x7e\xb7\x5d\x3a\xb1\x5b\x7e\xad\x99\xd1\x51\xc3\xf6\x7d\xa8\x21\x06\x50\xa8\xc9\x06\x10\x9c\xca\x46\xfb\xb9\xd9\xf9\xe4\x8b\x9e\x27\x87\x8b\x35\x86\x52\x68\x1d\x03\x7a\x92\x5a\xd6\xa5\x63\x6b\x5b\x55\x83\xd9\x27\x7b\x0a\x95\xd9\x31\x80\x42\x55\x36\x80\xe0\x5c\xb6\xdb\x87\xe9\xb8\x0e\x68\x7d\x0d\x0d\x63\x45\xc3\xea\x9f\x5c\x96\x5b\x4b\x8c\x8a\x2c\xa9\x19\xb3\xae\x39\x67\xb3\x4f\xa2\xea\xda\x49\x0c\xa0\x50\x97\x0d\x20\x38\x99\xed\x8a\x1a\x9f\x59\xd3\xb1\x8c\xa3\x94\xe7\xec\xcd\x3f\x1e\x54\x93\x7d\x62\xf9\xb7\xe9\x8e\x93\x28\x7d\x4e\x17\xa6\x96\x67\xfa\x41\x11\x03\x28\x54\x66\x03\x08\xce\x66\xd3\x1e\x79\xa7\x9f\x2c\xee\x40\x4f\x7d\x6b\x35\xff\x79\x69\xc9\x06\xca\x35\x2d\xca\xe4\xf9\xca\xbb\x48\x62\x99\x35\x74\xde\x96\x78\x99\x85\xda\x6c\x00\xc1\xe9\x6c\xc2\x11\xaa\x9c\xd6\x85\x06\x4f\x36\x67\x0b\xc9\x8c\xde\x72\x78\xe8\x14\x7e\x79\xc2\x9b\xd7\xd8\x5a\xff\xf0\x96\x77\xa5\x68\xcf\x31\x0c\xa0\x50\x9d\x0d\x20\x38\x9f\x2d\x77\x67\x35\x11\xd8\xa7\x4d\x27\x85\x1c\x11\x2f\x3d\x16\xe6\x3e\xa4\x3b\x31\x2f\x43\x1f\xbf\x53\xa2\x1f\xc4\x1b\x74\xf2\xb8\x04\x06\x50\xa8\xcf\x06\x10\x1c\xd0\xb6\xc7\x79\xa0\xfd\x3c\xed\xa4\xc0\x87\x87\x34\xa9\xd3\x5d\x72\x53\xd9\x4e\xe4\x13\xf9\x0c\x53\xbc\x67\xbe\x99\xdf\x96\xb1\xfc\xc1\x8b\x01\x14\x0a\xb4\x01\x04\x27\xb4\xd5\xf7\xf0\xab\x0e\xb4\x93\x91\x7f\x5a\x3b\xf7\x42\xd1\x36\xe5\xe4\x1e\xfa\xcc\xcf\xe9\xe6\x84\xfc\x70\xab\x7d\x8f\x52\xfa\x5a\x89\x57\x27\xa8\xd0\x06\x10\x1c\xd1\x76\x9b\xea\x8f\x66\xd6\x53\x2f\x87\x59\x56\x9d\x9b\x0f\xde\x99\x9f\x6b\xfd\x74\xa7\xae\x6e\x25\xd3\x54\xfa\x96\x65\xec\xc5\xed\x58\x0d\x0c\xa0\x50\xa2\x0d\x20\x38\xa3\x4d\x57\x29\x47\xf9\x60\x08\xf9\x77\xff\xf7\x7d\xfc\xa9\x73\x73\x11\xc0\xf0\x96\xa7\x93\x34\x67\x76\xc2\xfd\x97\x46\x63\x57\xae\x11\x17\x47\xa8\xd1\x06\x10\x1c\xd2\xf6\xc2\xa9\x69\x6f\xb9\x7d\xb1\xdd\x70\xe4\xc9\xa7\x46\x3e\x5a\x79\x82\x52\x6f\x9b\xab\xe9\x94\xb9\x8e\x26\xbf\x5d\x10\xae\x3e\xc5\x8a\x01\x14\x8a\xb4\x01\x04\xa7\xb4\x79\x38\x45\x0b\xfe\x79\x34\x73\x31\x33\x6b\xd6\xd1\xea\xdd\x10\x6f\x91\xfe\x4c\x22\x5d\xfc\x91\x5d\x2d\x25\xc6\x82\x7f\x17\x46\x65\x31\x80\x42\x95\x36\x80\xe0\x98\xb6\xed\x81\x64\x21\xd3\xd7\xad\xba\x32\x47\x82\xb7\xdf\xa0\x97\x7b\x69\xcb\x8d\x12\xba\x3f\xf3\x50\xd2\x5b\x32\x5f\xbf\x36\xf4\x90\xb8\xef\x83\x32\x6d\x00\xc1\x39\x6d\xdc\x2d\x0e\x8d\x29\xf9\x5f\x4e\xb7\xbf\xfe\x76\xf2\xbb\xa8\x95\xa1\x6e\x46\x0a\x7d\xd2\x8b\x2a\xc5\x27\x55\x0d\x8b\xf1\x6e\xfd\xcc\x18\x40\x61\x4e\xdb\xff\x0d\x74\xff\x05\x08\xff\xef\x40\x87\x83\xda\x28\x7c\xff\x06\x7a\xe8\xc4\x9e\xbe\x76\xf9\x5c\x3e\xc1\x8f\xf5\x52\x2c\x21\xcd\x55\x3a\x67\xff\xbb\x55\x23\x87\x71\xbd\xca\x37\xc4\xa3\x1c\x0a\xb5\x01\x04\x27\xb5\xb1\xea\x35\xa9\x8c\xe8\xbc\xa4\x9f\x2b\xe6\xf2\xc4\xa4\x2e\xd8\x64\x5d\x8d\xe5\x3f\x5c\xd8\xe9\x2a\x79\xc5\xf0\x67\xeb\xb6\x11\x71\x1f\x05\x95\xda\x00\x82\xa3\xda\x94\x93\x0f\x9f\xf0\x15\x2f\x5f\xcf\xe0\x15\xfe\xb2\xac\x63\xa3\xef\xef\xb9\x23\x55\xae\x3f\x99\xd4\x70\xf2\xf3\xe2\xc3\x90\x72\x2f\x0c\xa0\x50\xaa\x0d\x20\x38\xab\x6d\x8d\xfa\x1c\x77\xc5\x31\x9d\xd7\x79\xc7\x5e\x4f\x67\x31\x8d\xf5\x28\x17\xe8\x6c\x52\xcb\xdf\x0a\x10\xd4\x79\x13\xb9\xc3\x60\x4f\x5c\x66\xa0\x56\x1b\x40\x70\x58\x5b\x9a\xc7\x55\x15\x8a\x2f\x32\xbb\x05\x37\x3e\xf5\x53\x9b\xcf\x69\x9c\x7d\xbb\x1e\x7d\xce\xd2\x26\xfe\x56\xa7\xe3\x34\x9d\x92\xb0\x07\x06\x50\x28\xd6\x06\x10\x9c\xd6\xf6\x42\xf8\xc8\x06\x62\xab\xb4\x92\x37\x6d\xb6\x38\x95\x7f\xfb\x97\x01\x59\x75\xf7\xca\xc4\x01\x6a\x6b\x64\x66\x74\x58\xd0\x48\x17\x03\x28\x54\x6b\x03\x08\x8e\x6b\x73\x13\x78\xb9\x4b\x49\xf1\xd6\x7c\xbe\xfe\x57\x31\x35\x5d\xe5\xa4\xdc\x54\x06\x99\xbf\x3d\x73\x08\x5b\x39\xea\x6d\x9c\xd0\xaf\x8d\x01\x14\xca\xb5\x01\x04\xe7\xb5\x95\x8e\x71\x11\x76\xd2\x36\x7f\x7e\xba\x25\x65\xbe\xbd\xf6\xe7\xf1\x09\xae\xc0\x23\x67\x84\x19\x46\xf6\x82\x0d\x82\xc7\xaf\x34\x61\x0c\xa0\x50\xaf\x0d\x20\x38\xb0\xad\xf9\xdb\x94\x59\x18\xfd\xf2\xc1\xbb\xc7\x18\xe4\xdb\xdb\x2f\x9c\xb6\x5c\xd4\xe8\xde\x88\xdf\x15\x56\x0d\x63\xba\x0f\xea\x0e\xea\x63\x00\x85\x82\x6d\x00\xc1\x89\x6d\x53\xa2\xdf\x5e\x6e\x3e\x77\x23\x97\x33\x3e\xe8\x25\x1c\x4e\xfe\x4a\x5e\xd8\x9e\xbc\x9a\x83\xe7\xf6\x17\x2a\x3d\x87\x6e\x03\xfb\xd3\x18\x40\xa1\x62\x1b\x40\x70\x64\x1b\xb5\x5d\xbd\x1d\x4d\x5b\x4b\xd7\xed\x94\x03\x43\xa7\xa2\x05\x7b\x35\xc7\x8e\x5f\xd1\x18\xd8\x88\xd4\x8e\xbb\x60\xba\x12\xa1\x47\x5c\xb3\xa0\x64\x1b\x40\x70\x66\x9b\xe5\xf3\x47\xae\xb2\x05\xab\x6a\xf4\x11\xc6\xa7\x4d\xea\xc9\x6e\x59\x99\xba\x51\x7f\x9e\xbe\x71\x3b\xa4\x49\xd1\x89\x59\xe4\x12\x03\x06\x50\xa8\xd9\x06\x10\x1c\xda\xe6\x3c\xbc\x0d\x1e\x4f\xb5\xe4\x7d\xe2\xf7\x28\x8b\x9f\xa4\x7e\x7f\xcf\xd0\x57\x35\x3b\xa9\x54\x37\x92\xf7\xa3\x47\x7d\xaa\x23\x23\x06\x50\x28\xda\x06\x10\x9c\xda\x36\xe5\xd7\xb3\x96\xb0\xf9\xe9\x4b\x5d\x55\x95\xf8\xec\x4e\x8b\x29\x9f\xe8\xd5\x86\xd0\x16\x83\x38\x25\xda\x23\xce\xbb\xce\xae\xc4\xcf\x0c\xaa\xb6\x01\x04\xc7\xb6\x1d\x3e\x3b\x36\x21\x30\x56\xbd\x1a\xa4\xf9\x5e\xd6\x13\x75\xe7\x66\x11\xfc\x43\xb3\x20\xb5\xe2\x7b\xd8\x45\x43\xc3\xff\xc7\x22\x15\x06\x50\x28\xdb\x06\x10\x9c\xdb\xc6\x17\x5f\xca\xb7\x38\xf0\xae\x64\xbd\xe9\x61\xae\xe7\x69\xaa\xa1\xd0\x3b\xad\xce\x4f\xfa\x9c\x5d\xea\xc7\xa7\x59\x3a\xe4\x22\x1c\x31\x80\x42\xdd\x36\x80\xe0\xe0\xb6\x44\x16\xd5\xc1\x5c\xd1\xe5\xa9\xd1\x6e\x9d\xe4\x81\xd7\x9e\x33\x8e\x09\x92\x36\x01\x1f\xda\x81\x94\x3d\x4d\x4a\x15\xb8\xeb\x82\x01\x14\x0a\xb7\x01\x04\x27\xb7\x99\x3e\x12\x34\x3d\x2b\xff\x34\x54\x4f\x40\x2e\x94\xe3\x29\xcd\x28\x38\x3d\x62\x7b\x25\xdd\x2f\x8c\xfd\xe4\x77\x57\x8f\x47\xac\x9c\x18\x40\xa1\x72\x1b\x40\x70\x74\xdb\x6b\x7b\x87\x73\xaf\x56\x12\x2c\x17\x25\xfa\xdd\x64\x4b\x5c\xce\xf8\xf8\x0e\xbf\xff\xe3\x42\x69\xb0\xaa\x67\x21\x6f\x61\x27\x73\x02\x03\x28\x94\x6e\x03\x08\xce\x6e\x9b\xb8\xf1\xbb\xb0\xcb\x4f\xec\xcd\xba\x46\xa0\xe2\x96\x24\x1f\xa2\xae\xb0\xb7\x42\xb2\x58\xea\x48\x43\xdc\x65\xe6\xa7\xbc\x9a\xc4\x89\x1a\x6a\xb7\x01\x04\x87\xb7\x79\x75\x7d\x56\xd9\x68\x28\x63\x51\x4b\x56\x75\xe3\xe7\x2a\x60\x40\x1f\xd7\xeb\x8d\x9a\x98\x69\x5a\xbb\xd4\xcd\x9a\xdf\x39\x46\xdc\x85\x40\xf1\x36\x80\xe0\xf4\x36\xba\x88\x5d\xa9\xaf\x07\xbf\x5f\xea\x2c\xcf\xe7\x32\x1f\xdc\x77\x8c\x21\x5f\x2b\xf0\xe7\xe9\x85\xc0\xbc\x5a\xed\x87\x95\xf7\xf8\xe4\x30\x80\x42\xf5\x36\x80\xe0\xf8\x36\x8d\xf3\x4f\x2d\x6a\xc6\x97\x1f\x64\xdf\x9f\xf9\xf7\x2d\xfb\xe5\xdb\xe5\xed\xb6\xef\x9c\xf2\x31\x53\x0f\x0b\xe3\x64\x26\xbd\x18\xdd\x30\x80\x42\xf9\x36\x80\xe0\xfc\xb6\xe3\x89\x31\x17\xf7\x71\xe9\xcc\xed\xdc\x20\x57\xc9\xbc\x72\xa3\xb1\x3b\xe9\x21\xbf\xa9\x06\x83\xae\xc2\xcd\xd3\xee\x11\xa3\x80\xb8\x3f\x82\xfa\x6d\x00\xc1\x01\x6e\x52\x37\x1f\xcc\x3f\x8c\x99\x24\x8f\x9b\xae\x89\xd5\x11\xae\xe7\xb0\x7b\x40\x79\x8c\xec\x3b\x3f\x81\xc0\x21\xa5\x4c\x6d\xba\x4c\x3c\x03\xa0\x80\x1b\x40\x70\x82\x5b\x23\xe7\xa9\x1f\xa7\x3e\xef\x7f\x4c\xf1\xc2\x38\xb4\x7e\x3d\xdd\x53\xbd\xa9\xe9\x68\xc5\x40\x33\xe1\x4e\xac\xba\x0c\xd3\x5b\x9b\xb3\x18\x40\xa1\x82\x1b\x40\x70\x84\xdb\x95\x86\xde\xaa\xb5\x31\xd1\xaf\xdf\xdd\x8e\x05\x26\x2a\xfd\x4b\x7e\xc5\xd0\xc5\xef\xf4\xe1\x86\xdd\xd6\xea\xc8\x93\xcd\x8a\x54\xe2\x19\x00\x25\xdc\x00\x82\x33\xdc\xe4\xea\x5d\x0f\x95\xc6\x31\x6b\x56\xbb\xae\xf1\x24\xbc\xb6\x5d\x08\xdc\xba\xd1\xfe\x89\xa5\xa1\x6c\xfa\x2a\x53\x71\xfb\xed\x7e\xe2\x74\x08\x35\xdc\x00\x82\x43\xdc\x2c\x56\xb4\x59\xef\x2d\xea\x5f\x34\xfd\xd7\x81\x30\x93\xff\x09\x62\x7a\xe1\xe4\x9d\x7f\xb0\x5c\x5a\x4e\x6f\x5d\x8b\x53\x87\x5f\x15\x03\x28\x14\x71\x03\x08\x4e\x71\x3b\x50\xec\x58\x41\x21\xfa\x22\xf1\xf7\x95\xf2\xdc\x24\x5f\x25\xdf\xcf\x84\x22\xdb\xe3\x8e\x31\x9b\x51\xb1\xcc\xc7\x7a\xad\x7d\x38\x30\x80\x42\x15\x37\x80\xe0\x18\xb7\x24\xa6\xeb\x2a\x5d\x12\x71\xe1\xe8\x5d\x3e\xe6\xb6\xae\xb1\x66\xe6\xeb\xad\x13\xca\x45\x89\x02\xe5\xd4\xbe\x45\xd5\x56\x1a\xc4\x2d\x0d\x94\x71\x03\x08\xce\x71\xa3\xe3\xe3\xc8\x79\x68\x5b\xaf\x76\xcc\x89\xfa\x52\x86\xda\x33\xcd\xba\x96\x4d\x36\x2d\x97\x43\x92\xcc\x69\x13\xd9\x93\xbd\x23\x2c\x18\x40\x61\x8e\xdb\xff\x0d\x74\xff\xf5\x67\x1e\xfe\x77\xa0\xc3\x41\x6e\xdc\x4a\x6b\x66\x62\xa7\xb6\x66\x67\x02\xb2\xa8\x86\x4d\x4c\x16\x15\x40\xa0\xc7\x3e\x3a\x5e\x4e\x37\x6b\x37\xec\x99\xb4\x2a\x71\xab\x07\x85\xdc\x00\x82\x93\xdc\x34\x57\x03\x03\x09\x2f\x95\xac\xb9\xcb\xef\x8c\x08\x69\x69\x31\x65\x16\x68\x49\x3b\xa5\x2f\x16\xd0\xae\x66\xf9\x44\x7c\x59\xdd\x83\x01\x14\x2a\xb9\x01\x04\x47\xb9\xed\xd1\x0a\x0d\xfc\x89\xce\xa9\x4b\xca\xf4\x55\x3a\xfb\x64\x19\xb7\x54\x48\xfa\xf8\xa1\x0f\xde\xd6\x18\x45\xec\x6b\x6d\xcb\x90\xc2\x00\x0a\xa5\xdc\x00\x82\xb3\xdc\x94\xb9\x0b\x29\x53\x94\x04\xd7\xb3\x6c\x7f\xed\x5f\x64\xca\x20\x5b\x61\xb9\x98\xfd\xae\xe5\x06\x77\xc2\x82\xef\x5d\xda\x02\x66\x6b\x0c\xa0\x50\xcb\x0d\x20\x38\xcc\x2d\x41\xf1\xb2\x9a\x79\xaa\x0c\x35\x32\x97\x19\xb5\xb6\xc6\x5f\x73\x75\x3e\xa5\xe3\xa4\x5c\x51\xcd\xaa\xbe\xfe\x2f\x1d\xc2\xcd\xfd\x18\x40\xa1\x98\x1b\x40\x70\x9a\x5b\xe5\x77\x37\x6e\x86\x71\xba\xa0\xa2\x5e\xd1\xb8\x9f\x8a\x31\xc1\x62\xef\x9b\x25\xb4\x55\x69\xd6\x39\x14\x22\x65\x8a\xab\xe6\x99\x30\x80\x42\x35\x37\x80\xe0\x38\xb7\xa5\xe4\xb8\x80\xce\x8d\xc6\x3e\xc5\x86\xfa\xf4\x5b\xe1\x0a\x9e\x25\x91\x91\xeb\x1b\x3e\xf1\x29\x8f\x3f\xb8\xf9\x5c\x51\xb9\xaf\x86\x01\x14\xca\xb9\x01\x04\xe7\xb9\xb1\xc6\x67\x67\xf6\x0c\x28\x9e\x34\xda\x28\xaf\xfa\x79\x4b\xc6\x44\x66\xe6\x40\xa4\x5c\x89\x22\x8b\xbd\xf4\xe0\x37\x8f\x03\x3d\xee\x18\x40\xa1\x9e\x1b\x40\x70\xa0\x9b\x46\xd7\x05\x4d\x76\xb7\x73\x54\x43\x9a\x42\x94\xf7\x2f\x55\x84\x32\x1c\xdf\x99\xb8\xe9\xd0\x44\x57\x5f\xbe\xfe\xa2\xdb\x99\x9e\xf8\x36\xa1\xa0\x1b\x40\x70\xa2\xdb\xc2\xc0\x7e\xf6\xd0\xf0\x6f\x8f\x46\x22\xf7\x2f\x1c\x54\x31\x52\xff\x15\x39\x9e\x77\xb2\xa9\xd0\xc8\x23\x29\x29\x9c\x8c\x77\xcc\x00\x03\x28\x54\x74\x03\x08\x8e\x74\xfb\x1b\xdb\xee\xae\xf4\xe3\xeb\x2b\x33\x9f\xc7\xcb\xce\xeb\x43\xf1\x53\x9e\x65\x05\x7e\x43\x22\x47\x6b\x2e\x0a\xd4\x7d\x9c\x1b\x3c\x8e\x01\x14\x4a\xba\x01\x04\x67\xba\x51\xf4\xd1\x4c\xc7\xf6\x38\xdb\xa5\xd1\x16\x3c\x3f\x74\xef\x6d\x32\x6b\xd4\x11\xf2\x2a\xe5\x7e\x5b\x66\xeb\x80\x5d\x54\x71\xe0\x22\x06\x50\xa8\xe9\x06\x10\x1c\xea\x26\xc7\x7e\xcd\x72\xdd\xf8\x3c\xff\xd2\x19\xbf\x60\xf0\x56\xc9\x90\x4c\xcc\xef\x0d\xf3\x13\x7e\x26\x29\x95\x00\x1f\x4f\x4c\x5c\x19\x03\x28\x14\x75\x03\x08\x4e\x75\x8b\xaf\x6a\xd3\xdc\x62\xdb\xf8\x45\xbb\x30\x7f\xfe\xe6\xaf\x53\xea\x87\xdf\x35\xd8\x86\x77\x1b\x1c\x14\xdd\x63\xe5\x78\xe1\x28\x93\x16\x06\x50\xa8\xea\x06\x10\x1c\xeb\x66\xa5\x5e\xad\xb3\x14\xa4\x1a\xbf\x37\x49\xe0\xc6\x9d\xa2\x41\x2f\x29\xd5\xed\x65\xbd\x8b\x0c\xb7\x53\xf4\x52\x13\xaa\x64\xdd\x05\x31\x80\x42\x59\x37\x80\xe0\x5c\xb7\xfc\xb9\x88\xfc\x33\x14\x75\xf3\x6a\xbf\x95\x22\x12\x83\xa4\xdf\x7b\x0f\x50\x66\x39\x44\xf1\x75\x30\xa9\x51\x3e\x0a\xcf\xb6\x25\xbe\x4d\xa8\xeb\x06\x10\x1c\xec\xe6\xd4\xfa\x9c\x8c\x76\xeb\xd2\xd9\x64\x21\xd3\xba\xb0\xd1\xc6\x00\xfe\xf2\xf9\xb3\x57\x8f\xc4\x6c\xda\xd4\xad\x3c\x23\x14\x88\x11\x27\x6a\x28\xec\x06\x10\x9c\xec\x96\xf7\xe6\x37\x95\xef\x64\x4e\xad\x84\xe0\xf2\x56\xeb\x6d\xea\x34\xd7\x12\x17\xa1\xba\x7d\x69\xba\x49\xd6\xc7\xaf\x89\xec\xb1\x25\x9e\x4e\x50\xd9\x0d\x20\x38\xda\x2d\xf7\xab\xd4\x86\xd4\x59\x9e\xf0\x27\xd4\xb9\xd9\xef\x6c\xb8\xdf\x08\xf8\xe8\x4d\x17\x46\x66\x57\x33\x9c\x61\x73\x48\xdc\x3f\x4e\x9c\xc1\xa0\xb4\x1b\x40\x70\xb6\xdb\x84\x7f\x31\xf9\x51\x6c\xee\xd3\x4b\xb7\x16\x31\x9f\x5f\xc7\xc9\xef\x4d\x66\x3d\xe0\x5a\xec\x93\x49\x70\x73\x57\x6a\x32\x39\xa6\x80\x01\x14\x6a\xbb\x01\x04\x87\xbb\x31\xdb\x59\x5f\x3e\x3d\x5c\xa6\xd2\xdc\xae\xfb\xf9\x22\x25\xcf\x6d\x6b\x51\xbb\x13\xde\x29\xb6\x60\xb1\xa8\x83\x63\x33\xeb\xb6\x3a\x06\x50\x28\xee\x06\x10\x9c\xee\xc6\xe7\x95\x6e\x5c\x35\x18\xef\x62\x7c\x40\x26\x33\x55\x29\x95\xdb\x36\x6c\x6e\x1f\x1f\xad\xa8\xc5\x63\xb2\x44\xd9\x6d\x96\x3a\x1f\x0c\xa0\x50\xdd\x0d\x20\x38\xde\x2d\x6d\x54\x2c\x66\xfb\x43\x56\x8c\xf0\x27\xd3\xd3\x92\x66\xfb\x6f\x5f\x36\xa0\x57\x63\x2f\xf4\xcf\xdc\x66\x65\x8d\xc9\xd6\xdc\xe0\xc1\x00\x0a\xe5\xdd\x00\x82\xf3\xdd\xce\x3d\x1f\xb0\x5c\xbf\x72\x5f\x23\xe0\xac\xb1\x7d\x7e\xee\x15\x39\xae\x37\x4a\x83\xef\x47\x97\xe5\x93\x45\xcc\xee\x50\x16\xa4\xd0\x63\x00\x85\xfa\x6e\x00\xc1\x01\x6f\xac\x89\xb5\x94\xae\xc9\x65\xdf\xb0\x9b\x23\x6d\xd1\x4c\x91\xbf\x37\x32\x2d\xc9\x24\x16\x4d\x27\xc3\xa9\xf4\xcd\x7f\xfb\xf7\x9f\xc2\x00\x0a\x05\xde\x00\x82\x13\xde\x4a\x0e\x3d\xba\x7a\xbd\x81\x4d\x22\xe0\x5f\x04\xdd\x24\xef\x82\xcb\xfd\xe1\xf7\x5a\x8c\xe1\x2c\x3d\xa7\xf9\xaa\x9a\xad\x1c\xcd\x89\x9b\x7a\xa8\xf0\x06\x10\x1c\xf1\x96\xf6\xb0\x42\xc5\x77\x45\x2f\x65\x63\xaf\x55\x7c\x54\x0f\x3b\xea\x5b\x37\x71\x3e\x70\x85\x8f\x75\xfe\xdb\xb2\x03\x7b\x56\x33\x71\x6e\x85\x12\x6f\x00\xc1\x19\x6f\xdc\x3d\x67\xbd\x74\xe4\xc2\x73\xf2\x44\x52\x2b\xaa\xaf\x0c\xe4\x0a\x34\xed\x1a\x19\x5d\xb4\xf2\xa1\x4f\x10\xd4\x0f\x5c\x3c\xc6\x8c\x01\x14\x6a\xbc\x01\x04\x87\xbc\xdd\x28\xad\x62\xef\xf4\x57\x38\x47\x21\x32\xfa\xa2\x78\xd5\xd1\xf5\x2b\xfb\xc4\xf7\x83\xa2\x92\xda\x7e\x57\xbf\xe7\xcb\x3d\x73\x26\x6e\x1c\xa0\xc8\x1b\x40\x70\xca\x5b\xd2\xa5\x30\xbd\x7f\x51\x02\x6f\x7d\xc9\x36\x73\x02\x32\x58\x25\x98\xb4\xf6\xa4\x54\x4c\xd5\x07\x94\xbd\x6b\x2c\x55\x5b\x9a\x25\x4e\x87\x50\xe5\x0d\x20\x38\xe6\xed\x2a\x78\x7e\x5f\x1f\x50\x6a\x71\x5d\xdd\xed\x7f\x5d\xc5\x64\x13\x35\x22\x3a\xd7\xb7\x73\x51\xf7\x71\xe0\x5d\x29\x32\xf1\x79\xe2\x89\x0e\x65\xde\x00\x82\x73\xde\x6c\x06\x66\x45\x3e\xa5\x65\xf9\xb1\x29\x49\xee\x63\xe3\x73\x7c\x7e\xd9\x08\x24\x1a\x89\x0d\x76\x6d\x06\x8b\xd8\xb6\x19\x5c\x26\x5e\xea\x60\xce\xdb\xff\x0d\x74\xff\xf5\xc7\xb8\xfe\x77\xa0\xc3\x41\x6f\xd4\x6a\x21\x88\x80\xb1\x7d\xf2\x19\xd3\xb2\xde\xda\xc5\xc3\x8f\xbf\xd5\xb9\x5b\x06\x8d\x05\xdf\xcb\xa0\xb9\xd3\xdd\x3d\xce\x4c\x5c\x9a\xa1\xd0\x1b\x40\x70\xd2\xdb\x69\xd5\xbd\x7f\xe6\x65\x29\xe5\x03\xae\x08\x97\x11\xce\x9e\xff\x69\x44\xa3\x24\xca\xe2\xed\x9b\x7b\xad\x8c\xf5\x4a\xfa\x8b\x58\x31\x0c\xa0\x50\xe9\x0d\x20\x38\xea\x2d\x4a\xe9\xad\xcf\x66\x01\xe8\x66\x37\xeb\x09\xf6\x35\x36\xa8\x7b\x1a\x26\xaa\xd8\xd9\xe7\xe1\x7b\xd6\xbc\xab\x25\xd2\x43\x84\x1c\x03\x28\x94\x7a\x03\x08\xce\x7a\xd3\xfc\x9c\x63\xfe\x85\x21\xab\xa6\x30\xd5\x6b\x43\x58\xed\xb6\x99\x00\xe5\xc5\xfb\x85\x0e\x5c\x4c\x8f\x56\x14\x2e\x58\x68\xfe\xb4\xc0\x00\x0a\xb5\xde\x00\x82\xc3\xde\xba\xd2\x95\x7c\xc4\x67\x52\xf6\x46\xc5\x3d\x38\xec\xaa\x22\xeb\xf6\x92\x77\xf1\x8e\xed\x1d\x69\x1b\xbd\xb2\x7d\x0a\xbf\x98\x02\x88\xcb\x0c\x14\x7b\x03\x08\x4e\x7b\xe3\xb8\xf3\x25\x68\xb2\xbf\xc5\x71\x77\x83\x7c\xed\xed\xfd\x41\x0a\x72\xc9\x16\x91\xac\xa7\x8d\xde\x1e\x14\x1e\xc5\x84\xfd\x85\x76\x18\x40\xa1\xda\x1b\x40\x70\xdc\xdb\xaf\x82\x8f\x9d\x33\x33\x97\x06\x09\xfb\x6e\x0e\x37\xbe\x2f\xe9\xbb\x16\x74\xd0\xf1\xc0\x74\xd3\x1d\x05\x2f\x3d\xab\x9d\x6b\x69\xc4\x1d\x2d\x94\x7b\x03\x08\xce\x7b\x2b\x6a\xcb\x21\x33\x5e\x67\x3e\x24\x3a\xbb\x7f\x3f\xe6\xbd\xc7\xa8\x25\x4c\xb4\xf9\x0f\x2f\x3f\x5f\x80\xc5\x95\x3d\x4f\xf5\x98\x1c\x31\x80\x42\xbd\x37\x80\xe0\xc0\x37\x55\xb3\x02\x15\xf5\xe2\x7d\x02\x4f\xd2\x4f\x8b\x19\x3e\x30\x7c\x2d\xa7\xfb\xe4\xd8\xa5\x8b\x07\x52\x0f\x3e\xb5\x89\x22\x3f\xa7\x2e\x8a\x01\x14\x0a\xbe\x01\x04\x27\xbe\x7d\x2d\x6e\x64\x5d\xd5\x3e\x18\x26\x7f\xe1\xac\xc9\x67\xb2\x4f\x23\x42\x3f\x29\x4b\xbe\x30\x3a\xf8\xf3\xd3\x8e\xdb\x9f\xb2\x2f\x20\xee\xce\xa0\xe2\x1b\x40\x70\xe4\x9b\xee\x6b\xc9\x67\x09\x9c\x2c\x83\x8b\xbf\x2e\x63\x46\x47\x8f\xbc\x4d\xe1\xf8\xa0\x42\x31\x64\xab\xea\xa7\x3e\x1f\x72\xe3\xe0\x01\xe2\x08\x00\x25\xdf\x00\x82\x33\xdf\x2c\xae\x9b\x34\x3e\x2f\x4c\x2b\xdf\xd8\xe6\x9f\xe1\xd8\xcd\xea\x6c\x3a\x45\x21\x32\xe3\xc3\xd3\x54\xff\xed\xed\x82\x85\xe7\x0a\x05\x06\x50\xa8\xf9\x06\x10\x1c\xfa\xe6\xa5\x35\xfc\x6a\xf5\xea\x19\x16\x0d\x0f\x97\x51\x70\x5d\xfa\xd0\x9e\x7b\xe1\x6e\xaf\x8b\x4d\x5a\xf9\x06\xf9\xfa\x99\x0d\x1f\x90\x61\x00\x85\xa2\x6f\x00\xc1\xa9\x6f\x29\x5c\xad\x75\x41\x17\x82\x23\xac\x0c\xd9\x5c\xa3\x42\xf7\xff\x8d\x91\xd0\xdc\xa6\xf5\x3a\x2b\x5d\x23\x52\x6d\x76\xb1\x54\x4a\x18\x03\x28\x54\x7d\x03\x08\x8e\x7d\x1b\x26\x2b\xf7\x79\x50\xff\xe2\x69\x03\x67\x56\xed\x68\xca\xdf\xc6\x33\xb9\xfb\x7e\xd6\x98\x96\x30\xd2\xb9\x5d\x50\xf8\xc6\xc3\x44\x7c\x65\x50\xf6\x0d\x20\x38\xf7\x6d\xc2\xd0\xef\xbc\xcd\x5e\x6d\x17\xbe\x7d\x49\x13\x7e\x42\x6c\xdb\xca\x54\xec\x42\xf1\x4a\xb7\xa9\x9f\x6a\x85\x89\x16\xd5\x96\x1e\xc4\x00\x0a\x75\xdf\x00\x82\x83\xdf\xd8\x8c\x02\x46\xa5\xab\xbb\x74\x06\x83\x30\xbd\xc7\xa3\xc3\xf9\x3b\xe6\x1c\x52\x85\x51\xf2\x2f\x8a\xa9\xa7\xd7\x02\x42\x3a\x88\xeb\x19\x14\x7e\x03\x08\x4e\x7e\x7b\x04\x1e\x4b\x7a\x3a\xd8\x65\xd8\xf5\x4e\x94\x24\x2e\x6d\xb5\x3a\xae\x55\x9a\xec\xa1\x92\x6a\xff\x7e\xa0\xf4\x95\x8c\xd0\x3d\xe2\x19\x00\x95\xdf\x00\x82\xa3\xdf\x2e\x31\x56\x7c\x11\x2b\xa9\x7c\xb8\xf1\x7b\x22\xd8\x4a\xca\x55\x54\xea\xed\x62\x74\x1a\x4f\xd7\xc7\xf1\xeb\x75\xf7\x23\x4e\xf1\x11\xd7\x79\x28\xfd\x06\x10\x9c\xfd\x46\x88\xb8\xbb\xf9\x60\x7e\x0f\xdf\x77\x29\x41\x7a\x65\xa1\xa9\x8a\xe5\x54\x73\xd1\x0d\x03\x69\x4b\x4d\x0d\x9b\x27\xb1\x41\x37\x2f\x60\x00\x85\xda\x6f\x00\xc1\xe1\x6f\xab\x8e\x5d\xbc\xaf\x06\x1c\xd6\xbb\x5e\x3a\xeb\xac\xf3\xa8\x92\xd3\x47\xee\x8d\x3f\x50\x77\xe0\xe6\x98\xdc\x77\xee\xec\x1a\x1e\xe2\x44\x0d\xc5\xdf\x00\x82\xd3\xdf\x56\x63\xba\x4d\xbe\x8f\x27\x89\xb3\xaf\xb8\x55\x88\x09\xea\x6c\x4f\x9e\xb2\x8f\x15\xdf\x94\xb8\xb1\x87\xad\x4f\xe5\x68\x2e\x85\x31\x06\x50\xa8\xfe\x06\x10\x1c\xff\x96\x68\xb0\xd0\xd6\x78\xbb\xb2\xe4\x29\x0f\x23\x41\x60\xd8\xb8\xfc\xe0\x43\x91\x13\x71\x9c\x92\xdf\xaa\x3f\xaa\x07\x37\x09\xf2\x11\xf7\x94\x50\xfe\x0d\x20\x38\xff\x8d\x90\x6f\x3a\x3c\x5a\x58\xc9\xff\x80\xcc\x39\x55\x99\x8c\x95\xa9\xae\x45\xf6\x45\xd5\x8f\xd5\x93\xc7\xee\x2e\x1e\x6a\x9f\xf7\x21\x8e\x00\x50\xff\x0d\x20\x38\x00\xae\xbb\xfc\x15\xdb\x91\xf2\x4b\xdb\xd7\xff\x72\x5a\x9f\x9a\x65\x73\xcf\x97\xcc\x3f\x20\x92\x35\xf4\x65\xd5\xfb\xad\x8f\xa8\x85\x96\x03\x06\x50\x28\x00\x07\x10\x9c\x00\xa7\x1e\xcd\x7a\x96\x21\x80\xac\xcc\xe0\x77\xa4\xaa\xcb\x8c\xd5\x11\x7e\xaa\x16\xce\x30\xcd\xf5\x4a\x7d\xdd\xc6\xd6\xbe\x87\xb5\xdc\x18\x40\xa1\x02\x1c\x40\x70\x04\x9c\x55\x6b\xa5\xa7\xca\xdf\x04\x4e\x49\x6e\x31\x0f\x49\x93\x33\xf6\x66\x09\x77\xce\xcc\xdb\xd4\xf3\x12\xae\x6b\xb9\x78\xb3\x99\x11\x3f\x33\x28\x01\x07\x90\x00\xfc\xdd\x73\x5f\x89\x9c\x14\xa6\xbd\xb9\x6a\x46\x7f\x65\x62\xcb\x45\xaf\xde\xa8\x0c\x3f\xbc\x30\x21\x4f\x58\x9d\xbf\xdd\x7b\xca\x84\x0f\x03\x28\xd4\x80\x03\x08\x0e\x81\xa3\x10\x7e\xd3\x70\xaf\x69\xbf\x51\x71\x31\x4f\x78\xa4\xa6\xa1\x45\xef\x5b\x83\x9f\xcf\x72\x9c\x56\xbc\x4f\x86\x1a\x99\xa1\x9b\x5e\x18\x40\xa1\x08\x1c\x40\x70\x0a\x9c\xcb\x45\xc5\x94\xcf\xac\x19\x36\x56\x02\x19\x22\xaf\xb4\xb2\x75\x22\xe4\xc9\x09\x63\x0b\x88\xde\xee\x9e\xf6\x14\xd6\xbf\x9c\xde\x18\x40\xa1\x0a\x1c\x40\x70\x0c\xdc\x49\x9e\xab\x1b\xa7\x18\xbc\xaa\xa3\x06\xba\xfe\x72\xfc\xaa\x88\x34\xcf\x8f\x0d\xa6\x09\xec\x62\x55\x50\x69\xd9\xe7\xd8\xda\x7e\x12\x03\x28\x94\x81\x03\x08\xce\x81\x1b\xef\x93\x8a\x39\x1c\xa1\x3a\x6e\x29\x57\xb8\x26\xbc\x97\x82\x8a\x66\xb9\x8d\xe3\xa8\x55\x64\xe4\x38\xf5\xb1\x72\xd7\x01\x57\xe2\x89\x0e\x73\xe0\xfe\x6f\xa0\xfb\xaf\x3f\x99\xfa\xbf\x03\x1d\x0e\x82\xf3\x79\x62\x24\x99\x4f\xf5\xab\x5c\xc3\x6f\x7f\xa6\xc0\x95\x7b\x6f\x83\x94\x5e\x8b\x3b\xae\x4d\x0e\x73\xb8\xd3\x73\x7c\x3a\x5e\x6a\x85\x01\x02\x14\x82\x03\x08\x4e\x82\xeb\x45\x6b\xee\x18\x70\xe9\x2b\x89\xfa\xcd\x71\x5c\x9b\xbf\x6a\x61\xcf\xf0\x3a\x3e\xd9\x7c\xd0\xb1\x5b\xa8\xe7\xde\x5a\x81\x94\x3a\x06\x08\x50\x09\x0e\x20\x38\x0a\x8e\x51\x29\x57\xe3\xd9\x7a\xb7\x92\x85\xad\x8d\xcc\x51\xcf\xf9\x33\xe7\xe3\x02\x08\xd5\x97\xb4\x53\x78\xff\x31\x70\xf9\xd8\x84\xd3\x62\x80\x00\xa5\xe0\x00\x82\xb3\xe0\x8a\xef\xf8\x8e\x2a\x30\xb6\xcb\xe6\x30\xb2\x69\x07\xac\x1a\x7a\x0e\xa6\x46\x1a\x69\x33\x76\x79\x6e\xdb\x7a\x7e\xa5\x2a\x41\x38\x30\x40\x80\x5a\x70\x00\xc1\x61\x70\xa2\xa7\xbd\x0f\x3d\xae\x71\x51\xf5\xbd\x56\x16\x14\x90\x9b\x7c\x50\xe4\x61\xd7\x83\x93\x23\x9b\xd3\xc3\xe6\x77\x9f\xfd\xbd\xb2\x48\x7c\x9b\x50\x0c\x0e\x20\x38\x0d\x2e\x8e\x09\x63\x7f\x5a\xa7\xff\x4d\xe4\x27\xff\x48\x69\xc7\x4f\xfd\x5f\x92\x64\xcd\x2e\x14\xcb\x1b\xa9\x54\x6f\xde\xbc\x16\x2e\x3c\x8b\x01\x02\x54\x83\x03\x08\x8e\x83\x93\xae\x39\xd3\xaf\x6c\xf6\xaa\x78\x30\x9d\xb5\x6f\x7f\xb9\xae\x49\xee\x99\x35\x79\xe3\x88\xd7\x76\x5d\x22\xa7\xc4\x6a\x82\x89\x13\x35\x01\xca\xc1\x01\x04\xe7\xc1\xe5\x33\x35\x88\x2a\x5f\x7a\xef\x6d\x1d\x22\x6a\x7c\xc2\xf4\xca\xc1\x39\x07\xd7\xf2\x1b\x15\x76\x83\x86\x3f\x4c\x4b\x06\xfe\x45\x9c\xc2\x00\x01\xea\xc1\x01\x04\x07\xc2\xf5\x0b\x50\x1b\x63\x13\x45\x15\xac\x61\x72\x1d\xbc\x81\x37\x57\x5a\x3b\x55\xae\x77\x53\xa8\x75\xbe\x2c\x6b\x9c\x5c\xd3\x8a\x73\xc0\x00\x01\x0a\xc2\x01\x04\x27\xc2\xcd\xf1\x05\x49\x04\x2e\x33\x53\x50\x75\x45\x4e\x74\x1b\xb0\x3e\xdc\xbb\x86\xad\x8a\xbd\xb2\x35\xfe\x1a\xf5\xac\x74\x3b\x44\xcc\x19\x03\x04\xa8\x08\x07\x10\x1c\x09\xf7\x88\xed\xec\x97\x2b\xbb\xb1\xf7\x7a\xcc\xad\xaf\xac\xa2\x32\x9a\x4e\x1d\x4f\x4b\x4c\x1b\xad\x9e\xf8\x9b\x44\x5e\x50\x3e\x4b\x49\x81\x01\x02\x94\x84\x03\x08\xce\x84\x9b\xc8\x46\xd3\x7c\x95\xbe\x76\x74\x32\x94\x9f\x68\xab\x32\xca\xf2\x7f\x9a\x23\x52\xa4\x1b\xc9\x3a\xcd\x19\x95\xff\xe1\xd2\x14\x35\x06\x08\x50\x13\x0e\x20\x38\x14\x4e\x73\x3b\xf4\x44\xd8\x74\xfe\xd2\x33\x07\x2e\xe4\xfd\x9a\x6c\x7a\xf6\xdc\x79\x99\x50\xf5\x0f\x06\xa5\xcc\xfe\x1a\x03\x87\x8b\x0d\x31\x40\x80\xa2\x70\x00\xc1\xa9\x70\x15\x71\xf1\x6e\x93\x3b\x83\x55\x9f\x4f\xb3\xd6\x6e\x77\x09\x77\x64\xbf\x89\xee\x71\x30\x93\xd0\x15\x3c\x36\x14\xe0\x77\xd3\x52\x0e\x03\x04\xa8\x0a\x07\x90\x7b\xf8\x47\xfb\x14\x56\x3f\x2b\xba\x8a\x4c\x5f\xa6\x73\x0e\xe6\x5c\x7f\xdc\x51\x9f\xe0\xeb\xc7\xdd\xa4\x7b\xe7\x6b\xe2\x1b\xd1\x5f\xf6\x97\x31\x40\x80\xb2\x70\x00\xc1\xb9\x70\x16\x45\x91\xac\x2e\x63\x0d\xec\xfb\x68\xd5\x44\xd3\xd2\xa5\xde\xff\xca\x68\x3e\xd6\xc8\x60\x34\xf7\x5a\xd7\xf8\x5c\xc3\x4f\x03\x6f\x0c\x10\xa0\x2e\x1c\x40\x70\x30\x9c\xde\x09\xcd\xe5\x31\xf3\xb0\x8c\x72\x81\x4c\x1d\x42\x6d\x90\x7c\x2e\x33\x47\xf4\xf3\x84\xc6\x74\x96\x17\x0d\x51\xb3\xb7\xfd\x89\xc7\x19\x14\x86\x03\x08\x4e\x86\xbb\xdc\x26\xfe\xce\x9e\x79\x9c\x5f\x4e\xb9\x5c\x54\x58\xdd\xa0\xe8\x4c\x75\x7b\x4f\x03\xf3\xd3\xec\x73\xa3\x47\x41\xab\x21\x9b\x28\x06\x08\x50\x19\x0e\x20\x38\x1a\x4e\xf5\x50\x1e\xcb\xf0\x08\x55\x88\xcc\x46\xeb\x8b\xab\xbe\xd4\x7f\x9e\xdf\x74\x91\x2c\x9b\x39\x2c\x73\x69\x9e\x82\xe5\x3a\xb7\x34\x17\x06\x08\x50\x1a\x0e\x20\x38\x1b\x4e\x9e\xe5\x9e\xfb\x91\x85\x94\xcf\xb6\x94\x6a\x49\x47\xad\x7e\x45\xf8\x7f\x1f\x97\xa0\x49\xcc\x36\xa2\xa5\x79\xd7\xe2\xc9\xfb\x63\x1f\x06\x08\x50\x1b\x0e\x20\x38\x1c\x6e\xe4\x43\x22\xef\xd4\xa6\xc4\x0f\x81\xb8\x9f\x2a\x9e\x3a\x91\xdf\x6c\xe2\xc3\xe9\x0b\x02\x8d\x3b\x9c\xcf\x8c\x2d\x51\xbb\x45\xd8\x60\x80\x00\xc5\xe1\x00\x82\xd3\xe1\x0c\x4c\x66\x62\xc8\xaa\x77\x56\x07\xd8\x9f\xf0\x75\x26\x69\xf2\x29\x53\x95\x0a\xf7\x45\x57\x1e\x70\x73\x4f\x3c\x4d\x7e\x4f\x5e\x19\x03\x04\xa8\x0e\x07\x10\x1c\x0f\x77\xfb\x6f\xc6\x6d\xe1\x7a\x66\xe5\x5a\x16\xa7\xc7\xd6\x6f\x8a\x1c\x6e\x18\x99\x94\x9f\xb4\xba\x32\xc9\xca\x4f\x73\x42\xe5\x44\xa0\x0f\x06\x08\x50\x1e\x0e\x20\x38\x1f\xee\x65\x03\x9b\x8e\xf6\x0d\x97\xae\x5d\x2f\x99\x45\xc6\x13\x97\x93\xd8\x02\x11\x51\xca\xd0\xd7\x93\xd5\xcc\x0f\xa8\x9c\x8f\xd1\x09\x61\x80\x00\xf5\xe1\x00\x82\x03\xe2\xde\xf9\x38\xab\x72\x45\xe8\xd3\x9e\x39\x5d\x56\xc1\x7c\xe4\x2f\xd7\x6c\xfc\x86\xae\xe0\x85\x53\x73\x9f\xcb\xbe\xca\x0c\x5e\x1a\x24\x1e\xb4\x50\x20\x0e\x20\x38\x21\xee\xf8\xce\x3d\x46\xd7\x89\x84\xec\x28\x25\x3d\x57\x9e\xc1\xe5\xcf\xd9\xe3\xbb\x77\x37\x66\x04\xf6\x3d\x06\xaa\x15\x76\xe7\xe9\x05\x30\x40\x80\x0a\x71\x00\xc1\x11\x71\x49\xec\xb7\x73\x43\x2f\x4c\xfd\x4a\xa5\x91\x1d\x92\xd0\x19\x7e\xc5\xf2\xe0\x79\x6d\xbc\x28\xbf\x07\xb9\x7d\x2a\xb5\xa1\x01\xaf\x3e\x06\x08\x50\x22\x0e\x20\x38\x23\xce\xb7\xcb\x92\x66\xff\xbe\xaf\x6b\x34\xdb\xc6\xc8\x62\xe9\x68\x34\xa6\x6c\xfd\xe6\x7d\x74\x6b\xd7\x6b\x0a\xf1\xb2\x14\x33\x55\x61\x0c\x10\xa0\x46\x1c\x40\x70\x48\x9c\x9a\x16\xcf\x91\x9f\xd9\xf7\xb9\x40\xc7\xb4\xf7\xd3\x26\xbf\x55\xbf\x39\xef\x30\x2f\xe7\xf4\xce\x13\xd2\x8e\x3d\x54\x3b\x34\xda\x18\x20\x40\x91\x38\x80\xe0\x94\x38\x66\xe6\xb1\x9b\x81\x5c\xb2\xc5\xe3\xb1\x34\xe6\x7b\x4b\xf9\x73\xf2\x94\x17\x43\xe5\x1a\xd3\x57\xfc\xb7\x04\xb8\x09\xe1\x29\xb2\x18\x20\x40\x95\x38\x80\xe0\x98\x38\x6a\xbf\xa7\x07\x8c\xc3\x7e\x5a\xef\x35\x66\x19\x4a\xc6\xaa\xa4\x3f\xfe\x52\xa6\x2c\xa4\x53\xe6\x5f\x72\x34\x3f\xf6\xc1\xfb\xc3\x51\x0c\x10\xa0\x4c\x1c\x40\x70\x4e\x9c\x5f\x16\x17\xd6\x22\x98\x73\xa5\x7a\xdd\x5d\x6c\xbc\x49\x48\x93\xdf\x9a\xb5\x1e\xf0\x77\xa4\x47\xe5\x47\x54\xb4\x6d\x07\x10\x67\x0d\x98\x13\xf7\x7f\x03\xdd\x7f\xfd\x61\xfb\xff\x1d\xe8\x70\x50\x9c\x7b\x48\x46\x82\xbf\x1f\xa1\x9a\xe3\x4d\xd0\x51\x5e\x8f\x9a\x63\xbd\x95\x42\x3a\xda\x3a\xcf\x37\x3d\xdb\xef\x1c\xdb\xfd\x4a\x7b\x00\x03\x04\x28\x14\x07\x10\x9c\x14\x97\xfd\x21\xed\x04\x8d\x1b\xef\x3d\x15\xeb\x2c\xbf\xd4\xbb\x69\x29\x2f\x35\x5c\x63\x0c\x96\x92\xbb\x65\x56\x59\x7e\x6a\x3e\x11\x93\xc0\x00\x01\x2a\xc5\x01\x04\x47\xc5\xa9\x7e\x61\xe6\x99\xfe\xf7\x25\xe2\xd2\xdf\x8c\xcf\xfa\x97\x76\x1f\xe7\x6c\x79\xbd\xfe\xf6\x80\x5c\xc0\x66\xc7\x78\xd9\xf3\x51\x3b\xf1\xeb\x87\x52\x71\x00\xc1\x59\x71\x7c\xc6\x48\x93\x78\xa6\xd9\xd8\xc5\x8a\xfb\x87\x0f\xdf\x11\x92\xb1\xbf\xd1\xdc\xcc\x2e\xe4\x64\x68\x9b\x63\xb5\xff\x57\x88\x9d\x27\x06\x08\x50\x2b\x0e\x20\x38\x2c\x2e\x99\x46\x49\x75\x90\xab\x00\x69\x35\x27\xd3\xd2\x55\x98\xd1\x5e\x7a\xba\x2f\xa4\xfd\x7b\x9e\x00\x39\x57\x94\x28\xcd\xdc\x7b\x3e\x0c\x10\xa0\x58\x1c\x40\x70\x5a\xdc\x20\x53\xaf\x59\x1a\x5d\x33\x87\xc4\xb9\x33\x26\x1c\xac\x5c\x34\x02\x59\x3e\x87\x74\x25\xdb\x19\x04\x3f\x47\x95\x52\xae\x53\x88\x63\x80\x00\xd5\xe2\x00\x82\xe3\xe2\xf2\x9b\x63\xeb\x5c\x7f\xff\x16\x5d\xd4\x51\xa6\x8b\xe0\x90\x5f\x67\xfb\x71\xff\xc3\x5f\xaa\x2b\x85\xef\x04\x0b\xbb\x78\x2b\xfc\xed\x30\x40\x80\x72\x71\x00\xc1\x79\x71\x47\xf7\xd7\xca\xfe\xa5\xab\x4e\xb6\xb9\x92\xf2\xe8\xcf\x97\x59\xed\xb5\x1e\xb3\x93\x5f\x7c\x0a\xb7\xfd\xe7\x0e\x47\x4f\x4c\x2e\xe8\x61\x80\x00\xf5\xe2\x00\x82\x03\xe3\x14\x75\x85\xa7\x59\x0d\x6f\xfc\x4b\xc2\xee\xc5\xff\xd0\x89\xe0\x5c\x37\x78\x95\x7f\x20\x0b\x09\x6a\xaf\xfb\x1b\xab\xec\x2d\x42\x1c\x35\xa1\x60\x1c\x40\x70\x62\x9c\xfc\x03\xd7\x09\x35\x07\xc6\x8f\x5c\xb4\x5d\x54\x7b\x17\x8e\xc8\x34\x70\x2e\x37\x8b\xdd\x51\x2c\xf6\x17\x57\x67\xf2\x90\xbc\x6f\x84\x01\x02\x54\x8c\x03\x08\x8e\x8c\xeb\x7f\x40\x9d\x72\xed\x80\xe4\xc9\xf3\x0f\x98\x77\xd4\x7b\x8b\xf7\x6e\x28\xf1\x9c\xa8\x66\x94\xcc\x2f\x2c\x0c\x8c\xf4\xa9\x93\x72\xc1\x00\x01\x4a\xc6\x01\x04\x67\xc6\x79\xec\x7b\xb0\x3e\x44\x08\xbc\xf7\xfb\x96\xac\x80\x38\x6b\x9d\xa2\xb4\x5e\xf1\x05\xef\x9e\x37\xfb\xf2\xcf\x0b\xd7\xd3\xfc\xdc\xa6\xc2\x00\x01\x6a\xc6\x01\x04\x87\xc6\x15\xf1\xd7\x2a\x16\xb3\x85\x06\x52\xa6\x9d\xdd\x37\xa9\xce\x88\xf9\x6b\xfc\xa0\x4d\xb4\x92\xbb\xfe\x54\xe2\xe6\xe9\x8b\x76\x54\xe6\x18\x20\x40\xd1\x38\x80\xe0\xd4\xb8\xc7\x8e\x5c\x35\xcb\x0c\x81\xe4\x19\x56\xf2\x81\x22\x48\xfe\xb2\xdf\x4f\xc0\xb8\xec\x1f\x74\x90\x83\xab\x2c\x60\xf0\xd6\x08\x37\x06\x08\x50\x35\x0e\x20\x38\x36\x6e\xa1\x42\xf3\x65\x8e\xe0\x8a\xf3\x89\xbb\xcb\xe9\x74\x0d\xb9\x2c\x3f\x65\xbf\x16\xde\x2f\x92\x56\xa4\xf1\x3c\xef\xac\x93\x19\x45\xbc\x68\x40\xd9\x38\x80\xe0\xdc\x38\x8a\xb6\x45\x13\xbd\x22\xfd\x83\xcf\x9f\xf9\x4b\x35\xac\xee\x8a\xa3\xbf\xe5\x52\x36\x7f\x08\xa7\x8e\x5b\xc6\x29\xc6\xa7\xf0\xb0\x63\x80\x00\x75\xe3\x00\x82\x83\xe3\x4e\xb8\x5c\x67\xff\x55\x62\xf7\x23\x74\x5f\x78\x8d\x99\xd7\xeb\xd3\xe0\x8f\xf2\xbb\xb8\x3b\xde\x8e\x3e\xf2\xcd\x2b\x12\x03\x47\x89\xeb\x19\x14\x8e\x03\x08\x4e\x8e\x2b\xae\xd7\x8a\xf3\xf9\xc5\x23\xf8\x98\xa2\x4e\x30\x99\x6d\x4e\xb0\x67\xe8\xb7\xb2\xf2\xc5\xda\x81\xce\xaa\x6c\x9a\xa5\x5d\x0d\x11\x0c\x10\xa0\x72\x1c\x40\x70\x74\x9c\xa7\x8e\xba\xe9\x6b\x26\x10\x6d\x48\x5b\x14\x7e\x99\xfe\x19\x58\xd2\xfb\x78\x4c\x2a\x9b\x99\x85\x81\xaf\x5b\x28\x27\xaa\x8a\xb8\x9e\x41\xe9\x38\x80\xe0\xec\x38\xf5\xd8\x3a\xdf\xc9\x90\x6b\x72\xae\x8a\xf6\x8d\x0e\xc1\x75\xd1\xea\xe7\xd3\x15\x2b\xae\xe9\x88\x04\x5c\xfe\xec\xb9\xa5\xb7\x48\x3c\xd1\xa1\x76\x1c\x40\x70\x78\xdc\xf3\x85\x90\x45\xef\xf4\xcb\xc8\x73\x49\x5a\x85\xb0\xe7\x8f\x2b\xae\x7b\x8b\xff\x10\x0a\x15\xea\x78\x9b\x33\x56\x1f\x6d\x2c\xea\x84\x01\x02\x14\x8f\x03\x08\x4e\x8f\xfb\xa0\x2d\xcc\xa6\x1f\x1c\xe3\x6c\x10\x69\x7f\xeb\xda\xab\x44\xcd\x04\x2b\xee\x88\xc6\x20\xab\x53\xe3\xa9\xee\xe1\x96\xe6\x99\xc4\xcb\x19\x54\x8f\x03\x08\x8e\x8f\xbb\x9e\xfb\x28\x71\xbb\x62\xd6\xf5\xe6\x51\x1b\x2b\xe5\xcb\x23\xfc\x0b\xda\x36\x3a\xef\x7e\xfd\x75\xe4\xc9\x78\xfb\xb6\x61\xd1\x8a\x1f\x03\x04\x28\x1f\x07\x10\x9c\x1f\x57\xf1\xdc\xad\x51\xc1\xf6\xad\x9f\xf6\xe7\x04\xcf\x55\xb9\xd4\xe2\x84\xfc\x96\x47\xd5\x45\xa0\x4d\x98\x37\x94\xa1\x77\xd4\xf3\x24\x06\x08\x50\x3f\x0e\x20\x38\x40\xae\x36\xc2\x2c\x48\x65\xf7\xc9\xef\x86\xaa\x9a\xf8\xa5\xa6\x43\x7b\x9c\xd9\xc7\x98\x27\xf7\x7c\x97\xf6\xbb\xfc\x58\xba\x34\x24\xc8\x02\x03\x04\x28\x20\x07\x10\x9c\x20\x77\xff\xac\xfa\x80\xfb\xa2\xe5\xdc\x21\xbe\xad\xe8\xe6\x20\x21\x66\xff\x67\xe9\x35\x63\x64\xd5\x51\x2a\x7b\xe4\x56\x1f\x6f\xb4\xc9\x63\x80\x00\x15\xe4\x00\x82\x23\xe4\x56\xbe\x57\x72\x5f\x8e\xfc\xda\x92\xfb\x54\xfe\x28\x75\xa3\x87\xb8\x10\x97\x35\x75\x9b\xb2\xe2\xdb\xa1\xfe\x55\x89\x27\x83\xba\x28\x06\x08\x50\x42\x0e\x20\x38\x43\xce\x7e\xef\x6d\x7a\xfa\xd3\x94\x61\x8d\x8f\xba\x1e\x51\xb0\x3c\x65\x3c\xdc\x3f\x3f\x66\x25\xe0\xd1\x6a\xd4\x9d\xfe\x62\xef\xf8\xa2\x06\x06\x08\x50\x43\x0e\x20\x38\x44\xae\x90\xe6\x76\xd9\xe3\x3b\x21\x64\xd9\xcc\xaf\xb6\x9d\x93\xa7\x7f\xec\x7f\xde\x75\xcf\xf6\xf3\xb3\x53\xf3\xc9\xa7\x1f\xbc\xd8\x64\xa4\xc7\x00\x01\x8a\xc8\x01\x04\xa7\xc8\x69\x57\x75\xff\x76\x33\x54\xf9\xf7\x27\xf6\x7e\xec\xa3\x2a\x31\x63\xa4\xe2\xa3\xbe\x5c\x76\x3a\xd9\xad\x28\x71\xca\x21\x45\x79\xe2\xfe\x08\xaa\xc8\x01\x04\xc7\xc8\x95\xb8\x68\xff\x69\x5c\x35\x58\x9e\x4f\xe2\x1d\xad\x28\xa4\xb1\x94\x57\x4d\xa3\xa4\x2c\x1c\x9a\x98\x76\x31\x29\xe5\xfb\x74\x4e\x1a\x03\x04\x28\x23\x07\x10\x9c\x23\x17\xf3\x91\xf0\x92\x85\x29\xe9\x6b\x45\x1a\xe3\xa7\xf1\x46\xd5\x80\x17\xad\x51\xaa\x65\x8b\xa1\x22\x19\x89\x16\x1d\x59\x63\x91\xa7\x30\x40\x80\x39\x72\xff\x37\xd0\x95\x0b\xd5\xb7\xd6\x5c\x1a\x7c\x37\x1f\xfd\x46\xd9\xa2\x5c\xe6\xc1\xee\xc8\x0e\xdf\xd4\x71\x4f\x19\x50\x1d\xdc\xe5\xb2\x1b\x92\xfe\xbf\x03\x1d\x0e\x92\xeb\x1b\x5d\x7e\xc8\xec\x11\x1f\xc6\x5b\xbc\xb7\x28\x7a\x7d\xd1\xe3\xb1\xb4\x50\xc2\xa3\x52\xbd\x73\x75\x04\xff\xcc\xf6\x57\x3f\xce\x60\x80\x00\x85\xe4\x00\x82\x93\xe4\x6c\x2f\x75\x18\x29\x28\x06\xbb\x1d\xeb\x51\xf8\x73\x3b\xa4\xc1\xb4\x3c\x54\x99\xab\x41\xf3\x7c\x42\xce\xca\xd4\x9d\x8c\xcd\x3f\xc4\x18\x54\x92\x03\x08\x8e\x92\xab\xe9\x8b\xfa\x3d\x7b\x72\xeb\xae\xd2\xec\x6f\x4a\xfa\x63\x2c\xd3\xe9\x5d\x9d\x39\xec\xb2\xe9\xec\xe1\xed\xee\x16\x89\x8d\xed\x9a\x18\x20\x40\x29\x39\x80\xe0\x2c\x39\x6d\x45\x83\x94\x87\x92\x5e\x91\x0b\xf7\xf2\x27\x9a\x57\xb2\xf6\xee\x5c\x0d\x64\x7b\x68\x11\x7f\x72\xfb\x6c\x45\x55\xeb\xb5\xe3\x00\x03\x04\xa8\x25\x07\x10\x1c\x26\xf7\x4f\xe0\x79\xd6\xd7\x3c\x65\xe7\x5b\xfe\x0c\xe2\x86\xd9\x62\x2d\xc9\x7d\x7f\xc6\xf2\x63\xaf\x06\xd0\x34\x3a\x2b\xca\x95\x33\x1b\x63\x80\x00\xc5\xe4\x00\x82\xd3\xe4\x94\x5a\xd8\x5f\xca\xa7\xec\xff\xa0\xd3\xad\xd1\xf2\x42\xf3\x80\xf5\x54\xac\xb7\xbe\x4e\xff\xe7\x40\x49\x85\x07\x69\x96\xc9\x7f\x89\xaf\x0c\xaa\xc9\x01\x04\xc7\xc9\x91\xed\xa5\x8c\x1e\x10\x5a\xa2\x6b\xe5\x88\x7b\x34\x41\xc3\x3f\x50\x10\x39\x51\xff\xfe\x93\x7c\xe0\xfe\xcd\x07\x15\xe5\x9c\x86\x26\x18\x20\x40\x39\x39\x80\xe0\x3c\xb9\x36\x7a\x89\x50\xf5\x81\x46\x0d\x03\x4d\xd7\x12\xe6\x94\x0c\xb6\xef\x6d\x0f\x3d\x2f\x9a\x3f\xe4\x79\xb0\xab\xd0\xe0\x73\x76\xfc\x38\x06\x08\x50\x4f\x0e\x20\x38\x50\x8e\xef\x96\x7f\x93\x47\x49\x90\x80\xd1\xdd\x30\xc2\x93\xf8\x51\x17\xc5\x12\x71\xa3\x1f\x3d\x9c\xb7\x4e\x16\x1a\xa4\xb0\x3a\xa8\x10\xdf\x26\x14\x94\x03\x08\x4e\x94\xf3\x61\x97\xf2\x8b\x70\x56\xf1\x3d\xc3\xa1\xf7\xde\xd9\xfa\xd4\x61\xdb\x50\xf3\xb9\xd2\xe6\x1c\xa3\xf8\x17\xcf\x2d\x2d\xdc\x94\xed\x31\x40\x80\x8a\x72\x00\xc1\x91\x72\x2f\x13\x2f\x9c\x4f\x55\x2a\xbd\x9b\x93\xd1\x77\xf9\xe8\x8f\x99\x4f\xbd\xc1\xe5\x84\xdf\x27\x42\xe6\x19\x17\xf4\x4d\x4d\xde\x5b\x1c\xc4\x00\x01\x4a\xca\x01\x04\x67\xca\xdd\xf0\x2b\xba\xe9\xdb\x25\x3c\xa4\xc3\xaf\x56\xe0\xc7\xf1\x2c\xae\xe4\x4c\xee\xcb\x0e\xa7\x95\x99\xcd\x40\x6f\x43\xee\x60\x46\xe2\x2b\x83\x9a\x72\x00\xc1\xa1\x72\x47\xef\xf7\x3b\x7f\xac\x38\xa9\x12\x27\x31\x7b\xac\xa3\x6f\xca\x6f\x2b\x77\xdd\x59\xd2\x51\xd2\x87\x4a\x9b\x79\xa8\x7c\xe7\x16\x71\x35\x85\xa2\x72\x00\xc1\xa9\x72\xf1\xc1\xd7\x1f\x5a\x39\x3c\x3a\x53\x69\xe8\x15\x71\xa1\xc2\x96\x91\xfd\xd1\xef\xf9\x67\x06\x97\xdf\x4d\xf1\x9c\xd1\x0c\x69\xf6\x20\x5e\xce\xa0\xaa\x1c\x40\x70\xac\x5c\x44\x77\x9e\x07\x2d\xdd\x57\xa5\x1f\xaa\xe7\x32\x44\x3e\xa9\x3e\x61\xfb\x71\xd7\xe5\x92\xd4\x9f\x33\xef\x58\x06\x1f\xfa\xaf\x66\xab\x60\x80\x00\x65\xe5\x00\x82\x73\xe5\x6e\xbb\x98\x92\x89\x3e\x3c\x69\x7f\xb9\x5b\xe1\xec\x81\xc4\xda\xa1\x7a\x2c\x6b\xe9\x79\x4a\xfa\x8b\x1d\x5a\xe1\x7d\x31\x22\x47\x0d\x30\x40\x80\xba\x72\x00\xc1\xc1\x72\xfe\x2f\x52\xec\x9b\xf9\x25\x4f\x27\xfa\x03\xce\xa5\x0e\xb7\x0b\xdf\x52\x65\x0f\x87\x1f\xf7\x92\x3c\x14\xec\xfd\x3b\x68\x76\x99\xb8\x71\x80\xc2\x72\x00\xc1\xc9\x72\x9f\x66\xe9\xd6\xf4\x38\x4e\x9e\x36\x10\x09\xbe\x50\xb6\xd4\x4e\x3b\x5e\x53\xb4\x61\x2d\x92\xc4\x53\xf5\x66\xbf\xea\xb7\xb8\x7d\xe7\x30\x40\x80\xca\x72\x00\xc1\xd1\x72\xb6\x22\x72\x9e\x26\xc9\x1a\xa2\xef\x28\x79\x0f\x49\x85\xb4\xf9\xe5\x1a\x5f\xd8\x7b\x7b\x38\xbd\xb5\xde\x33\xff\xe6\x99\x96\x79\xe2\x78\x0e\xa5\xe5\x00\x82\xb3\xe5\xfe\x2a\xa9\xff\xb8\x4b\xa5\x8a\x4c\x3e\x79\xdf\x5e\x93\x3b\xba\x33\xab\x39\xb3\xdb\x2e\xaf\xb5\x33\xe9\xd1\x35\xd3\xb0\x3f\xd0\x1b\x03\x04\xa8\x2d\x07\x10\x1c\x2e\x97\x97\x4c\xed\xab\xea\xe6\x78\x4b\xe6\x84\x77\x0c\xeb\x3b\x81\xfa\x14\xb1\x1d\xa7\x7c\xa7\xd2\x56\x86\xf0\xce\xb3\x5c\xc6\xa8\x07\x06\x08\x50\x5c\x0e\x20\x38\x5d\xce\x54\x7f\x5f\xd1\x6f\x97\xf9\x6c\xbf\xa1\xa1\x7f\x1f\x02\x78\x08\xa6\x53\x09\x1f\x1a\x28\x83\xd3\x8f\xde\x66\xd1\xa1\x7c\xdf\x83\x60\x80\x00\xd5\xe5\x00\x82\xe3\xe5\x6c\xd9\xb6\x58\x74\x36\x3f\x48\xbe\xc9\x4a\x8b\xbb\x3f\x34\xf3\xee\xfe\xbb\x43\x7f\xae\x3f\x16\xff\xca\xc8\xba\x13\x23\xce\xe4\xa9\x84\x01\x02\x94\x97\x03\x08\xce\x97\x43\x3b\x7e\x8e\xf6\x1f\xc9\x9b\x07\xfb\x3e\x7e\x30\x16\xe5\xb8\xf1\x80\xe7\xc2\xed\xdf\x14\x65\x83\x6c\x0d\x2a\xf4\x11\x15\xb4\xc2\x18\x20\x40\x7d\x39\x80\xe0\x80\x39\xf7\x8e\x75\x85\xa3\xb7\xa2\x9c\xc4\x17\xb5\x5f\x2e\xfd\xfe\xe8\xe1\x24\x78\xeb\x78\xbd\x1b\x6f\x62\x94\xec\xfe\x0b\x9d\xcb\xf7\x58\x31\x40\x80\x02\x73\x00\xc1\x09\x73\x21\xa9\xe5\x83\x4f\x8d\x08\xd5\xb4\xbe\xeb\x93\xbe\x81\x5c\x9a\x8e\x5a\x5a\x4f\xac\xbe\x57\x35\x35\x48\x7a\xa5\x3f\xab\x2e\x23\x6e\x03\xa1\xc2\x1c\x40\x70\xc4\x5c\x88\xfb\x33\xa9\xfa\xf8\xdb\x1a\x94\x9e\xe1\x6f\xea\xdd\xa4\x3a\x27\x91\x67\xc3\x4f\xa6\x7a\xd7\x6e\xee\x25\x53\xea\x3a\x86\x99\x61\x80\x00\x25\xe6\x00\x82\x33\xe6\x4c\xa3\xbe\x0e\x7c\xf3\x9a\xa5\xd6\xc9\x50\x2f\x1e\xbb\x7f\x2b\x98\xdf\xb2\x62\x2c\x95\xc9\x84\x23\x54\x5a\x5a\x65\x46\x75\x88\x12\x03\x04\xa8\x31\x07\x10\x1c\x32\xe7\x60\x3e\x40\xb8\xb9\x6b\x5b\x75\x2c\x7f\xe2\x52\x96\x5a\x7c\xb1\x3b\xf8\xe7\x4a\xc1\x74\xf2\xe3\xf0\x97\xd3\x3c\x6e\xbb\x26\xc4\xd3\x09\x8a\xcc\x01\x04\xa7\xcc\x31\x1d\x0e\xf7\x2a\x5e\xa1\xf7\x36\x4b\x9c\x0f\x50\x3b\x12\xe4\xeb\xa3\xf7\xb4\x47\x83\x83\x9b\xf3\xf7\x17\x41\x82\xb2\x33\xff\x15\x0c\x10\xa0\xca\x1c\x40\x70\xcc\x1c\xd5\x9b\xe5\xbb\x6f\x90\x20\xad\xf7\x53\x4c\x56\x2a\xf2\x81\x39\xef\x15\x8d\x19\x8a\x96\x62\xb9\x8f\x49\xdd\xb2\xba\xfa\xff\x31\xf7\x96\x51\x55\x7d\x7b\xdf\x37\xdd\x08\x28\xa0\x20\x29\xdd\x9d\x4a\x87\x84\x80\x34\xd2\x25\x28\x8d\x20\x29\x48\xa7\x84\x80\x22\x21\xdd\x29\x5d\x52\x0a\x4a\x48\xa7\x22\xd2\x1d\x2a\x25\x12\xf2\x8c\xeb\x5c\x67\xef\x9b\xb3\xe0\x76\xfe\xef\x67\xf0\xe2\x8c\xe1\xcb\xcf\xf8\xed\x3d\xd7\xfe\x38\xe7\x5c\x5f\xe6\xfa\x2d\xff\xf8\xff\xb9\xa9\xff\xbf\xb6\x99\x23\x41\x84\xf4\x99\xb3\xc0\x6b\x5b\x97\xfd\x58\x52\xe2\x75\x59\x57\x4d\x8b\xfc\xbd\xaa\x43\xd6\x9c\x77\x2b\x59\xd6\xd3\x93\x79\xf5\x95\xf0\xbd\x08\x73\x5f\x12\xcc\xff\x5b\x9f\xb9\x3a\xfc\x7f\x37\x06\xae\xec\x18\x9a\xcc\xf0\xb0\x0c\x66\x2c\x7a\xfa\x9d\xb3\xb8\xc0\x6b\xa0\x90\x17\x23\xaa\x4e\x61\x06\x41\x4d\x86\x3f\x1b\x7d\xdb\xf7\x15\xe7\x38\xb3\x0e\x03\xc2\xff\xd2\x24\xf6\x5e\x76\x5c\x92\x77\xaf\x87\x85\x60\xf0\x8d\xb9\x8c\x09\xf8\x48\x2f\x72\xd6\xa3\xa4\xad\x14\xa8\x12\x27\x2e\x6d\x69\x7f\x38\x85\xce\x1c\xbf\x70\xa5\xd8\x88\xd9\x93\x0d\x42\xf7\x97\x26\x7e\x91\xbb\x46\xdf\x46\x87\xfd\x9e\xb9\xde\x58\x26\xba\xf1\x9e\x24\x3e\xdf\x29\x54\x90\xb5\x77\x32\x4f\xe4\xa9\x5e\x86\xab\x87\x48\x5f\x56\xe8\x97\x49\xa9\xef\x4a\xed\x79\x7d\x59\x6f\xd0\xe5\x95\x9f\x24\x3e\x56\x3a\x85\x36\xf0\xe3\x5d\xce\x40\x7b\x51\xca\x20\xe5\x1d\xe8\xbd\x3b\xc8\x9b\x1a\x62\x5c\x2b\xff\xea\x8a\xd5\x0c\xc2\x53\x67\x6b\x2c\x9c\xe5\x53\x68\x04\x8f\x29\x0f\xf6\x71\x35\x06\xbe\x68\x78\x09\x62\xf0\xb2\x13\x96\x8b\x18\x8f\xc1\x3e\xd5\xcf\x0f\x9a\xd1\xec\xf6\x13\xd7\x52\x4e\xa1\x7e\x55\xec\x1b\x85\xdb\x97\x58\xd2\x99\x62\x7e\xdd\x09\xc6\xc1\x6f\x33\xd5\x91\x3d\x28\xa6\xa9\xb0\x61\x5b\x6a\x97\x6b\xc8\x92\x3b\x85\x8e\x79\x85\xcf\x6c\xb7\x90\x56\x91\xd7\x9b\xcf\x8f\x6d\xd2\xfe\x40\xc1\x41\x7c\x73\x53\xa9\x3a\x04\x23\x2c\x2c\x96\x76\x07\x9d\xf6\x14\xaa\x1b\x96\x1a\xf9\xb6\xa9\x3f\x11\xa5\xcf\x1e\xc3\x23\xdf\x36\xa2\x22\xc7\xd9\xc1\x91\x35\xc9\x34\x15\x39\x14\x41\xaa\x3c\x44\xf3\x14\x7a\x97\x82\x8f\x56\x2a\xbc\xec\xc5\xa4\xed\x77\xb2\x01\x94\xfc\x84\x44\xad\x5d\xda\x88\xf7\xae\xbf\x12\xbb\x5c\xae\xaf\xa2\xb1\xe3\x9d\x42\x93\x56\x1c\xb7\x5a\x12\xf4\x97\x47\x14\x39\xd8\xfd\x96\x18\x39\x0f\x43\x59\x11\x53\x66\xb7\x62\xc4\x53\x70\xa3\x2c\x76\xaa\xf7\x4f\xa1\xf7\x3a\x94\x55\x02\x75\x6f\x6b\xd8\xce\x1b\xe4\x4b\xe6\xbb\x78\x50\x9b\x10\x60\x62\x54\x29\x64\xed\x99\x32\xde\x1b\x94\xfd\xec\x79\x0a\x1d\xd6\xf1\x1e\x1d\x46\x2e\xe4\xbc\x22\xf9\xb2\x8e\x1e\x09\x43\xcf\x77\x81\xf0\xfa\xd3\x0f\xe6\xc8\x7f\x06\x51\x36\x32\x58\xb9\xb5\x4e\xa1\x58\x79\xfe\x87\x8a\x0a\xbc\x38\x57\x77\x63\xa4\x3e\x51\x2a\x0e\x65\x68\x0d\x0c\xef\x87\x5e\xde\x96\xfd\x91\xde\xc6\xff\x58\xac\xf6\x14\x8a\x26\x35\x9d\x9f\x28\xd1\x22\x69\x7d\x6b\xf6\xf8\x44\x38\x91\xc3\x2f\xe8\x67\x3a\x2e\xbe\x9c\xf1\xeb\xf9\x81\x85\x62\xf5\x84\xa9\x53\x28\x83\x85\x1c\xb3\x04\xf2\x50\xda\x7c\x54\xc5\xb1\x47\xcc\x73\xe6\x1d\xbb\xda\x3b\xc6\x8a\xda\xe5\x6f\xaa\xae\xe8\x5c\x1e\xfb\xd7\xe9\x4d\x18\x9a\x81\x19\x13\xfd\x7d\x75\x3d\x73\x76\x53\xbc\x94\x3f\x43\x74\x9e\x15\x91\xbf\x37\x72\x79\x7e\x7f\x2d\x4d\xa8\xf4\x53\xed\xe8\xe9\x9f\x60\x4d\x2e\xec\x63\x71\x46\x92\x14\x41\xa2\x3e\xed\x07\x8c\x1c\xeb\xe8\x58\xa1\x39\x1f\xee\x09\xa2\xef\x25\x41\xdc\x19\x78\x6f\xcb\x4e\xa1\xc2\x73\xb9\xdf\x12\xb3\xab\xef\x4e\xfb\x3a\x3e\x0d\x15\x4c\xa4\xa5\x8f\x63\xf0\x72\x08\xc3\x1c\xe3\xce\x49\x0c\x94\x6c\x8c\x9c\x3c\x85\x22\x1d\x11\xed\x24\x1f\xc8\x50\xd9\xbc\x7b\x41\x15\xff\x2d\x3c\xa1\x2f\x33\xc8\x48\xe3\xad\x5e\xb4\x8b\x63\x83\x1b\xe1\xde\x95\xd6\x53\x68\x75\xd0\x0f\xc2\xef\x6e\x63\x5e\x9c\x68\xf6\x35\xb5\x89\x5d\x0b\x43\x4b\x01\x8f\x75\x48\x5e\x86\x1f\x55\x6a\xb3\x85\x86\xc6\x66\x9c\x42\xb3\x6f\x29\x0d\xbc\x9f\x9a\xfe\xcc\x80\x62\x8b\x67\xa5\x84\xef\x34\x8d\x36\x17\xe1\xb0\xbc\xd4\x93\x80\x59\x41\xd2\xdc\xaa\x5a\x78\x0a\x95\x70\x4b\x7f\x94\x76\x5b\x96\x7f\xd4\x03\x63\x0b\xf1\x2b\x6d\xe2\x21\x97\x33\x43\x65\x4e\x9b\xf6\x03\x72\xb2\x98\x70\x64\xfb\xdc\xd3\x55\x87\x62\x6d\x52\x9f\x38\x36\x09\xf0\xdc\x08\x0d\x49\x74\x91\xb3\x12\xac\x09\xc5\x75\xca\xe7\x61\x35\xf0\x50\x26\x6a\x30\xba\x71\x0a\xf5\x9e\x20\x7b\x12\xa8\xfc\xa0\xc7\x2b\xdd\x74\x27\x53\x5a\xa9\x24\x93\xdf\xf9\x1b\xe2\x07\xa7\x86\x27\xec\xbf\x0a\xd5\x5b\x7e\x0f\x9d\x42\x9d\x7d\xdc\xe3\xc8\xa7\x2d\xaf\x31\x2a\xb6\x13\xe1\xd0\x85\xe9\x8d\x5e\xdf\xd4\x49\xd8\x54\x46\x41\x59\x71\x59\x17\x50\xe6\x2b\x3a\x85\xe2\x47\x48\x6d\x67\x87\xe9\x27\xe2\xf5\x7f\x28\x21\xd6\xe0\x99\x17\x42\xe1\xe2\xdd\x5d\xa4\xa6\x6e\xd9\x1b\xf5\x0d\xe0\x8d\xc5\x3d\x85\xd2\x11\xaa\xf3\xa2\x60\xf8\x3c\xe6\x74\x2e\x12\x23\x7e\x2e\xbe\xbd\x4c\x25\x78\xa0\x77\x9b\x7d\x76\x94\xfa\xc5\xfe\xab\xac\xe7\x0d\xa7\xd0\x23\x75\xeb\x28\x0a\x55\x7b\xcf\x26\xbf\x58\x63\x25\x92\xb4\xfa\x09\xe9\xe6\xad\x34\xae\xd0\xa7\x1f\x2d\x2b\x96\x85\xc6\x8a\x5d\x4e\xa1\x76\xd8\x64\x2c\xc9\x78\xa8\x45\x2d\xd7\x2b\xd7\xf0\xca\x91\xaf\x3a\xba\x3c\xcf\x18\xe4\x79\xfc\xc6\xca\xd6\xf8\xb3\xaa\x16\xea\xc6\x29\x74\x47\x72\x82\x19\x29\xc7\xe8\x55\x48\x70\xb5\x09\x75\x09\x62\x73\x43\x32\xfa\x6a\xef\x80\x0d\x59\x7d\xc2\x35\x73\xdd\x3b\x42\xe2\xa7\xd0\xa8\xad\x0e\x75\x5c\x03\x94\x31\x0f\x4c\xf1\xf6\xe2\x66\x31\xc4\x76\xd5\x75\x41\xcc\xfb\xeb\xac\xf5\x43\x14\x2d\xf6\x01\x76\xd2\xa7\xd0\x4b\x64\x23\x27\x2e\x46\xbf\x1e\x92\x09\x79\x3f\xfd\xb0\xe4\xae\x95\xf6\x73\xa1\xdd\x0d\x59\xb8\x78\xf7\xc9\xb5\x78\xce\x25\x81\xba\x53\x28\xe6\x89\x11\x99\x42\x43\x6a\x5d\xaf\x35\xd2\xd4\xab\xc5\x8f\x1d\x2e\xc6\x8d\x28\xea\xcb\xd5\x0a\x39\xce\x4d\x1f\x51\xf3\x1a\x4a\x4f\xa1\x5c\x88\x31\xb2\xdf\x4f\xb8\xea\xf8\x2d\xa3\xe6\xde\x99\x7f\xcc\x08\xfb\xde\x52\x29\x36\x3b\xf2\x48\x8e\x85\x4a\x58\x33\x76\x9a\xed\x14\xba\x69\xa9\x4e\x94\xff\xa9\xc1\x44\xa4\x53\x6a\x54\x63\x6f\xa7\xd6\x80\x85\x23\x37\x39\x7b\xbf\x16\x3d\x3b\xff\xd7\xcc\x47\x86\xc4\xff\x7f\x28\xa1\x55\xaf\xdd\x4b\xcc\x9d\x57\xfb\x29\x2f\x86\x69\x12\x4c\x2d\xd1\x98\x74\x7d\x6d\xe7\xef\x2d\xb9\x3d\xd7\xef\xf5\x3a\xf4\x8c\x39\x85\x2a\x4f\x07\xb7\xe0\xdd\x59\x1f\x26\xe4\xfa\xd9\x92\xf2\x86\x31\x18\x5d\xf2\x8e\xbb\x8c\x88\x0c\xc1\x82\xf8\xd3\xac\x8c\x0f\x16\x3b\xa7\xd0\x47\xb1\x4f\xe9\x4c\x0c\x3c\x72\x79\xa4\x74\x04\x1f\x30\x71\x6a\xff\x46\x8b\xd2\xb2\x42\xc5\xe1\xac\x89\x5e\xa6\x17\x7f\x43\x48\x79\x0a\xad\x2a\xf9\xed\x2d\x77\xc5\xe2\xda\xeb\x30\x4b\x29\x81\x87\x53\x86\x3f\xbc\xe7\x33\xe9\xb9\x82\x07\x37\x37\x65\xd4\xee\x88\x99\xb8\x9f\x42\xa5\xa6\xd7\x6a\x0a\x5d\xa4\x6b\x8b\x18\xa4\xd9\x96\x64\xf5\x7a\xfd\x49\x09\xf6\x4c\x68\x5f\xce\xa7\xa9\x5e\x53\xa9\x4e\xca\x59\x3c\xfd\xc3\xea\xbc\x21\xf7\x67\xa8\x2e\x0c\x40\x44\x20\x8e\x2b\x18\x8a\x9e\x8a\x1f\xd9\x64\x4b\x13\xb2\x5b\x7a\x15\xa3\xcf\xf0\x22\x97\xfc\xf4\xfc\x1a\x98\x57\x4d\xa4\xe3\xd3\xa1\x50\x5d\xf6\x29\xe3\xdd\x67\xcc\xbb\x62\x7e\x71\x3f\xaf\x73\x89\x7b\xbe\xd6\xeb\xa6\xfe\x75\x45\xe2\x14\xfa\x0a\xf1\x4d\x86\xc9\x4e\xf3\xa5\x75\xcb\xfc\xbc\x1a\xdf\x8f\x1c\x5e\x32\x66\xc4\xa6\x97\xe3\x5e\x97\x8e\xbb\x18\xdf\x54\x6a\x6e\x3a\x85\xea\x55\x0f\x26\x7d\xd2\x2b\x24\xb0\xfb\xda\xe2\x9c\xa4\xdb\x54\xf2\x39\x89\x00\x45\x6f\xeb\x1d\x11\xb2\x97\x9d\x8a\x21\x7a\xd6\x69\x09\xc7\xe6\x78\xc5\x4d\x90\x83\x2e\x2f\xb5\xa4\xa3\xbf\x5f\xe9\x1a\x6c\xc8\x44\xa1\xe1\x4e\xb7\xc6\x4a\xaf\x7e\x50\xe0\xd3\x16\x75\xe7\x74\x55\xc1\x1b\x59\x7a\xd8\x92\x1a\x28\x83\x0d\x5c\xe2\x7d\x0b\x4c\x31\x0e\x83\x13\x03\x78\x74\x4b\x48\x7f\xbe\xf4\x51\x2a\x61\x04\x9f\x42\xb5\xd8\xd8\xb0\xc9\x8f\x7d\xf6\x67\xea\xe9\x2a\xfa\xd5\x47\x3c\x6b\xa3\x52\x7b\x42\x7f\x9e\x3c\xa6\x8e\x09\x27\x77\xb0\x2e\x94\x0c\x44\xfa\x67\x9b\x81\xb0\x53\x35\xa7\xaa\x04\xed\xaa\xed\x22\xd4\x25\x5b\x28\x91\x58\xde\x5c\x57\x18\x21\x4f\xcc\x98\xc2\xbe\xbd\x71\x7c\xb0\x1b\xdc\xfd\x91\x3a\xf5\x14\x1a\x1a\xdc\xf9\x76\x87\xae\x5b\x41\xcf\x49\x83\x8d\xb4\x41\x7a\xae\xf2\x60\xd1\x73\x57\x08\xab\xb1\x14\xab\xab\xe6\x2a\xa3\x88\x88\xb8\x38\x0e\x8e\x9f\xf8\xe9\xcb\x60\x48\x74\x1c\x23\x90\xc0\xe9\xd0\xf9\x61\xf3\xc3\x27\xbb\x9d\xa5\x43\x6a\xac\xbc\xdc\x87\xed\x1a\x6a\x21\xbd\x05\xd5\xcb\xb6\x59\xa7\xd0\xfe\xa4\xa7\xaf\x32\x44\x57\x46\xbe\x4d\x28\x34\x26\x3b\x8c\xdc\x4e\x34\xdb\x6b\xca\x19\xeb\x6d\xa3\x2c\x6f\xdf\xaa\xea\x5b\x97\xfc\x7f\xa8\xba\x8b\xfa\xcf\x86\x16\x80\x8c\x80\xe6\x2f\x21\xe6\x13\x14\x2e\xa1\x21\x2e\xfe\x1f\x5f\xdc\x77\xe2\xd9\x22\xb6\xe1\x47\x9c\xd6\xc1\x1d\x35\x03\xea\x4a\x61\xcb\x75\x86\x3b\x4b\xc9\xe5\xdd\xbb\x77\x5a\xaf\xa4\x5e\xd7\x8f\xfd\x7f\xf8\xe2\x7e\x32\x08\xe2\x08\x08\x08\xb2\x08\x48\x3e\x08\x08\x08\x7e\xe2\xe2\xff\xfb\x2f\x5c\xca\x47\x11\x11\xf2\xa9\x86\x55\x9d\xc4\x97\xd1\xf1\x33\x15\xf6\x25\x49\x4a\xca\x04\x57\x9d\xd8\xbe\x6c\x9b\x88\x77\x9b\x52\xee\xed\x1a\x05\xd6\x17\x25\x5e\xc0\xa7\x4a\x23\x08\x88\x43\x3f\xd6\xde\xf6\x83\x8a\xe1\x52\x99\xa4\xab\x26\x7d\x2c\x97\xf4\xbc\x14\x47\xa7\xf6\x60\xcf\x71\x12\xda\xdd\x1a\x49\xf4\x8f\xd5\x71\xc5\x17\xf1\xb1\x3e\x6a\x67\x3e\xf6\xf6\xab\x95\xeb\x5b\x91\x7f\x1e\x3a\xbd\xd1\x0e\x2b\x2d\x8d\xc4\xb0\xb2\xa8\xea\x0a\x08\x90\xe5\x8e\xe7\x5f\x36\xbd\x21\xaa\xc2\x7d\x21\xa3\x35\x3c\xf3\xb1\x2c\x55\x9e\x27\xd7\x77\x7c\x90\x9a\x11\x9e\xa9\x5a\x21\xeb\xe7\x31\xba\xfa\x73\xba\xf5\x5d\x2d\x94\x3a\x4a\xdd\x90\x10\xb3\x8d\xb8\x90\xd1\xba\x9f\xf9\x58\xc2\x98\x90\x36\x84\x61\xbc\x1b\x96\xcb\x24\x91\x7f\x98\xeb\xb2\x99\xa6\xa4\x5a\xdb\x5b\x35\x5f\x70\x27\x2f\x23\x9b\x11\x2c\x5e\xc0\x45\xd6\xfb\x67\xea\x06\xa0\xa0\x22\xfa\x4b\x22\x21\xf8\x9e\xfa\xc4\xc7\x6c\x7c\x0c\x13\x3f\xa7\x83\x27\xac\x35\x7b\x2a\x8a\xae\xf1\x49\xca\x5a\x9b\x54\x4b\xb1\x95\x68\xa6\x1a\x9b\x9d\xc8\x3c\xd9\xf0\xd1\xfe\x67\x9c\xbf\xa4\xcf\x7f\xd4\xa5\xca\xbf\x34\x7b\xd3\x41\x88\xe9\xa6\x05\x8e\x6b\xdb\xaa\x7b\xde\x16\xf1\xf0\x8f\xe2\xd0\x36\xd2\x13\xfe\x2f\xf1\x86\xe1\xcc\x3c\xb0\xba\x20\xce\x5f\x12\x01\xe5\x74\x5d\xb1\x05\xe7\x23\xb6\x28\xf7\xdb\x9d\x84\xbd\x9a\xd4\x01\xa3\x31\x27\xfb\xe2\x3d\x86\x77\xab\x3c\xf8\xa5\x73\x18\xd6\xe4\x74\x43\x60\x75\x41\x1c\xf4\xfb\x66\x4b\x9b\xe2\x7c\xf5\x6d\xc6\xb0\x9f\x3f\x36\x19\xef\xbd\x67\x9f\x2e\x4f\x99\x46\xcc\xd6\xf6\xe3\xdb\xb5\x99\x18\x83\xa6\xf7\x8e\xb0\xba\x20\xce\x5f\x12\x41\xfc\x74\x5d\x34\xea\xc6\xd7\x4a\x84\x5f\xc5\xee\xca\x77\xcd\xdd\xd3\xf6\xda\x57\xf8\x54\x8a\x68\xa0\xe4\x76\xd9\x40\xd0\x7b\x2c\xdb\x88\xf8\x9d\x8f\xf4\x3f\xe3\xfc\x25\x11\x7c\x7c\x7c\x03\x25\x34\xc4\x25\x11\x90\xce\x68\xa0\xf7\xcf\x66\x91\xf3\x04\xd0\x91\x61\x16\xf8\x82\x83\xb7\x30\x26\x1b\x2e\xf5\xe3\x72\x8f\xf3\x9e\x62\xa4\xd5\xdb\x03\x5b\x62\x0c\x0a\x9f\xf2\x1d\x66\xfe\x05\xd8\xc0\x41\x1c\xf4\x82\xf6\xe8\x88\xa7\x25\x6e\x99\xa9\x4a\x67\x2a\x71\x67\xa9\xf1\x98\x17\x7c\xe5\x60\xa2\x31\x5a\xdf\x77\xe3\xc4\x11\x11\xe3\x23\xd0\x83\xd5\x05\x71\x50\x01\x98\xde\xbc\xe3\x4a\x5b\xb8\xe6\x39\x4c\xca\xba\xdc\xed\x82\xe3\xbf\x61\xd1\x2a\x13\x6a\x1a\x9d\x5d\x40\x18\x26\x5d\xe6\xfb\x26\x00\x56\x17\xc4\x41\xbf\xef\x03\x35\xa6\x54\x37\x27\xdd\x54\x47\x45\x2f\xf2\xc6\x90\xae\x38\x36\xec\x19\x8c\x5f\xde\x91\xea\xa6\xeb\x23\xfb\xd3\xc4\xc3\xbb\xb0\xba\x20\x0e\x2a\x80\xd1\xe4\x4d\xe2\xca\x9b\x35\xf5\xd4\x05\xa9\x2f\xad\x12\x34\x58\x67\x8e\xaa\x1f\xe2\x0d\x3c\x7d\xbe\xaf\xae\x95\xc9\x4d\x2f\x9c\xe5\x23\xfb\xcf\xb8\x7f\x0b\xf0\xaf\xb5\xe3\x2f\x0a\x80\x66\xf4\xf3\x14\x68\x53\x92\xfa\x6e\xce\xd8\x92\x26\xfe\x0e\x9b\xda\xa5\x65\x72\xfb\x91\x8a\xff\xa5\x0f\xfa\xaf\x7d\xcc\x10\xb7\x2d\x43\x16\x3f\x97\xc2\x86\x0e\xe2\xa0\x97\x34\x8f\x8f\xe1\x26\xda\xfd\x0d\xcb\x67\x63\x5d\x02\x4c\x48\xcd\xaa\x4f\x47\x30\x5f\x51\xaa\x48\x31\x3b\x49\x90\x99\xd9\x48\x3e\x49\x84\xd5\x05\x71\x50\x05\x6e\xd8\x17\xcf\xb1\xb4\x79\x7b\xe5\xf8\x58\xdd\x9a\x41\xbf\xaa\x62\xd6\xb1\x17\x6a\x99\x33\x8e\xd7\x61\x5e\x78\x7d\x25\x80\x5e\x13\x56\x17\xc4\x41\xbf\x6f\x95\x51\xba\xe3\xf0\x44\xd7\x56\xad\xc7\x2f\x8e\xfe\xe8\x93\x40\x8e\x4e\x1f\x53\x3c\xf6\x97\x6e\x55\x36\x89\x97\xd2\xcb\x3b\xf3\x60\x75\x41\x1c\x54\x01\xc7\x3b\xd6\x83\xcf\x24\xc8\xa9\x64\x4f\x9c\x68\x91\x02\x29\xae\xbb\x54\x35\x3b\xbe\x55\xb3\x19\x1a\x77\xea\x0e\xc6\xfa\x79\x32\xe8\x73\xfb\x9f\x71\xff\x56\xe0\x7f\x17\xf2\xbf\x38\x00\x5a\x5e\xcf\x73\x40\x96\xd3\x7f\x5d\xec\x85\x16\x0f\xe2\x54\x3a\x5f\x13\xdf\xa5\xd5\xe5\x6f\xb3\x77\xaf\x44\xd2\xbf\x97\xb4\x26\xfa\xfa\x42\xfc\x8f\x0e\x6c\xec\x20\x0e\x7a\x4d\xb9\xc6\x4f\xae\xdf\xa7\x6c\x9d\x97\xb7\x6b\xf0\xb7\x33\x59\xbb\x3f\x33\xa6\x99\x3b\xab\x87\x28\x70\x28\x95\x33\x3e\xb6\x63\xbd\x06\xab\x0b\xe2\xa0\x0e\xb8\x3c\x9c\x7d\xef\x48\x1b\x3e\x79\x73\x73\x70\x97\x97\xe1\x08\xc9\xa0\x4a\x62\x58\xfa\xbe\xe4\x9f\x7b\x94\x42\x47\xa8\x1e\x6e\xaa\xb0\xba\x20\x0e\xfa\x7d\x9b\xd5\x0b\x92\x31\xcd\x24\x8a\x8e\x9a\xe2\x8c\xc6\x27\xc2\x35\x74\x9a\xed\x04\x78\x57\x7e\xd7\xad\xe5\x26\xd1\x36\x4f\x67\xa5\xc2\xea\x82\x38\xa8\x03\x6c\xcd\xcf\x6f\xbd\xae\xcd\xc3\xb0\x0b\x08\x55\x33\xcb\x75\x24\x54\x26\xff\x3c\xc2\x74\x18\x9c\x66\xe0\x24\x32\x9c\x79\xcf\xfd\x09\xcc\x01\x10\x07\x73\xe0\x5f\xbb\xaa\xbf\x38\x00\xda\xeb\x9c\xe7\x80\xde\x0c\x63\xb5\x98\xc2\x86\xb0\xf4\x97\x9f\xf6\xe1\x64\x6e\x04\x4b\x76\x4a\xb7\xb3\x4e\x0a\xf5\x68\x37\x4f\xda\x05\x53\x1a\x9a\x60\x63\x07\x71\x67\xf6\x02\xe6\x24\xc6\xa8\x48\xde\x93\x9a\x8b\x01\xea\x0f\x94\x6c\x79\x2e\x0f\x7f\x37\x0e\xf4\x1d\x48\xfa\x13\xa8\x18\x72\x23\x49\xb3\x02\xbe\x17\x00\x70\x50\x07\x70\x49\xfd\x5b\x9f\xa6\xbc\x1e\x49\x9a\xa9\x7b\xe6\xc9\x44\x8d\x77\xfd\xb7\xec\xf2\xdb\x7e\x14\x09\x5e\xe3\xf1\x21\x03\x33\xa4\x2d\x58\x5d\x10\x07\xfd\xbe\x3a\x0e\xa8\x3d\x88\xf1\x71\x6f\x9f\x28\x39\x16\x9b\x93\x4a\x5d\xfa\xc3\xbf\x6c\xdc\x89\xf8\xe3\x2d\xc9\xe2\x57\x85\xaf\x7e\x5c\x43\xf0\x25\x11\xc0\x41\x1d\x18\x7a\x76\xcf\x54\x31\x46\xf9\x38\x6a\xf4\xf1\xf3\x42\xf4\xcd\x75\xf6\x37\xf9\x45\x8c\x1c\x22\x3f\x0a\x0b\x37\x6c\x17\x8b\xa4\x99\x61\x0e\x80\x38\xf8\x3c\x60\xf8\x77\x07\x40\x1b\xcf\xf3\x1c\xd8\xce\xac\x59\x78\x59\xce\x11\x83\xbf\xbb\xb8\x9a\x23\x5d\x36\x6d\x7e\x29\x29\x33\x29\x3c\xcb\x15\xfb\xe6\x50\x0e\xd6\x0f\x71\xf8\x7e\x10\xc4\x41\xaf\xa9\x59\x91\x8a\xcb\x0e\xe1\xa5\x07\xa6\xb4\xcb\xe2\x47\xb3\x63\x8a\xed\x83\x58\x7f\x1c\x07\x64\x57\xaa\xeb\x49\x24\xf8\xee\xd6\xdb\xc0\xea\x82\x38\xa8\x03\x3c\x5c\x7e\xcf\xdb\x8f\x05\xb2\x66\xe3\x69\x77\xa6\x8f\xe7\xb6\x42\x6a\x07\x99\x9e\x89\x3a\x53\x25\x90\xc6\x4c\x60\x87\x30\x13\xc0\xea\x82\x38\xe8\xf7\x9d\x62\xe9\x1f\xc1\x22\xed\xf4\x95\xe2\x9c\x94\xd1\x5e\x2e\xcf\x95\xc4\xc1\xd5\x3c\x28\xb0\x9d\x41\xe1\xbf\xed\xd6\x98\xd1\x0d\xaf\x0b\xe2\xa0\x0e\x04\xc4\xaf\x90\xfb\x0e\x76\xb7\x28\xda\xc4\x3b\x46\xbb\x68\xd4\xf7\xbd\x52\xd0\x59\x34\x2d\xe5\xd1\x41\x40\x77\x4d\x15\xbf\x3d\x07\x73\x00\xc4\xc1\xe7\x01\xf7\xff\x8b\x03\x06\xff\xec\xce\x3d\x00\x15\x05\xd1\x5f\x1a\x09\x01\xe1\x3f\x46\x9f\x5f\x24\x45\xd6\x3b\xad\xd0\xdc\x2f\xbc\x6e\x41\xd9\xb6\xb9\x8f\x26\xb4\x31\xe2\xb2\x9b\x5d\xab\xf0\xee\x7a\x2c\xe2\x7e\x69\x90\xcf\xbd\x7f\xc6\xf9\x4b\x23\xf8\xfc\x67\x65\xd9\xd9\xa1\xf8\x49\x05\xc3\x3f\xc3\xba\xb1\x94\x41\x0c\xb8\xc1\x46\x9a\x47\x39\x3f\x3b\x15\xcc\x54\xc8\x77\x43\x9d\x9b\xba\xb6\x60\x95\x41\x9c\xbf\x34\x02\xd2\x7f\x56\x2e\xfe\x30\x8b\x66\x3a\xe8\x8a\x42\x68\x90\xcc\xe5\xb1\xa6\x5f\xa7\xb6\xcc\x3c\x28\xda\x36\x27\x6a\x93\x62\x3f\xae\x50\x6e\x2d\x0a\xab\x0c\xe2\xfc\xa5\x11\x10\x10\x7c\x4e\x57\x6e\xac\x34\xb2\xb3\xf0\x35\x39\x20\xa7\x73\x31\x29\x6b\x9f\x15\x52\x4c\xa1\x4d\x57\x9b\x47\x08\x46\xba\x44\xfa\xd2\x33\xce\x57\xcf\x07\x96\xbe\x80\xfe\xbe\x72\x3a\x7d\xe1\x1e\x7f\x8c\xf2\xf3\xfd\x42\xcb\x2a\xa1\xcf\xa0\xe5\x80\xc2\xb2\x06\x91\x3f\x63\xfc\x84\xf3\x5d\x61\x04\x21\x32\x96\xbe\x50\xc2\x53\xa8\x62\xd8\xb3\xda\x72\x09\x4f\xe5\xa7\x73\x7f\x2c\x1a\x82\x37\x48\xef\x54\x44\xbe\x92\x46\x1e\xfd\x84\x50\xde\xa6\xc4\xdf\xf2\x72\xff\xbf\x25\x7d\xd9\x43\xfd\x67\x43\xfb\x3f\xe9\x8b\xe4\x5d\x42\xc8\xcd\xf2\x6b\xe2\x1a\xcb\x2f\xe3\xe6\x4a\x6a\x32\xa4\x05\xbe\x27\xa2\xbd\x05\x0f\xbe\xd8\x92\x61\x5a\x1a\x18\xa1\x0d\xb8\x04\x51\x2a\xa0\x5d\x44\xfc\xd2\x72\x26\x7e\xd9\x2e\xfa\xfe\x69\x63\xa8\x86\xf9\x50\x1e\x7d\xca\xc2\x1f\xff\x56\xf9\x33\x64\xc6\xea\xe1\xf5\x10\x02\x8f\x28\xe1\x28\x9d\xf5\x8d\x8b\x48\x06\xc4\xcf\xc6\x2f\x34\x0b\x8d\x1d\x11\xd3\x46\xe8\xf2\x4e\x54\x0c\x11\xa3\x0c\xc2\x56\x2a\x14\x5a\x27\x1a\xa9\xce\x53\x15\x4f\x8e\x51\x8f\x2e\x2d\x5e\xc4\xc7\xb6\x9c\x8d\x5f\x52\x15\xba\x58\xf2\x77\xb4\xc9\x65\xaf\xf4\x29\xfa\x0e\x66\x1a\xbd\xfa\xf4\xfd\x13\x62\xc5\xd7\xea\x9f\x09\xf4\x66\x1a\x91\xe4\x5e\x17\x32\xda\xb3\xf1\x8b\xf0\x32\xb7\xd1\x9b\xe8\x79\x4d\x1d\x1d\xd9\x19\x5a\x02\x63\xe6\xb8\xdf\x6c\x69\xdd\xda\x6a\xad\xcb\xe3\xa9\x5a\xbd\x14\x48\x17\x33\xda\xb3\xf1\x0b\xd9\xc0\x8d\x0a\x29\x2d\x6b\xb1\xb4\xde\x7a\x4c\xf7\x56\x3e\x2c\xee\x5a\xfc\x9c\x3b\x72\x3e\xb4\xef\x7f\x5e\xbd\x6c\x26\x4d\x71\xf9\xc2\xe2\x17\x90\xba\xe7\x2d\xb7\x51\x6e\xf3\xbf\xdf\xb1\x8c\x3e\x98\xa0\xef\x55\x63\x62\x30\xba\x72\xa4\x59\x28\x15\x47\xdb\x7c\xb4\x8d\x27\xd1\x24\x6e\xa5\x40\x0d\x5b\x66\x40\x1c\x74\xf9\xca\xdf\xa4\xe4\x89\xb9\xe9\xc4\x64\xe9\xc1\xfe\x79\xab\xb0\x53\x7b\x26\x33\xea\x4b\x49\x4b\x12\xa5\xf2\x67\xb1\x31\x97\xe7\x5a\x65\xb0\xba\x20\x0e\xba\xdc\xa6\xf0\x67\x18\x67\xc5\x23\xe9\xf7\x3a\x57\x94\x3e\xf9\x51\x6b\xfc\xa8\xe3\xfe\x21\x69\xc5\xab\xdb\x62\x91\xac\xfa\x49\xc2\xb9\xd6\xb0\xba\x20\xce\x5f\x12\x01\xf1\x74\x5d\xf2\xd5\xb7\x48\x9c\x18\x9f\xf1\x1c\x32\x0a\xbf\x21\x38\x13\xb0\x16\x8c\xab\x2c\x8e\x11\x2c\x62\x26\xc9\x7f\xbe\x1b\x28\x82\x8e\x09\xab\x0b\xe2\xfc\x25\x51\xfe\xe3\x3a\x08\x86\xd7\xfd\x19\xa8\x21\xbb\x11\xbc\x64\xfc\x89\xfe\x2d\x3a\xdb\x57\x0e\xfb\x60\xb7\x8a\xb8\x9d\x14\x2a\x4b\x0d\xf1\x29\x81\x2d\x1f\x99\x7f\xc6\xf9\x4b\x22\x60\xf8\xf8\x06\xfe\xcf\x7c\xf5\x97\x0d\x17\x68\x1a\x39\xcf\x80\x47\x61\x61\x4a\xc5\xe9\x72\xfc\x0e\xf8\x6a\x6f\x3c\x7a\x08\x46\x16\xbb\xee\xf3\x76\xeb\x19\xaf\x18\x9b\x84\x23\x87\x0c\xc7\x50\xc1\x46\x0e\xe2\xa0\x06\x58\xca\xac\xd7\x34\xc6\xe2\xb5\x52\x72\x4d\xce\x48\xd2\xd7\x38\x4e\x44\xda\x74\x3f\xf7\xd5\xc7\xed\x6f\xbe\x77\x43\x4d\x6f\xe0\x16\xac\x2e\x88\x83\x1a\x60\x4c\x28\x1e\x2e\xeb\x3b\x97\x1d\x17\x3a\x23\x97\x36\xb2\xcc\xae\x41\x52\x2e\x43\xa3\x1d\xd0\x26\xaf\x2f\xcc\x98\xe4\x96\x00\xdf\x18\x81\x38\xa8\x01\xc4\x44\x6b\x05\x7e\xec\xe8\x58\x54\xef\x9a\x05\xe6\x4e\x22\x1e\xf7\xa8\xeb\x5f\x89\xd3\x9d\x51\x44\x65\x70\xdb\x63\x5b\x93\xfb\x04\xab\x0b\xe2\xa0\x06\xd4\x56\xfd\xa6\x30\x2b\x78\xbc\xdc\x9f\xfc\xda\x44\x56\xeb\x1a\x3f\xe6\x95\xa2\xd4\xa0\x8f\x9d\x18\xcd\x47\xc3\x18\xa1\x49\x59\xb2\xb0\xfc\x05\xc4\xfd\xdb\x80\x7f\x2d\x1e\x7f\x51\x00\x34\xa5\x9f\xa7\xc0\x9b\xd7\xfb\x5c\x76\x18\xa3\xb6\xf5\x47\x14\x13\x1f\x64\x76\xcb\xfa\x33\xc8\x69\x8d\x7b\x5c\x68\x51\x1b\xaf\xc7\x5e\x8e\xb7\xe6\x86\x0d\x1d\xc4\x41\x15\x20\xcb\x47\xb4\x5a\xc0\xf2\xfb\xe8\xb5\x3b\xe9\xd3\x76\xeb\x61\xa8\x27\xc1\x86\x06\xdd\x07\x24\x7a\xc4\xe2\x47\xc9\x83\xe5\xa4\x74\xb0\xba\x20\x0e\xaa\xc0\x48\x9b\xa7\x22\x76\x38\xf7\x44\x65\xd0\x68\xec\xdd\xd0\xf0\x41\xbf\x0d\x13\x87\xd0\xcc\x4c\x16\xb5\x30\x86\xd7\x01\x2b\xbc\xad\xb0\xba\x20\x0e\xaa\x00\x02\x6a\x3d\x6d\x5b\x72\xee\xa1\x93\x0a\xca\xe5\xfc\x66\x47\x54\x54\x61\xf4\xbb\x1a\x03\xef\xcc\xaa\x47\xf7\xbf\x92\x08\xa0\x3d\x82\xd5\x05\x71\x50\x05\x26\xf9\xae\x64\x4c\x68\xc6\xcf\xea\xbc\xe2\x99\x71\x2e\x43\xa6\xd7\x2a\xbf\x81\xaa\xa2\x7e\x15\x05\x6b\xf0\xd6\x70\xdc\xe4\x3c\x05\x6c\xcf\x0d\xe2\xfe\xad\xc0\xff\xae\xe4\x7f\x71\x00\xb4\xbe\x9e\xe7\xc0\xd3\xdf\xf8\xee\x21\xe8\x39\x96\x9f\x4d\xa2\x88\xee\x1d\x88\x08\x50\x8f\x88\xcf\xb3\xfd\x36\xa4\x76\x11\x77\x6b\x6a\xd6\x0a\xba\x09\x1b\x3b\x88\x83\x3a\xf0\xf9\xe0\xe9\x70\x25\x0f\x06\xe5\x31\xe6\x5a\xf0\xba\x9c\x53\x4f\x17\x21\xb3\x77\x51\x50\xfd\x23\x72\xab\x5e\x89\xe7\x5c\x7b\xeb\xb0\xba\x20\x0e\xea\x40\x0e\x0b\x6e\xf1\x6e\xa6\x51\x63\x75\x85\xcd\x3b\xe4\x91\xbe\xfb\xf3\x9f\x1b\x87\x09\xe5\x26\x08\x5c\x17\x32\xdc\x7a\x77\xac\x1a\x61\x75\x41\x1c\xd4\x01\x9b\x72\x5a\xf6\x4f\x82\x0e\x03\xad\x3e\x48\x55\xfa\xfc\xdb\x8a\x86\x53\xcc\xd6\xe3\x0f\xd7\x44\x5f\x84\x60\x6d\xc8\x67\xa4\x93\xc1\xea\x82\x38\xa8\x03\xb1\x63\xef\x30\x82\x19\x3c\x8e\x70\xb5\xd7\x6d\x1d\x87\x17\xbd\x77\xaf\x8e\x70\xb4\xa5\x7a\x24\x85\x79\x54\x4f\x0d\xb1\x66\x5a\xc0\x1c\x00\x71\x30\x07\x5a\x00\xf9\x0b\x68\xb3\x73\x9e\x03\xfa\x97\x15\xef\x4b\x93\x3d\x96\x5f\x5c\x96\x15\x18\xc5\x2d\x54\xf5\xe4\x47\xa2\x72\xf9\x2e\x28\x90\xf6\x69\xb0\xe6\x16\xda\x4e\x3d\x6c\xec\x20\x0e\xea\xc0\xe8\xc0\xfb\x82\x38\x9e\xa1\xa3\x3c\x97\x12\x15\x69\xfd\xa0\x14\xe7\x10\xaf\x1f\x0b\x02\x57\x7f\x93\xdd\x73\x58\xe2\xb4\x5f\x3e\x84\xd5\x05\x71\x50\x07\x16\xa9\x5f\xd1\x1a\xf6\x0b\x36\x5c\x45\xb9\x3e\xb4\xb5\x55\xc2\xa5\x4f\x16\x26\x91\xaa\x49\x40\xc7\x70\xe7\x8b\x65\xb5\x99\x89\x07\xac\x2e\x88\x83\x3a\x70\x6f\xd8\xab\xb5\xa7\xdc\x84\x48\x35\x50\xd2\xe5\x87\xad\xea\x36\x05\x82\x60\x9c\xa2\xf9\x5b\xdb\xbe\xd9\x03\x67\x9f\x47\x8b\x2f\x61\x75\x41\x1c\xd4\x81\x44\x47\x9b\x4b\x2b\xeb\x48\x75\xa5\xb4\x3c\x41\xd5\x5b\x8c\x28\x6f\x7f\x8d\x99\xdc\x65\xbd\xb2\x59\xb8\x4b\x95\x7b\xef\xc6\x9d\x2c\x98\x03\x20\x0e\x3e\x0f\x00\xf2\x17\xd0\xce\xf3\x3c\x07\xc2\x7d\x7f\x4c\x5d\xfd\xac\xf2\x53\x76\x16\xb3\xb3\x24\x9f\x88\x93\x05\x71\xb5\xad\xc2\xaf\x7f\x3c\xe7\x4f\x57\xd9\xcc\x86\xa9\x18\x6c\xec\x20\x0e\xea\x00\x0b\xb1\x7b\xdc\x8f\xbb\x59\x54\x1e\xc1\xac\x28\xcf\x95\xbc\x28\xc2\xc4\x84\xf1\x11\xdc\x94\x54\xe5\xc2\x06\x15\x65\x16\x48\x8a\x60\x75\x41\x1c\xd4\x01\xeb\x1c\x9b\x05\x9b\xef\x74\xab\x56\xeb\xd8\xa4\x75\x6b\x4f\x11\xc3\xdf\x7e\xe1\xca\x15\xf9\x33\xb5\x1b\x8a\xe9\x36\xf2\x59\xbd\x0a\x56\x17\xc4\x41\x1d\x70\x61\xad\x37\x68\x11\x47\xb7\x2b\x16\x47\x76\x5a\x48\x8a\x36\x52\x0a\x2a\xd6\xc8\xbd\x6d\x23\xaa\x7f\x1d\x83\x2d\xe8\xb1\x3e\x25\x3c\xdf\x05\x70\x50\x07\x5e\xec\xd0\x59\xc5\x3c\x5e\xfd\x23\xf2\x95\x25\x51\xef\xeb\xd7\x96\x80\x8f\x01\x6b\x44\x23\x29\xec\x79\x91\x45\xe3\x12\xa4\x12\xfc\x30\x07\x40\x1c\x7c\x1e\x00\xe4\x2f\xa0\x7b\xf7\xf3\xf3\x17\x3d\x03\xc5\x1b\xd2\xb4\xf1\x72\x28\xf8\x43\x0c\x83\xfa\x2f\xf4\x03\xc3\x82\xa4\xcb\x62\x3d\x3a\x3d\xd3\xa8\xae\xc8\x50\x79\xe8\xc0\xb2\x0c\x10\x77\x36\x7f\x71\x09\x2f\x41\x9c\xb5\xfc\x4a\x81\x4d\xa0\x79\xeb\x29\x9d\xc4\xea\xd7\xa2\x76\xb2\x32\x8a\x11\xc3\x92\x04\xcc\x1f\xce\x65\xb1\xd4\xb0\xca\x20\xce\x5f\x1a\x01\xe5\x3f\x2b\xff\x98\xb2\x78\x7d\x79\xb3\x66\xe6\x09\x7d\x65\xcc\xc1\x3c\x87\xba\xf9\x87\xf1\xcb\xd4\x0f\xd8\xc3\x54\x76\x3b\x34\xc3\xae\x5c\x1d\x85\x55\x06\x71\x67\xaf\x46\x67\xb5\x58\xb4\x92\xcd\x28\xf7\x42\xc6\xd4\x0f\x3d\x73\x5f\x0f\x5e\x9c\x7d\xe9\xfd\x1c\xfd\xf6\x1a\x49\xe4\xe1\x82\xdb\x83\xa1\xf0\xfc\x05\x74\x68\xf5\x74\xfe\x42\xae\xed\xfa\xab\x44\xe6\xed\x7b\x5c\x06\x7f\x5f\x7f\x9d\x8d\x5a\x15\x5c\x4b\x75\x42\x25\x75\xda\x9c\xb2\x6f\xe5\xcf\x88\x78\xd3\x4f\xa1\x75\xb4\x4a\xfd\xe2\x4d\x72\xb4\x53\x1d\x28\x4c\xdb\x86\x18\xdb\x01\xd9\x3f\x50\x7c\xef\xbe\x72\x8c\x9f\xab\x7f\x20\xc9\x7b\x15\xf5\xbf\x2d\x7f\x01\x0d\xed\x54\xfe\x12\x0d\xcd\x5f\xd8\x0c\xa7\x3e\x94\xd5\x5c\x66\x58\x98\x79\x3f\x4f\x3f\xf6\xb1\xd5\xd7\x60\x8f\x86\x33\xd9\x4c\xf7\xe3\xbb\x7b\xb9\x97\xb8\x64\x2a\x2f\x22\x7f\x41\xb8\x03\xbd\x47\xf7\xd9\x40\x74\xb9\xe2\xd6\xd1\xff\xc4\xd3\x8d\xee\xe7\x71\xe0\xfd\x8a\x42\xb1\xa9\x98\xd8\xa5\xc5\x3c\x41\x7e\xe4\xc6\x5b\x3d\x05\x17\x72\x32\xe3\x6c\xfe\x22\x72\xcc\xfd\xca\x96\x78\xfe\x9d\xcf\xca\x13\xde\x6d\x05\x51\xa9\xb7\x45\xc4\x4b\x57\x5c\x4a\xd4\x47\xad\xc6\xb1\xde\x09\xad\x3d\xb9\x90\x73\x28\xea\x67\x3e\xf6\x3e\x93\xa4\xe3\xdd\xa3\xa4\xdb\xca\x6d\x19\x9f\x34\x0d\x35\xb6\xfc\x1c\x98\xd7\x85\xb7\xee\x3c\xf0\x2d\x8e\x1d\x7e\x69\xf4\xc6\xed\x42\x46\x7b\x36\x7f\xa9\x40\x46\x25\xa0\x5d\x13\x10\x26\x37\xf6\xc0\x3e\xce\xa6\x1c\x91\x25\x71\x50\x5f\x27\x2e\x0f\x68\xa8\x2b\x2c\xff\xaa\xd6\x63\x79\x21\xa3\xf5\x38\xf3\xb1\x14\x0d\xc5\x54\x52\x79\x92\x3c\x48\x37\x47\x23\x69\x34\x6a\xb1\x93\xba\xd1\x48\xec\x51\x56\xb9\xf2\x35\xc5\x2c\x7a\x5d\xee\x18\x5c\x58\xfe\x02\x52\xf7\xbc\xe5\xd6\x00\x51\xe4\xb0\xfd\x3d\xff\xf1\xc8\x80\x97\x76\xbd\xdf\x2d\x43\x46\x0a\xb4\x93\xf2\x56\x42\x1f\x9e\xe0\x4b\xe5\xab\x15\xce\xf0\x3f\x79\x81\x38\xe8\x72\x5b\x38\x29\x90\xaf\xc5\x97\xb7\xcd\x73\xc7\x0d\x11\xf7\xd6\xd5\xe0\xdb\xed\x33\xbf\x22\x2d\x62\x4f\x6e\x3c\x36\x43\x19\x66\xb4\xae\x83\xd5\x05\x71\xd0\xe5\xf6\x7e\xe8\x94\x9b\xf1\xac\x45\xec\x7b\x27\x91\xb0\x1e\xa7\x14\xcb\xb1\x40\x1c\xd1\x7b\xb6\x0d\x05\xdb\x8d\x0f\xac\xcb\x58\x79\xf7\x60\x75\x41\x1c\x74\xb9\xfd\x99\xa6\x19\x45\xbe\xf2\x98\x7f\xd3\xbc\xc6\xce\xf7\x57\x0c\xcf\xb0\x78\x7c\x0f\x01\x19\x71\x31\x5f\xb7\x92\x4f\xdd\x62\x19\x3b\xac\x2e\x88\xf3\x97\x14\xff\x8f\xeb\xa0\x60\xbe\xa6\xfa\x61\xbd\x6e\xa8\x25\xf6\x7e\x95\x18\xea\x6b\x3a\xf3\x6b\xac\x82\x8f\xba\x10\xf6\x16\x5d\x97\xa4\x59\xd7\x1a\x92\x61\xf9\x0b\x88\xfb\x9f\xeb\xeb\xe3\x1b\xf8\x3f\xf3\xd5\x5f\x36\x5c\xa0\x69\xe4\x3c\x03\x86\xb1\x83\x3e\x70\xb2\x98\x6e\x3e\xa0\x14\xc3\x95\x2d\x2d\x6f\x54\x1a\x9a\xcb\x6c\x1c\x4b\x7f\x9f\xa6\x6b\xc1\x1f\xfd\x36\x0e\xbe\xe1\x02\x71\x50\x03\x96\x90\x62\xdb\x43\x35\x7f\xaa\x52\xdf\x8f\x8c\x24\x7e\x4e\xc8\x74\xf5\xb1\xd5\x4b\x31\x19\x51\xb3\xbb\x14\x89\x6d\x93\x68\x44\xe1\xb0\xba\x20\x0e\x6a\x40\xd6\xf7\xad\x5c\x73\x53\xc2\xe0\x55\xfc\x58\x76\x86\x9b\x7e\x4d\xb2\xcd\x33\x9a\x7f\x56\x52\x9e\x3c\x22\xf6\x2f\x56\x8e\x33\x84\xdf\x24\x80\x38\xa8\x01\x19\x34\x85\xa4\x03\x78\x0e\xb9\xca\x39\x27\x89\x59\x63\xfc\x4c\xf8\x99\x9c\x3f\x5f\x9e\xa0\xae\x35\xa5\x04\x71\x27\x87\x1c\x75\xc3\xea\x82\x38\xa8\x01\x8b\x65\x0b\x5c\x51\x7e\x5f\x43\x65\xfe\xa4\xb7\xa0\x70\xdf\x76\xa2\xd3\x74\xb9\x21\x1b\xe2\xc6\x50\xea\x41\x96\x3c\xb3\x11\x71\x04\xcb\x5f\x40\xdc\xbf\x0d\xf8\xd7\xe2\xf1\x17\x05\x40\x53\xfa\x79\x0a\x64\xba\xd3\x7a\x10\x53\x4a\x74\xe7\xa1\x50\x8a\xe1\x54\x3e\xed\x13\x79\x55\xcb\x97\xc3\xa7\xfc\x50\xe4\xc0\xbc\x88\xc6\x32\x0a\x7e\x04\x0a\xc4\x41\x15\x98\xf6\xca\x9a\xe5\x8c\x74\xae\xf3\xd9\xb9\xeb\x47\x79\x32\x9e\xee\x56\x67\x58\xe7\x9d\x48\x39\xe1\xa7\xbb\x32\x6d\x69\xf7\x69\x0a\x56\x17\xc4\x41\x15\xa8\x17\xb8\x32\x94\x46\xb7\x61\xe6\xa8\xf7\xe9\x86\xde\xaf\xe3\xa7\x45\x61\xb2\xf4\x1f\xc7\xf4\x75\x64\x3b\x9c\x1a\xc8\xab\x4d\x07\x60\x75\x41\x1c\x54\x81\x0d\x77\xb7\x1b\x1f\x22\x95\x6e\x3c\xf9\x2e\x24\x48\x12\xc6\xc4\x8f\x33\x47\x1a\xc9\xf3\x9b\xf5\xb0\xc2\x84\x53\xd9\xf2\x2e\x2f\xfc\x6f\xbf\x20\x0e\xaa\x80\x8a\x3b\x67\x53\xc6\xf4\x15\xd1\x35\x87\xd2\x32\x9b\x69\xfb\x80\x26\xc7\xe4\x9f\xd6\x99\xb8\x3f\x1f\xdf\x1a\x45\xa6\xf1\x20\x1e\x87\xed\xb9\x41\xdc\xbf\x15\xf8\xdf\x95\xfc\x2f\x0e\x80\xd6\xd7\xf3\x1c\x18\xcc\xea\x7e\xe5\x11\xf1\x6e\xfe\x41\xbf\x07\x13\xd3\x0f\xdb\x6b\xcc\xf2\x2c\xcf\xe3\xeb\xb6\x1e\xd3\x75\x14\xd1\xb9\xce\x85\xb7\xc3\xc6\x0e\xe2\xa0\x0e\xb4\x65\x25\xbf\xab\xd6\xcc\x28\x10\x22\xe6\x67\x53\x60\x76\xd8\x0f\xc3\xa5\x30\xc0\x38\xe9\xd8\xf3\xa8\x37\x36\xf0\x5b\xde\xba\x03\x3f\x5b\x05\xe0\xa0\x0e\xbc\x6f\xc1\xa7\xab\xfd\xaa\x40\x5e\xbd\x3c\xc4\xf1\x68\x60\x24\xd6\x8b\x54\xc2\xb5\xee\x16\xc9\x77\x2e\xe2\xc0\x54\xdc\x39\x0e\x78\x60\x0e\xe2\xa0\x0e\xc4\xb6\xa9\x64\xa9\x36\xb3\x54\x74\x2b\xf0\xbe\xc6\xbe\x8c\x88\xb0\xfa\x2e\xda\x26\x96\x76\xc1\x4f\x11\x95\xf7\x32\x55\xb6\x6b\x06\xac\x2e\x88\x83\x3a\x30\x50\xc3\x2e\x49\x61\x4f\xc2\xdd\xea\x42\x76\x7c\x4f\x38\x01\x33\xc6\xda\x76\xcc\x7d\xb3\x67\x45\xe4\xb1\x5a\xa3\xb9\xf7\xaa\x02\xcc\x01\x10\x07\x73\xe0\x5f\xdb\xaa\xbf\x38\x00\xda\xec\x9c\xe7\x80\xbf\xa5\xaa\x00\x6f\xcd\x83\x7b\xa2\x32\x24\xf8\x65\xa1\x9a\x05\x2c\x25\xed\x86\x57\xfd\xcd\x83\xb9\x0f\x06\xf2\x92\x51\x1e\x4b\xc1\xc6\x0e\xe2\xa0\x0e\x48\xec\xc8\xbc\xd5\xce\xa0\xc9\xc1\xb2\xee\x73\x79\x27\x4e\x43\xe1\x1e\xc1\xd2\x52\x2c\x87\x77\x74\xc7\xd2\x86\x90\x3f\xf8\x01\x3c\x7f\x01\x71\x50\x07\x88\x4c\xd4\x64\x3e\x72\xd7\x4e\xf9\x74\xc8\x1f\x99\xbe\x52\x50\x4a\x61\xc0\x62\x51\x72\xde\x7c\x10\xd8\x29\x84\xbb\x25\x3c\x74\x0d\x56\x17\xc4\x41\x1d\x58\x14\xea\x38\xfa\xea\xff\xec\x0b\x5b\x7f\xd1\x3e\x6f\x57\x0a\x7d\xb0\x85\x4b\xe1\xa1\x97\xb5\xbf\x77\xb0\x1a\x8b\x1e\x65\x92\x25\x3c\xd7\x01\x70\x50\x07\xd0\xd6\xa5\x7c\x03\x3b\x38\x08\xdd\x7c\xf2\xfc\xb6\x4c\x5e\x3a\xe8\xd0\xbf\x11\x42\x56\xba\x97\xdd\xfc\x9d\x5b\x84\x1e\xf1\xfb\x53\x98\x03\x20\x0e\x3e\x0f\x00\xf2\x17\xd0\xce\xf3\xdc\x1c\x36\x77\xdb\x2f\x89\x32\x8a\x24\xf6\x61\x84\xdc\xed\x77\xbb\xf4\xbc\xbe\x9a\xa1\x1d\x31\x24\x3c\x45\xc4\xaf\x64\xf5\x96\x48\x14\xe1\x39\x2c\x80\x83\x3a\xa0\x8e\x39\xd9\xfb\xdb\xf1\x04\x2f\x91\x99\xa2\x7a\x27\x08\xf7\x33\xdd\xb7\xdc\x52\xa9\xc8\x47\x72\x92\x53\x8f\x4d\x1c\x1c\x7f\x2c\xc3\xea\x82\x38\xa8\x03\x14\xc9\xb2\x3d\x5a\x37\x92\x6e\x30\x57\x3d\xee\x8a\x08\xe1\x42\x2b\xed\x24\x68\xdb\x38\xbe\xf4\xcb\x21\x59\xdb\x5d\xe4\xb0\x14\x7e\xcc\x16\xc4\x41\x1d\x70\xd0\xfd\x78\xc5\x20\x59\x67\x8a\xc9\xf3\xcf\xed\x2d\xad\x19\x6b\xce\xd5\x52\xc6\xec\xe5\x9c\xc3\x09\x8a\xd5\xdc\x98\x26\xcb\x19\x58\x5d\x10\x07\x75\xc0\x1d\x33\xc7\xaf\xa5\x1b\xcf\x56\x61\x82\x73\xe1\xa8\x08\xd1\xb9\x15\xe1\x53\xe5\x27\x25\x66\x12\xf2\x7a\x91\xfd\x51\xb2\x01\x6f\x98\x03\x20\x0e\x3e\x0f\x78\xfc\x3d\x7f\x01\xdd\xbb\x9f\x9f\xbf\x68\x4e\x5e\xa7\xd7\x75\xd4\x16\xd4\xc0\x0c\xeb\x66\x0f\xe2\x8a\xd9\x65\xa4\xe0\x0b\xd1\xe1\x08\x88\xa4\xf6\xad\xdf\xca\xa8\xeb\x86\x65\x19\x20\xee\x6c\xfe\x22\x8a\xa1\x63\xc7\xae\xf5\x02\x7d\xcf\xfb\x96\x9a\xf1\xfe\x51\x0d\x3e\x7e\xbc\x3d\xa9\x99\xc1\x03\xea\x8d\xd9\x9a\xf8\x07\x1f\x2f\xc3\x2a\x83\xb8\xb3\xf9\x8b\x4c\xd8\xce\x4a\x7f\x98\x80\xac\xb8\x9a\x82\x16\x16\x4a\xab\xc4\xaf\xb4\x29\x7e\xfb\x67\x03\x5c\xb5\xa8\x2e\xc7\xca\xfd\xbf\x5d\x61\x95\x41\x9c\xbf\x34\x06\xe4\x6a\xf8\x08\x7d\x93\x15\x15\x47\xb9\xaa\x65\x57\xa9\x93\x42\x50\x33\x73\xad\x07\x7b\x20\x4d\xb4\x7d\x94\xc6\x59\xea\x2b\x2b\x5a\x9f\x34\x3c\x7f\x01\x3d\x09\x7c\x3a\x7f\x91\xd1\x2b\xf4\x20\x7a\xe6\xbb\x46\xcc\x6b\x31\xf8\xbb\xd0\xda\x95\xb4\x15\x7f\x91\xfa\xa3\xbe\xd8\x4d\x13\x05\xa6\xe7\x28\x0b\x83\xa7\x33\xc6\x88\xee\x27\xf6\x0b\x7a\xfc\x4a\x0c\x3b\xf7\x9e\x2e\x1d\xcc\x95\x60\x6a\xdc\x9c\x5d\xd0\xf9\xfc\x6c\xe2\xda\x26\x55\x4e\xa7\xcb\x7f\x5b\xfe\x02\x1a\xda\xa9\xfc\xa5\x1f\x9a\xbf\x28\x65\x4f\xeb\x56\x54\xa8\xf8\xea\xdd\x89\xee\x40\xef\x7c\xe6\x89\x8d\x76\x27\xae\x9c\x57\xf6\x8b\x5d\x88\x82\xbf\x83\x12\x19\xea\x45\xe4\x2f\xe2\x67\xf2\x97\xfa\xe8\xf4\xf2\x01\x2b\x87\x5d\xd5\x4c\x9f\x77\x8f\xd4\x1a\x46\xef\x33\x26\x76\xfc\x88\x9f\x33\x19\x7d\xe7\xa6\xc9\xe1\xf3\x06\xe7\x42\x8e\x66\x9c\xcd\x5f\x1e\x93\x28\xb2\x21\x70\x54\x51\xce\x3c\x65\x24\x56\xc6\xfc\x54\x48\xb4\x1f\xae\x9f\x2b\x88\xdc\x3c\xfe\xdd\x82\xdd\x88\x63\xa3\xfa\x42\x0e\xa2\x9c\xcd\x5f\x9e\x94\x6b\xef\x2c\xde\x28\xf8\x5a\x18\xb9\x27\x9f\xb8\xd3\xb5\x7f\x45\xf4\xd7\x31\xd5\x5b\x31\x23\x86\x9d\x96\x87\x31\xf8\x8c\x82\x17\x32\xda\xb3\xf9\xcb\x1a\x6b\xd1\x70\xfd\xdd\xf6\xcc\xfb\xf2\xe5\x69\x74\xcc\x41\x2d\x8e\x94\x08\x33\x7f\xbc\xa9\xfc\x06\xcd\x34\x6e\x3d\xf2\x2d\x32\xbd\x90\xd1\x9e\xcd\x5f\x7e\x54\xa9\x65\x71\xd8\xd4\x8c\x5b\x6b\xb2\xc9\x1e\xd1\xf4\xd7\x89\x6d\x6e\x8e\xa4\xd1\x22\x23\x3e\xf7\xb6\xe0\x51\x4c\xd4\xee\xbc\xb0\xfc\x05\xa4\xee\xb9\x4f\x9f\x74\xfc\x09\x6c\x46\xc5\xb2\x13\x5e\x16\x9e\xcf\x8a\x96\x76\x7d\x38\xdb\xe5\xfd\x84\x60\xe0\x7d\x84\xe8\x22\x1e\xff\x6c\xf1\x17\xf8\x51\x5b\x00\x07\x5d\x6e\x47\xda\x6d\x85\x13\xee\x6b\xd5\xd1\x23\x3c\x79\xc4\xb5\x4a\xf0\xfe\xc5\x68\xd6\xba\xf9\x13\xc5\xdb\x89\x97\x67\x57\xf4\x4d\x15\x64\xe1\x7f\xa2\x06\x70\x67\x1e\x3f\xf2\xca\xd8\x46\x4b\x08\x78\x33\xe4\xab\xc4\x7a\x4d\x20\x52\x77\x78\x79\x9b\x26\xaf\x7e\x90\xe9\xde\xd8\x55\x6f\xb1\x88\xbb\xaf\xe1\x8f\x1f\x01\x38\xe8\x72\xfb\xea\x4a\x4b\x55\x6c\x60\x9c\xa9\x3e\x52\x0a\x8b\x67\x93\xbf\xc9\xf6\xef\x91\x47\xba\x2f\xa4\x27\x0d\x44\x74\xa4\x07\x4a\xcc\xb4\x61\x75\x41\x1c\xf4\xfb\xb2\xa6\x6d\x3f\xb5\xe0\x38\x14\xe5\x72\xa8\x4a\x6f\x0c\xbd\x5f\xe6\xca\x8b\x3b\xa3\xd7\xcd\x63\x33\x56\x7a\xd4\x56\x12\x32\x0d\xcf\x5f\x40\x9c\xbf\x24\xc6\xbf\xf2\x97\xfe\xbf\xe6\x2f\xa0\x69\xe4\x3c\x03\x7e\x2f\x1c\xe4\x89\xbd\x0a\xfe\xcd\x93\xf4\x26\x14\x4b\xdd\x65\x68\x51\x38\xce\x1a\x5f\x64\xae\x2b\x61\x75\xfa\x4e\xd3\x58\x12\x2f\x6c\xe4\x20\xee\xcc\x21\x6e\x42\x4d\xdf\x1d\x3c\xe4\x97\x2b\x22\xd4\xa5\x42\x4e\x6b\x99\xa2\x3e\x29\xaf\x8b\x30\x65\x71\x1b\xd5\x57\x31\x98\x7c\xf5\xa2\xe1\x66\x01\x38\xe8\x15\x9d\x1c\xfd\x93\x38\x4b\x93\x9b\x24\x82\xb3\x3b\x14\xcb\x14\x20\x81\xe7\x88\xa1\x1c\x36\x7a\x5c\x40\x2e\x85\x5c\x69\x1c\x1a\x10\x06\xab\x0b\xe2\xa0\x06\xcc\x1e\xda\x2e\x4b\x12\x29\xc6\xa9\xd5\x93\xca\x7a\x08\x1d\xf7\x49\x6b\xa4\x5e\xa5\x8b\x79\xa9\x96\xde\x89\x3b\x5c\xc1\x56\x96\x03\xab\x0b\xe2\xce\x9c\xd7\xd9\xe7\x78\xcb\x2e\x5a\x59\xf2\x4a\xb5\x28\xf4\xae\x90\x9f\x56\xe5\xcb\x42\xf6\xa6\xf0\xc6\xe6\x3c\x44\x22\x9f\xd0\x18\x6d\x16\x58\xfe\x02\xe2\xfe\x6d\xc0\xbf\x16\x8f\xbf\x28\x00\x9a\xd2\xcf\x3d\xff\xf2\x05\xdf\x42\xb8\x6c\x09\xb9\xd0\xb7\x53\x4a\xf3\xc9\xfd\x01\x94\x99\x54\x7f\xb3\xd1\xaf\x01\xae\xc2\xb6\x16\x1d\x7d\x4f\xdc\xe1\xe7\x5f\x00\x1c\x54\x01\xd5\x88\x0e\x46\x59\xea\x13\x7d\xc9\x27\x3b\x41\x47\xca\xdc\x8e\xe1\x4d\x94\x27\x51\x39\x9b\x31\x76\xa3\x79\x47\xe1\x91\x92\xf3\xb0\xba\x20\x0e\x7a\x49\x51\xe3\x94\xdf\x76\x7f\x22\x3a\x59\x95\x98\xcd\x66\xd8\xc9\xb8\x81\x18\x42\x51\xf8\x6b\xab\x5f\xa3\x7e\x14\xc7\xca\x63\xda\x1d\x7e\xfe\x05\xc4\x41\x15\xd8\xc9\x48\x19\xe7\xdc\xb5\x4f\xd4\xdc\x18\x65\x1d\xa8\xf5\x73\xcb\xa7\x1e\xa1\x1d\xda\xc0\xdf\xbe\x23\xab\x6f\x5d\xf7\x58\x69\x12\x56\x17\xc4\x41\xbf\xaf\x4e\x2f\xcb\xcc\x8d\xfb\x1a\xd1\x52\x52\xcc\x3d\x5f\x6e\x5b\x8a\x33\x2f\xde\xff\x83\xda\xe5\x2a\x88\x50\xc0\xad\xe5\x91\xb5\x41\x0c\xdb\x73\x83\xb8\x7f\x2b\xf0\xbf\x2b\xf9\x5f\x1c\x00\xad\xaf\xe7\xde\x77\xe1\xfe\xb2\x2b\x3f\xa4\x7c\x83\x9e\xea\xf9\x44\xe7\x83\xb0\x54\xd6\x58\x44\x2c\xfe\xa3\xd6\x26\xd6\x7e\x92\x32\x84\x1d\x7e\x78\xac\x09\xe2\xa0\x0e\x08\x77\x8f\x1a\x50\x44\x7e\xfb\x28\x93\x5f\x45\x92\xef\xcd\xdc\x2a\x59\xbc\xe9\xe9\x83\xf8\x3d\x5c\x59\x72\xea\xfb\xd1\xa4\x7b\x0f\xac\x2e\x88\x83\x5e\x53\xf5\x94\x79\xcd\xef\x14\xe8\x1b\x8b\x53\x66\xa1\xce\x9d\x2f\x9a\x84\xeb\x05\x37\x4c\x6f\x6a\xbb\x1d\x09\x54\x3a\x8b\x19\x7f\x7d\x0b\xbf\x9f\x03\x70\x50\x07\xa4\xaf\x39\x93\x56\xf9\xd5\xbc\x65\xb3\x2a\x42\x35\x1e\xd9\xcf\x46\xb7\x5c\x5d\x14\x51\x7c\x70\x97\x3f\x53\xad\xff\xf3\xfb\xdf\xf0\xfb\x4f\x10\x07\xfd\xbe\xc2\x3f\x0e\x19\x68\x9f\x04\xf5\xaa\xdf\x3f\xfe\x19\x10\x29\xa2\xb9\x22\x2a\xcc\x21\x87\xfb\x0b\x53\x00\x39\x7b\x39\x7b\xc2\x9f\x11\xe6\x00\x88\x83\x39\x20\x0e\xc8\x5f\x40\x9b\x9d\xf3\x1c\xe8\x1c\xfc\xd4\xf9\xe4\x45\xc6\x8a\xcc\x25\xbf\x2f\xd5\xbe\x2f\x69\x66\xf3\x5e\x4d\x13\x64\x50\x2e\x73\xcc\xd5\xfd\x6a\x27\x34\x85\x3f\x77\x03\xe2\xa0\x0e\xbc\xd3\x95\x0e\x9c\x6a\x4a\xd3\x4c\x50\xb0\x09\x44\xd8\xe0\x63\x1a\x8a\xb9\xdb\xee\xe1\x62\xc2\x98\x64\xec\x32\xd8\x76\x5c\xb9\x09\xab\x0b\xe2\xa0\xd7\x54\x1f\xc7\xa5\x97\x26\xca\x5e\x22\x9b\x7d\x3d\xf3\x85\x01\xad\x58\xd4\x9d\xd5\x43\x6b\x93\xd4\xbb\xb4\xf2\x68\x73\x2f\xeb\x35\xe1\xe7\xeb\x40\x1c\xd4\x81\x0a\x01\x9a\xf7\xc6\x0e\xed\xa5\xd3\xd4\xa9\x34\xac\xb4\xdc\xba\x39\x61\x5b\xd1\xd1\x77\xa8\xcd\x58\x98\xe3\xf7\xed\xee\x05\x20\xc0\xea\x82\x38\xe8\xf7\xe5\xec\xf3\x16\xfd\x46\x23\x87\x31\x2d\x92\x5c\x94\xc3\x5e\xa6\xa4\xfc\xbd\xd1\x47\x9a\xb1\xa3\xcf\x30\x2c\x04\xbb\x2a\x85\x8c\x0a\xe6\x00\x88\x83\xcf\x03\x80\xfc\x05\xb4\xf3\x3c\xcf\x01\x09\x14\x62\xa2\xa8\x36\xe7\xf4\x61\x23\xa3\xe4\xad\xd2\xdb\x8f\x38\x29\x2d\x52\xd4\x58\xc5\xdf\xb8\x4e\xce\x26\x95\xf9\xb4\xb3\xc1\xb3\x32\x00\x07\x75\xa0\xc0\xab\x64\x37\x63\x53\x6c\x58\x22\xb0\xb3\x84\x38\x77\xb6\xd9\x4c\xfb\xba\x8e\x03\x6d\x13\xa9\x4a\x2b\x0e\xed\x9b\x8c\xf1\x71\x58\x5d\x10\x07\xbd\xa6\x1a\x7a\x6b\x14\x5e\x2e\xa1\xec\x57\xe7\x6f\x29\xca\xbb\xfc\xce\x4b\x5d\x49\x4b\xc5\x75\x19\xd3\x92\x7a\x65\x6b\xdc\xd2\xfc\xc5\x0d\x56\x17\xc4\x41\x1d\xa0\xeb\xd3\xfb\x5e\x41\x40\xcc\x40\x35\xe5\x1e\x96\x4f\x7e\x29\xf8\xb5\xd3\xaf\x69\xfa\x78\x9d\xac\xb9\x4f\x53\xaa\xb3\x5e\x0b\xf0\x1c\x16\xc4\x41\xbf\x6f\x36\x69\x92\x26\xfd\x40\xbf\xd9\x0f\x4d\x3a\x5e\x96\x2a\xa2\x9b\x7d\xd8\x36\xcf\xa4\x95\x73\x59\x29\x98\x2d\xc5\x5e\xee\xa9\x4d\xc0\x1c\x00\x71\xf0\x79\x00\x90\xbf\x80\xee\xdd\xcf\xcf\x5f\xa2\xfd\x51\xe9\x94\x7e\x8d\xfa\xdd\x3a\x21\xd8\xa4\x23\xf0\x9c\x74\x5c\x17\x69\x08\x70\x77\x68\xda\x27\x90\xe5\xf1\x90\x57\x40\x87\x65\x19\x20\xee\x6c\xfe\xa2\xa9\x63\xe0\xf3\xd5\x61\x2a\x35\x60\x1f\x37\xa5\x85\xab\x00\x4f\x57\xa6\x60\xb9\xec\x59\x09\x1e\x2a\xaa\x86\x20\x51\x19\x5a\x02\x3c\xd9\x01\x70\x67\xf3\x97\xc2\x03\xf6\xd5\x2b\xbf\x0c\xbe\x70\x86\x56\xab\x62\x33\x4c\xf7\x23\x62\x1b\x3e\xcd\xd7\x8c\xbc\x81\x8d\x55\x2b\x67\x51\xb0\x47\x00\xab\x0c\xe2\xfc\xa5\xa9\x20\x57\x43\x29\x09\x77\x2b\x5b\xf5\x72\xf3\x35\x9e\x2f\x82\x7c\xe9\x6a\x93\x74\xe1\xf5\x53\x9f\xa7\xc8\x4b\x7f\xbf\xc7\xb8\x19\xcc\x51\xfc\x10\x9e\xbf\x80\xda\xab\x9d\xce\x5f\x18\xde\x6b\xa5\x5c\x5a\xe8\x5a\xc8\xe3\xf8\x9c\xa3\x13\x91\x73\x77\x6e\xc0\x54\xbb\xba\xe6\x72\x7a\xd6\x7e\xe4\x06\x35\x1d\xe7\xe9\xa7\x31\xe2\x83\xaf\xa1\xb2\xfc\x51\xa6\x5f\x34\x7f\x47\x3d\x96\xb4\xff\x71\xf6\xe6\x53\x0b\x8c\xe5\xb0\x81\xf2\xf2\x08\xf5\xdd\x36\x83\x8c\xff\xb6\xfc\x05\x34\xb4\x53\xf9\x0b\x3e\x11\xe4\x6e\xf9\xde\xb6\xf0\x65\x97\x74\xce\x06\x96\x4c\x95\x5f\x55\x98\x69\xdb\x2b\x1a\x65\x6f\xe4\xa2\x8e\x4c\xc8\x79\x95\xbe\xe9\xbc\xfe\xa6\x7b\x11\xf9\x8b\xcf\x99\xfc\x85\x6a\xda\xfd\x50\xee\xfa\x01\x81\xce\x34\x7f\x07\xae\x7d\xf4\x2f\xc7\xa8\xea\x98\x99\xb5\x3b\xeb\xfb\x37\x97\x82\x34\x2c\x13\x5d\x2f\xe4\x68\x86\xe0\xd9\x86\x28\x82\x46\xcf\x07\xb5\xcd\x9e\xf6\x8a\x2f\xbc\x65\x62\x4f\xd3\xe5\x2f\x4b\x4f\x92\xae\xad\x8d\x7c\x6f\x12\x12\xf9\xba\x51\xf5\x62\x0e\xa2\x9c\xcd\x5f\x92\xdb\x65\x90\x8b\xef\xdf\x3b\x9c\x7e\x6a\xbc\x5c\x4e\x23\xa9\x22\xf5\xdc\x59\x4c\x3b\xd9\xf7\x92\x15\xc5\xd3\xb8\xa3\x47\xf8\x21\x17\x32\x5a\xa3\x33\x1f\x1b\x2f\xec\x7f\x15\xef\x75\xce\x70\x40\x5d\x6b\x27\xcf\xc7\x46\x52\x74\x6b\x6d\xe9\xc4\x89\xa0\xbe\xd4\x09\xa5\xac\x63\x8c\xc0\xb4\x0b\x19\xed\xd9\xfc\xc5\x75\xa6\x7e\x0b\xbd\x7d\x09\xf7\x80\x45\x78\xbd\x84\x8b\x74\xb7\xa1\xeb\x30\x2b\x8a\x5c\x7d\x85\x46\x22\x4c\xc7\x50\x68\xe3\xf5\x85\xe5\x2f\x20\x75\xcf\x5b\x6e\x7b\x50\xd1\x10\x3c\xdd\xd9\xb8\x66\xf0\x8e\xf1\xae\x58\x39\xa1\x58\x63\x1e\x2c\x89\xfc\x89\x8d\xeb\x93\x69\xe2\x1e\x0e\xaa\x46\x87\x77\xe9\x00\x70\xd0\xe5\x36\xab\x95\x12\xa7\xc6\xfb\xe0\x3e\x7f\x96\xfd\x74\x78\x05\x85\x87\x23\xe3\xb7\xfe\xf8\xcf\x97\xe2\xbc\xf5\xd1\x7e\x14\xa8\xa3\xdb\xc2\x4f\x29\x00\x38\xe8\xf2\x95\xc8\xa4\xf3\x89\xb8\xb7\xa9\x5f\xea\x0f\xe7\x2c\x52\xc6\xc4\x77\xa1\xee\x11\xde\x5f\x9b\x75\x4c\xdd\xfe\xe4\x35\xad\xde\xf3\xf0\x2d\x17\x88\x3b\xf3\xf4\x49\x73\x30\xd5\x4f\x05\x66\x65\x0c\x12\x75\x59\x4a\x7b\x22\x4b\x1f\x95\x35\x33\x83\x50\x6c\xcf\xe7\xf7\x03\x3d\xfa\xbe\x94\xc1\x1f\x25\x07\x71\xfe\x92\x08\x54\xa7\xeb\xae\xec\x5e\xfb\x7e\x27\x34\x3e\x41\x67\x0b\xef\xeb\x1d\x82\x36\x54\x8b\x21\x2e\x29\xc5\x3a\x73\xee\x16\xd2\x87\x5b\x6d\x9e\x37\xd2\x61\xf9\x0b\x88\xfb\xf7\xe3\xbe\xff\x33\x5f\xfd\x65\xc3\x05\x9a\x46\xce\x33\xe0\x79\xd3\x97\x60\x04\xbf\x51\xcd\xa6\x74\x24\xc3\xcb\xb8\xd6\x88\x22\x6a\xc2\x2d\x89\x1a\x7d\xc6\xa3\x7d\x77\xfa\xf9\x65\x24\x3b\x61\x23\x07\x71\x50\x03\x72\x65\x82\xbf\x21\xcc\x68\x30\x99\xf5\x2c\xa9\x77\x61\x73\x78\x69\x78\xc8\x4e\x9f\xe8\xdf\x7a\x2c\x60\x4f\xba\x82\x4c\x8c\x03\x7f\x02\x0d\xc4\x41\x0d\xd8\xf3\xf0\x6d\x20\x49\x7d\xa3\x60\xe4\xcf\xa5\xa4\x47\xd1\x1c\xc8\x5e\xfe\x6d\x7c\xa7\xfa\x32\xc5\x65\x47\x7c\x43\xb1\xa0\x30\x24\x58\x5d\x10\x07\x35\xc0\x84\x31\x87\x0b\xbb\x68\xcd\xf6\x1b\x76\xc7\xdb\xe9\x3b\x55\x46\x9d\x83\x0d\xca\x41\x46\x35\x95\x2b\x83\x7b\x68\xe8\xdf\xc8\x8f\x60\x75\x41\x1c\xd4\x00\xea\x54\xd9\x34\xc1\xc1\xde\x0f\x83\x0f\xbd\xdd\x82\x7b\x28\xf1\xe8\xc4\x05\x88\xa5\x09\xd9\x09\x6f\x98\x4f\xe1\xe3\xbd\xca\x45\x87\xe5\x2f\x20\x0e\xde\xff\xe5\xef\xf9\x0b\x68\x4a\x3f\x4f\x01\xf2\x09\xdf\xc7\x92\x4e\x3d\x9d\x8f\x0e\xd0\x75\x0b\xa4\x9d\x22\x3f\x29\x20\x13\xea\x7b\xab\xc4\xff\x5c\x22\x6f\xb4\xb9\xea\x0b\x3f\x54\x06\xe2\xa0\x0a\x4c\xc6\x55\xb5\x20\xb0\x7f\xaa\xdb\xf3\xc1\xda\x35\xe5\x59\xb3\x27\x7d\x2d\xf9\x8b\x90\xe2\x8a\x7e\x01\x59\x08\x99\xc8\xab\xa8\x41\x78\x54\x06\xe0\xa0\x0a\x30\xa4\xbb\x33\xd8\x7f\xb6\xa2\xe9\xc8\x79\x13\xa3\xfa\x9c\xcc\xb6\xb5\xa6\x72\x0a\xf1\xf3\x97\xaa\xfc\x93\xaa\xec\xdf\xf4\x4e\x16\xb0\xba\x20\x0e\xaa\x40\xf2\x01\x83\x7e\xb5\xd7\xdc\x55\xeb\x7b\x27\xd7\x1e\xb6\x3e\xba\xd3\x5a\x2f\x82\xeb\xf8\xf2\x68\x5b\xd6\xec\xe7\x4b\x34\x3f\x3f\xf8\x91\x2d\x10\x07\x55\x20\x2f\x71\xd2\x8f\xfa\xe0\x73\xc6\xb7\x93\x2f\xcd\xda\x8c\x1c\x04\x0f\x0c\x82\x25\xf1\xf7\x42\xe5\x4a\x53\xe7\x25\x30\x74\x5a\xba\x61\x7b\x6e\x10\x07\xef\xfb\x20\xf8\xf7\xfb\x2e\xd0\xfa\x7a\x9e\x03\x64\x9b\x07\x52\x43\x85\x92\x09\xf6\x1d\x9a\xd6\x6b\xfc\x0c\x2a\x08\x5a\x1c\xbe\xb9\x83\x38\x1f\xcd\x53\x25\xda\xb5\x9e\x22\xce\xc2\x9f\x15\x03\x70\x50\x07\x5e\xa2\x7b\x95\xca\x20\xd6\xed\x47\x2d\x67\xf6\xc6\x10\x5a\x2b\x14\x1c\xde\xf3\x4b\xaa\xd1\x9b\x2c\x35\xec\xb8\xf5\x20\xe4\x15\x2b\xac\x2e\x88\x3b\x93\xc1\xed\xff\xc2\x63\x11\xc0\xa6\x74\x1e\x17\x15\xf3\x27\xc9\x29\xc3\xfd\xa2\xa0\xf6\x76\x68\xde\x80\xdc\xe0\x46\xe9\x88\x71\x92\x2f\x3c\x83\x03\x70\x67\x32\x38\x24\x66\x1d\x97\xdc\x71\x55\x43\x8a\xad\xfd\x04\x3f\x4c\x0f\xcd\xa2\xe8\x38\xd5\x1b\xc3\x8a\x82\x34\xf9\x76\x59\x36\x9e\xf0\xb3\x60\x20\x0e\xea\xc0\xa2\xaf\x82\x5f\x76\xdc\x84\x52\x4f\xbb\xc6\xeb\x80\x0c\xb4\x96\x64\xff\x82\x17\x72\x0b\x9a\xcc\xab\x3a\x15\x1b\x31\xad\x91\x8d\x30\x07\x40\x1c\xbc\xef\x03\x20\x7f\x01\x6d\x76\xce\x73\xc0\xcd\x58\x43\xf7\xb9\xa2\x48\xf4\xdb\x0a\xbc\x1a\x51\xeb\x3c\x4c\xc1\x4f\x1d\x46\xda\xe5\xb5\x91\xa9\x58\xe4\x9f\x84\x90\x6e\xc1\x97\x02\x10\x07\x75\x60\xae\xce\x5f\xa0\x74\xd9\xfb\xd1\xe1\xf5\x6e\xf4\x17\x71\x57\x66\x73\xc8\x3e\x8d\x75\x7b\x34\x7d\x09\xee\x16\xa9\x94\xbe\xae\x08\xef\xfd\x01\xe2\xa0\x0e\x5c\xb5\x14\x6f\xda\x37\x53\xf8\xf2\xf5\x99\x82\x98\x59\x8a\x17\xd6\xbc\x1c\x52\x29\x55\x65\x40\x8c\x88\x7c\x15\x61\x7d\x07\x35\x11\xac\x2e\x88\x83\x3a\x10\x70\xdd\x1f\x91\x77\x5d\x97\xda\xd0\x1d\x09\x79\xab\x64\xda\x6a\xf2\xbe\x75\x32\xcb\x94\x66\x7d\xcc\xef\x6f\x1f\x2c\xcb\x9c\xe1\xe7\xf6\x40\x1c\xd4\x01\xf2\xc0\x4e\x0c\xee\xa7\x54\xb8\x02\x0a\xbd\xd1\xd5\xe9\x69\xb1\x49\xea\x4d\xe4\x06\x12\x44\xad\x68\xdc\x4c\xd7\xb6\xfb\x62\x94\x61\x0e\x80\x38\xf8\x3c\x60\xf4\x77\x07\x40\x3b\xcf\x73\x1f\x47\xa6\xac\xf1\x5f\xc2\x2b\xf2\xb4\xa6\x6b\xd9\x40\x7f\xbb\xf1\xa4\xef\x5e\x92\x7e\x4d\x5b\xbf\x2f\x9a\x61\x2a\x56\xe0\x4f\x52\xf8\xb9\x0f\x10\x77\x26\x8b\x27\x5c\x73\xb3\x64\x48\x70\x3e\xdc\x72\x28\x5d\xba\x3c\x9d\x49\x2d\xcc\x5b\xc0\x16\x5e\x2f\xab\x4c\x19\x12\x4f\xf2\x1d\x0f\x9e\xc1\x81\x38\xa8\x03\xd3\x7c\x45\xf3\x93\x1b\x4d\xfb\x83\x9a\x63\xd4\x09\x8b\x74\xb5\x44\x7d\x5f\xb4\xa2\x2b\x9b\xd1\x95\x0a\xa7\x0a\xac\xe2\xfa\x0b\xe0\x67\x2c\x01\x1c\xd4\x81\x13\xb3\x5b\x05\xcf\x28\x0e\xf7\xe8\x76\xb3\x4c\xcd\xd7\x43\x8d\xc5\x90\x48\x26\xe9\x2d\x75\xcb\x06\xda\x35\x15\x74\xa5\xdf\xa5\xc3\xea\x82\x38\xa8\x03\x65\x28\xe5\x37\x34\x99\x09\x09\x59\x45\x54\x7d\x64\x7f\xfe\xb8\xd5\xa9\xd8\x2d\x30\xa8\xd7\x4f\xf7\x3b\xd4\x58\xf9\xa9\x4f\x98\x1b\xcc\x01\x10\x07\x9f\x07\x00\xf9\x0b\xe8\xde\xfd\xfc\xfc\xa5\x82\xf3\xc0\xf6\xc7\x4b\x39\xd7\x2c\xf4\xb2\x89\x55\xa6\xc4\xad\x66\xa5\x66\x9d\x1d\x7e\xb6\x64\x65\x87\xca\x87\xc7\xa8\xc7\x83\xb0\x2c\x03\xc4\x9d\xcd\x5f\xae\x96\x5c\x6d\x64\x2c\x78\xae\xe6\x29\xf1\xd9\xb7\xa1\x2b\xc3\x73\x77\xc8\xaa\xd4\x57\xb0\xc3\x9c\x98\x27\xa7\xbd\x65\x00\x19\x03\x56\x19\xc4\x9d\xcd\x5f\x24\x43\xb8\xa8\x8f\x0e\x9e\x19\xb4\xa2\x3e\xb3\x9b\xf4\xc8\x46\x1d\x8a\x08\x5a\xec\x1c\xbe\x5e\xdd\x52\x19\x87\xfa\xf9\x37\xf6\x7b\x58\x65\x10\xe7\x2f\x2d\x0e\xb9\x1a\x18\x49\xb8\x2f\x71\xe2\x1e\x98\xa0\x6a\x0b\x35\x88\x92\x28\x3e\xd9\x78\xf1\xe0\xb5\x8d\x3b\x3f\xc3\xc7\x97\x3a\xee\x28\x22\xe9\xd5\xf0\xfc\x05\xd4\xb3\xfe\x74\xfe\xb2\x87\x51\x63\x39\xfe\x11\x5f\x52\xf5\x24\xed\xdd\xe3\x3c\xc2\xb1\xcd\xa3\xea\x3b\x91\xb5\x87\xc2\x0f\xf4\xf3\xa2\x09\x7f\x1c\x6e\x9e\x5e\xeb\xe6\xd9\xef\x32\x0f\x5a\x1c\x6b\x66\xfc\xc1\x61\x63\xdb\xff\x92\xb3\xf2\x27\x03\x7d\x77\x32\x40\x9c\xe6\x67\x56\x20\xce\xed\xb0\xff\xb6\xfc\x05\x34\xb4\xd3\xfd\x5f\xa0\xf9\x4b\xea\x07\xfb\x30\x59\x1c\xbc\x0a\xe4\x5d\x27\x6f\xda\x6c\xe2\x63\x43\x06\x97\xc9\x74\xdc\x0f\xcf\x48\xf3\x39\xee\xdf\x92\xdf\xc9\xb8\x88\xfc\xa5\xe5\x4c\xfe\xe2\x9b\xd4\x9a\xb7\x14\x12\xf4\xd1\xff\x0f\xef\x1b\x5f\x76\x36\xd3\x26\x57\x1e\x76\x39\x69\xb7\xfe\xdc\xdf\x3b\x84\xab\x02\xe6\x25\x17\x72\x34\xe3\x6c\xfe\x42\x98\xb1\xbe\xc7\xb9\x10\x94\x58\xca\xfd\xb3\x03\x9f\xd2\xd1\xd0\x07\x97\x18\x41\xc4\x34\x47\x88\x7f\x22\xaa\xc6\x9f\x89\x24\xe9\x42\x0e\xa2\x9c\xcd\x5f\xb0\x4a\x5f\xcf\x87\xe8\x28\xb4\x51\x24\xb3\x93\x87\xdc\x93\x64\xd9\x1c\xe4\xc3\x6e\x6f\x94\xf1\x21\x96\xd5\x33\xb3\x7b\xbd\xe5\x72\x21\xa3\x3d\x9b\xbf\x0c\x1e\xde\xf3\x7b\x85\x62\x61\xe7\xcd\xb0\xf5\xa1\x93\xf7\x71\xd7\x2b\x04\xd4\xe2\xea\xa9\x07\xd3\x6d\xc1\x31\xb5\x98\x21\x0e\xe1\x17\x32\xda\xb3\xf9\xcb\x23\xd1\xbb\x4a\xa4\x46\x0f\x36\x28\x1e\xf1\x26\x96\x9a\xb0\xc7\xfc\x61\x40\x8f\x49\x88\x53\x12\xff\xe9\xca\x3a\x5e\xaf\x7e\xa9\xfd\xc2\xf2\x17\x90\xba\xe7\x2d\xb7\x8e\xd7\xdb\x9f\xb0\x38\xe9\x88\x19\x2b\x9a\x71\x3d\x79\x2a\xe4\x82\xab\xf6\xda\xe7\x70\xe0\x83\x4a\x67\x62\xa8\xcb\xb8\xb0\x34\xfc\x31\x7a\x10\x77\xa6\x8d\x21\x62\xeb\x2c\xd2\x2e\xee\x13\xc5\x43\x41\x6c\xff\x15\x81\x2c\xea\x11\xb7\xba\x86\x1c\x2e\xf2\xc9\xc7\xee\xd9\xe8\x02\xfa\x2b\xf0\x36\x86\x00\x0e\xba\xdc\xa6\x8d\x0a\xd1\x9e\x90\x3d\x98\x9d\x18\xf6\xf9\x16\xad\x25\xd2\x9f\x49\x87\xb3\x21\xad\x34\xd7\xa8\x57\x37\x92\xcf\x55\x4f\x0b\x6f\x55\x01\xe2\xfc\x25\x11\x90\x4e\xd7\xc5\x25\x1d\x33\x95\xf8\xc3\x32\xbb\xad\x4a\xe1\xc9\xaa\xc0\xcf\x2b\x82\x95\xea\x12\x56\x55\x64\xd5\xc4\x1a\x42\x57\x95\x2c\x47\xfd\x7f\x5a\xf9\xfd\x9d\x83\x5e\x5f\xa9\x25\x92\x6b\x73\x5e\x8e\x3a\x52\xb4\xbd\xd8\xf7\xd1\x93\x83\x64\x6e\x9a\xf9\x56\x7d\x97\xde\xe9\x60\x38\xa0\xf9\xe8\xcc\x15\x0e\xcb\x5f\x40\x1c\xbc\xff\xcb\x5f\xf3\x17\xd0\x34\x72\x9e\x01\xce\x69\xc2\x64\x8b\x57\xe2\x17\xd4\x1b\x88\xb9\xc6\x3f\xfa\xbb\x4a\xb3\x8e\x60\x2d\x21\x79\xc9\xcf\x0c\x3e\x5f\xa7\xa3\x8d\x8a\x80\x8d\x1c\xc4\x41\x0d\xf0\x30\x64\x64\x20\x0c\xc0\xbe\xbe\xfc\x2e\x9a\x59\x98\x56\xd6\xfc\xb2\xbc\xd0\x66\xcd\xb2\x8e\xdf\x42\xd3\xb7\x30\x1d\xc7\x0c\x78\x02\x07\xe2\xce\x6c\xb8\x18\x44\x1a\xa2\x63\xd6\xfb\xc6\x2b\xee\x7d\xcc\x09\xc4\xb3\x90\xbf\xdf\x13\xed\x61\xa4\xba\x96\x9b\xfc\x27\x7e\xfc\xd1\x80\x31\x7c\xc3\x05\xe0\xa0\x06\x30\x18\x56\xd1\x44\xa3\xa4\xa6\x3e\x57\xfd\xf2\x90\xbe\xe5\xf0\x5d\x6c\xad\xc1\x1a\xdb\x04\xa6\xd1\x91\xb4\x24\xe5\xc0\x41\x07\xfc\x81\x6f\x10\x07\xbd\xbe\xb8\x25\x2e\xc7\x2a\x97\x23\xe7\xa2\x3e\x3d\x0c\xb9\x5e\xc9\x6a\x22\x1e\x7d\xfb\xae\xb5\xe9\x5b\x7c\x0c\xda\x5f\xec\xfb\x01\x64\x9a\xb0\xfc\x05\xc4\xc1\xfb\xbf\xfc\x3d\x7f\x01\x4d\xe9\xe7\x29\xb0\x73\x87\xf0\xa3\xb5\xd9\x83\x1b\x2b\x97\x1c\xbe\xdd\xae\xc5\xa0\xfa\x44\x20\x89\xd4\x18\x9b\x6a\xf9\x21\xcd\xfe\x63\xfe\xb6\x7b\x21\xfc\x9e\x13\xc0\x41\x15\x20\x29\x91\x33\x6f\x59\x15\x64\x6c\x35\x21\x61\x7c\x44\xee\xc7\x10\x9a\x3c\x22\x8b\x73\xbd\x79\x27\x86\xd6\xe2\xe8\x6b\x75\x9b\x11\xac\x2e\x88\x83\x2a\x20\xe3\x65\x4e\xf5\x9c\x5d\x57\xbf\xbf\x2c\x28\xf8\x83\xb8\x81\x33\x69\x4c\xf2\x7c\x53\x9e\x89\x5b\x07\x81\x11\x91\x05\x32\x8a\x27\xac\x2e\x88\x83\x2a\xd0\xc8\xc8\xc5\x92\x47\x93\x79\x93\xaf\x9f\x72\x2a\x43\x66\x70\x6d\x5d\x41\x93\xe9\x88\xc0\x79\x88\x7a\x5f\xcd\x66\x48\xe8\x16\x7c\x12\x00\x71\xd0\xeb\x7b\xad\xd4\x3d\x8f\x0c\x89\x1a\xd3\x95\x04\x8d\x20\x03\xf7\xe3\x34\xfb\x43\x57\xcf\xed\xa5\x39\xaf\x2c\xa4\xde\x20\xe6\x0d\x0a\x73\xd8\x9e\x1b\xc4\xc1\xfb\x3e\x00\xf2\x17\xd0\xfa\x7a\x9e\x03\x98\x1d\xd8\x71\x9d\x47\x7c\xa9\x92\xe2\x7a\xb6\x77\x13\xf4\x86\x91\xc5\x02\xb6\x5a\x0a\x48\xbe\xed\x8b\xd1\xfb\x6b\xe5\x5c\x86\x2f\x04\x20\xee\x4c\xef\x0f\xb3\x78\x6d\xd4\x2f\x94\x27\xa4\x95\xd7\x50\xa5\x35\x7f\xfa\x93\xf5\x11\x91\xb5\x2e\x4c\xfd\x2e\xf4\x10\x48\x88\x2c\x45\x87\xb7\x81\x02\x71\x50\x07\x94\xd3\x67\x45\xba\x30\x72\x6b\x24\x0a\xac\x7f\x18\xa6\xfc\x62\x25\xaa\x26\x48\x2e\x14\xf6\x4b\xc4\xee\xfc\x68\x82\xbf\x67\xad\x06\xab\x0b\xe2\xa0\x0e\x04\x70\x62\x6b\x3d\x78\x98\xe0\x25\x73\xcf\xa7\x27\x72\x1f\xa1\x52\x41\xe1\xeb\xcf\xd1\x87\x33\xc5\x2e\x43\x04\x58\x12\x2d\xf1\xf0\xfc\x05\xc4\x41\xaf\xef\x1f\x8a\xe7\x53\x78\xfa\xdf\x08\x13\x3a\xb1\xcc\xe7\xdb\x8d\x0d\x06\xde\x44\xf0\x64\x8b\xd9\xba\x3a\x93\xbe\xcf\xe5\xad\x61\x6f\x82\x39\x00\xe2\xe0\x7d\x1f\x00\xf9\x0b\x68\xb3\x73\x9e\x03\x63\x09\x05\xf7\xa5\x93\x26\x7b\x7b\x70\x6f\xa1\x6f\x24\x0a\x78\xbc\x4b\xbd\xbe\x7a\x88\x7e\x25\xd1\xc9\x3f\xad\xb1\x4f\xe8\xbd\x2e\x6c\xec\x20\x0e\xea\xc0\x61\x45\xcb\x2b\x0f\x63\x12\xa6\xf7\xec\x18\x05\xe9\xc4\xce\xf4\x4b\x1e\xcb\xd4\x39\x02\x36\x3e\x83\xda\x0f\x3f\x2f\x14\xcc\x2a\xc1\xea\x82\x38\xa8\x03\x85\x45\xf9\xad\x0f\x9d\x37\x94\xef\x6b\xcf\x4c\x1c\x5b\xdf\xdd\x5b\x0b\x56\x49\xf5\xfa\x5c\x51\x75\xf3\xa6\xd7\x2f\x4f\xd5\xdf\xf0\xe7\x05\x41\x1c\xd4\x01\x3c\xb5\x6d\x41\xa6\x00\xe1\xda\x37\xfb\x12\x64\xb2\x87\x2a\x14\x41\x6f\xb3\x9a\x7f\x3d\xff\x84\x27\xb7\xa5\xb6\x6c\xb9\xf0\x25\x19\x56\x17\xc4\x41\xaf\x6f\x82\x39\x25\x6a\xbb\x5f\x66\xeb\xf4\x5e\x77\xbe\xb0\x53\x80\x89\x43\x8d\x41\xd2\xfa\x0b\xbf\xbe\x65\x81\x83\x9a\x4b\x9c\xfc\x84\x30\x07\x40\x1c\x7c\x1e\x00\xe4\x2f\xa0\x9d\xe7\xb9\x3d\x80\xc6\x7a\xd2\x5a\x66\x37\xde\x2d\x0e\x94\xd3\xda\xa2\x23\xb9\xff\xc9\xc3\xea\x69\x44\x91\x62\xa6\xca\x29\xdb\x47\xc1\x0b\x7d\x08\x3f\x53\x04\xe0\xce\xf4\x62\xff\xf0\x74\xee\x36\x9b\xb0\xc6\xfb\xbd\xbe\xcc\x30\x41\xc3\xc5\xf7\xcf\xa5\xb8\x58\xd3\xf2\x89\x24\x6b\x3e\x86\xc6\x53\x97\xc1\xcf\x2c\x82\x38\xa8\x03\x66\x99\x6f\x6e\xd3\xb2\x6a\x76\x5c\xe7\xa9\x2c\xb6\xf8\x65\x16\x21\x18\xd5\xbf\xfb\xfe\x9a\xdd\xb7\xcd\x87\xfd\xfd\x5c\x72\xc2\xcf\xe1\x7d\x7d\x01\x1c\xd4\x81\x5a\x44\xc2\xcc\x0d\xf9\x67\xc9\x99\xbe\xec\x3e\x52\x47\xb6\x51\xaa\x59\x9a\x4a\xb9\x65\xd6\x0b\x5b\xaa\x82\x16\xfe\x33\xc7\xf0\x3f\xf4\x81\x38\xe8\xf5\xad\xd5\x56\xf9\x5a\x60\x4f\x5b\x95\x99\xda\xad\x3b\xf7\x41\xb0\x81\x80\x85\x72\xc0\xca\x5a\x64\xe0\xb7\x19\xd9\x4c\x7f\xea\xb3\x9f\x30\x07\x40\x1c\x7c\x1e\x00\xe4\x2f\xa0\x7b\xf7\xf3\xf3\x17\x36\x04\xb2\xa1\x5b\x21\x7d\xe2\x5c\x8f\xdc\x8b\xe6\x58\x97\x96\xcd\x50\xe4\x05\xe9\x3b\xed\xbe\xac\x0c\xf8\xab\x4a\x2b\x46\x23\xc0\xb2\x0c\x10\x77\x36\x7f\x21\x17\x25\xda\x7a\x10\xd7\xbf\xf8\x89\x59\xae\xed\xd6\xab\x32\x7d\x07\x36\x31\x9e\xeb\xb7\xd5\xfc\xfb\x1f\x5c\xcf\x99\xa6\x5a\x97\x82\x55\x06\x71\x67\xf3\x97\xca\x3f\x2b\x49\x43\x08\xbc\x68\xd6\x3a\x5d\xae\xfe\x48\x3c\x7a\xaf\x2a\x1b\xd1\x3f\x56\x31\x30\x35\x66\x59\xb8\x5f\xb2\xa3\xd0\x86\x55\x06\x71\xfe\xd2\x08\x88\xff\x59\x79\x8c\x7a\x82\x25\x3e\x11\x47\x15\x89\xdd\x02\x69\xd1\xbe\xa4\x56\xf1\x8d\xfd\x37\x9d\xab\x27\x6e\x5b\xaf\xf2\x7e\xa0\xd4\x36\xed\xc1\xf3\x17\xd0\x8b\x00\x4f\xe7\x2f\x9b\x06\x98\x2e\x41\x02\x6a\x89\x94\xbf\x6b\xae\x4c\x66\x84\xe5\x16\x96\xbd\x4c\x53\x5d\xd4\xa4\x41\x30\xcf\xd8\x48\x0b\x35\x3b\xfd\xca\x3c\x4f\x0a\xcc\x2d\x32\x37\x4c\x26\xeb\x07\xbe\x3e\x16\xaf\x6f\xdc\xf7\xf3\x7c\x2f\xce\x1f\xa6\x21\x81\x78\xb5\xcb\x93\x2a\x2b\xcc\xe2\xbf\x2d\x7f\x01\x0d\xed\x74\xff\x17\x68\xfe\x82\xc3\xf8\xfc\xea\xdb\x81\xf8\xdc\x15\x9e\xeb\x4d\xc7\x3f\x26\x28\xf3\x9a\xa6\xa7\x34\x6e\x39\xe1\xe3\x8a\xc6\x0e\x7e\x63\x77\xc5\xbc\x88\xfc\x05\x41\x09\x7a\x8f\x9e\x81\xea\xcd\x1f\xae\x59\x82\xe6\xc0\x46\x4b\xce\x96\x3f\x54\xff\xad\x3f\xa5\xeb\x09\x46\x42\xce\x61\x82\x16\xc1\xe2\x1d\xbb\xe3\x0b\x39\x9a\x71\x36\x7f\xa1\x8b\xf4\x78\xde\x1b\xbd\x3d\xf6\x22\x11\xc1\x69\xe3\x76\xac\xa4\x8a\x85\xa3\x79\x6d\x55\x30\xc2\xa7\x9e\xd9\x27\xa2\xa2\xb4\xa9\x17\x72\x10\x45\xe3\xcc\xc7\xba\x6b\xd7\x32\x95\x6b\x7f\x38\xd9\xbf\x22\xcc\x37\x73\x7c\xd0\xc2\x5e\x68\xcc\xce\xbc\x3f\xf3\xb2\x45\x23\x52\xb7\x85\xf7\x0f\xdd\x85\x8c\xf6\x6c\xfe\x72\x19\x63\x3f\x89\xd1\x41\x74\x74\x81\x4c\x4c\xce\x23\x57\x36\xf0\x32\xe5\x9a\x25\x63\xcc\x24\x3d\xa6\x7c\xfc\x51\xb5\xf7\x43\xfe\x0b\x19\xad\xe7\x99\x8f\x35\x66\x0d\xb9\xb4\xce\x56\x4c\x41\x92\x3e\x47\x42\x7b\xbd\xae\x84\xc3\xc6\x29\x12\x01\xb7\x91\xe8\x61\x8d\x7d\xa3\xaf\x3a\x2d\xe5\x85\xe5\x2f\x20\x75\xcf\x5b\x6e\xd7\xf7\x3c\x53\x31\x57\x99\x14\x3f\xbf\x8d\x15\x64\x4a\xd0\x73\x7c\xc6\xc1\x3b\xb0\xdd\xc7\x69\xc2\x43\x44\x84\xec\xf8\x6b\x0b\x7e\x4a\x01\xc4\x41\x97\xdb\x58\xab\x70\x2f\x93\x2b\x1f\x6b\x96\x04\x3c\xfa\x7f\x46\xec\x7b\xdb\x2b\xc5\x7c\xf8\xf8\x73\x66\xff\x56\x15\x56\x99\xb0\xcc\xe7\x06\xf8\x63\xf4\x00\x0e\xba\xdc\xe6\x11\xe4\x71\x1b\xac\x08\x5e\xa9\x88\x32\xa5\x48\x0e\xee\x4a\x33\xe0\x73\x26\x0e\xd2\xcb\xd4\xce\xc3\xad\xa2\xbf\xab\x8a\xd9\x06\x5f\xc6\x01\x1c\x74\xb9\xcd\x5e\x66\x4e\x14\x47\x23\xba\x29\xbe\x80\xb5\xfe\xb8\x42\x42\xb3\x64\x95\x36\x24\xb9\x0d\xd1\x1d\x83\x86\xa9\x33\x53\x3f\xcc\x1f\x56\x17\xc4\xf9\x4b\x52\xfd\xc7\x75\xf8\x80\xa8\xd1\xb8\x26\x16\x94\x9f\x82\x7a\xb3\x7c\xad\x3b\x91\xf1\xf2\xcb\xf4\x6d\x8c\xdf\x34\x03\x6f\x0c\x4a\x98\x5f\x18\x3f\xca\x87\xe5\x2f\x20\x0e\xde\xff\xe5\xaf\xf9\x0b\x68\x1a\x39\xcf\x80\x82\x45\x1d\xc3\xd5\xf0\xc6\x50\x9b\xda\x6c\xc2\x1a\xcb\x2a\xda\x30\x8e\xb0\x00\x7f\x56\xd3\xad\x5c\xaf\xdb\xeb\x9b\xa9\x3f\x6a\xe0\x07\x83\x01\x1c\xd4\x80\x15\x0e\x71\xae\x36\x25\xe5\x17\xb1\x2c\x66\xeb\x4c\x99\xe9\xb9\x3d\x1f\xb8\x5c\x1d\x13\x76\x0f\xf3\x35\x39\xec\xe8\xde\xdd\x12\x85\xd5\x05\x71\x50\x03\xc2\xe3\xb5\x9e\x05\x0a\x7b\x54\xec\x4e\x66\xcb\x2e\xa4\xd8\x64\xd6\x0d\xdd\x13\xde\x8d\x36\x33\x9e\xd5\xf2\x18\xcb\xf5\x3f\x31\x80\x37\x08\x04\x70\x50\x03\xc2\xd8\xf6\x1e\xfd\x7e\x80\xd4\x69\x8e\x55\xd5\x1b\x71\x49\x42\x13\x2d\xd4\x62\xe5\x67\x34\xc7\x94\x77\x7b\xc0\x12\x53\x2a\xe3\x36\xac\x2e\x88\x83\x1a\xb0\x6e\xfc\xf5\x8d\xa4\x6a\x2b\xa9\x66\x77\xf4\xa5\x07\xbb\xc8\xc5\x93\xfa\x51\xfd\xba\x9b\xdd\x72\xcf\x8f\x4a\xb0\x86\x50\xf2\x04\x60\xf9\x0b\x88\x83\xf7\x7f\x51\xfa\xeb\x9e\x1b\x34\xa5\x9f\xa7\xc0\x9f\xf0\x6f\xd1\x32\x99\x27\xd8\x47\x55\xef\x91\x2f\x4f\x96\x90\xcb\x12\xbc\x7d\x2a\x31\x5f\x5f\xf1\xd9\x30\x57\x6b\x9f\xf5\xc5\x1c\x6c\xe8\x20\x0e\xaa\xc0\x4d\xf3\x0e\x6e\xf7\xdb\x2a\x15\x7c\xea\x77\x56\xa5\x58\xf7\x89\xea\x58\x70\xa7\x0a\x67\x43\xc5\xfd\x25\x12\x98\xd1\x67\x51\x9a\x61\x75\x41\x1c\x54\x01\xee\x21\x66\x31\xc2\x7d\xae\x9e\x8c\x41\xbb\x3d\xbe\xe5\xa2\xbc\x2b\xfc\x16\x34\x9e\x0e\x85\xeb\x9c\x7b\x4f\x23\x87\xcd\x35\x57\x61\x75\x41\x1c\x54\x81\x3b\xab\x27\xbf\x87\x14\xab\x1a\x32\xca\xd7\x5c\xa4\xdb\x6c\xe8\x0a\x69\x15\xb3\x11\x8a\xa9\x2c\x1e\x87\x5d\xaa\xa9\x52\xb5\x7f\x02\xab\x0b\xe2\xa0\x0a\x74\x5a\xb1\xab\x25\x90\xf4\xc5\xef\x75\x6f\xc9\xf6\x6e\x3b\x08\x2f\x3b\x73\xaa\x99\xf6\xa1\x8f\xe8\xc4\xc7\xa9\xb2\xd2\xcf\x0a\xc1\xf6\xdc\x20\x0e\xde\xf7\x01\x90\xbf\x80\xd6\xd7\xf3\x1c\x70\x2a\x99\xbd\x2a\x42\x66\xf4\xa5\xf3\xf9\x34\x4b\x3e\x6e\x2c\xf2\x07\xbe\xb5\x77\x59\xf4\xaa\x0e\x34\x6e\x91\x11\xf2\xad\x25\xf0\xf8\x11\xc4\x41\x1d\xf0\x3e\x99\xe6\xa2\x09\x2f\xae\xdf\xdc\x15\xc4\xb5\xf4\xf5\xfd\x54\xec\x7f\x3c\xfc\x9a\x64\xbb\xd1\xdc\x24\x50\x6e\x37\xd6\x2c\x1b\x56\x17\xc4\x41\x1d\xf8\xa9\xe8\x9b\xcb\xc2\xf6\x5d\xbb\xb5\xd7\xd0\x84\x6d\xfe\xc8\xd2\x86\x5d\x74\x98\xdc\x97\xd1\xcd\xda\x19\x95\x8a\x94\x7c\x5c\x00\xde\xb0\x0b\xc0\x41\x1d\x08\xf9\x6c\xa5\x8d\x18\xf0\xbd\x6f\xa4\x53\x76\xa5\x48\x76\xff\xe6\x20\xaa\x2a\xf1\xce\x6a\x9f\x87\x0b\xab\xa0\x91\xc1\x51\xb6\x24\xac\x2e\x88\x83\x3a\x50\xa8\x48\xd8\x58\x2e\x1f\x11\x34\x98\xa1\xe4\xe9\x7d\x44\xfb\xa3\x82\x87\x78\x79\x78\x9b\xc2\x4c\x40\xb9\x96\x10\xdb\xd6\xe9\x11\xcc\x01\x10\x07\xef\xfb\xa0\xf1\x77\x07\x40\x9b\x9d\xf3\x1c\x98\x30\x91\xf3\x5e\x5a\x20\xf9\x8c\x45\xc5\x74\x29\x82\x9f\x68\x68\x77\x82\x85\x75\x47\xe1\xf3\xf1\x67\x4d\x85\x62\x52\xe1\x68\x78\x33\x38\x10\x07\x75\xa0\xda\x43\x4c\xec\x3a\xe7\xdc\xd2\xba\x8c\xee\xba\x4f\x5d\x5e\xb3\x2b\x0d\xe6\x66\x5d\x44\xcd\x1d\x31\x8c\x1b\x1e\x14\xdd\x3b\xf0\xe7\x1b\x41\x1c\xd4\x01\x77\x0e\x2d\x4d\xfa\xb5\xfe\xd2\x1b\x2a\x64\x64\xfa\xa5\x99\xca\x15\x9d\xb8\x8d\x9f\xf2\x94\x48\x30\x2a\x9e\xaa\x5d\x9d\xf8\xd9\x07\xab\x0b\xe2\xa0\x0e\x8c\x33\x0d\x69\xb2\x5c\xcd\x0f\xcc\xb1\x10\x2d\x14\xd0\x3d\x88\x4f\x0b\x95\xcc\xf4\x9b\x94\xb8\x2c\xb9\x25\x86\x42\xd2\x9a\x03\x7f\xbf\x1a\x88\x83\x3a\x90\xf3\xc9\xfb\xb6\xe8\xbd\x26\xfb\x8c\x48\x91\xb8\x63\xac\xce\x76\x15\x0e\xc1\x09\xaa\x44\x5a\x94\xcb\xe1\xc6\xb1\xe3\xc5\x6f\x93\x60\x0e\x80\x38\xf8\x3c\x00\xc8\x5f\x40\x3b\xcf\xf3\x1c\x50\xc3\x9a\x38\x18\xf0\x9d\xda\xf8\xb8\xc7\xac\xda\x25\x7f\xf5\x52\xaf\x13\x1e\xd2\x2c\xdd\x13\x8d\x0f\xa1\xb1\x7e\x37\x45\x50\xe1\x39\x2c\x88\x83\x3a\xd0\x59\x69\x94\xc5\x1e\x15\x40\x2f\xc8\x3e\xa4\x76\xcf\x46\x49\x2c\x34\x56\xa5\x3f\x9a\x32\x7e\xa6\x80\xef\xbb\xd1\xaf\xae\x35\xf8\xfb\x25\x41\x1c\xd4\x81\xa1\x44\x4b\xc6\x97\x14\x44\x75\xf8\xdf\x84\x1c\x30\x2b\x4b\xb6\x48\x0b\xd8\x0d\x5a\x4d\x13\x1e\x71\x96\x7c\x59\xcd\x6e\x38\xa0\x85\xd5\x05\x71\x50\x07\xda\x72\xaa\x9e\x99\xdf\xb4\x97\xba\x1e\x50\xe9\x3a\xd1\xe3\x80\x75\x29\x0a\x49\xad\x9c\xdb\x83\x7a\x8e\xdc\x9a\xaa\x14\xe7\x2b\x7c\x9b\x01\xe2\xa0\x0e\xe8\x2f\x4a\x77\x3d\xd3\xf1\xcf\x79\xf3\xf8\xd9\x90\x39\x4d\x31\x2b\x99\xf4\x46\x62\x72\xe1\x12\x5f\x18\x81\xe8\xe3\x46\xec\xc8\x1e\x98\x03\x20\x0e\x3e\x0f\x78\xfe\x3d\x7f\x01\xdd\xbb\x9f\x9f\xbf\x54\x6b\xce\xbb\x18\xcc\xda\xd3\xa5\x9a\x47\x87\xe9\x56\xf0\x77\xed\xf3\xcb\xdf\xe0\xa3\xd0\xb2\x63\xea\x5c\xe6\x5a\x41\x12\x35\x82\x65\x19\x20\xee\x6c\xfe\xe2\xd9\x5c\x95\xb0\xc0\x8f\x82\x8c\xfd\xa8\xd7\xb4\xe5\xa4\xb6\xfd\x5a\xf6\x8a\x1d\x55\x46\xb0\x98\x4c\x7d\xfa\xa4\x6a\x4d\x28\x2d\xac\x32\x88\x3b\x9b\xbf\x64\x7b\xbb\x5e\x4a\x5e\x0b\xd5\x18\x63\x71\x09\xdf\x8e\x90\x5c\xdb\x33\x55\xc6\x71\xe9\x55\x0c\x0e\xa7\xe1\xf4\x47\x51\xe0\x84\x3f\xd9\x04\xe2\xce\x56\xa6\x32\x33\xa0\x4b\xfb\x84\x8c\x20\xfa\x89\x4a\xed\x41\xab\xfb\xac\x74\xb0\x8d\xaa\xc0\x86\x68\x4f\x81\x50\xa8\xfb\x23\xec\x0f\x1f\xe0\xf9\x8b\x6e\x58\x6a\xe4\xdb\xa6\xfe\x44\x94\x3e\x7b\x0c\x8f\x7c\xdb\x88\x8a\x1c\x67\x07\x47\xd6\x24\xd3\x54\xe4\x50\x04\xa9\xf2\x10\xcd\xd3\xf9\x8b\x9a\x8e\xb8\xc6\x7c\x53\xd4\xd2\x5d\xd2\xa5\x9c\x86\xae\xa5\x2b\x5e\xd4\x7e\x9a\x78\x9d\x64\x11\x7c\x58\x48\x62\x05\xef\xe2\x4f\xbf\x84\x66\xef\xe9\xce\x4b\xba\x8e\x41\x4c\xc5\xf5\x17\xb7\x10\x2e\x2b\x2a\x47\x69\x45\x38\xdf\x61\xca\xc2\x8b\x30\xf9\x59\xf8\x43\x37\x4e\xe3\xbf\x2d\x7f\x01\x0d\xed\x74\xff\x17\x68\xfe\x92\x79\xcc\xab\xef\x2f\xe1\x25\x12\xcf\xbe\xaa\x2c\x65\x4d\x42\x38\x4f\xd9\xc0\x22\x3d\x66\x7a\xf4\xa4\xff\x81\x9c\xdc\x36\xe2\x45\xb4\xa4\x95\x12\x3f\x93\xbf\x88\xf3\x4f\x49\x7e\xf5\xd5\x95\xc8\xf4\xf7\x19\xcc\x63\xc7\x6b\x98\x79\x85\x64\x67\xaa\x72\x10\x3f\xd2\xf4\x50\x34\xd0\xb1\x33\xee\x42\x8e\x66\x9c\xcd\x5f\x92\x25\x35\x7a\xba\xbe\x29\x7d\x0b\x34\x7e\x45\x52\xc9\x72\x4c\x73\xdd\x7f\x2c\x8b\xa4\xc7\x3e\xf0\xbb\x05\xa1\x3b\xf7\xd5\x91\x0b\x89\x7d\xc4\xcf\xe6\x2f\x0b\xf9\xeb\xe8\xe6\x8f\x27\x1e\x66\x7f\xde\x6c\xe9\xf0\xa6\x8a\xd8\x9a\xf2\x1f\x19\x77\xab\xd7\x17\xd7\x34\xd0\x8a\xea\x36\xf8\x70\x21\xa3\x3d\x9b\xbf\x5c\xc9\xf9\x76\xbb\x28\x70\x46\x89\x92\x48\x03\xa1\x3b\xd3\xaf\xfe\xd8\x8e\xeb\x3b\x7f\x7d\x9d\xe1\x1b\xa2\x2e\x0b\xbf\xe2\xa9\x87\x17\x32\xda\xb3\xf9\x8b\xc0\x25\x82\x21\x3e\xe4\x3c\xf9\x60\xe3\xfb\x69\x8c\xc8\x82\x7a\xc4\x5f\x90\x7b\x1d\x47\x43\x8b\x43\xc8\x5d\x0f\xb6\x9b\x89\x2e\x20\xf6\xd1\xfb\x67\xea\x9e\xb7\xdc\xee\x7e\x17\x92\x72\x7a\x2a\x76\xf0\x8b\x89\xbe\x37\x2e\xfa\xe5\xaf\xf9\x59\x0c\x9b\x38\xa7\xe0\xf1\x7a\x82\xeb\xb7\xaa\x0c\x6d\xe0\xaf\xa7\x00\x71\x67\x8e\x9b\x32\xdb\xb2\xad\x36\x86\x7b\x22\x16\xca\x38\x06\x2f\xde\xe3\x1e\x71\xac\x7d\x12\x51\x3d\x74\x9b\x5a\xfd\x31\xe5\xec\x30\x2a\xbc\x9f\x2d\x88\x83\x2e\xb7\xcf\x3f\xea\x0d\xfa\xaf\xc8\x99\x7d\x35\xa3\xbb\x62\x45\xe2\x9a\x7e\xcd\xb4\xc0\xa5\xbd\xd2\xfb\xbe\x2e\x47\x34\xbf\x56\xe9\xbc\x03\xfc\x69\x19\x00\x07\x5d\x6e\x8b\x0d\xb6\x0d\x72\xa3\x4a\x23\x4c\xc3\x99\x83\x3c\xc7\xb0\xe3\xcc\x9f\xe8\xa6\x75\x3f\x74\x67\x55\x69\x94\x5e\xaf\x8d\x93\x90\x87\xd5\x05\x71\xd0\xba\x0f\x9c\xc4\x44\x94\x0c\x43\x75\xa5\xdb\xc5\xd4\x0e\x6e\x64\x14\xa5\xb9\x87\xf6\xf1\x4f\x90\x0a\xd6\x45\xd7\x33\x0f\x8f\xa1\x37\xc2\xf2\x17\x10\x07\xef\xff\xf2\xd7\xfc\x05\x34\x8d\x9c\x67\x00\x7b\x43\x6b\xa4\xa6\xf3\xcb\xb6\x55\x7f\x7e\x8d\x81\xca\x2e\xbc\x56\xa4\x5f\x2c\x9b\x81\xdd\xfb\x42\x31\x37\xd3\x5e\xb5\x49\xc1\x9b\x23\x82\xb8\x33\x2f\x3c\xe8\xe0\x7c\xa3\x7d\x2d\xf0\x89\xd2\x66\x14\x66\x95\xb9\xfd\x48\xc3\x04\x87\xe3\xe4\x56\xa4\x49\xbe\x49\xfb\x28\xcd\x63\x3a\x5c\xf8\x0b\x0f\x00\x1c\xd4\x80\xdf\xdc\xce\x42\xc6\xdd\x3b\x82\xfa\x3d\x37\x8b\xbf\x51\x99\x2f\xa9\xab\xf3\x47\x0b\xb9\x17\x2a\xa0\xb9\x78\xe4\x63\x96\xc8\xc0\x3b\x3b\x83\x38\xe8\x2f\x65\x53\x32\xe2\x7b\x78\x6d\x50\xa8\x26\xeb\xb6\x5d\x74\x7d\xb0\xfc\x5b\x6b\x4a\x3a\xfd\x51\x45\xbf\x3f\xd9\xe9\x84\x1a\xdb\x7d\x2c\xb0\xba\x20\x0e\x5a\x37\x7e\x06\xb5\x91\x3e\x5a\x9c\xdd\x40\x4b\x93\x76\xe9\xc5\x1c\x86\x74\x57\xc4\xae\xd3\x9b\xbc\x38\xe6\x58\xf7\x8f\x31\x9c\x4f\x70\x61\xf9\x0b\x88\x83\xf7\x7f\xf9\x7b\xfe\x02\x9a\xd2\xcf\x53\x80\x06\x5d\x88\x2f\x58\x8e\xe1\x1a\x3a\x41\xbb\x61\x2c\x72\xb7\xee\x08\x3e\xaa\x5e\x99\xcc\x50\x78\x8e\xf5\xac\xc3\x41\xf1\x2a\xbc\x47\x2a\x88\x3b\xd3\xf7\x21\x5c\x87\xf9\xa5\x4c\xb5\x7e\x66\x1d\x16\xc1\x0b\x34\xbd\x39\x6b\x06\xe4\xf8\x47\x6d\xc6\x64\xb7\x74\x6f\xd2\xbb\x7f\x5f\x16\x87\xf7\x7d\x00\x70\x50\x05\xd4\xf2\x7f\x86\xbd\x8f\x36\xe4\x6b\x40\x3a\x8e\x29\x40\x16\x1f\x4b\xbd\x12\xf2\xa1\xac\x1e\xf9\x5b\xdc\x4c\x5b\x55\x51\xa1\x60\x12\xfc\x1e\x01\xc0\x41\x7f\xaa\x3e\xa5\x42\x9f\x06\x2b\xa9\x6a\x64\x29\x85\x8f\x73\x03\x0f\xc5\x48\x9c\xf3\xa5\x34\x9c\x57\x9e\x7d\xb4\xff\x26\xce\xda\x3e\x06\xcf\x8b\x40\x1c\xb4\x2e\x3f\x8e\xaa\x1b\xf7\xa2\x7c\x52\x76\xc0\xea\xe6\x87\x3e\x45\xe9\xd0\x59\x43\x62\x8a\x3a\x0d\xad\xe0\xe2\x71\xff\xbb\xe9\x44\xf0\xb3\x0f\x20\x0e\xde\xf7\x01\x90\xbf\x80\xd6\xd7\xf3\x1c\xd8\x5c\xf0\x7d\x33\x38\x50\xbf\xf8\x66\xe0\x06\x7f\xd7\xd0\x2c\xf2\x9b\xe2\x4c\x53\xf3\xc3\xc8\x5c\x86\xb0\xa1\x7b\xb2\x58\x93\xb5\xb0\xb1\x83\x38\xa8\x03\x08\x44\x69\x64\x93\xdd\x9c\x79\xb5\xb1\xf4\x04\xfb\xe8\x58\x5f\x69\xe9\x88\x3a\x54\x8e\xe9\x2b\x9e\x0d\x95\xf3\xdd\x2f\xa5\xfb\x0e\xab\x0b\xe2\xa0\x0e\xd8\xcb\x89\x52\x84\x0f\x5d\x95\xf9\xb2\xb6\x6c\xb2\xfc\x05\x31\x9e\x60\xf9\x92\xd4\xa5\xd8\x3f\x3f\x07\xbc\x06\x42\xed\x6f\x4b\xc3\x1f\x43\x04\x71\xd0\xdf\xaa\x90\x40\x5d\x15\x29\xd2\x7d\x4b\xdf\x65\x61\xe2\x5e\xf4\xf5\x44\x5d\x89\x35\x52\x33\x41\xf6\x7c\xad\xfd\xea\xc4\x19\x15\x44\xf8\xc2\x05\xe2\xa0\x75\x25\xca\x54\xe4\x1b\xea\x1f\xff\x9e\xf3\x1a\x94\x3a\xb1\xad\x6c\x4e\xb9\x89\x28\xbe\x63\x84\x95\x34\xc7\x77\x97\xe9\xfd\x77\x0b\x31\x98\x03\x20\x0e\xde\xf7\x01\x90\xbf\x80\x36\x3b\xe7\x39\x40\x6c\xc5\xb0\xb6\xbe\xc3\x7d\xe3\x19\x2b\x87\x95\x15\x59\x78\xf0\xcb\x3a\xb7\xb9\x6a\x93\xcd\x3d\xf9\xb2\x9e\x6d\xb5\x6b\x4d\x1f\xe0\x0f\xe1\x02\x38\xa8\x03\xc8\x64\xd6\x3b\xfb\xcc\xa6\x4e\x57\x35\x75\x27\x4d\xe4\xfa\x6a\x17\x14\x28\x38\x57\x39\xd9\xef\xca\x6e\x57\x68\x36\xf8\x34\x3c\x80\xd5\x05\x71\x50\x07\xca\x94\x8b\x8e\x87\xb6\xb0\xb8\xbb\x8c\x03\x48\x2b\x34\xe4\x7f\xad\x9b\xbf\x22\x8d\x60\xff\x29\x4d\xf9\x83\xe6\xeb\x44\x82\xed\x63\x58\x5d\x10\x07\xfd\xad\x66\x23\x3e\xf1\x59\x0c\x8a\x5d\x76\x95\x7c\x42\x5c\xb6\xd7\xbb\xb5\xc7\x19\x70\x3b\x47\x9f\x3c\xd5\x26\x61\x24\x45\xd3\x49\x08\xfe\x0e\x72\x10\x07\xad\x4b\xa6\xf2\xa5\x25\xf5\xeb\x36\xd7\x32\x51\x6e\x81\xdf\xc3\xe2\x4b\x3f\x97\x7b\x5e\xd4\x54\x66\xef\xb0\x70\x68\x0f\x99\x3e\xe6\x7e\x0e\x73\x00\xc4\xc1\xe7\x01\x40\xfe\x02\xda\x79\x9e\xe7\x40\xaf\x38\x4a\x5b\x76\x64\xba\x50\x23\xd5\x4b\x55\x69\xac\x99\x55\x5e\x8f\xa3\x7b\xc4\xad\x82\x7e\x94\xfa\x23\xda\xca\xc3\x96\xf0\xff\x57\x20\x0e\xea\x00\xda\xa7\x2f\x22\xc7\xa9\xa1\x58\x74\x22\x2e\x4e\x6f\xe4\xa8\xbb\xa2\x3d\xc2\x0a\x6a\xc5\xec\x7a\x75\x8e\xc7\xef\x28\xc8\xd0\xdc\x86\xd5\x05\x71\x50\x07\xbe\xaf\x70\xb8\x3f\x9f\x3b\x29\x4f\x89\x9e\x6d\x7b\x14\x45\xf1\x8a\xd4\x50\xc6\x2c\x00\xe5\x1d\x53\x9b\xa9\x03\xbd\x00\x13\x12\xfc\xcf\x26\x20\x0e\xfa\x5b\xad\x44\x19\xc4\xea\x97\x27\x92\xf1\x1b\xdf\xb0\x67\xd1\x57\xb5\x63\xb6\x67\x3a\xd6\xed\x78\x23\x45\x38\xbb\x2c\x66\xb5\xf8\x78\x1a\xfe\xe7\x23\x00\x07\xad\x9b\xac\xca\x2b\x1d\x91\x6d\x92\x34\xe3\x76\x55\x5f\xa4\x30\xd4\xc9\xe1\x98\x7d\xf6\xa8\x6d\x8c\xcd\x87\x6d\x85\x23\x2f\xa7\xf5\x17\xcc\x01\x10\x07\x9f\x07\x00\xf9\x0b\xe8\xde\xfd\xfc\xfc\x45\xee\xe7\x9a\x91\x07\x0d\x5e\xc0\x78\x4e\x7a\x12\xd1\xae\x9f\xeb\x02\x7b\x5a\x42\x8a\xe6\x6d\x0e\x59\xff\x4f\x54\xcf\xde\x25\xad\xc2\xb2\x0c\x10\x77\x36\x7f\x91\x0c\x17\x60\x8f\x18\xea\xa8\x88\xb3\xf9\x26\x12\x1e\x47\xac\x8b\x2c\xc8\x9a\x77\xfd\xe6\xaf\x2b\x6b\x63\x02\x72\x56\x37\x05\xe0\xc9\x0e\x88\x3b\x9b\x92\x78\xcb\x0c\x99\x7b\xab\x1f\x8e\x73\x1c\x56\xdc\xde\x98\x7c\x2e\x16\xce\x2d\x36\x50\xa5\xe3\xea\x43\xa7\x48\x93\x3d\x11\x2a\x20\x06\xab\x0c\xe2\xfc\xa5\x11\xf0\xff\xb3\xb2\x71\x45\xd9\xcc\x8b\x25\xc2\x00\x85\x93\x1b\xe1\x52\x72\x58\x73\x16\xdc\xcc\x48\xc1\x04\xec\xb2\x96\x41\x89\xf8\xe8\xb9\xdc\x8b\xf0\xfc\xe5\x2e\x05\x1f\xad\x54\x78\xd9\x8b\x49\xdb\xef\x64\x03\x28\xf9\x09\x89\x5a\xbb\xb4\x11\xef\x5d\x7f\x25\x76\xb9\x5c\x5f\x45\x63\xc7\x3b\x9d\xbf\x14\xc7\x45\x92\xf0\x30\xbd\x40\x08\xc6\x6d\x46\xba\xa9\x62\xd3\x8b\xf3\xcb\x8b\x99\x78\x51\x6e\xc9\xfc\x66\x70\xde\x8c\x0b\xce\xe8\x29\x54\x34\xf4\x55\x6b\x70\x85\xe9\x28\xcb\xca\x61\x97\x0a\x66\x04\x0d\xa7\xaa\xda\xd0\xdd\xef\x14\x44\x5f\x04\x10\x10\xa3\x12\xbe\x2e\xfe\xb7\xe4\x2f\xbf\x50\xff\xd9\xd0\xfe\x4f\xfe\x22\x85\x20\x79\xa6\x5d\x2a\x9d\x9b\xa3\xf7\x23\xde\x65\x3f\x8a\xdf\xb1\xc6\xc9\x23\xd8\xbb\x8f\x32\x71\x66\xec\xe7\x19\x87\x07\x66\xee\x67\xcb\xd1\xe7\x5d\x44\x00\xe3\x73\x26\x80\x29\x7b\x61\x1b\x8b\x6d\x45\xab\x8b\xf5\x60\xda\x1e\x3b\x68\x81\x05\xa7\x7a\xf0\xda\xc3\x42\x29\xce\x50\x69\x64\x94\xd7\x56\x29\xf3\x17\x72\x36\x43\xe8\x4c\x36\x50\x8b\xce\x44\x65\xdc\x80\x7d\xb9\xb1\xc2\x82\x7c\xba\x6b\x93\xd1\x64\x81\xd2\x92\xd6\x0a\x61\xe3\x1a\xe2\x28\xe6\x9f\xb8\x51\x85\x0b\x39\x89\x72\x36\x80\x31\x77\x6a\xf9\x4a\xda\x79\x8b\xad\xe6\xad\xf9\x2b\x07\xc7\x50\xaf\x92\xcc\x2b\xfe\x89\xb9\xc1\x83\x87\x38\x73\x04\xe8\xbc\xde\xac\x17\x32\x5a\x87\x33\x1f\x7b\x73\x79\x78\x79\x6e\xb4\x06\xc1\x28\xbd\x32\xc5\x44\x8e\x39\x5b\x4b\x9e\x3d\xc5\xba\x35\x9f\x96\x7a\x39\x34\xdb\x2a\xf9\xbd\xd1\x85\x8c\xf6\x6c\x00\x33\xc4\x15\xee\x2d\xf4\xed\xf5\x3d\xaf\x5f\x05\xe6\xd1\x0b\x24\xbd\xe1\x78\xf5\x7c\xf7\xb1\x7a\x90\xfa\xd7\x6a\xa2\x95\xed\x5e\x5f\xc0\x7b\xaf\xf5\xfe\x99\xba\xe7\xbe\xfb\x24\x2a\x78\xcf\xf6\x0d\xce\x93\xc9\xec\x5e\x7c\x73\xfc\x4f\x06\x02\x19\x1c\xeb\x51\x3c\x2d\x0a\xd5\x3a\xca\x3b\xd8\xfe\x68\x66\xb0\x75\x06\xc4\x41\xd7\x5b\x6d\xd9\x5c\xc6\x3c\x41\x2d\x67\xab\x14\x67\x8e\xaa\x81\x83\x5b\xed\x81\x9d\xf7\x12\xbd\x94\x48\x62\xbe\x7d\xe1\x1e\xfc\xc1\x72\x09\x56\x17\xc4\x41\xd7\xdb\xa4\xeb\x37\x83\x5b\x72\x8c\x48\x88\x9f\x78\xce\xf1\x15\x6f\x2a\x74\x2a\x32\xb1\x12\xb8\x71\x5c\x36\xb1\xa1\xd7\x9a\xd2\xf5\xf6\x82\xd5\x05\x71\xd0\x75\x71\x63\x9c\xfb\xb3\xe3\x53\x46\x9f\x3c\xe4\xe6\xa0\xc1\xe1\x79\xed\x4a\x29\xa4\xd8\x96\x63\x4e\xf1\xbb\xd5\x41\x76\x7d\x52\xe5\xf0\x7e\x02\x20\xce\x5f\x12\x01\xff\x74\x5d\x4a\x2a\x43\x84\x76\x99\x6b\x18\x6a\x69\x25\x7f\x48\xd5\x79\x4d\x0c\x1e\xdd\xf8\xf0\xf2\x13\x2e\x7e\x62\x72\x49\xef\x53\x52\xbe\x8f\xb0\xdb\x6f\x10\x07\x6b\xff\xf1\x3f\x13\xd6\x5f\xb6\x5c\xa0\x79\xe4\x3c\x05\x5a\x42\x99\x7c\x6b\x6d\xd5\x38\x96\x87\x35\xb0\xa4\x5f\x4a\x53\xdc\xf4\xdf\x98\x7e\xd7\x68\xd0\xbe\x47\xac\xf1\xee\xea\xc9\x22\xbc\x57\x32\x88\x3b\xd3\x7a\x93\x50\xeb\xdd\x13\x22\x8a\x08\xf4\x08\xfd\x81\xf7\x3a\x58\xbb\xc5\x35\x37\x16\x18\x96\x27\x1f\x61\x0f\xff\x78\x4f\x7d\xf7\x99\x30\xbc\xf5\x26\x80\x83\x2a\x60\xbb\xf9\xac\x3f\xe0\x49\xf0\x2f\x26\x9f\xc2\xa7\xbe\xf8\xe9\xf8\x25\x98\xaf\xb4\x52\x02\xa3\x9a\x8c\x5c\xd7\x6f\xe3\xed\xdb\xc2\x8f\x29\x80\x38\xa8\x02\x08\x8d\x12\xee\x7d\xd7\x5c\xfb\xf7\x5d\x6e\xad\x16\xf7\x8f\x23\x70\x9b\xb6\x1a\x19\xeb\x45\xc6\x30\x1e\xe6\x46\xe9\x33\x14\xc1\x8f\xb3\x83\x38\xa8\x02\x0f\x06\xde\x35\x2b\x71\x6b\xcb\x8d\xd4\x8d\x70\x60\x0d\x77\xc8\x07\x16\xac\xf8\x2c\x4e\x5b\x37\x3f\xbd\xab\x6c\x8d\xc4\x49\x22\x09\x53\x00\xc4\xc1\x3b\xc0\xfc\x3d\x81\x01\xcd\xe9\xe7\x29\x70\xdd\x3a\xec\x76\x39\xf2\x7d\x42\x62\x5b\x0c\x8d\x86\x5f\x53\x12\x1c\xa1\x85\xdc\xb9\x9e\xf2\xbe\x66\x63\x46\x6e\x7a\x0b\x5e\xf0\x36\x50\x20\x0e\xaa\x00\x4d\x4c\x65\x58\x72\x5f\xb6\xfa\x5b\xa1\x19\xad\xb7\xef\x69\x70\x31\xdb\xbe\x8a\xeb\x31\xf7\x18\x7c\x18\xd9\x27\x5e\xc2\xb3\xb9\x0a\x4f\x76\x00\x1c\x54\x01\xcc\x12\x5d\xc3\x5e\xe2\x13\xe3\x26\x0b\xd6\xf7\xa8\xea\x8f\xe2\xf8\x8a\xf5\x34\x58\xe2\xb5\xd4\xb2\x9b\xbf\xcd\x3d\xfb\xc2\x02\x3f\xcd\x0e\xe2\xce\xdc\x21\x7d\x7f\xdb\x86\x8c\x3b\xe1\xad\xaa\x82\x89\xdc\x56\xbf\x53\xd5\x65\xf9\x58\x47\x57\xf5\x37\x9e\x26\x42\x9d\x08\xd5\xe4\x38\x03\xbc\x0b\x0a\x80\x83\x2a\xd0\x76\x8c\x85\x13\xf4\xfe\x51\x64\x5a\x2b\xc3\xbb\xe7\xb4\xfe\x4d\xa4\x43\x92\x0f\x92\x6f\xdf\x77\x3c\xe8\x13\xa6\xa1\x4c\x3e\x0a\x82\xed\xba\x41\x1c\xbc\xf3\x83\xd0\xdf\xef\xbc\x40\x0b\xec\x79\x0e\x6c\x0d\x87\x13\xf8\x05\x2c\x50\x7b\x07\xf8\x9b\xa4\x8e\xbf\x61\x4b\xde\x0f\x27\x88\xfc\x71\x8f\x1c\x87\x09\x39\xfb\x7b\x11\x2b\x0a\x6c\xec\x20\x0e\xea\xc0\xb8\xf7\xb1\xe3\x78\xf2\xa6\x8a\x4e\xaf\x8d\xfc\xcc\xfd\x84\xbd\x22\xd1\x6a\xf2\xce\x78\xaa\x18\xf6\xbd\x6b\xf5\xae\x8f\x73\xe1\x8d\xad\x41\x1c\xd4\x01\xbf\x94\xe7\xab\xf2\xcc\x7b\x7a\x88\x7d\x93\x31\x72\xde\xea\x32\xdf\xf4\x2b\x3a\xf6\xa2\xf3\x73\xe6\x2f\x71\xc6\xfe\x61\xa9\x27\x81\xd5\x05\x71\x67\xee\xbc\x9e\x75\xbe\xec\x37\xd9\x91\x68\xf4\xc8\x4d\xba\xf1\xd5\x7b\x38\x30\x32\xeb\xf9\xfd\x05\xfa\x5a\xd1\x23\x41\x7b\xaa\x38\x1c\xf8\x0b\xf9\x41\x1c\xd4\x81\x5a\xbd\xf6\x57\x31\x81\xd8\x46\xda\x0d\xcc\x29\x0c\xee\x4b\xda\x0c\x2c\xdf\x14\xc9\xdb\x9a\x3f\x45\x2b\x91\x37\x3f\x9e\x6d\xfc\x0e\x7f\xf2\x00\xc0\xc1\x3b\x3f\x00\x12\x18\xd0\x6e\xe7\x3c\x07\xea\x64\xa8\x53\xc8\x4c\xfa\x8c\x66\x86\xde\x88\x36\xd7\xfa\xe7\x57\x20\xcb\x09\x38\x8d\x87\xde\xeb\x44\x6e\x77\x35\xba\xea\x03\x3f\x55\x04\xe2\xa0\x0e\xf4\xdf\x9a\x64\xfc\x83\xfc\xa4\x9d\x24\xfe\x4a\xeb\x21\x85\xb2\x92\xad\x10\x87\xb0\x07\xcf\xfd\x3e\xaf\x8e\xbd\x61\xd2\xc5\x4a\x78\xc2\x0b\xe2\xa0\x0e\x28\xe9\x4d\x1b\x95\xf5\xcc\x1c\x8b\xe2\xc8\xc5\xa5\xf5\x0c\xc5\xd1\xac\x85\xab\xe1\xea\x4e\xb0\xa8\xad\x73\x16\x61\xf4\x9c\xdc\x83\xd5\x05\x71\x50\x07\x0a\x64\x09\x3f\x6f\x88\x31\x3f\x93\xee\x7d\x99\x41\xa6\x4c\x3b\xf6\x44\x36\x49\xd4\x27\x83\x7d\x84\x27\x94\xf1\x6d\x6f\xc7\xeb\x5d\xf8\xa1\x50\x00\x07\x75\x40\xcb\xc1\xc8\xdf\x7d\xc2\x9a\x57\xc4\x9c\x6a\xcb\xd4\x6b\xde\x91\xb0\xfc\x65\xd2\x86\xba\xab\x2b\x2d\x85\x4b\x51\x85\xbf\xe7\x47\x98\x03\x20\x0e\x3e\x0f\x38\xfc\xdd\x01\xd0\xd6\xf3\x3c\x07\x16\x37\xa8\x42\xe8\xd0\x3a\x53\x73\x8a\x93\xde\x66\x55\x73\xcc\x9b\x4a\x4c\xef\x49\x79\xbe\xf3\x68\x7a\x9e\xaa\x22\x8e\xac\x8e\x07\x1b\x3b\x88\x83\x3a\x10\x88\x5f\x17\x6f\xcf\x26\x28\x53\x9f\xe2\x4a\x56\x83\xf9\xe7\x8b\x01\x8d\x7a\xc4\x70\x6e\xb0\x5c\xbf\x96\x7a\x6f\xa0\x14\x1f\xbc\xab\x0e\x88\x83\x3a\x80\x22\x8a\x7d\x3d\x2b\x6c\x13\xe7\x66\xef\x0f\x65\xfd\xf2\x4b\xd6\xb1\xc6\xb7\x71\xee\xc9\xb2\x46\xe1\x1b\x9b\xdf\x68\x91\x8d\xf9\x05\xab\x0b\xe2\xa0\x0e\xbc\x7c\x7c\xcb\x1b\x3d\x75\x20\x14\x63\xab\x20\xb4\xbf\x85\x2c\x7b\x63\x00\x95\x8f\xaf\xaa\xec\x1a\x86\x7a\x0e\xf1\x11\x5f\x18\x7c\x67\x0c\xe2\xa0\x0e\xf4\x38\xb3\x46\x20\x3f\x7e\xe6\xaa\x7c\x24\xf5\xc8\x94\x84\xed\xfb\x73\xa7\x02\xb6\x1f\x5b\x2a\x76\x79\x0f\x1e\xf5\x28\xa6\xe4\x8b\xc3\x1c\x00\x71\xf0\x79\x00\x90\xc0\x80\xee\xde\xcf\x4f\x60\xb6\xd7\x64\x1e\x76\xfb\xfb\x17\xb3\xde\xe0\x49\xf5\x7d\xa5\x70\xef\x9b\x37\xad\x66\xd5\x0b\xd3\xa2\xca\x89\x18\x74\xbc\x18\x6f\x0f\x58\x9a\x01\xe2\xce\x26\x30\x97\xf2\x0d\xad\x3b\x4d\xb1\x54\xe9\x67\xbc\xa2\x7f\x18\x47\x9a\xf8\x06\x9b\xac\xde\xfa\x4e\x26\x56\xca\x1c\xdb\x29\xd3\x1e\x7b\x05\x56\x19\xc4\x9d\x4d\x60\x3c\xf3\xe5\xee\xf2\x36\xdc\x6d\x4d\xcf\x98\xc7\xa7\xcf\xd7\xd0\x6a\xc2\x6f\xa1\xf3\xcb\xab\x32\x17\x62\xe7\x41\xaa\xfd\xc2\x38\x0e\x3f\x5b\x03\xe0\xfc\xa5\xff\xe7\x4a\xfe\xc7\x93\xc9\x95\x46\x76\x16\xbe\x26\x07\xe4\x74\x2e\x26\x65\xed\xb3\x42\x8a\x29\xb4\xe9\x6a\xf3\x08\xc1\x48\x97\x48\x5f\x7a\xc6\xf9\xea\xc1\x13\x98\xa4\x15\xc7\xad\x96\x04\xfd\xe5\x11\x45\x0e\x76\xbf\x25\x46\xce\xc3\x50\x56\xc4\x94\xd9\xad\x18\xf1\x14\xdc\x28\x8b\x9d\xea\xfd\xd3\x09\x8c\x4d\x54\xad\x9a\xd6\x02\xf3\xc0\xc6\xdb\x47\x99\x57\xef\x94\x2e\x8b\x3c\x9f\x0e\xcd\x64\x12\xd5\x52\x78\xf0\x46\x57\x69\xb2\xa8\xe3\x74\x28\x11\xd1\xfd\xad\x97\xe4\x01\x16\x05\xd6\x5d\x06\x5a\xd2\x55\x6e\x34\x07\xf9\x05\x76\x89\x78\xf5\x3f\xf5\x2a\xcc\x6d\x24\x19\x36\xff\x6d\x09\x0c\x68\x68\xa7\x12\x18\xf1\x33\x09\xcc\x1d\xb2\x9c\xf4\xa7\x4b\x96\x9a\xb3\x97\xa5\x0d\xd3\x24\xb4\xb0\x36\x8d\x2d\x3e\xff\xc0\xac\x77\xdf\xc3\xbc\x7a\xac\xa4\x5b\xe1\x70\x11\x09\x4c\xcb\x99\x04\x26\xb1\x8f\xa0\xf5\xf6\x6f\x0a\x35\xfe\x77\xb7\xea\x51\x46\x9e\xae\xbb\x72\x73\xcf\x5b\x18\xd1\x34\x90\x0c\x3b\xbd\xb3\x7a\x30\x74\x11\x2f\x5e\x92\x16\x3f\x9b\xc0\xf0\xf4\xb3\xb5\xc6\x50\x12\xb7\xb1\x1f\xe8\x78\x4f\x7f\xa1\xcc\xd3\xca\x98\xdb\x1b\xe6\xbf\xd4\x29\x68\x95\x40\x63\xef\xc7\x32\x7d\x21\x67\x51\xce\x26\x30\x0a\x85\xee\x33\x46\xb7\xe4\x6f\xff\xe9\x26\xbd\x72\x59\x5f\x2d\xb9\x51\x5f\xb8\xbf\x2b\x6f\xff\xea\xab\x10\xc2\xa0\xfa\x72\x67\x9f\x0b\x19\xed\xd9\x04\xa6\xd4\xa8\x00\xc5\x71\xf4\x37\x61\x87\x54\xd2\x87\xc7\x76\x3f\xe2\xf9\xa6\x48\xc2\x06\x3a\xae\xef\x70\xd0\x7e\x7d\x48\xcf\x4b\x94\x7e\x21\xa3\x3d\x9b\xc0\x48\xd1\x99\x79\x58\xfc\x56\x99\x96\x9f\xfe\x64\x6e\xba\x62\xee\x8f\x4c\x69\x39\xbc\x87\x12\x16\xd1\x86\x15\x62\x37\xf3\x25\xb1\xf4\xc2\x12\x18\x90\xba\xe7\xad\xb7\x2b\xef\xe4\xbb\x32\x7d\x92\x5e\xf4\x4d\xca\x71\x14\xbe\x8a\xbb\xcc\xf9\xdc\x3c\x9b\xdb\x90\xe7\xe7\xdd\x6b\x5e\x3a\x71\x09\xef\xe0\x7f\x41\x00\x71\xd0\xf5\x96\xe9\xa6\x6f\xf7\x5a\xc0\x76\x76\x6f\x41\x8a\x79\xba\x56\x30\x33\xd3\x8b\x87\xf9\xa2\x53\x4d\xbf\x1c\xf7\xb0\xfa\x2d\x7f\x16\x3c\x83\xd5\x05\x71\x67\xde\x22\xa0\xcc\x57\xc1\x74\xef\x39\x56\xcb\x0f\xa4\xcf\x33\x6f\x85\x3d\x3c\x9b\xdb\x22\xa5\x6c\xde\x8f\x07\x6b\xdc\xd6\xb2\xbd\x64\x04\xef\xfe\x00\xe2\xa0\x75\x49\xea\xba\xe8\x2f\x59\x1d\xa3\x1c\x88\xab\xc4\x59\x20\xff\xc6\xed\x7e\xf5\xc9\xba\xeb\xfe\xb1\x2c\x86\xcf\xa8\x4c\x9d\x72\x38\xfc\xe4\x2d\x88\xf3\x97\x44\xfc\x8f\xeb\x20\xff\x9d\x79\x59\x57\x08\xf9\xd2\x96\x6d\xba\xa2\x00\x75\x85\xbc\x1d\xd3\x1d\x6e\xc2\x0a\x73\x36\x9e\xac\xd9\xd1\xca\xde\x95\x2d\xd8\xed\x37\x88\x83\x35\x00\x11\xff\x7b\x02\x03\x9a\x47\xce\x53\x80\x94\xf0\xbd\x8a\xc7\x83\x0f\xfb\x3b\x9f\xa8\x66\x82\xdf\xb4\x99\xde\xe6\x6f\xa8\x78\xd9\x38\xe7\x14\xec\xa5\xe0\x27\xb5\xaf\x19\x08\x1b\x3a\x88\x83\x2a\x20\x26\x68\x73\x3c\x92\x19\x4e\x8a\xfa\xae\xfc\x5a\xf0\x9f\x39\xec\x75\x7d\xcf\x66\x0f\x2f\x6b\x54\x37\xde\x87\x64\x31\x49\xbd\x29\xb0\xba\x20\x0e\xfa\x53\x7d\x1b\x41\xcd\x62\xde\x26\xf7\x74\x9a\xbb\x9d\xd1\xe8\x3a\xe2\x3a\xbe\x2f\x9f\xb1\xcb\x16\xef\xf6\xf2\x25\x73\x8b\xc0\x9b\x62\x57\x58\x5d\x10\x07\xad\xeb\x10\xd4\x7a\xaf\x8d\x26\x91\x6d\xb4\xd6\x1e\xf9\xb9\xbc\x8e\x28\xab\x43\x6f\x05\x97\xe3\xc4\xdc\xb6\x26\x63\x11\x5a\xf9\x0d\x34\x58\x5d\x10\x07\x55\xc0\xa8\xce\x74\x41\xf6\x20\xa0\xeb\x30\xf7\xaa\x8d\x4d\x36\x9a\xba\xd1\xd8\xe8\xd5\xdc\x6c\x9c\xf6\xf5\xe6\x9c\x37\x07\x97\x8f\xc7\x60\x0a\x80\x38\x78\x0f\x98\xbf\x27\x30\xa0\x39\xfd\x3c\x05\xe6\xaf\x06\xa9\x91\xae\xd6\x10\x3a\x44\x69\x37\xff\xc9\x8f\xf9\xe2\x37\x1f\xd7\x9c\x45\x34\x8b\x76\x5d\xc2\x4a\x7c\x56\x35\x0c\xfe\x4c\x0f\x88\x83\x2a\x40\x1e\xb4\xa6\x3f\xce\x82\x31\xc5\xf2\xb0\x22\xb4\x5f\x1b\x57\x4b\xb2\xfa\x98\x40\x6d\x86\x2e\x4b\x7a\xd4\x17\xdb\xad\x95\xd7\x1a\xde\xdb\x17\xc0\x41\x7f\xaa\x3b\x08\x24\xab\x22\x02\xf4\x4b\xd6\xa3\xb3\x8d\x12\xbf\x5d\x0d\x96\x06\xf2\x87\x2d\x39\xc7\x4e\x7e\xb2\x5a\x39\x78\x7c\x8a\x87\xbf\x06\x0b\xc4\x41\xeb\x2a\x86\x2a\x19\x8c\x22\x6b\xce\xf0\x45\xd0\x94\x15\x86\x68\x56\x4a\x93\x33\x3a\x69\xeb\x72\x7b\xc6\x17\xce\xe2\xb2\xc7\xaa\xe1\xc0\xea\x82\x38\xa8\x02\x49\xb7\x1f\xff\x2e\x99\xa4\xb0\x5f\xfb\xee\x79\x23\x3c\xe6\x4f\xb3\x96\x3d\x92\x21\xcb\x6b\x71\x3c\x27\xc9\xdc\xe7\x9d\xc4\x1b\x68\xb0\x5d\x37\x88\x83\xf7\x7e\x00\x24\x30\xa0\x05\xf6\xdc\xf7\x0f\x67\x12\xd8\x2b\x79\xfe\x98\x1b\x97\xfc\x7e\x87\x2d\x84\xec\xbe\x5d\xc9\x7a\x7d\x42\xe1\xeb\x3d\xc2\xcf\xb1\x9b\xc1\x18\xf1\x9c\xb0\xb1\x83\xb8\x33\xcd\xd8\xd3\x86\xd4\xa5\x98\x65\xd2\x52\xeb\xaf\xde\x4c\x5c\xea\xd5\x1e\x7b\xf6\xce\xbf\x56\x4c\x96\xa1\xe0\x21\xce\xce\xc1\x0b\x29\xf8\x0a\x03\xe2\xa0\xbf\x55\x6d\x2b\xf6\xfd\x54\x03\x4e\xe2\xb0\x4a\x52\x32\xff\x35\xa3\xea\xf1\xe4\x43\x71\xeb\xe6\xba\x52\x52\xc1\x13\x9f\x41\xa9\x58\x78\xaf\x50\x10\x07\xad\x2b\x11\x6d\x7c\xfd\x3d\xad\x2d\xdb\x21\x5e\xca\x25\x5e\xb1\x07\x74\xab\xf9\x38\x47\xe8\xf1\x9e\xd4\xbd\xc9\x2a\xd5\x38\x36\xf9\xd2\xb0\xba\x20\x0e\xea\x40\x17\x95\x44\xe5\x30\xbf\x91\x7e\xf3\x7e\x61\xef\x66\x0a\x1d\x3f\x77\xe2\xcb\xa2\x21\x41\x8b\x18\xaf\xc0\x5a\xd6\x07\xb8\x44\x8b\x30\x07\x40\x1c\xbc\xf7\x03\x20\x81\x01\xed\x76\xce\x73\xa0\x74\x55\xa0\xc1\xb5\x83\x67\xa4\x5d\x71\xef\x8b\xf3\xa6\xfa\x8b\x8a\xae\xfa\xd1\x69\x47\xdf\x66\xb1\x40\xbb\x69\x47\xf9\x49\xf8\x3b\xa8\x41\x1c\xd4\x01\x3e\x61\xf2\x96\x3f\x7e\x5b\xc6\xe8\x27\x6b\x49\x57\xe5\xbd\xc3\x12\x3e\x3e\xe7\x30\xdd\xb5\x89\xb8\xf5\xf6\x97\x35\xc6\x32\x6f\x07\xac\x2e\x88\x3b\xd3\x03\x46\x77\x26\xe4\xab\x73\xb2\xb5\x08\xbd\x18\x36\xbd\xf7\x01\x5f\x0d\xeb\xbb\xb6\x6f\x04\xe5\xe6\x5c\xc6\x76\x0f\x8b\x1d\x1d\x87\xe1\xe7\x95\x00\x1c\xb4\x6e\x66\x7e\xf3\xce\x2c\x87\x3f\x32\x6b\xef\xc1\x01\x13\x77\x67\x82\xcb\x43\x1c\x94\xed\x1f\x95\x4b\xe2\xfa\x3f\xe3\x5d\x95\xa5\xe1\xcf\xa1\x81\x38\xa8\x03\x03\x77\xaf\xd8\xd6\xff\x7f\xcc\xfd\x77\x3c\x96\xef\x1f\xff\x8f\xdb\x2b\x85\x44\xd9\x64\x66\x85\x6c\xb2\x57\x84\x32\xb2\x22\x44\x46\x46\xf6\x4c\x46\xc8\x96\x15\xb2\xf7\x08\x19\x21\x7b\x66\x67\xcf\x50\xd9\x51\x84\x6c\xe9\x77\xfb\x7c\x6f\xb7\xeb\xfc\xf5\x3a\x2f\x9f\x8e\xcf\x1f\xfe\x78\xff\x7f\xbf\x3d\xaf\xeb\x38\xaf\xc7\xf5\x3c\x8e\xc7\x79\x1c\xcf\xe7\x21\xfd\xa8\x8c\x4a\x99\x19\x7f\x47\x00\x7b\x30\x8d\x50\x26\xf2\xe3\x67\x39\x3d\xaa\xc7\x5a\x33\x2c\x93\x17\xa0\xbb\xe8\x41\x1c\x94\x07\x00\x6f\x60\x40\x4b\xcf\xd3\x34\xf0\xc3\xa0\xd6\xe2\xce\x8c\x69\xd4\x53\xe1\xde\x79\xf9\x36\xec\x74\x69\x25\xa9\xcd\x9b\xdc\x1d\x4e\x26\x2b\xbd\x57\x0f\x79\x0c\x31\xa1\xbd\x28\x00\x07\xd7\x40\xf5\x80\x58\x20\x06\xad\x89\xfa\x05\x41\x33\xe1\xb0\x7e\x95\x2c\x9d\xf5\x0a\x8c\x28\xf5\x2a\xd5\xd8\x17\x3e\x7e\xa2\x5f\xc2\xa1\xbb\xc5\x40\x1c\xd2\x39\x28\x3c\x69\xf1\x98\x41\x22\x8f\xc2\xd7\x83\x19\xe3\xc7\xb6\x7c\xcf\x03\x62\xa2\x04\x9b\xbc\xb4\xfa\x1f\x75\xc9\x6b\x76\xde\x86\xfa\x97\x81\x38\x78\xdc\xda\xe1\x9f\xbd\x37\xa9\x5c\x6e\x12\xde\x7a\x31\xce\x2b\xd7\x17\x78\xfb\xa6\x65\x02\x57\x4b\x56\x7e\x92\xf8\xc3\x6e\x8b\x03\x72\x74\x44\x5c\x10\x07\xd7\xc0\x4c\xd2\xf1\x53\xdc\x3f\x8e\x24\x37\xd1\xf7\x4c\x5b\xb4\x51\x52\x5c\xd2\x15\xf2\x36\x24\x70\x46\x3a\xdf\xc5\x0b\xcb\x0a\x37\xa4\x20\x34\x00\xe2\xa0\x3c\xf0\x7f\x7b\x03\x83\x78\x2b\xa0\xd3\xa9\xa2\xea\xaf\x2b\xaf\x61\xbd\xa0\x9f\x2f\x95\xef\xec\x4e\x67\x44\x84\x8b\xf3\x4e\x31\x6b\xd7\x98\x45\x67\x48\x6e\xd2\xe3\xef\xb7\x02\x03\x74\xcf\xb7\xa4\x0f\xb1\x02\x05\x65\xb1\xe6\x1e\x87\x5c\x34\x6a\x16\xd1\x69\xb3\x23\xaa\x7c\xc3\xfa\xa5\x3c\xe3\x8b\xac\xd7\xd4\xdf\x47\x38\x0c\x45\x98\x9b\xf8\x94\x48\xa9\x71\x71\x39\x66\xbc\xce\xb7\xee\x6f\x2a\x37\xf8\xc7\x0c\xb4\xc8\x69\x10\x71\x3c\x17\xb5\x35\x92\x90\xc0\xc3\xfb\x5f\x78\x2b\xe0\x8d\xf9\xff\x36\xb4\xe7\xe8\x28\x98\x7e\x92\x34\xde\xfe\x21\xd2\xde\x48\x6f\x05\xf8\x33\x64\xf6\xc3\x83\x0f\x27\x1b\x3b\x2e\x2a\xc9\xbe\xd4\x1c\x8a\x38\x88\x3b\x50\xc3\xa5\x6f\x90\x21\x5c\xdd\xe3\xf8\x15\xfa\xec\x2c\xde\x0a\xa0\xa8\x20\x95\x8a\xbc\x76\x0e\x8c\xbf\xdd\x96\x3f\xe5\x88\xfa\x2e\x35\xab\xd4\x96\xf6\x28\x76\x9c\x75\x60\x8a\x05\x13\x8f\x4f\x8e\x62\x47\x7a\xf4\x4c\x8e\x0c\x20\xbf\x15\x20\xfa\x30\x45\xe6\x30\xb8\xa6\x22\x55\x13\x4f\xe0\xd8\xd5\xcf\xcd\xbc\x38\x81\xf1\x74\x48\xed\xee\x6c\x91\xd9\xcf\x1d\x9b\x0e\xed\x33\x39\x20\xa1\x89\xf4\xb1\x1d\xb6\x3e\xfd\x72\x94\xc3\x2b\x42\x01\xdb\xd7\x73\x6e\xdd\x8c\x97\xfe\xc3\x6f\x4c\xd1\xc5\x78\x6d\x31\x65\xeb\xf7\x96\x9f\x81\xf2\x99\x8c\x16\xf9\xad\x80\x45\xe8\x64\x15\x25\x8a\x35\xd3\x49\xbf\x87\xd7\x9f\xca\x8e\xcc\xe9\x10\x2e\x2c\x8a\x9a\x7b\xb5\xd4\x14\x22\xc6\x86\x72\x6f\x6d\xcf\xcc\x9e\x83\x34\x74\x5a\x32\x96\xf3\xad\x13\x65\x3c\x4e\xc9\xcf\x7c\x3a\xf7\xa9\xb9\x95\x99\x67\xa5\xaa\xa5\xca\xe4\xc6\x46\xa1\xc0\x52\xa2\xaa\xe5\xf3\x55\xa8\xc0\x12\xc4\x21\xed\x8e\xdf\xcc\x69\x76\xb1\x8f\x56\xa0\x96\x79\x2d\x18\x89\x81\xab\xb1\x42\x22\x64\x68\xd6\xfe\x75\x90\x4f\x15\x45\x23\x93\x61\x0b\x6a\x72\x06\xe2\xe0\x49\x33\x52\xc8\xcf\xfa\xc1\x7c\x57\xb2\xd0\xa6\xb7\x15\x16\x81\xd1\x77\x13\xb5\xb6\xdf\xb2\x24\x65\x6d\x55\xf8\xc6\xaf\xfd\x75\x74\x9f\x21\xe2\x82\x38\x78\x5c\xbc\xd7\xd9\x0b\xb3\xc3\xf3\xaf\x06\x2e\x95\x62\x5c\xe1\xb4\x46\x11\x08\xe0\x59\x97\x21\x79\x72\xcd\xf5\x1a\x3f\x49\x1c\x23\x05\xf4\x9a\x1d\xc4\xf9\x49\x11\xfe\xe7\x39\x98\xdd\x14\x3d\x16\xee\x41\x29\x33\x61\xa0\x3a\xe8\xa4\xfa\xa9\x4c\x4c\x21\xd2\xba\x30\x3c\xf7\xa1\x8e\xa3\x11\x0b\xff\xc2\x1b\x3e\x84\x37\x03\x71\x88\xfe\x10\xde\xff\xb6\xe7\xa0\x3f\xf4\x69\x12\x78\xd5\xbe\xaa\x7a\xe1\x86\x43\x85\x19\xe3\xdb\x00\x13\xaa\xa7\xa3\xe9\xec\xca\x75\xb1\xc3\xe3\x6c\xf5\x0c\x04\xb1\xa3\x99\xd1\xd0\xd5\x30\x20\x0e\x2e\x01\x63\x73\xfc\x41\x33\xa1\x57\xf7\x9d\x36\xb8\x58\xa6\x58\xf6\x2e\x37\x09\x25\xb2\xbc\x46\xd1\x16\xbe\x40\x21\x16\xc5\xf8\xa1\x1a\xba\xfa\x18\xc4\xc1\x7f\x2a\x2a\x67\x12\x3b\xde\x8b\x9a\xc2\x28\xc3\x82\x6d\x44\x03\x27\x8a\x84\xb1\x7f\xac\xbd\xb1\xdf\x97\x85\x6c\xf2\x1c\x4c\x52\x63\x42\x77\xa9\x82\x38\x78\xdc\x6f\xab\x73\x54\x1d\x61\x6b\xdf\xe4\xbe\x64\x5f\xe1\xf5\xd5\xda\xd6\xf0\xed\x76\x0d\x33\x63\x70\xbe\x58\x37\xf0\xbc\xf2\x7d\xcf\x01\xf4\xa6\x0a\xc0\xc1\x25\xd0\x56\x41\xfe\xf6\x64\x1a\x6f\x2a\xc3\xaa\x9b\x4e\x84\xb6\xd4\xa4\x51\x75\x80\x94\xa3\x36\x68\x34\x98\xf3\xc6\xb5\x63\x02\x71\x35\x84\x04\x40\x1c\xd4\x22\x44\xe5\x9f\x12\x00\x25\xd7\xd3\x24\x10\x17\xdb\x1b\xda\x7f\x0e\xe7\x71\x91\xe3\xf2\xb1\x8b\xb1\x8f\xec\x36\x7b\xfa\x2a\x8e\xcf\xaf\x27\x98\x45\x85\xe1\xdd\x87\x75\x50\x09\x3f\x88\x43\xda\x14\xfb\x9c\xac\x90\x6e\xff\xd5\x8e\xad\xbc\xaa\xe2\xcb\x8b\x7c\xe7\x21\x92\x83\xf2\x77\xeb\xd6\xd3\x21\x76\x94\x56\x66\xfb\xe4\x3d\xd0\xa6\x18\x80\x43\x3a\x20\x21\x9b\xd9\xed\x94\x26\x5e\x8a\xc1\x25\x63\x7a\x93\x60\x74\xff\xe3\xc6\x9f\x12\xd1\x24\x65\xd7\x3b\xdd\x57\xfb\x12\x94\x94\x9e\x43\x07\x24\x00\x1c\x3c\x6e\xca\x35\x49\x87\x85\xca\x68\xd3\xd5\xf7\xdb\xe7\xdf\x6c\xa4\x31\xe7\x4a\x4e\xb0\x1f\x65\x76\x04\x04\xf7\x34\x6c\x0d\x0a\x2d\x41\x57\xb4\x82\x38\xb8\x04\x7c\x62\xeb\x2a\x52\x35\xbe\x56\x51\x63\x06\x5c\xbe\x6d\x60\x8b\x2a\x6b\xe0\x51\xdb\xab\x89\x3b\x5f\xf0\x30\x83\xf1\xb9\x62\x3e\x05\x62\x49\x06\xe2\xa0\xd6\x00\x00\x7b\x0e\x9a\xe9\x4e\xd3\x80\xd6\xee\x2b\x5c\x5b\x95\x55\x93\x25\x8f\x88\xf4\x1d\x69\xb5\x3e\x81\x6b\x0d\xfa\x8f\xa9\xc6\x5f\xb2\x46\x92\x6a\x4c\x7a\xc6\x42\x6f\xbd\x40\x1c\x5c\x03\x45\x05\x14\x13\x16\xf3\xf7\x93\xaf\xba\x4b\xef\x3b\x18\x12\xa5\xdc\xa9\x7c\x82\xf7\xac\xa6\x62\x89\xfa\x5b\x83\xb9\x11\x06\x39\x74\x48\x06\xc4\x21\xb5\x87\xc8\x9e\xc1\x23\x42\xfd\xca\xff\xfd\x89\xf8\x0d\x15\x2c\xdc\x05\xfd\x8b\xeb\xec\x5b\x3f\x83\xa7\x52\xbb\xdd\xd8\xbf\x1b\x6a\x48\x42\xed\x21\x00\x1c\xd2\xf9\xab\x8b\x9c\xe2\x5e\x27\x2c\x51\x23\x89\x9c\xd4\xc5\x8e\x1f\xdf\xfa\x11\xf5\xda\xcc\x10\x78\xbd\x95\x8a\x5e\xfc\xd9\x10\xf9\x34\x17\x3a\x7f\x05\xe0\xe0\x1a\xc0\xce\xd8\xe6\x70\xcf\x67\x20\xc5\x33\xcb\xac\xf5\x0d\x22\x67\x62\xef\x10\x49\x0e\x7f\x1e\x4f\xfe\xf6\xb1\x30\x2d\x56\xf9\xc8\x02\x42\x03\x20\x0e\x6a\x0d\xa0\xf9\x6f\x0d\x80\x96\x1d\xa7\x69\xa0\x57\xb0\xbf\x80\x54\xdd\x90\x4e\xd6\x9a\x7d\x69\x43\x9a\x61\xf2\x61\x80\x8d\xb3\x3e\xef\x38\x5a\xad\x11\x2d\x03\x63\xfe\x10\x54\x4e\x04\xe2\xe0\x1a\x10\x93\x62\xc3\x91\xd5\xf5\xdd\xc0\x19\xbb\x7a\x30\x73\x8b\x3e\x80\xc1\x69\x77\x9c\xcb\x7e\x4c\xa0\xe7\x0f\x59\x70\x91\xa0\x78\x11\x22\x2e\x88\x83\xff\x56\xf3\xc9\xe7\xe4\xf2\x47\x95\xf7\x6d\xa4\xca\x43\x7c\x0c\x31\xc3\xdb\xaf\x9b\x6b\xbf\x9a\x1a\x96\xe4\xb2\xb3\x2b\x1e\x6a\x56\x72\x47\xc4\x05\x71\xf0\xb8\x17\xb2\x9e\x59\xa0\x3c\x0f\x34\xd3\xe3\xce\x3e\x74\x14\x99\x77\x33\x19\x8e\x31\x6f\x37\x2a\xb6\xdd\x8e\x96\x65\x3e\xbf\x71\x04\x9d\x95\x03\x71\x70\x0d\x48\xa2\xf0\x3d\xe0\xcf\x34\xe3\xb3\x4a\xf9\xe8\x1c\xdd\xd1\xbe\x32\x22\xdd\x37\x1e\x29\x7c\x5d\x69\x76\xf2\x68\xfc\xda\x94\x88\x24\x54\xa6\x04\xe0\xa0\x3c\xf0\x7f\xb3\xe7\xfa\xff\x6f\x16\xea\xf4\xcd\xf1\x7a\x92\x71\x1f\x4b\x11\x83\x78\x16\xce\x0a\xef\x9b\xdf\xc8\x12\x87\x94\x29\xa3\x5e\xfc\xda\x16\xfa\x84\xa3\x93\xb6\xda\x1e\x6a\x8d\xd8\x68\x06\x71\xc8\x9b\xe3\x42\x2a\xe8\x51\xe5\xd9\xaa\xaf\xa5\x6a\xed\x51\x28\x7c\xbc\xf8\x29\x49\x4b\x09\xea\x2b\xb2\x36\x69\x51\x0d\xd1\xb9\x92\xdb\x52\x11\x91\x41\x1c\xf2\xe6\xf8\xb9\x9d\x4f\x0d\x27\x43\x2d\xaf\x4c\x9e\x67\x5c\x96\xfa\xb5\xa8\xd0\xfa\x64\x70\xc0\x4b\x08\x7b\xe9\x7a\x35\xb5\x4d\x92\x2f\x2e\x25\x22\x32\x88\xf3\x93\x41\x41\xc1\xf8\x4f\x64\xe5\x0f\x87\x64\x3b\x26\xe3\x17\x4f\x4c\x4c\xfd\x65\x84\x95\xd3\xd0\x6a\x34\xec\xe9\xee\xe1\x37\x87\x05\x0b\xa9\xfa\xb8\xdd\x8f\x82\x36\xc7\x47\xb4\xbd\xc6\x46\xd0\x0b\xb9\x88\xa5\xe2\xde\x33\xa1\xe1\xe8\xf9\x2c\x5e\xa2\x78\xf6\xc1\x04\xfd\x64\x08\xe3\x47\x06\x3b\xcf\xbd\xbf\x6d\x30\x51\x5f\x20\xba\xa7\xd6\xda\x3b\x34\xb9\x77\xa8\x17\x86\x5d\xb1\xa4\x25\xaf\x94\x59\x7e\x21\x36\xb6\xd6\xe5\xb5\xe1\x53\x2a\x0a\xf8\x0b\x15\x30\xb2\x6f\x4c\xbc\x26\xa6\x36\xf5\x30\x50\x4c\x94\xb7\x7b\x16\xed\x7a\xbd\xfd\x4f\xaa\xef\x45\x13\xb8\xba\x6f\xd7\x63\xdb\xfb\xff\xd7\x6c\x30\x68\x68\x7f\xd9\xe0\x26\x24\x1b\x6c\x2d\x18\x40\x2d\xf2\x9c\x2a\x41\xad\xb2\x23\x01\x43\x76\xd2\x55\x37\xbd\xc0\xde\xf9\xdc\x38\x9e\xda\x17\xe5\xcd\x7b\xac\x69\xaa\x67\x61\x83\x25\x90\x6c\xb0\xfc\xdb\x7e\xff\x1e\xe6\x70\x09\x3c\xbb\x36\xe2\x1f\x33\x92\xa3\x8f\x0e\x93\x7c\x43\xfb\x19\xb8\x27\xbe\x52\xd3\xba\x92\x63\xfd\x3a\x93\x7d\x5b\x64\x1b\x2c\xf7\x46\x28\x34\x4b\x8c\x13\x2f\xbf\x20\x57\x37\xcc\xd6\xd6\x3f\x66\xbb\x3f\xa7\xf5\xf3\xa8\xcd\xc2\x45\xe3\x4c\x2a\x37\x3f\xb6\x33\xd9\xa5\x46\xb6\xc1\x59\x7c\x47\x91\xed\xae\x6e\xcf\x69\x0c\xad\x27\xf3\xf9\xe8\xda\x8a\x16\x5e\x09\x68\xf9\x2a\xa7\x1b\xf0\x96\xd0\x85\x0e\xfc\x38\x93\x62\x8c\x26\x64\x1b\x3c\x9f\x5e\xbb\xa6\xed\x51\xa0\xe4\x4b\x54\x64\x10\x78\xf8\xcc\x22\x59\x4f\xe5\x32\xc3\x15\xf2\xd9\x0c\xf2\x39\x77\xb6\x62\x41\xbe\x33\xb3\xc1\x20\x0d\x9d\x36\xf1\x3d\x1b\xf8\x46\x28\x47\xe1\x66\x50\x36\xa6\x80\x39\xf5\xc3\xd1\x26\xe1\xc6\x91\x7a\x0f\xb1\xcb\xd8\x5d\xa3\x60\x55\x69\x7e\x5e\x6f\x44\xc2\x07\x71\x48\xbd\xb1\x70\x47\x15\x5e\x36\xe3\xcc\xd3\x6c\x3c\x9b\x0d\xba\x4b\x5a\x65\x76\x4d\x7a\xa6\x4e\x0c\xbb\xa3\xc9\xb4\xbc\xfd\x11\x57\x22\x74\xef\x20\x88\x83\x4f\x50\x23\x8b\x26\x6d\x95\xdb\x62\x78\x3d\xce\xbf\xbf\xdd\xc4\x59\xbc\x71\xf7\x8e\x38\x76\xe4\xc7\xca\x99\x04\x46\xa6\xe2\x60\xd2\x98\x8f\x88\xb8\x20\x0e\xc9\x06\xef\xa4\xa5\x1d\xbd\xd1\x78\x49\xf8\xa4\x85\x3a\x48\x4a\x11\xe5\x31\xd1\x5b\xbf\x5e\x7a\xfd\x27\x0d\x0c\xaa\xde\x87\x52\xc2\xd0\xe9\x38\x10\x07\xbf\x6f\x4c\x31\xf5\x65\xd9\xd8\xe3\xcd\xac\x4a\xce\x94\x2c\x39\xdd\xfe\xf4\x7c\x95\xa9\x4f\x07\x77\xa8\x3b\xb6\x67\xae\xfb\x7f\x93\x96\x85\xca\xf4\x41\x1c\xa2\x4c\xbf\xe9\xdf\x36\x18\xf4\x87\x3e\x4d\x02\x2f\x26\x0c\x9f\x3b\xdd\xdc\x10\xaf\xa1\x74\x09\xaf\x52\xf4\x5b\xfa\x58\x8f\x89\xeb\x7c\xb8\x70\xd5\xd3\x03\x5b\xf8\xe9\xce\x03\xe8\x4e\x19\x10\x87\xb4\x3d\x75\x51\x4a\x63\x4c\x9f\xe4\xa8\x30\x95\xc7\x4e\xb9\x6e\xc6\x39\xe5\xfc\x91\x0c\x11\x9d\xda\xb5\x78\x26\x03\x8c\xee\x0c\x69\x6a\x68\x7b\x0a\xc0\xc1\x7f\xaa\xe9\xf2\x5f\xcb\xe4\x32\xde\xf1\xe8\x27\xa8\x25\xf6\xee\xeb\x85\x0e\x2f\x3f\x9e\xa7\x24\x57\xfb\xd3\xb9\xf0\xe4\x5a\x28\xca\x3b\x33\x44\x5c\x10\x07\x8f\xdb\x48\xed\x90\xdd\x12\x71\xff\xcb\xbc\x97\xd5\xd1\x61\xa8\xde\xb8\xd6\x7c\x66\x2e\xd7\x79\xa7\x95\x15\xc5\xa7\x97\xe4\xf5\x62\xa0\x2b\x2d\x41\x1c\x5c\x02\x98\x99\xdb\xe5\x6e\x04\xdc\x24\x53\x6f\xef\x5c\xc1\xee\x27\x2c\xef\x1a\x8b\xbd\x9f\x42\xaa\xaf\x11\x13\x5d\xe1\x6d\x2b\x90\x5c\x81\x90\x00\x88\x83\x3a\x35\xfc\xdb\x06\x83\x92\xeb\xa9\x75\x02\xf1\xe6\x58\x3c\xbb\xcc\xcd\x66\xa8\x28\xd3\x8c\x5e\x2d\x3a\x8c\xb2\xa1\x65\xda\x89\xa9\xd4\x8c\x12\xea\x01\x24\xd8\x29\x46\x50\x9d\x00\x80\x83\x4b\xe0\x7c\x25\xd3\x4c\xa6\xbb\x56\x4a\xe1\xf7\x5e\x91\xcf\x33\x47\xda\x0b\xaf\x56\x51\x9e\xd8\xd2\x73\xf9\xe7\x8a\x54\x0b\x9f\x77\x84\x6e\x93\x00\x71\xf0\x9f\xca\x06\x9b\xde\xb8\xcf\x45\xaa\x37\x3e\xe7\xb7\x53\x82\xe7\xad\x99\x7b\xaa\x9f\x3f\xc7\x7d\xb5\xc5\xaf\x64\x14\x4b\x8d\xf0\xd9\x80\xce\xaa\x80\x38\x78\xdc\x8e\x7a\xbf\xab\x46\xa6\xe1\x3d\x81\xc4\xef\xca\xf6\x6e\x60\xc5\x1b\x8b\x5c\xf5\x1f\x2e\x15\xbe\x50\x86\x7f\xf8\x92\x5e\xb7\x52\x1b\x11\x17\xc4\xc1\x25\xf0\x91\xec\x9e\x88\x9e\x53\x1f\x9a\xe7\xa0\x9a\x31\xae\xb4\x63\xb4\xe4\x6b\xdd\x88\x32\x34\x77\x2f\x05\xcc\x25\xcd\xee\xb4\x23\xe8\x76\x40\x10\x07\x55\x68\x03\x6c\x30\x68\xa6\x3b\x4d\x03\x93\xad\x9a\xc6\x2e\xaa\x09\x7b\x51\x2f\xdc\x17\x69\xdd\x17\x32\x0d\xae\xcb\x66\xb1\xe3\x8e\x8f\xe2\xcf\x92\x97\x90\xa8\x0f\x09\x21\xc6\x0e\xe2\xe0\x1a\x78\x89\x3a\x16\x5e\xca\x49\xd3\x4d\x50\xa5\xf9\x40\xec\x9c\xd7\xc1\xc6\x54\xc8\x33\x53\x6a\x43\x9f\xd8\xb7\xce\x37\x6c\x6d\xb4\x2c\xa1\xd6\x3a\x00\x0e\x69\x77\x6a\x91\xe2\xfb\xeb\x82\x88\x88\x72\x3d\x9a\x32\xfc\xe5\x5e\x93\x00\xbf\x7d\xbe\xed\x37\xa2\x31\x17\x4b\xe3\xf7\x23\x9e\x52\x40\x8d\x60\x40\x1c\x3c\xae\x5e\xc8\x9d\xab\xf7\x3b\x30\x79\x18\x0b\x3a\x45\x84\xd1\x94\x0d\x89\x86\xbf\x8d\xdc\x74\x73\xf3\x0c\x19\x49\x51\x99\x7f\xdf\x75\x07\x11\x17\xc4\xc1\x35\x90\xbe\xd8\x19\x7b\x5f\x39\x44\x52\xbe\x0f\xaf\x8d\xba\xc5\xfc\xe8\x40\xc7\x24\xe9\x8b\x22\xb5\xeb\x0c\x97\xf3\xb9\x20\x9d\x39\xa8\x53\x26\x88\x83\x2a\xb4\x01\x36\x18\xb4\xec\x38\x4d\x03\xdb\x0c\xdd\x79\x46\x21\x18\x1e\x65\x9f\x46\x1e\x3e\xea\x73\xfa\x3d\x5a\xd0\xc1\x6a\x34\x19\x79\x45\x84\xdb\xee\x5a\x00\xc7\x44\x31\x62\xec\x20\x0e\xae\x81\xab\xd7\x4b\x66\xfd\xe2\x9d\x9e\x31\x4d\xae\x0f\xd2\x5c\x90\x9c\x27\xaf\x59\x9e\x18\x71\x5d\x4a\x0f\x6e\x5b\xae\xb0\x18\xc9\x84\x5e\xb1\x80\x38\xa4\xd7\x61\x99\x87\xf3\x3b\x4e\x1e\x23\x6d\x12\x54\x7b\xdf\x64\x2e\x7d\x1c\xaf\xef\xad\xaa\x15\xd7\xf1\x97\x0e\xbc\xfe\x60\x5f\xa1\x0a\xd2\x2c\x88\x83\xc7\x5d\x6e\x70\x5d\x5c\xc9\xd2\xd9\x57\xfd\xf5\xa9\x60\xb6\x64\x9c\x7e\xd2\x5b\x8b\x62\xd1\x30\xeb\xbd\xb9\x50\x40\xe8\x34\x9d\x09\xd4\xb1\x02\xc4\x21\xdd\x44\x7d\x92\xe0\x5e\xb1\xaf\x27\x6a\x66\x60\x1a\x8c\xa2\x85\xdb\x5c\x50\x93\xd2\x5a\xfe\x13\xab\x00\x05\x6f\x1f\xd3\xbb\x47\x3d\x1b\xaa\xd2\x07\x70\x50\x1e\x00\xd8\x60\x90\x85\x3a\xdd\x06\xab\x0f\xe6\x4d\xce\xf3\xe8\x96\x9a\x2d\x74\x34\x7d\xa6\x16\x6f\x7d\xe7\x56\x84\x59\x27\xe5\x68\x18\x62\x11\x85\xff\x79\x9e\x59\x10\x61\x29\x41\x1c\xb2\x0d\x2e\x8e\xf6\x5b\x30\x69\xd4\x7d\xf2\x20\x4e\x41\xe5\xdd\x93\xc1\x04\xee\x7c\x7c\x1e\x55\x32\xda\x87\x16\xab\xba\x16\xee\x09\xaa\x04\x88\xc8\x20\x0e\xd9\x06\x63\x95\x65\x4e\x58\xbf\x33\xcf\xa5\x8c\x98\x39\x09\xf6\xa9\x97\xcc\xdd\xad\x3c\x6f\x93\x88\x26\xb8\x43\x79\x3f\xab\x0b\xa3\x6e\x16\x11\x19\xc4\xfd\x1f\x1b\xfc\xdf\x57\x17\x03\x3b\xc7\x2d\x3b\x05\x92\x62\xef\x18\x17\x45\x09\xf0\xef\x7e\x25\x2f\x96\xe0\x5b\x74\x29\x26\x7a\x73\x93\x84\xf9\x77\xc3\x7b\x4a\xc8\x06\xe3\xe5\xf9\x1d\x29\x29\xf2\xe2\x5f\xde\x89\x92\xee\xa5\x51\x1a\xce\xb8\x37\x38\xb2\x1f\x74\x71\x5b\xee\x67\x7a\x1b\xbf\x93\x78\xf5\xdf\x36\x98\xa3\xaf\xad\x1a\x7f\xa9\x17\xeb\x86\xee\x32\xa7\x2f\x76\x63\x8d\xc9\x0a\x75\x58\x7f\x22\x11\x07\x21\x7d\xc3\x1b\xfd\x58\xf3\xe5\xbf\x50\xf4\x98\xe6\xd9\x7b\x96\x45\xe2\xfc\x52\x57\x66\x69\x26\x30\xb5\xc7\x48\x14\x16\xad\xad\x7f\x0d\x58\x3c\xc7\xf7\x1e\x2a\x19\x62\xfa\x5f\xb3\xc1\xa0\xa1\xfd\x65\x83\x51\xa4\xe1\x5e\xe9\xe3\xaa\x6e\x51\x75\x52\xcc\x73\xbd\xcd\x07\xd7\x9a\x99\x9f\x90\xa1\xdd\xcb\x20\x8e\x9b\xc8\x6b\x75\xe3\x72\xe6\x29\xe3\xbb\x5b\x77\x16\x36\xd8\x1b\xc9\x06\x8b\x0c\xff\x48\x9d\xdb\x62\xcc\xd2\x2e\xd9\xb8\xdf\x50\x5f\x4e\x2c\xf1\xf4\x81\x26\x86\x47\x4b\xd8\x03\xd7\x6c\x26\xdf\xb5\x86\xa6\x33\xd9\x96\x15\x46\x32\x86\xc5\x01\xe8\x21\xde\xdb\x52\xfd\xdf\x19\xdc\x0b\x9f\xca\x96\xb6\x7d\xa6\x0f\xe9\x72\xfe\x5d\x77\x32\x76\x45\xd4\x1b\x15\xdb\xeb\x2c\xee\x44\x95\xf1\x46\xb6\xc1\x62\x29\xb4\xec\xaa\xe6\x94\x51\x3a\x87\xaa\xf7\xde\x0b\x71\xde\x94\xd1\x7f\xcf\x49\x97\x2a\xd2\x48\x7a\xc5\x65\x52\x35\x44\xd1\xf0\x4c\x46\x6b\x87\xf4\xb1\x34\xef\x23\x4f\xb4\x2f\xe7\x5a\x5f\x90\xa5\x69\x4b\xdc\x89\x9c\xfc\x69\x60\xa3\xeb\x34\x4d\x61\x8e\x8f\xfb\x6a\xa2\xc3\xee\x44\xec\xcc\x6c\x30\x48\x43\xa7\x4d\x7c\x6c\xa9\x87\x19\x0b\x4d\x83\xa9\x1c\x04\x06\x69\x84\x7e\x19\xa3\x4a\x77\xc7\x54\x89\x31\xcb\x52\x2d\x1a\x6c\x45\x9b\x5e\xa7\x42\x0b\x60\x10\x07\x9f\xf8\xe2\x39\xf6\x0c\xef\xbc\x18\x11\x8e\xa6\xe3\x9d\x48\xfb\x79\xdd\xe0\xf8\x03\x56\xfa\x1d\xac\x8f\xaa\x07\x99\x9f\xe9\xd3\x04\x56\x97\x11\x71\x41\x1c\xd2\xbb\xfa\x6b\x42\x0a\x0a\x22\x06\x41\xec\xfb\x75\xcd\xb6\xf5\x7c\xbf\xbe\x45\x34\xa3\x4c\xff\x21\x97\x73\xc4\x39\x50\x08\x24\x54\x4e\x84\xde\xd5\x03\x38\x78\x5c\xca\xb4\xe7\xd9\x21\x24\xba\x61\x3f\xad\x51\x2d\x04\x0e\xb6\x45\xeb\xec\xea\x8d\x6e\xbc\xd5\xa6\xff\x8e\xaa\x9b\xa3\xa7\xf3\x1d\x5a\x00\x83\x38\x3f\x29\x14\x9c\xff\x7c\xdf\xee\x45\xa9\xf4\xf3\x05\x3c\x7a\x8e\x3e\xfb\x98\x5f\x44\xb7\xc6\xe5\xdf\x34\x3d\xb2\xd7\x70\x0d\xe2\xd0\xa8\x7f\xe7\x29\x16\x8e\xf0\x40\x20\x0e\x2a\x97\x97\xfe\x77\x8d\x24\xe0\x0f\x7d\x9a\x04\x72\x5c\x1c\x9b\x16\xf8\x9c\x16\x8c\x04\x0d\xdc\xd8\x67\x77\xf3\x70\xa4\x35\x6f\x75\x14\xd6\x98\x7a\x62\xaa\xe0\xbb\x85\x69\xf5\x22\x86\x0e\xe2\x90\x3a\x95\xd9\xda\x04\xac\xe9\xbe\x0d\x4a\x9e\x4d\x6f\x28\x45\x53\xbd\x74\xd5\xf7\x1e\xbd\xaf\x7a\x04\xe5\x4f\xde\x0d\x4d\x06\x15\x5e\x28\x2e\x88\x83\xff\x54\xaa\x53\xef\x85\x63\xf7\x36\x5f\x51\xa6\xcc\x8b\x2a\x12\xf5\x32\x0d\xde\x9d\x3e\xe0\x8d\xa7\xc8\xff\xe5\x14\xf1\x43\xc9\x81\x7f\x0d\x11\x17\xc4\xc1\xe3\x0e\x34\xb7\x93\xd5\x1f\xfd\x66\x74\x7e\xba\x6b\x52\x56\x88\xba\x16\xd2\x70\x2e\x58\x2f\x5a\xf2\x65\x29\x55\x23\x59\xdb\x10\xcf\x00\x54\xd3\x09\xe0\xe0\x12\x78\x5a\x1b\xb0\x6d\x9e\x7b\x3f\x4f\x6a\x7e\xab\x39\xed\x41\x71\x59\x5d\x77\xb2\xee\xb8\x63\x6c\x80\xca\x07\xb1\x94\x32\xed\x39\x11\x84\x04\x40\x1c\x54\x2e\xff\x6f\x1b\x0c\x4a\xae\xa7\x49\xe0\xab\x64\xe7\xd0\xc6\xe8\x43\xa7\x57\xd2\x6d\xa6\x2d\x0c\xf4\x2f\xd6\xf4\x06\xa2\x30\xbf\x92\x2f\x2f\x37\x96\xb4\x6c\xdf\xef\x0b\x42\x0c\x1d\xc4\x21\x5d\x18\xe1\xf6\xd4\x51\xd2\xc8\x92\xdb\x9a\x6c\x0b\xbf\x5b\xc7\x96\x1f\xcd\x82\x77\x2a\x0b\xbd\x3f\xce\xd5\x54\x7a\xc7\x98\x21\x1e\x3a\x6b\x02\xe2\xe0\x3f\x15\x01\x51\x2e\xc6\x22\xd6\xc2\xf3\x1b\xda\xd5\x9b\xf4\x6f\x5b\xe3\x54\x30\xdf\xec\xa9\xbc\xb2\x46\x15\xb5\x18\x91\x2d\xd3\x6c\x86\xbe\x2f\x88\x83\xc7\xdd\x0a\xe1\xa3\x47\x19\x8a\x08\xec\xed\xbc\x18\x7c\x75\xab\x69\xfc\x43\xd5\xbe\x48\x75\x3c\x3a\x9a\x14\x2b\x41\x8c\x57\xcd\x02\x64\x81\x40\x1c\x5c\x02\x72\x0d\x6f\x1b\x7e\xd3\x76\x1a\x6f\xf2\x7a\xf5\x2c\x05\xd3\x62\x37\xed\x8c\x0d\x2c\xbd\x0f\x79\xc4\x5e\xb6\xe9\x2f\xad\x92\x5e\x89\x58\xfe\x82\x38\xa8\x4c\x56\xf8\xdf\x16\x08\x34\xd3\x9d\xa6\x01\x34\xf9\xb5\x0b\x37\x6d\xf3\xa2\xf6\xf0\x2e\x0a\xa1\x75\xbb\x2d\x4e\x4b\xa6\xe9\xde\xd5\xa2\xdd\x34\xf8\x9a\x78\x49\x9e\x7f\xfb\x0d\x62\xec\x20\x0e\xae\x81\xeb\x22\x5a\x91\xa2\x9c\x2c\x76\x56\xdf\x89\x76\x0d\xcc\x0b\xe4\x9d\xf7\x4e\x84\x63\x18\xf5\x52\xb3\x7d\xaf\xe7\x7f\x13\x38\xba\x84\x88\x0b\xe2\xe0\xbf\x95\x44\xfd\xd3\xc6\x1a\xd5\x96\x9e\xa9\xca\xd6\xb4\x65\x59\x8e\x62\xbc\x62\x93\xdc\x54\xf5\xe4\xe5\xb2\x77\xea\xe8\xf5\x9d\x91\x87\x88\xb8\x20\x0e\x1e\xd7\x91\x4b\xf4\xf1\x20\x3b\x46\x3f\xde\x9b\xa3\x8e\xa1\x39\xe6\x8c\xb4\x61\x52\xc6\xda\x64\xe3\xd8\x83\xa4\x67\x21\x6b\xb7\x77\xa1\x0b\x3b\x41\x1c\x5c\x03\x78\x2e\xf7\x79\x79\x5d\x8b\xa3\xee\x70\x73\x5e\x75\xb5\x31\xa5\x1b\xd1\x6f\xfd\x5a\xe4\x30\xd4\xa0\xdf\xe0\xf2\xad\x26\x54\x4b\x1d\xa1\x01\x10\x07\x95\xc9\x02\x6c\x30\x68\xd9\x71\x9a\x06\x1e\x11\x47\x68\x53\x90\xa4\xf8\xb5\xbd\x2c\x2f\x50\x13\xa1\xed\xdd\xdf\x33\x18\x1a\x60\x2c\x5d\x58\x76\x2d\x49\x43\x0d\xc5\x76\x44\x8c\x1d\xc4\xc1\x35\x90\xe6\x65\x5a\x4f\x24\x3b\xb0\x45\x70\x6e\x3f\x31\x4c\x90\x47\xbb\xd0\xff\x4f\x74\xdb\x70\x83\x87\xed\xed\x7e\x01\x0c\xef\x17\x1c\x88\xb8\x20\x0e\xfe\x5b\xf9\x77\x09\xdd\xd3\xd4\x23\xbb\xd2\xc1\xcb\x1c\x1f\x5d\xaf\x27\xa8\x2c\x39\xd6\x64\xb3\xdb\x38\x4c\xd5\xe6\x4d\x1c\xcc\x83\xd7\x07\x9d\x36\x01\x70\xf0\xb8\xa9\x15\x32\xa5\x97\xac\x2e\x7a\x3e\x64\xe6\x7b\xf0\xb0\xfa\xc0\xc2\xef\x37\x6f\xa8\x76\xb8\x32\x0d\x55\x47\xbe\x23\xb9\xf4\x43\x68\x35\x00\xe2\xe0\x1a\x40\xf5\x27\x92\xd5\x2e\xff\x91\x8c\x73\x94\xfe\xb9\x85\xa6\x3b\xf0\x5d\xde\x9e\xfb\xbb\xbd\xa9\x6c\x16\xed\x63\x7f\xff\x5b\x11\x98\x08\x0d\x80\x38\x28\x0f\xd8\xfd\xdb\x06\x83\x2c\xd4\xe9\x36\xf8\x09\x4f\x16\xf9\x50\x50\x52\x7e\x8e\x07\x89\xf6\xbb\xf8\x75\x0f\xc3\xfc\x96\xfd\x03\xf1\x3e\x5f\x9f\xc1\x09\xd5\x63\x75\x16\x49\x84\xa5\x04\x71\xc8\x36\xf8\xe8\xf0\x63\xdb\xb8\x26\x8f\x6a\x8d\xc5\xdd\x27\x89\x15\x8c\x41\x45\x73\x85\x46\x3c\x98\x45\x7b\x61\x9f\x79\x28\x88\x1f\x05\x40\x36\x18\xc4\x21\xdb\xe0\xb2\x45\x5a\x6c\x2e\xa7\x26\xf6\x50\xef\x44\xb3\x36\x92\x5b\x37\x2e\x8e\x4f\xd9\x33\xf7\x60\x93\x2a\xa5\xea\xac\x39\x70\x67\x51\x20\x22\x83\xb8\xff\x63\x83\xff\x7b\xc1\x43\xe6\xd8\xb7\x22\x81\x25\x8d\x0a\x32\x87\x9c\xf3\x2a\xb7\xbb\x5f\x79\x46\x7f\x2e\xbc\xe9\x69\xb1\x93\x40\x4f\x56\x7c\xef\x4a\x89\x2a\x64\x83\xb1\xa4\xbf\xe4\x27\x4a\x36\x49\x3d\x16\x9d\xfb\xfd\x47\x38\xf1\xba\x6f\xc0\x66\xfa\x79\x42\x05\xc3\xe4\x85\xc1\xc5\x22\xf5\x84\xcf\x7f\xdb\xe0\xe1\xd9\x8b\x8b\x6d\x3b\x24\x57\xdd\xb2\xd3\x1d\xa8\x98\x9a\x7e\xed\xb7\x63\xcd\xb2\xeb\x5e\xf0\xba\x36\x53\x87\x79\x58\xa2\xf8\x77\xa9\xb4\xac\x30\x9d\x4d\xf4\xec\xe4\xb8\xe9\x52\x4b\xb6\x2b\x61\x85\xcd\xae\x6e\xd8\xb0\x35\x7b\xed\x81\x3a\x0b\x6e\xbc\xf9\xaa\xc7\xe0\xff\x9a\x0d\x06\x0d\xed\x2f\x1b\x2c\x81\x64\x83\x03\xc9\x86\x9a\x86\x78\x7c\x16\x72\xc5\x8d\x1b\xf4\x2f\xee\xbb\xa1\x09\x65\x05\xba\xf8\xd9\x54\x8b\xe8\x88\xbb\x29\x7a\x61\xe8\x9f\x85\x0d\x6e\x42\xb2\xc1\xd8\xae\x2b\xcf\x07\x88\xe2\x43\x8b\x52\x5c\x5d\x2b\x8d\xef\x07\xf2\xd5\x4f\x9a\x1d\x2f\xe8\x70\xce\x35\x4b\x17\x76\xa7\xfc\x39\x93\xdd\x60\x09\x64\x1b\x4c\x54\x45\x30\xec\x8f\x99\x4c\xc5\xdc\xe1\x3e\x9d\xe6\xf1\xf1\x79\xae\x98\x05\x77\xf5\xd2\xf5\xde\x38\x56\x8e\x37\xcb\x61\xaf\x76\xce\x64\x5b\x16\xd9\x06\x4b\xb1\x5f\x12\xc1\x10\x49\x7d\x26\xc7\xa9\x69\x84\x69\x1c\x2d\xd7\xec\x17\x3c\x7f\xce\x81\x9a\x27\xa1\x45\x18\x8d\x86\xee\x53\xdf\x99\x8c\x16\xd9\x06\x8b\xb0\xe2\x9b\xf4\xbf\xdc\x7a\xea\x5d\x12\xca\x75\xab\xae\xda\x5f\x3d\x35\xa9\x02\x6b\x8a\xb8\xcc\xcd\x2e\x84\xf5\x87\x0f\x45\xf1\x99\xd9\x60\x90\x86\x4e\x9b\xf8\x56\x03\x3b\x73\xcb\x97\x32\xaa\x32\x68\xaa\x62\xee\xf4\xac\x39\x49\x15\x39\x58\xc5\xeb\xd5\x7e\x79\xba\x42\xf7\xf2\x9a\x2c\xdd\x34\x22\xe1\x83\x38\xf8\xc4\x57\x31\x48\x47\xfc\xb9\x42\xbc\xed\xd5\xc9\x8f\x3a\x9c\x63\x46\xb5\x50\x26\xa2\x1c\xd9\x58\xe1\x02\xb9\x1a\x2a\x0e\x9f\x07\xd1\xb1\x88\xb8\x20\x0e\x69\xcb\x8e\xa6\x80\xa1\x4e\xb6\x6f\xa6\xaa\x65\x77\x3c\xae\x9a\x6d\x6c\x93\xd0\xea\x62\x0d\xfb\x4e\xa0\x02\xd3\xf8\x2b\xc7\x2b\x3f\xa0\x3d\x00\x10\x87\xd4\xfd\x95\x8b\x3c\xbf\x52\xaa\x8d\x3b\xf6\x05\xd9\xe7\xc8\x5c\xb9\x58\x1d\x1b\x71\x9d\x47\xe7\x1d\xee\x89\xa4\xf3\x2e\xa4\x10\xe5\x40\xb7\x35\x83\xb8\xff\x33\x41\xfd\xc7\x08\x1c\xd6\x91\xef\x2a\x33\xd7\x3e\x12\xb8\x7d\x53\xd6\xe1\x8d\xbc\x56\x45\x7b\x63\xec\x9c\xe0\xe5\xca\x1a\x51\x79\xb9\x51\xce\x6a\x84\x07\x02\x71\x50\xcd\xf2\xbf\x6d\x30\xe8\x0f\x7d\x9a\x04\xda\x03\x93\xeb\x66\x55\x52\x67\xea\x25\xf9\x5c\xaf\x60\xd1\xbe\xa3\xe8\xb5\x48\x6d\x2f\x9a\xbb\xc1\xdb\x69\xf8\xb6\xf1\xd9\x13\xa8\x51\x35\x88\x83\x4b\x00\x93\x7e\x39\x65\xb8\xf1\x4d\x07\xea\xf4\xfe\xe0\x17\x82\x29\x77\xc2\xf9\x5b\xdd\x57\x22\xaf\x98\xe0\xdc\x29\x27\x9f\x93\x2e\x84\x5a\x70\x81\x38\xa4\xf2\xf2\x5f\x73\x47\x68\xb6\x51\x63\xf1\x2f\x71\xc8\xb9\x12\x31\x1d\x03\x65\xc5\x1c\xaa\x72\xd2\x49\x2c\xab\x3e\x19\xde\xee\xda\x0a\x81\xca\xcb\x01\x1c\x3c\x2e\x9d\x1f\xbb\xed\x8a\xd6\x50\x2d\x95\x1a\x61\x67\xce\xcd\x3a\xd9\x81\x2f\x6f\xc9\x75\x2a\x9f\xc5\x66\xdf\xc9\xf3\x88\xd2\x3f\x0f\x6d\x31\x82\x38\xb8\x04\xdc\x18\x7f\x52\xd1\x31\x44\x12\x17\x94\xd9\x9d\x77\x15\x26\xfb\x11\xcb\x4c\xfb\xac\xe2\xfd\x5c\x5f\x2c\x2b\x75\x0f\xf1\xbe\x17\x23\x42\x02\x20\x0e\xaa\x59\x06\x1c\x8a\x06\x24\xd7\xd3\x24\x50\xcd\xd2\xc9\xfa\xab\x93\x8b\xed\x87\x7f\xab\x6e\xcc\x33\xdd\xc2\xb5\x48\x73\x36\xd4\x09\x13\xdd\xc9\xe1\xa7\x61\x96\xb5\x36\x5e\x50\x3d\x19\x80\x83\x4b\x80\x9d\x2d\x47\x8c\x8f\xc7\x7e\x4f\xad\xf2\xa5\x6b\xb6\x6b\x20\x6f\xd4\xa1\xf5\xd5\x3b\x37\x7c\xd7\xd0\x5f\xa6\x59\x6a\x73\x18\x40\x2f\xc3\x40\x1c\xfc\xa7\x32\x61\x59\xee\xe4\x66\x3f\x48\x4b\x94\xad\x50\xf8\x13\x40\x30\x36\x25\x6a\x90\x50\xd8\xc6\x1c\x49\x30\xd0\x27\x3f\xd8\x61\x0c\x9d\x09\x01\x71\xf0\xb8\xac\xa5\x2b\x9e\xa5\x09\x33\xdd\x53\xc9\x3a\xe2\xe1\xda\x53\x09\xb7\x6f\xba\x1d\x36\x25\xcb\x47\xa5\x4e\xd2\x7c\xa6\xa3\x5b\x82\xde\x84\x80\x38\xb8\x04\xbe\xda\x72\x47\xb4\xef\xa6\xcd\x04\x13\x9d\x13\xd3\x41\xdf\x38\xaf\x4f\xe2\x96\x54\x5c\x90\x34\xf2\xb8\x79\x38\xa0\x5d\xa0\xd9\x1b\xb1\xfc\x05\x71\x50\xad\x22\xc0\x06\x83\x66\xba\xd3\x34\x80\xbb\xfd\xdb\x9a\x96\x89\xfe\xc8\xab\x1d\xd5\x49\x20\x93\xec\x0e\xf5\xab\xb7\x38\xea\xb7\xf7\xbc\x85\xe2\x1b\xb5\x82\x32\xf0\xa1\x03\xa6\x20\x0e\xae\x81\xc5\x5e\xe2\x5f\xb3\xc7\x6d\xcf\x03\x0b\xe4\x2a\x7f\x4a\x68\x61\x9c\x8c\xf7\x6f\x9d\x53\x20\xbb\xc3\x4f\x11\xef\xdf\xfc\xb6\x0d\x7a\xb5\x00\xe2\x90\x76\xec\xac\x69\x08\x19\x1a\x63\x71\x3a\x72\x5b\xc4\x88\xcc\xc2\xa8\x42\x49\x09\xbb\x94\xb1\x5a\x29\x33\x93\xe7\xa7\xac\x7a\x59\xa0\x2e\x54\x20\x0e\x1e\xb7\xad\x77\x3f\xa8\xea\xc2\x1d\xcb\xf5\x70\x62\x51\x81\xeb\xbb\x2f\x13\xfb\x59\x9b\xdc\xb5\xbc\xe9\x57\x5d\x4c\x74\x35\x16\x6e\x2a\x22\xe2\x82\x38\xa4\x34\xc0\xdd\xce\x13\xa1\x53\xa3\xc3\xee\x81\x6b\x56\x12\x4f\xf8\x48\xd5\xfb\xca\x6a\xf8\xe2\x87\x43\x5e\xc9\xdf\x84\xa2\x8b\x6f\x5e\x20\x34\x00\xe2\xa0\x5a\x45\x80\x0d\x06\x2d\x3b\x4e\xd3\x40\xf7\xca\xbe\xd0\x90\x40\xa5\xfd\xa8\x88\x44\x1e\x46\xdf\xf3\xc9\xa2\x9b\x92\xbc\xde\xd5\xbb\x34\xed\x13\x13\xcc\x27\x2b\xd5\xd0\xae\x2d\x88\x83\x6b\xe0\xfe\x87\xe9\x2f\x18\x1b\x91\xd7\xbd\x79\xe7\x50\x70\xb3\xcd\x27\x67\x06\xb4\x73\x2e\x61\xd5\xd8\x0c\xd7\xae\xef\xd2\xe3\x61\x43\xaf\x2c\x40\x1c\xfc\xb7\x42\x49\x10\x9e\x94\x2c\x1d\x2e\xac\x68\x16\x1e\x20\x76\x67\x3a\xd9\xd4\x32\x6f\x5c\xb5\xf2\x71\x22\xea\x96\x5b\xe3\xfb\x25\x0e\x75\xf6\x02\x71\xf0\xb8\xcc\xd5\xf6\x18\x68\x43\x7e\x79\xfe\xc5\x8f\x9a\x3e\x45\x7c\x68\x72\x48\x5f\x8f\x92\xb9\x7d\x7e\x22\xad\x9a\xfb\x7d\xe8\xc7\x24\xa8\x67\x3b\x88\x83\x6b\x20\xc0\x69\xa5\x4b\x43\x90\x2a\xee\xd9\x15\xa3\x50\x43\xfb\xec\xb4\x34\xbe\xf1\x0d\xcb\x84\xd0\x73\x12\x2f\x8b\x5f\xf8\x14\x6c\xcd\x23\x34\x00\xe2\xa0\x3c\x00\xb0\xc1\x20\x0b\x75\xba\x0d\xe6\x53\x15\x88\xbf\x1a\x5b\x7b\x62\xb7\x25\x40\xc8\xe2\xf8\xfe\x51\xbe\xad\xf3\x83\xe7\x01\x35\x63\x81\xbf\x6f\x3e\x25\x3f\xfa\x4c\x8f\xb0\x94\x20\x0e\xd9\x06\x6b\x0b\xc6\xd9\xf6\x10\x47\x05\xbc\x73\x75\x67\xda\x5d\x16\x37\xa9\x6f\x26\x3d\x1f\x8a\x41\x9f\xf0\x23\xd5\xf2\x3b\x71\xb8\xd8\x55\x44\x64\x10\x87\x6c\x83\xcb\xeb\xc8\xfc\x98\xe7\xe7\x5a\xba\xae\x9a\x09\xf2\x6b\xaa\x5a\xc8\x52\xfc\x26\x66\x9f\x2b\x9b\x0e\x70\x6c\xbe\x9f\x23\xcd\xd5\x80\x88\x0c\xe2\xfe\x8f\x0d\xfe\xaf\x76\x75\xf7\x2b\xdf\x06\xd7\x47\x9b\x7f\xca\x35\x76\x37\xd8\x57\xdb\xc3\x49\xb1\x92\x3e\x20\xd2\x1d\xbd\xb2\x63\x76\x29\xf4\x20\xca\x0a\xb2\xc1\xcc\x8f\x14\x58\x25\xd1\x87\xd3\x16\x22\xca\x7f\xbb\x47\xbd\x64\xfd\x65\x53\x7d\xdb\x50\x49\xab\xec\xed\x3b\x62\xed\x8b\xe3\x86\xd8\x7f\xdb\x60\xb7\x59\x3b\x29\x15\x57\xaf\xc5\x3f\x72\x9a\xfa\x52\x0c\x25\x6f\xa9\x5a\xc2\x5f\xa6\x4b\xfe\x6c\x96\xb5\xdc\x49\xbc\x2b\xd5\x3f\xf4\x17\x3a\x91\x31\xe0\x66\x4d\xa1\x9c\x95\xb3\xb4\xd9\x3e\xa1\xef\x53\xf6\x24\x54\x93\x65\xfd\x38\x31\x8e\xe9\x09\x5d\x23\x6d\xd4\x27\xed\xff\x35\x1b\x0c\x1a\xda\xdf\xb5\xc1\x48\x36\xb8\x87\x35\xdd\x7b\xa5\xbe\xdf\x96\x7d\x44\x67\x51\x85\x54\x69\xd0\x7c\x7d\x32\x9b\x56\x50\x68\xe2\x59\xae\x9d\xf4\x2b\x13\xac\xcf\x67\x61\x83\x51\x54\xe1\x9f\xba\x37\xb4\xf1\x7b\xc9\xab\xaf\x32\x8b\x6c\xe3\x57\x40\x7f\x69\x63\xab\x5f\x1d\xed\x75\xb3\xbd\x0f\xcb\x1d\x6c\xca\x2e\xab\x55\xac\x67\xb2\x2d\x8b\x6c\x83\x43\x82\x65\xda\x30\xe3\xe7\x35\xee\xf5\x39\x1f\x95\x69\x16\x78\x7c\x6d\xc3\xc5\xde\xc6\xe0\xb9\x1b\x98\x1c\xc4\xb7\xbb\x4b\xe6\x70\x26\xdb\xb2\xf7\x90\x3e\xd6\xb4\xaa\x6c\x65\x78\xaa\xf8\x99\xe3\x5e\x97\xd3\xf4\x01\x23\x96\xd7\xb9\x3b\xf5\xab\x6d\xcd\x43\x2b\x02\xca\x34\x71\xa6\x97\x09\xcf\x64\xb4\xc8\x36\x38\x57\x22\x47\x1b\xbb\x8b\x85\x7e\x59\xe1\xf3\x12\xd3\x74\xb4\xdd\xa0\x83\xd7\xe6\xe2\xec\x54\x91\x48\x10\x5a\x4c\x5a\x8a\xdd\xd6\x99\xd9\x60\x90\x86\x4e\x9b\xf8\xcc\x82\x2f\x70\x94\x37\x04\x84\x4a\x56\x3a\xed\xdd\x50\x44\x6f\xb1\x63\xcc\x4f\xdd\xfe\xd1\x81\x11\x63\x68\xdf\xf5\xab\xd5\x1a\xda\x03\x00\x71\xf0\x89\xcf\x7d\x32\xae\xb9\xf1\x1a\x95\x81\x6c\xf7\xfb\x9d\x20\xa2\xc6\x30\xae\x8c\x21\x26\xe3\xa5\x59\x96\x6f\x87\x12\x5e\x65\x55\xc1\x50\x45\x18\x88\x83\x4f\x50\x63\xca\x75\x6f\xbe\xfd\xdc\xb4\xf4\x4a\x1e\x98\x6d\x0c\x34\x18\x76\x96\x4c\x52\xa2\xd8\x9c\x7d\xd6\x95\xcd\x27\x6b\x16\x84\x0b\x5d\xea\x0a\xe2\xe0\xef\x69\xa5\x9a\xd2\xc8\xe9\x76\x32\x27\xa4\xb5\xa4\xe5\xfc\xa2\xc7\x5b\x8f\x83\x1a\xed\xaa\x0b\xf6\xde\xb6\x54\x79\xed\xf8\xce\x11\x43\x15\x61\x20\xce\x4f\x0a\xe7\x3f\xcf\x41\x4f\xe2\x01\x7e\x8b\x17\x87\xbe\x27\x75\xda\x38\xd3\x0b\x01\x4c\x0f\x8b\x43\x3e\x4a\x6c\x32\x87\x1b\x62\x28\x35\x37\x2c\xce\x05\x21\x3c\x10\x88\x83\x6a\x83\xff\x6d\x83\x41\x7f\xe8\xd3\x24\xf0\x98\x33\x70\xfa\xc3\xd7\x57\xcf\xfc\x06\xe3\x38\x87\x16\xe7\x18\x57\x9a\x18\x93\x8d\x65\x7a\x9f\xfc\x4e\xa0\x51\xd3\xbf\xfc\xfc\x37\x62\xe8\x20\x0e\x2e\x81\xa0\x2c\xa5\x57\xb6\x5e\xf8\x87\x9c\x49\x94\x18\x5f\xe2\xf1\x59\xf4\x0e\x12\xd2\x14\x39\xb8\xb5\xeb\x1f\xf8\xe1\x17\x07\xf6\xcc\x20\xe2\x82\x38\xa4\xd3\x90\x8c\x39\x49\x75\xe1\xbb\xfa\xba\xd5\x6f\x2f\x53\x67\x11\x06\xbd\x0a\xed\xd3\xd7\xdf\x2e\x71\x1f\x0a\xc4\x7e\x18\x70\x1e\x87\x1e\x3a\x0d\x09\xe0\xe0\x12\x30\x79\x61\x52\x6c\x50\x3c\xb1\xec\x6f\xc8\x5e\x6b\xfc\xb8\x24\xab\xb6\xe2\xd7\x1b\xee\xcf\x4b\x37\x70\x5a\x34\x3e\x59\xa6\x4b\x12\x42\xde\x0a\xc0\xc1\x25\x20\x3a\xc2\x6b\x86\x3a\x2a\x12\x8c\x3a\x4d\x49\x4d\xc2\xb3\x18\x64\xed\xfd\xd0\xa8\x76\xcf\xcf\xd7\x5c\xf5\x70\xe8\xe1\x7d\xc9\x6c\x84\x04\x40\x1c\x54\x1b\xac\xfa\x4f\x09\x80\x92\xeb\x69\x12\xf0\xfe\x94\x3f\xee\x9f\x56\x53\x2f\x52\x5e\xaf\x4a\x2f\xee\xc8\xfe\x86\x7a\x46\x37\x3c\xb4\x30\x54\xbf\xa5\xa9\xf7\x8b\xf3\x71\x37\x62\xe8\x20\x0e\x2e\x81\x39\x9e\x9c\x81\xca\x2b\x1a\xd3\x6c\xc5\xcd\xf7\xae\x49\x76\x78\xd9\x38\xa3\xd5\xf0\x8f\x99\x05\xf6\xcb\x19\x77\xeb\x3f\x50\x81\x9a\x10\x83\x38\xb8\x04\x88\x94\xae\xe2\xe0\x92\xee\x6b\x15\xcb\x91\x3e\xa3\xa0\x98\x74\x1f\xfa\x16\x65\x52\xbc\xc6\xbe\xa2\x97\xba\xe8\xc6\x7b\xf4\xd3\x10\x11\x17\xc4\xc1\x25\x50\xf6\xb2\x2c\x7c\x3f\xec\xe4\x83\xe7\x3c\xab\x19\x9a\x70\xf3\xab\x81\xea\x8e\x38\x5e\x94\x4b\xb5\xad\x8f\x7a\xb5\x66\xc4\xa5\xa1\xe7\x00\xe2\xe0\x12\xa8\x13\x16\xf4\x6f\x63\x45\x65\x56\xd2\x8f\xfd\x36\xad\xac\x95\x2b\x67\x92\x1d\x6a\x8a\x3e\x70\x6f\xe3\xfd\xab\xd4\x9f\x83\x41\xe1\x88\xe5\x2f\x88\x83\x6a\x02\x01\x36\x18\x34\xd3\x9d\xa6\x01\x9c\x90\x9f\xdf\x93\xae\x6a\x84\xf7\x4a\x89\x65\xdc\xf6\x53\x7e\x5f\xf9\x63\xab\xdb\x38\xf0\xb9\xf9\x2f\x45\x8b\x0b\x72\x69\x69\x90\x55\x01\x71\x70\x0d\x4c\xb7\x8e\xcf\x68\x90\xbf\xfb\x99\xa7\xd6\x78\xb2\x78\x58\xcb\xe9\xb7\x3c\x4e\xec\x85\x23\x30\xf0\xf4\x58\xb8\x6e\xfb\xf9\x2a\xd4\x25\x02\xc4\x21\xd5\x71\x3b\xcf\xcd\xb1\xd0\xfc\x14\xff\x1d\x19\xbf\xaf\x4e\x75\xd7\xee\x35\x33\xba\xa0\x69\xd3\x77\xa5\x11\xc3\x24\xb7\x7a\xae\x61\xe8\x15\x0b\x88\x83\x6b\x20\x5c\xd4\x3f\xac\xcf\x9e\x7d\xfe\xd3\xbd\xb5\xde\x44\xa5\x37\x1b\xb7\x3d\xfd\x3e\x26\xf1\x26\xf1\x47\x67\x73\x7c\xda\xe0\xbe\x04\xd5\x72\x80\x38\xb8\x06\x5a\xd3\x87\xfa\xd6\xa3\x4a\x7e\x88\x16\x4c\x4e\x64\xcb\x2f\x3f\x31\x76\xb1\xb2\xff\x66\xfe\xb5\x19\xe7\x7e\x3c\x5d\x14\xfd\xb5\x5e\x84\x06\x40\x1c\x54\x1b\x7c\xef\xdf\x1a\x00\x2d\x3b\x4e\xbd\xc9\x34\x7d\xe1\x13\x99\xec\x41\xe6\xba\xa1\xd8\xb7\x83\x83\xb4\xe9\x0b\x22\xcd\x21\x76\x1d\xa2\x21\x7e\xe2\x01\x39\x5f\x3b\x37\x78\x10\x63\x07\x71\x70\x0d\xc8\x5e\x2f\xdc\x76\xcc\x32\x78\x78\xa7\x29\xfb\xfa\xe6\x5a\x09\x5b\xa2\xfd\xb0\xb9\xd6\xf3\x12\x0c\xa7\x2d\xfb\x0a\xf4\x5f\x28\x50\xf3\x74\x10\x87\x54\xc4\x30\xa1\x7b\xde\xbc\x63\xfb\xaa\x0d\x91\xff\x5d\x53\xbd\x95\xcd\x77\x77\x29\x0f\x6c\xf5\x6d\xf1\x1f\xdf\xa7\x28\xbf\xdb\x17\xa7\x02\x15\x31\x00\x38\xb8\x06\x72\x4f\x84\xb3\xdc\x09\x77\x24\x97\x2f\x89\x50\xbe\xc0\xde\x4f\xfd\xac\xcb\x8e\x7d\xe5\x4f\x40\x81\x49\x59\x6a\xb2\xf2\x11\x3d\x37\x22\x2e\x88\x83\x6b\xe0\xf7\x71\xcb\xf1\xb4\xaf\x6b\x21\x47\x1a\xa9\x81\xd2\xdc\x95\xf9\x90\xce\x17\x9c\x55\x69\x63\xcc\x97\xaf\x1c\xd8\x16\x35\xbe\xbf\x8b\xd0\x00\x88\x83\xf2\x00\xc0\x06\x83\x2c\xd4\xe9\x36\x78\xfa\x1a\xb9\x36\xfa\xb2\xee\x64\x73\x52\x23\xf3\x67\x97\x80\x54\x45\xeb\x96\xfd\xb7\x89\xf6\x3b\x2c\x98\xeb\x91\x68\x78\xd4\xa3\x08\x4b\x09\xe2\x4e\xd9\x0d\xbe\x57\x1c\x28\x52\xb7\x44\xf9\xe1\x53\xe3\x50\xb0\xef\xde\xae\x82\x6b\x66\xa4\xf6\x96\xf1\x22\xa9\x6f\xe6\x46\x71\x02\xcb\x16\xb4\x1b\x0c\xe0\x90\x6d\x30\xa5\x55\x5a\x2b\x6d\x4d\xf9\x47\x36\xb5\xd5\x08\xf5\x07\x64\x13\x06\x46\x93\x01\x8d\x1b\xac\x1b\x65\x68\x19\x8e\x71\xc1\x38\x01\x88\xc8\x20\xee\xff\xd8\xe0\xff\x36\x51\xd7\x1d\xd6\xea\xa1\xab\x0a\x25\x4c\x39\x94\x55\x7c\x78\x18\x62\x94\xa4\xe3\x6d\xbf\x60\x1c\x28\xfc\xfd\x3e\x6b\x44\xb9\x15\x1b\x1e\x64\x83\x33\x70\xa3\x22\x37\x56\xbf\x67\xce\xad\x4b\x94\xf0\x67\x88\x2d\xb0\xa3\xf2\x7f\x0c\x5f\x59\xd8\x5f\x4b\x13\x2a\xe9\xad\x1e\x63\xf8\xdb\x06\xeb\x97\xf3\x0d\x17\x8b\x04\xc6\x51\x75\x44\x5c\x99\xe5\x55\xbe\xec\xa6\x9f\x92\x7b\xae\xa5\x02\x9d\xe9\x75\xe4\x15\xf2\xe1\xd0\xd9\xbf\x50\x5b\x8f\x73\x66\x2e\x69\xf9\x73\x25\xd7\xad\x5a\x69\x33\x73\xe9\x9b\xbb\x4c\x43\x66\x38\xac\xe4\x14\x88\xee\x30\xd3\x15\xdd\x2b\xfb\x5f\xb3\xc1\xa0\xa1\xfd\x5d\x1b\x8c\x64\x83\x75\x71\x26\xf5\x6e\xa0\xdd\x2a\x22\xf3\x5e\xd0\xe7\x8d\x2d\x8a\xc9\xd7\x38\x94\x55\x53\xfb\xf4\x52\x75\x6b\x6a\x9b\x2c\xf0\xc2\xc5\xb3\xb0\xc1\x12\x48\x36\xd8\xe7\xfd\x92\xea\xa1\x79\x01\xe9\x67\xab\xd9\x30\x4f\x16\xb5\xe7\xed\x52\xf3\xe7\x2b\xdc\xd0\xc4\x9b\x74\xd4\x14\x2f\x63\xd3\xa4\x9c\xc9\xb6\x2c\xb2\x0d\xce\x54\x50\x70\x9f\xe2\x31\xc4\x65\xf3\x7c\x56\x2a\xd6\xbc\xa4\xda\x57\x2d\x94\xa9\xf4\x2c\x2c\x20\x72\xef\xe7\x09\xc6\xf9\x06\x9f\x33\xd9\x96\x45\xb6\xc1\x3a\x92\x46\xa6\xdf\x69\xe7\x42\x7e\x2b\x5d\xa8\x7b\xad\x95\x9c\x67\x6f\x60\x34\x51\x82\x7d\xd9\x42\x84\x97\x3e\xe2\x99\x94\x6f\xef\x99\x8c\x16\xd9\x06\x07\xb6\x6f\xf5\xd2\x62\x29\x46\x19\xaf\x7d\x15\xac\x94\x23\xbb\x74\x7f\x8e\x77\x28\xb1\xff\x64\xf7\xfe\x26\xb3\x86\xa6\xe8\xaf\x99\x33\xb3\xc1\x20\x0d\x9d\x36\xf1\x8d\x66\x78\xc5\xfd\xbc\x59\x36\x7b\xf8\xd4\x76\x8a\x66\xc0\x5c\x94\xf5\xf6\x76\xa6\xfe\x76\x20\x61\x6a\xa9\x65\xdf\x67\x85\x67\x9f\x10\x09\x1f\xc4\xc1\x27\x3e\x8b\x6a\xfa\x52\x4e\x09\xd5\x58\x79\x65\xbe\xad\x32\xef\x38\x0b\x12\x9c\x06\xc6\x6b\xd5\xec\x5b\x1a\xdc\xd7\x54\x94\xae\xbc\x6d\x47\xc4\x05\x71\x48\x77\xf7\xaa\xdf\xa9\x1a\x2a\x2d\x79\xd5\x25\x5c\xb5\xc0\xed\x4b\x4c\x1b\xb5\xde\xec\x38\xd8\x56\x78\x6c\xe7\x85\xba\xb1\xbb\x2f\x94\x89\x88\x0b\xe2\xe0\x13\xdf\xb5\xe9\x12\xb6\xcb\xd2\x98\xd9\x9c\x12\xc5\x19\xb5\xdf\x53\xa5\xc9\x3e\x86\xb7\x15\x14\x18\xd9\x5f\x52\xf9\x19\x52\x98\x8c\x07\xdd\x4a\x04\xe2\xe0\xcf\xa1\xa6\xb1\x35\x31\x93\x85\x9b\x94\xbe\x07\x07\x97\x72\x2a\x88\xe2\xc9\xa0\xd1\x0f\xa2\x0e\x83\xc3\x79\x89\x5a\x19\x4e\x91\x35\x31\x84\x07\x02\x71\x50\x6d\xf0\xbf\x6d\x30\xe8\x0f\x7d\x9a\x04\xf4\x17\xc7\xdc\xe2\x5a\x3b\x35\xd3\x94\x3b\x44\x05\xde\xfb\x7f\xf7\xf2\x1e\xd5\x08\xfa\xa2\xd1\x3b\x5f\xbd\xbc\x2a\xe3\x2c\xc3\x8a\x18\x3a\x88\x83\x0f\x7d\xfc\xc3\x15\xde\xfc\x4b\xba\x34\x53\xda\x1c\x7f\xbc\xaf\x09\x14\x7d\xa3\x8b\x5c\x62\x22\xbe\x13\x97\x7c\x6f\x33\xe2\x1d\x0f\xf9\x4b\x44\x5c\x10\x87\xd4\x1b\x67\x7b\xf0\x6b\xa6\x05\xf6\xa0\x3c\x69\x4e\xb2\xd7\x97\x7a\xf9\xb7\xf4\x63\xd2\xdd\x94\xd4\x7e\x5c\x52\x71\xc3\x09\xb9\x5f\xa0\xf5\x2f\x88\x83\x4b\x60\x79\x2f\x6c\xc5\xe9\xd0\x81\x41\xde\x26\xfa\x60\x27\xbe\xea\x60\xcb\x36\xee\xd9\x72\x82\xf2\xe1\x9f\x2a\xe5\x63\xd3\xf0\xdb\xd0\xf5\x74\x20\x0e\xfe\x1c\xbe\x19\x30\x04\x37\x4b\xd7\x6b\x3d\x89\x22\x0f\x1e\x1c\x45\xa9\xf1\xb9\xc6\x2f\x3a\x11\xf8\x62\x8c\xfc\xbe\x70\x9d\xf6\x91\xf8\x2d\x84\x04\x40\x1c\x54\x1b\xfc\x6f\x1b\x0c\x4a\xae\xa7\x49\x80\xa1\x3a\x3e\x50\xf7\x3e\x9b\x4d\x1c\x71\x1a\x16\xaf\x5e\x88\xc8\x71\x11\x83\x10\xd1\xf0\x85\x7d\x3d\xa6\xc9\xb7\x2e\x32\x64\x75\x88\xa1\x83\x38\xf8\xd0\x1f\x9a\x33\xab\x28\x39\x77\x50\x24\x1b\x44\x2d\x19\xe9\x53\x71\x6b\x60\x9f\x4b\x7a\x5f\xb6\xb7\x18\x29\x9c\xcb\x60\xf1\xce\x1f\xda\xad\x01\x71\x70\x09\xe4\x7a\xac\xdc\x4b\x95\x4d\x7c\xf4\xa0\xa0\xf1\x99\x9d\x1a\x6d\x91\x19\xde\x9f\x48\xa9\x9a\x26\xed\xb6\x1f\x7b\x19\xf1\x85\xad\x50\x76\x01\x71\x70\x09\x54\xbe\x2b\x28\x26\xfb\xf8\x4d\x2b\xfa\xd6\xc0\x53\x91\xf7\x93\xda\xbb\x9e\x9b\xf9\x92\xdf\xd0\x5e\x49\x2a\x6c\xe2\x38\x3e\xe0\x84\x3a\xd7\x82\x38\xa4\x4e\xde\xe7\x9e\x47\xbc\x10\x2f\x0b\x5d\xec\xd1\x5f\xd8\x69\xd8\xfd\x75\x8b\xaf\xbe\xf3\xe5\x8f\x96\x47\x75\x6a\x77\x3f\xdc\xa2\xcb\x8b\x44\x2c\x7f\x41\x1c\x54\x13\x08\xb0\xc1\xa0\x99\xee\x34\x0d\xbc\xcb\x13\x3b\xec\x69\x96\xd0\x08\xe7\xa7\x78\x5d\x20\x19\xba\xcc\x6a\x40\x9e\x1f\x4d\xbc\x33\x66\x6f\xb9\xbe\xed\xb9\xaa\xd4\x84\x18\x3b\x88\x43\x6a\x11\xd0\x43\xde\x49\xc1\xc0\x42\x3d\xc2\x7c\x71\xaf\xde\x7f\xad\x31\x43\xb5\x23\xee\xad\xb4\x30\x1d\xe9\xb7\x90\x03\x8d\xfd\xe7\x50\xfd\x26\x88\x43\x6a\x11\x70\xa7\xf1\xa6\x99\x96\xd8\x77\xd1\xf0\x54\x2f\xe1\x4c\xea\xda\x84\x25\xd2\xbe\xdb\x6d\x79\x13\x1a\x79\x3e\x2a\x34\xb1\xd6\x6c\x90\xbd\x06\x70\x70\x0d\x4c\x31\xac\x77\x62\xe9\x3d\x8b\x59\xec\x88\xf1\xba\xf6\x9e\x64\x49\xf4\x93\x5a\x47\x59\xa4\xcc\xa6\x28\x7a\x73\x73\xc9\x27\xe2\x32\x44\x5c\x10\x87\x74\x32\xa2\x7d\x5c\x7a\xe6\xa7\x53\xee\x9f\x31\xaa\x41\xb9\x84\xd6\x96\x1b\x12\x5c\x39\xab\x7f\x6a\x55\x7e\x75\x64\xbc\xc2\xfb\xba\x33\x88\xd0\x00\x88\x83\x6a\x83\x01\x36\x18\xb4\xec\x38\x4d\x03\xf9\x65\xd5\x9b\xdf\x62\xe6\xa9\xd3\xee\xd2\x2d\x46\x8f\x15\x79\xef\xd9\xdf\xa0\x38\xc6\xd8\x3d\xdc\x53\x24\x7f\x55\xf0\xe7\x07\xd4\xc4\x1f\xc4\xc1\xc7\x1e\x86\x37\x5e\x7b\x6b\x4d\xeb\xf5\x74\x49\x84\x65\x9d\x12\x99\xb5\x22\x33\xfa\x1d\x9f\x35\x63\xce\xbb\x4e\x1b\x93\x12\x86\x9a\x01\x88\xb8\x20\x0e\xae\x01\x91\x90\xb5\x93\xfd\x3f\xce\x8c\x37\x3c\xc5\xdb\x5e\x6a\x94\xba\xc7\x7a\x25\x24\x19\xaa\x12\x7d\x9e\xd9\xfe\xc8\xcf\x17\xad\x51\x05\x15\x5d\x00\x38\xb8\x06\x44\xab\x1d\xb2\x96\xaf\x30\x2b\x6e\x1d\x8e\x8e\x67\xff\x5e\x1e\x38\x97\x2c\x24\x4f\x2b\x82\xd9\xc4\x32\xc4\xf0\x21\xee\x99\x3c\x0d\x22\x2e\x88\x43\x2a\x12\xd9\x60\xa4\x55\x24\x2c\xba\x7c\x22\x53\x46\xbb\x11\xf1\x45\x2b\x97\xba\x49\x73\xff\x79\x98\x6f\x8d\x61\x7e\x4d\x07\xe6\x8d\xf3\x08\x0d\x80\x38\x28\x0f\x00\x6c\x30\xc8\x42\x9d\x6e\x83\xe9\x3d\x3c\x6c\xdd\x99\x86\x79\x1b\xf5\x5e\x5f\x62\x62\x51\xbc\xa1\xa2\x7c\x1c\xab\x40\x75\x44\x37\x2d\x48\xa8\xec\x1c\x3b\x77\x0d\x61\x29\x41\xdc\x29\xb5\xc1\x7f\x12\x17\xc4\xa7\x2f\xe2\x44\xcd\x63\x98\x96\x9f\x97\x8f\x23\x8c\xcb\xeb\x97\x52\x59\xcb\x4f\xf3\xe2\x2f\x50\xea\xac\x1c\x87\x6a\x83\x01\x1c\xb2\x0d\x36\x6d\xfe\xd0\x4b\x45\x62\x79\xf9\xf2\x05\xa5\xdc\xc1\x13\x42\x9e\xa9\x4d\xd4\xd8\xbb\x61\x34\x6c\xf6\xe1\xc2\x93\xd9\xcc\x77\x65\x11\x91\x41\xdc\xff\x67\x83\xff\xa3\x05\x0b\x4f\xba\xb1\x6b\x0d\xfb\x62\x41\xb1\x9d\x64\x0e\x4e\xb7\x3f\x47\xf7\x71\xf5\x4c\x49\xf9\xa2\x0e\x53\xa4\xf8\xb2\x13\x4e\xca\x42\x36\x78\x4d\x21\xb8\xa3\x28\xe3\xb5\x34\x51\xe2\x7d\x86\x0f\x38\x39\x8f\x23\xa3\x85\xe6\xbd\x79\x3e\x91\x6c\x14\x07\xf0\x64\x10\xd4\x95\xfe\x6d\x83\x2f\xe6\x3f\x98\x55\x32\x95\x8e\x41\xf3\xe1\x28\x7a\x94\x97\x4f\x45\x9b\x8e\x7e\xcf\xd4\x8e\xd0\xae\xb6\x97\x6c\x2e\x44\x38\x21\xed\x2f\x74\x3f\xcc\xe3\xfa\x17\x8a\xa7\xe1\xe8\xdf\x82\x13\xf3\x85\x27\x53\x68\x71\x4d\x57\x1f\x86\xa7\xd4\xdd\x64\x6f\xa1\xa2\xa4\xbc\x34\xf6\xbf\x66\x83\x41\x43\xfb\xbb\x36\x58\x06\xee\x95\x58\x55\x18\x59\xf2\x75\x39\x04\x9c\xcf\xfd\xc9\x8a\xd1\x95\x70\xbb\xfa\x5d\x74\x6a\xe3\xf5\x6f\xac\x9d\x6d\x62\xa3\x34\x05\xd2\x33\xe9\x14\xed\x8d\x64\x83\xd7\xec\x7f\xc5\xd0\xee\xf7\x8f\x17\x50\xe9\x7c\xa7\xa4\x4e\x56\xfe\xee\x3e\x39\xf8\x03\x83\x4c\x95\xce\xe5\x6e\xd5\xce\x4b\x1e\xe2\x33\xd9\x96\x15\x41\x32\x86\x93\xa1\x81\x09\x97\x6f\x45\xec\xb5\x93\x39\xe9\x1d\xac\xb1\x8d\xe0\xe4\xbe\xb8\xb9\xc3\x99\xa9\xe1\x11\x20\x4d\x3c\x5b\xa7\x4b\x79\x26\xdb\xb2\xc8\x36\xf8\xc5\xef\xcf\x5c\x81\xe8\x11\x7c\xaa\x74\x05\xb7\x71\x7a\x7f\x3e\x1e\x1d\x2b\xeb\x3b\x7a\x6d\x83\x23\x7d\xcb\x6e\xfb\x91\xf3\xbc\xe6\x99\x8c\xd6\x1e\xe9\x63\x9d\x58\x47\x7c\x7f\xec\x78\xdd\x34\xcc\xe6\x57\x9a\x61\x25\x66\x93\x16\x4e\xcb\x1c\xa8\x6a\x6e\xaa\xfd\x2d\xf7\x43\x21\x86\x88\xe3\xcc\x6c\x30\x48\x43\xa7\x4d\x7c\x13\x6d\x09\x71\x2e\x5f\x96\x9e\xa5\x28\xc6\x71\x33\x66\x15\x3f\x54\xf9\xf6\x86\x98\x73\x5c\x65\xa8\x57\x88\x8a\xdf\xd0\x8a\x15\xba\x44\x17\xc4\xc1\x13\x3e\xb3\xed\xb9\x83\x84\x69\x76\x0d\xec\x86\x07\x68\x97\x2d\x87\xd9\xb8\x4a\x15\xae\x69\x3a\xb2\x1d\xe2\x85\xd6\x13\xe2\x76\x29\xee\x43\xc7\x8a\x00\x1c\x7c\xe2\xbb\x22\x6c\x49\xc2\x72\xe5\xcf\x71\x33\x63\x4f\x20\xfb\x5a\xe4\x6f\x6e\x11\xa7\x99\x56\x52\xc2\x8b\xb4\x73\x9a\x1a\x18\x68\xba\xf7\x11\x71\x41\x1c\x7c\xe2\x8b\xf3\xd8\x74\xee\xea\x5d\xbe\x9a\xf4\xfe\x91\x93\xe2\x9f\x86\x76\x41\xa9\xaf\xdb\x1f\x3f\x7b\xae\x85\xae\x6c\x5d\xf9\x24\xc1\x6b\x0d\xf5\xca\x05\x70\xf0\xef\xdb\x93\xd7\x90\x2f\x94\xbc\x72\x43\x27\x3b\x5d\xcd\x32\xf2\x50\xbb\x87\x62\xbb\x34\x4e\x9d\x6f\x65\x49\xe1\x6e\xfe\x4a\x7f\xd9\x0d\x84\x07\x02\x71\x50\x6d\xb0\xcc\x3f\xd7\x3e\xa0\x3f\xf4\xa9\x37\xb8\xdc\xa5\xe1\x34\xe8\x9a\x53\x3a\xff\x4c\x6e\xac\x34\xac\x4b\xc6\x5d\x6e\xd0\x56\xf0\xc4\x85\x8d\x41\x7d\xd7\xbf\x7d\xe4\x71\x17\x62\xe8\x20\x0e\x2e\x01\x41\xbc\xe9\x56\xe9\xcb\x14\x1b\xc2\xe1\x49\x4a\xb7\x8a\xea\xe9\x7e\x15\x14\x0a\xe0\x53\xb8\x0f\xd2\x4f\xf7\x7b\x65\xdf\xb8\xe9\x84\x88\x0b\xe2\xe0\x8f\x34\xa4\xdb\x90\xf9\x8f\xa6\xd6\x45\x69\xaa\xed\xcb\x27\x8c\x24\xea\xd8\x51\x5e\x81\x37\x24\x6f\xdb\x2f\xce\x8c\x5c\xe4\x1a\x14\x82\x6c\x30\x88\x83\x4b\xc0\x31\x40\xf1\x51\xe3\x27\x35\x46\x0c\xae\xee\xce\x04\x97\x7e\xdc\x3b\xed\xc1\xb7\x26\x31\xaf\xa7\x5e\xa8\x13\xd2\xbb\x21\xfd\x80\x11\x2a\x0a\x04\x70\x48\x27\x6d\x49\x96\x0d\x87\x3b\x8e\x50\xf8\x9d\xc2\xd6\xf5\xfb\xd7\x57\xed\x62\x59\xa9\x5b\xb6\x92\x42\xd1\x44\xd2\x02\x05\xde\xb2\x6d\x22\x24\x00\xe2\xa0\xda\xe0\x7f\xdb\x60\x50\x72\x3d\xb5\x26\x30\xbf\xf5\x47\x8a\x57\xea\x1e\x91\x74\xe9\xa2\x3b\x83\xe1\x87\xf3\x8f\x85\xd6\xfc\xe6\xbf\x57\x69\x28\x3e\x58\x27\x68\xb4\x85\x3a\xa3\x82\x38\xa4\x03\x01\x82\x1b\xb8\xac\x7b\xd2\x3b\x19\xd2\x17\x84\xfa\x70\x6c\x19\x88\xbe\x2b\xfd\x4c\xf5\xab\xb0\xcb\x3f\xa7\xf1\x6d\xdd\xcc\x0b\xea\x14\x0d\xe2\xe0\x8f\xd4\xa9\x25\x8b\xfe\xe6\x86\x8d\xb5\x64\xd9\x87\x8b\x6e\x61\x9e\xed\x6c\x3e\x03\xcb\xa5\xf3\x11\x4a\xcf\xf4\x2c\xad\x22\x25\xf9\x58\x10\x71\x41\x1c\x52\x25\xbf\x14\xed\xba\x9e\x2f\xdd\xf8\x38\xc1\x70\x94\x55\x46\xbc\xf4\xd7\x84\x8c\x26\x3b\x0a\x3f\xa2\x8a\x92\xb1\xcf\x2d\x2a\xec\x6f\xa1\xce\x03\x00\x0e\xfe\x7d\xcf\x73\xe1\x2d\x67\xe7\xa9\xd0\x7c\x11\x96\xff\x48\xf7\xe2\x0a\x0f\xc3\xef\xa0\x38\xf6\x3d\xf7\x87\xbe\x43\xa1\x32\x94\x4d\x77\x64\x11\xcb\x5f\x10\x07\xd5\x04\x8a\xfc\xdb\x02\x81\x66\xba\x53\x5b\x64\x89\x6d\xdd\x6c\x58\x89\x52\x0f\x61\xbe\xc2\x70\x94\x46\xdb\x2f\x5b\x78\xf7\xa6\x5d\x40\x6f\xe6\xdd\x3f\x79\xd9\x75\x3f\x3e\x43\x17\xb8\x80\x38\xb8\x06\x88\x3f\x2c\x75\xa4\x4c\x9a\x5d\xf4\xf3\xba\x17\xaf\xf1\x8a\x8f\xe1\xe3\x97\x51\xed\x76\xf4\x27\x3f\xd6\xba\xee\x5b\x77\x96\x4a\x5c\x45\xc4\x05\x71\xf0\x67\x3a\x18\x31\x73\xcb\xfd\x72\x85\x2f\xee\x6e\x15\x46\x18\xbe\x54\x7b\x88\x1f\x47\xa7\x45\x02\x4b\xb8\x03\x5f\x4b\xb3\x3f\x5e\x3a\x54\x1b\x01\xe2\xe0\x1a\x88\xfd\x6e\x43\xc7\x52\x6d\x3c\x1a\xbf\x96\x41\x49\xe3\x4b\x4c\xea\x65\x2e\x3f\x5f\x91\x77\x5e\x75\xab\x6a\xfd\x17\xd5\x03\x55\x5d\x44\x5c\x10\x07\xff\xbe\xdd\xad\x86\xbf\xdf\x35\x37\xe4\x15\xb7\x90\xfc\xd9\x7a\xe6\xce\x54\xd2\x5d\xd9\x16\xe6\x1c\x7e\xbc\x22\x7b\xc2\x5c\x55\x7c\x1b\x3a\x14\x0d\xe2\xa0\xda\x60\x80\x0d\x06\x2d\x3b\x4e\xd3\x40\x25\x57\xf2\xb4\xf1\x33\x62\xfb\x4e\x96\xfe\x5d\xff\x3c\xd3\xd1\x4b\xef\x47\xec\x19\x3d\xd7\x92\xa8\x8f\xa2\x8b\xff\x84\x9b\x42\x17\xaf\x81\x38\xb8\x06\x54\x9b\xac\xa3\x8f\xa9\x88\x42\x27\x2e\x6c\xbd\x20\x0e\x54\xd8\xbc\x83\xe1\xa1\x34\x61\x7e\xbb\xaa\xe3\x66\x17\xe5\xa2\xcb\xc7\xef\x50\x3b\x07\x00\x07\x7f\xa6\x34\x59\x6e\xec\xa6\x6d\x89\x41\x5c\x3e\x64\x6d\x9c\xed\x26\x02\xcb\xb5\xed\xfd\x31\xca\x75\x2f\xb7\x0b\xf3\x57\x8f\x31\x7e\xdb\x21\xe2\x82\x38\xb8\x06\x4a\xa5\x32\x72\xfd\xc4\x49\xbe\x65\xe7\xba\x4f\xa3\xfb\x33\xb7\xac\xfe\x92\xca\x56\xfd\x72\x94\xbb\x48\x6f\x74\xd9\xea\xd9\xfc\x2d\xe8\xc0\x11\x80\x83\x7f\x5f\xef\xd8\x45\x23\x8c\x07\x22\x15\xb8\xcd\x91\xe5\xc6\xed\x0b\xdf\x0e\x92\x5a\xd7\x5f\xf1\x8c\x14\x74\x7c\x9b\x60\x36\xae\x16\xed\x42\x68\x00\xc4\x41\x79\xc0\xfe\xdf\x36\x18\x64\xa1\x4e\xb7\xc1\x6e\xa1\x3c\x95\x2f\xd2\x3f\x63\xad\x8b\x7e\xbf\x57\x4a\x4a\xad\x13\xd8\xf2\xae\x8f\xcd\xa7\xd1\xa3\xef\x2b\x79\xe4\x7d\xc6\xc1\x08\x84\xa5\x04\x71\xc8\x36\x38\x42\xe0\x6d\x3e\xd5\x7e\x68\x70\x6d\xfb\x8a\x03\x4a\xb9\xa6\x44\xe5\x0b\x8e\x18\x0f\xee\xb5\x2a\x11\xc9\x96\xa4\x24\xf6\xfc\xdb\x88\xc8\x20\x0e\xd9\x06\xb7\xf9\x98\xc4\xc4\x0a\x9e\x2f\x34\x7a\xc2\xf5\xb8\x73\x27\xca\xc3\x62\x81\x77\xb6\x28\x2a\x4b\x3e\xea\x5b\xa3\x1c\xb5\xf6\x72\x11\x22\x32\x88\xfb\xff\x6c\x30\xed\xdf\x91\x73\x48\x3a\x58\x06\xd8\xb8\x75\xfd\xb0\x79\x08\xe4\x6a\xee\x58\xa7\xf7\x60\x3a\x60\x3d\x1e\x90\xfb\x70\xa7\xff\x81\x44\xb1\xb6\x16\x64\x83\x85\xe7\x73\x67\x13\xb3\x2b\xef\x7c\xf1\xb1\x7b\x16\x24\x98\xc8\xc0\x14\xc3\xfc\xf4\x49\x30\xee\x38\x4f\x4e\xa2\xbf\x54\x7d\xf8\xcc\xdf\x36\x58\x6e\x0d\xc7\xf9\xf6\x79\x92\x27\xec\xbd\x54\x13\x78\xa3\x5e\xad\x6e\x75\xb6\x61\x63\x24\x71\x5c\xbc\xf1\xf2\xcd\xc3\x72\xc2\x5f\xff\x42\x9b\x04\x79\x86\x7e\xd1\x2f\xc7\xf2\xaf\x07\x31\x3b\xe2\x24\x3c\xfd\x2a\x68\x8f\xfa\xc0\x43\x45\x7f\x4e\x9c\xeb\x86\x04\x2e\x3e\xf9\xff\x9a\x0d\x06\x0d\xed\xef\xda\x60\x24\x1b\x1c\x1a\x62\xc5\xca\x2a\x4b\x24\x11\x33\x12\xa6\xf9\xc3\xad\xab\x5a\x56\xb4\x4e\xa7\x35\x20\x58\x6b\x65\x20\x0c\x9d\xb1\x99\xd3\xe0\x2c\x6c\x70\x13\x92\x0d\x7e\x52\x70\xe3\xc7\x15\xfc\xbc\x6f\x1f\x32\x8b\xb3\x45\xda\x05\xae\xb3\x86\x3c\xe7\xf1\x20\x6c\x47\x6d\x71\xcd\x14\x6d\x58\x7b\xac\x78\x26\xdb\xb2\xc8\x36\xf8\xf8\x1a\xfe\x7d\xcc\xd7\x02\x97\xc6\x5d\xc7\xae\x97\x3f\xf6\x24\xc3\x9a\x18\xa6\xb6\xd2\x5c\x6f\x48\x65\xb9\x41\x99\x6c\xc7\x29\x73\x26\xdb\xb2\xc8\x36\x98\xd4\xff\x4d\xa3\x4f\xc8\x9e\x93\x9d\x86\x0e\xc6\x5d\x43\xd2\xfa\x52\x1b\x86\x84\xa7\x59\x0a\xb2\x5c\x9b\xe4\xaf\x73\x1f\xa9\x9f\xc5\x55\xd5\x32\x12\xc8\x36\x78\xfc\x45\x0e\x53\xc4\xba\x4c\x22\xe9\xfe\x45\xc6\xb7\x0c\xbf\x59\x03\xcd\x16\x64\x4f\x84\x4d\xd0\x04\xb6\xb0\x1f\x3d\x25\x94\x3f\x83\xce\x5c\x7a\xff\x6f\x1a\x3a\x6d\xe2\x2b\x75\x94\x2c\xcf\x26\x4a\x48\x64\x0c\xc5\x68\x91\xd8\xe1\xb8\x1b\xbb\xaa\x87\x77\xed\x37\xd6\xcc\x65\xed\xfb\x9b\xbb\x38\x63\xaf\xa0\x84\x0f\xe0\xe0\x13\x5f\xac\x51\xf8\xf7\x43\x66\x1a\x65\xdd\x79\xd1\x22\x69\xc1\xe8\x18\x4d\xca\x86\x3e\x6d\xd5\x0f\x49\x86\xe7\xb3\xa4\x50\xd4\xfa\xf9\xa1\xc5\x04\x80\x83\x4f\x24\xfb\x92\x2e\x69\xad\x5f\xf4\xd2\xea\xb8\xd7\xf1\xd0\x86\xf4\x68\xb1\x05\x05\x02\xb7\xef\x56\x24\x38\x94\x1d\x0e\xdc\x4f\x24\x83\xfa\x23\x81\x38\xf8\xc4\xd7\x77\x61\x1c\x55\x4b\xd3\xf0\x56\x0b\x47\x74\xda\xc6\x05\x7d\x93\x85\x51\x54\xba\x40\x9d\x6d\xe1\xe4\x0d\x22\x7f\x3e\xea\x41\x5f\x44\x5c\x10\xe7\x27\x85\x22\xf1\x77\x5c\xcb\xdc\xb9\x1e\xb4\x0a\xd3\x96\x88\x8f\x47\x18\xfe\x89\x6d\x7a\x4b\xd7\x3f\xe3\x8a\x9a\xbf\x6c\x30\xc6\x25\xbf\xbf\x94\x73\xe5\x23\xc2\x03\x81\x38\xa8\x36\xf8\xdf\x36\x18\xf4\x87\x3e\x4d\x02\x81\x2c\xb7\xf7\xcd\xae\xc4\x8b\xcb\x68\xbb\x57\xc8\x1a\xae\x87\x7e\xa0\xbe\x60\xf1\x4a\x4a\xa4\x3f\xfc\x73\x89\x5e\x55\xe2\xa0\x16\x62\xe8\x20\x0e\x2e\x81\x89\xad\xc5\xc2\x87\x4f\x45\xe6\x70\xec\x75\x87\xb9\xda\x23\x59\x62\x55\x82\x45\xef\xa7\x26\x48\xdc\xd8\xb5\x21\x79\xf9\xa7\xed\x2e\xf4\x86\x05\xc0\xc1\x25\xd0\x3f\x72\x2f\xb2\xb1\x53\x95\xa2\xd3\x3f\xe5\x2b\xfa\xd0\x2d\x2c\x52\xb1\x9d\xf8\xa4\xf3\x2a\xd1\xd2\x41\x39\xd9\x91\x73\x87\xc6\x88\xb8\x20\x0e\x2e\x81\x00\x16\xa9\x24\xc6\xd7\x8a\x17\x2d\x28\x3f\xfa\xa2\xaa\x30\xa3\x48\xc7\x61\x5f\x46\xef\x25\x7e\xaf\x6c\xb8\xc5\xa0\xce\x27\xb5\x8b\x88\x0b\xe2\xe0\x12\x58\x53\x7d\xb7\xa3\x4d\xb5\x86\x2a\xd0\x34\xf2\x33\xba\x4b\x52\x9e\xea\xae\x07\xb7\xe1\xfd\xaa\x4e\xb5\xdd\xeb\x9b\x1e\xea\x01\xdd\x08\x09\x80\x38\xa8\x36\xf8\xdf\x36\x18\x94\x5c\x4f\x93\x00\xcb\x8a\x8e\x1c\xfa\xcd\x81\x30\xd9\x65\x61\x0e\x2d\x4b\xb2\x5e\xe2\x8c\x26\x9b\xd6\x00\x55\x32\x12\x62\x56\x86\xe8\x9f\xe6\xd7\x11\x43\x07\x71\x48\x59\xc0\x73\xd3\xdb\x5b\xbb\x3d\x53\x35\x53\x46\x76\xeb\xa9\x0d\x8a\x8f\x6d\x89\x54\x90\x84\x2e\xfe\xfd\x8d\xac\x3d\x19\x09\xe9\x64\x28\x0b\x00\x38\x24\x0b\xf4\x52\x68\x71\x51\x51\x07\xb3\x19\xff\xb6\x93\x43\x74\x7a\xb3\xc4\xeb\xa6\x67\xf5\x2e\xa9\x36\xf2\x6e\xe6\x1b\x74\x9f\x8a\xa0\x97\x77\x20\x0e\x2e\x81\xf1\x93\x6e\x21\x85\xe9\xf4\x16\x05\x46\x5c\x6e\x0f\xd1\x07\xee\x6c\xda\xc1\x2b\xc4\x97\x94\x3e\x4d\x47\x7e\xc3\xab\xb3\xd0\x29\x80\x0e\x30\x00\x38\xb8\x04\x64\x1b\x8e\x42\xe2\x1e\xfb\xf2\x90\xe6\x9e\xf7\xe1\xe8\x67\xdd\xa7\xa1\xb5\x66\xec\x26\x67\x16\x17\xb6\x68\x3b\x5f\x3c\x2c\x14\x85\x58\xfe\x82\x38\xa8\x26\x10\x60\x83\x41\x33\xdd\xa9\xb5\x11\x1d\xce\x4c\x24\x78\x6c\xac\xa8\xe1\xe5\xb6\x14\xb7\x49\x3a\x1c\x7f\x05\xdf\xb4\xc3\x18\x9b\xb8\x32\x3b\x9a\x84\x11\xf2\x58\x00\xaa\x8d\x00\x70\x70\x0d\x24\x1e\xbf\x98\x92\xb7\x92\x54\xb1\x7a\xf0\x83\xeb\xe3\x55\x36\x3f\xe5\x8b\xfc\x39\x4e\x55\x78\x11\x68\xf9\x19\xc1\xe5\x97\x5e\x43\x37\xc5\x83\x38\xb8\x06\x3e\x9c\xdb\xf7\x5e\x58\xef\x7f\x9d\x24\xc9\x74\xf9\x4b\xe2\xcf\xcb\x7d\x03\xa8\x58\x42\x9e\xcb\xfc\xb2\xe1\x39\x18\x32\x96\x6b\xd0\x01\x76\x10\x07\xd7\xc0\xcb\x5a\x7e\xab\xdf\x3a\xa5\xe7\x37\x12\xf2\xec\x0b\x7b\xe5\x0a\x07\xca\x1b\xb9\xb8\xa5\x2f\x04\x6e\x59\xd5\x72\xa2\x73\xcf\x43\xbb\xc1\x20\x0e\xae\x81\xba\x26\xd5\xa7\x01\x54\xb7\x7f\x3c\xfb\x68\xa2\xd5\x8d\xad\x33\x1e\x78\xe7\xa6\x15\xdf\xf5\x5a\x43\x4b\x63\x63\x4f\x22\x66\x71\x0f\xe8\x60\x3c\x80\x83\x6a\x83\x01\x36\x18\xb4\xec\x38\x4d\x03\xf5\x2b\xec\x0f\x3d\x32\x26\xe4\xe7\x46\xc7\x2d\xbb\x89\x5b\x96\x4a\x1c\x08\xce\x87\xf7\xfb\xcb\xe6\xf9\x1b\xef\x0a\x90\x8d\x41\xa9\x15\xc4\xc1\x35\xb0\x79\x73\x9e\x51\xb1\x77\x2c\xa5\xfc\xfd\x03\x1f\x14\x9c\xb4\xf8\xf0\x9c\x0b\xe5\x04\xd9\xad\xd4\x0c\x62\x4d\x97\x63\xbc\x5d\xa0\x12\x29\x10\x07\xd7\x40\xd8\xd6\xed\x1c\x09\x4a\x9c\xab\x45\x74\x94\xbb\x97\xee\x95\x94\xce\xd0\x92\x64\xd9\xdd\xb7\xfb\x2a\x34\x27\x36\xc7\xf9\x27\x41\x1d\xda\x65\x06\x70\x70\x0d\x6c\x92\x19\x7a\xed\xbf\x52\x7d\xf8\xf4\xd6\xf5\xab\xcf\xa6\x5d\x98\x89\x38\x6d\x2c\x05\x44\x24\x2f\xf8\x19\xa7\xdd\x20\x1e\xf9\x00\xb5\x0a\x03\x71\x70\x0d\x78\x4c\x36\xf9\x89\xce\xfe\x34\x99\xf3\x40\x7f\xd9\xfd\xe7\xee\xfb\x43\x0f\x9c\xcf\x77\x75\x8f\xef\x44\x78\xd2\xf9\x5d\xbc\xf7\x6e\x04\xa1\x01\x10\x07\xe5\x01\x80\x0d\x06\x59\xa8\xd3\x6d\xb0\xf1\x4f\x83\x34\x54\x96\x7d\x77\xdf\x09\xae\x8c\x9b\x2a\x0a\x27\xa5\xa6\xb4\x2f\xaa\x9b\x45\xaa\x76\x33\xf2\x6f\x1b\xeb\xdb\x2a\x21\x2c\x25\x88\x43\xb6\xc1\x38\x11\xb5\x02\x95\x8a\xf9\x7d\x7e\xce\x9a\xd1\xef\x1e\xc4\xf8\x7a\x49\xec\xe0\x8d\xa4\x5c\x9f\x0d\x89\xac\x4b\x4b\xc1\xac\x8d\x41\x44\x06\x71\xc8\x36\x78\x3a\xd0\x1e\x5f\x80\x78\x41\x14\xf7\x71\x70\xba\xc6\x9f\x91\xd1\xc6\xe7\x81\x0f\x31\x8b\x9d\x1b\xdc\x71\xfd\x6c\xb1\x7f\x96\x75\x41\x07\xb9\x01\xdc\xff\x67\x83\xff\x53\xcf\xbd\x68\x8d\x72\xe9\x4f\x1c\xeb\x6d\x0c\xca\x59\xd5\x5d\x5f\x0e\x8b\xe4\xd8\x5f\xed\x9c\x27\xb6\x77\x98\x92\x48\x96\xe5\xab\x2b\xaf\x42\x36\x18\xed\x98\xe4\x57\xd2\xa1\x2c\xad\x55\x4b\x2c\xed\xab\xd9\x90\x84\xfe\xcc\x80\x07\x1a\x75\x7a\x91\xce\x76\xb5\xae\x97\x76\x89\x9b\xff\xb6\xc1\x9e\x05\xfc\x79\x62\xab\x2a\xe7\xd7\xa6\xd1\xf0\x92\x63\xe8\x96\xd9\xb5\x9e\x11\xed\xda\xdd\x76\x64\xe4\xab\x91\xc6\x93\x24\x72\xff\x0b\x55\xb6\xf6\x63\x19\x11\x21\xfa\xa9\x91\x20\xa5\xe2\x2b\x52\x7e\x59\xf3\xb7\x8f\xc4\x90\x89\x9d\xc5\x81\xda\x55\x73\xf4\x26\x55\x94\xff\x15\x1b\xec\x83\xf9\xff\x36\xb4\xbf\x6b\x83\x91\x6c\xf0\x82\x51\xea\xb2\xd5\x76\x95\x12\x63\xa5\xd1\x0f\xfa\x64\x83\xa6\x0e\xa2\x0c\xa9\xfc\xee\x1e\x16\x1b\x7c\x15\x92\xc7\x69\x8f\x9a\xcf\x64\xa7\x92\x0b\xc9\xa2\x75\x1d\x19\x5e\xbb\xde\x8a\x57\xb6\xfd\x3e\x93\xc1\x48\xe0\xad\x0e\xa3\x5c\x5a\x98\xb3\xef\x94\xd3\x2f\xd9\x90\x1c\x53\x33\x4c\xd9\x33\xd9\x97\x45\xf6\xc1\x6c\x35\xa6\x3e\x2e\xb6\xbf\x71\xb5\xa8\x55\xa4\xb1\xd8\xf3\xd0\x33\x74\xd0\x5d\x8c\x3a\x8a\x57\xe5\xc6\x5a\x0b\x02\x6d\x03\xcf\x66\xb4\x5a\x48\x1f\xbb\x79\xc2\xa9\x9f\x12\x22\x50\xff\xde\x48\xc0\x7f\xa1\x1e\x87\xf5\x77\xe5\x85\x5a\x07\x4b\x37\x1c\x47\xc7\x8c\xef\xb7\x70\x30\x1e\x9d\xc9\x68\x91\x7d\x30\xf5\x81\xc7\xc5\xe6\x57\x29\xe4\x75\x29\x6f\x05\xdb\x13\xc7\xb3\x06\xe3\x78\xf3\xf4\x6d\x35\x50\x5e\xcb\x08\x95\x4e\xa5\xec\x3a\x9f\x99\x0f\x06\x89\xe8\xb4\x99\x4f\xb0\xae\x51\xc7\xea\x37\x73\xa8\xe3\x8b\xce\xa0\xe0\x9f\x4e\x54\x5a\x4c\xa4\x8f\x0d\xb4\x6e\x50\x2a\x60\xd3\x89\xd7\xed\xe5\x99\x43\x7b\x76\x00\x0e\x69\x3b\xb8\xdb\x2d\x19\x1f\xbb\x81\x91\x3d\xfc\xd9\xbc\xf3\x82\xce\x03\x62\xe9\xd9\xb0\x5c\xf5\xe7\x83\x0f\xb1\x88\x29\x9e\x07\xe5\xd3\x42\xdb\xc1\x00\x0e\x3e\xf3\xdd\xa6\xeb\xf6\xc4\x32\xa1\xf2\xa0\x8d\x1c\x88\x52\xba\xc5\xfb\xcc\x6b\x7f\x2b\x6c\x16\xf7\xa6\xfc\x95\xc3\x9f\x0d\x42\xf8\xe5\xa8\x88\xb8\x20\xce\x4f\x0a\x85\xf0\x3f\x67\xd6\xbc\x69\xd9\x7e\x44\xbb\x96\xb7\x62\x19\xb9\x59\x64\xb9\x1c\x55\x5d\x4c\x79\x14\xfc\x53\xef\x92\x3a\xef\xeb\x27\x3c\x8b\xd4\x2d\x50\x37\x1f\x00\xe7\x27\xf5\xdf\x6b\xe7\xf8\x1f\x2b\x62\x5c\x67\x89\xd8\xf3\x0c\xb1\x4a\x2c\x08\xc2\xc0\xb7\x6b\x47\x9b\xff\xd2\x79\xc4\x95\x2d\x85\x5f\x9a\x8f\x6f\x14\x81\x30\x41\x20\x0e\x2a\x0e\xfe\xb7\x0f\x06\xfd\xa1\x4f\xed\x13\x9c\xfe\xd5\xe7\xd7\x62\x82\x06\x7b\x3e\x5b\x2a\xc9\xfb\x17\x2f\x02\x51\x66\x82\x29\x3b\xd0\xbf\x57\xef\x74\x5f\x48\x69\x8e\x82\x76\xee\x41\x1c\xd2\x51\x50\xee\x42\x9e\x6d\xfe\xbd\x32\x5a\xaf\x9f\x16\xd9\x99\xea\x51\x7e\x45\xec\x35\x68\xb2\x8b\x4a\x85\xea\x44\x9e\xf8\x92\x23\xd1\x88\xb8\x20\x0e\xe9\x72\x2b\x6d\x5d\xbc\xd2\x4e\x2b\x02\x9e\x8e\x6d\x5c\x26\x89\x0b\x61\x2c\x21\x5a\x29\xa4\x46\xa4\x2a\x02\xd8\xee\x6b\x81\x51\x0c\x50\xdf\x51\x10\x07\x97\x40\x8c\x3c\x2a\x49\x8f\x6b\x96\x14\x49\xcb\x14\xd5\x15\xdb\xc0\xc7\x69\x81\x39\x9f\xde\x0e\x1e\x19\xdc\x56\xf2\xb9\xa2\xe1\xc6\xa9\x84\x88\x0b\xe2\xe0\x12\x60\xe1\x8d\x8d\x65\x42\x45\xab\x7d\xa9\x59\x47\xfb\x30\xee\x8f\x1c\x8f\x5e\x89\x96\xcb\xc0\x95\x3b\x5a\x74\xc6\xb5\x0f\x35\x35\xfb\x11\x8b\x1f\x10\x07\x55\x05\x72\xfd\x7b\x01\x0c\xca\xae\xa7\x69\xe0\xed\x8b\xfa\x1d\x55\xed\xce\x4f\xf4\x28\xf6\x4b\x3b\x5d\x71\xd7\xde\x53\x54\x98\x15\x75\x4d\x7c\x0d\x9b\xe6\x65\xaf\x78\x4a\x0f\xdd\xc7\x0d\xe2\xe0\x1a\xf8\xea\x5d\x5a\x71\x7c\xd1\x49\x3b\xf5\xa0\xe9\xfc\xf5\x0f\x97\xa6\x58\xd2\xd5\x3e\x79\x59\xb2\xcd\xdb\xd0\x4c\x44\xa8\x89\x5b\x40\xfb\xb6\x20\x0e\xae\x81\xe2\xb0\x30\xbc\xa4\x70\xcf\x79\x71\x14\xeb\xb2\x99\x46\x27\x35\xe5\xe3\x4b\x99\x4b\x79\xed\xd5\x72\x5f\x04\xfb\x63\x4f\xb2\xa0\x9b\x83\x41\x1c\x5c\x03\xf5\x31\x79\xca\x54\x4a\x39\x7c\x3b\x9e\x46\x69\x32\x62\x71\x03\xd1\x42\xdc\x86\xa1\x5d\xb7\x2d\x2f\x6e\x0e\x73\x51\xd3\xbe\x86\x8e\x30\x80\x38\xb8\x06\x36\x49\xc9\xe9\xe7\x63\xc2\x3f\x1b\xbd\x6a\xdb\xb5\x90\xa5\x88\xb3\xd2\x37\x6c\x24\x28\xba\xdf\x26\x4f\xe8\x66\x6e\x5d\x6a\xf2\x14\xa1\x01\x10\x07\x55\x05\x02\x8c\x30\x68\xaa\x3b\x4d\x03\x4e\x04\xca\x75\xf9\xef\x1c\x87\xbd\x9d\x28\xf0\x2e\x53\x67\x35\x24\xf9\xd6\x6f\x67\xf6\x3d\xdc\x1e\xbb\x17\xc5\xa5\x6a\x55\x2e\x07\xed\xb1\x03\x38\xb8\x06\xe8\xd7\x1b\xe2\x87\xd2\x97\x1e\xae\x5e\xe1\xbd\x82\x63\xb7\x5f\xf0\x3e\x62\x52\x17\x3d\x5e\xfa\xb2\xf2\xfc\xa5\x91\x6b\xf5\xc4\x50\x3f\x07\x10\x87\x74\x32\x48\xe2\x44\x2b\x58\xf9\xc5\xa1\x51\xe0\xf2\x7a\x88\x64\x7a\xc8\x48\x02\xad\x06\xb3\xf8\x9b\xb4\x47\x17\x2a\xb9\xdf\x77\x1e\x2c\x41\x27\x83\x00\x1c\x5c\x03\x0e\xe3\x5d\xe4\x53\x25\x43\xd5\x52\x77\xbe\xe5\x3e\x48\x7e\x85\xd3\x3b\xb7\x5d\x7d\x59\x83\xda\xa0\x82\xec\xad\xb6\x96\x9d\x17\x74\x91\x3a\x88\x83\x6b\x80\x53\xfe\xfa\x6c\xb5\xe9\x7b\xfc\x36\xff\xaa\x68\xde\x57\x17\x96\x68\x4c\xd5\x83\x0c\xf3\xa8\xdb\x72\x8b\x02\x9d\xc7\x2f\xb8\x7c\x41\x68\x00\xc4\x41\x79\x40\xeb\xdf\x1a\x00\xad\x3b\x4e\xd3\x00\x01\x06\xf5\xf1\xbd\x9e\xbc\xed\x51\xa5\x8b\xa6\x0e\x39\x22\x56\xde\xe4\x7d\x1c\x4f\x23\x25\x6f\x70\xd4\x11\x28\xcd\xdc\x8d\xa9\x84\x7a\xb0\x03\x38\xb8\x06\x56\x7e\x77\x8d\xba\xa2\x50\x19\xb5\x26\x7d\xa4\x7a\x2a\xd6\x40\xeb\x7f\x44\xd5\x25\xa7\x83\xa7\x12\x88\xc6\x61\x60\x4d\x21\x9b\x8d\x88\x0b\xe2\xe0\x1a\x78\x1e\x85\x81\x73\xe1\xcf\x62\x20\x5d\xb7\xb1\xef\x39\xa3\xc1\x02\x39\x3d\xa1\x0e\x95\xe2\x0d\xb6\xc1\x9b\x9a\xe6\x82\xa3\x35\x17\x11\x71\x41\x1c\x5c\x03\x68\x7a\xa9\xd2\xb3\xe9\xf9\x1f\x2a\x93\x0d\x96\x5f\xf3\xf1\x53\x14\x18\xf9\x50\xc6\xf3\x4d\x10\xd2\xae\x74\x95\x9e\xa7\x98\x85\x34\x0b\xe2\xe0\x1a\xd8\xef\x20\xd0\xc0\x7a\x10\x2c\x3e\x3f\x78\x28\x46\xda\x63\x2e\xee\xbd\xc3\xf3\x09\xc7\x25\xf5\xe4\x5c\x6b\xf5\x4f\xef\xe3\x6d\x1b\x84\x06\x40\x1c\x94\x07\x00\x46\x18\x64\xa2\x4e\x37\xc2\x5c\xfc\x0e\x18\xc6\xa6\xe8\x9a\x46\xa2\x4b\xa4\x2e\x27\xc5\xcb\x7d\x73\xbf\x68\x76\xb6\x3c\x93\xd7\x8e\x04\x6b\xf0\x5d\xf2\x26\x10\xa6\x12\xc4\x21\x1b\x61\x09\x13\x3d\x71\x3c\xab\x2b\x2d\xe3\x6d\xaf\xe3\xcd\x6f\x88\xd7\x8c\xc8\xfd\x71\x7f\xe0\xf9\x61\x6c\x70\x56\xfb\xb7\x62\xe0\x23\x71\x44\x64\x10\xe7\x27\x83\x82\xf3\xdf\xc8\xcf\x7b\x6b\xe7\x19\x2c\xfd\x7f\xee\x39\x4a\x1b\xe3\x25\xb4\x93\x8f\xbe\x2d\xbc\xaf\xf8\x24\xec\xda\x6d\x1d\x2d\xb3\x9c\xd4\xb8\x60\x44\x64\x10\x87\xfc\x34\xfe\x9f\x6f\x0e\xae\x0c\xf8\x79\x69\xc3\x75\xfc\x29\x17\x96\x6d\x55\x75\x62\xf7\xe2\xf0\xf2\x73\x27\x6d\xb2\xb8\x90\xe3\x0a\x2d\x8e\xa0\xa0\xe8\x8c\xbf\x8d\xf0\x04\xe3\x60\x21\xcb\xcb\x0f\xb7\x0c\x68\x06\xad\x1f\x31\x8b\x3d\x89\xf2\xac\x24\xd6\xd2\x9e\xa5\xaa\x26\xd3\xce\x98\xa3\xe1\xce\xfe\x0b\x75\x7f\x38\x1b\x26\x8e\x6a\xc3\x9f\x74\xc8\x3e\xce\xed\x9d\xa0\xf4\xd1\x95\xc2\xf7\xa4\x26\x6e\x80\x7a\xe0\xe3\x2f\x91\x6a\x53\xf5\xff\x35\x23\x0c\x1a\xda\xdf\xd5\xc1\x48\x46\xd8\x49\x0c\xa3\x9e\x21\x70\x71\xcb\xd0\xd1\x56\x89\x8d\x2b\x52\xbd\xaa\xc2\xcc\x7b\xd4\x36\x27\xeb\x70\xe8\xe5\xdc\x12\x33\xfa\x59\xec\x07\xcb\x48\x20\x1b\x61\x73\x86\xd6\xf0\x14\xfb\x1d\xfd\xa0\xe8\x90\x90\xf2\x73\xab\xa4\xb8\x28\x2c\x9d\x9e\x24\x73\x57\xf5\x9f\x5b\xe6\x9c\x9b\xab\x3b\x03\x8f\x16\x22\xd3\x74\xca\xb9\x68\xf9\x1d\x41\xd9\x9d\xe6\x5c\xf5\x34\x6d\xb1\xb2\xd1\xd8\x22\xc1\xe7\xb7\x63\x8f\xc2\xd7\x5c\xbf\x93\xb8\x87\x7f\xec\x24\x45\x39\x93\xd1\x22\x1b\x61\xd5\xba\x00\x2a\x5a\x8e\xc7\xf9\x9f\xce\xe9\x7c\x8a\x32\x97\x7b\xcc\x1f\xc1\x44\x35\x39\xc3\x62\x25\xe1\x90\x5e\xd1\xfd\x80\xb4\xe5\x4c\x46\x8b\x6c\x84\x65\xb9\x35\x27\x6b\x1b\xb3\xf4\xa6\x0d\x2b\xc7\x0a\x02\x9c\x88\xf0\xf2\x78\x64\x8d\x16\x1b\x89\x15\xac\xdb\x4c\xb1\x2a\x29\xb0\xcf\xcc\x08\x83\x44\x74\xda\xcc\x77\x7d\x6b\xa6\x07\xf5\x52\x0e\xa9\x8b\x8b\xab\xed\x95\x81\x24\x02\x6c\x4b\x3f\x45\xeb\xd9\xad\xc3\x01\x2d\x9c\x4a\xbc\x7a\x8a\x71\xe8\x46\x0b\x00\x07\x9f\xf9\x76\x8c\x75\x09\x15\xf2\x5c\xce\x77\xde\x6f\x1f\x45\x29\x2b\xa2\xb3\x7f\xc4\xc3\x12\x5a\xe4\x71\x9d\x81\xca\xd1\xc1\xf0\x32\xae\x18\x22\x2e\x88\x83\xcf\x7c\x4f\xad\xe4\x2d\x3e\x7d\xec\x5a\xbf\xf8\xdb\xe4\x43\x76\xcc\xd3\x30\xab\xb2\x5b\x62\xb1\x11\x87\x98\xe8\x11\x09\x17\x86\xac\x4d\xa0\xd3\x70\x20\x0e\x3e\xf3\x91\xa1\x6e\x1c\x7e\x7e\xa2\xcd\xef\x42\xe6\x4e\x8f\xa1\x23\xbb\xff\xf0\x3a\x47\xca\xcd\xd0\x32\x12\x2c\xeb\x3b\xdf\xe5\x37\x47\xa0\x2d\x26\x10\xe7\x27\x25\xf1\x9f\xe7\x60\xd8\x81\xaa\xfc\xf0\x23\xe5\xae\xb3\xd7\xc1\xd1\xf7\x2c\xe2\x3b\xb1\x5a\x9f\x43\x79\xdf\x5f\x2c\xa6\x0a\x26\xfe\x8c\xf2\x3a\x79\x10\x61\x84\x41\x1c\x54\x1e\xfc\x6f\x23\x0c\xfa\x43\x9f\x26\x81\x15\xf9\x6b\x25\x96\x72\xd5\xec\xad\xed\xa8\xb3\xf7\xbf\xa0\xc9\x4d\x18\xe4\xbd\x5e\x7f\xca\x27\xb2\x95\x50\x97\x2d\xdd\xe1\x62\x00\x2d\x52\x00\x1c\x5c\x02\xca\x12\x4e\x37\x09\xae\x79\x8e\x7f\x6b\xb7\x20\x14\x08\xf9\xf8\x23\xeb\x56\xd6\x04\x81\x0c\xad\x5a\xc7\x94\xa3\x12\x1d\xf3\x02\x74\xd8\x16\xc4\xc1\x25\x30\x57\xa1\x3e\x83\xd3\x68\xec\x41\xb5\xd8\x5b\x43\xe2\x73\x7e\xde\xb9\xa2\xb9\xbb\x76\x83\x21\x9d\xb8\xa2\xf6\xde\x87\xd0\x37\x50\x8b\x24\x10\x07\x97\x80\xe9\xc9\x71\xfb\x07\x25\x35\x1c\x14\x61\xe2\x89\x4f\x34\x0c\x44\x49\x65\xb6\x6f\x09\x74\xde\xe3\xac\x5c\xd9\xbd\xcc\x90\x63\xea\x8a\x88\x0b\xe2\xe0\x12\xa8\x68\xbf\x27\x2b\xa3\xee\x3a\x97\x54\x96\x4e\x65\x73\x43\x93\xe6\x70\xe7\x8f\x71\x50\x61\x97\xac\x43\xcf\xea\x66\xf8\xaa\xfa\x18\x62\xf1\x03\xe2\xa0\xba\x40\x80\x11\x06\x65\xd7\xd3\x34\x80\x61\xaa\x99\xff\xbd\x44\xc8\x78\xad\x9d\x81\x91\x49\x2b\x2c\xb9\x4a\xd6\xdc\x48\xb2\x83\xbf\x59\xfd\x2e\xc1\xbc\xa1\xc4\xf3\x0e\xc4\xd8\x41\x1c\x52\xc3\xf0\x59\x35\x2e\x45\x09\x6d\x3b\xdc\xe1\xab\xef\x53\xa4\x06\xb7\xc9\x67\xb1\x69\x36\x7d\x28\xfa\x27\xf9\xf8\x92\xbe\xab\xb3\x43\xcd\xe7\x40\x1c\x5c\x03\xc9\x1f\x1c\xb4\xf6\x57\x2c\x55\xb6\x7e\xa1\xc8\x63\x74\x5a\x12\xf8\x7f\x11\xda\x4f\x6a\x1e\x7e\x1c\x53\x56\x47\xc7\xc9\xf1\x08\x4a\x2f\x20\x0e\xae\x01\x9c\xd6\x12\xa3\xd7\x2f\xf5\x22\xca\x25\x48\xe5\xcd\xbe\x1c\x3e\xa5\x8d\x40\x8b\xf5\x65\x5a\x61\x14\x52\x27\x7d\x91\xf8\xb0\x1d\xba\x41\x1c\xc4\xc1\x35\xe0\x53\x38\xf3\xa6\xf5\xc6\x28\x79\x8d\x9a\x6c\x68\x50\xfd\x5c\xba\x13\x6e\x93\x76\x61\x76\xdb\xd4\x26\xd7\x5e\x8f\x35\x4e\x91\x23\x42\x03\x20\x0e\xaa\x0b\x04\x18\x61\xd0\x54\x77\x6a\xc7\xf0\xc8\xda\xa2\xa1\xca\x18\x67\x0c\x39\x83\x1e\x5d\xde\x77\x45\x1f\x9f\xd8\x9b\x10\x30\xba\x32\xac\x30\xa9\x19\x7e\x20\xa5\x19\x85\x3a\x86\x03\x38\xb8\x06\x0e\xaf\x5e\x16\x0d\x4a\xf9\x59\x2a\x17\x8d\xa6\x3a\x73\xb8\xfd\xdd\x6e\x1c\xef\xfd\x43\xf9\xaf\xe6\xea\x5b\xd3\x22\xe1\xbf\xfe\xff\xda\x02\x71\x70\x0d\x1c\x3b\x05\x8b\x19\xa1\xee\x51\x6f\x19\x72\x0c\x1d\x78\x99\x8e\xe9\xde\xf9\xd0\x1f\x5d\xfc\x31\x63\x4c\x20\x24\x36\x2f\xbb\x74\x16\x11\x17\xc4\xc1\x35\xb0\x67\xb6\xb8\x24\xe8\x36\x2b\xf3\x7d\x3b\xba\x25\xe0\x7e\x5b\x83\x03\x01\x4a\x2c\xca\xa5\xab\x62\x25\x97\x1f\x4b\x51\x31\xac\x97\x23\xe2\x82\x38\xb8\x06\x2e\xb7\xe1\x3f\xd2\x6b\x49\xbd\xd4\x76\x31\x7a\x14\x93\x93\x9b\x4f\x21\x32\x2f\xb9\x8a\x8e\xd8\x11\x77\xcf\x67\x79\x34\x4d\x37\x02\xa1\x01\x10\x07\xe5\x01\x80\x11\x06\xad\x3b\x4e\xd3\xc0\x11\xae\xb0\xeb\x7b\xed\x57\x4f\x4a\xc7\x17\x23\x46\x6d\x4b\x39\x31\x64\x9e\x2b\xdc\x44\xd7\xcf\x7a\xec\x7e\xa3\x9a\x3b\x29\x1a\x2a\x0f\x02\x71\x70\x0d\xd4\x46\xb6\xd2\xe2\x04\xd4\xcb\x4c\xb3\x94\x44\xff\x0c\x14\xcd\xf7\x1c\x57\x88\x5b\xc4\xcb\xc8\x0d\x78\x30\xf6\x5e\x40\xa6\x0d\xea\xec\x0d\xe2\xe0\x1a\x28\xcc\x12\x3b\x28\xcb\x3a\x27\xc8\xad\x91\xe6\x37\x7f\xb8\x77\xc7\x94\x9f\x51\x79\x25\x71\xce\xd0\x4c\x2a\x51\x32\xea\x20\x07\x3a\x71\x02\xe2\xe0\x1a\x58\x45\xe5\x97\x2d\xda\x59\x32\xeb\xac\x66\x17\x36\x8d\xb4\x22\xd8\x53\xbe\x83\xf9\x22\xc4\x62\x36\xc4\x73\x98\x59\x3f\x5b\x00\x3a\x77\x06\xe2\xe0\x1a\xc0\x74\xf3\x91\xfe\x61\x8e\x95\x67\xa8\x61\x76\xaf\xed\x81\x79\xb6\x90\x34\x29\xf1\x3a\xa3\x83\xbe\x56\xd2\x6c\x13\xb5\xa2\xec\x63\x84\x06\x40\x1c\x94\x07\xfe\x6f\x46\x18\x61\xce\xb2\x45\x95\x07\x5b\x3f\x7f\x99\x64\xc6\xb0\x26\xb0\x54\x26\x74\xf8\x82\x35\x1f\xf6\x64\x65\xb9\x2f\x01\xb7\x9c\xac\xb1\xf9\x6e\xe1\x7f\x76\x29\xe9\x0b\x5f\x6c\x53\xdf\xac\xfb\xa3\x23\x1f\xf0\x4d\x45\x7e\xed\x42\xb1\xfa\x4a\x74\xa0\x57\x1f\x76\xc3\xe8\xfa\x62\xd9\x8d\xbf\x2f\xf7\x9c\xbe\xb6\xd2\x3a\x49\xd4\xee\x6a\xdf\x8a\x96\x66\x6c\xee\x39\x15\xc9\x42\x7b\x89\xc3\xfc\xb9\x04\xff\x0a\xb6\xa5\xa7\x0a\x1d\xcf\xff\x9a\x39\x03\x0d\xed\xef\x9a\x55\x59\xa4\xb6\x42\x72\xfb\x4b\x9f\xf4\xc5\xf5\xd0\xca\xbd\x98\x70\x89\x51\xb3\x4a\xfe\xb4\x5e\x6d\x1f\x27\x56\xe1\x70\x32\x34\x0c\x15\xf4\x0b\x3d\x93\x0d\x34\x64\x73\x56\x22\x64\x84\x59\xc4\x13\x5f\x5b\x48\xfa\x9d\xb1\xc2\x8f\xf9\xc6\xd5\x2d\x52\xb3\x0c\x56\x8e\x16\x0a\xb2\xf0\xc0\x57\xaf\xf1\x0a\xcf\x64\xbb\x50\x14\xe9\x63\x7d\x29\x7c\xf7\x9e\xf2\xf4\x27\xdf\x7d\xf9\xad\x58\x57\x27\x36\xf2\x83\xca\xd3\x09\x5e\x7e\x01\x7f\xeb\xb0\x96\x1c\x0a\xde\x88\xb3\xe9\x9c\x8c\x6c\xce\xda\x72\x51\xf0\x12\x62\x7a\xdf\x1b\xf1\x8b\x46\xdf\xcd\xd6\x3a\xb9\x4f\xd4\x8c\x51\xf5\x52\x6c\x2d\xd7\x67\x66\x38\x71\x8d\xb0\xe7\x4c\x46\xeb\x80\xf4\xb1\xb1\x3e\xf6\x7a\x02\x74\xbe\xeb\xe4\x31\x15\x37\x2f\xd8\x3c\xb8\x64\xca\x7d\x64\x78\xfd\x30\x49\xfa\x8d\xe4\xe0\x9c\x94\xb6\x38\xd1\x99\x99\x33\x90\x88\x4e\xcb\xc6\x2a\x52\xf1\x3c\x28\xb3\xdf\x3b\x73\x09\x92\x59\x26\xf7\xc6\x66\x9f\x89\x2e\x92\xdb\x1e\xde\x23\xc3\x17\xec\xa8\x5c\xda\x6e\x82\x3a\x76\x80\x38\x78\x36\xee\xbe\xf2\x3a\xfd\x5b\x43\x60\xd2\x97\xef\x59\x1c\xea\xb6\x58\x6d\x0e\xad\xc6\x51\x5f\xa9\x58\xfd\xc2\x2c\x2e\x10\xe6\x7c\x65\xbf\x02\xdd\x09\x00\xe0\xe0\xd9\x58\x4c\xf8\x9e\x3f\x03\x83\x45\x8f\x4f\x63\x83\x68\x4b\xc5\xdb\xc2\x79\xc1\xa4\x89\x0c\x36\x9a\x93\x5b\xb5\x93\xe8\xf5\x62\x3f\xa0\x7e\xbb\x20\x0e\x9e\x8d\xf1\x62\x8a\x59\x24\xf7\x93\xe9\x0b\x42\x56\x0a\x1b\xad\x16\x6a\x36\x4a\x3d\x9e\x87\x9a\x13\x53\xb2\x72\xb2\xf3\x59\xa2\x48\x40\xcf\x01\xc4\xf9\x49\xfd\xb7\x01\xde\x21\x31\x3b\xc3\x6e\x7d\x44\xf5\xcb\xf9\x4f\xe2\x52\xa4\xbc\x3c\xf9\x86\xdf\x28\x7f\x50\x49\x7e\x34\x0e\x61\x5c\xe9\x40\x95\xd5\x47\x98\x33\x10\x07\x15\xad\xca\xfe\x73\x42\x06\xfd\xa1\x4f\x93\x00\xa6\x99\x04\xbf\xdc\x21\x4b\x98\x66\x75\x7a\x21\x2f\x95\x76\xcd\x5d\xb7\x90\x11\x89\xcc\xac\x26\xba\x0f\x4b\x6c\xa1\xef\x4a\x05\xa1\x05\x34\x80\x43\xba\xc5\xf0\x92\x2a\xd7\x3b\xac\xa8\x3f\xee\x91\xd8\xf7\x1e\x36\xe0\x32\xf3\x74\x5c\x67\x8a\x54\x5d\xbd\x4f\xf4\x30\x44\xa2\x8b\xea\xe7\x11\x22\x2e\x88\x83\x4b\xc0\x2e\x3d\x73\x87\x8d\x3f\x24\x8e\x6f\x0b\x8f\x61\x82\x11\xfd\x26\x0b\xae\x79\xe9\xab\xa9\x8a\xe3\x6b\x56\x04\x9a\x56\x11\x54\x53\x88\xb8\x20\x0e\x2e\x81\x6b\x9f\x8b\x2c\xa6\x6f\x99\xf8\xd4\x78\x08\xec\xe1\x58\x3b\x52\x7e\xbf\x84\xf3\x29\xf9\xd3\xb8\x79\x2f\xeb\xe1\x90\xcf\xb1\x19\xd4\xbf\x13\xc4\xc1\x25\x90\x6a\x77\xeb\x1d\x21\x91\xf8\x6a\xd1\x3b\x4a\x1a\x6b\xa7\x80\xbe\x07\x47\xbf\x16\xe8\x9e\xd3\x50\x3e\xef\x77\x39\x46\x97\xfb\x69\x8e\x98\x90\x41\x1c\x54\xad\x06\x30\x67\xa0\xec\x7a\x9a\x06\xf4\xf2\x1e\x31\xcf\xd0\x12\x8d\xd7\x4e\x69\x9a\x27\x54\xcd\xf0\xf2\x09\xbe\x31\x7a\x3c\xb0\xbe\x80\x49\xc4\x7c\x7b\x5a\xe3\x1c\xf4\xb6\x1f\xc4\xc1\x35\xf0\x64\x67\xd7\x35\x3a\x3f\x4a\xe9\x0b\x1e\x5a\xbb\xdd\x7b\xf4\x84\x43\xb9\x0b\x3b\x58\x4b\x8a\x56\x4b\x4a\x6f\xf9\xd7\x70\x96\xa1\xaa\x55\x10\x07\xd7\x80\x06\xf6\xd5\x9b\x33\xd4\x8f\x04\xe9\x52\x7b\x7e\xaa\xa9\x85\x96\x8a\x6b\x67\x65\x3e\x2c\xe7\x11\xe5\x35\x5e\x4e\xcc\x0a\xba\x0d\xb5\x5a\x03\x71\x70\x0d\x7c\xa1\x50\xd0\x0b\xb9\x3b\xad\xaf\x94\xe0\x12\xfd\xa1\xbe\x70\x02\x03\xa3\x63\x2b\x46\x61\xe6\x21\xef\x2b\xea\x20\x57\x32\x5b\x68\xa7\x1a\xc4\xc1\x35\x60\x37\x82\x39\x99\xf0\xc3\x86\x0d\x33\x04\xbf\x48\xcb\xda\x07\x2d\xe6\x88\xc2\xc9\x80\xdc\xad\xda\xa6\xde\x4c\xfc\x13\xb1\x0c\x2b\x42\x03\x20\x0e\xaa\x56\x13\xfd\xb7\x06\x40\x53\xdd\x69\x1a\xd0\xae\xa9\x79\xcc\x74\xe2\xe8\x70\x90\x31\x74\xab\x4a\x91\xad\x4f\x1d\xb3\xc5\xfa\xea\xe5\xdf\x95\x85\x25\x8e\x32\xaf\x1f\x49\xdb\x22\xc6\x0e\xe2\xe0\x1a\x20\xe1\xfa\xaa\xbd\x6d\x3f\xea\xa4\x81\x79\x39\xe5\xb7\x84\xe9\x16\xf3\x3b\x26\x4a\x4e\xf3\x51\x87\xf8\xb6\x3d\xb3\x67\x5d\xa9\xd5\x88\xb8\x20\x0e\xae\x01\xfa\xd0\xbe\x17\x17\xac\x1f\x65\x3c\xa6\xcb\x8b\xeb\x6b\x8a\x79\x84\x72\x39\x57\xf3\xb5\x98\x1f\x1d\x7d\xf7\x2a\x27\x13\xa3\x6b\x2b\xb4\xfb\x09\xe0\xe0\x1a\xf8\x16\xe6\x9f\x90\x9f\x63\xdf\xdf\x93\xa4\xab\xd7\xa6\x73\x8b\xcf\x5c\x5a\xaf\x49\x90\x4e\x6f\x4d\xaf\x77\x9b\x1f\xf3\x98\x3a\x0a\x11\x17\xc4\xc1\x35\xa0\xd6\x41\x47\xc6\xea\xa1\x47\xb3\xbf\xcc\xfd\xe8\x38\x31\x42\xbb\x66\x90\x90\x2b\x30\x7a\xdb\xc5\xaa\x98\x7f\x8a\x69\x23\xcd\x17\xa1\x01\x10\x07\xe5\x01\x80\x39\x03\xad\x3b\x4e\xd3\x00\xe5\x2f\x92\xf8\x44\x5a\x8f\x07\xf5\x58\x98\x5c\x6e\x1f\x88\x7e\xe0\x35\xba\xb0\xf8\x45\xe0\xac\x84\x38\x3f\xee\x1c\xd1\x95\x85\xfa\xf8\x81\x38\xa4\x23\xdb\x7f\xf2\x28\x37\x72\xab\x3e\xe0\x0e\x93\xe8\xbd\xbb\x16\x57\xf1\xf3\xf5\x46\xb8\x71\xf1\xf9\x3e\xb4\xb0\xd7\x1a\xf8\xa3\xae\xa6\xd0\x91\x6d\x00\x07\xd7\xc0\xcb\xc6\x4b\x7e\xdf\xc5\xea\x6a\xa9\xd9\x3e\xe0\x4f\xa5\x2c\x1e\xde\x3e\x5e\x32\x62\xb7\xbb\xd7\x4f\x64\x30\x6f\xd9\xcb\xa4\x04\xdd\x96\x0c\xe2\xe0\x1a\x30\xec\x93\x11\xc2\x3f\xef\xfe\xe4\xc3\x5d\xab\x86\xf5\x8f\x64\xfb\x52\x1f\xf4\x44\x57\xe5\xdd\x0b\xf7\xec\x70\xe7\x3e\xcb\x2a\x42\xa6\x0f\xc4\xc1\x35\x60\x52\xf3\x56\x42\x39\x7f\x78\xe2\x29\x6a\xd8\xf4\xa2\x2f\x69\x69\x62\xcd\xed\x8c\xde\x86\xbc\x91\xb7\xd9\xd8\x78\x06\xc2\x74\x13\x08\x0d\x80\x38\x28\x0f\x38\x00\xcc\x99\xa4\x6b\xba\x7d\x9a\xbc\x1c\xff\x98\x3b\xce\x16\xea\x34\x43\xe2\x11\xb7\x23\x73\x45\x4e\x9b\x96\x39\x15\x65\x54\x08\xba\x6d\xee\xdf\xe6\x4c\x28\x7c\xdc\xf0\xbd\x4f\xa8\x88\x65\x6d\x59\x96\xf6\xe0\x45\xcd\x8c\xee\x9e\x9f\x37\x1d\x8b\x84\x83\x5b\xd7\x1d\xea\xcd\x50\x0a\xfe\x7e\x31\x22\x4d\xb0\xd5\x45\xfb\xe7\x1d\xce\xad\x27\x19\x12\x05\x6b\x1f\x9e\x1a\x2a\xdc\x6f\xaf\x78\x15\x11\xb0\x2d\xc9\x62\x1f\x93\x28\xf2\xbf\x66\xce\x40\x43\xfb\xbb\x92\x12\xc9\x9c\xc9\xe2\xa8\x18\x78\x7f\xf3\x08\x78\x5e\x53\x57\x64\x15\x6b\x7d\x41\xc0\xf2\xe2\x18\x0e\x7e\x50\x8e\x3b\x8e\x1f\xce\x2f\xa6\xe0\xb3\xe9\xf9\x8a\x6c\xce\xda\x2d\xf1\xbe\x3c\x7c\x85\xd3\xee\x4c\xd9\xf0\x08\x43\xee\x98\x90\xa7\xd2\xc9\xe2\x69\xd8\xf5\x21\x07\x5b\xc7\xb9\xd6\x90\x12\xaf\x33\xd9\xc2\x42\x36\x67\x54\x27\xc1\x14\x64\xaf\x78\x8d\x8d\x2f\x5f\x21\x8a\xaa\xdc\x39\xdf\xc3\x9d\x76\xe0\x2a\x4c\x16\x24\xd5\xd9\x70\x37\x47\xaa\x43\xe7\x4c\x46\x8b\x6c\xce\x04\x1b\x5b\x18\x9b\xe8\x30\xba\x9e\xff\x92\xa1\x3b\xaf\x8f\x71\xa0\x2a\x6f\xf2\xf1\xd6\x54\xd6\xcd\x71\x63\xf4\x4e\xcc\x1b\xab\x83\x67\x32\x5a\x64\x73\x36\xf0\x89\xe1\xda\xe8\x6b\xad\x07\xc2\x46\x2b\x2e\x79\x1d\x42\x3a\xd7\xc3\xe3\xcf\x35\x08\xfa\xd0\x9e\x18\x7a\xae\xbe\x6b\xff\x6c\x75\x66\xe6\x0c\x24\xa2\xd3\xb2\x31\xa9\xde\xaa\x9e\x4e\x87\x39\xfd\xcb\x78\x96\x67\xf9\x29\xda\xd9\x5a\xb8\xf1\xb6\xa2\x85\x6e\xe5\x15\x1e\x8f\x99\x1e\xcd\xc4\x43\x2d\xef\x40\x1c\x3c\x1b\x47\xe6\xaa\xab\x5d\x4e\x95\xa0\x43\xe5\x5c\xab\xf6\xfc\xac\x76\xd9\x87\xd7\xa9\x2d\x04\x9f\x6d\x83\x4d\xfe\x20\x3a\x94\xff\x1e\x94\x35\x41\x1c\xd2\x3d\xe0\x2b\xac\x8c\x1a\x3e\x8f\x50\x3a\x18\x59\x13\x87\x2c\x1b\xbe\x10\x45\x2d\xea\xb2\x05\xe9\xfc\xe0\xdc\x1e\x5b\xd1\x79\xc5\x0f\x9d\x77\x04\x71\xf0\x6c\xdc\xd7\x59\x1f\x72\xa7\xfb\x6b\xd1\xa7\xa7\x3d\x6e\x8a\xd6\x04\x66\x27\xd1\x34\x53\x53\x0a\xeb\x71\x8b\x34\x0b\xa9\x15\x49\xc2\x50\xfb\x47\x10\xe7\x27\xf5\xdf\x7a\xf4\x47\xdb\x89\xc7\x1c\xe4\x5b\x95\x97\xcc\x57\x5a\x59\x67\xde\x14\x4f\x37\x10\xf2\x56\xf5\x5d\x21\xd3\xa8\xb5\xde\x56\xa4\xd3\x12\x41\x98\x33\x10\x07\x95\x52\xfe\xdb\x9c\x81\xfe\xd0\xa7\x49\xe0\x9b\x5e\x3f\x57\xd6\x4e\x6c\x75\x13\xaf\x00\xca\xfd\xbb\x81\xc6\x3d\x0e\xe1\x12\x31\x29\xd5\xad\x87\x1c\x04\x52\xec\xc5\x9f\x4b\xa1\xc5\x08\x80\x83\x4b\xe0\x24\x4b\x7d\x7e\xc8\x91\x58\xd8\xed\x5b\x4e\x56\xcb\x0c\x11\x93\x17\xeb\x64\xdc\x1f\xbd\x97\xd3\x68\x04\x77\x5e\xbf\xd9\x6b\x87\xaa\x69\x41\x1c\xd2\xa2\xcc\x1a\x3f\xa0\x7f\xa2\xb8\xb8\x63\x65\x26\xad\x77\x8d\x9f\xcd\x39\x32\x65\x95\xe4\xcd\x85\xf3\x1f\x06\x12\xa4\xb6\x33\xa6\xdd\xa0\x45\x19\x80\x83\x4b\x40\x4e\x6f\xaa\xd7\xd4\x71\xa0\xb4\x36\x82\xf0\xf6\xe5\xbc\x21\x54\xdb\xa8\xe2\xdc\x73\x05\xc2\x18\xb4\x27\x2a\xd3\xcf\xb1\xe8\xa1\xb8\x20\x0e\x2e\x81\xbb\xe7\xc2\x4f\x44\x92\x3d\x4e\xec\x05\xfa\x26\x0b\x8e\xeb\x82\x92\xb4\xb6\xda\x98\x49\xc2\x6f\xdf\x71\x1e\x65\xcc\x76\x9c\x0c\x43\x4c\xc8\x20\x0e\xaa\xa1\x02\x98\x33\x50\x76\x3d\x4d\x03\x06\xe1\x69\x43\x19\xfa\x63\x84\x68\x2f\x06\x99\x9b\x37\x05\x94\x99\x54\xd8\x44\xb5\x99\x74\x19\x06\xb7\x99\x77\x34\x57\x9c\xa1\x0b\x20\x40\x1c\x5c\x03\xab\x2c\xba\xed\x89\x53\x06\x07\x45\x1f\x5e\x7e\xf1\xfe\x73\x4e\xcc\xc6\x47\x2a\x2f\x21\xce\xc6\x76\xfd\x09\xda\x90\x25\xd3\x15\xa8\xde\x0d\xc4\xc1\x35\x20\x9f\xf8\x52\xea\x2d\xba\x4f\x02\xab\x5a\x99\x56\xdf\x84\xe6\xcd\xed\x84\x52\x95\xb7\xb2\x33\x5e\xf1\x32\xee\xe8\x9d\x65\x8f\x21\x6d\x81\x38\xb8\x06\xde\x0c\x75\xff\xa6\xc0\x29\x61\xce\x7b\x46\x55\x64\x37\x59\xa9\xb6\xfb\xb8\xdf\xb9\xa7\x80\x93\x4d\x74\x39\xd8\xf8\xb5\xc3\xc9\x10\x22\x2e\x88\x83\x6b\x60\x9f\xb4\xc0\x21\x6e\x30\x34\xc4\x90\xdf\x75\xb4\x8e\x33\x56\xcc\xc6\xff\xde\xf3\xec\xdf\xc4\xdb\xd8\xe3\xb3\xb4\x8c\xdb\x6b\xd0\xf1\x41\x10\x07\xd5\x50\x01\xcc\x19\x68\xaa\x3b\x4d\x03\x59\xbf\x16\x71\xd9\x3f\x96\xc6\x5a\x24\xa9\x37\x9d\xa3\xf2\xb7\x25\x14\xcb\xc8\x3c\xb9\x5a\x83\x6f\xe0\x3f\x99\x60\xc8\x60\x0f\xed\xa0\x83\x38\xb8\x06\x30\x58\xdf\xfa\x8d\xa9\x8d\xfe\xce\xed\x71\xce\x25\x19\x7c\x32\xfe\xea\xb1\x8c\x2b\x41\xc0\xcc\xeb\xb8\xbe\x81\x0d\x56\xbd\x87\xd0\xfd\xad\x20\x0e\xae\x81\xf0\x91\xfe\x77\x03\xd6\x7b\x66\x0e\xc4\x2e\x49\x89\x8a\x7b\x34\xc3\x9c\x3c\x92\xfd\x61\xd7\x1c\xa6\x9a\x36\xa5\xc6\x37\x74\x6b\x10\x71\x41\x1c\x5c\x03\x2e\x75\x45\xd3\x76\x54\x1a\x1f\xfd\x92\xdc\x13\xae\xe4\x31\xad\x6b\xda\xf7\x58\x55\x5b\xa5\x5d\xdd\xcf\x31\x71\x97\xbd\xa4\xf5\x01\x11\x17\xc4\xc1\x35\xd0\xb6\x34\x79\x0f\x2f\xf7\x99\xea\xa7\x62\x02\x5f\x19\x8e\x50\xaf\x9e\x0c\x81\x5f\xf2\x16\x5f\xa6\xfc\xaf\x2a\xa8\x74\x5d\xd6\x87\x0c\x3a\x88\x83\xf2\x00\xc0\x9c\x81\xd6\x1d\xa7\x69\xa0\xcc\xeb\xc7\xe1\x71\x5b\x27\xe6\x8d\x5b\xe4\x3e\x2b\xaf\x3b\xac\x84\x6b\x53\x1c\xae\x92\xa5\xef\xce\xba\xfb\x7c\xf1\xf0\xa0\x86\xf2\x00\x88\x83\x6b\xe0\xf7\x4e\x4e\x49\x39\x35\xbe\x76\xff\xeb\xbb\xc5\x32\x82\xd3\x4a\xfe\x8f\xf8\xb1\x43\x0e\x6f\x11\xcc\xe8\x90\x0f\xed\x32\x60\xf8\x23\xe2\x82\x38\xa4\xce\xba\x8f\xa5\xe4\xaf\x52\x05\x97\xf8\xae\x17\x45\x77\xfe\xf1\xe2\x57\x6d\xd4\xb1\x66\xaa\x1e\xb3\x56\xc3\x7d\x14\xdd\x76\xb5\x62\x0e\xea\xac\x0b\xe0\xe0\x1a\x68\xe5\x26\x50\xd4\x28\x9b\x20\x92\x8a\x8e\x6d\xc9\xe2\x78\xc2\xc8\x5f\x4d\x66\xc6\xd5\xf7\x70\x05\xbf\x98\x32\x2e\x33\xa5\x77\x12\x11\x17\xc4\xc1\x35\x20\x12\x56\xfc\xc2\xf8\xc5\xb5\xa1\x23\xdb\x2e\x4e\xa3\x17\x39\x58\x17\x67\xde\xbb\x6e\x78\x16\xc7\xf3\x1c\xe7\x35\xa9\xbe\x9d\xdb\x80\x3a\xeb\x02\x38\x28\x0f\x80\xcc\x59\xf6\x70\xb4\x55\xaa\xa7\x5d\x83\xc0\x8d\xab\x41\x2f\x12\x9d\x15\x2c\x05\xab\x82\xce\x3b\xe4\xdf\x60\xd7\x77\x57\x21\xa9\x7d\x70\xf5\x6f\x73\x16\xc6\x12\x7f\xdc\xb4\x2b\xf5\xf2\x50\xc1\x5a\xfd\x5d\x57\x00\x11\x65\x08\xea\xb9\x32\x03\xbd\x5e\x4f\x43\x13\x09\xb6\xe6\x2a\x9c\xbf\xf3\xef\x8b\x4b\x09\x8a\x9c\x4f\xfb\x71\xd3\x8a\x0e\x82\x79\xb0\x5a\x4d\xd6\xd9\x06\xa4\xfa\x7e\xa1\x6d\xd4\x6c\x05\xb0\xb9\x1d\x8c\xfe\xaf\x99\x33\xd0\xd0\xfe\xae\xef\x43\x32\x67\x74\x7d\x1a\xa5\x26\x54\x9d\xb6\x15\x7c\x5c\x94\x96\xed\xf5\xab\xde\xc4\x25\x01\x59\x3f\xdf\x5a\x33\x2f\x4f\xc6\x09\x6e\x30\x9f\x9c\xc9\xa6\x0e\x37\x92\x6f\xb0\x44\xd3\xbe\xe8\xe8\xe7\x15\x94\xf1\xa7\xb3\xa3\x6b\x15\x25\x28\x86\xfa\x2d\x21\x5d\x90\xf8\x97\x07\x7f\xc2\x5d\xe5\xaf\xdd\xf1\x39\x93\x2d\x2c\x64\x73\xb6\x78\xdc\x26\xfb\x91\xe6\xe1\xed\xf0\x90\x1a\x85\xf7\x97\xd8\xcd\x06\xd9\x46\x47\x46\x69\x7d\xf6\xcc\xda\xde\xa1\x5a\x3d\xb1\x3a\x83\xce\x2f\x21\x32\x28\xda\x48\x1f\x5b\x9c\x2f\x17\x66\x98\xca\xdb\x84\x73\x42\x52\xa3\x3f\x79\xe1\xcf\xd0\xf9\xfa\x8e\xfb\x74\xe4\x28\xaf\x30\xc5\x8e\x4c\xb8\xc3\xcf\xe4\x63\xbd\x91\xcd\xd9\xd8\x76\xdf\x7e\x5c\x55\xd4\xb7\x3d\x79\xb9\x4f\x94\x0f\x88\x98\x39\xac\x92\xb4\xda\x6c\xec\x71\x88\xdd\x0f\xf4\xd8\x1d\xf8\x1d\xcf\xcc\x9c\x81\x44\x74\x5a\x36\x66\x6e\xb1\x5f\x53\x27\x79\x27\xd2\x5d\x31\x89\x27\xc2\x3e\x33\x95\xf8\xf2\x46\x49\x02\xf5\x31\xd6\xb5\x0e\xde\xe1\x5b\x69\xf9\xd0\xea\x09\xc4\xc1\xb3\x31\x05\xbe\x8a\xa6\x61\xfb\xbd\xd2\x82\x01\x3a\x85\x4a\xb2\xe0\x07\x0e\x54\xd6\x9e\xc2\x3c\xa2\x2f\x69\xd1\x36\x2f\x85\xb0\x69\x58\x20\xe2\x82\x38\x78\x36\x7e\xa1\xaa\xff\x7b\x4f\xc2\xf3\xc6\x36\x69\x16\xaa\x71\x5d\xc6\xbe\xff\xd4\xc8\xa2\x5b\x63\xcf\x75\x8d\xcd\x18\xf1\x00\xb1\x6a\xe8\xe6\x47\x10\x07\xcf\x9a\x94\x47\x54\x3b\x66\x04\xe5\x22\x2a\xed\xac\xaf\x88\x4c\xdf\x73\x0d\xa9\x25\xbb\xf4\x32\xb5\xfb\xa8\xc8\x50\x76\x4b\x08\x84\x5e\x80\x5e\x19\x02\x38\xa4\x2d\x89\xbb\xe5\x18\x2c\xe4\x25\x23\x17\x57\xb3\x13\x8b\x98\xfc\x44\xbf\xcb\x9c\xa8\x18\xba\x1b\xda\x27\x16\xdc\x6a\xbb\x8c\x37\x64\x03\x5d\xfe\x09\xe0\xa0\xfa\xbe\x7f\x9b\x33\xd0\x1f\xfa\x34\x09\xcc\xa2\x5e\x7e\x67\xb1\x73\xb1\x8b\x95\xb0\xf1\xfb\xa3\xfc\xeb\x1c\x9d\x0a\x4a\x81\x44\x74\xb5\x83\xe1\xc4\xfd\xc7\xeb\x5a\xc7\x50\xbb\x57\x10\x07\x97\x80\xbf\x7d\xee\xe5\x0c\xee\x6e\x9d\xc6\x3f\x5f\xea\x5a\x1d\xca\x70\x55\xb3\x97\x71\x4c\xf5\x63\xb2\x70\xae\x2a\x92\x65\x79\x44\x1c\x20\xe2\x82\x38\xb8\x04\xb4\x54\x1e\x3e\xb8\xf0\x36\x44\x77\x54\x72\x78\xfe\xb3\xfb\xdc\xdd\x7a\xf4\x11\x36\x2f\xb1\xf4\xf5\xf3\x5f\x48\x6a\x06\x9f\x0f\x41\x9b\x9c\x20\x0e\x2e\x81\x38\x9b\xf3\x1e\x0e\xbb\xe4\xb6\x76\xf8\x0c\x39\x0c\xf4\x9d\xe1\x39\x8e\x57\x6d\x04\x66\x32\x8d\x4c\xf7\x1e\xbf\x6f\xb4\xe8\x87\x2e\x3e\x07\x71\xf0\xe7\xdb\xea\x34\xd6\x51\x73\xc3\xdf\xb1\xe4\x69\x9c\x12\x69\x86\x2d\x83\x94\x70\xfc\x70\x39\xc7\x9d\x1f\x13\x41\x43\x1b\x4f\x8a\x06\xda\xa0\x5b\xff\x00\x1c\x54\xd7\xc3\xfd\xef\x45\x19\x28\xbb\x9e\xa6\x01\xd5\xab\x22\xc7\x35\x9b\xdf\x86\x8b\x87\xdc\x92\x8c\xdc\x1a\xf9\xa6\xca\xce\x5d\xed\x1d\x9d\xcb\x3c\xac\xa0\x6f\xdf\x74\xa5\x81\x16\x39\x20\x0e\xe9\xaa\x07\x61\xaf\x06\x2d\x97\xcc\x47\xc4\x49\x64\xb9\xbb\x03\x4f\x42\x48\x7a\x7a\xf4\x3c\xcb\x74\x84\x1f\xdf\x57\x15\x16\xe5\x76\x83\xae\x51\x00\x71\x70\x0d\xfc\xbe\xe5\x86\x2d\x7d\x81\x5b\x4b\x6e\x4b\x14\x2f\x0b\x43\x05\xb5\x62\x33\x6d\xeb\x6b\xf9\x5d\x1a\x45\xf1\xf5\x89\x64\x7d\x77\x68\xe7\x0c\xc4\xc1\x35\x70\x4d\x8a\x43\xd6\xb4\x4a\x2f\xfa\x31\x2e\x0f\xa1\xe4\x0e\x11\x09\x4b\x9d\x3b\xf7\x49\xd0\xf8\x8f\x41\xa6\xe9\x7a\x35\x6d\xf3\x69\x68\xf7\x14\xc0\xc1\x9f\xaf\xa4\x88\x86\x84\xb3\xa3\xac\x67\x84\xcf\x94\x64\x37\x99\xee\xbd\x9d\x31\x54\xb2\xa7\xb9\xaa\x2f\x0f\x48\x7a\x75\x56\xd3\x68\x89\x11\x1a\x00\x71\x50\x5d\x0f\xc0\x9c\x81\xa6\xba\xd3\x34\x30\xcf\xb1\x4b\xd6\xc9\xa4\x9b\xea\x23\x1a\x80\xc6\xd4\x35\x50\xfb\xa8\xf5\x58\x81\x6d\xe6\xfb\x85\x9a\xf5\x1f\xb1\xca\xaa\x6f\xa0\x14\x08\xe2\xe0\x1a\xb8\x41\xed\x30\x6a\xcf\x79\x15\xc7\xd8\xa6\xe7\xf2\x55\xb9\x85\x68\xc7\xf4\xd7\x07\x97\x94\x2f\x6d\xe4\x68\x33\xb6\x25\xf7\x97\x15\x21\xe2\x82\x38\xb8\x06\xc8\x24\x67\x08\x9e\xee\x4f\xbc\x91\xb0\xda\x30\xb6\xec\x3b\xd2\xac\xb6\xd1\xb9\x87\x82\x69\x3b\x6b\xdc\x2b\x8d\xb1\xfa\x4d\x76\x00\x3a\x89\x0e\xe0\xe0\x1a\x48\x29\x5e\x78\x18\x73\x38\x30\x52\x7a\xe3\x59\xa0\x2b\xe6\x1b\x2d\x4c\x7e\x8b\xf7\xa9\x64\x23\x44\xf6\xe5\x85\x71\x3c\x0a\xa5\x90\xe9\x03\x71\xf0\xe7\x7b\x99\x70\xd3\xc3\x0f\xfd\xc9\xc1\x1e\x59\x26\xfa\x7b\xeb\x93\xef\x94\x1a\x7a\x5c\x77\xbc\xcb\x6a\x1f\xc9\x99\x53\x28\x7c\x45\x1d\x85\x8e\x35\x02\x38\x28\x0f\x68\xff\x5b\x03\xa0\x75\xc7\x69\x1a\x28\xbf\xd3\xe3\x6a\xb2\x70\x89\xf8\x87\x0b\x8b\x48\x79\xb6\x4c\x1b\x7d\xf7\xc0\xbb\x8a\x7b\x28\x35\x44\xe4\x21\x51\x2a\xa3\xbe\x9d\x88\xb1\x83\x38\x24\x0d\xac\xde\x0d\x39\x6f\xa4\x96\x3a\x38\x92\xa1\x2d\xd4\x16\x63\x23\x8b\x4d\x44\x26\xce\x20\xcb\xa9\x3c\x1b\x48\x27\x39\xa7\x16\x0b\x69\x00\xc0\xc1\x35\xa0\x9a\x71\xa0\xb1\x2f\xba\xaf\x52\xf8\xbb\x93\xfb\x31\x76\x97\x04\x7e\x38\x96\x24\x2e\x1f\x01\xbd\x1f\xba\x8f\xf3\x9b\xe2\x0d\xa8\x6e\x10\xc4\x21\x19\xe9\xd8\x21\xd4\x6d\xba\xbb\xe8\xea\x6d\x33\x37\x9b\x35\xf8\x1b\x67\x89\x6d\x9c\xf8\x3f\xa2\x52\xfe\xff\x98\x7b\xef\x78\x2e\xdf\xf7\xff\xdf\x2c\xa2\x88\x50\xf6\xae\x90\xbd\x77\x32\xb3\x67\x65\x93\x11\xd9\xd9\x64\xef\xbd\x42\x44\x36\x65\x66\xef\x64\x2b\x23\x44\x64\x64\x27\x24\x9b\x48\x7e\xb7\xdf\x1f\xcf\xeb\xd3\xfb\x7a\xba\x75\x7e\xff\xf0\xc7\xeb\xff\xfb\xed\xd0\xf9\xec\x71\x1d\xe7\xf5\xb8\x8e\xf3\x38\xce\x6f\x78\x72\xad\xc3\x61\x76\x50\xaf\x2b\x88\x83\xff\xbe\xb6\xe6\x9e\xea\x17\xa7\xfb\x78\xf6\xc9\x0f\x02\x43\x30\x26\x87\x28\xec\xdf\x07\xcc\x27\xd1\xac\xc8\x35\x9a\xe5\xbd\x51\x18\x83\x2a\x67\x20\x0e\xca\x03\x20\x73\xe6\x35\x41\xee\x19\xa8\xf4\xa8\xef\x69\xa6\xf1\x4e\xb6\xa4\x62\x49\x36\xaf\xe3\x34\x6a\xe7\x93\x06\x4f\xd6\xfd\x42\xf5\x96\x5f\xc3\x7f\x9b\xb3\x75\x56\xa1\x89\x4f\xb5\xf9\x85\x73\xc4\xf8\x2d\xf7\xd6\x88\x77\x3a\xef\x10\x98\x36\xe1\x1c\x0b\xb0\xca\x76\x76\x2e\x50\x08\xb0\xfe\x7d\xfc\x35\x9e\xce\x7b\x3a\x36\xc9\xff\x96\x4b\xc7\x97\x07\x12\xba\xd9\xd7\x88\x36\x44\x85\x8c\x08\x3c\x6a\x8f\xf4\xdf\x47\x57\xbc\x5f\xff\xaf\x99\x33\xd0\xd2\xfe\xee\x39\x43\x32\x67\x84\xc1\xb8\x65\x1d\x2d\xe7\x8d\x8b\x9d\x9e\xa0\xa7\xd8\x04\xa8\x3d\x1b\xef\x2f\x29\xea\xd7\x2f\xbf\xfb\x66\x3b\x2a\x62\x24\x4d\xf6\x4c\x8a\x3a\xc8\xe6\xac\x57\xa3\xc2\x3f\xc8\xaa\x7a\x79\xaa\xf1\x52\x76\xc3\x88\x2a\x6d\xc7\xad\x72\xe2\x3d\x47\x6c\x9a\x19\x0c\xaa\x29\x5d\x6e\xf6\x89\x33\x29\x61\x21\x9b\x33\x34\x9e\x79\xbe\x48\x41\x97\x94\xf1\x16\x2c\xb5\xb9\x30\xb9\x1f\x6c\x2e\x0c\xdb\x61\x16\x54\x32\xd9\x5d\xfc\xf5\xa1\x1c\x0d\x6f\xce\x64\xb5\xc8\xe6\xec\x89\xf2\xfb\x81\x4a\x54\x45\x63\x0d\x2a\xbe\x9f\x8f\xa4\xbf\x74\xb7\xea\xd7\xa5\x54\x56\x69\x5d\x94\x57\x5d\x3e\x2e\x15\xe6\x3d\x93\xc6\xbe\x16\x64\x73\x56\x4f\xab\x69\xf8\x41\xb3\x5c\x6d\xa3\x30\xfd\x7a\xf2\xac\xf4\x76\xa2\xcf\x52\xe7\xe0\x05\x0a\x79\xd9\xb6\x9b\x49\x5e\x99\xf6\x14\x67\x66\xce\x40\x22\x3a\x2d\x1b\xe7\x96\x44\xe8\xea\xd3\xdd\x7f\x65\x21\xeb\xdc\xbc\xc0\x3d\x33\x7c\xd3\x0c\xf5\x4e\xf9\x83\xcf\x58\xe2\x57\x82\x3c\x1f\x0f\x66\xbe\x45\x64\x21\x10\x07\xcf\xc6\xc4\x04\x4c\xf9\x8b\xcf\x7f\x3f\x5c\xba\x1e\xef\x38\x95\xc8\xa1\xa9\xc5\x18\x42\x54\x22\xe6\xde\xdb\xda\xe0\xfb\x3b\x15\xb3\x0a\x1a\x6b\x08\xe2\xe0\xd9\x78\xa1\xb3\xf0\xe6\x35\x29\xaf\x31\xad\x4c\x05\xfe\x73\x89\x6d\xfc\x49\x4a\x9d\xb2\x4b\xc1\xd6\xf7\xd7\x28\xf4\xb4\x5c\x29\x39\xd0\x10\x71\x41\x1c\x3c\x1b\x1b\xca\x84\x33\x8a\xbe\xbb\x8e\x65\x87\xd9\xd9\xf8\x2e\xa8\xe8\xf1\x5c\x6a\x1a\xcb\x8f\x6c\x7c\xf9\x63\xa7\x2b\x21\xd8\xc4\x9a\x50\xc3\x11\x88\xf3\x97\xa0\xfe\x9f\xdf\x41\x5d\xc4\xbc\xd2\x57\x6c\x53\x56\xda\x98\x59\x9b\xef\x03\x2a\x5d\x15\x77\x36\xc9\xc5\x14\xfc\x2f\xc9\x3f\xbf\xe2\xc6\xe5\x60\x73\x23\xcc\x19\x88\x83\x7a\xce\xfe\x6d\xce\x40\x0f\xf4\x69\x12\x28\x35\x62\x53\xf2\xbc\xda\x33\xde\xa3\x51\x4d\xc6\xbc\x38\x7b\xc9\x95\x3f\x28\x23\x23\x61\xb7\xfb\xe2\xd0\xa6\x8e\x94\x9c\x1a\xd4\x17\x04\xe2\x90\x1a\xee\x2d\xf3\x8d\x5f\x68\x2a\x66\xbc\xec\x59\xd4\x21\x71\xd4\x12\x78\xa0\xbe\x60\x10\x5c\x3d\x58\xb9\xcb\x3b\x83\x97\xaa\x18\xcf\x05\xf5\xb2\x01\x38\xb8\x04\x18\x04\x93\xb6\xdf\x2d\x2e\x48\xe2\x3f\x67\x61\x63\x0f\xb3\xd9\x7b\x8d\x6b\x6f\x5a\xb5\x3d\x36\x80\x72\xee\x67\xdb\xad\x67\xbe\xd0\x51\x39\x10\x07\x97\xc0\xd0\xf4\xc8\xb3\xc4\xc6\xfe\x5b\xb7\x9d\x4d\xaf\x6e\x57\x4b\x87\x50\x90\x06\xaa\x3c\x2b\xaa\x8f\xd2\x74\xbb\x48\x56\x85\x2b\x57\x82\x88\x0b\xe2\xe0\x12\x50\xa1\x4b\xb5\x14\x11\x2d\xfb\x78\xa4\xc9\x61\x9f\x5d\xcd\x2f\x8e\x26\x2c\x8d\x8b\x43\x3c\x2d\xcb\xfe\xd0\x80\x34\xf2\x3c\x55\x31\x62\x43\x06\x71\x50\xaf\x09\xc0\x9c\x81\xb2\xeb\xa9\x17\x31\x08\xaf\x9f\x43\x49\x1d\xbe\x44\xd6\x3b\xf3\xf6\xf7\xbd\xdf\x5c\x38\x1a\x72\x75\xdb\xd3\x6c\x58\x2f\x3d\xdb\xe2\x62\x54\xc8\xae\x23\xd6\x0e\xe2\xe0\x1a\xa0\x51\x08\x93\xaa\xb1\xac\x75\x62\x7c\x5b\xc5\x40\xcf\x23\x51\x58\xfe\x3a\x10\xb7\xf7\x6b\x49\xee\x6f\x91\x68\x06\xf9\xf9\x45\xe8\xde\x14\x10\x07\xd7\x00\xbd\xaa\x87\x38\xf1\xdd\x98\x00\xd7\x6f\x81\x11\x09\x5a\x34\xe5\xaa\x1a\xd8\x46\xa8\x9f\x8e\xca\x0d\x95\xb6\xdf\x39\xf1\xb8\x0b\x21\xe2\x82\x38\xb8\x06\x28\x5f\x96\xfb\xf4\x3f\xae\xdd\xa7\x8a\x60\xe3\x66\xe0\x51\xf7\x78\x47\xee\x44\xbb\x7d\xf7\x52\x70\x26\xb6\xcb\xb5\x2c\x77\xea\x3b\x88\xb8\x20\x0e\xae\x81\xc3\x01\x6e\x7e\xf6\x1b\x0e\x2a\x55\x0f\x33\x5e\x4d\x95\x92\xe6\x34\x44\xda\x7a\x34\x2d\x97\xa2\x08\xd1\x66\xb9\xee\xa5\xec\x34\x20\x34\x00\xe2\xa0\x5e\x13\x80\x39\x03\x6d\x75\xa7\x69\x80\xf1\xd5\xf2\x57\x71\x05\xe5\x70\xcc\x38\xe7\x9c\x8a\x60\x0f\x3d\xbe\xd9\xac\x61\x4f\x23\x2a\xd4\x95\x62\xd6\x66\x61\xaa\x5b\xd0\xbd\xa4\x20\x0e\xae\x81\x23\x7a\x96\xfd\x0d\x43\xf7\x51\x94\xec\xdf\xaa\xeb\xda\x66\x05\x0d\xf9\x17\x74\x79\x92\x62\x8c\x97\xbf\x04\x94\xa5\x5a\x54\x2e\x42\x7d\x4c\x00\x0e\xae\x81\x8f\xe5\x8e\x12\x45\x7e\x15\xd9\x2c\x02\xe7\x5d\xde\x4e\x68\x9a\x47\xc6\xd2\x28\x5e\xe7\xdb\xc6\x41\x1f\xd4\x7d\x75\x12\x5b\xc9\x82\x88\x0b\xe2\xe0\x1a\x10\x9c\x6c\x9e\x77\xda\xdd\xf1\x6e\xe2\x9a\x72\xaf\xdd\xad\x1b\xf0\x52\xb6\xf5\x4f\x21\xc9\xe0\x11\xbb\xdf\xdc\xf4\xbb\x3a\xaf\x14\x11\x17\xc4\xc1\x35\x40\x34\xb9\x5c\x14\x68\x53\x50\xa6\xba\x8f\xc2\xd5\xeb\xe3\xf4\xcd\xb5\xd9\xd3\x3b\x01\x0f\xdd\x2f\x48\x6f\x85\x06\xb7\xbe\x66\x18\xa1\x01\x10\x07\xe5\x01\x80\x39\x03\xbd\x77\x9c\xa6\x81\x13\x5a\xdb\xa7\xc6\x97\x84\xc5\x6e\xea\x86\x56\x77\x2d\x25\x3c\xb3\x78\x10\x6d\xbf\xbc\x7d\x9d\x2b\x25\x5e\x07\x2f\xf8\xa6\x7e\x32\x62\xed\x20\x0e\xae\x81\xa2\x34\x01\x0a\xe1\x19\x91\x2f\xda\x73\xe8\xe6\x64\x1f\xdc\xff\xb0\xd7\x46\x3d\x51\x12\x1d\xf7\x2d\x19\xb9\xfd\xe4\x9a\x4a\xed\x18\x54\x91\x06\x70\x70\x0d\x04\x25\x4f\x99\xff\x96\x7e\x6d\x89\x9a\xa4\x7c\x1c\xf5\xe5\x9c\x80\x24\xc9\x4a\x44\x4d\x17\x4b\xa9\xd9\x7d\x97\x6b\x46\xa5\xaf\xa3\x11\x71\x41\x1c\x5c\x03\x7a\x22\x01\xdc\xad\x42\xbc\x99\x04\x56\xa1\xc6\xce\xcd\xca\x3d\x99\x83\x6a\x8c\x78\xd3\x64\xb2\xcd\xb5\xae\x6e\xfb\xce\x8f\xd5\x10\x71\x41\x1c\x5c\x03\xc5\x7b\x86\x86\x8b\xaa\x0d\xd7\x50\x1f\x19\xdc\x9d\xb9\x77\xcd\x4b\x22\x9d\x27\x99\x97\x2d\xdd\xc0\x90\x56\xe7\x82\xe8\xbd\xad\xdb\x08\x0d\x80\x38\x28\x0f\x80\xcc\x99\xa3\x8f\x5b\x02\xc5\x8c\xf9\xd5\x1b\xf2\x1d\x44\xb8\x0c\x61\x3a\xa3\x64\xeb\xf7\x9f\xaf\x2b\x61\x60\x7c\x77\x5e\xe3\x53\xe2\x29\xfa\xdb\x9c\x75\x8e\x12\x09\x2a\xd5\xeb\x26\xd8\xee\xc7\xb0\x2c\xd0\x95\xd1\x7b\x1d\xc6\x0d\x92\xa0\xdd\xb6\x36\x7e\x6d\xf0\x74\xa3\x94\x76\xe0\x2f\xf4\x9b\x77\x4d\x80\x7e\xb6\xfa\x42\x1a\x2b\x5f\x71\xb3\xe7\x5a\xda\xad\x4d\xee\x54\x91\x65\x4b\x8f\x2a\x8e\x44\x4c\xf4\xae\x55\xb4\xff\x9a\x39\x03\x2d\xed\xef\x9e\x33\x69\xf8\x0b\x3c\x81\x06\xe3\x4e\x67\xb8\x6f\xf1\x6f\xd7\xa1\xe0\x91\x72\x0d\xae\x13\xad\xce\xa5\x3a\x8b\x02\x9e\x9c\x35\xc2\x1b\x4b\x87\xe2\x71\x67\x52\xd4\x41\x36\x67\x25\x89\x8e\x8a\xb8\x9c\xd4\x94\x45\x1b\x0b\x7e\x94\x19\x47\x8f\x0c\xd0\xf8\xf4\x19\x3c\xdb\x5e\x9d\x38\x3d\xf7\xb2\x27\xeb\xa0\x3d\x93\x12\x96\x08\xd2\x9f\x3d\xcf\x58\xb3\x43\x1a\x2e\xf4\x6a\x5e\xfe\xe7\xed\xc7\xc4\xa5\xbf\x52\x56\x9c\xf1\x3b\x2b\x7a\xd5\xbe\xf4\xcb\x5e\x9a\x35\xfd\x94\x70\x26\xab\x45\x36\x67\xc5\x02\xb8\x25\xcf\x05\xa2\x1b\xd1\x9e\xcf\xbc\x6f\x0d\x90\xb8\x79\xf0\x20\xc7\xd4\x6a\x63\xa0\x2a\x00\x0f\xcf\x96\x94\xe9\x02\xe3\x99\xac\xd6\x11\xe9\xcf\xca\x86\xd3\x35\x2a\x91\x97\x12\x2c\x6a\x5d\xb0\xee\x74\x4a\x47\x49\xe2\x4b\x71\x5e\x37\xb8\xd0\x97\x7a\x24\x77\x92\xa5\x7e\x2e\xed\xcc\xcc\x19\x48\x44\xa7\x65\x63\xe9\xae\xfb\xfc\x1a\xa1\xc4\x82\x52\x72\x1d\xcc\x9d\xdf\xec\x85\x7c\xee\x86\x96\x75\x37\xf4\x6a\x91\xe7\x52\x4c\xa7\x24\xe0\x41\x57\x18\x81\x38\xa4\x46\x03\x2d\x74\xc7\x7e\xf3\xbb\x0a\xc6\xd2\x76\xb3\x24\x57\x5e\x08\xef\x6f\x61\x64\x0f\xa1\xcc\x45\xf2\x61\xa8\x2d\x2e\x44\x7c\xc8\x81\x1a\x0d\x00\x1c\x3c\x1b\x27\x37\xe0\x89\x16\x08\x33\xc5\xbd\xb4\xfe\x4c\x94\x95\x86\x8a\xcb\x8a\x79\x2e\xb9\x8f\x57\x11\x23\x69\xd9\x56\x28\xe5\x5c\x39\x74\x35\x12\x88\x83\x67\xe3\xe7\xb9\x23\x74\xbd\xe2\x1a\x0f\x6f\x3a\x3b\x66\x4e\xbf\xbd\xb9\x44\xa0\x89\x15\xbc\x79\x67\x27\x3d\xc7\xb6\x0b\x1b\x6d\xe6\x0f\x74\x5c\x12\xc4\xf9\x4b\xa0\xa0\xfe\x1d\xf7\x73\x49\xf1\xa3\x5b\xf3\x0f\x16\x04\x2e\xed\x7e\x6b\x3d\x67\x19\x58\x59\x42\xa1\xc6\x14\xe4\x10\x8a\x6f\x68\x1b\x53\x56\xf8\xc6\x01\x61\xce\x40\x1c\xd4\x73\x26\xfd\xef\x2f\xe6\x80\x07\xfa\x34\x09\xfc\xd1\xdd\xe7\xab\xd3\xbf\x7c\xf2\x6d\x30\xb5\xe9\x8a\xfe\x73\xd7\x83\xf7\x11\x69\x8b\x41\xc4\x76\xed\x7f\x9c\xaf\xa2\x4c\xc9\x4f\x40\xc7\x0f\x01\x1c\x5c\x02\xfa\x47\x1d\x8a\x77\x38\x5f\xbc\xc6\x16\xf9\x4e\xa1\x46\x69\xb9\x50\x2f\x63\xfc\x60\xe6\x2b\xb6\xe8\xcf\x38\xad\xcf\xbf\x88\x9b\x20\xbf\x0b\xe2\xe0\x12\x30\x3e\x94\xfe\x1a\xf5\x58\xb0\x38\xc3\x50\x4a\xd3\xe5\xa8\x4f\xa6\xe2\xcd\x67\x43\x4f\xc7\x05\x32\x12\xf9\xcd\x54\x2f\x9d\x38\x0d\x44\x5c\x10\x07\x97\x40\x15\xf7\xe2\xfb\xaf\xa4\x3e\xd6\x3b\xeb\xde\x33\x53\xb2\x0f\xe4\xe5\xd7\x35\x1f\x89\x5a\x93\xa6\x2f\xcc\x96\x4a\x13\xad\x99\x41\x7d\x11\x20\x0e\x2e\x81\x1f\x54\xd8\x21\xf9\x8b\x2f\x51\xd8\xd8\x3f\x1d\x4f\xc8\x8d\x67\xb6\x4b\xf0\xf1\x95\x49\x4e\x08\xbd\x3a\x9f\xd6\x89\x26\x17\xb3\x8a\xd8\x90\x41\x1c\xd4\x6b\x02\x30\x67\xa0\xec\x7a\x9a\x06\x7c\x4a\x67\x87\x49\x69\x03\x54\x50\x62\x44\xc5\xad\x26\x22\xce\xdb\x64\x89\x88\x92\x5d\xdc\x43\x1b\xe9\x5b\x23\x66\xac\x68\x0a\x41\xac\x1d\xc4\xc1\x35\x60\x49\x71\xdd\x9b\xdc\xfd\x45\x12\x7b\x85\xbc\xdc\xda\xfb\x55\x7c\x91\x0f\x15\x95\x68\x33\xc5\x66\xbc\x2e\x97\x1f\xee\x3c\x52\x83\x4e\x4d\x83\x38\xb8\x06\x7e\xa9\x4d\x0b\x13\xad\x66\x3f\x1c\x6e\xfe\xe0\x69\x2c\x7b\x8e\x20\x68\x0e\xd7\x76\xdf\x8d\xc5\xe7\x75\x73\x63\xc3\xb6\x55\x38\xd4\x7a\x0a\xe2\xe0\x1a\xc8\x61\x10\x2f\x67\x94\x79\x87\xcd\x32\x56\x21\x15\xfa\xf1\x4b\xfe\x84\x76\xc1\x87\x30\x77\xcc\xe0\xf8\x6f\x5f\xb2\x71\x1e\xff\x5f\x15\x19\xc4\xc1\x35\x20\x52\xf3\xda\xec\x52\xda\xa7\xf4\xd7\xbe\xdc\xec\x52\x33\x03\x5c\xb6\x5f\x42\xda\xb6\xbf\xa6\x13\x16\x37\xf1\xc4\xd5\x33\x2d\xd7\x20\x34\x00\xe2\xa0\x5e\x13\x91\x7f\x6b\x00\xb4\xd5\x9d\xa6\x81\x0c\xc6\xf7\x34\x85\xbf\xf1\x71\xad\xaa\x30\x62\x9f\xfd\x32\xbe\x4b\xde\x2b\xe7\x79\x85\x50\xdb\x2f\xf6\xcb\x09\x35\x69\xe9\x45\x0e\xa8\x47\x14\xc0\xc1\x35\x50\xb2\x66\x20\x48\x2c\xce\x49\x5f\x91\x2d\xc6\xc1\xe3\x9e\xff\x71\xda\x44\x82\x8d\xd0\xe5\xa5\x82\x98\x69\xc0\xdd\xe1\x8f\x33\x12\xd0\x14\x53\x00\x07\xd7\xc0\x7d\x9f\x83\xed\xdf\x74\x97\x43\xe2\x30\x06\xaa\x18\x62\xff\x48\xbe\x59\x38\xff\xdb\x51\x6a\xce\x27\x2d\xdb\x3a\xf9\xe4\x32\xb3\x17\xd4\x23\x07\xe0\xe0\x1a\x18\xfd\xa4\x5a\x34\x66\xf7\x07\xef\xc0\x7d\x6a\x49\x40\x08\x37\xbd\x2b\xa3\xb4\xc7\x2e\x32\x93\x7f\xec\xa8\xdd\xfc\xe3\xe7\xe3\x5e\x44\x5c\x10\x07\xd7\x80\xf2\x1e\xaf\x5b\x12\x61\x61\x6e\x56\x4b\xfb\x0f\x9d\xb5\x30\xcf\xed\x48\xb9\x25\xc1\xe8\x2d\xdd\xaf\xc3\x1c\x63\x39\xaf\x22\x6e\x20\x34\x00\xe2\xa0\x3c\x00\x30\x67\xa0\xf7\x8e\xd3\x34\x60\x53\x35\x47\x57\x86\xf3\x82\x91\x0f\xe7\xfb\xb1\x22\xd6\xc0\xa4\x9e\xca\x5c\xa8\xb2\x32\x77\xc9\xb9\x23\x3c\x99\x5c\xb7\xc7\x90\x91\x06\x71\x70\x0d\x44\x2c\x5d\x3f\xbc\xce\x4a\xda\xce\xcb\x76\x21\xe2\xfc\xa6\xfa\xbd\x97\xbe\x0c\x1e\xd6\x63\x1b\x6a\xc4\x64\x37\x03\xa7\x89\xe8\x1a\x10\x71\x41\x1c\x5c\x03\x05\xe3\xaf\xe6\x07\x6e\x64\xe8\xe9\x08\x79\xfc\x19\xa1\xe0\x7a\x78\xf3\xc5\x73\x54\x1d\x36\xb6\x10\x4e\xab\xe3\x24\x2d\x0a\x7e\xe8\x43\x1d\x88\x83\x6b\xe0\x3b\xfa\x61\xac\xfe\x27\xd7\x43\x99\x75\x31\xef\x98\x4f\xde\xbc\x4b\xb7\x6a\x5e\xdf\xed\x21\xbf\x14\x87\x36\xa3\x42\xae\xf3\x19\xba\x8f\x19\xc4\xc1\x35\xe0\xf3\x05\x47\xed\x72\x55\x55\x2c\x93\x33\x13\x29\xc3\x0a\x55\x0f\xdb\x9e\x76\x14\xa7\xd5\xae\x9f\x0e\xcf\xb6\x40\xbc\x8f\x80\x29\x74\x53\x22\x80\x83\xf2\x80\x23\xc0\x9c\xe1\x47\xde\xd9\xce\x0d\xd3\x4d\xc1\xfb\xd8\x59\x42\xac\xc1\xb5\x20\x80\xc1\xc1\xbd\xbb\x44\x43\xd3\xb2\x37\xea\x1b\xc0\x1d\x7f\xf1\x6f\x73\xb6\x6a\x12\x69\x62\xec\xf9\xec\x7b\x36\xe1\x97\xe1\x10\xc5\xa3\x4f\xce\xe2\x7a\x84\x0f\x03\x0f\x92\x06\x44\x5c\x8a\xdf\xb3\x6c\x87\xfc\x7d\xda\x06\x33\x49\x9c\xc6\x4f\x9e\xa6\x89\x72\x6d\x3e\xf4\xb8\x20\x41\x34\xd6\xa0\x9d\xe5\x07\xdd\xe5\x1f\xcb\xcd\xcb\x86\x87\xaa\xc2\xff\x35\x73\x06\x5a\xda\xdf\x3d\x67\x48\xe6\x2c\x30\xec\xcf\x1d\xda\x17\x6f\x03\xe9\xae\xf9\xa0\x48\x5f\x3d\x0a\xd2\x6b\x6c\x3b\x39\x60\xb8\xbc\xc3\xe2\x77\x58\xf0\x54\xf4\x9b\xf5\x99\x14\x75\x90\xcd\x19\x2b\x51\x5e\x10\xb7\xeb\x65\xd2\xf8\xca\xdb\x4f\x04\xe3\x04\x6f\xcd\x04\xea\x75\x79\xf7\xa0\x69\xab\x54\xe3\xfc\x24\x0c\xaa\xc4\x38\x93\x12\x16\xb2\x39\x73\x6d\x0d\xfb\x45\x8f\x1e\xb1\xd1\xde\x22\xd7\x8c\x79\x50\x4e\x40\xa0\xe3\x92\xb5\xdf\x90\x26\x32\x9b\x5b\x9a\x18\xb0\x7a\xfd\x4c\xe6\x90\xb4\x20\x9b\xb3\xfb\xfe\xf6\x3c\xdb\xc3\x5d\x57\x74\x8f\xf1\x77\x9d\xec\x52\xac\xcf\x8b\x67\xa4\x5d\xa8\x27\x28\xfc\xfc\xdc\xf8\x21\xc9\xc0\xc1\xcf\x33\x59\x2d\xb2\x39\xab\x0b\xdf\xd8\x0b\xb8\x53\xb6\x39\x35\xb2\xb6\x88\x47\xc5\x7e\xbf\xf4\xc8\x9c\x5d\x0e\x5d\xb7\x5f\x5e\x91\xf6\xc9\x51\x9e\x5a\xc6\x99\x99\x33\x90\x88\x4e\xcb\xc6\x14\x0f\x1c\xe4\x26\x06\xca\xf7\x16\xb4\x71\x9f\x6d\xf1\x17\x16\xa2\x94\x06\x5b\x13\x60\x28\x3c\x14\x09\x4f\x65\x15\x78\xd7\x0f\xf5\x86\x81\x38\x78\x36\xce\x7e\x83\xcf\xbe\x72\xe9\x51\xb9\x01\xb9\x03\x79\xc2\x57\x3c\x4f\xc9\x25\xd9\xc4\xa3\x36\xe7\xd9\xf7\x2b\xa9\x6f\x50\x9c\xee\x6e\x20\xe2\x82\x38\x78\x36\x56\x79\xbf\x1e\xcf\xf2\x65\x97\xe0\x59\x7d\xcd\x2b\x55\x42\x5c\x42\x6a\xb5\x37\xcf\x3e\x6d\x53\xe9\xa5\xeb\xcb\xa5\x71\xd8\x08\xfd\x41\xc4\x05\x71\xf0\x6c\x7c\x0e\xcf\xf0\x9e\xb9\x4d\xc8\x5b\xcd\xd4\x9f\xea\x77\x36\x79\xb9\xbd\xde\xdb\xb7\xfb\x16\xff\x74\x30\x73\xa7\x37\xae\x5a\x7a\x09\x5d\xdf\x07\xe2\xe0\x87\xd7\xbb\x1e\xbc\x4e\xfc\x50\x68\xb4\x66\xf9\xe8\xf7\x42\x08\xf9\xf3\x5c\xf7\x10\x82\xcf\x7b\x11\x91\xa5\x5c\xba\x82\x2f\x9f\x1e\xe1\xa2\x21\xcc\x19\x88\x83\x7a\xce\xfe\x6d\xce\x40\x0f\xf4\xa9\xc5\x53\x5f\xfe\x5f\x47\xb1\x49\xbb\x4f\x1b\x32\x17\x12\xcc\x48\x3d\x5d\xb3\xe6\x68\x9f\xda\x1d\x7d\x7a\xef\xbb\x2e\xe2\xf4\xc1\x02\x9a\x7c\x07\xe2\xe0\x12\xd8\x4b\x17\x55\xf5\xb5\x8e\x78\x27\xf8\x76\x8e\x6c\xf8\xd9\xe0\x70\x64\x99\x31\x9e\x53\x0b\x8a\x5f\xe9\x56\xbd\xb1\x9e\xfc\x5b\xe8\xe8\x19\x88\x83\x4b\xa0\x1f\x7b\x42\xfa\x66\xb2\x1b\xb6\x6a\xfc\xfd\x0b\xd9\x1c\xe2\x98\x35\xa2\xee\xd6\x7f\x32\x39\xd1\xa6\xf0\x2b\x5c\x65\x8b\x9a\x21\x7f\x0e\xe2\xe0\x12\xe0\x35\x79\xa9\x3f\xf2\x7e\x48\x4b\xc8\x23\x07\xff\xa2\x94\x1c\xff\x3b\xd1\x57\xdc\xd8\x5e\xce\x38\x23\x07\x95\xb8\xda\xaf\xec\xa0\x71\xe5\x20\x0e\x2e\x01\x6f\xfd\xc3\xdd\x00\x03\xf5\x4d\x8a\x1b\x83\x38\x8d\xfe\x8e\xd2\xa9\xe1\xfa\xac\x13\x59\x4a\xd2\x1f\x05\x5e\x4a\xdf\x91\xff\xea\x80\xd8\x90\x41\x1c\xd4\x6b\x02\x30\x67\xa0\xec\x7a\x9a\x06\x24\xbf\xd5\x7f\x7c\xb6\xbb\xbe\x9e\x97\x64\xb1\x10\x28\x7e\x6c\x5d\xa7\x67\xc5\x25\x45\x61\xf8\x6b\xe3\x76\xcb\x9a\xea\xb4\x3b\x74\x54\x14\xc4\xc1\x35\x90\xef\x64\xca\x19\xfa\x69\xe5\x72\x88\x8a\xce\x92\xdf\x9a\xee\x8e\x70\xa3\x82\x5b\x4b\x76\x2b\xa1\x9b\x22\x37\x6a\x6e\x69\xc2\x77\x44\x5c\x10\x07\xd7\xc0\xea\xf7\x8f\xe6\x05\xa4\x86\x18\xa3\xdd\x8a\xef\x3f\x29\xb7\x95\xc8\x2c\x2c\x2e\xb5\xe4\x04\x88\xf6\x66\xa3\x27\x7f\xa0\x2c\x80\xfa\x82\x40\x1c\x5c\x03\xf7\xbd\xc4\x59\x50\xdd\x3d\xbc\xac\x89\x88\x3e\xee\x29\xbc\xe4\xc9\xbf\xff\x49\xf6\x29\x8f\x7e\xb1\xfe\x6f\x1e\x05\xbc\x9e\x4d\x68\x12\x28\x88\x83\x6b\x20\x80\x62\x73\x2d\x39\xce\x38\x4d\xe3\xf7\x95\x0b\xcf\x31\x2c\x17\xef\xf8\x5e\x61\x1e\x19\x93\x8b\x49\xcd\xfe\xe5\x9f\xe3\xa7\xf3\x1c\xa1\x01\x10\x07\xf5\x9a\x00\xcc\x19\x68\xab\x3b\x4d\x03\x85\x11\x23\x98\xda\x0c\x2a\x09\x7d\x1f\xad\xe5\x32\x4b\xd0\xdd\x05\x7b\x9b\x45\xe7\x67\x46\x8b\xa6\x51\xc5\x9f\x44\x7a\xe0\xcf\x42\x93\xef\x00\x1c\x5c\x03\x27\xef\x62\xdd\xec\xaf\xbc\x1a\x60\x6a\xc2\x8b\xcf\x2f\xbb\xa4\xf5\x29\x72\xb1\x62\xbb\x3e\xbe\x7b\x92\xd2\x22\x75\xe2\x90\xa5\x12\xaa\xc6\x00\x38\xb8\x06\x1e\x86\xaf\x9a\xcf\x9a\xed\x17\x51\x1e\x98\x78\xfb\xb4\xf0\x0c\xad\x37\xba\xa0\xc4\x46\xce\x90\xb2\x39\xba\xee\xad\x88\xa5\x41\xd7\x6d\x82\x38\xb8\x06\xbe\x3a\x0c\x61\xf0\x9b\x11\xec\xda\x6d\x47\xe8\x65\x4b\x09\xa4\x92\x29\x68\x8a\xd9\xd2\x63\x16\xbc\x75\xd1\x4e\xbf\xf4\x90\x7d\x10\x11\x17\xc4\xc1\x35\xb0\x3c\xbf\xd0\xd2\xc5\x49\xe6\x4d\xfa\xad\x49\xda\x2c\x26\x84\xb8\x73\x93\xd1\x6d\xac\x7c\x35\x60\x66\x0e\x5b\x3c\xe3\xa0\x10\x05\xa1\x01\x10\x07\xe5\x01\x80\x39\x03\xbd\x77\x9c\xa6\x81\x94\x82\x83\x6a\x7b\x62\xaf\x83\x8f\x45\xe7\x6f\x7f\x35\xb8\x1b\x7d\x5c\x96\xf2\xc0\xb0\xfa\x95\x40\xf5\xaf\xd5\x7b\xeb\xfb\x66\xd0\xc1\x14\x10\x07\xd7\xc0\x7a\xe9\x56\x4d\xda\x97\xce\xc4\xbb\x27\x15\xc2\x0f\xbf\x57\xe6\x64\x77\xce\x60\x8d\x08\xb0\x2b\x85\x5a\x7f\x65\x70\x77\x17\x0d\x46\xc4\x05\x71\x48\xb7\x18\x61\xf9\xcc\x70\x0f\xf0\xd9\x6d\xdb\xe8\x32\x70\xea\x69\x72\xe9\x35\x74\x87\x8a\x69\xdd\x1e\x1b\x6d\x88\x0f\x1c\xc3\x13\x82\x86\x37\x83\x38\xb8\x06\xba\x1e\x9b\xbb\x06\xbd\xee\x1e\xdd\x25\x99\x21\x32\x64\xad\xf1\x54\x25\x77\xf3\x89\xfa\x1e\x41\xff\xa9\xaa\xe2\xad\x92\x53\x4d\x1f\x22\x2e\x88\x83\x6b\x40\x2c\x29\xbe\xcf\xf3\x85\x67\x4d\x3b\x46\xdf\xb0\xb4\xe1\x34\x4d\x52\x55\x37\xfe\x3d\x17\x0c\xa2\x3d\xbc\xc0\x2f\x33\xd8\x57\x3b\x11\x1a\x00\x71\x50\x1e\x00\x99\x33\x86\x2b\xea\xdc\x18\x58\x3e\x4e\xec\x8e\x45\x62\xc4\xb1\xe2\xdb\xcb\xd4\xfc\x87\x3a\x32\xac\x73\xa3\x34\xcf\x0e\x92\x73\x62\x1b\xfe\x36\x67\x03\xb8\xd4\xb9\x58\xc9\x19\xa2\xd7\x32\x35\xda\x5e\x7d\x0e\xec\xbb\x25\x22\xcf\x31\x83\xcd\x57\xaa\x73\x21\xec\x33\x3a\xb6\x8a\xdc\x5f\xe8\x25\xe6\x54\x07\x95\xa8\xa2\xdc\x1e\xf2\xdf\x7a\xeb\x56\x0e\xaf\xc6\xfd\xe6\xec\x8b\x52\x22\x2f\x4a\xdc\x6e\x20\xf1\x8f\x72\x1b\xff\xaf\x99\x33\xd0\xd2\xfe\xee\x39\x43\x32\x67\x62\x47\xc5\xe9\x56\xf6\x0a\x3f\x1e\xd6\x1e\x3c\xcb\x55\xf8\xc6\x6f\x40\x22\x53\x68\xfb\xc9\xa2\xbf\xe7\x72\xb8\xa5\x06\xce\x2f\x8f\x33\x29\xea\x70\x22\xf9\x86\x30\xe1\x8e\x64\x49\x4e\x8f\xe6\x69\x2f\x96\x8a\xfe\x9e\xe0\x1b\x21\x03\x03\x0c\xf6\xad\xc6\x53\x69\xf4\xca\xf6\x5a\xc4\x51\x89\x67\x52\xc2\x42\x36\x67\xe1\x2c\xe4\xdc\xc7\xa5\x2c\xf4\x75\xb7\x75\xf1\x98\xf9\x4f\xc4\x69\x66\x4c\x7e\xdd\x64\xd0\x79\xe7\x62\xb2\xa2\x41\xfd\x03\xa5\xe9\x4c\x56\xfb\x00\xe9\xcf\xd6\xb4\xad\x97\x9b\x96\xb5\x4a\xc7\x37\x26\x06\x3f\x5e\x6b\x6c\xba\xe0\xf5\x74\x53\x48\x12\xdb\xb9\x41\x42\xa2\x41\x9e\x39\x64\xff\x4c\x56\x8b\x6c\xce\x12\xd1\x4d\xf8\x6b\x7e\x6e\x2c\xf5\x07\xb9\xbb\x84\x95\x85\xba\x47\x19\x3a\xc7\x8e\x70\x6d\xb2\x61\x59\xfc\x19\x59\x95\x3a\x38\xbb\xbb\xd5\x41\x22\x3a\x2d\x1b\xbb\x6e\xce\x7b\x5d\xe6\x53\x29\x71\xc0\xbd\xdf\x5f\x4b\x84\x12\x27\x71\x97\xac\x1a\xb5\x97\x4c\xef\x5c\xb5\x64\x62\xaa\x4b\xef\x6d\x44\x16\x02\x71\xf0\x6c\x4c\x1a\x52\xe0\x98\x3e\xe8\x3f\x98\xf3\xec\x92\x2e\x03\x06\x7e\x16\x97\x13\x73\x67\xb4\x8b\xf3\xed\x60\xd6\xbb\x4b\x4f\x03\xda\xa0\xee\x72\x10\x07\xcf\xc6\x4b\x98\xb5\x36\x3d\xc7\xc6\x83\x6f\x55\x32\xc7\x6a\x44\xf9\xf1\x42\x52\x68\xe6\xaa\xd0\xde\x67\x8e\x1a\x2a\x6d\xde\x24\x93\x84\x8e\x4b\x82\x38\xf8\xad\xa7\x53\xee\xeb\xb2\x95\xd2\xc1\xe6\xd3\x5f\xe4\xc7\xe2\xa7\xb1\xcb\x5d\xe2\xed\xbe\xd5\x36\xcb\xef\x58\x27\x3a\xca\x33\x50\xad\x92\x21\xe2\x82\x38\x7f\x09\xd4\xff\xf9\x1d\xea\xef\x86\x38\xad\x61\xf2\x88\x7d\x28\xc2\xc3\xe2\xf1\xa4\x2f\x5c\xc9\x92\xfc\x49\x91\x42\xd8\xea\xdd\xe1\xfd\x85\xf3\x92\xa7\x1d\xc2\x9c\x81\x38\xa8\xe7\xec\xdf\xe6\x0c\xf4\x40\x9f\x26\x01\xb1\xfe\x4f\x2d\x82\x3e\x57\x53\x1d\x2a\xa2\x72\x2f\x59\x5b\x69\x58\xce\xce\x99\x91\xbd\x2d\xbf\x6a\xf0\xf0\xa4\xc0\xe1\xe7\x3e\x74\x34\x04\xc4\xc1\x25\xf0\x3b\xde\xa7\x24\x87\xbe\x76\xf6\xa3\x9b\xc1\x52\x70\x46\xf0\xee\xb6\x46\xd2\x23\x1c\x2d\x0c\xb7\xa4\xee\x4a\xeb\x01\x13\x2c\x1c\x44\x5c\x10\x07\x97\x40\x63\xf0\x77\xfa\xe3\x3e\x51\xd4\x59\xcf\x13\x69\x15\x15\xbd\x67\xef\xb0\x3b\xb6\xe5\x13\xbf\x73\x7a\x1c\xeb\x2f\x16\xe5\x79\x4a\x21\xe2\x82\x38\xb8\x04\x92\x7c\xb6\x5f\xbb\x62\xfe\x99\xda\x20\xf3\x7d\xf0\x08\x27\x41\x8c\x9f\x3d\xb6\xb6\xd0\x8d\x42\x95\x6e\x9c\xc4\x48\x3e\x5e\xd3\x03\x11\x17\xc4\xc1\x25\xd0\x88\xbe\x61\x74\xaf\xf5\x40\xfe\xfe\x87\x20\x8a\x64\x0a\x49\xdb\xae\x91\x31\x0d\xcc\xa2\x67\x2c\x4c\x6f\xcc\x36\xa7\xf9\xaa\x03\xa0\x4b\x95\x01\x1c\xd4\x6b\xc2\xf9\xef\x97\x32\x50\x76\x3d\xb5\x80\x2e\x18\xa4\x66\x7a\xbc\x2f\x7e\xeb\x85\xd4\x5a\x3f\xf6\x94\xa2\x4f\x6d\xf1\x8d\xde\xc5\x7a\x12\xdf\x35\x29\xca\xfd\x7a\x33\x68\x02\x26\x88\x83\x6b\x60\xc4\xe6\xee\xc1\xe2\x8d\x0b\x21\xe5\x7b\x5f\x7b\xd9\x44\xb8\x05\x08\x1f\xad\x5e\x3f\xba\x2d\x74\xdf\xcf\x7d\x7c\xe5\xdd\x8d\xc9\x6d\x44\x5c\x10\x07\xd7\x00\x6e\xc5\xd4\xcb\x9a\x16\xec\x16\xdb\x6b\xdf\x3f\x3d\x7c\x62\x64\xe9\x40\x3f\x40\x87\xd2\x50\xd5\x77\x3d\x75\x61\x7f\x32\x68\x9a\x0a\x11\x17\xc4\xc1\x35\x10\x52\x19\xa1\xcc\x38\x44\xff\x63\x8d\x8f\xa6\xaf\xb4\x69\x88\xe9\xd8\x3a\x47\x33\xe6\x30\x49\xce\x07\xd5\xdc\x67\xb7\xf1\x0e\x34\x10\x01\xc4\xc1\x35\xf0\x98\x86\x3f\xc6\x6e\xa4\xce\x8a\x92\xb4\xec\xe2\x51\x7d\x76\x1a\x9e\xc0\xa2\xb1\x74\x11\x9b\xb6\x6a\xc2\xe8\x68\xa9\x4b\x05\x34\x4a\x1f\xc4\x41\xbd\x26\x00\x73\x06\xda\xea\x4e\xad\x9c\xa1\x18\x6e\x64\xe3\x08\xe6\x4a\xed\x2f\xf3\x1f\x62\xd5\xf8\xac\x84\x3d\xd4\xc0\x7c\xe4\xde\x3d\xb1\x5d\xd8\x9d\xc3\x81\x0a\x99\x28\x10\x87\x54\x39\x7b\xa6\x1a\x52\xf6\x7d\x74\xbc\x9b\xf7\x82\xc6\x3c\x67\x70\x96\xda\x2f\x3d\xeb\x9f\xbb\xa5\xad\x4e\x59\x8b\x4d\xaa\xf7\x5a\x6a\xa0\xca\x19\x80\x43\xba\x53\xae\x2a\x6c\x41\x7e\xcc\x7b\x74\xca\x56\xd4\xab\x9e\x5b\xd6\xe4\xf6\x58\x92\xae\x61\xed\xcd\x28\xb6\xb7\x1f\x1d\x31\xba\xb6\xa0\x8f\x4a\x20\x0e\xae\x01\xbb\xe3\xe1\xe3\x87\xda\xf4\x97\xea\xe5\x52\x45\x32\xe5\xe4\xf1\xfd\x2f\xf6\x95\x55\xb8\x78\xa2\x89\x9a\x98\x3d\x37\xc9\xfd\x7a\x1f\x9a\x30\x0a\xe0\xe0\x1a\xe0\x52\x19\xf3\x5f\x0f\x3f\xc7\x80\x23\xb2\xce\x4f\xe3\x1b\x17\x19\xcd\x66\x68\xa6\xd3\x13\x77\x28\x2f\x48\x24\xff\x55\x74\xf6\x2b\x42\x03\x20\x0e\xca\x03\x0f\xfe\xad\x01\xd0\x7b\xc7\x69\x1a\xa8\xa1\xce\x27\x98\x70\xc6\x3b\xf7\x41\x0f\x7b\xa3\xdd\xbe\x94\x86\xad\xb2\xc9\xa5\x68\x47\x20\xc7\x23\x89\x4f\xa4\x3f\x41\x16\xca\xd9\x20\x0e\xae\x01\x1c\xe2\x36\x8b\xed\x7e\x2a\xcb\xba\xfe\xd0\xa2\x9b\xd9\xed\x01\x36\x75\x33\xfa\x9b\x46\x77\xa4\x9d\xdd\x8b\xa2\x56\xf4\x42\xa1\x1b\x7b\x40\x1c\xd2\xcd\x3a\x8b\x16\x77\x6e\x5f\x92\xd1\x89\x52\x29\x62\xa4\xb8\x12\x3d\x97\x93\xa3\x34\x83\x36\xee\x82\x7b\x7b\x49\x0a\x7b\xba\xc8\x0f\xda\xb6\x41\x1c\x5c\x03\x1f\x73\x93\x86\xa3\x1f\xeb\x76\xc5\x08\x10\x77\x35\xa7\xcc\x29\x1a\x58\x5e\xed\xea\x78\xbe\x9c\x2b\x18\x6e\x39\xc8\x98\xf7\x45\x0b\x3a\x32\x0b\xe0\xe0\x1a\x78\xb9\x95\x96\x7e\x7b\xe4\xf2\xcc\xe5\xbd\xdd\xd4\x95\xbe\xbc\xfb\xf3\xad\x41\x5e\x4d\x45\x45\x7e\x64\xa9\xb4\x8f\x78\x7c\x66\x5a\xa0\xc9\xbd\x00\x0e\xca\x03\x20\x73\xf6\x5b\xfd\x71\x34\xa5\xaa\xad\x47\xb3\x5f\xbc\xa1\xe2\xb5\x8c\xfa\x09\xc9\xb7\x5b\x19\x1c\xa1\xde\x5d\xe6\x15\xcb\x02\x9f\x8b\x9d\xff\x36\x67\xf1\x19\x12\x66\x35\x27\xa8\x3b\x16\xa8\xad\x4f\xa8\x4b\xfe\x5c\x71\x14\xc5\x34\xc1\x98\x32\x1a\x79\x3d\x21\x54\x1c\x41\xe6\xf4\xf7\x55\x53\x6b\x8b\x32\x78\x19\xa3\x2e\xe3\xba\x8c\x3e\x64\xe4\x9e\x2e\xc2\x68\xe6\x12\xa2\xe6\x06\x75\x44\xd9\x1e\x33\xa3\x04\x58\x77\x5f\xfc\xd7\xcc\x19\x68\x69\x7f\xf7\x9c\x21\x99\x33\x66\x15\x2b\x26\xdd\x68\xd1\x9c\xb7\x68\x3c\x72\x37\xac\xbb\xcc\xee\xf2\xad\x2c\xb8\x72\xbe\xd9\xf1\x3c\x57\x10\x9a\xfa\x9b\xb8\xea\x4c\x8a\x3a\xc8\xe6\x8c\xcb\xf1\x2e\x4e\x33\xb1\x3c\x6f\xaf\xc7\x6b\x21\x53\x5a\xea\xe9\x7a\xab\x62\xa2\xd9\xf1\x3f\x84\xc7\xce\x7d\xf7\x1f\x5c\xbe\x46\x7f\x26\x25\x2c\x64\x73\x66\x92\x18\x1d\x8d\xf6\x51\x69\x7f\x74\xef\x90\x64\xd6\xb3\xd3\xce\x01\x2b\x6c\x44\xf2\xa1\x75\xde\x72\x58\xe5\x4d\x62\x53\xb4\x97\x67\xb2\x5a\x64\x73\xd6\x41\xc2\xca\x97\xb1\x14\xb3\x66\xf2\x7e\x3c\xeb\x47\x1b\xba\x10\x8e\xd5\xda\x4d\x6c\x11\xda\x52\x27\x0c\x29\x8c\x86\x24\x0d\xea\x33\x59\x2d\xb2\x39\xeb\x3c\x58\xda\xb5\x66\x35\xe1\x29\xbf\x71\x6f\xa3\xa0\x20\x38\x67\x69\xd7\x14\xed\x81\xbf\x46\xe3\xa4\x48\x77\xe2\xaf\x90\x77\xe5\x67\x66\xce\x40\x22\x3a\x2d\x1b\x3b\x1b\x13\x97\x98\xf6\xcd\x7b\x05\x85\x5e\x98\xa4\x2a\x79\x16\x74\xcf\x98\xf8\x24\x35\x92\x14\x45\x29\x62\x8a\xe4\x7b\x67\x75\x04\x22\x0b\x81\x38\x78\x36\x8e\xde\xda\x60\x33\xd2\xd2\x25\xfb\x29\xb5\xee\x7e\x1b\x7f\x50\x4c\x72\xe5\x9b\x6e\x14\xf1\xdd\x5e\x87\x0f\x12\x34\xdf\x51\x1d\xa0\x71\x47\x20\x0e\x9e\x8d\x2b\x3b\xf0\x7a\x47\xb2\xa7\xfd\x78\x34\x1f\xb5\x0b\xf9\xb4\x3d\xf8\x76\xa3\xf5\x02\xae\x1a\x76\x0f\xc5\x27\x65\xcb\xd9\x17\xb7\x7d\x11\x71\x41\x1c\x3c\x1b\x07\x3a\x9f\x5c\x52\xff\x45\x80\x11\x3e\xf1\x9a\xe9\x59\x1b\x3d\xed\x8b\xc8\x6e\x25\x8d\xf2\x77\xac\x0c\x78\xfd\xa1\x3f\x31\x72\x8d\xa1\xe9\x15\x00\xce\x5f\x02\xff\x7f\x07\xae\xb0\xdc\xa0\xd5\xb8\x7f\xac\x3c\x42\xd4\xea\xc4\x71\xa2\x15\xa6\x15\xf8\xa1\xb2\x99\xd1\xa9\xda\x9b\xe6\x7b\xe4\x9d\x8f\xd3\x8e\x08\x73\x06\xe2\xa0\x9e\xb3\x7f\x9b\x33\xd0\x03\x7d\xea\x9d\xef\x1a\xcd\xe1\x1a\x74\x75\xa2\x75\x73\x4a\x8c\x21\xe4\xb3\x3c\x45\xcb\x14\x9d\x1c\x56\x5e\xe9\xef\xb5\x65\xd9\x9b\xdd\x54\xa1\x97\x27\x10\x07\x97\xc0\x46\x29\xe1\x64\xda\xfc\xcb\xa8\x40\x27\xbb\xab\xf9\x68\xec\xe9\xe2\x26\x77\x2e\x7c\xd8\xe1\xa5\xc8\x62\x7f\x4c\x43\xfb\xf1\xa2\x0e\x22\x2e\x88\x83\x4b\xa0\x14\xfd\xae\xdf\xe6\x64\x0c\x0a\x56\xb1\xf0\x41\xb4\x3d\x6b\x93\xad\xe9\x57\x56\xb2\x28\xb3\x57\xfa\xa4\x2f\xf7\x54\x5e\xc5\x41\xa3\xb9\x41\x1c\x5c\x02\x65\xd7\xe9\x08\xcc\x0d\x02\x6f\x60\xe0\xdc\x12\x3e\xa6\x5b\x4f\x8f\x3c\x11\xa8\xc2\x68\x95\x6f\x54\x1d\x7e\x94\xae\xa5\x7f\x08\xf5\xdc\x80\x38\xb8\x04\xd6\xdf\xdd\xd9\x41\x8f\xff\x56\xf1\x73\x2e\x84\xa3\xed\xc2\xce\x0a\x69\x85\x77\x8f\x4a\x03\x81\x0e\xdd\x0d\xc7\x5d\x05\xa1\xde\x38\xc4\x86\x0c\xe2\xa0\x5e\x13\x80\x39\x03\x65\xd7\xd3\x34\x40\xe4\xed\x27\xf9\x20\x9b\xc2\xea\x4b\xba\x9a\x5a\xcf\xdd\xab\x2f\xdb\x16\xb5\xea\x27\x5b\xf2\x98\xe5\xd3\x58\x6a\xb2\x8f\xda\x0b\xa0\x53\xc8\x00\x0e\xa9\x72\x96\x28\x16\x37\xc9\x8a\xce\x48\xe8\xae\x3a\xd1\x8d\x46\x38\x9e\xb1\xf4\xf1\x82\xb6\x9e\x51\xa1\xe9\x7d\x31\xe9\xa5\xbe\x55\xc8\xf0\x82\x38\xb8\x06\xb0\xb8\xb4\x53\xfc\x33\x42\xab\x06\xb8\xe6\xde\xa6\x44\x79\x99\xcb\x3e\x5c\x48\xbb\x35\xa6\xaa\xcd\xe4\x38\x18\x9a\xd5\x9a\xf1\x04\x11\x17\xc4\xc1\x35\xf0\x48\x72\x4a\x03\x1b\xe5\x96\x95\x59\xf1\xd5\xf0\x5f\x58\xf7\x6b\x5b\x8e\x7f\xfb\x24\x54\x62\x1b\x93\xb4\x67\x45\x05\x6b\x96\x71\x23\xe2\x82\x38\xb8\x06\x82\x0d\xac\xd0\xff\xac\x05\xd9\xcd\xfc\x29\xe9\xfe\x66\x5f\x57\x8d\x76\x87\xd5\xd9\x3b\x4e\xc0\x75\x4b\xfe\x59\x5d\x36\xed\x0d\x5e\x84\x06\x40\x1c\xd4\x6b\x02\x30\x67\xa0\xad\xee\x34\x0d\x1c\x4e\x35\xd3\x9a\x93\xa6\xa0\xd5\x39\xee\x0c\x0d\x3f\xc8\xe7\x7a\x1a\xad\xeb\x7a\x94\x5a\xb8\x1a\x46\xd0\x80\x1e\xa8\x5b\x0b\xf5\xdb\x81\x38\xa4\x43\x14\xb5\x21\x9a\x3f\x2b\x9f\xb3\x37\x7d\xbc\xec\x32\xae\xab\xf0\x2e\x65\x27\x69\x2e\x1c\x5b\xa5\x1c\x2f\xf2\x67\x91\xb3\xb4\x05\xf4\x7f\x05\xe2\xe0\x1a\x10\xf3\xd0\x56\xc1\x74\xd1\xbe\x52\xc7\xd9\x4d\xc5\x4b\x78\x97\x55\xc5\xba\xa0\x50\xe1\xa7\x0b\x8d\x57\xa7\xf8\xbb\xfd\x70\x51\xe8\x70\x06\x88\x83\x6b\x80\xd7\xc7\x2d\x06\x67\xf7\xde\xfa\x39\xf2\xec\x79\x96\xd7\xd6\x37\x50\x59\x89\xea\x1e\xa0\xd9\xa6\xbd\x08\x4c\x1b\xdf\x78\x67\x4f\x0d\x55\xd0\x01\x1c\x5c\x03\xda\x84\xd8\x53\xbe\xef\x38\xae\x3d\xb7\x4f\x35\x94\x38\xaf\x15\x74\xc4\x9b\x1b\x33\xb8\x15\xd2\x32\xa2\x8e\xaf\xc8\x4c\x31\xa9\x89\xd0\x00\x88\x83\xf2\x00\xc0\x9c\x81\xde\x3b\x4e\x9d\xd6\x28\x86\x22\x91\x52\xfc\xd0\xb5\x7e\x6e\x8a\xc0\x85\x00\x3d\x31\xf7\xb8\x77\xdb\x68\x37\x00\x7d\xf9\x17\xd5\xfd\xa2\x3f\xad\xb8\xd0\xb4\x46\x00\x07\xd7\x80\x98\xcc\x4f\x14\x52\x43\x13\x37\xd6\x8d\xf9\xb6\x89\x2b\xdf\x3d\x85\xd6\xde\x30\xef\x44\xef\x52\x3d\x7a\x31\x64\x66\x68\xf5\x18\x1a\xb4\x03\xe2\xe0\x1a\x30\x5c\x24\xc6\xfe\x3c\x77\xa7\x27\x9c\x72\xf9\x25\x49\xad\x21\xa1\x1f\xee\xf7\xd5\x9b\x7a\x8e\xde\x5c\xeb\x53\x14\x19\x13\x3c\x50\x9f\x30\x88\x83\x6b\xe0\xb6\x1d\xcf\x4a\x77\x87\x7d\x50\x40\xa7\xc2\x12\xa5\x26\xbd\x3e\xbf\xd6\xad\xfc\xc0\xb4\xa0\xa5\xea\x0b\x7b\x5f\x8c\x6b\x5a\xa1\x69\xb0\x20\x0e\xae\x81\xc7\xba\xf5\xe2\x7b\x2f\xb5\x71\x5c\x2d\x3e\x75\x5c\xb2\x77\x7e\x2f\x78\x4b\xca\x81\x58\x30\xef\xde\x85\x2b\xd4\x29\x1f\x5f\xd1\xd8\x42\x1f\x69\x00\x1c\x94\x07\x40\xe6\xcc\x06\x87\x9c\xf9\x05\x1e\x66\x51\x0b\x59\xe5\x2a\x5e\x39\x3a\x89\xbd\x73\x6c\xd6\x10\x97\x53\x99\xa5\xb5\xe1\xb8\xaa\x16\xe6\x8f\xbf\xcd\x19\xb7\x78\xdc\xf3\x97\x4d\x96\x7e\x7e\xbc\x95\x18\xdc\x7d\x3f\xa2\x56\x36\x3d\x9e\xcb\x77\x78\xd2\xbe\xf1\xbe\x11\x39\xea\x68\xf0\xf7\x3d\x67\x25\xa6\x2b\x21\x17\xdc\xe8\x57\x47\xe9\x54\x16\x37\x6d\x38\xc9\xa6\xb8\xc4\x34\x09\x0f\x37\xd8\xd7\xe5\x2d\xcf\x4d\x5d\x93\x19\xfe\xaf\x99\x33\xd0\xd2\xfe\xee\x39\x93\x41\x3a\xe8\xb7\x61\x57\x38\xed\xd1\xed\x20\xaf\x72\xb8\x7f\x2e\x4c\x64\x8b\x31\x4f\x49\xa8\xa6\xc8\x9a\xf1\x8a\xe6\xce\x4c\xab\x07\x6d\xf3\x99\x14\x75\x90\xcd\x59\x2e\x83\xe4\x8e\xa4\xb5\x61\x5e\xc3\x8e\xdd\x1f\x89\x8c\x98\xbb\x7c\x5a\xcf\x22\x3e\x55\xbe\x0c\x8f\xfd\x44\xae\x8a\x2a\xcd\xe0\x73\x26\x25\x2c\x51\xa4\x3f\xbb\x17\x9d\xb7\xa4\xee\x9e\x2d\xf6\x20\xac\xe8\xdb\xd1\xdc\x9a\xc6\xeb\x74\x0b\x89\xc4\x76\x45\xad\x7a\x19\x23\x4c\x14\x16\xe9\xc8\x33\x59\x2d\xb2\x39\xa3\xc9\xdc\x5a\x56\x7b\x1a\x10\x89\x29\xd8\x4c\x6f\x67\xc5\x4b\x94\x12\x89\xde\x7e\x79\x31\x90\x88\x72\xec\xa9\x26\x95\x81\x41\xd9\x99\xac\xd6\x09\xe9\xcf\x6e\xab\xba\x27\xfb\x52\xcf\x9f\xcb\x6f\x62\xeb\xe0\xfd\x53\x85\x7e\xe3\xbd\x18\xf5\xdc\x95\xbc\x4b\x27\xbb\x1e\x4a\xaf\x6b\xec\xcf\xe0\xe2\x00\x9d\xff\x37\x11\x9d\x96\x8d\x9b\xa7\x5b\xc7\x5a\xec\xdf\xb7\x45\x54\x6e\xd8\x1f\x88\xa6\xab\xb1\x13\x52\x64\x9a\x65\x52\x8e\x14\x29\xf1\x5f\xa7\xb0\xed\x73\x44\x64\x21\x10\x07\xcf\xc6\x07\xb4\xe8\x14\x8d\x0a\xd5\xc2\x03\xe2\x4c\x15\x33\xef\xbf\x94\x0b\x4b\x44\x27\x07\x11\xab\xa0\xee\xf9\x48\xbb\x88\x7f\x72\x81\x46\x7f\x81\x38\x78\x36\x56\xf2\x62\x2c\x7d\x9d\x5d\xe7\x19\x3f\x4a\x47\x6b\xec\x6a\x94\xd8\xcf\x38\xa8\xaf\x17\xce\x62\x82\x1e\xff\xed\xd7\x56\x3e\x01\xd4\x20\x05\xe2\xe0\xd9\xf8\xfa\x1f\xda\xca\x37\x75\x66\xaf\x96\x14\xd8\xc6\x0a\x54\x0a\x38\xb5\xae\xdd\x25\x6b\xd5\xab\xef\x6c\xdd\xfc\x6c\x9f\xb7\xf7\x34\x0b\x9a\x5a\x09\xe0\xe0\xbf\x43\x7c\xe7\x26\x0a\x8e\xe9\x75\xad\xbd\x88\xf5\xab\x5b\x58\x7a\x3e\xfd\x91\x13\x6d\x2b\xef\x42\x15\xaf\x13\x4e\x2a\x50\x7b\x45\xb1\x21\xcc\x19\x88\x83\x7a\xce\x64\xfe\xb9\x21\x83\x1e\xe8\xd3\x24\x10\x63\xfe\xd1\x93\x53\xb4\x0c\xef\xa2\x44\xc0\x05\xcd\x17\x71\x1a\x0f\x97\xa3\x75\xae\xbe\xf9\xf2\xe9\x63\xa6\x0c\x3e\x27\xdf\x2c\x34\x9d\x0c\xc4\x21\x4d\xe8\xe2\x35\x14\xe7\xfe\xf0\x1c\x3d\x02\x23\xcb\x40\x2f\x23\x7b\x2b\x30\xef\x22\x7e\xd2\x52\x3b\xa6\x6e\x5f\x83\x29\x8a\x9b\xf7\x3a\x34\xa1\x0b\xc0\xc1\x25\x10\xa3\xaf\xd3\xdd\x89\x23\x5f\xae\xd0\xed\xd7\x1c\x26\x2a\xf6\x80\xaf\x5f\x92\xcc\xff\x55\x08\xfd\x2e\x3e\xc6\x3d\x0c\xae\xcb\xd0\xd7\x5d\x10\x07\x97\xc0\x87\xbe\xfe\x23\x23\x43\x73\xbe\xb6\xc0\x3b\xef\x30\xa4\x0e\x48\xed\xd3\xd9\x69\x83\x7a\x5b\xb4\x82\x14\xcc\x02\x6e\xf2\x84\x99\x20\xe2\x82\x38\xf8\xef\xe0\x5e\x97\xf4\xbc\xc5\x32\xf3\xfb\xda\x47\xdc\x9f\x8d\x8a\x54\xcf\x35\x2e\x3d\x4d\x1e\x8f\x1a\x98\x5f\xfd\x1e\x1f\x34\x45\xfb\x92\x14\xb1\x21\x83\x38\xa8\xd7\x04\x60\xce\x40\xd9\xf5\x54\x83\xee\x43\xbc\x3e\xbc\x50\x7c\x73\x3b\x81\x62\x30\x64\x59\x91\xbe\xf5\xf1\x0e\xca\xae\x27\xd1\x6e\x2b\x7b\x8f\xb0\x7b\xd2\x28\x2a\x64\xd0\x01\x1c\x7c\xed\x6f\xda\xee\x5c\x9e\x3c\x38\xc6\x67\x29\x11\xec\xe3\x0a\xf1\x0c\x7c\xee\x99\x84\x96\x9b\xf4\xc6\xa3\xdb\xaf\x6e\xba\x50\x39\xd3\x07\x11\x17\xc4\xc1\x35\x30\xfa\x7d\x03\xd7\x5d\xda\xe6\x45\xb0\xfe\xf2\x6e\xdf\xdb\x24\xa2\xc7\x4a\x0a\x4a\x63\x4f\x29\xd0\x19\x02\x30\xdd\x03\x9a\xc3\xa1\x5e\x13\x10\x07\xd7\xc0\x4d\xab\x78\xf6\x09\x6b\xd9\xcb\x86\xd6\xb8\x8f\xb8\x74\xaf\x0f\x9e\x74\x16\xbe\x19\x62\x78\xc0\x33\xf6\xd6\x18\x5b\x7a\xa6\x47\x1b\x9a\xd6\x08\xe0\xe0\xbf\x83\x0e\x2e\xea\x76\xd0\x24\x2d\x27\x8d\xeb\x3b\xcb\xd7\xef\x1c\x27\xa4\x0f\x2a\x74\x5f\x6f\xe4\xbc\xf7\xae\x49\x7b\x92\xb3\xd2\xbf\x81\xd0\x00\x88\x83\x7a\x4d\x44\xff\xad\x01\xd0\x56\x77\x9a\x06\x9c\xc2\xcf\xd9\xf1\xbc\x72\xcd\x50\x78\x93\xff\x5c\xda\xfb\xd3\x3b\x73\xe1\xb8\xf7\xd1\x3d\x2b\x52\x93\x04\x84\x6a\xdd\xcd\x3e\xe8\x88\xb5\x83\x38\xf8\xda\xef\xad\xa6\x63\x7c\xf0\xdf\xe2\x43\x9b\x55\x4a\xe7\xbc\x22\x32\x2b\x21\x91\x72\x82\x9b\xfd\x6d\xcf\xd2\x56\xcf\xf6\x77\x48\x1b\x74\x12\x1d\xc4\xc1\x35\x50\x1d\xb5\xd7\x78\x79\x73\xeb\xfc\xb7\x47\x74\x28\x3d\x93\x6c\xec\xf4\x19\xda\x37\x0c\x45\x64\x04\xdd\x70\x88\xd5\x65\x22\xb7\xa1\x93\xe8\x20\x0e\xae\x01\xb7\xda\x97\xdf\x5a\x45\x5e\xe7\x8f\xd7\x17\x55\xe7\x2f\x7d\x7e\x11\x35\xae\xf5\x59\x6c\xe2\xc7\x04\xde\x79\x8d\x6f\x5a\xf3\xd8\x06\x88\xb8\x20\x0e\xfe\x3b\x7c\xb1\x37\x4b\xb3\x1f\x34\x1e\x33\xba\x2b\x9b\xee\x72\xb4\x42\x22\x94\x4c\x90\xfe\x33\xfa\x3d\xed\xa4\x2f\x99\x19\xd6\x8e\xbc\x17\x42\x03\x20\x0e\xca\x03\x00\x73\x06\x7a\xef\x38\x4d\x03\x6d\x9b\x05\x8c\x6a\x5a\x39\x43\x1f\x49\xae\x98\xc8\xbf\x1c\xa0\x70\x96\x97\x0a\x74\x2e\x20\xe7\x63\x9e\xf7\x34\x62\xe6\xa0\x80\x5a\xd0\x41\x1c\x7c\xed\x01\x3d\x91\x63\xaa\xfa\x62\xca\x19\x35\x9c\xc2\xc3\x1c\x77\x25\xbf\x6a\xfc\x76\xc7\x98\xfa\xca\xe1\x24\x21\x30\xfd\x67\x40\xec\x07\x22\x2e\x88\x83\x6b\x20\x35\xe0\xd1\xf3\x01\x29\xe1\x3b\x6e\x61\xe7\x78\x38\xa8\xdb\xbd\xd8\x72\x9d\xcb\x96\xdb\xfd\x59\xb4\xe6\x7d\xeb\xeb\x28\x83\xa0\x0f\x6a\x20\x0e\xae\x01\x53\x96\x6e\x8a\x41\xab\x57\x01\x03\xfd\xf5\x1b\x72\x8d\x04\xb7\x59\xb0\x31\x2a\xde\xa0\xfa\x4e\xd6\xb4\x90\x74\x3f\x69\xab\x8c\x42\xc4\x05\x71\xf0\xdf\x01\x5d\xdc\x77\xe0\xa9\x17\xfa\xd3\xf6\xec\xcb\xe8\x1e\x0a\x96\x8a\x9a\x7e\x4c\xd7\x0e\xbc\x29\xb5\xd1\x6e\xf7\x45\x11\xa4\x1c\x42\x95\x33\x10\x07\xe5\x01\x27\x80\x39\xdb\x91\x98\x60\x42\xcb\x33\x48\x0e\x09\xae\x36\xa2\x29\x41\x7d\xdb\xf0\xe2\xfc\x4a\xff\xa0\x15\x79\xfd\xf3\xab\x26\xda\x0a\x02\xe2\x7f\x9b\x33\xf1\x8a\x4d\x34\x35\xfd\xe4\x11\xcb\x9b\x1c\x45\x24\x78\xb1\x0b\x37\x32\xef\x85\x9b\x6c\xb8\x8e\x05\x73\x78\x54\x7c\xb6\x27\xe6\xfa\x0b\x3d\xae\xe5\x97\x25\xee\x35\x2f\xb1\x3c\x1e\x54\xc8\x19\x79\x62\x4f\x10\xc6\x8e\x55\xae\x70\xa4\xf0\x32\x4f\xd3\xeb\xbe\x9e\xc8\xc3\xff\x9a\x39\x03\x2d\xed\xef\x9e\x33\x24\x73\x66\x4f\xb6\xea\xfa\x33\x3e\xe6\x88\xe6\x63\xc9\x31\x7b\x73\xd9\x6d\x0e\xd4\x5d\x2a\x47\x6d\xf6\xbc\x7e\x96\x2e\xe2\x77\xa9\x99\x32\x67\x52\xd4\x41\x36\x67\xe9\x84\x65\xd4\x2a\xd1\xb2\x6b\xbb\x56\xb9\x24\xa3\x85\x45\xa5\x74\x6f\x2a\xa2\xd3\x59\xfb\x59\xb1\x65\xbd\x6d\x55\x6d\xec\x5d\xcf\xa4\x84\x85\x6c\xce\x08\x32\xf7\xcc\x2d\xee\x89\xda\x28\x2e\x90\x07\x69\x7f\xf8\x4a\xfc\x70\xd4\xca\x51\xd9\xcd\xaf\x51\x7c\x90\x4b\x42\xf9\x85\xf0\xd9\x14\xec\x90\xcd\x99\xe2\xb5\xba\xcd\x78\xfd\x73\xfb\xf7\x92\x4d\x1b\xd1\x2c\x3a\x66\x8f\x5d\x89\xbe\x1d\x0e\x9b\xbd\x64\x5c\xcf\xc4\x7b\xc1\xc9\x7c\x72\x26\xab\x45\x36\x67\x94\xe4\x83\x5e\xf2\x6d\xca\x12\x87\x1b\x8a\x26\xb2\x41\x46\x74\x63\x25\xb1\x9c\xb8\x83\x2e\x7d\xeb\xd1\x4f\xaf\x25\x58\x6d\x7b\x9e\x99\x39\x03\x89\xe8\xd4\xdb\x67\xf9\x4b\xcc\x4a\xc8\xd3\x73\x39\x1a\x3d\x0f\x74\xb3\x18\xf4\xed\xa7\x0e\xfc\xbf\x1f\x6c\x46\x33\x36\xce\x4d\x67\x73\xfe\x82\x8e\x1f\x82\x38\x78\x16\x8a\xdd\x7f\x3b\x27\xa6\x1f\xc1\x6b\x80\x59\x36\xfb\x3d\x73\x8c\x20\xb2\x31\x3a\x60\x0b\xf7\xf2\x51\x5c\xb0\xf6\x84\x30\x4b\x2e\x21\x22\x2e\x88\x83\x67\xe3\x94\x21\x7c\x5c\x0f\xf2\x66\xff\x0b\xaa\x56\x57\xb8\x6e\xd3\x54\x5c\x1f\x37\xaa\x3d\xa0\xbd\xfe\xdb\x3e\xe0\x9e\xfa\x17\x22\x3e\x68\xd0\x08\x88\x83\x67\x63\x01\x54\xe9\x95\x2d\xce\x32\xef\x54\x17\x8f\x95\x57\xf4\x2d\x04\xdd\x9e\xf5\xd7\x84\x5e\x06\xe2\x73\xfb\xdd\x12\xb9\x51\xd2\x9b\x87\x88\x0b\xe2\xfc\x25\x50\xb0\xfe\xe7\x33\xec\xb0\x72\xc7\xd1\x46\x81\xae\x95\xa9\x8d\x65\xac\x69\x38\x9d\x6e\x74\x98\x55\x6c\x95\x85\xb4\x48\xdc\x4e\xd6\xb4\x4b\xc1\x02\xc2\x9c\x81\x38\xa8\xe7\xec\xdf\xe6\x0c\xf4\x40\x9f\x26\x81\x5f\xa2\xc4\xc4\x8c\x9f\xd3\x72\x3a\xc7\x13\x8e\xe2\x86\xf7\x2b\x87\xd0\x32\x9f\xdf\x54\x77\x0a\x0f\x77\x29\x0e\xa0\xbb\xd7\x07\x8d\x0d\x06\x71\x70\x09\x14\xae\x73\xfe\x19\x6b\x7b\xaf\xe2\x64\x41\x14\xae\x74\xdb\xa4\xd8\xeb\x88\x59\xfd\x87\xde\xa7\xfc\x9a\x81\xed\xa5\x13\x72\x02\x59\xa8\x87\x05\xc0\xc1\x25\xb0\x27\x8a\xef\x28\xa2\xe2\x4f\x13\xbc\x35\xcf\xd7\x14\x33\x7a\xde\xe5\xba\x56\xc6\x8f\x5f\x49\x82\x22\x9c\x3a\xae\x96\x8b\x49\x50\xaf\x09\x88\x83\x4b\xc0\x03\x33\x62\xa9\x47\x65\x5c\x66\x5c\xfb\x45\xab\x74\x97\x77\x7b\x17\x4f\x6f\xbe\x94\xda\x10\xab\x60\xa4\x67\x0b\xfb\x50\x34\x34\xc0\x04\xc4\xc1\x25\x70\x39\xff\x33\xcf\x4f\x32\x2f\xfd\xdd\xce\x7e\x61\x56\xb9\x9c\x82\x7e\x09\x19\x89\x66\x0b\x2c\x1c\xcb\x4a\x97\x42\xbd\x6c\xbc\x21\xc4\x86\x0c\xe2\xa0\x5e\x13\x80\x39\x03\x65\xd7\xd3\x34\x90\xf7\xe3\x15\xdd\xac\xe5\x0a\x5a\x99\x9b\x7f\xc1\x70\x61\x69\xb3\xb6\x5a\x7e\xd8\x25\x92\xb1\xc1\xe8\xad\x02\xa6\xe1\xcd\x2d\x56\xc4\xda\x41\x1c\x5c\x03\xaa\x93\xdf\xd3\x52\x2f\x66\xf4\xea\x0a\xb0\x55\x0b\x71\x7a\x30\x49\x89\xbb\x9e\x5c\x2a\xf9\x73\x6d\xa7\xfc\xdc\xb1\xe9\xab\xd0\x0c\x44\x5c\x10\x87\xd4\x6f\xb4\xf3\x40\x00\xa7\xfa\x92\xf6\x9b\x5b\xf7\xb7\x12\xd9\x66\xcd\xd0\x16\x32\xa8\x34\xc8\x35\x38\x14\xaa\xd4\x39\x38\x3a\x4a\xe9\xa1\x7e\x23\x00\x07\xd7\x80\x82\xc7\xeb\x2a\x56\xf1\x54\x0b\x01\x47\x0f\x3b\x57\xca\x56\x21\x9f\x50\xac\x5b\x56\xbb\xd6\xec\x25\x31\x17\xbf\xee\xd5\x77\x42\x97\xf0\x82\x38\xb8\x06\x54\x8a\x1d\x7e\x0a\xe2\x27\x8d\xde\x8c\x3c\x3f\xdd\x3c\x62\x4f\x35\xe4\x1b\xca\x44\xe6\x9a\xd4\xf9\xcb\x1e\x25\x8d\xf8\x7a\x2e\x64\xd0\x41\x1c\xd4\x6b\x02\x30\x67\xa0\xad\xee\x34\x0d\x98\xf8\x13\x51\x52\x72\x2f\xda\x5b\x3f\x70\x25\xa0\xff\xb2\xa8\xfa\x31\xb2\x70\xb2\x8b\x64\x26\x9f\x41\xfb\xa1\xda\xbc\x90\x9f\x33\x62\xed\x20\x0e\xae\x81\xc8\xbb\x16\xb9\x79\x41\x5d\x77\x16\xdf\x2b\xaf\x7a\x54\xea\x4a\x04\xcb\xec\x6c\x46\x31\xf1\x3e\x59\x4b\x56\x67\x79\x16\x70\x7c\x82\x88\x0b\xe2\xe0\x1a\xb0\x21\xc0\xbe\xce\x43\xcd\x36\xbb\xd7\xce\xf5\x9b\x12\xdf\x5f\x4c\xb3\xd0\xd7\x22\x3d\x3c\xfa\x2e\xf9\xbb\xd5\xfb\x99\x8a\x53\x7c\xd0\xf0\x0a\x00\x07\xd7\x40\xcc\x97\xa0\x2f\xd7\x42\x04\xa2\x1b\x14\x9b\x5d\xe3\xc4\x2e\xf3\x4d\x5d\x99\x99\x57\x21\x9d\xab\x9f\xa0\x0b\xfb\x74\xc5\xc7\x13\xea\xbd\x03\x71\x70\x0d\xfc\x28\x1f\xa6\x93\x7c\xd1\x2d\xb5\x7a\x29\xf4\x09\x17\xfa\xa7\xd4\xc4\xf5\xf0\x04\x55\xf2\x19\x21\xeb\x9f\x35\xc2\xf6\x1a\x6f\xa0\xbb\xee\x40\x1c\x94\x07\x00\xe6\x0c\xf4\xde\x71\x9a\x06\x9e\xc5\x96\x48\xf1\x95\x61\x14\x62\xe0\xdc\x6d\x9c\x53\x70\xca\x2d\x98\xe0\x24\x1f\xb3\xe5\xda\x88\x2d\xe1\x3e\x8c\x9c\xa3\x82\x8e\xf5\x82\x38\xb8\x06\xa6\x29\x2f\x3c\xcd\xb1\x64\x10\xdf\x34\x1e\x92\x76\xe1\x3e\xb9\x38\xb3\x52\x95\xaf\x63\x51\x3b\x3b\x2a\xf6\x40\xe2\x13\xfe\x01\x74\xed\x01\x88\x83\x6b\xe0\xb2\x63\xb6\x93\xdd\xa2\x5d\x7e\xae\xe1\xc0\xa2\xf8\xc0\x90\xc6\xaf\xbd\xa6\x8c\x7d\x05\x0b\x72\x16\x81\xc1\xe8\x7b\xd5\x36\xd0\xf5\xa4\x20\x0e\xae\x81\x60\x2c\xea\x85\x26\x29\x79\x61\x56\xf9\xfc\xcd\x01\xf4\x42\xa6\x9d\x2f\x94\x97\x07\xf5\x93\x42\xc2\x2b\xd8\x42\x8a\x4c\x45\xa1\x0f\x15\x20\x0e\xae\x01\x85\x73\x06\x5b\xb1\x72\xf3\x94\x35\x57\x8b\xa4\xe7\x9f\x91\x89\x15\x47\x3f\x2c\xa1\xca\x4a\xf0\xa4\xfa\xd2\x59\xe0\x2f\xae\xcc\x83\xd0\x00\x88\x83\xf2\x00\xc8\x9c\x45\x6f\x75\xab\x5f\xd4\xc3\xf8\xec\x8e\x2d\xde\x51\xfc\x56\x0c\xb5\x43\x75\x8d\x1f\xdb\x74\x8d\xa5\x7e\x98\xb2\xc5\x36\xc0\x46\xf2\x6f\x73\xf6\x32\xd9\x20\x7f\xe1\x59\x6c\x4d\x7b\xf1\xd8\xca\xa3\xf6\xc8\xa0\xe1\x7d\xdf\xaa\xa7\x83\xd9\x66\x15\x82\x18\xa3\xb7\x08\x36\xd8\xfe\x42\xbd\xba\x07\xa8\xf4\x30\xa4\x25\x12\x9e\x79\xfe\x8e\xb8\xf2\xad\x60\x7d\xfa\xbb\x83\xc5\xe8\x94\x4b\xf2\x89\xfb\xee\x65\xa1\xb9\x89\xff\x9a\x39\x03\x2d\xed\xef\x9e\x33\x24\x73\x26\xae\x21\xee\x6f\x49\xba\x9a\x13\x99\xc4\x62\xbf\xe7\x8d\x57\xd3\x29\xc5\x2a\xd9\x26\x71\x35\xc3\xa0\x6e\x88\xcc\x47\x69\xf4\xf8\x4c\x8a\x3a\x5c\xc8\x95\x33\x49\xa6\xed\x9f\xe3\xd2\x7c\x36\x49\x97\x9d\x87\xdf\x96\x04\xfe\x60\xb7\xbe\x4a\x44\x95\x92\xc7\xf0\xc8\xd7\x8a\xe1\xdc\xcc\xd9\x0c\x89\x44\x36\x67\x14\x7a\x77\x6f\xdc\xb5\x92\x67\x1a\xf1\x10\xcc\x62\xb9\xd2\xfa\x75\xe9\x2e\x1d\x19\x95\xee\x3e\x76\x6e\xf0\x9d\xcc\x89\x22\x65\xd3\x33\x59\xad\x36\xd2\x9f\xbd\xad\x47\x69\x53\xf4\x75\xa6\xba\x66\xc3\xff\x4a\xb3\x17\xfb\x9b\xb6\xfb\x62\x64\x58\x5f\x96\xdf\x72\x14\x32\xab\x84\xf6\xfb\xcd\x9f\xc9\x6a\x91\xcd\xd9\xf2\xec\x55\xb6\x31\x1d\xe1\x40\xa9\xd0\x9e\x35\x81\xcf\x6c\xaf\x85\x31\x1e\x7c\xc1\x57\x4f\x19\x65\x68\x8b\x9a\x92\x37\x9d\xb2\x3b\x33\x73\x06\x12\xd1\x69\xd9\x98\x25\x99\x6f\x2f\x74\x80\x58\xba\x72\x2a\x6f\x8e\xe8\x19\xda\x81\x96\x5a\xa7\x66\x8b\x3b\x17\x93\x7a\xb4\xf1\x41\xf2\x66\xb9\x3a\x22\x0b\x81\x38\x78\x36\x66\x8b\x73\xc2\x88\xfa\x4a\x8f\xf3\x5c\x5f\xd4\x65\xde\xe6\xbc\xbe\xad\x93\xc7\x41\xdf\x22\x3f\x41\x0b\x8b\x99\x30\x99\x6b\xcf\x0a\x22\x2e\x88\x83\x67\x63\x6f\xee\xae\xd0\xd8\xde\xab\xe2\x1e\x57\x7b\x3f\x87\xd5\x5e\xfd\xc3\x84\x83\x96\xa7\x16\x43\xc0\x6d\x62\xe8\x93\x17\x7e\x20\x45\x8a\x88\x0b\xe2\xe0\xd9\xd8\xf6\x42\x5f\x1a\x43\x0b\x41\x74\xf9\xb4\xcb\xa2\xfd\x48\x6e\x76\xa6\xbc\x4c\xaa\x42\xea\xcd\x35\xe3\x77\xd6\xdf\x8c\x1e\x90\x40\xe5\x18\x10\xe7\x2f\x81\xe2\xf3\x3f\xe5\x98\x5b\x1f\x2f\x4f\xa6\x8b\x34\x24\x5e\x1c\x89\x0a\x53\xbc\xd6\x64\xe6\x69\xc2\x4b\x77\x22\x87\xd2\x76\xa8\xfc\xd8\x2e\x00\xaf\x1e\x61\xce\x40\x1c\xd4\x73\x06\xa8\x9c\x01\x1e\xe8\x53\xfb\x8d\x1e\x3f\x95\x0a\x68\x3e\x3a\xd7\xcb\x94\xa1\xfb\x93\xc3\x2d\x6c\x26\xa6\xfd\xdc\xe3\xcb\x35\x38\x6a\x7e\x79\x84\xd7\x1f\x53\x42\x45\x4e\x10\x87\x54\x34\xfc\x6e\xf7\x96\x58\xae\x66\x7b\x21\xf4\x9e\xfa\xc1\x71\x0e\xa9\xaa\x0e\xd6\x1f\x3c\x29\xc3\xf3\x74\xc5\x09\x42\xba\x73\xb9\x82\x88\xb8\x20\x0e\x2e\x01\x1d\x22\x75\x99\x41\x82\x6e\x66\xb3\xb1\x28\x89\xdb\xa4\x49\xfe\x5d\x5b\x46\xd9\xbf\xe2\xb2\x62\x6b\xe7\x4f\xb0\x49\xa6\x75\x64\xa0\xef\x09\x00\x0e\x2e\x81\x4e\xdb\x8b\x5e\xdf\xec\xde\xfc\x28\xef\x50\x55\x5b\x8c\x7b\xcf\xc7\x3c\xae\xdb\x4c\x3b\xb8\xfc\x55\x05\x85\xbb\x83\x84\x2e\x19\x9a\xd0\x05\xe2\xe0\x12\x40\xab\x1d\x23\x8d\xbb\xac\x2e\x7a\xde\xd4\xc5\x01\x95\xce\x43\xc1\x27\x59\x51\xc3\xae\xeb\xd1\x83\x5f\xd1\x14\xfb\x8d\x3f\x30\x3e\x20\x36\x64\x10\x07\xf5\x9a\x70\x01\x2e\xa1\x06\x64\xd7\xd3\x34\xc0\x27\x2a\x3a\xe6\x87\x8b\x17\xde\xb7\x68\x1f\x7d\x37\xce\xdc\xce\x57\x8b\x80\x11\x4f\xdf\x9c\x98\xd8\xc7\x8c\xa1\xc3\x94\xe0\x15\x62\xed\x20\x0e\xae\x81\x64\x53\xe5\xcb\x39\x64\x16\x71\x8f\x7e\xae\xf5\x65\xba\x1a\x54\x0e\xab\x8d\x95\xc6\xdd\x6b\x12\x1c\xfe\x25\x9f\xac\x86\x6a\x9f\x88\x88\x0b\xe2\xe0\x1a\xd8\xbc\x29\xf5\xe2\xdb\x1c\xeb\xe3\xb6\x4b\x9e\x6d\x49\xd5\x53\xcf\x3e\x34\x84\x5b\x4d\x4a\x25\x0e\x4e\x17\x5b\x05\xea\xdc\x7d\x1a\x87\x88\x0b\xe2\xe0\x1a\x78\xab\x68\x91\xc1\x1c\xfe\x11\x73\xec\x8b\x54\x81\x8e\xd4\xdb\x75\xfe\xf0\xd4\xd9\x3a\x83\x76\xed\x1b\xd2\x56\x96\x7b\x99\xb8\xd0\xb7\x2a\x10\x07\xd7\x80\x58\xb7\xbc\x27\xd9\xae\xca\xd8\x71\x1c\xd3\x1a\xee\xa6\xfc\x3d\x26\x55\x5b\x51\x22\xc2\xb9\xcd\x5d\x4c\x2d\x75\x47\xe5\x95\xc7\xd0\x20\x00\x00\x07\xf5\x9a\x00\xcc\x19\x68\xab\x3b\xf5\x10\x85\xd1\xbd\x15\x19\x79\x26\xc9\x7c\xe9\xd5\x47\xfc\x06\x3c\xf4\x41\x23\x8f\xf6\x46\xaf\x4d\xd6\xc8\x61\x31\xc6\x28\x08\x62\xb3\x43\x87\x28\x00\x1c\x5c\x03\x93\xfa\xd2\xa6\xd9\xb4\x2d\x5e\xf2\xee\x05\xdd\x92\xa8\x22\x77\x31\x42\x95\xac\x9d\xe6\x26\x33\xfc\x8f\x35\xe2\x13\xb2\xc9\x02\x10\x71\x41\x1c\x5c\x03\xea\x8c\x7e\xa6\xce\x29\xad\xa3\xf4\x9e\xfb\x49\x5b\x92\x74\x17\xd1\xd2\xb1\x04\x2d\x3e\x36\x8c\xd1\x1d\xf1\xd6\x19\x26\x66\x70\x22\xe2\x82\x38\xb8\x06\x9e\x50\xde\x8b\x28\x67\x5f\x34\xea\xfd\xb8\xf0\x76\x18\xab\xf3\xc6\x0c\x46\x80\xa1\x73\x5f\xd7\xf8\xa6\x37\xb1\x59\xbc\x3d\x33\x06\x22\x2e\x88\x83\x6b\xe0\x52\xa2\xaf\x56\x31\x6f\xbe\x72\x79\xdc\x36\xfe\xb9\x87\xa3\x74\xeb\x17\x0e\xf1\x2b\xc9\x94\x6f\xf9\x7f\x2d\xe6\xf4\x2f\x7b\x0d\x99\x33\x10\x07\xe5\x01\xed\x7f\x6b\x00\xf4\xde\x71\x9a\x06\xa8\x33\xd9\x8f\x99\x3e\x34\x89\x5e\xaf\x1c\xa3\x95\x3a\xff\x4e\xc4\xf8\xb8\x4f\x24\xe2\x3e\xbe\x52\xa8\xd1\xfd\x5c\x12\x3b\x57\x68\xe4\x3d\x88\x83\x6b\xa0\x4e\xc7\xa8\xd4\xbb\xff\x9b\x4d\xef\xc7\xe1\x1c\x6b\x77\xec\xee\x31\x72\xe1\x34\x1b\x73\xaa\x8b\xda\x8f\xc5\x4b\xac\xd0\x96\x76\x10\x71\x41\x1c\x5c\x03\x07\xa9\x16\x79\x7a\xae\x1a\x22\x8f\xb2\xf7\x88\x15\x92\x52\x65\x16\x23\x5b\xa5\x88\x55\xa8\x87\xa9\x0e\x2d\xf2\xfa\xb0\x15\xe4\xa1\x03\x3a\x00\x0e\xae\x81\x9d\xb6\x01\x9b\xde\x6c\x75\xef\x52\xd1\xe9\xcd\x52\xb1\x70\x23\x7b\xd5\xee\xc2\x40\xdc\x20\xbf\xd9\x9e\xd2\x2d\xd5\x25\xe1\x2e\x44\x5c\x10\x07\xd7\xc0\xd3\xfd\x7e\x53\xd3\x97\x53\x59\x52\x05\xb5\x21\xba\x8b\x35\x85\x9a\xf2\xbd\x5f\x33\xda\xee\x09\x1c\xf7\x79\x17\x38\x9b\x30\x42\x57\x6a\x80\x38\x28\x0f\x80\xcc\xd9\x25\xf2\x91\x13\x67\x83\x7d\x0b\x72\x01\x2f\xef\xce\x6f\x6e\x5a\x19\x9b\x8b\x1d\xae\xe8\x82\xc5\xbb\x9e\x57\x93\xd8\xbf\xf1\xd5\xfd\x4f\xe5\xec\x33\x39\xf5\xf9\xeb\x65\xd9\xd7\xd2\x09\xc6\x92\x34\x7a\xf0\x87\xbb\xf1\x02\xfa\xb1\x55\x48\x32\x05\xca\x04\xbc\xfd\x64\x5c\xfe\x42\xbf\xfe\xf4\x9d\x91\x2d\xaf\x8b\x27\x33\x74\xa3\x28\xc7\x0d\xbf\xc1\xc4\x29\x5a\x21\xd5\xfe\xf5\xaa\x6e\xb2\x49\x71\xae\x88\x2e\xd1\x7f\xcd\x9c\x81\x96\xf6\x77\xcf\x19\x92\x39\xa3\x7e\xfa\x52\x6b\xc1\xa9\x33\xf3\x75\xe7\x64\xa4\x2b\x31\xd7\xc3\xd7\x62\x6b\xcc\xbb\xbf\x3e\x7c\xb0\xd2\xfa\x7e\x91\xf0\xdd\x9d\x33\xb9\x82\x4b\x1c\xd9\x9c\x31\xd1\x8d\x69\xd3\x77\x19\x97\xad\x6b\x25\x7c\x3e\xe7\x51\x96\xec\x98\xe9\xfa\xc6\x02\x4b\xdf\x83\xb9\xc6\x0c\xdf\xa1\xab\x6d\xfb\x4c\x4a\x58\xc8\xe6\x2c\x02\xeb\x8d\xd1\x13\xe3\x5b\x05\xbd\x86\x1f\xf6\x2f\x60\x98\x9a\x33\x38\x06\xb0\x1e\xed\xdc\x4b\x4a\xb6\xe5\xef\xae\xa6\x34\x1a\x38\x93\xd5\x22\x9b\xb3\xdc\x91\x09\x7c\x41\xb4\xab\x71\xdc\x59\x35\xee\xc4\xb3\xd1\x77\x76\xb7\x4d\x55\x3d\xdf\xa4\x89\xce\xd2\x1f\x0e\x29\x36\x0f\xac\x9c\xc9\x6a\x91\xcd\x59\xab\x95\x52\x0c\x5f\x1c\x27\xbd\xd3\x82\xd9\xc4\xd5\xc9\x17\x35\x3c\x9f\x71\x5e\x6f\x8d\x64\xe6\x34\x6e\x92\x7d\xc5\xbc\x2d\xd1\x77\x66\xe6\x0c\x24\xa2\xd3\xb2\xb1\xe6\xf7\xe6\xb8\x66\x26\xbc\xef\xaf\x8e\x2b\xeb\x13\x7d\x6b\xe7\x75\xc5\xf2\xf9\x56\xdc\x66\x0e\xcc\x15\x96\x2a\xcf\x1f\x53\x41\x97\x5c\x81\x38\x78\x36\xee\x79\x69\x4a\xbd\x57\xa4\xa3\xfd\x2e\x13\x65\x54\xb5\xb0\x70\xd4\x7d\xc6\x3a\x3b\x90\xfa\x37\x4a\xfe\x6b\x75\x51\x5f\xcd\x7e\xa8\xd1\x00\xc4\x21\x75\x81\x57\x46\x63\x07\xb6\xcb\x06\x32\x89\x49\x62\x44\x32\x2f\x1a\x97\xaf\x74\x2e\x3c\x5b\x21\x3f\x21\xf9\x20\xbb\xea\x3d\x14\x06\xcd\x51\x07\x71\x48\x26\x6a\x8c\x98\xd7\x93\x5a\x87\xed\x64\x0c\xd7\x84\xc5\xec\x29\xfe\x25\x0a\xed\xa2\x28\x87\xf4\xf7\x9d\x2a\xda\xd3\x1b\x3b\xbb\xd0\xd9\x3e\x10\xe7\x2f\x81\xf5\x3f\xbf\x83\xf1\x91\x4f\xe4\xb0\xba\xb1\x18\x7f\xd1\xe0\x6c\xd9\x5a\xaa\x93\xa9\x6f\x7a\xad\x6c\xd2\x17\xc2\x0d\xa7\x4f\x63\x6f\x05\x8f\x2f\x23\xcc\x19\x88\x83\x7a\xce\xfe\x6d\xce\x40\x0f\xf4\xa9\x17\x8f\x2e\x3c\x50\xde\x38\x8a\xfe\x31\xcf\x4b\x70\x22\x45\x84\x1a\x85\xb6\xcb\x49\x31\x4c\xbb\x97\x4f\x90\xab\x1a\x7f\xb3\xca\x1c\x3a\x29\x0a\xe2\x90\x86\x41\x2c\xed\xe8\xf2\xb5\x46\xd8\xc5\x64\x71\x74\x09\x8f\x0c\xf1\x0c\x5e\xe6\xda\x5c\x4d\x94\xda\x50\x16\x42\x6d\xda\x14\x20\xfe\x04\x0d\x83\x00\x70\x48\x27\x5b\xd7\x09\x1b\xcb\x75\xfb\x19\x38\x6f\xd1\xa1\x27\x32\xd6\x58\x89\xae\xc4\x8a\xf9\x6d\x3c\xc1\xb2\xfa\xc0\x2f\x86\x4f\x85\xef\x02\x9d\x6c\x05\x70\x70\x09\x30\x0c\xee\xc7\x0a\x89\xd8\xa4\xd2\x87\x50\xc9\x8c\xe2\xc6\xca\x97\x8c\x97\x6b\x69\x4e\xa4\x3d\x28\xad\x61\x7d\x9e\xfc\x51\xc7\x16\x11\x17\xc4\xc1\x25\xd0\xe9\x5d\x2e\xf4\xd4\x5b\x6a\xba\xff\x4a\x47\x96\xfa\x8f\x3b\x97\x50\xce\x7f\xc8\xd3\xe2\x30\xf6\x64\x0a\x65\xe4\xb7\x4d\x92\x48\x43\x6c\xc8\x20\x0e\xea\x35\x01\x98\x33\x50\x76\x3d\x35\x0d\x30\x77\xec\xfe\xbe\xc9\x73\x32\x67\x49\x7a\xad\xfa\x85\xdc\xae\x49\xd1\xfc\x0a\x75\x0c\xcb\x9c\xc4\x87\x9f\x96\x4d\x2e\x3b\x8f\xa0\x34\x00\xe0\xe0\x1a\xe8\x17\xe7\xab\xf4\x33\xf1\x8a\x46\x8d\x79\xdc\xed\x79\x24\x70\xa3\x78\xd5\x06\x4d\xc8\x6e\x36\xd4\xea\x23\xca\x0f\xd9\xcb\xb3\xab\xd0\x64\x4d\x00\x07\xd7\x80\xd9\x65\xdb\x7a\xaf\x3b\x96\x3d\xf7\xaa\x82\x8d\x5a\xc6\xa2\xc4\x64\x9f\x5f\x68\xbe\x55\xba\x33\x21\xb8\x11\x94\x3e\x57\xbf\x02\x55\xfa\x40\x1c\x5c\x03\x24\x02\x2f\xbc\xac\xe9\xe8\x7d\xd0\x4f\x94\x38\x2b\x7e\x8f\xe0\xc5\xa9\x6b\xdc\xa8\x3f\x60\x7d\xae\xca\x54\x45\x65\xd9\x24\x0f\x7d\x31\x07\x71\x70\x0d\xb8\x8b\xe1\x38\x2d\x7f\x9e\xab\x77\xe6\x64\xe9\x7e\x84\xe7\x7f\x49\xff\x22\x4f\xd4\xba\xfc\x02\xa9\xf2\xdd\xae\xca\xc1\xa2\xfd\x6e\xe8\x68\x2b\x80\x83\x7a\x4d\x00\xe6\x0c\xb4\xd5\x9d\xa6\x01\x42\x61\x4d\x33\x9f\x1b\xaa\x1f\x9c\x96\x31\xad\x62\x17\x1d\x78\x3e\xd5\xe6\x2f\xbd\xd2\x91\x39\xa1\x15\x64\xab\x96\xa5\x2a\xf4\x46\xac\x1d\xc4\xc1\x35\x60\x3f\x3b\xc0\xd2\x3a\x1c\x28\xe6\x42\x18\xb6\x7f\x71\x76\xf4\x79\xd2\x9e\x11\xe7\x41\x3c\x2f\x4a\x80\x72\xa2\xde\xb5\x99\xb8\x4c\x44\x5c\x10\x07\xd7\x80\x6a\x10\x61\xcf\x43\x32\xcc\xc6\xc6\x14\x36\xed\xa5\xee\xa9\x27\xf3\x72\xa9\x14\xd6\x68\x3f\x26\x1b\x4a\xc4\x1e\x77\x99\xf7\x41\x43\x26\x40\x1c\x5c\x03\x38\x28\x95\x85\x7f\xea\x9f\xcb\x24\xd1\x45\xe8\x8e\x7e\x32\x6c\x90\xee\xba\x6f\x21\xb4\x95\xf2\xcb\x3c\xde\x89\x7b\x9c\x15\xbb\x15\x1a\x5e\x01\xe0\xe0\x1a\x20\x6e\x0f\x8d\xa8\x10\xda\xb4\x3f\x7c\xe4\x47\x9a\x36\x90\x3b\x93\xc7\xfa\x4b\x7b\x7d\x61\xb3\x63\xf7\xc6\x32\xe7\xec\x87\x08\x48\x03\x20\x0e\xca\x03\x00\x73\x06\x7a\xef\x38\x4d\x03\x77\x6c\x7f\xb9\xf2\x98\xd7\xd9\x9c\x8c\x16\x85\x71\x0a\x51\xcd\xc5\x84\x6a\xc4\xae\x08\x5e\x5f\x39\x3c\x3c\x4f\xc7\x36\xd2\x0c\x1d\x45\x07\x71\x70\x0d\x50\xa9\xd4\xa2\x64\x5f\x65\x23\x3c\x5c\x5d\x7e\x64\x9b\x2b\x62\x7d\xae\x86\xfd\xca\xcc\x18\x06\x65\x19\x71\x73\xd5\x7a\x8f\xae\x25\x22\x2e\x88\x83\x6b\x80\xf4\xa4\x4f\xf8\x72\xf6\xf1\x84\xbe\x92\xff\xe4\x51\xf4\x3b\x95\x22\x7d\xb6\xb0\x5a\x52\x7c\x11\x35\x06\x06\x2e\xc2\x0b\xd8\xd3\xd0\xdc\x31\x00\x07\xd7\x40\xf4\x9d\x04\x96\x0d\x72\xb3\x00\xca\xf4\xa6\xfb\x52\x9a\xf7\xdf\xf2\x70\x69\xb8\xad\x9f\xaf\x1b\x7b\x61\xf7\x52\xfb\x3e\x0a\x1e\x34\xc4\x1a\xc4\xc1\x35\x80\xb7\xff\x76\xda\x42\xbd\xa9\xf2\x5a\x29\xb3\x4b\x59\x3b\x3a\x6f\x53\xbf\x46\x4a\xcc\x03\x6b\xbd\x60\x91\x5b\x76\xa1\x87\xd4\xd0\x28\x7d\x10\x07\xe5\x01\x90\x39\xc3\x3e\x31\x20\xbf\xdb\xf0\xb2\xae\xff\x31\xda\xd7\xe4\xa5\xae\x6e\x67\xc3\x26\x0c\xf5\xe5\xea\xbb\x79\x8e\xcd\x5d\x98\x05\x0d\xa5\x7f\x9b\x33\x7b\x3f\xea\x5b\x55\x34\x9b\x44\x2d\xde\x32\x1b\xe7\x48\xa3\x74\x3b\xe4\x7a\x7b\x08\x5a\xaf\x2a\x85\xd8\xff\x89\xdf\x8c\x60\x3a\xf7\xf7\x47\x37\x5a\xf2\x7e\xf5\xbc\x26\x02\x62\x8c\x8e\x22\xe1\xe6\xed\xd1\xcd\xea\x8b\x09\x7d\x25\xa1\x97\xaf\x08\xbb\x91\x93\x28\x3d\xc0\xfb\xaf\x99\x33\xd0\xd2\xfe\xee\x39\x93\x85\xbf\xc0\xf7\x37\xbc\xb3\xe0\xaa\xf6\x5e\x52\x60\xa7\xdf\xcf\x2f\xa0\x44\x9f\xa9\xb7\x8e\x69\x57\xdf\x7c\x1e\x24\x76\xc8\x71\xcf\x61\x5c\xe0\x4c\x8a\x3a\xc8\xe6\xec\xfc\x4d\xbe\x8e\xfb\xc4\xd4\xc3\x36\xe4\x9f\xb9\x3c\xb2\xcb\x07\x57\x7a\xe8\x16\x7e\x59\xa7\x65\xdc\x7f\xd0\x5a\xb0\x6a\xb7\x6a\x76\x26\x25\x2c\x31\xe4\x99\xf6\x96\x18\x93\x0d\xb2\x52\x17\x35\x76\xb2\x2b\x93\xdf\xaf\xd7\xb5\xc6\x4c\x6f\xa9\xfd\x54\xbf\xcd\x7c\x32\x11\xfc\xa7\x26\x42\xec\x4c\x56\x8b\x6c\xce\xec\x1f\x0a\x3e\xda\x95\x5c\x59\x19\xb5\xca\xa1\xe2\x92\xa0\xc0\x9b\x9e\xab\x62\xbb\xc5\x8b\xab\x6f\x32\x44\x88\x72\x94\xb5\xb1\x78\x26\xab\x75\x46\xfa\xb3\x9b\xc3\x3f\x32\x37\xad\x87\xd1\xac\xd3\x39\xb9\xc5\xb4\x86\x46\x63\xed\x59\x7c\x5b\x19\x82\x6a\x97\x27\x6f\x0d\xd1\xec\x4f\x8f\x9e\x99\x39\x03\x89\xe8\xb4\x6c\xbc\xe7\x24\xf1\xf0\x69\x91\xe0\xf8\x2d\x14\xa7\xfd\xf9\x68\xa1\xf3\xd6\xd2\x87\x37\x97\x6d\x0a\xb9\xdc\x87\xe7\x36\xf5\xdf\x1e\x41\x9f\x9e\x40\x1c\x3c\x1b\x5f\xca\x11\x1e\xf6\x52\x10\x2a\xb2\xfe\xbe\xd6\x76\xe5\x61\xa6\x95\x78\xb7\x11\x87\xd7\x1b\x27\x06\x8f\x3d\x52\xb2\x45\xd7\x14\x68\x26\x35\x88\x43\xea\x02\xdf\x27\xef\xcd\x9c\xf6\xbb\xc1\xcb\x4b\x34\xfb\x2b\x83\xd1\x7d\x86\x6f\xe5\x32\x65\xb8\xb8\x12\xa7\x5f\x8f\xca\xad\x5f\x21\x50\xd9\x04\xc4\xc1\xb3\x71\xcb\x88\xea\x78\x16\xb6\xed\xe6\x2d\x66\xdb\xa0\xf4\xa3\xc1\xf7\x05\x59\x75\x85\x6c\x7b\x72\x07\x0f\x18\x7e\x60\xd3\x1e\x4a\x42\x93\x00\x40\x9c\xbf\x84\xf8\xff\xfc\x0e\xfe\x1e\xf6\x1f\xaf\xca\x7f\x7e\x90\xd9\x3c\x30\x71\x0f\x3b\x41\x4b\x78\x43\x48\x21\xee\x42\x1d\xbd\x83\xb5\xef\xd5\xd9\xdf\x53\x94\x08\x73\x06\xe2\xa0\x9e\x33\xd9\x7f\xdf\x71\x05\x78\xa0\x4f\x93\x80\xaa\x68\x60\xa6\x7b\xe4\xb3\xd4\x09\xa7\xe3\x63\xdc\x6b\x39\x2d\xb7\x2f\x49\x4c\x8e\xfe\x89\x8e\xbe\x1e\x8b\x5d\xc6\x47\xf0\x66\x1e\x7a\xc9\x01\x70\x70\x09\x30\xeb\x13\xe6\xbf\x33\x12\xaa\xb8\x35\xec\xe4\x4c\x47\xf0\x55\x2e\x6c\x65\x4e\x9c\x89\x8b\x6e\xb5\x70\x6b\xa9\xac\x31\x68\x13\x9a\x7a\x06\xe2\xe0\x12\x98\xe8\x7b\x22\x74\x6e\x52\x6a\x88\xf5\xc1\x2d\x05\xfe\x59\xe2\xa6\xef\xed\x3c\xec\x76\x81\x45\x71\xc4\xb1\x78\x27\x23\xc5\x92\x98\x88\xb8\x20\x0e\x2e\x81\xc3\xa9\x22\x5b\xf2\x22\xf9\xc7\x18\x52\xd8\x9a\xcc\x93\x03\x4d\x15\x61\xf9\x45\xb9\x1f\x31\xac\x57\x6d\x35\xa6\xdd\x2c\x70\xf2\xfe\x6f\x20\xc2\xbf\x39\xb8\x04\x98\xe4\x74\xd0\xc3\xed\x5a\x24\x4b\x53\xbe\xd4\x15\x9b\xe9\xf7\xec\x9b\xd0\xe0\x08\x13\x17\x38\x94\x26\x3a\x30\x63\x1b\xd9\x24\x22\x36\x64\x10\x07\xf5\x9a\x00\xcc\x19\x28\xbb\x9e\xa6\x81\xcf\x96\xaf\x79\x87\xf5\x3c\x7f\xa9\xdd\xac\x10\xdc\x8b\xff\x8d\x9b\x1d\xdf\xb5\x7b\xbf\x79\x79\xfb\x5a\xd3\x84\x74\xfc\x9c\xd5\x2f\xc4\xda\x41\x1c\x5c\x03\x4b\x85\x63\x91\x81\xdf\xcb\x12\x84\xe2\x86\x38\x73\x50\x87\xb0\x43\x31\x68\x28\xfc\xfc\x09\xa3\x9d\x8b\xda\xa2\x5e\x6a\x3f\x85\x06\x0c\x80\x38\xa4\x3b\xae\x4c\x26\xf8\x17\x3a\xc7\x73\xc6\x94\x38\x8c\x46\xaf\xb7\x4d\x33\xa1\x62\xa7\xa9\xef\xf0\x0a\xdb\x92\xdb\x5d\x3c\xc8\xc7\x7c\x8d\x88\x0b\xe2\xe0\x1a\x38\x29\xd6\xbf\x35\x33\xe1\x1c\x8d\x4a\xc3\x1e\x20\xb8\xf6\x49\x98\xfa\x72\x7e\x3e\x0d\x01\xb9\x01\xbe\xf6\x00\x81\x59\x2d\x6a\x07\x22\x2e\x88\x83\x6b\x40\xa1\x57\x87\x97\x31\x75\x33\x21\x6d\x61\x97\x40\xaa\x05\xb3\x55\xe0\xf3\x77\xb4\x85\x59\x66\x2c\x7e\x42\x2c\x94\xa7\x8f\x15\xa1\x7b\xce\x40\x1c\xd4\x6b\x22\xf6\x6f\x0d\x80\xb6\xba\xd3\x34\x70\x1f\x73\x87\xfb\x7c\x28\x59\xe9\x83\x4a\xd5\x68\x31\x07\x53\xef\x5a\x75\x07\xdb\x3e\x7a\x09\xa1\x49\xbd\xad\xa0\x8e\x77\xe7\xa1\x81\x20\x20\x0e\x69\x6a\x2b\xe6\xfb\x01\x93\xb4\x66\x5b\x74\x94\x17\x0e\x45\x52\xe4\xe1\x4d\xe7\x58\x4a\x15\x0d\x2e\x3e\x89\xcb\xb2\x1d\x7f\xa7\x72\x57\x0c\x11\x17\xc4\x21\x8d\x51\x97\x49\x09\x19\x0d\xe3\x65\xb9\x2d\xdf\x22\x6b\x59\xa1\xee\x59\xc1\x61\xcd\x6f\x10\xc3\xf0\xe9\xf0\xb3\x32\xea\x63\xf7\x3a\x68\x3c\x3b\x88\x83\x6b\x60\xe1\x48\x71\xa3\xd5\x0c\x07\x73\x89\xcb\x98\x9b\x89\x39\xb8\x24\xa1\xb2\x6b\x67\x6f\xe7\x36\xa7\x23\xef\x00\xd5\x95\xe5\x62\xe8\x3b\x1d\x88\x83\x6b\x00\x17\x63\x45\x7f\x2d\x58\x47\xc3\x98\xa9\x2e\x4d\xa9\xfc\xca\x55\xe2\xf8\x5a\x96\x21\xe1\xae\xb2\x24\x6d\x0c\x46\xee\xca\x80\x13\x84\x06\x40\x1c\x94\x07\x00\xe6\x0c\xf4\xde\x71\x9a\x06\xaa\x2f\x2a\x51\xba\x84\x38\xbc\x4c\x19\x99\xdd\x4a\x2d\x89\x7b\x3f\xb9\xb4\x9e\xd5\xd2\xfe\x4d\xed\xf3\x1b\x0c\x2e\xb5\x42\x59\x73\xa8\x8f\x0f\xc0\xc1\x35\x80\x45\xc1\x46\xab\x50\x6d\x77\x70\x2e\xdb\xae\xb4\x86\x43\xfa\x9b\xf8\xa3\xef\xb6\xa8\xde\x49\x25\x3a\x4d\x05\x9d\xa8\x91\x3d\xd0\x54\x45\x10\x07\xd7\xc0\xbb\x5c\x1d\xaf\xd9\x10\x2d\xcb\xee\x3a\x5b\xd3\x03\x96\x43\x14\x7b\xb3\xf3\xf5\x1f\xae\xf2\xc5\x64\x75\x24\xa8\x38\x6c\x8a\xa7\x23\xe2\x82\x38\xb8\x06\x5c\x3e\xad\x11\x7e\xc6\xc7\x91\xee\x50\x18\xd2\x20\xc0\x65\xf0\x6c\x50\xec\x6e\xec\x96\xc7\xa7\x62\xc4\x6d\xfe\x43\x8d\xc5\xb3\x85\x88\x0b\xe2\xe0\x1a\x98\x8a\xd6\x60\x93\x56\xd4\x42\xad\xd0\xd8\x48\x25\xbf\x1c\x25\xc3\x2d\xd2\xc8\x90\xf3\x09\xcd\x46\x9a\x2a\x08\xb5\xf4\x7e\x97\x2e\x42\x03\x20\x0e\xca\x03\xce\x00\x73\xc6\x81\x1a\x27\xfd\xf3\x84\xa3\x8e\xd7\x3c\x7a\xbe\xd5\xa4\x2b\x2b\xec\x67\x4b\xa5\xd8\xdc\x88\x83\x2c\x33\xb5\xa0\x66\xfc\xcc\xad\xbf\xcd\x59\x75\xc3\x40\x61\xd1\x08\x49\x5d\x93\xfc\x4f\x9b\xda\x04\xc5\x2b\x16\xe9\xec\x4d\x89\x7e\x0b\x63\x5b\x2a\x5f\x7c\x5c\x1c\x33\xff\x36\x21\x37\xf5\xbe\x26\x55\x47\x10\x88\x7e\x88\x13\xe0\x8e\x68\x91\xd9\xe3\x1f\x56\x5a\xd0\x3d\x91\x18\x3d\x56\xdd\x97\x7f\x92\x3e\xc7\xff\x5f\x33\x67\xa0\xa5\xfd\xdd\x73\x86\x64\xce\x4a\x9a\x45\xef\x51\x2b\x18\x52\x77\xeb\xfe\xaa\xb4\x1b\xc6\xf1\x72\xbf\x8b\x4f\xbe\xbb\xcf\xed\xfa\xe3\xb9\x08\xed\x79\xa2\xd2\x33\xb9\x82\xab\x05\xd9\x9c\x75\x28\xc7\x8d\x1e\x92\xcd\x0b\x1a\xa3\x7a\xd3\x9f\x04\xc6\xb3\x70\x6c\xfb\x10\x0d\x0e\x8c\x4e\xe4\x08\x5b\xf0\xc4\xbc\x60\x3f\x83\x76\xa8\x70\x49\x71\x64\x73\x66\x61\x45\x88\x17\x37\x7d\x1e\xbb\xbd\x91\x80\xc2\xf7\xf7\xe5\x09\xa7\xbc\xdb\xd7\x2f\xfa\x36\x36\x3b\x06\x60\xdc\xee\x79\x9b\x33\x7c\x26\xab\x45\x36\x67\x5f\x8b\x7b\xaf\x27\x84\x84\x8a\x92\x2b\xb3\x5d\x23\x12\x66\xd6\x22\xd5\x2f\x96\x55\xa8\xd8\xb4\x5c\xf6\xd1\xd7\x58\xf3\xeb\x91\x38\x93\xd5\x22\x9b\xb3\x13\xe6\x30\xf7\x40\x4b\x5b\x97\xaa\xf7\xf9\x0a\x43\x46\xf3\x7f\xf8\xd5\x37\x25\xdc\x9e\x2a\x2d\xd6\x99\xb3\x2e\x8a\xb3\x9e\x3b\x83\xa9\x2b\x3a\xff\x6f\x22\x3a\x2d\x1b\xbb\xef\x1f\x88\x93\x27\xee\xe7\xd9\x92\x3b\x4b\xf4\x24\x3f\xfa\x30\x23\x59\xd9\x30\x19\x58\xf0\xb9\x26\xda\x57\xa6\x2a\xf2\x0e\x94\x35\x41\x1c\xd2\xad\x93\xe6\x17\x5c\xd3\x6c\xbc\x3c\x26\x64\xe4\x53\xdd\x05\x63\xa2\x48\xd5\xc5\xa5\xbd\x7f\x3d\xb1\xfd\x63\x2c\x9f\x68\x78\x93\x4d\x11\x11\x17\xc4\xc1\xb3\x71\xc7\x35\x09\x6b\x7a\x37\xa9\x92\x2f\xbd\x46\xe7\x3f\xd5\x3a\xcb\x3a\x3f\xc8\xf5\x46\xcb\x5e\x30\x18\xa2\x58\x69\x6d\xbd\xc3\x14\x88\x88\x0b\xe2\xe0\xd9\x98\x51\x75\xbb\xa2\xae\xf5\x31\xfa\x1d\x4b\xa6\x07\x3f\x65\x30\x9a\xdd\x76\x72\x1d\x77\x03\x35\x5e\xe7\x9c\x58\xec\x7f\xeb\x27\x7a\x8c\x88\x0b\xe2\xe0\xff\x5e\xea\xfd\x66\x21\x32\x23\x03\x74\xde\x67\x07\xc2\x39\x34\x64\xf7\x79\xb7\x05\xaf\xa4\x2c\x38\x68\x37\xb6\x3b\xb5\xb6\x63\x0a\x51\x23\xcc\x19\x88\x83\x7a\xce\xfe\x6d\xce\x40\x0f\xf4\x69\x12\x98\x1c\xf2\x0d\x6c\x5a\x4d\x8b\x78\xbd\x13\xf6\xb8\x4d\xc6\x31\x29\x32\xad\x65\xef\xcf\x86\x28\xf9\x87\x70\x0e\x2b\x2c\x51\x7a\x4d\xe8\xd8\x11\x80\x43\x3a\xd6\xe8\x5e\x25\x1c\xdd\xfb\x48\x56\xf9\x5e\x47\x6f\xc4\xf6\x8a\x41\x29\x85\xd3\x18\xf9\xcc\xc1\x6e\x6d\xfa\x60\x81\x80\x65\x0d\x74\xec\x08\xc4\xc1\x7f\xd2\xae\x87\x23\x4e\x5d\x7c\x11\x46\xc9\xd7\x0c\x89\x88\x2f\x7c\xc4\xb8\x15\xdc\x3a\x79\x49\x7a\xaf\xdf\xe5\x64\xf3\xfb\x91\xd2\xfd\x19\x44\x5c\x10\x07\x97\xc0\xe3\x39\xf6\x02\x57\x92\xf9\x60\x16\xab\x97\xe2\x5b\xdd\x6a\xbf\xc3\x75\xab\xb2\x82\x95\xa7\xb3\x78\xaf\xf5\xd5\x14\x4d\x29\x42\xbd\x77\x20\x0e\xa9\x2f\xe2\xcd\xe8\x86\xaa\x88\x00\x61\xba\xa7\x71\x82\xab\xdb\x22\x63\xc4\x5d\x0c\x07\x9d\x7e\x36\x14\xb4\xd4\xee\x0e\x37\xd2\xfc\x11\xa8\xe7\x0c\xc0\x41\xbd\x26\x00\x73\x06\xca\xae\xa7\x69\x60\x65\xda\xe0\xdb\x5e\x0b\x79\xed\xd3\x3e\x6f\xca\x97\xaa\x06\x2c\xa8\xaf\x92\xc9\x86\x16\xf9\x78\x8b\xa2\x48\x96\x83\x9f\x11\x42\xa7\x7a\x41\x1c\xd2\x5d\xf4\x7a\x75\xca\xb1\x34\x75\x8f\xed\xc7\x85\x4d\x34\x2f\xcd\xa6\xf4\xea\x77\x56\xff\x64\x23\x8e\x8d\x27\xb9\x1a\xe4\x1a\xf0\xba\x19\x9a\x02\x09\xe0\xe0\xbf\xe9\x57\x49\x34\x37\xe3\x16\x91\xb7\x55\x7b\x34\x5b\x03\x36\x86\x56\x17\x93\x5e\x78\x2f\xfa\xd8\x88\xf6\x8d\xeb\xd5\xd5\xea\x6f\x2f\x23\xe2\x82\x38\xb8\x06\x42\x7f\x0c\x1d\xd0\x9f\x3f\x0e\xc1\xb1\x63\xf3\xb1\x49\xcf\xe1\xbe\x60\x45\x44\x49\xc2\x46\x2d\xf1\xbd\x21\xd8\x87\x89\xe0\x31\x74\xac\x0b\xc4\xc1\xff\xbd\x19\x27\xf7\x42\x19\x05\x5e\xcc\xb9\x05\xe5\x24\x11\xb1\xda\xd9\xde\x26\x62\x6f\x17\xef\xbd\x5a\x35\x15\x87\xc7\x76\x5d\x9c\xa8\x02\xa1\x01\x10\x07\xf5\x9a\x00\xcc\x19\x68\xab\x3b\x4d\x03\xf1\xdf\xc9\x7f\x27\x55\x3d\xb5\xd0\xf4\x2a\xd8\xc1\xbc\x79\x6d\x78\x2d\xe3\x0e\xc5\xaf\x3d\x3f\xcd\x25\x56\x09\x9a\xe9\x13\x3f\xdf\xff\x3b\x86\xfc\x6f\x0e\xe9\x23\xcd\x1c\xd6\x5b\x4b\x41\x4a\x8c\x87\x0d\x73\x8f\x30\xbf\x86\x7e\x94\x22\x8d\xb1\x9c\x57\xc0\xf1\x11\x1c\xc6\x37\xe0\x9b\xf6\xbe\x0c\x7d\xa4\x01\x70\xf0\xdf\xb4\xaa\x4a\xcd\xde\xe0\xe9\xc3\x7d\x97\xf3\x2b\x25\x5c\x01\xef\xff\xbc\xbe\x70\x0f\xe3\xb0\x22\xb7\xc7\x97\xed\xf9\xca\x41\x33\xba\x10\x22\x2e\x88\x83\x6b\xa0\xbd\x46\xa6\xbd\xc3\x5b\xe8\x4d\xdb\xbb\x38\x6d\xde\xa0\x12\x3c\x57\x43\x4e\x7d\xaf\x62\x9d\xb9\xa1\xf6\x6f\xfd\x59\x31\xdb\x56\x88\xb8\x20\x0e\xfe\xef\x3d\x72\xe8\xe6\x09\x0a\xbc\x3d\xff\xa8\x8b\xb3\x80\xf5\xee\xd3\x42\xa2\x59\xab\xf4\x52\xdf\xa1\x59\x69\x06\xc9\x55\xda\xc6\xfb\xd0\x3d\x67\x20\x0e\xca\x03\x00\x73\x06\x7a\xef\x38\x4d\x03\x4b\x8d\xb4\x27\xcc\x6f\xbc\x83\x07\x36\x55\xb7\xdc\x9e\x97\x0c\xa7\x38\x71\x62\xd9\x0b\x37\xe7\x8a\xcb\xd9\xc8\x1e\x4d\xbd\x85\xb6\x57\x10\x07\xd7\xc0\xdd\xa0\xd6\x51\x2b\x0f\xb5\xf6\xdb\x47\x37\x29\x2e\xdd\x9c\xa3\xaa\x90\x4c\x7e\x5a\x79\x35\xdc\x69\xe1\x86\xec\x53\x0e\xb6\xcc\x7e\x44\x5c\x10\x07\xff\x4d\x2b\x6e\x0d\xa5\x35\xdf\xbb\x8e\xbd\xf8\x66\xe3\x9b\xbf\xd2\xf3\x9e\xaa\xca\x15\x93\xbb\xe5\x3d\x3b\x2e\xa4\x0f\x7f\x9b\x06\x6d\x42\xe6\x0c\xc4\xc1\x35\x40\xdd\x3e\x71\xcf\xf5\x73\xd6\xc0\x07\xff\x16\x3b\x53\xea\x5f\xcf\xab\xf5\x9e\xec\xbb\x74\xa9\xfc\x5e\x7f\x36\xe8\x7c\x22\xbe\x06\x7d\xac\x02\x71\x48\xdf\x96\x85\x8e\x1c\x30\x92\x4a\xe2\xe8\x55\x75\x12\x9a\xcd\x59\x94\x70\x82\x02\x53\x5f\xe7\xed\xd0\x04\xbc\x7f\xe3\xc3\x2c\xa1\x76\x15\x3a\xde\x0c\xe0\xa0\x3c\x00\x32\x67\x57\x2c\xfb\x6d\x12\xb1\x77\x92\x0f\xd2\x9f\x7d\xa2\x7b\x6e\x6c\x7e\xee\xa6\xb6\xaf\xf5\xc2\x83\x6f\xae\xb1\xba\xfd\x4f\x8f\x3c\xe2\xfe\x36\x67\xd4\x1e\x6f\xef\x08\x5f\x6b\x5d\x27\xc3\x77\x10\x8b\xfa\xfc\xaa\x1a\x65\xd0\xb0\x79\x8e\xf5\xe5\x1c\x8a\xba\x24\xfe\xbe\x1d\xf9\xdf\xc7\x1a\x25\xf6\xdf\xac\x4c\xa3\xc5\x99\xa0\x7a\xf7\xf7\x3d\x16\xd3\x66\xf4\xb8\x57\xbe\x20\xda\x74\x29\xc2\x7a\x2e\xf0\x7c\xec\xe0\xfe\xa7\xff\x9a\x39\x03\x2d\xed\xef\x9e\x33\x24\x73\x16\x8f\x6d\xde\xd2\x88\x59\xb9\xd8\x60\x98\xe7\x41\xf4\xf2\xf0\xc6\xfa\x5c\x6b\xdf\x50\x94\x40\xbe\x99\xdf\x6e\x84\x4a\x13\x13\xda\x99\x14\x75\xb8\x91\x7c\xc3\x97\xba\xc7\x42\x81\x6a\xf1\xce\xc3\x74\xae\x32\xa6\xe2\x81\x9d\xa5\xb2\x35\x21\x6e\x01\xf4\xb8\x5f\xaa\xe7\x77\x65\xfd\x1a\x2e\x9e\x49\x09\x0b\xd9\x9c\x69\xa0\x4d\x8a\x8a\x53\xac\x5a\xa4\x0e\x2f\x45\xe5\x3d\x6a\xb9\x92\xf1\xda\xa6\xde\x5b\xf9\xa8\x9f\xe1\x56\x2c\x9a\x5e\x9b\xd0\xf8\x99\xac\x56\x07\xe9\xcf\x36\x50\x58\x70\x5d\xe5\x99\x3b\xd2\xad\xd5\x60\x95\xfb\x8a\x2f\x83\xce\x46\xfb\x61\x86\xa7\xa7\xf9\xcf\x21\xde\xbc\xa5\xde\xf6\x99\x78\x42\x1f\x64\x73\x36\x51\x10\x41\x46\x74\x19\x27\x57\xe4\xa5\xe4\xcc\x85\x97\x7c\x33\xdb\x59\x0a\x11\xa4\xb5\x93\x7e\x7d\x23\x06\xdc\x17\x44\xfd\xfe\x9c\x99\x39\x03\x89\xe8\xb4\x6c\x3c\x62\xb4\x96\x46\x2a\x76\x62\xc6\xff\x64\x88\xad\x35\x64\x4c\x69\x48\xa0\x3a\xbf\xd2\xf7\x36\xcf\x52\xdd\x1a\x26\x65\xdf\x93\x48\xe8\xec\x19\x80\x83\x67\x63\x5c\x95\x7a\x01\x22\x19\x62\x16\x9d\xb7\xcc\x31\xc3\xbe\x8c\xf8\xe7\x13\xba\x1e\xd6\xb0\x0c\xa8\xab\xaa\x1f\x62\xd4\xd2\x5e\x82\x46\xd3\x83\x38\x78\x47\x6d\x90\x17\x03\x53\x5a\x4e\x28\xf9\x3d\x1a\xc2\xf9\x8f\x84\x77\xf6\xe3\x7c\x02\x74\xef\x0c\xb1\x63\x61\x53\x75\x9e\xd7\xbb\x3d\x92\x80\x88\x0b\xe2\xe0\x17\x90\xd0\x75\x62\xf5\x4b\x99\x5e\x2d\xdc\x8e\x7f\xb4\x42\xfa\xd1\xb7\xa0\xf2\x51\xa6\x2b\xd9\xb9\xb4\xc5\x4f\x96\x01\x6c\x87\xac\xba\xf1\x88\xb8\x20\xce\x5f\x82\xfa\x7f\xe2\xca\x05\x7f\xd6\x36\xe0\xe9\xd7\xcc\xfc\x45\xfe\xac\x34\x89\x2c\x5b\xb7\xec\xf5\x44\x0e\x31\xb7\x14\xf5\x87\x5b\x05\xa8\x98\x66\xd9\x08\x73\x06\xe2\x10\x95\x33\x9f\x7f\x9b\x33\xd0\x03\x7d\x9a\x04\x7a\x72\x5e\xda\x4c\x9e\xcc\xd0\x17\xc9\xee\xa7\x7c\x16\xa1\x0d\x7e\x62\x62\xa4\xe5\xa8\xc3\xab\x38\x14\xcf\xc9\x26\x18\xb5\x61\x03\x9d\x40\x05\x70\x70\x09\x34\xf9\xa6\xe2\x13\x3f\x36\x40\x13\x4c\xbb\xe0\x95\xc6\xbd\xba\x52\x52\xf8\x92\x73\xf1\xc2\x9f\xc6\xef\x96\x59\xb3\x77\xda\xad\x0a\x11\x71\x41\x1c\x5c\x02\x82\x85\xe4\x97\x7e\x92\x0d\xce\x62\x52\xa3\xe8\x75\xec\x75\xf4\x35\x77\x35\xd1\x2a\xdb\x49\x61\xde\xab\xcf\xdb\x4f\x37\x47\x81\x5e\xa0\x41\x1c\x5c\x02\x72\x6c\x0b\xaf\x1f\x1f\xe2\xbc\xba\xaa\x61\x79\xfd\xfd\xe2\xab\xf0\xec\x5f\x1f\xe4\x31\x65\xb4\x84\x7a\xad\x9e\xbe\x20\xd5\x66\xe9\x45\xc4\x05\x71\x70\x09\xdc\xf4\xaf\x59\xae\xf6\x19\x78\x56\x9e\x2f\x92\x27\x10\xb4\x2a\x8d\x1b\x99\x4f\x10\xbb\xfc\xa6\x2c\x2e\x97\xf8\xc6\x57\xd4\x23\x1a\xc4\x86\x0c\xe2\xa0\xaf\xa5\xdc\xff\x7e\x29\x03\x65\xd7\x53\x8f\xb4\x85\xd8\xd6\xba\x49\x72\x79\xe1\x17\xed\x2b\xc8\x7c\x8b\x2f\x60\x18\x32\x88\x15\x63\x37\x47\x2f\xc9\xdd\xfb\x11\x98\x1a\xf4\x02\x3a\xd2\x06\xe0\xe0\x1a\x48\x49\x48\x37\x36\x6e\xa4\xb6\x9d\xc2\x1d\x3f\xd1\xe3\x4f\x9c\xec\x41\x3f\xe4\x21\x17\xa2\xcd\x12\x12\x14\x55\x0b\x9c\x26\xf3\x84\xe6\xf7\x00\x38\xb8\x06\x24\x22\x14\x3f\x10\x72\xbc\x53\x64\x56\x0e\xf4\x65\x2e\x22\x09\x54\x10\x7c\xb2\x78\x8c\x43\x54\xd3\x55\xdc\xe6\x6b\x46\x3e\xae\x82\x88\x0b\xe2\xe0\x1a\xf0\xff\x32\xa7\x90\x52\x5b\xa2\x94\xd9\xa0\x66\x6f\x6c\x98\x54\x37\x90\xb0\xa0\x47\x1f\xfb\xc3\xe9\xdd\xa8\x4c\xcb\xcf\x6f\x23\x1c\x88\xb8\x20\x0e\xae\x81\x37\xa6\x52\x4c\x12\x6e\x35\xd5\xc4\xce\xab\x17\x5a\x9d\xe4\xf6\x32\x72\xef\x74\x57\xdd\x4f\x5f\x35\xe8\x48\xaa\x63\x4f\xfe\x02\x69\x00\xc4\x41\x55\x13\x80\x39\x03\x6d\x75\xa7\x69\x60\x2b\xe4\x5e\x57\xca\x9d\x3d\x13\x0c\x3b\xc5\x34\xaa\x61\x52\x16\xf4\x36\x96\x62\x32\xdb\x6b\xe8\xa5\x4f\x73\x45\x85\x48\xe9\x4d\x11\x6b\x07\x71\x48\xd3\x1a\xdb\x1b\xde\xd4\xbc\x8a\xf7\xe1\xe7\x1d\x9d\xb9\xa5\x62\x19\x67\x94\xb8\xbd\xf1\x69\xbd\x2c\x5c\xe8\x40\x12\x3f\x69\x54\xe2\x39\x34\xad\x11\xc0\xc1\x35\x80\x62\x7e\xc2\xf7\x90\x27\xe5\xf9\xf6\x3e\x3b\xf7\x23\x4f\x5f\xdd\x79\xd4\xba\xd6\xe9\xa6\x03\xf1\x82\xb1\xef\x61\x0a\x4a\xbe\x76\x88\xb8\x20\x0e\xae\x01\xd3\x87\x83\xf1\xdf\x5d\xfc\x27\xb6\xe5\xa4\x7c\xfc\x2b\xa7\x71\xdb\x74\x64\x7d\xf6\x25\x5b\xae\x4c\xac\xcb\x53\x16\x92\x51\x43\x27\xfd\x41\x1c\x5c\x03\xd8\x8d\xea\x41\x39\xdf\x05\xd9\x9b\x3e\x9f\xd8\xff\x6e\x61\x32\xdc\xb2\x6c\x31\xc4\xc5\xc2\xb9\x4c\xec\x44\xdf\x98\xa9\x59\xf4\x1e\xa1\x01\x10\x07\xe5\x01\x9d\x7f\x6b\x00\xf4\xde\x71\xea\xf1\xe6\x34\x6f\xe1\xb1\x67\xa1\x6f\x1e\x7c\x37\x79\xcc\xb0\x67\x1b\x5f\x7d\x51\xe8\xbc\x7a\x17\xdb\xb3\x4f\x84\x3c\x73\xa5\xc7\xae\x7a\xd0\xf1\x66\x00\x07\xd7\xc0\x57\x21\x43\x4f\x83\x6f\x58\xba\xed\xd6\xfd\x0d\xef\xe2\x5f\x25\xea\x68\x86\xe8\xfe\xac\x66\x26\x7c\xec\xa0\xff\x8d\xfa\x78\x38\x08\xfa\x98\x02\xe0\xe0\x1a\x68\x96\xfd\x78\xef\xed\x17\x4c\x2b\x5f\x0f\x46\x86\x14\x81\x26\x99\x23\xb3\x30\x9f\x96\x74\x9e\xad\x3a\x02\xcf\xbe\xa1\x6b\xdc\x17\xa1\x3e\x49\x00\x07\xd7\x40\x34\xe5\x10\x76\xd8\xd2\x17\x6b\x51\x9a\x73\xda\xe4\x07\x34\xca\x2b\xaa\x8e\x8d\xc5\x38\x9c\xea\x69\x7a\x7f\xa8\xf4\xaf\xf0\x41\xaf\x03\x20\x0e\xae\x81\x0a\x66\x49\xec\xd4\xae\x69\xb9\xde\x85\x4f\x75\x94\xe6\x3f\x22\x0a\xaf\x0c\x5d\x49\xa6\x8c\x8b\xe2\xbf\xce\x34\xff\x75\xde\x0b\xfa\x50\x07\xe2\xa0\x3c\x00\x32\x67\x4a\x33\xc1\x2d\x78\x0a\x6b\x9f\xae\x70\x6c\xb6\xa4\x97\xdd\x08\x3e\x2f\xa1\xe0\x26\x25\x22\x75\x79\x51\xdc\x3b\x27\xab\xd3\x6c\xe7\x6f\x73\xf6\x9c\xe1\x69\xfe\x6b\xc1\x03\x3e\xbd\xbb\xb8\x23\xe7\x4c\x58\x1e\x9e\xbc\xeb\x56\xde\xa5\xc6\xdf\x2f\xa2\xfc\xda\xfb\x43\xc7\x15\xf7\x2f\x54\x56\x44\x6e\xff\x49\x64\x40\xa8\xd7\xa4\x94\xc3\xea\xf6\xec\xc7\x2b\xb4\xef\x7b\x62\x30\xe8\x6d\xed\x78\x4b\x25\x1e\x90\xf2\x64\xfc\xd7\xcc\x19\x68\x69\x7f\xf7\x9c\x21\x99\xb3\x18\xc9\x5b\x9b\x35\x25\xc9\x07\x92\xd3\x75\x5c\xfa\x95\x3c\xef\x5a\xc6\x53\xa4\xc5\x5f\x1f\x8d\x8b\xe5\x0b\xbe\x49\xce\xdd\x6b\x3c\x93\xa2\x0e\xb2\x39\xf3\x88\x51\x09\x98\x0a\xd1\xec\x90\xb2\x22\xc8\x52\xfc\x50\xba\x7e\x4b\xd1\x11\xeb\x01\x3e\x8d\x39\x57\x40\xbb\x09\x7a\x1c\xae\xe0\x99\x94\xb0\x90\xcd\x99\x81\x43\x67\x16\xa6\x6b\x4f\xb5\x19\x3b\x43\xdb\x52\x43\xe3\xef\x99\x9b\x1b\xe3\x68\xcd\x2b\xb3\x4e\xbb\x1e\x69\x11\x4d\x39\x13\x67\xb2\x5a\x64\x73\x66\x73\x87\xec\x8b\x76\xa4\x13\x2d\x17\x7f\x2c\xf3\x98\x85\x2f\x43\xbc\x74\x83\xa2\x86\x1d\x55\x11\xe5\xe4\x5e\xc6\x0d\x93\x17\xb4\x67\xb2\x5a\x64\x73\xe6\x47\xb0\x4e\x51\x78\xcd\x37\xc9\x10\xb3\xec\xad\x94\x54\x8a\x23\xa1\x60\x97\x85\xac\x6d\x5e\xa8\xfe\x47\x53\x9d\xfa\x9b\x29\x04\x67\x66\xce\x40\x22\x3a\x2d\x1b\x5b\xb8\x3d\x3f\x31\xc4\xfb\x60\x41\xc1\x92\xf6\x90\xbf\x7a\x03\x93\xf1\xc6\xc8\xbb\xe8\x99\xe3\x9e\xa9\xd8\x40\x2a\x4e\xe1\x3b\x65\x88\x2c\x04\xe2\x90\x2e\x36\xc1\xf5\x55\x21\xfc\x9c\x2d\xf0\x98\x9d\xf8\x02\xe1\x2c\x6e\xc2\xeb\xe0\xc9\x84\x41\x5f\xa2\xe5\x8e\x8e\xf2\xdf\x52\xbc\x84\x8b\xd0\xf1\x43\x00\x07\xcf\xc6\x02\xd2\x92\xcd\x7a\x0c\x07\x31\xf6\x65\x96\x66\x58\x8d\xfb\x4b\x8d\xcf\x7f\x78\x63\x19\xd1\xe5\xd0\x26\xfd\xfc\x23\x3a\x16\x20\x09\x4d\x55\x04\x70\xf0\x6c\xac\xb3\x3d\x1f\xfe\xe3\x19\x2a\x0b\xa3\xc7\xed\x98\x8f\xd1\x62\x79\xcf\x23\x63\x04\x75\x59\x54\x3e\x29\xea\xd8\x96\x58\x29\xef\x41\x65\x13\x10\xe7\x2f\x81\x82\xf6\x77\xdc\x67\x45\x6e\xdc\xef\xd5\x59\xd1\x29\x70\x2a\x6f\x6a\xb0\xca\x75\xbc\x7c\x65\xf9\x6a\xf5\xfe\x16\x9d\x2d\x6e\x28\xfd\x85\x2d\xb1\x0f\x08\x73\x06\xe2\x10\x95\xb3\x96\x7f\x9b\x33\xd0\x03\x7d\x9a\x04\x3a\x1a\xdf\xc7\x61\x8e\xea\x07\x59\xbc\xc2\xca\xa6\x1b\x7f\xa5\x97\x1a\xc4\xc1\x92\x31\xef\x11\xa1\x45\xd7\x7b\xfd\x53\x61\x21\xd4\x17\x04\xe2\xe0\x12\x70\x30\xb3\x25\x6c\xee\xbd\x9c\x36\xcb\x62\x5d\x7b\x34\x9c\xa7\xb8\xd4\xdb\x69\xf1\x22\xf3\x29\x8d\x90\x3d\xeb\x2b\x4a\xbe\x71\xa8\x18\x09\xe2\xe0\x12\x28\x95\xcb\x93\x5a\x37\xf4\x50\x64\x89\x77\x51\xc3\xf8\x5a\x24\x63\x9a\x1a\xf4\x36\x64\x3b\xd7\x27\xef\x69\xe4\xf2\x55\x3e\x09\xa8\x1a\x03\xe2\xe0\x12\x38\x4c\x6a\x9e\xae\x0e\x2a\x2e\x0c\x41\x8b\x98\xb0\xc4\x9e\xfc\x9a\xd8\xfa\xa4\x40\xfc\x41\xd2\x22\x5e\xb3\x49\x9f\x7f\xd2\x6b\x68\xfa\x1b\x88\x83\x4b\x60\x9e\x22\x2e\x5c\x80\xc9\x42\xe0\x43\x27\xde\x78\xf7\x84\x9e\x64\x72\x75\x88\xf4\x4f\x12\x5a\x59\xda\x44\xa2\x50\x5e\xd5\xa3\x04\xc4\x86\x0c\xe2\xa0\xaf\xa5\x00\x73\x06\xca\xae\xa7\x69\xa0\xa0\x7f\x9d\xfd\xb7\x78\x20\x9b\x66\x76\x8d\xc3\x9e\x5e\xfc\xe6\x4f\x34\xde\xf7\x4f\x44\xae\x06\xdf\xfb\xbc\xfe\xb0\xed\x35\x19\x74\x9c\x0f\xc4\x21\xdd\x73\x86\x77\xec\x1d\x4a\xf6\x5d\xd9\x13\x65\xf8\xf7\x0d\xde\xed\x57\xf5\x3f\x72\x30\x57\x84\xad\xdb\x13\xfa\xe6\x30\xaa\xd8\x22\x06\x11\x71\x41\x1c\x5c\x03\x01\xd3\xf1\xf3\x23\xd3\xa8\x81\xf2\xdf\x35\x49\x3a\x7a\x9b\x4d\x4b\x27\xf4\x3b\x3a\xcf\x7f\xa4\x76\x5d\x23\x3a\xaf\x46\xc3\x0a\x55\x7b\x41\x1c\x5c\x03\x96\x1c\x89\xc2\x25\x29\x5f\xe9\x9d\x68\x65\x28\x04\x4a\xb5\x2e\xd7\xe9\xcf\x29\x73\x5e\x22\xa1\x25\x7b\x74\x35\xf0\x97\xd4\x02\x64\xd0\x41\x1c\x5c\x03\xca\x79\xb7\xdb\x4b\x9c\xf3\xc7\x87\x88\xbe\x50\xe4\x77\xa7\x3e\xac\xe9\x2b\xcd\x9b\xf0\xce\xec\x14\xbb\xce\x39\xde\xfc\x2c\x92\x1a\xa1\x01\x10\x07\x55\x4d\x00\xe6\x0c\xb4\xd5\x9d\xa6\x01\x75\xcb\x17\xd2\x41\xcb\xad\x4f\xe8\xcd\xf9\x48\xae\xf5\xa2\x2e\x3f\x24\xee\x7e\x58\xcd\x19\xa2\xb5\x17\xe7\xa6\xee\xee\x4f\x05\x0d\x06\x02\x71\x70\x0d\xe4\xb9\xd9\x9e\x17\x2e\xcb\x1a\xce\x73\x2e\x0c\x63\xfa\x18\x25\xba\xf5\xdb\x21\xcb\x27\x90\x47\x95\x0c\xb5\x4f\x3d\x6b\xd6\xea\x37\x34\x09\x14\xc0\xc1\x35\x40\xf8\x48\xb2\xc5\xff\x5e\x88\x6c\xc1\x71\xb1\x99\xc5\x22\x0a\x3f\xa7\xc8\x8e\x5e\x65\x01\xbb\x02\xf6\xe1\x95\x29\xe3\x4b\x99\xd0\xe0\x5e\x10\x07\xd7\xc0\x9b\x83\xab\xcf\xe7\x0e\x75\xe2\x4b\x53\x5b\x70\x5c\xef\x9b\x34\x33\x04\x7f\x88\xb2\x67\xc7\xab\x1c\xa0\x79\xbf\x53\xf9\x76\x96\x0e\x11\x17\xc4\xc1\x35\xe0\x81\x45\x52\x91\x57\x73\xdd\x27\xd8\x34\x2c\x94\xb9\x39\x19\x07\xc3\xdd\xd9\x72\x75\x91\x49\x67\x3e\x31\xf9\x20\xe3\x9d\xb7\x12\x42\x03\x20\x0e\xca\x03\x00\x73\x06\x7a\xef\x38\x4d\x03\x2a\x5c\x4a\xcc\x1f\x79\xc4\x71\x99\xfb\xce\xcf\x98\xda\xdd\xa4\x26\x72\xf9\xc1\x39\x93\x23\xe0\xc0\x98\xf4\x88\xe5\xe7\xba\x1e\x09\x62\xed\x20\x0e\xae\x81\xe1\x8e\xe4\x3f\x7b\xae\xe4\x2c\x1b\x1b\x99\x17\xcf\x31\x25\x26\xf1\x25\x24\x75\x59\xae\x7a\xbd\x7e\x81\x99\xa6\x4f\xe0\x18\x78\x88\x88\x0b\xe2\xe0\x1a\x50\x64\x60\xb8\x1a\x44\x7e\x67\x47\x57\xd2\xf7\x53\xce\xe6\xb9\x59\x73\x6f\x3c\xf6\x37\x8a\xa9\xc5\x89\x93\x9d\xfd\xb5\x5f\x88\x9f\x22\xe2\x82\x38\xb8\x06\xba\x8a\xb2\xcd\xe7\x56\xad\x17\xfb\x0e\x8a\xc6\x6e\xd2\x99\x36\xa9\xd0\xdc\x12\xac\x8d\xba\x3d\x2c\x36\x12\x28\xc8\xf5\xe4\x52\x0a\x74\x3a\x03\xc0\xc1\x35\x60\xc9\x41\x22\xd7\xc2\x66\x39\xfd\xfe\xc3\xe0\x46\x4a\x51\x2c\x89\x16\xce\xa0\x66\x3d\x9e\x55\x7c\xc0\xa3\xd5\x8a\xd2\x67\xbd\x85\x08\x0d\x80\x38\x28\x0f\x80\xcc\x99\x43\xbc\x37\x83\x91\x9e\x7b\x3e\xd7\x9d\xfb\xfc\x8f\x6e\xb2\xdf\xfb\x75\x2e\x5a\xcb\x12\x13\x97\xbd\x26\x66\x99\x51\xbc\xec\x0a\xd5\xdf\xe6\xac\xe5\x41\xea\x5c\xf9\xac\xbe\x5d\x81\x22\x43\x1f\xfd\xb7\x12\x59\xbd\x93\x6a\x61\x12\xf4\xdd\x01\xbd\xcf\xee\x82\x22\x8e\x87\xd3\x7f\xa1\xaf\x25\xcd\x46\x9b\x05\x7f\xd9\x58\x85\xc6\x92\x62\x4c\xcb\xa4\xd6\x17\x61\x65\xf1\x5a\x64\xa3\xca\xab\x4e\x2d\x58\x06\x7d\x7b\xf2\x5f\x33\x67\xa0\xa5\xfd\xdd\x73\x26\x07\x7f\x81\xc7\x67\x32\xad\x10\x44\x9d\xac\x0a\x7e\xd5\xad\xc1\xf7\x36\xd7\xdd\x28\x52\xd1\x22\x2c\xab\x28\xf5\x69\x56\x40\x82\x04\x35\x4d\xed\x99\x14\x75\x90\xcd\x99\x5a\xdb\x03\xe5\x16\xf6\x6f\xe7\x9f\xd8\xdc\xe2\x48\x70\x63\xde\xd5\xec\x95\x8b\x77\x45\x3d\xba\xc0\xef\x56\x97\x51\xfd\xe0\xe5\x99\x78\x42\x14\x15\xe4\x63\x8d\xcd\x32\xd5\x6a\x63\x8f\xbf\xcb\x1a\x71\xcd\x11\xb2\xf8\x97\x2d\xb4\xbb\xb6\x18\xe2\x1f\x8b\xde\x37\x1d\x4b\xbb\xb3\xa6\xf3\xeb\x4c\x56\x8b\x6c\xce\x24\x6e\x0b\x9e\xbc\x28\x7e\x12\x7a\x53\xa2\xfe\x56\xbb\x37\xbe\xb6\xc6\x7d\x87\x1d\x9c\x45\x7c\xd1\x60\xbb\x27\xa3\x4f\x24\xbe\xeb\x9e\xc9\x6a\x5d\x90\xfe\xec\xb8\x65\xa2\x06\x6e\x67\x9c\xc1\x25\x89\x9f\xb7\xe2\x75\xe3\x96\x0b\x52\x0a\xcf\xed\x3a\x6e\x0e\x6a\x96\x2c\x24\xee\x77\xa4\xfa\x9f\x99\x39\x03\x89\xe8\xb4\x6c\xbc\x7b\xff\x42\x95\x55\x2e\x9a\x7f\xf9\xac\x83\xb9\xa6\x69\xf2\x35\xb6\xe9\x1d\xd1\x52\x56\x21\x82\xca\x84\xad\x2c\xa2\x2f\x69\xd0\xed\xb3\x20\x0e\x9e\x8d\x8f\xd4\x84\x9b\x3e\xcb\x6e\xbe\x7b\xaa\x66\x84\xe1\xbd\x9a\xa8\xb0\x5a\x99\x95\x12\x3d\x3a\x53\xb5\xbd\xe7\x69\xcd\xbb\xeb\x1a\x86\x88\x0b\xe2\xe0\xd9\x38\xed\x87\x37\x0b\xd5\x55\x92\x11\xc9\x93\x30\x94\x69\x2f\xcf\xc0\x7a\x0e\xcc\x5d\x97\x70\x76\xdf\xc7\xac\x0c\xb7\xed\x1e\x45\x40\x8d\x4c\x20\x0e\x9e\x8d\x23\x9d\x8d\x50\x5f\xb1\x58\xc7\xe6\x24\x33\x75\x18\x98\xfe\xf0\x35\xbd\xfc\xfd\xd5\x67\x9e\xc9\xf1\xad\x0c\xc9\xe1\x10\xac\xfd\x6b\x88\xb8\x20\xce\x5f\x02\x85\xfa\xef\xb8\xb9\xbd\x6c\x2f\x92\x1d\xd7\xaf\x86\xd6\xb2\x79\x0a\x8a\x5c\xbe\xd6\x1e\x20\xd5\xe3\x89\x7d\x6e\x73\x34\xed\xea\x3d\x6a\x35\x75\x4e\x84\x39\x03\x71\x88\x69\x8d\xff\x7f\xea\xf8\xc7\x86\x0c\x7a\xa0\x4f\xfd\x5a\xfa\xd3\xf4\xd1\x98\xf6\xd4\xed\x7c\x6c\x3d\xd1\x37\xdd\x98\x1b\xa2\x85\xd8\xbe\xd9\x26\xd7\x1e\xa2\x3e\x8c\x5a\xa0\x67\xa0\x85\x7a\x42\x40\x1c\x5c\x02\xeb\x8d\x13\xbc\x4f\x68\x55\xc3\x37\x8d\x77\xcb\x0d\x9e\xd6\x3e\xf5\x78\xa9\x26\x50\xea\x59\xbf\xb3\x6f\xdd\xf8\x9e\x3b\xa0\xb6\x12\x11\x17\xc4\xc1\x25\x20\xf5\xc3\x5f\xa3\x8d\x80\x24\x50\xbf\xf6\x88\xa6\x63\xae\xd5\x6e\x5c\xfb\x1c\x7f\x1a\x0e\x5a\xe0\xec\xeb\x01\xbb\x6f\x41\x68\xcf\x10\x71\x41\x1c\x5c\x02\x2e\x15\x0c\xfc\x1c\x77\x97\x84\x7c\x9e\x5d\x10\x40\xfd\x13\xc5\xd0\x68\xe5\x9d\x54\x70\xf2\xb2\xef\x90\x88\x79\x67\xfe\x8d\xe9\x6d\xa8\xcf\x00\xc0\xc1\x25\xa0\x76\x73\x72\x0b\x4b\x58\x0f\xcf\xc8\x72\x97\x63\xda\xfe\xd2\xb9\x7b\x99\xa4\x49\xd6\x11\xcf\xe2\x9f\x97\x88\xb4\xcb\xaa\xa8\xca\x20\x36\x64\x10\x07\x4d\xe8\x02\x98\x33\x50\x76\x3d\xf5\x58\x63\xc1\xce\x0f\x97\xbe\x9a\x86\x5f\x82\xd3\xa1\xf4\x09\x3f\xb6\x62\x1e\xfb\x39\xd0\x57\x79\xa2\x68\x49\x64\x9c\x5f\xf7\x7e\xa1\x0a\x1d\x6b\x04\x70\x70\x0d\x74\xfa\xaa\xd1\x1f\xcc\x5e\x7d\xf5\xbb\xfb\x66\xc9\x1b\x0b\x77\x56\x83\xb6\x2c\x07\x0d\x69\x8d\x6b\x8c\xfa\xe9\x11\x31\x65\x5c\x50\x75\x03\xc4\xc1\x35\x90\x65\x21\xa9\xa5\x25\x8f\xf7\xd8\x03\xef\x56\xd4\x86\x58\x6c\xf9\x44\xe6\xdd\x37\xc7\xcf\xf6\x59\xae\x76\x1b\x7e\xd8\x99\xa3\xd3\x42\xc4\x05\x71\x70\x0d\xd0\xdf\xa7\x93\x54\x5b\x38\xc1\xd2\xa1\xa6\x90\x66\x59\xb3\x61\x2d\xc8\xd7\x1e\xe8\x9e\x97\xba\x8e\xd6\x3e\xe8\x88\x13\x78\xfb\x3a\x22\x2e\x88\x83\x6b\x40\x35\xa5\xe8\x05\xcb\xc8\x01\xae\x56\x7d\x67\xf9\xda\x98\xea\xcd\xeb\x53\x3b\xcc\x5f\x04\xb8\xf3\x79\x6c\xfc\x4a\x94\x12\xbc\xa0\x9e\x33\x10\x07\x4d\xea\x53\xf9\xb7\x06\x40\x5b\xdd\x69\x1a\x38\xe1\xec\xf0\x89\xc5\x63\xdd\xfa\xd9\xed\x94\x9d\x4d\x78\xd1\x54\x7e\xf7\xc6\x9f\x83\x0b\x76\xbe\x98\xcf\x36\x1f\xe5\xed\x18\x42\x57\x49\x80\x38\xa4\x8f\x34\xa3\x6e\xd6\xbc\x26\xae\xad\x2f\xa5\x3c\x03\x1e\x4b\xca\x5c\x8c\xef\xed\x44\x55\xeb\xab\xf2\x9c\xf5\xdf\x77\x5f\x4c\xe2\x1a\x87\x3e\xd2\x00\x38\xb8\x06\xbe\x52\xd6\xf4\x9c\x7b\xad\x4e\xb9\x32\xfe\x30\xcd\x68\x37\xb4\x8a\xb7\x18\x2b\xd4\xd9\xc5\xbe\x59\xcf\xc7\xf3\x62\x5b\xe0\x10\x34\xc8\x08\xc4\xc1\x35\x80\x76\xaf\xe2\xcd\xef\x8e\x86\x23\xf3\xef\xaa\xf4\xbd\x3d\x4a\x6b\x3e\x8b\xbf\xa7\x32\x3e\x3c\xdd\x53\xee\x92\xac\x2b\xf0\x09\xb9\x8b\x88\x0b\xe2\xe0\x1a\x50\x4e\x15\xe9\x73\x23\x33\xd3\xbe\x6d\x75\x43\xec\x9d\xe1\x1c\x19\xaa\xc3\x4a\xdc\x1d\x34\x1a\x8c\x17\xbe\x77\x13\x43\xb8\x25\xda\x21\x83\x0e\xe0\xa0\x3c\x00\x30\x67\xa0\xf7\x8e\xd3\x34\x10\xa2\x6b\x68\x35\x5e\x78\x43\x82\x63\x6d\x35\x12\xef\x65\x15\x7f\xa9\x90\x96\x8d\x54\x93\xdc\xf2\xeb\x2a\x3f\x73\x7a\xe3\x11\xa8\x22\x0d\xe2\xe0\x1a\xe0\xf6\x57\x69\xbc\x56\xe9\x18\xd3\xbd\xad\xfc\x59\xef\xe4\xe1\x35\x22\xb1\xc4\xa1\x7e\x47\xf1\x6e\x22\xef\x70\xd9\x00\xac\x4e\xa8\x97\x0d\xc4\xc1\x35\xf0\xd4\x4f\x36\xb3\x90\x5b\x4d\x3f\xce\x6d\xd8\xf3\xba\xb6\xf2\xb3\xc2\xf5\xe0\x11\xbc\xe3\xad\x11\xdd\x4d\x8b\x12\x82\x31\x2e\x68\xee\x18\x88\x83\x6b\x20\xe0\xe7\x27\x1a\x02\x93\x14\x82\x76\x96\xb2\x6c\xab\x27\x2e\x9d\x31\x35\xfc\x6c\x35\x13\x25\x8f\x3b\x2e\x70\x46\xbd\x50\x96\x85\xae\x7f\x05\x71\x70\x0d\x58\x8e\x94\x9a\xbe\xbf\x96\xa0\x96\xea\xba\x6f\x4a\xec\xe9\x6f\xbf\xf5\xc5\xc3\xee\x01\xaf\xd9\x8c\x94\x85\xaf\x7e\xb5\xf3\xe8\x12\x64\xce\x00\x1c\x94\x07\x5c\x00\xe6\xac\xaa\xe4\x97\x97\x2c\xa1\xd9\xd5\xb4\x30\xf3\x3b\x7c\x16\x5f\xf5\x37\xbc\x16\xb2\x19\x39\x82\x87\xd6\xd7\xa5\xd4\x14\xc4\x8c\xdc\xfe\x36\x67\x0a\x15\x07\xe9\x81\xbf\x8b\x16\x23\x69\xde\x58\x6d\x1c\x73\x62\xbc\xf7\xf8\xc9\xa2\xb7\xb6\xb0\x7c\xdd\xe2\x07\x3d\x1e\x91\xe9\xe4\xdf\x5a\xce\x58\x4f\xe1\x7d\x92\x88\x5b\xd7\xb3\xba\x2f\xfa\x8d\xb9\x7d\xfc\x40\x97\xd6\xc0\x93\xae\x07\x8f\xb2\x20\x8d\xac\x08\x77\xfb\xbf\x66\xce\x40\x4b\xfb\xbb\xe7\x0c\xc9\x9c\x09\x2a\xdb\xd8\xce\x7b\xd8\x8c\x17\x0c\x7a\xf5\xdc\x09\xd6\x5e\xc5\xad\xe9\x71\x5e\xe2\x46\xd5\x1c\x7e\xd5\xd8\x49\xf5\xab\x73\xed\x4c\x8a\x3a\xc8\xe6\xac\xe4\x9b\x76\xa1\x1c\x7d\x25\xe7\xd6\xf9\x7c\x95\xf9\x8a\xde\xb7\x0c\xde\xf6\x3e\xa8\x84\x5a\x5d\xe7\xd3\xc3\x4b\x37\xc2\xf0\x0c\xce\xa4\x84\x85\x6c\xce\x18\x65\x66\xf2\xd6\x5e\x6c\xcd\x4f\xad\x0a\x12\x5f\x7b\xc5\xfe\xde\x56\x39\xac\xbf\xb9\x74\xd5\xc0\xc0\x72\xd1\x40\x40\xb3\x22\xf0\x4c\x56\x8b\x6c\xce\x3e\x4e\xa6\x7c\x0b\xa1\xcd\x2b\xff\xff\x98\xfb\xcb\xb0\x28\xb7\xfe\xfd\x1f\x67\x86\x90\x94\x46\x86\x12\x50\xa4\x1b\xe9\xee\x6e\x90\x10\xa5\x5b\x04\xe9\x10\x18\x40\x40\x40\x09\xe9\x14\x01\x01\xe9\x92\x6e\x04\x44\x90\x50\x69\x69\x50\x40\x90\x92\x54\xf8\x1f\xfe\x7f\x1f\xe6\xeb\x0c\xce\x7d\xdd\x0f\x7c\x70\xef\x47\x7b\xef\xe3\x3c\x5e\x33\x6b\x71\xce\xfb\x5a\xe7\xb5\x2a\x65\x6b\x69\xca\x5a\x3c\x25\xf3\xb6\x34\x4d\xa5\xa9\xe0\xbe\x9d\xe9\x08\x73\x2c\x0d\xea\xa4\xfb\x3f\x69\xed\xc5\x70\x26\xba\x9f\x74\xfc\xd8\x2b\xca\x13\xf7\xc6\x27\x70\x26\x67\xfc\xd0\xd6\x7d\x8b\x27\xa9\x92\xd1\xd3\x78\x44\xb8\xb5\xb5\xcb\xee\x63\xff\x2c\x9c\x01\x99\xe8\x6f\xd5\xd8\x4a\xd3\xd6\x6d\x26\x54\xde\x09\x6a\xf1\xbd\x53\xc9\xe3\xb5\x92\xff\x8b\x6f\xd5\x49\x94\x21\xb8\x57\x06\x19\xea\xd7\x9b\x09\x61\x0b\xf7\x81\x74\x88\xd5\xd8\x00\x94\x70\x5f\x5d\x29\x88\xb8\x5f\xda\x9a\xff\x9a\xca\x38\x89\x37\x9f\x3f\x77\x4e\xc5\xec\x93\xdd\x39\x55\x4a\xe5\x36\xcc\x1c\xd8\xee\x72\x00\x1d\x62\x35\xd6\x5d\xba\xa9\x84\x3f\x22\x20\xaf\xfc\xf1\x60\xe4\x39\x4d\x13\xa6\xba\x5d\x56\x00\xa6\xf8\xa3\x14\xa9\x29\xaf\xd0\x77\x1d\xa7\xb0\x03\x41\x80\x74\x17\xce\x12\x6f\xe1\x4e\xde\x61\x50\x5c\xcd\x32\x4b\xd5\xa2\x76\xbd\x9c\xb9\x1e\x49\x7c\x23\xf6\xca\xcf\xd9\x6a\x4b\xe3\xeb\xd9\x92\x29\xb0\x73\xa4\x81\x74\x88\x5c\xba\x33\xd3\x91\x90\x5a\xd5\x85\x34\xd7\x79\x5e\x74\x3a\xd2\x3b\x24\xc2\xa9\x1f\x1f\x86\x31\xee\xed\x75\x3e\x2d\xa0\xba\xd5\x81\x72\x1e\xce\x80\x74\xe7\xa7\x35\x4a\xfe\xe7\x70\x06\xf4\x83\xfe\x9b\x05\xea\x16\x23\xab\x96\xd8\x2b\xb9\xba\x2c\xab\x86\x92\xb6\xf7\x2a\x3f\x10\xf7\xd0\x83\xc3\xc3\x40\x6f\xf7\x2a\x06\x2c\x6e\x89\x45\x9f\x37\x1d\x48\x87\x68\x01\x94\xe0\x9d\x9d\xfb\x49\xad\xe9\x65\x96\x65\x11\xa3\x0f\xe2\x12\x3f\x7a\xe7\x96\xb1\x4f\x5a\x3d\x3a\xa0\x9b\x6b\xf2\xef\xa6\xac\x83\x2d\x3b\x02\xd0\x21\x5a\x80\x7e\xf7\x97\xd0\xc6\x7b\x09\xb4\x4b\x6c\x4c\xed\xb7\x94\x7c\xf5\x28\x3e\xfc\x2a\x82\xd2\xe2\xb5\x7d\xba\x83\x61\x9f\x62\xa4\x0a\x1b\x98\x03\xe9\x2e\x5c\xf9\xe7\x3a\x49\x46\xed\xfc\x84\x1d\x43\x92\xa0\xed\x0d\x2e\xaf\x32\x39\x59\x1c\x27\xdf\x52\xd9\xb7\xe7\x7b\x24\xfd\xeb\x57\x6f\xc1\x96\x33\x01\xe9\x10\xb9\x4c\x73\x1a\x07\xf7\x92\xb8\x78\x39\x65\x0e\x6a\x07\xb6\x1a\xee\xdd\xeb\x0d\xe1\x1e\x7f\x27\xda\x2c\x58\x4c\x96\xf4\x5a\x70\x06\x36\x6b\x02\xa4\x83\x9d\xd0\x05\x10\xce\x80\xaa\xeb\xdf\x3c\xb0\x87\x12\xda\xae\x12\x54\x8b\xb6\x68\x5e\x58\x2f\x2d\x92\x2f\x01\xad\x42\xdf\x1a\xdb\x5e\xda\xc8\x18\x7f\xb3\x26\xa7\xb7\x98\x74\xde\x76\x20\xdd\x85\xc3\x20\x02\x16\xc8\x2b\xb8\x70\x0c\x96\x9e\x53\x84\xa2\xe5\xf2\x5b\xec\xa9\x5e\xa6\x65\x2b\xb0\x16\xa3\x86\x7e\x9d\x12\x24\xa4\x83\x2d\x97\x04\xd2\x5d\x98\x3d\x7d\x4a\x63\x11\x1f\x3f\x94\x3e\x19\x68\x4a\x18\x6a\x3d\x70\xe9\xf8\x58\xe2\xa8\x6f\xfe\x58\xd1\xfb\x57\xe5\x69\x64\x1c\x1d\x33\x6c\xf6\x14\x40\x87\xd8\x0f\x8e\x5f\xeb\xef\x75\x26\x68\x11\xe3\x16\xb2\xe2\x11\x56\x9a\x89\x5e\xee\xad\xbb\x51\x9a\xc7\x25\x9e\xb4\xac\x2b\xc3\xa9\xff\x04\x76\xec\x3b\x90\x0e\x91\x7b\x9d\xb8\xc8\x14\x67\xac\xc5\xf8\xad\x26\xcd\x0b\xb2\x63\x17\x31\x03\x31\x02\xbe\xe3\xa8\x1f\x79\xca\x74\x81\x4b\x59\xa2\x81\x8e\xe7\x1e\x00\xd2\xc1\x4e\xea\x03\x08\x67\x40\x8f\xba\xbf\x79\xe0\xe7\x90\xbf\x8c\x7d\xff\x8e\x63\x8c\xff\xc4\x58\xd5\xb5\x2b\xee\x01\x90\xba\x0c\xae\x77\x22\xec\x4a\x16\x1c\xa9\x79\x21\x01\xb0\x5b\x4a\x80\x74\x88\x1e\xa8\x56\x25\xd1\x27\xba\xbe\xf4\x64\x4a\x88\xe3\x38\x2b\xe1\x4d\x54\xe2\x2f\xb2\xcb\x37\x6f\x5a\xee\xf4\x31\x42\xb3\x07\xa7\xc0\xad\xe7\x5c\x20\x1d\xa2\x07\xd6\xc6\xac\x65\xdf\x61\x91\x3f\x4a\xaf\xd4\x62\xa2\x2d\xc9\x0e\x8c\x06\x95\xcb\xa2\x8a\xdb\xf7\x96\x43\x5e\x68\xdc\x2a\x35\x82\x1d\x0a\x03\xa4\x43\xec\x07\x5e\x94\x88\xfb\x27\x32\xee\x8b\x7d\x27\x0e\x22\xf7\x65\xa7\x45\x34\xe6\x3f\x53\x28\x96\xd3\x6a\x5d\x3f\xab\x96\xbc\x7d\xd2\xf6\xfa\x9c\x0b\xa4\x43\xe4\xde\x78\x57\x92\x78\x9c\xa7\xd5\x63\xc6\x55\x78\xc5\xc9\xd4\x63\x7b\x65\x2d\x06\x14\x97\x5e\xc3\xb3\xb0\xbc\xa6\x15\xfc\x7c\xb1\xf0\xdc\x03\x40\x3a\x58\x1d\x00\x08\x67\x40\xe3\x8e\xbf\x79\xa0\xfb\x73\xdc\xf8\x42\x59\xdf\xdd\xb8\xea\x6f\x33\xbb\x94\x4f\xbf\xad\x3f\x18\xd2\xef\xa2\x55\x91\x98\xe9\x1f\xe4\x51\x21\xc0\x83\x1d\xb6\x04\xa4\xbb\xb0\xac\xb1\x56\x9c\x96\xba\x93\x6f\x2a\xc2\x1b\x57\x11\xd7\xce\xf4\xe6\x9e\x53\x4f\xd1\x95\x5a\x1c\xab\xa1\xf6\xc8\x5f\x4f\xbb\x72\x61\xc3\x01\x20\x1d\xa2\x07\xe8\x94\x57\xc2\x67\x4c\xac\x5a\x82\x48\x1a\x54\xf5\x18\x4a\x05\x29\x38\x3c\x20\x5d\x06\x96\x82\x0f\x1e\xbd\xb3\x30\x2e\xbe\x45\x73\xce\x05\xd2\x21\xf6\x43\xb9\x11\x1e\xd6\x72\x85\xdd\xa5\xf2\x4d\xc9\xe8\x2e\x03\x17\xd7\x4a\x5c\x9c\x1f\xea\xc6\x96\xeb\x4e\x12\x39\xd8\xe9\xd8\xa6\xbf\xce\xb9\x40\xba\x0b\xfb\xbb\x85\xad\x22\xef\x1b\x67\xf5\xb3\x75\xb6\x87\xa9\x2d\xfa\x3a\x9e\x35\x55\x91\x74\xe2\xea\x1b\x6c\x64\x5b\x42\x2a\xe6\x52\x8c\xce\x3d\x00\xa4\x83\xd5\x01\xa0\x70\x26\x33\xb7\x5e\x5b\xe4\x21\x5b\x57\xcc\x28\xcb\xfe\x45\xde\xf8\x7d\x30\x05\xe1\xbe\xd9\xf5\xc4\xa5\xe7\x5a\xe4\x1a\xaf\xd3\x5e\xae\xfc\x19\xce\x24\x88\x63\xc4\x35\xd1\x7a\x85\x94\x7e\xde\x8a\x29\xae\x72\xa5\x5b\x60\xc8\xbe\xda\xf1\xfe\x25\x53\x8e\x33\x95\xeb\x38\xb9\x70\xd5\x1f\xd2\x51\x1a\xa2\xe9\x2f\x16\xad\xdc\x05\x41\x07\x8a\x22\x38\x3d\x57\x74\xd8\x2f\xef\x66\x6f\xb3\xce\x25\x2d\xcd\x2b\x52\x5f\x2e\x14\xfe\x5f\x0b\x67\x40\x4d\xfb\x73\xcf\xd9\x85\x70\x76\xc8\x28\x6f\x7e\x97\xfc\xd3\x16\xcf\x61\xfa\xb0\x98\x71\xac\x96\xc2\xd8\x8c\x34\x83\xbc\x1e\x3a\x15\x5a\x3e\xff\xf7\x03\x06\x83\x7f\x32\xa9\x73\xf3\x42\x6e\xb0\x24\xea\x9d\xdd\xfc\x96\xaa\x64\xea\x62\xea\x57\x10\x9c\xdd\x10\xe1\x03\x86\x0e\x57\x3d\x27\xfd\xc5\xf6\x7e\x66\xcf\x95\x2f\xe3\x9f\x4c\x61\x5d\x0c\x67\x09\x8f\x0b\xca\x51\xfd\x37\x66\x9b\x6f\x64\xb0\x4c\x72\xcb\x3b\xe7\x4b\xdf\x1c\x60\x4c\x8f\xbb\xda\x69\x1b\xf2\xfe\xad\x9d\xe7\xcc\x3f\x69\xed\xed\x0b\x1f\x2b\x5f\x15\xb8\xaf\x18\x1c\x6b\xf2\xd2\x59\x4e\xcf\x75\xee\xc8\x35\x85\x60\xde\x30\xf9\x93\x6e\x7a\xee\x5b\xfa\x1f\x7a\xc2\xe6\x45\xff\xa4\xb5\x17\xc3\x99\xdf\x90\xa0\x30\xa7\x91\xb1\x52\x76\x79\x7f\x15\x8b\x76\x8e\xc1\xb0\xf5\x55\xea\x5d\x54\xa7\xef\x99\xd7\x0f\x08\x14\x64\x24\xf7\xff\x59\x38\x03\x32\xd1\xdf\xaa\xb1\x7f\xf5\x03\x17\xa1\x9c\x69\x9d\xc7\x2e\x6b\x24\x8f\x5e\x71\xa5\xd9\xe7\xee\x54\x7a\x3e\xd2\xe8\xee\xe2\x64\x17\xd8\xe9\x3c\x15\x3d\xaf\x42\x40\x3a\xc4\x6a\x1c\xfc\xe6\x89\x2d\x47\xc4\x72\xfd\xd9\x33\xb6\xb7\x49\x1f\x52\x1a\xa8\x70\xe4\xb6\x55\x64\x8e\x67\x70\xae\xcd\x3e\xb7\x3d\xf4\x8a\x84\x6d\xde\x00\xd0\x21\x56\xe3\xf0\xe6\x0e\xda\x9a\x27\xd3\x9c\x65\xc9\x78\xaa\x15\x4f\xdb\xfb\x03\x6b\x1d\xf4\x7a\xc7\x4a\x86\x74\xc3\x22\xac\x9c\xa3\x0d\x61\x67\xf2\x02\xe9\x10\xfb\x81\x13\xb7\xae\xaf\xb1\x22\xf2\x4b\xf6\x87\x25\x5e\x6d\x52\xce\x5a\x9f\x4a\x45\xde\xeb\xc7\x78\x03\x79\x1f\x72\xd8\x6f\xa6\xe7\xc1\xee\x7b\x03\xd2\x05\x4b\x13\xc0\x87\xd4\x66\x5f\x71\x91\xf4\x40\x86\x4a\x26\x43\x87\x2b\x4b\x53\xfb\xf6\xf3\x04\x6f\x6b\xbc\x63\x2e\xa3\x8f\x7c\x9f\x08\xa7\xe9\xf4\x3c\x0f\x67\x40\x3a\xd8\x9e\xb3\xff\x1c\xce\x80\x7e\xd0\x7f\xb3\x00\xaf\x40\x8f\x63\x8e\x55\xda\x38\x06\x7e\x23\xa7\xec\xf1\x97\x13\x2e\x37\x62\x51\x3a\x59\xe3\xd3\xc4\x9f\xd4\xaf\x7c\xaa\x04\x60\x33\x46\x40\x3a\x44\x0b\x84\x11\x84\xb5\x36\xd6\x85\x84\xaa\x35\xdd\x96\xb5\x24\xd9\xa9\x96\x37\xc5\x8c\xcf\x3b\x2a\xa7\x39\x13\xe2\x2b\xda\x58\xf5\x84\x2d\x93\x02\xd2\x21\x5a\x20\x87\x63\x05\xa2\x25\x73\x69\xe4\xce\x2b\x1a\x3b\x21\xc6\xa7\x1c\x2a\x8a\x01\x43\x28\x56\x5e\x28\x2c\x24\x6f\xe9\x08\x66\x33\x60\x4b\x6f\x80\x74\x88\xfd\x10\xa0\x3e\x67\xd3\xab\x7d\x9d\xc1\xe2\xfe\x42\xa3\x83\x53\x7d\xfa\x7b\x4b\x93\xb9\x5e\x51\xc3\x74\x43\xb4\x18\x09\x11\x26\x21\xf0\x39\x17\x48\x87\x68\x01\x90\xbc\x98\x17\xa7\xaf\x30\x39\x2a\x6d\xa9\x3e\xb8\x34\x97\x19\x2f\x41\x62\x79\x7b\xd3\x5e\xe7\x52\x8c\x53\x6f\x89\x22\x21\xec\x12\x6a\x20\x1d\x6c\xaf\xc9\xcd\xff\x3c\x28\x03\xaa\xae\x7f\xf3\x80\x75\x11\x38\x8f\xd2\xd0\xb4\x5f\x5f\xa0\x52\x5a\x48\x55\xa2\xd5\x68\x29\x18\xbc\xca\xff\xaa\x52\xd6\xc4\x9a\x32\xad\xaf\x06\xb6\xef\x10\x48\x87\xe8\x81\x1f\xb7\x48\x87\x29\x50\x95\x16\x1e\x78\x3c\xdd\x8f\xc5\x41\x17\x60\xc7\x4d\xf9\xf4\x46\x33\x28\x43\x55\xa6\xa6\x4d\x3a\xf6\x1b\x3b\x6c\x62\x1e\x40\x87\xe8\x81\x61\x5e\xea\x0e\xfe\xfc\xb5\xc3\xb6\xb4\xd8\xc0\x61\xc2\x6b\x7a\x4f\x46\x70\x68\x3c\xd0\x28\x97\x9e\xbc\x5d\xe5\xd8\xb3\x1e\x80\x1d\x79\x0f\xa4\x43\xec\x87\x60\x92\x86\x9e\xcc\x0f\xfe\xfd\x82\xfa\x7d\x51\xcf\x7f\x5e\x26\xea\x4d\x61\xd7\x3c\x5e\xb2\xb6\xf2\xf4\xc6\xcb\x3f\x69\x89\x84\x9d\x5c\x0a\xa4\x43\xf4\x80\x6f\x6d\x9d\x8d\x72\x85\xbb\xc4\x27\x7d\x49\x88\xde\x07\xde\x93\x4b\x7d\xe8\xe8\x74\x58\x99\xf7\x04\x83\xde\x91\x50\x70\x85\xc2\x66\xce\x80\x74\xb0\xbd\x26\x00\xe1\x0c\xe8\x51\xf7\x37\x0f\x84\x92\xc8\xf0\x76\x1a\x3e\x6d\x11\xa1\x23\xd0\xf6\x7a\xa3\xda\xac\x50\xff\x5c\xf4\xdb\x33\xbf\x9c\x11\xed\xb6\x32\xd6\x03\x30\x6c\x89\x18\x90\x0e\xd1\x03\x07\xaf\xd4\xbc\x9f\x55\x59\x4d\xad\x6c\xc7\x8f\x0e\x2a\x0d\xcb\x89\x5d\x27\x74\x89\xd2\xe3\x6d\x6e\xe5\xb9\x4e\x1a\xe8\xcf\x0c\x5b\x82\x0a\xa4\x43\xf4\xc0\x89\x6b\x11\x8a\xd5\x27\x7a\xd5\x71\xf4\x4f\x97\x1b\xf9\xaf\x79\xaa\x55\x7e\x0f\x53\xfb\x45\x78\x9b\xe0\x86\xf8\xca\x70\xc5\x6b\xd8\xf5\x0f\x40\x3a\xc4\x7e\x48\x5a\x3d\xbd\x13\x9a\x50\x94\xb7\x85\x1f\xa4\x70\xab\x5b\xf7\xac\x99\x23\x6e\xa4\x43\xbb\xf5\x36\xc5\x1d\xd5\xcc\x58\x1c\x3e\xd8\xac\x09\x90\x0e\xd1\x03\x28\x46\x93\x5d\xee\xdb\xb3\x58\x5b\x20\xe9\x70\xfd\xd1\xb9\x56\xd6\x25\xf4\x5b\xf3\xc2\x62\xda\x6e\x56\x7a\xdd\x25\xe6\x53\x05\xe7\x1e\x00\xd2\xc1\xea\xc0\xed\xff\xec\x01\xa0\x71\xc7\xdf\x3c\xa0\xbd\xfd\xd2\x8f\xbf\x6b\xd4\x59\x78\x4e\x32\xf0\xfb\xab\x9b\xb9\x29\xc2\xc3\xb8\x06\x7e\x09\x14\x6f\xf4\xe3\x38\x6a\xd6\x0a\x61\x27\x76\x02\xe9\x10\x3d\xc0\x6d\xaf\x4c\x51\x7a\xa4\x52\xe0\xb0\x66\xfb\xb2\x53\xf7\x2b\x2e\x58\x33\x83\xa5\x71\x8f\x6b\x43\xfe\x4d\x33\x26\x6e\xdd\x07\xce\x73\x2e\x90\xee\xc2\x0c\x7a\x26\xa5\x5a\x87\xf8\x6e\x80\xb2\x65\x90\x29\x88\x91\x52\x52\x26\xa4\x3f\xd8\xff\x6c\xa4\x22\x78\xf7\xa9\xcd\xde\xd9\x67\xd8\xa5\xf1\x40\x3a\xc4\x7e\x20\xbc\xf6\xe2\x5d\xac\xf6\x8b\xa8\xbe\x25\x31\x39\x74\x5d\xf4\x7d\xb5\x9e\x13\x9e\x81\xf8\x89\x70\x82\xab\x2c\xf6\xdc\xdb\x1d\x95\xe7\x5c\x20\x1d\xa2\x07\xb0\x3c\xf3\xd8\x3e\x2d\x88\x8e\xdf\x4a\xbf\x61\x8a\xa9\xa2\x1a\x35\x0a\x0d\xfa\x04\x1d\xbf\x87\x2f\xaa\x93\xd6\x2c\x2d\xcc\x67\x09\xdb\x77\x08\xa0\x83\xd5\x01\xa0\x70\x16\x6d\x50\x4e\x1d\xcc\xf8\xba\x28\x04\x84\x42\x16\xff\xea\x43\xcc\x6c\xd2\xa7\x4d\xf6\xe7\x42\x4e\x5f\x92\xe3\x6e\x33\x26\xe4\x53\xff\x19\xce\x9e\x88\x56\x55\x65\xc5\xf4\xdd\x0e\xbb\x77\x44\xe2\x27\xbc\xfd\xf8\x73\x1c\x9e\xe1\x7b\x13\xf3\x84\x91\x81\xda\xcb\x4c\x2e\x16\x2a\x7f\x48\xd5\x55\xf3\x86\xc6\x48\x99\x65\x19\x70\x6d\x31\xf0\x6e\x78\x36\xe0\x17\x11\xd6\xf4\xe5\x5f\x95\x61\x7b\x1a\x36\xa4\x57\x5e\xff\xfd\x7f\x2d\x9c\x01\x35\xed\xcf\x3d\x67\x17\xc2\x99\xcd\xfa\xad\xad\x74\xf3\xa7\x77\xc0\x5a\xbf\x96\xf2\x1f\xd4\xb0\x63\x96\x48\x82\xa6\x18\x77\x0e\xdd\xdd\x51\xde\xe1\x88\x56\x3a\xfd\x93\x49\x9d\x8b\xe1\x4c\xe3\x0a\x74\xec\x78\x60\x65\xf3\x94\xc2\xf8\x4d\xfa\x98\x64\x1a\xb4\xe1\xde\x5a\x4b\xe6\x69\xe6\x9e\xbe\xc6\xa7\x9c\xe2\x4b\xc9\xff\x64\x0a\xeb\x62\x38\x73\xa5\xd1\xcf\xd5\x17\xdc\xd7\xff\x18\xf1\xbc\x01\xab\xdc\xc0\xfa\xba\x76\xe1\x61\x5d\x87\x00\x25\x1e\x59\x66\x20\xde\x61\xc4\xfb\x7f\xd2\xda\x8b\xe1\xec\xa5\x29\xe1\xd2\xb8\x8e\x5a\x67\x8f\x3e\xd6\xe3\xa8\xc6\xee\x6a\x3e\x77\xce\x02\x88\x51\x26\x71\xd7\xeb\x37\x04\x35\xb2\xbd\xff\x64\x9e\xb0\xed\x62\x38\x6b\xd8\x05\xf5\x4a\xc5\x62\x04\xe1\xee\xc4\xd6\x1f\x36\x07\xdd\xc7\xf6\x97\x8a\x98\xc6\x4e\x28\x5e\xd2\x0c\x6b\x07\x75\x08\x5e\xfd\x67\xe1\x0c\xc8\x44\x7f\xab\xc6\x9e\xbc\x54\x58\xac\xf5\xfa\x4d\xc7\xa8\x4e\x47\xc2\x07\xf7\xb1\xa8\xeb\xf9\x9f\x2a\xbd\xaf\xfc\x26\xbe\x6f\x03\xf5\x37\x25\xff\x00\x5b\xcb\x05\xa0\x43\xac\xc6\xcb\x9e\x1c\x0a\x84\xdb\x47\x5c\x6f\xc7\xdf\xcb\x59\x73\x8c\xf8\x46\x3d\x8e\xb3\x6c\x16\xb9\x95\x73\x7b\x63\x86\x4c\x21\xfb\x0a\x6c\x1d\x03\x90\x0e\xb1\x1a\x37\x7e\xec\x78\xa9\xb1\x2f\xca\xc3\x1f\xd2\x3c\x5a\xb4\x54\x3c\x2b\xa4\x01\xcd\x59\x37\x6f\xa5\xd4\x61\xb9\x6f\xdc\xf9\x59\x09\xb6\x41\x0a\x48\x77\xe1\xa9\xa4\xbe\x2a\x40\x31\x6c\x84\x16\x3b\xf3\x7c\xfb\x75\xab\xc1\xf5\x3e\xbc\x3c\x91\xcb\x9e\xfd\x3a\xef\xfa\x93\x5b\x44\x63\x27\xee\xc2\x9e\x4a\x00\xba\x60\x69\x14\x10\x5c\x98\x7c\x9b\x22\x74\x49\xdd\xff\x78\x18\x47\x0d\x47\xef\x14\x8a\xae\x0d\x26\x9b\x1b\x08\xa6\xe4\xc1\x57\xae\xe6\xa8\x11\x22\x10\x38\x0f\x67\x40\x3a\xd8\x9e\xb3\xff\x1c\xce\x80\x7e\xd0\x7f\xb3\x40\xbd\x66\xec\x2e\x65\x19\x8e\x67\xe5\x87\xbc\xaf\x73\x32\x3d\xf3\xac\x9b\xfa\xdb\x1e\xf5\xe5\x8a\xac\x99\x25\x8b\x5e\x42\x54\x1e\xe7\x4d\x07\xd2\x21\x5a\xa0\xe4\x83\xe6\xc4\x46\x7f\x91\xf6\x38\x46\xb8\x6d\xca\xee\x4e\xba\x5c\x82\x89\x24\x58\xe1\xdb\xfe\x6c\x99\xeb\x70\xfa\xb3\x60\xd6\x73\x2e\x90\x0e\xd1\x02\xb7\x17\x78\xb0\x27\x25\xe5\xc2\x89\x64\xc1\xf4\xad\xa6\xed\xe5\x71\xf5\x63\x56\xd6\xae\x95\x50\x41\xc5\x24\x5d\xef\xc0\x17\xb0\x33\x61\x80\x74\x88\xfd\xf0\x62\xa1\x0f\x9c\xf3\x26\x12\xfb\xc7\x8c\xdb\x76\x32\xb5\x34\xde\xe8\x2c\x75\x29\x3a\xde\xf7\x15\x5f\x1c\x6c\x30\x66\x9a\x15\xec\x00\x13\x20\x1d\xa2\x05\xb2\x0b\x33\xae\x3a\x56\x67\xd4\xc4\x1c\x9a\xcd\x7d\x10\x51\xda\x35\x98\x0f\xa0\x09\xb6\x27\xc1\x14\x3e\x9d\x4d\x4a\x35\x33\x2b\x3b\x7f\x20\x03\xe9\x60\x7b\x4d\x00\xc2\x19\x50\x75\xfd\x9b\x07\x02\x31\x94\x6c\xef\xf1\xd5\x50\x94\xed\x9e\xda\x7c\x49\xdc\x23\x94\x5c\x44\xd1\xd8\x75\xf8\x6a\x8d\x36\xad\x60\x9b\x31\x88\x0f\x3b\x64\x05\x48\x87\xe8\x01\xea\xec\x16\x1b\x63\x89\xbc\xbb\xba\xac\xd9\xc5\x34\x89\x68\x98\x1e\xd9\x7d\x99\x77\x6a\x8f\xf7\xe6\x56\xbb\x9c\xd0\x71\x95\x03\xcf\xb9\x40\x3a\x44\x0f\x98\xd9\x6c\xe6\x68\xf9\xe1\xa0\x84\xe1\xb5\x4b\xe4\xa2\xf2\x0b\x98\x0e\x0c\xc6\x3c\x71\xde\x58\x1a\x32\x19\x64\xa7\xc3\x71\x83\x9d\x2c\x08\xa4\xbb\x30\x73\x16\xc9\xe4\xa9\xe6\x51\x31\xfc\x53\xac\x0e\xe3\x1b\xe7\x28\x0e\x8a\xfc\x93\x59\xd1\x02\x71\xc5\xd0\x00\x03\x8b\x82\x89\x64\xd8\xa5\xd9\x40\x3a\x44\x0f\x14\x5d\xd9\xde\x2d\x73\xb9\x91\x86\x15\xf1\xbe\x5f\xb9\xac\x8f\x2e\xb2\x80\x95\xdf\xbe\x81\xfb\xcd\x2b\x1b\xd3\x5d\x42\x47\x7b\x8b\x73\x0f\x00\xe9\x60\x7b\x4d\x00\xc2\x19\xd0\xa3\xee\x6f\x1e\x78\x70\x44\x7d\x25\xd7\x24\x72\x45\xc3\x04\xe5\xb3\x04\xb6\xaf\xcb\x22\xd6\x26\x25\x67\xe0\xad\xc7\x7c\x5a\x68\xd8\x44\xc3\x78\xb0\x01\x29\x90\x0e\xd1\x03\xd8\x4c\xa7\xbf\x04\xd7\x38\xf5\x13\xda\xfa\x88\x8b\x19\xb2\x02\x6b\x94\x8b\x9d\xb8\xa7\x99\x7e\xd4\x54\xb5\x88\x69\xf5\x25\xc1\xea\x0b\x90\x0e\xd1\x03\x13\xcf\xfc\xc5\x2e\x37\x90\x3a\xbc\x25\x67\x90\x5a\xeb\x54\x01\xb1\x04\x56\x67\x93\x89\xca\x7f\x59\xb6\xa3\xbf\x57\x45\x20\xd5\x7d\xce\x05\xd2\x5d\xb8\x8c\xdb\x4e\xec\xd9\x2a\xd6\xeb\x6a\x23\xb3\xe0\xc9\x15\xea\x27\x97\x04\x57\x7a\x63\xb1\x8f\x9b\x1a\x2c\x89\xd6\x74\x57\x20\xa3\x62\xb0\x43\x26\x00\x74\x88\x1e\x60\x36\x28\xc4\xc8\xb7\x15\x13\xbd\xdb\xd7\x15\x93\xef\x3a\x25\xf1\x75\x27\xe0\xe1\x37\x37\x3c\x46\x6f\x9a\x80\x4e\xe6\x17\x90\x43\xd8\xc1\x40\x00\x3a\x58\x1d\x00\x08\x67\x40\xe3\x8e\xbf\x1e\x0a\x83\x47\xd8\x57\xb3\x75\xb3\x86\xea\xd0\x1f\x7b\x19\x37\x03\x97\xdf\xf8\x15\x3e\xc6\x6d\x07\x29\xac\xed\xf0\xa1\x30\xa9\x43\xd8\xcb\x09\x20\x1d\xa2\x07\x4a\xb9\xab\xbf\x6f\x94\xae\x70\xf9\x53\x7b\xaf\xda\x68\xd0\x5b\xb0\x89\xda\xee\xf0\x58\x75\x69\x46\x47\x4e\x3e\xf7\xa9\x30\x85\xdd\xd8\x03\xa4\x43\xf4\xc0\xcd\xd4\x30\x8d\xd7\x98\xb2\xa0\xeb\x72\x98\xfd\x93\xca\x6b\x84\x14\xfc\xe0\x3e\x91\xfa\x34\x5e\x82\x77\x5d\xc2\xda\x2c\x56\xb0\x85\x3f\x40\x3a\xc4\x7e\xf8\xa6\xe8\x0d\xb2\xf1\xe9\xd1\xbf\x73\x2c\xa7\x31\x58\xfb\xfe\xf5\x1b\xb9\x0c\x94\x34\x7c\xce\xc0\xb8\x19\x45\x66\x21\xc9\x48\xf7\x73\x2e\x90\x0e\xd1\x03\xd4\x3b\xb8\xbd\x9c\x57\x73\x33\x69\x7b\x52\x74\x68\xaa\x7b\x34\x38\xe7\x8b\xf7\x97\x1c\xca\x83\xbb\xd1\x5c\xb7\x47\x37\x31\x60\x01\x1d\x48\x07\xab\x03\x40\xe1\xcc\xf0\x51\xc1\x6b\x52\x83\xc0\x5e\xe5\xd7\x15\xfd\x2f\x3a\x26\xb0\x34\x25\x82\xe2\xb7\x29\xb9\x25\x7d\x33\x8c\xdf\xd1\x1d\x10\x4b\xfd\x19\xce\x32\xb6\x3b\xa8\x4f\xee\x0e\x7b\xe3\xa9\x6c\x9d\x6a\xcb\xd8\x9d\x32\x18\xaa\xa1\xe3\x7b\xec\xc8\xbe\xa2\x7d\xe6\x57\x1a\xf5\x7e\xf8\xcf\x97\x6e\x07\xf7\xbc\xb7\xbe\x0a\x69\xb7\xe8\x29\xbf\xb8\x4c\xbe\x72\x3b\x04\x67\xb8\x52\x46\xe5\xae\xde\xe7\x5c\xf1\x33\x6c\x37\xe2\x67\xff\x6b\xe1\x0c\xa8\x69\x7f\xee\x39\x53\x46\x1c\xc0\x7f\x32\xb1\x28\x22\xdc\x6f\x90\xf8\xe2\x75\xc9\x81\x8d\x85\x14\x07\x9b\xdc\x14\xf4\xe8\x84\xf2\x0e\xeb\xd6\xd2\x68\x21\x01\x3f\xdb\x3f\x99\xd4\xb9\x18\xce\x50\x95\x13\x89\x31\x9e\xf5\xbd\xbf\xa2\x64\xcc\x52\x73\xd8\x36\x8d\x21\xe3\xd3\xee\xf7\x9d\x45\x55\xc5\x28\xa1\xc5\x72\x44\x66\xf5\x9f\x4c\x61\x69\x5d\xdc\x85\x75\xa7\x6d\xb3\x24\xd5\x57\xa0\xdb\xb9\xda\xe2\xab\x41\x99\x8a\x3d\xf9\x72\x37\xdf\x8f\x77\x94\x9c\x5e\x1a\x6f\x13\x64\xad\xd5\xff\x49\x6b\x2f\x86\xb3\x1b\x61\x8a\xeb\x28\x7e\xfa\xb2\x8f\x98\x5e\x82\x34\x78\x95\x6e\x25\x94\x28\xf7\x76\x32\x8a\x36\xde\x4f\xdf\x7e\x28\x71\xc4\xc7\xfd\x4f\x5a\xeb\x75\xf1\x12\x6a\xcb\x54\xf7\x13\x75\x9b\x5c\x29\xf5\x18\xdd\x21\xf4\xdd\x7a\xf4\xcc\x60\x42\xb0\x82\xb9\xa7\xb6\xdb\xc3\xc5\x9f\x91\x99\x0d\xff\x2c\x9c\x01\x99\xe8\x6f\xd5\x18\xed\x39\x86\x93\xdb\x7c\xf9\x38\x0e\x86\x36\xbd\x8e\x7f\x50\x81\x5a\xab\x91\x80\x0a\xbd\x1d\xc5\xc0\xcb\xa0\x16\x76\xcf\x4c\xd8\x4d\xc1\x40\x3a\xc4\x6a\x0c\xcd\x3c\x24\xd8\xd0\x38\xd2\x3b\x2d\x98\x79\x13\x3a\xac\x72\xba\x5f\x03\x09\x90\xda\x54\xaf\x4c\x5a\xb8\xe7\x38\xef\xe9\x3e\x74\xce\x05\xd2\x21\x56\xe3\x11\xbf\x67\x01\xfa\x9f\x13\x5c\x37\xa1\x27\xce\x49\x5e\x65\xcf\x07\x09\x8f\xae\xb7\x0e\x6d\xe7\x59\xde\xa0\x3d\xcc\x78\x81\xa9\x71\xce\x05\xd2\x21\xf6\xc3\xd2\xf5\xc3\x4f\xae\xb4\xbe\x4f\xbe\x5a\x77\x5e\xd9\xd1\xc0\xeb\xae\xd1\x1f\x8b\x9c\xe2\x24\xaf\x75\x42\x2b\x82\x58\xe2\xd6\x4e\x9f\x73\x81\x74\xc1\xd2\x28\x04\x70\x4f\x3b\x62\x83\x3b\x49\x15\x58\xdf\x29\x8c\xea\x28\x3d\x86\xbc\x95\x2c\xee\xcb\xce\x13\xcf\x8a\xad\x1a\x06\xbe\x45\xbd\xc6\xaf\x1a\x74\x1e\xce\x80\x74\xb0\x3d\x67\xca\xff\xf1\x81\x0c\xf4\x83\xfe\x9b\x05\xf2\xd6\xe4\xa2\x5a\x35\x99\x6c\x3c\x96\x8c\xbf\x8c\x95\xa3\x7e\x2e\xcc\xd5\x65\xf5\xbf\x69\x25\xac\x5f\xf4\x5a\xe6\x5e\xe6\x13\xd8\x00\x1a\x48\x87\x68\x81\x27\x03\xb8\xa6\x36\x4c\x2f\xd8\x7e\x0a\x67\x7f\x0f\x6b\xad\xdd\x3b\x3d\xc3\x5a\xff\xaa\x34\x85\xf3\xda\xe4\x08\xcb\xf2\xa9\xdc\x1e\x6c\x1b\x1f\x80\x0e\xd1\x02\xe2\x24\xa0\xf8\xae\x14\x8d\x91\x4b\x18\x8c\x83\x6f\x7a\x67\xdc\x62\xa4\xf7\x4a\x71\x3a\xbd\x27\x6a\xaf\x6d\x61\x96\x14\x33\xc0\x2e\xb5\x05\xd2\x21\xf6\x43\xc6\xdd\xcd\xd0\xe2\xb3\xb9\x09\x86\xa3\x85\x13\x19\x9a\xc0\x67\x2f\x23\x7b\x64\x1e\xa1\x4e\x38\x2d\x45\x63\x7a\xba\x8f\x68\xc2\x06\xa7\x40\x3a\x44\x0b\x38\xa9\x1f\xad\xb2\xdb\x30\x5c\x63\xf7\xa8\x1a\x17\x3a\x79\x38\xd7\xcb\xaa\xe1\xc1\x7d\xfd\x8a\xe8\xcc\x68\x00\x4f\x50\x3f\x31\xf6\xf9\x03\x19\x48\x07\xdb\x6b\x02\x10\xce\x80\xaa\xeb\x5f\x97\xb4\xb1\x86\x5f\xf9\x5e\x22\x7d\xef\x65\x3e\x55\x4d\xed\x9d\x21\x61\x52\x87\x0e\x0b\x48\xdc\xa4\x56\xcc\xaf\xef\x25\xe3\x15\xd3\x2b\xb0\x25\x6d\x00\x3a\x44\x0f\x50\xe4\xb9\x15\x85\xb3\xea\x76\xde\xd3\x7b\xdb\xfb\xee\xe8\x01\x13\x83\xf6\x65\x8e\x82\x6c\xe7\x13\xbc\xcb\x5f\xac\x32\x6f\xa7\xc0\x2e\x73\x05\xd2\x21\x7a\x80\xe6\x6a\x47\x22\xe5\x7b\x2d\xb5\xa7\x92\x9d\x3d\x1d\xd6\x94\x67\xf3\xfe\x3e\xd3\x14\x97\xbe\x7c\x09\xff\xd8\x1e\x8f\x5d\xb1\x0e\x9b\xed\x05\xd2\x21\xf6\x83\xe1\xd6\x75\xfe\xbb\x4a\x01\x2b\xbe\x55\xe6\xa3\xbe\xeb\x79\x2a\x7b\x11\x11\x0f\x68\x3f\xdd\xb7\xa2\xf5\xb1\x06\x7d\xb0\xda\xcd\x38\xe7\x02\xe9\x10\x3d\x10\x52\x34\x19\x47\x7e\x4d\x27\xdd\xef\x72\xc5\xd5\x35\xba\x38\xd7\x1d\x2a\xfe\x1f\x93\xf3\x1c\xcd\x57\xdf\xda\xe2\xdd\x14\x89\x7a\x7f\xee\x01\x20\x1d\x6c\xaf\x89\x16\xc0\xd2\x56\x80\x47\xdd\xdf\x3c\x70\xff\x51\x15\x9f\x23\x48\xab\xee\x98\x98\xf2\x6d\xe3\xce\x3a\x03\xb7\x7f\x88\xc9\xed\x62\x26\x2f\xbc\x38\xe2\x94\xf2\xc5\x48\x58\xdb\x81\x74\x88\x1e\xa0\xc4\x5c\xce\xe9\x09\x45\x6f\x17\xd6\x5e\x96\xc2\x33\x60\x60\x41\xdd\x7c\xfd\xc8\x3a\xa0\x61\xc6\xa0\xdf\xbd\x61\x4f\x7f\x0b\xe6\x01\x20\x1d\xa2\x07\xea\xfd\x35\x7e\xc9\x98\xef\xe0\xf7\x96\x8e\xb1\x52\xde\x7c\xa0\xb9\xf9\x05\x33\xe2\x94\x51\x90\xc1\xc6\x31\xb8\xcd\xf4\x3d\x2e\xec\xc0\x21\x20\x1d\x62\x3f\xa0\x0e\x0b\x91\xd1\x37\xfd\x68\x18\xff\x8a\xf7\x6c\xde\xab\x40\x03\xa7\x03\xf7\x3d\xe7\xc1\x72\x2a\xbe\x91\x27\xb6\xa1\x74\x10\xec\x91\x08\xa4\x43\xf4\x40\x22\x11\xf5\x41\x47\x7c\x7d\xe4\x11\x76\xf2\x6a\x56\xd9\x9b\xc4\x88\x76\xd6\xcb\xc9\x0a\x59\xa4\xc2\x24\x4f\x2d\x1d\xfd\xc3\xb2\xce\x3d\x00\xa4\x83\xd5\x01\x80\x70\x06\x34\xee\xf8\x9b\x07\x1a\xae\xf1\x75\x75\xe8\xbe\xe9\xb1\x59\x8d\xf4\x73\x1e\xcf\xa0\x6c\xb2\x73\xa9\xfd\xf2\xed\x95\x03\x8f\xc6\x66\xb4\x56\x6f\xcb\xed\xf3\xb6\x03\xe9\x10\x3d\x70\xea\xae\x5b\xfc\x5d\x65\xcb\xb8\x5e\xc1\xe7\x14\x62\xc8\xd0\x4a\xb8\x26\x8e\x7e\x38\xfb\xeb\xbd\x6d\x75\x1e\xe3\x6a\x4b\x2a\xec\xaa\x0e\x20\x1d\xa2\x07\xee\xc8\xf2\x5f\x27\x52\x09\xf8\xd4\x28\xdb\x74\xd4\x44\xd9\xbc\xbc\x8b\xfa\xf5\xa6\x1f\x1b\xde\x86\x1d\x17\x61\xd2\xb7\x4f\x3f\xfc\xcf\xb9\x40\x3a\xc4\x7e\xb8\x73\xd7\xca\xb0\x58\xce\x96\xbd\xe2\xc0\x84\xf1\x11\x41\xbf\x4e\x41\xb9\x71\x22\xd8\x66\xbd\xa8\x5d\x66\x4e\xd2\x2f\x2a\xbc\x04\xc6\x05\xd0\x21\x7a\x80\xed\x59\x5a\xc2\x1a\x0f\xee\x68\x5b\xbc\x59\xfc\x73\x69\x4f\xcd\x1f\xf2\x1c\x84\xe9\xc7\xcd\x15\xbd\x6e\xf9\xc9\xa6\xb4\x61\x33\xe7\x1e\x00\xd2\xc1\xea\x80\x17\x40\x38\x4b\x06\x95\xbf\x30\xdb\x6b\xbd\xfc\xcd\xa6\xb0\xa0\x16\xda\xc3\xf9\x50\xce\x82\xcc\x9c\x28\x3e\xa3\x6c\xdc\xc3\x54\x44\xad\xb5\xe5\xcf\x70\xd6\xc2\xf4\x78\x38\xe1\x07\xe3\x75\x2f\xdd\x55\xab\x8f\x50\xac\xc4\x17\xa2\x3b\x6b\x5e\xe8\x4e\x83\x3d\x4c\xbc\x45\x0d\xa6\xb9\x2b\x7f\x48\x5f\x65\x97\x52\xdb\xa6\x3f\xd1\x1b\x7c\x54\xec\x83\x95\x29\x47\x48\x19\xfd\x6e\x11\xff\x8b\xba\xfa\x94\x67\x51\x45\x49\xad\x15\xe4\x7f\x2d\x9c\x01\x35\xed\xcf\x3d\x67\x17\xc2\x59\x61\xc9\x2c\x6a\x8b\x7a\x7b\x87\x4e\x88\x42\x7a\x82\x70\x78\xec\xa5\x3b\x4b\xd7\xc8\xd5\x7c\x94\xb9\xcc\xd9\x9a\xbc\x8e\x3d\xd2\xff\xc9\xa4\xce\xc5\x70\x76\x82\xbe\x20\x7e\x2f\x6c\xef\xd9\xfd\xd8\x6c\x05\x03\xd3\x32\x13\xd5\x65\x62\xbc\x18\x1a\x26\xa1\x0e\x4f\x01\x6c\x9b\xe8\x33\xe8\x3f\x99\xc2\xba\x18\xce\x9a\x5b\xc7\xae\x6e\x9e\x3d\xe6\x0e\x26\xb1\x21\xdc\x11\x15\x19\xd1\x5e\x66\x01\x41\xbb\x84\xd9\xbe\xfa\xf0\x66\xab\x29\x90\xfd\x93\xd5\x94\x6d\x17\xc3\x19\xab\x5a\x4c\x9f\x2e\x19\x8a\x19\x8a\x59\x96\x7b\x08\x73\xd9\xaf\x51\x1c\xa7\x82\x4f\x6d\x35\x53\xd1\xcd\x37\xa4\x0e\x19\x58\xfe\xcd\x91\x98\x17\xc3\x59\xac\x62\x7f\xcb\x70\x61\x57\xe1\xa8\x4d\x0a\x47\x4f\x76\x03\xae\xa6\xf4\x83\xce\x4d\x19\xa1\x0f\x92\x4d\x7a\x0f\x55\xd0\x39\x7b\xfe\x59\x38\x03\x32\xd1\x5f\x17\x99\x63\x3d\x4c\x34\x6f\x11\x92\x5e\x6f\x5e\xac\x0e\x9d\x1a\x8b\xb9\xfe\xd0\xaf\x92\xd9\xf3\x25\xe7\x5d\x90\x2a\xa7\x88\xe5\xc8\x0b\xd8\x22\x73\x00\x1d\x62\x35\x56\x10\x8e\xa7\x91\xc2\xbe\x24\x44\xb5\x6e\x9c\xfd\xc2\xc7\xd3\x3c\x76\xb0\x08\x23\x9e\x36\x8a\xfb\x70\x6d\xef\x4b\x09\xeb\x0a\x6c\x17\x38\x90\x0e\xb1\x1a\xf7\x18\xf5\xd4\x3d\x1b\x32\x95\x55\x6c\xa1\x4a\xdc\x46\x8d\x57\x18\xee\xa0\x1b\x13\x62\x6e\xb5\x1c\x1d\xbd\x6b\xf8\x52\x8f\x07\xf6\xba\x14\x48\x17\x2c\x8d\x06\xf7\x7d\xb5\xb8\x9e\x9f\x64\x63\x66\xc7\x8f\xc6\x28\x88\xac\x2c\x99\x50\xa2\x2f\x7d\xbe\x74\xb5\xe6\x35\x87\x8e\x78\x58\xc9\xdd\xf5\x27\xb0\x9b\x47\x81\x74\x88\x3b\x8b\xc3\x1b\x58\x03\x2c\xd2\x59\x1e\xf1\x08\x36\x3e\xbb\xf2\x83\x5a\x43\x57\xd3\x41\x48\x5f\x53\xca\x4b\x7e\x22\xcc\x7b\x4a\xdd\xf9\x09\x6c\xe6\x0c\x40\x07\xdb\x73\xf6\x9f\xc3\x19\xd0\x0f\xfa\xaf\x67\xc2\x64\x7c\x51\x0a\x58\x32\x9f\x72\xe7\x60\x44\xe9\xa7\x59\xbf\x4a\x47\x1d\x95\x4e\x55\xc0\x69\x4e\x35\xc0\x38\x2c\x49\x7b\x13\x16\x76\x80\x74\x88\x16\x00\x0f\xdf\x02\xd7\x06\x9f\x52\xde\x69\x22\x55\xb5\x24\x11\x10\x6f\x60\xc3\x7c\x54\x3a\x72\x3b\x22\xe5\x28\xb4\x3f\x63\x2d\x32\x08\xb6\xb1\x1e\x40\x87\x68\x01\xca\x44\x9a\x00\xbe\xae\xac\xe5\xb3\x5e\x50\x74\xbf\x51\xad\x2d\xed\x5e\xfe\xfd\x36\xbf\x69\xd0\x76\xb6\x56\x03\x67\xac\x3e\x2c\xf4\x01\xe9\x10\x2d\x90\x90\x79\x75\xac\x29\x42\xe7\xe0\x2a\x71\xd6\xb5\x83\x9b\x66\xce\x1c\x63\x1d\x71\x86\xc9\x72\x2c\x8e\x1e\x8e\xf2\x66\xa8\xbd\xbe\xe7\x5c\x20\x1d\xa2\x05\x0e\x07\x37\xb4\x03\xd4\x94\xe4\x14\x44\x0f\xe9\x21\x6a\xda\xaa\x79\x56\x1a\x3c\xa7\xc1\x8f\x08\x22\x1d\x0f\x0a\x56\x39\x8b\xb1\xce\x1f\xc8\x40\x3a\xd8\x5e\x13\x80\x70\x06\x54\x5d\xff\xe6\x01\xce\xcd\xef\xfd\xc5\x7a\x27\xe2\xe2\xa2\xae\xc4\x4c\x3f\xa4\x6c\xe7\xc8\xd1\xb5\x75\xe8\x6b\xa7\x5a\xe3\x0a\x67\xf1\xf7\x8c\x61\x03\x73\x20\x1d\xa2\x07\xca\xc5\xd4\xb8\xbf\x45\x2c\x12\xd2\xc5\x9b\x86\xee\x45\x15\x47\x7c\xd6\xfd\x46\xa2\x28\xf2\x61\xe9\xc4\x74\x35\x2a\xef\x78\x17\x76\xb7\x3b\x90\x0e\xd1\x03\x1f\x1c\xa1\x3e\x98\xb7\x86\xdb\xd6\x0d\x43\xf8\x4e\x75\x57\x16\x73\x07\x4c\xa1\x35\x4f\x5f\x67\x77\x19\x96\xd9\xbb\xdb\x0e\x34\xc1\x4e\x7f\x03\xd0\x21\x7a\x80\xad\x73\xcd\xec\xa3\x7b\xf4\x5b\x01\x13\x7e\xfa\xbe\x41\x17\xed\xef\x31\x02\x69\xab\xa0\x90\x82\x12\x51\x9e\x0e\x0a\x1d\x7e\xd8\x32\x29\x20\x1d\xa2\x07\x2c\xec\x6e\x1f\x75\x76\x5f\x22\xd2\x79\xca\xcb\x7d\x6b\x2f\xa9\x8f\xf4\xfe\x47\x2b\x7e\x61\xce\x4b\xef\xa4\x8c\x0b\x7b\xfd\x73\xdb\xcf\x3d\x00\xa4\x83\xed\x35\x01\x08\x67\x40\x8f\xba\xbf\xee\x3b\xec\xfe\x4e\x2a\x97\xba\x14\x69\x34\x15\x0e\x4e\x60\xcb\x5b\x49\xba\x91\x23\x15\x82\xda\x30\x7e\xe9\x73\xde\xab\x26\x6d\x01\xd8\xfe\x1d\x20\x1d\xa2\x07\x34\xa7\xd9\xef\x2a\x77\xc8\xf7\x67\xfe\xea\x6e\x40\xbd\x8e\xa2\x13\x6c\xbd\xce\x2f\xbf\xeb\x49\x26\x8b\x43\x4a\xfa\x4e\xa8\x1c\x76\x20\x30\x90\x0e\xd1\x03\xb4\xa0\x71\x19\x5d\xbc\xc7\x64\xef\xc5\x82\xe3\xed\x6f\x62\x07\x6a\xbc\xc9\x7a\xbb\xa8\x43\x7d\x07\xb2\x51\x8a\xf3\xe3\x6b\xf6\xcc\x39\x17\x48\x87\xe8\x01\x5c\x91\xb1\x9f\x5a\x46\x98\x07\x83\xd5\x15\xbf\xea\x7f\xa8\x47\xa9\xf1\xb7\x44\x15\x59\xc6\x3f\x1c\x57\x14\xbc\xc6\xfd\xc0\x04\x36\x6b\x02\xa4\x43\xf4\x00\x65\xe2\x9a\xde\x0a\xa6\x4b\x4d\x9c\xcb\xd6\xb4\xe5\x80\x84\x03\x45\xd8\x5a\x0f\xde\x65\xfd\xb5\xcd\x9e\xfb\xda\x10\xd0\x2a\xc7\xb9\x07\x80\x74\xb0\x3a\x00\x10\xce\x80\xc6\x1d\x7f\xf3\x00\xa3\x1d\x8b\x6e\xd1\xe4\x65\x9a\xd1\x6f\xe6\x18\xde\xde\xa5\x5b\x41\x96\xa5\x2f\xbb\x44\x6f\x8a\x92\xea\x73\xb5\x62\xfa\x78\xf7\x9d\xb7\x1d\x48\x87\xe8\x01\x26\x4b\x55\x1a\xd4\x0f\x9f\x55\xfa\xf6\x14\x22\xe6\x15\x1b\x5a\x7d\x85\x79\x3e\x17\xb6\xa7\x19\x50\x2e\x95\xdb\x26\x93\x8e\xc3\x2e\x0c\x07\xd2\x21\x7a\xa0\x2b\xf8\xaa\xa7\xd8\x50\xe6\x47\x56\xca\x5c\x8f\x47\xec\x83\xef\xeb\x87\xb4\xea\x99\x55\x9c\x8c\x5e\x9e\x99\x95\xcb\x3c\x7a\x0c\x5b\xed\x00\xa4\x43\xf4\x40\x7a\x23\xa5\xa9\xd2\xe8\x0d\xd4\x18\x68\x65\x11\x7d\x52\x89\xd3\x4b\xf2\x12\xbd\xf2\xcc\xa4\xa6\xd8\xc4\x1e\x94\x51\x12\x5c\x8b\x73\x2e\x90\x0e\xd1\x03\x59\xe2\x52\xeb\x90\xcb\xfb\x95\x5f\xd2\xa8\x02\x3f\xdc\xdc\x73\xa0\xbf\xb3\xef\xc3\x3d\xb0\x21\x42\x1f\xdc\x82\xfe\x58\xde\x6d\xe7\xdc\x03\x40\x3a\x58\x1d\x00\x0a\x67\xc6\xaf\x47\xd2\xfa\x8d\x8b\x08\x9d\xa6\xdb\xdc\xd2\x8c\x5a\x4a\x27\xd2\x08\xd1\x8c\x77\x3a\x48\x51\x1f\x3a\x69\xdc\xb9\x94\x2b\xf9\x67\x38\x1b\x4a\xc4\x50\xec\xea\xc7\x43\x7f\x93\x28\x42\x9d\xa0\xf2\x73\x71\xb7\xf3\xb8\x25\x86\xe6\xea\x77\x0b\x67\x96\x65\xe1\x45\xaa\x7b\x7f\x48\xaf\x89\x1c\xa1\x2a\xe1\x6f\x35\x76\x7c\x10\x70\x99\x0c\xb5\xf9\x2c\xe0\x33\x9f\x4b\x84\x12\x91\x1a\x4d\x5c\x3e\xeb\xeb\x44\x63\xf3\xbf\x16\xce\x80\x9a\xf6\xe7\x9e\xb3\x8b\x33\x67\x3d\xe4\x15\x26\x15\x71\x3b\x95\x97\xf8\x49\xbd\x6a\x38\xf0\x37\xa5\x28\xd5\x30\x66\x05\x99\xa8\xd4\xee\x74\x71\x73\x9d\xea\xfd\x93\x49\x1d\xfe\x0b\xb9\x01\x24\x5e\x92\x45\x69\x5c\xe1\x1c\x74\x5c\xed\x54\x5e\xd9\xa8\x41\xce\xf0\x3c\x25\xfa\x95\x96\xfe\x5d\x48\xbd\x6a\x90\x52\xdf\x9b\x7f\x32\x85\x75\x31\x9c\xd9\xb3\x62\xb5\x09\xa5\xa3\x35\x0a\x63\xe8\x7f\x9a\xaa\x1b\x27\x71\x4d\xd5\xea\xa5\x23\xe8\x67\x74\x52\x05\x4f\xb1\xae\xda\xfc\x9b\x1d\x76\x26\x17\x2f\x0e\xd8\x10\x28\x7a\xed\xac\x49\xeb\x55\x90\x9a\x4c\x43\xc2\x3d\x6a\x91\xb5\xee\xc8\xff\x3e\x29\xb6\x62\x80\x3e\xd7\x94\x7a\x06\xf4\x4f\x5a\x7b\x31\x9c\xbd\xfc\x85\x3e\xc8\x5d\xca\xf2\x45\x76\x41\x52\xc3\x31\x0a\xa7\xa7\x86\xba\xff\xa6\xb4\xad\xe3\x47\xfe\xd7\xf8\x69\x44\x0e\xf6\x2b\xff\x6e\xe6\x0c\xc0\x44\x7f\xab\xc6\xce\x3c\xed\x09\xe5\xbe\xf7\xd7\x9c\x70\x1a\xaf\x9e\x8d\x31\x67\x35\xf3\xd2\x60\x0e\x5f\xd1\x37\x0c\x76\x12\x65\xa9\x9c\x7b\xb4\x7b\x5e\x85\x80\x74\x88\xd5\xb8\x85\xbe\xa5\x27\x59\x8e\x41\x9e\x41\xea\xee\xed\x34\x29\xad\xb8\x4f\xd4\x5f\x28\x66\xaa\xc1\x5d\xda\xb6\x6b\xd2\x9c\xf5\xfb\xf5\xb0\xb5\x21\x00\x3a\xc4\x6a\x9c\x4e\xa4\x47\x1e\xbc\xbc\x00\x39\xe9\xdd\x48\x5f\xdf\x17\x1e\x11\xe0\xe3\x45\x39\x0d\xd9\xf3\xfb\xb5\x93\x18\x20\x0a\x59\x5c\x85\x55\x4d\x00\x1d\x62\x35\xa6\x7d\xab\x13\x78\x47\x3c\xde\x47\x09\xa3\xec\x05\xad\x88\xa7\xc2\x20\xf5\x82\x06\xda\x90\x6c\xb8\x2d\x75\x32\x15\xd4\x2e\x01\x56\x8d\x81\x74\xbf\xab\xe6\x9f\x5c\x49\x89\x5b\x99\xd8\x2d\x5f\xe2\x3e\xca\xd1\xef\x6b\x04\xcf\x74\x5b\x60\xae\x37\xf9\xf6\xd4\x55\x7e\x32\x8e\xc2\x62\x7b\x52\x9a\x70\x1e\xce\x80\x74\xb0\x3d\x67\xff\x39\x9c\x01\xfd\xa0\xff\x66\x81\x85\xc2\x96\xc5\xe1\x0f\x13\x13\x1d\x67\x6e\x1a\xa6\xb9\xd1\x0d\x42\x95\x0d\x44\x1e\xd9\x54\x42\x60\x06\x15\x0f\x3a\xf1\x8f\x76\xe7\x4d\x07\xd2\x5d\x38\x3e\xf9\x15\xd8\xe7\xbe\xb7\x29\xc5\xc4\x37\x73\xe3\x7a\xa5\x49\x8c\xea\x54\xda\x6b\xe5\xfb\x8f\xf2\x5a\x4b\xc1\x0b\x1e\x98\x82\xb0\xd9\x0d\x20\x1d\xa2\x05\xbc\xbc\x07\x92\xc9\x48\xab\x0e\x52\x0b\x16\xbd\x8a\xa6\xdf\x3e\xd6\xee\xe1\x0e\x12\x13\xd6\x7b\xe4\x31\xd0\x91\xa2\x70\x7b\x50\xf0\x9c\x0b\xa4\x43\xb4\x00\x7a\xf1\xe8\x42\xad\xfd\xfb\xbb\x5a\x8c\x2a\xb2\x02\x6a\x16\x45\x2e\xa3\x31\x0e\xd9\x55\xc9\x93\x3d\x91\x4d\x0a\x07\x8a\x61\xb0\x0b\x4d\x81\x74\x88\x16\xe0\x7e\x3f\x19\x07\x61\xaf\x2c\xe6\x0a\x29\x4d\xc6\x94\xe8\xd8\xcd\x4f\xc7\xea\x99\x9f\x4e\x0a\xfc\xf4\x68\xba\xdf\xf0\x57\x41\xee\xf9\x03\x19\x48\x07\xdb\x6b\xc2\xff\x9f\x07\x65\x40\xd5\xf5\xaf\xd7\x29\x2c\x53\x93\x30\xb0\x15\xab\x1a\xe2\x81\x5e\x2d\xde\xe8\x4b\xf0\xf7\x50\xd4\x78\x45\x6d\x98\x45\xc7\x65\xbf\x56\x9c\x4a\x0c\x5b\xce\x07\xa4\x43\xf4\x40\xbc\x59\x40\xf2\x35\xe7\x7c\x1a\xfa\xb7\x0f\xf3\x3e\x90\xb5\xb8\x96\xde\x0e\xee\xb5\x8a\xfa\xd9\x79\xd4\xfd\x7d\x3a\xb8\xb3\x06\x76\x77\x16\x90\x0e\xd1\x03\x6e\x11\x41\x0f\xa8\xc6\x71\xb9\xa4\x8f\x1f\x04\xf2\x16\x57\x25\x2d\xd8\xd1\x88\x7a\xf1\x3c\x65\x80\xea\xe8\x49\x18\x39\xd4\xc2\x4e\xea\x03\xd2\x21\x7a\xe0\xf6\xdc\x5a\xf0\x87\x6d\xb5\x3b\x16\xa5\x47\x14\x3f\x0e\x36\xf9\xb6\xc1\x0e\xd8\x52\x25\x7c\xfa\xad\x0c\x61\xa8\x0d\x41\x13\x67\xb0\x25\xb3\x00\x3a\x44\x0f\xec\xac\x75\x98\x78\xfb\xf7\x60\x1c\x45\x5f\x59\xd7\x28\xe5\x43\x37\xff\x39\x7d\xb9\xcd\x4d\xd3\xe4\xc3\xa4\xec\x11\xd6\x14\x1d\xfd\xb9\x07\x80\x74\xb0\xbd\x26\x00\xe1\x0c\xe8\x51\xf7\x37\x0f\x7c\xf3\xa0\xa0\xef\x4e\x0c\x0c\xfc\x15\x78\x34\x4d\x87\x5e\x67\xd5\xf7\x42\xf9\xb9\xed\xa3\xdb\xd6\x2f\x27\xec\xd4\xf7\x83\x8f\x61\xcb\x90\x81\x74\x17\x5e\xd2\xac\x40\x40\xb2\x29\x76\x35\x6d\xa2\xc9\xb2\xdf\x53\xf0\x99\x4c\xea\x14\xcf\x0c\x46\xed\x84\xa5\x6a\x4e\x58\xbd\x62\xf7\x7b\x60\x2f\x69\x00\x74\x88\x1e\xf8\x86\x11\x6a\x96\x36\x90\xf3\x40\xc0\x5e\x62\x2f\xb9\x3f\x97\x04\xf7\x32\x77\x34\x95\xb3\x9f\x43\x9a\xa7\xee\xed\x85\xef\x4a\xb0\x47\x0c\x90\x0e\xd1\x03\xc1\x95\x1b\x65\x16\xcb\xe0\xf9\xac\x6e\x97\x9c\xe2\xba\x51\x4c\x74\x8f\xcc\x1f\xd7\x46\x04\xc9\xfd\x76\x65\x8e\xb7\x62\x66\x61\x27\x8c\x02\xe9\x10\x3d\x80\xfe\x74\x34\x83\x26\x60\xa7\x5d\xc3\x3b\xb1\x44\x6b\xce\x4e\xa0\xbf\x7e\xe0\x4b\xd3\x0b\x28\xd1\x25\x07\xd0\xa5\xf7\x99\x7a\xd3\xe7\x1e\x00\xd2\xc1\xea\x80\x09\xc0\xd2\x56\x80\x71\xc7\xdf\x3c\x20\x6f\xa4\xf1\x86\x97\xcc\xab\xfe\x46\x0c\x9b\x4f\xa0\x4b\x58\x8b\x3f\x67\x80\xf7\xce\xd5\x03\x5d\x49\x4a\x9c\x67\x01\x13\xd7\x1f\x9f\xb7\x1d\x48\x87\xe8\x01\x16\x7a\x99\x3e\xce\x52\xd1\x56\x1f\x22\xee\x80\x23\xcb\xee\x2d\xfa\x01\xbd\xc1\x86\x75\xb5\x74\x57\x93\x24\xed\xca\xc0\x02\xd8\x32\x64\x20\xdd\x85\xe5\xcd\xb1\x93\xd5\x26\x19\x06\x3f\x78\xac\xec\x83\x27\x94\xda\x8d\x1e\xb3\x51\xe6\x5d\x39\x45\xc7\xe0\x0b\x11\xfa\x54\xef\x73\x52\x0c\x5b\xde\x0c\xa0\x43\xf4\x00\xaa\x12\x51\x95\xd7\x17\xfe\x9f\x24\x53\xb6\xc4\x20\x62\x6c\xd2\xe5\x11\xba\x42\xb6\x56\xe6\xb5\x2b\x9e\x94\x3b\xc7\x5f\x3c\x60\xbb\x32\x80\x74\x88\x1e\x60\xb9\xe9\x9c\xb2\x79\x19\x8d\xd4\xbe\xf6\x9a\x36\xb1\xad\x6c\x3e\xd1\xf6\xdb\x76\x76\xa6\xb2\x97\x8b\xce\xf9\x07\x7d\xaa\x93\x1e\xe7\x1e\x00\xd2\xc1\xea\x00\x50\x38\x1b\x5b\xe4\x93\x34\x43\x0d\x25\xfa\xd2\x96\x7d\xa9\x73\xb5\x6f\xa4\x31\x07\xed\x1a\x4f\xb6\x03\x76\xf6\x6b\xdb\x57\x81\x5d\xd1\xaa\x7f\x86\xb3\x1b\x1c\x63\xd9\x87\x2c\x8b\x3c\xdf\x82\xdf\x92\x2e\xa7\xb8\xdd\xd3\x20\x84\xec\x05\xb9\x63\x82\xb8\x56\x2f\x7b\x17\x36\xa8\x28\xfc\x21\x75\xcd\xc2\xf1\x17\x1a\x7f\x32\xf4\xed\xbe\x78\xea\xd5\x7e\x0a\x89\x71\x3d\x19\xa5\x3d\x02\x69\x17\x76\xd6\x2b\x27\x79\xa7\x66\x2e\xff\x6b\xe1\x0c\xa8\x69\x7f\xee\x39\xbb\x10\xce\x6e\x6f\xd2\x6b\xbc\xa6\xd7\xbe\xcb\x7f\x1b\x83\x20\x8d\x43\x43\x54\x73\xe5\x72\xe5\x7b\xe3\xd6\xa0\xd2\x25\xfc\xfc\x1f\xbc\xa7\xf3\xff\x64\x52\xe7\x62\x38\x53\xdd\xf9\x72\xd2\x1e\x33\x70\x33\x8e\x9a\x5a\x80\x91\xfb\x5b\x44\xf1\xea\x7c\xe4\x31\xb5\xdc\x9d\xfa\xd9\x15\xef\xd0\x7a\x2f\xdd\x7f\x32\x85\x75\x31\x9c\x6d\x6d\x28\x30\x24\x27\x67\x33\x50\x2f\x95\xcc\x3e\x37\x03\x9d\x9d\x4d\xc9\x9a\x86\x3c\x8a\xd5\xc2\x52\x6a\xfe\x74\x3a\x78\xa6\xf0\x4f\x5a\x7b\x31\x9c\x2d\xb1\xc9\x2b\xce\xcf\x10\x35\x55\xb6\x47\x14\xa5\xe1\xa5\xfb\xb6\x31\x48\x09\xb2\xce\x53\x8f\x41\x82\x12\x8c\x24\x28\x4b\xdb\xff\x49\x6b\x2f\x86\x33\x75\xf7\x87\x82\xee\x3e\x41\x62\xac\xa3\x86\x20\xec\xd5\xe0\xd5\x34\xd9\x95\xab\x63\x0e\xce\x5c\x22\x5c\xd4\x8d\xb4\x7a\xd9\xe6\xff\x2c\x9c\x01\x99\xe8\x6f\xd5\xb8\xb7\x50\x6f\x28\x2f\xfb\x0d\x7e\x7b\x5a\xee\xe5\x85\xeb\xcd\xf3\x91\x3e\x92\x74\x3a\xde\x0f\xb1\x77\x95\x8d\x08\x1a\x79\x6b\x60\xaf\xa0\x81\x74\x88\xd5\x18\x55\x24\x3a\x5d\xd6\xc1\x84\x94\xfd\xc7\x3e\xce\x32\x71\xf8\xc2\xf7\xc2\x00\x1e\x23\xbe\xc8\xd8\x38\xec\x1d\x42\xed\x7b\x4f\xb5\x61\xd5\x0d\x40\x87\x58\x8d\x09\x8d\xf3\xa8\x73\x3b\x59\xf4\x4f\xbd\xbe\x9b\x84\xd1\xa8\x0f\x10\x0a\x3f\xb5\x70\xec\x87\xda\xeb\xbb\x2b\x5e\x9d\x90\xf5\x84\xbd\xe2\x07\xd2\x21\x56\x63\x3b\xdd\x87\x2d\xac\x34\xa2\x3b\xd1\x5c\x3a\xfb\x5f\x41\x29\x5f\x76\x62\x1f\x74\x64\xda\x5c\xab\x7e\xf6\x92\x99\x5c\xe4\x66\x27\x6c\xd3\x0d\x90\x0e\xb1\x1f\xd6\x67\x43\x4e\xb0\x45\xd2\x74\x5d\x36\x3a\x70\xbe\xf5\x0f\x49\xf1\xc8\xbd\x2c\xf8\xfe\x48\x9c\x5f\x63\xf1\xa9\xca\x90\x1c\x57\xfb\x79\x38\x03\xd2\xc1\xf6\x9c\xfd\xe7\x70\x06\xf4\x83\xfe\x9b\x05\x94\xef\x92\x3a\x57\xfd\xa8\x1c\x26\x26\x0f\x78\x82\xb7\xb5\x31\x95\xb7\x38\xfe\x15\xcf\xf8\x30\xed\x09\x3d\x7f\xa9\x9a\xaa\x13\x6c\xc6\x08\x48\x87\xd8\x74\xf7\x01\x73\x6d\x9d\xe9\xaf\xe0\x61\x2a\xec\xc2\x9e\xe4\x55\xdf\x86\x18\x8c\x6e\x8c\xe2\x54\x96\xb3\xbc\xd2\xc2\x34\xf0\x03\xd8\xdd\x59\x40\xba\x0b\xe1\xec\x09\xfe\x80\x41\x5d\xa7\x10\x56\xf0\x61\x47\x28\x86\x80\x52\xbc\x54\x6d\xb5\x0e\x71\xfc\xd8\xbe\xeb\x29\x95\xab\x95\x64\x17\x2c\x9c\x01\xe8\x10\x2d\xd0\x61\x4b\xf0\x2b\x42\xea\xc0\x39\xeb\xe9\xfa\xaf\xde\xc9\x45\xed\x02\xd0\x65\xfc\x05\x16\xb2\xb3\x6b\x23\x3c\x89\xb1\xf5\x61\xba\xe7\x5c\x20\x1d\x62\x3f\xac\x5d\x31\xfe\x99\xcc\x5f\xe2\xde\xf9\x56\x67\x40\xc8\xc0\xa5\xfe\x2b\x9d\xa4\x45\xf6\x92\x21\x7e\xd9\xf1\x54\x3b\x06\xca\xba\xe2\xf9\x03\x19\x48\x07\xdb\x6b\x02\x10\xce\x80\xaa\xeb\xdf\x3c\xf0\x4a\x5d\xff\xba\xe6\xbd\x4a\x3f\x8d\x81\xc6\x00\xf2\xd7\x55\x54\x33\x1c\x43\x8a\x78\xc7\x9f\xda\x66\xec\x79\xf7\x9b\x73\x19\x61\xf7\x91\x01\xe9\x10\xdb\xae\xee\x9b\x3e\xf7\x5a\x22\x8c\x3a\x75\xf9\x26\xca\x62\x26\xe5\xea\x11\x9f\x8e\x66\xf6\xde\x33\x79\x46\x7d\xd5\xbd\xa7\xd2\x9d\x46\xe7\x5c\x20\x1d\xa2\x07\x9e\x7f\x58\xea\x0e\x44\xf7\xac\x60\x76\x74\x38\xf8\x75\x7a\xc9\x69\xe3\xf1\x9e\xac\x4b\x3c\x2d\xad\xcf\x65\x4d\x8b\xc6\x5d\x0e\xd8\x1e\x16\x20\x1d\xa2\x07\xf2\x44\xbb\xd7\x03\x67\x55\xfb\xda\x2a\x4a\xaf\x7c\x7b\xd5\x47\x93\xa1\xe6\x84\xe9\xe6\x7c\xed\xb4\x79\x53\x54\xa1\xa9\xc7\x13\x76\xfd\x03\x90\x0e\xb1\x1f\x8c\x5e\x66\x4d\x2e\x56\x48\x11\x2c\x63\x8a\x09\x60\x3f\xdd\xc0\xce\x45\xf7\x8a\x27\xa4\x99\xa8\xcc\xbd\xbd\x89\x1a\x77\x26\xfc\xe8\xdc\x03\x40\x3a\xd8\x5e\x13\x80\x70\x06\xf4\xa8\xfb\x9b\x07\x62\x8e\x8e\x53\x43\x52\x1d\x26\xa6\xf1\x9e\x31\x07\x4b\x9a\x4b\x84\xae\x57\xfb\x55\xd9\x97\x1e\x05\xdf\x12\x96\x37\x9f\xb0\x87\xfd\xad\x80\x74\x17\x06\xe6\xc4\x31\xb4\xf3\x9d\x9b\xe4\x4d\x0b\xd5\xe6\x0e\x82\xcf\x51\x47\x02\xe5\x6b\xc4\xc9\xeb\x7c\xd7\x5e\xb7\xe4\xaa\xbc\x62\x95\x84\x0d\xcc\x01\x74\x88\x1e\x78\xcc\x5d\x77\x23\x47\xc1\x0a\xdb\x69\xb3\xae\x7f\x4b\xe9\xa6\xef\x40\x64\xa4\x44\x9f\xa2\xef\xbb\x2d\x1a\x69\xff\x93\x68\x7e\xd8\x31\xea\x40\x3a\x44\x0f\x60\x70\xb9\xf6\x04\x8a\x3f\x59\x1f\x0a\xc4\x79\xe5\x85\xda\x71\x16\x24\x3e\x9e\x50\x82\xd3\xb1\xcd\x16\x09\x15\x72\xe2\x27\x86\x1d\xdc\x0b\xa4\x43\xec\x87\xb8\x27\x18\xfe\x26\x54\x84\xa3\x43\xb1\x55\x5a\x76\xe1\x3e\xb3\xc5\x05\xfa\x47\x02\xb9\xac\x7a\xa5\x7c\x6a\x01\x4c\xaf\x95\xcd\xce\x3d\x00\xa4\x83\xd5\x01\x80\x70\x06\x34\xee\xf8\x9b\x07\xa8\xbf\x3e\x3f\xd6\xb1\xf0\xd6\x78\xd9\x5e\x9d\xa0\xe4\xce\x98\x77\x44\x29\x7e\xa2\x7a\xab\x9e\x6d\xc4\x0b\x32\x7e\x95\xc0\xa6\x14\xb6\x47\x14\x40\x87\xd8\xf6\x09\xcc\x81\x96\x9f\xdd\x56\xeb\x06\x4e\xaa\x63\xa7\x02\xaa\x5b\xbf\x32\x8c\x2c\x4c\xfc\x58\x1b\xed\x6b\xb3\x9c\x08\xda\x8c\xa2\x60\xfb\x03\x01\x74\x88\x1e\xa8\xe5\x0c\x23\x7b\xb4\x03\x2e\x5f\x93\xbb\xea\xbd\xdc\x65\xe1\xe4\xe4\xe9\x7b\xb5\x8a\x33\x43\xb8\x86\x97\x5a\xe6\x9e\x57\xfa\xfc\x39\x17\x48\x87\xe8\x01\x4d\x25\xee\xe0\xa0\x69\xed\x32\xde\x26\xca\x98\x48\xcf\xf5\x90\xc8\x6d\xee\x99\x74\x47\x8c\x1b\x36\xd7\x66\x0e\xd6\x5b\xbd\x14\x61\xb3\xbd\x00\x3a\xc4\x7e\x20\x23\xb1\x1f\xe6\x5f\x1d\xea\x6d\x4a\xb2\x99\xcd\x8f\xbd\xc4\xf7\x39\xeb\x0e\x85\xd5\x10\xe8\x15\x88\xce\x4d\x3d\x5c\x81\xd6\xe7\xdc\x03\x40\x3a\x58\x1d\x00\x9c\x39\x13\xa4\xcf\x35\xc6\x91\xd6\x45\x1b\x69\xe4\x96\x1c\x5c\x66\x8e\x73\x1e\x99\x1a\xc6\x67\xf8\x02\x3e\x9d\x1c\xbc\xaa\x86\x19\xf6\x67\x38\xb3\xa2\xc7\x10\xbe\x3a\x43\x5d\x64\x43\xea\x8a\xff\xcb\xd2\xb8\xc6\x4b\xf8\x94\xd1\xad\xee\x4c\x25\xed\x41\x86\x29\x71\x25\xcf\x9f\x47\x41\xe8\xe8\xa1\x46\x29\xc5\x64\x98\xe7\x59\x7e\xea\xc3\xbc\x9f\xe6\xaa\x99\x54\x95\x11\x25\x34\x55\xaf\x79\x07\x95\x69\xaa\xd0\xb9\xfb\x7f\x2d\x9c\x01\x35\xed\xcf\x3d\x67\x2a\x88\x03\x78\xe5\xf7\x9a\xfb\xd5\x11\x0f\xdf\xad\xab\x47\xcf\xcc\xda\xc6\x46\x0c\x8a\xf2\x42\x95\x99\x5e\x7e\xf0\x52\xb2\xa7\xb5\xe4\x29\x7a\xf6\x4f\x26\x75\x2e\x86\xb3\x2b\x41\x8e\x7c\x9b\x34\x91\x02\x6f\x04\x6a\x8b\xdf\xcd\xb0\xc7\x1c\xe0\x57\x85\xcf\x0d\x9a\xf8\x69\x43\xc3\xa3\x3a\x7e\x76\xd8\xfe\x93\x29\x2c\xed\x0b\x1f\x7b\xd8\x1e\x1f\xdb\xfc\xb8\xd7\x2a\x96\x67\xe1\x74\x0c\x3f\xfc\xa5\x7b\x99\xf1\x46\x33\x6a\x9a\x34\x3e\xfa\xe5\xfa\xbb\x93\x27\x8c\xff\xa4\xb5\x17\xc3\x59\xea\x2e\xfb\xd4\x0c\x5f\xc2\x98\x49\x26\xd6\xda\xaa\x1f\xd9\x7c\xf5\xcb\x3b\x26\xee\x05\xd7\x58\x7a\x12\x15\x6e\x31\x3a\xe4\x58\xfe\x93\xd6\x7a\x5f\xf8\xd8\x14\x99\x9c\x4c\x69\xa9\xf0\xe0\x5d\x92\x92\x16\x1f\xb5\x7a\x61\xd3\xca\x69\xf5\xc7\x22\x6d\x52\x99\x6b\x8c\xd6\x56\x5d\xdf\xa2\xff\x59\x38\x03\x32\xd1\xdf\xaa\xb1\xad\x8c\x8e\x91\xf5\x69\xa0\x7a\xda\xf7\xbd\x2f\xde\x28\xc2\x36\x31\x04\x2a\x7c\x11\xe8\x65\x11\xa4\x8e\xd5\x46\x84\x8a\xf7\x61\xc7\x33\x01\xe9\x2e\x54\x63\xb6\x5f\x75\xed\x0e\x2b\xcc\x18\x97\x52\x02\x52\xbf\xd2\x8c\xd1\x69\x79\xde\x57\x00\xdf\xbd\xa2\xb6\xeb\xdd\xaf\x1b\xe8\xf6\x1e\x56\x8d\x01\x74\x17\x6e\x9f\xc5\x87\x94\x0f\x6d\x6b\x94\xa9\xfd\xdc\x4b\xfa\xe2\x59\xbe\xae\xfb\xd5\xf6\xda\x57\xa2\x67\x11\x8f\xf9\x5c\x8e\x4b\x5a\x43\xaa\xce\xb9\x40\x3a\xc4\x6a\xdc\x84\x03\xf2\x0f\xfe\xa8\x1b\xb6\x48\xea\x6e\x69\x97\xdf\x3a\xa4\xeb\x44\x85\xf2\x7a\x0d\x17\xe4\xd7\x69\xc3\xda\x3a\x5f\x02\x5b\xd6\x08\xa4\x43\xfc\xbe\xdc\xa3\x21\x79\x5e\xc9\xf5\xd1\x67\xa6\xd4\xfa\xba\xd4\x47\x6c\x43\x93\xe4\x6e\xb1\x73\xae\x77\xb7\xf0\x3f\x7e\x5b\x79\xa1\x10\x71\x1e\xce\x80\x74\xb0\x3d\x67\x2a\xff\xf1\x81\x0c\xf4\x83\xfe\x9b\x05\x0a\x17\x21\x68\xe9\x4e\x63\x78\xaf\x97\x1b\xd0\x78\xcc\xae\x39\x31\x35\xf3\x61\x12\xb9\x7e\x62\xea\x99\xe0\xdd\x7a\x2b\xf0\xff\x2e\xde\x05\xd2\x21\x5a\x20\xe2\x45\x87\x72\xdf\xf0\x14\xca\x81\x62\xc9\x51\x8a\x01\x91\xda\xdd\x0c\xe1\x45\xe8\x5b\xa1\x43\x6e\xce\x39\x82\x54\x8d\x0e\xd8\x59\x33\x40\x3a\xc4\x2e\xed\xb5\xc7\xb8\x15\x37\xb8\xae\xfc\x46\x3b\x90\x42\x7d\x6a\xa8\x99\xc7\xa5\x69\xe2\x39\x93\x87\xdd\x41\xa5\x8b\xd5\xab\x1b\xc4\xbc\xb0\xf7\x09\x00\x3a\x44\x0b\x30\x98\x60\xc5\xc6\xe2\x5a\x93\xbc\xb9\x7e\x92\x38\x52\x71\x8b\x89\xc7\xbf\xf9\xae\x93\x5c\xf0\xa3\xa2\xec\xba\xfb\x7b\xd6\x01\xb0\x63\xd4\x81\x74\x88\xdf\x37\xa0\x53\xb1\x99\x65\x11\x9f\x73\x65\xd0\x26\x54\xf1\x05\xb9\xb9\x24\x45\x74\x5d\xa2\xbd\xc3\xf4\x97\x9c\x05\x41\xd5\x8c\x5f\xb3\xe7\x0f\x64\x20\x1d\x6c\xaf\x09\x40\x38\x03\xaa\xae\x7f\xf3\x00\xa1\x83\xae\xec\x8a\x73\xe3\x37\xda\x2e\x6d\x93\x77\x36\x75\xfc\x42\xe5\x86\x29\x69\x28\xe3\x26\xd3\xd0\xc0\x87\x9c\x29\x2f\x85\x60\xef\x3c\x00\x74\x88\x1e\xd8\xb5\x58\x7e\x13\x84\xd6\x99\xdc\x9c\xc2\xa9\xc7\x6f\xf9\xc3\x69\xfb\x98\xb8\x89\x96\xf4\x20\xa4\x23\x0d\xcb\x59\x02\xfd\xec\xc9\x39\x17\x48\x87\xd8\xa7\xec\x8b\x45\xc5\x1f\xb9\xf6\xbe\x06\x89\x62\xcd\xc7\x6f\xfd\x2c\xe7\xc1\xdf\xe2\x14\xfe\xf2\xf8\x7b\x42\x65\x82\xd3\x93\xe1\x55\x98\x67\x81\x74\x88\x1e\x78\xca\xe2\xd7\xed\x2c\xc8\x56\x3b\x48\x3f\xbd\x7f\xfb\xc5\x63\xaa\x58\xe1\x77\x33\x7b\xd8\xbe\xbb\x7c\xd6\x95\xde\xe8\xeb\x54\x72\xe7\x5c\x20\x1d\xe2\xf7\x25\x9a\x7d\x72\xb5\x8f\xc4\x9c\xc1\x26\x93\x73\xde\x35\xf6\xe4\xeb\xf7\x79\x62\xdf\x4a\x87\xdb\x5f\x12\x70\x26\xf0\x3d\x6e\xfa\x04\x9d\x7b\x00\x48\x07\xdb\x6b\xa2\xfd\x9f\x3d\x00\xf4\xa8\xfb\x9b\x07\x38\xa8\x53\xc6\xe3\x25\x9e\x87\xbe\x2e\xa6\x3f\x73\x67\xb5\x57\xf6\xd3\x91\x79\xbe\x8b\xc6\x90\xba\x18\xb2\xfa\xfa\xfd\xf1\xfd\xeb\xe7\x6d\x07\xd2\x21\x7a\xa0\xea\x85\xe2\xa0\x7d\x4d\x99\x0a\xb5\xc7\x51\x78\x35\x9d\x73\xfb\xb8\xd5\x51\x4b\x9f\xcf\x4e\xe1\x52\x67\xa3\xf2\xf4\x23\x49\xd8\x81\xc0\x40\x3a\xc4\x3e\xdd\x99\x32\xa0\x52\x2f\x53\x7c\xe9\xa2\xf5\xb6\xf2\x84\xc7\x4a\xb1\x8b\x6e\x26\xec\x61\xc6\x23\x99\x51\xe1\x40\xea\x10\x6a\xa1\xe7\xb0\xc3\x2b\x00\x74\x88\x1e\xe8\x62\x7c\x4f\xbb\x90\x8a\x6e\xe4\x1c\x70\xa7\xe9\xe5\x94\x3e\x63\x94\x95\x87\xbc\x83\xeb\x57\x9b\xd8\x3c\x9d\xfc\xf6\x28\x96\x0a\xd8\x52\x39\x00\xdd\x85\xa5\xb8\x91\xab\xe5\x45\xaf\xd8\x0b\xd6\xf8\x50\x3a\x1d\x42\xf3\x06\x09\xcd\x98\xcb\x4f\xcd\x7a\x86\x5f\x17\x59\x4d\xc7\xb8\xa0\x62\x9e\x7b\x00\x48\x07\xab\x03\x00\xe1\x0c\x68\xdc\xf1\xd7\x3b\x2f\x8b\x49\x1e\x28\xe5\xdf\x89\xf2\x1f\x5e\xfe\x29\x21\x26\xff\x2c\xf9\xf2\xf5\xc9\x45\x53\x0b\xfc\x5c\x7a\x2d\x3f\x95\x20\x4b\xd8\x49\xb8\x40\x3a\x44\x0f\x18\x1a\x75\x84\xa1\x9f\x29\x51\x28\x8a\xf3\x12\xd9\x28\x95\x44\xd2\x8b\x56\xb5\xaa\xce\xd4\xee\x2d\x78\x10\x5e\x1e\x96\x7a\x03\xbb\xd8\x1b\x48\x77\xe1\x25\xcd\x12\xce\x8c\xfc\x6a\xcb\x41\x81\x9d\x8a\x51\xbe\x1b\x09\xca\xb8\x36\x6f\xfb\xaa\xc9\x30\x9f\x48\xca\xf5\x2a\x1a\xa6\x40\xd8\x89\x9d\x40\x3a\x44\x0f\xb0\x5c\x2b\x90\xff\x50\x63\x89\xb6\xc4\x08\xb1\x5e\xd2\x09\xb9\x6d\x77\x4f\xb4\xab\x8e\xba\x89\xdd\x2c\xba\x0d\xd5\xb3\x23\xc6\x11\xf6\x42\x01\x40\x87\xf8\x7d\x6d\xf7\x9a\x74\xee\xd8\xf9\xa1\xd3\x44\xf4\xb7\x2d\x6e\x9d\xa5\x34\x2b\x7c\x19\xb5\xb3\x9d\x0f\x0b\x4a\x15\x1b\xad\xe2\xd1\x87\x5d\xab\x02\xa4\x83\xd5\x01\x6f\x80\x70\xa6\xcf\xce\x8e\x43\xfd\x2b\xf0\x70\xbe\x81\xa1\x6a\x48\xe7\x93\x6f\x5d\x74\xd6\xc0\xe3\xed\x33\x77\xba\xb8\x48\x6a\x67\x87\x22\xe9\x3f\xc3\x59\xcd\xbe\xde\x8d\x2b\x3e\x24\x8c\xf1\x16\xd7\xfd\x62\x12\x2a\xdd\x3e\xac\x86\xbd\xc4\xd1\x5e\xf1\x61\xe6\xb6\x3c\x1b\xfc\xc9\x33\xf0\xe7\xf2\x4c\x73\x0a\x88\xb3\x18\xfa\xbc\x0b\xbd\xf6\x7b\xe6\xc2\x2d\x49\xe6\xb4\xeb\x8d\x1d\x23\x56\x89\xfe\x5b\xca\x8e\xe9\xbf\x18\x22\xfe\xd7\xc2\x19\x50\xd3\xfe\xdc\x73\x76\x21\x9c\xe9\xe5\x53\xd6\xfd\x3c\x56\xb5\x7e\xf3\xb6\x48\xef\x2a\xd9\x03\x1d\x6a\x1a\xef\xa8\x5b\x58\xda\x4f\x83\xab\xca\x0a\x30\xde\x3e\x75\xfb\x27\x93\x3a\x17\xc3\x19\x74\xb8\x7d\x7b\xb9\xa4\xb5\x80\xfb\xca\x70\xde\xda\x47\xdf\x03\x41\x71\x8b\xf5\x52\x9d\x7b\xf1\x6d\xf2\x15\xc6\xa3\x02\xbb\xff\x20\x37\x44\xca\x4a\x5e\x0c\x67\x57\x7b\x37\x17\x7e\x6e\xf7\x5d\x21\xfc\x46\x2a\x45\xae\x85\xbb\xbd\x92\x9f\x20\x6e\xd4\x91\xab\x3d\x57\x55\x4e\xf2\x9d\xca\x14\xe5\x9f\xb4\xf6\x62\x38\xe3\xbe\x32\x9a\xa9\xca\xa3\x54\x48\x79\x5a\xc1\xe9\x43\x5e\x48\xc4\x6d\xde\xe8\xc6\x77\x6f\xd3\xb6\xa6\x64\x12\x5d\xcd\x87\x49\xf8\x9f\xb4\xf6\x62\x38\x8b\x4b\xd6\xde\x53\x66\x1b\xd8\x8f\x3d\xca\x17\xfd\x50\x07\x61\x74\x74\x93\x92\x5a\x42\x17\x95\xd2\xbf\xb3\x15\x25\x92\xd2\x81\xf1\xcf\xc2\x19\x90\x89\xfe\x56\x8d\xdb\xf8\xd2\x46\x97\xe5\x19\x4b\x6c\xe5\x4f\x5e\xd6\x81\x46\xe7\x6c\x0f\xb2\x02\xa3\x7f\x32\x1a\xbe\xfe\xf0\xe4\x16\x6a\xed\x06\xf6\x79\x15\x02\xd2\x21\x56\xe3\x3b\x49\xb1\x37\x3f\x3d\xfb\x41\x9d\x73\x7a\x0d\xdb\x2f\xaf\xbf\x44\xfa\xcb\x14\x17\xfa\xf5\x23\x51\xa5\xbb\x4e\xe6\xbc\xb8\xd3\x28\xb0\x1d\xb5\x00\xba\x60\x69\x14\xb4\x3f\xb9\x33\xb5\xbc\x65\x0e\x3c\x65\xc4\xee\xac\xa2\x61\xf4\x5f\x7f\x35\x12\xe1\x0a\x2f\xd6\xbb\xb1\x76\x68\x7d\x31\x72\xc8\x67\xdf\x6f\x3b\xe7\x02\xe9\x10\xbf\x6f\xa5\xe7\x83\xed\x59\x2f\x54\x21\x28\xef\x6d\x1b\x61\x16\xb9\xe8\xab\x8a\x4f\x1b\xe6\x17\x27\xd3\x76\xd7\x8b\xf6\xcb\xb6\x62\x61\xf7\xa7\x01\xe9\x10\xab\x31\x1e\x7e\xae\xaf\x6d\x35\xd1\x2f\x75\x22\x79\x8c\x37\xad\xac\x6e\x62\x4b\x06\x6c\x56\x33\x6e\x1d\x15\x99\x1a\xf5\x33\x6b\x5f\xe8\xcf\xc3\x19\x90\x0e\xb6\xe7\xec\x3f\x87\x33\xa0\x1f\xf4\xdf\x2c\x90\xea\x36\x08\x32\x28\x61\xc8\x52\xac\xbd\xc7\x20\xfb\x90\x74\x2f\x55\x39\x38\xd5\xb9\x86\xdd\x04\x75\x38\xca\xf1\x09\xbd\x20\xec\xad\x26\x90\x0e\xb1\x4b\xb3\xbe\x77\x0a\x39\xe9\xe9\x1a\x92\xf0\x8e\x47\xb6\x3a\xa3\xbc\xa2\x4f\xee\x7b\x75\xf4\xa0\x29\xaa\x18\x84\x5e\x90\x32\x5f\x0d\xdb\xbb\x01\xa4\x43\xb4\x00\x89\x57\x8a\x71\x63\xc8\xd6\x4d\x30\x4d\x94\x4d\x4f\xd7\x86\x5c\x68\xa0\xe3\xd2\xac\xdb\x0f\x7d\xe2\x3e\x16\x81\x9d\x8f\x13\x2e\xe7\x5c\x20\x1d\xe2\xf7\xbd\xf5\x4e\x57\x05\xcf\xcd\xf8\x58\xce\x3a\xad\xae\x48\x63\x33\x22\x8c\x8f\xb2\xf6\xe1\x9e\x47\x67\x6d\xbe\x1f\x75\x15\x76\x21\xec\x40\x10\x20\x1d\xa2\x05\x1e\x79\x5a\x32\x45\xdf\xf0\xf9\xfe\xfe\xc4\x24\x83\xdd\x50\xfe\x91\x55\x61\xaf\xb1\x16\x86\xc2\x3b\x25\x2a\x06\x4a\x62\x19\xa9\x83\xf3\x07\x32\x90\x0e\xb6\xd7\x04\x20\x9c\x01\x55\xd7\xbf\xee\x39\xb3\xea\xd1\xf3\xfc\xa8\x5b\xc1\xe1\xb4\x11\x36\x19\x80\x2f\x97\x8d\xaa\x8f\x4a\xfd\xc5\x6a\xf2\x7a\xdd\xc4\xfb\x94\xc2\x3a\xd8\x5d\x77\x40\x3a\xc4\x3e\x95\xfa\x74\x03\x55\x73\x51\xd5\x56\xf1\xf4\x35\x9f\x7b\x9a\x83\xa8\x9b\x65\x4b\x86\x59\x29\x2d\xb1\x6e\x1d\x81\x72\x2b\x27\x03\x6c\xb9\x24\x90\x0e\xd1\x03\x90\xba\xf0\x6e\x47\xa6\x31\x37\x7b\xb9\xb8\xcd\xeb\xd2\xab\x6b\x04\x3d\x64\x6f\x1c\x6b\xbc\x6f\xa3\x15\xe8\x2f\x07\xff\x9a\x54\x3f\xe7\x02\xe9\x10\xbf\x6f\xec\x6d\xbc\xaf\x94\x54\xfe\x35\x95\xfa\x0e\x99\xa4\x0c\xc2\x10\x66\xb9\x02\xcf\x25\x5a\x11\x87\xb2\xf5\x5b\x2f\x73\x8a\x65\xee\x9d\x73\x81\x74\x17\x06\xe6\x7c\x0f\x86\xd8\xb2\xd8\x27\x46\x4e\x0d\x21\xa5\x33\xd3\x9d\xf1\xbe\x39\x69\xf7\x9f\xaf\x62\xbd\x5a\x9c\xab\xe2\xe8\x9a\x05\xc1\x06\xe6\x00\x3a\xd8\x5e\x13\x80\x70\x06\xf4\xa8\xfb\x9b\x07\xf4\xd5\x22\x9f\xa9\xd0\xa4\x90\x07\x54\x61\x64\x6b\x59\x3a\xa0\x83\x9d\x13\x3f\xe5\x96\x76\x57\xf3\x37\x25\xf9\xb0\x08\x1c\xc3\xee\xe1\x07\xd2\x21\xf6\xa9\x19\xcb\x63\xb5\xa4\x35\x05\x9b\xcf\xc3\xdf\x4c\x05\x37\x7b\xc6\x31\x38\x67\xc2\xa2\x94\xf1\xf9\xb9\x25\xfb\x7c\xfd\xef\xf5\xc2\xee\xb8\x02\xd2\x21\x7a\x60\x25\x0c\xe3\xd3\xc7\xbb\x63\xd4\x79\xf6\x8e\x7e\x96\x89\xf8\xa0\x53\x6d\x8f\x9f\x6d\x0f\x4f\x96\x4e\x54\x74\xf5\xa9\xf5\x0d\x02\xce\xb9\x40\x3a\xc4\xef\x6b\x41\xb1\x8f\x8e\x61\xa2\x6e\xf6\x2e\xe7\x01\x41\xf3\x9d\x7a\x7b\x3b\xba\xbd\xe4\x84\x9e\x65\xde\x0e\x14\xee\xb8\xb1\x21\x37\xd8\xfb\x4a\x20\x1d\xa2\x07\xfc\x72\x1b\x1b\xfb\x2b\x43\x85\xf6\x8e\x83\x64\xac\x87\xcb\x03\x07\x6f\x55\x26\x38\x3a\x7f\xa4\xd0\xa6\x68\xde\xa0\xae\x1f\xff\x75\xee\x01\x20\x1d\xac\x0e\x00\x84\x33\xa0\x71\xc7\xdf\x3c\xb0\x5d\xd1\xee\xdf\x29\xd2\xc2\xfa\xc4\x73\x9b\x43\x24\xe1\x3e\xcd\x3a\x13\x91\x4c\xd1\xf5\x88\xf0\xea\x93\x0f\xa8\x0f\xb3\x7d\x61\x0b\x53\x80\x74\x17\xae\x53\x18\x89\xf9\xcc\x68\x23\x68\xdd\x96\xc6\xd4\x9c\x14\x74\x77\x7e\x2d\x76\x5f\xa1\xb7\x52\x5d\xdf\xef\xfd\xed\xbb\x6e\xd3\x0a\xb0\x25\xa8\x40\x3a\x44\x0f\xa0\x3b\xfe\x18\x12\x2c\x4f\x60\xf9\xe1\x29\x3d\x2f\x53\xef\x67\xff\x36\x26\x73\xdd\x82\x75\x95\x3c\xfd\xe9\x41\x25\xff\x9d\x54\xd8\x95\x1a\x40\x3a\xc4\xef\x4b\x63\x45\x7d\x02\xe2\xa9\x5e\x4d\xa2\x78\x49\x0e\xf5\xb8\x73\x69\x56\xd3\x23\xc5\xd0\x65\xf9\xed\x35\x2b\x4c\x0e\x83\x0e\x7b\xd8\xea\x0c\x20\x1d\xa2\x07\xde\xb2\x59\xd4\x81\x3f\x3b\x59\xf4\x96\xd3\xe3\x53\xd6\xcf\xc4\xd8\xa2\xac\x6f\x1d\xb7\x8a\x31\x33\xef\x86\x37\xdf\x91\xb0\xaf\x3b\xf7\x00\x90\x0e\x56\x07\x90\x85\x33\x93\xff\x2e\x44\x85\xa0\xa3\x81\x82\x65\xc1\x28\x28\x70\xad\x9f\x1a\x85\xde\x59\x76\xf9\xfa\xb8\x21\x6f\xf1\xb1\x33\xc9\x2f\xb9\x51\x97\x85\xd3\xd8\x8f\x22\x75\xee\x1c\xbb\x8f\x23\x0a\xc3\xa8\x02\x0d\xff\x3b\x5d\xb0\x2c\x4a\x20\x3c\xd9\xe6\xa1\x9d\x82\x0a\x05\x7d\x7e\x7f\xe4\xb8\x35\x79\x4f\x96\x75\xbb\x39\x7a\xe1\x1e\x91\x1b\x26\x1a\xbd\x87\x5c\x41\x76\x69\xd6\x39\x19\x48\x17\x2c\x8b\x02\x86\x27\x77\x15\x50\xd9\x27\xae\x68\x0d\x57\x89\x79\xe7\xdc\x6c\xa4\xd0\x4a\x53\x9c\xa5\x37\x77\xfc\xa4\xeb\x37\x2f\x8a\xb2\xdb\x6a\xc9\x7a\x4e\x06\xd2\x05\xcb\xa2\xa0\xc0\x5f\x1c\x6e\xe7\x47\x37\xca\xdc\x72\x28\xfe\x38\xa1\x17\xe2\xea\xae\x3a\xfb\x6c\x80\xeb\xdd\xa4\x74\x10\xe8\x03\x65\x66\x10\x1b\xc1\x84\x5c\xa0\xd1\xff\xa7\x3b\x8b\x57\x5a\x5c\x6a\x6f\x8d\x86\xac\x4f\xda\x88\x29\x26\x1f\x2a\x10\xbc\x52\x94\xbb\xfb\x6e\xfd\x7d\x3e\xaf\xce\x7b\xf6\xe5\x43\xa8\x01\x37\x6a\xfe\xf1\x57\x15\xca\x2c\xf0\x58\xf3\x9b\x7b\xf1\x26\x9b\x1f\x2e\x85\x55\xa4\x4a\x1d\xf6\x0e\x87\x3d\xde\x0c\x7c\x99\x5d\x31\xa2\x7a\x18\xaa\x09\x6d\x76\xd3\x9d\x4e\xef\xe8\x8f\xc8\x2f\x2f\xcf\xff\x3f\x74\xf9\x32\xbe\xc4\xa9\xf4\x44\x08\xca\x31\xcf\x4f\xea\x02\x17\x49\xfc\x89\x62\xe6\x49\x8e\xc0\x81\x7c\x68\xe5\x6e\x5f\x66\xf0\xd7\xdf\xe8\x98\xbb\xc3\xbd\x02\xf5\xf7\xb2\x7a\x4e\xa2\xbd\x94\xb9\x7f\x84\xec\x3e\x7c\x18\xb6\x52\x1f\xd3\xdb\xaa\xf3\xa8\xf8\x86\x74\x7e\x05\xfe\xd0\xbd\xac\x87\x8c\x2e\x83\x1f\xc5\x4d\x04\x3f\xeb\xf1\x58\xfd\x1f\xfa\x36\xbe\x85\x24\x39\x9e\x36\x87\xd9\xde\x93\x84\x70\x6a\x3e\x47\x41\x11\xfc\x57\xc9\x3c\xbe\x8d\x4f\x0e\xfd\xe5\xcc\x2b\xbe\xdb\xfd\x46\x47\x05\xe5\xe5\x64\x68\x18\x71\xd5\xf1\xa1\xb7\xa4\xcf\x17\xba\x0f\xbb\xd9\xbd\x4b\x26\x8c\x5d\x00\x8f\xfa\xbc\xf9\xfa\xa2\xc5\x86\x8a\x97\xd9\xd5\xde\x2b\xe9\xfa\x0b\x89\x37\x24\xf2\xd7\xcb\x99\xfe\x0f\x3d\xcb\x57\xe7\x7d\x75\x17\xf7\x57\x78\xf7\x37\x96\xdd\x1b\x23\x73\x93\xe5\x79\x7b\x24\x03\x31\x0a\x99\x5b\x69\xc1\x26\xac\xd0\x77\xbf\xd1\x39\x46\xf2\x27\x0c\x0b\x6d\xe1\xdf\x62\xd3\x65\xad\x0c\xaf\xe9\xf9\x8d\x44\x4c\x07\x09\x98\xe3\x89\x0f\x8f\x10\x57\xcc\x73\xa5\xf4\xcc\x62\x5e\x9e\x9a\xaf\x22\xb9\x4f\x75\xbf\xbb\x90\xa8\xad\x9f\x0a\xa4\x87\x82\x6b\x6d\xe7\xc8\xc9\xcf\xf9\xc0\xca\xd3\xec\x81\xe5\x9f\xff\x9e\x06\xfa\xff\x3e\xf8\x7a\x79\xa5\xbc\x59\xb2\xae\xf7\xc6\x87\x3c\x03\xcc\xea\x20\x0a\x6c\x1d\xe2\x83\x9d\xa0\xea\x47\xb9\xea\x3f\x5c\x05\x68\x22\x56\x23\x25\x25\x51\x94\x50\x98\xae\x58\xd1\xdd\x3d\x9a\x43\x51\x46\x01\x1d\xa8\xe4\x0b\xbb\xa0\x7d\x7c\x16\x64\x40\xf1\xfb\x3f\x72\x52\xbd\x67\xca\xe5\x50\x10\xfe\xd1\x07\x41\x12\xed\x6b\xd9\x11\xff\xf7\x39\x68\xf6\x0c\x45\x52\x0d\x05\x44\x70\x28\x30\x1e\xcf\xa2\x15\x81\x82\x82\xa2\x86\x02\xf6\xdb\x18\xcb\x45\x33\x6f\x91\x46\x41\x41\x59\xf8\xbf\xd7\x25\xe9\x1b\x2f\x19\x29\xe3\xbc\x7a\xeb\x19\x28\xb2\xa4\x98\x3e\x13\x39\x6d\xac\x08\x3d\x68\xf1\xd1\x15\xe5\xdf\xed\x59\x84\xe0\xe0\xfc\x19\xba\x1b\xc5\xb0\x1e\xd8\x92\x3a\xa6\x93\xed\xe0\xc4\x53\xb5\x0b\x5e\x7a\x84\x35\x5d\xd6\x1c\x6b\x81\x4a\xce\x11\x4c\x99\xa8\xc7\x82\x02\x97\x33\xc9\xc8\x7d\xee\xfa\xf5\x48\x1d\x7e\xf2\xaa\x89\x38\x78\xfa\x30\x83\xff\x31\x6b\x90\x53\x7f\x98\xe6\x47\xa3\xb4\xb1\x5f\xd3\x8e\xdc\x92\x32\x28\xa0\xb9\x3f\xf4\xe4\xa7\xf6\xfd\x66\x39\x39\x0e\xb8\x02\xa2\xca\xc2\x4f\x5f\xaa\x40\x59\x77\xfa\xd2\xb4\x03\x35\x63\xd2\xbd\x3e\x62\xea\x45\xe0\xfe\x21\x0d\x72\xe5\x21\x5b\xb9\xa7\x64\x3e\xd4\x1a\x36\x28\xf2\x8b\x8c\x54\x32\x3f\x68\xc1\xaa\xae\x14\xe2\x54\x5f\xe2\xb4\x31\xd6\xf6\xe7\x91\x38\x72\xf1\x9a\xe3\x7b\x99\x72\x87\xaf\xc5\xbe\x47\x8e\x65\x8b\x75\x53\x84\x29\x5d\x1a\x9f\x2a\xa2\x9e\x36\x2e\xd0\x8b\x4b\x3e\xbb\xf1\x87\xd4\x74\xb8\x5f\x9a\xf0\x93\xc4\x7d\xbb\xce\x47\x16\x22\x95\x67\x52\x31\xfc\x34\x25\xdb\xbe\xeb\xcb\x86\x62\xb4\x56\x42\xf6\xaa\x60\x21\xec\x3c\x72\xf6\x3f\xf4\x14\x4e\x19\xf4\xe3\x1d\xdd\x6b\x16\x51\xd8\x72\xaf\x75\xb0\x08\xae\x98\xe3\x5c\x32\xf5\x28\x5f\xa2\xe5\x26\xcf\x79\x78\xe3\xf5\x94\xe4\x0f\xb3\xff\xae\xdb\x22\xa5\x51\xac\xa4\x51\xac\x02\xf7\x0d\x6e\xa0\x5c\xc7\x04\x11\xd1\xbe\x31\xff\x2e\x73\xa7\x71\x62\x5d\xa5\x7e\x5b\x92\xee\xcc\x11\x6a\x70\x32\xb0\xd8\x7a\xcf\x5d\xe0\xc7\x8c\x39\x51\xf1\x18\xf6\xc3\xc0\x4b\x14\xb4\x28\x28\x28\x60\xda\x7d\xb3\xff\xae\x43\x42\x30\xc0\xa0\x60\x45\x14\x14\xda\xff\xbf\x45\xe0\x46\x17\x9a\xe1\xa4\xfb\x2c\x3a\xfe\x5f\x3e\x69\xa9\x58\x99\x8c\xc5\xa7\x89\xd0\xa6\x87\x4b\xb5\x4a\x7d\x8d\x30\x75\xea\x28\xf2\xe8\x0f\x34\xf9\xef\x74\xbf\xe9\x81\x17\xe8\xb5\x2b\xcd\x1e\xe4\xa8\xf9\x58\xc3\xfa\x27\x4a\x37\x9f\x85\xf8\x7b\x2c\x04\x2a\xa9\x38\x40\x23\xb9\xcc\x34\xdd\xa6\x37\x71\xa2\x02\x6f\xfe\x77\xba\xdf\x74\x14\xb4\xdf\xf4\x40\xa8\x34\x9a\x5f\x3d\xfa\x7f\xf7\x17\x0b\x41\x07\x41\x40\x73\xc1\xb2\x67\x01\x28\x28\x7f\xfa\x98\x49\xee\x21\x45\x49\x7f\xfb\x1c\x9f\xa0\xd9\x5c\xc6\x50\xad\xcc\xeb\x6f\x56\x4c\x36\x3f\xd7\x6b\x28\x09\x8d\x36\x74\x4d\x12\x6f\xfe\x21\x8d\x1f\xe1\x7d\xdb\x43\x40\x60\x61\xad\x5a\xac\x3b\x3c\x76\xb5\x7b\x6e\xfd\xe9\xe2\xba\x23\x5d\x0f\xfe\x63\xa3\x5f\x36\x6f\x26\xff\xbc\x6c\x53\xef\xc9\xcd\xd8\xca\xe6\x34\x47\x07\x3e\xb9\x6c\x8a\xc0\xf8\xdc\xa5\x6b\x25\xbc\x62\x83\x8c\x3a\x52\xa1\xa1\x95\xa4\xc7\x7c\x9b\x7f\xf6\x4b\x26\x0f\x85\x05\x95\x61\xa1\xe4\x56\x93\xc1\x59\x42\xc8\x89\xc4\xd4\xc4\x56\x7b\x84\xf1\xbb\xf2\x44\xd3\x2f\x93\x83\x22\x1e\x7f\x2e\xa0\x2c\xfb\x8a\xb7\x98\x95\x64\x12\xac\x76\x98\xc5\x9a\x98\x66\x4f\xf6\x71\x28\x52\xb9\x90\xc2\x51\xa2\x77\xf5\x17\x8e\xf8\xcb\x6f\x7f\x4e\xbb\x57\x84\x1c\x28\xe2\x0a\x1c\x0c\x74\xd0\x65\xc4\x38\xa0\x8d\x78\x89\x0d\x77\x9a\xe8\xf2\x24\xcb\x8b\x39\x9e\x6c\xdf\x9c\xf9\xb3\x59\x7d\xfe\x58\x35\xfc\x93\x02\x1e\xaf\x7c\x2a\x7f\x30\xf5\x50\x10\x66\x84\x3e\xe7\xb8\x11\x58\xa4\x92\xca\x70\xe9\x95\x64\xe1\x94\xe3\x1f\xd2\x4f\xb7\xd7\x1f\x46\xd0\x3e\x36\x62\x2c\x0a\x3b\x9a\xaa\xe5\x7c\x30\xc5\x59\x76\xea\x25\xad\x14\xf8\x5e\x10\xd2\xff\x56\xb9\x96\xf7\x0f\xa9\x7c\xae\x69\xb0\xf0\xb0\xe1\xc0\xd2\xcb\x2f\x1f\x5f\x25\x24\x31\xcb\x0a\x58\x5e\xf9\xa4\x93\xfe\x88\xe7\x96\xdd\x58\x17\xe5\xd7\x3f\xd7\x82\x07\x8a\xca\xe2\xcc\x7e\xe7\x57\xbb\xfa\xe9\x9e\x3d\x73\xd2\x5b\x4d\x3b\xb5\xef\x63\x6e\x0b\xfb\xfa\xb5\xb3\xea\x15\xbe\xe5\x34\xa8\x7f\xae\xf6\x55\x6c\x0f\x39\x69\x7a\x52\x72\x89\x46\x2e\xf7\xbb\xcf\xdc\x8f\x58\xce\xf2\xa4\x22\xc1\x0d\xad\x4f\xc5\xf9\xd7\x0c\x89\x1c\x6e\xff\x39\x4e\x2a\x2e\xaa\x60\xe8\x4c\xda\x90\x79\x20\xef\x56\x9a\xde\xd0\xc2\x97\x1d\x1a\xac\xf9\xfc\xdd\xfb\x78\xea\x17\x2e\x65\xbf\x58\xfe\x3c\xc8\x38\x4e\x42\x72\x70\xab\x7e\x00\x64\x09\x11\x56\x99\xb1\x74\x60\x6a\x8a\x26\x2d\x68\x0a\xc3\x4f\x5f\x9e\x44\xcb\x16\x90\x45\xbf\xff\xe7\xb4\xae\x12\xee\x53\x26\xf4\x9e\xcf\x11\x3e\x24\xa4\xb7\xa5\xf0\x37\x3a\xd0\xc8\xe6\x14\xdd\x07\x19\xbc\x70\x33\xfd\xf9\xa2\xd8\x86\xfe\x0c\x56\x6b\x22\x33\xd8\x65\x1a\x98\xf4\x12\x3b\xac\x13\xb1\xc7\xd3\xb8\xf3\xb1\x09\xed\x26\x42\xec\xd0\x30\xcf\xa0\xaf\x51\x55\xdc\x81\x49\xc4\xff\x9d\x05\x83\x65\xcf\xce\xce\xce\x02\x93\x69\x9f\xa0\x5c\x1a\x67\x31\x60\x46\x01\x05\x2d\xa0\x42\xbf\x82\x69\xc3\xaf\x3c\xaf\x60\x57\xbf\xec\xb6\xd6\xda\x9b\x16\xad\x65\xc5\xdd\x12\x7e\xdc\x32\x98\xdb\x16\xc5\x83\xbd\x82\xad\xfc\x45\xda\x02\x0a\x01\xcd\xa1\x50\xa0\x5c\xc9\x83\x48\x2a\xa2\x80\xf7\x72\x7e\xff\xe4\xa5\x51\x40\x92\x92\x28\x92\x4f\x40\xf0\xa8\xea\xa5\x63\x9a\x54\x2d\x61\x56\xba\xa9\xf4\x60\x57\xd4\xca\xa8\xbb\xef\xb4\x22\x7d\x66\x59\x73\xaf\x5b\x92\xfd\x8c\x4e\x22\x15\x83\x42\x40\xf3\xc8\x50\x60\x78\x54\xbe\x6f\x87\x3b\xb1\x18\x9d\x64\xbe\x71\x49\x6e\x86\xeb\xba\x2c\x81\x53\x4a\x05\xda\x5e\x1f\xe8\x7a\xf5\xfe\x4f\x52\xf6\x33\x43\x28\x04\xb4\x80\x0c\x85\x0a\x8f\x4a\xd0\xb0\xf1\x95\x7c\x68\x6d\xab\x48\xca\x8d\x2f\x3e\xd9\xee\x4c\x20\x9d\x9a\xc0\x3a\x0c\x6e\x89\xa6\xa2\xa6\x31\x91\x6c\xbf\x03\x85\x80\x16\x91\xa1\xd0\xe0\x51\x0f\x65\xc2\x63\xea\x74\xb8\x6a\xf9\x56\x47\x7d\xd9\x9b\x78\xb1\x5d\x5f\x0f\x9c\x34\x91\x8a\x9f\xe5\x38\xba\x88\xbc\x95\xf2\x61\x85\x42\x40\x4b\xc8\x50\xe8\xf0\x28\x89\xdc\xa0\x8c\x5c\x86\xa1\x5b\x5f\xc7\x39\x5a\x8b\x31\xb7\x7e\xf2\xc9\x5e\x51\x6c\xdd\xb0\x57\x11\x5b\x4a\xa6\x7d\x9e\xf1\x59\x00\x0a\x01\x2d\x23\x43\x61\xc0\xa3\xd6\xfb\x39\x76\x16\x3e\xe5\x37\x44\xe6\x8e\x16\x3e\x53\x7d\x66\x92\x34\x83\xe1\xc8\x24\x3b\xd1\xf2\x28\xc9\x30\x9e\x2f\x9a\x1a\x13\x0a\x01\xad\x20\x43\x5d\x82\x47\xb1\x6e\x87\x53\x47\x67\x16\xcf\x74\xf8\x1f\x88\xf2\x3c\x79\xac\xb8\xa6\xd3\x86\x81\x2e\xa1\x8e\x2b\x61\xe0\xd8\xc0\x6a\x6b\x62\x0f\x85\x80\xbe\x20\x43\x61\xc2\xa3\x0c\xda\x47\x3a\xbb\x1a\x9b\x9b\x37\xa3\x6b\xc2\xbf\xd6\xb9\x83\xa9\x98\xd9\x18\xdb\x29\x04\xa2\x3b\x43\x7f\xd0\xef\x93\xb6\x62\x40\x21\xa0\xaf\xc8\x50\x58\xf0\x28\xfc\x8a\x8f\x46\x22\xbf\x38\x0e\x34\xa9\x9c\x4b\xf4\xc7\x1c\xa0\x25\xd6\xc9\xfd\x43\xe1\xf1\x25\x7b\x1c\x3a\x1c\x97\xbe\x82\xd0\xa0\x10\xd0\x2a\x32\x14\x36\x3c\x6a\x6f\x7c\x4f\x7b\x32\x0d\xdd\xaf\xf7\xd6\xcc\xa3\xe0\x60\x9b\xa4\xeb\xf6\x06\xf2\x35\x2e\xac\xa6\x3b\xa0\x43\x29\x7e\x79\x7e\x27\x28\x04\xb4\x86\x0c\x85\x03\x8f\xba\xc3\xfa\x6c\xa2\x12\x27\x38\x59\x43\xcb\x93\xdf\x90\x2d\x68\xa0\x3f\x90\x2f\x7c\xf4\xd6\xf4\xfb\x04\x5c\xaf\x56\x8d\xb6\x51\x0e\x28\x04\xb4\x8e\x0c\x85\x0b\x8f\x1a\x3b\x19\x7e\xd9\xc1\x87\xce\x47\xf5\x96\xfb\xa1\x45\x10\x57\x08\x84\xcb\xa0\xa3\xd4\x21\x3c\xe3\x53\xa7\xde\x5d\x4f\x94\x7d\x7e\x28\x04\xf4\x0d\x19\x0a\x0f\x1e\xe5\xc0\xa0\xfa\xcb\xc4\xc8\x42\x33\x19\xfa\xc0\xc0\xbd\xad\x93\xe8\x00\x1b\xbb\x72\x85\xf5\x56\xbe\xa0\xf8\x18\x4f\x8d\xa2\x87\x1c\x14\x02\xda\x40\x86\xba\x0c\x8f\x6a\xb6\x10\x99\x67\xf1\x2d\xc9\x27\x0c\x54\x8e\x4c\x88\xc7\x68\xae\x7e\xf3\x32\x9e\x80\x01\xfc\x81\xd8\xe8\x6b\x60\x0d\x45\xb5\x11\x14\x02\xda\x44\x86\xc2\x87\x47\x5d\x13\xb0\x4c\x72\xc9\xb7\xb8\xa3\x3b\xc4\xc2\x83\xca\xad\x38\xd6\x60\xa2\xa5\x80\x13\x6a\xae\xb6\xc0\xae\xbd\xcb\xac\xfa\x5c\x05\x0a\x01\x7d\x47\x86\x22\x80\x47\x91\x49\x7b\x0d\x0b\x92\x24\x46\x3e\x60\x5a\x3c\x36\x6a\xd6\x1a\x2e\x47\xe1\xed\xf1\x54\xd8\x54\x2c\xfa\xb9\x80\xfa\x6b\x26\x9f\x12\x0a\x01\x6d\x21\x43\x11\xc2\xa3\xbe\x83\xb2\x6f\x3d\x78\x25\x7b\xca\x69\xf7\xe8\x26\x5d\xca\xeb\x54\xdd\x58\x75\x8e\xe5\x7d\xdd\x19\x0b\xe7\x57\xcb\x1f\xe2\x25\x85\xa1\x10\xd0\x36\x32\x14\x11\xc2\x6f\xf0\xa0\x80\xd1\xe3\xad\xbc\x48\x81\x5b\xef\xca\x8a\x3f\x89\xbb\x10\xc3\x9c\x07\xd9\x5d\x70\xd7\x63\x35\x07\xe5\x00\x1a\x41\x41\x28\x04\xb4\x83\x0c\x45\x0c\x8f\x32\xd2\x7e\x61\x82\xf3\xfd\x71\xa0\xca\x4f\xac\x21\xda\x15\x27\x3f\x55\xdd\x5d\xab\x95\xfc\x4c\xa2\xd6\xc8\x2c\xd7\xb7\x59\x19\xe2\x50\x08\x68\x17\x19\x8a\x04\xe1\x2f\xf8\xa2\x6f\x27\xd6\x77\xfa\xf1\x87\xb1\x9e\x4e\x5f\x33\x1b\x76\x9f\x1c\xad\x8a\xb4\xc1\x3e\x16\x5c\x26\x08\xc4\x97\x62\xf0\x77\x03\xf7\x90\xa1\x48\xe1\x51\xbc\x83\x44\x51\xca\xe6\xa3\xdf\xef\xb0\xb9\x34\x71\x6a\x5a\x76\xde\xba\xc1\xb1\x86\x37\xf4\xd6\x84\xdb\x6f\x3a\x8d\xa2\x49\x11\x05\x0a\x01\xfd\x40\x86\x22\x83\x47\xb5\x7b\x8f\x24\x49\xa2\x8d\xb4\x8c\x9d\x12\x8b\x73\x64\x75\xdb\x5b\x38\x96\x7d\x5d\xfa\xa4\x1c\xa2\x55\xc5\xdb\xa9\xed\x21\xcd\x05\x85\x80\xf6\x91\xa1\xae\xc0\xa3\x20\x97\x1d\xcc\x71\x93\xbb\xa9\xb3\x1c\x5a\xe9\x9d\xb3\x0f\xa5\x03\xb7\x9a\xeb\x14\x2a\xf8\x5e\xd2\x7e\xeb\x77\x46\x55\x4c\xb1\x81\x42\x40\x07\xc8\x50\xe4\xe4\xf0\x2c\x45\x0e\xd1\xd9\xbb\x9c\x21\xae\xe2\xd2\xf8\x04\xe8\x0c\x36\x64\x39\x85\x0e\x97\x93\xf0\x8e\x65\x3e\xaf\x0f\xb0\x3c\x88\xa3\xfe\x6d\xf7\x43\xa4\x2c\x08\x3c\xab\xf5\xd5\xda\x66\x5b\xa2\xe8\xd2\x25\x01\x5c\xe3\xe2\x60\xb0\xb7\x37\xeb\xd5\x6a\x2e\x27\x92\xde\x70\x4a\xd0\x75\xda\xa4\x7a\x55\x28\x04\x74\x84\x94\x45\x01\xcf\xd2\xc8\x14\x74\x1c\x8e\x18\xe6\x12\xd5\x2e\x8d\xdd\x79\xfc\x92\xeb\x48\xeb\x6c\xb6\xfd\xca\x2a\x4b\x5a\x8f\xf3\x53\xe9\xb1\xac\xdf\xbf\xe8\x63\xa4\x2c\x4a\x78\x96\x35\xe4\xf4\xb6\xae\x36\xad\xd7\x8d\xca\xcf\x44\x34\xf4\x61\x87\xfe\x91\x77\x99\x9f\x54\xde\x95\x0a\x2b\x6c\x53\x0c\x36\x8e\xe3\x85\x42\x40\x27\x48\x59\x54\x08\xe6\x8a\x69\x60\xfb\x15\xac\xa5\xeb\x96\xf2\x8d\x5e\xaa\x4e\x5f\xbe\xeb\x61\xb6\xde\xc0\x08\xd1\x73\x2a\x1a\x7d\xa9\x05\xa1\xc0\xdb\x50\x08\xe8\x27\x52\x16\x35\x3c\x8b\x3e\xa7\xe5\x11\xed\xfd\x9c\x96\xd5\x38\x9b\xd4\x70\x5e\xd3\x99\x72\x86\x59\xf9\x19\xcb\xdb\xee\xe6\x3b\x9a\xa7\x1d\x21\xcc\xbf\x1f\xf7\xbf\x90\xb2\x68\xe0\x59\xc9\xd6\x72\x12\xfa\x8b\x16\xa7\xd8\x85\xa6\xd1\xc7\xdb\x41\x9c\x83\x4e\xeb\x7c\x14\x6f\x9f\xa3\xd6\x52\xf3\x13\x95\x78\x9c\x10\x41\x21\xa0\x53\xa4\xac\xab\xf0\xac\xec\xa3\x60\x59\x67\x71\xdc\x68\xd2\x71\x6a\x32\x96\x2f\x9f\x19\x6b\xcc\x1c\xdd\x39\x59\x2d\x8d\x7c\x71\xda\x5d\x7b\x27\x25\xee\x42\x21\xa0\x33\x24\xac\x32\xe2\xff\x6e\xc0\xff\xff\x06\x66\xe4\xb4\xf0\x1f\xfe\xa3\x96\x99\x11\xad\xb6\x36\x1f\x15\x87\xa9\xb6\xb2\x5c\x9f\xe2\x81\xd2\x51\x6a\x40\x01\x01\x34\xb3\x08\x35\x77\x65\x69\xc2\x05\x0a\x01\xa3\x20\x6d\x08\x1d\x42\x07\xbf\x7f\xe5\x4d\xcc\xe9\x85\x79\xe5\x16\xe6\xd5\xa8\xec\xe3\xd4\x1b\xa8\x79\xbc\xc2\xb5\xbc\xd8\x5e\x6f\xb9\x0b\x88\x71\xd5\x15\xa0\x10\x30\x08\x29\x8b\x1e\x9e\x25\xdb\x6d\x89\x26\x7d\xfb\xa3\xa9\xb5\xf6\x72\x02\x1f\xf4\x55\x04\xce\xa5\x87\xa4\xf2\x5e\x89\x84\x10\x86\x62\xce\x95\xbc\xb1\xfb\x50\x08\x18\x8c\x94\x75\x0d\x9e\x45\x77\x38\x2a\x49\x4d\x3d\x3b\xc0\x93\xf0\xce\x4d\xf7\x01\x8e\x9e\xf6\xc8\x84\x77\xcc\xdd\xc7\x3e\xde\x86\xb3\x81\xa1\xa9\x44\x20\x28\x04\x8c\x8a\x94\x75\x1d\x9e\x75\x75\x5d\x37\x09\xdd\x23\x7a\xe7\x27\xc4\x26\x2d\xd1\x6b\x84\x68\xef\x85\xa0\x56\x2a\xd5\x51\x18\x8d\x99\x0f\xdf\xa5\xfd\x56\x08\x14\x02\x46\x43\xca\x62\x80\x67\xd9\xae\xdf\xdd\xfd\xf8\xac\x29\x89\x4a\x6a\xa2\x66\x50\xdc\x04\x4c\xb8\x26\xb9\xac\x88\xdd\x48\xd3\x1f\xcb\x67\xc8\xc6\x1a\x8a\x03\x85\x80\xd1\x91\xb2\x6e\xc0\xb3\x9e\x16\x06\x3a\x55\x4e\xda\xbf\xd0\x62\x60\xec\x6d\x55\x7f\x1b\x6b\xf4\x68\x52\x1a\xaf\xc5\x7c\x62\x87\x50\xba\x3d\xd6\xd4\x8a\x06\x0a\x01\x63\x20\x65\x31\xc2\xb3\x06\x2b\x17\x52\x6d\xad\xb0\xc9\xbf\xfe\x64\x37\x9e\x15\x62\x1d\xc5\x69\x83\x52\xdb\x6d\x90\x2f\x7b\xdb\xe9\xe5\x2d\x60\xbe\x66\x86\x42\xc0\x97\x90\xb2\x98\xe0\x59\x52\xfa\x66\xe6\xf8\x55\xe3\x14\xeb\x38\x0f\xfd\xb5\x88\x30\xad\xe4\x67\xfd\xa4\x33\x7d\x8a\xd7\x6e\xda\x05\xb4\x77\x99\x94\xfe\xf6\x04\x26\x52\x16\x33\x3c\xeb\x81\x28\x8a\x1c\x43\xb2\x10\x81\xef\xbd\xb4\xc2\xc3\x30\x56\x42\xdc\x74\xb1\xbd\x06\x79\x55\x34\x79\xa5\x20\xf2\x1b\x0d\xa8\xa6\x50\x08\x18\x0b\x29\x8b\x05\x9e\xf5\xa9\xdb\xe1\x9e\x9e\xb3\xf3\xeb\x1e\xde\x22\x87\x18\x75\x41\xc1\xfd\x6b\xc9\xb2\x39\xef\x26\xf4\xbd\xe2\xca\x1b\x4d\xaa\x9f\x71\x41\x21\x60\x6c\xa4\x2c\x56\x04\x4f\xd0\x61\x87\x59\x5a\x31\x1b\x74\xed\xa3\xee\x09\x8a\xd5\x55\x58\x56\x2c\x11\x5b\x3f\x26\xe1\x2c\xdd\xb8\x24\x4b\x77\xb9\x9e\x1b\x0a\x01\xe3\x20\x65\xb1\xc1\xb3\xde\x84\x24\xd2\x74\xa3\x87\x5e\x4a\xff\xb6\x97\xc4\x55\x52\xbd\x66\xc4\x7a\xe4\xaa\xce\x7e\x97\x39\xcd\x4e\xec\x04\xbd\xbc\xc4\x11\x0a\x01\xe3\x22\x65\xb1\xc3\xb3\xb4\x1b\xf1\xe3\xcd\x33\x49\x89\x5e\xf5\x3d\x8c\x6a\x89\xc7\x51\xf4\xdc\x93\xcf\xcf\xeb\xfe\x3c\xed\x3a\x73\xd6\x2a\xe2\x00\x51\x82\x42\xc0\x78\x48\x59\x1c\xf0\x2c\xc7\x4c\xcd\x48\xaf\xfe\xd0\x1c\x12\x31\xb1\x47\xf6\xe4\x0a\xb8\x98\x99\x1d\x79\x01\x65\x7c\x42\xf6\x31\xd5\x84\x90\x5e\x3b\x30\x14\x02\xbe\x8c\x94\xc5\x09\xcf\x62\x64\xc0\xed\x5a\x3e\xbd\xa2\x64\xdf\x37\xf1\x15\xb5\x79\xe0\xab\xe3\x5d\x94\xb9\xed\x54\xca\x25\x71\xb0\x9c\xaa\x71\xea\x99\x14\x14\x02\xc6\x47\xca\xe2\x82\x67\x79\xca\xb3\xa4\x0a\xec\x0e\xb6\xf9\x0b\xd1\x19\x5c\xda\x52\xff\x81\xe6\x53\x3e\x35\x11\xc5\x35\xdd\xdc\x41\x29\x8a\xa7\xf9\x53\x1a\x0a\x01\x13\x20\x65\x71\xc3\xb3\xde\xb7\x7d\x74\xa9\xa7\x48\x65\x2c\xe3\x1d\x4a\x37\xce\x9d\x60\x04\xa7\x27\x12\xc5\xfb\x09\x49\x9d\x54\xf5\xb8\x9e\xf5\xb8\x28\x43\x21\x60\x42\xa4\x2c\x1e\x84\xbf\x23\xa7\x70\x7a\x58\x3b\xaa\x6d\xd1\x87\x98\xb7\x3f\x1d\x37\x0f\x4e\xe8\xc6\x5e\xb6\xd0\xd6\x91\x2c\x39\x42\xd3\x38\xaf\x41\xac\xa1\x10\x30\x11\x52\x16\x2f\x3c\xcb\x0c\x2f\x7a\xb6\x6a\x23\x67\xea\xb3\x52\x6c\xd1\x17\x7c\xb4\x90\x8a\xb9\x71\xa1\x0a\xab\xc7\xa6\x5c\x0c\x43\x1e\x81\x75\x1c\xe6\x50\x08\x98\x18\x29\x8b\x0f\x9e\xe5\xfe\x9c\x2d\x1f\x44\x85\x49\x5c\x6e\xe4\x7f\x45\x3e\xce\x33\xe4\xf6\x93\x4e\x4a\xb6\x9b\xab\x18\x5d\xcf\xde\x0a\x3e\xa6\xc8\x21\x80\x42\xc0\x24\x48\x59\x37\xe1\x59\xc7\x63\xb7\x46\x9a\x98\xaf\x85\xb7\x07\xcd\x0b\x48\xb1\xf2\x92\x37\x33\x88\x67\x28\x18\xee\x70\xc4\xd1\xdf\xcf\xd2\x03\x97\x38\x41\x21\x60\x52\xa4\x2c\x7e\x78\x96\x29\x9e\x76\x6f\x46\x85\x0c\x3e\x7f\xb7\x80\xcf\x95\xd8\x3b\xdb\x44\x5e\xbe\x12\x3f\xaf\x63\xc9\x90\x5f\x73\xc2\x59\x34\xee\xd0\x80\x42\xc0\x64\x48\x59\x02\xf0\x2c\x39\x9f\xb7\xaf\x3a\x3d\x28\x30\xfc\xe4\x32\x47\xb3\x8c\x78\x58\x7b\xf3\xed\xfa\x9e\xda\xcc\x59\x7a\x38\x6f\x43\xaf\x73\x88\x52\x40\x21\xe0\x2b\x48\x59\x82\xf0\xac\xee\xa3\xac\x8f\x57\xfb\x06\x25\x38\xf9\xc6\xb2\xaa\x8a\x48\x7b\xd8\x52\xc5\x75\x89\xfc\xea\xa2\xf8\x6f\x3d\xbc\xd4\x1c\x6c\x8c\x0f\x85\x80\xc9\x91\xb2\x84\xe0\x59\x7e\x56\x34\xf6\x53\x50\xf4\xcc\xdd\x1c\x1a\xa5\x90\xe3\x67\x7e\x68\xad\xac\x1f\x99\xf7\xdc\x65\x3d\x16\x15\xab\x44\xa6\x55\x0c\xa1\x10\x30\x04\x29\x4b\x18\x9e\xc5\xb1\x5a\xa1\x46\xe0\xd8\xa8\xd9\xfd\x4b\x6c\x49\x86\x73\xe8\x2d\x06\xae\x75\xe0\x27\x23\x1a\xfd\xf6\x91\x5c\x1c\x46\x36\x4a\x16\x28\x04\x4c\x81\x94\x25\x02\xcf\x12\xcf\x24\x2a\x5f\xdf\xfc\xc0\xff\xfd\x4a\x84\xc2\x9c\x1b\x85\x94\xef\x93\x1c\x67\x74\xf1\xb8\xae\x0e\xf7\xa8\x6a\x21\x19\xdf\xdf\xbf\x47\x4a\xa4\x2c\x51\x84\x81\xe4\xad\x04\x49\x12\x8c\x35\x66\x3a\xc1\x0d\xec\x67\xf4\x94\x35\xf6\x4f\x28\x4a\x2c\xe5\x51\x07\x57\xbb\x55\x41\x6d\x79\x61\xbf\x9f\x8f\x54\x48\x59\x62\xf0\xac\x6f\xb6\x96\x64\x35\xdb\x8a\x67\xf6\x58\x9b\xbc\xda\x25\x55\x12\x83\x21\x4a\x3c\xd8\x1f\x6f\x70\x3d\x7f\x68\xda\x7c\x89\xdb\xc8\x18\x0a\x01\x53\x23\x65\x89\xc3\xb3\x30\x0d\x45\x71\xb7\x1e\x3d\xf1\x3f\xb2\x50\xef\xb9\xf7\x83\xcc\xea\xd7\xb8\x2b\xb6\xbe\x88\xc3\xdd\xe5\x9e\xac\xf0\xd0\xc6\xa0\xdf\x7f\x47\x1a\xa4\x2c\x09\x78\xd6\xb2\x1b\x18\x6a\x2f\xd0\x7e\x6a\x54\x6e\x3b\x58\xa3\xee\x64\x3f\x67\x37\x49\x79\xe5\xb3\x4c\xfe\xf8\x33\x95\xd7\x45\xe5\x2d\xf4\x50\x08\xf8\x2a\xc0\x80\x0d\xe8\xb5\xeb\x1f\x03\x36\x49\xf8\x0f\xd7\xa5\xfb\xf2\x55\x01\x85\x78\x96\x6b\x50\x33\xda\xf4\x96\xa7\x2b\xe6\x86\x9f\x8d\x55\xb4\x47\xb9\xed\x4a\x7c\x07\x1b\xcd\xf4\x35\x28\x04\x4c\x8b\xb4\x21\x52\xf0\xac\xc6\xbe\xf4\xd9\xfb\x5c\xae\x03\x16\xdd\x54\x71\xa0\x20\xeb\xab\x2c\x3f\x9e\x63\x0d\x35\xb4\x5c\xbe\xf2\x8a\xc3\x9d\x7c\xca\xf7\x0a\x14\x02\xa6\x43\xca\x92\x86\x67\xb1\x93\x10\x67\x6a\xa3\x93\x11\x93\xb3\xb2\x62\x1d\x54\x2f\x05\x98\xdb\xbd\x38\xa0\xcf\xa2\x92\xfd\xe0\x94\x3b\xf3\x15\xea\xa7\x07\x85\x80\xe9\x91\xb2\x64\x10\xde\xf1\x31\xbb\xa0\xb3\xd4\x26\x5f\x99\x0c\x95\x80\x74\xf5\x2f\x04\x30\x06\xdc\xd1\xb8\x4a\x62\x39\x1d\x95\x3d\x8a\xfd\x6b\x57\xe3\xf7\x60\xe6\x1a\x52\x96\x2c\x3c\x2b\x77\x22\xeb\x46\x70\xe6\xca\x51\xff\x41\xd9\x8a\xf9\xb4\x59\xbe\x02\x27\xaa\xb3\xd1\x8b\xcf\xc7\xfa\xa3\xed\x3f\xe7\x5e\x60\xfd\x7e\x70\x5d\x47\xca\x92\x83\x67\x99\x4c\xe2\xf1\xd1\x3c\xbf\xbb\xce\x2c\xbd\x75\xc7\xea\x31\xae\xf4\xb7\x36\x43\xd9\x87\x3e\x43\xea\x5f\xb2\xa9\x0c\x03\xf8\xde\x5c\x86\x42\xc0\x0c\x48\x59\xf2\xf0\xac\xcd\xce\xe9\x5c\xd4\xec\x64\xc1\x25\xce\x41\x39\xac\xc2\x63\xa2\xc4\xa2\x1c\x56\xd4\x48\x46\xdf\x81\x3b\x97\xf9\xd9\x8c\x74\xf0\xa0\x10\xf0\x0d\xa4\x2c\x05\x78\x16\xf3\x01\x7f\x72\xea\x42\xa1\x3f\xbe\x4a\x43\x33\xc6\x67\x07\xbd\x37\x66\x16\xf7\xec\x35\xab\xf4\x70\xf0\x2e\x5f\xcb\x78\x2e\x69\x03\x85\x80\x19\x91\xb2\x14\xe1\x59\xd8\x73\x44\x50\x16\x16\x9c\x44\xa2\xc7\xf4\x4e\x52\x75\x0e\x14\xb9\x44\x1c\x0f\x1e\x36\x53\xec\xdf\xf4\x92\xb7\xea\x14\x0d\xa0\x84\x42\xc0\x4c\x48\x59\x4a\x08\xfd\x95\x68\xff\xda\xc5\x5d\x7f\xde\xa8\xe2\x1d\x99\xcb\x37\x16\x69\xc5\xc7\xf8\xf7\x44\xa9\xc2\xed\xa8\x6e\xbe\x1b\x26\xf1\xb6\x21\x82\x42\xc0\xcc\x48\x59\xca\xf0\xac\x28\x31\xbc\xcf\x96\x2d\x38\x56\xf6\xf3\xc7\x39\x35\x1f\x5e\x3f\xf4\x37\x51\x46\xc5\x32\x55\x3b\x94\x7a\xff\x74\x89\xa5\x88\xd6\x0e\x0a\x01\xb3\x20\x65\xa9\xc0\xb3\x3a\xed\x4b\x19\x83\x2d\xb2\x23\xc8\x1b\xa7\x58\x9d\xd1\x20\xd7\x70\xa5\xe5\xbc\xf4\x40\x62\xdb\x32\xc6\x32\x4d\x43\xad\xc2\xb4\x50\x08\x98\x15\x29\x4b\x15\x9e\x15\x52\xc9\xee\x74\x23\xe5\x1e\x7f\x17\x89\xbb\x1e\x85\x31\x0d\x8a\xe8\xd1\xaa\xc1\x9d\xc1\xf0\x38\x7c\x1b\xca\xc8\xce\x97\xd6\xae\x50\x08\x98\x0d\x29\x4b\x0d\x9e\xe5\x55\xa0\x9a\x76\x9b\xc2\x84\xbb\x36\x07\x24\x5c\x2b\xad\x0b\x4d\xba\x73\x9f\xd9\x20\xc8\x09\x74\x75\xbe\xc5\x05\x15\x3f\x8a\x1d\x0a\x01\xb3\x23\x65\xa9\xc3\xb3\x18\xfc\x8e\x2a\x73\xe7\x1a\xbb\xb9\x29\x45\x09\x64\x77\x79\xfd\x96\x45\x7d\xe2\xb3\xdb\x12\xd7\x3e\x39\x4e\x93\xd1\x90\xbc\xe2\x84\x42\xc0\x1c\x48\x59\x1a\xf0\x2c\xdf\xf4\x8f\xea\x49\x86\x62\x0e\x98\x60\xa6\xf0\x34\x0d\x0a\x31\x1b\xff\x1b\xf5\x31\xe3\x01\x1e\x5c\x03\x11\xdf\x7c\x1e\x5f\xfd\x5d\x27\x38\x91\xb2\x34\xe1\x59\x81\x64\xa4\x86\xfc\x15\x8f\xb2\xd5\x79\xe9\xaf\x7c\xed\xf2\x27\x66\x26\x12\x1f\xd9\x1a\xfc\x8c\x89\x31\x6d\xb7\x76\xe7\xc6\xd4\xef\x3a\xc1\x85\x94\xa5\x85\xf0\x6e\x0d\x85\xda\xbb\xf2\xcd\xe5\x2a\xce\x9e\xd8\xf6\xcc\xc4\x56\x27\x0d\x0c\x3f\xc7\xf9\xf7\xd9\xa4\x35\x46\x3b\x6d\x67\xa1\xca\x5a\x50\x08\x98\x1b\x29\x4b\x1b\x9e\x85\x32\xa7\x86\xa1\xfc\xd8\xe4\x78\xb6\xab\x34\x8e\x80\x59\xb9\x02\x1d\xb7\x5d\xc7\x7d\xcf\xe3\xd8\xb1\xa7\xdc\x38\xf7\x7b\x28\x3a\x14\x02\xe6\x41\xca\xd2\x81\x67\x3d\x6e\x2a\xbb\xc9\x17\x6b\x7e\xc9\x6f\x62\x40\x54\xe6\x31\xe5\xed\x69\xdf\x86\x38\xcc\xee\xe7\xe5\x11\x8c\x44\x3e\x93\xa1\x07\xd4\x50\x08\x98\x17\x29\x4b\x17\x21\xf4\x68\x77\x27\xd7\x2c\x48\xd6\xa1\xab\xfe\x10\x56\xab\x3e\x2d\x94\x9b\xac\xee\x99\xd3\x64\xe8\xe9\x1b\xb0\x14\xbc\xf5\xb4\x89\x03\x0a\x01\xf3\x21\x65\xe9\xc1\xb3\xba\x86\xdb\xa5\x55\x4c\x9d\x56\x5f\x3e\xf4\x20\xe9\x8e\x98\x91\x3c\xc5\x0c\xc5\xb3\x7c\x92\x88\x75\x43\xb5\xe9\xd0\x67\xa2\xf2\x77\xe8\xb9\x89\x94\xa5\x8f\xf0\xd6\xe2\x53\x9a\xdc\x65\x91\x7b\x0e\xf8\xfb\x3a\x0d\xc3\x0d\x28\x5c\x6c\xef\xfb\x1b\x43\x53\x25\x3b\xee\x95\x2d\x70\xd6\x09\x0d\xde\x85\x42\xc0\xfc\x48\x59\xb7\x10\x06\x20\x62\xc9\x36\x2c\x67\xfc\xa7\xa1\x5f\xab\x46\x32\x5e\xa4\x77\x4b\x29\xd2\x60\x25\x0a\x31\x4f\xe3\xe2\x75\x6d\x4c\xe8\xdd\xf8\x5d\xbf\x04\x90\xb2\x0c\xe0\x59\xce\x4a\x12\xfe\x05\xa4\x82\xb3\xc2\xed\x38\x55\xe0\x66\xcd\x93\x17\xc6\xd9\xac\x21\x09\x11\x1b\x97\x76\x63\x6e\xe7\x12\x70\xfd\x7e\x38\x0b\x22\x65\x19\xc2\xb3\x3e\x9c\x0a\x1e\x6a\x7c\x10\xff\xc6\x27\x53\xe6\x84\xea\x6c\x53\x4e\xca\xf7\xc1\x7d\xd7\xd9\x81\x4a\x8d\xbb\xfb\xc7\x9e\x2f\xd7\xef\x7a\x2f\x84\x94\x65\x84\x30\xad\xe3\x22\xc6\xe6\x43\xed\x6e\xa4\x99\xc6\x8e\x1f\x7b\x2d\x53\x73\x9c\xa8\x9b\x52\x9a\x6e\xb2\x95\x03\xc7\x64\xaa\x8b\x97\xe4\xf7\x6f\x5b\x18\x29\xcb\x18\x9e\x15\x41\x4b\x7e\xf5\xc0\xa9\x54\xdf\xac\x26\xa9\xfc\xa7\x75\xf8\x77\xd5\x60\x61\x03\x0c\xd1\xe6\xd9\xb5\xbd\x9a\x8c\xf0\xb1\x6f\xbf\x6b\xa1\x08\x52\xd6\x6d\x78\x56\x69\x22\x07\x2b\x78\x40\x5d\x8a\x5a\xea\x74\x63\x97\xe9\x79\x69\xf1\x06\xf6\x77\x71\x6f\xfb\x72\xb5\x6b\x4b\xf7\xae\xf5\x6f\xa2\x41\x21\x60\x51\xa4\x2c\x13\x84\x36\x7a\x75\x0e\x78\xe0\x62\x28\x4a\x07\x71\xdf\x3b\x01\xb5\x4f\x8e\xe7\x6c\x19\xe7\xb6\x36\x6a\x93\x95\x4e\x6d\xa1\x54\x3b\xda\x43\x21\x60\x31\xa4\xac\x3b\x08\x03\x6f\x45\xdf\x6c\x2c\xff\x57\x09\xdd\xe9\xfa\x54\xcf\x59\x4b\x03\x4a\xc8\x1c\x96\x54\x54\xf4\xc4\xc1\x67\x82\x36\xd6\xc9\x9d\x64\x50\x08\x58\x1c\x29\xeb\x2e\x3c\xcb\xea\x99\xd3\xc3\xc7\xcf\xad\xbf\x33\x93\x62\x2e\xb4\x36\xb9\xb2\xfa\x79\xf6\x5d\xe6\xdb\x92\xcc\x48\x71\xdf\x51\x6b\xa6\x46\xbf\x07\x85\x80\x25\x00\x06\x6c\x40\x93\xdf\x7f\x0c\xd8\x4c\xe1\x3f\xbc\x00\x9b\x72\x36\x0e\xdf\xc5\xfb\xb5\x31\xbe\xcb\xdb\xb2\xfb\xa4\xf5\x27\xac\x27\x98\x66\x32\x58\xf2\x87\x8d\xdc\xe5\x37\x72\x15\xa0\x10\xb0\x24\xd2\x86\x98\xc1\xb3\xaa\x42\x53\x3f\x58\x50\x0f\x66\x9c\xb5\x7e\x27\x64\xf4\xd6\xcf\x48\xe9\x91\x96\xa2\x5f\xa8\x66\xc7\x6a\x7f\x70\xbf\xc8\x70\xed\x77\x82\x90\x42\xca\x32\x47\x78\x7d\xfc\x6c\xcf\xf1\x70\x3c\xcb\xa1\xee\x66\x5b\x0f\x49\x35\xcb\xa5\x1f\xf4\xdf\x92\x47\x5e\x8c\x35\x34\x9a\xbc\x0f\x15\x7a\x4b\xfe\xdb\xdc\xd2\x48\x59\x16\xf0\xac\x38\x51\x55\x1e\xbc\x21\x6f\xb3\xc2\x16\xc7\x9f\x31\xc9\x68\xc2\x49\xdf\xef\xee\xb7\x6c\x1b\x8f\x62\xab\x2e\xbd\xb7\x0c\xb5\xfa\x9d\x9c\x65\x90\xb2\x2c\xe1\x59\x6b\x3f\x5b\x54\x68\x2f\xd3\x55\x32\xd2\x89\x76\x55\x1a\xea\x6e\xbe\x27\xae\x1e\xa6\x97\xf8\x30\x23\xc6\x98\x54\x5b\x79\x42\xfb\x3b\x8d\xc8\x22\x65\x59\x21\x14\x83\xa6\x26\x95\xe7\x86\xd2\xfc\x97\xee\xa8\x63\x12\xd0\x54\xa6\x15\x45\x78\x10\x3f\x61\x6c\xc3\xe7\xbc\x1a\x42\xc4\xcb\xc9\xfb\xbb\xb0\xc8\x21\x65\x59\xc3\xb3\xf4\x8d\xa6\xe9\xd0\xc7\x04\x94\x63\x2b\xc6\xb9\x92\xd1\x99\xc4\xdd\x88\x0c\x77\xbe\x11\xdd\xdc\x3c\xd8\x16\x79\x98\xf9\x4a\xea\x77\x82\x90\x47\xca\xb2\x81\x67\xdd\xe0\x3c\x1c\x74\x80\x7e\x2c\xa2\x28\x8a\xbf\xca\x3b\x40\xf7\x29\x75\x61\xb5\xdd\x6f\x97\xbd\xfd\x7a\x80\xb5\x9d\x05\x77\x39\x0a\x14\x02\x56\x40\xca\xb2\x45\x48\x82\x7e\x36\xca\x97\xd5\x9b\xa4\xb2\xe7\x0f\xf5\xbe\x38\xf1\x6f\xb5\x8e\xeb\xf6\xf4\xf7\x99\x1e\xa7\x90\x2e\x06\xcb\x05\x72\xfc\x7e\x38\x2b\x22\x65\xd9\xc1\xb3\x1a\xca\xf6\x3b\x06\xb7\x0f\x17\x48\x8b\x25\x37\x57\xec\xd5\x2b\x3f\xde\x04\x33\xb9\x8a\x91\x39\xb0\x36\xbe\x08\x79\x59\x3e\xf8\x3b\xbd\x29\x21\x65\xd9\x23\xbc\x69\xf8\x98\xf5\x33\x26\xfa\x29\x19\x6b\x21\xd5\xf8\x7b\x83\xc4\xc0\xa9\xb3\xb7\x14\x0d\x83\x6e\x2d\xe8\x18\x9f\x71\x18\xdf\xa9\x0a\x40\x21\x60\x65\xa4\x2c\x07\x84\xe9\xaa\x77\xb5\xa8\x02\x28\x07\x19\x86\x83\xdb\x5b\x34\xf4\x46\x42\xa2\x4c\x7e\x87\xa1\x81\x73\x04\x86\x4d\xbb\x66\xdf\x9f\xc5\x72\x43\x21\x60\x15\xa4\x2c\x47\x78\x16\x96\xd2\xf4\xfb\xc8\x1d\x2c\x55\xbb\x38\x63\x83\x9f\xa9\x61\x5b\x57\xd4\xf3\x05\x47\xf5\x0b\x0e\xd9\xb8\xaa\x44\x88\xd5\x0a\x7f\x0f\x4a\x55\x91\xb2\xee\xc1\xb3\x8a\x53\x6c\xba\x67\xf3\x06\xf2\xcc\xc4\xc1\x1d\xf9\xa1\x49\x6d\x44\xa4\x8c\x0f\x62\x12\x37\x7d\x2d\x7f\xb5\x39\x98\x06\x8f\xff\xf6\xaa\x1a\x52\x96\x13\xc2\xdb\xa7\x3c\x39\xb2\x19\xe2\xae\xb1\xdb\xc3\x44\xe0\x0c\x5a\x59\xfd\xf0\x7b\x96\x42\xe5\xd6\xe3\xe6\x38\xa6\x95\xc7\x95\xaa\xe1\x42\x50\x08\x58\x1d\x29\xeb\x3e\xc2\x1b\xc9\x66\xbe\x1f\x67\xc2\xf9\xd7\xd7\x6e\x11\x8d\xe8\xb3\x96\x0a\xc8\x25\x3b\x30\x89\x88\x28\x1a\xc7\x5b\xd8\xb6\x38\x4a\xc4\xbb\x40\x21\x60\x0d\xa4\x2c\x67\x78\x56\x91\x16\x6b\xb0\xbe\x68\x28\x4f\xc3\x5c\x8c\x5e\xf3\xab\xb1\xae\xda\xc2\x59\x83\x03\x11\xae\xd9\x31\xa8\xce\x82\x90\xc3\x96\x3a\x14\x02\xd6\x44\xca\x72\x81\x67\x65\xe9\x10\x4c\x07\x52\x1b\xed\xa9\x09\xe6\x70\x0c\xde\xdc\xe0\xc6\xb4\x72\x97\x7f\x60\x3e\x36\x9e\x3f\x18\x78\xd2\x7c\x23\x9f\x01\x0a\x01\x6b\x21\x65\x3d\x40\x08\xc2\x2f\x4f\x1c\x96\xb6\x8c\x98\x20\x39\xd4\xa5\x1a\x92\x5e\x83\xe3\x53\xd2\x1a\x64\xcb\x63\xa9\x2f\x0f\x49\x9e\x6d\x64\x46\x0b\x43\x21\x60\x6d\xa4\x2c\x57\x78\xd6\xcd\xcb\x9c\x62\xba\x5e\xb2\xab\xee\x75\x9d\x5a\x3f\x05\xd8\x12\xef\x0e\x2c\xdb\xdb\xce\x7e\x10\x8c\x28\x9e\x46\x5b\x0e\x33\xf9\xed\x55\x1d\xa4\x2c\x37\x84\x85\x04\x0b\xd1\x1b\x0f\xad\x97\xee\x2d\xfa\xdc\x37\x6d\xbc\xc7\xc9\xb1\x2d\x53\xd8\xeb\x9a\xea\x45\x48\xa8\xd0\x6e\x63\xcc\x41\xf4\x00\x0a\x01\xeb\x22\x65\xb9\x23\xbc\xf9\xbb\x5a\x90\xe1\x3a\x21\x3b\x5b\x9f\xf2\x79\x21\x03\x9b\x6f\x4d\x93\x70\x24\x83\x74\xd0\x88\xed\xea\xda\xcd\x1e\x97\xf2\x90\xfb\x50\x08\x58\x0f\x29\xcb\x03\x9e\x35\x87\xc5\x5b\xca\x2c\xec\x0a\x66\x1c\x61\x73\xc9\xfd\x72\xbd\x89\x8a\x74\x47\x17\x7d\xe7\x1d\xa3\x35\xfa\xcd\x1a\xca\x26\x12\x53\x28\x04\xac\x8f\x94\xe5\x09\xcf\x1a\x22\xd0\xdd\x7c\x48\xab\x94\xcd\xfe\xbc\x8c\x51\x24\xcd\x27\x54\x6e\x7a\xb3\x7d\x24\xe5\x61\xe6\x2d\xc1\x69\x65\x3b\xf2\x9f\x82\x50\x08\xf8\x16\x52\x96\x17\x3c\x4b\x6c\x4d\x76\x9d\xdb\x8e\x3d\x3c\x25\xf5\xb6\xa2\xfd\x29\x0d\x59\xdc\xea\xe3\xeb\x5f\x32\x9c\x98\xf9\x04\x27\x35\x93\x3e\xbc\x67\x86\x42\xc0\x06\x48\x59\xde\xf0\x2c\x8c\xd4\x4f\xd6\x39\xc2\x9e\x7a\x81\xe3\x45\xda\xae\xf7\x08\xc1\x75\xfd\xe8\x0e\x21\xa2\xa4\x37\xe7\x65\x88\xbf\xdb\x33\xfa\x5b\x41\x21\x60\x43\xa4\x2c\x9f\xff\x1f\x6b\x7f\x1e\x4e\xd5\xfb\x37\xfe\xdf\xd6\xde\xe6\x79\x8c\x53\x83\x29\xa2\x14\xa1\x4c\x11\x4a\x99\x67\x19\x32\x53\x99\xc9\x18\x45\x96\x64\x4c\xa6\x42\x86\x8c\x51\x99\xc9\x94\x84\xcc\x24\x94\x79\x4e\x44\xe6\x59\xa6\xdc\xc7\xfe\x5e\xbf\x8e\x9b\x75\x5d\xeb\xdb\xe7\x77\xdf\xd7\x71\xbc\xff\x3c\xdf\xcf\x6d\xdb\xe7\x5e\xeb\x75\x6e\x7a\x38\xdc\x6a\xe6\xe7\x2d\xf2\xf8\x9d\xe3\xb8\x14\x90\x49\xfa\xd5\x78\x72\xd6\x23\xdd\x75\xa2\xc1\x6c\xf8\xf2\xc0\xee\xe8\x76\x1e\x6f\x08\x35\x0c\x30\xfa\xa8\xad\xfb\x87\x5b\x74\x84\x0d\xa5\xbe\xa4\xec\x61\xb6\x7d\x5d\x2d\x35\x7d\x2a\x64\x20\xf5\x62\x1a\xcf\x64\xf3\x05\x7e\x95\xcb\x24\xb0\xcf\x53\x5b\x18\x60\x6e\xa2\xb6\x1e\x1c\x6e\xb5\x8d\xfb\xb9\x46\xa4\x75\x25\x6d\x8b\x24\xd7\x15\xea\x75\x0e\x74\x7f\xfd\x70\xb4\x2b\x65\xb3\x71\x55\xc8\xb1\x99\xd7\x49\x15\xb7\x27\x0c\x50\x5b\x5e\x88\x03\x41\x90\x68\x5c\xdd\x58\xca\xd8\x93\xcf\xa1\xa6\x3f\x74\x9f\x31\x26\xc3\x8d\xc9\x7b\x92\xd6\x81\xe7\x42\x0a\x9c\xe8\xbb\xf3\xa5\x60\x80\x31\x44\x6d\x79\x1f\x6e\xed\xeb\x5f\xf9\x12\xa5\x36\xb0\x19\x7e\xcd\x97\x81\x4d\x3d\x72\x5f\x2c\xd6\x62\xaf\x9a\x56\xad\x8c\xa3\xb1\x72\x50\x75\x52\xe4\x0a\x0c\x30\x46\xa8\xad\x87\x87\x5b\x22\x3f\xc2\xba\xaa\x36\xaf\xb2\x48\x7c\xb1\xf5\x35\xdd\xb9\xf1\xd4\x94\x25\x65\xed\x73\xbb\x61\x72\x75\xfb\xc7\x15\x75\x9e\xaf\x18\x18\x60\x8c\xff\x31\xb0\xfd\xeb\x57\x10\x0f\x0c\x6c\x3e\x87\x1f\xfc\x24\x77\x56\x67\x9d\xe1\xf1\x2f\xa2\x74\xca\x7b\xd5\xa5\x8b\x7f\xce\x1d\x8b\xa0\x54\x6e\xd7\x08\x33\xa5\x6e\x24\xa9\x9b\xcc\x30\x83\x01\xc6\x04\xf5\x89\xc0\x87\x5b\x94\xda\xcf\xf6\xd8\x17\x24\xbc\x2e\x54\x6b\xbd\xd8\x1e\x16\x9b\xba\x78\x66\x15\x2b\x59\xbf\x62\x4b\x4d\xdf\xf7\x96\x9d\xdc\xf7\x06\x0c\x30\xa6\xa8\x2d\xdf\xc3\xad\xcd\xd5\x64\xfa\x52\x79\xce\xcf\x97\xbe\x9f\x9e\x73\x19\xe7\x1a\x67\x2c\x2f\x2c\x98\x77\xea\xe7\xba\x36\x3b\xcf\x99\x98\xa1\x26\x00\x03\x8c\x19\x6a\xeb\x11\xe2\xc2\x12\xbe\xfa\x54\x31\x8e\xac\x75\xcf\xb2\xf3\x31\xcb\x4b\x99\xae\xbc\xa9\x4a\x75\x75\x05\xda\xf6\x15\x66\xc7\x67\x27\xbf\xdd\xc7\x9d\x9c\xcd\x51\x5b\x7e\x88\xe7\xe8\x12\x78\x8d\x5e\x20\xfc\xe7\xf6\x0c\xff\xef\xd7\xe0\xe6\x3c\x69\x3d\xe7\x26\x63\xc5\x3b\xfa\xd3\xbb\x06\x5f\x33\x9a\x5f\xe2\xa6\x7e\x0b\xd4\xd6\xe3\xc3\xad\x96\xc8\x87\x1d\x3f\x43\x0a\x65\x77\x4f\x4b\xbd\xfd\xb6\x52\x11\xec\xad\xb0\x53\xbd\xef\xb1\x2b\xff\x78\xf9\x6a\x12\x1b\x69\x9d\x3d\x0c\x30\xb7\x50\x5b\xfe\x87\x5b\x21\x71\x65\x84\x39\x93\x92\x51\xcb\x4a\x93\x77\xbf\x4d\x4d\x7e\x3a\xbb\x1d\xc6\x21\x72\xc1\x96\x39\x3f\x4a\x89\x86\x9a\x90\x1d\x77\x43\xbd\x8d\xda\x0a\x38\xdc\x52\x67\xe9\x10\xf0\xd9\x1c\xfc\xbd\x6b\xee\xad\xd4\x93\x77\x33\xc6\x85\xe3\x67\xfa\xfb\x69\x8d\x4d\xc9\xee\x11\xab\xb5\xc2\xc2\x93\x30\xc0\xdc\x41\x6d\x05\x1e\x6e\x39\x2c\x57\x3e\xf2\xf2\xe4\x6d\x38\x27\xf2\x02\xb8\x32\xbf\x7d\xeb\x8b\xad\x9c\x3a\x65\x16\x98\xe0\x7b\x6d\x7a\x65\x69\x6c\x5d\x19\x06\x18\x4b\xd4\x56\xd0\xe1\x16\xd3\x67\x8e\xa1\x91\x41\xd9\x8c\x9d\x89\x95\xcf\x54\xbe\xc6\x01\x3f\xb7\x92\x62\x3e\x2a\xf7\x1c\x8b\x3e\x3f\xc7\x19\x93\x17\x72\x14\x06\x18\x2b\xd4\x56\x30\xe2\xd3\x27\xee\x3b\x2d\xf7\x05\xdf\x06\x7f\x36\x54\x49\x72\x95\xdc\xc6\x3b\x4a\xdd\x9a\x3d\x7d\xf2\x14\x28\xc8\x72\x3f\x31\x53\xfb\x80\x1f\x06\x18\x6b\xd4\x56\xc8\xe1\xd6\xef\x19\xd3\xbb\x65\x9d\x12\x24\x8f\x7f\x92\x37\xf0\x25\x79\x91\x35\xdd\xcb\xd0\xe6\x0a\x8b\xe7\x50\xbc\x34\x1d\x92\x70\xd2\x11\x77\x50\xb1\x41\x6d\x3d\x39\xdc\x12\xca\xd4\xbf\x18\xb3\x79\xd1\x4e\x8e\xe3\x8a\x40\x84\x8f\x81\x9c\x0a\xcb\x14\x4b\x47\xe4\x94\x88\x75\xee\xb0\x89\xff\x44\x0e\xee\x22\x65\x8b\xda\x0a\x3d\xdc\x0a\x30\x23\xfe\x79\x82\xfe\xe6\xac\x57\xe2\x46\x3c\xad\x3e\x6b\x3d\x65\x5f\x98\xbb\x93\xf5\x96\x2a\xb5\xb0\x43\x83\xf8\x4d\x49\x16\x18\x60\xec\x50\x5b\x4f\x0f\xb7\xc6\x8d\xb3\x87\x2c\x73\x2b\xb3\x57\xf9\xaf\x05\xb5\xe5\x41\xf7\x96\x43\x05\x3c\x49\xda\xce\xbf\x71\xfd\x71\xeb\x6c\xf6\xb6\xc1\x09\x18\x60\xec\x51\x5b\x61\x87\x5b\xdc\x06\x31\x7a\xbe\x54\x3b\xf9\xcc\x01\x5e\xcb\x95\xb5\x70\x87\xc0\xc2\xa7\x59\xff\x25\xeb\xfb\x7b\xd4\xb0\x7a\x98\xe2\x4d\xdc\x69\xd7\x01\xb5\x15\x8e\x18\x40\xcc\xae\x80\x2f\x4b\x21\xc7\x12\x9b\xf9\x5c\x22\xac\xf0\x80\xb5\x7b\xfc\x23\x26\x75\x4f\x7a\xd7\xd2\xfb\x72\x97\x8d\x5e\x3b\xc2\x00\xe3\x88\xda\x8a\x38\xdc\xda\x95\xb4\xb3\x4d\x2d\xf3\xff\xf9\xb5\x51\xe9\x18\x67\x22\x49\x97\x98\x00\x3d\x7e\x3c\x2d\x29\x63\x78\x98\x82\x21\xe9\x85\xeb\xb8\x43\xcf\x5d\xd4\x56\xe4\xe1\xd6\x87\xe2\x0a\x17\x1d\x2a\x6a\xa7\x5f\xcf\x79\xa2\xce\x32\x9a\x9b\x8e\xaf\x3f\x89\xd5\x8c\x3d\x31\xff\x38\xa0\xf3\x4c\xde\x89\x3d\x79\x18\x60\x9c\x50\x5b\x51\x87\x5b\x2f\xe5\x9d\x7b\xdb\x2b\x0b\xe9\xdd\xdf\xb5\xdd\xb3\xe7\x3e\x16\x0b\x08\x99\x9f\xc6\xee\xfe\x30\x31\xad\x8f\x52\xc0\xbb\x30\xa2\x0a\x03\x8c\x33\x6a\xeb\xd9\xe1\x56\x5c\xca\xfb\xe6\xbd\x82\x4a\x99\xcb\xa2\x83\x3c\x2e\x0b\xfe\xc0\x46\x5b\x77\xba\xf7\x03\x76\xbb\xed\xcf\xf0\x23\x9b\x2f\x47\x2f\xc0\x00\xe3\x82\xda\x7a\x7e\xb8\x25\xfc\xc9\x7b\xbd\x5c\x26\xd9\x4c\xf1\xeb\x4f\x56\xf2\xc6\x0d\x9b\x04\xb2\xbb\x83\x1e\x9c\xdb\xcf\x7f\x25\x6d\x5c\x72\x23\x7e\x2c\x07\x03\x8c\x2b\x6a\x2b\xfa\x70\xab\xc7\xc1\x7d\xf6\x44\x43\xd5\x2b\x1e\xb5\xfa\xf2\x8b\xf5\x05\x2d\xa7\x8b\xdc\x7e\xf9\x6e\x3d\x9e\x27\xb6\xc6\x27\x93\x8b\x97\xc4\x0d\xde\x6e\xa8\xad\x18\xc4\xc1\xce\xcd\xaf\x62\x32\xaf\x8a\x55\xee\x65\x59\x4e\x88\x13\x17\x1f\x56\x58\x45\xa3\xb7\xfb\x9b\xcd\x6d\xcb\x88\xf9\x2b\x51\x6a\xb8\x03\xba\x3b\x6a\x2b\xf6\x70\x2b\xac\x6d\xea\xac\x3c\xc7\xb1\x5d\x82\xf7\x41\x25\x6f\x19\xd7\x2a\x6d\x49\xcf\xa9\xc4\x32\x89\xd8\x2f\x0b\xbd\x33\xab\xf9\xf8\x15\xf7\x7e\xbc\x87\xda\x7a\x71\xb8\x85\xdd\x8e\xd2\xf5\x12\x5d\xd4\x90\x52\x7e\xa5\xac\xaf\xf8\xd5\x40\xe2\xfe\xd7\x10\x0e\x4f\x27\x5f\x7f\x11\xbd\xb5\x59\xe5\x1a\x41\x18\x60\x3c\x50\x5b\x71\x88\x7b\x87\xb6\x27\xdd\xac\xc4\xbd\xaa\x6c\xcd\xab\xf2\x5a\xaf\xd3\x4d\x03\x06\x4f\x9d\x79\x46\x3d\x59\x43\xd6\x62\x76\x35\x3d\xe7\xbb\x24\x0c\x30\x9e\xa8\xad\xf8\xc3\x2d\x7b\xe1\x17\x7b\x39\x78\x96\xce\x54\xfe\xce\x32\x74\xb3\x81\x15\x2f\x95\x18\x5c\xaf\x88\x18\x7f\xcd\xf4\xf1\xf6\x9f\x25\x48\xc2\x7d\xbf\xee\xa3\xb6\x12\x10\xbf\xca\xf4\x5e\xc6\x33\x5d\x54\xf7\xec\x0b\xcd\x7c\xc2\xa4\x9b\x3e\xe7\xd8\x14\xe6\x7a\x52\xc2\x9b\xf8\x9f\xb1\xde\xb7\x7e\x3f\x52\x89\x7b\x0f\x3d\x40\x6d\x25\x1e\x6e\x15\xcf\x2b\x6e\x34\x34\xac\xc9\x15\x7b\x87\x2d\x5f\xde\xfd\x2c\x5b\xf6\xba\xe8\x4f\xf6\xd7\x23\x19\x6f\xab\xbe\x7d\x49\x6b\x1a\x22\x87\x01\xc6\x0b\xb5\xf5\xf2\x70\xeb\x55\xb4\x04\x14\xc5\x43\xdb\x37\x40\x5f\xd7\xef\x0e\xa6\x12\x37\xbc\xd7\xf6\x97\x4c\xef\x33\xc5\x1a\x18\x7e\xd8\x5c\x4c\x30\x85\x01\xc6\x1b\xb5\x95\x74\xb8\xf5\x22\x39\x6f\xfc\x68\xa8\x7b\xd0\xd5\xe8\x66\x69\x3e\xa3\xea\x7b\xc9\x1f\x15\x14\x1f\x75\x7f\x4b\x9a\x25\xbe\x6d\x14\x13\xf4\x09\x77\x5d\x7d\xf8\x8f\x81\xed\x5f\xff\x10\xe4\xc0\xc0\x96\x8c\xf8\x39\xb1\x49\xf0\xe5\xc8\x57\xed\x34\xdf\x23\xea\x1e\x36\x8a\x3b\x52\x27\x54\xbd\xbd\xae\x28\xa5\x68\xeb\x2a\x42\xed\x42\x5d\xf6\xc3\x02\x06\x18\x1f\xd4\x27\x92\x72\xb8\xa5\xd4\xbb\xe1\xfc\xbd\x99\x2a\x2d\x2f\x27\x46\x69\xe6\x8b\xc6\xa2\x75\xcf\x5d\xf3\x7b\xa2\xa2\x7e\xe5\x3f\x2a\xd4\x9f\x3c\xe4\x66\x84\x01\x06\x46\x6d\xa5\x22\xde\xc0\x37\x7f\x4a\x0b\xed\xc8\x18\x70\xb2\x0a\x6a\xd9\x9d\xd2\xf1\xbe\xf0\x68\xff\xc5\x3b\x13\x26\xbd\x72\x5d\x55\x86\x62\x06\x6e\x2b\x18\x60\x7c\x51\x5b\x69\x88\x4f\xc5\xf2\x39\xee\xa6\xf8\xfd\xc1\xab\x7b\x6f\x0e\x7e\x65\xca\xea\x0a\xc5\x51\x88\xfb\x97\x64\xb7\x74\x92\x04\x7f\xdc\x12\x0a\xa7\x84\x01\xe6\x11\x6a\x2b\xfd\x70\x8b\x83\xfd\x88\x57\x3f\xbf\x00\x89\x70\x81\x8f\x59\xdf\x11\xc7\xbb\xba\x19\xf5\x77\xe9\xfa\x7b\xa7\xdc\x9e\x59\xb5\xff\x7e\xe6\x43\x03\x03\x8c\x1f\x6a\xeb\x15\xe2\x54\x59\x12\xb2\xb0\xb5\x57\x14\x58\x14\x6f\x47\xbe\x21\x31\xbf\x59\xf5\xda\xed\xfc\x5d\x35\x8d\xa3\x42\x74\x78\x02\xae\x8f\xd7\x71\x03\xc8\x63\xd4\x56\xc6\xe1\x56\xe7\x8d\xa2\xd2\x46\x61\x8d\x8f\x94\x6f\x76\x4e\x46\x6f\x50\xdd\x12\x2a\x23\x6b\x6c\x13\x1b\x71\xda\xb9\xd0\xa3\x33\xf0\xea\x37\x03\x0c\x30\xfe\xa8\xad\xcc\xc3\xad\x2b\xcf\x53\xeb\x8f\x58\x57\x08\x5c\xd0\xd4\xf9\x54\x37\xc3\x1b\xe8\xfd\xe7\xc5\xb1\xf2\x32\x76\xd6\xcf\xe3\x73\x8c\x9a\x76\x2e\xb8\x61\x39\x00\xb5\xf5\x1a\x71\xb3\xa9\xdb\xf6\x69\xb5\x79\x2e\xb8\xa4\xf4\x63\xc3\x98\xb3\x11\x90\x9b\x6f\x12\x76\x5f\x2c\x78\xe6\xdd\x5a\x3a\x4c\x24\x71\xde\x12\x06\x98\x40\xd4\xd6\x1b\xc4\x8d\x3e\x56\xb0\x65\x2b\x24\x99\xa2\xff\xb6\xae\x33\xf1\x23\xf8\x67\x20\xfd\x91\x8e\x18\xf6\x8d\xf0\x7b\x73\xd6\xe9\x82\x6e\x7d\xb8\x93\x60\x10\x6a\xeb\x2d\x62\x4f\x14\x2c\x56\xce\x67\xbf\x8b\x1e\x7f\xca\x21\x5c\x41\x56\xa0\x02\xff\x5e\xe8\x1e\x10\x19\x19\x11\x0e\x60\xce\x9e\xe1\xae\xc5\x0d\x20\xc1\xa8\xad\x2c\xc4\xf7\x5e\x76\x7c\x85\xc3\x3c\x50\x5c\xd0\xec\xec\xf6\xa4\x54\xb1\x73\x15\xa1\x69\xe8\xe8\xf1\x88\x12\xaa\x62\x7c\xfe\xfc\x8d\x00\x56\x18\x60\x42\x50\x5b\xd9\x87\x5b\xc7\x8f\x0e\xb7\x8e\x1a\x55\x5f\x28\xbd\xfd\xb0\x2c\xc9\xd5\xb5\xac\xe1\xa1\x18\x35\x39\xc9\x8e\x79\x16\x1f\xfb\xf4\x4f\xf3\x71\xdc\xe0\xfd\x04\xb5\x95\x83\xf8\xd1\xb6\xfd\x58\xdf\x09\xda\x4f\xea\xac\xd0\xbb\x73\xf4\x99\x8e\xbe\xcf\x9d\x63\x96\x6b\x35\xc5\x28\x13\xef\x93\x7a\xf3\xb7\xe1\x1b\xc1\x00\x13\x8a\xda\xca\x3d\xdc\x62\xbd\xb1\xc9\xb3\xe4\x73\x6e\xf2\xda\x11\x29\x10\x22\x5d\xf1\x64\x9c\xb7\xb3\xd8\x4b\x41\xa6\xa7\x3b\x41\x90\x71\xfd\x75\x0e\x6e\x28\x7d\x8a\xda\xca\x43\x1c\x2e\x7e\x8d\x5c\x91\xe1\xd4\x78\x6d\x16\xe9\x58\x66\x18\xa4\x16\x75\x84\x17\xa2\x22\x3a\x62\x9a\x1c\xf4\x4a\x7d\x9b\xbc\x8f\x1d\x77\x51\x0f\x43\x6d\xe5\x1f\x6e\xed\x4c\xf8\xa5\x52\x1d\x73\x0d\x8e\xb9\xf4\x25\x83\x7e\x69\xae\x2c\x59\xd0\x3a\x36\x5d\xdc\xfe\xe1\x9e\x66\x47\x6a\x61\xd7\x8e\x16\x0c\x30\xe1\xa8\xad\x82\xc3\xad\xc7\x74\x4f\xe4\x58\xb3\x7a\x4e\x51\x3d\x37\xe4\xac\xc9\xd0\x53\x85\xf0\xe8\xdb\x75\x13\xa6\x78\x62\x38\x95\x2c\x19\x4c\x2c\x4e\xc1\x00\x13\x81\xda\x2a\x44\x0c\x6c\xb2\xa9\xcf\x9b\x8b\x26\x14\x30\x67\x2d\x69\xf7\xb9\x7f\xa5\x99\x63\x78\xce\x7e\x78\x03\x5f\xe4\x59\xcb\x83\x1a\xa3\x8b\xf8\x60\x80\x89\x44\x6d\x15\x21\x7e\x27\xeb\xcd\xac\x72\xb7\xb4\x58\xb9\xca\x25\x8d\x4e\x07\x72\xc6\xb4\x1b\x44\x77\x4e\xde\x19\xb4\x1a\xe2\x2b\xba\x25\xd2\xe9\x5f\x72\x19\x06\x98\x28\xd4\xd6\xbb\xc3\xad\xa3\x6b\xec\x2f\x6f\xd9\xa6\xf0\x6e\x3a\x17\x11\x98\xff\x94\x38\x3b\x3a\x92\x1e\x36\xcb\x69\xa2\x12\xff\x78\x22\xeb\xd3\xf2\x3b\xdc\x8d\xeb\x19\x6a\xab\xf8\x70\xeb\x18\x5b\xe5\xed\x98\x41\x83\xe1\xd2\x5c\x8c\x58\xd0\xa9\x73\xb2\x41\x8b\x42\x04\xd3\x86\x9b\xe6\x21\x9a\xfa\x18\xff\xa5\x5a\x3c\x18\x60\x9e\xa3\xb6\x4a\x0e\xb7\x88\x98\x68\x7f\x54\xd3\xa4\xdf\xce\x11\x02\x2f\x7e\x53\xcc\x2f\x9d\x13\x3b\x42\xb8\xda\x45\x7f\x92\xef\xf5\xbb\xad\xf8\x58\x49\xdc\x61\x3f\x1a\xb5\x55\x7a\xb8\xb5\x3c\xfd\x94\x9e\x23\xbc\xa1\x9d\xb6\xec\xb4\xd4\xb9\x4d\xbc\x31\x8e\x42\xfd\x3f\x09\x6c\xb6\x62\xdb\x1e\xc7\x7f\x64\xba\x50\xe1\x5a\x31\xa8\xad\xb2\xc3\x2d\x45\x8f\x84\xaf\xe6\xa4\xf6\x7a\xd1\x1a\xa1\x61\xa4\x22\x6e\xec\xdf\xa6\xea\xbf\x55\xae\xe1\x7f\x18\xef\x4a\xde\x77\xba\x35\x76\x1a\x06\x98\x58\xd4\x56\xf9\xe1\x16\xdf\xda\xb7\x3b\xfd\x24\x45\x97\x6f\x32\xbc\x2a\xec\x67\xbb\xf6\xb2\xf0\x74\x3f\x3e\x58\x37\xa0\x13\xdf\x9f\xfd\x8a\x5f\xdc\xca\x05\x03\xcc\x0b\xd4\xd6\xfb\xc3\xad\x15\x5f\x62\x01\x31\xdf\xe7\xf7\xde\x24\x2a\x52\x77\xe6\xb5\x0f\xf6\x5b\xc4\xf0\xd0\xf1\x96\x4f\x39\x67\xdd\x56\x1e\x50\xd2\xc4\x5d\x27\xe2\x50\x5b\x15\x88\xfb\xf6\xe2\x8a\x51\xe0\xfa\x36\x3f\x19\xe4\x95\xe6\xb1\xf6\x65\x52\x22\x58\x93\x7b\xb8\xe7\x88\x22\x50\x15\x7e\x52\x1e\x11\x6c\x03\x03\x4c\x3c\x6a\xeb\x03\xe2\xfd\x48\x57\x5f\xf3\x70\x86\xdb\xb7\xb8\xc0\xf9\x87\x05\x67\x8e\xd8\xf1\x01\xa5\x9a\xf5\x2e\xce\x57\x42\x67\x8d\xa6\xb8\xb8\x57\x15\x61\x80\x49\x40\x6d\x55\x22\x7e\x0a\x92\xb4\x36\xe1\x18\xc4\x60\x8f\x99\xe2\x0d\xfc\x4c\x7b\x9f\xe0\x4b\x05\x31\xf6\xca\xf7\xd3\x6e\xd1\xd3\xd1\xfc\xbe\x04\xe2\xb8\x61\x39\x11\xb5\xf5\xf1\x70\xab\xe6\xdb\xf2\xab\x3c\x32\xd6\x79\xda\x66\x3f\x8b\x04\x2e\x2d\xc9\xb7\x6c\x82\xf1\x0f\x4f\x3f\xf4\x18\x8d\xba\xa7\xc8\x0b\x35\xcb\xc2\x00\xf3\x12\xb5\x55\x75\xb8\x95\x43\x61\x73\xf5\x5d\xc1\xf2\x18\xa5\xf8\xaa\xd4\x58\x9b\x22\xdd\x49\x27\xa3\x29\xe9\x3b\xb7\xe7\x15\x6f\x4f\x53\x9c\x39\x4f\x28\x04\x03\x4c\xd2\x3f\x06\xb6\x7f\xfd\x73\xdc\x03\x03\x5b\xf5\xe1\x07\x2f\xc1\x6c\x48\xbd\x7a\x32\x2b\xb2\x02\xf4\x1e\x09\xaa\x3f\x8e\x8e\x5a\x36\xca\x3e\x91\x68\xba\xc5\xac\x67\x95\x83\x51\x7f\x89\xdb\x44\xc9\xa8\x4f\xa4\xe6\x70\xcb\xaa\xfb\xf5\xb1\xed\xde\x1f\x59\x3f\xcc\xdf\xe1\x63\x2a\x12\xd8\x62\x75\x63\x38\x8e\xf5\x68\x40\xd1\x1d\xd6\x9e\xf9\xb7\x9d\x71\x27\xae\x14\xd4\xd6\xa7\xc3\xad\xd8\xce\x1f\x0b\xbe\xae\x95\xea\x39\x6d\xe7\xae\xce\x70\x49\x55\x84\x4e\xfb\x5e\x30\xe4\x9e\x7b\xc4\x0c\x95\x37\x6c\x3d\x64\x54\x86\x01\x26\x15\xb5\x55\x7b\xb8\xc5\x5c\xaf\x1f\x47\x3d\x0e\x68\x82\x7e\x99\x30\xf1\x38\x7c\x8e\xe0\x78\x44\xb2\x10\xed\xa6\xd9\x6c\x7c\x71\x5d\xe5\x2e\x9b\x3d\x80\x01\x26\x0d\xb5\x55\x77\xb8\xf5\xc0\xf5\xeb\x57\x8e\x79\xed\xb7\x57\x32\x8f\x2d\xc4\x8f\xaf\x3d\xa2\x0b\xbd\x7b\x5e\xd6\x21\x5d\x05\xf3\x9a\xc5\xa4\x27\xb9\x94\x0c\x06\x98\x74\xd4\x56\xfd\xe1\x56\xda\x99\xf3\x99\xef\xb2\x3f\xbf\xb6\xd5\x09\xf3\xe3\x74\xbc\xfc\xc6\x98\xa4\x77\x94\xed\x52\xd9\x20\xc5\xc6\x7c\x92\x92\x89\x90\x35\x0c\x30\xaf\x50\x5b\x0d\x87\x5b\x23\x0f\xab\xc8\xce\x59\x99\x09\xbf\xf3\x19\xda\x4b\x27\xf5\xd3\x5a\x7a\x47\xc2\x3f\x71\x8c\x2c\x88\xb2\x31\x67\x76\xf3\x85\x26\x6e\x30\xca\x40\x6d\x35\x1e\x6e\x11\xe3\x93\x67\x5e\x58\x15\x7d\x37\x3a\x37\x04\xf9\xb3\x88\x05\x15\xe1\x1f\x05\xaa\xe2\x4b\x97\xe5\xbc\x2e\x9a\x27\x19\xe9\xd1\xc3\x00\x93\x89\xda\x6a\x3a\xdc\x1a\xa6\xdf\xcd\xa4\x8a\x39\xd9\x53\x9e\x45\xf1\xaa\x8e\xee\xb6\x76\xc0\x39\x25\x28\x64\x4b\xfd\xdb\xf5\x71\x87\x95\x35\x40\x8b\x1b\x70\x5f\xa3\xb6\x9a\x0f\xb7\x44\xab\x47\xf4\x27\x69\x4a\x94\x5b\x2d\x3c\xcd\x42\x1d\xc6\xd4\xee\xe6\x98\x7f\x28\x1b\xfd\x6e\xa9\xf3\xc0\x29\xaa\xfe\x02\x33\x6e\x28\x7d\x83\xda\x6a\x39\xdc\x3a\x4d\x41\x24\x2e\x96\x71\xfd\xdc\x05\xb1\xd7\x0d\xfe\x97\x53\x1c\x98\xdf\x13\x45\x34\x3c\x28\x96\x34\x35\x97\xe1\x9c\x72\x18\xc6\x0d\xcb\x6f\x51\x5b\xad\x88\x53\xb8\xb0\x69\x34\xd5\x7d\xd9\xdd\x15\xdb\x46\xcd\x0d\x77\xa2\xc1\x84\xa7\xf7\x99\xa6\xce\x5a\x11\x3c\x23\x9e\x1d\x59\x2d\xcf\xc6\x0d\x6c\x59\xa8\xad\xcf\x87\x5b\xa7\x96\x26\xe3\x7a\x4e\x3f\x5f\xcb\xc1\x97\xd2\x30\x86\x7d\x38\x63\x7f\xce\x90\x88\xae\xd2\x9e\xce\xce\x98\xe4\x27\xb9\xa9\xe4\x00\x03\x4c\x36\x6a\xab\x0d\xf1\x89\x64\x76\x47\x4b\x59\x68\xdf\x5d\xec\x13\x1d\x6f\x7f\xbb\xb2\x54\x77\x02\x9a\x07\xf2\x69\xef\xab\x52\x24\x7c\x6e\x4a\xd9\x72\x9d\x85\x01\x26\x07\xb5\xf5\xe5\x70\x8b\xfe\x77\xd7\xaf\x52\x42\x67\x83\xb9\xa3\x36\x42\x33\xe1\x41\xb4\x7b\x12\x98\x2c\x65\xca\xca\x3c\xa2\x15\x3b\x95\x50\x2e\x31\xdc\x01\x2a\x17\xb5\xd5\x7e\xb8\x95\x7c\xcd\xbb\x10\x9b\xc8\xd1\xc9\x55\xe4\xed\x2d\xdc\xba\x76\xe3\xfa\xbc\x4a\x12\x75\x64\xfe\x0e\x66\x40\x8b\xdd\x4c\x29\xe6\x0c\x0c\x30\x79\xa8\xad\x0e\xc4\xf0\x77\xaf\xe1\xe2\x09\x05\xea\x00\xff\xfa\x94\x34\xfe\x59\x09\x65\x75\x93\x1b\x41\x71\x3c\x61\xac\xb4\x9f\xd9\x1b\x2e\xdb\xcc\x5f\x83\x01\x26\x1f\xb5\xd5\x79\xb8\x25\x37\x93\xc7\xa3\x0d\x13\xde\xde\xa4\x3e\x0d\xe5\xa9\x44\xd0\x44\x8f\xe5\xd8\xdd\xfb\xd4\xdf\xf7\x81\x30\x9b\x76\x52\x45\x16\xf7\xbd\x2f\x40\x6d\x7d\x45\xdc\x6c\x7e\x7c\xaf\x9d\x31\xd0\x9e\x70\xbc\x3b\xf6\xa9\x06\x73\x6a\x6d\x85\xbd\x5d\xeb\x08\xb9\x0a\xcd\x44\x6d\x62\x16\xe5\xc3\x15\x47\x18\x60\x0a\x51\x5b\xdf\x10\x9f\x06\x2b\x2f\xea\x8c\x77\xd0\x6b\x46\xbc\x08\x3a\xb5\xf0\x88\x79\x6e\xc4\x49\xf3\xb1\xf5\xca\x94\xf6\x3a\x3f\xcd\x37\xd6\x02\x09\x25\x18\x60\x8a\x50\x5b\x5d\x88\xe1\x2f\xc4\xe3\xec\xab\x97\x36\x91\xf4\x77\x58\xae\xaa\x2f\x3f\x1c\x3d\x23\x6e\xdb\xc1\x40\x93\x6f\xa9\x2f\xcf\x54\xb0\xda\xa1\x6a\x07\x03\xcc\x3b\xd4\x56\x37\xe2\x77\x8c\xb6\x3f\x49\x1d\x3d\xf9\x9e\xc5\xb5\x33\x29\x7d\xf6\xd2\xae\xe7\xb1\x17\xec\xfe\x0f\xfb\xfa\xe8\x2e\xe7\xdc\x7a\xcb\xe8\xca\x47\x02\x03\x4c\x31\x6a\xab\xe7\x70\x6b\xdb\x54\x8b\x8d\x3e\x4a\xee\xa8\xa5\xd1\x9b\x7e\xae\x96\x48\x53\x6c\x7d\x57\xd7\x9e\xe5\xa3\x20\x4b\x7b\x81\x88\xc0\x2b\xef\x71\x37\xe7\x12\xd4\x56\xef\xe1\x56\xc4\x8e\xff\xf3\x8d\x75\xd3\xc6\x54\x76\xee\x9b\x7d\x72\x05\x96\xc3\x4b\x73\x43\xe3\x6d\x66\x2d\x1c\xb1\xf1\x34\xab\x09\xa4\xb8\xf7\x63\x29\x6a\xab\x0f\x71\x50\x31\xf6\x5d\x2d\xdb\x97\x3e\x55\xf8\xd8\xb8\x64\xa4\xe0\xec\xe4\xe6\xf1\x06\x0b\x6a\x55\xb1\xcf\x21\xa7\x34\x1e\x98\x88\x63\x70\xaf\x63\x19\x6a\xab\xff\x70\x2b\x30\x80\xb5\x48\x5a\x2b\x79\x41\x40\x1b\xec\xb8\x6f\x84\x90\x2c\xd9\x3c\xba\x8f\x3f\xf8\xbd\xdc\x88\xeb\xc8\xaf\x3e\x97\x58\x33\x18\x60\xca\x51\x5b\x03\x88\xc3\xc5\x64\xfe\x71\x91\x95\x78\xda\x34\x51\x3e\x12\xfc\xef\x18\x7f\x8d\x7b\xbf\xa7\xde\x4b\xc0\x6e\xde\x57\xcb\x7f\x3c\x9f\xaf\xc3\x0d\x59\xef\x51\x5b\x83\x88\x9f\x82\xe8\x81\x87\xdd\xc9\x5d\x62\x91\x73\x56\x57\x8d\x08\x97\x53\x5d\xd5\xe4\x88\x12\x1f\x10\xf9\x33\x9f\xd1\x13\xb0\x4d\x4a\xc6\xbd\x1f\x2b\x50\x5b\x43\x88\x61\x46\xca\xc5\x67\xa0\xf6\xd4\xf2\x54\x4e\x9e\x64\xf0\x9a\xf9\xc6\x48\xc8\xc4\xb8\x4e\x92\x52\x6a\x53\x8b\x3a\xe7\xb8\xe2\x37\x0c\x0c\x30\x1f\x50\x5b\xc3\x88\x4f\x24\xcd\xba\xc4\x26\x08\x83\xba\x16\x6a\x79\x4a\x9e\x3d\xca\xa3\xc2\x24\x6b\x45\x9f\x0f\x58\x49\xbb\x21\x18\xf5\x74\xe7\x85\x08\x01\x0c\x30\x95\xa8\xad\x11\xc4\x7b\x88\xfa\x3c\xe1\xb9\x91\xf0\xe6\x8f\x5f\x4e\x72\x9f\x7f\x24\x15\xbc\xb7\xef\x25\x90\xc2\xd0\x15\x1b\xa8\x49\x3f\x12\xa6\xf1\x06\xb7\x57\x3f\xa2\xb6\x46\x0f\xb7\x64\x0c\xf0\x2f\xb5\xc5\xaa\x9e\x56\x7b\x32\xfb\xb0\x40\x72\x6e\x8c\x64\xc0\x42\xee\x8f\xd7\x49\xf2\x75\x6d\x21\xd5\x25\xc1\x93\x9a\x30\xc0\x54\xfd\x63\x60\xfb\x17\x8a\x72\x60\x60\x1b\x43\x7c\xc2\x66\xe5\x48\x45\x47\xfb\xb2\x40\x89\x49\xde\x90\x7a\x41\x58\xb6\x6f\x09\xf3\xe6\x95\xf3\x98\x27\x51\xf2\x07\x06\x75\x8f\x32\xdc\x4d\xb0\x1a\xf5\x89\x7c\x47\xfc\xbe\xd2\xc7\x0b\x25\x9c\xc9\xef\xbe\x88\xcc\xd2\x6a\x95\xeb\x26\x84\xee\xaf\x31\x27\x6b\x15\x9f\xbb\xba\xe7\xb5\x17\xf9\x85\x7d\x17\x77\xa2\xaf\x41\x6d\x8d\x1f\x6e\x65\x70\x5e\xf0\xe7\x22\x35\x14\x08\x30\xa9\xf3\xfd\xc1\x54\xeb\x92\x99\xab\x29\xc3\x7b\xb6\x10\x5f\x79\xd4\x34\x9c\xc0\x59\x8d\x1d\x06\x98\x4f\xa8\xad\x1f\x88\x1f\x89\x2a\xc7\x7d\xec\x9a\x50\x1f\xa1\x7d\xf6\x85\xbc\x8c\x7f\xfb\x61\x72\x21\x47\x98\xcd\x5c\x38\x47\x6d\xb7\x89\x4c\xad\x07\x1e\x04\x03\x4c\x2d\x6a\x6b\xe2\x70\xcb\xee\x93\x99\x65\x87\x5c\x8e\x0d\xe9\xd2\xc5\x31\xa8\x41\x85\xe6\xb4\x6f\x52\xd7\x6c\x58\xb1\x07\xe9\x74\xfb\x04\x0d\x8d\x28\xee\xc6\x55\x87\xda\x9a\x3c\xdc\x6a\x6d\x92\x61\xdd\x7c\x1f\xfb\xfa\x66\xa8\xf4\x50\x87\x65\x1f\x81\x5c\xf7\x57\x69\x9f\x4e\x2a\xbb\x22\xc9\xc5\xf3\xb2\xcf\x89\x45\x60\x80\xa9\x47\x6d\xfd\x3c\xdc\x6a\x98\xf3\xe7\x86\xf8\x92\x8f\xc5\xfb\x34\x18\x85\xf7\x0b\xae\x81\xd3\x3c\xaf\x58\xea\x1c\x34\x3f\xfd\xa0\xce\xad\xa2\x4b\xd5\x86\x01\xa6\x01\xb5\x35\x75\xb8\xe5\xa2\x0a\xbd\xbb\xfb\xf6\x73\xd5\x9e\xbc\xca\xc9\x5c\xa5\xec\x8e\xb5\xb1\xdd\xd5\xd0\x4f\xb2\x5f\x3b\xe7\xfa\x23\x99\x7c\xdd\xcc\x61\x80\x69\x44\x6d\x4d\x23\x7e\x8f\x2a\x3c\x3c\x86\xe9\xb7\xda\xb1\x77\x09\x37\xec\x89\x97\xef\x7e\xee\x17\xd2\xed\x5b\x61\x24\x25\xd2\x57\x60\xe7\xbf\x3c\xd2\x8a\x0f\x03\x4c\x13\x6a\xeb\xd7\xe1\x16\xe6\x9c\xe3\x8d\x52\xde\xf0\x71\x3b\xee\x14\x03\x79\x81\xb9\x63\x5d\x7b\x8b\x36\xef\x6e\xeb\xa6\xdc\x94\xd8\x10\xe3\xda\xac\xc5\xb5\x9a\x51\x5b\x33\x87\x5b\x3f\x26\x5e\x11\xd9\x96\x5c\x3d\x93\xf5\xa3\x9c\x60\x6c\x72\x71\x7d\xe8\xb4\xd1\x66\x77\x06\x95\x4e\x4e\xbc\x70\xe6\xb6\xdd\x00\x6e\x98\x69\x41\x6d\xcd\x1e\x6e\xb9\xc3\x8f\xbf\xea\x6f\x18\xce\x26\xb2\x08\x67\xc4\xe5\x58\xcb\xc1\x32\xf7\x7b\x2a\x42\x8f\xb5\xee\x46\x7a\xea\xbe\x11\x10\xa6\x85\x01\xa6\x15\xb5\x35\x87\xf8\x54\x2c\xf4\xf2\xd0\xa5\x7c\x2e\xac\xf8\x8c\xa4\x8f\x6a\xed\x67\x7c\x63\xce\xd6\xb5\x93\xf4\x1c\x6f\x9e\x17\x55\xeb\x30\x7a\x2a\xe2\xf6\xea\x67\xd4\xd6\xfc\xe1\xd6\xad\xbd\x61\x39\x12\x62\x27\x3d\x36\x8b\x6b\x8f\x2f\x5d\xd2\x66\x1e\x8e\x79\x13\x5a\xe3\xd6\xf8\xd6\x16\xcf\xb2\xf4\x42\x8e\x1d\x6e\x7f\xb5\xa1\xb6\x16\x0e\xb7\x68\xd6\x06\xcc\x07\xb8\x84\xea\xc5\xee\x66\xf9\xa4\x98\xf8\xa4\xca\x78\x9f\xae\xdf\x1f\x19\x8c\x2c\xa0\xdf\xe2\x57\xe0\xdc\xbd\x01\x03\xcc\x17\xd4\xd6\x22\xe2\xd3\x14\xed\x1d\xc8\x00\x3e\x91\x28\x98\xe2\x46\xb6\xae\xb9\xaf\x18\xbf\x16\xaa\x71\xbc\x94\xbf\xd0\x25\x3b\xcd\xb5\xa7\xbc\x14\xf7\x3a\xb6\xa3\xb6\x96\x0e\xb7\x2c\xee\x28\x2e\xaf\xef\xd1\xdd\xe1\x18\xbd\xc2\x3f\x77\xf2\x4e\x96\x24\x1d\xd1\xb0\xbc\xc1\xfe\x26\xb7\xaf\xcb\x9b\xf4\xf3\x47\x70\x07\xbb\x0e\xd4\xd6\x32\x62\x98\x39\x4f\x5b\xfe\x33\x2d\x93\x71\xd7\x31\xee\xee\x0d\x2a\xd3\x9d\x4b\x66\x21\x34\xbc\xf7\x09\x7b\xb8\x56\xae\x5f\x7c\x6b\x30\x84\xbb\xe6\x74\xa2\xb6\x56\x0e\xb7\x06\x8f\x2c\x32\xbb\xde\xe1\xb1\xbe\x4c\x78\xdb\x38\xe7\x0a\xe0\x16\x02\x2e\xdf\x3f\xd8\xc2\x0c\x09\x5e\x70\x94\x37\x73\x21\xee\xe6\xfc\x15\xb5\xb5\x7a\xb8\x75\x76\x36\xc8\xea\xbb\xe3\x66\x49\x85\x5c\xe8\xb8\xf6\xc4\xd8\x5b\x89\xb1\x1e\x99\x75\xb1\x5b\xd5\x2d\xc6\xbb\x45\xae\xc1\x6c\xb8\x9b\xe0\x37\xd4\xd6\xda\xe1\x96\xd3\x69\xf5\x35\xa1\x61\xdb\xe1\x63\x7f\x28\x32\xbf\x0f\xc4\x3d\xc1\x40\xf3\x67\xcb\xef\xb9\x3e\x31\x38\xcd\x78\x64\xad\x43\xf3\x0e\x0c\x30\x5d\xa8\xad\xf5\xc3\xad\x2f\xf7\xda\x13\xa7\x17\x31\xe6\x1e\x65\x23\x1f\xfb\x79\x78\x53\x6d\xb4\x2d\x1d\x39\x4d\xa8\xa3\x86\x64\x8e\x19\x3d\xa7\x62\x35\x80\x01\xa6\x1b\xb5\xb5\x71\xb8\xb5\x38\x63\x39\x14\x40\x4c\xbe\xe6\xfe\x4e\xc7\x80\xc3\xe6\x2e\x83\x43\x69\xf5\x4a\x39\x8f\xfa\xc9\x13\x2f\xae\xe2\x95\x06\x3e\xd4\x83\x01\xa6\x07\xb5\xb5\x79\xb8\x65\xe9\x6c\xe6\x18\xd2\xe0\xbb\x6c\xd8\xb0\x2e\xa7\x70\xf6\xfb\x48\xd1\xd9\xcf\x05\xf1\x36\xdc\x47\x6d\x4b\x36\x3e\xcf\x0f\xfc\xc6\xbd\x1f\x7b\x51\x5b\xbf\x11\x9f\x8a\x7d\xa5\xf4\xd0\x7c\xc9\x7d\x66\xf2\x2d\x5f\x43\x1e\x45\xce\x71\xbf\xcd\x22\xa2\xa9\x5c\xd1\x37\x45\xcc\x25\x0b\x82\x7b\x99\xd7\x61\x80\xe9\x43\x6d\x6d\x1d\x6e\x7d\xae\x99\x12\x79\xdf\xf6\x74\x8a\x90\xe8\xd9\x8b\xce\xe0\x99\x80\x6b\x2e\xf6\x7f\x28\xee\xf1\xa6\x3c\x70\x4d\x2f\x06\x4e\x22\xb8\xe7\xd8\x8f\xda\xda\x46\x7c\x92\xf5\xbe\xd1\x8d\x9b\xb1\x9b\xf3\x82\x5e\x44\x65\x5c\xd8\x85\xf5\x59\xf8\x2b\xff\xcb\x40\x4b\x15\xba\x68\xdd\x78\x70\x5e\x86\x03\x06\x98\x01\xd4\xd6\x0e\xe2\x5a\xd8\xc3\xae\xc2\xdc\x94\x10\x4d\x7b\xc5\x24\x28\xe8\x2d\x73\x57\xd3\x91\xc7\x8e\x8d\x86\x22\x99\x6d\x34\xd5\xa7\x1a\x55\x0b\x70\x07\x95\x41\xd4\xd6\xee\xe1\x56\xa8\x83\xfb\xa4\xbb\x79\x5c\xd5\x86\x40\xd8\x8d\xf7\x97\x5e\xeb\xef\x0c\x4d\x7a\xc3\x69\xc7\x94\x3f\xaa\x8d\x52\xbd\x8c\x0b\x74\x82\x01\x66\x08\xb5\xb5\x77\xb8\x45\xf0\xd4\x92\xb5\xa7\xbe\x44\x7f\xd1\xd0\x52\x5f\x10\x2f\x6b\xda\xe1\x0a\xb3\xd7\x88\xfe\x68\x81\x86\xd2\x40\x68\x77\xb3\x2d\xee\x9a\x33\x8c\xda\xfa\x73\xb8\x95\x25\x74\x37\xfe\x12\x4c\x3e\x3c\xca\xd7\x1a\x9e\x23\x81\x71\x67\xb5\xb0\xe7\xf1\x57\xcc\xdf\xfa\x49\xf9\xf6\x2d\x6b\x41\x9a\x24\x0c\x30\x23\xa8\xad\x7d\xc4\xa1\x5a\x9f\x85\xb4\x43\x78\xcc\xfd\x1c\x95\x1e\xe9\x2b\xee\x7a\x05\xc6\x73\xb1\xe9\x19\x7f\x6a\x1b\x43\x07\x36\xbd\x4e\x4b\xcd\xe0\xbe\xf7\xa3\x28\xad\x76\xba\xff\x8c\xa6\xfb\xff\x0e\x6c\x00\x42\x88\x6b\x67\x44\xea\x3a\x73\x9c\xc9\xb5\x64\x4f\x4d\xb7\x62\x2c\x55\x81\x7a\xfd\x8e\xd7\x5e\xb7\xd4\xfb\xb1\x3b\xbb\x37\x2f\x5f\x3c\xad\x02\x03\x0c\xaa\xb8\x06\x20\x84\xb9\x46\xaa\xf6\x61\x7e\x46\x6f\xaa\xec\xfe\xd1\xfc\x2f\x5b\x9d\x29\x77\x48\xb6\xe9\xd9\x6e\x25\x7d\x8e\xb8\x6e\xca\x64\x4c\x96\x15\x72\x02\x06\x18\x54\x73\x0d\x40\x08\x75\x0d\xf6\x8e\x78\x49\x51\xcb\xcf\x33\xc5\xa2\xbd\xa4\xe8\x5a\x52\x18\xac\x72\x34\xf8\x5e\x6b\xfe\xd3\xa9\x1a\x9a\xba\x09\x9a\x12\xdc\x7b\x05\x55\x5d\x03\x10\xc2\x5d\xa3\xb9\x9d\x20\x75\x71\xc5\x91\xe2\xf8\xf0\x70\xcf\xc7\xc8\x8d\xe0\x31\x82\xb2\x35\x7b\x26\x13\xc3\x5f\x66\x99\xd8\xc8\x5b\x59\x27\x61\x80\x41\x75\xd7\x00\x84\x90\xd7\x46\x8a\x32\x1a\x30\x0e\x92\xe6\xfe\x7c\xe3\xd1\xe6\x6d\x26\x3d\xd2\x1e\x57\x49\x2b\x8f\x00\xe2\x09\xfe\x8f\x51\x96\x9e\x4d\x00\x06\x18\x54\x79\x0d\x40\x08\x7b\x6d\xef\xbb\x88\x5f\xb6\x7b\x47\x04\x95\x1c\x59\x2b\xa5\xe6\x77\xf2\x91\x44\x77\x73\xfd\xa0\x74\x22\x3f\xba\xbe\xad\xb1\xd0\x32\x59\x18\x60\x50\xed\x35\x00\x21\xf4\x35\xcf\x13\x43\x14\x16\x91\xca\x44\xdc\xb1\xf0\x4b\xdd\xfc\xac\x8e\x22\x22\x7d\xaa\xea\x9d\xd8\xba\x38\x0e\xf8\xe7\x84\xd0\x79\x69\x18\x60\x50\xf5\x35\x00\x21\xfc\xb5\xbc\x4c\xa5\x1c\xa1\x48\xff\x46\x6d\x87\x5a\x9f\xdb\xed\xb5\x16\x81\x0d\xd5\x78\xfb\x52\xf7\xd5\xf2\xd8\x9f\x93\xa4\x0e\x5b\x5e\x85\x01\x06\xd5\x5f\x03\x10\x42\x60\x4b\x2d\x92\x1f\x1c\xb8\xf3\xb1\xe3\xac\xa5\x0c\xd7\x33\x8d\x52\x19\xde\x02\x45\x33\xa6\xbe\xd3\xc1\x50\x90\xdf\x6d\xcf\xb7\x3f\x0c\x61\x80\x41\x15\xd8\x00\x84\x30\xd8\x60\xad\xa8\x1b\x25\x0d\x45\xf8\x76\x04\x75\xf3\xac\x3f\xf3\x00\xad\x0c\xd5\x94\x6f\x38\x7e\x5f\x9c\xcc\xa0\xdd\x86\x7d\xe4\x45\x18\x60\x50\x0d\x36\x00\x21\x14\x36\xbb\x10\x2c\xd3\x85\xf3\x56\xb2\xf6\xd7\x9e\x77\x27\xf2\x32\x06\xbc\x22\xdb\x92\xfe\xb4\x82\xf9\xf9\x4b\xaf\xb5\x8f\xc8\x49\x1d\x77\x1d\x45\x55\xd8\x00\x84\x70\xd8\x1c\x66\x1c\xc3\x2e\x93\xf3\x99\xe6\xaf\x74\xd0\xa7\xb8\x2b\x0c\x79\xf2\x14\x7f\x7a\xf1\x4c\x5e\xf4\x96\xcb\x77\xc3\xfa\xa1\x5d\x2c\x0c\x30\xa8\x0e\x1b\x80\x10\x12\x9b\x40\x04\x37\x23\x7d\x58\x58\x5b\x8b\x3b\xd7\xef\xf9\xfb\x54\xe3\xf1\x37\xde\x47\x62\xbc\x74\xab\xd3\xd3\x0a\xed\x25\xe3\x28\xb9\x60\x80\x41\x95\xd8\x00\x84\xb0\xd8\x6e\xf2\xe3\x33\x0f\xe8\xe8\x7e\x7f\x62\x2b\x63\x29\xad\x59\x59\x72\xdd\xc9\x80\xe9\x96\x77\xab\xdf\xf5\xac\xa1\xca\x36\xf2\x5a\x6a\x18\x60\x50\x2d\x36\x00\x21\x34\xb6\xce\x9b\x7d\xa6\xb7\xbe\x75\xcc\x4e\x3a\x4f\x0b\xeb\xd9\x04\x7f\xd9\x0b\x34\xc9\x9a\xff\xd8\x2a\xb0\x18\x10\x51\x9b\x9a\x04\xdb\xc2\x00\x83\xaa\xb1\x01\x08\xe1\xb1\x49\xd3\x18\x85\xec\x61\xb2\xe5\x9b\x96\xcf\xf0\xb9\xc4\x73\x52\x6d\xd0\xa9\x47\xa6\xe9\x56\x64\x91\x28\x9f\x9e\x9c\xe9\x6e\x3b\x06\x03\x0c\xaa\xc7\x06\x20\x84\xc8\x16\xe3\xab\x27\xdf\xb6\xc1\x2b\x1e\xa5\xae\xf2\xc4\x49\x85\xf8\xc1\x2f\x81\x73\xf0\x7a\x63\xec\x6e\x0c\xbb\xa5\xc7\xb9\x8f\x63\x16\x30\xc0\xa0\x8a\x6c\x00\x42\x98\x6c\xdf\xbb\x66\x6f\xe0\xa5\x4c\x37\x04\x56\xab\x9f\x5c\x39\x6e\x48\x49\x6f\x33\xd5\x34\xfe\xc6\x3e\xfc\x2b\x87\x54\x4f\x77\xdb\x8e\x31\x0c\x30\xa8\x26\x1b\x80\x10\x2a\xdb\xd8\xa7\x3a\xa3\x40\x2f\x21\xa7\x04\xe6\x7b\x4e\x59\xf4\xcf\xef\x15\xe7\xef\x3d\x6e\x5b\xb6\x88\xf7\xa6\x5b\x7d\xb7\x94\xbc\xa7\x01\x03\x0c\xaa\xca\x06\x20\x84\xcb\x26\x4c\xa6\xf0\xed\xfa\x18\x01\xc3\xe6\x9d\x48\xb6\x4f\x2c\x9c\x0d\xea\x27\xee\x88\x98\xd9\x5c\x1e\xa7\x9f\xdb\x14\x8f\x73\x26\xb3\x86\x01\x06\xd5\x65\x03\x10\x42\x66\x53\xac\x95\x91\xdd\xa1\x33\x7f\xeb\x44\x58\xc1\x23\xc5\x4c\x47\x40\x77\xc4\xed\x11\xc9\x4b\xfe\x1b\xd8\x59\xbc\x94\xcb\x25\xad\x54\x30\xc0\xa0\xca\x6c\x00\x42\xd8\x6c\xcf\x63\x1f\xca\xd2\xec\xb9\xac\x7d\x2d\xe4\xf5\x5b\x24\x4a\xff\x2c\x25\x56\x7b\xaa\xab\x3a\xc5\xf1\x4f\x6e\xc5\x59\x35\x1e\xcb\x5b\x30\xc0\xa0\xda\x6c\x00\x42\xe8\x6c\x85\x3d\x8b\x1e\x2c\xad\x8f\xd6\x45\x74\x93\xbd\x8e\xfe\xd6\x7c\xb6\x2b\x77\xbb\x0a\xf3\xe9\x51\xfb\xcd\x38\xdd\x02\x07\x43\x01\x01\x18\x60\x50\x75\x36\x00\x21\x7c\x36\xaf\xf0\x88\x3d\x65\x1f\x7a\x8a\x70\x87\x55\x1a\xef\xcb\x8e\xee\x0b\xe7\x59\xab\x1d\x59\xad\xc5\x7e\xfa\xb8\x4f\x39\x93\xf2\x51\xc2\x00\x83\xea\xb3\x01\x08\x01\xb4\x51\x7c\x7c\xfe\xbe\xcc\x0e\x8f\x7d\xb4\xc9\x6c\xe8\x63\xac\x29\x01\x03\x79\xf4\xbc\xf8\x55\xa7\xc9\x71\xbe\xbb\x5e\x42\x7e\x11\x47\x61\x80\x41\x05\xda\x00\x84\x10\xda\xf4\x3d\xbf\xb6\xca\xc4\x8c\xde\x34\x11\x85\x7f\x85\xe2\xfb\x0d\x28\xde\x79\xa5\xff\xbb\xbf\xe5\xc3\x11\x8f\x57\x3c\x8f\xde\x17\xe2\x46\x4c\x54\xa1\x0d\x40\x08\xa2\x6d\xea\x54\xdc\xfc\x2f\xe5\xef\x65\x2f\xde\x6d\xc9\x97\x68\x68\xcc\x58\x33\x7c\x11\x93\x5a\x0b\x30\xf8\xc3\x76\xbc\xcb\x20\xb8\x5d\x11\x06\x18\x54\xa2\x0d\x40\x08\xa3\xed\x72\x97\xfb\xf5\xdd\xf9\x88\x13\x71\xcd\x27\x3f\xaf\xbc\xa7\xc9\x2a\xaf\x67\x1b\x99\x9b\xab\x59\x9b\xf3\x9c\x53\x5f\xb3\x49\xb3\x82\x01\x06\xd5\x68\x03\x10\x02\x69\x33\x09\x11\xf6\xde\xe1\x38\xaa\xa7\x50\xf8\xfa\xc8\xeb\x11\xf1\x1f\x0d\xdb\x2b\xa6\xa4\xd4\x2d\xfa\x44\xb5\xa2\xef\x6b\xa5\x1a\xc5\x60\x80\x41\x45\xda\x00\x84\x50\xda\xbc\xfb\x75\x7e\x61\x47\x84\x44\xd3\x54\xeb\x62\xd8\xc9\x0c\xc6\x77\x28\x9e\x8d\x53\xbc\x9f\x96\xc3\x96\xa6\xb6\x17\x97\xdc\x27\x86\x01\x06\x55\x69\x03\x10\x82\x69\xe3\x38\x43\x1c\x10\xee\xce\xc2\xf5\x87\xcc\xc5\xb9\xef\xcb\x34\xe5\x72\xaf\x6e\xb1\xfe\xfb\x9f\xc7\xf8\xba\x4e\x08\x75\x62\xa3\x70\xd7\x33\x54\xa6\x0d\x40\x08\xa7\x6d\x9d\x63\x77\xa7\xf6\xe7\x47\x5b\x15\xf7\x48\xd7\x3f\x64\x4a\x1b\x93\xbc\xad\xbd\x86\x77\x8a\x15\xee\xf6\xb9\xad\x28\xd8\xde\x3e\x0b\x03\x0c\x9a\xd3\xf6\x77\xa0\xfb\x17\x20\x7c\x70\xa0\x43\x40\x6d\x1d\x14\x42\x18\xb6\xaf\xeb\x56\x27\x2e\xa6\xf0\x47\xe0\xff\x2e\xa8\xa9\xc2\x0b\x55\x29\x27\x20\x3e\xde\x45\xe4\x55\x4d\xf2\xe7\x34\x0c\xb0\xa8\x50\x1b\x80\x10\x52\xdb\x08\x91\x41\xcb\x12\x61\x7f\x21\x95\x7a\xa0\xea\xef\x39\x02\xbb\xa6\x8a\x4d\xaa\xc7\xae\xcf\x6a\xb0\xfa\x6f\x73\x26\xce\xc4\x73\xc3\x00\x8b\x2a\xb5\x01\x08\x41\xb5\x39\x04\x88\xf7\x2f\x06\xb0\xc3\xb7\x2a\x8b\xef\xd9\x71\x58\x2e\xb6\xbd\xb9\xad\x6a\x21\xe4\x64\x70\xce\x6e\xb5\xaa\xb0\x50\x12\x17\x43\xa5\xda\x00\x84\xb0\xda\x4c\x61\xff\x6f\x5c\xb0\x5a\xfe\xad\xd8\xc8\x7a\x78\xe3\x99\xe7\xfd\x23\x09\xde\xda\x36\x39\x14\xe4\x24\x6b\xc3\x24\x9e\x05\xba\x30\xc0\xa2\x5a\x6d\x00\x42\x60\x6d\x2f\x23\xab\xaa\xff\xc8\x87\x49\x26\x3f\xde\x50\xf6\x8c\x18\x58\x63\x4b\xfb\x9c\xe5\xf1\x27\x46\x40\xd8\x2b\x50\xfb\x9c\xae\x35\x07\x0c\xb0\xa8\x58\x1b\x80\x10\x5a\xdb\x2b\x32\xe2\xd9\x95\x33\x01\x05\x01\xaf\x1d\x79\x66\x47\xaa\x16\x89\x05\x4f\xdf\x6b\x12\x8b\xf2\x04\x15\x24\xf8\x0e\x26\xa7\x49\x60\x80\x45\xd5\xda\x00\x84\xe0\xda\xc4\x5b\xfa\x65\x25\x3e\x3b\x8f\xf2\xca\x8f\x53\xb4\x68\x24\x7f\x67\xe3\x97\xb8\xcb\x2d\xfa\x85\x1b\xbe\x14\xbe\xb7\x94\x50\x67\x09\x03\x2c\x2a\xd7\x06\x20\x84\xd7\x96\x8d\xaf\x04\xb9\x46\xce\x9f\x74\x3d\x3d\x42\x99\xcf\x16\xa9\x1a\xc5\x72\x23\x50\xd7\x46\xa4\x76\xc9\xf1\x7c\xff\x2e\xeb\x3a\x23\x0c\xb0\xa8\x5e\x1b\x80\x10\x60\x1b\x85\x0a\xc3\x70\x6d\xf4\x8b\x89\x8d\xcb\x84\xca\x54\x8a\x84\x3e\x49\x47\xd3\x5f\x74\x0e\x6c\xc2\x5d\xd4\x64\x69\xf3\xdf\x9f\xf3\xc1\x00\x8b\x0a\xb6\x01\x08\x21\xb6\x8d\x19\x0f\x62\xaf\x6d\x7b\xd7\x9c\x0f\xec\xab\xa0\xe4\x69\x6e\x32\xcb\x22\x7a\xa8\x13\x1f\xc3\xdd\xa1\xc6\xf9\xc9\xe3\xa8\xb9\x34\x0c\xb0\xa8\x62\x1b\x80\x10\x64\x9b\xd5\xdb\x9e\xba\x97\xfe\xb2\x76\xea\xac\xd6\x4f\xbd\x85\x02\xf6\xf9\xda\xaf\x44\x57\xb5\x19\xe9\x7c\x54\x3a\x31\xf4\x72\xea\x8c\x0c\x0c\xb0\xa8\x64\x1b\x80\x10\x66\x9b\xfd\xb9\x58\xed\x37\xd6\x5f\x56\x5b\x63\x1f\x05\x9b\x9c\x5e\xf0\x16\x68\xf6\x8f\x2b\x51\xa3\x69\x32\x19\xcd\xf8\xa8\x33\x00\x51\xc0\x00\x8b\x6a\xb6\x01\x08\x81\xb6\xc9\xc4\xbe\x92\x58\x18\x2b\x54\xf6\xd4\xe1\x2d\x0f\x61\x8c\xce\x1d\xa4\xa6\x22\x36\xc9\x62\xda\x9f\xb9\x1c\xac\xc8\x88\x21\xc4\xbd\x37\x51\xd1\x36\x00\x21\xd4\x36\xa6\xc6\x19\x9d\x84\xc1\xba\xce\xc2\x2d\x72\x03\x0f\xd5\xcb\x4c\x42\x99\xd4\x81\x7e\x02\x96\xf3\xd3\x6e\x32\x7a\x67\x60\x41\x2a\x18\x60\x51\xd5\x36\x00\x21\xd8\x36\x96\x9f\x84\x9b\x75\xe4\x63\x7f\xce\x57\x9f\x31\x12\xfa\x51\x99\xb2\xeb\x62\x61\x9b\x7a\x16\xfa\x31\xe7\xec\xd6\x66\x62\xa9\x71\x13\x06\x58\x54\xb6\x0d\x40\x08\xb7\x6d\x69\x49\xa2\x87\x4c\x4d\xd4\x2f\x3a\xfa\x66\xeb\x56\x3e\x7c\x44\x54\x9f\x32\x90\x51\xb2\x42\xf5\xa7\x89\xa9\x8e\x93\x19\x19\x1e\x0c\xb0\xa8\x6e\x1b\x80\x10\x70\x5b\x46\xc9\x33\x36\x35\xaa\xe3\xee\x3d\xa0\xb6\xb3\x65\x6f\x4a\xfc\x0b\xd1\xd7\x9d\x06\xf1\x2f\x2f\xc9\xe6\xf7\xf1\xd4\x82\x1e\xe3\x5e\x00\x54\xb8\x0d\x40\x08\xb9\xad\xf4\x41\xb9\x25\x85\xa2\xc6\xea\xa3\x6d\xb7\x5f\xf5\xeb\x8d\xba\x95\x8c\x69\x34\xbb\xca\x6b\x5f\xc0\x99\xd7\x15\x78\x8b\xdb\xd7\x60\x80\x45\x95\xdb\x00\x84\xa0\xdb\xf4\x0a\xa2\x7e\x6d\xdc\x56\xff\xb8\x1e\x93\x63\x64\xe0\x3f\x4e\x58\x2a\x18\xd4\x2b\xfd\xa0\x08\xe3\xec\x12\x7f\xe6\x9e\x8d\x26\xee\x7a\x86\x4a\xb7\x01\x08\x61\xb7\xbd\x7a\x49\xab\x70\xfe\x56\x08\x2b\x73\xbf\xf9\x0d\xb2\xb7\x1e\xc1\x5d\x94\x04\x02\x1f\x9c\x5d\x64\xc4\x19\x57\xe9\xef\xdc\x96\x3f\x06\x03\x2c\xaa\xdd\x06\x20\x04\xde\x16\xe3\xdf\xbb\x77\xe2\xfa\x1f\xba\x67\xbe\x0d\x36\xde\x67\xa8\x5f\x3e\xd2\xf1\x7a\x50\xbb\xa1\x1e\x74\xae\x57\xb8\xfc\x6a\x93\x29\x16\x06\x58\x54\xbc\x0d\x40\x08\xbd\x2d\xc1\xf9\xce\x0b\x1b\x4e\x9a\x07\x6a\x03\xc0\x62\x29\xf2\xa9\xdd\x47\xa8\x44\xbd\xfc\x82\x61\xdd\x06\x59\xc6\x89\xa0\x10\xe5\x13\x30\xc0\xa2\xea\x6d\x00\x42\xf0\x6d\xe7\xd4\x79\x8f\xf1\x08\x45\x3d\x2a\x6c\x4b\xd9\x80\x1f\xea\xc4\x50\x94\x1b\x98\x26\xec\x5c\x2b\x80\xfd\xbe\x89\x1d\x9f\x09\xe1\x85\x01\x16\x95\x6f\x03\x10\xc2\x6f\x0b\x52\xea\xb4\xbb\x36\xce\x38\xb7\x77\xdb\xa3\x58\x95\xd2\x21\x4c\xe5\xdb\x60\x08\x9f\x9d\x33\xd3\xd7\xdd\x7b\x4b\x2a\x1e\x3c\x0e\x30\xc0\xa2\xfa\x6d\x00\x42\x00\x6e\xe2\x33\x2a\x75\xe1\x6c\x9f\x3c\xd2\xbd\x6b\x3e\xf1\xb5\x8c\x0d\xb8\x91\x74\xa9\x8a\x99\x33\x2d\x02\x8d\x10\xca\xdf\x1b\xea\xb8\xaf\x0c\x15\x70\x03\x10\x42\x70\xd3\xd8\x9a\x4e\xfe\xee\x29\x10\x4d\x21\x6b\xc5\x52\xc8\x4c\xa9\xb2\x30\xcb\xee\xff\xe9\xb9\xfb\xda\x67\xb1\xe7\x36\xcf\xf2\x09\xcd\x61\x80\x45\x15\xdc\x00\x84\x20\xdc\x0a\x97\xd8\xb3\x3e\xc7\x70\xa9\x7d\x50\xb2\xeb\xb9\x3f\x51\xd6\x46\xda\xca\x5f\xfa\xde\x7d\x4a\x2f\x60\xa3\x2d\x9e\xcd\x74\x9e\x1e\x06\x58\x54\xc2\x0d\x40\x08\xc3\xcd\x4b\xa7\x61\xaa\x7f\xb4\x55\x32\xa0\x36\x82\xe3\x85\x21\x17\xc0\x74\xcf\xb9\x93\x91\xfd\x49\xfb\x4e\xab\x9b\x56\xd1\x90\x73\x12\x06\x58\x54\xc3\x0d\x40\x08\xc4\x2d\x7e\x23\xb1\x23\x99\x55\x20\xe7\x09\x6d\xda\x06\x69\x8f\x1d\x77\x43\x04\xa3\xa0\x66\x94\x66\x35\x3e\x19\x26\x2d\x2b\xb4\xc0\x10\x06\x58\x54\xc4\x0d\x40\x08\xc5\xed\xa9\x18\x0b\x65\x9b\x45\x8f\x6a\x6f\xc0\xab\x13\xe2\x17\xce\xdb\x3a\x68\x65\xa8\x8e\x63\x14\x73\xde\xe8\x66\x63\x65\xf3\xaf\x5d\x84\x01\x16\x55\x71\x03\x10\x82\x71\xf3\xf9\xf2\xda\x80\xcc\xd5\x9f\xfb\xc9\x25\xcb\x78\xe6\x18\xf9\x78\x31\x89\xcb\x25\xf8\xc6\x3a\x83\xc2\x39\xf3\x8b\x9b\xdb\x0f\xd9\x61\x80\x45\x65\xdc\x00\x84\x70\xdc\x14\x15\xb4\x45\x0a\xa6\x2d\x83\x7e\x2a\x5b\xb9\x75\x48\x50\x8e\x7d\x22\x0d\x71\x35\x8a\xa4\x52\xbd\xfe\xc3\xeb\xb5\xf0\xe3\x1d\x06\x18\x60\xd1\x1c\xb7\xbf\x03\xdd\xbf\xfe\xcc\xc3\xc1\x81\x0e\x01\xb9\x59\x12\x4a\x7f\x30\xd7\xe3\xdb\x6d\x9c\x93\xe3\x18\x0a\x29\xee\xcb\x13\x89\x29\x66\x11\x55\x36\xd7\xad\xf5\x7f\x52\x1c\xb9\xcb\x03\x03\x2c\x2a\xe4\x06\x20\x84\xe4\xe6\xce\x96\x4f\xb0\x41\xca\xe0\xee\xf4\x4c\x61\xe7\xca\xb2\x45\xd6\xf2\xd2\x0b\xaa\xa4\xf6\x5b\x1f\x72\x62\x86\x18\xac\x7e\x7f\xb2\x87\x01\x16\x55\x72\x03\x10\x82\x72\xb3\x68\x92\xa5\x2a\x9b\x0a\x37\x70\x71\x5c\xca\x7d\xf9\x93\xe0\xd3\xee\xbc\xc0\xd5\xaf\x33\xdf\x25\x36\x2e\x05\x3c\x6b\x98\x09\x93\x85\x01\x16\x95\x72\x03\x10\xc2\x72\xbb\x70\x41\xad\xf6\xc2\xeb\x3b\x24\xdb\x7e\x2b\x83\xea\x4b\x17\x77\x96\xbb\x34\x5e\x2e\x7f\x75\xd4\x6f\x38\x45\x79\xa9\xfc\xd5\x77\x1b\x18\x60\x51\x2d\x37\x00\x21\x30\x37\x09\xd2\x3f\xd4\x8a\x9a\xde\x67\x14\xc4\x2f\x40\x1f\x84\xeb\x9e\x1b\xf2\xd6\x68\x3c\xb9\xe3\x43\x42\x7f\x9f\xd5\xee\xa3\x41\x04\xee\x02\x88\x8a\xb9\x01\x08\xa1\xb9\x41\x2b\xb7\xfd\x5b\x0a\x97\xfb\x8d\x97\x0a\x95\x1f\x05\x51\x2a\x17\x17\x76\xea\x84\xb0\x88\x9e\x1f\x8d\x59\x0d\x05\x2c\x5f\xaf\xc3\x00\x8b\xaa\xb9\x01\x08\xc1\xb9\x15\x78\x1e\xc3\xf0\xf6\xab\xd2\x71\x83\xca\x8b\x9b\x1a\x25\x2f\x5e\xcf\x5b\xa5\xfd\x22\x10\x3d\x5e\xb4\xdf\x65\xc6\x3e\xae\xaa\x01\x03\x2c\x2a\xe7\x06\x20\x84\xe7\x46\xb4\x8c\x47\x43\x1a\xf0\x6a\xf5\xf4\xb3\x1c\x55\x6f\x35\xbb\x2f\xb1\x46\x8f\x2a\x17\xac\xef\x5f\x3f\xd7\x71\xcb\xc4\x6f\x4a\xe5\x0a\x0c\xb0\xa8\x9e\x1b\x80\x10\xa0\x9b\xcc\xab\xa8\x61\x42\x41\xe1\xf0\x4e\x6c\xb4\x87\x50\x80\xac\xc8\xb5\x9b\x11\x45\xd5\xb9\xb7\x9e\x9a\x71\x2e\xfc\x96\xb9\x73\xff\x08\x0c\xb0\xa8\xa0\x1b\x80\x10\xa2\x5b\x68\x9d\x85\xc3\x2d\xbf\x07\xeb\xc9\xdf\x45\x82\x7e\xee\x70\x3a\xfb\xdd\xd0\xce\x1c\x9e\xc5\x0a\xe9\xbc\x8b\xd8\x5e\x39\x52\xa9\x00\x03\x2c\xaa\xe8\x06\x20\x04\xe9\xc6\x5a\xd4\xa6\x99\x02\xfb\x59\x34\x62\x7f\x0a\xf9\x3c\x79\xdd\xf2\xb5\x66\xfd\xc4\xd5\xa0\xc8\xee\xf1\xb9\xdb\xe7\xf3\x58\xec\x71\xdf\x33\x54\xd2\x0d\x40\x08\xd3\x4d\x33\x37\xce\xfb\x57\xbf\x4b\x92\xd6\xe6\xbd\x9c\x45\x57\xb5\xef\x3d\x76\x79\xe7\xac\xed\x77\x03\x49\x64\x06\xab\x3e\x39\xd0\xdf\x86\x01\x16\xd5\x74\x03\x10\x02\x75\x73\x28\x99\x71\xcd\x56\xba\xe2\xb9\x30\x17\xff\x31\xdb\x13\x0e\x74\xdb\x3e\xf5\xcb\x5c\x37\xa0\xd5\xf4\x19\x49\xcd\xd8\xf8\x55\x29\x18\x60\x51\x51\x37\x00\x21\x54\xb7\x28\x1f\xab\x3c\xb3\xc9\x38\xa7\xe8\x2b\x1a\xe2\xef\x44\x3c\x84\xa4\xdb\x3c\x6b\x5f\x5e\x4d\x0c\x5d\x4e\x54\x56\x3b\xa7\xbb\x48\x00\x03\x2c\xaa\xea\x06\x20\x04\xeb\xc6\x55\xfe\xd1\x30\xa7\xe1\x32\x8f\xc6\xe0\x04\x15\xeb\x5e\x2a\xbd\x78\xed\x2f\x5d\x56\x4e\x52\xb7\xce\xc1\x93\x15\xcd\x7e\x5b\xb8\xe1\x04\x95\x75\x03\x10\xc2\x75\x0b\x8d\xbc\x6a\xf2\x87\x61\xf3\xc3\x05\xda\x52\xef\xd7\x56\x09\x73\xec\x6c\xad\xb1\x6a\x54\xe2\x5a\x5a\xfb\x8b\xb4\x41\x0a\x4a\x00\x06\x58\x54\xd7\x0d\x40\x08\xd8\xcd\xc1\x8e\xf9\x38\x7f\x4a\x5e\x69\x80\xd6\x55\x1b\xb2\x9f\xa1\x7f\x9c\x5a\x7a\xe1\x6a\x8b\x1a\x2e\xa1\x77\x5f\x3f\xb3\xd6\x71\x58\xc3\x00\x8b\x0a\xbb\x01\x08\x21\xbb\x81\xbc\x5c\x23\x6e\xb9\x4b\x19\x4d\x43\xd4\x65\x97\x6d\xf0\x9f\x6c\x92\x58\x1f\x3d\x2f\xe5\x9b\x68\x7d\xf4\x0a\xed\xe7\x40\x40\x06\x03\x2c\xaa\xec\x06\x20\x04\xed\x56\x3f\x4b\x74\x4a\x51\xf7\xe3\x77\x45\xbe\xe4\xcf\xe4\xa1\x7d\xad\xb3\x4f\x92\x94\xf2\xfb\xaa\x8f\xce\xa8\x29\x5c\xb3\x20\x97\xd0\x82\x01\x16\x95\x76\x03\x10\xc2\x76\xfb\x42\x74\x7d\xea\x52\x3c\xf5\x82\x6c\x04\xb9\xce\xee\x99\x28\x66\xfe\xd8\xc8\x86\x09\x6c\xcb\x60\xe2\x87\x0b\x49\xdd\x17\x6f\xe1\xde\x01\xa8\xb6\x1b\x80\x10\xb8\xdb\x4f\x32\xca\xe3\x61\xbb\xde\xd9\x8b\xa9\x39\x89\xe3\xf4\xbf\x17\xae\x88\xa8\xec\xc5\xf4\x33\xac\x5e\xfb\x38\x78\x5e\xa7\xf9\xb9\x36\x0c\xb0\xa8\xb8\x1b\x80\x10\xba\x5b\xe0\x98\xfc\xd4\x4e\x9d\x76\x4b\x9f\xc2\xf5\xa3\x03\xd5\x46\xdf\x46\x57\x12\xa2\x3d\xad\x87\x67\x9c\x1b\x2d\x37\x85\xf8\x56\x9d\x60\x80\x45\xd5\xdd\x00\x84\xe0\xdd\x66\x3d\x72\xbf\x30\xbc\x4a\xd7\x75\x9a\x5f\x55\x62\x09\xa5\xfe\xe1\x7b\x65\x22\x23\x59\x28\x97\x90\x4c\xd6\x5a\xa9\xef\x95\xc1\x2d\x18\x60\x51\x79\x37\x00\x21\x7c\xb7\xe6\xb7\xaf\x88\x59\xb0\xd1\x51\xa0\xfc\xa6\x0b\x4c\xb1\x49\x92\x27\xc3\xe4\xca\x3f\xa0\xe8\x36\x3a\xef\x92\xff\x7d\x3c\xe4\x38\x0c\xb0\xa8\xbe\x1b\x80\x10\xc0\xdb\x49\x89\x4c\x4b\xda\x27\x01\x34\x4a\x35\xce\xf4\xdf\x65\x0c\x2c\xb8\x36\x2f\xc6\x75\xfc\x3e\x1d\xb9\x73\x43\x87\x99\x55\xce\x4c\x00\x06\x58\x54\xe0\x0d\x40\x08\xe1\xed\xf4\xf9\xa3\xf8\xa9\xb1\x35\xc2\x57\xbe\x1b\xc7\x3e\x1e\xc8\xd1\x9c\x66\xe2\xb8\xdc\xf5\xa3\x45\xe1\x85\x46\xcc\xb7\x2f\xdd\x0b\x62\x30\xc0\xa2\x0a\x6f\x00\x42\x10\x6f\x3f\x0c\xa9\x7f\xab\x3c\x5f\x24\x74\xb3\xbd\xf7\x9d\x7f\x80\x67\xd8\x03\xbf\x50\x46\x4b\x28\xd1\x25\xea\x44\x2e\x41\xf4\x9f\xf3\xb8\x57\x13\x95\x78\x03\x10\xc2\x78\x5b\x3a\xce\xbd\xf7\x61\xb0\xa5\xe5\x4e\x93\x4a\x7b\xa2\x65\xb1\xb2\x70\xfd\x98\x7a\x4d\xf3\x06\xcb\x69\x6c\xe0\xec\x4d\x1e\x02\x2e\x18\x60\x51\x8d\x37\x00\x21\x90\xb7\xea\xa0\xcf\x79\x7c\xfe\x37\x67\x5f\xbe\x0e\x78\xfd\xa0\x66\xf2\xc9\x25\x4f\xd9\x2a\xdd\xde\x5b\xbc\xcc\x26\x0f\x6e\xdd\xc6\xdc\xc4\x6d\x5a\x54\xe4\x0d\x40\x08\xe5\xcd\x9b\xc9\x64\x98\x6e\x33\x82\xe4\x01\x6f\xf3\xb1\x9e\x95\xa6\x13\x89\xd9\xa7\x5e\x72\x4a\x9b\x5b\x4f\x65\x48\xcc\x89\xdc\xd8\xc7\xbd\x00\xa8\xca\x1b\x80\x10\xcc\x9b\xcc\xf4\x12\xe3\x0e\x8b\xfb\xe8\x53\x59\xa5\xa3\x43\x1b\xa6\xc3\x03\x45\x44\xab\x75\xdf\xc6\x9a\xcb\x5e\x99\x55\x92\x9c\x74\xa2\x85\x01\x16\x95\x79\x03\x10\xc2\x79\x7b\xce\xdf\x23\x17\x1a\xcd\xf7\x2c\x90\xa2\x8a\x37\x91\x2e\x4d\x71\x99\x94\x25\xea\x94\x76\x05\x69\xa0\x86\x2d\xcf\xc5\x3f\xee\xb8\x77\x00\x9a\xf3\xf6\x77\xa0\xfb\xd7\x1f\xe3\x3a\x38\xd0\x21\xa0\x37\xe8\x7c\x8d\x84\x3e\xb4\xc1\x9c\x3c\xef\x7c\x43\x43\xa8\xab\xa7\xbc\xa9\x29\xe1\xda\x85\x95\xf7\x9f\xa5\x9e\xbf\xe4\xb2\xda\xc4\x7d\x5f\x50\xa1\x37\x00\x21\xa4\x37\x8f\x87\x65\xdc\x02\x76\x55\xa7\x9f\x56\x31\xa6\xc8\x34\xcc\x49\x0e\xf3\x9c\xa0\xec\xaf\x11\x18\x6e\x57\xf3\xf7\xbe\x87\x75\xc3\x1d\x8f\x51\xa5\x37\x00\x21\xa8\xb7\xfb\x37\x87\xb4\x5b\xce\xdf\xa0\x8c\x74\x53\xcf\x50\xa6\xee\xfb\xca\xb9\x5d\x13\x97\x53\xf9\xeb\xd5\x97\x11\xbc\x26\x6f\xd6\xb1\x3b\x30\xc0\xa2\x52\x6f\x00\x42\x58\x6f\xbf\x4a\x2e\x35\x49\x69\xff\xe1\xab\x77\x6c\xf8\xd0\x40\x6f\xfe\x8a\x58\xf1\x7b\x91\x40\x54\x07\x65\x25\x9f\x31\xc1\x47\x26\x35\x13\x18\x60\x51\xad\x37\x00\x21\xb0\xb7\x77\x59\x5c\x4f\x77\x54\x9e\xde\x0e\x2e\x26\x1f\x34\x34\x6d\xba\x38\x6f\xae\x33\x6d\xda\xc9\xee\x21\xc3\x1d\x35\x7b\xb5\x8c\x54\x15\x06\x58\x54\xec\x0d\x40\x08\xed\xcd\xc2\x51\xcd\x86\xc3\xe9\xf7\xfe\xda\x7c\xe1\xbd\x0b\x06\x0c\x13\x53\x15\x53\x57\x04\xc3\x64\x13\xd6\xf5\x4f\x9d\x23\xcb\xb6\xc4\x4d\x3a\xa8\xda\x1b\x80\x10\xdc\xdb\xf5\x4f\xe7\x3c\x68\xbf\x5b\x1c\x0b\xd6\xa3\x28\xb8\x5e\xdc\xb6\xf2\x48\x3b\x7d\x22\x57\x70\x84\x86\x2e\xfb\x86\x44\x4a\x89\xf4\x59\x18\x60\x51\xb9\x37\x00\x21\xbc\xb7\xd8\x67\xda\x8b\xa4\x54\xe4\xc3\xf4\x06\xc5\x5b\xba\xb6\xb6\x4d\x2c\xb7\x73\x7a\x13\x1c\xbc\xda\x45\x1f\xdc\xe1\x1f\x3d\x91\x64\x06\x03\x2c\xaa\xf7\x06\x20\x04\xf8\x96\xb6\x67\x5b\x92\x3f\xd4\x3c\xc3\xfb\x71\xc0\xdf\x42\xea\x2b\xd3\x04\xdd\xcf\x7e\x7b\xb7\x68\x92\xe1\x9e\x53\x11\xc4\x27\xc8\x70\x57\x53\x54\xf0\x0d\x40\x08\xf1\xed\x41\x45\xfd\x83\x49\x0d\xfc\x61\x4d\xf7\x0f\x49\xda\x59\x04\x2a\x32\xb6\xb5\x13\x53\xd0\x1a\xdd\xd5\xaa\xba\x66\x7a\x2f\x75\x0c\x0c\xb0\xa8\xe2\x1b\x80\x10\xe4\x1b\xcc\x6a\x74\xce\xdf\x9c\x99\x61\x35\xa7\x9b\x9d\x37\xbf\xb0\x7e\xab\x42\xd7\xb5\x25\x93\x3a\x38\xd7\x23\x5b\x91\xc4\x98\x06\xf7\x02\xa0\x92\x6f\x00\x42\x98\x6f\x8b\x77\x7c\xcb\x6a\xce\x92\x73\x3d\xe1\x81\x42\x4f\xc8\x4e\xab\xbd\x5d\xd0\x6d\x64\x9c\x10\xad\x21\x39\x29\x20\xc3\x96\x3d\x41\x08\x03\x2c\xaa\xf9\x06\x20\x04\xfa\x96\x88\x1f\x0e\xa5\x3c\xf9\x9a\xb7\x23\x2e\x16\x21\xf2\xe3\x51\x97\x7a\xa2\xed\x27\xb9\x93\x93\x93\x3c\x4f\xdf\x56\xf3\x5f\x2f\xc2\x1d\xf5\x50\xd1\x37\x00\x21\xd4\x37\xe9\x35\xc5\xca\x15\xe6\xb0\x5f\x23\x35\x4f\x1f\xe1\xbf\x4c\x27\x8c\xe0\xb0\x71\x6b\xc4\x4a\x6a\x4b\xe9\xcd\xcd\x43\x0f\x92\x68\x60\x80\x45\x55\xdf\x00\x84\x60\xdf\x7c\x23\x9f\x99\x59\x04\xde\xe0\x9e\x8d\xbf\x3e\xa4\xea\x13\xf3\x79\xb2\xb3\x49\xfd\x74\xc2\x92\xc3\xdd\x48\x57\x2e\x2a\x91\x74\xdc\x0c\x86\xca\xbe\x01\x08\xe1\xbe\xdd\x7f\x15\x71\xbb\x9f\xfb\xa3\xf2\xd4\x8f\xd5\xdf\x7b\x91\x95\x4c\x4c\x8b\xdd\x76\xa9\x03\xfc\x1c\x4d\xc7\x5b\x72\x8c\xc4\xb3\xd9\x60\x80\x45\x75\xdf\x00\x84\x80\xdf\xaa\x27\x67\xdc\x06\xfa\x1a\xdf\x66\xd0\x16\xd7\x5b\xf7\xd3\x3b\xee\xca\xdf\xf2\x5f\x19\xfd\x53\xb7\x3d\x63\x65\x95\x7e\x24\x81\x15\x06\x58\x54\xf8\x0d\x40\x08\xf9\xed\xb7\xb4\x5c\xb2\x2a\x5d\x81\x92\x6d\xb6\xe0\x36\x27\x79\x7e\x85\x43\xc1\x70\xcd\xd8\x99\xce\xb8\xb3\x74\xa7\xf9\xe7\x9e\x07\xe2\xc6\x73\x54\xf9\x0d\x40\x08\xfa\x8d\x3c\x9a\xf9\x4e\xbb\xfe\xc6\xe0\xf2\x46\x55\x5e\x9a\x0a\x15\x6f\x4c\xf5\x8c\x3d\xc7\xa5\x55\x43\x5a\xff\xe5\x5e\x6a\x19\x26\xdc\x10\x8c\x4a\xbf\x01\x08\x61\xbf\x5d\x57\x38\xc5\x4d\xc9\xd8\xea\xba\x96\x51\xfb\x5b\x3a\x70\x76\xbb\xf2\x61\xba\x6b\x7b\x5e\x98\xfc\xb2\x9b\xd5\xe8\xa3\xe0\x4b\xd2\x30\xc0\xa2\xda\x6f\x00\x42\xe0\x6f\x79\x24\x7e\xbf\xf3\x47\x64\x82\x95\xc5\x82\xf9\x31\x4c\xc9\xef\x2d\xaf\xbd\xfd\x55\x39\x4c\xa6\x29\x24\xec\x19\xae\xe5\xad\xa0\x04\x03\x2c\x2a\xfe\x06\x20\x84\xfe\xc6\xd2\xe5\x8a\xb9\x5a\xa6\xa0\x59\x73\x82\x17\x3f\x36\xd7\x5d\xc7\xc6\x81\xa4\x63\x64\x01\x5f\xb8\x50\xf0\x62\xee\x07\xae\x2a\xdc\xd1\x19\x55\x7f\x03\x10\x82\x7f\x23\xb2\xff\xfd\xa7\xc8\x90\xb9\x01\xfe\x65\x58\x56\x56\x1a\x7f\xa1\xec\xa3\xfe\xb1\xd0\x6b\xf7\xb3\xfc\xed\x8e\xcf\x84\x54\xc7\x51\xc2\x00\x8b\xca\xbf\x01\x08\xe1\xbf\x25\xf8\xb1\x5c\x35\x33\x3a\xaa\x99\xcc\x8f\x4f\xab\xfb\xed\xcb\xf6\xe8\xc0\x68\x5b\x2a\x6f\x20\x3e\xfc\xfb\x9b\x60\x8f\x79\x12\x0b\x0c\xb0\xa8\xfe\x1b\x80\x10\x00\x5c\xbd\x97\xfe\x13\xbd\xf7\x4f\x5c\x86\x57\x64\x5f\xdd\x1a\x0b\xe4\x4e\x35\xff\x18\xdd\x67\x7c\x49\x48\x46\xce\xd2\x9e\x6d\x4a\x11\x77\xd5\x40\x05\xe0\x00\x84\x10\xe0\xae\xbe\x33\xde\xa7\x4d\xe6\xcd\x2b\x33\x49\xe7\x2b\xaf\xda\xb9\x15\x25\xe9\xa3\xe4\xb3\x21\xe7\x39\x3c\xda\x58\x70\x41\xc9\x40\x07\x06\x58\x54\x01\x0e\x40\x08\x02\x6e\x67\x44\xdd\x22\x46\x45\x2c\x53\xe5\xee\xa7\x6f\x85\x94\xdb\x83\x74\x0e\xd7\x3e\x57\x63\x46\xa0\x11\xd6\xe8\xa1\x6d\x99\x1e\x7d\x18\x60\x51\x09\x38\x00\x21\x0c\x38\x2b\x3b\xc2\x67\x7d\x96\x5b\x3c\x84\x09\xef\xcc\x36\x9b\x4a\x1b\x66\xee\x85\xf7\x62\x7e\xa4\xf6\x5d\xa2\xf9\xd8\x3d\x5a\x2a\x8a\xdb\x67\xa8\x06\x1c\x80\x10\x08\x5c\x1a\x7e\x95\x85\x01\x66\xf3\xe4\x4b\x7c\x3c\xff\xd1\x6f\x4d\xf3\xdf\xb3\x7e\x36\xdc\xa4\x88\xcd\xe0\xd5\x99\x3a\x41\xd7\x8d\x47\x0f\x03\x2c\x2a\x02\x07\x20\x84\x02\xb7\xbc\xb6\x56\xde\x38\x7f\xbf\x22\x67\xb7\xb1\x4d\x74\xba\x72\x50\x99\x70\x67\xd1\x75\x26\xf0\x37\x77\xe3\x70\x8a\x6e\xbb\xd7\x29\x18\x60\x51\x15\x38\x00\x21\x18\xb8\x72\x4e\xd8\x5c\x55\x39\xfc\x5c\xb4\xb3\x72\x9c\x4c\xda\xaa\x48\xf8\x82\x25\x43\xbf\x0a\x71\x64\xc5\x68\x50\x8d\xc1\x2f\x6e\x59\x18\x60\x51\x19\x38\x00\x21\x1c\x38\xeb\xf5\x11\xfc\x39\x41\x01\x15\xc2\x51\x95\x8c\xf6\xb5\x93\xb9\x5f\x7d\xac\x3b\xe6\x7e\xb8\x45\xd6\xc6\xdb\x0a\x4b\x34\x64\x9a\xc3\x00\x8b\xe6\xc0\xfd\x1d\xe8\xfe\xf5\x27\x53\x0f\x0e\x74\x08\x08\xae\x73\x42\xa7\xc8\xfc\xf9\x9b\xea\x06\x37\xbd\xb9\xb6\x7a\xe2\xa3\x73\x61\xe5\x56\x03\x1d\xda\x57\xf8\x4a\xe2\x7c\xf6\x0d\x6a\x70\x03\x1d\x2a\x04\x07\x20\x84\x04\x97\x93\xf1\x67\x3e\x51\xb1\xe7\xf5\x1d\xd6\x39\x5d\x36\x39\xb6\x98\xdb\xc5\xbe\xe4\xf8\x4c\x7a\x14\xa2\xd1\xc6\xe5\xeb\x99\x6c\xe4\x30\xc0\xa2\x4a\x70\x00\x42\x50\x70\xc3\xaa\x6f\xfc\x49\x8e\x73\xa5\x6f\x34\xb2\x99\x6c\xd0\xff\xa6\xe1\x09\x93\x11\xe5\x8c\xa4\xe7\xfd\x91\x4a\xde\x76\xdf\xe7\xa8\x1c\x0c\xb0\xa8\x14\x1c\x80\x10\x16\x9c\x7d\x66\x7c\xaf\x96\x16\x7f\x5b\x58\xab\x4e\x40\x8e\x74\x78\xe7\xef\x51\x03\x71\x31\xf9\x7b\xb2\xd2\xe2\x14\x41\xa5\x67\x12\x4d\x61\x80\x45\xb5\xe0\x00\x84\xc0\xe0\xd4\x5a\xe6\x72\x30\x78\xf2\x47\x32\x40\x43\xef\x9e\x6e\x7f\xdf\x58\x32\x54\xfa\x6e\xbb\x6e\x41\xce\x18\xdf\xd1\x9e\xb4\x8c\x1a\x06\x58\x54\x0c\x0e\x40\x08\x0d\x6e\x38\x84\xfa\xd7\x89\xf8\x76\x92\x3c\x33\x93\xe9\x44\x21\x0f\x6e\xc9\x52\x15\x97\xb8\x7c\xc2\xe0\x2b\x6a\x47\x8f\xae\x84\x51\xe0\x0e\xee\xa8\x1a\x1c\x80\x10\x1c\x5c\x23\x87\x4f\xbe\x6d\xff\xaa\x7f\x9e\xc7\x30\xc1\xf7\x4e\x3f\x52\xa6\xe7\x3e\xc1\xc1\x81\x5c\xdb\x29\x31\xbd\xca\x67\x34\x43\x4e\xc0\x00\x8b\xca\xc1\x01\x08\xe1\xc1\x65\x11\xe9\x75\x8d\x27\xba\x4c\x5b\x9c\x54\x62\x9c\x6c\x9b\x2d\x8a\xbf\x6c\xf6\x33\xaf\xc7\xfa\x43\xbb\x49\x2b\x23\x63\x8b\x85\x32\x0c\xb0\xa8\x1e\x1c\x80\x10\x20\x9c\xa4\xa9\xbc\xfc\x87\xf4\xe0\xab\x78\xdd\xe7\xac\x33\xde\xdd\x4f\x39\x72\xe5\xc5\x9b\x3a\x07\x3f\x9f\x66\x15\x36\x79\xdd\x31\x3d\xdc\xab\x89\x0a\xc2\x01\x08\x21\xc2\xe9\x9d\xef\xb6\x97\xe0\x3a\x47\x57\xce\x44\x7f\x9d\xcc\x2e\xe8\xc6\xcb\x94\xf3\x1f\xd6\x64\x79\x63\x36\x58\x23\xad\x7a\x3a\x68\x49\x61\x80\x45\x15\xe1\x00\x84\x20\xe1\x4e\x26\xcf\x17\x0d\x68\x72\x76\xfe\x9c\x29\x6e\xce\x0a\x77\x11\x89\xc8\x93\xe4\x7c\xc8\xe0\x48\xda\xec\xb6\x36\x35\x49\x2f\x7d\x14\x06\x58\x54\x12\x0e\x40\x08\x13\xee\xc4\xa9\x8b\xbc\x04\x94\x72\x0c\xdc\xa3\xa4\x1f\x7c\x98\x1c\x94\xa1\xd9\x77\x92\x61\xce\x89\x3d\xed\xd6\x54\xfa\x32\x0d\xc6\x24\x30\xc0\xa2\x9a\x70\x00\x42\xa0\x70\xbe\x15\x6c\x7c\xbc\x31\x6c\x3c\x04\x7b\x1a\xaa\xd5\xc7\xbd\x63\xfb\x9a\x2f\xf5\x0f\xb3\x8c\x9e\xb1\xed\x75\x18\x6a\x51\xdc\xc2\xc2\x00\x8b\x8a\xc2\x01\x08\xa1\xc2\xa9\x2e\x32\x3f\x21\xe1\xe6\x57\x1d\x8a\x14\x49\xeb\xb8\x69\xbe\x1a\xf2\x20\x23\x46\x12\xd6\x48\x77\x93\xf3\x96\x54\xab\xac\x57\x84\x01\x16\x55\x85\x03\x10\x82\x85\xbb\xe5\x87\x71\xe6\x9d\x55\x88\x99\xb2\xef\x8d\xec\xf5\x51\xbc\x1c\x12\xb2\xe5\x26\x9d\x6b\x21\x23\x30\xa3\x23\x15\x63\xc1\x8d\xdb\x67\xa8\x2c\x1c\x80\x10\x2e\x5c\x45\xec\x76\xf8\xf4\xad\x9e\xde\xbb\x23\x63\xd1\xfa\xfc\x7a\x13\x99\x79\x96\xfb\x4d\xb9\x97\x48\x24\xf9\x07\x4d\x9b\x14\x14\x21\x18\x60\x51\x5d\x38\x00\x21\x60\x38\xf3\x5f\x37\xb6\x8e\xd7\xf7\x45\xc9\xbd\x3d\xf7\x20\x80\xc5\xf0\xb3\xd8\xaa\x98\xce\xc4\xd9\x53\x0d\x4e\xc7\xc7\xb3\x06\x53\x1e\xe2\xae\xa6\xa8\x30\x1c\x80\x10\x32\x1c\x4f\x89\xd5\x4e\x4e\xe9\xe5\xc6\x87\xc5\x2c\x12\x0f\x22\x2b\x8a\xed\x36\xed\x2f\x8f\x54\x1a\x76\x29\xd3\x88\x6f\x47\x90\x90\x30\xc2\x00\x8b\x2a\xc3\x01\x08\x41\xc3\x61\xa6\x5e\xbc\x1f\x0e\x2d\x58\xbf\x6e\x9b\x1d\x5e\x33\xcd\xd4\x12\xa8\xea\x36\x6e\x4e\xb4\xad\xa3\x2d\xf1\xbb\xfb\x63\x86\x90\x18\x0c\xb0\xa8\x34\x1c\x80\x10\x36\x9c\x4c\xee\xb5\x2a\xe9\xfc\x09\x27\x0e\x32\x0b\x39\x0d\x0d\xbf\xfb\x5f\xe4\xd2\x8e\x6b\xf1\xdc\x69\xe5\x11\x26\x0c\x13\xcc\xa5\xe0\x87\x01\x16\xd5\x86\x03\x10\x02\x87\x9b\x5a\xbd\x3b\xd1\x6a\x3e\x79\xfd\x72\x1b\x7f\x15\x2c\x55\x9f\x7b\x41\x81\x68\xff\x0a\xdd\xa5\xf5\xea\x63\xd3\x5b\xfd\x14\x6b\xd7\x60\x80\x45\xc5\xe1\x00\x84\xd0\xe1\x32\x0c\xac\x59\xa7\x49\xb2\xe2\x65\x38\x2d\x4e\x8a\xb2\x66\x2e\x3f\xc6\xe6\x27\x12\x75\xfd\x8a\xe2\x4c\x75\xaf\x6e\xba\xbe\x8e\x9b\xa8\x51\x75\x38\x00\x21\x78\xb8\xaa\xd6\x7b\x1d\xa9\x8d\x6c\x9d\x24\xbe\x1f\xea\xd9\xfc\xc8\xd3\xb5\x08\x84\x5f\x49\xa7\x5e\x6d\x14\x66\x16\xb3\x36\xfb\x30\x89\x3b\xb9\xa1\xf2\x70\x00\x42\xf8\x70\xee\xc1\xd7\x2a\x8e\xaf\x58\x6d\xf8\x9d\x6d\xaa\xd1\xbd\xa4\xed\x98\x92\x70\xc5\xd6\x23\x21\xaa\xc7\x6d\xdf\x99\x3e\xe3\x98\xd4\x15\x18\x60\x51\x7d\x38\x00\x21\x80\x38\x92\x99\x14\x0b\x7b\x36\xf5\x3b\xe6\x26\xe9\xdf\x4b\x9b\x47\xc5\x75\xd4\xf3\xcc\xdd\x84\xd2\x2d\x28\x5d\x3d\x7b\x9b\x24\x58\x78\x61\x80\x45\x05\xe2\x00\x84\x10\xe2\xea\xcf\xcc\x29\x2d\x9a\x66\x8e\x25\x3f\x74\x0b\x95\x61\x75\x99\x58\x26\xf2\x5e\xba\x7b\x35\x84\x9b\x25\x96\xc8\xbb\x9a\x59\x44\x06\x06\x58\x54\x21\x0e\x40\x08\x22\xae\x4a\xa0\x97\xd2\xa2\xf8\x92\x88\xe4\x53\x72\x1a\xfa\xa7\x09\xda\xec\x65\xb2\xfc\x82\x4e\xef\x3d\x29\x1e\x73\x60\x3c\x0c\xa2\x2e\xc2\x00\x8b\x4a\xc4\x01\x08\x61\xc4\x11\xca\x26\xc7\x9d\x4c\x25\x0b\xab\xc2\xb2\x89\x96\x6d\x9d\x58\xbd\x5e\xe8\x1b\x71\x03\xf3\xd9\xc5\xce\xbf\x41\xa5\x4d\x70\x0d\x77\x3d\x43\x35\xe2\x00\x84\x40\xe2\xb2\x7b\xef\xdd\xd6\xab\x1c\xec\x87\x98\x66\x2b\x4e\xbf\xa7\xbf\xeb\xff\xba\x6c\xb3\x9a\x9c\xea\xbd\xd7\x70\x17\x7e\xec\x59\x72\x5d\x18\x60\x51\x91\x38\x00\x21\x94\xb8\x69\xa5\xd7\xf4\x57\x4f\x53\xdc\x6d\xd7\x16\xce\x14\x4a\x76\xb3\x27\xb8\xc8\x35\xc6\x93\xcb\xb1\xc9\x70\x3d\x36\x2c\x60\xbb\x50\x10\x06\x58\x54\x25\x0e\x40\x08\x26\x8e\xff\xa6\x78\xa7\xe8\xb7\x67\xc5\xe6\x77\x48\x05\xe4\x33\x56\x05\xfc\x15\x2d\x3f\xb0\xf2\x19\xd4\x98\x0f\x75\xb9\xf6\x13\xcb\xdf\x80\x01\x16\x95\x89\x03\x10\xc2\x89\x93\x71\xb2\xbe\x97\x24\xde\x54\x02\xdb\xfd\x51\x9f\x5f\x17\x5d\x8e\x0f\xb4\xe6\x6a\x0e\x5d\x50\x8d\xe3\x1b\xf4\x63\xbd\xba\x79\x0e\x06\x58\x34\x27\xee\xef\x40\xf7\xaf\x3f\x6c\x7f\x70\xa0\x43\x40\x71\x72\xc4\x55\xd8\xdb\x01\x4c\xa4\xe5\xe3\x45\x35\x01\x46\xfa\x02\xb4\x0f\xb3\x29\x5e\xc8\x5a\x36\xba\x26\xd0\x24\x32\xd2\xdf\xc3\x1d\xdc\x51\xa1\x38\x00\x21\xa4\xb8\x71\xe2\x1f\xeb\x16\xae\xf7\x7c\x4e\xdc\xf5\x12\x74\x62\xfd\x42\xd2\x9f\xbb\x1c\x6b\x5a\x12\x39\xf7\x95\xe4\xa9\xbb\x50\xe2\x6d\x11\x18\x60\x51\xa5\x38\x00\x21\xa8\x38\x65\xa8\x33\xd9\x67\xd7\xd8\xce\x17\xe6\x23\xe0\xe0\xbb\x68\xa5\xef\xed\x05\xf7\x2e\xed\x7a\x7e\xfa\x78\x84\x17\x6f\x62\xcb\x02\x06\x58\x54\x2a\x0e\x40\x08\x2b\xee\x59\x96\x8a\x50\x19\x43\xf7\xd9\xc0\x17\xcd\x06\xf1\x57\xa7\x2a\xf8\xbc\x6f\x32\x27\x48\x05\x0d\xa6\x61\xb9\x4b\xdd\x3c\x65\x71\xf3\x3c\xaa\x15\x07\x20\x04\x16\xf7\x7e\xe0\x3a\x5b\x76\xff\xe8\xb3\x05\x89\x15\x6a\xc8\x67\xf4\xd1\xfd\xdd\xfe\x9c\x48\x85\xd4\xd1\x7b\x17\x7e\x89\xdf\x66\xd3\xc7\x7d\x65\xa8\x58\x1c\x80\x10\x5a\x9c\xeb\x7a\x49\xb1\x4d\x0d\x91\x66\xfc\xa5\x84\x8e\xd6\x59\x1e\xc2\xf9\xec\x18\x31\x3a\xd2\x6d\x48\xf9\x6d\x15\xa9\xc0\xf3\x16\xdc\x51\x0f\x55\x8b\x03\x10\x82\x8b\xb3\x76\x3f\x33\x91\x1e\x27\xad\x91\xa4\x47\x53\x97\x96\x01\xd9\xe7\x4b\x7e\x5c\x51\x70\x78\xe1\x5e\xcb\xf8\x42\xd0\x8d\x63\x12\x1f\x06\x58\x54\x2e\x0e\x40\x08\x2f\x6e\xda\x61\xf8\xcb\xec\x72\xd1\xfa\x2c\x86\x6f\xd2\x30\x55\xe5\x46\x41\xd8\xb7\x85\x7a\x17\x33\x60\xac\xeb\x67\xcd\xb8\x4f\x75\x19\x06\x58\x54\x2f\x0e\x40\x08\x30\x8e\xcc\xea\x54\x3d\x95\x81\x79\x6f\xe1\x99\xf6\xaa\xe9\x4b\x1e\xcf\xdc\xd7\x45\x76\xf9\x75\x08\xce\xfe\x52\xae\x2f\x64\x7e\x64\x4d\x06\x03\x2c\x2a\x18\x07\x20\x84\x18\x97\xe6\xb9\x5f\xa6\x25\x1d\xa8\x4e\x69\x7f\xb9\x22\x69\xc6\x56\xeb\x79\xa5\x8a\xdd\x7d\xae\x6e\x77\x81\x95\xdf\x06\x5f\x97\xb5\x71\x03\x1d\xaa\x18\x07\x20\x04\x19\x57\x30\x4a\x1a\xff\x2e\xbf\xa4\xe4\x3a\x25\x9b\x91\x04\x74\xd2\x70\x3d\xf5\x52\x61\xb2\xde\x5a\xa4\x41\xd2\x5e\x7f\xfc\x83\x1d\xdc\xd6\x40\x25\xe3\x00\x84\x30\xe3\x1e\x2a\x4b\xf7\xd5\x61\x94\x18\x2c\x38\x5f\xda\x85\x3f\xb0\x79\xf8\x2c\xbb\x65\x3e\x2e\xd5\xad\xe3\x8f\x1c\xff\xe0\x07\x01\x4e\x3a\x18\x60\x51\xcd\x38\x00\x21\xd0\x38\x9b\x44\x8b\xee\x53\x19\x1a\x05\x16\xe2\x06\x1a\xad\x6f\xfb\x83\x04\x35\x68\x65\xe9\xae\x88\x11\xa6\x7b\x4f\xb8\xb4\x64\x3e\x3d\x0f\x03\x2c\x2a\x1a\x07\x20\x84\x1a\xe7\xf9\x26\x6c\x85\x68\x82\x76\x3b\x85\x10\xbe\xae\xf3\x5e\x58\x53\x94\x8a\x9a\x7f\xb1\xaa\xb6\x1d\xd3\xb6\x70\xa6\x87\x47\x06\x77\x01\x44\x55\xe3\x00\x84\x60\xe3\xf6\x20\x3c\x7f\x16\xa7\x73\xa6\xcb\xc1\x0f\x35\x8e\xb8\x30\xf3\xf6\x3c\x7d\x7f\x2e\xac\x6d\xc1\x98\xda\x66\x88\x7f\xc9\xc3\xc2\x04\x06\x58\x54\x36\x0e\x40\x08\x37\x6e\x4a\x9a\xc9\xe6\x88\x52\xfb\xd4\x87\xf4\x31\xd8\x5f\x9c\xeb\x52\xae\x78\x86\xa5\x07\x69\xaa\x94\xf2\x05\x5a\x62\x81\x00\x3c\x5c\x0c\xd5\x8d\x03\x10\x02\x8e\xd3\xee\x11\xe8\x95\xc8\x08\x50\x0c\xb9\x6e\x7d\xa5\x8d\xf3\x02\x95\xae\xe4\x37\xc3\x68\x2a\xb6\x9a\x84\x50\x53\xe2\x08\x92\x45\xdc\xa4\x83\x0a\xc7\x01\x08\x21\xc7\x29\x4e\x77\xbd\x09\xbd\x32\xf8\x4c\xe7\x6a\x43\xec\xb6\x47\xcb\x6b\x95\xdd\xf9\xee\x9c\x04\x91\x72\xce\x90\x65\xfc\x1f\x7d\x27\x70\x87\x2d\x54\x39\x0e\x40\x08\x3a\x6e\x56\xad\x72\x7c\xcf\x50\xc9\x10\x1a\xe5\x12\xc1\xcb\x31\x34\x72\x0b\xb8\x60\xb6\x72\x67\x54\xed\x69\x90\xa9\x5e\xe3\x78\xb3\x13\x0c\xb0\xa8\x74\x1c\x80\x10\x76\xdc\x57\x8a\x76\x96\x33\x26\xdf\x02\xb3\x5a\x7e\x59\x97\xb7\xf9\x87\x64\xc5\xc7\xdd\x0c\xff\x44\x2e\xe0\xa9\x4f\xf3\xe0\xc7\x8f\x9e\xd3\x30\xc0\xa2\xda\x71\x00\x42\xe0\x71\xde\xca\x3d\x65\x5b\x49\xa2\x97\xee\x72\xe0\x7d\x88\x33\x7d\xcf\x53\xd9\xc9\x0b\xe6\x25\xc3\x92\x8f\xe1\x2d\x29\x64\xcf\xfc\x9f\x1f\x1f\xa2\xe2\x71\x00\x42\xe8\x71\xf8\xba\x67\xcf\xae\x9e\xde\x77\x64\x8b\x3f\x1b\xee\xff\xe7\x7c\x9d\xf1\xc9\xd2\xb2\xd4\xad\x7d\xd9\x4b\xa5\xe3\x77\x97\x62\x4d\xcd\x60\x80\x45\xd5\xe3\x00\x84\xe0\xe3\x64\x6e\x9e\xd9\xcd\x31\x5d\x8e\x08\x14\xcc\xe5\x52\x8c\x8e\xb2\xa0\xca\xb5\x8c\x72\x32\x20\x20\x95\x1f\xfd\xa8\x34\x54\x05\x84\x61\x80\x45\xe5\xe3\x00\x84\xf0\xe3\x56\xce\xb9\xdd\x1b\x1d\x3a\x92\xed\x21\xa6\x39\xcc\x6b\x11\xfa\x49\x45\xab\xf6\xc4\x4e\x7c\x58\xd9\x73\x0e\xd3\x37\x31\xbc\xc6\x9a\x30\xc0\xa2\xfa\x71\x00\x42\x00\x72\xdc\x99\x0b\x5a\x7d\x57\xde\x99\x8a\xed\x70\xab\x30\xf2\x77\xbc\xac\x79\x35\xb7\xac\x11\x42\x6a\xcc\xa1\x1b\xed\xa2\x71\x93\xf1\x12\x0c\xb0\xa8\x80\x1c\x80\x10\x82\xdc\xe3\xe5\xcb\x12\x9e\xc7\xef\x01\x4b\xe9\x45\x41\x68\x9c\x29\xb4\x26\xb6\x93\xf8\x29\x4f\x57\x58\x2b\xd5\xd3\xbb\xc2\x6c\x65\xda\x30\xc0\xa2\x0a\x72\x00\x42\x10\x72\x06\x7c\x3f\x97\x1f\x8d\x7d\xbf\xe2\x64\x77\xeb\x5a\x7e\xf1\x3a\x03\xc7\xc6\xd7\x07\xd9\xc4\x82\x5c\x03\xf3\x8f\x2f\x7b\x5d\x92\xc7\x1d\x69\x50\x09\x39\x00\x21\x0c\x39\x9d\x3b\x4c\x94\x0e\x59\x97\xd2\x69\x38\x88\x3c\x7e\x36\x4e\x66\xe5\x70\x8e\xf1\xae\x56\xfb\x7e\x9a\x0b\x62\xda\xcc\x8f\xee\x23\x86\x01\x16\xd5\x90\x03\x10\x02\x91\x9b\x13\x4d\x0e\xee\x2f\x7a\x5f\x46\xb1\x42\xb5\x44\x3f\xe1\x7a\x8c\x94\xd9\xf8\x1a\xef\xcf\xd5\xd3\x02\xa2\xa6\x73\xf2\x43\x64\xb8\x17\x00\x15\x91\x03\x10\x42\x91\x1b\x26\x8c\x7b\xb2\x78\xbc\xe7\x61\x90\xd5\x80\x82\x04\x08\x4b\x0f\x7b\x73\x2b\xdd\x5f\x55\x4d\xc1\xa3\xfc\xd8\x22\x83\x76\xc9\x19\x18\x60\x51\x15\x39\x00\x21\x18\xb9\xfd\x9f\x3e\x78\x25\x2a\x8d\x32\x03\x34\x3f\x23\x29\x6d\x55\x06\xd6\x52\xad\x5e\x2e\x77\xda\x3e\xe3\xc3\x57\xec\xac\xbc\x77\xd3\x18\x06\x58\x54\x46\x0e\x40\x08\x47\x8e\x91\xe2\x93\xcc\x70\xfa\x8a\x18\x83\x6d\xa5\xfa\x52\x0f\xa7\x42\xa6\x5d\xad\xfd\xd2\xc0\x5a\x92\x92\xdb\x98\xeb\x0b\x4c\xc4\x4d\x18\x60\xd1\x1c\xb9\xbf\x03\xdd\xb7\x19\xf1\x11\xd2\x3c\x55\x62\xf6\xcb\x2b\x67\xfa\x23\xb6\x87\xc8\xbf\x47\x3c\xaf\x31\x14\x3d\x0b\x07\xb8\xfb\x4e\x3f\x29\x3a\x7f\x70\xa0\x43\x40\x72\x93\x0c\x75\xb3\x29\xa5\x04\x5f\x44\x77\xcf\x3c\xdb\xd2\x8f\x95\x38\x22\x19\xae\x22\x8c\x2f\x4d\x99\x33\xd9\x98\x4b\xeb\x34\xa4\x04\x03\x2c\x2a\x24\x07\x20\x84\x24\x77\xb6\xba\x9a\x8c\xa6\xe6\x4b\x79\x96\x45\xc2\xd1\x51\xb7\x64\x02\xc9\x7b\x17\x9f\x44\x58\x0f\xdc\x31\xd4\xbc\xf1\xf0\xfd\xc9\x65\xdc\x6c\x8a\x2a\xc9\x01\x08\x41\xc9\xd5\xbf\xe7\xb7\xd1\x14\xed\xd2\xdf\x6b\x66\x51\x5d\x01\x1f\xe0\x86\x02\x8d\x20\x4d\x0d\xcf\x38\x53\xee\x87\x45\x4c\xe9\x1b\xb8\x6b\x16\x2a\x25\x07\x20\x84\x25\x17\xf5\xe7\x3e\xe5\x48\x5b\x4e\xc8\x73\xb0\xdb\xa4\xf8\xeb\x89\x4b\xde\x60\xb0\x75\xe4\x99\xc8\x07\xf7\xde\x2c\x65\xcb\x94\x86\xe9\xc0\x00\x8b\x6a\xc9\x01\x08\x81\xc9\x19\x64\x7e\x14\x36\xdb\x7e\x5c\xec\x12\x24\xfd\xf0\x9d\x17\xbc\xbe\x77\xae\x95\xf3\x48\x9b\x34\x74\xd2\x2f\xe0\x41\xd8\x58\x04\x6e\x08\x46\xc5\xe4\x00\x84\xd0\xe4\xec\x87\x02\x8c\xd5\xee\xec\xdf\x62\xb4\x31\xd8\x6c\x1e\xda\x93\x1b\x78\x46\xd0\x36\x26\xc5\xfe\x72\xd5\x8e\xa8\xc3\x80\xde\x0f\x37\x1d\xa2\x6a\x72\x00\x42\x70\x72\x63\xa2\xcc\x5e\x4f\x25\x63\x14\xaa\x5d\x6e\x1f\x8f\x29\xaf\x0b\xd3\xa6\x1d\xf7\xdc\xa2\x57\xe3\x60\xd2\xc5\xab\x77\xfc\x59\xa2\x0c\x03\x2c\x2a\x27\x07\x20\x84\x27\x07\xd6\x7c\x75\x75\xbf\xbf\xe4\x7e\xc9\x9d\xe6\x97\xf8\x7a\x6e\xea\x88\x20\xe9\xf4\x1d\x53\xad\x27\x56\x6f\xcb\x3a\xf7\x18\x26\x1d\x61\x80\x45\xf5\xe4\x00\x84\x00\xe5\xd4\xb1\xda\xa6\x14\x99\x74\x85\x2b\x89\x84\xbf\xb8\xc3\xb3\x48\xfb\x5a\x56\xd6\xc8\xbd\xde\x91\xb4\x67\xca\xdd\x7d\xd9\x4b\x8b\x3b\x6b\xa3\x82\x72\x00\x42\x88\x72\xc7\x8f\xf7\x7c\x3c\x37\x90\x6f\x24\x9f\xd9\xf1\x6a\x8b\xe6\xfa\x60\xcf\xfd\x3c\xd7\x96\xd2\xb8\x27\x9a\xe4\x9d\x29\xdd\xc9\xf7\x70\x37\x5a\x54\x51\x0e\x40\x08\x52\x6e\x04\x53\xe8\xb0\x7a\xb7\x2b\x7f\x93\xe2\x1a\xff\x6f\x95\x07\x5e\xc5\x0d\x79\x2b\x84\xdf\xe8\x09\x0d\xdf\x1f\x21\xba\x29\xf0\x8e\x07\x06\x58\x54\x52\x0e\x40\x08\x53\x4e\x23\xf1\x42\xcd\x63\xfb\xd4\xaa\x79\xbf\x94\xf9\x2f\xe4\xae\x77\xea\x88\x3f\xf4\xee\x3c\x9f\xc9\xdf\x58\x7a\x53\x45\x71\x8c\xff\x2e\x0c\xb0\xa8\xa6\x1c\x80\x10\xa8\x9c\xf3\x2b\x11\xe2\xef\x8b\x9a\x26\xab\x5a\x86\xd2\xe6\x9c\xfc\x49\x2a\xaa\x47\x4e\x1c\xbf\xa7\xc6\xf7\x2b\x2b\x16\x94\xfa\x79\x5a\xc1\x00\x8b\x8a\xca\x01\x08\xa1\xca\xc9\x46\x08\x3f\x71\x65\xc9\x7a\xbb\xdb\x75\x7f\xd6\x89\xd6\xa3\xc4\x80\x63\xd5\x58\xf9\x9a\x0e\xf1\x20\xe7\xc9\x6b\xdc\x42\x7e\xb8\xf1\x1c\x55\x95\x03\x10\x82\x95\xdb\xf8\x60\xa6\xbb\xff\x41\xaa\x88\x58\xda\x2d\x64\x38\xa4\x9f\x72\xe0\xcf\x4b\x5f\x03\x3a\x91\x53\xeb\x63\x78\x9f\x22\xc3\xcc\xf4\x61\x80\x45\x65\xe5\x00\x84\x70\xe5\xd6\xba\xc2\xfe\xb0\xe1\xa5\xe5\x9a\x6b\x3f\xb9\x89\xbf\x75\x99\xe7\xe9\x16\x75\x7f\x96\x22\x2f\x9b\x42\x7a\x24\x45\x42\x32\x1d\x3d\x0c\xb0\xa8\xae\x1c\x80\x10\xb0\xdc\x33\x8b\xc7\x12\x55\x41\x06\xb2\x8d\xda\xa6\x52\xbd\x4d\x4d\xfe\x3c\x52\x1a\x76\x46\x9f\x8d\x20\xb5\xd0\xa7\xb1\x8a\x5a\xd5\x52\x30\xc0\xa2\xc2\x72\x00\x42\xc8\x72\x0c\x36\x98\x19\x2d\x9f\x2f\x17\xc8\xa8\x45\x4d\xf9\x43\x45\x64\xb8\xd6\xb7\xaf\x52\xab\x4e\xb8\x09\xea\x6d\x3d\x96\x17\xdb\x87\x60\x80\x45\x95\xe5\x00\x84\xa0\xe5\x5e\x87\xb5\x4c\x3a\xef\xe2\xd7\x51\xfa\xaa\x7f\x9a\x9b\x8e\x48\x9f\xd5\x5e\xa5\x24\x1b\xdf\x72\xcf\x26\x66\xb0\x5a\xdd\x92\xc6\x5d\xcf\x50\x69\x39\x00\x21\x6c\x39\xe3\x81\x86\x15\x67\x09\x83\xc6\xcc\xb5\x98\xd7\x4f\xc6\xfc\xbe\x4f\x9b\xf4\xee\x28\x8c\xee\xef\x0d\xd4\x29\xa5\x11\x67\x85\x1e\x87\x01\x16\xd5\x96\x03\x10\x02\x97\xcb\xb6\x88\x8b\x8e\x9b\xd7\xb7\xbc\x97\xf2\xed\x8c\x59\x00\x76\x56\xe5\x85\x4f\x28\xf3\xa3\x0f\xad\xa7\xac\x8d\xc3\x8e\xae\xf2\x5a\xc2\x00\x8b\x8a\xcb\x01\x08\xa1\xcb\x19\x7e\x13\xa3\x7d\x37\xe4\x51\x9f\xf2\x63\x52\xe6\xa3\xd2\x53\x9d\x4e\x17\x4f\x93\x1c\xc3\x88\x07\xbd\x17\x9f\x3e\x1f\x31\x8b\xb9\x00\x03\x2c\xaa\x2e\x07\x20\x04\x2f\xd7\x77\x87\x76\xe8\x29\xb8\xd0\x6b\x44\xd5\x2c\xeb\x9b\xe1\xab\xdf\xf0\x28\xd8\x93\x79\xb3\x77\x51\xd0\x48\xae\x9d\x95\x1d\x4f\x0f\x06\x58\x54\x5e\x0e\x40\x08\x5f\xee\xcc\xfb\x66\xc1\x95\xd7\xe7\x9a\x4c\xc5\xf8\xcd\x4e\x11\x17\x5b\x5f\xb0\xa4\x2f\xde\x6d\xd3\xfe\x65\x7d\x4d\xfa\x6d\x87\x1b\x0b\x1f\x0c\xb0\xa8\xbe\x1c\x80\x10\xc0\x1c\x0d\x81\x62\x1f\xf9\x27\xc9\xed\x13\xfe\xb9\x36\x52\x8b\xef\x3e\x13\x9b\xc9\xe6\x61\xa5\x84\xad\xb4\x9a\xfe\x68\x64\xae\xb2\xe1\xe6\x09\x54\x60\x0e\x40\x08\x61\x6e\xd1\xb3\x37\x7e\x95\x30\xfa\xd4\xdd\x9c\x53\x98\x89\x00\x63\x46\xad\x62\xdb\x63\xdf\x0c\xc5\xd5\xda\x08\x5c\x4a\x31\x66\xd3\xb8\x63\x20\xaa\x30\x07\x20\x04\x31\x37\xe8\xaf\xc6\x70\xee\xca\x14\x47\x29\x83\xf7\xf2\x06\x05\xd9\x45\x0e\x92\x13\x4d\x15\xc3\xe7\xb9\x59\x13\x8a\x5f\x66\x37\x5c\xc4\x7d\x65\xa8\xc4\x1c\x80\x10\xc6\x1c\xd6\x59\xb6\xc3\xfe\xad\x77\xbf\x90\x1f\x65\x76\xaa\x23\x91\xab\x18\x78\xc3\x1f\xd1\x74\x09\x58\x71\xfe\x79\x1b\xfc\x51\x02\x37\x1e\xa0\x1a\x73\x00\x42\x20\x73\x63\x51\x55\x27\xdd\xf2\x67\xac\x1f\xe0\x7f\x2a\xf5\x2d\xcd\xba\x1d\x5f\xe3\x3c\xa5\x56\x50\x24\x26\x0a\xaf\x1d\x0f\xe3\x91\xa7\x82\x01\x16\x15\x99\x03\x10\x42\x99\xa3\x5c\xa6\x17\x89\x53\x0d\x3c\xbb\x6f\xe8\xfd\x61\x15\x4b\x7d\x42\x29\x66\x4e\x82\x35\x4a\xf5\xea\x6b\xa2\xe3\xe6\x8d\xce\x0a\xac\x30\xc0\xa2\x2a\x73\x00\x42\x30\x73\xaa\x58\xa2\x4c\x15\xef\xd8\x8d\xc0\xe3\x99\xa3\x3d\xae\xd9\x53\xcb\x56\x2c\xe3\xc7\x54\x7c\x6f\x68\x52\x0a\xf7\xf5\x6e\xea\xe1\xce\x94\xa8\xcc\x1c\x80\x10\xce\x9c\x14\xdf\xe0\xc2\x28\x03\x7c\x09\x3a\xf5\x9a\x35\xcc\xf1\x19\xa5\xec\xa2\x76\xc0\xd3\xe3\xd7\x2a\x92\x7e\x2e\x0c\x60\x23\xa2\xb0\x30\xc0\xa2\x39\x73\xe5\xd4\xff\x35\xd0\x31\xdb\x27\xb2\xf7\x7d\x6a\x98\x31\x7f\x42\x2a\x5b\xa2\x49\x42\xcd\x68\x46\x46\x64\xe2\x96\x3f\xc1\x7a\x9e\x29\xcd\x8b\xab\x64\x10\x8e\xe5\xef\x3b\xad\x7b\x0a\xef\xbf\x56\x33\x9a\x18\x31\x53\xd0\xe6\xe7\xcc\x5a\x8d\x4b\x10\x3a\xf9\xca\xdf\xea\x24\xe8\x7c\x5a\xfc\x0b\x6c\x30\x8e\x9c\xa8\x98\x9a\xab\x39\xb0\x74\x86\x82\x6b\xeb\x58\xca\x49\x93\x54\x86\x87\x2a\xec\x1f\x72\xdc\x62\x78\x52\x2c\xee\xf7\x1e\xa5\x73\x05\xd3\xf2\x02\x43\xa9\x36\x07\x96\x7e\x7d\x60\x7b\xa3\x5b\xd7\xbe\xc2\x2d\xcb\x99\x3a\x42\xaf\x6c\x2b\x5e\x8e\xae\x84\xf9\xe4\x6c\x11\x9d\x6a\xed\xf8\xc2\xd5\x1f\x17\x0e\x2c\xf5\xfb\x7d\x35\xef\x83\x55\x46\xfb\x66\xa4\xb1\x91\x31\x3d\x79\x89\xd2\x3a\x2d\x6d\x00\xfd\x9b\x34\x67\xc2\x4c\x2a\xbf\xb5\x08\x81\x03\x4b\x05\xbf\xf8\x15\xeb\x88\xe8\xf3\x06\x2a\x86\x86\xee\x15\xa6\x1b\x02\xc7\x93\x49\xad\x7d\x4e\xcf\x68\x67\xda\x60\x82\x38\x4c\xcb\x81\xa5\xcd\x4c\x20\x28\xdc\xa1\x30\xaa\x55\x39\xd4\x73\x6e\x21\x51\xe0\xb7\x7a\x4c\x1c\xa5\x96\x9a\xea\xc2\x19\x9a\xe8\xfd\xc7\x2d\xc1\x07\x96\x5a\x56\x85\xf2\xe8\x9d\x3c\xb6\x52\xa8\x67\x63\xd2\xa9\x4f\xd8\xfd\x4a\xff\x78\xc0\xa5\xcd\x10\x3d\xa3\x0a\xbe\xe5\x22\x25\x2f\xed\x03\x4b\x6f\x99\x32\x2a\x34\xaf\x94\x88\x47\x2a\x49\xf1\x3f\x92\xcd\xbf\xa8\x6f\x7a\xaa\x5b\xa0\xc7\x6d\x77\xf0\xda\xf5\x96\xa5\x0c\xec\xc1\xea\xd0\xcf\x9f\x80\xed\x43\x91\x17\x7e\x97\x48\xed\x79\x22\x3d\x16\xaf\x3f\x1c\x78\x09\x13\x11\x84\xab\x3e\x5c\x5b\xd7\x5f\x7d\x38\xb8\xd4\xb4\x62\xe8\xb6\xb9\xdf\xc4\x29\x8c\x9d\x8e\x6a\xac\xdc\x00\xb1\xdf\x55\xef\x6f\x17\xbf\x7f\x1c\xee\xbd\xf4\x35\xd7\xb1\x92\x27\xf2\xc0\x52\x99\x44\xca\x7c\x81\x6c\xb9\xc9\x0b\x4a\xa7\x95\x4b\x24\xe1\x8c\xc0\x26\xb1\xdd\xd6\xee\x16\x22\xb2\x96\xf3\x0a\x9e\xda\xe2\x67\x0e\x2c\x3d\x5a\x64\x32\x64\xa9\x37\xae\x42\x46\x1b\x57\x1d\x2a\x2e\xeb\x1a\x81\x7d\x5a\x44\x61\x54\x6c\xcf\xad\x28\xed\xfc\xa9\xa6\xbd\xe7\xc0\xd2\x16\x32\x26\x91\x2b\x6f\x94\x27\x73\xa8\x8e\xf2\x73\x5b\xb3\x12\x78\x87\xdf\x60\x70\xde\xf7\x7b\xf4\xe7\x4a\xca\x9b\xe5\xbc\x8a\xb4\x03\x4b\x39\x46\xae\x35\xa6\x6d\x70\x12\xab\x90\x5b\xcc\xb6\x00\x85\xf2\xf1\xee\x81\xb2\xc5\xcb\x1b\xdb\xb7\xbe\xf5\x94\xe7\xce\x9c\x59\x38\xb0\xb4\x2e\x9e\xb6\x92\x5f\xe0\x4a\xed\x44\xbb\xfe\x03\x0c\xdb\x5e\xc6\xda\x4d\xad\x1f\xe4\xe1\x59\x85\xfe\x49\xce\x47\x3c\x1c\x8d\x4f\x1d\x58\x3a\x69\xb6\x23\x3c\x6e\x63\x36\xf4\xfa\x1c\x86\xb5\x6b\xd4\x72\x30\xc5\xf0\xf3\x2b\xf7\xc7\x44\xc1\x57\x77\xa6\x6f\xef\xeb\x0d\xbf\x39\xb0\x34\x9d\x55\xdd\xac\xde\x45\xd5\xc8\x93\x64\x50\xab\x97\xfc\xfb\x17\x9f\xa3\xc1\xd3\x3f\x66\x6f\xc4\xc6\xdf\xac\xe9\xd2\x4d\x15\x3a\xf8\x7d\x7d\x64\x28\x3d\xbd\xac\xff\x3e\x96\xe4\xc7\xea\xa7\xa9\x3f\xb2\x01\xad\xc7\xb2\x6e\x0b\xc9\x8a\xcb\x6d\x15\xf2\x7c\x8f\xc9\x33\x73\x3e\xb0\xf4\xf8\xdc\xd7\x23\xe1\x0f\x0a\x7e\x5c\x95\x9d\x78\x23\x2e\xed\xf9\xcc\xec\x16\xf9\xb2\x2b\x83\x5a\x8d\x5e\xbf\xbe\x8c\x57\xed\xb5\x4b\x07\x9f\xd6\x9d\xc7\xf6\x94\x63\x72\x46\x0f\x2b\xb7\x2c\x36\x99\xca\x49\x3c\x3f\xbb\xa7\xc3\xed\xf2\xf4\x5f\x64\xae\x98\x8c\x54\xd2\x5f\x3c\xb0\x54\xf5\xde\x53\x7c\xf6\x5b\x8c\xbf\x85\x0c\xdf\x45\x25\x55\xef\x79\x45\x72\x7f\xe3\x29\xdd\x8c\xcd\x65\xbc\x4b\x36\xcb\x92\x6c\x7c\xfe\xc0\xd2\xa9\xf5\x1b\x23\x75\x27\x75\x6f\x9e\xfe\xd9\xe7\xc0\x9a\xd8\xbb\xf4\x31\x61\xe1\x13\x57\x40\x76\xf0\xfb\xf9\x7b\xd7\xa5\x12\x75\xdb\x0e\x3e\xad\xe3\xf5\xb6\x23\x16\x3e\xb7\x53\x2e\x96\xd3\x24\x92\x68\x4d\xfe\x68\x17\x1b\xe0\xdb\x7a\xeb\x47\x4c\x21\x7f\x46\xfa\x41\xbd\xfc\x81\xa5\x3b\x16\x9d\x92\x27\x9e\xfa\xeb\xa4\x18\xe6\x25\x53\xcf\xdc\x38\xae\x58\x83\x29\x49\xfa\x49\x6f\x70\x76\xa9\x93\x63\x52\x9a\x56\xee\xc0\xd2\x63\xe9\xcc\xbc\x6c\xba\x13\xe5\xe4\xbe\x72\x2d\x29\xaa\x13\xc0\x88\xa6\x50\xf0\xe5\x5b\x33\x59\x5f\x57\x2b\x62\x71\xf9\x87\x2e\x07\x96\x36\xb8\x70\x36\x5e\x7b\xb8\x73\xf4\xb9\x9b\x93\x65\xdb\xf6\xcc\x09\x62\xf1\xeb\x5b\x13\xc5\x54\x84\xe1\x6d\x53\x3c\x27\x7a\x75\x5a\x0f\x2c\xfd\xd8\x04\xad\x0b\x85\x1b\xd7\x12\x34\x69\x76\x8c\x5c\xf0\xa5\xa8\xf8\x65\xea\xfa\x81\x2b\x77\xca\x65\xcb\x77\x4c\xce\x43\x83\xe2\xc0\xd2\xeb\x29\x52\xce\x61\x49\x77\x0a\x82\x1d\xc7\x9d\x1e\x86\x34\x94\xdd\x0d\x69\xee\x9a\xca\x3f\x1a\x93\x2e\x9e\x65\x89\xbd\x33\x74\xe2\xc0\xd2\xd0\x82\x17\x17\x5a\xea\xa4\x80\x90\xf0\xf8\x6b\x83\x8a\x74\x4e\x0f\x96\x7e\xcb\x39\xda\x17\xd5\x22\xbb\x4f\x1e\xe7\xbe\x34\x3e\xb8\x5f\xbf\xb6\x9c\xea\xc3\x0c\x91\x58\xd8\xde\x29\x3b\x1d\x93\x2a\x13\xe1\x7e\x44\x38\x9e\xa6\xb7\xac\x54\x0b\x73\x77\xca\xf3\xaa\xa9\xeb\x81\xa5\xa2\xdf\x92\x81\xda\x00\xc5\xf4\x3e\x4f\x99\x51\x8e\x45\xed\x8e\xba\x99\x39\x38\xaf\x54\x92\xc5\xbf\x39\xd8\x4c\x71\xfc\xff\x48\x21\x7f\x97\x66\x3a\xcc\xfb\x1c\x4b\xb1\x64\xe6\x8c\x27\x6f\x15\x61\x6f\x66\x33\x98\xf2\x5c\xd8\xca\xb6\xad\x79\x67\x31\x1c\xf3\xf8\xe5\xca\xe9\x83\x17\x22\xd3\xca\xf7\x6b\x05\xc3\x09\xbf\x24\x31\x2d\x90\xc5\x56\xae\xaa\xaf\x6b\x5d\x79\x8d\x51\xb7\x42\x59\xa7\xec\x82\x78\x5f\xfc\x81\xa5\x12\x9a\x65\x76\xf9\xb9\x0a\xcd\xd1\x62\x8f\x9c\x66\x26\xef\xe9\x3b\x4e\x5d\x4a\xdf\x30\x21\x21\x3f\xeb\xe0\x98\xc9\x65\xf6\x76\xf6\xc0\x52\xa6\x5d\x2c\x9e\x81\x9c\x50\x64\xb4\xb4\xe8\x68\xc2\xf2\x64\x71\xaa\x04\xbf\xac\xb6\x1c\xf1\xc6\x42\x6f\x4c\x93\x46\x22\x75\xee\x81\xa5\x7b\x53\x69\xd1\xfb\xa5\xe2\x89\x53\xe1\x95\x57\x9a\xb9\xf3\x76\x73\x3c\xaf\x11\x91\xea\x78\x09\x03\x82\x93\x8f\x79\xdc\xbf\x1d\xbc\x64\x18\xca\x89\x4b\xfd\x9e\xec\x1c\x10\xf7\xb2\xa2\xbd\x38\x21\x19\xbf\xd5\x07\xeb\xe5\x9f\x1a\x60\x08\xe7\xbc\x9a\x05\x63\x56\xaa\x0f\x2c\x25\x2b\xbd\xc1\xf6\xba\x5b\x7c\x6d\x49\x4d\x82\x48\x63\x2f\x46\x75\x93\x35\x84\x4f\xb4\x5c\xeb\xae\x5d\xf4\x9f\xfe\xcb\xe5\x1b\x25\x07\x96\xb6\xfe\x08\x39\x86\x97\x7a\x95\xfb\xdd\xe8\x11\x47\xbd\x89\xe9\xdd\xbb\x8a\x36\x19\xb7\x35\xc4\xde\xe7\x7d\x93\xde\x4e\x33\xcf\x3e\x78\xdb\x98\xd9\x34\x56\xaa\xd6\x2d\xfa\x73\xdb\x47\x7d\xd0\xe8\x08\xbb\x28\xdd\xd8\xd1\xd3\x0c\xd6\x4c\x74\xe2\x6c\xb2\x05\xce\x49\x1d\x2f\x0e\x2c\x5d\x73\xd6\x4a\xa0\xb9\xf9\xe6\x49\xfc\xb2\xd4\x9b\x80\xfd\x52\x52\xc1\xb6\x16\x06\x8b\x8b\xbb\xc9\x04\xea\xdd\x1a\x1b\x95\x86\x21\x07\x96\x7e\x88\x68\xc6\xcf\x55\x5c\xfc\xbd\xcc\xce\xbd\x62\x79\xde\xf9\x85\x2c\xbb\xbb\xfd\x97\xa3\x12\xc1\x59\xd4\xea\x25\x67\x83\xd9\x8f\x1d\x58\xfa\xad\x43\xda\xbb\xd8\x57\xfe\x39\x61\x29\xb9\x4f\xcb\xb3\x6d\xbd\x21\x97\xd3\x23\xe6\xdc\x41\xd1\xb5\x0b\xfb\x6c\x91\xdf\xa2\x67\x0e\x2c\x4d\x7c\xb2\x76\x31\x47\x74\xde\xf2\x17\x7b\xd5\x54\xc0\xc3\x4b\x0e\x6d\x92\x6f\x36\x9e\x1b\x1f\x0d\x7c\xb4\x6a\xb4\x6e\xc5\xbe\xa8\x79\x60\xa9\x06\x23\xbf\xff\x9b\xd7\x02\xea\x84\x15\xdf\x45\x3b\x89\xba\xd4\x97\xed\xdf\x78\xa6\xd4\x52\xe2\x4f\xc0\xa1\xe6\x4f\x9e\xf8\x7c\x3f\xb0\x74\xe1\x8e\x26\xc3\x9b\xcf\x15\xa6\x12\xcd\x57\x7a\xb4\x36\xd6\xca\x0c\xcf\xf0\x65\x26\xbc\xfa\x5d\x46\xf4\xea\xcd\xe6\xf7\xc6\x53\x71\xff\xbf\x2d\xc5\xf7\x78\xaf\x9c\xb7\x4b\x91\x99\xf2\x16\x8e\xaa\x4a\x92\x3e\xe2\xe7\xbd\xef\x3c\xa3\x6f\xbf\xfc\xcd\xce\xc1\x45\x7b\x81\x5c\xea\x31\xe6\x3f\x1b\x06\x0e\x5e\x5d\x3f\xfb\x7f\xe6\xe0\xd1\x0d\x72\xe5\xf3\xf6\x0d\xb2\x0b\x6e\xa9\xf7\x30\x6f\x8e\xe1\x98\xec\x37\x71\xd4\x70\x08\xfd\x31\xb7\xa2\x75\x60\xa9\xd5\xdd\xc4\xb4\x1c\xf3\xaf\x6f\x83\x2b\x5b\x25\xcb\x4b\xfd\xcc\x1f\x5c\x15\x64\x52\xbc\x5b\xa9\x51\x59\x75\x3f\xaf\xa0\x33\xbc\x4b\x4a\x8a\x9c\xdc\x57\x4a\xea\xc0\xff\x61\xc4\xb0\x17\x29\xfc\x82\xdf\xb1\xb9\x61\xa1\xe1\xb3\xfd\xda\xd4\x0e\x1b\xe9\xeb\x4c\xab\x7a\x2d\x8d\xc0\x2f\x6f\x4b\xa6\xed\xd2\x0f\x2c\xed\x88\x7f\x18\x9b\x2a\xf9\xab\x7b\x64\x50\xa1\x32\xc1\xb1\xfb\x7a\x9c\xf9\xc6\xc7\x8c\xde\x2f\x75\x2c\x85\xf5\x2b\xc5\xed\x73\x32\xff\x2f\xaa\xeb\x04\xff\xd9\x53\xf3\xc3\xe2\x11\x3e\x92\xbe\xec\xe3\x1f\x22\xad\x25\x25\x75\xe8\x0b\xaf\xda\xdd\x73\xa1\xc9\xdf\xc8\x21\x70\xc3\x0f\xb0\x90\xd4\xe1\x37\x4f\x4b\xff\x9c\x58\x2c\x7c\x99\x6f\x99\x6c\x3f\xb7\xcf\xe9\xd1\xff\x8b\x2f\xdc\x57\x16\x4f\x0a\x0f\x0f\xef\x1a\x1e\xc6\x07\x0f\x0f\xcf\x57\x4a\xea\xbf\xfe\x0b\xb9\xe2\xa3\x08\x21\x1e\xf5\xfa\x6f\x89\x1f\x9c\x3d\x59\x3b\x6e\x3e\x1f\xc7\x03\xde\xe3\xf5\xb9\xed\xd7\x0c\x06\xff\x21\xec\xfb\x7d\x62\xfb\x0d\xcd\x6b\xae\x9f\xff\x0b\x8f\x7a\x15\x4f\x58\x0a\xf9\xb0\xf6\x69\x5b\xf1\x62\x34\x14\x73\xb7\xd6\xb6\x0d\x76\x2e\x8c\xc5\xf5\x28\x67\xfa\xba\x2a\x7d\xed\xb7\x14\xa7\x6b\x2c\x1e\xaa\x7e\xfd\xbf\xf1\xb0\x3e\x1a\xff\xed\x61\x69\xdb\xbb\x5f\xb7\x76\x5d\xff\x3e\x66\xfe\xab\x30\x39\x92\x5a\xf6\x76\xf1\x6a\x0c\x3e\x91\x01\x6d\x14\x1d\xeb\x6e\xe4\x64\xae\xfe\xff\xca\xb3\x35\xfa\x6f\x0f\x2b\x66\xb8\x6e\x15\x9b\xb4\x54\x13\x95\xf5\xd2\xbe\xb4\x70\x9a\xdd\xa5\xf1\x31\x77\xab\x43\x47\x4e\xc3\xfa\x0d\xc7\x17\x73\xc6\xca\xff\x2b\xcf\xd6\xe3\xbf\x3d\x6c\xa3\x76\x7e\x3f\xdc\x87\x25\x64\xe4\x4b\x71\x24\xb9\x63\x43\xdc\xc6\x73\x47\xf2\xbe\x40\x33\xcf\x51\x93\x0b\xfb\x0f\xdd\x9a\xf3\xff\xff\x7f\xd8\x9b\xff\xd9\xd6\xf5\xc3\x27\x80\x1e\xc9\x60\xf0\xe0\x03\x8f\xb8\xb8\xfd\xd6\xa1\xbd\xcb\x5d\xc5\xc9\xf4\xcf\x5a\x7f\x67\x3a\x7e\x8a\xe5\xf8\x9e\x57\x4a\xa0\x11\x8b\x7d\x5e\xd3\xe5\xe7\xcc\xee\x3e\x3a\xff\xd9\xba\x47\x32\x3e\x87\xba\x0c\xc9\xaa\xd3\xc7\x34\xf2\x6f\xf1\x1c\x07\xbf\x8f\xdf\x66\x17\xc8\xb8\x46\xa1\xec\xac\x0c\x7f\x96\x59\x6d\x8d\xd0\xf1\x96\x97\xf8\xdb\xfd\xd7\xba\x47\x32\x78\xf8\x07\xbb\x8a\x5c\x74\xe4\xb5\x62\xef\xf6\xb3\x8f\xdf\xb0\x67\xd3\x6e\x5d\x4f\x15\xad\x33\xd5\x9c\xd7\xda\xb8\x41\x36\xc7\x2e\x38\xdd\x3c\xfb\xb7\xfb\xaf\x75\x8f\x64\x58\x0f\x7d\xbd\xe3\xc3\x6f\x8e\x47\x51\xc5\x28\xc8\xee\xfc\x22\x2b\x97\x6d\xd7\xa9\x22\x0e\x69\x16\xca\x0d\x6e\xa8\x7d\x19\xf8\xbb\xe7\x38\x3d\xcf\xdf\xee\xbf\xd6\x21\xbb\x27\x1f\x5a\x78\xd8\x18\xb6\xea\x11\xc9\xcf\x1a\x3d\x66\x78\x45\x27\xd7\x9c\xe0\xc4\x71\xb1\x92\x8a\xf2\x0b\xa7\xdd\xf3\xf3\xb9\xb9\x3e\x57\xff\xb3\x75\xb8\xae\x0f\xfc\x58\x5a\x4b\x4a\x06\x0f\xf3\xdf\xb6\xc1\xcd\xff\xec\x2a\xf2\x3f\x6d\x00\xba\xb6\x1f\xa4\xf6\x51\x0b\x44\xf8\x31\x09\xe3\x66\x47\x47\xaf\x08\x72\x32\x30\xf6\xe5\x3d\x3e\x15\xbe\x63\xe8\x35\x75\x4f\x93\xef\xef\x13\xff\xd7\x3a\xe4\x06\xb8\x80\x57\xc1\x46\xc4\x6e\xa4\x14\xc2\xa3\x25\xde\xe0\x78\x26\x40\xd9\xd1\x7f\xaf\x29\x7d\x69\xf0\x79\xed\x37\xc1\x16\xc6\xe0\xd4\xbf\xdd\x7f\xad\x43\x6e\x00\x22\x45\x97\x4b\x16\x94\xcb\xe2\x6f\x3b\x66\x6a\x53\x16\x56\xc6\x02\x85\x99\x3e\x07\x7d\x6d\x11\xf9\x79\x3b\x97\x5e\xf8\x86\x9b\xf6\xdf\xee\xbf\xd6\x21\x5f\x28\x1a\xe5\x73\x0f\x8e\x7c\xf1\x90\x61\xe9\x25\xb6\xe2\xa9\xc5\x04\x96\x76\x4b\x77\x27\x5a\xda\xdc\x7f\x1f\x5e\xfe\x9b\x38\x31\xa7\xf4\x6f\xf7\x5f\xeb\x90\x5d\xdf\xbb\x19\xf2\x49\x3c\x62\xea\x7d\xc6\x16\xd7\x8f\xa5\x7d\xc8\xa2\xb4\xda\xb4\x9a\xe1\x52\x01\xf6\x1f\x29\xc6\x9e\xf5\xdf\xa3\xf3\xb9\xf6\x9f\xad\xfb\x7f\x36\xc0\xff\xb9\x77\xfc\x5f\xb6\xc0\xbf\xae\xe8\xff\xd3\x16\x70\x79\x3c\x62\xd7\x1e\x4d\xf5\x4b\x40\x94\x78\x4e\x78\xdc\x55\xcc\xd2\xc8\xa5\x86\x2f\x22\x5e\x4e\xf9\xf7\xca\xcd\xd2\xe4\xbb\x14\x7f\x9f\xfa\xbf\xd6\x21\xb7\x80\xa7\x12\x17\xb3\xed\x5a\x5e\x57\xef\xe5\x9f\x8c\x47\xcc\xf4\x2f\x7a\xf7\x75\x0d\x68\x0c\xb3\x33\x45\x85\xaa\x43\xe2\xdd\x51\x4c\x7f\xbb\xff\x5a\x87\xdc\x02\x6a\xf2\x06\xb2\x65\x77\xfc\x38\x82\x39\xf2\x92\x9a\xb6\x77\x8e\x0a\xf6\x86\xd4\xaa\xd9\xff\x12\xa5\xcc\xfc\xe3\xfc\x34\x94\xae\xe9\x6f\xf7\x5f\xeb\x90\x2f\x95\x97\x9a\xcc\x20\x53\x7a\x53\xea\x11\x8f\xaa\xab\xbb\xa1\x6f\xa8\x16\xac\x0a\x14\x3a\xb9\x59\xb2\x04\xdb\x65\x93\x62\xf0\x6b\xd5\xff\x76\xff\xb5\x0e\xd9\xed\x96\x71\x5a\xae\x36\xaf\x93\x0d\xd8\x7c\xbb\xd6\x62\x58\xd0\x6e\x28\x95\x4e\x18\xe5\xc1\xf0\x2a\x4e\xfe\x41\x66\x41\x56\x44\x91\xcf\xf5\xff\x6c\xdd\xff\xb3\x05\xfe\xeb\x46\xfe\x7f\xd9\x03\xff\xba\xbd\xfe\x4f\x7b\xe0\x53\xf7\xad\xe2\xa2\xf2\x3a\x2d\x41\x89\xaf\xf5\xe7\x36\xcd\x27\xdf\x40\x45\x16\x2f\x43\xdc\x3a\x6c\xfb\xc3\x0d\x6e\xfb\xbc\xc9\xfb\xfb\xdc\xff\xb5\x0e\xb9\x07\x4e\x5e\x29\xa4\x57\x7e\xff\x35\x87\xdd\x58\xca\x57\xe5\x91\x09\x5d\x1d\xfb\x3b\x26\x81\xc4\x5f\xaa\xbf\xf5\x13\x35\x17\xeb\x45\xae\xfd\xed\xfe\x6b\x1d\x72\x0f\xac\x8f\x92\x99\xce\xd3\xe7\x37\x7d\x36\xfe\xd5\x1b\x6e\x74\xe4\x79\x7b\xa1\x94\x75\x83\x83\x23\x4b\x5c\x73\xd0\x48\x86\xcd\xed\xc9\xbf\xdd\x7f\xad\x43\xbe\x56\x19\x4a\x13\x75\x3f\x31\x22\x0b\x9b\x84\xb6\xfc\x6f\x42\x3a\xbc\xf2\xe2\x0b\x6d\xb6\x59\xd9\xea\x65\x28\x87\x9c\xaa\xe4\x05\x14\xff\x76\xff\xb5\x0e\xd9\xed\x30\xa7\x76\xed\x56\x7d\xec\x14\x13\x6a\x99\x14\x6e\x71\x49\x5c\x96\xfa\x1a\x9b\x6e\xbb\x42\x4f\x56\x15\x6d\xd8\x42\x65\xf0\xd4\xdf\x3d\xf0\xaf\x75\x7f\xf7\xc0\xff\x99\xaa\xfe\x2f\x7b\xe0\x5f\xb3\xce\xff\xb4\x07\x44\x9a\xe8\x5c\x9f\x48\xfd\x7a\xf3\xec\x75\xd5\xeb\x5d\xcd\xe2\x66\x3e\x36\x91\xdd\x13\x7f\xee\x3b\x47\x94\x09\x83\xd7\xd7\x67\x34\xfe\x3e\xf7\x7f\xad\x43\xee\x01\x2a\x8e\x09\x8e\xd3\x8a\x95\xd6\x69\x01\x8d\xf2\x1d\xc3\xd7\x7a\x02\xec\x37\x98\xff\x3f\xcc\x9d\x67\x3c\x97\x6f\xff\xff\xed\xbd\x32\x23\x59\x09\x65\x0b\x65\xcf\x6c\x21\xd9\x99\x65\x44\x44\x14\xb2\x77\xb2\x33\x0b\xd9\xc9\xde\x49\xf6\x26\x44\x46\x46\x64\x64\xaf\x84\xc8\xec\xff\xb8\x7e\xff\xeb\x73\xfe\xfa\x9e\x1f\xbf\x8e\xeb\x86\x1b\xd7\xfd\xe7\xe3\xed\x3c\x3e\x3d\x3b\xc6\xeb\x3c\x8e\xe3\x54\xa2\x7f\xfe\x96\xed\xc8\x3f\x6c\xf2\x3d\xb5\x2e\xa2\x2e\x88\x83\x3b\xc0\xed\x39\x71\xad\x68\x16\x4b\x48\x87\xfe\xbe\xf4\xe6\x55\xd6\x8f\x1c\x3f\x6f\x63\xce\x29\x88\xc4\x0b\x3b\xcd\x96\xf6\xeb\xbb\xdd\x43\xd4\x05\x71\xf0\x7f\x2b\x2f\x09\x8d\x5f\x9a\xd7\x59\x8b\x83\x3e\xe2\x75\xaa\x91\xfd\x0a\xbe\xad\xfd\xe2\x63\x57\x44\xfd\x1e\x09\x8d\xa0\xbb\xfc\x6f\x92\x1d\x44\x5d\x10\x07\xaf\x3b\x71\x6e\xb6\x62\x42\xfe\x7c\x72\xb6\xbc\x0f\x91\xb3\xed\xc4\x82\xab\x92\x38\x45\x0b\x23\x85\x40\xcb\x8d\x52\xb2\xcd\xa5\xcd\x28\x84\x03\x20\x0e\xea\x07\x8c\xfe\xee\x00\x68\xe2\x79\x92\x03\xd8\x61\xd4\x57\x5f\xea\x27\x6c\x9b\x2c\x7e\xe7\x57\xf1\xb9\xc6\xd6\x3e\x21\x7d\x87\xd5\xf4\x55\x9b\x78\x44\xf5\xcb\x9b\x9b\x97\x1e\x41\xc3\x2b\x80\x83\x3b\x90\x85\x8d\x7b\x40\xd3\x7f\x66\xe5\xc0\x62\x57\xb3\xa6\xd3\x4a\xe5\x99\x0f\xf3\x83\xf9\x3e\x1a\x69\xf9\xeb\x6d\xb9\x8d\x57\xe8\x55\x10\x75\x41\x1c\xdc\x81\x0d\x1e\x2f\x3c\x7f\xd5\x80\xa5\x03\x2c\x3a\x87\x3e\xa7\xf4\x8c\xe7\xdd\x3f\x37\x16\x9c\xa3\xba\x04\xcc\xce\xa2\xa3\x51\x4e\x5f\x47\xd4\x05\x71\xf0\x7f\x2b\xd3\x56\x6c\xdb\xae\x47\x2d\x35\x2b\x91\x7a\x73\xd5\x92\x57\x06\x19\x99\x74\x77\xc5\x56\x9b\xce\x50\x52\x25\x0f\x55\x51\xab\x98\x22\xea\x82\x38\x78\xdd\xf0\x7e\xe7\xe8\x8d\x3b\x7e\xbc\x72\xdb\xec\x76\xc1\xee\xdb\x97\x7e\xc9\x35\x2a\x52\xec\xe6\xbe\x50\xa3\x22\x30\xf7\x31\xe9\x32\x45\x38\x00\xe2\xa0\x7e\xc0\xf5\xff\x70\xc0\xf0\x3f\x5b\xb9\xfb\x63\x62\xa0\xfa\xc9\xa2\xa1\xa0\xfc\xe3\x29\x57\xb6\x3b\xc2\xbc\x2b\xb8\x55\x3e\x8d\xa4\x36\x1f\x6b\x57\xd5\x3e\x39\xfe\x40\xf9\x08\xaf\x59\x7a\x8c\xe4\xdd\xc1\x1d\x99\x48\x3d\x6f\xbd\xff\x8c\xf3\x93\x45\xf1\xfe\x67\xe5\xf1\xea\x75\xe7\xe6\x1b\x5c\x67\x39\x96\xbc\x89\x70\xbc\x87\x25\xbf\x13\x2c\x94\x2b\x7c\x36\xe9\xf3\xe1\xf7\x66\x29\x1a\x52\xbc\x89\xa8\x0c\xe2\xfc\x64\x51\xd0\xfe\x59\x79\x38\x2f\xdd\x4c\xc1\xb1\x8f\x5a\xc7\x85\x89\x9e\x5b\x53\x62\xc7\x7b\xac\x77\xc9\x66\x96\x40\xc3\xf9\x2b\x85\x39\x7e\x25\x5f\x17\xa2\x32\x88\xf3\x93\x45\xc1\xf8\x67\xe5\x9f\x37\x32\xae\x3a\x69\xf4\xf6\xea\x0e\xc9\xec\xa3\x1d\xdd\x77\x46\xbf\x37\x61\xfb\xd1\x65\xa5\x3d\xec\xc1\x70\x93\xfd\xfe\x84\xb4\x37\x22\x7d\x01\xbd\x5f\xf9\x33\x7d\x41\xab\x4a\x20\x89\x12\x72\x2e\xea\xf7\x9e\x35\xf5\xc1\xd9\x70\x37\x7a\xd2\xf6\xe2\x0d\x19\xca\x92\x59\xbc\xc4\x93\x8f\xd3\x59\x7f\xbe\x60\x39\xc2\xbd\xbb\xca\x29\x91\xb2\x12\xa2\x1d\xef\x70\x63\x35\x63\xd6\xea\xfc\xe3\x34\x8e\x08\xfb\x9a\xc8\xf7\xed\x92\x54\x76\x2d\x6c\xff\x2d\xe9\xcb\x0e\xe6\x7f\xd6\xb4\xff\x4d\x5f\xa4\xd5\xc9\x61\x8b\xe5\x07\x1d\xd4\x5c\xe9\xe8\xf9\xfe\x97\xf5\x45\xd9\x06\xca\xeb\x33\xe6\x53\xbe\xb9\xd9\xa8\xa7\x5a\x18\x73\xb8\x0b\xb4\xe7\xf8\x63\x9d\x46\xfc\xd2\x80\x14\xbf\x90\x63\xdc\x5c\x3d\x8a\x71\xb4\x70\x68\x2f\x30\x95\xa7\x71\x1c\x7d\xde\x76\x41\x8e\x89\x81\xdc\x91\x8a\x62\x54\x73\x8e\xbb\xc3\xf4\x34\x92\x01\x49\xe4\xf8\x05\x15\x53\xef\x25\x7f\xf5\x42\x22\xae\xc0\x90\x8f\xb9\x91\x42\xcc\x4a\xe4\xd0\x96\xf5\xb8\x55\xc1\x7c\x5d\x05\xdb\x35\xa6\xa1\x47\xa7\xf1\x67\x1b\x90\xe3\x17\x9d\xc2\x5d\x3d\xd2\x08\xdc\x67\xd6\xe9\x86\xc2\x34\x8e\x16\x5d\x8b\xc9\x26\x19\x4d\x3a\xf7\xe6\xf6\xc4\x93\x7a\xfb\xca\xe9\xb6\x4f\xa5\xb5\xc8\xf1\x4b\x7f\x7b\x77\x6a\x95\x6f\x60\x5d\xee\x64\x69\x02\x4b\x8f\x8a\x72\x74\x45\x8e\x7a\x36\xda\x2c\x0e\x8a\x80\x83\x1b\xa3\x83\xbe\xf0\xa9\xb4\x16\x39\x7e\xf1\xb9\x47\x74\xe8\xd4\x1f\xfc\x9e\xa4\xc9\x43\xe3\xc0\x15\x7f\x61\xd4\xe3\xec\x18\x0f\x0f\x8a\xf4\x52\xb2\x71\xe9\xb9\x76\xff\x6f\xa7\x16\xbf\x80\xd4\x3d\x71\xda\xdd\x86\x7a\xec\x24\x70\xfd\x0a\x97\x46\x65\x62\xc6\xf5\xc1\x07\x02\xcf\x62\x85\x15\xec\x7c\xa2\xbf\x4f\x8e\xa5\x17\xdd\x48\x7f\x0a\x4d\xbb\x01\x1c\x7c\xb8\x45\x71\x76\xc3\x79\x2f\x32\xba\x9d\x44\x77\x87\x1c\xef\x93\xea\x87\xbe\xa0\xa3\xc5\x51\x49\x8c\xb9\x7b\x97\x56\x0c\xcf\x4c\xef\xbd\x46\xd4\x05\x71\xf0\xe1\x96\x28\xeb\xcb\xe0\x06\x0d\x66\xa1\x0d\xe3\xd7\xc3\x4f\xa8\xd6\xe7\x7c\xb0\x36\xf4\x82\xfb\x6d\x69\x15\xab\x5f\xae\x07\xcc\xa3\xcf\x23\xea\x82\x38\xf8\xb0\x68\x74\x99\xe0\xc6\x86\x91\xac\x50\x6e\x45\xc0\x83\xcc\x83\x33\x7e\x52\xb1\xbe\x8f\xc6\xc2\x1d\xdf\x24\xdb\x7f\xcc\x21\x20\x4f\x15\x40\xd4\x05\x71\x7e\xd2\x28\x68\x7f\xd6\xed\x94\x47\xb3\x4a\x7c\xe1\x3e\x7d\x19\xf3\x0a\xce\x4d\x52\xee\xa0\xd7\x01\x97\x76\x72\x32\x19\x96\x8a\xf7\xe7\x1f\x56\x4f\x7b\x31\x79\x5f\xff\xcf\xb8\x7f\xfd\xbb\x79\xfb\x04\xfc\xab\xbf\xfa\xcb\x84\x0b\xd4\x8d\x9c\x64\x40\xc6\x17\xef\x1e\xac\xcd\x54\x87\x2c\x07\x72\xb5\x19\x0d\x25\x57\xc9\x37\xc5\xf1\xe2\x5f\xe6\x9f\x6c\x17\xe5\x99\x53\x8a\xef\x5d\x44\xb4\x1c\xc4\xc1\x0d\x50\xbf\x54\xfd\xe5\xc1\x61\x98\xfb\xfc\xba\x0c\xe1\xaf\xba\xde\xef\xb5\x72\xf4\x2d\xb4\xf8\x95\x6f\x25\x96\xf4\x17\xfb\x30\x85\x69\xa0\x45\x32\x80\x83\x1b\x60\xee\x49\xe2\xad\xe5\xd1\x17\x36\x4b\x4d\xfc\xe1\x25\x97\xef\xae\x74\x85\xe6\x25\x85\x34\xae\xc5\x09\xc1\x3b\xcf\x79\x30\x9b\x8f\x10\x75\x41\x1c\xdc\x00\xd6\x74\xbb\x39\xfd\xc8\xeb\x7d\x3a\x7d\x92\xbc\x15\xcb\x3e\xc3\x19\x3b\xdc\x77\xd2\xf9\x8d\x2e\xf6\x61\xe2\x5f\x2d\x0c\x92\xbd\x8f\xa8\x0b\xe2\xe0\x06\x2c\x62\x64\xb9\x44\x5b\x8f\xf1\x8f\xf3\xb0\x4a\xa6\x6b\x47\x9b\x9a\x54\x6b\x8c\x07\x5d\xec\x19\xad\xa9\x8a\x3c\x1a\x0b\xac\xeb\x42\xe4\x2f\x20\xee\xdf\x06\xfc\xcf\xe0\xf1\x17\x05\x40\x5d\xfa\x49\x0a\x18\x6e\x66\x97\x4e\xbc\x45\x2d\x19\x50\x76\x7f\x61\x1c\xdd\x84\xf6\x8e\xf9\xc2\x4d\xda\xf6\x87\x45\xd8\xe7\xf6\x2d\x1e\x92\xfc\x58\x47\x34\x1d\xc4\xc1\x15\xb8\xfb\x86\xf8\x37\x31\x87\xe9\x3a\x79\x5a\x1c\xca\xf1\xf8\x4a\xef\x86\xeb\xc7\xfb\xf8\x77\x08\xbe\x15\x27\x07\x3c\x66\xe6\xea\x34\x40\xd4\x05\x71\x70\x05\x92\xaf\x50\xe5\xd5\x30\x04\x27\x5b\x6f\x99\xd7\xa8\x35\xad\xab\x7b\x2b\x3e\x69\x61\xc1\x40\x37\x19\x0e\xe6\x79\x2b\x9a\x30\xff\x09\x51\x17\xc4\xc1\x15\xc0\x55\x2b\x8d\x55\xaa\xfd\xe9\x14\x7e\x29\x22\x47\x5d\x1b\xdf\xde\x9a\xdc\x32\x76\x4f\x69\xa9\xde\x94\x6c\x8a\x0d\xaf\xb5\x4d\x15\x51\x17\xc4\xc1\x15\x50\xcf\x0a\x4b\x16\xa7\x55\xf7\x0c\x14\xe9\xfd\x42\x1d\x90\xfa\xdc\xad\xdb\xda\xc5\x5f\xe5\x45\xcc\x5d\x85\x16\xf6\xcc\x86\x38\x4b\xc4\x9c\x1b\xc4\xfd\x5b\x81\xff\x3f\x92\xff\xc5\x01\xd0\xf8\x7a\x92\x03\x98\x15\xac\x32\x1f\x2d\x36\x31\x3c\xfb\x0b\xc6\xb5\x0a\xea\x93\x94\xf6\x94\x7c\xce\xd1\x44\xbd\x53\x08\xfa\x92\xeb\xf9\x64\x00\xca\xb4\x40\x1c\xdc\x81\x5a\x93\x7e\x1d\xad\xfe\xfd\x8b\x02\xfe\x78\x37\xa9\xf0\xac\x06\x3e\x7e\x49\xdd\xfc\xbc\xa8\x12\x2b\x81\x6a\xa8\xc2\x70\x51\xf2\x0b\xa2\x2e\x88\x83\x3b\xa0\x9b\x5e\xfb\x21\xe5\xdb\x16\xde\x03\xec\x39\x89\x2c\xdb\x8c\xd1\x84\x82\xf4\x7b\x45\xb9\x83\x22\xfe\x73\xba\xcc\x6c\xfc\x46\x7e\x88\xba\x20\x0e\xa9\x1b\x50\x0e\x23\x33\xb9\x83\xb1\x94\xeb\xda\x79\x5e\xd0\x3f\x6b\x58\x18\x1b\x37\xb0\x62\xf6\x53\x87\xaf\x86\x51\x05\xfb\xc6\x32\x16\xd4\x0d\x00\x38\xb8\x03\x3e\x6f\x02\xcf\x62\x09\xff\xb0\x6c\xbd\x33\x93\xf8\x9c\xfe\x29\x47\xd3\xb9\x0e\xf4\x64\x0c\xf4\xdc\x30\xb4\xa1\xc4\x81\x35\x65\x15\x84\x03\x20\x0e\xe1\x40\x03\x20\x7f\x01\x4d\x76\x4e\x72\xe0\x9b\xee\x57\x32\x29\xba\xec\x3c\x5a\x9f\x05\xb1\x7e\x02\xd5\x23\x1e\x0e\x36\xb1\x14\x19\xa1\x4f\xb4\x64\x62\x8a\xf5\x2c\x3c\x3d\x88\xb6\x83\x38\xa4\x7e\x60\xa1\x0d\x43\xda\x90\xbf\x66\x0f\x6f\x6c\xf6\xd6\xa8\xdb\xd9\x4e\x59\xd2\x2f\x74\x56\xc4\xc5\xa3\xbe\x3f\x72\x7e\x0d\x1c\x3d\x83\xfa\x01\x00\x07\x77\xa0\xd3\x2f\x9b\xc1\xd6\xee\x41\x84\xe4\xf6\xf6\xf3\x1d\x41\x5c\xfa\xc8\x0b\x05\x9b\x51\xb2\xbc\x85\x34\x9f\x15\x4c\xbe\x59\xaf\x43\x51\x3c\x88\x43\xca\xe0\x48\xa8\xde\xe7\xa4\xef\xa6\x5d\x1d\xac\xb2\x13\xaf\x98\xac\x15\x7e\x3e\xfc\x7d\xe2\xc1\xb4\x57\x8e\x90\x5e\x1d\x99\xb2\x99\x0f\x94\xc1\x01\x38\xb8\x03\x84\xb3\x29\x17\x94\xde\x24\x3f\x26\xac\x73\xcf\x8b\xe3\x96\xeb\xa2\x79\x37\xb2\x8d\x59\x80\x1f\x6a\xb8\xcc\xf2\x4e\xb5\xdb\xf7\x05\xc2\x01\x10\x07\xf5\x03\x80\xfc\x05\x34\xf3\x3c\xc9\x81\x3a\x9d\x21\x8e\x69\xda\xf4\xca\xa3\x5d\x39\x0e\xcf\x42\xaa\x7e\xc3\x1b\x9c\x37\x6d\xee\x95\xb2\x55\xc6\xea\xfd\x66\xb6\xd5\xb3\x42\xb4\x1d\xc4\xc1\x1d\x10\x11\xd8\xec\x11\xce\xd6\x77\x8b\xb4\xa6\xbc\xc5\xe3\x7e\xeb\xac\x69\x46\xbb\x26\x85\x61\x90\x44\xa8\x76\x3a\xa9\x7c\x49\xb4\x10\xa2\x2e\x88\x83\x3b\x40\xa0\x4c\xc2\x79\xd0\xdc\x13\x7c\x56\x89\xf0\xd2\xc7\x87\x47\x8f\x7b\x59\xae\x64\xb0\x64\xdd\x95\x72\xab\xdc\xcf\xeb\x37\xf5\xe6\x45\xd4\x05\x71\x70\x07\x4c\xb6\x65\x58\x72\xf4\xcc\x50\xf5\x0a\x75\x5f\x84\xc5\x56\xa7\xe2\xee\xdc\x95\x7b\x30\xaa\x79\x88\x35\x44\x5c\x7b\xcd\x91\x7b\x00\x51\x17\xc4\xc1\x1d\xe8\x0a\x7d\x7b\xbc\x26\x6e\x7e\xad\x9b\x0c\x65\x15\xa5\x2d\x1a\x0f\xeb\xc3\xbe\x7b\x66\xc5\x3d\xdd\xcb\xec\x58\xb9\x0a\x61\xa8\x1b\x08\x07\x40\x1c\xd4\x0f\x00\xf2\x17\xd0\xda\xfd\xe4\xfc\xa5\xce\x73\x50\x64\x8e\x3f\xa9\x4d\x3d\x9f\xac\x37\x9f\xdc\x62\x94\x3d\xc3\xa8\xd1\xb9\xb9\xa1\x83\x47\xd4\xd2\x4c\x2c\xcd\x8a\x05\x91\x65\x80\x38\xe4\xfc\x25\x70\xeb\x4b\x3a\x4f\x42\x4b\x6f\x8c\xf5\xab\x4a\x66\xea\x3d\x4b\xaf\x4a\x83\x41\x9e\x4b\x89\xe2\x86\x01\x72\xac\xcf\xea\x7a\x77\x11\x95\x41\x1c\x72\xfe\x12\x76\x2b\x52\xb5\x27\xd0\xd0\xf5\x22\x0a\x49\x40\xd1\xca\x1c\xd1\x5c\xc6\xa0\x05\xa7\x49\x70\x5e\xdd\xce\x34\xc3\xa0\xc1\x4b\x09\x44\x65\x10\xe7\x27\x8b\x42\xf2\xcf\xca\x06\x5a\xae\xcc\xcf\x5e\x1f\x6e\x1e\xea\xbf\xaa\x6a\xae\x0c\xcb\x62\xd2\x97\x4d\x74\x3f\x48\xb8\xa1\x90\x6e\xb7\xdb\x3b\x51\x47\x08\xe5\x2f\xa0\x4d\xab\x7f\xe6\x2f\x65\xbc\x59\xb6\x11\x76\xb1\x06\x69\x1a\xce\x28\x6a\x41\xa9\xf1\xef\x96\x1b\x98\x74\xaf\x91\x3e\x3e\xa3\x44\xd5\x3a\x2c\x9e\x9e\xfd\x07\xfa\xf2\xb5\x72\x5c\xce\xa7\x5e\x3f\x13\xff\x96\xae\x66\xa9\xad\xcb\x7a\xf8\xa9\x4d\x1a\x12\x3e\x5f\xaf\xf2\x13\xa8\x26\x6c\x73\x7e\xf8\x6f\xcb\x5f\x40\x4d\xfb\x23\x7f\x89\x84\xe7\x2f\x93\x5f\x7c\x05\x2d\x2d\x32\x1e\x3e\x69\xb8\xdc\xc1\xaf\x83\x2b\x28\x55\x80\xc5\x30\xf2\xfe\x37\xa9\x0c\xbf\x59\x35\x91\xdd\xbd\xf5\xd3\xc8\x5f\x50\x54\xe0\x6b\xf4\xe9\xf1\xc2\xde\x36\xf5\x61\x9c\xa2\xab\xe7\xcf\x16\xd7\x70\x57\x8b\x2c\x8a\x05\xc4\xbe\x8e\x9c\x08\x73\x62\x09\xd5\x67\xb7\xfd\x72\x2a\x3b\x33\x90\xf3\x17\xf9\x8c\x28\xce\xa2\x98\x57\xa4\x85\x3e\x3e\x13\xd7\x27\x3e\x3d\x4c\x6d\xeb\x6d\x78\xd5\x98\x1f\x1d\x17\x2f\x70\x58\x6b\x35\xd9\x79\x2a\xfb\x50\x34\x91\xfe\x2c\xae\x70\xcf\x27\x56\xf6\x4e\x8f\x1d\x89\xb3\x5f\x26\x23\x47\xfa\xcd\xbe\xee\x74\x34\x25\x4c\x37\x6d\x3e\x9a\x11\xe0\xef\xa4\xda\x3f\x95\xd6\x22\xe7\x2f\xb3\x77\xfb\xb9\x9d\x8a\x24\x9b\x5f\x8d\x97\x63\xf7\x04\x71\x3b\xe8\x37\x70\x78\x1e\x98\xfc\xfc\xf2\x46\x98\x32\xb5\x05\xb5\xc5\xee\x54\x5a\xfb\x04\xe9\xcf\xbe\x26\xb4\x26\x26\x64\x75\x22\x65\x3d\xc7\x5a\x69\xdd\xea\x34\xaa\xea\xa9\x96\x5b\xbc\x8d\x9b\x94\xee\x67\x7c\x57\xac\x22\xfb\xc1\xa9\xe5\x2f\x20\x75\x4f\x1a\x6e\xeb\x0b\xe6\x27\xc9\x16\x47\x36\x42\x5f\xbc\xc5\x7b\x3a\x40\x35\x19\x24\x31\xa2\xdb\x75\xaf\xf4\xab\x9f\x1b\x6e\x3c\x69\xcd\x10\x0e\x62\x98\x01\x71\xf0\xe1\x16\x53\xa7\x81\x4e\x87\xc0\xa8\xff\xd9\xa3\x14\x29\x8f\xee\xaf\x96\xa6\x52\x82\x61\x32\x57\x09\x6d\xd5\xad\xef\x85\x7f\xe6\x12\x82\x5e\xa3\x80\x38\xf8\x70\x6b\xa9\x9a\xea\xbf\xfa\xda\x94\x72\xcc\xbe\xf8\x5a\x51\x9b\x7f\x25\xea\xfb\xfa\x0c\x6e\x21\xa7\x4a\x0d\xbd\xd5\x6f\xa3\x2e\xc5\xd0\x2a\x19\xc4\xc1\x87\xdb\xdb\x4f\xef\x5e\x16\xd8\x45\xc3\x10\x0b\xb7\x2a\xbb\x19\xcd\x8b\x19\xd6\xf4\xcc\x02\x93\xbf\x3b\x35\xf1\x85\xea\x8b\xb9\x9d\x0f\xd0\xeb\x19\x10\xe7\x27\x8d\x42\xf2\x67\xdd\x98\x2e\xc6\x1f\x3a\xfd\x22\xdf\x67\x9b\x97\x4a\x54\x2d\xaf\x5b\xd1\x56\x0e\xa2\x93\xa9\x91\xdc\x10\xec\x7a\xc4\x18\x66\x76\xc1\x1f\x91\xbf\x80\x38\x3f\x69\x14\x06\x6f\x9f\x80\x7f\xf5\x57\x7f\x99\x70\x81\xba\x91\x93\x0c\xb8\xef\x35\xc7\x6d\x98\xef\x2f\xf6\x2b\xbc\x79\xd8\x8b\x5f\x5a\x1b\xa5\x15\xfb\x8e\xf5\xaf\x2c\x79\xe1\x29\x17\x81\x66\xc9\x8b\x79\x88\x96\x83\x38\xb8\x01\x39\xb8\x18\x57\xc5\xc3\xe3\x4c\xc7\xbe\x3c\xd1\xef\x0b\x78\xbf\x19\x7a\xae\xb5\xf1\x8b\xdd\x7b\xdc\x94\x1f\x6c\x3e\xcf\x30\x3b\x20\x03\x40\x1c\xdc\x00\xe6\x52\xfd\xcf\x5e\x23\x5d\x1c\x0e\xaa\x82\x58\x4a\x98\xee\xd9\x44\x8f\x35\xbe\x54\x3e\xa9\xee\xdd\xd2\xa6\x49\xb4\x6e\xc8\x82\xc2\x02\x10\x07\x37\xe0\x9d\x89\xbc\xdf\xd1\x30\xef\x6a\x96\xba\x89\x9f\x7c\xbe\x4b\x4b\xae\xc3\xb3\xfc\xfe\x1b\x75\xa5\xcd\xb3\x4d\x9a\xcf\x56\xd3\x48\x11\x75\x41\x1c\xdc\x00\xf6\x0e\x4f\x65\xb4\xc0\x1a\xa3\xb8\x71\x59\x8b\xf1\x95\x84\xbb\x64\x3c\x1d\xe9\x9d\x42\xd8\xe8\x3b\x38\x5d\xea\x2c\xaf\xd6\x72\x11\xf9\x0b\x88\xfb\xb7\x01\xff\x33\x78\xfc\x6d\x0b\x14\xa0\x4b\x3f\x49\x01\x29\x2f\x14\x1c\x51\xd9\xaa\x1b\x0b\x22\x37\xf3\x12\x05\x2a\x9c\x3f\x92\x06\x58\x55\xdd\x11\xfd\x4d\x27\x76\x36\x49\x5b\xb7\x92\x1d\xd1\x74\x10\x87\xb4\x05\x2a\xe8\x67\xb7\xc5\xd4\x07\xeb\xcc\x46\xa7\x66\xb9\x90\xf5\x1f\x94\x0b\x18\xbf\x14\xcf\xdf\x34\x1c\xb7\x2d\x63\x2f\x58\x29\x50\x84\xb6\x40\x01\x38\xb8\x02\xce\x77\x32\x45\x4a\x67\x68\xf4\x98\xa6\x3d\x53\x88\x3e\x8b\x2e\x17\xbf\xaa\xf5\x6c\xa9\x6d\x62\x9a\x50\x22\x70\x67\xf1\xc1\x8a\x42\xd4\x05\x71\x70\x05\xb8\xd0\x88\xba\xec\xce\xa0\x31\xc9\x63\xce\xf7\xa6\x62\xb3\x3e\xe1\x5c\xe5\x1a\x29\x97\x7a\x46\x3a\xa3\xc4\xee\x61\x9b\xd4\x08\xbd\xa7\x07\x71\x70\x05\x7c\x7f\xb0\x95\xb5\x6a\x0c\x4c\xb9\x68\x49\x0c\x8d\x5d\x58\xfe\x7e\x33\x50\x80\x82\x79\xd6\x64\x59\x83\x97\xec\x52\x47\xca\xad\xf7\x88\x39\x37\x88\xfb\xb7\x02\xff\x7f\x24\xff\x8b\x03\xa0\xf1\xf5\x24\x07\x1a\x14\x42\x75\xa7\x63\xb4\xbc\x89\xf4\xf8\xe8\xbf\x2f\x5e\xc7\xa0\x31\x6c\x25\x65\x6b\xbe\x23\x62\x1d\x85\x56\x6f\x6f\x26\x93\x89\x68\x3b\x88\x83\x3b\xf0\xb8\xbc\x67\x3c\xf7\xaa\x9d\x68\xa1\xcc\x76\xed\x8e\xc3\xb4\x20\xd3\xdb\x6d\xd5\x44\x81\xae\x9a\xb2\xf1\xae\x90\x9c\x91\x6c\x3d\x44\x5d\x10\x07\x77\x20\x48\x41\xe3\xe7\xcf\x92\x60\xd2\xcb\xbf\x6f\xde\x56\x1e\x92\xde\x1c\xdf\x7e\xdd\x75\x06\x1d\x7b\x3c\xbf\x3f\xed\x69\x07\xe5\x34\x34\x10\x80\x38\xb8\x03\xe5\x52\x6e\x68\x4a\x2a\x2d\xa8\x1a\x1b\x17\xa7\x16\xaf\xb9\x72\x98\x6e\x17\xaf\x87\xae\xa1\xa9\xd2\x51\x46\x5e\x50\x17\xda\x38\x83\xa8\x0b\xe2\xe0\x0e\x8c\x48\x99\x92\x33\xcc\x57\xfc\xdc\x41\x7f\x66\x55\x5d\x7a\x63\xe1\xdc\xc5\xb9\xf8\xe6\xcc\xf2\xdc\x6b\xd5\xbd\xe6\x7e\xb6\x85\x1f\x10\x0e\x80\x38\x84\x03\xff\x33\xad\xfa\x8b\x03\xa0\xc9\xce\x49\x0e\xdc\xa0\x30\x6b\xef\x6d\x53\x24\xaa\xfb\xc5\x68\xb2\x9b\x74\xb4\x84\x75\xfb\x26\x2d\xea\x01\xe3\x2c\x63\xd9\xaf\x1b\x6f\xa3\x0e\xa1\xfd\x5f\x20\x0e\xee\x80\xb4\x88\x4f\x4d\xf2\xc3\xb9\x2f\xc5\xea\xfe\x12\x43\x23\x3a\x23\xb2\x98\x85\x0d\x9a\x9d\x8a\xa4\x47\x92\x02\xe9\x46\x69\xe8\xc5\x88\xba\x20\x0e\xee\xc0\xc2\x3e\x46\x3e\xb1\xa1\xd3\x1a\x33\x65\x3b\x76\xf4\xa3\x65\x0d\x03\xde\xe9\xf4\x32\xce\xd5\x47\x03\xce\xca\x5f\xf6\x77\xac\xa0\xa1\x0b\xc4\xc1\x1d\x90\xf6\xf6\x32\xa6\x8a\x50\x88\x39\xbb\xea\x53\xbf\x6c\xe0\x15\x8d\xc2\xf2\x6c\x5e\x9f\xfe\x69\x0c\x59\x69\x33\xda\xab\x95\x94\x6b\xd0\xf3\x02\x38\xb8\x03\x57\x95\xe3\x6b\xf4\x29\xdc\xa3\x82\xb7\xd1\x5f\x99\xc5\xda\x0c\x95\x91\x0f\x27\x36\x7d\x5d\xc8\xdb\x39\xf7\x6a\x45\x7a\x3d\xaa\x01\xe1\x00\x88\x83\xfa\x01\x40\xfe\x02\x9a\x79\x9e\xe4\xc0\x44\x9b\x8b\xc1\x35\x37\xde\x06\x03\x53\x8d\xeb\x4b\xdb\x56\x1c\x5b\xa2\x55\x3b\x0d\x74\x32\x3d\xb9\x2d\x37\x2f\xe7\x8a\x8e\x59\x22\xda\x0e\xe2\xe0\x0e\xbc\x12\x55\x09\xda\x45\xa5\x8c\x4b\xc1\xeb\x7b\xf2\xa3\xca\xee\x52\xd9\x2a\xcf\x20\x17\xba\xba\x46\xe0\x2b\xe1\x15\x4d\xa1\x21\x73\x44\x5d\x10\x07\x77\x80\x65\x80\x80\xab\x71\xca\x44\x66\x6f\x66\xdc\x4a\x49\x72\xde\x5d\x85\xbf\x8a\xe0\xc8\x79\xbb\x7a\xff\x9b\x13\x85\xb8\xb0\x03\xf4\xa2\x0f\xc4\xc1\x1d\xc8\xda\xd3\x26\xdd\xf3\x52\x7e\xe3\x7d\x93\xe2\x75\x09\x4f\x49\xfc\xc1\x3d\x59\x82\x81\x85\xb4\x91\x33\xa6\xf8\x47\x85\xdc\x89\x61\xd0\x7e\x1d\x00\x07\x77\x40\xbe\xdf\x4b\xe1\x6c\x71\xff\x0f\xd3\xc0\x1f\x1d\x2e\xf8\x79\xc1\x7b\xd7\xda\x65\xbe\x10\x8b\x2d\xdd\x09\x0b\x48\x50\x7e\x1f\x29\x85\x70\x00\xc4\x41\xfd\xc0\x93\xbf\xe7\x2f\xa0\xb5\xfb\xc9\xf9\x0b\x55\x2a\x4a\xe4\xbb\x0f\x2f\x34\x5c\x3e\xa3\x13\xf3\xe0\x1c\x3d\xbf\x9b\x5c\x74\x18\xb9\x9c\xa4\xf4\x74\xb4\xae\xed\x57\xc2\xa8\x01\x22\xcb\x00\x71\xc8\xf9\xcb\x58\x0d\xfe\xbb\x98\x33\x59\x06\xbb\x6c\xfa\x33\x8e\x68\xc5\xe2\xfa\x5b\x11\xad\x81\x44\x4b\x05\xef\xd4\x18\x33\x88\x7e\x7b\xd4\x21\x2a\x83\x38\xe4\xfc\xa5\x93\x4c\x7d\x3d\x20\xd9\x76\x13\xf3\xfc\x8f\xaa\x37\x68\xf8\x91\x5f\x09\xce\x46\x5b\x06\x77\x0f\x97\xb2\xa8\x44\x35\x36\xbd\x68\x40\x54\x06\x71\x7e\xb2\xff\xfa\x25\xff\x91\x19\x31\xae\x98\x9d\xb5\xdd\x0e\x8b\xdf\x88\x19\xef\x08\x3e\x7f\x94\x2b\xf6\x98\xa5\xde\x96\x3d\xe0\xea\x1e\xfa\x72\xa9\x67\x72\x28\x94\xbf\x80\x4e\x02\xff\x99\xbf\xd8\x32\x2c\x7f\xdc\x8b\xe1\x1a\x88\xe1\x30\xad\x7d\x66\xd6\xcf\xe6\x36\x5b\x75\x63\x47\x74\xd7\x27\x86\x2c\x1d\xbd\x36\xfd\x20\xeb\x0f\x94\x34\x0b\x6b\x14\xcf\xe1\xfb\x90\x5c\x94\xbe\xa3\xda\x1d\xe3\x80\x5e\x55\x8c\xef\x38\xb8\x77\xb9\xf6\xb3\x0e\x2f\xe5\x0f\x38\x0b\xfc\xb7\xe5\x2f\xa0\xa6\xfd\x91\xbf\xf4\xc1\xf3\x17\xef\xdb\xb2\x7d\x45\x92\x5b\xd6\xaa\x02\x21\xc7\x34\xeb\xac\xf7\x0e\xee\x0f\xa5\xb4\x1e\xb3\x9a\x4f\xd2\x3f\x21\x49\x0c\x29\xb8\x7e\x1a\xf9\x8b\x24\x52\xfe\xc2\xb1\xd4\x77\x23\x73\xa7\xc7\x32\x2f\x2c\xd1\x9b\x11\xd7\xdc\x73\x41\x76\xe7\xb6\xb7\x6f\xe7\x57\xbb\xea\x47\x8f\x66\xda\x74\xdf\x9e\xca\xd6\x0c\xe4\xfc\xe5\xa9\xb2\xcd\x4b\x5c\x05\x6a\xcd\x65\xdd\x92\xfa\x66\x0d\x66\x9c\xce\x8b\x29\x3b\x61\xdb\x2f\x74\x83\x7d\x3b\x1f\x10\x18\x3c\x5a\x39\x95\x8d\x28\xc8\xf9\xcb\x7c\xb2\x66\x5c\x38\x59\xf2\xc7\xe5\x1c\xc5\xe8\x15\xbb\xa6\x6a\xde\xd1\xb1\xc0\x5e\xb4\x07\x65\x49\x45\x8b\x4e\x0a\xf6\x2c\x3f\x4f\xa5\xb5\xc8\xf9\xcb\x8f\x8a\x3b\xe5\x7c\x57\xcf\xc9\x7c\x3c\x93\xa7\xe4\x32\xd9\xf1\x7e\x5a\x84\x21\x5c\x2d\x32\xb8\x68\x6b\x97\x46\x55\xbf\xd5\x9d\xeb\x54\x5a\x8b\x9c\xbf\x78\x33\x5a\x5b\x1e\x06\x51\xee\x58\x99\x55\x4a\x2b\xaf\xcf\xda\x75\x90\x74\xfc\xd2\x27\xec\x37\x7c\x81\x9b\x85\xf5\xc5\xa5\xcf\xe2\xd4\xf2\x17\x90\xba\x27\x0d\xb7\xc3\x68\xbb\x8e\x49\xfb\x61\xf5\xe6\x3a\x28\x2d\xc6\x8a\x86\x4b\x69\x79\x1e\x53\xa3\x69\xf4\xf8\xd8\x1c\x69\x64\x9b\xa8\x3b\xd0\x92\x03\xc4\xc1\x87\x5b\xf3\x07\xf5\x19\x24\xbc\x87\x8f\x03\xb2\xf5\x5e\x3e\xbd\x1d\xb7\xe2\x3e\x6d\xa2\xb1\xf2\xfe\x90\xc1\x9d\x26\xfb\x66\x85\x4e\x39\x2d\xb4\x4b\x01\xc0\x21\xbd\xf2\xca\xff\x36\x75\x46\x29\x2b\x78\xf4\xfd\x32\x61\xfe\xd7\x19\xbc\xda\x8b\x67\x58\xda\x43\xea\xc7\x6c\xd2\xb9\xd1\x75\xdf\x50\x95\x42\xaf\xbc\x00\x9c\x9f\xb4\xe4\x3f\x5f\x77\xc8\xdc\xf6\xb4\xde\xd9\xeb\xcb\x12\xa7\xed\x9c\xee\x27\x2a\x3f\x2c\xa5\x4f\x9f\x8f\xfe\x1e\xaa\x53\x58\x4b\x7a\xa7\x0a\x2b\x14\x7a\xdd\x01\xe0\xfc\xa4\x51\xff\x51\xb7\x31\xee\x10\x9b\x92\x56\xe2\xc1\xca\x9d\x0b\x1b\xf6\xf4\xec\xf3\x56\xd9\xb7\x65\x2f\x5d\x4e\xea\xaa\x61\x9d\xe3\xa7\xa5\x60\xec\x42\xe4\x2f\x20\xce\x4f\x1a\x05\xcd\xdb\x27\xe0\x5f\xfd\xd5\x5f\x26\x5c\xa0\x6e\xe4\x24\x03\xee\xd2\x78\x68\x28\x52\xa7\xba\x12\x67\xf7\x8f\xb9\x6a\xfb\x8b\xbf\x74\xc9\x5a\x5a\xfd\xfd\x16\xdb\x24\x90\xa2\x8e\xbb\x2b\xd5\x0c\x7a\x39\x09\xe0\xe0\x06\x48\x84\x0e\x1d\xda\xdc\xdd\x37\xde\x78\xfe\x84\x4b\x04\x7b\x8b\xb0\x78\xd6\x31\x3b\x3f\x2e\x73\xf2\x1b\x6e\x0e\xcb\xdb\xb0\x19\x49\x44\x5d\x10\x07\x37\x60\x79\xd7\x3e\x62\xc1\xff\x55\x43\x78\xc8\x66\xca\xf7\x80\xb0\x57\xba\x1f\xd8\xad\x5f\x2e\xe2\x71\xd7\x05\xb5\x1c\x49\x5f\x78\xc4\x83\xa8\x0b\xe2\xe0\x06\x94\x5a\x5e\x18\x18\x08\xaf\x0d\xff\xfd\xf4\xb9\xfd\xa3\xaa\xa2\x31\xae\x63\xdf\x0c\x5b\xd3\x08\x2c\x1a\xfc\x80\x03\x8a\xf5\x37\x49\x88\xba\x20\x0e\x6e\x40\x99\xcb\xe3\x6e\xec\xcf\x79\x6e\x18\x29\xd7\xea\xf1\x96\xcf\x27\xfc\xa2\xb9\xc1\x4b\x5f\x75\x59\x72\xd3\x59\xce\xde\xa6\xcc\xb3\x1a\x91\xbf\x80\xb8\x7f\x1b\xf0\x3f\x83\xc7\x5f\x14\x00\x75\xe9\x27\x29\x30\x3e\xec\xe8\x22\x79\xe7\xf3\x4c\x6a\xc6\x6d\x33\x09\xdc\xdd\x0d\x7b\xd1\xb8\x7a\x1d\xac\xc7\x9a\xf1\x67\xf3\x49\x6f\xd0\x05\xa4\x20\x9a\x0e\xe2\x90\xe6\xdc\x2f\x58\x12\x93\x52\x43\xfc\xee\x7c\x66\x6d\x48\x9b\xc5\x25\x8c\xb4\x71\xd0\x91\x7d\xd2\x69\xc3\x6a\x74\xfe\x29\x97\xf5\x53\xe8\xfc\x11\x88\x83\x2b\xa0\xb8\x49\x3a\xcc\x64\xf6\xa1\x42\xdf\x57\x09\x65\x86\x57\x87\x2a\x59\xee\x65\xfd\xec\x3b\x2c\x05\x5e\x52\xbc\x79\x96\xa5\x7a\x17\x44\x5d\x10\x87\xa4\x80\x66\x9e\x5e\x8f\xc3\xc6\xee\xe7\xd0\x5d\x1d\xb2\x1c\xc3\x9e\xaa\x31\xdd\x5f\x0d\xbe\xfd\x5b\xb8\x17\xfb\x66\x8e\xb1\x5d\xa1\xb5\x37\x88\x83\x2b\x40\xd2\x85\xf3\x31\xeb\xc5\xba\x42\x50\x94\xa9\x30\x5e\x2e\x91\xe7\xad\x3c\x9e\x85\xaa\x46\x52\x6f\x72\x73\x6e\x1f\x5a\x5e\xd7\x36\xc4\x9c\x1b\xc4\xfd\x5b\x81\xff\x3f\x92\xff\xc5\x01\xd0\xf8\x7a\x92\x03\xe1\x43\x18\xdf\x72\x38\x5a\xdc\xdd\xdf\x8a\xec\xd9\x50\xa7\x39\x4a\x04\x0d\x1b\x6a\x89\x0f\x9d\x1f\xfa\xc5\x21\x63\x53\xf7\xf6\x02\xa2\xed\x20\x0e\xee\x00\x7b\x43\x8a\x20\x81\x8f\x88\xce\xd5\x78\x63\x39\x97\xec\x7d\x95\xe9\x80\x3b\xe7\x7b\xcf\x62\x3f\x4b\xa1\xe0\x8f\x95\x16\xbc\x8b\x87\xa8\x0b\xe2\x90\xf6\x40\xcd\xb6\xdf\xcf\x99\x92\x1b\x95\xcb\x27\x7e\xf0\xba\xc5\x0f\xf7\x6e\xb5\x96\xd2\x55\xa2\x9e\x0f\x62\xe8\x6b\x16\x57\x06\x08\xf8\xa1\x3d\x50\x00\x0e\xee\x80\xb8\xc5\xaf\x03\x62\xbd\xda\xd9\xe8\xb6\x9e\x2e\x06\xce\xe4\x2e\x43\x5b\x39\x91\xb4\xb9\x85\x55\xf9\xde\xdf\xe6\x1c\x9a\xe1\xd0\x80\x08\xe2\xe0\x0e\x60\x95\x86\xdc\xf8\x8a\xb6\x91\x1f\x2d\xd9\x9b\x5d\x7a\x61\x9f\x9e\x67\x2d\x21\xac\x0b\x9d\x29\x97\xf4\xb5\xf5\xfb\xc9\x99\x03\x51\x84\x03\x20\x0e\xe1\x80\x24\x20\x7f\x01\x4d\x76\x4e\x72\xe0\x53\x98\x6c\x58\xd1\x53\x6a\x1c\x81\x72\xcf\x89\x37\x8b\x55\xc7\xe4\x1e\xcc\x17\x8c\x22\x2e\xe8\xf6\x4c\x3b\xb7\x27\xf8\xd0\x1a\x22\xda\x0e\xe2\xe0\x0e\xfc\xb6\x3e\x9b\xf8\x2e\x46\x58\x9a\xf0\x39\xed\xdc\x4b\xbd\x19\xde\x80\x67\x9d\x4f\xec\x17\x2e\x5b\x12\xde\x4c\xdb\x08\x7d\x15\x0c\x9d\x11\x01\x71\x70\x07\x8e\xdf\xbe\x32\x2a\x77\xba\x99\x30\x1a\xa1\xfa\xd1\xbf\xf0\xf8\xa0\x76\x1a\xeb\xc1\x4d\xbd\x43\x21\xd3\x1f\x79\x85\x5a\xf2\x98\xbf\x10\x75\x41\x1c\xdc\x81\xc5\x18\x8b\x9c\xfd\x43\x05\x37\xc5\x39\x5b\xdb\x0f\xdf\xc4\xe3\xdc\x12\x34\x95\x79\xae\x8c\x71\xad\xde\xea\x8f\xdc\x10\x4d\xcb\x41\xd4\x05\x71\x70\x07\x52\xd9\xee\xd5\xb8\x0f\x3b\xc4\x08\x6b\x0d\x6b\xab\x50\xf8\xbe\x4e\x7c\xa0\xaa\x7c\x8e\x2b\xea\xab\xda\x16\xf5\xbe\xdd\xcd\x64\x57\x84\x03\x20\x0e\xea\x07\x00\xf9\x0b\x68\xe6\x79\x92\x03\xcc\x8a\xc7\x3a\x38\x01\x78\xe2\x17\x48\xe7\x3a\x0f\xb9\x23\x2e\x5f\xbb\x91\x83\xe9\x9d\xc1\x97\xfd\x60\x73\xf8\x3d\xee\xac\x20\x74\xee\x06\xc4\xc1\x1d\xb8\x70\xde\xb2\xed\xbd\x94\xf2\xce\xf3\xa4\x94\x5e\xe1\x8d\xae\xcc\x2a\xb6\x01\x7e\x1f\xdd\x08\x92\xb4\xf7\x74\x9f\x84\x07\x69\xa1\xff\x57\x20\x0e\xee\xc0\x2f\xcf\x70\x8a\xd5\xd2\xc2\x77\x78\xf7\xc2\xf2\x3e\x74\x4c\x87\x71\xbe\xa6\x36\xa8\xbf\xcd\xb1\x2f\x75\x25\x7c\xcf\xbd\xef\xeb\x6d\x44\x5d\x10\x07\x77\x60\x6e\xe9\xb1\xd4\xc7\x75\xe3\x76\xb7\x9b\xdc\x5f\x1a\xe2\xf5\x2d\x99\xf8\xae\x54\xfe\x88\xff\x50\xec\x7b\x2f\x54\x12\x7d\x7a\x9f\x08\x51\x17\xc4\xc1\x1d\x78\x9d\xe4\x36\xab\x45\x59\x80\x46\x50\xd7\xe8\xb2\x98\x75\x31\xbf\x71\xaa\x99\x31\x3a\xd9\xb0\x65\xc6\x29\xa1\x84\xb5\x93\xc9\x1f\xe1\x00\x88\x83\xfa\x01\x40\xfe\x02\x5a\xbb\x9f\x9c\xbf\x64\xbe\xb5\xfe\xfa\x56\x22\x33\x73\x42\xdb\xfe\x51\x4d\x3a\xfe\x6a\x76\xd1\xed\xa8\xe0\x1b\x66\x94\xfc\x55\x33\xc9\xc1\x56\x92\xd1\x88\x2c\x03\xc4\x21\xe7\x2f\x8d\x95\xc3\xe3\x99\xed\x6c\x39\xe5\x05\xeb\xed\xde\x5a\x5b\x9f\x1e\x48\xb7\x1a\xf0\x6b\xb7\x07\xb9\x3f\x70\xa2\x36\xd6\x67\x2b\x45\x54\x06\x71\xc8\xf9\x0b\x9d\x6d\xa0\x5c\x6e\x83\x09\x0f\xee\xf4\xf9\xf7\x91\xc7\xbf\x6d\xf4\x0a\x9f\x06\xa4\xd1\xda\x10\xe1\x9d\x1f\x8a\xf6\x57\x14\x96\x46\x54\x06\x71\x7e\xb2\x28\x28\xff\xfc\x37\x0b\x35\xba\x3f\xd1\xfa\x25\x55\xdf\xc5\xbb\xa3\xf2\xa1\x80\x6f\x6a\x73\xeb\x06\x59\xdc\x6f\x3d\x32\x4e\xe1\xa0\x17\x3a\xbf\xe5\xfa\xa0\xfc\x05\x74\xbd\xda\x9f\xf9\x4b\x32\x3b\x29\x9e\xaf\x68\x9b\xbc\x90\xdb\xca\xed\xe7\xea\x43\x16\x75\x59\x41\x64\x03\xdb\xb7\xb4\x9e\x87\x11\x85\xce\xbf\x5e\x32\xfb\x03\xdd\x92\xc4\x30\xe9\xbd\x73\x67\xa0\xa6\xed\xfe\x82\x61\x5a\xde\xb1\x8c\xaf\xbd\xaf\x9f\x21\x13\x36\xf9\x8b\x85\x2b\x0e\x8f\x3d\xb9\xff\xdb\xf2\x17\x50\xd3\xfe\xc8\x5f\x48\x28\x60\xab\xe5\x1b\x26\x2e\xab\x54\x17\xcb\xa8\x29\xb4\x2d\xa6\x29\x9b\xe9\x51\xef\x9f\x11\x48\x70\xc0\xf4\xca\xd1\x46\xd5\xe7\xbc\x5d\xdc\x4b\x7d\x1a\xf9\x8b\x37\x52\xfe\x12\xd8\x7c\x66\x89\x6e\x97\xa4\xb4\x56\x28\x56\xa5\x8d\x35\xf2\x4e\x91\x5d\x28\x4a\x47\x7e\xd4\x16\xdd\x23\xb5\xc4\x17\x7b\xe3\x84\xa7\xb2\x35\xe3\x1a\x52\x34\xf0\x75\xfe\x32\x91\x1b\x91\x68\xd2\x68\x15\x6e\xbf\x5a\x24\x5a\xe6\xe5\x03\x95\xc7\x6f\x9e\xf6\x3d\xe6\x49\xbc\x84\x47\x4d\x46\x62\x7b\x2a\x1b\x51\x90\xf3\x97\x44\x31\x94\xb2\xc7\x77\x3a\x0d\x28\x19\x0d\x93\xe2\xee\x37\xcc\xd6\x5e\x95\x5c\x7a\xf0\xdc\xf2\x2a\xa3\x8f\xfb\xf8\x65\x3e\xee\xa0\x53\x69\xad\x31\xd2\x9f\x5d\xe7\xcb\x92\x5a\x5e\xa1\x75\xa7\xfc\xc8\xc5\x79\xc1\x60\xa0\xa1\xe3\x17\x1b\x6b\x76\xde\x5b\x4e\x0b\xc6\xb3\x75\x33\xf9\x46\x23\xa7\xd2\x5a\xe4\xfc\x25\xf3\x9d\x24\x15\xe1\x72\xc8\x79\x8f\x8c\x21\xf5\xb5\xa5\xd1\x73\x0d\x46\xeb\x74\x89\x1c\x4a\x1f\xb9\x6c\x7a\xc6\xf1\x05\x1e\x28\x9c\x5a\xfe\x02\x52\xf7\xa4\xe1\xf6\xd2\x94\x9e\x57\x83\xd7\xcb\x1a\xf5\x60\xa3\x77\x02\xeb\xaf\xa9\x9a\x62\x29\xf5\xf2\x9b\x4b\x47\x6d\xb5\x26\xc5\x99\x9a\x37\xa9\x11\xc3\x0c\x88\x83\x0f\xb7\x13\xe7\x69\x23\x55\xe3\xa7\xb4\x59\xcb\x48\xca\xd9\x45\x36\xdd\x54\x96\x6d\x98\x03\x48\x5e\x36\xd3\xcb\x3f\x8f\xee\xbb\x70\xf0\x04\x7a\x8d\x02\xe0\xe0\xc3\x6d\x91\xbf\xd8\x2d\x52\xcb\x6b\x64\xbb\xdc\x98\xd6\x57\x55\xd0\x51\xdc\x82\x8b\x07\x03\xfa\x2a\x8c\x58\x08\xfd\x9b\x77\x67\xb2\xd4\x10\x75\x41\x1c\x52\xfe\x62\xb0\x6b\xa3\x93\x21\xee\x97\x60\xd9\x65\x5f\xa8\x71\x61\x5f\xd7\xe8\xcb\x41\xdc\x8d\x25\x05\x4a\xd6\x07\x3f\xfd\x93\xf6\x48\xa0\xfc\x05\xc0\xf9\x49\x93\xfc\xa3\xae\x36\x96\x04\xb9\x80\x7d\xdf\x79\xba\x21\x4d\xc1\xc2\xfa\xee\x0d\x62\x95\xb2\x33\x2e\xee\x38\x71\x5e\x86\x69\xdf\xb7\xcc\x9d\x52\x11\xf9\x0b\x88\xfb\xf7\x71\xdf\x7f\xf5\x57\x7f\x99\x70\x81\xba\x91\x93\x0c\x50\x98\xca\x0f\xb7\x0b\x1d\xdd\xcf\x4d\x77\xb3\xbe\xe0\x3a\x59\xb4\x94\xea\x6c\x2e\xe5\x9e\xb1\x30\x23\xd0\xf4\x5b\xa2\x87\x44\x16\xd1\x72\x10\x07\x37\xc0\x2c\x66\x55\xf1\x06\xe9\xd7\xc4\xef\x33\x6f\x1b\xcd\xda\xeb\xfa\x3d\xe8\x09\x4a\x15\x9b\x30\x02\x0a\x65\x2c\x3e\xb7\xbe\xe3\x82\x26\x46\x20\x0e\x6e\x40\x18\x9d\xf1\x21\xfa\x87\x74\xe2\x1f\x2f\x2f\x05\x3a\x4d\x7c\xc4\x0f\x61\x56\xdd\x15\x49\x2c\xfc\x40\x20\xb1\xca\x47\xcf\x28\x05\x1d\x3c\x00\x71\x70\x03\x56\x0d\xe2\xb7\x45\x09\x53\x2d\x29\x89\x83\xeb\x55\xba\xe4\xaf\x0e\x05\x16\x48\x90\x17\x29\xc7\x3d\xc9\x9b\x16\x73\xe7\x16\x81\x0e\x4a\x80\x38\xb8\x01\xb4\xf3\x9f\x22\xa4\x29\x3a\xf3\x0a\xee\xd9\x50\x14\x7d\x4d\x7d\x29\xe5\xee\xab\x78\x3b\x7d\x8a\x34\xfc\xe8\x23\xd3\x6a\x10\xea\x26\x22\x7f\x01\x71\xd0\xfd\x2f\x7f\xcf\x5f\x40\x5d\xfa\x89\x9d\x40\xf2\xf7\xda\x91\x77\x42\xe6\x07\x02\x83\xe8\x2e\xa2\xd5\xef\x75\x3c\xbe\xe7\x7b\x3e\x5e\x9d\xb8\xc2\x82\xff\xc0\x64\xf0\x37\x27\xd4\x09\x00\x38\xb8\x02\x3f\x9c\x28\x27\x02\xbe\xd1\xfd\x50\x8f\xac\x2d\x51\xb2\x2b\xd8\x5b\x14\x88\xa4\x90\x22\xf8\x2e\xa8\x8f\x5e\x12\x45\xeb\x62\x04\xad\x91\x41\x1c\x5c\x01\xa5\x58\xaa\x3b\x15\x92\x67\x66\x03\x72\x1d\xe2\x03\x68\xeb\xf9\xe5\xd0\x9e\x0c\x7d\x5f\xa7\x38\xb0\xa6\x13\xc4\xc1\x76\x8c\x10\x45\xd4\x05\x71\x70\x05\x42\x22\xec\xc3\x66\xab\xe2\xbc\xd2\x05\xb5\x7f\xe0\xb2\x7b\x55\x6a\x5f\x61\x8c\x19\x6f\xc8\xc3\x89\xcf\xbb\xf5\xc9\xf0\xae\x19\xf4\xbc\x20\x0e\xae\xc0\x53\xdf\xef\xb9\x9d\x0a\x0d\x63\x6f\xaf\xbb\x61\x70\xa3\x1e\x7b\xef\xea\x08\x38\xd5\x66\xfb\x6f\x2e\xb4\x54\x1a\x5d\xc1\xf2\x30\x43\xcc\xb9\x41\x1c\x74\xef\xc3\xb5\xbf\xaf\xbb\x40\xe3\xeb\x89\xfb\x5f\x22\x95\x98\xcd\x85\x65\xe5\x9c\xb2\xb8\x05\x13\xe4\xe8\x52\x28\x59\x86\x34\x48\x50\x04\x16\x1b\x04\x64\xe8\x07\x52\x5d\x58\xa1\xfd\x2f\x00\x0e\xee\x00\xc6\x93\x1e\xfc\x7e\xc9\xd0\xbb\xfc\xe8\x7b\x89\x52\xca\x41\x09\x53\x52\x6a\x4d\x9d\x66\x99\x72\x0c\xf7\xbb\xfa\x3c\xeb\xdd\x12\x10\x75\x41\x1c\xdc\x01\x5b\x12\x6d\x26\x39\xca\x60\x17\x01\x97\x52\x8a\xb1\xb7\xb2\x7c\x6a\x43\xa5\xee\xfc\x03\x7c\xd9\x56\xf9\xc4\x81\x69\x5c\xae\x1e\x88\xba\x20\x0e\xee\x80\x81\xaa\x3b\x8f\xfe\x15\x16\x07\xfe\xca\x62\x3f\xcb\x4f\xbe\x54\xd4\xf8\xd3\x92\x3d\xc7\x12\x7a\xce\xe9\xee\x37\xab\x35\xbf\x43\x03\x01\x88\x83\x3b\x80\x3d\xe9\x93\xad\x7d\x40\x9c\x72\x6e\x3b\xb8\x2a\xdb\x0f\xa5\xf6\x79\x8d\x5c\xf1\x59\x4a\x6d\x5b\xad\x4f\xd1\x5c\xc7\x0f\xbd\x7a\x10\x0e\x80\x38\xe8\xde\x07\x40\xfe\x02\x9a\xec\x9c\xe4\x00\x8d\x4a\x0f\xbb\x9a\xd3\xcf\xb7\x95\xdd\x5f\x0b\x9b\x36\xfb\x94\xce\x0f\x11\x55\xb5\x9b\xd7\x36\x26\x59\xed\x7f\xed\x18\x58\x80\xae\x02\x03\x71\x70\x07\x26\x45\xce\x3e\xf8\x62\xef\xad\xf4\xa3\xe1\xf2\xc1\xf0\x5a\x43\x74\xf9\xed\x5a\x4f\x5b\xb1\xb2\x5e\xf1\xc0\xbe\x37\xea\x6f\x88\xa1\x7d\x70\x20\x0e\xee\x40\x8a\xf4\xf4\x1e\xff\x81\xcc\x7e\xa6\xd4\x85\xa8\x5b\x92\x0e\xf8\x96\x4d\x1e\x5f\x55\xf7\x19\x7c\xdf\xb9\x3c\x9f\x91\xee\x42\x85\xf6\x28\x80\x38\xb8\x03\x75\x12\xd4\x23\x13\x04\xcb\x8c\xcc\x3f\xc7\x6f\x7c\x2f\xfd\x10\x11\xdc\x10\xf1\x34\x2d\xfa\x78\xf9\x2c\x37\x0a\xcb\x43\x4a\xc6\xdf\xd0\x19\x1c\x00\x07\x77\xe0\x6c\xa5\xf9\x07\x79\x62\xe2\x57\xc5\xee\x33\x3a\x42\xc9\x8a\x5c\x38\xec\x91\x4b\xb5\x0f\xe7\x51\xbe\xfc\xaa\xec\x42\x35\x12\xb3\x42\x38\x00\xe2\xa0\x7e\xc0\xf8\xef\x0e\x80\x66\x9e\x27\x39\x40\x19\xd2\x2d\xb1\x72\x79\x4b\xf0\xd8\x70\x81\x0b\xa5\x8e\xbf\x18\x73\x4d\x2f\xed\xb1\x43\x27\xb5\x6f\x94\x81\x86\x40\xd7\x8d\x73\x88\xb6\x83\x38\xb8\x03\x15\x74\xf9\x61\x7c\xd3\xa3\x17\xc4\x4b\xe4\x9f\x05\xf1\x7a\x74\x09\x7d\x6f\xc6\xe8\x6e\xb7\x76\xfd\x48\x4c\x97\xe3\xf2\xeb\xb8\x0d\x51\x17\xc4\xc1\x1d\xf8\x7a\x8b\xb1\x3c\xce\xaf\xe3\xdb\x20\xbe\x6f\x8f\x8f\xb3\x42\xa8\x4b\xcb\xdb\xb8\x94\xde\xc1\x44\x9b\x26\xda\xef\x3c\x2f\xb6\xa0\x0d\xdc\x20\x0e\xee\x00\xe7\xf7\x14\x66\xf9\x3c\x65\x76\xd4\x2b\xb7\x1f\xcf\x6a\xcb\x90\x6d\xa7\x8f\x87\x72\x6b\x7f\x60\xed\x53\x8a\x5e\x4b\x8d\xfe\xf0\x02\x51\x17\xc4\xc1\x1d\xa8\x93\xbe\xe7\x31\xd3\xff\x4b\xa4\xa1\x8a\x29\x3e\xde\xfe\xf6\x52\x65\xed\x23\xb9\x7b\x83\x6f\xd8\x2f\xef\x1f\xde\x4f\x61\x72\x18\x45\x38\x00\xe2\xa0\x7e\x00\x90\xbf\x80\xd6\xee\x27\xe7\x2f\xde\x31\x0b\x5e\x83\xd6\x5b\xdb\x9e\xa8\x8f\xd2\x33\xc2\xde\xae\x2f\x61\xf7\x16\x06\xc8\x25\x38\x5e\x18\xcb\xa3\x51\x11\x2e\x09\x43\x64\x19\x20\x0e\x39\x7f\xc9\x09\x0d\x52\x33\x4e\x5e\x73\x9d\x72\x6a\xad\x26\x7a\xa3\x89\xaf\x34\x63\xbd\x9c\x31\xe9\xe8\x3e\x4a\x31\xc8\xc2\x31\xbb\x4d\x88\xa8\x0c\xe2\x90\xf3\x97\xbc\xaa\xb0\x6f\xf4\x28\xe9\x4c\x2e\x3e\x2b\x77\x2d\xb2\x1e\x75\xa8\xb6\xd9\xcd\xe3\x13\xe8\x5d\xc5\x70\x94\x7f\xc7\xe3\x19\x32\x87\xa8\x0c\xe2\xfc\x64\x51\x50\x30\xfe\x51\xb9\xba\xf2\xed\x8d\x47\x6f\xde\x96\x07\x5c\x7b\xbe\x9a\xb1\x70\x93\xf8\x7d\x7b\x7d\xaa\xd8\x28\x4a\x36\xd9\xbe\x77\x90\xe3\x87\xe1\x6f\x50\xfe\x02\xba\xb3\xfe\xcf\xfc\xe5\xc7\x05\xc3\x5c\xb5\x6d\x6f\xa1\x51\x33\x2e\x16\xa2\x3d\xf2\xdb\x5a\x77\xa6\xf6\x3c\xd7\x59\xed\x94\xf7\xfc\x2c\x19\x85\x04\x9c\xff\x40\x59\xbd\xd7\x69\x27\x94\xab\x42\x7a\xf2\x2c\x69\xf2\x3f\xd0\x74\x11\xcb\x32\x6a\x48\x15\x3e\x25\x5e\x2f\xd1\xa7\xf3\xd8\x0f\x8b\xff\x6f\xcb\x5f\x40\x4d\xfb\xf3\xfe\x17\x78\xfe\x42\x77\x8f\x4c\xa6\x4f\xf5\xb0\xab\xb5\x29\x8c\xf4\xf5\x0f\x15\xff\x62\xc7\x9a\x08\xb6\xf3\x37\x33\x5d\xd4\x5e\x7c\x4f\xed\x73\x46\x3d\x8d\xfc\xa5\x01\x29\x7f\x29\xf4\x35\x6a\x14\x7a\x47\x70\xd3\x8d\xfa\x0c\x5f\xa0\xcd\x0f\x02\xd5\x02\x7d\x5a\x27\x07\x77\x89\xb5\x1b\xe1\x9a\x09\xad\x63\x15\xa7\xb2\x35\x03\x39\x7f\xb9\x22\xcd\x3b\xa8\xce\x77\x1d\xfb\xf8\xad\xcf\xbe\xfd\x06\x7f\xdf\xbe\x93\x24\xcf\xa8\x8d\x72\x6f\xa0\xd9\x87\xe0\x67\x34\x57\x06\x4f\x65\x23\x0a\x72\xfe\xe2\x37\xfc\x20\x2e\xa0\x65\x76\x99\x3f\x96\xcd\xff\xd2\xed\x6f\xeb\x9d\x32\xa3\x3a\x85\x69\xd9\xb9\x38\x29\x82\x4f\x59\xb4\xf4\x8f\x4f\xa5\xb5\xc8\xf9\x8b\x80\x36\x97\x41\x79\xfc\x5c\xad\xa1\xf7\xd7\x04\x11\xc7\x7a\x92\x17\xc3\x5b\x97\xe2\xec\xf8\x3b\x19\x43\x3a\xbe\x3f\x14\x8c\xec\x3e\x95\xd6\x22\xe7\x2f\x14\xfe\xb9\xda\xf2\x5f\xf1\x45\x3f\xb5\xdd\xef\x3d\xae\xf6\x50\x3e\xaf\xc3\xb1\xf2\x44\xdd\x82\x54\x8a\x4f\x89\xb5\x58\x7f\x6c\xe7\xd4\xf2\x17\x90\xba\x27\x0d\xb7\xa9\x86\xe2\x62\x75\xb2\xfa\xc5\x47\x99\x0d\xc2\x29\xb9\x9e\x14\x58\x26\x4d\x71\xa6\x9e\x2c\xa4\xca\xc1\xdb\x84\xb5\x89\xe6\x05\x88\x61\x06\xc4\xc1\x87\xdb\xaf\x83\xc6\x59\x1e\x2c\x22\xea\x33\x66\xb7\x0d\x15\x89\x09\x6c\x22\x77\x9b\xec\x32\x6e\x06\xcb\x7e\xfd\x12\xe9\x2b\xa2\x26\x55\x0d\x0d\x8b\x00\x0e\x3e\xdc\x1e\xa1\xd5\xe6\x29\x5f\x2f\x0d\xa0\x35\x78\xf9\xbe\x7f\xa8\x6f\x49\x2f\x32\x31\x72\x41\x22\x00\x9f\x2e\xe7\x81\x10\xef\x21\x31\xf4\xca\x0b\xc4\xc1\x87\xdb\xb0\x2b\x52\x3d\x35\x46\xd4\x7c\x1e\x01\x22\x82\xe1\x02\x45\xee\x1e\xa9\xaa\x57\x38\x38\xfb\xee\xea\x6a\xdf\x7f\xea\x8b\xc3\x0b\x5d\x7f\x00\xe2\xfc\xa4\x51\x50\xff\x71\xae\x29\x40\xf6\xf3\xd2\xb3\x0c\xd1\x21\x19\x19\xd4\xae\xb7\xdf\xe4\xba\x13\x28\xd7\xce\x29\xf2\x47\xce\x0c\x9f\xb1\x78\x49\x5d\x1e\x8a\xc8\x5f\x40\x1c\x74\xff\xcb\x5f\xf3\x17\x50\x37\x72\x92\x01\xde\xc6\xc6\x4d\x17\xb6\x68\x07\x5f\x6f\x85\x88\xe9\x29\xc5\xe0\x4a\x05\x3a\xaf\x67\xd1\x9a\x18\x50\xe4\x4b\xa8\x3c\xaa\x0f\xbf\x8a\x68\x39\x88\x83\x1b\x80\x75\x2d\xfd\xc2\xc6\xd7\xe9\x56\x4e\x1f\x3d\x07\xd7\x72\xa1\xa0\x37\xd3\x47\xce\x6c\xb8\x68\x8c\x93\x1f\x3f\x28\x4d\x96\xc5\x26\x22\xea\x82\x38\xb8\x01\xf4\x2f\x5f\x5d\x94\x1a\xa4\xb0\xe1\x3d\x7b\x86\x47\xd7\xdc\x59\x3e\x3b\xb0\x65\xa8\x7b\x69\x45\xff\xc3\x6d\x7d\x9b\x28\x8b\x91\x2c\x44\x5d\x10\x07\x37\x20\x97\xb0\x8a\xfa\x1b\xdf\xf2\x8f\xe8\x8a\xce\x91\xcb\x2b\xc3\x99\x71\x77\xe7\xe3\xb8\xa7\x43\xec\xec\x1f\x51\xa0\x68\xc8\xe3\x75\x21\xea\x82\x38\xb8\x01\x6d\xc4\xa9\x31\x5c\xd3\xda\x79\xea\x85\x3b\x98\xb3\x58\x0e\x4a\x9b\x09\x6d\x4d\xb7\x45\x43\xab\xfd\x76\x55\x5e\xcb\xbd\xe7\xec\x47\xe4\x2f\x20\x0e\xba\xff\xe5\xef\xf9\x0b\xa8\x4b\x3f\x49\x81\x2d\x29\x9c\x61\x53\xc2\xb9\x1b\x7e\x84\x4f\x4b\x75\x94\xd3\xab\x4c\xc9\x70\x55\xca\x87\x53\x96\xc9\x8b\x42\x5c\x67\x26\x55\xa1\xf7\xd3\x20\x0e\xae\xc0\x06\xf7\x81\xd5\xe8\xe2\x83\x1c\xb5\x8c\xb1\xdc\xdc\xf4\x50\xc5\x63\x29\x3f\x2c\x5c\x0f\xbf\x7b\x07\x21\x96\xb4\xc7\x05\x56\x93\xd0\xdd\x88\x00\x0e\xae\x80\xa1\x73\x78\xcc\x3b\xae\x98\x9a\x0d\x3c\x22\x9c\x55\x8f\xbd\x9b\x6b\xb8\x0f\x57\x2d\xf0\x36\xdf\x04\xb1\xe3\x6d\x75\xd5\x84\x41\xef\xa7\x41\x1c\x5c\x81\xc8\x5b\x51\xa3\x8e\x45\xea\x93\x45\x21\xd7\x87\x8e\x4a\xce\xd9\xd4\x4d\x71\xba\x7a\x5a\xd7\x0a\xe3\x9b\x5f\xbf\xcb\xe8\xb4\x0c\xed\x7f\x01\x71\x70\x05\xd6\x68\xbe\xbf\xd1\x8c\xed\xd1\xd6\x7f\xdd\x79\xc8\x83\x76\x35\xbc\xd6\xe1\xeb\xed\x46\x06\xa9\x67\x1c\x29\x5c\xf8\x2d\xa3\x4c\xf7\x11\x73\x6e\x10\x07\xdd\xfb\x00\xc8\x5f\x40\xe3\xeb\x49\x0e\x5c\x98\x48\xfb\x60\xcc\xac\x85\x47\x99\x66\xdb\xed\x3e\x78\x7b\x31\xdb\xd0\xc7\x4d\x35\x80\x6f\xaf\x9a\x3c\x2f\xa4\xe3\xa3\x30\x31\xf4\x7e\x1a\xc0\xc1\x1d\xf8\xd6\xbc\x27\xb1\xb0\xdd\x51\xe8\x54\x59\x6f\x72\x9e\xaa\xdc\xca\x57\x6f\xd0\x34\x9a\x25\xa8\x81\xe2\xb9\x46\xfe\x61\xcf\x25\x23\xe8\x4e\x11\x00\x07\x77\x20\xb2\x62\x7c\xfb\xe5\x66\x5c\xa0\x79\xe9\x60\x6d\xa8\x5d\xab\xf8\xb3\xa6\xf7\xa3\xdc\x15\xfa\xde\x0e\xb4\x86\x6f\x6e\xfa\x33\xcb\x43\xff\x56\x00\x0e\xee\x40\xd0\x03\x52\x6d\x25\x9e\xdf\x49\x4e\xde\xf1\x5b\xa2\x63\x57\xde\x34\xb6\x3f\xd5\xf0\xf4\x68\xf5\x5d\x61\x7e\xc2\xce\xfa\x49\xa6\x0e\x3a\xd7\x04\xe0\xe0\x0e\x3c\xdc\x60\xd2\x4f\x90\x98\xcf\xd6\xe1\xfb\xce\xf1\x51\x2d\x02\xff\x33\x39\x93\x8e\x9b\x53\xfd\x32\xd9\x22\x39\xe5\xb2\x04\x5b\x1e\xc2\x01\x10\x07\xdd\xfb\x00\xc8\x5f\x40\x93\x9d\x93\x1c\xe0\x34\x9d\x8b\xa6\x1a\x0c\xbb\x24\xd0\x1a\xfb\xb1\x45\x91\x58\x87\x7a\xbc\xc5\xd7\xaf\x2e\x40\x9d\x59\xc5\xbd\x4e\x33\x9f\xee\x0e\xb4\xe6\x04\x70\x48\x9b\x61\x15\xb7\xee\x7e\x77\x2a\x0e\xc8\x5f\x77\x8a\xa3\x37\x3e\xfb\x7b\x99\xe3\xe2\x9b\xb0\x63\xb4\xdf\xc6\xd1\x6a\x39\x99\xc9\xa5\xf5\xd0\x66\x58\x00\x07\x77\x60\xb0\xca\xf3\x63\x27\x06\x7e\xc0\x3b\x5e\xc5\x24\xd2\x5c\x99\xc6\xd0\x8f\x97\xdb\xe7\x42\xba\x35\xa5\x79\x56\xf1\x7e\xa9\x28\xae\x22\xea\x82\x38\xb8\x03\xcd\xef\x08\x37\x46\x0a\x3b\x5f\xee\x9b\xec\xe0\xdf\xf1\x26\x8b\x08\xb4\x72\x5e\xe3\x3b\x92\xda\xab\xab\x1f\x76\x5f\x76\xee\x31\x41\xd4\x05\x71\x70\x07\x78\x53\xce\xf7\xed\xb1\xa2\x1f\x95\x55\xda\x6f\x24\x66\x53\xf2\x2d\x3c\x29\xff\xa8\x58\xee\x48\xb0\x9b\x4b\xdc\x7b\x21\xa5\xa0\x06\xe1\x00\x88\x83\xfa\x01\x40\xfe\x02\x9a\x79\x9e\xe4\xc0\x4f\xad\xd7\x49\xc1\x35\x21\x58\xd3\xee\xed\xcb\x69\x56\x02\x5c\xef\x6e\x8f\x77\xd7\xd4\x2c\xf8\xd7\x32\x60\xfe\xd6\x15\x2a\xeb\x86\xee\xb5\x06\x70\x70\x07\xe6\x1e\x46\x65\x9b\x57\x2b\x3d\x0c\x3f\xc0\xd1\xa9\x2a\x8d\x38\xcb\x15\xd8\xe5\xf3\xab\x24\x2c\xb5\x6d\x75\xc9\x0d\x33\x54\x36\x03\xda\x4f\x02\xe0\xe0\x0e\x1c\xd2\xbf\xa4\x98\x94\xde\x10\xbe\x4b\x71\xae\xb8\x42\x9e\x4b\xfe\xb7\xa2\x6b\xb4\xac\xb8\x82\xd2\x3e\x4f\x9f\xb1\x12\x7b\x0a\x25\xa2\x2e\x88\x83\x3b\x50\xf3\x4c\x9a\xed\xde\xd1\x46\x83\x1c\xf6\xd5\x58\x0c\xe9\x24\xb5\x21\xb7\xd2\x56\x42\x99\xe8\x97\x36\xd7\xf8\xfc\x6a\xb9\x95\x99\x10\x75\x41\x1c\xdc\x01\x1f\xd1\xd8\xf2\x26\x85\x0f\x12\x6b\xa4\xd3\xdf\xb6\xb3\x2b\xb9\x6e\x35\x79\x6a\x73\xc4\x5d\x4a\x09\x2f\x38\x33\x2b\xdf\x68\xca\x04\xdd\x03\x05\xe0\xa0\x7e\x00\x90\xbf\x80\xd6\xee\x27\xe7\x2f\xc7\xbd\x61\x5e\xca\x07\x2a\x6b\xb2\x4a\xcb\xa4\x57\x79\xd9\xba\x71\xfa\x19\xf3\xd3\xbe\x08\xa4\x29\xab\xfd\xcc\x48\xbc\xf7\x0e\x17\x91\x65\x80\x38\xe4\xfc\x45\xe8\xe6\xcc\xc7\xc6\xb2\xea\x99\xa5\xa8\xf3\x6c\xe7\xb2\x2e\x7e\xbd\x8a\x4f\xf0\x7b\x29\x72\xb9\x94\xa0\xe8\x02\x5d\x83\x50\x14\x1b\xa2\x32\x88\x43\xce\x5f\x34\x2d\xc7\x7c\x3d\x67\xbe\x08\xad\xac\x57\xae\xeb\xf7\x14\xd1\xcc\x5b\x95\x8d\xab\x49\x86\x04\xc5\x3e\x93\x49\x2f\xfe\x35\x63\x83\xa8\x0c\xe2\xfc\x64\x51\x50\xfe\x99\x99\x35\x74\xce\xbd\x0f\x3c\x7e\x69\xac\x6e\xbd\xdd\x3b\x3d\x24\x83\xd1\xfb\x89\x7b\xd8\x5b\x35\x32\x37\x40\xab\x52\x44\x7b\x25\xad\x1d\xca\x5f\x40\x1f\x02\xfc\x33\x7f\xe9\xac\xdd\xcc\xc3\x4e\x3b\x6b\xda\xf0\xdb\xf8\x1c\xc3\x93\x1f\xad\x73\xef\x2c\x03\xb5\xd7\x46\x9f\xb2\x18\x97\x53\x0c\x86\x19\xfc\x79\x1a\xe3\x59\x2c\xa5\x83\xb5\x1f\x37\x1e\xaa\x3a\x5f\xc8\xd7\x2d\xf2\x5b\x23\xe5\xbe\x59\xef\x04\x7e\x30\x28\x30\xe4\xdd\x39\x77\xeb\x52\xf2\x7f\x5b\xfe\x02\x6a\xda\x9f\xf7\xbf\xc0\xf3\x97\xb0\x36\x15\x2f\xb1\x07\xb5\xe4\xb2\xd7\x6c\xbe\x76\xc7\x8d\x98\x36\xc9\x06\x1a\x71\xea\x3c\xa2\xba\x7c\xe3\x58\x84\x7e\xf8\xd9\xeb\xd3\xc8\x5f\x50\x54\xe1\x6b\x74\x75\x37\xf2\xcf\x58\x9f\xae\xff\x2a\x25\x49\xf1\xd6\xce\xda\xb5\x6d\x72\xef\x09\xbd\x44\xc3\x72\x37\xd8\xa5\x59\xbb\x5f\x1d\x7d\xf1\x54\xb6\x66\x20\xe7\x2f\x4c\x49\xeb\xd7\x3a\xfd\xda\xba\x55\x4b\x8d\xb3\x7f\x38\x2d\x85\x0d\xc5\xf9\x39\x31\x78\x55\xdf\x78\xf4\x89\x3b\x5d\x6b\x8c\xd9\xfb\x54\x36\xa2\xdc\x42\xfa\xb3\x98\x0e\xfe\xf7\xbb\x72\x78\x2e\xed\x9d\x41\x4b\xc2\xff\xdc\xa7\xbd\xae\x13\x7e\xc0\xc0\xac\xb9\x68\xc6\x45\x6d\xa9\x94\x1a\x72\x2a\xe7\x8f\xbc\x91\xf3\x17\xec\xdd\xd7\x0c\x56\x38\xfb\xfd\x18\x24\x67\x5f\x24\xd9\x75\xfc\xb6\xf7\x6a\xed\x73\xb5\x12\x40\xd9\xf8\x29\x67\x6b\xed\x64\xe6\x73\x2a\xad\x75\x43\xfa\xb3\x1d\x2f\x1e\x6b\x2c\x24\xfb\x07\x32\x0d\xcb\x91\x63\x6e\xaf\x70\xe1\x5e\xae\xba\xa4\x3b\x4a\x97\x46\x18\xbe\xd6\x2f\x37\x6f\xc2\x74\x6a\xf9\x0b\x48\xdd\x93\x86\x5b\xe3\x55\x06\x6b\x5e\x6f\x37\x63\x0c\xd7\x5f\x25\xf3\xb1\x71\xbd\xa1\x61\x59\x62\x55\x3e\xb9\x3c\xb1\x28\x5c\xdb\x75\x77\x7f\x40\xc7\xe8\x41\x1c\x7c\xb8\x2d\x70\xc4\xf8\x6c\xbe\x41\x85\xdb\x1c\x12\x12\x79\x65\x20\xeb\x9d\x00\x4b\x3e\xe6\xeb\x2a\x22\xa7\xb1\x11\xe6\x40\xa9\x77\x1c\x1f\x10\x75\x41\x1c\x7c\xb8\x95\x3e\x96\x76\x8b\x12\xda\xb1\x58\x99\xaf\x58\x5c\xef\x77\xef\xdc\x7e\x45\x1a\x15\x64\x85\xce\x8a\x61\x58\x44\x29\x17\xdd\xf6\x0e\x3a\x9a\x0d\xe0\xe0\xc3\xed\xef\x6a\xce\xfb\x4a\x5d\x1c\x4b\x75\x5c\xbd\x91\x4f\x4a\x3c\x59\x88\xb5\x42\x0f\xaa\xd2\x3d\x9d\x2e\x18\x31\xe0\xad\x8d\x13\xbd\x82\xb6\x48\x03\x38\x3f\x69\x14\x9c\x7f\x6c\x8f\xd5\x21\x7a\xa4\xa7\xd4\x50\x8f\xa1\x3f\x58\x45\xd2\x38\x7e\x9d\xfe\xc8\x36\x65\x76\x88\x33\xa8\xf6\xc0\x59\xe8\x0c\x4d\xf0\x20\x22\x7f\x01\x71\xd0\xfd\x2f\x7f\xcd\x5f\x40\xdd\xc8\x49\x06\x14\x7c\xad\x56\xb2\x35\xf1\xf9\x30\x15\x14\x7e\x43\xf9\x87\x46\x3d\xaa\xe7\xb4\x6d\x7a\xa3\x34\x65\x65\xf0\x84\x95\x09\x8f\x2b\xb4\xf9\x01\xc4\xc1\x0d\x88\xf0\x8a\xf3\x25\xe0\x2d\xc6\x5c\x24\xb6\xa1\x5a\xa4\xa5\xd2\x76\x09\x67\xe5\x2c\xf1\xc1\x24\x71\xb0\x8f\x2f\xd3\xbb\xfb\x39\x06\x51\x17\xc4\x21\x25\x70\x9c\xe1\x49\xe8\xb2\x9f\x13\xa2\x35\x14\xbd\x3c\xde\x9e\x21\x0d\x19\x8d\xc9\xb9\x82\xf5\xd6\xed\x72\x75\xdc\xa5\x8c\x7a\x69\xe8\x03\x25\x20\x0e\x6e\x00\xea\xba\xf1\xe3\x38\x5d\x3f\x3e\xac\xfa\x11\xf6\x3e\xaf\xa9\x87\x17\x89\xb5\x63\x94\x0b\xad\x82\x51\x49\xec\xea\x1c\xed\x6b\xac\x11\x75\x41\x1c\xdc\x80\x8f\x4b\x65\xf1\x92\x93\xb9\xdf\xe6\xa8\xb5\x06\x12\x4b\x32\xaf\xe3\xd1\xec\x49\xd4\x0f\xd4\x76\xe5\x0a\x30\x63\x1b\xc7\xca\x5d\x46\xe4\x2f\x20\x0e\xba\xff\x45\xf5\xaf\x73\x6e\x50\x97\x7e\x92\x02\x2f\x03\x93\xe5\x4b\xe7\xbe\xd4\x3f\x1c\x0d\xe5\x9f\xb7\xb3\x66\x33\xb6\x6c\x70\x5b\x1a\xb4\xd8\x4a\xaf\x23\x1f\x1d\x8f\x32\x2a\x43\x34\x1d\xc4\xc1\x15\x18\xe4\x60\x6e\xbf\x1c\xdb\x69\x44\x4c\xbd\x64\x2b\x38\xbf\x18\x9d\x92\x91\x9c\xbe\xf5\x34\xf1\xc1\x5a\x1a\xa9\xfe\xc4\x3d\x55\xe8\x0e\x43\x10\x07\x57\x40\x2f\x60\xd2\x2e\xe4\xc7\x6b\xa6\x4d\xe6\x2a\x32\xd4\xb4\x90\x33\x0f\x2e\x5c\xbd\xd7\x62\xc7\xfa\x76\x43\xec\x32\xc5\xc7\xcd\xbb\xb6\x88\xba\x20\x0e\xae\xc0\xe7\xd2\x12\xe7\xd7\x38\x73\xa5\x9a\x6e\x12\x73\x66\x29\x8e\x7b\x68\x1f\x9e\x60\xc7\x33\x88\x29\xb6\xad\xea\x4d\x06\xdf\x0a\xe6\x43\xd4\x05\x71\x70\x05\x84\xac\x1b\x14\xda\x55\x71\xd8\x7a\xd9\xaa\xe5\xcb\xb2\x5a\xbe\xa6\x9d\x53\x6b\xdc\xc2\xbe\xd5\x20\x27\x96\x6d\x75\x2f\xb5\xdf\x05\x31\xe7\x06\x71\xd0\xbd\x0f\x80\xfc\x05\x34\xbe\x9e\xe4\x40\x9c\x8e\x4c\xc2\xf9\x00\xad\xeb\xaf\xcb\x49\xbf\xa4\x4c\x94\x17\x18\xe2\x63\xc8\xaa\x48\x06\x2f\x25\xf5\x8c\xa9\x58\x0f\x97\x42\x77\x99\x82\x38\xb8\x03\xe9\x51\x2d\x8e\x42\xe7\x55\x29\x89\xaf\x69\x9e\xc5\x36\xc8\xeb\xf9\x40\xcf\x94\x4f\x86\x75\xef\x56\xe2\x15\x77\xab\xe6\xad\x7c\x72\x44\x5d\x10\x07\x77\xa0\xf9\xf6\xf4\xfc\xb3\xfa\xb3\xb4\x01\x2f\xc8\xa4\x7e\x3c\x20\xa5\xf8\xcd\x7d\x9e\x3e\xbc\x1c\x05\xb5\x2e\xa1\xad\xef\x9e\xea\xb7\x09\x68\x8d\x0c\xe0\xe0\x0e\xcc\x3a\xc9\x9d\xa9\x28\x0b\xce\x29\x4e\x9e\x37\xdb\xd0\xbd\x7a\x2c\xa3\xf7\x78\x62\x18\xb3\x5a\x7a\x0a\x13\x9d\xe7\xd0\xf9\x0d\xf4\x9e\x1e\xc4\xc1\x1d\x78\xb3\x20\xbf\xf1\x41\xb3\x78\xc1\x20\x77\x6c\xdc\x5e\x3b\xdb\x54\x70\x28\x9d\xf6\x39\x5f\x93\x93\xec\xde\xca\x84\x92\x4e\xe9\x4d\x84\x03\x20\x0e\xba\xf7\xe1\xd6\xdf\x1d\x00\x4d\x76\x4e\x72\xc0\x85\x4a\xbf\xc6\xb4\xe7\xe6\xc8\x6a\x8d\x3c\x73\x74\x84\xa9\xfa\x39\x39\x1d\x31\xb5\x57\xe6\xd2\x57\x8e\xd4\xd4\x70\x1f\x73\x04\x22\xda\x0e\xe2\xe0\x0e\x68\x61\x72\xd1\xde\x7a\x74\xdc\x16\x4a\xe8\x1c\x93\xe3\x84\x15\xa4\x4c\x5e\xf3\xc6\xaa\xd0\xb6\x52\x20\x62\x4e\x1d\x85\x44\xe9\x33\xa2\x2e\x88\x83\x3b\x90\x16\x73\xd8\xa8\x10\x92\xb9\x2c\x13\xee\xdb\xa7\xd2\xcd\x70\xe6\x22\xde\xf6\x47\x5d\x85\x19\x94\x5a\x7c\x65\x6f\xd9\x2f\xcf\x1e\x22\xea\x82\x38\xb8\x03\x4b\xef\xb7\x77\x3a\x76\xb7\xc5\xaf\x7f\x29\xb7\xf9\xd6\x1d\x22\x51\xb0\x21\x16\xc5\x50\x77\x7e\xac\x35\xdd\xf2\x13\xba\x0e\x29\x74\x57\x09\x88\x83\x3b\x20\x5f\x88\x1a\x52\x5b\x3c\xe8\xd0\x6a\x41\x5d\x16\x59\x60\xaa\x19\xd4\x72\x45\x26\xc9\x62\x95\xef\x39\xa9\x20\xd1\xf4\xea\x1d\x66\xe8\xee\x0f\x00\x07\xf5\x03\x80\xfc\x05\x34\xf3\x3c\xc9\x81\xc6\xee\xa3\x6c\x0e\x63\x3f\x6c\xf9\x0a\xc6\x58\x89\x26\xe3\x18\xc1\x27\x7c\xbb\x25\xdc\x03\x34\x09\x03\xe6\x92\x92\x84\xa2\x50\xdb\x41\x1c\xdc\x81\x2e\x4e\x6d\xa5\x9a\xa2\x95\xd2\x3c\x95\x5a\x4d\x87\x08\xd4\xf6\x81\x8e\xe9\x36\xf6\x8c\xc2\xd1\x70\xf7\x0d\xe5\xce\x71\x5a\x3b\x44\x5d\x10\x87\xb4\x17\x72\x7b\x41\xea\x32\x03\xbb\x6c\xfd\x6f\x5f\xc6\xf7\xa8\xa8\x54\x16\xfa\x3f\xa5\x38\xaf\x9b\x95\x50\x53\x31\xe6\x35\xe4\xd1\x40\xe7\xa5\x40\x1c\xdc\x01\x82\x54\x65\x21\x1b\xe1\x71\x0b\x71\xa9\xa3\x0c\xd7\x86\xf4\xcb\xe6\x87\x29\xd1\x98\x86\x29\x9f\xfa\xee\x3f\xf0\xe2\x9f\xf3\x31\x86\xee\xf5\x05\x70\x70\x07\x8e\xe7\xb4\x52\xd3\xa2\xde\xa7\x14\xde\xaf\x69\x34\x6d\x4f\xaa\xaa\xb4\x7e\xe8\xe9\x6c\xfd\xd3\x69\xe1\x7a\xed\xb7\x2e\x5f\x3f\x11\x84\x03\x20\x0e\xea\x07\xdc\xfe\x9e\xbf\x80\xd6\xee\x27\xe7\x2f\xf2\x43\xed\x14\x17\x33\x63\xce\x5c\x4a\xfb\xdc\xcb\xe0\x7e\xc1\x2e\xfb\x51\x86\x85\xe1\x23\x43\x4d\x3d\x01\x03\xbb\x14\x9e\xfe\x7a\x44\x96\x01\xe2\x90\xf3\x97\xc4\x66\x81\xa7\x8f\xa4\x84\x58\xda\xf5\xf9\x76\xbc\x07\x6e\xaa\x1f\x14\x4b\x6c\xea\x26\x7a\x38\x96\x17\x4a\xcb\x6e\xf2\xda\x34\x23\x2a\x83\x38\xe4\xfc\x25\xe2\xcc\x68\x7e\xd4\xc1\xd9\x3d\xc7\x74\x3e\x8e\x21\xc5\x00\xa5\xaf\xa3\x3c\x44\xb3\x24\x34\x0b\xae\x4a\xd3\xbb\x32\x25\xa3\x93\x88\xca\x20\xce\x4f\x16\x05\x05\xf6\x3d\x34\xe1\xb8\x6c\x6f\xd1\xe7\x18\xe6\xbb\xd2\x44\xd9\x7d\xaa\x07\x63\xc3\x49\xcb\x1d\xc4\xf7\x46\xed\xcd\x9f\xbf\xfa\xbe\xed\x9b\x0f\xe5\x2f\xe6\xa6\x54\x4a\x9d\x9b\x6f\x45\x9e\xab\x48\xf2\xf8\x5d\x2f\x16\xd4\x37\x65\x1d\xe2\xfb\xfc\xf8\xf0\x8b\x9c\xfc\x87\x8d\xd7\xe8\xff\xd8\xff\x92\x77\x2c\x95\x7a\xac\x55\x4f\x1e\xa1\xd9\x12\x52\xa5\xf5\xd0\x94\x86\xb7\xc9\x66\xea\xc7\x5e\xf9\x76\x81\x2b\x5e\xcf\x80\x7c\xf0\x9f\x2b\x48\x5d\x8b\xf8\x7b\x52\x38\x4e\x22\x62\x91\x4b\x95\xe1\xa3\x8f\xf4\x2d\xe6\xb0\xa7\x3b\xe3\x9d\xa3\xab\xf6\xa8\xee\x0b\x15\xbe\xfb\x6f\xcb\x5f\x40\x4d\xfb\xf3\xfe\x17\x78\xfe\x92\xbf\x13\xde\x2f\x26\x35\xed\x56\x4e\x91\x86\x4f\x3d\xff\xc1\x77\x9d\x94\x67\x9b\xad\xf2\x89\x7b\x6a\xdc\xca\x97\x6a\x0c\xf4\xd3\xd8\x24\x21\x23\x89\x94\xbf\x50\xa7\xb6\x97\xa3\x08\x30\x73\xc5\x1c\x76\x8f\xba\x62\xdb\x8c\x3d\x2f\xb1\x5b\xe4\x60\x69\xf9\x4d\x63\x93\x63\x60\x5f\xd6\xc1\x7c\x2a\x5b\x33\x90\xf3\x17\x3a\xb3\x21\x4e\x8d\x4b\x41\x44\x32\xd4\xd5\x11\x29\xa6\x15\xd2\x91\xf2\x8b\xf6\xc3\xbe\x26\x6a\x74\xaa\x05\xd4\x5b\x4b\x21\x1d\xa7\xb2\x11\x05\x39\x7f\x89\x09\xe7\x8e\x47\x7d\x22\x32\xe5\xc3\xe8\xbb\x74\x46\x4d\x39\xe5\xb6\x5d\xc4\xbe\x4b\xd3\x85\x67\xd3\xca\x3d\xe2\x56\x5c\x69\x8f\x4f\xa5\xb5\xc8\xf9\x0b\x1f\x7e\xec\x32\x1f\xf6\x37\xb9\xd4\xe3\xb5\xd7\x74\x8e\xf8\x3c\x0c\xf7\x97\x69\x87\xe6\x0b\x6f\xc9\x29\x0d\xe2\xe6\xa1\xd4\xd1\x9c\x4a\x6b\x91\xf3\x97\xe7\xd5\x9d\x5a\xc5\xe7\x5b\x0b\xbf\x2c\x8c\xa5\x97\x9c\x13\x1e\x37\x1a\xff\xfd\x86\xbd\xe5\xe1\xfd\x80\x11\x3c\xb7\x4f\x96\xca\x4f\x4e\x2d\x7f\x01\xa9\x7b\xe2\x76\x53\x0c\x6e\x1a\xfd\x0f\x45\xdf\x5f\x30\xcb\x37\x19\x4d\xb5\x11\x49\x9d\xa3\x63\x2f\x56\x2f\x2a\x9b\x4d\x78\xfd\xc2\x95\x93\xc4\x11\xda\x6e\x0a\xe0\xe0\xc3\x6d\xf9\xaa\x55\x56\x33\xb3\x40\x70\x73\xe6\xef\xda\xad\xd8\xa0\x9d\xb2\xcd\xb7\xa5\x01\x24\xe2\xb8\xac\xe5\x71\xeb\x5c\xe9\x25\xd0\xa9\x16\x10\x87\xb4\xe5\xb8\x48\x5f\xf7\x55\xae\xb6\xcc\x6b\x7d\xab\xc6\x8d\x77\x17\x25\x2a\x63\x7d\x9d\x5f\x98\xb2\x6c\xde\x88\xf1\x12\xcc\x5a\x66\x8b\x87\xb6\x1c\x03\x38\xf8\x70\x4b\x4b\x93\xae\xb9\xfd\x43\xf0\xc9\x96\x70\xe4\xcc\x6c\x78\x7d\x13\x2e\xd1\x45\x8c\x31\xd9\xba\x51\xe7\xf9\xee\x0e\x74\x27\x29\x7c\x44\x5d\x10\xe7\x27\x8d\xe2\xfd\x67\x5d\x0e\x3c\x6c\xad\x6f\x4e\x42\xdf\x7e\xbf\xed\x3e\xb7\xc3\x7b\xd8\x69\xf4\x9d\xb0\x43\x45\xc3\xaf\x80\x57\x9a\x74\xc4\xcf\xbf\x3f\x1b\x91\xbf\x80\x38\xe8\xfe\x97\xbf\xe6\x2f\xa0\x6e\xe4\xc4\x8f\x8e\x06\xa5\xae\x31\x92\xcb\x86\x71\xbd\xab\xd4\x77\x7b\x60\xf0\x39\xda\x8e\xad\x4f\xe7\x88\xb0\x65\xeb\xa3\xb8\xf2\xbb\xfe\xc7\xa3\x88\x96\x83\x38\xb8\x01\x6d\x56\x9c\x42\x0e\x81\xdf\x36\xb5\xd3\x43\xb2\xa9\x78\x7b\xe5\x1c\xb1\x1f\x89\xd7\x25\x8e\xa1\xdb\x4f\x95\xb4\xea\x56\x93\x07\x21\xea\x82\x38\xa4\x17\xdf\xe2\x81\xe4\x04\x16\xdd\x61\x5d\xf4\xf7\xaa\xc7\x99\x96\x8e\xf3\x1b\x3e\x37\x2b\xce\xd1\x91\x6f\x57\x4e\x3e\xbd\x3b\xa1\x0d\x25\x86\x20\x0e\x6e\x80\xb7\x5e\xaf\x4a\xe2\x5b\xed\x5b\x35\x6e\xdf\x72\x2e\x4a\xa4\xfe\xfe\x64\x94\x11\x58\x61\xee\xf0\xf0\x58\x69\xa1\x9d\xa7\x3a\xb3\x17\xda\x07\x04\xe0\xe0\x06\xcc\x53\x31\xa5\xac\x17\xf3\x4d\x2c\x7a\x3b\xf5\xe7\xf9\xec\x28\xaa\x24\x2f\xe9\x29\xf0\xfe\xec\x9c\xf0\x21\xa7\x94\xc4\xcb\x16\x44\xe4\x2f\x20\x0e\xba\xff\xe5\xef\xf9\x0b\xa8\x4b\x3f\xf1\xfe\x5d\xd4\xf2\xaf\xc9\x24\x8c\x4a\x5a\xaa\x56\x28\x5e\xe6\x28\xd5\x1b\xc5\x6f\x5f\x2d\x1e\xc4\x3c\x0b\x60\x7e\x90\x6c\xb3\xc3\xd3\x02\xdd\xbf\x0b\xe0\xe0\x0a\xf8\x8e\x88\xe6\xdc\xc3\xad\x17\x5b\xe8\x94\xbf\xba\x72\x71\x69\x8f\xa6\xe0\x5d\xc6\x51\x70\x6f\x86\x1d\xea\xb8\x29\x6e\x10\x03\xf4\x7e\x1a\xc4\xc1\x15\x90\xb7\xcd\x7e\x20\x6a\xea\xe9\x93\xd9\xcd\xa1\xfe\xfe\xe2\x1e\xc7\xd0\x34\x45\xc3\x93\x2a\x6e\xc2\xc5\x4c\xb2\xb8\x30\xd6\xd0\x07\x88\xba\x20\x0e\xae\x40\xfb\x99\x9c\xd2\x1d\x0c\xaf\x56\x19\x67\x3f\xf4\xe2\x23\x3c\xf2\xeb\x4a\xdf\x56\x39\x36\xa5\xf2\x08\xb7\xae\x86\x5f\xea\xcd\x84\xbe\xa5\x01\xe2\xe0\x0a\x74\x46\x64\x7b\xb8\xfa\xdf\x72\xec\xf4\xf9\x70\xf9\x68\xe8\x0e\x6e\x39\xa6\xad\x6d\x5a\x35\x0a\x25\xf7\xa6\xb0\x8c\x27\x9b\x61\x12\x62\xce\x0d\xe2\xa0\x7b\x1f\x00\xf9\x0b\x68\x7c\x3d\xc9\x81\xb7\xd6\x81\xbc\xed\xd8\xe3\x6f\xbe\x7a\x4f\x08\x65\xbf\x34\xb0\xfa\x58\x4c\x20\xa5\x3b\xa5\x44\x12\x68\x7b\x7f\x6f\x81\x67\xec\x27\xa2\xed\x20\x0e\xee\x40\x27\x13\x49\x19\xcf\x33\xd7\x33\xd6\x09\x3b\x33\x3c\xd7\x30\x9e\x9f\x9b\x2e\xd3\x66\xef\x7e\x1c\xdb\x1e\x3f\x6e\x89\xf3\xde\x59\x0a\xba\xb0\x0b\xc0\xc1\x1d\x10\x12\x35\x7c\xfc\xd9\x18\x7d\x77\x6a\xd2\x74\xd3\x31\x78\x02\xab\x80\xdd\x6e\xe4\xb8\xfc\x00\x9d\xf9\x23\x7e\x9b\x9a\x67\x44\x1c\xa2\x2e\x88\x83\x3b\x90\x2c\xbc\xe6\xb2\xae\x6a\x50\x28\xf6\x42\x4d\x47\xe9\xdd\xce\x61\x6e\x14\x06\x7e\x9e\x09\xb5\x76\x15\x56\xbf\x1f\x8a\x67\x24\x74\x9f\x27\x88\x83\x3b\x50\x54\xd7\x70\x5c\xa1\xe7\x25\x15\x1d\xee\xe3\xe1\xdd\xb8\x67\x55\x95\x3d\xda\x77\xb8\x8b\xfe\x03\xfb\x99\x3b\xa9\xfb\xda\xfe\x2e\xc2\x01\x10\x07\xdd\xfb\x00\xc8\x5f\x40\x93\x9d\x93\x1c\x78\xb6\xb1\x5f\x26\xa9\x61\x77\xbf\xac\x91\x8f\xd0\xfb\xa8\x7f\xf5\xf6\xa3\xd7\xd3\xd7\x3e\x4d\x5b\x45\x4c\xb8\x19\xe7\x71\xfc\xef\xf7\x9c\x41\x1c\xdc\x81\x84\x72\x9d\xe2\xb7\x0a\x3a\x12\xe3\xdf\x08\xf6\x28\x5a\x28\xdf\x4a\x15\xa4\x58\x72\x1a\xcd\x08\x54\x47\x06\xcb\x45\x88\x70\x64\x23\xea\x82\x38\xb8\x03\x37\x58\xb6\xce\x45\xcd\xae\x84\xf1\xca\x8b\x76\xc7\xf5\x1e\x31\x93\xd4\x1a\x15\x08\x97\x8e\x69\xbf\x17\xbd\xa9\xf7\xcc\x48\x95\x0b\xba\x2f\x18\xc0\xc1\x1d\x50\x32\xd1\x31\x55\x1f\xb0\xb3\x36\x5d\x5a\x8b\x5a\x79\x9f\x77\x6c\xa0\x71\xc8\xd6\x53\x26\x3c\xaf\xde\x15\xb3\xb6\x41\x9f\x01\x5d\x31\x06\xe2\xe0\x0e\x84\x69\xe6\x73\x76\x16\x88\x0b\x79\x4b\x5c\xf3\x9b\xc2\x7b\xcd\xf7\x2c\x75\x78\x3d\x84\x4e\x1d\x97\xb5\x27\x2f\x95\x3c\x5a\x72\x1f\xe1\x00\x88\x83\xfa\x01\x40\xfe\x02\x9a\x79\x9e\xe4\xc0\x90\xbe\xac\xa7\xd7\xe6\xa4\xee\x43\xd4\x88\xd6\xdf\x6d\xd1\x13\x34\x6b\x93\x3f\x78\xb5\x30\xa2\x27\x2e\xbf\xbe\xe5\x69\x25\x02\xfd\xa6\x20\x0e\xe9\x38\x32\xb5\x06\xdd\xe1\x7a\x62\x84\x62\x6e\xa0\x89\x8e\x25\x73\x91\x53\x5e\x97\x03\x29\x56\x69\x5a\x98\x6a\x8a\xbc\xc7\x2f\xf6\x15\xe8\x38\x32\x80\x83\x3b\x10\x4d\x1a\x9f\x86\xc9\x6e\xe8\x2c\x21\xbf\x26\xbf\x62\x98\x5b\xbd\xab\xed\xd4\xb7\xbd\x23\x8b\x32\x94\xa8\xe0\x5d\xa1\x32\x08\x5d\xf3\x0f\xe2\xe0\x0e\x0c\x5d\x90\x39\x90\xcb\x39\x8f\x97\x23\x72\x66\xe6\xeb\x1e\x19\x6b\x52\xdc\x5a\x67\xf7\x2f\xda\xc4\x4f\x94\x93\xd6\x4a\xab\x0f\x30\xa0\xdf\x01\xc0\x21\xf5\x03\xfe\x33\x54\xa5\x58\xa5\x3a\x38\x66\x62\x87\x8b\x16\x57\x46\x89\x83\x7c\x87\x31\x95\xec\xab\x3b\x8e\x9a\x1c\x18\x32\xc6\x15\xa0\x7e\x00\xc0\x41\xfd\x00\x20\x7f\x01\xad\xdd\x4f\xce\x5f\xbe\x16\x7d\xbc\x88\xd6\xe3\x26\xce\xe6\x8b\x12\x3f\x3d\x9d\xc6\xe8\x57\x56\x2a\x46\xd9\xd6\x75\x8b\x82\xc8\xfa\x8d\x0a\x26\xf3\x1a\x22\xcb\x00\x71\xc8\xf9\x8b\x76\x90\xe0\xd7\x62\x8c\xf6\xd8\xe8\xdb\xbf\x3d\x8e\xfc\x0a\x2c\xf4\x6e\xca\x0f\x58\xab\x12\x47\xe4\xb7\x04\x7f\xbd\x8d\xf2\x9b\x1d\x51\x19\xc4\x21\xe7\x2f\x0e\xbb\x4a\xae\x6b\xf4\x82\xa8\xa4\xf1\xd9\x5d\xcb\x75\x9f\xae\x5e\x4b\x2d\x5a\xb0\xe0\xa7\xbf\xec\xb3\xad\xd8\xdd\x46\x91\x80\x8e\xa8\x0c\xe2\xfc\x64\x51\x50\xfe\xe9\xee\x0c\x6e\xc7\x15\xf9\xcf\x7e\x73\x3b\x47\xb8\x04\x77\xc4\xee\x92\xbb\x55\x8e\x4d\xb5\x7d\xb2\xb5\xee\xeb\xb8\xc2\x59\xcf\xf1\xa8\x14\xca\x5f\xc6\xe7\xe7\xa9\x19\x6b\xca\x3c\x30\x06\xaf\x35\xf3\x62\xeb\xd1\x7b\x1c\x5f\x40\x49\x9a\x8d\xc2\xda\xf2\x66\xd9\x93\xcf\xaa\xf9\x47\xfe\x72\x4d\xfa\x05\xae\x26\x39\x55\x28\xc3\xf7\x39\xd2\x5a\x39\x8c\xca\x2f\x15\x75\xfb\xab\x25\xf5\x03\x3d\x37\xda\xed\xef\xc8\x58\x12\xff\x81\x62\x39\x17\x30\x1e\x8b\x75\xc6\x9f\xb3\x4b\xf5\x51\xb0\x15\xaf\xd5\xd9\x0c\xeb\x4d\x1e\x77\xb3\xb6\xe5\x1e\x15\x72\xa0\xf1\xe4\xfa\x6f\xc9\x5f\x76\x31\xff\xb3\xa6\xfd\x6f\xfe\x22\x83\x22\x0d\x5f\x2e\xa7\xe0\xfe\x36\x66\x68\x9a\xbf\x4e\x78\xb5\xa0\xd7\xab\xea\x52\xf8\xb0\x56\x6b\x26\xd1\xfd\xa7\x28\xb9\x0e\x93\x63\xf7\x97\xa4\x12\x4e\x23\x80\xf1\x46\x0a\x60\x8e\x6d\xb2\x65\x66\x29\xa8\xaf\xe1\xb0\xe3\x2e\x25\x9e\xab\x5e\x0a\xce\x61\xdc\x22\xf2\x56\x61\x11\xa5\xd1\x77\x4e\x6a\x0c\x3e\x7b\x2a\x7b\x33\x84\x90\xb2\x81\x7d\xfc\xdc\xc0\x74\x42\xe6\xd8\xcf\xb1\xc5\xa6\x95\xb7\xce\x7d\xa1\x09\xa9\xaa\xba\xd8\x1c\xc7\x6d\x1a\x71\x7e\x5e\x27\x7d\x91\xf2\x54\x76\xa2\x20\x07\x30\x54\xa4\x94\xe6\x11\x63\x33\x25\x6b\xee\x05\x8a\x34\x98\x3e\xae\x18\xc9\xac\x23\xae\xb2\xa2\x1e\x77\x18\xaa\xdd\x57\xa4\x73\xed\x4f\xa5\xb5\xf6\x48\x7f\xf6\xfe\xe3\x4b\xfc\x9d\x16\xad\xb8\xb1\x11\x4b\x2b\xc5\x65\xb4\x74\xe2\x6a\x6b\x6a\x8f\xcf\xcf\x08\x58\x53\xee\xb6\x12\x2c\xa0\x65\x9d\x4a\x6b\x91\x03\x98\x9e\xce\x39\xf2\xf6\x65\xe3\x6a\xec\x1e\x6d\x73\x27\x6f\x76\xab\x36\x4d\xf7\x74\xac\x28\xc5\x86\x1d\xd1\xa5\xc7\xb3\xe3\xf3\xbf\x4e\x2d\x80\x01\xa9\x7b\xd2\x78\xcb\xc4\x99\xdf\xd5\xaf\x3e\x79\xdd\xf6\x42\xeb\xa7\xfa\xf3\x78\x0f\x89\x88\x7f\x89\xc7\xf4\x7f\x43\x45\xa5\x1e\xd1\xf4\x7a\x4d\x0f\xed\xe3\x06\x71\x48\xdf\x3e\xc1\x3b\x3b\x2b\x1b\x72\xc1\x90\xf8\x0a\x96\xff\x79\xc1\xd9\xf1\xd6\x07\x61\x01\x76\x79\x14\x98\x97\x65\x4a\x86\x8e\x63\x36\x7f\x20\xea\x82\x38\xf8\x78\xfb\xaa\x39\xab\xb4\x3b\x9c\x1d\x23\xd2\x5e\x16\x73\x39\xb8\xa8\x32\x29\x55\xe7\xf3\xf9\xf4\xf5\xfd\x71\xcc\xdf\x47\x15\x59\xdd\xd0\xb6\x0a\x10\x07\x7f\x5e\x05\xb4\xcb\x1e\x0b\x25\xb9\x58\xf6\x09\x1a\xad\x66\xcc\x55\x95\x33\xbf\xf2\xcc\x26\x26\xa6\xb7\x26\x45\xf0\x68\x63\xf3\x79\xa0\x77\xea\x20\xce\x4f\x1a\xe7\x9f\x77\x77\x35\xcd\x0d\x97\xc9\x55\xdd\xea\xbe\x30\x1f\xb1\xb6\xf6\x9a\x31\x2c\xfe\x87\x86\xec\xba\x26\xcd\x4a\x42\x9e\xce\xa4\xd5\x56\x03\x62\xf9\x0d\xe2\x10\xd7\x7f\xfc\xab\xc3\xfa\xcb\x94\x0b\xd4\x8f\x9c\xa4\xc0\x40\x88\x37\x8f\xed\xc1\x65\x41\x9f\xd2\x29\x63\xa3\xa4\x0b\x87\x2e\x15\xe8\xf7\xf1\x5d\x47\x1d\x98\x33\x8b\xcc\xe3\xa4\x32\x21\x05\x40\x1c\xfc\x27\xb5\x2d\x8f\x34\x14\xa3\xf0\x6c\xac\x4f\x5c\x4a\x46\xb1\xaa\xaa\x0b\xcd\xb1\x9b\x52\x2c\xd2\xce\x59\xb3\xbf\x19\x15\x6b\x7a\x5e\x1f\xba\xa2\x01\xc0\x21\xdd\xc0\x5b\x48\xc0\xf6\xfc\x75\xb3\x22\x37\x6d\xfd\xf4\xfd\x16\xf3\x7a\xfe\x19\xfb\xac\x38\x75\x81\x95\x06\x5a\xff\x07\xa1\x17\x99\xc3\xa1\x1b\x78\x01\x1c\xd2\x35\x05\x3f\xf1\x45\x06\xa6\xe2\xfb\x86\x8e\x5b\xcf\x24\xb5\xd1\x7b\xaa\xe1\x45\xc4\x3f\x1a\xd1\x30\xc7\x34\x95\x2c\xa7\xfd\xe6\x00\xed\xac\x01\x71\x70\x05\x32\xb8\x37\x23\x29\x32\x5f\x7a\x3b\x58\x9d\x37\x0b\xba\x9b\xb5\x73\x77\xf1\x8e\xfd\xf0\x19\x96\x85\x47\x4a\xd8\xf8\xc1\xe8\xfa\xf8\x08\x05\x40\x1c\x74\x03\xcc\xdf\x13\x18\x50\x9f\x7e\x92\x02\xd4\x42\x04\x7a\xd5\x61\x83\x7c\xb7\xb7\x9e\xa4\x3c\x3a\xde\x60\x76\xd3\xb3\x25\xb7\x18\x9a\x0b\xaf\xd5\x59\xce\x6f\x7f\xf1\x06\xfa\x3a\x28\x88\x83\xff\xa4\xb4\xdc\xea\xbf\x66\x2a\x66\xcd\x54\xdd\x2c\x1c\xfa\x1b\x1d\x3b\x17\x1e\x52\x3f\x2c\x7b\xa3\x3d\x13\xb8\xe2\xcc\x5a\x29\x90\x09\xed\xac\x01\x71\x70\x05\x70\x6c\x2b\x36\x8b\xbb\x36\x6f\xde\x93\x3e\xcf\x7f\xeb\x5e\xd9\xdc\x65\xf3\xf5\x9e\xe2\x31\xad\x72\x35\xbc\x27\x7a\x98\xf9\x7a\xd0\xa1\x39\x10\x07\x7f\x5e\xbc\x67\xcf\x9e\xbf\x99\x17\x72\x17\x9d\xb7\x70\xeb\xcb\x0b\xfa\x5d\x15\xf1\x49\x4c\xb0\xa3\xbf\x04\xef\x7e\x4a\x30\x7a\x79\x93\x0d\xa2\x2e\x88\x83\x2b\xd0\x20\x68\x16\x6a\xb2\x9a\xc8\xbb\x6d\xee\xd1\x44\xb1\xc0\xc4\xbb\xda\x96\xfe\xad\xe3\xf9\x52\x8d\x65\xa9\xa6\x1f\x0e\x19\x46\x2e\x62\xd6\x0d\xe2\xa0\x9b\x1f\x84\xfe\xbe\xf2\x02\x0d\xb0\x27\x39\x40\x5f\x32\x19\x1a\xea\x40\x18\x55\xfb\x59\x7e\x6e\x91\xdc\xe3\x42\xb7\x22\xe9\x9b\xa7\x4d\x9a\xae\xc9\x91\xcb\x5a\x62\x95\x31\xd0\x6e\x25\x10\x87\xf4\xe6\x7b\xe5\x31\x4b\x86\xa5\xbf\x77\x8f\x89\xfb\x77\x1f\xf9\x79\x05\xd7\xf9\xe6\x05\xf3\x34\xe6\xb0\x57\xca\xd1\xcf\x72\x94\x15\x98\xa1\x37\xdf\x00\x0e\xee\xc0\x9c\x4c\x2d\x3b\x5d\x03\x7d\xc7\x36\x0e\x6f\xee\x6f\x9b\x98\xc2\xfc\x91\x3a\x31\x41\x4f\xb6\xe5\x8f\x57\x4c\x4a\x88\xe4\xfa\x36\xa0\x13\x0d\x00\x0e\xfe\xbc\xe4\x2f\xcf\xce\x29\x50\x5a\xf6\xb1\x5d\x42\xef\x1d\xd2\x08\x75\x9f\xf4\x61\xf3\xe3\x98\xab\xcb\x0b\xa3\x26\x53\x33\xe7\xd8\xee\x47\xd4\x05\x71\x70\x07\x5c\x6b\x30\x2a\x28\xef\xa5\x3c\xd4\xf6\x5f\x67\xe9\xbb\xcf\xfd\x5b\x91\xca\x8d\x35\x2a\xa6\x53\x5a\x56\xca\x36\x2e\xbb\xdc\x83\x0f\xe1\x00\x88\x83\x6e\x7e\x00\x24\x30\xa0\xd9\xce\x49\x0e\xb4\x10\xc7\x78\xbc\xbe\x49\xed\x6a\x60\x3c\x20\xaa\x6b\x71\xd3\xa7\x5d\xd4\x21\x17\x87\xe9\x1a\x3b\xe3\xc4\x1a\xa5\x5b\x1d\x2a\x74\x52\x08\xc4\xc1\x7f\x53\x07\xaa\x84\xd6\xbb\xe7\x0f\x72\x48\xc2\xe6\xcd\x76\x6a\x5a\xd1\xb9\x7e\x5e\x6d\x8f\x7a\x50\x7a\x74\xe3\x69\xd5\x20\xed\x95\x39\x6f\x44\x5d\x10\x07\x77\x60\xe9\x9e\xc0\xbd\x17\xa5\x0e\x78\xb9\xd2\xf8\xa4\x0c\x36\xd3\x4f\xe6\xdc\xfd\xb2\x89\xf6\xd5\x6d\x30\x39\xf3\x7b\xb3\xc2\x96\xa1\x59\x06\x88\x83\x3f\x6f\x8d\xdc\x9e\x21\xd3\x6d\xe7\xca\x0b\x06\xc7\x6e\xfb\x8a\x09\x56\xda\x97\x8b\x73\xde\x33\xf4\xdf\x60\xd8\xb4\xc6\x69\xd6\xa8\x10\x86\x4e\x9f\x00\x38\xb8\x03\x39\x25\xdd\x67\xb0\x42\x7a\xdd\x19\x03\x44\xd8\x46\xac\xd0\xfc\xa8\xcb\xed\x73\xd0\xdf\x67\x15\xc8\x1f\xb5\x69\xa7\xa6\x7f\xf8\x88\x70\x00\xc4\x41\xfd\x80\xfd\xdf\x1d\x00\x4d\x3d\x4f\x72\x40\xa7\x38\x46\x08\xbb\xb6\x26\x52\x63\x6a\xf2\x45\x36\x53\x28\xdd\xd5\x40\xdb\x9e\x0a\x4a\xa1\xbe\xfb\xe7\xed\x7a\x32\xd2\xf0\xa0\x24\x16\xc4\xc1\x7f\x53\xaf\x0c\x47\x2b\xae\x80\x73\xf1\x0c\x18\x24\x99\xbc\x86\x8e\xb8\x37\xdf\x55\xb4\xde\x9e\xa0\xa6\xc4\x13\x22\x41\xe9\x7e\x54\x32\x86\xa8\x0b\xe2\xe0\x0e\x6c\xdd\x8c\x34\x32\x68\x63\x78\xc2\xa7\xce\xd3\x5d\x60\xfe\xe0\xee\xab\xf1\xfb\x3f\x5c\xbc\xc6\xde\x89\x19\x47\x6e\xdf\x2a\xa4\x80\x4e\x8b\x81\x38\xf8\xf3\x3a\xde\x23\x12\x4e\x22\x62\x3f\xa2\xb0\xdc\x5b\xd9\x5d\xd7\x3e\x62\xf5\x6d\x99\xb0\x4b\xef\xd3\xc4\xe1\x98\xa7\x3a\x70\x4f\x7d\x8f\xa8\x0b\xe2\xe0\x0e\xc8\x59\xa2\x14\x0e\x8d\x0d\x1f\x7b\x0d\x96\x38\xf8\xb5\x0f\x72\x3a\x6a\x51\x5d\xab\xd7\xeb\x39\xbf\x50\xd6\xa1\x76\xb3\x7f\xda\x1e\xe1\x00\x88\x83\xfa\x01\x40\x02\x03\x5a\xbd\x9f\x9c\xc0\xbc\x58\x8a\xa9\x12\xe3\xea\xd9\xbd\x3e\xc1\x66\x9d\xbf\xec\xab\xaf\xb9\xcf\xec\x6c\x28\x34\xb7\xed\x6f\x7a\xaf\x8f\xa5\xfc\x7c\x09\x22\xcd\x00\x71\xc8\x09\x4c\x3b\xde\x2c\xee\x97\x47\xb2\x0a\xf9\x16\x05\xc2\x67\xb0\x75\x18\xd2\xe4\xd0\xfb\xad\xd5\x8e\x34\x2f\x17\xe1\x6d\x62\x28\x38\x40\xdf\x89\x06\x71\xc8\x09\x8c\x6a\x89\x84\x56\x29\x5b\x78\x14\x66\xf8\xe0\xe8\x05\x73\xaf\x09\xcc\x7d\xc6\xeb\xbe\x12\x81\x02\x99\xdd\xef\x1e\x29\x3d\xb8\x8a\x87\xa8\x0c\xe2\xfc\x64\x51\x50\xfe\xf9\xd5\xf0\x9f\x37\x32\xae\x3a\x69\xf4\xf6\xea\x0e\xc9\xec\xa3\x1d\xdd\x77\x46\xbf\x37\x61\xfb\xd1\x65\xa5\x3d\xec\xc1\x70\x93\xfd\xfe\x84\x34\x94\xc0\x98\x56\x8f\x5b\xdc\xf1\x9f\x65\x45\xb3\xd5\x51\x4b\x50\x18\xc3\xf1\x97\xf5\x1c\x10\x9c\xae\x9b\x18\x16\xed\x2f\xb4\xaf\xbd\xf4\xfc\xcf\x04\xe6\x96\x95\x43\x8d\xfd\x84\x13\xa6\x2d\xde\x74\x47\xa6\xd1\xc5\xd0\xf4\x6c\x5f\xeb\xc6\x23\xaf\xdf\x29\x28\x91\x31\x43\x41\x22\x7f\x5e\x4c\x31\xfb\x4b\xea\x55\x83\x25\x93\x76\xb3\x55\x69\xfc\xae\xbe\x6b\xec\x6f\xc9\xb7\xb9\x81\xf9\xb2\x7b\x87\xaa\x56\x81\x86\x1e\x98\xe2\xff\x6d\x09\x0c\xa8\x69\x7f\x24\x30\x92\x48\x09\x4c\xf3\xcb\xb8\xaa\x56\xfc\x1d\xc2\xf2\x44\x5e\x86\x4d\x94\x56\x2c\xa3\x5e\x2f\xfc\x7d\x54\xb7\xeb\x3d\x47\xaa\x73\x6c\x58\x9a\xaa\xa7\x91\xc0\x34\x20\x25\x30\x68\x6a\x37\x06\xcb\x75\xf0\x35\xfd\x26\xeb\xe7\xf7\xaa\x29\x92\x58\xe2\x96\xf7\xf2\x84\x3a\xc5\x48\xa3\x95\xb2\xf7\x17\x8b\xe4\x4e\x65\x77\x06\x72\x02\x93\x19\xb5\x70\x66\x75\xf0\xac\x81\xaf\x27\xe6\x97\x77\x79\x51\x64\xdd\x39\x5f\x1a\x73\xed\x1b\x46\xd1\xcf\xaa\x85\xdd\x9b\x79\x12\x78\x2a\x7b\x51\x90\x13\x18\xfb\x88\x43\x7b\xb6\xc9\xfa\xb7\xf2\xe9\xf5\x72\xed\xe8\x95\x8f\x72\x1b\xcd\x5a\x86\x9f\x35\x6c\x72\xc6\xbc\x73\x3a\x48\xd0\xae\x3b\x95\xd6\x22\x27\x30\x51\xa9\xed\x69\x52\x5e\xd2\xd7\x0f\x0c\x04\xed\xad\xcf\x10\xc9\x5f\x09\x13\x95\x1b\x25\x6b\x28\x44\x35\xba\xe4\x90\x79\x57\x67\xe0\x54\x5a\x8b\x9c\xc0\x04\x30\xb6\x96\x87\x97\xd0\x5d\x90\x3b\xfb\xf8\xc7\x5b\xee\xec\xb1\x76\x81\x16\xdb\xbc\x72\xa1\xd4\xba\xcf\x6d\x25\xb8\x49\x4f\x4f\x21\xf8\x31\xf8\xcf\xd4\x3d\x69\xbc\x65\x4c\xae\xa7\x65\x4c\x12\x78\x68\xbd\x37\x25\x71\xb0\x49\xb1\x18\xfc\x83\x37\xb3\xce\x48\x39\x6c\x4c\x3f\x0e\x27\x46\xeb\x49\x13\x62\x9c\x01\x71\x48\x73\x98\x5a\x5a\x0c\x0d\x21\x6f\x19\x4d\xd9\xbd\x6c\x41\x13\xee\x36\xd1\xe7\xc3\x06\xb2\xbf\x22\xea\x95\x54\xf6\xd1\x5e\x6b\x62\x0d\x42\x73\x18\x00\x07\x1f\x6f\x29\xab\xcf\xb9\xfd\xd2\x08\xf2\x1c\x7b\xf5\xe3\xa6\xbf\x74\xe6\x44\x86\xbb\xfb\x54\xf9\x9b\xfc\x92\x2b\x23\xcb\xc6\x19\x2b\x8b\xd0\x09\x7d\x10\x07\x7f\xde\x46\xb6\x4a\xd1\x86\x9a\x90\x97\x61\x69\x46\x3c\xb9\x64\xac\x94\x01\xc1\xcd\xf2\x81\x1a\x29\x9b\xb4\x1d\x22\xf4\xe7\xdd\x24\xa4\xa1\x9d\xb7\x00\x0e\xe9\x53\xdc\xc5\xf5\x17\xe7\x95\xd7\x5c\x09\x82\xf4\xb0\x3a\x16\x1b\x8e\x97\x59\x3e\x69\xac\x45\x5b\xa2\xe6\xb3\xbf\xca\xaf\x27\x92\x0b\x41\x2c\xbf\x41\x1c\xe2\x02\x10\xc9\xbf\x27\x30\xa0\x7e\xe4\xc4\x3b\x78\x45\xe4\xbd\xde\x58\xe4\x70\xd0\x09\xf2\x1c\x63\x30\x8c\x26\x37\xa6\x6e\x8b\x7b\x85\x9f\xb9\xe2\xd2\xe3\xcc\xaf\x35\xfa\xc6\x17\x0a\x9f\x00\x1c\xbc\xe9\x0f\x29\x34\x35\x92\xc9\x2c\x9e\x5f\xe3\x1d\x6e\x94\x44\xc9\x45\x8d\xe8\xf8\xf9\x5a\xd0\x47\xae\xa3\xe4\xcd\xa0\xb0\xbf\x2e\xee\x79\x44\x5d\x10\x07\x57\xc0\x22\x42\x3e\xc9\x6e\xcb\x53\x46\x41\xbf\xbc\xf9\x71\x4a\x88\xed\xfa\xcf\x2c\xa2\x00\xa3\x2d\xe2\x2c\x1c\xd1\x55\xd5\x8f\x43\x74\x88\xba\x20\x0e\xfe\xbc\x4f\x2e\x5c\xda\xd9\xa1\xde\x0c\x76\xd4\x43\xb3\x21\x5e\x2f\x9d\x4c\x98\x77\x72\x9c\x3f\xd7\xc5\xd6\x33\x31\x2c\x6b\x43\xe6\x0a\x9d\x42\x03\x71\xf0\xba\x95\x9a\xf7\x94\x62\x83\x93\xcd\xb9\xb9\x6d\x65\x9f\x09\x3d\x27\xa2\x20\x63\xbe\xcb\x2b\xef\xa2\xf6\xe2\xec\xfe\xd3\x0b\xca\x8b\x44\x08\x05\x40\x1c\x74\x07\xcc\xdf\x13\x18\x50\x9f\x7e\x92\x02\x0f\x45\x79\xa7\x0e\x73\xae\xda\xcf\xa3\x6c\x37\xb2\x32\x9b\xa1\x5e\x95\x29\xb9\x7a\xad\x90\x8d\x5f\xcd\xe2\x8d\x2b\x89\xf5\x30\x74\xdf\x20\x88\x43\x5a\xcd\xfe\x20\x7b\x3a\x1d\x9a\x9a\x24\xe3\xf6\x9d\x69\x82\x40\x4c\x80\x6a\x25\x48\xff\xed\x67\x26\x73\xe9\x7e\xdd\xf0\x2b\x44\x92\x50\xa8\x05\xe2\x90\x8e\xa1\xe5\xcd\x51\x50\x07\x39\x5f\x93\x09\xf2\x58\xe6\xe6\x34\xbe\x61\x88\xed\x81\x7d\x69\x50\xc1\x98\xfa\x51\x86\x5f\xd4\xd3\xf2\x0a\xe8\x18\x1a\x80\x83\x3f\x6f\x91\xea\xb9\x33\x55\xc6\x5e\xb7\x9e\x18\x58\x25\xc6\xfe\x90\xb4\x5c\xb9\xfb\x90\xa9\xfd\x8a\x36\xdd\x05\xed\x8e\x70\x8d\xc4\x80\x60\x44\x5d\x10\x07\xaf\xab\x18\x98\x22\x65\xb1\x2c\xe3\x48\xfc\x8e\x78\xd5\x84\x17\x7f\x9d\x50\xfa\x03\xd7\xd4\x60\xfa\xe2\x70\x6e\x76\x47\xdc\x6e\x81\x01\x62\xd6\x0d\xe2\xa0\xbb\x1f\x00\x09\x0c\x68\x80\x3d\xc9\x01\xd6\x2d\xd3\xdc\xcf\x5e\xd8\x36\xcc\xa1\xaf\xad\x79\xd4\xc5\xa9\xe5\x97\xd7\xb6\x32\xee\x6b\x33\x95\x68\xda\x76\x98\xca\xb4\x8d\x23\xda\x0e\xe2\xe0\x6d\x5f\x75\x20\x14\x08\x18\xf9\xb5\xd2\xec\x1a\x77\x51\x0a\x1d\x8d\x18\xed\x42\x3e\xa5\x9e\x4f\x8a\xfd\xe5\x66\x47\xc6\x15\x3a\x94\x72\xe8\x6a\x6b\x00\x07\x77\xa0\xf5\x35\x9b\xea\x2b\x99\xba\x32\x6e\xe7\x67\xa4\x0a\x98\xaa\x02\x55\x1f\x1c\x4d\xcf\x45\xe5\x8d\x13\xf9\x5f\xda\x99\x8f\x3d\x84\xf6\x2b\x81\x38\xa4\xef\x76\x19\x94\x6a\x32\xd0\xf9\x66\x0e\x88\xcb\xc6\x99\xa0\xba\xb1\x67\xdf\xfb\xd4\x7f\x35\xfc\xda\xa5\x5b\xe2\x49\x12\x89\x39\x71\xd0\x9e\x1d\x10\x07\xaf\xfb\xb9\xec\xea\x9a\x66\x2d\x87\xe3\x64\x6a\x8e\xba\xd6\x42\xec\x77\x3f\x61\x0c\x31\xa6\xfd\xd4\x85\xdc\xfb\xf3\xf1\xb6\x41\xc7\x19\x08\x07\x40\x1c\x74\xf7\x03\x20\x81\x01\xcd\x76\x4e\x72\x20\x5d\x33\x04\xeb\x52\xe0\xdc\xcc\xf1\xb9\xf7\x8d\xea\x6f\xc6\x3f\x63\x78\x37\x47\xc8\x70\xf5\x4b\x7d\x53\xbf\x1d\x63\x58\xd7\xba\x0d\x9d\x17\x03\x70\x48\x09\x0c\xe9\xc7\xcf\x6d\x73\xba\xb3\x12\xee\xf8\x2f\xaf\xcb\xd3\x2b\xd6\xe1\x60\x57\xdb\xdd\x3e\x16\x90\x8f\x20\xda\xf4\xcb\xe0\x83\xfe\xad\x40\x1c\xdc\x01\xc1\x5b\x15\x49\x56\x58\xea\x42\x2c\xd7\x3b\xb2\x47\x1d\x89\x30\x5e\xbe\x7f\xc6\x59\xa8\x20\x76\xde\x48\x00\x0d\xdb\xea\xf0\x23\xe4\x2c\x88\x43\xfa\x66\xb6\xd8\xc7\xd6\x39\x05\xfa\xef\x4c\x5b\x76\xba\xb4\x03\xb5\x77\xd2\xc4\x7b\x9e\xae\xa4\xe7\xba\x5c\xa2\xef\xe4\x33\x9b\x55\xfd\xdf\x83\xce\x00\x0e\x5e\xf7\x57\x29\xce\x14\x67\xdf\xc0\x78\x41\xb1\x2b\x53\x21\x76\x76\x1f\xa7\x3e\x1e\xd7\xe7\x85\x6b\xd7\xda\xce\xc6\x97\x14\xcf\xe6\xf2\x23\x1c\x00\x71\x50\x3f\x00\x48\x60\x40\x53\xcf\x93\x1c\x20\x63\x77\xe9\xbf\xb4\xd3\x2d\x64\x7e\x95\x31\x57\xd0\x81\xd1\xd1\xb6\x5a\xf0\x09\xf1\x18\xef\xd4\x43\xe3\xcf\xb8\xde\x8b\x38\x14\x88\xb6\x83\x38\xa4\x77\x72\x12\x81\xdf\xdb\x36\x28\xb8\xb3\x52\xbc\x7a\x64\xcb\xfd\x52\x5c\xc8\xd0\xbb\x88\xaf\x33\xa9\x1c\xcb\xd6\x8d\xe2\x33\x6c\x43\xf7\x81\x81\x38\xb8\x03\x8f\x1e\xb7\x87\xeb\x0c\xc5\xdc\xb6\xa3\xe5\xc8\xb4\x08\xb6\x2a\x73\x79\x36\x17\x8f\xce\xe2\x8e\x39\x6d\xd8\x7c\xa3\x30\xdd\x16\x72\x0b\xc4\xc1\x9f\x97\x55\xa8\xf1\xfd\x86\x6e\x1e\x6b\x31\x95\xf1\x4e\xaa\x9e\xb4\xaa\x54\xb6\xfc\x6d\xb5\x03\xd4\x8c\x25\xda\x57\x74\x41\x2b\xb3\x69\x50\x7f\x08\xe0\xe0\x75\x99\xba\x69\xb1\xf4\xe6\x12\x06\x4b\x76\x0e\x9f\x79\xdf\xcf\x5b\xbb\x96\xcb\x13\x41\x8d\xf1\x5d\xab\xec\xd3\xf3\x4b\x51\x8e\xd9\x0b\x08\x07\x40\x1c\xd4\x0f\x00\x12\x18\xd0\xea\xfd\xe4\x04\x86\xd7\xf8\x4b\x8e\x38\x75\x8d\xc4\xa7\x7a\xbc\x8f\x4e\x1d\xaa\x8f\x3e\x5b\x7d\xe0\x1a\x79\x26\xa2\x7e\xfd\x16\x4a\x09\x55\x8e\x30\x74\x06\x09\xc4\x21\x27\x30\x0f\x9b\x35\x3b\x97\x2a\x2b\x9c\x62\xc9\x4d\x1a\x89\x8c\x6d\x2b\xcf\x91\x69\x18\x33\x8a\x11\x05\x51\xee\x39\xe1\xd5\x58\x14\x84\x22\x2a\x83\x38\xe4\x04\xc6\x6f\x8e\x0a\x2f\xbf\x15\x93\xe2\xb2\x65\x72\xa4\xd1\x93\x4b\x3b\x41\x87\xc2\x99\xfb\xe1\x51\x65\x8a\xc4\x01\x75\x51\xdf\xc9\x45\x10\x95\x41\xdc\xff\x24\x30\xff\x38\x37\x66\xa0\xe5\xca\xfc\xec\xf5\xe1\xe6\xa1\xfe\xab\xaa\xe6\xca\xb0\x2c\x26\x7d\xd9\x44\xf7\x83\x84\x1b\x0a\xe9\x76\xbb\xbd\x13\x75\x84\x50\x02\x23\x9d\x4c\x54\xcc\x97\xaf\x30\x27\xa0\x72\x59\xf5\xad\xb8\xcf\xeb\xa7\x1d\xc2\x87\x5d\x43\x1f\xb0\xf1\x3f\xf0\x2a\x3d\xd1\x12\x61\xff\x33\x81\x41\x95\xbc\x5c\xaa\x8d\xc5\x29\xaf\x95\x38\x63\x8d\x4a\x2b\x93\xf4\x49\x80\xf7\xf6\x56\xf4\xd9\xc6\x9e\xfb\x9f\x76\x1f\x7b\xca\xfe\xf9\xb1\x9f\xf7\x41\x33\xf9\x53\x1a\x5e\x6b\x04\x34\xfc\xf2\xbf\x58\x75\xe4\x7d\xe2\x3c\x74\x5e\xf8\x76\x07\x7b\xea\x8c\xe9\x1d\x70\x65\x74\x48\x4a\xe2\xe1\xfd\x37\x24\x30\xde\x98\xff\x59\xd3\xfc\xd1\x51\x30\xfd\xa4\xe8\xbd\x03\x42\x64\xbc\x91\x12\x98\x78\x0f\x6d\x9e\xac\xd5\x63\x9d\x5e\xbc\x46\x82\x11\x91\xaa\xdd\xb1\x97\xfa\x0f\x26\x7d\x3d\xbe\xa5\xcb\xcb\x99\x38\x90\x1e\xee\x9d\x46\x02\x83\x72\x03\x69\x95\xee\x59\x7b\x6e\x6f\xe0\xfc\xfa\xda\x0b\x36\x59\x6f\x9a\xa5\xa9\x8c\x55\x12\xca\x79\x54\x69\x4f\x36\x4c\x76\x29\xb5\xfe\xb4\xe0\x53\xd9\x9e\x81\x9c\xc0\xcc\x4b\x79\xa1\x0f\xba\xf2\x9d\x11\xb3\x88\x8d\x93\xa0\x9e\x58\x8a\x12\x25\x1c\x3f\x88\xbd\x59\x92\x8f\x87\x96\x8f\xce\x4d\xf2\xfe\x54\x36\xa3\x68\x21\xfd\x59\x95\x6d\xef\x6f\x8e\x61\xf7\x4a\x8f\xc4\xb0\x58\xfd\xce\xc7\xdc\xb9\x25\xce\x78\x55\xe4\x93\xc7\x84\x1d\x7d\xa2\xba\x93\xe2\x57\xdf\x53\x69\x2d\x72\x02\x73\xee\x5b\xef\x93\xbb\x89\xe3\xf6\xda\x5f\x6a\xcf\x59\x6e\x9b\xf9\xa4\x1b\xe7\x8a\x5c\xa9\x7e\x1f\x6e\xae\x69\xd4\x72\x74\xbd\x78\xed\xd4\xa2\x10\x90\x43\x27\x0d\x7c\x9d\xe4\xec\xe4\xe3\x32\xbe\x15\x74\x2d\x05\xbb\xe1\x9b\x0b\x2f\x33\x5a\xa3\xeb\x96\x45\x6d\xd8\xcd\x45\xcc\xee\xeb\x16\x59\x6f\x41\x9b\xb5\x01\x1c\xbc\xc3\x6f\x22\xaa\x9e\x5a\x48\xaa\x76\xbf\x75\x31\xea\x0e\xa7\xac\xcf\xf0\xbb\x8a\x32\x54\x03\x06\xc1\xe9\xf8\x3b\x0e\xb5\x79\xdc\x94\xd0\xc7\x2d\x40\x1c\x7c\xe0\x7b\x3d\xe8\x72\xe6\x2e\xc9\x3b\x8e\x8b\xdb\x83\x79\x18\x62\xc7\xa9\x12\xa5\x2f\x4a\x22\xaf\xea\xae\xab\xce\x38\x09\xd4\x6f\x13\x43\x3b\x1c\x40\x1c\xd2\xce\x89\x0f\x0b\xac\xf2\x0a\xd6\xf9\xca\x13\x79\x7e\x8f\x37\x8a\xa5\xac\x5d\x5f\x8d\xed\x06\x31\xc9\x04\x72\x4f\xdf\xbf\x66\xa4\xe2\x05\xed\x9c\x00\x70\xf0\xe7\x7d\x2f\x10\xb5\x52\xc8\xb2\x21\xf6\xbd\xd5\x46\x8c\x40\x70\x22\xf6\xec\xe8\x6f\x8a\xab\xad\xc1\x2c\x58\x24\xc1\x4a\x0b\x78\xd6\x33\x88\x75\x30\x88\x43\xdc\xc5\xe1\xfd\xf7\x28\x04\xf4\x1f\xfa\x24\x05\x04\xa3\xfa\x2a\x82\xda\x76\xad\x29\x9c\x68\x0a\xe6\x1a\x22\xd5\x6a\xcd\x7c\xeb\x3a\x48\x42\x79\x82\x8b\x70\xcf\xf7\x14\x0d\xf7\x41\xf3\x49\x00\x07\xff\x49\xe9\x9a\x6a\xdf\x37\xd1\xa0\x4b\x24\x4c\x04\x4f\xde\x54\xda\x14\x70\x97\xf2\x3e\xde\x43\xcd\x1b\xf8\x7d\x3b\xc8\xf9\x7b\x4f\xc0\x21\xa2\x2e\x88\x43\x5a\x07\x6b\x63\x0d\xd3\xaf\x24\xa5\xea\xbe\xf7\x62\xa9\x69\xad\x9f\xdd\xa0\xfc\x45\x52\x34\xce\x24\xfe\x2c\xd9\x6e\xaf\xe7\xb7\x0c\xf4\xe1\x6e\x10\x07\x7f\x5e\x3e\xd7\xeb\xe6\x31\xf9\xfd\x5b\x04\x75\x86\xcb\x3f\xf3\x74\x93\xf3\x69\xaa\x38\x1a\x0f\x92\x1c\x12\x12\x76\x67\xb2\x04\xf3\xa0\x6b\x69\x40\x1c\xd2\x37\x4b\xa3\x7e\xf6\x12\xf1\xb0\x85\x55\x06\xca\xea\x2f\x12\x8c\xe4\xd2\xec\xcd\xe7\x9e\x7d\x6a\xd5\xaf\x9f\xf3\x55\x87\x3c\x32\x54\x18\xa1\x00\x88\x83\xae\x63\xb9\xf1\xf7\x4f\x01\x03\x3a\xd7\x13\xaf\x61\xf0\x7d\x14\xd9\xbb\x28\xda\xc1\x4f\x9f\xf3\x58\x73\x16\x65\x61\x44\x97\x3e\xbe\xde\x4c\xa6\xe9\xcb\x48\x64\xd3\xe0\x43\x99\x2a\xe8\x1a\x06\x00\x07\xff\x49\xc3\xb2\x75\xd0\x54\xd7\x99\xe2\x2b\x5f\x06\x06\x13\xa4\xfc\xf4\xd7\x73\xf7\x92\xdc\xdd\xfd\x51\x61\x99\xe7\xa2\x2f\xac\xb8\xf2\x09\xba\x63\x1a\xc0\xc1\x7f\xd2\x0d\x07\x57\xce\x40\x6c\xe5\xb9\x26\x05\xd9\xf3\xdf\xc3\xcb\x0e\x0b\x0c\x72\xf1\x39\x0b\x23\x44\xad\x26\x27\x73\x0e\xde\x50\x11\x40\xd7\xec\x02\x38\xf8\xf3\x7a\x76\xf6\xef\x4e\x7a\xeb\x3f\xe9\xe5\xd8\x9e\xb2\x12\x3d\x10\x21\x66\xdb\x31\xad\xb8\xd1\x27\x9c\xa0\x74\xad\x08\x8f\x17\x0d\x5a\x02\x81\x38\xf8\xf3\x26\x15\x27\x4f\x6f\x11\x47\xa9\xb6\x7a\xb2\xbf\x22\x63\xdc\x7a\xc1\x6a\x85\x9a\x18\xfa\xca\x04\xfd\x16\xa1\x7f\xe2\x60\xfb\x5d\x4d\xc4\xf4\x17\xc4\x41\xd7\x30\x00\xa2\x10\xd0\x48\x77\x92\x03\xc3\xb7\x5c\x7c\x0b\x66\x0e\xce\xea\x17\xdf\x13\xb7\x7f\xbe\x10\xb2\x43\x1a\x74\x20\xbd\x5f\x92\xdb\x9a\xb9\x5d\x51\x71\xd7\x63\x1f\xd1\x76\x10\x07\xff\x4d\xa7\xb2\xea\x27\xd7\xc7\x78\x71\xdf\xdc\xa5\x8a\xca\xa8\x72\xd1\x15\x67\xa0\x60\xac\x5c\xd6\x94\x5d\x9f\x4f\x5d\xb2\xd6\xfc\x0c\x25\x8c\x20\x0e\xfe\x9b\xae\x74\x7f\x17\xe2\x4b\x6b\x0b\xe8\xfa\xee\xca\x60\xc6\x3a\xfa\x90\x77\x28\x8d\xfb\x92\xab\xf8\x4a\xa4\xb1\x01\xee\x22\x15\x4d\x04\xa2\x2e\x88\x83\x3f\x6f\xc9\xe8\xc4\x73\x26\xdd\x96\x4b\x5f\xb8\x7d\xda\x02\x5c\xde\x8f\xa7\x1b\xf0\xb8\xb7\xec\x38\x94\xee\xb1\xdb\xf7\xbd\xbd\x93\xbf\x83\xa8\x0b\xe2\x90\x8e\xb0\x3d\x49\x47\x99\xb7\x08\xa8\xc3\x3c\x67\xa6\x35\x15\x39\xb0\x4d\xb8\xa5\x47\x85\x83\xfd\xb9\x8d\x4a\x3d\x56\x53\xc4\x9a\x92\x16\xba\x8a\x03\xc0\x41\xd7\x30\x68\xfd\xdd\x01\xd0\xb4\xe3\xc4\xb3\xc1\xbf\xa5\xd2\xe2\x4c\xec\x04\x37\xc4\xc5\xf5\x39\x30\xb6\xf6\x13\x1e\x53\xab\x30\xe5\x1d\xdd\xc1\x37\xf1\xd1\x70\x30\x66\x6e\x87\x5e\x34\x00\x38\xf8\x6f\x9a\x3b\xe1\xc5\x41\x9d\x42\x41\x9d\xfd\x01\xfb\xa1\x5f\x26\x19\xc9\xeb\xcb\xec\xb5\xb1\x6c\xf4\xe2\x86\x3b\x79\xc2\x6d\x57\xf5\xa0\xcf\x1c\x81\x38\xa4\x23\x61\xaf\x70\x03\x02\x5f\xec\x27\xfd\x58\xce\x98\xe3\xbd\x1c\x3b\x54\x9a\x2e\xb7\x37\x65\x74\x90\x5e\x77\xe5\x65\xd8\xe5\xb0\x7c\xe8\xe8\x16\x88\x43\xda\x38\xc1\x79\x57\xc2\xcf\x89\x58\x66\x3d\x48\xab\x3a\x9e\x22\x21\xe9\xa6\x78\x17\xd6\xb7\x4b\xfa\xe5\x81\x9b\x9e\x06\x7a\x94\x42\xd3\xd0\xc6\x09\x00\x07\x7f\x5e\xae\x52\x57\xe3\xde\xe2\xbe\xc4\x9f\x41\x0f\x1a\xad\x43\xed\xee\x50\x5c\x6f\xad\x1c\x21\x8c\x1d\x26\x1d\x31\xbe\xad\x6a\xd8\xee\x88\x70\x00\xc4\x41\xfd\xc0\xff\x15\x85\x18\xfe\x67\x4b\xa8\x93\x97\xc1\xb4\x44\xc5\xc2\x26\x12\x2b\x8f\x26\xfc\x72\xa5\x06\xf7\xef\xa9\x4b\xf1\xdc\xe4\x4f\xc3\xa2\xbd\x76\x30\xe4\xc5\xa9\x4a\xb2\x27\x83\x58\x52\x82\x38\xe4\x65\xf0\xaf\xf1\x6d\xad\x92\x17\xaa\xd6\xf9\xf7\xe9\xf6\xef\x3e\xce\x57\x11\xb8\x67\x91\x7a\xab\xb5\x4e\xb8\xc0\xe2\xd3\xf5\x11\x99\x4b\x63\x88\xca\x20\x0e\x79\x19\xfc\xb9\xae\x10\x57\x2a\x5d\x2d\x94\xdb\x1c\xb3\x86\x51\xee\xc2\xd8\x64\x6c\xa8\xd4\x04\x63\x4e\xa0\xea\xc0\xb4\x54\x1b\xe5\x9b\x3e\x44\x65\x10\xf7\x3f\xcb\x60\x86\x7f\x2c\x83\x09\x17\xb5\xc7\x8f\x1e\x6a\x3b\x2c\x88\x77\xe1\x3d\xdb\x88\x4d\xeb\x6f\x7c\xe8\x9a\x56\xcf\xe5\xa4\xf8\x8a\xc0\xde\x39\x53\x0c\x5a\x06\x9f\x2b\x33\x19\xb7\xd2\x9b\xb9\x81\x4f\xfa\xb2\x21\x4c\xe4\xfa\xa3\x28\xf4\xf0\x32\x42\xa3\x0a\x3b\x36\x65\x29\xc7\xa6\xc6\xde\xcf\x7f\x2e\x83\xcf\x12\x75\x12\x5f\x7e\x6b\x31\xdc\xff\xf4\xc6\xda\xc2\xd2\x2e\xe1\x99\x26\x7b\x8f\xa3\xe4\x97\x1a\x82\x2a\x24\x34\xea\x79\x43\x28\x7f\x6e\x10\x43\xc1\x3c\xb7\x49\xdf\xb3\xb8\x1e\x3c\x2d\xd4\xc2\x69\xec\x46\xde\x90\xbb\x1a\x44\xd2\x77\x11\x5d\xb2\xa6\x80\xdf\xf3\x07\xfd\x7f\xdb\x32\x18\xd4\xb4\x3f\x96\xc1\x0d\x48\xcb\xe0\x77\x57\x47\xf8\xcf\x79\x11\x19\x94\xf2\xa7\x06\x87\x76\x7c\x66\xdb\xa0\x74\x0f\x14\x15\xd3\xc7\x5e\x10\x4e\xbb\xfd\xe8\xb7\x78\xcd\x69\x2c\x83\x25\x91\x96\xc1\x1d\xd7\x7d\xb9\xf7\x75\x9e\x1a\xeb\x99\x31\x5c\x3f\xe3\xd6\xf9\xa3\xa7\xa3\xeb\x72\xcf\x50\x1a\x61\x9c\xbf\x4e\xb4\x24\x61\x66\xf4\xa9\xbc\x23\x47\x5e\x06\xd7\xae\x7b\xe0\xa7\x26\xb5\xf1\x59\x24\xf9\x0f\xf7\x8a\x8c\xac\x2a\x06\x4d\x2d\x71\x95\x8e\x94\x74\x5d\xc5\x90\xc4\x6f\xf5\xe2\x3c\x95\x1d\x01\xc8\xcb\xe0\x64\xce\x6c\xf6\xe8\xac\x2d\x41\x4f\x66\x11\x29\x29\x33\xa5\x8b\x31\x3f\x76\xdb\x64\xbf\x10\x8b\x93\xb4\x92\xde\x34\x49\x28\x3b\x9d\x1d\x01\xc8\xcb\xe0\x0e\xe7\xb4\xee\x9c\xd1\x69\xa7\x57\x94\x05\x61\x69\xbf\x22\xdd\xe5\x3c\x2b\xc6\x6e\x7e\x7f\x8a\x85\x3f\x4b\xc6\x99\x3d\x13\xb7\x71\x6a\xcb\x60\x90\x43\x27\x0d\x7c\xe7\x19\xa2\xd3\xf3\xfd\xae\x73\x67\x89\x5e\x72\x22\x6d\x79\x15\x84\xf7\x75\xb4\x0c\xcb\xf8\x9e\x9e\x56\x2f\xe3\x5b\xe2\x92\xdc\x5d\x44\x87\x0f\xe2\xe0\x03\x49\x0a\xc9\x9b\xb4\xf8\xe2\xfc\x8b\x51\xbc\x79\xd4\x26\x0f\x42\xd2\x94\x5e\xf3\xf8\x1d\x84\xb6\x53\x2c\x19\x10\x69\x11\xfa\x4f\x32\x40\x97\x57\x00\x38\xf8\x40\x72\xe0\x70\x35\x4c\xbf\x12\x4f\x4d\xb8\xf0\xd2\xf8\x54\xa1\xf9\x3a\x8d\x97\x87\xda\x92\xe1\xf1\xcd\xdd\x54\xdf\xf7\x7d\x73\x23\x78\x88\xba\x20\x0e\xfe\xbc\xeb\x6a\x1f\x5c\x49\x45\x7f\x50\x6c\x0a\x92\x3e\x22\xcc\x0e\xa8\x57\x93\x4b\x3d\x7f\x7f\x30\x2b\x96\x0f\x8d\xce\xbc\xfb\xf8\x52\x2c\xa2\x2e\x88\xf3\x93\x46\x91\xfc\xb3\xae\xdd\xd0\xfd\x7e\x0b\x87\x74\x43\x1d\xfd\xa7\x7d\x57\x06\xcb\x72\xb0\x56\x06\x5f\xcb\x63\x5d\x0f\x53\x78\x38\x3d\xf8\xf3\x6e\xb4\x0b\x62\x0d\x04\xe2\x10\x57\x22\x34\xfc\x7d\x19\x0c\xfa\x0f\x7d\xe2\xab\xc0\x29\x34\xfe\xbc\x6f\xb2\x1f\x0b\x3a\xc5\xb5\xbd\x9f\xeb\x51\x1c\xe6\xdc\x96\xf8\x62\x4a\x36\xb6\xcc\xce\xc3\x4c\x9d\xaf\x02\x1d\x01\x06\x71\xf0\x9f\xb4\x7d\xc4\x4f\xd6\xc6\x32\x64\x9f\x57\x3a\x55\x2b\x4a\x3b\xd3\x94\x2e\x4b\xa7\x31\x7b\xb1\x4d\x72\xb5\xac\xb1\x55\x58\xe9\x27\x0d\x74\xc5\x00\x80\x43\x9a\x4b\xa0\xf1\xee\x13\x84\x8c\x38\xeb\xd3\xe1\xb0\x78\x4d\x73\x88\xda\xde\xc2\xf9\x38\x56\xd1\xdd\x29\xc1\xfc\x21\xfb\x5c\xbd\x9c\x20\xa2\x2e\x88\x83\x3f\xaf\x95\xb8\x56\x6d\x03\x4e\xf4\x0e\xaf\xee\xcb\x73\x6f\x2f\x1b\xee\x36\x7a\x49\x71\xc7\xaa\xe4\xcb\xe7\x0a\x2e\x85\xf9\xe1\x05\x41\x1b\xf2\x41\x1c\x5c\x01\xa6\xb6\xe6\xe3\x78\xee\x8b\xa3\xb7\xd2\xd6\xc4\x43\xc9\x58\xd7\xdf\x0f\x3d\x66\x60\x44\xd7\x32\x71\x1d\x9b\xa5\x11\x59\x7f\xcd\x8c\x50\x00\xc4\x41\xb7\x62\xfc\x7d\x19\x0c\xea\x5c\x4f\x7c\x0b\xb4\x41\x19\x81\xd1\xbe\xc4\x46\xec\x41\x6f\xb2\xb8\xa9\x55\x71\xf5\x51\xfa\x4a\x62\x5b\x71\x35\xc1\x93\x5b\x95\xed\xe2\xba\x50\xb8\x04\xe2\x90\x76\x04\x18\x32\x27\xa4\xa5\x1b\x55\x3d\xe4\x7d\x6b\xa3\xf6\xd8\xae\x64\xcc\xbd\x48\x55\x3b\xfc\xe5\x81\xe8\xd0\x34\x4a\xa5\xd2\x13\x17\x68\x47\x00\x80\x83\x2b\xb0\x76\x10\xfc\x6e\x4a\x85\xd6\xed\x68\x80\x7c\xb8\xf8\x0d\xad\xad\x75\xa0\x39\x45\xa6\xdd\x33\x09\x65\x47\x3f\x5b\x7e\x62\x0f\xe8\xb6\x0d\x10\x07\x7f\xde\x32\x0a\x3d\xb2\x95\x08\x69\xbe\xc4\x8a\x4a\x8f\xcb\x95\xe5\xef\x2d\xad\xf8\xc6\xf4\x03\xd5\x25\x5c\xce\xf5\xe6\x32\xe1\xe5\xdd\x44\xd4\x05\x71\x70\x05\xa4\x25\x0f\xf9\xba\x2b\x2c\x3e\x0b\x5f\x93\x7b\x6e\xe7\xd8\x52\xb2\x46\x5d\x64\x2c\x7c\x5d\xba\x09\xd7\xe1\x95\xdf\xab\xb8\xcc\x40\xc4\xf4\x17\xc4\x41\xa7\xe1\x01\xcb\x60\xd0\x48\x77\xe2\x12\x88\x56\xea\xc5\xe3\xf5\xc8\xd9\x3b\x23\x0e\x18\x6f\xae\xf0\xa7\xbf\x78\x66\xc2\xa0\x54\xc3\x85\x26\x23\x41\xcc\xcc\xb2\xb3\x8c\x0b\x2d\x81\x00\x1c\xd2\x1b\xf6\x83\x59\x87\x89\x0d\x73\xf5\x4a\xd7\xe9\x4f\x15\x8c\x05\xa5\xa5\x95\x3e\xdb\x0a\x72\xe7\xa8\x3a\x3f\x7f\x26\x7e\xf5\x32\xf4\x2d\xf4\x86\x1d\xc0\xc1\x1d\xf0\x31\x25\x09\xf4\x6d\x25\x91\xb8\xa1\xee\x56\xde\xae\x73\x9f\x0b\xfb\xf7\x54\xfc\x96\xdb\x75\xf7\x5d\x05\x56\x6d\xb4\x3b\x3f\xa0\x37\x97\x20\x0e\xfe\xbc\x64\xef\x43\xa4\x70\x99\xbe\xa0\xcc\xc5\xa5\xe7\xb4\xdc\xc6\xfd\x9d\xc5\xfd\xd4\xda\xf3\x1a\xa6\x4b\x1a\xd5\x8f\x26\x66\xfe\x59\x68\x8f\x37\x88\x83\x3b\x10\x21\x9b\xd5\x6f\x61\xea\xc5\x97\x65\xc5\x7f\x35\xa3\x4c\xc3\x26\xc7\x7c\x44\x01\x87\xc3\xf1\x5d\xe1\x0a\xe7\xf7\xc5\x0f\xb3\xd3\x08\x07\x40\x1c\x74\x1a\x1e\xb0\x0c\x06\x4d\x3b\x4e\x72\xa0\xbd\xdb\x87\xea\x46\x11\x9d\xeb\x5b\xac\x22\xa1\x81\x57\x67\x89\x7c\x71\xf1\x8d\x55\xcf\x5c\x48\x5b\x65\x7b\xd2\x7c\x7f\xe6\x8b\x3b\xd4\x65\x03\x38\xf8\x6f\x4a\xb8\xa2\x94\x79\x3f\x65\x6f\xa7\xeb\xe5\x73\x6e\x5f\xae\x8b\xf3\x4d\xba\x0c\xd1\xb7\x02\x45\xf9\x59\x19\xa5\x2c\xf5\x42\xcf\x42\x3b\x8e\x40\x1c\xdc\x81\xf1\x69\x82\x95\x36\x4e\xca\x8f\x3e\xd9\xdf\x48\x89\x0a\x48\xd7\x04\x38\x89\xe5\xb0\x15\xc9\x27\xa4\x0d\x54\xee\x1d\xf1\x5d\x81\x3e\x3d\x07\xe2\xe0\xcf\x3b\xe0\x48\x70\x86\xb2\x0d\xd3\x66\xfd\x23\x97\xe5\x87\xa7\x96\x26\x3c\x2d\xca\x41\xa3\x56\x17\xb9\xae\x44\xd1\x47\xb3\xe2\x74\x43\xbb\x58\x40\x1c\xd2\x50\x50\x5e\x60\xd5\x32\xa1\x33\x69\xf5\x85\x08\x77\x15\x4b\x34\x4a\x8b\xfc\x22\xaa\x0f\xfb\x0d\x8b\xdd\x81\x87\x59\x33\x58\xa1\x6a\xd0\xdb\x60\x00\x07\xf5\x03\x80\x65\x30\x68\x09\xf5\x7f\x7c\x11\xa4\x5d\x3e\x92\x9e\x79\x82\x99\x93\xca\x88\x8b\xd8\xe1\xdb\xff\x63\xee\x2d\xa3\xaa\xea\xbe\xf7\x6f\x1a\x04\xe9\x16\xe9\x94\x10\x90\x90\x12\x90\x14\x11\x49\xe9\x46\x40\xa5\xbb\x5b\x42\xba\x15\x90\x16\x44\x40\x41\x14\x14\x69\x29\x09\x45\xba\x05\x49\x05\xa4\x4b\x42\x9e\xf1\x7b\xc6\x38\xfb\xef\xbd\x0f\xe3\x5e\xdf\x17\xbc\xb8\xdf\x7f\xc6\x3c\x67\xed\x75\x9d\x3d\xd7\x75\xd6\x9a\x73\x91\x56\x16\x93\x08\x33\xea\x0d\x4c\xdc\x0b\x12\x9c\xb2\x88\xb7\x08\x85\x6e\x04\x01\x70\xc8\x36\x98\x3e\x41\x82\x99\xd2\xf8\x57\xbd\x10\x77\x5b\x4a\x36\xae\xb1\x37\x95\x80\x3f\xe1\x88\xae\x03\xe1\x94\xdb\xf7\x61\xb4\xe0\xe2\x04\x44\x64\x10\x87\x6c\x83\x3b\x35\x14\x07\x26\xb7\x83\xc6\x02\xda\x4d\xb7\x04\x59\x19\x1f\x70\xa3\x78\xcc\xe4\xc9\xcc\xfc\xf1\xa5\xe4\xdb\x09\xbb\xe3\xa7\x89\x88\x0c\xe2\xfe\x7f\x1b\xfc\x8f\x2e\x16\xde\x17\x5f\x26\xa8\x8e\x1c\xea\x32\x86\xf8\xcb\xaf\x15\x29\x71\xde\xfd\x4c\x8e\xe2\xf8\x69\xb4\xf8\xb5\xee\x1f\x9f\x2a\x41\x1a\x6b\xc8\x06\x77\xe2\x51\x89\xc8\xbe\x50\x99\x7f\x49\x48\xc3\xc7\xf1\x80\x01\xd3\x3f\x5e\x9b\xdc\xe5\xe4\x61\xc8\x1f\xd9\xdc\x17\x1b\x65\x35\xf9\x7f\xdb\x60\x8f\x4f\x1f\x87\x50\xa5\xd8\x2b\x82\x92\xc3\xaf\x33\xd4\xf3\x98\xf1\x0b\xa6\x88\xe8\x97\xde\x8e\x40\xc1\x49\x9a\xde\xde\x68\x14\xfe\x3b\x87\x56\x4f\x61\x26\x2e\xa0\x27\x7c\x12\xbb\x6c\xc7\xa3\x50\xb3\x96\xeb\xd9\x6d\xbf\x4a\x4e\xd8\x27\xf9\xc1\xd9\xd1\xbb\xda\x50\xfc\xbf\x66\x83\x41\x43\xfb\xcb\x06\xa3\xc8\xc2\xbd\x12\x95\xb4\x77\xf2\x2b\x5e\x51\x14\xe6\x55\xfe\xd1\xd4\xa0\x03\x8e\x42\x9e\x7c\xad\x0d\xe3\x50\xbe\xb7\x4c\x4e\x57\xc6\xa7\x7f\x87\x9c\x85\x0d\x0e\x44\xb2\xc1\x09\x9d\x57\x22\xd4\xf3\xc5\x72\x7b\x43\xda\x69\x9e\x16\xa7\xf5\x2c\x96\xbf\x7e\xb0\xca\x9f\x2d\x94\xac\xb5\x7e\x3b\xaa\xcc\x68\xf6\x4c\xb6\x65\xc5\x90\x8c\x21\xa1\xd1\xfe\x7c\xc9\x47\x7a\xfe\xeb\xab\x9b\xfe\xdb\x62\x6f\xd0\x68\xcf\x05\x44\xa0\xde\xbf\x89\x59\x79\x61\xf5\x8d\x75\x8e\x0e\xf6\x99\x6c\xcb\x22\xdb\x60\x55\xd7\xc0\xea\xdc\xb5\x34\x19\x52\xdb\x1a\x47\x5c\xce\xdd\x5e\x39\xc5\x47\xf7\xd4\x55\x0e\xef\xa2\xe0\x3c\xce\x19\xfa\x93\x78\x16\x5d\x27\xe4\x50\x9c\x90\x3e\xd6\x8d\xd3\xf6\x6b\x50\xd2\x1d\xa9\xc7\xfb\xf2\xcf\x0f\x53\xed\x02\xdf\x18\x0e\x14\xdb\xcc\x89\xbd\xe0\x22\x28\x94\xfe\xea\x48\xa7\x7b\x66\x36\x18\xa4\xa1\xd3\x12\x5f\x30\x7b\xfb\x11\x3a\xff\xfb\xaf\x65\x2a\xa4\xfb\x46\xcf\x27\xa9\x06\xad\xad\x71\x5b\xab\x52\x2b\xb4\xc3\xc7\xd1\x34\xda\x78\x2f\x41\xed\xdb\x00\x1c\x3c\x91\x2c\x72\x0d\xb3\xe6\xb3\x7b\x24\x74\xe9\xe2\x3e\x6d\x77\x61\xc0\x1c\x5e\x8a\x20\xf3\xeb\x57\x54\x56\xef\xdb\xe3\x19\x7a\x26\x0f\x15\x3b\x83\x38\x78\xe2\x13\xff\x1d\xa3\xf6\x5b\x74\xaa\x34\x67\x4b\x14\x63\x97\x0f\x2d\x4e\x57\xb9\xfc\x7e\x92\x50\x0b\x86\x19\xea\xc5\xb6\xb5\xa6\x3f\xd0\xfe\x12\x88\x83\x5f\x59\x25\x99\x45\xec\x9b\xd5\xeb\x70\xc7\xcd\xbe\x1c\xb7\xa3\x5b\x89\xba\xd6\x35\x03\x8d\xc0\x42\x8b\xb6\x0d\x9f\x56\x9e\xb6\x5b\x15\x3a\xc8\x0f\xe2\x42\x64\xfe\x79\xad\xf5\x83\x15\x35\x0d\x79\x85\xf3\x93\xd8\xcc\x76\xbb\xdf\x4c\x57\x6a\xda\xd4\x1d\xe6\xdf\xee\xec\x62\x9c\x24\x50\x12\xf0\x89\x62\x16\x23\x3c\x10\x88\x83\x5a\x13\xc8\xfe\xfb\x69\x48\xc0\x0f\xfa\x34\x09\xd4\xdf\x53\x12\x24\xe6\x21\x93\xa8\x3e\x90\x08\x8e\x35\x8a\x8d\x36\x1d\x9d\x7d\xc9\xa4\x60\x45\x95\x26\xff\x3a\xfd\xca\xdd\x06\xe8\xf4\x32\x88\x83\x4b\x60\x9b\xbb\x83\x5b\xd6\x88\x55\xf1\x97\xe3\x23\xf7\xa4\x9f\x89\x33\x42\x2d\x28\x1b\x63\x8f\x9e\xba\x9b\x52\x5a\xf0\x56\x7c\x7a\x7b\x0b\x11\x17\xc4\xc1\x25\xa0\xcc\x82\x7e\xf3\xbd\xb6\x62\x81\x83\x2f\xde\xd2\x10\x51\x1e\xbe\x65\x52\x68\x7c\xae\xa1\x23\xe3\x5d\xca\xdf\xe4\x5c\x4f\xc2\xa0\xdd\x60\x10\x07\x97\x80\xa6\x42\xca\x14\x8f\x6e\x36\x01\xfe\x41\xfb\x45\xc1\xfe\xa0\x75\xc7\xd5\x97\x3b\x0c\xe4\x02\xe9\xf8\x0b\x5f\x96\x12\x42\x3b\x73\x10\x71\x41\x1c\x5c\x02\x71\xb7\x72\x2d\x17\xb5\x9b\xb7\x09\xce\xe7\xbb\xe8\xd8\xcf\x1a\xa8\xf0\x5e\xc0\xcc\xbf\x38\xad\x18\x5b\xc6\xfd\x39\x8c\x89\x6e\x17\x21\x01\x10\x07\xb5\x26\xf8\x77\x1b\x0c\x7a\xb9\x9e\x26\x01\x2b\x8e\x83\x82\x67\x92\x9f\x5f\xf6\xbd\x99\x72\xb0\xe1\x94\x76\xaf\x2d\x73\x55\x6d\x5f\x7d\x87\x52\xc3\xa7\x7d\x77\xc5\xd2\x08\x6a\x0a\x07\xe2\xe0\x12\x08\x9c\x69\x24\xea\x90\xf8\x68\xcc\x45\xfa\xf3\xa5\xec\x70\x6e\xea\x00\x1b\xff\x47\xf2\x8d\xc4\x25\xc1\xcf\xbd\x9d\xa1\xf4\xa5\xd0\xc5\x98\x20\x0e\x2e\x81\x87\x0e\xbf\xbf\x71\xfa\xf9\x5c\xea\x67\xfd\x98\x87\xaf\x4a\x9f\x71\x4b\x42\xf1\x5b\xb9\x2f\xcf\x57\x32\x35\xbc\xe8\x12\xd9\x56\xe8\x9f\x1b\x10\x07\x97\x80\x82\x38\x35\x59\x9e\xed\x25\xe2\xb6\xeb\x0c\xb2\x36\xdf\x65\x18\xf2\xfb\xd3\xad\x84\xce\xdd\x52\xf5\x9e\xfa\x75\x8e\x7d\xa2\x12\x3a\x68\x0b\xe2\xe0\x12\x28\xe4\x24\xfa\xd8\xb0\x41\x3e\x96\xae\xbd\x1c\x33\x6f\xbe\x18\xfa\xc1\xe2\x48\x7c\x79\x9b\x23\x91\x3d\xe6\xa0\x30\xcc\x76\xbc\x0a\xb1\xfc\x05\x71\x50\x49\xb2\xd8\xbf\x5b\x20\x50\xa6\x3b\x4d\x03\xbf\xf1\x4c\x94\x79\x92\xe3\x84\x69\x08\x78\xb9\x9d\x3b\x50\x2b\x26\xe4\x15\x2b\xeb\x87\x05\xdd\x17\xb0\x9f\x6f\xf9\xdc\x19\x1b\x47\x8c\x1d\xc4\x21\x75\x09\xde\x76\x9a\x20\x9d\x57\x25\x71\x0e\xff\x48\x4c\x7a\x95\xa0\x4b\x7f\x23\xf8\xd7\x68\xdc\x3b\xf1\x81\xd2\x27\xb7\x7e\x54\xaa\x76\x40\x5d\x82\x01\x1c\x5c\x03\x9f\xcf\xaf\xa0\x05\xb6\x5a\x7f\x62\x9e\x6f\x96\x7e\x86\xcd\xf0\xb0\xec\xd1\xde\x97\x67\x34\x2f\x04\x74\xc7\x2c\x6f\xcc\x28\xfc\x8a\x44\xc4\x05\x71\x70\x0d\xe0\x61\x8b\xbf\xcf\x5d\x5a\xd1\x5a\x20\x52\x9c\xa1\x58\xe1\x55\x8b\x72\xff\x7e\x7d\x96\xd5\xd2\x83\x8d\xd2\x2a\xa3\x78\x20\x05\xba\x7d\x1b\xc4\xc1\x35\x90\xf8\xdd\x3a\x1b\xfd\x5e\xe0\x7b\xcc\x06\x7a\xd2\xaa\x3d\x69\xc9\x16\x42\xd4\xe1\x68\x19\x4d\xdd\x69\x9f\x87\x9d\x24\x8f\x9b\xdc\x11\x1a\x00\x71\x50\x49\x32\xc0\x06\x83\x96\x1d\xa7\x6a\x80\xa4\x0d\x53\x01\xff\x99\x0c\x4e\xf2\x0e\xe3\xeb\x41\xe7\x0f\xa2\x46\x1b\xe6\x43\xbc\x9a\xf1\x2a\x56\xaf\x86\xee\xd1\x1c\x42\x8d\x7f\x40\x1c\x5c\x03\x91\x3d\x2c\x9f\x35\x31\x36\x34\x71\x94\xb3\x6e\x8d\xcd\x19\x4c\x2f\xe4\xec\x8d\x3e\xa8\x31\x89\x21\x1a\x51\xa3\x1f\x16\x5b\x5a\x85\x9a\x4e\x02\x38\xb8\x06\xb8\x4a\x98\x9b\x78\xd6\xbe\x4b\xf2\x0c\xdf\xb3\x34\x66\x2c\x27\x5f\xeb\x0e\xda\x47\xe3\x8a\xb3\x8e\x88\x7a\x4c\x47\x79\x5f\x06\x6a\x38\x08\xe2\xe0\x1a\x78\x14\x69\x71\x9d\xc8\x2b\x36\xc0\xff\xed\x5e\x3b\x3b\xce\xea\x67\x46\x2c\xdc\xbe\xaf\xad\xa9\x4f\xe5\x37\x5b\x92\x8d\xfb\x32\x55\x11\x71\x41\x1c\x5c\x03\xc6\x0c\x12\xec\x43\xe7\x72\x83\x65\x92\x3e\x6d\x27\xa9\xed\xec\x57\x47\x2b\x14\x57\xce\xcb\xbf\x1f\x9d\xd5\x28\xa7\xfb\x26\x75\x0b\xa1\x01\x10\x07\xbd\x07\x9c\xfe\xdd\x06\x83\x2c\xd4\xe9\x36\xb8\x2b\xd6\x98\xd5\xe5\xd7\xe2\xa7\xb0\x1f\x96\x06\xce\x02\x8d\xf2\x5b\x22\x4e\x4a\x2a\xfb\xd2\xe7\x30\xf1\xc2\x33\x56\x83\x26\x73\x10\x96\x12\xc4\x21\xdb\xe0\xe8\xf0\xf8\x11\x82\xdf\xaf\x3c\xde\x25\xbe\x2e\xff\x56\xfa\x3b\x51\x02\x45\x3c\x68\x2a\x9d\x3f\xfd\x53\xe8\xf1\x4a\x04\x66\x01\x09\x22\x32\x88\x0b\x91\x43\xc1\xf8\x67\x64\x96\xdf\x9d\xf1\xd9\x36\xb6\x0f\xa3\xc6\xee\x5b\x3b\x12\xbc\x4d\xdd\x23\xfa\x55\x77\x4f\x4c\x1d\xdd\xf8\x98\xf6\x70\x1c\xa3\x9d\x07\x11\x19\xc4\x21\x3f\x8d\xb0\x40\xa2\xe0\xa0\x1f\x95\xb3\x9f\x63\x2f\x5d\x28\x13\x8a\x89\x8b\xf3\xab\xf8\xb6\xdf\x26\x70\xb8\x69\xb4\xe4\xf7\x40\xc5\x2b\x06\xb2\xc1\xcc\xdf\x14\xda\xf3\x77\x59\x71\x6e\x9f\xbf\xbb\xdc\x49\x7d\xb3\x7a\x66\x70\xec\xfd\x9a\xd4\xee\x81\x65\xff\x50\xf5\xab\x25\xae\xd5\xbf\x6d\x70\xa9\xf3\x54\x2e\x56\xc9\xa0\x4c\x69\xbc\xb6\xea\xe1\xe5\x37\x8a\xf3\x1c\x87\x68\x4d\x3f\x37\x9c\xad\x45\x17\x6b\xad\x4c\x0d\x49\xff\x3e\x51\x65\xf6\x4e\x56\xe6\x99\x95\xfa\xe1\x55\x95\x4f\x5f\x47\xf1\xf2\x46\x62\x95\xd4\xfe\xbc\xa8\x50\xef\xb3\xf3\xe4\xc8\x99\x4f\x0c\xfe\xaf\xd9\x60\xd0\xd0\xfe\xb2\xc1\xd2\x48\x36\x58\x69\x6d\x84\xb3\xb5\xd0\x9a\xef\x8f\x8a\xec\x46\xdc\x15\x89\x90\xf0\xbd\x87\x66\x1e\x28\xd8\x8b\xbb\x2c\x8d\xb6\x5e\x6c\x0c\x67\x71\x47\x82\x6c\x23\x92\x0d\x3e\x47\x8c\xde\x33\x33\xde\x42\x18\x1d\x71\xcb\x6e\xe2\x38\xd3\x22\x6d\xc8\x61\xfb\x72\x99\x74\xdc\x95\x2a\x81\x9b\xb3\xec\x57\xa5\xce\x64\x5b\x16\xd9\x06\xc7\xdd\x63\xcc\xf6\xd2\x5e\xdd\xb9\x46\x36\xbd\x62\x62\x55\x22\x10\xf4\xe9\xa7\xb5\xa2\xcd\x66\x79\x4c\x9b\x92\xaf\x89\x68\xff\x59\xd4\xe0\xcb\x35\x22\xdb\xe0\x5f\x1e\xbb\x3e\xb8\xfd\xae\xcc\x72\xaf\x2b\xe5\x87\xad\x6f\xdc\x66\x94\xc3\x2c\x79\x1d\x5a\xd8\x33\xbe\xa1\x32\x7d\xa4\x39\x44\x73\x26\xa3\x45\xb6\xc1\xd9\xdf\xc7\x03\x9f\x04\x1e\x63\x0b\xf2\x0a\xe7\xd7\xe3\x8f\x78\x7d\xdd\x72\xba\xfd\xdd\x83\xe2\x49\xd2\xf1\x6d\xf4\xd8\xa2\x8d\x33\xa8\xfd\x37\xf8\xdf\x34\x74\x5a\xe2\x7b\xeb\x6e\x73\xef\x79\xc7\xcb\xb7\x24\x6f\x0d\xb9\x39\xfb\x3c\x2e\x7b\xa6\x44\x4c\x2d\xf0\xc4\x1b\xf9\x92\x74\x62\xea\xe6\xed\x1b\x42\x8b\x14\x00\x07\x4f\x7c\x8c\xe4\xd6\xc5\x07\xf1\x1f\xc6\x6d\x34\x98\x12\x63\xbe\x3f\xed\xa0\xf6\xf8\xf0\x67\xe1\xad\x5c\xea\x26\x83\x7d\x6c\xc4\x02\x27\x1a\x54\x77\x0e\xe0\x90\xae\xa8\x9c\x5c\x68\x8d\xb0\xf4\x5d\x5d\xdb\x6f\x5a\xb7\x62\xaa\x93\xe8\xa2\x6b\x2b\xd7\x66\xe3\x2c\xb4\xff\xd6\xc2\x2b\xcd\xa6\x8a\x09\x55\x6e\x01\x38\x78\xe2\x23\x20\x89\x8d\xfd\x46\x16\x4c\xd9\x47\xb0\xd4\x7e\xaf\xfb\x4e\x8e\x7a\x0a\x85\x31\xfb\xb2\x97\xfe\xd4\x95\xba\xb5\xf3\x65\x51\x44\x88\xb8\x20\x0e\xde\x69\x97\xb0\xcf\xa5\xb3\x94\xeb\x22\xb6\x44\x8e\x96\xfd\x67\x6f\xda\x00\x8c\x2a\x51\x06\xdc\x39\xcd\xab\xc7\x05\x5f\xd9\x89\x6b\x57\x5f\x21\x3c\x10\x88\x83\xea\xc3\xff\xdd\x06\x83\x7e\xd0\xa7\x49\x40\x70\xfb\x7d\xdb\x07\x93\xd1\xdd\x07\x15\x0f\x1b\x50\x53\x0d\x85\x5e\xb0\xc9\x77\x33\xbe\x8f\xd5\x33\xca\x1c\xae\x6f\xfa\xc9\x05\x49\x00\xc4\xc1\x25\xf0\x8b\xe7\xa0\xa7\x76\x8d\x3c\x74\xcf\x61\x8f\x27\xee\xc0\x8c\x51\xe2\xed\x73\xda\xa6\x9e\xd1\x77\xc3\xaa\x1f\x34\x45\xb1\xbb\x5e\x43\x5b\x76\x00\x0e\x2e\x81\x91\x32\xce\xf0\x7e\x4b\xdb\x86\xe3\x77\x1b\x1c\xe6\x79\x43\xf2\xb6\x83\x81\xad\x8a\xcd\x8a\x2f\x9d\x96\x9b\xfa\x1e\x93\x26\x62\x21\xe2\x82\x38\xb8\x04\x4a\xce\xbf\xbe\x85\xc7\x93\xbb\xc5\x76\xe7\xc1\x4b\xab\x62\xf9\xc1\x1c\xda\xde\xc2\x88\x39\x3c\x1f\x56\x45\x29\xbd\x61\xf3\x08\x48\x02\x20\x0e\x2e\x01\x4c\x33\x1f\x7f\xd2\xd0\x57\xe9\x1f\x54\xab\x58\xdf\xe2\x4e\xc6\x7c\xee\x0a\x53\x14\xd6\xe5\x98\x10\xd9\xd5\xc1\xfb\xd8\xdf\x1b\x0e\xb5\x08\x00\x70\x50\x7d\xf8\xbf\xdb\x60\xd0\xcb\xf5\x34\x09\x8c\xe7\xf1\x96\x58\x87\x39\x65\xa8\xf9\xb0\x72\x1e\x11\xef\x93\xb4\xeb\x69\x72\xfe\xd0\x0b\xf3\x69\xb9\x36\x7d\x55\x4e\x91\x36\x0a\x31\x74\x10\x07\x97\x80\xb0\x34\xfd\x88\xf3\xbb\x85\x19\xbf\x1f\xe9\xfd\x25\xca\xc2\xb3\xd7\xf2\x1e\xa5\x8f\x52\x27\x7d\x94\xb9\x8a\xf3\xf0\xf2\x49\x05\x0a\x74\xde\x1e\xc0\x21\x5d\x94\x32\x8d\xfe\x67\xfb\x59\x69\xd3\xdb\x59\x4d\xe2\xbb\xba\x25\xf6\x5a\x6d\x6f\x31\x88\x98\xd0\xcd\xd2\xd5\x6d\xd7\x12\xe4\x2a\xa0\xf3\xeb\x20\x0e\x2e\x81\xbe\xbd\xb7\x15\x85\x33\x37\x23\x31\xdf\xf4\x04\x73\xb2\xe4\x25\x99\x48\x74\x0d\x5d\x13\xa0\x66\x7e\xe4\x32\x7a\x5d\xc0\x4d\x0a\x3a\xc0\x0b\xe2\xe0\x12\xa8\x24\x47\xa3\x3d\xbe\x4c\xf4\xbd\xfc\xb7\x3a\xd5\x81\xa2\x2b\x97\xa0\x90\xcc\xdd\x78\x62\x97\x4a\xf4\xf5\x11\xdf\x72\x63\xbe\x06\xc4\xf2\x17\xc4\x41\x75\xa1\x00\x1b\x0c\xca\x74\xa7\x69\xa0\xa1\xb6\x57\x54\x62\x34\xf5\xaa\xca\x36\x8b\xa8\xf1\x81\xb2\x7f\x81\x5f\xcd\xd3\xb1\x25\x8b\x35\x1e\x6e\x6b\x32\x37\xc6\x94\x79\xc4\xd8\x41\x1c\x5c\x03\x62\x9b\x5c\xae\x4c\x3e\x76\x2e\x6a\xa9\xc3\xdf\x32\x8b\x2b\x4b\x7c\xd7\x4e\xae\xd4\x18\x98\x64\xdc\xa6\xaa\x33\xcf\x64\x56\xf6\x47\xc4\x05\x71\x70\x0d\x38\xee\x49\xbc\x93\xa4\x08\xbb\x73\x72\xfd\xf3\x8c\x1c\xbd\x17\xb3\xb1\x40\x0f\xed\x89\xc1\xe1\x88\x0a\xb6\xf1\xc2\xc3\x16\x63\xa8\x96\x03\xc4\xc1\x35\xf0\xf5\xdb\xaf\xe8\x72\xdd\x85\xde\xca\xe8\x4b\x01\x8e\x16\xd3\x09\x5f\x19\x8b\xf1\x15\x8e\xbd\x1f\xd8\xfa\xae\x38\x33\x78\x70\x50\x22\xe2\x82\x38\xb8\x06\x52\xbc\x94\xd9\xd2\x70\x14\x8f\x42\xe7\x2e\xe1\xce\xff\xd9\x7a\xd6\xb0\x72\xbb\xcc\x4f\xe6\x67\x25\xfd\xe5\xe8\x61\xae\x59\x51\x5d\x84\x06\x40\x1c\x54\x17\x0a\xb0\xc1\xa0\x65\xc7\xa9\xa7\x42\x58\x28\x85\xa2\xef\xab\xf3\xdd\x71\x3b\x77\x9b\x7d\xf4\xfe\x56\xcb\x75\xad\xa5\xca\xbc\x12\x83\x96\x63\x6b\xf6\xde\x49\x17\x6d\x68\x27\x1c\xc0\x21\xf5\x5d\x08\x55\x2b\x44\x6b\x30\x67\x69\x9f\x16\xc6\x9a\xe9\x3f\x47\x8b\xfe\x44\x50\x82\xb6\x32\xa9\x88\xe6\x97\xd8\xbe\x36\x4d\x3e\xd4\x9d\x0d\xc4\xc1\x35\x20\xa8\x7b\xc0\x71\x33\x89\xcf\x7f\x53\x76\x6c\x58\xfe\xdc\x2b\x69\xa7\x67\xd7\x33\xf1\x4f\x46\x62\x71\xae\xb7\xe0\xab\x2e\x92\xa3\x42\xa9\x0b\xc0\xc1\x35\xb0\xdc\x27\xdf\xa7\x80\x6e\xa7\xcf\x8c\xae\xd1\x3b\x60\x9b\xe5\x52\x43\x2d\x44\xc7\x66\x1c\x27\x67\x78\x89\xac\x28\x57\x44\x19\xfa\x67\x18\xc4\xc1\x35\xb0\xc4\x8e\x97\xb6\x4d\xdf\x6f\xf7\xf5\xc1\x26\xd1\xcc\x1b\xc2\xdc\x4b\x37\x6f\x2e\x5b\xe0\xa6\xbd\x8a\x9d\x7c\x37\x2d\x55\x21\x59\x82\xd0\x00\x88\x83\xde\x03\x00\x1b\x0c\xb2\x50\xa7\xdb\xe0\x83\x4e\x7e\x36\xd5\x43\x12\xf2\xa6\xfc\x0f\x77\x76\x1b\x84\x36\x71\x8d\x44\xa9\x34\xb7\x5e\xd7\xac\xd4\x27\x87\xd8\x30\xb1\xba\x20\x2c\x25\x88\x43\xb6\xc1\x59\x85\x04\x23\x0f\x9d\x72\xf7\xf5\x3f\x60\xd5\xac\x55\x15\xd6\xbd\x47\xc9\x23\x94\x5a\x8c\xfd\xc1\x97\x2c\x6c\xaa\x7f\xe7\x0e\x26\x22\x32\x88\x43\xb6\xc1\xa1\xbc\xc3\x92\x23\x21\x71\x2c\x97\xc5\x1e\xcc\x25\xb4\xed\x6c\xab\x55\xd2\x6a\xfa\x3e\x79\xd0\x6a\x61\x90\x8e\xca\x25\xa1\x82\x81\x88\x0c\xe2\x42\xe4\x70\x60\x4f\x03\x23\x93\xa4\xf0\xd7\xe0\x14\xe9\xa5\xdf\x02\x9e\x47\x3b\xc6\xef\x02\xf0\xaf\x89\x98\xd0\x11\x0e\xae\x69\x6f\x8a\x6e\xc9\x7d\xa2\x83\x6c\x70\x4b\x06\x49\x1d\xdf\x15\xd9\xe6\xb9\x1e\x7d\x5f\x34\xc6\xe3\xc2\x6d\x03\xad\xd9\xf3\xf1\x25\x15\x61\xd9\x2e\x14\x5e\x8e\x26\xec\x7f\xdb\x60\x1a\x27\x23\x8e\xbd\x27\xbf\x0f\x4a\x63\xde\xff\x59\x34\x31\x18\xba\xb3\xff\xc5\xc0\x15\xfd\xc8\xc7\x96\xba\x84\x99\x3a\xb9\xe6\xf0\xef\xad\x4a\xd7\xbb\xe4\xb3\xd7\x2e\xaa\x5c\x88\xd8\xd7\x57\x4b\x5d\xee\xf9\xf2\xb3\xbd\x0e\xa5\x8e\x36\x20\x71\xa5\xfd\x28\x53\xf6\xf0\xfd\x7f\xcd\x06\x83\x86\xf6\x77\x6d\x30\x92\x0d\xae\x88\x75\x8a\xcc\xbc\x5b\x64\xc1\x73\xf7\x95\x5e\x42\xf2\xa5\x4d\xea\x7b\xdd\x02\xe7\x04\x12\x77\xa5\x99\x99\xe2\xf7\xd5\x1e\x2f\x9f\x85\x0d\x46\x51\x45\xaa\x48\xa6\x0c\xe8\x2a\x94\xd2\x39\x26\x1d\xdd\xcd\x10\x10\x9f\xe4\x9a\xd0\x3a\x09\x1d\xfc\xf1\xeb\xde\xda\x32\xe1\xb9\x92\xa3\x69\xdc\x33\xd9\x96\x45\xb6\xc1\x45\x0b\xb9\x86\xfb\x75\x78\x89\xbf\xac\xde\x36\x5d\x91\xbd\x3c\xc9\x27\xc3\xef\x4b\x61\xd2\x48\xb0\x64\xb6\x54\xa7\xc7\xa1\x87\x73\x26\xdb\xb2\xda\x48\x1f\xfb\x83\x09\xf5\x9a\xcb\x1b\x3c\xaf\x72\xc1\xf5\xec\xf5\xc7\x7f\xc2\xe5\x8b\xf1\x64\xf9\x4c\xb0\x28\xf6\x74\x78\x39\xfc\xdd\x64\xce\x62\xc7\x5d\x2e\x10\xd9\x06\x13\x4a\x38\xea\x51\x5a\x0c\x2d\x06\xd5\x29\x14\xb8\xc7\xf1\x2d\xcd\x13\xa3\xcd\xbd\xb2\xc7\x52\xcd\x51\x98\x6e\x8a\xef\x2c\xe5\x3d\x33\x1b\x0c\xd2\xd0\x69\x89\x8f\x40\xcd\xac\x57\x51\xa0\xd2\x2f\xc5\x25\xc1\x20\xbf\xfa\xe9\xdb\xf2\x4a\xcd\x55\xe6\x28\x2e\x7f\x85\x27\x22\x96\xaf\x28\x5f\x42\x15\x56\x20\x0e\x9e\xf8\x28\xdb\x15\x08\xe5\xbc\xb3\xa7\x77\x89\x33\xc6\xdf\x25\x66\xee\x5d\x7a\x1a\x1c\x26\x1b\xe6\x54\xc2\x88\x4d\x26\x71\x78\x15\x7f\x04\x11\x17\xc4\xc1\x13\x1f\x7b\x7d\xc4\xa4\x69\x2c\x63\xc9\x60\xdd\x8c\x92\x47\x04\x7e\xc5\x71\x0a\xd1\x47\xb1\xe7\x4a\x6a\xd8\x23\x9e\x3d\x19\x27\x5e\x8b\xd0\x09\x5e\x00\x07\x4f\x7c\x5a\xec\xeb\xae\xf7\xb6\x17\xef\x38\xdd\x36\x37\x9e\x30\x9a\x73\xcb\x66\x6b\x74\x91\x30\xd2\xb6\xef\xe8\x89\x51\x8b\x8d\x0e\x87\x16\xec\x20\x2e\x44\xe6\x9f\x2d\x2e\x1d\xaf\x8c\xba\xa6\x5f\xa7\x23\xfe\x9e\xbd\x75\x80\xb2\x54\x3e\x3d\x1c\xf5\x73\xdd\x80\xb5\x63\xe1\xf0\xb2\x25\x53\x55\x2f\x96\x2b\xc2\x03\x81\x38\xa8\x36\xf8\xdf\x6d\x30\xe8\x07\x7d\x9a\x04\xae\xd1\x29\xe2\xb2\x9e\x27\x7e\x1e\x2c\xfb\x54\xf4\x78\xce\xe0\xc5\xf7\x21\xf7\x6d\x2f\xdc\xa6\xfa\x65\x55\xb5\x72\x99\x4c\x33\xe8\x90\x31\x88\x83\x4b\xc0\xd7\x0e\x97\xce\xa4\x88\x2f\x34\x42\x2f\x9a\xd9\xf4\x8a\x4e\x56\x0f\xdf\xc3\x80\x2e\x99\x93\xa8\x5e\x2a\x6c\xbc\xe8\xc1\x52\xa8\xec\x1c\xc4\xc1\x25\x70\xa7\x76\xba\x77\x7e\xb1\x5c\x49\xaf\xe1\xf1\xcd\x75\xdd\x30\xbe\x8f\x0b\x84\x1c\x89\xf3\x5d\x9c\xd7\xf5\x1c\xa7\x6a\xa9\x9f\x9a\x23\xe2\x82\x38\xb8\x04\xba\x55\x4d\xad\x9e\xa7\x32\x0c\xf6\x3e\xef\xc9\x6d\xdf\xbb\x29\x43\x58\x96\xff\x02\x73\xc0\xba\x01\xbb\xeb\x55\x90\x6c\x7c\x04\x74\x2e\x1e\xc4\xc1\x25\xf0\xc5\x3c\x30\x61\xa6\x79\x8e\x86\xef\x29\x9d\xf7\x51\xb0\x87\x9a\x6e\x6a\x81\xa1\x83\x82\x63\xdc\xe0\x4a\xfc\xe1\xcd\x03\x14\xa8\x3c\x1c\xc4\x41\xb5\xc1\xaa\xff\x2a\x01\xd0\xcb\xf5\x34\x09\xd8\x5c\xe4\xcb\x91\x78\x96\xa6\x70\xc3\xdb\x80\xc0\x8a\xda\xe0\x4d\xcb\x2b\x5e\x01\xa2\x82\x5e\x9f\xc9\xc8\xae\x1f\xb5\x9b\xef\x07\x11\x43\x07\x71\x48\xa5\x06\x75\x0f\x94\x6c\x72\x50\xfc\x39\xd0\x0c\x30\x39\xd7\x33\xb6\x6e\x6f\xf7\x64\xa4\x2f\x39\x65\x54\xb7\x24\xe9\xaf\x9b\xf4\x46\x40\xa5\x06\x00\x0e\x2e\x81\x12\xdd\x65\xa7\xc5\x4f\x8a\x05\xa3\xaa\x8b\x3f\x7f\x37\x5c\xeb\x8a\xc6\x2d\xc5\xff\x35\x70\x4b\xb7\x96\x96\x8f\xab\xc2\x76\x1f\xfa\x33\x0c\xc4\xc1\x25\x80\x9d\x45\x53\x93\x25\x9d\x14\xd8\x29\x8f\x8a\xbb\x93\xd3\x55\x38\x17\x96\xfd\x96\x95\xc1\xdd\x5b\x57\x10\x47\x77\xd2\x94\x82\x14\x11\x17\xc4\xc1\x25\x50\x9a\x9f\x84\x86\x7a\x44\x47\x5f\x3c\xe3\x14\x1a\x1e\x2f\xcb\x3e\x35\x5a\xf5\x23\x6e\x23\x7f\xea\xd6\x7a\xf9\xd8\x20\x53\x66\x35\x62\xf9\x0b\xe2\xa0\x9a\x40\x80\x0d\x06\x65\xba\x53\x0f\x85\x98\xe9\x0f\xaf\xd8\x5e\xa7\x76\x57\x42\xdf\x71\x2f\x9f\xdd\x5e\xb4\x2f\x0f\x71\x8b\x8b\xf3\xff\xa6\x83\x53\x4d\x5a\x8f\x27\x01\x1d\x0a\x01\x70\x48\x5d\x17\x8c\xea\x36\xd1\x7c\x66\xde\x7e\xc2\xf3\xfc\x52\x49\xaa\xfd\x8c\xc3\x8d\xe3\xd5\xf1\xf8\xe8\xd4\x8a\xd8\xe5\x0a\xc1\xfb\xd2\xd0\x01\x53\x10\x07\xd7\xc0\xd7\x71\x52\x5e\xd4\xd5\xa7\xfc\xb3\x13\x0f\x47\x71\xd4\xec\xef\xa7\x3c\x7e\xf7\x66\xbf\x1b\xa3\xfe\x3e\xf6\x25\xd6\x8f\xc7\xaf\xd4\x21\xbb\x0a\xe0\xe0\x1a\x40\x41\xbb\xdb\x97\x3b\xdc\x1c\xeb\x24\x39\xd5\xf8\x83\xb1\x4d\x67\x66\xf0\xad\x14\x31\x3e\x73\xc2\xc3\x80\xbb\xbf\x73\x55\xa2\xa4\x11\x71\x41\x1c\x5c\x03\x77\xb4\x69\x57\x67\x34\xc2\xf6\xe2\x5d\x6f\x2a\x1f\x5c\xf3\x7a\xd5\xa4\x10\xbb\x9e\xe8\xa5\x38\xaf\x82\x7a\x9e\x33\x74\xcd\x72\x02\xa1\x01\x10\x07\xd5\x06\x6b\xff\xbb\x06\x40\xcb\x8e\xd3\x34\xa0\xdd\x83\xfd\x34\x6c\xee\xeb\x31\x07\x9f\xa8\xe7\xc5\x97\x8f\xfb\x93\x3e\x36\x95\x7b\x1f\xd1\xb7\x33\x98\xe6\x79\xc6\xe6\xd9\x43\x2d\xa7\x40\x1c\x5c\x03\xee\x26\x0c\x4d\xf7\x88\x1b\x36\x51\xea\x9f\x91\xb6\x39\xd8\x5c\x19\xdf\xde\x27\x77\xf3\x7d\x1d\xd7\xac\xd8\x1d\x41\x31\x60\x00\x9d\x0a\x01\x71\x70\x0d\xb8\x64\xaf\x6b\xcd\xd2\x36\x3d\x9e\x76\x89\x65\x23\x68\x1e\x4a\xbc\xf7\xd9\xfc\xd8\x4d\x23\xea\xdd\xb6\x3a\xad\xfc\xbe\x6a\x89\x00\xd4\x4c\x1c\xc0\xc1\x35\x90\x24\x9b\xbb\x4c\xfd\x89\xf0\xba\x8e\x7b\x19\x81\x0f\x07\x81\xc4\x9f\xcd\xb0\x12\xa6\xd4\x9b\x55\xaf\x66\x3c\xd3\x06\xc7\x2c\xad\x10\x71\x41\x1c\x5c\x03\x1d\x61\xd9\x2d\xa6\x34\x72\xaf\xea\x12\xbd\x8a\x8c\x96\xa9\xe3\x66\xbf\x16\x3f\x0a\x0a\x38\x99\x7a\xeb\x4d\xf5\x74\xef\xcb\x64\x10\x74\x65\x28\x80\x83\xde\x03\x00\x1b\x0c\xb2\x50\xa7\xdb\x60\x6b\x0f\xd5\xdb\xac\x51\x31\x85\x54\x6f\x59\xea\xd3\x5a\xf3\x3e\xfd\x48\x23\x24\xdc\x10\x2a\x97\x8d\xe3\x66\x75\xf3\x92\x1e\x2f\x47\x58\x4a\x10\x87\x6c\x83\x55\x32\x97\x2f\xa7\x05\x4a\x1c\xbd\x34\x53\x9f\x32\x9d\x7d\x64\x35\x66\x77\x03\x73\xc4\x6a\xe5\x5b\x9b\xae\xff\xcf\xb2\x6e\xc7\xe7\x50\x2b\x71\x00\x87\x6c\x83\x4d\x0a\x82\xb8\xb1\x6c\x86\xac\x3c\x36\x9f\xeb\x7d\x2f\xad\x42\xad\x29\x1d\x08\x44\xaf\xcb\x2c\xb8\xfb\xb3\x31\xb5\xf6\xb8\x1a\xfa\xce\x20\x2e\x44\x8e\x08\xf6\x34\x9a\xc4\x5a\xb0\x6c\x27\xc3\x6d\x14\xa5\x27\x55\x0b\x0b\x5e\x19\xe9\xe7\xd1\x13\x17\x2b\xe7\xdf\xa5\xf9\x4e\x70\x4f\x95\xd9\xd8\x03\xb2\xc1\xf3\xe6\x87\x57\x67\x6c\xcc\x27\x8a\x2e\xa3\x31\x0c\x4c\xdd\x1b\xcf\x35\xea\x2e\xf0\x08\xc5\x8e\x94\x3b\xfc\x61\x75\xa2\x37\xf9\xe2\x6f\x1b\xdc\x57\x9e\xb9\x74\xed\xba\x31\xd5\x39\xb3\x99\x76\x93\x87\xc1\xe8\xee\x23\xf9\x0e\xd8\x24\x62\x97\xa5\x8d\x8e\x0c\x5a\x47\xb7\x58\xff\x42\xcb\xc3\x7a\xff\x6c\x99\xde\xf0\x8d\x7e\x2b\x9b\xa6\x62\xb4\x5b\xf1\xaa\x4e\xb6\xf1\xb9\xc5\x56\x85\x84\x8a\xc0\xa0\x97\xaa\x8d\xcb\x7f\xcd\x06\x83\x86\xf6\x77\x6d\x30\x92\x0d\x2e\x6a\xbd\x6e\xf3\x1e\xf7\xde\xd7\x81\x73\xb9\xea\x33\x39\xac\x24\xeb\xbc\xd9\xe2\xdd\xc1\x37\xb6\x31\xca\xbe\xe2\x18\xba\xd1\xcf\x9f\x85\x0d\x96\x46\xb2\xc1\xd6\x22\xf3\x73\xef\x2d\xcc\x2f\x3b\x1f\x92\x46\x48\x15\x13\x3c\x23\x79\x87\xd7\x8d\x43\x4e\x2b\xf2\xd0\xf4\x3a\xa5\xde\x35\x1e\xf5\x33\xd9\x96\x45\xb6\xc1\x9f\x71\x7e\xfe\x5c\xdc\x64\x95\xc6\xd8\xc5\xd2\x62\xd5\x96\x16\xa9\xd6\x3c\x57\x2b\x90\xf8\xb5\x91\xf3\x96\x25\x3e\x7b\xf3\xd0\x99\xdc\xd7\x26\x8d\x6c\x83\x17\x74\xd2\xb7\x14\x28\x3c\x12\xdf\xf9\xac\xb8\xdd\xad\x9c\xff\x49\x79\xd9\x6a\x82\x94\xe6\x4a\xe6\xdd\x19\xe9\x84\x96\x95\xa8\xed\x33\x19\x2d\xb2\x0d\x9e\x66\x18\xe0\xc4\x56\x7e\xfe\xfa\x66\xbd\xc9\xd3\x66\x1b\xcf\xaf\x5f\xa2\x39\xb0\x32\x1a\x12\x32\xe8\xc2\x69\x0c\xbf\xb9\x3d\xbc\x77\x66\x36\x18\xa4\xa1\xd3\x12\xdf\x36\x76\x3f\x7e\x6f\x2b\x99\x5b\xab\xc4\x8c\x93\x1c\x85\x73\x8f\xc2\x9b\x5a\xc6\xc3\x6e\xc9\x05\x86\xe3\xb0\x36\x8c\x3a\x33\x68\xd7\x16\xc4\xc1\x13\x1f\x51\x67\x47\xbb\xc4\xac\xe1\x34\xaf\xf9\x27\x62\xcc\xde\xb9\x4f\x1d\xe1\xb6\x1b\x9f\x24\x55\x2c\x29\xe6\x22\x84\xb6\x6c\x8d\xa0\x63\x8b\x20\x0e\x9e\xf8\x28\x99\x15\x39\xb4\xc6\xbf\xe4\x14\x30\x18\xc9\x17\x9e\x1b\xf3\x66\x91\x7b\xab\x75\x58\xdb\x40\x91\x1f\x77\xd8\x75\x32\xa1\x08\x1d\xaf\x02\x71\xf0\xc4\xc7\x1f\x40\x16\xf1\x2b\xb7\x84\xe0\x81\x72\xc9\x98\x20\x75\x5f\x3c\xfa\x15\xa2\x4e\x8e\xed\xee\xa4\x0f\x9b\x77\x32\xe8\x66\x84\xa0\x84\x0a\xe2\xfe\x2f\x41\xfd\x1d\x77\xfe\x9a\xca\x84\x3c\x59\xf7\xc3\x97\x58\xd7\xdd\x0c\x30\x48\x66\x49\x14\xae\x3e\x0b\xbe\xe6\x3c\x48\xee\x7d\x41\x2a\xe0\xf1\xf0\x08\xc2\x03\x81\x38\xa8\x36\xf8\xdf\x6d\x30\xe8\x07\x7d\x9a\x04\xec\xf3\x1f\x84\x8a\x71\xe0\xf0\x3f\x0d\x11\x64\xe5\xf0\xeb\x75\xc7\x29\x54\xe4\xcd\x74\x60\x2f\x37\x8e\xdf\xba\x71\x40\xeb\x03\xad\x27\x41\x1c\x5c\x02\xb2\x4e\xcf\x04\xa4\xd2\x09\xce\xf3\xde\x12\xb2\xd0\x7c\xcc\xa6\x72\x32\x17\x84\x9f\xfd\xd5\xcf\xdb\xa6\x93\xa9\xea\x7a\x3a\x39\x54\xbc\x07\xe2\x90\xba\x8e\x11\x6e\x07\x4a\xd4\xdd\xb8\xa2\x9a\x10\x32\x6b\xb3\x93\xa8\x82\x6b\xdf\xf5\x60\x28\xdb\x19\xc5\xf4\xcd\xf1\x2a\x7e\xd0\x0d\xa8\x2f\x0a\x88\x83\x4b\x00\x43\xca\xfb\x52\x73\x61\x40\xbc\x99\xba\xde\x2c\x2e\xee\x65\x15\x97\xa3\xf3\xb7\xdf\x18\xdc\x8a\xec\x18\xd1\xd0\xbe\x3a\xe5\xc7\x86\x88\x0b\xe2\xe0\x12\x68\xcd\xbb\x10\xbc\xb6\x4e\x42\x12\x61\xaf\x4a\x1b\x2e\x35\x89\x41\x70\x23\xe4\x80\xad\xed\xbc\x1a\x87\xc8\x3d\x77\xd3\x57\x0d\xf4\x08\x09\x80\x38\xa8\x36\xf8\xdf\x6d\x30\xe8\xe5\x7a\x9a\x04\x76\xe2\x5b\x24\x89\x57\xa4\xa3\xae\x05\x04\x3c\x6a\xf4\x6d\xf6\xb0\xac\xbe\x9e\xaf\xc0\xe7\x5b\xe9\x48\xfa\x44\xad\x5b\xcb\x15\xba\x25\x19\xc4\xc1\x25\xa0\xf6\x3a\xf1\x95\xeb\x4e\x93\x64\xe2\xe7\x84\x3d\xc9\x47\x49\x57\x9c\x43\x72\x7f\xdf\xde\x53\xfd\x2a\xef\xf6\x63\x83\xee\x93\x4c\x33\x22\x2e\x88\x43\x3a\x0c\x69\x19\x7e\xbe\xb3\xff\x83\xe2\xa7\x2b\xfd\x6d\x46\x8c\x2d\x3a\xf7\x86\x6c\x6f\x90\x76\xe0\xd7\xd6\xfa\x5f\x26\xda\xa9\x20\x7c\x05\x1d\x86\x04\x70\x70\x09\xf8\x09\x34\xfe\x11\x7c\x20\xeb\xf0\xf5\x30\x99\xa8\x64\x21\x52\xe3\x82\xdd\xa8\xe7\x9d\xcf\x47\xcc\xec\x57\xdc\x15\x51\xb0\x76\xa1\x3f\x05\x41\x1c\x5c\x02\xb3\x1b\xd1\xf4\x37\xbc\x84\xcb\x57\x9f\x4c\x44\x5a\x3b\xcb\xf2\xfa\x7c\x31\xeb\xfd\x7d\xf3\x52\x9f\x6c\x5c\x56\x06\xbe\x84\x39\x1d\x62\xf9\x0b\xe2\xa0\x9a\x40\x80\x0d\x06\x65\xba\xd3\x34\x80\x6a\x28\x12\x29\x73\x43\xe7\xe5\x5a\x94\xf2\x2e\x95\x66\xf1\xdb\x1d\xec\x3d\x94\x6b\x55\xbf\x1e\x3e\xee\x64\xda\x5a\xf6\xa9\x8d\x47\x8c\x1d\xc4\xc1\x35\x50\x84\x71\x8b\xfc\x67\x7a\x13\xee\xb3\x2f\x84\x22\x98\x54\x72\xef\xf2\x97\x32\xd5\xbe\xd9\x70\xfa\x92\x93\x61\x5a\x2c\x53\x53\x6d\x22\xe2\x82\x38\xb8\x06\xf6\x46\xbd\x19\xf0\x88\x0c\xe6\x7d\xfd\xee\xca\x63\x56\x3b\x92\x7c\x6d\xdc\x79\xfb\x86\xed\x43\xcf\xf7\x6a\xd5\x6d\xbf\x5b\x3a\x49\x88\xb8\x20\x0e\xae\x81\x5f\x6c\x2f\xf1\xa9\x9e\x0c\x6c\x86\x84\x6c\xbc\xd6\x37\xfc\x71\x3f\xd5\x30\xc9\x83\x03\x43\x83\xfa\x0e\x5f\xd5\x40\xce\xcd\x7e\x57\xe8\x10\x0b\x80\x83\x6b\xc0\xc0\x51\xe3\x85\x28\x71\xcd\x11\xa7\xba\x3e\x1a\xaf\xa0\x0c\x8b\xa1\x68\x80\x83\xd3\x5d\x36\x82\x31\xab\x95\xc9\x54\x3d\xa5\x3b\x08\x0d\x80\x38\xa8\x36\x18\x60\x83\x41\xcb\x8e\xd3\x34\xd0\x67\xf5\x2e\x49\xe3\x9e\x46\x7f\xe1\x3a\xeb\x28\x79\x7f\xbf\xe1\xd4\xb9\xab\x0b\xda\xb6\xb5\xc3\xa8\xe2\xbd\xdf\x29\xdd\xee\xc7\x40\xa7\x21\x00\x1c\x5c\x03\x97\xd9\x42\x2e\xa6\xdd\x43\x17\x5e\x99\xcf\xeb\x25\xc2\xd4\xb2\x9c\x79\xd8\x6b\xa4\x65\x9f\x29\x4b\x2b\xc6\x6e\xd0\xf8\x4d\xe2\x21\xd4\xce\x01\xc0\xc1\x35\xa0\xf0\xd9\x39\x30\xe4\x1e\xb9\xa8\x91\xaf\xb8\x7b\x0d\xbd\xfc\xc5\x9f\x56\x8a\x9a\x6a\xdf\x49\xc3\x05\xa9\xb9\x2d\x77\x8b\x76\x20\x7b\x0d\xe2\xe0\x1a\x18\x2c\xcc\xf6\x0e\x1b\xc9\xde\x7b\x2e\xcc\x6e\x40\x73\xb4\xaa\x55\x14\x81\x11\x89\x46\x71\x4d\x68\x88\x81\x6d\xc1\x7d\xb0\x7f\x1a\x11\x17\xc4\xc1\x35\xe0\x16\x74\xee\x86\xed\x50\x0d\xf1\xa4\x31\xd5\x60\xf7\x4e\xf9\x72\xc4\x70\xd0\x86\x50\xba\x9e\x75\x81\x21\x29\x63\xcf\x5d\x71\x5e\x84\x06\x40\x1c\xf4\x1e\x00\xd8\x60\x90\x85\x3a\xdd\x06\x0b\xfe\x64\x1d\x61\x96\x5b\x0f\x5d\xa1\x10\xf0\x9e\x6a\xd1\xe0\x32\x4a\xcd\x11\x22\xda\x11\x57\xa9\x1e\xbd\x9a\x51\x8c\x85\x47\x8f\xb0\x94\x20\x0e\xd9\x06\x0f\xd4\x30\x6e\xef\x2a\xfd\x44\x19\x1b\xc3\x7a\xb0\x6d\x74\x8b\x38\x0d\x1b\xfb\xbc\x84\x78\xa6\x5c\xc7\x4f\x5d\x14\xb4\x6b\x95\xa4\x88\xc8\x20\x0e\xd9\x06\x5f\xf9\x44\x5a\xed\xc0\xe8\x3e\xf7\x1a\xa3\xc5\xdd\x84\xa4\xaf\x0b\x5f\x06\x13\xaf\xc6\x89\x8d\x4f\xe8\xd5\x27\x7a\x67\xbb\xd8\x44\x44\x64\x10\x17\x22\x27\x0d\x7b\x1a\x3e\x58\x23\x91\x49\x53\x11\xb2\xc4\x3b\xb9\xc1\xba\xda\xea\x1a\x09\xad\x18\x96\x89\x58\x7a\xd3\x3d\x1f\xf4\xd5\x0b\xef\xe8\x12\x42\x36\xf8\x19\x83\xba\x79\xab\xab\xaa\xb1\xf7\xb9\x71\xad\xe1\xf3\xdf\xbf\x04\xd2\x44\xfe\x98\x5d\xd6\x7e\x92\x61\xd0\x34\xa0\x9b\x27\xf8\x8f\xdb\xd2\x55\xf4\xc4\xa7\x33\x52\x7f\x87\xb2\x7f\x79\xd0\x19\xb0\x3f\xa2\x22\xd8\x8a\x73\x37\x06\xe5\xc0\xf9\x7e\xa6\x51\x00\xb5\x6c\xd6\xdf\xe7\x61\x59\x7e\x31\x35\x74\x56\x48\x5c\x99\xcc\xc0\x10\x7b\xd7\xf0\x86\x0a\x2d\x45\xfc\xed\xc3\x8b\x37\xb4\xa4\xdd\xb1\xf4\xd7\x3c\x44\x5b\xff\x6b\x36\x18\x34\xb4\xbf\x6b\x83\xe5\x90\xda\x09\x53\xc5\xb8\xf4\x6d\x14\x3c\xa6\xdf\xe8\x10\x65\x0f\xc8\xf7\x42\x73\x30\xe4\xcd\xff\x2c\xd0\xbc\x93\x39\x4f\xe6\x61\x5e\x98\x7c\x16\x36\x38\x10\xc9\x06\x9b\x5c\x6d\xa1\xd2\x08\xd4\x6d\xda\x6d\x2c\x2e\x91\x7e\x54\x40\x81\xd7\xdc\x71\x19\x75\xd8\x86\xb6\xe3\xf1\x1d\x0f\x3e\x7f\xf2\x80\x33\xd9\x96\x15\x47\xbe\x34\x6b\x63\x4f\xb3\x15\x9f\x28\x79\x56\xab\x79\xaf\x36\x93\x83\xb3\x48\xf6\x8a\xca\xa7\x90\x16\xfe\xab\x3c\x33\x86\x12\x1f\x44\x83\xce\x64\x5b\x16\xd9\x06\xd7\x3f\x7c\x26\x6f\x4a\x48\x47\x93\x6d\xc6\x93\xcf\xfa\x7d\x2d\x9d\xb3\x80\x6e\x65\x61\x85\x73\x64\xe2\x7d\x5c\xb6\x8b\x12\xc6\xcf\x33\x19\xad\x33\xd2\xc7\x3e\x50\xea\x96\x1f\xbe\x8d\x85\xce\x79\xb7\xd6\xd2\x64\xb9\x9c\x37\xf7\xf6\x35\x92\x43\x33\x25\x4e\x8f\xcb\xd7\x48\x26\x03\xa2\xf6\xce\xcc\x06\x83\x34\x74\x5a\xe2\x7b\xa3\x1b\x5c\x66\x82\x19\x78\x52\x92\xbb\xb5\xfa\x9c\x8e\x9c\xc4\x23\x54\x87\x32\x63\x59\xa2\xbb\x70\x6b\x1d\xcd\x21\x4f\xe1\xff\x35\x85\x01\x70\xf0\xc4\x87\x43\xe2\x6d\xc2\xcc\x66\x4d\x64\xed\x2d\xf9\x87\x75\xc3\x55\xe7\x4a\x01\x49\x99\xab\x25\xfe\xac\x70\xf2\x8d\xba\x02\x57\x6f\x39\x44\x5c\x10\x07\x4f\x7c\xac\xca\x1e\x0f\x23\xde\x17\xb0\x52\xdc\xc9\xb7\xfd\xd5\x7d\xb2\x15\xae\x23\x10\x1e\xf7\xbc\x98\x6a\xfc\xe6\xb3\x6b\xd3\x19\x4f\xef\x20\xe2\x82\x38\xf8\xff\xb4\xcc\xe9\x28\x6d\xd2\x38\x8c\xfd\x38\xbf\x7d\xeb\xbc\x0a\xea\x87\x62\x28\x54\x42\x14\x9a\xa3\x2f\x66\x1f\x98\x33\x2c\x2b\x7d\x86\xf6\xad\x40\x1c\xfc\xf9\x06\xd1\xef\xd4\x45\xae\x6e\x4c\xf1\x69\x9a\xbc\x7c\xa3\x61\x2c\xb6\x26\xfc\x41\xc1\xda\x5d\xab\x89\xf6\x47\x7b\xd2\x94\x33\x3d\x0e\xc2\x03\x81\x38\xa8\x36\x58\xee\x5f\xd7\x3e\xa0\x1f\xf4\x69\x12\xb0\x6d\xed\xf9\xc2\x54\x95\x95\xa6\x2e\x6c\x7a\xff\x11\xbd\xcf\x8a\xc0\xc5\x6a\xd5\x0f\xf2\xfb\x2d\x92\x99\x86\xe4\x57\x1c\xbf\x42\xfd\x91\x40\x1c\x5c\x02\xae\x2c\x23\x25\x52\x94\x92\xf8\x51\x0b\xa6\x15\x66\x62\xcc\x45\x12\x18\x05\x0d\x54\xc4\x51\x26\xf7\x7e\x51\xf5\xa1\x7d\xd5\x58\x42\xc4\x05\x71\x70\x09\x68\xc9\x0e\xa7\x9d\x77\xb8\x35\x54\xaa\xc5\x9d\xf0\xac\x3f\xab\x4d\x3a\x6d\xa6\x3b\x91\x3f\x81\xcf\xf6\xf9\x41\xcd\xb2\xa3\x9b\x17\xb4\x71\x0f\xe0\xe0\x12\xa8\xab\x23\x53\x60\x4e\xc3\x6b\x71\x70\xd1\x90\x7e\x34\x1e\xba\xda\x8b\x13\xb6\x50\x33\xb7\x79\xf0\x66\x99\x96\xca\x8f\xa0\x3d\x01\x11\x17\xc4\xc1\x9f\xef\x05\xce\x59\xaf\x12\xb1\xa7\x03\x15\xe8\xa8\xbc\x25\xf6\x28\xbc\x58\x77\xb6\xab\xed\x64\x0a\xfa\xed\x1c\x42\x83\xc8\x9f\xdf\x47\x47\x48\x00\xc4\x41\xb5\xc1\xff\x6e\x83\x41\x2f\xd7\xd3\x24\x90\x68\x1a\x2c\xdc\xd1\x10\xb6\xb5\xb8\x71\x9d\x9a\xec\x6a\x35\xbe\x1f\xff\xcf\xbb\x2a\xb3\x8d\xb4\x8f\x75\x97\xa2\xb5\x82\xfb\xa0\xa5\x3f\x88\x83\x4b\xa0\xc1\xc0\x42\xa1\x03\x57\xb7\x55\xa7\xb6\x61\x72\xfd\xb9\xbe\x71\x5e\xc9\xc7\xc6\x47\xd1\x8c\xf6\x07\x4b\xc4\x96\xad\xa3\xbc\x16\xd0\x41\x5b\x00\x07\x97\x00\xa9\xb7\x64\x78\x44\xce\xc0\xf4\x07\x27\x5a\x9e\x82\xb7\xc1\xec\x1e\xa5\x2c\x52\xb2\xcb\x34\xca\x5f\xe2\x76\xe9\x19\x6e\x79\x43\x87\xa2\x41\x1c\x5c\x02\xf5\x51\x5d\x27\x61\x82\x43\xf8\xeb\x6b\x73\x8b\x06\xe4\x61\x3a\x2a\x9b\xe6\x2e\x5b\xc4\x95\x03\xb9\x23\xa2\x0f\xa9\x1b\x8f\x8d\xa0\x1d\x51\x00\x07\x7f\xbe\x1c\x53\x7a\x64\x82\x53\xb9\x92\xaa\xca\x28\xf4\x5c\x0f\x9f\xb5\xb8\xcf\xb0\xf3\x98\xb8\x1f\xb9\x68\x93\x2b\xc4\x29\xb0\x75\xa6\x20\x96\xbf\x20\x0e\xaa\x09\x14\xff\x77\x0b\x04\xca\x74\xa7\xb6\x47\x3a\xe6\xa3\xeb\xa8\x23\xde\xa7\x18\x2e\x67\x7b\x4d\xab\x34\x86\x8f\xfd\xfc\xc0\xed\xf9\x38\x65\x4c\x23\x7d\xbb\xfe\x64\x11\x74\x17\x1d\x88\x83\x6b\x20\x67\x36\xcf\x3a\x65\x57\x52\x87\x5c\xa4\x0d\xcd\xb1\x7a\xf8\xe3\x62\xe7\xf1\xc1\xcc\x2f\x03\xf2\x9d\x07\xc7\x7c\x37\x45\xe8\x66\x10\x71\x41\x1c\x5c\x03\x39\x2e\x18\x2f\x9f\xc7\x37\x9f\xaf\x78\x63\x4d\x40\x39\xad\x8e\x2b\x4a\x38\x3b\x72\x6b\x6e\xd4\x73\xd6\x21\xdb\x6e\x2f\xd0\xff\x25\x14\x17\xc0\xc1\x35\x70\xbc\xe9\xbf\xfa\xfa\xbd\x99\x07\xaa\x37\x06\x91\x3d\x0a\x3b\x7f\xd0\xc7\xf9\x4f\xc5\x7a\x84\x75\xd7\xf2\x31\x18\xbf\x35\x2f\x75\x21\xe2\x82\x38\xf8\xf3\xc5\x9f\x1b\xa6\xbd\x2b\x1e\xaa\xa1\xfa\x07\x85\xe0\x75\x56\x26\x95\x61\xd5\xd3\xee\xce\x83\x37\x5d\xa9\x04\x86\x22\x9b\x92\xc5\xc7\x08\x0d\x80\x38\xa8\x36\x18\x60\x83\x41\xcb\x8e\xd3\x34\x10\x6a\xde\xdc\x41\xcc\x83\x65\xa7\xf7\xd4\xfe\xdd\x3e\x91\xa7\x62\x50\xaf\x13\xc7\x4e\x30\x0d\x73\x89\x83\x22\x89\xde\x67\x6e\xa8\x95\x15\x88\x83\x6b\x40\xe1\x96\x7b\x4d\xd0\xb7\xaf\x56\x23\x55\xf7\xef\xf8\xe5\xb4\xf8\x39\x3c\x62\x62\xe7\x7a\xb2\x57\x57\x3e\xcb\x42\x72\xfc\xac\x13\xea\xbe\x0d\xe2\xe0\x1a\x18\x97\x7b\x50\x3e\x69\xc1\xcc\xae\xf8\xc5\xf3\x35\xef\xe3\x99\x60\xcf\x55\xa7\xdd\x18\x19\x4c\x51\x2b\x51\x81\x51\x67\xcb\xeb\x78\x50\x31\x07\x80\x83\x6b\x00\xef\x20\x05\x77\x56\x71\xf3\x5e\xa6\x0f\x25\x03\xd5\x91\xf7\x92\x86\x11\xd9\x17\x4e\x37\x4f\xcf\x20\x31\xb3\xc3\xc4\x17\x82\xd0\xe5\x61\x20\x0e\xfe\x7c\x9f\xfb\xc9\x5f\x91\x8c\x09\xca\xc2\xdc\x1a\xa7\xfa\xb4\x6a\xcb\xdd\xca\x29\x4c\xd8\xbc\x76\xc7\xbe\x83\xb5\x31\x72\x3b\xed\x72\x0e\x42\x03\x20\x0e\x7a\x0f\x38\xff\xbb\x0d\x06\x59\xa8\xd3\x6d\xb0\xcb\xa3\xd6\x39\x02\xdb\x45\x85\xf9\x65\xe2\x2d\x05\xab\xdb\x4a\x44\x69\x85\x8f\x3b\x7e\xbc\xfc\xc1\xb3\x52\x91\x60\x6a\xab\x95\x87\xb0\x94\x20\x0e\xd9\x06\x77\x0c\xe1\x13\x3a\xf2\xa7\x2a\x26\xa3\x1e\x7a\x87\x33\xf0\xed\xba\xe6\xad\x5f\xa1\x5d\x2b\x0b\x37\x75\x78\xb5\xdc\x37\x11\xbd\x86\x88\x0c\xe2\x90\x6d\x70\x79\xfd\xa7\xd9\xcc\x3b\xbb\x04\x26\xb1\x09\x6d\x8a\xdb\x1a\xe2\x1f\x0d\x7f\xff\xf0\xc6\x0b\xe5\x91\x53\x78\x33\x79\xe9\x95\x57\x2c\x22\x32\x88\x0b\x91\x43\x41\xfd\x67\xe4\xa7\xc6\x92\x37\xf4\xdf\x71\x3b\xee\x5d\x32\x20\x18\x2b\xfe\x61\x2f\x50\x4e\x98\x1f\x4b\x31\xac\x3d\x5c\x66\x51\xf2\x3d\xa1\x85\x1b\xb2\xc1\x21\x46\xd7\x7f\x6c\xe8\x7f\x78\x72\x6e\x76\xeb\xe3\xe2\x1f\xf9\xf0\xae\x8b\x25\x56\x82\xf2\xe2\x37\x7e\x57\x5c\xfa\xfe\xb8\xcc\xdc\xe5\x6f\x1b\x4c\x3b\x15\x74\x55\x75\x94\xaa\xf0\x13\x89\xcb\xbb\x3b\xd8\x31\xe7\xc8\x95\x1a\x3e\x3b\x67\x65\xe5\x70\x3b\xd6\x73\xcf\x3c\xaf\xf3\xf8\x0b\x4d\x20\xa6\x2e\x8d\x22\x71\xa1\x89\xb8\x8d\xf7\x25\xe4\x70\xa6\x91\x28\xb9\x49\x88\xb3\x47\xe5\x42\x9b\x70\x26\xc6\xd3\x4f\xdc\xff\x39\x1b\x0c\x1a\xda\xdf\xb5\xc1\x48\x36\xb8\xa8\xbe\x23\x5a\x6f\xea\x3c\x7a\x9f\xdd\xed\x74\x86\xfb\xeb\x8e\x7e\x7c\xc9\x56\x79\x4c\x9c\x1b\x59\x76\x17\xf3\x32\x4c\xb8\xce\xa2\x6e\x55\xb6\x11\xc9\x06\x1b\x96\x34\xf7\xca\xa1\x0e\x60\x75\xf6\x34\xb8\x58\x86\x52\xcb\x27\x33\x6f\x90\xe4\xc5\x78\x2e\x1d\x1a\x9b\x5a\x58\xff\x60\x8e\x3f\x93\x6d\x59\x64\x1b\xbc\x8d\xb5\xb0\xc4\x6e\x7e\xcd\x9a\xbf\x3b\xea\xa1\x46\x57\xd7\xf2\x09\x7a\xe9\xb0\x42\x85\x17\xc7\xcb\xc9\xea\x81\xf8\xcd\x82\xd0\x33\xd9\x96\x45\xb6\xc1\x7b\xa6\x82\xb3\x1b\x5a\xb9\x0c\x62\x31\xcf\x3f\x7a\xd7\x99\xde\xc1\x27\x68\x49\xc4\x4d\xcc\x2c\xc9\x3a\x11\xe4\x37\xb8\xac\xe7\x74\x26\xa3\x45\xb6\xc1\x5e\xd1\xc1\xfc\x4c\x66\x74\xc2\x18\xaa\xf4\xf7\xdd\x4c\x3d\x4c\xf9\x12\x9a\xdf\x15\x37\x60\x8e\x9e\xbc\x7f\xf7\xf3\x36\x8e\x1b\xdb\xd9\xed\x06\x03\x34\x74\xea\x02\x78\xdd\xf5\xd5\x06\xf6\x7a\x36\xa1\x03\xea\x86\xbe\xdd\xc9\xcb\x6a\x25\x8a\xb2\x71\xc9\x3e\xd5\xb1\xed\xe6\x46\xe1\xb1\xb9\x2f\xd0\x02\x18\xc0\x21\x1d\x87\xbc\x80\xa9\x4d\xe0\xa8\x75\x49\x69\x25\xc7\x57\xcd\x26\xad\xc7\x50\xdd\x20\xcc\x8a\xec\xfa\x50\xf5\x98\xfb\xed\xbc\xf7\x36\xb1\xd0\x71\x48\x00\x07\x4f\x7c\x69\x3b\xac\x81\x09\x0d\x8f\xbf\xd7\x97\x92\xcb\xa8\xaa\x52\x5a\x6e\x37\xb3\x60\xbc\xbd\xab\xd4\xa1\x4f\x79\x55\xa4\xdd\x25\x03\xda\x5f\x02\x71\xf0\xc4\x47\x25\x31\x5b\xbd\x29\x82\x1a\xdb\x57\xf1\x4c\xcc\x04\xbd\xe8\x57\x08\xaf\xe9\xe8\xc9\x1f\x4a\xa9\x0b\x14\x8b\xdd\x5b\x73\xe4\xd0\x2e\x33\x88\xfb\xbf\x04\xf5\x77\xdc\xab\xcb\xe5\xbf\x1d\x98\x0a\x39\x7a\x50\x37\x7c\xb6\xf8\x6d\xdd\xa4\x5b\xd5\xf3\x1c\x6b\x1d\x1e\x5c\x9d\x93\x5c\xb1\xa6\xfd\xa0\x82\xf0\x40\x20\x0e\xaa\x0d\xfe\x77\x1b\x0c\xfa\x41\x9f\x26\x81\x62\xdc\xe7\x52\xcb\xcd\x5f\x45\xb9\x0d\x7c\xd9\x2a\xd8\x47\xc5\x0a\xab\x49\x9f\xf4\xbb\x2f\x5c\xa4\x6f\x99\xab\xf3\xf6\x99\x80\xd6\x28\x20\x0e\xa9\x37\x8e\xdd\x5b\x49\x43\x0a\xcb\xd8\x47\xac\xd3\x8e\x25\xb5\xb7\x2d\x9e\xce\x7d\x7d\x6b\x7f\x57\xe1\x30\x4a\x92\xfb\x11\xe3\xe3\xe2\x0c\xa8\xec\x1c\xc0\xc1\x25\x60\xbd\x90\x74\xf1\x4f\xb3\x60\xbd\xbc\x86\x9d\x41\x9b\x29\x77\xc2\xda\xce\x95\x18\xe3\x54\x6e\x75\xf5\x17\x2c\xc9\x01\x0e\x8e\x54\x88\xb8\x20\x0e\x2e\x01\xcc\xa7\x98\x53\xcc\x94\x69\xe2\x22\x51\x7c\x66\x6f\x35\x7b\x4c\x68\xd7\xe3\x12\x84\x7e\x29\x89\x6c\x08\xaf\x53\x4a\xe0\x87\x43\x92\x05\x71\x70\x09\xa8\x3e\x40\xff\xc8\xf7\x92\xc8\xc0\x57\x49\xb0\xa3\xc9\x50\xbf\xc1\xf5\x9c\xcf\x82\x72\x99\x76\x56\x94\xe6\xa6\xf6\x6a\xe4\x60\x2e\x42\x02\x20\x0e\xaa\x0d\xfe\x77\x1b\x0c\x7a\xb9\x9e\x26\x01\x09\x62\x42\x39\x36\xc2\x4e\x61\x29\xef\xd8\x7d\xa3\x16\x97\x9c\xe4\x21\x79\xbd\x98\x79\x17\x43\xc5\x68\xa3\x0a\xd7\x8d\x5f\x0e\x88\xa1\x83\x38\xb8\x04\x1e\x99\x0c\xfa\x2c\xeb\x52\xea\x92\x0d\xca\x06\x45\xb2\xba\xf8\xb5\x8d\x33\xf8\xeb\x5c\x15\xdc\x50\x25\xa0\x4e\xac\x18\x89\x84\xea\x4d\x41\x1c\x5c\x02\x74\xb2\xac\x19\x78\xd6\x43\x95\xcd\x54\x7d\x7c\x6d\xd9\x51\xe5\x22\x64\x5e\x0c\x32\xbb\x62\xf9\x5f\x86\xcc\x1e\xc9\x93\xa6\x40\x87\xa2\x41\x1c\x5c\x02\xb5\xea\x36\x4d\xc5\x49\xb6\x17\x6f\x6d\x0a\x49\x67\x94\xb3\x14\x5c\x6d\x45\xad\x4a\x90\x7b\x7a\x91\xc6\x23\x98\x53\x76\x75\x02\x5a\xfe\x82\x38\xb8\x04\x62\x95\xde\x95\x38\xdd\xa4\xa1\x30\x4f\xeb\xbd\x95\x5a\x43\x27\x55\xb4\x75\x7d\x5d\xf9\xeb\x3b\x94\x48\x5e\x1d\xc7\x6f\x31\x9f\xcf\x23\x96\xbf\x20\x0e\xaa\x09\x04\xd8\x60\x50\xa6\x3b\x4d\x03\xf2\xcd\xb6\x96\x38\x7b\x18\xbf\x49\xcc\xd8\xb0\x59\xaf\x31\x95\x25\xdc\x20\x6e\x29\x5a\x1d\xf5\x3f\x3c\xff\xd9\xf5\xeb\x44\xdc\x1c\x62\xec\x20\x0e\xae\x01\xeb\xb6\x76\xd3\xf6\x2f\x2c\x31\xd8\x98\xcc\x9b\x58\x3e\x03\xa1\x5c\x6f\xf5\xf0\xc5\xb3\xf3\x3f\xbe\xde\x3d\x3f\xd0\xea\x1b\xcd\x01\xfd\x5c\x01\x1c\x92\x06\xb2\xd8\x9d\xa2\xa7\x7b\x5a\x6a\x1f\xa1\x39\x3b\x18\xca\xea\xd0\x7c\xed\xfc\x55\xf9\x89\x95\xe3\x77\x0d\x75\xb5\x7c\xdf\x5a\x2a\xa4\x01\x00\x87\x64\x83\x8f\xe2\x84\x4f\xd2\x45\x8e\x2f\xe5\xa9\xcd\x67\xff\x61\x2a\x20\x8f\x7d\x55\xde\x35\x1a\xd7\x9e\xd8\x43\x67\x11\x28\xb7\x5b\x0c\xd9\x60\x00\x07\xd7\x80\x66\x4b\x19\x9b\x8d\x8a\xbc\x2a\x9d\xb2\x7b\xd7\xb6\x05\xfe\xa4\xf4\x3a\xc3\x89\x77\xba\x56\x95\xe7\xe2\x80\x49\x61\x18\xed\x7b\x84\x06\x40\x1c\x54\x1b\x0c\xb0\xc1\xa0\x65\xc7\x69\x1a\x78\x4f\xc6\x73\x83\x61\xf9\x31\x47\xd1\xd8\x8f\x77\xeb\xd5\xf6\x13\x17\xaf\xbf\xb7\x5b\x26\xb7\x20\x26\xd9\x43\xd3\x0d\x52\xe1\x83\x0e\x03\x83\x38\xb8\x06\x88\xb5\x97\xe5\x27\x13\x77\x0c\x1f\x92\xd3\xab\x13\x78\xd3\xd9\x53\x1b\xbf\xb8\x14\x4a\x33\x3e\xd8\x51\xbd\x69\xec\x2c\x29\xfb\x11\x11\x17\xc4\xc1\x35\x30\x7a\x20\xa0\x5e\xd5\xaf\xed\x66\x9a\x40\xa6\x78\xc8\x16\xb1\x3e\xc6\x2d\x23\x95\x76\xf5\x46\x69\x12\x0f\x97\xb4\xdf\xf7\x4b\x43\x88\xb8\x20\x0e\xae\x01\xff\xd2\xb2\xbe\x0f\x3b\x16\xe3\xa1\xdf\xe2\xee\xa9\x2e\xa8\xcc\xed\x5e\xb6\x31\xcd\x9f\xaf\xcb\x0c\xc8\xf8\x35\x5e\x14\x83\x09\xd5\xb3\x83\x38\xb8\x06\x9a\x71\x57\x95\x1f\xa7\x6c\x38\x5c\x0b\x50\x79\x9e\xd3\xe7\x48\x3d\x5e\x96\x9c\xd1\x29\xe0\xf3\x8c\x14\x97\xe1\x60\x5d\xae\x94\x1c\xa1\x01\x10\x07\xbd\x07\x00\x36\x18\x64\xa1\x4e\xb7\xc1\x77\x62\x88\x9d\xa8\x13\x42\xf8\xb6\xbb\xc8\xdd\xd3\x16\x97\x0c\x0d\x04\x04\xbe\x8f\x86\x8a\x15\x2b\x94\x36\x73\x57\x7f\xbd\xd3\x81\xb0\x94\x20\x0e\xd9\x06\x4f\xb4\x24\x3c\x2e\x7f\x70\xdc\x33\x21\x6b\x5c\xe8\x8f\x65\x4e\x86\xf6\x14\x4d\xfc\x7a\x19\x5a\xcc\xb9\xc2\xf9\x1f\x5f\x82\xf7\xa0\xda\x60\x10\x87\x6c\x83\xdf\x36\x9f\x60\xd6\xf6\x33\x70\x5c\xf8\xc2\xe4\x37\x99\xf8\x54\xdb\x4b\x14\x55\xa4\xd5\xae\xce\x7e\x4d\x1b\x8b\x2d\xc9\x3a\x30\x0d\x11\x19\xc4\x21\x47\xf6\x7a\x9b\x2f\x5b\x93\x86\x26\xb3\x28\x41\x60\xa2\xf5\x4a\x88\x70\x57\x97\x64\x5c\xc9\x32\xed\xda\xe7\x87\xfb\x8a\xab\xc5\x04\x2b\x90\x0d\xa6\x5d\xe9\xa3\x88\xf7\x7d\x3d\x2b\x27\x3f\xf7\x42\xfc\xba\x77\xb2\xb9\xe5\xf9\x0d\x37\x72\xb5\x26\xbd\x51\x7d\x19\xbf\x66\x05\x89\x7f\xb4\xc8\x32\xf8\xea\xa6\x8e\x1f\xb9\x9b\x48\x6b\x48\x9e\xaf\xd8\xbe\x22\x38\x99\x3c\x9f\xbc\x20\xb2\xfa\xf4\xed\x50\x96\x56\x9b\x7f\xdf\xdf\xf6\x33\x65\x68\xf3\xe5\xd4\xa1\x76\x51\xc6\xc5\x8e\xd2\x5b\xfe\x8f\xd1\x76\x3a\xa6\x5b\x88\xb1\x39\x9f\x91\x12\x6a\xd6\x39\x07\x5d\xfa\xaf\xd8\xe0\x20\xcc\xff\x6d\x68\x7f\xd7\x06\x23\xd9\x60\x69\x3e\x46\x96\xc1\x7e\x9c\xce\xe5\x15\x8d\xb9\xf0\x3e\x59\x73\x95\xe3\xe8\x48\xeb\x4f\x56\x9e\x6b\xd6\xb4\xf9\xe1\x63\x44\x67\x62\x48\x51\xf8\x90\x2c\x9a\xc1\xce\x73\x3e\x2a\x3b\xdb\x1c\x0b\x1d\x9d\x4c\xde\x37\x4f\x38\x83\xf5\x5e\xba\x5d\xf7\xb4\x1f\xf7\x45\xef\xf9\x12\x87\xf1\x2b\xfc\x4c\xf6\x65\x91\x7d\x70\x2a\x6d\x23\xdd\xbd\x4d\xac\x4f\x29\x1c\x14\x6c\xf8\xd4\x26\x91\xc1\xe8\xd6\x35\x39\x27\x1b\x76\x41\x58\xce\xcb\xaa\x58\x5e\x67\xd2\x2a\x1a\x45\x07\xe9\x63\x6d\x51\x2e\x84\xe9\xd9\x27\x3f\x7d\x41\x48\xb3\x7e\x59\xe7\x88\x66\x63\x66\xc7\xe8\xde\x1c\x7d\xe9\xf7\x74\x7a\x52\x1b\x65\x0b\xca\x33\x19\x2d\xb2\x0f\x66\x5a\x38\x77\x6b\x21\xdb\xbb\x6b\x91\x7f\x8f\xab\x4e\x95\xa8\x7f\xf5\x96\xd1\x0f\xdf\xfd\xaa\xca\x04\xda\xcb\xe1\x99\x6f\x28\x0c\xcf\xcc\x07\x83\x44\x74\x5a\xe6\x9b\x62\xc1\x3a\x59\xf0\x99\x45\xc5\x8f\x25\x2d\x24\xb5\xe3\xb6\xad\xed\x67\xdf\xf2\x6e\x7a\xed\x89\xf7\x95\x41\xed\xc3\x5a\x11\xb4\x11\x04\xe2\xe0\x99\xaf\xd6\x86\x0a\xed\xc9\x4e\x1e\x4b\xc1\x15\x03\x59\x73\x55\x9b\xe2\x06\xb6\xa9\xce\x2a\x02\xde\xf5\x86\xce\x4b\xeb\x19\xe9\x6a\xd0\xd5\x7b\x20\x0e\x9e\xf9\xf4\xe2\xd6\x31\xf1\xf7\xe2\x96\xc3\xef\xb1\xc5\x48\x7f\x1f\x66\x0c\xfc\x31\x7e\xcf\xb3\xc0\xfd\x46\xf1\xe5\xb1\x2a\xca\xb9\x7d\xe8\x5a\x1b\x10\x07\xcf\x7c\x86\xf8\x3e\xc7\x69\x16\x5a\x85\xfa\x17\x6f\xf2\xb1\x17\xf0\xcf\xfa\xdd\x0f\xdf\x6c\x91\x4e\xe9\xd7\x78\x6b\xc1\xfa\x45\x28\x19\x6a\x68\x0a\xe2\xe0\xe7\xab\x12\x13\x06\xf2\xa3\x34\xcf\x6f\x37\xa6\x5f\x7b\xaa\x39\x72\x97\xe8\x70\x38\xd9\xb7\x42\x33\x5b\x4c\x9f\xb4\xf3\xcd\xd4\xc5\xe2\x14\x84\x09\x02\x71\x50\x71\xf0\xbf\xfb\x60\xd0\x0f\xfa\x34\x09\xd4\x39\xf3\xe9\xf4\xbe\x8a\xbb\x62\x5e\xf8\xf0\x93\x5c\xdc\xbd\xbd\xa8\xd4\xea\x72\x4f\x8a\xf6\x2a\xf9\x9c\x04\xc9\xa0\xd4\x4e\x5d\x68\x1b\x14\xc0\xc1\x25\xb0\xb6\x16\xee\xcb\x1f\x52\xee\x6a\x17\x14\xa7\x44\x1f\xbc\x9e\x62\x21\x5b\x5d\x71\xa4\x68\x3a\x41\x38\x81\xc9\xa0\x91\x4a\x54\x84\x88\x0b\xe2\xe0\x12\x60\x7c\x89\xd6\xdc\x4d\x3b\x32\xf7\x59\x0a\xfb\x07\xe1\x55\xf6\xb1\xe8\xfc\x17\x72\x05\xc9\xce\xd6\x24\xd9\x4f\x79\xfd\x0f\x33\xa1\x05\x3b\x88\x83\x4b\x80\xc8\x5a\x7b\xb0\x42\xa3\x70\x9a\xc5\x35\x6d\xed\x1a\x39\xeb\xd3\xcc\x30\xa6\xe9\x8f\x54\xea\x59\x13\x7c\xc2\xda\x17\x35\xfb\x7e\x43\x07\xf9\x01\x1c\x5c\x02\x6d\x98\x07\x8a\x05\x7f\x96\xd6\xf8\xf6\x07\x6e\x3e\x61\xcf\x6e\x7b\xab\xd4\xd5\xea\x60\xb4\x24\xd9\x6d\x11\xc3\x76\x22\x74\xb1\x19\xb1\xf8\x01\x71\x50\x55\x20\xdf\xbf\x2f\x80\x41\x6f\xd7\xd3\x34\xd0\x3c\x2e\x38\xf1\xda\x3e\x69\xee\xf2\xae\xba\x98\x72\x26\xfa\x21\x57\x1b\xd5\x33\x37\x91\x47\xfd\xe7\x19\x3d\x3f\xcc\x25\x8e\x93\x20\xc6\x0e\xe2\xe0\x1a\x78\xe2\xcf\x56\x4b\xc8\xbd\x6f\x2c\x4f\xad\x25\x7e\x97\x6c\xd3\x9a\x81\xef\xf9\xde\xef\xf2\x11\xba\xbe\xe7\x39\x03\xa1\x58\x0c\xd0\x02\x18\xc4\xc1\x35\xc0\x9b\xfb\x49\x13\xb3\x9e\xa4\xe8\x0e\x7d\x8d\x67\x57\x3a\x66\x51\xe1\x84\xc9\xa8\xcd\x9f\xf7\xa9\x45\xdf\xca\x4f\x24\x2b\x15\xa0\x6a\x66\x10\x07\xd7\x40\xf8\x6e\x40\xec\x83\xd0\x55\x47\x99\xc5\x0f\xd4\x29\xbe\x57\x36\x50\xa2\x67\x43\x15\x98\x88\x1b\x8d\xd3\x3f\x55\x7c\xd9\xcc\x69\x44\xc4\x05\x71\x70\x0d\x88\xa4\xc9\x07\x79\x4b\x30\x8c\xfb\xf3\x51\x26\x28\x37\x7c\xe0\xf9\x4e\x2c\xb5\xb9\xf9\xfe\xfa\xbb\x40\x4b\x8d\x8d\x1c\x7d\xa9\xfb\x08\x0d\x80\x38\xa8\x2a\x10\x60\x84\x41\xa9\xee\xd4\xea\x08\x4f\xfd\xcd\x72\xec\x1f\x94\xbb\xc3\x36\xad\x29\x76\xdd\xe7\x8e\xb5\xf0\x03\x16\x5d\xb5\xc5\x07\xb3\x2f\xde\xfa\xad\xd4\xa8\x03\x55\x47\x00\x38\xb8\x06\x30\x3d\x7c\x0e\x85\xf8\x04\xc2\x2b\xd5\xcf\x1d\xa2\x4c\x53\x3f\xba\xfb\x75\x8d\x9d\xd4\x11\xa7\xe8\xad\xd5\xc5\x27\x1d\x47\x3e\x6f\xa0\xff\x97\x00\x1c\x5c\x03\xab\xa4\x4c\xf4\x12\x7e\x5f\xdf\xff\xba\xd5\x67\x12\x35\xd9\xe1\x40\xea\x48\x7a\x89\x8f\x9b\x4b\x26\x69\xb1\x6e\x23\xb6\x8d\xfa\x2a\xf4\x57\x2b\x80\x83\x6b\x40\x04\x4f\xe9\xc1\xa7\x86\xfa\x24\x7e\xd5\xa2\xf4\xb2\x82\xe8\x3b\x89\xe7\x88\x62\x69\x5f\x7a\x0e\xdc\x5c\xc0\x74\x34\xc8\x0e\xe8\x43\xc4\x05\x71\x70\x0d\xc8\xfa\x4a\xfc\x7c\x29\xfa\x67\x59\xec\x41\xa0\x80\xb7\x58\xc6\x0d\x9a\xef\x79\x25\x1f\x67\x75\x3e\x92\x1a\xf8\x49\xf6\xde\x71\x31\x46\x68\x00\xc4\x41\xef\x01\x9d\x7f\xd7\x00\x68\xdd\x71\x9a\x06\x1e\x0f\x87\x17\x5e\x17\x67\xfb\x9e\x72\xab\x72\x22\x3b\x2f\xb9\x50\xa4\x8a\xb7\x28\x58\x5b\x14\xcd\xc0\xd6\x59\x20\x5b\x0f\xed\x09\x62\xec\x20\x0e\xe9\xf6\xe8\x10\x93\x1b\xdc\x93\x84\x42\x37\x30\xef\x6f\xbd\xeb\x53\x26\x64\xb5\xd3\x25\x3e\x2f\xc9\x11\x70\xc1\x05\x1f\x7f\xbd\x4a\x01\xba\x95\x1a\xc4\x21\x5d\x99\xa4\xfe\x24\xef\x5b\x9e\xa8\x8c\xe6\xaa\xb2\x50\xd5\xad\xf5\x29\x7c\x5e\x1d\x15\xd5\x95\xc5\x76\x97\xef\x85\x6e\x59\x6f\xd4\xbb\x11\x71\x41\x1c\x5c\x03\xc9\xd1\xd7\x1c\x9c\xc9\x8d\xdf\x49\x9e\x6f\x22\xa8\xca\x32\xce\x9d\xab\xfa\xba\xd0\x45\x43\x45\x60\x5c\x93\x69\x71\xb5\xf5\xd3\x1a\x22\x2e\x88\x43\x5a\x0e\x7c\x90\xb5\x1f\x3b\x5a\x22\x7a\x71\x5c\x12\x7d\xa8\x75\xad\xf5\xde\xcb\xea\x97\x39\xc6\x01\x41\x97\x7e\xa0\xe5\x1b\xfb\xf8\x5e\x87\xfa\x85\x03\x38\xe8\x3d\x00\x30\xc2\x20\x13\x75\xba\x11\x9e\x7e\xfd\xbb\xda\x23\x67\x5c\xd9\xea\x6e\x8d\x21\x9b\xa3\x6e\xea\x8c\xdc\xfa\xb4\x80\x81\xde\xeb\x94\xeb\x32\x8b\x1a\xb1\x3c\x16\x08\x53\x09\xe2\x90\x8d\x30\x67\xc2\xe3\x4f\x78\x6d\x6b\x16\x5c\x86\x7a\x17\x6a\x8d\x97\xcb\x53\xc7\x8a\x5a\x4b\x5f\x0b\x66\x1a\x0f\xec\xed\xdc\x40\xcd\xe0\x43\x44\x06\x71\xc8\x76\xf5\x4d\x89\xc2\xc0\xca\xcf\xc5\x0f\x37\x43\xa7\xe5\x28\x17\x71\x62\x07\xc7\x62\x1e\xb4\x29\xf1\xeb\x54\x62\x2c\xb7\x96\x6a\xa2\xf3\x23\x22\x83\xb8\x10\x39\x14\xa2\x7f\x46\xfe\x9f\x6f\x0e\x6e\xb1\x0e\xb5\x27\x98\xbe\x61\x1c\x50\xf7\xfb\xee\x1e\x55\xf5\x39\xef\x6e\x8f\x67\x41\x3d\x4a\x64\x5f\x64\x64\x4d\xbf\xd5\x91\x09\xff\x6d\x84\x23\x62\x3b\xdb\xb4\xe2\x3c\x1f\x97\xf8\x86\xa1\xb0\x69\x3a\x6e\x9d\x2f\xc4\xaa\xf7\x6b\x8e\xad\xdc\xbd\xf4\x81\x75\x92\x05\x0b\xed\x2f\x34\xe9\xcf\x8f\xc7\x1c\xa2\xa2\x71\xf2\xa5\x49\xeb\x92\x99\x39\x62\xd6\x34\x2c\x3a\xd2\x58\xd5\x5e\x5f\xea\x2f\x8f\x3b\xd2\xb3\xac\xfe\xd7\x8c\x30\x68\x68\x7f\x57\x07\x23\x19\x61\xfc\xfc\xf7\xba\x6a\x4c\x5b\x4d\x04\xec\x59\x2c\xa3\x38\x72\xb2\x23\xbb\x7d\xc1\x75\x43\x58\x83\x06\x82\xe6\x46\xe3\xda\x21\x0f\xcf\x64\xaf\x12\xd9\x08\x2f\x98\x9f\xe0\xcc\xcf\x97\xb6\xb4\xbd\x3f\xb1\x08\xc4\x3f\xea\x56\x31\x0f\xbe\xaf\x47\x90\xd7\x7f\xa3\xd2\xdb\x69\x81\x30\xf0\x4c\xda\x55\x35\x22\x1b\xe1\x0b\x58\xc2\x9f\x43\xfd\x06\x59\xf2\xf7\xa7\x43\x26\x87\xaf\xd5\x6b\x79\xed\xa1\x86\x92\xdc\x9c\x33\x9c\xd3\x13\x76\xd9\x9a\xc3\x3b\x93\xd1\x22\x1b\xe1\x5f\xce\xe3\x1e\x9f\x8a\x6c\x3f\xae\x12\xf4\x72\x2a\x0d\x8e\x77\xec\x44\xb5\x79\xf2\x48\xea\xfe\xc9\x3e\xf2\x55\xd8\xa5\xd2\x28\x3a\x93\xd1\x22\x1b\x61\x54\xe7\x8c\x6b\x2f\xe9\x77\x22\x06\x38\x45\xef\x08\x8d\xdd\x98\xbb\xfe\xb6\xc7\x59\xf5\x42\xa6\x0e\x8d\x95\x9a\x2a\xda\xba\x96\xef\x99\x19\x61\x90\x88\x4e\xcb\x7c\xf1\x09\xc6\x74\x56\x84\x42\x8b\xc7\xc5\xbd\xdb\x8b\xe2\x1c\xf7\xf7\x73\x52\x3b\x22\x0b\x8d\x6a\x6a\x83\x99\xd8\x6f\xfd\xba\x09\xdd\x96\x02\xe2\xe0\x99\xef\xbb\x71\xc0\xea\x8b\xec\x96\xfc\xc8\xe2\x51\x62\x73\x31\x51\xf9\xc8\x8c\xcb\x62\x85\xcd\x9b\x37\x15\x8d\x4b\x12\xbc\x55\x9e\x41\x05\x87\x20\x0e\x9e\xf9\x8c\x3a\x77\xe8\x9a\x76\xb5\xde\xf4\x9a\x4b\x18\x67\x7f\x56\x67\x73\x31\x57\xaa\x1e\x57\x41\xa1\x8d\xa4\xb0\xdd\xff\x22\x25\xc9\x8e\x88\x0b\xe2\xe0\x99\x2f\xc3\xb8\xdf\x74\x9e\xdc\xd2\x85\xb3\xd1\x11\xed\x27\xcf\x16\xce\x86\x1f\x23\x43\xbe\x49\x80\x08\x8f\xf0\x63\x5b\x96\xe6\x39\x21\x44\x5c\x10\x17\x22\x83\x42\xf4\x77\x5c\xa1\x17\xdf\x1e\x06\xfe\x49\xd7\x72\x15\x5b\x3d\x90\xa4\x08\xb4\x3a\x8c\xca\xba\x10\xaf\xff\xde\x54\x90\x68\xb3\xd3\xdf\xae\x50\x1f\x61\x84\x41\x1c\x54\x1e\xfc\xef\x46\x18\xf4\x83\x3e\x4d\x02\x37\x5b\x0c\x35\x24\x45\xb5\x35\xff\x3c\x2e\x24\xf0\x5f\x58\xdb\x6e\xbe\x80\xab\x59\x70\x48\xd7\xce\x18\x7e\xdc\xe6\x13\x64\x9f\x88\x18\x3a\x88\x43\xda\x0d\xd4\x5c\x6d\xe7\x18\xdf\xc1\x5c\xe6\x30\x15\xe3\x2a\x8a\xdd\x90\x1b\xf5\xd9\xc0\x23\xdb\xa9\xe1\x15\x5b\x4b\xc6\x28\x8d\x85\x3a\x6e\x82\x38\xb8\x04\x44\x16\xe3\x33\xac\x94\xab\xb8\x0c\x56\x65\x9f\x8a\xd0\xdb\x7b\xe6\x7e\x38\x18\xee\x16\x1d\x27\xd7\x8a\x71\x93\x12\x41\x3f\x84\xda\xee\x80\x38\xb8\x04\xf4\x48\x79\xfb\x2d\xe7\x69\x12\x69\x86\x0f\x86\x03\xec\xd6\x49\x2e\xf7\x2b\x79\x0a\x48\x57\x8b\x3b\xf0\xa3\x7e\xfc\x64\x68\x6a\x0b\xfd\xc7\x02\xe0\xe0\x12\xa0\x2b\x1a\xb8\xb2\x68\x17\x8b\xf6\x4d\x4d\xa7\xd4\x28\xde\x3a\xd7\xfe\x41\xb0\xa7\x7b\xf0\xa8\x70\xd8\xa0\xb8\x90\xe9\xc4\xb3\x61\xc4\xe2\x07\xc4\x41\x75\x81\x00\x23\x0c\x7a\xbb\x9e\xa6\x81\x72\xfd\x94\x09\x8e\x09\x8a\x48\x02\x61\x0f\x5b\x46\x29\x67\xa9\x2b\xac\x33\x8f\xa8\x64\xcd\xff\x38\x98\xe7\x5e\x92\x8d\x7a\x09\xb5\xc7\x01\x71\x70\x0d\x0c\xd1\x59\xac\x5f\xc2\x2e\xa6\x6a\x6a\xa4\x74\xfa\xae\xbd\x5b\xd0\xc1\x39\xe7\x99\xef\x6a\xed\x33\xd9\x5c\x69\xd7\xe5\x24\x01\xb5\x9d\x02\x71\x70\x0d\x7c\x52\x5f\xb1\x1c\xcc\x8c\xc6\xe7\x5e\xa9\x8d\x88\xe6\xd2\x32\x15\x54\xdc\xd9\x57\xd0\x62\xb8\xb1\x9e\x1b\xb3\x8c\xb2\x10\x67\x80\x88\x0b\xe2\x90\x0e\x44\xfa\x85\x77\x27\xa5\xad\x19\x96\x93\x76\x9b\x69\x8f\xe6\xbf\xcf\x5a\x30\xfd\x6c\x97\xe4\x41\x71\xf2\x13\xfd\x99\x58\x28\x3d\x64\x06\x41\x1c\x5c\x03\xd6\xcc\x77\x4d\xae\xe2\xb1\x25\xf6\xf7\x71\x62\x5c\x2f\xb0\xfa\xc9\x69\x95\xa1\x30\x28\x95\x16\xb9\xa7\xcf\xc3\xe6\x45\x29\x93\x80\xd0\x00\x88\x83\xea\x02\x01\x46\x18\x94\xea\x4e\xd3\xc0\x96\xe4\xb1\xec\x4f\x5f\xf3\x75\xd1\x49\x8f\x5b\xbd\x52\x29\x9d\xda\x17\xbc\x55\xb5\xa8\xde\x45\x58\xfc\xb8\xf2\x7c\x40\xe1\x9d\x33\x62\xec\x20\x0e\xae\x81\x9f\xb5\xb5\x4e\x73\xd5\x38\x2f\x0e\x03\xb5\xc2\x50\x52\x6d\x5f\x8f\xe8\xf6\xa1\xab\xa0\xa3\x71\xfc\xb6\x8b\xb8\xff\x43\x3c\x0b\xda\x65\x04\x71\x70\x0d\x74\xa0\x59\x74\x1b\x8b\xc6\xa8\xf0\xd1\x28\x70\xaf\xa0\x17\x76\x52\xfe\x34\x73\x4a\x14\x99\x13\x0d\x74\x95\x13\x09\xdb\xbf\x05\x35\x4c\x04\x71\x70\x0d\xe0\xd6\x89\x32\xdb\x7c\x21\xb8\x11\xd0\xfd\xe1\x7b\xba\xd1\xc7\x2f\xe7\x92\xe8\x9b\x31\xce\xa1\xca\x65\xeb\x04\xd8\xa9\x2f\x89\x42\xd7\xe7\x81\x38\xb8\x06\x02\x5e\xf6\x5a\xfa\xbe\xc6\x51\x4a\x1c\xab\x9d\x52\xe1\xa3\x70\x60\x6f\xfe\x52\x16\x83\x69\xd5\x50\xaa\x9f\x2c\xfd\x93\xb0\x63\x06\xa1\x01\x10\x07\xbd\x07\x00\x46\x18\xb4\xee\x38\xf5\xee\x08\xe1\xb0\x3a\x1d\x34\x05\x5c\x74\xeb\x26\xa3\xaf\x54\xd7\xac\xb5\xdd\x3d\x5f\x3e\xb1\xe7\xd1\xb0\xb4\xea\xb1\x09\x2f\x6b\x87\xfe\xbc\x04\x71\x70\x0d\xe8\x24\xe4\x1b\x2b\x3a\xed\x6a\x5c\xee\x31\x1d\x7b\xaa\x8c\x6a\xd1\xc7\x38\x83\xf5\xda\xe4\x3d\x06\xc5\xd1\xfa\x02\xca\xf0\x5b\xe8\x7f\x71\x10\x07\xd7\xc0\x79\x06\x29\x1a\x69\xa5\xba\x1e\xf2\x5f\xd6\x38\x5d\x61\xc7\x8e\x3f\xc8\xd0\x14\x1b\xc8\xca\x8b\x23\x9e\x30\x54\x30\xe7\xa9\xb7\x20\xe2\x82\x38\xb8\x06\x8a\x0b\xe6\xf6\x69\xa2\x2a\x70\xa4\xe6\xcc\x8f\x3b\xbb\x1b\xe6\xa7\x6d\x7d\x9f\xea\xa9\xea\xf6\x5e\xce\xbc\xff\x5a\x1e\xab\x10\xaa\x15\x02\x71\x70\x0d\x3c\xbe\xbf\x49\xdc\xf3\x42\x33\xb0\xce\x97\x80\x96\x89\x3b\x27\x56\xa4\xe4\xa5\x9c\xbf\x25\xae\xc8\xfe\x18\xd3\x45\x13\xda\x17\xd0\x9f\x21\x20\x0e\x7a\x0f\x00\x8c\x30\xc8\x44\x9d\x6e\x84\x0b\x6b\x0a\xbc\xeb\xcd\xd2\x71\xf6\x76\xcd\x44\xe4\x45\xd0\x9e\x5f\xa0\xd6\xb2\xec\xaa\x3b\xbe\xfe\x24\x75\x41\x8e\xab\xe2\x8d\x3d\xc2\x54\x82\x38\x64\x23\xac\xe4\x1f\x57\x73\x18\x49\x92\xdb\xea\x74\x83\x29\x6f\xe6\x87\x73\x6c\x7d\x75\xd1\x93\x83\x7a\x42\xfe\x22\xd2\x32\x93\xe5\xa8\x47\x88\xc8\x20\x0e\xd9\x08\x17\x07\x4c\x56\xe4\xbd\xb6\x14\x5f\x11\x3f\x92\x09\xed\x7d\x13\xad\x95\xf1\xbc\x89\x25\x98\x59\x80\x29\x29\x32\x38\xec\xf5\xa4\x33\x22\x32\x88\x0b\x91\xfb\xbf\x27\xf9\x77\xe4\xff\xf9\xee\x60\x55\xcf\x58\x0c\x26\x4b\xca\x7d\x41\xa3\xb7\x49\xd9\x8d\xc7\x7e\x89\x1c\xfd\x97\xde\xed\x3d\x79\x45\xe9\x84\xb7\x4c\x9f\x63\xc2\xff\xb7\x11\xa6\xbc\xa8\xf4\x5c\x02\x2f\xd8\x86\x3b\xcc\xec\x57\x6c\xb3\x16\xde\x73\x69\xfd\x3a\xbc\xda\xc1\x80\xc9\xc6\x9a\xbb\x25\x3d\x6b\x13\x7f\x1b\x50\x16\xba\xfb\xa6\xe2\x31\x5e\xdd\xd9\x6b\x8c\x65\x5b\x5b\xa3\x24\x0a\xb6\x43\x92\x95\xfc\xd1\x14\xbf\x50\xcb\x49\x0e\x7e\xed\xfc\xd7\x8c\x30\x68\x68\x7f\xd7\x07\xcb\xc3\xcd\x92\x40\x45\xbc\xf2\x02\xd5\xb6\x5f\xd0\xb0\x93\x4e\x94\xab\x6a\xd3\xf3\xea\xbe\x50\xc3\x37\x38\xb9\x3d\x91\xbc\xbc\x2e\xef\x82\xec\xce\x64\xb3\x12\xd9\x08\x8f\x2a\x0d\xbf\x23\x79\xc8\x89\xef\x53\x15\x52\x19\x21\xd2\xbb\xa1\xe0\xd0\x6a\x59\x6f\x6e\x4e\x2c\x2e\x97\x93\xb1\xb8\x3f\x5d\x76\x26\x5b\xb3\x12\x48\x1f\x1b\x90\xf9\xc5\x6d\x5b\x9c\x62\x10\xdb\xe8\x11\xc7\x7d\xbb\x0f\xcf\x2d\x57\xa9\xfd\xe5\xbb\xb0\xa9\x04\x1d\x51\xc6\x9f\x90\xed\x12\x9f\xc9\x68\x91\x8d\x30\x89\xb1\x64\xb2\x00\x5b\xcb\x64\xec\x7b\x79\xb6\xb1\x8f\x25\xcb\x9f\x88\x1c\xe5\xb5\x5f\xaf\x10\xe9\x1b\x1d\xd0\x63\xe0\x4b\xde\x38\x93\xd1\xba\x20\x7d\x6c\x0e\x3e\x03\xff\x47\xc1\xfa\xe4\x38\x2a\x07\x5f\xbb\xd6\xf7\xc9\x98\xa3\x46\xb3\x75\x27\xbf\x89\x36\x84\xf8\xca\x6a\x05\xd4\x8b\xcf\xcc\x08\x83\x44\x74\x5a\xe6\xa3\x12\x67\xd8\x23\x97\xe3\x6f\x9b\x37\xdb\xf6\xb7\x7c\x65\x18\x21\xe5\xab\x29\x56\xd2\x3c\xa4\x93\x28\xa5\xe6\xd6\x11\xc4\x06\x55\x5b\x82\x38\x78\xe6\x8b\xe1\x28\x7d\xb2\xf7\x74\xc4\x41\xc2\xdf\xe8\xdb\xce\xdb\xc7\xa8\xd4\x58\x16\xa8\x26\xef\xfb\x9c\xd0\x48\x4d\x37\x04\xdb\xf8\xe8\x11\x71\x41\x1c\x3c\xf3\xe9\x4e\x1b\xb2\xf4\xa0\x9b\x5c\xd3\xd3\x7b\x94\x46\xa9\xbc\xff\x63\xa8\x1e\xfd\x89\xbf\x7e\xbf\xc7\x85\x34\x59\x9a\xb2\x17\x01\x37\x10\x71\x41\x1c\x3c\xee\x0e\x16\x5a\x37\x39\xc9\x2d\xcd\x4d\xa2\x54\x72\x45\xcf\xc6\x51\xb6\xe8\x91\x49\x5c\x9f\x35\xbf\x38\xbb\x32\x01\x1b\xe2\xe0\xdb\x50\xa7\x20\x00\x17\x22\x83\xfa\x8f\xe7\x20\x12\x44\x36\xc6\xf3\xe9\x30\x2a\xe2\xb2\x25\xab\xaa\xc0\x68\xc1\xfa\xc1\x8e\x2e\x79\x9a\x3a\xe6\x79\x8b\x46\x31\xe6\xaa\x02\xbf\x40\x83\xff\xed\x97\x78\xda\xdc\x75\xd9\x4f\x88\x33\xf7\x8d\x5a\x72\xb3\x16\x95\x7d\x73\x60\x7a\x96\xfb\xa3\xb9\x8d\xde\x83\xf2\xd1\xe7\x26\x1e\x91\xa4\x2c\xda\x30\xc4\x77\x06\x71\x48\x0e\xd6\x62\x58\x36\x22\x88\x51\x3e\xae\xec\xc9\x11\xfe\xcb\xc5\x14\xbd\x2b\x9e\x59\x3a\x63\x6b\xaf\xab\x92\x99\xb9\x72\x52\x7e\x95\x42\x0e\x16\xc0\xc1\x9f\xb1\xc4\xa1\x0b\x66\x30\x3f\x97\xe8\x44\xd8\xb6\xfe\xb3\xdb\xf7\x5e\x79\xe4\x9c\x74\xf8\xdd\x36\x66\x75\x95\xfa\xa3\x7f\x24\x88\x07\x1d\x3d\x06\x71\xf0\xb8\x0d\xba\x11\x22\x85\x16\xf1\x3c\x7a\xd5\xdd\x5f\xe4\xbb\x17\xf5\x1e\x75\xf7\xda\x28\x5f\xd9\xed\xcc\x3a\x6c\x97\xba\x6b\xfb\x98\x06\x2a\x43\x05\x70\xf0\xb9\x3b\x54\x89\x69\x57\x0e\xe2\xd6\xe4\xcd\x66\xe2\xa5\x2a\x94\x4f\xa7\x08\xf8\xb9\x66\xcc\x6b\x40\xec\x6a\xfe\x51\xfb\x36\x75\x4c\x09\x62\xee\x40\xaf\xb3\xd3\xe6\x4e\x2f\xd3\x82\xc2\x34\xcc\x45\xef\xb3\x85\xac\x09\xad\xbd\x53\x51\x16\x21\x55\x6b\xae\xff\x00\x83\xbd\xca\x85\xee\xe0\x5b\xdb\xd0\x49\x0c\x10\x07\x9f\xbb\x28\x14\xb6\x89\xf4\x7b\x71\xc7\xf6\xdf\x6c\xac\xa5\x72\xc7\x74\x64\x48\xaf\x8b\xe3\xdb\xce\x68\x85\xd0\x7d\x78\xbe\x1d\xb3\x0d\xdd\x23\x02\xe2\xe0\xcf\xd8\xef\xea\xcd\x01\x5a\x9d\xa5\x3b\x03\x61\xfe\xfc\xed\x9d\x7d\xb5\x94\x59\x79\xe7\x14\x7e\xc7\xdc\xfb\x38\xe3\x59\x1a\x5e\x6b\xec\x04\x75\x90\x02\x70\xf0\xb8\xf9\xea\xd3\x4f\x55\x49\x42\xa2\xf2\xfc\xe4\xbf\xa0\x68\x2b\x8d\xbd\x4b\xe7\x9e\x6c\x58\xdc\x96\x6e\xa2\x53\x9a\x4e\xaa\x6b\x86\x9c\x32\x88\x83\xcf\x9d\x54\xee\xdb\xcd\x8b\x8e\x6b\xcb\xdc\x71\x17\xa2\xf4\xbc\xbf\xbf\x1a\x35\x42\x9d\xd9\x63\xe5\x10\x62\x70\xb0\x5e\x3c\x79\x21\x31\x80\x98\x3b\x50\x4e\x38\x6d\xee\x4c\x47\xb4\xf3\x52\xa4\x5b\x71\x4d\x71\xd8\x59\x58\x54\xb4\xbd\x2d\x0a\x2f\x2e\x56\xc4\x4d\xb8\x8f\x3e\xc8\xe2\x96\x7e\x4e\x50\x8b\xf8\xce\x20\x0e\x3e\x77\xc3\xce\xed\x72\x27\x25\x29\xbd\x22\x6c\x96\x38\x0b\xa2\x14\x9f\x56\x16\x06\xdf\xd0\x79\xbe\x3c\xd1\xd9\x9b\x6d\x35\x2c\x32\x86\xfe\x94\x04\x71\xf0\x67\xbc\xff\xf9\xd7\xcd\xb7\xab\xbf\x4c\xba\x6e\x3a\xdd\x6d\xb3\x49\xe7\xe5\x20\xa6\x8a\xc7\x5b\xbe\x33\x84\x9a\xc4\x1d\x2a\xdf\x73\x91\x0c\x11\x17\xc4\xc1\xe3\xde\x96\x27\x24\xbe\xb9\x18\x5f\x11\xb9\x73\xdd\x3e\x6c\xe9\x0f\xc1\x2f\x8d\xe0\xba\x7a\x03\x57\x56\x52\x9e\x8d\x77\xe9\x3a\x26\xd0\x36\x1f\x88\x83\xcf\xdd\x97\x14\x9a\x04\x8d\xe3\x24\xac\x72\x66\x23\xa6\x00\xcd\x9b\x14\x99\x43\x1a\xd7\x2a\xe7\x22\xee\xdc\x5d\x0c\x95\x4e\x1c\x8b\x09\x44\xcc\x1d\x28\xb1\x9e\x36\x77\x81\xe8\x5d\xc6\xaf\xe3\xc2\x78\x6c\xa3\xbb\x02\x1a\xc7\x56\xdc\x2a\x37\x34\x58\x63\x27\xda\x19\x23\x42\x3f\x5d\xeb\xfc\x46\x0e\xe9\x18\xc4\xc1\xe7\x0e\xdf\xc4\x9f\x3b\x50\x2d\x2e\xee\xae\xb9\xc5\x72\x0f\x7a\xa9\xcc\x0d\x4c\xeb\x79\xdc\x0f\xc2\x7f\x92\x68\xdc\x7b\xde\xd5\x33\xf5\x23\xe2\x82\x38\xa4\x6d\xef\x93\xe6\x91\x83\xdd\x6c\xcf\x9a\x8f\xbb\xfe\xad\xe5\x86\x96\xd7\xcb\x2b\x18\xbe\xf1\xf3\xa8\x1c\xab\xe6\x6c\xa8\x11\xbe\xcb\x84\xb6\xbd\x01\x1c\x3c\xee\x65\x53\x13\xae\xe7\x3f\xc6\x7d\x55\x8e\x79\x76\xb1\x32\x3c\xc3\x14\xf0\xaa\x37\x05\x29\x30\x5d\x42\x50\xb4\xad\x46\x2f\xb4\x71\x42\x9d\xab\x00\x1c\x7c\xee\x7a\x3c\xdc\x17\x32\x6e\x7d\x14\xfa\x23\xe0\x2f\xbc\x9d\xfb\x24\x9b\x9e\x44\xbf\x86\xde\xb2\x9b\x31\xfe\x1a\xc5\x10\xdd\xb7\x6a\xea\x40\xa3\xff\x6d\x75\x7f\xba\x43\xe3\x50\x69\x5c\x99\x7c\x30\xc7\x4d\xec\x62\x22\x25\x13\xf2\xd9\xf3\x98\xf0\x26\x89\xd8\x38\x7d\x2d\xc7\x6f\xef\xc3\x04\xe7\x74\x68\xdb\x0f\xc4\x21\x3b\x34\xad\x50\x37\xec\x24\xb2\x06\x8f\x1b\x62\x8b\x1e\xec\xab\xef\x65\xf5\x08\x88\x36\x8b\x59\x24\x9e\xdf\xfc\xe0\x1c\x15\x34\x48\x2e\x85\x88\x0c\xe2\x90\x1d\x1a\x23\xa7\xcf\xa3\x2a\x0a\x5a\x1b\x1c\x3c\xae\xf3\xc4\x27\x59\x21\x63\xd8\x66\x5b\x02\x66\xdd\x22\xdb\x3c\x39\xad\x4a\x72\x7d\xd0\x99\x5d\x10\x17\x22\x87\x82\xf2\xcf\x67\xfd\x3f\x5f\x6b\xbb\xb8\xa3\xfd\xad\x85\x45\xd7\x80\x73\x61\xc4\x81\x21\x73\x78\xbd\xfe\xe9\xea\x47\xb6\xf0\xd2\xc8\x0f\xbf\x3c\x15\xa5\x33\x75\x3f\xff\xc3\xa1\x5d\x7b\x4f\x60\xeb\xea\x3e\x7d\xc5\xef\xbc\xe8\xb9\xa1\x3a\x4c\x03\x46\x1e\xe2\xab\x52\x94\x8c\x32\x82\xd7\x5b\x82\x8b\x64\xfe\x2e\x1f\xfc\xf0\x22\x71\x96\x8e\xbd\x80\x55\xa8\x6b\xa0\xd2\xe7\x71\x6b\xd9\xb8\x05\xa9\x35\xff\x04\x5d\xcd\x91\x9e\x21\xb7\xea\x6f\x93\x8f\xff\x39\x87\x06\x18\xda\xdf\xa5\xab\x48\x0e\xcd\x79\x38\x86\x12\x9b\xc3\x1c\x63\x81\xc6\xb1\xb5\xce\xdf\x99\xc3\x7b\x30\xf7\x7c\x82\x11\xe3\x17\x9d\x47\xfe\x1b\x6f\x1f\xa8\xea\x9c\xc9\x2e\x1a\xb2\x43\xd3\xc1\x1c\x63\xd7\xf8\x1e\xbd\x75\xc5\x17\x2b\x65\x57\x8f\x47\x22\x0b\x1d\x2b\xdb\xaf\xa1\x99\xb8\xb0\xa7\xf4\xf5\x9b\x42\x65\xd3\x33\xd9\x33\x44\x76\x68\xaa\xf1\x73\x6b\xad\x31\x4a\x51\x6f\x8e\x9d\xd6\x66\xf4\x09\xdf\xbc\xd8\x13\x1a\x15\xac\x98\xe6\xb6\xac\x57\x2e\x8a\xf7\xe0\x9a\x3d\x93\xd1\x22\x3b\xb4\xed\xf2\x19\xfc\xdd\x2b\x32\x6b\x84\xd8\x1b\xfe\x43\xfb\x01\x0a\x64\x77\x8a\xb4\x08\xde\x2b\x0d\x07\x93\x3f\x39\x37\x91\x2b\x7e\x06\x17\xcc\x46\xc9\x49\x23\x3b\xb4\x88\xea\xee\xee\xc0\xae\x26\x85\xa3\x86\xad\xb7\xa2\xdd\xa2\x8a\x09\x42\x3c\x1f\x27\xf1\x89\x8a\xae\xbc\xb0\x9a\x43\x67\x9e\x0a\x3c\x33\x87\x06\x12\xd1\x69\x19\x8b\xa1\x8c\x25\xd1\xd1\xff\xad\xce\xc6\x72\x1e\xa5\x70\xcc\x53\xfa\x4b\xf7\x3b\x96\x58\x12\x9d\x7f\x1e\x44\x5e\xdc\x96\x72\x7c\x0a\xad\x6e\x41\x1c\x3c\x63\x29\x05\xf8\x35\xb6\xdd\x7c\xa0\x73\x40\xc4\xf6\xf8\x51\xca\xbd\xad\xc8\x26\x85\xbc\xe1\x4c\x5a\xfc\x35\x59\x8f\x12\xea\xca\x73\x3b\x88\xb8\x20\x0e\x9e\x59\xfc\x3f\x72\x3b\x6d\x1e\xb0\x88\x87\x47\xe5\xf0\xbf\x8e\x3f\x68\xe1\xce\xbd\x6f\x40\x30\x37\x6f\x36\xcb\x31\x6c\x79\x55\x14\x35\x08\xaa\x2a\x01\x70\xf0\xb8\x1f\x27\xcc\xe5\xf8\xea\xb9\x9b\xfa\x70\x31\xb0\x58\x53\x3e\x16\x26\x25\x55\x7a\x95\x14\x17\x18\x08\x5f\xde\x94\xbb\x6b\xae\x04\xed\x53\x81\xb8\x10\x19\xa2\x7f\xbe\x45\x4b\x1e\x31\x71\x7a\xcd\x7e\xae\x29\x8f\xa3\x23\x48\x17\xba\x60\x74\xdd\xd0\xe5\xe7\x0b\xae\xf3\x65\x8f\x15\xae\xc8\xb2\x51\x1f\x22\x56\x1b\xa0\x5f\xe2\x69\x73\xa7\x4b\x5f\x8e\x59\x46\x50\xa8\xef\x35\x68\x45\x94\xea\xac\xcd\x36\xb8\xca\xed\x13\x4a\x97\x76\x61\xf1\xb2\x02\xb1\xd7\xd2\x40\x2e\xe4\x56\x01\x1c\x7c\xee\xb0\x55\x28\xe8\x1f\xab\x71\x09\xe5\xcc\xdd\x3f\xf0\x5a\x32\x3c\x52\xe5\x58\x2c\x27\x8a\x1b\x11\xb4\x2c\x99\x7e\xa1\xcb\xc9\x0e\xf5\x71\x04\x71\xf0\x67\x5c\xc7\x2c\xe0\xed\x16\x10\x45\x2f\xf5\xb3\xfc\xa1\xff\xa3\xb4\x5f\x09\x3f\xdc\x48\x78\x86\x47\x35\x31\x50\xa2\x6e\x92\x6b\x7d\x91\x87\x0e\x07\x03\x38\x78\xdc\x5c\x82\x09\x54\x37\xba\x3e\x83\x9f\x4b\x19\xd2\x28\x0f\xf8\xee\x8e\xf9\x2a\x14\xb5\x56\x38\x9b\x5a\x6c\xea\x85\x47\x57\x5c\x84\xaa\xd8\x40\x1c\x7c\xee\xec\x12\x4c\x97\x3e\x6d\x24\xfd\x52\xc6\x11\x2d\xdc\x9e\xfd\xf2\x99\x62\x88\x32\x96\x76\x67\x85\xbf\xcc\xb6\x69\xf9\x11\x87\x0a\x3f\x62\xee\x40\xaf\xb3\xd3\xe6\xee\x9e\x79\x6d\x5b\xe4\xe2\x38\xfd\x58\xa6\x75\x75\x0c\xea\xbc\xf6\xd0\xa0\xcb\x22\xfa\x72\x52\xd7\xfb\x19\x9b\xf1\x97\x1b\xe9\x90\x0b\x06\x71\xf0\xb9\xeb\x0d\x30\xd1\xa6\x2a\x7c\xf8\x66\xef\xa2\x5a\x2d\x6e\x70\xff\xf8\x85\xb0\x9b\x15\xa9\x8d\x0d\xd3\x78\x69\xc1\x54\xd4\x96\x09\x6e\x88\xb8\x20\x0e\xfe\x8c\xa3\x5b\x6b\x9a\xb2\xc5\x44\xb0\xcc\xcb\x85\x87\xcb\xf2\xd2\xfa\x2d\xab\x9e\xbe\x0f\x1b\x64\x0c\xc5\x58\x95\xdd\x91\x76\x29\x8b\x44\xc4\x05\x71\xf0\xb8\x2d\xd1\x7d\x83\x77\x08\x98\x88\x4f\x64\x32\xf0\xbc\x04\xa8\xfc\x35\x70\xfd\xb6\x0c\x4f\x8c\x04\xf2\x5d\xd9\x5a\xdc\x2f\x7e\xa8\x44\xc4\x05\x71\xf0\xb9\xcb\x6a\xfe\xac\x58\xf3\x26\xea\x26\x46\x89\x38\x3a\x53\xab\x72\xfb\x91\x67\x84\x7c\xc5\x76\xaf\xed\x12\xbb\x0d\x5f\x7e\xfb\xeb\x4b\x88\xb9\x03\xe5\x84\xd3\xe6\xae\x07\xf5\xaa\xb2\xfd\x8b\x17\xd2\x04\x31\x69\xc2\x29\x26\xee\xb2\xca\x91\xeb\xde\x82\xd4\xcf\x19\xb3\x3f\x2d\x18\xac\xfc\x74\x86\xf6\xe0\x41\x1c\x7c\xee\x36\xe3\x58\xbf\x6d\x4e\x3a\x5f\x88\x7e\x12\xcb\x95\x3a\x52\x28\xd7\x68\xa1\x6f\xb5\xf9\x6e\x76\x9c\xa4\xb9\x44\xa0\x60\x84\x60\x05\x11\x17\xc4\xc1\x9f\x71\x69\x3b\x5a\xc0\xc0\x2f\xaf\xb6\xbb\x85\xbf\xdb\x56\x25\x64\x93\xf9\xdc\x49\x35\xe5\xe4\xda\xc4\x7f\xf6\xe9\x04\x93\x6a\xd7\x54\x21\xe2\x82\x38\x78\x5c\x32\x82\x62\xe7\x05\x7b\x12\x72\x3d\x35\x45\x32\x6c\x4c\xb9\x0b\xf7\x74\x07\x09\xae\xca\xab\xc4\xd8\xd3\xaa\x99\x6e\xe4\xdc\x12\x44\xc4\x05\x71\xf0\xb9\x4b\xa1\x4b\x3a\x98\xbd\xef\xb4\x15\x92\x72\x6f\x3f\x00\x7d\x90\xd8\x21\x39\x7f\xf9\x6e\x57\x8e\xf4\x0f\x33\x0b\x45\xa9\x98\x60\x55\xc4\xdc\x81\x12\xeb\xa9\xbd\x7a\x8f\xd5\xaa\x16\xc7\x65\x05\xe9\xa6\x50\x4c\xed\xb0\xb8\xec\x73\x3d\xcf\x91\xcc\x0b\x7d\xef\xbd\xaa\x69\xda\xb7\x84\xfe\x18\x72\xc1\x20\x0e\x3e\x77\xa9\xdb\xcd\x11\x3f\x1b\x1e\xfe\x46\xed\x62\x53\xa9\xaa\x9b\x38\x8f\x1b\x7f\x31\x89\x8d\x5f\x57\x31\x8e\xf6\x58\x59\xf6\x6e\x2a\x74\x23\x2c\x88\x83\x3f\xe3\x02\x3d\x21\xcc\x8e\x0c\x06\xa5\x1f\x95\x9f\xef\xab\x07\x8a\xe9\x77\x85\x4c\x5f\x4d\xb0\x5c\xae\x29\x64\x1d\x19\x7e\x52\xf0\xcc\x13\x11\x17\xc4\xc1\xe3\xde\xf0\x95\x27\x9e\x65\x98\xf3\x88\x70\xb5\xdf\x36\xf7\xd4\x57\x6e\xb1\x8b\x6f\xd2\xc7\x5d\x96\xf8\x6c\x5a\x2b\x1b\xc6\xb2\x03\xed\xc9\x83\x38\xf8\xdc\xcd\x68\x5d\xd5\x5f\x7d\xb9\xf1\xfb\x56\x79\x85\xff\x64\x24\x07\xdd\xa3\x20\x83\xec\xd8\x1d\x4e\x5a\x26\x43\x77\x3d\x01\xd5\x09\x27\x84\x43\x03\xad\xee\x4f\x77\x68\x03\x4b\xa2\x9d\x44\x3e\x0f\x54\xbe\xbd\x34\xfc\x33\x4e\x36\xb5\x75\x0f\xbd\xbf\xbf\x41\xce\x62\x99\x4a\xa0\xf6\x5c\xf5\x08\x9f\x34\xd4\x09\x17\xc0\x21\x3b\xb4\x1f\x43\xb5\x98\xab\x42\xbc\x81\x78\x52\xee\xb7\xf7\xec\x1c\xab\x8b\x54\x45\x65\x6e\x0c\x8a\x60\xbc\x7b\x78\x11\xcd\x17\x7d\x64\x0e\x11\x19\xc4\x21\x3b\x34\xb6\xa1\x9e\x5e\x9e\x37\x02\x8d\xe4\x0a\xd9\x7f\x82\x44\x78\x7f\x3e\x72\x97\x5f\x0d\x7d\xfe\x21\xcd\xa4\xf7\x4e\xa9\xd3\x24\x2e\x54\xaf\x09\xe2\xfe\xcf\xa1\x61\xfc\x23\xf2\xff\x7c\xe3\x6a\x08\x6d\xab\xed\xb7\xbb\x81\x56\xb9\xc2\xd5\xc4\x99\xe7\xb4\xe6\x67\x7b\xc4\xc6\x78\x7f\x17\x3f\xc4\xc1\x57\xe2\xba\xee\xdb\xaa\xf4\xb7\x43\xc3\x9d\x89\x96\x55\xb9\x49\x93\xb0\x2d\xdb\x32\x27\x34\xea\x19\x36\x7c\xa2\x66\x1c\x22\x6c\x57\xf6\x6e\x91\xbe\x56\x21\x5f\xe1\xef\xeb\x3e\x9a\xee\x8b\xab\xf1\x87\xdd\xa4\x9b\x89\xe9\xac\x34\x97\x4f\x31\xbb\x43\xa5\x3a\x64\xbb\x7b\xc9\xa4\x67\x12\xcd\xbc\xc3\x01\x9f\xe6\xbf\xe6\xd0\x40\x43\xfb\xbb\xaa\x12\xc9\xa1\xc5\x0f\xd8\x7e\x5b\x14\x0e\x20\x7f\x7d\x77\xe7\xa0\x27\x4e\x5d\xbe\xe6\x26\xa6\x6a\x1d\x23\xe5\x32\x0e\x5e\xde\x0f\xc1\x5e\x92\x8b\x67\xb2\xbd\xc3\x8f\x64\x1e\x24\xd1\xbb\x2c\x34\x68\xdb\xe5\xa9\xf9\xd9\x88\x55\x69\xb5\xf5\x0e\xdf\x3b\x6c\x84\x30\x72\x79\xad\xce\x84\x6c\x5f\x34\x51\x3e\x83\x73\x8e\x51\x72\x81\xc8\x0e\x8d\x3e\xcb\x46\x0e\x9f\xdf\xa3\x72\x9f\x2a\x51\xff\xf9\x25\x7e\xf5\x69\xcf\xe7\x35\x6b\xa8\xb2\x59\x85\x21\xca\x1f\x59\x06\x48\xbe\x9f\xc9\x68\x75\x91\x3e\xf6\xc4\x2b\x5c\x7b\x64\xfc\xcf\xfb\x36\x8d\x2b\x3e\xaa\x93\x1d\xe1\xed\x5c\xcc\xd3\xcf\x5f\x98\x3a\xc7\xef\x3f\xb8\x1b\x60\xdf\x7b\x36\x55\x95\xc8\x0e\xad\x67\x48\x23\x9f\x7f\xdc\x94\x8f\xe5\xc2\x1f\x23\x6b\xad\x73\x23\x06\x03\xd6\xe7\x03\x70\x26\xb2\xa6\x6a\xcc\x54\x0c\xb3\xe9\x4c\xce\xcc\xa1\x81\x44\x74\x5a\xc6\x7a\xb9\xb3\xf4\x80\x3a\x1b\xd5\x36\x47\xb6\xa9\xc8\x5b\x78\x33\x40\x5f\xb8\x88\xa5\xbf\x0c\x3f\x43\xc9\x3b\x24\x83\x35\x2e\x15\xba\xb5\x01\xc4\xc1\x33\x56\x02\xd1\xad\x1d\xa5\xb6\x8e\xa5\xaf\xee\xd2\x75\xd2\xe6\xf6\x18\x62\x4d\x05\xb6\xaf\x86\x0e\xaf\x6d\x9c\x2f\x17\xca\x73\x9f\x87\xda\x60\x82\x38\x78\x66\xf1\x65\x08\x36\xbc\x5a\xc8\xd4\xf5\x60\xe5\x66\xed\x89\xe8\x65\xb4\x8c\x17\x15\x01\xe5\x6a\x74\xbb\x53\x3a\x05\x56\x55\x59\x44\x50\x26\x04\x71\xf0\xb8\xb7\x18\x0e\x29\x03\x8e\xe8\xdb\xfb\x1a\x74\x38\x5d\xcc\xb2\x5e\x19\x8f\x25\x98\xef\x71\xf5\x55\x67\xb2\xaf\xe9\x19\x6b\x6c\x44\x21\xe2\x82\x38\x24\xb7\x33\xe1\x53\xb6\x90\xf4\xd9\x65\x03\xff\x0b\x23\xd3\xa4\x1f\x41\xdc\x1b\x81\x23\xef\x01\x21\x29\xd7\xb2\xc7\xc5\x6e\x99\x65\x78\x88\xd5\x06\xe8\x97\x78\xda\xdc\x61\x47\x9e\x70\x70\xf2\xdf\x96\x58\x50\xa1\xdc\xd1\x54\xfd\x9c\x7e\xeb\x02\xdd\x60\xa8\x5b\xa6\xed\x36\x6a\x6c\x38\x26\x79\x3c\x74\x92\x06\xc4\x21\xb5\x44\x3c\x54\x91\x0a\x78\x4d\x2d\x5e\x70\xae\x46\xbf\x5d\x47\x51\xeb\x8a\x7f\x58\xb0\x11\xee\x49\xba\xd9\x92\x42\xb5\xbc\x9d\x38\x0b\xd4\x12\x11\xc0\xc1\x9f\xf1\xcf\xf4\xcb\x22\x6c\x7f\x50\x37\x7e\xca\x16\xd8\x71\x5e\x0e\x8d\x95\x2e\x7b\x85\xc9\xa0\xd9\xd2\x69\x9d\xbf\x50\x29\x25\x44\x0d\x35\x74\x06\x71\xf0\xb8\xae\x4f\x1e\x27\xa6\xa1\x63\xaa\x46\x0d\xea\xb8\xad\x27\x7f\x0f\xc4\xb8\xbe\x67\x3b\xfe\x65\xe7\xae\xf7\xfb\xee\x9c\x6f\xf2\x2f\x20\xad\x81\x38\xa4\xcb\x22\xa5\x6d\x51\x25\xc6\x14\x4d\x1c\x5b\x5b\x99\x1a\xf3\x57\x45\xe5\xeb\xe7\x1c\xeb\x2d\x26\x4e\xb6\x57\xe8\xea\x15\x62\xdb\x75\x11\x73\x07\x7a\x9d\x9d\x36\x77\xb9\x3a\xbb\xb6\xbc\x37\x16\x45\xb0\x67\x28\x5b\x84\xe5\x72\xeb\x14\x65\x3f\x16\xe6\x5c\xfc\xda\xeb\x53\xe1\x9e\x69\x8b\xe3\x0c\xb5\xf2\x04\x71\xf0\xef\x4c\xad\xf5\x8c\x6b\x39\xb3\x64\x4a\xc4\x9a\x34\xc8\xed\x7e\xe7\xdb\x72\x8b\x23\x6b\xc9\x45\xa3\xc6\x74\xf7\xa3\x19\x1a\xb1\x67\xd0\xdd\x51\x20\x0e\xfe\x8c\x7b\xca\x59\x3f\xba\x1b\xc6\xea\x26\x9e\xe3\xfd\x33\x31\x27\xee\xf0\x8d\x73\x6a\x8e\xc6\xa6\x21\x34\x9b\x7d\xb4\xd3\x84\x88\xbb\x0d\x72\x25\x00\x0e\x69\x95\xdf\x70\xee\x37\xa6\xe5\xf2\x4f\xb2\xc7\xec\x9e\x47\x11\x91\x17\xc6\xda\xb3\x29\x45\x3d\x98\x9b\x36\x0e\x1c\x16\x31\xaf\x06\x43\x7b\xf8\x20\x0e\xfe\x1c\x3a\x3b\xb8\x53\xbc\xb3\x4d\x2d\xa4\x24\x7b\xe7\xb6\x43\xb9\x8f\x0e\x4d\xc6\x6d\x32\x68\xb7\xfb\xd8\x37\x7b\xaa\x9e\xb5\x26\x56\x20\xe6\x0e\x94\x13\x4e\x9b\x3b\x99\x17\x5b\x4a\x54\x25\x83\x6c\xd2\xc9\x7b\xce\x3d\x6a\x1d\x1c\xb6\xba\xe7\x82\x87\xa8\x84\xc9\x7b\xa9\x2e\x10\xb0\xda\x08\xf7\x20\xbe\x33\x88\x83\x7f\xe7\xac\x19\x5a\x46\x75\xc9\xf0\x59\xd2\xcc\x8f\x97\x08\x17\x6c\x66\x3e\x10\xb8\x67\x7f\xcd\xaf\x0a\x12\x89\x58\x1f\x23\x98\x79\x36\x86\x88\x0b\xe2\xe0\xcf\x18\x67\x3a\x69\x84\xc0\x6e\xb8\xdc\x5f\x3e\x93\xd2\x23\x78\x49\x81\xe5\x69\xb3\x17\xdf\xb7\x3f\x4f\x13\xcc\x95\x13\x13\x4b\xdb\x92\x11\x71\x41\x1c\x3c\x6e\xfa\x49\x29\x7b\xdb\x67\xdf\x9b\x53\x2e\x97\xae\x5f\x0d\xbe\x8f\x9e\x63\x8e\x72\x35\xc2\xc0\xcf\xb2\x40\xd9\x4c\xae\x60\x96\x04\x3a\xcf\x00\xe2\xe0\xcf\x81\xc4\x73\x52\xf4\xdc\xe5\x27\xba\x16\xa4\x53\x0d\x31\x96\x2a\xed\x51\x6d\x3f\x4b\xb6\x5e\x6b\xe2\x31\x5e\x71\x31\xba\xb6\x97\xd6\x80\x98\x3b\x50\x62\x3d\x6d\xee\x9c\xea\x75\xd7\x53\x86\xb8\x2f\xd4\x6f\xbb\x77\x95\x2a\x91\xdb\xe4\x12\xdb\x25\x66\x36\x44\x5b\x0c\x29\xe6\xe3\xfd\xfa\x1c\x0f\xf5\xd1\x02\x71\xf0\xef\x9c\x7d\x8f\xa6\xfb\x36\x4d\xbb\xed\x94\xb1\xea\xfa\x53\xe1\x4e\x2c\xe7\x9d\x84\xfb\x84\xaa\x04\x38\x2e\x99\xbc\x44\x9d\x7c\x2e\x50\x2b\x61\x10\x87\xd4\x3f\xa7\xf3\xd1\xc4\xee\xb1\xd8\x77\xe9\x5a\xe3\xab\xe1\xef\x50\xda\x73\xc2\x18\x39\x54\x2d\xcb\xc7\x7c\xa5\xf1\x96\x27\xd0\xa6\x2e\x40\xfd\x73\x00\x1c\x3c\xee\xa3\x47\x51\xd2\x13\xba\x9f\x89\x29\x22\xe7\x5f\x50\xd7\x2e\x2b\xe9\x12\x53\xdd\x7a\xd6\xac\x9e\x55\xa0\xfe\x40\xb5\x77\xe6\x0b\x54\x3a\x0a\xe2\xe0\xcf\xe1\xd5\xf7\x0b\xb8\x93\xa3\x75\x8a\x7d\xf3\xc3\x3c\x26\x57\xf9\x0e\x66\xd5\xf3\x46\x5f\x3d\x59\xe1\x66\xa6\x12\x1a\x8e\x1c\x4f\xcf\x45\x38\x34\xd0\xea\xfe\x74\x87\xf6\x70\x15\xcf\xa0\x4c\x2f\xe2\x1d\xd7\xef\x0e\x6f\x0b\xd6\x4c\x63\xcd\x2d\x21\x8e\x06\xcd\x76\x65\x29\x27\x6d\x9e\xc0\x94\x63\x65\x84\xdb\x01\x71\xc8\x0e\xed\xc3\xca\xed\x24\x32\x9d\x54\xd7\xa7\x04\xd1\xbb\x58\x07\x12\xf7\xc2\xbc\xda\x0f\x58\x8d\x17\x3b\x5e\xfa\x11\x1f\x79\x2f\x59\xa9\x23\x22\x83\x38\x64\x87\x46\x2f\xec\xc4\x89\xbe\xfe\xa0\xd3\x40\xb2\x8a\x31\x84\x5e\x5d\x6d\xe4\x76\x2c\x0f\x9b\x62\xd7\x79\x81\x45\x74\x3b\x57\x3a\xfa\x25\x44\x64\x10\xf7\x7f\x0e\x0d\xe7\x1f\x91\xff\xe7\xcb\x40\x0f\xef\xf6\x4a\xd2\xc5\x86\xe9\xe4\x1a\x95\xe5\x10\x2d\x69\xd3\x2a\x37\xa1\x55\x65\x2f\x90\x19\xf2\xac\xf7\x32\xcf\x5f\x27\xb9\xf1\xb7\x43\x5b\x99\xc5\xde\xd7\xec\xe6\x45\x3f\xa7\xc5\x59\xcd\xb4\xc2\x5c\x9f\xaa\x66\x6c\x3f\xe8\x76\xc1\xf2\x3e\x2e\x09\xaa\xfe\xd1\x70\xcc\x5f\x28\xa9\x54\xde\x82\x82\x6b\x33\x81\x0b\x7b\x6a\x09\xca\xc8\x6e\x92\x5c\xe0\xef\xb1\xb2\x3c\xeb\xe6\x37\x65\xc1\xc1\xe5\x6f\x96\x23\xff\x6b\x0e\x0d\x34\xb4\xbf\xcb\xfd\x90\x1c\x9a\x74\x84\xd6\xef\xfe\x1b\x84\xf1\x34\x9f\xeb\x0e\x9d\xf4\x96\x3e\xeb\x7a\x51\x19\x9a\x5c\xc1\x20\x76\xf7\xbe\x5a\xc6\xce\x2f\x67\x76\x26\xdb\x3b\xc8\x0e\xad\xe0\xc1\x21\x09\xfb\x9b\xde\x97\x03\xc4\x71\xec\x18\x5a\x37\x53\x5e\xfc\x66\x1b\x6c\xb0\x37\xfa\xf0\xad\x4c\x46\xc3\x96\xee\xdc\xef\x33\xd9\xcc\x42\x76\x68\x17\x46\x8f\x58\xb6\x23\x15\x58\x9f\xe4\x59\x35\x71\x60\x0b\xd2\x3a\x84\xa6\x72\x46\x96\xeb\x3f\x76\x59\x16\x78\x55\x20\x54\x89\x79\x26\xa3\x45\x76\x68\xce\x19\x29\x57\x3f\x7a\x78\x33\xcd\x27\xa7\xd9\xcc\x0f\x1c\xa3\x38\xd3\x30\x7e\x18\x13\x3c\x60\x7c\xf2\x5c\xf0\xdc\x8d\xe4\xf3\x55\x67\x32\x5a\x64\x87\xa6\x24\xec\x18\x94\x90\x2b\xda\xa5\xba\xfb\xc3\x7a\x34\x9c\x36\xe7\x11\xc9\xaa\x9e\xcf\xf9\xf9\x36\xbb\x3e\xba\xa5\xf1\x75\xdc\xac\x33\x73\x68\x20\x11\x9d\x96\xb1\x62\x6f\xda\xb0\x6b\x64\x05\xeb\xb3\x2f\xea\xb5\xbf\x94\xff\xce\xb3\x42\xa9\xd0\xbb\x3e\x5c\x54\xbc\xa5\xbd\x37\x99\xba\x1f\x0c\xed\x75\x81\x38\xf8\x9b\xba\xcb\x75\x22\xdc\x87\xf2\x58\x1a\x8b\x24\x3e\x9c\xc0\x4a\x92\xe7\x98\x65\xf8\x9d\x0e\x87\xfe\x23\xd7\xf6\xcf\xc6\xb7\x5a\xa2\xa1\x66\x07\x20\x0e\x9e\x59\xd0\x49\x37\x64\x89\xb2\x0a\x6e\xdd\x64\x1b\x2c\xfb\x53\x16\x3d\xf8\xe9\x3a\x89\x33\x25\xbe\xb5\xaa\x67\xe4\xc1\x78\xf3\xbd\x3f\x50\xb9\x1f\x88\x83\xc7\xcd\xaa\xd9\x21\x52\x09\xd6\xc8\x7e\xf7\x4c\x38\xe0\x13\xab\xe1\x4b\x75\x31\xa2\xb8\xd5\xfd\x8d\x88\xb4\x3b\x91\x8d\x15\xd3\x02\x50\xc1\x3f\x88\x0b\x91\x41\xc1\xf9\x3b\xae\xa1\x47\xf8\x3c\xe1\x89\x42\xa4\xea\xdb\x35\x67\xb3\x5f\xcb\x13\xe8\x17\x4c\xa6\x66\x2b\x77\x1e\x89\x79\xda\xcd\xde\x2e\xec\x6d\x44\xac\x36\x40\xbf\xc4\xd3\xe6\x2e\xe8\x82\x9d\x74\x10\x99\xc7\x50\xcd\xd1\x1a\x9f\x45\xf1\xa0\xee\x8b\xb4\xb5\x7e\x6a\x73\x81\x67\x84\x3f\x44\x7e\x24\x63\x13\x2b\x20\xbe\x33\x88\x83\xcf\x9d\xa2\x2f\xdf\xf0\x2e\x99\x59\x75\x78\x49\xc8\x57\x11\x81\x99\xa5\x21\x13\x6c\x42\x9c\x9e\x18\xeb\x7a\xd5\x19\xe9\x95\xf8\xd7\x9d\x88\xb8\x20\x0e\xfe\x8c\x0d\x06\x44\x96\xd7\x96\x6a\xcb\x9f\x4d\xbb\x7a\x85\xa0\x35\x0f\x44\x45\x4e\x53\x68\x2f\x5f\x92\xfb\x75\x6d\x27\x28\x93\xa8\x08\xaa\xfb\x01\x71\xf0\xb8\x34\xc2\x12\xc4\xb2\x8f\xef\xdc\x28\x49\xe6\x51\xfe\x36\xdc\x43\xff\x7b\x5b\xce\xb3\x28\x80\x92\xa2\x5d\x77\xa3\x0a\x5d\x94\x14\x5a\x29\x82\x38\xf8\xdc\x31\xa7\x2a\x49\x3f\xc3\x92\x5a\x2a\xbd\xe0\xb6\x6d\xc5\x65\x5d\xb1\x69\x24\xc7\x64\xbd\x38\xa1\xf8\x54\x8c\xd9\xfe\x43\xe4\x2c\x36\x62\xee\x40\xaf\xb3\xd3\xe6\x6e\x65\x48\xd6\x3d\xa6\xf6\x36\xce\x3a\x0b\xd6\xc5\x2d\xbb\xad\x6b\xc9\x6a\x78\x3d\xda\xf6\x69\x91\xb7\x52\x1f\x2e\x38\x98\x9f\x83\xfe\x11\x00\x71\xf0\xb9\x9b\xe1\x3c\x98\x92\x79\xde\x30\xec\xc7\xef\x41\xe8\xef\xd6\x96\x64\x51\x8b\xc9\x4e\xae\x7b\xf9\x0a\x77\x63\x3c\x8e\x30\xc1\xce\x16\x22\x2e\x88\x43\x7a\xc6\x82\x96\x7f\xe8\x16\xfd\xbc\x36\xc9\x43\x65\xfc\x82\xf0\xa7\xac\xfd\x32\xa8\x5c\x57\xaf\x5e\xb9\xff\x20\x2d\x3d\xb0\xca\x57\x05\x7a\xc6\x00\x0e\x1e\x77\xd8\xf5\x58\xc9\x8f\xb0\x4d\x87\xbc\x39\xea\x31\x7b\xf6\x26\x85\xac\xe3\x0d\xd3\x57\xab\xb3\x64\x84\xa3\xa5\x54\x0f\x36\x08\xa0\xbd\x39\x10\x07\x9f\x3b\x07\xc2\xa2\x0b\xe6\xa9\x91\x5c\xe6\xef\xc4\xd8\xee\xdd\x91\xcf\x15\xba\x72\x74\xad\xe7\x20\xda\x31\x61\x7c\xd1\x08\xc3\x3c\xcb\x07\x31\x77\xa0\x9c\x70\xda\xdc\xbd\xab\x13\x91\x09\x27\xae\x24\x0b\xa5\x08\xf0\x36\x3a\xbe\x2b\x22\xc5\x59\x64\x56\x4d\xe6\xf6\x08\x9f\x4c\x59\x89\xbf\xff\x3a\x74\x1d\x2d\x88\x83\xcf\x5d\xf7\x36\x0f\x71\xaf\xc4\xf5\xd4\x8f\x29\x42\x78\xf5\xcc\xfe\x5e\xb7\xdf\x63\x12\xfd\x48\x4d\xee\x0a\xc4\x37\x0d\x79\xf0\x72\x45\x09\x11\x17\xc4\xc1\x9f\xb1\x53\x48\x7d\xa2\x7c\xd1\x3c\xaf\xa7\x8e\xad\x6a\x9d\xbd\xc6\xad\x3d\x5b\x77\xd9\x94\x21\xce\x34\xe6\xcb\x5b\xa2\xdd\x76\x9a\xbe\x90\x2b\x01\x70\xf0\xb8\xf6\x58\xfe\x3e\x34\x5f\xec\xa4\x6a\x43\xcc\xd4\x1d\xc5\x96\x0f\x5d\xc8\x1e\x4e\x68\xa7\x71\xdd\x65\x19\xf8\x86\x9d\x4c\xd8\x9a\x02\x35\xca\x01\x70\xf0\xb9\x7b\x68\x55\xa9\x2d\x10\xf0\x2d\x80\x97\xd9\xec\x7d\xd7\xd3\x51\x9f\xdc\x64\xaa\x6f\x1d\x5e\x7f\x24\x24\x14\xcd\x4c\xda\xbc\x6b\x44\x11\x73\x07\x4a\xac\xa7\xcd\x9d\xd4\xf0\x41\xa3\xef\x41\x19\x5d\x4c\x7f\x4c\xbb\x34\xff\x4f\xeb\x80\xca\x9a\xc2\xaf\x66\x7e\x03\x68\xde\x4d\x49\xd2\xd8\x73\xd5\x88\xef\x0c\xe2\x90\x9a\xfb\x4c\x8d\x38\x10\x79\xcf\x8d\x8a\x61\x6b\xaf\xb1\xd0\xb1\x4b\xc8\xa5\x53\x77\x61\x8d\xbe\x78\xf3\x4e\xfd\x85\xbb\x5c\xfc\xad\x47\x50\x73\x1f\x00\x07\x7f\xc6\x72\x18\x99\xb2\x96\xd8\xc2\xfe\xdd\xdf\x12\x9b\x43\x36\xd6\xb1\xc5\x07\xdd\x0b\x95\xb1\x24\x0e\xbe\x3c\x79\x8b\xf6\x31\xc3\xed\x18\x11\x17\xc4\xc1\xe3\xb2\xb9\x30\x08\x73\xaf\xd0\xbc\xf2\xac\xc3\x4d\xf5\xd8\x27\x7d\xb9\xf8\x43\x2d\xf6\x12\xbb\x30\x23\x9b\x8d\xc8\x8d\x80\x76\xc6\x51\x44\x5c\x10\x07\x9f\xbb\x2e\xee\x3b\x81\x94\xd1\xce\x4e\x2f\x7f\x1d\x4c\x1e\x1d\x56\xdc\xff\xad\x80\xcf\xcb\x43\x5a\xb7\x6a\xfc\x2d\xd3\xd2\xb3\x64\xab\x0c\xe1\xd0\x40\xab\xfb\xd3\x1d\x5a\xdf\x20\x51\xf5\xd7\xec\xaa\x09\x14\x55\x67\x46\x85\xc1\xca\xf0\x56\xc7\xdf\x12\x51\xd9\xb3\xae\x8d\x4e\x59\x07\xe9\x25\x14\x58\x08\xb7\x03\xe2\x90\x1d\x9a\xac\x0a\x8d\xd8\xc6\xfe\xf6\x23\x12\xfa\xe5\xb0\xe5\x6a\x3a\x94\x83\x2e\xbe\xda\xe8\x86\x00\x86\xcd\xf6\x28\x22\x7c\x86\x44\x66\x44\x64\x10\x87\xec\xd0\x62\xf0\xc8\x5a\x1a\xcb\x1c\x6b\x66\x9c\xab\x8a\x55\x33\x4b\x06\x46\x97\x6f\xba\x7d\x5e\x23\xa9\x26\x8d\x36\x7a\xe8\x3e\x81\x75\x1d\x11\x19\xc4\xfd\x9f\x43\xfb\x67\x37\xd9\xff\xf9\x9e\xca\x8b\xcf\x2e\x70\x33\xea\xce\x55\x9f\x0f\xbe\xd1\x99\xab\x3a\x47\x6d\x4c\x5c\x21\x90\x55\x6c\x2e\x1f\xec\x76\x1f\x47\x5c\x29\xc0\xf5\x6f\x87\xf6\x84\x25\x8f\x53\xf0\x83\x56\x69\xdb\xbd\xb2\xd6\x4a\xac\xda\xbe\xd7\xc2\x58\xaf\xe6\x5e\x65\xe0\x6c\x48\x0f\xaa\xc8\x28\x27\xfd\xdd\x01\xc4\x57\x81\x8b\x4d\xd8\xec\xeb\xc3\x27\x3c\x82\x98\x2a\x03\x05\x4d\x63\xa6\xea\x97\xc7\xd7\x23\xc7\xe4\x8a\x7a\xd4\xd3\xa7\x96\xf4\xfe\x6b\x0e\x0d\x34\xb4\xbf\xeb\xd0\x14\xe0\xab\xf8\xba\x5c\x49\xf2\x44\x7a\x1a\x1f\x35\x0b\xd2\x51\x86\xb9\xdf\x2b\x39\xd6\x5f\xb7\xc3\x1e\x1d\x34\xb5\x1c\xe9\xfe\x92\xf4\x2f\x3a\x93\x73\x7f\x81\xc8\x0e\x6d\x31\x6b\x11\x5f\xeb\x42\x7b\x69\xb1\xa2\xf2\xce\x13\xf6\xa3\xd5\xee\xd9\x9b\xd8\xe9\x6a\xe5\xc5\x5b\xee\xf1\xf2\x6a\x69\xdf\xce\xe6\xa2\xca\x6b\x48\x1f\xcb\x4e\xc8\xf9\x13\x75\xd3\x12\x73\x40\xbd\x06\xfb\x67\x44\xcd\x3d\x9d\x3e\x5a\xc7\x44\xcb\xf1\xe1\xc5\x7b\x84\x81\x5c\xcf\xd1\x1e\x9c\xc9\x68\x91\x1d\xda\x47\x93\x43\x63\xee\x8d\xda\x70\x79\xad\xf3\xfc\x15\x18\xcf\xf5\x62\x51\xbf\xbe\x7f\xec\x79\x9f\xac\x92\x81\xca\xdd\x66\x48\x38\xe7\x4c\x46\xeb\x8a\xf4\xb1\x5c\x6c\x0e\xba\x21\x5e\xf4\x24\xc2\x4e\x6e\x59\x16\x1f\x70\xb8\xb9\xdf\x32\x3b\xf3\x0b\x1d\x66\xf1\xbc\x4e\x4e\x44\xb9\x10\x44\x71\x66\x0e\x0d\x24\xa2\xd3\x32\xd6\xe0\x0a\xfd\x24\x9f\xbc\xf8\xc7\x1f\x83\x04\xbf\xd7\xc8\x78\xe8\x14\xe7\xd5\xdc\xeb\x7d\x84\xae\x46\xfc\xb0\x68\x8c\x08\x7f\x97\x8f\x78\x53\x83\x38\x78\xc6\xaa\x5a\x4b\x51\x63\x50\xb1\xa6\x22\x78\x81\xbe\xb7\x79\xb1\xaa\xf5\x91\x37\xda\x90\xd4\xf2\x74\x95\xf7\xc5\x07\x35\xb6\xc9\x4c\x50\x5f\x76\x10\x07\xcf\x2c\x4f\x92\x14\x92\xf7\xab\x86\xd3\xaf\xa6\xb4\xae\x29\xd1\x05\x0a\xfb\xc4\x5f\x6b\xff\xd6\xd8\xe2\x7d\x61\x6e\xe2\xa4\xe2\x33\xcd\x67\xa8\xd5\x21\x80\x83\xc7\x1d\x20\x5a\xa4\x23\xa7\x28\xde\x90\x8c\xce\x15\x1c\xd2\xd8\x28\x3d\x54\x60\xc4\xc1\xe2\x30\xf3\xb8\x69\x67\x26\xbd\x72\xc7\xe2\x31\x22\x2e\x88\x0b\x91\x41\x09\xfc\x3b\x6e\xdb\x23\x87\x5b\xaa\x31\x9f\x88\x4b\x19\x35\x27\xcc\xae\xe5\x39\x47\x5c\xcc\x36\x95\xf7\x67\x2e\x5f\xf2\xc2\xc9\x63\x6e\x53\xd8\x41\xac\x36\x40\xbf\xc4\x53\xff\xcb\xd7\x7c\xd6\xd6\x8f\x6d\x5c\xcd\x66\x6d\x5c\x1d\x57\xbf\x24\xa1\xba\xc6\x1c\x7c\xbd\x52\xee\x16\xe7\xce\xe4\xf6\x06\x33\x1b\x16\xf4\x5f\x3e\x80\x83\xcf\x9d\xba\xed\x9c\x8c\xf8\xab\x17\xf5\xef\x8e\xf8\x54\xe6\x5d\xa5\x31\xa6\x62\xf6\x3e\xe4\x50\xd2\xb4\x51\x53\xec\x05\x17\xfd\xa2\x86\x3a\xb4\x80\x38\xf8\x33\x66\x7a\xee\x91\xa2\xb6\x1d\x8e\x5b\x1b\x17\x5c\xec\x33\xe8\x70\xb5\xf0\x75\x79\x59\xed\xd8\xae\x72\x5e\x43\x67\x6d\xf0\x49\xf5\x1f\x44\x5c\x10\x07\x8f\x7b\x4c\x61\x45\xc5\x22\x61\xc1\x9b\xa0\x27\x40\x5b\xa2\xf4\xd1\x86\x41\x97\x36\x58\xd0\x1f\x3f\x32\xe4\xf5\x3c\x75\x9b\xc8\x02\xd4\x99\x01\xc4\xc1\xe7\x6e\xba\xfc\x65\x54\x8d\xd1\x3c\xd9\xcc\xf0\x5a\x9d\x27\x5b\xd1\xbe\xec\x4d\x7b\xce\xc2\xe1\xf7\x22\x15\x59\xa8\x79\x15\x27\xba\xc2\x88\xb9\x03\xbd\xce\x4e\x6d\x01\x88\x32\x99\x67\x13\xa5\x58\x1b\x75\xdf\x2c\x48\x8c\xb5\xb6\xff\xab\x15\x4a\xbd\x54\xf8\x1f\x12\xa3\x2e\x81\xa0\x6c\xaf\x28\x42\xa8\x05\x20\x80\x83\xcf\x9d\x53\x40\x70\x78\x19\xdf\xe0\x01\x1a\x17\xb3\xde\x39\x52\x35\x2c\x73\xc9\x23\x32\xd9\xdc\x6c\x26\x0b\xe6\xa6\x9a\x57\x0a\x95\x90\x43\x03\x71\xf0\x67\x7c\x8e\x98\xe4\x43\x9d\x1f\x75\x82\x0b\x53\x8a\x63\x5c\xa2\x86\xc9\xba\x16\x46\x98\xbe\x99\xf4\xc6\xe4\x89\xc6\xd3\xc6\x7d\x05\xc8\x49\x81\x38\x78\xdc\x04\xac\x4d\x3b\x46\xcf\x97\xe8\x7b\x98\x1d\x13\x73\xa5\xb2\x27\x6b\xb9\xdb\x14\x84\x0d\x7b\x32\xdf\xb2\x3d\x5b\x9e\x7c\x52\x9d\x80\xf6\xda\x01\x1c\x7c\xee\x16\x6b\x4b\x0d\x8c\x3f\x69\x59\xc9\x0c\x12\x52\x51\x93\xd8\x6c\x3c\x8a\x34\xf0\x3a\xb7\x3a\x19\x18\xd2\x52\x94\x1f\xe2\x41\xf4\x1a\x31\x77\xa0\x9c\x70\xda\xdc\xb5\x99\x45\x57\xdf\xbb\x8b\xe9\x67\x98\x7c\x9c\xfb\xc6\xaf\x4b\x5f\x66\x3a\x5b\xee\x8a\xd2\xc9\xb3\xea\x1d\xba\xa1\x04\xdc\x48\x47\xc4\x77\x06\x71\xf0\xb9\xdb\xd5\x24\xc0\x59\xbf\x6a\xfd\x40\xc5\x8a\xca\x64\x3a\x3b\xa6\x8c\xd6\x94\xda\xef\xc2\x13\xcc\xa6\x48\x7f\xea\xab\x9c\x8e\x71\xd0\xef\x19\xc4\x21\xfd\xee\x9a\xc8\xd4\x6f\x08\x0f\xd7\xdf\xba\xcd\xcb\xc9\x8a\x9b\x65\xab\x13\x73\x5d\xdc\xe1\x26\xf5\x6d\x99\x61\x45\x17\x7e\x23\x73\xe8\x9e\x14\x10\x87\xe4\xd0\x56\x9f\xfc\xbe\x41\x23\x24\x88\xaf\x69\xd5\xeb\x3d\xbc\xbc\x91\x38\xab\xda\x49\xa9\x3f\x41\x40\x84\xc6\x86\xbb\x74\x97\x4a\x13\x72\x68\x00\x0e\x3e\x77\x02\xcf\x0e\xfc\x3e\x07\x73\x5e\x29\xf9\xee\x55\xf9\x27\x58\x90\xa4\x75\x56\x28\x2a\xfe\xbc\xad\xac\x8d\x71\x57\x55\xd0\xc9\x1f\x36\xc4\xdc\x81\x12\xeb\x69\x73\xe7\xdc\x73\x8f\xb6\x25\x14\xef\xf7\xcb\xa8\xff\x8f\xb9\xb7\x8c\xaa\xa2\x0b\xfb\xff\x09\x69\x90\x96\x4e\x01\x01\x45\x1a\xa4\xbb\x43\xa4\x41\xba\x53\x40\x4a\x52\x01\x51\x29\x05\x29\x05\xe9\x0e\x11\x44\x1a\x91\xee\x06\x41\x1a\x44\xba\x1b\x04\xe4\xbf\x9e\x67\xad\x33\x8f\xf7\x1c\xd6\x7f\xee\xb5\x7e\xbc\xb8\xdf\x7f\xd6\x75\x66\x9f\xef\xcc\x5c\xfb\x3b\x7b\xef\xeb\x6a\xc2\x71\x64\xb7\x3f\x12\x8e\xab\xb5\xaa\x94\xf4\x7c\xbe\x50\xc6\xd0\xb1\x39\xd2\x04\xac\x27\x42\x71\x60\xed\x0a\xee\x49\xd7\x3e\xe6\x92\x2d\xba\xd5\x64\xf0\x9a\x5c\x70\x9e\x10\xc7\xf2\x39\x42\xd4\x41\x13\xe5\xb4\x14\x4b\xad\xc3\xe3\xdb\x40\x85\x20\x28\x0e\x6e\x0d\xad\x83\x56\xef\x44\xca\xd9\x53\x83\x88\xe5\xe8\xdc\xa2\x5c\x15\x83\xfb\x57\xe6\x98\x6a\xe0\x3a\x1a\x91\x44\xdc\x9c\x61\x3d\xd0\xf0\x19\x8a\x03\xc7\x0d\x7e\xd0\xbd\x1a\xde\xa1\xce\x8e\x9f\x75\xf7\xd3\x66\xe1\x75\xb5\x81\x59\x65\x3f\xa3\xb3\xfb\xc2\xe8\x0e\x4f\x75\x8a\xa5\xbc\x80\xbc\x0f\xc5\x81\xb5\xab\x3a\x7d\x92\xdb\x78\x6d\x3e\x9b\x4a\xa1\x26\xaf\x4d\x4a\x83\x6c\x27\xcc\x2d\xa9\x47\xdc\x84\xcb\x15\x23\x51\x4a\x79\x6a\x78\x11\xe6\xd0\xa0\x66\xf7\x97\x3b\xb4\x66\xed\x94\x89\x97\x86\x94\x52\xa4\xb3\x8b\x7a\xfb\xa1\xd3\xb5\xc9\xcd\xc6\xdf\xdc\x1b\xdb\xc9\x25\x4d\xde\xf4\xfd\x8c\xf8\xc1\x0a\x73\x3b\x50\x1c\xbc\x43\x13\xbf\xb9\x32\x52\xf2\xf1\x4e\xe1\xce\x72\x5c\x10\x2b\x9b\xb7\xbc\xa1\x7c\x4d\x04\x29\x0e\x79\x6f\x18\xd3\xfb\xe0\x02\x36\x4e\x26\x58\x64\x28\x0e\xde\xa1\x89\x70\x78\x33\x27\x05\xbf\x7e\x3e\x5c\xd2\xc2\xe9\xf5\x76\x0d\x53\x9a\x5e\xb0\xbf\x34\x1a\xf9\x73\x36\x13\x32\x62\xad\x9b\xa6\x3f\x2c\x32\x14\xf7\x3f\x0e\xed\x9f\xf7\xdc\xbf\x6e\xa1\xd8\xea\xc6\xd8\x26\xfb\xf4\x94\x22\xd6\xe3\xb1\x4d\xcf\xef\x55\x6a\x74\x21\xb9\x93\x5f\x65\xb8\xa8\x91\x3d\x4b\x2c\xd4\xa3\x3a\x5d\x7f\x3b\xb4\x74\x67\xb7\xa8\x54\xc5\x5b\x23\x1e\x3f\x75\x22\xbf\x5b\xf0\xde\x16\xfc\xec\x4d\x7c\x5e\x64\x34\x8f\x4c\xf0\x2e\x93\xfa\xc0\xa0\xfb\x2f\x34\x1c\x19\x4d\x7a\x9f\xa9\xd6\x54\xf7\xf1\xea\xb1\xfb\x2f\x77\xcb\xa7\xf3\x14\x88\x25\x1b\xf5\x27\xa7\x1d\x38\x92\xb3\xf1\x36\x32\xff\x35\x87\x06\x35\xb4\xbf\xcf\xa1\xc1\x39\x34\x8b\xaa\x47\x44\x5c\x5a\x08\x87\xc5\xce\xbf\xa4\x0d\x7d\xe5\xf7\x0c\x44\xd8\x7a\x1b\x57\x51\xc8\xb0\x2f\x78\xc6\x1e\xa8\xad\x90\x5e\xc9\xf2\x0e\xbc\x43\x3b\x14\x29\x3b\x27\xee\xa4\x9d\x95\x35\xc9\x8d\xf7\xd9\x70\xcb\xee\x63\x65\x32\xc9\xb7\xcc\xa3\xe2\xc7\xab\x88\x54\xf5\xcb\x1c\xbe\x92\xc5\x2c\x78\x87\x36\x58\x4c\xf1\xb5\xfb\xdc\xf2\x91\xf8\xcd\xf1\x6a\x66\xa2\xf6\xe6\x1b\xc1\x32\x27\x24\xeb\xb6\x14\x4c\xc4\x0d\x08\xf1\x79\xc9\x79\x57\x32\x5a\x78\x87\x26\xa6\x88\x84\xac\x30\x20\xfb\x22\x3b\x70\x50\x63\xbf\x9e\x61\x15\x55\x96\xa9\xa3\xf2\xd9\xd7\x84\x5c\x57\xaa\x69\x0f\xad\x57\x81\x57\x32\x5a\x78\x87\xe6\x59\x5c\xda\xf7\xdb\x59\x36\x45\x3f\xf4\x0e\x1f\x4a\xa8\x73\x4c\x75\x7c\xab\xca\x93\x62\x82\x5b\xdf\x3b\xe5\x0f\x6b\x9f\x10\x29\x5c\x99\x43\x83\xba\x89\x2e\xcb\x58\x59\x0e\x95\x04\x3d\xed\x34\xf6\xd3\x94\x8c\xba\x35\x26\x5c\x93\x1c\x4c\x69\x87\x34\xac\x12\xf4\x8a\xda\x39\xfb\x19\x7d\xce\xc8\xc0\x3e\x77\x08\x0e\x9c\xb1\x7e\x7f\x5b\xa6\xf7\x33\xcf\x46\x24\xaa\xcd\x74\xb9\xd9\x3c\x26\xed\x80\xe1\x96\xe0\xe5\x48\xbd\xd3\x53\x78\x82\x76\x2a\xa1\x0b\xf4\x66\x84\xe2\xc0\x99\x85\x65\x54\x45\x8d\x0f\xf7\xe1\xe2\xf5\x9c\xb8\x6f\x95\xdf\xaa\xe9\x4e\x25\x4e\x11\x3b\x5e\x0a\x38\xb0\x56\xac\x97\x7d\x57\x8a\x93\x80\xc5\x85\xe2\xc0\xdf\xfe\x3e\xd7\xf1\xbd\xb0\x5b\x8d\x42\x36\x95\x55\x5e\xc0\x49\xdb\xa7\x3d\x57\x88\x47\x9b\xcd\x7e\xdd\x7a\x48\x29\xd6\xd7\xcf\x34\x9c\x03\x8b\x0b\xc5\x05\x49\xfe\x73\x27\x82\xf0\x1c\xd3\x3e\x61\x33\x7b\x81\xd6\xe2\xe2\x46\x6b\xc7\xb1\xc2\x1d\x1f\x95\x1f\xac\xf4\x15\x94\xce\x74\x38\xec\xed\x71\x36\xd7\x60\xb3\x0d\xa8\x27\xf1\x32\xed\x2e\x0c\x3b\x7d\x11\xfb\xcb\x8c\x76\x49\xcc\x4c\xaf\x4f\x21\xf8\xfe\x6a\xdf\x5a\x92\xa9\xab\x26\x0c\x79\xb9\x91\x22\x7f\xde\xc4\x07\xbb\x66\x28\x0e\xac\xdd\x1d\xe3\x94\x76\xea\x37\x17\x2b\x7d\x3e\x13\xa6\x7b\xa7\xc1\x2c\x73\xc2\x8b\xc5\x19\xad\x58\x47\x28\xe5\xae\x26\xfa\x18\x47\x40\x41\x6e\x28\x0e\xac\xdd\x75\xb5\x2d\xf6\x39\x8a\xe0\x50\xde\xa3\x71\x7f\xb4\x00\x1a\x14\x8d\x45\xab\x49\x49\xa6\x39\x64\x67\xf7\x8c\xf5\x9a\x09\xa5\x74\x58\x5c\x28\x0e\xac\x9d\xd4\x64\xa1\x4f\xaa\xbe\x04\x7a\x44\xce\xe6\xdd\x40\xfe\x26\x91\xaf\x84\x6f\xb8\x6f\x98\xf1\xf6\xe1\xac\x78\xe1\x0f\xae\xb5\xf4\xc3\xe2\x42\x71\x60\xed\xd4\x6a\x10\x4d\x10\x47\x1a\xf8\xda\xc2\xf0\x9a\x10\xb4\x95\x5e\x87\x05\x70\xf8\x39\x57\x4e\x3d\xe3\x16\xd9\xf6\xeb\x27\x1c\xf6\x86\x69\x07\xf5\x3a\xbb\xb4\xda\xc4\xcd\x81\x6a\xff\x7a\xa3\xbc\xe0\xe4\x5f\x0d\x2f\xad\x5f\x45\xeb\xa5\x0f\x56\xb0\x06\xce\x8b\xb2\x7d\xb0\x24\x50\x7f\x97\x09\x38\x29\x28\x0e\xac\x9d\x7b\xbf\x3c\xbf\x47\x74\x4c\xc0\x93\x68\x31\x63\xbf\x43\x6e\x07\x54\x52\xed\x19\x92\xec\xd6\x23\x9e\xb1\xf0\x88\x91\xc9\xaa\x01\x58\x5c\x28\x0e\xac\x9d\x37\x01\xbf\x1f\x27\x7e\xad\x72\x97\x9f\xd2\xf3\x37\x32\x15\x96\xf3\xaf\x5f\xfc\xe2\x33\x0e\xbb\xd6\xfd\x0b\x13\xcb\xac\x75\x22\x02\x16\x17\x8a\x83\xfb\xe6\xfe\xb4\xa0\x4a\xd4\x01\x49\x83\xfa\x09\xcd\x1d\xfd\x7c\xdf\x8e\x71\x6e\xab\x17\xc8\x8a\x2d\x75\xc5\x4a\x8e\xbc\x03\xc2\xfd\xdb\xc0\x5a\x3b\x04\x07\xd6\xee\xe7\x1e\xc9\x1f\xbf\xf2\xcf\x6d\x0e\x8a\x8b\x86\x5d\x4a\xf9\x9e\x64\xb4\x2f\x11\x06\xf5\x9a\x22\x9f\xb6\x28\x23\x56\x61\x63\xa6\xc2\xb4\x83\xca\x09\x97\xee\x0c\x27\x61\x7f\x10\xcf\x29\x3a\xef\x58\x87\x6c\x2f\x74\xa3\xd7\x7a\xbe\x55\x5f\xb6\x7d\xb6\xe9\xd0\xba\xc3\x4e\xf9\xe7\xaf\x66\x26\x60\x67\x38\x04\x07\xd6\x2e\x4f\xe4\xa7\xea\xd0\x89\xaf\xe9\x73\x15\x61\x92\xc0\xf2\xce\x1b\x88\x16\x2e\xc2\x81\x8c\xf7\x55\x97\x5c\x71\xe2\xf6\x47\xd7\x04\x61\x71\xa1\x38\xb0\x76\x9a\xb2\x9b\xe6\x56\x21\x43\xb7\x76\x17\xf0\xb6\x68\x44\xb9\x82\xfa\x7a\x7d\x38\x4b\xa2\xbc\x10\x68\x15\xc5\x98\x66\x89\x59\xb0\x61\x71\xa1\x38\xb0\x76\xee\x08\xd3\xd5\x73\xb7\xf6\x6d\xc5\x45\x37\xd7\x4a\x3a\x1d\x89\x59\x7b\x9a\x9c\x72\x91\xdc\xc3\x50\x66\x82\x86\x35\x22\x7f\x2b\x02\xf7\x1a\x04\x07\xd6\x2e\xdc\xe0\x71\x5d\xfc\xb0\x31\x75\xb0\xee\x8d\x35\xb7\x8f\xa3\xa5\xb1\xfc\x08\x6f\xc9\x94\x14\xd1\x88\x8c\xef\xca\xdd\xb1\xde\xb2\x87\x69\x07\x95\x58\x2f\xd3\xae\x8c\xbb\x85\x15\x27\xef\xc8\xaa\x0e\x8f\x67\x32\x66\x84\xd0\xd7\xd8\xd0\xdc\x05\x9d\xf5\x7b\x58\x73\x93\xf3\xd2\x86\x66\x07\x15\xec\x9a\xa1\x38\xb0\x76\x4c\x53\x1d\x21\x5c\x24\x41\x84\x8f\x0a\x18\x99\x0c\x30\xac\xc4\x93\x16\x47\x74\x26\x35\x83\x8f\xc7\xb1\x4f\x11\x33\x35\x55\xcc\x81\x35\x29\x08\x0e\xac\x9d\xd2\x73\x8f\xac\x65\xca\xaf\x12\xe5\x1e\x66\x3c\x71\xc8\x8c\xd4\x47\xfe\x95\x09\x2e\x2a\xed\x29\x25\xcb\x8c\xcf\xbe\x5f\x0f\x01\x9e\x3b\x28\x0e\xac\x5d\x6a\xc7\x72\xb5\xbd\x88\x12\x3b\x2b\xf3\x05\x56\xda\x59\x94\xeb\xb2\x98\xde\xbd\x35\xd4\xb0\x4f\xed\x61\xd2\x27\xaf\x65\x6f\x00\x3b\x75\xa1\x38\xb0\x76\x5a\x9f\xcc\xda\x84\xb8\xbc\xf6\x1d\x49\x5a\xe9\x3c\x7c\xc9\x1f\xa8\xae\x72\xa2\x2b\x4f\x05\x6a\xfc\x88\xd1\xf8\xcc\x2d\xf3\x0d\x13\xe6\xd0\xa0\x66\xf7\x97\x3b\x34\xfa\x4c\x0e\x49\x8e\x3a\xf5\xf4\x6b\xe3\x31\x51\x05\x37\xb4\x78\xc5\xfc\x03\x06\xbd\x30\x9f\x9c\x67\x70\x88\xfe\xbe\xab\xb8\x09\xd4\xf3\x80\xe2\xe0\x1d\xda\xda\xb0\x6e\x77\xc0\x7e\x6c\x57\x2e\x6a\x68\xcb\x26\x29\x5d\xd6\xf9\xba\x5f\xaf\x8f\x90\x89\xf3\x74\x75\xe8\x3e\xba\xf6\x5b\x19\x58\x64\x28\x0e\xde\xa1\x19\x87\xf2\x28\xa7\x18\x8d\x44\x9b\xb9\xd7\x1d\x65\x55\x99\x84\x97\x20\x88\x88\xe0\xcb\xe0\xd7\x5b\x50\x12\xbd\xdb\xe4\x2f\xd1\x84\x45\x86\xe2\xfe\xc7\xa1\xfd\xb3\xae\xe7\xbf\xee\xee\x57\xd7\x8e\x78\xc0\x13\x69\xdc\x84\xd2\xae\xd1\x3f\xcd\x1b\x88\x53\xb3\x62\xea\x5e\xcb\x54\xb4\xe4\x76\x12\x38\x2b\xef\xa5\x8e\xf3\xb7\x43\xab\x7f\xa5\x54\xb0\xce\x84\x42\x3c\x9c\x7c\xf0\x12\x0b\xad\x54\x0b\x93\x20\x96\x55\x28\x91\x0b\x69\x6b\xd3\x42\xa3\x68\x5a\xf5\xe1\x5f\xe8\xce\xc7\x3d\x36\x66\x2f\x53\xdd\x6d\xe1\x9c\x95\x8b\xaf\xa7\x68\x99\x99\x77\x9c\x50\x96\xb6\x86\xde\xb3\x7e\x78\xb8\xb4\xba\x5b\xf4\x5f\x73\x68\x50\x43\xfb\xfb\x1c\x1a\x9c\x43\x1b\x3e\xea\x73\xad\xbc\x39\xcc\x1a\x72\x2c\xbe\x82\x5d\x2a\x89\x80\x4d\x92\x64\xec\xa2\xbc\xcd\xd7\x65\x48\x66\xd2\x91\x84\x53\x7c\x25\xcb\x3b\x5c\x70\xe6\x41\x31\xd2\xb4\x50\x89\x2d\x0a\x71\xc6\xbd\x86\xf0\x91\xd1\xd2\x89\xfb\x59\x46\x59\x1a\x3a\x09\xb7\xfd\xcd\x6b\xb3\x3d\x87\x7a\x88\x57\xb2\x98\x05\xef\xd0\xf8\x70\xc8\x13\xb8\x34\x48\x84\x8f\x78\xfd\x49\x11\x90\x23\x19\x2d\x4d\x78\x8c\xe4\x7a\x3a\x7a\xf3\xd8\x28\xdf\x6f\x7c\xa4\xba\x9a\xa5\x3b\x3d\xf8\x5e\x86\x74\x95\x6b\xc9\x43\x21\xee\x1b\xab\x43\xeb\x16\x99\xc6\x5c\x8b\x73\x27\xed\xee\x37\x75\xcf\x36\xf3\x79\xcc\x0f\x04\x0d\x24\xae\x64\xb4\xf0\x0e\x2d\x55\x74\xfc\x9b\x95\xf3\x43\xf5\xb9\x44\x9a\xc0\x93\x72\x04\xcd\x03\xed\x59\x29\xdd\xac\x1b\x17\xfa\xbd\x69\x04\xcb\x11\x51\x46\x57\xe6\xd0\xa0\x6e\xa2\xcb\x32\xd6\x4d\xec\x8e\x87\x5f\x67\xcb\xaf\x0d\xbf\x7f\xc3\xa2\x82\x61\xf2\x48\xab\x52\x21\x16\xc1\x82\x35\xf3\x33\xd7\x9b\xdb\xda\x9d\x75\x40\xcd\x45\x28\x0e\x6e\x0d\xad\x21\x34\xd1\x39\xf3\x8b\xe4\xfd\x71\x8b\xbb\xa8\x17\xfb\xa6\x7f\x4a\xfb\x95\xfc\x3c\x45\xf6\xfb\x34\x42\x5a\x5d\xf9\x8b\x81\x6f\x74\x50\x1c\x38\x63\x95\x29\x45\x1b\xe8\x6a\xea\xbd\x9a\xea\x32\xc8\x4d\x72\x46\x11\xda\x67\x28\xcc\x4d\xb7\x7f\xf4\x3d\x3d\x6a\xd1\x21\x99\xa7\x15\xe8\xee\x07\xc5\x81\x33\xd6\x4b\x0b\xfe\xc7\xde\x42\x2a\x2c\xcb\xd7\x13\x14\x3a\xbe\x1a\x2b\x2e\x10\x60\x73\x5e\xc4\x92\x22\x87\x0b\x0c\x18\x22\x31\xcd\x1a\xc1\xe2\x42\x71\x41\x92\xe2\xff\xf8\x1f\xf4\x23\xef\x4d\x69\x53\x3c\x11\x68\xec\x5b\xd3\x66\xfb\x40\x65\xc0\x2d\xfa\xa4\xd1\x27\xee\x79\x3f\xc2\x0b\x8f\x9a\x4c\x96\x83\xeb\xb0\xd9\x06\xd4\x93\x78\x99\x76\x96\x2c\xbe\x4a\xcb\xbd\xe4\x13\x86\xbe\x1c\x2f\x0e\xdf\x4c\xbb\xf6\x6e\xca\x69\xa4\x72\xd5\xc6\xda\x69\xdc\x43\xaa\xdf\xde\x13\x83\x5d\x33\x14\x07\xd6\xce\x7f\x18\xad\xe6\xbc\xe9\x6b\xd1\x37\xfc\x5b\xf9\x0a\x69\x09\x33\x3c\xf9\x2c\x1e\xcd\x79\x3f\xbf\x98\x29\x6e\xd6\x92\xd8\x0e\x7e\x02\xaa\xb1\x40\x70\x60\xed\x22\xfb\x04\x62\x5e\x8b\x2b\x95\x13\x18\x6e\xa4\x8b\x93\x1d\x7e\x7a\x25\x7f\x28\x34\xb8\xf8\x64\xa5\xad\x4d\xbd\xd7\x2c\x78\xfc\x15\x2c\x2e\x14\x07\xd6\x8e\xda\xea\x3c\x54\x64\x8f\x7e\xef\xed\xb6\x4c\x40\x49\xbd\x01\xbd\xf3\x8f\xba\xd4\xfe\x5e\x2a\x45\x2c\xea\x24\xc3\x07\xa3\x49\xc0\xee\x49\x28\x0e\xac\x5d\xf2\x60\xb5\xe1\xab\x68\x29\x9a\xb5\x20\xb4\xa5\xf2\x00\xee\x24\x7e\x2a\xab\x21\x05\x64\x6c\x4c\x9b\x07\x11\x06\xee\x0c\xe2\xc0\x4e\x39\xa8\xd7\xd9\x65\xda\x91\x34\x75\x61\x7c\x47\xfb\xa3\x8f\x68\x88\xf6\x69\x84\xf8\xa6\x18\xbe\xcf\x90\x06\xc6\x0f\xab\xbb\x71\xd4\xb8\x4a\x03\x73\x14\x40\xab\x7e\x28\x0e\xac\x5d\xf8\x8d\x6b\x62\xf8\x77\x22\xf6\xc2\x91\xdb\x9a\x39\xb9\xe9\x1c\x05\x85\x3c\x55\xe5\x8c\x10\xbc\xbe\xec\xbe\xec\xfa\x1a\xae\xfa\x19\xa8\xe8\x01\xc1\x81\xb5\x13\x47\x91\x28\xab\x41\x34\xf6\x42\x45\x97\x5f\xec\xcc\xfe\x89\x52\xba\x47\x87\x31\x5f\x8c\xc1\xf9\x81\x9e\xa5\x36\xd4\x3c\xd3\x14\x16\x17\x8a\x03\x6b\xf7\xc8\xf1\xcb\x7a\xe0\xb1\x82\x95\x69\xa9\x75\xb1\x52\x85\xd6\xe4\x8a\x6d\x9f\x9f\x43\xd7\x1b\xce\xa9\x0c\x21\xff\xdf\x3e\x47\xcf\x81\x75\x18\x08\x0e\xac\x9d\xfc\x43\x65\x35\x4a\x02\xd6\xc9\x57\x35\x24\x2f\x95\x44\x6f\x5c\x73\x60\x29\xdd\xcf\xc7\xbc\x28\x97\x66\xb4\x4f\xbe\xfd\x9a\x43\x0d\xa6\x1d\x54\x4e\xb8\x4c\x3b\x01\xdb\x20\x14\x8b\xa2\x93\x92\x92\xa4\x2c\x6d\x5e\x4f\xe1\x37\xcf\x35\x42\x14\xd2\x31\xbf\x65\x79\x31\xc5\xb6\x7f\x54\x3a\xf9\x0a\xbb\x66\x28\x0e\xac\x9d\x12\x19\xca\xfb\xe8\xbc\x57\xb8\x72\x92\x0c\xf2\xb6\xa9\xf2\xf4\xe7\x4c\x79\x4f\xc9\xee\x7a\xfa\x7c\xc2\xbf\xeb\x16\xd9\x58\x08\xc4\x85\xe2\xc0\xda\xe5\x4b\x5b\x59\xd9\x0e\x7d\x7e\x9b\x88\x76\x52\x69\x5c\xcf\x73\x78\xc1\xec\xf6\x15\xa3\xde\xc1\xf0\xfb\xa2\xa0\xa8\xa3\xc1\x6f\x60\xdf\x01\x14\x07\xd6\xae\xcc\x64\xc1\xcc\xcf\x46\xe9\xd5\x0a\xb3\xd4\xa3\x61\x1b\xfd\x9a\xfb\x37\xb2\xee\xff\x66\x91\x3f\x17\x20\xaa\x5f\x8a\xe8\xb4\x06\xea\x70\x42\x71\x60\xed\x74\x1e\x3f\xfe\x56\x1e\xf4\x00\xff\x18\xdf\xd1\x15\x2b\x1c\x7f\x28\x49\x6b\xa7\x19\xbf\x8d\x86\xd6\xf6\xf0\x91\x3b\xff\x17\xf3\x05\xa0\x96\x23\x44\x62\xbd\x4c\xbb\x3f\x72\xe4\xd5\xe9\x25\xb4\xbe\x01\x14\x5b\x4f\xc5\x47\xfa\x2a\xa2\xc9\x43\x12\x45\x77\x06\x17\x0b\x1f\x68\x0b\x22\x8f\xcd\x00\x6b\x5d\x50\x1c\x58\xbb\xba\xc2\x5c\x1f\xf4\xbb\x7b\xe7\xc8\x42\x69\x03\x0f\x82\x1f\xa6\x33\xcc\x63\x57\x25\x07\xd1\xb5\x17\x23\xca\x2f\xcd\xf4\x26\x02\x95\xa6\xa0\x38\xb8\x33\x84\xa3\x63\xba\x82\x3a\xd6\x87\xf9\xb5\x1d\xad\x79\x33\x34\x11\x0f\xac\x50\x2c\x4d\x38\x4a\x49\xda\x9f\x74\xbc\xbc\x7f\xc3\x1b\xb8\x27\xa0\x38\xb0\x76\x2c\xb7\x3f\x0f\x3b\x09\x09\x44\x90\x33\xb4\x4b\x97\x62\x1d\xa6\xa0\x92\xe0\x76\xad\x6b\x66\xc5\x3f\xc6\x0b\x22\xc8\xa5\x60\x01\xce\x9f\x43\x71\x60\xed\x1c\x92\x9e\x46\x15\x78\x5e\xe3\x3a\x0d\xa1\xf9\xd0\x91\x88\x31\x5e\x1f\x8d\xfe\xb5\x6d\xdb\xef\x61\x9c\xbf\x81\x6d\xa9\x48\x46\x3f\xcc\xa1\x41\xcd\xee\x2f\x77\x68\xe1\x7f\xd4\x45\x1d\xee\xd5\x0d\xc6\xae\x16\x7a\x18\x33\xd5\x8a\x34\xdf\xab\x0c\x26\x98\x71\xee\xa0\x9b\x50\x4f\x68\x7c\xba\x59\x03\x73\x3b\x50\x1c\xbc\x43\x1b\xef\xb5\x8e\x9c\xd5\xaa\x1f\x2b\x15\x6d\xdc\xf2\x23\xfb\xf4\x2c\x7e\x2b\x0b\x91\xb9\x7b\x4e\x1b\xbf\xd9\x81\x6b\xee\xdd\xb8\x16\x2c\x32\x14\x07\xef\xd0\xde\x5c\xcb\xcd\x57\x40\xe3\xa7\xbd\x4f\xcb\xfa\xdc\x95\xc6\x74\x64\x9e\xe4\xc3\x00\x27\x59\xf9\x8f\xaa\x99\x54\xa9\xce\x30\x22\x23\x58\x64\x28\xee\x7f\x1d\xda\x3f\x34\xfc\xd7\x6d\xe7\xe4\xd2\xc4\x5d\xdf\xa4\x58\x97\x84\x3a\xff\x7c\xfc\x34\xac\xb5\xd2\x25\xac\x63\x78\xa9\x98\x22\x3e\x53\xa8\xc0\x06\xd9\x7a\x92\x3a\xf4\x1f\x86\x52\x69\xf4\xa4\xfd\xa8\xf2\x26\xbe\xe7\xd3\xb9\xef\x31\x54\x9a\xf7\xb1\x46\x11\x97\xef\x87\x67\xd5\xca\xdf\xbb\x1b\x5e\x32\xfb\x17\x5a\xa2\x36\x36\x1e\xc8\x95\xb2\xb7\x46\x33\xb3\x25\xa3\x9b\x49\xc6\xf5\xd4\x2b\x9f\x4b\x17\x37\xde\xb2\x0e\x5d\x00\x7d\x6b\xf1\xf7\x7f\xcd\xa1\x41\x0d\xed\xef\x73\x68\x70\x0e\xcd\x5e\x5b\x27\xae\x2d\x4d\xbb\x9c\x7d\x4c\xb1\xc9\xdb\xaf\xba\x3c\x27\xa3\xea\x7d\x6f\x57\xd6\xc4\xc0\x13\xb6\x1a\x97\x5c\xae\x96\x2b\x59\xde\x81\x77\x68\xc1\xde\xe1\xcb\x59\x3b\x2a\x86\xce\xd3\x13\xf3\x9e\x3e\xba\xdf\x42\xd2\x65\x05\x52\x11\x7f\x79\xfe\xce\x3e\x5b\x5a\xfd\xf1\x14\xf5\x4a\x16\xb3\xe0\x1d\xda\x38\x66\xa3\xee\x53\x4e\xd3\xd0\x63\x4e\x09\x61\x7e\x34\x35\xdd\xb5\xb2\xaa\xd9\x72\x0a\xce\xc4\x05\x07\x1d\x9d\x38\x7d\x7d\xe7\x2b\x19\x2d\xbc\x43\xeb\x7f\x83\x4b\x4b\x71\xc0\xed\x83\xf5\x1d\x4b\x4a\xf7\xf9\x87\xf2\x89\x74\xc2\x70\x27\xa4\xa2\x58\xb5\x37\x86\xfb\x37\x8c\x25\xaf\xa4\x72\x65\x3d\xbc\x43\x0b\xf4\x0b\xea\x2a\xb3\xdf\xfb\x98\xd5\x66\xd5\xeb\x83\xba\x6d\x60\xe0\xf6\xaa\x52\xb2\x22\x7f\x30\x6b\x48\x24\x4b\x3a\x28\xf9\xf0\xca\x1c\x1a\xd4\x4d\x74\xe9\x59\xa6\xe9\x07\x08\x69\x21\x8d\x13\xcf\x7d\xfb\x22\xc8\xab\xca\xe4\x92\xd8\xdc\x26\xf6\x24\x31\x47\x83\xd6\xef\xe0\xf4\x5c\xab\x06\xce\x8b\x41\x71\xe0\x8c\xd5\x5f\x2e\xe5\x71\x81\x88\x69\x4b\x3d\x94\xe3\x83\x74\x5d\x5a\x75\x5c\x5e\xd0\x7c\x9f\x6a\xfc\x9a\x5a\x9a\x5b\x55\x4f\xa6\x36\x50\xd1\x03\x8a\x03\x67\xac\x05\x81\x02\x93\xee\xe8\x91\x49\xc5\x7c\x07\x5f\x82\x8d\x3f\x6a\xc4\x1d\x27\x9f\x6a\xe4\x1a\x7b\x2c\xf2\xf9\x82\xd1\xd5\xbd\x80\xca\xd1\x50\x1c\x38\x63\xad\x98\x21\x64\x2e\xdb\x0f\xbc\x64\x4e\xfa\x63\x42\x9d\x24\xcd\xf6\x30\xd8\x96\xf1\x80\x52\x74\xa7\x36\xd1\x5f\x30\xaf\x52\x54\x0b\xa8\x62\x01\xc1\x81\xaf\x77\xfe\x49\x79\xad\xdd\x3b\xdd\x79\x97\x4f\x77\xf3\xf0\x98\x5f\x50\x3f\x5b\xf3\xda\xf8\x90\x69\xa9\x74\x7b\xfd\x69\x1e\x33\x2b\x71\x26\x6c\xb6\x01\xf5\x24\x5e\xa6\x1d\x16\xc2\x05\x21\xa5\xfd\x34\x4f\x86\x26\x45\x90\xf0\xc4\x6e\xbe\x6d\x85\x0a\x77\x7f\x94\xb0\x38\x39\xdf\x70\x62\xd6\x49\xdd\x47\xd8\x35\x43\x71\x60\xed\xe6\xcf\x3e\x46\xdf\x5a\xa0\xc6\xc9\x0f\x94\x25\xc1\xbe\x26\xf0\x7e\x70\x7e\x2e\x1d\x3d\x78\x2f\x4a\xf0\x44\xa5\x03\x13\x8f\x1d\xa8\x1c\x0d\xc5\x81\xff\x8b\x72\xc3\x28\x02\xc9\xd3\x9d\xf7\xef\x22\x07\x39\x65\xe9\xd6\xba\x49\x25\xc2\x97\xf8\xf7\x0a\xea\xad\xc5\x34\x10\xdf\x9c\x5a\x03\x67\x35\xa0\x38\xb0\x76\x84\x1b\xaf\x86\x42\x84\x2e\x9e\x63\x95\xe9\xd2\xea\xa5\xfa\xc9\xf5\xa0\x89\x7a\x39\x10\xe1\x09\xca\x66\x3b\x88\xc6\x1a\x53\x1f\xc1\xe2\x42\x71\xe0\xeb\xa5\x9d\x2a\x9f\xa7\x4e\x8b\x8d\x32\xd2\x10\x0c\xa3\xe8\xdf\x09\xdf\xb2\xca\xa2\xce\xa4\x7a\x9f\x17\xfa\x70\x63\x74\xba\x9a\x59\x1b\xa6\x1d\xd4\xeb\xec\x32\xed\x5e\x06\x7b\xe7\x47\xd2\x4e\xb3\x14\x99\xe9\x28\xef\x22\xd0\x06\x67\x5b\x27\x69\x3c\xf4\xc7\xb3\x7f\xbc\xba\x6f\xad\xe4\x4b\x21\x0e\x7c\x11\x80\xe0\xc0\xda\xe9\x75\x50\xdf\x41\x7c\x6d\x28\x61\x9f\xb9\x35\x85\x6e\xe0\x48\xd0\x45\x39\xa7\x74\x9a\xdc\x92\x24\x97\xfd\xdc\xe5\x58\xfa\x04\xb8\x27\xa0\x38\xf0\x7f\xf1\x7e\x24\x32\x95\x93\x92\x81\x79\x7f\xe3\x06\x1e\x47\xf6\xea\xca\xb4\xa4\x50\x2f\x52\xc5\x00\x51\x83\x98\xd7\x5b\x8e\xcc\x47\xc0\x0c\x14\x8a\x03\x6b\x47\x4e\xcc\x5f\xfb\xa9\x28\x28\x69\x52\xcf\xd8\xe2\x94\x2b\xc9\x81\x3d\x26\xf3\xfa\xbd\x3b\xcd\xd8\x84\xc5\x9e\x26\x68\xd2\x34\x40\x33\x7d\x28\x0e\x7c\xbd\x68\x71\xd1\xfc\x56\x21\x88\x56\xb8\xba\x5a\x8c\x73\xcb\x64\x6d\xf6\xba\xea\x32\x6f\xb1\x7d\xba\x83\x35\x8c\x69\x59\x04\xdd\xb1\x61\xda\x41\xe5\x84\xcb\xb4\xab\xf1\x7f\xf3\xc5\x3f\x3b\x3a\xb6\x00\xe5\xbe\xb2\x45\xe0\xe0\xfb\x28\xd4\x69\x03\x96\x28\xc1\x9e\x6d\xff\x5c\x54\xc7\xc0\xe2\x35\xd8\x35\x43\x71\x60\xed\xa4\x02\xd1\x92\x72\x73\xe4\x77\xf9\xf8\x7b\x5a\x5f\x30\x95\x87\x18\x7d\x34\x69\x53\xad\x48\x2e\x9b\xaa\x5f\xcd\xda\xd3\x96\x29\x00\xd6\x82\x21\x38\xf0\x7f\xb1\xde\xdd\x1a\x2e\xb0\x9c\x4f\xb0\x40\xda\x7d\xbf\x05\xfd\x8e\x0f\xa2\x85\x39\xbb\xeb\x31\x05\x49\xfb\xba\x56\x72\xf5\x0d\x7b\x4f\xe0\xcc\x23\x04\x07\xd6\xae\xef\x25\x66\x9e\xe1\x94\xd8\x1d\xc1\xd5\x31\x19\x74\x54\xf4\x53\x36\x2c\x45\x97\xf4\xe0\xe9\x26\x8e\x45\x57\x21\xcb\x40\xc1\x9b\x40\xf5\x18\x08\x0e\x7c\xbd\x17\x52\x83\x03\xd5\xb8\x5d\xcb\x5f\xd3\xf2\xeb\x97\xea\x03\x91\x4c\xa5\x34\x34\x50\x4c\x45\x5b\xd3\xeb\x0b\x42\x6f\x17\x1a\x59\xc2\xb4\x83\x4a\xac\x97\x69\xc7\x32\xea\x7b\x43\x35\xc6\x31\xf8\x3d\xea\x48\xde\x4e\x25\xb6\xaa\xc0\x4d\x24\xe2\x67\x35\x7f\x76\x5c\x83\x5c\xb1\x88\xf7\x02\xfb\xfe\x6f\x0f\xc6\xff\x3f\x07\xd6\x4e\x2d\x69\x6c\x4c\x20\xe8\xd7\xd0\xdb\x38\xb5\x52\x21\x82\xcf\x3f\x23\x23\xdf\x9a\xa9\x88\x58\x3f\x36\x11\x66\x7c\x23\xbd\x2a\x09\xac\x89\x43\x71\x70\x5f\x46\xbe\x7e\x8b\x9f\xcd\xfa\x80\xeb\xb3\x56\xfa\x71\x9b\x67\x4a\xeb\xa2\xfe\xfd\x45\xf7\xda\x0c\x0a\x53\x50\x97\xef\x59\x59\xa3\x1d\xf0\x65\x04\x82\x03\x6b\x97\x3b\x73\x77\x36\xdf\x6a\x7c\xd3\xd2\x9c\x73\xd8\xab\x26\x1e\x53\x42\x51\xe7\xf0\xd7\x6c\x13\x0a\x8b\x46\xf5\xa4\xb3\x6d\x3f\xe0\xfc\xa0\x38\xf0\xf5\x8a\x48\xeb\x8d\xf6\xf6\x1b\x85\xd7\x8a\x0b\x86\xdf\xb0\x7d\x3b\x81\xf2\xc1\x92\xec\x41\x27\x57\xfa\x2b\xc2\x1d\x79\xe1\x06\x32\x56\x98\x43\x83\x9a\xdd\x5f\xee\xd0\x14\x6f\x1a\xad\x3d\xba\x67\x3e\xd6\x1d\xb8\x35\xfd\x92\xd6\xd3\xae\xf3\xa5\x21\xde\x1d\xe1\xc8\x92\xdf\x7b\x1c\xdd\x7d\xc4\x0c\x64\x30\xb7\x03\xc5\xc1\x3b\xb4\x7e\x01\xe1\x51\xd5\x39\x77\xd9\x7a\xb6\x98\x5f\x4d\xae\x1a\x12\x82\xaa\xa6\x9f\x9d\x48\xf4\xdd\x30\x0d\x82\x9a\x1e\xb1\x94\x6e\xc2\x22\x43\x71\xf0\x0e\xcd\x40\xcb\x6a\xab\x9a\x84\x83\xcc\x17\x5d\x85\x27\xe9\x43\x64\xaf\x9b\x8e\xd1\xc6\xd9\x83\x16\x67\x59\xbe\xd0\x5b\xb6\xe8\x1c\xc4\xb0\xc8\x50\xdc\xff\x3a\x34\xda\x7f\xec\x6b\xf8\xb7\xfd\xd0\x22\x4a\xde\xf3\x76\x36\x8b\x93\xf1\xf0\xff\xcc\x35\xa8\xc9\x64\xf4\xa2\x19\xb3\x59\x27\x78\x5f\x7f\xef\x2c\x3c\xb8\x28\xd9\x38\xe3\x6f\x87\x66\xb6\xdf\x7b\x2d\x53\xa5\x3f\xf2\x33\xa5\x73\xf9\xeb\xe7\x3c\x6f\x3e\xb2\x6a\x64\xdd\xc6\xb2\xb6\xe3\xd5\xc3\x0f\x3c\xe0\xb8\x48\xf8\x0b\x5d\x54\x1a\x4e\x1e\x51\xc9\x61\xec\xe9\xfc\xc0\xbc\x87\xf9\x94\x7f\x33\xe4\x23\x59\x80\x6b\xed\x58\xec\x85\x59\xa4\x8a\x88\xf0\x7f\xee\x1c\x1a\xd4\xd0\xfe\x3e\x87\x26\x07\x9e\xc5\x53\xf9\x9c\x73\xc4\xab\xc4\xae\x13\x8a\xa4\xfe\xd1\x97\x45\x48\xaa\xff\x81\x21\x20\x52\xe6\x1f\x70\xc3\x37\x46\xe1\xf8\x69\xf8\xe9\x95\x2c\xef\xc0\x3b\xb4\x1b\x93\xef\xaa\xee\x36\x75\x2a\x8f\xf1\x51\x7c\x60\x41\xa6\xba\x68\x2a\x99\x5d\x7c\xa8\xf0\xf3\xe1\xfd\x7c\xba\x53\x22\x0f\x2f\xbc\x2b\x59\xcc\x12\x85\xb7\x4a\xae\x23\x76\xbd\x0a\xd9\x0f\x12\x91\x6b\x8f\x27\xc4\x87\x1e\xba\x63\x47\x62\xe6\xec\x97\x76\x4a\x54\x64\x69\x34\x7c\x8d\xdb\xbb\x92\xd1\xc2\x3b\x34\x09\x13\x32\x25\x34\x5d\x17\xf7\x2f\xab\xae\x41\x1f\xb1\x22\xf4\xaf\xed\xc8\x25\x66\xd3\x6c\x24\xd5\xad\x55\x7b\xdd\xd6\xfa\x1c\x71\x25\xa3\x75\x87\xfb\x59\x8d\x0f\x83\xd6\xc6\xba\xe3\x29\xd2\x54\xc1\x09\x43\x33\x02\xa2\xb8\x09\x28\xe3\x73\x09\xe7\x5f\xb6\x8f\x49\x69\x95\xe9\xf4\x5c\xae\xcc\xa1\x41\xdd\x44\x97\x65\x2c\xfd\x88\x66\xb7\x58\x1f\xa7\xea\x6f\xbe\x15\x2f\x18\x30\x23\xc8\xfc\x71\xf7\x7f\x1f\x98\x3a\xad\xd9\x88\xed\xee\x75\x61\xac\x00\x7d\x51\xa0\x38\x70\xc6\x8a\xc7\x42\x8f\x8b\x6d\xb3\xa4\xe1\x0a\xfc\xcd\xae\xd5\xed\x85\x96\x33\xd5\x3d\x2b\x10\x95\x4f\x44\xc3\x27\x89\x58\xfc\xe1\x39\x50\x97\x0c\x8a\x03\x67\x00\x2e\xc7\xfd\x25\x92\xbe\x97\x94\xb5\x8d\xb8\x82\x54\x3e\xdf\x5a\x78\x59\x15\x99\xdf\x9e\xca\xae\x1e\x6c\xf7\xc9\xa8\x07\x20\x02\x0d\xbc\xa1\x38\x70\xc6\xca\xbc\x75\x9a\x46\x2c\xf6\x96\x72\x66\xf0\xf6\xd0\x79\xa6\xca\x22\xa1\x9a\x24\xee\xd3\x03\x29\xc1\x6d\x5f\x4b\xf9\xad\xfe\xb3\x37\xb0\xb8\x50\x5c\x90\x24\x82\xf8\xdf\x71\xf9\x51\xf9\xa9\x53\x52\xd9\xe9\x3b\x06\x2b\x94\xd4\x2c\xb7\xd5\x28\x79\x5f\x67\x58\xd4\x70\xee\xef\xaf\xb6\xdc\x2e\xa9\xdf\x07\xfa\xa1\x41\x3d\x89\x97\x69\x87\x79\x13\x87\x09\xe5\x2b\x2a\xda\xbd\xd9\x0a\x61\xec\x1f\x07\x32\xec\x2c\xe3\xdb\xd7\x12\x4f\x53\xbb\x0e\xb4\x6c\xab\x02\x34\x81\x7a\x5c\x50\x1c\x58\xbb\x21\x1e\x15\xa5\xad\xf6\xc6\xcf\x8e\x62\xf1\xfe\x63\x32\x28\x46\x6d\xf6\xdf\x7d\xe2\x4a\x2b\xc7\xb6\xf9\x7d\x2c\x53\xc4\x12\xda\x61\x71\xa1\x38\xb0\x76\xfa\x87\xd7\xa7\x69\x3d\xf8\x63\xd9\xdd\x51\x13\xc6\xe8\xbc\x7d\x1c\x0b\x85\xfd\xf1\x62\x0b\x51\x68\x7c\xed\x0d\x13\xcb\xc4\x28\x81\x7b\x0d\x82\x03\x6b\xd7\xff\xcd\x91\x35\x9f\x6b\xd3\x43\x83\xda\xe9\x77\x6d\xe5\xe3\x8d\x92\xee\xcc\x92\x68\xd9\x87\x76\xac\x9f\xd3\x85\x73\xda\x3c\xd8\x81\xaf\x01\x10\x1c\x58\xbb\x90\x0d\xcf\x2f\x95\x77\x28\x5f\x7f\x37\xaa\x7c\xd7\x23\xe5\xd4\x59\x17\x1d\x95\x27\x2c\x53\x12\xaf\xc8\xe5\x23\x7b\xef\xe9\x66\x3b\x30\xcb\x87\x78\x9d\x5d\xa6\x1d\xa1\x8b\xc5\x4a\x6e\x68\xd2\xc6\x23\x89\xeb\x05\xc4\x18\x61\xe3\x5c\xb4\x78\x47\xc1\xc9\xbf\x6b\x9a\x29\xd9\x6b\x3f\xc4\x9b\x00\xfd\xd0\xa0\x38\xb0\x76\x6c\x58\x4f\x95\x28\x82\xde\x37\x34\x62\x13\x51\x9c\xb5\x3c\x23\xe1\xb0\x0b\x97\x60\x66\x99\xcf\x4b\x91\x24\x43\x8d\x59\x75\x05\xce\x7f\x42\x71\x60\xed\x6c\x7e\x26\x10\x3f\xf6\xfa\xf0\xfd\x2e\xa6\x93\xa6\xa6\xbd\x25\x65\x06\xfb\xf2\xb9\x74\x90\x15\xc1\x87\x26\x44\xc2\x40\x26\x7c\xc0\x3d\x40\x71\x60\xed\x18\x16\x07\x22\x46\xa2\x37\x9e\xe7\xbd\x9f\x55\x54\xd7\x67\xf8\x7a\x58\xfb\x60\x9d\xf3\x55\x64\x36\xb9\xbd\x3b\xcf\x6f\xa3\x60\xa0\xa6\x25\x14\x07\xd6\xce\xec\xe1\xe6\x61\x94\x21\x4a\x9d\x3d\x0b\xf3\x0d\xe1\x3d\x92\xe9\x06\x15\xbe\x85\x95\xea\xfa\x99\xeb\xaf\x72\x57\xa8\x26\x98\x3b\x61\xda\x41\xe5\x84\xcb\xb4\x7b\xe8\x69\x15\x38\x2d\x92\xf4\x39\x8a\x58\x30\xa1\x12\x6f\xfe\x79\xc6\x1b\xd9\x31\x9e\x18\xc6\xb4\x56\xac\x96\xbb\xbe\xcf\x6e\x50\x03\x15\x6f\x20\x38\xb0\x76\xbe\x85\x21\x8c\x3f\x5e\x85\xf4\x93\x06\x37\xbf\xe3\x5e\xcf\x68\xc3\xbb\xc9\x80\xf1\x90\x64\xa2\x9f\xf2\xba\xb6\x3f\xcf\x07\x35\xa0\x5f\x20\x14\x07\xd6\xce\x75\xcf\x3d\xfc\xce\xf2\xae\x96\x3a\xaf\x76\x8d\x79\xcf\x63\xe9\xef\xf5\xa4\xde\x04\xeb\xb8\x9b\xa5\x02\x1e\xae\xa1\x2c\x5f\x80\x33\x8f\x50\x1c\x58\xbb\xa6\x5c\x9c\x98\x34\x1c\x4a\x9d\x81\x9f\xab\xae\xc1\x28\x4c\x3d\xb9\x27\xd6\x47\x6c\xa5\xad\x8f\x95\xa9\x51\x4a\xa7\x19\xf1\x53\x60\x71\xa1\x38\xb0\x76\x8d\x88\x4c\xd1\x63\x2a\x9d\x3d\xc5\x84\x91\x7b\x47\x1e\xd2\x3f\x24\xbd\x78\xf0\xde\x7c\xfe\x2e\x45\xa0\xb2\xec\xa9\x61\xd4\x0f\x74\x4a\x80\x4a\xac\x97\x69\xf7\x8d\x7f\x81\xae\x9d\x75\xeb\xc9\xbd\x17\xb9\x89\xc5\xe6\xf7\x62\xb1\xad\x9e\x0c\x50\x7f\xc0\x1f\xe6\x95\x62\x6e\xfa\xe5\xe2\x55\x09\xbb\x66\x28\x0e\xac\x5d\xcd\x4d\xd7\xcf\x54\xaa\x06\x54\x89\xb2\x1e\x37\x94\x3e\x0a\xb6\x57\xbc\x5a\x60\xdf\x41\x67\x98\xbd\xe5\xf1\x91\x66\x9a\xd3\x15\xd8\x49\x0a\xc5\x81\xb5\x5b\x6b\x51\x50\xad\xa4\xeb\xaf\x62\xaf\x78\x8d\x5b\x84\xaf\x5e\xad\x72\x23\x64\x6b\x65\xf1\x90\xf9\x2d\x49\x32\x8a\xd2\x33\x6e\x60\xe7\x2b\x14\x07\xd6\xee\xec\x8e\x89\x6d\xb9\xf5\xe7\x34\xa2\x5b\x4b\xcc\x1f\x42\x35\x33\x09\x7e\xb3\x7f\x27\x61\x1a\x53\x0d\xb6\x28\x99\x24\x9b\x32\xcc\x83\xc5\x85\xe2\xc0\xda\x59\x92\x61\x72\x12\x7d\x3b\xaa\x28\x6c\xa6\xce\x7c\x64\xf0\x29\xda\x04\x87\xd5\x78\x21\x92\x41\x89\x9d\x54\x23\xe7\x3c\x59\x24\x1c\xe6\xd0\xa0\x66\xf7\x97\x3b\x34\x0b\x8e\xe6\xc7\xdf\xe6\x48\x6e\xf1\x31\xe8\xdc\x61\x13\x9d\xf4\x3a\x96\xd3\x5d\x7d\xb2\xad\xdb\x57\x77\x43\xa9\xc5\x80\x45\x0d\x0b\xe6\x76\xa0\x38\x78\x87\x26\xfc\x6c\x8a\xa8\xbe\x7b\xf7\x2d\xe1\x6d\xa9\x4d\x0b\xb3\xa3\xc6\x81\xf9\x22\xe9\xa4\x3f\x71\x28\xe1\xe3\xb6\x5b\x14\xd4\xa7\x36\xb0\xc8\x50\x1c\xbc\x43\x33\x79\x18\x25\xd1\x99\x5d\xef\x9a\xe1\x98\x9e\xb8\xe5\x98\x5c\x3d\x5b\xad\xa7\x97\x79\x93\x20\xfe\x6d\x08\x42\x5d\xcf\x79\x64\x11\x2c\x32\x14\xf7\xbf\x0e\xed\x1f\x67\xfe\xfe\x75\x3f\xb4\xc1\xce\x5b\x3f\x90\x26\x31\x2c\x1c\xac\x2b\x59\xe3\xd3\x25\xa3\x3c\x6f\xf0\x27\xe2\x8f\x56\x56\x68\x22\xb9\x2c\x79\x4b\x9b\xba\xff\xed\xd0\x34\x58\xd1\xdb\x66\x3c\xd8\x9a\x90\x3d\xc4\xbc\x88\x91\xee\x51\x90\x6c\xa9\x12\xe1\x5e\x48\xad\x6c\xdf\xdd\xb1\x8c\x8c\x7c\x52\xfb\x17\x7a\xbf\xc5\x45\xd2\x2a\x72\xd4\x6e\xe7\xb4\x38\xea\x37\x03\xca\x11\x69\xad\xe9\x7a\x5c\x9b\x98\x3b\x16\x62\x02\x22\xa7\x29\xdb\xd2\x7f\xcd\xa1\x41\x0d\xed\xef\x73\x68\x70\x0e\x6d\x1c\x0b\x4b\x80\xbe\x0d\xaf\xf5\xc9\xb8\xc4\x4b\xd3\x20\x23\xbc\x4f\x7f\x18\xb2\x4b\xef\xee\x12\x85\x5e\xb4\xcc\x29\x4a\x32\xb6\x5f\xc9\xf2\x0e\xbc\x43\x73\x3b\x1e\x36\xe6\x97\xf4\xb8\x2d\x3c\x16\x42\xd8\x18\x74\x36\x3b\x55\xc3\xa3\xb8\x4b\x71\x2f\xfe\xad\x8b\x7d\x29\x9d\xf4\x24\xd3\x95\x2c\x66\xc1\x3b\xb4\x31\xaf\xbd\x6e\x83\x13\x8d\x81\xb9\xd7\xd1\x7e\x0f\xcb\x0e\xbb\x1f\x0e\x96\x86\x10\x94\x8d\x60\x9d\x88\x93\xae\x4c\x50\x4b\x55\x5d\xc9\x68\xe1\x1d\xda\xe2\x0f\x8b\x62\xd2\x8b\xc3\xe8\xee\x7b\xf9\x2e\xfc\x0f\xe3\x58\x6e\x36\x8a\xf4\x73\xd9\xd1\x79\x75\x0c\x75\x1c\xd4\xfc\xe2\xe9\xbe\x92\xd1\xc2\x3b\xb4\x8e\x8f\xef\xf2\xe6\xdb\x8b\xc8\x5a\x19\xff\x10\xf8\x58\x3c\x99\xde\x9e\xc4\xe0\x4b\x0b\x3d\xd5\xb4\x28\x51\x70\x6b\x7f\xca\xa7\x7b\x65\x0e\x0d\xea\x26\xba\x2c\x63\x91\x93\x21\x98\xf5\x6c\x57\xbb\x38\x8d\x86\x92\x97\x63\xbf\x77\x59\x48\x2f\x1c\xc0\x6c\x44\xf7\xc5\x62\xc3\x09\xe8\xf0\x1c\x05\x3a\x62\x42\x71\xe0\x8c\x75\xb2\x1c\x60\x8a\x55\xc0\x90\xcc\xf3\xf8\x37\xe6\xed\xa6\x28\xf1\x8c\x2e\xc5\xcc\x75\x85\xa7\x58\x4f\x14\x26\x96\xaa\xef\xdd\x02\xea\xeb\x41\x71\x70\x75\xc9\xf0\xc5\x1b\xbf\x1e\xfb\xb2\x9d\x28\xff\x2c\x13\x6d\x3c\x3e\xaa\xac\x8f\x09\x4a\xd5\x63\x72\x2f\x15\x4f\xe9\xea\x41\xdb\x48\x05\x2a\x21\x40\x70\x41\x92\x08\x78\xff\x38\xe9\x6d\x79\x58\x30\x99\xf1\xdd\x4b\x10\x5d\x6b\x72\xf1\x8f\xfa\x4d\x33\x91\xcf\x19\x09\x58\x7b\x2a\x73\xce\x0c\xa2\x5b\x31\x9a\x09\xc0\x49\x6f\x08\x2e\x48\x12\xd4\xb3\x44\x50\xff\x50\xba\x7f\x35\xfa\x57\xe6\x85\xda\x3d\xcd\x9b\x77\x3b\xd6\x66\x0a\xa8\xe2\x98\x77\x4a\xa8\x17\xe8\x97\x71\xd2\x7d\x61\xb3\x0d\xa8\x27\xf1\xd2\x7a\x80\x14\x1f\xe2\xcf\xaf\x4b\xcd\xde\x2a\x0f\x34\x4f\xc0\x93\x32\x55\xc3\xe2\xb8\xcb\x64\xc8\xe4\x11\x72\xdd\x59\x80\xe1\x79\x0d\x19\xf0\x6d\x1c\x82\x83\x9b\x6d\xc4\x7a\xcb\xd1\x98\x76\xe7\xb3\xb2\xa7\x4d\x1d\x45\xd0\xd7\xb8\x47\x91\x93\x90\x73\xa0\x87\x29\x8b\xb4\xf2\x9a\x4c\x71\x01\xeb\x25\x50\x1c\xdc\x19\xc2\x23\x6b\x27\xa3\xaf\xa3\x29\x85\xc6\x1f\x9e\x07\xb0\xbf\x78\x4b\x26\x20\x6b\x5f\xa6\x35\xf5\x2a\x31\x28\xd6\x70\x02\xdb\x05\x13\xf8\x7e\x0d\xc1\x81\xb5\x7b\x27\x62\x51\x14\xef\xbf\x93\x28\xf9\xfe\x67\xdd\x10\xd9\x72\x3a\xfb\xe7\x39\xc9\x58\xe7\x20\x3c\x45\xc4\x42\x4e\x1b\xc6\x4f\xc0\x57\x06\x28\x0e\xac\x5d\xd8\x33\x26\x6b\xff\x0f\x98\x9c\xf4\xb8\x78\xf5\xf2\x53\x7b\xea\x9d\x26\x53\xa5\xdf\xd2\xef\x72\x87\x28\xc8\x51\x9b\x28\xe2\x71\x01\xdd\xc6\x21\x5e\x67\x97\x69\xf7\xbb\x27\x4b\x62\xec\x6b\xdc\xba\xc1\x6f\xbe\x95\xaf\xb1\x01\x6c\xa3\xdf\xb7\xf2\x3e\xe2\x7d\x21\x4b\x9e\x6b\x31\xb3\xf0\xbf\x07\xac\x31\x43\x71\x70\x5d\x8f\x79\x67\x15\xd6\xc4\x43\x2f\x98\x45\xef\x33\x1d\xb3\xaf\xd9\xbe\xe1\x8d\xae\x52\x69\xdd\x98\x92\x96\x6a\x7a\xfd\x9e\xc3\x09\xa8\xc6\x02\xc5\x81\xb5\xa3\x89\x19\x44\x2d\x78\x57\xce\xa8\x14\x79\x3d\x80\x4b\x8e\xcc\x64\x2f\x24\xd1\xd8\x49\x80\x56\xf2\x87\x85\x83\xad\xea\x6f\x22\xa0\x13\x36\x14\x07\xd6\x8e\xc8\x5f\x07\xc3\x81\x8c\xe4\x48\x97\x39\x41\xe9\x21\xe5\xd7\xb1\x5b\x9d\xe7\x75\x74\x76\xd1\x4d\x01\x44\x92\xac\xe4\xcc\x12\xc0\x9a\x38\x14\x07\xd6\xae\xe8\x31\xc3\xb4\x8e\xe0\xe4\x46\xf0\x0b\xca\xa4\xb9\x65\xee\x45\xc7\x4f\xdf\x95\x53\x28\xa7\x75\xe7\x68\x42\x09\x83\x79\xea\x81\x33\x84\x50\x39\xe1\x32\xed\xde\x7f\x7d\xc3\xec\x9d\x7b\x9f\x05\xc7\x5c\xe7\xde\x01\x89\x61\x21\xe3\x8c\x8e\xc2\x73\xf5\x99\x28\x3c\xee\xa3\x7c\xec\x16\x56\xe0\x8b\x00\x14\x07\x57\xa1\x87\xda\x55\xe5\x44\xf3\x63\x85\xfe\x8a\xc2\x0f\xa6\xdd\x77\x61\x5e\x07\x14\xe3\x17\xea\xbd\xbf\x31\x28\x11\xda\x6c\x2c\x36\x68\x81\x0a\x3d\x10\x1c\x58\x3b\xe3\x9a\xa7\xe2\x8a\x5d\xdf\x2a\xbb\xe9\x39\xba\x85\x5d\x6e\xb9\x87\xcf\x62\xef\x46\xa5\x71\x3d\x58\x8d\x19\x2a\x27\x72\xba\x06\x3c\x1f\x50\x1c\x58\xbb\x6b\x14\x38\x32\xd2\xf8\x1d\x4f\x4c\xc4\xc6\x35\xbf\xdc\xc8\x5e\x29\x98\x91\x48\x22\x16\x16\x32\x7b\x3f\xcc\xe4\x34\xb2\xdc\xd1\x00\x8b\x0b\xc5\x81\xb5\x4b\xbf\x5e\x94\xa4\xf9\xfc\xe8\x43\x6d\x08\xcf\x41\x27\x6e\xae\xd4\x7d\xfb\x85\xdb\xbb\xa2\x3b\x01\x17\x82\xc6\xd7\x7c\x88\xa5\xd5\x61\xda\x41\x25\xd6\xcb\xb4\xb3\x6d\x9f\xca\x31\x0c\xfc\xc6\x57\xff\xe0\x07\xcf\xdc\xc5\xae\xa4\x2d\x01\x55\x77\x4b\xf4\xa6\xe7\xcf\x9f\xa8\x37\xb2\xe6\x0a\x81\xfb\x18\x8a\x03\x6b\x97\x34\x8e\x52\x64\x4d\x22\x8e\xd4\xa9\x58\x65\x51\x29\x63\xfb\x39\x3e\xd3\xb5\xa4\x88\x25\xca\xd0\x68\xcb\xf2\xc5\xa8\x62\xe2\x04\x2c\x2e\x14\x07\xd6\xce\xa4\x94\xef\x0b\xc6\x5d\x95\xdd\xbc\x00\xe5\xd4\xcd\x09\xad\xaa\xc6\x7b\x69\xc7\x34\x4f\x9e\x92\x4d\x69\x0a\x72\xd2\x69\x24\x00\xfb\x03\xa0\x38\xb0\x76\x4e\x73\xb3\xd5\x8b\x62\xaf\xb3\x44\x54\x82\x9b\xc9\x30\x64\xbe\x89\xe0\x4e\x19\x39\xaf\xd9\x9f\x98\x1a\x9c\x91\xe6\xf9\x1f\xbf\x80\xc5\x85\xe2\xc0\xda\x29\xca\xd1\x61\x2a\xf2\x85\xd6\xdc\x4a\xc2\x3c\x8f\x33\x72\xff\x31\xd8\x71\xc7\x4d\x2c\xac\x74\x51\xe3\xe6\x09\x3e\xca\x1e\x02\x50\xcb\x11\x6a\x76\x7f\xb9\x43\x7b\x81\x65\x72\x18\x85\x81\x87\xfa\xac\xcd\x9c\x94\x4d\x6c\x6a\xd9\x39\xbc\xc7\x3e\x95\x7b\x5f\xd8\x50\x2c\xdc\xd0\x55\x22\x9e\x17\xe6\x76\xa0\x38\x78\x87\x16\x4a\xa3\x3a\x9c\x2c\x81\x61\x44\x15\x55\x5d\xd5\x91\x13\xc7\x56\x1b\x45\xe1\x3c\x49\x32\xd5\x33\xc5\xf5\x00\x31\x4a\x39\xe0\x15\x2c\x32\x14\x17\x24\x8d\x80\xfe\xcf\xc8\x1e\xfa\x4e\xb4\xc1\x79\x2a\xe1\xa1\x2c\xfe\x8d\xb3\x1c\x09\x84\xac\x1c\xfe\xc8\xd7\xde\xc9\x93\xc9\xb9\x2a\x89\xa6\xa1\x11\x03\xfb\x27\xa1\x38\xf8\x7f\xe3\x5f\xf7\x43\x13\x18\x4a\x25\x53\x1b\xc7\x59\xbe\x60\xa9\x34\xfa\x68\xd1\x74\xfa\xc0\xcc\x9c\x8c\x53\xb9\xbc\x80\xe3\x68\xa2\x03\x87\x8a\x10\xed\x6f\x87\xc6\x6d\x2f\xd8\x78\x41\x2b\x41\xaa\xdc\x86\x12\x41\xee\x1f\x6e\x19\x37\x28\x6d\xbf\x56\xdd\x4b\x18\x8e\x8a\x66\xd5\x3d\xa4\xfe\x8f\x53\x81\x9f\xcb\xb1\xee\x6b\x67\xcf\x25\x09\x7f\xc3\xad\x4a\xd1\x25\x4a\xad\x5a\x0a\xf1\x79\xa4\xf2\x42\xd9\x2c\xfd\x75\x1e\xc1\x58\xd5\x7f\xcd\xa1\x41\x0d\xed\xef\x73\x68\x70\x0e\xcd\xfa\x8b\x73\xbb\x14\xda\xaf\xee\xd2\xad\x27\x9f\x52\xb6\xe2\x1f\x9f\xbe\x98\xe9\x96\x5f\xcb\x29\x20\x3a\x38\xe9\x70\x69\x0f\x58\xbc\x92\xe5\x1d\x6e\x38\xf3\x60\x3e\x86\xc9\x8b\xf7\x25\xd4\x38\xd1\x90\x3c\xc9\x99\x54\xb1\xcd\x23\xcd\xb2\x8a\x26\xb5\xaf\x57\xbc\x4f\x96\xb2\x0f\x83\xfd\x6a\x16\xb3\xe0\x1d\x5a\x8d\x43\xf8\xe9\x8c\xfe\x62\x86\x72\x53\x50\x49\x88\xe8\xe9\xd8\x54\xb7\xb2\x94\xb6\x41\x66\xc1\x8a\xce\xca\xd9\x5d\xf9\x43\xba\x2b\x19\xad\x3e\xdc\xcf\x36\x30\x7e\xdd\xc4\x70\x28\x7d\xc4\x7f\x58\x93\x4e\x16\xf8\x29\x1b\x51\xc5\x9a\x34\x4f\x3e\xa0\xfb\xc4\x87\x00\x39\xa8\xd4\xff\xc7\x95\x8c\x16\xde\xa1\xcd\x0b\x12\x9b\xcf\x3f\x2b\xcc\x74\xb8\xbb\x83\x20\xf2\x71\xdb\xb2\xe5\xa8\x56\x42\xe9\x7a\xa8\xa9\xba\x60\xf3\xe3\x3a\x1a\x81\xab\xeb\x87\x06\x75\x13\x5d\x96\xb1\xce\x1b\x13\x16\xf9\x9f\x8f\x19\xa8\x4f\x51\x28\x9d\x2c\x32\xb1\x21\x63\x1f\x9c\x23\xd8\x08\x05\x33\x16\xd2\x86\xbc\xa9\xef\x07\x66\x1b\x50\x1c\x38\x63\xb5\x34\x94\xc9\xf7\x11\x2c\x96\x7c\x91\x97\x69\xc9\x40\x25\x25\x7f\x10\x85\x48\x7c\xe0\xee\x74\x57\x2b\xf9\x8d\x09\xbe\xf3\x33\xa0\xde\x19\x14\x07\x57\x73\x71\x7f\xa0\x50\xb9\x43\x3d\x47\xb5\x8d\x69\xd5\xb9\xfb\x3a\xb7\x60\x01\x6e\x20\x0e\xcd\x64\x17\xdf\xcf\x5e\x83\xa6\xbc\x9f\x28\x40\xcd\x45\x08\x0e\x9c\xb1\x3a\x34\x7c\x99\x9b\x31\xe4\x38\x26\xee\x0f\x96\x11\xe4\x3a\x7e\x18\x53\x56\x64\xb3\xb1\x46\x39\xf2\x72\x1c\xcf\x59\xd7\x55\x78\x0a\x8b\x0b\xc5\x05\x49\xfe\xb3\x22\x2e\xae\x7f\x6f\x14\xed\x4e\x46\xbd\xbd\x5e\x26\x29\x8f\xb2\x2b\xd9\x86\xd3\x75\x9e\x7d\x92\x0e\x69\x11\xc1\xa9\x62\x92\x97\x6e\x0f\x61\xb3\x0d\xa8\x27\xf1\x32\xed\x72\x34\xb5\x2b\x8b\x51\x47\xc7\x31\x9d\xf0\x72\xb5\xb5\x7b\xef\x71\x6f\x07\xd9\xfc\x3c\x55\x12\xfb\xe3\x61\x78\xa3\xfa\x53\x0a\xf0\x2d\x1f\x8a\x83\xeb\xbe\x7a\x6c\x76\x7d\xfb\xb5\xc7\x6a\xcf\xc9\x0b\x46\x36\x5c\x59\x2f\xca\x17\xe2\x9e\x99\x5c\xfd\x5b\x55\x53\x79\x07\x86\x5d\x65\xc0\xe9\x74\x28\x0e\xac\x9d\xd3\xed\x2e\x27\x65\x89\x16\x8c\xad\x09\x8d\x67\xd1\x3e\xbd\x45\x91\xc1\x6e\xe7\x69\x9c\xe7\xe8\xf2\xf4\x75\x17\x91\x52\x68\xc0\x59\x3f\x28\x0e\xac\xdd\x69\xbf\xcf\x80\xce\x7a\xf6\x30\xa6\xba\xe0\x91\x48\xc4\x83\x67\xb6\x83\xa8\xc3\xf4\x06\x8f\xbe\x33\x53\x6b\xfd\x9c\x8f\x79\x03\xcc\xf2\xa1\x38\xb0\x76\xb9\x9e\x5f\x83\x92\xe9\xbb\x39\x2c\x7a\xc6\xb3\xfd\xe5\xe9\x10\xed\x6b\xf9\x5c\x8b\x66\xc8\xbd\xf7\x83\x29\xfb\x45\x8b\xee\x03\x3b\xe5\xa0\x5e\x67\x97\x69\x47\xa3\xbc\xc0\x33\x66\x73\xa0\x59\x32\xfb\xf6\x6c\x2a\x87\x34\xcc\xc1\xe7\xfa\xba\x50\x99\xb1\x28\xae\x31\xf3\x5b\x21\xc9\x3e\x03\xc0\xf1\x40\x70\x60\xed\xd2\x30\x3d\x3b\xe3\x11\xbf\xd4\x99\x6a\x7d\x09\xb2\x68\x74\x41\x8d\x2f\x40\xa3\x0b\xa5\xf3\xaa\x6b\x52\x20\xc3\x35\x8b\xbf\x0b\x9c\xc9\x83\xe2\xc0\xda\x1d\x6a\x46\x7f\xfb\x48\xa9\x7d\xcc\xec\xaf\xb0\x6e\x7f\x6b\x4d\x16\x03\x9f\xd3\x82\xa4\xc5\xcf\xc6\x6b\x42\x9d\x6a\x5b\x44\xf5\x0b\x50\x67\x10\x82\x03\x6b\xa7\x75\x94\x64\x8d\x52\xac\x78\x7d\xf9\xd3\x6b\x04\xa6\x55\x1a\xdb\x79\x99\xda\xf7\x8f\xa6\x12\xaf\x1f\x5e\x7b\x7b\x82\x1d\xf0\x19\xe8\x40\x0f\xc5\x81\xb5\x53\x56\xe8\xc6\x7a\x7f\xa4\x26\xfb\x84\x9e\xaf\xe8\x44\x22\x10\xe5\xfa\x77\xa9\x28\xaf\x2d\x81\x37\x13\xe1\x2a\xf5\x62\x2d\xfc\x40\xa7\x04\xa8\x9c\x70\x99\x76\xee\x84\x37\xba\xfb\xd3\x82\x07\x83\x4c\xec\x3e\x5a\x30\xf2\x05\x86\xb0\x17\x8c\xe7\x49\xe4\xa4\x16\xec\x21\xb4\xf8\xbb\x38\x58\x00\x15\x32\x20\x38\xb8\x5d\x8e\xcf\xe6\xce\x8c\xe3\x75\x3e\x4b\x53\x27\x3d\x75\x30\x09\xfa\x74\xfe\xd9\xdc\x77\x5c\x88\x3b\xbd\x61\x22\xdf\x2e\xb5\x7f\xe6\x02\xd8\xe5\x08\xc1\xc1\x75\x4a\xe8\xdd\xfd\xde\x9e\x90\xe9\x4e\x32\x40\xd3\x32\xb9\x97\x9f\x98\xb0\x3b\x29\x9b\x5b\x49\xbe\xd8\x82\xdb\x71\x3c\xf7\xac\x1b\xe8\x9b\x08\xc5\x81\xb5\xfb\x49\x1a\x21\x69\xa3\x92\xa9\x65\x1a\x9b\xdf\x42\xea\x17\xc3\x66\x78\xeb\x43\x1b\x16\x6e\x54\x38\xe2\xfd\x32\xf3\xaf\xb7\xef\x9e\xc2\xe2\x42\x71\x60\xed\xd2\x7d\xe5\xe9\xc9\xf6\x56\xc6\x0c\x18\xa4\xfb\xf6\xf5\x23\xfa\x5c\x93\x39\x1c\xef\xf8\xc4\xfd\xe6\x37\xb0\xa8\xd8\x30\xa6\x12\x83\x69\x07\x95\x58\x2f\xd3\x4e\x7e\x41\xfe\x58\xee\x2e\xe2\x36\xd3\x51\xbf\x6d\xaf\xe3\xd3\x4e\xf3\x4a\xd7\x95\x3c\xec\x5f\x82\x36\x2c\xa4\xc5\xac\xce\xd8\x40\x95\x79\x28\x0e\xac\x9d\xeb\xeb\xf5\x2d\x64\xab\xa1\xda\x6f\xd6\xbd\xc1\x99\x86\x33\x8f\x5d\x2d\x64\xf0\x1a\xf7\xd8\xab\x46\x55\xaf\x21\xbe\x0e\x8b\x13\x00\xd6\x29\x21\x38\xb8\x7c\xf7\x63\xfb\x7e\x9c\xd9\x2d\x03\x92\x10\xe6\xea\xa1\x12\xed\x53\x83\x35\x3d\xd3\x98\x6d\x46\xd6\x20\x65\xf1\x1e\x1a\x64\xec\x5c\x20\xdf\x41\x70\x60\xed\x4c\x50\x66\xf8\xb1\xd9\xd1\x9f\xfa\xfc\x2c\x4d\xda\x7b\xaf\xb7\xf8\x1b\x8f\xdd\x5d\xea\x63\xb4\x89\x6d\xb7\x64\xea\x29\xcd\xc2\x33\xc0\xf9\x41\x70\x60\xed\x3c\xce\x9e\xd7\xb2\xee\xa6\x4b\xbf\xcd\x8d\x8d\x7c\x9c\xd8\xf1\xa4\xac\x9d\x93\x0f\x5f\x4b\xb8\x47\x6b\x31\x28\x5b\xf5\x16\x6f\x32\xcc\xa1\x41\xcd\xee\x2f\x77\x68\xc4\xbf\xd2\x35\x5b\xe6\xf7\x65\x33\x2f\x52\xf5\x17\x93\x46\xf8\xcd\x9a\xcf\x8c\xc4\xd5\x53\x6e\xcf\x7e\x1e\x7c\x3f\xb7\xe7\x36\x0c\x73\x3b\x50\x1c\xbc\x43\xd3\xcb\x58\x37\x70\x90\xfb\xed\xbb\xd5\x13\xd8\x67\x2d\xe4\xe7\xb9\xdd\x24\x3f\xc7\x62\xf9\x86\xc7\xb1\x1c\x55\x79\x25\x59\x70\x16\x16\x19\x8a\x83\x77\x68\xa9\x9c\x07\x1b\x1e\x1a\x58\xed\x38\xbc\x71\x81\x79\x8d\x7a\xe8\xf7\xfb\x9d\xd0\x3b\xee\xf6\x7c\xc9\xad\x75\xe3\x4d\xa8\x74\xb4\x86\x45\x86\xe2\x82\xa4\xaf\x81\xfe\x8d\x7f\xdd\x0f\x2d\xc7\x69\xe3\x19\x65\x9a\x0d\x39\x63\x22\x76\xd7\x3d\xfa\x0e\x3a\x83\x25\xef\xcd\x93\x42\x87\x86\x2f\x16\x53\xf1\xc1\xc9\xbb\xac\x7f\x3b\xb4\xfe\xe2\x49\x95\x07\xf4\xdb\xfa\xce\x4c\x3a\x66\x6e\x6e\x8b\xf8\xf4\xca\xe3\xa3\x2b\xda\xd1\xa6\xf7\x1e\xf5\x96\x67\xdd\xb9\xff\xe8\xef\x7d\x47\x6b\x8d\xeb\x49\x0b\x55\x38\xc2\x4f\x5b\xa5\x7b\xbe\x7e\x92\xad\xf5\x40\x29\xf8\x36\x73\xc7\x59\xf6\x42\xf1\x62\x46\x81\x60\xec\xbf\xe6\xd0\xa0\x86\xf6\xf7\x39\x34\x38\x87\xf6\xe9\x79\x5f\x1b\x83\xb5\x62\x0a\x0a\xa2\xc3\xe0\xc4\x7e\xc8\x42\x13\x4a\xc9\x07\xb5\xef\x3c\x2f\xd7\xee\x51\x53\xbf\x29\x92\xee\xbc\x92\xe5\x1d\x78\x87\xe6\xd2\x34\xa3\x56\xda\xbd\xc0\xb7\x3f\x34\xf1\x98\xb7\x01\xdb\x9c\x6b\xd7\x34\x04\x47\x65\xf4\x91\xed\x59\xfb\x9a\x41\xae\xf9\xe0\x95\x2c\x66\xc1\x3b\x34\xdb\x6b\xa1\x9c\x2a\xbb\x0d\x3e\xea\x72\x08\x94\x1a\x2a\x32\x1b\xf2\x16\xef\xba\x70\x7e\x3d\x7c\xda\x51\xfa\xdd\x65\x77\xac\x82\xf9\x4a\x46\x0b\xef\xd0\x90\x74\x94\xf7\xdd\x2e\xba\x8c\x14\xdc\x48\xb2\x02\x73\xcb\xc2\xff\xf0\xa8\x57\xd3\x16\xfe\xa9\xc9\x88\x5d\x3f\xb5\x4f\xb3\x41\xba\x92\xd1\xc2\x3b\x34\x42\x9c\xa6\x19\x8c\x60\x07\x54\x5a\x9d\xd6\x52\xa3\x00\x8e\x92\xc0\xf0\xae\x7b\xdc\x73\x91\x0e\x4e\x79\x34\x6e\x95\x31\x22\x57\x50\x30\xf3\xe1\xbf\xbb\x89\x2e\xcb\x58\xfd\x1d\xb3\x81\x59\xb5\xeb\x9d\x8c\xcf\xf3\x1e\xbe\x5f\x6f\x55\x71\xcb\x0a\xc3\xe3\x58\xe9\xff\x63\x7b\x5d\x13\xfd\xd5\xa7\x37\x32\xc0\x0e\x31\x08\x0e\x9c\xb1\x3c\xd3\x39\x1a\xce\xc3\x04\xac\x1f\x89\xe3\x22\x2f\x6f\xda\x44\xcf\x0c\x4c\xeb\x47\x3e\x89\xdc\x99\x9e\x6d\xc7\x23\xa1\x79\x6d\x09\x8b\x0b\xc5\xc1\x9d\x0d\xb2\x1b\xa7\x41\xb6\x93\x2e\x48\xb0\xf6\xbb\xee\x78\x41\x62\x68\x4d\x6c\x2c\x18\xf8\x27\x89\xa4\x86\x66\x60\x01\x9d\x4a\x08\x98\xc5\x40\x71\xe0\x8c\x75\x57\xe6\x54\xe1\x59\xa1\x67\xc5\xca\x1b\xbd\xf2\xc9\x57\x7a\xf2\x0f\xb3\xca\xa7\xfa\x7e\x6f\xb2\xc4\x7f\x1a\xea\xfb\x3d\x30\x97\x08\x8b\x0b\xc5\x05\x49\xfe\xb3\xde\xd2\x97\x6a\x29\x72\x47\xac\xb2\x49\x91\x56\x96\xda\xcd\xe0\x91\xb5\xa6\xf4\xaf\x5c\x1a\x59\xf8\x11\xfd\x58\x52\xf2\x71\xcf\xe6\xb8\x61\xb3\x0d\xa8\x27\xf1\x32\xed\x9a\x87\x85\x18\xac\x9d\x2b\xdf\x0f\x0c\xfd\x50\xb9\x81\x87\x6f\x1e\x76\x0b\x6b\x2f\x48\xb4\x7c\x1e\x07\x13\x49\xb0\x96\x4d\x96\x05\x76\xcd\x50\x1c\x58\x3b\xb3\x87\xc8\x5b\xea\x8e\x2f\xe9\x1a\xf0\x28\x70\xa4\xbf\x33\xaa\x7d\xe0\x14\xd3\xa8\x17\x4c\x40\xc9\x57\x99\x36\xf8\x1c\x71\x14\x0d\x8b\x0b\xc5\xc1\xd5\x94\xfb\x8c\xa1\xc9\xf1\x6a\x53\x95\x9e\xbb\x0a\xdf\xfd\xd0\xe6\xc6\xee\x96\x96\x34\x5b\xf3\x74\xb6\x51\xe6\x0f\xd1\x38\x1c\x76\xe0\x0c\x08\x14\x07\xd6\x6e\x25\xa6\xb2\x9f\x58\x24\x87\x95\xb6\xf1\xdc\xee\x85\x52\xcf\xbb\xfe\x5c\xe5\xb7\x3a\x9b\x7f\x0e\xba\x03\x53\xa3\xf2\x2c\x34\x7c\x80\x33\x84\x10\x1c\x58\x3b\x79\x2e\x7b\xa5\x58\x36\x55\x06\x87\x7a\x7c\x6a\xcf\x3f\xb4\x2d\x74\x98\x3b\xa7\x81\xdb\x5f\xc5\x4b\x66\xbb\x3b\xb8\x2a\x6f\x20\xc2\xb4\x83\x7a\x9d\x5d\xa6\x9d\x8e\x4e\xfc\x27\x06\x1a\x75\x8f\x0f\xfd\x2f\x82\x11\xe4\x1f\xf7\x74\x15\xe3\x72\x1c\x51\x9e\x5f\x8c\xea\x9f\x65\xee\x28\xfb\x6b\xc2\xae\x19\x8a\x03\x6b\xd7\xd0\xff\xb8\x9e\xd9\x5e\xac\xf3\xe3\xa7\xd7\xbe\xcf\x2d\x85\x25\x5e\xc8\xe9\x0c\x35\x91\x19\x7b\xe5\xce\x3f\xc8\x1f\x7e\xa4\x0a\x54\xf4\x80\xe2\xe0\xba\x13\x7b\x4f\xbe\x9b\x34\xaf\x71\xef\x2a\xdd\xfe\x38\x70\x3b\x37\x39\x8e\x55\xe2\x8f\x94\x34\x02\xee\xf2\x83\xb4\x2a\xd3\x40\x4b\x51\x58\x5c\x28\x0e\xac\x9d\x1b\x83\x45\x3d\x96\x95\x60\x7f\x40\xa2\x0d\x61\x48\x70\x06\xb3\x5b\xcf\x1d\x77\x9c\x29\xa6\x39\xf1\xa7\x1c\x2a\xf7\x47\xf6\xf3\x61\x71\xa1\x38\xb0\x76\x6b\x58\x4f\x3d\x3c\xc7\xa7\xcd\x7e\xe8\xb9\xf5\x90\x14\x33\x52\xbe\x24\xa9\xab\x25\xc5\x3f\xeb\xb4\xeb\xe4\xe0\x1c\xcc\x71\x4e\x87\x69\x07\x95\x13\x2e\xd3\xae\xcd\x8d\x5d\x31\xe6\x9a\x48\x11\x87\xa3\x4a\x66\x79\xcb\xab\x13\x6b\x1a\x54\xe1\xd7\x6d\xc3\xdf\x92\x6d\xbe\x99\x33\x32\xaf\xac\xc2\xae\x19\x8a\x83\x9b\xe5\x1f\xc9\xc4\x56\x3e\xee\x26\xf4\x44\xe3\xc8\xa6\x70\xf4\x62\x29\xa0\x7e\x2e\x78\x2b\x82\xea\x41\x96\xaa\x08\xeb\x77\xb9\x17\x40\xad\x53\x28\x0e\xac\x9d\xf3\x7c\x08\xc9\xad\xec\x51\x81\x18\xeb\x01\x72\x84\xc6\x2c\x2e\x01\xa1\x95\x0a\x89\xae\xe8\xf4\x46\x57\xa2\xf1\x18\x86\x6d\x60\xbd\x16\x8a\x03\x6b\xf7\xf4\x58\x91\x52\xb5\x34\x89\xaa\x3e\x93\xde\x43\xda\x43\xae\xda\xea\xb7\xc1\x5d\x04\x9f\x2f\x5f\x91\x25\xde\xca\x9b\x8e\x1a\xba\xc0\xe2\x42\x71\x60\xed\xe8\x64\x6f\xd2\xed\x8e\xff\x10\x3e\x39\xb0\x94\x2b\xf7\xab\xb1\x3a\xb5\x0d\xcb\x95\x8b\xf4\x0d\x9c\xc8\xe7\xab\xa7\xc0\x42\xc7\x80\x69\x07\x95\x58\x2f\xd3\x6e\x4a\x4e\x4d\xc7\x6b\x63\x79\xa2\xc9\xaa\xe8\xdb\x00\x7a\xf0\xf4\x2a\x45\x7c\x3a\x49\x2c\x6d\xc4\xf2\x86\x14\xb6\x55\xe2\x83\x43\xd8\x35\x43\x71\x60\xed\x28\x90\x50\x0f\xaf\x9f\xd6\xab\x75\xa5\x28\x9e\xb8\x7a\xf8\x85\x6c\x4e\x66\x9d\xb1\x59\x33\x08\xf5\x1b\x0f\x60\x06\xd0\x30\x01\xf5\x64\xa1\x38\xb0\x76\x48\xea\x58\x82\xc2\x15\x32\x43\xd6\x5d\x68\xcf\x09\xb4\x7e\x2a\xe1\x49\x25\x6c\xf4\x8d\x6e\x6b\x49\xf7\xf3\x8e\x1c\x5e\x3b\x8f\x84\xc5\x85\xe2\xc0\xda\x29\x4b\xab\x91\xd8\xbe\xf2\xee\xbf\x60\x6e\x22\x4d\x0d\xe6\x6a\x68\x7b\x9f\xc0\xd2\x14\xfd\xf0\xd0\x55\x52\xbe\x5b\x32\x39\x19\x58\x6b\x87\xe2\xc0\xda\x89\xdc\xac\x33\x4c\x7d\x95\xed\x17\x4c\xeb\x1c\x5a\x40\x11\x8e\xfd\x47\x21\x5c\x34\xec\x15\x5e\x52\x14\xc5\x83\xf1\x9a\x5b\x8d\x63\x30\x87\x06\x35\xbb\xbf\xdc\xa1\x95\xfc\xea\x11\xf3\xee\xbf\xf1\x35\x65\x38\x8f\x30\x67\xe6\x37\xe2\xd8\xf9\x43\xa4\x9f\x8d\x5d\xe3\x77\xb1\x1a\xe4\xca\x75\x2b\x03\x60\x6e\x07\x8a\x83\x77\x68\xf8\xc1\x34\x61\x56\xf4\x68\xdf\x30\xcd\x57\x04\x68\x55\xef\x95\xa9\x38\x34\xa3\x2b\x17\x16\xff\x64\x3e\x8d\xda\xe9\x2e\x16\x48\x80\x45\x86\xe2\xe0\x1d\x5a\x83\xfc\x5c\xf4\x90\xfc\x83\x1a\x05\x52\x1f\xd1\xac\x5c\x57\xee\xee\x86\xef\xc4\xce\x03\x39\x75\x68\x0f\x5a\x65\xb3\x6e\xaf\x7e\x84\x45\x86\xe2\x82\xa4\xf1\x40\xff\xc6\xbf\xee\x87\xd6\x61\xfa\xb5\x7a\xbf\x64\xea\xc3\x8a\x28\x52\x27\xa2\xc5\x49\xd1\xfd\x40\xf7\xe6\xaa\x06\xa3\xef\x8a\x95\x03\x32\x9b\x42\x3f\x12\xff\x76\x68\x0f\xed\x72\xd8\x32\xd5\xe8\x7c\x71\xee\xec\x9c\x5b\x32\xb6\xd9\x1d\xb4\x10\x7c\xff\x8a\x51\x1a\xc6\xaa\xd4\xe8\xb6\x41\x13\x19\xff\x17\xfa\xfa\x2c\xfb\xf1\xee\x03\x34\xdf\xf7\x42\x8d\x2a\x86\x09\xf7\x72\x30\x68\xf7\x8c\x0f\xee\x70\xf6\xb9\x84\xd9\xfb\x9b\x35\xf9\xb0\xff\xd7\x1c\x1a\xd4\xd0\xfe\x3e\x87\x26\x0f\x9e\xc5\x3f\xc2\x7c\x7b\x8f\x4f\x08\xb5\xc1\xdf\xe0\xcf\xe3\xbd\x20\xb4\x9f\xa5\x8d\x2e\x77\x98\x73\xf8\xa6\x58\x7f\x3f\xd8\x9c\x69\x78\xff\xe4\x4a\x96\x77\xe0\x1d\x1a\xd1\xf4\xbb\xd5\xcd\xf5\x74\x92\x6b\x65\xc8\x7e\xe3\xf3\x18\x6c\x24\xfc\x39\x63\x51\x03\x73\xef\x06\x76\xc4\x45\x99\x62\x8d\x68\xae\x64\x31\x4b\x0c\xee\x67\xa5\x12\xc9\xf2\xa7\xd3\xf7\x8c\x1d\x4f\x95\x10\x5e\xd3\x5a\x8e\x85\x70\x55\x7d\x28\x7c\x1a\xf2\x73\x89\x8c\xa4\x05\x35\x55\xc0\xf5\x4a\x46\x0b\xef\xd0\x62\xb6\x8e\x25\xb1\x7d\x6b\x66\x57\x70\x75\xb5\x5f\x20\x5c\x94\xf2\x2d\x30\x3d\x31\xc4\xb5\xab\xe8\x3c\xfb\x64\x40\x51\x1b\x7b\x25\x36\x18\xc1\x03\xee\x67\xe7\x50\x26\x32\xba\xb8\x45\xc4\x43\x72\x3f\xdf\xb4\x1e\x55\x6a\x75\xff\x93\x14\xd8\xdf\x74\x54\x37\x9b\x37\xd2\x8c\x15\x6f\xa2\x72\x65\x0e\x0d\xea\x26\xba\x2c\x63\x6d\x54\x51\x7f\x74\x9f\x29\x17\x32\xdc\xfb\xf5\xea\x65\x12\x45\xc1\x51\xf3\x79\x94\x62\xcd\xb7\x3f\x4a\x5f\x30\xfb\xcc\x74\x0e\x80\x8a\xed\x50\x1c\x38\x63\x89\xb6\x5e\x1b\xc1\xfc\xb8\xc9\x6a\xc3\x23\xa8\xcf\x21\x8c\xd4\xf3\x82\x77\x33\x24\x22\x09\x23\x29\xa6\x5b\xa0\x11\x8b\x35\x0d\x38\xd7\x05\xc5\x81\x33\x96\xa0\xd8\x10\x13\xd7\xa2\x67\xcf\x87\xd3\x7c\x15\xbb\xbc\xc1\xbc\x26\xff\xdf\x3b\x4d\x38\x87\x9d\x89\xbc\x3b\x02\x56\x9c\xb7\xf4\x60\x71\xa1\x38\x70\xc6\x52\x6c\xd6\x41\x08\x4e\x7c\x77\x27\x2a\x4d\x0f\xf1\xd5\xac\xaf\x3c\xb9\xf1\xdb\xe1\xe0\x14\x7b\xe4\x3a\x15\xba\x08\x6c\xac\xf9\x13\x58\x5c\x28\x2e\x48\xf2\x9f\xa7\x79\x59\x23\xa8\x32\xb3\x9b\x77\x2d\x2c\x4d\xc8\x95\xd9\xd5\x73\xbc\x5f\x16\xf8\x90\x8e\xbd\x7c\xca\x8a\x20\x74\x47\xa0\x98\x84\xf5\x33\x6c\xb6\x01\xf5\x24\x5e\xa6\x1d\x6f\x51\xb3\xa8\xd0\x12\xbd\xe4\xf1\xbd\xe0\x5b\x45\xd4\x29\xc8\x9f\x91\x2e\xf0\x4a\x2d\x1f\xac\x90\x8a\xa3\x64\xd3\x7e\x09\x06\xce\x97\x40\x71\x60\xed\xbe\x97\x47\xd3\x60\x37\x8a\x35\x7b\xd1\xdb\x86\x3a\x1f\xdb\x69\xef\xe3\x9a\x97\xf1\x1e\x6f\xb0\x15\x49\xe1\xbc\xe7\xbc\xbf\x0c\xcc\xc6\xa1\x38\xb0\x76\xbd\x6f\x5b\xa4\x2c\x34\xe9\x57\xad\x03\x90\x29\xfa\xea\x44\xc5\x50\x3c\x4f\x5b\x82\x9c\x5e\x04\x87\xe7\xbb\x7a\x71\x8c\xfc\x01\xea\xa8\x41\x71\x60\xed\x32\xa5\x1a\x33\x56\x58\xa5\x1a\x1b\x1b\x7c\xee\xfe\x4a\x2a\xbb\x95\xd9\x5d\x4c\x54\x5e\xd1\x41\xb9\xc5\x64\x21\x50\xc8\x37\x07\x74\xce\x85\xe2\xc0\xda\x2d\xe7\xf2\x7f\x65\xcc\x6e\xde\xa9\x13\xaa\x8a\xf4\x64\x49\x5e\xb7\xdf\x53\x4f\x88\xe9\x8c\xbb\xdd\x6b\xa9\x3a\xaa\xdc\x21\x5d\x0c\xd3\x0e\xea\x75\x76\x99\x76\xd9\x72\xc5\xb1\xf8\xbc\xb5\x72\x07\xa3\x35\x6d\xc1\xa5\xa7\xb7\x07\x8e\x8f\xc2\x04\x39\xd9\x34\x56\xf0\x6f\x89\xd6\xeb\x55\xad\xc3\xae\x19\x8a\x03\x6b\x27\x80\x60\xea\xb5\x4b\xf8\x9d\x46\xf1\xeb\x6c\x55\xcc\x05\x77\x98\xdb\x1f\xbf\x12\x6f\x12\x3a\x21\xeb\x3c\x5b\x8d\x74\xa7\x8c\x1b\x40\x9d\x41\x08\x0e\xac\x9d\x8f\xf3\x5d\x34\x56\xb5\x72\x5e\x3c\xf9\x8f\xfd\xf5\xf7\xca\x1b\xd7\x39\x9e\xa9\x7d\x64\x93\x9d\x89\x39\x47\x7b\xa7\x1b\x3b\x0c\xf4\xea\x82\xe2\xc0\xda\x0d\xfa\x66\xc6\x71\x5a\x4d\x66\xa2\x5c\x2b\x3c\xc3\xdc\xd5\x3f\x76\xe2\xf4\x32\x79\x23\x58\xf8\x3a\xdb\x93\xb3\xa2\xe2\xf6\x0e\xb0\x76\x0d\xc5\x81\xb5\xf3\x31\xca\xfa\xaa\xf4\xcb\xa0\x2f\xe0\xd4\x3e\xcd\x18\xc9\xc6\x49\xda\xad\x8d\x2b\x8d\x18\x8f\x5b\x7f\xc7\xd0\x4e\x00\x43\x60\x1d\xa6\x1d\x54\x4e\xb8\x4c\xbb\xc5\x61\xd5\x9f\xcd\xfc\xa9\x92\x25\x33\x3d\x4a\x7a\x6a\xa2\x3f\x06\xe6\x3e\x38\x7e\x33\xfc\xc6\xae\xa3\x4f\xc3\xe9\x9e\x3c\xb7\x03\xbb\x66\x28\x0e\xac\x1d\xa6\x10\x9f\xb4\xe1\x04\xaf\xac\x05\x53\x5d\xdd\xd6\x4b\xb5\x5b\x77\x3b\x27\xea\xa8\x33\xbf\xd1\x4f\xfc\x66\x75\x27\x2d\x0a\x05\x66\xcd\x50\x1c\x58\x3b\xde\xf6\x84\xbb\xe3\xe4\xef\x7b\x78\x1b\x72\x0c\x7d\xa6\xce\x46\xfa\x7f\x26\x9c\x4a\x8e\xda\xcc\x51\xfd\x24\xa5\xe5\x32\x97\x01\xd6\x29\xa1\x38\xb8\x35\x34\x17\x11\xc7\x6d\xf5\x23\x0c\xa1\xaf\x06\x8a\x52\x63\x3e\xae\x11\x2c\x0a\x58\x27\x25\x26\xd7\xc3\xf9\x02\x44\x54\x4d\xb5\xcf\x80\x35\x34\x08\x0e\xac\xdd\xde\x31\x96\xfa\x81\x15\xa2\xc2\x84\xce\xbd\x80\xb2\x10\xe1\x73\x81\xf3\x1f\x1e\xeb\x43\xae\x35\x35\xb7\xdf\xaa\xb2\x0d\x33\xe2\xc1\xb4\x83\x4a\xac\x97\x56\x79\x21\x0a\xf5\x96\x47\x8b\xa4\xb1\x14\x51\x38\xcf\x9a\x7d\xa7\xb8\xe1\xf2\xa2\xdc\x4f\x33\xa0\xf2\x6d\x48\x9c\x45\x58\xa1\x10\xd0\xf7\x12\x8a\x03\x6b\xb7\x43\xcc\x7a\x6f\x33\xf2\x9b\xa7\x89\x74\xdf\xce\x3e\xbe\xb2\xc4\xc0\x9e\x38\x1d\x63\x77\xc2\xfb\x91\xd8\x32\xb9\x1e\x41\x64\x60\x67\x38\x14\x07\xd6\xee\x41\x5d\xc6\x60\xc5\x3c\x3e\x16\x0e\x7d\xed\xfa\xa1\x68\xf8\xba\xb8\xc5\x09\xa5\xee\x0b\xd1\xc5\xf1\x45\x16\x5e\x89\xbe\x48\x61\x60\xe7\x2b\x04\x07\xd6\x8e\xd9\x9d\x9d\xda\x24\x3b\xdc\x3a\x3f\xe4\xcc\x2a\x1f\xcb\xe6\x1e\x75\x46\x3f\xdf\xd0\x10\x29\x9f\x26\x46\x7f\xc0\xa3\x88\x5d\x5b\x58\x5c\x28\x0e\xac\xdd\x0c\x2d\xf9\x04\xee\x4d\x09\xf9\x08\xbd\x4c\xb9\x0a\xd9\x8f\xa7\x81\xac\x3a\x2f\xa7\x9e\xcb\x53\x87\x71\x0b\x0c\x7d\x79\x89\x82\x06\x73\x68\x50\xb3\xfb\xcb\x1d\xda\x4d\xc2\xeb\x3f\x32\xb4\x09\xed\xe6\x2e\x88\xc6\x66\x9a\x34\xb3\x74\x8f\x50\x03\xde\xfd\xae\x70\x41\x48\x24\x72\x53\xde\x4a\x5d\x87\xb9\x1d\x28\x0e\xde\xa1\xd9\x2c\x44\xf1\x23\x8b\x0d\xd0\xba\x3c\x58\x18\x0e\xc5\x5f\x62\xa0\xcb\x44\x8c\xfe\xf9\xfa\x01\xa5\xff\x52\xcf\x75\xc3\x9e\x52\x14\x58\x64\x28\x0e\xde\xa1\x21\xff\x32\x5a\x2d\xb5\x4e\x21\xfe\x23\xc9\x31\x14\x13\xbd\xaa\xf1\x3e\xda\xea\x62\x96\xb3\xdf\xc3\x9c\xb8\x23\x61\xcb\x6d\x1f\xb8\x66\x28\x2e\x48\x5a\x1c\xf4\x6f\xfc\xeb\x7e\x68\x22\x1a\x95\x8e\xc5\x45\x8a\x1d\x71\x82\x41\x8f\x57\x17\x9e\xe8\x3b\x2f\x09\x67\x1e\x9a\x60\x60\xb3\x39\x39\xe7\x30\x99\xe5\xaf\xfd\xed\xd0\xca\x9e\x3b\xdc\xd2\xbd\xf1\x70\x4d\x37\xe9\x44\x04\x31\xc8\xbb\xc1\x06\xdf\xd7\x61\x73\x9f\x2c\xbf\xde\x4c\x35\xee\x87\xfa\x35\xe9\xbf\xbf\xb8\x3e\xcb\xda\x2b\xfe\x2a\xea\xdd\xee\x2d\xc3\x5b\x91\xb0\xb2\x40\x1f\x60\x57\x2a\x49\x46\x80\xaf\x84\x82\x8e\x16\x7f\x53\x67\xf3\xbf\xe6\xd0\xa0\x86\xf6\xf7\x39\x34\x38\x87\xf6\x9e\xaa\xb8\x31\x93\x71\x8d\xc7\xef\xe4\x6b\xad\x58\x06\x45\xf4\x3d\x21\x9d\x33\x19\x02\x2e\x61\x47\x01\xbc\xe9\xe9\x1f\xc2\x43\x57\xb2\xbc\x03\xef\xd0\xe8\xa6\x5b\x29\x23\x09\x2b\x4e\x5e\x32\x76\xc9\x64\x53\x4c\x15\x8f\x54\x2b\x71\xc9\xf2\x7b\x8a\x70\xe6\xb2\x51\x28\xdb\xbd\x96\xba\x92\xc5\x2c\x78\x87\xc6\xc6\xdc\x7b\x90\xd9\x61\x86\x63\xd4\xdd\xb7\x6d\xaf\x62\x97\x51\x6d\x85\x3e\x68\x70\x64\x5e\x4e\xef\xe6\xd2\x9a\xac\x5d\x76\x25\x95\x2b\xeb\xe1\x1d\x9a\x0c\x42\x36\x66\x44\x09\x21\x8d\x9b\x93\xa8\x57\xf2\x9a\x5f\xf1\x2b\xa5\xee\x0c\x52\x99\xc5\x0d\x94\x41\x77\x41\x5b\x75\x84\xab\x29\x98\x09\xef\xd0\x82\xbb\x08\x0b\x5d\x63\xbe\xc5\xbe\xd2\xb5\x0d\x10\xed\x67\xbb\xc5\xcd\x96\xfe\xb1\xa7\x99\x66\x9b\xe5\xf6\x5a\xea\x1a\x35\x6d\xdd\x95\x39\x34\xa8\x9b\xe8\xd2\x93\xd3\xbb\x37\x14\x5a\xd5\xb0\xde\xcb\x09\x08\x0a\x3d\xaa\x76\x9d\xe7\xad\xbc\xad\x5d\xd2\x3e\x98\xb1\x8f\x59\xf7\xbe\xc0\xfb\x25\x70\x96\x09\x8a\x03\x67\x2c\xf3\x21\x69\xf4\xdb\x4f\xcc\x57\x62\xe7\xa7\x88\x68\x7a\xbd\x5c\x08\xb8\xbf\x0b\x20\xfb\x60\x73\xf7\x0a\x90\x5c\xb4\xd2\x22\x2c\xc3\xe2\x42\x71\xe0\x8c\x35\x4b\xd4\xdf\x21\x42\x7e\x9c\x1c\x3c\x83\x47\x8b\xbe\x63\xd8\x60\xb2\xd4\x9c\x48\xed\xcc\x8f\x7e\xcb\x26\xf6\xcf\xb0\xba\x7d\x26\x2c\x2e\x14\x07\xce\x2c\x43\xa8\x03\x4b\x82\xce\xfc\x2e\xf3\xaa\x4c\x77\xea\xe8\x5a\x1d\xcf\xf7\xbd\xe6\x19\x3c\x2d\xb2\x06\x49\x7f\xa8\xcf\xf0\xbc\x04\x76\x9d\x41\x71\xe0\xff\x77\x9c\xcf\xdc\x53\x26\x20\xbe\x3f\xa0\x90\xd2\x45\xef\x90\x59\x50\xb4\x4d\xd9\x74\x84\xd5\x23\x8e\x45\x3e\xdc\xde\x14\x3f\x63\x07\x36\xdb\x80\x7a\x12\x2f\xd3\xce\xe8\x3b\xc3\xc7\xe7\x58\xc2\x77\x46\x48\xb8\x1e\x89\xdc\xce\xdf\x9b\x60\x3b\x1c\xcb\xa2\x57\xc0\xea\xb1\xd2\x5b\x41\xfc\xc1\x07\x54\x2a\x87\xe2\xc0\xda\x39\x51\x72\x77\x21\x57\x5d\x2b\xf8\x2d\x82\x18\x83\xfd\x4a\x7a\x95\x68\x67\x5c\x3c\x40\xb1\x4e\x38\x23\x51\x64\xfa\xd3\x9b\x67\x40\xcd\x45\x28\x0e\xac\xdd\xc6\xb1\xcc\x26\xef\x23\x76\x69\x5d\xc7\xf8\x7b\x82\xb6\x2c\x9f\xdc\x33\xcd\x6f\x1a\xea\xc4\xec\xf0\xc4\x52\x9c\xb9\x3d\x79\x24\x0b\x7c\x0d\x80\xe0\xc0\xda\x19\xcf\x93\x86\x95\x4c\x77\x21\xf2\xeb\x38\x9e\xb1\xac\x23\x76\xdd\x45\x78\x4a\x79\x51\x47\xdd\xe1\x35\xe7\x3c\xf9\xd2\xd7\x19\x58\xf3\x83\xe2\xc0\xff\x2f\x32\x47\x34\x41\x45\x21\x17\x87\x7d\x53\xe9\x3e\xfd\xda\x30\xd5\x2f\x07\x35\x57\x7d\x6c\xb7\x9f\xcd\xa2\xc5\x84\xf6\xe8\xf3\x40\xc5\x02\xa8\xd7\xd9\x65\xda\xe5\x85\x2e\xf2\x44\xbc\x7c\x19\xdf\x58\xaa\xed\xba\xcd\xd1\x73\x8d\xbb\xbf\x9e\x3e\x7f\x0d\xd9\xac\xb7\x07\xe5\x45\xc5\x35\xa2\x7d\xd8\x35\x43\x71\x60\xed\x04\xb5\x89\x54\x1c\xe7\xe3\x0f\x1c\x8e\x75\xdf\x99\xff\x61\x45\x94\x8f\x0a\xc6\x20\xbf\xb5\xb7\xa7\x4b\xae\xa9\xb3\x9d\x36\x0e\xb8\x76\x28\x0e\xae\x97\x9d\xd8\x06\x99\x3e\xd2\xc7\x51\xc9\xc3\x80\x7d\x0c\x7f\xa6\x10\x9a\x00\x72\xe7\x4d\x25\x97\xfb\x8c\x7c\xcf\xa6\x5a\xdf\x64\x02\xeb\x94\x50\x1c\x58\xbb\xad\x87\x67\x22\x2e\x0d\xf5\x99\xc7\x7c\x26\xd6\x3a\x3d\x48\xde\x72\x39\xdf\xd1\x1d\xbb\x51\x91\x29\x5d\x35\x0b\x06\x4c\x82\x81\xf3\x9f\x50\x1c\xf8\xff\xd5\xdc\x20\xd1\x68\xd5\x4f\x4c\x8b\x9d\x7c\xfb\x15\x33\x4d\x45\x2a\xe5\x37\x09\x7f\x95\x4c\x5c\x2c\x22\xd9\x04\xb7\x23\x8e\x85\x1d\x4c\x3b\xa8\x9c\x70\x99\x76\xc3\xc3\x54\x4a\xef\x4f\xb1\x5e\x53\xdf\xf7\xbf\x1d\x7a\x37\x4f\xcb\x28\xa0\xb2\x94\xf2\x30\x36\x3a\xa4\xfb\xfe\x6e\xea\xe6\x36\x50\xd1\x03\x8a\x03\x6b\xf7\x59\x88\xce\x13\xb3\xc6\x8e\xf4\xf6\x06\xc1\xd0\x97\x4e\xeb\xdd\x88\x24\x5f\xec\xb7\x79\xbf\xf2\xcd\x3a\xe3\xc7\xb1\x71\xe4\x80\x59\x33\x14\x07\xd6\xee\xb3\x49\x42\xf5\x50\xb1\xf5\x26\x61\x85\x37\x46\x6a\x43\x58\x48\x0b\x3d\xa1\xdc\x33\x37\x9a\x40\xd4\x05\xfe\x30\xea\xdb\x36\x6c\x40\x5c\x08\x0e\xac\x5d\x8a\x93\xd9\x0d\x9c\x02\x69\x29\x69\x22\xd9\x8d\xb3\x27\x99\x2d\x05\xc5\x3c\xdb\xee\xb6\x73\xb5\x27\x59\x78\x04\xe3\xdf\xca\xc8\x61\x71\xa1\x38\xf0\xff\xeb\x5d\x8a\x64\xb3\x7d\xbc\x12\xf6\xa4\x6d\x3f\xc7\xa1\x31\xa0\x6c\x95\x53\x95\x1e\x35\x56\x6c\x88\x88\x76\x24\xc4\xf0\xd7\x72\x07\x50\xff\x16\x22\xb1\x5e\xda\x29\x21\x22\xef\xab\x84\x53\x6a\x68\xfc\xce\xe0\xc1\x92\x48\x71\xa0\xa3\x82\x41\x44\x37\x52\xbe\x8e\xb8\xf1\x64\xdf\x19\xd2\xc0\x7b\xe0\x0b\x06\x04\x07\xd6\x2e\x33\xe7\xd8\x8a\x47\x3d\x9a\xb0\x64\xed\x46\xc9\x2c\x51\x21\x55\xd2\xe4\x12\xdf\xc6\xf9\x6e\x74\xe9\xfb\x14\x6f\xbd\x02\xbd\x34\xe0\x2b\x11\x04\x07\xd6\x4e\x8d\x26\x21\x24\x75\xc4\xc1\xd0\x0f\x47\x42\x67\x29\x2d\x6e\x42\x81\x9c\xfb\x8c\x7e\x8f\x8b\x4e\x11\x8b\xac\x5e\x98\x2f\x55\x19\xa8\x11\x09\xc1\x81\xb5\x5b\x2d\xac\xba\x59\x94\x99\x54\xb9\x75\x50\x14\x36\x5b\x70\x27\x64\x51\xd3\x4d\xf6\x4d\xe4\x3b\x15\x64\x8b\x79\x3a\x94\x83\x3f\x40\x4f\x3f\x28\x0e\xfc\xff\x7e\xb8\x55\x74\x87\xbe\x19\x9d\xa5\x6f\xe7\xbe\xeb\x56\x8f\x7a\xdb\x6d\x07\x65\x7b\xc5\xb7\x55\x2a\xcc\x19\x72\x01\x34\x22\xfc\x2e\x30\x87\x06\x35\xbb\xbf\xdc\xa1\xa9\x36\x96\x6b\xaf\xee\xea\x9b\x23\x8e\x6e\x1e\xbd\xb3\xb0\x5d\x7b\x12\xe4\xee\x15\xcc\x15\xfd\x25\x85\x22\x2e\x71\xad\x22\x66\x0a\xe6\x76\xa0\x38\x78\x87\x96\xbb\x34\x15\xd8\x71\x73\x47\xa1\x94\xcd\xe2\x1d\xdf\x36\xf1\x60\xd7\x97\xbd\xb3\xa3\x8f\xf7\x10\x66\x0a\xd1\xf2\x03\xb9\x47\x8c\x61\x91\xa1\x38\x78\x87\x56\x87\x45\x47\xf7\xe7\x0b\x6e\x0d\x8d\x29\xe2\xb8\xe6\xe3\x74\xa7\x2c\xf9\x17\x78\x83\x64\xda\xe3\x6f\x16\xa3\x72\x95\x2d\x0b\xca\x60\x91\xa1\xb8\x20\x69\x04\xc4\x7f\x46\xfe\xd7\xfd\xd0\x48\xcf\x90\x11\x0c\xe4\x79\xde\xc6\x49\x08\xcc\x7c\xd8\x59\x28\x4b\x17\xe1\x90\xd1\x92\x47\x3f\xdc\x1c\x8d\x6f\x57\x4f\xc2\x2b\xfa\xdb\xa1\x29\x70\xef\x15\x33\x54\xdf\x2c\xe4\x7f\x68\x47\xa1\x30\xd2\xba\x7c\xf0\xfa\x02\x49\xda\x62\xc8\x24\x96\xaa\x32\x05\x09\xe9\x3c\xe3\x2f\xf4\x24\xf3\x05\x1e\xfd\x60\x54\x0b\xc6\x8b\x39\x89\xe8\x38\x55\xec\x98\x63\xef\x94\x0a\x8c\x60\xed\x75\x3b\x21\xd9\xe8\xf0\x66\x9e\xff\x9a\x43\x83\x1a\xda\xdf\xe7\xd0\xe0\x1c\x5a\xb9\x0c\x57\x41\xf2\xfd\xf0\x7a\xb2\x02\x94\xcf\xed\x43\xdf\x22\x55\xde\x3e\xb7\x7d\xfe\xa6\x27\xcd\x6b\xa0\xa3\x61\x79\x4a\x51\xeb\x4a\x96\x77\x78\xe0\xcc\xc3\x1a\x9d\x74\xfc\x51\x98\xcf\xb8\x74\xd0\xf2\x9b\x74\x19\x12\x4c\xdf\xf9\x9b\x19\xcb\x77\x33\xa6\x69\x18\x3c\x14\xd9\x0c\xbd\xae\xa0\x88\x45\x98\xf4\x33\x78\x87\x76\xb3\x29\x7b\x6a\xbb\xda\x4b\x9f\x7c\xc8\x4c\xc9\x2b\x86\x9c\x68\xce\xca\x85\x8a\xea\x69\x00\x71\x5a\x3d\x33\xf7\xeb\xfa\xbe\x2b\x59\x43\x43\x78\x08\xf7\xb3\x23\x53\x36\xe6\x76\x09\x29\x49\x0c\x82\x2d\x07\x66\x3f\xb3\x0d\xda\x5c\xb4\x99\x71\xa7\xf2\xd0\xfa\xc6\x89\xbd\x95\x24\xd2\xb1\xae\x64\xb4\xf0\x0e\xcd\xa1\xe3\x88\x2b\x09\xef\x69\xba\xbc\xbd\x84\xd3\x56\x24\x02\x72\x55\xc6\x32\xad\x7b\x5e\xda\xcc\x71\x26\xcf\xca\xe7\x86\xe3\x5f\x57\xe6\xd0\xa0\x6e\xa2\xcb\x32\xd6\x35\xbe\xd1\x02\x1b\x3c\x59\x36\xfd\xcf\xde\x11\x4a\xdc\xfa\x87\x77\x5a\x3f\xce\x4a\x53\xbf\x20\xa9\xda\xaf\x70\x2e\xdd\x74\xe0\x02\x4e\x7b\x43\x70\xe0\x8c\x65\x32\xfa\x5e\x71\x32\xae\x5f\xe1\x37\xe9\x6f\x4b\x47\x71\x49\xc3\xa3\x9e\x4d\xb4\x61\x7e\xb2\xc5\x2d\x61\x2d\x13\x7b\x15\xe4\x7a\x60\x9f\x3b\x04\x07\xce\x58\xa4\x26\xfa\x87\x0a\x1f\x02\x35\x3f\x52\xe9\x67\xb7\xbf\x0e\xc7\x23\x38\x72\xf4\x8c\x32\xcf\x3c\xf9\x63\x49\xe8\xe6\xc4\x6c\x01\xcc\x14\xa1\x38\x70\xc6\x4a\x92\xea\x91\xbe\xbd\xed\xe0\x7a\x6b\x6b\xe1\x4b\xdd\x0b\xf1\xa6\x68\x53\xd3\x62\x43\x12\xf4\x1a\x44\x07\x93\x3b\xc3\xb4\x19\x40\xfd\x42\x28\x2e\x48\x12\xef\x9f\x15\x53\x88\x74\x76\xd7\x9d\x28\x5f\x86\x6e\x90\x76\x44\x44\xaf\x7d\x22\xc6\x5c\x12\xe6\xfc\x49\xbb\xf5\x85\x2b\xd0\x62\x91\x97\x5d\x1f\x36\xdb\x80\x7a\x12\x2f\xd3\x8e\x01\x7b\x4c\xf2\x58\xdd\x06\x63\xf9\x3a\x3b\xb1\xbb\x4b\xd4\xfc\x41\x5a\x67\xc6\x78\xaf\x38\x99\xfd\xd8\xd3\x17\xce\x3a\x16\x18\x40\x1d\x3c\x08\x0e\xac\xdd\x7d\xaa\x09\x72\xd2\x77\x63\x6d\x72\x85\x43\x29\xa5\x41\x81\xc9\x6f\xf5\xd9\x58\x47\x6a\x43\x9e\xae\x7c\x1f\xd2\x78\xca\x16\x0d\x9c\x4d\x84\xe2\xc0\xda\x8d\x0c\xbd\x0e\xe1\x92\x2e\x0b\x96\x13\x79\x87\xa5\xd3\x98\x6d\x58\x95\x38\xbf\x6f\x3b\x2d\xf3\x61\xc2\x5f\xc1\x5a\x19\xc1\x01\xe8\x65\x07\xc5\x81\xb5\x6b\x30\xae\x26\xce\x34\xd8\xe0\xc5\x72\x6f\xc1\xab\x4b\xf1\xd9\xfa\xb1\xe4\x50\x84\xe9\x8a\x57\xb2\xe8\xfd\x25\xad\xd3\xa0\xcd\x11\xd8\xd9\x07\xc1\x81\xb5\x8b\xeb\x64\xeb\x7b\xf3\x9b\xc4\xb9\xf8\x86\x72\xa0\x70\xd1\x5a\x7b\xa4\x3d\x93\xfa\x80\xe1\x9e\x57\x57\x57\x20\xa2\x8b\xbb\xde\x22\x4c\x3b\xa8\xd7\xd9\x65\xda\x1d\xca\xde\x40\xb2\xa7\x12\xc7\x47\x3d\x0f\x1c\x4f\x65\x6c\x41\x0d\xe8\xdd\xff\x56\x1d\x98\x20\x6f\xa3\x89\x5a\xff\x68\x05\x09\xa8\x32\x0f\xc5\xc1\x75\x4a\x28\xdd\x0b\x50\x57\xa2\x92\x63\x9e\xe1\xf8\x1c\xb1\xfc\x98\xc1\xd1\x43\x6b\xfa\x55\x35\xd1\xf0\x70\xad\xae\xdf\x86\xd2\x19\x50\xeb\x14\x8a\x03\x6b\x47\xf2\x98\x68\x6e\xff\xfb\x6a\x0b\xf3\x98\xe3\x92\x6e\xdb\xd3\x2e\x1f\xe2\x51\x87\x01\x8e\x54\x3d\x59\x86\xb7\xcf\x95\xbf\x28\x01\xd7\x0b\xc5\x81\xb5\x53\xfc\x24\x2d\x41\xe8\x1a\x9a\x55\xed\x7e\xca\xcc\x16\x27\xb6\xa6\xf1\xe7\xda\x19\xd2\xa8\x3b\xf1\xca\x4b\xd2\x81\x8e\x47\x7c\x3f\x81\xb5\x6b\x08\x0e\xac\x1d\xf6\xe0\x49\xb1\x33\xd1\x93\x5a\x2b\x3b\x6e\xa2\x8c\x9d\x7e\xd4\x6d\x82\x2d\x1b\xad\x1b\xce\x3a\xad\x62\xd2\xde\xce\x27\x0c\x07\x30\xed\xa0\x72\xc2\x65\xda\x0d\x2a\xbe\x8a\x6f\xed\xfc\xb5\x18\x64\x22\x38\xd8\x64\x59\x8b\xfe\x40\x7f\xc9\xc6\x64\xbc\x99\xcf\xbe\x35\x28\x7b\x6b\x6f\xbe\x16\x58\xf7\x83\xe0\xe0\xba\x8d\x2b\x2b\xb5\x53\x15\x15\xf6\xeb\x7c\xf2\xc0\xc9\x65\xb9\x21\x68\x2a\xaa\x94\x75\x72\x4d\x77\xc0\x53\xfd\xe9\x1d\xdb\x20\x87\xff\xeb\x36\x0e\xc1\x81\xb5\xf3\x9c\xde\xc9\xbc\xaf\x10\x19\xe2\xb6\x55\xf8\x6b\x30\xbf\x35\xa3\x74\xe1\x51\x3d\x42\x91\x7c\x78\x90\x9c\x60\xcc\x27\x01\x2a\x1b\x60\xc7\x39\x04\x07\xd6\x2e\xa1\x4f\x9e\xd3\x37\x2b\x62\x1f\x5d\x2b\x83\x83\xc3\xec\x7e\x5e\x4d\x50\xe6\x79\xa4\x78\xf2\x21\x4e\x46\xc5\x67\x47\xc2\x4f\xc0\x0e\x79\x28\x0e\xac\x9d\xdc\xb5\x86\xe2\x87\x44\xd9\x93\xe5\x23\x58\xcb\xdb\x5c\x5e\xed\xa2\xd2\xfd\xab\x7d\x4d\xf4\x65\x42\x44\x74\xa6\xbc\xb3\x9c\x77\x61\xda\x41\x25\xd6\xcb\xb4\x9b\x30\xbe\x35\x23\xde\x14\x91\xa5\x4e\xc3\xa6\xec\xc5\xd3\x8c\x44\x25\x38\x49\x71\x3a\xa0\xa0\xf1\xda\xa0\x9c\xa1\x95\x61\x0f\xa8\x1d\x0a\xc5\x81\xb5\x7b\x31\x8d\x64\x2e\xe9\x4d\xf3\x4e\x1c\xc1\xa1\x39\x40\xb2\xd2\x4d\x86\xf9\xba\x67\xcf\x0c\x9d\xd4\x8a\x3f\xdf\x48\x96\xfb\x28\x07\x2c\x2e\x14\x07\xf7\xce\x3c\xa0\xf3\xe3\x36\x0c\x27\x4d\xed\xb7\x59\x35\x16\xd7\x46\x9e\xdf\xdf\xe9\x69\x8e\xbb\x5d\xb7\xf2\xd1\x4e\xcc\x93\x36\x02\x88\x0b\xc5\x81\xb5\xd3\x7a\x33\x6c\x2c\x91\x68\x60\x11\x5e\x7a\x5e\x75\xf0\x25\xc4\x9e\x60\x3e\x57\xa5\xf9\x41\xb8\x4c\x24\xbe\x62\xe5\x33\x77\x4b\xe0\x1c\x1a\x14\x07\xd6\x8e\x83\x47\xba\x1a\xe3\x5c\x75\xb9\x7d\x7e\x42\xd0\x31\xc4\xdd\xac\xe6\x31\x5e\x8a\xef\xb3\x2d\xc9\xfc\x46\xf2\x9b\x75\xe8\x07\x8e\x30\x87\x06\x35\xbb\xbf\xdc\xa1\xbd\x22\xc5\x44\x37\xef\x6a\x79\x26\xf0\x9c\x3e\x64\x82\x8a\xeb\x4b\xfd\x5b\x3e\xaa\xc5\x74\x0a\xb3\x3d\xbf\xcf\x7a\x45\x44\xa9\x3a\x30\xb7\x03\xc5\xc1\x3b\x34\xb9\x0b\x8a\xd0\x86\x71\x36\xc6\xf3\xeb\xac\x12\xe1\x45\x1e\x54\x8b\x5d\x7b\x2f\x18\xb8\x1c\xb4\x4c\x2b\x08\xbb\xed\x9c\x36\x7b\x61\x91\xa1\x38\x78\x87\x36\x3a\x4f\xb5\xb2\x90\x92\xac\xee\xa1\x30\x46\xc7\xf6\xad\xe2\xb4\xe3\x73\x57\x8e\xf2\x2d\x36\xc6\x98\x6b\x08\x18\x02\xe8\x71\xf1\xb0\xc8\x50\x1c\x7c\x95\xc8\x7f\xdd\x0f\xed\x7c\x29\x23\xee\xa2\x42\x28\x69\x29\xf2\xab\x54\x07\xf3\xa7\xb3\x8f\xde\xb2\x68\x98\x3a\x7e\xfc\x64\x28\x0c\xc1\x2c\x9e\x43\xb7\xff\x76\x68\xb4\x52\x0c\xe8\x9a\x33\xaf\xe3\x45\x4f\x23\x89\x47\x36\xed\x84\xd1\x7e\xe5\x99\x3c\xa8\xb0\xd0\xd7\xed\x7a\xb6\xf7\x78\xd7\x95\xe0\x2f\xb4\xf0\xb6\x21\x8e\x9f\xa7\xbf\x3f\xe5\x66\x5a\xa1\xad\x29\x4f\x26\x55\x73\x2d\x12\xf7\xba\x1e\x76\xbf\x58\x44\xfb\x00\x22\xa9\xed\x7f\xcd\xa1\x41\x0d\xed\xef\x73\x68\x70\x0e\x2d\xc8\x65\xd8\xcc\x3e\x74\xde\xc6\xe7\x43\x7d\x34\x93\xd7\xea\xbb\x7c\xf1\x42\x16\x0f\xfd\x4a\xb5\xcd\x9f\xfb\x1d\x4e\x1a\x8f\xbb\xae\x64\x79\x07\xde\xa1\xd1\x78\x4d\x6a\x59\x36\x4a\xe5\x35\x14\x48\xca\xd9\xbe\xf5\x50\xaa\xa6\x18\x75\x61\xc3\x7d\x19\x8e\x92\x73\x38\x33\x96\xa0\xf6\xfb\x4a\x16\xb3\xe0\x1d\x9a\xa4\x4a\xd9\xec\x4b\x5c\x0f\x57\x5b\xdc\x19\xb9\xd2\x1e\xef\xe9\x06\xd7\x6e\x05\xdc\xb7\x15\xdf\xed\x1a\x69\x73\x7a\x0a\x31\xcd\xae\x64\xb4\xf0\x0e\x6d\x56\x4e\xdb\x90\xfa\x51\x98\xc7\x6f\x3b\x6c\xfe\xeb\xa8\x5a\xa7\x63\xaf\x43\x66\xd4\x52\xfd\x82\xad\x65\x94\xf5\x09\x03\x98\x31\xaf\x64\xb4\xf0\x0e\xad\x3a\x40\xf0\x60\x54\x9e\x66\x04\x95\xd9\xf0\x1b\xe6\x28\x06\x2e\x31\xee\x42\xf6\x1d\x53\xf5\x87\x92\xa9\x5c\xfa\x71\x76\xff\x38\x7b\xf9\xff\xe6\xd0\xa0\x6e\xa2\xcb\x32\x56\xaf\x49\x02\xba\x37\xff\xfd\x79\x59\xa9\xa4\x97\x7b\xcf\x65\x09\x14\x4b\x63\x4a\x37\x19\xee\xc8\x15\x3f\x62\xce\x7c\x32\xe1\x0b\x64\x00\x28\x0e\x9c\xb1\xec\xb2\x06\x97\x82\x1b\x12\xbe\xf8\xb6\x95\x1a\xe9\x3d\x1e\xb9\x8d\xa5\xe9\x31\x9a\x91\x46\xc5\x3b\x9c\x4f\x94\x6c\x8e\xe7\x2b\x05\x8b\x0b\xc5\x81\x33\xd6\xcc\x91\xeb\xaa\xf6\xe4\xbb\xb4\x32\xf2\x8e\xe1\x1d\x59\x6f\xae\x47\xe6\x75\xbe\x79\xfb\xfc\x0f\x0f\x76\x73\x11\x0d\xf0\x71\x8d\x61\x71\xa1\x38\x70\xc6\xb2\x6b\xf6\x19\x9f\x10\xf9\xae\x30\x9a\x95\xee\x1e\xfb\x62\xf9\x41\x6c\x79\x91\xfd\xe0\x53\x8d\x55\xa5\xb7\xba\x7d\xca\xa6\x48\x40\x57\x57\x28\x2e\x48\x12\x01\xf1\xef\xb8\x01\x59\x15\xd6\xec\xe4\x33\x17\x1b\x18\x6f\x17\x18\x6c\x24\x58\x44\x53\x30\xfb\xe7\x07\xcf\x95\xeb\x49\xbe\x57\x3a\x51\xeb\x66\xc0\x66\x1b\x50\x4f\xe2\x65\xda\x9d\xfc\x40\xfd\x18\xc0\xe8\x91\x8a\x2f\x6a\xf4\xed\xc9\x4b\x34\x2e\x5a\xf3\x51\x2c\x6f\x47\x8c\x1e\xf2\x97\x8f\xd9\x0d\x3c\x5d\x80\x0a\x00\x50\x1c\x58\x3b\x0b\x65\xe7\x41\x6c\xdc\x0a\x1b\xf2\xf8\x1c\xe3\x09\x86\x6b\xf3\xa9\xca\x62\x14\xe8\x27\xea\x1e\xe2\x32\x0b\x77\xb7\x7e\xdc\x00\x7a\x75\x41\x71\x70\x95\x42\xf4\x32\xad\xcc\x3a\x2f\x46\xac\xf4\xe4\x51\x37\xca\x87\xd6\xf4\x5d\xd8\x3f\xb9\xd2\x44\x0f\xe4\x2d\x5e\x70\xcb\x06\xf6\x45\x01\x6b\x73\x10\x1c\x58\xbb\x2f\xb7\xa2\x52\xac\x7f\xf9\x1a\xcf\x9b\xb9\xf8\xce\xd5\x76\x16\xb8\x8f\x0b\x98\x4b\x0b\xe5\xc8\x47\x26\x2e\xa6\x07\xd8\xf5\xa8\xc0\xe2\x42\x71\x60\xed\x68\x5a\xd6\xdc\xea\x9c\x1a\x1e\x9e\x4c\x9f\x72\x84\x11\xcd\x57\xf3\xf1\xce\x45\x7e\x57\x58\x20\xa4\xf1\x66\x72\x77\xcf\xc9\xad\x82\x69\x07\xf5\x3a\xbb\xb4\x96\xe3\x1c\x6f\xbf\x18\x2a\x7a\x6d\xd3\xb3\xa8\xbc\xc7\x62\x28\x64\x66\xa8\x5c\x46\x6b\xaf\xca\x0c\x52\x46\x7c\x94\x26\xba\x59\x67\x80\x5a\x8e\x10\x1c\x58\xbb\x92\x6f\xba\x5a\x8f\xf8\x6f\xcc\xcf\x10\x9c\x58\x17\x45\x18\x9d\x11\x8a\x04\xe6\xb3\xf0\x33\x6b\xa4\xd6\xeb\x48\xbb\xbf\xaf\xa8\x83\xc5\x85\xe2\xc0\xda\x3d\x12\x98\x11\xfa\xe5\xf3\x20\x36\x8e\x35\x65\xdf\x86\x8c\xe1\x15\x4a\x64\xc3\xdb\x9f\xcf\x23\xf9\x47\xba\x54\xf3\x39\x6a\xf9\x81\x73\x73\x50\x1c\x58\x3b\x3f\xdc\xa1\x4c\xd3\xbb\x03\xf7\x5f\x4f\xd2\x66\x96\x61\xbc\xa0\x70\x66\x33\xbe\x4d\x73\x93\x91\x3e\x55\xd7\x5e\xc9\xd4\x36\x13\xe8\x62\x0e\xc5\x81\xb5\xe3\x70\x2e\x2e\x35\xe7\x4a\x4d\x1b\x4e\xa3\xc9\x99\xaa\x72\xfc\x68\x2b\x22\xf7\xa1\x9f\xb8\x8a\x2b\x3f\x32\xee\x37\xb2\xd9\x2c\x05\x4c\x3b\xa8\x9c\x70\x99\x76\xd8\x79\x48\xbe\xf6\x2b\xa7\xbe\x0d\x9f\xde\xd4\xf3\x20\x57\x06\xe8\x79\x34\x6d\x27\xee\x97\xa3\xf6\x1f\xdf\x32\x3c\xf8\xf5\xaa\x0c\x76\xcd\x50\x1c\x58\xbb\xf5\x66\xb4\x04\xb7\xdf\x53\xbe\x1c\xa5\x69\xc3\xab\x8b\xa5\xd4\x87\x17\x93\x3d\xd7\xbc\xc3\xce\xbe\x77\xe8\x7f\x8e\x99\xd8\x04\xce\xc2\x42\x71\x60\xed\x98\xc5\xf5\x44\x1d\xc4\x59\x7e\xe0\x18\x93\x9e\xf3\x30\xeb\x39\x85\x2b\xa0\x57\xe8\xd9\x7e\xf6\x70\x72\x5d\x23\xf9\x8c\x7f\x4f\x1d\xd8\xd1\x06\xc1\x81\xb5\xeb\xe9\xe0\x61\x31\x7a\xf8\xca\xf1\x53\x0f\x19\xe1\x2e\xf9\x4a\x94\xc0\x1d\x93\xb8\x95\x16\x5f\x83\xd5\xe1\x0d\xd6\xdb\x63\xfb\x72\xb0\xb8\x50\x1c\x58\x3b\xce\x13\x81\xea\x18\x79\x3c\xfe\xfd\x88\xfb\x3c\x1c\x3b\xeb\xaf\x27\x4c\xd4\x6c\x30\x16\x1b\xed\x52\x94\xfd\x25\x7a\x9d\xe7\x19\x61\xda\x41\x25\xd6\xcb\xb4\xbb\x5d\x75\x21\x93\x56\x7e\xdb\x93\xb0\x02\xa3\x08\x8b\xa0\x2a\x6f\x52\xd4\xcd\x50\xd0\x6d\x5a\x4e\x04\xed\x1c\xd3\x3b\xe5\x0d\x50\xcb\x11\x8a\x83\xdb\xd5\x9f\xfe\x3c\xe3\x67\x85\x82\x7e\xb9\x35\x9d\x41\xa4\x96\xe2\x8f\x49\xce\x68\x02\xd7\x48\xe1\xdd\xae\x72\x03\xd2\xe7\xa9\xb3\xb7\x80\x5d\xfd\x10\x1c\x58\xbb\xef\xfb\xcd\xb6\xfd\x78\x6b\x98\x43\x6f\x83\x8e\xb4\xa2\x8e\x5c\xba\x86\x62\xf5\x33\x38\xb5\x6d\x11\x75\x0a\x70\x39\x4d\x6c\xf4\x81\x1d\xe7\x10\x1c\x58\x3b\x79\xac\xd2\xf6\x57\x37\x19\xd4\xaf\x4d\x2f\x53\xe7\x16\xe4\x6e\x53\x1f\x0a\x4c\xf2\x9f\xac\x20\xb0\xba\xc4\x24\x8c\x70\x89\x2d\x02\x15\x53\x20\x38\xb0\x76\xd6\xc2\x95\x96\xcc\x0b\x7c\x66\x7c\x6a\x9f\xc9\xee\xbf\xb4\x25\xdc\x11\x27\xfe\x15\x7b\x80\x79\x6a\x9c\xbc\x6f\xd5\x3e\xb7\x5b\x00\x73\x68\x50\xb3\xfb\xcb\x1d\x9a\x12\xd1\xcc\x76\x41\x76\x46\xf2\x4e\xe6\x57\xdf\x25\xfa\x06\x19\xf7\x49\x57\x5c\x51\x49\x64\x5a\xe3\x9d\xe5\x26\x6b\xc3\x8e\x09\x98\xdb\x81\xe2\xe0\x1d\x5a\x21\x5f\x7c\xcc\x23\x9a\x25\xde\xbc\x07\xdc\xaa\x67\x9f\xb4\x4e\x65\x19\x9b\x53\x43\x32\xec\x50\xbc\x8d\x1e\xd9\x10\x53\xf7\x6e\xc1\x22\x43\x71\xf0\x0e\xed\xe4\xc7\x5a\xf4\x5e\xba\x1c\xa1\xf8\xba\x68\x6b\x24\x17\x65\x24\xf6\xaf\x17\x37\x22\xf3\xc9\x1c\xe5\x4a\x13\x9d\x55\x77\x5f\x84\xc2\x22\x43\x71\x41\xd2\x08\x78\xff\x8c\xfc\xaf\xfb\xa1\x19\xca\x0b\x89\x1f\x2f\x0c\x8c\x0b\xf9\xd9\x12\xf0\xfd\x12\x4d\x3c\xf9\x11\xa0\x57\x7c\x6b\x9c\x38\x92\x51\xba\x20\x00\x69\xb7\xfe\x6f\x87\x36\x2e\x1f\xca\x24\xc0\x79\x2e\x4c\x93\x93\xb4\x3d\xc0\x9c\xf2\xc8\x13\x47\xb5\xbb\x25\x4d\x60\x59\x58\xde\x8e\x17\xa9\x54\x6a\xe2\x2f\xb4\x42\x31\xeb\xd1\xf3\xb4\xd6\x18\x3e\x1e\x54\x5b\x52\x14\x9c\x9f\x02\x21\x83\x27\x96\xa2\xb1\xd5\x9c\x43\x42\x1d\x91\x4a\xc5\xbb\xff\x35\x87\x06\x35\xb4\xbf\xcf\xa1\x29\x80\x67\xf1\xd7\x67\x17\x6a\x6a\x6a\x37\x62\x95\x86\x6a\x7c\xe9\xe3\xfd\xc3\x32\x75\xc7\xa8\x27\xc8\xdb\x4c\xea\x2f\xca\x2a\x9f\xa1\xbd\x9a\xb8\x92\xe5\x1d\x78\x87\xa6\xfd\x70\xe2\xe6\xb3\x20\x56\x51\xc7\xaa\x48\xcc\xc1\x85\xca\xd6\xa1\x9b\x55\xee\x3f\x4f\x7f\xf7\xe3\x0e\x79\xdd\xde\x6e\xd3\xe5\xbb\x92\xc5\x2c\x35\xb8\x9f\xc5\x54\x28\x64\xfc\x11\xc2\x3a\x6b\xb4\xd9\x2a\xd4\x65\xdb\x6a\xcf\x39\x67\xd5\xb1\xab\xd7\x85\xc4\xf7\x21\x6c\x89\xca\xd6\xfd\xeb\x95\x8c\x16\xde\xa1\x0d\xbc\x16\x96\x79\xbe\x4f\x31\x96\x5e\x40\x82\x2c\xce\xf9\x04\x33\x59\x9f\xd8\xaf\x7f\xf6\xe0\xf9\x42\xb2\x09\x6d\xc7\x4f\xf6\xd2\x2b\x19\xad\x27\xdc\xcf\x16\x12\xf2\xfc\xfc\xa0\xe5\x40\x7a\x10\x60\xa5\x8f\x1f\x73\xfe\xcc\xee\x3b\xa2\x90\xdd\x99\x80\x43\x01\x9b\xe4\xaa\xd5\xa2\x56\xe8\x95\x39\x34\xa8\x9b\xe8\xb2\x8c\xa5\x69\xca\xaf\xee\xb9\x6a\x93\xdc\x5e\xd8\x4e\x85\x96\xab\x47\x4e\x8e\x56\xa5\x1f\x28\xf7\xc3\x72\x62\xfc\x76\x78\xf8\x8c\x1b\x50\x0f\x10\x8a\x03\x67\x2c\xe3\xb4\xc5\x97\xdc\x37\xfb\xd9\xe6\xfd\x9d\x28\xa9\x30\x52\x3c\xd0\x36\x9c\xb6\x39\x4b\x50\x6d\x97\x97\x49\x96\x29\x6f\x78\x1f\x03\x3b\xcf\x20\x38\x70\xc6\xfa\x43\xcb\xaf\xed\x3d\xc6\x1d\xfa\x12\x9b\x46\x34\x6f\x1d\xf5\x5b\x61\x2d\xe9\xc3\x03\x7b\x51\x46\x77\xfd\x67\xaa\x16\x3b\x51\xd2\xb0\xb8\x50\x1c\x38\x63\x59\x5c\xb7\xb4\xe1\xcf\xa6\xe6\xb9\xbe\xe0\x4b\x48\x6b\x2e\x20\xe8\xa8\x74\xfb\x9c\x6d\x82\x80\xfa\x17\x22\x06\x9a\x4f\x7b\x8c\x13\xe0\x4a\x20\x38\xf0\x7e\x7f\x9b\xc3\x7b\x1f\x49\x84\x74\x27\x7a\x8d\x6a\xc9\x4c\xf6\xe9\x28\xf6\xaa\x77\x6f\x12\xee\x55\xbd\x98\xa7\xcc\xa0\x8b\xbf\xa9\x4e\x0b\x9b\x6d\x40\x3d\x89\x97\x69\x87\xe3\x17\xa8\x7c\x5b\x8d\x47\x9f\xe3\x9e\x0d\xcd\xbd\x28\x51\x5f\x7b\xa7\x83\xd6\xe0\x9d\x58\x82\xc6\xb7\xc7\xdf\xd4\x6a\xbc\x81\xf5\x4f\x28\x0e\xac\x1d\x0a\x6f\x7e\x81\x96\x02\x29\x16\x5e\x5c\xb5\x47\x62\xd6\x33\x5c\xc1\x49\xaa\x71\xca\x55\xb1\x53\xe5\xec\x1f\x02\xa1\x7d\xed\x80\x6b\x87\xe2\xe0\x66\xf9\x27\xce\x77\x5f\x57\x04\xa1\xd0\xe2\x3d\x1f\xf9\x46\x58\xe8\xbf\x8e\x44\x6f\x3b\xfc\xca\xbc\xa0\x4f\xde\x58\xc1\xde\x30\x0f\x58\x43\x83\xe2\xc0\xda\xfd\xa1\xbc\x37\xe5\xaf\x31\xed\x29\x73\xbc\xb9\xa0\xed\xb1\xa6\x90\x40\xe3\x6d\xfd\xe5\x62\x9b\xab\xed\xfe\x20\xe3\x10\xb5\xd5\xff\xdd\x13\x10\x1c\x58\xbb\xc4\xbb\xa7\x1f\x8a\x88\xd3\x7c\x34\x99\xe7\xc6\xec\x50\xae\x13\x70\x31\xfd\xb2\xe2\x28\xf2\xf4\xe1\xcf\xec\xc0\x42\xb3\x0f\x6b\x80\x69\x07\xf5\x3a\xbb\x4c\xbb\xa4\x41\x95\x00\x6a\xce\xb8\x2d\xc9\x24\x57\xc1\xb2\xe9\x10\x19\x73\x5e\xd9\xec\xf3\x98\xe2\x03\xdd\x89\x6c\xb6\x76\xda\x2f\x40\x15\x6d\x28\x0e\xac\xdd\xe3\x29\x02\x9a\x93\x7d\xea\x54\x11\xb7\x0f\x27\x88\x19\x28\x91\xfd\x22\x84\x8c\x2d\x94\xb4\x13\x21\xbc\x7d\x47\x19\x6b\x6b\xc0\x99\x3c\x28\x0e\xac\x1d\x93\xa3\xb2\x56\xdb\xcd\xd3\x29\x92\x21\x2e\xb4\x2e\x2c\xe5\x33\x11\xfa\xbb\xa6\xce\xc2\xfc\xb6\x69\x54\x87\x73\x9e\xf5\xb3\x80\x2b\x81\xe2\xc0\xda\x3d\x8b\xdc\x57\x32\xd1\x4d\x97\x9c\x1e\xc7\xb8\x96\xd9\x9f\x59\xfe\x36\x99\x2b\x0b\x5b\xb0\xb5\x8d\x8b\x48\xc1\xa3\xb8\x60\x59\x11\x16\x17\x8a\x03\x6b\xc7\xbb\x86\x85\x37\x88\xf2\xeb\x8e\xe4\x39\xfd\x06\xc5\x13\xf6\xe7\xd7\x3e\x4f\x4a\x27\x36\x36\xa4\x3f\x11\x4b\xea\xb4\xaa\x25\x30\x84\x69\x07\x95\x13\x2e\xd3\xce\x57\x7c\x54\xc6\x8d\x48\x33\xf5\x05\xfb\xf1\xc4\xba\x46\x49\xf4\x43\xab\x0f\x13\xf4\xfb\xa2\x61\x37\xf9\x82\xa7\x5d\xf4\x34\x17\x60\xd7\x0c\xc5\xc1\xf5\x21\xdc\x4b\x32\x34\x31\x75\x22\xa4\xa2\x75\x17\x50\xbb\x9e\xa4\xe9\x1f\xf1\xfb\xc1\x98\x4e\xd9\x5b\xd2\x46\xe2\xaf\x87\xd1\xe9\xee\xc0\x4e\x6b\x08\x0e\xac\x9d\x86\x74\x54\xe5\x6f\xca\x37\xcf\xca\x9f\x9d\xed\xf0\x4f\xe8\xa1\x19\x3f\xab\x6c\x3c\x57\x1b\x76\x9f\xc8\x64\xcf\xe6\x41\xe2\x17\x81\xc5\x85\xe2\xc0\xda\xf5\xd5\xc8\x18\x68\xd2\x7e\xde\x28\x38\xca\xf1\xa4\x73\xe2\xd3\xa4\xf4\x54\x5f\xba\x2f\xde\x3b\x71\x5d\x4a\x35\x65\x90\xab\x0d\xd8\x29\x07\xc5\x81\xb5\x7b\x2d\x81\x6a\x49\x36\xb5\xf6\x23\xaf\xcd\x6b\x6e\xba\xb2\x86\x1a\x85\xc8\x9c\xf8\xda\x23\xcd\x77\xc2\x9c\x1c\x43\x8f\x8f\xf4\xa2\x61\xda\x41\x25\xd6\xcb\xb4\x93\xbe\x26\xcb\xe0\xad\x61\xb5\x74\x3c\xde\x56\x72\x82\x38\xb5\x25\x38\x93\xa8\xf1\xab\x69\xc8\x68\xe7\xd5\x81\x66\x20\xff\x3e\x12\xec\x9a\xa1\x38\xb0\x76\x4b\xb1\xa8\x99\x19\xb8\x18\x6a\x74\x74\x61\xaa\x6d\x35\x6f\x45\x3b\xa6\x4c\x26\xcd\x6f\xbb\x1b\x12\xa3\xad\x19\xf8\x08\xe5\x01\xdd\xbb\xa1\x38\xb8\x0e\x25\xfe\x4e\x6f\x52\xc7\x55\x42\xa6\x53\x2d\x0e\xbd\x62\xee\x57\x56\x70\x87\xce\xdc\x70\x72\x5e\xac\x6d\x30\xad\x3f\xee\x79\xdd\x08\x8b\x0b\xc5\x81\xb5\xab\xe3\xb2\x9f\xb3\x0b\xf5\xfc\x34\x4e\x8a\x89\x2b\x1e\x13\xf4\xa3\xf4\x37\x1a\x97\xe3\x8a\xe8\x41\x96\x27\x06\x1b\x16\xd7\x3d\x60\xa7\x2e\x14\x07\xd6\x0e\x8d\x9c\xf2\x85\x7b\x44\xd0\xfb\x67\x4e\xf3\x3e\x87\xf9\xa7\xc5\x9d\x5c\xbb\xa2\x48\xcd\x4a\x75\x78\x9c\x6b\xba\x7f\x24\xd4\x1c\x60\x0e\x0d\x6a\x76\x7f\xb9\x43\x23\x33\x8b\x70\x45\xd7\xc5\x08\x76\xeb\xcc\x9d\x2c\x8e\x93\xbf\x78\xc8\xe5\xd9\xce\x20\x1b\x39\xe6\x9d\x93\xe4\xde\x7a\xef\xd9\x2f\x98\xdb\x81\xe2\xe0\x1d\x9a\xdd\xb7\xda\xc5\x6c\x99\x23\xa3\xa5\xc5\xa5\x37\xfc\xc6\xe6\xdf\x78\xf3\x69\x35\x3d\x4a\x1f\xdc\xde\xf4\x0b\x9c\x4e\xca\xbf\xd7\x06\x8b\x0c\xc5\xc1\x3b\xb4\xc1\x1f\x26\x8c\x8b\xfd\xb9\x7e\x7a\x25\x7d\x05\x5a\x13\x95\x47\xef\x43\xee\xd9\x6f\xd4\x4d\x33\x7a\x2b\x2f\x22\x5b\xf2\x35\xf0\xc3\x22\x43\x71\x41\xd2\xff\x33\xf7\xfb\xc7\xba\xed\xbf\xed\x87\x86\x55\xa1\x4d\x97\xfb\x5d\x68\x7f\x5b\x4d\x04\x4d\xfd\x3c\xfe\xfe\x11\x6d\x18\xbb\x40\x95\xa6\x8b\x63\xdc\x9f\x31\xb1\xaa\xc3\xf2\xbf\xa7\xa0\x91\x7f\xbe\x92\xcf\x30\x50\x18\x9c\x1f\x7f\x74\x75\xcc\x7b\x64\x82\xe3\xfb\x46\xcd\xaf\x03\x4f\x9b\xfb\x0e\x53\xf6\xb1\x87\xfe\xdf\xce\xa8\x61\xc3\x9b\xbc\xb7\x24\xdf\x62\x70\xaa\x57\x96\x68\x03\x15\x8b\x4d\x57\x83\xc0\x0c\x49\xff\xbe\x60\xb4\x64\xba\xe1\x5c\xab\xc9\x7f\xcd\xa1\x41\x0d\xed\xef\x73\x68\x70\x0e\xcd\x8e\xfe\x41\x7c\xc2\xfb\x67\xd7\x8c\x02\xba\x2b\x94\x72\x5b\x9a\x46\x15\x56\xd1\xab\xee\x3b\xfb\x71\xbe\x1a\x71\x9e\xc2\xfd\x92\x78\x25\xcb\x3b\xf0\x0e\xad\x42\xe5\xe1\xad\x0f\x2a\x0c\xc8\x61\x5f\x9e\xfd\xb8\x08\xc3\xe5\x22\xc8\xc8\x21\xf0\xdb\xd7\x1d\xe4\x65\x39\x39\xe2\x15\x1c\x50\xb8\x92\xc5\x2c\x78\x87\x36\xcd\xe7\x3a\xd1\x37\x71\x37\xa1\x9d\xb0\x3b\x28\xeb\xcf\x4d\x8c\x57\xb8\xac\x94\x3e\xdf\xea\x5f\xe6\xd2\x60\x4d\x20\xcd\xae\x53\x5d\xc9\x68\xe1\x1d\x5a\x69\x15\xea\x28\x7f\xfe\xee\x96\x5c\x79\xdb\x77\x3a\xce\x5f\x5d\xd7\xd7\xd4\xe5\x73\xd7\x82\xcf\xef\xdf\x12\x55\xb4\x55\x11\xbd\x92\xde\x02\xe2\xf0\x0e\xed\x97\x53\xc5\x49\x2d\x0a\x99\x76\x05\x5d\x7b\xc9\x3b\x77\x5b\xb5\xb0\x3c\xf6\xdc\x89\x2f\xef\x9a\xd2\x33\xd1\xe4\x64\x5d\x34\x92\xaf\xcc\xa1\x41\xdd\x44\x97\x66\xac\x36\xff\x91\x07\x25\x55\xfd\x3e\x8f\x82\x1c\xcf\xc7\xba\x26\x95\xc7\xd2\x9e\x64\x98\xb4\x17\xed\xbe\xab\x60\x27\x12\x95\x04\x3a\x4b\x43\x71\x70\x67\x2a\xdc\x8c\xb3\x9f\xc5\xd5\x51\xa8\xd9\x3f\x77\x61\x6f\x34\x26\xc2\x90\xc8\x75\xd4\xda\x5a\x4f\x66\xeb\x1b\x90\x1f\xfb\x13\x09\x74\xf0\x84\xe2\xc0\x19\x6b\xbc\xf6\xe2\x31\x1a\x05\x19\x37\x6d\x1a\xae\xb2\x15\x32\xdf\xe7\xd6\x64\xbc\x22\x62\xd3\xae\x07\x23\xfe\xac\x4b\x52\x68\x85\x5b\xb0\xb8\x50\x1c\xb8\xd3\x66\xec\x22\xfb\x56\x4e\x6a\x4b\xc0\xc6\xe8\xd6\xe7\x5c\xff\x32\x72\xcb\x8b\x0e\x2f\x29\x47\x75\x51\x73\x7c\x7d\x9b\xd9\x27\xb2\x62\xb0\xb8\x50\x5c\x90\x24\xe2\x3f\xfe\x87\x78\x8a\x71\x75\xba\x5e\xc6\xa8\x1c\x0b\xc4\x36\x99\xbd\x05\xf6\x97\x38\x5a\xf6\x8b\xbc\x49\xd4\x47\x7e\xc7\x92\xde\xa9\xaa\x40\xd5\x6f\xa8\x27\xf1\x32\xed\xce\x46\xff\x3c\xd7\x2a\xb9\x5f\xc8\xdd\x22\x87\xc5\xb2\xb2\x37\x9e\xc0\xe4\xab\xeb\x5a\x25\x4c\xca\x58\x71\xaa\xc1\xb0\x7f\x38\x04\xbb\x66\x28\x0e\xac\x5d\xa0\x10\xd3\xf5\x03\x73\xbe\xde\xae\x0c\xc9\x22\xe6\x48\x8d\xba\x0f\xf1\x24\xd8\x23\xd9\x81\x7e\x71\x45\xa3\x46\x3b\xdf\x9f\x00\x35\xe5\xa0\x38\xb0\x76\x0b\x81\xa6\xaf\xaf\xbb\x9d\xe5\x4d\x8a\x69\x6e\x04\xae\xad\xe2\x2f\x50\xcf\xa8\x0f\x9f\x78\x3d\xd8\x9d\x5c\x48\x53\x7a\x87\x02\xcc\x40\xa1\x38\xb0\x76\xc2\x26\xed\x0c\xce\xaf\x50\x55\x13\xfc\xb1\x0a\x87\xdb\xf6\x68\x5e\x75\x8d\xd7\x7f\xf4\x91\xf7\xc2\x74\xe3\x8d\xbc\x5e\x6d\x01\x54\xfd\x86\xe2\xc0\xda\x79\xeb\x12\x78\x65\x58\x62\x8a\xa6\xb7\x0f\x6f\xa4\xb3\xfa\xe9\xbc\x15\x9e\xee\xdc\x18\x75\x5f\xe6\x93\xdd\xfa\xf1\x70\xc9\x45\x1a\xa6\x1d\xd4\xeb\xec\x32\xed\xb2\x5a\xbc\x8c\x28\xaf\xb3\xdb\x33\x70\x48\xbd\x8c\x11\xd2\xcb\x22\xf6\x33\xd6\x10\x6e\xf0\x6a\xa8\xa1\xb4\x4d\x44\x14\x8c\x01\x2a\x00\x40\x71\x60\xed\xc4\x36\xc6\x02\xcb\xbe\x13\xee\xba\x49\x75\x54\xeb\xbc\x6c\x67\x6c\x21\x61\xdd\x5f\x89\x7f\xa4\xc0\x6f\x9c\xb3\x32\x29\xe0\x0b\x54\x9b\x80\xe2\xc0\xda\x59\xf0\x04\x7d\x29\x50\xd4\x59\xff\xfd\x76\xf1\x33\xca\xa9\x77\xed\x98\x4e\xbc\xd5\xc5\x8d\x9c\xc6\x90\x28\x69\x2c\x31\xc4\xc1\x20\xe0\x0b\x06\x04\x07\xd6\x4e\xad\x57\x9b\xc4\x3a\xe5\xd0\x96\xaf\xb7\x3e\x91\xa2\xb1\xb8\x71\x9c\x14\x93\xdc\x53\xbe\x19\xf1\x3b\x56\xdb\xf3\xf9\x56\x13\x21\xe0\x9c\x0d\x04\x07\xd6\xee\xc9\x2e\x9a\x7b\xb1\xeb\xaa\x65\xf7\xc0\xd4\x41\xac\x60\x00\x43\xa8\xbe\xbc\xe2\x9b\xd6\xf1\x70\xd7\x98\x63\xa3\xa2\xb2\xc2\x57\x30\xed\xa0\x72\xc2\x65\xda\xd9\x3d\x9e\x50\xbb\xfe\xc6\xe3\x11\xd9\xd1\x6e\x9a\x51\x51\x8f\x4c\x52\xf4\x93\x6d\x03\xd4\x93\xfb\x99\xa5\xb1\x99\xb2\x71\xe2\xc0\xd9\x39\x28\x0e\xac\xdd\x2d\x9b\x51\x19\x45\xaa\x15\xbf\x3f\x44\xec\x9b\x86\xbc\xc4\xd7\x09\xbb\xec\x11\x95\xe8\x2d\x3a\xee\xd3\x7b\x9f\x5e\x1b\x38\x42\x80\xc5\x85\xe2\xc0\xda\x4d\xcf\x3d\x89\x94\x15\x4c\xdd\xd5\x97\x45\x5d\x42\x4a\x33\x17\xfb\xf4\xce\xab\xc7\xca\xe3\xb5\x6f\x1d\xb5\xbb\x60\x7d\x92\x1e\x29\x2c\x2e\x14\x07\xd6\xee\x58\x4b\xe2\xa1\xec\x04\xd1\x2b\x57\xb1\xa7\x38\xb2\x9f\x16\xc8\x53\xa4\xa3\x4e\x6b\x07\xb2\x0a\xdf\x57\x9d\xf5\xd6\xd1\x96\xf8\xc1\xe2\x42\x71\x60\xed\x02\xb5\xb5\x75\xad\x6b\xa5\x5d\x7e\x47\xbf\x4f\xb0\x0d\xbd\xf8\xc0\xf9\x56\x1e\xc3\x19\x41\x6f\xdd\xa0\x7d\x70\x71\x3c\x45\x54\x1b\xa6\x1d\x54\x62\xbd\x4c\x3b\x82\x11\x12\x0c\xaf\xc0\x5b\x14\x92\x6c\xcc\xce\x43\xcc\xb2\x3a\x11\x4f\x33\x28\xb8\x89\x8f\xa2\x6e\x74\x54\x3e\x5b\x31\x25\x05\xce\x1b\x43\x71\x60\xed\xaa\x0e\x2f\xd6\x19\xf3\xe6\x06\x2b\x7a\x0d\xea\x9c\xde\xf4\xa5\x1b\xab\xca\x18\x56\xaa\x21\x15\xc6\x57\xa1\x2f\x6d\x98\x25\x02\x7b\x30\xa0\x38\xb0\x76\x37\x5e\x51\xab\xe4\x4a\x73\xab\x57\xfb\x3a\xcf\x39\x68\x72\x4d\xca\x50\xe1\x6f\xd0\xb1\x55\x75\x4e\x32\x06\x65\x56\xcc\x84\x20\xc3\xe2\x42\x71\x60\xed\x94\x3b\x3c\xa5\xf8\x34\x5d\x90\xb4\xe9\x32\xb2\x7d\xdd\xbf\x30\x67\xa2\x56\x65\x04\x3e\xb9\x7f\xd2\xf2\x46\x6b\x6d\x11\x45\x0d\xa8\x69\x09\xc5\x81\xb5\xe3\xf9\x5a\x63\x57\x85\xe5\xe4\x1c\x98\x54\x96\x7e\x2b\xeb\xeb\x13\xb4\xba\xd7\x12\x56\xf8\xa7\xb7\xf4\x23\x6c\xa4\x3d\xdd\xd5\xf2\x61\x0e\x0d\x6a\x76\x7f\xb9\x43\x43\xfa\xc2\x8a\x52\x42\x55\xd4\x78\xdb\xfd\xa2\x8b\xeb\xf5\xd4\x84\xde\xae\x56\x44\x67\x70\x75\x71\xb1\xe7\x6b\x49\x35\xfe\x92\x6b\x30\xb7\x03\xc5\xc1\x3b\x34\x1f\x35\xcf\x67\x98\x29\x83\xd6\x86\xff\x1f\x73\x6f\x19\x55\xd5\xf3\xfe\xfd\x23\x52\x92\x02\x82\x74\x4b\x29\xdd\x21\x20\x12\xd2\xd2\xdd\xa9\x20\xd2\xa5\x28\x25\x28\xd2\x12\x02\xa2\x80\x84\x74\x23\x88\x80\x82\x92\x52\x92\xd2\x21\x21\x20\xdd\x20\xfc\xd7\xf7\xf7\xbf\xcf\x5e\x7e\xf6\xe1\xfe\xcd\xe7\x5e\x8b\x07\xdf\xe7\xaf\x75\x9d\x99\xfd\x9e\xb3\xaf\x79\xef\x99\xb9\x86\x92\xf7\xba\xe8\xc0\x53\x46\xeb\x7d\xb1\x91\x6c\x17\xcc\x43\x5f\x22\x61\x03\xb4\x0f\x1d\x3c\x88\xc8\x20\x0e\xd9\xa1\xcd\xd3\x10\x98\x3f\x7c\x37\xc6\x4d\x65\xc2\x43\x12\x75\xe9\xf3\x67\xa6\xc3\xc4\x05\x02\x9a\xcd\xea\xef\x52\x1b\xd4\x8e\x7a\xef\xc4\x10\x91\x41\x5c\xa0\x0c\x0a\xca\x3f\x9f\xf5\xbf\xbe\x0f\xad\x7d\xe6\x39\x15\x4a\xba\x0c\x6b\xf9\x04\xa9\x93\xfe\xcf\x85\x23\x67\x25\xfb\x2c\x1b\x0d\xd1\x0f\x45\xbd\x37\x0e\xde\x5a\xe6\xdb\xff\xed\xd0\x82\x2f\xdc\x15\xad\xe1\xf6\x2a\x9c\x65\x6e\xb9\x99\x26\xde\xe7\x99\x1c\x76\xd0\x83\xa9\xfa\xae\xdf\x52\x38\x78\x72\xee\x1e\xfe\xdf\x35\x0b\xf5\x7e\xf4\x2f\x7b\x1b\x66\x08\x89\xe5\xc6\x8a\x37\x84\x16\x59\xb5\x60\x8a\x7a\x26\x95\xa7\xff\x62\xce\x24\x40\x0d\x09\x88\x7d\xfc\xdf\xe6\xd0\x40\x5d\xfb\xfb\x1c\x1a\x92\x43\x9b\x7b\x67\xff\x60\x52\x30\x1f\xab\x8b\x82\x88\xd2\x31\x89\x52\x29\x21\xf1\xd8\x80\xac\xf6\x1c\x07\x59\xad\x13\x3e\xa3\x5d\xd3\x93\x33\x59\xde\x11\x40\x32\x0f\x5b\xfc\xb6\x8b\x71\x59\x83\x6b\x01\x68\x5a\x25\xd9\x76\x7b\x2a\x53\x7c\x12\x84\xdf\xbc\xe4\x99\xfc\xe9\x09\xda\xc9\xc7\x32\xd3\xce\x64\x31\x0b\xd9\xa1\x1d\x45\x2c\x5c\x9f\xa2\x5c\x1f\xa5\x39\xf8\xb9\x43\xdd\xa0\xd7\xcf\xa3\xa8\x7f\xfb\x69\xe6\x5b\x29\x5e\x5d\xbc\x84\xe9\x45\xe5\x3b\x67\xd2\x5b\x23\xa4\x9f\x0d\xfc\x22\x3f\xfa\x96\x88\x20\x58\x97\x86\xb8\x9e\xcc\x9f\xe7\xc0\xc4\x70\xee\xe9\x64\x59\xcf\x4e\xc5\x1e\xa7\x95\xec\x85\xca\xfc\x33\xe9\x2d\xb2\x43\x7b\x82\x7b\xaf\x83\xd5\x98\xd4\x96\x61\xeb\x5b\xd8\x48\xd2\xbe\x30\x89\x54\xa6\x94\x65\x97\xed\x90\x4e\xc6\x7c\xe2\xc1\x97\x5e\x82\x33\x73\x68\xa0\x41\x74\x5a\xc6\x8a\xa9\x59\x4d\x4c\xb9\x17\x91\x28\xfc\x35\x0c\xbf\xf1\x25\xdf\x01\x7f\xa3\x89\x28\x6e\xad\x13\x67\x7f\xf2\x0a\x86\x8e\x0b\x3a\xb4\x2f\x1f\xc4\xc1\x33\x96\xc7\x98\xec\x75\x82\xf0\x85\x03\xea\x9d\xa6\xab\x25\xd1\x33\x79\x99\x99\x28\x94\x8f\x4c\x63\xaa\x8b\x59\x57\x1e\x7d\xc1\x11\xd7\x46\xc4\x05\x71\xf0\x8c\x75\x12\x5e\x67\x98\x86\x37\x9c\x74\x45\x35\xee\x4a\x13\x87\x9f\x61\xcc\x37\xe5\x05\x0a\x1d\xff\xe7\x0a\xa1\xc6\x8e\x59\xf1\xbc\xd0\x5d\x44\x20\x0e\x9e\xb1\x7c\x4d\x8b\x02\xc4\x5e\x3f\xa1\x1a\xdc\xaf\x7a\x74\x31\xda\xeb\x51\x56\x65\x38\xb3\x05\x46\xac\x63\x67\x74\xc2\x57\x07\x25\x02\xe8\xb6\x58\x10\x17\x28\x8d\xf5\xcf\x5d\xe8\xd6\x64\x7d\xfe\x49\xd6\x65\x31\xdb\x5b\x1f\x7d\xa6\xb9\x2a\xb4\xcf\x0f\xa2\x26\x73\xe5\x9f\x4b\xd0\x2d\xdf\x7a\x71\xcc\x02\xcd\xf2\x41\xff\xc4\xd3\xb4\x7b\x95\x23\x28\x74\x15\xff\x9a\xb2\xd0\x9c\xe1\xdc\x9f\x78\x7e\x83\xa2\x5b\xf5\x5c\xb1\xa1\x4f\x2b\xd5\x5e\xee\x1a\x12\x76\xe6\x28\x20\xda\x0c\xe2\xe0\xda\x55\x74\xb4\x5c\x63\xe8\xff\x4c\xed\xae\xfe\xc1\xea\xed\x73\xf3\x92\xc4\x4a\xd6\x3f\x75\x89\x07\x95\x6a\xe2\x61\xad\x43\x95\xb2\xd0\x2d\xe6\x20\x0e\xc9\xa1\x5d\xde\x6a\xfb\xcc\xa9\xf1\x66\xe8\xca\x66\xe0\x49\x79\x64\x18\x83\xc4\x46\x82\xc4\xea\xfa\xbc\x73\x82\x52\x9a\x65\xff\x73\xa8\x5e\x26\x88\x83\x6b\x97\xb1\x66\x85\x11\xec\x93\xe4\xf3\x7d\x10\x2f\xad\xe6\xc1\x48\x6e\xd5\xc6\x20\x67\xee\xd7\x2e\x06\x3e\x7f\x37\xbd\x81\x0f\xba\xdf\xa0\x53\xfa\x00\x0e\xae\x9d\x3d\x4f\xcf\xf9\x31\xf1\x48\x52\x27\x9b\xf9\xa6\xe5\x2b\xb2\x7f\xd8\x1e\xdd\x57\x2c\x68\x5f\x9d\x4e\x92\xc0\xb7\xf2\x0b\xff\x91\x81\xd0\x0e\xf4\x3a\x3b\xf5\xcb\x08\x05\x1d\x76\x84\x1b\x3f\xba\x33\xce\x7e\xeb\xf1\xf9\x6a\x81\x0a\xca\xbd\x91\xd1\x9c\xa3\x6f\xf1\x3d\x83\x9c\x17\x31\x03\xf9\xa0\x2f\x23\x00\x0e\xae\x5d\x41\x29\xd7\x5e\xc5\x9f\xd4\x6d\xf1\x13\x09\x22\xf9\xf2\xd7\xc5\x84\xcb\x64\x12\x3a\xf3\x42\xce\xd8\x2f\xae\x3a\x07\xb7\x52\x37\x23\xe2\x82\x38\xb8\x76\x6b\x85\xca\x0a\x72\xd5\x5a\xbe\x6c\x99\xb2\x8f\x7d\x7d\xf4\x77\x4e\x0c\xbe\x45\xf2\x7a\xbc\xcc\xe0\xde\x1a\x19\xbe\xbe\x1d\x04\xb9\x76\x10\x87\x34\xcb\x37\xaf\xfa\x8e\xc9\x6a\xf6\xfd\x76\x98\xf6\x35\xd2\x99\xaf\x96\x2d\xf7\x17\xb1\x72\x33\x7f\xa7\x6f\x09\xe6\xad\x84\x8f\x13\x15\x40\xb3\x7c\x00\x07\xd7\x6e\x75\x1c\x57\xad\x6c\x7c\x1b\xef\x93\xf2\x80\x75\x93\x3c\x9a\xad\x83\xef\xcd\x24\xf3\x61\x62\xd2\x14\x5f\x0a\xcf\x7a\x85\xf2\x51\x84\x76\xa0\x9c\x70\x9a\x76\xd5\x2b\x31\xdc\xd3\x31\x1c\x4c\x7a\xd8\xf3\xa9\x54\x23\x97\x33\xe8\xa6\xd8\x1c\xf9\x07\x16\x8c\x0e\x79\x32\xf3\x14\xe7\xbe\x40\x77\xc3\x81\x38\xa4\x9b\xe2\x37\x1a\x98\x4d\x49\xc7\x59\xe6\xbd\x13\x9f\x3f\xa2\xe6\xb3\xbe\x60\x8c\xa1\x20\x98\x1a\x35\x65\xff\xba\x49\x5a\x53\x8b\x13\x1f\xaa\x33\x08\xe0\xe0\xda\x61\x92\xbf\x7e\x5b\x7c\x9c\x52\xbb\x2d\xf1\x15\xdd\x99\x91\x4f\x7b\x7e\xb0\xc5\x7a\xb7\x48\x62\x1b\x05\xd7\x59\x32\x0b\xb3\x15\xaa\xef\x09\xe2\xe0\xda\xe5\xd5\xe1\xd9\xf2\x0d\xca\x0e\x99\xff\x99\xd0\x5b\xdc\x35\x59\x51\xc4\x64\x22\x54\x0f\xef\xe5\xed\x51\x46\xf9\x24\x29\xdc\x0c\xed\x86\x06\x71\x70\xed\x74\xf5\x50\xfd\xc4\xb2\x5e\xad\x93\x2b\x95\xe6\xdf\xde\x79\xf4\x12\xc7\xee\xd1\x07\xd6\xa7\x2f\xd0\x5c\xbf\x30\x30\xa5\x0d\x5d\xf8\x06\x55\x0a\x01\x24\xd6\xd3\xb4\xa3\x8a\xab\x8e\x43\x51\x13\xae\xbf\x67\x80\x5a\x6f\x7a\xbe\xdc\x23\x3f\xe4\xce\xbe\xdf\x98\xd8\x7e\x40\x15\xf9\x0d\x36\x91\xed\x32\x44\x9b\x41\x1c\x5c\xbb\x64\x45\x2e\x8b\x01\xd3\x3b\xfd\xdd\x4d\x82\xf1\x34\x05\xb4\x1f\xbd\x38\xbd\xae\x04\xd7\xeb\xfc\xe0\x30\x09\x90\xfc\xe9\x55\x06\x55\xe8\x01\x71\x70\xed\xb6\x53\x7c\x54\x98\x8e\xc9\x06\x66\xd9\xf1\x5c\x08\xdb\x3f\x38\x6a\xbd\xa5\xba\x8b\xf6\xeb\xf7\x48\xba\x55\x74\x55\xd9\x45\x6c\x34\x44\x5c\x10\x07\xd7\xce\xb0\x81\xc4\x4d\x1c\xbb\xc8\x16\x9d\x62\xce\x01\x3f\x0a\x8b\x24\xee\xe5\x7d\x05\x36\x9a\xd7\xa2\x2f\xbc\x58\xef\xdc\x9e\x21\xa6\x46\xc4\x05\x71\x70\xed\xc6\xf8\x4c\x3d\x36\x57\x48\x77\xac\xfd\x44\x07\x8d\xf0\x51\xc8\x87\x3c\xbd\x0c\x33\x43\x37\x86\x4f\xea\x9d\xe2\x0b\x48\xe4\x06\x10\x0e\x0d\x34\xbb\x3f\xdd\xa1\x9d\xf8\x72\x74\xd9\x3a\x8b\x07\x39\x6c\x95\x84\x16\xa8\x6d\xf7\x87\x7c\xf0\x31\x10\xbc\x99\x8e\x9d\x58\xa8\xa7\xf7\x4b\x5c\xbe\x10\xe1\x76\x40\x1c\xb2\x43\x93\x98\x30\x1b\x11\x58\x8a\x77\xa2\x7d\x3c\x4a\x2a\xfa\x83\x22\xcd\x9a\xe4\xb8\xff\xa0\x51\x48\x55\x39\x3e\x97\xf2\xe3\xbe\x78\x3f\x22\x32\x88\x43\x76\x68\x5b\xc7\xa1\x06\x1d\xac\x73\x92\xd8\xc2\x41\xdd\x9b\x53\xba\x17\x2b\x3e\xd2\x1f\x05\x26\x61\x25\x32\xbf\xbf\x67\xf7\x75\x9d\x1f\x3a\x87\x06\xe2\xfe\xe3\xd0\xfe\x39\x96\xff\xf5\x7d\x68\x8b\xbb\xa6\xca\x9f\xf4\xca\x8e\x6d\xfc\xd4\x47\x4c\x48\x19\x44\x88\x27\x29\xd9\x49\xee\x92\x11\x8b\xd1\xcb\x96\xb8\xbe\xe9\x4e\xfc\xdb\xa1\x85\x86\xa0\x58\x1f\x0d\xe3\xd7\x65\xd5\x2e\x68\x09\x4f\x28\xf3\x4a\xe3\x3a\x2e\x7a\x06\x6a\x54\xf7\xda\x66\x12\x18\xbd\x5d\xfd\x7b\x62\x2b\xa3\x36\x60\xe4\x4b\x64\x68\xb8\x5b\xcf\x7e\xa9\x12\x1d\xff\xdb\x56\xe8\xa5\x63\xd5\xba\x95\x46\xf4\xe6\xe2\xda\xfb\x22\x84\xaf\xff\xdb\x1c\x1a\xa8\x6b\x7f\x9f\x43\x43\x72\x68\x97\xd7\x85\xdd\x0d\x7f\x06\xd8\x59\x7b\x3a\x58\xb1\x92\xa3\xf7\x87\xa4\x32\x55\x4b\xcf\xe8\x2e\x26\x72\xd0\x05\x72\xeb\x58\x64\x9f\xc9\xf2\x0e\xb2\x43\xd3\xa4\xb1\x62\xd0\xc5\x13\xde\xc7\xaf\x08\x08\xb6\xe4\x65\x98\x5a\x59\x56\x88\x56\x51\x8f\x20\xac\xcf\x7f\xef\x47\x7f\xf5\x62\xc3\x99\x2c\x66\x21\x3b\x34\x76\x9e\x4f\x0f\x9c\x0d\x57\xb5\xb1\x99\x39\xb3\x48\x9e\xed\x6c\x4a\x2f\x65\x86\xc5\x4d\x93\xa9\x74\x90\xf6\x35\x24\x7d\x64\xfb\x71\x26\xbd\x45\x76\x68\x5c\xbf\x12\x8c\xb9\xd9\x03\xb9\xde\xdf\xba\x46\x93\x6b\x71\x25\x80\x3e\xfb\x87\x98\x3e\xc5\x2c\xd6\xf8\x41\x3a\xd3\x05\x7d\xe1\xbb\x67\xd2\x5b\x64\x87\x16\x47\xe9\xcb\xbd\xa6\x95\x33\xdf\xbc\x6e\xe1\xa2\xc2\xb8\x4c\x52\x66\x1a\x1c\xcf\x70\xd0\xa1\xe4\x84\xf7\x74\x2a\x85\xdb\x20\xf7\xcc\x1c\x1a\x68\x10\x9d\x3a\xcb\xe7\x50\xc6\x5d\xca\xbf\xb9\x43\x9f\x2f\xb6\xfd\xe9\x1d\x1e\x95\x4c\x9a\xf1\xf4\x83\x32\x87\x57\x0c\xb3\xf3\xdf\xb5\xc6\xbb\xde\x43\xb3\x7c\x00\x07\xcf\x58\xdf\xaf\xe4\x0c\xf6\xf3\x7c\x71\x69\xec\x26\xab\xbb\x4b\x42\xd8\x3d\xb7\x9f\xc5\x1a\xef\x4e\xe7\xff\x66\x50\x5c\x7f\xf4\xdd\xf9\x12\xe8\x34\x3d\x80\x83\x67\x2c\x2f\x93\x49\xf5\xf4\x87\x23\xf7\xdf\xb7\x17\xce\x94\xac\x7f\xd2\x49\xb4\xc9\x33\xa0\xb8\x35\xcd\xe9\xcd\xc7\x56\x47\x30\xdd\xaa\x87\x88\x0b\xe2\xe0\x19\xcb\xfb\xb2\x91\x42\x7e\x26\xf5\x5b\x57\x83\xcf\x27\xcb\xf1\x1e\x35\xba\x3f\x96\x36\xd0\xcc\x0c\x6a\x1f\xf8\x1a\xd9\x07\x88\x36\x41\xb5\xf5\x40\x1c\xfc\x39\xe0\xd0\x7c\xaa\x0d\x7f\xf2\x24\x59\x9e\xe2\x2b\x15\xc6\xef\x5e\xe9\x47\xb3\x5a\x59\x5c\x6c\xd7\x26\xdc\x6d\x1f\x5f\xd2\x1d\x79\x00\xcd\x36\x40\xff\xc4\xd3\xb4\x9b\x54\xa2\xe0\x09\x70\xba\x96\x9e\xe1\xd2\xa9\x56\x3e\x68\x42\x11\x90\x98\x94\xd7\xb1\x77\x4e\xeb\x1d\xf6\x91\x77\xca\x8d\xfa\x35\xa8\xae\x25\x80\x83\xb7\xf9\x55\x12\x61\xb8\x5c\xf1\x57\xd1\x56\x74\x9a\xb6\xb2\xa9\x9d\xc0\xd0\xc6\x8d\x3c\x76\x19\x2f\xca\x88\x4e\x9d\x5b\xf9\xcc\x83\xd0\xee\x25\x10\x07\xd7\xce\xe3\xea\xfc\x1b\x7f\x5c\xa7\xb6\x9f\xa6\x78\x66\xc2\xf2\xba\xcf\x8c\x7e\xa8\x67\x1f\x06\x3c\xa0\xb0\x18\xaa\xea\x9b\xc2\xd2\xb6\x80\x5c\x3b\x80\x83\x6b\xf7\x2c\xb5\x7b\x92\x33\x88\x98\x2d\x2b\xa3\xfa\xa9\x7a\xc8\xa0\x49\xa4\x89\xf0\xf7\xa9\x34\xbd\x57\x36\x3f\xa3\x58\xab\x86\x9c\x5f\x21\xe2\x82\x38\xa4\xb3\x25\xa9\xb6\x31\xe5\x58\x57\xbe\xce\x7f\x9c\x1e\x6b\xd5\x9b\xbe\x3f\x4e\x77\x21\x70\x8f\x40\x7c\xb6\xd0\xb3\xfc\x93\xdb\x0d\x85\x0e\x84\x76\xa0\xd7\xd9\x69\xda\x05\x2f\xc5\x51\xa3\xe3\x5f\xfb\x2d\xb8\xf5\x68\xda\x5c\xcf\xc2\x2e\xfc\x52\xbb\xb0\x1d\x13\x05\xd6\xe3\xe1\x8e\x47\x6b\xd8\xec\x4b\x50\x65\x01\x00\x07\x6f\x73\xf1\xaf\xd8\xad\x2c\x2e\xff\x1a\xe5\xb1\x64\x5a\xb4\x80\x55\x7d\x03\x02\x73\xe3\x51\x8d\xf2\x39\xb4\xca\x2e\x49\xd7\x29\x4b\xa8\x8a\x3f\x88\x83\x6b\xd7\x91\xed\xf6\x2e\xa5\xa0\x58\x81\x5b\x35\x5f\x2a\x34\xac\x64\xf8\xc7\xcb\x45\xfa\x3a\x95\xf7\x78\x23\x22\x62\x5e\xf7\xc6\x05\x35\xa1\x33\x47\x00\x0e\xae\x5d\xd8\x26\xca\x01\xb3\xac\x35\x0b\x03\x26\x63\x9a\xdd\x17\xbf\x90\x17\xd4\x06\x38\x38\x0f\x9a\x85\xda\x65\x79\x3c\xf0\x1e\xf9\x6f\x20\xe2\x82\x38\xf8\x73\xe8\xf9\x6c\x5a\x78\x74\x63\x5f\x2d\xf1\x36\x4d\x5e\x1d\xe1\x35\xea\x66\xdb\xad\x1e\xea\x93\x9e\x5f\x44\x1b\xb7\xde\xba\x3d\x7a\x00\xed\x72\x04\xe5\x84\xd3\xb4\xe3\x95\x7a\x31\x88\x15\xc4\xa7\xe7\x83\xd6\x67\x4a\xa4\xad\x58\xfa\x62\xfe\xa6\x3e\x1f\x4a\x23\x79\x9b\x7b\x3f\x7a\x48\xc1\xaf\xbb\x88\x36\x83\x38\x78\x9b\x09\x3c\xcf\xcf\xfc\x94\x9c\x7d\x71\xab\x2f\x2d\x4c\x9b\xbc\x8e\x5c\x84\xea\xe8\xb7\xb2\x7f\xd7\xa5\xe6\x8e\x75\x3a\x94\xe1\xf5\xdf\x88\xb8\x20\x0e\xae\x9d\x4c\x40\xbe\x72\xb7\xdb\x31\x6d\x40\x95\x09\xfd\x28\xb5\xfb\x90\x58\x58\x54\x64\xff\x9a\x50\x65\x06\xa6\x61\x6b\xb6\x27\x59\x26\xf4\x35\x00\xc0\xc1\xb5\x53\x94\x72\x8e\x8f\x08\x7a\xca\x27\x70\xe5\x5c\xf8\x62\x41\x4d\x5d\x92\x51\x82\x92\xb5\x25\x4b\x78\x6d\x85\xc8\x53\xab\x95\x46\x1c\xa8\xca\x0b\x80\x83\x3f\x07\x3f\x7b\xb9\xb0\x87\x75\x6c\xf4\xb9\x8a\xbc\x17\x7e\x4a\x7f\x0a\xdc\x32\x4e\xbf\x10\x75\x01\x65\xa0\xd9\xd3\xf7\x2e\x6d\x07\xc7\x4d\x84\x76\xa0\xc4\x7a\x9a\x76\x19\xad\x33\xaa\xbf\x1d\x9a\x13\x85\xc5\x3f\xab\x8e\x05\xed\x1b\xf4\x88\xa9\x12\x62\x3c\x9e\x11\xc4\xb6\xe3\x34\xb1\x56\xb0\x82\xce\xac\x82\x38\x78\x9b\x6d\xb2\xcd\xd7\x17\xf5\x3b\x4e\x7a\x57\x49\x37\x68\xad\x99\xc8\xd9\x8a\x6f\x37\x25\xcd\xc8\xd9\x7d\x18\x97\x9d\xcb\x72\xc6\x86\x6a\x17\x83\x38\xb8\x76\x12\x4b\x02\x91\xeb\x72\xa8\xaa\xf7\x1f\xf9\x9e\xc7\x40\xc5\xef\x55\xc9\x18\x63\x47\x2b\x1d\x20\x2b\x4f\x09\x7a\xd1\x90\xc4\x9d\x07\x9d\x6f\x03\x70\x70\xed\x04\x03\x03\xb8\x71\xe9\xf2\x24\xf0\x75\x38\x8b\x63\x17\x50\xab\x3e\x5a\x78\xae\x99\xb4\xe6\x65\xe4\x1e\xa9\xa9\xe7\xf4\xec\x40\xef\x4c\x10\x07\x7f\x0e\x02\x0c\xfc\x22\x1c\xbb\xd4\xd7\x1f\xb0\x5d\x6e\x0f\x1d\xd4\xb1\x17\xf9\x5e\x36\xcb\x7c\xae\xbd\xba\xd4\x60\x83\x85\xf8\xde\x32\x1b\xc2\xa1\x81\x66\xf7\xff\x97\x73\x68\xec\x4c\xc2\xa6\xdb\xcc\x37\xa2\x5b\x79\xbd\x34\xb5\x12\xe3\x88\xf4\x1a\x33\xfe\x90\xa3\x11\x26\x84\x51\xdb\x52\xc6\x5d\x38\x82\xce\xa1\x01\x38\x64\x87\xd6\x62\x19\x68\x2b\xec\x30\x36\x53\xa2\xf2\x54\xc3\xf1\xe0\x0b\x5e\xcc\xdd\x0d\x45\xe5\x2a\x59\x5b\xb6\xac\xc6\xf2\x89\xec\xe2\xd7\x88\xc8\x20\x0e\xd9\xa1\x89\x51\xce\x46\x57\x84\x72\xf8\xe1\x5c\xa6\x91\x2b\x90\x48\xd3\x38\xc1\xee\x6a\xc4\xa4\x30\xa9\x73\xdd\x10\xb6\x6e\xab\x38\x54\x41\x44\x06\x71\xff\x71\x68\xff\x74\xc3\xff\xfa\x3e\xb4\x2d\x57\xad\x57\x84\x86\x39\x61\xc9\xeb\x52\x39\x21\x27\xef\xb1\xf9\x3a\xda\x48\xac\x04\x8f\x52\xd1\xd5\xfb\x35\x76\x6a\x8d\x9f\xff\xed\xd0\x48\xa6\x9c\x22\x31\xa3\x08\xc7\x0c\xcc\xf3\xef\x07\x61\x50\xf6\x85\x05\x04\xbb\x3c\xba\xa9\xc9\x89\xc5\x7d\x3d\x73\xdf\x90\xde\xed\xef\x7d\x20\x37\xd0\xc8\xe3\x04\x1f\x47\x4e\x37\x19\xea\x35\x13\xee\xac\x17\xca\xf7\x08\xdd\x8c\x48\x78\xcc\x34\xc9\x47\xf3\x4e\x91\x32\xe0\xbf\xcd\xa1\x81\xba\xf6\xf7\x39\x34\x45\xf8\x2c\x5e\xf9\xfa\xab\x21\x73\x45\xae\x58\x6f\x11\xfc\x18\xd4\xa8\x2d\x16\x8c\x5f\x28\x84\xd6\x8b\xd6\x29\xef\xd9\x4f\xe8\xbd\xb4\x87\xce\xa4\xda\xbe\x1f\xb2\x43\xd3\xfd\xb8\xb0\x5b\xd3\x7c\xf3\x7d\xd5\x05\xef\x07\x2d\xdd\x73\x1a\xaa\x27\x47\x0d\x2b\xcf\x7a\xfb\x33\x46\x04\x64\x06\x12\x13\x82\xce\x64\x31\x4b\x1d\xd9\x18\x66\xce\x9e\xa8\x88\x88\x0d\x89\x93\x74\x65\x5d\xae\x35\x67\xf5\xc0\xa4\xec\x5e\xb5\x9f\xc3\x3a\xb7\x33\x1f\x7e\xff\xc3\x2d\xdf\x33\xe9\x2d\xb2\x43\x23\x0d\x39\x58\xa3\x57\x2f\x2e\xbf\xf6\x67\xce\xa1\xd0\x67\xfd\xf3\x57\xfd\x4f\x31\x49\xb5\xe3\xc6\x2d\x24\x03\x6d\xb3\x6e\xba\x42\x67\xd2\x5b\x2f\xa4\x9f\xa5\xd2\x9f\x54\xbe\x5b\x54\x99\x67\x5f\x3b\xa6\x91\x7e\xc3\x1a\x25\xe3\xbb\x85\xa4\xa5\xc9\xb9\x8e\x67\x45\x84\x1c\x52\xd3\x15\xd7\xcf\xcc\xa1\x81\x06\xd1\x69\x19\x6b\x7d\x13\xbb\xd6\x40\x17\x87\x0c\xad\x9f\x81\xa5\x6a\xdf\xba\x99\x6d\x36\x6c\x31\x3f\xa8\x1f\x4b\x6b\x91\x0c\x8f\xea\xc8\x08\x5a\x7f\x00\x71\xf0\x37\xb5\xde\x50\x68\xb4\x13\xc1\x54\x5e\xb6\xb2\x5b\xe8\xa7\xa9\x4b\x66\x1f\x03\x4a\xd3\xbb\xb7\xf4\x4a\x7e\x3f\x98\xef\x17\x5c\xde\x81\xaa\x42\x80\x38\x78\xc6\x0a\xf5\x18\xd5\xb1\x23\xb7\x7b\x4e\x55\x68\x43\x8d\xc6\xdf\xac\xaa\x92\x62\xc6\x31\xc9\x64\xe6\xa1\xa0\xfd\xfe\xe5\x3d\x63\xb3\xaf\x88\xb8\x20\x0e\x9e\xb1\xa6\xe5\x66\xf0\xd9\x39\x06\x85\x7d\x0c\x73\x57\x4b\x9e\xaf\x2f\x08\xc7\x57\xbc\x7a\xf8\xe6\x02\x86\x18\xa7\x63\x51\x71\xae\x39\x54\x09\x01\xc4\x05\x4a\xa3\x60\xfd\x1d\x77\x82\x26\x66\x64\xdd\xa0\xb3\x45\x68\x76\x6d\x2c\x95\x38\x85\x9e\x9b\xf6\xfd\xd5\x7a\xed\xed\xf8\x9a\xf6\x8c\xc2\xc3\x41\xa3\xe7\x88\xd9\x06\xe8\x9f\x78\x9a\x76\xbb\x23\xb3\x32\xfb\x18\xd3\xe8\x56\xb9\xd3\x21\x7e\x44\x1c\x58\x81\xe4\xab\x6b\x5b\xe8\xa4\xee\x09\xdb\xd4\x21\xd7\xa6\x9d\xa0\x6f\xf9\x20\x0e\xae\xdd\xa6\x93\x65\x45\xf2\x9b\x9b\x36\xc6\xbd\x69\x69\x0a\x95\xce\x36\x87\x65\xdf\xed\x63\xac\xaf\xa0\xbc\x7d\x3e\x98\xb5\xf0\xc6\x7d\x10\x11\x17\xc4\xc1\xb5\xab\xa3\x2d\xac\x37\x96\xaf\xd7\x50\xd6\xaf\x4c\xd8\xa1\xbd\x15\xf1\x3c\xaf\x63\xf2\xc5\xc2\x9f\xd7\x12\x61\xd5\x94\xf4\x9e\x97\xdd\xa0\xb3\x0f\x00\x0e\xae\xdd\xcd\x86\xf6\x6f\xae\x7f\xca\x78\x9c\x71\x4c\x89\x54\xd5\xee\x5a\x4d\x95\xb1\xb4\xb5\x16\x1b\xd3\x94\xdc\xb1\xde\xfd\x69\x35\x03\xed\x04\x02\x71\x70\xed\xd2\xf2\x8a\xce\x15\x9a\x2d\x17\x5d\xfc\xba\x15\x50\xcc\x93\x96\x5c\x3a\x4e\xaf\x72\x97\x24\x2f\xad\xeb\xe3\x4f\x0f\x94\x12\x97\x6c\xc8\x5d\x03\x5e\x67\xa7\x69\xf7\x91\x5c\xfe\x69\xed\x45\xac\x1b\x46\xf1\xea\xb3\x83\x9a\x09\x37\x47\xb1\x9e\xa0\x73\x2a\xfd\xf6\x38\x17\x96\xf3\x65\xbb\x5c\x46\x17\xd1\x66\x10\x07\xd7\x2e\xf5\x9a\x5d\xab\xbd\xc8\xf1\xe5\xa9\x5d\xcf\xbb\xf1\xbd\xf4\x2e\x9a\x2e\xcf\xa8\x7d\x46\xf8\x5d\x7c\x7f\x36\xfa\x73\xb0\x48\x43\xf7\x1b\x82\x38\xb8\x76\x8b\x06\x8b\x84\xa4\x2d\x47\x73\x14\x8b\x31\xcf\xaa\x35\x97\x17\x02\x0a\x5c\xfb\x4a\xcb\xb6\xde\x04\x24\xec\x53\x6a\x59\xbc\x83\x2a\x7a\x80\x38\xb8\x76\xab\xa3\x17\x50\x89\x0f\x6f\xb7\x7e\x89\x3c\x99\x9e\xb4\xc9\xf2\x18\xb0\x54\x22\x24\xa2\xac\x99\x53\xd8\x6d\xff\xe6\x4e\x79\x1d\xaa\xdc\x00\xe2\xe0\xda\x39\xca\x14\x59\xb0\x61\xda\xa7\x2e\x07\x45\x1b\xd4\xa9\xb7\x08\xec\xc9\xc8\xa8\x8a\x32\x58\x99\x11\x07\x6d\x64\xd0\xcb\x87\xab\x22\xb4\x03\xe5\x84\x53\xeb\xdf\x1a\xb7\x4a\x3f\xcc\xe6\x50\x0d\xcc\x7e\xf0\xa2\xdd\x59\xfa\xd7\x04\xe6\xd2\x43\x9b\xd7\x75\xe4\x27\x4f\xd6\x3e\xf8\xa2\xa0\x11\x23\xda\x0c\xe2\x90\xbe\x08\x58\x47\x2c\x7c\x48\xbf\x9e\x2b\xa3\x8a\x22\x69\xa2\xc1\x9d\x42\x7e\xab\xa4\x38\x71\x5a\x99\x28\x3e\x9b\xb6\x29\x4a\x69\x1e\xaa\xde\x00\xe2\xe0\xda\xe9\x0e\x6f\x99\x4a\xec\x1d\xa7\xf0\xe1\x44\x99\x84\xb7\x3e\x7a\xea\x2d\xed\x93\x29\xbd\x27\xfb\x9e\xe0\xe4\xd6\x88\x7a\xf5\xf3\x7c\x44\x5c\x10\x07\xd7\x4e\x49\x6b\xc5\x2a\x50\xe2\xb6\x38\x29\xe5\x09\x7b\xc4\xc5\xb0\x73\x02\x6d\x96\xc6\x26\x41\x94\x3d\x9d\x7d\x77\xbf\x4f\xbb\x5f\x87\xce\x1a\x83\x38\xb8\x76\x17\x27\xd6\x42\xb2\x7e\xf5\x56\xe2\xa5\x74\xc9\x7f\x50\x7f\x79\x97\x8e\x92\xf4\xa1\xea\xd5\xc2\xd5\x26\x67\x25\x0e\xf1\x6e\xc9\x7d\x84\x76\xa0\xc4\x7a\xaa\x43\xa3\x13\xfc\xc0\xda\x9b\xcf\x91\x49\xd5\x21\x7e\xf5\xf7\x74\x59\x3c\xdf\xf6\x64\xec\x66\x19\x3e\xfb\xd5\xb6\x19\xfa\x7b\x5c\x90\x93\x02\x71\x48\xd5\xf6\x49\x99\x44\xb7\x8c\x0f\x05\x0f\x8d\xe3\x78\x16\xf8\x96\xdf\x7c\x65\x36\xa8\xee\x3d\x1f\x96\xc3\x38\x6f\xf4\xe7\x71\xa5\x32\xe4\x82\x41\x1c\x5c\xbb\xf6\xa3\x82\xb7\xbf\xbb\x6a\x6f\x0b\x1a\xe8\x47\xa6\x46\x53\xde\xa1\xf2\x22\x49\x6e\x58\x53\x21\xa7\xe4\x0c\xbe\xd4\xb6\xee\xfe\x16\x11\x17\xc4\xc1\xb5\x2b\x47\x55\xcb\x65\x68\x25\x5c\xd9\xff\xa8\x3d\x7e\x45\x40\x7f\x60\xbb\x9e\xa0\xcb\x65\x98\xff\x65\x72\xf4\xa1\x3c\xae\xea\x00\xf4\x8e\x07\x71\x70\xed\x0e\x75\x23\x48\x54\xb2\x95\xa8\x6c\xca\xd3\xf2\xfb\xe5\x8e\x93\x4e\x12\x82\xb1\x6c\x48\xeb\x9d\xbd\x1e\xbe\x73\x39\xcc\xd9\x0f\x46\x38\x34\xd0\xec\xfe\x74\x87\xc6\xe4\x79\x32\x2c\xbb\xde\xae\x85\xd7\xd1\xaf\x7c\x6b\x68\x2f\x55\xf8\xf0\xf1\xbc\x62\x8d\x75\xed\x04\xa7\x6c\x86\xcb\x40\xfb\x05\x84\xdb\x01\x71\xc8\x0e\x6d\x90\x7c\x8d\x81\x80\x22\x6a\x58\x2e\x63\xd1\x09\x0d\xdb\xe4\x55\x6d\xf4\xa2\x03\xd6\x8d\x3b\xb8\xb2\xe2\x22\x59\xe2\x09\x84\x3b\x50\xc5\x45\x00\x87\xec\xd0\x78\x0a\xfc\xf7\x2c\x34\xc3\xcc\x1b\x28\xce\xdb\x55\xb1\x88\x66\xed\x2c\x1f\x06\xba\x1e\x77\x5c\x2c\xbf\xf0\xfd\x73\xf2\xed\x08\x2e\x44\x64\x10\xf7\x1f\x87\x46\xf7\xcf\x2f\xa9\xff\xf6\x3e\xb4\x8f\xd1\xad\x68\x85\x4a\xab\x7b\xeb\x0c\xac\x1b\x76\x3c\xae\x89\xb2\x0c\x9e\x8e\x9d\x94\xd7\x43\xf3\x2e\xaa\x57\x72\x84\x32\x50\xfd\xed\xd0\x38\x31\x5e\x51\x8b\xa4\x7d\x91\x9a\x3a\x91\x14\x48\xef\x1f\xfe\xed\x16\xa7\xf4\x94\x22\x57\x9b\xeb\xda\x57\x7c\x16\x81\x89\xc1\xa7\x7f\xa1\xda\x9f\x5a\xbd\xba\xd8\x70\x13\xfa\xe6\x9a\x4e\x30\x63\xe5\x54\x6b\xf7\xf0\x0b\x3a\x50\xfb\x54\x96\x0d\x23\xd2\xb4\xad\x4e\x04\xff\xdb\x1c\x1a\xa8\x6b\x7f\x9f\x43\x43\x72\x68\x7b\x55\x05\x7f\x9e\x7a\xbe\xec\x96\xd8\x79\xe9\x9a\xea\x5f\xe2\x33\x16\x36\xd1\x30\xa2\xcf\x89\x59\xbf\xb0\x2e\x92\x76\x4f\x50\xf3\x4c\x96\x77\x90\x1d\x9a\x89\x49\xe7\xc3\xfb\xdd\xaf\x38\x6e\xf0\x4e\xaf\xe8\x0e\x88\xf7\xb3\xa0\x79\x79\x64\x46\x4e\x15\xea\x1b\xb6\x34\x9a\xbb\x67\xce\x9d\xc9\x62\x16\xb2\x43\xb3\xb6\x8a\xbf\x83\xf7\x75\xcb\xf8\xda\xa8\xa2\xf1\xea\x05\x9f\x21\xd4\x0c\x3f\xb6\xfa\xc4\x23\xcc\xe0\x08\x2b\x09\x3f\x92\xe6\xac\x33\xe9\x2d\xb2\x43\x7b\x22\x1a\xf1\x42\xf3\xbd\x90\x57\x21\x77\x5b\xc2\x05\xfc\xa1\xa9\x4c\x01\x4f\x01\xd7\xc8\x89\x09\xa9\xb7\x51\x2b\xd7\x3a\x5a\x6b\xce\xa4\xb7\xc8\x0e\xed\x08\x8d\x21\x81\x49\xe3\xb7\x50\x52\x85\x41\xf2\x32\xf7\x53\xc3\xc9\xc6\xe8\x64\xff\x8e\x5e\x53\x92\x67\xb7\x30\x65\xd1\x5f\x66\x9e\x99\x43\x03\x0d\xa2\xd3\x32\x56\x5e\xc2\x37\x75\x2b\x11\xfd\x30\x7a\x6c\x0a\xed\x36\x01\x0e\x02\x96\x24\x8f\x67\x6a\xa4\xce\x3c\x7a\x0c\x39\xc9\x4e\x7f\xf2\xa0\x6a\x13\x20\x0e\x9e\xb1\xb4\xb4\x1c\x7d\xc2\x1c\x4c\x1d\xad\xc3\x76\xf2\xdf\xbe\xd3\xbc\xd9\x23\x54\x98\xdd\x13\xd0\xea\xec\x34\x41\x7e\xd1\x24\x00\xb3\x12\xaa\x40\x02\xe0\xe0\x19\xeb\xa1\x29\x2e\xce\xf3\xdc\x60\x2f\xd4\x13\xd7\x62\xf1\xc0\x4d\x29\xe5\x21\xaf\x9c\x51\x8e\x57\x61\x34\xbc\xe9\x83\x39\x37\xd2\xb2\xa1\x53\xfa\x00\x0e\x9e\xb1\x58\x68\x38\x9e\xb6\x47\x84\xa1\xc6\x08\x31\x85\x94\x8c\xf2\xae\x76\x58\x98\x29\x34\x35\x1a\x4a\xfc\xba\x5f\x61\x45\xe1\xcd\x0b\xb5\x17\xc4\x05\x4a\xa3\xf8\xfd\x1d\x17\x65\x26\x90\x36\x0d\xe7\x6b\x16\xc1\x3e\xcd\x24\x41\xf4\x02\xdd\xa1\x8b\xff\xfc\x24\xab\x3a\x9d\x53\x63\x59\xe9\xf9\x87\x26\xd0\xb7\x7c\xd0\x3f\xf1\x34\xed\xa4\xa2\x4f\xce\xb1\x4d\x72\xf0\xd6\x8b\xbc\x24\xdd\x14\x95\xf2\x9d\xbd\x71\x73\xab\x32\x4a\x95\x46\x4f\x86\x5d\xfd\x2a\xad\x47\x18\xa2\xcd\x20\x0e\xae\x5d\x50\x4e\xe7\x4a\x3d\xad\x9c\xd8\x88\xfb\xe3\x86\xfb\x09\xa2\xa9\xae\x0a\xac\xdb\x9c\xaa\xca\xe7\x63\x2d\xfa\xad\xc5\xdd\x05\xa1\x1a\x91\x20\x0e\xae\x5d\x71\xb8\x6d\x54\x4b\x6c\xae\x44\x51\xe7\xb2\x0d\x46\x33\xd5\xe8\xc0\xf2\x6b\x9a\x4a\xbd\x89\x37\xd1\xca\xad\x7d\x33\x2d\xe1\xb4\xd0\xfa\x0e\x80\x83\x6b\x67\x7f\x53\x40\xc0\x07\x7d\xdf\x91\x81\xc6\x28\xc3\xa8\x6d\xf8\xa3\x11\x67\x86\xbc\x2c\x69\x14\xc7\x97\x5e\x47\x16\x7f\xf4\x36\xc8\x95\x80\x38\xb8\x76\x59\x79\x91\x3e\xfd\x36\xc3\xdd\x61\x7f\xf4\x46\x35\x58\x74\xc4\x0a\x36\x02\x83\x58\xb2\xa5\x55\x24\x7d\xc5\xcb\x5b\x13\x86\x92\x11\xda\x81\x5e\x67\xa7\x69\x57\x62\x38\x67\xf0\x41\x32\x48\x86\xbe\x73\xff\x83\x4d\xc8\x45\xb9\x86\x4b\xee\xca\xca\xa9\x42\x6b\xed\x16\xd3\xdc\x2f\xe2\x7a\x17\xa1\x9a\x8b\x00\x0e\xa9\x0e\xe7\xcb\x2a\xfa\x34\x4e\xce\xe6\x46\x75\x19\xa6\x8c\x02\xf5\x55\xa3\xac\xad\xca\xd8\x0f\x14\xbb\xf2\x53\x1c\x15\x7d\x29\xb5\xd0\xf9\x4f\x10\x07\xd7\xce\x64\x28\x5d\x94\x93\x50\xb1\xd6\xe7\x6a\x0f\xfb\x0f\x65\xfe\x02\xe9\x21\xef\x1c\x41\xaf\xe1\xc4\x70\xb3\x98\x26\xb9\x82\xd8\x13\x44\x5c\x10\x07\xd7\x8e\x5b\xbc\x0b\xa3\x41\xcd\x7b\x9b\x29\x92\xea\x95\xf2\x6d\x21\x9e\x81\xd1\x39\x92\x6c\x63\xba\xa4\xc7\xa1\x75\xc3\x73\x59\x4a\xd0\x8d\xd5\x20\x0e\xae\xdd\x7b\xe7\x3c\xf1\x8d\x4d\xb2\xab\xb4\x05\xfa\xa6\x6b\x97\xec\x53\xae\x48\x3d\x0b\xf6\xe3\x9f\x6e\x7b\x7a\x48\x4b\xbc\x9f\x73\x2d\x08\xda\x29\x07\xc8\x09\xa7\x69\xd7\x5a\x30\x97\xfa\xb8\x8b\x0d\x33\x51\x0e\x85\xf2\x24\x65\xf4\x99\xa6\xad\xc9\x57\xcb\x85\x34\x07\x2c\x37\x37\x83\xe0\x9b\xb3\x07\x88\x36\x83\x38\xb8\x76\xd1\x9b\xc1\x78\x16\x28\x52\xb9\x15\xcb\xf7\x7d\x3d\xa6\x8f\x19\xd5\x68\xb8\x12\xb9\x49\xc2\xef\xa9\xf5\xb1\x68\xda\x3c\xdd\x85\x6e\xfc\x00\x71\x70\xed\xd6\x2d\xb7\xd0\xde\xda\x25\x6d\x4c\x1e\xfe\x0a\x79\xbd\x38\x6d\xb2\x32\xf9\x4d\x7a\xe2\xba\xf8\x2c\x3f\xce\x9b\x67\xf4\x9d\x0f\xa0\xb5\x2e\x10\x07\xd7\x8e\x96\xed\xca\xe6\x97\x77\xab\x69\xc9\x09\xf6\x77\xc8\x1f\x7e\xb5\x5a\x09\xa7\x72\xe3\xfe\xfd\x40\x44\x2d\x41\xc2\xe9\x01\xeb\xeb\xef\x88\xb8\x20\x0e\xae\x9d\xfb\x5d\x76\x43\xcf\x9a\xd9\x80\x73\xa5\x59\xd5\x6f\xf6\x5c\x12\xd2\xcb\x42\x53\xaf\x68\xe5\x17\xe3\x19\xb3\xa1\xe2\xe0\xb3\xef\x42\xbb\x8b\x01\x89\xf5\x34\xed\xb8\x26\x9f\x19\x90\xa9\xb2\xec\xdd\xeb\x0b\x60\x9c\xd9\x72\x3c\xb9\xab\xef\x3d\xe8\xf7\x43\x5c\xe8\xe9\xf6\x9c\x78\xe4\xa8\x57\x13\xa2\xcd\x20\x0e\xae\x9d\x2b\x15\x31\xd7\x94\x07\xe9\xa6\x51\xc6\x67\x5f\xea\x3a\xd4\x0f\xe3\x92\x9a\x05\xa1\x7b\x94\xe5\x46\x9f\x93\xb5\x03\x66\xfc\xa0\x5d\x8e\x20\x0e\xae\x1d\xfd\x50\x85\xeb\xa0\xc9\x18\x76\x13\x0d\xdb\x82\x9e\xd1\xdc\x55\xc1\x9f\x12\x6b\xdb\xa9\xd1\xcb\x7b\xb3\x83\x33\xcd\x18\x12\x2e\x88\xb8\x20\x0e\xae\xdd\xa7\x5a\xdc\x51\xda\xa4\x8b\xbd\xf2\x21\xb8\xed\xba\xb1\xcd\x2e\xa3\xea\x6a\x9b\x65\x7f\xbe\xfe\x74\x96\xeb\xc4\x6e\xb8\xc6\x3e\x80\x88\x0b\xe2\xe0\xda\x99\x57\x60\xd9\x5e\x3d\xce\x89\x4d\x26\xe4\xe9\xfc\xfa\x63\xf8\x3a\x41\x7c\x83\x78\x82\x1b\x01\x5a\x2f\x51\xcc\x53\xca\x8d\xd6\x1e\x84\x43\x03\xcd\xee\x4f\x77\x68\x07\x76\x0d\x81\xcb\x77\x89\x1e\x10\x96\x50\xcb\x65\x97\xa0\xa3\xf4\x61\x1b\x27\xb8\x94\x95\x66\x64\xdb\xec\x3d\x12\x11\xf7\xc5\x40\xb8\x1d\x10\x87\xec\xd0\xca\x06\xfc\xa7\x9b\x42\xa6\x5b\x97\x8a\x8a\x23\xa3\xec\x0c\xc3\xa4\x09\x1c\xdd\xa8\x5e\x17\x65\x69\x3a\xe8\x0d\x1b\x8d\x1f\x42\x55\x22\x41\x1c\xb2\x43\x7b\x77\x39\x9f\x14\x7f\xc2\x12\xc3\x3e\x68\x40\x31\x1c\x6b\x32\x2d\x5a\xd6\xf0\x4f\xd6\xcf\x4c\xeb\xc0\x83\x8d\x2a\x05\xd7\x18\x2b\xe8\xa6\x35\x00\xf7\x1f\x87\xf6\xcf\x31\xf7\xaf\xef\x43\xeb\xed\xbe\xf1\xa8\x22\x40\x21\x0e\xe3\x3d\xae\x5f\x5b\xec\x81\xfe\xa8\x1b\xfb\xb8\x25\xeb\xb3\xf8\xc6\x95\x13\xfa\x98\xde\xf8\xc5\xbf\x1d\x5a\x36\x5d\xe0\x9e\xc1\x94\xcc\xf7\x09\x7b\xb4\x8b\x24\xfa\xd3\x3d\x14\x68\x72\x56\x4b\x5f\x32\x59\xa9\x26\xab\x0b\x36\xc6\xaf\x0d\xff\x85\x9a\x6e\x18\x79\x09\x8e\x64\x8d\xb7\x2b\xf6\x2d\x16\xed\x2e\xe9\x89\x6d\x2c\x72\x54\xb2\x3c\xff\xb9\xf4\xa5\xba\x6d\xcd\x89\x5e\xe0\xbf\xcd\xa1\x81\xba\xf6\xf7\x39\x34\x24\x87\xd6\xf7\x36\x85\x8b\x77\xa7\xfc\x79\xb3\x42\x72\x54\xab\x0a\x71\xb5\x9b\xa2\x0f\x8f\xef\x39\xb9\x8b\x2f\x38\xf6\xdf\x92\x95\x0d\xfb\x9c\xc9\xf2\x8e\x20\x92\x79\xc8\xce\xda\xaf\xe4\xd4\xba\xb9\x1e\x3f\x26\x87\x26\x41\x25\xd9\x7c\xc7\x22\x33\xab\x3d\xce\x2c\xc2\xe3\x93\x47\x1b\x56\xe2\xc3\xf1\x33\x59\xcc\x42\x76\x68\x52\x42\xfe\x6f\x2e\x04\x97\x68\x95\xd7\x14\xfc\x26\xd8\xd3\xd0\x3c\xd9\xf4\x57\x5b\xb7\x16\xc6\x5c\xb0\x77\xda\xef\xb4\xad\x57\x3a\x93\xde\x1a\x23\xfd\x6c\xb7\x6b\x46\xc1\x81\x3b\x85\xe1\xa2\x6b\x5a\x95\xd7\xb3\xbe\xc9\xbc\xf2\x8c\x2f\x4a\x52\x7b\x32\x29\xd3\xf1\xcb\xc1\x42\x03\x45\x67\xd2\x5b\x64\x87\x96\x25\x15\x19\x8b\xa1\x27\xa1\x11\x1d\xcb\x8c\xbf\x3a\x88\x95\x50\x23\x3f\x86\x93\xbe\x6b\x7c\x75\x8f\x83\xbf\xb0\xae\xa8\xc5\xe5\xcc\x1c\x1a\x68\x10\x9d\x96\xb1\x82\xdc\xda\x4d\x95\x28\x0d\x5d\xcc\x31\x30\x7a\x76\x46\xd7\x0d\xee\x99\x37\x39\xb6\x3d\xdd\xe1\x12\xc9\xaf\xf6\x6e\xc8\xb4\x80\xee\xbe\x02\x71\x48\x3b\xe5\x1c\xfd\x9e\x14\xe0\x24\x90\x2e\xbc\xd3\x64\x3b\xa2\x7c\x1e\x94\xeb\xd9\x32\xfc\x58\x6f\xce\x31\xe6\xd2\x28\x1e\x43\x57\x31\x21\xb4\x53\x0e\xc0\xc1\x33\x56\xdb\x8c\xd7\xdc\x2c\x79\x7f\xed\x8f\xd4\xa5\x9a\x80\xa7\x0a\x27\x9e\x9a\xcf\xb0\xaf\x26\x66\x7d\xf3\xbd\xba\xa1\xc6\xbc\xeb\xa4\x8f\x88\x0b\xe2\xe0\x99\x65\x71\xcf\xb2\xd5\xb4\x74\xcc\x59\xad\x99\xcf\xb8\xbb\x12\xdb\xeb\xbe\xc5\x01\x5b\x4e\xe3\xd6\x95\xd4\xef\xee\x31\x43\x0a\xe7\xdf\x40\x6b\x04\x00\x2e\x50\x1a\xed\x1f\xcf\x41\xbf\x3b\xe9\xfc\x8f\x9a\x77\x13\x81\xc4\x4d\xcb\x21\xb8\x0d\xb3\xaf\x30\x7c\x27\x76\x0d\x1a\x4c\x5b\xe8\x16\xaf\x51\x08\xf9\xc8\x22\x66\x1b\xa0\x7f\xe2\x69\xda\x05\x58\x61\x8a\x8d\xa4\x50\xff\xe9\x57\x9f\x59\x5c\x3a\xbc\xc9\x57\xbc\x1c\x8e\x9e\x7e\x5f\xfe\x2d\x41\x10\xa1\x18\x4b\xed\x0e\x74\xfb\x2a\x88\x83\x6b\xc7\x50\x7b\x39\x64\xf6\xcd\x47\x96\x92\x03\x8b\x23\x41\xe5\x72\x3e\xc6\xee\xd6\xcf\x1b\x7d\x2b\x03\xda\x31\xa4\x25\x1d\xed\x13\x50\xfd\x30\x10\x07\xd7\x6e\x2f\x4a\xc5\xfc\x24\x95\x49\xc6\xe1\xed\xfc\x68\x9d\xa3\xba\xd0\x93\xde\xb5\xeb\x66\x02\x1e\x6d\x7d\xe3\x3e\x4b\x8e\xaf\xc4\x1e\x42\x67\x8e\x00\x1c\x5c\x3b\x43\x7e\xcc\x66\x74\x46\x6d\x14\x03\xc7\x60\xd2\x2b\x77\xb3\x85\x1f\x7f\xbd\xf6\xee\x9b\x80\x1a\x09\xe1\x74\x9a\x9c\xdf\xcd\x2e\xe8\x5e\x26\x10\x07\xd7\x8e\x58\xa1\x26\xa9\xe6\x30\xdd\x41\x49\x61\x7b\xe2\x9e\xd4\x7e\x5d\x67\x83\x04\x66\x54\x9c\x8e\x04\x47\x95\xd0\x89\xd6\xeb\x2e\x26\x84\x76\xa0\xd7\xd9\x69\xda\xdd\x8e\xdf\x2b\x30\x29\xa9\xc6\xab\x9b\xc3\xa8\x24\x2d\xbf\x65\xbc\xf1\xb3\x9d\xd5\x57\xb1\x98\xe2\xb2\x19\xaf\x75\x77\xdf\x07\x3c\xa8\x42\x06\x80\x43\xba\xe5\x62\xcd\xf5\xc7\x12\x65\x43\xa8\xc9\xb2\x77\x49\x72\xe8\x3d\xfc\xe9\x4f\x43\x68\xca\xe9\x9f\x69\xf2\xfa\x37\xc7\xd0\x7f\xed\x42\xe7\xc5\x40\x1c\x5c\x3b\x5c\xbd\x05\xcf\xe8\xcb\x85\x3a\x9a\xdf\x59\x68\xf0\x83\xab\xd6\x7b\x36\x4c\x6d\x89\x49\xe9\xdb\xfd\xab\x5e\xad\x4c\x0a\xe4\x99\x21\xe2\x82\x38\xb8\x76\x15\xaf\xdc\x23\xe2\xf3\x69\x58\x96\xab\xf9\x55\x82\xba\x54\xc6\x42\xf1\xdc\x1e\x33\xcd\x93\xbd\x66\xeb\x72\x66\x1a\xf4\x26\x81\xd6\x08\x40\x1c\x5c\xbb\x45\xf6\x62\xff\x2c\x63\x42\x51\x8b\x42\x7f\xc5\xa0\x98\xc8\xa1\xc6\x36\xe1\x9e\x29\x1f\xac\x61\x71\x6b\x22\x85\xc6\x2e\xb1\x08\x84\x76\xa0\x9c\x70\x9a\x76\xd7\xae\xdd\xf2\x56\x0d\x0d\xbb\xc0\x96\x72\x59\x6f\x3c\xee\xcf\xf2\x7b\xc3\x2b\x1f\x48\x44\x8d\xc9\x0e\x8e\xce\xef\x31\x51\x60\x41\xf5\x00\x41\x1c\x5c\x3b\xfd\x1d\xd4\xeb\x81\xbf\x04\xb2\x3e\x1d\x88\xab\x0a\x53\x04\x67\x2c\xfa\xd7\xe2\xef\x50\xb7\xe6\xf9\x1f\x68\x9f\x77\xbd\xc0\x7b\x84\x88\x0b\xe2\xe0\xda\x91\x74\x0e\x4a\xe9\x9f\x33\x50\xce\x75\xa2\x60\x1c\xdc\xf4\xe4\xbe\x4a\x53\x3a\x36\xb0\xc6\x8f\x17\x55\x8e\x3d\xf9\x80\x7f\x02\x7a\x17\x83\x38\xb8\x76\xb7\x89\xbc\x0c\xbe\x73\xbc\x79\x9d\xd4\x3f\x2d\xd6\xb2\xe0\xec\xa1\xc3\x55\x90\xfd\xc8\xb3\x7b\x1d\xe3\x02\xbf\x77\xab\xf5\x25\xa8\xb2\x09\x88\x83\x6b\xa7\xe2\x40\x59\x72\x4e\xc5\xf2\xe7\xf8\x7b\xe1\x66\x17\xc9\x69\x6a\x53\x6b\x3a\xa9\x7d\x2c\x25\x82\x7d\x47\x86\x17\x21\x09\x39\x9e\x08\xed\x40\x89\xf5\x34\xed\xba\x3a\x4d\x5f\x6f\x8c\x7e\xee\x4b\x95\xcb\xe4\x7c\xcb\xb0\x8b\x33\x59\xf0\xeb\x5b\x6c\xe0\xcf\x8c\x18\x11\xb5\xca\x64\x5e\x8f\x36\xa8\xfe\x24\x80\x43\xaa\x14\x72\xd1\x5a\xab\x09\xf3\xb6\xf7\x4d\xdc\x22\x9d\x35\xd6\x2f\x68\xf2\x37\x46\x39\x67\x67\xb0\xcb\xa3\x37\xad\x1b\xa5\xed\x56\xa0\x2f\x7c\x20\x0e\xe9\x1e\xc2\x9c\x97\xc4\x97\x22\xcc\x03\x3e\x88\x6b\x67\xfc\xc8\x55\xde\xff\x32\xf5\x56\xc4\xdf\xb8\xac\xb2\xcf\x76\xad\x4f\xef\xfb\x08\x74\x9e\x1b\xc4\xc1\xb5\xdb\x68\xe6\x8b\x94\x11\xb1\xbd\xde\xb8\x4f\xc2\xe5\x77\x45\xed\xbc\x2b\x86\xbf\x67\x74\x50\xc0\x2d\xd4\xd4\x9b\xd8\x6f\x43\xdd\xa0\x7d\x07\x20\x0e\xae\x9d\x83\xae\x64\xbe\x84\xff\x23\x8e\x68\xbe\xd0\xbb\xf4\x72\xc7\x9a\x5d\x14\x3e\x66\x6a\xe5\x6e\x94\x94\xb2\x33\xb9\x97\x24\xe2\x89\x11\x0e\x0d\x34\xbb\x3f\xdd\xa1\x49\xd5\x96\x29\x37\xf8\x37\xd7\xb9\x0b\x84\xe0\x0b\x7a\x24\x24\x6c\x4f\x8a\x0d\x65\x5d\x52\xa2\x4a\x7c\xa9\xe8\xfd\x10\x6b\x1e\x0b\xe1\x76\x40\x1c\xb2\x43\x1b\x71\xe9\x8d\x25\x79\x2e\x76\xf1\x63\xb8\x24\x47\x73\x75\x3e\x67\x7a\x01\xa7\xb1\x57\xa9\xe3\xe8\x0f\xa1\xba\x5f\x5d\x13\x28\xef\x11\x91\x41\x1c\xb2\x43\x43\x57\x29\xdc\xad\x9d\x5c\x91\xd2\xa7\x67\xcc\x18\x52\xec\x92\xb3\xfa\xc0\x16\x9d\x43\x61\xf4\x6e\xf2\x33\x33\x7b\x93\x65\xbe\x1e\x22\x32\x88\xfb\x8f\x43\x43\x41\xfd\x47\xde\xfb\xb7\xf7\xa1\xa5\x84\x6d\x09\x16\x88\xfc\xb6\xfb\xc5\x50\x3f\x1f\xf2\x58\xfc\x7e\x87\x44\xce\x4e\x9c\x29\xe5\xd3\xc0\x4d\x93\xed\x3b\x0c\xab\x9a\x7f\x3b\xb4\x69\x8d\x76\x6b\xcc\xa6\x6e\x96\xc8\x2f\xcf\xc5\x34\x1c\xd9\x7c\x5f\xfa\xc7\xbc\xad\x9c\xb0\x1c\x42\xf7\x0d\x0d\xf5\xf9\xba\xc7\xfd\x17\xca\xfc\x09\xed\x5a\x6a\xcc\x66\x16\xd7\x30\x4f\x8a\x44\x2e\x85\xca\x26\xba\xd6\x9f\x16\xe9\x9c\x8b\x98\x69\x83\x49\x36\x2f\x3f\x2e\xfc\xb7\x39\x34\x50\xd7\xfe\x3e\x87\x86\xe4\xd0\xe4\xa5\x43\x02\x05\xf5\x1b\x99\x46\x62\x9f\x16\xa2\xc4\x6e\x3f\x27\xa1\x20\xb4\x3e\x6f\xc0\xe3\xc7\x77\xb2\xae\x90\xd9\xa7\xc5\x73\x26\xcb\x3b\xc8\x0e\x4d\xe7\x82\xfe\x62\x3f\xca\xfc\xee\xc4\x01\x89\xc8\xc1\xa5\x6c\x8f\xfa\xe8\x52\x3b\xc1\xb0\xdd\x0c\xc5\xa4\x6b\xc3\x01\x2d\xce\x67\x72\x63\xf5\x27\x64\x87\x36\x75\x35\x86\xb0\xda\x57\xed\xc7\xcd\x26\xa6\x82\xdb\x57\x18\x1f\xa3\x04\xa7\x61\x76\x06\x28\xfa\x45\xf2\x47\x37\x3a\xba\x49\x9a\x9c\x49\x6f\x91\x1d\xda\xb3\x37\x8a\xf8\xd5\x4d\x2c\xe7\xaa\x27\x2e\x6b\xe6\x62\xeb\xb3\xdb\x1c\xfc\xe9\xa7\x8e\xa9\x71\x61\xbd\xc6\x2a\xa2\x9a\xf2\xca\xef\x4c\x7a\x8b\xec\xd0\x9c\x1d\xd9\x32\x73\x1a\x0e\x79\xa3\x5e\x2d\xc4\x0a\xbc\x7b\x4e\x5b\x73\x91\xa3\x1b\xfb\x12\x81\xc5\x6b\x63\x1f\xee\x12\x3b\xac\xef\x67\xe6\xd0\x40\x83\xe8\xb4\x8c\x45\xeb\xbe\x50\x13\x74\xbb\xf1\x21\x93\x96\x9b\xa8\xc7\x49\x7c\xd1\x6b\x87\xd4\x62\x9c\x95\xef\x0d\x64\x79\xb8\x5b\xd8\x38\xe5\xaa\xd0\x77\x50\x00\x07\xcf\x58\x0d\xa6\x21\x44\x7a\xef\x7a\x4e\x94\xef\xf5\x69\x14\x6b\xa3\x65\x9e\xab\xd3\x7d\xa0\x68\x47\x4a\xb7\x8e\x99\x3c\x48\x41\x95\x7a\x19\x11\x17\xc4\xc1\x33\x96\x3b\x2b\xfe\x2e\xd1\xf9\x7d\xff\xc1\xa1\x32\x1f\xbe\x24\x61\x1a\x1c\x33\x8c\x88\xf8\x2f\x26\xd1\xab\x77\x9b\x44\xaa\x7c\x7b\xa0\xd9\x11\x88\x83\x67\xac\xf9\x17\x14\xf8\x8f\xf0\xee\x50\xb9\x10\x19\xb5\x30\x88\x45\xab\xad\x54\x66\xd6\x9b\xce\x8a\x96\x2b\x0a\x89\x10\x90\xc4\xf1\xdd\x82\xaa\x25\x03\xb8\x40\x69\xa9\x7f\x9e\x0b\xba\x22\x5f\xc4\x10\x59\xf5\x3e\x59\xf6\x55\xb9\x5d\x94\xa4\xf4\x91\xf1\x0c\xcb\x08\x6e\x19\x65\xd2\x5b\xdc\xc8\x72\xf6\x31\x68\x96\x0f\xfa\x27\x9e\xa6\xdd\xbd\x27\xe4\xd9\x63\x6c\xd8\x9b\xb7\xa3\x65\xa7\xf5\xdb\xf5\xea\xab\x4c\xef\x1e\x38\x86\xe3\xb7\xff\x88\xe1\x51\xb9\xfb\x12\x1f\xaa\xf2\x02\xe2\x90\xce\x32\x1d\x78\x1e\xb1\x0a\xd6\x49\x39\x2e\x87\x52\x05\x10\x95\x26\xd3\xda\xa0\x3d\x5f\x15\xbd\x41\xa8\xfa\xe3\x73\xaa\x33\xc1\x0c\xe4\xda\x41\x1c\xd2\x1a\xda\x5c\x17\xb7\x45\x5f\xbf\x28\x9d\x0c\x49\xe3\x57\x27\xdf\x07\x5a\xd2\xe5\xb7\x39\x97\x06\xae\x98\x36\x3c\x09\xc2\xed\xf1\x84\xaa\x58\x80\x38\xb8\x76\x5d\x3f\x55\x19\xa3\x1a\xa6\xcc\x9a\x4a\x4a\xb7\x1b\x83\x1f\x04\x9f\xa0\x3a\x26\x38\xe4\x65\x5f\x37\xff\xce\x30\xa1\xcf\x37\x45\x04\xcd\xba\x00\x1c\x5c\xbb\x0f\x3f\xf3\xb3\x8e\xbe\x7e\x7b\xa2\x37\x46\xe4\x1a\xac\xfc\xc3\xb3\x9b\x3d\x75\x8f\x59\xff\xf7\xde\xcd\xae\x09\x33\x5f\x21\x74\x1a\x84\x76\xa0\xd7\xd9\xa9\x37\x25\x5c\xeb\x7a\x64\x41\x75\x53\xc3\xa5\x36\x79\x34\x22\xcd\x31\x31\x74\x34\x00\x5b\x5d\xaf\x29\xf6\x3e\x8e\x6a\x89\xe4\xcb\x34\x68\x87\x2a\x88\x83\x6b\xf7\x7c\xe8\xa7\xf1\xf1\xf2\xbc\x3c\xeb\xbd\xba\xaf\xf9\xcc\xed\x01\xb1\xfb\x3d\x86\x72\x1e\xcb\x5e\x97\x54\x6f\x84\x9f\xb8\x63\x42\xb7\x67\x80\x38\xb8\x76\xf5\xdd\xf5\x12\x3e\xe2\xe6\xef\xcd\xa2\xc5\xd4\xd1\xd9\x43\x42\xe2\xc9\xcb\x30\xc2\x98\x64\x63\xa7\xd6\x5d\xca\x93\x98\x55\xa0\x19\x28\x88\x83\x6b\xf7\x5c\x22\x7f\xf4\x8e\x25\xb3\x06\x5f\xec\x1d\xa2\x61\xc7\x77\x92\x87\x3c\xdf\x32\x84\xfd\xe3\xfe\xe4\xe1\xf9\xde\x3a\xa9\xee\x81\x66\xf9\x20\x0e\xae\x5d\xaa\x95\xcd\xdd\xfc\xfa\x2f\xa3\x64\x1b\x33\xa6\x87\x28\xa9\x2f\x5c\x62\x3d\x56\x14\xd3\xab\xa7\x35\xa7\xc2\x98\xf9\x57\xbb\xa0\xbb\xec\x40\x39\xe1\x34\xed\x9a\x99\x06\x15\x49\xf4\xf5\x51\x3f\x11\x0d\xa0\xdf\x13\x3e\x57\x2e\x73\x0e\x77\x71\x72\xa4\xe2\x95\xc9\x14\xdd\x91\xba\x7e\x25\x74\x27\x23\x88\x83\x6b\xb7\x44\x4a\x74\xc2\xe6\x16\xb1\x9e\x2e\x68\xcd\xfe\x95\x32\x1f\xcd\x27\x43\xd5\x7e\xd1\xf0\x3a\xb7\xa7\x33\x75\xba\xb2\xa3\x3e\x54\x9b\x15\xc4\x21\xed\x72\x3c\x2a\xa6\x98\x74\x72\xe2\x70\x45\x15\x13\x90\x8b\xf7\xa2\xb9\x6f\x9f\x38\x51\x71\x44\xed\x8f\x57\x60\xeb\xe5\x39\xb3\xfb\x0c\xda\xe5\x08\xe0\xe0\xda\x71\x32\xee\x9e\xa7\xc9\x68\x5d\xed\x78\xbb\xc9\x34\x6e\x96\xba\xaa\xe9\x5e\xb9\x24\x1e\x75\x45\x45\xd7\x81\xd4\x36\xb9\x4d\xfe\x1d\x22\x2e\x88\x83\x6b\xe7\xa5\xc8\xb6\xe1\x11\xa9\xca\x98\xac\xab\xa0\xac\x32\x5a\x64\x78\xd8\x8d\x1b\xaf\x8b\x9a\x5d\x11\x10\xd8\xfc\x6e\x70\xf5\x50\x0d\xa1\x1d\x28\xb1\x9e\xa6\x9d\xb4\xda\x97\x1b\x5d\xef\x28\x3e\xf7\xa0\x4c\x1e\xa2\xf6\x18\x13\x77\x2d\x2f\xbb\x4a\x79\xaf\x13\x87\x1c\x8e\x55\xd1\x88\x6b\x29\x21\xda\x0c\xe2\xe0\xda\x8d\x56\x1c\x74\xdc\x99\x92\xb3\xfe\x9c\x64\xe5\x2a\xfa\x86\x3a\x8c\xd1\x64\xdb\x63\x8e\xe6\xd8\xfb\xe1\xc8\xac\x97\xa6\x90\x22\xb4\xb7\x03\xc4\xc1\xb5\x2b\x33\xf6\xed\xfc\x86\x6b\x7d\xbf\x4e\xce\x96\x65\xb4\x0a\xc3\xd9\x2d\x34\x6f\xde\xca\xc8\x87\x81\x17\xa7\x38\xb3\x84\x68\x0a\xba\x95\x03\xc4\xc1\xb5\xdb\xe4\x2f\x5e\xdc\x54\xe9\xba\x84\x4d\x36\x66\x36\x73\x5f\x0d\xf3\x2d\xb3\xe7\x91\xa1\x14\x4b\xd7\xd1\xb1\x14\xd9\x46\x67\x32\x74\xf7\x1e\x88\x83\x6b\x77\x63\xac\xfd\x5c\x96\x23\xf5\x24\x29\x95\x6f\xcf\x8f\xe1\xce\xd5\xb0\x36\x09\x1e\xb2\x56\xb7\x37\xc1\x2e\xe6\xf8\xcd\x7c\xf2\xd0\x8d\xd5\xa0\xd9\xfd\xe9\x0e\x4d\xd7\x5f\xc3\xea\xe9\x41\xa4\x3c\x36\x01\x7f\x50\xe4\x95\x90\x75\x2a\xa3\xeb\xbc\xd9\x09\x6e\x47\xdd\x43\x3a\x42\x4e\x7e\xac\x8a\x08\xb7\x03\xe2\x4e\x39\x87\x96\x74\x81\x1a\x35\x2a\x88\xa9\xec\xbc\x77\x35\x2d\xa5\x6a\xb4\x39\xf3\xfb\xf3\x9b\x29\xd4\x71\xcf\x6a\x35\xf1\xdb\xdf\xf8\x1f\x43\xe7\xd0\x00\x1c\xb2\x43\x4b\x8c\x0a\x0c\xa2\x42\xfd\x49\x24\xc5\xa8\xfb\x2d\xf7\xe6\x34\x63\x5c\xe6\xd2\x93\x1e\x37\x97\x8e\x3b\x92\x0a\x5b\xb2\xaf\xf6\xbd\x11\x91\x41\xdc\xff\x38\xb4\x7f\xec\x28\xfd\xd7\xf7\xa1\x69\x5c\xe6\x0e\xce\x79\xc7\xab\x8e\x51\x33\x25\xd2\x83\xd9\xa7\xbe\xee\x98\xe3\x93\xd6\x88\x8f\xf6\xd3\x3f\xdc\x32\x2c\xcc\x6f\xea\x6f\x87\x76\x4e\x49\xf3\x55\x1b\x95\x1f\xfb\x6f\x9b\xdc\x3e\x74\xd7\xa0\xcf\xfe\xd5\x0d\x82\x7f\x52\x9d\xab\xfc\xa6\x38\x84\xc3\x9f\xe8\x05\xfc\x85\xe2\x2f\x5f\xde\xee\x5b\xae\x33\x65\x0c\x7f\xf7\xd2\x40\xf9\x4d\x75\x23\xd6\x44\x4b\x6e\x2f\x6b\xa7\x53\x88\x52\xdc\x8b\xf7\x65\x7e\xff\x6d\x0e\x0d\xd4\xb5\xbf\xcf\xa1\x29\xc1\x67\xf1\x9b\x8c\xdf\x3a\xa4\xa4\x5b\xd0\x0e\x2c\xb2\x9a\xed\x58\xc5\xcf\xd9\x2d\x91\xd3\xb1\xf4\x55\x8e\x69\x70\x99\x58\x92\x2f\x1d\x04\x9f\xc9\xf2\x0e\xb2\x43\xe3\x5a\x94\xb4\xf3\xbf\xe4\x42\x76\x45\xf2\x67\xd7\xfc\x45\xf6\xc1\x48\xcf\x79\x6c\xc3\xc1\x74\xdf\x8b\x68\xea\x93\x74\x01\xa8\x67\xb2\xb9\x12\x45\x03\xe9\x67\x59\x44\xe7\xb2\x35\x35\x58\xb7\xb3\x8d\x96\xec\x2b\x43\x02\x09\xe4\xb3\xe7\xf4\x6d\x48\x92\x95\x2a\xaf\x7a\x24\xcb\x79\xcb\xca\x9c\x49\x6f\x91\x1d\xda\x75\x59\x49\xa5\x78\x51\x2a\x8f\x9b\x01\x0d\xb4\xb7\xcd\xbe\xaf\xfc\xd9\x7d\x1c\x31\xc7\x47\xf0\x69\x5f\x88\xd3\x25\xa7\x59\x3d\xef\x4c\x7a\xeb\x8d\xf4\xb3\x37\xa5\xeb\xec\x71\x0e\x23\x76\x5c\xd1\xcc\xa5\xe7\x2c\x30\x6c\x68\x22\xe6\x3d\x7e\x8e\xc6\x04\x78\x31\x7e\x32\xc1\xe7\x52\x3c\xbb\x1b\xab\x41\x83\xe8\xb4\x8c\x15\x16\xda\x43\x11\x1e\x30\xce\x4a\x29\x9b\xba\xcd\xf4\xe9\x3a\x1d\xf1\xa1\x68\x70\xcc\xa1\xc9\x42\x73\xa1\xbf\xdc\x8b\xa0\x2e\x6f\xe8\xa4\x3e\x80\x83\x67\x2c\x2e\x0d\x8a\xfd\xcc\xf3\x1e\xa3\xd9\x3d\xb6\x37\x07\xeb\x4b\x1f\xeb\x91\x0c\xdc\xba\x98\xd4\xd3\xad\x1b\xcb\x57\x10\x6c\x61\x18\x03\xed\x26\x01\x70\xf0\x8c\xf5\xb5\x65\x25\xfa\x48\x68\x62\x8b\x84\x66\xe3\xd6\xfc\xe1\x1c\xee\x36\x6e\xa8\x82\x78\x67\x41\x0a\x45\xfc\xce\x0b\xa9\xd0\x89\xd7\x88\xb8\x20\x0e\x9e\xb1\x1e\x17\x86\x39\x7c\xa1\x29\x1a\xaf\xa0\x3c\xc6\xb7\x9f\xc0\xe7\x14\xf1\xb4\x5b\xa8\xb3\x16\xa1\x44\x93\x94\x20\x9a\xb5\x17\x84\x6e\x1d\x00\x71\xf0\xf6\xa2\x62\xb6\x32\x5b\xce\x08\xa3\xce\xbc\xfd\xb6\xb9\x59\xfb\xde\x16\xfd\x21\xcb\xb0\xd2\xce\x9b\x7c\xcc\xc1\x4a\x2c\x8c\x35\xd2\x8f\x50\xc5\x02\xc0\x3f\xf1\x34\xed\x44\x46\xc3\x17\x4a\x7b\x62\xd0\x03\xb3\x96\xbf\x11\x74\xca\x9e\xc3\x42\x23\xb8\xa1\x23\xcc\x50\xa2\x41\xe3\x8b\xc6\x32\x6b\x0a\xed\x50\x05\x71\x70\xed\x54\x55\xa8\x71\x6b\x78\x37\xfc\x78\x16\x7a\xcd\xf7\x46\x43\x12\xaa\x22\xfd\xba\x85\x15\x52\x08\x4a\xe3\xf3\x9c\xf4\x2e\xbe\x87\x4e\xa7\x83\x38\xf8\xb3\xd0\xc7\x71\x8d\x46\x9b\xf9\x21\x52\x8d\x83\x5b\x68\x75\x32\x6c\x65\x33\xae\xe9\xe7\x88\xcb\x55\x8e\xa3\x34\x6c\xf6\x8a\xfb\x0f\xf4\xfd\x1a\xc4\xc1\xb5\x6b\x08\x2b\x44\x63\x46\x7f\xff\xf2\x73\x29\x2d\x9e\x77\x96\x79\xef\xa7\x7d\x21\x22\xc7\xf3\xf1\xe1\x24\xa5\x3f\x85\x39\x84\x51\x52\xa1\xaf\x01\x00\x0e\xe9\xee\x3d\xe6\x0c\xd1\xfa\x19\x9d\x47\xcf\x8f\x45\xcd\x07\xe2\xe9\x69\x75\xc5\xd1\xcf\x1f\xf4\x76\x5c\x79\xec\xe6\x10\xbe\xcd\xfb\x38\x0a\xa1\x1d\xe8\x75\x76\x9a\x76\x0b\xfb\x11\xd9\x5c\xd7\x8c\xf5\xee\xd7\xdc\x56\xd5\x0e\xba\xf3\xaa\xab\xd5\x3b\x66\xb6\xe1\x2a\x43\xfb\xcf\x1c\x27\x6b\xe2\x32\xa8\x6e\x1f\x88\x83\x6b\x97\x80\x9f\x58\xf3\xcb\xcd\xe5\x47\xa6\x85\xd5\x45\xa1\x00\x7c\xf1\x30\x85\x52\xc9\x45\x7b\x7f\xb4\xa2\x9c\x8c\x7d\x51\xd9\x3f\xd0\xfd\x62\x20\x0e\xa9\x0e\x27\x89\x13\x17\x1e\xe3\x44\x8f\x74\xf3\x62\x26\x8e\x65\x9e\xdf\xe8\xb1\xbd\x16\x49\xcc\x9a\x18\x73\xdd\xfd\x8a\x6e\xe5\x07\xd0\x6e\x44\x10\x07\xd7\xae\x54\xda\xff\x66\xdf\x27\x1a\xc6\x0d\x1d\xe9\x93\xd0\x7a\xd4\xf2\x18\xb9\x04\x19\x53\x22\xd7\x44\xbc\xce\xd1\xa1\x55\x3b\x51\xa8\x1e\x20\x88\x83\xb7\x97\x50\xe6\x91\x6c\xb8\x6d\xb2\xc0\x67\x39\xf7\xb8\x67\xc5\x8c\x4a\x3b\x51\x4c\xe4\xa4\xa5\xc3\x6e\x83\x34\xe5\x6a\x11\x79\x7e\xda\x08\xed\x40\x39\xe1\x34\xed\x48\x34\x8c\xc3\x54\x5d\x3e\xf1\x15\x92\xaf\x7c\xb3\x7c\x22\x5b\xf7\xbb\xa6\xb7\xbb\xe4\x7c\xfd\xca\x7d\x42\x6e\xa6\x8f\x57\x49\xa1\x7a\x80\x20\x0e\xae\x5d\xe4\x9f\x50\x09\x5e\x12\xe5\x1f\xf8\x44\x64\x9a\x43\xae\x8f\x63\xc6\x77\xe6\x2d\x2e\xf9\xfa\xff\xe2\x70\x94\x62\xcc\x49\xe6\x82\x66\xe3\x20\x0e\xfe\x2c\x52\x23\xb1\x8e\xe8\x33\x2c\x04\xd7\x3e\xab\x4b\xfd\x1e\xf6\x4f\x17\xa1\xf5\xc6\xc4\x33\x90\xda\x33\x68\x4e\x96\x37\x74\x72\x20\x81\xce\x26\x02\x38\xb8\x76\xe8\x89\x7b\xc9\x07\xa9\x63\xc4\x1e\x7d\x3a\xaf\x9a\x94\x5e\x61\xae\xad\xaa\x88\x04\xbc\x4c\x4c\x72\x35\x3f\x46\x93\x3e\x1f\x3b\x85\x88\x0b\xe2\xe0\xed\xcd\xc5\x78\xcc\xac\xe8\x41\xab\x9b\x6a\x4c\xb5\xa9\x51\x4e\xe4\x18\x60\xcb\x11\xe2\xf3\xeb\x15\x81\xe0\x9b\x2e\xed\xfa\x83\xbe\x7a\x84\x76\xa0\xc4\x7a\xea\xbe\x03\x3a\x1c\x2a\x5e\xa7\x05\x9f\x27\xbd\x05\x11\x4e\x07\xec\x26\x77\xab\x4a\xfa\x39\x51\x51\x1c\x0a\x26\xb7\x1f\xda\xe5\x0f\x58\x42\xfb\x0e\x00\x1c\x5c\x3b\x13\xc5\xeb\x0c\xeb\x49\x8e\x4b\xf8\xb8\x89\x1f\x53\xb0\xd6\x47\x5e\x7f\xf1\xb2\xc3\x29\x64\x2a\xcd\x4e\xc2\x7f\xf7\x5c\x35\x35\x04\xda\x05\x0c\xe0\xe0\xcf\x22\x25\xde\x3e\xb2\xa6\x28\x23\xd8\x21\x42\xde\x84\xac\x3f\x6c\x65\xfa\x83\x92\x6a\xc4\xee\x15\xb9\x8e\x2a\x3c\x92\x14\x25\xb2\x3e\x44\x5c\x10\x07\xd7\x6e\xff\xcd\xb2\xc5\x30\xbe\xce\xf4\x96\x92\x47\xd4\x73\x6b\x8b\x07\xf5\x0d\xd6\xd1\xa4\x5a\xe9\x99\x33\xe8\x53\xa4\xc5\x71\x2e\x50\x0d\x55\x10\x07\x6f\xef\x48\xb6\x14\x85\xde\xdd\x51\x9c\x4b\x7d\xc1\x4f\x2e\x86\x3d\x79\x7a\x21\x55\xae\xfe\x1c\xa7\xd0\x97\x77\x5b\xde\xb7\xf1\x98\xad\x4e\x10\x0e\x0d\x34\xbb\x3f\xdd\xa1\xf5\x77\x13\x3c\x71\x98\x63\x7b\xc6\xf4\x5d\x42\xda\xb2\x81\x7d\x67\xbf\x4d\xa6\xd2\x46\xbd\x3b\x60\xba\x4f\x85\x80\x14\xd3\x6a\x08\xe1\x76\x40\xdc\x29\x0e\x2d\xc1\x42\x6c\xf0\x60\x7b\x9c\xdc\x20\x22\xfc\xf7\xe0\x47\x75\xa6\x4d\x9b\x0c\xae\x86\xb6\xcd\x0f\xda\x4b\x28\x87\xf6\x95\x78\x90\x43\x03\x70\xc8\x0e\x8d\x79\xdb\xfd\x75\x34\x75\xdc\x9e\x84\x2c\xd1\x9c\x08\x4d\xa8\xe0\x41\x1f\x4b\x80\x4a\x61\x94\x94\x9a\x0e\xf3\xb3\xed\x21\xdf\x06\x44\x64\x10\xf7\x3f\x0e\xed\x1f\x77\xda\xfd\xeb\xfb\xd0\xd0\xbc\x3f\xa8\x14\x1d\xe1\x65\xa7\xe5\xfa\xbf\xa8\x7f\x73\x83\x34\xe8\xd1\x89\xeb\xa2\x81\xe3\x7a\xef\xbd\xfb\x6e\xda\x2b\xb8\x52\xff\xd8\xe5\x18\xf5\x95\x56\x48\x64\x4f\xa2\xe8\x98\x36\x64\xf0\x09\xc7\xf0\x4e\x9b\x91\x83\xc0\x6e\x98\x0a\x71\xfb\xfe\xa4\x88\x70\x25\xf1\x5f\xa8\x9e\x7c\x52\xee\x6a\x4b\xcf\x65\x27\x1f\xb1\x64\x85\x1e\x1f\xbb\x01\x5f\x12\x62\x2f\x51\x27\x4d\x8b\x94\x72\xaa\x1f\xea\x37\xe6\xff\xdb\x1c\x1a\xa8\x6b\x7f\x9f\x43\x43\x72\x68\x1f\xce\x0b\xb5\xf8\xb3\xce\xe9\x44\xe0\x6a\xd2\xae\xc6\x98\x8d\x6b\x5e\xe6\x89\x7c\x59\x84\xaa\x32\x81\x4a\xe4\x9e\xdb\x3e\x78\x36\x37\x84\x21\x3b\x34\xd1\x22\x7d\xe6\xb5\xfc\xed\x5f\x2a\x53\xfe\x9f\xde\xce\x39\x33\xb3\xf7\x16\x35\xf6\x9a\x5d\x71\x0a\xce\x35\x30\x33\x14\xe8\x72\x3f\x93\xc5\x2c\x64\x87\x86\xbf\xfe\x44\x91\x59\xe2\xdd\x25\xb1\x16\xd7\xd6\xe3\xee\x0a\xc5\x31\xbc\xcf\xce\x03\x0e\x2f\x13\x5f\x17\x57\xe9\xb3\xf4\x5b\x9e\x3f\x93\xde\x22\x3b\xb4\x55\x2a\xf5\x07\xc1\x1c\x9b\x6b\x5b\xd5\xcc\xda\x92\xb3\x8b\xa2\xa3\x61\xc5\xf9\xc4\xe1\x8c\xd9\xbc\x18\x77\xd9\x54\x7e\x4b\x89\x9e\x49\x6f\x91\x1d\xda\x44\x35\x96\xd2\xb1\x31\x43\xb1\x70\xe0\xd5\x91\x86\x74\xfb\x22\x72\x45\x8b\x7d\x83\x8d\xa1\x9e\x27\xe1\x2f\x0b\x2a\x4f\x3a\x18\xcf\xcc\xa1\x81\x06\xd1\x69\x19\xcb\xbb\xa0\xcd\xf7\xe0\x7e\x48\xcd\x27\xe7\x86\xfb\x6d\xab\xc5\x8d\xb7\x38\xc4\x94\x56\x57\x86\xdf\xba\x65\x2c\x5a\x47\x9b\x35\x49\x43\x35\x0c\x01\x1c\x3c\x63\xf1\x91\x89\x51\x0d\x1f\xb8\x26\x0b\x4d\xe4\x64\x38\xd8\x32\x69\x75\xfd\x58\xb5\x12\xe8\x3b\xf1\x3c\xe6\x4f\xfa\x50\xd4\x70\xe8\x88\x88\x0b\xe2\xe0\x19\x60\xcc\x79\x2d\x23\x83\xd4\xa9\x42\xa4\x5b\x51\x60\x9f\xf6\x51\x23\x7b\x71\xda\x43\xdd\xb1\xb0\x75\x11\x67\xd2\x1b\x3e\xf9\x04\xd0\x77\x5b\x10\x17\x28\xfd\xcf\x53\xb7\x9b\x7a\xcb\xe4\x32\xfd\x4d\x32\xda\x05\x9e\x19\x57\xbc\x7e\x07\x26\x99\x19\xad\x0d\xc8\x98\x63\x96\xea\xe0\x63\x96\xcb\xb6\x41\x77\xfb\x80\x38\xf8\xf3\x7d\x66\x44\xdc\x7b\x43\xa6\xe4\x71\xf1\xd1\xd3\x7b\x76\x56\x5e\x17\x3d\x2c\x49\x26\x0e\xbe\x28\xf7\xaf\x59\x2d\x94\x87\xf6\xd2\x47\xf9\xc9\xfd\x3b\x2e\x50\x1a\x05\xd5\xcf\xff\xc9\xff\xbc\x3a\xa4\x51\x50\x91\x06\x82\xe1\xbf\xfb\x43\x9f\x36\x04\x16\xbd\x58\x85\xa5\xd4\x73\xa6\x9e\x85\x8d\xbe\xf7\xe4\x1f\x14\x56\x55\x51\x13\xf7\x0a\xe0\x27\x33\xd3\x73\xeb\x54\xa2\xb5\x81\x36\x1f\x82\x38\xf8\x10\x58\xd9\x40\x31\x3f\xee\xe0\x71\xc5\xbd\x20\x8d\xf1\xc7\x5c\x2b\x7e\x6d\x49\x7d\x44\xa7\x71\xc0\xc4\xaf\x5a\x47\x7e\x70\xbf\xc5\x13\x11\x17\xc4\xc1\x87\x40\x69\xf3\xac\xc7\x86\x3e\x96\x30\xf9\x2b\x1a\x9c\xa3\x94\x0b\x3b\xaa\x7f\xe2\x0e\x2d\xf8\xdf\x70\xcb\x3c\x71\x70\x0d\x21\xa7\x87\x8c\x29\x88\x83\x0f\x01\x2a\x54\xa9\x6a\xaa\x6d\x27\x2b\x6f\x93\x7c\x36\xb2\xab\x3c\x5d\x9c\x12\xd7\x05\x5c\x22\x0f\x70\x65\x9a\x9f\x9c\x38\x06\xc7\x43\x05\xa8\x41\x1c\xfc\xf9\xbe\x09\x88\xa7\xa3\x55\x6c\x9a\xc3\x47\x4b\xca\xe6\xf6\xb5\xf4\x53\xbc\x5f\xcb\x35\xcf\xef\x1c\xec\x3d\x22\x29\xa4\x35\xca\xd8\xe9\x27\xff\xef\xb8\xff\x33\x04\xfe\xff\xf7\xf8\xff\x32\x06\x40\x6f\xd7\xd3\xc6\x80\x36\xdd\xcf\x96\xd4\x8d\x3b\xe1\xb5\x1b\x96\x74\xd7\x1d\xb0\xdb\x66\xae\xcd\x85\x3b\xec\xf2\xd3\xfa\xf8\x4c\x64\x8d\x9f\xaf\x80\x96\x59\x40\x1c\x52\xe1\x92\x80\xcf\xd4\x29\x32\x0a\xaf\x75\x3e\x8c\x6f\xd4\x46\xbe\xd9\x13\xb8\x2e\xd7\x8a\x9a\xc8\x2f\xec\x41\x45\xf8\xfa\x5b\x38\xba\x0d\x64\x0e\x00\x1c\x7c\x0c\x78\xb2\x70\x96\x7c\x8b\xfa\xf5\x70\xb0\xd3\x9d\x4a\x73\x2b\xf6\xa5\xf1\x7d\x36\xc1\xc7\xa5\x44\x3b\x8f\x98\xcc\x19\x03\xef\xec\x8d\x22\xe2\x82\x38\xf8\x18\xe0\x9c\x64\x6e\xb0\x9e\x26\x4f\x4c\x12\x55\x14\xde\xf8\xc1\x18\xc0\x4f\xed\xf2\x70\x75\x7f\x4b\x7f\xf1\xd1\xdd\x25\x4c\x15\x59\x67\x68\x59\x08\xc0\xc1\x9f\xaf\x6e\xd5\x5c\x64\x8b\x78\x9f\x3f\x73\xfa\xbc\x4c\x22\x4b\xf1\x77\xc1\xb1\xac\xa5\xe7\x65\x34\x6d\x6f\xd2\x0e\x3f\x8b\xd6\x47\x45\x22\xc6\x00\x88\x43\x8c\x81\xff\x49\xaa\xff\xcb\x18\x00\xa5\xba\xd3\xc6\x80\xd5\x3d\x9d\x34\xa2\x8e\xbc\xf4\x71\xed\x27\x9a\x77\xa5\x09\xfc\x7a\x6e\xc5\x76\x98\xfe\x6c\xac\x09\x40\xa3\xd3\xc5\xfd\xa5\x4f\x0e\x1d\x61\x04\x70\xf0\x31\x80\x86\x7a\xc3\x3c\xd0\x52\xa6\x82\xa1\xa8\xf3\xa0\x5b\xde\x86\xed\x26\xfd\xeb\x37\x82\x3b\x06\x1f\xcb\xf7\xe6\xd9\xab\x98\xaf\x43\x1f\x01\x41\x1c\x7c\x0c\x3c\x16\x11\x60\x50\xfe\xf8\x5a\xdf\x9d\x70\x69\x26\xf0\x3e\x51\x09\x4f\x93\x59\xe9\x1f\x9d\x3a\x9e\xd0\xaf\x33\x81\xe7\x82\x14\xa0\x65\x5d\x10\x07\x1f\x03\xb2\x84\x47\xcc\xcf\x96\x38\x4d\x1f\x66\x18\xf0\xe8\x19\xba\x6d\xce\xa2\x1d\xfb\x95\x70\xe1\x95\x0d\x09\xf5\xe8\x0b\xb0\x69\xf4\x20\xe2\x82\x38\xf8\xf3\xfd\x42\xa5\xfb\x3e\xfd\xf5\xe7\xfe\xa0\x5c\xba\x07\xf2\xa3\x16\xe4\xce\xfb\x64\x9c\xe7\x84\x6e\x73\xef\xf2\x36\x29\xb7\xbc\x1d\xb7\x46\x8c\x01\x10\x07\xbd\x07\x8c\xff\xf7\x31\x00\x9a\x77\x9c\x5a\xda\xf9\x47\xdc\x4c\x83\x17\xf3\xa3\x8b\xb8\x1e\x76\xa8\xb2\x41\xda\xee\xe4\x04\x35\x39\xaf\x69\x5b\x3e\xdc\x31\x61\x6a\xde\x20\x87\x36\xce\x83\x38\xf8\x18\x08\x17\x48\x61\x5a\xdc\xd9\xc6\xc9\x34\x37\xa4\x53\xf7\x16\x89\xfa\xed\x6b\xd4\x5d\x76\x9d\xdc\x28\xc9\xee\x33\x07\x97\x9a\xc7\x26\x22\x2e\x88\x83\x8f\x01\xec\x58\xf6\x52\xf5\x2f\xd4\x54\x0f\x5e\x66\x47\x86\xb0\x5e\xee\xc2\xed\x5c\x22\x2c\xd3\x35\x0e\xd7\x34\xc3\x28\x75\x14\xe4\x85\x3e\xf0\x80\x38\xf8\x18\x88\x76\x55\x5a\xc7\xf8\x98\xfa\x03\x4f\x8f\x9f\xf2\xa9\xb4\x46\x25\xc1\x3b\xe6\xf6\xe4\xa3\x45\xcf\x5b\xf6\x93\xb1\xfe\x0d\x1d\x50\x89\x59\x10\x87\x34\x06\xa6\xfa\x6c\x15\x7b\xa4\x75\x5b\x68\x56\x6a\xd6\xd3\x09\x7f\x1f\x7c\xbb\x2d\xab\x7b\xd1\x9f\x2c\xee\x43\xaf\x61\xda\x7c\x52\x2c\x34\x06\x00\x1c\xf4\x1e\xf0\xfe\xbf\x8c\x01\xe3\x7f\x67\xa2\x4e\x37\xc2\xd2\x32\xd7\xc2\x5d\xf3\x18\x72\x7f\xeb\xea\x7d\x4e\xee\x64\x5d\x1a\xb1\x24\xa8\x0e\xf0\x96\x0b\xc5\xae\x20\xa1\x21\x16\xbd\x7d\x1e\x61\x2a\x41\x1c\xb2\x11\x4e\x8c\x7d\x72\x30\xfe\xcb\xdb\x56\x5d\x4f\xe6\x8f\xe0\x2c\x89\x12\xef\x03\xbc\xbe\xd2\x36\xa5\x43\xdf\x00\xab\x7e\x66\xc2\xdb\x5f\xa0\x05\x45\x00\x17\x28\x83\x82\xfa\xcf\xc8\x9b\x92\x71\x6b\x06\x45\x78\x84\x11\x57\xb4\x69\xcb\x24\xc9\x0e\x8d\x26\x51\x58\xff\x38\xdf\x73\xd1\xe3\xa6\x3b\xa0\xf5\x90\x17\x44\x44\x06\x71\x81\x32\x28\xe7\x50\xfe\xdf\x4a\x66\x72\xfe\x9f\x8f\x93\xd6\xcf\xaf\x93\x75\x60\x4c\x8d\x44\x91\x94\x17\x2f\x6b\x7f\x66\x4c\x57\x31\x9c\x5a\x64\x1a\x12\x11\xfe\x5a\x25\xf2\x40\x8d\x2b\x10\x05\x25\xf0\x06\x8a\x9f\x9f\xef\xff\x8f\xbf\xe4\x7e\x5c\x98\x37\x46\x17\x46\x4c\x5f\xa7\x4c\xd3\xa2\x56\x13\x77\x6d\x48\x5a\x99\x69\x04\xcf\x20\xbe\xe5\x3c\x57\x69\xe7\xc5\xbf\x57\x2b\x41\xa1\xff\x1f\xd0\xff\x2f\x00\x00\xff\xff\x0e\x13\x79\x53\x49\x5a\x21\x00") +var _fixtures_assetsCarButterflynetCar = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\xfd\x79\x38\x55\x7d\xdf\xc0\xfd\xef\x6d\x2f\x43\xc8\x3c\x7d\x85\x94\x8c\x25\x73\xe6\x21\xf3\x4c\x32\xcf\xf3\x3c\x0f\x95\xa1\x58\x28\x4a\xc6\x88\x4c\x99\x4a\x44\xca\x3c\x94\xc8\x58\x99\x45\x94\xcc\x92\x24\x21\x73\xf8\x1d\xfb\xba\x9e\xfb\x77\xb7\xf7\xfd\xac\xe3\x3c\x9f\xeb\x38\xae\x3f\x72\xac\xf3\x65\xaf\xb5\xd7\xf0\x59\x7b\xed\xde\xc9\x14\x38\xf9\xfb\xf8\x04\x06\xc0\x63\x7c\xa6\xdc\x28\xb4\x5f\xde\x3c\x01\xfb\xe3\x85\x49\xa8\x8e\x80\xb6\xed\xa2\x83\x37\xb5\x94\x4f\xf9\x55\x66\xed\xde\xce\xdd\xe7\xdb\x4e\xe5\x93\x43\x7a\x5b\x12\x97\x07\x5d\xae\x38\xf9\x07\xb8\xf9\x78\xa3\x5f\x10\xfc\xbb\xff\x20\x49\x11\x85\x82\x4d\xd9\xc5\x13\x9c\xe4\x1d\x6b\x83\x6c\x52\x73\xac\xba\xac\x89\x2d\x5c\xd6\x5a\x55\x75\x4b\x25\x3f\x2b\x28\xf8\xbd\xbf\x75\x43\xe6\x62\x4f\x24\x4a\x01\x8e\x44\x99\xb2\xa3\xfe\xe1\x7f\x11\xd8\x17\xcb\x89\x42\xfb\xd1\xb0\x53\x5d\x8f\x64\xe1\x9c\x20\x16\x63\x27\xd0\x98\x4a\x7d\xd2\xfc\x32\x3b\x41\x3d\x5d\x79\xc7\x5d\xfb\x49\x72\x2e\xbc\x96\xd3\xeb\xaf\x80\xfa\x6b\xbd\xa4\x99\x05\x5f\x6a\x1d\xd7\xd6\x5f\x6c\x5f\x62\xf5\x7f\xf2\x5e\x31\x19\x36\x51\xc3\x94\x27\xd1\xb2\xa4\x72\xeb\x29\x0b\xde\xaa\xff\x6b\xd1\x05\xa7\x38\x59\xa6\x5e\xa2\x99\xcf\x49\xf4\xd5\xcf\x7f\x18\xb5\x72\x14\xe8\x58\xcc\x7c\x3f\x33\x26\x29\xd1\x51\x2f\x19\xaa\x27\xf0\xd7\xa2\x19\x82\xe1\xcf\x9e\x7e\x61\xbf\x4b\x7b\xaa\x59\x9b\xad\x5b\xaf\x29\xed\xdc\x98\xa2\xf6\x99\xcf\xc7\xcd\xef\x77\x63\x04\x2a\xfb\xa8\xb6\x98\xed\x0e\x1e\x88\x6e\xa1\x54\x50\x84\x9b\x33\xa8\x4e\x82\x7f\xf3\xb2\x1f\xb9\x2a\xdb\x05\x3a\x05\xba\x79\x39\x05\x08\x0b\x0a\x89\xf3\x0b\x8a\xf1\x0b\x8a\xb1\x0b\x0a\x49\x09\x8b\x4b\x89\x09\xb9\xe8\x3a\x05\x5e\xf5\xf1\xf7\x70\x55\x75\xf3\x74\x72\xf0\x71\xf3\x76\x32\xf4\xf1\x70\xf2\xfe\xff\xff\xd1\xf3\x3f\x7f\xbc\xe8\xe5\x13\xe4\x1d\x18\x50\xe8\x61\xe8\x13\x68\xe7\x79\x39\xc8\xd7\xd7\x33\xd8\x4b\xf8\x9c\xa0\xa0\xe0\xff\xfc\xdf\x59\xc7\xcd\xdb\xc9\x3f\xc0\x4b\xe8\x9c\xe8\xff\xfe\xd0\x53\xdf\xdf\x27\xd0\xc7\xc1\xc7\x53\xdb\xce\x3e\xa0\xd0\x43\xd9\xe9\x8a\x93\xa7\x8f\xaf\x97\x93\x77\xa0\x87\xc8\xff\x2e\xe5\xa1\x1a\xe4\xed\xe8\x6f\xe7\x16\xe0\xe6\xed\xe2\x21\xfc\xbf\x3f\x77\x57\xf5\x09\xf2\x76\xb4\x0b\x74\xf3\xf1\xf6\x10\xfa\xdf\x1f\xbb\xe8\x38\x05\x04\xd8\xb9\x38\x5d\x53\x37\x74\x75\x0b\x60\x77\x0b\x60\x0f\x74\x75\x62\x57\x73\xf2\x76\x0a\x70\x0b\x60\x57\xf4\xf4\x71\xf0\x60\xf7\x71\xfe\xcf\x0f\xff\x67\x25\xd8\x95\x9d\x1c\x9c\xbc\x03\xfd\xed\x3c\xdd\x42\x9c\x1c\xd9\x2f\x07\xfa\xf8\xdb\xb9\x38\xb1\xff\x3f\xab\x7e\xfe\xc6\xbf\x7b\x4b\xa3\xa0\xbf\xde\xa9\x8e\x9e\xbb\xf1\xbf\x1d\x34\xd2\x7b\x2d\xee\x2e\xff\xb8\x54\x35\xc2\x90\x35\xca\xab\x2c\x72\x40\xf4\xb2\xab\xf9\xeb\x54\xe1\x68\xd3\x5f\x8b\xaa\x3c\xef\x7f\xc3\xde\xf7\xc3\x22\x8c\xc5\xbe\xfd\x03\x90\x95\x98\x5f\x2e\x4a\x88\xa5\xf7\xcf\x5e\xb4\xc9\x26\x7d\x3e\xdf\xda\xf2\x82\xf2\xdf\x91\x91\xca\x5b\x3a\x64\xdc\xc9\x70\xa4\x12\xea\x3b\x71\xf4\x18\x9f\x09\x0a\x6d\x84\xa2\x71\x76\xf3\x14\xb8\x20\x10\xf0\xdf\x55\xf2\xc2\xbe\x09\x7f\xfd\xea\x18\xe2\x32\x86\x81\x52\x3a\xf5\xb5\x8e\x04\xd7\x92\xf1\xd3\xc2\x7d\x0f\x69\xde\x74\x7b\x36\x6b\x39\xce\xee\xcd\xb8\x6c\xeb\x14\xa2\x34\x51\x64\x14\x45\x3f\x45\x73\x2f\xd2\xb7\x44\x46\x2a\xa2\xdc\xa2\xc7\xf8\x0c\xb0\xec\xf1\xff\xb2\x76\x0e\x0e\xd8\x37\xfe\x2f\x91\x90\x28\x4a\x6f\x80\x6f\x8e\x31\xfd\x43\x0d\xe9\xc5\x3b\xba\x20\xc1\xd0\xf4\xf8\x97\xb9\x0b\xed\xfa\xbf\xc2\xf6\x1e\xd8\x08\x8b\xa0\xb4\x50\xc3\x75\xc7\x79\x27\x1b\x08\x9a\xbf\x2b\x44\x2a\xa1\x56\xfe\xe5\x2b\x1d\x71\x09\xa5\xff\xc0\xd1\x29\x15\x65\xbf\x9d\x20\x2c\x2d\x39\xcc\x4b\xef\x76\x43\xa8\x65\xf6\xaa\xba\x4f\x9b\xf2\xc2\x9c\x71\xfb\xdf\xaf\x14\x8e\x54\x44\x99\xff\xe3\x2b\xd5\x1d\x7d\xbb\x6f\xa0\xcb\x5d\x7c\x7f\x8e\x80\x94\x38\x2f\x2f\x7e\x43\xc6\x70\x23\x7c\x99\x83\xc9\x71\xed\xcd\xd4\x6e\xff\x95\xbb\x28\x1d\x14\xc1\x5c\xf8\x17\x16\x81\x47\x63\x72\x28\x14\x0a\x8b\x3a\xfd\x23\x2a\xc9\xa6\xfa\xf5\xa3\xc2\x8e\x32\xab\xd5\x12\xa1\x66\x26\xa9\xd6\xcc\xe7\xe3\x14\x3b\x9b\xdf\x8c\xad\x96\xce\x8b\xe8\xd6\x5d\x5e\xc0\x59\x7d\x2c\x49\x14\x3d\xc6\x67\x7a\x02\x6b\x32\xfc\xd7\xbc\xe2\xe4\xef\xe6\xec\xe6\xe4\xe8\xef\xe4\xe2\x16\x10\xe8\x1f\xfc\x17\xee\x57\x91\x4a\x36\xad\x9d\x4f\x67\xd4\xc1\xe0\xf7\xd6\xcb\x65\x7b\x93\xdb\xce\xbf\x5d\x97\xd9\xf9\xeb\x48\xf2\x3d\x4d\x9a\x0d\x1a\x94\x02\xf6\x3d\x82\xfe\xdf\x37\xa8\xaf\xcf\x55\x9c\x0d\x0a\x5d\xa3\xb9\x1c\x6e\x59\x92\xdf\x74\x4b\xee\xc9\x45\xbd\x5f\x85\xe5\xe8\x6e\x09\xb3\xbb\xc7\x25\x76\x19\xc3\x74\x96\xfe\x0c\x0e\xa2\x14\x22\x15\x51\xee\xff\xb8\xc2\x5a\x2d\xdf\x23\x99\x19\xad\x16\x37\x4f\xa0\x2d\xb4\xca\xaa\x6f\x11\xf8\x2f\x6c\xfb\xbd\xa0\xff\xed\x17\xf9\x71\x53\x8f\x86\x76\x0c\xa5\x10\x15\xa9\x88\xc2\x44\x8f\xf1\xe9\x61\x1d\xd2\xff\x3a\x0e\xfe\x3e\xde\x7f\x21\x4e\x83\x9f\x3e\x3a\xa6\xf4\x8c\x0c\x50\x81\xeb\x6f\x3c\x46\xf6\x89\x5b\xfa\x6f\xf6\x4c\x54\xac\x53\x45\xb7\x7c\x08\x3d\x60\x34\xfb\xcf\x6b\x71\xf8\xc7\xd7\x32\xa5\x12\xd8\x59\x95\xdf\xe0\xde\xfd\xf2\x79\x6a\x75\x7a\xd8\x3d\xde\xf8\x6b\x9e\x03\xab\x7b\x95\x43\x8b\x45\x1f\x4f\x5c\xcd\x20\xfd\x0f\xe3\xf2\x8f\x0c\x93\xc6\xc6\xe6\x99\x84\x4f\xb6\xb3\x2b\x3a\x19\xc7\xc4\x58\x8e\x32\xbf\xb8\xd2\x6a\x07\xa1\x64\x3f\x77\xcc\x6a\x72\x0c\x4f\x7a\xe0\xbd\x87\x4a\xa8\x6f\xff\x72\x1f\xbe\x53\x9e\xf6\xed\xc7\x6b\xff\xf4\xf9\xc6\xa3\xa0\xf2\x99\xe6\x34\x5f\xb2\x3b\x50\xc7\x48\xd6\xee\x3d\xd3\x26\xc8\x92\xf2\x7a\x07\xfe\x3e\x8c\x8a\x1e\xe3\xbb\x84\x65\xc9\xff\x1f\x36\x38\x20\xd0\xc9\xeb\xff\xc3\x99\xe3\xbf\x3b\x04\x21\x76\x17\x63\xc2\x3a\xb4\xb8\x2f\xcf\xce\xdf\xc3\xe9\xef\x15\x8f\x9b\xdc\xa5\x6f\x30\x9c\xaa\xd4\x72\x9c\xd3\x53\xe1\xe1\x7a\xf2\x40\x35\x97\x57\x9c\x35\xa7\xab\x4d\xd2\x34\xc6\x2f\x32\x27\xe2\x3f\xdb\x4f\x3f\x7a\x8c\xef\x32\x16\xa3\xf8\x2f\xe6\x15\xe4\x19\xe8\x16\xe0\xe6\xf2\x97\x23\xe2\xce\xa6\x92\x56\xaf\x68\xb3\x0a\x3f\xe7\x98\x7b\xb0\xc8\x74\x62\x70\x5e\x35\x5c\x53\xd1\x7a\x5d\xb1\xa6\x89\x6a\x34\xf3\xe8\xbf\x2f\x0b\x8d\xb7\x4f\xb8\x79\xbb\xfd\xfd\x62\xc4\x2d\x99\xdf\x93\x4d\xdf\xfc\xde\xb6\x67\x2b\x2f\xdf\x71\xa9\xce\xde\xa8\x39\x95\x95\xf4\x69\xb3\x64\x82\x9c\xb3\x27\xe9\x9d\x4f\x28\xec\xd9\x63\xf9\x5f\x6e\xf9\x1a\x62\xa2\x47\x3f\x47\xbf\xdb\xfb\xd6\x7d\x4a\xf0\x7e\xc8\xc3\xd1\xd6\x66\xcc\x41\x10\x6a\xfd\x0e\x33\xd7\xfd\xa0\x31\x27\x46\x11\x77\xcb\x2b\xa1\x7e\xfc\x4b\xd7\xb1\xe5\xf8\xfe\xe1\x2f\xf7\xd7\xc6\x5e\x52\xe2\x2a\x09\xde\xe6\x36\x03\xe5\x1e\xef\x1f\x96\x74\xe8\x7e\x9a\x1d\xce\x39\x1a\x27\xc4\x7f\x47\x1d\xff\x71\xe7\x7b\xa1\x58\xd8\xa0\xe2\xf7\xbe\x6b\xa1\x72\x97\x7b\x5f\xaa\x3b\x3c\x92\xf1\xc4\x35\xa2\xea\x4b\x06\xd2\xe3\xc2\x17\x0e\x9b\x0e\xc2\xfe\xcf\x09\xc4\xf5\x1f\x49\xee\x25\x1a\x51\xc6\x92\xd2\x64\xfb\x83\x3b\x8c\xf6\x02\xd9\x85\x1c\xe4\xc4\xd7\x17\x5c\xeb\x1d\x08\x1f\x72\x12\x33\x9e\x5f\x93\xff\x3f\xe4\xa5\x7f\x24\x0f\x7d\xde\xe5\xfe\x30\x21\x02\x4b\xe1\x55\x53\xb7\x9b\x6b\x36\x15\x88\x0e\x50\x43\x01\xa1\xf7\x37\xec\x92\xf3\x56\xeb\x6d\x8c\x50\xff\x71\x9c\xff\xd1\x91\x12\x16\x23\x64\x53\x31\xf2\xfc\x7e\xff\x7c\x6f\x15\x7f\x3f\xb7\x3d\xc7\x51\x52\xf6\xb7\xc1\x46\xa3\x80\x94\x4d\xd6\x40\x9d\x10\xdc\xab\x45\xa4\x22\x8a\x00\xef\x90\xf0\x77\xba\x6a\xe7\xef\xf8\x97\x78\xe6\x79\xa5\xaa\x5d\x86\x61\xf0\xca\xf0\x23\x53\x92\xea\x48\x66\xd2\xcb\xb4\xdb\xeb\x91\xd5\x37\x8b\x74\x37\x03\xc4\xd9\xee\x2c\xa1\x74\x50\x98\xf8\xaf\x94\x61\x19\xf1\x94\x3d\x28\x14\x2a\x52\x09\xb5\xf4\x2f\xdf\xeb\xec\x95\xc7\xdc\x27\x52\xae\x75\x37\x70\x32\x3f\xbc\xc8\xf3\x85\xc6\x7b\xe5\xab\xa4\x7f\x73\x88\xa1\xcc\x85\x8d\xae\x39\x40\x46\xf6\xf7\x7b\xcd\xf3\xff\xae\xfd\xdf\x9f\xcc\x12\xfc\xbb\x0b\x71\xe2\xdf\xbb\xc8\x39\x37\xc7\x1b\x34\xa6\x0e\xef\x5b\x64\x1b\xac\xd3\xcb\xa7\x2f\xeb\xff\xf4\x3b\x72\x30\xe8\xfb\x51\x23\x7e\x85\x92\xe8\xb9\x8f\x82\xc2\x5f\x0b\x33\x30\x85\xd8\x84\x75\x5d\xdc\x19\xb9\x56\x73\x67\x3b\xe1\x7a\xce\x85\xdb\x67\x23\xbd\x7b\x62\xf4\x3f\x98\x67\x7d\x3c\x98\xf0\x14\x52\x50\x42\xa1\xa7\xff\x3e\xf9\x1d\xba\xf7\xd8\x15\x16\x7a\x90\x8b\xcb\x68\x4a\x25\x3c\xd6\x82\xcf\xae\xbf\xcb\x32\x88\xd0\x4f\xca\xbe\xf6\x81\xc4\xe8\x0e\xf9\x5f\x8b\x9a\x39\x79\xad\xc6\xb4\x0a\x7c\x1b\x0f\x1b\x59\xd7\xd1\x31\xa4\x9f\x8a\xee\x18\x31\xb0\x26\xf4\x54\x95\xfc\x2e\x45\x5e\x62\xa9\xff\xf7\x89\x2a\x55\x7f\xec\x77\xae\xca\x4e\xad\xec\x6a\xdc\xc7\x7c\xd9\x4e\xe6\x18\x0d\xe2\xb1\xcf\x4f\x59\x27\x2c\x9e\x18\xa5\x64\x1c\x71\xfd\xb5\xe8\x5e\xcf\xfc\x53\x56\x17\x5d\x25\xde\x59\x14\xf1\x66\x2a\x23\xc9\xdd\xe8\xc6\x57\x3d\xc1\x3d\xfd\x12\x87\x5e\x43\xac\x15\xa2\x9f\x25\x09\x57\x99\xc0\x5f\xcb\x5b\xea\x7a\x8a\xe7\x62\x32\xf4\xef\xe9\x0d\x71\xaa\xee\xc9\x58\x5a\x36\xd6\xde\x43\xff\xa1\x9b\xd8\xfe\x96\x26\x9a\x59\x52\xf0\x5a\x61\xd3\xee\xdf\x6d\xb6\x38\x45\x94\xb3\x22\xca\x39\x62\xcb\x94\x0b\x75\x86\x04\x4d\xc3\x5e\x71\xd6\xa8\xb5\x27\x82\xad\xe0\xae\xcb\xb3\xb4\xc8\x28\xa7\xf6\x85\xc5\x93\xec\xe8\xee\xaf\x97\xfd\xfb\xba\x8a\x0d\x3c\x1d\xe3\x23\x88\x99\xb1\xb7\x0f\x04\xec\x5b\x3c\xff\x6e\x5b\xc3\x11\xbc\xff\x6e\x23\x47\x2a\x44\xd8\xfd\xbb\x6d\x1c\x4d\x44\x80\x8e\x52\x47\xa1\xfe\x7b\x1f\xf3\xf7\x8d\x15\x47\x79\xbe\xf4\x33\xf9\xca\xb2\x8f\xd5\x34\x21\x1e\x4a\x91\x4b\xb6\x98\x0c\xa9\x80\x91\x2e\x46\xbf\xe0\x25\x42\xcb\x59\x01\xca\x08\xab\x7f\xb7\x1c\x56\x8f\xf8\x3f\xfa\xf9\x2f\xcf\x51\x13\x6e\xd5\x6e\x2e\x2f\x7e\xb9\x6f\x1e\x19\x2e\x9d\x2d\xc2\x3c\xd6\xf3\xcc\xac\x11\x74\x14\x6e\x52\xde\x6d\x58\x8b\x10\xfb\x77\xcb\x61\x75\x14\x0a\xfd\x9f\x1b\x2d\x45\x28\x8c\xf7\xdf\xed\x2e\x8a\x50\x58\x03\xe1\xbf\xdb\x5d\xa2\x09\xd1\x00\x3d\x1d\xa5\x7c\x14\x8e\x42\xfd\x7d\x10\xd9\x59\x6d\x58\xd7\x9c\x14\x5d\xb4\x1f\xcb\x91\x3f\xcd\xc4\x1c\x4f\xdc\x3a\x40\xe6\x70\x8a\x5d\xa7\xd0\x60\x99\xb1\xca\xef\xe4\xdc\x5f\x8b\x56\x7e\x4e\x43\x75\xbc\x95\xa2\xb6\xf3\xfe\xf8\xac\xce\x8c\x86\x31\xd8\x2e\xf8\xf5\xd7\x22\xb9\xac\xc1\x0b\x7b\xde\x26\x0b\x8e\xd6\x7f\x2d\x3a\xc6\x7b\xde\x67\x54\xfa\xa2\x0f\x11\xb5\xe2\x86\xee\xd9\x12\x7a\xed\xcc\xa4\xb0\xdc\xa5\xe0\x85\xed\x62\x7b\x83\xdb\x5b\x8e\x0e\x7f\x9f\x95\x5d\x15\x32\x4e\xb3\x58\x0a\x36\xc9\x5f\xfa\xa3\xbc\x75\xa2\x3b\xcf\x9d\x00\xf3\xf8\x64\xd8\x0d\x9b\xa5\xe7\xe7\x8a\x25\x98\x3d\xfe\x5a\xb4\x4e\xe6\x58\xe1\x93\x21\x72\xf5\x68\xf2\x8b\xc4\x91\xa1\xbb\xb4\x64\x27\xcf\x8e\x97\xd5\x0d\xd8\x93\x27\x87\x77\xce\xd7\x74\xca\xff\xb5\xa8\x6c\xdc\xc1\x81\xe5\x05\xd3\xf2\xcd\x06\xcb\x56\xc2\xca\x26\x85\xdd\xf7\x2c\xdb\x43\xa4\xd1\x3d\x43\x19\x09\x49\xd5\x37\xc6\xff\x3e\x26\x21\x4a\x32\x03\xe5\xbb\x26\x3c\xd3\xbe\x71\x13\xf6\x6b\x7f\xae\x8b\x87\x09\xd7\x0b\xfa\xd1\x1e\xf8\x34\x2b\x2d\xaf\xd0\x5d\x3f\xf7\xf7\x6d\x82\x62\x66\xc4\xf2\x5d\x29\xc0\xff\xd1\xea\x53\x57\xc3\x19\xdf\x0f\x5c\x5d\x5c\x84\x32\xed\xa1\x4f\xee\x07\x9d\xbe\xf5\x61\x54\xe2\xaf\x45\x9d\x35\x3f\xb2\xb7\xb7\xdc\x29\x0e\x77\x16\x65\x4c\xb5\x39\xd7\x8b\x69\x83\xd5\xe6\xdf\x6b\xb3\x05\x0f\xb0\x16\x32\xbe\x57\x73\xfa\x7b\x1f\x4a\x7e\xf3\x56\xc7\x9e\x4f\x45\x8e\xb8\x6d\xb9\xb8\x63\xe0\xd8\x73\x57\x79\x22\xd1\x29\x51\x85\xa9\x1a\x0f\xd3\x26\x8d\xaa\xd3\x7f\x2d\x5a\xe8\xdd\xe1\x76\xba\xe1\x0e\x4a\xfa\x44\xe4\x50\xb7\xac\x5f\xfc\x38\xb7\xb0\x49\xe2\x8a\x99\xe0\xdd\xdf\x77\x2e\xbb\x4b\xe4\xfe\xfd\x5a\x5b\xd2\x0f\x4c\xda\x56\xd5\x4e\xf2\x9c\xd1\x49\x5a\xff\x39\xc3\x5c\x83\xe6\x0f\x5b\xe0\x24\x93\xd5\xa9\xac\x9e\x3e\xaa\x73\xca\xf9\x7b\x5e\x54\x66\xfc\xa0\xc6\x5b\xf5\xed\xf3\x8d\x81\x5b\xef\xe5\x32\x9d\x03\xf6\x6c\xf7\x16\x47\xf3\x67\x38\x3b\x92\x46\x7b\x59\x19\x19\xfe\x5a\x94\x4c\x8c\x83\xe5\xfa\x2b\x6a\x47\x8a\xd7\xef\x5c\x9a\x37\x7e\x54\xa5\x0c\xb7\x76\x55\x56\xb0\x89\x05\xb7\x4f\xf9\xa7\xb2\xd1\x0f\xfe\xad\x02\xf2\x6b\x5c\x1d\x87\xda\xce\x37\xea\x0c\xfd\x4d\x8f\xce\x0e\x44\x56\x98\x43\x87\x75\x75\x84\x59\x97\x3f\xc8\x0a\x08\x2a\x45\xa4\xd3\xfe\xbb\x5d\x30\x4a\xf9\xe8\xe8\xe8\x28\x22\x83\x3d\x1e\x45\x3c\xc6\x67\xca\x8b\x42\x47\xce\x62\xe0\x6f\x04\xec\x16\x13\x9e\x33\xbf\xc9\xd3\xf9\x04\x38\xeb\x9c\xed\xd8\xaa\x9d\x18\xbb\xa3\x08\xe8\xd4\xc6\x04\x63\x99\x9e\xb6\xb8\xe9\x5e\xf4\x86\x01\xa6\x05\xc5\x8c\x62\x2c\xe9\x57\x50\x47\x11\x6c\x4a\x4e\xa3\x50\x28\x45\x14\x5a\x41\x01\xa5\x10\x8f\xc6\xa5\x8e\x2b\xaf\x5a\xff\x1e\x69\xce\x8f\x55\x08\xb6\xa8\xa4\xd6\x0b\xe4\xae\xd9\xce\xa2\x20\x6a\xf2\xe8\x6b\x57\x2e\x62\x0a\x56\xd5\x86\x01\xa6\x15\x89\x22\xc0\xa5\x4c\x52\x5d\x63\xd7\x49\x13\x76\x8e\x3d\x26\x51\x59\x70\x88\x4e\xca\xbb\x7b\x98\xd3\x2d\x1f\x25\xcf\x40\x10\x3c\x6c\x73\xf9\x2b\x27\x0c\x30\x6f\x90\x28\x0c\x2e\x75\x9b\xcc\x3f\x4c\xe5\xc9\x9c\x5d\x09\xc3\x19\x1e\xc3\x02\x7e\x8f\xe0\x3b\x85\x29\xeb\x6f\x63\x29\x04\xd7\xd9\x5d\xfd\x86\x1e\x6a\xc1\x00\xd3\x86\x44\x41\xb8\x14\x29\xcd\xba\xc7\xa1\x3d\xc7\x71\xa7\x33\x4b\x0f\x64\xcb\xca\x69\x09\xf4\x88\x9e\x98\x27\x9e\x35\xec\x5d\x27\xe1\xe2\xc6\xdc\xb6\x86\x01\xa6\x1d\x89\x22\xc4\xdb\x56\xa7\xb7\xa5\x8c\x43\xfd\xe3\x87\x8f\x7a\xaf\x3f\x2c\x28\x3a\x8a\xb5\x39\xf8\x52\x11\x11\x33\x31\x90\xa4\xc9\xb1\xff\xda\xdd\x19\x06\x98\x0e\x24\x8a\x08\x97\x52\xfc\xfc\xbb\xac\x58\x7b\xde\xda\x7a\xeb\x98\xdb\xc7\xd8\x16\xa2\xf4\xc0\x00\x79\xef\xc4\xd6\x9b\xcd\xbf\xc6\xaf\x7d\x96\x6a\xf1\x85\x01\xa6\x13\x89\x22\xc6\xa5\xd8\x30\x3e\xfa\xdf\x22\xf5\x1e\x73\x33\xbf\xbd\x54\x77\xd9\x7e\x4d\xff\xfa\xc3\x84\x09\x67\x09\x92\xaa\x7b\x3a\x71\x71\x4b\x3a\x8c\x30\xc0\x74\x21\x51\x24\xb8\xd4\xc8\x59\xd7\x3e\x77\xc3\xdb\xfb\x7c\x09\x31\x3b\x95\xdc\xc9\xb2\xd4\x36\x79\x4c\xef\x16\x7a\xee\x94\xcd\x26\x4e\x88\x6e\x5a\xd1\xc3\x00\xd3\x8d\x44\x1d\xc3\xa5\x4e\x48\x84\x6a\x7d\x1f\x3a\x75\x52\xff\x1a\xc5\x2f\xfd\x5a\xab\x3b\x5f\x27\x94\x6d\xe6\x8b\x03\x7f\x9a\xb0\x17\xb6\x3d\xe4\xde\xe0\x81\x01\xe6\x2d\x12\x45\x8a\x4b\x5d\xf3\x63\xd3\x09\x91\x9f\x29\x79\x9d\xeb\x74\x7f\xda\x8b\xdc\x2d\xe3\xb9\x9a\x8d\x74\xf6\x21\xf1\xdb\x07\xe6\xe7\x52\x83\xde\xd3\xc1\x00\xf3\x0e\x89\x22\xc3\xa5\x3e\x18\x7d\x15\x78\xbc\x2d\x3b\x7e\xaa\xf9\xc1\x42\xb1\x4f\xc3\xb9\x7c\x5a\x96\x62\x47\xdb\x19\xd2\x7c\x36\xbe\x07\xe1\x9b\x18\x55\x18\x60\xde\x23\x51\xe4\xb8\x54\xcb\xab\xbc\xd7\x0b\xb3\x51\xbf\x7a\xc3\x2f\x5a\xb2\xdd\x0d\xbb\x33\xe7\x35\x74\x4b\x4b\xa0\x83\xb4\x57\x9d\x32\xf7\x6e\xfb\x21\x0d\x0c\x30\x3d\x48\xd4\x71\x5c\x6a\xe2\xa5\x4b\xe7\x77\x5b\x3a\x55\xc3\x1f\x84\xf9\xdd\xd7\x9a\x31\xdc\xea\xf9\x25\x7c\x8c\xfb\x74\xd0\x57\x0f\xfd\x96\xbc\x90\xf3\x30\xc0\xf4\x22\x51\x14\xb8\x54\x63\xc5\x8a\x02\x6f\x4d\x84\x8f\x5c\x37\x8a\x5c\x8e\x88\x99\xf9\xcb\x85\x1d\xcc\x70\xac\xfd\x19\xdf\x45\xe6\xea\xf5\xbb\x66\x0a\x30\xc0\xf4\x21\x51\x94\xb8\x14\xcb\x5e\xef\x7a\xa4\x14\x81\xf4\x9b\x97\x6a\x32\xf9\x79\xd9\x95\x39\xc1\xa3\x3d\x1c\x7b\xba\x75\x47\xf7\xb7\x26\xbf\x1c\x39\xab\xc1\x00\xd3\x8f\x44\x51\xe1\x52\xbf\x94\xa8\x6a\x7c\x5a\x3f\x95\xb4\x36\xc5\x85\x1c\x90\xfc\x0a\xda\x89\x3f\x54\x96\x3c\x23\xbf\x14\x2a\xeb\x47\xc1\x20\xb5\xe8\x00\x03\xcc\x00\x12\x45\x8d\x4b\x79\x87\x79\xd7\xdd\x7f\x15\x39\x23\xfc\x48\xeb\xde\xb7\x10\x77\xc2\xae\x03\xc7\xb4\xe5\x57\x39\x2e\x57\x7e\xdd\x95\x13\x3f\x95\xca\x04\x03\xcc\x20\x12\x45\x83\x4b\xb9\xc9\x7d\x71\x23\x48\x0b\x56\xde\xf8\xfa\x72\x5a\xa1\xbe\xec\x5d\x5d\x4b\x7b\xce\xd5\xeb\xbc\xa8\x9c\x79\x5f\xd9\x7e\xf5\xcf\xa7\x61\x80\x19\x42\xa2\x68\x71\xa9\x28\xfd\x99\xfa\xe1\x5e\x36\x8a\x65\x8f\x7c\x55\xba\xee\x5b\x97\x19\x64\x92\xab\xde\x30\xc8\xb7\x69\xd7\x3c\xab\x27\x3b\xa5\x87\xdd\xec\xc3\x48\x14\x1d\x2e\xd5\xa1\x92\x56\x72\xbe\xc6\xf1\xbc\x46\xc2\x7c\x5b\x89\x88\xfd\xcb\xc0\x2f\x64\xb7\x15\x4e\x9d\xff\x6d\xe1\x4c\xa9\x48\x71\x6b\x17\x7b\x92\xf9\x80\x44\xd1\xe3\x9d\xfa\x0e\x44\x76\xbd\x2c\xff\x84\xb0\x97\xc8\x3c\xdc\xe3\xaa\x1d\x8e\x61\xe3\x8f\xb4\xe9\xdd\x0f\xba\x21\x70\xad\xc6\xdd\xca\xd8\x0e\x06\x98\x11\x24\x8a\x01\xef\x8a\xb3\x69\x9d\x2a\xf3\x72\x19\x7d\xe3\xf7\xa6\xff\xca\x60\xf0\x43\x77\xfe\x6f\x0a\xf7\x6e\xd3\xd8\xd8\xf9\x30\x2b\x08\x73\x7e\xb5\x80\x01\x66\x14\x89\x62\xc4\xa5\xf4\xf2\xdb\xae\x2f\x54\xf1\xae\x2a\x1e\x92\x66\x4f\x65\x34\xaa\x17\xcd\xf8\x42\xa1\x61\x5f\x13\x14\xef\x8f\xed\x9c\xbb\xb6\x83\x7d\x07\x3f\x22\x51\x4c\x4c\xb8\xd6\x99\xa6\x27\x3b\xef\xfb\x8d\xce\x76\xd6\xf1\x50\xbf\xb9\xb7\x37\x31\xd6\x9f\x55\x24\xab\xb9\xf1\x6e\x62\x77\x3c\xa1\x4d\xaf\x02\xbb\x86\x63\x88\x16\xc0\xb5\x32\x29\xf5\x57\x50\xc4\x3e\xf3\xc1\x77\xd8\xfa\xc8\xc9\x01\xe1\xcb\xf8\x07\x97\x5d\xa9\x5e\xfd\x49\x4b\xab\xb3\x39\x9f\xc2\xa2\x0f\x03\xcc\x38\xa2\xc5\x8c\x6b\x71\x3c\x80\xdc\x97\x76\x1a\xd9\x88\xc7\x59\x39\xcb\x68\xb8\x27\x5f\x6e\x7f\x58\xde\x26\x92\x48\x76\x79\xa7\x4a\xfc\xa0\xb1\x4d\x1e\x06\x98\x4f\x88\xd6\x09\x5c\x2b\x36\x5a\x9b\xed\x6b\x41\xd5\xdb\x95\x81\x7d\x42\x07\xcb\x94\xd5\xd3\x5e\x7c\xfc\xb7\xa6\x3c\xc3\x7e\x2a\x9f\x34\x69\x7c\x16\x4b\x0c\x03\xcc\x67\x44\x8b\x05\xd7\x92\x30\xfa\x68\xd8\x97\xf2\xb3\x3e\xbb\x5e\xe2\xe3\xb9\x47\x97\xb9\x07\xc2\xf5\x2b\x3e\x0f\x89\xef\xa8\xc4\x17\xf9\x03\x0f\x51\xec\x49\x6b\x02\xd1\x62\xc5\xb5\xae\x3f\xee\xa5\xeb\x65\xd0\x91\x4e\xa7\xbe\x41\xd2\xe5\x6e\xcb\xdf\xef\xbb\xe3\xf0\x2d\x3d\x7a\xba\xfb\xf8\xc6\x9d\x79\x9a\x44\x69\x18\x60\xbe\x20\x5a\x6c\xb8\x56\xf7\xed\x09\x1d\x30\x2f\xf9\xc6\x94\xe0\x15\xd3\xd1\x1a\x61\xe0\xcf\x26\x8a\xfa\xfb\x8b\xa4\x7f\x5a\x64\x3d\xb8\x46\xcd\x2e\x02\x18\x60\x26\x11\xad\x93\xb8\x96\x4d\xd3\xc8\x0f\x36\x25\x42\xf9\x77\x59\xd4\x0b\x11\x3f\x0f\x2e\x16\x9b\x6d\xbb\x44\x74\x1e\x47\x3d\xdb\xc7\x1c\x4c\xa3\x9d\x74\x61\x80\x99\x42\xb0\x2a\x68\xff\xdd\xc0\xff\xbf\x83\x19\x13\x3b\xee\x2f\x8f\xd3\xa9\x2c\x9d\xde\x0e\xaf\x2e\xd6\xe3\x21\xb1\x8a\xf4\x7d\xc7\xa6\xf4\xc5\xa6\x36\xac\xcf\x63\x3f\x9a\xe9\x8b\xee\xd4\x09\x25\x18\x60\xa6\x11\x57\xe4\x14\xae\xb5\x5e\x11\x1c\x94\x3e\x78\xba\x92\xb0\x9c\xe2\xd3\x4a\x43\x85\x8f\xdd\xa1\xb0\x70\xc9\xe9\x30\xdd\x14\x67\xd3\x57\x01\x64\x33\x2a\x30\xc0\xcc\x20\x5a\xa7\x71\x2d\x12\xb8\xad\xf1\x75\x66\xd5\xa9\x4a\xc2\x24\x49\xa3\x3f\xc3\x85\x09\x3e\xcd\x7e\x21\x7e\x6b\xa5\xf3\x0f\xe6\xac\x64\x55\x9e\x7b\xc1\x00\x33\x8b\x68\x71\xe0\x5a\xfc\x03\x14\x39\x2b\x56\x98\x43\x5e\x1e\x96\xa7\xa7\x46\x86\xf5\x19\x9b\xc2\x27\xc7\x26\x62\xbc\xd2\xd6\x94\x3f\x67\x61\xc6\xb1\x07\xdd\x1c\xa2\x75\x06\xd7\xd2\xee\x68\xf1\x1c\xd3\x4a\x56\x76\xbe\xcf\x56\xaa\xb4\x7f\x9e\x59\x35\xfb\x78\xbe\x2e\xc9\xc0\x0d\xc3\xce\x05\xb4\x9e\x83\xf0\x29\x18\x60\xe6\x11\x2d\x4e\x5c\x2b\x60\x54\x64\xd3\xd9\xcd\x89\x93\x91\x71\x2f\x9e\xff\xa8\x93\xf2\xc2\xf7\xad\x10\xb9\x41\xf4\xb0\x8a\xc8\xb2\x50\x61\x69\x93\x01\x0c\x30\x0b\x88\x16\x17\xae\xb5\x59\xf1\x83\x7f\xa3\xf0\xc9\x50\x83\x80\x1a\x7d\xc1\xa5\xc8\x60\xbb\x27\x60\x9a\xb9\xe2\x3e\xa6\xf6\x57\xb3\x86\xd9\x41\xb8\x28\x0c\x30\x5f\x11\x2d\x6e\x5c\xab\x84\x8c\xfb\x20\x61\x87\xbe\xa2\xb7\xdd\x33\xaf\xae\x73\x35\x58\xb7\x96\xdf\x94\xfd\xbc\xee\x5e\xe7\xd3\xbc\x8b\x91\xa5\xdb\xea\x30\xc0\x2c\x22\x5a\x3c\x78\xeb\x18\x1a\x02\x9e\x16\x54\xab\xfc\x20\x7d\x5e\x2c\x4c\x3e\x77\xa1\x81\x69\x60\x64\xe9\xf6\xfd\xf4\x84\x1a\x5d\xe9\xc7\x9f\x0e\x24\x60\x80\xf9\x86\x68\xf1\xe2\x5a\x7f\x4e\x1b\x6c\x53\xad\xde\x3b\x63\x1a\xdc\x3c\x68\x63\xb8\xd1\xaf\x74\x7d\xda\x7b\x8a\x36\x5d\xf1\x81\x1e\xdb\xf0\xd3\x48\xc2\x0b\x30\xc0\x2c\x21\x5a\x7c\xb8\x96\x96\xa3\xc3\xc0\x73\x39\x6e\xea\x8f\x40\x7c\x06\x6d\x99\xfa\x56\x58\x59\x37\x25\x64\xa6\xd8\x8d\xe6\x7c\x9a\xdf\x03\xc9\x3e\xec\x94\xfd\x1d\xd1\x3a\x8b\x6b\x79\x85\x3f\x56\x1f\xcb\xbd\x3b\xf0\x34\xe4\x54\xa2\xf9\xc2\x3e\xf5\xd9\xc7\x39\x4d\x3a\xd3\x4f\xcd\x43\xad\x64\x66\x63\x1e\x25\x63\x8f\xa1\x65\x44\xeb\x1c\xae\xc5\xf9\x43\x52\xb1\xed\x94\x69\x71\xa6\xd6\x89\x8d\xe2\xab\x3b\xd6\x18\x41\x69\xdb\x85\x9e\x0e\xe2\xf2\x1e\xad\x45\x60\xdc\x87\x3d\x86\x7e\x20\x5a\xfc\xb8\x56\xb2\x29\x2f\xd9\xdd\x30\xff\x8f\xec\xac\x21\xa5\xe7\x7c\x5e\x33\x51\xbc\x1b\x97\x21\xd3\x0e\xb7\xa4\xe7\xd6\x17\xcb\xf6\xcd\xc5\x5e\x03\x57\x10\xad\xf3\xb8\x16\xdf\x0b\x19\xe2\xd1\x37\xb0\x86\xe9\x87\xaf\x7c\x92\x9b\xce\x1c\x67\xd2\xae\x68\x12\x8e\xbd\xd2\x54\x22\x2f\xf4\x58\x17\xcb\xc1\x0e\x57\x3f\x11\x2d\x01\x5c\xab\x40\xf9\xe0\x01\x27\x8f\x0f\x5f\xd5\x92\x0f\xbf\xf5\xf3\x76\xa9\xdf\xb1\x4e\xd3\x53\xf2\x36\x53\x81\xb2\x05\x37\xef\xc7\xd8\x61\x2f\x36\xab\x88\x96\x20\xae\x75\xf2\x2e\xe3\x2c\x7d\x26\xd9\x1d\x69\x82\x3c\x0f\x4d\x05\xa5\x0e\x47\x0d\x10\x42\x53\x6d\x00\xc3\x2f\xe0\x44\x23\xc2\xbe\x4b\x30\xc0\xfc\x42\xb4\x84\x70\x2d\x48\xca\xd6\xf8\xcf\x13\xae\x63\x37\x39\x06\x37\xa9\xaf\x16\x7e\xe2\x29\xe9\x99\x68\xbb\x43\x24\x30\x99\xe1\x4c\x0b\xc8\xde\x11\xc0\x00\xb3\x86\x68\x09\xe3\x9d\xbf\xd6\x07\x52\x4b\x2c\xfd\xf9\xef\xa8\xe9\x9f\xaf\x78\x5a\x3b\xf4\xd6\x1d\x95\x5e\xe2\xdb\x76\x4f\xaa\xd9\xc3\x51\xde\xa7\xd6\x1d\x06\x98\x75\x44\x4b\x04\xd7\xba\xf5\x4e\xfc\x59\x12\x5b\xf8\xf3\xb6\x9b\xb7\xb8\x69\x50\xf6\x8f\x3b\x92\xef\x2f\xad\x44\xf7\xa6\xf3\x90\xc0\xc2\xac\x2b\x77\xc9\x61\x80\xd9\x40\xb4\x44\x71\xad\xd7\xc1\xe9\x15\xb0\x92\x68\xab\xba\x50\x66\x7b\xb5\xed\x17\x43\x5e\x59\x63\x3e\xd9\x48\xcd\x60\x89\x27\x14\xfb\x73\x3f\x29\xb1\xc7\xe3\x6f\x44\x4b\x0c\x6f\x30\xf2\x48\xe0\xf7\xde\xa7\x23\x92\xe0\x7e\x75\xf3\xb7\xe3\xd3\x45\x2a\x9d\x8c\xfb\x75\xbb\x8d\xaf\x49\x15\xdd\x22\x1e\x73\x0f\x60\x8f\xa1\x4d\x44\xeb\x02\xae\x55\x21\x7a\xd9\x4d\xf2\x58\xc7\xb7\xc9\x27\x7c\xee\xa1\xfc\x9e\xa2\x52\xfc\x13\x59\x79\x5a\xc7\x63\x7d\xd4\xc6\x22\xc9\x6f\xcf\x1b\xc1\x00\xb3\x85\x68\x89\xe3\x5a\xca\xd5\xad\x65\x65\xde\x4b\x37\x56\xbe\xbc\x7c\xec\x48\xeb\xc4\xae\xfc\x67\x83\x87\xd4\x67\xc4\x77\xdb\xbe\xc9\x36\x94\x4d\x94\x0a\x06\x98\x6d\x44\x4b\x02\xd7\x22\x2b\x8f\x8c\x3b\x8a\x4c\xbd\x48\x19\xc8\xa8\xbd\xbd\x42\xa1\xea\xe4\x7e\xf6\x82\x16\x69\xff\xab\x48\x93\x9d\xb3\x6a\x3b\xd1\xe7\x60\x80\xd9\x41\xb4\x24\x71\xad\xea\x56\xa6\x67\xe7\x6a\x0a\xe8\xae\x3d\x66\xb7\x31\xd1\xa3\xdc\x64\xf0\x75\x7c\x4b\x6b\xb5\x5f\x69\x4e\x1d\xd8\x13\x6f\x18\x66\x0a\x03\xcc\x2e\xa2\x25\x85\x6b\x4d\xed\xd3\x5e\x19\x6b\xd5\x7a\xfa\x6c\x48\xf3\x92\x89\xc5\xbb\xd7\xb4\x6d\x06\xf4\xe1\x4d\x11\x23\x72\xdd\x3e\xd5\xa1\x85\x85\xfc\x30\xc0\xec\x21\x5a\xd2\xb8\xd6\xf0\xcd\xc2\x95\xf4\x5a\x09\xa7\x58\xc3\xab\xa5\x23\x28\xee\xd5\x81\xe5\xeb\xd5\xe1\xc9\xfe\x0e\xd9\x3e\xe9\x06\xa1\x7f\x62\xed\x61\x80\xd9\x47\xb4\x64\x70\xad\xa0\x7a\xff\x49\xb6\x8d\xf9\x26\xad\xe8\x99\xc1\x53\x46\x5c\xac\x54\xfb\x01\x4e\xe4\xe9\x61\xe7\x6c\xbd\x08\x1c\x8b\x0f\x74\xcf\xc2\x00\xf3\x07\xd1\x92\xc5\xb5\x26\x43\xfc\x8e\xc9\xd7\xec\x7e\x57\x9d\x08\xbd\x73\x26\xc1\x9d\xa1\xbd\xa9\xbb\x5a\xa8\x48\x67\x85\xae\xb5\xdd\x55\x2d\x60\x4b\x1b\x06\x98\x03\x44\x4b\x0e\xd7\x62\xa0\x98\x8e\x26\x4b\xd4\xca\x3d\x1a\x0f\x67\xa2\xb7\x70\xae\xde\x71\x5e\x56\xe6\x2a\x0a\x38\x60\x00\x0a\x97\x36\x43\x3f\x63\xf7\xd5\x43\x44\x4b\x1e\xd7\x2a\x0e\x77\x9f\xf6\xd5\x4f\xb0\x76\xed\x95\x70\x23\x63\x59\xb8\x45\xd2\x5c\xd3\xb7\xfb\x2d\xff\x09\x77\x7f\xed\xd2\xc9\xa5\x3e\x6e\x18\x60\x8e\xfe\x61\x60\xfb\xa7\x8f\x5d\xff\x1a\xd8\x14\x70\x7f\xb9\xdd\xca\x65\x1f\x2d\xca\x2f\x91\x44\xdf\xfb\xdb\x69\x1e\x2e\xb4\x90\xbb\x86\xa2\x38\x7e\xa9\xe5\xc6\x15\x4e\xbe\x1e\x1e\x20\xf3\x84\x01\x84\x42\x5c\x91\x8b\xb8\xd6\x8e\x2a\x3d\xd9\xd9\xeb\x1f\x13\xfc\xa7\xf2\x37\x6d\x16\x09\xdd\xaf\x3c\xb5\xca\xa6\x36\xbe\x36\x5c\x98\x48\xc5\x32\x26\xb3\xc9\x0f\x03\x08\x8d\x68\x29\xe2\x5a\xc6\x02\xf9\xc4\x65\x14\xf4\x67\x8d\xc6\xb5\x32\x4b\xef\x9e\xbc\xea\x2a\x68\xd7\xf9\x82\xb6\x88\xbc\x3b\x95\xf1\x9d\xb9\xf7\xb8\x06\x0c\x20\x02\x44\x4b\x09\xd7\xea\x51\xc9\xe1\xfb\xc8\xff\xa0\x86\x24\x76\xd3\x83\x95\x5c\x3a\xf2\x17\xe8\x95\xd6\x66\xe2\xe3\xcd\x5a\x3b\x1b\x33\xe2\x7b\xca\x01\x06\x10\x06\xd1\x52\xc6\xb5\x66\xb2\xa8\x52\xda\xa7\x22\x8b\x39\xd3\x1c\x2b\x17\x3a\x2c\x67\x47\x93\x13\xbb\x3c\x1e\x1d\x5f\xbb\x5a\x18\x35\x4a\x49\xdd\xef\x0d\x03\x08\x42\xb4\x54\x70\x2d\xfb\x6b\x45\x1f\xb5\x77\x88\x4e\x5c\xe3\x22\xd0\x5d\xbb\xf5\x39\x55\xe0\xa0\x0e\xd3\xfc\x67\x21\xb4\xd9\x23\x3a\xb4\x40\x90\xd9\x0f\x06\x10\x21\xa2\xa5\x8a\xf7\xe1\x63\x26\x33\xef\xaf\x94\x74\x5b\xab\xe2\x82\xe4\x80\x9e\xf7\xdc\x6f\xbb\x7e\x6b\xd3\x51\xb8\x9d\xf7\x0c\x79\x2e\x75\x58\xa6\xac\x02\x03\x88\x08\xd1\x52\xc3\xb5\xee\x34\x19\x55\x28\x3f\xbe\x34\xe0\x7c\x99\xf7\xe6\xdb\xd7\x43\xbe\x3d\x93\x3e\x86\xf7\x8b\x02\xab\xfa\x46\x23\x1c\x6b\x2a\x5b\x5d\x60\x00\x11\x23\x5a\xea\xb8\x56\xbe\xc2\xa0\x92\xf7\xb9\xb7\x34\x83\x3a\xd7\xef\x9b\x54\x0b\xb9\x5b\x50\xf2\xaa\xa7\x5f\x6b\xfa\x90\x57\xd4\xc6\x1b\xce\xa3\x26\x06\x03\x88\x04\xd1\xd2\xc0\x7b\x1f\x53\xa2\x34\xa6\xfa\x83\x78\xa9\x82\x1f\x30\x36\x2d\x33\xa7\xb0\xf7\xa6\xbc\x3c\x36\x56\x76\x68\x33\x21\x7f\xa2\x81\x5b\x51\x01\x06\xd0\x31\x44\x4b\x13\xd7\x12\x7d\x95\xb5\xbc\x99\xb4\xbc\xe4\x61\x47\x52\x45\x76\x52\xc2\x20\xe5\x11\xcd\xf1\x5c\xae\x62\xfe\xcf\x3d\x0f\xb7\xf7\x27\x97\x85\x61\x00\x91\x22\x5a\x5a\x78\x17\x7a\xe1\xde\xc0\x7b\xa8\x27\x2f\xdd\x65\x16\xee\x1e\xd1\x18\x73\xe4\x7d\x76\x90\x6e\x75\xea\xb4\x08\x7c\x41\x65\x6a\xe3\x77\x59\x14\x06\x10\x19\xa2\xa5\x8d\xf7\x11\xa4\x04\xa6\x99\x27\x9e\xae\x2f\x78\x5b\x4b\x24\xb4\x31\x54\xb8\xcf\x82\x23\xb8\x8f\xa7\x3c\x8c\xf8\xe6\x2f\x4f\xbe\x13\xf3\x8a\x30\x80\xc8\x11\x2d\x1d\x5c\xab\x4b\x6a\x66\x26\x3e\xc5\xb0\xfb\xa6\x13\x99\xd2\xf7\xb0\xa5\x8f\x1c\xe6\x89\x12\x1e\x8c\x37\x78\xd7\x54\x62\xa8\x88\x4d\x29\x21\x18\x40\xc7\x11\x2d\x5d\x5c\x6b\xe0\x74\xb8\xef\x8d\x08\x66\x56\x57\x27\x11\xf6\x97\x97\xde\xb9\x37\x67\xfe\x5c\xe3\x64\x5e\x13\x94\x35\x62\x4f\xe0\xd2\xb4\xc0\x1e\x8f\x14\x88\x96\x1e\xae\x75\xc5\x03\x9e\xbe\x2b\x18\x83\x4a\x63\xbf\xc7\x4f\x54\x1c\x0e\x08\x95\xba\xdf\x04\x39\x9d\x94\xbe\x91\xe9\x13\xb0\x59\x91\xe7\x0f\x03\x88\x12\xd1\xd2\xc7\xb5\xfc\xa8\xa9\xe6\xbe\x15\x0f\xbf\x48\xd9\xe4\xb9\xf0\x4b\xbc\x94\xbe\xa2\xc7\xd5\x89\x67\xd0\x77\xb1\xa1\xa8\x2c\x7d\xb1\xaa\x98\x04\x06\x10\x15\xa2\x75\x09\x6f\x88\xb7\xfb\xb1\xd8\x5d\xff\x4a\x1f\x58\x0c\xba\x7a\x14\x17\xad\xbc\x8b\xf4\x28\xf2\xc8\x14\x91\x2a\xd8\x84\x73\x5a\xe8\xc5\x54\x61\x00\x51\x23\x5a\x06\xb8\x56\x67\x59\x6d\x95\x24\xdc\x9a\x9e\xbb\x9b\x7a\xfb\x45\x8f\x9e\x36\xc9\x1b\xab\x50\x49\x89\x55\xcb\x1b\x0b\x86\x97\x45\xa7\xac\x8f\xc1\x00\xa2\x41\xb4\x2e\xe3\x5a\xd9\x1f\x32\xb6\x7e\x48\x96\xbc\xbd\x42\xcc\x15\xab\x5c\x2f\x54\x5b\x6a\x62\x9f\x71\xd9\x88\xc5\x2a\x4b\x73\x79\x56\xc9\x56\xe7\x04\x0c\x20\x5a\x44\xcb\x10\xd7\x1a\x1f\xf0\x76\x48\xe3\x3c\x76\x47\x95\xf0\x4e\x27\x61\x66\xd0\x13\x2d\xa6\x16\x39\xfb\x89\xdd\xf6\xf2\x37\x4d\x93\x2f\xb4\xaa\xb1\xdb\x9e\x0e\xd1\x32\xc2\x3b\x47\xaf\xc8\x45\x4e\xe8\x06\x64\xb8\x1c\x27\x5b\xd7\x35\x33\x94\x94\x0d\x6b\x3e\xbd\xc2\x6a\xc0\xfd\xe5\x47\x92\x06\xca\x59\x37\x00\x06\x10\x3d\xa2\x65\x8c\x6b\xbd\x90\x3f\xf5\xd5\x22\x36\xf5\x4a\x74\x8e\x54\xd9\x5a\x9c\x93\x52\x87\x25\x0c\xa9\x5a\x0b\xa8\x12\xf5\x2c\xc6\x48\x5e\xba\xec\x0a\x03\x88\x01\xd1\x32\xc1\xdb\x57\x0f\x25\x3f\x04\xc7\x06\xb4\x6a\xbb\x32\x5a\x2c\x3e\x38\x6e\xe1\x4b\xd8\xce\x6c\xec\x6b\x77\x4b\x87\xb6\xc4\x24\xec\x71\x1e\x03\x0c\x20\x46\x44\xcb\x14\xd7\x52\x89\x7e\x25\xac\xa1\x19\x3e\x56\xdf\xc7\xad\xdc\x4c\x5d\x1b\x78\x84\xa1\x3f\xf3\xd0\x21\xb6\x66\xd9\xe3\x8a\x8a\xb6\x1f\x15\xf6\x9c\xc3\x84\x68\x99\xe1\x5a\x47\xa1\x35\x0b\x83\x71\x6d\x73\x56\x5e\x47\x42\x98\x27\x9a\xa9\xb4\x42\x0e\x85\x68\x9a\x2b\x6b\xab\x0f\x0f\xe6\x59\x6e\x80\xcb\x30\x80\x00\xa2\x65\x8e\x6b\xa1\x46\x2f\x8c\x55\xfe\xf8\xf9\xf0\x8c\x97\x0d\x2b\x8b\x5f\x8c\x2f\xa9\x00\xdd\xa4\xb1\xa8\x33\x23\x75\x1b\xf7\x34\x2d\xaa\xf8\x0c\x0c\x20\x66\x44\xcb\x02\xd7\xa2\x9b\x9f\xe7\x5c\x8a\x1c\x50\x39\x8f\xb1\xe1\xed\x2b\x60\x4f\xe5\x67\x3a\xfb\x20\x4d\x68\xbf\x32\xc4\x20\xff\xdb\xc5\x28\x34\x17\x0c\xa0\x13\x88\x96\x25\xae\xe5\x7f\xcd\x97\x89\x5b\xce\xe0\x11\x58\xe8\x1f\xfd\xf1\x0e\xe4\xe7\xbf\xa6\xfd\x5c\x79\x43\xc4\xa6\xf8\x04\xdd\xe4\x72\x55\x3e\x33\x0c\x20\x16\x44\xcb\x0a\xd7\x1a\xba\xfb\x8a\xa1\xd2\x50\xc7\x66\xb4\xce\xe9\x95\xaf\x95\xaf\x83\x4a\x1f\xf7\xa7\x5d\x23\xda\x16\xda\x5f\x1b\xf5\xad\xed\xb6\x18\x18\x40\xac\x88\x96\x35\xde\x93\x8f\xf5\x99\xb4\xd7\xbd\x1f\x2b\xbd\xcf\x7e\xf0\x98\xbc\x1c\xff\x3e\xa8\xf9\x1d\x59\x9b\xd5\xed\xa6\xd1\xf8\x78\x0e\xf1\x33\x11\xd8\x73\x34\x1b\xa2\x65\x83\x6b\x95\x76\xec\xd2\x10\xdc\x13\xbd\x20\x09\xae\x10\xfb\x54\x39\xaf\xe7\x1a\xaf\x91\x9b\xbc\xdf\xd1\x24\x95\x61\x5b\xe6\x6c\xd0\x3f\x0d\x03\xe8\xe4\x3f\x0c\x6c\xff\xf4\xf0\xfb\xaf\x81\xcd\x16\xf7\x97\x5b\x0a\x9a\x71\x1b\xdc\xb5\x36\x36\xb0\xfd\xda\x18\x7b\xd2\x82\x68\x9b\xf4\x67\xa1\x41\x93\x96\xda\x99\x56\xb5\x98\x77\x02\x8a\xee\x30\x80\xd8\x11\x57\xc4\x0e\xd7\x12\x7e\x71\x7f\xee\x57\xfd\xcd\x1f\x1b\xa2\x07\xf9\xb5\x32\x6c\x22\xf4\x64\x6d\xae\xc5\x74\x37\xfc\x2d\x07\x1d\xec\x6c\xba\x62\xb1\x07\xca\x29\x44\xcb\x1e\xd7\x6a\x2e\x66\xdf\x5a\x24\xd5\x8a\x3a\x5a\xc9\x47\xf9\x85\x5b\xaf\x4b\xbd\x7f\x5a\x9f\xe4\x74\x7b\xf4\x2b\xfd\x44\xf0\x8f\xe8\x05\x11\x18\x40\xa7\x11\x2d\x07\x5c\x8b\x36\x8d\xce\x32\x64\x5d\x45\xfd\x6c\x5b\x84\xb8\x38\x8b\xdb\x64\xc0\x0f\x15\x23\x93\xa0\xf0\xe2\x1b\x94\x97\xe5\xc3\x6c\xe9\xc8\x61\x00\x71\x20\x5a\x8e\x78\x9f\xdc\x4f\x76\xca\xa9\x7e\xed\x37\xfd\xed\x74\xb8\x32\xe9\xad\x1a\xb8\x2e\xc1\x4c\x2f\x7b\xb5\x36\x9d\x36\xa4\x3e\xc3\x6e\x31\x91\x0d\x06\xd0\x19\x44\xcb\x09\xd7\x52\xd7\x04\x12\x9b\x37\x32\xc2\x33\x53\x1b\x03\xe6\x33\xef\xb9\x78\x7b\x75\x4f\x4f\x91\x35\xf2\x40\x5b\xdf\xd3\x2f\xde\x78\x85\x5d\x47\x4e\x44\xcb\x19\x6f\x00\x69\x29\x4c\x11\x51\x8c\x75\x7c\xe6\x59\x47\xf2\x7d\xe4\x8d\xf2\x0b\x7e\xbb\xac\xe8\xfc\xef\x67\xd6\x63\x4c\x25\x03\xc7\xf7\x58\x60\x00\x71\x21\x5a\x2e\x78\x4f\x53\x79\x06\xab\x74\x94\xf4\x38\x95\xdf\x7c\xd4\xba\x3a\xc9\xec\xff\xf1\xde\x8f\x6c\x15\xa1\x67\xab\xa1\x09\x56\x86\x18\xd9\xd3\xd8\x0b\x17\x37\xa2\xe5\x8a\x6b\x79\x7e\xb4\x7b\xb7\xd9\x71\xe3\xc3\xf9\x2f\x21\x6f\x1a\x5c\x49\xfe\xe4\xbe\xdd\xd6\x19\x8e\x5f\x21\x76\x44\xb3\xa5\xda\xb1\xbe\xa2\x83\x01\xc4\x83\x68\xb9\xe1\x5a\xe1\xe0\xed\x85\x27\x3a\xe2\x04\xef\x4a\x04\x2e\xb0\x5c\xb4\xc8\x89\xfb\xd0\xf4\x0b\x1d\x5d\x7c\xa2\x8c\x21\xff\x69\x92\x07\x2b\x76\xf0\xe6\x45\xb4\xdc\x71\x2d\xa2\xa5\x29\xb7\x8c\xc5\x89\xd3\xfc\xca\x5d\xeb\x96\xfb\x86\x23\xb9\x4b\x1e\x1f\x98\x7e\xbb\xf9\x1a\xb8\xe7\x92\x3c\x97\xe4\x55\x83\x01\xc4\x87\x68\x79\xe0\x5a\x80\xf4\x35\x20\xab\x12\xa8\x10\x22\x71\x11\x58\xf7\xfc\x14\x43\xfe\x8e\xf5\x93\xe1\x39\xe6\x6f\xc7\x0b\x8a\xcb\xca\x68\x23\x28\x60\x00\x9d\x45\xb4\x3c\x71\x2d\x82\x33\xa5\xb3\xfe\x53\x75\x75\x8d\x89\xf9\x2b\x46\x6e\xfe\x6a\x11\x0a\x97\xca\x3e\xf1\xee\xdd\xfc\x3d\x6c\x59\x45\x39\xa2\x8b\x1d\x8c\xce\x21\x5a\x5e\xb8\xd6\xf3\x1b\xa1\xed\x7d\x6d\xb7\x87\xa6\xde\x57\x26\x6b\xa4\xb8\x30\x49\x76\xb2\x78\xd9\x3d\x64\xa1\x17\x76\x33\x3b\x1b\xde\xe2\x84\x3d\xa9\xf3\x23\x5a\xde\x78\x37\x2a\xe9\xbf\xae\x87\x85\xdc\xbc\x7a\x36\x47\x57\xa0\xd9\x6a\xeb\x47\xa5\xd8\xa7\xd0\xc3\x45\x5d\xde\xc6\x05\x29\x71\x05\x35\x05\x41\x18\x40\xe7\x11\x2d\x1f\x5c\x6b\xa1\xf1\x86\x05\xa7\x26\xba\xd4\x97\xf2\xe0\x0d\xc1\xa2\x6e\x8d\x6c\xfb\x60\x85\x86\xff\x05\x85\xfa\x1c\xde\x5a\xa3\x76\x1e\x0e\x18\x40\x02\x88\x96\x2f\xae\xf5\x5b\x7a\xf1\x6c\x39\xa5\xcf\x8b\xc2\xda\x2a\xae\x7e\x9f\x88\xac\xd0\xb7\x51\x64\xfd\xe9\x95\x8a\x8c\xe9\x3d\x06\x4f\xbc\x7f\x30\xc1\x00\x12\x44\xb4\xfc\x70\x2d\x21\xce\x6f\x94\xf6\xfa\xf9\xcf\x14\x16\xf4\x79\x0f\x92\xc5\x5d\xd5\xbb\x02\xd5\x1b\x4d\x74\xc3\xba\x67\x26\x6e\xbd\x7f\xe0\x27\x07\x03\x48\x08\xd1\xf2\xc7\xb5\x7c\x54\xfc\x67\xcb\x4b\xa8\x75\x19\x92\x34\xea\x6e\xc0\x11\xa6\xb4\xa6\x16\x5c\xba\xb9\xbc\x0f\x88\x4e\xf0\x32\x0f\xfb\xea\x62\x07\x49\x61\x44\x2b\x00\xd7\x52\x5b\x6d\x24\x37\x38\xb5\xf8\x6a\x2b\x71\x46\xc4\x4b\x95\x5f\x20\xb2\x75\xff\x0d\xfb\xf2\x02\x45\x24\xfd\xfb\x2d\x5d\x4a\x59\x7d\x18\x40\x22\x88\x56\x20\xae\xe5\x64\x6d\xaf\x7e\x5f\x3e\x40\x78\xc0\x58\x62\xc3\xf4\x2e\x35\x61\x4e\x95\x44\x4c\xfb\x97\x80\x70\xf7\x8c\xd0\xd4\xde\xe2\xd3\x26\x30\x80\x44\x11\xad\x20\x5c\xeb\xa1\xee\xed\xd3\xdf\xe8\x6d\x5e\x4e\x0d\x3b\x57\xb3\xfa\xea\x10\x66\xf5\x08\x4f\x57\x29\x73\x7d\x1f\xf7\xda\xff\x15\xf9\xb5\x9f\x0a\x06\x90\x18\xa2\x75\x05\xd7\x32\x58\x3f\xe1\x5e\x7c\xaf\xc3\xb4\xf6\xea\xbe\x61\x41\x67\x7f\xfc\x64\x52\xc2\x09\xeb\x12\x53\x92\x20\x96\xef\xb5\x59\x9b\xe3\x5e\x30\x80\x2e\x20\x5a\x57\xf1\xae\x43\xaf\x0e\x63\xcf\x51\x73\x3d\xa9\xaf\x18\xf8\x2a\xf8\xf4\x98\x1f\xb5\x15\x74\xcd\x6c\x13\x4c\x64\x8b\x79\xbf\xb0\x2d\x27\x93\x80\x01\x24\x8e\x68\x5d\xc3\xb3\x54\xce\x75\x34\x70\xd5\x9d\xe0\xf1\xfe\x1a\x92\x78\x66\xf0\x15\x51\x31\xfa\x71\x89\x9b\xdc\xfe\x7b\xb1\x3b\x73\xa4\x0c\xbb\xd8\x73\xb4\x04\xa2\x15\x8c\x6b\xe5\xc4\xab\x28\x09\xe8\x84\x85\x8d\x74\x32\x2d\xbb\x54\x1b\x95\xbc\x4d\xa3\x8f\x79\x8c\x71\x0f\x6e\x34\xf1\x1a\xbb\xde\x76\x68\x0d\x03\x48\x12\xd1\x0a\xc1\xb5\xb6\x4f\x53\x7b\x26\x32\x47\xd0\x9c\x80\x92\xe3\x2d\x38\xd3\xa3\x89\x82\xee\x94\x32\xb6\x46\x28\xa5\x32\x5c\x80\x98\x43\x68\xb5\x61\x00\x49\x21\x5a\xa1\x78\x8f\x7d\xe3\xac\x2b\x52\xd4\x22\x5d\x36\x67\x1e\x1f\x58\xbf\xdd\xcd\x3c\x7e\xd1\x69\x50\x63\x71\x47\xfc\x38\x51\x2e\xed\xaf\xfd\x58\xec\xb9\x50\x1a\xd1\x0a\xc3\xfb\x24\x7e\x5e\x3d\x51\x8a\xf2\x44\xdc\x82\x55\x8e\xd8\x25\x14\xba\xc9\xc4\x79\x19\x2e\xfc\x4a\x9a\xa9\x57\xf6\xe4\x4b\xcf\xb4\x00\xf6\x3c\x21\x83\x68\x5d\xc7\xfb\xa6\x4a\x32\x9b\x84\xc8\xb4\x15\x9c\xff\xfd\xfc\xf9\xb8\xb1\x81\xee\xe9\xc8\xdf\xb7\x7b\x53\x63\xee\x3e\x6e\x72\xb1\x84\xb2\xcd\x51\x30\x80\x64\x11\xad\x1b\x78\x9f\xc4\x1f\x4d\x3e\x4d\x9f\x57\x19\x6f\x8f\x59\x10\x7e\x4c\xcb\x0c\x74\x58\xf3\xfa\xcb\xc8\x7f\xca\x0f\x0d\x30\xdf\xcf\xe0\xf5\xf4\x83\x01\x24\x87\x68\x85\xe3\x5a\xc4\xe4\x95\x95\xd3\x75\xae\xfa\xc1\x45\xcb\xcc\x49\x35\x37\x7f\xa8\xee\x0f\x3e\xbc\xde\x93\xc3\xf6\xe0\x48\xd1\xfe\x8c\x77\x19\xf6\x75\xc9\xff\xc3\xc0\xf6\x4f\x5f\x41\xfc\x6b\x60\x8b\xc0\xfd\xe5\xe2\x94\x2e\x8e\x6d\xe5\x6f\xb7\xc9\x57\x52\x1e\xee\x08\x67\x8b\x07\x09\x3c\x8e\xd1\x33\x12\xd7\x91\x0b\xde\x1d\x6e\x33\x60\xe6\x84\x01\xa4\x80\xb8\x22\x30\xae\x15\xc8\xfd\xae\xbe\x9a\x0e\x7e\xc8\x4c\x3c\xf0\xd9\x6b\xa5\xbd\xa2\xb5\xa7\x82\x7f\x82\xeb\xb9\x55\x2c\x65\xe6\x11\x69\xf4\x0f\x4d\x18\x40\x17\x11\xad\x48\xbc\x8f\x1d\xcf\x90\x73\x3b\x73\x29\x6b\x44\x2e\xbd\xac\x90\xe8\xce\x36\xb8\x6f\x3d\xc0\x69\x73\x4a\x64\x8e\x1f\x04\x12\x35\x71\x3e\x75\x81\x01\xa4\x88\x68\x45\xe1\x7d\x1c\xea\x2b\xeb\xfd\xe8\x58\xc3\xae\x47\x84\xf7\x77\xdf\xbb\x28\x83\xbc\x3f\x0b\x8a\x97\x4d\xec\x87\x04\x03\xc7\xdf\x64\x88\x0e\x99\xc2\x00\x52\x42\xb4\xa2\x71\x2d\x46\x9b\x81\xd7\x45\xaa\x9b\x4f\x0d\x6e\x49\x2a\x5c\x7f\x14\xe6\xae\x20\x97\xf9\x50\x33\xaa\xef\xf7\xd3\x9f\x7e\xec\xb1\x34\x5e\xb2\x30\x80\x94\x11\xad\x9b\x78\x43\xa9\x8c\x66\x78\xf3\x5c\x3c\x2f\x89\x9e\x69\xdc\x3b\xf2\x18\xd5\x27\x92\x61\xe4\x5a\x57\x2f\xdf\x48\x66\x8b\x8a\xff\x14\x3a\x86\xbd\x43\x55\x41\xb4\x6e\xe1\x5a\xe6\xb4\xd7\xa7\xfa\x2b\xa9\xb7\x17\x98\x09\xd4\x17\x93\xbc\x8d\x08\x7c\xee\x1a\x3d\xf9\xa2\xbc\xa9\x9e\x7d\x73\xb3\xed\x55\x1f\x2b\x0c\x20\x55\x44\x2b\x06\xd7\xa2\xbc\x20\xae\x42\x7a\x4f\xe0\xbc\xc1\xe3\x79\x9d\x43\x73\xb3\x46\x0e\x48\xd2\x4a\x39\x6d\x63\xe9\x96\xcc\xaf\xcc\xb2\x6e\x59\xec\xce\xad\x86\x68\xc5\xe2\x5a\x31\x96\x3c\xba\xe5\x3c\x16\x5b\xba\x6c\x57\xa2\x34\x47\xfa\xd1\x87\x79\x0a\xb4\x9b\xc7\x49\xe7\x26\x0f\x6e\xb2\x4a\xb9\x9c\x70\x82\x01\xa4\x8e\x68\xdd\xc6\xfb\x74\x60\x86\xeb\xbe\xfa\x25\xd5\xba\xc7\xb7\x54\xd7\x08\xd6\x87\x05\x2c\xf7\x69\xb8\xc9\xa2\xe2\x57\x2b\x07\x76\x13\x1e\xbb\xc5\x61\x07\x10\x0d\x44\xeb\x0e\xde\x63\xf2\x40\x7e\xed\xc8\x8f\x8f\xfc\xcd\xaf\xf2\x49\x18\x2d\x76\xec\x0f\x8c\x0b\x29\x5d\x2a\x78\xd8\x23\x45\xf7\xf9\x12\xf5\xd2\x75\xec\x7e\xaf\x89\x68\xc5\xe1\x5a\x61\x54\x9e\x87\xca\x63\x24\x79\xdf\x68\x97\x9e\x26\x19\x6b\xbc\x8c\x2e\xfc\x95\x10\x69\xeb\x1a\x10\xcf\x91\x21\x7c\x0b\x6a\xc4\x5e\xb8\xb4\x10\xad\xbb\x78\x5f\x11\x63\x3b\x49\xf1\x66\xf6\x0d\x66\xae\xa3\x42\xf8\x0b\x5b\x7d\xf3\xe5\xd8\xcd\x8c\x2f\x9d\x68\x6d\x59\x51\x17\xe6\x92\x27\x54\xd8\xfd\x4b\x1b\xd1\x8a\xc7\x1b\xd8\x32\x83\xb2\x76\x80\xf6\xe4\x51\x7b\x4f\xe2\xb6\xca\xf5\xaa\xaa\x7b\x51\xf3\xf7\x0e\xae\x77\xe7\xca\x79\x3d\xbb\x9e\x35\x82\xbd\x73\xd6\x41\xb4\x12\x70\xad\xc7\xbd\x6f\x4d\xa3\x6d\xbe\x1a\x7c\xd7\x6a\x71\xa8\x7d\x3c\xf4\x82\xcf\xf8\x43\x19\x8a\x88\xd9\x8b\x8b\x55\xde\xc6\xbe\xb7\x0c\x3b\x80\xe8\x22\x5a\x89\x78\x03\xee\x69\x2f\x97\xdc\xad\x91\x9a\xd0\xef\xfb\x41\x47\x2e\x98\x05\x31\xf4\xac\xdb\x58\xaa\xa7\x2d\xf5\x82\x0f\x0f\xc7\x45\x56\xec\xd0\xa0\x87\x68\x25\xe1\x0d\x6c\x77\xed\xc8\xa8\xb3\xb4\x89\x82\xc6\x26\x23\x16\x09\xe9\x0e\xfb\x13\x05\x0f\x3e\x6f\x76\x35\xfa\xe6\x35\xfb\x5d\x2f\xf0\xa3\x86\x01\xa4\x8f\x68\x25\xe3\x7d\x92\x45\x28\x0f\x87\x28\x84\x99\x95\xd1\x2d\x8d\xdd\xa6\xd5\x28\xb1\xb0\xdc\x58\x8d\x0c\x52\xf1\x65\x9a\x0e\xbd\xb9\xc5\xb7\x62\x0b\x03\xe8\x12\xa2\x95\x82\xf7\xb8\xd0\x3a\xe4\x1a\x30\x0b\xbc\x12\x36\x2f\x41\xd0\x7d\x39\xbe\xed\x14\x77\x19\x3f\xff\x6c\xf3\x33\xee\x36\x6e\xa3\x9f\xc4\xde\x16\x30\x80\x0c\x10\xad\x7b\xb8\x96\x23\xc5\xf4\xde\xf0\x68\xbd\x80\xbd\x7b\x5f\x44\xeb\x8b\x30\x6b\x59\xea\x29\xaf\x0a\xef\x1e\xfa\x15\x2a\xc3\x0f\x2b\x29\x5b\xd8\xfd\xfe\x32\xa2\x95\x8a\xf7\xc8\xca\xe4\xd7\xe9\x69\x02\xd6\x61\x5f\x87\x52\xd7\x67\xd2\x82\xef\x2e\x9c\x65\x3f\xad\xb1\xa6\x9d\xa2\x16\x1a\x41\xa1\xb8\x57\x2a\x04\x03\xc8\x10\xd1\x4a\xc3\xb5\xbe\xe8\xc8\xaa\x70\x35\x48\x73\x2e\xba\x97\xfe\xa8\xd4\x5a\xde\x7b\x6a\x6c\x7b\x8d\xf2\xcf\xdb\x49\x9e\x88\x5b\xb3\x32\xba\x97\xb0\x03\x88\x11\xa2\x75\x1f\xef\x3a\xb4\xbc\xc5\x63\xd6\xcb\x67\x36\x3e\xb9\x73\xaf\x0a\xa6\x99\xef\xac\xca\xcf\x7f\x26\x3a\xfe\xe5\x62\xa4\xd2\x11\x2b\x79\xcf\x25\x18\x40\xc6\x88\x56\x3a\xae\x25\xb8\xaa\x58\x75\xe2\x0d\xcd\x19\xe8\x73\x99\xaf\xcb\x47\xc5\xfc\xe4\x77\x9b\x6f\xfb\x68\xe7\x06\xc9\x5a\x59\x28\xf5\x2e\xbb\x2a\xc2\x00\x32\x41\xb4\x32\x70\xad\x24\xee\x1f\xa6\xcd\x98\x5f\xb9\x8f\x6e\xe5\x8a\xe5\xef\xca\x52\x63\x86\x4b\x6e\xf8\x49\x94\xfd\x38\x7c\x76\xf3\x49\x55\x61\x9a\x34\x0c\x20\x53\x44\xeb\x01\xae\x75\xae\xcc\x9e\x27\xef\xaa\xc3\x89\x17\x3c\x1a\xaa\xa5\x37\x5f\x33\x1d\x97\xa4\x74\x39\xc9\xb0\x4e\xf2\xa9\x93\x8a\xd9\xe1\x22\x0b\xf6\x46\xc5\x0c\xd1\xca\xc4\xb5\x44\x88\xde\x87\x0c\xfe\x11\x5a\xd5\x9f\xa4\xc6\x54\x35\x69\xdc\xfc\x5a\xab\x6b\x4b\xfc\x56\xf0\x9d\x33\xcb\x73\xaa\xe4\xb1\x70\xec\xfe\x65\x8e\x68\x65\xe1\x5a\x1e\x93\x97\x6f\x35\xfc\xea\x3a\x7b\xe5\xea\xb7\x73\xb7\x1f\x19\xb0\xbd\xf8\x42\xbc\xf3\xd0\x9c\x9e\x2c\xf6\xe3\xdb\xac\x6a\x11\x5a\xec\xfb\x68\x81\x68\x65\xe3\x5a\xdf\xe3\x5f\x4b\xe7\x09\x9c\xe5\x7d\x38\x42\x3d\x42\x1e\xf3\x5c\xe1\xaa\xbd\xc5\xaa\x22\xad\x8d\xd5\xb8\xe6\x87\x29\x2e\xd9\x40\x6e\x18\x40\x96\x88\x56\x0e\xae\x75\x99\xbe\xe9\x2b\xe9\xe8\xb1\x61\x71\xcc\xfd\xe1\xe7\x92\x57\x1d\x7b\xc5\xae\xc4\xd3\xac\xca\x32\x3a\xb2\x17\xd4\xd8\xbb\x15\x5a\xc2\x00\xb2\x42\xb4\x72\x71\x2d\x74\x6b\x9f\x47\xc4\xba\x88\x69\x68\x6d\x40\x7b\xd2\xe9\x8b\xe4\x8a\x40\x83\xfe\xa3\x9f\x54\xe4\x8d\x6b\x29\x43\x37\x0e\xe8\xb0\xfb\x97\x35\xa2\xf5\x10\xef\xc6\xee\x49\x30\xfb\xd3\x8b\x35\xb2\x5b\xf7\xe8\xab\xfe\xa8\x67\x39\x94\xc1\x2a\x5c\xca\xca\xc4\x1f\xe6\x3d\x26\x35\xe5\x69\xb8\x49\x61\x00\xd9\xfc\xc3\xc0\xf6\x4f\x7f\x11\xe4\xaf\x81\x2d\x0f\xf7\x97\xd7\x68\x56\x67\xd8\x37\x06\x4f\x55\xcd\xa2\xdc\x38\xb8\xfa\xf5\xe4\x36\x4c\x9e\x6a\xb0\xcc\x7b\x51\xd6\xe7\xc5\x32\xea\x9a\x38\xc0\x00\xb2\x45\x5c\x91\x7c\x5c\x6b\x37\x45\xed\xc7\x86\x48\xe2\x68\x3a\xc5\xe7\xb3\xad\x0c\xe6\x9a\x72\x0c\x95\x7b\xa6\x69\xef\x02\x37\x14\x36\xc2\xc3\xc2\x89\xb1\xd3\xb5\x1d\xa2\x55\x80\xb7\x13\xf1\xef\xee\xa9\xd8\x32\x61\x7a\xca\x9a\xab\x6e\x1d\x4a\x32\x33\xd2\x64\xa4\x47\x0c\x0d\xcf\x07\xdd\x32\xd2\xc9\x59\x33\x52\x86\x01\x64\x8f\x68\x15\xe2\xdd\x55\xce\x35\x91\xb2\x31\xc1\xd6\x57\x36\x88\x12\xf9\xf5\x35\xd3\x8d\x9e\x94\x73\x84\x26\x7c\x76\xf5\x17\xd8\xb7\xab\xd1\x65\xc5\xde\xa1\x3a\x20\x5a\x45\x78\x1f\xd3\xa6\x48\x7f\x78\xb2\x3b\x1f\x17\xf4\x53\xa9\x4f\x80\x7b\x8e\xd6\xa0\x5d\xe8\xf0\xf2\x27\x03\x7a\x3f\xdb\x39\x79\xd6\xc6\x3e\x37\x18\x40\x8e\x88\xd6\x23\x5c\xeb\x02\xf1\x41\xa0\xc2\x7a\xf0\x64\x6d\xe3\x40\xae\x9f\xf9\x08\x8a\xc3\x3f\xee\xab\x03\xf9\x9b\xa4\x69\x32\x82\x87\x95\xea\xf3\x7c\x30\x80\x9c\x10\xad\xc7\xb8\x96\xf4\x9f\x94\xf9\xae\xf9\xd4\x1c\x99\x8b\x6d\xef\x8d\xe6\x55\x25\xc8\x76\x30\xe5\x24\x11\x16\x32\xae\x6c\x6a\x37\xab\x6b\xb4\xb1\x3b\x91\x33\xa2\x55\x8c\x77\x62\xc9\xf4\xfb\xbc\x42\xf4\xf2\xc5\x71\xc3\x1e\x2b\xb8\x73\xa0\x85\xe7\x03\x63\x9f\xb0\x45\x49\x6c\x6a\x4d\xcf\xae\x5b\xa4\x8d\x15\x0c\x20\x17\x44\xeb\x09\xde\xeb\x2a\x24\x35\x3b\xaa\x70\x9d\x63\x2c\xb7\xb3\x79\x92\x5c\x04\xef\x75\x5e\x8f\x08\xa2\x9d\xd9\xd1\xa1\x76\x0e\xf2\x0d\xa7\xf2\x81\x01\xe4\x8a\x68\x95\xe0\x5a\x59\x95\xdb\x97\x48\xaf\x2f\x2a\x1b\xa6\x55\x35\x6a\xdd\x74\xe0\x7b\x40\x48\x79\x8a\x63\xd0\x6e\xa7\x2b\xb1\x2b\x71\x2d\xdc\x8f\x0e\x06\x90\x1b\xa2\x55\x8a\xf7\x78\xe2\x05\x5f\x3b\xc4\x3c\xc8\x1c\xc0\x3c\xa1\xb2\x99\x4f\x2e\xdb\xc5\x7c\x5a\xb9\x78\xd3\xc9\xb9\x55\xf3\x8f\x9b\x93\x60\x18\xf6\xa4\xee\x8e\x68\x3d\xc5\xfb\x0e\x9b\xd8\xa9\xdf\xf6\xca\x5f\x7e\xe8\x06\x09\xb4\x9e\xf7\x3e\xe9\xc5\xf1\x15\xb0\x1f\x0c\x3b\x97\xef\xe4\xb2\x52\x1d\x17\x25\x61\x86\x01\xe4\x81\x68\x95\xe1\x7d\x32\xa3\x23\x59\x8b\xda\xe9\x17\xd6\xb8\x5a\x63\x79\xcf\x8a\x29\x7c\x95\x60\xba\xc1\x86\x2f\x38\xfb\xd4\x87\x1a\x13\xea\xc7\x3d\xd8\x0b\x84\x27\xa2\x55\x8e\x77\x6c\xab\x73\x34\x3c\xbe\x69\xb2\x41\xa7\xa3\x5d\x39\xa1\x68\x7a\x5f\x6b\x5f\xe9\xca\xe6\xec\x2f\xab\x9f\x32\x62\xe8\xfb\x7e\x47\x9e\x30\x80\xbc\x10\xad\x67\xb8\x56\xfa\xa3\x23\x37\xd9\xd3\x2c\x67\x65\x73\x27\xe8\xbd\x7e\xf4\x2d\x67\xeb\xba\xa6\xb6\x99\x3c\x62\x8d\xf9\xe3\x1c\xe5\x89\xba\x7b\x12\x06\x90\x37\xa2\x55\x81\x77\xc2\x4b\x5a\x48\x0e\x82\xb7\xc8\x7a\x9a\x23\x66\x86\xc5\xbe\x49\xf8\x1d\xb1\xbc\x74\x68\x31\xbe\x17\x1f\xc5\xad\xc7\x2d\x7d\x8f\x08\x06\x90\x0f\xa2\xf5\x1c\xd7\xe2\xa4\xf0\x17\xed\xd3\x1c\xe7\x5e\x2a\x4c\x54\x29\x25\xb8\xcd\x7e\x57\x4c\xe6\x98\xd3\x69\x0f\xf7\xa1\xba\x63\xde\x1c\xa8\x1b\xd8\xfd\xcb\x17\xd1\x7a\x81\xf7\x89\xf7\x8c\x7e\xf0\xda\x95\xb0\x3e\x22\xbf\x6b\x55\xa6\x6a\x5e\x8b\xc9\xe3\x4c\x12\x1c\xf7\xa7\x04\x08\xbc\x0c\x66\xb4\xf3\x4e\x61\x6f\xec\xfc\x10\xad\x4a\xbc\x9b\xd7\x0b\x81\xba\xd4\x43\xb9\xc3\xd5\x4a\x44\x75\x54\x7e\x47\x77\xf9\x3f\x09\x7c\x4c\xd7\xc8\xfe\xc6\x7b\x57\xa3\xc4\x6b\xe1\x16\xf6\x22\xe8\x8f\x68\x55\xe1\x5a\x11\x96\xcf\x79\x9c\x1d\x9b\x39\x6b\x49\x14\xde\xcc\xfd\x12\x09\x99\x91\x5e\x15\x35\x12\x5b\x32\x38\x98\xbc\xcd\xaf\x13\x5b\xce\x02\x03\x28\x00\xd1\xaa\xc6\xb5\xcc\x92\x7c\xaa\x7e\x3c\x3b\x36\xfb\xc3\xab\x6b\xf0\x8f\x6d\x15\x51\x79\xe2\xea\xda\xc0\x58\x37\x97\x4b\x17\x19\xbf\xbe\x9c\xa5\x1c\x0c\xa0\x40\x44\xab\x06\xd7\x32\xfa\xc6\xe1\x6f\x41\x26\x20\xa7\xca\x29\x44\x5a\xf1\xb5\xe3\xc5\xef\xbc\x4f\xae\x55\xa5\x1b\xdf\xf9\x5c\xef\x6a\xb7\xf8\x70\x9e\x85\x01\x14\x84\x68\xd5\xe2\x5a\xa9\xe3\xca\x33\x46\xb6\x64\xa5\x9e\x2c\xd5\xc5\x71\xa4\x33\xbc\xef\x5d\xf7\x7f\xb9\xc6\x0a\x7c\x99\xad\x3a\x1f\x54\xd1\x59\x44\x00\x03\xe8\x0a\xa2\x55\x87\xf7\xb4\xa1\xce\x4f\x92\xaf\x3e\x57\xbe\x79\x9a\xfd\x4a\x81\xd1\xfd\x8b\xc5\x82\x87\x16\xd9\x7d\x75\x2f\xda\x56\x2d\x27\x7a\x96\xad\xb1\xd6\x55\x44\xab\x1e\x6f\xff\x4a\x5a\x57\x74\xbb\xdc\x72\x56\x89\x8a\x9d\x94\x91\xf4\xd9\xb1\x18\x02\x82\xf1\x7d\x51\xd6\x3f\x25\x2e\x69\x9e\x67\x62\xb4\x01\x0c\xa0\x6b\x88\x56\x03\xae\x35\x7d\xb0\x2e\xbb\x93\x82\xd6\xdb\xe4\xe8\xb4\x9c\xaa\x13\xdb\x68\x6e\xed\x92\x61\xd1\x5f\x0a\x06\xec\x7d\x7f\x0e\x54\xff\xf3\xd8\x37\x18\xd1\x6a\xc4\xb5\xac\x8b\x14\x13\xce\xbe\xa9\x1e\x79\x16\xa2\x6a\x7f\x3d\xe8\x63\xd1\x33\xf5\xc2\x7e\xda\xe9\x8e\x2d\xbb\x0d\xab\x5c\x9e\x97\x0f\x21\x18\x40\x21\x88\x56\x13\xae\xb5\x35\x36\xd5\xd4\x16\xdc\xf5\x71\x2b\xe3\x4c\x9a\xfb\x5a\x6f\x95\xc8\xd9\xa6\xd3\x8a\x81\xfb\x4d\x56\xcb\xab\xbe\xeb\x2d\xc1\xde\x30\x80\x42\x11\xad\x97\xb8\xd6\xcb\x3b\x65\x04\x97\xc8\x1e\xe7\x54\x59\x71\x1d\x0b\xb5\x72\xbf\x28\xb9\xf2\xe0\x1c\x77\x6f\x69\xa8\xe2\xec\x61\x9f\x93\xe0\x19\x0d\x18\x40\x61\x88\xd6\x2b\xbc\xf3\xbd\x4f\xcd\x05\xb9\xec\x93\x01\x07\xc7\x23\x77\xd7\x24\xd4\x6a\xae\xf8\x2e\x58\x7a\x1a\xfc\x28\x36\x9e\xfd\x14\x4f\xdd\xbe\xce\x0b\x03\xe8\x3a\xa2\xd5\x8c\x6b\x39\x70\x4d\xfd\xd9\x32\x0b\x85\xe2\x47\x8b\x83\xe3\x5f\xe8\x15\xbe\xfd\xbc\xe9\xc5\xb8\x2c\xa7\xc1\x54\xed\x4e\x14\xe0\xef\x4f\x01\x03\xe8\x06\xa2\xf5\x1a\xd7\xa2\xf9\xca\xe7\x9b\x2c\x9c\xf4\x8c\xaa\xde\xe6\x28\x51\x66\xa3\x7d\xc6\xb8\x40\x3d\x66\xd8\x49\xa2\x71\x7b\x2d\x45\x2f\x3c\x9d\x11\x06\x50\xf8\x3f\x0c\x6c\xff\xf4\xd7\x71\xff\x1a\xd8\x5a\xf0\xbe\x33\xe3\x41\xdf\x9c\x24\xfb\xc3\x8e\x67\x77\x7f\x4d\xa8\x16\x46\x33\xb4\x58\xc5\xc5\xf2\x2e\x94\xc6\x5a\x59\x05\xa1\x04\x58\xa4\x60\x00\x45\x20\xae\x48\x2b\xde\x63\x13\xa8\x3c\xaa\x84\x43\x0f\x25\x1e\x44\x74\x72\x40\x37\xfb\xf3\xfd\x9d\xe6\xee\x26\x56\x5e\x5a\x5d\x85\xc6\xf5\x96\xb7\x4c\xf6\x30\x80\x60\x44\xeb\x0d\xae\xc5\x91\x91\xcc\xf0\x70\x02\x7d\x6b\xeb\x78\x72\x2e\x11\x95\x66\xad\xe3\x25\x31\xd2\x86\xb2\xc8\x5b\xbe\x70\x2e\xb1\xd8\xd6\x00\x15\x0c\xa0\x48\x44\xab\x0d\xd7\x3a\xdf\x53\xbc\x6c\x34\xdf\x4c\x3b\xfa\x5d\x74\x41\xfd\x29\x93\xa8\x4c\xa4\xf0\xa0\x45\x4b\x19\xbb\xd6\x95\xc8\x97\xa7\x9b\xc7\xe9\x61\x00\x45\x21\x5a\xed\xb8\x96\x9c\x48\x6e\x73\x48\x44\xa3\x9d\x66\xba\x9e\xf2\x5b\x57\x98\x89\x80\xe1\xc5\x29\x9b\x9e\xae\x37\xf1\xbb\xe1\x5d\xd2\xdb\x1a\x28\x18\x40\xd1\x88\x56\x07\xde\x77\xd8\xc4\xf6\xaa\x77\xdf\x70\x98\xdf\xb2\x96\x59\x5b\xda\xd0\x1c\x67\x4e\xe6\x3b\x5f\x18\x57\x41\x72\xad\xab\xe2\xd2\x2b\x4c\x24\xf6\x40\xb9\x89\x68\x75\xe2\x5a\x3b\x8f\xda\x18\x1d\x62\x94\xea\x3e\x3c\xcb\x48\x32\x95\x6f\xed\x9f\xed\x45\xad\xd3\xa9\xcb\xda\xbe\xc8\x59\xe9\xd2\xcc\x9b\xc6\xde\x71\xdd\x42\xb4\xba\x70\xad\xd6\x4b\x91\xe5\x0d\x8e\x45\x41\xf6\x14\x17\xb7\xda\x1e\x6e\x35\xbc\xbb\xa8\xd1\x41\x40\xd2\x93\xae\xb7\x7e\xae\x20\x7a\xb8\x0f\x3b\x48\xc6\x20\x5a\xdd\x78\xcf\xfb\x7d\x34\x79\x09\x8d\x2b\x5d\x74\x49\xfa\x5e\x90\x87\xd5\x88\x6f\x17\x3f\xa5\xae\xa7\x05\x4f\x0d\x28\xf9\x97\x6f\x6c\x75\x9c\x83\x01\x14\x8b\x68\xbd\xc5\x7b\x6c\xb2\xf9\x41\xa8\xff\x6a\x0e\x6a\xa4\x97\x15\xa3\xa4\xc4\xd3\xd3\xcb\x50\x59\xe5\x7a\xd5\x42\x68\xec\xbd\xe9\x8c\x64\xef\x53\xec\xb0\x7c\x1b\xd1\x7a\x87\x6b\x49\x25\x9c\xa8\x88\x44\xa5\x3a\x4a\x49\x2d\x8f\x1e\x34\xcb\xb7\xa5\xdc\xf1\xe7\xcd\x0a\xb5\x7b\xa8\x7c\xfa\x1b\x23\xf9\xb4\x5a\x00\x0c\xa0\x3b\x88\xd6\x7b\xbc\x1b\x95\x27\xec\x91\x95\xf7\xd0\xaa\x56\x2a\x54\x51\xf4\xbf\x45\x78\x22\x23\x06\xef\x6d\x7d\xd6\x5c\x12\x14\xb6\x8c\x3b\xbd\xdf\x8e\xbd\x40\xc4\x21\x5a\x3d\x78\xdf\x27\xd9\x30\x36\x77\xd8\xe8\xa2\xbd\xe0\xed\xeb\x13\xc6\x3d\x3c\x52\xba\x1c\xd7\x14\x6a\xe4\xec\xf5\x28\x59\x58\x6d\x38\x3d\x46\x02\x06\xd0\x5d\x44\xab\x17\xd7\x3a\x7b\xd5\xae\xe4\x16\x99\xf2\x68\xc5\xa4\x04\xb9\xed\xd8\x7d\xf3\xab\x71\x72\xb0\xf2\xe2\xdb\x1e\xfa\xca\x2e\xaa\xbd\xf2\x52\x6a\x18\x40\xf1\x88\x56\x1f\xae\x75\xa0\x12\x4f\x5c\x33\x72\x81\xe4\x51\x5f\xc4\x16\xc7\x17\x01\x0a\x72\xbb\x24\x77\x5b\xdf\xc7\x6a\xc6\xe5\x75\x73\x1e\x4c\x84\x62\x30\x80\x12\x10\xad\x7e\x5c\xeb\x4f\xd1\x94\x4d\x56\x98\x17\x8d\x5a\xc3\x14\xf8\x7c\xcd\xd8\x3e\xe4\x33\x89\x99\x5d\x9b\x31\xc5\x3d\x05\xb7\xdf\xcf\xa4\x6f\x62\x2f\x36\x89\x88\xd6\x00\xae\xf5\x76\x3e\x36\xa2\x56\xeb\xc0\x7d\xcf\x5c\x65\x45\xf1\x4c\xc3\xdc\xcb\x3e\xfa\xb2\x14\x19\x7e\x39\x2e\x99\x57\xe9\x1e\xa7\x04\xb1\x43\x43\x12\xa2\x35\x88\x37\x34\xec\xa4\x29\xff\x90\xb8\x98\x9f\x78\x77\x97\x20\xd9\x8b\x9b\x83\x51\xa1\xca\xc6\x46\xa2\x3a\xf1\xf2\x33\x20\x29\xec\x98\x75\x1e\x06\x50\x32\xa2\x35\x84\x6b\x19\xde\x61\xcc\x8a\x72\x3b\x75\x31\x73\x82\xef\xe0\xf1\x69\xa1\xd7\xf7\x0d\xce\xc6\x38\x5f\x1d\xcc\xea\xd1\x13\xd0\x3e\x5f\xcf\xee\x02\x03\x28\x05\xd1\x1a\xc6\xb5\x98\x12\xf8\x0a\x73\xee\xfb\x75\x4a\x9e\x8b\x70\xd8\x42\x19\xda\x5e\xec\xfb\xa6\xd8\x70\x92\x4a\x76\xfd\x94\x5d\x71\xf1\xe6\xb0\x39\x0c\xa0\x7b\x88\xd6\x07\xbc\x9b\x8b\x97\xe6\xb9\xec\x73\x62\xf7\xd8\x2a\x73\xd6\x37\x3f\xb1\xee\x92\x72\x3f\x9f\x11\x4e\xb5\xdd\x38\xeb\xab\xd2\xf6\x23\x56\x03\x3b\x48\xa6\x22\x5a\x23\xb8\x56\x13\x37\x97\x02\x33\x8d\xa2\x51\xce\xa0\x6a\xfd\xeb\x80\xe7\x12\x7f\xca\x39\x06\x60\x5a\x55\xe6\x5e\x12\xdb\xde\xc1\x32\x8f\x53\x30\x80\xd2\x10\xad\x51\x5c\x2b\xee\x65\x98\x02\x5f\x85\x4c\x81\xf8\x20\x8b\x70\x51\xb3\xc3\x27\xad\xaa\xee\x8d\x48\xcb\x1f\x8f\xf8\x6b\x63\x4c\x74\x98\x3b\x2e\xc2\x00\xba\x8f\x68\x7d\xc4\xb5\xda\x52\x43\x75\xa0\xf8\x2d\x2b\x2e\xb1\xeb\xef\xb8\x6c\xaa\xef\xf2\xa6\x9f\xa4\xf7\xb7\x5c\x3e\x7f\xc9\x95\x81\x3d\xf9\xc8\x10\x7b\xed\x48\x47\xb4\xc6\x70\xad\x92\x0f\x28\x93\xd5\xd5\x63\xdf\x67\x39\x93\x35\xcf\xf1\x94\xac\x7e\x66\xb1\x5c\xbe\x2b\x95\x1f\xa6\x6f\x56\xee\xa0\x6e\x6c\x8b\x5d\xc7\x0c\x44\x6b\x1c\xef\xbc\xea\xfb\xa7\x73\xf9\xb2\x0c\x66\x21\xb8\x44\xdc\x85\x6a\xeb\x3b\xa3\xbd\x1e\x41\xf0\xda\x74\x93\xd4\x5a\x56\x06\xb8\x20\x4d\x0e\x03\xe8\x01\xa2\xf5\x09\xd7\xfa\x75\xa5\x6e\xb2\xad\xbb\xbe\x6c\x31\xc0\xaf\x30\x46\x53\xc7\x8c\x5c\x72\x71\x53\xf6\xed\xa3\x53\x9f\x97\x73\x0e\xc9\xb8\x2d\xb0\xfb\x6a\x26\xa2\xf5\x19\xd7\xea\xcc\xeb\x23\xb6\x3f\xd1\xc8\x59\xdd\x7c\xc1\xe3\x02\x11\xcb\x7b\x15\xc2\x13\x32\xa6\x7d\x0a\x49\x8f\x33\x67\x1f\x92\x75\x2b\x89\xc3\x00\xca\x42\xb4\x26\x70\x2d\xf2\x90\x0e\xdd\xb5\xf7\xc6\x43\xba\x5f\xb2\xd5\xe5\xcf\x9b\x1d\xd7\xb5\xe9\x2c\x12\x5f\x16\x39\xec\x7d\xc5\xe9\x4e\x79\x62\x89\x0c\x06\x50\x36\xa2\xf5\x05\xef\x83\x83\x7a\xc3\x4e\xf9\x87\x8a\x22\xd9\xc0\x25\x44\x26\x20\xa3\x2e\x25\xa4\xfe\x90\xec\xea\xea\x67\xa7\x77\x0b\x22\xf9\xa7\xa9\x7d\x61\x00\xe5\x20\x5a\x93\x78\xd7\xda\x64\x01\x95\xab\x4e\xfc\xf7\x33\xcc\x09\x59\x15\xc8\x2e\xe8\xe4\x3a\x52\x76\xfc\x79\xb0\x2d\xe1\x71\x32\x75\xb5\x6b\xc8\x1a\x3b\xfc\xe5\x22\x5a\x53\xb8\x96\xb6\x3f\x39\xe9\x8c\x88\xdd\x9d\xd3\x31\xd4\x25\xe9\xce\x76\x7b\xb9\x10\x9d\x6d\xa7\xbd\x8f\xf4\x6e\xb8\xdf\x92\xf1\xed\x25\xec\x3e\xf1\xf0\x1f\x06\xb6\x7f\x8a\xa2\xfc\x35\xb0\x4d\xe3\xfe\x72\x6e\x29\x8e\x46\x85\xb3\xd3\x57\x7e\xb7\x7a\x9b\xb7\x49\xd6\x77\xdf\xd2\xaa\xde\xbf\xb2\xcb\x63\x68\xb7\x71\xee\xce\xa6\xfe\x13\xec\xe4\x99\x87\xb8\x22\x33\xb8\x56\x70\x04\x53\xb9\xae\x96\xd0\x8d\x81\xaf\x5f\xba\xb2\x35\x1e\x18\xe6\xd7\x1a\xe5\x19\x7d\x16\xe7\x9d\x6d\xa5\x89\x30\x31\x26\xc6\x5e\x6c\xf2\x11\xad\x59\xbc\xbb\x4a\x69\x8d\xfe\x3f\x07\xd0\xe3\xc7\xe5\x1b\x45\x61\x36\x0c\x14\x4b\xc0\xd0\xa4\xbe\xbc\xa6\xa8\x7e\x4c\xa7\x96\xf8\x5a\x9d\x3c\x0c\xa0\x02\x44\x6b\x0e\xef\x64\xe0\xa1\x7d\xe9\x11\x7a\xf8\x59\x98\x18\xdb\x58\x15\xd3\x78\x76\x4b\x71\xf8\xf7\xb5\x93\x52\x4b\x9a\x75\x51\x9f\x29\xcc\x18\xbc\x60\x00\x15\x22\x5a\xf3\x78\x3b\x11\x4a\x97\x52\xab\x48\x4e\xdc\x83\x61\x8b\x04\xa4\xbf\xda\x0d\xe8\x51\x3f\x4f\x4d\x3f\xaf\x76\x71\x45\x54\x2f\xf7\xc8\xcf\x18\x06\x50\x11\xa2\xb5\x80\x77\x71\x6e\xf6\x4e\xdf\x7b\xbf\x44\xc0\x71\xe9\x16\xc5\xfc\x08\xb3\xb8\xdb\x66\x0e\xd1\x95\xb1\x97\xed\x02\x84\x56\x0d\x66\x25\x0e\x5a\x30\x80\x1e\x21\x5a\x5f\x71\xad\xfa\xd3\x84\xb5\xd7\x5f\xb8\x69\xd0\xdc\x1e\x92\x10\xa2\xce\x98\xfc\xc3\x30\xd5\x77\x46\xf4\xd9\xad\xa6\x1a\x8e\x51\x90\xa1\x86\xb5\x1e\x23\x5a\x8b\xb8\x16\x6f\xee\xbd\x64\x66\x7f\x5f\x1d\x17\x7a\x89\x3c\x2e\xbf\xf3\x97\x8c\x05\x24\x83\xa6\x1c\x97\xee\xc5\x35\xfe\x16\x7f\xb5\x51\xec\x07\x03\xa8\x18\xd1\xfa\x86\x6b\x49\xe4\x67\xe7\xc6\xd2\x5b\xba\x62\x42\x82\xab\xe1\xe6\xc5\x94\x33\x7e\xbe\xb2\x0c\xbd\xba\x99\x5b\x7b\x8e\x56\xf5\x34\x63\x0c\x30\x80\x9e\x20\x5a\x4b\x78\xeb\x48\x1d\x1d\xaf\x56\x9f\xba\x76\xaf\xe9\x4e\x61\xdc\xf0\x49\xbe\xe8\x9b\x26\x55\xde\xb1\xa2\xf6\xaa\x82\xa8\x63\xc9\x12\x34\xd8\x93\x7a\x09\xa2\xf5\x1d\xd7\xf2\x24\xee\xdb\x22\x79\xd0\x8d\x6e\x27\x3e\x5b\x3d\xb6\x1e\x1e\x6e\x0f\xc5\x64\x6a\xbe\xd0\x6f\x11\x31\x8e\x6d\x61\x59\x6a\xc6\x9e\xa4\x4a\x11\xad\x65\xbc\xef\xf2\xf4\x65\x1e\x13\x16\xb9\x7a\xf7\xd8\x3c\x81\xf7\x99\xed\x8b\x16\xc6\x23\xe5\x9a\xa2\x43\x9f\xf2\xbf\xb5\x4c\x58\x24\x2a\xb1\xb3\xc2\x00\x7a\x8a\x68\xfd\xc0\xbb\x51\x11\xa0\xe8\xb8\x79\x69\x30\x22\xe0\xc0\xdd\xbc\x5f\xaf\x2e\x9a\xea\x0a\x5f\xc9\x71\xaf\xac\xc4\xee\x14\x47\xe3\x89\xa3\x3d\x39\x18\x40\x65\x88\xd6\x0a\xde\xe3\x1c\xff\xc4\xd3\x8e\xf6\xdc\xbc\xbe\xe4\xec\x0f\xa8\xed\x7b\x1c\x33\x89\x43\xae\x55\xf7\xb9\x42\x67\xf6\x82\xc6\xaf\x7d\xc7\x9c\x86\x01\x54\x8e\x68\xfd\xc4\xb5\xde\xab\x26\xbe\x86\xf6\xc9\xa2\x2d\x82\x3e\xf9\x36\x6b\xe6\x1c\xbc\xa2\x4b\x73\xe5\x72\x91\x1d\xe6\xea\x8f\x3c\xa3\x63\x9b\xeb\x01\x03\xe8\x19\xa2\xb5\x8a\x6b\xe5\x85\x7c\x7f\xf1\x46\x8f\x77\xae\x7e\xc5\xd4\x2c\xb9\x58\x48\xf2\x69\xb7\x50\xb9\x63\xd8\x83\x2c\xd6\x6f\x54\x51\x3e\x9c\x59\xca\x30\x80\x2a\x10\xad\x5f\xb8\x56\x37\x45\xb7\xd8\x10\xe6\x01\x85\xbf\x39\x6d\xb3\x33\xa3\xe3\xe8\x39\x0a\x83\xc4\xcc\x32\xbb\x3f\x6e\x51\x9a\x8c\xf7\x28\x24\xb1\x27\xe2\xe7\x88\xd6\x1a\xae\x35\x4f\x36\x57\xf9\xfa\xfd\xbd\x21\x66\x01\xa1\x54\x17\xee\xc4\xd0\x41\xc9\x07\xea\x7c\xa1\xb7\x55\x3a\x5a\x83\x84\x2f\x84\x92\xb2\xc0\x00\x7a\x81\x68\xad\xe3\x3d\x42\xa6\x14\xbe\xc5\xd2\xff\xf3\xc9\xf4\x38\xfd\x25\xe1\xdb\x49\xbd\x33\xea\x6e\x49\x9b\x14\xf3\x35\x06\x13\xda\x87\xd9\xd5\x23\xce\x30\x80\x2a\x11\xad\x0d\x5c\xcb\xff\x91\x35\xdc\x1a\x43\xea\xc0\x59\x61\xee\x22\x94\x35\x73\xb3\x5f\x5f\x78\xe2\x8b\x79\x8c\xaf\x83\xde\x47\xf5\x97\xb5\x41\x92\x30\x80\xaa\x10\xad\xdf\xb8\x96\xce\xbd\xa5\x8b\xe6\x31\x15\xb7\xab\x22\x19\x5b\x6b\xc5\x45\x84\xd2\x30\xb9\xc9\x12\x61\x31\x3b\xa1\x73\xd9\xef\x36\x4d\x3a\xb1\x37\x17\xd5\x88\xd6\x26\xde\xcd\xab\x30\xe3\x8b\xbb\xf7\x9e\x16\xc6\x26\x1f\x54\x5a\xbb\xb5\x4b\x72\x12\xdc\x6f\x7f\x45\x13\xbb\x02\xe8\x7a\xe9\x04\xc7\xbf\x63\x07\xc9\x1a\x44\x6b\x0b\xd7\xca\x74\x19\xf9\x7e\xc2\xee\xfb\x9b\xdf\x1f\x5f\xc6\xf4\xed\x46\x3f\x92\x0d\x7a\x67\x94\x2e\xc5\x0f\x97\xf5\xf1\x46\xd0\x3b\xf3\x63\x6f\x2e\x6a\x11\xad\x6d\x5c\x6b\x31\x3b\xaf\x95\x6e\xdd\x53\xfe\xa7\x29\x03\x0f\x66\x29\xaa\xca\xfe\xe9\xf9\xc1\xde\xc9\xac\xc8\x73\x32\x98\xb8\x83\x85\x19\x1f\x18\x40\x75\x88\xd6\x0e\xae\x35\x79\x55\x85\xeb\x46\x50\x2c\xcb\x9d\xde\x13\xf1\x27\x9b\x6d\xa2\xfc\xc7\x5a\x1a\x88\x67\x16\x53\x0e\xe4\x92\xdf\x72\x1d\x2b\xc0\x9e\xbf\xea\x11\xad\x5d\x5c\x2b\xf6\x51\xd4\x2e\xc3\xd3\xe6\xc9\xae\xfb\x12\x86\xbc\x4f\x1d\xe3\x66\x64\x8c\x42\x62\x29\x0f\x88\x7f\x52\x5d\xbb\xe1\xca\x5c\xad\x0a\x03\xa8\x01\xd1\xda\xc3\x7b\x84\x4c\xb6\xd2\xde\x3b\x14\x6d\x71\x38\x35\x6f\x43\x3c\x11\xf3\x83\xa0\xc9\x59\x3f\x38\x7f\xf1\xed\x64\x54\x10\xdb\xa3\x27\xd1\xd8\xa1\xa1\x11\xd1\xda\xc7\xb5\x24\x77\x02\xe3\x35\x2f\x1f\xb8\x1a\xb9\x38\x49\x1f\x37\x4f\x53\xb1\x25\xe0\x25\x4b\xcb\xb8\xd9\x6c\x6e\xf3\x9c\xef\x82\x58\x86\x3d\x0c\xa0\x26\x44\xeb\x0f\xde\x13\x28\x45\xbf\x94\xa5\xee\xe2\x44\xb7\x6b\xfd\xd5\x8f\x2f\xa4\xfa\x1c\xde\xfa\x56\xa8\xae\x92\x22\x2f\x3a\x24\xe4\xe5\x4e\xd1\xa1\x0b\x03\xe8\x25\xa2\x75\x80\x6b\x29\xf7\xb7\xb3\x9d\x29\x53\xa0\xa8\x7e\x42\x57\x3e\xe3\x9e\x22\xaa\x76\x91\xeb\xce\x7e\x65\xd3\x0c\x81\xc4\x29\x09\xd6\x7e\x1d\xec\x50\xfa\x0a\xd1\x3a\xc4\x1b\xe2\x15\x0e\x23\x72\xeb\x19\x56\x5e\xf5\x69\x9a\x1c\x2f\xb3\x12\x67\xa0\xf6\xa0\x51\xa6\x1e\x63\x98\xcd\xd8\x1a\x74\xa9\xd2\x23\x85\x01\xd4\x8c\x68\x1d\xe1\x5a\x0d\x0d\xb0\xe7\xd5\x09\x87\x53\xed\x74\x28\xd1\x8e\x33\x24\xc9\x34\x9f\x3e\x98\xdc\x73\x91\x37\x0d\x72\x87\x49\xfa\x1a\xbc\xbc\x61\x00\xbd\x46\xb0\xfa\x69\xff\x5d\x9a\xee\x7f\x07\x36\x80\xc6\x2b\xae\x91\xe8\xc4\x37\x25\x0f\xd1\x9d\x04\x73\x92\x99\x56\xbe\x4d\xe1\x44\x5c\x32\xfa\x71\x33\x32\xce\x7a\x87\x69\x31\x5d\xe5\x28\x0e\x18\x40\x88\xc5\x35\x80\xc6\x6b\xae\x99\x94\xa2\x03\xf6\xbc\x16\xaf\x13\xdf\x4f\x78\x29\x79\xe5\xc4\xec\x3d\x13\xd1\x85\x0b\x32\x1f\xb4\x4a\xe5\x02\x1d\xc2\x0e\xfa\x14\x61\x00\x21\x36\xd7\x00\x1a\xaf\xba\x06\xb4\xe7\x77\x4b\x6c\x66\x9d\xde\x68\xef\x1e\x53\xba\xb7\x34\x91\xb1\xc7\xa5\x53\xb8\x48\x12\x40\x11\x3d\xd2\x78\xe3\x21\x17\x23\x0c\x20\xc4\xea\x1a\x40\xe3\x75\xd7\x78\xca\xea\x59\x15\xe8\x5e\x88\xab\xaa\x1b\xb8\x64\xea\xee\xc7\x55\xe7\xf8\x2a\x90\x09\x31\xa6\x9d\x09\xd4\xcf\x16\x5f\x79\x45\x08\x03\x08\xb1\xbb\x06\xd0\x78\xe5\xb5\x49\xf6\x1f\x59\x0d\xb3\x1b\x21\x6c\x5b\x49\xbc\x42\xbe\xc7\x27\xcb\x3d\x2c\x2f\x69\x35\xa4\xb0\x7c\x8f\xee\x30\x61\x12\xaa\xc1\x6e\x33\xc4\xf2\x1a\x40\xe3\xb5\xd7\x86\x49\x33\x64\x0d\x52\x55\x08\xa9\xb4\x1d\xc4\x32\xfc\x46\x2d\xad\x1a\x3b\xab\x18\x4b\xcd\xaa\x3b\x87\x53\x3b\x65\x1d\xae\x5b\xc1\x00\x42\x6c\xaf\x01\x34\x5e\x7d\xcd\x39\x87\x41\x74\x2e\xc8\xf2\xd4\x73\x16\x05\xf5\xf9\xcf\x4f\x96\x33\x1c\xd5\xc2\x7a\xc7\xec\xa9\x2d\xb6\x46\xbe\x64\x1b\xbd\x55\x82\x01\x84\x58\x5f\x03\x68\xbc\xfe\xda\x54\x85\x5f\xe2\xe8\x9c\xf1\xa5\x94\xdd\x98\xe6\x88\x65\x77\xc9\x2f\x4d\xb6\xde\x75\x49\xa9\x91\x29\x7e\x9b\xe6\x1d\x52\xbb\x62\x30\x80\x10\xfb\x6b\x00\x8d\x57\x60\x63\x7d\x69\x43\xf2\x7c\xfa\x1d\xe6\xf5\x93\x82\x07\xe3\x2c\x22\x6c\xcb\xa2\x13\x99\x9c\xa3\x5b\x79\x11\x60\xf9\x67\x92\xa7\x92\x06\x0c\x20\xc4\x02\x1b\x40\xe3\x35\xd8\x9a\x9f\x69\xbe\xa0\xb5\xe5\x3c\x69\xd2\x4c\xe0\x25\x79\xcd\xbf\xe6\x75\xd1\x9e\x3b\xdb\xb3\x2e\xbd\xd6\x12\x66\xf6\x09\xc6\x64\x75\x18\x40\x88\x0d\x36\x80\xc6\xab\xb0\x3d\x2b\x8c\xf8\x42\x8b\xea\xe4\x8a\x29\xcf\xab\x3f\xd1\x6a\xbf\x49\x19\xf5\x5d\x22\x49\x55\x8c\x3c\x34\xb3\x0f\xb5\x5a\x69\x79\x02\x06\x10\x62\x85\x0d\xa0\xf1\x3a\x6c\x02\x79\xb3\x83\xb5\x92\xf1\x0b\x43\x8d\x3f\x56\x0d\x5b\x8b\x13\xc8\x3f\x0e\x18\xad\xba\xec\x2d\x58\xce\xd6\xec\xc9\x7c\x20\x42\xc3\x00\x42\xec\xb0\x01\x34\x5e\x89\x8d\xc5\x5a\xca\x43\xc4\xb6\x85\x79\xcb\x27\x20\x6a\x2c\xf3\xcb\xfe\x76\x96\x26\xe1\xcb\x24\x5e\x7b\x3b\x54\xbf\x88\x8d\xaf\xa0\x19\x0c\x20\xc4\x12\x1b\x40\xe3\xb5\xd8\xc6\x25\x6d\x45\xca\x4f\x08\x87\xcd\x1a\x0f\xd5\xf8\x1a\x74\xab\x0e\x7a\xc5\x8f\xb2\x65\xb0\x18\x4d\x7d\x1f\x26\x41\xb7\xac\x5e\x80\x01\x84\xd8\x62\x03\x68\xbc\x1a\x9b\xc2\x33\x2f\x95\xa3\xec\x37\xed\x4d\x0f\xf3\xfb\x3a\x1a\x4a\x1f\x6a\xb7\x7d\x66\xfa\xe3\x74\xe1\x2d\x43\xbb\xc7\xf5\x21\x7b\x0f\xec\x7e\x86\x58\x63\x03\x68\xbc\x1e\x9b\xfe\x78\x1c\xa1\xb5\x4f\x5a\x78\x15\x77\x00\xbb\x19\x77\x18\xb9\xf1\x20\xbb\x9d\xc2\x93\x86\xf4\x9a\x58\x72\x5d\x99\xf5\x1e\x1a\x18\x40\x88\x3d\x36\x80\xc6\x2b\xb2\xad\x3a\x94\xdf\x8c\x7c\xcf\x12\x70\xab\xb8\x3a\x6e\xe7\xf7\xad\x2b\xe5\xd7\xcb\x2b\x1d\xfd\x3c\x43\xdc\x0d\x0a\x6d\xc7\x5d\x46\x51\x30\x80\x10\x8b\x6c\x00\x8d\xd7\x64\x63\xe5\x9f\x32\x24\x2c\x53\x50\xc1\x70\xb5\x2e\x95\x34\xf7\x05\x72\x0e\x16\xf1\xb5\x19\x75\x31\xd9\xa9\x1e\xdf\x31\xcc\x2f\x36\x81\x01\x84\xd8\x64\x03\x68\xbc\x2a\xdb\xc3\x48\xa1\xa1\xbb\xd6\x7f\x4a\xbd\xe9\x30\xb1\xaf\xba\x06\x22\x82\x78\x22\xdd\x52\x3d\xa0\x44\xf6\x3f\xf3\x0d\x84\x0c\x4e\xd8\x6b\x3f\x62\x95\x0d\xa0\xf1\xba\x6c\x2f\xbe\x4b\x0d\x88\x71\xb3\xda\x07\x8d\x9e\xe0\x6a\xb9\x71\xfd\xbb\x33\x6f\xd6\x61\x5c\xac\xbc\xbd\xfe\x87\x8c\x99\xdc\x96\x61\x7a\x18\x40\x88\x5d\x36\x80\xc6\x2b\xb3\x45\x9e\x7c\x71\x8c\x5b\x5f\x4d\x00\x33\xbd\x79\x76\xb5\x94\x72\x78\x6a\x50\xe4\xbc\x9b\xb0\xa8\xba\x8e\x6e\x12\xb4\x5c\x74\x0b\x7b\xf7\x82\x58\x66\x03\x68\xbc\x36\xdb\xd1\x83\x5f\x8e\x37\x0b\x9a\x39\x7f\x89\xd9\xbf\x17\xfb\x24\xcd\x17\x70\xa8\x24\x78\xe1\x62\x08\xba\xc8\x10\x5e\x39\xf8\x5c\x8c\xbd\xe5\x40\x6c\xb3\x01\x34\x5e\x9d\xcd\xdc\x27\xa6\xad\xe2\xa6\x7a\x5c\xf3\x2b\xf4\xaf\x70\xd6\xa1\xed\x5f\x13\xe5\xa7\x66\x8c\xa3\x59\x06\x78\x1c\x2d\xf5\xde\x92\x62\x8f\x4d\xc4\x3a\x1b\x40\xe3\xf5\xd9\x22\x2a\x94\x49\xc2\x7c\x9e\x63\x04\x2d\x0e\x45\x86\xb9\xb5\xa9\xeb\xe6\x7b\x65\x6e\xd8\xca\x8f\xd6\x8f\x3d\xd7\x4e\x6e\xa5\xc5\xbe\x01\x88\x7d\x36\x80\xc6\x0b\xb4\xd9\x89\x66\x68\x72\xb0\x88\x6a\x5c\x5f\x7b\xf3\xf9\xc9\x5d\xa0\xf2\x82\xec\xad\xcf\x44\xf5\x1b\x1e\x58\x4c\x3a\x3d\x54\xf7\x9c\x08\x0c\x20\xc4\x40\x1b\x40\xe3\x15\xda\xae\xe9\x47\xf4\x64\x08\x55\x36\x2d\xa6\xbc\xee\xb0\xdc\xfd\x2d\xa9\xe9\x95\xe6\xc5\x33\x25\xb4\x88\xd1\x55\x92\x53\x40\x85\x02\x18\x40\x88\x85\x36\x80\xc6\x4b\xb4\xc5\xd8\xa1\xa3\x12\x3b\xdd\x95\x3e\x68\x8d\xee\xe6\x50\x4b\xdb\xfc\xe2\x1b\xfc\x53\xb5\xc2\xc5\x66\xc6\xed\x9d\x09\xba\x53\x2e\xc1\x00\x42\x4c\xb4\x01\x34\x5e\xa3\xed\x97\x84\x9a\x5c\x9e\xba\x07\x11\x57\x81\x7e\xc6\x3c\x6f\x99\x88\xc1\x0d\x83\xf2\x86\x44\x06\xf5\xa6\x45\xb6\x90\xaf\x24\x25\xd8\x61\x0e\xb1\xd1\x06\xd0\x78\x91\x36\x37\xb3\xbb\x97\x17\xcd\x8f\x89\xb4\xbf\xf3\x8b\x2d\x57\xd5\xf4\xae\x65\x89\xf0\x98\x48\xfe\x7e\x47\x72\xab\x8f\xe0\xf8\x08\x17\x13\x0c\x20\xc4\x48\x1b\x40\xe3\x55\xda\x2e\x4d\x8c\xde\x21\x72\x78\x81\xfe\x4d\xa5\xa6\x11\x70\x42\x7b\x77\xff\x0a\xcd\x64\x94\xaf\x5a\x6b\xcd\x3c\x47\xd2\x16\x6f\xd4\x19\x18\x40\x88\x95\x36\x80\xc6\xcb\xb4\xf9\x34\x18\x48\x1f\x48\x88\xf7\x53\xf6\x6d\x8f\xbf\xab\x3b\x16\xc1\x25\x2f\xad\x25\x62\x78\x6f\xd0\xea\x70\x22\xd0\xa3\x32\x12\x7b\x38\x21\x66\xda\x00\x1a\xaf\xd3\x66\xf4\x63\xfc\x94\x7e\xaa\xf5\xc8\x9b\xd7\xb6\x27\x37\x38\x3e\x89\x3f\xfa\xba\xff\xed\x8e\x46\x0b\xbd\x43\x62\x71\xc6\xb3\xdb\x23\xd8\xa1\x15\xa9\xd3\xf6\x3f\x03\xdd\x3f\x05\x84\xff\x1e\xe8\xf0\x42\x6d\xa7\xa9\x65\xaf\x89\x9d\x8d\x99\xa1\xa6\x9c\x21\xe2\xb9\xff\xfa\x53\x9a\x5b\xf0\x75\xbe\x8e\xb4\xeb\xe3\x13\xdf\x33\x6f\xcf\x74\xb0\xc1\x00\x42\x0c\xb5\x01\x34\x5e\xa9\x6d\x99\x5e\x2c\x41\xe5\xd5\x97\xc6\x30\x17\x95\x26\xcf\xf6\x7b\x97\xd5\x5f\xa5\x38\x9d\x5e\x93\x84\x57\xe8\xbb\xeb\xf8\xa5\x7a\xad\x61\x00\x21\x96\xda\x00\x1a\x2f\xd5\x36\x6e\xeb\xba\xb3\x13\x1c\xd5\x7c\x59\xa9\x50\x51\x3c\x92\xb0\x79\xfa\xf5\x86\xbb\x98\xc5\xd5\xae\xdf\x29\x77\xdf\xcf\x8c\xbb\xba\xc3\x00\x42\x4c\xb5\x01\x34\x5e\xab\x8d\x79\xd2\xe1\xba\xf1\xae\x43\x4c\xc2\x7d\xe3\x8a\x4f\x87\x61\xc6\xaa\x95\x03\x16\x66\xfe\x9c\xa5\xa9\x17\xd7\xc6\x2f\x3d\xf8\xcf\xd8\x84\xd8\x6a\x03\x68\xbc\x58\x5b\x43\xde\x47\x0a\xd7\xa1\x47\x79\xab\x4b\x87\xae\xe5\x0b\x05\xdf\xfd\xa4\xf5\x38\xea\x5c\x0d\x60\x7e\x7f\xbb\xb0\x95\x42\x6f\xec\xa4\x83\x18\x6b\x03\x68\xbc\x5a\x9b\x75\x43\xcd\x98\x73\x25\xc3\x09\xc6\xc1\xab\x4e\x53\x0f\x3f\xa5\x9a\xbc\xeb\xa8\x9b\x53\x86\xe8\xb5\x0d\xf8\x6e\x87\x1a\x0f\x72\xc1\x00\x42\xac\xb5\x01\x34\x5e\xae\x6d\x72\xe5\x78\x41\xce\x05\xa9\x1b\x0f\x06\xa3\xbe\x5c\x3f\x57\xba\xc1\xf3\x45\x9a\x6d\x5c\xe5\xb4\xe1\x48\x81\x56\x01\xac\x5a\x03\xc1\x00\x42\xcc\xb5\x01\x34\x5e\xaf\x6d\x29\x58\xe9\x5e\xfd\xa6\x30\xb7\x23\xd9\xca\xf8\x75\xf7\xcd\xc1\x3b\xcd\x33\xf4\x0b\x6f\x1f\x04\x9b\x59\xcc\x62\x8c\xbe\xb0\x61\x77\x0d\xc4\x5e\x1b\x40\xe3\x05\xdb\xa6\x1d\x44\x0e\x5c\xa7\xd5\x9e\x0e\x59\x48\x8c\x98\x59\x5a\x26\x2a\x5c\xa4\xf6\xc8\xd2\x79\x4d\xc0\x5a\xaa\x71\x77\xc2\x59\x8e\x1f\x06\x10\x62\xb0\x0d\xa0\xf1\x8a\x6d\xba\x68\x5e\xbe\xfc\x29\x8c\x4c\xd9\xda\xc0\x88\x7c\x11\x5d\x92\xe0\x9d\xd7\xec\xb7\xe4\x7c\x36\xca\xa8\x52\xef\xf4\x68\xca\x7a\xc1\x00\x42\x2c\xb6\x01\x34\x5e\xb2\xed\x40\x2f\xf1\x53\x0d\x7f\xf0\x41\xc2\x82\x57\x7e\x1b\x91\x6e\x68\x5b\x98\xa4\xa5\xd1\xd4\x0d\x45\xd5\x45\xcc\x66\x51\x99\x23\xf6\x95\x21\x26\xdb\x00\x1a\xaf\xd9\x46\x53\xff\x52\x4d\x9e\x0a\x53\x34\x95\x90\xea\x70\xe0\x68\xa3\xcf\x19\x44\xfe\x3b\x92\x49\xa0\xbc\x93\x2b\xcb\x3e\xd5\xa7\x9c\x16\x06\x10\x62\xb3\x0d\xa0\xf1\xa2\x6d\x91\x6f\xd3\x64\x3c\x5c\x0f\x35\xe3\x6e\x72\xc2\x31\x4a\xbb\xda\x2f\x1d\x74\x6b\xb5\x14\xb9\x63\xb6\x3c\x28\x4a\x9c\x7a\x04\xce\xc2\x00\x42\x8c\xb6\x01\x34\x5e\xb5\xed\xdb\xfe\x37\x4b\x2b\xc6\xe2\xbd\xf1\xc3\x07\x41\xb5\xde\xb7\x46\x96\x87\x82\x08\x47\x16\xee\xf7\x25\xed\x1c\x19\x33\xf3\x8e\x61\x4f\xcd\x88\xd5\x36\x80\xc6\xcb\xb6\x35\x9e\x52\xd8\x1d\x79\x6f\x15\x91\x57\xc7\xb3\x67\x47\x4b\x04\xa2\xc9\x9f\x7d\x72\xb6\x2d\x1c\x9c\x6b\xfb\xe3\x24\x1f\xa6\xa3\x0f\x03\x08\x31\xdb\x06\xd0\x78\xdd\x36\xe3\x83\xa1\xa3\x87\x14\xa3\x4c\x4d\xd5\xb7\xcc\x7b\x35\x7c\xea\x17\x37\x72\xe7\xab\x6f\xbe\x63\xa1\x0e\x70\x3f\x7a\xf4\x29\x9e\x0f\x06\x10\x62\xb7\x0d\xa0\xf1\xc2\x6d\xa7\x5a\x33\xe3\xc8\x21\xbe\x22\x37\x76\xef\x5a\x13\x2f\x61\x59\x96\xa5\x2f\xb3\x33\x42\xeb\x92\xc7\x68\xf2\xef\xf7\x3a\x0b\x6a\xc2\x00\x42\x0c\xb7\x01\x34\x5e\xb9\x6d\x02\xc3\xf0\x67\xc3\x69\x07\x12\x70\x0e\xfd\x76\x5c\x8b\x7b\x6e\x5b\xce\xd8\x51\x5d\xb2\x73\x95\x27\xea\x72\xdf\x00\x1c\x89\xbd\x68\x20\x96\xdb\x00\x1a\x2f\xdd\x26\xe3\xa5\xe1\x37\x2a\x44\x2e\x39\x7b\xe6\x83\x9a\xf9\xf5\xf2\x44\x69\xe9\xd6\x0a\x2d\x4e\x0b\xcd\x2a\x2a\x6f\x0a\x8a\xbe\x2b\xa6\x30\x80\x10\xd3\x6d\x00\x8d\xd7\x6e\x93\x29\x7a\x62\x44\xcf\xa8\x79\xfb\xe7\xd7\x36\xdd\x4c\x8f\x38\xf4\x2a\x5d\x03\x11\xe9\x8e\x6c\x94\x75\x9e\x25\xdd\xf0\x77\x2d\x5e\x18\x40\x88\xed\x36\x80\xc6\x8b\xb7\x7d\x5d\xf1\x4c\x08\x2e\xb8\x7d\x71\x74\xac\xaf\x94\x26\x8c\xd2\xb1\x97\x4f\xe7\xe1\xf5\x95\xf9\x97\x8e\xf5\x1d\x45\x11\x3a\xd3\x96\x30\x80\x10\xe3\x6d\x00\x8d\x57\x6f\x7b\xb4\x57\x14\x43\xfc\x61\x93\xa4\x5c\x2c\xc3\xfc\x60\xe7\x91\x87\x57\x8b\x8b\x84\xce\x57\xab\xd2\x9d\xee\xc6\xd7\xc9\x69\x43\xd8\x1b\x07\xc4\x7a\x1b\x40\xe3\xe5\xdb\x9e\x0d\x06\x1e\xd6\x1a\x2c\xfb\x15\xe6\x3e\x7e\x7c\x27\x2b\x81\xd9\xdd\xaa\xed\x67\x88\x70\xda\x12\x67\xa1\x6f\x1c\x9b\xf9\x69\xec\xc9\x11\x31\xdf\x06\xd0\x78\xfd\x36\x92\xcf\x19\xbd\xf5\x01\x8e\x6f\x95\xb3\xa1\x25\xa1\xfa\xa4\xf3\xb2\x5d\x33\x57\x54\x9f\x07\x52\x34\xcf\x59\xb5\xa1\x73\x6e\x63\xc7\x26\xc4\x7e\x1b\x40\xe3\x05\xdc\x84\xe5\x25\x74\x5d\x83\x24\x29\x0b\x9b\xba\x1a\x52\x94\xa2\x15\x0c\xb7\x73\x35\x75\x87\xf5\xb8\x62\x16\xa4\xb9\xef\x9e\xb7\xc6\x62\x88\x01\x37\x80\xc6\x2b\xb8\x71\xcd\xd9\x56\x37\x18\xfb\x07\x9f\xde\x8e\xaa\xa4\x2d\x22\x79\x96\xe1\x61\xc8\x8e\x96\x1a\xd2\x01\x19\x09\x57\x13\x9b\x89\x15\x60\x00\x21\x16\xdc\x00\x1a\x2f\xe1\x46\xe4\x7a\xe5\x5c\x92\x69\x61\x3c\x6f\x8f\xd6\xde\xd6\x84\xb5\xbd\xac\xea\xac\xcd\x6b\x7d\x9b\xe4\x36\xab\xdf\x73\x2b\x6f\x4a\x2e\xc3\x00\x42\x4c\xb8\x01\x34\x5e\xc3\x6d\xca\xe2\xed\xb3\x63\xbd\x36\x44\x7d\x94\xc6\x92\x19\x5d\x85\xb9\xb2\xa9\xa1\xeb\x27\x68\xc4\x9b\x37\x7a\x50\x5b\x85\x4b\xef\x2e\xc2\x00\x42\x6c\xb8\x01\x34\x5e\xc4\xad\x24\x64\x6e\xc0\x42\x4e\x3f\xfb\xd4\x0c\x55\xe2\x35\x95\xab\xf6\x6c\xbf\x72\xfb\xc4\xea\x35\x38\xac\x9c\xa8\xbb\x5c\x5a\xff\xf3\xa5\x5b\xc4\x88\x1b\x40\xe3\x55\xdc\xac\x4a\x57\xff\xb8\xca\xdd\x4b\x9c\x5c\x74\xe6\xfb\x48\x29\x68\x12\x22\x62\x39\xa8\xfa\xf6\x0b\xd3\xb8\xb5\xa7\xb4\xd7\xf2\x2a\xf6\x8a\x8e\x58\x71\x03\x68\xbc\x8c\x5b\x1b\xc1\x4e\xb4\xb8\xfb\xdc\x4b\xdf\x31\x26\x98\x50\xf7\xa1\xfb\x3e\xbf\xd8\x54\xd3\xf1\x80\xc7\xea\x74\xc5\xcf\x87\xed\xac\xb0\x33\x18\x62\xc6\x0d\xa0\xf1\x3a\x6e\x76\x74\xa4\xc7\xf6\xde\x1f\x7f\xfd\x91\xb9\xe7\xe1\xb7\xf7\x5f\xad\xdb\x7c\xee\x3f\x5a\x18\xce\x9e\xfd\x66\xf7\x63\xf7\xeb\x4d\x07\x6d\x18\x40\x48\x1d\xb7\xff\x19\xe8\xfe\xe9\x9f\x79\xf8\x7b\xa0\xc3\x0b\xb9\xe5\xba\x6e\xbf\x34\x56\xf9\x9d\xea\x7d\x93\x35\xf5\xbe\x8c\x4a\xa1\x8f\x14\xfa\xd9\xc9\x4c\x4d\x41\x21\xf7\x68\x0d\x85\x3e\x1f\x72\x18\x10\x22\x86\xdc\x00\x1a\xaf\xe4\x76\x8a\xe4\x4c\x9b\x46\x95\x4d\x53\xfa\x90\x6f\x09\x53\xdf\xe9\xde\x31\x96\xc7\xe5\x6e\x46\xee\xcf\xc5\x7b\xf8\xc3\x4a\xe0\x32\x36\x18\x10\x22\x96\xdc\x00\x1a\x2f\xe5\xf6\xde\xc2\xac\x8a\x65\xc5\xd4\x63\xd7\xc1\xec\x21\x4f\xe6\x16\xac\x9d\x49\xcf\x23\xdf\xfb\xba\x21\xf9\x75\x73\xe7\xde\x1f\x75\x00\x03\x42\xc4\x94\x1b\x40\xe3\xb5\xdc\xfc\x58\xc5\x3e\xaa\x4a\x9b\x91\xa5\x26\x97\x3f\x71\x52\x5e\xbf\xed\x5f\xbf\xcd\xbe\xc3\x78\xca\x93\xe4\x66\xd0\x5e\xed\xe2\x8c\x18\x0c\x08\x11\x5b\x6e\x00\x8d\x17\x73\xbb\x4a\x14\x50\xac\x35\xb9\x69\xe7\x9d\xbd\xe8\x69\x26\xfb\xd1\xc4\x50\xb4\x92\x43\x38\xd3\x57\xc7\x8c\xb4\xf6\xf3\xa3\xbe\x49\xec\x6a\x22\xc6\xdc\x00\x1a\xaf\xe6\xe6\x44\x7b\x25\xe2\xc8\x65\x2c\x8d\x30\xa1\xe1\x54\x8f\x19\x4b\x5c\x70\x41\xe6\x37\x73\x88\x67\xef\x1b\xf9\xc9\x20\x4d\x9f\x3f\x04\x30\x20\x44\xac\xb9\x01\x34\x5e\xce\x6d\xcb\x37\x7b\xb8\xac\x44\x6a\x4c\x50\xf6\xea\x5e\x5a\x76\x41\x48\x2b\x29\xc1\xf3\x9b\xc3\xdf\xd7\xa6\xa8\x44\xc7\x83\x3a\xd3\x89\x61\x40\x88\x98\x73\x03\x68\xbc\x9e\xdb\x60\x65\x69\xcb\x85\x9f\x7d\x76\x95\x9f\xd1\x54\x66\xaf\x9e\x74\x57\x37\x41\x66\x61\x5e\xf5\xa8\xd0\x52\xbb\xdc\x22\xde\x9b\x6e\x30\x20\x44\xec\xb9\x01\x34\x5e\xd0\xad\x28\x26\x41\xf3\xb9\xbd\x8d\xf9\x24\x9b\xd0\xec\xaf\xae\xed\xcc\x1a\x17\x7b\x37\xb2\x95\x0c\xd7\x9c\x36\xf3\x95\xaa\x2a\x41\x21\x18\x10\x22\x06\xdd\x00\x1a\xaf\xe8\xf6\x55\xb1\x8f\xbe\xba\x49\x46\x7d\xa3\x4f\x6a\xda\xf1\xad\xa7\x89\xde\xed\x87\xb0\xbf\xba\x9c\xa0\x4b\xcc\x1f\xf6\x47\x7b\x39\x24\x30\x20\x44\x2c\xba\x01\x34\x5e\xd2\x2d\xcc\x48\xf0\xf5\x3b\xc6\x72\x48\xf9\xac\xeb\xc7\x57\x89\x56\x5c\x28\x61\xee\x99\xd5\xa9\xc9\xa3\x97\x5f\xc4\x12\xf7\xbb\x9a\xa8\x60\x40\x88\x98\x74\x03\x68\xbc\xa6\x9b\xed\xd9\xad\xc9\x61\x57\x81\xe2\x3b\x1f\x5c\x3e\x2b\x96\xaf\x9e\x09\x9c\x68\x3a\x3f\xae\x11\x3e\x99\xcc\x67\x6f\xb9\x56\x30\x78\x16\x06\x84\x88\x4d\x37\x80\xc6\x8b\xba\x45\x7a\x7b\x70\xc7\x36\x89\xdd\xa3\xf8\x20\x7a\xd6\x38\xcb\x8a\x6d\x44\xab\x36\xc4\xe6\xd6\x21\xc9\x97\xce\x2d\x8d\xfd\x8a\x02\x45\x18\x10\x22\x46\xdd\x00\x1a\xaf\xea\x76\x78\xf9\x49\xad\xa7\x67\xae\x28\xf3\x85\x99\xd8\x29\x72\xcb\xed\x2a\x17\x57\x6a\x2b\x66\x6d\xb3\x82\x47\xce\xd7\x58\xbe\xd9\x63\x0f\x27\xc4\xaa\x1b\x40\xe3\x65\xdd\x2a\x62\xcd\xa8\x23\x1e\xa0\x4e\xac\xa7\xbd\x9e\xe1\x61\xbc\xbd\x2e\x96\x05\x77\xde\x1b\x7e\xb1\xc4\x6d\xe0\xde\x18\xcf\x54\x4a\x0d\x03\x42\xc4\xac\x1b\x40\xe3\x75\xdd\x7a\x7e\x4c\x57\x33\xf4\x5a\x32\x9a\xf5\x9e\x5f\x11\x82\x9f\x27\xc4\x7f\x5d\xbe\xea\xf3\x46\x92\x5e\xcb\x52\x2f\x7e\x6d\x6c\x53\x1c\x06\x84\x88\x5d\x37\x80\xc6\x0b\xbb\x41\xc5\x26\x6c\x52\x65\xc3\x51\xfe\xf5\x1d\x83\xc6\x7c\x1a\xe0\x6d\xfc\xe8\x28\x86\x47\x6a\x6e\xe2\xe8\xa0\x40\x11\xbc\x3c\x03\x03\x42\xc4\xb0\x1b\x40\xe3\x95\xdd\xaa\x4d\xb3\x32\xfa\xe4\x23\x34\xa4\x4a\x5d\x5d\xa3\x9a\x15\x3d\x4f\x6c\xfa\x7c\xaf\xd8\x0e\xa6\x0a\xf1\x79\x2c\x1f\xb9\xd6\x62\x03\x03\x42\xc4\xb2\x1b\x40\xe3\xa5\xdd\x38\xbd\xa0\xd7\x8f\xcf\x5d\x1d\xec\x60\x69\xd0\x31\x8c\x50\x53\xb3\x3b\x48\x13\xef\x0f\x8d\x08\xf1\x38\x1a\xfe\x50\x2e\x7a\x03\xbb\xcd\x10\xd3\x6e\x00\x8d\xd7\x76\x8b\x67\xf9\x90\x28\x10\x4f\x44\xc4\xc9\xb2\x27\xe6\xb0\xee\xb6\xdd\x93\xcf\xb2\x2d\xa7\x7a\x91\x9d\x62\x85\xe8\x0e\xab\xe8\x0a\x0b\x0c\x08\x11\xdb\x6e\x00\x8d\x17\x77\x4b\xb3\x69\xe2\x2e\x3a\xa5\xf8\x4e\xc0\xdf\xf7\x59\xe1\x3b\x3b\x43\xca\x08\xe1\x8b\x86\xf1\x2e\xcf\x5f\xad\x65\x2b\x49\xd4\x86\xf2\xc3\x80\x10\x31\xee\x06\xd0\x78\x75\x37\xb2\x1b\xba\xea\xc9\x3a\x29\xc0\xb4\x91\x16\x96\xbb\x5d\x20\x57\x6a\xb9\x68\xcf\x9f\x68\x9e\x62\xad\x25\x7f\xc6\x2d\xb3\xdd\x0f\x06\x84\x88\x75\x37\x80\xc6\xcb\xbb\x7d\xe4\xe2\xfc\x69\x43\x9e\x47\x32\xf3\xcc\xca\x79\x7d\xcc\x45\x82\xb2\xe5\x1c\x85\xd1\x16\xaf\xb0\xce\x7a\xd0\x05\x45\x91\xe7\xd8\xab\x13\x62\xde\x0d\xa0\xf1\xfa\x6e\x49\xe8\xdb\xd1\xfb\x79\x67\xa6\x98\x16\x0e\x34\x9d\x03\x0b\xec\xde\x49\xf1\x79\x17\xd8\xe9\xda\xb4\x5b\x40\x46\x56\xc1\xfd\x58\x0c\xb1\xef\x06\xd0\x78\x81\x37\x07\xdb\xe0\xcc\xca\x61\xef\x6b\x04\x42\x71\x7c\x2b\xe7\x62\xa3\xb8\x48\xae\x05\x9e\x0e\xe2\xbc\x17\xb2\x5f\x76\x25\x8f\xf8\xb7\x1c\x0c\x08\x11\x03\x6f\x00\x8d\x57\x78\xab\x2e\xfe\xb5\x9c\xb7\x8d\xd9\x8a\x98\xb7\xa0\xe0\xf4\x14\x08\x1e\xb8\xf2\x3a\xfb\xc2\x6c\x70\x97\x76\x54\xa0\x6c\x9e\xb9\xdd\x39\x18\x10\x22\x16\xde\x00\x1a\x2f\xf1\x96\x71\x4e\x3f\x59\x57\xba\xe5\x67\xfa\x6c\x9f\xdd\x6b\xf5\x15\xc7\x37\x93\x77\xe0\x05\x26\x48\x37\x23\x60\x69\x3c\xfd\x42\xac\x09\x0c\x08\x11\x13\x6f\x00\x8d\xd7\x78\xd3\xdc\xcf\xb5\xbb\x52\xb0\xee\x4a\x28\x63\xec\xea\xc6\x04\x28\xee\xb4\x69\xcd\x79\x79\x5d\x7b\x6f\x56\xde\xd5\x77\xf0\x3a\x84\x1d\x06\x84\x88\x8d\x37\x80\xc6\x8b\xbc\xfd\x49\x37\xb8\xce\xc6\x0a\x5d\xeb\xb2\x11\x6a\x33\x0f\xe0\xb7\x88\xb2\xfe\xf4\xd1\xa8\x06\xbc\xd8\xa5\x2a\x96\xa6\xb3\x2e\xf7\x80\x01\x21\x62\xe4\x0d\xa0\xf1\x2a\x6f\x2d\xc4\x23\x56\x65\xdb\xfd\xf1\xa5\x81\x7d\x6c\x5e\xcf\x53\xa9\xae\x4a\xd7\x86\x6b\x30\x70\xd2\x09\x9c\x7f\x38\x55\xfa\xa6\x5e\x12\x06\x84\x88\x95\x37\x80\xc6\xcb\xbc\x9d\xd7\xfd\x6d\xb4\x5f\xff\xb2\x87\xba\xc8\xaf\x35\xf1\xf2\x61\xd3\xeb\x73\x04\xeb\x01\x59\x3e\xc0\xa5\x36\x30\x44\xaa\x6e\x8f\x11\x06\x84\x88\x99\x37\x80\xc6\xeb\xbc\x15\x48\xde\xe4\x2e\xab\xfd\xed\xa0\xfd\x48\x52\xae\xda\x49\x49\x39\xd2\x7a\x57\xaf\xe5\xf9\xb9\x50\x8b\xa4\x5c\x50\x6b\x76\xc2\x01\x06\x84\x48\x9d\xb7\xff\x19\xe8\xfe\xe9\x1f\xe3\xfa\x7b\xa0\xc3\x0b\xbd\xb9\x6d\xf6\xff\xe9\xc9\xf9\xf9\xf4\x9b\x86\xa3\xf8\x9e\xa1\x06\xea\x56\x71\xdd\xc7\x8b\xde\x17\x7e\x8a\xcc\x96\x56\x87\x3e\xfc\x84\x1d\x01\x10\x43\x6f\x00\x8d\x57\x7a\x6b\xec\x38\x61\x66\xd8\x1a\xc2\x14\x4c\xfe\x54\x60\xab\xd1\x35\xf4\x64\x59\xa0\xce\x40\x8f\x5c\xc3\xa3\x64\x36\x2a\x62\x76\xe6\x93\x30\x20\x44\x2c\xbd\x01\x34\x5e\xea\x8d\xdb\xd4\x77\xb0\xde\xe0\x8a\x85\xc5\x37\xd5\x20\xad\x47\xd2\x55\x61\x9f\xea\x0a\xd4\x44\x38\x36\x65\xaf\xb9\xeb\x2b\x7e\x7d\x88\x81\x01\x21\x62\xea\x0d\xa0\xf1\x5a\x6f\x3d\x4c\xef\x12\xbb\xed\x29\xd5\xd6\x86\x93\x1e\x72\xeb\xbd\x78\xa3\xa9\x4d\x62\xaf\x68\xe9\xdc\xfa\x88\x26\xa5\xff\xc2\x9b\x5a\x59\x18\x10\x22\xb6\xde\x00\x1a\x2f\xf6\x96\x9f\xd4\x15\xaf\xd1\xe3\xd4\xfc\x6e\x89\x46\x7d\x73\xa0\x53\x82\x87\xb2\x8d\x83\x01\xa8\x7e\xee\x09\x91\xba\x5f\x8d\x9a\x71\x81\x01\x21\x62\xec\x0d\xa0\xf1\x6a\x6f\xc5\xbf\x79\x9f\xee\x89\x1c\x9f\x5f\x85\x55\x25\x2c\xc7\x6c\x28\xd5\x43\x17\xd2\x35\xa7\x07\x6c\x64\x74\x58\x8b\xba\x5e\x5b\x2b\xc3\x80\x10\xb1\xf6\x06\xd0\x78\xb9\xb7\x54\xd2\x7d\x57\xcf\x75\xba\x2b\xa7\xf8\xab\xd5\x3c\xa2\xbb\x58\xcc\x95\x88\x0c\x6d\x08\xe9\x97\xee\x72\xf0\x47\x25\x40\x3d\x56\x30\x20\x44\xcc\xbd\x01\x34\x5e\xef\x8d\x72\x4d\xaf\x3c\x2e\x7e\xf5\x90\xa2\x69\x95\x4c\xa3\xe0\x83\x70\xdc\x7a\x42\x76\xed\xe9\x2f\x6d\x87\xa5\x35\xd3\x5a\xc4\x59\x17\x60\x40\x88\xd8\x7b\x03\x68\xbc\xe0\x9b\x7e\x4c\xc3\xfb\xfb\xee\x51\x93\x1a\xc7\x61\xfa\xa5\x73\x33\x51\x4e\x92\xdb\xa9\xf7\x9a\xda\xf3\x1f\xbf\xec\x1c\xbd\xb4\x61\x81\xdd\x66\x88\xc1\x37\x80\xc6\x2b\xbe\xd5\x5d\xdd\x49\xbb\x42\x4d\x0e\x1c\x96\x17\x26\x29\xf5\x72\x46\xb3\x53\x7f\x97\x19\x66\x95\x1e\x91\x2b\x86\xf1\x1c\x2f\xf9\x29\x0f\x03\x42\xc4\xe2\x1b\x40\xe3\x25\xdf\xa8\x3f\x17\x91\xe7\x7c\x7c\xd6\xf0\x20\xd1\x79\x83\xd9\x2e\x49\xf7\x30\x5e\x8f\x7b\x9b\xcd\x5c\x8c\xd9\x28\xf8\xe6\xb7\x46\xd2\xcb\x30\x20\x44\x4c\xbe\x01\x34\x5e\xf3\x2d\xa3\xbc\x3c\x38\xe3\xab\x9f\xcd\xbe\xb7\x8e\xf4\xe1\x1d\xa5\xab\x2c\x5a\x19\x29\x9e\x2f\xd8\x48\xe3\xee\xf4\x13\x6d\x2f\x9c\xc6\xce\xfa\x88\xcd\x37\x80\xc6\x8b\xbe\xed\x8e\xfa\x9c\xb9\xf2\xdb\x74\x2e\x21\xbd\x4f\x2a\xe1\xb0\x51\x3a\xf4\x8d\x78\xe6\x09\xe6\xff\x1f\x73\xef\x1d\x4f\x75\xff\xc7\xff\x3b\x38\x64\x64\x4b\x6f\x5b\x46\xc3\x9e\xd9\x3b\x23\x23\x23\x5b\x59\x21\x45\x24\x09\x21\xc7\xde\x23\xca\xcc\x2a\x33\x23\xb2\xb7\x22\x2b\x64\x13\x09\xd9\x3b\xb2\xc9\xef\xd6\xe7\x73\x1d\x5f\xd7\x5b\xe7\x7a\x5f\xdf\xdf\xb7\x3f\x3e\xb7\xdb\xf5\xe7\xfd\xf6\x3c\xbd\xce\xfb\x71\xbd\x5f\xaf\xf3\x38\xef\x73\xe7\x4b\x17\xf6\x19\x7b\xf3\x45\x79\xdc\xaf\xc3\x09\x4a\xe9\x1b\x00\x03\x59\xdf\x3a\x29\x9f\x5a\xe5\xf7\xe0\x92\xe4\x38\x16\xf5\xa6\x47\x7d\xe6\xf4\xa8\x0a\x17\xb3\x6e\x5d\x97\xa5\xd9\x86\x67\xb1\x6e\xc9\xdf\x42\x00\x70\x94\xd6\x37\x00\x06\xd2\xbe\x89\x9c\x35\xbc\xcb\xeb\x60\xdc\x9b\x2f\xff\xcd\xaf\x12\xb6\xf7\x19\xd0\x97\x30\x30\x69\xe9\x08\xad\x4a\xba\x1b\x6d\xd3\x59\x61\x87\x00\xe0\x28\xb5\x6f\x00\x0c\xe4\x7d\xbb\x92\xf9\xee\xb6\xf4\xaa\xa9\xff\xb6\x7a\x69\x68\xca\xf2\xb7\x40\xe7\x69\xc4\x54\x94\x79\xe2\xd5\xcf\x7a\xb5\x1d\xa3\x3e\x2f\x7f\x1d\x9b\x50\x7a\xdf\x00\x18\x48\xfc\x66\x78\x91\x9e\xc0\x8d\xfe\x8c\xf0\x13\x6b\x2b\x9f\x8d\x5a\x1f\xf6\xcd\xfb\xca\x33\x06\xa6\x57\x69\x56\xdd\x46\x44\x54\xdf\x28\x71\x22\x00\x38\x4a\xf1\x1b\x00\x03\x99\xdf\x6e\xe2\x5a\xb9\xdf\xa9\xda\xac\x1f\x5f\x9d\x42\x6f\xb7\x0a\x95\xad\xc0\xed\xd3\x6d\x90\x70\xfd\xfe\xf2\x06\x55\xfb\x8a\x6c\xba\x3d\x02\x80\xa3\x34\xbf\x01\x30\x90\xfa\x6d\xf5\x03\x86\xdb\x0b\xd6\x86\xfa\x8d\x1a\x36\xe5\xb3\xd5\x3b\x18\xcc\xf8\xf9\xfa\xe2\x2f\xe8\x5f\x25\xef\xbd\x65\xbe\xaa\xb1\x22\x8c\x00\xe0\x28\xd5\x6f\x00\x0c\xe4\x7e\xab\xa3\xa9\x77\xeb\xdd\x8a\xde\x77\xbe\xe5\xab\xd2\x69\xee\x74\xe3\xab\xb0\xcf\x50\x73\x5f\x1d\x8e\x6e\x62\x6c\x0e\xd3\xd2\xd3\x9b\x08\x00\x8e\xd2\xfd\x06\xc0\x40\xf2\x37\xfe\xf1\xfb\x7c\x69\x32\xfe\xb7\xdb\x61\x09\xc2\x22\x99\x7a\xb8\x81\x0c\x82\xd2\xa1\xf6\x29\x92\xe5\x1b\x4e\x9c\x9e\xcd\x23\x2c\x08\x00\x8e\x52\xfe\x06\xc0\x40\xf6\x37\xf5\x74\xe9\x2c\x1b\x0f\x46\xeb\x61\xae\xf6\x87\x53\x8c\x01\x37\xdd\x6e\x04\x3a\x5b\x7f\x57\xbb\x3a\x13\xf4\x8d\xc2\xcb\x02\x17\x07\x01\xc0\x51\xda\xdf\x00\x18\x48\xff\x76\xfe\xc2\x7e\xbe\x77\x37\xe3\x23\x9c\x57\x5b\xca\xb5\x94\x51\xdf\x0a\x9c\xef\xda\x2d\x58\xd9\x91\x87\x0b\xea\x36\x3a\x74\xb5\xfe\xba\x00\x28\xf5\x6f\x00\x0c\xe4\x7f\x9b\xdb\x31\xad\x11\x79\x47\x67\xe6\x94\xbd\x52\x76\xde\x35\x20\x43\xbf\x36\xb0\xa2\xad\x87\xe5\x2d\x40\x5a\x5e\xf8\x50\x04\xcd\x04\x01\xc0\x51\xfa\xdf\x00\x18\x48\x00\xc7\x6b\xa3\xa4\x3c\xe3\x96\x95\xab\x41\xcd\xdd\xe1\x11\xcc\x27\x24\x6d\xba\x39\x7c\x55\xba\x59\x1b\xc3\x8b\x82\x3f\x71\xca\x9f\x07\x01\xc0\x51\x0a\xe0\x00\x18\xc8\x00\xd7\x7a\x3b\x73\x4a\x9c\x9e\xd6\x8a\xe9\x15\xb7\xad\x49\xe9\x87\x1d\x1f\x4b\x66\xa2\x98\x32\x7b\x9a\x51\x77\xbe\x32\x97\x4f\x55\x70\x04\x00\x47\x69\x80\x03\x60\x20\x05\xdc\x34\xaf\x58\xc6\x24\xff\xf7\xd7\xaf\xbf\x1e\x10\x5e\x8b\x9e\x5d\xe8\x56\xad\x34\xf0\xb1\x14\x7f\x36\x81\xa6\xd3\x56\x33\xed\xf5\xeb\x7e\x86\x52\x01\x07\xc0\x40\x0e\x38\x91\xd2\x73\x43\xc5\xdc\xe7\x30\x6f\x7d\xdc\x79\x90\xb9\xaf\xb3\x5a\x0e\x7f\x25\x74\xbf\x7c\xac\xe3\xe2\x3e\xa9\xe7\x5b\xe6\x73\x04\x08\x00\x8e\xd2\x01\x07\xc0\x40\x12\x38\x4e\xc2\x94\xb9\x03\x58\x0d\xc9\x4e\x84\xb5\x18\xd1\xfd\x0e\x8c\x4a\x39\xc3\xfa\x2e\x71\x05\xf3\x90\xfb\x55\x3d\x36\x85\xd2\x5a\x08\x00\x8e\x52\x02\x07\xc0\x40\x16\xb8\x38\x06\xc9\x3a\xb4\xaf\xb7\xdb\x72\x9e\x00\x7a\x5d\xad\xf7\x7e\x64\x54\x72\x11\x6f\xfb\x2b\xaa\x08\x12\x46\x90\xee\xde\x76\xf9\xb5\x07\xa0\xb4\xc0\x01\x30\x90\x06\x4e\x9b\xd9\x07\xd6\x08\x17\x9a\x6d\x8a\x6d\x9b\xf9\xb4\x5d\x3f\x77\xf3\xd4\xc5\xfc\x37\x22\x9f\xb2\x7d\x5c\xe9\x8c\xe5\xa3\xfa\xaf\x23\x00\x38\x4a\x0d\x1c\x00\x03\x79\xe0\x98\x84\x6f\xf2\xdf\x61\xad\xaf\x51\x30\x3e\x77\xff\xd5\x65\x81\x1a\xad\xec\xef\xe8\x4d\xbe\xd9\xd9\x36\x3c\x9b\x2d\x08\xf7\xec\x73\x08\x00\x8e\xca\x03\x87\x3c\xd0\x41\xfd\xc9\xd4\xe3\x07\x3a\x90\x08\xce\x75\x27\xc7\xc8\xc2\x5f\xf8\x6e\xbc\xbc\x83\x53\x65\x54\x07\xc9\x17\x5d\x74\x7e\x60\xd3\xb9\xc9\x09\xae\x9f\x67\x5d\x65\xaf\x86\x00\xe0\x28\x45\x70\x00\x0c\x64\x82\x0b\x3d\xb5\x4e\xaf\xe7\x35\x52\x5e\x98\xa5\x56\xee\xfc\xe8\xa1\x63\xfa\xe4\xf0\xca\xe7\xcb\x76\x4f\x42\xd4\x2e\x86\xd9\x5b\xbd\x97\x42\x00\x70\x94\x26\x38\x00\x06\x52\xc1\xb5\x6d\x68\x05\xca\xf1\xdc\xd4\x9f\xa5\x43\x27\xc1\x3b\x54\x92\x49\xd3\x1e\xda\xce\xba\xae\xae\x3a\xea\xd8\x1f\x4d\xbe\xaf\xf9\xeb\x08\x80\x52\x05\x07\xc0\x40\x2e\xb8\x4b\xe8\x95\x84\xef\x29\x32\x98\x69\xd6\xea\x34\xd4\x60\x67\x97\xde\x7a\x97\xe6\xb2\xc9\xc9\x7b\x1a\xb4\x4c\x47\xf6\x95\x90\xc1\x10\x00\x1c\xa5\x0b\x0e\x80\x81\x64\x70\xd3\x52\x9b\x64\xe5\x4c\x66\x38\xed\x8f\xe6\x42\x29\x35\x5d\xcd\x89\xb4\x49\x0b\xa7\x95\x9a\x16\x02\x6a\x4e\xf1\x68\x49\xe6\x33\x20\x00\x38\x4a\x19\x1c\x00\x03\xd9\xe0\x84\xbc\xb9\xe4\xd1\x9c\xb5\xa5\x35\x35\x86\x6f\xa9\xf1\xdf\xc1\x7b\x57\x97\x66\xf3\x89\xb3\x2e\x77\x86\x51\x3d\xfe\x82\x1d\x16\x29\x02\x80\xa3\xb4\xc1\x01\x30\x90\x0e\xae\xed\x27\x31\xfa\xe7\xde\x5e\x9b\xbe\x36\x39\x35\xba\x29\xc5\xf6\x97\x09\x69\xfc\x51\xf8\xb8\x9c\xf0\x0b\x5d\x0e\xf2\x9a\x07\xea\x08\x00\x8e\x52\x07\x07\xc0\x40\x3e\x38\x89\xca\xb1\xb8\x08\xbc\x64\xc1\xbb\x6d\xd5\x32\x95\x43\x9b\xdf\x16\x3c\xdc\x8d\x61\xbb\x86\x3b\xd4\x84\xaf\x7e\xae\xc5\x5b\xa2\x21\x00\x38\x4a\x1f\x1c\x00\x03\x09\xe1\xce\xad\x88\x91\xd4\x32\x9e\x27\x11\x3e\x9b\x1c\x3c\xa9\x93\x96\xb6\x3e\xc5\xb4\xbb\x79\x50\xd9\xab\x10\x1d\x65\x6e\x4f\xd3\xa9\x8c\x00\xe0\x28\x85\x70\x00\x0c\x64\x84\xbb\x56\x71\xae\x08\xf3\xc6\x46\x95\x1c\xcf\x0b\x43\xd6\x78\x4c\xf2\x83\x5b\x43\xeb\xf1\x62\x69\x3b\x1c\xca\x8b\x62\xa1\xc3\x12\xe6\x08\x00\x8e\xd2\x08\x07\xc0\x40\x4a\x38\x97\xdc\xba\xfa\xa5\x85\x74\xf9\x4c\x2d\x0b\xb1\xa5\xd9\x19\xfa\xb3\x73\x1e\xeb\x17\xc5\x2a\x35\x72\xbb\x05\x82\x94\x1b\xc3\xa9\x11\x00\x1c\xa5\x12\x0e\x80\x81\x9c\x70\xbe\x6b\xd6\x77\x5e\x8b\x0c\x48\xd2\x5c\x3a\x23\xf3\x20\x28\x5c\x14\x16\x39\x60\x5d\xd0\xf4\x86\x8c\xb3\xc3\xbd\x27\xbf\xe9\x2d\x33\x02\x80\xa3\x74\xc2\x01\x30\x90\x14\x8e\xbe\x88\x3e\xea\x9e\xf3\xd7\xa1\x5e\x9d\x94\xfb\xdb\x7e\x4f\x9e\xb5\xd1\x79\x97\x92\xbe\x1d\x8a\x1b\xa5\x97\x23\x64\xcb\xb8\x4a\x83\x00\xe0\x28\xa5\x70\x00\x0c\x64\x85\xbb\x8d\xe8\xae\xbb\xc7\x64\xd6\x19\xa1\x7d\xef\xae\x0d\x0e\xdc\xff\xd1\x6d\xcb\x31\xa3\x50\xcd\x1b\x8d\xac\x3a\xa6\xe2\x4f\x9f\x28\x21\x00\x38\x4a\x2b\x1c\x00\x03\x69\xe1\xe2\xe9\x1e\x2a\x95\xea\x74\x96\x70\xcf\x6b\x3c\xde\xc8\xd0\xa6\x4b\x3c\xaf\xce\x19\xab\xf8\x09\x6b\x00\xf7\x8a\xad\xcb\xc5\xef\xbf\x86\xa1\xd4\xc2\x01\x30\x90\x17\xee\x13\xee\x77\x18\xc5\x54\xd7\xe8\x5d\x82\x6a\x43\x25\x3f\xee\x19\xcb\xdc\x27\x2e\xf4\xe8\xe8\x17\x13\xc6\x33\xc9\xdb\xb8\xa8\x64\x10\x00\x1c\xa5\x17\x0e\x80\x81\xc4\x70\xe7\xaf\xbc\x6f\x0d\x63\x78\xcd\x77\xa3\x68\x81\x35\xd5\xe0\x0c\xab\xc6\xda\x58\xc8\x70\x0f\xcd\xfa\x3c\xc9\x2b\x74\xbc\xbe\x72\x46\x04\x00\x47\x29\x86\x03\x60\x20\x33\xdc\x26\xdd\xec\x73\x3d\x8a\xd9\xbd\xf3\x95\xf4\xee\x3b\x7d\x9f\xd0\x4b\xec\x58\xc6\xa2\x32\x5a\xf9\x1a\xb8\x86\x2d\x52\x86\xcf\xe8\x20\x00\x38\x4a\x33\x1c\x00\x03\xa9\xe1\xce\x0a\xab\xe7\x8a\x08\xaf\x34\x47\x66\xe1\x71\x61\xb9\x00\x0d\x81\x4a\x4a\xfe\x7c\xb4\x6c\xf5\xef\x3e\x86\xcd\x32\xab\xd3\xea\x23\x00\x38\x4a\x35\x1c\x00\x03\xb9\xe1\x0a\xd7\xc5\xde\xf7\x5d\xdc\x15\x88\x75\xb5\x50\xfa\x3c\x21\xb3\x9c\x36\x3f\x4d\x15\x37\x83\x6d\x7d\xc3\xb5\xd7\x82\x46\x8c\xc9\x1a\x01\xc0\x51\xba\xe1\x00\x18\x48\x0e\x77\xfb\xe9\x6b\x3a\x33\xb3\x87\x8f\x26\x49\x3f\x3e\x3f\x05\x63\xe4\x9c\xe1\x3c\xb5\x79\xda\x9b\xd2\xd7\xfd\x9c\xe8\x9d\xf7\x0e\x32\xbf\x42\x8b\x52\x0e\x07\xc0\x40\x76\xb8\xeb\xb1\xad\xe8\xb8\x5e\x9c\xfa\x19\x95\xc9\x12\xb9\x41\xdd\x95\xbb\xb3\x46\xe3\xd8\x04\x16\x9b\x18\x5d\x78\x2f\x22\x57\x71\x7e\x7d\x0a\x41\x69\x87\x03\x60\x20\x3d\xdc\x59\x76\xcc\xf4\xe8\x36\x32\xaf\x2e\xa2\xe7\x49\xe8\x5c\xdf\x8b\x0f\x1d\x0d\xeb\x23\x36\x25\xf5\xcd\x37\xc3\xc6\xc7\x1d\x19\x28\x11\x00\x1c\xa5\x1e\x0e\x80\x81\xfc\x70\x83\xf7\x07\xa9\xd6\xf8\x24\x54\x49\x03\x73\xf8\xf3\x9d\xdd\x7b\xd3\x27\x98\x35\x2c\x75\x4f\xbf\x98\x59\x32\x34\xb6\x3c\x7d\x4b\x1a\x01\xc0\x51\xfa\xe1\x00\x18\x48\x10\x47\xae\x68\x2c\xfd\x36\x6e\x41\x51\x32\x5f\x6f\x60\xc0\xf1\x50\xc0\xc0\x3a\xb7\x8c\x4d\x6e\xcd\x90\x89\x04\x5b\x00\xff\xde\xd2\xaf\x8f\xce\x28\x05\x71\x00\x0c\x64\x88\xc3\xc3\xb8\x75\x9b\x75\x9a\x6e\x3c\x90\xc4\xdb\xf5\x41\x3e\x6d\xf5\xb7\xfc\x27\x02\x24\x96\x8c\x17\x72\x78\x26\xb9\xd2\x99\x34\x7e\xed\x4e\x28\x0d\x71\x00\x0c\xa4\x88\xb3\xfb\x59\xf4\x76\x9f\xee\x9a\x95\xb4\x24\xf7\x88\xf2\xf3\xd3\x12\xec\x19\xc2\xbb\x6d\xdf\x2e\x7c\x08\x92\xa2\xd4\x8c\x31\x2b\xb1\x40\x00\x70\x94\x8a\x38\x00\x06\x72\xc4\x19\xf7\x70\xe3\xd6\xdf\x2d\xd0\xfc\xd9\xdc\x2d\xc2\xd6\xf5\x48\x5b\xfd\xd2\xd3\x1a\x49\xab\x2a\xdf\x77\xf6\x18\x6e\x25\x09\xff\xb9\xd3\xa2\x74\xc4\x01\x30\x90\x24\xae\x03\x91\xaf\xbe\x33\xf6\x29\x25\xe6\x85\xd1\xeb\xbc\x11\x56\xe1\x90\xd0\x65\x04\xc0\xf3\xf0\xe7\x9c\xc3\x1c\x16\x7d\x0d\x31\x2f\x02\x80\xa3\x94\xc4\x01\x30\x90\x25\xce\x0e\x3e\x64\xba\x28\x28\x74\x96\xa6\x49\x68\xed\xfa\xee\x03\x11\xcd\xf3\x19\x67\xf7\x97\xcf\x39\x34\x1e\xf8\xe4\x72\xdd\xdd\xfa\x75\xa2\x46\x69\x89\x03\x60\x20\x4d\x9c\x4a\xa5\xe8\xf3\xf6\x40\xa3\x44\x9c\x75\x27\xfd\x40\x8b\xf4\xc1\xcc\x52\xbf\xc0\x9d\xec\x42\xd3\xd2\x4b\xd2\x82\x91\x34\x46\xbf\x6e\x41\x28\x35\x71\x00\x0c\xe4\x89\x73\xb3\x16\xfe\xb0\x46\xb6\xa2\xfa\x8a\x52\x31\x83\xd1\x51\x75\xe6\xed\xb7\x77\xe5\xf7\x3f\x90\x24\x4b\x99\x5c\x9a\x0b\x50\x4e\xb1\x41\x00\x70\x54\x9e\x38\xe4\x81\x0e\xea\x0f\xdb\x1f\x3f\xd0\x81\x44\x71\xec\xf6\xa4\xdd\xeb\x65\x82\xe7\xf4\xa2\x18\xdd\xf8\xe6\x1b\x5e\x64\x57\xcc\x2f\xd8\xdf\xf5\xcf\xe8\xc2\x18\x70\x65\xe1\x93\x39\x8d\x00\xe0\x28\x45\x71\x00\x0c\x64\x8a\x03\x52\xaf\x67\x65\xac\x15\x18\x04\x0d\xd5\x39\xb6\x0f\x65\x09\x3c\x78\x30\xfd\x41\x4d\xfe\x4b\x0d\xfa\x9e\x4a\x0d\xe2\x76\xf9\xaf\x33\x18\x4a\x53\x1c\x00\x03\xa9\xe2\xbc\xec\x69\x93\x15\x7d\x5f\x7d\x8c\xe0\x9e\xe4\x6e\x19\x63\xfb\x12\xf9\x72\xdc\xd1\xf3\xdb\x9d\x41\xc2\x6a\x23\x01\x56\x74\x82\x5f\x59\x42\xa9\x8a\x03\x60\x20\x57\x9c\x50\xb9\x9a\x69\x32\xc3\xc3\x61\xcc\x6f\xdf\xeb\x71\xfb\xe2\xa8\xbd\xbf\xb7\xe7\xf8\x6b\x54\xe8\x91\x49\x16\x38\x75\x12\xdd\xfa\x75\x6e\x45\xe9\x8a\x03\x60\x20\x59\xdc\x82\x71\xea\x4b\x7c\x8c\x9c\x85\x9b\xce\xc5\x12\x73\xa1\x67\x0c\xc5\xd2\x63\x10\x1c\xcf\xcf\x98\x4d\x3e\xe6\x1b\xbf\x21\xed\x8c\x8d\x00\xe0\x28\x65\x71\x00\x0c\x64\x8b\x53\x10\x3f\xe7\xb8\x40\xa5\x2f\x27\xa9\x39\xe8\x9b\x4a\x5e\xaa\x7b\xaa\x6c\x8e\x63\xf0\x7d\x97\x10\xa7\x82\x32\xed\xfe\xc0\x20\x1d\x02\x80\xa3\xb4\xc5\x01\x30\x90\x2e\x0e\x48\x13\x5a\xcc\x83\x7d\x48\x58\xd2\x64\x39\xfb\xb0\xf8\x65\x48\x36\xda\x4f\x57\x7a\xd2\x7b\x7c\x77\x62\x5e\x30\x4a\x2a\x7c\xfb\xb5\x9d\xa1\xd4\xc5\x01\x30\x90\x2f\xee\xfa\xd7\xdb\x71\xb6\x0d\xec\x4f\x83\x47\x08\x99\x7c\x83\x03\x02\xa2\xd5\xeb\xa2\x9f\xa1\xeb\x76\xea\x18\xbe\x93\xf6\xc8\x27\xfc\xf5\x89\x16\xa5\x2f\x0e\x80\x81\x84\x71\x01\xfd\x69\xba\x36\x05\xaf\xf6\x87\x76\x0c\x74\x07\x47\x2a\x94\x06\xce\x39\x97\x0c\xe2\x63\x2d\xa8\x12\x8b\x4e\xa2\x33\xaa\xfe\x3a\x1d\xa2\x14\xc6\x01\x30\x90\x31\xae\x74\x92\x80\x1a\x4e\x77\xb3\x08\xb1\x88\x15\x94\xa6\x57\x7f\x20\x75\xef\x07\x25\xab\xbf\x30\xc3\xb6\xe8\xb9\x9e\x7e\x47\xdc\x8b\x08\x00\x8e\xd2\x18\x07\xc0\x40\xca\xb8\x3d\xd5\x0c\xb2\x72\xf1\xfb\x45\xe5\x4c\x4b\x0e\x5a\x6e\x54\x98\xa1\x6e\xa4\x35\x49\xef\x0b\xae\xa4\x5f\x8a\xfd\xe6\x78\xb7\x45\x1e\x01\xc0\x51\x2a\xe3\x00\x18\xc8\x19\x37\xae\xa0\x5a\x78\x93\x99\x40\xf4\x13\xef\xd3\x56\x69\x3e\x79\x6f\x5d\x7e\xb2\x27\x05\xd3\x96\xe1\x37\x6d\x93\x46\xa2\xea\x7a\xed\x10\x00\x1c\xa5\x33\x0e\x80\x81\xa4\x71\x0d\x9c\xdd\xed\xd7\x1d\x6e\x91\x3f\xdf\xdb\xaf\xa8\xf6\xde\x28\xb1\x28\xe2\x49\x10\x40\x6c\xb7\xe4\x3c\x8e\xe9\x6f\xe0\x76\xfd\xf5\xb9\x11\xa5\x34\x0e\x80\x81\xac\x71\x9f\xb5\x9b\xd3\xb9\x7d\x58\x9f\xb8\x44\x26\xf9\x3e\x95\x99\xaf\x8d\xe3\x22\xa0\xda\x71\x9a\x77\xa1\xb9\x3c\x86\x7e\xd6\x52\xfe\x2c\x02\x80\xa3\xb4\xc6\x01\x30\x90\x36\x0e\xef\x2c\xa3\x52\x95\x3a\xb9\xf5\x72\xbf\x52\x63\xa8\x4a\x7a\x62\xc8\x62\xfa\xa9\xab\x4a\xe5\x12\x84\x71\x82\xba\x3f\xed\x6a\x0c\x10\x00\x1c\xa5\x36\x0e\x80\x81\xbc\x71\xdf\xbd\x8c\xb4\xf3\x31\xef\x4d\x62\x04\x7d\x1f\x59\xad\x56\x17\x4a\xad\xae\x58\xb9\xba\x6e\xec\x54\xb7\x22\x9b\x1b\xe4\xeb\xc2\x85\x00\xe0\x28\xbd\x71\x00\x0c\x24\x8e\xb3\x6e\x57\x50\x72\x6e\x67\x50\xfa\xca\x99\x2a\x85\xeb\x46\x30\xb3\xe3\x26\xe9\x4a\x90\x65\xf6\x16\xe1\x59\xad\xa0\xc4\x62\xf5\xeb\x7f\x74\x94\xe2\x38\x00\x06\x32\xc7\xb9\xf3\x30\x1d\x3a\x45\x5f\xfc\xce\x4a\x2f\x52\xbf\x5e\x70\x3f\xfc\xd1\x98\x1d\x1b\x83\xb5\xb8\x9b\xbb\xa0\x76\x82\x23\x79\xe5\xaf\xbd\x11\xa5\x39\x0e\x80\x81\xd4\x71\x02\xdc\xbe\x16\xe1\x77\x10\x84\xe5\xbc\x3f\x17\x84\x7f\xf0\x3e\x1c\xe3\xb4\xdf\xd3\x10\xbb\x6f\xc0\x48\xd6\xea\x75\x9e\xe6\xdd\x15\x04\x00\x47\xa9\x8e\x03\x60\x20\x77\x9c\x55\x95\x5a\x1f\x69\xfc\xca\xf6\x87\xc7\x65\xe6\x4c\x4a\x02\xf8\xdb\xef\x32\x4d\xe5\xfa\x6f\xb4\xe8\x2f\x99\xdd\x0b\x22\x3e\xf8\xf5\xd1\x19\xa5\x3b\x0e\x80\x81\xe4\x71\x5f\x33\x11\x0a\xe5\x3c\xba\xb2\x4e\xd8\x5d\x01\xc1\x21\x07\xc5\x8e\xc4\x9d\x2a\xf8\xfc\xa5\xd8\x87\x03\x91\xee\x1f\x79\xf0\x7f\x9d\xc1\x50\xca\xe3\x00\x18\xc8\x1e\xb7\x1b\xe2\x7a\xb5\x57\x3b\xf2\x05\xfb\xd5\xed\xce\x90\xef\x84\xae\x79\xbb\x59\x5e\xad\x92\x45\x0b\x29\x87\xf0\x7d\xa1\xd6\xbb\xb8\x08\x00\x8e\xd2\x1e\x07\xc0\x40\xfa\xb8\xb7\x79\xad\x0d\x12\xf9\x98\xd8\x35\xb7\x5b\xa3\xfa\x9f\x87\x6d\xd7\xe8\x5c\x7b\xb6\xf0\x8d\x6a\x6f\x74\x7a\x6c\xff\x01\xcb\x47\x61\x04\x00\x47\xa9\x8f\x03\x60\x20\x7f\xdc\x93\xb8\x77\x1b\x22\x5f\x19\xb5\xaa\x7e\x60\xd8\x66\x33\x91\x5d\x7b\x03\x63\x20\xf3\xdc\x49\x5c\x7e\x49\x67\xe5\x10\x58\x9e\x48\x81\x00\xe0\x28\xfd\x71\x00\x0c\x24\x90\x53\xae\x16\x0f\x10\x26\xd2\xba\x53\x71\xc6\x06\x61\x5f\x10\x1b\xe4\xc6\x9d\x65\x61\xa8\x80\xad\x85\x77\x91\x3e\x28\xf8\x21\xf5\x03\x04\x00\x47\x29\x90\x03\x60\x20\x83\x9c\x71\x77\x94\x6d\x93\x6d\x4b\x98\xc8\xad\xc0\x8d\x5b\xb4\x87\x41\x85\xea\x76\x5c\x46\xa9\x0f\x36\x89\x5d\x34\x15\xc2\x1c\x9c\x7f\x9d\x27\x50\x1a\xe4\x00\x18\x48\x21\x67\x94\x4c\x55\xff\x79\xe7\x07\x42\x39\x43\x28\xd5\x9e\xc1\x13\xcd\xd6\xef\x3d\xd1\x44\xca\xc7\x97\x5d\x84\x81\xef\xed\x81\x74\x16\x04\x00\x47\xa9\x90\x03\x60\x20\x87\xdc\x8c\xc6\x2b\x74\x3e\xd7\xb1\xa6\x90\x57\xd8\xc1\xb9\x38\xa9\xeb\x22\x82\x34\x1f\x22\xf7\x85\x7c\xa9\xe8\xfd\xa3\x13\xaf\x76\xfe\x3a\x04\xa3\x74\xc8\x01\x30\x90\x44\xee\x51\x88\xcd\xf3\x5b\x4f\x65\x13\x02\x82\xde\x68\x3a\x9a\xdf\x23\x09\x9e\x39\xbc\xc1\x68\x72\x3a\xc2\xb4\xd4\x66\x2d\x4b\xf8\xe0\xd7\xfd\x0c\xa5\x44\x0e\x80\x81\x2c\x72\x9c\xd5\xb2\x97\xba\xa6\x8a\xdb\x85\xea\x23\xce\x4b\x15\x04\x57\xd2\xb9\x07\x5d\x97\xbb\x74\x6f\xed\x3d\xde\xcb\xc5\x84\x85\xae\x5f\x9f\xc3\x51\x5a\xe4\x00\x18\x48\x23\xd7\x18\xcf\xf0\x58\x1c\x53\x59\x66\x55\xc3\xdd\x92\x9d\xf6\x4e\x56\xa0\x98\x57\xf6\x52\x50\xf1\x48\x90\x28\xd5\xf7\xd4\x4f\x35\xac\x08\x00\x8e\x52\x23\x07\xc0\x40\x1e\xb9\x06\x37\xbe\x72\xdd\x59\x9a\xc9\xba\xfa\x5a\xf8\x80\x62\x40\xde\x64\xea\xf3\xd5\x6a\x31\x99\x0e\x3f\x2e\x55\x39\x63\xde\x89\x5f\xb7\x20\x54\x1e\xb9\xa3\x86\x0e\xc0\x77\x62\x69\xfc\xa9\x6c\xe1\x5e\x7a\xdd\x5e\xf7\x90\xf5\x93\x67\xbe\x3e\xe6\xcf\xd2\x52\x78\xbc\x66\xaf\x18\x27\x97\xcc\xf1\x03\x1d\x48\x24\x37\xb5\x8b\x5b\xb1\xc8\xcc\x91\x20\x12\x2d\x29\x47\xd6\x51\xf0\x46\xf9\xb4\xe3\x86\xa5\x02\x93\x6d\x23\x67\xff\x88\x52\xa0\xa6\x0a\x02\x80\xa3\x14\xc9\x01\x30\x90\x49\x2e\x79\xf7\x65\x10\xc3\x55\xfa\x3b\x01\xef\x96\x2a\xe4\x76\x03\x38\xfa\x2b\xaf\xb7\xdc\x3f\x78\xff\xa0\x57\x8f\x3a\x8a\x4d\xa7\xfd\x36\x02\x80\xa3\x34\xc9\x01\x30\x90\x4a\xee\xa1\x5a\xfb\x95\x79\x65\x8a\x9e\xcb\xdf\xaf\xcc\x2c\x0a\x69\x6d\x08\x69\xae\xb5\x2e\xf5\x97\xde\x68\x5e\x1d\x13\x8f\x7a\xc6\xf7\xeb\x08\x80\x52\x25\x07\xc0\x40\x2e\xb9\x0f\xef\x2f\xa2\xa5\xf1\x8b\x9a\x3e\x8b\x88\xad\x22\x27\x7c\xa0\x69\xb4\x48\x2f\x2c\xcf\x3d\x9e\x49\xf5\x5a\xbf\x58\x25\xd3\x0a\x1f\x01\xc0\x51\xba\xe4\x00\x18\x48\x26\xf7\x5e\x7a\x33\x6a\x99\x2a\xf5\x07\xab\xbe\x53\xeb\x0a\x21\xcb\x83\x95\x24\xdb\xca\xac\x2b\xce\x07\x55\x6f\x0e\xc7\xdf\x77\x4c\x5e\x43\x00\x70\x94\x32\x39\x00\x06\xb2\xc9\x25\x8c\x7e\xcc\x59\x0c\xba\xb8\xc9\x70\x27\xdc\xc9\xd4\x17\x0d\x43\x83\xbc\x57\xa3\x4b\x65\xdc\xb6\xfd\x14\x7a\x7d\xa8\x4b\xe9\x79\x04\x00\x47\x69\x93\x03\x60\x20\x9d\xdc\x17\x92\x83\x11\xf3\x0d\x2e\x19\x1a\xfc\xed\xbb\x17\x3d\x54\x2f\xee\xb9\xbf\xa5\xfe\x78\x6f\xea\x5a\xa0\x86\x4b\x84\xb9\x56\xf6\xaf\x33\x18\x4a\x9d\x1c\x00\x03\xf9\xe4\xee\xc2\x0b\x5c\xd8\x30\x60\x98\xb9\x11\x33\x36\x66\xb1\x3b\xb5\x98\xf2\x0c\xfe\x75\xfe\xdf\xa3\x9c\xb6\x89\x3d\x30\x82\xb5\x08\x11\x00\x1c\xa5\x4f\x0e\x80\x81\x84\x72\x8f\x00\xfd\xc8\xc4\x7b\xec\x88\x89\x4f\x68\xcf\x27\xf8\x4a\x9d\x9e\x19\xde\xfa\x29\x74\xed\x10\x76\x80\x29\xf4\xb3\xf7\x8d\xd9\xaf\x65\xa2\x14\xca\x01\x30\x90\x51\xce\xf3\xfb\x35\x96\x0b\x16\x3c\x7e\x0a\xdc\xb3\x0e\xae\xef\xae\xfa\xf1\xf2\x28\xbf\x8c\x15\xb8\xd0\x7a\xa9\xd7\x3b\x9d\xda\xfd\x94\x22\x02\x80\xa3\x34\xca\x01\x30\x90\x52\x8e\xc7\x5e\x99\x4b\x51\x73\x3b\x91\x57\xc0\xfe\xab\x16\x23\x55\xcc\xf6\xb4\x06\x36\xfd\x01\x22\x63\xca\x27\x90\xab\x1d\xcd\x9c\x16\x01\xc0\x51\x2a\xe5\x00\x18\xc8\x29\xf7\x72\xfd\x92\x8a\xb7\x43\x81\x64\x55\x14\xeb\x07\xa7\x0a\x5a\x59\xe2\x26\x7e\x7d\x59\x79\xe6\xac\x33\xcc\x75\x17\x4a\x29\x4c\x7e\x6d\xb4\x28\x9d\x72\x00\x0c\x24\x95\x6b\xc1\x78\x90\xac\x53\x1b\x92\x5d\xe2\x41\x2a\x24\xbf\x6b\x15\x38\xda\xf5\x49\x82\x26\x34\x06\x28\x44\xfb\x2a\x39\x50\x1f\x8f\x85\x00\xe0\x28\xa5\x72\x00\x0c\x64\x95\xd3\xf8\xe4\xa6\x9d\x71\xaa\xa3\xe8\x66\xd3\x77\xbd\x2f\xa7\xc2\x3f\x3e\xae\x59\x78\x93\xfa\xce\x36\xb3\x98\x96\xf7\x7c\x4b\x27\xd5\xaf\x0f\x0e\x28\xad\x72\x00\x0c\xa4\x95\xdb\xeb\x21\xf5\x56\xeb\x0e\x7f\x7d\x5e\xd4\xb0\x8b\x25\xb7\x4d\xe3\xd1\x85\x8d\x5e\x7d\xdd\xb2\x2f\x9b\x82\xf8\xb4\x49\xe3\x36\xbf\x4e\x87\x28\xb5\x72\x00\x0c\xe4\x95\xd3\x93\xac\xa8\xb6\x4f\x94\x19\xb7\x98\x39\x8f\x81\xef\x36\xae\x2f\x69\xc8\xd1\xe4\xbd\x2f\x25\x31\xf4\x76\xe9\xc3\xfd\x29\x74\x7b\x04\x00\x47\xe9\x95\x03\x60\x20\xb1\xdc\x8f\x4a\x7b\xb2\x6b\xa3\xbd\xbe\x8f\xc5\xa8\xf2\xf6\xd6\x2c\x1c\xbd\x5f\xc7\x46\x47\x96\x2f\x4a\x9c\x17\x1d\xa5\x29\x91\x7e\x6f\x86\x00\xe0\x28\xc5\x72\x00\x0c\x64\x96\x6b\x9c\x82\x51\xab\x37\x8d\xcb\xf2\x26\xbb\x13\xfb\x3c\x30\x90\xf2\x7c\x33\x03\xd7\xbc\x90\xd9\x8a\xb5\x67\x65\x26\x44\xf3\xe8\x1c\x02\x80\xa3\x34\xcb\x01\x30\x90\x5a\x8e\x59\xd4\xb2\x46\x35\x4f\xde\x9d\x65\x77\x48\xb8\x7b\x6b\x43\x51\xc5\xdb\xfe\x72\xb5\xb2\x64\xd6\xd5\xdd\x10\x5d\xfe\xe2\x42\x2d\x04\x00\x47\xa9\x96\x03\x60\x20\xb7\x5c\xfa\x35\x6c\x12\xa6\x87\x3b\x2e\x6f\x04\x96\xf4\x3a\xd0\xf2\xf8\x67\xa6\x94\xca\xb1\x6e\x57\x6e\x87\x0c\xb8\xc8\x33\x06\x0f\x6a\x23\x00\x38\x4a\xb7\x1c\x00\x03\xc9\xe5\x06\xe3\x63\x7c\x1d\x3e\x0b\x3f\xaa\x74\x1c\x25\x7e\x9f\xd7\x24\x79\xc9\xec\x1d\xe6\x33\x4a\x49\xf5\x2b\xb6\x0d\x72\x66\x1e\xff\x79\xea\x03\xa5\x5c\x0e\x80\x81\xec\x72\xd1\x24\x0e\x22\x77\x7e\x2e\x6c\x77\x47\x9c\x09\x7a\xa7\x85\x6e\xa0\x34\x23\x46\xe3\xc0\xb6\xeb\xf5\xcd\x58\x49\x9d\x72\xcb\x44\x17\x01\xc0\x51\xda\xe5\x00\x18\x48\x2f\x57\x1a\x53\x38\xe7\x40\x27\xcd\xd1\xc3\x98\x43\x1f\x7d\xf7\x0c\x69\xd3\xdb\xf8\x2c\xbe\x4d\xbe\xd3\x9a\x07\x65\xf6\xa7\xce\x0b\x09\x21\x00\x38\x4a\xbd\x1c\x00\x03\xf9\xe5\x36\x37\xdc\x85\x72\x5f\xf6\xed\xff\xc4\x71\xe0\xe8\x62\xa5\x57\x86\x77\x30\xb4\x5b\x07\x0d\x78\xc8\x4a\x17\x56\x8b\xce\xfc\xfc\x75\x73\x44\xe9\x97\x03\x60\x20\xc1\xdc\x35\xd5\x0d\xd9\x56\x0c\x89\x74\x12\x9f\xe4\xef\x6f\xb7\xe3\x29\x23\x0a\x23\xcd\x47\x9f\x5f\x52\x8f\x0b\xb5\x36\xb1\xbf\x3e\xa8\x81\x00\xe0\x28\x05\x73\x00\x0c\x64\x98\x0b\x33\xa2\x7a\xc2\x91\x2f\x66\x67\x90\x1c\x5a\x27\xab\xcf\x98\x91\x88\x97\x15\xf9\x02\x50\xb2\x14\xf9\x32\x54\x54\x76\x3b\xf6\xd7\x2d\x08\xa5\x61\x0e\x80\x81\x14\x73\x87\x43\x1f\x06\xb8\x2e\x60\x50\x90\xeb\xa4\xfa\x54\x3b\x5c\x8a\x5a\x5c\xb0\xe9\x2a\x2c\x1e\x2d\x0d\x2f\xbc\x14\xd1\xc1\x64\xf1\x6b\xdf\x44\xa9\x98\x03\x60\x20\xc7\x9c\x6d\x6d\x2b\x4c\x35\xd6\xf0\xe3\xaa\x4b\x5d\xfe\x7c\xad\xdf\xbd\x2a\xdf\x8d\xee\xae\x02\x7a\x46\x45\x06\xbd\x8c\x57\xf7\x86\x30\x11\x00\x1c\xa5\x63\x0e\x80\x81\x24\x73\x18\x57\x45\x9d\xaf\xdb\x48\xfe\xa8\x3b\x57\x47\x5e\x97\xdf\xef\x6a\x52\x91\x45\x4d\x10\xde\x46\xc1\x19\x4f\xa7\xd4\x5f\x6b\x69\x89\x00\xe0\x28\x25\x73\x00\x0c\x64\x99\xe3\x0e\x86\x27\xdc\xab\x14\xf9\x48\x1f\x20\x4e\xbd\xe4\x94\x98\x10\xa0\x9f\xff\x3e\xd5\x26\x72\x4b\x9c\x73\x2e\x04\xef\x92\x0d\x3f\x02\x80\xa3\xb4\xcc\x01\x30\x90\x66\x0e\xa3\x4d\x64\xdd\xa5\x84\xba\x9d\x28\xc3\xf8\xe2\xca\xcc\xec\x75\x7b\xfc\x8b\x5c\x4d\x67\x6a\x7e\x62\xa9\xa8\x0f\xf0\x84\xdb\xfc\xfa\x14\x82\x52\x33\x07\xc0\x40\x9e\xb9\x44\xb9\x2b\xbd\x96\xac\x69\xf2\x6c\x57\x1c\x84\x3b\x58\xb0\x95\xc5\xaa\x39\xf9\x4a\xad\xae\x16\x50\x9f\xe1\x99\x4f\x6f\xce\xf9\xb5\x6f\xa2\xf2\xcc\x95\x13\xfd\xf7\x40\x67\xa8\x6a\x7d\x39\x11\x23\x46\x2d\xf2\x5a\x37\xb3\xdc\xae\xa8\xa1\x61\x45\x49\x24\x6c\x9f\x6c\x64\x6b\xf6\x19\x5f\x5c\x56\x6a\x2d\x22\x86\x6b\xf0\x92\xee\x79\xb4\xbf\x24\x27\x57\xea\x5b\xe6\xcd\xd8\xfb\x1c\xcc\xb4\x3e\x4e\xad\xa7\x99\x4c\x9a\xeb\xdd\xbe\x68\x93\x46\x13\x6e\x8a\xcf\xa1\xff\x3e\x1f\xf7\x18\xba\x3a\xf5\x36\x40\xf2\xca\xf0\x70\xa4\x75\x87\x05\x99\xd7\xb8\xed\x17\x56\x85\x0b\xdd\x1d\xe4\x65\x57\xd4\x0f\x6b\x47\xab\xae\xe8\x1e\x43\xf1\xc3\x86\x17\xcc\x9e\x9d\x7e\xaa\xac\x92\xf9\x64\x23\x93\x5b\xbe\xce\xa2\xdb\x38\x10\x46\x77\x56\xdd\x8b\x23\xbf\xf5\x82\xdf\xd5\x63\xe8\x4a\xfc\x97\xa7\x5f\x6f\x84\xe4\xd1\xc8\xdd\xd6\x5b\xe9\xe2\xa6\x4a\x7d\x58\x3c\xa6\x2d\xf9\x6e\x31\xf0\x6a\x49\xa3\xf4\x9b\xc8\xd6\x63\x68\x18\xce\xd3\x31\xf2\x54\x1b\x96\x2f\xa1\xef\x76\xbf\x8c\x53\x0b\x38\x0d\x73\x29\x3f\xd3\x37\x23\x6f\xba\x68\xb3\x4c\xdf\x1e\x30\x7b\x0c\x4d\xbe\x33\xff\xa3\x7d\x1c\xdd\xe2\x60\x8c\x99\xca\x51\x24\x65\xc3\x6b\xcd\x46\xac\xe1\x16\x56\x71\x87\xba\x1f\x3f\xf5\x7c\x6c\xf1\x31\x54\x25\x94\xb7\x72\xe9\xd5\x17\x93\xfb\xcf\x62\xdf\x93\xdd\x21\xf1\x8f\x2d\xa0\xe2\x4f\xe5\xbd\xf8\x2e\x86\xf0\x27\xa7\xea\xf7\x1f\xaa\xc7\x50\x9a\x27\xc0\x4b\x01\xfb\x96\x12\xab\x57\xf6\x7e\xd4\x84\x0f\xa5\x44\xf6\x59\x9d\x2b\x5b\x19\xbe\xc6\x45\xda\xbc\x36\x7e\x35\xd8\x76\x0c\x95\x23\xe1\xd8\xcd\xa6\x83\x45\xb5\xfe\xa0\x6d\x2c\x20\xb9\xfa\xb1\xde\xa0\x58\xca\x4e\xa0\xd8\x54\x16\xdb\xed\x7e\x1a\xf7\xe0\xf1\x37\x4b\x39\x56\x4b\xb0\x9c\x2f\x75\x36\x4e\xec\xd5\xf6\x87\xa0\xfc\x46\x06\x8b\x19\xf4\xa7\x43\xc4\x51\x45\xe5\xfd\x67\x55\x93\x72\x0b\x8e\xa1\xd3\xb9\x59\xbe\x6a\x77\xf4\xb4\x10\x07\xa4\x29\x2a\x23\x5a\x8b\x24\xaa\x8a\x58\xd7\x1c\x39\xd1\xad\xb8\x38\x7a\xb2\x5f\xad\x2c\x1e\x43\xed\x23\x93\xe9\x37\xf3\x2e\x24\x36\x15\xd0\xa9\x3d\x2a\x94\x18\xba\x7a\x55\x63\x62\x9c\x52\xea\x03\x9b\xbe\x84\xbe\x88\x59\x79\xd0\x31\xd4\xdc\x79\xc7\xf7\x52\x03\xfa\xdd\x7e\xfe\xb7\x72\x32\xc5\x8a\xb0\x79\x7c\x5e\xd9\x0d\xe6\x2c\x58\x67\xbf\xc1\x7b\x56\x03\x3f\xc4\x31\x34\x0e\xdd\x65\xff\x1a\xba\xd8\x1b\x6c\x82\x4a\xa5\x27\xd8\xd9\xb7\xdc\x5f\x8b\xcc\xf0\x98\x20\x6c\xe4\xb2\x0b\x1a\x2f\x98\x97\x1c\x7f\xb3\xd0\x77\x9c\x8b\xed\x92\x7e\x74\xe8\x77\xdf\x79\x31\xa9\x4d\x9d\x5a\xfe\x20\x86\x90\x20\xae\x40\xc6\xf5\x0c\xe7\x8a\x62\xf4\x0b\x8a\x63\xa8\xc3\x94\xc9\xfc\xe7\x90\xa9\xf3\x15\xda\xd2\xf1\x34\x40\xe7\x0d\xa2\x7c\xa3\xd3\x2f\x25\x88\xb3\x8b\xb0\x87\x45\xbd\xa3\x86\x2b\x8e\xa1\x5f\x08\x05\x8b\xf5\x5d\xa9\x92\x49\x11\x24\x9b\x8b\xa1\x84\xd3\xaf\xd6\x54\x32\xbd\x10\x05\x6c\x4e\xaf\x82\xf3\x6b\x1b\x83\x78\x8e\xa1\x98\xac\xf7\x62\x74\x5f\x65\x79\xa9\x33\x10\xaa\xe6\xab\xcd\xda\x0b\x01\x31\x57\xca\xcb\x9e\x3f\x68\xeb\x1d\x91\xda\x69\x77\x7d\x77\x0c\xbd\x99\x15\x21\x48\xdf\xf9\x30\xd3\x5f\x57\x46\xc7\x85\xaa\xe3\xd6\xa5\xdb\x85\xe5\x1b\x06\x06\x17\xf0\xc7\x34\x8c\xe6\xce\x63\x12\x1c\x43\xf9\x25\x3d\x5f\xdc\x17\x7a\xf7\x3e\xd7\xb2\xea\xd2\x4a\x28\x7b\xc2\x3b\x31\x1c\x93\x17\x65\xa6\xd8\x53\xea\x8e\x9f\x5d\x79\x9e\x7e\x38\x86\xea\xda\xaa\x06\xf8\xba\xb2\x29\xac\xfd\xb8\xda\xf8\x35\x50\x67\x32\x6a\x99\x6d\xd2\xfb\xde\x7c\x4a\xa3\xdd\xe3\x11\xc6\xf7\xc3\xac\xc7\xd0\x60\xcf\x38\x57\x47\x5c\x1f\xfb\xb3\xfb\x43\xa4\xe5\x1f\xf3\xf8\xa4\xb2\x1a\xce\xa6\xd9\x5e\x1c\x90\xfa\x76\xd1\x8f\x2f\xd3\xe4\xf8\x9b\xc5\xc2\x4c\x59\x3a\x67\xa1\x4c\xd2\x96\xf9\x60\x25\x7f\xcc\xaa\x07\xab\xd9\x3f\xbf\x84\xf2\x10\x83\xf2\x4a\xae\xd2\x55\xe1\xda\xe3\xff\xc7\x62\xa1\xd5\x5c\xf5\x13\xd6\x0d\xb1\x32\x5a\x2f\x56\x11\xea\x19\x21\x8c\xbd\x27\x6e\xf0\x71\x77\x39\xcb\x4a\x39\x05\xa1\x29\xfe\xf8\x18\xea\x3b\xf4\xc5\x9a\x44\x78\x8b\x3e\x7a\x34\xb1\xe6\x50\xb4\xd7\x7d\x84\x33\x71\x63\xdb\x7d\x65\x3f\xe8\x9c\x9d\x8e\x17\x8e\xc4\xf2\x31\x74\xd9\x52\x93\x3c\xeb\x63\xa5\x89\x58\x8b\x4c\xff\xf5\xcd\x1f\x65\x37\x58\x39\x33\x12\xd2\xb6\xcb\xb0\xd3\xb2\xb6\xc6\x9b\xce\xc7\xfd\xff\x43\x8b\x0f\x9f\x48\x32\xf9\x69\x70\x48\x49\x3e\x77\xdb\xf6\x7a\x66\xd4\x1c\x92\xdf\x67\x18\x48\x25\x9a\xd6\x3a\x5a\x31\x35\xd7\x94\x7d\x0c\x7d\x79\x66\x99\xfd\x0a\xa5\x78\xc5\xea\x6c\xdd\xa6\x82\x7b\xfe\xcd\xf6\x69\x55\xe5\x9a\x2b\xa4\x2e\x13\x9b\xaf\x97\xc3\xb1\x93\x88\x8e\xa1\xaa\xbc\x0e\x0f\xfd\xce\xd6\x5d\xfb\x9c\xff\x53\xf5\x53\x6d\x92\xf6\x78\xe5\xe7\x36\xb7\xec\x76\x3e\xaa\xa5\x7d\x59\xc1\xee\x44\xa6\x63\x68\xba\x8c\xb7\xf5\xb2\xeb\xcd\xa4\xfe\xf6\x94\x7d\xf4\x4d\xc1\x77\xda\xab\xe8\xa3\x79\xb4\xc2\x62\x34\xcb\xaa\x1e\x83\xf2\x8a\x3f\x8f\xa1\x67\xab\xaf\x3a\x24\x1e\x0e\xbd\x58\x11\x6f\xdb\x54\xa3\x60\xbc\x84\xc1\x19\xba\x10\x56\x42\xe4\xd8\x45\x41\x9d\xc6\xa5\x52\xa2\x79\x0c\x75\x72\x43\xcc\x10\x11\xdb\xfb\x35\xbf\x56\xf1\x50\xb4\x2b\x96\xe8\x53\x0e\x86\xfb\xd2\x2b\x27\x9c\x8f\x37\x93\xe5\x48\x8e\x49\x3f\x86\x6e\xf5\x84\xd7\x5f\xa8\xe1\xed\x36\x0e\x1a\x32\xef\x0e\x35\x1c\x43\x98\xc8\x3e\xf8\xa6\x12\x15\xd6\xec\x15\x1f\x5e\xae\x29\xef\x7c\xfc\x56\x9c\xf1\x70\x36\xe7\x73\xf6\xea\x82\x8f\x4f\x7b\x43\x47\x72\xf9\x52\xce\xce\x8e\x64\xc8\x69\x0c\x6c\x62\x91\x3c\x3a\x87\x90\xbe\x63\x68\x55\x98\x75\xba\x51\xd8\x33\xb3\xda\x5c\x87\xa7\x66\x2a\xd4\xdd\x4f\xca\xba\x3c\xd7\x67\x75\xdf\xcc\xbd\x36\x9a\x62\x0e\x9f\x31\x3c\x86\x36\x93\xf7\x2a\x86\xbc\xaa\x1c\x4b\xc4\x2b\x2e\x5e\x2d\x34\x40\x1f\x52\xa9\xee\xc8\x38\xb5\xc9\xf7\x75\xae\x84\xe2\xa6\x37\x7e\xfc\x31\x54\x44\x50\x99\x94\x2d\xcb\x76\x3d\xff\xed\xd3\x05\x7e\x85\x9b\x33\x7a\xe9\x21\x5e\xbb\xfe\xa4\xc4\xc3\xbe\xa1\x6c\xf9\x1c\x21\x2f\x8e\xa1\x8b\x34\x2d\x6d\xd4\x2f\x54\x42\xf0\xb6\xd4\xf5\x36\x64\x1f\xe7\xef\x3b\xc8\xd2\x3d\x32\xb9\x23\x44\xe1\x21\x4b\x91\xe2\x47\x92\x7b\x0c\x25\x5c\x18\x52\x38\x3b\xc3\x28\x98\xbe\x46\x60\xa2\x1b\x5f\xfb\xf1\xce\x9d\xb8\x55\xdd\xb3\x25\x17\x74\x42\xd7\x0b\x71\xb0\x5e\x3a\x1d\x43\x5f\x0b\xf0\x53\x48\xf2\x3c\x63\x72\xa5\x7a\x48\x9e\xeb\xe6\xb5\xa0\xca\xaa\xc4\xed\xc1\x65\xa6\xbc\x12\xe3\x56\x7b\x9d\x56\xeb\xd2\x31\xb4\xe9\xae\xc5\xeb\x62\x4e\x34\x57\xd3\xce\xab\x9d\xf8\x05\x2c\x57\x34\x5e\xde\x52\x7c\x35\xd7\xe5\x67\x2a\xa8\x5a\x7c\xe1\x5a\xc3\xe7\x63\xe8\xad\xe7\x81\x3a\xdd\x64\x3e\xb6\x18\x44\xbb\x52\x42\x06\xf3\x3b\x4c\xfd\x9f\x66\x5f\xa7\xbc\x57\xb3\xc5\x32\xb1\xc3\x71\xe0\xe6\x3b\x86\xd2\xbd\x26\xcb\x1a\x91\x5b\x17\x3a\x67\x3b\xc5\x59\xf4\xb8\xb9\x65\x46\x51\x5d\xc8\xb4\x29\xcc\x90\x4e\xe1\x2b\xac\x88\x72\x50\xe2\x18\x3a\xfe\x6a\x8f\xff\xf9\x43\xfa\x34\x86\xde\xaa\xe5\xaf\xcc\x8e\x72\x3c\x99\x4d\x0d\xdf\xc3\x17\x34\xbd\x9f\x1c\xe6\x24\x7f\x1f\x13\x3c\x86\xa6\x99\x93\x0a\x18\x50\xb0\xe9\x7c\x9c\x13\x94\xd8\x80\x73\xaf\x6c\xb3\x3e\x7a\xdc\xa9\x30\xf0\x35\x91\xec\xf3\xc3\x77\xa3\x6c\xf5\xc7\x50\x9d\x32\xf4\xea\xf2\xbc\x57\xd9\x3f\x48\x9e\x8e\x5b\xcc\x6e\x16\xb9\x3f\xbd\x48\xcd\xcb\x39\x7c\xb9\xa4\xdf\x44\xfe\x31\x8d\xd5\xf1\x3b\xa1\xe2\x72\xf3\x9a\xd9\x00\xd5\x14\xce\xaa\xa5\xd0\x0f\x63\xc9\x53\xb3\x00\xbb\xbf\xb1\xf8\x4e\xe2\xac\xa6\x59\x0f\x9d\x99\x86\x87\x0f\xfa\xbf\x3b\x0c\x04\x1e\x9b\xf9\x86\x99\xb0\x32\xb7\x6a\x95\x51\x34\x74\x63\xef\xe2\x65\xad\x31\xf5\x81\x7a\x46\x37\xc7\x5d\x1e\x8e\x0f\x82\xfb\x9a\xdb\x6c\x37\x8f\xa7\x35\xa4\x6d\xb4\x03\xb8\x8d\x4b\x8b\xab\x76\x9e\x89\x72\x9e\x07\xcb\x4e\x71\x8a\x43\x2a\x5a\xf3\x67\xc5\xb5\x4b\x0d\x40\xaa\xb5\xa4\x24\x3e\xbe\xa7\xa4\xe4\xf1\xfb\x31\xf9\xc1\xd3\xcb\xb1\x5c\x76\x2d\x1f\x96\x3f\x7c\xbc\xf7\x63\x66\x8f\x01\x37\x33\xc3\xaa\xf1\xba\x86\x7f\x47\x76\xc9\xac\xcd\xab\x63\xe8\xa7\xf8\x27\x31\xa9\xe2\x73\x7d\xa3\xc3\x57\xab\x13\xec\xfa\xe4\xe3\xcc\x36\x6b\xd2\x07\x3a\x1a\xe8\x0a\x1b\xd7\x8a\x3b\x17\xa5\xff\x2f\xa6\x6e\xc0\xff\xdd\xd2\xbc\x31\xd0\xb0\xbc\xa4\x24\x3c\x7c\x83\xa4\xae\x4b\x4a\xfe\xed\x1f\x6e\xd2\xd3\xfa\x39\x76\xd6\xd3\xf3\x26\xc3\xc7\xe5\xca\xb6\x82\xf3\x08\x0a\x95\x17\x04\x11\x7b\x49\x51\xb4\xb5\x9a\x46\xfa\x31\x0f\xfe\x2f\xfe\xe1\x9e\x57\xd0\x24\xd1\xd0\xd0\xe4\xd0\xd0\x3d\xd0\xd0\xd0\x3c\x25\x25\xff\xfb\x5f\x90\x8c\x87\x12\x0c\xf4\xaa\x46\xb1\x4b\x99\x03\x55\x98\xeb\x54\x09\xc5\x0c\x0c\x72\x57\xb1\x14\x53\x4d\xbd\x02\x39\xb5\xdf\x34\x4f\x0e\xf6\x2a\xd8\x9f\x63\xf8\x03\xaf\x2a\x8b\x76\x59\x12\xfc\xb2\xf1\x57\x9e\x7f\x67\xa0\xe7\xbb\x91\xb3\x5e\x41\x15\xce\x2d\x24\x7b\x75\x67\xb2\xd3\x69\xe6\xd6\x9d\x91\x35\x77\xb6\xd3\xf8\x18\x1e\x7f\xe2\x65\x3d\x34\x4e\xbc\x2c\xdb\xa4\x9f\x26\x49\xc6\x95\xa5\xb9\x7b\xb5\x21\xc3\x2c\x6b\x56\x7d\x3d\x71\x6f\xeb\xdf\x8e\x36\xf4\x07\x21\x6e\x3c\x8e\xf9\xd2\xfb\x47\x56\x7b\xf3\xc4\xcb\x3a\xfb\xad\x2c\x2f\x79\x72\x18\xf9\xab\xec\x99\x00\xbd\x63\x0b\x64\x4a\x8f\x06\x44\xe8\x65\x94\x3c\xa2\x3e\x92\x2a\xb1\x60\x2c\xfd\x91\xd5\x3a\x9f\x78\xd9\x42\xb7\xa7\x2e\xc3\xe1\xa2\x07\x8f\xac\xfd\x38\xfb\x5b\x26\x93\xd9\xe8\x85\x2e\xb1\xaf\x9e\x55\xf4\x28\x8e\x4c\x18\xac\xaf\x7e\xfe\xff\xfe\xb2\x06\xff\x2e\xba\xde\x98\x70\x98\x97\x34\x3a\xda\xf1\xe3\xe0\x19\x5c\xa1\x77\xef\xbc\x7e\x52\xf7\x1b\x92\x8d\x88\x08\xb1\x56\x28\x65\xb9\xcb\x11\x36\x88\xa5\x7d\x70\x2e\x1b\x53\x8e\x98\xd0\xf0\xd0\xf9\x77\x9c\x97\xb4\xc7\xdf\xe6\x72\x03\x56\x88\xa4\xc7\x6a\x3a\x96\x13\x22\xfe\x05\x34\xdc\x51\xb2\x14\xce\xc9\x0b\x64\x07\x59\x95\xe5\x43\x2a\x7a\x15\xf0\xe7\xc8\xb9\x50\x9c\x97\x34\x1a\xe6\xf1\xb9\x52\x93\xfe\x54\xb7\x0b\x52\x58\x8b\x2e\xb5\x34\x84\x57\x3e\x2d\x34\xa8\x61\x90\x7f\x50\x98\xa4\x1c\xff\xc5\x29\x91\xe4\x47\x9a\x2f\x72\x2e\x14\x07\x9e\x4b\xb1\x90\xbf\x71\xfe\x6c\x76\xef\x5b\x37\xe7\xa8\x52\x52\xe0\xb4\x66\xcc\x2e\x0d\x5e\xa3\x7a\xc2\xf7\xb4\xc2\x32\xf6\x5c\xda\x58\xe4\x5c\x28\xce\x4b\x1a\xf6\xb7\xf7\xe1\xc7\xd6\xf8\xf3\x6f\xb7\xb8\xef\xa3\x25\xdf\xfd\x6a\xe1\xff\xda\xe6\x1c\xd3\x1d\x12\x9b\x4b\x67\xf5\xab\x16\xae\x7b\xfc\xb0\xb3\xd8\xf2\x90\xfd\x77\x9c\x97\x34\xda\x29\x0f\x84\x8f\xd4\x75\x49\x69\x34\xf4\x13\x31\xe0\xfc\x77\xf1\xf1\xc6\x40\x43\xf3\x92\x42\xf3\xf0\x30\xf8\x77\x77\x9d\xdf\x05\x86\x6a\x7e\x9e\x44\x83\x6e\x98\x6c\x10\xa3\xaa\xe6\xde\xce\x33\xef\xf2\x1a\x1b\xc5\xc3\x9a\x7a\xd1\xb2\x82\xe7\x7c\x57\x2e\x0d\xb9\x22\xdf\x28\x28\x0e\x1c\x98\xb8\x21\xf7\xa2\x94\x01\x18\xa1\x89\xb8\x73\x1e\x36\x1e\x65\x22\xcb\x40\xb0\x39\xfb\xd9\xc5\x96\xba\xba\xc9\xfd\x94\xe1\x77\x06\xc8\xb9\x50\x1c\xf8\xc2\xba\x11\xde\x23\x71\x46\x7c\x0c\x39\xc0\xa8\x7c\xca\x9d\x9d\xf8\x03\xeb\xde\xdc\xab\xfa\x4d\xf6\x52\xed\xbb\x5c\x99\x19\x95\x38\xf2\xc8\xb9\x50\x1c\x78\xee\xf3\xb4\x81\x27\xb6\xda\xaf\x07\x78\xc8\xda\x26\x87\x8d\xcf\xef\xdc\xa4\x0e\x7b\x31\xda\x3a\xf2\xb0\xfd\xcd\xb3\xbe\x25\x42\x41\x0a\xe4\x5c\x28\x0e\x1c\x18\x8c\xc4\x77\x3f\x01\xfd\xbe\xed\x97\x33\x78\xd5\x04\x78\x42\x1d\xb4\x4e\x0c\xf2\xd7\x9b\xad\xa7\x96\x8a\x43\x25\x68\x96\x53\x62\x3d\xe4\xfe\x1d\xf7\x57\x60\xfe\xb3\xd7\xfc\x2e\x32\x06\xff\x6e\x07\xf8\x5d\x04\x96\xd1\x92\x79\x83\x63\x6e\xe5\x73\xc6\x38\x34\xb5\x6e\x9a\x0d\x11\xc1\x2d\xc3\xda\xec\x5e\x07\x4f\xd9\xcb\x6b\x2f\xba\x7e\xbc\x85\x5c\x3a\x14\x07\x8e\x00\x97\x1c\x0f\xc1\x66\xf6\x90\x3c\x93\xe7\xe2\xe4\x3a\x07\x6d\xf6\xa7\xc1\xcd\x10\x92\xc7\x26\x9e\x11\x17\x7c\xc6\xa5\xa4\x43\x25\x91\x73\xa1\x38\xf0\xa5\x22\x27\x9b\xcc\xf8\x48\x10\xdb\x9a\x19\x8d\xb9\xa7\xce\x4c\x95\xde\x25\x4c\x63\x36\xfc\xe2\x63\x5d\x53\xc0\x1d\x8f\x42\x15\xe5\x34\xe4\x5c\x28\x0e\x3c\xb7\x5a\xfb\x21\x55\x06\x41\x85\xec\x72\xe4\x61\xe0\x97\x73\xc2\xcc\xee\x4e\xf7\xbf\x54\xb6\x3f\x79\x39\xf9\x8c\xbc\xa6\xea\x7e\x5f\x20\x72\x2e\x14\x07\x8e\x40\xc8\xe3\x4a\xe3\x16\x15\xbe\x43\x47\xa5\x1a\xfa\x64\x86\x0d\x4e\xbd\x3e\xe5\xa7\x68\x67\x9f\xa8\xae\x24\x95\xdb\x2b\x14\xe6\x90\x7a\xc8\xff\x3b\xee\xaf\x08\xfc\x77\xe3\xff\x87\x0c\x40\x6d\xc7\xbf\xcb\x40\xd6\xeb\xf4\x17\xf6\xd6\x5c\x3b\xd7\x37\xb9\xec\xef\x63\x8f\x7c\xd9\xb7\xf1\xce\x74\x33\x53\x37\x4d\xff\x64\x3f\x1b\xc1\x81\x2b\x87\x5c\x3b\x14\x07\xce\x40\x60\x7d\xb9\xdf\x08\xf7\xa1\x45\xdc\x58\x52\x68\x13\x4e\x89\xf8\xac\x44\x88\xd6\x33\x03\xdf\xd5\x94\xbb\x5e\x17\x3f\xb4\xbc\xbf\x88\x9c\x0b\xc5\x81\xaf\x95\xec\x90\xbb\x85\x62\x91\x45\xa9\x40\xc3\xe7\xae\xda\x26\xd6\xb6\xc8\x6f\xe6\x8f\xa2\xbc\xcb\xd0\x9e\xbc\x1c\x07\x88\xea\x36\x97\x90\x73\xa1\x38\xf0\xdc\xdb\xf1\xad\x15\x45\xab\x5d\x84\x13\xe3\x38\xe1\x9a\xde\x56\x53\x33\xef\x54\xf5\x3a\x1c\x0d\x7e\x3c\x6a\x0c\x98\xac\xf8\x52\xcd\x8a\x9c\x0b\xc5\x81\x33\x70\x6a\x3b\xe5\x46\xe1\x15\xf3\xc9\x66\x55\xef\x4f\xda\x01\xe9\x84\x0e\xa7\xee\xad\x4a\xf1\x98\x8b\x36\x6c\xad\x8b\x46\x6d\xd6\x66\x20\x33\x00\xc5\x21\x33\xf0\x9f\x53\xd8\x3f\x64\x00\xea\x6c\xf4\xbb\x0c\x04\x7a\xee\x91\xac\x7b\x8c\x58\xb0\x5c\x6a\x65\xa7\xc5\xee\x60\x61\x7a\xd3\x57\xcb\xec\x23\x31\x1c\xd9\xca\x5d\x6e\x79\x9f\x5a\xf5\xe8\x5a\x41\x70\xe0\x0c\xec\xa7\xb0\xc1\x9e\x55\xa8\xa9\x44\xac\xda\x5c\x79\x13\x90\x32\xd5\x5d\x5e\xc6\x55\x7e\x5d\x2a\x77\xae\xc7\xa6\xed\xca\xd9\x1c\x69\xe4\x5c\x28\x0e\x7c\xad\x5e\xc7\x38\xe7\x7c\x67\xb2\x8a\x37\x5f\xb9\xf0\x21\xb8\x55\x86\x8a\x52\xa6\xeb\xf9\x7d\x31\x41\x1c\x7e\x2c\xc5\x73\xde\x58\xb8\xc4\xc8\xb9\x50\x1c\x78\x6e\xde\xa1\x2b\xed\x8b\xd6\x91\x0e\x02\x92\xd0\xd8\xc9\x4f\xb6\x6c\x02\x2f\xef\x06\x15\xa0\x29\x94\xb2\x7f\xcb\x39\xfd\xe2\x85\x11\x2e\x72\x2e\x14\x07\xce\x80\x11\x69\x28\xc7\x40\xd0\x37\xb4\xd6\x61\x57\xbd\xcb\x77\x03\xfa\x92\xcf\xd2\x8e\x31\x86\x87\xeb\x93\xae\xaa\xde\xd6\x0f\x98\x78\x8a\xcc\x00\x14\x77\x74\x1f\xb8\xf9\xcf\x19\x80\x3a\xa8\xfe\x2e\x03\x6e\xa7\x9e\xdd\xa3\x9f\x51\x75\xb4\xf6\xed\xa6\xaa\x6a\x1c\x4c\x5d\xe0\x45\x4b\xc7\xfb\x4a\x1d\x8b\xeb\xb1\xb6\xd9\x89\x53\x58\x79\xb4\xbd\x42\x70\xe0\x0c\x24\x50\xde\xd4\x24\x11\xea\x2b\x55\x59\x16\x55\xe7\x86\x8f\x8e\x54\x4a\xb4\xe1\xef\x66\xe3\x76\x5a\xdc\xd3\x67\xc3\xc2\x8f\xf8\x80\x9c\x0b\xc5\x81\xaf\xd5\x07\x3d\x9a\x59\xdd\x99\x98\x69\xce\xa9\xce\x41\xdb\xb4\x6b\x64\xfc\xc5\x3f\x23\x8a\xa2\x07\x17\x93\xc4\x2e\x28\xf3\x0f\x57\x9e\x41\xce\x85\xe2\xc0\x73\xb7\xac\x97\x99\x8c\x03\x22\x43\x22\xdd\x6d\xa5\x7c\x24\xd7\xd2\xb4\xc2\x3d\xa4\x77\xb6\x6d\x54\x4d\x2b\xc9\x3d\x52\xf1\x9e\x9d\x45\xce\x85\xe2\xc0\x19\x08\x23\xa5\x66\x79\x54\x63\x8e\xc0\xff\xf6\x55\xf9\xb4\xcc\xd4\xbb\xdd\x3d\x8f\x39\x19\x82\xda\x3a\x7c\x56\xe7\x6a\x35\xa0\x64\x06\x99\x01\x28\xee\xe8\x3e\xe0\x8c\x22\x03\x37\xfe\xdd\x27\x7d\x6f\x38\x26\xcc\x4b\x16\x1d\x0d\xed\x6f\xff\x4a\xab\x8b\x6a\x32\x3f\xfb\xbd\xee\x30\x59\x4c\x0e\xfd\x20\xde\x5d\xfb\x48\xbe\x62\x91\xa9\x9c\x34\xbd\x93\xd3\xfc\x51\xe5\xb2\xe5\x53\x0f\xbd\x7f\xc7\x79\xc9\xa2\x79\xfc\x7d\x32\xa5\x76\x0e\x8f\xfe\x28\xff\xc2\x87\x44\xaa\xdd\x3c\xfa\x6d\x76\x2d\x3f\xd6\xab\xfd\x77\xfb\x2f\x49\x84\xfa\xe6\x37\x31\xdb\x3b\x20\x27\x43\x71\x5e\xb2\x68\x98\x7f\x9f\x6c\x30\x47\x66\xaf\xf3\xd3\x98\x49\xa9\x7d\x42\xe0\x46\xcc\xa0\xe5\x65\xa3\xbe\x50\x4a\x44\xc9\xf9\x4f\xf2\x1f\x69\x62\x02\x4b\xe9\x91\x93\xa1\x38\x2f\x59\x34\xb4\xbf\x5f\xb3\x96\x12\x89\x70\x15\xeb\x7e\x9e\xa9\xd4\xaf\xab\x06\xb7\x10\x2e\x7c\xf8\xdb\xb2\xdb\xe9\x86\x8d\xa5\xd2\x18\xbd\xd9\xf2\xdd\x01\x1e\x5c\xff\x8e\xf3\x92\x45\x3b\x85\x86\xe6\x81\x90\xea\xe5\xfc\x77\xf5\x87\x37\xfa\x5f\xe7\x7b\x64\x1d\x04\xf5\x85\xcf\xf1\x3a\x88\x89\x4d\xa3\xe5\x2e\xf6\xcd\xfe\xf9\x97\xb5\xc4\x4e\x0e\xb4\xd7\x73\x9b\x58\x06\x30\x49\x55\xf9\x1a\xf9\xa5\xfc\xd0\x94\x1e\x5f\x3c\x86\x7e\xe3\x8f\x38\xc5\x6b\x46\x3b\xf1\x6c\x36\x4b\xc1\xf6\xed\x17\x4f\x23\x1c\x58\x1f\x4c\x4b\x58\xf6\xee\xe3\x2f\x17\x6f\xdb\x1d\x70\xfe\xaf\xd4\x41\x9b\xf0\x7f\xb7\xb4\xff\x53\x07\x49\xab\x91\x81\x3e\xbd\xcb\x24\x05\x35\x5c\x7f\x4a\x11\x44\x34\x26\xf7\xf6\x76\xea\xa1\xb5\xc6\x26\x76\x15\xcb\x38\x6d\x1f\x7a\x60\xf2\xb0\x1c\xff\xb8\xf6\x9f\xe8\x83\xea\x4e\xf4\x41\x5f\xcd\xc5\x84\x95\xb9\x78\x39\x67\x76\xc8\xcb\x85\x45\x67\xe6\x8d\x4c\x39\x8d\x4d\x38\x1b\x63\xc3\xf3\xbf\x2f\x5b\x37\xef\xc9\xfd\x89\xaa\x42\xf2\x64\x1f\x94\xfc\xda\xbe\xa9\xa1\x6a\xab\xf8\x55\xd8\xb7\x6e\x9e\xd5\xfd\x5c\x74\x3f\x25\x41\xa3\x68\x40\x60\xe4\x06\xc3\x0b\xaf\x77\xd5\x1a\x7f\xe2\x65\xeb\x4e\xf6\x41\xe7\xaa\x47\xd8\xc4\xf8\xe7\x45\x60\xc4\x3f\xf9\xa6\x49\x3a\x6b\xe8\xf3\x0e\x3b\x2a\xa2\xb9\x09\x33\x8a\x34\x53\x6f\x47\xf6\xec\xfc\x91\xd5\x9e\xec\x83\xee\x0a\x85\x19\x7b\x09\x57\xda\x32\x6b\x5e\x10\x09\x95\x0d\xb7\x33\xf6\x7a\x16\x48\x8e\x97\xd7\xa1\x4d\xa6\xff\x42\x26\xf8\x66\xee\x1f\x59\xed\xc9\x3e\xe8\x05\xab\xea\x5d\xfd\x7d\xc3\x27\xa7\x4f\x2d\xe7\x03\x2b\xac\x6f\x34\xf1\xb6\xca\x7c\x70\x8b\xbb\x95\x46\xb9\xdb\x75\xb6\x6a\x99\xfe\x58\x1f\x04\x15\xdd\xdf\xed\xe7\xa6\x7d\x87\xe3\x21\xb9\x3a\x54\x6f\x4a\x25\x0c\xdb\x78\x54\xa9\xb4\x96\x22\x54\x57\x2f\x5c\x33\xe5\x7d\x29\x20\xae\x5c\x4a\x70\x74\xfe\x86\xe2\xc0\xfb\x39\x2b\xb9\x5e\x53\x40\x06\xe3\x64\x9c\xca\x29\xca\xe1\x0a\x6b\x61\x3a\xcd\x10\x16\x5f\xaa\xbd\x73\x4f\x6b\xdb\x53\x43\x68\x12\x15\x91\x73\xa1\x38\xf0\xbe\x7b\xa6\xe2\x94\xd4\xd9\xe2\xd9\x8b\x29\xb6\x7b\x2f\x44\x73\x7b\x03\x35\x3e\x09\x6e\xca\x3a\x65\x31\xce\xde\xc2\xf0\x30\x5b\x78\x0f\x3b\xea\xaf\x20\x38\xf0\x5c\xd1\xc4\xd0\x1b\x1b\x63\x41\xc0\x67\xf9\x25\x51\xff\x21\x5d\xde\x60\xb3\x3e\x86\x6a\x85\xe6\x60\xe6\x00\x35\x16\x41\xaa\x1e\x07\xe4\x5c\x28\xce\x4b\x9a\xe8\xef\x7d\xdb\xc4\x26\x5f\x1f\x5b\xd3\x19\x66\x7f\x6b\x4f\x71\xbf\xa2\x2a\xe6\x48\xc5\xa1\x6f\xc5\x0e\xe7\xd4\x48\xe2\x09\xa2\xe5\xea\xe6\x3d\xae\xfc\x3b\xee\xd7\xfb\xeb\x81\xf0\xf9\x75\xbf\xfa\x87\x13\x1d\xd4\x6d\xe4\x77\x09\xc8\xfe\x28\xd1\x2d\xdf\x72\xa7\x3c\xf7\xce\x2d\x5b\xcf\x97\x92\xa5\x97\x74\xb6\xf7\x7c\x70\x1f\xb1\x5f\xdc\x28\xe6\xbc\x49\x41\x71\xd4\xb0\x41\x71\xe0\x04\xdc\x1a\x4d\xea\x91\x7a\x80\xbd\xa2\x4b\x30\x4d\x22\x2a\xad\xbe\x3a\xe0\x65\x39\xa6\x62\xac\x5d\x14\xfa\xa3\x24\xa9\x36\x27\x25\x05\x39\x17\x8a\x03\x5f\x29\xfc\x39\xcb\x60\x39\x45\x02\x7d\x75\xa5\x33\x37\x6e\x2e\x29\xa0\x7b\xe6\x33\x4e\xbc\xbd\x78\xa3\xf4\x9a\x8f\x18\xdc\x21\xf1\x7c\x00\x72\x2e\x14\x07\x9e\x9b\x5e\x71\x2d\x63\x22\xdb\xef\x80\xbb\x74\x90\xe5\xc6\x50\xed\x00\xfe\xc6\x9b\x97\x16\xbc\x4f\x33\x68\x7d\x03\xdd\x9c\x9c\xd2\xbb\x90\x73\xa1\x38\x70\x02\x76\xaa\xe9\x03\x77\xbd\x8d\xec\x86\x04\x45\xb4\x5e\x7a\xe5\x7d\xc1\x35\x64\xb7\xe5\x25\x64\xfa\x9e\x17\x63\x62\x4a\x85\x7b\x90\x84\x2c\x78\xa0\xb8\xbf\x12\xf0\x9f\xcd\xe3\x1f\x22\x00\x75\x4b\xff\xed\x4d\x40\xfe\x42\x37\x55\x25\x69\x53\xca\xe0\x60\x06\xaf\xfc\x61\xca\x85\x3a\xa1\x94\x9e\x9f\x4d\x71\xd3\xf6\x6f\xec\x71\x92\x1f\xc8\x1e\xdd\x04\x20\x38\x70\x04\xee\x47\xa8\x24\xee\x5c\x7f\x1f\xfa\x2c\x51\x59\x54\x87\x7f\xe9\xa6\x41\xd5\xe7\xf7\xab\x5f\xd4\xce\xc0\x9e\x0e\x2d\x6c\x1a\x2e\xa1\x21\xe7\x42\x71\xe0\x4b\xa5\x98\x3a\x81\xc1\x1d\xfa\x7c\x41\xfa\xa3\x1e\x6b\x58\xf3\xc7\x2c\xff\xa9\xd1\x0b\x22\xa2\xb1\x34\x71\xd7\x86\x0b\x97\xa3\x5c\x8f\xfe\x67\x85\xe2\xc0\x73\x29\x9b\x95\x0b\xe3\xd2\xab\x5d\xa3\xa7\x06\xee\x57\x4e\xa8\x7a\x14\x2b\xa9\x2f\x12\xe7\x4c\x2e\x5a\x36\x15\x68\xa6\x7f\x60\x7b\x81\x9c\x0b\xc5\x81\x23\x60\x4e\xac\x60\xfc\x0c\x9b\xef\xd2\xf7\x87\xd5\x30\xac\x0c\xe7\x5a\x3f\xc2\xcb\x54\xaf\x5c\x5a\x2e\x76\xfb\x86\x8d\xb2\x7f\xfd\x39\x8a\x3c\xd4\x43\x71\x7f\x45\xe0\xbf\x3b\xf9\x3f\x64\x00\x6a\x7f\xfd\x5d\x06\x36\xb2\x4e\xeb\x55\x5c\x9b\x1d\x63\xb0\xde\x6b\x6e\x7e\xce\x10\x3b\xc9\xb3\xea\x69\x3b\x76\x19\x3b\x07\x66\xa2\x4b\x42\x9b\xf5\x1d\xb9\x76\x28\x0e\x9c\x81\x78\x5c\x5a\x1c\x8a\x9d\x07\xb6\xaa\x82\x09\x03\x5e\x04\xe6\xd7\x53\x9c\x56\x89\x34\xe3\x6a\x84\x3a\x9b\xf1\x07\xf7\xb1\x2a\xb3\x91\x73\xa1\x38\xf0\xb5\xe2\x42\xeb\x2e\xe4\xe3\xd0\x8e\xc4\x36\x0a\x20\x92\x12\x1d\x8e\x3d\x78\x62\x59\x4a\x40\xd4\x57\x5d\x71\x83\xc4\x66\x92\x34\x64\xfd\xa8\x3c\x84\xe0\xc0\x73\x59\x85\x04\x76\x64\x34\x03\xaf\x87\x35\xe5\x51\x12\x0f\xbd\xcb\xd0\x02\x92\x3f\xcc\x78\x9d\xca\xa1\xc0\xc7\xc6\x8b\x98\x78\x9c\x73\xb4\x71\x41\x70\xe0\x0c\x6c\x44\x38\x04\x5d\xe3\xe6\xf2\xaf\x4f\x09\xf8\xc4\x86\x93\x1e\xef\x38\x51\x2c\xeb\x9b\xd0\x51\x37\x6f\xe5\x19\x28\xed\xc2\xab\x8d\xcc\x00\x14\x87\xcc\x40\x1d\x44\xc1\x03\x75\xd8\xf9\x5d\x06\xca\xfd\xf4\x53\xf4\x33\x93\x12\x65\xc6\x64\x04\xf0\x0c\x76\xe4\x9d\x34\x8b\xf8\xea\x04\x17\x49\x0d\xae\x13\x4b\x24\x52\x7a\xcf\x20\xd7\x0e\xc5\x81\x33\x70\xf8\xa8\x55\xd9\x2b\x38\x80\x59\xe6\xea\x17\x93\x35\x4d\x0e\xf3\xe7\x31\x9a\x57\xe5\xc5\x7b\x82\x9c\xa4\x88\x57\x28\x97\x9c\xd5\x90\x73\xa1\x38\xf0\xb5\xfa\xae\x99\x63\xa1\xa8\x88\x67\x90\xf0\x68\x8f\x3f\x14\x2f\xa6\x0c\x6b\x39\x96\x6a\x86\xe4\x54\x15\xee\x5e\xaa\x8a\x58\xc6\x8f\x3c\xe4\x5c\x28\x0e\x3c\x37\x8b\x3d\xed\xae\x00\x8b\xb0\xb0\x21\x26\xf3\x62\xb3\x36\x55\xd5\x2a\x99\x1a\x51\xe6\xe3\x8f\x1a\x52\x3a\x9f\x05\x31\x61\xfa\xfd\x47\x65\x27\x04\x07\xce\x40\x04\x93\xd2\x0b\xb4\x9b\x7c\x83\xa3\x64\xc2\x3e\x22\x7e\x61\xfa\xa2\x63\x3d\x6f\xec\xcc\xf2\x44\x67\x5c\x87\x85\x23\x0a\x3b\x17\x91\x19\x80\xe2\x8e\xee\x03\x10\x05\x0f\xd4\xc9\xf3\x77\x19\xb8\x6b\x7a\x27\xc4\x7e\x9a\xbe\x5f\xaa\xe2\x8e\xdc\x93\x76\x17\x78\x8b\x95\xb1\xbb\x96\x2f\xb3\xb3\x8e\x2a\xde\x90\x7c\xac\xb2\x1e\x72\xed\x50\x1c\x38\x03\x11\xed\xee\x5f\x6b\x9e\x45\xdd\xcf\x1b\xd6\x9c\x91\xa4\x33\x7c\xc1\x6f\xef\xd7\x9a\x87\x37\x59\xb8\x9e\x37\xf6\xde\x87\x85\xc7\x0c\x39\x17\x8a\x03\x5f\x2b\xa0\xc3\x52\x29\xfc\xfd\xbe\x2b\xb9\x51\x7c\x44\xe9\xf0\xad\x48\x06\x8f\xe6\x50\xeb\xe1\x92\xc4\xa6\xdd\x53\x80\x72\x12\xe7\x51\xc1\x03\xc5\x81\xe7\x66\x77\xd7\xdb\x71\x46\x90\xbd\x94\xa8\xc7\x48\x0c\xc0\xd4\xef\x84\x7b\x96\xc4\xac\xf9\x3c\x2a\xd1\x97\x7f\xcd\xf6\xa5\xf5\xe0\xe8\x0b\x42\x28\x0e\x9c\x01\x57\xf7\xb7\xce\xfc\x64\xce\xea\xeb\xb2\x25\x9f\xfc\xef\x2c\x31\x88\x3b\xcf\xeb\x2c\xf0\x4a\x8d\x47\x54\xe4\xd4\x5c\x77\x9d\x90\x45\x66\x00\x8a\x3b\xba\x0f\x40\x14\x3c\x50\x9f\xdd\x7f\x5f\xf0\x9c\xca\xc5\xa9\x5f\x88\xa3\xa2\xf9\xe1\x92\xc4\xe0\x84\xb1\xb5\x14\xb9\xb5\x62\x25\x68\x97\x72\x49\xde\xfd\x3d\x79\x6c\x81\x4e\x03\xb2\x2c\x81\xe2\x4e\x16\x3c\x0f\xf0\x94\x86\xe2\x26\x2c\x71\x43\xc6\x5a\x19\xab\xe5\xb2\x6e\x2e\x75\xf9\x5a\x2a\x5c\x09\x26\xe2\x4d\x91\x25\xd6\x1e\xac\x95\x40\x4e\x86\xe2\x4e\x16\x3c\xed\x8f\xeb\x17\xab\xb7\x2e\xdf\xdf\x6a\xde\x8b\xb4\x8f\x15\x49\xa8\x4a\xb7\x8a\x7e\x69\x74\x05\xfe\xe0\x90\x97\x58\x02\xb6\x49\x82\x9c\x0c\xc5\x79\xc9\xa2\xa1\x61\xfe\x6d\xb2\x87\xd0\xa8\x9c\xb8\x24\x26\x85\xf6\xbd\x22\xdd\x44\xe2\xd2\xf1\xb3\xed\x78\x5d\xc9\xe2\x8d\xfd\x8c\x0e\x32\x23\x6c\x58\x9d\xb2\xc8\x82\x07\x8a\xf3\x92\xfd\x75\x6d\x3c\x10\x52\xbd\xc8\xc2\x06\xea\xb1\xdb\xe3\x85\xcd\x5d\xa6\xf5\x29\xc2\x9b\x5e\x12\x52\x6a\xf6\xaa\x18\xfa\x67\x5e\x06\xce\xe6\x14\x67\x39\x74\x87\x11\x7c\xf1\x7b\x9c\x88\xfe\xf4\xeb\x31\x74\x52\x7c\x4a\x20\xb1\xad\xe8\xb1\xc1\x86\xf8\xf8\x93\x50\xd7\x08\x22\x73\x31\xac\xd4\x7d\x58\x85\xf0\xe9\x3b\x0d\x1c\x67\x7c\x5e\xfc\xaf\x15\x36\x50\x4b\x3b\x56\xd8\x84\x83\x0b\x9b\xd5\x05\xef\x5d\x34\x3a\x3a\x97\x94\x69\xc4\x74\x47\xae\x07\xfb\xf7\x7d\x8d\xc2\xcd\x7c\x69\x12\xfd\x0f\x44\x65\x49\x11\xd3\x9c\x7f\xa2\xb0\x41\x53\x3e\xd1\x25\x50\x5c\xc5\x30\x5c\x1e\x52\x4e\xf1\x92\x9e\xdf\x33\x66\x3f\x08\x5b\xe3\xed\x59\x48\x24\x2d\xc4\xf9\x34\x4c\x72\x7f\x27\x8d\xef\x8f\x3c\x5b\x72\xb2\xb0\x59\x3b\xfb\x44\xf4\x41\xd4\x13\x8b\x4a\x71\x5e\x73\x05\xf1\x8e\x15\x8a\x1d\x36\xc5\x43\x9b\xa4\xcf\x40\x0d\x66\x2a\x96\x1f\xf7\xd3\x3f\xf2\x24\x8d\xe6\x89\x97\x15\x2d\xe2\x6b\x8b\x49\xbf\x25\xf9\xca\xf5\x52\xbe\xc3\xea\xcc\x23\xc3\xd8\xef\x5b\x62\x8c\x8d\x3c\x79\x5d\xaf\x8a\xe3\x16\x78\xbe\xfe\x91\xd5\x9e\x2c\x6c\xf8\x9e\x52\x29\x9e\xea\xb2\x5c\x7c\x17\xd1\x44\xb8\xc8\x8a\x4d\xee\x9c\x95\x34\xdf\x2f\x24\xf5\x72\xa8\xd6\xca\x5e\x8c\x5f\xa1\xfa\x8f\xac\xd6\xe5\xc4\xcb\xea\xd0\x2e\x33\x72\xb4\x29\xcc\xed\x5f\x08\x0e\xe6\x26\xc0\xb6\x25\x44\xef\x6a\x9c\x34\x48\x22\x91\x9f\x4c\xc3\xb9\x19\xc4\x73\xf0\xc7\x0a\x1b\xa8\xe8\xfe\x6e\x7f\x2e\x8a\x6e\xd7\xc1\xf5\x7c\xab\x31\xd7\x58\x4b\xfa\x8d\xb3\xd8\x97\xaa\x7b\x4c\x70\x5d\xe8\x7e\x42\x93\x5a\x61\xd1\x37\x0b\xc2\xa3\xf3\x34\x14\x07\xde\x9f\x0f\x1e\x0f\xf0\x27\xbc\xdc\xfc\xf4\xe0\xa6\x6f\xba\x69\x1a\x36\x25\xcd\xf3\x3b\x8c\x11\x21\x12\xc6\xbd\xf3\xb2\x6d\x34\x6e\xf7\x6f\x23\xe7\x42\x71\xe0\x7d\x74\xa5\x42\x66\xd7\xe6\x3d\xd6\xbd\x67\x9b\x98\x73\x37\xa5\x60\x11\x75\xe2\x92\x7d\x9d\x97\x8d\x16\x25\xec\x2f\x6b\x27\x3f\x10\x2f\x42\xce\x85\xe2\xc0\x73\xdf\xf4\x8e\xe4\x93\x9f\x0e\xa5\x34\x6d\xdf\x3c\xa7\xeb\x11\xe6\xd7\x55\x2e\xf8\xc9\xd8\x8b\xcf\xbf\xf8\x2c\x63\x6b\xef\xdc\x56\x03\x72\x2e\x14\xe7\x25\x8d\x06\x3b\x3e\xf7\x33\xb6\xac\xfa\x84\x62\x3a\xf7\xd7\x4e\x09\xb1\x32\xa7\x4b\x93\x71\x96\xf1\xd9\xbc\x30\xe2\x6d\x53\x17\x86\xab\x1a\x8b\x51\xd4\xc8\xc2\x06\x8a\xf3\x92\x3e\xf5\x9f\xc2\x26\xfc\x1f\x0b\x1b\xa8\xdb\xc8\xef\x12\xf0\xd6\x4e\x8f\xa7\x8c\x76\x97\xbb\x5b\x20\x2a\x83\x35\xf8\x8a\x22\x76\xfc\x98\xca\xc7\x52\x45\x26\xff\xb1\x67\x73\xaf\xb9\xdb\xa6\x90\x2b\x87\xe2\x4e\x54\x76\x43\xef\x9e\x15\x3e\x52\xe0\xb0\x2f\x9b\x26\x5a\x9c\x2f\xc9\x76\x16\xe6\xbd\xb1\x08\x57\xf3\xa3\x55\x1d\xbb\x38\x72\xfa\xe1\xd1\xa7\x75\x28\x0e\x7c\xa5\x9a\x2f\xd6\x4f\x31\xb6\x3a\xe1\x5c\xc6\xe4\x1b\x5e\xe2\x8e\x67\x9d\xbb\xdd\x3a\xd8\x20\x7c\x56\x24\xa4\xfa\x0a\x87\x45\xfa\x5e\x3d\x72\x2e\x14\x07\x9e\x6b\xc1\xfe\x95\x16\x67\x06\xc7\xfa\x01\x81\xcb\xb5\xaa\x4b\x68\x55\xc4\xb2\x03\x1a\x00\x6f\x23\x73\x38\xa9\xb1\xf7\xaa\xdb\xca\x10\x72\x2e\x14\x07\x4e\x00\x02\x83\xe9\x2c\x3c\x11\xe7\xc2\xe7\xec\xfd\x67\x66\xb9\x85\x9b\x97\x0b\xf3\x7f\xa6\x46\x54\x8a\x44\x7d\x1f\xc3\x22\x84\xb1\x04\x21\x0b\x1b\x28\xee\xaf\x04\xfc\x67\xf3\xf8\x87\x08\x40\xdd\xd2\x7f\x17\x01\x2c\x5c\xc5\xf6\xe4\x98\xb9\xd1\xfc\xd0\xc8\x1c\x0e\x43\xac\x5d\x03\x4b\xec\x2f\x8c\x88\xfc\x09\x11\x93\x61\x16\xf1\x00\x92\x27\xc8\xa5\x43\x71\xe0\x08\x30\x3d\x01\x0a\x9d\x5c\xaa\x09\x35\x5c\xd0\xbe\xe5\xd5\xd3\x04\x53\x8b\x4c\x5d\xed\xd2\x93\x74\x85\x9d\x53\xbf\xbb\x98\x7e\x81\x00\x39\x17\x8a\x03\x5f\xaa\x4e\x6e\x8d\x10\x19\xa9\x39\xd2\x6b\x9a\xf6\x22\x74\xb8\x9a\xb2\x5a\xb8\x42\x9b\x45\x82\x14\x5c\xf3\x5c\x29\xa9\xf2\x67\x5e\xeb\x22\xe7\x42\x71\xe0\xb9\xba\xd4\x87\x05\xf3\x14\x8d\x15\x2c\x33\xb4\xe6\xd7\x67\x1f\xab\x4a\x33\x7b\x56\x15\x05\x96\x88\xc6\x54\x48\x78\x73\xa3\xe9\xdd\x41\xce\x85\xe2\xc0\x11\xc0\xa4\x77\xdb\xa5\xb8\x31\x14\xc3\xdb\x3d\x5b\x62\x9a\x5a\xfc\x2d\x2d\xf2\xd0\x22\x87\xba\xa3\x5e\x8a\x56\xb1\x8d\x38\xf1\x71\x1d\xf2\x90\x0e\xc5\xfd\x15\x81\xff\xee\xe4\xff\x90\x01\xa8\xfd\xf5\x77\x19\x50\x2c\xcc\x55\x18\xa0\xc9\x6a\x09\x63\xd0\x24\x13\x66\xa1\x94\x3c\x40\xb8\x4e\xd9\x3b\x57\x3f\x99\x5c\xf7\x50\xc0\xb9\x21\xb4\x7b\x54\x82\x41\x70\xe0\x0c\x08\x38\x95\xad\xd5\x68\x19\x3e\x76\x33\xeb\x39\x4b\xc4\x6a\xe5\x40\xb9\xfc\xfa\xee\x73\x7c\xca\xcd\xfd\xd5\x8f\xda\xac\x2d\x1f\x31\x90\x73\xa1\x38\xf0\xb5\x92\x7c\x51\xe0\xff\xae\x9a\xd0\x4c\xae\x58\xd7\x33\x8d\xe8\x69\xf8\x4c\xf7\x78\xd0\xa1\xf7\xd2\x73\x4e\xca\xc7\x18\x0c\xea\xdd\xe3\xc8\xb9\x50\x1c\x78\xee\x45\x99\x11\x3d\x66\xa2\xc5\xf5\xa5\x2b\x8a\xca\x2d\xdf\x8d\xab\xe4\x69\xc9\xee\x1e\x86\x9f\xb2\xb4\x68\xc6\x60\xff\x34\x9c\x74\x0e\x39\x17\x8a\x03\x67\xc0\x37\x8c\xa0\x3c\x85\x2a\x60\x4c\xc6\xa7\x1e\x8f\x9a\xac\x8b\x25\x1b\x2e\x2b\xf4\x58\xea\x5b\xb8\x9d\xd5\x41\x59\xf7\xb6\x55\x11\x32\x03\x50\x1c\x32\x03\xff\x39\x56\xfd\x43\x06\xa0\x0e\x3b\xbf\xcb\x00\xa6\xc2\x7e\x83\x57\xae\xbf\x03\x75\xbb\x8b\xf3\x7b\xd7\x54\xbd\x57\x8e\x37\x9f\x1a\x6f\x39\x64\x0a\x62\xd0\xf8\x12\x24\x1b\xc7\x20\xd7\x0e\xc5\x81\x33\x10\x83\xab\xe9\xce\xc8\xf7\xf0\x2a\xd6\x3d\x17\xc9\xfb\x8b\x71\x35\x11\x5b\x08\x1d\xcd\xf2\x68\xa5\x7b\x32\x0e\x29\xd7\x43\x06\x47\x91\x73\xa1\x38\xf0\xb5\x52\xde\xeb\xef\x50\xee\xa8\xa9\xba\x1e\x57\x97\x4a\xf3\x38\xe8\x73\xd7\x83\xba\x31\xf4\x68\x43\x91\x2c\xd1\x3a\x3c\xdd\x14\xa1\xa3\x0c\x40\x71\xe0\xb9\xe2\x4a\xa9\x0f\xdb\xb8\x8d\x36\x25\x3f\xdd\xb4\xec\x59\x62\xb7\x21\x65\x61\x7c\xcb\x7e\xaf\x6a\x1b\xfd\x4d\xa2\xd8\x86\x41\xc0\x20\x72\x2e\x14\x07\xce\x80\x6a\xd0\x97\x80\x50\xd1\xbb\x44\xe9\x52\xbe\xbb\x97\x75\xf7\xe5\x04\xfc\xa8\x2f\x5a\xc8\x67\x27\xc1\xc7\x3e\x99\x74\xeb\xc5\x11\x22\x33\x00\xc5\x1d\xdd\x07\x20\x0a\x1b\xa8\x93\xe7\xef\x32\xb0\x42\x6b\x41\x81\x18\x11\x72\x8f\x88\x55\xd9\x6b\x36\xdc\x36\xd0\xc4\x79\xa5\x6d\x4e\x36\xc6\x3e\x93\x07\x8c\x0e\xfa\xdc\x3a\x7a\x22\x0d\x8a\x03\x67\x40\xd3\x20\x21\x4c\x41\x6c\xf8\xc6\xc6\x9d\xf2\x08\x22\xa1\xa4\xda\xf0\x73\x08\xed\xc0\xde\xf5\x10\x3e\x9d\x3d\xa3\xba\x15\xc4\x7d\xe4\x5c\x28\x0e\x7c\xad\x6c\x9d\xe2\x64\x72\xac\x96\x48\xd5\xa9\xfd\xab\x9d\x52\xd6\x1f\x98\xad\xab\x89\x65\x98\xb5\x4a\x31\xa1\xf7\x0e\xf5\x97\xba\xb6\x23\xe7\x42\x71\xe0\xb9\x96\xcb\x36\xe8\xaa\xfd\xf7\x49\x2d\x4f\xb7\x54\xf5\x15\x36\x3a\x8c\x6d\xdc\x8d\xff\x71\x26\x93\xcc\x4e\x2b\xe6\x7c\x36\x7b\x9f\x07\x72\x2e\x14\x07\xce\x00\xcb\xe6\x80\x8b\x66\xbc\xd3\xa7\xc4\x4a\x93\xbe\xb5\xc8\xd3\x3b\x3b\x9f\x74\x82\xcb\x3f\x24\xe4\xbc\x9b\x67\xc4\xc6\x12\xdb\x59\x41\x66\x00\x8a\x3b\xba\x0f\xb8\xfc\x73\x61\x03\xf5\xd9\xfd\xf7\x85\x0d\xe5\xf5\x2b\x1c\x39\xc4\x2c\xd1\x94\xc4\x71\xb2\xb2\xc3\xe3\xdb\x9c\x18\x7a\x8c\xdd\x1e\x3d\x13\xc5\x65\xf7\x2a\x7c\x1f\x66\x99\x1c\x3d\x37\x03\xc1\x9d\x2c\x6c\x3a\x7b\x94\x2e\x76\x34\x04\x27\x24\xb1\x29\x08\xb1\x85\x57\x19\xef\xb8\xec\xce\x3c\xd2\x8f\xf8\x79\xb3\xa2\x4d\xe6\x12\xd6\x92\x3c\x72\x32\x14\x77\xb2\xb0\xc9\x4c\x38\xcb\x70\xd5\xb0\xf9\x42\x4d\x07\x1c\x67\x39\x3c\x44\x51\xe1\xa3\x5e\x1b\x5c\x2c\xed\xe0\xda\xf7\xa2\x6f\x4b\x19\xe4\x13\xc8\xc9\x50\x9c\x97\x2c\x1a\xda\xdf\x4b\x36\x95\xf8\xd3\x6b\x69\xea\x24\xb5\x67\x79\x3f\x0b\xf2\xa7\x68\x7c\x61\x0e\xaa\xf8\x3a\xf4\x95\x26\x7f\xe7\xfd\x29\x11\x3f\xce\x5c\x2b\x64\x61\x03\xc5\x79\xc9\x9e\x02\x15\x36\x50\x3f\x7e\x3e\x5e\xd8\xf0\xf4\x57\xb4\x8f\xee\x4a\xde\xd1\x61\xe5\x2e\xa8\x3a\xec\xc8\x6a\x9e\xcf\xdb\x5c\xfb\x66\x66\xa4\x07\x70\x9f\xc7\xbf\x53\x36\x70\x7c\x73\x84\x3d\xc2\xf5\x29\xd8\xa0\xff\x49\x44\x39\x34\x5b\x4d\x7b\x59\xe8\x87\xff\x34\xee\x3d\xdd\x07\x9e\x9f\xfb\xb8\xbe\xcc\x89\xfc\xcf\x3d\x61\x03\xb5\xb4\x63\x85\xcd\x27\x70\x61\xb3\xb7\x7f\x98\x49\x49\x96\xf1\x09\x47\xbd\x6f\x41\x75\xd5\xa2\xa9\x56\x50\x2d\x4f\x8a\x84\x4b\xd1\x8a\xe3\xf4\x19\x34\xad\xba\xe8\x3f\x51\xd8\x48\x9e\x28\x6c\x3c\x31\xa6\xda\x69\x6e\x3d\xa9\xc6\xf8\xc6\x9c\x7f\xff\xa6\x71\x60\xfb\xb7\x2f\x3d\xf2\x39\x38\xce\xe1\xb7\x05\x61\x8f\x57\x4c\x7b\xfe\xc8\xc3\x1f\xbf\x29\x6c\xac\x5e\xb6\xbf\x72\xe5\x16\xd5\x93\x2f\x43\xdc\xcb\x8a\x21\x59\x9e\xff\x5a\xae\x2a\x1d\x77\xa7\x2a\xa9\xa8\x4f\xc9\x73\x52\xf6\x8f\x3c\xea\x72\xb2\xb0\xb9\xb3\xf1\x3c\xb6\x16\xff\x96\xe9\x65\xd7\x7a\xe7\x60\x9f\x96\x7c\xae\x58\xb4\xc8\xd7\x6c\x35\x01\xec\xcd\xdf\x6b\x47\x62\x73\xed\xfe\xc8\x6a\x4f\x16\x36\x97\xf8\x28\x99\xd6\x27\x7d\x17\x36\x5f\x4c\x19\xea\x97\x63\xc5\xa8\xb0\x19\x31\xef\x27\xbd\x70\x7c\xef\x14\x19\xe3\x2b\x00\x2f\xfe\x23\xab\x3d\x59\xd8\x9c\x71\x0c\xf4\x58\x22\x31\x56\x55\xd6\xe2\x8b\xc8\xdd\x88\x82\xdf\x9e\x59\xb4\x36\x1e\x7d\xda\xf3\x59\xa9\x75\x6a\xca\xfe\xb3\xf8\x1f\x2b\x6c\xa0\xa2\xfb\xbb\xfd\xb9\x29\x61\xdc\x33\x35\x50\x3b\x3b\x38\x78\x6c\x47\x2a\x23\xdf\x67\x66\xf7\x2e\xc5\xdb\x25\x02\xce\xcc\x1b\x34\x12\xf9\x31\x36\xd5\xc8\x7d\x09\x8a\x03\xef\xcf\x61\x61\xe7\x8c\x3b\x4d\x73\x7d\xf0\xdf\x06\x6a\x37\xe0\x74\x0d\x0f\x5f\x49\x3c\xcf\x37\xf8\xde\xb7\x42\x63\xcb\xca\x78\xb7\x75\x1f\x39\x17\x8a\x03\xef\xa3\x85\x21\xc4\x43\x12\x7a\x9c\x2e\xbb\xdb\x52\xfb\xd8\x0b\x3f\x83\x30\x2b\x8d\x4f\x33\xaa\xeb\x36\xba\x75\xa7\x7c\x7c\x19\xe7\x7f\x54\x2f\x40\x71\xe0\xb9\x7c\xe3\xa1\x14\xea\x06\xad\xa1\xfc\x38\x57\xfc\x0b\xd4\x27\xa8\x01\x3a\xe3\x54\xb6\x8a\xf5\xa1\x26\xf2\xf9\x2e\x96\xab\xd3\x00\x72\x2e\x14\xe7\x25\x8d\x76\xea\x6f\x4f\x8f\x07\xef\x94\x3d\x5f\xba\xf2\xfd\x7c\xfe\x55\x63\x8e\x59\xae\x8b\x9d\x4c\x92\xcd\xb4\x13\xc9\x4d\xeb\xa3\x15\x0d\xae\xd7\xc5\x9d\x91\x85\x0d\x14\xe7\x25\x8d\xe6\xe1\x81\xf0\xf9\x75\xbf\xfa\x87\x13\x1a\xd4\x6d\xe4\x77\x09\xa8\x23\xbf\xca\xae\xf8\x95\xf3\x86\x23\x53\xdb\x98\x98\xe9\xb5\x9b\x66\xad\x6d\x7c\xfe\x2b\xc6\x04\xcb\x63\x8b\x7e\x8d\x42\xbc\x4a\xc8\x95\x43\x71\xe0\x04\x50\x60\x86\xd9\x67\xdb\x5e\xec\x6d\x1a\xb9\x47\xa7\xe5\x40\x37\xca\x39\x3a\xf3\x74\x74\xaf\xcc\x2b\xaf\x99\xe8\x4e\xed\xe1\xc3\xa3\x64\x41\x71\xe0\x2b\xe5\x7f\x9d\xc5\xe8\x41\x0f\xd1\x75\x8b\x00\x5c\x98\x53\x90\x44\x43\xb1\xe3\xc3\x64\x8f\x9c\x3b\xad\xd6\x5b\x76\x7e\xa3\x3a\x6e\x3d\xc8\xb9\x50\x1c\x78\x2e\x8d\x98\xc1\x94\x35\xc5\x35\x0d\x96\x4c\xd3\xfc\x77\x4e\x74\xd3\x96\x1d\x9d\xb3\xea\x4e\x37\xec\x9f\xc2\x39\x78\xa9\x5b\x3b\xb5\x91\x73\xa1\x38\x70\x02\x92\xd0\xe3\x6f\x0d\x6b\xb1\x90\xbc\x0d\xbb\x77\x5a\x91\x8d\xdc\x5e\x89\x78\x7d\xd3\x69\x5a\x8e\x80\x26\xbe\x70\xbb\xc9\xda\x26\x10\x59\xd8\x40\x71\x7f\x25\xe0\x3f\x9b\xc7\x3f\x15\x36\x10\xb7\xf4\xdf\x45\xc0\xa3\xdc\xea\x34\x1d\x23\x7c\x39\x29\x5c\x49\x8c\x78\x63\xdc\xc3\x24\x88\xac\x38\xea\xbc\xce\x50\xc2\x27\x41\x0e\x73\x5f\x7c\x4e\xe4\xd2\xa1\x38\x70\x04\x36\x8d\xb6\xb1\x7c\xe4\x0b\x15\xd5\xe1\x87\xbe\xe5\x18\x19\xce\xa1\x9c\xb0\x79\x73\xf6\x35\x85\xe5\x6f\x4f\xe6\x5d\xce\xf0\x7a\x21\xe7\x42\x71\x27\xbe\x59\x77\xd6\x94\xbb\x1d\xc5\x65\xff\x3a\x77\xb4\x9c\xdc\x46\x29\x5e\x39\xe1\xdb\x43\xf4\x28\x0f\xbb\xdc\x1f\x45\x95\xb2\x21\x12\x47\x6d\x30\x14\x07\x9e\x1b\x18\x53\xfc\x7e\x14\x87\xa9\x2a\x57\xb1\xb0\xcd\xe0\xfa\x2d\x27\x55\x21\x7a\xaa\x16\x43\xef\x17\x14\xcf\xf8\x0f\xbe\x7e\xd6\xcf\x3d\xfa\x09\x09\x04\x07\x8e\xc0\xfd\x94\x79\x52\xc1\x01\xf4\x7e\x59\x3c\x98\x95\xfb\x01\xdd\x5d\xb4\x35\x9e\x6f\xb9\x93\x86\x7b\xf7\x5f\xe6\x46\xa7\x3e\xe0\xde\x41\x1e\xd2\xa1\xb8\xbf\x22\xf0\xdf\x9d\xfc\x1f\x32\x00\xb5\xbf\xfe\x2e\x03\xe4\xdf\xe9\x32\xcf\x5f\xc0\x0d\x69\x48\x77\x3f\xa0\xd9\x6b\xde\x20\xfa\x49\xd3\x51\xf6\xa5\xe0\xbd\xa1\xe3\x41\x61\xdf\x27\xb7\xcd\xa3\x9f\xa5\x41\x70\xe0\x0c\xb4\x71\x52\x68\xd8\x0d\xce\x06\x66\x1d\x62\x89\x16\xa0\x8d\x62\x5d\xf8\x94\xa3\xac\xe8\x22\x74\x0b\xe7\xc2\x28\x1a\xe6\x60\x83\x3b\x72\x2e\x14\x07\xbe\x56\xa3\x14\x51\xc5\x5f\x6f\x74\xac\xcb\x6e\x66\x7f\x96\xcc\x6c\x28\x7e\x52\x9b\xc8\x47\xdd\xcd\x16\x4e\x1e\xb5\x98\xa0\xad\xac\xdb\x86\x9c\x0b\xc5\x9d\x28\xed\x4a\x78\x30\x7b\xda\x13\xc3\xeb\x9c\x1a\x28\x3d\xe9\x45\x53\xdc\x5e\x3f\xe1\xdd\xa4\x23\x1b\x0f\x7f\x1f\xe7\x86\xc8\x35\x7c\x77\x54\xda\x41\x70\xe0\x0c\x78\x49\x9f\x32\xe5\x66\xf1\x23\xa5\xfc\x10\x15\x8a\xf6\x74\xda\x45\xd6\xe5\xb1\x01\x8d\x83\x56\x53\x69\xe5\x8c\x4b\xbc\xf5\x29\x61\x64\x06\xa0\x38\x64\x06\x24\x21\x0a\x1b\xa8\xc3\xce\xef\x32\x00\x7f\x31\x80\x55\x62\xf1\x45\x19\x3e\xdb\x1a\x55\xf1\xda\xd3\xcc\xf0\x74\x63\x0b\x7d\x6d\x63\xd9\x8b\xa2\xad\x81\x28\xde\xc0\x10\xe4\xda\xa1\x38\x70\x06\x3a\x98\xc5\xc8\x55\xb4\xb4\xd7\x2b\x82\xb2\x1f\x13\x1a\x2e\xb5\xa7\x69\x2f\xd8\xaa\xc1\xdb\xc3\xf5\x23\xe2\x0f\xe8\xb5\xac\x8e\x9e\xde\x82\xe2\xc0\xd7\xea\xf0\x46\x4e\x77\x4c\xd9\x1d\xb1\x54\x26\x67\x01\xbc\xa9\xf7\x7c\xaf\xa6\x88\x0c\x9c\xe4\x15\xec\x5a\xee\xd9\x7e\xd7\x63\xde\x77\x3e\x7a\x72\x07\x82\x03\xcf\x55\xd8\x16\xed\x5d\xd5\xc7\xc0\x4e\xf7\xcc\x51\x4f\xbe\x6f\x73\xc6\xb7\xb3\xab\x1a\xfd\x63\x6c\x36\xa2\x40\xee\xf6\xb0\x87\xc2\x53\xe4\x5c\x28\x0e\x9c\x81\xe2\x33\xdf\x5e\xd5\x7c\x47\x5b\x42\x77\x7e\x66\x34\x4a\xdc\xf1\xa4\xec\x9a\x4b\x8b\xcd\xf0\x37\x9c\x0e\x81\xcc\x51\xba\x52\x7e\x55\x64\x06\xa0\xb8\xa3\xfb\x00\x44\x61\x03\x75\xf2\xfc\x5d\x06\x78\x56\x3c\xd1\xcd\x73\x17\xa8\xb8\x6f\xb3\xa6\x5f\x6b\x4c\x0b\xa3\xcb\x91\xbf\x8d\xad\x93\xcc\x7e\x1e\xa1\x4a\xd8\x82\x50\x35\x47\xae\x1d\x8a\x03\x67\xe0\x53\x5a\x92\x75\xe1\x2c\x3e\xc5\x05\x9e\x90\x4e\x86\xc3\xf4\xbd\x1b\xde\xd1\xb9\x91\x75\xe9\x5a\xdf\x9e\xd2\x2c\xc5\x7c\x2b\xbc\x8b\x9c\x0b\xc5\x81\xaf\x55\x08\xf0\x34\x7c\x4f\xdb\x26\xcb\xce\x85\x78\x51\x16\x17\xdb\x86\x46\x30\x64\xc8\xbe\x4f\xad\xa4\xe9\x61\x99\xa1\x2c\xc1\xf9\x20\xe4\x5c\x28\x0e\x3c\x77\x90\x49\xb2\xdb\x1c\x1b\xb3\x04\xd7\xc4\x42\x52\x4a\x87\x21\x1e\xf0\xba\x9c\x9d\x7a\xe1\x0a\x4b\x94\x43\x62\x7d\x90\x88\xfe\xd1\x4f\x4a\xa1\x38\x70\x06\xae\x35\xcf\xc4\xb0\x26\x92\x66\x9b\x6e\x7f\x0d\xb0\x26\x55\x88\xa8\xc2\x26\x7f\x64\xf0\xce\xaa\x8c\x12\x73\x68\x4b\x5d\x2d\xa2\x0c\x99\x01\x28\xee\xe8\x3e\x00\x51\xd8\x40\x7d\x76\xff\x7d\x61\xd3\x27\x22\xe0\xef\xd6\x6d\x6a\x77\xe6\x0e\x9f\xd3\x96\x7a\xe8\x87\x49\xed\x7d\xb6\xd7\xa4\x94\xd7\xd9\x0b\x04\x27\x34\x9c\x6a\x01\x64\xf9\x01\xc5\x9d\x2c\x6c\xc2\x43\xbd\x74\xe7\xcd\x0b\xce\x4e\x32\x9e\x8f\x63\xf7\x68\x95\x49\x38\x9c\x10\x2f\xd5\xb2\x78\x66\x45\xe8\xe2\xa0\xe7\x83\xfb\x1e\x39\x19\x8a\x3b\x59\xd8\xb4\xb4\x9f\xce\xc1\x2f\xb0\x73\xec\xc5\x60\x65\xb9\x70\xa7\x06\x30\x3e\xc3\x59\x45\xda\xef\xe9\xd8\x29\x1f\xc2\xd6\x73\x37\x61\x00\x39\x19\x8a\xf3\x92\x45\x43\xa3\xff\xfb\xf3\x46\xf1\xa7\x9f\xe3\x47\xdd\x36\x81\xeb\x08\x55\x8a\x03\x4a\xae\x4b\xcf\x6e\xbf\xb0\x76\x16\x38\xdf\xf4\x5c\xd7\x19\x53\x2c\xa5\x04\x59\xd8\x40\x71\xbf\x26\xff\xba\x6a\xff\xa7\xb0\x81\x52\xd0\x1d\x2f\x6c\x7c\x64\x49\x12\x4a\xb0\x4a\x3c\x19\xe5\xc5\x5d\x29\xdd\x67\xd3\x73\xb8\xee\x45\x3a\x25\x9f\x9f\x9b\xcb\x65\x73\x6a\xe9\xf3\xf3\x3e\xfe\x2d\x49\x79\x91\xc1\xbc\x80\xa1\x99\xf9\x68\xfc\x8a\xed\xec\xdb\x09\x53\xc9\x09\xb1\x9f\x30\x97\xc6\x2a\x15\x9f\x43\xd7\xcc\xaa\x98\xff\xb5\xc2\x06\x6a\x69\xc7\x0a\x1b\x22\x72\xd0\xc7\x6b\xe3\x1a\x60\x63\xe8\x71\x6a\x35\xc1\xb7\x84\xd8\xd5\x5d\xca\xad\xb8\x0e\x9f\xeb\x69\xd9\xe7\xb2\x6c\x5f\x48\x15\x29\xe5\x47\xe4\xfd\x89\xc2\xc6\xe3\x44\x61\x33\xff\xd8\x19\xa0\x7b\x59\xc2\x32\x37\xd6\x1f\x82\xc1\xa8\x3e\x4c\x5a\x43\x39\xe1\x6e\x96\xaa\x2e\x0e\xb7\x81\xa7\x28\x5f\xe6\xfa\x23\x0f\x7f\x08\x9e\xe8\x12\xaa\x9a\xb3\x6e\x66\xb7\xd1\x9c\xa6\x15\x3a\x65\x59\x64\x47\xf7\x40\x36\x9b\x5a\x16\xff\x8a\xb0\xd1\xc4\xa7\x6b\x25\x86\xf8\xf1\x7f\xe4\x99\x13\x8f\x93\x85\x0d\x5e\x8f\x4a\xce\xe9\x5c\x29\xc6\x66\x62\x79\x13\x3a\x55\xe5\x24\x77\x2f\xf2\xb8\xb8\xb0\x67\xbc\x41\x59\x97\xbf\xa4\x5c\x7a\x9b\xf5\x47\x56\x6b\x74\xe2\x65\xf7\xd8\x74\x9e\x2f\xff\x1c\x2e\xa9\xaa\x7f\x69\x8e\x9f\x8c\xf6\x7a\xe7\x34\x0d\xf0\xc8\x9f\xd2\xfb\xbe\xc0\x59\x9e\x06\xfd\x9a\xc8\x3f\xb2\xda\x93\x85\x4d\x56\x06\xf3\x84\x20\x7b\xd3\xbe\x38\xa1\x42\x00\xc5\xb4\xcc\xa4\xf8\x5b\xfc\x4c\x72\xda\x5d\x5b\xee\xcf\x91\x43\xbe\x70\x8d\xf7\x7f\xac\xb0\x81\x8a\xee\xef\xf6\xe7\x57\x25\xd9\x6b\xbe\x31\xbe\x4c\xdb\xe3\x5f\x8c\xb7\x18\xce\x05\x6e\x6f\x6e\x9f\x67\xe3\x9d\x4d\x0a\x9f\x28\x64\xe4\x33\xc9\x2b\x40\xee\x4b\x50\x1c\x78\x7f\xde\xa0\x79\xf5\x71\x6a\xb2\x9a\x8f\x8e\xce\x91\x58\xe7\x11\xa1\x64\xb2\xe3\xae\x1b\x55\x85\x11\x2d\xf6\xf4\xd6\x79\x5a\x1d\xed\xad\xa3\x27\xec\x21\x38\xf0\x3e\xea\xab\xb6\xa1\x36\x83\xb9\x68\x77\x66\x39\xde\x9d\xa9\x80\x37\xe0\x8d\x72\x18\x67\x87\xca\xf8\x24\xff\x19\x22\xb6\xa7\x98\x76\x57\x91\x73\xa1\x38\xf0\xdc\x8d\xd4\x94\x9c\x14\x5f\x37\x53\x9b\xc5\x5a\xb1\x98\xcd\xd2\xc4\x11\x2d\x47\x39\xbb\xdd\xf5\x12\xde\xe1\x89\x4b\x46\x7e\xe7\x56\x8f\xfe\xbd\x10\xdc\xaf\x7d\xf4\x6f\x4f\x99\x6f\x74\x96\xe5\xb1\x26\x5f\x51\x28\x27\x33\x70\xa6\x79\x70\xab\xe2\x09\xc1\xdb\x7d\xc4\xc1\xb9\xe9\xc8\x9e\x20\x21\xaf\x44\x13\x64\x61\x03\xc5\xfd\xf5\x13\xe7\x5f\xf7\xab\x7f\x38\xa1\x41\xdd\x46\x7e\x97\x80\x9a\xdc\xb2\xa2\x8b\xcd\x43\x1a\x6f\x6a\xc6\xef\x0d\x38\x34\x7e\xb4\xc4\x48\x7d\xe3\x27\xc6\xbe\x37\xcb\xca\xdf\x8c\xd6\xe6\xa3\x8c\x5c\x39\x14\x07\x4e\x40\x6a\x4d\xf2\xf2\x8c\xc4\xea\x8f\x2f\xdc\x1c\xbd\x2f\x67\x70\x2c\x89\x28\x44\x87\xec\x0a\x4f\x19\x44\xe4\x5c\x8b\x09\xc6\x12\x39\x7a\x12\x06\x8a\x03\x5f\xa9\x9f\xe3\x7a\xd1\x9b\x83\x3a\xfc\x7a\xfb\xcd\x31\x9d\xa1\x3d\x92\x5f\x07\x3c\x3b\xa3\x4c\x8d\xf4\x25\xac\xde\x5c\x2d\x2e\xc8\x24\x45\xce\x85\xe2\xc0\x73\x6f\x14\x13\xcb\xbe\x31\x3e\x2f\x10\x89\xb1\x75\xb8\x9a\x6c\x71\x87\xfe\xf1\x53\x9e\x91\xb4\x61\xff\x42\x09\x44\x38\x5c\x38\xf2\xa8\x08\x82\xe2\xc0\x09\x48\x5f\xde\xeb\xd4\xbc\x60\x9b\xdf\x6c\x82\x5f\xba\x6e\x35\x32\xeb\xb2\xb1\x8c\x9e\xce\x2f\x1d\xab\x91\xc4\xce\xfe\xf1\x79\x4c\x31\xb2\xb0\x81\xe2\x8e\x9c\x37\xff\x5c\xd8\x40\xdd\xd2\x7f\x17\x01\x9a\x85\x36\x86\xe8\x6f\x0c\x9d\xc4\x93\x75\x2f\x7f\x38\x71\x2e\x35\xfd\x14\xa4\x51\xb8\x42\x38\x1d\x63\x32\xdb\x73\xdd\xcd\xd3\xf4\xa8\xab\x82\xe0\xc0\x11\x70\x32\xb9\x20\x46\x37\xd3\x5e\xc9\xfe\x61\xbe\x90\x86\xbf\xa7\x88\xfa\x61\xc4\x1a\xaf\x66\x03\x7d\x88\x6e\xb1\xc8\xa5\x9b\x58\xad\xc8\xb9\x50\xdc\x89\xc7\xe1\x56\x6b\xd9\x30\x63\xb4\x6e\xbc\x12\x0f\xbb\x65\xb5\xe2\x97\xd0\x35\x73\xbf\xa8\x6f\xae\x7e\x1a\x63\xd0\xa2\x45\x32\x56\x7e\xe0\xe8\x71\x38\x08\x0e\x3c\xb7\x68\xfe\x7d\xfd\xdb\x31\xee\x85\x40\x67\x9c\x9c\x86\xd0\xd4\xab\x06\x6e\x2b\x7e\x35\xbc\xda\x03\x42\x02\xc0\x37\x34\x7b\xa3\x1b\x47\x8f\x1b\x42\x70\xe0\x08\xf0\xe3\xbf\x37\x63\x62\xc7\x5e\x1c\xb6\x93\x91\x71\xa5\xf7\x76\x6c\x51\xf0\x2a\xb8\x20\xf9\x54\xfb\xda\x35\x1a\x8e\x67\x37\xb2\xdb\x90\x87\x74\x28\xee\xc8\x75\x21\xf8\xcf\x1f\xd4\xa0\xf6\xd7\xdf\x65\xa0\x9e\x70\xbd\x7c\xd7\xc0\xc7\xd7\x66\x84\xd0\xd2\x07\x38\xb3\x8d\x27\xea\xf9\xea\xce\x73\xf7\x10\x3b\x27\x46\xec\xd7\x74\x4c\xf9\xc8\xb5\x43\x71\xe0\x0c\x04\xb4\xc0\x3d\xee\x08\x3c\x78\xcd\x35\x24\x70\x8e\xb3\x78\x9d\xbf\x21\xef\x15\x45\xba\x5e\xba\x3a\x79\x8f\x3d\x53\xd8\x6d\xd5\xa3\x22\x08\x8a\x03\x5f\xab\xeb\x05\x30\xfe\xc1\xe2\x8e\xa9\xfb\x36\x1c\x2e\x3d\x61\x8f\xcd\x0b\xd1\xa6\x8c\x2f\x68\x6a\xf6\x7e\x5d\x9f\xb0\x14\xa5\xcb\x53\x41\xce\x85\xe2\xc0\x73\xc7\xbf\x4e\xb7\x68\xa9\xf9\x4e\xfa\x0b\xd0\x89\xb3\x74\x73\xcc\xe8\x9c\x3d\x27\xac\x91\x67\xe9\x18\xa0\x91\xf9\x70\xb8\x61\x9d\x08\x39\x17\x8a\x03\x67\x60\x2d\x94\x49\x5a\xf6\x8b\xbc\xe9\xb3\x77\x6b\xa1\x77\x3b\xbf\x97\xf1\x0b\xbb\xda\x7a\xa4\xb2\xd4\x14\xc0\x88\x4a\x33\x85\xd9\xfb\x91\x19\x80\xe2\x8e\x5c\x17\x10\x85\x0d\xd4\x61\xe7\x77\x19\xc0\x98\x12\x51\x89\xf6\x9b\xaa\x99\x84\x3d\x2f\x50\x63\x54\x18\x48\xbe\xfa\x4d\xdc\x37\x95\x1d\x37\xdd\x6d\x1f\x48\xff\x29\x77\x1e\xb9\x76\x28\x0e\x9c\x81\x75\xab\xc0\xb3\x4c\xeb\x3e\x33\x63\x19\x44\x78\xb7\x3b\xb5\xb3\x4b\xdb\x70\x14\x73\xbf\xb2\x63\x6f\x1d\xea\xec\x7b\x99\xd0\xe3\x21\xe7\x42\x71\xe0\x6b\xc5\xd4\xcf\xdc\x23\x14\xf0\x53\x78\x7a\xbe\x97\xce\xc2\xcd\x47\x8d\x74\x7c\xae\x8e\xd7\x23\xba\xdf\xb4\xba\xeb\x46\xf5\x77\xc2\xa3\x5f\xc7\x42\x71\xe0\xb9\xb4\x1b\x2f\x99\xfb\xfa\xed\x27\x1f\xf8\x95\x74\x78\xec\x9d\xfe\xc4\xc0\x54\x7f\xd3\x97\x2b\x8d\xee\xf1\xb4\x37\x67\xf0\x86\xb1\x3e\x72\x2e\x14\x07\xce\x00\xb7\x40\x3e\x49\xe3\xba\x93\x1e\xab\x54\x59\xfc\xea\xda\xfa\x95\xa5\x1f\x09\x05\x0f\xc9\x4c\xee\x15\x58\x50\x9b\x4d\x14\x76\x1c\xb9\xaf\xa0\xb8\xa3\xfb\x80\xd1\x3f\x67\x00\xea\xe4\xf9\xbb\x0c\x6c\x3e\x95\xac\xee\x37\x75\x3c\x7f\xf6\xe2\x3b\xe3\x19\x21\x43\x45\x96\xf4\xd1\xdc\xe1\x6c\x09\x9c\xaf\x5f\x84\x24\xf0\x53\xd0\x11\x47\x25\x3b\x04\x77\xc2\x7b\x14\xcd\xb2\xc4\x14\x5c\xfe\x10\xc0\x3c\x48\xa9\x78\xf5\xc6\x4b\x48\xfd\xaa\xd6\xfb\xe0\xe6\xc4\x4b\x7e\x32\xaa\x4b\x2e\xfc\x47\x7e\x22\x28\x0e\x7c\xad\x54\x9b\xfc\xe5\xf2\x7e\x8e\x7e\xf8\xec\x57\x9d\xf3\xf6\x51\x6d\x8b\x17\x13\x79\x08\xff\x45\x9a\x15\x4c\xa3\x67\xa9\x97\xf5\x1f\x26\x22\xe7\x42\x71\x27\xbe\xbf\x71\x18\x64\x66\x6f\x39\xc8\x2e\x22\x23\x08\x95\x62\x0e\xee\x49\xa3\x46\xec\xcf\x90\x7c\xf3\x0a\x49\xda\xe4\x9f\xc3\xe2\xbd\x74\xb4\x27\x42\x70\xe0\x0c\x38\xc4\xd3\x35\x38\xac\xb7\xc2\x6f\x44\x44\xb6\xad\x9c\xbf\xac\xfb\x2e\x0f\x9e\x4e\xe6\x3f\x92\xc7\xdf\xc7\xf4\xf5\x73\x53\xe5\x91\xf3\x06\x8a\x3b\xba\x0f\x40\x14\x36\x50\x9f\xdd\x7f\x5f\xd8\x3c\x94\x92\x13\xd7\xa7\x68\x50\xd3\x4e\x61\x63\x40\x73\x9a\xbd\x96\x64\x12\xe0\xf4\xc4\x87\xfb\xcc\xa4\x09\x99\xf0\x2c\x89\xa8\x1b\xb2\xfc\x80\xe2\x4e\x16\x36\x65\xd8\x82\x06\x19\x9f\x55\x63\x64\x2e\xbc\x96\xc0\x7e\x56\xe8\x2d\x4a\xa7\x3a\x12\x16\xe7\x84\x56\x62\x3b\xdb\xa6\xd4\xf1\x98\x09\x39\x19\x8a\x3b\x59\xd8\x08\x23\xd8\x77\x6e\x53\x3c\xdc\xb9\xff\xa9\xe6\xd0\x1a\xcf\xcb\x73\xab\x8a\xa6\x62\x54\xa7\x65\xfb\x13\x2d\x31\x2e\x23\xc1\x67\x34\xe4\x64\x28\xce\x4b\x16\x0d\xed\xef\xd9\x1d\x60\x18\x66\x8d\x8e\xc3\x57\x47\xe7\xb0\x40\x9f\xb6\xcd\x2b\x53\x7a\x63\x3b\xaa\x4b\x71\xe8\xb4\x16\x93\xb9\x8a\x59\x56\xb3\x89\x2c\x6c\xa0\xb8\xff\x14\x36\xa7\x8e\x17\x36\x50\x7f\x08\xe0\x78\x61\x73\xfb\x11\xe5\x82\x61\x92\xf8\x95\xd2\xd9\x5c\xbc\xe8\x83\xce\x51\xf8\xe5\x1f\x05\x16\x3c\xd4\x5b\x0a\x79\x18\xd1\x19\xc6\x96\xc7\x1d\x36\x4f\x98\x8c\x7d\xbf\x44\x97\x64\x0b\xd9\xcd\x06\x37\xdd\x50\x65\x1d\xb3\xe7\xb7\xc3\x25\x49\xa3\x0d\x23\xa2\xaf\x7e\x18\xdb\x15\xfb\xbf\x56\xd8\x40\x2d\xed\xb8\xc3\x06\x5c\xd8\x54\xcb\x06\xc6\x9c\x6d\x54\x62\x90\x55\xd1\x93\x13\x65\x43\x67\x75\x36\xee\x66\xc9\x97\x59\xd0\x8b\xbb\xc2\x08\x6f\x1b\x1a\x58\xfc\x13\x85\x4d\xdd\x89\xc2\x46\xad\x15\x57\xc6\x59\x3c\x7d\x55\xa7\x90\x83\xae\xfb\xa3\xe3\xb3\xd3\x1e\x6f\x79\x94\x32\xaf\xf8\xda\x66\xce\x61\x77\x1d\x88\x0b\xff\x91\x87\x3f\x4e\x16\x36\x0f\xa7\x86\xc2\x35\x9b\x69\x1f\xc6\xc0\x66\x26\x55\x6c\x63\xd9\x4a\xb6\x28\x97\xaf\xcf\x8c\xc0\xf0\x58\xce\x8d\x06\x3b\xf2\xf2\xfe\x91\x47\x5d\x4e\x16\x36\x52\x0e\x9e\x8d\x5d\xd5\x99\xd1\xb3\x16\x4a\x79\x3c\x87\xd6\xf0\x21\x4c\x8f\xeb\xc6\xd4\x87\xd1\x79\x61\xf8\x94\xc5\x4e\x79\x93\x7f\x64\xb5\x27\x0b\x9b\xda\x4b\x15\x0f\x6b\x68\xad\x61\x68\xda\x2f\x2f\x84\xb7\x55\xb2\x77\x9b\x37\x04\x90\x7f\x5a\xa4\x2e\xf2\x6a\x7f\x9d\xd1\xc2\xfe\xe8\x8f\xac\xf6\x64\x61\x43\x51\xb5\x52\xa1\xb1\xcb\x51\x2e\x91\x17\xc4\x2b\x33\x28\x99\x58\x9c\xfa\xf1\x6e\xb1\xe7\xfd\xdc\xbe\x4b\xd2\x6e\xf5\xb6\xca\x94\x7f\xac\xb0\x81\x8a\xee\x6f\xf7\x67\x56\x80\x52\xf3\x6d\x35\x7d\x2d\xe3\x63\x79\x59\x9e\xac\x0d\xd8\x53\xf7\x1d\x86\xaf\x5d\x7e\xc1\x57\x6f\x0c\xd9\x5f\x4e\xf7\x3c\xda\x9f\x21\x38\xf0\xfe\x7c\xba\x84\xe1\x5c\xe0\x56\xe4\x1e\x56\x1d\x85\xac\xbf\x40\x89\x61\xa6\xfe\x2b\xd9\x27\x7e\x8e\x1f\x3e\xdd\xbc\x75\x5f\x89\x65\x92\x11\x39\x17\x8a\x3b\xe1\xa4\x7b\x69\x92\xa8\x5c\xd2\xdc\xb2\xb5\x14\xbd\xf6\x52\x4d\xa4\xb7\xbb\xad\xbe\x7a\xc2\x56\x7e\xad\x4f\xaa\x4a\x01\x6b\x31\xe5\xda\x91\x93\x0e\x82\x03\x7f\xf1\xe1\x62\x1b\xc9\x19\xd8\x32\xdb\xa4\xd7\x14\x91\xfb\x5a\x7c\xcd\x64\x6c\xc6\xdf\xf4\x3c\xf9\x69\x1d\xf3\xcf\x13\x93\x33\x9c\x9b\x84\xc8\xb9\x50\x9c\x97\xf4\xa9\xbf\x7f\x71\xed\xdf\xaf\x77\x96\x87\x41\xfa\x34\x7e\xb4\x25\x19\xde\x0b\x5c\xf6\xb0\x67\x64\xfb\x1d\xd1\x13\xce\xdd\xe9\xd1\xf8\x56\x24\x2c\xc8\xc2\x06\x8a\x3b\x72\xd8\xfc\x63\x61\x03\x75\x1b\xf9\xad\xc3\xa6\x91\x91\x68\x80\x3c\xfa\x83\x26\xe3\x2e\xe3\xb5\x88\x1f\x54\x5e\x2b\x03\xf6\x06\xfd\x8d\x79\xd9\x2f\xbd\x4a\xf6\x10\x7a\x6f\x8f\x7e\xac\x0d\xc1\x81\x13\xf0\x76\xda\x24\x09\x6f\x60\x3c\x61\x28\xb5\x51\xbb\x98\x68\xa9\xed\x71\xfc\xc3\xc9\x67\x79\x8e\xaa\x78\xca\x6d\x9f\x13\x64\x27\x49\x8e\x7e\x6a\x05\xc1\x81\x13\x40\x24\x70\x93\xeb\x0e\xbe\xeb\xbb\x7b\x31\xf2\x3f\xf0\x4c\x44\x87\x97\x1e\xcd\x66\xc3\xef\x5e\x9c\x55\xf0\x18\xc0\x22\x27\xd6\x3b\xfa\xe9\x12\x14\x07\x4e\xc0\xc8\x3b\x5f\x76\x22\x4a\xcb\x44\x93\x37\x52\xc6\x61\xd6\xd2\x2f\x7f\xec\x62\xa1\x05\xce\x4f\x48\x6b\xb8\xdc\x4b\x90\x7f\x36\x79\x74\x52\x85\xe2\xc0\x09\x10\x5f\x43\x73\x0a\xa4\x8f\xa3\x60\x1c\x7c\xf3\xfa\xab\x15\x01\xf3\x67\x6d\xe5\x6d\xeb\xab\xe2\x89\x63\xac\xcf\x17\xef\xe8\xbb\x18\x23\x0b\x1b\x28\xee\xc8\x61\xf3\xcf\x85\x0d\xd4\x2d\xfd\x77\x11\xe8\xc2\xf3\x20\xde\xb4\x46\xef\xf5\x1f\xd4\xdd\x6f\xba\x83\x51\xd4\x3e\x59\x7c\x59\xf2\x5e\xc6\x16\x5b\xa5\x8e\xf8\x3c\xa1\xd8\x91\x9f\x19\x8a\x03\x47\x80\x31\x61\x31\xf7\x81\x21\xab\x76\x46\xb6\x6c\xc5\x17\x34\xef\x64\x42\x8c\x1a\xad\xa9\x06\x77\xf2\xd3\x1a\x76\x8a\xe7\xcf\x17\x1f\x7d\xa0\x82\xe2\xc0\x11\x18\x79\xad\xfc\xd5\xea\xcc\xbd\x53\x4a\xb3\x35\xfe\xc3\xdb\x66\x4f\x3a\xe5\x49\x8d\xef\xe6\x84\xc7\xde\xf1\xac\xba\xd2\x71\x80\x7b\x24\x29\x86\xe2\xc0\x11\xf0\x65\x20\x7a\x31\xc1\xe1\x76\x5b\x60\x6a\xec\x92\xb8\xe3\xe0\x4a\x33\x3f\x3f\xfb\xde\x74\x0f\xf5\xb8\x00\x1c\xfb\x56\x9d\x79\xe1\x51\x1b\x0c\xc1\x81\x23\x70\x4a\x8f\x8b\x58\xd4\x34\x61\x34\xad\x79\xcb\xae\xeb\xf4\x29\x9d\x85\xb5\x87\x09\x1c\x6c\xe9\xe3\x9c\x9f\x6e\x56\x29\xd4\xce\x34\x1d\x09\x6a\x21\xb8\x23\x77\x05\x44\x61\x03\xb5\xbf\xfe\x2e\x03\x88\xda\xae\x87\x3d\xf7\x48\x73\xd8\xfd\x2f\x34\xcd\x65\xd4\x97\xd0\x3e\xc8\xc4\x79\x5f\xcc\x68\x3f\x55\xde\x8b\x30\x7f\xd2\x59\x83\x5c\x3b\x14\x07\xce\x80\xb9\xb2\x8f\x79\x44\xb2\xaf\x9c\x67\x59\xfc\x13\xb7\x8f\x5f\x9e\x74\x67\xed\xc3\x7a\xe5\xb4\x94\x23\x6b\xbe\xbc\x29\x9e\x4f\x3f\x40\xce\x85\xe2\xc0\x19\x38\xc5\x03\x6b\x8b\xc6\x0a\xd3\x1d\x65\xad\x2f\x1a\x7a\xc7\x26\x3a\xb0\x00\xb7\xc2\x9c\xe9\xb0\x5d\x5a\x12\xa7\x76\x23\x50\x8e\x47\xce\x85\xe2\xc0\x19\x98\xb7\x1c\x28\x59\x11\xa8\xf6\xa6\xda\x4e\x14\x7a\x5e\xc3\xe8\xa7\x60\xf3\x64\x57\x01\x67\x25\xc6\xf2\x13\x9e\x7a\xfe\x44\xea\x91\xa4\x15\x8a\x03\x67\xa0\x95\xe5\xda\x70\xcc\x13\x97\x47\x53\x1e\x1b\xe7\xd6\xa8\xab\x5f\x23\xd8\xef\xb1\x28\xd9\x7b\x8c\xd3\x9f\xd1\x4a\x6d\xb9\x68\xf2\x1d\x99\x01\x28\xee\xc8\x5d\x01\x51\xd8\x40\x1d\x76\x7e\x97\x81\xa7\xc9\x6f\x05\xee\x5f\xc3\x77\xb7\x31\x78\xd6\xac\x93\x9f\xa4\x48\x71\xba\xc1\xe6\x4a\x81\x42\x27\x6c\x66\xd6\x32\xbc\x7f\x95\x0c\xb9\x76\x28\x0e\x9c\x01\xfc\x82\xd7\x06\xf6\x84\x81\x7e\x87\xaf\xb6\x4c\x05\xc6\xb5\xb6\x5e\x91\x11\xb2\xbd\x78\x23\x51\xc1\x79\xd1\xa0\x80\xf6\x36\xee\x91\x26\x0d\x8a\x03\x67\xa0\x26\x45\xc5\x64\x7c\x2e\x84\xb3\xc4\x59\x38\x79\x57\xd2\x48\xbb\x8c\x98\x9a\x9e\x85\xce\x80\x5b\x62\x53\x62\xb5\x00\x11\x3d\x7b\xf4\x5d\x03\x04\x07\xce\x40\x77\x41\x63\x27\x87\x89\xb3\xb7\xae\x55\xa7\xfb\x30\x85\xd1\xcd\xe4\x48\xfd\xd2\x49\xbb\xe7\x4d\x64\x96\x33\xa5\x3a\xae\x0a\x5c\xc8\xb9\x50\x1c\x38\x03\x09\x0e\x94\x34\x0e\x72\xc1\x11\x9e\xc3\xe6\x80\xa8\x29\x75\x02\xa3\x8d\xb0\x6b\xc5\x7a\x17\xac\xc7\x9f\x96\xd8\x34\xea\x5c\x05\x32\x03\x50\xdc\xd1\x7d\x00\xa2\xb0\x81\x3a\x79\xfe\xf6\x8f\x5c\x28\x53\xe3\x10\xff\xd4\xa2\xa4\x60\xce\xa5\x53\x64\xae\x13\xd8\xc1\x4d\x9b\x0f\x47\xfb\x6e\xbf\x62\x3d\x6c\xd6\xe9\x37\x2c\x7c\x24\x09\x84\xe0\xc0\x19\xc8\xd7\x18\x30\xa7\xf9\x16\x66\xf7\x5d\xf5\x2e\xc2\xf1\x2e\x21\xf7\x81\x85\xc7\xaa\x17\xe7\x6e\xc9\x19\xa0\xf5\x4c\xff\xc6\xca\x51\x19\x0e\xc5\x81\x33\x70\x95\xb7\x21\xdd\x54\x26\xac\x85\xfb\x56\xd3\xed\x68\xdd\xed\x1f\x5e\x49\x36\xc9\x5a\x3a\xca\x2d\xaa\xaf\x7d\x58\xf8\x77\x13\x8e\xca\x35\x28\x0e\x9c\x81\xba\x7c\xa1\x25\xb2\x8e\x64\x25\x2c\xff\x71\x3b\x29\xca\xaf\xb5\x12\x57\xb8\xde\x4c\x77\x63\x3d\x73\x1a\x79\x40\xd7\xdf\xe8\x7b\xf4\xfd\x0d\x14\x07\xce\xc0\xc0\xf2\x83\x1e\xfa\x2d\x8e\xb6\x61\x85\xe7\xeb\x4a\x89\x5f\x9f\x93\x78\xc8\xbd\x91\x1f\x64\x54\xb8\x36\x8f\xe9\x79\x7b\x88\x8e\x03\x99\x01\x28\xee\xe8\x3e\x00\x51\xd8\x40\x7d\x76\xff\x7d\x61\xd3\xa5\x20\xf5\x60\xca\x5a\x8e\xe1\x73\x5b\xfd\x62\x3f\x3d\x3d\x8f\x66\x44\x5e\x45\xb5\xc7\xcc\x69\xfc\xf0\xf2\x16\x21\x7d\xb2\x69\x64\xf9\x01\xc5\x9d\x2c\x6c\x9e\x2e\x73\x3d\x48\x0f\xde\x68\xe6\xec\x64\xb7\x17\x23\x5d\xdb\xbf\xb7\xb1\x71\x9d\x72\x3a\xe1\xc5\xf2\x97\x3d\xd5\xb2\x2f\x9f\xb7\x90\x93\xa1\xb8\x93\x85\x4d\xca\xc3\xf7\xb4\xd7\x56\xa7\x3d\xe4\xac\x0a\xc8\x3e\x3a\xf2\xa8\x19\xa6\x0c\x23\xaa\x39\x8d\x36\x5d\x62\x26\x09\xca\x2a\x14\xb7\x91\x93\xa1\xb8\xff\xd4\x2a\xe8\xc7\x27\xd3\x9b\xdd\x60\x4e\xfe\x88\x81\x26\xfe\x91\x5e\xe3\x76\xbd\xf3\x84\xac\x9f\xb5\xfa\xe5\x25\xf1\xf6\x6c\xa1\x00\x67\x7b\xbc\x0f\x1f\x90\x85\x0d\x14\xf7\xdf\x2a\xe8\x78\x61\x03\xf5\xe7\x18\x8f\x17\x36\x2f\x0e\xd5\xf4\xc3\x2d\xf6\x58\xd5\xae\xbf\xba\x92\xf5\x60\xb0\x26\x59\xce\x85\xf5\xb4\x58\xe5\xb9\x8a\x16\x66\x8c\x95\xeb\xd1\xec\xc7\xd0\xde\x01\xa6\xec\xd3\x69\xba\xc4\xea\x91\x67\x0e\xbd\xc5\x78\x5d\x5a\xa4\xec\x45\xe9\x08\xee\x06\xf4\x8f\xcd\x8d\x87\x8e\x4f\xe1\xfe\xaf\x15\x36\x50\x4b\x3b\xee\xb0\x01\x17\x36\x84\xa3\x22\x36\x43\x6c\x39\xcb\x3f\x67\x9e\xa9\x9c\xb1\x6d\xb4\x61\x9e\x58\xf3\x53\x38\xef\xf9\x81\x23\xe5\x4b\x89\x2b\x4e\x92\xe1\x9f\x28\x6c\xd0\x54\xc0\x1f\xea\x7d\x28\x6a\xaf\x13\x3c\x38\x35\xf0\x36\xb8\xe7\x75\xeb\x48\xde\xae\xd4\x67\xc5\x5c\x27\xe6\x12\x51\xf1\x84\xae\xe4\xd1\xc6\xfd\xf9\x3f\xf2\xf0\xc7\xc9\xc2\xa6\x34\x8d\xc3\x7c\xab\x48\x35\x4c\x44\x33\x8a\xdf\x54\x2a\xab\x97\xa0\xcf\x06\x76\xb6\x7c\x01\xed\x6e\x3e\xa5\xb5\x0d\x51\x97\xcd\x1f\x79\xd4\xe5\xfa\x89\x97\x2d\xb0\x9e\x0f\xe5\xc1\xe8\x2f\xca\xd1\x82\x85\xec\x8c\xbc\xf0\xdc\x3a\x73\x63\xfc\x95\xda\xb7\x69\xf9\x88\x7c\xa6\x95\x6f\x3b\xb7\xfe\xc8\x6a\x4f\x16\x36\x6a\xd1\x73\x52\xab\x8f\xe5\x13\x49\xe5\x28\x67\x0a\xc8\xf9\xed\xd1\x4b\xa7\x2d\x2e\xca\x0e\xf6\x3c\x20\xce\xbf\xfc\x5a\x27\x25\xe0\x8f\xac\xf6\xf1\x89\x97\xe5\x6d\xd6\xdb\xe4\xd4\x8c\xed\x04\xf2\x38\x56\x03\x7b\xb7\x8d\x0f\x0d\x06\xd3\x57\x6c\xc7\x5c\x35\x3f\x9c\xc2\xb7\x66\x47\xfb\xf2\xc7\x0a\x1b\xa8\xe8\xfe\x6e\x7f\xe6\x88\x59\xf5\x59\xd5\x09\x2d\xfb\x00\x10\xc4\x6e\x6d\x6a\x26\x2d\xcb\xef\x3d\xf7\x6f\xe6\x15\xb8\xa1\x70\xf5\x1a\x3e\xff\x77\x09\xe4\xbe\x04\xc5\x9d\x50\xce\x36\x70\x1a\x89\x4e\xa7\xd9\x6b\x0e\x56\x5d\xf0\xde\x9a\x42\x53\x55\x3c\x4b\xb8\x62\x94\xe6\xf7\xd0\xe3\x3d\x4f\xfc\xf0\xf4\xe5\x23\xe5\x2c\x04\x07\xde\x9f\x59\x5c\x15\xd3\xd6\x69\x82\x2b\x47\x75\xad\x56\xe3\x06\x3b\x95\x0a\x87\xb3\x5c\xb6\x12\x7f\x1e\x08\x5b\x45\x8d\xb0\x51\xdf\x3c\xfa\xd2\x1e\x8a\x03\xef\xcf\xaf\xa9\x53\xa3\x2e\x05\xb9\x24\xc7\x18\x23\xe0\x56\x51\x11\x23\xaf\x13\xcf\x4d\xef\xe1\x15\x39\xbe\x9a\x89\xf0\xdf\x94\x67\x63\x46\xce\x85\xe2\xc0\xef\xc3\xb3\x3e\x9c\x10\x2d\xa1\xd9\xcf\x71\x1f\xd0\xe3\xe7\x48\x84\xf7\x09\x7c\xa8\xb9\x96\x27\x06\xc6\xde\xba\xaf\x19\x8b\xca\x9a\xd7\x21\x0b\x1b\x28\xee\xc8\x61\xf3\x8f\x85\x0d\xd4\x6d\xe4\xb7\x8f\x57\x3c\xb9\x63\x10\xac\x33\x94\x33\x06\x17\xb8\x9f\xca\x31\xfb\xb3\x8d\xe2\xfc\xbb\x75\x2f\x5f\x65\xd7\x22\xe9\x02\x4e\xb4\xde\xa3\x9f\x2e\x41\x71\xe0\x95\xc7\x56\x4b\x7d\xa9\xfe\xb6\x18\x4c\xff\x82\xfc\x46\x6d\xab\xea\x6d\xa7\x27\x44\xb9\xdc\x33\xc1\x38\x6f\x2e\xf5\x1d\xdc\x52\xf0\x3c\xfa\x6d\x01\x14\x77\xe2\x2b\xf0\x2f\xdd\xa1\x82\x89\xba\x39\xf8\x18\xea\x68\x1d\x97\xbb\x32\x4f\x17\xb0\xc3\x75\x96\xf8\xf4\xce\xc9\xde\x7c\xff\xfd\x31\xf5\xa7\xa3\xaf\xc0\x21\x38\x70\x02\x84\x02\x03\x07\x68\xf9\x73\x0e\x38\xc5\x17\x46\x67\x83\x2f\xcf\xe5\x27\xc8\x5f\x0e\x7b\x58\x61\x80\x87\x93\x8a\x66\xa4\xcb\xd0\x82\x9c\x0b\xc5\x81\xdf\x07\x03\x4c\x4d\xb7\xc9\x94\x85\x4c\x91\x47\x55\x26\x2c\x1b\x51\x89\xde\x76\x24\x0d\x91\x26\xe7\x86\x0e\x1e\xcf\x6c\x53\xcd\xed\xc6\x20\x0b\x1b\x28\xee\xc8\x61\xa3\xf2\x8f\x87\x74\xa8\x5b\xfa\xef\x22\x90\x52\x49\xcb\x01\x60\x5c\x3b\x53\xf5\xf2\xe6\xb6\x07\xef\xa3\x20\xed\x25\xa1\x73\xf2\x1e\x2e\xb4\xe6\xd6\xaf\xf8\xea\x09\x18\x8e\x1e\x83\x87\xe2\xc0\x4b\x77\x3e\x77\xc1\x28\x4a\x96\xe0\xd5\xc0\xb2\x62\x0f\x0e\xd7\x13\xa2\xfa\xa7\xe5\x36\x6b\xaa\xb8\xdc\x65\xe9\x3b\x41\x35\x09\x8e\xb6\xc8\xb9\x50\x1c\x38\x02\x3c\x6a\x17\xbf\x84\x8e\xbf\x8b\x6b\x5d\xab\x08\xf6\x39\x75\xb9\x47\xa1\x72\x93\xc2\xde\xd0\x3c\x40\x96\xe3\x43\xcb\xb5\xd8\xbe\x8a\xa3\xc7\xf6\x21\x38\x70\x04\x6e\xe5\x09\x12\x8d\x94\xbe\xd8\xa4\xfc\xda\x7c\x66\xad\x5e\x35\xf5\xe3\xe4\xf5\x2a\xdf\x79\xcb\x6c\xe2\x52\xfe\x67\xa6\xa5\xc2\xc3\x47\x37\x2d\x08\x0e\xfc\x3e\x38\x10\x14\xbd\x61\x0c\xba\x38\xe1\xff\xc9\x77\xdb\x75\x1a\x4e\x7a\x08\x1f\x66\x7a\xf5\x72\x67\x21\x5e\x66\x2d\x4d\x8b\xae\xdc\xf2\xe8\x5b\x55\x08\xee\xc8\x5d\x01\x51\xd8\x40\xed\xaf\xbf\xcb\xc0\xf0\x87\xc5\x8c\x6b\xb2\x25\x38\x25\xf1\x5a\x8f\x68\xae\x37\x0e\xcd\x74\x45\x5f\xc6\x1c\x57\x36\x25\xa0\x6b\xd0\xa9\xce\x28\x8a\x44\xae\x1d\x8a\x03\xaf\xbd\x20\x78\xfd\x9e\x48\x2f\x53\x7b\xce\xa0\xae\x53\x4c\x7d\x96\x62\xa6\x4a\xba\xab\x3f\x35\x49\x67\xb0\xa7\xbd\x71\xcb\x04\xdb\xd1\x23\x91\x50\x1c\x38\x03\x78\x29\xdb\xba\x7d\x5a\x58\xa7\x1b\x97\x06\x44\xda\xbc\x3f\xbb\x9f\x67\xef\xbb\x30\x5e\x50\xeb\x40\xde\xfb\x19\xcb\xb6\x29\xd9\x0e\x39\x17\x8a\x3b\xf1\x1b\xd6\x54\xf5\x2d\xdf\x1f\x6a\xf8\xca\x15\x5d\xad\x6f\xc7\x69\xef\x10\x4a\x7e\x7e\x92\xb5\x60\x76\x7b\x20\x68\x44\xd0\x76\x81\x84\xfe\xe8\x49\x00\x08\x0e\xfc\x3e\x00\x5c\x67\x6b\xf1\xbf\x29\x9c\x31\x34\x3f\x4f\x95\x4f\x2a\x5e\x90\xf3\x79\xe4\x9c\x0c\x0d\xa7\xac\xe1\x67\xcc\xfa\x6d\x4b\xf7\x31\x64\x06\xa0\xb8\x23\x77\xc5\xf5\x7f\xce\x00\xd4\x61\xe7\x77\x19\xe0\x72\x5e\x37\x4b\xb9\xbb\x29\x9b\x14\xd0\x37\x5e\xdf\x98\x85\xe1\xbd\x35\xf0\x03\xb3\x90\x23\xac\xdb\x52\x46\x35\x48\x71\x2b\xea\x48\xe4\x0c\xc1\x81\xd7\x2e\xbb\x73\xe5\xda\x80\xa3\x85\x51\xf6\x26\xfc\xc5\xa7\xa6\x83\x71\x3f\x72\x4d\x1c\xbc\x6e\xbe\x81\x8b\xae\xcd\x97\x72\xa5\x1f\x2d\x23\xe7\x42\x71\xe0\x0c\x34\x3d\xa0\x3f\xa3\x86\xc6\x4f\x2d\x77\x89\x5b\x63\x5f\x00\x3f\xb3\x36\xcd\x16\x7b\xee\x3e\xe1\x18\xd7\xe4\x6a\xaa\xe2\xac\xe2\x91\x78\x0e\x8a\x03\x67\x20\xb6\x31\x10\x7f\x30\xe0\xa6\x2b\xad\x01\x75\x73\x8a\xdb\x14\x86\xa2\x64\x9d\x1e\x7d\xeb\x62\xc4\x56\xdf\x3b\xae\x15\xf6\x9f\x38\x47\x5b\x17\x04\x07\x7e\x1f\xcc\xd4\x6b\x2e\xd4\x0f\x31\xe3\xd1\xda\xea\xe1\x73\xe0\xa8\x8d\x11\x1b\x2a\x1b\xfa\xd9\x94\x0a\x0f\x09\xd6\x6f\x75\x68\xe1\x08\x21\x33\x00\xc5\x1d\xdd\x07\x20\x0a\x1b\xa8\x93\xe7\xef\x32\x20\x77\xa5\x9b\xe6\x82\x3f\x96\x5d\xd2\x05\x6c\x47\x84\x17\xee\x6d\x1d\x34\x43\x21\xd6\xa6\x44\xf2\xcd\x3d\x2d\x9b\x22\x8f\x06\x26\xe4\xda\xa1\xb8\x13\x0f\xdc\x66\x3d\xf5\x51\x98\x1b\xc0\x9a\xfe\x52\x97\xc2\xf6\x56\x69\x50\xcf\xd1\xa2\xd6\x3d\x31\xa7\x2a\xd2\x9e\x71\x73\x55\xca\xfe\xe8\xde\x0a\xc5\x81\x33\xf0\xff\x31\xf7\x96\x61\x59\x35\xdd\xff\x37\x5d\x8a\x20\x21\x2d\x29\x0a\x92\xd2\x92\x52\xd2\x25\x2d\x9d\x92\x02\xa2\x84\x20\x1d\x4a\x2b\x0d\x52\x12\x0a\x82\x92\x02\x4a\x49\x37\x82\xa4\x84\xa4\xa0\x84\xa4\x80\xc4\x73\xdc\xcf\x7d\x9c\xfb\xe7\xb5\x4f\xfe\xce\xfd\x82\x17\xd7\xfb\xcf\xb1\x38\x67\xf3\xdd\x33\xf3\x5d\x7b\xd6\x9a\x8f\x3a\xfe\x21\xaf\x37\x67\x85\x99\x1d\x33\xa7\x57\x7e\x74\xdb\x39\x87\xc5\xe7\x4f\x04\x9f\x4f\xbf\xf7\x58\x35\xdf\xa3\x8e\x1a\x1b\x11\x17\xc4\xc1\x35\x20\xee\x59\x65\x73\xff\xc6\xc5\xe7\x2f\x02\xcd\x0d\x5b\xa9\x71\xd9\x68\xb0\x33\x12\xd6\x44\x05\x8e\x71\x5a\x5e\x52\x69\xa1\x91\x58\x21\xe2\x82\x38\xf8\x73\xb8\x2c\xb1\x55\xcb\x3a\x73\xce\xdc\x49\xd5\xea\x03\xcd\xf2\x31\x59\xbd\xcd\xcb\x07\xdb\x87\xc6\xb8\x83\x6d\x5c\xde\xe3\xea\xbf\x71\x10\x1a\x00\x71\xd0\x3c\xf0\xf0\xef\x09\x1b\x90\x77\x3f\x39\x61\x73\xe6\xa8\xb6\xcd\xb8\x09\x1d\xbd\x55\xa1\xeb\x68\xbf\xf1\x38\xb7\x97\x6a\xf4\x2d\xed\x02\x4a\xab\x4f\xaa\x12\x9f\xbd\xf1\xfb\x4a\x44\xf2\x03\xc4\x21\x27\x6c\x9a\x2a\xb0\x1e\x18\xb1\x58\x4f\x3f\x27\xb6\x1e\xf2\xab\x0f\x74\x68\x6e\xd2\xfd\xe2\xe7\x12\x1b\xc5\xb1\x2f\x25\x37\x15\xfe\xc3\x0c\x11\x19\xc4\x21\x27\x6c\x3e\xbd\x75\x52\x4a\x5f\xa7\x24\xc2\xf8\x14\x3b\x2f\xb8\x76\x68\x98\xc6\x84\xc9\x7b\x65\xc1\x2f\x94\x27\xec\xe1\xfd\x79\x6a\xbb\xaf\x50\x92\x09\xc0\xfd\xf7\x1c\xcc\x9f\x91\x4d\x4a\x8b\xa7\xe3\xbe\x91\x04\x2a\x1c\x33\x84\x49\xc9\xe1\xcd\x5a\x5d\x63\x45\x0b\x39\xcf\x21\x6b\x1d\x9c\x4c\x88\x9d\x77\x6d\x01\x91\xb0\x01\x71\xff\x89\x8c\xf3\x8f\x84\x0d\x8d\x0f\xc5\x0b\x7e\x97\xf6\x0a\x9b\x6c\x97\x10\x6a\x82\xfb\x37\x84\x0f\xae\x7a\xbc\xef\xa0\x9f\x4a\x7e\xe6\x50\x60\x92\x3d\xd2\xf9\x67\xc2\xc6\x90\xa8\x5d\x64\x64\x05\x95\x77\xbc\x61\xca\xf7\xe8\xe9\x4f\x65\xb4\x6c\x0e\x9d\x6f\x5b\x33\x97\x4a\xf3\x1f\x6d\xe2\x39\x11\x71\xff\x79\x54\xf8\x4c\x9c\x34\x4b\x3d\xe1\xf6\xe5\x90\x6b\x34\xb6\x5a\xe7\xc9\xd3\x04\x6f\xe1\x59\x11\x8f\xfc\x54\xcf\x7b\x1b\x20\x55\x2f\x75\xf5\xdf\x96\xb0\x01\x0d\xed\xcf\x1e\x36\xf0\x84\x4d\x59\x4c\x4e\x41\x51\x38\x21\xd3\xc6\x03\xac\xe9\x44\x66\x5e\xc7\x47\x4d\x49\x3b\xd8\x74\x4d\x91\xb9\x49\x2a\xcf\x68\x2f\xe0\xb4\x9f\x46\xc2\x46\x02\x29\x61\x13\xb7\xdb\x6e\x26\x46\x51\x97\xfb\x2b\xc9\xa4\xcb\x96\x82\xc9\xc8\x6f\xcc\x32\xdf\xaf\x05\xe7\xbb\x7e\x5b\xa2\xdf\xd3\xeb\xad\x9b\xa7\x72\xf8\x03\x39\x61\x93\xec\xed\xf0\x7a\x6a\xfc\x31\xf1\x0d\xc3\x1d\x8c\x2c\x94\x6b\xf7\xa4\x08\x2c\x7c\xd9\xdc\x43\x22\xde\x47\x06\xcd\x4c\x07\x3e\x32\x3b\x95\xa3\x2e\xc8\x09\x1b\xff\x1d\x8a\xdd\x5e\xf9\x14\xc3\xea\xc0\xeb\x0d\x8a\xce\x55\x72\x41\x73\x3c\xd6\x5b\x36\x24\x86\x5c\xde\xef\x1c\x52\x42\xe5\xa8\x4e\x65\xb4\xc8\x09\x9b\xd1\x6c\xbe\x1f\xcc\xdf\xce\x7f\xc9\x6c\x47\xfb\xfc\x2d\xf4\x61\xce\xd5\x85\x86\xe2\x36\x32\xf5\xde\xe3\xcf\x45\x25\x95\x19\xbc\x51\xa7\x32\x5a\xe4\x84\x4d\x38\x25\x9b\x4f\x4b\x56\x84\x1b\x41\x27\x1a\x4f\x09\x23\xed\xcd\xf4\x67\xd6\xc3\x4e\x12\xe9\x68\xb5\x06\x41\xaa\xa8\x1a\x72\xc5\xa7\x96\xb0\x01\x49\xf7\xa4\xf5\xb9\xe5\x80\xcd\x00\x4d\x87\x6a\xcd\xe4\x5a\xcb\x6d\x16\x8f\xe0\x4c\x3e\x02\x4d\x4d\xb1\x19\xa9\xc2\x5b\xab\xca\x46\xaf\x0d\x05\x32\xa0\x13\x2b\x00\x0e\xbe\x2e\xd5\x65\x0e\xae\x0a\xb8\xdb\x67\x85\x9a\x65\xdc\x5b\x4a\x0a\x8a\xe6\x42\x95\x72\x0d\xf3\x6c\xdd\x16\x7d\xa7\xc8\x86\xf2\xe8\x88\x16\x11\x17\xc4\xc1\xd7\xe7\x54\xbc\x7b\x1a\xd6\x3b\x5e\x25\x45\x6d\xf5\x67\x6f\x2a\x93\x98\x50\x0f\x73\x5e\x25\x15\x15\x93\x24\x74\x1f\xf3\xa7\x0d\x8a\xf9\x8c\x88\x0b\xe2\xe0\xeb\x33\x55\xca\x02\x29\xf6\xaf\x19\xc9\x70\x49\x09\xed\xc7\x5f\x5b\xed\xcd\x5b\xed\x63\xe4\x83\x65\xbf\xd6\x2f\xfe\x70\x2d\xa5\xc6\x7b\x81\x88\x0b\xe2\xe0\xbf\x37\x28\x48\x9c\x31\x69\x7f\x53\x54\xab\x3a\x0a\x8d\x39\x97\x40\x34\xe0\x3b\xda\x8b\x33\xd9\x3e\xcb\xad\xfa\xa1\x5b\x1d\xf4\x58\xd9\x88\x84\x0d\x88\x83\x7a\xd8\xfc\x35\x61\x03\x9a\x46\x4e\x52\x80\x6b\x01\x71\x15\xe1\xec\x98\x86\xc7\x30\x75\x0b\x0d\xbd\xa4\x23\x9a\xdc\x47\x21\x1a\x0e\x73\x21\x0f\x5b\xea\xbb\x1b\x06\x4f\xa0\xe6\xc0\x20\x0e\xae\x00\xd2\x79\xad\x8c\x0b\xce\xa4\xbf\xad\xd3\x50\xd0\xf1\xab\x67\x54\xfc\x50\x96\x03\xc5\xc8\x46\x8e\x7f\xf0\xad\x0c\x3e\x0a\x20\x84\xba\x01\x82\x38\xf8\x13\xed\x59\x53\xb3\x42\xab\x58\x0e\xb5\xf7\xb3\xad\xd8\xe3\x3a\xc0\xa9\x2e\xdd\x8c\xbf\xf0\xe5\xd6\x38\xd7\xf4\x9b\x52\xaf\x5e\x33\xa8\x93\x2d\x88\x83\x2b\x80\xfc\x77\x5c\xaf\x36\xfa\x96\x21\x35\x35\xb7\xb0\xe7\xc8\xd6\x75\xa5\xa1\xc8\xe7\xeb\x55\x5b\x3a\x8f\x5c\x6e\x0d\xbd\x1a\x64\x61\x43\xc4\x05\x71\xf0\xdf\x8b\xb5\xc7\xf7\xc5\x8e\x1a\x63\x70\x7a\x7d\xe5\xf5\x9b\x7d\x8e\xe3\x15\x17\x82\x34\xc3\xd4\xd2\xf8\x27\x4a\xc6\x55\x3c\xaf\x1d\x58\x11\x09\x1b\x10\x07\xf5\xb0\xf9\x7b\xc2\x06\x34\xa5\x9f\x24\x81\xe7\x35\x07\xf7\xec\x0c\x3a\xfa\x5f\x58\x84\xad\x90\x1f\x65\x31\x48\x66\xec\x8d\x96\x35\x29\x2a\x1e\xd3\xc9\x6a\xc8\x39\x55\x1a\x21\x86\x0e\xe2\xe0\x12\x30\x56\x1b\x0a\x5a\x9b\xb8\x64\x42\x84\x6b\xb4\x56\xb4\xfd\x16\x2f\x76\xf6\x49\x9e\x61\xa0\xfe\x8d\xd2\x09\xd6\x09\x4a\xaf\x7b\xd0\x0d\x1e\x20\x0e\xfe\x48\x2d\x84\xb2\xf8\x37\x0a\x49\x0a\x38\xd9\x29\x2b\xee\x0a\x58\xc5\x97\x4c\x70\x78\x74\x9c\x25\xb3\x1d\x88\xa5\x64\x66\x8c\xae\xeb\x82\x12\x2b\x00\x0e\x2e\x81\x42\x9c\x14\x71\x97\x02\x33\x76\xaf\xc8\xc0\x12\x45\x39\x1c\x65\x53\x55\x05\xbc\x2b\xae\xa2\x1d\xad\xc9\x1e\x98\x18\x95\xbc\x83\x88\xb8\x20\x0e\xe9\x46\xa3\x4d\xe9\xbe\x9b\x83\x64\xae\x78\xf2\x84\xfd\x4b\x4f\xc5\xbf\xf3\x92\xd8\x45\x48\x46\x88\xe0\xdd\x29\xa7\x0c\xa3\xb8\x44\x47\x88\xd8\xa4\x83\x38\xa8\x77\x05\x20\x61\x03\x5a\x5f\x4f\xd2\x00\xce\x51\xf1\xce\xa3\xfa\xf3\x8b\x1f\xb9\xd9\xb4\xd2\xa2\x3a\x94\x79\x4d\x57\x09\xd7\x06\x52\xa9\xc6\x4d\x3f\xc6\xc5\xeb\xf7\x40\xc9\x35\x10\x07\xd7\xc0\x12\xdd\x5a\x41\x7a\x7b\xd5\x5d\xae\x6f\x9c\xe8\x29\x39\x32\x67\x0d\xd9\x07\xc5\x39\xaf\x05\x6c\x2e\x1f\xef\x05\x8c\x2d\x48\x43\xfd\x4b\x40\x1c\xfc\x99\x16\x33\xdd\x96\xa9\x15\xcd\xdf\x7f\x34\xe8\xe1\xef\x73\x0f\x2f\x0b\x97\xc8\x33\x2e\xd8\xb9\x89\x51\xc6\x80\xf7\xfe\xa8\xf3\x1a\xd4\x1c\x15\xc4\xc1\x35\xe0\x98\x13\xdb\x62\x10\xd6\xad\xa2\x76\xfc\x9c\x30\xbe\x31\x75\xd9\x96\xa3\xca\xfa\xb7\x49\x0a\xd6\x60\x83\x04\x91\x7a\x4b\xc6\x06\x22\x2e\x88\x83\xff\xde\xef\x2b\x2f\x9a\x5d\xdf\xf0\x07\x25\xa9\xaf\x3c\x50\xb8\xdc\x23\xfd\x2a\xf7\x8c\xd1\x14\xa5\x6c\x13\x55\xc4\xe1\x46\xd3\x65\x25\x46\x84\x06\x40\x1c\xd4\xbb\x02\x90\xb0\x01\x6d\x76\x4e\xd2\x40\xde\x46\xcc\x88\x67\x65\x03\x19\xae\x7f\xd5\x8d\x6d\x7d\x33\x9f\x60\x31\xb7\x09\xfe\xc8\xa8\x2c\x36\xbd\x7b\x46\x0e\xd8\xce\x50\xb3\x5d\x10\x07\xd7\x80\x77\x1b\xa6\xab\xde\x46\xc8\x35\x79\x1b\x07\x1d\xfb\x5b\x12\x39\x59\xf5\x18\xe4\xc9\xba\xc4\xb3\x47\xd4\x28\x1f\x35\x92\xc4\xe3\x11\x71\x41\x1c\xfc\x99\xfe\x44\xe7\x79\xdc\x43\x43\x32\xf9\xbb\x12\x6d\x1a\xe7\xcc\x8d\xc7\x0b\xd9\x23\xe4\xae\x3a\xda\xa5\x47\x8a\x86\x7c\xd7\x8a\xd3\xa1\x5b\xad\x40\x1c\x5c\x03\x4c\xb9\xc3\x37\xac\xb0\xdc\xcf\x2d\x9f\x65\x35\x7a\x51\x7a\x28\xd6\xc0\x58\xfb\xaa\x74\xc4\xb2\xb7\x99\x72\x48\x42\xcd\xad\x14\x7a\x17\x40\x1c\xfc\xf7\x46\x2a\x05\x8c\x9a\x66\xd6\xad\x1b\xd2\x0d\x9f\xaf\x96\xe5\xaa\x58\x57\x24\x13\xd3\x88\xbf\x9e\x12\xfd\xae\xf0\xc6\x95\xa2\x47\xf1\x08\x0d\x80\x38\x68\x1e\x00\x24\x6c\x40\x3b\xcf\x93\x34\xf0\x46\x7f\x88\x76\xbf\xf4\xed\xc6\xac\xc9\x85\xcc\x2a\x0a\x54\x1b\xaa\x9d\x77\x97\x82\x73\xce\xfd\xc4\xb5\x13\x7f\xdc\x25\xbc\x09\x69\x00\xc4\x21\x6d\x07\x4a\xfd\x64\x0c\x39\xe8\xb0\x0d\x45\x72\x0a\xba\x42\x18\x04\x7e\xbc\xfb\xb1\xf8\xea\xb1\x4f\x7c\xec\x55\x01\x5f\x14\xac\x00\x68\xce\x06\x71\xf0\x67\x7a\x99\x1a\x0f\xa7\xd0\xda\xac\xa0\x8a\x94\x8c\x83\xb5\xf3\xcb\xb3\x77\x75\x32\x17\x18\x4c\x0f\x3f\x93\x26\xe7\x38\x19\x24\xd2\x42\xa7\xb7\x40\x1c\x5c\x03\xbb\xcf\x1b\xc5\xdc\x75\x8f\xd9\x4a\xb7\x5d\x9d\x57\x3f\x92\xb9\x71\xde\x7a\x36\xb0\x79\xbb\x94\x96\x51\x8f\x6b\xea\xd8\xda\x12\xba\x81\x0c\xc4\x21\x9d\x08\xaa\x59\xd4\xa0\x51\x88\x1c\x1f\xfd\x2c\xa6\xe3\x6e\x3d\x76\xd8\xdd\xec\xd9\x9b\x7a\xc9\xe1\x0c\x96\xdd\xb0\x10\xad\xa4\x8f\x0b\x42\x03\x20\x0e\x9a\x07\x00\x09\x1b\x90\x77\x3f\x39\x61\xb3\x87\xf7\x9d\xca\x59\xb0\xb8\xae\x6b\x5d\xd7\x2e\x87\xbf\x8a\xa5\xd2\xdd\x77\xf5\x86\xc3\x03\xfc\xb1\x1d\x3c\xd1\xa8\x0a\xba\x6a\x44\xf2\x03\xc4\x21\x27\x6c\xba\x18\xee\xf6\xd9\x9b\x7c\x78\x7a\x61\xf2\x32\x2a\x5a\x41\x50\x65\x4d\x51\xde\xcb\x36\xf5\x88\xee\x87\xba\x0b\x8d\x03\x6f\x8f\x07\x11\x91\x41\x1c\x72\xc2\xc6\xbe\x5e\xc8\x5c\xf3\xaa\xe2\xb5\x8b\xfd\x8c\x4f\xbe\xc8\x1f\x07\x7d\xe8\xa1\x17\x1d\x5a\x2a\x7d\x37\x2a\x94\xaa\x50\x37\xf5\x1d\x17\x11\x19\xc4\xfd\xff\x09\x1b\xba\x3f\x23\xd7\x94\x19\x3b\x5a\xf9\x99\xee\xd3\x5c\x7a\x60\x5a\xdc\x3c\x23\xa4\x98\xc6\x94\xa9\x31\x87\x12\x82\x76\x8e\x32\xfe\x61\xac\xdf\x6d\x44\xc2\x06\xc4\xfd\xf7\x69\xfc\x99\xb0\x91\x25\xe2\xd8\xcf\xa7\x45\x8d\xed\xd8\xba\xd8\x5c\x4c\xa4\xd0\xd5\x70\xbb\xfc\x86\x13\x7f\xb9\x99\x34\xb6\xb7\x73\x0e\xf7\xc8\x3f\xae\xf5\xbe\xde\xe8\xe7\x18\x69\x33\xd2\xfa\x6c\x4b\xa7\x56\x5b\xa3\x81\x66\xf6\xd5\x6f\xec\x97\x28\x02\x6f\xb7\x16\x19\xa3\x0d\x66\x8b\xd2\xfe\x40\xf5\xfb\x58\x4b\xc6\x2c\x3e\x31\x75\xe8\x34\x4d\xca\xfb\x27\x8b\x77\xf2\x4e\x8c\xfb\x11\x70\x79\x1d\xbd\xcf\xa1\xdc\x5a\x32\x19\xfe\xb7\x24\x6c\x7e\x61\xfe\x6f\x43\xfb\xbf\x84\x8d\x14\x8a\x24\xdc\x5f\xaf\xb4\x8f\xe6\xaa\x56\xb4\x60\xd7\xe3\x0a\xbf\xae\xbd\xf9\xb6\x4a\x79\xf7\x22\x5e\x99\xd1\x78\xda\xc5\x2e\x73\x0e\xd3\xe7\x57\x32\x4f\x23\x63\xe3\x8b\x94\xb1\xf1\xe9\x71\xf8\xb6\xed\x63\xe6\x49\x36\x94\xf5\x1c\x73\x8f\x96\xdc\x40\x87\x53\xc6\x6e\x2a\xcb\x6d\x3d\x86\x5d\x15\x95\xbb\xff\xda\xa9\x9c\xfe\x10\x42\x6e\x62\x93\x78\x7b\x45\x8d\xff\x82\x33\xce\x30\xb9\xc6\x8b\xc7\x28\xe2\x3a\x64\xe1\xd5\x56\xc5\x9e\x59\x31\x8d\x5e\x41\x2d\x42\x73\xe3\xa7\x72\xd6\x05\x39\x63\x43\x26\xf5\x6d\x70\x45\x12\x7b\x35\xb8\x69\xe8\xb2\x51\x46\x81\xb9\x87\x5c\xe6\xe0\xed\x65\x12\x1d\xb5\x45\xc2\xc7\xd2\xe6\xe7\xbc\x4f\x65\xb4\x4e\x48\x7f\xb6\xcd\x32\xef\x4b\x2d\xd7\xe0\xaf\xa5\xfb\x7a\x29\xf3\xb1\x1f\x68\x15\x2b\x43\x94\x8f\x28\xc4\xe9\x8b\x8c\xe3\x3c\xee\x86\xa6\xb6\x9d\xca\x68\x91\x33\x36\x49\xe5\x97\x78\xb0\x3f\x39\x2c\xf4\xcf\x26\xad\xf8\x2f\xd6\xed\xa6\x0a\xe4\x8e\x0b\xa7\x50\x9a\x30\x84\x7f\x24\x6e\x08\x5a\xcc\x39\xb5\x8c\x0d\x48\xba\x27\x2d\xd0\xaf\x2c\xde\x31\x7b\xd5\x7e\x6c\xa1\x9e\x36\x2c\x1c\xf8\xd6\xbb\x55\xf4\x99\xb1\xe1\x15\xad\x62\xc9\xda\xf1\xd3\x1c\x73\xc1\x73\x50\x8f\x01\x10\x07\x5f\xa0\x99\x55\xdf\xd5\x46\xe7\xf0\x07\x8e\x7d\x8b\x21\x0a\x54\xac\x89\x3a\x74\x22\xc7\x42\x8b\xa5\xca\x43\xd5\xa9\xa2\xfb\x96\x9b\x24\x09\x1d\x85\x01\x70\xf0\x05\xef\xd6\x07\xef\x2b\x3f\x75\x42\x04\x3c\x6e\xd6\x4d\xbe\x08\xcf\xdf\xae\x4f\x50\xe4\xa4\xed\x5a\x47\xe5\xe5\xbf\x28\xe0\x1f\x87\x0b\xf5\xc8\x05\x71\xf0\x05\xba\x69\x00\x3f\xd2\x62\x7c\xcd\x9f\x78\xdb\xd1\x32\x84\x9d\xce\x5a\x6d\x15\x35\x0c\x37\xd0\xf3\xf8\x43\xe3\x37\x5d\xa7\x87\x0a\xd0\xd7\x45\x10\x17\x20\x89\x22\xf1\x67\xdc\x10\x63\x6b\x93\x8f\x7b\x59\x14\xec\x0f\x32\x16\x3b\x12\x66\xf3\x7b\x3d\x27\xfb\xd2\x3b\x49\xee\x4e\x71\x15\xbe\xc4\x2e\xec\x80\x0e\x58\x80\x38\x44\x0b\x93\xff\x4c\x58\x7f\xd9\xa3\x81\xe6\x91\x93\x24\xe0\x7d\x77\x99\x80\xae\xdf\xfd\x5c\x06\xde\x5e\xb1\xef\x6c\xb5\xf6\x28\xa6\xc1\x3c\x07\x01\xfe\xe8\xd2\x71\xde\x8f\xaa\x19\x46\xa8\x8f\x11\x88\x83\x4b\xa0\xa4\x97\xaa\x5f\x00\x23\xfb\x2c\x4f\x64\xf1\xb0\x88\xda\x43\x81\xf1\x1f\xee\xbf\xd7\x28\xef\x59\xfd\x34\x24\x91\xa4\xe4\xeb\x82\x3e\x82\x83\x38\xa4\x3e\x83\xea\x2f\xa7\xf6\x86\x36\xbe\x61\x33\xae\x98\x3e\xd5\xcb\x14\x21\xfe\x62\x38\x4c\x7d\x01\xfd\xde\xd3\xf3\xbf\x0f\xcc\xde\x7e\xe6\x83\xfa\x0c\x02\x38\xb8\x04\x7e\xde\xcf\x33\x59\x93\x30\x66\x50\xbb\xdd\x6b\x69\x99\x87\x4e\x72\xcb\x6c\x2c\xd5\xbe\x61\x93\x9a\x3b\x43\xa8\x3f\x7e\x84\x12\xba\x79\x14\xc4\xc1\x25\x80\x19\x8d\xb2\x25\x20\x7b\x57\x7c\x64\xe3\xd2\xc3\x60\x03\xdb\x99\xb2\x8f\xc4\x2c\x43\x36\x51\x0f\x74\xba\xe7\x6f\x87\x9d\x6d\x88\x47\x48\x00\xc4\x41\x5d\x6c\xfe\x9e\xb2\x01\xcd\xe9\x27\x49\xe0\xed\x47\xbc\xd8\x62\xf2\xa2\x6a\xe9\x81\x6b\x7c\x45\x8a\xe8\xca\x12\xd2\xb7\xd8\xfc\x7e\x7f\x7d\xc2\xc9\x98\xf8\x80\xad\x49\xea\x08\xea\x0a\x03\xe0\xe0\x12\x90\xe3\xc1\xf6\xc3\x9e\xc6\x52\x71\x24\x4a\xa1\xa4\xf8\x49\xe6\x29\xfc\x23\x3b\x21\x74\xeb\x6a\xe1\xfb\x3c\x9f\xf8\xd7\x58\x07\x50\x57\x0c\x10\x07\x97\x80\x16\xc3\x15\x33\xd4\x87\x43\x92\xd2\x0c\xee\x3e\x62\x2f\xd9\xaa\x4a\xe2\xa7\x79\xd9\x30\xc2\x7f\x19\x1d\xef\x8c\x3e\xe5\x7c\x9b\x85\x88\x0b\xe2\xe0\x12\x48\x98\xb7\x78\x21\x65\x2c\x79\x20\x35\x4a\x69\xac\x3e\xea\x32\x9e\x6b\xe4\x4e\xf8\xc9\xc4\xb7\x9e\xcc\xec\x6a\x41\x6e\xde\x2f\xa8\x83\x09\x88\x83\x4b\xc0\xb1\x07\x6f\x64\xee\xcb\x33\xd3\xec\x6f\xd6\xd9\x44\x3c\xfc\xd8\xbd\x12\x0a\xde\x68\xc5\x3e\x2f\xc6\xbc\x2f\x8e\x58\xb4\xb9\x64\x20\xb6\xe9\x20\x0e\xea\x5e\x21\x04\x28\x86\x00\x2c\xb0\x27\x69\xa0\x51\xf7\xba\x0a\x81\x87\xd7\xc7\x86\x5d\x5f\xf7\xd4\x8c\x60\xa3\x94\x7c\x0b\x5f\xc2\x5a\x13\x57\x97\xa1\x97\x17\x2f\x05\xa9\x71\x20\xc6\x0e\xe2\xe0\x1a\x70\x9a\x56\xbd\x58\xd3\x7d\xeb\xb6\x96\xe6\xe6\xa4\xda\x77\xee\xab\xf9\x57\x9f\xf8\x95\x0d\x27\xd2\xfb\x35\xa5\x74\x49\x31\x92\x40\xdd\x20\x40\x1c\x5c\x03\xa6\xab\x0b\x68\x7b\xa9\xc7\xfb\xb8\x6e\xdd\x49\x17\x49\x05\xc2\x07\xaa\xfa\xd0\xf5\x99\x5e\xbd\xa3\x15\xcd\x33\x48\x6a\xbd\x02\x1d\x89\x03\x71\x70\x0d\x64\x39\x5c\x39\xc3\xf8\xc2\x5a\xbe\x8f\x3c\xb7\x93\x54\xe0\x8a\xad\xbf\x1c\xf6\x82\x67\x7b\xf5\xfe\xec\xf3\xfc\xc7\xd5\xe6\x3e\xd0\x7d\x59\x20\x0e\xae\x81\x2a\x09\x39\xea\x97\x87\xd8\x64\xa8\xaa\xf3\x8c\x87\xbb\xc2\x13\x23\x29\x37\x8d\xc4\x1f\x7c\xfc\x7c\xb7\xb5\x43\xb9\xbf\x2c\xc4\x17\xa1\x01\x10\x07\x75\xaf\x00\xa4\x6c\x40\xbb\x9d\x93\x34\x20\xe3\x30\x26\xb0\x7b\xcd\x2a\x44\x6c\x53\xef\xe6\x57\xe6\xfb\xd3\xb7\x8d\xa9\xa5\x53\x2e\xa2\x12\x96\x3b\x5f\x39\xe2\x34\x8a\x4c\x40\x8c\x1d\xc4\xc1\x35\x30\xca\x5b\xd7\xf7\xf9\x1c\x13\x49\x62\xc6\xfc\x27\xc1\x0a\xef\xf6\x87\xec\xc6\xe7\x30\xea\x9d\xf4\x26\x67\xf5\x87\xc3\xdb\x95\xa1\x8e\xee\x20\x0e\xe9\x9e\xa8\xd9\x4b\xdc\x9f\x43\xc9\x3a\x84\xd1\x9e\xdc\xf0\x27\xf3\x38\xe3\x15\x3b\xc5\x80\x11\xf4\xb3\x64\x58\xeb\x75\xdc\x9b\xa4\x5d\xa8\x98\x13\xc4\xc1\x35\x10\x24\x21\xd1\x8b\x41\xda\x3d\x27\xe1\xab\xab\xb1\xc7\x71\x44\x74\x46\x7b\x60\x8d\x7b\x04\xff\xb9\xc3\xa7\x85\xb4\x87\x95\x4a\x5b\x88\xb8\x20\x0e\xae\x01\xb6\x08\xed\xd9\x28\x65\x3f\x3c\x47\x99\xf3\xf8\xcb\x59\x8d\xcb\x11\x1f\x7e\x3c\x73\xe1\x7f\xf5\xa1\xce\x78\xc4\x56\xa6\xfc\xdc\x28\x42\x03\x20\x0e\x9a\x07\x9c\xfe\xae\x01\xd0\xd6\xf3\x24\x0d\x74\xe6\xeb\xe2\x59\x38\xb7\x35\xa5\x3e\x4f\xf1\xe9\x54\x17\x4a\xac\x9a\x29\x18\x9b\x7e\xa7\xa3\xb9\xc5\xb1\x88\xf9\x88\x5c\x1d\x3a\xc2\x0a\xe2\xe0\x1a\x88\x4e\x55\xad\x9d\xc8\x09\xb9\x78\x18\x8a\x65\xec\x23\x20\x93\x2b\xf9\x73\x8a\xa1\xd9\x54\xf1\x1b\xe6\xd0\x6c\x58\x74\xcb\x6d\xa8\x4d\x20\x88\x83\x6b\x80\xa7\x95\xb9\xc9\x25\xbe\xe2\xf1\xb2\xee\xd4\xbe\x9a\xe1\x52\x5a\x24\x11\xa7\xe5\xab\xec\x10\x9c\xe0\xb5\x62\x42\xd5\x31\xc9\xdb\x88\xb8\x20\x0e\xae\x81\x59\xd1\x0a\x32\xd7\x32\x0f\x02\x17\x94\xe0\x51\x4b\xa2\xef\x77\x1a\xee\x57\x45\x72\x71\x89\x5b\xde\x12\xc6\x7a\xa3\xf3\xf2\x0e\x54\x1c\x09\xe2\xe0\x1a\x50\xb2\x28\x58\xe5\x67\x55\xab\xff\x3e\x46\x49\x16\x36\xc0\x2b\x54\x6d\x6f\xfa\x71\xe8\xf0\x7c\x1f\xd9\xa7\xb7\x05\xeb\x6f\xee\x5b\x22\x34\x00\xe2\xa0\x79\x00\x90\xb2\x01\xb9\xf7\x93\x53\x36\x23\xfa\xb7\x59\x14\xcc\xee\x74\x90\x17\xf3\xd5\xa7\xd2\x3b\x7a\xe9\xb0\xfa\xbc\x72\x2b\xbc\x61\x8e\xb9\x64\x7e\xcd\x26\x7f\x57\x0d\x91\xfe\x00\x71\xc8\x29\x9b\xee\xd4\x10\xcb\x46\x0c\x7f\xf9\xe1\xfe\xc3\xdd\x71\xe5\x43\x72\x0f\xee\x36\x26\x85\xaa\x92\xb2\xd1\x55\xa9\xca\x4a\xd6\x9f\x0c\xd0\xf5\xdb\x00\x0e\x39\x65\xb3\x52\x92\xb7\x58\x88\xca\x99\xa3\xce\x73\xee\xca\xf9\x9b\x82\xb9\xdf\x0b\xa5\xd5\xa4\xc4\xa4\x8e\xc7\x72\xc3\x5c\xc9\xa2\x9d\x0c\x11\x91\x41\xdc\x7f\x9b\x03\xff\x19\xb9\xbd\x42\x3c\x5a\xd9\x7e\xe8\xda\x7c\xd6\xd4\xcf\xdb\x16\x7e\x9e\xbc\x67\x77\xa5\x77\x73\x0d\x9a\xdf\x49\xa2\x7f\xce\xbf\xd9\xff\xd8\x17\x91\x81\x51\x4a\xd2\x12\xac\xe2\xcd\x5a\x4c\x16\xcd\xde\x6d\x09\x7b\xd3\x4c\x6f\xf5\x0d\xed\xe9\xe8\xf9\xd8\xb2\xaa\x21\x72\x95\xf4\xc2\xe2\x3f\x33\x30\x9a\x06\xf8\x6e\x39\x94\x62\xf6\x9f\x2d\xd0\x6d\xc5\x5d\x3b\x0e\xcf\xbe\xc9\xe5\x99\x1b\x38\x4a\xf2\x58\x7f\x40\x3a\xbb\x23\xfa\x67\x53\x9a\xbb\x51\xf4\x44\xfa\x41\x54\xd6\xa9\x42\xda\x22\x72\x7e\x4e\xf2\x3d\xca\x68\x2c\x1e\x39\x7b\xd6\x74\xdd\xef\xf6\xde\x6e\xef\x5e\xfa\xb7\x65\x60\x40\x43\xfb\x23\x03\x23\x81\x94\x81\xc1\xce\xf1\xe6\xd3\x7d\xd3\x98\xc5\x31\x95\x28\x41\x62\x51\xa2\xea\x66\x11\x71\x55\x88\xdd\x96\x3e\xcf\x0a\x93\x8b\x82\x12\xed\xf6\x69\x64\x60\xea\x91\x32\x30\xac\xf9\x58\x39\x0b\x72\xe4\xd6\xc9\xb5\x2e\xcc\x7a\xd5\x82\x3a\x74\x4b\x18\x2a\xa5\xad\xc4\x4e\xa5\x7b\x98\xc4\x7b\x86\xa8\x23\xa7\x72\x9c\x03\x39\x03\x33\x12\xac\x3f\x2e\xb7\xd9\xcf\x35\x46\x59\xa6\xa2\x30\xe5\x80\x9f\x76\x7e\xe3\xc3\x1d\x9c\x2f\x3f\xa5\x2d\xd6\x03\x48\x97\x04\x6b\x4f\xe5\xf0\x0a\x72\x06\x66\x2f\x99\xd3\xb4\xb8\xce\x4a\x4e\x57\x26\x27\x56\xd3\x6c\x51\x83\x81\xec\xda\xc5\x8b\x1d\xea\x87\x3c\x2a\xb2\xe5\x83\x61\xab\x37\x4e\x65\xb4\xc8\x19\x18\x3a\xa5\x64\xfa\xdf\x9c\xf6\x59\xaa\x59\xb5\x66\xed\xbe\x56\x83\xf3\x4b\x97\x54\x98\x36\xe5\xf2\xa8\xd2\xc4\x7b\xa8\x48\x38\xd8\x4e\x65\xb4\xc8\x19\x18\x89\x46\xe7\x77\x6f\x70\xcf\xf8\xb5\x60\x86\xf7\x14\x36\x5c\xc6\x22\x9b\xbc\x94\x11\x70\xbe\x37\xa5\x6d\x47\xc6\xeb\x29\xf1\xe2\x29\x94\xcd\xdd\xfe\xdf\xa4\x7b\xd2\x7a\x7b\x33\xa5\x67\x40\xf7\x3b\xcf\x80\xfe\xde\x44\x04\x2e\xba\xaf\x18\xfd\x6a\x1b\x83\x3f\x37\xbd\xb2\x86\x4d\xed\xb5\x18\x26\x1b\xe8\xd3\x00\x88\x43\xca\xc0\x94\xb7\x3e\x90\x66\xfb\x89\xa1\xd7\xba\xfb\x21\xec\x79\x66\xd1\xeb\xf0\x99\xd9\xb4\x30\xe1\xbe\x17\x03\x1e\x9f\xdb\x92\xd5\xc6\xa1\x0c\x0c\x80\x83\xaf\xb7\x5d\x72\xd8\xb1\xb5\x37\xf3\x38\xde\x45\x61\xc9\xad\x2b\xc7\x5f\xf2\x22\x51\xb8\x6f\x4e\x9c\x1b\xb7\xd3\xac\xba\x59\xe6\x2b\x01\x75\x8f\x04\x71\x01\x92\x28\x84\xff\x38\x21\x89\xdf\x57\xf7\x2c\xc0\xde\x69\x59\x9a\x51\x74\xb7\x1e\x9b\x80\xd6\x44\x7f\xfe\xcb\x7c\x32\xcf\x3d\x57\x86\x47\x44\xe1\x0b\x50\x57\x1a\x10\x17\x20\x89\xf1\xcf\xee\x9c\x8f\x4d\x53\xcb\x16\x75\xcc\x8d\xae\xf2\x47\x75\x56\x28\xcd\x73\x52\x25\x31\x0b\x0a\x7c\x19\xa9\x34\x0c\x40\xa9\xc5\x96\xfe\x89\xb0\xdf\x20\x0e\xd1\x93\x44\xe2\xef\x19\x18\xd0\x3c\x72\x92\x04\x76\xf9\xfc\x95\x7c\xaa\xb9\xb2\x7d\xcf\x6b\xf0\x7b\x5e\x3a\xbb\x94\xda\x5e\xf1\x5e\xb4\x7f\xd6\xc9\xb3\x3a\x6c\x8f\xe2\x1a\x23\x2a\xf4\x75\x08\xc0\xc1\x25\xd0\x15\x23\xee\xed\x3d\xa4\xc3\x51\xfd\xf9\xbb\xdc\xcf\xdc\x03\x67\xff\xbb\x5f\x63\xdf\x9d\xd7\x37\xe6\x66\x9e\x88\x40\x8f\x56\x81\xee\x54\x07\x71\x48\x37\xb3\xd8\x5b\xa5\x2d\xd2\xbd\x55\xf0\xad\xd7\xc9\x7d\x56\xed\x2a\x1c\xf5\x81\x43\xed\xf9\xef\xf5\xfb\xaf\x4d\xb0\x67\xee\xc7\xa3\xce\x22\xe2\x82\x38\xb8\x04\x5a\x46\x58\x9d\x67\xba\xdd\xca\xcf\x59\xe2\x17\x1d\x97\xa4\xa0\x5c\x39\xc0\x4e\x89\x9d\xeb\x9e\x49\xf2\xb8\x88\xc1\xd6\x39\x0e\xdd\x24\x03\xe2\xe0\x12\x08\x24\x7e\xd9\xe4\x30\xfb\x33\x59\x82\x60\xfd\x46\xe4\xf5\x90\xa0\x96\x17\xbe\xf2\x58\xaf\x7e\x84\x98\x61\x3d\x0c\xe7\xbb\x8d\xcd\x8f\x90\x00\x88\x83\xda\xd2\xfc\x3d\x03\x03\x9a\xd3\x4f\x92\x80\xd1\x3a\x76\xc4\x62\xa5\x01\x1a\x16\xef\x51\xb9\x12\x63\xdd\xad\xc5\x27\xe4\xcc\x33\x8b\xde\x97\xee\x30\x89\x8a\x7a\xe6\x1f\x7d\x45\x0c\x1d\xc4\xc1\x25\x60\xe7\xb9\xf8\xf9\x62\x0f\x39\x5d\x0b\x25\x23\x77\xef\x7b\x8e\xf7\x77\x57\xb0\xee\xcc\x92\x08\x66\xa2\x77\xe8\xd8\x0f\x86\x2e\x41\x8e\x0e\xc4\xc1\x25\xa0\x1e\x47\x45\xbe\xcf\x3b\x88\xa9\x77\x8b\xa2\x92\xf9\x73\xc3\xa3\x9b\x95\x63\x5a\xbf\xfa\x65\x15\x95\x35\xd8\x53\xf1\xe7\xb8\xa1\xca\x19\x10\x07\x97\x00\xad\xe9\x94\xf7\xd2\xf7\xe0\x91\x42\xf4\xa5\x0f\x77\xc2\x1a\xbe\x77\x2a\x2f\xde\xa9\xda\x76\x74\x99\xb7\x90\xbb\x35\x7e\x41\x81\x12\x11\x17\xc4\xc1\x25\xa0\xf3\x34\x39\x95\x64\x7b\xb6\x3e\x8e\x9f\x2c\xf7\xa3\x4a\x85\xec\xee\x3b\x32\x7e\x8a\x59\x4d\x22\xec\xcb\x02\xc6\xc1\x2c\x5e\xfd\x88\x5d\x37\x88\x83\xda\x51\x00\x32\x30\xa0\x05\xf6\x24\x0d\xc4\xae\x51\x93\x4d\xbf\xd0\xf5\x3d\x64\xcc\x53\xf5\x3a\x64\x29\x0a\xea\x88\x70\x17\x9c\x8f\x6a\x8d\x09\x50\x36\x5d\xeb\xdb\x84\x4e\x39\x82\x38\xb8\x06\x8e\x47\xf4\x5f\x88\xa4\x0b\x15\x1d\x09\x09\xd6\xc6\xcf\xaa\x3d\xc0\x7f\x4c\x95\x7c\xb0\xab\xae\x50\xc7\x77\x03\xbb\x99\x3a\xfe\x25\x22\x2e\x88\x83\x6b\xa0\x5c\xc4\xf2\x2c\x61\x6c\xd9\x85\xcf\xb5\xf3\xe6\x22\xdd\xc2\x3b\xb2\x67\x04\xda\x59\x51\x58\x47\xdf\xdb\x76\xb7\x56\x4e\xa8\xcb\x21\xe2\x82\x38\xb8\x06\xa4\x6e\xf6\x15\xd4\x54\xd5\x24\xc7\xb5\x94\x78\x55\x24\x6c\xf3\x55\xb3\x4b\x9a\xdf\x3b\x37\x64\x38\xff\xc9\x16\x77\xc6\x97\xe4\x07\x22\x2e\x88\x83\x6b\x00\xad\x3f\xff\xa7\x2d\x11\xa6\xda\x68\x12\xdd\x42\x97\xb0\xad\x0a\xf9\xe4\x43\xfd\xce\x2a\xb1\xed\x1f\x9e\xe7\x55\xee\x95\xbc\x9e\x44\x68\x00\xc4\x41\xed\x28\x00\x19\x18\xd0\x6e\xe7\x24\x0d\x78\xea\xf7\xf6\x45\xa3\xaa\x4e\xe3\x72\xd8\x9e\xb1\xb1\xf4\xcf\x35\x4b\x78\xae\xfd\xeb\x66\x67\xb2\xbd\xd9\xa8\xef\xe0\x15\x7b\xe8\x90\x1b\x88\x83\x6b\xe0\xca\x4b\x46\x06\x49\xa5\x57\xa1\xe4\x9b\x4b\x96\xe2\xa2\x47\xc3\x7e\x45\xba\x37\xe8\xa2\x89\x9d\x55\xe3\xc3\xf2\x7c\x4c\x32\xa0\x0b\x9a\x40\x1c\x5c\x03\xd5\x86\xd6\x44\xa2\x72\xa8\x5e\x59\x53\x89\xe8\x0c\xfb\x46\xb6\xa1\x0a\x7c\x6f\x7e\x56\x3b\x9e\xd1\x57\xf5\xb1\xd7\x7a\xf9\xb4\x0a\x11\x17\xc4\xc1\x35\x60\xc8\xe3\x66\xdc\x82\xc2\xb9\x75\x45\xef\xd1\x1b\x15\xa2\xec\x83\x29\x99\x6a\x65\xb5\x8c\x3b\x3a\x4f\x1a\x1a\xf1\xab\x1e\x29\x6e\x22\xe2\x82\x38\xb8\x06\xdc\x13\x87\xdc\x31\x8d\xf3\xf0\x15\xd1\xcf\xe2\xb9\xd4\x1c\xd8\x66\xf8\xcd\x62\xeb\x70\x51\x52\x0f\x14\xd9\xa3\x66\x7c\x97\x55\x43\x68\x00\xc4\x41\xf3\x00\x20\x03\x03\xda\x7a\x9e\xa4\x81\xf8\xdf\xec\x7c\x7b\x97\xb1\x36\x30\x8c\x83\x89\x2f\x74\xbe\xc6\xe2\x6f\x71\xd9\x0d\x8c\x20\x8d\xd0\x8e\x0b\x3f\x63\x79\xb6\x16\x6a\xf3\x02\xe2\xe0\x1a\xb8\xae\x37\xcd\xdc\x43\x4a\xe9\x45\x72\x8e\xa6\xf5\xf9\x8d\xe8\x4c\xff\xd0\x60\xfa\x62\x3b\xe5\x09\x2b\x0c\x63\x32\x93\xdf\x02\xd0\xe1\x39\x10\x87\xa4\x01\x46\xfe\xf0\x94\x94\x72\x69\x2d\x6c\x1e\xa5\x6e\x31\xfc\x65\x1d\x8e\xfd\xcb\x45\x1b\x24\x3f\x86\xbd\x4d\xdd\x23\x5f\xb8\x42\xad\x89\x40\x1c\x5c\x03\x13\x9f\xbe\x48\x57\xf9\xc7\x4d\x5d\xc7\xf0\x1c\xd7\x7d\x85\xf3\x9b\x0e\x93\xfc\x71\xb0\xf9\xcd\x2b\x1c\x57\x8b\x97\x99\x7d\xda\xa0\x16\x65\x20\x0e\xae\x01\xdc\xe8\x83\xb3\xf6\x73\x32\x63\x04\xf8\xe3\xea\xe3\xb7\x9c\xc7\x32\x0b\x2b\xd3\x3f\xa2\x7c\x60\xb6\xf4\x1d\x54\x32\x16\xa4\x12\x45\x68\x00\xc4\x41\xf3\x00\x20\x03\x03\x72\xef\x27\x67\x60\x30\xd7\xb8\x2b\x59\x6f\xc7\x08\xae\xb2\x85\x3c\xdd\x2f\x43\xff\xf9\xc5\xf7\x93\x18\xaa\xbf\x5c\x76\xd6\x23\x56\xcd\x08\x4f\xf5\x74\x44\x36\x03\xc4\x21\x67\x60\x88\x2f\xf1\xef\xcd\x8d\x9e\xd5\x27\x49\xe3\x7d\xf9\x40\x9b\xbe\x5d\xa3\xeb\x9e\xc3\x33\x5e\x6e\x4e\xc3\x57\xa8\xbc\x22\x3e\x83\x50\xfd\x14\x88\x0b\x90\x46\xc1\xf9\x67\x64\x13\xef\x8e\x47\x93\xfb\xde\x93\xd9\x2e\x17\x66\xf4\xf5\xb2\x12\xa4\x66\xd7\x84\xfa\xee\x0b\x15\x51\xd8\x24\xf5\x5e\x4f\xa4\xb4\x46\x44\x06\x71\xc8\x4f\xc3\x57\x68\x52\x56\x4c\x02\x83\x4c\xdb\xb1\x4c\x37\xed\xfc\xbb\x69\xf2\xee\x33\x9f\x32\xc4\x9a\x87\x18\x5d\xa5\xc6\xd9\xb0\x7a\xa5\xa1\x0c\xcc\x42\xe1\xab\x60\x35\x5b\x3d\x2d\xbf\x43\xe2\x4c\xe5\x71\xad\x65\x22\x15\x79\x2c\xd5\x07\x9c\x68\x36\x5c\x1c\x03\xf9\xd9\x6b\xcb\x7f\x66\x60\x6a\x2e\x69\xb2\x31\xe4\xad\xcc\xb3\x28\x77\xed\x39\x3c\x6d\x1a\x93\x0e\x3f\xdf\x30\x2a\xdf\xe7\x47\x60\xcb\xaf\xa9\xfc\x51\x0b\xed\xcf\x79\xd9\x7c\x32\x42\x1c\xd5\x91\x3f\x75\x9f\x6d\x98\xdb\x37\x49\xb1\xc7\x9d\xca\xff\xa8\x3a\xbe\xef\x62\x5f\xcf\x96\x70\xa5\xe5\x2d\x09\x09\x3c\xbc\x7f\x43\x06\xc6\x17\xf3\x7f\x1b\x5a\x20\x3a\x0a\x66\xc0\x0d\x5a\xdf\xa0\x30\x29\x5f\xa4\x0c\xcc\x31\x16\x4a\x8c\xb0\x6d\xad\x1a\x15\x23\xea\x44\xfe\xed\xf7\x9a\x26\x7c\xba\xfb\x36\x82\x17\x3e\xa0\x59\x93\xfc\x1a\x6f\x68\x60\x38\x8d\x0c\x0c\x8a\x0a\xfc\xaf\x4e\x78\x12\x33\x7f\x4b\x5f\x5f\x94\x0f\x8f\x10\xc6\x90\xb7\x55\x4f\xb9\x7e\xbf\x8d\xed\xda\xf0\x5b\xbb\x7a\x9d\xe5\x9c\xc7\x41\x68\xa7\x72\x3c\x03\x39\x03\x23\x96\xca\x56\x2f\xb2\xa0\x5f\x3a\x3e\x73\xf9\x96\xeb\xe4\x21\xb3\x88\xc2\x37\xa1\xbb\x3f\xdd\x06\x04\xd1\xf7\xc2\x76\xb4\xe3\x4e\xa5\xdf\x0b\x8a\x16\xd2\x9f\x65\x30\x1e\xdf\x4b\x15\x2b\xa7\xf1\xbc\x41\x2e\x99\x46\x2a\xc8\x91\x74\x6b\x79\x8d\xa2\x68\x57\x3e\xd4\x4c\xc4\x6c\xfc\xfe\xb6\xf6\xa9\x8c\x16\x39\x03\xd3\x51\xe0\x72\xe6\xeb\xed\xf8\x95\xfb\x0b\x0f\x02\x93\xe7\x5f\x2a\x6c\x69\xb6\x12\xf1\x67\x90\xaa\x96\xd0\x52\xf0\x74\x60\x9c\x3d\x77\x6a\xa9\x10\x90\x86\x4e\x5a\xf8\xe2\xc6\x99\x6a\x7e\xf0\xbe\x63\x64\xfa\x52\x53\xf0\xf8\xc2\xd0\x21\xd7\xf6\xca\x23\xec\x6b\xe6\x21\x6f\x48\x02\x5d\x4c\x7f\x4e\x69\x21\x26\x7c\x10\x07\x5f\xf8\x08\xdc\x66\xd8\x12\xcc\x3f\x4d\xc8\xbe\x8d\xb8\xc5\xf8\xf6\x19\x5e\x20\xba\x01\x1a\x49\xca\xcd\x9a\x4e\x69\xb3\xf1\xd1\x36\x4d\xa8\xed\x2b\x88\x83\x2f\x7c\x8e\x3a\xae\xfb\x19\x22\xbb\xd7\x26\x5b\x2a\xeb\x58\xf9\x66\x96\xb3\xdd\xaf\xb2\x9f\x9b\xc2\x39\x63\x8e\x6a\x9a\x6b\x96\xfc\x19\xf2\xd7\x20\x0e\xbe\xf0\x2d\xd0\x7c\xca\xc4\xce\x2a\xb4\x5b\xb4\x7d\x44\x2f\x20\x78\x6e\x64\xbc\x3c\x9b\x7d\xac\x34\xfe\xd2\x65\xd9\x14\x36\x31\x9a\xf2\x9b\x88\xb8\x20\x2e\x40\x52\xe2\x1f\xcf\xa1\x8c\x78\x8a\xc7\x4c\x80\xd9\xf1\xae\xeb\xc3\x46\xd4\x33\x21\xdf\x34\x2e\xde\x4b\xda\x23\x17\xd8\xd0\x29\x55\xdc\x73\x13\xf9\x0c\xb5\x67\x05\x71\x88\x6e\x1f\xbe\x7f\x4f\x85\x80\x5e\xe8\x93\x24\x80\xf5\xe5\xa9\x42\xeb\x43\x3a\x54\x17\x07\xb9\x72\xda\x1b\xa4\xe7\xb0\xc9\x2b\x95\x2f\xdc\x8d\xef\xf3\xba\x93\xf5\xfd\x5a\x7b\xae\x05\x62\xe8\x20\x0e\x2e\x81\x08\xe6\x92\x4b\x47\x4f\x44\x2e\x4c\x5e\xb0\xeb\xc6\xe8\x08\x8f\x89\xf2\xbd\xae\x98\x5f\xc4\xe5\x9c\x8e\x9f\x5a\x16\xd5\xed\xff\x0a\x3a\x34\x02\xe0\x90\xea\x71\x06\x0f\xf1\xf3\xd6\x31\xe3\x75\xc3\x51\x23\xa6\xd9\xba\x29\x97\x27\x3b\x8c\x9c\x1f\x76\x64\xcc\x45\x04\x9b\x24\xef\x86\x6b\x42\xbf\x17\xc0\xc1\x25\x20\x87\x5a\xc4\x3a\xac\x6e\xb3\x16\x5c\xf7\xb0\x95\x3c\xfb\xa2\x82\x4b\xb5\x1e\xbb\xf4\xd3\xef\x1b\xf8\xf5\x04\x74\x9f\x35\xbd\xd2\xa1\x93\x13\x00\x0e\x2e\x01\xa3\xe2\xf8\xd7\xf5\x92\xde\x2b\xbc\xed\x97\xf4\x97\xec\xed\x8f\xae\x6d\xae\x15\x5b\x45\x18\x2a\xe9\xa1\xef\x6d\xa6\xc6\x6b\x4b\x22\x24\x00\xe2\xa0\x86\x2f\x2a\x7f\x95\x00\x68\x72\x3d\xb1\xd9\xc7\x2c\x33\x41\x48\xd2\x9b\x37\xe5\x7e\x7a\xd2\x11\x5a\xaf\xca\x7e\xb2\xec\x62\x0f\x7f\x0c\xe2\xc3\x44\xf3\x5a\xf4\x57\x6f\x84\xae\x3c\x01\x71\x70\x09\xf8\x1c\xde\x15\x1a\x66\xfc\x38\xed\x60\x90\xb2\x52\xf1\x44\xbe\x40\x44\x6e\x22\x02\x1d\xc7\xe7\xf9\x5a\xa0\x3d\xba\x85\x5e\x33\x94\x68\x05\x71\x70\x09\xf8\xe8\x0b\x67\x93\x8b\xfe\xe0\xe1\x94\x8b\x9d\xfe\x4e\x9c\x4a\xfc\xfe\x33\x53\xae\x7a\x22\x76\xcf\x56\xe4\xb1\xa3\x14\x37\x35\xf4\xaf\x02\x71\x70\x09\x24\xbf\x97\xb5\xeb\x5e\xff\x69\x23\xdf\x9d\xfd\xc0\xeb\xed\xc2\xcf\xa4\x44\xf3\x5b\x37\xde\x9f\x3f\x3f\x77\x26\x61\x5b\x22\xbd\x03\x7a\x15\x40\x1c\x5c\x02\x6b\xb9\x15\xb6\xb1\xfd\xea\xc4\x94\xc2\x8b\xf2\xe3\xbe\xb4\xec\xc2\x78\xc1\xdc\x45\x86\x38\x22\x3b\x6e\x2a\x9e\xf9\xcb\x31\x37\x11\xdb\x5f\x10\x07\x35\x7a\x00\xa4\x42\x40\x2b\xdd\x49\x1a\x98\x8d\x15\x08\x2d\x9b\xf4\xef\x7e\xaa\xde\x78\x15\x5d\x75\x4f\x35\xe2\xfc\x62\x3b\x29\x0a\xd3\xf6\x17\x07\x66\x02\xc3\x3e\xf2\x5e\xe8\xe3\x2b\x80\x83\x6b\x60\xaa\x73\x56\xf1\x7e\x93\x82\xae\x92\x59\xf5\x70\xa3\xd3\xe3\x98\x4f\x28\x89\xe7\x6d\x9d\x70\xf7\xd8\x05\x1d\xef\x89\x3d\xbb\x07\xf5\x93\x02\x71\x70\x0d\xb4\xe3\x18\x1d\xc5\xcf\x8f\xa3\xad\x4e\x5c\x7a\xe8\xa7\xb9\x6c\x50\x28\x4b\xfa\x7e\x54\x5c\xe3\xed\xbd\x64\x89\xa3\x6f\x39\x84\x50\x9d\x0f\x88\x83\x6b\x40\xfb\x61\x6c\xe6\xcf\x4f\x38\x4c\x11\xbc\xa9\x1c\xca\x8c\xec\xe4\xc5\x2f\x09\xe5\xe9\xd0\x0b\xf9\xcb\x8b\x8a\x9a\xe4\x7b\xc9\x78\x11\x71\x41\x1c\x5c\x03\xaa\x37\x78\x42\xa2\xa7\xa6\x7e\x63\xbc\x41\xf3\x15\x7f\xe1\x22\x78\x76\xf0\xb3\xec\xbd\xc1\xe5\x16\x19\xf5\x6a\x09\xc1\x12\xc1\x09\xe8\xee\x5b\x00\x07\x35\x7a\xd0\xfa\xbb\x06\x40\xdb\x8e\x93\x34\x90\x14\x5d\x7f\x57\x4e\xc8\xdd\xc8\x27\xa2\x09\x25\x77\xe7\x83\x78\xd3\x3b\xaf\x57\xec\x7b\xe5\x51\x8d\x76\xbb\x67\x39\x65\xa6\xa9\xa1\x46\x27\x00\x0e\xa9\x59\xfb\x57\xae\x82\xce\x42\x1b\x42\x2e\x39\xbc\xc9\xcc\xac\xf4\x2f\x03\xf7\x71\x26\x9d\x22\xce\x3a\x72\x06\x39\x14\x15\x0a\x05\x41\xb6\x12\xc4\xc1\x35\x50\x32\x62\x96\x76\x1d\x67\x13\x9b\x93\xb5\xcc\xb2\x64\xdc\x6e\xeb\x2d\xca\xcb\x76\x9a\xb8\x8d\xfa\x87\x33\x18\x99\x0d\xf6\x6f\xa0\x26\xf0\x20\x0e\xae\x01\xae\xc8\xcb\xce\x82\xfb\x1a\xf3\xfa\x04\x2b\x0d\xbe\xd4\x2e\xaa\x14\xae\x7d\x05\x69\x37\xd3\xa9\x2c\x89\x74\xbe\xcf\xd8\xb7\x43\x1d\xc0\x41\x1c\x5c\x03\xd1\x35\x9f\xf4\xb4\xc7\xc5\x23\x2f\x4f\xfd\x18\xb0\xea\xaa\xfd\x9d\xdb\x51\x4d\xea\x9e\x9c\x7e\x4d\x62\x77\xfa\x4b\x66\x92\x7c\x1e\x42\x03\x20\x0e\x9a\x07\xfe\x5f\xa9\x10\xc3\xff\xcd\x42\x9d\x6c\x83\xcd\x0c\x6c\x0e\x9c\xb2\x72\x54\x43\x0b\x3b\x29\xcd\x38\xea\x69\xad\x49\x3b\x39\xf4\xc3\xb9\x6c\xa2\xec\xda\x6b\x82\x96\x2a\xbb\x10\x96\x12\xc4\x21\xdb\x60\xfd\xed\x63\xf9\x90\x24\x2d\x7c\xa7\xcd\xb0\x75\xb7\xc0\x9c\x64\xf9\xb3\x4f\x19\x6a\x7b\xf8\xe8\xcf\x32\xe5\xb4\x6e\xd8\x56\x15\x21\x22\x83\x38\x64\x1b\x2c\x26\xe1\x5a\x79\xcd\x86\x9a\xc5\x92\x76\xfc\x68\x20\xa5\x26\x88\xf5\x01\x3a\xd3\x6d\xc7\x83\xaa\x45\x71\x87\xdf\x57\x38\xa9\x48\x11\x91\x41\x5c\x80\x34\x0e\xec\x69\xf4\x6d\x1f\x7c\xdc\xce\xbf\x21\x56\x7e\x69\x5e\x84\xe0\xac\xfa\x34\x65\x91\x04\xdf\xbc\x5b\xd1\xf9\xd7\xa2\xa4\x97\x0f\x6b\xab\xa8\x11\xb5\x23\x20\xee\xbf\x91\x7d\xfd\x6e\x94\x21\x7c\xb3\xcb\xb3\x0c\xba\x9d\xa2\x2b\x69\xad\xc5\xb4\x6a\x6e\x25\xe2\xa3\x0a\x0a\x1a\x33\xd3\x94\x37\x5a\xd8\xf4\xc5\xf5\x85\xcd\xab\xc2\xfe\xf4\xcd\x67\x19\x13\xab\x2c\xaa\x2b\x3b\x7f\xa5\x3e\x69\x73\xe2\x26\xa4\x9a\x60\x2d\x6b\xdc\xb8\xe4\x44\x5f\xa4\x5b\x5f\xa4\x79\xe5\x7a\xdd\x1f\xe8\x38\xcb\x62\xe3\xe8\xf9\x66\x77\x97\x46\xb4\x0c\xb3\x3b\x5e\x63\xd1\x57\xe8\x48\xd8\xef\x04\x4a\xf0\x2f\x62\xdb\x7a\xa9\xd0\x5f\xfb\xb7\xf9\x66\xd0\xd0\xfe\xf0\xcd\xf5\x48\xbe\x99\xf4\xf8\x16\xf1\xf2\x11\xd1\x64\x5c\xf9\xcd\xab\x67\xef\xe3\x30\x3c\x14\xea\x9b\xa1\xd6\x4f\x09\x6a\xf0\xd6\x1e\xe9\xdb\xfe\xf4\xed\x34\x7c\xb3\x04\x92\x6f\xa6\x20\x1b\xde\x52\x72\x57\x62\xe6\x73\xa7\xfa\xd6\x73\xd5\x67\x99\xef\x5d\xd9\x1c\x8d\x43\xc8\x93\xa8\x31\xe6\xd9\x17\x0f\xc6\x4e\xe5\x5b\x7e\x3d\xb2\x6f\x66\xd6\x16\x33\xc6\x65\xb6\xcb\xf3\xac\xc8\x63\x28\x8c\x53\xd3\x5b\x65\x78\xfc\xde\xe8\x3b\x9f\xcc\x8f\xd6\x31\xb1\x19\xf3\x1a\xd3\x53\x39\x42\x80\xec\x9b\xfd\xcd\xba\xd4\x82\xde\x4d\x76\xdf\xe3\x64\x12\xb7\x69\xec\x7b\xc6\xde\x6b\xad\x26\xa2\xe9\x21\x2d\xe2\x8e\x5f\xdc\x77\xa6\xcf\xf0\x54\x46\x8b\xec\x9b\x53\x77\x2d\xed\xe7\x2d\x57\x04\x70\xdf\x77\x76\xb4\x7e\x66\xdf\xfe\x90\xa6\x73\x67\x8a\x7b\xad\x49\x3f\xe6\x0d\x46\x48\x5b\x5f\xea\xa9\xf9\x66\x90\x86\x4e\x5a\x29\xcf\x1b\x57\xda\xf8\xf7\x32\x7c\xc4\xab\x1a\x2b\x7c\x98\xa5\x5a\x35\x51\xf2\x91\x07\x2b\x0e\x47\x35\x9b\xf0\x3c\xd5\xdd\xcc\x1e\xa8\x85\x19\x88\x83\xaf\x94\x7e\x2a\x64\x35\x4f\x5e\x9e\xe7\xa8\x7c\xa6\xe6\x7c\xb6\x21\xd0\x9a\x8f\x70\x97\x0f\x3d\xa9\x39\xe2\xa8\x6d\x3f\x56\xe4\x40\xad\x00\x11\x17\xc4\xc1\x57\xca\xde\x07\xb8\xfd\xa3\x3a\xf5\x0b\xd2\xf6\x6d\x07\x37\x94\xbe\x0d\xcc\xfb\xac\x52\x5d\xbc\xef\xc1\x4d\xd5\xb1\x2a\x69\xb5\xbf\x5d\x81\x88\x0b\xe2\xe0\x2b\x65\x75\x5a\xa7\x71\xbd\xc1\xd7\x36\xa2\xee\x4b\x43\x63\x15\x82\x37\x8b\x9f\xc6\x8a\x50\xaa\x08\x9e\x71\xeb\xaf\xe5\x1c\xd1\xb4\x5c\x80\x12\xd1\x00\x2e\x40\xf2\x9f\x3d\xb1\x77\xbc\xdd\x07\xc6\xc3\xa7\x70\x75\x3b\x77\xd8\x4d\xa9\x02\xba\x75\x55\x51\x88\x03\x8e\x2e\xf5\x55\x96\xcb\xa2\x1f\x9e\xb9\xaf\x8a\x30\x4d\x20\x0e\xd1\x74\xa1\xfe\xef\xbe\x19\xf4\x42\x9f\x24\x81\x1a\xfa\xb4\xb4\xfc\x67\x0f\xb4\x8f\x3e\xe0\x49\x36\x9e\x21\x7d\xd5\x47\x21\xe0\x57\x9b\xdf\x5a\xe9\x71\x2f\xe7\x3c\x57\xa7\x1c\x74\x69\x34\x88\x83\x4b\x40\x8a\xef\xb2\x1e\x7e\xcf\xc7\x80\x4f\x98\x03\x0d\x6c\x11\x07\x2c\xad\x98\x5c\xfb\x77\x13\x37\x84\xe3\x42\x51\x75\xc8\x8e\xff\xef\xee\x41\x10\x87\x74\x15\x31\xd6\xe0\x2f\xc5\x6f\xfd\xd6\x09\xdf\x48\x51\x87\x8a\xac\xdf\xec\xbb\x8c\x64\x47\x97\x78\x3a\x59\x47\x3f\x6d\xbe\xd9\xd2\x01\xd5\xdb\x80\x38\xb8\x04\x56\xb8\x7a\x51\x19\xa2\x6e\x1d\x90\x53\x4f\x45\x62\xfc\xe0\xbc\x2b\xd8\xfe\x22\xc5\xcb\xfe\xd9\x21\x49\xfe\x03\xa7\xd2\xb0\x62\xe8\x14\x3b\x88\x83\x4b\xc0\xb9\x47\xf8\x52\x8c\x4c\xae\xa2\x98\xc1\x00\x73\x68\xbf\x1e\x13\xf5\xb9\x37\x43\xaa\x41\x95\x2e\xb2\xb1\x98\x6f\x86\xb0\xf6\xd3\x10\x12\x00\x71\x50\xdf\x8d\xbf\xfb\x66\xd0\xe4\x7a\x92\x04\x8a\x1d\xe4\x99\x3f\xc8\xb5\x66\x38\xc6\xd8\x7d\x68\x6c\x71\x62\xed\x79\x5a\x2e\x10\xeb\x4f\xca\xaa\x4d\x36\xf4\x54\x75\xe5\xb8\x19\xea\x61\x00\xe0\xe0\x12\x70\x18\xbd\x85\x67\x59\x13\x67\xf9\x78\xa3\xa2\x2d\xbd\xfd\x77\x7e\x45\x4e\x7d\xc2\xa6\xe7\xfd\xc3\xf7\xb3\xae\xd1\xc4\x7a\xba\x73\x88\xb8\x20\x0e\x2e\x01\x45\x2d\xca\xee\xf2\xb7\xa6\x64\xfc\xad\x83\x8e\xe7\x69\x30\xc3\xc8\xd3\xdc\x66\x05\x1f\xf2\xc6\x0a\xde\x56\x56\x7a\x60\xdc\x0c\x1d\x79\x00\x71\x70\x09\x58\xa7\xe0\xf8\xf0\x76\x57\x6e\x6a\xae\xec\x2a\xb7\x5d\xaa\xde\x10\x12\x53\x95\xa5\x13\x89\x72\x23\x5e\x8e\x11\x57\x99\xf6\x89\x44\xc4\x05\x71\x70\x09\xdc\xe1\x4a\x0e\xf8\x19\x79\xeb\xf5\xf0\x17\x96\x2c\x71\xcf\xc9\xc1\x54\xf5\x15\x73\x45\x59\xc7\x80\x02\x3e\xbd\x61\x59\x07\x5e\x36\xc4\x7e\x19\xc4\x41\xf5\xf6\x00\xdf\x0c\x5a\xe9\x4e\xd2\x80\x9e\xd1\xb9\xe7\x74\x46\xe1\x5d\x63\x77\x68\x5d\x65\xc6\xf4\x45\xde\x14\x7b\x0c\x6c\x68\x0b\xf6\x7c\xbf\xf0\x1c\x45\xfa\x37\x3b\x74\x0b\x11\x88\x43\x3a\x4c\x66\xd0\x18\xfc\x88\xc7\x29\xc5\x20\x66\xe7\x19\xc6\x56\x65\x88\xb7\x42\xa4\x70\x3a\x76\x26\xda\x45\x49\x56\xbf\xca\x1a\x33\x72\xe8\x30\x19\x80\x83\x6b\xe0\x9b\x86\xfa\xc0\x66\x60\x0f\x15\x87\xa2\xe3\xdb\xd1\xdc\x4f\x83\x59\xb5\xec\x17\xdc\xe2\x63\x73\x2d\x2c\xf8\x7e\xa7\x0a\x64\x41\x37\xdb\x80\x38\xb8\x06\x96\xa5\x89\xa6\x0d\xeb\x8e\xd9\x2b\x32\x2e\xea\x08\xad\xc5\x3c\xc4\x2f\x9b\x8b\x70\x0c\x72\xcf\x5b\x1c\x29\xdd\xe8\xd0\x0b\xf7\x42\xc4\x05\x71\x70\x0d\xe0\xe8\x0f\x1d\xe6\x55\xca\x5c\xb8\xf0\x98\x62\x6f\xa5\x79\xad\xe9\xcc\x4b\xef\xfb\xd7\xe4\xef\x87\xf1\x97\xc8\xfd\xf8\xf9\xfe\xe1\x3d\xe8\x76\x23\x00\x07\xd5\xdb\x03\x7c\x33\x68\xdb\x71\x92\x06\xc4\xcc\x7e\x6f\x2f\x89\xa3\x84\xb7\xf9\x1d\x3e\x20\xe7\x3d\x7b\x64\x22\xa2\x3e\xad\x62\xb6\xfb\x92\x66\xf9\x99\xc3\xd2\xd6\x98\x0a\x62\xec\x20\x0e\xae\x01\x99\x82\x68\xf4\xa6\xad\xfb\xcf\xf0\x8b\x9d\xa6\x8e\xf9\xaa\x5d\xcc\xef\xbd\xa2\xf3\xa6\x18\x3c\x43\x61\x35\x40\x39\xc4\xe3\x04\x35\x62\x06\x71\x70\x0d\x24\x44\x47\x8f\x55\x7b\x3b\x9f\x63\x3b\x0e\x49\xb9\xe7\x64\x51\x93\xc6\xb8\xc8\x7a\xbf\xe7\x05\x11\x1a\x41\x63\x71\x27\x9b\xbc\x06\x54\x74\x05\xe0\xe0\x1a\xd0\x4b\xe0\x65\xbb\xe5\x23\x54\xbf\xce\x38\x88\xb5\xa0\xcd\xcc\xe5\xfc\x95\x0d\x43\x95\xac\xab\x98\xc5\xe9\x70\xb3\x48\x97\x14\xfa\xbd\x20\x0e\xae\x01\xcc\xe0\x37\xc3\x72\xa6\x25\x5b\xb1\x3e\xcc\xb4\x95\xb6\x65\x89\xfb\x4a\x8f\x73\xa3\x2f\x17\x3d\xad\x68\x88\xe3\x51\xb2\x47\x85\x8a\xb9\x40\x1c\x34\x0f\x00\x7c\x33\xc8\x42\x9d\xec\x9b\xbd\xa5\x8d\x1d\x9f\x55\x27\xea\xfe\x48\x2f\x50\x2b\xff\xe9\xb8\xf5\x48\x87\x2f\x73\x4a\x2e\xa4\x9b\xc4\x61\xee\xc3\xdd\x91\x05\x73\x84\x07\x05\x71\xc8\xbe\xf9\x6a\xf1\xf7\x52\x01\xdb\xc0\xc3\x6f\xeb\xb4\x87\x2e\x4a\x29\xfd\x17\xe5\x5e\x29\xe3\x4b\xe3\x6b\xd8\xbc\xd4\xdb\xa1\x55\x23\x19\x45\x44\x06\x71\xc8\xbe\xd9\xce\x5f\x55\x17\x77\x1d\xd7\x08\x83\xcd\x57\xba\xc5\x95\xe6\xee\x0a\xef\x15\xaf\x3e\xcb\xf9\xec\x44\xbb\xf3\x36\x58\x12\x4a\x6e\x88\xc8\x20\x2e\x40\x9a\x10\xf6\x34\x5e\x0c\x2d\x15\x0a\x2c\x68\x96\x51\xdc\xcb\xc5\x57\x51\xea\x48\xf0\x7a\x36\x55\x20\xea\x65\xb3\x9d\xc4\x48\x51\xa4\x4d\xfe\x46\x15\xe1\x9b\x41\xdc\x7f\x4b\x03\xfe\xf4\xcd\x96\x1e\x7b\xc1\xac\x4d\x68\x76\x43\x7c\xa5\xb2\x52\xe5\xf2\xa8\xdf\xcf\xf2\x48\x6f\x5f\x7a\x85\xda\x3b\x74\xbb\xf1\xea\xed\x10\xbf\x3f\x7d\x73\x67\x37\xcb\x13\x85\xd1\x4a\x5e\x85\x5b\x4f\xe6\xee\xbf\x25\xf6\x8c\x51\x24\x49\xc6\x51\x28\xcc\x73\x8e\x63\x37\x70\x9d\x36\x54\xfc\x03\x3d\x90\x22\xd8\x68\xa7\x3b\x2e\xc7\x91\x77\xca\x92\xc8\xff\xd1\xe2\x6d\x22\x67\xd0\x5c\x96\x10\x15\xbc\x79\xe3\x8a\x4b\x6c\xb2\xf0\xbf\xcd\x37\x83\x86\xf6\x87\x6f\x46\x91\x82\x9b\xab\x73\x8b\x62\x02\xf1\x36\xac\x72\xc2\xb4\x51\x8a\x03\x05\x58\x5f\xe4\xc9\xf6\x13\xee\x13\x1a\xb7\xbc\x33\xf1\x6f\x20\x25\xb3\x55\x3d\x0d\xdf\xec\x8b\xe4\x9b\x6b\x06\xbb\xa7\xa3\x76\x38\x45\x7a\x9c\x93\x8c\x7d\xc6\x43\x5d\x5b\xfb\xe6\x68\x69\x28\x8b\x95\x5d\xde\xa7\x93\x2a\x1f\x7d\x42\x3d\x95\x0f\xbf\xd7\x91\x9c\xa4\x20\xcf\x57\xef\xc6\xb9\xf4\x2d\x0c\x1e\xf3\x68\xb3\xfc\xdf\xdd\xb1\xbf\x63\x39\x9d\x1b\xa5\xfd\x4a\x55\x67\xaf\xe9\x38\x93\x3f\x39\x95\x0f\xbf\xc8\xbe\x59\xc5\x08\xf7\xc7\x51\xf7\xcf\x97\x6a\x3a\x0d\x1d\x0d\x2c\x11\x56\x33\x77\xd6\x34\x9c\x23\x9c\x76\x2e\x6d\x17\xba\x0e\x88\xf1\x2b\x9d\xca\x68\x9d\x91\xef\xa1\x8d\x27\xda\x8e\x37\x73\x3a\xda\x20\xf9\xf6\x75\x55\x29\x29\xfe\x19\xfe\x7a\x9e\x81\xad\xc1\x9d\xcc\xd0\x47\x1a\x47\x73\x2b\x5b\xa7\xe6\x9b\x41\x1a\x3a\x69\xa5\x0c\xa5\x2a\x13\x91\xe9\x21\x23\x12\x8f\xb6\x1e\x68\x50\xa1\x27\x9f\x9a\xb8\xd7\x53\x66\xcc\x5d\xe4\x8f\xa7\x65\xe4\x7e\xf3\x5a\x08\x62\x85\x00\x71\xf0\x95\x92\xd6\x87\x97\xc8\x37\x69\x1f\x6f\xd3\xfa\x4e\xf9\xab\x57\x49\x63\x8b\x89\x31\x6f\x33\xdb\xa9\x53\x84\x8e\xbf\x2d\x87\x78\xbc\x77\x87\x0e\xb1\x02\x38\xf8\x4a\x19\xdd\x32\x3f\x97\xde\x2d\xb1\x79\x7b\xba\xcc\x35\x14\xaf\x65\xe4\x3e\x2b\x05\xbf\x02\x49\x52\xbf\xa5\x37\x39\xc6\x05\xb4\x50\x68\x27\x0e\xe2\xe0\x2b\xe5\xf8\x95\x2d\x13\x5c\x86\xaf\xc4\x0b\x84\x0b\x09\xe1\x36\x86\x91\x3e\xe1\xa5\xef\x56\x15\xef\x2e\xda\x2e\xad\xc8\xad\x71\xdc\x81\xda\x54\x83\xb8\x00\xc9\x7f\x76\xba\xe9\xe6\x66\x2a\x7c\x67\xa2\xca\x28\x4a\x9e\x53\xb1\xef\xf9\xac\x68\x4f\x85\xa2\xa9\x3f\x5c\xf4\xed\x62\x03\xdb\xe0\x12\x77\x44\x19\xc2\x34\x81\x38\xa8\xf9\x81\xd4\x5f\x37\x4b\xa0\x17\xfa\x24\x09\x2c\xcc\x58\x61\x39\x91\xa3\x1e\x63\x31\x44\x0a\xb4\xf5\xf7\x45\xc9\x0e\xd5\x1a\xfd\x1a\x31\xa9\x1f\xdf\xcd\x48\x8f\xd8\xa0\x79\x0b\x7d\x6a\x07\x70\x70\x09\x04\x8d\x78\xc6\xe8\x52\x58\xff\x16\x14\xdc\x7a\x82\x7e\xc9\x56\x7f\x8a\x60\x44\x5f\xb0\x96\xd4\x96\x2f\x10\xef\xfd\xbc\x61\x2d\xd4\x54\x01\xc4\x21\x35\x7c\xfa\x31\x41\x64\xea\xf9\x59\xd3\xa6\x8f\xaa\x51\x09\xf3\x49\xea\xfb\xd8\xb4\xc7\x97\x0d\xd0\xe5\xc5\xed\xbf\xf1\x60\xb9\xce\x4d\x23\xe2\x82\x38\xb8\x04\xae\xaa\x3b\x31\x7e\x3e\xa4\xc6\xf2\x54\xc9\xb9\xb1\x57\x96\x23\xca\x20\x68\x91\x54\x60\xf2\xf0\x06\x4a\xd0\xfa\x8e\x6a\x06\xa7\x2f\x22\x2e\x88\x83\x4b\xe0\x3d\xd3\xe7\xf8\xc4\x1a\xaa\x0b\x1f\x48\x48\x93\xed\xc3\xba\x0a\x2a\xb8\xad\x12\x85\xab\x19\x02\x86\x85\x4a\x45\x19\x8c\x5a\xf7\x11\x12\x00\x71\x50\xf3\x83\xbf\xfb\x66\xd0\xe4\x7a\x92\x04\x7e\xe3\xbe\xbe\xd4\xed\x50\x5e\x48\xe3\xb8\xb6\x46\x60\x69\xc3\xb9\x76\x81\x80\xfb\x66\x99\x77\x6b\xf0\xd4\xb0\xf1\x13\x0b\x16\xa8\x49\x01\x88\x83\x4b\x80\xad\x05\xf3\x8a\xf1\x19\x3c\x52\xb6\x90\x08\x72\x41\xc2\x54\xac\xd7\x8d\x4a\xea\x2f\xaf\x56\xab\xf9\x51\x0e\x48\xb2\x5f\x0b\x6e\x45\xc4\x05\x71\x70\x09\x10\xf7\x2e\xdd\x52\x08\xfb\x68\x68\x4a\xf8\xa5\xb0\x0f\x93\xcd\x64\xe4\xed\x92\x7b\x03\x46\x17\x77\x30\x97\xb1\xf4\x6b\x76\x63\x34\x44\x5c\x10\x87\xb4\x5f\x96\x75\xd3\xbc\x73\xac\x8f\xd1\xb8\x46\xed\x68\x6f\x91\x73\xef\xc2\x8c\xca\x03\x32\xac\xd7\x86\xd2\xe9\xe5\x65\x26\x18\x0e\x37\xa0\xfd\x32\x80\x83\x4b\xc0\x80\x14\x95\xb0\xb4\x0d\x77\xa4\xe0\x39\x6f\x82\x44\x89\xe7\x45\x95\x4d\x4c\x41\x9c\xb5\x69\x26\xac\x01\xcb\xc0\xb4\xcf\x25\x67\x11\xfb\x65\x10\x07\x15\x3d\x5f\xff\xbb\x67\x02\xad\x74\x27\x69\x20\x24\x4a\xe7\xf3\xb5\xc3\x42\x35\x12\xc7\xe9\x9b\xc9\x37\x4c\x98\x9a\xfa\xb9\xc8\x14\xdd\x3e\xe7\x98\x5b\x46\x94\x74\x1b\x0c\x4b\x23\xc6\x0e\xe2\x90\x8e\x5d\x4f\x4b\x4e\x46\x7d\x64\x7f\x31\xed\x75\x36\x53\xb9\x40\xeb\xfb\xeb\x65\x55\x8a\xac\x27\xd4\xc2\x2e\x5b\x3f\x86\x95\x36\x72\xa1\xa3\xbc\x20\x0e\xae\x81\x26\xea\xb8\xc9\x4d\x16\xea\x51\xce\x0f\x1f\x44\x0c\x38\xa3\x2b\x30\x35\x74\x64\xdc\xdf\xf2\xe0\x0d\x39\x7d\x4d\xfb\x45\x12\x27\x01\xb5\xab\x01\x70\x70\x0d\x94\x6c\x0a\xdb\x6c\x89\x95\xe6\x3f\x5f\xc9\xf9\xd5\xe1\xdd\x17\xfa\x3d\x9b\xc2\xf2\x91\x96\x30\xae\xbc\x8c\x87\x8f\xc6\xda\x21\x74\x4c\x06\xc4\xc1\x35\xb0\x4b\x76\xf5\x7d\x3d\xed\xf9\xfb\x59\x37\x56\xc7\xa5\x1c\x98\x6a\x08\x2a\xd8\x2a\xd2\x73\x7e\xf0\x94\x64\xf8\x27\x3e\xfe\xb1\xc8\x8a\xd0\x00\x88\x83\x8a\x9e\x01\xbe\x19\xb4\xed\x38\x49\x03\x6e\x51\x17\x35\x3d\xbb\x25\x7c\x3c\x84\x99\xb8\xe2\x34\x84\x58\x58\x1e\xed\xf8\x1d\x57\xcf\x75\xcb\xca\xc9\xe5\x5a\x73\x72\x43\x79\x23\x10\x07\xd7\x40\xe7\x95\x00\xc3\x8d\x0b\xf8\xcd\x33\xb5\x0f\x32\xbf\xf5\x98\xe3\xf2\x86\x79\x95\x35\xcd\x14\x11\xbf\x71\xbf\x3a\xe0\xf6\xb5\x3a\x02\x2a\xa8\x07\x70\x70\x0d\xbc\x62\x46\x6f\x9c\x66\x7f\x42\x2b\xc7\xf0\x69\x9d\x46\xf8\xcb\x9a\xe9\x50\xf0\xfa\x88\x54\x84\xf3\xf2\x85\x2f\x7d\xaf\xb0\xd3\xa0\x4b\x71\x40\x1c\x5c\x03\x32\xa5\x38\x7a\x55\xed\x1c\xa3\xfc\x9b\xd1\xc5\x9c\x02\xc4\x53\xc3\xcf\x7a\x98\x83\x18\xbd\x73\xce\x55\x7e\x64\x4d\x92\xfe\x15\x08\xf9\x7c\x00\x07\xd7\x40\xeb\x06\xbe\xc4\x18\xfa\xc1\x59\xa2\x3d\x0e\x62\xd7\xa0\xc4\xf8\xf3\x5c\x37\x5c\xa6\xc2\x6a\x5b\xc3\xf5\xc6\x27\xbe\x9f\xed\x6e\x43\x68\x00\xc4\x41\xf3\x80\xf3\xdf\x7d\x33\xc8\x42\x9d\xec\x9b\x8d\xd3\x7f\x94\x61\xad\xd3\x4e\x0e\x45\x11\x45\xa7\x5d\xf4\xb8\xaf\x64\xc2\x64\xa5\x47\xfe\x6c\x72\xc9\x9d\x82\x59\xf8\x9a\xda\x1b\x84\x07\x05\x71\xc8\xbe\xb9\xa4\xac\x21\x5e\x97\x5f\xde\xe9\x56\x97\x61\xa5\x83\x45\xd6\xe1\x0b\xa5\xcb\xfd\x07\x29\x77\x30\xf1\xcf\xa0\x24\xf1\xe1\xca\x07\x22\x22\x83\x38\x64\xdf\xac\xfb\xae\xd5\x20\xfa\xdc\x4d\x33\x9e\x16\xe1\xa5\xb9\xb4\x61\x34\xab\x63\x77\x0e\xdc\x73\xe3\x5a\xdc\xa2\xf4\x8d\x07\x9e\xa5\xe4\x88\xc8\x20\x2e\x40\x5a\x02\xf6\x34\xf4\x77\x2b\xde\x3e\xa9\x79\x76\xe7\x4b\x9e\x99\xa7\xd1\xae\xc6\x2f\x9c\x34\x7b\xa9\xbd\xf3\xfa\x83\xe4\xdb\xd6\x24\xe1\x7b\x4f\xed\x11\xbe\x19\xc4\xfd\xf7\xda\x8a\x3f\x7d\x73\x32\x9a\xe7\x81\x2a\x9a\xe8\x5b\xec\x73\xef\x15\x7d\xb0\xf3\x2d\x1e\x15\x08\x7f\xbb\x66\xea\xe7\x20\x9b\x5f\xdc\x7c\xc5\xb2\xe2\x1f\xb7\x81\x4a\xd8\xba\x49\x24\x2f\x7c\x60\x4a\xe5\x54\x55\x23\x5b\xe4\x51\x3e\x27\xa7\xe7\x8b\xbb\xef\x34\xf4\x95\xcd\x59\x28\x8e\xb9\xf3\xf8\x0f\xf4\x66\x28\x49\x92\x02\x87\x77\x2f\x6e\x46\xe1\xde\x93\x6b\x58\x8d\x16\xab\x57\xfb\x24\xbb\xb7\xd0\xd6\xaa\x37\x82\xaf\x7a\xec\x0d\xfe\xdb\x7c\x33\x68\x68\x7f\xf8\x66\x09\x24\xdf\x7c\x33\x53\x74\x33\xdd\x37\x66\x8d\x40\xd0\x51\x14\xb3\xa8\x25\x3c\xa8\xdb\x84\xe3\xfb\xc4\x8b\xc5\x9d\xbc\x25\x66\x6e\x8c\x44\xc5\xd3\xf0\xcd\xf5\x48\xbe\x39\xc2\xd1\xc7\xeb\x28\x78\x87\xff\x96\xff\xbd\xea\x64\xa3\xc0\x12\xa9\x0f\xdd\x4f\x6c\x6c\x45\xe7\xcc\x5f\x95\xc6\x50\xdc\x5a\x2a\x3b\x95\x0f\xbf\xc8\xbe\x99\x3a\x20\x8d\xf5\x95\xf7\x1a\xae\x93\x8d\x8a\x22\xdb\x0f\xa2\x7d\x9e\xe5\x40\xac\x5f\x65\xda\x3f\xa8\x2c\xdb\x6f\xca\xd8\x54\x5d\x3c\x95\x0f\xbf\xc8\xbe\xd9\xcf\x50\x40\x84\x2d\xe5\xc5\xf5\xe6\x36\x4e\x6c\x37\x94\xed\x76\x26\x01\x92\x83\x16\x3a\xad\x6c\x8b\x90\xf3\xc2\x5f\xb0\xda\xab\x4e\x65\xb4\xc8\xbe\xd9\x37\x2e\x1d\x65\x44\x39\xbb\x52\x5f\x1b\x37\x83\x34\xd7\x77\xad\xe4\x09\x2d\x5f\x10\xae\x20\x97\x33\xf6\xc1\xe0\x8e\x3a\xa5\xff\xa9\xf9\x66\x90\x86\x4e\x5a\x29\x7f\x7e\xb1\xe2\x3d\xc8\xa6\x20\x15\xf3\xc2\xe3\xd4\xbc\x93\x80\xda\x19\x4b\xd2\xf3\xb4\xee\xf5\x33\x37\x71\xf9\x2f\x94\xc2\x2c\x50\x2b\x17\x10\x07\x5f\x29\xc7\x94\x5a\xea\xea\x4c\x62\x51\xa4\x87\x0d\x33\xaa\xc8\x24\x9f\x79\x2e\x0d\x0b\x2d\xe9\x35\x8c\xa9\xa7\xa5\xb4\x77\xb5\x08\x43\xf7\x7d\x82\x38\xa4\xae\xbe\x0d\x2e\x01\xbe\x03\x63\x33\x41\xb4\x37\xf8\xc7\x79\x47\x5b\x52\xb4\x8a\xa5\xb0\xf9\xe9\x1c\x3b\x5c\x51\xbc\x5f\xe1\x7a\x42\xbb\x30\x10\x07\x5f\xd1\x5e\x5b\x4f\xad\x86\x14\x62\x89\xde\x39\xbb\xa6\xa8\xdc\xbd\x86\x62\x2e\x1c\xf5\xee\x25\x83\xf0\xf0\xc2\x33\xaa\x61\x0b\xac\x9d\x4f\x88\xb8\x20\x0e\x29\x2f\x61\x12\x8a\x61\xcc\x5f\x92\xa2\xcc\x4e\x32\x47\xfc\x6e\x37\x83\x91\xcd\x32\xc3\x08\x9f\xa1\x91\x27\xed\xf2\xb7\xdf\x75\xdf\xec\x11\xa6\x09\xc4\x41\x25\xeb\x7f\xf7\xcd\xa0\x17\xfa\x24\x09\xdc\xfb\x6c\x99\xad\x36\xd5\x31\xea\xd4\x46\x7e\x51\x62\xec\xdc\xe5\x4d\xf6\xef\xe9\x36\xd1\x4f\x04\xd9\x85\x63\x62\xdc\xfb\x64\x21\xdf\x0c\xe2\xe0\x12\xf8\x4c\x6b\xb6\x6f\xe7\x49\x24\xd6\x56\x10\x7d\x5f\x70\x90\xbf\xff\x3e\xb5\xc8\xb1\x46\x9b\xb2\x7a\x40\x55\x72\x09\x66\x36\xe7\x36\x22\x2e\x88\x83\x4b\x40\xcf\xa0\x3e\x9e\x75\x3e\x6f\x78\xd1\x27\xd5\x6d\xca\x8e\x7e\x59\xf5\xee\x07\x9a\x95\x1b\x73\x6b\x62\xdb\x0f\x22\x15\xe6\xf9\x97\x20\x73\x03\xe0\x90\x24\x80\x3b\xb5\x47\x62\xbc\x1a\x3b\x9b\xae\xa6\xcb\xc9\x85\xa1\x39\xf9\x50\x73\x25\xe6\xe1\xf0\x68\xaf\x0a\x86\x4e\xa8\x5c\xc5\x24\x24\x01\x00\x87\xd4\x89\xcb\x27\x6a\x4a\xd0\xca\xf9\xe9\xd3\xfc\x83\xe3\xf7\x57\x7b\x68\x7e\x5f\xd0\x6e\x7b\x75\x6e\xf4\xc2\x84\xe1\xf2\x2b\xbc\x5a\x2d\x5e\x84\x04\x40\x1c\x54\xb2\xfe\x77\xdf\x0c\x9a\x5c\x4f\xec\xef\xbe\x44\xce\x3a\x78\xb6\xa3\xce\x7a\x1e\xd3\xbd\x76\x7d\x3a\xab\x55\x40\x8f\x29\xec\x4c\x89\x87\xc2\xba\xa3\x3c\xd9\xd0\x8b\xb3\x50\x7f\x77\x00\x87\x74\xd9\x0b\x11\x23\xea\x99\x29\xb9\x06\x69\xd3\xda\x2b\x68\xae\xfe\x77\xbd\x03\x50\x45\xce\xea\xd3\x0a\x7c\x24\xd9\xac\x9f\x0c\xd3\xaa\x47\xc4\x05\x71\x70\x09\x3c\x0f\x6e\xb2\xa3\xac\x94\xfa\xd0\x75\xf9\x41\x0f\xa5\x97\x75\xa7\x98\x05\xdf\xe2\x72\xfd\xd5\xac\xd8\xc1\x30\x01\x3a\x2b\x26\xa8\x21\x06\x88\x83\x4b\x20\xef\xb2\x10\x75\x63\xb0\x76\x8c\xe4\xe0\xb0\xd9\x7c\x5d\xd7\xd7\x21\x63\x5b\xeb\x0e\x33\xc2\xda\xcd\x55\x35\xaa\x4b\xbd\xbd\xb9\xd0\x73\x00\x70\xf0\xe7\xcb\xf6\xb5\xee\x65\xb4\x1a\xc5\xbe\x7d\xc0\x4b\x8d\x33\x4e\xbe\x03\xea\xbb\x1a\x5a\x72\x39\x6a\x0c\xa6\xae\x5c\x6b\xef\xd9\xb2\xe8\xa0\x66\x61\x00\x0e\x2a\x55\x05\xf8\x66\xd0\x4a\x77\x92\x06\xc8\xf0\xc6\x94\x7b\x2d\x58\xac\xb3\xdf\xdc\x20\x4a\x20\x0d\x88\x62\x51\x52\x38\x16\xc2\xa3\xef\x29\x14\xcc\x9a\xae\x67\x50\xc5\x47\x8c\x1d\xc4\xc1\x35\xf0\x9a\x2e\x5e\x5c\x62\xfc\x61\x5a\xf6\x93\x4c\xa5\x2f\x33\xc3\x61\x0b\xe3\xc6\x19\xb7\x5e\xbe\x35\xaf\xbf\x47\xde\x5b\x96\x7f\x95\x05\x7a\xad\x00\x1c\x52\xd3\xc0\xdb\x94\x5d\xf8\xb8\x9b\xbb\x57\x39\x34\xcf\x53\xa4\xb2\x7b\x11\xf0\x18\xfa\xa7\xda\x2c\x3d\x8e\xfd\xd0\x2b\x73\xf9\x88\x1a\xd2\x00\x88\x83\x6b\x20\x45\x4b\x96\x88\x11\xff\x55\x1d\xe1\x83\xdb\x6f\x73\x54\xf5\x68\x59\x51\x63\x0b\x79\xa8\x2f\x7e\xb0\x55\x48\x40\x3f\x16\x66\x86\x9a\x97\x80\x38\xa4\x4b\x2f\xed\x4a\xb0\x2a\xb5\xb2\x06\x57\x69\x4b\x5f\xd0\xd4\xca\x5d\x40\xb5\x50\x15\x38\xaa\xb1\x08\x61\xee\x7d\x1a\xa2\x8b\x82\xee\x08\xdd\xf5\x01\xe0\xa0\x52\x55\x80\x6f\x06\x6d\x3b\x4e\xd2\xc0\x8f\x74\xb1\xa6\xe2\x73\x75\x15\x3f\x0d\x7d\xaf\x94\x07\xf1\xe1\xd3\x2d\x15\xd1\x9f\x55\xa5\xce\xd5\xf7\x5a\xc5\x7d\xe7\x1d\x04\x5d\x48\x09\xe2\xe0\x1a\x78\xfa\xe0\x4e\xf1\xe6\x1c\x6b\x62\xbe\xa0\xd0\xf1\xc8\x35\x8f\xa7\xe7\xdd\x34\x62\xc5\xf9\x8b\x54\x9e\xfc\x9c\x89\x23\xd5\xe2\x84\xa6\x6c\x10\x07\xd7\x80\x97\x59\x58\x0e\x9b\x29\x2d\x6a\xaa\x96\x2c\xd6\xca\xf5\xca\x9d\x47\x72\x62\xe8\xd6\x92\xa1\xd7\x36\x72\xab\xf2\xe6\xeb\x15\xde\x21\xe2\x82\x38\xb8\x06\xc8\x3f\xe7\x54\xa0\xbd\xb4\xc1\x57\xbe\x47\xde\xf4\x6b\x8e\x89\x98\x21\xe7\xf5\x95\xbb\xa4\xcc\xd8\x83\x58\xf9\x58\x29\x66\xf3\xd0\xed\xdf\x20\x0e\xfe\x7c\x87\x35\xde\x06\x7a\xed\x08\x07\x78\x3c\xf7\xb2\x59\xb7\x31\x43\x97\xb1\xb8\x6c\xb0\xd1\x2c\xea\xa3\x20\x51\xd0\x17\xc7\x86\x76\x05\xa1\x01\x10\x07\xcd\x03\x00\xdf\x0c\xb2\x50\x27\xfb\xe6\xdb\x64\x76\x69\x6e\x8a\xfe\x35\x42\x5f\x99\x9a\x3f\x66\xc6\x6b\x7d\x0d\x47\xc1\x55\xab\x10\x90\xfa\x5e\x33\xc6\x74\x36\xc0\x18\x1f\xe1\x41\x41\x1c\xb2\x6f\x1e\xfe\xb8\xd7\xaf\x5a\x56\x36\xfc\xc8\xf0\xe6\x3a\xcb\x76\x11\xae\xfd\xcc\x87\x46\x85\xe4\xa7\x2f\x1f\x7b\x07\x76\x33\x12\x87\xa8\x20\x22\x83\x38\x64\xdf\xdc\x1c\x69\x33\x53\x13\x5d\x47\xe5\xf1\xed\x50\x98\x9b\x0a\x5d\xea\x20\x6e\x3a\x18\xc5\x48\x40\x2c\xf8\x97\x1e\x8a\x9b\xa8\xeb\x2e\x22\x32\x88\x0b\x90\x46\x41\x85\xf9\xe6\x01\x9d\x4e\xfa\x77\xe1\x84\x69\xfb\x32\x0a\xe6\xfb\x61\xa6\xa9\x7a\xbe\x2e\x73\x66\x21\xd7\x97\x0d\x58\xa3\x4a\xed\xaf\xe2\x41\xbe\x19\xc0\xfd\xc7\x37\xfb\xfe\xe3\x9c\x36\xda\x9e\x47\xb9\x53\xfa\x56\x8f\x7e\xbf\xed\xf3\x39\x6d\xea\xac\xaa\x7b\x89\x04\xe7\x92\x8b\xa5\xbc\x2e\x70\xae\xc9\x27\x3c\x27\xfb\xc7\xf7\x43\x8e\x21\x22\x25\x85\xa5\xc6\x40\x85\x8b\x4b\x62\x9b\xe1\x67\x5e\x90\xee\xa7\xad\x4f\xa8\xa8\xca\xcb\x0f\x8e\x11\x50\xcd\xfd\x79\x56\xf6\xf7\x33\x46\x9f\xc9\x98\x84\x00\x76\xb7\xe6\x31\x3d\x49\x83\x17\x14\xa4\x3f\xc5\x84\x4d\x89\x1e\x56\xfe\x36\xea\x88\x2a\xed\x58\xfd\xb7\xf9\x66\xd0\xd0\xfe\xac\x6f\x46\xf2\xcd\xa8\xf1\xbf\x85\x6b\x3a\x8b\xce\x51\x50\x39\xbd\xc8\xd3\xfc\x9c\x2c\xd5\x53\xae\x11\xff\x2d\x35\xaf\x49\xdc\xfc\x15\xb5\x28\x8b\xc3\x69\xf8\x66\x14\x55\xf8\x5f\xed\x62\xc9\x7d\x96\xfd\xa9\x80\x2e\x57\x40\x8c\xac\x85\x87\x31\x2c\xe5\xa3\x8f\xd7\x75\xe1\x68\x23\xa2\x89\x4c\x82\xf3\x54\x81\xf7\x4e\xe5\xc3\x2f\xb2\x6f\xe6\xe6\x59\xca\xfb\x16\x48\xa8\x52\xd4\xe6\x51\x28\x7a\xdc\xeb\xc3\x5c\x6a\xe9\xbd\x46\x2d\x38\xfc\x9e\x17\xf5\xc8\xf9\xe9\x8f\xf2\x53\xf9\xf0\xab\x8d\xf4\x67\x3f\xea\xde\x5f\xd6\x9c\x3e\x98\x93\xa1\x2e\x48\xf7\x6e\x3e\x1b\x1c\x63\x34\x3b\x9c\x10\xa1\xdb\x31\x2c\x7f\xad\xaf\x50\x4a\x85\xe8\x54\x46\x8b\xec\x9b\x85\x4c\x73\x56\x5f\x1e\xb8\xc6\x7c\x3c\x10\xa6\x3a\x3b\x41\x43\x99\xc0\x4d\x4f\x77\xff\xd3\xcd\x73\xd5\x87\xaf\x27\xfd\x85\x97\x4f\xe1\x22\x85\xdb\xff\x9b\x86\x4e\x5a\x29\x5b\xd3\xa3\x6d\x13\xc7\xf8\xdd\xd6\x0d\xbe\x3d\x49\xdb\x22\x19\xe6\xab\x25\x2b\x64\x8c\xb9\x23\x8b\x7e\xc9\x43\x56\xdf\xf9\x05\x15\x62\x85\x00\x71\xf0\x95\xf2\x1b\x83\x84\xc9\xbe\xb7\xd4\x2b\x9d\xeb\xdf\x31\x0b\xae\x58\xd4\x0d\xcc\x06\x55\xb3\xaa\x5c\xba\x98\x25\x71\x0e\x3b\xa5\xae\xb6\x10\x3a\x45\x07\xe0\xe0\x2b\xa5\xc6\x43\x3f\x89\x84\x9f\xeb\xfe\x22\x13\xbe\x73\x9a\xba\x15\x6e\x35\x4c\xbc\x45\x1b\x67\x6f\x3b\x56\xd5\x10\x72\xb0\x15\x63\x36\x22\xe2\x82\x38\xf8\x4a\x59\x1b\x77\x91\x68\x46\xf3\x17\xda\x08\x57\x36\x5e\x15\xd3\xad\x9d\xb7\x6d\xc4\x82\xe9\x62\x14\x87\x1d\xfd\xbf\xe6\x83\xf4\x34\xa1\x8f\x98\x20\x2e\x40\x92\xee\x1f\xcf\xe1\xe2\x25\x9d\xd6\x1e\xde\x50\x66\xe6\x34\xbc\x45\xaf\x9d\x48\x1a\xf4\xdf\x52\xf5\xc3\xc7\xfe\x56\x0e\x13\x82\x76\xd5\x21\x8a\xca\x08\xd3\x04\xe2\xa0\xfa\xe6\xbf\xfb\x66\xd0\x0b\x7d\x92\x04\x94\x69\x83\xac\x55\x25\x9f\x5f\xce\x26\xee\x13\x11\xeb\x7f\xc4\x7f\x15\x8f\xeb\xb7\xdc\xa8\x9e\x1e\x75\xc6\xfa\x90\x70\x9b\x2b\x74\x71\x11\x88\x83\x4b\x60\xed\x41\x1b\x56\x8d\x6b\xf0\x27\xc2\x9a\xc9\xb7\xb4\x15\x5a\xcd\x26\x66\xe1\x15\xba\xfe\x5f\x08\x4b\x5c\x02\x7e\xdd\x59\x33\x81\xee\x45\x00\x71\x70\x09\xec\xcd\x0a\x7e\x0a\x32\x10\x58\xa0\xed\x7c\x30\x8e\x2d\xd4\xfd\x35\x5a\x41\x41\xc2\xa9\x39\x9e\xa4\x6b\x8f\x6d\xf6\x4e\xc4\x33\x37\x44\x5c\x10\x07\x97\x40\xf5\x8c\x74\x2d\xd1\xb4\x6f\xc2\xac\xfc\x27\x71\xcd\xc3\xb3\xb7\x37\xd1\x6b\x1d\x7c\xd1\xcf\x19\x7d\x44\x19\xad\xbb\x20\xea\x0b\x7d\x6f\x06\x71\x70\x09\x78\x09\xf2\x62\xa4\x86\xbf\xab\x9e\x4c\x68\x28\xba\xe4\xa8\xcd\xfe\xb4\xfc\x47\xca\xb8\x37\x4f\xd0\x48\x9f\xbd\x79\x6a\x4c\xa8\x0e\x42\x02\x20\x0e\xaa\x6f\x56\xfd\xab\x04\x40\x93\xeb\x49\x12\x18\xb8\x7a\xa9\x32\x67\xfe\xfc\xbe\x24\x87\x8e\x49\xd4\x65\x25\x99\x87\xa6\xbe\x52\x11\xba\x89\x8a\xe1\x63\x0f\x13\xed\xbf\x3a\x93\x22\x86\x0e\xe2\xe0\x12\x10\xec\x99\x3d\xe2\x5f\x95\xc2\xdd\xb9\xa6\x2a\xf4\xca\xa5\xf3\xe9\x6f\x26\xdb\xfd\x7c\xba\xb2\x65\x5d\x74\x9c\xe2\xcf\xaf\x99\xa1\x7a\x61\x10\x07\x97\x00\x67\x76\xcb\xd8\xf5\xa7\x9e\x4f\xbb\x3e\x92\x30\x8a\x63\x96\xa4\x8e\x2f\x9d\x1f\x59\x31\x7f\x7a\x5d\x2e\xee\xed\x4d\x3c\xe9\x29\xa8\x5a\x03\xc4\xc1\x25\x90\x66\x73\xb9\x31\x39\x91\x3e\x61\xec\x7c\x41\x2c\x8f\x94\x8d\xcd\xfc\x58\x4f\x1b\x99\x06\x5e\xd1\xae\xf2\xa2\x53\x84\xc3\x10\x94\x42\x02\x71\x70\x09\x70\xd0\x49\x11\x1d\x7c\x5a\x39\x67\x4d\xef\x49\xca\x6d\xcd\x37\x1e\xd1\x2c\xcf\xa6\xca\xd2\x49\x79\x7d\xef\x51\x23\x55\x60\x02\xd4\x60\x19\xc4\x41\x75\x8d\x00\xdf\x0c\x5a\xe9\x4e\xd2\xc0\x2f\x8b\xc7\x9d\xf2\xe1\xcd\x81\xd5\x12\xfd\x39\x89\xa8\xb4\x52\x55\x01\x96\xa8\x4e\x57\x93\xe7\x68\xce\x68\x6e\x5c\xa3\x7b\x6b\x8f\x18\x3b\x88\x83\x6b\x60\xda\x79\x45\xe1\x25\xb1\xc4\xd6\x11\x56\x1e\x57\xc3\x6b\x7d\x4b\x35\xf6\x64\x5c\x32\x49\x86\x9a\x2f\x58\xf7\xf6\x55\x4c\x9b\xdb\x10\x71\x41\x1c\x52\xc5\x4e\xc9\x10\x8e\xe5\x97\xda\xd5\x8a\x57\xac\xf7\x5f\xd4\xee\x88\x4e\x08\x04\xe2\x3e\xd9\xd8\x4c\x32\xa9\xa0\x6c\x95\x96\x79\x0f\xdd\x65\x09\xe2\xe0\x1a\x40\x1f\x60\xad\x6b\x7c\xfa\xa1\x8f\xee\x40\xa2\xa2\x7c\xa7\x35\xf2\xfc\xf3\x66\xd3\xc5\x38\x81\xdd\x32\xf1\xfd\x31\x96\xa0\x79\xe8\x98\x0c\x88\x83\x6b\xa0\xc1\x83\x38\x39\x1c\xb5\x3f\xeb\x49\x83\xb6\xee\x1d\xc1\x72\x6c\x8f\xc4\x6c\x1b\x8f\x59\x96\x6d\x4e\x02\x76\xaa\x3e\xb5\xfe\x48\x84\x06\x40\x1c\x54\xdf\xac\xfd\x77\x0d\x80\xb6\x1d\x27\x69\x80\xd5\xf4\xe2\x1d\x09\xb2\x26\xdb\x1c\xba\x0d\x9f\x1c\x72\xa5\x0e\xe1\xc3\x26\xf5\x10\xc1\x41\x83\x95\x63\xec\xfd\xd4\xda\x05\x25\xc4\xd8\x41\x1c\x5c\x03\x2a\x82\xe3\x25\x8f\xe9\x9f\x11\x33\x48\xb5\x34\x85\xb3\x1b\xa7\xbb\x66\x60\xab\xe6\xc5\xbc\x11\x90\x94\x44\xb9\x59\xe8\x7a\x1b\x3a\xd5\x06\xe2\x90\xee\x5d\xf1\x2e\x30\x7c\x11\x8d\xa1\x97\xc7\xce\x45\x72\x55\x6b\x4b\x85\xbd\xb1\x45\x2a\x24\x2a\xe5\x4b\xea\xeb\x86\x8a\x22\xd9\x56\x46\xa8\x85\x06\x80\x83\x6b\xc0\x8d\x26\xe8\xed\xe4\xed\x80\x59\x91\x54\x75\xe1\x5a\xe1\x5f\x3e\x75\xdd\x0b\x69\x37\x3f\xf2\xf2\x15\xd2\xa6\x3a\x6f\xec\xb2\x42\xbe\x19\xc4\xc1\x35\x40\x3f\x9c\xfb\xcc\xda\x65\x7d\xd7\x13\x57\xa3\x9f\xcc\x55\xf9\xbd\xfd\xed\x9b\x9a\xc1\xbb\xb7\x0a\x1f\x65\xdd\x3b\x73\x24\xe4\x77\x15\xa1\x01\x10\x07\xcd\x03\x00\xdf\x0c\xb2\x50\x27\xfb\xe6\x36\x34\xea\x5e\xad\x77\x0c\x6d\x87\x41\x72\x51\x6d\x47\xa4\xfc\x54\x9d\x76\x51\xda\xd9\x4b\xe1\x0e\xfd\x24\x39\x45\x9c\x7c\x9f\x11\x1e\x14\xc4\x21\xfb\xe6\xbe\x06\xf1\x14\x56\xd6\xbc\x43\xc3\xa3\x24\xb5\x09\x89\xc5\x66\x35\xa1\x35\x95\xcd\xdc\x4f\x02\x9d\xc6\xc1\xfc\xe2\x21\x09\x64\x88\xc8\x20\x0e\xd9\x37\x4f\x39\x32\x1a\xf7\xf1\xe6\xe6\x5b\x31\x69\xe7\x4b\xa0\xca\xbb\x3e\xb1\x59\x22\x89\xff\xa2\x51\xc4\x28\xce\x45\xfb\x2b\xd8\x05\x13\x11\x19\xc4\x21\xb7\x70\xb7\xf1\xa2\x1f\x62\xa9\xdd\x15\x7b\x1c\xd7\x46\x71\xef\xbe\xd2\xd4\xb3\x6e\xae\xce\x31\x49\x7f\xd4\x01\xaa\x34\x7f\x36\xc2\x51\x19\x84\x6f\x06\x71\xff\xf1\xcd\x38\xff\xf0\xcd\xae\xf3\xa6\xdf\xc7\x22\xe6\x2f\x57\x6b\x4b\xa6\xd0\x50\xf4\x1a\x12\xbe\x31\xc6\x7f\x21\x7e\x3e\xbf\x0c\xfb\x8b\x48\x60\xec\x97\xea\x3f\x7d\xf3\x07\xdb\xce\xfc\x0d\x4f\x7e\xc7\x5f\x73\x14\x56\x34\x9f\xb9\x9b\x6f\x7a\xb5\x53\xa4\x17\x9a\x7f\x6d\xda\x3a\x8b\xd1\xc3\x46\xa9\xf1\xe7\xd6\xdb\xe7\x5d\xa0\xd1\x8b\x5b\x73\xcf\x39\x04\x0a\x6b\xbd\x96\x9f\xb3\xaf\xf3\xa6\x88\x2e\xda\x3e\x2c\xe7\x8e\xc7\x44\x6f\xfd\x81\xf6\x6f\xf3\xcd\xa0\xa1\xfd\x59\xdf\x8c\xe4\x9b\x73\xf9\x76\xbe\xbc\xde\x6d\x3e\xdf\x8a\x47\x11\x50\xff\x40\x5e\x09\x73\xeb\x1b\xbf\xdf\xcf\x52\x14\x77\xe5\xd6\x8f\x97\xbb\xee\x88\x9c\x86\x6f\x96\x40\xf2\xcd\xd8\xc3\x14\x74\x2a\xe4\x37\x14\x88\x08\x5f\x3f\xea\x3b\xa0\x9e\x79\x71\xb0\x3a\xbb\xfd\x71\xe0\xab\x84\x24\xaa\x02\xde\xb2\x3b\xd3\xa9\x7c\xf8\x45\xf6\xcd\x04\xeb\xee\xdd\x7a\xec\x62\x92\x69\x3d\xd7\x15\xec\xfb\x6f\xbc\x73\xc5\x4c\x6b\x9f\xe1\x1f\x6e\x17\x74\xee\xfd\xae\xcd\xae\x27\x73\x2a\x1f\x7e\x91\x7d\xb3\x24\xcf\x20\x27\x3b\x8e\x76\x3b\x0f\xa1\xdb\xba\x3a\xdb\x2f\x94\x9c\x99\xb8\x89\x7b\xb8\x6d\x0d\x8d\x6a\xb4\xb7\x29\x4b\x8c\xb9\x4f\x65\xb4\xc8\xbe\xf9\x88\xef\x95\x11\x3a\x17\xe6\xab\x07\x22\x02\x2b\xae\x5f\x98\x45\xe5\xd2\x34\x1e\x12\xfc\x88\x6b\x09\xd5\x67\xd2\x7f\xa2\xb5\xc6\x71\x6a\xbe\x19\xa4\xa1\x93\x56\xca\xd1\x48\x13\xb5\x10\x19\xd9\x73\x13\x17\x12\x1b\xe7\x2e\xac\xf4\xf1\xb0\x09\x76\xe8\x39\x5b\xa0\xcd\x77\xaf\x50\x6d\xdd\x18\x86\xae\xe2\x00\x71\x48\x1d\x81\x2c\x69\x05\x26\xa3\x9f\xf2\x33\x2c\x1a\x2f\x36\x1b\x09\xd0\xe5\x7d\x4a\xdf\x25\xd5\xfb\x15\xdf\x11\x63\xa7\x63\xb0\x30\xc3\x09\x75\xee\x01\x70\xf0\x95\x72\xe0\x02\xd5\x33\xb3\x75\xf5\xef\xbd\x4c\xfa\x36\xdf\x5f\xc7\xbb\xc8\x87\xad\xdd\xa5\xda\x74\x2f\xf0\xca\x69\xde\xfe\x8d\xa9\x6d\x06\xed\xf0\x01\x1c\x7c\xa5\xfc\xc6\x34\xf8\xd3\x6b\x7c\xaa\xec\xd3\x20\xce\x83\x12\xf3\x67\xd9\x09\xd5\x1a\xb4\xb2\x18\xde\x9c\x89\x7c\x98\x78\xc2\xd7\x53\x9f\x40\x3e\x1f\xc0\x05\x48\xa2\xa0\xfe\x19\xb7\x63\x92\x45\x85\x4e\x7f\xc9\xc5\xf7\x71\xae\x7f\xc3\x30\xdb\x40\xe4\x53\x2e\x4f\x65\x5c\x27\x1d\x21\xb5\xc1\x60\x22\x37\x3b\x14\x84\x69\x02\x71\x50\x7d\xf3\xdf\x7d\x33\xe8\x85\x3e\x49\x02\x1f\x2a\xc3\x06\x08\x15\x39\x0e\xe4\x7f\x72\x86\x5e\xf3\xe8\x5b\xf7\x22\x4d\x9a\x21\x53\x0b\xe0\x22\x78\xa3\xfb\xe9\xb1\xe4\x75\xa8\x45\x3a\x88\x83\x4b\x80\xd1\x9e\x58\xd7\x72\x96\x23\xdb\x2b\xbe\x3a\xf9\xbd\x9d\x88\x83\x6b\x49\x38\x49\x54\xef\x10\x9e\xf9\x4d\x4d\xe7\x5f\x9c\x9e\x87\x88\xb8\x20\x0e\x2e\x81\x49\x1f\xbe\xdf\xbc\x0f\xdd\x7d\xf8\xf2\xd9\x4b\x37\x51\x0b\x22\x8b\xd9\xe6\x0f\x5d\x87\xb2\xcb\x33\xcd\x4a\xce\x1b\x70\xb6\xe9\x22\xe2\x82\x38\xb8\x04\x1e\xac\xf3\x6b\x27\x65\xba\x10\x7e\xf4\x32\x33\x8c\xfb\x4c\x28\x62\x50\xe1\x38\x27\xd7\xfa\xf3\x61\xbb\xe6\xef\xef\xc4\xb6\x1e\x01\x88\xb8\x20\x0e\x2e\x81\x2f\xea\x6f\x83\x2c\x0b\x2b\x0d\x5b\xdf\x4e\x7f\x20\x77\x3a\xa0\xbf\x5f\x14\x62\xdd\xa3\x52\xb1\xfd\x69\x64\xc2\xb8\x96\xa7\xc0\x15\x21\x01\x10\x07\xd5\x37\xff\xdd\x37\x83\x26\xd7\x13\xbb\x03\xca\x63\xbe\xdc\xba\x4d\xec\x15\x5d\xe9\x17\x26\xf0\xfd\x91\x5e\x8e\x86\xc2\x8c\xfd\x37\x89\xec\xbd\x2b\xb1\xbf\xfd\x5f\xb8\x41\xad\xc1\x41\x1c\x5c\x02\x1b\x6e\x94\xa4\xa9\x3e\x6b\x02\xa1\xce\xe6\xbb\x1d\x93\x8c\x63\xc2\x1e\xcc\x5d\xa3\x53\xaf\x92\x75\x8a\xed\xb4\x0d\x15\x56\xba\x11\x71\x41\x1c\x5c\x02\xf8\xb9\xfd\x95\xcf\xe9\x14\xb9\x6f\x53\xca\xba\x8d\xe4\xaf\xa3\x2c\x3c\x54\x25\x15\x11\x94\xb0\x90\x7f\xe2\x11\x5e\x5d\x92\xf5\x01\x11\x17\xc4\xc1\x25\x20\x68\x7d\xb5\xb6\x0f\xcf\x56\x79\xd5\x67\xc6\x95\xc5\xf8\x7c\x92\x4b\xc6\x67\x7f\x2e\xb1\xc5\x5a\xbe\x7d\x06\xc5\x97\x2c\xd9\xa9\x90\xcf\x07\x70\x70\x09\x4c\x32\xc8\x9d\x9d\xbb\x81\x6b\x81\x32\xd6\x1a\x1b\xfd\xb3\x7c\x5d\x20\xb4\xdd\x53\x4e\x46\x55\xf8\x98\x87\x49\x84\xbe\xa9\xbf\x1a\xb1\x5f\x06\x71\x50\x5d\x23\xc0\x37\x83\x56\xba\x93\x34\xb0\x99\xac\x3c\x79\x6b\x44\xe6\xe1\xd0\x15\xcd\x44\x9d\xaa\x7b\xad\x37\xbd\x5f\x27\xde\xf1\xf8\xea\x7f\x4d\xcb\x98\x7c\xea\xeb\x02\x05\x62\xec\x20\x0e\xae\x01\x0f\x8c\x06\xfe\x1b\x37\x52\x0a\xfd\x0d\x74\x08\x3e\x46\x56\xfc\x9a\xd9\x2d\x46\xb1\xa2\xc1\xa1\xdf\x25\xe3\x43\x21\x41\x19\x85\xce\x53\x83\x38\xb8\x06\x3e\x72\xe2\x39\x61\xb3\xfb\x96\xc4\xbe\x74\x48\x29\xaf\xf0\x0b\x97\xca\xcf\xdf\x56\x42\x9d\x6b\xea\x27\xb0\x33\x63\x20\x0f\xff\x8d\x88\x0b\xe2\x90\xa6\x81\x6c\xd4\x3c\xfb\xec\xe3\x26\x9f\xed\x30\x89\x37\x19\x01\x86\x49\x47\x75\x3c\x91\x66\x14\x47\x61\x67\xa3\xec\x79\x93\xb7\x2f\x41\xd3\x00\x80\x83\x6b\xa0\x7b\x86\x32\x92\xfd\x03\x1f\x2f\x5b\x5d\x07\x6a\x41\x88\xc1\xf7\xd4\x5f\x61\x3a\xf8\x9e\x55\x19\xbd\xd8\x55\x52\x56\x69\x5b\xd0\x9d\xf2\x20\x0e\xaa\x6f\x06\xf8\x66\xd0\xb6\xe3\x24\x0d\x44\x2f\x89\x51\x0c\x75\x49\xd6\x2d\x38\x4d\x44\x04\xb8\x32\xa2\xa0\xb6\x79\xa0\xd0\x16\xb0\x8b\x06\x91\xcc\x95\xba\xcd\x6e\x0c\x41\x55\x50\x00\x0e\xae\x01\xaf\x47\x41\xe2\xd5\xc9\x96\x7e\xde\x34\xcf\x9f\xab\xc5\xbe\xc7\x24\x1f\x0a\x2d\xc2\x95\x36\x6c\xde\xa3\x9e\x6a\xd1\x93\x45\xe5\x81\xbe\x0b\x03\x38\xb8\x06\x0a\xe7\xc2\x39\xb6\xfc\xda\x5e\x7a\x14\xba\x7d\x66\x6d\x55\x8c\xdf\xab\xef\xff\xcd\x6b\x22\xe6\xb2\xc6\x17\xbf\x7d\x21\x14\x13\xca\x73\x81\x38\xb8\x06\x62\xf7\x84\x77\x9b\x28\x3d\x55\x0f\x8c\x3f\xaa\x57\x51\x48\x3d\xa1\xe0\xab\x99\x73\x92\x10\x26\x91\x8e\xed\x75\xbd\x87\x8f\xbd\x82\x88\x0b\xe2\xe0\x1a\xa0\xd6\x30\xc5\x3f\xf0\xe8\x74\xe7\xb4\x37\x93\xd6\xb0\xbb\x31\x83\x21\x93\xa4\x4b\xad\xb7\x70\x9f\x9c\xec\x35\xf9\xdb\xe2\x25\xa8\x4d\x3e\x88\x83\xe6\x01\x80\x6f\x06\x59\xa8\x93\x7d\x33\x7e\x09\xbd\x5f\x9c\xda\x41\x0c\xd6\xf2\x67\x8e\x84\xb4\x34\xf5\x3b\x21\xcb\x2c\xc5\xc3\x6d\x25\x68\x2a\xa1\xcb\x2a\x6f\x56\xa0\x33\xcf\x20\x0e\xd9\x37\x8f\x94\x05\x12\x37\xf7\xd5\xd5\xbf\x73\xa4\x13\xbd\x55\x62\xe3\x24\x56\x12\x73\xf3\xdb\xe2\xd4\xb9\xee\xc2\xd0\x4e\x81\x31\x6c\xa8\x2f\x18\x88\x43\xf6\xcd\x15\x1d\x6b\x02\xef\x49\x03\xc3\x7e\xfb\x64\xbe\x7b\x1f\x48\x24\xbd\x37\x4e\x8a\xf1\x6c\x04\x8b\x36\xe4\x12\x55\xa1\x08\xc7\x34\x54\x39\x0d\xe2\x02\xa4\x51\x08\xff\x19\x39\x97\xb4\xf5\x4a\xdf\x55\x6e\xfd\x00\xec\x6b\x04\xb2\xd5\x6a\x0e\x99\x9d\x98\xf7\xb0\xec\xfa\x64\x5b\xd4\x7a\x8d\x25\x8a\x74\x75\x10\xbe\x19\xc4\x41\x77\xca\x43\xbe\x79\x82\x40\xb0\x5c\xdf\x8b\x2a\x83\xd8\x8f\x68\x67\x39\x92\x60\x21\x7b\x43\xf9\x65\x80\x5f\x31\x9b\x7b\x76\xf8\x9b\xba\xe6\xb0\x6b\x7f\xfa\xe6\x73\x9c\xd5\x13\xc7\x81\x69\x79\x81\xc2\xc6\x15\xab\x59\x8f\xbd\x9f\xe7\x16\x74\xf6\x29\x1b\x75\x6d\x4d\x93\x9b\x2b\x5c\xab\x27\xf9\x73\xb1\xc1\x4c\x90\xa0\xf7\x57\xa4\xaf\xb9\xb8\x3c\xfb\xf8\xf0\x65\xac\x58\x8c\x71\x13\xdb\x0a\xe3\xf9\x95\xc5\xda\x45\x93\x7d\x75\x91\x7f\x9b\x6f\x06\x0d\xed\xcf\xfa\x66\x69\xb8\xb9\xea\xd4\xca\x76\x4d\xa1\xfd\x8e\x3d\x9b\xbe\x3d\xc5\xe9\x28\xd1\xd5\xdb\x60\x90\x40\xde\x54\x3f\x1d\xb0\xdc\x7e\x65\xfd\x77\x97\xd7\x69\xf8\x66\x5f\x24\xdf\xbc\xca\x48\x3d\xba\x9e\x25\x11\xc1\x82\xfb\xf4\xc7\xb3\x1d\xa1\x8d\x4d\xf5\x1e\xb1\x6f\xb3\x16\xdf\xa3\x3b\x4a\x0a\xb4\xa8\xa6\x0a\x4f\xe5\xc3\xaf\x30\xf2\x87\x5f\x65\x63\x7e\x1c\x6b\xed\x4c\x94\x47\x6e\x35\x39\x43\x65\xd3\x3b\xab\x13\x7d\x41\xb6\x83\x42\xf2\x0f\xe2\x9a\x4c\x9b\x1a\x4f\xa3\x79\xb8\xb4\x2f\xb2\x6f\xee\x54\xe0\x7e\xd2\xdb\xb9\xe5\xad\x13\xd4\xcb\x20\xc2\xf0\x6b\xa0\xec\x62\x97\xbc\x5c\xae\x69\xf9\x03\x2e\x0e\xe7\xf8\xeb\x4d\x09\xa7\x32\x5a\x17\xa4\x3f\xdb\x43\x25\x42\x3d\xa4\x56\x27\x95\xc9\x31\xf2\xe4\x97\x9e\xe3\x0a\xbe\x0c\x41\x84\x9e\xcc\x6a\x16\x95\x8e\xa8\x45\x67\x9b\x93\xef\xa9\xf9\x66\x90\x86\x4e\x5a\x29\x79\x94\x45\xc4\x3e\x8c\x14\xc9\xf1\xf7\x7c\x16\x62\x5b\x12\xb8\x95\x2b\xd2\x7b\x8c\x73\xe9\xe5\x05\xd5\x3b\x12\x8c\xa5\x5a\xad\x90\x09\x01\x71\xf0\x95\x72\xd8\xf3\x7d\x91\x6e\xa3\x4b\xd2\x4d\xec\x0a\xa3\x98\x46\x82\x88\x9c\x3b\xcd\xf2\xce\x76\xb2\xf5\x45\xa9\xde\xab\x2c\x57\x5e\x3b\x20\xe2\x82\x38\xf8\x4a\x29\x24\x54\xba\xd8\x18\xba\x25\x19\xd1\x28\x53\xfa\xfb\xa2\x73\x4a\xaf\x93\xb0\xf3\x55\xb5\xf1\xb3\x64\x1a\x71\xbc\x5f\x02\xfe\xef\xe4\x27\x88\x83\xaf\x94\xaa\x7c\x81\x6d\xd2\xab\x16\x6f\x1d\x14\xe6\xd4\x07\x74\x0d\x29\xaf\x85\x52\xae\x05\xcd\x6e\x26\xbc\xdf\x7c\xc2\x1b\x1e\xdc\x07\x75\x44\x01\x71\xf0\x4a\xa9\xed\x1e\xbb\xb8\x4c\xe2\x84\x44\x4b\x72\x9a\x14\x39\xad\xa8\xba\x5d\x16\x85\xa9\xd4\xcb\xac\x3f\x5e\xf7\x8e\xa6\xea\xc7\x7b\x60\x21\x4c\x13\x88\x83\xea\x9b\xa5\xff\xba\x59\x02\xbd\xd0\x27\x49\xa0\xab\x7b\xf4\x45\xd3\xa8\xe0\xf9\xaf\x86\xd6\xe3\x83\xf9\x04\x11\xf9\x7d\x6c\x34\x59\xcc\x87\x92\xd7\xb4\x6a\x1c\x62\x24\x14\x2b\x11\x43\x07\x71\x70\x09\x30\xbd\x4a\x71\x59\x51\x17\x41\x7d\xbf\xf4\xd1\x1d\xb7\x7b\xf7\xed\x4d\x0c\xe2\x21\xa6\xe6\xaf\xf2\x4d\xf6\x96\xb9\xf3\xd7\x19\xa1\xbb\x44\x40\x1c\x5c\x02\x05\xc6\x76\x12\xbc\xb8\xc2\xd7\x33\x32\x64\x39\x52\x6f\x10\x62\xa8\x2b\x0c\xd6\xe8\x99\x79\xb8\x3e\x7c\x51\x64\xe5\x73\x6e\x22\x1b\x11\x17\xc4\xc1\x25\xa0\xa1\xae\x43\xcd\x1d\xb9\x81\x42\xbf\x94\x12\x7f\xa7\x95\xa8\x0f\xab\x7b\xdd\x95\x87\x82\xb0\x32\x01\x77\xce\x93\xc9\x10\x05\xba\xa7\x06\xc4\xc1\x25\x10\x91\xa3\x49\xce\xef\x88\xc3\x81\xee\xa2\x92\xbe\x38\x7b\xad\x53\xc3\x9b\xf2\x61\xcb\x9b\xfb\xe2\x62\xf6\x0e\x7b\x9f\xbe\xc9\x34\x23\x24\x00\xe2\xa0\xfa\xe6\xbf\xfb\x66\xd0\xe4\x7a\x92\x04\x6e\xbf\x5f\xfc\xa2\xb7\xd3\xb7\x99\xb5\x13\x56\x7d\x70\xcd\x3a\xec\xbe\xb2\x66\x9f\x02\xfd\x55\x37\xf3\x3c\x73\xcd\x12\x83\xeb\x50\x17\x3f\x10\x07\x97\x00\x7e\xcd\x3c\xbb\x98\xe9\xc5\x45\x69\x54\x85\x8e\x7c\x94\x0c\x6e\x0a\x72\x73\x33\x8e\xee\xe2\xf7\x43\xaf\xa7\xbb\x9d\xb1\x7b\xc5\x20\x7f\x0b\xe0\xe0\x12\xf8\xf9\x56\x56\x5a\xad\xfe\xdc\x82\x89\x93\xf0\x74\xd8\xc0\x2c\xc9\x06\x9a\x6c\xc0\xb7\xdc\x76\x1c\x0e\x22\xd5\x34\x9c\x70\x16\xe8\x76\x39\x10\x07\x97\x40\xbe\xc8\x8f\x68\x6f\x5a\x33\x53\xd3\x48\x6f\xa3\x34\x57\xb3\x95\x67\x59\xb8\x6f\x85\xb0\x08\x68\x6a\x34\xb5\xf7\x43\x5c\xa2\xf9\x11\x71\x41\x1c\x5c\x02\xf7\xbd\xc2\x1c\xa2\x19\x5b\xc7\x19\x83\x88\x1d\x57\xf2\x7a\x12\x23\xc6\x3f\xb0\x19\x62\x16\x71\xb4\x3d\x2e\xb8\x71\x11\x4d\x5b\x1c\xb1\x5f\x06\x71\x50\x5d\xa3\xf0\xdf\x3d\x13\x68\xa5\x3b\x49\x03\x22\x7c\x1b\x68\x58\x01\x79\xca\x75\x6d\xe4\x99\x0f\x5d\x6a\xd9\x05\x9e\xb3\x3a\x1d\x4d\xac\x5c\x7d\xbb\x64\x76\xa9\x7c\xed\x05\xd4\x0f\x0b\xc4\xc1\x35\xb0\x7d\x75\xe5\xb3\xf1\xed\xc3\x8b\xdc\xe8\x71\x9f\x31\xf6\x7b\x12\x0d\xf8\x45\x27\x2d\x6d\x2b\xbb\x96\xfc\x5e\x93\xe2\x10\x61\x5d\x43\xc4\x05\x71\x70\x0d\x30\x06\xf0\xe8\xfb\x8f\x13\xcc\xe4\xbe\x31\xc0\x34\xa9\x5e\xcc\x11\x93\xa0\xbd\xd3\x77\x14\x87\x3e\xc2\xb8\xbf\xf1\xee\x83\x22\x74\xf6\x17\xc4\xc1\x35\xf0\x5c\xee\x0b\xf7\x8b\x5e\xcb\x2f\xe2\x52\x13\x97\xf1\x95\xa3\x27\xfb\x9f\x8b\x7e\xc2\x8f\x1f\x1c\x3c\x5c\xad\xb1\xf2\xb0\x40\xc3\x81\x6a\x00\x00\x1c\x5c\x03\xe2\xfd\xaa\x17\x4d\x77\xba\x13\xd5\x2a\x18\x32\xde\x47\xd2\x1a\x1f\x75\x06\x6f\x1f\xa8\x2d\x3e\x9a\x50\x32\xc2\xfe\x7c\x9b\xd6\x0a\xa1\x01\x10\x07\xd5\x37\x03\x7c\x33\x68\xdb\x71\x92\x06\x6c\xca\x26\x15\xf9\x9c\xd5\x1f\x33\xe3\xfc\x2a\x8d\xab\xa1\x7f\x96\x67\xac\xe6\x55\x7c\x55\x3d\x76\x7b\xc7\xe2\x6c\xfe\xda\xe3\x3b\x88\xb1\x83\x38\xb8\x06\x4a\x7e\xa6\xfd\x50\x10\xbc\x81\x86\xd7\x6f\x27\x9e\xfd\xf9\x8a\x08\xd6\x4f\xfc\xb8\x55\xbe\x9a\x5e\x56\x6d\x21\xf9\x17\xa5\xb1\x57\xa1\x9a\x71\x00\x87\x74\xbd\xdc\x55\x5a\x75\xa1\x83\x17\x5d\x5a\x0b\x4c\x46\xce\xbe\x4c\x2c\xfd\xc5\x79\x7e\xc2\x4f\xb2\x44\xfd\x28\x9b\xd0\xce\x79\xee\x43\xef\x2b\x88\x43\xaa\x45\xff\xad\x52\xd7\x2e\xbd\x9a\x52\x8a\x59\xec\xca\x2a\x1d\xe6\x37\x9a\xce\x13\xf8\x72\x6a\x46\x3a\x47\x90\x90\x25\x2d\x3c\x69\x17\x11\x17\xc4\xc1\x35\xd0\xe6\x34\x17\x93\xa3\xea\xca\x23\x55\x46\xf6\xe2\x32\xcd\xfe\x87\xec\x97\x59\xe5\x2c\x84\xa6\x0a\x5a\xcd\xfe\xe6\x82\x77\x03\x50\x11\x1a\x00\x71\xd0\x3c\xe0\xf2\x77\xdf\x0c\xb2\x50\x27\xfb\xe6\xaf\x8f\xad\x27\x93\xa3\xee\x24\xe0\xeb\x85\x61\xb2\x0e\x57\xf3\xed\xa0\x73\x51\xb7\x2b\x2e\x4c\xc8\x93\x53\xa9\x5e\xff\xfd\x26\x14\xe1\x41\x41\x1c\xb2\x6f\xbe\xdc\xb9\xf9\xf1\x4d\x19\x07\x99\x8c\x8b\x55\x3b\x13\x51\xbf\x76\xa4\xac\x88\xe6\xf0\xf3\x30\xb9\x4b\x38\x3d\x86\x8f\x43\xde\xb4\x21\x22\x83\x38\x64\xdf\x1c\x30\x77\x10\xc7\xf8\xfa\x5b\x32\xb3\xf4\x88\x2e\x9a\xc1\xf7\x0c\x3b\x49\xbc\xbb\x76\x34\xed\xfb\x7c\x39\x29\x17\x7b\x71\xd6\x7c\x10\x91\x41\x5c\x80\xf4\x7f\x9e\xe4\x9f\x91\xe7\x1d\x50\x48\x8e\xe3\x59\x95\x30\xa8\x27\x55\x77\xfc\xd9\x6d\x9e\xc7\x6d\x35\x73\x1c\xdd\x55\x63\x4e\x25\xfd\x76\xb3\xb2\x82\x01\xe1\x9b\x41\xdc\x7f\x7f\xf3\x9f\xbe\x19\xe3\xaa\x63\xa2\x6e\xf6\xab\x00\x75\x7a\x02\x95\x37\x6a\x8b\x2e\x42\x14\x89\x32\x55\x95\xf1\xf7\x3a\x3f\x8f\xdf\xd8\xeb\xf6\xfa\xf8\xa7\x6f\x16\x56\xb8\x34\x32\x4c\x32\xb2\x26\x74\x39\x7d\xf7\xd8\x54\x3e\xc3\xac\x8a\x87\xe7\xed\xe5\x08\xb4\x51\xcf\x34\x4e\x62\xa5\x81\x8a\x3f\x2d\xf6\xd5\x14\x17\xb5\xc8\xd7\x39\xed\xd4\x07\x86\xab\xf6\x2e\xaf\x46\xfd\x67\x9c\x5f\x27\x47\xe0\x4b\xde\x78\x4f\x16\x10\xe9\x31\xfa\x6f\xf3\xcd\xa0\xa1\xfd\x59\xdf\x8c\xe4\x9b\x3f\x28\xf6\xd6\x05\x47\x9e\x49\x88\x3e\x7f\xab\x84\xa7\x70\x74\x95\x3f\xa1\xe3\xa7\xad\x79\x14\xe5\x57\x57\x0d\xb6\x08\x6b\x53\xbc\xd3\xf0\xcd\xf5\x48\xbe\xb9\xe4\x81\x2a\x5f\xe6\x82\x71\x80\xa7\x01\xae\x81\x59\xdf\xd5\x51\x93\xea\x7b\x4a\x76\x82\xa9\x46\xc1\x58\xbe\xca\x95\xac\x3c\x31\xa7\xf2\xe1\x17\xd9\x37\x7f\x5d\xe7\x44\x7b\xe8\x11\x59\xbb\x15\x30\x19\xc1\x5c\xf2\x95\xdc\xfd\x36\x5f\x75\x8c\x6e\xf9\xec\x6d\x1c\xc7\x23\x15\x76\x9a\x8a\x53\xf9\xf0\x8b\xec\x9b\x93\x57\x71\x79\x36\x86\x79\x2b\x56\xa4\x9f\x68\xce\x6f\xf6\x54\xa8\x8c\xcd\x47\x3e\xd1\xda\xe8\x2b\x7e\x44\x93\x9e\xa1\x36\x39\x76\x2a\xa3\x45\xf6\xcd\x8f\x3f\xb6\x33\xb8\xdb\xed\xd6\x49\xfb\x7a\x94\x95\x1c\x9a\xdc\x99\xd3\xc8\x08\xba\xf5\x89\x99\x34\x93\x27\x69\x7f\xd6\x82\x59\xef\xd4\x7c\x33\x48\x43\x27\xad\x94\xcd\x6b\xee\x91\x5b\x31\x23\x17\xe4\xee\xc5\x54\xdf\xa8\x53\x13\xd7\xb1\xe1\x8b\xff\x52\xe8\xec\x1a\x3a\x7f\x99\xb9\xb1\x92\x01\xba\xdc\x16\xc4\xc1\x57\x4a\x7a\x8f\xef\xf7\xf4\xce\x79\x76\xaf\x2e\xee\x99\xd5\xa6\xba\x04\xbf\x9b\x43\xcd\x95\x0e\xfe\x40\x36\x61\x48\x1f\x70\xab\xf5\xdd\x01\x22\x2e\x88\x83\xaf\x94\xf6\xed\xd6\xdc\x41\x51\xaf\x08\xc4\x03\x06\xd8\x33\x51\xef\x5a\x65\x11\x62\xbb\xa3\xe1\x36\xd9\x9a\xec\xe5\x5e\x6e\xfb\x38\x4d\x8f\x88\x0b\xe2\x02\x24\x51\x24\xfe\x8c\xcb\xf2\x4d\x7f\x88\x20\x81\x47\x50\xf2\x01\x0b\x9e\x3d\x3e\xa7\xee\x71\x72\x36\x4e\x96\xf6\x2f\x43\x7f\x4d\x13\x76\x74\xcb\x94\x26\x44\x5c\x10\x17\x20\x89\xfa\x8f\xe7\xa0\xc8\x82\xd9\xc5\xb4\x8d\x15\x2d\x42\xe6\x4d\x80\xed\xa7\x57\x39\xe2\xa2\xec\x24\xe8\x77\x7c\x97\x19\xe3\x66\xaa\x7a\xdc\x6f\xa8\x9f\x36\x88\x83\xea\x9b\xff\xee\x9b\x41\x2f\xf4\x49\x12\x70\xf4\x99\x28\x4e\x7f\x33\x3d\xc3\xe8\xea\xfe\x83\x33\xa2\x24\x95\xef\x6b\xb9\x3b\x86\x3d\x86\xf9\xa0\xe6\xb9\x6d\x94\x28\x5a\xa8\x19\x12\x88\x83\x4b\xe0\x96\x9e\x00\x5d\x57\xc0\x17\xe7\xa4\x47\x18\xb6\x36\xac\x41\xac\x6e\xf4\x22\x3f\xf5\xbf\x63\xad\x4d\x62\x79\xcd\x3d\x4e\xdd\x62\x45\xc4\x05\x71\x70\x09\xe4\x6c\xb5\xde\xf5\x73\xdb\xe3\xf9\x64\x76\x97\x6b\xef\xf6\xe3\x99\x9b\xd8\x8f\x30\x96\xc4\xd8\xed\x0e\x9a\x5b\x3e\xb2\xd1\xf3\xc7\x20\xe2\x82\x38\xb8\x04\xfc\x1e\x36\x11\xe1\x11\xde\xba\xe4\xba\xce\x4b\x76\x3d\x98\x91\x37\x4e\xbf\x35\x31\x24\xc3\xe3\x2e\x6a\x24\xce\x76\x5f\xee\x72\x39\xd4\x02\x1e\xc0\xc1\x25\xf0\xae\xe5\x7a\x6e\x5f\xff\xfd\xc5\x21\xcd\xc8\x19\xd1\x9d\xa6\xd4\x5b\xaf\xbe\xee\x3f\x49\xd8\x6d\x75\xa0\x44\xbb\x18\x1a\x26\x49\x89\x90\x00\x88\x83\xea\x9b\xff\xee\x9b\x41\x93\xeb\x49\x12\xc0\x33\x4d\xdd\x0f\x6a\xa7\x3d\xc3\xff\x29\x7f\x83\x01\xb7\xe4\x76\x9e\x9a\xbe\x16\x25\xc7\xeb\xc0\x44\x97\x94\x73\x9a\xdb\x65\xd6\x88\xa1\x83\x38\xb8\x04\x48\x82\xd2\xb3\x75\xa6\xc7\x2d\xbd\x5e\x14\x56\xad\x39\xeb\x3e\x36\x60\xe9\x7e\x13\xb3\x26\x93\x6e\x3a\x24\x47\x6c\x65\xdd\x03\xd5\x0b\x83\x38\xb8\x04\x74\xe8\xc4\x36\x34\xf1\x56\x75\x9e\x12\x6f\x78\x4c\x3d\x73\x19\x8e\x1b\xa1\xfa\x70\x5c\x84\xbd\x75\x91\x7d\x47\xde\x8a\x26\x1d\xea\x46\x00\xe2\xe0\x12\x50\xdc\x38\x64\x8e\xb2\xbf\x42\x6e\x92\x30\x45\x8e\x59\x12\x6c\x75\x31\xdd\xd3\x2d\xe0\x3d\xef\x4f\x1a\x95\xa0\x24\xbb\xfa\x26\xe8\x9b\x2b\x88\x83\x4b\xe0\x4a\x5c\xde\x97\xf1\x80\xf9\x25\xff\xdc\x07\x1c\x19\xf1\x35\x6c\xb4\xef\xcb\x26\x0b\x62\xb2\xae\x04\x04\x7b\x8d\xfa\x8b\x74\x41\x57\xf1\x82\x38\xa8\xae\x11\xe0\x9b\x41\x2b\xdd\x49\x1a\x68\x92\x5a\xe0\x1b\x13\xd7\xbe\xdc\xc2\x7d\xe8\x26\xa4\xfd\xdd\xea\xd9\x74\xb9\x29\xcd\x2f\xcf\x94\x4b\xbf\xb9\xc3\x6b\xee\xda\xe2\x41\x7d\xb6\x00\x1c\x5c\x03\x46\x8e\xf7\x0f\x0e\xae\x5c\xfa\x92\x6d\xb4\xfa\x6e\xb3\xf1\x1c\xb1\xb0\x51\x97\x59\x50\xab\x04\x26\x7f\x4e\x31\x91\xd5\x1c\x0e\x34\xb3\x82\x38\xb8\x06\x70\xb8\xe7\x7a\x1c\x1e\x9a\xf7\xf1\x0d\x47\xd4\x91\x9f\xb1\x70\x51\xaf\xa6\x10\x15\xb2\xf4\xfd\xc4\xc1\x25\x63\x10\xe0\x6d\x0a\x79\x26\x10\x07\xd7\x40\xe5\xb0\xf8\x6f\xad\x42\xef\xb3\x8f\x78\x30\x8d\x71\xce\x74\x94\x7a\x9d\x71\xa8\x3a\x0c\x53\x38\xa0\x5b\x1e\xf4\x66\x92\xf8\x0e\xf5\xff\x06\x71\x70\x0d\x98\x3e\x4d\x9b\xbc\x58\xb8\xbc\xaf\xa9\x23\xb4\xa7\x54\x5a\x8a\x81\xb5\x91\x46\xa4\x62\x37\x69\xb4\xa4\x74\xc1\xb9\xde\xe9\xcc\x12\x42\x03\x20\x0e\xaa\x6f\x06\xf8\x66\xd0\xb6\xe3\x24\x0d\xa0\x7a\xf5\x77\xde\x42\x73\x7c\xb0\x33\xe7\x71\xf0\x82\xb1\xb6\xe4\x88\xcc\xa8\x72\x82\x4c\x77\x57\x8f\xad\x86\xfe\x69\x22\x9d\x27\x62\xec\x20\x0e\xa9\x9f\xf6\x35\xd9\xb7\xa1\x15\x53\xaf\x85\x8e\xe6\x23\xd1\xbf\x2f\x08\x3e\xa0\xd1\x1c\xd9\x45\xe7\xac\x35\x8f\xa8\xf1\xae\x61\xd2\x83\xee\x0c\x03\x71\x70\x0d\x14\x13\xc6\xa6\x17\xf9\x6a\x0b\xc9\x25\x24\xd0\x50\xb6\x15\xdd\x59\xf3\x8f\x99\x38\x3a\x64\xd5\x5f\xe2\xa3\xd5\x88\xc8\x24\x87\xba\x9d\x80\x38\xb8\x06\x48\x65\x50\x1f\x8b\xef\x8e\x96\x0d\xc6\xaa\x7e\xc1\x9c\xbf\xad\x94\x92\x49\x9a\x27\xfa\xdc\xe1\x96\xe7\x41\xa2\xc9\xd0\xb5\x75\x76\x44\x5c\x10\x07\xd7\x00\x6b\x74\x60\x59\x2d\x45\xf3\x03\x5e\x99\x32\x7f\xab\xce\xca\xb3\x39\x94\x9f\xbe\xc9\x90\x70\xdd\x2e\x91\x79\x6f\xd8\x72\x47\xe2\x07\x42\x03\x20\x0e\x9a\x07\x00\xbe\x19\x64\xa1\x4e\xf6\xcd\xad\xaa\xf7\x6e\x6d\x61\xd8\x1c\x38\x77\x7e\x76\x98\xe2\x3b\x63\x31\x85\x6d\xe8\xe5\xb4\x9f\x4a\xe4\xf0\xce\x1f\x2f\xf9\x2c\x89\x08\xc2\x83\x82\x38\x64\xdf\xdc\x90\x61\x79\x6f\x83\x9a\xca\xd3\x25\x2a\xfa\x4a\xe4\x47\xb1\x04\x4b\x8f\x5d\xdb\xba\xc1\xb2\x8f\x09\x3a\xb2\xbe\x72\xe4\x2b\x2d\x88\xc8\x20\x0e\xd9\x37\xa3\xf8\x4d\xac\xfc\xbe\xab\x77\xc6\x94\xc5\xfa\xd5\x7e\x74\xde\xa2\xd4\x65\x75\x4a\xb4\xee\x8d\x95\xef\x65\x23\x0f\xef\x6f\x1b\xee\x20\x22\x83\xb8\x00\x69\x14\x94\x7f\xfe\xcf\x94\x5b\xf6\x29\xb6\x2d\x86\x89\x8e\x2c\x2c\x83\xa4\xaf\x2b\x67\xa0\x55\x6b\xba\xd0\x6b\x9f\x6d\x88\x78\x22\xa4\xea\xe7\x61\xf0\x14\xe1\x9b\x41\x5c\x80\xb4\x2f\xec\x1e\x2a\xa3\x57\x31\x82\x74\xbd\xf7\x5f\x86\xea\x4a\xe9\x78\x52\xf5\x58\xb0\xde\x29\xa9\xda\xbe\x7d\xfb\xca\xd9\xaf\x1a\xc6\x4b\x97\x31\xce\xfd\xe9\x9b\x39\xb5\xa7\x7a\x43\xc9\xe8\x51\x69\xe6\x4d\xa6\xa2\x04\x29\x62\xc3\xa3\xc5\x28\x26\x97\x0c\x5f\x72\x10\x07\x78\x8e\xd3\xdc\xfc\xf3\x07\x2f\xcf\xdf\x24\xc8\x18\x72\x1b\x35\x60\xf6\xa5\xa2\xf6\x72\x13\x41\xb3\x96\x14\xb3\x36\xae\x22\x7d\xf1\xf0\xeb\x10\x11\x8e\x42\xea\xbf\xc5\x37\xfb\x61\xfe\x6f\x43\xfb\xb3\xbe\x19\xc9\x37\xa3\x47\x63\xa3\x74\xe5\x3d\x29\xd2\x28\x7d\x3c\xb1\xb4\xff\x81\xa1\x74\x73\x88\x51\x4c\x9a\x50\x27\x3d\xb9\x62\x7e\x8b\xa5\xb7\xe0\x54\xbe\x85\x72\x21\x79\xba\x75\x7c\x3f\xfc\x33\x95\x75\xaa\x9f\xa2\x73\xcf\x3c\x1e\x52\xa4\x71\x9f\xf3\xf7\x50\xb6\xfd\xd1\x1a\xb5\xd9\xc9\xc3\xbf\x73\xf1\x54\x4e\x4c\xfb\x22\x1b\x67\x67\x0f\x77\x2b\x4a\xcd\x3b\xe7\x18\xef\xa3\xa8\x7f\xa7\xb1\x7a\xba\xf0\x44\xbe\xc0\x23\xb7\x5d\x89\x4e\x81\x7e\xdd\x3b\xc1\x2a\xfe\x54\x46\xab\x83\xf4\x67\x87\x85\x33\x9c\x29\x08\x69\x39\x74\x2f\x12\x8c\x30\x09\x1b\x65\x05\x19\x09\x70\x6b\xd2\xf4\xb3\xf8\x6a\xd3\x8a\xac\x90\x32\x7b\x9e\xca\x68\x91\x8d\xf3\x79\x15\x77\xbb\x71\xc9\xa3\xb7\x4e\x4d\xa2\x34\xda\xce\xe7\x88\x8e\x33\xf1\xfa\x9d\xf7\x3a\x1f\x5b\x72\x61\xc8\xbd\xde\x09\x6c\x3b\x35\xe3\x0c\x12\xd1\x49\x4b\x65\x6e\x4a\x9f\x33\x17\x9e\xd0\xd0\x77\x54\x17\x51\x7d\x3d\xa2\x77\x99\xdd\xcd\xd1\xa5\x5d\xe5\x9a\x79\x97\x6a\xd4\x9f\x85\x3c\x48\x44\x2c\x11\x20\x0e\xbe\x54\x46\x4a\x73\xfa\x5b\x04\x9b\x64\xfe\xb8\xe8\xce\xf1\xa6\x70\xac\xf7\x56\x80\x8a\xb6\x46\xce\xe7\x10\xb2\xad\x23\x85\xf2\xd4\x6e\x42\x44\x5c\x10\x07\x5f\x2a\x9f\xb4\xeb\x07\x57\x3c\x78\x27\x31\xda\xf1\x3c\xfc\xf5\xc4\xeb\x24\xfe\x87\x9a\x64\xfc\x4f\x1d\x9a\xb4\x97\x2b\x1c\x5a\xdf\x2d\x40\xee\x06\xc4\xc1\x97\xca\x9d\xd4\xf7\xeb\x4a\x96\x69\x3c\x66\x87\x84\xed\x22\x98\x5a\x0c\xd7\xdd\xbf\x9c\xfb\x84\xc6\xfd\xfe\x6c\xa0\xb5\xde\xfd\x86\xcc\x97\x88\xb8\x20\x2e\x40\x92\xf0\x1f\xcf\xa1\x47\x56\xc9\x21\xaf\xf9\xf8\x51\x66\x5c\x8c\xcc\x87\xe1\xd7\xba\x5d\x04\xe9\xcf\xb9\xe5\x1e\x79\x07\x16\xcb\x66\x6d\x32\x2e\xb0\x20\x5c\x13\x88\x83\x0a\x9c\xff\x6e\x9c\x41\x2f\xf4\x49\x12\x30\x63\x75\x4b\xe1\x54\xcd\xbc\x53\x43\x96\xda\x10\xf8\x64\xe2\x75\xe2\x33\x32\xa7\x24\x9b\x5f\xe6\xb6\x97\xa5\xca\x0c\x06\xb6\xa1\x93\x94\x20\x0e\x2e\x81\xf6\x0b\x3c\xef\x09\x3c\xee\x4c\x8a\x19\x8e\x90\xae\xbf\xb3\x64\xaf\x58\xb9\xfc\xd3\x3e\x93\x69\xa3\x7d\xd1\x64\x41\x4f\x43\x17\xea\xa6\x0c\xe2\xe0\x12\xb8\x20\xa7\xd1\x91\xf1\x65\x7b\xc3\x7b\xf6\xd7\x65\xb9\x3c\x8b\x33\xd4\x26\xe9\xc1\xe9\x02\xcb\x03\xc9\x66\x62\x79\x01\x3c\x64\x9f\x11\x71\x41\x1c\x5c\x02\x49\xfc\x4d\x41\x54\x07\x8a\x1c\x26\x3b\x93\xbb\x71\x15\x82\xd8\x15\x61\x6f\x59\x14\x7f\x3c\xf8\xdd\xc6\xe8\x3b\xca\x62\x7d\x3d\x0a\x11\x17\xc4\xc1\x25\x70\x9b\x34\x74\x4c\x9f\x60\x75\xff\xe0\x30\x94\xa5\xf7\x57\x08\xa9\x04\xea\xb0\x55\x06\x09\xfb\xf6\xc2\xc8\x03\x4e\xa5\xf1\xe2\x47\x88\xdd\x12\x88\x83\x2a\x1b\xb9\xfe\xbe\x63\x06\xcd\xae\x27\x69\xe0\xce\x6a\x97\x75\x9f\xd9\xd7\xfe\xeb\x1a\xfe\xf8\x6f\x4a\x7f\xfd\xbc\xe8\xcb\xb0\x68\x77\xfd\x87\xdb\x33\x73\xd4\x3b\xee\x9e\x75\x86\x88\xb1\x83\x38\xb8\x06\x1c\x03\x8a\xfc\x67\xb8\x84\x5d\x5f\xa7\xf4\xec\x52\x78\x1b\xac\x89\xdb\x29\xf4\xdb\x5e\x64\xd7\x63\xe8\xe1\x4c\x78\xae\x7d\xde\x07\x4a\xca\x00\x38\xb8\x06\xe2\x92\xd3\x95\x55\xbb\x08\x44\xc8\x4d\xc7\x4d\xb5\x9b\x36\x57\x43\xbe\xdf\x30\x7e\x84\x16\xe0\xe5\x48\xad\x41\x1b\x19\x81\x8b\x05\x9d\x2c\x07\x70\x70\x0d\x7c\x8a\x49\x4e\x99\xc9\x35\x88\x9e\x64\x77\x5f\x34\x72\xb4\xfa\xd4\x7e\xff\x6a\xc3\xb0\xd1\x68\xa3\x7c\x08\x75\x2f\x7e\x28\x1b\x74\x52\x15\xc4\xc1\x35\xd0\x52\xa6\x56\xb3\x62\x4f\xf4\x6b\xef\x8c\x59\x9b\x1a\x0e\xcb\x80\x9f\x4d\xbc\xfd\x46\x96\x68\xbc\xcc\x58\x61\x48\xa3\x05\x4e\x07\x42\x03\x20\x0e\xaa\x6c\x04\x38\x67\xd0\x52\x77\x92\x06\xf2\x75\x3b\x03\x57\x6e\xbc\x9f\xb4\x77\x26\xb7\xd3\x6e\xb2\xd8\x4b\xfc\xbe\x10\x9d\xc6\x3e\xd9\x16\xe0\x38\xb3\x88\xaa\xf8\x15\x3a\x9d\x0a\xe2\xe0\x1a\x58\x5e\x45\xdb\x6d\xab\xf0\xb8\x33\x3b\xba\xf1\xd8\x94\xf2\xab\xc4\x60\xc3\x58\x84\x7d\xf2\xb4\x88\x5a\xef\x91\xb3\x74\xde\x23\xa8\x33\x18\x88\x43\x3a\x7b\x54\x2d\x6f\xbd\xa6\x76\xd6\xd9\x26\x7f\x82\xda\x32\xac\xd3\xb5\xa7\x13\xef\xbb\xc1\xac\xac\xac\x30\xfa\x95\xaf\x03\x6a\x33\x50\x95\x3b\x88\x83\x6b\x40\xc5\xf2\xf7\xc7\xf5\xaa\xfc\xda\x6d\x3b\x72\xf1\xd7\x74\x69\x7d\x0f\x5d\x74\xea\x52\x4d\xc6\x34\x72\x73\x57\x9c\x34\x1b\x0b\xcc\xa1\x6a\x5c\x00\x07\xd7\x80\x05\xb6\x4e\x79\x6c\xa4\xa5\xa9\xeb\xf6\xd7\xaf\x24\x67\x7c\xc6\xd2\x05\x3a\x34\x1f\x3c\xa7\x4c\xe4\x7b\x19\xb5\x69\xb8\x63\xd7\x8a\xd0\x00\x88\x83\xe6\x01\x9d\xbf\x6b\x00\xb4\xef\x38\x49\x03\xfa\x94\xb9\x49\x6b\xf3\xa1\x9d\x58\x74\x4a\xac\xb6\x0b\x97\xcb\x88\x79\xb1\x65\xf1\x2a\x84\x42\x5b\x95\x53\xba\x3a\xf1\x57\x8d\x11\x63\x07\x71\x70\x0d\xe8\xcb\xdd\x73\x0b\xc9\xbc\x3e\xac\xa2\x89\x69\xae\xed\xb0\xda\x2f\x57\xa2\x46\xf1\x54\xea\xdb\xdd\x3c\xc7\xe5\xc5\x18\xbe\xbd\x51\x28\x2e\x80\x83\x6b\xc0\x99\x7b\xa9\x21\x4a\x34\xaa\xd9\xfe\xe7\x0f\xb6\xe5\x31\x6c\x76\x56\x0f\xfe\xbc\x69\x0d\x6a\xbf\x99\xba\xe8\x37\x51\xcd\xd3\x5a\x88\xb8\x20\x0e\xae\x81\xf3\x64\xd9\xf8\x9e\xf7\x68\x3f\x45\x64\x87\x0c\x65\x13\x8a\x16\x7c\xba\x5e\x68\x67\x13\xdc\xaa\xe1\x30\xb7\x3c\x24\xd4\x5e\xee\x8a\x88\x0b\xe2\xe0\x1a\x20\x35\xee\x4f\x4f\xe9\x26\x5c\x2e\x4f\xb0\xd2\xc7\x7d\xb9\x2e\x68\xe5\xc7\xb0\x11\xcf\x96\x39\x8f\x75\xff\xd9\xbb\x0f\x31\x97\xa1\x8a\x0d\x10\x07\xcd\x03\x00\xe7\x0c\x32\x51\x27\x3b\xe7\x2f\x64\xdd\x91\xdf\x68\x4a\xcf\x30\xd2\x49\x3d\x09\xce\x8e\x37\x9d\xb3\x8b\x76\xf1\xf4\xf7\x58\x27\xfb\x7a\xfd\x5e\x16\xfd\x14\xe4\x6f\x41\x1c\xb2\x73\x36\xe8\x9b\xe4\xfe\xff\x98\x7b\xeb\xa0\x2c\x9f\xf7\xef\x9b\x4e\x09\x05\x04\xe9\x6e\x44\xca\xa0\xbb\x4b\x50\x41\x10\x01\x09\x41\x04\x24\xa5\x43\xba\x41\x1a\x04\x44\x44\xba\x44\x91\x16\x01\x11\x50\x69\x41\x42\x90\x96\xee\xae\x67\x7e\xbf\x7b\xae\xf3\xf6\x73\x5e\xcc\x67\xbf\xf3\x0c\x33\xf7\xf7\xff\xd7\x1c\xb8\xa7\xef\x6b\x8f\x7d\xef\xee\x71\x6c\xc3\xf0\x36\x47\x2c\x45\x86\x3e\x71\x4b\x7c\xa0\xf3\x9b\xf0\xfd\xbe\x17\x4d\xb5\xcf\x7f\x98\xf6\xea\x07\xcc\xe5\x23\x22\x83\x38\x64\xe7\x7c\xfd\x7d\x11\xa9\x6f\x7d\x57\xe6\x13\x06\xec\x0c\x97\x3e\xb7\x2a\xbd\xcd\x73\x1d\x29\x31\xc2\xe8\x77\x69\x94\x3b\x4c\x27\x4a\x35\x10\x91\x41\xdc\xff\x38\x67\x8c\x7f\x56\x65\x83\x5e\x70\x46\x18\x61\x21\xc9\x67\x69\x76\x37\x1a\x9b\x8a\x1e\xd6\x72\xae\x44\xf2\xbc\x68\x14\xc3\x35\x4e\xab\x7c\x80\x3d\x7d\xd3\x79\xc8\x83\xff\x79\xcb\xdf\x46\xd8\x9c\x0d\x55\xe3\x8a\xd9\xc2\x83\xf4\x2a\x73\x41\xe7\xa7\xe7\x3a\xc3\xb4\x32\xaf\xa6\xb9\x46\x56\x5f\x12\x14\xf4\x64\x21\xfd\x9c\xf3\x17\x5a\x6c\x36\x1f\x8c\xe7\xca\xbc\xd0\xcf\xa4\x39\xbd\x66\xc3\x4f\xf5\x4b\x40\xe2\x36\xc9\xfe\xea\x95\x65\x95\x47\x58\xbf\x2e\x29\xf4\xfe\xb7\x19\x61\xd0\xd0\xfe\x2e\x58\x46\x32\xc2\x22\xaf\x5e\x4d\xb1\xe2\x2e\xc8\x38\x07\xb6\x65\x04\x64\xb5\xd2\xb0\x39\xdc\xe1\xca\x50\x1f\xa6\x0b\x20\x18\x7b\x9f\x59\x74\xc4\x75\x26\x87\x9b\xc8\x46\x78\xfb\xb0\xe6\xb1\xcb\xa2\x1e\xcb\x97\x5c\x2e\x8e\x81\xe8\x9c\xd7\xae\xae\xc5\xe5\x7c\x4f\xd2\x54\x4a\x57\xb4\xe9\x18\xfd\x6f\x9e\x49\x87\xec\x06\x64\x23\xfc\x40\xd3\xa6\xcc\x17\xe7\xeb\xe7\x16\x55\x7f\xc2\xad\xdb\x9d\x2c\x32\xd5\x42\xee\xc1\xa5\xb9\x91\x69\xc5\xba\x2e\x3d\xe8\x33\xdb\x67\x32\x5a\x64\x23\x3c\xdd\x3f\xb5\x7b\xdf\x8e\x7c\xe1\x85\x5e\x87\x4e\x34\x0f\xa6\x90\xc2\xae\x9a\x3c\xf9\x0b\x71\xec\xb7\x52\x28\xf8\x29\x75\x17\xd1\xcf\x64\xb4\xc8\x46\x38\x79\xed\x61\x64\x83\xc6\x02\x73\x35\x63\x2f\x23\x0f\xeb\xb8\x6a\xfc\x8d\x9e\xd2\xbb\xe7\x76\xef\x58\x3e\x39\xc8\x09\xb5\x8f\xfe\x73\x66\x46\x18\x24\xa2\xd3\x32\x5f\x8c\xb5\x61\x53\xf4\xe3\x0d\xe9\x55\x06\xc9\xaf\xab\xab\xfc\xbd\x77\x45\x47\x6c\xcd\x3a\xac\x16\xf1\x4a\x54\x7e\xe8\x67\x6e\x43\x27\xbd\x20\x0e\xe9\x45\xe6\x81\x15\x19\xe2\x4a\x86\x31\xac\x16\xb1\xb0\x8c\x59\xaf\x26\xfe\x9b\x73\x38\x3b\x0e\xf7\x64\x35\x9f\xe8\x88\xac\xa2\xdf\xb1\x81\x8e\xe3\x00\x1c\x3c\xf3\x89\xaf\xc5\x3b\xc5\x36\x64\x3d\xbd\x44\xa8\x7a\x27\x48\xdb\x99\xf1\xad\x90\x03\xab\x9b\x81\xdc\x82\x4c\xb3\xc7\xa1\xfe\xfe\xad\x3d\x44\x5c\x10\x07\xcf\x7c\x41\xe4\x12\x5b\x73\xe6\x45\xa8\xc1\x09\x37\x7c\x1c\x59\xe7\xf2\x25\xcd\x0d\x68\x06\x16\x2d\x63\x69\xcf\x49\x88\x3b\x3d\x6e\x85\xee\x9c\x81\x38\xf8\x77\x90\x57\x1e\xbe\x7c\xf4\x27\xdd\xfe\xbe\xeb\x34\x5d\x2e\xc9\x72\xe8\x8e\x13\x17\xc5\x26\xab\x6e\x49\xc3\x0d\xdb\xd9\x2b\x8a\x56\x96\x08\x23\x0c\xe2\xa0\x8a\xe5\x7f\x37\xc2\xa0\x1f\xf4\x69\x12\x60\xf2\xfd\xe3\xa8\x27\x5f\xe2\x18\x55\xb0\x6d\x6a\xfb\x31\xd3\x01\xa7\xee\x76\x6c\x47\x81\xb5\xd3\x03\x7a\xf4\x48\xdd\xd0\x8f\x9d\xd0\x15\x46\x00\x87\x74\xf3\xba\x8c\xaa\xb1\x10\xb5\xc5\x27\xc6\xac\x9c\xf1\x40\xa2\x18\xa7\x1c\xcd\x1f\x5f\x40\xf5\x18\x57\xab\xbb\x65\xb2\xba\x83\x36\x11\xba\x79\x0d\xe0\xe0\x12\x58\x94\xa1\x2e\xc7\x76\xa9\x2e\x38\xff\x5c\xbb\x48\xc8\x77\xfc\x13\x5d\xcc\x95\xf2\x6d\x9a\x9f\x57\x69\xe4\xaf\x65\x60\xa6\x96\x42\x8b\x1f\x10\x07\x97\xc0\xb5\x7c\x85\xf7\xbe\x8f\x9b\xce\x1f\xbf\x77\xf0\xa5\x79\x75\x7c\xe1\x1d\xe7\xa6\x74\xe4\x07\x65\xe9\xc4\x18\x2e\xe3\xc4\xab\x5b\xd0\xd1\x11\x88\x83\x7f\x87\xe1\xc6\x2b\x97\x67\x26\xc5\xa2\xf8\x42\xb2\x18\xea\xcd\x68\xc4\x9c\x38\xdf\x76\xbc\x62\x69\xbb\x46\xd9\xe6\x85\x8d\xe1\x54\xf2\x02\xb1\xf8\x01\x71\x50\xa9\x22\xc0\x08\x83\x66\xd7\xd3\x34\x70\x73\x72\xb6\x2e\x44\x24\xc7\xb3\xa8\x6a\x78\xef\x91\xed\x56\xba\x0b\xe6\xd4\x85\x17\x81\xfc\xfd\xaa\xaf\xaf\x56\x45\xb7\x0b\x41\x0d\x06\x40\x1c\x7c\xec\x34\xca\x2e\x94\xbd\x79\x8e\xb5\x7c\x46\x9b\x27\x73\x5e\x3f\x39\xc5\x51\xff\xc8\x1b\x08\x4b\xb9\x73\x49\x98\x60\x8d\x7a\x26\xbf\x44\xc4\x05\x71\x70\x0d\xc4\x0a\xfc\xc9\x9c\x79\x2b\x9d\x35\x8f\x1f\x79\xf3\xb2\x17\xfd\xf5\xb0\x90\x90\x6e\x81\x8f\x39\xc7\x86\xf4\x0b\x5d\xbb\x4b\x92\x0a\x88\xb8\x20\x0e\xae\x01\x83\x5e\xbb\x3d\xb5\x99\x6c\x5a\x45\xcd\x04\xcb\xab\x71\xc2\x3c\xf5\x3e\xa1\x1f\xda\x9d\x7b\xb0\x67\xfa\x82\x6f\xec\xbe\xbe\x92\x8d\x88\x0b\xe2\x90\xa6\xc3\x1f\xfd\x99\xc2\x89\xe7\x51\x15\x9f\x6c\x6a\x8f\xb7\xca\xd2\x2f\x36\xae\x76\xa8\xab\xc4\x6f\xfe\xce\xf4\x0b\xf9\xa9\xca\xc8\x86\xd0\x00\x88\x83\x4a\x15\x01\x46\x18\x94\xea\x4e\xd3\xc0\xaf\x8a\xcf\x5e\x16\x6a\xea\x91\xe4\x72\xec\xfe\x21\x18\x99\x3e\x73\xec\x35\xdf\xf4\x6f\xd1\xde\xa3\x23\x1d\x75\x33\x59\xd0\x83\xda\x0d\x83\x38\xf8\xd8\x9f\x08\xa3\x6d\x35\x09\xca\x11\x89\x9d\x94\x8b\xd0\xa1\x8e\x58\x19\x3c\xd6\x6d\x7b\xb8\x9c\x47\xdd\x75\x61\x52\x92\x33\x0c\x0f\x6a\x06\x01\xe2\x90\xae\xdd\x2a\xa6\xf2\x69\x1d\x87\x35\x2e\x76\x6f\x0e\x06\xf6\xd9\xf9\xc7\x5e\x9d\x8f\x1b\x9a\x8e\xc3\x17\xa2\x59\x10\xb2\x28\x3d\x0f\xbd\xf8\x0e\xe2\xe0\x1a\xa0\x56\xd7\x4b\x52\xcc\xbe\x8b\x2e\x33\x76\xbd\x7b\x9e\x8d\x9c\x7f\xd0\x9c\x11\xe7\x6b\xf1\xbd\x91\x0b\xf1\x5f\xbc\x96\xbb\xd0\xa1\x8e\x7f\x20\x0e\xfe\x1d\x7a\x3e\x92\x71\x95\x63\xfd\x9e\xdb\xba\x75\x75\xc5\x21\x56\xce\x91\xeb\x1b\x55\x6a\xf0\xe6\x45\xa7\x28\x43\xe7\xcf\x44\x49\x03\xd0\xd5\x6b\x10\x07\xcd\x03\x00\x23\x0c\x5a\x77\x9c\xa6\x01\xdd\x51\x8f\x75\xf7\x3b\x6a\xd1\x98\x2b\x1c\x3e\x61\xb8\xfb\xce\xec\xe4\x2f\x6c\xea\xc7\x4a\x12\xbf\xf7\xbc\xe9\x79\x67\xb6\x64\x84\x18\x3b\x88\x83\x8f\xbd\xa0\xeb\x28\x9e\xbb\x11\x8b\x2a\x8e\x25\xc6\xcb\x6b\xd5\x9a\xc0\xf9\x4a\xdc\x5d\x6c\xbc\x5e\xd2\xba\x84\x31\x42\x1e\xa5\xad\x6a\xa8\x5a\x06\xc0\x21\xed\x8b\x33\x85\x6d\x71\x46\x55\x6f\x6f\x64\xd5\x74\x49\xd5\xb1\x24\xd2\xd0\x60\xdc\xe3\x79\xaf\x91\xf4\x1b\x9b\x7f\xd5\x71\xbb\xf5\x2e\xb4\x2f\x0e\xe0\xe0\x1a\x90\xbc\x21\xb2\x24\x2c\x71\xd9\x34\x50\x53\xc6\x87\xf0\xaa\x29\xd7\xf9\x65\x3f\x3f\xb5\xc4\xb4\x54\x25\xe1\x0f\x78\x3c\x6d\x7b\x76\x88\xb8\x20\x0e\xfe\x1d\x76\xce\x7d\x1d\xfa\x39\xf0\x9c\x6e\xb3\x6a\xbe\x2d\xe0\x44\xce\xc8\xfb\xe3\x26\xd1\xe3\xc6\x70\xec\x2d\xcf\x0b\xd3\x8f\x12\xd0\xbf\x22\x34\x00\xe2\xa0\x79\x00\x60\x84\x41\x26\xea\x74\x23\xbc\x52\x28\x3e\x84\x6a\x36\x3b\x25\x71\x78\x57\xff\xde\xbc\x1a\x7a\xbc\x02\x29\xad\xaf\x4c\x6d\x57\x1d\x7b\x19\x4f\x5d\xdf\x37\x61\x84\xa9\x04\x71\xc8\x46\xf8\x87\x90\x0e\x2a\xe5\x3e\x71\xd8\xb9\x4d\xc6\x3b\xa5\xa2\x92\x34\x3f\xec\x66\xa8\x59\xab\xb2\x99\xd8\xce\x37\xfd\x6a\x9f\x7a\x60\x8d\x88\x0c\xe2\x90\x8d\x70\xea\xda\x39\xd9\x9e\x7c\xb3\x5e\x01\x86\xb6\x55\x5f\xba\x54\xd2\x9b\x56\x6d\xeb\xbc\xb4\x11\xa6\x0e\x43\x8e\xe6\x97\x7e\x49\xe1\x22\x22\x83\xb8\xff\xd3\x90\xeb\xef\xc8\xc0\x27\x99\x11\x46\x58\xd7\x56\x3d\x24\xd0\x83\x5b\x71\x7d\x53\xf9\xf3\x58\xa8\xce\x54\xdc\x32\xf7\x94\xbf\xcd\x7c\xe6\xe7\x27\xee\x23\x4c\x4d\xc3\x5c\x7f\x1b\xe1\x1a\xaf\xae\x43\xde\xe7\x7d\xc3\x4b\x4c\xe1\xef\x0d\x30\x6c\x7e\x46\x8f\x59\xc8\xbf\x11\xb1\x17\xef\xaf\x93\x69\x29\xa5\xd1\xbe\xf9\x17\x7a\x54\x79\x5d\xf1\xe2\xb7\x87\xc5\x8f\x8e\xba\x55\x5f\xff\x70\xb0\xbb\x10\x7a\x05\xe7\xad\xea\x81\x6a\xc6\x9b\xdb\x5e\xba\x06\x62\x26\xff\x6d\x46\x18\x34\xb4\xbf\x2b\x90\xe5\xe0\x66\xa9\x92\x89\xe2\xda\x26\x36\x47\xbc\x50\x35\xaf\xda\x85\x10\x0a\xd5\xf9\x08\x89\x7b\xde\xec\x17\x88\x79\xdf\x65\x94\x0b\xed\xbb\x18\x9c\xc9\x61\x25\xb2\x11\xf6\xae\xd9\x27\x73\x20\xf5\xf0\x55\x4f\xfd\xaa\x52\x24\xe0\xfb\xb6\xb0\x6b\xaa\x71\x79\x30\xcb\xf7\x86\x5b\xe5\xb0\x3b\xcf\xb3\xe1\x33\x39\x9a\x15\x45\xbe\x4a\x2d\x73\x4d\xea\xfc\xa7\xe5\xe3\xbc\x75\x0a\x79\x74\xd5\xb6\x4d\xf1\xfe\x7a\x51\xb3\x1f\x71\xb4\x13\x59\x21\xee\x04\x47\xf6\x67\xd0\xcc\x2a\x4c\xd6\x07\xd9\x08\x0b\x89\x7c\x8f\xd3\xac\xa7\xcf\x52\x6b\x99\x0b\x2e\xb7\xb8\x56\xf8\xf3\x83\xd0\xfc\x57\xc2\x58\x95\x9f\xcf\xb5\x3e\x34\x6b\xfb\x53\x9d\xc9\x68\x1d\x90\xfe\x2c\xf7\x25\xa3\xb7\xb6\x21\x84\x0e\xe7\x9d\xbf\x3d\xa1\x2e\x71\xc1\x47\x27\xe0\xd1\x4b\x16\xdf\x78\xa7\xf4\xe4\x8d\x7a\x8b\xd0\x42\xd6\x99\x19\x61\x90\x88\x4e\xcb\x7c\x0a\x3b\xb2\xf8\x94\x31\x91\x4a\x6d\x27\xfc\x49\x96\xbd\x6c\xb7\x73\xb8\x69\xf8\x1e\x51\xf8\xcc\xd2\xab\x19\xa1\x61\x69\x1d\xb9\x22\x66\x7c\x10\x07\x9f\xf1\x2b\xb1\x2e\x92\x05\x66\x3e\xf3\xaa\x2b\xd6\x0a\xaf\x71\x71\x8a\xc9\x7f\x6e\x17\xbc\x94\xe7\xf0\x4c\x43\xc1\xcb\xd1\xd4\xd6\x12\xba\x94\x08\xe2\xe0\x99\x2f\xc7\xfb\x79\x71\xb1\x49\xc7\xb4\xbd\x2f\x9d\x86\x55\x99\xc6\x4d\x4c\xbd\xeb\xe1\xda\x39\xe2\xfd\x64\xd6\x6b\xd8\xd6\x9d\xff\xf7\x8a\x36\x88\x83\x67\xbe\xac\x6f\xba\x97\x0f\x86\xa3\xc6\x33\xf8\x6e\xed\x19\x67\x1d\x45\xb4\xf1\xfd\xf4\x3e\x54\x50\xa0\xa4\x2c\x5e\xb3\x2b\xba\x21\xf5\x0b\x11\x17\xc4\xf9\x49\xa3\xe0\xfc\x1d\x37\xb3\x16\x25\xe1\x93\xc3\xe0\xb6\x97\xf1\x48\xc8\xda\x14\x65\x29\x46\x78\xfa\xd7\x5f\x53\x42\xf2\x87\x87\x79\x78\xbf\x08\x1e\xda\x22\x8c\x30\x88\x83\x4a\x90\xe5\xfe\x75\xf1\x03\xfa\x41\x9f\x26\x81\x1b\xf1\x4a\x56\xcb\x8c\x58\xf1\x86\x7d\x37\x50\x53\xf3\x5b\x3e\xc6\xbd\xbe\xf7\x43\xeb\x12\x0d\x0e\xa3\xd5\x4a\x33\x56\xf8\x67\xa8\xdf\x31\x88\x83\x4b\xc0\xbf\x52\xe9\xf9\xad\x36\x22\xa1\x0b\xab\xdb\x9c\x2d\xd8\xda\xa1\xec\x63\xa8\xbf\x95\xcc\xac\x30\x38\x4c\x5b\xbe\x38\xf7\xa5\x41\x0b\x55\x10\x07\x97\x40\xf8\x33\x9b\x4e\x4e\x33\x3c\x61\x56\x77\x12\xd5\x0e\xa9\xcb\xad\xfb\x28\xe3\x7b\xa6\x33\x94\x66\xb6\x8f\xb4\x8f\xbc\x4b\x36\x8d\x11\x71\x41\x1c\xd2\x29\x80\x4b\x58\x74\xe7\x90\xe0\x43\x1c\x9b\x4c\x8a\xb2\x97\x1f\x99\x4b\x16\xf6\x62\xef\x49\x5f\x22\x0e\xcd\x97\x60\x92\xbc\xdf\x0a\xb5\x1a\x03\x71\x70\x09\x38\xb6\xf2\x4a\x73\xb8\x34\xa3\x04\xd7\x12\x06\xe4\x5d\xe6\x71\x0a\x93\xfe\xf1\x93\xf5\x4f\x76\xeb\x4e\xb5\xe7\x71\xec\xb2\x92\x35\x62\xf1\x03\xe2\xa0\xda\x43\x80\x11\x06\xcd\xae\xa7\x69\x80\xa6\x2e\xd4\x29\x5c\x44\x9a\xdf\xea\x1d\xad\x0d\x3f\x8e\xec\x4e\x8e\x1a\xf1\x60\xa0\x9c\xdb\xfa\x91\xbc\x61\x74\x8c\xce\x0a\x54\x2e\x0e\xe2\xe0\x1a\x70\xc0\xeb\xba\xf3\x96\xfa\xe1\x70\xf3\x70\xcc\x62\xcb\xb9\x1b\x97\x85\xd4\xd6\x0e\x97\x49\x08\x65\x78\x7f\x19\x8a\x0a\x85\x97\x40\x9d\x01\x41\x1c\xd2\x3d\xda\xeb\x09\x8d\x25\xfa\xd2\x0a\x37\x85\x85\x17\x18\x5d\x0b\xdb\xca\x2e\x24\x1d\xc5\x60\xa1\x27\x35\x4b\xb9\xd6\xef\x4d\x2e\x08\x43\xf7\x68\x01\x1c\xd2\x75\x7a\x3c\x3c\xe3\x36\x5d\x8b\x0c\x91\xb9\x25\x3f\x41\x35\x85\xef\xb5\xb2\xfb\xe1\x2b\xf4\xec\xd9\x36\x5b\x6f\xae\x73\x27\xfa\xa0\x40\xfb\x77\x00\x0e\xae\x81\xfc\xbc\x61\x7a\xff\xe9\xf5\x1d\x53\x56\x39\x8e\xab\xbd\x2f\xd7\x9e\xc7\x5c\x49\x14\x5c\x2b\x0c\x31\xa0\xdf\x14\x8c\xd6\xd6\x20\x41\x68\x00\xc4\x41\xb5\x87\xa2\xff\xae\x01\x50\xaa\x3b\x4d\x03\xcf\xab\x34\x02\xe6\x42\x95\xa9\x05\x2c\x96\x9b\x59\xa8\x9d\x7c\xbb\x55\x5e\x92\xcb\x5c\xfb\xdd\x82\x29\xf8\x83\xc6\x64\xba\x4c\x0c\x31\x76\x10\x07\xd7\x40\x4c\x3e\xd9\x45\x03\x8c\x1f\x16\x1e\xc7\xc9\xaa\x8f\x43\xa8\x96\x59\x4b\x33\x56\xbb\x58\xf2\x17\xcc\xb8\x6e\x0e\x2c\xe2\x65\xec\x43\x7b\xad\x00\x0e\xae\x81\x29\xf6\xa3\xc2\x18\xf9\xe1\xd2\xa1\x52\x6f\x3d\x53\x03\x7a\x91\xbe\x0a\xae\xe2\xe1\x77\x12\xfa\x55\x82\x8d\xf5\x0c\xf4\x2c\x85\x88\xb8\x20\x0e\xae\x01\x1d\x8c\xb7\xfb\xd7\x69\x39\x71\x6c\x4f\x38\xb9\xbd\x42\x4b\x2a\x50\x0d\x99\x2e\x32\x46\xee\x1e\x60\xbf\x24\x44\x19\x60\x42\xfb\x09\xdd\xd3\x07\x70\x70\x0d\x14\x9e\x8f\x1e\xa2\x95\x7b\xfd\x74\x31\x0d\x5b\xda\x8e\xbc\x14\x07\xf7\x39\xfe\x20\xbb\xef\xc7\xa3\x17\x4e\x6d\x76\xc9\xd6\x06\xd9\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\x34\x0d\xdc\xd9\xbc\x2e\xe0\x75\x27\xf8\x0f\x2e\x3a\x7f\xd2\x74\x9a\xf2\xa5\xc9\xdd\x41\x01\xa2\xe9\xd7\xe1\xdf\x2f\xbd\xd6\xe2\x6f\x7f\x80\x8f\x18\x3b\x88\x83\x6b\xc0\x2f\xe1\xa4\x9d\xf6\x8e\x11\x73\x62\x69\xba\x42\xa2\xc3\x85\x49\x7e\x4b\xee\x98\xe4\xcc\x58\xc5\x07\x2a\x04\x65\x6c\x1b\x98\xd0\x8d\x13\x10\x07\xd7\xc0\xee\x79\xa2\x6b\x52\x66\xed\x79\xc4\x18\xcf\xda\xef\x7a\x25\x13\xf3\x10\xce\x89\xb1\xcc\x26\x34\xa2\x33\xf0\xf9\xe3\x8e\x32\xa4\x42\xb5\xc2\x00\x0e\xae\x81\x57\xae\x35\x16\x25\x74\x9d\x2d\x11\xa3\x2f\xbc\xd2\xed\xea\xba\x0e\x22\x09\x70\x6c\x56\xdc\x19\x5e\x1c\x4f\x76\xd1\xb9\x92\x40\xc6\x1d\xc4\xc1\x35\x90\x26\xd3\x1c\x2f\xba\x83\x1f\x40\xf5\xe6\xfb\x9b\x81\xb0\x16\x13\xe3\xc1\xdf\x3f\x16\xc9\x72\xa2\xd7\x95\x37\x35\x4d\x0d\x9a\xf4\x10\x1a\x00\x71\xd0\x3c\xe0\xf0\xef\x46\x18\x64\xa2\x4e\x37\xc2\x8e\x3d\xb2\x19\x29\xd6\xcb\x62\xca\x59\x66\x46\xa5\x3d\xbc\x5c\x6d\x2c\xb5\x63\xdf\xa6\xcd\xe6\x88\x38\x0f\xef\x7d\xd9\x73\xaa\x45\x98\x4a\x10\x87\x6c\x84\x63\xac\xd2\x3c\xb2\xaa\x47\x48\x92\xd0\x8c\xae\xb0\x5d\x32\x1a\x45\x5d\x1c\x1f\x5f\x41\x7d\xc7\x39\x4d\x72\xa3\x2f\x60\x54\x7f\x0d\x11\x19\xc4\x21\x1b\xe1\xca\x09\x54\x16\x82\xde\xe7\x1e\x5b\x51\xef\x64\xee\xa3\x3b\x5e\x0d\xac\x9f\x17\x2f\x3e\x79\x53\x29\xef\xfb\xa6\x8d\x82\xb0\xdd\x11\x11\x19\xc4\xfd\x8f\x11\xfe\x67\x9f\x72\xe0\x1b\xcb\x08\x23\x1c\xfe\x2c\xc5\xc3\x19\x2f\xc0\x9e\xe2\x70\x90\xa4\xea\x5b\xb1\xa0\x54\x5e\x33\x45\xb6\x2d\xc7\x80\xd4\x24\x47\x90\x60\xae\xf1\x3f\x9e\x7e\x4a\x78\x26\x50\x95\xc7\xcc\x7d\x87\x67\xe6\xb6\x40\xde\x51\xde\x60\x83\x91\xcc\xd4\x16\x5b\x9e\x7e\x60\x6c\x68\xe0\x82\xbc\xb7\xcd\x5f\xa8\x57\x6b\x27\x9d\x01\x86\xbc\x74\x5c\xbc\xc7\x61\x38\xe9\x6c\xee\xf2\xe8\x9c\xbd\x65\xff\xaf\xa7\x49\x27\x6e\x5b\xe7\x45\x26\x86\xff\xdb\x8c\x30\x68\x68\x7f\x97\x14\x23\x19\x61\xfd\x12\x09\xed\x8e\xb8\x82\xbc\xcd\x87\x97\x6f\x88\xa8\xe5\xd3\xbc\xdd\xf4\x0e\xee\xcc\x59\xb5\xd4\xe7\x33\x6f\x10\x6f\xd0\x6f\x39\x93\xc3\x4a\x64\x23\x8c\xae\x96\xa6\x99\x59\x7d\x52\xce\x37\x76\xa8\x46\x7e\x22\x6b\xa7\x46\x23\xf3\x26\xed\x77\xbb\xee\x8f\xa7\x73\xa5\x4f\xbf\xeb\x28\x9f\xc9\xd1\x2c\xb2\x11\x7e\xfd\xf8\x35\xe6\x13\x8d\x60\xad\xf3\xec\x97\x82\x12\x6e\x6c\x2d\x66\xf0\xa7\x36\x37\xe7\x84\xab\x69\xab\x1b\x72\x9a\xaf\x72\x3a\x9f\xc9\x68\x91\x8d\xb0\x9f\x55\x9b\xdb\xf3\x42\xa5\x09\x31\xe7\xb5\xa0\x05\xfe\xd9\x97\x53\x4e\x93\x1d\x8d\x4b\x3a\x5a\x34\xeb\xc2\x95\x5c\x09\x1e\x04\x67\x32\x5a\x64\x23\xcc\xa7\x34\x67\x18\x15\xcc\x8c\x99\x51\xd9\xc9\xd3\xaa\xbd\x31\x7a\xef\xc3\x75\xef\x0b\x64\x29\x4f\x72\x39\x5b\xc8\xc6\xcb\x16\xd5\xce\xcc\x08\x83\x44\x74\x5a\xe6\x33\x34\x1f\xc3\xb3\xf6\x6d\x48\xba\x58\xdc\xc1\x96\x6f\x54\xa5\x58\x9d\x91\x3d\x4d\xa1\xfc\x6a\xc3\x28\xe0\x46\x9f\xc2\x2c\x0e\x74\x17\x10\xc4\xc1\x33\x9f\x44\xd5\xad\x7a\xc3\xd7\xfd\x25\x0e\x57\x8e\xa2\x35\x5e\x3d\x6c\xb9\xf5\xf8\x9c\x27\xbd\xa0\x65\x96\x3f\xc3\x1f\x09\xc1\xdd\x1a\xe8\xd8\x0e\xc4\xc1\x33\xdf\x83\xd4\xde\xaa\x48\x37\x05\xb1\x49\x7b\x02\x72\xb6\x36\xcf\xaf\xb6\x4c\x1d\x3c\x66\xac\x4f\xa4\x78\x98\xb4\x2d\xd7\x54\x9c\xa0\xfb\xab\x20\x0e\x9e\xf9\xfc\x13\x9d\xf0\xbd\xcb\x03\xd3\x1d\x97\x83\xc9\xef\xe1\x7b\x59\xee\xa9\x1f\x77\x26\x19\xf0\x51\xa6\xeb\x27\xf1\x2d\x29\xb9\x2b\x41\xae\x0d\xc0\xf9\x49\xa3\xf8\xfc\xa3\xd6\xe5\xe6\xa2\x71\x39\x83\x85\xe3\x74\xb6\x4f\x9b\x48\xdc\xe8\x7b\x8a\xa0\xe1\x5c\xbd\x5a\xd1\x92\xca\x5b\x8c\x1f\xfc\x96\xe9\x07\x11\x46\x18\xc4\x41\x35\xc5\xff\x6e\x84\x41\x3f\xe8\xd3\x24\x50\xcf\x5c\xda\x45\x41\x20\x83\x35\x95\x1e\xe2\xfd\xc0\x61\x62\x72\xd2\x4b\xa8\x67\x88\xfd\xeb\x20\x8a\x69\xa9\x6a\x45\x99\x3e\x54\xa3\x0b\xe2\xe0\x12\x88\xbb\x13\x97\xa3\x33\x9f\xa2\x8b\xc2\xa6\xed\x18\x31\x36\x26\xbe\xf2\xf9\x89\xb9\x8e\x62\x70\x50\x5d\x37\xcb\xde\xe8\xe6\x7a\x24\xd4\x08\x14\xc0\xc1\x25\x60\xea\xe8\xa0\x8d\x73\x85\x69\x28\x9b\x23\x26\x43\x49\xe4\x89\x2a\xfe\xef\x67\x99\x7e\xf3\xf2\x21\x4b\xb7\x5d\x0f\x44\x82\xfa\xa0\xdd\x7a\x10\x07\x97\xc0\x28\x5d\x57\x44\x17\xed\x4d\xfc\xd9\xa4\xb7\x7b\xa6\x7a\x72\x1f\x74\x78\x76\xc9\x58\xad\x89\x6e\xd6\x9f\xe4\x1d\x13\x97\xd7\xd2\x42\xbd\xb1\x01\x1c\x5c\x02\x96\xf1\x3f\x2f\xb0\x86\x52\x07\xab\x99\x63\xa6\x0e\x4c\x95\x0f\xba\x2a\xde\x97\xbf\xb2\x9b\xd4\xc3\x70\xae\xc0\xe2\xb3\xe9\x82\x15\x62\xf1\x03\xe2\xa0\x62\x42\x80\x11\x06\xcd\xae\xa7\x69\xa0\xec\x91\xe5\xa7\x5c\x23\xb2\xf8\xef\x15\x33\x0e\x98\x5f\x68\xc2\x8d\xcf\x49\x3d\x2b\xee\xce\x8c\x7f\x2a\x39\xe4\x44\x2a\x53\x49\x02\x15\xe7\x01\x38\xb8\x06\xf8\xd5\x9d\x89\x6a\x18\xa2\x1a\x3c\x48\xae\x63\xbd\x34\xbb\x8a\xfe\xa9\xac\x93\x91\x81\x29\x61\x9c\xfc\x9b\xca\xfd\x42\xa2\x28\xe8\xa2\x05\x88\x43\x5a\x00\xc7\xd0\xcd\x10\x9b\x25\xbd\x9b\xb0\x3e\xec\xfb\xad\x91\xf7\xfa\xe8\x4d\xa6\x9d\xcf\x18\x81\x45\xce\x67\xaf\x2f\xd1\x74\x97\xa0\x0b\x27\x20\x0e\x49\x03\x5f\x7e\x75\x87\xda\x5f\x1a\xba\xbe\x28\x77\x7c\x3d\x4b\x24\x58\x96\x30\xc1\xd7\x6e\xa2\xff\x85\x79\x68\x69\x20\x27\x1f\x51\x1a\xa4\x01\x00\x07\xd7\xc0\x5d\xe5\xc2\xa0\x1a\x45\xba\x85\xea\x5a\x2a\x07\x43\x19\x97\x90\xb1\xc8\x66\x97\xd2\x89\xee\x65\xe6\xd5\x9b\x24\x87\x14\x55\xa6\x08\x0d\x80\x38\xa8\x98\x10\x60\x84\x41\xa9\xee\xd4\x13\xe1\x6d\x71\x91\xfa\x88\xd4\x8f\x1e\x74\x74\x09\xd4\x6f\xcc\x4c\xb0\xcc\x05\xbe\x6c\x87\xe4\xdf\x0d\x77\x7c\xb6\xf6\xa2\x56\x1a\x6a\x98\x04\xe2\xe0\x1a\x10\x72\xdf\xc4\x0b\xf9\xd9\xc6\x6a\x76\x3e\x71\x5f\xbf\xfe\x18\x07\xf7\xc1\xfb\x8d\xb2\x26\x4a\xd9\x9b\xaf\x4f\xfa\x59\x46\xdb\xff\x20\xe2\x82\x38\xb8\x06\x1e\xd9\xb8\x99\xb2\x25\xaf\xd0\x9d\x73\x35\xeb\xbe\xaf\x9e\xdb\x73\x6d\x25\x4d\xb2\xe3\x5a\x96\x13\xa7\x1c\xaa\x7e\x6d\x2a\x31\x34\x0f\x80\x38\xb8\x06\xbe\xa4\x30\x6c\x86\xd1\x14\x7e\x11\x99\xc6\xa7\xd9\xb9\x33\xfc\x9e\x76\xc9\x47\x61\xc0\x05\xf7\xaa\xab\x44\x2f\xee\xcb\x74\xd7\x5e\x44\x5c\x10\x07\xd7\x80\x62\x8e\x7d\xc7\xdb\x4a\x9d\x30\x34\x02\xa6\x21\x43\x01\xe2\x73\xf8\xa3\xc7\xab\x78\x2f\xbe\x2c\x2d\x2f\x99\x3c\xa7\xa9\x68\x86\x34\x00\xe2\xa0\x79\x00\x60\x84\x41\xeb\x8e\x53\x9f\x82\x14\x66\xe1\x8e\xda\x9e\x66\x4e\x41\x49\xb2\xee\xd4\xba\xb7\x52\x38\xb6\x1c\xb7\x18\x2f\x23\x16\xdf\x43\xf2\x95\x37\xdf\xc3\x05\x1a\x3b\x80\x83\x6b\xa0\x45\x49\xf5\x47\xcf\x52\xf9\xf2\xb8\x4d\x8a\xa0\xd6\xdb\x98\x5f\x2a\xeb\x54\xe3\xdf\x22\x7f\x5e\xa4\xa3\x6a\x76\x8c\x3c\x68\x82\xd2\x2b\x88\x83\x6b\x40\x64\xcf\xc3\x38\x5a\x69\xbd\xf2\x63\x90\x92\x8b\xa8\xb2\x3d\xbd\x2b\x57\x4d\x7b\x29\xc1\x5d\x92\x23\x19\xf5\xad\xaf\xb5\xad\xd0\x55\x6e\x10\x07\xd7\x40\xd2\x7b\x25\x9b\x30\xb1\x9e\x82\xeb\xca\x1e\x98\x91\x22\x2f\x04\x62\x9f\xb8\x30\x71\x47\x16\xbf\x3e\x12\x19\xf1\x0e\x40\x59\x81\x9a\x6e\x83\x38\xb8\x06\x9a\xf7\xf7\xf7\x28\xb5\xbf\xf7\xe7\xc4\x7b\x05\x50\xe7\xa4\x63\x34\x7d\xc1\x63\xf4\x74\x74\xb9\x3e\x78\x28\xc9\xd9\x74\x07\x9b\x18\xa1\x01\x10\x07\xcd\x03\x00\x23\x0c\x32\x51\xa7\x1b\x61\xb6\xf0\xd2\xc7\xce\x2b\x3d\x53\x9e\xd7\x08\x37\x7d\x76\x45\xe2\xb0\x1d\xb1\x12\x5a\x05\xa7\x5c\x39\x7b\xa4\x82\x72\xf7\xd2\xa9\xa1\x96\x59\x00\x0e\xd9\x08\x8b\x7a\xde\x0e\x2c\xf2\xb1\xc0\x3e\x17\xfc\xd3\x9a\x1b\x63\x58\xfd\xcd\xc0\x0e\xa7\x9d\xd8\x67\xfc\xaf\x21\x46\x2f\x88\xaf\xbe\xb8\x8b\x88\x0c\xe2\x90\x8d\x30\xd1\xc4\x6b\x93\xf0\x11\xe3\x0f\xf9\xf4\xc5\x0f\x85\xe4\x46\x0d\xc3\xb9\x5d\x02\x72\x1d\x39\x33\xae\x1d\x31\x7d\xba\x74\xfd\x5c\x20\x22\x32\x88\xfb\x3f\x4f\x1b\xff\xc3\x08\x83\x1e\x4d\x46\x18\x61\x56\x16\xca\x0f\x73\xe6\xaa\x17\xbe\xe6\x3a\xac\x94\xfc\xb6\xec\xc5\x6a\x0d\x2e\xa9\xa0\x3c\x41\xa7\x94\x2b\x52\x51\x16\xfe\x88\xf7\xb7\x11\x5e\x54\x31\x67\xeb\xf0\xd9\xbe\xda\xb8\x38\xb0\x5a\x20\xce\x61\xf6\xa4\x7d\x55\x73\x5b\x52\x83\x2e\x48\x67\xf2\xa7\xaa\x74\xd9\xf1\x5f\xe8\xd8\x8a\xef\x6f\xc5\xb7\x55\xb1\x54\x46\xae\x34\x6f\xcf\x85\xb1\x73\xf2\x8b\x97\xcb\x35\x8f\x51\xdc\x4b\x32\x2d\xca\x16\xbb\x47\xf6\xdf\x66\x84\x41\x43\xfb\xbb\x46\x18\xc9\x08\xa3\x31\x29\xaa\x47\x9c\x8c\x3b\x13\xb7\x3e\x1d\x4f\x0f\xfd\x75\xbe\x1c\xa5\x77\x99\x72\xca\xf7\x44\xb6\xe8\xc3\xd3\xdd\x39\x43\x97\x33\x39\xac\xe4\x43\xf2\x68\x87\x2b\xf4\x1d\x5f\x0c\x7d\xd6\x2b\x47\xaf\x8b\x99\xd3\xf3\x60\x0d\xbf\xca\x6c\x49\x49\xb9\x74\x8d\x50\xa1\x24\xee\x9e\x89\x01\xe9\x99\x1c\xcd\x22\x1b\x61\x2d\x53\x15\x3d\x0c\xfe\x2d\xb3\x66\xf7\xcb\x3f\xf1\x25\x3e\x51\x0f\xf0\x6e\xa2\x39\xdd\x79\xf7\x38\xe7\x4a\x0a\x81\x75\x3a\xaf\xfb\x99\x8c\x56\x17\xe9\xcf\xd2\xde\x7a\xb5\xf4\xa2\xc9\xc4\x23\xf5\x9d\xdc\xf7\x06\xb6\x2f\xcb\x37\x3a\xf2\xdb\x0a\xbe\xc4\xd6\xb1\x36\xbf\x63\xdc\x20\x57\x39\x93\xdd\x06\x1f\x64\x23\xac\x6a\xf8\x47\x64\x58\xe8\x1e\x11\x01\x7b\x8b\x92\xb3\xb1\xd8\x3b\xe7\xf3\xbf\xae\xcf\xe4\x9f\xcb\x89\x2f\xbc\x70\x3d\x57\xbb\xfc\x0c\x4a\x93\xf5\xff\x33\x11\x9d\x96\xf9\x8e\x19\x45\x14\xea\x4d\x83\x27\xd5\xea\x7a\x1a\x2b\x13\x94\x19\x9d\xa3\x69\x7f\xde\x6f\x35\x12\x65\x7b\x6c\x7f\xfd\xab\x43\x24\xb4\x05\x0c\xe2\xe0\x99\x8f\x2c\x49\x40\x54\x78\xc2\x2f\x8f\x14\xe3\xe4\x35\x2d\x4f\x2d\xef\x65\xb7\x77\x7f\x86\x8e\x15\xb2\xbb\x8a\x05\x3f\x57\xfc\x96\xba\x08\xb5\xa7\x00\x70\xf0\xcc\x37\xe7\xd4\xa6\x5a\xab\x24\x48\x9a\xac\x25\x83\x26\x62\x6a\x78\x97\xf7\x32\x15\x5f\xe7\xeb\xfb\xd4\xeb\x5a\x92\x8d\x6e\x56\x2a\xd0\xd3\x97\x20\x0e\x9e\xa1\x62\x32\x2e\x7d\x7c\x7b\x25\x43\x34\x02\x8d\xd2\xeb\xcd\x65\x89\xac\x06\xaf\x91\x3c\xcc\x2e\x14\xaf\x27\xec\x4c\x32\xb7\x8d\x94\x20\x83\x0d\xe2\xfc\xa4\x71\x60\x05\xb8\x7e\x09\x5e\xc5\x28\x4f\xa4\x2e\x1f\x9c\x6b\x42\xb1\x22\x8b\x6d\xc5\xe8\x25\x65\x38\xea\x18\x1a\xc1\xef\xea\x51\x33\xc4\x41\x18\x61\x10\x07\xd5\x08\xff\xbb\x11\x06\xfd\xa0\x4f\x93\x00\xda\xee\x8f\x59\x4f\x83\x9c\xe8\x76\xb4\xd9\x87\x1f\x65\x0e\xa5\xfa\x89\xaf\xda\x65\xf4\x99\x84\x56\xe2\x51\x7c\xc5\xf4\x2f\x08\x46\x0c\x1d\xc4\xc1\x25\xc0\x25\x7f\x71\x57\xac\xe4\x5e\x5b\x19\xce\x49\x04\x6d\x3f\x9d\x35\xf9\xa7\x11\x4b\xbd\x2e\xac\xf2\x2b\xb9\xdd\x11\xc9\x53\xf5\x50\x73\x2d\x10\x07\x97\x40\x89\xd7\x87\xb4\xc4\x02\xb7\x5f\xd7\x2a\xd5\xfd\x2c\x64\x1b\xbb\xbe\x68\xa7\xa1\x66\x30\xfb\xd2\x55\x90\x84\x8e\x0b\xb8\xc9\x08\x21\xe2\x82\x38\xb8\x04\xdc\xb0\x14\x97\x8a\x7c\xee\xbc\xcd\xfa\xfc\xba\xc1\x58\xf1\xf6\x4b\x8a\x1b\xb6\x78\x1f\x71\xbc\x9a\xdf\x6e\x5d\x89\xf9\xd3\xe5\x28\x88\x88\x0b\xe2\xe0\x12\xb0\x25\x50\xef\x88\x42\x93\xda\xe8\xaf\x19\xc0\x78\x99\xee\x28\xbc\x2c\xd1\x48\x81\xf2\x5e\xe1\xe2\xa7\x23\x2b\x7d\xdb\xcd\x59\x27\xc4\xe2\x07\xc4\x41\xb5\x81\x7c\xff\xbe\x00\x06\xcd\xae\xa7\x69\x20\xb7\x25\x26\xa6\xc3\x86\x29\xc3\xa4\x3d\x64\x41\x13\xf7\x7e\xee\xab\x16\xd2\x3f\x2f\x49\xd1\x31\x62\x83\x2e\x57\xba\x8f\x7c\x6b\x41\x8c\x1d\xc4\x21\x3d\x84\x3d\xb6\x7c\xc2\xd0\x5e\xa4\x4c\xbe\xc0\xa4\xe2\x8c\xba\x7f\x87\xee\x31\x5a\xed\xea\x8f\xce\x6d\xb4\x73\x37\xbb\x12\x05\x08\xa0\x57\x4a\x41\x1c\x5c\x03\xa8\xa5\x97\xf8\x93\x36\xbe\xf4\x97\x65\xb2\xb0\xdc\x40\x89\x1e\xfd\xe0\x77\x55\xfa\xc1\x07\x7c\x4d\x5b\x3d\x77\x9e\xaf\xba\xc9\x90\xb9\x02\x71\x70\x0d\x08\x35\x74\x71\x90\x4a\x88\x1d\xe1\x29\xbc\xde\x1a\xea\x99\x77\xcf\xbd\x1c\x66\x3d\x4d\x59\x72\xd8\x5f\xea\x17\x95\x35\x8a\xb9\x02\x99\x36\x00\x07\xd7\x40\x6c\x75\xe0\x5d\x81\x6d\xfd\xf6\xf0\xe8\x66\xb2\x8e\x69\xe9\xa8\x9f\x36\xb5\x26\x76\x3b\x1d\x63\xbe\x6b\xaf\xac\x7f\x7d\xa3\x63\x40\x68\x00\xc4\x41\xb5\x81\x00\x23\x0c\x4a\x75\xa7\x69\xe0\xf5\xa5\x80\x5b\xc2\xc3\x73\x0a\x99\x5b\x05\x85\x2d\x77\x08\x39\x35\x6a\xd7\x96\x47\xe3\xc5\xda\xb5\x97\x70\xc8\x3f\xd6\x8a\xe7\x21\xc6\x0e\xe2\xe0\x1a\x20\x4a\xda\xee\x70\xaa\xd5\xbf\xe6\x6d\xa0\x7c\x92\xed\x53\x85\x22\x88\xd2\xac\x2b\x1c\xcb\x5f\xe2\xfa\x9b\x7e\xd1\xf4\xe2\x6d\xa8\x57\x00\x88\x83\x6b\xe0\xf6\x1e\xdd\x63\x34\xca\x3f\x1b\x27\xe1\xed\xda\xa4\x35\xcc\x18\x06\x8c\x0b\x29\x84\x5b\x55\xb5\x6d\x46\x6a\x05\x7a\xd2\x19\xb6\x88\xb8\x20\x0e\xae\x01\xff\x0b\x49\x8f\xed\x42\xb8\xe6\x09\x12\x47\xad\xb4\x6b\x5b\xe4\x78\x5d\xb7\xa8\xe4\xdd\x88\x7a\xa7\xca\xa3\x53\xdd\x07\x26\x2f\x43\x7b\xa2\x00\x0e\xae\x01\x87\x96\x57\xa2\xd2\x1c\x15\xbf\x93\x3c\x8a\x3a\x22\x3e\x4a\xaa\x70\xcb\xe7\xee\x74\xef\x71\xea\xad\xee\x4c\x52\x96\xff\xe1\x2a\x45\x68\x00\xc4\x41\xf3\x80\xee\xbf\x6b\x00\xb4\xee\x38\x4d\x03\x3f\x5b\x1c\x02\xad\x22\x53\x15\x89\xcf\x79\xc9\x0c\x6b\x72\x7e\x13\x3a\xa9\x9c\xf5\xa1\x8f\x97\xa8\x7b\x64\xa3\x28\xca\xea\x08\x75\xad\x03\x71\x70\x0d\xa4\x8e\x7c\xed\x1e\xc5\x35\xe5\x55\x6b\x72\x4c\xb9\x7f\x9b\x21\xc9\x73\x57\xba\xbf\x8a\xa4\xcb\x33\xd0\x2f\xea\x3e\x6d\x08\xe9\x73\x44\x5c\x10\x07\xd7\x80\x60\xde\xaf\x17\x41\xd6\x72\x6f\xe6\xdb\x2f\x3e\x59\x0f\xc5\x89\x4d\xa9\x44\x15\xe9\xbc\xf1\x81\x4b\x6a\xdc\x48\xaa\xb6\xa5\x0d\xba\x76\x0f\xe2\xe0\x1a\xb8\x6d\x1f\xe9\x62\xb4\x3c\xcd\x37\xc3\xce\xeb\x11\xb0\xc3\x97\xc0\x7e\xb2\x95\xa9\x95\xcf\x10\xf3\xca\x85\x7e\xa9\x4e\x1d\x05\x5a\x16\x81\x38\xb8\x06\xc2\x3e\x7c\x54\xcb\x9c\xb9\xe8\xe3\x9a\x3b\x34\x59\x21\x16\xa5\xfa\x85\xbd\x5b\xae\x81\xa8\x7e\xeb\x51\x51\x7d\x89\x8e\xb7\xce\x53\x84\x06\x40\x1c\x34\x0f\x00\x8c\x30\xc8\x44\x9d\x6e\x84\xd7\x8d\xec\x3e\xd0\xbd\xe9\x2d\x5a\xb9\x55\xfa\x4e\x2a\x99\x7b\x80\xd4\xa6\x87\xe2\xbe\x9b\x66\xe1\xf5\x80\xb9\x4a\x8f\xda\xb9\xeb\x08\x53\x09\xe2\x90\x8d\x30\xfa\x81\xe9\xd6\xf1\x31\x7e\xe8\x1e\x0a\x73\xd6\xb9\x5d\xd5\x03\x99\xba\xdf\x8f\xee\x8d\x04\x16\x2a\x55\x45\x8e\xb3\x9e\xd7\x33\x40\x44\x06\x71\xc8\x46\xd8\xf2\x51\x67\x4e\x5f\x65\x88\x3f\x71\xa6\xc9\x35\x19\x55\x59\x12\x1f\x06\xff\xe1\xb8\x2b\xc7\x9f\x1f\xac\x85\xb6\x48\xb1\xba\xa6\x23\x22\x83\xb8\xff\x31\xc2\x28\x68\xff\x88\x0c\x7a\x05\x19\x61\x84\xb1\x50\xea\x95\x83\x84\x75\x23\x2c\x0d\x37\xde\xab\xdd\xe8\x1d\x21\x4a\xb6\x11\xd7\xff\xb6\xbf\x9c\x67\xa9\x9a\xe9\xab\x2d\xee\xfe\xb7\x11\x16\x9a\xe8\x3e\xbf\x6b\x69\x4d\x85\x65\x7f\xb8\x97\xd4\xd8\xf4\x87\x27\x4d\x4d\xda\xc7\xec\xda\x5d\x66\x45\x2d\xbb\x5f\xb2\xaa\x7f\x3f\xde\x9b\xc4\x48\xdd\xa1\xfd\xa6\xee\xc2\x45\x8c\xcf\x85\xa2\xf5\x1b\xfd\x6b\x15\x04\x71\xdf\x8b\x43\xce\x93\x8a\xba\x52\x93\xab\xdf\x25\xfa\x6f\x33\xc2\xa0\xa1\xfd\x5d\x23\x8c\x64\x84\x63\x31\x8d\x3a\xf2\x53\xc4\x44\x4d\x5a\x4d\xf3\xb3\x97\x33\x1e\x0c\x0d\x65\xf1\x5d\x3d\xb1\x8e\x2d\x66\x7b\xbd\x85\xa1\x6e\xbc\x75\x26\x87\x95\xc8\x46\x98\xef\xa0\xe7\x8a\xef\x21\xf3\xb6\xb7\x69\x66\x27\x47\xc8\x77\xfb\xa8\x20\x5f\x8e\xf1\xd5\x25\xce\xd4\xe6\xd1\x17\x52\x68\x8e\x76\x67\x72\x34\x8b\x6c\x84\x97\xc6\x1e\x58\x2b\x5d\xf2\x10\x08\x75\x97\xd6\xea\x9d\xad\x71\x46\xf5\x79\x2b\xdd\x79\x6e\x4e\x82\xb2\x6d\x24\xf6\xc2\xd1\x1d\xe3\x33\x19\x2d\xb2\x11\xc6\xd7\x68\xbf\x29\x30\xc5\x23\x7f\x74\x4d\x38\x5d\x5e\x6c\xb0\x8e\xe1\xe0\x53\xb1\x3d\xfb\x5d\xfb\xc8\x0f\x2e\x9f\xa5\x43\xa5\xf2\xcf\x64\xb4\xc8\x46\x38\xe1\x92\x82\xdf\x70\xce\xed\x5b\xef\x16\x94\xb6\xa8\x38\x5a\x12\x3a\xf2\xa4\x62\xd1\x04\xeb\xcc\xd9\x64\x6f\x36\x6c\x96\x11\x5f\x3a\x33\x23\x0c\x12\xd1\xa9\x45\x41\xc5\x5f\xdc\xde\xd7\x86\xad\x6d\x46\x6a\x3d\x63\x8c\xbf\xdf\x92\x1d\xd6\x45\x53\xbc\x3c\x92\xcf\xfb\xde\x9a\xdb\xe7\xe4\x32\x29\x54\x14\x04\xe0\xe0\x99\x8f\xc7\x36\xef\xde\x07\xc2\x8b\x44\xee\x5a\xbb\xb2\x4c\x54\xcf\x85\xf0\x5f\x3e\xa1\x36\xd1\xbb\x9c\x54\xe3\xa9\xe6\x71\x25\xa9\x6c\x01\x11\x17\xc4\xc1\x33\x1f\x6b\xef\xd8\xb4\xd0\x35\x16\xe3\x3b\xb4\x5e\xea\xf5\x7e\xf1\x96\x0f\x38\x4b\xdf\x3b\x47\xed\x70\x2d\x0b\xce\x2b\x78\x37\x4f\x43\x85\xa7\x20\x0e\x9e\xf9\x70\x8c\x0a\x06\x0d\x42\xfb\xdf\x3a\xf6\xaf\x8a\x7f\x4d\xba\x7e\xf2\xf6\xab\x9a\x06\xd3\x52\xcc\xe5\xd2\x76\x8f\xf7\xe6\xef\x33\xa0\xee\x18\x20\xce\x4f\x5a\xf2\x9f\x1d\x68\x5e\x65\x2b\x8e\x0f\xc4\x61\xa9\x5a\xcf\xc6\x48\xb6\x51\xaa\xba\xed\x91\x51\xbe\x7f\x88\x22\xa3\x95\x8e\x26\x95\xfe\x87\xda\x0b\x61\x84\x41\x1c\x54\x23\xfc\xef\x46\x18\xf4\x83\x3e\x4d\x02\x9b\x51\x31\x6f\x48\x15\xc5\x5f\x37\xce\xac\x76\xa7\x8e\x56\x77\x06\x56\xf4\x35\x2a\x7d\x23\x70\x0a\x16\xfa\xce\x6d\xec\x76\xad\x15\x31\x74\x10\x07\x97\xc0\x25\x96\xa7\x68\x07\xfb\x65\x2d\x6c\xbc\x77\x7c\x98\x70\x75\x15\xf2\xf5\xcf\x5d\xe8\x8b\x6e\x7d\x26\x60\xbc\x98\xd1\xe2\x83\x1b\x82\x88\x0b\xe2\xe0\x12\xc0\x6c\x2e\x69\x2c\xde\x2f\xb2\xc1\x22\xbb\xf1\x45\x68\xca\x88\x6b\x29\xf7\x48\x32\xd4\x6a\x74\x8d\xaf\xf4\x7b\xc5\x07\xf3\x6a\xc8\x60\x83\x38\xb8\x04\xec\x30\x32\xaf\x10\xb8\xa2\xd3\x24\x24\x1e\x55\x45\x10\xac\xa1\xe3\x5b\xe6\x57\x94\x35\xdd\xbf\xd7\xbe\xc9\xac\xb1\xd3\x78\x9f\x19\x6a\xbc\x02\xe0\xe0\x12\xa0\x78\xeb\x36\x9d\xab\x64\x34\x37\xf6\x73\x43\xde\x97\x8a\x3f\x92\x26\xd7\xd2\x85\xe8\x89\xec\x95\xaf\x0b\xb6\x75\xf4\x06\xf7\xdc\x11\x8b\x1f\x10\x07\xd5\x06\x02\x8c\x30\x68\x76\x3d\x4d\x03\x2a\x05\xe3\xb4\x33\xf6\xd8\xa8\x9b\x79\xdb\x17\xf9\xc7\x05\x2f\x36\x2f\xb3\xd9\x25\x2c\xb5\x08\xba\x2c\xa0\x53\x58\x84\x72\xa7\x43\xed\x95\x01\x1c\x5c\x03\x45\x1f\x3a\xd5\x6c\xdf\x8b\x3d\xcd\x16\x7f\x60\xcc\x92\x2e\x28\x5e\x70\x20\x7b\x49\x8b\xe9\x72\x14\x77\xcb\x15\x15\x19\x15\xa5\x6d\x44\x5c\x10\x87\xb4\x00\xae\x11\xab\x57\xe0\xf5\xd3\xc0\x7a\xd9\xb9\xac\xe2\xc8\xe9\x3a\x7c\xd9\xe2\xbd\xf2\x01\x35\x71\xb2\xff\xbb\x97\x3e\x82\x83\x0e\xd0\x02\x18\xc0\xc1\x35\x40\xfa\xd8\x0d\x03\xa7\xb8\x47\xd9\xfd\x65\xd0\x39\x5b\x82\x83\x3e\xfa\xcd\x87\x28\x8d\xa9\x89\x26\xaa\xf7\xa7\x29\xae\x9b\xa4\x43\x0b\x60\x10\x07\xd7\xc0\x23\x94\x96\x86\xb2\xd7\x1f\xa2\xdd\xcd\xc6\x24\x4f\xee\x84\xc8\x8d\x33\xaf\x95\x52\xb4\x05\x6d\x06\xec\x5c\x70\x78\xfa\x3d\x96\x02\xa1\x01\x10\x07\xd5\x06\x02\x8c\x30\x28\xd5\x9d\xa6\x81\x7d\x46\xee\x70\xf1\x8b\x74\xad\xaa\xca\x16\x22\x3c\x52\xae\x84\x54\x65\x4e\xee\x69\xe8\x3f\x71\x4e\x16\xd9\x56\x48\x4d\x13\xed\x11\x63\x07\x71\x48\xdd\xe6\xb9\xc2\x78\x76\xfa\x42\xe3\x5e\xe1\x87\xdf\x42\x0f\xd4\x8b\x73\xed\x10\x0e\xd0\xf4\xf8\x81\xa9\xbd\x9f\xaf\x38\x9d\xca\xe0\x09\x75\x9b\x07\x70\x48\x27\xc2\x1b\x39\xf7\x56\x33\xe8\x68\xbe\x88\xb0\xfb\x05\xd1\xcd\x17\x18\x8d\x34\xc6\x50\x3f\xca\x3c\x56\x0f\x1f\xd7\x97\x78\x19\x68\x09\x9d\x08\x03\x38\xb8\x06\xd8\x23\x33\x04\xae\x2c\x06\x7f\x95\xb6\xf1\xb0\xca\xd2\xfb\x3d\xa3\x57\xbb\xb1\xf7\xa4\xaf\x8c\xbb\xac\xb0\x3d\x49\xa0\x90\x1b\xea\x99\x00\xe2\xe0\x1a\x78\xf3\x81\xb5\x5a\xa9\x44\x89\xe0\x5d\xb3\xf7\x06\x07\x3b\x2d\x85\x2e\xa5\xf9\xfc\x2f\x0b\xd3\x91\xb0\x0e\xd1\xe6\x26\xe6\x9b\x97\x10\x1a\x00\x71\xd0\x3c\x00\x30\xc2\xa0\x75\xc7\xa9\x8d\x13\x31\x17\x45\x87\x9b\xa8\xc7\x0f\xc5\x18\x85\x2d\x0d\x29\xa8\x84\x1d\xb9\x1b\x8e\x49\xc5\x62\xb1\xf6\x96\x3f\x7e\x13\xf5\x84\x9e\xe8\x02\x71\x70\x0d\x84\x9e\x8b\x33\xd7\xde\x96\x7a\x63\x88\x5a\x9f\xe9\x6d\xd1\xce\xed\x8a\x43\xe3\x98\x37\xb7\xcb\x47\x40\x5d\x24\xce\x23\x7d\x17\x7a\x1c\x02\xc4\xc1\x35\x50\x1d\xf5\x68\x36\x31\xa8\xb6\xc0\xfb\x63\x65\xf2\xec\xd6\x97\xdd\x43\x9a\x17\x07\x3d\xee\x87\x2a\x8e\x85\x6e\x7f\xbc\x5e\xa3\x6f\x22\xe2\x82\x38\xb8\x06\xd0\xe3\x0e\x1c\xd7\x47\x04\x65\xad\x54\x25\x44\x64\xab\x02\x46\x67\x26\x15\xe7\x76\x1d\x36\xf4\xc2\x34\xeb\x8f\x03\xbc\x95\x66\x11\x71\x41\x1c\x5c\x03\x59\xab\x34\xa4\x82\xb5\x34\x58\x99\x3c\x79\xbf\x30\x3c\xb8\x77\x0f\x14\x5a\x6b\xeb\xc3\x74\x13\x87\xde\xe8\x39\xc6\x8a\x71\x25\x23\x34\x00\xe2\xa0\x79\x00\x60\x84\x41\x26\xea\x74\x23\xbc\x7c\x6d\xee\x05\xa9\x62\xec\xfe\xa4\x9c\x6c\x23\x9d\xf6\xbe\xc6\x1a\xdb\xc6\xd5\x30\xc5\xc3\x30\x34\x63\x5e\x42\xd3\x7b\x42\xd1\x08\x53\x09\xe2\x90\x8d\xf0\x40\xbc\xf9\x00\xff\xfb\x35\xbc\x74\xa3\x69\xba\xae\x0b\xf4\x61\xe3\xd4\xa2\xf4\x0e\x97\xb3\xef\x7e\x2c\x16\xfb\xa4\xf6\xd0\x8c\x07\x11\x19\xc4\x21\x1b\xe1\x3b\xad\xbf\x23\xa4\x75\x93\xac\x6d\x66\xf8\x18\x45\x70\x79\xca\xcc\x1e\x86\x32\x5b\x54\xd3\x50\x67\x49\xda\x57\x5b\xc4\xcb\xfb\x21\x22\x83\xb8\xff\x35\xc2\xff\xb8\xce\x0e\x7c\xd6\x18\x61\x84\x03\x07\x7f\x3d\xbe\x20\xbc\x43\x9f\x38\x9a\x5e\x7f\x22\xda\xe7\x35\xc2\x9b\xbe\xb5\xeb\xb5\x72\x18\xc6\xf8\x44\xc7\x0f\x57\x62\xf9\x6f\x23\xdc\x70\xfe\x66\x05\xe1\x4b\x42\x79\xde\xf1\x04\xfc\x13\x3b\xf7\x6c\xef\xdb\xaf\xf2\xd9\x15\x08\x36\xe8\xb2\xe5\xce\xb3\xaa\xc5\xea\xfc\x85\x72\x18\x8c\x25\x56\x84\x5f\x10\xff\xfa\xfc\x86\x60\x78\x83\xc2\xf6\xf5\x5e\xf5\xa9\x7b\x27\xd2\xfd\x47\x37\x77\x54\x1c\xd2\x27\xae\xff\xb7\x19\x61\xd0\xd0\xfe\xae\x11\x96\x87\x9b\x25\x76\xaa\xcd\x8f\x97\x2b\x7d\xc8\xbe\x37\xbe\x94\x55\x5c\xbe\xfb\xce\xe3\x0f\x51\x8a\xfb\xe7\xd1\x4b\x29\xe5\x8f\x9c\xc2\xe2\x98\x83\xce\xe4\xb0\x12\xd9\x08\xdb\x27\x5d\xfd\x56\x27\xac\x43\x28\xf5\x47\xd0\xe6\xce\x8e\xfa\xe2\xfd\xdf\x4c\x5a\x0f\x6e\x7b\x1a\x6a\x2f\x7d\x99\xa3\xfe\x50\xdd\x73\x26\x47\xb3\x62\x48\x7f\x36\x2c\x9f\x5c\x74\xda\x09\x67\xe9\xc1\xbb\xfc\xdc\x21\x9d\x2d\x3e\x7d\xd1\x1b\x38\x95\x4f\x06\x2f\x3d\xc4\x41\x79\x2c\x74\x99\x88\xf6\x4c\x46\x8b\x6c\x84\x95\xf8\x07\x85\x2e\xd5\xf3\xa7\x92\xc7\xf9\x9e\xdc\x73\x57\x68\x91\x9a\x36\x1d\x54\x35\xfa\xa9\xbf\xd1\xc2\x71\xb8\x7a\x9e\xe7\xc3\x99\x8c\xd6\x11\xe9\xcf\x86\x72\xa4\x7e\x18\x79\xd4\x49\xc1\x60\xb5\x5c\xa4\x11\xd8\xd8\x8b\xd9\x77\xb9\x54\xaf\x4f\x8f\x40\x41\x41\xd4\xe5\x65\x3c\x81\xe3\x99\x19\x61\x90\x88\x4e\xcb\x7c\xa9\xbd\x2d\x65\xb7\x33\x3b\x59\x3d\x65\x51\x26\x7b\xfe\x94\xb2\xa0\x4c\xea\x65\x15\x24\xdb\xe1\x63\x1e\xc5\x0c\x5c\x2b\xb4\xc0\x86\xb6\x6a\x01\x1c\x3c\xf3\xa9\xa6\x90\x75\x6b\xec\x3c\xb8\x3f\xc3\xa1\xb3\xce\xd3\x70\xe0\xc4\x21\x63\x62\x8b\x46\x7c\x31\xba\x9e\xfc\xdc\x71\x40\xd3\x18\xd4\x79\x08\xc4\xc1\x33\x9f\x94\x2e\x7b\x8c\x77\x5f\xfb\xb3\x78\x11\x61\xd2\x42\x7d\x1b\x8d\xb6\xcb\x36\xe9\x2f\xee\x3a\x1c\xd6\xbe\x65\xfb\xf9\x73\xc7\x9f\x1d\x11\x17\xc4\xc1\x33\x1f\xaa\x77\x83\xa1\x80\x98\xbf\x59\xf3\x09\x46\x6d\x97\x9b\x7b\x6d\x7b\xc0\x8b\x9d\xb0\x9f\x7f\x92\x7b\x06\x23\x1b\x07\xad\x8f\xee\x43\x47\x4c\x00\x0e\xfe\xef\xad\x0f\x44\xc3\xa8\x2c\x11\x69\xd5\x5a\x4a\xa9\x4d\x11\x55\x2e\x1a\xc3\xbc\x9b\xf8\x92\x90\xbf\x28\xe7\x91\xe2\xb7\x35\x13\xa9\x61\x84\x11\x06\x71\x50\x8d\xb0\xfc\xbf\x2e\x7e\x40\x3f\xe8\xd3\x24\xd0\x4b\x32\x1e\x4d\x76\xbb\xdb\xfe\x47\xe3\x8e\xdc\xe8\x97\xd9\x85\x9b\x26\xcb\xec\xce\x29\x35\x57\xf7\x12\x58\x6c\xa7\x56\x0c\xa0\x46\xdc\x20\x0e\x2e\x81\x6c\x91\x5d\x93\x54\x85\x5f\xf5\xc9\xdc\x87\xc4\xfb\x07\x5f\x5b\x12\xef\x7a\xc9\xc4\x72\xa6\x8a\x60\xa6\x15\x87\x69\x89\x1d\x05\x21\xe2\x82\x38\xf8\x27\xf5\xc4\x9d\x9c\x7c\xc6\x72\xd7\x33\x7d\xda\x7f\x65\xc2\xe6\x9c\x9e\xa7\xad\x16\xe1\xb3\x9f\x0b\x52\xef\x75\x93\xd8\xf5\x96\xab\x68\x10\x71\x41\x1c\x5c\x02\x6c\x25\xdf\x5b\xa6\x18\x8b\x6e\x7e\xc3\x9f\x24\xb8\xdc\x50\x6f\x82\x12\xf0\x33\x47\xc3\x2a\xe8\x43\x96\xe3\xf9\xc6\xbc\xb0\xea\x1d\x44\x5c\x10\x07\xff\xf7\xfa\x37\x65\x62\xb7\xc6\xb4\xda\x7f\x8c\x24\xcc\xa6\x65\x99\x5f\x60\x58\xff\x14\xf1\xa6\x9d\xcc\x40\xcc\x5e\x6f\x91\xf9\x8b\x9a\x3c\x62\xf1\x03\xe2\xa0\xda\x40\x80\x11\x06\xcd\xae\xa7\x69\xc0\x55\x37\x3c\x55\x33\x43\x66\xbf\x4e\x79\xb6\x90\x80\x06\x3b\x72\xf4\xa3\xc7\xcb\xdd\x60\xb2\xf7\xb4\x56\x92\xcc\xdc\x24\x52\x59\x88\xb1\x83\x38\xb8\x06\x94\x78\x3e\xc6\x3e\x11\xab\x12\xfb\xf9\xb6\x82\xf4\xd9\xcf\xf7\xaa\x09\x55\x81\xe3\x52\x95\xbf\x19\xed\xc5\x23\x9b\xc2\xae\xe9\x50\x22\xe2\x82\x38\xf8\x37\xbd\x3e\x45\xa4\x10\x75\x23\xeb\x1b\x35\x89\x21\xd1\xb1\xdb\x9b\xab\x7c\x66\x8b\x03\x39\xfd\x97\x7f\x9a\xca\x1c\xaf\x78\x7f\x1f\x97\x46\xc4\x05\x71\x70\x0d\xd0\x65\x74\x86\xf8\x58\x97\x07\x92\x1e\xcc\x7f\x33\xee\x8a\xfe\xf4\xf8\x2b\x77\x5e\x6a\x61\x4b\x0d\x1f\x46\xcd\xab\x64\x5c\x4c\x68\xda\x02\x71\x48\x4f\x84\x51\x51\x5d\x0d\x1a\x7e\x4f\x71\x4d\x8f\x8c\x85\xb4\xbd\xa6\xf4\xf5\x9f\xf4\x63\xe9\xda\xea\x38\x72\xbe\x8b\xe4\x61\xd8\xd7\x71\x11\x1a\x00\x71\x50\x6d\xa0\xd8\xbf\x6b\x00\x94\xea\x4e\xd3\x40\x8d\xd1\xdb\x03\xc9\x5b\x99\xdb\x35\x5e\x9d\x1f\xb8\x0c\xed\x4d\x8d\x8d\xcb\x52\xcf\xc7\xd4\x15\x8a\x99\x86\x68\x6c\x74\x0f\x42\xf3\x00\x88\x83\x6b\xa0\x82\x3c\x84\xf4\xd3\xb7\x1d\x1b\xf4\x07\x55\x13\x4a\x64\xb3\xb2\x69\x34\x99\x46\xad\x6f\x13\x59\x9c\x79\xf0\xb2\x8c\xcf\xbf\x78\x84\x88\x0b\xe2\xe0\xdf\x14\xcd\x0e\x23\x31\x96\xf0\x56\xba\x89\xc2\x00\xf5\x72\xe0\xad\xdc\xaf\x58\xdb\x6b\x8e\xc2\xfa\x9a\xfc\xe7\x28\xf1\x36\x88\xdb\xa0\x6b\xbc\x20\x0e\xae\x81\xa0\xe4\xa8\x14\xbf\x70\x32\xcb\xcc\x27\x01\xe9\xc9\xd9\x2b\x19\x0d\x39\xaf\xf8\x35\xa4\xe7\x69\xbc\x0a\x27\x75\x2d\x14\xc8\x16\xa1\xbe\x89\x00\x0e\xfe\xef\x25\x42\xd1\x5a\xc8\x55\x30\xbd\x32\x54\xe1\xdf\xa7\xb4\xa1\x36\xfe\xd4\x45\x84\xb5\x4f\xc0\xf9\xa5\xe1\x78\x3f\x55\x68\x7a\xdf\x3c\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\x4d\x03\x17\x96\x74\x93\xee\x24\xc6\xa0\x6a\x45\x71\xd0\xa9\xda\x77\xf0\xae\xe7\xb3\xe5\x27\x5b\x8d\xdf\x0e\xba\xee\xdf\xa5\x97\x78\x19\x2a\x0f\x01\x71\x70\x0d\x50\x16\x73\x6a\x4d\xd5\x1a\x06\x12\xd9\x70\x07\xf2\xc6\xc4\xb7\x58\x13\xfd\xba\x85\x47\x13\xba\x48\x1b\xda\xff\xb6\x95\xdf\x03\xfa\xbd\x82\x38\xf8\x37\xed\x5f\x7e\xda\x91\x2d\x3c\x43\x19\x4d\x98\x98\x96\x46\xdc\x3c\xa0\xde\x1b\x63\xf2\x39\x45\x37\x48\x8e\xc4\x56\x53\x87\x91\x0e\xaa\xe7\x06\x71\x48\xb7\x02\x32\xeb\xfb\x8b\xf2\x54\x39\xff\xe0\x0b\x5d\xa0\x26\x3f\x37\xe5\xd0\x7a\xb1\x24\x7a\xaf\x8a\x9a\x7d\x71\xaf\x08\x3b\x76\x04\xda\xbc\x01\x71\xf0\x7f\xaf\xbd\xc3\x10\xdb\xc2\x06\x96\xa8\x4f\xc4\x77\xbd\x21\xbc\x5d\x57\xf6\x5d\x37\x79\x8d\x1f\x72\xe6\x27\x35\x1e\xc9\x0f\x9c\x03\xa5\x10\x1a\x00\x71\xd0\x3c\xe0\xf8\xef\x46\x18\x64\xa2\x4e\x37\xc2\x46\xa1\xa5\x1c\x81\x37\x7f\x69\xfd\xa9\xa9\x9b\x92\x48\x68\x4f\xcd\xcf\x15\x7f\xbc\xb9\x1c\x2c\x49\xe2\xb6\x90\xbe\x89\xda\xed\x84\x30\x95\x20\x0e\xd9\x08\x17\xbe\x21\x91\xae\xa5\x22\xeb\x88\xab\x58\x23\x34\xfd\x60\x5e\xca\xe0\x9d\x10\x3d\x51\x91\x60\xa7\x91\x68\x33\x20\xd4\x29\x25\x8b\x88\x0c\xe2\x90\x8d\x70\x7f\xa8\x1f\x01\xf6\x54\x53\x8b\xde\x76\x46\x79\xd6\x92\x32\x6b\xc0\xca\xe3\x11\x85\x1f\x4f\xa2\x9a\xd6\xa4\xdc\x2f\x45\x5c\x23\x47\x44\x06\x71\xff\x6b\x84\xff\xf1\x66\x35\xf0\x9d\x62\x84\x11\x5e\x7e\xa8\x4d\x96\xf7\xad\xc6\x58\xac\x4d\xa6\xff\xd6\xf6\x66\xa5\x01\x17\x6f\xce\x8b\xec\xdd\x4a\xec\xec\xbc\x9d\xf1\x2f\x6c\x29\xa1\xff\xff\x0c\x28\xa6\xda\xf8\x77\xf4\x06\x47\xda\x45\xcb\x0d\xe5\x82\xe3\xcf\x74\xa6\xe5\x18\x4d\xd8\xd9\x5b\xf5\x55\x66\x83\x1a\xd5\x31\x83\xbf\x25\x25\xff\xf7\x7f\xfc\xff\xb9\x11\xe6\xff\xcf\xfe\xb9\xfe\x98\x28\x28\xff\xfb\x91\x51\x7c\xa0\x2f\xf7\xfe\xc4\x5b\x92\x39\x48\xeb\xb2\x94\x64\x82\xe7\xae\x5f\xbc\x61\x6b\x44\xc9\x8f\x7b\xa1\x54\xa2\xd9\xed\xa3\xd5\xd3\x73\x5f\xf2\xff\xfe\x72\x53\xaa\x39\xe5\xc3\xb5\x54\xb7\xfe\x14\x49\xe6\x70\x68\x08\x16\x93\x1b\x04\xa5\xa0\x05\xac\xbc\x93\x9f\x74\x49\x57\xe5\xcd\x39\xfa\x0b\x95\xde\x29\x9b\x1f\x45\x7b\x6e\x8a\xea\xdd\xf1\xdd\x4a\x42\x8f\xd5\x5d\xe7\xed\x94\x78\x1d\x61\xb8\xf5\x44\x00\x76\x4c\xf7\x4e\xdf\x7f\xdb\x16\x02\x68\x68\x7f\x57\x57\x23\x6d\x21\xf0\xb5\x1b\xa5\x44\xe2\xaa\xda\x28\x89\x1c\x5a\x60\xd3\x5e\x9b\xd6\xad\x21\xe3\xb8\x26\xc2\x39\xec\x26\x7d\xe7\xf9\xd3\x4c\xa3\xf4\x33\x39\xe6\x45\xde\x42\xe8\xd2\x5e\xa0\x6f\xfc\x45\x44\xbf\xec\x67\x14\xa7\x32\x2c\x48\x5b\x6e\x43\x6b\x63\x7a\xac\xc3\xe3\xf3\xb5\x9e\x89\xf5\xe6\xc7\xa8\x33\x39\xd4\x46\xde\x42\x60\xb4\xaa\xfe\xc3\xa2\x79\xd1\xf3\xe7\xc0\x3a\xb7\x55\xc9\x2e\x29\x87\xfb\x23\x37\x97\x39\xf1\x00\x85\xe5\xd0\x4b\x2d\xaf\xe5\xcf\xe4\x0a\x7d\x03\xf2\x16\xc2\xab\xf0\x21\xf3\xcd\x1a\xad\x37\x13\x26\x2a\x9f\xab\xb3\xf8\x43\xa9\xed\x47\x55\xf8\x9d\x6d\x82\x08\x35\x34\xed\xc8\x9e\xb9\x9f\xcd\x11\x3e\xf2\x16\xc2\x09\xd1\xf6\xb3\xc5\x99\x8e\xb1\xea\x44\x19\xc6\x7e\xf5\xf0\x6a\xc1\x07\x8f\xc6\x7c\x19\x0d\xea\x57\x6b\xf9\x2b\xc3\x0c\x53\xd2\xce\x6c\x0b\x01\x24\xa2\xd3\xd6\x0c\xb4\xcf\x2c\x0d\x29\x37\x7c\x07\x8f\x99\xf6\x36\xc6\xc6\x33\x37\xd8\x31\x13\x46\x64\x3f\x1e\xc9\x3f\x77\x75\xba\xce\x11\x23\x39\x81\xc8\x95\x20\x0e\xbe\x66\x48\x9c\xec\x45\x91\x40\x7f\x16\xb9\x10\xcd\x40\xb0\x64\x2e\x39\x5d\x26\x41\xb3\x79\x8f\x2f\xcc\xe1\x5e\x6d\x53\x91\xd2\xd6\x44\x29\x22\x2e\x88\x83\xf7\xe9\xd0\xb2\x71\xc1\x14\x3e\x4c\x6a\xe9\x3b\x20\x13\x32\x47\x69\x9a\x7a\xef\x9d\x9d\xc4\x24\xd3\x70\xad\x18\x8f\x6d\x5f\xf5\x15\x2e\xd4\xbe\x0c\xc4\xc1\xdf\x52\x4c\xc3\x90\xe3\xe0\x9d\x79\xa6\xca\x89\x79\xfc\xe3\xfe\x33\xa9\xed\x83\x93\x35\xed\xe2\xab\x89\x25\xe6\xaf\x9b\x7b\xa3\x4c\x98\xad\x10\x71\x41\x9c\x9f\xf4\x3f\x7b\x54\xb0\xe3\x62\x18\xbf\xe4\xc6\xe4\xde\xfe\xf5\x42\x51\x63\xc4\xb1\x52\xfb\xf5\x9a\xb7\x38\x55\x97\x30\x7d\x11\x65\x53\x40\x88\xec\x63\xc4\x16\x02\x88\x43\x9c\xa5\x4b\xfe\xfb\x16\x02\xe8\x07\x7d\x9a\x04\x2c\xbd\xae\x07\x60\x07\x4f\xfe\xf6\x74\x37\x5c\xdc\xb5\xcc\x71\xbd\x3f\x4d\xf7\xa4\xd3\xc4\x4d\xea\x90\x6a\x90\x16\x45\xf7\x3b\x54\xa9\x0a\xe2\xe0\x12\xc8\x7c\x4f\x9c\x7c\x77\xe6\x60\x0f\x3f\x15\xaf\x49\x62\xf8\xd5\xe4\x95\xc8\xa6\xb8\xe7\x18\x79\xb2\xd5\x82\x7d\x6e\x92\x1e\xae\x43\x88\xb8\x20\x0e\x2e\x81\x28\x91\x8e\xcf\xe4\xe6\xd5\xd2\x17\x0e\xca\x30\x9d\xc5\x58\xf1\x2c\xb0\xd3\x99\xc5\xd4\xe5\x3f\x0c\xe9\xce\x3c\xde\xa9\xf5\x81\x9e\xe9\x04\x71\x70\x09\xd4\x6f\xfe\x36\x5a\xab\x0a\x42\x7d\x49\x7d\x09\xed\xfb\x42\x64\x38\xcf\xf3\xa4\xa2\x4b\xcc\xf9\x43\x82\x98\x07\xbc\x2f\xab\xee\x6a\x43\x55\xe6\x00\x0e\x2e\x01\xf3\x62\xbb\x5b\x74\x06\x6d\xb7\xf1\x65\x1c\xbd\x0a\xbb\x42\x83\x4b\xcc\x46\x3c\xe3\x44\x1d\xab\x47\x03\x3a\x9f\x5c\x3b\x19\x82\x96\x8d\x20\x0e\x3a\x3f\x01\x6c\x21\x80\x66\xd7\xd3\x34\x80\x39\x49\xe1\x85\x6a\xe9\x9f\xfa\xb1\x6e\xec\xdb\xcc\x43\xa6\x91\xf0\xcb\x1c\x79\x1d\xbd\xba\xf1\xbd\x9b\x74\xf7\xbc\x4c\xaa\xa0\x8b\xb4\x20\x0e\xae\x81\x2c\xd3\x2d\x7a\xd9\xc2\xd5\xab\x36\x2a\x3f\x46\x56\xf7\xc9\xdb\xfc\x7c\x17\x1c\x0c\x26\x48\x34\xd3\xef\x78\x7b\xae\x98\x5f\x81\xb6\x26\x40\x1c\x5c\x03\x58\xec\xe5\xe9\x8a\xea\xf4\x0c\xa5\x99\x4d\x35\x87\xb7\x6f\x6a\x54\x11\x96\x45\x1a\xb1\x9f\x37\x48\x4d\xb0\x38\x7e\x44\xf5\x11\xba\x52\x03\xe2\xe0\x1a\x18\xcd\xb0\x5e\x23\x4b\xf2\xfa\xb3\x47\xdb\x3c\x23\x32\xd0\xd1\xbc\xf2\x5b\x7a\x4c\x0e\xe5\xfd\x8e\x4e\x89\xf2\x2b\x4b\x57\x27\x72\xa8\xba\x1a\xc0\xc1\x35\x70\xbe\x81\xf6\x82\x9f\xe3\x38\x95\x82\x1d\x37\x3b\x53\xb9\xc6\x34\xbd\x30\xa9\x00\x43\x77\xe1\x92\x6d\x09\xd6\x1b\xd6\x02\xc2\x61\x84\x06\x40\x1c\x74\x8e\x0a\xd8\x42\x00\xa5\xba\xd3\x34\x10\x30\x21\xa2\xa0\x83\x7d\x99\xca\xa3\x6b\x47\x80\x3d\xcc\xe6\xe4\xed\xc6\xb4\xcf\x2f\x92\xc5\xc8\xa0\x1f\x97\xb8\x24\x9f\x38\xd7\x23\xc6\x0e\xe2\xe0\x1a\xa8\x25\x7a\xcb\x67\xf0\x34\x35\x55\x5e\x5f\xc6\xec\x43\x6d\xf2\xa2\xbd\xb6\xea\x04\x6b\x9f\x28\xf9\x7d\x0f\xf4\x4f\xe6\x18\x61\xd0\xd3\xca\x20\x0e\xae\x81\xe0\x04\x35\x2e\xae\xc2\x57\xf3\xb4\x7e\x84\xc7\x85\x81\x26\x75\xfc\x3c\xc1\x02\x57\x2c\x92\x09\xbf\xd2\x1e\x14\xb2\xc5\x53\xd3\x23\xe2\x82\x38\xb8\x06\x18\xaf\x6e\xbb\x54\x84\x93\x5c\x50\xd9\xf9\x7c\xb0\x54\xbc\x55\xf5\x5d\x5c\x80\xe3\xb7\x83\xa8\xe8\x75\x61\x06\xdf\x2b\xb7\xd7\xc3\x11\x71\x41\x1c\x5c\x03\x78\xb2\x37\xad\x07\xdf\x0d\x0b\x2f\xf7\xda\x49\xd2\x92\x19\x05\xef\xbe\xba\x22\x4d\x44\xdb\xbf\xd1\x47\x9a\xec\x99\xcc\xc5\xbb\x8f\xd0\x00\x88\x83\xe6\x01\xc0\x16\x02\x68\xdd\x71\x9a\x06\xac\xfd\x87\xef\x60\xaf\x51\x27\xbf\xf9\xf5\x15\x3f\xde\xe7\xcb\xae\xfd\xd3\xed\x47\xcc\xdc\x81\x94\x72\x2e\xeb\x8f\xda\x6f\x2b\x9e\x20\xc6\x0e\xe2\xe0\x1a\x78\x39\xe3\xde\xbb\x99\x97\x2a\xff\xd5\xb0\x98\x42\x99\xe8\x4b\xb1\x1c\x2d\xdd\xfb\x6c\x2d\xb6\xb7\xea\xb8\xa9\x6e\xe4\x5d\x8a\x03\x88\xb8\x20\x0e\xae\x81\x1a\x92\x93\x6f\x85\x9a\x83\x3a\x03\xce\xc6\xb4\xe1\x81\x1c\x4d\x23\xd6\xe5\x3a\x69\xc1\xb6\x8f\x1a\x7b\xba\xe3\xe7\x18\x6d\xf8\xa0\x6d\x2f\x00\x07\xd7\xc0\x0c\xc3\x5a\x83\x80\xa0\xa3\xec\xb3\x79\xd5\x6b\x34\x1d\xd2\xac\x77\x22\x88\x1e\xcc\x04\xbf\x1d\xe1\xb7\x45\xbf\xb3\x73\x68\x0b\x15\x58\x80\x38\xb8\x06\xb0\x71\x3a\xbe\x72\x45\xae\x86\xc5\xbf\xb0\x35\x38\xfa\xa4\x48\x46\xd5\xee\xa4\x1e\x24\x7b\xf8\xf8\x38\xfc\x8a\xe1\x42\xe2\x5a\x20\x42\x03\x20\x0e\x9a\x07\x00\x5b\x08\x20\x13\x75\xfa\x16\x42\xa6\xa3\x6f\x94\x14\x2e\x1a\x9d\xfc\xa8\x04\xc7\xd4\x82\x80\xca\xfd\x02\xaf\x50\xd9\x6f\x33\x93\x39\x74\x57\xdf\x30\xf8\xd9\xd1\x22\xec\x38\x88\x43\xde\x42\xd8\x27\xd0\x9d\x5b\x23\x99\x62\x98\x68\x53\xc3\x70\x49\x0b\x21\x63\x55\x39\x8a\x8f\x3b\xff\x78\x91\x72\x21\x70\x43\x9e\xf7\xfd\x07\x44\x64\x10\xe7\x27\x8b\x42\xfc\xcf\xc8\x63\x06\x5d\x4a\x73\x16\x56\xe4\x6f\xc4\x2a\x5f\x11\x4b\x0c\xe4\xa7\x11\x5d\x9e\xfa\x2c\x19\xd9\x4e\x99\x2f\xef\xc8\x25\xd7\x7d\x82\x88\x0c\xe2\xfc\x64\x31\x60\x5f\xe3\x3f\xee\xb7\x9d\x75\x71\x99\x47\x8e\x52\xbc\x7a\xf5\x4f\xc3\xb6\xa2\x57\xc9\xfd\xef\x33\xea\xaa\xf5\x72\x24\x6e\x13\xdb\x05\xcb\xd1\xd8\x19\xc4\x7f\x1b\x61\xa2\x3d\x8d\x91\x41\xfb\x30\x32\x46\xed\xdc\x3e\x89\xf0\x65\x69\xdc\xae\xb8\x0a\xcc\x37\xee\x28\xaf\xd3\xed\x8b\xab\xee\x1e\xfe\xf8\x0b\x55\x14\x53\xda\x71\x88\xf0\x0f\xf1\x1a\x91\xb3\x5f\xd8\x18\xef\x22\x65\x6c\x6f\x8b\xc6\x60\xb6\x7d\x72\xb5\x44\xfa\x2e\xa5\xd0\xcb\xff\x36\x23\x0c\x1a\xda\xdf\xd5\xd5\x48\x46\xd8\xa6\xfe\xdb\x74\xe6\xe3\xc7\x89\x28\x51\xd4\xcb\x18\xf7\x8e\x89\x58\x24\x18\x70\x0e\xf4\xb8\x9f\x3e\x79\xea\xc5\xf7\x9d\x3c\xe7\xe2\x99\x1c\xf3\xf2\x23\x79\xb4\x8c\xf6\x14\x21\x9f\xb0\x5d\xaa\x00\x7f\xf3\x4f\x7c\xcc\xfb\xbc\x3b\x3c\xc6\xde\x4a\x54\xb6\xeb\x05\x57\x8b\xb0\xd7\x37\xe5\xae\x9d\xc9\xa1\x36\xb2\x11\xe6\x3c\xbe\x3d\x2c\xa8\xbd\xca\x2c\x5c\xf7\x13\x25\x58\xd2\x42\x2f\x35\x6e\x9b\x3a\x4a\xaf\x9f\xce\xf2\x99\xf8\x8a\x93\xe5\x17\xaf\x33\x19\xed\x5d\xa4\x3f\x5b\xc3\xe8\x77\x97\x4f\xa0\x63\x0b\x97\x2f\xda\xcb\xa8\xdf\x5e\x90\x56\x6f\xc1\x3e\x79\x4c\xf0\x21\x57\xb7\x5f\x21\xfa\xf3\xaf\x77\xce\x64\xb4\xc8\x46\x58\xf9\x45\x97\x43\x31\xe1\xd8\xe2\xe7\x58\x4f\xec\x60\x65\xb9\x3d\xa5\xb9\xbb\x22\x2a\x96\x1d\xa5\x77\x4c\x5b\xc8\x6f\x11\xf6\x9d\x41\x51\xb7\xfe\x7f\x26\xa2\xd3\x32\xdf\x81\x71\xed\xec\x24\x5e\xc2\xf3\x71\x4b\xed\x3f\x9b\x32\x8e\x8f\xf0\xb9\xd3\x38\x76\x8e\x08\x19\x9b\xb8\xe4\x71\xce\xbb\xad\x47\x20\x66\x7c\x10\x07\xcf\x7c\xe4\xf3\x96\x8f\x8f\x86\xc7\xde\x4d\x91\x59\xcf\x8e\xe0\x63\x14\x44\xa7\x5e\xb4\xff\x71\x52\x49\xf9\xa4\x29\x73\x37\x72\xbb\x19\x7a\x22\x15\xc4\xc1\x33\x9f\x18\x4b\x99\x89\xe2\x0f\xf3\xa8\x9b\xec\x8f\x33\x8d\xb0\xd7\xbb\x4d\x19\x7e\xf6\x91\xf9\x3d\x0e\x6d\xf4\xbb\x1a\x28\xc5\xa4\x03\x1d\xa0\x80\x38\x78\xe6\xc3\xa2\x27\xa8\x70\xc9\x9b\x52\x3e\x56\x94\x53\x7b\xf7\xcc\x5f\xfc\xfe\xed\x6b\x75\x3d\x4b\xb1\x2a\xce\x79\x9f\xae\x13\x86\x5c\xd0\x80\x56\xd6\x00\xce\x4f\xfa\x9f\xa5\x39\x37\x16\xcd\xeb\x79\x7e\x5d\xe7\x20\x9b\x23\xe3\x0d\xc3\x4b\x49\x76\xb1\x6e\x24\x7b\x25\x84\x4b\x49\xea\x37\x14\xe1\xec\x52\x17\x84\x30\xc2\x20\x0e\x71\x96\xee\xf3\xef\x46\x18\xf4\x83\x3e\x4d\x02\xc3\x99\x36\x19\xaf\xcc\x7e\x3e\x57\x24\x55\xc2\x1c\xa5\x35\x6c\xae\x41\x51\x2e\x67\x94\x8f\x79\x49\x15\x65\xf2\xdb\x6c\x81\x0d\xaa\x50\x03\x71\x70\x09\x98\x75\x5f\xb7\x52\xfc\x96\x92\x93\xdb\x13\xfb\xec\x46\xf9\x25\xca\xe8\x10\x8a\x9c\x88\x30\xb5\xe9\xbb\x37\xf8\xfb\x96\x9d\x15\xcd\x11\x71\x41\x1c\x5c\x02\x37\x2f\xdb\x17\x3c\x53\x7d\x46\xba\xaf\xbf\xad\x9b\xb7\xcd\x66\x77\x3f\x2a\xd2\x37\xf5\x28\x28\xf1\xc1\xf9\x94\x9c\xde\xe6\xdc\x6b\x88\xb8\x20\x0e\x2e\x81\x2d\x06\xbe\x66\xb4\x35\x81\x84\x8b\x3e\xef\x14\xe4\x4c\x89\x45\x55\x56\x78\x66\x9a\xd6\xa8\x0c\x6a\xd8\x46\xc4\x95\x66\x89\xa1\x17\x68\x41\x1c\x5c\x02\x72\x05\xbd\xdd\xbe\x0f\xe4\xd6\xb7\x5e\x99\x55\x2b\xf9\xf9\xaf\x4b\x4a\xef\x4b\x5d\x5f\x9e\x5a\xac\xf2\x0f\xb0\xb0\xb8\x40\xad\x81\x58\xfc\x80\x38\xe8\xfc\x84\xff\xdf\x17\xc0\xa0\xd9\xf5\x34\x0d\x68\x16\x9f\xe0\x3c\x98\x37\x32\x4c\x4f\x93\x66\x31\xc4\xeb\xee\xfc\xf1\xed\xc5\x60\xe4\x21\xd1\xf5\xd9\x16\x67\x4d\x3d\xe9\x4c\x2f\xc4\xd8\x41\x1c\x5c\x03\x43\xa1\xd8\x77\x55\x72\xa8\x4b\x1e\xb0\x3c\xd5\x69\x6f\x35\x71\x7c\x73\xc2\xe3\xf8\xee\x6b\x02\x5f\x40\xbb\xbf\x09\x23\xfb\xcb\x4f\x88\xb8\x20\x0e\xae\x81\x7e\x0c\x7f\xca\x02\x2c\xc6\xf0\xa2\xd2\xf7\x86\x8a\x8f\xe3\xdf\x24\x5c\x30\x92\x79\x93\x7a\x6d\xf2\x47\x6c\x7f\xf9\xa3\xa3\x46\x74\xe8\x0c\x0d\xc0\xc1\x35\xc0\xa3\xd4\xf0\xec\x7e\xcb\x52\x7f\x81\xb0\xf9\xb4\xe0\x8b\x07\xa3\xe6\xc2\x77\xd3\xd6\x18\x9a\x13\x76\xd0\x1e\x6d\x11\x9e\xb7\x3a\x80\x6a\x61\x00\x1c\x5c\x03\xcc\x54\x0b\x51\x0c\x2b\x76\xb6\x3b\xfd\xdf\x39\x24\x5e\x45\x3b\x15\x91\x1a\x62\xb8\xbd\xc6\xe3\x37\x8d\x08\xa5\x7b\xa1\x98\xfb\x07\xa1\x01\x10\x07\x9d\xa3\x02\x8c\x30\x28\xd5\x9d\xa6\x01\xf5\x08\x6c\x31\xe5\xc0\x23\xbb\xa3\x0a\x4e\xdb\x93\x77\x5c\x28\x11\x19\xcc\xb2\x78\x65\xdc\x2a\x27\xdc\xb4\x5e\x47\x5e\xfd\xd0\x6b\xd9\x20\x0e\xa9\xcb\xc2\x3a\x63\x29\x3b\x53\xa8\xef\x09\x9a\x14\x6d\x69\x82\x6e\xc2\x52\x49\x40\x42\x01\xc3\x0e\x5d\xd3\xd6\x1e\x06\x9e\xd9\xfc\x38\xd4\x65\x01\xc0\xc1\x35\x40\xc4\xe2\xde\x4a\xba\xe2\xb1\x94\x25\xe6\x67\xa0\xa7\x62\xd5\x20\x93\x36\x58\x69\x4e\xda\x9e\x1f\xfb\xd4\xb5\x65\xbb\x9b\x18\x0d\xaa\xda\x06\x70\x70\x0d\xf0\xc6\x36\xe5\x6f\x9a\x58\x30\xbf\x1a\x10\xa5\xad\x9c\x91\x0a\x61\xc1\x11\x25\x6e\xf0\x1f\x7a\x71\x2b\x99\xef\x47\x1f\xeb\x00\xd4\x1f\x1c\xc4\xc1\x35\x20\x7a\x57\x64\x62\x4c\x77\x9e\x92\x9c\x41\x8d\x61\x91\x48\x24\x97\x32\xf4\xf3\x4b\xda\x2e\x79\xcc\x8f\xb6\xfa\x83\x9e\x8c\x12\xc7\x08\x0d\x80\x38\x68\x1e\xb8\xfb\xef\x1a\x00\xad\x3b\x4e\xd3\x80\x8f\x5b\x9d\x5b\xc8\xc6\xe7\xe7\x18\xad\xd1\x07\xed\xe6\x44\x77\x29\xae\x6e\xaf\xe6\x32\x0d\x46\x25\xd5\x6a\x7b\xa9\xdc\x3c\x80\x2e\x69\x83\x38\xb8\x06\x06\xf7\x1d\x68\xdb\x0a\xbe\x5b\xe6\xe4\xa7\x3e\x47\x0d\x8b\x8c\xc4\x99\x96\x44\xa3\x4b\x31\x3e\xea\xd1\xc5\x0c\x14\xec\x0a\x8e\x43\xc4\x05\x71\x70\x0d\xd0\xd9\x69\x19\x4d\xd1\xba\x3e\x4e\xb9\x5b\x66\x84\x26\xac\x69\xee\x55\x3a\x86\xdf\x18\x80\x32\x71\xfd\x39\xf7\xf7\x13\x9b\x4e\x33\xe8\xee\x0b\x80\x83\x6b\x00\xb5\x36\xf1\xa1\x40\xb5\xdf\x1f\xb6\xd1\xac\x51\x85\x80\xfb\xed\x85\xfc\xe7\x34\xfd\x8c\xef\x0b\x33\xaf\xcf\x2c\x33\x3c\x6f\xa8\x82\xae\xd6\x01\x38\xb8\x06\x54\xe5\xb3\x39\x0a\x8f\xf1\xb9\x1e\x76\x58\xc9\x3c\x59\x92\x7e\x59\x45\x66\x58\xd0\x49\x39\x1b\xf1\x32\x4a\xe7\x53\x5a\xb9\xf6\x3a\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\x64\xa2\x4e\x37\xc2\xdf\x94\xe4\xee\x89\x15\x5e\xd1\xc1\xca\x3d\xcc\x27\xcc\x18\xba\x48\x7d\xb2\xcd\xc6\x6d\x36\x24\xb3\x48\xf8\x67\x97\x52\x5e\xe4\x2b\xc2\x54\x82\x38\x64\x23\x9c\xa5\xce\xe9\xb5\xa2\xad\x3a\x71\x28\xb2\x16\x60\x7a\x70\x72\x42\x74\x23\xaa\xde\x5e\x86\x36\xd9\xe5\xea\xd7\x97\xe5\x32\x29\x75\x88\xc8\x20\x0e\xd9\x08\xcf\xb4\x91\xc6\xbf\xc3\x98\x57\xf3\xe7\xba\x4f\x37\x28\x72\xb5\x21\x9e\x94\xec\x40\x52\x18\xff\xf5\xba\x1c\xca\x53\xf3\x46\xfe\x03\x44\x64\x10\xe7\x27\x4b\x0c\xfb\x1a\xff\x71\xbf\x6d\x75\x01\x47\xa7\x20\x8a\x06\x8d\xa1\x92\x63\xf5\xae\x8f\x19\x77\xc6\x6b\x86\xbe\x7a\xe6\x7f\x17\xa4\x5a\x3a\x94\xbd\xde\x93\xce\xfc\xb7\x11\x96\x32\x76\x63\xcf\x8d\x93\x7a\x5a\xaf\x5d\xf3\xc0\x37\xab\x59\x40\x35\xe3\x9c\x6f\x1e\x35\xf5\x5a\x37\x6b\x4b\x27\xc7\x53\xb2\x8d\xbf\xd0\x7c\x59\xf3\xfe\x7a\xe1\x3d\x9b\xc7\x21\x31\x94\x18\xa3\x0a\xa9\xd5\x85\x38\xaf\xae\x5a\x66\xa1\xaa\xdc\xfc\x35\xf5\x28\x70\xd6\xe1\xbf\xcd\x08\x83\x86\xf6\x77\x75\x35\x92\x11\xee\xec\xce\xf1\xd9\x12\x51\xcd\x39\xfa\x7d\x61\x6f\xe8\xdc\xad\xdb\x1a\x65\xb7\xf7\x17\xd4\xd9\x26\xf0\x23\x5f\xb0\x54\x5a\xdd\xd5\x38\x93\xc3\xca\x53\x8c\xf0\x6f\xf4\x32\xfa\x8f\x2b\x34\xe1\xca\xbf\xc8\x5b\x5b\x1f\x90\x7f\xb8\x47\x2b\xe3\xc7\xa4\x29\x39\x14\xa5\x75\x01\xaf\x3f\x2a\xf3\x4c\x8e\x66\x91\x8d\xf0\x1c\x2f\xb3\x07\x9e\x64\xd6\x1f\x96\xd7\xbf\x68\xbc\xe4\x5d\x27\xcd\xb5\x56\x72\x25\xe6\xcc\x92\xdd\x2d\x71\x9d\x64\xda\x96\x30\xcf\x64\xb4\xc8\x46\xd8\xee\x29\x8b\xe1\x5e\xc1\x74\xf4\x45\xaa\xef\xd7\xe7\x2e\xea\xf1\x6d\xd3\xc6\x6c\x31\x72\x1b\xd5\xff\x31\x94\xdb\x70\xfd\x26\x68\x71\x26\xa3\x45\x36\xc2\xb7\x6d\x77\x1c\x94\x1e\x3a\xea\x08\x93\xcb\x9b\x32\x59\x67\x4d\x78\xc6\x86\x6f\x05\xb1\x51\xa4\x7b\x49\x7f\x9b\xb6\x41\xe9\xb0\x3f\x33\x23\x0c\x12\xd1\x69\x99\x4f\x66\xed\x87\xde\x78\x63\x2b\xe1\x43\xd7\xc0\x92\xc3\xb8\x89\xae\xe1\xcf\xb9\x32\xf7\x0b\x14\x19\x32\xf8\xdf\x8d\xc4\x4b\x50\x95\x23\x66\x7c\x10\x07\xcf\x7c\xf7\xb0\xc4\xe8\x50\x6f\x8e\xfa\x63\x05\x3e\x72\xd3\x7e\x20\x38\xaf\x76\xc0\x5c\x3d\xff\xb0\x0f\x9b\xc2\x99\xce\x28\x9e\x79\xea\x0d\x22\x2e\x88\x83\x67\x3e\xbc\x73\xc7\xdf\xd6\xf0\xae\x50\xe9\x18\xf7\x4d\xef\x3b\xf2\x62\x72\xfc\x30\xa1\x1e\x60\xab\xd2\x57\x0e\xf2\xad\xab\xe9\xbf\x00\x35\xd8\x04\x71\xf0\xcc\xf7\xf3\xbb\xf4\x82\xa2\x8d\x83\xa6\xc0\xaf\xdc\x13\xda\x06\xdf\x38\xf9\x11\xda\x6c\x19\xbd\xe9\xc2\x4d\x94\x2e\xa2\xf3\x38\x53\x53\x50\x7f\x15\x00\xe7\x27\xfd\xcf\x1b\x49\x6c\xc2\xb9\xbd\x38\x6c\x12\x77\xc2\x8c\xcf\x05\x88\xcd\xf8\x26\xdf\xa6\xbd\x6f\x59\xb7\x6d\x80\x6a\x97\xe8\xed\xee\xc6\x5c\x4c\x85\x30\xc2\x20\x0e\xd1\x6f\xbb\x01\x60\x84\x01\x3f\xe8\xd3\x24\x50\x8e\xa1\x50\x79\xe5\xa3\xe9\xe2\xb9\xa8\xef\x26\x22\x15\x54\x6e\x63\xa1\xf3\x9c\x51\x3f\x7a\x74\xfa\xef\x48\x49\x18\xdf\xa3\x9b\x43\x0c\x1d\xc4\xc1\x25\xe0\x14\x9d\xa8\xe9\xca\x9d\x48\xde\x75\xa8\xb6\x96\x67\x60\xef\xd5\x65\x1e\x9a\x99\xd4\x5d\xf9\xac\xe7\xee\xfe\x41\x8d\xd5\xc8\x3d\x44\x5c\x10\x87\x74\x12\xf4\xae\xfb\x64\x29\xc7\xb3\xa6\xff\x71\x9a\xfd\x03\x0f\x4b\x82\xc4\x7b\x33\x2b\xa9\x47\xc1\xd6\x6b\xeb\xe6\x9a\x56\x7e\xaa\xd0\x45\x65\x10\x07\x97\x40\x70\x34\xfe\x64\xc3\x88\x5a\x82\x8f\x54\x0b\xbd\xe4\x83\xe2\xa7\xb2\x05\xd6\xdb\x19\x7b\x9f\xc2\x85\x71\xd8\xd7\x32\xc2\x94\xa1\xca\x42\x10\x07\x97\x80\x32\x23\xf3\xed\xf6\x9a\xc3\x10\x26\xc2\x87\x4c\x0e\xe1\x91\xca\xd5\x4f\xad\x8b\x2f\xaa\x8e\xb1\x37\x85\xcc\xed\x5d\x7c\xbb\x19\x8d\x58\xfc\x80\x38\xa8\xc7\x2a\xc0\x08\x83\x66\xd7\xd3\x34\x50\x39\x57\xf8\x2e\x6e\x40\xf5\x01\xf7\x70\xe6\x8d\xd5\x3e\xa2\x66\x32\xcc\x69\xdb\x91\x48\x0d\x0f\xaa\xb5\xce\xd7\x64\xd1\x1f\x1b\x10\x63\x07\x71\x70\x0d\x28\xec\xf7\x76\xdd\x7f\x3a\x45\x14\x63\x94\x46\x7d\xc9\x85\xd8\x4e\xad\x53\xe9\x61\x31\x21\x1f\xbe\xdc\x67\xe1\x5b\x65\xd4\x6c\xe2\x88\xb8\x20\x0e\xae\x81\x3b\xcd\xc1\xb8\xb2\x57\x7c\x77\x70\x46\x3c\x16\x64\x17\x17\xa6\xfa\xd7\xc2\x44\x54\x2a\xd8\x25\x0f\xe7\x9a\x62\x97\x79\xdb\x55\x11\x71\x41\x1c\x5c\x03\xf6\x77\x9c\x09\x0c\x94\xaa\xb2\xd5\xd2\x4b\x2a\x06\x23\x1e\x0f\x29\x15\xe3\x06\x5d\xc7\xf2\x7a\x61\xf9\xf6\x84\xb8\x47\x7a\x16\x6a\x0a\x01\xe2\xe0\x1a\x68\xc2\xac\x73\xae\x22\xf7\x38\xe9\xea\xcd\x0a\x92\xe2\xfe\xba\x48\xf9\x31\x90\x2e\x8f\xf8\xfa\x4f\x79\x15\xd7\xda\x96\x83\x40\xe8\x05\x66\x10\x07\xf5\x5a\x06\x18\x61\x50\xaa\x3b\x75\x43\xac\x15\x35\xc4\x07\xcf\x58\x51\xcb\x9b\xc3\x82\x8d\xb0\xef\xa5\xe0\xdb\x47\xdd\x83\xd2\xaf\x78\x8f\xc8\x7d\x9f\xc9\x51\x2c\xc5\x42\x1b\x62\x00\x0e\xae\x01\x93\xad\xd1\x57\x57\x78\x5e\xff\x66\xb7\xc3\xea\xfd\x9e\xd4\x78\xc0\xfa\x1b\x3f\xbe\x6e\x30\x5d\xb3\x9f\x8a\x5f\x43\x5a\x17\x17\xea\xe5\x0e\xe2\xe0\x1a\xe0\xa9\xe8\xee\x8e\xde\x60\x3f\x17\xe3\xcf\x35\xbb\x4f\xf4\x38\xab\x6c\x2e\xf6\x4a\x6b\x61\xb7\x71\xc2\x48\xd4\x30\x59\x9e\xd4\x1d\x68\xd3\x02\xc0\xc1\x35\x20\x70\x69\xfb\x99\xd3\x0f\x12\x86\x03\xc7\x28\xaa\x86\xcd\xf7\xbf\x7d\xbd\xc2\x1c\x8b\xf7\x13\xe9\x5e\xaf\x79\x9a\x1a\xab\xb1\xf3\x20\xe2\x82\x38\xb8\x06\xce\x4f\xdf\x12\xfd\xc6\xf7\x58\x47\x3c\x48\xcd\x96\x3d\xa0\xd2\x9f\x57\x74\xaf\x7c\xb3\xfb\x5a\xe2\x5b\x6b\x55\x7c\x3f\xe1\xb2\x08\xe8\x56\x00\x80\x83\xe6\x01\x80\x11\x06\xad\x3b\x4e\xd3\x40\xcb\x6a\x4e\x12\x2f\x7b\x48\xb4\xfe\xc7\x08\xb3\xc6\xd4\xb4\xfc\x8a\x7b\x59\x77\x8d\x86\xf6\x79\xea\x66\x69\x48\x2e\xd8\x9a\x9f\x83\xfa\x62\x03\x38\xb8\x06\xa8\x44\xbb\x7f\xa7\x0b\xa6\x17\x2b\xaf\x2c\xa3\x70\x14\x7e\xfe\xcc\xb3\x45\x62\xc2\x16\xb4\x2c\x53\x5d\x66\xde\x68\xd8\x60\x0e\x5d\xe4\x02\x71\x70\x0d\x18\x9b\x4e\x6c\x9c\x73\x71\x9a\x18\x35\xe5\x13\xbf\xe6\x33\x42\x2a\x56\x27\xe8\xa8\xcc\x24\x8d\xc9\xb9\x5e\x16\x1f\xe7\xf0\xd2\x14\x11\x17\xc4\xc1\x35\x50\xb7\x93\x13\xd1\xf9\x93\x21\x61\x86\x00\x73\x65\xdd\x36\xd5\xa1\x22\xff\x3e\x11\x73\xf6\x9e\x70\x35\x56\x86\xa0\x93\xd6\x07\x7e\x44\x5c\x10\x07\xd7\x00\xea\x7e\xd8\xa1\x59\x04\x46\x02\xdd\xfb\x1f\xcf\x4b\x06\xfd\x02\x2b\x31\x76\x07\xcb\x39\xae\x24\xb5\x4d\xf9\x7b\x37\xf6\xab\x55\x20\x34\x00\xe2\xa0\x79\x00\x60\x84\x41\x26\xea\x74\x23\x4c\x24\xe3\xc6\x30\x1f\x88\x9a\xfa\x8b\x83\xd1\x3b\xe7\xfa\x4b\xff\x5b\x35\x97\x1a\x08\xe4\x06\x9e\x88\x34\x74\xa4\x68\xaf\xc4\xdf\x81\x7a\x57\x03\x38\x64\x23\xfc\x0e\x33\xc6\x8a\xb0\x96\x3b\x6f\x4e\xb6\x75\x20\xc4\xb6\x86\xb9\xb7\x12\x7d\x64\xa9\x29\xcc\x79\xfc\x2b\x3e\x23\xed\x37\xa7\x7b\x88\xc8\x20\x0e\xd9\x08\x9b\x86\x3a\xd6\x3f\x4c\x7b\xca\xaa\xbe\xf8\x10\x43\x35\xc9\x39\x33\x7e\x66\x5c\xf8\x78\xae\x48\x4d\x9d\xef\x40\x45\x8f\x93\x1d\xaa\x08\x07\x71\x7e\xb2\x92\x70\x23\xfc\x9f\xf6\xdb\x7e\x23\xe3\xff\x78\xd9\xe3\x7e\x46\xff\xf7\xcc\x43\xb4\xed\xeb\x8d\x77\x56\xd1\x46\x8b\x69\x85\xc5\x68\x96\xd5\x7d\x7e\x2a\x28\x1d\xff\x6d\x84\x47\x34\xf2\xce\x0d\x95\xf6\x27\x7c\xbc\xf5\x6d\xa5\xf6\x56\x22\x9e\xff\x2b\xbb\x3d\xad\xd5\xa6\xed\xd7\x45\x87\x0d\x2a\xe3\xd4\x9a\x7f\xa1\x1a\x2f\x97\x53\xae\x3a\x24\x9c\xab\x6a\x5b\xd8\x11\x9f\xe5\x6a\x1e\xdc\xbd\xc7\x68\xe8\xc1\xd4\x46\x44\x9b\x9b\x46\x55\x78\x6e\xe3\xbf\xcd\x08\x83\x86\xf6\x77\x75\xb5\x02\xdc\x2c\x8d\xbe\xce\x7f\xbf\xd7\x42\xf0\x61\x3c\x2f\xd4\xa0\x47\x4b\xbf\x9d\x47\xd4\xa4\x85\x93\xfe\x96\x63\x46\x8f\x20\x6b\xa5\x73\xf3\xb7\x33\x39\xac\x44\x36\xc2\xe7\xed\x0e\xfc\x64\x50\xd7\x25\x3f\x5a\x74\x11\x31\x49\xa6\x86\x76\x12\x51\xae\x04\x4f\x58\x37\x08\x93\x91\xfb\xbb\x09\xbf\x1f\x39\x93\xa3\x59\x71\xa4\x3f\x6b\xd2\x1b\x5b\xb4\x75\xfb\xe9\xbb\x6f\x6e\xcc\xf9\xfe\xf9\xa9\xf7\xfe\x58\x55\xad\x95\x0f\x63\xa8\x5f\x78\xda\xc4\xa7\x75\xd2\x75\xf3\x4c\x46\x8b\x6c\x84\x7d\xa2\xd5\x89\xd5\xca\x77\xe5\xc5\xae\x3f\x55\x97\x37\xa3\xe6\xd2\xa1\x96\x17\x2b\xca\xc9\xf6\x3f\x3f\x64\xe3\xbd\x78\x8c\xd5\x7b\x26\xa3\x75\x42\xfa\xb3\xcd\xf3\xc3\x47\x78\x5f\xb8\xe5\x7f\x7f\xbe\x96\x67\xc3\xdc\xfd\x55\xb9\xa9\x11\x2f\x61\xa8\xfd\x55\xea\x85\xb4\x9e\x69\xb9\xd4\xba\x33\x33\xc2\x20\x11\x9d\x96\xf9\x04\x25\x0c\x5c\xc7\xba\xbb\xd9\xb9\xac\xad\xbf\x4d\x3d\xe2\xaf\x6e\x26\x61\x5a\x49\x66\xc1\x35\x10\xe0\xb2\xf7\xba\x60\xc4\x0b\xf5\x54\x01\x71\x48\x4f\xaf\x66\x28\xaa\xc6\x54\x30\x69\xa7\x17\x56\x33\x38\xb4\xdd\x8f\x55\x66\x4b\x14\xb7\x99\xd0\x7c\x23\x53\x40\x34\x37\xc1\xf2\x7f\x1f\xb4\x02\x71\xf0\xcc\xf7\x80\x25\xad\x4e\xe7\x38\x9b\x7b\x49\xbf\x39\xe4\xfd\xd4\x22\xc5\x12\x4e\xaa\x0a\x4f\x46\xcb\x80\xeb\x44\x9a\xf8\x75\xee\x98\x5d\xa8\x0f\x0a\x80\x83\x7f\x87\xd1\xe8\x05\xbb\xc9\x3d\x1c\xbc\x87\x9a\x16\x73\x95\x16\xd4\xb4\x3a\xf9\x58\xdb\xad\x05\xc9\xea\xbb\x3f\x9c\x64\x18\x03\x17\x78\xa1\x3b\x91\x00\x0e\x1e\x77\x22\xea\xfb\x6d\x8d\x63\xdf\x1f\x97\x48\xa7\x38\xc9\x78\xe4\x42\x5a\xab\x16\xbc\xf6\x07\x23\x6c\x3d\xc5\xee\x39\xfe\xd9\xc8\x5d\x42\x18\x61\x10\x87\xe8\xb7\xfd\x3f\x53\xc7\xbf\x2c\x7e\x40\x3f\xe8\xd3\x24\xc0\x73\x58\xe8\xf3\x9c\x3e\x12\x47\x0b\xd7\xc9\x36\xc0\xa3\x5a\xdb\x81\xc0\xfe\x13\x4b\xea\x27\xe5\xc0\x69\x82\x7d\x0d\x1d\x3a\xe8\xb1\x1d\x10\x07\x97\x40\x5e\x53\x3e\x37\x9d\x20\x8f\x75\xd4\x73\x54\x25\x13\xda\x1f\x12\x36\xde\x2a\x0a\x6f\x29\x42\x7f\xf0\xe4\x30\xe2\xff\xf6\xcf\x81\x8c\x25\x88\x83\x4b\x20\x94\x5b\xd2\x4e\xf3\x86\xcd\xa2\x48\x62\x15\xb3\x39\xc9\x3b\x52\xaa\x5c\xd2\xcb\xc7\xd2\x6c\x1a\xa1\xfb\xbe\x82\x66\xa3\xd9\xd0\x09\x13\x88\x83\x7f\x07\xff\xb4\x87\x1d\x6f\x7e\x47\xf6\x5e\x75\x11\x1e\x54\xec\x7d\x5f\x1f\x67\x93\xf9\xd0\xe5\xe9\xf2\x4c\xb1\x5b\xab\xad\xa4\xee\x33\x68\xb1\x06\xe2\x90\x4e\x5b\xb9\xce\x2b\xdd\xb4\x50\xba\x39\x27\x77\x2b\x05\x23\xe5\xab\xb4\x7f\x54\x0e\xf1\xc1\x79\x2b\xde\x16\x56\xfc\xe8\xe6\xa2\xa4\x51\xc4\xe2\x07\xc4\x41\x3d\x56\x01\x46\x18\x34\xbb\x9e\xda\x6a\xee\xfd\x0e\x7f\xd3\xa3\xf1\xdb\x68\xa5\x8c\xad\xa4\x29\x74\x0c\x0e\x72\x43\x7f\x18\x74\x4b\xad\x1f\x0a\x61\x19\xdc\x25\x88\x77\x82\x5a\xcd\x01\x38\xb8\x06\x02\xdf\xfc\x74\xbf\x4b\x32\xf2\x44\xdb\xe2\xe7\x89\xa6\x45\x5d\x3b\x75\x98\x53\xfa\x62\xc5\xfa\xb4\xe3\xa0\x22\x97\x9b\x91\xcf\x18\x22\x2e\x88\x83\x6b\x80\x42\x66\x94\x37\x5e\x23\xa2\x22\x34\xd6\xf3\x4f\x92\x89\xb2\x33\xee\xae\x2f\xeb\x0e\xe9\x83\xec\x90\x10\xaf\x6f\x0b\x28\xda\x39\x88\xb8\x20\x0e\xfe\x1d\xba\x3e\xe8\x86\xdf\x5e\xe1\xa6\xa4\x48\xa4\xcb\x2e\x8a\x67\x65\x7f\x66\x78\xac\xc8\x6e\x57\xe1\x4c\xb5\x43\xd0\xd5\xf1\x16\x47\x1e\x11\x17\xc4\xc1\xe3\x26\x55\xdb\x1d\x6e\x6b\x7d\x26\x9e\x09\xa4\x53\x1c\x9e\x2a\xa7\xef\xa0\xeb\x45\x99\x7c\xba\x46\x5b\x68\x79\x51\x80\xa4\x4f\x17\xda\x0c\x01\x71\x50\xaf\x65\xf1\x7f\xd7\x00\x28\xd5\x9d\xfa\x12\xfb\xe5\xf9\x6e\x1a\x39\xd7\xc9\x48\x1b\xa2\x50\xe6\x9b\x29\xfe\x34\x35\xae\xee\xcd\x82\x63\xa3\xdd\x17\x7d\x85\x86\x06\x92\xa0\xb6\x80\x20\x0e\xae\x81\xc5\x89\xc1\x50\xee\xb0\xed\x29\xe3\x6a\x2c\xf6\x44\x85\xa4\x3e\x4e\xa3\x45\x22\x8c\x51\x46\x83\x8a\x87\x1d\xde\xa8\x8e\x45\x37\x11\x71\x41\x1c\x5c\x03\x42\xb4\xc3\xcd\x18\xc9\xcc\xb6\x93\x14\xf4\xfa\xc6\xd1\xde\x14\x4b\x3b\x3a\xfd\x8b\x0e\x1f\x67\x7b\x8b\xf0\x99\x7e\xc7\x3e\x73\x83\x7a\xa3\x03\x38\xf8\x77\x10\x71\x4b\xdf\x16\xf5\xa8\xa4\x7e\x20\x11\xce\x25\xb5\x21\xe9\x46\xe3\x19\xfc\x73\xde\xc2\xb1\x6f\x36\xab\x1c\x3b\xc1\xb2\xe5\x2d\x22\x2e\x88\x83\xc7\x3d\x79\x64\xea\x6e\xa9\xf8\xbc\xe2\xfc\x92\x86\x26\x09\xf5\x8e\x21\x5d\x83\x26\x97\x46\x83\xa6\x72\x96\xf1\x41\x1b\x7f\x89\xa8\x11\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\x4d\x03\xa1\xfb\x82\xc2\xd9\x8f\x4b\xad\x8d\x65\xb8\x71\x1c\xc4\x30\x51\x1f\xb0\xfa\x84\x3f\xdb\xdf\x71\xeb\x77\xd6\x9d\xc3\x30\x73\x9d\x87\xe6\x56\x00\x87\xd4\x69\x03\xab\x81\x60\xbe\xb3\xa2\xd1\xc6\x04\x8b\xd3\xff\x56\x80\xb9\xd1\x07\xab\xf2\xf0\xdf\x5a\x28\xf5\x9f\x27\xf7\x7a\x02\x2d\xa0\x76\x83\x20\x0e\xae\x81\x9e\x3b\xbc\x1c\x4f\x03\xb4\xfd\x1b\xf4\x1c\x1e\x35\x94\xb9\xa0\xe7\x1e\xc9\xb3\x72\xa9\xb2\xdd\x43\x4d\xbc\xe2\xbe\xf5\xba\x02\xea\xe3\x0d\xe2\xe0\xdf\xc1\x33\x5a\xc5\xc3\x0b\x4d\xc0\xf7\x5e\x2d\xbd\x6e\x7a\xdf\xad\x4f\x4a\xeb\xad\xc4\xc4\x49\xef\xc5\x3e\xbd\x92\xeb\xb9\xca\x78\x13\x6a\xbb\x08\xe2\xe0\x71\x33\x99\x51\x83\x85\x89\xd4\x35\x05\x99\x9a\xa7\x27\xaf\x0c\xd6\x6d\xbe\x33\xb9\x8d\x7a\x74\x33\x0e\xcd\x10\x6d\x65\xe1\xe4\xa5\x08\x42\x03\x20\x0e\x9a\x07\x9c\xfe\xdd\x08\x83\x4c\xd4\xe9\x46\xd8\x3b\xa5\x48\xd4\x7a\x5e\xac\xdb\xdb\x62\x10\x8b\xb3\x43\xfb\x78\x24\xca\xfb\x49\xe1\xc8\x9a\x54\x87\xe8\x62\xfc\xeb\x78\xeb\x1c\x84\xa9\x04\x71\xc8\x46\x78\x8c\xc8\xd9\x24\xbd\xed\x59\x67\x0d\x59\xd9\xab\x8c\xd9\x8c\x9b\xdc\x1b\xdc\xe9\x3b\xf1\xa5\x29\xa2\x47\x76\xc3\x1e\x36\xac\xd5\xd0\x05\x66\x00\x87\x6c\x84\x05\xa6\x44\x87\x03\xd4\xe7\x42\x22\x5d\x46\x93\x70\x28\x38\x5f\x90\xed\x73\xfb\xd2\x8b\x5a\x8d\x37\xde\x98\xe0\xe8\xba\x1d\x80\x82\x88\x0c\xe2\xfc\x64\x51\x50\x61\x9d\xbc\xff\xd3\x7e\xdb\x14\x75\xca\x8e\xe9\x27\x83\x69\x2b\xe2\x5f\xb7\x35\xc9\x99\x38\xd1\x79\x23\x17\xa2\x2a\x88\x9d\xbb\xc9\xa9\xb3\xaf\xa8\x55\x68\xff\x6d\x84\x2f\x3c\xfc\xb6\x73\x99\x77\xdc\xec\xb9\x0e\x23\xb1\x97\x49\x2c\xdb\x90\x4f\xb2\xa1\xe7\x39\xec\xf2\x43\xcf\xf0\x19\xf5\x85\x47\x0e\x7f\xdf\x7e\xa2\xbd\x30\x32\x6b\xf2\x91\x2f\xf7\xd9\x8e\xa2\x08\xfe\x17\x72\x6d\x1e\xc2\x8d\xcc\x35\xae\xdf\x89\x53\xe3\x8a\x34\x84\x79\xc2\xff\x6d\x46\x18\x34\xb4\xbf\x6b\x84\x91\x8c\xf0\xb0\x4c\x5d\x23\x76\xcd\xfb\xa7\x3f\x6a\xac\xf6\x2c\x69\x36\x26\xba\x6e\xfb\x64\x8e\xe0\x6d\xc8\x2f\x1e\x36\xc4\xd9\x0c\x3f\xaf\x3e\x93\xc3\x4a\x64\x23\x2c\xfa\xc2\x41\x5a\xd8\xcb\xb3\x6b\xac\xcf\xc0\x7f\xfe\xd5\xc0\xc1\x56\xb4\x90\xa7\x65\x91\xeb\xa3\xc1\x5f\x4f\xa5\x98\xe7\xa4\xce\xe4\x29\x26\x49\x64\x23\xfc\xba\x32\xee\x9d\x4e\x67\xd4\x15\xcc\xb8\xcf\x78\x7e\xed\x28\x3f\x2e\x88\xe8\xbb\x1f\x2f\x1f\x06\xd7\x47\xb8\x58\x59\xb8\x57\x9d\x4d\x8d\x30\xb2\x11\xc6\x26\xaa\xfa\xdc\x1d\x62\xa8\x1a\x18\x7a\x62\xbc\x25\x57\x9b\xaf\xbc\x5a\xb2\x73\xa1\xe4\x59\x32\x8a\x81\xa4\x55\x48\xe3\xfb\x88\x33\x19\x2d\xb2\x11\x36\x5c\xc7\x59\xe4\x7d\x3e\x5e\x1e\x4c\x22\x34\x40\x24\x8a\x1b\x43\x83\x7d\xab\xba\xce\x20\xcf\xcb\x1d\xb5\x95\x6b\x4c\x27\xa6\xe8\xcc\x8c\x30\x48\x44\xa7\x65\x3e\xd3\xb0\xb7\xd7\xdf\xa9\x57\xc9\x35\xcd\x9c\x57\x5a\x7c\x48\x12\x69\xbb\x5f\xa1\xb9\xc8\x90\x56\x46\xdb\xff\xce\xb9\x43\xb1\x86\x0d\x31\xe3\x83\x38\x78\xe6\xb3\xf3\x74\x73\x95\x78\x76\x27\x03\xbb\xe4\xfd\x85\x05\x5d\xdd\xb0\xda\x0f\x45\xcf\x2d\xbd\xcf\x51\x65\xa4\x12\x3c\xbb\x21\x3a\xfb\x0e\x6a\x5e\x0c\xe0\xe0\x99\x4f\xf6\xf9\xeb\x41\xa3\x77\x84\x1a\x44\x2d\x6c\x1f\x5e\x61\xc9\x89\x86\x5c\x68\x6d\xba\xc5\x78\xe8\xaf\x4f\xc9\xea\xb7\x1e\xf1\x05\x7a\xc9\x06\xc4\x21\x35\x1c\x96\xd8\x2b\x43\x0d\x66\x5e\x9e\xff\x43\xd6\x80\x2d\x7d\xb5\x20\xa9\x93\xc3\x93\x04\x07\x85\x73\x06\x4f\xf3\x21\xee\x2e\xc6\x21\xd4\x70\x18\xc0\xf9\x49\x13\xff\x23\xee\x82\xb0\x43\x5c\x9e\x7f\x0f\xfe\xed\x66\x27\xf1\xf0\x01\x35\x1f\x33\xe1\xfe\x20\xfa\x7e\xce\x6f\x83\xb6\x4c\x3e\xcb\xf9\xba\x5f\x10\x46\x18\xc4\x41\x35\xc2\xff\x6e\x84\x41\x3f\xe8\xd3\x24\x70\x99\x96\x75\x6a\xa2\x46\x07\x23\x02\x45\x62\xb2\x03\xc5\xfb\x95\x88\xdf\x6b\xd7\xd5\x89\x82\x62\x9c\x81\x1a\x77\xab\x12\x07\xe8\xf0\x1e\xc4\xc1\x25\x30\xfe\x23\x54\x3c\x3a\x62\x9f\xbf\xc6\xc6\xb8\x94\xb7\xe5\x97\xdc\xc9\xa5\xab\xc2\x84\xc1\x23\x35\x3d\x89\x07\x96\x8d\x5f\x7c\x6b\x11\x71\x41\x1c\x5c\x02\x01\xd7\x3b\xf6\x64\x02\x9d\x53\x38\x7c\x19\xdb\x5e\xe2\xca\x24\x64\xe0\xde\x7d\xcb\xf0\x99\xb6\xe9\x7c\xaf\x5f\xc8\x3e\xe5\x64\x0a\x54\xcb\x08\xe0\x90\x5e\x21\xa6\xcf\x7d\x6b\x15\x27\xe9\xd2\xf8\xe9\x56\xdc\xc1\x6a\xab\x80\x65\x84\xe3\x9e\x40\xae\x5c\x4c\xff\x7a\x7a\x2e\x8b\x54\x3f\x74\xba\x00\xe2\xe0\x12\x18\xe2\xf3\xc5\x44\x6b\xc1\x32\xe1\x14\x4f\x30\xa4\x1f\x18\x18\x3a\x12\xd4\xcf\xe3\x6f\x79\x45\x1f\x41\xff\x91\x68\x7b\x58\x3d\x1c\xb1\xf8\x01\x71\x50\x6d\x20\xc0\x08\x83\x66\xd7\x53\x2b\x24\xbc\xbc\x94\xd6\x52\x5d\x4a\x06\x67\x48\xbc\x0c\x97\xd1\x13\xd1\xd7\x84\xc9\x36\x39\xff\x5c\x9c\xa3\x17\xaa\xbc\xd5\xf8\x12\xba\x15\x00\xe2\xe0\x1a\xf0\x17\xb2\xe5\xfa\xda\xf8\xb5\xb0\x47\x1e\x63\xc6\x4d\x5a\x44\x0e\xb3\x81\xa7\x91\x4a\x0f\xaf\x06\x37\x3d\xc1\x5e\x25\x5d\x5c\x05\xda\x5c\x00\x70\x70\x0d\x90\xac\xad\x53\x61\x94\x14\xac\xe7\x0b\xbd\xc8\xff\x58\xb0\xfd\xd5\x61\x1a\xff\x57\x58\x86\x12\x2e\x2f\x43\xce\x76\x94\xab\x42\x13\x22\x2e\x88\x83\x7f\x87\xab\x9a\x25\x16\x33\xa8\x3b\x18\x6d\x19\x13\xf2\x14\x1d\xd9\xb6\x58\xa5\x7c\xa5\xce\x84\xa8\x31\xe7\x52\x8b\x6e\x48\x07\x27\xae\x23\xe2\x82\x38\xb8\x06\x92\x57\x63\x95\x5b\xb4\x58\x13\x17\x6d\xc7\x92\xbd\x3e\xcd\xf1\xcb\x75\x12\x1d\xc5\x2b\x24\xf2\xab\x37\xa8\xaf\x49\xab\x85\x71\x21\x34\x00\xe2\xa0\xda\x40\x80\x11\x06\xa5\xba\xd3\x34\x40\x56\x2e\x1c\xf8\xd1\xba\xf6\xfe\xc7\x34\x9f\xc0\x07\xbf\x6d\xd6\xbe\xe7\xaa\xe2\xc6\x28\x33\xa5\x38\x3f\xa4\xa8\x4c\xce\x5a\x2c\x42\x8c\x1d\xc4\xc1\x35\x50\x58\xff\x8e\xe1\xd1\x91\x3f\xce\x14\xd7\x2c\x4e\xfc\x84\x1a\xae\xfb\x5e\xa7\x54\x2a\x77\xd3\xaa\xec\xae\xaa\xbc\xd6\xcf\x61\x23\x44\x5c\x10\x07\xd7\xc0\x4c\x69\x62\x49\xab\x95\xa8\x1c\x7f\x1e\xa9\xa0\xb5\x75\x8e\xcb\x93\xed\xfc\x6a\x94\x15\xef\xe8\x36\x2f\x99\xa4\x17\xf7\x85\xa1\x0e\x99\x20\x0e\xe9\x45\x7a\x1d\xd6\x2f\x7f\xb4\x22\x3a\x8a\xb1\x99\x1b\x34\x67\x78\x5f\xe1\x7d\x6e\xf9\xf9\xbd\xdd\xcc\xb6\x46\x06\x8d\x42\x83\x69\x03\x7a\xd9\x19\xc4\xc1\x35\xf0\x32\xec\x9d\xea\xaf\xd0\xa6\x8a\xda\xba\x7e\x86\xa5\x3c\x49\xcd\xcd\x1e\x4c\x02\x8d\xc7\x24\x05\x85\x5c\x3d\x7d\x84\x5e\x5e\xec\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\x34\x0d\xdc\x99\x9a\x2d\x9b\x28\x6c\xb1\x89\x60\x5d\x7b\xbb\x71\x2b\x9e\x4d\x87\xeb\x3e\xc3\xd5\x94\x42\x74\xf7\xa4\xa7\x8d\x77\x18\xfc\x72\xa1\x9b\x16\x00\x0e\xae\x81\x23\xcc\x38\xe1\xd4\xdc\x48\x94\x2f\xa2\xe3\x87\xa9\xe4\xdb\x0f\xaf\x7f\x53\xf9\x3d\x3a\x72\x40\x39\x90\x42\xc3\x1e\x53\x59\xf2\x19\x11\x17\xc4\xc1\x35\xe0\x46\x5b\x58\xe2\xea\x55\x79\x03\xc7\xe2\x92\x76\xa4\xac\x8f\x38\x5b\x5a\xdd\x64\x8b\x45\x61\x00\x43\xd9\x41\xd9\xf5\xca\x24\xe8\xff\x0a\xc4\x21\xe5\x82\x68\x51\x19\xeb\x6e\x11\x34\x8f\x18\xa7\x20\x8f\xe4\xf7\xc1\xba\x6f\x79\x23\x38\x4d\xc8\xc8\xc6\x0b\xae\x72\x5f\xb0\xad\x82\x5e\xe1\x06\x71\x70\x0d\x78\xc4\x8f\x36\x5e\xe9\xfb\x4c\x18\x67\xbf\x10\x39\xfe\xea\xe1\xe2\x8c\x01\xe3\x95\xe6\x47\x1e\xb9\xd9\xad\x79\x58\x1d\xec\xf5\xad\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\x90\x89\x3a\xdd\x08\x8f\x78\xea\xf3\xf6\x7c\xcc\x08\x24\x2f\xad\xdf\xd1\x59\xbc\x76\x51\xed\x45\xa9\xf4\x2a\x4a\x14\xf1\xd6\x8e\x67\x27\xfa\xad\x49\x3e\x84\xa9\x04\x71\xa7\x9c\x08\xa7\xf3\xa0\xdc\xaa\xed\x45\xe1\x22\xb4\xd7\xb9\x74\xe9\xbc\x93\x59\x67\xc7\xd3\xec\x8b\x71\x5a\x6c\x7e\x6d\xd4\xef\x2e\x73\xb3\x43\x27\xc2\x00\x0e\xd9\x08\xbb\x53\x6d\xd0\xe3\xbd\xf2\xe8\xcb\x74\x50\xfc\xc9\x31\xea\xa0\x21\x96\xd0\x3b\x73\x65\x8e\x7f\x6d\x0c\x8b\x4c\x9a\x74\xd8\xce\x05\x11\x19\xc4\xf9\xc9\xa2\x60\xfc\x33\xf2\x7f\xdc\x6f\xdb\xc5\xd3\x77\x96\xf8\xbc\x7d\x50\x6b\x81\x9a\x8f\xd2\x93\xf7\x12\x3f\x54\xc3\x31\x03\xe9\x55\x5f\xb0\xa5\x9a\xc8\x5e\x7e\x99\xf4\xe6\x6f\x23\x6c\xbb\xea\xd1\xf8\x4c\xbe\xe0\x56\xb8\x2a\x3e\x89\x9d\x73\x76\xbd\x17\x75\x6b\x88\x0b\x9a\xea\x91\x09\x1a\x16\xf5\x2e\xf9\x18\xdd\x5f\xa8\xba\x6a\x76\xd7\x00\x19\x87\x2c\xcb\x39\x0b\x2c\x02\xd6\xa7\xd5\x44\x05\xe7\xdf\xb7\xe7\xd0\xc9\x70\x47\x06\x75\xdd\x2e\xad\x5a\xf9\x6f\x33\xc2\xa0\xa1\xfd\x5d\x23\x8c\x64\x84\xd5\x63\x59\xb1\x5f\x97\x86\x26\xea\xb2\xd2\x7c\x70\xc8\xf6\x20\xd6\x68\xc2\x0b\x59\x53\xe4\xe5\x3f\xce\xbd\x20\x73\x89\xc1\xf3\x6c\xaa\x66\x05\x90\x3c\x5a\xa1\x73\xad\x69\x92\x9f\x82\x24\xcd\x62\x6e\x14\x6b\x24\xf3\x66\xf6\xc4\x55\x5f\x4b\x15\x66\xa6\x5e\x7f\x71\x0a\x02\xf3\x32\xea\x33\x39\x9a\x45\x36\xc2\x9b\x02\xd8\x2c\x58\x5d\x9a\x84\xdc\x25\x19\xca\x38\x9c\xc6\xf2\xb7\xac\xf7\x07\x7e\x37\xf5\x6b\xe2\xd4\x65\xef\xe6\x51\xe2\x7b\x9e\xc9\x68\xf5\x90\xfe\xec\xb7\xab\x54\x1c\xc7\x99\x6a\xbf\xa8\x37\xed\x38\xf0\xf8\xe9\xd1\x85\xa8\x6d\x33\x8f\x5b\x3d\xa6\xb8\xbd\x79\x27\x23\x77\x4c\x3f\x9d\xc9\x68\x91\x8d\xf0\xc8\x87\xa8\x86\xb8\x75\x06\xa3\xa5\x22\x3f\xc1\x05\x9c\xe9\xe7\xbe\x2c\x03\x5f\x4b\xfb\x43\x28\x8a\x0c\x13\x8f\x48\x08\xa2\xcc\xcf\xcc\x08\x83\x44\x74\x5a\xe6\x9b\xfb\xa1\x91\x69\x78\x52\x7e\x97\xb6\x87\xf3\xcf\x4b\x31\x03\x26\xcf\x5d\x65\xcf\x66\x82\xa9\xbd\x0f\xe8\x94\x69\x97\xb2\x62\xa0\xe7\x77\x41\x1c\x3c\xf3\x0d\xb3\xcf\xe7\x30\x3c\x2c\xf7\xc2\x36\x5b\x65\x35\xf8\x5a\xfd\x90\x1f\xbd\x84\xd1\xed\xb5\x87\x4e\xf8\x72\x7d\x90\xa1\x7a\x17\x74\x1c\x08\xe2\xe0\x99\xef\xab\xcc\xed\x1a\x07\x6a\x8c\x8f\xed\x43\x33\xe2\x78\x77\xd0\xe2\x1e\x78\xf8\x18\x0c\x3c\xbd\x7c\x7b\x00\xdd\x6b\x41\x9c\xc3\x90\x08\x11\x17\xc4\xc1\xbf\x03\xdb\x9a\x5b\xda\xfd\x74\xfc\xf2\x98\x3f\xc9\x75\x98\x4d\x77\x05\xff\x3c\x10\xc4\x51\x21\xec\xc3\xdd\x1c\xad\xbf\x58\xe7\x14\x09\xdd\xb5\x04\x71\x7e\xd2\x28\xa8\x7f\xc7\xad\x10\xa8\x6f\x7c\xf6\xec\x97\xa3\x8f\x19\x77\x6d\xc5\x95\xe6\xef\x41\xb4\xc2\x21\x13\x69\x18\xb1\x1c\x6d\xfc\x68\x5c\x46\xaa\x21\x08\x23\x0c\xe2\xa0\x1a\xe1\x7f\x37\xc2\xa0\x1f\xf4\x69\x12\xc8\x16\x8b\xd2\xfa\x75\x89\x41\xd7\xe0\x7e\xc4\xe1\xee\x4c\xf8\x3c\xdb\x3d\x6b\xbd\xf6\xc8\x6c\xe7\x64\x5d\xe5\x05\x46\x11\x2d\x67\x68\xb7\x1e\xc0\xc1\x25\x40\x58\x83\xf2\x21\x0b\xed\x6a\x43\x61\x9a\x2b\x51\xb0\xbe\xc8\xf1\xeb\xb2\x46\x56\x96\x90\xd8\x88\x0e\x06\x77\xd3\xf5\xf7\x2b\x90\x04\x40\x1c\x5c\x02\x6d\xbf\x84\x67\x43\x53\x5e\x7b\xc6\xa8\x6e\xb6\xa5\xa1\x94\x6c\x35\xe9\x4d\xb1\xef\x68\x93\xc6\xbe\x12\xa6\xf8\xe3\xa1\x21\x0d\x19\x61\x10\x07\xff\x0e\x93\x25\xfc\x4c\x39\x73\x8f\x42\x54\xdd\x93\xcb\x4d\xc9\xec\xd5\xc7\x2d\x30\xc5\x36\x1e\xdb\x19\xa7\xd2\xbc\x89\x64\xc7\x70\x82\x6a\x24\x41\x1c\x5c\x02\xa4\xf4\xae\xf6\x66\xf1\xa9\x17\xed\xbf\x46\x98\x65\xf8\x31\xbe\x9a\xed\xa2\xfa\x80\x1e\xf9\xfd\x44\x9d\x86\x82\xd6\x0c\xef\x13\x74\x22\x0c\xe2\xa0\xda\x40\x81\x7f\x5f\x00\x83\x66\xd7\xd3\x34\x20\xd4\x95\xda\xfa\xfd\x52\x9c\x90\x6c\xb8\x12\xf6\xfb\x02\x34\x0e\x1a\x5c\x7a\xb4\xa8\xad\x82\xf1\x8a\x88\xc9\x3e\xb6\xfc\x5d\x35\xe8\x74\x0d\xc0\xc1\x35\x50\xd0\x27\x8e\x47\x91\xc4\xfa\x74\xae\xdc\x62\x9f\x47\xf7\xe3\x8b\x8d\x37\xb1\x86\x0b\x85\xf7\xac\x88\x6e\xf5\xef\xdd\xce\x5e\xd8\x43\xc4\x05\x71\x70\x0d\xd0\xd7\x68\xe6\x09\xf8\xf6\xd1\xcb\xb8\x1e\x8d\x27\x6b\x55\xab\xd2\xa6\x8e\x8b\x7e\xba\x56\x5c\x52\x3a\xbf\x9f\x43\x4c\x26\x0c\xbd\x13\x07\xe2\xe0\xdf\xa1\xd3\xba\x59\x08\x77\x23\xa8\x8c\x21\xf0\xc9\x15\xb5\x7d\x27\x25\x6a\x6b\xef\x0b\xab\x3b\x65\xf1\x78\xf7\xef\xb0\xb9\x1e\xa3\x43\x35\x87\x20\x0e\xae\x81\x2b\xc3\x91\xf3\x65\x69\xe8\xdb\x13\xd4\xe3\x3d\x58\xa6\xa9\xf1\x5c\x19\x7b\xc2\x65\x32\x0e\x5a\x59\x7d\xec\xb8\xf5\x1e\x9d\xe2\x08\x0d\x80\x38\xa8\x36\x10\x60\x84\x41\xa9\xee\xd4\x12\x09\xa6\x51\x7a\xac\xce\xb8\xd0\x67\x16\xab\xf8\x55\xb1\x5a\xe7\x7a\x05\x6e\x85\xfb\xdf\x37\x47\x65\x4e\x78\xe1\x23\x6a\x29\xa7\x09\x95\x48\x00\x38\xa4\x86\x69\xab\xd6\x8e\x79\xec\x5a\x93\x2c\x94\x74\x97\x6d\x29\x78\xec\xdf\xb5\x3a\xe5\x10\xef\x09\xb0\x53\x3f\x3e\xcc\xc7\x2e\xa8\x85\x1e\xf1\x01\x71\x70\x0d\x0c\xcc\x1e\xf2\x1d\x2c\xd1\xe6\x2c\xdc\xde\x91\x69\xd1\x90\xb4\xbd\xbc\xf9\x90\x36\xb0\xe8\x49\xce\x7c\x5c\x98\x4f\x5f\x4d\x64\x34\x22\x2e\x88\x43\x6a\x18\xf5\xed\x73\xd1\x4d\x63\xec\x0b\x8a\xfa\xeb\x0f\x73\x12\x5c\x54\x1e\x7b\x7b\xef\x06\x9a\xbc\x8e\xf6\x51\x8d\xe8\xdd\x72\x96\xe9\x82\x1a\x46\x01\x38\xb8\x06\x6a\xad\xba\x26\xaa\xfb\xf4\x2f\x5b\xf4\xaf\x76\x69\xce\xcd\xbf\x23\xb9\xc2\xfa\xbc\xc7\x23\xd7\xbf\x79\x7e\x50\x9a\x38\x90\xa1\x17\xa1\x01\x10\x07\xcd\x03\x7a\xff\xae\x01\xd0\xba\xe3\x34\x0d\xcc\x6e\x64\x6d\x61\x06\xa1\x16\x16\x27\xfa\xa8\x0a\xf0\xfe\x5e\x91\x25\x6d\xce\x54\x66\x97\xa8\xad\x0c\xff\xc6\x92\x5b\x7e\x00\xbd\xc0\x0c\xe2\xe0\x1a\xd8\x6b\xc0\xed\x42\xbb\x8a\xc2\xc1\x17\x10\x74\x28\xb4\x7e\xaf\xb2\x01\xdf\xf4\xe1\x7a\xdb\xc2\x23\xa6\x6b\x7a\x6a\xdc\xa5\xc6\x50\xff\x05\x10\x07\xd7\x00\x3e\x59\x54\xea\xf8\x60\xe7\x91\xd9\x61\x08\xe3\x0d\x66\xf4\x5b\xb8\x1e\x11\x14\x15\x0f\x2a\xbd\xcc\x31\x0d\x14\x5d\x93\xbe\x40\x0f\x5a\x81\x38\xf8\x77\x90\xf8\xe1\xe7\x6c\x8d\x6e\xf4\x49\x4f\x2f\xc6\xdf\x38\x66\x67\x6f\xb1\xaa\x6e\x2e\xbf\xcf\x38\x61\x63\x36\xb5\xaa\x00\x97\x16\x3a\x1f\x00\x71\x70\x0d\xd8\xf8\x7b\xeb\xcf\x5c\xde\x9c\x9b\x2c\x2b\x2d\xd1\x4a\xbb\xdf\xb3\xc6\x20\xa1\x1c\x5c\xbe\xfb\xb0\xda\xae\xc1\x3d\x81\xaa\x71\x04\xa1\x01\x10\x07\xcd\x03\x00\x23\x0c\x32\x51\xa7\x1b\x61\xfe\xed\x0e\x0d\x96\xf3\x03\x1b\xc6\x55\xa5\x25\xb4\xe9\x0b\xa6\x65\xf4\x51\x28\x3d\x49\x4a\xf6\x56\x55\x6d\xe8\x6c\x0c\xc4\x79\x08\x53\x09\xe2\x90\x8d\x70\xef\x27\x83\xd6\x89\x67\x7c\xd8\x7a\xe1\x9f\x78\x13\x45\xea\x47\xc3\x5d\x09\x55\x5e\xc9\xa3\x98\xf9\x5b\x3f\x0f\x6d\xea\x48\x86\xda\x70\x81\x38\x64\x23\x7c\xf9\x60\x44\x8a\x85\x64\xff\x9a\x3f\x69\x85\xd3\x72\x7e\x45\x8a\x3c\xc6\xef\x79\x5a\xb3\x79\xe9\xb6\xac\x3f\x52\xfc\xbe\x98\x4c\x88\xc8\x20\x0e\x39\xf2\x7f\xdc\x6f\x7b\xa7\x37\xfa\x13\x7b\xbd\x40\x8f\x51\xd8\xa0\x59\x4f\xe4\xbd\xdf\xbe\xc6\xb2\x0e\x93\x6a\x71\x51\xad\x7e\xa9\xd1\x55\xda\x0a\xae\x7f\x1b\xe1\xf7\x58\xc2\xbc\x39\x77\x35\x7f\x63\x16\x10\x7a\x77\x8b\xa3\x89\xba\xa2\x71\x92\xd7\x2c\xec\x6f\xf4\xce\x91\xf0\x75\x08\xab\x47\xfe\x85\x6e\xed\x58\xbb\xae\xfe\xb9\xa1\x55\x7f\x5b\xf9\x15\x21\xc5\xcc\x3d\x7f\xfc\xee\xb7\x32\x2a\x86\xb7\x7f\xbd\x16\x3f\xc1\x73\x24\x89\xfd\x6f\x33\xc2\xa0\xa1\xfd\x5d\x23\x8c\x64\x84\xa3\xd3\x47\x31\x79\x9b\x07\xed\xef\x3f\xa7\x0d\xf7\xdb\x17\xbe\x96\xe0\xa4\xdb\x18\x41\x74\x75\x7b\x9a\x6b\xcf\x97\xdd\xc1\x3b\xf1\x4c\x0e\x2b\x91\x8d\xb0\xee\x85\x96\x74\x03\xb2\xc4\xdc\x45\x4c\x14\xbe\x69\x14\x6a\xdc\xec\x8b\x06\xaa\xed\x6b\x2c\x5f\x12\x1e\x31\xb3\x48\x63\x07\x9f\xcd\x9b\xc4\xc8\x46\x38\xc3\xaa\xe4\xbb\x40\xdd\x05\x0d\x81\x7c\x85\xd1\xb4\x36\x86\xb1\x9e\xe2\xb4\x4a\xb6\x95\x41\x81\xcc\x7e\xed\x3e\xf5\xbc\x3a\xfd\x33\x19\x2d\xb2\x11\x7e\xa4\x7e\xbe\x8d\x53\x3b\x03\xcf\xfd\x51\xd3\x37\x82\xe8\x64\xe9\x28\x27\x01\x69\xd1\xea\xfe\xae\xc8\x98\xc8\xb4\x72\x2b\xde\xb0\x33\x19\x2d\xb2\x11\x7e\xd3\x5e\x4a\xdb\x3f\xd3\xcd\x4b\xce\x2b\xee\x3d\xca\x20\xe1\x12\xef\xd7\xfe\x46\x0a\x8f\x12\x63\x76\x2c\xf8\xdd\x81\xf4\xaf\x33\x78\xef\x4a\xff\x3f\x13\xd1\xa9\x6d\x22\xaf\xa4\x45\x4f\xf1\xe2\x2b\x5e\xf6\xc9\x8b\x1e\x49\x10\x1e\x09\x56\x8f\x42\x59\xfa\xf0\xb0\x47\x2d\x3d\xda\x3b\x40\xb9\x0d\x7a\x81\x19\xc4\xc1\x33\x9f\x97\xf5\x77\xe1\x1d\xfb\x54\xde\xbb\xac\xfd\x8f\x57\xcd\xb1\xfd\x6b\x0a\x23\xcc\xc4\x15\xe7\x8d\xfa\x2e\xd6\x9f\xef\x8d\x45\x81\x3a\x25\x81\x38\x78\xe6\xd3\x5f\x25\x58\x5e\xd7\x68\xad\xe3\xf3\x2e\x28\xbb\x48\x40\x12\x4f\xe9\x22\x1e\x59\x40\x6f\x83\x11\xba\x16\xa2\x27\x92\x69\xf0\x1b\x11\x17\xc4\xc1\xbf\xc3\xbc\xeb\xf8\x13\x2b\xcc\x7d\xed\x7c\xa5\x7e\x9c\x07\xdd\x9f\xc8\x02\xdb\xaf\x8a\xa0\x57\xaf\xb7\xb9\xcb\x19\x51\x0f\x51\xb9\x08\x20\xe2\x82\x38\x3f\x69\x14\xe2\xbf\xe3\xde\x2a\x8a\x71\xe0\xfb\x39\x2b\x3b\x5e\xa2\xda\xc0\x54\xc5\xfe\x8b\xf6\xd1\x03\xb3\xda\xaf\xbe\x26\xaf\x83\x66\x95\x2c\x62\x9e\x3e\x45\x18\x61\x10\x07\xd5\x08\xff\xbb\x11\x06\xfd\xa0\x4f\x93\x40\xe3\x8a\x19\x51\x99\x8d\x11\x0b\xdf\x84\xa3\x44\x8e\x6f\x69\x6c\xd5\xe2\x90\xb8\xd2\xe3\x70\xc5\xab\xcc\x8d\x28\x25\xbb\x85\xd0\x5e\x08\x88\x83\x4b\x40\x74\x2b\xb3\x23\xd4\xce\xb3\x2a\x9d\xb7\xb2\xe7\xc7\xe7\x4c\x39\x66\x4a\x3b\x17\xf1\x48\xd6\x92\xd4\xec\xca\x2a\x97\x96\xab\xd0\x43\x36\x20\x0e\x2e\x81\x8f\xa8\x7f\xb4\xd5\x1a\x2c\xf0\x29\xfd\x09\xb2\x43\x52\xfc\xbe\x1b\x18\x7d\x1f\x71\x14\xf9\xf1\x83\xb1\x3e\xa4\xd4\xe0\xa1\xa6\x12\x22\x2e\x88\x83\x7f\x87\xf8\x9c\x86\x1c\x21\x5e\xac\x77\x9a\x82\xf1\x5d\x23\x26\xe8\xc9\x39\x34\x8c\xae\x49\x6d\x31\x12\x62\x38\xce\x05\x26\xfd\xe6\x50\xb9\x3c\x88\x83\x4b\xa0\xe5\x0b\x53\xa6\xb6\xc9\xfa\x57\x8b\x74\x0c\x4f\x54\x6e\x2e\xdd\xdf\x5b\x52\xf9\x7b\xdf\x17\x58\x04\xea\xe8\x7f\x2d\x5f\x7b\x7c\x13\xb1\xf8\x01\x71\x50\x6d\x20\xc0\x08\x83\x66\xd7\xd3\x34\xc0\x5a\xdf\x9c\x4a\xa6\x26\xe2\xab\x5c\xb1\xb6\x90\x60\xd7\x13\x28\xf2\x8b\x80\xdb\x07\x5f\xf2\x38\x8b\xa6\xe0\xa6\x49\xd1\x2e\x74\x2d\x1c\xc4\xc1\x35\x50\x7d\x63\x28\x39\x3c\x68\xca\xde\xd9\xd1\x37\x70\xb5\xe9\xf5\x6f\xa1\x11\x4d\x7d\x8b\xb7\x81\x33\xf8\xd8\xb2\xb2\xd1\xeb\x1f\x27\x11\x71\x41\x1c\x5c\x03\x4c\xd9\x93\x93\xba\x41\x1d\xd5\x7a\x0b\xe3\x56\x24\x19\x04\x99\xc9\x79\x59\x2c\x9f\x78\x26\xdc\x96\x89\xde\x05\x0c\x3c\x57\x89\x42\xc4\x05\x71\xf0\xef\x20\x75\xf2\xb6\x46\xda\x3c\x74\x37\xd5\x1e\xe3\xd7\x76\x4d\xd5\xcf\xce\x5f\x3e\xd4\x12\xe7\x0a\x46\xaa\x97\xb9\xa8\x6f\xaf\x3c\x7e\x88\x88\x0b\xe2\xe0\x1a\x18\x91\xe8\x9d\x96\x69\x3d\x1e\x56\x55\xca\xba\x75\xcd\x3a\xc0\xc9\x5d\xc0\x61\xe8\xe9\x2b\x19\x96\xb8\xf4\x1b\xf9\xb3\xc6\x04\xd0\x2b\xdc\x20\x0e\xaa\x0d\x04\x18\x61\x50\xaa\x3b\x4d\x03\xb9\xbf\x25\x16\x87\xbe\xa4\x4c\x9f\xf0\x38\xf2\xe1\x5a\xfb\xb5\x54\x08\x9f\x7b\xfe\xaa\xbe\xfa\x90\xa2\x89\x93\x25\x3b\x96\x60\x04\x31\x76\x10\x07\xd7\xc0\xc2\xdc\xb1\x98\x1d\xee\x53\x1c\xbf\xfc\x77\xfd\xce\xed\x3c\xd4\x09\x5e\x5d\x35\x33\x3d\x5f\x2c\x50\x86\x57\xe2\x51\xb4\x86\xa0\xce\xe1\x20\x0e\xae\x81\xab\xe1\xcd\x8f\xd3\xf5\x26\xf2\xa7\x79\x13\x0f\x16\x19\xe7\xc7\xb5\xa8\x12\x42\x08\x18\xe4\x0a\xf4\x75\x96\xd2\x57\x7d\x2f\x42\x46\x18\xc4\x21\x95\x09\x38\x8d\xdf\x25\xe7\xe8\xee\x91\x5e\x51\x53\x78\xe1\x55\xd4\xc5\x4f\x87\xe5\x2d\xdc\xbf\xed\xa5\xff\x7c\xf6\xf6\xd7\x88\x78\xe8\xba\x2d\x88\x83\x6b\xa0\xff\xe3\xe3\x0c\x19\x91\xda\x73\x17\x67\x8b\xef\xb3\x65\xb0\xdf\x7d\xea\xe7\xb0\x90\x5f\x55\x69\x21\xdf\xd5\x39\x87\x1d\x90\xc8\x87\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\xad\x3b\x4e\xd3\x40\xd0\x7b\x34\x3f\x0c\x2f\xf2\x25\xbf\x77\x3c\x24\x64\x12\x77\x4a\xe5\x72\x25\x4c\xfc\x03\xe8\x3c\x74\x4d\xdc\xf5\x49\xc7\x6d\x6b\x10\x63\x07\x71\x70\x0d\xe8\xaf\xcd\x8c\x6e\x31\x79\x12\xed\x31\x2d\x7a\xc6\xf7\x36\x1a\x50\x25\x39\x8b\xea\x34\xd6\x51\x26\x6e\xc7\xdb\xc4\xea\x17\x43\x5d\xde\x41\x1c\x5c\x03\xd9\xfd\xe1\xef\x6e\x8f\xa5\x06\xaf\xb6\x24\xf4\x38\x84\x1b\xbb\xf5\x49\x62\x96\x2f\xf6\xba\x6d\x4d\xf5\x56\x6e\x60\xb9\x7c\xff\xff\x98\x7b\xcb\xa8\xac\x9a\xef\xff\x9f\x96\x52\x5a\x69\x90\x14\x50\x09\x41\x42\xa5\x1b\x41\x42\x4a\x40\x45\x40\x94\xee\x94\x46\xba\xa5\x94\x46\x40\x3a\x05\x29\x69\xa4\x15\x11\x54\x1a\x04\xa4\x5b\xba\xfe\xeb\xfb\x5b\xeb\x3a\x7f\xef\x73\xb1\xee\xf9\x3c\xe0\xc1\xfd\xfc\xb5\xf6\xc5\x1c\xde\x67\xf6\xbc\xcf\xcc\xde\x33\x0c\x7d\xc4\x05\x70\xf0\xe7\x80\xf6\x28\xa4\x09\x15\xc7\x3d\x4d\xd5\xca\xec\x68\x27\xe9\xa3\xd0\x6c\xda\xf7\xd7\x78\xc3\x84\xea\x0a\x8f\x13\x1b\x6d\xde\x30\x40\x5d\xa3\x41\x1c\x5c\x03\xd7\xfb\xc4\x9f\x16\xca\x98\x18\xfe\xe1\xcb\x33\xf3\x4b\x2e\xff\xa0\x85\x1a\x90\xc4\x30\xb6\xab\x2e\x35\x3d\xf4\xf8\xcb\x42\x58\x2f\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\x64\xa2\x4e\x37\xc2\x58\x3f\x74\x3f\x25\x18\x7f\x50\x1a\xbc\x42\xec\x3a\xa8\x93\xc9\x8b\xab\xde\xff\xe4\x3d\x17\x6e\x97\x7d\xdc\x8d\xef\x4d\xad\x17\x54\x10\xa6\x12\xc4\x21\x1b\xe1\x93\x73\x5c\x2b\x3c\x3b\x6e\x94\x57\xbd\xb9\x62\xeb\xe4\xb1\xd2\xb5\x5f\x30\x67\x59\xb3\x9c\xe7\x55\x54\x72\x35\xbd\x81\x1a\xc9\x8c\x88\x0c\xe2\x90\xed\x6a\x65\xc0\x6f\x67\x52\x6d\xfc\x77\xeb\xf3\xb2\x02\xfc\xd5\xaf\xaf\x1f\xb0\x2e\x88\x9a\x28\x92\x65\xb8\x3d\xfd\xf2\xc6\xd9\x5e\x62\x12\x11\x19\xc4\xf9\x48\xfe\xdf\x93\xfc\x3b\xb2\xe2\xa7\x7d\x8a\x2d\xc3\x1f\xc4\xc7\x86\x46\x2f\x25\x85\x14\x53\xd1\xaa\xef\xdb\x5c\xd6\xc0\x6f\x0c\x0d\x12\xbc\xe7\xe5\xac\x1b\x05\x19\xe1\xb5\x77\xf6\x73\xf9\x43\xb9\x6b\x8b\x2f\x5f\xf6\xb4\x7c\x4e\xad\x5a\xce\xdf\xdb\x13\x0d\x3d\x8f\x7e\x8e\xe8\x56\x21\x9d\x5d\xe8\xc0\xdf\x46\xf8\x89\x8d\xc6\x0a\x55\x11\x46\xd0\x7a\xd0\x80\xbc\xad\x4e\x2b\xc1\xb6\x86\x9a\xee\xf2\xb3\x31\xfb\xfc\x24\xa9\x99\x47\x36\x1b\x99\x7f\xa1\xb9\x69\x85\x34\xcf\x12\x43\xd5\xbf\xbc\xcc\x77\xc1\x49\x96\x22\xa2\x0a\xef\x9a\x22\x98\x55\x52\x1a\x76\xcc\x2b\x29\xf8\x60\x44\xf1\x5f\x33\xc2\xa0\xa1\xfd\x5d\x23\x2c\x0b\x37\x4b\xad\x18\x83\x76\x05\x21\xc7\xcc\xd1\x56\xb5\x6b\x01\x8d\xa3\x7d\xb7\x65\x83\xc5\x38\x05\xaf\x0a\x14\x8c\x4a\x30\x2d\x78\xa6\x71\x9f\xc9\x66\x25\xb2\x11\xee\x17\x60\x34\x5e\x5a\xe2\xa7\xdc\xd1\xa8\xee\x13\xc4\x64\x8c\x8c\xa4\xa2\xc8\xd3\x7e\x1e\x90\x90\x83\xb9\x3f\x62\xfe\xfc\x1b\xd9\x99\x6c\xcd\x8a\x20\xfd\xac\xde\x5d\x91\xcb\x94\x03\x01\x2b\x2d\xcb\x38\x3b\xfb\xea\x63\xf1\xeb\x97\x0b\x69\x76\x0d\xf6\x07\x48\x33\xe4\x56\xa8\x67\x95\x43\xce\x64\xb4\xc8\x46\x98\x33\x06\xad\x7f\xf1\x64\x56\xab\x79\xf0\xcf\x0d\xc5\xaa\x45\x32\x55\x74\x87\xf1\xc2\x77\x96\x3e\x4f\xb3\x6a\x9a\x62\xe9\x15\x5a\xcf\x64\xb4\x0e\x48\x3f\xeb\xbe\xdd\x1c\x7e\xdd\x95\x9b\x0b\x75\xf3\xb2\xdf\x1a\x5e\x00\xbb\xf3\x34\xaf\x91\x3a\x05\x33\x0d\x89\xfd\xb0\xcc\xe5\x01\x6b\xce\x33\x33\xc2\x20\x11\x9d\x96\xf9\x78\x5a\x69\x88\xde\x89\x1a\x32\x44\x44\x4f\x1a\x0a\x64\x88\xcd\x7e\x0a\xc7\xbd\x19\x47\x49\xfc\xac\xcd\x38\x82\x49\xa3\xed\x22\x0a\x62\xc6\x07\x71\xf0\xcc\xe7\x33\xff\xce\xda\x8f\xeb\xe9\x54\x4a\xe0\x8c\xfb\xd5\x52\x7d\xaf\x4d\x19\x22\xbd\xe0\x83\x73\x1a\x99\x16\x6f\x6e\xc6\x25\x32\xb8\x22\xe2\x82\x38\x78\xe6\xe3\xc9\x56\xae\x5d\x77\xb8\x5d\xbc\xc3\x9e\xd4\x1c\x7a\x10\x74\x2d\xf8\x39\x51\xc1\x97\x9e\xe6\x73\x6c\x9f\x70\x1e\xbd\xb9\xeb\x0f\x5d\xe7\x09\xe2\x7c\xc4\x31\xfe\xf1\xf7\x0a\xe3\xe5\xc5\xbb\xc7\xe7\xb5\x2b\x0b\xbe\xa8\x2b\x62\x29\x30\xa6\xea\xa3\x7f\x5c\xf7\x53\x3f\x94\xec\x57\xb7\x83\xee\x31\x06\x74\xce\x0e\xc4\xc1\xbb\x6e\x38\x9b\x1d\x8c\x77\x70\x64\xc6\x13\x1b\xdc\x77\x5a\xbd\x5d\xa9\xac\x33\xa7\xb7\x8d\x11\x17\x10\xb5\x69\x7e\x2b\x9d\x13\x77\x9c\x09\x61\x84\x41\x1c\x54\x23\x2c\xfb\xaf\x8b\x1f\xd0\x0b\x7d\x9a\x04\x8c\x5a\xcd\x74\xaf\xf9\x39\x3c\xda\xae\x89\x7f\x14\x8b\x77\xcd\x44\x37\xdc\x60\x10\x6d\x4e\x6a\xae\xea\x7c\x49\xba\x39\x5e\x3c\x74\x74\x11\xc4\xc1\x25\x20\x44\x5c\x3b\xd4\x97\xcc\x80\x87\x39\x29\x59\x97\x30\x92\xfa\x68\xfe\xeb\x60\xb1\xfd\xd1\x57\x26\xba\x19\xc1\xf3\x87\xe6\x84\xa8\x88\xb8\x20\x0e\x2e\x01\x1f\xe1\xcd\xbd\xbb\x7f\xec\xa5\x9e\x5c\x88\x18\x35\xa8\xc2\xdb\xe9\x0b\xe5\x29\xdf\x6a\xc9\xc1\x36\x7a\xff\xc3\x93\x03\xeb\x1b\x74\x3b\x26\x88\x83\x4b\x80\x33\x5f\x71\x72\x28\x62\xca\xcd\x3d\x22\x29\xce\x76\xeb\x91\x27\xfe\x40\xc3\x7d\xf3\x9b\xf7\x9c\xcc\xc5\x26\xad\x51\xe7\xb5\xa0\x5a\x46\x10\x07\x97\xc0\xc1\xeb\xf8\x39\xb4\x79\x6e\x91\x98\x1f\xdb\xd9\xfb\xba\xbf\xc7\xe9\x34\xd5\xbd\x4c\x59\x7d\x05\xcb\x5f\x45\x7f\xdf\xa5\x51\x69\x42\x2c\x7e\x40\x1c\x54\x1b\x08\x30\xc2\xa0\xd9\xf5\x34\x0d\x88\xeb\x95\x45\xf0\x18\xc5\x57\x0d\xfb\x6a\xbe\x67\xa4\x3f\xd7\x73\x52\x23\x39\x31\xc5\x10\x60\xa4\x79\x74\xd5\x64\x44\x64\x1c\xaa\xe5\x05\x71\x70\x0d\xcc\xa0\x48\x53\x2c\xad\xbc\x98\x53\xc0\x44\x49\x28\xae\xe3\xf8\x1c\x66\x36\x6c\x32\x66\xfa\x71\xb7\x88\x41\x96\xa4\x56\xdd\x06\xda\x09\x02\x71\x70\x0d\xc8\x73\x2a\xfb\x2f\xf7\xe7\x8b\xbf\x5d\x52\x29\x3e\x1c\xd0\xf9\x25\xc2\x48\xe0\xb5\xad\x94\xa5\x1c\x34\x47\xb4\xd6\x11\x54\xf2\x1c\x11\x17\xc4\xc1\x35\x20\x14\xe7\x10\x63\xae\xb8\xbe\xac\x94\xa8\xbd\x40\x29\x90\x15\x94\xac\xff\x66\x20\x3d\x53\xd8\x18\x5f\x5c\xfe\x84\xe8\xfd\x0c\x1e\xa4\x59\x00\x07\xd7\x00\x47\x3d\xe1\xda\xe5\xdf\xa2\x64\xa9\x14\xb7\x45\x3c\x70\xa2\xf0\x43\xaa\xda\x4a\xd6\x62\x36\x58\x92\x5f\x9f\x37\x59\x12\x70\x4c\x45\x68\x00\xc4\x41\xb5\x81\x22\xff\xae\x01\x50\xaa\x3b\x4d\x03\x3f\x23\xf2\xf4\x56\x74\x5f\xd3\xf6\xbd\x1f\x45\x8f\x99\x25\xe9\x29\xbc\xcf\xa3\x2b\x92\xf2\xea\x62\x43\xce\xb8\x51\x44\x85\x2f\x2f\xd4\x2f\x10\xc0\xc1\x35\xb0\x3f\xcf\x99\xdd\x93\x3b\xd7\xf2\x5c\x78\x24\xd4\xfe\x57\x75\xc3\x63\x0c\x6f\x3f\x4a\x1b\x53\x65\xc2\x4a\x51\x0a\xec\x76\x16\x19\x44\x5c\x10\x07\xd7\x80\x61\x6c\xa8\xcb\x7a\xb9\x6b\xd4\x05\x1a\xf6\xb9\x67\x27\xfd\x28\x94\x58\x43\x1c\xa4\x0b\x34\x6f\x12\x33\xd0\x39\x12\xb0\x82\xa1\xa6\x79\x20\x0e\xae\x01\x09\xd7\x12\x71\x19\x26\xc5\xaa\x93\x35\x94\x5e\x1a\xf7\x69\x72\xc3\x82\xc0\xa6\xaa\x6f\x0a\x23\xf7\x63\xa6\x0e\xc8\x0c\xda\x09\xa1\xfe\x91\x00\x0e\xae\x01\x19\xc2\xbe\xf2\x6e\x53\xca\x90\xd0\x3f\x5c\x2c\xd8\xaf\x9c\x1a\xa6\x8c\xae\x8b\xa4\xb2\x14\xcf\xf0\xba\x5c\x78\x44\xf4\xcb\x4d\x09\xa1\x01\x10\x07\xcd\x03\x00\x23\x0c\x5a\x77\x9c\xa6\x01\xbf\xd0\xa4\x32\x8e\xd1\x88\x2c\x8a\x00\xcb\x61\xec\x0f\xab\x93\x63\x9a\x0d\x17\x24\xdf\x2a\x8a\xe6\x12\xe8\x0a\x87\xe9\x06\x42\xd7\xa8\x81\x38\xb8\x06\x4e\x1c\x14\xb6\x5f\x78\x3c\xb7\x3a\xef\x34\xd3\xb7\xb7\x9f\xc0\xac\x7e\x2c\xbf\x25\xbd\x61\x48\xf6\xcc\x22\x65\x6f\x9e\x4b\x1e\x4a\xaf\x20\x0e\xae\x01\x19\x8a\x12\xf3\x87\x4d\xfd\x5b\x77\x87\x66\x59\xfb\x9f\x30\x87\xa1\xdf\xec\x5e\x9a\x7d\x29\x47\xb5\xe6\x8d\x8f\xaf\x9f\xf7\xf6\x3e\xd4\x8c\x0f\xc0\xc1\x35\x50\x5e\xb8\xeb\xe1\x12\x9b\x22\xc6\xd9\x39\x89\x26\xf6\x3e\xe9\xde\xcc\x37\xed\x87\x98\xe6\x09\xfc\x26\xf7\xbb\xf3\x3f\xfe\x78\x05\x9d\x0c\x01\x71\x70\x0d\x58\x36\x7e\x3e\xa1\x64\x2c\x69\x15\x4f\xc5\xb7\x5d\xa1\x7b\xfd\x35\xce\x58\x36\xe2\xcd\x37\x46\x2a\x1a\x83\xb1\xf3\x33\x51\x01\x9d\x08\x0d\x80\x38\x68\x1e\x70\x00\x34\xcb\x02\x98\xa8\xd3\x8d\x70\x4f\xb3\x35\xd1\x91\xb4\x1d\x77\x98\xf1\x67\x29\x81\x0f\xf8\x1f\xb2\x6f\x94\xbe\xfe\x52\x5c\xcc\x32\xc3\xde\xb6\x14\x38\xd5\x2d\x81\x30\x95\x20\x0e\xd9\x08\x3f\xec\xe7\x0b\x0f\x1d\xd7\x8a\xff\xf3\xe4\xde\xf5\x68\x32\x15\xd5\xfa\x12\xb3\x59\xa2\x7c\x12\x5d\xce\x20\x1c\x69\xf4\xa9\x56\x2c\x44\x64\x10\x87\x6c\x84\xa9\x67\xf0\x17\x55\x8d\xdb\x77\x53\x9f\xbe\xe6\x8b\x1c\xf2\xaa\x5d\x1e\xc5\xd9\xbb\x7b\x49\x51\x2f\xe6\x57\xea\xf9\x78\xf4\x2d\x35\x44\x64\x10\xe7\x23\x89\x82\xf2\xcf\xff\x59\xef\xd6\x61\xd3\x56\xae\x98\x70\x39\xf3\xcc\x6d\x02\x7c\x95\x49\xca\x42\x51\xbe\x19\xc7\x42\xa2\xfc\x3b\x64\xac\x47\x75\x55\xd4\x90\x11\xae\x0d\x37\xcb\x7a\x14\x1e\x63\x50\x5f\x60\x17\x65\xa0\x48\xdd\xe7\x51\xf9\xd5\x7b\x73\x4e\xab\x78\x3e\xef\xd1\x0c\x73\xc4\xac\xee\xdf\x46\xf8\x8d\xa5\xc8\x87\x60\x9a\x6c\x9a\x3f\x5c\x2f\x8a\xdd\x7b\x1c\xd4\x03\x12\xfa\xcc\xb1\x6e\x8e\x9b\xbd\x28\x08\x4c\x71\x5f\x75\xe3\xfb\xfb\xa3\xef\xad\x3d\x74\x39\x82\xb5\x9a\xa6\x6f\xfc\xd6\x43\x7e\xc6\xa3\xfc\x2e\x93\x19\xc4\x28\x41\x6f\xc2\x49\x8a\xc7\x5d\x2d\x68\x8d\xff\x6b\x46\x18\x34\xb4\xbf\x6b\x84\x91\x8c\x70\xcc\xcf\xb9\xcc\x9a\xac\x09\x2f\x43\xd2\xeb\x5c\x41\xf8\x62\xfa\x71\xf4\xce\xd4\x6f\x48\x8c\xea\x8a\x73\xad\xe9\xbe\x5c\x7f\x6d\x79\x26\x9b\x95\xc8\x46\xb8\xfa\x24\xa5\x74\xa7\xbd\xfa\xdc\x88\x3d\xe6\xd8\xed\x4a\xf2\x75\xc3\xce\xb8\x0a\xd5\x56\x65\x17\x15\xd6\xcb\xfd\xf8\xe2\x13\xca\x67\xb2\x35\x8b\x6c\x84\xd5\xfd\xbf\x3f\xaa\x98\x5d\x2d\xfb\x7e\x2f\x52\x2f\x88\xc4\x01\x8f\xbd\xc5\xe6\xe9\xc6\xf4\x84\x83\xc9\xc5\x22\xdc\xc8\x98\x3b\x0c\x67\x32\x5a\x64\x23\x3c\xe3\x5c\x14\x2b\x39\x36\xdb\x55\xa6\x21\x50\x98\xcf\x9e\xec\x69\x85\x4e\xa7\xad\xab\x6c\x9e\x2a\xea\x36\x14\x4f\x67\xc3\x3b\x7f\x26\xa3\x45\x36\xc2\x8a\x43\x0f\xd4\xe6\xd3\xdb\xbc\xfc\x7f\x3b\x60\x67\x6d\x2b\xdb\x98\x15\x63\x38\xed\x85\x28\x15\xa0\x92\x94\xf2\xf0\x56\xb3\x08\x9d\x99\x11\x06\x89\xe8\xd4\x4b\x64\xd5\x44\x98\xa9\x28\x27\x3f\x3e\x62\x0a\xf3\x34\x25\xa6\xbd\x36\x2c\x93\xf1\xfe\xf2\x30\x2e\x37\x7d\x62\x64\x11\x6f\x4c\x07\xd4\x26\x12\xc4\xc1\x33\x1f\xdf\x0a\x3f\xa9\x6c\x06\xf3\x81\xe4\xc0\x53\x89\xeb\xf5\xcb\xf9\xbf\x94\x9e\xa5\xbd\x9b\xe5\xae\x90\x90\xe4\xc4\xdd\x9d\x61\x84\x9a\x65\x81\x38\x78\xe6\xdb\x7e\x2b\x7d\xd5\xe0\xea\x65\x3b\x7e\x6a\xf2\x85\xb9\x73\x9c\x85\x1a\x91\x95\x8a\xb3\x5f\xad\x8a\xc6\x48\x73\xf6\x5e\xd9\xd7\xda\x22\xe2\x82\x38\x78\xe6\xd3\x2f\x4a\x33\x89\x2b\xf6\x25\xcd\x53\xac\x45\x1f\xc7\x61\x5b\xbb\xd4\xae\x19\x40\xb6\xed\x42\x7c\x8d\xf5\x5e\xcb\x43\x96\xee\x58\xa8\xfd\x24\x80\xfb\xbf\x0c\xf5\x8f\xcc\x27\x9e\x6a\x7f\x88\xee\x21\x89\x9d\x42\xcb\xd8\xd4\x82\xa6\x96\x24\xa4\x99\x47\xf4\xcb\x48\xa0\x26\x2b\x47\x95\x25\xc8\xd4\x0f\x61\x84\x41\x1c\x54\x23\xfc\xef\x46\x18\xf4\x42\x9f\x26\x01\xc9\x9f\x5b\xb6\x81\xfe\x5f\x3f\x47\x45\x56\x5e\x75\xe8\x18\xb8\x8c\x52\xcd\xd8\x7b\xae\xb6\x76\x96\xe8\x1c\xfa\xb9\xfe\x67\x38\xd4\x50\xd9\x35\x80\x83\x4b\x20\x65\x7b\xc8\xda\x07\xcb\xfd\xd5\x95\x7c\xa1\x20\x9e\x8b\xb9\x23\xcb\xba\x95\x1a\x55\x77\xcc\x2e\xa8\x7f\xa6\xbe\x21\x40\xed\x9c\x86\x88\x0b\xe2\xe0\x12\xd8\x8d\x34\xd8\xd1\x5d\xe8\xb8\xfa\x4c\xd6\xe6\x37\x95\xcf\x87\xcb\xa2\xb4\x56\xaf\xa4\x38\xaf\xa5\x46\x63\xfb\x5b\x5c\xfd\x2c\x01\xd5\x1e\x83\x38\xb8\x04\x1e\xf7\x77\x64\xc7\xef\x4e\x0c\x68\x5f\x98\xff\x2d\xed\xdc\xf2\x01\xbf\xdc\xb3\x39\xea\xe1\xbe\xd1\x0a\x4a\x75\xa4\xc2\xa1\xab\x19\x22\x2e\x88\x83\x4b\x20\xa0\x72\x59\x75\xda\xb9\x5c\x68\xba\xf1\x1e\xca\xf3\x70\x7d\xa5\xc5\x8f\xd2\x29\xf9\x25\x8a\x66\x21\x7d\x3c\x32\xb3\x97\xdf\xb5\x20\x16\x3f\x20\x0e\xaa\x0d\x04\x18\x61\xd0\xec\x7a\x9a\x06\x5c\x6e\x7c\xf1\xfa\x32\x6a\x4c\x8f\xa6\x73\x9b\x4b\x0b\x4d\xde\xec\xa9\x6f\x26\xed\xf2\x8f\xa1\xe0\x6d\x3e\x9b\xc7\x98\xee\x82\x83\x50\xad\x1d\x80\x83\x6b\x40\xbd\xea\xc2\xc2\x83\xcd\x2a\x2b\x9c\x5a\xf7\xe0\xc0\xa4\x51\xd6\xdb\x3f\x1e\x6c\xe6\x16\xa5\xb5\xb2\x47\xf8\x94\x65\x78\xe4\x57\x22\xe2\x82\x38\xb8\x06\x2c\x9e\x98\x36\xc4\xa6\xd8\x51\xe4\x8b\xb3\x50\x2f\x96\x6b\x2d\xed\xce\x9f\xbc\x26\x33\x61\xda\x66\x79\x35\xb3\x95\x9a\x56\x07\x5d\xc7\x02\xe2\xe0\x1a\x58\xef\x8f\xa0\x98\x0c\x6d\xb0\xbc\xa2\x79\x7f\x03\xe5\xd2\xe8\x40\xc6\x27\xa9\xf6\x84\x00\x72\xb6\x8f\xaa\x1a\xfb\x4f\xc6\x1e\x43\x47\x2d\x41\x1c\x5c\x03\xd1\xfd\xa9\x04\xeb\x15\x71\x28\xf4\x2f\x52\xc6\xde\xec\x5c\x7c\x1c\xb8\x2b\xa1\x98\xa9\xaa\x28\x6c\xef\xf4\xce\x2e\xdb\xed\xcb\x16\x42\x03\x20\x0e\xaa\x0d\x04\x18\x61\x50\xaa\x3b\xf5\x63\xc8\x85\x6f\x36\x4f\xee\x33\x3c\x4d\xa2\x0b\xfe\xa2\xcc\xf6\xd1\x77\x4d\x69\x2e\x76\xfa\xe8\x26\x6f\x0c\x06\xb5\x75\x7a\x3d\x25\x17\xf4\x31\x04\xc0\xc1\x35\xe0\xb1\x44\x7b\x47\x4f\xfc\x99\x78\x87\xc3\x9b\xd7\xba\x94\xc9\xda\x79\x4f\x45\xc2\xe4\xec\x37\x6c\x0c\xbf\x92\xa0\x76\x9b\x8e\x43\x57\x52\x81\x38\xb8\x06\xc6\xb3\xba\x29\xd5\x9d\x2f\x60\x3d\xbb\x50\x90\x2e\x85\xcf\x9c\xa2\x2f\x63\x93\xdb\x4d\xe2\x92\xfa\xb0\x68\xf1\xf5\x4b\x2f\xca\x97\x88\xb8\x20\x0e\xae\x01\xb1\x8e\x7a\x61\x91\x1f\xa5\x12\x9a\xe8\x58\x89\x75\xcd\xcf\xe4\x57\xb2\xaf\xf9\xe0\x8a\x19\xd4\x10\xaa\x1e\x36\xdc\x0d\x48\x2f\x84\x4e\x05\x00\x38\xb8\x06\x58\xd9\x26\x1f\x7f\x3d\x62\xa3\x78\x5f\x74\x69\xef\x4f\xd5\xf0\xf3\x4c\x43\x55\x3b\xdd\xeb\x22\x4f\x63\x3d\xd6\x45\xf4\xe4\xd7\xf9\x11\x1a\x00\x71\xd0\x3c\x00\x30\xc2\xa0\x75\xc7\xa9\xd7\xa8\xcd\xbd\xed\x10\xf6\xf8\xd2\xa9\xb8\xb1\x8d\x73\xf1\x67\x69\x81\x76\xc6\x65\xc5\xcf\xa8\x2e\xfa\x56\x9c\x47\xc4\x04\x3b\x65\xd0\xc1\x28\x10\x07\xd7\x40\xd9\x9b\xd8\xfa\xfb\x8c\x5a\x8e\xea\xcc\xb3\xe7\xf7\xbe\xb2\xbc\xbb\x3c\x44\x73\xef\x4b\x68\xf0\xd4\x2b\x53\x7f\x6f\x69\xeb\x40\xe8\x04\x07\x88\x43\x6a\x9a\xc7\x8e\xfe\xb2\xb3\x7b\x22\x2d\x4c\xdf\xe8\x24\xf8\x0a\x3f\xd1\xaf\x09\xf4\x37\xfd\xba\xa3\xd9\xb7\x8c\xd6\x50\x6b\x14\x24\xa0\xe5\x0b\x88\x83\x6b\xc0\xc6\x5e\xce\xc0\x13\x45\x4e\x29\x7a\x91\xb3\x8d\x07\x53\xbb\xf5\x43\x8c\x73\xac\xc6\xa3\x27\x93\x2e\xa1\x0a\x4d\x22\x47\x69\x1f\xa0\xee\xf1\x00\x0e\xae\x81\x57\xfd\xb5\xd1\xa2\xb7\x79\x49\xd6\x30\xbb\x1e\x37\x29\x4d\xd0\x3c\x1a\xde\xf4\x5d\x2f\x17\x2f\xd3\x57\x2b\xae\xa4\xf5\xc7\x2d\x41\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\x4c\xd4\xe9\x46\xd8\x3d\x58\xf7\xd6\x15\xaa\x22\xfe\x98\x39\xce\x9a\x71\x23\xd9\x54\xf2\xc8\xf4\x03\x46\x0b\xaa\x9e\x7a\x86\x0a\x6d\x5a\xbe\xca\x46\x84\xa9\x04\x71\xc8\x46\xb8\xbb\xe8\xf3\xa3\x0b\x98\x57\xc2\x3d\x6a\xde\xb2\xe9\xb8\xfe\x08\x7a\x1d\xbd\x4a\xb5\xc0\xfb\x46\xcc\x2e\xef\xb7\x46\xa1\x4b\x0b\xb4\x6f\x0b\xe2\x90\x8d\xf0\x11\xbf\xd8\xa8\xc0\x5b\xa6\x8b\xea\xbb\xfd\xc7\x0f\xcf\x73\x78\xcf\x04\x30\xab\x39\xa2\x2b\xee\xf1\x47\x04\xd7\x9c\x7f\x54\xff\x06\x11\x19\xc4\xfd\x9f\x11\xfe\xe7\x3b\xf1\x3f\xdf\x23\xdc\x4e\xd6\x2f\x17\x9a\x51\x33\x91\x8c\x57\x5e\xbe\x56\xaa\x83\x36\xa8\xf8\xf1\xf3\x3b\xec\x6d\xde\xf1\xf9\x8a\x4b\x0f\x7d\xf1\x13\xfe\x36\xc2\xaf\x5d\xde\xb5\x2f\x1a\x0b\x2d\xe9\x9f\x7b\x93\x10\x50\xdf\xb0\x8b\x2d\xb5\xb7\xd2\x41\xff\xdc\x7b\x81\x97\x4c\xfd\xc9\x27\x7b\xf5\xbf\x50\xdb\x14\x3c\x77\xc1\x9f\xa1\xbd\x4b\x96\xc2\x6f\xe8\xba\x29\x45\x7e\xaa\x4b\xc8\xfd\x21\x14\xb7\xbe\xc6\x71\xe9\x20\xf3\x58\xdf\xfa\xbf\x66\x84\x41\x43\xfb\xbb\x46\x18\xc9\x08\x3f\x3a\x30\x70\x09\x7c\x2c\x94\xdb\x68\x98\xd7\x5d\xa9\x96\x7d\x5d\x20\x23\x44\xf4\x8f\x8b\x6a\x76\x4f\xba\x46\xd2\x6a\x89\xee\xad\x33\xd9\xac\xe4\x45\xf2\x68\x86\xbc\x7e\x98\x54\x86\x45\xb5\xd7\xc7\x37\xd1\x37\xc5\x3e\xe4\x5d\x6c\xea\xef\x5e\x97\xdb\x64\x56\x1a\xd2\xd2\x5a\xf3\x60\x4d\x3e\x93\xad\x59\x64\x23\x9c\x86\x9a\x24\x81\xf2\xf2\xfe\xfa\x03\x92\x99\x02\xd3\x14\xab\x4d\x4b\x1c\x35\x35\x8c\xf4\xe0\x5a\x2e\x4b\xd2\xea\xf9\xed\x1f\xe7\xce\x64\xb4\x3a\x48\x3f\xfb\x64\xd5\xbf\x3c\xec\x28\xdb\x36\x38\xc4\xea\xb2\x21\xe1\x68\x67\xc6\xb5\xad\x55\x7a\x8b\xf6\x91\xee\x78\x82\x31\x4f\x45\x86\x6b\x67\x32\x5a\x64\x23\x7c\xb5\x63\xed\xea\xcb\xe3\x31\x8c\x3a\xd5\x3e\x92\x9c\x17\x92\xab\x86\x6f\xed\x27\xcb\x6f\x1e\x70\x7a\xb0\xcb\xe4\x8e\x49\x0f\x1c\x9c\x99\x11\x06\x89\xe8\xb4\xcc\x17\xf5\x16\x6f\x7f\x24\xa7\x23\x71\x7f\x9d\x8a\x70\xf3\xc7\xdc\x67\x4b\x6a\x0a\xb2\xce\x03\x2d\xba\x75\x42\x1c\x32\x26\x3a\x76\x28\xeb\x83\x38\xa4\xfb\x12\x0c\x02\x1b\x7e\x86\xd4\xdd\x66\xce\xe4\xa7\x73\xf8\xe9\x38\xa1\xfe\x08\x2d\xfb\xa6\xf0\x75\xf7\x64\x8a\xae\xa3\xc4\x4a\x53\x09\xe8\xbe\x04\x00\x07\xcf\x7c\xf3\x4f\x67\x03\xa9\x84\x29\x85\x85\x29\x0d\xbf\x67\xa2\x9c\x93\xef\x25\x78\x2d\xcc\x50\xfa\x1e\xfb\x62\xcc\xb5\xb2\xa5\xd4\xf2\x8f\x50\x4d\x33\x80\x83\x67\x3e\xb3\xbb\x85\xcb\xaf\x64\x06\xde\x8b\x6c\xf8\xd6\x7a\xae\x94\x0c\xa6\xd8\x88\x7e\x27\xfb\x98\xa0\x92\x3d\xa7\xa4\x5c\xa1\x41\x08\x39\x01\x10\x07\x7f\x0e\xe5\x7d\xd8\x74\xf7\x37\xd4\x9d\xfd\xee\x3e\xd4\xbb\x78\x07\xc5\xd1\xac\xa0\x02\xe3\xf8\x57\x76\x5a\xb4\x62\xdd\x52\xd5\xcc\x10\x3f\xc2\x08\x83\x38\xa8\x46\xf8\xdf\x8d\x30\xe8\x85\x3e\x4d\x02\xc2\xf3\xc3\x56\x5f\xf5\xff\xf0\x07\x72\xa5\xac\x7c\xbb\xfb\x52\xb1\xb0\x7d\xdb\xb1\xc8\xf6\xde\xb4\x01\x95\xdc\x35\x41\x91\xb1\x5c\x68\x33\x1c\xc0\xc1\x87\x1e\x96\x53\x8b\x4e\x51\xf2\x6a\x73\x76\x6a\x67\x4b\x29\x57\x89\xa3\x29\x5a\x23\x45\x6a\xdf\x42\xfe\xc3\x83\x03\xd9\x37\xe4\x23\xd0\x71\x5b\x10\x07\x97\xc0\xe8\x43\x26\xfd\x88\x0b\x18\x77\x8b\xed\x15\xe4\x68\xfc\xd7\xd1\x8f\x5d\x5f\x6c\xe5\x17\xa7\x64\x5d\x2b\xb4\xd7\x6c\xd4\x8b\xb4\x41\xc4\x05\x71\x70\x09\xb8\xb2\x76\xad\xb4\x4e\x60\x75\x74\xb0\xaf\x7d\xad\x72\xe4\x38\xfa\x6c\x58\x86\xed\x1f\x2e\x92\x7d\x71\xf2\x63\x17\xcb\x8c\xfe\x3a\x22\x2e\x88\x83\x3f\x87\xa7\x37\x6b\x2e\x8c\x5e\xd4\xd8\xb9\x5e\x8b\x61\x4a\xf8\x8b\xda\xc5\x80\x60\x29\x55\x99\x80\xc7\xcd\xe8\xfe\x88\x50\x29\x7d\xf5\x05\xc4\xe2\x07\xc4\x41\xb5\x81\xbc\xff\xbe\x00\x06\xcd\xae\xa7\xd6\x89\x5f\x26\xab\x1a\xcd\xe4\x8d\x18\x8a\x69\xcc\x3b\xbc\x94\x7e\xbd\x6e\x30\x2c\xfd\xee\x9c\xc6\x4b\xac\x45\xc6\x25\x3b\x8f\x1e\xe8\x3a\x71\x10\x07\x1f\x3b\xcd\xba\x26\xad\xa4\x81\xa1\x6f\x97\x92\xd3\x61\x81\xef\x2b\x69\x0e\xf7\x5d\x9a\x72\x0e\xaa\x69\x3a\xf5\x29\x0b\x5f\xa1\x4a\x67\x44\x5c\x10\x07\xd7\x80\x88\x91\x9f\xc7\x9f\x73\x27\xdc\xe8\x1b\x68\x4f\xfd\xfa\xfa\xb2\x3f\xc7\xbf\x1e\xdc\xdc\xc8\xdf\xbd\x5d\xd6\x27\xb7\x9f\x43\xf1\x1a\xaa\xe1\x03\x70\x70\x0d\x64\x0a\xca\xdd\x0a\x60\x09\x67\xaa\x52\x68\xd7\xad\xe7\x26\x77\x3e\xb4\x54\xf0\xa7\xc9\x1a\xa2\xe5\x3d\x32\x3c\x5c\xee\x92\xd0\x86\x9e\x03\x80\x83\x3f\x87\xac\xac\x90\x6d\x4b\xf9\x0d\xf1\x0b\x89\x1f\x50\x82\x0d\xe6\x8b\x3f\x19\xf0\xb0\x3e\xc7\xdb\x8c\xf4\x36\xea\x52\xa1\x0f\x3a\x92\x41\x68\x00\xc4\x41\xb5\x81\x00\x23\x0c\x4a\x75\xa7\x69\xe0\x98\x43\x84\xf7\xfb\x9a\x2a\xda\xf6\x33\x61\x57\x4c\x7a\x92\xc8\x1e\xa9\x03\x55\x03\x29\x6a\x42\x66\xa9\xd0\x89\x98\x3f\x92\x50\xc9\x01\x88\x83\x8f\x9d\x42\xcf\xa2\xd8\xc9\xbb\x46\x30\x83\x24\xe9\xe7\x15\x72\x6d\xc9\xfc\x18\xd5\x63\x93\x60\x0b\xbb\xb8\x93\x9b\x2a\x34\xa9\x39\x50\xfd\x39\x88\x83\x6b\xe0\x63\x34\x49\xf6\x7d\xf4\xbc\xae\xd1\x18\x76\xfd\x32\xd3\xe0\xd2\x1a\xa5\xa1\x60\x8b\xa5\x8e\x0c\xae\x90\xaf\x49\x4c\x2b\x8d\xd0\xee\x25\x88\x83\x6b\x80\x38\xf7\x1a\xea\xbb\x1f\x34\x75\xfe\xad\x1b\x0f\xab\x8c\x7c\xcb\x75\x67\x63\xde\x72\x77\x97\xd8\x15\x91\xc7\x10\x69\xf5\x1f\xa4\x20\xe2\x82\x38\xf8\x73\x90\xdb\xb8\x14\x5a\xf3\x66\xef\xc2\x15\x3b\x86\x87\xb7\x7b\x17\xae\xa8\xee\xaf\x3f\x6c\xf8\xc0\xc6\x4c\x3a\xb4\x4b\x44\xe7\x6d\x2e\x80\xd0\x00\x88\x83\xe6\x01\x9d\x7f\xd7\x00\x68\xdd\x71\x9a\x06\x9c\xee\xd1\x99\xe1\xae\x5e\xaf\x58\x3b\xa6\xe1\x67\x77\xcc\xfe\xa3\x92\xaf\xb9\x5d\xc7\x54\xc0\x39\xd7\x3c\x82\x5e\xa3\x4d\x28\x8b\x18\x3b\x88\x83\x8f\x3d\xb0\x21\x86\x6e\xbf\x7e\x68\x7a\xea\x2e\x43\xdc\x4c\xb4\x4f\x12\xe5\x6e\x5e\x81\xa8\xfe\x2f\xdd\x12\xa1\xc3\xc1\xc9\x93\xa0\x1f\x88\xb8\x20\x0e\xa9\x46\x38\x2b\x66\x6f\x49\xd2\x3c\x50\xb4\x5e\xe6\xee\x66\x05\x89\x1b\x27\xd9\x0b\x9d\x9f\x98\x2f\xaf\x6d\x59\xf1\xa3\xe9\xdd\x6a\x83\xfa\x3a\x80\x38\xb8\x06\xea\x0e\xea\xaa\x63\xb2\xa9\x3b\x6b\x5e\xb0\x69\x98\xea\x3b\x9e\xff\x98\xf6\x3c\x7a\xc1\x9f\xf2\xf8\x62\x5c\x52\x8d\x5a\x6a\x3d\x74\x2a\x00\xc4\xc1\x9f\x83\x7c\xbd\xec\x5a\x83\xee\xcf\x44\xae\xc5\xb2\x0b\xe9\x0b\x05\x5f\x4f\x5a\xba\x7b\x2e\xfb\x76\x4f\x28\x0d\xb2\xbe\x23\xd6\x78\xf9\x0e\xba\x4a\x0f\xc0\x41\xf3\x00\xc0\x08\x83\x4c\xd4\xe9\x46\xd8\x32\xcd\xc5\x2a\x51\x84\xfb\xd1\xab\xe6\xe1\x2a\x41\xbc\xdb\x54\xbf\x30\xb2\x2c\xf2\xb2\x30\xf8\x26\x33\x88\x7a\xd4\x73\x3a\x0a\x11\xa6\x12\xc4\x21\x1b\xe1\x3b\xc1\x0b\x0e\x7e\x7e\xa1\xb2\xcb\x37\xb8\x0d\x1b\x46\x7c\x19\x35\xf3\xd7\x68\xd1\x95\x74\xb6\x9d\xbe\x5b\x3c\xdf\xb2\xbb\xf5\x18\x11\x19\xc4\x21\x1b\xe1\xd7\xd4\xa4\xe8\x38\xcc\x1d\x78\x53\xda\x2a\x28\x9d\x4b\xae\x2b\xd8\xd8\x09\x3d\xe7\xe7\x8b\xe3\x5e\x2e\x18\x9e\xdf\xf5\x13\xe6\x43\x44\x06\x71\xff\x67\x84\xff\xf9\xf1\xe2\x7f\xbe\x47\xf8\x96\xc0\x5d\x92\xab\x39\x96\x9b\x45\x65\x51\x8b\x7c\xb2\x0f\x67\xb5\xb3\x42\x7d\xf6\x03\x48\x88\x86\xfd\xc2\xae\x16\x5d\x0f\x4d\xfa\xdb\x08\xfb\xae\x78\x7d\x7b\x6b\x30\xab\xe6\x10\xe1\x2d\xfe\xdc\xd5\x27\x04\xc7\xe3\x9e\x8b\x6e\x6a\x58\x26\xfe\x20\xea\xb1\xd2\xb4\xc8\xdb\xbf\x50\x35\x75\xf4\x10\xb9\x88\xa4\x27\x99\x86\x03\x9d\xd8\x96\x09\xb6\xca\x71\x65\x49\x21\x82\xc3\x55\xca\x0f\xd1\xaf\x0c\xe7\x58\x7d\xfa\xaf\x19\x61\xd0\xd0\xfe\xae\x11\x46\x32\xc2\x38\x94\x57\xb0\x5e\x9d\xf0\xdb\x9f\xb4\xee\x27\xf0\xac\x5b\x26\xd1\xe6\xfa\x66\x35\x10\x34\x75\xa5\xb8\xb7\xd6\x8c\x5f\xdc\xd7\x3a\x93\xcd\x4a\x64\x23\x7c\x01\x3b\xeb\xa0\x03\x9d\xb1\x9b\x6b\xc6\xeb\xb8\x30\xfd\x76\xd9\xe3\xae\x91\x28\x92\xd2\x13\x3e\xe3\x57\x19\xe1\xf7\xb1\x06\x98\xce\x64\x6b\x16\xd9\x08\x4b\x6c\xb3\x78\x6f\x4d\x1c\xc7\x2c\x3e\x66\x18\xda\x2c\xbe\x59\x45\xba\x86\xc5\x31\x7c\x22\x12\x69\x52\x7e\x39\xf5\xfb\xd5\xc3\x33\x69\x0d\x26\x8a\x6c\x84\x37\x23\xbf\xde\x30\x51\x67\x7e\x82\xf2\x26\xe6\x52\x9b\x8a\x61\x02\xea\xfd\x09\xda\x9a\x1a\xdc\xcf\x37\x9b\x86\x35\x6a\xd3\x86\x3c\xcf\x64\xb4\xc8\x46\x58\x86\x5f\xcf\xb2\xf0\xf3\x5e\x6f\xa0\x0b\x66\xf0\xf9\x6a\xc2\xdf\xde\xea\x36\xaf\x08\x49\xd0\xa9\x8e\xe2\x5b\x4e\xb8\x31\xaf\xf2\x9c\x99\x11\x06\x89\xe8\xb4\xcc\xf7\xf6\xa8\x9d\x44\x7f\xdd\xf9\x46\x83\x99\x00\x57\xe3\x70\x69\xa3\x7f\xd5\xf5\xb9\x0b\xb3\x13\x51\x97\x6d\x3f\x94\x17\x97\xdd\xda\x81\x3a\x99\x00\x38\xf8\x8c\x8f\x5d\x62\xd9\x16\x7d\xe3\x2a\x3b\x87\xda\x84\x91\x34\x6e\x70\xee\xfd\x47\x53\x36\x92\xd5\x71\x72\x47\xc9\xd4\x19\x44\x6f\x59\xa0\x15\x30\x88\x83\x67\x3e\xd4\x97\x49\xa1\xc9\x3c\xc3\x0b\x09\x79\xed\x66\x32\x54\x59\xbd\x0e\x8d\xfd\x8d\x01\x0f\x08\x1f\xe3\xe1\xa9\x6c\x64\x4f\x71\xfc\x42\xc4\x05\x71\xf0\xcc\xf7\x3a\x8b\xa9\xbc\x8d\x9e\xe6\xd0\xe9\x9d\xbb\x9e\xbb\xd3\x24\x07\x5b\xe7\x2b\xb5\xae\x9e\xb5\xe2\xf3\xe7\x93\x5e\x4f\x65\xef\x40\xdb\x16\x20\x0e\xfe\xf7\x3a\x2b\xe2\xd3\x5c\xd2\xc9\xf0\xb7\x65\x71\xd5\x16\x9e\xa4\x3d\xae\x7b\x69\xd1\x13\x6a\x5b\x10\xa8\x21\xcc\xf9\xec\xa5\x5a\x0f\x2a\x74\x34\x1a\xc0\x41\x35\xc2\xff\x6e\x84\x41\x2f\xf4\x69\x12\x48\xdc\x27\x58\x99\xd1\x17\xf2\xa2\xf3\x2a\x25\x41\x8f\x72\xf9\xcc\x37\xd0\x10\x64\xdd\x2d\xda\x31\xf7\x5b\x5f\x85\xcc\xf3\x72\x27\x62\xe8\x20\x0e\x2e\x81\xe7\x2a\x59\xe4\xd3\xbf\x87\x44\xfe\xdc\x8c\xb3\xf8\x60\x66\x2e\xa1\x6f\xe7\x47\xfb\x7b\xc2\x8c\xb4\x67\x5b\x62\xe2\x45\x82\x23\x11\x74\xd8\x00\xc0\xc1\x1f\xe9\x98\xc2\xe3\x1f\x96\xfa\xe9\xb1\x77\x83\x6b\x04\xf2\xf3\xd9\x83\xd1\xd9\x53\x95\x07\x24\xd2\xfd\x5a\x59\x9d\x3c\x9b\xe6\xe5\x07\x10\x71\x41\x1c\x5c\x02\x3c\xcc\x9b\x2b\x17\x45\xa4\xf3\xaa\x4b\xdc\xcc\x62\x02\xf7\x25\xf1\xe5\x6b\x49\x77\x94\xb0\xa9\x65\x34\x65\xde\xd2\xa5\xb2\x15\x41\xa7\xee\x01\x1c\xd2\x62\x8d\x8f\xdb\x20\x14\x7d\x68\x9b\xb5\x41\xbb\xdc\x50\x89\x5f\x21\x34\xed\x8d\xb2\xf7\xbd\x31\x9b\xf9\xc6\xdc\x18\x57\x51\xed\x2c\xc4\xe2\x07\xc4\x41\xb5\x81\x00\x23\x0c\x9a\x5d\x4f\xbd\x42\xcb\x69\x7f\x7f\xbd\x43\xb4\x65\xe6\xdb\xfc\x7c\xae\x88\x95\xec\x33\xba\x6d\xdd\x4b\x54\xb5\xfd\x5f\x7f\xca\x6d\xcf\xdf\xeb\x80\xbe\x2f\x81\x38\xb8\x06\xa4\x76\x54\xca\xe2\x2f\x54\x5a\x95\x57\x5a\x5a\xde\x8d\x43\xdd\xd3\x6b\xcc\xda\xd5\x0f\xdc\x6d\xe5\x38\xf9\xe9\x9e\x15\xd3\x07\x2d\x54\x41\x1c\xfc\x99\xe2\x10\xaf\x2a\xff\x49\xf0\x9e\x7d\x9f\xca\xaa\xe1\xb7\x1e\xe1\xba\xe7\xe0\xd1\xee\x5b\xf5\xa5\x2c\xeb\xf8\xca\xa7\xaa\x4e\x35\x48\xb3\x20\x0e\xae\x01\x3f\x02\x17\x9e\x6d\x49\xeb\xce\x2d\x82\x18\x3e\xd4\xb7\x52\x2b\xbe\x4a\x7f\x96\x37\xf9\x33\x42\x97\xaf\x90\x4b\x6d\xfe\xc6\x81\x6a\x0e\x41\x1c\xfc\xef\x0d\x0c\x33\x79\x9e\xdf\xb9\x5b\x8b\x15\xfe\x3c\xc3\x32\xb6\x7e\xd0\xf9\x79\x92\x01\x76\xd3\x75\xe7\x10\x46\xcc\x9b\xec\x2c\x16\x50\x7d\x28\x88\x83\x6a\x03\x01\x46\x18\x94\xea\x4e\x3d\x16\x4b\x21\x1d\x2a\x76\xf9\x72\x5c\xab\xf2\xe0\xba\x18\xd6\xf8\x93\x06\x9f\xb4\xa7\x02\xc7\xfb\x74\x1b\xa9\x2d\x34\xb5\x5f\xcf\x75\x43\x63\x07\x70\x70\x0d\x5c\x11\x30\x44\x75\x32\xd7\xa4\x2d\x45\x6f\xe5\xcd\xd8\xe2\x2b\x21\x5b\x14\xea\x6b\x6d\xf8\xbe\x8f\xf5\xe0\xeb\x43\x31\xcb\x51\xa8\x0f\x21\x88\x43\x2a\x91\x08\xbf\xf4\x9a\xda\x06\x45\x95\x9b\x6c\x21\x37\x24\xe6\xfa\x86\x5b\x27\xfe\x0a\x7b\xaf\x85\xcf\x4c\x72\x99\x78\x8e\x4c\xd4\x4d\xa8\x44\x02\xc0\xc1\x35\x30\x61\x8e\x53\x5d\x16\x7c\x84\xfd\xfa\x90\x83\xbe\xcb\xf9\xda\x8a\x6b\x6a\x78\x41\x35\x45\xb8\x8a\xe1\x63\x4d\xc7\x9b\x69\x83\xd0\xa9\x00\x10\x87\x74\x05\xfe\x36\xf7\xc7\x1f\x69\xfd\x9d\x8f\x2b\xf5\x1e\x5e\x94\xdb\x70\xea\xfa\x20\x57\xf1\x4b\xae\x37\x4b\xf5\x63\x65\x5c\x25\xef\x22\x26\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\x4d\x03\x28\x13\x22\x5d\x56\x99\x07\x1c\x3a\xfa\x66\x81\x26\x2a\x32\x91\xba\x73\x99\xc4\x5e\x52\x74\xa4\xae\xd8\x0b\x3e\xd6\xce\xa6\x47\x88\xb1\x83\x38\xb8\x06\xee\x7c\x24\xba\x6f\xa2\xab\x2c\x67\xef\xf4\xc5\x7a\x3c\x3a\x9c\x2a\x20\x4c\x20\xcb\xad\xfe\x07\xe5\xaa\xa2\xba\x11\x5f\x18\x1b\x74\xdd\x19\x88\x43\xba\x41\x20\xd4\xef\xde\xd4\xf2\x61\xb6\x35\x46\x99\x8e\x87\xb7\x20\xe6\xbc\x39\xff\x52\x4a\xde\xc7\x3a\x67\xa3\x3e\x87\xfa\xd8\x93\x4b\x88\xb8\x20\x0e\xae\x81\xae\xc3\x8c\x01\x71\xed\x97\xa1\xbd\xe6\xb5\x8d\xca\x04\xd6\xc1\x4f\x6d\x28\xb5\x7b\x49\x9a\x6a\x3e\x54\xe8\x09\xe7\x05\x53\x40\xa7\x23\x40\x1c\xfc\xef\xcd\xd9\x21\x2b\x42\x61\x62\x59\xf2\x60\x89\x89\x13\x96\x15\xdc\x70\x42\x7d\x47\x32\x5c\xf1\x8e\x29\xcb\xbb\x38\xff\x9c\x4e\x0a\x74\x7d\x12\x88\x83\xe6\x01\x80\x11\x06\x99\xa8\xd3\x8d\xf0\x93\x70\xca\x67\x8b\xf3\x79\x49\xbf\x8a\x64\x68\x28\x66\x70\x3c\x66\x34\xa6\xf7\xaa\x74\x92\xe9\xaf\xa8\x65\x8e\xa5\xc4\xd0\x0e\x20\x4c\x25\x88\x43\x36\xc2\x49\x27\xd1\x47\x86\xab\xd7\x9d\x19\xe4\x57\x77\xfa\x77\x64\x1a\x27\xf8\xc7\x79\x77\x6d\xd9\xd7\xcb\x4a\xab\xe7\xe3\x3f\xa1\x41\x35\xc2\x20\x0e\xd9\x08\x17\x98\x96\x57\x94\xad\xef\xf5\x30\x1d\x97\xfe\xe2\x22\x2b\xbf\xa7\x77\x91\xc0\x45\xfb\xa6\xb0\x6e\x44\x54\xbb\x8f\x38\xc6\xc1\x65\x44\x64\x10\xf7\x7f\x46\x98\xfe\x9f\x46\xf8\x7f\xbd\x47\x78\x89\xa6\xa3\x8b\x3a\x49\x31\x14\x6f\x47\x45\x7b\x4b\xd2\xb5\xe8\xd0\x4e\x92\xce\x51\xdf\x44\xf0\x92\xa7\xe4\xa5\x34\x7f\xe2\x82\xbf\x8d\xb0\xdf\x5e\x5d\xbd\xee\x96\x9a\xed\x2d\x6f\x93\xd8\xe0\x80\x9b\xbc\x09\xba\xcf\xa7\xaa\xcb\xe4\xfc\xe7\xa2\x4d\xea\xaa\x1f\xf7\x13\xfd\x85\x2e\x3c\xa9\xad\x76\x62\x71\x60\x50\x97\x9f\xae\xf3\xff\xb2\x43\xea\x4a\x21\xf0\x5e\xd6\x34\x19\xe3\x59\xa9\x9a\xf5\x80\x4b\x2c\xe5\x7f\xcd\x08\x83\x86\xf6\x77\x8d\xb0\x1c\xdc\x2c\x61\x28\xac\x5f\x52\xde\x0c\x0a\x96\x94\x68\xb1\x68\xbe\xe1\xa6\xf6\xd3\xb7\x53\x2b\xcf\xe6\x28\x83\x34\xd9\xb5\x91\x81\xaa\xea\x4c\xfa\x28\x7b\x22\x1b\xe1\xcd\x2a\x0b\x5d\x22\x47\xc7\xcf\x66\xa9\x6d\xe5\x2f\x73\x71\x18\xea\xb0\xe2\x5f\x34\xdf\xaa\xc4\x6f\xd6\x3f\x7a\x1e\xfa\xd5\x3d\xf6\x4c\xb6\x66\x95\x91\x7e\x96\xca\xbf\xe8\xad\x2b\xc1\xb2\x70\xbe\x79\x54\x47\x63\xb1\x8a\x16\x51\x69\x37\x2b\xf7\xa4\xf6\x81\xb0\x59\x37\x96\x50\x40\x67\xdf\x99\x8c\x16\xd9\x08\xf7\xfc\xa1\xbf\xf6\x20\xbb\x89\x9a\xdc\xf2\xd8\xd3\x74\x6f\xd8\x4c\xb2\x48\x34\xbc\x6f\x2e\x3f\x27\xaa\x86\x78\xe4\xb8\x5e\xca\xfb\x4c\x46\xeb\x88\xf4\xb3\xdc\x47\x1c\x97\xb1\x1c\x2e\xdb\x95\x8c\xf2\x39\x07\xb7\x1a\x25\xde\x61\xa7\x3e\xbe\x67\xf1\x51\x78\x7c\xe4\xe4\x9d\x95\xa1\x51\xf9\x99\x19\x61\x90\x88\x4e\xcb\x7c\x2f\xb5\x44\xe9\x9c\xb0\x55\x5d\x8f\x4d\x9f\xf4\x65\xca\x31\x9d\x14\x0c\x3e\x57\x17\x10\xc9\xe8\x68\x59\x19\x14\x7d\x3d\x4f\x02\x5d\x9a\x08\xe2\xe0\x99\xcf\x53\xb8\x8b\xf0\xa2\x51\xe9\xfb\x85\x88\xc7\xa1\x01\x05\x26\xcc\x77\x6f\x61\xb6\x19\x7f\x91\x3e\xb6\xd1\xbc\xd5\xc2\xc2\xe0\x8e\x83\x88\x0b\xe2\x90\x8c\x30\x76\x96\xe8\x47\x05\xca\xdb\x83\xf6\x77\xdc\x18\x08\x6f\x7d\x9b\xb2\x4c\xec\x34\x6c\xc8\x18\x74\x32\x68\x98\xdb\x95\xf8\x04\x15\x88\x82\x38\x78\xe6\x6b\x7a\xf8\xe8\xce\xe2\x34\x65\x8a\xf1\x9f\xc1\x97\xef\x7f\x25\x3b\x2c\xb5\xa1\xbc\xbf\x67\x64\xc0\xe5\x18\xa4\xa2\x4c\x99\xc6\x02\x65\x3e\x10\xe7\x23\x8e\xe2\xf9\x77\xdc\x9d\x1c\xe3\x65\xb4\x1b\xd7\xa6\x0a\xc6\xbd\x59\xa9\x44\x34\x8f\x8e\xc3\xc6\x9d\xba\xc5\x4e\x38\xe8\x6b\xf8\xcb\x04\x39\xbe\x35\x20\x8c\x30\x88\x83\x6a\x84\xe5\xfe\x7d\x01\x0c\x78\xa1\x4f\x93\x80\x5b\xf8\x9b\xc0\x1a\xfe\xab\xd7\x13\xe2\x50\x64\xf4\x4b\x7d\xc4\xcf\x99\xf6\x1b\x3d\x09\xbb\x88\x72\x3d\x40\xc1\x58\xc3\x44\x19\xea\xec\x0b\xe2\xe0\x12\x60\x66\x3d\x0a\xd6\x4e\x1d\x26\xff\x71\xc8\x9e\xb6\x9b\x8f\x29\xdd\x72\x28\xc0\x4c\x26\xf5\xfc\x9a\xe4\xed\xef\x5f\xc5\xf8\xa5\xa0\xa6\x33\x20\x0e\x2e\x81\xe7\xab\xfc\x93\xd2\x8a\x77\x7a\xb4\xc4\x8e\xc4\x84\xae\xb4\x8e\xa0\xf5\x0f\xab\x5a\x92\xb4\x5b\x54\x26\xbe\x50\xee\xbd\xd1\x1c\x06\x19\x6c\x00\x07\x97\x40\x80\x4e\x6d\xa3\x1b\x35\x7f\xd7\xf9\x7b\x42\x4d\x69\xf2\x19\x92\xec\x9e\xbc\x1f\x3f\x51\x4f\x2a\x97\x38\xf7\x74\x75\x1e\xaf\x41\xf7\x13\x83\x38\xb8\x04\x56\xec\x1a\x17\x4f\x78\x1d\x0b\x23\x54\xd8\xbc\xd8\x8f\x3c\x72\x52\xc4\xee\x31\xc9\x1e\x92\x67\xb5\x8f\x8e\x7c\x30\x3f\x52\xf2\x47\x2c\x7e\x40\x1c\x54\x1b\x08\x30\xc2\xa0\xd9\xf5\x34\x0d\x18\x5f\xe7\x48\x23\xe4\x7e\x61\x20\x71\x6f\x39\x27\x61\x29\x83\xf1\x29\xb1\x91\x44\x5d\x8f\xa6\xfe\x07\xb4\x4e\x8b\x42\x16\x52\xe8\x48\x24\x88\x83\x6b\xe0\x1a\xcf\x9c\xf6\x17\x63\x34\xbb\x87\xa1\x35\x61\xad\xa1\x8a\xba\x84\x43\xaf\xef\xf2\xec\x86\xea\x95\xab\x1c\xa2\x39\x4b\x5c\xab\x82\x0c\x36\x80\x83\x6b\xc0\xa1\x81\xb0\x3a\xfa\xf7\xd7\x9e\x39\x33\x4e\xfd\x9b\xdf\x4a\xb3\x6e\xfc\xd8\x35\x46\x15\x90\xed\xd6\x51\xbf\xaa\xa8\x4e\x6c\x05\x5d\x9b\x02\xe2\xe0\x1a\x30\xb1\x45\x9b\xca\xe5\x4e\x9b\xbc\x8f\xba\xf9\x94\xfd\x76\x6d\xb7\xe9\x2a\x37\x71\x30\x93\x35\xea\xf9\xaf\xf9\xbf\xef\xa7\x3f\xea\x40\xc4\x05\x71\x70\x0d\x3c\xee\x14\xbc\x64\xde\x7c\xe8\xbd\xe3\xf5\xb4\x57\x27\x02\x9d\xf6\xc1\x01\xba\x63\x79\x95\x2f\x89\x94\xb5\xa8\x60\x4e\xb1\x5e\x06\x42\x03\x20\x0e\xaa\x0d\x54\xfe\x77\x0d\x80\x52\xdd\x69\x1a\x48\xc8\x93\x91\x43\x8f\xa0\x9d\x4c\xb2\x9d\xdc\xbe\xaf\x1e\x4c\x7a\xbe\xb7\xb6\x92\x88\x90\x52\xa8\x85\x5c\xcf\xc6\x41\xa3\xa1\x05\x31\x76\x10\x07\xd7\x80\xae\x6c\x8d\xb8\xce\xf2\xdc\xb7\xf8\xd9\xc4\x83\x16\x23\x22\xf2\xdb\x37\xe6\x03\xae\x5e\x08\xb1\xb0\x3d\x2f\xd0\x7e\x13\xd5\xce\x1f\x11\x17\xc4\xc1\x35\x30\xd2\x7f\x1e\xc3\x1b\x57\xeb\x9c\x2e\x95\xa6\x77\x2b\x11\x6b\xdc\x90\x50\x0a\xee\xc2\xcb\xa9\x5c\x5c\x0a\x85\xab\x3d\x47\xa9\x4f\x10\x71\x41\x1c\x5c\x03\x54\x7b\xaa\x97\xc8\x6d\x3a\x50\x6f\x48\xe6\x10\xaf\x66\x95\x45\x4a\x50\xe0\x95\x8e\x04\xd4\x57\x74\x26\x5a\x09\xd0\xea\x96\x40\x4d\xc3\x40\x1c\x5c\x03\x77\x8e\x8c\x38\x9b\x93\xf2\x97\x89\x49\x0e\xec\x67\x1f\xe6\x0e\xed\xd8\x78\xf7\x19\x61\xc8\x2f\x1c\xd9\x4d\xa4\x11\xed\x8e\x76\x20\x34\x00\xe2\xa0\x79\x00\x60\x84\x41\xeb\x8e\xd3\x34\xf0\xbd\xc0\xe4\xfb\xd5\x3d\xa9\x5d\xc7\xb1\x54\xe1\x11\xad\x88\x0f\x19\xbd\x15\x71\xd7\x8f\x98\xc4\x37\x9b\x1c\xe9\x5b\x7e\x31\x42\x35\xf2\x20\x0e\xae\x81\xb9\x5b\x13\x71\x4e\x9e\x6a\x74\x55\x56\x9c\x2a\xb7\xee\xf4\xfd\x78\x9b\xa3\x35\xaa\x60\x44\xae\x84\xcf\x28\xf8\xed\x12\x2f\xa9\x17\x22\x2e\x88\x83\x6b\xc0\x6a\x58\x98\x3e\x3d\x82\x9e\x9c\x23\x4b\x65\x4d\x47\x8d\x52\xc4\xa3\x93\x95\xd0\x25\xae\x77\x9b\x98\xf1\xa0\xf8\x7b\x72\x0b\x74\x2d\x13\x88\x83\x6b\x80\xf7\x52\xc1\xfa\x70\xb9\xee\xe5\x35\x73\xf6\x9f\x37\x5f\x3d\xe1\xca\x54\xf5\xde\xbf\xb1\x93\xd7\x7a\x45\x4a\x41\x40\x86\xcf\x0b\x6a\xc4\x06\xe2\xe0\x1a\x88\x25\xa6\xd2\xcd\x7d\xa9\x5e\x72\x9e\xef\xc1\x6d\xbd\x67\x36\x94\x24\xd7\x8f\x59\xde\xf8\x3c\xb6\xe5\xdf\xa1\x8e\x62\x24\x37\xbf\x81\xd0\x00\x88\x83\xe6\x01\xc7\x7f\x37\xc2\x20\x13\x75\xba\x11\xee\x5c\xda\xaa\x20\x92\x58\x8b\x6a\xa6\xf0\xc6\xf9\xca\xf1\xd6\x07\x6b\xfd\xa6\xe3\x18\x6f\x20\x8d\x7e\xb5\x90\x8d\xcd\xdc\x0d\x39\x84\xa9\x04\x71\xc8\x46\xd8\x21\x7a\x5e\xad\x86\x02\x95\x68\xf0\x6b\xb2\xc5\xa7\xb8\x0e\xda\x3f\x7d\xf7\x62\xf3\x06\xef\xb3\x5a\xf0\xc4\x76\x73\x67\xfc\x1c\x46\x44\x06\x71\xc8\x46\x78\xaf\x8f\xed\xfc\xa2\x88\xc7\xcb\x73\xb2\xdc\xe9\x8e\xf7\x56\x29\x02\x6f\x4b\x5c\x65\x13\x58\x26\xf4\x1f\x97\xc7\x32\xbb\xef\xbb\x81\x88\x0c\xe2\xfe\xcf\x08\xc3\x3e\xe8\xff\xaf\xf7\x08\x13\x2c\x0e\xca\x92\xcf\x32\x0a\x64\x6d\x5c\xd0\xd7\x4a\xa8\xef\x36\x31\x79\xb3\xa6\x45\x5e\x71\x45\x33\x6c\xb3\x14\x07\xeb\xad\xd3\xdf\x46\xf8\x7e\xa5\xbc\xe8\xf9\x54\x33\x0a\xf4\x85\x39\x94\xde\x59\xed\xfb\xf8\x8b\xbc\x6a\xd1\x41\x2f\xb1\xb3\x7e\x51\xa4\x8e\xbf\x28\xef\xff\x0b\x15\x5b\x3c\xb4\x3b\x74\xb7\x5f\x41\x23\xb3\xc9\xeb\x1d\x11\x62\x4d\x3e\xde\x36\x92\xb9\xa1\x71\x5f\x24\xc6\xd7\xc2\x2d\x6b\x82\xfb\xbf\x66\x84\x41\x43\xfb\xbb\x46\x18\xc9\x08\xbf\xe2\x55\x21\x44\x9d\xa1\x5c\xc4\x7c\xf8\x5b\x58\xb7\xea\x64\x29\xb1\x06\x3d\x6b\x45\x64\x27\x8a\x60\x62\x78\xde\x8b\xe6\xe3\xd9\x34\x34\x46\x36\xc2\x43\xb8\xd7\xd5\x3f\x14\x9f\x4b\x66\x11\xf5\xf3\x31\x93\x30\x33\x30\x7a\x32\xfb\x85\x80\x5b\x45\x66\xb8\xbe\x25\x99\xbe\x85\xf2\xea\x99\x6c\xcd\x22\x1b\x61\x89\xa6\x30\x5b\x1f\x63\xc6\x3c\xbd\x47\x66\xd1\x9a\xed\xac\x79\xf4\x78\x16\x99\xb9\x79\x86\x93\x55\x36\x3c\x1f\xae\x9c\x34\xb1\x9f\xc9\x68\x91\x8d\xf0\x91\x09\xaf\x68\x48\xcf\x37\x2a\x6c\x34\x43\xe3\x7a\x1a\xf1\xf3\x66\xca\xf8\xbf\x57\x5e\x91\xb0\x0a\x3a\x91\xa3\xf4\x46\xa5\xbd\x3c\x93\xd1\x22\x1b\x61\xdb\x70\x05\x0c\x7f\xe1\x4f\x0d\xcc\xdf\xa7\xef\xa7\x89\x0c\x93\xa5\x5e\x73\x8b\x2b\x47\x5f\xb8\x98\x5e\x74\xa0\xf1\x7d\xab\xa5\xe4\xcc\x8c\x30\x48\x44\xa7\x65\xbe\x37\xf5\x87\x1d\x49\x6d\x4d\x2e\x8a\x9f\xdc\x55\xfb\xfb\x0b\x6e\x44\x18\xe2\x0d\x77\x31\x88\x13\xf5\x79\xf1\x25\x97\x5c\xf8\x0e\xb5\x89\x04\x71\xf0\xcc\x47\x42\x6e\xc6\xd1\xfa\x53\xa1\xf9\xcf\xf8\x9c\xc2\xc4\x85\x0f\x14\x1a\xdf\x04\x62\x6c\x3d\x84\x9b\xee\x56\x67\x2a\x7e\x20\x7c\x08\x75\x77\x06\x71\xf0\xcc\x27\xfe\xfc\x86\xd0\x7d\x5d\x07\xc6\xf7\x66\xd1\x92\x3e\x3b\x3d\xab\x7c\xb1\xdf\x24\xa9\xd7\x75\xc9\xd8\x95\x03\x64\x48\xe7\xc7\xa0\xc2\x30\x10\x07\x2f\xde\xd1\x7b\x6a\x73\x85\x81\x9a\xe4\xf1\x00\xf3\xa5\x05\xce\x2a\x27\x31\x4f\x9c\x4e\xca\x9b\x15\xfa\x63\xbd\x68\x6d\x0a\xea\x18\x8a\x21\x88\xb8\x20\x0e\x9e\x51\x49\x82\x04\xed\xec\x2f\xa9\x0d\x4d\x3a\x2c\x09\x7f\x26\xc3\x1e\x72\xd8\x49\xd5\xdf\xe0\xa1\xa7\xac\x2f\xbd\xec\x35\xe8\x89\xf3\x08\x61\x84\x41\x1c\x54\x23\xfc\xef\x46\x18\xf4\x42\x9f\x26\x81\x81\x56\xdf\x93\x94\xc6\x48\x0b\x6d\x9b\x72\x63\xf9\x67\x35\xb6\xa5\xf6\x58\xd8\x14\x12\xe7\xd4\x39\xe3\x14\x99\xa4\x5d\xb4\xa0\x23\xc1\x20\x0e\xe9\x58\xac\xc6\x71\x14\xcb\xb3\xfd\xda\xd4\xc1\x38\xd2\xb7\x2c\x7a\xfe\x7f\xc2\x23\x3c\x3c\x28\x7f\x29\xe3\xd1\x07\x4a\x51\xeb\x6a\x4a\x42\xc7\x62\x01\x1c\x5c\x02\x46\x8e\x6a\x71\x43\x32\xda\x2f\x2f\x44\x79\x2c\xef\xd7\x44\x3b\x99\xbe\x35\x36\x75\x4f\x6c\xb7\xef\x2e\xb9\xbb\x57\x2e\x30\xfd\x13\x6a\xee\x05\xe0\xe0\x12\x68\xfb\x49\x91\xcd\xfe\x8e\x9c\xaf\x76\xd7\xbb\x61\x57\x41\x7c\x0a\x2f\x60\xa4\x6a\xa6\x73\x3b\x55\x2b\xe6\x07\xc1\x9c\x4f\xe3\x36\x22\x2e\x88\x83\x4b\xa0\xd1\x8b\xdd\xfc\xfd\x6f\x1b\x2e\x3f\x8c\x2b\x61\xd1\x5a\x9b\x5f\x1f\x7f\x1a\xe4\x2b\xc4\x15\x6e\x63\x0e\xad\x7f\x82\x86\x45\x6e\x82\x58\xfc\x80\x38\xa8\x36\x10\xb4\x23\x0c\x98\x5d\x4f\xd3\x00\x39\xbd\xda\xf1\xfa\xb3\x1e\x82\x4c\xed\xf5\x66\x3b\xc1\xa8\x1e\x3a\x74\x97\x7c\xf2\xe5\x71\x32\x3d\x92\x16\x5d\xaa\x01\x63\xe8\x0e\x65\x10\x07\xd7\x40\x7d\x67\xef\x1c\x47\x1a\x4e\xfe\x34\x97\x75\x41\x93\xfd\xa5\xaf\x9c\x2d\xe7\x50\xa9\x1f\xe2\xb0\x59\x27\x2f\xda\x7e\x88\xb7\xf8\x04\x75\xf8\x06\x70\x70\x0d\xac\xdf\x7a\xea\x62\x78\xe7\xbb\xca\x64\xbc\x43\x5a\x37\x6e\x77\xff\x41\x98\xb5\xa7\xbf\xee\x58\xfb\x72\x4e\xc7\x96\x98\xa0\x26\xd4\x8b\x0f\xc4\xc1\x35\xd0\x7d\x9f\x96\x24\xa1\x92\x5e\x4a\xdc\x66\xf6\xaa\x12\x69\x84\x99\x6e\x80\x27\x3e\xd3\xab\x45\x6a\x0f\x7f\x82\x6b\x15\x29\x4b\xe2\x88\xb8\x20\x0e\xae\x01\x66\xcd\xbc\x71\x96\x8b\xac\x4f\x9e\x67\x44\x55\x86\x53\x5c\x27\x57\x3d\x0c\x97\x5e\xd5\xfd\x99\xe4\xb4\xb4\x3d\x96\x69\x36\x1d\x81\xd0\x00\x88\x83\x6a\x03\x01\x46\x18\x94\xea\x4e\xd3\xc0\x94\x79\xc3\xb0\xe7\xab\xfe\x5e\x2d\xae\x0c\x25\xe3\x6d\x02\x1a\x62\xf4\xad\xba\x6b\x17\x1f\xcc\xe8\x30\x9d\x6b\x61\xfe\x9d\xad\x8b\x18\x3b\x88\x83\x6b\xe0\x0f\x91\x55\xf7\xf2\xe7\x6e\x03\xf5\x4c\x76\x03\xd2\x6e\xb5\x52\xd6\x97\x5f\xfc\xf5\x4c\x74\x1f\xa9\xd3\x87\x1a\xed\xdb\xdf\x50\x82\xba\x30\x03\x38\xb8\x06\xd6\xa4\xf8\x71\xdf\x4c\x65\xba\x16\x0e\x2f\xdb\xf5\xf8\xaf\x96\x30\xbf\xc8\x74\xfb\x9e\xa7\x65\x5e\xd4\xd2\x51\xa6\xec\x52\x0f\x7d\x13\x05\x71\x70\x0d\x8c\xfd\x7c\x22\xa9\x39\x26\x10\xdb\x16\xbc\xf6\xf1\x8d\x79\x49\x1f\x5f\xc7\x36\x99\x3f\xeb\xeb\xd7\xca\x11\xce\x8b\xc9\x43\x92\x1a\xd0\x89\x13\x00\x07\xd7\xc0\x9f\x01\x82\x55\xda\x7b\xa3\x57\xbf\xcc\x3c\xbd\xa2\x4b\xe0\xf4\xc9\xc9\xa7\x53\x49\x32\xc1\x20\x37\xf9\x47\x0d\x5e\xb5\xaa\x60\x0f\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\x4d\x03\xa4\x79\x0f\x9e\x99\x15\xf3\xfb\x8e\xbe\x68\x50\xe6\xd1\x9a\x77\xac\xa0\xc6\x75\x1b\xce\x36\x39\x39\xd7\xbd\x38\x16\x3d\x5f\xc5\x82\x18\x3b\x88\x43\xfa\x28\x1a\x4c\xf7\x54\x76\x89\x2f\x6e\x2f\xbc\x43\xeb\xcf\x01\x9e\x86\xf4\x83\x88\x73\x86\xfb\x0c\x7d\xee\x4b\x02\x5d\x49\x4e\x9a\xd0\x15\x5a\x20\x0e\xae\x81\x09\xac\xc8\x1c\xed\xe1\x5b\x42\xc2\x2d\x0a\x72\x73\xc3\xdf\x63\xb5\x79\x2e\xdf\xb4\x96\x8a\xb8\x55\xfd\x8d\xc2\x17\xe5\x53\xeb\x1f\x68\xf7\x1e\xc0\xc1\x35\xe0\x7f\x58\xab\x2c\xef\x90\x62\x32\xce\x88\xbf\x20\xc1\x58\x1d\xfa\xed\x95\xd1\xe7\xc2\xa7\xec\x86\x1f\xd8\x0f\x5b\xc7\x5f\x7b\xdf\x82\xba\x67\x03\x38\xb8\x06\xaa\x87\x62\xc8\x16\xf2\xf0\x68\x4c\xb4\xfc\x87\x97\x1e\xb2\xf8\x99\xc4\x31\x35\xd4\x5f\x3a\xae\x13\x39\xcf\x4d\xfc\xbe\x20\x4c\x10\xa1\x01\x10\x07\xcd\x03\x00\x23\x0c\x32\x51\xa7\x1b\xe1\x46\x6e\x57\xba\x10\x07\x6b\x56\x9e\x86\x74\x8c\xc0\xc3\x95\x75\x1f\x31\xde\x6d\xdc\x24\x4c\xc6\xb9\x80\x42\x8c\xa5\x85\xe8\x1d\x84\xa9\x04\x71\xc8\x46\x38\xef\xcf\xab\x34\xdb\x28\xc5\xcf\x87\x64\xfc\x9b\xc2\x33\x7a\x0f\xf8\xd7\xc6\x46\x7e\x56\x65\x50\x79\x0a\x5b\x2e\xfe\x1a\xf4\xc5\x41\x44\x06\x71\xc8\x46\x58\xd8\xb4\x7e\x74\xc3\x98\xd0\xd0\xac\x55\xc6\xfe\xab\x4a\x53\xc6\xd2\xfb\xb5\x86\x06\xe1\x51\x82\x93\x67\x0c\xcb\xf1\x23\x83\x94\x88\xc8\x20\xee\xff\x8c\x30\x0a\xda\x3f\xca\x5a\xfe\xd7\x7b\x84\xf3\x6e\xf2\x5d\x12\xe5\x89\x61\x7a\x41\x65\x4f\x56\xe0\xe6\xb3\xa8\xc4\xa1\xc0\xed\xc9\x65\x70\x77\x35\xde\xad\xfe\x3e\xad\x3a\xfb\xdf\x46\xf8\x23\x39\x5e\x14\x0b\x6a\xb8\x81\x12\xe7\x23\xac\x3d\x07\x91\xa3\x56\x69\xa9\x49\x9d\x9a\x9b\x1c\x2f\x92\x6b\x9f\xef\x30\x56\xbf\xfb\xfb\x44\xe9\xbb\xc8\xc8\x9d\x20\x15\x01\xab\xe9\xe4\x12\x4c\x6e\x8a\x79\xe3\xe6\xc4\x97\x04\x43\x56\x1f\x49\xeb\xab\x62\xbe\xf4\x79\x63\xfd\xd7\x8c\x30\x68\x68\x7f\xd7\x08\x23\x19\x61\xe3\x27\x7e\xeb\xf7\x4d\x9a\xa2\xbb\xca\x4d\x77\xcc\x63\xe7\x2f\x1f\x2d\xba\x6b\x06\x27\xba\xb2\x91\x8e\x1c\x37\x5d\xa0\xe1\xb5\x3e\x93\xcd\x4a\x3e\x24\x8f\xf6\xc3\x6f\x57\x55\x90\x41\x54\x27\x37\xde\xdb\x21\xef\xa6\x44\xcb\x93\xeb\x37\x37\x71\x95\x6f\x31\xbc\x58\x1c\x4d\x59\xc3\x74\x33\x3d\x93\xad\x59\x64\x23\x9c\x14\x3f\x36\xb3\xdc\x6e\x78\x2d\x10\xed\x0f\xdf\x71\xcc\xfa\xcd\x83\xa0\x5c\x0b\x21\x9a\x0d\x3e\x9c\x93\xdb\x61\x31\xbe\xb3\x8f\xce\x64\xb4\xba\x48\x3f\x3b\x4f\xd3\x60\xf8\x51\x54\x6f\xd8\x27\x99\x8e\x5f\xdd\xa7\xc1\x3b\x6d\x46\x5d\x25\xbf\x35\x9c\x37\x57\x5b\xf1\xeb\xfa\x21\x5a\xcd\x99\x8c\x16\xd9\x08\x77\x65\x08\x85\xb3\x2c\x10\x2e\x96\xd8\xb3\xd5\x7d\xa0\x91\x9c\x79\xee\xeb\x8d\xda\xc4\x70\x12\x93\x44\x4c\x65\x31\xca\xff\xee\xe8\xcc\x8c\x30\x48\x44\xa7\x65\xbe\x22\xfa\xad\x6b\xb6\xbb\x8e\x47\xcd\x1f\x07\x4b\x27\xef\x3e\xdf\x34\x32\xd8\x77\xb5\xb4\xa8\x5a\x75\xf8\x62\xe0\x69\xbe\x11\x75\x82\x98\xf1\x41\x1c\x3c\xf3\xbd\xb7\xa8\x09\x2c\x0e\x64\xf8\x86\xaa\xf6\x4c\xdb\x82\xc6\x7e\x4e\x8d\x2d\x8c\xd8\x60\xbc\xf7\xed\x94\x33\x61\x20\x8a\xea\x43\xe8\xc8\x35\x88\x43\x6e\x17\xfb\xed\x8b\x1d\x85\xe8\xdd\x2f\x14\xbd\x9e\x5f\x45\x24\xfd\x5b\xd2\x2e\x5f\x58\x1a\xb8\x3c\xc2\x90\x54\x6f\x32\xc4\x61\xd1\xf4\xff\xb7\x8b\xfd\x77\x0e\xa9\x9b\x4d\x70\xdf\x3e\xb6\x52\x7b\x76\xba\xf4\xa5\x48\x63\xf9\x09\x72\x6a\xdd\xab\x4f\x67\x66\x3a\x4b\x17\x55\xa8\x43\x88\x46\xff\xcc\x21\xe2\x82\x38\x1f\x71\xd1\x7f\x6e\x33\x6e\x57\xf3\x7c\x8e\xc4\x5b\xe6\x11\xed\xfa\x5a\xf9\x2d\x55\x21\x57\x58\x54\x2f\xd1\xf2\xdd\xd1\xee\x2f\x91\xa6\xfc\x9c\xc6\x04\x84\x11\x06\x71\x50\x8d\xf0\xbf\x1b\x61\xd0\x0b\x7d\x9a\x04\xb6\x30\xcc\xda\x8f\x9e\x19\xdd\xc9\xbb\x24\xc0\xb1\xc9\x15\xb2\xfb\xd0\xf5\x53\x73\xa1\x58\x69\xe1\xb7\xc0\x98\xf8\x0f\x86\x25\x50\xc7\x60\x10\x07\x97\x80\xac\x6b\xa4\xdb\x6c\x45\x82\xee\x34\x6b\x99\xeb\xa7\xea\x7b\x1d\x37\xf7\x64\x7e\x70\x2f\x3c\xdc\x51\xbe\xfa\xe6\xcd\x5c\xd5\x06\x09\x22\x2e\x88\x83\x4b\x60\xf2\x3d\xae\xd4\xeb\xe6\x1c\x55\xcb\xdf\x3f\x1f\x7c\x7f\xb4\xb0\xb1\x16\xd1\x5b\x53\x2d\x79\x7b\x6e\x18\x77\xae\x1f\xb5\x5e\x41\x0f\x11\x17\xc4\xc1\x25\x90\x46\x2b\x48\x16\xfe\x83\x2f\x9b\xb6\x7c\xc6\xa6\x8f\x48\x4a\x48\xd8\xcb\xa1\x49\xbb\x77\x86\x3c\xd0\xd3\x24\x2c\xfb\x87\x0f\x74\x28\x00\xc4\xc1\x25\x60\xa3\x3c\x67\xb9\x61\xc2\x72\x8d\xb0\xc6\xe3\xb7\xda\x1c\x7a\xa3\x5e\x19\x46\xa7\xfc\xa3\x77\xea\x4a\x39\x02\x56\xfd\xcc\xa9\x38\x88\xc5\x0f\x88\x83\x6a\x03\xf9\xfe\x7d\x01\x0c\x9a\x5d\x4f\xd3\x80\xc9\x76\xce\x82\xac\xc2\xb7\x26\xab\x4c\x82\x6f\x8c\x62\x3c\xe4\xf6\xdc\x09\x58\x6a\xd8\x23\x49\x1a\xd6\x2d\x24\xa3\xa5\x45\x50\x6f\x3b\x10\x07\xd7\x80\xeb\xd5\xc8\x44\xba\x0d\x82\x8f\xe7\x6f\xe9\x88\x5c\x21\x1e\x0a\x26\xbf\xad\xcf\xae\xd9\x2a\x75\xf1\xc2\x6a\x8d\x42\x33\xc7\x21\xd4\xdd\x19\xc4\x21\x5d\x27\x2e\x57\x11\x8b\xe6\x61\xd3\xb5\xd3\xe8\xf6\xd0\x67\xf4\x8e\xc3\x70\x8b\x1e\x63\xc3\x40\xcc\xe6\x35\xb6\xfc\xb0\x9e\xfd\x2d\x62\xe8\xe8\x22\x80\x83\x6b\x80\x1b\xb3\x2b\x5b\x3c\x9a\xad\x1f\x37\xae\x04\x43\xb1\xc7\xfd\x1b\xf5\xea\xcf\xdb\xcd\x93\x97\x49\x62\x96\x52\xf0\x97\x46\x42\x1e\x22\xe2\x82\x38\xb8\x06\x70\x03\xfb\x98\x70\xcb\xbe\xbf\xd8\x37\xaf\x4d\xa6\xd5\x49\x35\x77\xf6\xcc\x0e\xf8\xf3\x92\x19\x63\x39\xc3\x03\xbb\x86\x64\xe5\x19\x74\x2c\x16\xc0\x41\xb5\x81\x00\x23\x0c\x4a\x75\xa7\xd6\x87\x7a\x45\xe9\x4c\x46\x7f\xf5\x33\x9d\x2a\x2a\xc7\x96\xc4\x92\xbb\x1a\x46\xf5\x30\x6a\xfa\x7a\x97\x27\x71\xbb\x70\xc6\x5c\x82\x10\x54\x1f\x0a\xe0\xe0\x1a\x50\x0e\xc8\x42\x13\xc6\xaa\x28\xf8\x9c\xad\x64\xdd\x3b\xf5\xee\x00\x45\x71\x57\x8a\xf3\x75\xa3\xb9\x32\x3b\x5f\x8e\x4b\x7f\xb3\x0b\xd4\x80\x09\xc0\xc1\x35\x40\xc5\x7a\xde\xa8\x8a\xc1\xcf\xcf\x20\xc8\x16\xa3\x3a\xcf\xdd\xe7\xf6\xc5\x1d\xd6\x21\x5d\x21\xb5\x7e\x32\xae\x85\x2d\xe7\xbd\x25\x68\xe7\x16\xc0\xc1\x35\xb0\x38\x49\xd3\x69\x81\x9a\xda\xdb\x86\xf1\xa7\xd1\xb8\xcd\x32\x42\xee\x16\xf3\xb4\xf6\x95\x37\x1b\x7e\x0e\x82\xe6\x23\x5a\x27\x34\x88\xb8\x20\x0e\xae\x01\x0e\x75\x79\xce\x22\xc2\xd8\xdd\x14\xe9\xb0\x14\xf4\xe6\xc5\x1d\xc7\x08\x8b\xb0\x82\xf2\x93\x5c\x74\xbc\xc7\x3b\xd3\xd1\x22\xbb\x50\xe7\x70\x00\x07\xcd\x03\xba\xff\xae\x01\xd0\xba\xe3\x34\x0d\x84\xf8\xf8\x7e\x62\xf5\xb3\xac\xdb\x14\xbb\x98\x2a\xc6\x69\x56\x6d\x31\x97\xaf\x45\xe2\xaf\xf9\xa6\x4f\xa6\xd8\x8e\xea\xd0\xe8\x10\x31\x76\x10\x07\xd7\xc0\xfa\x96\x10\xe9\xe6\xed\x8c\xb9\x62\x3a\x49\xa6\x79\x89\x41\xee\xed\x44\x3f\x42\xdb\xaa\x00\x0a\x37\xad\x03\x53\xf6\x4d\x6e\x6c\xe8\xc3\x15\x80\x83\x6b\x40\x8a\x65\x89\x2b\xaf\x28\xd1\x32\xa3\x16\xf5\x45\xd5\x61\x73\xda\x2e\x4a\x75\x4c\x0d\x1a\xdf\x53\x43\xc1\x08\xba\xd0\x19\xda\x8b\x50\xe9\x05\x80\x83\x6b\x20\x30\x5a\xec\x64\x7e\x08\x95\x60\xe6\x6d\x53\x45\xfc\xe7\x98\x52\xfb\x7d\xc6\x6b\x4a\xd8\xc3\xcb\xab\x5b\xd9\xf7\x3b\x14\xce\x67\x42\x35\xcd\x00\x0e\xae\x81\xa8\xe0\xd7\xef\x09\xcf\x71\xa4\xe7\xb1\x1a\xed\x0d\x71\x05\x3e\x7b\x5f\x28\x7a\x51\x4f\x82\x27\xc5\xd5\x24\xfa\x1c\x9b\x35\xd1\x0b\x84\x06\x40\x1c\x34\x0f\x00\x8c\x30\xc8\x44\x9d\x6e\x84\x0b\xb1\xaf\x49\x79\xdb\xb2\xa3\xfb\xeb\x3f\xff\xb4\x55\x18\x52\xfe\xf5\x43\x52\xf9\x1d\x81\x2f\x2b\x36\x7b\x21\xf3\x3f\x7b\x8d\x20\x53\x09\xe2\x90\x8d\xb0\xcb\x9d\x12\x4d\xce\xd5\x9d\x4e\x0a\x7c\x16\xc2\xc7\x11\x76\x71\x57\x70\xcd\xad\xc3\x0e\xed\xb2\x54\xd5\xe2\xfc\x69\x1b\x5c\x3e\x23\x22\x83\x38\x64\x23\x8c\xc5\xa6\xb4\x72\x31\x50\x78\x4c\xa8\x28\xf6\x33\x8b\x7a\x86\xb7\x42\x5c\xd7\xf9\x25\xf9\xa1\xfd\x76\xf2\xf3\xdb\xaf\x39\x9d\x31\xa1\x2b\x9f\x00\xdc\xff\x33\xc2\xff\xd0\xd8\xff\x7c\x8f\x70\x9b\xe9\xd3\xbc\x72\x4e\x94\x17\x4f\xbe\xc8\x7f\xc1\x2f\x61\x91\x52\x7d\x6b\x28\x97\x31\xff\xd5\xff\x89\x80\x52\xf9\x95\x7b\x2d\x43\x7f\x1b\x61\xeb\xf0\x90\x38\xcc\x06\x9d\xe0\xd7\x45\xe8\x2f\xbf\x97\xe7\xc9\x66\x2f\x16\xce\xf6\x19\x92\x8a\xb6\x07\x50\xda\xbd\x49\x5f\xe7\xff\x0b\xe5\x29\x66\x12\x4e\xc4\xbc\x28\x33\x49\x6c\x27\x8f\x4e\x69\x9b\x2e\xc0\x30\x7c\xd7\x84\x34\xc6\x77\x51\x70\xf5\x3d\x3a\x45\x99\xd7\x7f\xcd\x08\x83\x86\xf6\x77\x8d\x30\x92\x11\xee\x93\x92\xa1\x8d\xc3\x36\x8f\xc8\xb0\x8e\xa7\x95\x53\xff\x5e\x14\xfb\x8b\xd8\x55\x41\x0e\xbb\xd8\xf7\x52\xf7\x39\x2a\x34\x9b\x33\x31\xc2\xa2\xc8\x46\x78\xc1\xf1\xeb\x93\x8f\x83\xd7\xca\xa8\x28\xdc\x0c\xa9\x7d\xc7\x51\x3c\xbf\x1d\x62\x89\x72\xb7\x29\xbf\x9c\x6b\x7a\xd8\x80\x46\x89\x76\x26\x5b\xb3\xc8\x46\xf8\x19\x56\xf2\x2b\x0b\xdc\x54\x5f\x47\x89\x05\xec\xcd\x5a\x3a\xb6\x36\x5a\xda\x5d\xff\x9a\x6a\x55\x9d\x79\xbb\x80\xfc\x96\xfa\x99\x33\x19\x2d\xb2\x11\xfe\x5d\x8e\xd5\xe9\x81\xb9\xdb\x50\xb6\xb5\x47\x6a\x67\x7f\xdc\xd0\x91\x56\xb0\x50\xe1\x3d\x2c\x60\xfe\x99\xad\x8c\xdc\x75\x92\xe5\x4c\x46\x8b\x6c\x84\x83\xc3\xaf\x38\xf4\xa4\xad\xf5\x8d\xb2\xa0\x91\x55\xb7\xd0\xb7\x57\xd4\xe0\xf4\xcd\x3c\xf9\xb5\x4b\xf7\x35\x26\xd9\x69\xfe\xc7\xd4\x99\x19\x61\x90\x88\x4e\xcb\x7c\x94\x23\x16\x73\x77\x3e\x67\xd8\x6a\xf2\x0c\x6d\xff\x38\xae\x7b\x13\xee\xf9\x59\xf9\x3e\xe5\xe0\xc5\x22\xa7\x7a\xb9\x17\x9f\x51\xa0\x6d\x3b\x10\x07\xcf\x7c\x15\xde\x74\x75\xb7\x4b\x7b\xb6\x15\xa5\xc4\xac\x9e\x33\xfa\xa6\xb9\x31\x26\x06\x73\x0a\x90\xa3\xf0\x1e\xe3\xdd\xbb\x42\xa8\xdc\x87\x88\x0b\xe2\xe0\x99\x4f\x43\x39\x64\x58\x83\x66\xe6\x22\xfa\xa6\xe8\xbc\x8e\x4d\xc0\x3a\xab\xb3\xdf\xb2\x98\x99\x55\x6f\xdd\x0b\x8d\xbb\x5a\x6f\x7f\x40\x5b\x57\x20\x0e\x9e\xf9\x6c\xb8\xa3\x5a\x8e\xfd\xd5\x1f\xa9\x6b\xa6\xda\x65\xde\xf6\x90\xa2\xa3\x45\xa5\x12\xbf\x8e\xb6\xcc\x62\xcc\xfb\x8b\x33\x33\x09\x1d\x6a\x13\x09\xe0\x7c\xc4\x51\x30\xfe\x8e\xbb\xc9\xe4\x81\xdb\x11\x27\xfb\xac\x0b\x07\x65\xe5\x68\x41\x46\x8d\x22\x7a\xce\xf5\x8f\x0b\xfe\xf4\xd2\xcf\x57\xf8\xac\x2e\x96\x26\x08\x23\x0c\xe2\xa0\x1a\xe1\x7f\x37\xc2\xa0\x17\xfa\x34\x09\xd0\x7a\xb7\x69\x7f\x97\x7a\x76\x64\xea\xda\x32\x50\x59\x2c\x72\xaf\x7f\xc3\x6d\xdc\x78\x26\x5f\x62\xfe\x2a\x17\x51\x7b\x9d\x02\x27\x62\xe8\x20\x0e\xa9\x49\x8e\x55\xa0\x1e\x45\xfc\x2a\xc5\x42\x88\xd2\x5c\x5c\x46\x35\xb7\xf4\x9f\xc2\xd9\xdc\x42\xa5\xef\xf8\x9a\xb5\xe8\x49\xd8\xea\xd0\x4d\x57\x20\x0e\x2e\x01\xb7\x2e\x03\x62\xba\xdc\x67\x43\xbf\x96\x83\x6b\xe6\xed\xee\xc8\x62\xd3\x2e\xe2\xf1\xd7\x19\xdb\xbf\xf2\x0e\xfa\x73\x12\x54\xef\x0e\x1d\xe5\x06\x70\x70\x09\x94\x58\x51\x55\x9c\xef\xe5\x39\x76\xb4\x95\x65\xb9\x81\x27\x3b\x59\xfc\x8e\x9d\x8f\x2d\x42\x40\x5e\x3f\x77\xf9\x05\x6e\xeb\x3b\x02\x44\x5c\x10\x07\x97\x00\x66\x4f\x88\x4f\x81\x69\xed\x3a\xe6\x65\x3f\x2d\xb6\x88\x55\xf3\x47\x22\xac\x63\x76\xc3\x22\xa3\x32\xe2\x5c\x1c\x4d\x9f\xca\x46\x10\x8b\x1f\x10\x07\xd5\x06\x02\x8c\x30\x68\x76\x3d\x4d\x03\xd6\xec\x3f\xbd\x0c\x5f\x52\x7b\xde\xc4\x5e\x9c\xef\xe4\xab\x0c\x76\x0a\x64\xf7\x2b\xf8\xb8\xf5\xc4\x0c\xfd\x26\x73\x50\xf1\xb6\x2a\x62\xec\x20\x0e\xa9\x41\x50\x3c\xdf\x95\x66\x8e\xa3\xad\xbc\x0b\x95\x28\x63\xfe\x14\x98\x61\x89\xef\x7e\x60\x2e\x12\x31\x8f\x48\x31\xbe\xd0\xd5\xd6\x85\x6a\xf8\x40\x1c\x5c\x03\xb4\xfd\x6b\x1c\xcd\x77\xc8\xcd\x68\xc2\x2a\x62\xf6\xe5\x50\x9a\x47\xe3\xda\x1e\x26\x30\xdf\x9e\x73\xa5\xa5\xa4\x43\x2d\x4c\x80\x7a\xf1\x81\x38\xb8\x06\xac\x6f\x1f\xe6\xe4\x74\xcd\x3f\x19\xf9\xa1\x72\x35\xf7\x28\x72\x9f\x2d\x3f\xa7\xb4\x59\x50\x30\xe2\xe1\xe0\x8f\x0e\x49\xb2\x1c\x48\x5b\x20\x0e\xae\x81\x64\x3f\xfc\x4f\xae\x45\x35\x2f\xd7\x8a\x75\x82\x9b\xc2\xef\x96\xb4\xf2\x4d\x18\xef\x10\x2b\x64\xe5\xcf\x2e\xc4\x51\x0f\x5e\x82\x9a\x65\x81\x38\xa8\x36\x10\x60\x84\x41\xa9\xee\x34\x0d\x54\x45\xfa\x2e\x71\x8e\x0d\xfa\x54\xc9\xbd\x60\x72\x10\x0f\x61\xa2\xbe\x86\xb3\x79\x0f\x73\xc6\xaf\x1d\x8f\xa0\x94\x59\x27\x1e\xda\x61\x05\x71\x70\x0d\x0c\x77\x4d\x4a\xb0\x3d\xb6\xdf\x4d\x12\x31\x13\x65\x2d\x1f\xf8\xbe\xf8\x4e\xad\x34\xa5\xf4\xbd\xd7\x93\xf6\x82\x88\x68\x3b\x0b\x68\xca\x06\x71\x70\x0d\xd8\x24\x52\x0f\x72\x62\xeb\x56\x3e\xfa\x35\x25\x52\x34\x44\x45\x4f\x75\xbf\x78\x7b\xf1\x6b\x8a\x41\x56\xc0\xc8\xad\x70\xd2\x59\x1d\x68\xca\x06\x70\x70\x0d\xd8\x0e\xdc\xba\xe6\xe8\x5f\xd1\xb0\xf0\x71\xee\xee\xdb\x3f\xbe\x04\xbf\x1e\xf2\xa8\xb9\xb4\x48\x5f\xbc\xa1\xc5\xb4\x6a\x37\xbe\xb8\x81\x88\x0b\xe2\xe0\x1a\x28\x55\xf7\xc7\x78\x16\x8d\xc7\x53\x3d\x85\x1b\xad\xf5\xbe\xbf\xfe\xc6\x4e\x73\xdc\xf3\xcc\x2c\x5c\x89\x26\x0f\x9f\xd1\x9e\x8b\xc2\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\x34\x0d\x30\x2f\x64\xa7\xef\xef\xc9\x91\x5d\x3d\x76\x5f\xc9\x9d\xd9\xf9\x2e\x17\x3f\x69\x8d\x79\xd3\xbb\x4e\xdb\xb1\xe0\x7a\x5c\x57\xfa\x0c\xb4\x73\x0b\xe0\xe0\x1a\x10\x93\xfa\xc8\x68\xf1\xe0\x4f\x0c\x71\xec\x25\xff\xc7\x79\x2d\x82\x7e\x58\xb9\x27\x76\x78\x71\x53\x7b\x96\x73\xf2\xf1\x3e\x8d\x50\x5f\x07\x10\x07\xd7\xc0\xd7\x5a\x22\x26\xda\x6b\xad\x9a\xdf\xb0\x56\xeb\x03\xe9\x55\xf4\x4d\xa6\x27\x3a\x3e\x97\xad\x7c\xd2\xae\x93\xa9\xee\xeb\x30\xb8\x87\x88\x0b\xe2\xe0\x1a\x88\xb9\x77\xe9\x91\x67\xe1\xc1\x96\xcb\x73\xd3\x68\x65\xa6\xd6\x01\x94\x66\x97\xab\x4b\xd4\xe4\x13\xb5\xc4\xf1\x8a\x25\xe3\xb1\x9b\x88\xb8\x20\x0e\xae\x81\xeb\x75\x14\x61\x23\xf7\xe3\x6b\xb9\x8f\xc7\xee\x05\x25\x8a\x31\x6b\x9b\x4f\xdc\x3c\x79\x9f\xca\x7d\x9e\xa7\xfe\xe7\xee\xfe\x53\x17\xe8\x1e\x61\x00\x07\xcd\x03\x00\x23\x0c\x32\x51\xa7\x1b\xe1\x8a\xea\x5d\x25\x96\x08\x53\x12\x6d\xcc\xe5\x5b\xd9\x4e\x7a\x8a\xde\x14\xf2\xcb\x3f\x2b\x83\x1c\xaf\x5f\x1b\xcd\xd3\x4f\xd3\xe3\x40\x98\x4a\x10\x87\x6c\x84\xbf\x1a\xf4\xed\x3d\x65\xbc\xbd\x5e\xe8\xf7\x4c\x67\x1d\xcd\x28\x4b\xbc\xcf\x77\xc5\xf8\xf7\x10\x4f\x92\x45\xdf\x80\x7e\x8f\xb2\x2a\x22\x32\x88\x43\x36\xc2\x31\x9d\xba\xfb\x0b\x5d\x14\xb5\x2b\x02\x55\x3c\x05\x34\x1c\x01\xe6\x6d\x28\xaf\x89\xc6\x71\x06\x8e\xd7\x06\x4f\xc8\x07\xf4\xc7\x11\x91\x41\xdc\xff\x33\xc2\xf4\x7f\x47\xfe\x9f\xef\x11\x36\x8c\x0d\xd2\xec\x23\x7d\x69\x89\x4e\xb8\x2f\x26\xa8\xb3\xb0\xc7\xf4\xbd\x77\x2e\x2f\xad\x59\xd9\x12\x4b\xdf\x0a\xc7\x8e\x9b\xf7\x6f\x23\xac\x14\xf9\x96\x7e\x87\xae\x15\x7d\x96\xdd\x56\xc9\xfb\x87\x81\x20\xe1\xc0\x3b\xf4\x44\x3c\xc3\x3b\xf4\xb8\xfb\x74\x5c\x19\xf1\x16\x7f\xa1\xd2\x17\xc9\x8f\xe9\x6a\xbd\x04\x76\x1d\xa8\xa9\xae\xdb\xc7\xa9\x3a\x4c\xa0\xfb\xa2\x58\x6f\xff\x7a\x3b\x8b\x45\x64\x96\x34\x92\xf6\x5f\x33\xc2\xa0\xa1\xfd\x5d\x23\x2c\x8f\xd4\xd0\x38\xda\xad\x42\x4e\x99\xcc\x6b\x45\xfc\xca\xcf\xac\x3c\x4c\xc6\xcf\xe1\x33\x36\x5d\x9d\x2f\xb8\x8b\x0e\x67\x0c\x0a\xb3\x0a\xce\xe4\x66\x1f\x4f\x64\x23\x3c\x59\xf5\x91\x34\x3c\x63\xe5\x40\xf8\xd6\x32\x53\x68\x51\x72\x8e\xf3\x35\x23\x79\x61\x17\x97\x88\x65\x1e\xa3\x6c\x99\x5c\x42\x8f\x33\xd9\x9a\x55\x41\xfa\xd9\xde\xbd\x9a\xa5\x09\x2e\x65\x77\xd9\x63\xc6\xa1\xcb\x61\x77\x06\x54\xce\x0d\x1a\x35\x10\x3f\x08\x1f\x72\x92\x5c\xb4\xc6\xaa\x14\x38\x93\xd1\x22\x1b\xe1\xd4\x48\x1f\xa2\x7a\x66\x0f\x2c\xa5\xf5\x47\x77\xa3\xfc\xd8\x46\xd7\x1e\x78\xd2\x87\xac\x5d\x78\xfb\xba\x3d\x8b\xac\x8e\x25\x72\xfa\x4c\x46\xeb\x84\xf4\xb3\x76\x17\x33\x15\xee\x93\xe5\x6a\x5c\xd4\xe1\x72\xd5\x7b\xb3\xbc\x79\x8c\x6a\x21\x3e\xef\x7c\xcd\x40\x63\x77\xb2\x9e\xc5\x77\xf4\x0c\x3e\x72\xe8\xfc\x6f\x22\x3a\x2d\xf3\xad\xdc\x4b\xd8\x73\x5f\xdd\xc9\x9f\xf2\x29\xed\x25\x4b\xe0\xd0\x4d\x88\xd1\xd5\xae\x97\x0e\xf9\xdd\x21\x5c\xfd\xde\x58\x2b\x01\xda\x09\x05\x71\x48\x6d\x22\xbd\x24\xdf\xe2\x94\x4a\xd4\xdd\xda\x4b\xc9\x78\xf2\x94\xef\x79\x9d\xcb\x2f\x1d\x93\x4d\xb6\x78\x31\x54\xf7\x81\xd6\xc4\x76\xa8\x3b\x06\x88\x43\xaa\x11\xe6\xb1\x6a\x5c\x31\x72\x64\xf1\x92\xa2\x3f\x12\xbc\xa4\x66\x5d\xf2\x19\x6b\x61\x3e\x6d\xea\xb5\x2e\xdb\xe6\xf3\x5e\xfc\xf7\xd0\xea\x07\xc4\xc1\x33\x1f\x97\xd7\x04\xbd\x4f\xec\x03\x8a\xc7\x98\xb4\x93\xa1\xbd\x96\x28\x97\x65\xd6\x7e\x67\x18\x3f\xd2\x98\x69\x2d\x3f\x77\xa3\xf7\xf9\x3e\x22\x2e\x88\xf3\x11\x47\x11\xfd\x3b\x6e\xfc\x39\x06\x37\xdf\x30\x7b\xdb\x4b\xdd\x86\xca\x5a\x6a\x15\x83\xa2\x71\xe5\x37\x34\xbb\xe5\x29\xaf\x37\xbc\xf5\xb7\x48\xf6\xc3\x46\x18\x61\x10\x07\xd5\x08\xcb\xff\xeb\xe2\x07\xf4\x42\x9f\x7a\x83\x56\x27\xef\x4e\x87\x6c\xe1\xd3\xaf\x22\x4f\x72\xb4\x3e\xd4\x14\x49\x7c\xef\x93\x71\xdf\xed\xcb\x70\x4b\xfa\xa6\x25\xfd\xe1\xc3\x2b\xa8\xe6\x16\xc0\x21\x1d\x87\xc3\xff\x3e\x64\x97\x77\x71\x6e\x0d\x17\x9b\xdc\x24\x29\x7f\xba\x8c\xf6\x05\x7e\x8d\x92\xc2\x9c\xaa\x4d\x93\x7b\x67\xbd\xdf\x1b\x68\x51\x05\xe0\xe0\x12\x90\xa3\xa8\x40\xff\x50\x5e\x95\x7f\x83\x40\x83\xf2\x6d\x8d\x75\xef\xfc\x26\xde\x7b\xfd\xe9\xec\xc7\xe7\x25\xca\x52\xdf\x4e\x31\x42\x7d\xcd\x40\x1c\x5c\x02\x3f\x46\xba\xb4\x89\x28\x32\xbc\xf8\xcd\x6e\x75\x3c\x75\x7d\xde\x72\xeb\x41\xb6\x03\x91\x98\xee\xf6\xe6\x4b\x35\x1e\x49\xd6\x3c\x4c\x44\x5c\x10\x07\x97\x80\x9b\x3b\xe3\x6c\x12\x6e\xb0\x55\x88\xe1\x8e\x54\x4d\x4d\x63\xf5\x92\xf2\x23\x19\xa1\x7b\x96\xb4\x31\x42\x7b\x76\xe1\x37\xef\x36\x22\x16\x3f\x20\x0e\xaa\x0d\x04\x18\x61\xd0\xec\x7a\x9a\x06\x3c\x4b\x6b\xbc\x0f\x0a\x68\xa9\xc7\xa7\x4e\xa8\x49\x63\x85\xe5\x1c\xd0\x97\x03\xf0\x46\x06\x2b\x25\xc5\x2e\x4f\x0e\xf5\x52\x40\x47\x82\x41\x1c\x5c\x03\xe1\x3c\x6d\x63\xf4\x1f\x5f\xdf\xf9\x74\xfb\xb6\x9e\x55\xbd\x82\x07\xb7\xcc\x03\xd5\xf7\x9c\x8a\xfd\xdb\x0f\xb3\xdd\xf5\x1a\x75\xe6\x11\x71\x41\x1c\x5c\x03\xca\xa6\xf4\x21\xc4\x25\x1a\x4c\x5f\xee\x62\x7c\x4d\x74\x15\x74\x77\xf7\xc1\x23\x73\x4d\xdc\xd9\xb9\x4b\x24\x1d\x73\xbd\xa6\xc8\x18\xda\x65\x04\x70\x70\x0d\xdc\x8f\xe4\xf5\x8c\xb9\xda\x9b\xb3\xcd\x1f\x98\x26\x1f\x4f\x1d\xad\xf8\xda\x4b\x67\x51\xd9\x4d\x94\xa8\x39\x28\xe3\x0b\x71\x0a\x54\x1f\x0a\xe2\xe0\x1a\x20\x44\x53\xdb\x26\xbb\x97\xe5\x15\xdf\x90\x26\x6f\xad\x2e\xcc\xbc\x1d\x6b\x14\xc6\xae\x7d\xe9\xf0\x23\xe6\x37\xaf\xdb\xf2\x26\x34\x08\x0d\x80\x38\xa8\x36\x50\xe5\xdf\x35\x00\x4a\x75\xa7\x69\x00\xb3\x2f\x88\xe9\xd2\xc8\x57\xe3\x87\xdb\xa9\x3e\x18\x9f\xf6\xf0\x84\x1f\xf2\xfb\xd5\x7a\xcb\x86\x7f\xa8\x6c\x4e\xa2\x31\xa5\x87\xba\x3b\x83\x38\xa4\x66\x59\x57\xdc\x59\x8f\x07\xd0\xbd\x2c\xe2\x05\x23\x08\xf7\x33\xab\x2e\x7f\x8c\x56\x0f\xbb\xf8\xa9\xab\xf1\x88\x7c\xde\xd4\xe1\x1e\xb4\x23\x0c\xe2\xe0\x1a\x50\x23\xc4\xd2\x5c\x3c\xe6\x94\x7f\xea\x6b\x69\x5d\xf7\xbb\x32\xfb\x20\x52\x06\x3b\x77\x65\xf1\x9d\x54\xcd\xf5\x89\xd5\x1e\x5c\x27\x44\x5c\x10\x07\xd7\xc0\x32\x03\x3e\x4e\x08\xf1\xcb\x76\x01\xb6\x28\x86\xdc\x0e\xd1\x8f\xf8\x99\x1b\xa4\xcf\x4c\x6e\xbe\x6b\x29\xab\x6c\x4e\xc9\x3a\x84\x76\x45\x41\x1c\x5c\x03\x5a\x4b\xa4\x3f\xf1\xf5\x9b\x2b\x53\xd1\xfa\x47\x18\x2e\x4c\x0e\x3d\x90\xbe\x60\x9e\xef\x67\x79\xe7\xd9\x4b\xa9\x4c\xaa\xab\x78\xc3\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\x34\x0d\xd0\x67\xf6\x73\x7d\x6e\xb9\xb1\x5a\x1a\x2b\xa0\xec\x96\xf6\x93\x78\x76\xef\xf1\x85\x2f\xf5\x22\x7d\x04\x6d\xdd\x9f\x62\xc8\x03\xa1\xb9\x15\xc4\xc1\x35\xb0\xe7\x69\xaa\x1e\x3a\xd7\xee\xaa\xd4\xeb\xf6\x3b\xec\xa2\xf4\xc6\xda\xd8\x9d\xdf\x04\xdf\xc9\x7c\xaf\x3e\x89\x23\xfa\x76\x43\x1c\x3a\xc8\x05\xe2\xe0\x1a\x58\xb6\xfd\x75\x44\x43\xc1\x7c\xa9\xde\xc2\x80\x40\x16\x43\xe8\x46\x69\x47\x19\x2d\xc9\x8e\x81\x23\xb9\x9c\x3c\xbb\xeb\x67\x33\xe8\x24\x0b\x88\x83\x6b\xc0\x2d\x92\x63\xed\x50\x74\x7f\xc6\x9b\x1b\x25\xc2\xf1\xf3\xe8\x41\x70\x2f\xb3\x26\x65\x13\xd6\x16\x9b\xeb\x67\xf2\xbc\xb5\x60\xe8\xee\x6b\x10\x07\xd7\x80\xb8\x1d\xfd\xe5\xdd\xcd\x67\x12\x7f\x4c\x0f\x68\x59\x6e\xa1\x48\xf7\xdc\x15\x66\xf8\x28\xac\x33\x1e\xd4\xa4\x87\x7a\xb8\x8b\x31\x86\xd0\x00\x88\x83\xe6\x01\xa7\x7f\x37\xc2\x20\x13\x75\xba\x11\x96\x39\xe1\x7f\xef\xbd\x7e\x05\xc5\x78\x66\xd2\xc6\x2c\x24\x86\x9b\x9a\xea\x85\x45\x62\x58\xcd\xc2\xa4\x56\x1e\xa3\xbd\x33\x8a\x15\xc2\x54\x82\x38\x64\x23\x6c\x71\xdb\x27\x22\xb6\xc3\xc4\xe3\xc3\x94\xd9\xe3\x4c\x13\x03\xdd\xd5\x96\x56\xcb\xb0\xe5\xb6\xa2\x59\x2a\x67\xfa\xad\x0b\xca\x89\x88\xc8\x20\x0e\xd9\x08\x7f\x6d\xc1\x0d\x5a\xd1\x62\x12\xc9\x1d\x24\xb9\xdb\x4a\x3b\x87\x5f\xcc\xf9\xc2\xee\xd1\xcb\xc8\x8b\xa1\x17\xf1\x9c\x06\xe9\x13\xa3\x21\x8b\x0d\xe0\xfe\x9f\x11\xfe\x47\x5d\xf7\xff\x7c\x8f\x30\x5d\x1e\x69\xce\x88\xf4\xa6\x20\x83\xe5\x0c\xe7\x7b\xd7\xf6\x8e\x59\x39\x15\xc1\x27\x6d\xe1\xba\x74\xb2\xe3\xa8\xef\x29\x7f\x8a\xfc\x6d\x84\x69\xf4\x1e\x9d\x54\x8d\x3a\xaa\x8d\x3f\x29\x10\xf3\xf3\x0d\xe7\x73\xd1\x0b\x3e\x67\xc0\xd7\x19\xa4\xfd\xd4\xd4\x7a\x39\x08\xe3\xcb\x5f\xe8\x2a\xae\xbd\xa3\xc2\x42\x3e\xf3\xe7\xc7\x69\xaf\x84\xa4\x9a\x4e\x74\xa5\xd5\xdb\xd8\x8c\xb8\x16\xda\x85\xf9\x26\x7d\xce\xe5\x90\xfc\xd7\x8c\x30\x68\x68\x7f\xd7\x08\x23\x19\x61\xca\xe6\xd0\x7d\xd3\xe8\x92\xe4\x8f\xfa\xa8\x11\x5c\x7d\x64\x2e\xdc\x01\x2f\xcd\x58\x29\x45\xcc\x34\xe8\xeb\x43\x3e\xb5\xdd\x93\x3d\x93\xcd\x4a\x64\x23\xfc\xa0\xd7\xeb\xf3\xf3\x71\xe5\xb1\x20\x4e\xf4\x8c\x78\x07\x6a\xce\x75\x29\xaa\xb5\xcb\xfd\xd1\x6b\xec\x9b\xc3\x04\xb5\x6d\x05\xb8\x67\xb2\x35\x8b\x6c\x84\xa7\x97\x2b\xcd\x84\x7c\xac\x79\xcd\xf1\xc6\xba\xdf\xb6\xec\x98\x88\xdd\x56\x96\x60\xa8\x4d\xc2\xdf\xf0\xb8\x6b\x28\x9f\x1b\x7b\x26\xd7\x27\x35\x20\x1b\xe1\x92\xbb\x0f\x0e\xcf\x99\x0f\x97\x10\xc5\x9b\x44\xfe\x0a\xda\x49\x5b\x55\x75\xf2\x30\xfa\x3c\x7d\xf8\xbd\xcf\xfc\xb5\x7d\xf3\xd9\x5c\x9f\x24\x8a\x6c\x84\x3b\xaf\x71\x59\x66\x9f\xbc\x5e\x57\x7b\x16\x28\xb8\xb9\x3a\xfa\x6e\xa1\x23\x49\x45\x67\x37\x97\x70\x22\x68\x84\x7b\x69\xf2\xab\xd3\x99\x19\x61\x90\x88\x4e\xcb\x7c\x01\x55\x7b\x0f\xd3\x15\xbe\xec\x7e\x2d\x6a\x8c\x55\x7c\xf9\xcb\x91\x21\x78\xa3\xeb\xe4\x0f\x5d\x93\x83\x63\x9a\x71\xfa\xd3\x4f\xd0\xca\x0f\xc4\xc1\x33\xdf\x8f\x84\x48\x76\xe7\xf8\xc2\x65\xeb\x69\xfc\xb6\xa5\xf3\x2a\x59\x45\xdc\xcf\xa7\x6c\x99\xf1\xb1\x44\xae\x65\x6c\x9c\xa8\xa2\x41\xdd\x6c\x40\x1c\x3c\xf3\xc5\x9f\x10\xa5\x8d\x1e\x28\xdc\x51\x8c\xa6\x31\xab\xe4\x44\xf9\x76\xbc\x51\xd2\x1a\xe2\x8d\x4a\x99\x23\x92\xa2\x6c\x92\x6e\x02\x75\xb3\x01\x71\x3e\xe2\x84\xff\x6c\x96\x55\x38\x3a\x60\xea\xe8\xf4\x51\xed\xf2\x9f\x6b\x8d\xcb\xa6\x63\x37\x82\xb2\x27\xa8\x37\x1e\x3c\x98\x34\x67\x54\xbb\x43\xf2\x1d\xca\x7c\x20\x0e\xfe\x7c\x6b\x73\x6c\x27\x7d\xad\x8a\x0a\x68\x96\x7b\x9d\x3f\xff\x8a\x5c\x26\x52\x7c\x7c\xdc\x34\x3a\x69\x7a\x6f\xfb\xe7\xaf\xa7\x69\xec\x56\x08\x23\x0c\xe2\xa0\x1a\xe1\x7f\x37\xc2\xa0\x17\xfa\x34\x09\x34\x7e\xd9\x49\xc1\xfc\xd5\x7f\x77\x1b\xa3\x3d\x87\x52\xa1\x8d\x9c\xb7\x7a\x35\x68\x5c\x56\x2c\x72\x7f\x37\xeb\x26\xf5\xb6\x19\xd4\x2d\x16\xc4\xc1\x25\xb0\x98\x5e\x4d\xf4\xa3\xf4\x57\x85\xc7\xc9\xd6\xa0\x27\xdf\xa7\x88\x71\xde\x3b\x9f\xef\xa6\x08\xd4\xa7\xef\x2c\x3b\x38\x0d\x55\x52\x42\x47\x0c\x01\x1c\x5c\x02\xae\x3b\x86\xdb\x95\x89\xc4\x19\x3e\x09\x6d\x64\xc9\x21\xf3\xee\x1f\x8f\x64\x2c\x02\xd3\x8e\xab\x4a\xc5\x05\x4a\x0c\x0f\x84\xa1\xc3\x06\x20\x0e\x2e\x81\xf1\xa2\x8a\x0b\x4d\x65\x91\x46\x8f\x83\x15\xb8\xcd\x73\xaf\xbd\x63\xef\xbc\xac\xf4\x24\xda\xf4\xba\xf4\x53\x32\xa2\x66\x2a\x0b\x0e\x44\x5c\x10\x07\x7f\xbe\x0c\xe3\x6c\xac\xbc\x7d\x1f\x33\x1f\x89\x05\x70\x1f\xb2\x6e\xb2\xd8\x8d\xb5\x1c\xb5\x64\x77\xb9\x47\x32\xfc\x0a\xf3\x75\xc4\x42\x43\x2c\x7e\x40\x1c\x54\x1b\x08\x30\xc2\xa0\xd9\xf5\x34\x0d\x7c\xae\xa9\xab\x24\x41\x8b\x89\x62\x32\x6b\x17\x4b\xa5\x9c\x57\xcc\xa1\x7f\xc3\xe8\x9c\x87\x41\x22\xd3\x31\x77\x49\x52\xda\x30\x03\x31\x76\x10\x87\xd4\x2c\xcb\xb3\xdb\xa1\x0a\x3b\xc7\x0a\xaf\xe2\x11\x67\xcb\x44\x86\x3a\xdf\xb4\x2d\xd6\xf1\xdc\x24\xfa\x83\x79\x9a\x5a\x9a\x3b\xab\x4f\xa1\x66\x59\x00\x0e\xae\x01\xfe\xae\xc1\xd0\x45\xad\x76\x47\x95\x59\xc6\x6d\xe7\x32\xb6\x4e\xc2\x12\xea\x2f\x47\x7a\x27\xd2\x36\x8e\x64\x1a\x53\x75\x89\xd0\x95\x5f\x20\x0e\xae\x81\x75\x71\xfb\x93\xea\x09\xfd\x8a\xf7\x62\x9b\x73\x81\x82\xf3\x68\x63\x3f\xb5\x8b\xd8\x82\x37\x17\x7f\xb3\xe1\x71\x26\xb5\x2b\x41\xf7\x87\x82\x38\xf8\xf3\x9d\xac\xe7\xf6\x72\xb2\x22\x2e\x2e\x59\x1e\x5b\xc3\xb9\x50\x9b\xe8\xc9\xd0\xbf\xd1\x9d\xca\xe7\x4a\xb4\x58\xb8\x24\x4e\xd2\xbd\x80\xd0\x00\x88\x83\x6a\x03\x01\x46\x18\x94\xea\x4e\xed\x1c\xbe\x7c\xb7\x2a\xc1\xea\xae\xf5\x5a\x42\x26\xde\x02\xea\x8b\xc2\xb0\x0f\x2f\x39\x37\x46\x85\xd8\xba\x5e\x1c\x76\x04\xd8\xa6\x57\x43\xff\x2b\x00\x07\xd7\x40\x44\xa0\x76\xc3\xf4\x42\x4b\x56\x8a\x80\xdb\xdc\xf8\xd7\xeb\x45\xd7\x4d\x53\x0a\xa2\x4c\x3f\x4d\x4a\xf3\x75\xf1\xf0\x8d\x2e\x37\x20\xe2\x82\x38\x24\x0d\x50\xcc\xbb\x6a\x3d\xdb\x68\xb8\xfb\x72\x5a\x94\x6b\xea\xf2\x5c\x22\xc7\xfd\x5b\x4a\x96\xbd\x9c\xa9\x85\x3f\x8b\xfd\x59\x92\xbf\x41\x1a\x00\x70\x70\x0d\x14\x78\x44\xde\x2c\x32\xbd\x74\xe1\xf7\x03\xef\x5f\xbb\x9f\x44\xea\x3f\xbf\x41\x51\x7b\x99\x88\x39\xfe\xf8\x22\x19\x49\xd6\xe0\xd2\x02\x22\x2e\x88\x83\x3f\xdf\x3c\xb7\x99\xaa\x52\x0b\xa5\x9d\x47\x7a\x0a\x6a\x37\x73\x23\x57\x94\x37\xa6\xfb\xae\xbc\xaf\xb6\xbd\xe0\x2c\x7e\x58\x5b\x7a\x3d\x14\xa1\x01\x10\x07\xcd\x03\x00\x23\x0c\x5a\x77\x9c\xa6\x01\xb4\x7c\xca\xa9\xee\x1a\x27\x9b\x16\x8f\xbb\xcc\x9d\xa3\xcb\xdb\x8e\x74\xfa\xa1\xa3\xb6\x4c\xd3\xfd\x72\xd9\x02\x05\xe7\x1d\xa1\x23\xcc\x20\x0e\xae\x01\xc6\x5b\xe9\xa6\xf7\x1e\xed\x3c\x4f\x7e\x7c\x2f\x93\x86\x7c\xca\x91\x40\xb0\x79\x2a\xf6\x31\xf7\x58\x31\xa5\xbc\x05\x93\x80\x21\xf4\xbe\x82\x38\xb8\x06\x38\x74\x62\x14\x7b\xb1\x4d\x46\x0c\x47\xb3\x8b\xcf\xd7\xaa\x46\xb0\x9e\xec\x1a\x5f\x09\xbf\x74\x7e\x9b\x25\xbe\x51\x6d\x2d\x3d\x19\x11\x17\xc4\xc1\x35\x70\x4c\xab\xd3\xd1\xcc\xa7\xf2\x9c\x82\x99\xda\xe2\x45\x43\xee\xbd\x51\xd2\x4f\xa6\x98\x7a\xac\x49\xf8\xe3\x8c\xb8\x29\xd8\x7b\xd0\x72\x00\xc4\xc1\x9f\x6f\x6a\x5c\x22\xc3\xeb\xc3\xda\x75\x29\xad\x12\xd7\x34\x86\xd4\xdd\xd1\xa8\x82\x4f\xa2\xb4\x49\x42\x56\xce\x1f\xb0\xbe\x88\xe7\x51\x22\x34\x00\xe2\xa0\x79\x00\x60\x84\x41\x26\xea\x74\x23\x7c\x44\xb2\x86\x21\x10\x57\x98\x9b\xc3\x3a\x4d\x69\x26\x7c\x69\x81\x7c\x0e\x8d\xc4\x3f\x45\xdf\xd2\x07\xef\xdc\x2a\x9f\x02\xf5\x0c\x74\x27\x2f\x80\x43\x36\xc2\x27\x68\x6f\xaf\xa0\x1a\x31\x88\xf8\xf3\x34\xf2\x5e\x57\x91\x6d\x9c\xb0\x67\x92\xb7\x55\xad\x6a\xa3\x6e\x45\x2f\xf7\x6d\x1d\xed\x44\x44\x06\x71\x3e\x92\x28\xf4\xff\x8c\xec\x8d\xe3\x4f\xcc\x9e\x33\x7b\x6d\x43\x48\x2f\xf6\x66\x0f\x59\xa7\xa8\x21\xe7\xc4\xef\x64\x07\x51\x79\xe6\x3b\x17\x9e\x6e\xf3\x13\x21\x22\x83\x38\x1f\x49\x54\xd8\xd3\xf8\x9f\xef\x11\x9e\xcc\x38\xe0\x8b\xb5\xa7\xcf\xbc\xdc\x5f\xbb\x32\xce\xec\x20\xcd\x93\xdd\xd6\xb2\x1e\xb1\xa8\xe6\xeb\x71\x92\x9f\xba\x3e\x21\xf0\xb7\x11\xce\x57\xf7\xe9\x72\xcf\x5f\x7b\x61\xcf\xcf\xbb\xec\x2a\xe3\x34\x2d\xf1\xd8\x9a\xd9\xe2\x57\x0a\x5d\x85\x79\x55\xdd\x0f\x33\x63\xc7\xbf\xd0\x81\x35\xb1\xeb\x72\xc1\xb7\x3e\x4b\x28\x76\xe3\x2e\x97\xde\xd2\xa4\x9f\x67\x69\x6b\xe8\x4f\xbe\xc3\x8d\xc9\x20\xdd\x94\xb9\x6a\xf0\x5f\x33\xc2\xa0\xa1\xfd\x5d\x23\x8c\x64\x84\xff\xd8\x77\x1e\xfe\xb9\xab\x3a\x7a\xc1\x21\xba\x6d\x39\x83\x72\x74\xaf\xfa\xb5\x84\x6c\xce\x85\x98\x4f\x9a\x57\xed\x78\xbe\xcf\xb9\x9c\xc9\x66\xe5\x4d\x24\x8f\x56\x77\x41\xff\xd6\xdc\x64\x64\x67\xed\x15\x63\xe6\x4f\x73\xeb\x28\xf8\x1d\x21\xe4\x43\x85\x27\x6b\xec\x7f\x46\xdd\x35\xdf\xa7\x99\x9c\xc9\xd6\x2c\xb2\x11\x6e\x35\x8a\x68\xfb\xfc\x24\x2d\x57\x7d\x42\x56\xe8\xdb\x0c\xa9\xea\x36\xb7\xc5\x90\xdb\xed\xa7\xca\xd9\xd9\x15\xa6\xd2\x16\x36\x41\x67\x32\x5a\x3d\xa4\x9f\x45\x71\x0b\x35\xbc\x3d\xe9\x4b\x99\xfe\x5b\x90\x27\xe5\x82\x6f\x0e\x31\x7a\xcb\xdb\x6b\x92\x95\x7a\x83\xc1\x4f\xd5\xe8\x35\x92\xea\xce\x64\xb4\xc8\x46\x38\x22\x04\x5f\x63\x54\xa6\x48\x94\x63\x98\x90\x99\xa0\x4b\x80\xe9\xb3\xa6\xb2\x5a\x95\xcb\x9a\xfd\xcf\xe2\x66\x52\xa5\xc7\xd1\x67\xf0\x91\x43\xe7\x7f\x13\xd1\x69\x99\xaf\xba\x6f\xae\x83\xc4\x32\x8f\xe4\x23\xb1\x54\x89\x00\xca\xfe\xe1\x43\xd4\xfd\x78\xfa\x57\xa8\x15\xa4\x9a\xb3\x42\xca\x78\xb3\xea\x88\x19\x1f\xc4\xc1\x33\xdf\x42\x16\xe6\xaf\xf4\x09\x21\x99\x75\x36\x21\x01\x93\xbe\x60\x2f\x69\x5c\x8d\x5a\x75\xea\xb6\x7b\xfc\x2f\xd3\x26\x29\x09\x2d\xf8\x10\x71\x41\x1c\x3c\xf3\x45\x2a\xaf\x69\x59\xc5\x3f\xc5\xcd\xc1\x69\x37\xee\xb7\xcb\xa0\xfd\x53\x8c\xa9\x6a\xd5\xa2\x8d\x9e\x25\xea\x85\x7f\x23\x7a\x13\x2a\xde\x01\x71\xf0\xcc\x37\xf1\x65\xcd\x29\xa6\x37\xbb\x6d\x7c\x18\x9d\x33\x39\xe0\x2a\xed\xf7\x36\xdd\x74\x4f\x91\x8f\x09\xb4\x7e\x58\x4c\x4f\xda\xdb\x51\xa1\xae\x1b\x00\xce\x47\xfc\x9f\xbd\xf7\xc5\x9f\xfd\x49\x78\x3b\x73\xdb\x5e\xc8\xe5\x99\xc2\x93\x77\x1e\x45\xf9\xd3\x0e\xe7\x2d\x84\x6c\x3f\x57\xa2\xfe\x66\xd3\xa4\xaa\x65\x41\x18\x61\x10\x07\xd5\x08\xff\xbb\x11\x06\xbd\xd0\xa7\x49\x80\x98\x80\xdb\x7f\x0e\xa5\x37\xf5\x61\xd0\xa2\x59\x50\xa4\x11\x31\x97\xa0\xbb\x61\x88\xb3\xa0\xc0\x43\x07\xd1\x02\xdf\x2b\xbf\xa0\xc6\xe1\x20\x0e\x2e\x81\x5c\x95\x14\x2f\x49\xa9\xb2\x2b\x2c\xd6\xd7\xd7\x7e\x12\xec\xbe\xbe\xcc\x42\x7d\x28\x35\xd7\x4a\x1c\xf7\xea\xa4\x37\xd7\x58\x09\xea\xc2\x0c\xe2\xe0\x12\x78\x61\xc7\x88\x2e\x13\xdb\x3d\x5f\x59\x27\x30\xf5\xb4\xb0\x00\xab\x8c\x21\xe0\xfd\x75\x07\x6b\x5f\x63\xc3\xc3\x1b\x8b\x2c\x69\xfd\x88\xb8\x20\x0e\x2e\x81\x24\x76\x53\xe9\xd5\x67\xac\x54\x8f\x55\x66\x14\xdf\xfd\x68\x34\x78\x48\xfe\xfc\xaa\xcf\xf7\xfe\xcc\xd4\x00\x12\xc2\x64\xa6\x41\x68\xd7\x02\xc4\xc1\x25\x10\x56\xef\xfe\xd6\x9e\xbf\x49\xb0\x82\xf9\xed\x39\xd9\xb4\x8a\x08\xc2\x57\x56\x35\x65\x35\xd9\x6c\x02\x42\xef\x42\x86\x5e\xa8\x40\xf7\x08\x83\x38\xa8\x36\xf0\xe6\xbf\x2f\x80\x41\xb3\xeb\x69\x1a\x98\x3b\x50\xef\xb1\x30\x36\xa3\xf6\xf8\x12\x2d\x5c\x2c\x85\x3d\x62\x5d\xf5\xd1\xf9\xf1\x35\xce\x8a\x22\x96\x90\x13\x4b\x1d\xd3\x5d\xa8\xab\x2b\x80\x43\xaa\x0f\xc5\x9b\x61\xd2\xdf\xe0\x34\xef\x2e\x98\xc6\xbc\xeb\xfe\x78\xe4\x4d\xb7\x98\xcb\xbb\x1d\xc3\x58\x7b\xb5\x4c\x3d\xae\x39\xfe\x2b\xd0\xce\x2d\x80\x83\x6b\xe0\x10\x8b\xc9\xaa\x5c\x48\xb9\xb0\x94\xee\xd7\x33\x3b\xbb\xd2\x23\x69\x7f\x3e\xdc\x07\xc4\xc2\x8f\x28\x1b\x30\xd1\x6e\x0c\x96\x43\xbd\xed\x40\x1c\x5c\x03\xce\x1e\xd3\xf4\x84\x05\xe3\xe9\x56\x12\x93\x1c\x91\x28\xda\x91\x79\xd9\x38\xbe\x25\x25\xee\xc3\xb8\x31\xc3\x99\x04\x11\x78\xd0\xee\x25\x88\x83\x6b\xa0\x70\x75\x4f\x4c\xd8\xc1\x80\xdf\xb0\x01\x15\x43\x90\x9c\x6a\x56\x21\x91\x7f\xf0\x92\xe0\x0b\x6b\xb4\x37\x43\xe9\xbe\xfb\x89\x50\xb3\x2c\x10\x07\xd5\x06\x02\x8c\x30\x28\xd5\x9d\xa6\x01\xb3\x5b\x33\xbf\x93\x25\xe5\xe3\xd2\x6d\xbd\x4a\x37\x63\xa7\x14\x3d\xdb\xde\x06\x6b\xa8\x44\xca\xab\x45\x1d\x10\x5a\x48\x95\x07\x20\xc6\x0e\xe2\xe0\x1a\x48\x0b\x55\xe7\xbb\x9e\x2c\x71\xf0\xe1\x3d\x41\xb2\xb0\xe4\x77\x7e\xb3\x2c\xf9\x2b\x6a\xae\xd8\x3c\x52\xeb\x9f\x7e\x07\x6e\x69\x43\x1d\x78\x41\x1c\x5c\x03\xd6\xa4\x0b\xb2\x54\x43\x3f\xe2\x7f\xba\x89\xf8\x49\x3f\x11\x24\xd1\x1d\xd1\x5b\xbb\x92\xd2\x76\x3e\xd8\xe3\x91\xff\xca\xd1\x3b\xa8\xd3\x39\x88\x83\x6b\xa0\xb8\xf2\xa2\xe5\xc9\xb3\x67\xa1\x09\xb9\x1c\x1c\x85\x1b\x4e\xae\x5d\x69\xe9\xa2\x2a\xcc\x2e\xaf\xb6\xeb\xee\xb7\x0b\x5d\x0a\x81\x3e\x0a\x81\x38\xb8\x06\x52\x0d\x54\x8e\x2f\x77\xcf\xac\x4c\xf2\x26\x97\x7d\xfd\xfa\x65\xe0\x78\x8b\x73\x5d\x5e\x69\x1f\xc3\xfa\x4f\x34\xc1\x53\xd3\x03\x0d\xc8\x04\x01\x38\x68\x1e\xd0\xfb\x77\x0d\x80\xd6\x1d\xa7\x5e\xa1\x25\x1b\x6f\x8e\xea\xfa\xe4\x56\xa2\xf1\x9b\xba\xef\x49\x58\x9c\xb7\xc5\xdf\x76\xbf\x75\x3a\x54\xee\xdd\x5c\xac\xd1\xd7\x0c\x80\xee\x11\x06\x71\x70\x0d\xbc\xc0\x3c\xe0\x17\x4f\x13\x15\xc4\xfa\x5d\xe1\xe4\xd1\xb7\x43\x64\xf0\x7a\xf3\x7c\x23\xf5\x41\xea\x15\xcc\x4f\x59\x57\x8d\xf4\xa0\xeb\xce\x40\x1c\xd2\x7d\xe2\x04\xcd\x9f\x34\xca\x22\x58\x50\x8e\x86\x5e\x2b\x91\xad\x86\x9d\x3f\xf1\xb9\x2c\x4d\xa3\x5d\x98\xb2\xf1\x3c\x5d\x4e\x3c\x83\x0d\x11\x17\xc4\xc1\x35\x90\x78\x9b\xdc\x25\x6f\x8c\xff\xd2\x78\xd1\x30\x65\x3f\x0f\x7f\x32\x93\xdd\x6c\xf4\x01\x01\xb3\xdd\xa2\xd1\x8c\xd0\xd7\x82\xcf\xdc\x88\xb8\x20\x0e\xae\x81\x2e\xe6\xf9\x92\x5d\x86\xef\x09\xe7\x5c\xae\x70\x8d\x44\x8e\x3b\xea\x1a\xce\x64\xe0\xbf\x09\xd1\x8c\xa8\xdd\x92\xb0\xd4\x8f\x8e\x47\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\x4c\xd4\xe9\x46\x98\xc1\x68\x29\xc1\x6b\xaf\x66\x43\xf8\x8d\x66\xc0\x9e\xbc\xc3\x87\xfc\xea\x8a\xfd\xbd\x91\x0d\x79\xea\x51\xd2\xb0\x0d\x9d\x64\x15\x84\xa9\x04\x71\xc8\x46\xd8\x3a\xf0\x1b\x69\x94\xf0\xab\x09\xff\x18\x76\x89\x9c\x8c\xc7\xf8\xd1\x6e\x49\x2d\x5d\xe1\x57\xfd\x0d\xd6\x37\x2e\xd2\xb6\x5a\xb5\x20\x22\x83\x38\x64\x23\xac\x79\x64\x4a\xb8\xf4\xae\xa5\x7d\x25\x58\x09\x87\xa7\x6d\x25\xe5\xe3\x1c\xa1\xdf\x1b\xd1\xf2\x1e\x63\xca\x4d\xc5\xf5\xa3\xc9\x39\x44\x64\x10\xe7\x23\x89\x01\x7b\x1a\xff\xf3\x3d\xc2\x99\x46\x24\x37\x75\x2e\x5d\xd5\xec\x9e\x17\x10\xd9\xc2\xe4\x5e\xdd\xe5\x70\x74\xfd\x22\xfb\x63\x3c\x99\x74\xc8\xbe\x69\xec\x6a\xe3\xdf\xbe\xc6\x67\x4c\xa6\x56\x2e\x84\x75\x3f\x45\x94\xdc\x30\x89\x28\x32\x02\xfb\xb1\x69\xd9\x1e\x2a\xb1\xfc\xf0\x23\x87\x0e\x1f\x7d\x96\x8a\xbf\xd0\xdb\x32\xbb\x95\x55\x6c\x69\x1d\xbe\x37\x0e\x1b\x0d\x7f\x6c\x4b\xaa\xf6\xce\xbf\xeb\x08\xf7\x7c\xa1\x70\x58\xb5\x16\x64\xd3\x22\xf8\x5f\x33\xc2\xa0\xa1\xfd\x5d\x23\x8c\x64\x84\xa3\x6a\x8b\xb9\xdd\x96\xc7\xdd\xe5\x9b\x6e\x4d\xb8\xd2\x10\xe0\xfd\x3c\xac\x4f\xf6\xa9\x55\x91\xdd\x58\x2d\xb4\x7e\xcb\x3c\xe7\x70\x26\x9b\x95\xc8\x46\x98\x3a\xea\xc6\x52\xed\xd6\xd2\x4d\x46\x85\x24\xcf\xfc\xef\x77\x9f\xd2\x5f\x22\xf6\xa2\xbf\x5d\x58\x7e\x10\xac\x44\xfe\x40\xeb\xd9\xfa\x99\x6c\xcd\x22\x1b\x61\xe9\xf7\xd7\x34\xa7\xc7\xbc\x85\x6d\x2e\x3d\x29\x93\xfc\x78\xcb\x03\xf3\x07\x17\xb3\x56\xce\xd5\xe7\xdd\xe8\x06\xc4\x5e\x5e\x8d\xa9\x67\x32\x5a\x64\x23\x3c\xcf\x7b\xd1\x26\x2f\xc6\xe0\x4d\xcc\xa0\xeb\x3d\xb2\x04\xa3\x84\x2f\xd5\x78\xb5\xc5\x8a\x9c\xfe\x7e\x75\x42\x34\x04\x17\x04\xcf\xa6\x59\x35\xb2\x11\xf6\xb6\xc4\xc6\x2b\x40\xd1\x7b\x7c\xf5\x55\xfa\xc1\x8c\xf7\x07\x46\x35\x62\x8e\x7b\xc1\xa9\xc7\xbe\xce\x6c\x11\xe1\x79\xc9\xc2\x82\x67\x66\x84\x41\x22\x3a\x2d\xf3\x45\x7b\x74\xfa\x3f\x91\xff\xf9\xf8\xbc\xec\xb9\xa0\xc7\xe2\x1b\xc6\xcc\x3e\x2a\xa4\xef\x6e\x57\x26\x4f\x0c\x90\xaa\x11\xdf\xf6\x87\xba\x4d\x80\x38\xa4\xb3\x50\x81\xf2\x5f\x23\xfb\x13\x5f\x3c\xf8\xd4\x50\xca\xdd\x3d\x78\x4e\x01\xd3\x36\x33\x43\xb4\x43\x89\x42\x74\x95\x2c\x9e\x4b\x08\xea\x3c\x04\xe2\xe0\x99\xcf\x6e\x57\xd4\x76\xb0\xb3\xff\xb7\x68\x16\xbf\x1b\xae\xa6\xed\xee\x93\xb5\x35\x61\x3b\xef\x9c\xd4\x75\x22\xcb\x11\x26\x6c\x0f\x0b\x44\x5c\x10\x07\xcf\x7c\xf6\x57\x04\xba\x9f\x1b\xc6\x98\x07\xbc\xc2\x70\x2b\xd1\x9d\x11\x22\x0d\xa6\xd8\x44\x7d\x67\x60\x2d\xac\x5a\xfd\xfd\xe1\xeb\xdf\xd0\x0d\xfa\x20\xce\x47\xfc\x9f\x2d\x07\x3d\x38\x96\x25\x69\xc6\x8c\x09\xc7\xe9\xc3\x4d\x79\x9a\xe5\xa4\x7f\x85\x45\xfc\xc9\x5f\xf7\xd1\x4b\x7d\x4e\xd8\xcc\x50\x47\x15\x86\x30\xc2\x20\x0e\xaa\x11\xfe\x77\x23\x0c\x7a\xa1\x4f\xbd\x41\x2b\xfe\x29\xf3\x1e\xf3\x04\xcf\x84\xec\xa2\xd2\xc0\x58\xcd\x3b\xab\xfc\xbe\x68\x4b\xb4\x16\xbc\x64\x89\x10\x99\x50\xdf\x05\x68\x27\x08\xc4\xc1\x25\x10\xd2\xd1\xda\x58\x58\xff\x62\xca\xc5\x47\x64\x35\xe4\x29\x05\xf6\x3d\x77\x4b\x53\x42\x3e\xe5\x2b\xd7\x2f\x7f\x20\x12\xc0\x7c\xce\x0a\x35\x5e\x01\x70\x70\x09\xc8\xd4\x79\x24\xbd\x63\xae\xdf\x5e\xa6\xfc\x56\xc3\x2f\xfb\x47\x2e\x40\x8b\xe4\xd2\x6b\x5a\x32\x6a\xe1\x68\x4c\xca\x84\xfa\x75\xe8\xc8\x35\x88\x83\x4b\x60\x38\x0d\x87\xac\x5e\x7d\xc3\xeb\x5a\xf7\x78\xe7\xa5\x00\x87\x8d\x5f\xcd\xfc\x09\x31\x83\x18\xcc\x59\x4a\x8a\x76\xc9\x33\xe7\xa0\x32\x71\x10\x07\x97\x40\x52\xfe\x42\xc4\x48\x8a\x5a\xb3\x3c\xe5\x72\x71\x64\x73\xde\xd2\xb0\xc5\x5c\x66\x1e\xcd\xcd\x47\xe7\xa7\x3d\xca\xa6\x99\x06\x78\x11\x8b\x1f\x10\x07\xd5\x06\x02\x8c\x30\x68\x76\x3d\x4d\x03\x4b\xee\x9f\x6c\xdd\x1a\xf6\xb7\xc3\x07\x99\xb4\x2e\xc9\xbd\x55\x72\xa0\xcf\xd3\x9f\xc2\x66\x6b\x9d\x8b\x34\xa6\x95\x8d\xf6\x82\x6e\x3b\x03\x71\x70\x0d\x3c\xeb\xaa\xb3\xa5\x6f\x3e\xfe\x31\x43\x33\xa4\x54\xe3\x15\x17\xe4\xb0\x3a\xfa\xcb\x8b\x03\x23\x4e\x98\x24\x81\x3d\x8f\x8c\x1a\xaa\xb9\x05\x71\x70\x0d\x34\x73\x77\x4f\xc7\x46\xf9\xb2\x0c\xd3\xb1\xe1\xaa\xbf\x13\xf0\x7f\xd3\x8e\x73\x97\xae\x4e\x24\xee\x0d\x4a\xe9\x4c\x8d\xf9\x03\xc8\xb0\x82\x38\xb8\x06\xd2\x88\x37\x79\x15\xb7\x2a\x1a\xc5\x02\x84\x18\x93\x84\xb5\xe8\xde\x8b\x92\xc6\x7f\x68\xec\x90\x7b\x3e\x3e\xfc\xbb\x80\x86\xec\x3d\x64\xda\x00\x1c\x5c\x03\x6d\x74\x3d\x04\xc6\xaa\x54\xcc\x2e\x14\xba\xea\x0c\x09\x82\xc6\x51\x1c\xb7\x9f\x18\x69\xec\x1b\x53\x79\xca\xc9\x7c\x30\x3e\x96\x47\x68\x00\xc4\x41\xb5\x81\x00\x23\x0c\x4a\x75\xa7\x69\xa0\x3b\x9a\xfe\x3e\xd6\xd5\x8b\x17\xfd\x46\x33\x43\x71\x2e\xe7\xde\xf1\xd1\x51\x28\xa1\xd4\x98\xd3\x3d\x8f\x9f\xc2\x25\xfc\xf5\x17\x74\x8c\x1d\xc4\xc1\x35\xa0\x33\x49\xdd\x8a\xb3\xf7\x91\x3e\xd0\x63\x53\x50\xeb\x53\x07\xde\xfe\xe5\xa2\x36\xb7\x2b\x31\xf5\xc1\x26\x37\xf7\xde\xcb\xad\xdf\x47\xc4\x05\x71\x70\x0d\x4c\x5f\xb5\x92\x28\xc1\x6d\xa6\x6b\x89\x2b\x6a\x99\xef\x45\x61\x8e\x69\xba\xc2\x46\xab\x5d\x27\x94\x9f\xd8\xf2\xa2\x74\x11\x3b\x0e\x11\x17\xc4\xc1\x35\xb0\x22\x30\xeb\x9f\xd2\xf0\xd8\x09\x4b\x2c\x8a\x24\x2e\x39\x52\x53\x1d\x4f\x54\xc6\xc6\xc5\xcd\x4e\x95\x16\x57\x72\x8a\x64\x1b\xaa\x69\x06\x71\x70\x0d\x5c\xe5\xbc\xab\x3e\xac\xfa\x87\x9a\xb1\xe0\xca\x6f\xbf\xa0\x09\x53\x15\xe6\x4c\xf3\xa4\xf2\xbd\x9b\xaa\xee\x6b\x81\xdd\xce\xb9\x22\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\x34\x0d\x7c\x4b\x98\x16\xc5\xbf\x48\xca\xc9\xfd\xc9\xad\xf9\x43\x4d\xbc\xf1\xd0\xc8\x33\x49\xba\x58\x26\x86\xcf\x3f\x6b\xba\xd5\x63\x65\x7e\x20\xc6\x0e\xe2\xe0\x1a\x70\xc7\x28\x11\xa3\xc3\x08\xe6\xf7\x9e\xe6\xec\x32\x1e\x7c\x7f\x9e\xf4\x56\xf0\xcb\xe1\x80\x54\x4a\xd7\x20\xb4\xd8\x31\xa9\x20\xa8\x7b\x3c\x88\x83\x6b\xe0\x5b\xf6\xf8\xcb\x59\x14\xaa\x87\x1e\x04\x1b\xd9\x56\x14\x76\xec\xf9\x52\xa5\x35\x0f\x06\x0a\xde\xdc\x65\xbb\xc3\x4e\x69\xff\x74\x0c\xfa\x7b\x01\x1c\x5c\x03\xf4\x6d\x96\xef\x9f\xf7\x2b\xc7\x32\x91\xdd\xae\xee\x66\x88\x3f\xf1\x20\xce\x99\x5b\xda\x71\x38\xff\x4c\x6b\x43\x5e\x8b\xc0\x35\x07\x3a\x22\x0e\xe0\xe0\x1a\xe8\x79\x25\x2e\xf8\x6a\x3f\x6d\x6f\xdb\x8c\xea\xa9\xd1\x4d\x3d\x99\xa7\xd9\x46\xec\x3c\x04\xfa\x5a\xcf\xa5\xb2\x57\x57\xf1\x93\x99\x11\x1a\x00\x71\xd0\x3c\x00\x30\xc2\x20\x13\x75\xba\x11\xb6\x54\xff\x1e\x34\xb0\x89\x3b\xc1\x75\xff\x6a\xbc\x22\x93\x70\xf7\x0a\x4f\xa5\xa1\x9f\xb7\x4e\xa1\xaf\x7f\x63\xca\x85\x6d\x89\x37\x08\x53\x09\xe2\x90\x8d\x30\xee\xc7\x57\x7e\xbc\x57\x30\x6d\x56\xfa\xd0\x65\xa2\x42\x62\x9d\x3f\xd5\x6c\xfc\xbc\x72\x57\x45\xef\xd6\xc8\x44\x4b\x0d\xb1\x62\x19\x22\x32\x88\x43\x36\xc2\x9d\x3b\xfd\x7e\x2d\xd8\x93\x68\x1d\xb2\x21\xfe\x5f\xa4\x12\x0f\xe7\xb0\x84\x83\x09\x14\x47\x5b\x66\x43\x89\xe5\x8d\xc2\x28\xb6\xa1\x2b\x9f\x00\x9c\x8f\x24\x21\xdc\x08\xff\xaf\xf7\x08\x6b\x56\xa2\x7d\xac\x2a\xcc\xc8\xfd\x43\x1c\x35\xf9\x74\x6e\xfb\xbd\x7b\x14\x1b\xf5\x0d\xce\x61\xfe\x8a\xef\xfa\x32\xae\x34\xcf\x79\xfe\x36\xc2\xae\xcf\x13\x07\x33\x4d\x43\xb9\xdb\xcb\x13\x67\x83\xb0\xcc\x5e\x14\x30\x4a\xdf\xa4\xb7\x23\xaa\x42\x63\x1e\x70\xf3\x6d\xcd\xae\xfc\x0b\x15\x2e\x5b\x0d\x62\xc2\x25\xf8\x86\x6d\x11\x16\x8b\xf3\x83\xa6\xc5\xb9\xe0\x7e\x4f\x82\x35\x81\x52\x65\xe2\xe6\x23\x74\x6c\x3c\x8f\xff\x9a\x11\x06\x0d\xed\xef\x1a\x61\x05\xb8\x59\x2a\x45\x5b\x32\x2f\xeb\x29\x6c\x5b\x7b\xf0\xea\xe1\x61\x1b\xfb\x6a\xba\x49\xb6\x2c\x97\x6c\x0f\x7d\xda\xeb\xd2\x77\x1c\x4d\x8d\x67\x52\xac\xeb\x89\x6c\x84\xc5\xc6\xc6\x83\xb5\xea\x4c\x65\x51\x5c\xea\x76\x9b\x67\xb7\x74\xc5\xed\x12\xf0\x84\xb4\x5b\x6b\x3a\xe5\xb5\x79\x94\xef\x33\x9f\xcd\xd6\xac\x2a\xd2\xcf\xba\xe7\x13\x60\xbf\xed\x93\xe3\xbc\x17\xc4\xbc\x65\x82\xfe\x82\xe7\xa7\xa0\xc3\xcc\x13\xda\xba\x6b\x16\x52\x5d\xe4\x3d\x72\xbd\xcd\x67\x32\x5a\x64\x23\xac\x75\x27\x7e\x89\xce\x66\x4b\x39\x45\x2f\xe4\x7c\xa9\x66\x15\xa6\x75\xb9\xc4\xcd\xdb\xd8\xea\x01\xfc\xd9\xa2\x93\xb8\x59\x2c\x87\x67\x32\x5a\x67\xa4\x9f\xed\xe7\x21\x7f\x6b\x71\x71\x6b\x17\x43\x0b\x1d\x87\xbc\xc4\xed\x01\x43\x3f\xbd\x28\x3d\xd3\x1b\x46\x11\xba\x2a\xc1\xe9\x07\xd2\x74\x67\x66\x84\x41\x22\x3a\x2d\xf3\x55\x56\x71\xae\xaf\x47\x4c\xe8\x10\xf9\x90\xc9\x55\x3a\xff\x8e\x62\x7b\x72\xfc\x81\x2f\xcf\x9c\xc7\x9b\x35\x11\xbb\x8d\x43\x0f\x3a\x17\x0b\xe2\xe0\x99\x4f\x2f\xc2\xe0\x83\x9f\xf9\xc7\x93\x34\x76\x33\xea\xe6\x74\xa9\x2e\xc6\xa1\x1f\x69\x1a\x07\x74\x25\xbb\x21\x86\x53\x9d\xb7\xa4\xa1\x8b\x03\x41\x1c\x3c\xf3\xad\xe4\xe9\x1c\x46\x6c\x9f\xdf\x4f\xb4\xd8\x26\xcf\x25\xe4\x2a\x2b\x1d\x46\x79\x16\xf3\x0a\x9b\xc4\x88\x35\x9e\x98\x08\xc7\x11\xda\x5e\x00\x71\xf0\xcc\x67\x43\x38\x21\xfd\xaa\x20\x9d\x33\xb0\xa6\xa7\xdb\x7c\xad\x5c\x47\x11\x7b\x43\x22\x1b\xa3\x94\x5e\x55\xdf\x8d\x75\x95\xc7\x03\x6a\x45\x0c\xe2\x7c\xc4\xff\xd9\x69\xc1\xbe\x78\xa2\xc7\x94\x69\xe8\xad\x2f\xff\x72\xf0\x1a\xf6\x60\x6b\xe5\xf0\xf4\x83\x21\xa7\x23\x13\xab\xf6\x7b\x09\x95\xeb\x0a\x04\x08\x23\x0c\xe2\xa0\x1a\x61\x85\x7f\x5d\xfc\x80\x5e\xe8\x53\x6f\xd0\x5a\x7f\xed\x9d\xd5\xbd\xf2\x8e\xc1\x42\xdd\x7a\xd2\xf1\xd0\xb6\x23\x7f\xbb\x1f\xab\x79\xff\xe5\xa0\x71\xc9\x1b\xe1\xf0\x9b\xd0\x4d\x57\x20\x0e\x2e\x01\x93\x5f\x0f\x8e\x0d\x5b\x6a\xfc\x07\xb8\xa3\x5c\xcf\xdd\x7a\x32\xde\x22\x78\x7b\x4d\xfb\x32\xd7\xfe\xed\x11\xcc\x71\x02\x3f\x7d\x68\x77\x01\xc4\xc1\x25\x70\xf7\x9c\x74\xc7\xd6\x4c\x12\x8f\x49\x51\x9c\xd7\xbb\x9f\xd4\x75\xb9\x8d\x6a\x78\xb2\xa1\x17\xc6\x2a\x85\x66\xc4\xb4\xbf\x11\x45\x23\xe2\x82\x38\xb8\x04\x3e\x26\x0e\x10\xf3\x6c\xb2\x5b\xc5\x68\x4a\xae\xbd\x68\xc0\xdf\x32\x37\xff\x55\xb3\xc6\x18\x81\x96\x60\x7e\x21\x8c\x02\x5b\x15\xaa\x95\x06\x71\x70\x09\x08\x92\x06\x76\xdb\xa0\x58\x97\xd0\x56\xec\x96\x53\x87\x8a\x66\x49\x2a\x39\xac\x86\x9d\xd3\x9e\xf8\x72\x7e\x6f\x75\xc2\xf9\x9a\x02\x62\xf1\x03\xe2\xa0\xda\x40\x80\x11\x06\xcd\xae\xa7\x9e\x0a\x48\xe4\xe4\xe2\x52\xad\xf6\x75\xf8\x43\x81\x3b\xc7\x1b\x4b\x7a\x27\xf5\x58\xc3\xf4\x17\x15\x9e\x9f\x40\x53\x10\x8e\x1d\xed\x10\x74\x2a\x00\xc0\xc1\x35\x70\x3c\x7e\x2d\xea\x48\xec\x77\x94\x4c\xab\x59\xfe\xae\xed\xcf\x99\xda\x95\xb1\xae\xe4\xbe\xe0\x1b\x2a\x22\xf4\x8b\x6a\xe9\xae\x91\xd0\x11\x43\x00\x07\xd7\xc0\x30\x61\xbf\xfe\xcf\xf1\x0b\xd6\xce\xdf\x7a\x50\xfe\xdc\x40\x71\x63\xb1\xf0\x8b\xc6\x2e\xf0\xd1\x9b\xea\xe3\x18\x6e\x39\x71\x18\x85\x3e\x5a\x00\x38\xb8\x06\x58\xfb\xfd\x6f\x51\xdf\xfd\x6a\x4c\xca\xb3\xe8\x8d\x86\xbf\xd3\x3c\x4d\x31\x89\xea\x98\x10\xeb\xd4\xe7\xfa\xdc\x7f\x3e\xa7\xb4\x04\x11\x17\xc4\xc1\x35\x70\xc1\x30\x7c\x4b\x4d\x77\x40\x68\xb1\xf3\x57\x47\x73\x17\x4e\x35\xb9\xad\xda\xf5\x67\x9d\x4e\xdc\xf9\x24\x82\x56\x9e\x65\xf7\xbc\x11\x1a\x00\x71\x50\x6d\xa0\xea\xbf\x6b\x00\x94\xea\x4e\x6d\x98\x76\xee\x0b\xd3\x96\xda\x5c\x3a\xc3\xd4\x03\x53\x9d\x1b\x18\x45\x9e\x3c\xd5\xf1\xb7\x24\x09\xbf\x1f\x66\xbe\x22\xe8\x69\x5d\x9a\x82\x76\x58\x01\x1c\x5c\x03\x0d\x78\x8f\xb8\x4c\xa7\x2c\xfb\xf6\xa8\xf6\xd7\x79\x71\x57\x16\xfa\x78\xda\xc3\x5c\xb3\xac\x2c\x5a\x5a\x4a\x9e\x6d\x14\x52\x41\xdd\xa8\x41\x1c\x5c\x03\x86\x33\x34\x6b\xaa\xdc\x18\x7a\x1a\x72\x21\x8e\x2f\x49\x1e\x5b\xf0\x96\x7c\xdb\x6a\x2f\x75\x0d\xb7\x15\xf5\x9c\x0a\xe0\x58\xda\x42\xc4\x05\x71\x70\x0d\x10\xbd\x9e\x7c\x1b\x25\xc3\xea\xbf\x43\xa2\xe2\xe2\x8f\x57\x53\xfc\x53\xf1\xa0\x8e\x8e\xbd\xfd\x87\xca\xf7\xab\xe1\x54\x0b\xd3\x50\xa3\x24\x10\x07\xd7\xc0\xb9\xf4\x47\xe3\x2a\xe9\xe7\xbe\xb9\x09\x59\x0f\x90\x55\xb7\x5f\xea\xd9\x08\x55\x27\xf9\xee\xba\xf3\x30\x9b\xd2\x9f\xe9\x78\x2a\x0d\xa1\x01\x10\x07\xcd\x03\x00\x23\x0c\x5a\x77\x9c\xfa\x51\x34\xb3\x6a\xe9\xf3\xbd\x93\x97\x85\x35\xc1\x62\x9a\xe4\xb8\xbb\x0a\xff\x1f\x73\x7f\x1a\x4e\xd5\xdb\x38\xfc\xff\x36\xa2\xbd\x33\xcb\x70\x9a\x12\x65\x4a\x42\x32\x46\xc6\x0c\x21\x63\xe6\x79\xca\x94\xa9\xa2\x42\x96\x31\x99\x49\xc6\xcc\x53\x64\x48\xc9\x3c\x66\xce\x4c\xe6\x64\x4c\xa6\x12\x4a\x44\xfd\x8f\x7d\xdc\xff\xcf\xe7\x6e\xaf\xef\xb5\x6e\xd7\x83\xef\x83\xdf\xf5\xec\x3a\x8e\xf3\xf3\xd2\xb2\xcf\xbd\xd6\x79\xae\xb5\xbd\xf7\xf8\x2a\xd5\xc7\xb7\x22\xd7\x7a\x63\x9f\x2d\x5e\xb2\x6c\xbb\xfa\xef\x4d\xd1\x23\xc6\xc1\xe7\x40\x4a\x71\x4f\xb7\x50\xc7\x73\xa2\x77\xfd\x8f\x03\x2d\x8d\x5e\x5d\xcd\x69\x89\xf7\x3e\xb7\x60\x53\x57\xce\x37\xb4\x7c\x92\xec\xf5\xbf\xdf\x55\x7f\xd4\x38\xf8\x1c\x98\x7c\xf2\xd8\x35\xcc\x6e\xd3\x92\xad\x80\x5c\xec\xc6\xeb\xf2\xf8\xab\x72\x02\xad\xba\x1f\xcf\x32\x3d\xa2\x18\x36\x73\x96\x10\x6b\xfe\xc7\x3d\x6a\x1c\x7c\x0e\x1c\x90\xe7\xbd\x5d\xa5\x4f\x55\x63\x76\x79\x14\x79\xe5\x8c\x26\xaa\xb6\xe7\x87\x6f\xe2\xcb\xd5\x77\x8a\xcc\x09\xbe\xf1\xae\x89\xff\x96\xc3\x8f\x1a\x07\x9f\x03\x61\x4a\x67\x5d\xce\xcd\x6c\x77\x14\x1c\x70\xd4\xb1\x77\x45\xa2\xd8\x76\x6f\xd4\xb0\xf1\xdd\x13\xc5\x4b\xa2\xcb\x64\xff\xc8\x55\xf1\xcf\x1c\x38\x6a\xdc\xbf\xe7\x81\x7b\xff\xef\x8d\xf0\x51\x9b\xa8\xff\xbc\x11\x9e\xbc\x61\xd4\xef\x5e\x48\xca\x5b\x15\xe1\x19\x7f\x45\x76\xcf\x91\xdb\x92\x45\xf8\x6b\x61\xe9\x85\x67\x7c\xb1\x49\x20\xaa\x1e\xf3\xcf\xa6\xf2\xa8\x71\xff\x73\x23\xec\x55\xfb\xe4\x01\x89\xac\x13\xd4\xf2\x5d\x54\x00\x44\xbc\x32\x09\xb1\x24\x0e\x25\x28\xe1\x89\x55\x29\x50\x5d\xcc\x19\x8f\xb7\xfd\x47\x3e\x6a\xdc\xff\xdc\x08\xd3\xfd\xa1\x2b\x56\x93\xd0\x35\x4f\x7b\x3e\xfc\xe4\xa4\x50\x40\x7c\xfb\x7c\x44\x5a\x7a\x33\x34\xe6\xd2\x19\x20\x47\x91\x48\x69\xfe\x8f\x7c\xd4\xb8\x00\x79\x69\xd8\x6f\xe3\xbf\xfe\x1e\x61\xe5\x2f\x9d\x5b\x56\x63\x8c\x4b\xe8\x4d\x3b\xb1\x1d\x73\xe9\xe3\x9f\xc1\xf9\x47\xe6\x52\x7b\x69\x9f\xb5\xad\x86\x4f\x59\x69\xf9\xfd\xbd\x9d\x12\x3f\x64\x77\x5f\xe0\xd9\x0d\xbe\x63\x74\x95\xde\xfe\x43\xb9\xf3\xcd\x94\xd7\x44\x15\x95\x16\xe2\x51\x3f\xad\xf6\x8c\x86\x1f\x38\xfd\x35\xf4\xf4\x6d\xb1\x76\x02\x93\xd0\x31\xdd\xcf\x71\xb3\xaf\xc3\x75\xda\x85\x5f\x90\x51\x5c\x2d\xe5\x22\x17\xf8\x73\x7f\xed\x95\xe2\xe0\x97\xff\xaf\x6d\x84\x8f\x3a\xb4\xbf\xff\x46\xf8\x7f\x6c\x84\xf1\x93\xaf\x1f\x50\x78\xba\x65\x8c\xac\x5c\x8b\xe4\x8d\x2d\x0b\x53\xa7\xec\x9d\x10\x73\xb5\x3e\x63\x5c\xf6\x6c\x48\x68\x55\xe4\xcd\xff\xca\xc3\xca\xff\xb9\x11\x1e\x5f\xee\x8d\xdd\xfd\x26\x3c\x7c\xc2\xd7\xa5\xf5\xfc\x78\xc7\x1f\x99\x95\x25\x86\x55\x8d\xb9\x79\x6b\xc9\x5d\xf5\x9b\x4f\xa6\xa5\xff\x57\x1e\xcd\xfe\xcf\x8d\xb0\xc2\xb7\xba\xda\x9b\x8c\x9b\x1d\xd3\x2e\xa4\xce\xb6\x0b\xc3\x1f\x7b\x74\xbd\x58\xca\x3e\xa8\xcf\x93\x12\x52\x0e\x3e\x92\x3f\xa4\xfc\x5f\x39\xda\xff\xf0\x44\x78\xb5\xab\x92\x60\x99\xe9\x02\x75\xcc\xe8\x85\x20\xc9\xcf\xc6\x9a\x73\xac\xac\x3f\x9f\xd4\x11\x52\x8c\x05\x38\x89\x2f\x84\xa2\xfe\x57\x8e\xf6\x7f\x6e\x84\x87\xf6\xad\x62\xb2\xf0\x3d\x89\x92\xfe\xa4\xe3\xdb\x1d\xfe\x5a\xce\x12\xe5\xf8\x14\x55\x5a\x68\xc1\xf9\x78\x44\x8e\x40\xd3\xbd\xe2\x7f\x6d\x23\x7c\xd4\x24\xfa\x4f\x57\xbe\x0f\xc3\x5d\xbd\x3d\xdb\x5b\xb7\x19\x7e\xe7\xe8\x1d\x63\x61\xd0\x63\x20\xba\x52\xf9\xe7\x42\xf5\xc9\xfa\x8f\x7a\x14\xfd\x4d\xea\xad\xff\x9c\xf1\x8f\x1a\xf7\x3f\xbe\x3e\x69\x3d\xd2\xa5\x89\x53\xaf\xae\x1f\xea\x12\x79\x64\xb8\xf5\xfb\xb7\x6b\x68\xae\x77\xa4\xe7\x20\xda\x9b\x65\xf4\xa3\xcd\xdc\x8b\x7f\xdc\xa3\xc6\xc1\xb3\x8b\xa5\xc3\x63\xbd\xd9\x78\xbc\xc5\x61\x29\xb6\x94\x7d\x77\x4f\x7e\x2f\xfc\x0d\xbd\x3f\x6e\x2c\x1f\xe9\xf8\x3a\x76\xe4\xb9\xc2\x19\xde\x7f\xdc\xa3\xc6\xc1\x6f\xd5\xae\xe7\x52\x6f\x50\x7c\xa9\x90\x11\x24\xa9\x8b\xf3\x77\xb9\xf3\x80\xc7\x0c\x55\x38\xe1\x46\x2c\xbc\xa6\x9a\x4a\xdf\x5d\xb0\x73\xf6\xdf\x47\x62\x47\x8c\x0b\x90\xc5\xa3\xc0\xb9\xb9\x5a\x2b\x30\x7e\xe3\x99\xb1\x69\x4d\xc5\x45\x49\xb7\x1d\x5f\x9a\x76\xd4\x03\xa7\xfc\x57\x35\x2e\xd5\x04\x51\x57\xfb\x4c\x9a\x0a\xfe\xd9\x08\x1f\x35\xee\xdf\xbf\x11\xfe\x7f\x6f\x84\x8f\x7a\x43\xff\xa7\x29\x50\x48\x4f\xda\x24\x7f\x39\xf3\xe0\xf1\xc7\xe6\x4b\x6e\x81\xb9\xc4\xea\xe9\x2f\x7c\xc3\xf4\x37\x83\x12\x1a\x8e\xdb\x58\x36\xbd\x0e\xf8\xf7\x23\xcc\x47\x8c\x83\x4f\x01\xa2\xdb\xc5\xa3\xb1\x07\xab\x19\xc7\x32\xcd\x08\x23\xbb\x7c\xc4\x1e\xb9\x76\x9e\xac\x93\x48\x8f\x89\x58\xbf\xd0\x2f\xf4\x66\xfa\xdf\xcd\xd5\x51\xe3\xe0\x53\xe0\x81\xc4\x70\xda\xcc\xa7\x86\x9d\xf7\x8e\x6f\x03\x33\xbe\xb9\x9b\x67\x5c\x5f\xba\x61\xb6\xa8\x3e\xd8\x17\xba\xad\xe3\xc4\x1e\xff\xef\xd3\xcb\xa3\xc6\xc1\xa7\x80\xb5\xe4\xaf\x9a\x10\x8e\x5e\xaf\x8b\x7a\x53\xf6\xf1\x6f\xb3\xc6\x1e\x69\x2f\x54\xd0\xa6\x6d\x3b\xbd\xb5\x58\x90\xfc\x78\xf3\xe0\xeb\xbf\x0b\xeb\x23\xc6\xc1\xa7\x40\x8d\xde\x8e\x07\xe5\x9e\xf6\xa9\xaa\xae\xba\x31\x8b\x45\x4d\xc5\xf7\x09\x39\xdb\x6d\x41\xb4\xed\xf3\x87\xf7\x6f\x75\xbe\x48\xe2\xfd\xf7\xbb\x23\x8f\x18\xf7\xef\xdf\x06\x1e\xb1\x11\x3e\xea\xec\xfa\x1f\xbf\x3e\x49\xf7\xd9\x8b\xe0\xbd\x87\xfa\xab\xcf\xf6\x1b\x42\x9e\x07\x6b\xcb\xea\xd4\xba\x93\xd4\x3c\x75\x6c\x4e\x39\xd9\xab\x78\xed\x7a\xd2\xbf\x37\x2d\x8e\x18\x07\x9f\x03\xb2\x9b\x67\x92\x78\x2b\x62\xae\x92\x5d\xa3\x13\x8e\xa2\xa4\xf3\xda\xf0\xaa\x9d\x50\xf9\x15\x41\xed\x5c\x51\x96\x3f\x39\x11\x19\xf5\x8f\x7b\xd4\x38\xf8\x1c\xe8\x74\xbd\x52\x2c\xaa\x39\x19\x49\x52\xbf\x12\xef\xf1\xe8\xfc\xdc\x4a\xdc\xc8\xec\x04\x1b\x23\x27\xba\x9b\x8f\x30\xec\xb9\x56\xe8\x3f\xee\x51\xe3\xe0\x73\x80\xf9\x0c\x45\x34\x11\x77\x0c\x35\x4d\xec\xc5\x6f\x6a\xf6\x03\x1a\x54\x3e\x0d\xcc\x25\x83\x54\xe9\x03\xbb\x4f\x38\xb6\xa6\x64\x0b\xfe\x71\x8f\x1a\x07\x9f\x03\x04\x18\x8b\x00\x4f\x02\xa2\xe0\xa8\xde\xad\x2d\x82\x81\xe7\xc7\x7d\xbf\x16\xb0\x59\xff\x8c\xfa\x39\xed\x46\x5a\xe0\xa5\x92\xb0\xf6\xcf\x1c\x38\x6a\xdc\xbf\x7f\x1b\x78\xc4\x46\xf8\xa8\x4b\xdd\x7f\xdc\x04\xa9\xab\x72\x65\xec\x2a\xee\xd9\xe8\x65\x5b\x9f\x3e\xd0\x52\x2d\xc7\x7f\x4e\xda\x93\xf1\xd4\x50\x68\xca\xb4\xc5\x66\x7d\xf1\xdf\xbf\xb9\x3d\x6a\x1c\x7c\x0e\x3c\xfa\x3d\x84\x17\x33\x71\x6f\x9e\x9c\xd1\x27\x52\x76\x91\xc1\xff\xec\x39\x4e\x28\xdc\x3b\x8a\xb6\xfc\x0a\x30\x61\x29\xbf\x93\xf2\x6f\x86\xe2\x88\x71\xf0\x39\x10\x28\xbe\xb5\xe7\xae\x22\x67\x12\xa0\xbc\x46\x14\xaf\xb6\x2c\xb5\xfb\xa5\xc9\x89\x62\xdd\x4a\xe9\x3e\x8d\xb3\xe2\x65\x83\xfa\x7f\xbf\xf3\xf6\xa8\x71\xf0\x39\x10\x1a\xd2\x9d\x76\x41\x38\xde\x38\xbb\x69\x52\x8b\x4f\xff\xdd\xd7\xd5\x20\x66\xab\x10\xdb\x8a\xcf\x21\xee\x3f\xb2\x25\x9a\xf8\x07\xff\xed\x3c\x1e\x31\x0e\x3e\x07\xd8\xef\x56\x8d\xc7\xca\x98\x4d\xbc\x7b\x56\x1d\x2a\xc2\x65\xfe\xde\xdd\x4f\x96\x81\x7b\x7f\xe4\x0d\x95\x79\x91\xee\x87\x12\x4e\x8f\x7f\xe6\xc0\x51\xe3\xfe\x3d\x0f\x1c\xb1\x11\x3e\x6a\xdd\xf1\x9f\xe6\x80\xbe\x6d\x97\x8c\xf1\x85\x8d\x70\x1d\xb6\xfd\xa9\x7b\x92\xee\x66\x57\x20\x3c\x5b\xea\x5c\xc3\xf6\xf2\xea\x4b\x14\x2f\x75\x25\x3a\xfe\x39\xf6\xa3\xc6\xc1\xe7\x40\x5a\x7e\x6f\xab\xb7\x38\x6d\x8f\xc5\x72\x6a\x8d\xf0\xd3\xcb\xae\x9f\x6d\xdf\x58\x11\xd0\xe7\xbc\xa4\x55\xe9\x52\xd8\xcd\x9e\xfa\xf7\x63\xec\x47\x8d\x83\xcf\x01\xc7\x97\x21\x1b\xb1\x1b\x8a\x86\x8c\x89\x15\xbe\x9c\xcd\x6f\x7e\xc8\x5e\xcb\xa5\xc8\xb4\xd4\x8c\x18\x1a\xb8\x36\x58\xce\xb5\xfb\xef\x4d\x96\xa3\xc6\xc1\xe7\x80\x41\xa1\x0f\x8b\x3e\xaf\xdd\x20\x87\x1d\xdf\xa3\x7c\x56\x7b\x82\x7c\x45\xbd\xd3\x4b\xe6\x27\x1a\xf5\xa8\x13\xb7\x66\xa7\x74\xde\xfd\xe3\x1e\x35\x0e\x3e\x07\x68\x62\xa1\x85\xe5\x41\x83\xa1\x34\x66\x3b\xfa\x7b\xc1\xaf\xf7\xe2\xe4\x95\xae\xae\x6c\xd3\xfc\xac\x45\x7d\x0b\x3e\x4d\x32\xc3\xf5\xcf\x1c\x38\x6a\xdc\xbf\xe7\x81\x23\x36\xc2\x47\x6d\xa2\xfe\xf3\x46\xd8\x2d\xae\x8e\x38\xf1\x5d\x06\x73\x0b\xab\x3f\x9d\xb2\x88\x46\x4f\x79\xe6\xb3\x22\xcf\x3f\x55\x2c\x0f\xe7\x9d\xb8\x0a\x67\x3d\x9c\xfe\xfd\x00\xf3\x11\xe3\xfe\xe7\x46\x78\x86\x59\xbd\x60\xf9\xa3\x12\x6f\xd9\xcd\xac\x30\x16\xdd\x02\x2e\xce\xd2\xfb\x9e\x54\x7b\xf2\x9b\xa7\xe4\x58\x99\x52\x82\x75\xff\x7d\x6e\x7b\xd4\xb8\x00\x79\x3c\x42\x5c\xb9\xe3\xab\xe2\x88\xc2\x84\x11\xc5\xbd\x14\xf7\x7d\xe2\xb6\x3b\x5d\x1d\x31\x74\xb7\x53\x92\xec\x2d\xf8\x04\xb5\x1c\x9d\x24\x89\xff\x7d\x8a\x7d\xd4\xb8\x00\x79\xec\x6f\xf2\x6f\xf9\xc8\xef\x11\x66\x41\xe9\xe2\x91\xda\xda\x3b\x5d\x10\xbe\x60\x61\x65\xe5\x72\xe7\xd6\x6d\x9c\xff\x63\xf8\x7f\x98\x63\x44\x01\xd7\x07\x78\x16\xe8\x12\x46\x2a\x30\x32\x8f\xd5\x41\xa4\x8e\x3e\xe9\x87\x05\xe1\x56\x8d\x4d\xef\xfd\x24\x33\xc1\x8b\x90\xbe\x00\x41\xcc\xb1\xc2\x8b\x32\x84\x03\x10\xb3\xda\xf4\xc3\xad\x5d\xa9\xf0\x4f\x09\x7c\xde\xf3\x6a\x6f\x6b\x7e\xb4\x88\x7a\xbb\xdd\xf9\xfd\x65\xb6\x45\x9c\x06\xe0\xfd\xb9\x5c\x1a\xcf\xe8\x41\x2b\x18\x72\x72\xee\xff\xbf\x05\x7f\x6f\xf7\x80\x66\x84\xbd\x5d\x3c\xc0\x72\x37\x52\x50\x42\x6c\x98\x9b\xc6\xde\x57\xa0\x69\xde\x53\xc9\xe5\xad\xfc\xd2\xc2\x8d\xd6\xa8\xbf\x0e\x47\xfd\xad\x54\xe6\xcb\xed\x84\x96\x14\x82\x19\x9d\xe2\xe3\xed\x91\x3e\xdd\x57\xa5\xe5\x7f\x9b\x9d\xcc\x68\x79\x77\x2f\xa4\xcc\x0e\x85\xb3\x77\xa1\xa5\xbf\x6f\xe6\xdd\x21\xf3\xf3\xbd\x57\xc5\xe3\xdd\x48\x9f\x67\xc2\xa1\xe7\xfc\x6f\xf5\x84\x68\x8c\x18\xa6\x8c\x1d\x4e\x3b\x09\x48\xcb\xe1\xa1\x66\xff\x1a\x4f\xff\xdb\xa1\xc7\x22\x3b\xdb\x91\x44\xe4\xb2\x8a\x78\x64\xde\x35\xe8\xdc\x56\x77\x8a\x96\x9f\x46\x74\xaa\xd7\xc8\x71\xdd\xc7\x24\x7f\x0d\x8d\x12\x36\x7e\x7d\x5d\x5f\x2f\x86\xb3\xf7\x38\x4d\xa4\xd8\x04\x81\xa9\xff\xd9\x9b\xee\xc4\x5c\xc7\x44\x6a\x8a\xbc\x8d\xac\xb6\x98\xfe\xde\x2f\x3e\xd1\x18\xdf\x49\x53\xf8\xf9\x46\xf2\x6b\xd8\x58\xa6\x64\x3b\x43\x88\x32\xf1\xf8\x54\x11\xf3\xb4\x51\x81\x6e\x6c\xe2\x9f\xbf\xbf\xee\x27\xb7\xb5\xeb\x92\x7f\xb8\x15\x1d\xaa\x7b\xd6\x3f\x9d\xef\xe6\xa7\x84\x3b\x45\xe5\x2c\x9f\xbb\x3c\x7b\xaf\xc6\x6d\x9e\xbd\x39\xd0\x20\x46\xf8\xe1\xe4\xdf\xc7\x47\xe1\x37\x19\xfa\x4a\x56\x3e\xf2\xfb\xc9\x82\x4d\xbb\x13\x1b\x7a\x99\x2a\xab\xbb\x87\xc7\x7e\x7b\xee\x9b\x66\xf8\x97\xec\x5a\x4b\x7f\xb7\xf8\xef\x7e\x6b\x61\xb2\x78\xf6\xb2\x78\xf6\x7e\x3f\xf4\x39\xf0\xce\x1c\x47\x51\xb1\x9a\x11\x88\xe7\xb7\x7f\x75\x59\xeb\xbc\xf4\xc7\xfe\xe4\xc2\xc7\x6e\xb1\x0d\xad\x81\x61\xd7\x36\xa6\xe4\xa1\x6d\x5a\xf1\x02\xbf\x2f\x7e\xc4\x0c\xac\x78\x78\x78\xf8\xac\x3f\x2c\xfe\xbb\xdf\x47\x20\x11\x3e\x2a\x40\x09\x0f\x0f\xfb\x5f\xc1\x3e\xc0\x41\x28\x61\x7b\x6f\xd2\x8c\x5f\x79\x85\x86\xfb\xdc\x0d\x4b\x25\x85\xaa\x63\x4f\xdf\xbd\x98\x23\xe7\x96\xdc\x46\x93\xe1\xe5\xee\xf9\x99\xfc\x77\xe3\xb0\x3a\x1e\x0a\xae\x4b\x3e\x9e\x40\x3d\x64\x74\x33\x9c\x1a\xfc\xe4\xc8\xe2\x05\x4e\x3f\x61\x73\xde\xdf\x8c\xf0\x4e\x5a\xfa\x40\x04\x41\x67\x7e\xbe\xf5\xbb\xf4\xdf\x8d\x0b\x50\x22\xc4\xfb\x3f\xff\xf3\x83\x64\x09\xbd\xab\x8f\xfd\x77\x2f\x58\xe0\x31\x14\x40\xcd\x06\xc8\xff\x79\x88\x87\xf7\xf7\x34\x0e\x59\x21\x8b\x76\x25\xf4\xfd\xf5\x7a\x9a\xed\x73\x08\x59\x84\x78\x46\xda\xf2\x1f\xf7\xb4\xa4\xde\xc7\x29\x02\x03\xad\xfd\x9b\x41\x7f\x0d\x95\xdb\xf7\xf8\xf5\x4c\x99\x88\xc9\x76\xf3\xec\xa3\x1f\x36\x39\xe6\xd7\x8d\x6f\x34\x93\x16\xed\x4a\x5a\xbc\x2f\x2c\xa7\xf9\x68\xe1\xfb\xf7\x5a\x65\xac\x47\x8a\xcc\xf8\xed\xdc\xc7\xb5\xe4\x1b\xee\x83\x8c\xe9\x14\xe2\xd2\xb3\xdd\x61\xcd\xe6\x23\x73\x8b\x5c\xd9\x8b\xa1\x74\x7f\x0d\x25\x6f\xbf\x8f\x62\xdf\xa1\x6d\x13\x0b\xfd\x53\xa5\x7a\x60\x90\xbc\x7c\x02\x0a\x1c\xb6\x74\xbc\x32\xb7\xba\xf3\x29\xb5\x6d\x17\xfd\xf7\xc7\x1c\xc8\xaf\x48\xad\xa9\xdc\xf2\x08\x4b\xcb\xff\xf9\xe7\x73\xf4\x03\x69\x37\xea\xe5\xdf\x7e\x56\x44\x98\xc6\x0d\xa6\xdf\x8e\x1e\x7f\xdf\x98\x12\x10\xfc\x5d\xae\xaa\xe6\xdb\x37\xe6\xfe\x52\xc9\x73\xcf\xbd\xa1\xa5\xce\x56\x6f\xe8\x11\xa5\x03\xcf\x45\xf9\x61\xee\x15\xd5\xd0\xbf\x86\x26\xe4\xd2\xac\x5e\xd2\x27\x64\x0a\x77\xed\xba\xef\x99\x1d\x7c\xab\x2b\xad\x44\xfc\x22\xd9\xa2\xad\x43\x07\x4f\x97\x2e\xd1\xc6\x89\xbf\x86\x96\x2d\x67\xc8\x77\xde\x59\xd9\xa6\x9e\xe8\x25\x58\xca\xf8\x6a\x10\x26\xdf\x97\x64\xf7\xf1\xeb\x80\x27\x7e\x28\x91\x63\x4c\x0d\xdb\x5f\x43\xa1\x61\x75\xf9\xc8\xc7\x1e\x95\x54\x12\x59\x6f\x49\x18\x49\x9b\x8c\xa6\xa8\x7f\xee\x1c\x14\xea\x49\xbd\x58\xa8\x6f\x54\x2a\x0e\xfc\x6b\x68\x1f\xff\x76\xd5\xdb\xa1\xeb\xdd\x64\x81\x66\xea\x45\x5f\x42\xe3\x33\x03\xd2\x0f\x64\x97\xac\x58\xfa\xa4\x3d\x46\xe9\xde\x57\xff\xfd\x6f\x35\x0c\x39\x67\xa8\x14\xea\x00\x69\x0a\x9d\x12\xbe\x3e\x1c\x22\x9a\x1a\x73\xde\xeb\xb8\x9e\x9e\xb2\x81\xa7\xa8\x31\x9e\x41\xc0\xb3\xbf\x86\xce\xbe\x13\x65\x12\xaa\x0c\x98\xff\xe3\x13\x79\x51\xef\x0d\x71\xa7\x3c\x67\x9f\x92\x09\xc5\xeb\xa1\xdf\x69\x1c\xcf\x78\x44\x9c\x86\xff\x1a\x9a\x2a\xce\x97\xb5\xa0\xc9\xe3\x94\xb6\xa4\xa3\x46\xf9\xbd\x99\xf5\xd3\xa2\x12\xaf\x48\xfe\x67\x4a\x7b\xe6\xdb\xaa\xb9\xc4\x90\xda\x5f\x43\x29\x56\xaf\x54\x56\x8b\xd1\xef\x9a\xef\xdd\x4f\x75\x61\xa6\x91\x34\xb5\x6a\x0a\x70\xe8\x8c\xb0\xe3\x9d\xb8\xfb\xae\xf0\x84\x0d\xfd\x5f\x43\xa7\x9b\xa3\xeb\x89\x16\xc4\x27\x2a\xac\x64\x05\xde\x99\xba\xc9\x9d\x29\x60\x4a\x4c\x4e\xac\x9d\x37\xdd\x09\xe3\x4d\x95\xe9\xdd\xf1\x4b\xa0\xfe\xef\xa6\x60\x80\xfc\x9f\x3f\x7f\xfe\xf8\x25\xb2\x46\xe0\x11\x8f\xf3\xe8\x73\xe3\xa1\xfc\xe7\x09\xa0\xcf\xf8\xac\x49\x6c\x4f\x2d\xbb\x1f\xc7\x55\xec\x76\xa4\x17\xf1\x88\x48\xd8\x69\x4f\x3f\xb6\xa5\x98\xfc\xa1\x4c\x96\x13\xa6\x1b\xd4\x5e\x81\x0f\x01\xb4\x39\x1e\x03\x1e\x5d\xe1\x9c\xb4\x12\x1e\xfe\x77\x63\xec\x5b\x5e\x16\x0f\x25\x2d\x8d\x27\x1d\x81\xc2\xa5\x9e\xe5\xe7\xe4\x15\xdd\xdc\x48\x0d\x61\xa1\x66\xe0\xda\x9a\x3b\xb7\xfb\x32\xb6\x6c\xb0\x93\xcc\x2d\x43\xc0\xd0\xab\xc8\xd2\xf8\x12\x04\xd0\x16\x48\x14\x3e\x2e\x95\xb3\x61\xf2\x50\x58\x74\xe8\xe4\x27\x0a\xd7\x46\x93\x22\x71\x53\x2d\xa9\xdb\x0a\x73\x09\x61\xb9\x73\xf1\xef\x43\xae\x2d\xda\x8b\x42\x00\x6d\x89\x44\x11\xe0\x52\x1a\x39\x5c\x3c\xb5\xec\x5f\x4b\x8a\x1e\x62\x7a\x4d\xe8\xf1\x2b\x8e\x99\xf6\x68\xdc\x7a\xc6\x9c\x37\xd9\x56\x73\xe8\xfe\x48\x81\x18\x02\x68\x2b\x24\x8a\x10\x97\x9a\x0f\xeb\x1d\x91\x1c\x34\xfc\xcc\xba\x54\x71\x77\xdf\xdb\x21\xe2\xfb\x03\x93\x1d\xaa\x24\x4a\x97\x3a\xe3\xaf\x03\x4d\x7e\x7d\x46\x10\x40\x5b\x23\x51\xc7\x70\x29\xc9\xe7\x92\x76\x63\xfb\xd9\x4f\xd1\xa7\x15\x74\xbf\xba\x65\x99\xe4\x67\x59\xe2\xc5\x95\xd5\x59\x31\xcd\xa7\x25\x68\x69\xd0\x30\x43\x00\x6d\x83\x44\x11\xe1\x52\x63\x49\x6b\xcc\xab\xab\xf1\x6f\xde\x56\x7c\xd6\x8f\x9e\x9b\x4a\xa9\x2e\x7d\x2e\x4b\xcd\xc0\x43\x44\x44\xc3\x59\xee\x8f\x36\x72\x80\x00\xda\x16\x89\x22\xc6\xa5\x6e\x7c\x19\x30\x7a\x75\x66\xd0\xdb\x51\x63\x15\x5d\xa4\x94\x41\x92\x93\x64\x24\x19\x19\xde\x87\x57\x15\xf9\x6c\x51\x52\xfc\xc1\x69\x08\xa0\xed\x90\xa8\xe3\xb8\x54\xca\x9c\xfe\xd9\x57\xaa\xe6\xfb\xd5\x8b\xab\x27\xa6\x8a\x7c\x34\x2f\xd7\xdf\x48\x2c\x29\x7b\x4b\x2d\x26\x36\xae\x6c\x9f\x15\x2e\x01\x01\xf4\x4d\x24\x0a\x8d\x4b\x6d\x19\x18\xd3\x09\x5d\x98\x08\x97\x78\x9e\xe3\x19\x19\xbf\xe5\xd0\x4b\xc9\x25\x3a\x32\x27\xb9\xfa\xfc\xd4\x8f\x96\x2c\xaa\x64\x5b\x08\xa0\xed\x91\x28\x0c\x2e\x95\xb8\x96\xfe\xa5\xf4\xf5\x8d\xda\xe8\x85\x4e\x35\xef\xc4\xe9\x60\xc1\x1f\x75\xec\x46\xd3\x65\x3c\xd7\x65\x93\xec\xe8\xca\xf0\xe5\x20\x80\x76\x40\xa2\x4e\xe0\x52\xb6\x9d\xf4\x8d\x93\x8d\xe2\x81\x7a\x5e\x4d\xfe\x4b\xdd\x71\x69\x61\x26\x53\x66\x1f\x43\xfa\x52\x9e\x9a\x88\xec\xf8\x69\x30\x50\x42\x00\xed\x88\x44\x91\xe0\x52\x9b\xfb\x49\x31\x49\x7b\x57\xb2\x59\x08\x54\xba\xa7\x99\x7e\xae\xd3\xec\x7e\x77\x22\x3b\x51\x60\xd6\x71\xb6\x2f\x61\x82\xb8\x5e\x08\x02\x68\x27\x24\x8a\x14\x97\xba\xce\x29\xa6\xef\x61\x52\x7f\xe8\x6c\x49\x53\x16\x9b\x57\x90\xed\x9f\xe7\x79\x42\xea\x76\xcd\xef\xdc\x1f\x71\xd7\x32\x8b\x7e\xb2\x42\x00\xed\x8c\x44\x91\xe1\x52\xad\xa1\xce\x6d\xae\x9c\xc1\xca\x1d\x54\xab\xfd\xc2\x06\xa9\x79\xfe\xa8\xad\xb9\xf2\xb2\x45\xbf\xd6\x6f\x3a\x22\xf7\x5c\x3a\x79\x21\x80\xbe\x85\x44\x91\xe3\x52\x23\x4f\x0e\x19\xea\xea\xab\x7a\xd4\x5e\xdd\x5f\x4b\xca\xf0\x7e\xf9\xb8\x8c\x88\x8c\x7f\x36\x70\x78\xbb\xb2\xe7\x78\x29\x63\xa0\x14\x04\xd0\x2e\x48\x14\x05\x2e\x15\xdd\x8b\xef\xad\xd4\x3c\x3c\x32\x39\x41\xba\x59\xe4\xae\x70\x28\x33\x5d\xcc\x5d\x90\x26\x2a\xd4\xb2\x57\xe0\x4c\x55\x93\x2a\x06\x01\xb4\x2b\x12\x45\x89\x4b\x71\x58\x14\x72\xc8\x8f\x52\x57\xbb\x9c\xac\x33\x31\x92\x7c\x37\xbf\x85\xd1\x8a\x0f\xf1\xdb\x69\x20\x35\x4c\x51\xc6\x4b\x5a\xd5\x87\x00\xda\x0d\x89\xa2\xc2\xa5\x30\xea\xa6\x4b\xd4\xd2\x0f\xc3\xba\xe3\x46\x9e\xa4\x5e\x79\xc4\x4a\xbc\x74\x83\xaf\xdf\x85\x9c\x46\x55\xc2\xaa\x4e\x77\xa5\xd2\x1c\x02\x68\x77\x24\x8a\x1a\x97\xea\xdf\xe7\xb8\xd1\x9e\xdd\x7a\x59\x60\x54\xe7\xfb\x00\x45\x48\x43\x2f\x7f\xb8\x5b\x8c\x0d\x01\xff\x23\x2d\xb9\xd5\x7b\xf3\x05\xd8\x53\x9f\x07\x12\x75\x12\x97\x6a\x76\x4f\x5a\xb0\xf5\x88\x91\xe5\xe7\xcd\x0b\x65\xd3\x6f\x4b\x16\xb1\x17\xe1\x26\x9b\x9e\x69\xa2\xf7\xa1\x0d\xf0\x23\x4e\xb8\x09\x01\xf4\x6d\x24\x8a\x06\x97\x7a\x5b\xbb\x6c\x5c\x12\x3a\x39\xb8\xee\x62\x51\xa2\xfd\xb0\x8d\x7b\x03\x83\x77\x37\xe6\x30\xbc\x33\xbc\x34\xed\xbc\xa9\x47\xf4\x45\x08\xa0\xef\x20\x51\xb4\xb8\xd4\x85\xb8\xeb\xd3\x2d\x77\x54\x78\xab\x1d\xf9\x37\x4a\x33\x74\xc3\xa5\xf8\x24\x7c\x4c\xdf\xb8\x1d\x52\x0e\x67\x6c\xec\x97\x8b\x9f\x83\x00\xfa\x2e\x12\x45\x07\x3b\xb7\x7b\x7e\xfb\x70\xd5\xc9\x25\xa9\x63\xfc\xdb\x07\xfa\x55\xdd\xdf\x74\x9e\x86\xc4\xca\x31\xfd\x87\xb3\x16\x7c\x3b\x99\x94\x23\xce\x10\x40\x7b\x22\x51\xf4\xf4\xb8\x56\xcc\x7e\xf3\x70\xd0\xda\x40\x7a\x2c\xfe\x66\x74\xc8\x7c\x91\x3b\xc7\x5c\xa6\x9b\xab\x48\xc5\x97\xce\x7e\x28\x55\xe5\x83\x9e\x2c\x04\xd0\x5e\x88\x16\xc0\xb5\xee\x28\x34\xce\xcf\x7f\x6f\xa4\x3b\x4e\x3a\xf2\x6c\x9f\xcf\xc3\xce\xd6\xbb\x59\xf7\xe9\x69\xd6\x6a\x50\x12\xc5\x1e\xbc\x7f\xf5\x38\x04\xd0\xf7\x10\x2d\x06\x5c\x2b\x70\x93\x7f\xdd\x2b\x57\xb2\x7f\xea\x13\xcb\x9d\x02\xd7\x5d\xe7\x69\x6f\x62\x21\x0f\x09\x06\x9b\x6c\x7e\x8d\x35\x5f\x3e\x25\x7b\x08\xa0\xef\x23\x5a\x8c\xb8\x56\xee\x07\xde\x2f\x82\xef\x3c\xa3\x12\xf8\x27\x38\xde\x05\x7d\x69\xa5\x48\x07\xfc\x97\x19\x28\xf0\xde\x3a\x46\x51\x4d\xc6\xba\x28\x42\x00\xfd\x00\xd1\x62\xc2\xb5\x2a\x50\x92\x46\xae\xc9\xc7\xcc\xbc\x95\xae\x07\x86\xf1\x35\x5e\xa4\x6e\xdf\x3d\xf6\xb2\xca\x5f\x2d\x39\xd6\x16\x1a\x71\x7b\xad\x06\x01\xb4\x37\xa2\xc5\x0c\x3b\xc6\x93\x89\x9f\x4c\xb9\x3c\x73\x48\xbb\x6e\x33\x9d\x3c\x60\x6f\x21\x7f\xfa\xa9\x8e\x39\x83\x75\x22\x86\xf1\x7d\x51\x5f\xf3\xa6\x38\x04\xd0\x3e\x88\x16\x0b\xae\xc5\x28\x57\x17\x62\xd4\x90\x42\x25\x49\xac\x6c\xfd\xb5\xab\xde\x61\x2d\x1f\x23\xe0\xfe\xd0\xcb\xc3\x5d\x96\x3f\x51\x49\x65\x8a\x00\x02\x68\x5f\x44\xeb\x14\xae\xc5\x7a\x61\xe7\xe1\xc4\xcd\xce\x88\xfd\xc0\x39\x95\xfc\x64\x46\x5f\x29\x87\xa5\xf2\x88\xde\xa6\x96\x96\x9e\xb9\x3c\x47\xd5\xdf\xd8\x8b\xd8\x43\x04\xab\x94\xfa\xbf\x5b\xf0\xff\xdf\x85\x19\x3d\x2b\xec\x9c\xe2\xaa\x91\x41\x5b\xd2\x52\x7f\xfe\x67\x2a\xc3\x88\xd4\xce\xfb\x16\xf1\x9f\x78\x67\x87\xde\xa9\xcf\xa3\x28\xef\x6d\x48\x26\x19\x42\x00\xed\x87\x78\x20\xa7\x71\x2d\xff\x8f\xd9\xdd\x63\x95\x04\x84\x9d\xa7\x7e\x7e\xf6\x57\xcf\x24\xc5\xd0\x1b\x53\x5c\x5a\xd2\x22\x9f\xcf\xfb\x3d\xf9\x20\xfb\x98\x05\x04\xd0\x10\xa2\xc5\x86\x6b\x85\x99\x3e\xdc\x18\x35\x55\x5c\x28\x74\xbc\x6d\x78\xba\x95\x99\x92\xbe\x2f\x6f\x7e\x31\x73\x24\xc3\x50\xa6\xaa\x2c\x16\xe3\xcc\x0f\x01\xb4\x3f\xa2\xc5\x8e\x6b\xad\x58\xc5\xb6\x8f\x68\xca\x9c\xe5\xa9\x4c\xba\xd7\x69\xe6\x28\xaa\x31\x1f\x3c\xb9\xcb\x1c\xea\x47\xb4\x78\x42\x87\x98\xa9\xf0\x3c\x04\xd0\x01\x88\xd6\x19\x5c\xeb\x1e\xda\xf1\xc9\x37\x3c\x69\x5f\xc9\xe6\x78\xc1\xd9\x64\xc9\x10\x0f\xa3\x6b\x87\x1c\xaf\x52\x58\xd3\x74\xc6\x13\xb2\x6f\x47\x31\x42\x00\x1d\x88\x68\x9d\xc5\xb5\x2a\xeb\xba\xe6\x2f\x98\xb8\x9a\x3e\xbc\x58\x2c\xf3\xb5\xfa\x6b\xac\x4c\xa6\xfb\xbd\x34\x92\xd2\xa6\x8a\x1c\xdf\xc6\xf9\x09\x13\xec\x1b\x38\x08\xd1\xe2\xc0\xb5\xb2\xe2\x94\xe5\x81\xbf\x9b\x3f\x1e\x5d\xeb\xc4\x8f\xd9\x4f\x84\x0e\xda\x2d\xe9\x0c\x71\xe3\xe3\x2a\xfd\x5c\xdf\x7f\xb2\x9e\xb3\x82\x00\x3a\x18\xd1\xe2\xc4\xb5\x8c\x7e\x4c\x7a\xc6\x69\xee\xa8\x29\x4b\xa8\x32\x1b\x7c\x14\xfe\xa5\x24\xd8\xaa\x0e\x8e\x47\x12\x61\xbe\xd2\x1f\x2a\x30\x14\xb9\x42\x00\x1d\x82\x68\x71\xe1\x5a\x67\xcf\x93\x87\x2c\x2c\xfa\x48\x40\xef\xab\xee\x44\x9d\xa8\x2e\x0c\x16\x66\xc0\xbb\x11\x23\x64\x7a\xcf\x95\xe2\x62\x7e\x69\x9d\x00\x04\xd0\x8f\x10\x2d\x6e\x5c\x4b\x61\xc8\xf9\x0c\x63\x3a\xd3\x39\xb9\x12\x27\x9a\xf4\xde\xc1\xcc\x71\x9f\x33\xbf\x6e\x71\xcb\xc4\xec\x51\x4b\xae\x9d\x7f\xa3\x8f\xbd\x3c\x84\x22\x5a\x3c\xb8\x96\xa6\xc9\x0d\xd9\x7c\x1f\x56\x95\xf3\x62\x29\x0b\x85\xcf\x7a\x6e\x9a\xf7\x5d\x9e\xfe\x4a\xc7\xda\x16\x49\xd0\x62\x79\xf3\x17\xb9\x20\x04\xd0\x8f\x11\xad\x73\xb8\x96\x21\xfb\x01\x5f\x99\xb4\xf2\x31\x13\xd3\xfd\xa0\x17\x4a\xc5\xc7\x97\xf6\xf8\x1a\xc2\x9b\xce\x4d\xfc\xbc\x25\xe8\xb0\xef\x4f\x4a\x07\x01\x74\x18\xa2\xc5\x8b\x6b\xfd\x61\x52\x8f\xa0\x60\xda\xe8\xdb\xbf\x4e\x1c\x22\xf8\xed\xea\xec\xe2\x34\x81\xcc\x98\x40\x5e\xd4\x80\x60\xc4\x94\xa7\x27\xbe\x07\x04\xd0\xe1\x88\xd6\x79\x5c\x8b\x60\x8a\xfe\xb2\x89\xa4\x8d\xec\x8b\x73\x34\xac\xcc\x36\x1b\xd7\x0f\x62\x9d\x7a\xcd\xa5\x55\xe5\xd3\x5c\xd8\x75\xe4\x6e\xd5\xd1\x43\x00\x1d\x81\x68\xf1\xe1\x5a\xc1\xc5\xf8\x54\x3a\x65\x11\xe4\x28\x83\xa6\xcc\x5a\xf3\xc6\x8c\x98\x91\xce\x02\xa2\x95\xd9\x08\x32\xf4\x31\x85\x9e\x1d\x27\xec\x06\x27\x12\xd1\xba\x80\x6b\xbd\xec\xc4\xe4\xb1\x7b\xc5\xbc\x9f\x97\x2d\x13\x4c\xab\x15\x58\x6b\xf1\xd9\x33\xa4\x39\x49\x63\xe7\x1b\x34\xc3\x26\xb7\xc5\xe0\x08\x01\x74\x14\xa2\xc5\x8f\x6b\x85\x66\xe3\x7d\xac\x0a\xde\x54\xdd\x2b\x92\xa1\x4f\x75\xb6\x0e\xe5\xaa\xb5\xd6\xfc\x29\xe3\x15\x3e\xd6\xb2\x67\x3c\x56\xb2\x27\x0d\x01\x74\x34\xa2\x25\x80\x6b\x71\xaf\x7d\xb3\x55\xb8\x3c\x40\x47\xd2\xf0\xda\xfa\x97\x71\x7a\xf6\xe1\xf6\x5d\xf3\xdf\xf7\xf9\x29\x2e\x2f\x11\xcd\xa0\x87\x3a\xb1\x4b\xb5\x18\x44\x4b\x10\xd7\x2a\xbe\x73\x32\x56\xf6\x78\x49\xfb\x38\xf4\x46\x2d\x41\xd1\x13\xd5\xf2\xf1\x73\x8e\x0b\xa9\x80\xad\xd5\x5b\x8a\xc7\x33\x2b\x43\x24\x10\x40\xc7\x22\x5a\x17\x71\xad\x6c\xa6\xcf\x17\xad\x78\x56\x86\xa7\x92\xbe\x53\x56\x6c\x6c\xf5\xed\x3a\xf4\xed\xad\xf9\xf5\x3e\x7d\x9c\xd9\xb3\x98\xfc\xca\x9c\x08\x02\xe8\x38\x44\x4b\x08\xb6\x1c\x55\x1e\x0d\x75\x3f\x43\x6f\xfd\xf5\xac\xa1\x51\x97\xf6\xa3\x0a\x23\x8d\x11\x02\x8b\x28\xaf\x72\x11\x9d\x8a\x2e\x99\x5b\x35\xd8\x0b\xea\x13\x44\xeb\x12\xae\x25\x9f\x3e\x5c\x9a\x66\xe1\x44\xb4\x5b\xf2\x64\x58\xa8\x3a\x72\xfa\x06\x83\xcb\x23\xa5\x86\xe5\xba\x90\x15\x9b\xa1\x1e\xc1\x06\xec\x56\x3c\x1e\xd1\x12\xc6\xb5\x42\x82\xee\xd4\x52\xac\x44\x08\x9d\x70\xf6\xf9\x75\xe6\x58\xbc\x4e\x67\x0b\xc6\x38\xfe\xc3\x20\xcf\xed\x27\x31\xa5\xa4\x69\x13\xa7\x20\x80\x7e\x8a\x68\x89\xe0\x5a\x62\xd2\xbd\xc4\x5d\x11\xbd\x97\xf2\x44\x4c\x5b\xe2\x38\x08\x35\xe4\x0e\x9c\x47\x7b\x7a\x1a\x32\x48\x28\x8c\xcc\xe3\xcb\x85\x19\x20\x80\x4e\x40\xb4\x44\x71\xad\x1a\x97\x34\x12\x2f\xf7\xda\x9d\x32\x4e\xff\x44\x03\x3a\x5b\xfb\xf6\x8b\x27\x6b\xdc\xf0\xd0\x97\x7c\xd9\xf5\x9a\x6f\x0e\xbc\xa1\x80\x00\x3a\x11\xd1\x12\xc3\xb5\x4a\x1e\xe7\x86\xc5\xb6\x69\x04\xa3\xa5\x96\x58\x4f\xae\xfd\x74\xbd\x7a\x8b\x84\xc7\x66\x88\xbc\xc0\x4e\x74\xe5\x36\x7e\x70\xbe\x3b\x04\xd0\x49\x88\x96\x38\xae\x75\xb5\x8c\xe8\xe3\x72\x7f\xba\x69\x28\xdd\x8f\x1c\xfe\x63\xbf\x99\xf2\xae\xdb\xcd\x2f\xa1\x42\x8b\xc0\xfa\x01\xdb\x85\xfc\xaf\x06\x10\x40\x27\x23\x5a\x12\xb8\x96\x90\x27\x85\x92\xf3\xc4\xe8\x35\x47\x43\x41\x83\x7b\x5e\x84\x0b\xd3\xef\x96\xf5\x1c\xaf\xef\x56\x89\xc7\x7d\x7d\x41\x7a\x89\x54\x07\x02\xe8\x14\x44\xeb\x32\xae\xe5\x61\xa3\xf6\x26\x46\x20\x4d\xf7\xc9\x61\xa3\xfe\xad\x93\x95\x93\x96\xf7\x34\x22\xab\x22\x42\x14\xcf\x33\x06\x54\xa9\xb4\x5a\x9d\x80\x00\x3a\x15\xd1\x92\x84\xad\x01\xa6\x77\x76\xcb\xfe\x70\xa2\xf4\x94\x93\x76\x5a\xd9\x7d\x83\xac\x1f\xda\x13\x04\x27\x9d\x1f\x70\x3a\xa6\x6f\x2e\x52\x7f\x1e\xbb\xc8\x7a\x86\x68\x49\xe1\x5a\x2e\x24\x6e\x04\x1f\x86\x94\xcd\x9d\xf8\x82\xe3\x89\xd2\x76\x5f\x0c\xd7\xd6\x62\xbe\xd7\x17\x1e\x74\xdf\x8a\x53\x7a\x83\x79\x84\x3d\x4f\xa4\x21\x5a\x57\x70\xad\x36\x7c\xc6\xc4\x11\xfd\x59\xaf\xdf\x01\xe7\x82\xdd\xda\x4f\x6c\x2c\x2c\x7f\x29\x0c\x21\x60\x9d\x79\x80\x9a\xe1\xa4\x66\x3d\xaf\x0e\x01\x74\xfa\x11\x0b\xb6\xa3\x6e\xbb\xfe\xb5\x60\x93\xc6\xfd\xe1\x97\x5e\xb4\x89\xc5\xc9\x12\x7c\x09\x6b\x29\xa8\x21\xcf\x72\xb6\xe5\x13\x13\xa5\xea\x93\x2a\xdf\xbb\xbd\xc0\x7e\x7c\x92\xb2\x97\x10\x02\xe8\x0c\xc4\x03\x91\xc1\xb5\x0a\x54\x92\x4d\x83\x4c\xd9\xec\xef\xf6\x05\x55\x1f\x66\x16\x0e\x2a\x30\xd9\x11\x58\xca\xe9\x31\x71\xf5\xec\xbb\xde\xa0\x50\x24\x83\x00\x3a\x13\xd1\x92\xc5\xb5\x62\xcf\x65\xf9\xef\xc7\xcc\x3b\x6c\xfa\x43\xae\xe4\xe2\xf9\x8e\xbd\xd5\xa5\x4f\x5d\xb2\x47\x2b\xe8\xc7\xd5\x6b\x0f\xd7\x8a\x50\x10\x40\x67\x21\x5a\x72\xb8\x96\xe0\x81\x57\x8e\xfb\xb7\x2c\xbe\x3c\x82\xf8\x0d\x5e\x23\x86\xe1\x17\x6e\x1d\x0f\xb8\xf1\x3e\x88\xe9\xb5\xbb\xb6\x95\x43\x3f\x4c\x21\x80\xce\x46\xb4\xe4\x71\x2d\x7e\xbe\x2c\x7c\x1f\xf3\xbd\xa0\x6a\xad\xf4\x3f\x3d\x41\xcc\x7d\x61\xaf\xeb\x34\xbd\xbc\x57\xb6\x85\xf0\xbe\x05\xa5\x82\x08\x61\x08\xa0\x73\x10\x2d\x05\xd8\x62\x66\xeb\x91\xef\x00\x9f\xa9\xbb\xca\xf1\x41\xca\x8f\x6e\x6f\x77\x0c\x6f\x94\xbd\xcd\xfd\x36\x70\x21\x9a\x6b\x22\xeb\xf5\xab\x53\xd8\x05\x6e\x2e\xa2\x75\x15\xd7\x92\x0a\x66\x9a\x92\x7a\x6c\x85\xc9\x56\x32\x11\x5b\x09\xa6\x9a\x9f\x09\xac\xa8\x77\x3d\xe3\x5b\x5e\x93\xd4\xcb\xc7\xb1\xab\xc3\x0d\x01\x74\x1e\xa2\xa5\x08\x9b\xdc\xb6\x91\x0a\x89\xec\xa5\xcf\xae\xdb\x47\xc4\x75\x38\x34\x5a\xee\x29\xed\x27\x4d\x3f\x4b\xfa\xea\xda\xe9\x50\x87\x97\x44\x80\x9d\xdc\xf9\x88\x96\x12\xec\x8e\x13\x55\x8a\x5d\x42\x82\xa2\x7c\x00\x41\x33\xd1\xaf\x10\x25\x7b\x62\xaa\xc2\x1a\x19\xa1\x2f\xe3\x67\x3e\x25\x8f\x1b\x9b\x96\xd9\x41\x00\x5d\x80\x68\x29\xe3\x5a\x2c\x14\x0d\x55\xbb\x6b\x27\x5c\xda\xf1\x72\xcd\xea\x36\x05\xe6\xbc\x5a\xd2\x5a\xc2\x6f\xf7\x71\xd6\xb7\x87\xf3\x18\x9c\x1a\x66\x81\x00\xfa\x39\xa2\xa5\x82\x6b\xf9\x8e\x42\xfe\xe6\xec\xbe\xbe\x37\xdd\x66\x3f\x9d\xcd\x2f\xfe\x78\xca\xd1\xdd\x9a\x3c\xa5\x21\x45\xb3\x41\x6b\x35\x98\x80\x1b\x7b\x71\x2e\x44\xb4\xae\xc1\x6e\x85\xf5\xea\x5e\xbf\x8c\x62\x1e\x39\xfe\xe6\x0e\xa0\x37\xdf\x80\xfc\xb2\x73\x7f\xfa\x73\xa8\x84\xef\x8d\x9a\xee\xb5\x13\xb8\xa1\x21\x80\x2e\x42\xb4\x54\x71\xad\x25\x26\xb7\xc5\x40\x86\x49\x62\x49\xa6\xfb\xe1\x7a\xe6\xce\x71\x64\x13\x9c\x54\x5b\xe6\x7b\x8c\x65\xc4\x26\x0a\xc1\x59\x35\x92\x10\x40\xbf\x40\xb4\xd4\x70\xad\x17\x6d\x3a\x6d\xe1\x4d\x3a\xfa\x17\x14\x42\x9d\x88\x42\x4c\x44\x92\xe6\xb8\x0c\xca\x3d\xb5\x2d\xae\xc6\x5d\x75\xd3\x9f\x4a\xd4\x86\x00\xba\x18\xd1\x52\x87\xed\x2a\x03\x7f\x84\xb0\xbd\x32\x61\x06\x27\x8c\x6f\xdf\xfb\xe6\xeb\x2f\x66\x15\xca\xe5\xab\x2a\x01\xfe\xb4\x58\x8b\x76\xf0\x87\x8b\x42\x00\x5d\x82\x68\x5d\xc7\xb5\xd4\xf0\x7f\x6a\x68\x97\x5c\xef\x6f\xe7\xbe\x29\xd0\x15\x1b\xdc\x4f\xb1\x48\x12\x20\x9c\xcb\xba\x12\xfc\xde\xfc\x17\x05\x8f\x39\x33\x04\xd0\xa5\x88\x96\x06\xae\xb5\x61\xad\x72\x3f\xef\xad\xef\x95\xe2\x32\x3d\xfd\xa6\x9b\x2c\x54\x23\x5a\x8e\xd7\xff\x14\x96\x25\x28\x54\x60\x82\x52\x72\x18\xb1\xe7\x9c\x32\x44\x4b\x13\xb6\x28\xcd\x3b\xa4\x5f\x4e\xdb\x50\xa5\x20\xad\x7a\x23\xf3\x6a\xff\x2b\x59\xc7\xfa\xbd\xed\x84\xe2\xf2\xa0\xb6\x1f\x1d\xb4\xf8\xaf\xb1\x8b\xac\x97\x88\x96\x16\xae\x25\x30\x25\x21\x90\xee\x3e\xa6\x2d\x35\x25\x43\x4f\xaf\x7e\x79\xa8\xf5\xc9\xb7\xb6\x86\xdc\x34\xbb\x74\xe3\xfe\x9a\x6c\x59\xc1\x1b\x10\x40\x97\x23\x5a\xda\xb8\xd6\xaf\x75\xef\x1b\xcf\x34\xe3\x2c\xcb\xa9\x24\x65\x63\x77\xad\x85\x6e\x5f\x56\x5a\xb9\xb1\x26\x61\x7d\x95\xf5\xfd\xbd\x6c\xbf\x00\xec\x02\xf7\x15\xa2\xa5\x83\x6b\xf5\xb0\xb1\x07\xbd\xfa\xf6\x6a\xf9\x4a\x76\x59\xbb\x59\x35\x39\x63\x52\xea\x77\x7b\x2b\x9b\xf2\xaa\x2b\x75\x3f\xae\x68\xbd\xaf\x3e\x07\x01\xf4\x6b\x44\x4b\x17\xd7\x72\xf3\x93\xf5\xb9\xef\x3e\xfd\xab\xd8\xf4\x0f\x98\xe5\x0a\xc9\xeb\x50\xbe\x6c\xac\xc0\x53\x22\xe7\x76\xcb\x68\x74\xf2\xa6\xa8\x2c\x04\xd0\x15\x88\xd6\x0d\xd8\xb5\x03\xb5\x8d\x7f\x31\xea\x8f\x51\x84\x49\x49\xb5\x79\x48\xb4\x86\xf3\x3b\x3b\x79\xbc\x3c\x76\xd7\x4e\xad\xf6\x63\x45\xaf\x85\xb0\xef\xed\x37\x88\x96\x1e\x6c\x23\x8c\x7e\x12\x9a\xb9\xfb\xa9\x32\xb7\x62\x67\xdb\x8d\x34\xb4\x65\xa4\x8c\xe0\xa1\x23\xcd\x08\x7b\xa9\x8e\xda\xb9\xef\xc3\xd3\x7c\x10\x40\x57\x22\x5a\xfa\xb8\xd6\x84\xe5\x96\xf0\x7d\x6f\xc3\xe8\x61\xcb\x0b\x04\x37\x58\x49\x99\x2f\xdd\xbd\xb3\x7e\xeb\xdd\x9d\xd7\x17\x1d\xa5\x0c\xa9\xbb\x92\xb1\xf3\xbe\x0a\xd1\x32\x80\xdd\x9c\x3e\xa5\x69\xce\xc2\xea\x27\xdd\x36\xf6\xda\xa7\x81\xb4\xcc\x6c\x73\x35\x7b\x38\x82\x86\x5b\xe1\x78\x4c\xc7\xf3\x3e\xf1\x0b\xd8\xcd\x58\x35\xa2\x65\x88\x6b\xb1\xa5\xa3\xa3\x14\x1b\x84\x1f\xbf\x50\xf3\x89\xc3\x4b\x1e\x74\x26\x7a\x35\xaf\xcd\x28\x43\xaa\xcb\x11\xbc\x7c\x91\xd6\x53\x8c\x0a\x02\xe8\x1a\x44\xcb\x08\xd7\x72\xd7\x53\x51\x99\x55\xb9\x7c\x7c\xf7\xb3\x5a\x78\xa1\x15\xed\x40\xe4\xca\xd6\xa4\xb7\xc8\xad\xd8\xde\x8e\xe6\x57\x2f\xbb\x2a\xb1\x1b\xce\x5a\x44\xcb\x18\x76\x8c\xfb\x81\xe3\x9a\x01\x21\xe1\xbd\x93\x51\x89\x8f\x23\xe7\x76\xea\x1f\x9c\xb3\x9d\xf4\xbd\x63\x38\x9c\xb0\xd3\xb2\x6e\x6b\x63\x0f\x01\x74\x1d\xa2\x65\x02\xb3\x5e\xc7\x34\x9c\xad\xa6\x27\x94\xfa\x44\xe3\x37\x59\xca\xa9\x41\xe0\xd8\x63\xb8\xc0\x3d\x9c\x3f\xf7\x3d\x8f\x66\xa0\xe6\xf7\x79\x08\xa0\xeb\x11\x2d\x53\x98\x25\xc1\xdf\xe4\x3a\x52\x52\xf5\xde\x66\x10\xe3\xe2\xe6\xc9\x22\xf8\x43\x33\x68\x00\x7a\x8b\x92\x53\x9f\x2c\xee\x62\x67\xb4\x84\x00\xba\x01\xd1\x32\xc3\xb5\xf0\x74\x0c\x88\x0f\xf2\xf3\x3e\x12\x7d\xa6\x3a\xad\xbe\xc6\x72\x18\x29\xc5\xce\x1e\x26\xe8\xd6\x11\xad\xbb\x94\x30\x70\xc0\x26\x01\x01\x74\xe3\x11\x0b\xb6\xa3\x1e\x7e\xff\xb5\x60\x33\xc7\xfd\xe1\x8f\xd6\xd6\xaf\xd2\xd8\x06\x14\x3b\x88\xaa\x4f\x13\x18\xed\x45\x7d\x0f\x7b\x34\x36\x5e\xee\xf3\xbd\xb1\x55\xa6\xb0\x97\xe8\x0c\x76\x45\xdc\x84\x78\x20\x16\xb8\x16\x21\xb1\xa3\x5e\x6d\x93\xe3\xb7\x5b\x41\x8b\xa9\x5a\xa7\x33\x02\x9c\x48\xe7\x44\x18\xaf\x2f\x63\xde\x56\xc7\x70\xde\x1c\x82\x44\x20\x80\x6e\x46\xb4\x2c\x71\x2d\xd5\x8b\x6f\x9f\xb2\x1a\x71\xc6\xae\xc9\x5e\xa7\xe5\xee\x88\x3b\x8c\xff\xbd\xe8\xf6\x39\x49\xb9\xc3\xa8\x5c\x39\x14\x58\x53\x29\x41\x00\xdd\x82\x68\x59\xe1\x5a\xda\x73\xef\xfd\x7e\xf0\xbe\x48\x7d\x65\x4e\xac\xfa\xac\xe5\xf5\x8c\xb3\x5f\xc7\x0f\x2e\x06\x46\xa3\x75\xfc\xef\x4d\x12\x43\x2b\x6c\x10\x40\xbf\x45\xb4\xac\x61\x77\x40\x74\x87\x57\xb4\x8c\x26\x45\xd1\x7f\x96\x5b\x53\xbe\xb5\x66\x7b\x5a\x59\xad\x73\xb5\x17\xbf\xe1\x97\xfd\xa1\x2f\x23\xfd\x04\xfb\x62\xb5\x22\x5a\x36\xb8\xd6\x83\x38\xba\x2b\x7c\x95\xfc\x14\x87\xa3\xed\x71\xee\x8f\x4e\x39\xd4\xf8\x51\x9c\xc0\xf4\x8d\xdb\xd5\x2a\xf1\x07\xe8\xf0\x5a\x61\x27\x64\x1b\xa2\x65\x8b\x6b\x0d\x9f\x56\xa4\xb4\xb1\x1e\x2f\xef\x75\xd1\x9f\x72\x77\x1a\x3c\x7b\x69\x1a\xda\x84\x5e\xb3\x51\xbd\xf9\xbd\xc2\x3f\x3c\xfe\x84\x06\x02\xe8\x76\x44\xcb\x0e\xf6\xcc\x84\x2f\xe0\x89\xf9\x27\x17\x8e\x6c\x02\xdd\xf0\x4b\x12\x39\xa2\x5b\x51\x57\xc6\xe5\x49\x42\x67\x68\x2c\x5a\x2a\xd3\x98\xa2\xb1\x6f\xba\x0e\x44\xeb\x26\xec\x42\xff\x7d\x63\xc6\xaa\x88\x6d\x46\xc5\xd9\xac\x53\x8c\xea\x91\xdb\xdd\x8b\xf6\x52\xb4\xc7\xbc\x12\x00\x4b\xb2\x47\x41\x7f\x33\x76\x17\xde\x89\x68\xd9\xc3\xfe\x5d\x8a\x95\xaa\x35\x51\xe9\xc9\xcf\xf1\x98\xcc\xa7\xab\x08\x1e\x27\x51\xba\x2a\xfa\xf0\x97\x9a\xe4\x90\xde\xd0\x56\xf7\xb3\x94\x83\x00\xba\x0b\xd1\x72\xc0\xb5\x28\xba\xce\x86\x9d\x4c\xbf\xa4\x7f\xea\x4c\xf3\xfa\x9a\x83\x5a\xfa\x3b\xb3\xa7\x36\x2a\xc2\xdf\x87\xcf\xa4\x85\x75\x67\xb0\xf5\x60\xe7\x57\x37\xa2\xe5\x08\xbb\x6b\xa1\xe7\x4a\x70\x23\xdf\x4c\x71\xa1\xcf\x47\x55\x61\x30\x19\xbd\xa3\x71\xdc\x8e\xde\x38\x38\x5a\xcb\xcf\x92\xc9\x7e\x81\x12\x3b\xbf\xde\x21\x5a\x4e\xb8\x56\x5e\x53\x6a\xdc\x9c\xe9\xd9\xfa\xca\x76\x6a\x67\xaa\x2c\xe2\xd1\x2f\x06\xfe\x7a\x37\x6d\xde\x1f\xd0\x96\xd6\xd3\x9d\xb1\x38\x83\xbd\x40\xf4\x20\x5a\xce\xb0\x9d\xe0\x99\xa2\x00\xe2\xe4\x7c\x7b\x48\x12\x7d\x9e\xc9\xf1\x66\xdb\xa5\x64\x4d\x7b\x42\xaa\x72\x19\x6a\xed\x8e\xbd\x88\xab\x81\xac\x10\x40\xf7\x22\x5a\xb7\x70\xad\x48\x32\xad\x21\xbc\x78\xea\xd5\x6b\xb9\x0f\xb3\xe6\x82\x16\x6f\xd3\x30\x71\xbb\x9d\x79\x80\xc7\xfc\x7b\x95\x50\xc6\xf9\xe2\x4f\xec\x45\xb0\x0f\xd1\x72\xc1\xb5\x32\x28\xa5\x40\xdf\xe1\xef\x04\x74\xa6\x4b\xe7\x23\xe1\x15\x11\x4c\x02\xb1\x2f\xd3\xb3\xd7\xc4\xbb\x32\x2d\x7a\xe1\x94\x07\x6a\x10\x40\xf7\x23\x5a\xae\xb0\xf3\x97\xbd\xdc\xf6\xf0\xcd\x68\x7f\x82\x2a\xaa\xf2\xce\x47\xc6\xb2\x74\x28\xa7\x25\xd3\x1c\x57\x43\x72\x1e\xed\xcb\x79\xd7\x75\xf0\x20\x80\x1e\x40\xb4\xdc\x70\xad\xf3\xa4\x4f\xbd\xfb\xd2\x8c\x2e\x37\xd6\x34\xdc\xb0\xa8\x2d\xaa\x61\x6b\x9f\x5b\x4f\xc5\xf8\xc9\x29\xf1\x8c\xe5\x96\xd6\x7f\x3d\x05\x01\xf4\x20\xa2\xe5\x0e\xbb\xd0\x8f\x15\xf9\xab\x7e\xff\xec\x37\x53\xbb\xf4\xe4\xe7\xe0\x41\xeb\x9f\xd9\xb4\xba\xfb\x0d\x3c\x31\xa1\x03\x43\x97\x7b\xb4\x1d\x14\x21\x80\x1e\x42\xb4\x3c\x70\x2d\x94\x86\xe2\xcc\xb6\x98\x05\x33\x34\xae\x16\x42\xa3\x24\x7d\x56\xc8\x2e\xbe\xe7\xc6\x00\x4d\xc8\x69\xa2\x10\xab\xcc\xdf\x7c\xd8\xc5\xdf\x30\xa2\x75\x1b\xd7\xc2\x67\x53\x1e\xea\xdf\xeb\xbb\xa6\x15\xdd\xfd\x09\x5f\xe2\x3d\x53\x57\x4e\xd8\x85\x2f\x5a\x75\x24\x1f\xac\x4e\xb5\xb5\xc5\xfb\x63\x37\x50\x23\x88\xd6\x1d\xd8\xc2\x5b\xc1\x9e\x20\xdc\x50\x80\xe2\xc2\x3a\x91\xce\xdd\x79\xc5\xec\x8f\x2a\xee\x1f\xcd\xd7\x4b\xe4\xee\x7e\xe2\x8c\x58\xb3\xd4\xe1\x87\x00\xfa\x3d\xa2\x75\x17\xf6\x19\x1c\x5a\xaf\x07\x43\xdd\x4e\x57\x82\x09\x4f\x2a\x0d\xda\xdc\x6f\x4d\x16\x33\x94\xaf\x30\xf7\x9d\xe8\x6d\xf5\xb9\x4f\x64\xd0\xa2\x02\x01\xf4\x28\xa2\xe5\x89\x6b\xf5\x26\x92\xe5\x32\x4d\x5c\x0d\x77\x89\x4b\x0a\xb0\x7f\x96\xc4\xd3\x23\x38\xbd\x51\x3f\x2a\x36\xb2\xcb\xcf\x5b\x3c\x27\xb3\xa9\x0e\x01\xf4\x18\xa2\xe5\x85\x6b\x5d\xe4\xbe\x35\x79\xfb\xec\xef\xcf\x9d\x84\xcd\xb2\x61\x64\xfd\x86\x17\x82\x3b\x22\x5f\xc7\xa1\xbe\xd4\x7a\xbf\x1b\x11\x36\xfc\x81\x81\x00\x7a\x1c\xd1\xba\x07\x7b\x24\x7a\x87\xba\xa5\xd8\xa7\xf2\x1e\xf9\x8d\xc1\xd7\x7e\x0f\x76\xd5\x1e\xbe\x8e\x17\xd1\x43\x6f\xdf\x8d\x49\x71\xb7\x32\xa3\xbf\xca\x0e\x01\xf4\x04\xa2\x75\x1f\xd7\xea\x63\xb5\xbb\x12\x2f\xf7\x50\xc4\xbd\x5c\x8f\xa1\xa6\x90\x55\x4b\x6f\x69\x5d\xaa\x64\x35\xb0\xe8\xbe\x3a\x79\xb4\xe6\xe9\xaf\xa6\x10\x40\x4f\x22\x5a\x0f\x70\xad\x0f\x23\xcc\x4d\x53\x72\xd4\x7d\x09\x64\x3f\xeb\x7a\x55\xf1\x25\x3c\x0c\x92\x0e\xd6\xec\xf1\x68\x38\x0b\xca\x19\x29\x86\x9f\xca\x40\x00\x3d\x85\x68\x79\xe3\x5a\x99\x4c\x7d\x97\x1d\xb8\xbf\x3e\x52\xcd\x69\xce\x55\xcb\xdb\x74\xdf\x7f\x95\xe7\x11\x33\x57\x22\x91\xe8\xf0\x50\x6b\x42\x2f\x4e\x0f\x02\xe8\x69\x44\xcb\x07\xd7\xe2\xf1\x96\xbd\xa0\xd8\x22\xc4\x1b\xaa\x82\x51\x60\xbd\xb5\xa2\xc3\x4d\xf5\x6e\x54\x93\xf6\xbd\x7a\x93\x1d\x2d\xb1\x01\x79\x13\x76\x6d\xf2\x01\xd1\xf2\xc5\xb5\x9e\xa8\x2d\x33\x57\x95\x04\xd4\x86\xf2\xa9\x97\x06\x8a\xd1\x06\x65\x0b\xae\x6f\x30\x6e\x96\x0f\x69\x80\xd2\xe1\xf8\x9f\x03\x36\x10\x40\xcf\x20\x5a\x0f\x71\x2d\xd7\x19\xd6\xe2\xab\xec\x68\xce\x73\x26\xcc\xef\xea\xbb\xee\xc4\x3e\x29\x21\x7d\x4b\x72\x3e\xab\x95\xde\x9f\x51\xfc\x98\xaa\x24\xf6\x9a\xf6\xf1\x88\x05\xdb\x51\x1f\x41\xfc\x6b\xc1\xe6\x87\xfb\xc3\xbf\x51\x6e\xf9\xb2\x67\x7e\xba\xe1\x10\xb3\x70\x4e\x28\xb1\xb3\xbb\x9b\x4c\xcf\xa3\x9b\x8e\x75\x49\xd2\x98\xe9\x64\xd6\xcc\x24\x13\x04\xd0\xb3\x88\x07\x02\xc1\x1e\x17\x8a\x9c\xc8\x0a\xf6\xfb\x74\xfd\x24\x33\xfd\x04\xb1\x5b\x19\x7b\x74\xb2\x67\x70\x21\xe5\x8b\xbd\xa1\x73\xa7\x2a\x6d\xd8\x82\xb0\x27\xbc\x39\x44\xcb\x1f\xd7\x0a\x08\x37\xc3\x2f\xba\xf6\x26\x77\x2c\x23\x20\x59\x37\x7b\x45\xc4\xbf\xd6\x7d\x4d\x95\x34\xc3\xb6\xe4\x60\xc7\xc6\x86\xc2\x92\x1a\x02\xe8\x79\x44\x2b\x00\x36\x89\xc4\xa3\xcf\xdb\x6c\x0f\x69\x11\x44\x9c\xba\x3f\xa1\x12\x7e\xeb\x52\xdb\x19\x9e\x6b\x35\xc5\x32\x34\xb4\xbd\xa7\x23\xa2\x17\xcc\x21\x80\x5e\x40\xb4\x02\x71\x2d\x27\xde\x3b\x73\x3a\x5b\x72\x7a\x7b\x91\x06\xb2\x84\xb9\x53\x27\xb2\x7b\x3e\xea\x2b\x3f\x7b\x1b\x50\x94\xd9\x27\x73\xfc\xe1\x0d\x66\x08\xa0\x17\x11\xad\x20\xd8\xa2\xe1\x66\xc7\x5e\xae\x31\x4d\xd1\x4b\xf6\xe3\x95\x92\x5f\x2d\xa0\xf3\x64\xd4\x8e\x6e\x1a\xdd\x21\x21\x5e\x3b\xc5\x0e\x21\x85\xd8\xdf\xfd\x12\xa2\x15\x0c\x5b\xfc\xf9\x89\x06\xb7\x08\x32\xf0\x2c\x69\x95\x7f\x89\x75\xa7\x20\x59\x2e\xd3\xcf\xf2\xb8\xfd\x64\x8c\x62\xf2\x55\x4e\x14\x41\xb4\x01\x04\xd0\x9f\x10\xad\x10\x5c\x4b\xb4\x4e\xbe\x58\xdc\x75\xc8\x57\xb6\x10\x7a\x20\x44\xcb\xfd\x48\x2a\xea\x49\x0e\xf3\xe9\xc8\xef\xd6\x80\x54\x4e\x2c\x43\x1c\x7b\xf2\x5c\x46\xb4\x1e\xe1\x5a\x22\x3f\x42\x2f\xbf\x0d\xb0\x19\x22\xdf\x7b\x46\xf3\x3c\x86\x5a\x7f\xe6\xfd\x53\x7c\xf6\x3e\x0a\xdb\x53\x7e\xf7\x88\x18\x55\x4a\x5d\x21\x80\xfe\x8c\x68\x85\xe2\x5a\xb5\x77\x4d\xd8\x1b\x88\x49\x39\x9d\x85\x6a\x86\xed\xba\x8b\x2d\xbf\x88\x2a\x2e\x5d\xe9\xee\x38\xc9\x5c\x46\xee\x14\x91\xfc\x8a\x0c\x02\xe8\x15\x44\xeb\x31\xae\xb5\xbc\x13\xa8\x3b\x9d\x74\xcd\x9c\x59\x56\xe2\x63\xbe\x85\xb0\x24\x9f\xf2\x7a\xa4\x28\xfd\x7a\xbf\xb2\xc7\x57\x7d\xd4\xfd\x68\xec\x9b\x6e\x15\xd1\x0a\xc3\xb5\x94\x6d\x7f\x8b\xd1\xbe\x9a\xbc\xa5\x7b\x2d\x22\x2a\x2e\x54\x7b\x54\x61\xc1\x95\x8c\x79\xba\x30\x82\x9c\xf5\xc3\xbc\x57\x02\x1b\x25\x04\xd0\x6b\x88\x56\x38\xae\x15\x94\xbb\x12\x7d\x49\xa1\x6c\x71\x3c\x75\xe9\xc2\xf0\xf7\xdb\x4d\x0b\xb1\x55\xf1\x65\x28\x71\x96\x57\x13\x71\xbd\x01\x23\x02\xb6\x10\x40\xaf\x23\x5a\x11\xb0\x8f\x02\x68\x8c\x56\x6a\x2a\x9e\xc9\xbd\xfa\x3a\x76\x40\xbf\x9e\x5c\x69\xb6\x8a\x67\x92\xf4\xa1\x5d\xe6\xf3\xa4\x37\xec\xf2\x95\xac\xd8\x39\xb1\x81\x68\x45\xe2\x5a\x4a\x27\x0e\x43\x8c\xfb\xdb\x48\x39\x06\x32\x99\xe7\xa3\x08\x7c\x57\x9e\xb7\xe1\xdf\x4d\x36\x16\x4e\xaf\xa0\x5d\x3d\xb7\x3e\x89\x0f\x01\xf4\x17\x44\x2b\x0a\xd7\xb2\x74\xae\x1e\xfb\xb0\xd2\xa6\x21\x48\x25\x49\x6a\xde\xbc\xcb\x28\x73\xde\x8f\xce\xb0\x59\xfc\xd5\x83\xbe\x07\x59\x4b\xa2\x06\x9a\x10\x40\x7f\x45\xb4\xa2\x71\x2d\x83\xee\x58\xe7\x77\x7c\x26\x7e\xb7\x76\xf7\x48\xc3\x19\xac\x45\xdd\x4b\xad\x22\xaa\x66\xce\x89\x73\xf6\x0a\xcf\x33\x08\x53\x72\x40\x00\xbd\x89\x68\xc5\xc0\xee\x64\x89\x66\x04\xb2\x5b\xf7\x68\xba\x39\xfb\x3c\x78\x70\xc5\x4b\x56\xb1\x5f\x58\x9f\x46\x7c\x8d\x2b\xe9\x45\xa4\xe3\x05\x1d\x34\x2f\x04\xd0\xdf\x10\xad\x58\xd8\xa3\x34\x12\x99\xce\x0d\x82\x7b\x9f\xf8\xee\xcd\x98\xda\xb9\xae\x4d\x9c\x38\xf3\x59\xcb\xbc\xe0\xf4\x01\x67\x60\x5a\x6b\xb6\x9a\x37\x76\xe1\xbd\x85\x68\xc5\xe1\x5a\x0d\xe2\x8e\x3f\xcb\xd1\xf9\x51\x67\x4f\x8a\xe6\xd8\x26\xd0\x7e\x16\xd2\x3a\x13\x6a\xf8\x84\xc0\xe3\xe9\x8d\x0f\x4e\xcd\x01\x4f\xe4\x21\x80\xde\x46\xb4\x9e\xe0\x5a\x5e\xaa\x24\x49\x6c\x7c\xef\x0f\x17\x53\x17\x72\x8b\xa2\xfc\xb7\x18\x53\x1f\xe6\x7d\xe8\x88\x7b\xd3\x7c\xf5\x57\xe1\x88\xca\x2f\xec\xef\x6b\x07\xd1\x8a\xc7\xb5\x5a\xf0\x77\x57\x6a\xd2\x6a\x82\xa8\x3d\x19\x2d\x5f\xf8\x96\x24\x2e\xe5\x5d\x34\x1b\x6c\x4e\x78\x52\x7a\x4b\xdd\x80\xc7\xfc\x25\xf6\xdf\xf5\x1d\xd1\x7a\x8a\x6b\x39\x34\x24\x67\xf2\x45\x9e\x54\x2b\x89\xaa\x3f\xfd\xc0\x4e\xa5\xcb\x71\x82\xef\xf9\xa4\x66\x36\x9b\x66\xea\xa7\x9d\x43\xa6\xfb\x66\x10\x40\xff\x40\xb4\x12\x60\x9b\x57\xb5\x64\x43\xb3\x0d\xa8\xaf\x84\xe1\xd4\x69\xd7\xa0\x33\x07\x7e\xbb\xa4\x0f\x3c\xee\x9f\x66\x21\xa4\xdf\xaf\x67\x65\xb8\x74\x15\x02\xe8\x5d\x44\x2b\x11\x76\x1d\x72\x9d\x13\xde\x34\xfe\x5c\x3a\xc5\xdf\xe8\xfd\x1e\x7f\x29\x28\x23\xc6\x50\xe8\xa2\xee\xe6\xf8\xec\x1f\x91\x21\x4a\x26\x71\x2b\x08\xa0\x7f\x22\x5a\x49\xb8\x96\xa9\xc1\xef\x0b\xab\x1c\xc6\xf2\x73\x37\x67\x48\x59\x4a\xa8\x17\x17\x3a\xbe\x1d\x50\xac\xb6\x48\x34\x04\xbc\x58\x6d\xe7\x03\xba\x10\x40\xef\x21\x5a\xc9\xb0\x8f\x1f\x9d\xf8\xfd\x80\xb1\xe9\xfc\xd3\x45\x2f\xa6\x58\xab\x1e\x4e\x19\x29\x89\xfe\x1e\x3c\x89\x67\x4c\x61\x1c\x59\xdc\x13\xf4\x43\xd7\x21\x80\xde\x47\xb4\x52\x70\xad\x87\xc3\xbd\x97\x83\x78\x0f\xd3\x5c\xb2\xd8\xd7\x23\xec\x0f\x22\xaa\x9d\x18\x88\x1a\x9f\x1e\xbe\xaa\x18\xed\xbf\xdb\xed\xba\x63\x08\x01\xf4\x2f\x44\x2b\x15\xf6\xb1\x95\x8b\xcf\xab\x53\xf1\x4e\x89\xff\x10\xbc\x2b\xad\xff\x41\xd8\xeb\xb0\x8b\xbe\xcf\x8a\xc3\x53\x70\x6a\xb6\xc3\x6a\x0a\x2f\xe0\x1c\x04\xd0\x07\x88\xd6\x33\x5c\x6b\x21\x40\xae\xe6\x14\x91\x65\xb3\xfe\x68\x36\x43\xbe\x9d\xe4\xda\xb0\xfe\xaf\x58\xd2\xdf\xf5\xf6\xfb\x5d\xe8\x56\x2b\x3f\x4e\x01\x08\xa0\x0f\x11\xad\x34\x5c\xeb\xd6\xb1\x62\x37\x59\xb2\x74\xf1\xa8\x31\xa5\xae\xd9\x30\xad\x8c\x6c\x0e\x62\xb4\xe6\xe3\x6f\x5d\x5d\xdf\x35\x3a\x8a\xa6\xeb\x4f\x43\x00\xfd\x1b\xd1\x4a\x87\xbd\x1f\x83\xf6\xf8\xa5\xc6\x2a\x44\xf0\x79\x25\x7f\xb8\x75\xbd\xf2\x1f\x5c\x2f\xe5\xce\xb4\x96\x24\xc6\x5b\x7c\xa4\x7b\xd3\xff\xc2\x2d\x08\xa0\xff\x1c\xb1\x60\x3b\xea\x0f\x41\xfe\x5a\xb0\x65\xe0\xfe\x70\xfd\x3a\x67\xfc\x93\x7a\x6e\xe4\x7b\x49\xcd\x91\xbf\xf8\xc6\xf8\xd2\x79\xf5\x17\x6e\xc4\x73\xf3\xe9\xc7\xf0\x8d\xcd\xbd\xc6\x48\x42\x00\x83\x87\x78\x20\x99\xb8\x56\xf7\xd8\x15\xb3\x47\x8b\x92\x1f\xed\xee\xfb\x65\x89\xb7\xef\xab\xbc\x59\x5d\x3b\x4f\x65\x63\x8c\xf1\xc9\xac\x3c\x16\xc9\x40\xa8\x0d\x01\x0c\x0a\xd1\xca\xc2\xb5\x4e\xae\x0e\x32\x9e\x3f\xb5\x96\xd1\x2a\xe6\x63\x99\xf1\x54\x7a\x6d\xeb\x4d\xf7\x73\xdd\xac\x6b\x74\xf2\x3f\x8c\x1a\x53\xde\x8c\x90\x40\x00\x83\x8f\x68\x65\xc3\x6e\x1f\xfb\xc5\xb3\xc4\x3f\xa8\xba\xc0\x8d\x57\x1a\x6c\x34\xe7\xfe\xee\xda\x1b\x23\xa9\x47\x75\x02\xc2\x4c\xfd\x5a\x56\xbb\x61\xfe\xa6\x10\xc0\x10\x20\x5a\x39\xb0\x9d\x73\xf9\x1f\xaf\x2d\x35\x8d\x45\xf7\x8e\x77\xa6\x4f\x57\x2b\x34\x08\x47\xaa\x74\xad\xe7\xf2\xaa\x4b\x1c\xe7\x53\x7e\xd3\x45\xd9\x42\x00\x43\x88\x68\xe5\xe2\x5a\x3f\x04\x8c\x44\xeb\x83\x27\x4e\xba\x61\x0c\x7f\x7b\xe6\x64\xbd\x74\xb5\x7c\x61\xfe\xa0\x40\x6a\x66\xe9\x52\x63\xf9\xc7\x38\x4f\x6e\x08\x60\x8e\x21\x5a\x79\xb8\x16\xd0\x6a\x2f\x33\xab\x71\x3c\x1e\xeb\x39\xfa\xe4\xf8\x7e\x17\xf7\xcb\x1d\x32\xeb\x12\x73\xfa\xde\x73\x97\x9a\xfc\x34\xfd\x59\x24\x20\x80\x21\x42\xb4\xf2\x61\x8f\x44\x83\x3f\x1d\xdb\x39\x41\x75\x33\xe7\xbc\x3c\x01\x94\x6b\x65\x2b\x7f\x72\x85\xfb\xa4\x8d\xbd\xbb\xe6\xec\xbd\xdf\xb5\xd1\x9b\x7c\x10\xc0\x10\x23\x5a\x05\xb8\xd6\xb1\xc2\xdf\xeb\x11\x17\x35\xa6\x6c\xf6\x23\x03\xda\xce\x06\x7b\xf7\xfb\xb2\x55\x9e\x65\x2a\xf2\xd3\x99\xb4\x72\xa6\x7f\x1e\x65\x05\x01\xcc\x71\x44\xeb\x39\xae\x35\xd2\x99\x32\xef\xef\xae\x73\x45\xca\x5b\xb3\xbc\x50\x94\x79\x36\xbc\xf0\x2a\xea\xee\x63\x32\x81\xdb\x96\xaa\x51\x29\xb6\x9c\x7a\x10\xc0\xa0\x11\xad\x42\x5c\x6b\x91\x3a\xa2\x76\x62\xdd\x73\xff\x8d\x6b\x14\xdb\xab\xce\xfd\x6d\x23\x54\xee\x36\xb7\x89\x64\x7d\xdd\x17\x83\xd2\x16\x47\x14\x13\x04\x30\x18\x44\xab\x08\xd7\x22\xba\xb5\xfc\x70\x3c\xd9\x4e\xf2\xb1\x66\xb7\xf1\x02\xdd\xdd\x19\x5d\x07\xc3\x36\x85\xfe\xb3\xd1\x06\xd4\x3d\xd7\xd8\xce\xe8\xd1\x43\x00\x73\x02\xd1\x7a\x81\x6b\xed\xd9\xba\x43\xcb\x71\xce\xa4\x12\x09\x4d\xce\xfe\x77\xd5\xbb\xad\xd7\xc3\x3d\x75\x40\x92\x53\xee\xbb\xd1\x4f\x9f\x43\x20\x56\x08\x60\x48\x10\xad\x62\x5c\xeb\x7d\xcb\x25\xd1\x4c\x4b\x7e\x9b\xe5\x67\x0d\x95\xa3\x66\xa3\x14\xf5\x8d\xab\x6f\x97\x3e\x2b\x59\x26\xbf\xdd\xa4\x9f\x3f\x24\xf0\x80\x00\x86\x14\xd1\x2a\x81\x7d\x14\xc0\xbf\xe7\x7b\x4a\x22\xb9\xa2\x2d\x26\xa1\xde\x38\xe7\x41\x54\xbb\xd3\xbb\x8b\x69\x6f\xe3\x0c\x1f\x29\x6c\x58\xf9\xea\xd1\x3b\x41\x00\x43\x86\x68\x95\xc2\xee\xf2\x48\xdb\x15\xb5\x5c\xa3\xed\x6c\x10\x0c\xb5\x7b\x46\xa6\x69\x64\xcb\xff\x4a\xf3\xd3\x37\x9f\x5e\x8b\xac\xe2\x27\x25\xbe\xda\x52\x10\xc0\x90\x23\x5a\x65\xb0\xcf\x3e\xbd\xa1\xed\x96\x0b\x0b\x96\x37\x4e\xbf\x7c\x2e\x37\xf9\xd8\xc9\xab\x45\x5f\xed\x04\xe7\x19\xf0\x58\xad\xdf\x45\x58\x4f\xde\x61\x80\x00\x86\x02\xd1\x7a\x89\x6b\x79\x9e\x4f\x1c\x38\x55\xad\x6a\xec\x2c\xce\xe9\x12\xd9\xea\xdc\x73\xbc\x44\xe6\xaa\x75\xec\xdc\x7e\x4e\x63\x11\x9d\xa8\x84\x85\x0a\x04\x30\x94\x88\x56\x39\xae\x75\xf9\xdd\xc6\x4d\xbe\xeb\xfb\xef\xda\xbd\xb4\xb9\xa5\x7d\xf4\xbb\x62\x9d\x64\xab\x9c\xf5\x57\xd6\x56\xa6\x18\xf7\x57\x27\x1c\x8d\x20\x80\xa1\x42\xb4\x5e\xe1\x5a\xd3\x4d\xaf\x7c\x5d\x05\xb6\x1d\x9c\x79\xcb\x9b\x3a\x5a\x62\xe7\x8a\x6f\x5a\x18\x36\x5a\x94\xda\x6a\x18\x96\xb0\x1f\xd3\xf7\x63\x81\x00\x86\x1a\xd1\x7a\x8d\x6b\xa5\x1f\x3e\x3e\xef\xc8\xad\x7d\x82\x45\x94\xa8\x8a\xae\x35\x60\x54\x7e\x53\x2b\x6c\x44\x48\x9c\x49\xcf\xf2\x33\x43\xc3\x6b\x0c\x31\x04\x30\x27\x11\xad\x0a\x5c\xab\x8a\xd9\x6e\x4e\x36\x4a\xf0\xf2\xc6\xfb\x3a\x6d\x3e\x65\x68\x28\x38\xa9\xaa\x38\x74\x40\x2f\x28\x26\xb1\x6f\x84\x8d\x2f\xe6\x16\x04\x30\x34\x88\xd6\x1b\x5c\xab\x91\xc0\x43\xa7\x44\x8e\xb3\x36\xd2\xfc\x1a\x87\x78\xb6\x24\x68\xbb\x92\xb6\xee\xbe\x4c\xdf\x9a\xa7\xe9\xdb\x8c\x21\x27\x42\x43\x00\x43\x8b\x68\x55\xe2\x5a\x34\xee\xa5\x12\xb9\xf4\xea\x9d\x7e\x0c\x83\x28\xe7\x97\x0f\xe4\x12\x65\xf4\x52\x7b\x1b\x58\xb8\xcc\x8b\x07\x93\x76\x78\x73\x64\x20\x80\xa1\x43\xb4\xaa\x60\x77\xcf\x1d\xc4\x2e\x90\x92\x6d\xa9\xde\x5d\xaa\x7f\x9c\x78\x8d\xf1\xaa\x90\xdb\xa4\x0a\xab\xca\x86\x0a\x26\x55\xf4\x3c\x59\x23\x97\x34\x04\x30\xf4\x88\x56\x35\xae\x95\xc0\x91\xfd\xd6\x24\xad\x29\xfa\xee\xc0\x2f\x2f\x5e\xe6\xab\x6f\x8d\xad\x79\x23\x18\x0c\x9f\xbd\x97\xf6\xce\x67\x20\xcb\x3b\xc3\x08\x01\x0c\x40\xb4\x6a\x70\x2d\x48\xd7\x7c\x20\xc8\x78\xc6\xdf\xaa\x51\xbe\x96\xd8\xeb\x3a\x87\xa5\xf5\x1f\x57\xad\xc6\x88\x1a\xf5\x74\x83\xad\x4f\x4b\xb3\xd8\xd7\x91\x01\xd1\xaa\xc5\xb5\x0e\xd8\xd6\x45\x18\xd7\x0c\xe9\x98\xee\x6e\x53\x79\xa7\xe7\xb7\xbd\x75\xea\xd0\x4f\xcc\x0e\x39\x43\x23\x53\x29\xf3\x2e\x70\x1e\x7b\x8e\x66\x44\xb4\xea\x70\xad\x79\xd9\x0b\x33\x1e\x33\xa7\x22\x9c\xcf\x26\xec\x6c\x26\xbe\x2c\x25\xae\x2c\x15\xec\x24\x00\x09\xcc\xca\x4b\x73\xfa\x32\xae\xd8\x73\x0e\x13\xa2\x55\x0f\xbb\xf3\x07\x49\xd7\x8a\x49\xcc\x17\xd8\xbd\x9a\x2f\x25\xc4\xec\x65\xa5\x9e\x9d\x1e\x79\x71\x5c\x8a\x0b\xaa\xbc\xec\x16\xb4\x76\xd1\x04\x02\x18\x66\x44\xab\x01\xd7\x6a\x1a\xcd\x7d\xc8\xe7\xce\x55\xd7\xdf\x57\x1b\x15\xa2\x91\xf5\x10\x3f\x78\xfc\xf6\xd5\xb9\xbb\x6b\xbb\x18\xb1\xd3\xf1\x02\xa3\x00\x02\x18\x16\x44\xab\x11\xd7\xca\xbd\x12\xa4\xfb\xe6\x54\x3c\x7e\xea\xf1\x4b\x93\xf4\x98\xac\x44\x7c\x85\x32\x76\xad\x1f\xc1\x69\x03\xfe\xc3\x14\xaa\x92\x8b\x1a\x10\xc0\x9c\x3a\x62\xc1\x76\xd4\x9f\xe3\xfe\xb5\x60\x6b\xc2\xfd\xe1\xa3\x5e\x13\x9f\xbc\x33\x7e\x8a\xfd\xa8\xbf\x17\x94\x44\xdb\x76\xa6\x2d\x81\x69\xa7\x45\x3f\xf3\xa6\x47\x02\x5e\x03\xa8\x58\xb7\x83\x00\x86\x15\xf1\x40\x9a\x61\x8f\x0b\x9f\x0e\xbe\x33\x7d\x2c\x2c\xd2\x7d\xe5\x2a\xf3\xfd\x47\xc5\x04\x7d\xf2\xb2\x3a\xa6\x8e\x65\xc6\xc3\x36\x1b\xd7\x09\xc8\x4a\xb1\x0b\x90\xd3\x88\x56\x0b\x6c\xd5\x7f\x4c\x59\xa8\x7a\x44\xf5\x6d\x23\xeb\x15\xba\x4e\x07\x49\x69\xdf\x66\x65\xbe\x31\xc2\x0f\xe8\x8b\xb7\x73\xee\xd6\x2c\x9d\x11\x83\x00\x86\x0d\xd1\x7a\x0b\xbb\xcb\xf3\x9b\xa2\xe9\x1b\x9e\x4f\x61\xf1\xae\x9a\xf4\xe9\xd6\xc3\xd7\x11\xd9\x01\x83\xcb\xc1\xad\xfb\x84\x34\x86\xd7\xce\x71\x99\x1b\x42\x00\xc3\x8e\x68\xb5\xe2\x5a\xd7\x14\x5e\x99\x18\xe4\xbc\xb1\xd8\x75\xc0\x0f\x83\x72\x62\x3c\x23\xd3\xa3\x0a\xac\x45\x69\x48\x67\xbf\xba\xcb\xdf\x69\x32\xd0\x82\x00\xe6\x0c\xa2\xd5\x86\x6b\x91\xb7\xee\x4a\x96\x6e\x1e\xbb\xab\x2b\x2c\x1a\x58\x38\xff\x9d\xc6\x52\x80\x87\xc1\xec\xc7\x9c\x7d\xba\xd5\xb1\x8b\xe2\x9a\x51\x3c\x10\xc0\x9c\x45\xb4\xda\x71\xad\xb0\xb7\x67\xc9\x29\xfd\x3f\x13\x13\xca\x7e\xca\xaf\x3c\x50\x54\xae\xf1\x94\xfd\xa5\xaa\x12\x8b\x47\x65\xc1\xe8\x47\x7c\x9b\xdd\x0d\x02\x18\x0e\x44\xab\x03\xf6\xf8\x2b\x8f\x30\xef\x9d\xa4\xcf\xed\x1c\xfd\xe7\x4f\xa5\x3d\x30\x52\xce\x09\x81\x0e\xdf\xf5\x52\x5b\x02\x84\x51\xc9\x77\xb8\xec\xb0\xc7\xc8\x89\x68\x75\xe2\x5a\xb3\xe4\xb9\x66\x25\xad\xba\xe9\x3e\x17\xfe\xf4\xad\x79\x85\xcc\x3a\x14\xd6\x11\x0a\x16\x34\xeb\x28\x2a\xf7\xd1\xb4\xde\x6f\x74\x81\x00\x86\x0b\xd1\xea\x82\xed\x92\x92\xdc\xd5\x0e\xcd\x3e\x3d\x69\x39\x8c\x54\xdf\x29\xf0\x7a\x46\xe9\xfc\xec\xd6\xd0\x67\x71\xad\x26\x0f\xb1\x88\x39\x8f\x52\xec\xa2\x94\x1b\xd1\xea\xc6\xb5\x66\x86\xee\x2b\xe7\x78\xb4\x9a\xad\xa4\x17\x7c\xfe\xbe\xf8\x75\x2d\x47\xf7\xd3\xfc\xa5\x8d\xaa\xe6\xc9\x32\xb9\x6d\x3e\x97\x1e\x4d\x08\x60\x78\x10\xad\x77\xb0\x39\x51\xae\xc3\x74\xfe\xc5\x15\x6f\x7b\x6d\x6d\x6d\x8b\xf7\xd4\x64\x46\x8d\xe5\xe9\x4e\x17\x26\x85\xbe\x5a\xfd\x3c\x13\x4c\x70\xd9\x1a\x02\x98\x73\x88\x56\x0f\xae\xa5\x42\x20\x16\x14\xb3\x1e\x82\x47\x2f\x60\x5b\x53\xa1\x2f\x6e\x25\xc9\x4f\xdb\x3e\xf3\x05\x4f\x5f\xf2\x6b\x1c\x9e\x0c\xa1\x17\x27\x04\x30\xbc\x88\x56\x2f\xae\x45\x6a\xa6\x92\x1f\x9a\x5e\x53\x75\x6a\xd1\xed\x5a\xbf\x73\xe8\x75\x89\xf4\x71\xfa\xc2\xee\x3e\x3a\xf6\x62\x72\xce\x06\xf2\x55\xec\xc9\xf3\x3c\xa2\xd5\x87\x6b\xed\x70\x9e\x7d\xcb\x77\xe7\xb4\x7b\x2f\xc5\x87\xd1\x2b\x52\x73\x69\xb1\x39\xb4\x82\x6d\x4a\x1f\x33\x14\x16\x76\xe5\x8a\xe2\x86\x08\x20\x80\xe1\x43\xb4\xfa\x71\xad\x98\x5f\xb7\x27\x03\x45\xdc\x7a\x44\xf8\x43\x1f\x28\xdf\x79\x6e\xc0\xf5\x47\xb9\x17\xe2\xcc\xda\xf8\x31\xbe\x29\xa8\x5b\x62\x65\x0e\x01\xcc\x05\x44\x6b\x00\xd7\x22\x9b\xc3\x3b\x60\x25\xb4\x99\xd7\x95\x32\x4e\xbc\xdd\x6e\x33\xf8\x0a\xdd\x88\x99\x3a\x11\x20\xbf\xad\x1f\x22\x27\x93\xb1\xa7\x06\x01\x0c\x3f\xa2\x35\x08\xfb\x2c\x8f\xcb\xde\x88\x26\x61\x99\x9e\x1a\xb5\xe6\x3a\xe7\x65\x26\x4d\x19\xda\xd5\x45\x09\x5a\x5f\xf6\x3f\x77\xaf\x85\x56\x3d\x32\x3a\x06\x01\x8c\x00\xa2\x35\x84\x6b\xd1\xa5\x34\x7f\xf0\xa7\x88\x6d\x8a\xf4\xd5\x4d\x8e\x81\xf4\xae\xfa\xf0\xfa\x53\xb9\xef\xb8\xd9\x44\x55\x78\x27\x4e\xb4\xdf\xc7\x9e\x73\x04\x11\xad\x61\x5c\x4b\xd0\x9d\xc0\xa1\xba\xe0\xba\xb1\xe9\xe2\xb5\xac\x00\x92\x8e\x92\x2d\xcf\x9a\x52\x3e\x65\x92\x53\x0c\xbf\x16\x7d\xa5\xa5\xde\x60\x2f\x36\x17\x11\xad\x11\xd8\xfb\xb1\xa7\x3b\xdd\x72\xf6\xf9\xd9\xca\x7e\xc2\x93\x6a\x6a\xb9\xfd\xb4\x78\x3a\x18\xa9\x2f\x41\xc3\x01\x8e\x0f\x8f\xe9\xe5\xbe\xc2\x6e\x7a\x84\x10\xad\xf7\xb8\xd6\x27\x46\x36\xb4\xd0\xd9\xb4\x13\x83\xce\xc2\x75\xdb\xc3\xc2\x75\xe3\x8f\x1d\x0e\xe8\xd2\x4b\x3e\xfd\x38\xdc\xd0\xb5\x3a\xb5\x24\x0a\x01\xcc\x25\x44\x6b\x14\xf6\xb9\xb3\x55\x5d\x8e\x3e\x3e\x16\x5a\xe1\x6f\xc7\x50\x11\x86\x41\xe1\x96\x4b\x0c\x32\x1f\xfa\xee\x34\xb6\x69\x2d\xff\xe0\x79\xd4\x86\xdd\x54\x0b\x23\x5a\x63\xb8\xd6\x9b\x89\x75\x7c\x14\x67\x5d\x86\x40\x61\xe4\x62\xcc\x69\x3d\x8b\x86\xd5\x49\xe1\x94\xab\xcd\xdf\xbf\xe2\x6d\x87\xe9\x77\x34\xb8\x42\x00\x23\x82\x68\x8d\xc3\xde\x43\xc2\x77\x43\x7b\xa4\xc7\x6e\x4e\x7b\xbd\xa1\xb3\x95\x71\xce\x0d\x09\x6f\xfa\x10\xd6\x5f\xca\xf9\xb8\x76\x2d\xc1\xfc\x79\x24\x76\x33\x26\x8a\x68\x4d\xe0\x5a\x69\x2f\x94\x6a\x34\xc6\x23\x57\x3e\x7f\xf0\xf1\x9a\xc4\x9f\x95\x2d\xc8\x94\xff\x3c\x34\x5d\xb1\x76\x4e\x96\x64\xee\xd9\xe7\x7b\x06\x10\xc0\x88\x21\x5a\x93\xb8\xd6\x75\xf1\x6a\x82\x9c\xea\xf8\xf1\x3b\xa3\xb7\xb8\x01\xf5\x7e\x54\xdf\xd5\x71\x81\xf0\xc4\xa9\xe4\xe5\xee\x44\x86\xe2\xe8\x17\xb6\x10\xc0\x88\x23\x5a\x53\xb8\xd6\x0b\x89\x7e\xee\x87\x41\x05\x6a\x92\x5e\x5d\xa9\x27\x12\xf1\x4b\x94\x8f\xd3\x56\x7f\xea\x2f\xd8\x0c\x14\x8e\x3e\x4e\x3e\x31\xa6\x0e\x01\x8c\x04\xa2\x35\x8d\x6b\xa9\x27\xbe\x37\x31\x6c\xae\x79\x45\xeb\x96\x9a\x73\x7a\xc0\xac\x51\x03\x25\x50\xf4\x63\x80\xf9\x7b\xc0\xf8\x70\x0a\xcd\xab\x46\xec\x7a\xe2\x32\xa2\xf5\x01\xd7\xf2\xc8\x0b\xf5\x8f\x63\x70\x8a\x15\xd8\x96\x51\x8e\x64\xcc\xe6\x37\x79\xe0\x94\xeb\x6d\x42\x8b\xb6\x50\xe2\x17\x8a\x24\xfe\xed\x0e\x01\x8c\x24\xa2\x35\x83\x6b\x51\x2b\x9d\x93\x52\xcc\x71\x10\x9c\xb5\x7e\xa0\x26\x37\xd1\xa1\x38\x4b\x13\x7d\x5b\xc7\xc7\x99\xd8\x2a\xe0\x83\x80\xec\xf3\xaf\xf6\x10\xc0\x48\x21\x5a\x1f\x61\x1b\xf4\x0a\x52\xba\x25\x91\x3a\x6f\x4a\xee\x74\x56\x76\x9a\xbe\x67\x03\xe3\xbc\x91\xe3\x14\x40\x9e\xb1\xad\x3c\x69\x6b\x47\x03\x7b\xfe\xba\x72\xc4\x82\xed\xa8\x28\xca\x5f\x0b\xb6\x59\xd8\xb3\xf0\xfc\xf1\x32\x3f\x42\x7d\xe6\xa5\xe9\x37\xcc\xcc\xdb\x5c\xcc\xca\xac\x21\x98\xe2\x1b\xe9\x0e\x03\x2e\x22\xd4\x63\xda\xf3\xd8\x1d\xbd\x34\xe2\x81\xcc\xe1\x5a\x73\x76\x54\x81\x76\xac\x8d\xb3\x33\x9f\x2c\x83\x1f\x56\x1f\x58\xe6\x3c\xab\x91\xb6\x1b\x67\x1a\xe4\x6d\x70\xf1\xcc\x60\xbb\x8a\xb5\x64\x10\xad\x79\x5c\xeb\xe9\xc9\x46\x52\xfb\x92\x9e\x6a\x97\xfe\x43\xfb\x3b\xf7\xd2\xa6\x43\x3c\x97\x6b\x1d\xe2\x56\x3c\xf6\x86\x45\x1e\x50\xa9\x89\xe8\x43\x00\x23\x8b\x68\x2d\xe0\x5a\x51\xca\x29\x6d\xb7\xae\x1f\xa2\xe3\xac\xe9\x22\x2b\x8d\x1c\x9a\xa2\xad\xde\x0a\xdf\xd0\x56\xf9\x83\x4f\xa7\x30\x45\xb9\x40\xe6\x08\x01\x8c\x1c\xa2\xb5\x88\x6b\x11\x34\x33\x8a\x73\x74\x2f\x93\x84\x69\xe9\xb1\x66\x7b\xbb\xaf\x97\x06\xd4\xb3\x7e\x14\xfc\xf5\x47\x7d\x7d\x99\x57\x8d\xb2\x9d\x16\x02\x18\x79\x44\x6b\x09\x76\x8b\xfc\x3e\xa1\x4f\xfa\xb2\xde\x17\x54\x12\x7f\x71\xed\x7c\x4f\x8f\x4a\xf6\x5e\xab\xb4\x65\x32\xf9\x92\x1e\xf3\xf5\xa9\x41\x5a\x65\x08\x60\x14\x10\xad\x4f\xb8\x16\x37\xf5\x3d\x71\xa6\x77\x78\xa7\xdd\x4b\x23\x2b\x0f\x2f\x5f\xde\xc9\x7a\x2d\xff\xe2\x0b\xe7\x1d\xbe\x66\xee\x8a\xdc\x9a\x33\x9b\xd8\xdd\xdb\x55\x44\x6b\x19\xf6\xbc\xdf\xf6\xd5\x1d\x17\xc7\x44\x35\xae\x2f\x33\xef\xb3\x82\xeb\xc7\x67\x63\xcf\xb8\xc4\x1d\x48\x51\xab\xbf\xe4\x18\x89\xbb\xe9\x89\xbd\xd8\x28\x22\x5a\x9f\x61\x77\xb2\x38\x18\xf9\xdf\xf4\x04\x7e\xc9\x09\xa3\xf8\x36\x17\x31\xd4\xf8\x61\x97\x7d\xac\x7b\x87\xe1\xa6\x56\x90\x50\x79\xb5\x68\x81\x0d\x04\x30\x4a\x88\xd6\x0a\xec\xb3\x3c\xf7\x89\x67\x52\xe2\x39\x2e\x98\x57\xf1\x5d\x97\xcb\x6e\xd9\x7c\xf8\x99\x37\x94\x5a\xe5\x7a\x9c\x17\x9e\x2a\x0f\x1e\xb5\x2d\xf6\x75\x54\x46\xb4\x56\x61\x8f\x4d\xe2\x86\xbb\x0a\x34\xc2\x9b\x89\x49\xde\xa3\x1b\xaf\x3c\x55\x0a\x97\x7c\x48\x27\x95\xe5\xb0\x7f\x41\xe8\xf9\x6c\xdd\xe9\x68\x0b\x08\x60\x54\x10\xad\x35\x5c\xcb\xbb\xa4\x0f\xe5\x4d\x6c\xa9\xed\x79\x96\x6b\xfa\x92\xf7\x3d\xb3\x2f\xc6\x12\x2b\x55\xaf\x89\x4f\x29\xb9\xef\x92\x3d\x49\x26\xd5\x86\x00\xe6\x1a\xa2\xb5\x0e\x5b\x2c\x4b\x5c\x57\x26\x2e\xf3\xc8\x8e\xed\x14\xc7\x70\xbc\xd1\xe6\x9e\xca\xa2\x53\xc8\xb0\x27\x7b\x78\xb6\xf9\xd1\xd3\x4f\x17\xf4\x39\x20\x80\x51\x45\xb4\x36\x70\xad\x3c\x63\x86\x03\x37\x4f\x6d\x4f\x8b\x09\xc9\xd2\x0f\x66\xe9\x5e\xdd\x49\x8c\x9d\xb5\x14\x57\x16\x93\x32\xf7\xb6\x37\x2f\x5d\x60\x82\x00\x46\x0d\xd1\xfa\x82\x6b\xed\x47\x17\x11\x6c\x55\x3d\xf5\x0e\x1c\x62\xd2\x75\x7c\xbd\xf9\x8d\x37\xa1\xba\xff\xec\x59\x2e\x94\x9c\x9e\x99\x3d\x7f\xc8\xba\x0e\x04\x30\xea\x88\xd6\x57\xd8\x47\x14\x96\x63\xef\xdc\xf7\xeb\x4f\x1c\x35\x4c\x58\x5f\xe8\x45\xd1\x95\x3d\xdb\x36\x09\x39\x36\x2d\x39\xcf\xaa\xbd\xf0\xb2\x2b\x52\x0e\x02\x98\xeb\x88\xd6\x26\xae\xb5\xd4\x3d\x14\x69\xeb\x65\x53\xf9\x8c\xae\xc1\xe5\xe6\xcd\x7a\xbf\x47\x99\x13\x04\x67\xca\xad\xa1\x05\xcf\xf9\xb3\xb1\x0d\x13\x84\x10\xc0\x68\x20\x5a\xdf\x70\x2d\x45\x4f\x86\x2a\xa2\xa6\x8e\xb3\x65\x44\xf9\xef\x8a\x0e\x4f\xb4\x5b\x9d\xbb\x2d\x6b\x28\x2e\x3f\x75\xd7\xdb\xbb\x2b\x65\x40\x0f\xbb\x98\xd1\x44\xb4\xb6\x70\x2d\xad\xe3\x69\xb4\x9d\xbf\x5a\xa3\x15\x49\x2b\x27\xc8\x55\x23\x5c\xc2\x97\x14\x52\x69\x2a\x02\xb3\x0e\xcf\x3c\x6c\xa2\x95\xca\xc5\xee\xc2\xb5\x10\xad\x6d\x5c\x4b\xa2\xfd\xd6\xf5\x13\xb4\xe3\x01\xc0\x5a\x20\x4f\xe0\x4d\x23\x2b\xe1\x74\xd1\xdc\x6b\xd6\x11\x45\xa3\x6d\x8d\xa6\xfb\xe2\x4b\xd8\xb9\xaa\x8d\x68\xed\xc0\x36\x17\x9c\x2d\xcb\xf2\x54\x1a\x3d\x39\x42\x9a\xa5\x37\x12\x14\x43\x58\xde\x3a\xfe\xd6\x9e\x20\xf8\x7e\x3a\x95\xb7\xf6\xed\xf6\x8d\x2b\x10\xc0\xe8\x20\x5a\xdf\x71\x2d\x5e\x21\x33\x5b\x86\xc3\x5e\x8c\x7a\x86\xf9\xf8\xf6\x8b\xf6\xe4\x2b\x95\x06\x52\xe8\x40\xae\xd9\x52\xc5\x97\x64\xd5\x9f\xde\x98\x40\x00\xa3\x8b\x68\xfd\xc0\xb5\x08\x65\xec\x4b\x97\x75\xad\x94\x08\x88\x09\xc2\x7e\xcc\xc7\xc6\xcd\xdd\x9e\xe1\x04\xb5\xa8\xed\xfc\xe3\x69\x05\xc2\x9b\x4f\xb0\x8b\xac\x1b\x88\xd6\x2e\x6c\x23\x9c\x96\xf3\xd3\xc7\xce\xf2\xd3\x13\xf5\x27\xd1\x64\xd2\xcd\xc1\xd7\xee\xcd\x18\xc5\x2b\x12\xd8\xa0\xa7\xde\x13\xd4\x10\xbf\xc7\x6e\x5e\xf5\x10\xad\x9f\xb8\xd6\xb3\xd6\x66\x86\xfb\xc4\xea\xaf\xb3\x14\x37\xb4\xab\x87\xce\x0e\xc7\x3f\x32\xed\xe7\xa3\x97\x69\x3a\xe8\xa7\x53\xe9\x1c\x0f\xb9\x09\x01\x8c\x3e\xa2\xb5\x07\x7b\x02\xf5\x7c\x5c\x08\x15\x54\x61\xca\xc8\xf3\xdb\xac\x85\x45\xd1\x8e\x8b\xc5\x93\x9d\xa2\x56\x17\x4c\xab\x52\x7e\x20\x7f\x68\x24\x0c\x01\x8c\x01\xa2\xb5\x8f\x6b\xa1\x0b\x22\xe4\x34\xe8\x7b\xee\xc5\x8f\x36\xd8\x85\x49\x33\xaf\x6e\x4f\x6b\xd2\xae\xd0\x04\x6c\x68\xff\xe0\x09\x77\xc7\xd7\xc0\x9e\x0b\x0d\x11\xad\x5f\xb8\xd6\x98\x5f\x36\x18\xcd\xbe\xbe\xea\x1e\xf9\x26\x70\xa9\x75\x89\x53\x76\xd8\x1a\xad\x1f\x15\x16\x1d\x72\x11\x4f\xe1\xc4\x70\x1b\x0a\x02\x18\x23\x44\xeb\x00\xb6\xc0\xf5\x53\x89\xe0\x46\xd7\xb9\x28\x66\x93\x5e\x4c\x33\x95\x5e\x13\xeb\x72\x69\xf8\xf3\xbd\x55\x80\xac\x84\xb4\x41\x89\xfe\xe3\x49\x08\x60\x8c\x11\xad\x43\x5c\xeb\xfe\x89\xc7\x95\x7e\x45\x8e\x62\x17\x2e\xdf\xb1\x09\xf8\xc4\x7f\x62\x79\xca\x95\x58\x22\x55\x67\xa0\xea\x93\xa4\x71\x65\xb6\x21\x2f\x04\x30\x26\x88\xd6\x6f\xd8\x22\x8b\x55\xe3\xaa\x40\x53\x60\x55\xe5\xdc\x86\xa2\x63\xbe\x6c\x85\x01\x8b\xb4\xf9\xac\xc9\xb6\xf6\x10\xf7\x8b\x26\xf5\x9d\x36\xec\x86\xd3\x14\xd1\xfa\x83\x6b\xad\xa1\x08\x5a\x1b\xa1\x3a\xa0\x86\x9f\x2c\x14\x1e\x98\x9f\x73\x65\xfc\x6b\xca\xee\xd5\x2b\xcf\xb8\x1e\x45\x3d\x52\xfe\x63\x73\x16\x02\x18\x33\x04\xab\x9f\xfa\xbf\x4b\xd3\xfd\xdf\x05\x1b\x40\xc1\x8a\x6b\xed\x04\xfa\x50\x89\x1a\xed\x93\x94\x96\xec\xd6\xa7\x05\x37\x77\x96\x2e\xca\x1c\xbf\xad\x60\x6e\x5e\xc2\x6b\xb3\x97\x59\xa4\x76\x1a\x02\x18\xc4\xe2\x1a\x40\xc1\x9a\x6b\x3d\xb2\x33\xac\xf4\xc3\xd3\xdf\x9f\xb8\xf1\x25\xf5\x0c\x49\xfe\xf4\x2b\x60\x93\x7a\xc6\xd6\x8b\x81\xb8\xc6\x3f\x92\x78\x94\xc9\x40\x00\x83\xd8\x5c\x03\x28\x58\x75\xad\x5c\xe5\x9c\x96\x5d\x82\x60\xac\x7e\xdf\x0d\xaa\x4f\x2c\x5f\x9e\x1a\xa2\xba\x42\x9c\x7a\xa9\xda\x86\x09\xca\x97\x9e\x5b\xbd\xc4\xfe\x5e\x10\xab\x6b\x00\x05\xeb\xae\xb1\xe1\xab\xd2\x70\xe0\xb9\xfc\x54\x9b\x13\x4d\x61\x4c\xa0\x26\x8c\xda\x36\xba\x78\x70\xf9\xde\xa3\x27\x57\x66\xcf\xac\x77\x5e\x3a\x0f\x01\x0c\x62\x77\x0d\xa0\x60\xe5\x35\xb7\xb3\x0c\xa7\x8b\xa3\x18\xfa\x8f\x5b\xc7\x33\x3d\xa4\x33\xe7\x7f\xc9\x73\xa7\x50\xe8\xf9\x4a\x4d\x41\x80\xea\xfe\x75\x3f\x35\x7c\x08\x60\x10\xcb\x6b\x00\x05\x6b\xaf\xe1\xa3\x3e\x2f\x3e\x9f\x32\xd3\x6f\x30\x59\x98\x7b\xda\x14\xe7\xf0\x25\x76\x51\x91\xb5\xf7\xe4\xfd\x53\x9a\x1a\x5d\x7e\xf6\xf5\x96\x10\xc0\x20\xb6\xd7\x00\x0a\x56\x5f\xb3\x74\x9d\x78\xd2\x9e\xab\x7c\xcf\x8d\xd5\x6a\xad\x70\x95\xfe\xcd\x95\xfe\x47\x51\xe4\xe4\x64\xa2\x44\x75\x14\x92\x4f\x48\xa5\xb1\xeb\x5c\xc4\xfa\x1a\x40\xc1\xfa\x6b\x45\x9d\x1f\xbd\xe9\x2f\x9e\x0a\x2d\x26\x59\x8a\xa9\xa2\x95\xa0\xe7\xda\x6c\x5a\x79\x13\x43\x78\xc9\x85\x3f\xa5\x6a\x49\x5e\x57\x1c\x02\x18\xc4\xfe\x1a\x40\xc1\x0a\x6c\x52\x86\x75\x49\x5e\x54\x4f\xbf\x70\x5d\xae\xca\xe4\xd3\x55\xfe\xfe\xb5\xc7\x2c\xdd\xb0\x26\xd3\xe3\xbb\x40\xb8\x4b\x47\x9d\xb9\x0b\x04\x30\x88\x05\x36\x80\x82\x35\xd8\x5c\x6e\xcf\xf7\x9e\x7c\x7c\x69\xf8\x3b\x21\x67\x48\x26\x8d\xb7\x23\x6a\x09\xfa\xa6\x44\x7e\xd8\x56\xf9\x65\x34\x9e\xe3\xdb\x71\x09\x08\x60\x10\x1b\x6c\x00\x05\xab\xb0\x0d\x3c\xff\xc1\x7e\x39\xca\x5f\xdd\x3f\x5a\x68\x9c\xe9\x5b\x30\xa5\x3e\x11\xb3\x7c\xbd\xd4\xb4\x27\x53\xc3\x90\xdf\xab\x63\xc1\xb7\x20\x80\x41\xac\xb0\x01\x14\xac\xc3\xc6\x37\x3b\xc4\xcb\x3f\x5f\xf2\xd4\x70\x38\x7c\xa1\xe3\xfe\xca\x19\x75\x55\x22\x8e\xa7\x07\x1e\x0a\x4f\x04\x6b\x7f\xc9\x57\xd7\x5c\x84\x00\x06\xb1\xc3\x06\x50\xb0\x12\x1b\xc3\x4a\x42\xcc\xe3\x5f\xf9\x95\x72\x77\xa2\xd7\xe2\xe6\xe5\x9e\x7e\xcb\xbe\x7b\x10\x15\xf3\x5e\x30\x34\xa7\xca\x39\xc0\xf2\x0f\x0d\x04\x30\x88\x25\x36\x80\x82\xb5\xd8\x0a\x13\xc8\x83\x5f\xaf\x1a\x77\x13\x6f\x87\xb9\x0d\xcf\x5c\x57\xef\x21\x6e\x72\x7c\x30\xc5\x5a\x32\x97\xcc\x23\x3d\x9d\x8a\x56\x83\x00\x06\xb1\xc5\x06\x50\xb0\x1a\x9b\xeb\xb7\x4d\x9e\xb2\x33\x3e\x0f\x4c\xea\x3a\x2e\x09\xab\xf6\x33\xae\x6c\x85\xbd\xac\x3f\x43\xdf\x75\x59\xa9\x9f\xc0\x90\xef\x1a\x76\xf3\x8b\x58\x63\x03\x28\x58\x8f\xed\x70\xd5\x25\x5a\x64\x71\xcd\x20\x36\x29\x44\xa3\x9e\x97\xd6\x00\x3f\x7c\x85\x72\x7d\x82\x74\xcd\x42\xd9\xdd\x32\xb6\xf8\x29\x27\x04\x30\x88\x3d\x36\x80\x82\x15\xd9\x98\x56\x49\x74\xf6\xc2\x36\xbb\x56\x59\xcd\xd5\x9e\x54\x16\x9f\x9c\x4c\x67\x26\x0e\x14\xa1\xa0\xbb\xc5\x8d\x77\xee\xd3\x90\x1c\x76\x6a\x20\x16\xd9\x00\x0a\xd6\x64\xc3\xdb\x11\xf5\x62\xbb\xe6\xca\x8e\x7f\xbc\x59\xb7\xed\x6e\xad\xa8\xc9\xfe\xd5\x0d\xaf\x53\x96\x3f\x55\x87\xcf\xac\x64\x9f\x68\xc6\x5e\xfa\x11\x9b\x6c\x00\x05\xab\xb2\xa5\x88\xa8\x69\x26\x36\x0b\xa7\x28\x5b\x00\xcf\x37\xd2\x8a\x28\x1e\xfa\x4f\x4d\x2d\x2a\x74\xaa\x5e\x03\x63\xb7\x5b\xc8\xb4\xc9\x20\x80\x41\xac\xb2\x01\x14\xac\xcb\x76\x2b\xda\x96\x39\x91\x71\xec\xe6\x4c\x0b\x5a\x5d\xbe\xe5\x27\x71\x00\x53\x0d\x03\x5d\x0e\xdf\xd3\x89\x57\x92\xb6\x7e\xeb\xa9\xd8\x4d\x15\x62\x97\x0d\xa0\x60\x65\xb6\x1e\xcd\x49\x61\xe7\x9f\xac\x64\xfb\x89\x6b\x27\xee\xd8\x7b\x3a\x74\xd6\xa8\x65\x54\x12\xd1\xf9\xd2\xa1\x4a\xd0\x33\x3f\x6a\x8d\x21\x80\x41\x2c\xb3\x01\x14\xac\xcd\x96\xe2\xdd\xd9\x69\xec\xa7\x57\x30\x10\x5d\xdc\xef\xb3\xdd\x16\xb3\xd9\x1f\x14\x46\x89\x59\x27\x1d\xfb\x20\x57\x75\xdc\x2c\x16\xfb\x02\x20\xb6\xd9\x00\x0a\x56\x67\x13\xa5\x17\x5b\x22\x0a\x3d\xb9\xe4\x49\x55\xfa\x21\xf2\x98\xfd\x9f\x26\x9d\x8a\x9e\xd8\x37\x82\xf4\xf5\xc5\x7c\x9e\xc7\x6f\x2a\x53\x42\x00\x83\x58\x67\x03\x28\x58\x9f\xad\x8e\xce\x61\x37\x5e\x46\x5c\xae\xe7\xac\x48\x55\xe5\xe1\x3d\x91\xdf\x7e\x76\x51\x7f\xba\xc4\x04\xac\x8b\x3f\x46\x7b\xd4\xae\x9c\x83\x00\x06\xb1\xcf\x06\x50\xb0\x40\x5b\x84\x4f\x01\x51\x6a\xb0\xaa\x8b\xce\x0d\x05\x43\xee\x8b\xeb\x05\xdc\xf5\x9a\x27\x3e\xa0\x94\x7c\x32\xd3\x19\x28\x27\xaf\xf5\x60\x5f\x00\xc4\x40\x1b\x40\xc1\x0a\x6d\x13\x5d\x21\xee\x1b\x44\x79\xb2\x35\x5b\xa3\x29\x27\xf5\x87\x9a\xca\x3f\xd3\x66\xe8\xe4\x1e\x40\xc7\x5e\xd0\xbf\x3c\x71\x72\x1d\xbb\xcc\x41\x2c\xb4\x01\x14\x2c\xd1\xd6\x1b\x27\xed\x40\x71\x3f\xe8\x9c\x4a\xa3\x4e\xe8\xf9\xfc\xa6\x5f\x4b\x34\xb1\x2e\xe6\xba\x82\x91\x81\x3f\xcb\x3e\x94\x25\xb6\xc8\x42\x00\x83\x98\x68\x03\x28\x58\xa3\x4d\x7d\x4c\xce\x3b\xb4\xb4\xf0\x25\x65\xfa\x76\x1f\xcf\x16\xaa\xc1\x85\x52\xe9\x06\x9d\x73\xc2\xdb\x6a\x2a\x61\xb2\xe5\x66\x56\xec\xa6\x0f\xb1\xd1\x06\x50\xb0\x48\x9b\xf8\x89\x6b\xcc\x83\x5c\x51\x7f\xa6\xee\x1a\x91\x3b\x8b\x46\x3d\xeb\xcf\xbc\xcb\x74\x57\xe5\x5d\x33\xf4\x3e\xdc\xf3\x76\xe1\x59\xec\x61\x22\x46\xda\x00\x0a\x56\x69\x8b\x3b\x81\x79\x1b\x1e\x65\x5d\xe2\x48\x19\x72\x4d\xb8\x4f\xfc\x6b\xeb\x43\x23\x8a\x38\x3a\x26\xfc\x47\x14\x12\xf6\xa7\x21\x51\x67\x08\x60\x10\x2b\x6d\x00\x05\xcb\xb4\xe1\xb5\xa1\x5d\xd2\x95\x85\x3e\xde\x29\x29\xbe\x18\x6f\x2d\x3b\xc9\x7a\x9f\x60\x88\xfd\x0c\x97\x29\x85\xc0\x2b\xbc\x0b\xb4\x37\x8e\x41\x00\x83\x98\x69\x03\x28\x58\xa7\x4d\x63\x6b\xca\xc8\x15\x9f\xb2\xee\x57\x3d\xe5\xa5\x93\x16\x2f\x4f\xa2\x0b\x32\xf8\x42\xa3\x9a\x23\xab\xe4\x84\xb7\xfc\xe4\x29\xcd\x20\x80\x41\xea\xb4\xfd\xb3\xa0\x3b\x2a\x20\xfc\xf7\x82\x0e\x16\x6a\x6b\x09\xab\x7a\x23\xfa\xf2\x8e\x0e\x66\xa2\x84\x90\x7a\x56\x60\x1c\xdf\x5d\x7a\xe4\x69\xfe\x17\xbd\x97\x6c\x1d\xd0\xe6\x3d\x4a\xec\x15\x08\x31\xd4\x06\x50\xb0\x52\x1b\x97\xb2\x28\x43\x76\xf4\xeb\x0e\x0e\x20\xd7\x73\xff\xfd\x25\x83\x64\xc3\xe1\x62\x74\x53\xda\xed\xaa\x2f\xe4\x95\xbc\x73\x79\xd8\x3d\x06\x62\xa9\x0d\xa0\x60\xa9\xb6\x0a\x87\x18\xdd\x40\xe8\x4a\xaa\xdf\xc3\xeb\xef\xa3\xc8\x5a\x48\x31\xc7\x09\x46\xd9\xd9\x22\x3b\xbe\xbf\x32\x97\x85\x74\x54\x95\x21\x80\x41\x4c\xb5\x01\x14\xac\xd5\x96\x38\xed\xc5\x12\x6f\x4e\xa2\x78\xc1\xe7\xda\x56\xd2\xf7\x43\x9a\x6b\x2a\xf2\xbc\x06\x86\xef\xd7\x5b\x00\x77\x74\xa3\xb6\x30\x35\x04\x30\x88\xad\x36\x80\x82\xc5\xda\xa0\x01\xa6\xbd\x8b\xe7\x49\x8e\x3b\x39\xb9\xaa\xce\x54\x7e\xa6\xb8\xd5\x96\x7e\x69\xfa\x1d\x89\x71\x93\xaf\xc8\xd5\xaf\x18\x05\x16\x08\x60\x10\x63\x6d\x00\x05\xab\xb5\xdd\xe1\x23\x39\xd7\xc5\xca\x41\x6f\x6c\xd4\x47\xff\x4e\x62\xf0\x72\xa4\xa3\xcd\xfc\xde\x89\x56\xcb\x70\x7d\x3f\x4a\x09\x19\x2d\xec\xc4\x44\xac\xb5\x01\x14\x2c\xd7\xe6\xfc\xd3\xfc\x7c\x17\x73\xdd\xd6\x4d\x97\xbd\x04\xf2\x82\x3d\xa9\xb9\x14\x31\xd9\x88\xf1\x67\x25\x9d\x22\x96\xa9\x22\xa4\x8b\x0e\x10\xc0\x20\xe6\xda\x00\x0a\xd6\x6b\x23\x65\x79\xfe\xf4\x67\x13\x29\x17\xcd\xc2\x93\x93\xb7\x4f\x57\xb6\xbf\x35\x4f\x9a\x65\x1d\xb7\x59\x1e\xbd\x78\x4b\xc6\x21\x7f\x01\x7b\xce\x42\xec\xb5\x01\x14\x2c\xd8\xf6\xf9\xdc\x4b\xeb\x87\x02\x41\x44\x4a\xa3\x8f\x2f\x3a\xfb\x7e\x58\xb5\x49\xa2\x2d\xb2\x74\x41\xb7\x49\x81\x6e\xdd\x9f\x57\x00\xf6\x2d\x83\x18\x6c\x03\x28\x58\xb1\xcd\x49\xdb\x8e\xf0\x92\x1f\xdd\x70\x5e\xa7\x88\x6e\x2f\x71\x2c\x4d\x4d\xb9\x2f\xcf\x8b\x8f\x2f\x1d\xef\x52\x13\x11\x97\xef\xdf\xb9\x0a\x01\x0c\x62\xb1\x0d\xa0\x60\xc9\xb6\xf9\xee\x2d\x89\xe8\x09\x85\x01\x39\x3f\xed\x07\x06\xdf\xa7\x06\x77\xa3\x4a\x7e\x95\x19\xb3\xa8\xb0\xd4\x6e\xdc\x0f\xe1\x52\xc6\xfe\xce\x10\x93\x6d\x00\x05\x6b\xb6\x15\x26\x7e\xeb\xf6\xfb\x55\xac\x32\x9c\x65\x2c\x1f\x41\x4d\x6e\x66\x47\xaf\xf2\x3b\x64\xc6\xf1\xc6\xe9\x24\xbf\x5e\x96\xe2\x72\xec\xc6\x01\xb1\xd9\x06\x50\xb0\x68\x5b\x1d\x3a\x33\xed\x6d\x30\x77\xf3\x07\x69\xaf\xc9\xdf\xbb\xaf\x37\x95\xf3\x09\x33\x9e\x8f\xcb\x0d\x98\xc5\xb4\x6f\xd1\xc5\x45\xe1\x41\x00\x83\x18\x6d\x03\x28\x58\xb5\xcd\xe7\xfe\xbd\x2b\xf6\xfe\xa2\x01\x93\x4e\x37\x38\x42\x8a\x77\x25\x42\x23\x7f\xf0\x2f\x6a\xfc\x5a\xdb\x3a\x65\x6d\x62\xe0\xa7\xc9\x07\x01\x0c\x62\xb5\x0d\xa0\x60\xd9\xb6\x80\x97\x29\xea\xb1\x89\x92\x64\xdf\x32\x09\x04\x75\x38\xbe\xff\xf1\x24\x4d\x4b\x79\x31\x15\x93\x6f\xb4\x1f\x74\xe6\x32\x95\x38\x76\x71\x82\x98\x6d\x03\x28\x58\xb7\x8d\xd9\x6f\x73\x42\x75\xbd\xb5\xcd\xde\x3f\x55\xa9\x7b\xe2\x4f\xf0\x17\x4f\x46\x5b\x7c\xe5\xc4\xfe\x63\xd5\x01\x04\x9d\xd1\x3b\x8c\x10\xc0\x20\x76\xdb\x00\x0a\x16\x6e\x73\x8f\x2b\x90\xcb\xd1\x31\xef\x96\x54\xe4\x31\xa6\x5a\xeb\xdb\x20\x99\xb7\x24\xd0\x8b\xd0\xfd\xf8\xa8\xf6\xe3\xfc\xe1\xe5\x16\xec\xa4\x45\x0c\xb7\x01\x14\xac\xdc\x56\x25\x49\x2a\x27\x19\x3a\x5d\x9d\x5f\xd5\x3e\x47\x37\x1a\x28\x16\x44\x3b\xd1\x68\xd2\x62\x6f\x76\x3d\x84\x4e\x6e\xd0\xad\xfd\x3a\x04\x30\x88\xe5\x36\x80\x82\xa5\xdb\x68\x7d\x25\xdf\x3c\x17\xd7\xe1\x6d\xe8\x3e\xa8\x56\x13\xd9\xc7\x47\x2b\x64\x6d\xf7\x5f\x16\x6f\x24\x0f\xe2\x9f\x41\xb7\x35\x11\x40\x00\x83\x98\x6e\x03\x28\x58\xbb\x4d\xd5\xc2\x62\x49\x21\x25\xc4\x77\xc1\xf4\xb7\x4f\x7b\xa7\xcf\xd6\x70\xec\x70\x93\x42\x55\x3e\x68\x93\x5b\x78\x9d\xe0\xd7\x66\x0e\x01\x0c\x62\xbb\x0d\xa0\x60\xf1\x36\x8f\xe7\xc4\xbc\xd6\x04\x19\xa5\xcf\xd3\xb3\x2e\xfb\x8f\x3e\xe4\xd2\xb5\xfc\x22\xf2\xcd\x97\xee\x76\x32\x1e\x61\x97\x93\xa6\xd4\x09\x08\x60\x10\xe3\x6d\x00\x05\xab\xb7\x1d\xc8\x12\xdf\xca\x21\xb1\x50\x92\x7b\x90\x6f\xf1\x45\x6c\x3e\x7c\xb5\xe6\x98\x60\xf5\x03\x92\x06\x89\x18\x7a\x3f\x66\x90\x27\x04\x01\x0c\x62\xbd\x0d\xa0\x60\xf9\xb6\x11\xbb\xf7\x42\x6a\x50\xf1\xbe\xb5\x86\x01\xc6\x21\xee\x43\xb6\x6f\x99\xf1\xe7\x82\x84\x85\x5f\x52\xcb\xc5\xd1\x3c\xf2\x2e\xc7\x21\x80\x41\xcc\xb7\x01\x14\xac\xdf\x56\xfb\xf0\xe7\x55\xb5\xfc\xc6\xc8\x49\x99\x81\x22\xa7\xbb\x78\xfb\x9b\xd2\xbf\xfa\x4d\xbf\x45\x90\x1c\x6e\xea\xc4\xce\x54\xa4\x8a\x41\x00\x83\xd8\x6f\x03\x28\x58\xc0\x6d\xb4\x85\xec\xd2\x9f\x38\xd2\xa6\xfa\x0e\xf1\x1e\xd2\xe8\xf4\x59\x89\x4c\xbe\x47\x9c\x12\x03\x23\x79\xe6\xea\xd1\xe6\xd6\xa4\xd8\x4b\x1d\x62\xc0\x0d\xa0\x60\x05\x37\x97\xfd\x3f\xa9\x0c\x50\x53\x8c\x54\x9a\x5d\x02\x6f\x9c\x85\x4b\x56\xf9\xed\x64\xbc\x2b\xc6\xb7\xae\x4d\x71\xb2\xd1\x5c\x16\xc2\x4e\x5a\xc4\x82\x1b\x40\xc1\x12\x6e\x78\xe1\xb6\x3f\xbf\x05\x48\xac\x4e\xbd\xd3\xde\xf0\xfa\xb0\xa0\x54\xf0\x43\x41\x92\x60\x8b\x7f\x81\x58\xd0\xa8\x73\x7f\x75\xd1\x00\x02\x18\xc4\x84\x1b\x40\xc1\x1a\x6e\x3b\x57\xe8\x35\x1b\x63\x5e\xb4\xa9\xa7\x8f\xb8\x2c\x0b\xf8\x7f\x83\x8c\x74\xa2\x6f\x30\x9e\x32\xb7\xfe\x84\x62\xe2\xe7\xf1\xc0\xee\x29\x11\x1b\x6e\x00\x05\x8b\xb8\x95\x84\xfe\xbc\xe5\x6d\x4b\x29\x04\x19\xce\xca\xca\x5d\x5d\x2e\x19\x3d\x08\xd1\x33\x92\xf9\xba\x90\x79\x72\xfe\xb1\x6f\xb8\x3f\x76\x1b\x88\x18\x71\x03\x28\x58\xc5\x8d\xe9\x5a\xc1\x83\x6e\x48\xad\xf5\xc5\x57\xe5\xf0\x33\xf7\x9e\xca\x79\x65\x0b\xd3\xdf\x2c\xad\x09\x4e\x6c\x36\x14\x3c\xc5\x6c\x23\x0f\x01\x0c\x62\xc5\x0d\xa0\x60\x19\xb7\x2a\x9d\x87\x8c\x8b\x65\x3b\xa1\x79\x1d\xb7\xbc\xc9\x12\x38\x02\x98\x52\x28\xee\x7d\xcb\xa5\x2d\x15\x13\xe8\x2b\x56\x7c\xe2\x8e\x7d\x35\x11\x33\x6e\x00\x05\xeb\xb8\xd9\x59\x96\x1a\xf5\x9d\x0d\x9e\x6c\x3f\x6e\x3a\x68\xe6\xc2\x48\x7b\xe1\x57\xfd\x46\x42\x39\x6f\xd8\x53\x6b\xee\x9f\x97\x24\x3c\xf4\x21\x80\x41\xea\xb8\xfd\xb3\xa0\x3b\xea\x6b\x1e\xfe\x5e\xd0\xc1\x42\x6e\x24\x14\x8c\x3a\x9f\x2f\x01\x01\x28\x42\x52\x23\x43\xa1\xf0\x47\x79\xfd\x20\x41\x7d\x6f\xcc\x62\x56\x66\x48\x31\xd3\x31\x16\x1b\x08\x60\x10\x43\x6e\x00\x05\x2b\xb9\xe5\x6a\x85\xee\x76\xd2\x0c\x0b\xe1\x93\x5d\xdf\xff\x38\x75\x45\xb7\x2d\xc0\xc4\x71\x27\x3d\xfb\xe5\x9d\x27\xf9\x3e\x52\xae\x26\xac\x10\xc0\x20\x96\xdc\x00\x0a\x96\x72\x8b\xb9\x45\x18\x11\x39\xb3\x33\xa2\x74\x13\xef\x2b\xe1\x85\x53\x8e\x3b\xb4\x27\xcc\xb5\x1a\x89\xdc\x5f\xf0\x94\xd1\x2d\xb0\xc9\x8b\x43\x00\x83\x98\x72\x03\x28\x58\xcb\xed\x12\x61\xbf\xda\xe9\xfc\x3a\xcf\x75\xbd\xfb\xfb\xc1\x2f\xe9\x7b\x04\xc3\xc6\x59\xf1\x75\x9f\x2e\xd9\xb8\x93\xf6\x17\x99\xac\x33\x40\x00\x83\xd8\x72\x03\x28\x58\xcc\xcd\x74\xfc\xfb\xfb\xe0\xb1\x3b\x92\x2f\xef\x9e\x50\xcc\xbd\x4f\x19\x8b\x2f\x59\x71\xaa\xed\xf0\x2e\x93\x16\xbb\xe0\xb7\x8e\x80\x41\x42\x08\x60\x10\x63\x6e\x00\x05\xab\xb9\x6d\x6e\xf6\x26\x29\xdc\x4f\xde\x6e\x15\x0a\x5f\xe8\x71\x0c\xf5\x79\xae\x5f\xfd\x31\xb8\x63\xfd\xf4\x93\x17\x9c\x42\x9f\x33\xd8\xb0\x4b\x00\xc4\x9a\x1b\x40\xc1\x72\x6e\xed\x21\x56\x7c\x14\xa3\xda\xdf\x6a\x77\x7d\x4d\x16\x2c\x96\xa5\xe5\xf9\xd7\x0f\x5a\x32\x49\x9f\x29\x66\xfa\x4e\x67\x48\xad\x63\xff\x65\x88\x39\x37\x80\x82\xf5\xdc\x7c\x13\xc7\x08\xb3\x25\x7d\x5a\x12\x7e\x9d\x4d\xfd\x30\x22\x25\xf5\x96\x3d\xd9\x35\x7d\x6a\x65\xbb\xd4\xfe\xac\x7b\x3b\xa5\x24\x76\xad\x8f\xd8\x73\x03\x28\x58\xd0\x6d\xe5\x8f\x3e\xc7\xee\xf9\xe7\xa1\x09\x34\x75\xef\x33\xee\xa6\xa6\xf2\x07\xa0\xcc\x1f\xf3\xbd\xf5\xd0\x56\xb0\xfb\x51\xbf\x5f\xc9\x0d\x01\x0c\x62\xd0\x0d\xa0\x60\x45\xb7\xe0\x9b\xc5\xaf\xd3\x79\x68\x89\xae\x69\xd2\x66\x5e\xcd\xfe\xe6\xfd\xbb\x9e\x70\x8b\x09\xef\xbd\x76\x44\x8a\x38\xf1\x87\x46\x13\x0b\x08\x60\x10\x8b\x6e\x00\x05\x4b\xba\xe5\x38\x7c\xd1\x33\x93\x64\xc8\xf1\xb9\xc1\xa7\x45\x7f\x98\x90\xd0\x89\x72\x7f\xb7\x40\x7d\x55\x67\x2e\x8d\x90\x43\xbe\x54\x8c\x0a\x02\x18\xc4\xa4\x1b\x40\xc1\x9a\x6e\x51\x7d\xec\x6c\x44\x4f\x9a\x4c\x1d\xa1\x09\x81\x7b\xf4\x16\xcb\x5f\x31\xa5\x83\x4a\x45\xed\x59\x61\x3f\x1d\xc6\x32\x03\x0e\xb0\x57\x20\xc4\xa6\x1b\x40\xc1\xa2\x6e\x51\x67\xef\xe6\x95\x7a\x47\x28\x4f\x11\x87\x09\x7e\xe9\x39\x6d\x10\x46\x40\x99\xc0\xc8\x9d\x3f\xfd\x6a\x6b\xcc\x7c\x41\xf7\x34\xf6\x6c\x8a\x18\x75\x03\x28\x58\xd5\x6d\x21\x81\xd1\xe8\x1b\xc7\x16\x97\x23\x0b\x69\xc2\x61\x6a\xd0\x7e\xec\xe4\x59\x1e\x37\xe6\x00\x16\xcd\x41\x27\xcb\x5e\xfa\x5e\x3d\x08\x60\x10\xab\x6e\x00\x05\xcb\xba\xbd\x14\xbb\x7b\xcb\xc5\x88\x84\x4b\xe3\x93\x40\x79\x41\xcb\x25\x1a\x33\x93\x54\x53\x25\xf3\x65\x7e\x8f\x59\xcc\x48\x90\x70\x14\x76\xa5\x83\x98\x75\x03\x28\x58\xd7\x6d\x73\xcb\xd1\xb6\xa2\xd0\xef\x43\xe1\x81\x6c\x69\x8e\x07\xf3\xad\xa0\x42\xf7\x6c\x3b\xf3\x82\xed\x48\xb3\x0b\x3a\x21\xfe\x09\xea\x10\xc0\x20\x76\xdd\x00\x0a\x16\x76\x93\xab\x31\x74\x90\x13\x56\x68\x71\xf5\xe6\x16\xa8\x78\xef\xea\x4f\x9d\xd8\xdd\xff\xf3\x8e\x05\x2d\x8b\x98\xf8\x83\xc4\x40\x47\xec\xd4\x40\x0c\xbb\x01\x14\xac\xec\x96\xad\x98\xd2\x34\x65\xc0\x15\x57\xb1\x66\x9d\x35\xa3\xf0\x3a\x77\x5f\xc1\x08\x5f\x3a\xf7\xa1\xb1\x7e\x2e\xf7\x43\x8a\x8f\x79\x26\x10\xc0\x20\x96\xdd\x00\x0a\x96\x76\xc3\xd7\xaa\xbc\x78\x53\x80\x63\x6f\x8b\xd7\xa9\x11\xcd\x1e\xe1\x7d\xcf\xcf\xd4\x95\xad\xd1\x61\xe7\x5b\xd3\x2d\x93\xe8\x2a\x49\x0a\x08\x60\x10\xd3\x6e\x00\x05\x6b\xbb\x91\x2c\xe3\xff\xb1\xea\x57\xef\xb6\x3c\x88\x2f\x7c\x96\x46\xcf\x11\x34\xf2\x5b\x75\xf5\x85\x12\x17\x33\x3e\x31\x31\xad\x16\x1d\xf6\xaa\x8d\xd8\x76\x03\x28\x58\xdc\xed\xbe\x80\x56\x67\x86\x88\x2e\x63\xaa\xb3\x2b\xf7\xa1\x0e\x9d\xc8\x3e\x69\xe5\x97\xfd\x6e\x52\xd1\xa2\x89\xb4\x6e\x9b\x8c\x46\x6d\x08\x60\x10\xe3\x6e\x00\x05\xab\xbb\xa1\xd6\x38\x6c\x08\xf3\x39\x7d\x08\x57\xc3\xa2\x3f\x4f\x7d\x9b\x26\xff\xc5\x3b\x57\x25\xce\x1c\x23\xbc\x26\xc7\xb1\xb3\xad\x6c\x0a\x01\x0c\x62\xdd\x0d\xa0\x60\x79\x37\xef\xe3\x5f\x05\x17\x34\x27\x79\x92\xe6\xde\x39\xe7\x24\x8f\x7f\x08\x89\x99\xbe\x2d\x91\xea\xba\xcb\x68\x9b\xc8\xa9\x2c\xd8\x82\x9d\xb4\x88\x79\x37\x80\x82\xf5\xdd\xae\xb5\x1e\x67\x1f\xe3\x7c\x71\x4d\x7e\x0f\x7f\xa1\xf9\x6a\xe3\x9b\xb7\x18\xbc\x3d\x15\xed\xac\xe5\x77\xa5\x9d\xb7\x39\x0b\x6d\xf0\x21\x80\x41\xec\xbb\x01\x14\x2c\xf0\xa6\xd6\x4a\x62\xa2\xcb\x4a\x9f\x3d\x17\xd4\x90\x64\x33\x5a\x80\xfa\xfc\x6e\xef\x58\xf6\x4c\x38\x15\x77\xa0\xf5\x12\xc9\x57\x67\x5d\x08\x60\x10\x03\x6f\x00\x05\x2b\xbc\x59\x60\x52\xd6\xf4\xfb\x2f\x19\x3f\xcc\xbd\x74\xf1\xa1\xdc\x07\xe7\xfc\x9e\x54\xa5\x56\x51\xda\x99\x08\xde\xe7\x3f\x79\x02\xb6\xe8\x21\x80\x41\x2c\xbc\x01\x14\x2c\xf1\x76\x2d\x9c\xe3\x60\xc4\x91\x54\xff\xd6\x87\x1c\x09\x45\xe5\x2d\xa6\x12\x96\xb7\xda\x9b\x41\xc3\xa6\x2f\x46\xdf\x0c\x9a\xed\x78\xa1\x20\x80\x41\x4c\xbc\x01\x14\xac\xf1\xf6\xdc\x3d\xb0\xe6\xde\x29\xeb\xa7\xad\xc6\xdb\x55\x68\x09\xe1\x29\xd1\xc7\x1f\xd1\x05\x35\x1b\x78\xb4\x97\x1a\xba\x5e\x9a\x72\x61\x77\xbb\x88\x8d\x37\x80\x82\x45\xde\xee\xf5\x3f\x41\xaf\xb3\xfa\x8f\x69\x9c\xca\x69\xbf\xb8\x7a\x5a\x72\xcf\x7a\x9b\xab\x44\x23\x2b\x43\x4c\x78\x9e\xe6\x75\x35\x84\x7d\x35\x11\x23\x6f\x00\x05\xab\xbc\x29\x0e\xdd\x90\x73\x28\xe3\x6a\x1c\xff\xd1\x57\x4e\x9f\x75\xb1\xb2\x43\xf1\xd0\x2e\x99\xd4\x70\xc8\x5a\x2d\xf6\x19\x3e\xde\x4b\xec\x29\x08\xb1\xf2\x06\x50\xb0\xcc\x5b\xfc\x6b\x7c\xfe\xf3\x81\xf3\xf2\x3b\x56\x0a\x46\xcd\x56\x97\x9d\x3f\xae\x9d\x7c\x4c\x47\xad\x17\x92\x72\x27\xef\xfc\xa7\x09\x62\x0c\x04\x30\x88\x99\x37\x80\x82\x75\xde\xd2\x9b\xb2\xc3\x86\x1f\x0d\xf9\x6f\x1b\x90\xd4\x3b\xe7\x26\x93\xe4\xf9\x72\x71\x45\xda\xcb\xf9\x47\x4e\xa9\x5d\xce\x79\xfa\x9a\x05\x02\x18\xa4\xce\xdb\x3f\x0b\xba\xa3\xbe\x8c\xeb\xef\x05\x1d\x2c\xf4\x16\x2f\x58\xc2\xeb\x24\xc3\xeb\xb2\xa4\x55\x7a\xb3\x6a\xcd\xdf\xf7\x8c\xd4\xf0\xf6\xd2\x05\xb4\xd0\x3d\x16\xae\x50\x77\xf9\x11\x55\x08\x60\x10\x43\x6f\x00\x05\x2b\xbd\xbd\xf8\x39\x74\x25\x94\x6c\xf3\x56\x9e\x77\x5b\x3b\x1f\xb1\x01\x2d\xff\x22\x0f\xdd\xd4\xa0\x8b\xef\xcc\x6f\x37\xdf\xf1\xf8\x2c\x45\x08\x60\x10\x4b\x6f\x00\x05\x4b\xbd\xbd\x48\x08\xef\x5f\x78\x18\x95\xd9\xf1\xcd\xfd\x56\x75\x5a\x8f\xfe\x47\xbb\x35\x61\x82\x20\x56\x71\xba\x33\x09\x0f\x28\xee\xd5\x63\xcf\xf3\x88\xa9\x37\x80\x82\xb5\xde\x46\x37\x26\xaf\xa9\x12\x5c\x1b\x19\xb8\x30\x3f\x66\x2c\x3d\xdd\x1c\x42\x75\xd7\xfe\xe7\xec\x9a\xb5\xe9\x8d\x5a\xfd\xdb\x61\x4b\xb2\x10\xc0\x20\xb6\xde\x00\x0a\x16\x7b\x8b\x5a\x67\xfb\xd5\x17\x28\xa3\x31\x79\xf1\x7b\x3d\xed\xa9\x9d\xfb\x81\x85\x2e\xc1\x28\xca\x02\xa9\x99\x1b\x24\x63\x69\xd1\x52\x97\x21\x80\x41\x8c\xbd\x01\x14\xac\xf6\xf6\x25\xe3\x99\xd7\x6a\xe8\xd4\x37\x99\x9c\xdd\x7c\x11\x4e\xa2\xe3\x13\x4f\xeb\x9c\xdd\xe3\x37\xbf\x90\xea\xb5\x1e\x0b\x46\xa7\x61\x37\xee\x88\xb5\x37\x80\x82\xe5\xde\x9e\x85\x1b\xc7\x7e\x39\xfd\x29\xee\xf8\x83\x91\x91\x0e\x86\xb6\x1f\x2f\xe3\x83\xdc\xbd\xd5\x2e\xda\x6d\xac\x8c\x1d\xcf\x70\x3c\xce\x0f\x01\x0c\x62\xee\x0d\xa0\x60\xbd\xb7\xb4\xa2\x65\x9a\xa4\x13\x8d\x1f\x51\xa2\xbb\x32\x46\x04\xef\xf5\xb3\x82\x29\x56\xd6\xd8\xfb\xab\xb7\x1e\x28\x66\xde\xc9\x5c\x71\x83\x00\x06\xb1\xf7\x06\x50\xb0\xe0\x5b\xc7\x3d\xd5\xd0\x47\x65\xd7\x5e\x5e\x6e\x4a\xa6\xcb\x7f\x61\xb2\xda\x9c\xe0\xc3\xfe\x8b\x60\xcd\x30\x83\xd2\xfd\x50\xad\xba\xc5\x08\x02\x18\xc4\xe0\x1b\x40\xc1\x8a\x6f\x5f\x3a\x8d\x2c\xcd\xbb\xd9\x0e\x96\x29\x62\xcb\xe3\xa9\xad\xf3\x2e\xd1\x9e\xed\x9d\xe7\x6a\x05\x4b\x68\x2d\x0f\x06\x32\x61\x3a\x08\x60\x10\x8b\x6f\x00\x05\x4b\xbe\x3d\x1c\xaa\x5b\xf8\xff\x31\xf7\xdf\xf1\x58\xf6\xff\x1f\x3f\xee\xb4\x92\xd3\x26\x1c\x24\x7b\x64\x26\x64\x64\x65\x44\xf6\x96\x5d\x29\x5b\xd9\x94\x79\xda\x7b\x45\x21\x65\x94\x11\x42\x76\x56\x34\xec\x99\xbd\x22\x5b\x64\xaf\x42\x7e\xb7\xde\xef\xf7\xe9\xeb\x3a\x74\x76\x5c\xdf\xdf\xb7\x3f\x3e\xb7\xdb\xf5\xe7\xfd\x7a\x9e\xbd\x8e\x1e\x1d\xaf\xd7\xf1\x70\x9c\x77\x19\x46\x53\xe2\x62\x5c\x73\xa5\x1b\x55\x9f\xc5\x2b\xbe\x1a\xee\x39\x64\x85\x9b\xb8\x17\xb4\x36\x06\x50\x51\x30\x22\x00\x5c\x94\xca\x37\x00\x06\x72\xbe\xa1\x65\xee\xbd\xa9\x9f\xc6\xe6\xcb\x9c\x7f\x3a\xf5\x1c\x6f\xe1\x15\xd7\x0c\xc6\xcf\x71\x0d\xad\xb6\x2c\x2d\x41\x85\xec\xc1\x9b\x1a\x08\x00\x17\xa5\xf3\x0d\x80\x81\xa4\x6f\x5f\x1e\x6f\xa7\x98\xc1\xd2\x10\x91\x70\xad\xa9\x06\xb2\x3d\xd5\x1f\xa3\x92\xbd\xef\xe3\xb6\x5a\xc8\x4e\x27\x34\x55\x51\x1d\x72\x20\x00\x5c\x94\xd2\x37\x00\x06\xb2\xbe\xe1\x57\x71\x7f\xd9\x7f\xb0\xdf\x83\x06\xab\x96\x7d\x6b\x68\x5f\xe4\x17\xa6\x6c\x4e\x90\x04\x4f\x9b\xcd\xe9\x4d\xd8\x40\x7c\xfa\x75\xa2\x46\x69\x7d\x03\x60\x20\xed\x5b\xdd\x75\xb1\x44\xd9\x8d\xcc\x60\x66\x35\x16\x7a\xfc\xf0\xf7\x9a\xf1\xa6\xe3\xca\xd1\xd5\x09\xdf\xc9\xb7\x79\x67\xd2\x0a\x2b\x4d\x11\x00\x2e\x4a\xed\x1b\x00\x03\x79\xdf\x5e\xb3\x36\xb1\x8c\xdc\x3a\xad\x8e\xf0\xfd\xf2\xa1\xa7\xf9\xb9\x60\x63\x84\x23\xe9\xec\x75\x19\x6e\x47\xfd\x6b\x23\x1e\x1d\x9c\x6a\x08\x00\x17\xa5\xf7\x0d\x80\x81\xc4\x6f\xb3\x37\xbf\x39\x63\x91\xd3\x07\xf5\xdd\x7a\x92\x74\xfa\x06\xc5\xfb\x0d\x62\x58\xc8\x88\xbf\xe6\xee\x0a\xa5\xd7\x52\x78\xcf\x26\x3f\x02\xc0\x45\x29\x7e\x03\x60\x20\xf3\xdb\x41\xdc\xce\x9e\x96\x87\x8a\xf5\x8b\xf0\xf6\x56\x01\xba\x2b\x55\x7b\xdb\xf3\x42\x1d\x1e\x51\xbb\x3b\x86\xeb\xaf\x03\xda\x54\x6d\x10\x00\x2e\x4a\xf3\x1b\x00\x03\xa9\xdf\x64\xbd\x9a\x10\x6d\x17\xe8\x1a\xed\x03\x9f\x50\x18\xdc\xe5\x9a\x6c\x65\x8b\x27\xc0\xef\x8e\x54\xbe\x3e\xb5\xeb\x5d\x65\xd8\x41\x8c\x00\x70\x51\xaa\xdf\x00\x18\xc8\xfd\xe6\xbb\x25\xc1\x15\x92\x45\x85\xce\x9d\xfa\xa0\x28\xf4\x46\x6c\x12\xda\xfe\x0f\x41\x4f\xc7\xce\xef\xbe\xa9\x71\x5e\x2c\x5a\xe7\x7f\x6d\x67\x28\xdd\x6f\x00\x0c\x24\x7f\x0b\x4c\x09\x40\xe3\x31\xb8\x4f\xfd\x61\x53\x4c\x3d\x3f\x15\x97\xbf\xe4\x46\xbd\x50\xc2\x94\x95\x91\xda\xfe\xfd\x9b\xb7\x8a\xe1\x9c\x08\x00\x17\xa5\xfc\x0d\x80\x81\xec\x6f\x89\x37\x67\x69\xe8\x02\x02\x06\x4b\xee\x1a\x86\x91\xd6\x7a\x10\xf9\x69\xe0\x97\x4c\x63\xd6\xab\xd2\x8f\x48\xf8\xce\xd5\x8e\xfe\x3a\x36\xa1\xb4\xbf\x01\x30\x90\xfe\xad\x36\x9b\xda\x69\xa5\xcb\x6a\x52\x89\x78\x80\xe7\xc6\xdb\x12\xc9\x87\xd4\xaf\x30\x4c\x6a\xb7\x9f\x8b\x9a\x18\xb4\x2e\xb5\xb0\xfe\x7a\xa4\x41\xa9\x7f\x03\x60\x20\xff\x5b\xd3\x79\xea\x67\xdd\x11\x49\xbe\xfe\x82\x17\x19\xbe\x46\x9f\x8d\x2c\x70\xac\xab\xb4\xa6\xe3\x4c\x68\x52\x8c\xff\x21\x1b\xf8\xf9\x12\x02\xc0\x45\xe9\x7f\x03\x60\x20\x01\x5c\x73\x83\x4f\xc3\xc6\x27\x62\x34\x25\x8c\xf0\xb2\x94\xf3\x5d\x39\x9d\xef\xba\x14\xe3\x37\x4d\xb6\x3d\x5c\xc6\xb2\x14\x49\xcf\xfd\x3a\x9e\xa3\x14\xc0\x01\x30\x90\x01\xae\x40\x6d\x74\x95\x96\xce\x4b\x6b\x66\xe4\xb1\x7e\x55\xdf\x1d\xba\xcd\x4e\x98\x88\x99\x01\x1a\x6c\xb3\x7a\xcb\x2f\xc7\x03\x4d\x11\x01\xe0\xa2\x34\xc0\x01\x30\x90\x02\x4e\xe7\xae\xdb\x17\x6a\xde\x4d\xd1\xca\xc2\x39\x13\xab\x4a\x1f\x55\xbd\xb3\xcf\x08\xaa\x02\x9e\xa0\xa9\xda\xc9\x04\x3c\xa5\xf5\xfe\xf5\x6f\x13\xa5\x02\x0e\x80\x81\x1c\x70\xbc\x67\xbd\x36\x94\xd9\xd8\x4b\xae\x74\xab\x62\xf5\xe8\x13\xac\x84\x46\x09\x3d\xf4\x84\xe1\x53\x86\xca\xbd\x5e\x65\x57\x7e\xad\x8f\x00\x70\x51\x3a\xe0\x00\x18\x48\x02\x57\xa4\x4b\xa5\x64\x21\xaa\x12\xfd\xde\xc3\xba\xf4\xf9\xcd\x35\xb2\x40\x2d\x61\xaa\x1e\x57\x25\x93\xec\xda\x25\x4c\xbc\x7e\x0f\x34\x04\x80\x8b\x52\x02\x07\xc0\x40\x16\xb8\xf7\x7c\x77\xd5\x27\x3a\x1f\x49\xc5\xc5\xd3\x1b\x4d\x56\xc2\x2f\xaf\xe8\x6e\xc1\x3d\x09\xd4\xea\xd2\x86\x59\x13\x8a\xfc\xba\x08\x10\x00\x2e\x4a\x0b\x1c\x00\x03\x69\xe0\x52\x13\x3a\x97\x9c\x85\x8b\x62\xda\xed\xde\x08\x04\x38\xb6\xb1\x6a\xf2\x87\xc5\xb3\xd8\xca\xff\x34\x3c\xfd\xac\x74\x29\x97\xed\xd7\x73\x38\x4a\x0d\x1c\x00\x03\x79\xe0\x24\x5e\xd6\xc3\x12\x2d\xac\x30\xae\x33\x1b\x19\x96\xd3\xb3\x29\xc9\xd0\xb4\x2b\x47\x9f\x66\x70\x62\x4c\xca\xa4\x7f\xe6\xde\x42\x82\x00\x70\x51\x79\xe0\x90\x07\x3a\xa8\x5f\x99\x7a\xfc\x40\x07\x12\xc1\x51\xcd\xde\xb9\x28\xf1\x44\xea\xbe\x2e\x2b\xdd\xc3\xfe\x60\x6a\xdf\x19\x27\xe1\x62\x73\xde\x9b\xd7\x7d\x08\x3f\x71\x5f\xd2\xba\x70\x0a\x01\xe0\xa2\x14\xc1\x01\x30\x90\x09\x8e\xe9\x43\xe5\xe9\x5b\x67\x24\x4a\x59\x4e\x6d\x8d\x71\xe6\xc6\x2f\x7f\xdf\xd0\x34\x59\x44\x67\x9c\x72\xd1\x18\x51\xf7\x3a\x94\x90\x46\x00\xb8\x28\x4d\x70\x00\x0c\xa4\x82\x1b\x79\xfd\xf3\xce\x83\xc0\x99\xa8\xe9\xeb\xf1\xf7\x7e\x52\x65\xef\xb3\x73\x9f\x96\x8a\xc1\xac\x50\x73\xa7\x94\xd9\x60\x4a\x77\xfd\x75\x5d\x50\xaa\xe0\x00\x18\xc8\x05\xf7\xfe\xb9\xac\xfc\xf7\xcd\xbb\xa7\xbe\xf8\xf9\xe8\x1c\xcc\xd6\x93\x5b\x94\x09\xde\xab\x30\x4f\x7c\xf9\x9e\x42\x37\xcb\x1f\xf3\xfc\xaf\x5b\x33\x4a\x17\x1c\x00\x03\xc9\xe0\xc2\xfb\x37\xc3\x99\x5e\x17\x0d\xf9\xd9\xd8\x78\xcd\x8c\x3f\x88\x09\xc6\x11\xe0\x19\x1e\xf8\x11\xb0\xaa\x74\xfa\xbc\x81\xdb\xa6\x09\x02\xc0\x45\x29\x83\x03\x60\x20\x1b\x1c\x2b\x76\x6a\xc1\x8e\x8a\x38\x03\xa1\x5c\x7a\x2c\x5b\x49\xe8\x6d\x79\x5c\x59\x99\x31\x4f\xe6\x67\xc2\x9f\xae\x8b\xda\xc8\xa6\xe1\x21\x00\x5c\x94\x36\x38\x00\x06\xd2\xc1\x69\x27\xc6\xaa\xaf\xc4\x72\x6c\x7e\xb9\x75\x8e\xe7\x67\xa8\xb6\xdd\x4a\xdc\xa5\x27\xc5\x2e\x41\x5e\xa4\x1f\xcb\x14\x6f\xe8\x48\xd0\x23\x00\x5c\x94\x3a\x38\x00\x06\xf2\xc1\xb5\xdf\xdb\x6e\xb6\x71\x60\xe8\x38\xdf\x3b\x65\xf6\xc5\xbd\xbb\xe4\x72\x2c\x87\xe2\xeb\x9f\x36\xc5\x18\x75\x51\xca\xe3\xa6\x22\xbf\xee\xa6\x28\x7d\x70\x00\x0c\x24\x84\xdb\xb3\xb1\xf4\xf1\xd9\x8b\xec\xbb\x35\x46\x74\x50\x81\xa7\x40\xcd\x2f\x23\x3b\xf3\x2e\x32\x99\xc1\x34\x1a\x9e\x4f\x6b\x14\x79\x16\x01\xe0\xa2\x14\xc2\x01\x30\x90\x11\xae\xd8\x81\x5e\x7d\x3c\x60\x79\x80\x7d\xc7\x56\x07\x13\xe3\xde\x99\xe5\xdb\xfe\x1e\x31\x4d\x7d\xdf\x45\x2d\xd3\x86\x89\xd5\x7a\xb5\x10\x00\x2e\x4a\x23\x1c\x00\x03\x29\xe1\xd8\x44\x88\x28\xee\x6a\xf7\xa0\xe5\x0c\x65\xca\xe1\x4b\x76\x9e\x17\x90\x19\xd1\xcf\x8c\x19\x51\x1a\x4f\x68\x31\x7d\x14\xad\xfa\xeb\x9a\xa1\x54\xc2\x01\x30\x90\x13\xee\x4b\xa1\x92\x90\x81\x7a\xb5\x37\x4b\xee\xd9\x51\x67\x8b\x94\xfb\xf6\x97\x5e\xde\x30\x71\x3b\xa5\xa0\xce\x7f\xb3\xf8\x2d\x2d\xde\x6d\x04\x80\x8b\xd2\x09\x07\xc0\x40\x52\xb8\xd4\x16\xf2\x7c\x95\x46\x51\xf5\x00\xf8\xf7\x4f\x3c\x87\x0f\x4d\x9e\xb1\x86\x6e\x8a\xe7\x78\x88\x37\x5f\xb8\xe0\xee\xe9\xc6\xf6\xeb\x9a\xa1\x94\xc2\x01\x30\x90\x15\x2e\x28\x5b\x3c\x96\xff\x46\x84\x56\x82\x5d\xfd\x8c\xbc\xc8\x20\x33\xd9\xf4\x72\x69\x7f\x4a\x9b\x75\xab\xdf\x39\x96\xf5\x39\xfd\x5f\xa1\x45\x69\x85\x03\x60\x20\x2d\x9c\x57\xed\xa7\x14\x3c\xba\x0c\xdb\xc8\xcb\x67\x2e\xba\x08\x56\x2b\x0b\x17\x3f\x8e\x70\x4a\xf6\x52\xb6\xa9\xc8\x20\xba\x9c\x24\x2e\x8c\x00\x70\x51\x6a\xe1\x00\x18\xc8\x0b\x27\xf8\x45\xc5\xb2\xac\xf5\x6a\xc7\x3e\x85\xda\x27\xa6\xca\xec\x12\x6e\x3d\x1b\xf9\xa5\x0b\x0b\xbb\x6f\x53\x92\x38\xa6\x4c\x37\x61\x08\x00\x17\xa5\x17\x0e\x80\x81\xc4\x70\xd7\xad\x3e\x77\x8a\x0a\x7b\x76\x8a\xf7\x92\xc7\xab\x0b\xb3\x3e\x78\x2a\x37\x9b\x73\x93\x8b\xcf\x58\xe5\xed\x98\x33\x5d\x46\xfa\x5d\x04\x80\x8b\x52\x0c\x07\xc0\x40\x66\xb8\x39\x36\x91\x40\x96\x32\x0d\x5a\xde\xe2\xad\x4b\x97\x82\xf3\x2f\xfc\x48\x5d\x79\xf5\xd3\x3d\x67\x31\x38\x7f\x7b\x54\x55\xca\xf0\xd7\x49\x07\xa5\x19\x0e\x80\x81\xd4\x70\x3c\xda\x1d\x9e\xf3\xa4\x76\x72\xb5\x91\x13\x8d\x9c\x97\x6a\x47\x13\xb6\xa7\x6e\x3f\xb8\xf8\x16\x7e\x5f\xfd\xd5\x80\x9e\xa5\x3b\x35\x02\xc0\x45\xa9\x86\x03\x60\x20\x37\x5c\x60\x64\x30\x91\xab\x40\x38\x87\xf5\xf3\x38\x6c\xcb\x8d\xfe\xad\xcb\x30\x71\xb9\xc6\x8f\x25\x43\x9b\x51\x98\x09\x18\xba\x12\x76\x08\x00\x17\xa5\x1b\x0e\x80\x81\xe4\x70\x9d\x81\xf4\x6f\x52\x7d\x6b\xba\xac\xaa\xa4\xf4\x07\x30\x56\xde\x8c\xd8\x87\x51\x9f\x79\x60\xc9\xd6\x19\xd1\xac\xf6\x92\x56\x88\x0f\x01\xe0\xa2\x94\xc3\x01\x30\x90\x1d\xae\xdd\x76\x4d\x01\xe7\x3a\x8f\xbd\x3d\xf9\x5b\x9f\x33\xb7\xdd\x5b\x95\x7a\x1e\x52\x5c\x77\xd1\x8f\x6d\x88\xdc\x2e\x2f\x78\x2a\xa8\x8c\x00\x70\x51\xda\xe1\x00\x18\x58\x0f\x87\x67\x9b\xca\x7e\x51\xf1\x46\x57\x91\x4b\x72\xa8\x06\xcb\x6d\x2a\x87\xf1\xfa\x00\x74\x2e\x52\xbe\x62\x4d\x7b\xab\x0f\xc5\x0e\x08\x00\x17\xa5\x1e\x0e\x80\x81\xfc\x70\x39\x8e\x72\x12\xaf\x57\xb9\x35\xc8\x93\x22\x10\x6d\x1b\x16\x4a\xc5\x77\x4d\x5f\x39\xdd\x9b\x4c\x2f\x38\x55\xa6\x69\x5c\xb8\x7b\x0d\x01\xe0\xa2\xf4\xc3\x01\x30\x90\x20\x6e\xd3\x05\x6f\xc8\xac\xff\xa6\xfb\xe0\xbb\x08\x4f\x62\xfa\xd8\xda\x7d\x1c\x8e\x44\x7f\xe1\xb3\xcd\xab\xeb\x4d\x6b\xbe\x95\xe2\x56\x08\x00\x17\xa5\x20\x0e\x80\x81\x0c\x71\x17\xc3\x3f\x71\xe8\xb6\xdc\xd9\xe0\x7e\x2c\xf3\x26\xf1\x33\x3e\x11\x31\xdd\x70\x09\xc6\xe5\xeb\xa2\xe1\x8a\x1e\x68\x5b\x9c\x54\xbf\x0e\xc1\x28\x0d\x71\x00\x0c\xa4\x88\x53\x5a\x0c\xfd\xda\xc9\xb7\x26\x32\x6d\x24\xa5\x55\x3e\xdb\xae\xdb\x79\x8e\x46\xa8\xef\x76\x1e\x03\xa1\x07\x4f\xe0\x8d\x76\xbc\x5f\xb7\x6d\x94\x8a\x38\x00\x06\x72\xc4\x19\x31\x35\xeb\x74\x8b\xcd\x7b\xa3\xd9\xaf\xa1\x37\x54\x55\xce\x72\x05\x8f\x6b\xdb\x74\x08\x8f\xb6\x47\x89\xad\xe9\xb7\x73\xea\x21\x00\x5c\x94\x8e\x38\x00\x06\x92\xc4\x4d\xed\x45\xa6\x97\xb7\x50\x1a\x7f\x0b\x67\x7c\x8b\x3b\xdf\xdc\x16\x9b\x40\x5c\x3a\xf7\x6d\x8b\x77\x05\x23\x3a\xd9\x68\xbb\x44\x02\x01\xe0\xa2\x94\xc4\x01\x30\x90\x25\xae\x2e\x45\xb3\xad\x55\x7a\xf5\xda\x98\xda\x32\x85\xc2\x83\xf8\xf7\x33\x16\x9f\x86\xa8\xa6\x89\x9e\x3c\xb8\xe0\xf1\x84\x3b\x86\xf4\xd7\x51\x13\xa5\x25\x0e\x80\x81\x34\x71\x0d\xc4\x3c\x0d\xde\xb7\xc8\x66\xf0\x9e\x91\x9e\xab\xfb\x46\xaa\xbf\x96\x37\xe0\xee\x53\xcf\x44\x35\x47\xcf\xab\x90\xf8\x1e\x47\x1b\x01\xe0\xa2\xd4\xc4\x01\x30\x90\x27\xee\xbd\x77\x45\x51\xf6\x96\xfa\xc7\x15\x2d\x33\x06\x82\xfc\xce\x9a\x4f\xb6\x77\x3b\x93\x5c\xcc\x9b\xdf\x1b\x94\x2a\x3b\x7f\x9a\xff\xf5\xe4\x86\xca\x13\x87\x3c\xd0\x41\xfd\x62\xfb\xe3\x07\x3a\x90\x28\xee\xd1\x5b\x3d\xca\x76\x7b\xe6\x80\xf4\x2e\x42\x35\x17\xfd\xd8\x34\x6a\x2f\xf7\x8a\x42\x92\x0f\x89\x9a\xb9\x03\xc6\xea\x4a\x51\x86\x08\x00\x8e\x52\x14\x07\xc0\x40\xa6\xb8\xd6\xba\xe4\x22\xaa\x01\xd8\x35\x97\xfd\x1e\x1b\x98\x90\xf8\x04\x5d\xec\x18\x4d\x4a\xc8\xf2\xd5\x76\xcd\xbc\x57\xa9\xa4\x78\x46\x08\x00\x8e\xd2\x14\x07\xc0\x40\xaa\xb8\xf7\x87\xc6\x85\x89\xb6\x45\xd1\x3a\x8d\x1c\xd8\x43\x1c\x32\x78\x2b\x74\x3f\xcf\x10\x5d\x1b\xc7\x24\x9c\x62\x3e\xd0\x64\x20\x94\x40\x00\x70\x94\xaa\x38\x00\x06\x72\xc5\x5d\xd6\x7a\x98\x2f\xd0\x61\xeb\xaa\x38\xd5\x63\x98\x96\x79\x8d\xb3\xef\x45\x18\xda\xee\x88\xaf\x2e\x8f\x58\x15\x95\xe6\x72\x37\x1b\x02\x80\xa3\x74\xc5\x01\x30\x90\x2c\x0e\x63\x52\xc3\xbe\xc5\xed\xb3\xe0\x75\x46\x96\xc3\x0b\x7d\x87\xf7\xbf\x0e\xa2\x7f\xb8\x65\x82\x8f\xc3\x13\x82\x8e\xee\x5f\xfe\xea\x2a\x02\x80\xa3\x94\xc5\x01\x30\x90\x2d\xee\x42\xc4\x70\x99\xec\x62\xd3\x6a\x9c\xe4\x46\x5b\xa8\x3c\x6b\x3c\xeb\xc4\xfc\xda\xe8\x76\xaf\x07\x71\xde\x83\x52\x65\x0f\x5d\x2b\x04\x00\x47\x69\x8b\x03\x60\x20\x5d\x5c\x20\x8b\x97\x65\x89\x5e\xe5\x25\x3e\x7e\x61\x3e\x1c\x73\x04\x89\x24\x16\x93\x8c\x00\xd9\x6b\x47\x5d\xca\xec\xe7\xc2\xf5\xec\x77\x10\x00\x1c\xa5\x2e\x0e\x80\x81\x7c\x71\x1a\xf7\x37\x71\xc4\x0a\x77\x4b\x3e\x4a\x18\xb6\xbd\xb4\xd7\x2d\x4c\x2e\x0f\x7d\xc9\x7a\xa6\xc4\x82\x90\x34\xf4\xdb\x4d\xc9\x6f\x70\x04\x00\x47\xe9\x8b\x03\x60\x20\x61\x5c\xb0\x7a\xfa\x77\x96\x73\xef\x85\xf3\x27\xdf\x68\xd0\xad\xf8\x6a\x54\x11\x94\xd1\xf3\x7b\x14\x09\x9a\xfe\x20\xba\x40\xe7\xf6\x18\x1f\x01\xc0\x51\x0a\xe3\x00\x18\xc8\x18\xf7\xfc\x29\x9c\x70\xd2\xa3\x79\x6b\xff\xf3\x52\x7f\x3d\x93\x00\x2b\x7d\x63\x46\xc6\x6c\xb0\xb4\xd9\xc3\x4f\xfb\xfd\x9f\x27\xb4\xd5\x10\x00\x1c\xa5\x31\x0e\x80\x81\x94\x71\x12\x02\x6f\x42\x70\x38\x9f\xf8\x61\xa7\x1e\x6c\x61\xd2\x4d\x60\xb7\x78\x93\xbc\x8a\xf3\xc2\x49\x5c\x78\xf6\xa4\x9d\x9e\x80\x93\x13\x01\xc0\x51\x2a\xe3\x00\x18\xc8\x19\xd7\x4c\xe6\xf3\xac\x76\xbe\x17\x8b\x75\x5b\x36\x6d\xd8\x43\x32\xa3\xda\xe7\x8b\x64\xdc\x39\xde\x07\x21\xf8\x78\xa7\xea\xf1\xb5\x7e\xfd\x6d\xa2\x74\xc6\x01\x30\x90\x34\x8e\x94\xfb\x72\x9c\x12\x57\xec\x1c\x4e\xe6\x69\xce\x8e\xc6\x84\x26\x32\x53\x5c\x75\x12\x31\xcb\xdc\x2e\x2d\x32\x7c\xc3\x6f\x12\x26\x08\x00\x8e\x52\x1a\x07\xc0\x40\xd6\xb8\x0e\x52\x99\x26\xd3\x4f\xea\x26\xc3\x24\xe1\x2b\xfd\x6f\x73\x84\xa9\xcf\xd2\xc8\xfb\xc0\xe1\xcb\xae\x63\xd9\xae\xf9\x95\xd8\xbf\x42\x8b\xd2\x1a\x07\xc0\x40\xda\x38\x42\xc5\xab\x7b\x21\x29\x5f\xd1\x45\x14\x6f\xe8\x9f\xb9\xfc\x4a\x0c\x7b\x6b\xc0\xe8\x00\xbe\xf4\x08\xc1\xf4\xd0\xbf\x89\xf7\xe5\xaf\x7f\x4e\x28\xb5\x71\x00\x0c\xe4\x8d\xdb\x0a\x94\xa7\x69\x76\x86\x35\xac\xb2\xae\x2d\x8c\x95\x86\x88\x4c\x62\xc5\x28\x33\xc5\x3e\x5c\x5a\x89\xb7\xda\xb4\xbe\x33\xe2\x80\x00\xe0\x28\xbd\x71\x00\x0c\x24\x8e\xab\xec\xf6\x5e\x0a\x58\x9d\x3a\x65\x65\xe2\x95\xe7\xcd\x54\x65\x1b\x8a\xc0\xbb\x21\xbd\x7e\xb5\x8b\x67\xa1\x22\x6f\xcc\x69\xca\x06\x01\xc0\x51\x8a\xe3\x00\x18\xc8\x1c\x37\x90\xd0\xbe\xb7\x5d\x82\x18\x76\xd7\xa3\x5f\xf6\xdf\x49\x1e\xf7\x2f\x56\xa0\x3d\xc5\x29\xee\xa6\xf1\xb2\x9d\xa0\x8b\x38\xf4\x26\x02\x80\xa3\x34\xc7\x01\x30\x90\x3a\xee\xdb\x2c\x86\x26\xd9\x96\x77\xcd\x33\x97\xf8\x9e\xa5\xab\x54\x91\x25\xea\xa2\xa1\xf4\x2f\x83\x64\xb2\x83\x6c\x4c\xd5\xa2\x2a\x95\x11\x00\x1c\xa5\x3a\x0e\x80\x81\xdc\x71\x3b\x88\xaf\x6b\x2c\x0b\xb2\xfd\x9a\xc9\x93\x84\xb6\x37\x3e\x6b\xde\x9f\xef\x78\xc4\x3a\xc8\xff\x5a\x82\x9e\x26\xcc\xa7\x80\xfc\x0c\x02\x80\xa3\x74\xc7\x01\x30\x90\x3c\x8e\x5b\xf4\x71\x30\x2c\x6c\xe9\x79\xca\x2a\xa7\x4f\x00\x4d\x56\x60\x8d\xfb\xe3\xf0\xf7\x38\x66\x99\xc5\x36\x5c\x23\x34\x19\x86\xaa\x08\x00\x8e\x52\x1e\x07\xc0\x40\xf6\x38\x46\xd2\x9d\x45\x07\xdb\xf0\x4f\xb3\x15\x99\x14\x58\x82\x73\x53\xf9\x6d\xc3\x8c\xf7\x1f\xb7\x3b\x0b\x85\x7a\x0e\x65\x5f\x7d\xa2\x87\x00\xe0\x28\xed\x71\x00\x0c\xa4\x8f\x6b\xd4\x48\xbc\x92\x59\xbf\xdd\x22\x2c\xa1\x9e\xf0\x5c\xd0\x01\x27\x58\x3d\x14\x7b\xe7\x09\x49\x8d\xca\xb4\xf7\x22\x0d\xa9\xd5\x35\x04\x00\x47\xa9\x8f\x03\x60\x20\x7f\x9c\xab\xf3\xe4\xdc\xf3\xbe\xce\xc4\xc5\x24\x6c\x79\xd9\x6c\x7c\x9d\xcd\xd9\x5a\x53\xaa\x5c\x1f\x77\xb7\xda\x6f\x4d\x3f\x37\x8a\x7e\xed\x4e\x28\xfd\x71\x00\x0c\x24\x90\x13\x35\x8e\xcc\x43\xcf\x38\x2b\x9b\x2f\xb8\xfd\xe1\xc5\xad\x49\x22\xdb\x9b\x93\x96\xb8\x9f\xa8\x29\xeb\x63\xcb\x19\x33\xd2\x4c\x7f\x5d\x33\x94\x02\x39\x00\x06\x32\xc8\x39\x15\xdf\x59\x33\x94\xb9\x13\xbb\x30\xf1\xed\x90\x8a\x63\xaa\xdf\xc1\xcd\xaf\xeb\xc6\xdb\xfe\xb2\xb2\x8b\xf2\x93\x75\x8e\x7a\xa7\x10\x00\x1c\xa5\x41\x0e\x80\x81\x14\x72\xde\x39\x41\x4f\x48\xf3\x08\x0a\x1e\xab\xe5\x29\x72\x0d\xcf\xec\x23\x10\x93\x3c\x8a\x81\xe7\x1f\xc7\x35\x33\x3d\x29\xb4\x77\xe0\x45\x00\x70\x94\x0a\x39\x00\x06\x72\xc8\x79\x95\xfe\x50\xa2\x13\xd3\xa3\x61\x79\x45\x6a\x6c\xc9\x7c\x4a\x39\xec\x4d\xb2\x7d\x97\x8f\xad\x08\x51\xef\x65\x76\x19\x18\xc0\x85\x00\xe0\x28\x1d\x72\x00\x0c\x24\x91\x7b\x16\xa8\x9d\x4d\x68\x69\xa5\xb0\x71\xa7\x6c\x14\x33\x99\xb9\xc5\x04\x1e\x6b\xbc\x6f\x16\x86\x63\xce\xd5\x30\x17\x59\xa6\xad\x83\x00\xe0\x28\x25\x72\x00\x0c\x64\x91\x43\xa4\x6c\x10\x7b\x92\x9c\xbd\x91\x77\x83\x34\x9d\xaa\xd5\x35\x59\xac\xbc\x12\xbd\xf1\x6e\xc7\x74\xf5\x8b\xc6\x15\x8a\xf6\x1a\x6c\x04\x00\x47\x69\x91\x03\x60\x20\x8d\xdc\xa5\x45\x83\x14\x0d\x06\xc2\x3c\x8a\xa7\x2b\xef\xbe\x3b\x44\xb0\x5c\xbe\xed\xce\x9a\xc8\xaf\x24\xe0\xd9\xa5\x5e\x1e\x5a\xa7\x78\x0b\x01\xc0\x51\x6a\xe4\x00\x18\xc8\x23\x97\x95\x6e\x1d\x70\x0a\x2e\xfa\xad\x29\xd7\x73\xf4\xca\x83\x77\x9e\x63\x5f\xd4\xec\x72\x2f\xe0\x5f\x16\x08\x10\x32\x8c\xbb\x9a\x27\x80\x00\xe0\xa8\x3c\x72\xc8\x03\xdd\x68\x7d\x74\x0d\xf6\x94\xc8\x50\xa9\xa9\x14\x6f\xab\xb1\xbd\x34\x53\xf6\xd9\x84\xa4\x84\xaa\x49\xe3\xcd\x30\xce\xe4\x2b\xed\x9b\xc7\x0f\x74\x20\x91\x9c\xa2\x79\xf4\xfb\x82\x41\x34\x9f\xcf\xbb\x06\xf7\x89\xad\x39\xc7\xb6\xdd\x76\x0e\x4e\x39\xde\xb3\x71\xac\x5e\xcf\x69\x33\x78\x61\x81\x00\xe0\x28\x45\x72\x00\x0c\x64\x92\xfb\x10\x65\x58\x68\x15\x7e\xc6\xc8\x18\x57\x91\x5c\xa4\x3c\x33\xf4\xf2\xea\xae\x9b\xfe\x34\xc6\x65\x0a\x2e\xf3\xfb\x75\xe6\x8b\x44\x08\x00\x8e\xd2\x24\x07\xc0\x40\x2a\x39\xc7\x46\x87\xf3\x99\x94\xa3\x8f\x1b\xde\x31\x7f\x5e\x11\x9e\x99\xc1\x15\x96\x8f\x5d\x09\xe0\x4a\x9a\xff\x41\xd2\x32\x14\xdb\xfc\xeb\x06\x88\x52\x25\x07\xc0\x40\x2e\xb9\xcb\x5e\x1a\xf7\x86\x5e\x2e\xfb\xba\xfb\x3d\x9c\xc9\x7b\xce\x32\x25\x48\x8d\x7e\x15\x87\x81\xd7\xa1\xcf\x3d\x20\xf3\x87\xee\xbc\x16\x02\x80\xa3\x74\xc9\x01\x30\x90\x4c\xee\xfd\x8a\x9a\x03\x3e\x57\x50\x66\x81\x87\x22\x63\x1e\x43\x36\x26\x39\x62\x39\xe5\xba\x87\x7c\xd6\xdd\xcc\x70\xbb\x7b\xa3\x1a\xbf\xae\x19\x4a\x99\x1c\x00\x03\xd9\xe4\xd6\xf7\x2f\x6b\x8e\x19\xbb\x53\x24\x1d\x9e\x2d\x6d\x78\xa8\xa9\x33\xa2\x90\x95\xa3\xb9\xa5\xae\x2c\xc6\x11\x58\x2d\xaf\x34\xf7\xeb\x08\x80\xd2\x26\x07\xc0\x40\x3a\xb9\x42\x76\xc9\xc7\x81\xdc\xaa\x69\x2f\xd8\x3b\xb3\x39\x9f\x07\x46\x30\x7c\x65\xe0\x97\xdf\x7a\xeb\xbf\x92\x4f\xf4\x98\x12\xf7\xf1\xaf\x1d\x08\xa5\x4e\x0e\x80\x81\x7c\x72\xdf\x16\xf2\xbe\x47\x96\xd3\xfc\x90\x29\xa6\x8e\xe5\x6e\x75\xef\xb0\x99\xe3\x71\x70\xe0\xd5\x63\x3f\x54\xb2\x12\x5a\xec\xb5\xfd\x75\xd6\x47\xe9\x93\x03\x60\x20\xa1\x1c\xc7\x40\x41\x7f\x1b\xc5\xb9\x02\xa3\x40\xda\x69\xb4\x8f\x09\xce\x33\x7e\x18\x1c\x17\x7f\x7a\x33\x30\x0b\x32\x48\xce\x2a\xdc\x10\x47\x00\x70\x94\x42\x39\x00\x06\x32\xca\xad\x9d\x76\x8e\x6e\x33\xbd\xf5\x68\xa4\x58\x69\xd9\xbe\x32\xfa\xe7\xb9\x25\xbd\x12\x5e\x5e\xce\x42\x02\x91\x81\xe5\x40\xd6\x29\x6d\x04\x00\x47\x69\x94\x03\x60\x20\xa5\xdc\xb9\xa9\x72\x26\x6c\x9f\xa4\xb3\xdc\x2d\xcf\x37\x4b\xb6\x1f\x07\xbd\xd1\x94\x75\x2a\xfc\x5c\x98\x16\x4c\xa1\x7f\x3a\xb9\xc7\x9e\x01\x01\xc0\x51\x2a\xe5\x00\x18\xc8\x29\x47\x44\xf8\xf6\xab\x73\x2d\xe3\xc6\x30\xad\x83\x5c\xa5\x65\x4d\x5e\x8d\xc7\xf4\x3b\xd7\x41\x45\xd9\x6b\x57\x26\x1e\xbc\x91\xdb\xfd\x35\x0c\xa5\x53\x0e\x80\x81\xa4\x72\x55\xca\xd9\x7b\x2d\x17\x08\x6e\x63\xb9\x9b\xa3\xe9\x94\xf8\x16\x87\x5a\xb1\x3e\x91\x5d\xcd\xf5\x2a\x0a\xd2\x93\xd5\x37\x8c\xd0\x45\x00\x70\x94\x52\x39\x00\x06\xb2\xca\x45\xd6\x59\x2a\x4e\x17\x45\x65\x16\xd9\x4e\xdc\xb7\x58\xb9\xff\xa5\xf3\x81\x20\x97\x71\x69\xf5\x17\x6e\xf7\x6b\xa1\xa4\x0a\x5e\xbf\x86\xa1\xb4\xca\x01\x30\x90\x56\xee\xfc\x39\x31\x9c\xd4\xb9\xc3\xc0\x7c\xea\x75\xff\xdb\xa6\xe6\x57\xa4\x76\x48\xca\x83\x55\x64\x5f\x05\xe7\xd8\x3c\x25\xee\x3a\x2b\x8b\x00\xe0\x28\xb5\x72\x00\x0c\xe4\x95\xbb\xd5\xb8\xe1\xea\x91\x94\xa0\xf1\xad\xac\xba\x3d\xf7\x60\x9c\xce\xb9\xb9\x52\x52\x46\x3e\x03\x63\xd6\xe9\x86\xae\x7a\x86\x14\x3f\x02\x80\xa3\xf4\xca\x01\x30\x90\x58\xee\xd4\x66\xfd\x68\x92\x6a\x7d\xd4\x9c\x40\xe1\x3a\xe9\x88\x0a\xa2\x20\x4b\x91\xfc\x09\xfb\x59\x19\x6a\x56\x33\x2b\x09\xe2\x28\x1c\x04\x00\x47\x29\x96\x03\x60\x20\xb3\x9c\xa3\xda\x55\xda\x44\xb8\x94\xf4\x76\x2f\xe5\x12\xe6\x19\x71\xdc\x5c\x7b\x3c\xcd\xec\x09\x51\x5f\xec\xee\x41\x9c\xf7\xe9\x1e\xe8\x08\x00\x8e\xd2\x2c\x07\xc0\x40\x6a\x39\xf4\xfe\xd7\x89\x45\x4e\x3c\x3d\xae\xfb\x03\x3b\x54\xba\x41\x7c\x71\xb4\x59\xf9\x3a\x21\xda\x77\xac\xd8\xf2\xb8\xd6\xba\xfd\xf4\x11\x00\x1c\xa5\x5a\x0e\x80\x81\xdc\x72\x6f\xfc\x92\xe3\x94\x0d\xb0\xbc\x94\xb1\x12\x3f\x30\x9e\xbb\xf9\x45\x9b\xc0\x43\x08\x0b\xe7\xbd\x07\x45\xfa\x8a\x72\xdd\x82\x9d\x39\x02\x80\xa3\x74\xcb\x01\x30\x90\x5c\x8e\x00\xcf\x57\xe2\xd2\x4f\xcb\x1f\xd9\x2f\xa8\x76\x9b\xd9\xb6\xfc\xf0\x88\x8b\xa4\x0a\x09\x88\x2b\x7c\x7d\xc7\x13\xe2\xb6\x39\x54\x10\x00\x1c\xa5\x5c\x0e\x80\x81\xec\x72\xd2\x85\x86\x6b\x72\x56\x62\x06\x43\xb0\xf7\xf7\x14\x5a\xda\x9e\x5e\x13\x20\x57\x0c\xac\xc5\x48\x30\x15\xbc\x24\x20\xc6\xbf\xac\x81\x00\xe0\x28\xed\x72\x00\x0c\xa4\x97\xa3\xf8\x10\x56\x1c\xdd\x56\x63\xb9\x53\x6c\x8c\x93\xe5\x58\x2d\x68\xd8\x70\xe1\xd0\xa1\x05\x87\xa9\x9d\xba\x62\xa6\xe8\x5d\x06\x07\x02\x80\xa3\xd4\xcb\x01\x30\x90\x5f\x2e\xed\xfc\x8b\x9c\x18\x0a\xe9\x65\xeb\x9a\x4c\xbc\x43\xc7\x3d\x79\xb3\x9e\xd6\x4a\x0f\x3e\xfb\xcc\x8c\x1f\xfa\xad\x22\x3f\x7d\xc9\x11\x00\x1c\xa5\x5f\x0e\x80\x81\x04\x73\x82\x73\x8b\x7d\x2c\x9e\x7e\xed\x3b\x63\xcd\x73\x8c\xc5\x9d\x66\xae\x37\x17\x42\xf6\xf2\x5e\x39\xf4\x8d\x24\x61\x55\x0e\xa5\xdd\x45\x00\x70\x94\x82\x39\x00\x06\x32\xcc\x91\x5f\x2d\x18\xb9\x7b\x3d\x99\x68\x55\xc2\x2b\x40\x30\x5b\x95\x52\x36\xf7\xb9\x3c\x6c\x53\xa8\x90\x81\x62\x56\xeb\x0a\xa7\xe8\xaf\xd0\xa2\x34\xcc\x01\x30\x90\x62\x2e\xe2\x6a\xea\xad\x00\x0e\xa9\x73\xda\xcc\x5d\xf1\x1c\xd7\xb7\xd3\x27\x64\xd2\x6f\xdc\xcb\x2d\x90\xe4\x39\x90\x8d\x91\xf0\x8d\xfb\xb5\x09\xa3\x54\xcc\x01\x30\x90\x63\x6e\x89\xd1\xc4\xa3\x81\xce\x19\xe3\x12\x06\xdb\xf8\xe2\x00\x4b\x03\xc9\x5c\xfd\x5d\x56\x9e\xf1\x7c\xf8\x45\xff\x9b\x0c\x09\xec\xbf\xf6\x00\x94\x8e\x39\x00\x06\x92\xcc\x11\xb0\x56\x0a\x88\x65\x7c\xea\x26\x0c\xf0\x6d\xca\x96\x73\xac\xdf\x8f\xf1\x0f\xeb\xb5\x28\xd3\xb8\x75\x71\x8b\x69\x69\xd6\x49\x10\x01\xc0\x51\x4a\xe6\x00\x18\xc8\x32\x17\x43\xd6\xba\x9c\x3c\x61\xbc\x7a\x31\xfd\x49\x88\x9a\x83\xeb\xf8\xe4\xa3\xf1\x17\x8e\xfb\x54\x7d\xd3\x82\x29\xf0\xaf\x23\x95\xbf\x9e\x29\x51\x5a\xe6\x00\x18\x48\x33\x67\x48\x62\x2c\x36\xf7\x40\x47\xcf\x77\xf8\x4a\xa7\xd1\x77\xb7\x20\xad\x90\xaf\x56\x7e\xeb\x3d\x4c\x63\x56\x84\x0c\xe4\x5f\x1b\x34\x11\x00\x1c\xa5\x66\x0e\x80\x81\x3c\x73\x31\x9a\x3d\x4e\xd6\x4e\x96\x5d\x26\xde\x6d\x77\xe7\xea\x5a\xf2\xea\xbf\x9d\xf3\xbb\xa8\xd5\x22\x39\x75\x45\x4b\xe9\xf9\xa9\x04\x26\x04\x00\x47\xe5\x99\x7b\x43\xf4\xdf\x03\x1d\x39\x91\xcf\x70\x48\xb1\x94\x4c\xe4\x16\x59\xf6\xaa\x39\xfc\x9b\x6e\x9a\xc2\xd7\x9d\x03\xac\x9f\xae\x3f\x8c\x53\x7d\xf3\x77\x6e\x23\x12\x2e\x0c\xb2\x5f\x67\x45\xfb\x2f\xfd\x2e\xc1\xc4\xc6\xba\x99\x73\xcb\xe9\x65\x36\xba\x1d\xee\xd9\xd3\x77\x3f\xf9\x61\xb8\x6c\x1b\xb2\x63\x7c\x48\xf0\x27\xef\xdc\xf3\x39\x86\xf2\xe6\xc1\x52\x8d\x9f\x06\x89\x3c\xb7\xa4\x20\x79\x83\x3e\xaa\x35\x25\x71\xad\x49\x7b\xed\x42\xda\x63\x9b\x91\xf5\x59\x57\xc7\x84\x63\x28\x43\xd9\xdd\x15\x21\x62\xac\xc4\x17\x04\xf8\x85\x33\x94\x34\x2a\xc5\x3d\x9c\x64\x36\xa4\x8f\x3c\xf5\xa3\xc3\x73\xd5\x5b\x0e\x6f\x1c\x43\x3f\x8f\xaa\x58\x6c\x7e\x6e\x5a\xe0\xf1\x62\x47\x9f\xcc\xb3\x7a\xcd\x47\x3d\x16\x3a\x01\xb7\x8c\x4a\x35\x21\x08\x9a\x25\x54\xc8\x3c\x86\xaa\x23\x5e\xa6\x4a\x88\x29\x85\x18\x1f\xe8\xb4\x45\x38\x26\xc9\xc5\x1b\x14\x17\x3f\x1e\x20\x86\xdb\x3f\x95\xb9\x2c\x7c\x69\xe1\xec\x31\xf4\x9c\x8a\x6c\x0e\xff\x8b\xfe\xba\xfa\xf0\x66\x0b\xf6\x67\x8f\xb9\xe9\x2f\xe4\xbe\xd4\x09\x6a\xdb\x78\x6d\xf5\x63\x47\xfb\xfc\xb2\xea\x31\xb4\xa5\xe6\xe1\x70\xdc\x6b\xf2\xf5\xb9\x01\x3e\x3f\x25\xb7\x0c\xb9\x5b\x58\xaf\x86\x53\x2b\x86\x3f\xc5\xf4\x10\x37\xfa\x95\x74\xaf\x1c\x43\x1d\xed\x71\xbf\x7d\xab\x3a\xac\xb1\x08\xd0\x59\x9e\xf7\x31\x60\xaa\xb0\x2d\x37\xe3\xda\x79\xf8\x90\x8d\x52\x66\x20\x4c\xac\xd1\xfb\x18\xca\x5d\xbe\x40\xd7\x82\x5d\x22\x22\xe1\x48\x8d\xef\xaa\xfe\xf6\x4b\x4a\xb9\xfc\x73\xe6\x2d\xaa\x30\xed\xab\x7a\xa5\xc6\xe7\x93\xa5\x8e\xa1\x70\xa1\x33\x64\x51\xa2\x2d\x75\x0a\x0c\xd5\xf9\x96\x91\x74\x93\x3a\x04\xad\xce\xf7\x43\xae\xdc\xcc\x47\xf3\x28\x62\x8b\xa6\x3e\xfe\x07\x78\x4a\x77\x8e\xdb\x51\x4f\x32\xd1\xb9\x97\x9c\x6f\x51\xc9\x8b\x9f\x80\x6c\x49\xcb\x5b\xe3\x33\xad\x4d\x88\x93\xf5\xad\xe4\x74\xd1\x63\x28\x4e\x0d\x67\xf9\x08\xde\x13\xc9\x71\x9b\x49\x6c\xb9\x34\xa1\x80\x8d\x39\x3e\xc1\x01\x95\xe7\xc4\x76\xbc\xc3\x86\xba\x6e\xaf\x8f\xa3\x3b\x58\x91\x7d\x3f\x2d\xef\xb2\x2f\x12\xe6\x72\x16\xb9\x4b\x72\x75\x00\xef\xaf\xba\x5b\x48\x28\x9b\xa7\xf4\x56\x38\x4e\x3e\x84\x1d\x43\x65\x96\xbe\x56\x5d\x99\xcc\xdf\x7d\x7a\xee\x99\xc8\xfa\x5c\x58\xf7\xa9\x5d\xab\xa7\x3e\x8d\xf1\x15\x7d\xf7\xf8\x73\x1d\x3c\xa3\x68\x8f\xa1\x4a\xe7\x14\x46\x12\xa3\x4a\xa4\xce\xca\xca\xce\xf6\xd7\x5d\x2b\x4e\xda\x19\xda\xb0\xa1\xe1\x0a\x17\xab\xb8\x7d\xf9\xa2\xfa\xe0\xf9\xe3\x7f\xd6\x90\x77\x32\x2f\x63\xc2\xde\x2b\x44\x78\x37\xeb\xf7\xb7\xbd\x8f\xbe\x36\x59\x36\x52\x4e\x36\x55\xae\xb3\xa4\x82\xa9\x0f\x23\x3c\x86\x3a\xe0\xd1\x1d\x16\x47\x64\x77\xf1\x4d\x2e\x14\xbd\xe0\xbe\x9d\x4a\xb5\xa9\x1a\xbf\x59\xe8\x84\x4e\x12\x52\x34\x94\xaa\x07\x44\x1e\x43\xc3\x4b\xc2\xec\xce\x79\x5c\x39\xcd\xb0\x3e\x61\x54\x97\xc5\x19\xdb\xaf\x50\x39\x40\x4a\xf6\x41\xf2\xf6\xc2\xd5\x35\xcc\x07\x2d\x22\xc7\xd0\xc6\x98\x7b\x2d\x4c\x98\xf8\x6f\xd3\x36\x93\x48\x35\xfa\xda\x37\x46\x3c\x14\xb7\xdf\xac\xbe\x94\xf4\xb8\xa9\x18\xed\x5c\x1b\x47\x71\x0c\x65\x7d\x45\xae\xcd\xb8\x16\x6f\xf4\x92\xef\x92\x24\xeb\x07\xa6\x6b\x03\x80\x3c\x06\xe2\x63\x78\xd5\x78\xcc\x83\x8b\xbe\xf7\x37\xba\x8e\xa1\xcb\xe6\x9a\x67\x5e\xb6\x55\xdd\x14\x6b\x96\xee\xd7\xda\xde\xac\x30\xe2\xe0\xc9\x4a\xce\xd8\xad\x38\x95\xf1\x72\xe7\x4b\x23\x6b\xd2\xff\x7f\xe8\x38\x71\x82\xb7\x55\x64\x6e\x82\x50\xcf\xd9\x2f\xd2\x6f\x46\xdc\xf9\x2f\x6e\xc5\xe1\x1f\x22\xf2\x86\x1c\xd0\xaf\xec\x86\x33\x07\x1f\x43\x6d\x68\xd4\xf6\x93\x0a\x5d\xbc\xfd\xd6\xa8\x06\x85\x54\x12\x1f\xf6\x93\x33\xbd\xc2\x0c\x12\xe5\x88\xbb\x7e\xf5\x8a\xe9\xfb\x0c\xd3\x63\x28\x93\x16\xba\xed\x93\xc6\x48\xfd\x77\x41\xd7\x5b\x8d\xaf\x45\xa7\xf8\x49\x6d\xa7\x12\x6f\xd5\xf3\x78\xe5\xfa\x68\xa7\x52\x35\x8f\x1d\x43\xb9\x2e\xb0\x0a\x90\xae\xbb\x4b\x89\xac\x11\x13\x0c\x38\x48\xe0\x4e\x0a\x57\x88\x91\x5f\xc2\xf7\xa5\x13\x48\xd2\xe0\x5c\xce\x39\x7e\x05\x82\xab\x29\xac\xee\x50\x04\x33\x8c\x50\xd4\x9c\xfb\xde\xb9\x50\xdc\x6a\xde\xe3\x92\xb5\xf5\x82\x87\x35\x4d\xc9\xa7\xad\x1a\xbd\xfc\x18\x5a\x3e\xac\x54\xda\x77\x7e\x31\x4e\xbe\x4c\x72\x97\x61\xb0\xef\xb6\x75\x46\xca\x4e\xce\xdd\x86\xe6\x01\x87\x20\xc1\x30\xfe\x90\xe3\x53\xf1\xe8\x08\xdb\xf4\x08\xb2\x2f\x3f\x62\x69\xc9\xca\xbb\xf5\x96\xa0\x48\x21\x77\xc0\x02\xff\xa7\x79\x57\x5c\xad\x40\xb0\xa3\xd4\xa3\x63\x28\xa7\x9b\x41\x84\xeb\x6d\xc9\x21\xae\x66\x0f\x8a\x05\x79\xd5\x72\x72\xc4\xec\x6b\x31\xda\x16\xf4\x57\xb1\xfa\x4d\x54\x4a\x6b\xdc\xc7\xd0\xe4\x53\x13\x87\x39\xeb\x78\x82\xba\x42\x52\x89\x0d\xfd\xf6\x31\x4c\x86\x51\x21\xdd\xa5\x9d\x1a\xa6\xa5\x81\xe7\xce\xcf\x39\xb3\x1f\x43\x2f\xc4\x30\xd8\x2f\xdf\x26\x2b\xce\xd4\x27\x5d\xd4\x63\xcd\x2c\x88\xcc\x0e\x20\x45\xd8\x9f\x25\x39\x7c\xc6\xcd\x5a\xfd\xc1\x7e\xed\x18\x4a\xca\xde\xb6\xcb\x91\x69\x79\x65\x4c\x69\x76\xec\x85\x0b\x5b\x87\x60\x98\x41\x91\xbe\xe5\xf7\x7b\xe9\xa9\xaf\x5a\xd4\x75\xb1\xa6\x8e\xa1\x08\xb1\xd8\xf6\x7c\x46\x02\xb7\x66\xc7\x9b\x42\x74\x98\xc2\xdc\x57\x06\x3e\x5d\x79\xd0\x51\x28\xc9\x49\x41\x66\x76\xb0\xc6\x91\x7d\xfc\xba\xd6\x59\x24\xec\x0c\x37\x77\x67\xc3\x1e\x72\x09\xbc\xd0\x2f\xf4\xe1\xf7\xed\xe5\x60\x53\xe3\xe8\xbb\x92\x63\xf6\xd0\xdb\x1f\xfb\x78\x5c\xd2\xaf\x56\x67\x15\x7d\x3b\xeb\xa4\x1d\xcf\xeb\xad\xe0\x35\xe3\x7e\x13\xfb\xbb\x4f\x9d\xf1\x43\xcc\xd3\x3e\xea\xd2\x6c\xee\xc7\xaf\x2b\x73\x16\xf9\x4d\xee\x4a\xb8\x9c\x5b\x7b\xbc\x74\x0b\xfb\x66\x44\xb7\x42\xef\x7d\x5a\x11\x7e\x6e\x47\xb9\x98\xd1\x59\xe5\xde\xe3\x71\x51\x57\xf2\x15\x36\xc0\x7a\x94\xce\xb4\xf6\x39\x79\x33\x57\x80\xb9\xe4\xa9\xa2\x45\xa0\xdc\x00\xbd\x2f\xb9\xb9\x48\xdf\x45\x8d\xe8\xe3\x7b\x01\x2b\x3f\x8d\xa0\x98\x46\xdf\xcc\xa5\xa2\x45\xa7\x68\x1a\xae\x07\xdd\x53\x34\x2f\x88\xee\xc2\xa6\xea\x75\x1d\xa6\xc2\xca\x9e\x1d\x43\x03\xa5\x4d\xad\x1c\xb1\x29\x13\x23\x5f\xf9\x9e\x6d\x68\x52\x8f\x73\x35\x3b\x20\xdb\x29\x51\xba\x76\xe5\x23\xb9\x5d\x61\x62\xd3\xf3\x63\x28\x81\xd2\x47\x9b\x71\x4c\x39\x63\x91\xa7\x4d\xf9\x38\x97\x55\x09\xd5\x60\xb9\x97\x99\x59\x7b\x79\xc2\xc7\x3a\x31\xa7\x0d\x8a\x7b\x8f\xe7\xf5\xea\x95\x9a\x64\x17\x89\xc4\x70\xbc\x94\x6e\xfd\x0d\xca\xfc\xda\x96\x48\x2d\x02\x62\xba\xb1\xed\xf4\xb5\xea\x53\xf2\xd1\x87\xc7\x50\x9a\xd5\x83\xa6\x31\x75\xd8\xc7\xa7\x2e\xd7\x96\x77\x94\xe2\xa5\x0a\xbd\x76\x80\x7d\x3c\x12\xda\x18\x3c\xf2\x78\x03\xf2\xe5\xd9\x63\xa8\x29\xad\xd4\x0a\xff\x45\x9e\x8b\xdb\x92\xaf\x54\x76\x35\x5f\x72\x62\xf6\x87\x57\x71\x4a\x67\x04\xbe\x49\x1d\x4f\x70\x09\x8d\xde\x3c\x86\xde\x76\x94\x6c\x26\x31\xbf\x1c\x69\x97\x42\x44\x4e\xee\xfb\x48\xe6\x8d\xeb\x95\x12\xdb\xde\x5d\xe7\x03\x52\xd7\x69\x97\x71\x71\xe1\xe3\xc9\x92\x80\x97\x0c\x68\x5d\x0c\xf9\xa2\xed\xe4\xde\x3e\x80\xd7\xe6\xb4\xd7\x1f\x60\x44\x24\x37\xd6\xb0\x4b\xc5\x21\x31\x2c\xf9\xf5\x18\xda\x1a\x46\x4c\xea\xc8\x76\x59\xa5\x60\xc8\x5d\x45\x65\xe1\xac\x34\xc3\x6a\xe1\x6d\x9a\xb7\x8c\x46\xfb\x6c\x6e\xe9\xc4\xc2\xf1\x73\xc7\x50\x1e\x4f\x7b\x5f\x5d\xff\x1b\xe7\x05\xee\xc4\x5a\xf5\x9c\x8f\x9e\xfe\xc9\xb0\x5a\xe4\x69\xd3\x9a\x44\x72\x31\x9c\x4d\xd8\x9d\xf0\x62\x00\xfa\xbf\x3b\x0c\x84\x1e\x9b\x59\xa9\xe0\x80\xd3\xbe\xef\x76\xa0\x16\x6b\xa0\x82\xe3\x9d\xd7\x24\x61\x97\x4d\x26\x56\xec\x44\xd8\x75\x93\x63\x33\x1e\x16\xa0\x75\x0c\x2d\xa6\xa8\xe8\xf9\x11\x88\x7b\x53\x29\xf1\x8a\x51\x49\x64\xdd\xd2\xc7\x90\x31\x66\x09\x17\xf2\xf7\xb4\xd3\x99\x8f\xde\x35\x62\x8c\x49\x4a\xe2\xe1\xf9\x4a\x4a\x1e\xfb\x3f\x8c\xcf\x1c\xc4\x0a\x26\x5e\xb0\x6b\x6e\x58\x6e\x68\xbb\xbb\x39\xb7\x47\x8f\x9b\x9d\x65\xf9\x51\x4b\x23\xb8\x23\xa7\x6c\xde\xf6\xc5\x31\xb4\xeb\x89\x77\x42\xba\xf8\x42\xdf\xe7\x11\x85\x9a\x64\xbb\x3e\xb9\x24\xd3\xed\xda\xcc\x81\x8e\x0f\xb4\x45\x1f\xd7\x4b\x3b\x97\xa4\xfe\x5f\x4c\xdd\xc2\xfa\x77\x4b\xf3\xc7\x40\xc3\xf6\xbb\x22\xe1\x13\x18\x76\x45\x4b\x52\xf2\x1f\x7f\xf0\xb7\x8b\xc3\x56\x79\xd6\x9f\x18\x8a\x3c\xaf\xee\x11\x4b\xb7\x76\x9e\x5a\x1b\x31\x9f\xe7\xc1\xc7\x4d\xf3\xfd\x51\xf8\x86\xbf\xae\xe7\xff\xc5\x1f\xdc\x57\x16\x4d\x12\x0d\x0d\xed\x2a\x1a\xba\x0f\x1a\x1a\x9a\xaf\xa4\xe4\x7f\xff\x0b\x93\xf6\x51\x84\x81\x3e\x55\xee\xe5\xa1\x58\x39\xce\x27\x65\x33\x46\x6c\xfe\x3c\xe3\x2d\xe6\xa1\x02\xc3\x86\x6f\x73\x0d\x36\x6d\xb6\xb1\x18\xc9\xbc\x01\x6a\x7f\xe1\x53\x65\xd0\x04\x25\xc1\x1f\xfb\xb1\xf6\xd0\xb8\xd3\x7c\x43\x26\x3a\x77\xfd\x75\x70\x16\xce\x80\x03\xf7\xc1\x56\x47\xc1\xed\xc9\xca\xeb\x6b\xca\xa5\xfd\x9c\xb1\x7f\xe3\x63\x7d\x34\x4e\x7c\x6c\x22\xdf\x74\x5b\x3a\x49\x3f\x0f\x86\x84\x46\x42\x52\x27\x9e\xd4\xc7\x40\x9b\xc1\x54\xac\x94\x2b\x6d\x3d\xbb\x98\x09\x75\xbc\x94\x7f\x65\xb5\xc6\x27\x3e\xd6\xfa\xf9\x66\x27\xf3\xa4\xe3\xa7\xef\x12\xba\xe9\xd4\xf6\xab\x97\x0e\x54\x5c\x5b\x3c\xe6\x6e\xce\xf0\x74\x1a\x4c\x71\x44\x9c\xae\xfb\x2b\xab\xbd\x7f\xe2\x63\x55\x44\x15\x8a\xdd\x95\x76\x35\x5f\x6b\xce\xa9\x60\x24\xa7\xe6\xbd\xf2\xbd\x57\x46\x21\x91\x2d\xb8\x96\x85\x57\xdf\xd9\x87\x71\xfa\xff\xfb\xc7\x1a\xfc\xbb\xe8\xfa\x63\x62\xc1\xfc\xa4\xd0\xd1\x10\xc7\x3e\xf1\x81\xa8\xc8\xaa\x9e\x69\xe8\xdb\xf4\xfe\x7d\x4d\x83\x2f\x95\x03\x34\x8f\x2b\xd1\x42\x2e\x0d\x08\x5f\xaf\xa1\x3b\xe7\xb6\x3d\x28\xef\xa3\xfb\xef\x38\x3f\x29\x9f\x7f\xcc\xe5\x7f\xca\x5a\xf2\x79\xcc\x09\xe3\x2d\xf1\x2a\x93\xfe\x32\x6e\x27\x46\xa3\xcd\x0f\x01\xee\xa6\xe2\x91\x01\x7e\x44\x38\xed\x04\x1f\x72\x2e\x14\xe7\x27\x85\x86\x79\x7c\xee\x24\xb7\x77\x9c\xf3\xd2\xe7\x59\x41\x0d\xcf\x05\x2f\xac\x6a\x77\x3e\x2d\xfc\xee\xe5\x54\x4f\x97\xfb\x19\xb9\xd6\xc3\x39\x52\x08\xe4\x5c\x28\xce\x4f\x0a\x0d\xe7\xf8\xdc\xa7\xca\xeb\x0d\x09\x1f\x1b\x39\x71\xf0\x09\xfc\x32\xb3\x49\x4e\x93\xd6\x87\x95\x90\x11\xb0\x64\x3b\xd4\xa5\x45\xf3\xdb\x8f\xfa\x20\xe7\x42\x71\xe0\xeb\x3b\x06\x94\xed\xed\xa8\xb6\xc0\xdb\xad\x1d\x17\x54\x9e\x4e\x4e\xe8\x5a\x1f\x62\x60\x8c\x73\xb2\x7f\xb8\x67\x4d\x36\x53\x33\x89\xed\x23\xf3\xef\x38\x3f\x29\x34\x3a\x1f\x44\xc0\x15\x2d\x49\x29\x34\xf4\x13\x31\x30\xf8\x77\x77\x91\xdf\x05\xe0\xa3\x1a\xb1\x38\x0c\x37\xf5\xd5\xde\x9c\x7e\x6d\x4d\x4f\x0f\x4d\x96\x63\x6b\x3b\x51\x96\xc5\x95\xee\xb5\x1f\x21\xfa\x0d\x57\x2a\x90\x0b\x87\xe2\xc0\x01\x08\xc8\x20\xeb\x2b\x58\xe4\x39\x4f\x49\x59\x1c\xc0\x5c\x3f\x9f\x8c\x43\xab\xe2\xed\xee\xd1\x33\x8c\x2e\xf3\xa3\x3f\xb1\xbe\x9a\x10\x39\x17\x8a\x03\x07\x40\x4b\x4e\xcc\x58\xd4\xc7\x24\xfa\xd4\x48\x88\x77\x7e\xc7\xf9\xeb\x92\x71\xb0\x5a\x39\x6e\x5f\x6a\x8a\x05\x6d\x19\xb8\xd3\xdd\x47\xc8\xb9\x50\x1c\x38\x00\x8f\x31\x3b\x6d\x27\xc6\xb4\xb0\x6d\x3a\x9f\x1b\x10\xd1\x9d\x1a\x30\xae\x78\x11\xc2\x99\x30\x01\x17\x7b\x19\xf2\xa3\xdb\xee\x43\x15\x72\x2e\x14\x07\xbe\xbe\x6c\x51\x7c\x46\x6c\x53\x8b\x6f\x30\x44\xef\x6a\x65\x50\x37\xa8\x5f\x6d\xea\x6d\x5c\xb4\xa3\xda\xab\xc4\xc1\x0c\xfe\x41\x33\xdb\xea\x73\xf5\xdf\x71\xff\x0b\xc0\x7f\xf6\x8e\x3f\x44\x00\xea\x8e\xfe\xbb\x08\xd4\xb4\x5f\xaa\x5c\x1f\x3d\x3f\x98\x3d\xda\xeb\xbd\xcf\xc9\x56\xe3\x1d\x75\xf7\x5d\xe4\x0b\x0c\xd3\x8c\x19\xa3\x3b\x3d\xb8\xdc\x92\xc8\xa5\x43\x71\xe0\x08\x34\x37\xd3\xed\xb2\xd0\xf1\xf9\xa6\x4e\x60\x53\xc6\xaf\x28\x2e\x0a\x53\x93\xd4\x55\x6d\xb0\x72\xf7\x16\x7c\x2b\xb4\x68\x1e\xa7\x43\xce\x85\xe2\xc0\x11\x28\x7a\x77\x8b\x85\x9b\xa4\x64\x78\x29\x89\xc7\x37\x95\x63\xa6\x4a\xf8\xa9\x2a\xae\x57\xb9\xcd\xdd\x99\x4b\x46\x13\x6a\xbc\xd9\x91\xc8\xb9\x50\x1c\x38\x02\x3e\xd9\xe9\x5d\xb4\x92\x56\x55\xcb\xbe\xad\x3d\x53\x8b\xb7\x83\xa5\x69\x15\x6f\x09\xe4\x52\x79\x5e\x7e\x1c\x1c\x7d\x0a\x51\xb6\x8b\x9c\x0b\xc5\x81\xaf\xef\xcf\xa6\xab\x6f\xaf\x59\xf8\x8a\xa5\x29\xa3\x69\x95\x64\x7d\x66\xae\x13\x58\x5d\x13\xee\xdf\x63\x13\x61\x55\x7b\x4c\xd4\x2b\x2a\xed\x23\xf7\xef\xb8\xff\x45\xe0\xbf\x1b\xf9\x1f\x32\x00\xb5\xbd\xfe\x2e\x03\x7a\x4e\xbc\x2b\xd4\x2e\x89\x8a\xf8\x1e\xcb\x95\x43\xed\x97\x88\xbd\x18\xcd\xd3\x2b\xe8\x85\x49\x81\x48\xe3\xac\x7a\xcc\x1b\x67\x90\x6b\x87\xe2\xc0\x19\xb8\x69\x0d\xe3\x09\xb5\x8b\xb5\x47\xfb\x41\x6e\x5e\xdb\xa0\xa3\x55\xdf\x9f\x9c\x64\x84\x13\xb1\x1a\x9d\xf0\xdd\x43\x6b\x7f\xe7\x3e\x72\x2e\x14\x07\xce\xc0\x03\x46\xb7\x51\x96\x5a\x87\x4f\x5a\x1e\xbe\x37\x05\xc2\x30\x53\x9e\xd1\x28\xac\x3c\x22\xe7\x7e\xa1\xa1\x99\x55\xf6\x33\xe7\xd4\xed\xa3\x7d\x0b\x82\x03\x67\xa0\x89\xf9\x7a\x12\x06\xdb\xe7\xa2\x98\xe7\x7c\x40\x66\x95\x21\xde\x69\x85\xe2\x2b\x8f\x9e\xcc\x3e\x3b\x23\xe6\x2d\x0f\xab\x4c\xa4\x41\xce\x85\xe2\xc0\xd7\xd7\xe5\xc1\x5d\x95\x87\x3f\x2d\xd6\x84\xea\x5d\x45\x03\x2e\xdd\x53\x2d\xc3\xb5\xfc\xea\x22\xf7\x85\x85\xa7\xd2\x4e\xef\xd6\xeb\xd2\x7c\x64\x06\xa0\x38\x64\x06\xfe\x73\xaa\xfa\x43\x06\xa0\xce\x3a\xbf\xcb\x00\xe1\x83\x9f\x2d\xf0\x76\xe1\x11\xb5\x3a\x6d\x3f\xbe\x60\x0e\x49\x9b\xeb\xef\xb5\xea\xa7\x1a\xf7\xc4\xa4\x56\xdf\xe9\xa5\x6d\x4c\x23\xd7\x0e\xc5\x81\x33\x60\x53\x0f\xb3\x21\x57\x3a\xad\x6b\xce\xba\x67\xfe\x51\x4b\x9f\x97\xbf\x24\xf3\x66\xd2\xd8\x23\x75\x63\xfe\x27\x54\xaa\xdb\x56\xc5\xc8\xb9\x50\x1c\x38\x03\xbe\x37\xba\x03\xfa\x6c\x67\x75\xa3\x3c\x54\x0c\x49\xf7\x05\x9e\xfa\xb7\xbf\x2f\xf9\x10\x5d\xd7\xd4\xea\x49\xe2\x7d\x26\xc2\xd6\x1b\x39\x17\x8a\x03\x67\x40\x50\x3a\xe4\xb6\x67\x81\xec\xd7\x57\xe3\xf2\x7a\x3e\x2d\x3c\x8f\x26\x65\x48\x28\xd7\xae\xdd\x21\xba\x7f\xe6\x9b\x89\xad\xf5\xcb\x75\xe4\x5c\x28\x0e\x7c\x7d\x57\x7a\xbf\x19\x3c\xa6\x9e\x92\x10\xf5\x35\x6b\x97\xac\xb4\x3d\xa3\x2f\xc3\xfd\xfe\xad\x62\x78\xa5\xff\xad\x15\x89\x20\x3f\xcd\x1b\xc8\x0c\x40\x71\x47\xf7\x01\xe3\x3f\x67\x00\xea\xe0\xf9\xbb\x0c\xcc\xfe\xa0\xee\xcb\x38\x25\xa8\x1d\x93\x4b\x3c\x6c\xa7\x9d\x29\x1e\x1c\x20\x38\x8f\xfd\x2a\x30\x1f\x8d\x3a\x88\xbd\x82\x3c\x62\x0a\xb9\x76\x28\x0e\x9c\x01\xc1\x0d\xea\xe0\xf7\xc6\xe2\x5b\xaf\xdd\xbd\x61\x58\xc5\xe2\x0f\x3f\xec\x58\x13\xee\xd5\xbd\xbb\x28\x5e\xe6\x33\x25\x11\xfe\x4a\xf9\xe8\x9a\x42\x70\xe0\x0c\xdc\x91\x5f\x6f\x7a\x86\x33\xa4\x5c\xc7\x48\x75\xa3\x47\xac\xc3\x85\x3c\xd8\x2a\x23\x31\xf4\x5b\x02\xc3\xfa\x30\x15\xbb\x79\x43\x0e\x72\x2e\x14\x07\xce\x00\x16\xa7\x18\xfd\xa5\x30\x91\xd5\x37\xdc\x09\x68\x32\xab\x18\x59\x35\x7e\xd3\xd3\x33\xa3\x12\xfe\xdf\xaa\x44\xf2\x2f\x7d\x1d\xac\x46\xce\x85\xe2\xc0\xd7\x77\x93\xe0\xc1\x42\xf4\x33\x3b\xc5\x05\x5b\x17\x0f\xd2\xef\x9c\x85\x43\xa3\x40\xbd\x3d\xef\xb3\xa9\x26\xca\x21\x67\xdf\xec\xe0\x60\x64\x06\xa0\xb8\xa3\xfb\xc0\x7d\x14\x19\x30\xfa\x77\x4f\xee\xfe\x58\x98\x30\x3f\x19\x74\x34\xb4\x7f\x1e\x5a\xd4\xfa\x2f\xbe\x25\x7a\x3f\xa1\xfc\x24\x5d\x24\xd1\x6b\xc3\xd3\xf0\x7c\x5d\x83\xe1\x95\x85\x53\x58\xb3\xe8\x79\xaa\xec\xd4\xcc\x3e\x7a\xff\x8e\xf3\x93\x41\xf3\xf9\xe7\x64\x46\xac\x80\x1b\xad\xea\x83\xaf\xad\x8c\xb4\x2a\x46\x08\xce\xd4\x84\x60\x95\x61\x1a\x2c\xc3\x9c\xd9\x85\xc8\x06\x57\x86\x9f\xeb\x20\x27\x43\x71\x7e\x32\x68\x98\xff\x9c\x5c\x76\x5d\x2e\xa6\x40\xe3\x4b\x7f\x61\xce\x69\xb3\x89\x4f\xc2\x5e\x29\xfe\xe7\xfb\x7b\x80\x70\x0a\x5f\x66\xdd\x28\x39\xc6\xf1\x31\xe4\x64\x28\xce\x4f\x06\x0d\x0d\x0d\x76\x7c\xb2\xb7\xc8\xa3\x2c\x1f\xd1\x58\xcc\x3b\x3b\x52\x04\x59\x5d\xca\x7b\xc3\x03\xc9\x5f\x9b\x08\x2d\x87\xec\xee\xc4\x3e\x5b\xd9\xf4\xcd\xf3\xb9\xf0\xef\xb8\xff\x4c\xa6\xf3\x41\x5c\xe9\x45\xd6\x35\x50\x3f\x90\x39\x5e\xd7\x74\xc5\x5c\xb2\xca\x21\x5d\xcb\xb6\x66\x38\x13\xf8\x81\xb9\xd5\x51\x64\xc7\x8c\x6b\x21\x2b\x80\xf4\xbd\xfc\xa9\x97\xbd\x73\xcb\xf2\xc7\xd0\xa9\x7c\x1d\xe6\x00\x5f\x9f\xcd\xea\x54\x1e\xce\x37\x37\x82\xe5\x95\x4d\x1f\xcc\x44\xcb\xfe\x0c\x5d\xcc\x18\x1f\x8d\xab\x16\xdf\xf9\xbf\x52\xd7\x6c\x63\xfd\xbb\xa5\xfd\x3f\x75\x8d\x94\x1a\x19\xe8\xe9\x3a\xee\xe3\x8e\x58\x9d\x47\xf5\x38\xcb\x64\x41\x92\x3d\x3d\x0b\x53\x91\x5d\x6f\x35\xcd\x79\x59\xe2\x9b\x07\xca\xc3\x0b\x12\xec\xc9\x7f\xa3\xaf\xa9\x3b\xd1\xd7\x10\xbf\xba\xb7\xc7\x46\x25\xf3\xa6\xef\x00\xbe\xe3\x38\x21\x3b\xca\x4e\x6e\x4c\xf9\x15\x97\xa0\xf6\x92\x0a\x43\xc4\x68\x80\x84\xfe\xdf\xa8\x12\x24\x4f\xf6\x35\x9f\xfd\x53\xf7\x5e\xa4\x15\x24\xfa\x6b\xa7\x71\x37\xed\x71\x78\xa8\x33\x65\xdf\xc5\x65\xfa\x88\xa9\xbd\x66\xda\xe6\xd1\x29\xad\xfe\x37\x3e\xb6\xee\x64\x5f\xa3\xb9\xee\x5e\x4e\xea\x66\xe1\x28\x39\x3f\x9a\x5d\x4c\x8c\x3b\x6a\x8c\x7f\x90\x9a\x20\x86\xb5\x74\x8d\xc3\xd5\x4f\x43\xaf\xfb\xf5\x5f\x59\xed\xc9\xbe\x06\xdb\x0c\x97\xcb\x74\xe4\x9a\x63\xaa\xa9\xbf\xa7\xda\xe1\x99\xc0\xcd\x9f\xa1\x29\x4d\xb7\xf6\x16\x4e\xb5\x27\xd6\xc4\xb8\x0b\xbd\xfc\x2b\xab\x3d\xd9\xd7\x10\x7c\xbf\x3c\xab\x21\x4f\x24\xbe\x71\xc6\x44\x62\x27\x57\x32\x48\xc2\xfb\x93\x5d\xc2\xd5\x6e\x27\x23\xd2\x20\x2b\x89\x94\x2e\xdf\xbf\xd6\xd7\x40\x45\xf7\x77\xfb\x73\xa6\x19\x7d\xe3\x76\x4e\x80\x50\xf4\x20\xcc\xde\x93\x45\x72\xec\x7c\x48\xd4\xab\xad\xb5\x1c\xed\x67\x19\x29\x54\xcf\x36\xe4\x8e\x9e\x51\xa0\x38\xf0\xfe\x7c\xe5\x56\xc7\x25\x67\x0b\xf4\x1e\x62\x3e\x07\xfc\x19\x66\xb8\xb6\x29\xe1\x69\xe1\x11\xfb\xfb\x4a\xdd\xfd\xaf\x48\x6a\xee\x55\x00\xc8\xb9\x50\x1c\x78\x7f\xde\x30\xd3\xb8\xb4\x62\xcb\xd0\x7b\x99\x9b\x21\xec\xf3\xe3\x5b\xd9\xeb\x4b\x74\x58\x80\x6a\x12\xc3\xe3\x7e\x0d\x3d\xe7\xab\x4a\x69\xc8\xb9\x50\x1c\x78\x7f\xb6\x32\xfc\x18\x14\xcf\x4d\x59\xac\xd3\x7b\xa1\xb9\x0a\xf3\x02\x3b\xbf\x88\xa2\x95\xf9\xdd\x8f\x7c\x0c\xbc\x31\xf3\x57\x9d\x4e\xd9\x21\xe7\x42\x71\x7e\x52\x74\xff\xb8\x0e\xaf\x5f\xbc\x57\x2f\xc0\x2d\xed\x71\x69\xdc\x35\x6e\xfa\x26\x1d\x74\x39\xfa\x35\xbb\xf1\xf5\x3c\x59\xad\x0d\xee\xcf\x15\xcf\x2f\x08\xf9\xc8\xfe\x3b\xce\x4f\x0a\x0d\xdd\x07\x11\xf0\xeb\x7e\xf5\x87\x13\x1a\xd4\x6d\xe4\x77\x09\xd8\x35\x81\x29\xf3\x0f\xea\x06\x51\x61\x24\x15\x56\xa0\xd5\x03\x2c\xb7\x30\x00\xec\xbc\x20\x29\x8a\x18\xcd\xcb\x36\xdd\xa7\x5f\x21\x57\x0e\xc5\x81\x13\xa0\xfc\x9d\x30\xd8\x43\x66\xbe\xfd\xbb\x80\x2d\x85\x37\xcc\xc1\x3a\x81\x01\x4d\x3e\x1d\x73\x47\x43\xcf\x23\x72\x9e\x19\xc1\xac\x83\x9c\x0b\xc5\x81\x13\xe0\xb5\x67\xe2\x80\x25\x29\xe9\x68\x95\x4f\xfc\xea\x74\x8e\x74\xd1\x07\x9f\x0b\x06\x9e\xd9\xa6\x7b\x83\x5e\x89\xda\xc3\x2a\x2c\xdb\xc8\xb9\x50\x1c\x38\x01\xae\xdc\x41\x53\x1b\xd2\xed\xa5\x1f\x48\x49\x3b\x5c\xb6\x61\x6b\xf6\x0c\xaa\xdf\xa9\xa5\x5f\x5f\xb4\x50\xa0\xff\x7e\xdf\x3d\x3c\x06\x39\x17\x8a\x03\x27\x20\xde\x54\x81\xab\x44\xf4\x8c\xab\xe1\xcd\xad\x45\x21\xaf\x38\xf1\x7b\xbb\xfa\x9e\x16\x68\x0a\xde\xdd\x2a\x9a\x75\xdd\x12\x1c\x12\xc8\xc2\x06\x8a\xfb\x5f\x02\xfe\xb3\x79\xfc\x21\x02\x50\xb7\xf4\xdf\x45\x40\x0c\x76\x9d\x90\xdc\x5c\x97\x76\x71\x4c\x26\x13\xc8\x49\x7b\x99\x28\xd3\xd7\x5f\xa6\x6e\xf1\x35\x21\xd0\x78\x4b\xa2\x1d\x61\x8c\x5c\x3a\x14\x07\x8e\x00\x19\x79\xd6\x8f\x8f\x52\x43\x91\xf2\x21\xd2\x68\xda\xa4\xa4\x04\xd5\x7d\x66\x59\x62\x85\x84\x8f\xf7\xd2\x4d\xdf\x75\x3b\xab\xba\x22\xe7\x42\x71\xe0\x08\x94\x65\x20\x4e\x7d\xe6\x39\x4d\x32\x4a\x9b\xcb\xd3\xea\xe0\x78\xe6\x73\x6d\x77\xe5\xd4\x6b\x71\x17\xf4\x3b\x04\x32\xd6\x35\x17\x8e\x0e\xff\x50\x1c\x38\x02\xf8\xb5\x0a\x54\xa6\xbd\x68\x6c\x36\x97\x45\x52\x30\x75\xb8\xfa\xdc\xd4\xe2\x59\x6a\x49\x73\xbe\xfa\x7f\x6b\x3d\x63\xbf\x21\x6d\x81\x9c\x0b\xc5\x81\x23\xa0\x30\x69\xd4\xcd\x08\xb3\x0e\x51\xba\x48\x19\x96\xab\xd1\x30\xf7\xe9\x5d\x2f\x93\xa1\x4b\x66\xa0\xcf\x87\xf4\xfd\x8e\xd5\x8f\xb2\xc8\x43\x3a\x14\xf7\xbf\x08\xfc\x77\x27\xff\x43\x06\xa0\xf6\xd7\xdf\x65\x60\xd2\x39\xc2\x6b\xa0\xcd\x33\x4a\x53\xbf\x83\x23\xf6\xed\xb8\xa9\xae\x5a\xfb\x8b\xf6\x0d\xd9\x37\xcd\x0a\x2d\x74\xe6\x9b\x5d\xba\x47\x45\x38\x04\x07\xce\x80\xe9\x21\x1a\x9b\x99\x6d\xd8\xe9\xf3\xd4\xd6\x4e\x5f\x39\xb5\x6b\xf1\x19\xcf\x9d\x2e\xa5\x34\xb2\xa5\xae\xb7\x91\xd8\x52\xe3\xfa\x80\x9c\x0b\xc5\x81\x33\xa0\x78\x53\x6c\x4c\xf0\xb0\x7d\xb0\x9b\x38\xf9\xd1\xe8\x43\x25\xb7\x84\x70\xc7\x81\xf5\xc6\xce\x40\xa9\xfb\xeb\xec\x2e\xb9\xb5\x1c\xc8\xb9\x50\x1c\x38\x03\xb6\x30\xad\x17\xf6\x16\x78\x4a\x1b\xc6\x03\xbd\x9d\xfc\x44\x92\x9f\x6e\xc3\xdb\xd3\x97\x08\xc7\x95\xa5\x82\x3e\xf5\x62\x86\x35\x20\xe7\x42\x71\xe0\x0c\xb8\xbe\x4a\xd2\xf0\xba\xa7\x01\x77\xbb\x76\xfb\x91\xb1\x71\xc3\x13\x65\xc2\xdc\xef\x37\x7a\x5f\x13\xef\x77\xaa\xfe\xf0\x67\xbe\xe4\x83\xcc\x00\x14\x87\xcc\x40\x1d\x44\x61\x03\x75\xd8\xf9\x5d\x06\x64\x96\x12\x52\x65\xf6\xd2\xd6\x49\xec\x2f\x51\x2b\xf7\xdc\x78\x2f\x96\xb3\xd8\xc8\x7d\x6f\xea\x11\xb7\x6e\x6b\xa7\x5b\xd1\xee\x63\xe4\xda\xa1\x38\x70\x06\x44\x78\x68\xab\x68\x8b\x69\x2d\x8b\xa9\xc9\xc8\xed\xaf\x9c\x5d\xde\xc6\x33\xad\x1f\x7b\xe9\x2f\xfa\x90\xcf\xb0\x9e\xbf\x9d\xd1\x09\x39\x17\x8a\x03\x67\x40\x52\x1b\x3f\x26\x62\xee\x30\xff\x3b\xe7\xd9\xe9\x86\xce\x1d\x61\x56\xfe\x5d\x71\xe9\x5b\x1f\xcd\x9f\xd1\x16\x64\x89\xb0\xdf\xc1\x47\xce\x85\xe2\xc0\x19\x28\x03\x1c\xd4\x1a\x35\x97\x5e\x39\xd6\x44\xad\xcc\x67\xbf\x90\xbd\x42\xcc\xae\x1c\xdb\x39\x98\x9a\x3a\xfe\xf5\x9e\x1b\xbe\x98\xff\xd1\xfd\x05\x82\x03\x67\xa0\xa4\x6f\xe9\xfe\xb0\x08\x15\xd6\x1e\x22\x8c\xd5\x77\x8e\x26\xe0\x42\x7a\x12\x5a\x94\xef\xb3\xfc\x33\xe8\x34\x72\x32\x2e\x26\x98\xc8\x0c\x40\x71\x47\xf7\x01\x88\xc2\x06\xea\xe4\xf9\xbb\x0c\x98\x2d\xd7\x48\xa8\xeb\x67\x50\x04\x0f\x4e\xd5\xdd\xcd\x9a\x19\x2e\x5e\x44\x64\xa4\xee\x9e\x96\x48\xc0\xfb\x50\x90\x3c\xdf\x4c\x8d\x5c\x3b\x14\x07\xce\x40\x64\x89\xa4\xac\xa3\x62\xdd\x86\xf1\xe7\x5c\xd9\x90\xbe\xfd\x97\x97\xd4\x99\x4e\x2d\x0d\x9a\x38\xba\xe3\xfd\x98\x12\xe3\x2a\x3d\xfa\x77\x05\xc5\x81\x33\xb0\xf3\xc2\xd6\x87\x74\x93\xaf\x67\x56\xfa\x9c\x7c\xc1\x46\x18\xc1\xf5\xed\xba\x4b\xec\x31\x2d\x99\xd6\xdc\x53\x14\x4d\x32\x92\x47\x25\x23\x14\x07\xce\x00\x69\x61\x1e\xc2\x7e\xe7\xfc\xb0\x84\xb4\x59\x59\xdc\x74\x66\x4d\x5c\x54\xc4\xee\x04\x82\x3f\x8a\x3b\x7c\x01\xdb\x45\x42\x84\x1f\x39\x17\x8a\x03\x67\x60\xa6\x43\x30\x49\x2b\x84\xc7\x7a\xb1\xc3\xb5\xa8\xac\xbc\x4c\x81\x79\xd6\xaf\xf4\x91\x2f\x81\xad\xb0\xd2\x88\x48\x2a\x29\x45\x19\x32\x03\x50\xdc\xd1\x7d\x00\xa2\xb0\x81\x7a\x76\xff\x7d\x61\x93\xeb\xd4\x38\xba\x2e\x8e\x6b\x1c\x79\x63\x28\xc1\xd7\xf3\x3a\xa6\x56\x19\x40\x72\x7e\x27\xca\xb4\xb8\xfc\xcb\x55\x89\xd9\xf3\xb9\xc8\xf2\x03\x8a\x3b\x59\xd8\x00\xdc\x35\xa2\x6b\x43\xfb\x4b\xcc\x7c\x94\x61\x01\xa2\x74\x73\x04\x39\xcf\x0d\x19\x30\x5f\x30\x87\x7d\x43\xc3\x19\xd4\xf5\x5d\x43\x4e\x86\xe2\x4e\x16\x36\xb1\x3b\xec\xe2\xcf\x39\x6e\xef\x3e\xb4\x67\x61\x93\x37\x7d\xc8\x9b\x25\x50\x30\x6a\x5a\xd5\x91\x92\x4d\xfb\x4c\xe0\xce\x4d\x96\x38\xe4\x64\x28\xee\x3f\xb5\xca\x3f\x7f\x48\x7c\xba\x89\x4f\xae\xdf\x6f\x66\xfb\xe0\x34\x9e\xa9\xd8\x6d\x32\xf7\xf2\xe1\x89\x86\x6e\x5b\xab\xae\x26\x3e\xae\xb7\x9c\xce\x45\xc8\xc2\x06\x8a\xfb\xcf\x64\xf4\xe3\x85\x0d\xd4\x6b\xb1\xc7\x0b\x1b\x05\x15\x25\xd2\x55\x32\xd2\xd6\xe8\x84\xbd\x06\x2f\x45\x8a\xd7\xcd\x03\xcf\x3e\xdf\x1e\xd8\x3f\x4d\x4d\x61\x82\x96\x4e\x45\x7e\xfc\x39\x52\xe1\x91\x07\xcc\x72\x6e\x70\x7f\xf8\x5c\x9f\xea\x2a\x6b\x77\x5d\xba\x7d\x9c\xb3\x06\xa9\xf2\x7e\x69\x61\xba\xd5\xdd\xb7\x2c\x5c\xff\xd7\x0a\x1b\xa8\xa5\x1d\x2b\x6c\xa2\xc1\x85\x0d\xa3\xfb\xd5\x99\xd2\x89\x4a\xee\xcf\xca\x61\x0f\x9a\x92\x9e\xb4\x7b\xac\x26\xe1\x1a\xb4\xf1\xce\x15\xb6\xb9\x7d\x9d\x4e\x7a\xf1\xe6\x6f\x14\x36\x68\x4a\xe0\x87\xfa\x8d\x36\xd5\x21\x37\x78\x13\xa9\x84\x88\xab\x30\x65\x19\x61\xea\x13\x85\x30\xf5\x8f\x17\x79\xc7\x52\xbf\x3f\xb8\x0c\xe8\x18\x85\xfd\x95\x77\x3f\x4e\x16\x36\xf6\xfc\x5a\xfc\x69\x4a\x0b\x6f\x78\x14\x0a\x02\x74\xae\xbe\xf5\x2f\xbd\x77\x21\x08\x7b\x3f\x4d\xfa\x45\x68\xa1\x57\xf6\xe8\x40\xd3\x5f\x79\xd3\x45\xf3\xc4\xc7\x26\xd0\x2b\x18\xd2\xa1\x39\x3d\xbf\x54\x59\x37\x4d\x89\xb9\x2f\x94\x6c\xa8\x6d\xe8\x43\x4b\x8c\x3b\x75\xb8\x32\x2b\x14\xa1\x72\xe7\xaf\xac\xf6\x64\x61\xb3\xd8\x13\xfd\xf0\xde\x26\xcb\x62\xf2\x75\x46\xfd\x89\x69\x0d\xa3\x40\xcd\xd5\x5d\x42\x1d\xed\xcb\xf3\xb2\x4c\x34\x4d\x86\x81\xf3\x7f\x65\xb5\x0f\x4e\x7c\xec\xc2\xa0\xa9\x07\x2d\xe1\x29\x91\x55\xfd\xe4\x3b\xda\x94\x76\xd6\x16\xee\x64\x32\x69\x4f\xec\xc2\xdf\x99\x29\xb3\x3d\xb4\x0e\xe7\xf8\x6b\x85\x0d\x54\x74\x7f\xb7\x3f\x27\x6d\x06\xab\x5e\x32\xc0\x5c\x58\x74\x74\xc3\x6d\x7c\x1b\xda\x17\xc1\xc4\x8b\xd5\x6d\xcb\x45\xd7\xf3\xd4\xfd\xd2\x85\x0a\x21\x29\xe4\xbe\x04\xc5\x81\xf7\xe7\xce\xbd\x12\xc7\xeb\xe3\x41\x75\x84\x8a\xb0\x88\x75\xc2\x5e\x83\x81\xc6\x9f\xd6\x3c\x42\x92\x13\x66\x52\x12\x9b\xc9\x1e\x67\x43\x90\x73\xa1\x38\xf0\xfe\x6c\x17\x28\x8d\xb1\x32\x43\x53\x8e\xed\xbc\xff\x86\x59\x9e\x5f\xec\x4b\x9a\x60\xf9\xbb\xc6\x67\xa3\x53\xc9\x94\xac\x04\xa7\x1e\xaa\x20\xe7\x42\x71\xe0\xfd\x39\xe3\x6c\x5c\x44\xd4\x42\x5e\x37\x5a\x88\xba\x48\x8c\x26\xd9\x4a\x91\x83\x91\xa1\x0f\xf7\xb0\xeb\xab\xd8\xc1\xa0\xed\xf5\x89\xa3\x33\x25\x14\xf7\x6b\x1f\x3d\x3e\x37\x5c\xb1\x49\xb8\xd5\xe4\xd5\xa8\x86\x12\x7c\x90\xb3\x23\xd9\x30\xb0\x93\x49\x7b\x03\x7d\x48\x76\x34\x86\x4b\xe1\xb6\xcd\x95\x20\x64\x61\x03\xc5\xfd\xda\xf7\x7d\x10\x01\xbf\xee\x57\x7f\x38\xa1\x41\xdd\x46\x7e\x97\x00\x9c\xab\xe4\x26\x06\x8f\xcb\x6d\xcd\xbe\xb9\xdc\x39\x94\x58\xff\xf8\xc2\xb0\xbc\x41\xa9\x21\xab\xbb\xc1\x9f\xe0\x6e\x95\xd0\x21\x1b\x72\xe5\x50\x1c\x38\x01\x5f\x13\xe4\xaf\x3e\xab\x8c\xcc\xc3\x99\x7a\xe0\xce\xa6\x6c\x49\x55\xcb\x20\xe5\x77\x7b\xa8\xcf\xe5\x5b\xb0\x54\x76\x00\x05\xeb\x30\x72\x2e\x14\x77\xa2\xb0\x09\x17\x49\x9b\x23\x0e\xb3\x3c\x5f\xf1\x88\xef\x25\xd3\x12\x70\xd0\x56\x64\xf9\x26\x44\x53\x49\xaa\xfc\xd5\x66\x51\xdc\xd7\x3b\x47\x85\x0d\x04\x07\x4e\x80\xa9\x1c\x61\xb2\xd7\x1e\x5f\x8d\xe2\x3b\x9a\x8d\xb7\x9f\x39\xd2\x25\x4b\xf4\xa2\x2c\xb3\x1c\xf6\xee\xf9\x5b\x66\x64\xa8\x46\x33\x1f\x3d\x59\x42\x70\xe0\x04\x6c\xa0\x53\x84\x8f\x77\xbb\xad\x5d\xcb\x5c\x56\x5f\xbf\x93\xff\x80\x09\x21\xf1\x9e\xee\xba\xb6\xa5\xbc\x27\x63\xff\x94\x34\x1d\x07\xb2\xb0\x81\xe2\xfe\x97\x80\xff\x6c\x1e\x7f\x88\x00\xd4\x2d\xfd\x77\x11\x30\x0a\x62\xa3\x50\x88\x50\x65\x5b\xf5\x5b\x9d\xef\x1b\x2c\x5f\x49\x8e\x95\xbd\x20\x59\xeb\xe6\xad\xa5\xc5\xa8\x9b\x6f\x71\xed\x3a\x72\xe9\x50\x1c\x38\x02\xfd\x96\x24\x15\xda\x6f\x2e\xe6\xf0\x19\xe3\x0e\xd1\x9c\x4b\x22\x19\xcb\xe8\x6d\x48\x2e\xda\x57\x46\x60\x98\xe3\xf0\x13\xef\x93\x23\xe7\x42\x71\xe0\x08\x3c\xae\xc6\xf4\x18\x3c\xa5\xf7\x41\x8e\x6a\xd1\x47\xea\xc9\x24\xdf\x35\xc6\x05\x4e\xea\xbb\x7c\x4a\x4f\x18\x4d\x15\x1f\x46\x5c\x3e\x6a\x99\xa1\x38\x70\x04\x84\xcd\x2a\x84\x3b\xd9\xb1\x9c\xbf\x94\xd1\x2b\x06\xb8\x6e\x8e\x8e\x0f\xf1\x51\x9d\xf3\x78\x8f\x3d\x63\xe0\x9d\x90\x99\xa7\x91\x8f\x9c\x0b\xc5\x81\x23\xe0\xe3\x40\x17\xdd\x77\x40\x20\x4a\xe7\xc2\x77\x9a\x61\xeb\xaa\x7f\x12\xeb\x99\xc5\xfa\x17\x65\x1a\x94\x12\x2b\x7d\xf4\x5b\x46\xb8\xc8\x43\x3a\x14\xf7\xbf\x08\xfc\x77\x27\xff\x43\x06\xa0\xf6\xd7\xdf\x65\x80\x2b\xe9\x83\x57\x39\x6f\x59\xba\xce\x69\x13\xc0\xbf\xc6\x18\x4f\xa1\x2a\x30\x2b\x03\xcb\xb1\xda\x2a\x61\x70\x79\xf0\x1c\xa1\x22\x72\xed\x50\x1c\x38\x03\xf9\xef\x5a\xfb\x94\x0e\xfc\xe5\x1f\x76\x96\xd4\xce\x0a\xf9\x7c\x6f\x2c\xb6\x9b\xb7\x6c\x09\xab\xd5\xbc\xcf\xcf\x7d\xf1\x6d\xc3\x7b\xe4\x5c\x28\x0e\x9c\x81\xc4\x83\x31\x6e\x19\xcc\xaf\x66\xad\x70\x4d\x93\xce\x25\xba\x58\xdb\xc4\x2a\x67\xd7\x8b\x26\xcb\xd4\x5e\x59\x11\xcd\xdb\xe7\x8e\xe6\x42\x71\x27\x4a\x3b\x4a\xc5\x9f\xeb\x1b\x4f\x3b\xf8\xb3\xcd\xbc\x0e\x12\x43\x8b\xa2\xef\xfb\x57\x94\x94\x56\x5b\xab\x17\xcc\xfa\xe2\x39\xdb\x1e\xdd\x06\xa0\x38\x70\x06\x82\xfd\xd1\xbe\x3f\xbe\x24\xa0\x41\x15\x5f\x87\x61\x25\x2e\x6c\x91\x81\x65\xc4\x20\x3f\xea\x6b\xe7\x92\x67\xf2\x49\x6e\xe8\xd1\x45\x64\x06\xa0\x38\x64\x06\xfe\x73\xac\xfa\x43\x06\xa0\x0e\x3b\xbf\xcb\x80\x84\x53\xf1\x81\x25\x93\x7e\x18\xc9\xaa\x99\xf8\xf0\xab\x44\x8a\x4b\x66\x71\x89\x71\x70\xa6\xba\xd0\x6e\x82\x54\x77\x89\x90\x36\xe4\xda\xa1\x38\x70\x06\xea\xd9\xb6\x79\xfd\x6e\x9e\xff\x46\x37\xa4\xd3\x6e\x9c\x48\xcb\xd2\x1b\x13\x55\xf0\xa0\x21\x81\xbd\xfa\xba\x38\x46\xe6\x27\x33\x11\xe4\x5c\x28\xee\xc4\x56\x90\xff\x31\x95\x8e\xac\xa9\xf4\x0e\xcd\xda\x52\x58\x27\xef\xcd\x48\x33\x19\xeb\x56\x09\x9b\x1f\x37\x1e\x7d\x48\xf0\xa2\xaa\xcf\x3b\xda\x0a\x20\x38\x70\x06\xcc\xe2\x08\xe6\x82\x67\xf8\x98\x32\xaf\x99\x89\x6a\x46\x61\xa2\x93\xf2\x69\x59\x8c\x71\x59\x7a\xd2\x7f\x04\xc8\xf9\xb7\x3b\x34\x8e\x4a\x0b\x08\x0e\x9c\x01\x62\x23\x44\xad\x0f\xff\x7d\xf6\xca\x3b\x59\x4c\x61\x2c\xd2\x0c\xd5\x4c\x37\x8b\x6f\x60\xff\x70\x27\xc2\xb9\x40\xb6\xbb\x29\x54\x8f\xcc\x00\x14\x77\x74\x1f\x80\x28\x6c\xa0\x4e\x9e\xbf\xcb\x40\xeb\xe3\x14\x27\x9f\x50\xab\x4d\x46\xb4\xee\x55\xaa\x85\xd1\xc4\xf1\xc1\x6a\x37\x36\xf9\x0f\xe7\x27\xac\x18\x3f\x8a\xe7\x07\x1e\xbd\x5d\x04\xc5\x81\x33\x40\x3c\xbf\x2a\xba\x8d\x2d\x9b\x2a\xc6\x29\x9d\xf6\x70\xee\xb3\x02\xf9\x68\xe2\x4a\xe0\xe5\xb6\x90\x2e\x66\xc0\xf6\xb6\xd0\xd2\xd1\x9b\x76\x50\x1c\x38\x03\xe3\x9d\x53\xce\x83\x8b\x4f\x4f\xc9\x75\xe2\x46\x53\xbf\xbc\x34\x1d\x76\xba\xbc\x84\x2a\x78\x9d\xbe\x87\x7f\x2a\x68\x72\x4c\x82\x17\x39\x17\x8a\x03\x67\xc0\x29\x9e\x72\x0e\xf6\x96\xe7\x29\xac\x29\x9b\x57\xdc\x21\x31\x10\x5f\x42\x9b\xc1\x59\x13\xdd\xbc\xbf\x72\xa5\x93\x76\x70\xeb\x2b\x72\x2e\x14\x07\xce\x40\x6d\x13\x26\x41\xca\x0e\x80\xe1\xd3\x46\xbf\x6a\x5e\x52\x12\xe4\xa1\xf8\x19\xff\xa9\xf0\x5c\x4f\xb1\x14\xb7\xa7\x69\xac\x5b\x14\x32\x03\x50\xdc\xd1\x7d\xe0\xc1\x9f\x0b\x1b\xa8\x67\xf7\xdf\x17\x36\xae\x9e\xcb\xd7\x2a\x2b\x5e\x66\x09\xad\x26\xaa\xe5\x3a\xa1\x0b\x30\xdf\xf1\x7a\x8c\x46\x54\xa6\xe0\x28\xb1\xfb\xd5\x4b\x7b\xa4\x13\x59\x7e\x40\x71\x27\x0b\x1b\xcf\xca\x45\xc2\x4d\xa9\x5b\xb7\x8c\x4b\x53\xee\x65\xed\x3a\xf5\x4e\x08\xf8\x4e\x18\x9a\xb9\xa9\xd5\x30\x55\x8d\x16\x06\x77\x65\x21\x27\x43\x71\x27\x0b\x9b\xf6\xfd\xae\x42\x7d\x57\xb6\x26\x55\xa7\x9f\x4c\xfd\x4f\x12\x7c\xd3\xaf\x55\xea\xb1\x0b\x4c\x8f\x70\x3f\xd7\xc9\x13\xc4\xfb\x3e\x82\x9c\x0c\xc5\xfd\xa7\x56\x21\x3a\x3e\x79\x4b\xe5\xb9\xa0\x93\x7a\x67\xe7\xf5\x3e\xe9\x1f\xe8\x07\x36\xae\x18\x96\x63\xb6\x1d\x6e\x8b\x8d\x11\xf7\x06\xde\xd9\xfd\x18\x93\x42\x16\x36\x50\xdc\xaf\xc9\xbf\xfe\xd6\xfe\x9f\xc2\x06\xea\xcb\xc9\xc7\x0b\x1b\x77\x84\x6d\x52\x52\x15\xf3\xeb\x78\x01\xaa\x5b\x92\x82\xf7\x18\xd9\x52\x1f\x90\x46\xbe\xad\x29\xe5\xb5\xe8\xfa\x68\x74\x3f\x03\xef\x18\x8a\xf6\x89\xe3\x70\x7e\xe5\x55\x64\x8e\x63\x13\x63\x3f\x47\xf1\x10\xda\x5c\xb3\x38\x4f\x91\xbd\x41\xbd\xc5\x85\x1c\x33\x06\x36\x99\xff\x6b\x85\x0d\xd4\xd2\x8e\x15\x36\x5d\xe0\xc2\x66\xe8\xfd\x80\x71\xae\x1a\xde\x6a\x89\x10\xaf\xe9\x28\xbd\xee\xf2\xe2\x8b\xde\x22\x79\x7d\x62\xe7\xe1\xaf\x56\x45\x0e\x4c\xc6\xe6\x7f\xa3\xb0\x91\x3c\x51\xd8\x2c\x51\x52\xbd\x75\x9c\xa3\xb3\xb9\x57\xba\x72\x59\xe5\x22\xe5\x87\x1d\x3d\x59\x9a\xce\x31\x6b\xbb\x92\xc8\x8f\x73\xd8\xd1\x9b\x35\x7f\xe5\xe5\x8f\x93\x85\xcd\x17\x9d\x0f\xb9\xab\x71\x56\xc9\xd2\x1a\x74\x41\x81\xdf\x8b\xee\xe9\x1a\x2a\x16\x57\x2d\x6b\x60\x8a\xd3\x7c\xac\x7b\x2f\x37\xc2\xff\x57\x5e\x75\x39\x59\xd8\xa8\x2f\xba\x5e\xbd\xec\xf2\xaa\xea\x1d\xcb\x9b\x4b\xd4\x49\x85\x4e\x3c\x29\xc6\xd8\x0d\xd8\xdf\x92\x66\x0e\x4d\xbc\x0a\x0b\xee\xfc\x95\x2f\x62\xd5\x9d\x2c\x6c\xb0\xd0\x68\xf0\x83\x8d\xd5\x33\xf1\x75\x12\xcb\xfa\xd0\xe9\xdc\x0b\x31\x27\x1f\x55\x35\xcc\x67\x58\x60\x5d\x37\xa9\x7f\x12\x5b\xf9\x57\x56\x7b\xb2\xb0\x59\xfe\xc6\x67\x69\xb0\xc0\xa7\x36\xec\x15\x5f\x7f\xeb\xd1\x17\xae\xa1\xe2\x1b\x26\x7d\x69\x2d\xa4\x67\xf1\xb0\x89\x6e\x78\x56\x65\xff\xb5\xc2\x06\x2a\xba\xbf\xdb\x9f\xc9\x3b\x58\xb6\x85\x60\x7b\x74\x02\x49\xe4\x7a\xd9\x5c\xf4\x2b\xf4\xab\xde\x07\x96\x61\x77\x15\xf6\x39\x6e\xe4\x5c\x24\x8b\x5a\x41\xee\x4b\x50\x1c\x78\x7f\x36\xfe\x5a\xf7\x89\xd5\xb0\xd5\xd8\x29\xa9\x3f\xfb\x82\xd0\xed\x1d\x6a\xa7\xfe\xe7\x94\x93\xf9\x82\xf7\x2f\xf3\x3e\xea\x79\x16\x39\x88\x9c\x0b\xc5\x81\xf7\xe7\x2c\x8f\xdb\xc9\x9f\xdd\x9c\x1e\x3f\xd6\x52\x6a\xbd\xde\xde\x2f\x52\xe3\x33\x97\x16\xb1\x34\x70\x71\xf8\x06\x09\x7d\xd3\x4b\xef\x5a\xe4\x5c\x28\x0e\xbc\x3f\x5f\x60\xa2\xb5\xaa\x2d\x13\x7e\x1b\x4d\x1d\xc8\xc1\x25\x75\x16\x21\xba\xf1\x90\x3c\x64\x81\xa4\xba\xef\x4d\x15\x9d\x01\xa9\xdb\x45\xe4\x5c\x28\xce\x4f\x0a\x8d\xee\xf8\xdc\x7d\xb4\xc0\xe1\xd4\x76\xbf\x5d\x69\xf4\xc5\x22\xc1\xc1\xae\x72\xe1\x42\x6d\x9c\xb9\x6f\x13\xef\x66\xf3\x78\x60\x5c\x69\x39\xbe\xc8\xc2\x06\x8a\xfb\xf5\xf7\xe6\x83\x08\xf8\x75\xbf\xfa\xc3\x09\x0d\xea\x36\xf2\xbb\x04\xe4\xea\xe8\xe9\x1e\x08\xd6\xbc\xd4\x4d\xb4\xc6\xa3\xad\x3e\x98\xd2\xab\xef\xd8\x99\x7e\x30\xec\xa1\xfb\xc4\xb2\x5b\xac\x65\xeb\xe8\x29\x15\x8a\x03\x27\xe0\xb4\xdc\x3d\x16\x0a\xe0\xc7\xe2\x04\x6b\x54\xf1\x93\x81\x28\x5c\xb2\xf6\x2f\x18\x43\x4a\xfd\xd6\x02\x62\x31\x1f\xa2\xb7\xb2\x7a\x91\x73\xa1\x38\x70\x02\x92\xc9\x5e\x3d\x30\x48\x8c\x57\xdf\x93\x7f\xa7\x11\x2c\xa7\x4d\xde\xf5\x55\x2c\x1b\x71\xb5\xed\xfb\x7a\x0a\xdc\x91\xf1\x32\xee\xd1\x5c\x28\x0e\x9c\x80\xd1\x07\x11\xe7\xad\x86\xe6\xde\xe8\xed\x6f\xc9\x39\x5d\xb0\x67\x36\xdd\x9d\x52\x6c\x98\xcf\xd8\x0f\x10\x2f\x91\x95\x91\xba\x5e\x83\x9c\x0b\xc5\x81\x13\xe0\xfe\x51\x87\x2d\xfc\x1a\x81\x88\x09\x3c\x78\xb4\x52\x1c\x83\xed\x2e\xeb\x82\x6a\xc9\xba\xc1\x2e\x5a\xee\x2a\x11\xda\xbc\xeb\x28\xb2\xb0\x81\xe2\xfe\x97\x80\xff\x6c\x1e\x7f\x88\x00\xd4\x2d\xfd\x77\x11\x78\x7c\x9e\xaa\x83\x44\x18\x26\x78\x7f\xe9\x5b\x94\x7a\xbc\x4a\x9a\x4a\xfd\xe5\xe6\x95\xc4\xca\x87\xb5\xa3\xbd\xec\xec\xa1\x0f\x1d\x8e\x0a\x10\x08\x0e\x1c\x81\x69\xff\x47\x06\xca\xaa\x58\x97\xee\xe3\x4b\x3f\xde\xae\xd2\x65\x34\xbb\x5c\x1a\xcc\xd1\xce\x91\x96\x18\x38\x5a\x90\x68\x72\x69\x0b\x39\x17\x8a\x03\x47\xc0\x90\x28\xb1\x4a\x27\xcd\x5d\x9c\xf1\x7c\x94\xea\x4d\xcc\x11\xa2\x24\x7a\x1f\xdc\xc8\xb7\xe3\xde\x3f\x52\xf7\xeb\x7b\x4e\xb1\xe8\x23\xe7\x42\x71\xe0\x08\x28\xec\x8e\x03\x6e\xef\xef\xfe\x08\x5b\x2e\xaa\xba\x73\x97\x3a\xf5\x5d\xb9\xf6\xca\x59\xb1\x6c\x3d\xf7\x6f\x85\xc4\xc5\xdf\xfc\x8f\xbe\x66\x03\xc5\x81\x23\x60\x6f\x6f\xe2\x87\x43\x7f\x07\x33\x87\x73\xe1\xbb\x96\xdc\xca\xe3\x33\xa5\xa1\x7c\xd3\xfc\x75\x64\x75\xda\x3a\xf7\xf2\x48\x6b\x01\xe4\x21\x1d\x8a\xfb\x5f\x04\xfe\xbb\x93\xff\x21\x03\x50\xfb\xeb\x6f\xbf\x16\x47\xb6\x35\x60\x6b\x8a\xd7\xfc\xde\xfa\xf6\xcb\x54\xed\xd5\x6f\x14\x77\xfb\x15\x30\x9e\xde\x9d\xf8\x38\xe7\xfb\xad\xe6\x9c\xe3\x51\x73\x0f\xc5\x81\x33\xe0\x5d\x8e\x91\x23\xa6\x90\x25\xf7\x00\xbd\x8a\xf8\x65\xd3\x95\xd9\x5c\x51\xf3\x11\x15\x61\x35\x42\x23\xae\xcd\x33\x2a\x0b\xf9\xe2\xc8\xb9\x50\x1c\x38\x03\x0c\x12\x13\x30\x31\x45\x3f\x93\x46\xc7\x5c\x04\x0d\xeb\xb9\xf7\xe2\x01\x3b\xbd\xe5\x07\xbb\x11\x30\xb3\xe6\xc2\xd0\xeb\xa2\x73\xc8\xb9\x50\x1c\x38\x03\x26\xd8\x8e\x29\x96\x39\x68\xa4\x86\x92\xe5\x82\x41\x77\xe8\x5b\xb5\x9a\x71\x58\xca\xe7\xae\x69\x50\x5b\xc5\xe6\x0e\x62\xd9\x5b\x23\xe7\x42\x71\xe0\x0c\x9c\xed\x7d\x62\xb9\xf7\xf4\xc2\xc7\x91\xc2\xc8\xbc\x78\x1d\x7b\xf6\x91\xb2\x38\x2f\x05\xc5\x4b\x61\x03\x3a\x59\x55\x1c\x74\x4d\xd8\xc8\x0c\x40\x71\xc8\x0c\x48\x42\x14\x36\x50\x87\x9d\xdf\x65\xe0\x7e\x0c\x46\xf7\xf2\xe6\xc5\xc1\xcb\x12\x1d\x2b\x03\x78\x2f\x2f\xbe\x16\x60\x7a\x33\x46\x9f\x1e\x3c\x89\x66\x61\x4c\xa0\xee\x93\x8d\x5c\x3b\x14\x07\xce\x80\x12\xbc\x82\x83\x26\xeb\x40\xe4\x4b\xae\xe7\x4d\x89\xb9\x5e\xf1\x66\xd7\xcc\x49\xa5\xf9\xef\xf7\x66\x32\x44\x1d\xaf\x3f\xc4\x3a\x7a\x1b\x0a\x8a\x3b\xf1\xd3\x9b\x06\xda\xb2\xee\xaf\xe5\x6c\x5d\xa3\xf2\x5f\x49\xfb\xe6\x78\x27\xa3\xce\xa5\x7c\xf9\x9c\x71\x9f\xc1\x5f\x3b\xd2\xf8\x23\xdb\xd1\x1b\x71\x50\x1c\x38\x03\x97\x39\x82\xcc\x19\x1c\x03\x5e\xa7\x67\x36\xdf\x08\xc8\x0c\xd9\x88\x9e\xd8\x61\xb9\xed\x5d\xad\xcd\xa0\xa7\x66\x2e\xfa\x9d\xf6\x2a\x72\x2e\x14\x07\xce\x40\xdd\xc8\xd5\x9d\x1a\x52\xe1\x00\x52\x2a\x32\xe7\xed\x84\xeb\x4d\x82\xd7\xd5\x9b\xd3\xf7\x83\x3d\x9c\xa4\x37\xef\x91\xe8\x5e\x78\x8a\xcc\x00\x14\x77\x74\x1f\x80\x28\x6c\xa0\x4e\x9e\xbf\xcb\x40\x7b\xe5\x78\x98\x86\xf0\xa4\x79\x4a\xee\x1d\x55\x76\xde\xd6\x1a\x36\x1b\x3d\x57\xea\xee\x18\x3b\x47\x59\x31\xb8\xf5\x05\xf7\x11\xe4\xda\xa1\x38\x70\x06\xee\x33\x6b\x7f\xa6\x4d\x34\x21\x1c\x1f\xc1\x8d\x6d\xe5\xdb\x3e\x08\xe7\x68\xd6\xa2\xbb\x17\x07\x77\xd0\xd7\x7c\x29\x3a\x24\x7b\xf4\x15\x23\x28\x0e\x9c\x81\xe0\xcf\x2d\x14\x92\xd8\x3f\x3c\xee\xd0\xc4\x04\x6b\xd8\x9a\x50\xcc\x11\xaf\x44\x6a\x8a\x18\xa8\x2c\x69\x87\x3a\xc5\x7c\xe5\x7e\x83\x9c\x0b\xc5\x81\x33\x50\x6c\xc8\xd3\x6b\x48\xef\x2c\xfb\x90\xb8\xd9\x8f\x69\x2a\x57\xf7\xd4\x1b\x9d\x71\x3e\xe9\xa8\xec\xae\x3c\x85\x0b\xfc\x98\x03\x24\xc8\xb9\x50\x1c\x38\x03\x8e\x65\x6b\xdb\x3c\x1a\x0c\x6b\x1e\x01\x74\xce\xcf\xde\xe8\xac\x5e\x23\x23\x12\x31\x9b\xbc\xf1\x9c\x4d\xff\xc5\x32\x15\x8e\x6d\x0b\x32\x03\x50\xdc\xd1\x7d\x00\xa2\xb0\x81\x7a\x76\xff\x7d\x61\xf3\xe1\x35\x03\x0d\x47\xcb\x85\x11\x63\xd8\xe3\xd8\x4f\xcf\xbf\xcf\xc8\xbc\x6c\xf2\xfb\x91\x5d\xf4\x65\x4b\x7a\xc0\x6b\x27\x81\x42\x1e\x59\x7e\x40\x71\x27\x0b\x9b\x07\x3e\xc6\x51\x1e\xa5\x15\x9f\x00\x8f\xd5\x48\x8f\x9f\xdd\xc9\x93\x7a\x4f\xdf\xd9\x38\xe6\xbb\xfd\x14\x50\xdd\x9c\xea\x78\xbc\x87\x9c\x0c\xc5\x9d\x2c\x6c\xb8\xe6\x15\x86\x82\x6a\xd2\xfd\x9f\x67\xdd\xd9\x9d\x34\x3b\x87\xff\x30\x1c\xed\x73\xe4\xe5\x6e\x9c\x2f\x3d\x91\x9d\x11\x40\x79\x24\x72\x32\x14\xf7\x9f\xc2\x46\xf2\xf8\x64\x03\xed\xfb\x4c\xa1\x99\xfb\xeb\xfb\xfa\xcf\xde\xbc\x2f\x8f\xc8\x60\xd0\x97\x79\xe2\xb1\x97\xa0\x22\x9f\x7e\x77\xa7\x73\xac\x16\x1f\x59\xd8\x40\x71\xbf\x26\xa3\xff\xa3\xb0\x81\x52\xc4\x1d\x2f\x6c\xee\xeb\x54\x32\x0e\xea\x8d\x35\xbe\xb3\x27\xaa\x37\x0a\xb0\xc2\x8a\x24\x35\x99\x6e\xb2\x4b\x4f\xa9\xb5\x71\xe4\x4c\xef\x7f\x7f\xfc\x35\x87\x6a\x4a\x82\xbd\x65\xee\x0a\xbe\xd5\x17\x8c\x92\x87\xc6\x92\xfa\x63\xa5\xf7\x0f\x94\x89\x9f\xdc\x0b\x12\x7f\xcc\x6c\xf6\x89\x98\xec\xff\x5a\x61\x03\xb5\xb4\x63\x85\x0d\xd1\x19\xd0\xe3\xb5\x19\x6d\xfa\x2b\x52\xec\x98\x80\xa4\xf2\x70\xc0\xff\x91\xc8\xa8\x15\xaf\xb9\x97\xfa\x3b\x84\xa5\xe4\xd7\x45\x34\xa1\x2b\x7a\x1d\x7f\xa3\xb0\xf1\x39\x51\xd8\x98\xeb\xf4\x12\x5c\x9c\xa7\xd4\x7a\x62\x71\xef\xea\x8e\x2a\xd1\xca\xb4\x46\x6e\x48\x16\x5e\x5c\xc2\x1b\x4a\xba\x80\x85\x34\x59\xe2\xbf\xf2\xf2\x87\xd0\x89\x2e\xe1\xac\x75\x35\xd7\xd5\xb8\x8e\x0f\x5f\xa7\xbc\x4d\xaa\x2d\x36\xe8\x29\x13\x1c\x07\x25\x34\x48\x97\x6b\x73\xf4\xf4\x4b\x4d\xe8\x7f\xfc\x95\x57\x5d\x4e\x16\x36\x95\x75\x8e\xbd\x2f\x27\xc7\x6f\x4d\x13\xe1\x19\x77\x46\x55\x9c\xb5\x8f\xe2\x9b\x91\xdf\x13\x2b\xcb\x9e\x7d\xa3\x51\xab\xc2\xc8\xf5\x57\x56\x6b\x72\xe2\x63\xb3\xeb\x0d\xea\xaf\xa5\x86\xd4\xcd\x0b\x58\xd7\x5f\x48\x23\xd0\x2e\xdd\x5f\x16\x7c\x8e\xff\x33\x62\x39\xdf\x2c\x74\xb2\x8f\x06\xff\xaf\xac\xf6\x64\x61\x33\x9d\x74\x35\xb1\x98\x1f\xf7\x89\x45\x82\x26\xf3\xba\xa7\x47\xec\x2d\x33\xd1\x56\x97\x44\xb4\x98\x4e\x46\x36\x9c\x92\x31\x86\xe5\xbf\x56\xd8\x40\x45\xf7\x77\xfb\xb3\xbd\x64\x0d\xc5\x58\xef\x0f\xcb\x96\xe1\x11\x73\xc5\x39\xda\xf7\xe7\x5f\xd5\xb6\x7e\x57\x82\x9d\x4e\x76\x62\xca\x76\x4b\xd8\xcd\x42\xee\x4b\x50\x1c\x78\x7f\x5e\xb6\x7d\x5e\x36\xa7\xf6\x90\x50\x48\xc2\x4e\x70\x83\xc4\x70\x3f\xf3\x9e\x77\x0e\x23\xfa\xc7\xa8\xb5\xd7\xe4\x78\x53\x07\x31\x26\xc8\xb9\x50\x1c\x78\x7f\x5e\x73\x63\xdd\x21\xee\xca\x0f\x8e\x66\xa1\xd3\x8c\x16\xd4\xe2\xfe\x24\x1b\xf1\xb1\x62\x59\xe4\x43\x1b\x7f\x28\x0d\x2e\x0e\xc1\x3c\x72\x2e\x14\xe7\x27\xf5\xcf\x12\xfd\x74\x36\x96\x8a\x33\x2e\x0f\xf9\x19\x2b\x43\x92\xdb\xc3\x04\xe7\x02\x6e\x91\x30\x47\x02\x6f\x77\xfa\x27\x4f\xc5\x0d\x1f\xfc\xc0\x39\xaa\x17\x20\x38\x3f\x29\xd8\x3f\xdf\x33\x61\xd8\xb7\xee\xc7\x72\x0c\xa1\x9e\xd4\x09\x35\x20\x1a\x74\x3c\xe8\xd9\x8e\x8d\x3a\xfb\xe9\x5a\x75\xc5\xa8\x59\x1b\x97\xb8\x29\xb2\xb0\x81\xe2\xfe\xf7\x95\xe5\x5f\xf7\xab\x3f\x9c\xd0\xa0\x6e\x23\xbf\x4b\x80\xa5\xc5\xe8\x40\x96\xbf\x87\x35\x77\xdb\x73\xb5\x25\xfa\x2f\x84\xe1\x56\x92\x9d\x31\xaa\x7e\xb2\xc5\x02\x07\x23\xe1\x94\xcd\xb3\xc8\x95\x43\x71\xe0\x04\x34\x1c\xa2\xd9\xfd\x90\x66\x2f\x62\x68\xc0\x4c\x9d\x1b\x70\x5b\x5a\x95\xec\xe7\xf3\x2c\x1e\xf2\xf9\x28\xcd\xc8\xf9\xfd\x42\x29\x37\x72\x2e\x14\x07\x4e\x80\x9f\xbb\x80\x2c\xdf\x8d\x8f\x6c\x45\x99\x16\xb5\xd3\xbc\x38\x05\x35\xf4\xec\xce\x06\x79\xd7\xcd\x7b\x55\xa7\xd2\xb8\xe2\xef\x6b\x21\xe7\x42\x71\xe0\x04\x34\x10\x0d\x8a\xd1\x05\x78\x36\x3c\x38\xcb\x4f\xb7\xf2\x45\x73\xc2\x34\x35\x49\xb8\x56\xce\x5d\x68\x48\x10\x8b\x31\x8b\xf7\xf9\xd1\x2b\x06\x50\x1c\x38\x01\x67\x38\xee\x3c\xe1\x3e\xcb\x62\x4c\xbb\xc6\xeb\xf9\x28\xd8\x76\xe0\xcb\x1d\x31\x89\xa8\x6c\x0c\x66\xa3\x8d\xc1\x3b\xe3\x32\xe8\xcc\xc8\xc2\x06\x8a\x3b\x72\xd8\xfc\xb9\xb0\x81\xba\xa5\xff\x2e\x02\x4b\xa2\x3f\x0b\x4d\x9c\xad\x72\x98\x3a\x35\xef\x88\x93\xa5\xdb\x3d\xbc\xee\xe3\xd9\x64\x9e\x4f\xf1\xd5\x7b\xe9\xec\xdc\xf0\xfd\x3d\xe4\xd2\xa1\x38\x70\x04\xf4\x2a\xc4\x2a\xbd\x92\xe2\x59\xd7\xf7\x2a\xe2\x14\xe6\x35\x60\x1a\x51\xca\x35\x37\x1a\x42\xc4\x8d\xb2\x39\x89\xfc\x9b\xba\x9a\x8f\xbc\x28\x10\x1c\x38\x02\xe9\x57\xe5\x26\xde\xf8\xc5\x3c\x90\xa6\x5a\x19\xf6\x8d\xb1\xc3\x7b\xdb\x22\x5e\xd0\xa1\x77\x2d\x6e\xa4\x68\x7d\x29\x8b\xac\x04\x13\x39\x17\x8a\x03\x47\x00\x27\xc8\x27\x7b\xab\x9f\xe4\xd5\x8d\x5b\xc0\xc3\xe1\x8a\x48\xb2\x0f\x38\x49\xf8\xd2\xba\xd4\xd1\x8d\x8d\xae\x03\xf1\x9e\x2f\x8e\x1e\x00\xa1\x38\x70\x04\xc8\x68\x54\xa3\xd2\xa9\xfc\xca\xa5\x47\xd1\x8a\x71\xaa\xa7\xf9\xb5\x5d\x79\xf7\xea\x29\x23\xd9\x24\x94\x98\xeb\xae\xdf\x7a\xe3\x8e\x3c\xa4\x43\x71\x47\xee\x0a\xa1\x3f\x3f\xa8\x41\xed\xaf\xbf\xfd\x6e\xac\xf3\x0d\x05\x1d\x66\x1b\x76\x4e\xee\x73\xfc\xe3\xa7\x75\x57\x43\x96\x23\x29\xc7\xb3\x3a\x35\xcf\xb0\xe0\xf5\xb7\xda\x25\x1d\xbd\x0d\x05\xc5\x81\x33\x40\x60\xa0\x6a\xf3\x21\xf5\xc7\x77\x6a\x32\x13\xc4\xed\x6f\x12\xe4\xd3\xb5\x35\x94\x2f\x07\x6d\x9e\x5b\x0f\x73\x9c\x15\xc3\xd1\xed\x41\xce\x85\xe2\xc0\x19\x50\x21\xd0\x39\x4f\x92\x71\x6e\x9c\xfc\xc9\x2a\x8d\xc5\x35\x89\xd2\xbb\xfd\x74\xb3\xed\x51\x07\x46\x89\xa7\x53\xc8\x0b\x03\xcb\x7c\x91\x73\xa1\xb8\x13\x1b\x01\x7f\x87\x91\x2f\x5a\x4c\xd1\x45\x0c\xb4\x66\xdd\x53\xe4\xe3\x3e\x24\x3c\xf5\x2c\xeb\xf7\xdc\x06\x6f\x19\xa6\xdc\xc4\x48\xc5\x38\xda\x08\x20\x38\x70\x06\xd2\x8b\xe9\xd2\x38\x9c\x8c\x92\x3d\x67\x47\x36\x99\x28\x92\x83\x3f\x13\xb2\x8b\xb4\x65\x73\x1b\x5e\xe1\x40\xcf\x95\x6d\xc5\xe7\x40\x66\x00\x8a\x3b\x72\x57\x40\x14\x36\x50\x87\x9d\xdf\x65\xc0\x64\xc6\xd5\xd6\x66\x7e\x2d\xe8\xe3\xcf\xc3\xf4\xb9\xef\xf1\x42\x6d\x5d\x0c\xa2\x51\x8d\x93\xd9\x89\x1f\xaa\xf0\xe1\x2f\x63\x0a\x8e\xca\x2a\x08\xee\xc4\xdb\x15\x5f\x7a\xe2\x9c\x0a\x7e\xde\xbf\x33\x20\x78\x90\xfe\xb4\xbb\xe4\xed\xf9\x9f\x7b\x57\x89\xcc\x76\x2b\x08\x75\xac\x69\x98\x32\xea\x8f\xde\xae\x80\xe0\x4e\xbc\x69\xf7\xcd\x16\xbb\xa1\x68\x24\x46\x97\x41\xb9\x29\xda\xbc\x61\xc9\x24\x38\x39\x4f\x4f\x7a\xfe\x82\x7d\x73\xf3\xb5\x89\x3c\x78\xfb\x51\xd1\x0c\xc1\x81\x33\x70\x75\xb5\x5b\x6a\xa6\xc5\xcc\xd7\x58\x4b\x9d\x23\xbb\xe3\xd6\x5d\x43\x81\x99\x72\x59\x7d\x36\x15\x67\x3f\x74\x35\xee\x77\xde\x47\x2f\x9d\x42\x71\xe0\x0c\x34\x9f\xe3\x73\xe1\xcc\x74\x62\x28\xc7\x74\x9a\x7e\x6a\x57\xa0\x79\x73\x83\xe0\x09\x8f\x2d\xb3\x35\xba\x90\xaf\x44\x37\xb3\x0f\x1d\x32\x03\x50\xdc\xd1\x7d\xc0\xe4\xcf\x19\x80\x3a\x79\xfe\x2e\x03\xc9\x92\xe7\x34\x36\xbc\x14\x08\xa2\x70\x97\xa4\x0c\xaa\x0d\xc9\xb9\x22\xe3\xe6\x0d\xee\xaf\xda\x3c\x9e\xf1\xe0\xb0\xbe\x15\xfd\xf9\xe8\xe7\x21\x10\x1c\x38\x03\x71\x23\x81\x07\x6b\x11\xe6\x23\x05\xb1\x3f\x08\xa7\xe7\x3d\x18\x16\x0a\x15\x1c\xd8\xda\x2d\x75\x3e\x1d\x52\x57\x26\x99\x86\x1e\xed\x31\x50\x1c\x38\x03\x9d\xab\x34\x26\x37\x66\x56\x6b\xa3\xae\x5e\x8e\x3d\xa3\x5d\xb4\xc3\x9e\xf0\xd5\x74\x7a\x86\x35\xb6\x68\xe2\x74\x39\x45\x1b\x99\xd7\xd1\xab\xdc\x10\x1c\x38\x03\x5a\xfb\x57\x1d\x34\xa9\xc9\x37\xae\xaf\xb6\xba\xeb\x58\xed\xed\x6e\x98\x36\x76\x3d\xf4\x9c\x8b\x8f\xfd\x1c\xe3\xf9\xe5\xcd\xc2\x51\x81\x0d\xc5\x81\x33\x70\xf5\xca\x81\x52\xec\x69\xb5\x6f\x72\x04\xbe\x7d\x51\x63\x00\xdd\xdc\xe4\xfa\xc8\x68\x47\xb5\x26\xd7\x33\xf8\x65\xf3\x90\x9d\x25\x64\x06\xa0\xb8\xa3\xfb\x00\x44\x61\x03\xf5\xec\xfe\xfb\xc2\x46\x0a\x83\x7b\xe0\x60\xdf\x31\x74\x6a\x6c\xe8\xa9\x6b\xe2\x95\xc5\x42\x4c\x45\x9f\xc6\xb3\xe1\x14\x22\x53\x1f\x48\x76\x2a\x69\x7f\x20\xcb\x0f\x28\xee\x64\x61\xb3\x57\x71\x93\xcc\x52\x5f\x40\x7f\x1f\x8f\x60\x6c\x4a\x8a\x6e\x33\xc2\x3e\xfd\x15\x36\x9e\x07\x93\x92\x46\x01\xe5\x97\x64\xf3\x7c\xe4\x64\x28\xce\x4f\x06\x0d\x07\x54\xd8\x9c\x5e\x4e\xc0\x76\xb6\xb8\x5b\x6f\xf9\xa5\x85\x70\xf6\xe6\xcd\x71\x31\xf9\x9f\xc4\x54\x02\x22\x7d\x8f\x39\x84\x1f\x52\x99\x06\x1d\x15\x36\x10\x9c\x9f\x0c\x0c\x74\x35\x02\xe9\x17\x6f\x51\xda\x6e\x46\x3c\x5e\x8d\x1b\x6d\x0a\xa1\x39\xc8\x11\x73\x61\x79\x6b\xcb\x11\x20\xf8\x1d\xe3\x6b\x91\xd7\xd3\x70\x64\x61\x03\xc5\xf9\xc9\xa0\xd1\xa1\xfd\xa3\xb0\x81\x12\xf5\x1f\x2f\x6c\x66\xa7\x9c\xac\x9a\x6b\xa4\xaa\x71\xed\x89\xaf\x29\x0f\x11\x9e\x95\xad\x77\x5f\x4b\xfc\x96\x3e\x6c\x79\x73\xfb\x73\x6c\x7f\x6f\xdf\x31\x34\x6d\x59\x26\x2b\x20\x80\xc5\x38\x64\x60\xbd\xad\x24\x4a\x4b\x5e\x90\xee\x4e\xc7\x72\x35\xad\x21\x82\xbf\xa1\xb4\x7e\x4e\xf2\xc1\xff\xb5\xc2\x06\x6a\x69\xc7\x1d\x36\xe0\xc2\x26\xbc\xae\x98\xfc\x1d\xe7\xf3\x3e\x8a\xce\x81\xe7\x8a\x94\xba\xa2\xc9\x5d\x1f\x7c\x63\x84\xe5\x84\x18\x49\x57\x5e\xc2\x5a\xce\x9a\xfe\x8d\xc2\xa6\xee\x44\x61\x33\x77\xa9\x9c\xcd\xbb\x14\x57\x55\x33\x3a\x5e\xf2\xc9\x0a\xa3\xa6\x1d\x61\x8f\xf6\xea\xb5\x8c\x4b\x05\x59\xbc\x23\xcd\x17\xb6\xa6\xfe\xca\xcb\x1f\x27\x0b\x1b\xcb\x87\xad\xbb\x5d\x81\x99\xdc\x4e\x77\x73\x9e\xac\xeb\x58\x7f\xc0\x88\xac\x2a\xfb\x2c\x4f\x62\x11\x6e\x51\x98\x37\xc1\xfd\x6e\xfd\xaf\xbc\xea\x72\xb2\xb0\x29\x37\x9f\xd2\x59\xdb\x15\xdd\xf4\x57\x93\xd9\x53\xeb\x16\x95\xe9\x48\x13\x55\x75\xb4\xea\x90\x0c\x1e\x4e\xe6\x10\x7c\xfa\x8c\xfb\xaf\xac\xf6\x64\x61\xe3\x11\x4a\xe8\x66\xd4\xb1\xde\xbd\x89\xe5\x9f\x70\x61\x68\x2e\x66\x3a\x45\x72\x78\x84\x27\xdc\xfe\xb4\xca\x5a\xc0\x9d\xce\xaf\xf1\x7f\x65\xb5\x27\x0b\x9b\xc7\x01\x97\x3d\x66\xcb\xdd\x3f\x97\x0a\x98\xc9\xde\x14\x18\xce\x70\x11\x15\xa5\x0f\xc8\x7b\xf5\x40\x0b\x13\xdf\xe9\x65\xc9\xc3\x67\x7f\xad\xb0\x81\x8a\xee\xef\xf6\xe7\x8a\xef\xea\x7e\x95\xfe\x11\x22\x3b\x6b\x7b\xba\x24\x61\xef\xab\x49\xa4\xb0\x4b\x02\xd7\xbe\x26\xd7\xa2\x9b\x7a\xe6\x31\x5d\x39\x2a\x56\xa0\x38\xf0\xfe\x2c\x81\x3d\x91\xce\x3f\x50\x1a\x6b\x43\x17\x90\xfa\xcd\x9f\x7b\x02\x6f\xce\xbb\xf4\x62\x97\x5e\xe1\x2d\x83\xb5\xa2\x46\xb5\xcc\xa3\x62\x05\x8a\x03\xef\xcf\xde\xef\x9d\x69\x3e\x44\xe6\x34\xc9\x2c\x09\x07\x5c\x2f\x28\x54\xea\xa6\x49\xbf\x5d\x31\xf7\xee\xa0\xf2\x1e\xe5\xc6\xe0\xc7\x48\x9b\xa3\x1f\xd8\x42\x70\xe0\xfd\x59\x5e\xf6\x3c\x9d\x02\x8f\xef\x41\xba\x78\x92\x34\xb6\xb3\xa4\x1a\x06\xd7\x8d\x56\xcc\x56\x6e\x0b\xa5\xef\xe2\xab\xcb\x2f\xb6\xa9\x90\x73\xa1\x38\x3f\x29\xa2\x7f\x5c\x87\x1d\xc7\xf2\x15\x0b\xdc\x1f\x1d\x00\xe1\xfc\x43\x83\xb2\x31\x6b\xa1\xf9\x17\x07\xe8\xcc\x31\x61\x83\x9d\xb9\xd9\x70\xbe\x84\x3d\x64\x61\x03\xc5\x1d\x39\x6c\xfe\x58\xd8\x40\xdd\x46\x7e\x97\x80\xf1\x4f\xc5\xd2\x25\x92\x25\x9a\xbe\xd8\xb0\x28\x0c\xff\x6f\x59\xd6\xef\x8a\xec\x66\xd1\x3d\xc7\x0c\xdd\x0b\xc2\x62\x2c\x11\x75\x47\xef\x14\x43\x70\x27\xde\xb0\x59\x88\xa2\x37\xcf\xd4\x72\x6f\x97\xa3\x46\xcb\xb9\x41\xda\xaa\x2a\x1c\x2d\xde\xbf\x3e\xf5\x81\x38\x95\xfe\x05\xdf\xf9\xbe\xd3\x47\x4f\x3e\x10\xdc\x09\xe3\xec\x6d\x23\x25\xf6\xed\x77\xf3\x9e\x73\x8f\x23\x7f\x08\x1e\x62\xc8\x0d\x47\x30\x44\xee\x93\xdb\x8b\xac\x58\x91\xa1\x45\x99\x1f\x9d\xd0\xa0\x38\x70\x02\x72\x1f\x93\xbe\xc8\xad\xc9\xdc\xc2\x8c\x12\xff\x76\xd9\xd0\x85\xd3\xe5\xd9\x67\xef\xfd\x98\x96\xef\x55\xea\x4a\x55\x41\x77\x28\x0e\x8e\xde\x34\x82\xe0\xc0\x09\x00\x80\xbc\x33\x61\x81\xbc\x3f\x7e\x66\x7b\x3d\x30\x54\xe8\x26\x9a\x7a\x69\x1b\x96\x69\xe4\xb2\x4f\xeb\xa0\xc9\x17\x32\x5e\x2a\x8f\x2c\x6c\xa0\xb8\x23\x87\xcd\x9f\x0b\x1b\xa8\x5b\xfa\xef\x22\xf0\xa8\x6a\x26\x33\x46\x3f\x7f\x0c\xc3\x43\x72\x97\xe8\x1c\x9b\xa7\xcb\xd3\x4f\x9d\x3f\x16\x94\x6d\xa4\x1e\xf0\xd4\x14\x9c\x65\x3a\xfa\x8a\x11\x14\x07\x8e\x40\x55\x1d\x07\xbe\xd6\x92\x9d\x67\xd0\xc8\xe9\x86\xf3\xef\x86\xdd\xe6\x86\x1d\xba\x1d\xd9\xd2\xde\xe3\x87\x63\x27\x5e\x11\xda\x3b\xfa\x69\x2d\x14\x07\x8e\x00\xec\xc2\x58\x0b\x65\x13\x85\x50\x73\x04\xf9\xc7\x7e\x85\x1e\x89\xb3\x5f\x3d\xbf\xaa\x52\xda\xba\x17\xf6\xfc\xe8\x17\xd4\x4f\xdb\x41\xce\x85\xe2\xc0\x11\xa8\x59\x27\x02\xce\x1b\x37\x06\x56\x47\xb9\xae\x16\xbb\x62\xac\x7f\xf9\x1a\xcc\x20\xe5\xd7\x87\x89\x93\x26\x08\x1b\xba\xa0\x47\x71\xf4\x96\x09\x04\x07\x8e\x80\x66\x63\x98\xeb\x07\x71\x6a\xb2\xea\x53\xb9\xd6\xc9\xf5\x41\xb9\x32\x8f\x3e\x5d\x8a\x0c\xa6\xb4\x90\x7b\x79\x3b\xfe\x5c\x97\x15\x1f\xf2\x90\x0e\xc5\x1d\xb9\x2b\x20\x0a\x1b\xa8\xfd\xf5\x77\x19\x58\xc0\x7e\x54\xef\xa8\x37\xa2\xdf\xf2\x46\x40\x50\x40\x6c\x59\x61\x82\xb8\x82\xdc\xcb\x6a\x48\xf2\x50\x15\x73\x8a\xf2\x6e\x5e\x26\x72\xed\x50\xdc\x89\x8d\x40\xa2\xa9\x52\xf4\x22\xbb\xcd\xa7\x68\x1e\x62\x18\x0e\xef\x0b\x31\xfe\xf2\xcc\x67\x84\xf9\x4e\x29\xa7\x8d\xb6\xbc\x3d\x0f\x5e\x1c\x6d\x04\x10\x1c\x38\x03\xa1\xd7\xe2\x79\x6d\x26\x42\xef\x9c\xb5\x24\xf0\xb2\xbf\xb8\xc7\xce\x71\xfe\xcb\x23\x6b\xaa\x33\xae\x31\x6f\x0b\x9e\xce\xf0\xb2\x1c\xf5\xc1\x50\x1c\x38\x03\xa3\x03\x73\x7b\x38\x4d\xaf\xc2\x2a\x23\xf4\x63\xb7\x00\x8b\x99\x3e\x85\x0f\x5b\x96\x1e\x2f\x3a\x2a\x89\x9c\x9c\x33\x09\x06\x8f\xbe\x0e\x03\xc5\x81\x33\x10\x36\xd8\xd8\xf4\x9c\x9c\x3e\x5b\x68\x80\x56\x3d\x44\xee\xde\xc5\xa4\xc8\x1a\x8b\xd2\x72\xef\x02\xb8\xb4\xdc\xe7\x5e\x07\xed\x78\x64\x06\xa0\xb8\x23\x77\x05\x44\x61\x03\x75\xd8\xf9\x5d\x06\xfc\xac\xbe\x5c\x99\xc7\xca\xef\x2b\x38\x8b\x08\xc2\x60\x1e\xa9\x31\x2f\x71\x89\x0e\x0a\xb0\x8c\x7b\xe0\x8f\x20\xd1\xaf\x71\x3f\xfa\xbe\x31\x14\x07\xce\xc0\xfb\xea\x70\x92\x35\x44\xe9\x97\x75\xd6\x90\xaf\x84\x85\xcc\xbb\xde\xde\x53\x89\xa3\x0e\xd3\x87\xd3\x63\x58\x5c\xfc\x57\x7d\xcf\x21\xe7\x42\x71\xe0\x0c\x38\x22\xd6\x65\xce\xc9\x99\x78\x16\x76\xac\x34\x05\x7c\xe1\xbe\x82\x15\x3b\xfd\x3a\xe0\x65\xb7\x71\x63\x1e\x63\xf5\xd5\xba\x90\x23\xa9\x39\x14\x07\xce\x80\x8e\x4b\xb0\x9c\xfb\x59\xa1\xa4\x2f\xad\x4f\x17\xf1\xc3\xd8\x2f\x2b\x33\x8c\x04\xd5\x24\xfa\x1f\x8e\x98\x85\x2a\xa6\x39\xcb\x48\x23\xe7\x42\x71\xe0\x0c\xa4\x7a\x32\xdd\x5c\x6c\xb9\xb3\xa4\xcf\x5a\x22\x5c\x28\xa1\xd6\xa3\x74\xde\x05\xbe\x5f\x4c\x9f\x0f\x27\x6e\x8f\xb9\x92\xd6\x3f\x88\xcc\x00\x14\x77\x74\x1f\x80\x28\x6c\xa0\x4e\x9e\xbf\xcb\xc0\x5c\xbb\xc7\x0b\xbb\x9d\xec\xb9\xf3\xcc\xac\xfb\x53\xac\x17\xf0\xf3\x3d\x27\x17\xc4\x07\x0e\xd7\x48\x17\xa7\x67\x33\x03\xdf\xc0\x91\x6b\x87\xe2\xc0\x19\x90\x4b\xf9\x68\x06\x10\x39\x9d\xf7\x54\x95\x60\xb9\xa9\x62\xcc\x79\xf9\x93\x4f\x07\x66\xe1\xd0\xd3\x2b\x09\xb2\xf0\xb3\xbd\xcc\x47\x8e\x2c\x28\x0e\x9c\x81\x76\x3e\xc3\x5b\xc3\x36\x26\x11\x26\x63\x97\x9e\xbf\xf2\xd6\xbe\x2e\xf5\x26\xe8\xad\x6a\xe8\x90\x30\xb1\x45\xbd\xae\xca\xf8\xf2\xd1\x2f\xcd\x80\xe2\xc0\x19\x70\x6f\x54\xc7\x08\xab\xf3\x3c\x77\x9d\xac\x74\x5b\xe6\xfc\x6c\xb0\xf7\xdd\x44\xaa\x20\x0b\xe1\x28\x43\x05\xa3\xf4\x57\xa2\x09\x64\xc8\xb9\x50\x1c\x38\x03\x46\xb0\x84\xea\x91\x37\x01\x64\xb9\xb8\x8a\x42\x3e\x33\xe6\x3d\x2c\xab\xcf\x44\x93\x87\xd0\x3e\x2b\x93\x09\xc6\xbf\x4e\x59\xfd\x80\xcc\x00\x14\x77\x74\x1f\x80\x28\x6c\xa0\x9e\xdd\x7f\x5f\xd8\x44\xce\x28\xc8\xec\x48\x69\x33\xdf\x18\x4d\xf9\xe4\x2e\xe4\xfb\xd8\x80\xf4\x82\xf7\x61\x44\x11\xcb\xfe\xc8\xfa\xe1\xb9\x48\xe7\x4a\x64\xf9\x01\xc5\x9d\x2c\x6c\xd8\xd3\xa8\xcf\xbe\x50\xe0\xfe\xae\x50\xfa\x5d\x55\x5f\x0b\x1e\x3c\xb2\x45\xaf\x39\xe2\xe0\xb0\x1d\xb7\x96\x1d\x6d\xbe\x65\x78\xf4\x95\x28\x28\xee\x64\x61\x23\x37\xe8\x86\x21\xfe\xa2\x6a\x7c\xda\x6a\x5c\x30\xae\xfd\xc5\xf3\x5e\x66\xd1\x03\x35\x49\xcb\x61\x5a\x9c\x1e\x75\xdd\xe7\xe2\x5e\xc8\xc9\x50\x9c\x9f\x0c\x26\xe8\x6a\x84\x1b\xdb\x8c\x7d\x1c\x49\xd5\x77\xf3\x69\x2a\x77\x10\xf0\x4d\x7d\xff\x71\x95\xf4\xd1\xa1\x1e\x29\x97\x48\x50\xa2\xee\xe1\xd5\x2e\x64\x61\x03\xc5\xf9\xc9\xa0\xa1\xff\xb3\xb0\x81\xfa\x75\x89\xc7\x0b\x1b\x8a\x6b\x9b\x34\xc4\x02\xd8\xc6\xe2\xf1\x5b\x42\x8b\xbc\x33\x33\x3c\x7b\x8f\xfb\xdd\x77\xee\x99\xc7\x68\xb1\x95\x13\xaf\xcb\xc8\x1e\x43\x39\x3e\x98\x77\xcd\xe6\x17\x71\xbd\x5e\x79\x97\xe4\x41\xb1\x7e\x8f\x98\x76\xd6\xf9\xb6\x5a\xed\x05\xa9\x49\x47\x3a\xb7\x01\xdc\xa9\xff\x6b\x85\x0d\xd4\xd2\x8e\x3b\x6c\xc0\x85\xcd\xe3\x4f\x25\xc1\xeb\xa4\x8e\x88\xc0\x53\xaf\x8d\xe8\x08\x0a\xd0\x18\x6e\x35\xf8\x70\x0c\xdd\xce\xbf\x33\xf2\xe2\x94\x1e\x59\xd1\xdf\x10\xe2\x4a\xa3\x29\x83\x1f\xea\x43\x43\x37\x99\xbb\xaf\x9c\x0f\x66\x27\x87\x15\xc0\x64\x76\xf5\x12\x37\x3d\x08\xe4\xf9\x0c\xcb\xe0\x52\xd7\x93\xeb\x56\x02\x65\xfe\xca\xcb\x1f\x27\x0b\x9b\xf2\xc3\x32\x2f\x85\xd7\x18\xac\xbe\xb6\xaa\x71\x95\x62\xe6\x82\xd8\xf7\xe2\xe9\xaa\x49\x6f\x9f\x16\x73\xa6\x6d\x6d\xb7\x1b\x6d\xfd\x2b\xaf\xba\x68\x9d\xf8\xd8\x7d\x71\x25\x6a\xfb\xb2\x27\xb6\xac\x13\xc6\xa3\xe7\x08\x83\xaf\x7c\xc9\x6f\x12\x73\xdf\x22\x4e\xd9\x7f\xb2\x98\x69\x10\xeb\xf9\x17\xbe\x24\x14\x26\xe3\x73\xb2\xb0\xa1\x5a\x7b\x5d\x8f\x76\x20\x32\x1b\xdc\x29\x1e\xbf\x09\xb7\x99\x60\xad\x94\x96\x4d\xe0\xa3\xe7\x96\x8a\xc4\xd5\xa2\x18\x6b\xfa\x0b\xaf\xba\x84\xc9\xa0\xb9\x9f\xf8\x58\x39\xde\xcd\x65\xfc\x9e\xda\x9e\x22\x4c\xe5\x8a\x7d\x65\xaa\x57\x0f\x22\x65\x33\x0e\x82\xc8\xf6\x2d\x3d\x56\x2b\xa5\xf9\x4b\xcf\xfc\xb5\xc2\x06\x2a\xba\xbf\xdb\x9f\x95\xc2\xa8\x55\xf2\x61\x4b\xc6\xba\xa9\x11\x8f\x00\xed\xda\x8b\xf7\x6f\xfa\x12\xc8\x7f\xc1\xcb\xcc\xbb\x61\x24\x4a\x8e\xc3\x7e\xa4\x9c\x85\xe2\xc0\xfb\xf3\x3b\xa6\x91\x77\x29\x9f\xb1\xf6\x29\xb8\x99\x3a\x65\xa6\xf1\x4b\xbe\xf3\x65\xd3\x8a\xf5\xef\xbe\xe9\x1f\x4d\x31\x25\xc6\x36\x5b\x40\xce\x85\xe2\xc0\xfb\xf3\x33\x1e\xbe\xaa\x56\x97\x96\x37\xcf\x83\x2f\x72\xd0\x57\x3b\x4f\xef\xc6\xca\x7d\x15\xfe\x54\x99\x8a\xc3\x34\xfe\x2c\x98\x99\x3b\x09\x39\x17\x8a\x03\xef\xcf\xf3\x83\x99\xfd\x0b\x71\x36\xc5\x4c\x1c\x5d\x8d\x1d\xfd\x6e\x4d\x4e\x1f\x69\x25\xe3\x9b\x77\x55\x10\x07\x95\x52\x5b\x15\x2d\x47\x3f\xb0\x85\xe2\xfc\xa4\xfe\x29\x98\x77\xfb\xee\x89\xbe\x66\x9d\x44\xe7\x83\xe1\xc9\x5d\x88\xde\xa0\x1b\x1f\x18\x3b\x21\xb3\x8b\x69\xb4\x5b\xd4\x35\x1c\xd2\x36\xb2\x88\x2c\x6c\xa0\xb8\x23\x87\xcd\x1f\x0b\x1b\xa8\xdb\xc8\xef\x12\x70\x55\xcc\x21\xb3\x3f\x89\xcf\x5e\x43\xaa\x32\x95\x91\xeb\x8d\x18\x60\xac\x72\x71\x87\xc8\x95\xf1\x52\x74\xd2\x92\x04\xa5\xe2\xd1\x09\x0d\x8a\x03\x27\x00\x4e\xde\x16\xd4\xe1\x0a\x14\x2b\x08\xd7\xce\x92\x76\x0b\xe0\xda\x3d\xb9\x8f\x97\x33\x82\xa1\x9e\x77\x48\xf2\xf9\x3d\x43\xd3\xd1\xaf\x9b\x80\xe2\xc0\x09\x70\xa5\x91\x2f\x4a\x19\x8d\x8a\xa3\xd9\x2a\x5b\xe1\xbb\x7f\x76\x30\xea\x09\xde\xb8\x31\xdf\xd7\xed\x7a\xd7\x4f\xf7\x30\x5a\x0e\x8f\x74\xd6\x50\x1c\x38\x01\x2e\x9b\x0b\x0d\x6d\x99\xb6\x0a\xbd\x22\x26\x79\x2a\x9a\x67\x56\x48\x67\xc3\x2f\x30\x16\xf7\x58\x24\x78\x8a\x1c\x72\x0e\x98\x1d\x7d\x1f\x00\x8a\x03\x27\x80\xaf\xdd\x45\x9c\x79\x6c\x9e\x39\xc5\xbf\x19\x4d\x44\xc6\x72\xa3\x86\xde\xb2\x43\xe9\xc0\xf4\xa5\x81\xea\x79\x21\x57\x5d\xe6\x1a\x64\x61\x03\xc5\x1d\x39\x6c\x94\xff\xfc\xb0\x0e\x71\x4b\xff\x5d\x04\xa8\x82\xfb\x64\xbe\x2d\xab\x3a\x0e\xbe\xda\x2e\x98\x91\xbc\x55\xfa\xd3\xd2\x45\xb6\x72\xf1\xd2\xda\x99\xfb\x69\xd9\x9c\x3e\xf9\x6a\xc8\xa5\x43\x71\xe0\x08\x98\x88\x9a\x5b\xf6\x61\x96\x89\x8b\xef\x2c\x51\xfc\xc8\x96\xcc\xb3\x37\x13\xcb\xb9\x8a\x88\xc2\x54\x76\x2b\x8a\xeb\x9a\xcc\xc1\x3a\xfa\x89\x3d\x04\x07\x8e\x80\x69\xb5\x50\xd5\x87\x77\xe5\xd8\x19\x82\x1f\x5e\x47\xbe\x42\x04\x5a\xef\x51\x1b\x22\xde\x78\x2d\xd1\xbc\x2b\x1e\xd7\xba\x7e\xe6\xe8\xa7\xb5\x50\x1c\x38\x02\xb1\x39\x44\xb2\x42\x03\x58\x62\x77\x0c\xa6\xc9\x23\xb0\xb4\xde\x7e\xcf\x4f\xd8\x5d\xb4\x23\x2a\x57\x6d\x0f\xe3\x1f\xb4\x52\x2d\x42\xce\x85\xe2\xc0\x11\x60\xb7\x9f\x52\x49\x7e\x31\x72\xf8\x86\x27\xf3\xd0\x0c\xfb\xb3\xb7\xe6\xdb\x4b\x4e\x44\xf8\xd9\x15\x80\xd9\x6c\x46\x9e\xda\x52\x31\xf2\x90\x0e\xc5\x1d\xb9\x2b\x20\x0a\x1b\xa8\xfd\xf5\x77\x19\x88\xf5\x46\x27\x92\xb7\xe6\xd3\x52\x54\xd9\xbb\xd9\x9a\xc2\xbd\x1a\xf6\xbc\x37\xf9\x5c\x92\xb1\x43\x91\x14\xcd\xdd\x18\xf1\xe2\x23\xc9\x26\x14\x07\xce\xc0\x37\x2d\xbf\xb7\x3f\xf3\xb5\x16\x12\xcc\xce\x22\xe2\x5d\xea\x5f\x14\x6b\x3d\x49\xa1\xeb\xac\x92\xc8\xae\x19\x49\x7a\x81\xd3\xd8\x8f\x9c\x0b\xc5\x81\x33\x10\xa5\x9c\xac\xdf\x2e\x28\xb9\x28\x72\x79\x9e\x5e\x23\x49\x3c\xf4\x26\xf3\x61\x94\x35\x3d\x2e\x6b\xc7\x59\x7e\x56\xe3\x3b\x9d\xe3\xc8\xb9\x50\x1c\x38\x03\x64\x46\x24\xc4\x1f\x5f\x0e\x47\x55\xda\x93\xab\x94\xaa\xaf\xf6\x8c\xf4\x84\x04\x1b\xdf\x0f\xa8\x9d\x5c\x5a\x6c\x12\x99\x8f\xb2\x3a\x12\x65\x43\x70\xe0\x0c\x28\x70\x37\xb0\x38\x74\x71\x66\x32\x17\x8f\xbf\xdf\x1c\x51\xf6\x18\x5e\xcd\xac\xed\xc9\x8d\x3c\x65\xba\x69\xdb\xd3\x51\xb4\xcb\x70\x24\x9e\x86\xe0\x8e\xdc\x15\x5a\x7f\xce\x00\xd4\x61\xe7\x77\x19\x38\xe0\x67\x6e\x8c\xe5\x1c\xa7\x39\x78\x25\xf0\x3a\x24\x3f\x7f\x27\xd5\x98\x43\x5c\x8a\x00\x31\x03\x1b\x75\x23\xcb\xec\x1e\xb1\x44\xae\x1d\x8a\x03\x67\x80\xa1\x0c\x7d\xfe\x8c\xe3\x68\x5b\x41\x70\xed\xce\xa7\xf8\xd7\xab\x92\xa7\xa7\x72\x5b\x83\x66\xec\xbe\xff\x10\xba\x93\x61\xf8\xf3\xe8\xad\x25\x28\xee\xc4\x6f\x08\x4a\xef\x7b\xd6\x73\x65\x22\xf3\x94\x4e\x47\xb3\x9d\x62\xee\xa7\xcc\xd5\x80\x2d\x5e\x19\x01\xbf\xb7\xd7\x18\x5e\xeb\x2a\x3c\x0d\x47\xce\x85\xe2\xc0\x19\x28\xe9\x59\xba\x94\xb4\x31\x6e\x36\x76\x6d\xef\x1a\xb7\x4a\x61\xdb\x06\xfa\x64\xab\xc0\x19\xc5\x67\xf9\x9f\x8d\xf3\xd1\xcc\x49\x22\x90\x73\xa1\x38\x70\x06\xbe\x53\xfc\xff\x98\x3b\xab\xb0\x2e\x9b\xae\xed\x83\xa2\x34\x52\x4a\xa7\xb4\x34\xd2\xdd\xd2\x25\x8d\x80\x74\x29\x25\x48\x4b\x77\x19\x28\x22\x88\x34\xd2\x21\x20\x8d\x20\x48\x87\x94\x84\x74\x89\x28\x0d\x2a\x08\xdf\xf1\x7c\xcf\xf1\xbf\x5e\xef\x0b\x5e\xe7\xdd\x60\xe3\xde\xff\x1d\x0b\xe6\xe2\x64\xd6\x9c\x6b\x66\xd6\xac\x60\xee\xee\xfc\x4c\x60\xcd\xdb\xb3\x8a\x74\xba\x15\x55\x5c\x5d\x37\x4b\xed\x75\x6b\x24\x59\xd0\x9b\x2f\x96\xd9\x7e\x14\xa1\x01\x10\x07\xcd\x03\x80\x82\x0d\x68\xe5\x79\x6a\x3f\xb3\xa2\x88\xf5\xfd\xbd\x8e\xa9\x04\xec\xe9\x7b\x06\xe4\x61\x99\x6f\x70\xf1\x3e\xd2\x32\x2a\x76\x46\x63\xa0\x05\x71\x3d\xf6\x84\x72\x01\x88\x83\x6b\xa0\x33\xac\xf0\xbb\xb9\xa6\xfd\xe0\xb7\x67\x77\xb0\xe3\x3f\x36\xe0\xe3\x8d\x7a\x11\x68\x5e\x5b\x60\x64\x6c\x98\x62\xfb\xb6\x7b\x25\x03\x11\x17\xc4\xc1\x35\xb0\x46\x74\x7b\x98\x97\x93\xdd\x36\xb4\x5a\x3c\x8e\x71\x1b\xbf\x6d\x72\xff\x42\x35\xfd\xac\xbc\xb6\xe8\x3c\xb1\xa9\x4f\x0b\x3f\xd4\x80\x1e\xc4\xc1\x35\x60\x87\x99\x6d\x11\x65\x8c\x1b\xe7\x77\x91\xb0\x58\xfb\x76\x9d\x1a\xe5\x82\x6a\xbd\x4d\xd0\xc8\xb3\x9d\x35\x86\x35\xef\x09\x07\xa8\x10\x04\xe2\xe0\x1a\x88\xf8\x2c\xf2\x29\xb8\x98\x4f\x95\xca\xda\x57\xeb\xab\x73\xfd\xfe\xb8\xf3\xad\xdf\xef\x4a\xd0\x7c\xd2\xd4\xb2\x74\x7a\x34\xf2\xe9\x10\x1a\x00\x71\xd0\x3c\xe0\xfd\xf7\x82\x0d\xc8\xbb\x9f\x5e\xb0\x21\x0b\xac\x4d\x4b\x64\xac\xd0\x7d\x4d\x17\x23\x64\x8e\x79\x65\x2d\x8c\xfd\xd1\x58\x46\x80\xe6\x66\x4e\x7c\xe0\xc5\xe6\x8e\x17\xc1\x88\xe2\x07\x88\x3b\x59\xb0\x71\xa7\xea\xf9\x64\xe3\x41\xb3\x38\x76\x5e\xc3\x5e\x74\x2c\x28\xd6\xbc\xf3\xce\x43\x89\x1e\x3d\xf9\x8e\xba\x5e\xfa\x75\x76\x97\x35\x44\x64\x10\x77\xb2\x60\xc3\xf2\x43\x11\xeb\x0d\xd2\x47\xcb\xa8\x9b\xe6\xe3\xe9\xd8\x16\xa6\x37\xb7\x34\x2c\x32\x31\xfc\xda\x78\xe8\xfb\x6e\x34\x6c\x1f\xb8\x43\xa5\x20\x00\x17\x24\x83\x0b\xfb\x1a\xb5\x55\x95\xaa\x6e\xb9\x95\x6f\x42\x04\x1e\xad\x65\x2c\x6b\x5e\xaa\xf9\xd0\xf8\x4a\x74\x0c\x29\x87\xe0\x97\x7f\x98\x6b\xe7\xe8\x3c\xa2\x60\x03\xe2\x82\x64\xa8\x91\xfe\x59\xb0\x71\x75\xc6\xf8\xf6\xad\xf6\xb8\xde\x26\x44\xe7\xfb\x8a\xbf\x21\xdd\xdb\x3b\x55\x56\x6c\xfb\x8f\x1f\x33\x11\xcb\x8c\x46\x89\x7e\x78\xf0\x67\xc1\x26\xe2\xf6\x65\xe6\xfa\xef\xaa\x11\x55\xd1\xdb\xf7\x3c\xb7\xc7\x9e\x7f\x65\xb0\x30\xde\x17\x38\x3f\xde\xd7\xfb\xfb\x71\xc5\x1e\xff\x9f\xa7\x2b\x4c\x3e\x19\x79\x71\xec\x0d\xd6\xd1\x17\x87\x4c\x0f\xff\x0e\xf4\x54\xe3\x8d\xb5\x55\xb8\x18\xe1\x28\x90\x94\x1f\x23\x59\x19\x5a\xf1\x6f\x2b\xd8\x80\x86\xf6\x67\x0f\x1b\x78\xc1\x66\x9e\xdd\xe6\x67\x85\xf4\x2f\x93\x8d\x2f\x3b\x1f\xf9\x89\x37\x6e\xae\x0a\x54\x86\x0a\xbd\x11\xf0\x9f\x70\xe8\xf9\x1e\xdd\x9b\x1d\x74\x16\x05\x1b\x89\x13\x05\x9b\x83\xac\x66\x53\xaf\x2c\xef\x95\xf3\xaf\x45\xa7\xe3\xa9\x6f\x72\xc5\xbd\x5e\xb8\x34\xc6\x45\xa5\x48\x47\xc8\x8f\xd7\x1e\xd3\x8d\x71\x26\x87\x3f\x4e\x16\x6c\x5c\xa2\xa7\xfa\xc8\x9f\xb4\xc5\x8a\x67\x26\xa6\x11\x53\xb8\xc4\xbc\x78\x45\x77\xb9\x8b\x82\x68\x16\xef\x92\xa7\x17\x0f\x45\x92\xe1\x99\x1c\x75\x39\x59\xb0\x19\xa9\xdf\xf2\x36\x9d\x61\x4b\xdc\xf9\x89\x62\x7b\xf3\xb9\xfe\xe0\xac\xb2\x77\xde\x97\x57\xdf\x2a\x22\xec\x09\x6f\xf8\x58\x5c\xe7\x3e\x93\xd1\x9e\x2c\xd8\xb4\xfc\x88\xea\x8f\x9b\xb8\x35\x1b\x11\x43\x3c\x13\xa0\x86\xee\x2c\x91\xe5\x14\x41\x19\x2c\x8d\xd9\x5c\xcd\x2d\x3c\x35\x58\x90\x72\x26\xa3\x3d\x59\xb0\x21\x1c\xc8\x8c\x0c\x54\x18\x9b\x70\xcc\xb9\x63\x17\xf6\x59\x53\xeb\x9c\x6c\x59\x68\x23\x3e\x51\xc0\x93\x1e\x56\xe1\x0e\xf2\x7a\xa7\x33\x2b\xd8\x80\xa4\x7b\xea\xe3\x20\xef\x2a\x9f\x1f\xcd\xd0\xd6\xfa\x2a\x64\xdc\x50\xe3\x54\xb2\x13\xc2\x64\x5e\x35\x4e\xb0\xcd\xb9\xb0\x33\xdc\x30\xc9\x57\xf1\x11\x91\x97\x40\x1c\x3c\x3f\x13\x45\xd5\xfc\x2a\xd3\xa2\x7f\xe4\x13\xdf\x7f\xc1\x4e\xae\x7c\x87\x71\x4f\xa2\x49\xc1\xf0\x5e\x21\xc5\xb6\x1c\xaa\x82\x26\xff\x73\x44\x5c\x10\x07\xcf\xcf\xe3\xaf\x47\x16\x26\x3c\x35\x42\x42\xb9\x53\x7f\xd7\x10\x57\xaf\xd5\x5f\x13\x2f\x69\x1b\xef\x69\x1f\xae\xed\xe6\xf6\xdb\x30\x86\x3c\x20\x88\x83\xe7\x67\xf5\xfb\xb1\xde\x18\x6e\x65\x2a\xb5\xa8\xaf\xeb\xa4\x4c\x8f\x37\x5c\xf4\xe3\xd3\x1f\xd5\x4e\xa0\xb6\x5b\x92\x25\xb0\xa2\xb2\x7f\x47\xc4\x05\x71\xf0\xb8\x6a\x0f\x0b\x1e\x7a\xec\xd0\x12\xbc\xca\x2d\xca\x2c\xa5\x9e\xf1\x75\xf2\x5a\x8a\x7c\xa2\xe6\xc7\x7f\xa8\x42\x5e\xff\x48\x21\xea\x16\xa2\x60\x03\xe2\xa0\x1e\x36\x7f\x2d\xd8\x80\xa6\x91\xd3\x14\xc0\x12\x38\xed\xfc\x12\x6f\x02\xed\x36\xb3\xfb\xc1\xec\x61\xb8\x43\x64\xfb\xcf\x9f\x9b\x45\xca\x01\x06\xd4\x06\x46\x79\xb2\x59\x1b\x88\x91\x83\x38\xb8\x02\xa2\xb5\x62\x64\xfa\x45\xa4\x16\xda\x62\xcf\x9d\x8f\x7c\xe7\xcb\x12\xcf\xb1\xe6\xc0\xe7\xda\x7e\x8e\x96\xc3\x26\x39\x30\x3c\x78\x16\x11\x17\xc4\xc1\x15\x30\xb8\xb5\x1a\x87\x4f\x7c\x28\xd2\x12\xda\xda\x7e\x5b\x99\x7a\xae\x49\xbd\x58\x3a\x32\x82\xed\xb2\xb2\x59\x79\x52\xd3\xb6\x10\xb4\x4a\x07\x71\xf0\xbf\x94\x7d\xb1\xc8\x87\x01\x09\x7d\x0d\x59\x77\xda\x81\x79\xd6\xa7\x2b\x1a\x76\xc4\x62\x41\x2c\x78\x77\xef\x0c\xb0\xc4\x60\x31\x87\x41\x5b\x80\x20\x0e\x1e\x37\xa6\x26\x2f\xbb\x7c\xf9\xae\xff\x12\x1f\x86\xe3\xa7\x6f\xcc\x26\x2a\x25\xda\x6b\x17\x1f\x39\xa3\x70\x77\x54\xb0\xe0\x2f\x97\x1b\x21\x0a\x36\x20\x0e\xea\x61\xf3\xf7\x82\x0d\x68\x4a\x3f\x4d\x02\xc8\xee\x47\xf7\x28\x38\x5d\x4a\x39\x58\x8a\x18\x4b\xd9\xfd\xfb\xa7\xe6\xca\xd7\xca\xc4\xe4\x2b\x78\x31\x84\x5f\xdc\x78\xf8\x1a\xda\x59\x07\x71\x70\x09\xe4\x4c\x73\x6e\xb0\x35\x8d\x13\x1d\xdf\xda\xb3\xf8\xe8\xfb\xfd\xd7\xfb\x40\x3c\xeb\xb6\xaf\x5c\x55\x41\x2a\x9f\xf8\x17\x62\x8a\x20\xb3\x0e\xe2\xe0\x12\xb8\x91\x55\x90\xbb\xf3\x54\x3e\x62\xf5\x5c\x8d\xf2\x70\x2b\x4d\x7a\xc4\xe4\x7a\xe3\x4d\x34\xc6\x49\x1f\x56\x29\xa2\x2c\xf4\x72\xa8\xe1\x14\x88\x83\xff\xa9\xcc\xb3\x5e\x92\xdc\x3e\x56\x64\x32\x0e\xa6\x29\x71\xf3\x75\xba\xf5\x73\xea\x68\x4b\xe9\xaa\xfc\xdc\xa2\xae\x62\xe6\x87\x5b\x58\xd0\xd3\xfe\x20\x0e\x1e\xd7\xf6\x98\x1f\xfd\x85\x3e\x3f\xf7\x3b\x36\x8e\xc0\x2f\x13\xa9\x57\x23\x12\xd2\xa6\x4c\x7c\x53\x58\xba\x78\x91\x89\x2e\x9d\xef\x53\x41\x2c\xd2\x41\x1c\xd4\xbb\x02\x50\xb0\x01\xe5\xd7\x53\x7b\xd8\x8c\x30\xac\xd8\x50\xdd\x7e\xfc\xb2\xa3\x92\x71\x39\xbb\x5a\x4e\x0f\x33\x49\xf0\xf3\x23\x2e\x6b\x37\xfe\xb6\xde\xe9\x08\x24\xe8\xda\x0a\x88\x3b\xf1\x3a\x0c\xcf\x38\xd5\xb3\x8b\x15\x3d\x8f\xb5\x63\xa5\x87\x66\x67\x94\x03\x35\x42\xdd\x8f\x31\xb2\x16\x64\x04\xdf\xa2\x5f\xe7\x20\x82\x9e\x74\x06\x71\x70\x0d\x10\x84\x2d\x6f\x0b\x1b\xba\x10\xb1\xb9\x13\x67\xaa\xaa\xfa\x6d\x66\x55\x77\x52\x91\x52\x21\x71\x45\xf0\x12\x3c\x28\xb4\x98\x85\xee\xb0\x82\x38\xf8\xdf\x2a\xc8\x7e\x54\x0e\xcd\x37\xed\xdd\x7a\x4c\xce\xc1\xe5\x89\x9d\x4f\x68\x7e\xa2\x38\xe6\x2e\xe9\xd6\xaf\x53\xeb\x23\xf7\x7c\x7e\x42\xd3\x21\x88\x83\xc7\x7d\xeb\x96\xe1\x7b\xe7\xd0\x79\x76\x0b\x97\xe7\x61\xcc\x4b\xd5\xa7\x64\x98\xaa\x3d\x4b\x9e\x6b\x13\xc3\x86\xae\x05\x9d\xd7\x53\xd8\x10\x1a\x00\x71\x50\xef\x0a\x40\xc1\x06\xb4\xd8\x39\x4d\x03\x69\xd7\x1d\x3d\xd0\x82\xed\xbc\x74\x93\xf0\x04\x82\x9c\xaf\x8f\x95\x36\x7f\x89\xa0\xc2\x67\x31\xae\xbb\x9e\xb1\x45\xea\x29\x28\x8a\x18\x3b\x88\x83\x6b\x40\xef\x52\x82\xcc\x94\x85\x45\xf9\xcb\x2e\x22\xb7\x04\x14\xab\x49\xde\xd4\xb1\x9e\x25\x65\xaf\x8a\x6a\x64\xb1\xcf\xcf\xa2\xdd\xa0\x1e\x36\x20\x0e\xae\x01\xe1\xfe\x81\x17\xed\xf5\xed\x5f\xd8\x03\x0f\x66\x29\xdc\xd2\x1a\x8d\xc3\x07\x6e\xb5\x85\xc4\x39\x4d\xd9\x09\xfa\x99\x69\x70\xfc\x82\x7a\xcd\x00\xb8\x13\xa7\x2b\x88\xb3\xce\xef\xa2\xcd\xe5\xd8\xbf\x3e\x67\x45\xbc\xc1\x55\xcd\xa0\xb2\xf8\x85\xec\x65\xbc\x8a\xb2\x0d\x67\x37\x57\x86\xd8\x1a\x74\xba\x02\xc0\xc1\xe3\x36\x95\x0e\xd2\x60\x84\xe2\x58\xc8\x88\x4d\x05\x5c\xe3\x45\x4a\x1c\xc3\x4e\x0d\xbf\x95\xdc\xe0\xb5\x5f\xbb\xff\x3d\x60\x65\xbe\x11\xea\x61\x03\xe0\xa0\x79\x00\x50\xb0\x01\xad\x3c\x4f\xd3\x40\x98\x76\x48\x0b\x5b\xcd\x64\x1d\x8f\xa1\xda\x97\xe9\x26\x54\xe9\xf7\xcd\xbe\x13\x65\x3d\x98\x76\x93\x3b\xc9\x4a\xa4\x3e\xbe\x15\x88\xb1\x83\xb8\x13\x4f\xbb\x17\xf7\x68\x65\xa8\x6e\x97\xe0\xee\x04\x5a\x16\x2c\x7f\xc6\xdd\x3c\xae\x5a\x8d\xef\xe3\xfc\xb1\x27\xb2\xa6\x66\xe1\xc1\x2f\x82\x88\x0b\xe2\xe0\x1a\x40\x29\xaa\xf5\x7e\x60\x6f\x2b\x2e\x23\x20\xd6\xe6\xb4\x38\xee\x9e\x61\x54\x59\x42\xab\x9c\xcf\xf0\xf9\xaa\x49\xb3\xf2\x0f\xdf\x2e\x44\x5c\x10\x07\xff\x5b\x19\x9b\x87\xb5\x78\x9b\xa7\xe1\x3f\xbf\x8e\xb3\xf5\x6e\x96\x4f\x72\xca\x55\xa4\x51\x5f\xda\xf5\x26\x86\x51\x47\x1e\xea\x15\x15\x28\x17\x80\x38\x78\xdc\x84\x7c\xd1\xcc\xc1\x06\xba\x07\xc9\x79\x44\x6b\xa9\x12\x4b\x6e\x42\x56\x22\x98\xa8\x15\x02\x92\x77\x0e\xc6\xc4\x05\xcc\x5f\x0c\x21\x34\x00\xe2\xa0\x79\x00\x50\xb0\x01\x79\xf7\xd3\x0b\x36\x33\x3f\xdc\x59\xeb\xf1\xb5\x19\x76\x8c\xb0\x46\xcc\x6f\x15\xbd\xab\x22\xb1\x7c\x1b\x7e\x43\x5e\xaf\xfb\xd9\xd0\xeb\x08\x3b\xfa\x10\x44\xf1\x03\xc4\x9d\x2c\xd8\xa0\x15\xad\xca\xbc\xd9\xd1\xd7\xad\x19\x6e\xbf\x8d\x5e\xdc\x74\x67\x63\xd0\xd9\xf3\xed\xab\xeb\xd1\x18\x6b\xc3\xe4\x42\xdf\x2e\x34\x20\x22\x83\xb8\x93\x05\x9b\x39\xa6\xaf\xb8\xc1\x9b\xae\xca\x18\xb5\x4f\x07\x18\xd9\x82\x32\x59\x15\xe4\x13\x24\x8d\xbf\xe7\x65\x97\xe7\xba\xf0\x63\x1b\x97\x23\x22\x83\xb8\x20\x19\x09\xd8\xd7\x68\xea\x58\xac\x09\x3d\x4a\x32\x51\xb7\xdb\xe9\x9b\x1d\x96\x46\xe9\x1b\xe0\x18\xf5\x57\x89\xcf\x0b\xd1\xae\x12\xd6\xf9\x9a\xf6\x01\x51\xb0\x01\x71\xff\xfd\xce\x7f\x16\x6c\xd8\xab\xbe\x50\x77\x5e\x7c\x23\x24\xee\x4a\x86\x7d\x5f\xa3\x71\x36\xb5\xea\x46\x06\xfd\x2e\x69\x94\xb6\x9c\x7e\x85\x31\x73\xb2\xd4\x9f\x05\x1b\xc7\xc9\x6c\x0d\x8e\x64\xc1\x0f\x3b\x48\x41\x71\xd4\xd9\x25\x72\xe5\xf4\x3e\x6b\x36\x94\xe3\xb2\xb7\x4c\x23\x7a\x18\x5a\x3b\x49\xfe\x40\xf7\xe9\xa8\x3f\xb5\x5b\xe3\xac\x5f\x64\x6e\xb7\x0f\x5c\x9b\x22\x46\x4a\x52\x1a\x27\x70\x4a\xad\x52\x9d\x23\x74\x77\xee\x8d\x3a\xf8\xb7\x14\x6c\xf6\x2f\xfc\xdf\x86\xf6\x3f\x05\x1b\x69\x24\x29\xb8\xbf\xf6\x14\x1f\xf5\x1f\x5d\x52\xd0\x96\x15\xbe\x78\x8e\xb4\xf4\x71\x93\x4f\xe8\x53\xec\xd4\x6f\x09\xa4\xaf\xfb\xb5\x1b\x91\x12\x7e\x0e\x9d\x45\xc5\xc6\xff\x44\xc5\xe6\x7e\x85\x94\x14\x27\x8b\x6e\x58\xa9\x19\x99\x41\x6a\x5a\xb1\x1c\xe3\xe1\xc0\x7c\xe5\xcb\x7d\x43\x1c\xab\x94\xa1\x78\x09\xb2\xca\x33\x39\xfd\x21\x78\xb2\xad\xcb\xa0\xc2\x71\x51\x60\x02\x27\xed\xf6\xbe\x8a\xed\x48\xd7\xb3\x17\x4a\xa6\xa8\x14\xda\xb6\x49\x2b\x9d\xae\xe5\xb1\x31\x77\x16\xcf\xe4\xac\xcb\xc9\x8a\xcd\x2c\x39\xa6\x41\xce\x6d\x6d\xef\x36\x67\x0f\x6c\xbe\x74\x33\x86\x49\x5c\x3b\x01\xbd\xd7\xc5\x55\x8f\xf4\x52\xc9\x71\x42\x5d\x94\xce\x64\xb4\x4e\x27\x7e\x6c\x75\xfe\x52\xb5\x24\x4b\x81\x86\x58\x03\xdd\xfe\xd5\x4e\x64\xc5\x55\x2c\x2b\xa2\x20\xc7\x1f\x1c\xf7\x71\x99\xb7\x7a\xc3\x52\xce\xe0\xac\x4b\x94\x8c\xff\xc9\x8a\xcd\x5b\x9b\x00\x99\x67\x17\x48\xb8\xb6\x6e\xa5\x2f\xa1\xe0\x25\x04\xa9\x74\xd3\x0b\xbf\x2f\x15\xb9\x29\xf6\x48\xd9\x83\x9a\x86\x06\xe5\xcc\x2a\x36\x20\xe9\x9e\x96\xa0\x47\x05\x7b\x5a\xe9\x1f\x84\xbe\xc1\x26\x4f\xc0\x9f\xa2\x7d\x4e\xcf\x51\xb8\xc4\x99\xfb\xf5\x55\x0b\x53\xfb\xd7\xad\xee\xe0\xe6\x37\x88\xc4\x04\xe2\xe0\x09\xda\x97\xa0\x33\x46\x42\x0a\xa9\x1f\xb3\x46\x48\x3d\x49\xac\x77\xc2\xeb\x56\x55\x48\x99\x1f\x65\x28\xdf\x0d\x8d\xe8\x9f\x2c\xbe\xd0\xb1\x62\x10\x07\x4f\xd0\xc4\x04\x98\xe3\xa1\xb2\xd3\x4e\x05\xbd\xde\x4e\x2d\xcf\x70\xd5\x7f\x4c\xbf\x55\x0a\xf3\xec\xff\x39\x89\x3b\xb2\x51\xfd\xca\x8f\x0d\x11\x17\xc4\xc1\x13\xe9\xa0\xa2\xd3\x7c\xb6\x81\xfb\xcd\xc1\x94\x9c\x5b\xb7\xb1\x97\xa9\x72\xfd\xf7\x1e\x32\xd5\xb4\x3c\x34\xa7\x1c\xb1\xa3\xbc\x62\x11\x06\xd5\x01\x00\x5c\x90\x14\x92\xff\x9f\x71\x65\xf0\x97\x2e\x4e\x99\x4c\xcf\xa8\x3b\xb2\x49\xba\x0e\x0b\x65\xbf\xd2\x37\xad\x41\xce\x12\xcd\x53\x8d\x7c\x4c\x60\xfb\x13\xe3\x1e\xc2\xaf\x83\x38\x44\x0b\x93\xff\x4c\x58\x7f\x59\xa3\x81\xe6\x91\xd3\x24\x70\xc4\xe0\x20\x9e\xa3\xe2\x22\xc5\x21\x9f\xb8\x63\xe8\xc7\x75\xf3\xb7\x00\x6a\xd8\x55\x69\xb6\xdf\x97\x67\x9e\x8d\xad\x7a\x51\xf4\x23\x86\x0e\xe2\xe0\x12\x88\x3f\x26\x16\xf3\x31\xc4\xdf\x7f\x2c\xf0\x93\x94\xf8\x09\xbe\xce\xce\x70\x34\xbf\xbe\xd1\x15\x86\x3c\xc7\xe4\xc7\xdd\xf4\x37\xa0\x33\x36\x20\x0e\x2e\x81\x00\x74\x66\xae\xc6\xbb\x56\x58\x2e\xe8\x6b\x2a\xd2\xd2\x43\xb4\x6e\x29\x9f\xf2\x16\xf6\xbb\x64\x5c\xf7\x42\x18\xf5\x6f\x32\x43\x2f\x05\x83\x38\xb8\x04\x28\x34\xe2\x5f\xea\xe0\x97\xb3\x60\x24\x5b\x5c\x70\x25\xa3\x33\x59\x28\x2e\x68\x1e\x7e\xbc\xde\x96\x15\x66\x35\x16\xf1\x44\x11\x6a\xe3\x01\xe2\xe0\x12\xd8\xc3\xbe\x66\x10\xcc\xf9\xd1\xf8\xa6\xab\x04\xff\xb8\xfa\x9d\x27\x73\x63\x68\x47\x41\x34\xfa\x17\xef\x37\xd7\xc6\x0a\x9a\x1b\x6f\x22\x24\x00\xe2\xa0\x2e\x36\x7f\x2f\xd9\x80\xe6\xf4\xd3\x24\x30\xa9\x4a\xcd\x3d\x8f\x6a\xed\xb9\x9d\xd5\xda\xcb\xe7\x2b\xd5\xe4\x1f\x29\x57\xcc\x8e\x26\x23\xa3\xb3\xac\x12\x8f\xb9\x97\x04\x59\x2a\x10\x07\x97\x40\xd7\x95\xf4\x87\x12\x2e\x47\x0b\xb9\xea\x87\xf4\x3d\xd3\x24\xe3\x02\xdf\x3a\xb7\xed\x48\xd0\x34\x3c\x1b\x49\x13\x51\x93\xf4\xa0\x3a\x28\x88\x83\x4b\x60\x3d\x7d\xd9\x5f\x8f\x98\x74\xee\xa8\xce\x35\xc6\xc1\xf2\x17\xf3\x68\x90\x91\x9e\x66\x0f\x5f\xc0\x3e\x4e\x08\x81\xd2\xb0\xd7\x0e\x22\x2e\x88\x83\x4b\x60\x66\xd0\x90\x87\xc4\xf7\x87\x45\x8f\xf9\x5c\xc4\xc6\x39\xfa\x64\xb7\x98\x4f\x36\x92\x28\x6e\xf8\xa3\xe6\xce\x3f\x4b\xcb\xa2\xa1\xcb\x56\x20\x0e\x2e\x81\x9e\xce\x42\x4c\xda\xde\x55\xa2\xe9\xbd\x03\xe4\xa3\x69\x6d\xbe\x4d\x89\x6c\x23\x37\xfa\xa0\x65\x2a\x6a\x1d\x8f\xe1\x2a\x69\x62\xc4\x32\x1d\xc4\x41\xdd\x2b\x04\xff\x6e\xd5\x40\x09\xf6\x34\x0d\x60\xf7\x17\xba\x88\x48\x1b\x5d\xbc\x6d\x6d\x3f\xd2\x4b\x4e\xad\xde\x4a\x1d\xe1\xfd\xfe\xf3\x27\xa7\x8e\xbb\xef\x15\xd3\x13\xce\x35\x23\xc6\x0e\xe2\x4e\x9c\xb3\x5a\xa2\x2a\x72\xd9\xb9\xf1\xb6\x41\x9c\xe0\x1c\x1d\x6a\x6e\x43\x75\xc4\xfc\x0f\x89\x23\xeb\xb1\xeb\x57\x7a\x13\xba\xf0\xdd\x05\xa1\x73\x56\x00\x0e\xae\x01\x2d\xfe\xcd\x2b\x1c\x84\x21\x0c\x33\x2a\xb2\x37\xc6\xa4\xa3\x4b\xdb\x51\x93\x36\xc2\x90\x71\x6c\xa4\x8b\x7a\x3e\x06\x79\xd8\x43\xef\xf0\x83\xb8\x13\x56\xed\x89\x3a\xd2\xa5\x7e\xfd\xc5\xeb\xcb\x43\xae\x6d\x91\x0e\x66\x16\xd1\x2a\x55\xef\x63\x1e\x5d\xf6\x36\xcd\xa5\x0d\xaa\xf0\x85\x2e\x08\x82\x38\xb8\x06\xe6\x36\xd7\x9e\x5f\xef\xa2\x59\x75\x42\x91\x70\xd2\xfa\x5e\xb3\x8d\xea\xf6\x24\x5b\xcd\xb1\x02\x53\xa2\x36\xed\xa0\x3e\xdc\xb1\x05\xa1\x01\x10\x07\x75\xaf\x00\x94\x6c\x40\xab\x9d\xd3\x34\x50\x12\xa1\x70\x8d\x2d\xd2\x90\x21\x96\xf9\xb6\xb9\x52\xa2\x64\x5b\x36\xef\x13\xe1\xb8\xe5\x4d\xc7\x1d\x33\xdf\x02\x2a\x9d\x32\x3c\xc4\xd8\x41\x1c\x5c\x03\x55\x0a\xfb\xbb\x5f\x30\xa4\x37\x1a\x0d\xc7\x1d\x8c\x36\x3c\x2b\x7a\x54\x64\x77\x25\x4c\x92\xb5\x42\xc8\x24\x83\xf5\x1b\x5f\x40\x37\x8e\x41\x1c\x5c\x03\xfc\x91\xac\x5b\x9c\xf7\x84\xbe\x3d\x34\xe4\x7c\xda\x1a\x13\x3d\x77\xf4\xb6\x70\xf8\x1d\x41\x83\xb2\xe0\xdb\xcf\xd1\xe2\x0f\x2e\x43\x97\x18\x41\x1c\x5c\x03\x0c\x7b\x9c\x83\x79\xfa\xd8\x2f\x4c\x1e\x65\x3d\x0d\x4e\xf1\x16\xef\xf7\x45\x21\x75\x32\x89\x39\x52\xbb\x45\x11\x86\x5f\xf8\x16\xfa\x0e\x20\x0e\xae\x81\x80\x16\x4b\x5e\xa1\x15\x8d\x48\x54\x39\x56\xd3\xca\x5f\xa8\x24\xa4\x11\x1f\x73\xb0\x6f\x14\xde\xdc\x21\xaf\x79\x83\xb6\x23\x0b\x5d\x8a\x02\x71\xd0\x3c\xe0\xf4\x77\x0d\x80\x96\x9e\xa7\x69\x80\xb1\xcf\x84\x18\xf3\xba\x78\x5d\xc1\xc5\x57\xf7\x0e\xe6\x06\x3f\xea\xdb\xdb\x1f\x49\xc7\xc5\x48\x37\x8f\xeb\xdc\x72\xd0\xa7\x61\x40\x8c\x1d\xc4\xc1\x35\x80\x14\xab\x19\x82\x3d\x17\xcf\x48\x10\x43\x61\xea\x21\xab\x6b\x96\xd4\x4c\x36\xff\xa4\x55\xa1\x01\x4d\xe4\x5a\xdb\x70\xdf\x24\xf4\xff\x0a\xe2\xe0\x1a\x98\x99\x8f\xd0\x51\x1c\x7d\x8a\x31\x9c\xf7\xe5\x47\x4a\x7e\x2d\xf5\xa2\xe1\x0c\x33\x55\x71\x84\x2d\x49\xe3\xc8\x98\xb2\xd6\x11\x01\x34\x67\x03\x38\xb8\x06\xb0\xe6\x5a\x3d\x6c\x50\x70\xa4\xba\xa8\xe3\xfb\x15\xb0\x75\xb1\x19\xa7\x94\xa4\x52\xe9\x69\x28\x66\xec\x77\x3a\x0e\x3e\xb6\x42\x17\x7a\x41\x1c\x5c\x03\x99\x65\xb4\x96\x17\x5b\x7b\x0c\xb2\x47\x7c\xde\x49\xe0\xb9\xdb\x88\xf0\x62\x3d\xe2\x10\x9f\x92\xf0\x1c\xab\x49\xda\xb9\x57\xcd\x84\xd0\x00\x88\x83\xe6\x01\x40\xc9\x06\xe4\xde\x4f\x2f\xd9\x3c\xb1\x54\xf8\x56\x90\x28\x53\x9b\xd0\x19\x8d\x59\xf5\xa0\xe5\xd2\x7a\xab\xa9\xe2\xa5\xdb\x6a\xab\x36\x21\x71\x97\x82\xcd\x96\x3f\x22\xca\x1f\x20\xee\x64\xc9\xa6\x0f\x3d\x38\xc2\x08\x23\xa9\x36\x4e\xb3\xaf\xd7\x33\x61\x79\x07\xe5\x39\xb7\xab\x03\xb5\x58\x62\x9c\xf8\xdb\x82\xe6\xcf\x13\xd0\x93\xe1\x20\xee\x64\xc9\xa6\xf5\x7a\xb1\xb8\xd4\x7d\x97\x03\x6d\xfe\x57\x73\x1e\xa4\xe7\xc3\xf5\xf6\x29\x8f\x92\xf4\x67\xf2\x4b\x4d\x9c\x50\xa9\xaf\xcd\xb5\x21\x22\x83\xb8\x20\x19\x7f\xd8\xd7\x78\x20\xf4\x34\xc7\x5f\xe4\x11\x8a\xe5\xbe\x14\x4e\x4e\xbf\xca\xc1\xf8\x68\xf2\x6a\xfb\x25\xdb\x31\x27\xcb\x47\x2f\xd7\x77\x02\x0b\xfc\x11\x15\x18\x4c\x81\xcb\x84\x71\x22\x9d\x4d\x8a\xb4\x75\x45\xb6\xb1\xd4\x73\x3a\x38\x5d\x6e\x9e\x11\x92\xb7\x8b\x90\x7c\xca\x98\xe2\xc9\xfe\x71\xc7\x69\xeb\x5b\x2b\xea\x39\xa5\xa6\x37\x76\x03\x98\xea\x75\x89\xe9\x03\xf9\x66\xea\x6c\x53\xef\xdf\xfd\x6e\x68\x0d\x66\x95\x2b\x59\x33\xfa\x03\x3d\x16\xba\xcd\x1e\x45\xd8\xea\x3d\xed\x98\x9e\xea\xcc\xe7\x34\xfd\xf4\x5a\x5d\xee\x3c\x23\x7b\xc8\x7a\xc1\xae\xa9\xe2\x95\x3a\xb7\x7f\x5b\x05\x06\x34\xb4\x3f\x2a\x30\x12\x27\x2a\x30\xdd\x29\x09\xe1\xe6\x9c\xc6\xf4\x6a\x21\x57\xbd\x1c\x97\xaa\xb8\xb8\xd2\xa3\x85\x5b\x64\xce\xf7\x15\x93\xcb\xd3\xaf\x5d\x6b\xaa\x3b\x8b\x0a\x4c\xd3\x89\x0a\x4c\xce\x47\xd4\xbb\x6f\x98\x45\x43\x9d\xbe\xdf\xb5\xf9\xf1\x4c\xf4\x0a\x2f\xc6\x7e\xf4\x53\x7a\xa7\xda\x9f\x5a\xaf\xa9\xae\x24\x86\x7d\x3d\x93\xe3\x1c\x27\x2b\x30\x5a\xe6\x1e\x8b\xfe\x01\x96\x55\x87\x55\x63\xeb\x3a\x24\x2f\xc5\x6a\x46\xdf\x4d\xf4\xa1\x50\x12\x76\xd5\x1e\x74\xdd\xe2\x9e\x0c\x3d\x93\xc3\x2b\x27\x2b\x30\x38\x43\xbe\x52\xc6\x82\xd1\x0f\x42\x49\x17\x57\x58\x82\x7b\x37\xef\x26\x2d\x10\x3f\x24\xcf\xe6\x3b\x92\x78\x36\x6e\x28\xbb\x58\x7b\x26\xa3\x3d\x59\x81\x09\x77\x94\xb7\xce\x2c\x4c\x9d\x35\x5a\x40\xfd\x55\x5e\x33\xd2\xc2\xe9\x9e\xf5\xd5\x75\xe1\x12\x39\x23\x92\x43\x44\xbe\xcb\x58\xec\x99\x8c\xf6\x64\x05\x26\xcb\x67\x8b\x3d\x4b\xdd\x76\x60\x49\x1d\xd5\xba\xf5\x78\xcb\xee\xf8\xce\x87\xde\x6a\xd6\xe0\xc6\xf1\x27\x5e\x9a\xfb\x7e\xe7\xa6\xcf\xac\x02\x03\x92\xee\x69\xf9\xf6\xd5\x92\xe6\x5b\x8b\xd7\x45\x83\xdc\x45\xbe\xc5\x69\x63\x11\x95\x83\x8a\xe1\xca\x3d\x35\x49\x6d\x0d\x37\xba\xe7\x57\x99\xba\xa0\x8e\x79\x20\x0e\x9e\x6f\xfd\x02\x6f\x09\x5e\xc6\xc9\xca\xc5\x47\x26\x70\x64\x73\xe3\xb9\x92\xe9\x33\xab\x43\xd1\x9f\x96\x46\xd6\xfe\x01\xdb\x4e\xeb\x87\x35\x22\x2e\x88\x83\xe7\xdb\x3d\xb2\xf1\x25\x1b\x06\xbf\x60\x9f\x7b\x5c\x1c\x44\xa6\x45\x44\x42\x8d\x17\x2f\x16\xa3\x2a\x39\x35\x29\x3b\x27\x4d\x4f\xe5\x40\x6b\x2e\x10\x07\x6f\xc7\xdf\x6a\x9d\xf2\xba\x15\xc3\x7f\x51\x5b\x48\xd6\x3f\x55\x34\xce\x67\x49\xb4\x30\x87\x7e\x68\xb1\x8d\x19\xbf\xa0\xa2\x4e\x8d\x9f\x16\x11\x17\xc4\x05\x49\xa1\xfd\xe3\x3b\xa8\x3c\xd5\x61\x08\xb7\xfb\xf8\x13\x23\x2f\x18\x27\xb9\xd7\xb0\x77\xf0\x45\x7b\x28\x2f\xb9\x3c\x87\xca\xb3\xdb\x11\xef\xac\x56\xab\x11\xf6\x1b\xc4\x21\x7a\x92\x48\xfc\xbd\x02\x03\x9a\x47\x4e\x93\x80\xd7\x08\x75\xa4\xf9\xa7\x65\xf4\xfc\xbd\xde\xa3\xd1\xbe\x64\xcb\xd9\x92\xca\x01\x4c\x95\xcf\x74\x65\xa5\x77\x0d\x08\xe9\x6e\x7d\x45\x0c\x1d\xc4\xc1\x25\xe0\x54\x23\xf6\xf5\x6e\x22\xb9\x5c\x95\xb7\xa3\xc6\x04\x92\xe0\x4f\xe5\xc2\x74\x96\x82\x0f\x5f\x47\x91\xe2\x98\x5f\x6f\x62\xdd\x9d\x41\xc4\x05\x71\x70\x09\x84\x09\x54\xe1\x68\x27\xbe\xa2\x53\x8c\x45\x15\xb1\x72\xed\x98\x89\xb7\x63\x2a\x26\x70\xee\xaa\xe2\xbe\x7d\x61\xf7\x67\xc0\x00\xd4\xf9\x1a\xc4\xc1\x25\x30\x5f\x56\xcf\x23\x77\x49\xe6\xc6\xd5\x63\xc1\x92\x8a\xb7\x78\x1c\xbf\x98\xbc\xd5\xf3\x7e\x54\xa8\xb3\xdc\x79\x70\x97\xed\xbb\x2e\xf4\xaf\x00\xe2\xe0\x12\x88\x7b\x10\xf7\xd1\x13\x8b\x8d\x84\x52\x28\xa8\x6c\x45\xb6\xdb\xa6\x92\xfd\x4d\x5e\xa1\xaf\xc8\x60\xfe\x57\x2d\x3e\xbe\x8d\x27\x1d\x08\x09\x80\x38\xa8\x2d\xcd\xdf\x2b\x30\xa0\x39\xfd\x34\x09\xdc\xd4\x3b\x78\x3a\x63\x1c\x6e\xdb\x76\x7e\xd9\xa5\xea\x4b\x79\x67\x59\x31\xa5\xfc\xcf\x9f\x44\x1d\xd8\x03\x65\x79\x29\xd5\xfc\xc7\x50\xcf\x44\x00\x07\x97\xc0\x23\xee\x49\xd7\xd9\x87\x65\x22\x5f\x72\xd0\x96\xf4\xe8\x84\x92\x1b\x53\xd5\xd3\xba\x6b\x7b\x91\x77\x5c\xf9\x50\xa4\xaf\x6a\x9e\x83\x6e\xce\x00\x38\xb8\x04\x0a\xf9\x88\xcc\xdf\x5a\xbe\xdc\x94\x8f\x6c\x62\xb0\x88\xa9\x11\x79\xcc\xce\x24\x78\x3b\xf5\xad\x5d\xa9\xed\x71\x83\x4a\x95\x0e\xf4\xac\x3e\x88\x83\x4b\xa0\x82\xc9\x42\x73\x2e\xb7\x2b\xa1\x80\x06\xc9\x67\x9d\x96\x14\xdf\x68\x2a\x10\xcf\xdc\xd3\x24\xe3\xfe\xce\xb3\xfd\xd8\x3b\xf8\xca\x88\xb8\x20\x0e\x2e\x01\xc3\x36\x83\x8b\x34\x6b\xd8\x5b\xa8\xc6\x89\xd3\x2d\xe8\x8b\xc6\x31\x95\x8d\xd1\x54\x64\xe3\x0f\xa9\x2a\x54\x6b\xa3\x71\x3a\x33\x11\xab\x6e\x10\x07\xb5\xa3\x00\x54\x60\x40\x09\xf6\x34\x0d\xf8\x3c\xde\x0d\x21\x14\xc0\x6c\xe8\x37\xbf\x4f\x65\x6b\x43\xf7\x7e\xbc\xf0\x46\x6e\xe0\xd6\x9b\xa2\x0f\x7e\x38\x68\x2b\xc1\xa3\x21\x88\xb1\x83\xb8\x13\x1a\x90\xbd\x18\xce\x50\x70\x38\x7d\x9f\xf1\x1b\x75\xb0\x01\xfd\x37\x1f\x16\x5b\xfb\x0b\xdc\x15\xcb\xb4\x38\x2a\x03\x5c\x1b\x48\xd0\x37\x05\x71\x70\x0d\x28\x8b\xd4\x30\xa0\xb4\x7b\xe4\xa1\x5d\x5e\x2b\x0d\x34\x49\x11\x9a\x50\xae\x7f\xc5\xc9\x6d\x4d\x67\x4c\x55\x27\x65\x55\x78\x08\xdd\x9c\x01\x71\x70\x0d\x48\x8a\xed\xdd\x31\xa3\xe6\x6e\xa7\xe9\x5e\x51\xd5\x78\x84\x6e\xaf\xc5\xdc\x27\xbf\x90\x8b\xb6\xaf\x92\xe1\xf6\xf4\x48\x47\x02\x7a\xac\x0c\xc4\xc1\x35\x20\x46\xb2\x65\x1a\xf6\xda\xb0\xbb\x3d\xc4\xed\x52\x38\xa3\xc9\xbd\xe3\x25\xf7\x4d\x7a\xbe\xe7\xcf\x15\x8e\x5b\x7a\xe6\xf2\x36\x93\x11\x1a\x00\x71\x50\x3b\x0a\x40\x05\x06\xb4\xda\x39\x4d\x03\xb2\x65\x3a\x89\x9d\x7c\x9a\x79\xae\xd5\xbd\x37\x86\x76\xf2\x23\x6e\x06\xce\xa9\x9a\x37\xe3\xa7\x6f\xf0\xea\x37\x37\xab\xe0\x43\x07\xa7\x40\x1c\x5c\x03\xf8\x1c\x53\xa8\xdc\xa8\x98\x4d\xe3\x7c\x69\xfe\xac\x63\xe9\x68\x55\x65\xf9\xdd\x4f\xf3\xa9\x64\xcc\x6e\x8a\x95\xcb\xad\xf0\xc9\x20\xe2\x82\x38\xb8\x06\xea\x15\xab\xf9\xed\x84\x7e\x7d\xb3\xf8\xaa\xa6\x2f\x5b\x23\x72\x49\x32\x3d\x65\xb5\x4d\x70\xdf\xd8\x3d\x8e\x70\x15\xe3\x4d\x35\xf4\x6a\x25\x88\x83\x6b\x20\xc6\x5a\xde\x20\x59\x25\x74\xaa\xdd\xd9\xb6\x6c\x1b\x65\x3d\xc4\x6e\xa2\x51\x04\xdb\x58\x5d\x0c\x9d\x77\xcf\x14\xaf\xb4\x12\x15\x11\x17\xc4\xc1\x35\x50\x72\x81\x68\xb1\x51\xfc\x40\x3f\x2b\xf6\x4d\x22\xcb\x5b\xb5\xc9\xcc\x97\x71\xc3\x3b\xb4\x92\x47\x4d\xfa\xa1\x61\x97\x8e\x2a\xae\x20\x34\x00\xe2\xa0\x79\x00\x50\x81\x01\x2d\x3d\x4f\xd3\x80\x1a\x87\x1d\xdf\x9d\x88\xd4\x64\xcd\x01\xc5\x91\xe9\xca\x9b\x4f\xad\x52\xa5\xe4\x63\xa9\x77\x36\x33\xb0\xc3\xa6\x86\x83\xeb\x13\x11\x63\x07\x71\x70\x0d\xa8\xfe\x94\x53\x1c\xac\xf7\x53\xbc\x13\x90\x6b\xab\xe6\x9f\x5d\x61\x4e\xd3\x7b\x6e\x70\x67\xd8\x2a\x81\x3c\xe9\x56\x8d\x65\xb0\x38\xd4\xf7\x1b\xc0\xc1\x35\x30\x9a\x37\xec\xd6\x88\x15\x32\xd1\xd0\x77\xe3\x3c\x2f\xdd\xdd\x95\x9c\xe7\x7e\x8d\xfc\x7e\x2d\x97\x0b\x2a\x19\x24\x67\xa5\x2c\xa1\x8a\x11\x88\x83\x6b\xe0\x85\x2c\xfd\x53\x13\x8a\x6a\xad\x82\x21\x82\xb0\xbb\xfb\x75\xd7\xac\xb8\x8d\xc7\x5a\xd8\xc2\x4d\xea\x08\xfa\x1f\xfb\x60\x2b\x40\x0f\x55\x81\x38\xb8\x06\x02\x48\x69\x89\x1d\x31\xc5\x0e\x98\x3e\xd4\x18\x4e\x61\xfa\xcf\xdc\x8c\x7d\xee\xd6\x74\xb1\xd5\xc9\x63\xe4\x8b\x28\x12\x87\x83\x3f\x54\x85\x03\x70\xd0\x3c\x00\xa8\xc0\x80\xdc\xfb\xe9\x15\x18\xa3\xb1\xa0\x98\x8a\x2e\x07\x3b\xfd\x39\x7e\xf7\x07\x9a\xcb\xbf\xb7\x77\x2a\xf2\x31\x08\xa6\xa5\x29\xbe\xbf\x7a\xda\x6c\xc0\x21\x8f\xa8\x66\x80\xb8\x93\x15\x98\x9d\xf2\x1b\x78\xed\x7b\x3a\xdf\xe8\x09\xfb\xca\xe6\xf1\x18\xef\xdd\xea\x11\x95\x17\xab\xfe\x38\x64\xd4\xb9\x2b\x6d\x7a\x71\x36\x14\x11\x19\xc4\x9d\xac\xc0\xc4\x06\xd6\x93\xc4\x7e\x40\x4f\x0a\xf9\x66\x8a\x4f\xd6\x10\x17\x17\x6a\x7e\x70\x81\x59\x21\xd4\xa8\x36\xb6\x5f\x58\xa1\x4c\x70\x1f\x6a\xa5\x03\xe0\xfe\xdb\x3c\xe6\x1f\xd5\x73\xf4\x76\x1e\xf9\x91\xa0\xc5\xbd\xdf\xe8\x58\xe6\xa2\x16\x84\xde\x55\xe3\x33\x6d\x03\x77\xec\xfa\xdb\x79\xd8\x1a\x59\xdd\xca\xa0\x0a\x4c\x0a\x35\x25\xbb\xab\xbe\xc4\x73\xb7\xa1\x2b\x3c\x5f\x95\xfd\xae\xe3\x10\xae\xdd\x7c\xa0\x39\x45\xe5\x10\x71\xcf\xde\x2c\x39\x5d\xe4\xcf\x0a\x0c\x7f\x86\x6d\xd3\xad\x73\x84\x0a\x18\xf6\x17\xe7\x75\x58\xc2\xae\x70\x1f\xbc\xbf\x8b\x5a\x8c\xee\x2e\xcc\x99\x13\xb3\x87\x34\xfd\x67\x6f\x56\xf1\x70\xe3\x4d\x92\x47\xfc\xbe\x1d\xea\x92\xcb\xe8\x51\x63\x29\xbc\xe2\x25\xfb\xef\x64\xde\xdb\x4b\xcd\xea\xda\xa7\xb3\x11\x6d\x48\x48\x60\x60\xfc\x1b\x2a\x30\xfe\x17\xfe\x6f\x43\x0b\x3e\x8f\x74\x21\x48\x92\xca\x3f\x24\x4a\xda\xff\x44\x05\x46\x87\x8c\x25\x29\xf6\x62\x27\xda\xd3\xb2\xa3\xe6\x18\xb3\xf3\x54\xbe\x52\x18\xdf\xea\x2a\x15\x99\xf0\xaf\x9a\x29\x53\x16\x3b\x9e\x45\xab\x5c\x69\x24\x55\xf8\x4f\x2d\xb1\x09\xb4\x10\xd6\x52\x17\x8b\xbb\xf9\xab\x28\xaa\x5c\x4b\x6b\x80\xe5\xb3\x9c\x37\x9b\x37\xaa\xe7\x14\xf1\xc0\x6b\xcd\xda\x87\x67\x72\x3c\xe3\x64\x05\x86\xb9\xc9\x9a\xfe\xd9\xd5\x92\x34\x19\xa3\x15\x05\xca\xd5\x44\x74\x6d\x36\xb3\x22\xdb\x90\xdd\xdc\x63\x96\x19\x25\xb1\xca\x74\xba\x33\x39\x8c\xa2\x7d\xe2\xc7\xfa\x8b\x94\xda\xfc\x1a\x79\x34\xb1\x1d\x54\xa9\x7a\xee\x1b\x3a\x53\xd8\x1a\xd9\xc1\x5b\xbf\x78\xbd\x79\x49\x8d\x97\xca\x73\x4c\x0d\x67\x32\xda\x93\x15\x18\xa2\x72\x83\xe3\x06\x24\x06\xd6\xf8\x45\x53\xe3\x8d\x2d\xc5\xc3\x41\x45\x7e\x9f\xf8\xe3\x97\x6c\x43\x77\xef\xd6\x56\x78\x46\xe0\x9c\x59\x29\x04\xa4\xa1\xd3\x12\xdf\x75\x9b\xfe\x87\x64\xf3\xe2\x15\x4b\x78\x4f\x42\xed\x13\x07\x4a\x16\x4b\x98\x1a\x77\xaa\xeb\xcf\x29\x45\xc4\xd1\x29\x8a\x87\xee\x21\x26\x7c\x10\x07\x4f\x7c\xce\x2a\xc8\x25\xad\x9e\xd4\x2c\xe6\x1c\xd2\xcd\x4e\x93\x7a\xa5\x1f\x4a\x9d\x49\x7d\x47\xf9\x62\xb2\x48\x06\x0f\x1a\x6e\x3b\x43\x2f\x9f\x82\x38\x78\xe2\xdb\x72\x3b\x97\x35\x42\xe1\x74\x79\xfd\xf8\xd2\x41\xab\xd6\xb3\x84\xa2\xbc\xfb\x66\xeb\x01\x6f\x43\x9e\xf0\x8f\x3e\x5b\x11\x71\xc1\x41\xc4\x05\x71\xf0\xc4\xb7\x4e\x40\x74\x27\x41\xbd\x7e\x83\x9a\x73\x5f\x54\x5b\x9c\x3c\xa1\x50\xa4\xbc\xa7\x90\xef\x3b\x8b\xff\xcf\xf7\x1c\xd5\x6c\x6b\xd0\x76\x3c\x88\x83\x7f\x87\xdd\x91\x4e\xd9\xfa\xc2\x45\xd1\xd8\x4e\x7a\xba\x1e\xb9\x8c\x22\xc1\x64\xe7\x73\xcd\x5e\xd6\x16\xbd\xbb\x7a\xab\xf8\xaf\x79\x3b\x11\x3e\x18\xc4\x21\xba\x7d\xf8\xff\xbd\x14\x02\xfa\x87\x3e\x4d\x02\xea\x3f\x8f\xa5\x27\x14\xc5\xb2\x22\x77\xee\xbd\x08\x6b\x5d\xe8\xd8\xfe\x9d\x12\x45\xdd\xe6\xf7\x14\x9d\xf7\x4b\x56\x25\xae\x13\x54\xb2\x00\x71\xf0\xa1\xbf\xed\x17\xf1\xf1\x67\xed\xc5\xb1\x8a\xaf\xbe\xea\xc2\xf5\x43\x2f\x13\x3b\xfc\x8b\xf9\x9a\xc3\x60\xff\xab\x54\x25\xed\xaa\x00\xe8\x24\x02\x88\x83\x4b\x60\xc7\x28\x4c\x39\x23\x5f\x4a\xea\x93\xa2\xa5\xc1\xb6\x35\x6d\xf3\x57\x7e\x1e\x9b\x39\x6c\x9a\x99\x06\xc7\xe2\xe4\x71\xa2\xf3\xd0\x1b\x2d\x20\x0e\x2e\x01\x1d\x83\x29\xbb\x8c\xfc\x95\xb0\x8f\x06\x9e\x34\x52\xd7\x02\x6d\xe3\x77\xb8\x4a\x8b\x32\xae\x84\xdb\x1d\xea\xcc\x14\xf2\x8a\x41\x37\xde\x40\x1c\xfc\x3b\xf0\xd6\xcb\xa5\xd5\x5e\x89\x4e\xec\xff\xd6\x30\xea\x4d\xdf\xcc\x94\xe6\x78\xfd\x3e\x65\xfe\x60\xae\x05\x8d\x72\x70\x71\xee\x2f\x65\x84\x04\x40\x1c\xd4\xf0\x45\xf5\xaf\x12\x00\x4d\xae\xa7\x6e\x42\xfb\x16\x50\x59\x44\x5b\xfa\x13\xfd\x24\xf1\x31\x8f\x88\x25\xf0\x7a\x93\xf8\x46\x20\x46\x6f\xf1\xa7\xd9\x41\x00\xe6\xb5\xca\x3b\xd0\x26\x34\x80\x83\x0f\xfd\xf3\x65\xfe\x72\x01\x3f\xab\x04\xc9\x5c\x5e\x27\x7e\xbe\x5d\xfc\x74\x0d\xe4\x0a\xf3\x44\x93\x0b\x1c\x8a\x6d\x19\xc2\x3f\xd1\xa1\x33\xe3\x20\x0e\x2e\x01\x6d\x2f\x62\xfa\xf8\xde\x2f\xbf\xa2\xc3\xcb\x7c\xbc\x92\x13\x47\x92\x6f\xdf\x3c\x4e\xb4\x7e\xfd\x5b\x7d\xb0\x82\xa4\x34\x18\xbb\x00\x11\x17\xc4\xc1\x25\x10\xb0\x27\x5d\xf0\x45\x83\x75\x77\x54\xa3\x4b\x85\xb0\xb4\x91\xd0\xf5\xeb\x76\x43\x40\x14\x4d\x70\x28\xff\xaf\x01\x82\x6f\xc4\x50\xbb\x72\x10\x07\xff\x0e\xd3\x87\xcc\x89\x6e\x49\x16\x75\x52\x23\xc9\x58\x9d\x8a\x6f\x95\xcd\x24\x1c\xa3\xca\x8f\x8d\x2f\x0d\xf7\x75\xb9\x07\xe4\xb1\x9b\x23\x96\xbf\x20\x0e\x6a\xf4\x00\x28\x85\x80\x32\xdd\x69\x1a\x58\x1f\xb9\xa6\x46\x89\x2e\x7e\xf4\x9e\xec\x81\xa4\x87\x5c\xa9\xe0\xc5\x44\x81\x51\xea\x42\xca\x08\xf9\x83\xbb\x1d\x3b\xda\x83\xc1\xd0\x0c\x08\xe0\xe0\x63\x77\xab\xc9\x3e\x77\xf9\xdb\x0d\x7b\xbd\xf5\x28\xe1\x55\x7d\x91\x59\x61\xc1\x56\x96\x4f\x3e\xd8\x63\xd5\x9d\xb7\xb7\x36\x44\xb1\xa0\xc3\x1d\x20\x0e\xae\x01\x3e\xb5\xe7\x0e\x35\xef\x8a\xef\x44\xda\x59\x5b\x5c\x29\x77\x47\xa3\x76\x6f\x91\x7c\x79\x1d\x75\xd2\x24\x53\x83\x8b\x4b\x63\xe3\x31\x22\x2e\x88\x83\x6b\xe0\x4e\x63\xf1\x87\x26\xa3\x51\x0d\x03\x8d\xc6\xce\xf6\x52\xf7\x32\x1d\xa6\xd0\xc4\x47\x55\x6f\xcb\x0d\xf0\xc4\xb6\xea\xdf\x17\x43\xcf\x80\x81\x38\xf8\x77\xd0\x69\x7f\x49\x23\x74\x14\x6b\xc0\xfa\x9a\x5f\x3a\xe6\x4a\xe7\x03\xd1\xdf\xb9\x5d\x7d\x87\x5e\xc6\xb7\x43\xf5\xa6\x22\x91\x05\xf9\x10\x1a\x00\x71\x50\xa3\x07\xed\xbf\x6b\x00\xb4\xec\x38\x4d\x03\x2b\x5b\x5f\x71\x57\x8b\xef\xa5\x8b\x85\x07\x87\xc9\x73\x3c\x5c\xd8\x42\x5a\x12\xdf\x31\x13\xe6\xf2\x39\x08\xb0\x93\x7b\xa9\x02\x1d\xc2\x00\x71\xf0\xb1\x6f\x3a\x5e\x14\xa0\x26\x7a\x1d\x43\x1e\x68\xf6\x5c\x7d\x75\xdd\x0d\x79\x02\x43\x50\xb6\xa0\xac\x1c\x29\x87\x84\xf0\xd7\x08\x39\x34\x65\x83\x38\xb8\x06\xd4\xc7\xa4\xec\xbe\x3c\xdc\x74\xee\xa2\x2a\x90\xed\x0d\xc8\xf8\xed\xc7\x14\x3e\x97\x1c\x87\xa6\xd0\x50\x74\x10\x3c\x34\x1d\xd2\x0a\xa5\x2e\x00\x07\xd7\x80\x0f\xad\x34\xd9\x55\x3e\xda\x24\xb2\x7e\x42\xd4\xbb\x93\x22\xe1\x48\xc1\xc5\x32\x4b\xc1\x0e\x51\x13\x6c\x96\xd6\xec\x13\xdf\xa0\xab\xaf\x20\x0e\xfe\x1d\xd6\x4b\x1a\x93\xd5\x3b\xcc\xad\x2e\x89\xd1\x04\x2d\x5f\x21\x27\x0b\xf4\xdd\xf2\xce\x0f\xd5\xed\x2f\x5e\x77\x8d\xeb\xa0\x6a\xae\x47\x68\x00\xc4\x41\xf3\xc0\xff\x56\x0a\xb9\xf5\x7f\xb3\x50\xa7\xdb\x60\xea\x5b\x68\x4c\xe7\x66\xda\x4b\xc8\xa8\xbb\x74\x54\x1e\x6d\x31\x3f\xcf\x52\x89\xc5\xbe\xd9\xca\xb6\xbe\xa1\x43\xbd\x5f\x15\x10\x85\xb0\x94\x20\xee\x94\x83\x08\x42\x2e\xcc\xbe\x8f\xc6\x4a\x8b\xc8\x28\x6b\xf7\x59\xa6\x04\x0e\x4a\x50\x8b\x98\xac\x3e\x7f\x8d\xef\xfd\xba\x2d\xdf\xf8\x1e\x7a\xa5\x18\xc4\x9d\xb4\xc1\xb2\xd5\x3e\xbc\xae\xcf\x84\x6c\xaf\x5c\x8f\x1a\xb3\x4c\x10\xd2\x23\x6e\x6e\xd6\xe2\xce\x78\x62\xaf\xb6\xfd\x71\xe5\xe9\x26\x16\x0e\x22\x32\x88\x3b\x19\x39\xd9\x58\xec\x86\x41\x15\xab\xd3\x3e\xb3\x21\xce\x78\xde\xca\x5d\x9e\x92\x4b\x19\xb1\x57\x46\x75\x46\x8b\xcd\xf3\x67\x1f\xbe\x67\x45\xdc\x1d\x01\x71\x41\x32\x48\x48\xff\xf9\xab\x49\xbe\x41\xf8\x66\xb4\x7a\xd6\xaa\x09\xac\x17\x12\xd3\x0e\x73\x17\xe5\xd3\x04\x42\xb6\x97\x79\xf8\x47\x55\x33\xf0\x9c\xb8\xc6\x8d\x74\x3d\x4a\xff\xe1\x9b\x67\x6f\x24\xed\xbc\x70\x27\x35\x8b\xcc\xae\xf8\x42\x14\x64\xee\xfd\x81\xcd\x7a\x4b\xeb\xce\xfd\xcb\x85\xe7\x5c\x02\x50\xc8\x3e\xfd\xd9\x83\x40\x60\x8f\x57\xfb\xbe\xca\x38\xd7\xe6\x81\xae\xad\x93\x53\xdd\x57\x75\xe3\x3b\x87\x01\xbf\x5d\xef\x69\x91\xe3\x7e\x16\xd8\x95\xaf\xfb\xb7\xf9\x66\xd0\xd0\xfe\xf0\xcd\x4d\x27\x7c\xb3\xdd\xd4\xbb\xfc\x3a\x49\xa3\xc8\xcf\x86\x66\x8f\xee\x0c\x8a\x8e\xf5\x9e\xfb\xb6\x34\x3b\x48\x43\xce\x5b\x28\x58\xee\x9a\x38\xb0\x76\x16\xbe\x59\xe2\x84\x6f\x16\x5d\x1f\x7f\xd3\x40\x12\x7f\xac\xe1\xc5\x75\xcf\xb7\x3b\x35\x39\xc7\x42\xa9\x65\x32\xff\xaa\xf9\xa4\x66\xf0\x87\xad\xa3\xc7\xa6\x67\xb2\xa9\x7e\xd2\x37\x77\xb5\x72\xfc\x2a\xa0\xbf\xed\x38\xd6\x66\x78\xde\x07\x67\xaa\xb2\xd0\x2c\xac\x88\x51\xa4\xeb\x5b\xbb\x68\x44\x97\xee\x2c\xf7\x8b\x33\x39\x42\x70\xd2\x37\x5f\x27\x9b\x62\xaa\xbe\x7d\xd0\x52\x8c\x5c\x13\x63\xc2\xb2\xff\xe8\xe0\xc2\x31\xa1\x31\x33\x43\x95\x7a\xec\x08\xb9\xca\x8f\xad\x9d\x33\x19\xed\x49\xdf\x9c\xa3\x92\xcc\x58\xae\x94\x18\xca\x9a\xd6\x6a\xbd\x75\x93\xf4\xdb\x79\x87\x6c\x0c\xa3\x2b\x3b\x5b\x79\xbc\x8f\xcd\x24\x5a\xce\x5d\x3f\x33\xdf\x0c\xd2\xd0\x69\x99\xb2\x71\x42\x2f\x38\x2f\xae\xf6\x72\xda\xb7\x57\xcc\x77\x36\x50\x76\x7f\x21\x97\xda\x48\x5d\xa0\x75\x8f\xf0\xc0\xec\x12\xa9\x96\xab\x41\x64\x08\x10\x07\xcf\x10\xca\x53\x4e\x3e\x96\xb2\x1f\x16\x0b\x79\x02\xf1\xd2\x6d\x7c\xab\x71\xa2\x23\xcf\xdb\x60\x17\x60\x3f\x6f\xbc\xc2\xd4\xb4\x1b\xf6\x09\xda\xe0\x01\x70\xf0\x4c\x99\xd7\x5b\x7f\x63\x99\x8d\x30\xa1\x34\xff\x65\x44\x39\xae\x6f\x94\xbe\x94\xc6\x95\x43\x83\x99\x10\xa7\xa9\xd8\xf2\x35\x77\xbf\x16\x44\x5c\x10\x07\xcf\x94\xec\xc6\x7d\x32\xeb\x6c\x53\x17\xce\x5b\x26\x3c\xf1\x90\xe5\x09\x19\x23\xec\xaa\xa3\x19\xcc\x38\x3a\xe4\x18\x33\xbf\xe1\xf2\xd0\x13\x11\x17\xc4\x05\x49\x21\xa1\xfd\x19\x57\xfa\xf3\xdc\xdd\xd4\x4c\xfd\xa8\x80\x9c\xaa\xf7\x2e\xf9\x48\x42\x86\x6b\x33\xdc\xcf\xe2\x68\x1d\x69\x57\x5f\x1e\x86\x30\xaf\x3d\x43\x98\x26\x10\x87\x68\xba\xd0\xf4\x77\xdf\x0c\xfa\x87\x3e\x4d\x02\x95\x28\xc7\x6f\x75\x1a\xdf\xb6\x3a\x2b\x60\x97\x11\x11\x21\x7b\x6f\x28\xd2\x5c\x55\xff\x98\x6e\x99\x53\xe1\x7a\x63\xea\xaa\x4b\x2f\x62\xe8\x20\x0e\x2e\x81\x80\xe0\xa5\x86\xec\x9b\xd5\x15\x7a\xa2\xed\xf3\xf9\x43\xb7\x86\xba\xed\x65\x0b\xbc\xab\xbc\x7f\x1c\xe8\xac\x19\x76\xbd\x57\x85\xf6\x24\x41\x1c\x5c\x02\x0d\xba\xc5\x0b\xd7\x4d\x08\xbf\x61\xc5\x3c\x21\x98\xe1\xb9\x9b\x46\x8d\x31\xd7\x7b\x55\x8f\xac\x54\x85\xd8\xd7\xf5\xfb\x5b\x32\x1a\x44\x5c\x10\x07\x97\xc0\x53\x37\x91\xca\xc6\x66\xd4\x72\xc3\x8e\x81\x63\x7f\xba\xe5\x60\x73\x37\xbf\x08\xb2\x64\x81\xf8\x12\xc5\x2f\xf9\x47\xbf\x57\x19\x11\x71\x41\x1c\x5c\x02\xf5\x84\x8f\x2f\x9b\x9d\x9f\xf4\x61\x46\xcf\x8e\x56\x5a\xf9\x74\xa5\x10\x8b\x25\x11\xdf\x69\x60\xae\x86\xf2\x3c\x7e\x4d\x48\x6f\x06\x42\x02\x20\x0e\xea\xbb\xf1\x77\xdf\x0c\x9a\x5c\x4f\xf5\xcd\xab\x7d\xba\x31\x53\xab\x8f\x3e\x95\x48\x9a\x34\x23\x65\x12\xdb\x05\xfa\x3a\x6a\x09\x27\xf6\x1e\x34\x9d\x0b\xb1\xe1\xc2\x85\x5e\x35\x01\x71\x70\x09\xfc\x60\xd4\xd9\xa6\x23\xb1\xd3\x6c\xf4\x5c\x3f\x40\x09\x21\x5f\x7e\x72\xf5\xfa\x0f\x51\xac\x8f\xb4\xe7\x47\x04\x0a\x9e\x73\x8f\x11\x23\xe2\x82\x38\xb8\x04\xa4\xe3\x8e\x5f\x8f\xa6\x8a\xfc\xee\xdf\x2b\xa9\xc9\x2e\x44\x16\x17\x78\xf1\x66\x36\x13\xc7\x26\x61\xec\xb7\xab\xd8\x41\xb7\x06\x74\xda\x03\xc4\xc1\x25\xe0\x9c\x12\x22\x51\x47\xeb\x60\xd2\xc5\x22\x63\x37\x36\x7d\xd7\xc0\xf3\x25\x9d\x19\x7d\x30\xd9\x0f\x83\xc9\xe9\xec\x95\x16\x8f\x2c\xa8\xda\x07\xe0\xe0\x12\x08\x13\x09\x4c\x2e\x7b\x19\x72\xad\x7d\xe3\x77\x04\x17\xf9\xc3\x98\x5d\x8e\x9c\xad\xac\x5b\xcf\x50\x28\xd1\x6e\xe5\x2b\x7e\x3e\x28\x43\xac\x97\x41\x1c\x74\xdf\x1e\xe0\x9b\x41\x99\xee\x34\x0d\x14\x3d\xc7\xba\xde\x3c\x72\x0d\x6d\xe4\xb9\x42\x2a\x5f\x94\x8b\xc2\xe5\xf8\xcc\x26\xd6\x27\xbc\xfd\xf9\x0a\x93\x21\xc7\x1c\x22\xed\x88\xb1\x83\x38\xb8\x06\xe2\x50\x33\xb8\x9e\x7d\x94\x64\xaa\x51\x5f\x92\x5b\xcb\x25\xb0\xc4\xc6\xe4\x2c\xa6\x9d\xc4\xcc\x8d\x41\xdd\xa9\xfb\xb9\x35\x3c\x07\x35\x34\x05\x70\x70\x0d\x44\x48\x64\x78\x11\xb7\xbd\xbf\x7a\x9d\xc5\xed\xf9\xec\x05\x9a\x7a\xa4\x02\xbe\xa4\xbb\x44\xef\xd6\x44\x6d\x7f\x3e\x61\x0f\x25\x77\x41\xc4\x05\x71\x70\x0d\xf8\xb2\x0f\xc8\xe7\xfa\xe0\x8d\xe3\x5c\xd1\xa8\x1d\x2b\x17\x99\xb6\x40\x23\x5d\x53\x1c\x4a\x22\x1d\xf4\xd3\x47\x4a\xdc\xab\x86\xca\x67\x20\x0e\xae\x81\x6f\xb8\x57\xec\x45\x46\x2e\x16\xfe\x4e\xc3\xa3\xe7\xef\xb9\x29\xfb\x89\xcf\x01\x5f\x45\x89\x3c\xa9\xf9\xda\x77\x2c\x47\xf2\x73\x33\x08\x0d\x80\x38\xe8\xbe\x3d\xc0\x37\x83\x96\x1d\xa7\x69\x20\xe4\xb3\xa6\x8d\x51\xb0\x1c\xaa\x61\xc2\x3d\xe4\x20\xac\x3e\x7f\xe6\x16\x23\xf2\x44\xac\xfc\xd0\x9a\x68\xfb\x90\x82\xb6\x4f\x50\xaf\x68\x10\x07\xd7\xc0\x03\x86\x7c\x94\x1c\xb4\x35\xfe\xa3\x97\x19\xdd\xb2\x6b\xb8\x4c\x39\xf1\x05\x65\xa8\x43\xd6\x0f\x44\xdf\x5b\xfa\xd0\x7f\x92\xa8\x45\xc4\x05\x71\x70\x0d\xac\x5c\xd6\x08\xdf\xa0\x93\xb1\xd7\x76\x47\xc7\x2b\xf5\xb4\xb9\xd3\x38\x69\x8b\x8c\xc2\xfc\xdb\x8e\xc6\xc6\xe7\x2e\x5f\x66\x40\x27\xe4\xf3\x01\x1c\x5c\x03\x74\xe9\xfd\x9d\x76\x45\xd7\x8c\x9b\xce\x3d\x90\x75\x18\x7a\x7a\x39\x2b\x7b\x80\x52\x5c\x5a\xbf\x09\xe3\xfa\x77\xfc\x47\x2f\x2b\x21\x3f\x0e\xe2\xe0\x1a\xc0\x58\xb3\x37\x10\x32\x35\xaf\x2a\x7c\xd8\x25\x24\xa5\xbd\x9b\x38\x35\x7b\xc3\xec\x40\x54\x77\xd0\xf5\x36\xfe\xa5\x83\x31\xbe\x30\x84\x06\x40\x1c\x34\x0f\x00\x7c\x33\xc8\x42\x9d\xee\x9b\xe7\xeb\xeb\xd5\x25\x9c\xc2\x56\x86\x26\xbd\x63\x7c\x16\x49\x07\x63\xf5\x3b\x52\x7a\xcb\x12\x78\x5f\x3d\xd1\xe7\x28\x40\xfe\x70\x15\xe1\x41\x41\xdc\x29\xcf\xd0\x46\x6f\xec\x4c\xb6\x5c\x0c\x50\x21\xa0\x94\x12\x2a\x16\xb9\xa4\xeb\x64\xc2\x1f\xbf\x7d\x0f\xe5\x4e\xc1\x50\x9a\x79\xdf\x04\x33\xf4\x0c\x2d\x80\x3b\xe9\x6e\x29\x1c\x1b\xba\xef\xea\xed\x60\x60\xa8\x94\x61\x4f\xe3\x7e\xa0\xf8\x7e\x5b\x64\xc9\x41\xc9\xe2\x95\x6d\x4b\x21\xf5\x7a\x7f\xe4\x32\x22\x32\x88\xfb\xef\x63\xb1\x7f\x46\xf6\x7c\x93\x21\x5d\xfb\xfc\x9c\xd4\xb2\x08\x8e\xc9\xcd\x22\xde\x4b\x7b\x7a\xf8\x13\x0a\x96\xcf\x45\x7b\x82\x7f\xc8\x7f\xcf\xc3\x59\x43\xf8\x66\x10\xf7\x1f\xdf\x7c\xee\x1f\xbe\x79\xff\x42\xec\xf0\x91\xed\x5d\x96\xaf\x97\xf2\x59\xcb\xbc\x25\xd8\x7a\x49\x5a\xe4\xbc\x6d\xc4\x55\xac\x53\x87\xde\xba\xce\x3d\x46\xfe\xd3\x37\x9f\x4f\xc7\xe4\x78\x38\x64\x17\x32\xcc\x59\x17\xaa\x57\xf1\x40\x8e\x94\x79\xb8\x88\x6e\xe2\x52\x6b\x76\xf7\xa3\xba\xf3\x39\xd8\xf7\xff\x40\x49\x24\x14\x44\xdb\x97\xc5\x4c\xb0\x94\x43\x1e\x85\x44\x32\xab\x63\xfa\x72\x2a\xad\x98\xdd\x31\x0c\x7b\x59\x36\xc9\x7f\xb0\x7b\xeb\xdf\xe6\x9b\x41\x43\xfb\xc3\x37\x23\x49\xc3\xcd\x55\xd1\x27\xbb\x5d\x52\x75\xe4\x57\xe4\xd2\xa4\xe8\x59\xa5\x6b\xb7\x7b\x6e\xcf\x4d\x96\x5c\xb8\x48\x9d\xb4\x46\x82\x2d\x73\x95\x8a\xe3\x2c\x7c\xb3\xff\x09\xdf\x4c\x15\x4d\x1b\x87\xad\x42\xb3\xd9\x5a\xae\xf1\x3a\xc4\x32\x71\x89\x25\x5e\x91\xca\xd2\x90\xcb\x0c\x89\xc5\xec\x89\x27\xfe\x45\xe5\x33\xd9\xf8\x15\x3a\xe1\x24\x7f\xef\x26\x54\xbf\xb1\x22\x93\xbe\x5d\x87\xd4\x7f\xb5\xbd\xf4\xea\x82\x20\x76\xca\xbb\x6c\x8b\x05\x21\xff\xfa\x98\x19\xe1\x09\xaf\x33\xd9\xf8\x3d\xe9\x9b\xc3\x51\x55\x0d\x48\x46\x87\xfd\x98\x3f\x68\xd1\x21\x3d\xc5\x4e\x67\x4b\xdd\xf3\x75\x5d\x6b\x69\xf2\xbd\xe2\xa2\xfb\x31\xdb\xd1\xe6\x4c\x46\xeb\x7c\xe2\xc7\x0e\x1a\x5d\x27\xff\x25\xe4\x9f\xe3\x65\xc2\xa8\x42\x66\xcc\x21\x3f\xeb\xcb\x21\xa2\xc6\x92\xed\x18\xd8\x21\x96\xb7\xd8\x6c\x3b\x71\x66\xbe\x19\xa4\xa1\xd3\x32\xe5\xa6\x6a\xe1\xd5\x15\xc9\x87\xfa\x36\xec\xaf\x39\xb3\x8e\x18\x3c\xea\x30\x55\x2b\xdd\xae\x7c\xce\x0f\x73\x94\x68\x64\x4c\x19\x83\xf6\x59\x41\x1c\x3c\x53\xd6\x59\x12\x46\xd6\xb1\x75\xf6\xff\x2e\xe5\x89\x31\xf9\xb8\xcd\xc8\xea\x50\x8e\xf9\x6d\x4c\x88\x09\x2f\x03\x6d\x98\xdf\x01\x25\x1d\x11\x17\xc4\xc1\x33\x65\xfb\x07\xce\xfa\xc7\xe8\x4e\x2c\x95\x56\xb8\x9f\x5f\x56\x71\x8a\x7e\x57\xbd\x96\xa6\xeb\x99\x9b\xb0\x7b\x83\x1f\xcb\xe1\x87\x63\x3d\x22\x2e\x88\x83\x67\xca\x49\x6e\xf2\x8c\x4e\x11\xe3\x04\xd1\x07\x73\x69\xad\x6a\xd7\x28\xf8\xe5\x5f\x3a\x79\x9d\xab\x9e\x0c\xcc\x64\xc1\x96\x4f\x7d\x6e\x01\x5d\xff\x06\x70\x41\x52\x48\x12\x7f\xc6\xfd\xf4\xb9\xe9\xcb\xc5\xc2\xb0\x37\x8b\x04\xb4\x9f\x98\xe6\x16\x0c\xba\xe8\x34\xfb\x64\x45\xa3\x22\xeb\xa5\x8f\xc9\x42\x47\xd8\xad\x11\xa6\x09\xc4\x41\xcd\x0f\xa4\xff\xba\x58\x02\xfd\x43\x9f\x26\x01\xea\xee\xc5\x28\xed\x85\xac\xbb\xf7\x51\x7e\xf3\xda\xdf\x7b\x2a\x43\xb4\xf6\xea\xf3\x62\x71\xcc\xa6\xec\x3d\x95\xf1\xb4\xc6\x5b\x50\x83\x2a\x10\x07\x97\x00\x41\xf5\x53\x1b\xb4\xfc\xf5\xec\x9f\x35\x83\x96\xae\x7a\x6c\x73\xca\x9a\x16\x3d\x55\xd5\x05\x8f\x58\xec\x54\x39\xf8\x2f\x95\x04\x40\x0d\xe5\x00\x1c\x5c\x02\xd7\x79\x0a\x8b\xe5\x6a\xe7\x84\xd6\x4a\xf4\xa8\x93\x26\x5f\xe6\xda\x95\xef\xa2\xa7\xdc\x4a\x8f\x5f\xbc\xd2\xaf\x69\xfd\x34\x4d\x08\x3a\x22\x01\xe0\xe0\x12\x60\x4c\x38\x32\x72\x3e\xa4\x22\x8e\xbd\x14\x16\x65\xad\xd5\xcf\xf5\x9d\x21\xd9\x05\x0b\xbf\x83\xbc\x13\x99\xd7\x57\xf4\x35\xf3\x16\x74\xeb\x13\xc0\xc1\x25\xc0\xdd\x2b\xde\x74\xad\xf8\x07\xa5\xc0\x0a\xef\xfd\x64\x3c\x35\x6d\x97\xa4\xa4\xcb\x44\x1d\x9a\xaa\xe6\x63\x25\xd1\x09\x99\x13\xe4\x08\x09\x80\x38\xa8\xf9\xc1\xdf\x7d\x33\x68\x72\x3d\xb5\x65\xe9\xed\x2f\xdd\x36\xb8\x82\xe1\x2b\x71\x5d\x34\xb1\x2c\x1f\xdb\x4c\xe9\x6d\x45\xec\xb6\x4b\x6d\x3f\x23\x23\xdd\xbe\x3d\x1f\x0e\x1d\x5f\x04\x71\x27\x7a\x15\x06\x5f\x17\x30\x7e\xb5\x7c\xe9\x65\x8e\x91\xbe\x5b\x87\x99\xea\xcf\x68\x83\xe0\x9e\xe8\x83\x5b\x15\x18\x9e\x12\x03\xc1\xa4\x4a\x50\xaf\x42\x00\x07\x97\xc0\x95\x7b\x86\x02\xe7\x18\xee\x95\x6d\xb1\x1e\x7c\x88\xd1\x62\xef\x41\xcb\xbc\xfa\xe2\xde\x73\x67\xec\xe8\xdc\x11\xce\x55\x3f\x17\x1e\x44\x5c\x10\x07\x97\x80\xac\x92\x53\x3e\xd5\xbb\x9f\x9c\xd6\xfb\xb3\x5e\x4e\x43\x1d\xb6\x23\x56\xdf\x79\xaa\x23\xfb\x85\x86\xf2\xde\x94\x15\xb7\x22\x9b\x41\x47\x8f\x01\x1c\x5c\x02\xf8\xa2\x33\xe7\xae\x04\x39\x1c\x3d\x5b\x3b\x46\x91\x89\x1b\xc1\xba\x16\x7b\x5f\xd0\xdb\x45\x08\xbd\xd8\x16\x9d\xd5\xac\xfd\xd9\x73\xc4\x7a\x19\xc4\x41\x97\x9e\x85\x00\xc7\xae\x01\x99\xee\x34\x0d\x44\xcf\x0c\x5d\x90\x9a\x9b\xbe\xe6\x58\xe7\x8b\x11\x62\x31\x5b\x12\x35\x82\xef\xe2\x9d\xfa\x1e\x33\xd2\x97\x1e\xef\x6a\x9c\x4b\x2a\xd4\x5e\x16\xc0\x9d\x68\x80\x71\x2b\xfd\xf7\x97\xcb\x37\xbe\x6e\x54\x28\x85\x5a\x8c\xa5\x60\xd4\x91\x87\x0a\x07\x52\x76\xdc\x55\xf0\xf2\xcd\x71\x31\xbb\x07\x5d\x6a\x02\x71\x70\x0d\x84\x14\x33\x19\x3c\x27\x4e\xfc\x71\xe1\xda\x63\x87\x2c\x3b\x89\x1b\x1e\xb3\xdf\xc7\x43\x29\x92\x34\x77\xc7\x08\x9b\x2a\xf8\xac\xa1\x7d\x6c\x10\x07\xd7\x40\x5d\xbc\x66\xdc\xd5\x63\x1b\x5d\xda\x69\x73\xac\x4d\xef\x1e\x5a\xa6\xeb\xec\xd5\x64\xe1\x52\x3f\x28\x5b\xdf\xc9\x8e\x08\x57\x41\x3e\x1f\xc4\xc1\x35\xc0\x51\x42\xb9\x2d\x7b\xd7\xcd\xd1\xea\x78\x2b\x32\xe6\x11\xe3\xf3\xb2\xc8\x7b\x01\xc9\xf4\xbe\xc5\xb4\x24\xe5\x2e\xef\xfc\xcd\x94\x10\x1a\x00\x71\xd0\xa5\x67\x80\x6f\x06\x2d\x3b\x4e\xd3\x40\xd6\xb1\x81\x81\xeb\x0a\xbe\x0f\x35\x97\xa4\x94\x95\xec\x84\x59\xf3\x91\xbf\x38\x5a\xd0\x95\xab\xc4\xcb\x01\x72\xd9\xb7\x23\xa1\xde\xa2\x20\x0e\xae\x81\x24\x61\xf2\x76\x2b\x97\x6f\xf7\xdc\x8d\x35\x87\x1d\xb8\x72\x85\x76\x5f\x16\x31\xac\x46\x3d\x8e\x4a\xce\x24\x4f\x99\x76\x75\xb9\x85\x88\x0b\xe2\xe0\x1a\x40\x52\x96\x74\xe2\xc3\xb1\x33\xb8\x44\xd8\x54\x47\xca\x35\x1a\x7b\x18\xc8\xa3\x61\x82\x13\x91\xf1\x80\x6e\xe0\xc5\x7b\x9a\x21\xa8\x59\x09\x88\x83\x6b\x40\x18\xc3\x2f\x9a\x66\x5d\x73\xcf\xc0\xe1\x15\x12\xcb\xac\x7d\x16\x85\x73\x58\xfe\xaa\x4c\xc4\xd0\x75\x7a\x71\xdf\x51\xe7\xa3\x23\xa8\x0f\x26\x80\x83\x6b\x20\x21\xc0\x60\xad\xce\x2a\xdd\x68\xa1\xaa\x59\x74\x94\x7b\xcb\xf5\x16\xbb\x63\xd5\xa3\x3d\x3f\x2f\xff\xe4\x3b\x24\x3f\x97\x3d\x57\xa1\x5e\x85\x00\x0e\x9a\x07\x9c\xff\xee\x9b\x41\x16\xea\x74\xdf\xcc\x2c\x8e\x6c\x87\xb5\x98\xae\x8f\xef\xaf\x5a\xf9\xfe\xfb\xd0\xb7\x51\x67\xe5\x1b\xa9\x05\x8e\x83\x4e\x9e\xfd\x77\xd8\xbc\x39\xae\x21\x3c\x28\x88\x3b\xe9\x9b\x67\xd6\x02\x9b\xb1\x4a\x8c\xd3\x94\x8b\x14\xbc\x63\x63\x79\x1f\x3f\x9e\x7c\xd0\xba\xda\xf7\xe9\xc2\x77\xdb\x06\xe7\x41\x23\xf6\x3e\xa8\x0b\x22\x80\x3b\xe9\x9b\xd5\x18\x13\x62\x77\x8c\x6b\x88\xfc\x69\x3f\x05\x71\xb4\xdf\x93\x91\x7d\xe2\x19\xd9\x28\xa3\xbd\x98\xfe\xac\x62\xe7\xaa\xe1\x0d\xa8\x57\x21\x88\x3b\xf9\x3b\x1b\x62\xaf\xe8\x4c\xfe\x76\xd1\x71\x5e\x16\xeb\xc2\x88\xdc\x48\x48\xfb\xf8\xce\xc5\x33\xad\x91\xfd\x9e\xc2\x4b\x2c\xa7\xfb\x99\xa2\x08\xdf\x0c\xe2\xfe\xeb\xc8\xff\xf4\xcd\x32\x6b\xab\xb5\x92\x73\x45\x3f\x52\x28\x5f\x0a\x6d\x2d\x47\x0d\xa0\xfe\xb0\x4b\xf1\xff\x90\xf0\x76\xd8\xf1\x7a\xbe\x8b\x6f\x1c\xd5\x9f\xbe\x19\x5d\x80\xe1\x59\x6f\xd6\x3e\x31\xdb\xa3\xce\x44\xd7\x01\xbd\xd9\x80\xc2\x5f\xe8\xcb\xb5\x83\x32\x39\xce\x1e\xd2\xf6\xf1\x4f\x59\xfe\x40\x87\xf5\xd8\x94\x35\xf5\x7e\x0a\x1e\x4c\x14\x72\x8f\xaf\xb4\x7d\xb6\x39\xd7\x98\xff\xea\xf3\x34\xab\xc3\xbe\x29\xa9\x07\xc6\x17\x92\x7f\x9b\x6f\x06\x0d\xed\x0f\xdf\x2c\x71\xc2\x37\x8b\x2b\xa0\x49\xe0\x4e\x8b\x17\x59\x57\x06\x21\x4b\x5e\x41\xd7\x12\xca\xd6\xb4\x66\x48\xfc\xaa\x34\xf4\xa4\x65\xbb\x26\xb6\x3d\xfe\x2c\x7c\x73\xd3\x09\xdf\xec\x9c\xbb\xe8\x78\x28\x69\xf5\x6d\x11\xed\x1c\x87\x85\x8d\x1a\x11\xa3\x36\xfe\x3d\xcc\x77\xaf\xe2\x7d\xb5\x9d\x28\x2d\x9b\x38\x33\xce\x64\xe3\xf7\xa4\x6f\x0e\xf4\x43\x37\x99\xce\x78\xf8\x24\x9c\x25\x67\xc6\x3a\xe4\x47\x7e\x69\x90\x89\x92\x56\xcf\x55\x5f\x54\xf6\x1c\x96\xb8\x0f\x43\x8e\x67\xb2\xf1\x7b\xd2\x37\x07\x14\x89\xb6\xd3\xa5\xbd\x68\xd6\x79\x99\x82\xa5\x2b\x89\xec\x59\x4d\xcf\xb7\xaa\x56\x2d\xf2\xc6\xfc\x67\x60\xca\xd3\xa7\x9b\xf2\x67\x32\xda\x93\xbe\x99\x14\xd7\xbb\x62\x84\x28\xc0\x86\x5b\xcb\x8f\x36\xab\x8f\xdc\x79\xf8\x3c\xbe\x66\x83\xd8\xd4\xd0\xfb\x45\x92\x91\xef\xdc\x6e\x2f\xcf\xcc\x37\x83\x34\x74\x5a\xa6\xcc\x74\x94\x6b\xfe\x66\x78\xab\x93\x3a\xcf\x07\x77\xc0\x7a\x95\xe5\xb8\xa7\x2c\xc0\xa7\x7b\x8b\xa8\xec\x26\x21\xa6\x5a\xca\x26\x74\x39\x0b\xc4\xc1\x33\x65\x84\x73\x39\x71\x37\xcb\x5b\xdf\xaf\xda\x2e\x36\xb4\x62\x5d\x57\x27\x70\x2b\x25\x30\x97\x0d\x97\xc2\x5c\x7b\xe6\xb7\xad\xed\x79\xa1\xdd\x00\x00\x07\xcf\x94\x95\xd6\xc2\x97\x97\xd2\xca\xe5\xb6\x69\x50\x19\xa4\x2b\xed\xb8\x12\x30\xb4\x9f\xd0\x74\xbd\x5b\xb8\xb3\x22\x7b\x9f\x6b\x73\x17\x7a\xe7\x1e\xc4\xc1\x33\xda\xb5\x9d\x9f\x3b\xcf\x6e\xc6\xa3\x7d\xde\x2c\x49\xd1\xfd\xf4\xe5\x6b\xc4\x07\xb6\x9b\x92\x46\xc4\xad\x51\xeb\xef\x9e\x7c\x39\x5e\xb8\x8d\x88\x0b\xe2\x82\xa4\x50\xfe\xf1\x1d\x84\xb7\x0f\x4c\xb5\x26\x2c\x12\x71\x5f\x24\xe0\x94\xba\xa4\xf9\xa4\xd6\x5d\x5f\x76\x93\xa9\x3a\xb6\x12\xc5\xa0\xbd\x44\x97\xc9\x8b\x30\x4d\x20\x0e\xba\xb2\xfe\x77\xdf\x0c\xfa\x87\x3e\x4d\x02\x3d\x92\x9b\x33\xf7\x84\x45\xe3\x83\x69\x35\x2a\x03\xcd\x4d\x3d\x71\xcf\x11\xf8\xba\x5f\x27\xde\x18\x78\x10\xc0\x78\x10\x33\x96\x87\x18\x3a\x88\x83\x4b\x40\x18\x45\xda\x43\x36\x70\xbf\x7a\x4b\x21\xcb\x42\x29\x9f\x5d\xea\xd8\x35\x35\xdd\x5f\x30\xe3\xf1\x4f\x64\xf7\xc8\x40\xd2\x37\x4d\xd0\xe2\x03\xc0\x9d\xe8\x1b\x19\x4c\x67\x7a\x49\xb3\xc4\x3b\xe6\xbd\xe1\xf3\xac\x5f\xef\xa7\x6d\x77\x3a\xbb\x4a\x0e\x2b\x1c\x5b\x30\xd8\x04\xb9\x8f\xb4\x71\xa1\xbe\x91\x00\x0e\x2e\x81\xe3\xb7\x9a\x19\x59\x3a\x18\x32\x22\xcd\xaf\x6c\x9e\x18\xd2\xd7\x11\x8f\x98\xb6\x61\xaa\x08\x13\x6b\x30\x2a\x10\x37\x17\xba\x7d\x46\xc4\x05\x71\x70\x09\xd8\x6a\xc5\xcf\x66\x7b\xa4\x05\x5c\x78\xda\xbd\x2c\x97\x94\x96\xed\x97\xce\xa2\x66\xb7\x60\xa9\xae\x9e\x21\x90\xa9\xc1\xa8\x77\x88\x90\x00\x88\x83\xae\xac\xff\xdd\x37\x83\x26\xd7\xd3\x24\x40\x41\x44\x36\x56\x43\xe9\x83\x2d\x63\x2c\x6b\xfc\xa6\x95\x67\x4c\x75\x39\xa1\x49\x38\x95\x61\xb4\xd1\x87\xed\x5d\x35\xf1\xc7\x6a\xa8\x5f\x22\x80\x83\x4b\x80\xe1\xa1\x1b\xb7\x06\x51\xde\x06\xde\xc8\xcd\x4e\x8f\x32\x0b\x1f\xd1\x1e\xb6\xf4\xe2\xdf\x3a\xce\x8f\xab\xb6\x94\x05\x04\xee\x41\x7d\xe3\x41\x1c\x5c\x02\x51\x28\xd7\x3c\xe8\x1b\xf7\xb7\x82\xfa\x33\x5a\xa6\xae\xc5\x57\x7c\x29\x21\x6f\x90\x13\xb0\x53\x96\x2a\xde\xe2\x08\x6e\xc2\x86\xf6\x85\x41\x1c\x5c\x02\x96\xdf\x85\xe6\xde\x77\x18\x0d\xe0\x72\x7c\x4c\x72\x8e\xa3\xbf\x96\x4b\x1d\x63\x11\xea\x43\x12\x6e\x4d\xf8\xce\x95\xa9\x46\x07\x6a\x6e\x06\xe2\xe0\x12\x58\xe0\x99\x72\xce\x37\x50\xa5\x3b\xa8\xc6\xfd\x2a\x9d\xba\xc3\x73\xc1\xb6\xd4\x92\xa1\x99\x2c\x61\x88\x68\x45\x82\xd1\x2a\x6b\x0e\xb1\x5e\x06\x71\xd0\x55\x55\x80\x6f\x06\x65\xba\xd3\x34\x40\x7f\x9b\x71\x4f\x04\x8d\xd5\x16\x57\x6e\x61\x40\x78\xef\xdd\xbb\x5e\xd2\xba\x57\xed\x32\x66\x7a\x68\x12\x82\x2c\x21\x9e\x71\x50\xcf\x4c\x10\x07\xd7\xc0\xc3\x73\xa2\xe8\x17\xac\x28\x07\x0a\x88\x1e\x12\xb5\x50\x39\x27\xdc\xa3\x46\x67\xaa\x75\x33\x31\xec\x11\x1d\x3c\xb4\x29\xb9\xe0\x80\x88\x0b\xe2\x4e\xf4\x77\xbf\xeb\x68\xc2\x12\xef\xa4\x45\xcb\xf9\x1b\xad\xc8\xd8\xcd\x3c\x99\x47\x8e\x53\xbd\x55\x7a\x69\x2e\xb9\x33\x0c\xe5\x8d\x34\x0b\xd4\xdf\x1d\xc0\xc1\x35\xd0\xba\xff\xba\x36\x2a\x70\xb6\x5d\x28\xd3\x36\xed\x06\xb9\x44\x0e\x7e\x54\x5b\x98\xdd\xf2\x48\x8f\x46\x84\xc2\x30\xa6\xf0\x8e\x25\xd4\xbc\x04\xc0\xc1\x35\x40\x3d\x36\x11\x35\xc6\xff\x8a\xea\xf5\xfc\x15\x1a\xbc\x0b\x73\x37\x86\xda\x16\x46\xba\xb9\x2e\xdb\xd8\xb0\x28\x6d\x72\xd3\xb3\xa4\x21\x34\x00\xe2\xa0\xab\xaa\x00\xdf\x0c\x5a\x76\x9c\xa6\x01\x8d\xd9\xdb\xbe\x77\xd0\xd3\x62\x77\xdb\xe2\xd1\x3a\x77\xd5\x97\x9e\xdc\x61\x6d\x8b\x4a\xb4\x1b\xfa\xc2\xb6\x8e\x6c\x73\xa9\xa7\x1b\x31\x76\x10\x07\xd7\x40\x53\xdc\x82\x8a\xc4\xa1\x1c\x56\x0d\xf3\xb6\xf0\xdc\xd2\x92\xd8\x4f\xef\x16\x87\xac\x68\xb5\x42\xe3\x34\x25\x85\x19\xe5\x59\xe8\x9c\x36\x88\x83\x6b\x20\x45\x77\x88\x11\x23\x20\x76\x99\x36\xca\x95\x6b\xf5\xce\x3b\xc9\x45\x76\x7c\x79\x9d\x79\x83\x23\x1c\x6c\xe5\x5f\xa6\x78\x6a\xd0\xdf\x0a\xc4\xc1\x35\x20\x49\x9c\x27\xf5\x40\x30\x2d\x73\x5c\x3a\x0b\xff\x08\xf5\xc1\xf3\xc9\x4b\xf5\x78\xd6\xa6\xe7\xd4\xee\x65\xcf\x5e\x51\xc6\x7c\x6e\x03\xb5\x2d\x00\x70\x70\x0d\xb4\x4b\x15\x5f\xd0\x5c\x56\xf4\xa5\x26\x08\x36\xef\x17\x7b\x59\x77\x8e\x87\x6e\x29\x9c\xad\x87\x55\xcd\x3d\x8d\xca\xc9\x4a\x8a\x03\xa1\x01\x10\x07\xcd\x03\x00\xdf\x0c\xb2\x50\xa7\xfb\xe6\xcc\xc8\xc3\x17\xc9\xae\xb1\x41\xef\xbf\xdb\x91\xf0\x1b\x60\xbc\xfa\x5d\x4b\xef\xae\xc1\xbf\xf0\xde\x7f\x59\x48\x89\x46\xfb\x50\x00\xe1\x41\x41\xdc\x49\x0f\x9a\xa1\x9d\xdc\x26\x9c\xb8\xda\xa7\x84\x71\x91\x86\xf0\xab\xb8\x69\xc9\x76\xd7\x6f\x2c\x06\x8f\x63\x02\xf7\x0f\x8c\xfa\xd2\x22\x82\x88\xc8\x20\xee\xa4\x6f\x96\x47\xd6\x7e\xf3\x58\x62\xfd\x8e\x0d\xaa\xde\xe3\x73\x65\x3d\xb1\x22\xda\xa1\x31\xae\xdf\xb0\x3b\x3a\xc9\x2e\x97\x75\x5e\xbd\xf6\x13\x11\x19\xc4\xfd\x77\x57\xf8\xcf\xc8\x5e\xe4\x85\x0f\xd5\x3e\x1d\xe8\xd1\x04\xf9\xc9\xae\xe7\x2a\xb0\x58\xf4\x5c\x46\x72\x6a\x1f\xcb\x2b\xd5\x3b\xf2\xae\xbc\x4e\x66\x8d\xf0\xcd\x20\xee\xbf\x17\xa1\xff\xf4\xcd\xca\x94\x8a\x13\xcf\xe3\xde\x48\x91\xcb\xca\x2e\x8d\x34\x29\x94\x27\xed\x8f\x6d\x3b\x50\xb0\x45\x8b\xbe\xb5\x10\xe6\xd6\xf8\xc4\xfc\xa7\x6f\x56\x95\xbc\x94\x6f\xdf\xe8\xaa\xdc\x34\x71\x31\x47\x3a\x7f\x3c\xed\x09\xb3\x81\x38\x92\x5b\x5c\xff\x87\x52\xe6\x6e\xfb\xcb\xff\x38\x8f\xbc\x7f\xa7\x7e\x26\xa1\xf7\x5e\xeb\x9b\x07\xe8\xd9\xca\xeb\xf4\x14\xc2\x18\x42\x8b\xf6\xd9\x66\xbf\x03\x03\x9a\xe7\x09\xb5\x12\xff\x75\xfb\xcd\xa0\xa1\xfd\x79\xbf\xf9\x84\x6f\xa6\x40\xf6\xf1\xe0\x0d\x73\xa3\xf1\x12\x8e\xf5\x1a\x44\x2f\x7b\xca\x12\xac\x6b\xa8\xee\xd7\x97\xf7\xf3\x52\x1a\x2d\xf7\xbb\xb7\xaa\x67\xe1\x9b\x91\xd4\xe0\x3f\x95\xf7\x7c\x3c\x6b\xe5\x2b\x1e\x37\xe7\x98\x1f\x75\xc5\xa3\xf6\xbe\x5e\x65\xd1\x61\xb3\xe3\x68\x78\xda\xa3\xa3\x6c\x5a\x5f\x6e\x4e\x9d\xc9\xc6\xef\x49\xdf\x5c\x94\xf1\x60\xff\x41\xc2\xd8\x83\xed\xb2\x7e\x43\xbd\x57\x0c\x1e\xa2\xbd\x3c\x9f\x0e\x33\x36\xb0\xad\xb8\xf7\x59\xf2\xf0\x71\x16\xce\x64\xe3\x57\xe7\xc4\x8f\xd5\x91\xca\xfb\xae\x47\x9a\xe3\x11\x31\x33\x8d\xc1\x4b\xf7\xa3\x9f\xf8\xe8\xcd\x10\x8b\xb3\xe6\xd8\x7c\x5a\xb2\x0d\x2d\x0b\x27\xc1\x99\x8c\xf6\xa4\x6f\x0e\xa6\x20\xac\xee\xea\xd0\x60\xd8\xbe\x79\x2e\xbd\x46\xfc\x2d\xc3\x97\x83\x8f\x44\xcc\xc2\x5a\x84\x56\x6c\x6f\x65\x7c\x73\xf6\x28\xce\xcc\x37\x83\x34\x74\x5a\xa6\x44\x6d\x6a\xb0\x8b\xd6\xcc\xae\x47\xb3\x41\x9f\x2a\x1d\x18\xb3\xc4\xc0\x35\x8f\x9d\xfd\x79\x2d\x40\x26\x81\x53\xf7\x36\xd6\x7b\xe8\x95\x29\x10\x07\xcf\x94\x5e\xe2\x6f\x28\xb5\x1e\x5f\xfe\x8e\x5c\x63\x94\x5d\x6c\x7d\xbf\x75\x94\xdc\xd6\xd2\xb4\xd3\x9a\x3f\x28\x1a\x2d\xc3\xa8\xa6\x2a\x16\xea\x1f\x06\xe0\xe0\x99\x12\x83\xe8\xc6\xc3\x06\xd9\xe6\xf0\xf2\x6d\x77\x92\xac\x96\x9b\x14\x94\x42\xd2\xe7\x5f\xdf\x78\x12\x41\x50\xc3\x4b\x3c\xa5\x19\xf1\x1a\x11\x17\xc4\xc1\x33\xa5\x08\xf5\xd4\xb6\xeb\x7a\xbe\xa9\x96\xde\xd1\x8f\x87\xc9\xbc\xbb\x1f\x2b\xe5\xc5\x34\x5e\x97\x47\xd7\x2b\x63\xdc\x5f\xe3\x47\x81\x3a\xce\x83\xb8\x20\x29\x89\x7f\x7c\x87\xdc\x86\xf8\x6c\xad\x8b\x69\xd2\x04\x58\x0e\x71\x09\xf5\x6a\x52\x7e\xb9\x8c\x83\x11\xa3\x34\xb4\x99\x63\x22\xb7\x5a\x79\x2c\x25\x11\xa6\x09\xc4\x41\xf7\x9b\xff\xee\x9b\x41\xff\xd0\xa7\x49\xc0\x71\xa8\x99\x92\x65\x8e\xf0\xc0\x4e\xb1\xb0\xdb\x39\x5b\x40\xb7\x4e\xe1\x19\xc5\x16\x26\xab\x80\xe1\x47\x91\xe8\x76\xed\x48\x05\xc4\xd0\x41\x1c\x5c\x02\x63\x17\x66\x42\x7e\x89\xa7\x8a\xb3\xf3\xea\xf2\x76\x78\x25\x05\x88\x55\x35\x78\x0c\x34\xe1\xbe\x7d\xaa\x86\x62\x55\x46\x3f\x75\x80\x88\x0b\xe2\xe0\x12\x40\xb3\x1f\x13\x4c\x7e\x60\x6b\xdd\xe3\xb1\x96\x3e\x4c\xd2\x4c\x95\x36\xfc\x6e\x98\xfd\x02\x5e\x55\xfd\x3d\xbb\x25\x2e\xb1\x0d\x68\xc1\x0c\xe2\xe0\x12\xc8\xc0\xae\xfe\xb8\x2b\xeb\x7b\xde\xeb\xe0\xd7\x65\xf5\xbb\x37\xb7\xab\xaf\xed\x57\x5b\xbf\xbf\x7a\xa4\x30\xc9\x7a\x83\xa4\x9f\xb0\x07\x11\x17\xc4\xc1\x25\xf0\xfd\x00\xd7\xb1\xcf\xca\xd6\xa7\x93\x5f\xe8\x66\xb8\x75\x3c\x53\xdd\xc6\x27\x6f\xdf\x0d\x4e\xeb\xe2\x5f\xf2\x68\x54\x79\x48\x37\x11\x12\x00\x71\xd0\xfd\x66\xb5\xbf\x4a\x00\x34\xb9\x9e\x26\x81\x55\x2e\xf5\x37\x6e\x03\x8b\xf4\x7b\x32\xaf\x96\xb8\x0c\x1d\xc4\x7a\x1c\x3f\x5b\x34\x39\xa9\x4b\x97\xff\x96\xce\x62\x8f\x96\x87\xf6\x04\x41\xdc\x89\x6e\x7f\xf1\x8d\x2c\x4b\x8a\x9a\xe3\x37\x8c\xc2\x4b\x27\x7f\xf0\xbc\x3d\x7f\xd9\x46\x98\x7b\xa8\x24\x52\x58\xb0\x56\x8e\x63\xc6\x12\x6a\x1d\x05\xe2\xe0\x12\xb0\xc3\x9a\xc2\x29\x53\x37\xeb\x29\x8f\xbe\xe6\x4f\xbd\xea\xec\x39\x16\xb1\x48\xef\xc6\x27\x2a\x8e\xc2\x2f\xcf\x67\xb5\x7d\x1f\x7a\x77\x11\xc4\xc1\x25\x80\x69\x1a\x16\xb9\xfa\xb4\x4f\x51\x4f\x78\x85\x3a\xed\x75\x1b\x91\x9c\x0c\xae\x0c\x43\xd6\xb9\x51\xe5\x47\x76\x0c\xdd\x23\xce\xd0\x93\x1b\x20\x0e\x2e\x81\x12\xba\xf3\x81\xd8\x7c\xea\xbc\x11\x63\x2f\xde\xb1\xf3\xb9\x94\xe1\x17\x86\xdf\x62\x97\x5c\x7d\x1c\x15\xe1\xf3\x92\x4e\x29\x7c\x19\x6a\xf1\x04\xe0\xa0\x7b\x8d\x00\xdf\x0c\xca\x74\xa7\x69\xc0\x5c\x7e\x7a\x43\xa5\x60\x2c\xc0\x4c\xa2\x0f\xc7\x0b\x6d\x68\xce\x26\x18\x0d\xdd\x7b\x95\x7f\xcc\x31\xeb\x87\xf5\x8c\x55\x2f\xd4\x3e\x0f\xc4\xc1\x35\x80\x66\x30\xda\x5f\xa7\xe2\xf5\x29\x1a\x7f\x2c\x8f\x95\x7f\x74\x65\x24\xf8\x8e\x51\x6e\x67\xc1\xbb\x98\x1b\xba\x8a\xc8\x63\x05\x90\x6f\x06\x71\x70\x0d\xe8\x59\x0d\xca\x64\x4a\xbc\xd1\xb2\x78\x92\xdc\x81\x62\x77\x37\x9c\xa6\xa3\xed\xdb\x57\xd1\xdc\x2a\x0f\x42\xf2\x19\xca\x87\xdf\xa1\x5a\x0f\x88\x83\x6b\xc0\x9f\x8b\x4c\x8a\x3c\x24\x0c\x7f\x8c\x9f\xcb\xa2\x6a\xb6\xd9\xe0\x98\xa2\x4f\x9a\x3d\xd7\x23\x4c\x7e\x85\x1e\x23\xa5\x69\x19\xaa\xf8\x82\x38\xb8\x06\xec\xdd\x35\x3f\x9a\x72\xbe\xe8\x22\xbf\xd5\xf3\xc0\x87\xe9\x7c\x52\xde\x17\xee\x07\x36\xc3\x5d\x95\xf4\x8c\x18\x72\x9f\x5d\x89\xb3\x10\x1a\x00\x71\xd0\xfd\x66\x9d\xbf\x6b\x00\xb4\xec\x38\x4d\x03\x78\x8f\xb0\xc2\x4c\x36\x14\x62\x1c\x86\xca\x4d\x5f\x94\xa5\x1f\xca\x66\xfe\xbe\xc2\x2b\x9f\xa8\x90\x1b\xcf\xe9\x7a\x2c\x9a\xb4\x8a\x18\x3b\x88\x83\x6b\x20\x6a\x83\x3d\x6c\x2f\x71\xee\x73\x45\xe2\xc6\x70\xe2\x38\xd3\xac\x29\xd7\xca\xd5\x46\x57\x99\xf8\xa4\xa4\xee\x85\xfc\x94\x21\x24\xa8\xce\x05\xe0\xe0\x1a\x90\xa5\xe0\xd5\xa2\x51\x5d\xe6\x95\x79\xdd\x5d\xf1\x45\xcf\xd8\xf6\x43\xef\x40\x5b\x09\x45\x12\xbf\x34\x7b\xb0\x15\xcf\x93\x43\xa8\xf1\x2b\x88\x83\x6b\x20\x4f\x90\xb4\x86\x91\xb5\x56\x90\x18\xcf\x71\x31\xea\xfc\x57\x8e\xb0\xfd\x62\xce\x32\xd9\x80\x7d\xe9\xc6\x36\x4a\x02\xd2\x07\x02\xd0\x6d\x30\x00\x07\xd7\x40\x27\xbe\xde\xa3\x27\x61\x4e\xea\x63\x11\x87\x8c\x5e\x37\x29\x30\x7b\xfd\x47\xe2\xe7\xe7\xbe\x1b\x2f\x0e\x2c\xd2\x1b\x3a\x13\x4f\x21\x34\x00\xe2\xa0\x79\x00\xe0\x9b\x41\x16\xea\x74\xdf\xfc\x19\x7b\x48\x56\xff\xa3\x0f\x76\x99\x38\xdb\xe2\xb4\xde\x74\x82\xc1\xd8\x2d\x9a\x86\x50\x25\xa9\xb7\x48\x4e\x59\xef\x68\xfd\x7e\x21\x3c\x28\x88\x3b\xe9\x9b\xf5\x50\x43\x19\x29\x5f\xee\xed\x91\xf4\xbe\xe3\x37\x09\xf9\xdc\x9d\x31\xe1\x13\x8c\x9c\x45\x3d\xd1\xb8\x5e\xb0\xb7\x24\x9a\xc8\x8a\x88\x0c\xe2\x4e\xfa\x66\xb4\x7e\xce\x4c\xdb\xf6\xa5\x40\x9a\x67\xf3\x51\x0f\x0f\xe7\x13\xb8\xf1\xc2\x1c\x3f\x33\x35\x0e\x88\x9b\xf2\xb0\x48\xdf\x7e\x48\x03\xbd\xba\x07\xe0\xfe\xe3\x9b\xff\xd9\x9a\x2d\xd4\x1f\x37\x30\x60\xa5\x62\xbe\x27\x96\x99\xb4\x98\x37\x26\x2e\xce\xb7\x6c\xea\x47\x1b\xcf\xc1\xd6\xad\x55\x5f\x3b\x15\xcf\x18\x84\x6f\x06\x71\x41\x32\xd4\x48\xff\xf4\xcd\x68\x11\xcd\x32\xaf\x1f\x46\xb5\x28\xc6\x3c\xe8\x30\x18\xe9\x6e\x89\x57\x98\xab\x9c\xa8\x22\x9c\xaf\xd2\x59\x53\x45\x31\x40\xbe\xf4\xa7\x6f\x36\x79\xab\xd0\x11\x6a\xc2\x84\x51\xfe\x56\xd8\x2f\xab\x5c\x30\x57\xa1\x5c\xe7\xa7\x1c\x4b\x75\x57\x8a\xdf\x18\xa5\x5a\x34\xcb\xfc\x9f\x5b\x56\x4d\x6a\x99\xd9\x1e\xd2\xe7\x42\x89\x51\xb5\xa6\xd3\x18\xc3\x0a\x03\xc4\xba\x47\x1d\xd4\x29\x82\xc2\xea\xb3\x04\x49\x75\xd3\xfe\x6d\xbe\x19\x34\xb4\x3f\xef\x37\x9f\xf0\xcd\x41\x58\x58\x5f\x25\x08\x6e\x0a\x57\xf2\x7e\xdb\xbd\xbf\xa5\x30\x24\x41\xb0\xf1\x4a\xc6\xbf\x98\xbc\xe8\xcb\xca\xf8\xae\x74\x1e\xc3\x59\xf8\x66\x89\x13\xbe\x19\xd5\x32\x40\x94\x2d\x38\xa9\x29\xae\x69\xc3\x1c\x83\x20\xa5\xcb\xbe\xdf\x14\xb7\xf1\x78\xf0\xd3\x94\x86\xa8\xcf\x3a\xa7\xe6\xcc\x99\x6c\xfc\x9e\xf4\xcd\x21\x5e\xe7\xe5\xec\x32\x52\x84\xc9\x05\xe9\x98\xdd\xd2\x72\x8a\x7b\x47\xc4\x77\x14\x94\x57\x99\x3c\x9d\x8d\x8d\x2d\x4c\xf5\x0c\xcf\x64\xe3\xf7\xa4\x6f\x7e\xc2\x16\xaf\x97\xf5\xc8\x64\xbe\xc1\x3c\x7f\xee\x89\xb4\xc4\xda\x68\xdd\x04\x57\x1c\x1d\x4b\x87\xbc\x2e\x57\x0c\x11\x6b\x55\xd2\x99\x8c\xf6\xa4\x6f\x76\xb9\xdf\x1d\xf9\xd9\x34\xdc\xe6\x35\x95\xbf\xd1\x9d\x18\xd6\xc2\xf3\x02\xf4\x42\x9f\x87\xde\xae\x24\xb8\x55\x78\x5e\xf6\xdd\x51\x3f\x33\xdf\x0c\xd2\xd0\xa9\x2f\x94\xcd\xbd\x42\xf2\x68\xab\xe9\x9c\x7f\xa0\xef\x60\x3c\xfb\xfc\x81\x5f\x17\x26\x8a\x5e\xa3\xe2\x4b\x9d\xb9\xaf\xe8\xcb\x2c\x5b\x90\xbf\x05\x71\xf0\x4c\xd9\xc8\xfb\xde\xe7\x15\x55\x8a\x86\xe5\x7a\x85\x63\x67\x62\x20\x31\xd3\x6b\x8d\x30\xa2\x74\x93\x7c\x17\x31\xde\xf3\xe9\x51\x9a\xd0\xf9\x6f\x10\x07\xcf\x94\x9f\x3f\xe1\xaf\x6e\xad\x4b\x5e\xf9\x1d\xbe\xa4\x64\xaa\xd7\x6b\x95\x78\xe5\xca\x0a\xf7\xb4\xbc\x56\xfb\xe1\x30\xf1\xa6\xc1\xbd\x12\xa8\xd3\x10\x80\x83\x67\xca\xad\x82\x6a\xda\x73\x73\x8b\xa9\xd3\x4b\xd4\x89\x6a\xbc\x64\x96\xf1\x12\xcd\xdb\xec\xae\xea\xed\x05\x3d\x7c\xaf\x98\x04\xaf\x42\xe6\x11\xc4\xc1\x7f\x5f\x0a\xee\x2e\xba\x6e\xaf\x1c\x81\xe7\x89\xbe\x02\xaf\x68\xb9\xe4\xf4\xaa\x4b\x4d\xd5\x1a\xd3\xdd\x35\x2a\xe7\xd0\x67\xab\x25\xa1\xbe\x60\x20\x0e\xba\xdf\xfc\x77\xdf\x0c\xfa\x87\x3e\xb5\x37\xb2\xca\x9b\x0d\x2a\xdf\x3a\xba\x20\xae\xf2\xd6\x6b\xb5\x49\xaa\x1f\x7e\x8d\x86\xe4\x88\x51\x59\xd9\x4a\xcc\x20\xd7\xd5\xf3\x41\x0b\x66\x10\x07\x97\x80\xd6\x32\xce\x45\x79\xe2\x9b\xbb\x46\x63\xeb\x2b\x18\xa8\xe4\x55\xb2\x71\x2c\x2d\x9f\xb0\x6e\x25\x97\x7f\xd8\x77\xdd\x96\x64\x1a\x47\xc4\x05\x71\xf0\x4f\x9a\xf5\xfd\xa9\xbe\xe1\x83\x18\x9d\x7e\xc2\xae\x47\xb8\x2f\x44\x33\xaf\x71\x48\x33\xed\x7b\xd8\xd2\xb5\xd5\x6d\x17\xff\x12\xd2\x80\x36\x19\x40\x1c\x5c\x02\xae\x2d\xb8\x09\xb6\xef\xba\xcf\x79\x55\x8c\x3a\x7d\x1f\x37\x61\x4e\xd3\x1d\x35\x48\x59\x17\xef\x92\xe8\x9a\x1b\x51\xb6\xaf\xd6\x40\xc4\x05\x71\xf0\xdf\x37\x08\x75\xec\xed\xb7\x67\x13\x63\x97\xf1\xf9\xf5\x99\xca\x69\x0a\xf9\x54\x42\xb6\x3f\x1e\x6d\x30\x2d\xdd\x37\x2a\x13\x55\x41\x52\x47\x48\x00\xc4\x41\xf7\x9b\xff\xee\x9b\x41\x93\xeb\x69\x12\x98\x71\x8f\xae\xff\x9c\x27\xfd\x3b\x31\x90\x6d\x27\x37\x9a\x47\xd3\x25\x33\xfc\xdb\xe3\x8a\xee\x5c\x46\xac\x9e\x5f\xc3\x41\x22\xd0\x7e\x10\x88\x3b\x71\xea\xe4\x66\xfa\x62\xbe\xa6\x07\xc5\x78\xb6\x79\x6d\x8f\xd2\x05\xbf\x1f\x68\x3b\x96\x1d\x3d\x7c\xdd\xd7\x79\xc3\x8e\x07\x2f\x92\x40\x57\xc6\x41\x1c\xfc\x93\xa6\x5f\x10\xd0\xc3\xa9\xfc\xca\xa6\xf0\xb5\xec\xd5\xf4\xc0\x07\x91\x97\x86\x42\xfb\xb8\x68\x21\x99\x0f\x2d\x9f\x29\xd5\xcb\xe8\x41\xfe\x16\xc4\xc1\x25\xd0\x9e\x9c\x10\x72\x69\x3b\x80\x27\xae\xfe\x3c\x49\x00\x0b\x45\xf8\xa6\x3b\x89\x13\x17\x9a\x14\x36\x35\x41\xbf\xe6\xd7\x79\x6f\x77\xe8\x16\x08\x80\x83\xff\xbe\x9d\x45\xd7\xc6\xe8\x88\x34\x07\xd7\x7b\x15\x2e\xcd\xc8\x34\x63\x65\x4f\x8c\x10\x35\x9c\xb7\x1a\x58\x99\x3a\x24\x64\xb9\x37\xab\x08\xad\x97\x01\x1c\x74\xaf\x11\xe0\x9b\x41\x99\xee\x34\x0d\xa4\xef\xfc\x2e\xfe\xa5\x8f\x23\x8a\xa3\x39\xdb\x23\x40\x4c\xf4\xed\xf6\xc3\x15\x39\x1f\x02\x89\x5f\xbd\xdc\x41\x24\x2d\x04\xb8\xd0\x19\x75\x10\x07\xd7\x40\xf7\xe4\xb3\x4d\xff\xc9\xd7\xe7\x75\x31\x56\x94\x27\x33\x2e\x7a\xbc\x8f\xc4\x73\x53\x99\xda\x17\x24\xbb\x34\xcb\x50\x57\xfc\x3f\x35\x19\x10\x07\xff\xa6\x4b\x49\x21\x43\x59\xf5\x5f\xeb\xdf\xe0\xc6\x74\x2b\x09\x1e\x32\x39\x89\xe1\xdf\x15\x5b\x2b\x68\xcd\x6c\x9b\x59\xb9\x50\x29\x16\x89\x88\x0b\xe2\xe0\x1a\x98\xe5\xf3\x09\x53\xa2\x64\xbc\x39\x34\xbd\xc9\xdf\x15\x19\x9e\xe2\xac\xe4\x4f\xce\x7d\xf7\xf2\x9e\xd9\x15\x95\xcd\x94\x3d\x17\xa8\x2f\x18\x88\x83\xff\xbe\xc8\x4d\x75\x1d\xb8\x83\xd5\xe4\xd7\x95\x1e\x1e\x46\xf3\x3c\xff\x85\xc2\xac\x59\x32\x23\xf3\x4e\xa1\x4c\xad\xf6\xf1\x74\xc5\x85\x6d\x84\x06\x40\x1c\x74\xbf\x19\xe0\x9b\x41\xcb\x8e\xd3\x34\x80\x39\x6f\xfc\x54\xfc\xf1\xc4\x66\x1d\x76\xf2\xa5\xee\x96\x26\x8a\xa1\xfe\x84\xc9\xb1\xdb\x47\x4c\x7e\xcf\x72\x34\xc5\x9c\x97\xa0\x52\x27\x88\x83\x6b\x80\xd5\x49\x30\xf0\x2b\xcb\x16\xc7\x6c\xe5\xc2\xb2\x57\x1d\xd6\x50\xf7\xc3\xf2\x96\x71\xc6\x06\xcc\xc1\xf4\x28\xc1\x25\x9b\x45\x7a\x44\x5c\x10\x77\xe2\xbd\x52\xb1\xbe\xdf\x66\xbf\x68\x66\x15\x83\x57\xd0\xa5\xfd\x48\x45\xf4\xd8\x03\x57\x2d\x64\x3c\xf7\x8f\xde\x0c\xd3\xad\x7d\xa1\x83\xfa\x98\x81\x38\xb8\x06\xbc\x36\x17\x8a\x6e\x45\x96\x5d\x3f\x1a\xcf\x5e\xb9\x8f\xc2\x49\x56\x7d\xe5\x5b\xf6\x17\x9a\x94\xa9\x56\x1e\x95\x84\xd4\x5b\xd1\xd0\xff\x02\x88\x83\xff\xbe\x6e\xe6\x41\xa3\x86\xaf\x93\xa5\x93\xfc\x45\x06\x8e\x0f\x82\x06\x58\xe6\xfd\x18\xd1\x7a\x35\xb0\x7a\xbf\xca\xdc\x8b\xd6\x7c\x0b\xcd\x03\x20\x0e\x9a\x07\x00\xbe\x19\x64\xa1\xfe\x97\x37\xe5\x35\x16\xae\xbb\xcc\xcf\xfb\x47\x6d\x68\x18\xa5\xb6\xf5\x68\xfd\xfe\xd6\xe5\x46\x51\x8a\xd9\x37\xbc\xd5\xb2\x79\xad\x38\xd3\x10\x3a\x4d\x0d\xe0\x4e\xfa\x66\xc6\x7a\xc1\xdc\x46\x02\xed\x1d\xae\x23\x56\x17\x9b\xac\x77\xf5\xab\x33\x55\x24\xc1\x6e\x71\x32\x33\x4f\xf6\x88\x79\xf7\xca\x5f\x22\x22\x83\xb8\x93\xbe\x99\x24\x49\xea\x6e\xa2\x7f\xd7\xd6\xc4\x73\x47\x13\x1f\x93\x07\xf2\x41\x0f\xa4\x5c\x07\x8d\x90\xcb\x29\x09\x17\xaa\xc8\xac\xee\x3c\x40\x44\x06\x71\xff\xed\xde\xf5\x8f\x73\x2d\x29\xf8\xd9\xdf\x86\xa7\x09\x98\x7f\xf2\x78\x1c\xee\x1a\x57\x3d\xc0\x16\x15\x30\xa1\xbc\x34\xbc\xae\xb3\x25\xb8\x2d\xd3\x4e\x89\xf0\xcd\x20\x0e\x7a\x53\x1e\xf2\xcd\x2e\x58\xd4\xc7\xe5\x31\xb9\xfd\x3c\x73\x5f\xca\x32\xd9\x2d\x5e\x91\xee\xa8\x25\xec\x94\xdc\x3b\x87\x1f\x51\x36\xf6\x4a\x9f\x24\xf6\x4f\xdf\x1c\xa2\xfd\x42\x87\xfd\x75\xea\xd0\xfd\xde\x00\xdb\xa7\xeb\xed\xa9\x1a\x46\x5a\x1f\x36\xdf\x8b\xf9\xc5\x79\x5b\xce\x7e\xfa\x18\xda\xfe\xe7\xfa\xc8\x85\xfc\xfa\x18\x19\xe9\x07\x7f\x31\x6e\xf4\x8c\xa3\xa6\xcf\xdf\x91\xb8\x7f\x14\xfb\x1e\x5d\x30\x6b\x45\x42\xc1\xaa\xe5\xfd\xf4\x6f\xf3\xcd\xa0\xa1\xfd\x79\xbf\x59\x06\x6e\xae\x3e\x6d\x3b\x70\xa0\x8a\x7b\x15\xcc\x54\x8d\x38\xe7\x1d\x53\xfa\xb8\xce\xb7\xe1\xef\xc6\xbd\x49\x7e\xf9\xe0\x69\x0d\x4e\x7b\xc7\xd1\x59\xf8\x66\xff\x93\xbe\x79\x87\x2c\xe0\xd9\x77\x79\xd2\xf6\x07\xcb\x9e\xbd\x33\x3b\xbb\xae\xd3\xfa\x72\x63\xbf\x5e\x11\x91\x91\x85\x13\xa5\xb0\xa3\xa9\x9c\xc9\xc6\xaf\xf0\xc9\x73\xda\xa2\xfa\xfb\x78\x18\xd7\x4a\x08\x2d\xfd\x6a\xc7\xe8\x8c\x8f\x46\xd0\xaf\x12\x1a\xd0\x04\x0c\x75\x66\x72\xb9\x75\xa9\x6a\x17\x9d\xc9\xc6\xef\x49\xdf\x8c\xaa\x3b\x90\x73\x98\xcc\x86\x77\x57\x8f\x29\xac\x63\xea\x99\x01\x31\xe6\xf1\xab\xe6\x26\x97\x54\x53\xd9\x18\x5e\x4f\x8e\x17\x4d\x67\x32\x5a\x97\x13\x3f\x56\xdb\xae\x79\xaf\x6b\x50\xe8\x32\xd9\x8d\x17\x12\x49\x1a\x03\x6f\x9f\xb2\x5e\x16\x46\xfa\xb1\xbb\x21\xc8\xe9\x53\xa5\xfe\xfd\xd0\xfd\xcc\x7c\x33\x48\x43\xa7\x65\xca\x03\xbe\x89\xf3\x3d\xd1\x5f\x7f\x1a\x77\x7d\xc0\x61\x36\x9b\x08\xfa\x75\x79\x0e\x79\xe2\xaa\xcc\x53\x37\xb6\x0f\xfb\x06\x26\x53\xd0\x6e\x00\x88\x83\x67\xca\x15\xa4\x17\x59\x52\x0b\x44\x54\x9f\x19\x19\xbc\x4c\xb8\x8a\xce\x2f\x70\xf1\xa3\xbf\x41\xe3\xd8\x25\xf9\xf5\x75\xd0\x40\x28\x12\xda\xc7\x06\x71\xf0\xcc\xf3\x29\x22\x42\x8e\x77\x3d\x45\x85\x22\xf9\x7d\x10\x7f\xc3\xf6\xf1\x55\xce\x09\xaa\x86\x97\x34\xfd\x92\x3b\x51\x89\xd3\xe5\x02\xd0\x25\x54\x10\x07\xcf\x94\x6b\x9f\xf0\x82\x5e\x31\xde\x18\xf5\x0c\x49\x48\x52\xa4\xc2\xbc\xd3\x2f\x66\xca\x6e\xac\xd4\xcc\xcd\xd9\xf5\xd1\x76\xa9\xdc\x20\x1e\x11\x17\xc4\x9d\xe8\x34\xb4\x35\x1a\x4b\x17\xc4\xd4\xb3\x7b\x6b\x31\x3d\x36\xf4\x6b\xd7\x87\x62\x94\x39\x9c\xf7\x66\x37\x26\xd3\x16\x69\x96\xb2\x29\x7f\x22\x4c\x13\x88\x83\xee\x37\xcb\xfc\xdd\x37\x03\xfe\xa1\x4f\x93\xc0\x79\xe2\xee\x62\x92\x52\xba\x0b\x5c\xa9\x84\x7d\xdf\x31\x75\xd6\x15\xf9\xb2\x9f\x60\xbd\x63\xe7\xeb\xac\xa7\x8a\x94\xbe\xb4\x0f\x6d\xdc\x80\xb8\x13\xf7\x9b\x0f\xe7\xae\xdf\xb7\x41\xd6\x6d\xab\x21\x37\xbd\x9b\x3d\xbb\x34\x16\x32\xc7\x2d\xeb\xe0\x23\x49\x21\xc7\x29\x91\xb5\xe9\x4b\x05\xdd\x6f\x06\x70\x70\x09\x5c\x0a\xca\x15\x19\x59\xe4\x0d\xbe\x7e\xc7\x48\x38\xb0\x8f\xa1\xae\xf2\x25\xc3\x6b\x6e\xe6\x2e\xc1\xf0\xa2\x8a\xb9\xaf\xa5\x81\x37\x10\x71\x41\x1c\x5c\x02\x6a\xbe\xc1\x01\xf8\x16\x2e\x6f\x7c\xa7\xee\x32\x47\x1d\x27\x5b\xf1\x4d\xdc\x64\x79\x36\x3f\x53\xe1\xae\x2b\xf6\x5e\xb6\x90\x19\x6a\x01\x0f\xe2\xe0\x12\xc8\x92\xa1\x67\xd0\x79\xa8\xcc\x39\x61\xa4\x7b\x17\x33\x99\xa9\xce\xad\xf9\xba\x4f\x94\x72\x11\xc7\x2e\x92\xb9\x10\x5d\xf9\x07\x6a\x84\x04\x40\x1c\x74\xbf\xf9\xef\xbe\x19\x34\xb9\x9e\xba\xd7\x18\xe7\x73\x10\x54\xf5\xf0\xd3\x3c\xb9\xad\x85\xef\x4e\xed\x47\x7c\x89\x46\x16\x9c\x1e\x49\xa1\x9b\x34\xe3\x61\x29\x56\xb9\x52\xd0\x5e\x23\x80\x83\x4b\xc0\x35\x32\xfc\x9b\x4b\x9a\x00\xf9\xc8\x88\x06\xf6\xce\xbe\xbe\xef\x6f\x45\x49\x17\xda\x1e\x79\xe2\x84\xa7\x8a\x9f\xac\x0b\xae\x41\xaf\xd6\x81\x38\xb8\x04\xa6\x23\x39\x6f\x79\xf3\x28\x7f\x2c\x57\x1b\x8b\x95\x8e\x55\xb2\x32\xb2\xda\x32\x72\xe9\x4e\xf7\x40\x0a\x39\xf8\x82\xd4\x8f\x09\xf5\x84\x02\x71\x70\x09\x54\x61\x24\x58\xb7\x07\x3d\x47\x76\xa8\xa0\xbd\x96\xc3\x1d\x25\x5d\xa9\x7d\xf1\xdb\xe4\xfd\x07\x3f\x98\x23\xd8\x85\x02\x24\x04\xa0\xfe\x68\x20\x0e\x2e\x01\xbc\xe1\x0b\x0d\x71\x1f\x14\x64\xd6\x8f\x52\x3c\x2e\xb4\x65\x6b\xb7\xad\x22\x31\x9a\x6f\x29\x76\x64\x85\x10\x4f\x14\x4a\x65\x32\x23\xd6\xcb\x20\x0e\xba\xd7\x28\xfc\x77\xcf\x04\xca\x74\xa7\x69\x40\xa0\xf8\x65\xfe\x86\x3a\xd2\x82\xc8\xb0\x5a\x7e\x4c\xe9\x90\xc5\x4a\xd2\x31\xd5\xd4\xf8\xa5\xd9\x05\xfb\x69\x71\x0e\xed\x06\x55\xc4\xd8\x41\x1c\x5c\x03\xec\xef\x0f\x9f\xfe\x8c\xb3\xea\xae\xf2\xa2\x2d\x0f\x7c\xdf\xfe\x1d\xc3\x6b\xe3\x3c\xbb\x74\xd2\xea\xe3\x27\x14\x83\x9e\xa9\xf6\x65\x50\xc7\x45\x00\x77\xa2\x22\xb9\xb2\x8e\x5f\xfd\x53\x76\x95\x36\x34\x87\x89\xc7\x60\xb1\xc1\x44\xf8\x9a\x54\xf4\x85\x8e\x11\xd6\x47\x63\x04\x5f\x06\x62\xa1\xa7\x8a\x40\x1c\x5c\x03\xda\xe4\xd8\xe2\xcb\xc3\xcc\xba\x98\x0a\x07\xc2\x97\xb4\x2f\xc6\xd6\x3a\xde\x9f\x0b\x6d\x13\xa5\xfc\x6e\x17\x8a\xb3\x47\x75\x13\xea\x94\x09\xe2\xe0\x1a\xf8\xe5\x3f\x32\x35\xe2\x6f\xbb\x99\xbc\xbf\xb2\x9b\xfb\x5c\x68\x5e\x63\xed\x1b\xaa\xe7\x1e\xe3\xa3\xaa\x84\x47\x97\x4a\x45\x4b\xdd\x10\x1a\x00\x71\xd0\xfd\x66\x80\x6f\x06\x2d\x3b\x4e\xd3\x00\x33\x9e\x67\x9e\x0f\x79\xfd\xdb\x2b\x78\x5f\x7f\x9c\x6b\xad\xca\xf8\x18\x73\xf9\xee\xab\x89\xda\x1f\xef\x1a\x1e\x99\x1d\x88\xbe\x27\x41\x8c\x1d\xc4\xc1\x35\x60\xa6\x49\x60\x36\xc5\x14\x47\x79\x28\xd7\x6d\xc2\xdc\xb5\xb5\xf8\xee\xe0\xf2\xf8\x4c\xc1\x9b\xc0\x8e\xf8\x5d\x5c\xe6\xb5\x8b\x50\xff\x7b\x10\x07\xd7\x40\x5d\xee\x50\xfa\xf5\x1b\xf9\x6e\xd9\xc7\xda\x62\x51\x1c\xd8\xb3\x62\xd4\xc9\x9a\x89\xb6\x2b\x6b\x4a\x71\x29\x76\xd3\xa4\x5f\xb6\xa1\xbb\xe8\x00\x0e\xae\x81\x47\xe6\xc2\xd2\x99\x95\x3d\x1d\x0a\x4e\x32\xbe\xf5\x3b\x66\x0e\x7a\xe6\xaf\x59\xa3\xb4\xf3\x74\x7a\xf7\xb3\x1f\x72\xa7\xe3\x72\x22\xe2\x82\x38\xb8\x06\xd2\x9e\x77\x24\x4d\xf2\xc4\xe7\x93\x36\xe7\x7e\xef\x9f\x95\xa1\x45\x0b\x2b\xa9\x5e\xc0\xcb\xce\xf3\xfe\x66\xfd\xcc\xef\xbc\x37\xf4\xb0\x37\x88\x83\xe6\x01\x97\xbf\xfb\x66\x90\x85\x3a\xdd\x37\x3b\x21\x6f\xaa\x2e\xc7\xe1\x9a\xf5\x29\xa9\xa1\xb5\xc5\x8c\xd8\x2f\xa9\x9a\x11\x54\xdd\x8c\xc0\xc9\xec\x66\x99\xe9\xa1\x53\xf9\x80\xf0\xa0\x20\xee\xa4\x6f\x36\x50\x7d\xff\x39\xc9\x70\x38\x3e\x42\x17\x6f\x66\x86\x4d\xf8\x8e\x2f\xd5\x98\x66\xfc\xa3\x23\x5d\xcc\x25\x59\xd4\x11\xd7\x67\x6a\x88\xc8\x20\xee\xa4\x6f\xbe\xa3\x9c\xd9\x9a\x39\xff\x5b\x98\xaf\x39\x05\xf3\x49\xc9\x3d\x55\x54\xb9\x5f\xbd\x5f\x1e\xb7\x7a\xa6\xa6\x30\x2f\xab\xd5\xe4\xbf\x41\x44\x06\x71\xff\xf1\xcd\xff\x3c\x23\xf0\x4e\xe8\xfd\x45\x87\xcf\x61\xf6\xf2\x12\x9f\xd5\xb2\xb3\x8a\x6e\x19\xa4\x53\xe1\xe5\x29\x65\x58\x90\xcd\xe2\xd8\xa8\x5d\x35\xbe\x8f\xf0\xcd\x20\xee\x3f\x91\xff\xf3\x57\xfb\x1f\xdf\x1c\xfd\x26\xca\x89\xd2\x47\x12\x9d\x76\x6b\xe6\x56\x53\x0e\xeb\xa3\x11\xc5\x9a\x51\x02\xc2\xf7\x12\x16\x5f\xe4\x36\x51\xbc\x3a\x85\xfe\xf4\xcd\xb5\xf2\x12\x86\x03\x42\x52\xfd\x4b\x0b\x1f\xf4\xee\x7a\x0a\x33\x55\xe8\xb2\x2d\x3f\x78\x3c\x1f\x17\x80\x81\xaa\xbe\xce\xb1\x33\xf2\x07\xfa\x85\xf6\x31\x3b\x6d\x89\x14\x66\x4a\x49\x70\x22\x5a\xc5\xd7\x15\xeb\x2f\x86\x9f\x06\x7e\x61\x5d\xec\xa2\xaa\x71\xf6\xff\xb4\x5a\xfc\x6f\xf3\xcd\xa0\xa1\xfd\x79\xbf\xf9\x84\x6f\xc6\x62\x98\x0c\xc3\x4b\x7d\x3d\x64\x5a\x18\xb8\xdd\xf1\xeb\x39\x21\x5d\x10\xba\x15\x85\x14\xa9\x63\xd0\x81\xcf\xc0\x2b\xca\x95\xc2\xb3\xf0\xcd\x4d\x27\x7c\x33\x72\xfd\x18\x4f\xba\xb2\x0d\x9d\x92\x9c\x99\x52\x74\x87\xc8\xfa\xf4\x48\xc0\xf6\xb2\xd9\xce\xfb\x6a\x2e\x8b\xe7\xef\x70\x86\x62\xce\x64\xe3\xf7\xa4\x6f\xc6\x0d\x0e\xcf\xaf\x3a\xf4\xe9\xe4\xad\xc8\x49\x97\x94\xe1\xd2\x65\xbb\xf8\xd0\x6b\x0d\xf9\xb1\x48\xc2\x66\xf8\x47\x3f\x7f\xb2\xb3\xb9\xdf\x7c\xd2\x37\x53\xae\xfc\x1a\x75\x31\x4f\x17\x79\x22\x73\xf5\x20\xd1\xdd\x61\x38\x3e\x54\x25\x36\x58\x8e\x96\x9c\xd0\xa3\xe9\x20\x61\xb0\x97\xe8\x4c\x46\x7b\xd2\x37\xd7\x75\x73\xef\x13\x4f\x0a\x85\x88\x8f\x3e\x27\xd9\x55\xe7\x16\x0d\xbf\xfe\x44\x68\x17\x9d\x44\x99\xa7\xbc\xb5\x0c\x95\x36\xe6\xd1\x99\xf9\x66\x90\x86\x4e\xcb\x94\x06\x5f\x0f\xf5\x97\x37\xcd\x2f\xf3\x49\x07\x77\x94\x2e\xcc\x77\xff\xc8\xbd\x77\x4f\x38\xf0\x4a\xa0\x35\x73\xb0\x96\x55\xc2\x2c\xf4\x58\x10\x88\x83\x67\xca\x6d\xec\x56\xc3\xfd\x84\x0f\x1f\x1e\x5a\xfc\xb6\xa0\x98\xf5\x9e\x15\xa1\x9e\x74\x5f\x6f\x7b\xdb\x6d\xcc\x5a\xfe\xf5\xb9\x78\x32\xf4\xb8\x11\x88\x83\x67\x4a\xd5\x94\x4e\x4e\x5b\x5e\x89\x2e\x2c\xc6\xf0\x4f\x09\x11\xf7\xd1\x8b\x9a\xb0\xc3\x70\x1a\xa3\x8e\xc2\x4c\x9a\x30\x1f\xe2\x1d\x42\x87\x69\x41\x5c\x90\x14\x92\xff\x9f\x71\xfb\xaa\x51\xbf\x24\x2e\xb5\x62\xaa\x53\x1d\xea\x48\x8e\xbb\xd2\xd5\x7f\x91\x6b\x36\x69\xcc\x30\xf2\xb8\x93\x81\xfa\x29\x0c\x05\x5a\xe1\x83\x38\xf8\xf7\x35\xf3\xc7\x36\xa4\x17\x75\xa4\x72\x4e\x3c\xc6\x6a\xbd\xcc\x6a\x58\xef\xf1\x9a\x49\x3a\x63\xab\x51\x34\xe4\x3e\xb6\x21\x19\x4a\x15\xc2\x34\x81\x38\xe8\x7e\xf3\xdf\x7d\x33\xe8\x1f\xfa\xd4\xa3\xfa\x7e\x1e\xea\x02\x9b\x19\xfa\x9f\x19\xde\x3d\xf7\xcb\x8f\xd4\x95\xbf\x6b\xfb\x25\x84\xbd\x22\x3a\xaf\xd2\x31\xc7\x48\xe5\xdc\x7b\xe8\xa8\x3e\x80\x83\x4b\x40\xa8\x3f\x76\xbe\x04\x19\x99\xc4\x9f\xfe\x25\x5e\xd9\x45\x47\x62\xdb\x9e\xd7\x46\x9e\x45\xfb\x33\x9f\xaa\x2f\x3b\xd1\xbf\x14\x84\xde\xb4\x04\x71\x70\x09\xdc\xbf\xd4\x3f\x11\xb9\xd6\x6c\x2f\x54\xcd\x38\xae\x8a\xae\x4e\x4f\x9b\xad\x70\xd9\x5e\xc6\x27\x9b\xed\xe9\x8f\x86\x1c\xe4\x3c\x6d\x44\x5c\x10\x07\x97\x80\x37\x5d\xfa\xc2\x8f\xf1\x11\x7e\xd5\xc6\xf7\x51\xfa\x4f\x93\xec\x51\xbe\x66\x2d\x0b\x7b\x51\xb0\x71\x32\xe4\x13\xdd\xf3\xc4\xfb\x85\x88\x0b\xe2\x4e\xec\xe7\xe7\x68\xa3\x8c\x09\xda\xd9\xbd\x9f\x32\xfe\xc4\x89\xb4\x41\xaa\x83\xf1\xf5\x32\x4f\x83\xc6\x9d\x83\x2b\x04\x64\x95\x96\x92\xaf\x11\x12\x00\x71\xd0\xfd\xe6\xbf\xfb\x66\xd0\xe4\x7a\x9a\x04\x08\x17\x24\xfb\x18\x3e\xe0\xfa\x39\x30\x8b\x46\xf8\xec\xde\x16\xf7\x3a\x72\xa0\x78\xf8\xe6\xb6\xca\x43\xf4\x34\x2d\x5a\x4c\x16\x68\x4f\x10\xc4\xc1\x25\x40\xb2\x5b\x61\xe8\x9e\xf4\x9c\xbd\x23\xab\xd1\x91\x53\xc0\x29\xa0\x65\x1c\x4d\x6a\xf9\x8e\x1c\x3e\x86\x9e\x88\x1d\x57\xe4\xe1\x13\x44\x5c\x10\x07\x97\x40\x7f\xd4\x1b\xd5\x79\xcc\xab\xe2\x09\xba\x4d\x0a\x11\xfd\x02\xc4\xce\x25\x2a\x97\x9a\xb2\xf6\x3f\xd4\xa7\x31\xe5\x12\x2a\xd5\x43\x3d\xa1\x40\x1c\x5c\x02\x1a\x71\x4d\x32\xa4\x82\x4c\xc1\xa3\x77\x55\xde\x5c\xa6\x18\x94\x7a\xeb\x60\xe9\xda\x56\xf9\xa1\xe6\xc5\x47\xc7\xb0\xe2\xfb\x81\x49\xd0\xfd\x4e\x00\x77\xe2\x99\xdb\x00\xf5\xdd\x6b\xb9\x46\x1c\xd9\xdf\x8f\x1b\x09\xbd\x3c\xdc\xa9\xa8\xb3\x5f\x33\xe2\x78\x54\xec\x9d\xc3\xdd\x2c\xbe\xa6\x7c\x15\xb1\x5e\x06\x71\xd0\xbd\x46\x80\x6f\x06\x65\xba\x53\x7b\xaa\x3f\xfb\x5e\x9b\xe7\xc5\x13\x57\x4d\x5a\x75\x31\x1a\x8d\xc0\xe1\x3c\xa6\x99\x77\x56\x83\x83\xaa\x69\xd7\xc1\xac\x84\x42\x10\xd4\xfe\x1e\xc4\xc1\x35\xe0\x2f\x89\x9c\xbb\x62\x3b\x91\xcc\x3e\xae\x63\x32\xda\xfe\x21\xf9\xb3\x94\x74\x2b\xaf\x86\xfc\xb8\x2c\xc5\x60\xb7\x71\xff\x53\x27\xe8\xdc\x33\x80\x83\x6b\xa0\xef\x3e\x9f\x94\xd1\x0b\x2d\xad\x0d\xcd\x0b\x7a\x8d\xa1\xa4\x6b\x43\xfe\x4d\xc3\xe3\x11\x94\x98\xad\xbf\x91\xb5\x5e\x3a\xaa\xf3\x41\x33\x36\x80\x83\x6b\x40\x51\xa0\x55\x3f\xba\x4c\x2d\xf1\x33\xbf\x29\x52\xfa\xbd\x8d\x98\xc8\xaa\x97\xec\x0e\x42\x5e\xb3\x8c\x01\x15\x59\xdf\xf4\xbd\xd6\x10\x71\x41\x1c\xfc\xfb\x36\x34\x67\xd3\xff\x28\x92\x8f\x1d\x09\xf9\x1e\x1a\x30\xbb\xfe\x42\x25\x7c\x7b\xfb\x02\xaf\x3a\x2f\x23\x07\xb6\xd2\x2f\x7d\x79\x76\x84\x06\x40\x1c\x74\xbf\x19\xe0\x9b\x41\xcb\x8e\xd3\x34\x30\xcd\xb6\x6d\x5c\x20\xcc\xf3\xaa\x25\x76\xd3\xfa\x90\x6b\x9d\x44\x96\x24\xcf\x0c\x8d\xfc\x57\x78\xbf\x8a\xae\xda\xc0\x61\x35\xf4\x4d\x41\x1c\x5c\x03\x92\x1f\xa7\xcc\xfb\x8c\xa6\xcc\x70\x26\xa5\xd4\xe8\xb3\xde\x6b\x3c\x18\x34\x4e\x71\xd5\xbc\x4c\xd5\x19\xe6\x87\xdf\xc6\x27\x50\x04\xdd\x17\x06\x70\x70\x0d\xb8\xa7\xd6\x93\xa1\x5e\x88\xef\x96\x91\x55\x4f\x2d\x6c\xb9\x2a\x70\x37\x03\xf5\x62\xed\xfb\x40\xb2\x8b\x52\x62\x0e\xe7\x17\x32\x9f\x21\xe2\x82\x38\xb8\x06\xde\xb5\x1c\x20\x17\xdf\x1d\x72\xa3\x9e\x8d\x2e\xcd\x8b\x32\x67\x51\x36\x99\x7e\x67\x8f\xff\x4c\x48\x2a\xd1\x7d\x28\xb3\x17\x19\x7a\xb2\x01\xc4\xc1\xbf\x6f\xda\xf8\xdc\x0d\xf3\x47\x05\x1b\x5a\x12\xc6\xb5\x37\xf7\xb9\xbe\x55\x7d\xb0\x25\x67\xff\x71\xbf\x98\xa8\x77\xd6\x14\xd7\xaa\xde\x14\xf2\xcd\x00\x0e\x9a\x07\x00\xbe\x19\x64\xa1\x4e\xf7\xcd\x4b\xa2\x5e\x5c\x2f\x9c\x95\x6c\x6f\x2c\x36\x11\xfa\xc4\x48\xf6\xbb\x1f\x1d\x51\xa4\x2d\x98\x5b\xc4\x2c\x55\x4e\x97\x65\x05\x3d\x45\x78\x50\x10\x77\xd2\x37\xc7\x38\xe9\x50\xbd\x94\x0f\x38\x8a\xf0\xf0\xa1\xbf\x4f\xfb\x98\x96\x35\x33\xbc\xe6\x59\xaa\x75\x64\xd4\xc2\xad\x1b\xe7\xfa\x97\xb7\x11\x91\x41\xdc\x49\xdf\xcc\x4a\xfd\x42\xe3\x3a\xe7\x90\xcb\xbc\x6d\xec\x64\x8b\x42\x72\xb4\x0c\xce\x3d\xdb\x82\xe3\x3b\xf7\xcd\x24\xcd\x1e\x7c\x24\xe8\xa9\x47\x44\x06\x71\xff\xdf\xdd\x22\xff\x63\x59\x70\xf1\x53\xe4\xe3\xe9\x70\x69\xbc\xdd\xb4\x40\x3d\x1d\x0d\xcd\x87\xad\x28\x96\x8f\x2e\xea\xcf\xf4\xd5\x18\x68\x64\x6b\xeb\x5d\x42\xf8\x66\x10\xf7\xff\x23\x9f\xfb\xd3\x37\x7f\x78\xe8\xd8\x49\x87\x82\xdd\x98\xb6\x93\x44\xa0\x39\xdc\xb3\x3d\xe1\xa3\xb4\x57\xbd\xf1\x5a\xc2\xe7\xb6\x52\xbc\x5b\xc3\x13\xa2\x3f\x7d\xf3\x43\xa3\x43\x83\x0a\x13\x12\x0b\xc5\x5c\x17\x27\xcc\xcb\x14\xe7\xa8\x29\x68\xba\x75\x55\x23\xc7\x1c\xb3\xbf\xde\xb8\xcf\x30\x41\xf8\x07\x9a\x43\xdc\x55\x55\x1a\xe8\xfd\x24\x9b\x68\xaa\x36\xfc\xc1\xaa\xc7\x3a\x8a\xd3\x8a\x2b\xb9\x5c\x9f\x71\x08\xc6\x8f\xa8\x0c\x8e\xa1\x7f\x8b\x6f\x0e\xb8\xf0\x7f\x1b\xda\x9f\xf7\x9b\x4f\xf8\xe6\x74\x05\x7a\x9c\xdf\x3b\x24\xc2\x31\x33\xd8\xeb\xd5\xbb\x49\x75\x0e\x25\xba\xba\x2e\xf6\xb4\x96\x64\xf3\x51\x95\xfc\xa9\x96\x4e\x67\xb2\x17\xca\x79\xc2\xd3\xf9\x0a\xeb\x5b\x79\x57\x17\x54\x8c\x4c\x4a\xb5\x94\xe2\xf4\x39\x86\xf1\x4e\x44\x77\x10\x2a\xdf\xdd\x0d\xa3\x7a\xa3\xff\xe1\xfc\xea\x99\xec\xfc\x9e\x34\xce\x34\x69\x43\x77\x08\x03\x23\x59\x16\x91\x2b\x87\xc4\x77\x9a\xd2\x93\xcb\x15\xd1\x16\x74\x49\x93\xb9\x2e\xa6\xf3\x69\x4d\x4d\xa3\x9e\xc9\x68\x75\x4f\xfc\xd8\x18\x3b\x1b\x37\x67\x56\x64\x92\xb9\xde\x12\x96\x6b\x6d\x19\xdc\x06\xa2\xf6\xcc\x9c\x7e\xcc\x03\x0a\x51\x9a\xdf\x7b\x4d\x5c\x2a\xcf\x64\xb4\x27\x8d\x73\xb9\xfa\xfd\x1f\xb5\xce\x47\x95\x09\x41\x7d\x75\x92\x9e\x8d\xc8\xb1\xe8\xb1\xe1\x1a\x34\xc3\x64\x5b\xfe\x53\x2d\x19\x2a\x7d\xc3\x67\x66\x9c\x41\x22\x3a\x2d\x55\xba\xdf\x1c\xf2\x59\xd4\x47\x3a\xec\x99\xda\x38\x1f\x23\x62\xd7\x33\x86\xcf\x33\xd5\x35\xd7\xf5\xca\xcf\xc7\x8d\x90\x29\xcc\x15\x1b\x4a\x3d\x00\x0e\x9e\x2a\xa7\xee\x27\xd7\x4f\x90\x4e\x70\x8a\xc6\xd0\x58\x22\xf1\xbc\x53\xfe\x3c\x93\x40\x79\x33\xa4\xee\xcb\x81\xb0\x43\xc3\xc7\x84\xda\x68\x44\x5c\x10\x07\x4f\x95\xef\x45\xf0\x6b\xe5\x90\x2b\xed\xf1\xd4\xde\xd3\xb8\x47\x3e\x39\x30\xe6\xbf\x5d\xf9\x4d\xd5\x76\xe1\x7b\xbd\x59\x02\x6a\xc0\x2f\xe8\xe9\x09\x10\x07\x4f\x95\xa2\xbc\x34\x54\xdc\x11\x35\xbc\x8d\xcf\xeb\x89\x59\x8d\x9b\xfb\x5a\x72\xd0\xe3\x95\x7a\x1e\xb2\xdd\xf0\xdc\x63\xfe\x7e\x1e\x5f\x1a\x11\x17\xc4\x05\x49\xfd\xf3\x98\x8f\xdc\x47\x25\x0e\xaa\xf3\xf6\x35\xc2\xcd\xe2\xc5\x7c\x64\xef\x66\xa8\x0e\xea\x3c\x08\x7e\xf9\xd0\xe5\xa1\x32\xd5\xb3\xeb\xc9\xb4\x22\x5c\x13\x88\x83\x2e\x38\xff\xdd\x38\x83\xfe\xa1\x4f\x7d\x81\xe6\xfc\x05\x24\x25\x0b\x9f\xba\x34\x06\x7e\x2f\xbe\xcb\xcf\x0a\xfa\x8c\x2b\x7b\x22\xdd\x26\xe5\x45\x74\x33\x1c\x97\x65\x15\xa1\x6e\x48\x20\x0e\x2e\x01\x59\x1d\x27\xae\x9d\x25\xe2\xc2\x9a\x88\x49\xab\xc4\xa7\x02\x5d\xfd\x13\x3b\x23\x0a\x68\xbd\xb5\x4e\xb6\xbd\x2f\xb5\x7f\xaa\x43\xaf\x10\x81\xb8\x13\x2b\x66\xe6\x70\xbe\xdc\x3c\xbc\xa0\x18\x77\x75\x2b\x8c\xa4\xc3\xcb\xcc\x0d\x59\x4b\x01\x19\x63\x5c\x21\x1b\x7d\x5a\x98\xdd\x52\x14\xd0\x8a\x19\xc0\xc1\x25\xf0\xcc\x63\x6c\x73\xd2\x42\xe2\x37\x55\xc7\x85\xd4\x99\x49\x7b\xe4\x5f\x1c\x62\xb8\x76\x6d\x7a\xd9\x58\x0d\xcc\xf1\x06\x4f\xf8\xa0\x07\xb9\x40\x1c\x5c\x02\x0f\x9b\x44\xc7\x53\xcb\xee\xe5\x6f\x84\x33\xea\x8b\xe8\xc8\x66\x77\xd2\x5b\x34\x5c\x51\x18\x59\x12\xae\x15\xba\xfb\x74\xf3\xeb\x75\xc4\x6a\x09\xc4\x41\x37\x1b\x39\xff\xbe\x62\x06\xcd\xae\xa7\x69\xc0\xd8\x33\xfa\x16\xaf\x18\xc1\xb5\x1b\xd2\x1d\xec\x77\x62\x46\x6d\x5e\x4b\xf9\x7f\xa6\x2c\x0f\x51\x69\x0e\x4b\x37\x91\x90\x74\xfc\x89\x18\x3b\x88\x3b\xf1\x12\xd5\x1b\x69\x7d\x14\xab\x05\x22\x6a\x8b\xe6\xe0\x16\xf3\xfc\x6b\xd1\xef\x9a\x88\xca\xe7\x6d\xe9\x9f\x15\xf3\x92\xe7\xee\x5b\x43\xcd\xda\x41\x1c\x5c\x03\xf3\xcf\x30\x0b\xf3\x3a\xcd\xd9\x34\x2a\xb1\x09\x0e\xd9\x63\xef\xad\xb1\xba\xe9\x7f\x9a\x19\x62\x20\x70\x67\x17\xee\xb3\x25\x83\x5e\x86\x06\x71\x70\x0d\x6c\x23\x4b\xb4\x35\xaf\x30\x8e\x1d\xaf\x3b\x47\x98\xf4\xa8\xbe\x3a\xb4\x0a\x67\xb4\x8e\x6f\xe4\xd4\xd8\xab\xbc\xd6\x6e\xdf\xaa\x03\xd5\xfb\x00\x1c\x5c\x03\x1c\x82\x34\x47\xab\x6b\xcf\x64\xaa\xb0\x7a\x4a\x6f\x5f\x5d\xa5\xc2\xda\x35\x5c\xa7\xf3\xdc\xd6\x9a\xd8\x94\x24\xb0\xb1\x20\xfd\x09\x75\x53\x06\x70\xd0\xcd\x46\x80\x73\x06\xa5\xba\xd3\x34\x90\xad\x16\x49\x3a\x70\x61\x47\xb6\xc9\x90\x5e\x65\xfc\xfb\xe5\xf2\x2e\xcc\xb7\x3b\xa2\xa3\xc2\x84\xe9\xf2\xd7\xdd\x95\x8b\x50\xa1\xb3\x47\x20\x0e\xae\x81\xeb\xa5\x9b\x21\x6d\x43\x3e\xc7\xad\xf6\x9e\x3f\xab\x6d\x78\x55\x9e\x75\xef\x69\xbf\x59\x64\xce\xe6\xe0\x53\x33\xa6\xda\x59\x58\x80\x1a\xe0\x03\x38\xb8\x06\x6e\x3f\x8b\x3e\x8e\x6a\x9a\xdc\x6e\x23\x13\xf5\x16\xe8\x15\xc0\x4c\x7e\xce\x22\xff\x9a\xf4\x41\xbf\x2e\xbd\x69\x6f\x40\xb9\x60\x04\x22\x2e\x88\x83\x6b\x20\xb3\xb1\x98\xc2\xff\xda\xf0\x3b\xeb\xfc\xf2\xb4\x61\xb5\xf1\xa2\x67\x53\x8f\x99\x96\x48\x7d\x4b\x2e\x39\xd3\xf4\xef\x1a\xaa\x9e\x87\x7a\x65\x02\x38\xb8\x06\xd4\xee\x8d\xb0\xd1\x67\xfb\x27\x06\x5d\x13\xf1\x97\x72\xfa\x55\x41\xf4\xa2\x60\x53\x34\x87\xba\x70\xff\xa6\xb0\xef\x04\x52\x54\x31\x54\x3d\x01\x70\xd0\x3c\xa0\xfb\x77\x0d\x80\xd6\x1d\xa7\x76\x06\xa3\xb8\x44\x96\x4e\x78\x68\x5d\x65\x3c\xf9\x32\x3e\x64\x3d\x79\x2f\x67\xee\xf8\xbc\xa0\x74\x16\x76\xce\xdc\xa4\x7d\xc7\x33\x66\xa8\x72\x04\xe0\xe0\x1a\x58\x68\x32\x8f\xbd\x76\x14\xfa\x65\xe5\xb5\x5e\x27\x49\x28\x6f\x76\x23\x7f\x44\xfc\x46\xb6\x97\x5b\x8a\xca\xd6\x53\xad\xa5\xcc\x5d\x44\x5c\x10\x07\xd7\x00\x6f\xc9\xb9\xe1\xca\xdd\xf8\xf0\x78\xce\xa3\xcf\xe7\x2f\xbc\x52\xe7\xd9\x7a\x32\x26\xd7\x6a\xab\xd5\xe7\xc2\xea\x39\xa0\x53\x02\xbd\x3c\x0f\xe2\xe0\x1a\xb8\x1a\xe5\xa0\x32\xca\x57\x78\xf7\xd3\x46\xf0\xdc\xd6\x51\xa4\x3b\x37\x66\xd5\x5a\xa6\x80\xc0\xff\x63\xee\xbd\xc3\xb9\x7c\xe3\xff\x6f\x0a\xc9\xde\x7b\xef\xbd\x47\xf6\x26\xb3\x10\x91\x5d\x24\xa1\x6c\x21\x9b\xac\x6c\x91\x64\x46\x36\x49\x36\xa1\x64\x93\x64\x67\x84\x92\x11\xb2\x49\xb8\x8f\xdf\xef\x3e\xde\xd7\xb7\xcf\xf5\x76\x7f\xce\xef\x7d\x1c\xfe\xf8\xfc\xff\x38\x5e\xde\xe7\xe5\x79\x9d\xaf\xf3\x79\x9d\xe7\xeb\x75\xb6\xc9\xbc\x6c\x33\xf1\x7c\x4d\x0b\xdd\x74\x07\xe2\xe0\x1a\xb0\xc4\x5a\x6b\x63\xff\x28\xf6\x78\xd8\xa8\x4a\xb7\xa2\xf4\x17\xde\xe8\xce\x08\x25\x65\x7c\xf1\xae\xca\xea\x01\x5b\x8b\x56\xf8\x02\x42\x03\x20\x0e\x9a\x07\x00\xce\x19\x64\xa2\x4e\x77\xce\x69\xc9\x64\x9b\x21\xd3\x61\x7b\x4e\xd5\xbc\xd8\x3c\x97\x13\x69\x67\xed\xa4\x6a\xf7\xe5\xd9\x4d\xd3\xaf\x07\x8d\x72\x73\x3a\xb0\x23\x5c\x28\x88\x43\x76\xce\x17\x68\xb9\x71\x2f\x64\x98\xe9\xc5\x18\xfc\x36\xea\x0d\x19\xc2\xe3\x64\x70\x9e\x78\x2d\x18\x32\x33\xa0\x7d\xfd\x16\x45\xe6\x10\x29\x22\x32\x88\x43\x76\xce\x8d\x12\x9f\x2c\xd0\x2f\xc8\x90\x08\x8e\xf6\xcf\x91\x17\x48\xb6\xa0\xca\x16\xcb\xde\x6b\xfe\xa6\x13\x62\xb7\xce\xd4\x1c\x65\xbc\x8f\x88\x0c\xe2\xfe\xaf\xbf\xfd\x87\xc6\x80\x37\x38\x23\x8c\x30\x7b\x29\x99\x01\xf3\xc6\x13\xb3\x42\x61\x31\x79\xf6\x36\x16\xf5\x51\xca\xcb\xe7\x03\x3f\x3c\x6e\x98\x89\xf7\x16\x0a\xf2\xda\x1a\xf8\xdb\x08\xe7\xda\x6b\xdc\xf2\x2d\xfc\x32\x4a\x20\xbe\xfb\xe4\xcd\x18\x4f\x2d\xf6\x0b\xc3\xc3\x8b\x2d\x69\x4a\x73\x74\x09\x26\x83\x55\x32\xf5\x7f\xa1\xbf\x3a\xfd\x57\xab\x2d\x73\x46\x54\x02\x43\x57\x96\x66\x2f\x84\x1b\xd5\xba\x2d\xe8\x94\x37\xf6\x26\x14\x9a\xfa\x38\x1f\x7a\xf9\xfc\xd7\x8c\x30\x68\x68\x7f\x17\x2c\x23\x19\x61\x5a\x57\x91\xbe\xa5\x43\x0c\xc6\xf5\xdb\xb8\x7a\x5f\xf5\x94\xb2\x0b\xcb\x34\xb6\x26\x89\x87\xbc\xeb\x8f\x3e\x9b\x15\x16\xbc\x3a\x83\xaa\xd6\x28\x65\x79\x64\x23\x1c\x43\xca\xe5\x8d\x52\x71\xae\xa1\x44\x31\xb3\x9e\x52\x86\x9c\x68\x01\xc3\x41\x6d\xe4\xb2\xdc\xa4\xf1\x89\x23\x77\xbb\x28\xe3\xd4\x99\x6c\xe5\x22\x1b\xe1\x6d\x42\x8d\x8f\x3b\x6b\x13\x3c\xcd\xf7\xbf\x4f\xc9\x49\xd1\x5c\xaf\x35\xbd\x22\x9c\x90\x77\x27\xe4\xdd\xc5\x15\x03\xfb\x35\xb1\x33\xe9\xf4\x25\x8f\x6c\x84\x63\x82\x2d\x03\x27\x16\x9f\x19\x56\x5e\x31\x8e\x18\x90\xed\x3e\xc0\xc1\xf0\x29\xda\x67\x5a\xd2\x93\xe4\xb4\x14\xe2\x21\xde\x93\x3e\x93\xd1\x22\x1b\x61\x8c\xfc\x81\x8f\xcf\xca\x6c\xce\x19\x55\x9f\x50\x9b\xac\x86\x38\x7e\xd2\xfd\x33\xab\xf6\xf9\xc6\x56\x6d\xeb\x62\xef\x9f\x1b\xbf\xff\xff\xc8\x12\xd0\xe9\x0b\x20\xa2\xd3\x32\xdf\xa3\x44\x6b\xa1\x3a\x69\xed\x2a\xd4\x99\x8d\x3a\x85\x7c\xf4\x17\xcf\xcd\xd6\x4c\x47\xe4\x34\x71\x7e\x2d\xdc\x7f\x6e\x3e\x33\x82\x8f\x98\xf1\x41\x1c\x3c\xf3\x09\xff\x8e\x72\x7d\x7a\xd8\xfd\xf9\x06\xf1\xf3\x84\x67\x1d\x0a\x93\xf3\xbb\x4e\xe3\x33\x6c\x46\xf7\xe6\x73\xb9\x67\xf5\x71\x59\x6f\x20\xe2\x82\x38\x78\xe6\x7b\x11\x80\xcf\xd5\xf1\x58\xe2\x75\x98\xb4\x70\x19\xd6\x89\x22\x97\xb8\x68\xd6\x87\xef\xd2\x2f\x3f\xec\xdb\xea\x6e\x7d\x8b\xb3\x7e\x01\xb5\x63\x02\x70\xf0\xcc\x27\xd1\x85\x92\x1b\x19\xac\x8e\x11\xdf\x71\x1c\x2f\x9d\xb7\x6a\x59\xca\x9f\xbf\xe9\x35\x43\xc3\xfb\xda\xf3\x4d\x08\x86\x88\x69\x3c\x22\x2e\x88\x0b\x56\x44\x39\xf7\x0f\x27\x60\x54\xeb\x57\x34\xbd\xcc\x18\xf1\x50\xe2\xe4\xd1\xe0\x6f\xd6\x68\xad\x49\xbc\x2b\x0b\x29\x87\x19\x58\xb8\x4c\x49\x51\xa9\x94\x08\x23\x0c\xe2\xa0\x8a\xe5\x7f\x37\xc2\xa0\x17\xfa\x34\x09\x30\xf2\xa4\x17\x8b\x52\xa4\x0a\xad\x78\x6f\x65\x5b\x29\xe7\x2c\x92\x34\xe3\xea\x44\x77\x0f\x45\x1c\x56\x9b\x99\x18\x57\x16\xd0\x21\x86\x0e\xe2\xe0\x12\x38\x38\x2a\xbd\x44\xee\x59\xd8\xb7\xe9\xc8\x69\x6f\xfc\x40\x3d\x2f\xef\x13\xd1\xac\xdf\x9d\xf6\xb1\xa0\xb2\xac\x6f\xb7\x24\xae\xfb\x23\xe2\x82\x38\xb8\x04\x18\xaa\x37\x12\xce\x15\xac\x28\xef\xcd\xf9\xd7\xf2\x73\x7a\xbb\x3c\x77\x90\xb6\x2f\xa5\xd2\xe6\x2a\x10\x47\x5f\xf5\x68\x4a\x56\x46\xc4\x05\x71\x70\x09\x3c\xe8\xe4\x8d\x9a\xa5\xc0\xfa\x99\x9d\x90\x39\xe9\x93\xf9\xe0\x29\x13\xf1\xee\x87\xbb\x5d\xdd\xef\x69\xc6\xea\x35\x23\x2b\x7b\x9e\x22\xe2\x82\x38\xb8\x04\x12\xfc\x16\xe7\xdd\x79\xdc\x1f\xb7\xcc\xa2\x34\x7f\x44\xbd\xe4\xaa\x91\xfd\xdb\xcc\xac\x3f\x75\xf0\x22\x7a\x29\xc3\xd2\x7e\x9c\x29\x62\xf1\x03\xe2\xa0\x52\x45\x80\x11\x06\xcd\xae\xa7\x69\x40\x75\x6f\xca\xbd\xca\x0b\x8d\x64\xe1\xb1\x4f\x68\x88\xc2\x50\xac\x61\xb5\x06\xe5\xa4\x66\x16\xf6\xbb\x3f\xda\xa5\x47\xf1\x2e\x50\x8b\x1f\x10\x07\xd7\x00\x2b\xba\xea\x43\x94\xe6\xe6\x76\xcf\xd4\x8f\xd5\x6d\x2b\x1d\x03\x49\xac\x87\x1f\x39\xaf\x6d\x3c\x9a\xc1\xa1\x77\x48\xf2\xfa\x8c\x01\xb5\x5d\x06\x70\x70\x0d\x08\xfa\xa6\xe4\xbe\xef\x13\xb4\xf6\x8b\xf5\x3a\xa8\xab\x54\x8d\x5a\x37\x5d\x0c\x6c\x0b\xb0\x28\x2c\xda\x3a\x56\x22\x61\xc2\x81\xb6\xbc\x41\x1c\x5c\x03\x66\xe1\x1a\xbc\x5f\xef\x70\xd7\x8f\xc9\x1f\xb1\xbc\x6e\x9a\xdb\x27\x8b\x0b\x58\xa9\xec\x16\x9d\x65\x24\x75\xde\x3b\x40\x3d\x18\x42\xc4\x05\x71\x70\x0d\xf0\x62\x44\x36\xf1\xcd\xf9\x10\x65\x49\x75\x3d\xa7\xa8\x16\x6c\x3b\x4f\xd2\x65\x1b\xeb\x85\xad\x81\x9a\x3b\xec\x91\xdf\xcb\x62\x81\xd0\x00\x88\x83\x4a\x15\x01\x46\x18\x94\xea\x4e\xbd\x2c\xc1\x16\x4d\x97\x8a\x40\x81\x8f\x1a\x83\xc8\xd5\x5d\xd8\x4f\x88\xe9\x37\xb1\x66\xcc\xf9\xfb\x6a\xac\xf2\x86\x9f\x79\x1e\x3a\x75\x40\x06\x10\xc0\xc1\x35\xc0\xad\x89\xdd\x53\xe4\xb6\xbe\xe8\xc7\xa4\xc9\x55\xab\x12\x6f\x45\xe7\x4a\x1d\xa6\xe6\x5f\x66\xfb\xbb\xd6\xf6\xc6\x89\x31\x09\x94\x0a\x40\x1c\x5c\x03\xd2\x66\x17\xae\xaa\x30\x10\x37\x0e\xf9\x79\x57\xd6\x91\x74\xb5\xf5\xe7\xcb\x7e\xbc\x62\x59\x62\xf4\x91\xad\x6e\x4f\x73\xf8\x1d\xd4\x46\x0e\xc4\xc1\x35\x40\xf2\x96\x3f\x13\x13\xbf\x73\x2a\xa6\xa4\x2d\x7d\x39\xfe\x29\x75\xb8\xc7\xb5\xaa\xcd\x96\x44\x74\xe7\x2b\x9a\xd3\xc1\xaa\x3e\x44\xd0\x71\x0a\x00\x07\xd7\xc0\xa7\xce\x48\xa6\xfc\xe1\x40\xba\x4a\xdc\x36\x5b\x55\x3a\xfd\x84\xce\x62\x6e\x17\x23\xfd\xb4\x3c\x03\x4e\x33\xbe\x27\x7e\x85\x2b\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\x34\x0d\x94\x2e\x73\x7e\x1b\x5d\xb8\xb6\x9d\x2c\xf1\x98\x50\x17\x33\xb8\x41\xb3\xd8\x53\x47\x87\x29\x1e\xcd\xf5\xa4\xab\x28\xec\x60\x50\x04\x31\x76\x10\x07\xd7\x80\xb9\x21\xda\xa8\x7c\x5b\x9c\x9b\x74\xed\xdb\xb1\xca\x3f\x5a\x58\x98\xf1\xc2\x8d\x57\x97\xee\x60\x96\xec\xe0\x1d\xf9\x1d\xa6\x41\xa7\x73\x40\x1c\x5c\x03\xc3\x5a\x8b\xde\x7f\xe6\x86\x7e\x19\xf0\xd9\x9c\x9f\x0e\x70\x4f\x24\x79\xf6\x5a\xde\xc4\xdb\xe3\xab\xd6\x14\x8f\xc9\x8f\x60\x49\x3b\x44\x5c\x10\x07\xd7\xc0\xe4\x8b\xe6\xc6\xdc\x78\x6c\xac\x5b\x97\x92\x2b\xf4\x4c\x71\xd4\xea\x72\xf2\xe7\x08\x53\xdb\x82\xcd\xbf\x67\xad\xed\x45\xa5\x40\x47\xd0\x41\x1c\x5c\x03\xb4\xbc\x91\xed\xea\x98\xe4\x71\xe6\xa1\x7b\xae\xa4\x85\xca\xae\xdd\x86\xa8\xc5\xe6\xf1\x4e\x97\x0d\x69\x09\x83\xf9\x89\x6e\x3f\x40\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\x4c\xd4\xe9\x46\xf8\x0e\x99\x4f\xab\x11\x6d\xca\x75\xdb\x5d\x71\xbf\x3f\xe3\x95\x1d\xb6\x44\xe5\x2c\x6d\x29\xb4\x43\xcd\xeb\x52\xcc\x95\xf7\x62\x2d\x10\xa6\x12\xc4\x21\x1b\x61\x3c\x47\x0a\x92\x3f\x6c\xfe\x92\x9e\x61\xa8\xef\x7d\x94\xf5\xeb\x2b\xc7\x07\x9d\xbe\x2c\xa3\x70\x33\x06\x58\x84\xf7\x90\x8e\x8c\x20\x22\x83\x38\x64\x23\x8c\x6b\xb3\xa6\xcf\xe9\xa0\xde\xfd\x51\xee\x7a\xa6\xc2\x8c\x5e\x00\x36\x27\xb1\x48\x59\x81\x88\xd4\xd6\xc1\xa5\xe3\x6f\x95\x05\xf2\x88\xc8\x20\xee\xff\x1a\x61\x82\xbf\x23\x03\xaf\x64\x46\x18\xe1\x19\xc2\xa7\xfe\x77\x63\x8a\x9f\x5e\xfa\x4c\x33\xab\x54\xf7\xc5\x47\x44\x68\x27\x09\xf7\x24\xb0\x64\xdc\xe5\x9c\xc2\xfe\x63\xd6\xf0\xbf\x8d\x30\xd9\xec\x73\x8b\x5a\x3a\x16\x1d\x09\x8e\xd9\xd2\x89\x1d\xa9\xe3\xc0\x42\xde\xe0\xcb\xdd\x59\x56\x34\x02\xec\x92\xf9\xc9\x4f\x57\xfe\xfe\x90\xe8\xf6\x29\xf3\x58\xc1\x4b\x97\x6a\xe1\x8b\x7d\x69\x39\x7e\x3e\x67\xb4\x5f\xe1\x1e\xc5\x76\x52\x8b\x5a\x53\x46\xe6\x1a\x7b\xe6\x7f\xcd\x08\x83\x86\xf6\x77\x05\xb2\x0a\xdc\x2c\x75\x0c\x10\x7d\x15\x46\x7f\x6d\x13\x8d\xc5\x12\xdb\x36\xd4\xd1\xa6\x5f\x83\xbf\xa4\x61\x18\x87\x6b\xb1\xdf\x15\xe0\x85\xae\x8c\x7e\x26\x9b\x95\xc8\x46\xb8\xd0\xef\xe6\x05\xf3\xed\xa6\xa3\x72\x9d\x78\x54\x0a\xfe\x46\xaa\x42\x6c\x29\xe3\xeb\x7c\xd3\x9c\x03\xee\x33\x55\x01\x05\x2c\x5c\x67\xb2\x35\x2b\x8d\xf4\x67\xe3\x1a\xf2\xe2\xe9\x76\xbf\xd7\x9d\x4c\x08\x4b\x48\xe7\x63\xbe\x9a\x1c\xa4\x21\x9f\x7a\x4e\x59\x5d\x16\xd2\x32\x7e\x62\x33\xf8\xe8\x4c\x46\x8b\x6c\x84\x83\x53\x7b\xc9\xf9\x5f\x9f\xf3\x66\x12\xe8\x96\x8e\xd5\x9b\xe9\x2e\xd3\x1b\xbd\xf4\xe2\xcd\x83\xe7\x42\x92\xfe\xc3\xdf\x66\xbe\xb2\x9f\xc9\x68\x5d\x91\xfd\xb7\xcc\x06\x8d\x90\xcb\x2e\x5e\x90\xcb\x4b\xb3\x2d\x4b\xa2\x4f\x0e\x77\x8a\x6f\xba\x7d\x73\xf1\x6d\xb8\x94\x88\x2a\x36\xda\xad\x71\x66\x46\x18\x24\xa2\x53\x9b\xf6\x94\x74\x44\x18\xab\xfb\x44\x58\x56\x33\xe6\x45\x27\xb8\x48\xa4\xb7\x8c\x4b\x6a\xae\x92\x4e\xff\x70\x5d\x57\xce\x88\xd5\xd1\x80\x9a\xf6\x00\x38\x78\xe6\x4b\x6e\xea\x7d\xfd\xa8\xe3\x46\x65\xdd\xd0\xc5\xd5\xb0\x6c\xd3\x7b\x95\xb7\x34\x75\x3e\x4f\x5e\x08\x25\x3d\x62\xc9\xdb\xed\xa4\x81\xce\xd1\x82\x38\xf8\xe5\xfe\xef\xea\x6a\xa2\x67\x77\x0f\x82\x19\x5f\x1a\xb8\x8b\xa2\x97\xad\x87\x73\x2b\x67\x65\xa1\x37\xf8\xf2\x62\x3f\xe6\x7b\x73\x48\x0c\xad\xd6\x40\x5c\xb0\x22\xea\x3f\x7e\xef\xe5\xa6\x39\x0f\xe9\x9b\x8f\x9a\x27\x3d\x5e\x5b\xc9\xfd\xaa\x64\xb5\x28\xc9\x2a\x51\x74\xf6\xbd\x7b\x9e\x9c\xd8\x78\x0d\xf5\x7b\x2a\x22\x2e\x88\x0b\x56\x24\xf8\x67\x61\x5f\x20\xc9\x04\x6f\xe7\x61\x54\x38\x9f\x0d\xeb\x15\xe1\xf1\xbc\x5f\xbf\x77\x8c\x48\x53\x75\xd1\x71\x6e\xb5\x48\x32\x57\xe7\xf9\x22\x8c\x30\x88\x83\xfa\x1d\xab\xfc\xeb\xe2\x07\xf4\x42\x9f\x26\x01\x85\x6f\x35\xd7\x77\x0b\x0e\x4c\x65\x0e\x4d\x83\x95\xe6\x13\xb0\xc2\xe5\x8b\x39\x78\x88\xc4\x22\xa7\x3b\xef\xf1\x10\x26\xfc\xcf\x3d\x1e\x20\x0e\x2e\x81\xce\x40\x6c\x72\x31\x87\xdd\xf0\x1a\xe6\x39\xb6\x13\xf1\x45\xbe\x10\xa9\x3b\x37\xbc\xad\xc9\x6f\x76\x8e\x91\xcf\x9a\xa5\x5d\x59\x85\xfa\x20\x01\x38\xb8\x04\x5e\x35\xe8\x36\xd3\x72\x3f\xd4\x5c\x22\x63\xc1\x5b\x42\x0d\x56\x36\x2f\x7a\x7e\x27\x43\xcd\x3e\x67\x46\x61\xd2\xf4\x95\x45\x6f\x22\x74\xe6\x13\xc0\xc1\x25\xe0\xad\xd8\xe6\x83\xff\x0c\x87\x6b\x27\x31\x54\x4a\xd6\x8e\xc1\xa9\x37\x7c\xcf\xf4\x42\x7d\xe1\x52\x93\x0f\xce\x9d\x72\xa7\x83\x61\xa8\x5f\x0b\x80\x83\x4b\xe0\x50\x3b\xba\x43\x33\x90\x47\x9f\x3f\x93\x89\x9f\xe2\xa5\xca\x33\x32\xff\xa5\x75\x73\x7e\x13\x42\xb7\x9b\xef\x0c\x75\x28\xa3\x8b\x11\x8b\x1f\x10\x07\xed\x02\x00\x8c\x30\x68\x76\x3d\x4d\x03\x38\x9f\x1f\x26\xd9\xdd\x11\xbe\x34\x6f\xf9\xf0\xf9\x57\xa9\x04\x3b\xf4\x2f\xa6\x77\x9e\x8e\xf3\xf2\xf1\x71\x65\xdf\x2b\xc7\xbc\xe6\x8c\x18\x3b\x88\x83\x6b\xe0\x73\xbb\x90\xc9\x2b\xa1\xaa\x13\x72\x6a\xc5\xce\x4b\x5f\x34\x73\x03\xa7\xb5\x59\x0a\x6d\x14\x5e\x3a\x18\x52\xde\xbd\x76\x3e\x12\xfa\xce\x06\xe2\xe0\x1a\x70\x08\x4e\x59\x3c\x2f\x6d\x9d\xfd\x75\x61\x82\x3b\xd7\xa1\xee\x62\x74\x8d\x8d\xcf\x4d\xb2\xcd\x27\x51\xfd\xfd\xc5\xea\xba\x41\xd0\xb4\x05\xe2\xe0\x1a\x60\x8a\x93\xfb\xea\x99\x56\x4a\x73\x85\xee\x79\x9c\xa8\xf7\x7a\xe3\x7d\xeb\x22\xad\x3a\xbe\xe7\x9d\x72\x0d\x7b\x3f\x5a\xdc\x23\x43\x10\x71\x41\x1c\x5c\x03\x72\xd9\x6f\x36\x69\x9c\xd6\x57\x78\x62\xa9\xa2\x8c\xbd\x67\xcb\xc6\xcd\x50\xe7\xf6\x58\x39\x44\x19\xee\xdb\xfe\x38\x29\x94\x1e\x42\x68\x00\xc4\x41\xbb\x81\xd2\xff\xae\x01\x50\xaa\x3b\x4d\x03\x12\xdf\x0a\x1b\x3b\xcb\xef\xa2\xfc\xd1\x11\xe5\x7f\xd3\xb7\x99\x6b\x4b\x25\x76\xd9\x49\xe6\xc1\x68\xb7\x8b\xcf\xc1\x71\x0c\x0d\xd4\xe7\x17\xc4\xc1\x35\xb0\xfd\xc4\xdf\xbc\xfb\x60\x7b\xb6\x32\x6a\x3a\xaf\x2f\x7f\xb3\x48\x6c\x0e\x47\x26\x40\xe0\x8d\xef\x33\x8e\x09\xcd\xb4\xd7\x7f\xa0\x6f\x8c\x20\x0e\xae\x81\x3e\xa2\xdc\xf0\x84\x92\x74\xc9\xd6\x5b\xca\xc7\x5a\xa6\xcf\x39\xd1\xd0\x3f\xce\x9a\x0f\xd5\x77\xf6\xbe\xed\x49\x32\xef\x51\x7e\x84\x88\x0b\xe2\xe0\x1a\x88\x19\x2e\x7f\x61\xb5\x7e\xb1\x9e\x76\xbc\x57\xcd\x34\xf1\xe8\xcf\xe0\xb7\x1c\xfa\x8c\x72\x9a\x4b\xb4\x44\x0f\x31\x1d\xa5\x2a\x03\x10\x71\x41\x1c\x5c\x03\xfd\x4f\xa8\xe3\xf5\x8e\x12\x31\x5e\x31\x9b\x31\xf9\xeb\x6b\x90\xa5\x8f\xe8\xc9\x54\x7d\x0b\x37\xb0\xfe\x11\x2a\x9f\x30\x11\x1d\x80\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\xad\x3b\x4e\xd3\xc0\x67\xa3\xf9\x13\x19\xdc\xae\xaf\x57\xcf\xed\x10\x3f\x1a\xd7\x38\x59\xee\x76\xe2\x2b\x63\xd9\xfe\x2e\x38\x1d\x78\x44\xc6\x42\x05\xed\x08\x83\x38\xb8\x06\x0e\xbd\xa4\x9c\x56\x38\x9a\x22\xcf\x2f\xec\x9a\x75\x6b\xd5\x62\x29\x06\xf5\x4f\xaa\x9b\x71\xaf\x69\xe3\xe1\x04\x93\xb6\x52\x40\x7d\xc4\x41\x1c\x5c\x03\x28\x3a\x6a\xbd\xaa\x14\x5b\xf9\x7e\x4c\xe5\xae\x68\xd3\x36\x3a\x5f\x9a\x7f\x2a\x26\xe0\x4b\x1b\xaa\xe9\x6e\x8b\x63\xcf\xc6\x8f\x21\xe2\x82\x38\xb8\x06\x8a\xed\x31\x92\xdd\x9f\x31\x17\x8b\xcc\xbe\x55\x34\xee\x8f\x7d\xce\xd0\xda\xad\x7f\xd2\xfb\x58\x0d\xcf\x8e\x49\x4c\x05\x3d\x97\x14\x11\x17\xc4\xc1\x35\xf0\xd1\xd3\x63\x21\x4d\xeb\x9d\xe8\xb1\xb0\x9f\xd8\x76\xf6\xd3\x4c\x7a\xa2\x1b\x0d\xf4\x36\xbd\x8c\x71\x32\x64\x23\x74\xd3\x75\x94\x08\x0d\x80\x38\x68\x1e\x70\xfd\x77\x23\x0c\x32\x51\xff\x1f\x35\xc8\x25\xa6\x85\xbc\x92\xad\x83\x93\x3c\xe7\xc2\x31\xf6\xdc\x3a\x45\xb3\xa3\x26\x3c\xf8\x2d\xc7\x2f\xe0\xd3\xb0\xb1\x7c\x10\x2d\x86\x6a\x90\x01\x1c\xb2\x11\x9e\x8d\x7b\xfd\x1a\xcb\xfd\x85\xc0\xc1\x5b\xf1\x37\xdc\x97\x93\x72\x2e\x7a\x2b\xce\xf7\x9d\xfb\xe4\x70\x50\x4a\x4b\x43\x23\x19\x01\xf5\xee\x02\x71\xc1\xca\x28\x04\xff\x8c\x9c\xf4\x68\x9e\x98\x13\x07\x4d\xe2\xbb\xfc\x5a\x8d\xe3\xcd\x64\xfc\x37\xaa\xf4\xe5\xf7\xdd\x1a\xe7\xd6\xf3\xaa\xa7\x23\xf1\xd7\x22\x11\x91\x41\x5c\xb0\x32\x1a\xec\x69\x00\x7b\x5e\x23\x8c\xb0\x03\xed\xd5\x3f\xcf\x5e\x79\xf8\x07\x6f\x50\x8d\x5d\xd2\x49\x4d\x1c\x21\x63\x29\x45\x0b\x93\xe6\x4e\x32\x52\x55\xb8\xf5\x3e\xef\xd6\xdf\x46\x78\xef\x02\x9a\xd0\x7d\x3d\xf9\xd2\x9b\xf7\xd9\x62\x8a\x77\x3d\x2f\xf1\xfc\xe8\x6a\xe3\xf3\x18\xc6\xfe\xdd\x7c\x5d\x95\xc3\xf0\x50\xf9\x2f\x34\x43\x4c\x59\x5e\xa1\xef\x2e\xad\xee\x65\xa1\x4b\x0e\x15\x91\x55\x8c\x6f\xe9\xfa\x94\xcd\x08\x16\x03\xad\xb5\xd7\x6d\xd3\xec\xb6\xfe\x6b\x46\x18\x34\xb4\xbf\x4b\x8a\x91\x8c\xf0\x4d\xf1\xc5\x8e\xcb\xe9\x9a\x1e\x63\x37\x88\x9f\x70\x49\xbd\x5d\x1b\x32\x2e\xf3\x72\xe5\x7f\x35\x2f\x96\xaf\x95\x21\x20\x26\xc6\x74\x26\x9b\x95\xc8\x46\x38\x20\x93\xe5\xbe\x0e\xfd\xc7\xcd\xa0\x58\xf1\xd1\x1d\x65\x6b\xf6\xc0\x0c\x23\xa3\x61\x94\xa5\xce\xd4\xfb\x9b\xcf\xd2\xf2\x2b\xcc\xcf\x64\x6b\x16\xd9\x08\x07\x7c\x9d\xc3\xba\xb3\xd1\x40\x57\x7a\xe3\x72\xf3\x1e\xc7\x27\xd7\x13\x1e\x62\x79\x96\xc6\x7d\xce\x5b\x6b\x3e\xef\x23\xcd\x0b\xcf\xe4\x68\x74\x0b\xb2\x11\xe6\x19\x45\xf1\xe6\x8c\x3d\x9f\x77\xf8\x4e\x39\xf1\x3d\x97\x53\x88\x95\x4a\x10\x3a\x47\x1b\xfe\x65\x4c\xcc\xeb\xc7\xbc\x15\xa8\x18\x67\x32\x5a\x64\x23\xcc\x22\xe1\x20\x12\xaa\xcb\x4b\x72\x9f\xa5\x7c\x30\x7d\x5d\x24\xbc\x02\xe3\xea\x2f\x76\xb1\xe8\x9f\x91\xa4\xf1\xe8\x9f\xf6\x58\xe8\xce\xcc\x08\x83\x44\x74\x5a\xe6\x4b\x6e\x73\x57\x69\x33\xfc\x26\x25\x29\x93\x1c\x66\xe5\xbf\xda\xa1\x10\xa5\xf5\xa9\x37\x7b\x4a\xe9\x42\xce\x6c\xc4\xb7\x50\x3d\xe8\xf6\x51\x10\x07\xcf\x7c\x76\xaf\x66\x2d\xb9\x0f\x1c\x09\x2e\xe6\x47\xd1\x49\xa6\xbb\x0f\x84\xaa\xc7\x75\x31\x24\x56\xed\x35\xc5\x52\x2b\xf4\x9d\xcf\x86\x56\x55\x20\x0e\x9e\xf9\xf4\x3b\x8c\xdf\x8a\x0b\xae\x72\x9b\x52\x10\x90\xaa\x75\xed\xff\xf4\x53\x38\x62\x97\x41\x49\xcc\x63\xd8\x5f\x14\xa1\xb5\xfd\xf1\x11\x6a\x8c\x0c\xe0\xe0\x99\x8f\x6e\x69\x81\x60\xfb\x63\x0e\x7d\xa6\x4b\x2c\xf7\xd8\x76\x3f\xe3\xe2\xf2\x4c\xf2\x9d\x16\x62\x61\xe1\x42\xe1\xdc\xb5\xdb\x8e\xcd\x88\xb8\x20\x2e\x58\xf1\x9f\x15\x29\x8f\x8a\x23\x98\xb8\xbc\xe6\xfb\x1a\x5e\xc5\xd2\xe1\x3d\x13\xa5\x32\x53\x30\x75\x5d\x2a\xe4\xc6\x29\x4f\x51\x15\x52\x62\xa3\x3c\x44\x18\x61\x10\x07\x35\x30\xfe\x77\x23\x0c\x7a\xa1\x4f\xed\xc5\x75\xbd\xa9\xe6\x82\x90\x80\xa3\x6d\xfb\x23\xab\x48\x95\x73\x94\x33\x72\xef\x76\x3f\xae\x52\xb3\x8a\x84\xee\xd1\xdc\x79\xf3\x0e\x5a\xa8\x82\x38\xb8\x04\x70\xfa\x1c\x0b\x1f\x4a\x4b\x15\x24\x3d\xa2\xab\x7a\xfb\x52\xf7\x45\x98\x31\x9e\x76\x88\x7c\x79\xd0\x9f\xb6\xc0\x0a\x39\xec\x23\x55\xc8\x5c\x01\x38\xb8\x04\x32\x8f\x8a\x2e\xfb\x5b\xd1\x7d\xd9\x57\x7c\x19\x14\x96\xf3\x2d\x52\xfc\xfd\xa5\x31\x85\x57\x2f\x6d\x45\x9e\x1e\xf6\xbf\x88\x79\x5c\x80\x88\x0b\xe2\xe0\x12\xb8\xd9\x1e\xc6\x78\x29\x2b\xa2\x6c\xe9\x35\xd1\x47\x0f\xec\x80\x20\x89\x10\xcf\x94\xb4\x87\x3c\x64\xf8\x0c\xf7\xc2\x8f\x12\xee\x8e\x43\x0d\x63\x00\x1c\x5c\x02\x8e\xf1\x96\xcb\x9d\x1b\x89\xab\x9a\x98\x12\x2f\xb7\xe7\xfb\xfb\xc8\x46\xc8\x63\x68\x77\x7e\x0a\x96\x3b\xb4\xae\x44\x70\x68\x0b\x22\x16\x3f\x20\x0e\xda\x05\x00\x18\x61\xd0\xec\x7a\x6a\x6b\x81\xc1\xd2\xac\x2d\x3b\xa6\x73\x2c\x21\x02\x6b\x9e\x2f\xbb\x5a\xc8\x9e\x15\xd0\x8d\xa8\x29\xbc\x36\x7d\x72\x35\x8a\x70\xc7\x56\x1f\x6a\x2d\x00\xe0\xe0\x1a\x98\xc1\xab\x57\xa6\x4f\xe1\x56\x4d\x65\x48\x0f\xda\xef\x13\xb1\xcb\x17\xba\x2c\xd4\x7f\x93\x92\x78\xee\xcd\x1b\xfd\xd7\xe8\x55\xd3\x50\x91\x22\x80\x83\x6b\x40\xf1\x3b\x4a\x6c\xa0\x1d\xb1\xe5\xc6\xa0\x12\x06\xda\xce\x8f\xd2\xee\x42\xc1\x77\xae\xb2\x4b\xca\xa5\x15\x5d\xd7\x14\xdd\x44\x2a\x10\x71\x41\x1c\x5c\x03\x36\x26\x97\xd5\x47\xb4\x85\xce\x75\x7f\xcd\xec\xe0\x6a\x5b\x49\xd5\x49\xfa\x55\x41\xee\xd5\xd3\xe2\x64\x7d\x3e\xc9\xf8\x87\x3b\xd4\x62\x01\xc4\xc1\x35\x90\xf1\xbe\x4f\xad\xa1\x32\x4a\x03\xad\x58\xea\x3c\xd3\x07\xcd\x8e\x3f\x0f\xc2\x55\x5e\x6f\x7f\x72\x58\x66\xb7\x17\x78\xd1\x51\x01\x35\xe3\x02\x71\xd0\x6e\x20\xc0\x08\x83\x52\xdd\x69\x1a\x28\x11\x8e\x9b\xd0\x2a\xbe\xa8\x1f\x6b\xde\x4e\x3f\x93\xc7\xa9\x66\xbb\x36\xd9\x2f\x9c\x16\x78\xdd\xbb\x72\xd2\xc5\xe8\xe1\x12\x74\xd4\x18\xc4\xc1\x35\xe0\xde\x70\x8d\xb5\x15\x77\xa4\xfa\x12\xe1\x28\x1b\x4e\xf6\x7b\x17\x71\x02\xf2\xb0\xbb\x2c\xa5\xfa\x66\x93\x7b\xe4\x2a\xcd\xeb\xd0\xf1\x55\x10\x07\xd7\x40\xb0\x1a\xfa\xfa\x77\x73\xca\x40\xe7\xa8\x02\x2a\x49\xef\xe6\xee\x7c\xa1\xe7\xb8\x54\x8b\xe9\x64\xf3\x99\x21\x7c\x57\x8e\xc4\x1e\x22\xe2\x82\x38\xb8\x06\xf2\x04\x68\x16\x86\x79\xdb\x1e\xd0\x7f\x0f\xcc\xe3\xbf\xc3\x27\x34\xdd\xde\x7a\xdb\xf5\x66\xfc\xc7\x5e\x2e\x9f\x79\xef\x9a\xff\x69\x5b\x01\xe2\xe0\x1a\x78\x42\x97\xf8\x7b\xde\xce\x79\x2b\xf8\xc9\x9d\x7d\xff\xf3\xc3\x84\xf7\x93\x5e\xac\x58\xf7\x64\xc9\x2f\x5a\xdd\x52\x93\x8b\x0e\xba\x82\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\xad\x3b\x4e\xd3\xc0\x66\xaa\x6a\x7a\xe7\x66\x2e\x2f\xdb\x63\xac\x9c\x3a\xfd\xdb\x18\x0e\xcb\xf7\xed\x08\x35\xf0\x7e\xe2\x3e\x6a\xec\x1d\x3a\x97\x00\xa5\x57\x10\x07\xd7\x40\xf1\xb5\x2b\x13\x37\x19\xdb\xba\x5f\xeb\x5a\x3b\xb8\xdf\xac\x6c\xbc\xd3\x4c\x35\x4c\x2b\xb1\xf0\x39\x31\xcf\x9a\x77\xed\x2a\x03\x36\x64\x2c\x01\x1c\x5c\x03\xbb\xb2\xe9\x9f\x32\x2f\x95\xc6\x69\x19\xb5\x74\x91\x87\x38\x32\x45\x18\x5d\xb0\x73\xa8\xc5\xc0\x48\xdf\x17\xba\xc7\xf8\x6a\x74\x0e\x11\x17\xc4\xc1\x35\x60\x6d\xfd\x21\xea\x85\xc1\xfc\x93\x37\x0b\x9b\xe6\x5d\xee\x17\x0a\xae\x4a\x3c\xf7\x1b\xad\x13\x6a\xb8\x1e\xfa\x55\xbc\x4b\x67\x33\x18\x11\x17\xc4\xc1\x35\x30\x77\x4d\xfc\xc6\x5a\xe9\xc6\x81\xd6\xab\xd7\x7e\x53\x91\x1c\x74\x11\x81\x26\x99\x31\x3b\x5c\xb4\x4c\xa6\x1e\xc6\xc2\x57\x26\x9d\x11\x1a\x00\x71\xd0\x3c\x00\x30\xc2\x20\x13\x75\xba\x11\xbe\x34\x54\x89\xd7\xe1\x31\x3e\x17\x62\xac\x30\xc8\x56\xdf\x56\xf0\x32\x27\xa4\x07\xf3\xb0\x50\x55\x4f\x7d\x53\xe5\x3c\xf1\x34\x27\xc2\x54\x82\x38\x64\x23\x7c\xcb\xa5\x82\xae\xc0\xf2\xab\x37\xab\x38\xb7\x2b\xe7\x00\x2d\x5b\xd4\x84\xf8\x57\x63\xff\x99\xf3\x7a\x2f\xc7\x33\x6f\x94\x3f\x9e\x42\x44\x06\x71\xc8\x46\xf8\x03\x85\xe0\x44\xf3\x33\x07\x11\x01\xef\x81\xe5\x2d\x34\x6d\x05\x1b\x6d\xd1\x57\x51\xee\x87\x59\xfb\x24\x5c\xf9\xcf\x13\x37\xa1\xdf\x0c\xe2\x82\x95\x09\x60\x4f\x03\xd8\xc4\x1a\x61\x84\x59\xae\x9d\x73\x4c\xeb\x88\xb9\xf1\x2e\xcc\xa8\xc7\x5c\x3d\x2e\x33\x58\x71\x37\x8b\x70\xa7\x95\xdf\xaf\x38\xc0\x20\x8b\xaa\x6b\xea\x6f\x23\xdc\x7f\xd9\x88\xb0\x4c\xf9\x5e\x27\xfe\x1f\x05\x39\xad\x1d\x0c\xd9\x9a\xe4\x54\x9b\xd8\x68\x8c\x40\xb7\x83\x1c\x59\x9c\xcf\x4d\x62\x7f\x9f\xd4\xb9\x35\x68\x70\x34\xa3\xc1\xbf\xad\x4f\xef\x6f\x98\x43\x1d\x37\xcb\xf1\x29\x9e\xe1\x01\xb7\x34\x8a\xbd\x6e\x35\xc1\xb8\xa1\xf0\x7f\xcd\x08\x83\x86\xf6\x77\x8d\x30\x92\x11\x96\xc6\x32\xb7\x0d\x68\xd4\x96\x3f\x1e\x1b\x8d\xde\x88\xda\x1d\xd6\xfe\x89\xc7\x71\xf3\xc5\x00\xe5\x86\xe6\x33\x25\x96\xab\x5a\x67\xd1\x93\x5a\x19\x45\x10\xc9\xa3\x2d\x70\xc6\x7e\xd3\xbf\xda\x5f\xb4\xe6\x7f\x6d\x3d\x0c\x95\xf7\xc1\xf5\x96\x1f\x15\x7b\x0b\xc6\x44\x33\x77\x72\x36\xd3\x57\xe9\x1a\xce\x64\x6b\x16\xd9\x08\x93\x44\x53\x2e\x1c\x7a\x60\x94\x6c\x18\xb0\x73\xf7\xd8\xb3\x17\xa4\x28\xbf\x58\xc1\x73\xcf\x28\x7f\xe5\xf2\xa1\xed\xd5\x83\xa3\xdd\x33\x19\xad\x11\xd2\x9f\x8d\x88\xb8\x3f\x48\xc5\xf9\xe6\xde\x46\x4e\x10\xf7\x07\xe9\xe8\xc2\xca\x4f\xcc\x1b\xd1\xd7\x2e\x74\x3a\x97\x2f\x29\xe0\x2e\xd5\xa6\x9d\xc9\x68\x91\x8d\xf0\x23\xee\x26\x65\x32\x3a\x0c\x1e\x94\xcc\x20\x27\x17\xff\x46\x77\x9c\xaf\x21\xd7\x95\xb0\xb2\xd4\x50\x18\x1b\xf4\x16\xb7\xd1\x74\xcf\xcc\x08\x83\x44\x74\x5a\xe6\xe3\xc5\x77\x6c\xaf\xad\xaf\xa7\x98\x9f\xc3\xf3\x6e\x28\x7c\x2c\x12\x69\x88\x16\xe0\x40\x16\x12\xb1\xab\xe4\xaa\x44\xd8\xa9\x58\x8b\x98\xf1\x41\x1c\xd2\xf5\x0d\xe9\x35\x1c\x39\x5f\x57\xea\xfb\x71\xc7\x4c\x95\x8a\x1a\x71\x8e\x1b\xc5\x7f\x5d\x30\xa4\xdf\x4f\xc1\xc6\x3b\xee\xbc\x73\x11\x2a\xb2\x01\x71\xf0\xcc\x37\x60\x70\xae\xda\x94\xc0\x26\xa5\xed\x9b\x41\x9f\x6c\xac\x39\xad\x57\x4b\x6e\x8d\xb1\x01\xb7\x5b\x40\x57\xda\x4d\x0e\x41\x31\xe8\x12\x64\x10\x07\xcf\x7c\x96\xa1\x71\x8f\xd5\xd6\xaa\x15\xb4\x95\xe3\x32\x3c\x27\xf1\xc2\xc2\xe6\x7d\x08\x05\x94\xea\x12\x47\xa2\x5b\xe3\xbf\x16\x79\x43\xdb\x8c\x20\x0e\xfe\x7b\x2f\x4c\xfa\x94\x2f\x24\xf6\xb9\x6e\xe0\xf6\x33\x32\x4d\xf9\xe2\xc5\x56\x0a\xff\xf1\x1e\x12\x95\x73\x2b\x4f\x29\x72\x4f\x2f\xc7\x46\x18\x61\x10\x07\x75\x24\xfe\x77\x23\x0c\x7a\xa1\x4f\x93\x40\x06\x87\x4f\x4c\xeb\x76\xbe\xd8\x49\xfd\xe1\xc3\xe0\x74\xf4\xba\x78\xe2\x84\x66\x6a\x12\x97\x8c\x97\x14\x47\x95\x71\xe2\x8b\xd0\x31\x30\x10\x07\x97\x00\xdd\xa2\x54\x43\x96\x27\xcd\xd2\xfe\x7d\xb3\xf8\x1b\x09\x8b\x9d\x51\x0d\x1f\xd9\xd7\x4a\x5b\x15\xeb\x62\x71\xc4\x03\x24\xa8\xa1\xc5\x0f\x88\x83\x3f\xd2\xe6\xdc\x11\xaa\x42\x56\x95\xf2\x89\xa4\x67\x7e\x13\x11\x8a\xd6\x28\x5e\x8f\x18\xca\x3d\x5c\xef\xb7\x5b\x46\x9f\xbf\xd9\xd4\x0d\xdd\x10\x04\xe2\xe0\x12\xf0\x89\x60\xb2\x0c\x6d\x6c\xe1\x08\xff\x7c\x7f\xf6\x6e\x15\x57\x30\x8b\xe7\xfb\xb7\xd6\xef\x57\xe9\xd7\xa4\xf4\x76\x29\x8d\xa8\xa1\xdd\x05\x10\x07\xff\xbd\x8e\xf2\x0e\xa8\xd2\x13\x6a\x16\x4e\x1f\x3e\x30\xb5\xbc\x58\x93\x50\x79\xfb\xcd\xe9\xed\xad\xc9\x93\xed\x9f\x74\x6f\x55\x63\x3a\x8c\x20\x23\x0c\xe0\xa0\x4e\xa4\x82\xff\xbe\x00\x06\xcd\xae\xa7\x69\xa0\x5e\xb9\x3d\xe2\x85\x55\x6b\x4a\x20\xa6\xa2\x5b\xb0\x89\xbb\x7e\x10\x6f\x03\x7f\x93\x06\x6a\x4f\xd1\xc9\x77\xe7\x1e\x2c\x6b\xe8\xa0\x05\x88\x83\x6b\xc0\xc7\x3c\xea\x80\x57\xfa\x53\x9b\x41\x7f\x1c\x37\xbd\x47\x68\xf8\xba\x5f\xbd\x97\x13\xfe\xa1\x95\x23\x3b\xce\xb7\x91\x6e\x3e\xa8\x11\x1a\x88\x83\x3f\xd3\x06\xe6\x7e\x3e\x85\x4b\x36\xaf\x5b\x9f\x3c\xc1\x55\x38\xa7\xba\x87\xdd\x46\xdc\xa4\xdd\xa9\xfb\x3c\x6a\x26\x30\x5c\x76\xe6\x59\x38\x22\x2e\x88\x83\x6b\xa0\xe8\xa5\xe7\xad\x66\xc1\x58\xbc\xbc\xfb\xc1\x29\x3c\x68\xd5\x89\x36\x3c\x55\xe2\xba\x89\x37\xfc\x1c\x34\xbf\x0e\x25\xd9\x86\x3d\x41\xc4\x05\x71\xf0\xdf\xdb\xdd\xc5\xf3\xc4\x3b\xd3\xf2\x96\x9c\xec\xa7\x6f\xdb\xa1\x3c\x7f\x0e\x2d\xbe\xd8\xa7\xd1\x6e\x0f\xb2\x6f\x7e\xac\xce\xfd\x90\xf0\x1a\xba\xcd\x09\xc0\x41\x1d\x89\x01\x46\x18\x94\xea\x4e\xd3\x80\xc0\x0c\x73\x86\xbc\x9f\x06\x69\x06\xe1\x0e\xcb\x85\x43\x96\x56\x19\x3e\xb6\x70\xf2\x03\x2d\xb9\x65\x69\xe5\xe3\x92\xac\x58\xe8\x44\x04\x88\x83\x6b\xc0\xa1\x1b\x6d\xf9\x73\xd2\x2f\xe7\xcd\x8d\x6f\x11\x89\x3b\x7a\x95\x26\xd7\x48\x16\xea\x08\x27\x74\xea\x9a\xd8\x8a\xb2\x9d\xb7\x88\xa1\xdd\x7b\x00\x07\x7f\xa6\x46\x2a\x4c\xad\x2c\x1c\xdf\x96\xe5\x8c\x45\x0f\xc8\x23\xd7\x96\xb1\x2e\xbc\xba\x6e\x7c\x54\xf3\x8a\x92\x07\x35\xef\xa5\xcd\x94\x16\x22\x2e\x88\x83\x6b\x40\xbd\xff\x78\xeb\x0f\x8b\x84\xb7\x53\x75\x76\x92\x83\xe2\x07\x41\xd7\x31\x43\xdc\x8e\x61\x82\xbd\x9a\x5b\x6b\x15\x07\xcf\xa7\x3d\x11\x71\x41\x1c\xfc\xf7\x12\x3d\x98\x92\xb8\xc8\xf7\xd4\xe8\x16\xf1\x4c\x73\xb4\x8d\x76\x47\x54\xfb\x52\xf1\x56\x85\x3e\x36\xa3\x90\xab\x99\xcc\x5e\x6a\x33\x42\x03\x20\x0e\x9a\x07\x8c\xfe\x5d\x03\xa0\x75\xc7\xa9\x47\xa3\xd7\xc9\xce\x55\x3a\xd2\xbe\xea\x10\xc6\xbf\xd4\x70\xb0\x16\x50\x9a\x2b\x6b\x99\x28\x28\x4f\x3c\x6a\xa2\x9e\xa9\xbf\x13\x0c\xed\xb2\x83\x38\xb8\x06\xb2\xc4\xf5\x13\x5a\xbc\x59\xbd\x13\x54\xab\xaf\x3c\x61\xd8\x33\xf2\xac\xf6\x4a\x9b\x26\xa0\xac\xa6\x71\x96\xa0\x19\x36\x16\x87\x4e\x1d\x81\x38\xf8\x33\x0d\x97\x12\xf7\x75\x64\x2e\xf9\x8c\x56\x5a\x88\xaa\x99\xfc\xa3\x39\x49\x9f\x9d\xf2\x43\xbc\xf6\xf9\x9a\x0c\xbf\xbb\xd7\xb1\xd8\xa0\x5b\xa2\x40\x1c\x5c\x03\x64\x99\xee\x56\x99\x9e\x2c\x06\x5b\x26\x63\xcf\x84\xfa\x5e\xb9\x79\x13\xd2\x5b\x6e\x46\xd9\x26\xba\x6f\x3a\xdf\x5f\x55\x0c\xf9\x80\x88\x0b\xe2\xe0\xbf\xb7\x6c\x96\x0a\x6b\x6a\xbc\x49\x6d\xf0\xfb\x28\xaf\x85\xb8\xc0\xef\x79\xdd\x9c\xf1\xb2\xa7\x3f\x79\x98\x29\x44\x47\x23\xbf\x3c\xcb\x46\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\x4c\xd4\xe9\x46\x58\x0c\xd7\xdc\x5d\x7c\xa7\x2e\x70\xdd\x5d\xe8\xc9\x82\x18\x91\x39\xb6\xb5\xde\x50\x5f\xc4\xcd\xb9\x17\x8d\xfd\xaa\xa1\x68\x9a\xd6\x08\x53\x09\xe2\x90\x8d\xb0\x87\xbe\xee\x46\x4b\x3f\x5f\x14\x63\x14\xf3\xca\x25\x17\x34\xe7\x3c\x23\x5a\xa7\xcd\xfc\xcc\x0b\x46\x7a\x64\x61\x03\x68\x47\xce\x88\xc8\x20\x0e\xd9\x08\x17\xe7\x64\x0d\x14\x27\xb1\xb9\x1e\x05\xa0\x08\x6a\x75\xd4\x56\xf1\xd0\x56\xbe\xab\x9c\xe1\xce\x79\xef\x4f\xd8\x83\x26\x50\x06\x1d\x8d\x06\x71\xff\xef\x5d\xc5\x7f\x47\x06\x76\xa5\x46\x18\x61\x5e\x01\x76\x51\xe2\x4d\x1f\x45\xc9\x0d\x42\xbc\x51\x17\x39\xac\x39\x89\x5a\x19\x32\x31\xdc\x20\x06\xd1\x67\x7a\x3c\x6b\x45\xff\xa8\x11\x5e\xd5\x4c\x7c\x39\x9f\xac\x73\x2d\x30\xac\xd6\x51\x4e\x70\x6c\x49\x4e\x4e\xd1\x5a\x7f\x51\xd6\xf9\x32\x95\xcb\x57\x27\x1d\xdb\x7f\xec\x29\x65\xe1\xf7\xf9\x4d\xc4\xcb\x76\x3b\x14\x15\xa6\xd7\x69\x53\x63\x1b\xcd\xfb\xda\x44\x27\x6e\x14\x11\x7d\x32\x76\x75\x14\xb8\xfa\x5f\x33\xc2\xa0\xa1\xfd\x5d\x23\x8c\x64\x84\x2f\x2d\x06\xd7\xe3\xdf\xbe\xc7\x63\x31\xa7\x99\xf4\xca\x29\xe5\xbd\x72\xc4\x97\x68\x89\xce\x56\x66\x8f\xa8\xc7\xd8\x94\x57\x7e\x27\x9d\xc9\x66\x25\xb2\x11\x4e\xba\xf5\x52\xbc\x9a\xf0\x7a\x67\x4f\xc4\x1b\x3a\x5b\x31\xea\x36\x81\x4f\x3d\xdd\x41\x83\x2c\xaa\xd7\x8e\xad\x96\x48\x6c\xe2\x2f\x9d\xc9\xd6\x2c\xb2\x11\x36\xa3\x4a\xc8\xf7\xe5\x51\xbf\xc2\x4c\x25\x64\x23\xff\x21\x64\xbd\x50\xf9\xe9\x83\xe7\x09\x4f\x2f\xac\xf7\x37\xf6\xfd\x4a\xcc\x3a\x93\x4b\xa1\xe4\x91\x8d\xb0\x41\xfa\xd5\x4b\xb7\x8f\x67\x42\x78\x7e\x66\x15\x6e\xc7\x60\x74\x46\xa8\xf2\x1c\xdc\x3e\xb8\xbd\x71\xdb\x49\xfc\xa6\x51\xb8\x7f\xd1\x99\x8c\x16\xd9\x08\xd7\x79\xcb\x68\xab\xd4\xbe\xc5\xe2\xae\xc8\x20\x4d\x5f\xda\xd8\x22\x1e\x13\x31\x8f\xad\xc9\x34\x4e\x39\xf7\xce\x72\xec\x90\xf8\xec\x8e\x46\x83\x44\x74\x5a\xe6\x2b\xfa\x83\xaa\xaf\xed\x14\x9d\xfe\x9a\x76\x33\xbe\x3b\xcd\xf7\x41\x18\xd1\xd1\x1d\xeb\x07\x7a\xfb\x0b\x51\x57\x88\xe5\x93\xa6\xa0\x5b\x8d\x41\x1c\x3c\xf3\x55\xcc\xff\xa2\xb2\x8e\x74\x3c\x92\xae\x5e\x60\xf2\x5d\x58\xbd\xbb\x39\x91\x1d\x88\x1f\x3e\xa4\xb3\x86\x81\xbb\xf8\x42\xd9\xd7\x0c\x11\x17\xc4\xc1\x33\x89\x4c\xff\x44\x3e\x9b\xdd\x04\x7b\x23\x1a\xa5\xe2\x3d\xce\x6f\x51\xc9\x65\xf7\x82\x88\x96\x59\x2e\xdf\xde\x95\xa4\xab\x35\x27\x80\x5a\x22\x83\x38\x78\xe6\x93\xca\xbc\xfb\x55\xb8\x71\x5c\x28\xca\x1a\xdb\xef\xea\xbb\x26\x8c\x42\x94\xb4\x97\xcc\x78\x8f\x6c\x2a\x8a\x36\x2d\xac\x73\xef\x43\x9d\x92\x40\x1c\xbc\xd8\xc8\xd4\x33\xec\x3b\xfe\x89\x6a\xe4\x95\x37\xeb\x2e\x56\xab\x2b\x93\xe7\xa9\x2c\x66\xe6\xab\x76\x22\x24\x1f\x38\xce\xeb\xbc\xfc\xd4\x82\x30\xc2\x20\x0e\x6a\x31\xfc\xef\x46\x18\xf4\x42\x9f\x26\x01\xd3\xce\x34\xa6\x60\x8d\xa7\xa5\x68\x8a\x3c\x64\xbb\x8d\xef\xb3\x34\x0b\x4b\x2e\xa4\x6b\x39\x5c\x65\xef\x78\xd2\x99\x63\x65\x0f\xb5\xec\x05\x71\x70\x09\xc8\x4b\x37\xb5\xbd\x73\x8e\xc4\x36\x3e\x6a\x99\xbc\x9e\xf1\x74\xc6\xde\xd9\xff\x56\xe3\x6a\xb2\xcd\x13\x7e\x06\xe2\xaf\x6f\xc3\x85\x10\x71\x41\x1c\x5c\x02\xd8\x64\x8d\x2a\x2e\x83\x34\xac\x4a\x83\xc6\xfc\x4c\xe3\x2d\x2b\x8b\xf7\xca\x8f\x25\x43\xd1\xa7\x44\x8d\x45\x45\xea\x53\x69\x72\x11\x71\x41\x1c\x5c\x02\xa3\xee\xd7\x64\x9e\x75\xe2\xbc\xbf\x8a\xfa\x2d\xf5\xd1\x27\xb2\x5a\xc7\x8b\xfe\xeb\xdd\xa6\xcb\x77\x7f\x4a\x7e\xf9\xe3\x25\x72\x03\x3a\xca\x0d\xe2\x90\x1a\xaf\x24\xab\xcb\xe7\x62\xc8\x2d\x97\x50\xb9\x6f\xdf\xe6\xb6\x7d\xbd\x69\xa6\xcc\x64\xfb\x63\x52\xed\xb9\x24\xf3\xbd\xfa\xc8\xf9\x0b\x88\xc5\x0f\x88\x83\x5a\x8b\x02\x8c\x30\x68\x76\x3d\x4d\x03\x16\x7d\xf7\x63\x3f\x07\x55\x49\x0b\xd3\xa3\x73\xd7\x7e\x9b\x98\x09\x8d\xdc\x48\x0b\xb4\x40\xfd\x2c\x2d\xcb\xca\x30\x95\x80\x1d\x84\x18\x3b\x88\x83\x6b\xc0\xdf\x53\xfa\xb0\xfe\x5a\xf8\x94\x1d\xe5\x27\x46\x91\xb9\xae\xeb\xd4\xd5\xb7\x8c\x24\xd2\x85\x0a\x5a\x44\xf5\x2e\xf2\xbd\xfe\xb2\x88\x88\x0b\xe2\xe0\x1a\x88\x7f\x83\xa7\xfd\xe1\x6e\xda\x90\xdd\x79\x11\x42\xab\x8c\xe5\x01\x95\x92\x0b\x17\x0b\x19\xe4\x35\xd3\x9f\x67\x53\xfa\xea\x66\x41\xd3\x0b\x88\x83\x6b\xc0\x5c\xf9\xae\x34\xc7\x85\x83\x74\x46\xad\x22\x85\x54\xee\x71\xca\x51\x0e\xfc\x40\xdb\xf4\xcc\xe7\x45\x37\x02\x27\x6e\x51\x86\xb2\x41\xb5\x8c\x00\x0e\xae\x81\xfb\xf8\x05\x54\x37\x93\x23\xb9\x6f\xd6\x48\xb2\xdd\x31\x50\xc9\x16\x15\xfa\x23\xf3\xf1\xf7\x63\xa7\xf8\x2f\x3f\xcc\xd0\x6e\x66\xf8\x20\x34\x00\xe2\xa0\x16\xc3\x00\x23\x0c\x4a\x75\xa7\x69\xa0\x52\xa3\x2a\x37\xd9\x92\x85\x2f\xd1\xcb\x4a\x8d\x75\xd4\x3b\xbf\xe1\x1c\x81\x3d\x9e\xfa\x80\x85\x6b\x10\xc3\xe8\x35\x23\x2d\xa8\x96\x17\xc4\x21\x7d\x13\x4d\xb3\xe4\xb8\x32\xd0\xa0\x88\x52\xbe\xc9\x83\x25\xce\x3c\xb2\x83\x3d\x1c\x72\xee\xa1\x65\xec\xc5\xa9\xa1\x83\xa3\xe4\xeb\x50\x7d\x28\x88\x83\x6b\xc0\xc6\xec\xe6\xd6\x26\x3d\x66\x9e\x8e\x64\xa6\x1b\xf1\xe2\xb4\xbd\x27\x7d\xec\xdb\xce\xb8\x3a\x5d\xa6\xb1\xa2\x89\xdd\xf7\x46\x7c\xd0\xee\x3d\x80\x43\x4a\x05\x32\xd9\xea\xbd\x23\x9f\x0b\x06\x4b\xcb\xa6\x15\x23\xff\x88\x1e\x4d\x0c\x64\xb6\xee\x87\xf9\x4b\x79\x34\x89\xf6\xd7\xa4\x41\x26\x08\xc4\xc1\x35\x10\x72\xbb\xca\x50\xd8\x7f\xda\x9f\x9f\xd9\xaa\xb6\xe7\xf9\xb8\x4f\x76\x12\xc5\x74\x97\xd7\xb1\xb4\xb4\x9a\x95\x45\xbb\x77\x83\x04\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\x4d\x03\xfe\x1f\x9a\xdb\x7f\x36\x8a\x17\x9a\x4c\x8c\xb8\x45\x52\x6d\x75\xa0\xd4\x1e\x3f\xd9\x9f\x5b\xb3\x73\x7a\x30\xff\x86\xa8\x93\xdd\x1c\x7a\x5f\x01\x1c\xd2\xe9\xa0\xf6\xa4\xb9\x38\x4d\xba\x94\xb0\x69\xb5\xa0\x3c\x57\x9a\xe3\x63\x3f\x7a\x2d\x52\x62\xf7\xef\x2e\x42\xaa\xaf\xdf\xa8\x2e\xf3\x42\xa7\x83\x00\x1c\x5c\x03\xfd\x55\x8a\xf6\x3a\x14\xd4\xc5\x6e\x1d\x64\x6a\x4b\x93\x83\x9b\x9d\x95\x94\x62\x6c\x01\xa6\xbf\x27\x4a\xa8\x77\x99\x8f\x98\x50\x10\x71\x41\x1c\x5c\x03\xd3\xef\x2e\xf7\x68\xb5\x6c\x7c\x0c\x7a\x61\xf7\x9b\xcc\x8a\x95\x9e\x6c\xcd\xd3\x4d\x42\x25\xa4\xdd\xb9\x22\xd4\xaf\x5d\x15\x07\xfa\x18\x02\xe2\xe0\x1a\xe8\xe1\x31\x08\x20\x7f\xec\xe2\x5c\xba\xfa\x7b\xea\xcf\xe1\x6b\xbb\x03\x55\x5c\x7e\x5e\xe2\xa6\x35\xf3\xe9\x74\x9b\x07\xc5\x5b\x50\xc3\x34\x10\x07\xcd\x03\x00\x23\x0c\x32\x51\xa7\x1b\x61\x35\x73\xae\xdc\x79\xd2\x73\xab\xc1\x74\xef\xde\x5b\x06\x6a\xdc\x58\x64\xe0\xb7\xa9\x0b\x5d\x24\x54\xfa\x66\x96\x48\x11\x37\x3c\x8c\x30\x95\x20\x0e\xd9\x08\x1b\x53\x3d\x93\x78\x62\xb0\xb4\x96\xbf\x2b\x44\xf6\xa2\xef\xe5\x48\xd2\x53\xa7\x90\x90\xab\xeb\x04\x6e\x2f\xb1\x6b\x36\x4a\xd4\xec\x10\x91\x41\x1c\xb2\x11\xfe\x66\x32\x4d\x6e\xb6\xe1\x47\xea\xb1\xfb\xc3\x32\xba\x5a\x96\x50\xca\xe1\x9e\xc0\x6d\xd5\x92\x94\xe4\x97\x82\x6c\x01\x0b\x09\xe3\x88\xc8\x20\x2e\x58\x39\x00\xf6\x34\x80\x6d\xa6\x11\x46\x38\xbc\x91\xfc\xae\x0d\x79\x38\xd3\x17\xf2\x26\xba\x83\x8f\x4b\x95\x3d\xb6\x9f\x3d\xf2\x77\x72\xf9\xd9\xb3\xb5\x02\x7a\x1b\xcf\xd5\xfc\x6d\x84\xb3\x33\x99\x52\x87\xf5\xb1\xc3\x05\x44\x38\xd1\x0e\x9d\x95\x7a\xa8\xe9\x73\x53\x06\x45\x68\x78\xc6\xa9\x1e\xae\xe1\x99\xb7\x04\xff\x85\xbe\x77\xb5\x9f\x3d\xd6\x78\x30\x32\xe9\x7f\x51\x30\x6c\x5a\x9a\xa8\xc7\x71\x18\x1d\x87\x2b\xfd\x44\xc1\x98\x28\x63\xbb\xf8\x4e\xf6\x7f\xcd\x08\x83\x86\xf6\x77\x8d\xb0\x2a\xdc\x2c\x11\xfe\xaa\xf9\x1d\xfb\x65\x4f\xc1\xfb\x51\xe7\xee\x61\x74\x70\x0d\x5a\xd9\x92\xc2\xab\x0d\xca\xae\xd8\xe1\x0d\xbd\x27\x7f\x3e\x33\x9e\xc9\x66\x25\xb2\x11\x66\xba\xfd\x4a\xd4\xb5\x2f\x2f\x91\xc6\x4e\xeb\x65\x26\xa6\xf6\x26\xc3\xb2\xe4\xa7\x0b\xf6\xce\x31\xcc\x54\x94\x9b\x8f\x7d\x8f\x9d\xcf\x64\x6b\x56\x06\xe9\xcf\xf2\xe7\x97\x78\x89\x4b\x27\x2a\x8e\x0c\x15\xf8\x8f\xca\x04\x7e\x3b\x71\x0f\x4d\x69\x5c\xdf\x2f\xf8\xfc\xfd\xc5\xd1\xf9\x94\x73\xc9\x67\x32\x5a\x64\x23\x2c\x51\xe7\xa0\xa2\xec\x56\xb0\xdb\xfe\x5e\x7c\x12\xf7\x23\xa1\xb3\x15\x8d\xfd\x9b\x7c\x3f\xaa\xaa\xeb\xf2\x81\xa8\x15\x77\x9f\x17\x9e\xc9\x68\xdd\x90\xfe\xec\x75\xea\xbd\x6e\x31\xdb\x9f\xb9\xbe\xe3\x35\xd4\xa6\x81\x52\x4c\x38\xa3\x18\xcf\x5e\x78\xe3\x04\x3d\x2b\xf7\x5c\x39\x4a\xfc\x9a\x75\x66\x46\x18\x24\xa2\xd3\x32\xdf\xef\xe3\x92\x2c\x22\xf4\x45\x54\x1c\x57\x69\x42\x3b\xdd\xe1\xad\x32\x0a\xda\xdf\x3b\x81\xa4\xdc\xbc\x8c\x97\xdb\xaa\xa5\xe7\x33\x10\x33\x3e\x88\x83\x67\xbe\x8f\xfb\xe8\x2c\x4f\x99\xc7\x5e\xc4\x32\xb6\x0a\x9b\xb7\xb6\xbe\xfb\x8a\x11\xc4\x77\x5e\xc7\xcb\x04\xff\xa1\x73\x17\x49\xda\x47\xe8\xc2\x4f\x10\x07\xcf\x7c\x16\x44\x18\x9b\xe7\xbb\x58\x4e\xbe\x1d\x3b\x4a\x96\x33\xa5\x7e\xe7\xf4\xc3\x09\x89\x66\xa9\x7f\xc3\x13\xc0\xb7\x15\xb0\x4d\x9a\x09\xad\xd8\x01\x1c\xfc\x39\x84\xe5\x0e\x4b\xf2\x68\xdd\xb0\x10\x08\xf8\x53\x67\x79\x9e\x44\x32\x33\x15\xed\x21\x49\x94\x29\x0a\xaf\x3d\x5a\x8b\x3f\x86\x58\x20\x22\x2e\x88\x0b\x56\xc4\xfc\x47\xdc\xf6\x88\xfb\x5a\x57\xa2\x3b\x09\x4b\x18\xf5\x27\xad\x64\x72\x5c\xc2\x69\x32\x2d\x55\xfc\x98\x5f\x2d\x7b\x61\xe6\x30\xb7\xab\xee\x20\x8c\x30\x88\x83\x6a\x84\x55\xff\x75\xf1\x03\x7a\xa1\x4f\x93\x40\x55\xe5\xe8\x0f\x5b\x69\x4b\xaf\x9f\x3f\x0b\xd7\x74\x7a\x02\x02\xf9\xfc\x23\x8f\xa5\xb1\xd2\x30\x14\x99\xc4\xeb\xe6\xb6\x0e\xa1\xaf\xf5\x20\x0e\x2e\x81\x3f\xa6\xb1\xdb\xce\xa9\x41\x38\x4c\x63\xb2\xb2\x58\xd5\xd9\xd9\x35\x56\xc6\xd2\x83\x26\x0d\xac\x57\x37\xf7\x66\xcb\x96\x9c\x65\x10\x71\x41\x1c\x5c\x02\x7b\xa3\xe8\x57\xa7\x7d\x82\x1a\x31\xdb\x77\x1f\x7a\xc4\x84\xa2\x51\xca\xf3\x35\xaa\x72\x61\x84\x17\xf9\xe4\xa0\xf5\xf0\xe2\xa5\x23\xe2\x82\x38\xf8\x73\x98\x6d\x19\x5c\x36\xb7\x5c\xc9\xe0\x36\xf2\x53\x78\x1f\xe7\x35\xdc\x81\x49\x72\x4e\xd1\x0f\xd5\xc2\xc9\xfd\x89\x1f\x13\x91\x23\x74\x44\x1c\xc4\xc1\x25\xf0\xf5\x55\x69\x54\x83\xd9\x77\x92\xb9\xd1\xf5\xa6\x07\x6c\x05\xfb\x4a\x1a\xf7\xb8\x5e\x8e\xd6\x5e\x7a\x9d\x81\x9a\xf3\xfa\xc4\x48\x0c\xb1\xf8\x01\x71\x50\x6d\x20\xc0\x08\x83\x66\xd7\xd3\x34\x10\x32\xf7\x46\x8c\x49\x9c\x3c\x03\x3f\xee\xe4\xe2\x79\x66\xf6\x07\xbf\x9e\x8a\x3c\xce\x35\x4f\x97\xd1\xbe\xa0\x3d\xa0\x6b\x7c\x08\x19\x40\x10\x07\xd7\x80\xc5\x41\xfe\xef\xd4\x05\x3b\x27\x25\xde\xb1\x06\x4d\xba\xa5\x8e\x0f\x1f\xca\xf0\xee\xb0\xd8\xd7\x45\x54\x45\xe7\x45\xb1\xc8\x43\x0d\xc8\x40\x1c\xd2\xb1\x58\xd3\x1c\xab\x55\xda\x9c\x9a\x85\x67\x72\xb4\x62\xf8\x54\x92\xd7\xbf\x1b\x4a\x39\x30\x91\x2b\x5d\xc7\xba\xff\x69\xc9\x50\x4d\x1c\x3a\x16\x0b\xe0\xe0\xcf\x41\xd6\x42\xa7\xe5\x5b\xa8\xa3\x72\xdc\xe6\xe3\x57\xea\xbd\x72\x13\x1b\xb7\x58\x79\x34\x87\x98\xcd\x6f\x9d\x68\x7f\xf6\x7c\x1e\x60\x84\x88\x0b\xe2\xe0\x1a\xf8\xd1\x58\x62\x62\xde\x79\xed\xb6\xe2\x30\x3e\x05\x25\x91\xfd\x46\x44\xa4\x89\xd7\xc5\xb5\xa9\x80\xe0\xb6\x82\x17\xc1\x9e\x04\x15\x08\x0d\x80\x38\xa8\x36\x50\xe6\xdf\x35\x00\x4a\x75\xa7\x7e\x13\xd5\x28\x7f\xae\xd0\xe9\x61\x35\x3e\x4c\xe5\x54\x50\x61\xc4\x62\xc4\x79\x27\xf2\x48\x9a\x6a\xa6\xc3\xe5\xe3\x4f\x8b\xde\xcf\xd9\xd0\x37\x51\x00\x07\xd7\x40\xa2\x81\xe4\xdb\x3c\xde\x89\x4f\xed\xaf\x67\xe3\x7c\x47\xce\xbf\xd6\x98\x4c\x13\xa0\x5b\xa9\xaa\x48\x7a\x8a\x13\xb5\xeb\xc5\x0e\xdd\x29\x0d\xe2\xe0\x1a\x50\xc8\x65\x7f\xeb\xda\x5e\x97\xcc\x9a\xc5\x23\xc7\xd5\x22\x87\x4e\xb5\x59\xc5\xd8\x6d\x71\xcd\xd4\xdf\xa5\xa9\x44\x5f\xcc\x17\x0f\xea\x6d\x00\xe0\xe0\xcf\x81\xaa\x50\x64\xf6\x22\x5d\x64\x04\x09\x59\xbd\x7a\x64\x14\xa5\x4a\x7d\xcb\xbe\xcd\x48\x88\xc0\x2d\xa9\x76\x97\x19\xfe\x22\x51\xc8\xb8\x83\x38\xb8\x06\x84\x73\x7f\xfb\xf6\x05\x71\x09\x15\xcf\x7a\x55\x1d\x07\x89\x10\x7d\x98\x17\x8d\x8a\xc3\x71\x50\xb2\x37\xef\xa9\x0e\x3c\x39\x66\x43\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\xd6\x1d\xa7\x69\x80\x1a\xcf\xf1\xda\xf3\x1c\xaa\x4c\x4e\xd2\x8e\x68\xad\xaa\xa5\x7b\x4e\xb3\x2b\xbe\xb7\xf7\x4a\x36\x87\x1e\xfb\x2d\x5e\x1e\xab\x19\x45\x8c\x1d\xc4\xc1\x35\x20\xbe\x59\x3e\xe5\xde\x9a\x9c\x22\x13\xdb\x95\x9f\x32\x32\xcc\x86\x9e\x53\xb9\xc6\x96\x90\x5c\x77\xe3\x7d\xde\xd3\xc5\xc2\x00\xe8\xbe\x25\x10\x07\xd7\x40\x7a\x36\xff\x12\x3d\x5b\x8e\xc3\x6e\x2c\xdb\xbb\x07\x2e\xd7\x76\xc2\x09\xa9\x9f\xf8\x98\x04\x76\x7e\x90\x98\x6a\xaf\xd2\x36\xf2\x40\xc4\x05\x71\xf0\xe7\xa0\x43\x90\xe9\xdb\x3a\xb6\xbf\x7f\x69\xe7\xab\xb9\xc0\xd5\x40\x67\x69\x49\x8c\xee\xcc\x6f\x51\x27\xc7\xb4\x5d\x5f\x71\x3a\xec\xa0\xdb\x17\x41\x1c\x5c\x03\x75\x87\x0f\x0a\xde\xa1\xcd\xbf\xa4\x55\x6f\x28\xec\x50\xd2\xa7\xdc\x88\x72\x4b\xef\x93\xb7\x14\x72\xbd\x98\xa6\xa4\x35\x35\x04\x75\x8d\x06\x71\xd0\x3c\xe0\xf6\xef\x46\x18\x64\xa2\x4e\x37\xc2\x8f\x23\x5a\x28\xd7\x12\xd9\x2a\xb7\x62\xaa\xb4\x46\xc6\x6e\x67\xbc\x21\x09\x70\x51\xdc\x93\x32\xa3\xb7\xa8\xd5\xe8\xaf\x12\xa1\x40\x98\x4a\x10\x87\x6c\x84\x3f\x08\xd0\xaf\x38\x9f\x7f\xf6\xb1\xed\x96\xe2\xf1\x7b\xf5\x7d\x59\xcc\xe2\x98\x4e\xe1\xd5\xd8\xed\xf4\xbe\xee\x95\x11\xe6\x3f\xc2\xd0\x01\x66\x00\x87\x6c\x84\x69\x72\xb4\x1f\xfa\xd8\xd5\x57\x87\x9c\xbc\x63\xd7\x56\xbb\x5e\xfc\x39\x49\x69\xcd\x34\xf4\xd1\x6d\x3e\xfc\x97\xa5\x11\xb1\xe7\x9f\x22\x22\x83\xb8\x60\x65\x94\x73\xff\x8c\xfc\xbf\xee\x1a\x5d\x33\xa1\x55\x35\xcc\xb9\x92\x74\xb9\x5a\x7e\x9f\x69\x6c\xd8\xda\x3e\x2f\x73\xaf\xe8\x5e\x7b\xd7\xa8\x4b\x98\x78\x94\x48\xc4\x3f\x76\x84\x95\x1c\xd8\x7f\x71\xdd\xf2\x3c\x14\x7e\xa5\x84\x1e\xd0\x98\x72\xd3\x01\xad\x65\xa1\x43\xba\x02\x53\x44\xa5\xb2\x2c\x49\xc3\x1c\xff\xef\x13\x65\xc3\x14\x07\xf3\x02\xec\x5e\x55\x29\x85\x1a\x0a\x4f\xa9\xb0\x19\x7e\xaf\xe0\xb9\x89\x8c\x4b\x6c\xea\x79\xdd\x27\x94\xec\x7c\xf8\x5f\x33\xc2\xa0\xa1\xfd\x5d\x23\x8c\x64\x84\xfd\x13\x96\xc9\xfd\x6d\x51\x48\xec\x9c\xf8\xc9\xf0\xcb\xfc\x6d\xf0\x1e\xde\xf5\x98\x52\xbf\x59\x83\x15\x5f\xff\xd3\xe0\x41\xfc\x9b\x33\xd9\xac\x44\x36\xc2\xbc\x26\x73\xb5\x9d\x17\x0c\xca\x92\x5e\x52\xe5\x67\x76\xf5\x0a\x36\xab\x4d\x90\xc5\x70\x08\x05\x13\x90\x8b\x52\x25\xca\x6e\x97\x9d\xc9\xd6\x2c\xb2\x11\x9e\x26\x0c\xaa\x2a\x71\x64\x6a\xc3\x54\x96\x65\xa9\x51\x6d\xec\x48\x16\x98\xf9\x99\x74\x11\xe3\x46\xae\x3e\x9e\xed\xbc\x51\x8d\xc8\x99\x8c\x16\xd9\x08\x8b\xd1\x3f\xdb\x15\x92\xe8\xb6\xcf\xf2\x49\xe7\x65\x3e\xe0\x32\xab\x72\xd3\xb8\x62\x6f\x24\xe2\x53\xaf\x27\xdc\x26\x77\xaf\x7d\xe5\x4c\x46\x8b\x6c\x84\xf9\x35\xcc\xfd\xcf\x9f\x2c\x63\xe5\xf5\x62\x5d\x5f\x42\xb3\x08\x65\xe1\xea\x34\x9a\x47\xa9\x61\x75\x6a\xb9\x68\x20\x40\xfb\x8c\xf3\xcc\x8c\x30\x48\x44\xa7\x65\xbe\x6a\x74\x1b\x67\x35\x41\x97\x80\x8d\x24\x0d\x22\xed\x4e\xf6\x4f\x84\x1d\x65\xad\x0f\x84\xe3\xe7\x1e\x0a\xd1\x55\x58\xb8\x7e\x81\x56\x29\x20\x0e\x9e\xf9\xd0\x83\x09\x9b\x8a\x19\x8c\x6a\x73\x8c\x0d\x9b\x65\x8c\xae\xe6\x96\x8e\xd8\x2b\x8d\x4d\xdc\xe6\xd5\x77\xa6\x46\x57\xbe\xb1\x00\x9d\x5f\x05\x71\xf0\xcc\xf7\x2b\xec\xd3\xdd\x9d\x5f\x7b\x56\xfa\xe6\x1f\xe7\x96\xb7\xcf\x93\xdd\x65\x69\x09\x7c\x11\x42\xc4\x18\xe7\x44\xff\x23\xe9\x4d\x30\x74\x34\x1a\xc4\xc1\x9f\x43\x5f\xd8\xcd\xbd\x10\x31\xb6\x7b\x9d\x63\x3f\x59\xf7\xa5\x12\x43\x99\x4d\xa4\x7a\xb9\x2f\x0b\x4a\x4a\x90\xa6\x4f\xd5\x5c\x91\x7d\x0f\x75\x5e\x01\x70\xf0\xe7\x20\x3d\xcb\xb6\x4d\xdc\xc6\x5f\x6c\xb0\xb0\xb0\xda\xde\xb5\xaf\xce\xe3\xa3\x3d\xc6\xc5\x54\x43\xe3\xc4\x88\xcb\xdf\x99\x7c\x07\x0d\x61\x84\x41\x1c\x54\x23\xfc\xef\x46\x18\xf4\x42\x9f\x26\x01\x27\x55\xac\x47\xd6\x8f\xe4\x2c\x16\xfc\x24\x3f\xe7\xe5\x57\xb0\xdb\xde\x6f\x7c\xb8\xb6\xfe\x4b\xac\xfa\x1a\x6e\x7a\xdc\xf6\x7d\xa8\x26\x0e\xc4\xc1\x87\x8e\x2a\xdf\xa0\xf4\x79\xad\xd8\xf7\x32\xf7\xe4\xa1\x9f\x79\xa7\xd2\x86\x71\xcb\x55\xee\xdd\x43\x9a\x8a\x06\xa6\x7d\x1a\x39\x23\xa8\x7e\x0b\xc4\xc1\x25\xd0\x3a\x1b\xe6\x97\xc2\x55\x97\xa9\xa4\x9d\x23\x4b\x6c\x46\xc0\x20\xb5\x40\x59\x11\xfb\xda\x5a\xe8\x83\x9c\x6e\xdf\xd8\xd8\x98\x0e\x22\x2e\x88\x43\xda\x19\x17\xa6\xdd\x7f\xe4\x52\xcc\xf7\x79\xfa\x99\xcb\x9c\x52\x74\x0e\xfd\x3d\x39\xec\x91\x2d\x22\xee\x4c\x01\x01\x51\xe1\xb4\x77\x03\xd0\xce\x38\x80\x83\x3f\x87\xab\x0d\xa8\x96\xa8\x23\xad\x62\x1d\x51\x04\xef\x51\x0c\x35\x63\xa2\x02\x05\x7c\x9d\x6a\xa7\x02\x84\x65\x7e\xf9\x0e\x10\x0f\x79\x23\x16\x3f\x20\x0e\xaa\x0d\x04\x18\x61\xd0\xec\x7a\x9a\x06\x1e\x7f\xd2\xfe\x3c\xff\x51\xea\xe5\xf3\xe2\xb8\x21\xe9\xfa\x13\xec\x5b\xdf\x02\x73\x7b\xb2\x15\x34\x82\xaa\x4d\x5f\x04\xce\xd1\x5b\x22\xc6\x0e\xe2\xe0\x63\x9f\x6d\x0d\xf7\xef\x8c\x28\x30\x11\xc6\x68\xad\xab\xfb\xbe\xdf\x1b\x48\x61\x35\xda\x6d\x76\xe1\x19\xd1\xb1\x31\x06\xb7\x71\xa5\x26\xf4\x71\x01\xc0\xc1\x35\xc0\xdb\x3a\x58\x4b\xb5\x2e\xc8\x7d\x2f\x34\x70\x31\xb5\xd7\x8d\x34\x53\x24\xa5\xe1\x6a\x27\xa3\x7a\x53\xf7\xd3\x91\x86\x41\x03\xe8\xba\x27\x10\x87\xb4\x33\xae\xc3\xea\x55\x15\xe1\x4d\xcf\x71\x83\x84\xa5\x50\x39\xc7\xe6\x72\xdb\xd7\xa9\xd0\x02\xbf\x37\x07\xd2\xd8\x87\x77\x3c\x26\xd2\x20\xe3\x0e\xe0\xe0\xcf\x61\x6e\x8b\xfc\xd8\xb7\xfa\x75\x87\x83\xc6\x82\x59\x8f\x66\x91\x27\x25\x43\x18\xca\xa0\xf1\xfb\x38\xff\x0f\x5a\xa8\x75\x38\x58\x59\x50\x6d\x20\x80\x83\x6a\x03\x01\x46\x18\x94\xea\x4e\xd3\x40\xb8\x37\x59\xd4\x73\x0a\xb7\x92\x3f\x5f\x3e\xbb\x2b\x5c\x7b\x87\x9b\xd2\xcc\x34\x35\x75\x71\x2f\x83\x3e\x7b\x6c\x90\xcb\x1c\xbb\x1c\x3a\x66\x0a\xe0\xe0\x63\x6f\x9e\xf2\x08\xfa\x1d\xf1\x4a\xf7\x5d\x2c\xda\x5d\x0f\xed\xee\x0b\xde\x51\xfa\xf1\x45\xce\x36\x71\x73\x84\x31\xbb\xf7\x32\xef\x42\xcd\xa7\x40\x1c\x5c\x03\x95\x8c\x0a\x44\xad\x97\x46\x74\x98\x89\x19\xd7\xaf\x5e\xd5\x8a\x58\xef\xae\x10\x32\xc4\x1d\x3b\xda\xe8\x17\x68\xec\xca\xce\x87\xea\xda\x41\x1c\xfc\x39\x64\xa6\x70\x4b\x1a\xf3\x4e\x36\xbc\xd1\x43\xf5\xc6\x6e\xae\x8a\x61\xbf\xc4\x4f\xb2\x20\xba\x83\x69\x41\xa6\x7a\x3d\x86\x7a\x60\x0b\xea\x41\x00\xe0\xe0\xcf\xe1\xb1\xa9\xcb\xdb\x94\x21\x0b\xba\x50\x23\xb2\x15\xb7\xd2\xd1\xca\x27\xe2\x28\x09\x94\x9a\x1a\x17\x48\x2c\xf8\xd4\x78\x6c\xd7\xed\x11\x1a\x00\x71\xd0\x3c\x00\x30\xc2\xa0\x75\xc7\x69\x1a\x98\xab\xa8\xc1\xb5\x25\xa6\x65\xbd\xeb\x4a\xf3\xc6\x51\xb8\x32\x68\xfd\x47\x0f\x03\x6a\x02\xfd\x92\xf5\x75\x3e\xee\x27\x5e\x01\xd0\x2e\x3b\x88\x83\x8f\x3d\x10\xe3\xeb\x83\x4f\x05\x9f\x7a\x77\xa4\xb9\xc8\x87\x03\x27\x77\x94\x06\xe3\xba\x6a\x8a\x99\x89\xb6\x7f\x55\x78\x2d\xc7\xc4\xdc\x41\xc4\x05\x71\x48\xa7\x83\x3c\xcb\x4d\x26\x22\xe3\x95\xd4\x4b\xa6\xb3\x0a\x5c\xdb\x24\x12\xd2\x96\x38\x23\x73\xd6\x55\x3e\x99\x0a\x77\xf8\xb2\x38\x40\x06\x1b\xc4\xc1\x9f\xc3\x4d\xd9\x9c\xb9\xbd\x0f\x09\x93\xf9\xe7\x84\x24\xec\x30\x37\x9c\x88\x1f\x4c\xdb\x48\x0a\x10\xc6\xf1\x96\xd2\x5e\x2d\xe4\x68\x7d\x03\xf5\x8b\x00\x70\xf0\xe7\x60\x50\x7e\xb3\x43\x4a\xc8\x6b\xdb\x91\xbc\x9d\xd1\xe3\x21\x95\xae\xce\xb2\x20\xa6\xd6\x54\x90\xfe\x58\x92\xfe\x6b\x61\x95\x66\x2c\x84\x06\x40\x1c\x34\x0f\x00\x8c\x30\xc8\x44\x9d\x6e\x84\x37\x15\x3f\xea\xbe\x29\xee\xb2\x4c\xa7\xe5\xde\x88\xd5\x21\x52\x32\x2a\x32\x6a\xa3\x68\x6c\x1a\x44\x23\xbb\xf2\xfb\xcd\x97\x14\x47\x84\xa9\x04\x71\xc8\x46\x98\xc4\xb5\xce\x64\x87\x98\x26\xf9\xe6\x6e\x0f\x83\x6d\x66\x89\xa9\x76\x51\xec\x4f\xf9\x0f\xb8\x6f\x73\x99\xb5\xef\x74\x67\xb8\x40\x16\x1b\xc4\x21\x1b\xe1\xd4\x2b\xfd\xb3\x14\x7d\xcb\xd8\x8c\x57\x19\xc9\xf1\xea\xa2\xdb\xaf\x5a\xa2\x35\x2e\x05\x31\x25\x3c\xaa\xf4\x45\x1d\xfa\x9c\x7d\x1e\x11\x19\xc4\x21\xf7\xa3\xfe\x5f\x77\x8d\xc6\x61\xc0\xef\x35\xc6\x2b\x90\x4a\x66\xeb\xce\x2f\xb9\xd9\x8c\xf7\x5a\xa3\x78\xf4\x0e\xee\xb1\xed\x40\xd2\x5b\xd1\x70\x57\xc5\xe4\xbf\x8d\xf0\xbc\x0a\x6a\x56\x6d\x01\xaa\x4b\xef\x8e\x79\x77\x66\xb3\x1d\x75\x92\xec\xa5\x84\xf4\xcf\xf4\x96\xbb\xb8\x64\xf5\x55\x8c\xe3\x5f\xfe\x42\x25\xa3\xc2\xf5\x85\x17\x14\x9d\xcc\x1e\x6c\xba\x11\x5f\x78\x50\x5b\x72\xe5\x25\x9f\x16\x4b\xf6\x2f\x3d\xb3\x4f\xae\x0f\x73\x4a\x4d\xfe\x6b\x46\x18\x34\xb4\xbf\x6b\x84\x91\x8c\xf0\x9c\x62\x6f\x3c\x61\x1f\xf9\x09\xd3\xcf\x01\xfd\x63\xfc\x6e\x76\xe9\xac\x35\x6c\x4b\xa2\xd4\xeb\x42\x25\x5a\x76\x9a\xae\x57\x9e\x9f\xc9\x66\xa5\x10\x92\x47\x23\xb6\xae\x7b\xf9\xb8\x95\x62\xf9\xe1\x8f\xcb\x1d\x0a\x98\x0b\x4f\x97\xa7\x55\x24\x27\x9f\x1a\xf0\x09\xb8\x50\xe0\x55\x6e\x6c\xe1\x9d\xc9\xd6\x2c\xb2\x11\x7e\x37\x39\x21\x45\xd0\xc1\xcd\x11\x73\xb3\x3c\x55\xea\x26\x4f\x39\x85\xc9\x85\xf8\xd1\x55\xed\xbc\xfe\x5b\x86\x61\xeb\xcd\xfb\x5f\xcf\x64\xb4\xc6\x48\x7f\x76\x66\x9f\xed\xf7\xcc\xa7\x74\xe2\x68\xae\x77\xae\x86\x6a\x4c\xd9\x59\x66\xb7\x96\x0b\x79\x6f\x79\x85\x33\x5d\xff\x40\xeb\x69\x50\x75\x26\xa3\x45\x36\xc2\x54\xad\x07\xfd\xb6\x97\x02\xc7\xb9\x32\x7d\x37\xd4\x98\x27\xd8\x3b\x22\x68\x45\x2a\xa5\xae\x79\x4d\x96\x16\xb8\xab\x07\xd2\xed\x9c\x99\x11\x06\x89\xe8\xd4\x96\xc1\xbf\x89\x77\x4d\xf9\x6e\xe5\xa2\xee\x52\x6f\x5e\xc3\x2b\x1e\x51\xfd\x89\xf1\xb5\x35\xad\x64\xac\x16\x9b\x69\x5f\xbf\xc5\x1d\xba\x2f\x04\xc4\xc1\x67\x7c\xf2\x2d\x01\x1d\x8d\x14\xae\x5d\x81\x63\x41\x21\x7e\x83\x54\x75\xcb\x45\x5b\xfa\x16\xab\xd9\x83\xf4\x75\x34\x87\xcb\x28\xd6\xd0\x85\x9c\x20\x0e\x9e\xf9\x5a\x04\xbe\xff\x30\xca\xba\xb6\x6c\xc3\x37\xc9\xb5\xe4\xfc\x65\xc5\x6a\x43\x53\x30\xc6\x06\xef\x92\x6f\x2d\xcb\x6f\x6a\x33\x3b\x68\x55\x05\xe2\xe0\xcf\xc1\xe0\x46\xe5\x79\x46\x43\x2f\x34\xb5\xcd\x8b\x1b\x55\xea\xb7\x32\xfc\x29\x7a\x66\x7e\x9d\x5f\x4e\x7f\x46\xb7\x50\x5a\x87\x52\x07\x7d\x0a\x07\x71\xf0\xfb\x1d\x6e\xc4\x5d\x9a\x32\xa4\x7e\x20\xf1\xee\xe3\x8a\x21\xef\x73\x5a\x53\x61\xd9\x07\xef\x7c\x92\x43\x06\x50\x1e\x79\x34\xe4\x72\xee\xe0\x21\x8c\x30\x88\x83\x6a\x84\xff\xdd\x08\x83\x5e\xe8\xd3\x24\x10\xfb\x74\x6b\x08\x1f\x65\xa8\x63\xa5\xec\x30\x2b\xe8\x2e\xb5\x61\x8f\xc9\xe3\xc0\x36\xbd\x50\x66\x73\x21\x61\xf4\x5d\x69\x03\xe8\xca\x67\x10\x07\x97\x00\x7d\xaa\xcf\x8d\x17\x8f\x6a\x39\x2e\xa7\xa3\xfe\x49\xb1\x7a\x8e\xa3\xe8\x88\x46\xd6\x13\xfe\xc9\x7b\x85\x3b\xf6\xcf\x45\x94\xf3\x2c\x88\xb8\x20\x0e\xa9\x4c\x5c\x79\xee\xcf\xed\x27\x3e\x16\x55\x7e\xee\xcc\x95\x7a\xab\xcf\xd0\x3b\xe7\x5b\xa6\xde\xa9\xdc\xec\xa6\x56\xf5\x78\x3a\x50\x54\x09\x95\x89\x03\x38\xf8\x73\xb8\x9d\x78\xf3\x71\xe7\x87\x88\xf3\xa4\xf1\x77\xb8\xb5\x0f\x92\xb3\x13\x2b\x7c\x76\x2e\x1f\xdd\x97\x6b\x12\xea\x11\x1a\x95\x9d\x87\xee\x27\x06\x71\x70\x09\x64\x0c\xd6\x9b\x85\x27\x2a\xd1\xaf\x04\x5f\xf8\x51\x1d\x28\x9c\x2e\x4e\x7b\xfb\xb3\xfa\x79\x1c\xac\x3b\xba\xd1\xa6\xee\x2c\xf2\xd0\xb1\x58\x10\x07\xd5\x06\x0a\xfd\xfb\x02\x18\x34\xbb\x9e\xa6\x81\x43\x7f\x91\x50\x95\xf3\xf4\x2c\x26\xf1\x4f\xce\x4f\x2f\x7d\xbd\x7c\xd3\x6f\xda\x41\x4f\x42\xb7\x2e\x86\xec\x73\x5a\x9e\x81\x1a\xb4\x00\x06\x71\x48\xb5\x81\x24\xfc\x2b\x69\x3b\x61\x73\x83\x2e\xfa\x89\x7a\xd3\x45\x4d\xf6\x46\xf8\x5f\x0f\xb0\x73\x55\xef\xba\x4a\x9b\xcb\x19\xbf\x87\x8e\x9b\x83\x38\xb8\x06\x38\xb1\x34\x59\x16\x96\xdc\x1e\x11\xe0\x28\xdc\x41\xff\x75\x80\x93\x27\x57\xc4\xfb\x11\x47\xb6\x12\xf7\x7e\xef\x10\x96\xff\x34\x2a\x22\x2e\x88\x83\x3f\x07\xb2\x6d\xab\x1b\xe9\x53\x05\xfe\xd9\xc1\xb6\x16\x24\x93\x36\xf5\x93\x3d\x55\xa9\xa2\xc3\x1d\xb7\xa5\x7e\xff\xfc\x71\x49\x53\xfb\x1d\x54\x1b\x08\xe0\xe0\x1a\xb8\x6c\xa2\x75\x95\x86\x88\x6b\x32\xbc\x81\x3c\x4c\x53\x96\x0c\xcd\x81\xb3\x72\xbb\x08\xeb\xa4\x5a\x99\xd5\x3e\x83\x3b\x46\xe0\x2a\x42\x03\x20\x0e\xaa\x0d\x04\x18\x61\x50\xaa\x3b\x4d\x03\x64\x24\x0f\xb7\x88\x70\x7f\x63\x30\x63\x3b\x5b\xb9\x14\xf2\xa0\x8f\xde\x6f\x2f\xbf\x49\xaa\x5c\xc1\x81\x72\x3c\xd7\x8a\x53\x7d\x19\x1a\x3b\x80\x83\x6b\x80\xeb\x1a\xfe\x0f\x16\x52\x42\x23\x2a\x74\x72\x0e\x6a\x36\xb5\x76\xfe\x5b\x79\x69\x69\xd4\x0b\x16\x06\x0f\xa5\xef\xdf\xdc\xb9\x02\x99\x0a\x10\x07\xd7\x00\xaa\x9d\xe8\x15\xec\xb8\x25\x66\xe1\xcb\x23\x79\xe2\x35\x7c\xc7\x79\x6e\xe2\x24\x2b\xf4\x63\x71\x1f\x59\xbf\x27\x2c\xa5\x37\x8f\x40\x1f\xda\x00\x1c\xfc\x39\x6c\xf8\x4a\xe9\xea\x87\xfb\x51\xbb\xdb\x2e\xa3\xdc\x72\x5e\x10\x59\xa3\x51\x44\xc3\xed\xb0\xfa\xa8\x97\x7d\xa8\x3d\xe4\x29\x06\xbd\x0b\x20\x0e\xae\x81\xeb\x2e\x2e\xcd\xd5\xc1\xba\x84\xfb\x84\x8e\xae\xd8\x8f\x09\x3f\xa7\x1b\x6c\xb4\x11\x76\xd0\x33\xd8\xed\xde\x73\x17\x7f\x73\xeb\x3b\x42\x03\x20\x0e\x9a\x07\x8c\xff\x5d\x03\xa0\x75\xc7\x69\x1a\x78\x11\x4a\x5d\xdb\x67\x2c\x3b\x86\x3d\xbd\xb9\xfb\x3e\x04\x33\xb8\xf6\xe2\x94\x0a\x7e\xa2\xaf\xe8\xa6\xc2\x49\xfe\xb7\xcf\x3e\x35\x88\xb1\x83\x38\xb8\x06\xbe\xc6\x34\xb4\xfe\xca\xd2\xc5\xe0\x26\x78\x46\x98\xa7\xed\xde\x3d\xf5\x79\xc4\x6f\xb4\xd6\x5d\x7a\xad\x92\xba\xcf\x9d\x7b\x09\xfa\xce\x0c\xe2\xe0\x1a\xc0\xf8\xae\xea\x10\xcf\xc3\x1d\x22\x86\x62\xc5\x3f\x1e\x1f\xfe\x03\x8b\x89\x4a\xa8\x27\x9c\x59\x39\xb9\xa2\x77\x93\x9b\xde\x33\x0c\x11\x17\xc4\xc1\x9f\x43\xd6\xf7\x57\x94\xe2\x41\xfb\x43\x74\x22\x8f\x05\xdf\x86\xa3\x73\x73\x87\x07\xcb\xc7\x2a\x0a\x95\xbd\x98\xe8\x5b\x1d\x55\xf6\x83\x6e\x69\x04\x71\x70\x0d\x38\xa4\xfb\xc7\x17\x7b\xa2\x09\x1d\x46\xd0\x3f\xef\x4a\xbb\x38\xd1\x92\x88\xd9\xd4\xf1\xcb\xd7\x24\xd9\xcf\xd4\xae\x52\xe6\xc5\x00\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\x64\xa2\x4e\x37\xc2\x14\xdd\x17\xf4\x42\x3f\xce\x34\xde\xce\xd0\x53\x6e\xbe\xe8\xff\xbe\x4d\x8a\x27\x9e\xe5\x73\x1b\xee\x42\xd3\xe7\x77\x9f\x28\x27\x5a\x10\xa6\x12\xc4\x21\x1b\xe1\xb2\xd2\x27\x36\x27\x4d\x53\x46\x83\xb5\x5c\x5f\x16\x64\x3a\xe3\x9e\xe6\xcf\x79\x65\xaa\x99\x79\x7e\x37\xca\x64\xaf\x1b\xcf\x39\x42\x44\x06\x71\xc8\x46\x78\x9c\x48\x64\xe3\x85\x23\xc9\xb8\xbc\x1e\xfb\xbc\xcd\x6d\x47\xb2\x92\xc9\xaf\xa8\x44\xf6\x7c\xbb\x78\x3d\xe8\xbc\x42\x18\xdd\xbc\x88\xc8\x20\x2e\x58\x19\x85\xe1\x9f\x91\x4d\x70\x17\x0d\x27\x8f\x5c\x0c\x9d\x7f\xc8\xf6\x60\x45\xfe\x7a\x92\x3d\xd8\xea\xe2\x95\xdd\xcc\xe7\xa6\x9e\x81\xe3\xe4\x99\x2b\x03\x19\x61\x9e\x07\x26\xd1\x9e\xd6\xf2\xe3\xbc\x5d\x0f\xc9\x97\x2e\x5f\xa9\x21\x0b\x5c\xa8\x90\xa1\xef\x3e\x57\x9a\x70\xa3\x93\x4a\x6b\x83\xef\x6f\x23\xdc\x84\xf9\x3b\x43\x6c\x54\xb9\xa0\x78\x83\x9f\xe5\x6a\xe0\xd6\x8f\x1e\x27\xce\x04\xe2\xf8\xd0\xfc\xc0\xe9\x70\x43\x96\x3e\xea\xbf\x0d\x9f\xfd\x16\xff\xef\xbe\x6f\x2b\x91\xfb\x98\x7d\x5d\xdb\xf2\x37\x94\xdb\xc7\xec\xc3\x84\x08\x26\xfc\xe8\x93\x8f\x5d\xea\xe6\x82\xd1\xff\x6b\x46\x18\x34\xb4\xbf\x6b\x84\x91\x8c\xf0\x72\x0c\x8b\xcb\xa1\x7a\x59\xdb\x07\x6f\x93\x8b\xce\xd6\x8d\xed\x73\x58\x1a\x69\x74\x9a\x9c\xaa\x12\x7d\x53\x1f\x0e\x7e\x2a\xcc\x9f\xc9\x66\x25\xb2\x11\x2e\xf0\x5e\x39\x48\xd9\x37\xda\x5d\xa1\x65\xfb\xb9\xe2\xab\x23\x48\x41\xfd\xdc\x7f\x65\xff\x3d\xb6\xf8\xf9\x68\x07\x15\x56\x1d\xbd\x33\xd9\x9a\x45\x36\xc2\xac\x6c\xb2\x18\x0b\x5a\x1c\x9d\x4d\x8e\x33\x6a\x51\x3b\xdf\xad\x74\x24\xe2\x85\xf7\x0d\xdc\xd2\xae\xc7\x59\xee\x37\x8f\x10\x9c\x89\x23\x95\x47\x36\xc2\x74\x31\x87\xc9\x47\xbf\x3c\x30\x51\x74\xd8\xb8\x59\xbd\xed\xea\xf1\x7f\xc5\x2d\x52\xe2\x99\x37\xe7\xbd\xac\x11\xdf\x89\xca\xbf\x7d\x26\xa3\x45\x36\xc2\x6d\x8e\x03\x56\x95\xae\x33\xe5\x4b\x1e\x5e\xcf\xb2\xb6\x15\x4d\xf7\x95\xba\x85\x6d\xf3\x4f\xbc\x6a\x0e\x59\xdf\x0b\xce\xd5\x19\x9c\x99\x11\x06\x89\xe8\xb4\xcc\xe7\x3e\xf9\x80\xbf\x01\xd5\x73\xe4\x77\x09\xd1\xce\x73\x45\x27\x9b\xe3\x4b\x5f\xba\xe4\x8f\xfa\x6d\x3c\x27\x9f\x8f\x9c\x63\xce\x84\x2e\xe4\x04\x71\xf0\xcc\xb7\x16\xe1\x40\x1a\xb6\xd2\x7e\xb7\xb8\x7f\x55\x06\xed\x67\xa8\x92\xb7\xce\xb7\x64\x55\x4c\xd9\xea\xfd\x9b\x1c\xfc\x97\x9e\xb2\x8b\x21\xe2\x82\x38\x78\xe6\x9b\x21\x52\xab\x91\x2d\xe4\xc8\x4f\x35\x79\x75\x62\xeb\x93\x99\x7d\x85\x54\x39\xf7\xf8\x48\xde\x5b\xe1\x9d\xba\x83\x76\x8f\xe8\x6d\xa8\x0d\x2d\x80\x43\xda\x0a\x4a\xe0\x8a\x7a\x5f\x72\xdb\xea\x31\x01\x99\xfc\xb5\x7b\xfb\xbb\xab\xf1\xdf\x9b\xeb\x33\xaf\xcb\x7e\x3f\x32\x90\xf5\x2f\x74\x87\x76\xb0\x41\x5c\xb0\x22\x8a\xfc\xdf\x71\xe7\x1f\x54\x37\xde\x7d\x6a\x34\xef\x5c\xce\x57\x48\xc0\xf1\x88\x2e\x60\xc5\x6b\xf5\x79\xae\x8d\x26\xf7\x4f\xff\x42\x0e\x2e\xd2\x5c\x84\x11\x06\x71\x50\x8d\xf0\xbf\x1b\x61\xd0\x0b\x7d\x9a\x04\x1c\xbb\xbf\x1f\x55\xf6\xa3\xb0\x58\x92\x0e\x51\x57\x5b\xa4\xaf\x38\x98\x36\xbf\x72\xb5\x4c\x1a\x67\x7c\xc5\x6b\x43\xa4\x25\x9a\x82\x18\x3a\x88\x43\x3a\x12\xc9\xac\xad\xd1\x74\x20\x49\xa7\x25\x4b\x46\xd3\x25\x62\x66\xde\x64\x45\xfa\xcc\x2c\x96\x22\x7f\x97\x6d\x98\xc8\x45\x91\xa6\x1b\x3a\x12\x09\xe0\xe0\x12\x38\xf8\x54\xfa\x67\xd8\xbe\x8d\xfd\x19\x0f\x81\x94\xf8\x58\xdd\x83\x2f\x7d\xad\x33\x46\x93\x61\x63\x0f\x1d\xba\xac\x16\x9b\x59\x7b\x11\x71\x41\x1c\xfc\x39\xc8\xc8\x5e\xd5\x65\xa1\x4b\xea\xa5\x89\x98\x95\x4f\x97\xc8\xf3\xfc\xee\x8b\xf1\xc3\xc0\x88\x57\x25\x62\x77\xd7\xa2\xc6\x49\x73\x02\x2a\x3f\x07\x70\x70\x09\x30\x4c\x55\xcf\xd3\x65\x3f\x89\x37\xd7\x97\x8c\xa2\x1e\xd8\x78\xbc\x7e\x3b\x8f\x2e\x97\x36\xb5\x30\xd2\x64\x75\x74\xba\x9e\xc3\x10\xb1\xf8\x01\x71\x50\x6d\x20\xc0\x08\x83\x66\xd7\xd3\x34\x80\x3d\xbf\x1e\x7f\x63\xbc\x93\x28\xe5\xe4\xe7\xb0\xd1\xc9\x35\x9a\x7b\xde\x99\x32\xd7\xb8\x2b\xb5\x3e\x86\xa5\xae\xf9\xa9\x6c\x42\xb7\x87\x81\x38\xa4\xa3\xd1\xd5\x0f\x24\xe8\xc9\x0f\x0a\xd0\xae\xbc\xa2\xea\x6d\xa9\xd7\x7b\x15\x21\x85\xc3\x5d\x5d\x15\x92\x9b\xff\xa7\xb7\xef\x27\xdb\xff\x1c\x8d\x06\x70\x48\xc7\xe3\x19\x06\x83\x3d\x17\xa9\x94\xc6\x4c\x0c\xb7\xce\x2d\x19\xa6\x62\x75\x7e\x33\x96\x3c\x79\xb4\xb7\x50\xbe\xb1\x71\x6f\xfb\x4f\x32\x74\x3c\x1e\xc0\xc1\x9f\x03\xc7\x8d\x86\x2b\x86\xd7\xb2\x82\xee\x73\x56\x7f\x49\x0f\x76\x7b\xc2\x33\x71\x38\xfa\xb5\xc9\x50\xbb\xaf\xf9\x9d\x79\x1e\x9f\x53\x35\x22\x2e\x88\x83\x6b\xe0\x42\x72\xa2\xf8\xed\x08\xd4\xdb\xf8\x46\x06\xac\xb3\x8b\x94\x1d\xf6\x46\x7a\x2a\x09\x38\x3e\xbd\xa1\xfa\x16\x0c\x9c\x92\xee\x38\x08\x0d\x80\x38\xa8\x36\x10\x60\x84\x41\xa9\xee\x34\x0d\x60\xca\x4d\x1b\xf9\xb4\xde\x7c\x54\x66\x26\x49\x55\x2d\x3e\x37\x72\x61\xeb\xb2\xff\x32\x89\x94\x81\xd1\x7d\xda\xca\xa4\x9d\xd7\xe4\x88\xb1\x83\x38\xb8\x06\xda\x9b\x6a\x1c\xe8\x4f\xa2\xe4\x56\x3f\xaf\xd2\xae\x34\xa5\x62\x76\xe5\x1c\xf8\x1d\x7c\x36\x13\x7f\x72\x0f\x5d\xfd\x31\xb5\xc1\x21\x22\x2e\x88\x83\x6b\x40\xbb\x9e\xe0\x45\xc0\x15\x0b\x0c\x0e\x8c\x96\x44\x94\x7b\x4f\xd6\xc6\x06\xc4\x4c\xb2\x09\xc2\x0f\x3e\x7e\xc9\xe3\x51\xef\xc5\x82\x3e\x88\x81\x38\xf8\x73\x70\x79\x5a\x83\xc9\xed\x21\xe3\x16\x47\x83\x1f\x5c\x6a\xdf\xff\x95\x3f\x8a\x42\xda\x87\xf2\xc9\xe6\x40\x48\x21\xfb\xfe\x5d\x09\xa8\x5d\x04\x88\x83\x6b\xe0\x44\x69\xf0\x53\x3d\x7e\xcf\x62\x53\x76\x51\xcb\x8f\x96\xa0\x73\x56\x4a\xfa\xfa\xe8\x56\xb2\xed\x39\x2d\xc5\x91\xdc\x25\xe6\x36\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\x34\x0d\x94\xa1\x06\xb4\xf8\x5b\xde\xdd\xf2\xfd\xd8\x15\x7e\x85\x9f\xa7\xf0\x31\x1b\xe9\x91\xd1\x1c\xcb\x49\x24\xa5\xef\x24\x86\xb1\x25\x74\x8a\x07\xc4\xc1\x35\x10\x83\x47\x14\x73\x97\x38\x35\xa4\xd7\xd3\x6e\xa9\x82\x24\xa6\xe1\x95\xea\x45\xc5\x1e\xf4\x4b\x3e\xec\xf9\x37\x1c\x7a\xa2\x7f\x28\x20\xe2\x82\x38\xa4\x1b\x04\xd8\x77\x58\x7f\xe1\xd9\x19\xc8\x69\xe9\xb4\x92\x4d\x54\xa5\xa2\xa6\xf0\xf9\xe3\x4d\x44\x61\x66\x96\x7c\x12\x30\x09\xb8\x04\x2d\x33\x40\x1c\xd2\x55\x62\xd3\x3c\xa8\xf4\x93\x45\x99\x56\x73\x14\x31\x8a\xd1\x41\x74\x47\x06\x8a\x22\x3f\x37\xd5\xbf\xfb\xba\xc6\xcf\x3a\xd7\x18\xda\x22\xe2\x82\x38\xb8\x06\x64\x94\x8d\x47\xfb\x07\xcc\x1f\x37\xca\x4b\x3e\x26\xb3\x4b\xf8\x82\xfe\xdc\x86\x52\xb7\x5b\x28\x27\x9c\x78\xe3\xb2\x74\x2b\x25\x17\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\x64\xa2\x4e\x37\xc2\xec\xee\x3c\xac\xb5\x95\x0f\xb6\xe6\xe4\x83\x18\x2a\x28\x3a\x08\x55\x18\xb3\xab\x22\x5f\xaa\x30\xd8\x5a\xeb\xca\x6a\xe0\x32\xc4\x20\x4c\x25\x88\x43\x36\xc2\xdb\x8a\x47\xd5\xf7\xf4\x2f\x9c\x1f\xc6\x1e\x6d\xc0\xab\x8f\xfd\x6d\xc7\x9e\x23\xfe\x86\x22\xe3\x49\xe1\xf6\x1f\xe1\x6c\xfd\x7d\x12\x44\x64\x10\x87\x6c\x84\x57\xa2\x4d\xfa\xf0\x0d\xf7\xfe\xb8\x6c\x5a\x5f\x7c\xf4\xa0\x13\xfd\xa7\x7f\x3e\xaa\xda\x9a\x9f\x68\xa4\x38\x99\x8e\xab\xcd\xb8\x20\x22\x32\x88\x43\xfe\xcd\xde\x34\xa5\xf1\x57\xc6\x0e\x8d\x18\x83\xfd\x54\xd6\x0b\xd4\xb9\xac\xfb\x48\x51\x9c\x3a\xc7\x8b\x2a\x8c\x8e\x7d\xaa\x45\xa8\x6d\x21\x23\xfc\xfc\xc2\xd7\x93\xa2\x4d\x1c\xf1\xeb\x97\x14\x53\xdb\x47\x9c\xe3\x59\x4c\x63\x23\x3e\x55\x7d\xd4\xbb\x55\xf5\x88\x8e\xf3\x87\x3b\xd7\xdf\x46\xd8\x25\x98\x54\x60\x39\x8f\xf7\x0a\xbf\xb8\x86\x93\xed\x73\xf3\x4b\x7e\x39\xe5\xb4\x05\x3f\xe7\xd5\x1f\xc9\xec\xa4\xa0\x15\x78\xfc\xe3\x06\xd9\x93\x10\xb6\x78\x69\x37\x5d\x7c\x62\x11\x4e\x9c\x1d\x07\xbd\xb9\x62\x32\x8f\xba\xbd\xfd\xb7\x81\xde\x7d\x0f\x57\xbf\xd0\x4e\xff\xd7\x8c\x30\x68\x68\x7f\xd7\x08\xab\xc1\xcd\xd2\x1d\xc6\x0f\xfe\x0b\xa9\xa8\x2b\xd7\x3f\x27\x0d\x12\xb0\xa9\x85\xde\xae\x08\xe6\x34\x7b\x1a\x12\xcd\xbe\x2d\xfd\x5e\xa2\x83\x73\xf5\x4c\x36\x2b\x91\x8d\x30\x4e\xff\x72\xc6\xdd\x8d\x19\x2d\xa2\x83\xc0\x86\xd6\x5a\xa5\x15\x1b\x69\xd7\xc3\xcd\xf0\xf4\x78\x3c\x89\x54\x33\x3d\xc7\xa4\x07\x67\xb2\x35\x2b\x8b\xf4\x67\x13\xa3\x65\x2e\x8b\xf5\xcc\xe9\xc5\xbd\x97\x5d\x20\xbc\x6d\xf9\xe7\x06\x4d\x1d\x65\x58\x86\xe3\x5e\xba\xf8\x9d\xc2\x7e\x29\x2d\x85\x33\x19\x2d\xb2\x11\x76\xee\x30\x6b\x1c\x33\x1c\x49\x89\x21\x4e\xe9\x1d\x20\xc9\x24\x68\x1c\x6d\x11\x0f\xb4\xeb\x1a\x6e\xa1\xbf\x41\xad\xd4\x1f\xcd\x73\x26\xa3\x75\x47\xfa\xb3\xf2\x06\x25\x9c\x92\x8f\xb0\x38\xc8\x8e\x4b\xbb\x64\x96\x29\xa4\x51\xd7\x6a\xc4\x47\x30\xe4\xfc\xaf\xeb\x1a\x32\xe6\xde\xbd\x8a\x73\x66\x46\x18\x24\xa2\xd3\x32\x9f\xfd\xb8\x38\xde\xdb\xf1\xdd\xcb\x0d\x0a\x1c\x82\x7d\x89\x3e\x03\xd8\x8d\xa8\x79\xef\xc2\x63\xa8\xdf\xfa\x0f\xb0\xbd\x64\x49\x83\x8a\x61\x40\x1c\x3c\xf3\x15\x6c\x1b\x0f\x1f\xca\x75\x04\xca\x8a\xa7\x71\xc7\x13\xd5\x59\xb6\x50\xbb\x95\xca\x53\x6d\x9c\xbb\xe0\xb3\x67\xd3\x9c\xf3\x19\x6a\xe9\x09\xe2\xe0\x99\xaf\x04\x7f\x20\xb4\xf8\x93\x72\x81\x94\xfe\x2e\x8f\x40\xd5\x67\x6a\x4a\x5f\x19\x86\x57\x84\x0b\x34\xda\xd1\xcd\xa2\x21\xc6\xd8\x9d\x88\xb8\x20\x2e\x58\x11\xed\x9f\xe7\xe1\xa4\x29\x6e\x9b\xf6\x7f\xa8\x99\xe8\xc0\x61\x49\x5e\x39\xcc\xa7\x90\x96\x1a\xf3\xb1\x7f\xf1\xb8\x17\x43\x59\x5d\x31\x26\xda\x1b\xca\xa8\x00\x0e\x1e\x57\x1c\x43\x9c\x2e\x33\x8b\x9f\xa9\x6b\xb0\x46\xf3\xaa\xcd\xaf\xab\x34\xa2\x31\x2f\xac\x1b\x04\xb7\xb7\x97\x3f\x70\x57\xb4\x6c\x43\xf7\x08\x83\x38\xa8\x46\x58\xed\x5f\x17\x3f\xa0\x17\xfa\x34\x09\x50\xfa\x2d\xb1\x3d\x43\xcf\x9c\x3b\x29\x32\x6e\xa0\x13\x91\x70\xd0\x54\xb3\xa1\x9b\xa4\xdb\xe8\x4a\x9a\xc2\x50\xcf\xbb\x3f\x67\x81\x18\x3a\x88\x43\xba\x41\xab\xc8\xf8\xc7\x1b\x23\xff\xc0\xf5\xd4\xfb\x8f\xe4\x33\xe8\x9d\xd4\x08\x86\x45\x4a\x16\x7f\x53\x48\x8d\xbe\x73\x9b\xd6\x55\xf3\x41\xc4\x05\x71\x70\x09\x50\xee\x76\x15\xba\xb4\x87\xb3\x07\x8e\x6a\x9b\xf9\x3e\x7f\xf8\xbc\x25\x1a\x7b\xe1\xbe\xe8\x68\xbb\xe7\xe6\x81\x49\xb6\xf1\x01\xd4\x84\x0b\xc4\xc1\xff\x55\xb6\x6f\xcc\xa9\x12\x47\xa9\xbd\x7e\x1b\x1b\x0b\x70\xe6\xb7\x9e\x23\x79\x6f\xbd\x12\x1d\xef\xe8\xdf\x6a\xc0\xbe\xa2\x54\xef\xb1\x83\x88\x0b\xe2\xe0\x71\x23\x56\x3d\xdf\xd4\xf2\xd0\xc4\x0c\x9b\xd7\x3e\xed\x53\xba\xdf\xfd\x36\x31\xbe\x50\x5a\xa5\x22\x45\x43\xc8\x47\xf5\x92\xff\x5a\x27\x62\xf1\x03\xe2\xa0\xda\x40\x80\x11\x06\xcd\xae\xa7\x69\xc0\xf2\xc5\xce\x9a\x42\x0b\xaa\xcf\xd6\x58\x3b\xd5\x04\x89\x8c\x7d\x61\xfc\x84\x7a\x57\x02\xfe\xfd\xfb\xad\xee\xac\x18\x4d\xda\xd0\x0e\x2b\x88\x83\x6b\x60\xf3\xbd\xb6\xa9\x2e\x8f\xc0\xcf\xb9\xf4\xc1\x51\x45\x9d\x2e\xa7\xb1\x30\xca\xa7\x75\x36\xd3\x61\xc3\x6e\xa2\x44\xbf\xa9\xca\x79\x10\x71\x41\x1c\x52\x93\x9c\xf4\xd5\xad\x99\xd6\x6c\xfe\xe2\xea\x60\xdf\xe2\x9e\x76\x1f\x83\xd0\x1f\x36\xce\x2b\x9c\x4f\xfc\xdd\x1f\x99\x27\xa8\x14\x6e\x43\x4d\x72\x00\x1c\xfc\x7f\x55\x86\xcd\x29\x98\x79\x9d\x00\xfd\x93\x7f\x52\xbc\x31\x4f\xda\x68\x59\x6b\xff\x9d\x71\x42\xdb\x84\xaa\x1c\x0d\x94\xed\x7a\xc9\x26\xc8\x08\x00\x38\x78\xdc\x9b\x26\x6b\xbb\xf1\x66\xe8\x6f\xed\x39\x39\xc8\xa4\xb7\xc8\xa7\x5b\xb5\xc5\xbe\x2f\xd5\xb7\xcc\xe0\x85\x17\x2c\xd1\x7e\xe1\xe8\x46\x68\x00\xc4\x41\xb5\x81\xb2\xff\xae\x01\x50\xaa\x3b\x4d\x03\x29\xfc\xee\x7a\x59\xc6\x22\xe9\xa8\xe9\x61\xe9\xa1\x8b\x95\x1c\xaf\x43\x48\x8f\xc2\x3a\x55\x3e\x1c\xc4\x97\x5d\xbb\x32\xf7\xf0\x16\x62\xec\x20\x0e\xae\x01\x51\xbf\xc9\xb4\xa8\x8d\x8f\x3e\x4f\x6c\x23\x9a\x89\x2e\x5b\xa2\x1f\x25\xdd\x08\xd9\xb6\x29\x7b\x7e\xdd\x59\x4b\xd4\x44\xac\x09\xda\xb9\x05\x71\x70\x0d\x4c\x59\x52\x95\xd8\x0c\xc6\x7c\x5f\x0d\x4b\x0d\x11\x54\xe7\x5f\x7c\x1c\x4c\xa1\x28\x4c\xd2\xf7\xd5\xf4\x97\x59\xd7\xbe\x1c\x11\xd4\xdb\x00\xc4\xc1\xff\x57\x14\x2e\xd7\x4b\x3f\xf1\xed\xdb\x37\x57\x68\xac\x8e\xd6\x14\x28\xbc\x35\x5e\x75\xee\x7b\xcd\x61\xb1\xbd\x55\x83\xf9\x4c\xf5\x25\xd4\x45\x1f\xc4\xc1\xe3\xbe\x43\x65\x4b\x1c\xd7\xee\xee\x7b\x45\x1c\xb7\xb5\xe7\xa1\x3c\xa6\xe8\x25\x42\x10\xfb\x7a\x58\x89\x48\x7b\xd1\x53\xdf\x7c\x00\xba\x42\x0b\xc4\x41\xf3\x00\xc0\x08\x83\xd6\x1d\xa7\x69\x80\x4f\x99\x2f\x41\x41\x3e\x57\xbb\xcd\xf1\x4b\xee\x85\xf5\x59\x6a\xf4\xe9\x68\xf4\xef\x64\x66\x5d\x96\x64\xb2\x7a\x3e\x66\xf2\xd0\x77\x66\x10\x87\x74\x24\x98\x40\xb0\x98\x51\xb4\xb3\x16\x05\x15\xdf\x33\xd1\x23\x4e\xeb\xe2\xf9\x30\xc9\x92\x13\x79\x26\x7d\x32\xfc\x84\xf2\xab\x26\xd0\xce\x2d\x88\x83\x6b\xc0\xc9\x6e\xc8\xa5\x10\xeb\xad\x9b\x1b\xdd\xe5\x8e\xe3\x91\x5d\x13\x31\x99\xf5\x6b\x04\x46\x61\x05\x06\x14\xd3\x64\x98\xe4\xf1\x52\x50\x59\x0f\x80\x83\xff\xaf\x3a\x1f\x2d\xf8\x6d\xde\x21\xec\x5f\xd8\x6c\x96\xe9\xd1\x59\x9a\x97\xc1\xe6\x64\xef\x5a\xe2\xb2\x7e\x64\x67\x99\xc7\x5f\x16\x1d\x8d\x88\x0b\xe2\xe0\x71\x6d\x28\xb1\x04\x49\x9a\xf7\x6a\x4a\xda\xe8\x72\xef\x99\x96\x27\x5a\xe2\x72\x59\x7c\x8f\x63\xd1\xe4\xa7\xd0\xcf\x3f\xca\x90\x79\x8c\xd0\x00\x88\x83\xe6\x01\xf7\x7f\x37\xc2\x20\x13\x75\xba\x11\xd6\xe9\xca\x19\x10\x44\xd3\xb7\x7a\xe3\x36\x98\x7a\xf8\xe3\xcb\x3b\xb2\x55\x8f\x27\x76\x09\x81\x5b\xae\x18\xb8\x52\xa1\x76\x85\xd0\x01\x66\x10\x87\x6c\x2a\xfb\x25\xf7\x24\xd7\xaf\x05\x24\x54\x6f\x2b\x54\x4a\xb1\x92\x04\xc9\x5e\x30\x8b\x96\xfb\xd9\x7c\x33\xf3\xd3\x4f\xe5\x4e\xdf\xf9\x31\x44\x64\x10\x77\x4a\x8d\x30\x2d\xc1\x83\x72\x9a\x35\x83\x4f\x2f\x0c\xf3\x2d\x34\x63\xc6\x3a\x02\x2e\x3c\x1a\x24\x41\x7b\xad\x5e\xcd\x5f\xe8\xd1\x7f\x65\x17\xaa\x11\x06\x70\xc1\xca\x28\x28\xff\x7c\x27\xfe\xd7\xf7\x08\x0b\xc4\x33\x39\xaf\x59\x93\x54\xbe\xbc\x41\xbc\x62\xcc\xfe\xb2\x3c\xa6\x20\x94\x38\xd0\x99\x86\xe8\x24\x83\x8f\xbd\xb1\xcd\x79\xe3\x6f\x23\x7c\x45\xa8\xcd\x27\x8a\x44\xe8\x62\xc3\x1f\x5b\x02\xd6\xcd\x5e\x52\xf9\xd1\xd1\xbb\x2c\xd8\x11\xc6\x62\xea\x65\xdb\xd6\x54\x2c\xe9\x7f\xa1\xeb\xa4\x3a\x2d\x27\x5e\xb8\x69\x61\x22\x25\x64\x3b\x76\x85\x25\x6d\x21\x0c\x15\x68\xef\x86\xeb\x93\x86\xef\x19\xf7\xbf\x8a\x9f\xfc\xaf\x19\x61\xd0\xd0\xfe\xae\x11\x46\x32\xc2\x9b\x53\xf2\x89\x62\xfa\xc9\xac\x77\x1f\xfd\xb2\xf8\x61\x32\x24\xcd\x4f\x9d\xcf\x21\xf2\x47\xfc\x77\xf8\x6a\x90\xa0\xbf\x60\x29\xd9\x99\x6c\x56\x22\x1b\xe1\xd7\xbd\xfc\x1a\x99\x07\x2a\xf3\x57\x38\xb8\x6f\xd4\x90\xa7\x91\x26\x74\xac\xfe\xd0\xe7\x0b\xe0\x40\x41\xdb\xb2\x27\xc4\x0e\x54\x3f\x93\xad\x59\x64\x23\xac\xa0\xaa\x50\xfa\xad\xb6\x06\x73\xfa\xa1\xe4\xcd\x2c\xff\x54\x85\x0d\xcb\x66\xe2\xcb\x3d\xf8\x34\x77\xbd\x64\xdf\x7a\xa1\xee\xc4\x9f\xc9\x68\x91\x8d\xf0\xab\x6c\xa9\x6c\x1a\x4a\x23\xd5\xa1\xd7\xdf\xe5\xe9\x3f\xce\xe8\x9b\xf8\x1f\x4d\xbe\xee\xa8\x9f\x79\x73\x3c\x3d\x24\xc6\x35\x64\x76\x26\xa3\x45\x36\xc2\x6b\xdf\xdc\xba\x03\x55\x9b\x65\xb3\xb5\xec\x79\xa6\x7d\x4f\xfa\x6a\x04\xde\x92\x2d\xc7\xa0\x8c\x55\x33\xf6\x6e\x61\x52\x60\x9c\xdd\xf5\x49\x20\x11\x9d\x96\xf9\x50\x6b\x75\xdf\xf8\x99\x84\x45\x45\x65\x07\x65\x2a\x52\x04\xcb\xe1\x3d\x22\x45\xb5\x9f\xb2\x5f\x11\xbd\x51\xa7\x76\x92\x54\x0f\xdd\x74\x0f\xe2\xe0\x99\xaf\x29\x64\xef\xe8\xa2\xa1\x4e\x22\x0e\xc5\xab\xc1\x37\x82\xa1\x58\x6b\x7c\x34\x2e\x95\xac\x5c\x32\xa4\x33\x15\x57\x48\x63\xad\x24\x10\x71\x41\x1c\xd2\x36\x00\x7d\xce\x35\x3c\x73\xb1\x4f\x8a\x73\xf7\xec\xe9\x7f\x07\x64\x84\x2b\x3c\xd0\xf9\xf1\xb9\x67\xf9\xb6\xf4\x8c\xe1\x78\x05\xf3\x2f\x68\x1b\x00\xc0\xc1\x33\xd4\xc1\xe1\x05\xcd\x21\x36\x6d\xb4\xd2\x4d\x4d\xbe\x82\x1f\xb2\x44\x61\x1d\x5f\x5f\x4f\x8d\x39\xbc\xf4\x1c\x68\xe7\x75\x7a\x16\x52\x0a\x6d\x33\x02\xb8\x60\x45\xf9\x7f\xc4\x45\x93\xbc\xb1\xab\x3c\xb0\x9c\xf8\x2d\xf7\xe4\xea\xa5\x6b\xcc\x7c\x5d\x2b\x33\xc5\xb4\xc9\x1c\x1b\x15\x74\xdf\x99\x16\x71\x73\x1e\x22\x8c\x30\x88\x83\x6a\x84\xff\xdd\x08\x83\x5e\xe8\xd3\x24\x70\x5f\xe1\x5e\xfc\xdd\x1b\x58\xe5\x4b\xc1\x98\x9f\x35\x14\x88\x9e\xfc\x70\xb3\xb4\x18\x31\xc6\xa7\xf7\xa7\x30\xf8\x93\x30\x30\x02\x7d\x55\x07\x71\x70\x09\xc4\x3e\xb2\xb6\x79\x37\xbe\xf9\x76\x50\xe7\xe6\xfd\x82\x8b\x47\x77\xcf\x4f\xd7\x07\x2c\x93\xb1\x67\xd6\x47\xff\xb2\x2e\x2a\xf9\x05\x1d\x89\x04\x71\x70\x09\x60\x3a\xf5\x50\x36\x31\x85\xd1\xd6\xd4\xdd\x58\xce\x72\x2f\x16\xa7\x24\x9f\xba\x36\xc9\x8c\x4f\x44\x52\x4b\x22\xd3\xea\x1e\x42\x0d\xed\x5c\x01\x38\xb8\x04\x2a\x12\xb9\x0c\xda\xbe\xa9\x87\x92\xee\x48\xfc\x4a\x57\xe2\x47\x6b\x1e\xdd\xa8\xf2\x6e\xf1\xd1\x59\xc5\xa4\xd5\xb0\x79\x5f\xb3\x0e\x35\x3a\x07\x70\x70\x09\x44\x05\xb0\xd9\xfa\x3d\xc7\x12\x64\xc2\x27\x68\xb9\x3c\xb5\xa5\xd7\x6d\x39\x55\xd9\x9c\xc3\x27\x1c\xa1\xae\x46\x67\xa9\x41\x20\x84\x58\xfc\x80\x38\xa8\x36\x10\x60\x84\x41\xb3\xeb\xa9\xd7\xa6\xc8\x5f\xfd\x90\x81\x5e\xdb\xa9\xd2\xf9\x76\xc3\x4e\x67\xb0\x75\x48\x5b\x98\xb0\xb7\xad\xc1\xa4\x41\xa8\xa1\xb9\x26\x89\x12\x6a\x15\x00\xe2\x90\xee\x0f\xb5\x66\x28\x29\x9c\xc6\x18\xb0\x9e\x6a\xf0\x5f\xfe\x86\x37\xef\xbd\xb7\xcc\x7c\x67\x23\xe3\xfd\xed\x95\xdb\x3b\x14\xfe\xcf\x20\xc3\x0a\xe2\xe0\x1a\xb0\xad\xf1\x2f\xe3\xda\x8e\xd7\xf7\xb5\x28\x4b\xbd\x4a\xf9\x88\x5a\xd3\x5a\xc6\xc7\x61\xe7\xe6\x37\x86\x3d\x4e\x2a\x8c\x82\x24\x27\xe8\xa3\x05\x80\x83\x6b\xe0\x44\xbe\xc2\xc3\x2f\x06\x9b\x21\xee\x7a\x92\x32\xb6\xc1\xd1\x6d\x2e\x49\xe9\xef\x2f\xc6\xc7\xad\xca\x0a\xf6\x53\xe4\xee\xaa\x42\x15\x1d\x20\x0e\xae\x81\x32\x17\x96\xe9\xeb\x92\x93\xab\xa1\x8f\x68\xd2\x67\x17\x85\x17\x1c\xcb\x87\xb5\x32\x69\xa6\x8d\x66\xe9\x23\x89\x43\x45\x5a\xa0\x3a\x71\x10\x07\xd5\x06\x02\x8c\x30\x28\xd5\x9d\xda\x3d\xbe\x3f\x7d\xc2\x8d\x53\xaf\xc3\x99\xbb\x16\x27\x3e\xa6\x1c\x4b\x53\x34\x78\x47\xcb\x4c\x54\x74\x12\xed\x5c\xeb\x58\xe4\x28\x74\x85\x16\x88\x83\x6b\xe0\x9b\xdc\x96\xd4\x27\xb7\xd1\x11\x23\x77\xfa\x01\xf1\x44\x6f\xca\xdb\x1e\x23\x3f\xc9\x85\xf7\x69\xde\xa4\xf3\x10\x63\x0c\xcf\x43\x29\x06\xc4\xc1\x35\xc0\xf0\x48\xad\x6f\x6d\xe1\x52\x70\x04\xe5\xc5\x7c\xed\x02\xa7\x48\x0e\xb2\xf2\xa1\xfe\xdb\x34\xbe\x6c\xac\x19\xc7\x0c\xa1\xd9\x50\x2a\x00\x71\x70\x0d\xb8\xc7\x06\xdf\x19\x8e\xc6\xc7\x16\x16\xce\x21\xe6\x08\x5e\x92\x7e\xd8\x76\x44\x6a\x1c\x36\x6c\x99\x75\x6d\x46\x80\x53\x90\x0c\xaa\x92\x01\x71\x70\x0d\xe4\xe0\x95\xa5\x5f\x0b\xd9\x7b\xde\x18\x21\xb2\xd3\x8d\x5f\xa0\x74\xc5\xfe\x3b\xf7\xa6\xec\x46\xe0\x89\xa4\x05\x9a\x0f\xa9\xb2\x1e\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\x4d\x03\x97\x6b\xca\x79\xd0\x28\xb4\xdb\x1d\x53\xda\xc8\x8e\x30\x43\x93\x48\xef\x9c\x0b\x18\x55\x38\xd7\xab\xee\x63\xf3\xdc\x91\x13\x5d\x09\x31\x76\x10\x07\xd7\xc0\x2f\x35\x25\x37\x6a\xf6\x55\xd2\x44\xab\x41\xbe\x99\xd0\x62\x1f\x81\x77\x76\x71\x18\xdd\x84\x66\x2f\x76\xfb\x6b\x46\xe4\x9c\xa1\x1d\x61\x10\x07\xd7\x40\x1f\xab\x57\xfa\x27\xdc\xc6\xc6\x36\x31\x63\x59\x8f\xdf\xfc\x66\xcc\xb9\x2f\xc2\xd4\x8a\xdc\xad\x47\xff\x70\x45\xc5\xb1\x5a\x40\x37\x08\x80\x38\xb8\x06\x6e\x69\x53\x0b\x6a\x9a\x08\xf2\x85\xe3\x48\x1f\xbd\xe5\xaa\xb1\xa2\x34\xde\xb5\xdd\xf1\x0d\x6c\x6c\xbb\xbd\xeb\x54\x9c\xa6\x0d\x3d\x07\x10\x07\xd7\x80\x86\x1a\x23\x96\x86\x58\x64\x03\x7b\x3a\xd6\x51\xb2\xb9\xfb\xd8\x60\x17\x8f\x9b\x5c\x54\xe5\x82\x3e\xf3\x01\x21\xfa\x16\x0a\xd4\x35\x1a\xc4\x41\xf3\x00\xc0\x08\x83\x4c\xd4\xe9\x46\xf8\x6e\x6b\xae\xb6\xae\x50\x29\xff\xbe\xeb\x72\x05\xf9\xc1\x4b\x43\x1f\xc6\xed\x1f\x33\xe9\x53\x59\x2c\xdf\x26\xbd\xbf\x64\x4a\x7d\x47\x98\x4a\x10\x87\x6c\x84\x2b\x26\x85\x7d\x5c\x32\x78\x6e\x1d\xe2\xa8\xd0\x2d\xaf\x97\x98\x86\x46\x5c\xc9\x9e\xc7\x30\xa5\x2d\xd7\x31\x58\x7b\xcb\x3d\x7a\x03\x11\x19\xc4\x21\x1b\xe1\x94\x40\x77\xcf\x82\xfd\xa8\x8d\x3f\xc3\x0b\x5f\xef\x4f\xae\x24\xec\xa8\x32\x15\x66\x4a\x27\xd6\xff\x8a\xfb\x66\xd8\xb1\xdf\x16\x88\x88\x0c\xe2\xfe\x8f\x11\xfe\x67\x83\xb3\xff\xf5\x3d\xc2\xc4\x5c\xbd\xfb\xdc\x2f\xed\x14\xa6\xb4\x16\xa6\x72\x3d\x38\xfa\xc5\xa3\x4c\x5e\xdf\xb0\x3b\xb8\x9f\x93\x55\xda\xad\x7b\x1d\x7d\xfe\x6f\x23\x6c\xc0\x5a\x1c\x59\x35\xfb\x4b\x5e\xc1\xad\x96\xed\x8b\x07\xc9\x81\x75\xfa\xf1\xf9\xee\x70\xd1\x78\x67\x35\x1f\x92\xdf\xab\x47\xa4\x7f\xa1\x3f\xbe\x2c\x8b\x88\xe5\xbc\xec\x39\x09\x1c\x5a\xca\xcb\x20\x4c\xcc\xdc\x92\x4d\x14\x60\xfb\x43\xff\x8e\x5c\xd3\xa9\xde\x40\x8d\xff\xbf\x66\x84\x41\x43\xfb\xbb\x46\x18\xc9\x08\x7f\xcd\xe7\x96\xff\xb5\xd7\xc0\xca\xcd\x52\xd5\x59\xe8\x63\x51\xf5\xe5\xa9\xeb\xf0\x91\xb7\xcb\x82\xc8\xc9\x77\x33\x31\xb4\x2f\x4b\x67\xb2\x59\x29\x8c\x7c\xb3\x4f\xf8\xd0\x3c\x4a\xa6\x59\xcc\x15\xaa\x5f\x5b\x58\x39\xec\x26\xf7\x9f\x38\x71\xf9\x15\x29\xe3\xe3\x62\x92\xf9\xb3\x48\x73\x06\x9e\xc9\xd6\x2c\xb2\x11\x2e\x33\xf3\xc9\x76\xae\xba\xca\xb0\xb7\xb8\x71\x5b\x3f\xb7\x9e\x55\xda\x8a\xf7\x71\x17\x29\x6f\x10\x9f\x17\x67\xd7\x63\xfa\xc6\x33\x39\x91\x8d\x72\x03\xe9\xcf\x56\xe8\xdd\xfc\xa8\xeb\xd4\x5a\x65\xb7\x76\xe9\x80\x39\xdb\x79\xd1\xb1\xf7\xd3\xd7\xf8\x1e\x3a\x94\x0c\x86\x8a\x1e\xe7\x5a\xa2\x33\xe9\x48\x16\x80\x6c\x84\x8d\x9a\xea\xdd\x3f\x5e\xa0\x71\x32\x90\xd0\x18\xaa\xfa\xd9\xda\x77\x4c\xbd\xcb\x86\xba\xd8\x6d\x34\x61\x57\x93\x54\x9b\x1f\xb1\x77\x66\x46\x18\x24\xa2\xd3\x32\x9f\xa2\xc9\x9b\xbc\x27\xee\xb3\x39\x15\xf2\xab\xca\x7b\x95\xea\x92\xd3\x04\x37\x9c\xa6\x7e\x4d\x76\x3e\xbe\x53\x4e\x65\x9d\xa5\x08\xdd\x1c\x0f\xe2\xe0\x99\x0f\x0b\xb7\xe6\xd0\xb6\x3f\xc1\xf4\xdd\x14\x73\x57\x5f\x29\x7b\xda\x8e\xa3\xdf\xa7\x84\xf3\x4b\x6f\xa3\xbf\x7c\x67\x53\x8c\x39\x80\xb6\x01\x40\x1c\x3c\xf3\x11\x9b\x2f\x8e\xd1\xb0\x72\x7f\x79\xcf\xf4\xb5\xfb\xa6\x44\xc1\x25\xed\xc7\x42\x4e\xc9\x4e\xed\x44\x15\xb4\x28\x45\xac\x1e\x31\xaf\x10\x71\x41\x1c\x3c\xf3\x35\x7a\xfc\x49\xd6\xe6\xb7\x20\x1b\x6c\x60\xc3\x54\xdb\x3b\x4f\xf9\x13\xfd\xbe\x78\x9b\xfc\x45\x07\xde\x7b\xe7\xd9\x96\xa7\xf2\xa0\x6d\x51\x10\x17\xac\x88\x72\xee\xef\xb8\xf8\x7e\xfd\xf1\x0c\x1b\x2f\x5a\xec\x8d\x73\x29\x44\xb4\x5c\x29\x57\xef\xe3\x89\x6c\x93\x77\x29\xcb\x48\x4e\xbd\x22\x0f\x73\x33\x41\x18\x61\x10\x07\xd5\x08\xff\xbb\x11\x06\xbd\xd0\xa7\x49\x00\x85\xf0\x68\x2f\x69\xac\xb2\xc8\x63\xc6\x90\xb7\x52\x16\xf5\x9d\xd9\x46\x90\x1f\xd5\x52\x54\xe6\xa1\xe2\x43\x26\xd2\x2c\x0e\xe8\xee\x54\x10\x87\x64\x82\x1a\xae\x5e\x60\x3a\xfe\xb5\x5f\x63\xf6\xc1\x2e\x5a\xff\x67\x54\x56\x37\xc3\x5d\x17\xff\xf1\x2e\x8e\x3e\xc3\x3a\x0b\x27\x73\x63\xc8\x04\x01\x38\xb8\x04\xd8\x9d\x4d\x07\x5e\xd4\xf3\x9b\x5d\xd9\x24\xd2\xd9\xda\x36\x13\xf7\x0f\xf9\xec\x76\x62\x8b\x99\xa8\xd4\xad\xd1\xeb\x23\xaa\x06\xed\x32\x82\x38\xb8\x04\x0a\x75\xb7\x9e\xe2\x60\x14\x55\xf7\xfb\x0d\xbf\xd7\x3f\xd2\xc7\xca\x5a\x78\xa3\x4a\x75\xc8\x3b\xfe\xa7\xdd\x49\xad\xef\x51\x03\xb4\x60\x07\x71\x70\x09\x14\x78\x36\x05\x67\x30\xf5\x0a\x58\xf7\x4d\xbc\xf4\xbb\xcc\x88\x6a\xdf\x28\xe6\x5a\x36\x43\xe5\xbd\x1d\x4a\x33\x20\x5b\x76\x05\x3a\x16\x0b\xe2\xa0\xda\x40\xe1\x7f\x5f\x00\x83\x66\xd7\xd3\x34\x60\x7c\x38\xc5\x2f\x72\x2e\x21\x55\x56\xa3\xdd\x83\x68\xa0\x4b\xa0\xb9\xf3\xb0\xed\x99\x62\x84\x03\x85\x6e\x63\xf6\xb0\xc2\x53\xe8\x1a\x6d\x10\x07\xd7\xc0\x86\x47\x69\xae\x34\x27\xd5\xad\xbd\xb7\xde\x5d\xdc\x54\xe3\x2f\x57\x25\xdd\xb2\xe4\xf4\xc4\x18\x18\xa4\x44\xf3\x68\xde\xea\xfd\x80\xea\x2d\x01\x1c\x5c\x03\xaf\x0c\x37\x5b\xde\x4e\x36\x08\xea\x8b\xed\x5f\xc7\x0e\x42\x59\x31\x78\xbc\x3d\xf5\xd1\x88\x4c\xea\x62\xb8\x4c\xab\xce\xce\x3e\x23\x22\x2e\x88\x43\xda\xb5\xf3\x39\x94\x2d\x0c\x23\xfc\xa0\xc4\x50\xab\xb5\xe4\xd6\xe1\x3a\xd2\xa8\x74\xb5\xcf\xec\x3d\xb7\xb5\xc4\x55\x43\xf5\x84\x36\xe8\xce\x5b\x10\x07\xd7\x80\x96\x7a\x2f\x76\xea\xde\x55\xd5\x07\x4c\x62\x65\x07\x0a\x41\xe8\x78\xc3\x4a\xf1\x5e\xeb\x12\xb1\x5f\x1e\x6b\xb7\xc8\x7d\x10\x87\xae\xd0\x02\x71\x50\x6d\x20\xc0\x08\x83\x52\xdd\x69\x1a\x68\x2f\xc6\x15\x8c\x66\x1a\x18\xa6\x30\xf9\x90\x12\xe9\xdc\x39\x6d\x43\xa0\x90\xd0\xb4\x69\xbc\x7e\x91\xbe\x70\xcb\xcb\x7b\x16\xfa\x08\x00\xe2\xe0\x1a\xe8\xbf\x20\xf4\x83\xbb\x48\xf6\x62\xe2\x1c\x25\xeb\x5e\x22\xf3\x61\xdd\x4a\x87\xea\x18\x77\x71\x53\xc1\x46\xf0\xb1\xb4\xb8\x88\x23\xb4\x7b\x0f\xe0\xe0\x1a\x60\xda\x7d\x8c\xcd\x79\xcb\x25\xbe\xb5\x50\x53\xa0\x7f\xc3\xd3\xa1\x83\xe5\xdd\x26\xf6\x7b\x55\xdb\x14\x59\xa6\x47\xd2\xd6\x6e\xd0\x47\x16\x10\x07\xd7\x00\xa5\x70\xd7\xa2\xe2\x14\x47\x4e\xdc\x43\x29\xdb\x01\x22\x2e\x9b\x3f\x99\x9c\xf5\x47\xb1\x62\x7e\x53\x1d\x94\x8a\xb8\xbc\x5f\xe9\xa0\x13\x27\x00\x0e\xae\x81\x9c\x87\x97\x99\x28\xb7\x96\xc6\x4d\x59\x94\x3f\x6e\xdf\x88\xfe\xe8\x9a\x21\xe0\xc8\xe3\x93\xfc\x5b\xdc\xd4\xba\x66\xd5\x82\x56\x0e\x32\xc2\x00\x0e\x9a\x07\x6e\xfc\xbb\x06\x40\xeb\x8e\xd3\x34\x20\x4a\x81\x93\x9b\xdd\xda\xb2\x76\xf7\xa5\x08\x71\x24\xba\x1c\x07\xa5\xc2\xcf\x34\x19\x4c\xf4\x68\x65\x47\x93\x49\xa7\x58\x07\xe8\x76\x42\x10\x07\xd7\x40\xae\xb8\x94\x74\x8d\xe0\xf8\xef\x3f\xda\x2e\x2f\x3e\x16\x12\x94\x4a\x3e\x89\xa0\xc1\x24\x13\xd8\x3a\xc7\x34\x5a\xcb\xa4\x2b\x1a\x85\x88\x0b\xe2\xe0\x1a\x70\xb8\xfa\xc6\xa4\xa7\xad\x4c\x2e\x32\xa0\x29\xa4\x84\xc2\x2b\x22\x8d\xea\xf0\x56\x2d\x3f\x2e\xcf\x01\xcb\xed\xd4\x3b\x57\x15\xa1\x06\x87\x20\x0e\xae\x01\xf2\x3b\xf3\x8b\x0d\x45\xdb\xcf\x57\xcf\xd9\xac\xaa\xcd\x7f\xfd\x33\x1b\x3e\xb4\xc9\x47\xf8\xdd\x36\x3e\xa1\xfc\x5e\x23\x71\x90\x2e\xd4\xe2\x04\xc0\xc1\x35\xe0\xf1\x27\xa4\x91\x6b\x33\x47\x39\xa1\xe0\x49\x9c\x4b\x5a\xd7\x83\xaa\x4e\x41\x31\x42\x03\xe9\x3e\x83\x85\xe0\x97\x3a\xec\xa2\x19\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\x90\x89\x3a\xdd\x08\xff\xbc\x33\xbd\xc0\xf0\xa8\xf0\xc7\x85\xe6\x52\x8d\x8a\x7a\xd6\x61\xde\xcc\x28\x6b\x81\xc5\xd7\x55\x35\x93\xf7\xd0\x7a\x24\x42\xe5\x10\xa6\x12\xc4\x21\x1b\x61\x9e\x61\xd2\x9f\x1d\xb7\x07\x34\x5c\x7f\x08\x5e\x5c\xae\xad\x3d\x71\x1d\x33\xb0\x13\xe5\x09\xed\x61\xb9\x92\x38\xc3\xd4\x19\x94\x8c\x88\x0c\xe2\x90\x8d\x30\x1e\xa1\x94\x58\xe4\xce\xa5\xa9\x42\x0e\x86\xab\xbd\x33\xeb\xee\xc9\xbb\x37\x8f\xbf\xb7\x4d\xb4\xb7\x7f\x0d\xda\xd8\x9a\x5c\x2f\x43\x44\x06\x71\xff\xc7\x08\x13\xfc\x23\xf2\xff\xfa\x1e\xe1\x40\x99\x84\xbe\x32\x66\xbc\x07\x5d\xae\x56\x97\x18\xd0\x24\xf8\x14\x46\x07\x15\xbc\xfb\x5f\xc9\xf3\x90\x93\xdc\x3e\xda\xe0\x2e\xf8\xdb\x08\xe3\xec\x85\xe4\x8a\xf3\xbd\x78\xf1\x4c\x82\x81\xe5\x15\xbe\xef\xbe\x2c\xe5\x58\x78\xe0\x2b\xbe\xe0\x87\x76\xef\x1d\x97\xb9\xa3\xd6\xfe\x7e\x77\x66\xe2\xdc\xfa\x39\x54\x03\xfa\x99\x9d\x4e\x56\x5a\x4d\x71\xeb\x0a\x50\x9e\xd5\x0b\xd9\xd3\x3f\x09\xfb\xf4\x64\x60\xb6\x2e\xfd\xbf\x66\x84\x41\x43\xfb\xbb\x46\x18\xc9\x08\xab\x98\x72\x24\xa5\x90\x8a\x2d\xa6\xbd\xb1\xf8\x54\x2c\xf8\xc5\xeb\x71\xee\x76\x7f\xdd\xf9\x9e\xd0\x5c\xd5\x00\x4e\x5c\x73\x0a\x92\x33\xd9\xac\x44\x36\xc2\x6d\x04\x62\x3c\xfd\x09\xf7\xf6\x56\x83\x3f\x74\x7e\xb0\x9c\xfb\x10\x25\xa1\x8d\x6f\xa2\x89\x8b\x36\xda\x8c\xbe\x84\xff\x56\x62\xf4\x4c\xb6\x66\x91\x8d\x30\xaf\x10\x79\xa3\x6d\xd5\x18\x9e\x9f\x4d\x83\xd3\xa3\x97\xf4\x13\x8d\x27\xbe\xcd\x2d\xf6\x2d\x87\xce\x43\xfd\x4b\xdc\x2a\xa9\x2f\xce\x64\xb4\xc8\x46\x78\x67\x66\xc8\x51\x26\xa6\xa2\x97\xfa\xae\x66\xbe\x4e\x08\xe6\x61\xe6\x0d\xaa\xf7\xdf\xd7\xfb\xd2\xf0\x71\xb7\xa6\x4d\xed\x07\x2e\x9e\xc9\x68\x91\x8d\x30\xbf\xce\xd6\xb9\x17\xa2\xd3\x85\x4b\xbe\x97\xb2\xa2\xab\x74\x64\x72\xd2\x8b\x15\x06\x19\xb2\xd6\x03\x74\x23\x5e\x98\x79\xb7\x65\x9c\x99\x11\x06\x89\xe8\xb4\xcc\x57\xf0\x6a\x71\x35\xc8\x02\xe5\xf8\x9c\xeb\x9f\xab\x15\x69\x63\x99\x81\x49\xce\x2d\xad\x3e\xe4\x5b\xda\xbb\xb3\xd2\xb7\x0b\x0f\xa1\xfb\x42\x40\x1c\x3c\xf3\xa5\x04\x93\xe8\xac\x47\x84\x3e\x78\x87\x7f\xaf\xf9\xeb\xa1\x4e\xed\xaf\xdb\x24\xc7\x8b\xfb\xcd\x75\x39\xdb\xd1\x1f\x64\x8d\xa8\xa0\x4e\x49\x20\x0e\x9e\xf9\x54\x87\x7f\x07\x48\xd3\x3e\xa0\x11\x5e\xef\xd0\xfb\x9d\xe0\x1b\xa7\xfb\x53\x77\xd9\x1a\xd5\x50\x80\xa5\xa1\x28\x05\x53\xbf\x04\x2a\x0e\x04\x71\xf0\xcc\x67\x7c\x0e\x57\x92\x24\x6b\xbc\x32\xf1\x67\x92\xdf\x58\x7e\x00\x2f\x56\xaa\xab\xb0\x86\x9f\x4f\x14\x96\x24\x6b\x7a\xab\xd4\xde\x37\xc8\x09\x00\xb8\xff\x93\xa1\xfe\x8e\xfb\xa6\x5e\x89\xca\x11\xbb\x6a\x52\xa6\x9d\xb3\x71\x2d\x74\x64\xe5\x7d\x4e\x93\x90\x7e\x1e\x61\xf4\x00\xb6\xd2\xe5\xe4\x80\x59\x61\x84\x11\x06\x71\x50\x8d\xf0\xbf\x1b\x61\xd0\x0b\x7d\x9a\x04\xda\x24\x18\x49\x72\x69\x0c\x5d\x8c\x43\xbf\x85\xde\xcf\x37\x68\xc7\x0c\x13\xd9\x92\xda\x67\x14\x2f\xe8\x66\x51\x78\xac\x50\x8f\x8d\x18\x3a\x88\x83\x4b\x40\xec\xb9\xd0\xcd\xeb\xbf\xf5\xbe\x24\x12\xa8\x1e\xd3\xd1\xd0\x99\xf5\x7f\xf5\x1d\xf2\xc4\x9d\x2d\x1e\xe9\xe1\x30\x29\xeb\xd7\x83\xca\xcf\x41\x1c\x5c\x02\xc2\x06\xde\xa1\xa8\x52\xba\x15\x66\x97\x88\xfb\xa2\x50\x30\x6c\x96\xae\x52\x4a\xfa\xd2\xa1\xda\xd6\x63\xa8\x26\xda\xbc\xa5\xbf\x8f\x88\x0b\xe2\xe0\x12\x10\xbc\xae\x43\xc2\xfe\xca\xdc\xee\xbc\x93\x1f\xa9\xa7\x88\x13\x93\xeb\xc4\x79\x26\x94\x72\xbc\xcd\x9c\x6b\xcf\x9c\x30\x4c\x52\xa1\x3b\x29\x41\x1c\x5c\x02\x97\x85\xec\x35\x9f\xf0\xea\xb0\x38\xb4\x10\xd2\x79\x1e\x33\x7c\x60\xc4\xda\x38\x0c\xfa\xd5\x24\x5f\xf1\xb5\xb7\x4b\xa8\x96\x0c\x15\x6a\x94\x04\xe0\xa0\xda\x40\x80\x11\x06\xcd\xae\xa7\x69\x60\x2f\xe1\x11\xda\xe0\xa0\x67\xf5\x6f\xa6\x08\xf5\x07\xe8\x81\x1f\x17\x92\x67\x09\x6b\xc4\x35\x09\x71\x63\x7c\xa8\x6a\x35\x3a\x8a\xa1\x9a\x5b\x00\x87\xd4\x39\xfc\x46\x91\x82\x0d\x4f\xbf\xa8\x07\x11\xff\xa5\x7e\xb5\x79\xda\xb9\x07\xee\xb7\xfa\xe3\xdc\x28\x9e\xe2\x5d\x50\xd3\xf5\xfd\x09\x5d\x45\x03\xe2\xe0\x1a\xd8\xe2\x8d\x19\x5d\x3b\x71\xbe\x54\x1d\xf3\x51\xc4\x4d\xce\xf0\xdb\x39\x15\xbe\xdf\x6d\xeb\x5d\xd4\x36\x95\x6a\x4c\x09\xe8\x9b\xd0\x77\x36\x10\x07\xd7\x80\x32\x81\x8e\x22\xeb\xfb\x48\xd5\x77\xa5\xf3\x83\x54\x0c\xef\xb4\x9e\x85\x94\x8b\x4c\x36\x33\x50\x86\xe8\x6a\xeb\x35\xac\x92\x7f\x47\xc4\x05\x71\x70\x0d\xac\x60\xfb\x7b\x78\x4e\x4c\xdf\x1c\x33\x76\xeb\x23\x7f\xc5\x4a\x13\x46\xfe\xb6\x91\x82\xf0\x4f\xf7\xdd\x6e\x01\xc1\xc1\x7c\xa7\x1c\x84\x06\x40\x1c\x54\x1b\x08\x30\xc2\xa0\x54\x77\xea\x3d\xc2\x4f\xfc\x9c\xd8\x4a\x49\x7b\x84\xf9\xe6\x6e\x46\xe7\xde\x49\xd4\xd5\x8c\xf1\xcd\xbd\xd0\x71\x32\xe4\xb8\x4b\x7d\xcf\x23\x1e\xba\x96\x0c\xc4\xc1\x35\xb0\x9f\xd7\xf1\x28\x88\x51\x03\x3d\x7a\x2a\x7a\x34\xf6\x87\xd2\xc6\x97\xe2\x68\x2e\xbd\xf0\x67\x34\x07\x0e\x68\x4f\xb5\xc4\xf3\x19\x10\x71\x41\x1c\x5c\x03\x46\x46\xcf\x0c\x9c\x89\x24\xf2\xd8\xda\xb9\x2e\xa7\x71\x10\xe6\x8f\xa6\x2f\x1e\x67\x72\xbf\x5c\x1e\x1c\xbc\x53\x70\x6f\x9f\x02\x3a\xc1\x01\xe2\xe0\x1a\x48\xce\xa1\x50\xf2\xc2\xae\x4c\x53\xf1\xb8\xcc\x67\x35\x77\xf5\x29\x11\x7e\xe7\x4a\x17\xbe\x0d\x5e\xd5\xb3\xd8\x7e\x26\x93\x57\xe1\x88\xb8\x20\x0e\xae\x01\x46\x55\x66\xc6\xcd\x89\x31\xe9\x83\x1d\x1b\xb5\x6a\xdf\x86\xdb\x87\x76\x51\x05\x6a\x71\x0f\x83\xbe\x14\x89\xb5\x50\x63\x63\x5e\x44\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\xd6\x1d\xa7\x69\x40\x5e\x1a\x47\x9d\xe3\x1c\x96\x99\x31\x95\x9c\xd6\x89\xef\x51\xc3\xa8\xcf\x35\x95\x87\xfd\x96\x18\x65\x28\xea\x7a\x06\xb1\xa6\x1f\x11\x63\x07\x71\x70\x0d\xdc\x37\x5c\x09\xe5\x1c\x3b\xcf\x32\x5a\xac\x2a\x2e\x33\xbe\x4d\xf6\xff\x30\x77\x96\x51\x59\x35\xdf\xdf\x47\x1a\x15\x44\x5a\xba\x04\x29\xe9\xee\x6e\x04\x44\x01\x11\x50\x52\x09\x11\xe9\x6e\x04\x41\x52\x41\xe9\x12\x91\x56\xba\x04\x41\x05\x69\x05\xe9\x4e\xe9\x2e\x09\x9f\xf5\xfc\xd7\xba\xce\xf2\x77\x2e\xd6\x3d\xf7\x0b\x5e\xdc\xef\x3f\x6b\x5f\xcc\xe1\x7b\x66\xcf\xf7\xcc\xec\x3d\xf8\x5e\x87\xf8\x9d\x79\xf5\x23\xf4\xdb\xf9\x61\x9f\x5d\x7e\x5e\x86\x4e\x1d\x01\x38\xb8\x06\x7e\xbc\x59\xbe\xc8\x76\xbb\xf5\x0e\x7a\x7d\x0c\xe5\x83\x5a\x9b\x45\x57\x89\x23\xa9\x38\xea\xc9\x2f\x86\x19\x76\x13\xb4\xeb\xfc\xd0\x47\x0b\x10\x07\xd7\x80\x78\xbd\x7f\x74\xca\x39\x4b\xae\x69\xaf\xc5\x68\x6a\xe9\x27\x21\xf4\xb9\xe8\xa1\x8f\x32\x5b\x93\xda\x2d\x06\x95\x3e\xaf\x63\x0e\x40\xfd\x22\x00\x1c\x5c\x03\xe2\x0c\x1f\x0d\xd3\x42\xb2\xbd\x82\x68\x1f\x3f\xcb\xa3\x08\xbf\x78\xa2\x1c\x2e\x11\x16\x82\x9f\x1c\x4d\xa1\x35\x54\xc3\xdc\x38\x08\xd5\x08\x03\x38\x68\x1e\x00\x18\x61\x90\x89\x3a\xdd\x08\x2b\x61\xec\x7a\x08\x13\xf3\x99\x37\x0a\x4a\xf2\xcf\x28\x44\xa5\xf7\xa6\x5c\x69\xe2\x8c\x7b\x9a\x50\xee\x12\x93\xd9\xde\x79\x7c\x88\x30\x95\x20\x0e\xd9\x08\xbb\x98\xaf\xbb\xdf\x77\xc5\x16\x4b\xab\x8a\x90\x5e\xaf\x0e\xe1\x2a\xc8\x48\xbe\x2b\xad\xd5\xd0\xbb\x6e\xd5\x30\x13\x7f\x62\x27\x85\x88\x0c\xe2\x90\x8d\x70\x39\x7d\x96\x31\x6f\x87\x47\x47\x67\xeb\x01\x1d\xd5\xbc\xa4\xd5\xa7\xe9\x19\xa5\xca\xfd\x29\x76\xb7\x3f\x0d\x5a\x8b\x68\x2b\x37\x11\x91\x41\xdc\xff\x37\xc2\xff\xbb\x8b\xff\xef\xef\x11\x6e\x78\xf0\x6a\x6f\xe8\xdb\xf7\x9c\x73\xb1\x1c\xfc\x59\x77\x8a\x7d\xf9\xfc\x7b\xd9\xae\x69\xb2\xfd\x94\xce\xb5\x88\xf5\x09\xc4\xfc\xdb\x08\x77\x5f\x37\xb0\x59\x1a\xd6\xd2\x71\x63\xc5\x91\x55\x49\x53\xbf\x37\x1c\xfe\xcb\x09\x23\xc4\x6e\x93\x71\x7f\x59\x60\x47\xd7\x5a\xfe\x2f\xd4\xf1\x4b\x82\xd9\x14\xe3\x6b\xb2\x98\x16\x2b\x26\x37\xe2\xb9\x4f\xde\x37\x17\xf4\x4b\x79\x16\x96\x4e\x92\x34\xa7\x7e\x63\x24\xe0\xff\xd7\x8c\x30\x68\x68\x7f\xd7\x08\x2b\xc1\xcd\xd2\x17\x9b\x99\x2c\x36\x0e\x36\xd3\xaf\x59\xb3\xb7\x0c\x9d\x15\x6f\xd2\xd9\x6c\x79\xf3\xcf\x1e\x3f\x11\x6d\xeb\x2a\x3f\x54\xfe\x65\x77\x26\x9b\x95\xc8\x46\xb8\x80\x37\x83\x5f\xb9\xe8\x9e\x6e\x4e\xee\x27\x2f\xee\x84\x6b\x6c\x72\xdd\xc2\x4d\x18\x43\x0f\x63\x0b\x9a\x4e\xda\xd9\xa2\xe5\x48\xcf\x64\x6b\x56\x12\xb9\x59\x35\x93\x5e\x9a\xb2\xff\x7c\xee\x63\xf6\x4e\xd5\xf6\x64\x5b\x07\x0a\xd9\x0c\xd7\xd4\x41\xb7\xe4\xe7\x85\xd2\xcf\x57\xfb\xcb\x5b\xce\x64\xb4\xc8\x46\xf8\xe3\x04\x66\xba\x80\xd8\x4b\x77\x8f\x4f\x8e\x5c\xd6\xa8\xc6\x0a\xd6\xa6\xa9\x1c\x1f\x58\x9e\x37\xf7\x4e\xcf\xfd\xc6\xa8\xc4\x19\x3b\x93\xd1\x3a\x23\xfd\x6c\x6f\xf4\x33\xe9\x6e\x9f\x3e\x56\x29\xa2\x18\x86\x61\xda\x9f\x5d\x8a\x9e\xcd\x0d\xe7\x8c\xa2\x95\xc4\x2e\x2b\xaa\x1c\x5c\xa0\x3c\xbb\xae\xd1\x20\x11\x9d\x96\xf9\x5e\x6c\x3e\xb0\x23\x2f\x4a\x72\xf7\xad\xba\x5a\x77\x82\x69\xfd\xf8\x4b\xcf\xac\xc2\xed\x02\xc9\x1d\x35\xb3\xf7\xd2\x6c\xf4\x9f\xe7\x10\x33\x3e\x88\x43\xaa\x11\x3e\x2f\x39\xf5\xba\x7a\xb5\x7b\x1e\xc5\x52\x89\x23\x75\x65\x60\xdf\xee\x38\x8d\xd0\x37\xd7\xd2\xb6\x7f\x3f\xe3\xc3\x45\xbd\x3d\xc8\x60\x03\x38\x78\xe6\x73\xaf\x7b\xdc\x8d\x2f\xc8\xfc\xc0\x72\x06\xbf\xb0\x63\x2d\xdb\xd4\x0a\x8f\x74\x8d\x6c\x69\x5c\x2e\x69\xeb\x76\xba\x8b\x08\x5e\x28\x22\x2e\x88\x83\x5f\xf0\x47\xe6\x94\xdb\xe0\x11\x8e\x29\x15\x7f\x5d\x4f\x85\xea\x81\xba\x62\xdb\x37\x1e\xa6\xfe\x74\x1e\xe7\x64\x4c\xb4\xa1\x19\x35\x3c\xa8\x88\x09\xc4\xc1\x9f\x2f\xeb\x73\xaa\xac\xec\xcf\x9b\x66\xe6\xf7\xc8\xd5\x38\xb5\xdf\xba\x3f\xcd\xf3\x20\x1b\x7c\xea\xc3\x8a\x22\xca\x2e\x5c\x4c\xca\xfa\x01\x61\x84\x41\x1c\x54\x23\xac\xf4\x8f\x8b\x1f\xd0\x0b\x7d\x9a\x04\x3a\xac\xc3\x44\x71\xc6\xb8\x9b\xcb\x5e\x38\x33\xf5\xbd\x8a\xe0\x40\x0d\xaa\x68\xe9\xa6\x7f\xfc\x8c\xdc\xfa\xb3\x56\xfb\x95\x5a\xe8\x58\x2c\x88\x83\x4b\xc0\xc6\xfe\x76\xc9\x84\x43\x49\x81\x32\xb6\xb8\xbf\xc6\x87\xba\xe4\xe8\xaf\x7e\xf7\x02\xb3\xb1\xef\xee\x78\x8e\x19\xdd\xe2\x53\xf4\x86\xbe\xd6\x03\x38\xb8\x04\x5e\xde\x53\x95\x5b\x75\xa1\x27\xd1\xc2\xb2\x6a\x7d\x34\x90\xe6\x9e\xab\xdc\x74\x97\xd6\xde\x61\x64\x44\x2b\xf8\xd5\x18\x8e\x92\x02\x22\x2e\x88\x83\x4b\x00\xfb\xb7\xb7\x87\xb2\x49\xd7\xc5\xf3\xa4\xb3\x23\x87\x89\x86\xd7\xba\xd2\x74\x65\x75\x30\xd0\xb2\xba\xd5\x3d\x06\x97\x2e\x48\x40\xf5\x71\x20\x0e\xfe\x7c\x7f\xe5\x08\xd6\x5d\xcd\xfe\xbc\xf1\x51\xb4\x2a\xca\x85\x25\x65\xd9\x7a\x4b\x3b\xe1\x45\x6b\x1c\x5b\xa7\xb9\x46\xbf\xda\x37\xb9\x62\xc4\xe2\x07\xc4\x41\xb5\x81\x00\x23\x0c\x9a\x5d\x4f\xd3\xc0\x30\xfa\xb5\x7c\x8a\x57\x55\x3e\xdc\xf9\x13\xb4\x03\x21\xe4\xde\xbf\x6b\xb8\xb2\x9f\x59\x3b\xe1\x9b\x4f\x59\x45\xba\xde\xc4\xd7\x45\x8c\x1d\xc4\xc1\x35\x60\x99\xa1\x81\x79\x91\xc1\x7f\xfa\xf2\x42\xf7\x13\x91\xdb\x85\x45\x97\x43\xc3\xf1\x19\x88\x9c\x75\x12\x77\x1e\x93\xf7\xf8\x96\x40\xf7\x13\x83\x38\xb8\x06\x88\x33\x5c\x2f\xc7\x5d\xa3\x28\x5d\x7b\x28\x9b\x6d\xbe\x48\x65\xe0\xd1\xbd\x17\xec\xec\xe5\x39\x76\x4d\x92\x1d\x43\x66\xeb\xc7\x08\x22\x2e\x88\x83\x6b\xa0\xc1\x3c\xf6\x53\xba\x0e\x7d\xd7\xca\x34\x93\xa1\x7c\x9a\xd1\xbd\x47\x4f\x6f\x28\x15\x3e\xc4\xe7\x6d\x68\x7d\xff\x00\x7b\x64\x72\x17\x11\x17\xc4\xc1\x9f\xaf\x87\xd1\x9b\x3a\xd5\x99\xbb\x5d\x7e\x87\xd6\xe9\xc6\xa8\x0f\xec\xe4\x1c\x9b\x79\xd2\x89\xf1\x79\xef\x6c\x18\x5a\x09\xe3\x08\x2f\x23\x34\x00\xe2\xa0\xda\x40\xc9\x7f\xd6\x00\x28\xd5\x9d\xda\x34\x8f\x54\x8f\x27\xa9\x4d\xc0\x21\x28\x84\xc8\xcb\x66\x90\x06\xc5\xf4\xe3\xbb\x2b\x7e\xdc\x6b\x0f\x1d\xf3\x33\xbc\x2d\x25\x38\xde\x42\x4d\xf3\x00\x1c\x52\x8d\xb0\xa1\xed\xf0\xd4\x3a\xd5\x1b\xa1\xee\xb0\xf3\xb4\x94\xac\xb6\xeb\x3b\xb7\x5b\x3e\x13\x37\xe4\x46\x0f\xd0\xbc\xf7\x20\x16\xce\x80\x76\x19\x01\x1c\x52\xc3\x34\x71\x3f\x51\xd7\x5e\x22\x33\x4a\x61\xf3\x2b\xc1\x9e\x33\xd3\x3a\x56\x5f\x6b\x1d\x95\x52\x9c\x37\xd6\x3f\x27\x5f\x99\x5b\x82\x3e\xb2\x80\x38\xb8\x06\x50\x7f\x24\x3b\x9b\xb9\x33\x3e\x59\xc8\xc7\x4d\x96\x13\x1a\x0b\xa3\x76\xf1\x70\x48\x67\xbb\xb1\x33\x9c\x2a\x79\xf2\xd5\x7f\x02\x6a\x43\x01\xe2\xe0\xcf\x77\x6b\xff\x82\xf6\x8e\xc5\x39\xe5\x61\x5d\x21\xbf\xb2\x50\xb1\x63\xe1\xe3\x01\xe7\xe5\x1e\x87\x9a\x1a\xb6\x18\x0d\x8e\xde\xab\xf8\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\xd4\x3b\xe5\xbb\xd4\xf7\x77\x96\xbf\x5f\xd7\x91\x77\x88\x56\xac\x7b\xf3\xb5\x84\xf8\x25\x56\x58\xb2\xcc\x07\x53\x34\x9b\xca\x40\x62\x9c\x1c\xc4\xd8\x41\x1c\x5c\x03\x23\x09\x9e\x97\xaa\xf0\x83\x55\x8f\x65\x5b\xac\x71\xa2\xef\xd2\x10\x7d\xb8\x92\x9c\x2b\x8b\x9a\xd6\x41\xc3\x41\xb7\x99\x5f\x00\x7d\xb8\x02\x71\x70\x0d\x98\x56\xa6\x3d\x4b\x08\xdd\x91\xf4\xe9\x2f\x5d\x4d\xfb\x3a\xda\x4b\x3f\x11\x58\x53\x65\x52\x11\x7c\xcb\x29\xbb\xe0\xf2\x0d\x67\xa8\xa6\x1f\xc4\xc1\x35\x90\x15\x47\x54\x7b\xe2\x5b\x9e\x96\xee\x98\x69\x5b\x95\x61\x54\xca\xbf\x4c\xa0\x94\xb3\xdc\xf8\xea\x4d\x61\x49\x8c\xc7\xa0\x03\x3e\xb4\x83\x0d\xe0\xe0\xcf\x77\x9c\x96\x7c\xf8\x12\x83\xb4\xd2\x73\xfd\x2c\xc5\x0a\x85\x82\x43\x7f\x56\xdd\xa7\xa3\x81\x4a\xd4\x61\xbc\xc2\x3d\xa5\x4f\x31\xa0\x93\x21\x20\x0e\x9a\x07\x9c\xff\xd9\x08\x83\x4c\xd4\xe9\x46\xf8\xe9\x9d\xcd\x4c\xb3\x9b\xf7\x35\xcc\xaf\x2d\x9b\x84\xef\x85\x24\x0e\x68\x1f\xaa\x8c\x33\xfa\x85\xda\xca\x91\x56\x89\x6e\x61\xfa\x22\x4c\x25\x88\x43\x36\xc2\xbc\x42\x03\x32\xfa\xc4\xb4\xd5\xae\xb3\x23\x6b\x27\x62\xa6\xc5\x3e\x23\xb8\xf3\x2e\xc6\x46\xbf\x7c\x6d\x2e\xee\xb0\x86\x6d\x56\x20\x22\x83\x38\x64\x23\x5c\xff\xb1\xf6\xf1\xd8\x86\xc7\x93\xfd\xfb\x3b\xa8\x89\x9b\xf2\x78\x0d\x79\xf3\x77\x48\x26\x58\xe2\xea\xde\x6d\x5a\x85\xef\x18\xe9\x23\x22\x83\xb8\xff\x6f\x84\x51\xce\xfd\x1d\xf9\x5f\xdf\x23\x3c\x9e\xa1\x50\xfb\xf6\xc3\x0a\xa5\xe3\xad\x97\xdc\x3e\x2a\xde\xb3\x1e\xf7\x31\x0f\x7c\x1b\x8c\x62\xd1\x71\x7c\xb5\x64\xaf\x79\xfc\xcf\x3d\xc2\x69\xef\xf4\x9f\x2c\xce\xef\xca\xe4\x9f\xbb\xa5\x6a\xec\xa5\x9b\x63\xf1\x81\xeb\xfc\x05\x29\x1b\xb6\x3e\x91\x44\x52\x71\x43\xab\xf1\xbf\x3f\x50\x62\xb0\xf1\xc9\x89\xfa\x30\x8f\xf3\xbd\x70\xea\x41\x21\x59\xc6\xa4\xf5\xb9\xb8\x9a\xe1\x3c\x32\xbb\xb0\x69\x25\x30\xc2\x45\xf9\x5f\x33\xc2\xa0\xa1\xfd\x5d\x23\x8c\x64\x84\x69\x35\xed\xd6\x1e\xbc\x13\x33\xcc\xfa\xc1\xc2\x90\x64\x3f\x20\x30\xf2\x72\xfe\x73\x4b\x38\x8a\xcb\x68\xf2\xde\xb3\x60\x05\x1a\xd6\x33\xd9\xac\x44\x36\xc2\x51\x4f\x6b\x4a\xae\xd4\xa7\xe9\x08\x11\x8a\xa1\x34\x65\xc6\x65\x4a\x30\xe2\x6a\x2d\x2b\xda\x4a\x5f\x39\x7f\x43\x74\xa2\x81\x90\xf3\x4c\xb6\x66\x91\x8d\xf0\xc2\x7e\xc8\x2d\xb5\x9d\x9a\x83\xb4\xc9\x29\xd7\x76\xb5\x47\x2c\x81\xd1\x86\x28\x1a\x81\x0b\xcd\x0b\xb4\xfd\xb3\xd6\xb6\x97\x86\xcf\x64\xb4\xc8\x46\x38\x34\x86\x4c\x8b\xc2\x3d\x30\x35\x29\xd6\xd3\x49\xab\x65\x57\xe4\x1d\x29\x71\x0f\x7f\x99\x0d\x46\xe4\xfa\xaf\xc8\xac\x60\x86\x33\x29\xc4\x96\x42\x36\xc2\x68\xdd\x31\xe5\x21\x32\x8d\x6a\x84\x63\x01\x62\x1f\x94\x9a\x49\xfa\x45\x74\x16\x50\x63\x08\xc2\x69\x26\xf8\x44\x7e\x1b\xe6\x87\x9d\x99\x11\x06\x89\xe8\xd4\x8b\x03\x9d\xaf\xec\xc8\xe5\x7a\xe2\x0a\xc8\x63\x88\x35\x7b\xd3\xdc\x4c\x66\xd6\x7d\x1f\xf8\xc1\x83\x10\x2b\xf1\x7b\x29\x7f\xef\x73\xa8\xad\x2b\x88\x83\x67\xbe\xe7\x8b\x7a\x21\x6f\xb9\x34\x48\xc4\xcb\xc7\x28\xaa\x3d\xf3\xd0\x26\x1d\x52\xc9\xb7\x9a\x8e\xc5\x50\xe6\x7b\x29\xb2\x55\xd9\x68\x10\x71\x41\x1c\x52\x87\x94\xfb\xbb\x0b\xe4\x0a\x47\x8f\xfd\x14\x32\xef\xbd\x56\x1a\x30\xd6\x56\xec\xb4\x1d\xba\xdc\xdd\xf6\x68\x63\x37\x80\x82\x7c\x18\x2a\x0a\x02\x71\xf0\xcc\x77\xa3\x32\x2d\xf7\xc0\x48\x52\xfb\xd9\x0c\xf5\x8f\xfa\xe9\x62\x31\x17\xf4\x0b\xe6\x05\x0a\xd7\x19\x50\x02\x73\x5c\xe6\xb1\x4a\x82\x10\x71\x41\xdc\xff\xcf\x50\x7f\xc7\x1d\x12\x30\x75\x91\xf7\x8b\xef\xf6\xcb\xa7\xb4\xd7\xdf\xbd\x26\x22\xd1\xac\x76\xbf\x8f\xd5\x39\x8e\x45\x29\xdc\xfa\xfe\xe5\xcc\x0d\x84\x11\x06\x71\x50\x8d\xf0\x3f\x1b\x61\xd0\x0b\x7d\x6a\x93\x9c\x97\x47\xc1\xef\xa2\x0c\x2a\x5e\x30\x6a\x7f\xa6\xad\x0c\xeb\x4a\x69\xf3\x64\xb0\x90\x3d\xaf\xcf\x45\x2f\x7f\xe2\x66\xd4\x09\x75\x0a\x05\x71\x70\x09\xe0\x72\xb3\x06\x2f\xd6\x5c\x56\x75\x7c\x6f\xf5\xe0\xd9\x48\x4a\x19\xd1\x3e\xd3\xd8\xd3\x68\x5f\xe9\xf5\x47\x4d\x4d\x29\xab\xf9\x9a\x88\xb8\x20\x0e\x2e\x81\xb7\x75\xd5\x0e\xe1\x3f\x6e\xcc\x7a\x05\xee\x31\x36\xe2\x1a\x6c\xf9\x1c\x50\x89\x49\x86\x24\x63\x0b\x7a\xef\xa5\x2c\xb6\xaf\xe5\x23\xe2\x82\x38\xb8\x04\xbc\xc9\x05\x04\xd3\xbe\xdb\x57\x5d\x29\x56\xa6\xb5\xfe\x1a\xe9\x78\x4f\xa6\x58\x8f\xd5\xf9\xf1\x82\x18\xc9\xf1\x7d\xe6\x47\x93\x90\xb9\x02\x71\x70\x09\xa0\x71\xc5\x12\x54\xe4\xf3\x70\x59\x37\x95\x6c\xd3\x2f\xf5\x52\xcd\xd8\x68\x3a\xdc\xb9\xe8\x38\xf5\x59\xa2\x98\xd0\x1a\x7b\x1a\x6a\x92\x03\xe2\xa0\xda\x40\x80\x11\x06\xcd\xae\xa7\x69\x80\x8b\xac\xf7\xb9\xe6\x04\xee\x98\x60\x7e\xdc\x84\xbc\xed\x6e\x16\x8f\xe9\xd3\xa2\x81\x7d\x5d\x71\x85\xa9\x6f\x2b\xab\x11\xa1\x50\x49\x3f\x88\x83\x6b\x40\xe8\xea\xab\xe6\x3e\xec\xbb\xad\x5a\x68\xce\x26\xcd\x85\x73\xe8\xf3\x64\x71\x8b\x99\xa5\xe1\x04\xb7\xb3\x1e\xe7\x34\x87\xac\x41\xf5\x96\x20\x0e\xae\x01\x9c\x9f\x3a\x28\xd7\xcb\x1f\x05\x89\x9a\x62\x19\xa6\xf2\x04\xe1\xdf\x9c\x27\xd0\x11\x46\x5d\xb2\xd6\xd2\xd3\xfe\xec\xf7\xc3\xf0\x21\x22\x2e\x88\x83\x6b\xe0\x67\x53\xcb\x03\xfe\x6c\xf4\x5d\xc7\xc9\x4d\x8a\xd4\xbb\xdf\x9c\x88\x34\x5f\xfb\x4c\x4e\x93\xb3\x2f\x51\x9a\x08\xdc\x7b\xe5\xf8\x13\x11\x17\xc4\xc1\x35\xa0\xb3\x42\x7a\xf3\xeb\x9d\xc4\xf4\x97\x23\x31\x75\xe7\xd3\xd5\x65\x53\x7f\x93\x0a\x56\xc9\xc7\xbd\x3c\x77\x65\x98\xd7\x16\xd7\xcc\x0a\xa1\x01\x10\x07\xd5\x06\x02\x8c\x30\x28\xd5\x9d\xa6\x81\xe4\x95\x98\x58\xf2\x6b\x22\x18\x1b\x73\x15\xbb\x4f\x0c\x4c\xd0\x76\x3a\xd5\xc9\x34\x24\x99\x78\x29\x2f\xbc\x4b\xef\x37\x3a\x6f\x84\x18\x3b\x88\x83\x6b\x40\x26\xab\xa9\xf0\xd2\xe2\x81\x64\x1b\x9f\xea\xc7\x73\x4c\xba\x45\x8a\x19\x02\xb8\x0e\xdf\xc8\x97\x88\xbd\x69\x24\x5a\x5f\x12\x43\xc6\x12\xc4\xc1\x35\xe0\xfd\x24\x33\xfa\x1b\x53\xdb\x61\xcb\x57\x71\x54\x3c\x4c\xac\xd7\x2b\x6a\x0d\x79\x62\xb2\xfc\x8f\x8a\xad\x3c\xaa\x6a\xa5\x8f\xa0\x8f\x2c\x20\x0e\xae\x81\x7b\x47\xcf\xb6\xa9\x93\xcd\xd4\xd2\x5d\x22\x4a\xa3\x1b\x5c\xa8\x8d\x33\xf0\x43\x7d\xf6\x27\xf5\xa5\x1f\x75\xb1\x52\x71\xd7\x7a\x41\x8d\xe3\x00\x1c\x5c\x03\xee\x25\xa8\x0f\xd6\xf7\x17\xc2\x5c\x9b\xb7\xdf\xda\x34\xfa\x95\x2d\x72\x6b\xd0\x63\xbe\x94\xec\x21\xa2\xed\x0b\x35\x9c\xf9\xf5\x0d\xa1\x01\x10\x07\xcd\x03\x00\x23\x0c\x5a\x77\x9c\xa6\x81\x5f\xa6\x8d\xb7\xc8\x36\x62\x1b\xeb\xcd\x15\x75\xf1\x2e\x15\x57\xce\xf8\x5f\xdf\x3f\x7f\x4b\xf2\xa7\x0c\xd6\xd6\xc7\x8e\x22\x4d\xa8\x42\x08\xc4\xc1\x35\x70\x94\x1b\x66\xa6\x95\x2d\x25\xe7\x46\xef\xd3\x96\xf7\x81\x8b\xeb\xdb\x23\x69\xce\x3e\xdf\x74\x6e\xfe\xe0\xb4\xfe\xef\x84\xc3\xd0\xdd\xcc\x20\x0e\xae\x81\xc5\xe9\x93\xa0\x92\x14\x7b\x14\x8c\x47\x34\xcb\x39\x31\x03\x01\x01\xb3\x5a\xc9\x0f\x1f\xa1\x7f\xa0\x47\x8b\x90\x68\x0c\xf2\x71\x42\xc4\x05\x71\x70\x0d\xec\x53\x2b\x4b\xe7\xcb\x67\x73\xd5\x90\x6a\x0b\x0b\x7b\xf5\x49\x33\x7f\x36\xbb\xb6\xc9\xbd\xc5\xff\x7e\xb6\xa7\x18\xb3\x92\xab\x0d\x3a\xc5\x00\xe0\xe0\x1a\x48\x62\x2e\x64\xa7\xff\x8c\xcd\xd2\xb5\x71\xc3\x61\xad\x43\xbb\x99\xcd\x46\xcd\x5a\x25\xa6\x4a\xfd\x5a\xa6\xa2\x1f\x8d\xb8\xa0\x3d\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\x64\xa2\x4e\x37\xc2\x29\xf8\xd6\x0a\xbf\x48\x1e\xbe\xac\x8d\xb1\x6c\xaf\xea\x26\x7b\xff\x24\xaf\x96\x87\x91\xc1\x89\x23\xba\xf1\x39\xc1\xa1\x0a\xc6\x07\x84\xa9\x04\x71\xc8\x46\x58\xa1\x81\x9f\x6c\xab\x02\xf3\xea\x3c\xc5\x81\xa9\x44\x32\xed\xac\x94\xee\x8c\x90\x33\xce\xc3\xdc\x67\x43\xee\x89\x3c\x14\x22\x9d\x88\xc8\x20\x0e\xd9\x08\x4f\xcd\xcf\x0e\x76\xdc\x2c\xba\xb7\x75\x58\xf2\x3b\x61\x2e\x5c\x68\x35\xd5\x7f\x54\x99\xc2\xf6\x5c\xd1\x55\xe6\xaa\x28\x1b\xcf\x75\x44\x64\x10\xf7\x7f\x46\xf8\x7f\xae\xbc\xfa\xd7\xf7\x08\x5f\x7d\x4b\x72\xff\x7a\xf5\x05\x45\xd7\x8e\x97\xb2\xad\xac\xdb\xcf\xbf\xab\xf4\xba\xd1\x88\xf0\x5d\x77\x50\x8c\x1e\x99\x53\xef\x35\xfd\xdb\x08\xbb\xfb\x09\xa1\x14\x4c\xb9\xe4\x0d\xb0\xf3\x5c\x36\x50\x8b\xb8\xea\x42\x22\x92\x81\x6b\x22\x16\x24\xb5\x37\x43\x72\x8f\xaa\xfa\xfc\x5f\x68\xb5\xe1\x68\xbe\x6f\xe7\xf5\x59\xf7\x83\x41\xe1\x67\x1b\x26\x23\xdc\xd4\x3e\x11\x29\xf1\x82\xe6\xe7\x3b\x94\x0c\xbb\x4a\x48\xb9\xfe\x6b\x46\x18\x34\xb4\xbf\x6b\x84\x91\x8c\x70\x12\x43\x07\xaa\x46\xff\x04\x87\x5d\xf0\x8d\xac\xc7\xe1\x39\x3f\x39\xc7\x2c\xbb\xea\x08\xab\x87\x4b\x19\xde\xca\x5e\x19\x49\x78\x7e\x26\x9b\x95\x7c\xc8\x17\xfa\xb6\xfd\x61\x79\xf5\x7a\x38\x1e\x25\x62\xef\x43\x40\x67\x74\x88\xf0\xd6\xa1\x4b\xeb\xd0\x15\x15\x9b\xc9\xf2\x77\x8d\x9b\x7e\x9e\x67\xb2\x35\x8b\x6c\x84\x13\x93\xc4\x5e\xec\x7b\xe2\x75\xdf\xb4\xcc\x53\xa5\xb9\xff\xac\x6c\xeb\x7a\xef\xd2\xa8\x45\xc1\x48\xc1\x0e\xdf\x06\x0d\x1e\x73\xdf\x99\x8c\xd6\x00\xe9\x67\xb7\xb9\x1f\x06\xea\x64\x33\xf8\x5d\x54\x92\x8f\x8c\x50\x5f\x7e\xfb\xbd\x9f\xbc\x55\xc3\x39\x28\x96\xfc\x7b\x3a\xd6\x67\x3c\x02\x99\x33\x19\x2d\xb2\x11\x1e\xe7\x6e\xd1\xf7\x88\x21\xe3\x1c\xbc\xc7\xe8\x26\xed\x4b\x2c\x47\xb8\x49\x16\x99\x23\x2a\x20\xc1\x8b\x29\xfd\xf6\x8a\x84\xab\xd9\x99\x19\x61\x90\x88\x4e\xcb\x7c\x93\x54\xcb\x02\x38\x47\xef\x8a\x5b\xe2\xd4\x8b\x3a\x99\x17\xae\x3c\x52\x49\x7f\xf7\xac\xac\xb3\x41\xb5\x32\x40\xc6\x9d\xcd\x06\x3a\x0b\x08\xe2\xe0\x99\xef\x70\xa5\x8e\xf7\x23\x7e\xd0\x3b\x3c\x77\x9f\xf5\xb8\x1d\xcb\x7b\x19\xf2\x78\x43\x52\x0a\xeb\xbd\x4a\x5e\xc7\x4f\xe8\x59\xd5\x20\xc3\x0a\xe2\xe0\x99\xcf\x8b\xd9\xc7\x7f\x5d\xde\xac\x0f\x2f\x84\x71\xe4\x19\x89\x40\xa1\x9b\xc9\x07\x7c\xfe\x2f\xae\xe1\x8e\x4a\xd6\xee\xa3\x4b\xcf\xbf\x20\xe2\x82\x38\x78\xe6\x4b\xa0\x18\x78\x4f\xe6\x86\x7e\xc9\xeb\xa0\x68\x83\x2c\xb5\x88\x0f\xaf\x1e\x35\x78\x72\x0e\xc3\x10\x35\x5c\x93\xf3\x1d\x67\x7b\x0d\x22\x2e\x88\x0b\x90\xf9\xdf\xcf\x89\x07\x44\xba\x9b\xcb\x76\x94\x4f\x9f\xad\x90\x7d\x7b\x1e\xbb\x54\x44\x7c\x7e\x5e\x8c\x7b\x8a\x76\xad\x94\xc7\xdf\x6c\x8e\x9f\xf3\x0e\xc2\x08\x83\x38\xa8\x46\xf8\x9f\x8d\x30\xe8\x85\x3e\x4d\x02\xf3\x4d\xaf\x7e\x19\xe0\xfe\xc4\x31\xa2\x5c\x08\x26\x7c\x1d\x72\x60\x64\x2e\x3b\x5b\xef\xad\x9e\xb3\xc4\xc6\xba\x54\x8e\x82\xa7\x88\x18\x3a\x88\x83\x4b\x40\xee\x9e\x89\xcf\x0b\x72\xe3\xec\x13\xec\xd1\xca\x37\x17\x6c\x2c\xb6\x49\x75\x2c\xd0\x26\x2e\x5e\x5e\x4d\xe6\xe0\x90\x3d\x28\x87\x36\xef\x41\x1c\x92\x09\x2a\xe5\xe1\x32\x5b\xc9\x16\xcb\xc0\xba\x7c\x72\x32\xf5\x90\xce\x1d\x4f\x44\xfb\x49\x9e\xba\x89\xb8\xe3\x63\x32\x73\xbd\xcb\xd0\xf5\x26\x20\x0e\x2e\x81\xed\x38\x93\xa8\xce\x4f\xd1\xa6\xda\x8d\x5a\x72\x8b\x49\x3e\x35\x03\x63\x5c\x35\x8d\x8c\xb9\x0c\x41\x3b\x34\x15\x94\x77\x9d\xf0\x10\x71\x41\x1c\x5c\x02\x71\xad\x1c\x5d\x91\xbf\x49\x1f\x17\x93\xa8\xf9\x8b\x15\x2e\xb5\x44\x59\x33\x69\x7f\x37\xdc\x72\x6b\x6b\xf3\x3f\x67\xef\xa4\x3f\x87\x58\xfc\x80\x38\xa8\x36\x90\xef\x9f\x17\xc0\xa0\xd9\xf5\x34\x0d\xb0\x36\xaf\xdf\x6f\xf9\x48\xab\xc6\xfd\x45\xdd\xb9\x70\x83\x94\xb3\x5c\x9b\x64\x70\x91\x17\xc5\x76\x6d\x75\xe1\xbd\xcf\xbe\x28\xd4\x78\x08\xc4\xc1\x35\x80\xf1\x66\x8a\x29\x6a\x41\xf9\xb2\x05\xba\x65\x6d\xd2\x8e\x66\x9c\x48\xb2\x96\x58\x8c\x78\xf7\x25\x65\x3b\x49\x27\x67\x01\x72\x16\x44\x5c\x10\x07\xd7\x80\xa1\x44\x60\xe3\x71\x63\x08\x05\xaa\x9d\x2d\x4b\xde\xf5\x3e\xab\xd0\x48\x0a\x6f\xac\x8d\x89\x13\x96\x6c\x5f\xc1\xf9\x54\x65\x1f\x44\x5c\x10\x07\xd7\x80\xae\x55\x95\x73\x05\xd9\x60\xdc\x0c\x8d\x03\x6e\x25\x55\x07\xff\xaf\xd5\x9f\x5f\x03\x3f\xf5\x87\xdd\xcd\xc8\x0a\xb9\xb1\x74\x08\xd5\x48\x82\x38\xb8\x06\x2e\xfe\x38\x28\x7e\x4c\xe4\x5a\x6b\x61\xc5\x4b\x94\xb9\xd1\x8d\xb9\x4e\xb0\xf6\xe0\x16\xc9\x63\xdd\xaf\x92\x72\xee\x8f\x0f\x18\x77\x10\x1a\x00\x71\x50\x6d\x20\xc0\x08\x83\x52\xdd\x69\x1a\x58\xaa\xc1\xf1\xb4\x5d\x65\xbd\xc4\x68\x3b\x7b\xa3\x62\xf8\x50\x8f\x6c\xdc\xf1\x44\xe2\x13\x09\x6d\xf7\x1d\x53\x6a\x91\xdb\xe6\x47\x88\xb1\x83\x38\xb8\x06\xc8\x6e\xc8\x63\x61\xae\x6c\x65\x52\x0e\xbf\xec\x14\xbe\xe6\x5b\xc8\x3d\x3b\x9c\xf1\x79\xa8\x4e\xcc\x79\x6c\x69\x3e\x6a\x83\xe4\x3d\x74\xd8\x06\xc0\xc1\x35\x20\xa3\xcd\x2e\x70\xae\x4e\x59\x91\x4d\x51\xf4\x97\x93\x99\xba\x9e\xa1\x77\x72\xaa\x1e\xe1\xb0\xb4\x10\xb5\x8d\x81\x73\x98\x2a\x54\xd5\x03\xe2\xe0\x1a\xc8\x47\xeb\x76\x8d\xc9\x49\x35\x4c\xb0\xf4\xf7\x30\xed\x4d\xda\x7d\x9d\x97\xc6\x79\xbf\xd3\x62\x21\x71\xa4\xa7\xa7\xdc\x03\x0d\xda\xbd\x04\x71\x70\x0d\x28\xa2\x7f\x2a\x36\x20\xca\x1e\x29\xef\xbb\xf0\x6b\x9d\xc7\xad\x45\x42\xae\x7b\xb1\xab\x89\xbe\x4c\x94\x88\xee\x3e\xff\x04\xf7\x75\x84\x06\x40\x1c\x34\x0f\x18\x00\xee\x92\x06\xac\x3b\x4e\xd3\x00\x4b\x0e\xaa\x3f\xde\xc0\xdd\x5f\x1d\xa4\x92\x13\x5a\x64\xf4\x6a\x94\xf9\xb7\x75\x22\x69\xd7\xab\xf1\x3f\xab\xc9\x71\x0c\x8b\x40\x4d\xad\x40\x1c\x5c\x03\x3c\xf5\xf4\x57\xc8\x05\xad\x39\x9a\x4c\xfc\x35\x9c\xac\x6f\xb3\x51\x58\x53\xaa\xe6\xeb\x62\x8f\xe7\x17\x4d\x11\x38\x38\x75\xa0\x23\xe2\x82\x38\xb8\x06\xd0\x8a\x7c\x37\x85\x71\x9e\x96\xfc\xbe\x3c\xae\xbe\xe8\x63\x1a\xa5\xf2\x60\xe7\x31\x5a\xbf\xef\xf5\x4e\xbc\xe3\xcf\x71\x96\x49\x93\x88\xb8\x20\x0e\xae\x81\xf3\x0f\x46\xdf\x8a\xb3\x16\x98\x50\x7d\x6c\x5b\x91\x2c\x53\x43\x63\x0e\x58\x94\x0a\xbd\xe6\x5b\x64\x1b\x72\xff\xc7\xb7\xac\xce\x55\xa8\xc5\x09\x80\x83\x6b\x80\x8b\x4f\xae\x1a\xe7\x58\xe3\x57\xcb\xf4\xb0\x88\x6d\xa8\x93\x49\xcd\x13\xfc\x54\x4f\xdf\x35\x99\xdc\x46\x72\x86\x8f\xd8\x3b\xb6\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\x90\x89\x3a\xdd\x08\xb3\x85\x6b\xa4\xde\xdd\x54\xed\x89\x25\xc8\x4a\x64\x79\x9b\x2a\x4b\x41\xfc\x3c\x21\xf9\x3e\x69\xb8\x83\x83\x24\xf9\xbd\x64\x17\x62\x84\xa9\x04\x71\xc8\x46\x98\xc6\x06\x6d\xd8\x23\x51\x81\xfb\x67\x50\xb6\xc9\x37\xa7\x67\x0d\xed\xc7\x69\xd5\x74\xb3\x84\xbd\x52\xc3\x9d\x1b\x73\x79\x35\x12\x88\xc8\x20\x0e\xd9\x08\x53\x58\x7c\x2a\xb9\x81\x39\x4b\x2f\x91\x74\xe2\xbc\x78\x32\x82\x76\x49\x84\x13\xab\xf0\x07\x5e\x0d\x25\x96\xce\x1e\x6d\x72\xbd\x10\x22\x32\x88\xfb\x3f\x23\x8c\xff\x77\xe4\x7f\x7d\x8f\xb0\x96\x9a\xbf\xb0\x01\x46\x5c\x06\xe3\xc6\x58\xd2\x76\x1e\xff\xd5\xd2\x64\xd5\x07\xc1\x8a\xfd\x74\xfe\x24\x96\x22\x3f\x79\xb4\xa3\xfe\x36\xc2\x1e\x06\xb9\x07\x06\xb7\x9e\xfa\xb9\xcf\x8b\x69\x63\x8a\x68\x7e\x5a\x66\x53\xb8\x71\x81\x46\x23\x57\x8e\xa0\xf6\x1d\x57\xeb\x17\x91\xbf\x73\x68\xa9\x68\xfc\xa7\x03\xf6\xc0\xc3\x92\xa6\xa6\x91\x38\x76\x8f\xf5\x03\xa9\xb5\xf8\xed\xd0\x7b\x47\x75\xf8\xad\xac\xdf\xd6\x0f\xff\x6b\x46\x18\x34\xb4\xbf\x6b\x84\x91\x8c\x30\xae\x26\x45\x46\x9b\xc5\x9f\xef\x59\x3d\x9e\xf4\x0e\x72\x09\xdd\x44\xb8\x2c\xda\xeb\x42\x9c\x2d\xd9\xaf\xf9\x51\x47\x34\x0e\xa7\xce\x64\xb3\x12\xd9\x08\x73\x90\x9f\x13\xc3\x1c\x30\xca\xd8\x0e\xc8\x89\x28\xb3\x5d\xf9\xd3\x4b\x62\x17\xd3\xf7\x62\xae\x9f\xc4\x56\x8c\xd5\x82\x75\x60\xfc\x4c\xb6\x66\x91\x8d\xb0\x9c\xdb\x89\xd7\x60\x7d\xdd\x08\xcd\x33\x73\x85\xaf\xfc\x34\xf5\xe1\xfa\xae\xec\x03\xd1\x1f\x68\xc6\x82\x28\x1a\x1d\x99\x1b\xce\xa4\x35\x98\x14\xb2\x11\xbe\xe5\x1d\xd2\x76\xae\x71\x91\x3a\xe2\x52\x91\x0f\xb5\xf9\x4e\x5b\x2b\xfe\x3b\xf3\xe3\xc5\x61\x9f\xe8\x1f\xdb\x7d\xb5\xf7\x5f\x31\x9c\xc9\x68\x91\x8d\xf0\xd8\x8d\x41\x19\xee\xe4\x6e\x27\xae\xdd\x81\x3d\xca\x3f\x1f\x9e\x29\x48\xf4\xd0\x47\x5d\x62\x4d\x1c\x51\x78\x4d\x15\xce\x34\xcd\x76\x66\x46\x18\x24\xa2\x53\xdb\xc5\xee\x8f\xa4\xa9\x6c\x34\x6d\xb9\x56\x66\x92\xa1\xba\xf8\x8b\xf6\x75\x65\x3f\xb2\xc2\xf2\xf7\xb6\xba\x2d\x8e\xb6\x26\x50\x22\x03\xb5\x8b\x05\x70\xf0\xcc\x87\xa5\xc2\x82\xfe\x4d\x74\x60\xea\x38\xe4\xd5\x51\x98\x60\x9a\x80\xe7\x49\x7f\xc3\x37\x1b\x3f\x9a\xe6\x5c\x6d\x9e\x96\xac\x0d\xe8\x93\x2a\x88\x83\x67\x3e\xcf\x38\x34\x52\xe7\xaf\x8b\x85\x6b\x5d\x77\xe3\x66\xa2\xf4\xd6\xa8\xa8\x7f\xac\xd5\x63\xf1\x87\xef\xf5\xaa\x72\x3d\xe0\x20\x82\x32\x2a\x88\x83\x67\xbe\x52\x65\x36\xb3\xd0\x48\x14\xf2\xf1\xf1\x8e\xf6\x57\x03\x22\x11\xb4\xfc\x1b\x24\x53\x4e\x49\xae\x87\xd2\x2a\xde\x15\xe6\x85\x98\x88\xb8\x20\x2e\x40\xe6\x7f\x67\x51\xbf\x37\x15\x96\x9c\xe4\xe3\x7f\x56\x70\x62\x66\x19\x1f\x48\xb3\x48\xa4\x9e\xef\x9e\xfe\x71\xac\xd6\x40\xfa\xb3\xd2\x8e\x5a\x2f\x13\x61\x84\x41\x1c\x54\x23\xfc\xcf\x46\x18\xf4\x42\x9f\x26\x01\x01\x5b\x5e\xc5\x4e\xba\x26\x27\xb3\xc3\xe7\xe7\xb6\x7b\x8f\x57\xb3\x57\x14\xc3\xe4\x25\xde\x75\xce\xde\x4c\x28\xfc\xc5\x6b\x08\x19\x40\x10\x07\x97\x80\x8e\xe9\xcb\xaa\x45\xc9\x99\x63\x3d\xcf\x71\xbc\xfe\xc2\x4a\xcd\x96\x55\xdc\x97\xb7\xec\xa4\x6d\x38\x47\x25\x33\x8d\xa5\x1d\x7a\x11\x71\x41\x1c\x5c\x02\xd4\x0f\x14\x19\xe5\xd0\x1f\xd6\x93\x77\x0b\x59\x30\x1d\x97\x10\x9d\x84\xf1\xf6\x56\x2f\x07\x36\x19\xa8\x2a\xb1\xbd\xcb\xf3\x80\x76\xed\x40\x1c\x5c\x02\x54\x5f\xf7\x5e\xf5\x1b\xe6\x29\x87\x44\x2a\xe7\xa1\xa4\x9a\x11\x25\x50\x45\x29\xb5\x91\xaa\x69\x44\xdd\x69\x72\x54\xc1\x08\x82\xae\x63\x01\x71\x70\x09\xd0\x7c\x59\x72\xfc\x68\xf7\xc9\xe0\x60\xec\x90\x2b\x8c\x68\xba\x5a\x80\x7f\x32\xea\xa7\xf2\x2c\x21\x8d\x3b\x93\x93\xd3\xdb\x9c\x2a\xc4\xe2\x07\xc4\x41\xb5\x81\x00\x23\x0c\x9a\x5d\x4f\xd3\x80\xd8\xb4\x9f\x8f\xb5\xe7\xaf\x8d\xde\x66\xc6\xf7\xd4\xea\x12\xa5\x44\x65\x05\xda\xba\x93\x7f\x18\x98\xd3\xa8\x04\x36\x2a\x97\xa1\xdd\x7b\x10\x07\xd7\x80\xe8\xd4\x35\xe9\x29\x55\xf5\xe9\xc1\xca\x9e\x2c\xbb\xcd\x94\x58\x9e\x83\x3f\x98\xd7\x23\xef\x4e\xb9\x89\xcb\xd6\xd1\x69\xfb\x05\x23\xe2\x82\x38\xb8\x06\x18\x8f\xd0\xc7\x56\x73\xae\xbd\x97\x3a\xac\x31\x5b\xbe\x96\xa1\xc1\xd7\x1e\xba\x9e\x54\x5a\x3f\x64\xd4\x55\x50\x33\x31\x99\x0a\x35\xc9\x01\x71\x70\x0d\xd0\xfd\xd6\xb7\x8c\xcc\x2b\x19\x2d\x1b\xcb\xe2\x7e\xbc\x2b\x13\x39\x46\x13\x80\x56\x52\xb6\x5e\x10\x7c\x95\x37\xc3\x53\xae\xfd\x06\x22\x2e\x88\x83\x6b\x80\xeb\x71\x71\x89\x29\x4f\x5a\x7a\x6f\x3a\xcd\xdb\xd1\x2a\xdb\x82\x87\xe2\x8a\x49\xdd\xc4\x55\x3c\xb9\x51\x71\xbf\xd1\x4c\x26\x28\xa0\x05\x30\x80\x83\x6a\x03\x01\x46\x18\x94\xea\x4e\xd3\x80\x72\x5d\x78\xa0\x7e\xdc\xc5\x5a\x03\x54\x05\xda\x3b\x0a\xd3\x7f\xd4\x2a\x25\x92\x9b\x8c\x98\x30\xcb\xa5\x18\x63\x0c\xf2\xa4\xa0\xdd\x35\x10\x07\xd7\x80\xb8\x8e\xbd\x64\x73\x03\x65\xa9\x5c\xe1\x9b\xed\x73\x7e\xaa\xe7\xcd\x9e\x44\x0e\x5a\x8f\x45\x78\xc5\xf2\x5c\x3d\x98\x12\x0d\x81\xfa\x1b\x82\x38\xb8\x06\xee\x55\x38\x4a\xb8\xd6\x9c\xab\xfd\x68\x8d\x89\xee\x17\xb7\x44\x67\x44\xcc\x9a\xff\x49\xe9\x3d\x09\x19\xc6\x6f\x99\x97\xea\xde\x56\xd0\xce\x2d\x80\x83\x6b\xc0\x7a\xd1\x15\x03\xff\xd6\xd6\x75\x66\x56\x97\x11\xc7\x03\xcf\x06\xe3\x2c\xf7\xd1\x46\x9a\x54\xcc\xd0\xb8\xf4\xbe\x8b\x9f\x7a\x18\x10\x71\x41\x1c\x5c\x03\xdc\x07\xc2\xd5\x2f\x94\xf0\x05\xb7\x9f\xdf\xe0\xe3\xda\x58\x8e\x18\xbe\xa7\xf9\x00\x67\xae\xd1\x2a\x55\xcd\x5b\xba\xf3\xf1\xf4\x55\x84\x06\x40\x1c\x34\x0f\x00\x8c\x30\x68\xdd\x71\x9a\x06\xe4\x58\xea\xde\xb0\x94\x5f\x27\x3c\xe2\x0a\x73\x6b\xdc\x26\x4c\x5b\x97\x4c\x8b\x7f\xeb\x9f\xa3\xfa\xd2\xa7\xfa\xdb\xd8\x22\x19\xf4\x4c\x41\x1c\x5c\x03\x35\xd6\xd9\xeb\x0c\x1b\xba\xe9\x2d\x37\x23\xfa\x23\x17\x8b\x48\x04\xd4\x48\x82\xbf\x2b\x97\xc6\x35\x2f\xfd\xa9\xd9\x42\x5b\x82\x8e\x1a\x83\x38\xa4\x86\x69\x1b\x83\x73\x3e\x8b\x0b\x03\x5e\xbd\x0f\x83\xfd\x92\xf8\x3a\x2a\xec\x7f\x76\xbf\x17\x5d\x7f\xbd\xcb\xf6\xeb\x41\xef\x33\x1d\xe8\xef\x05\x71\x70\x0d\x3c\xe2\x88\x15\x4c\xe8\x2a\x7e\xae\x38\xbe\xb3\x9e\x63\xf1\x45\xf7\xe4\x69\xda\x17\x55\x8a\x80\x84\x97\x73\x26\xbd\x47\x82\x35\x49\x88\xb8\x20\x0e\xae\x01\x4b\xb1\x4a\xf3\x6b\xb3\x02\x26\x02\x9a\x1f\xae\xdc\x78\xfa\x90\x70\x43\x8a\x78\xe6\xe5\xce\xf9\x43\xe3\x94\x6d\x8b\x96\xc9\xcd\x3c\x84\x06\x40\x1c\x34\x0f\x00\x8c\x30\xc8\x44\x9d\x6e\x84\xe9\x69\x02\xb4\xaf\x59\xaf\xa1\xa3\x95\xb2\xd1\xfc\x62\x1a\x68\x8d\x96\x08\x1f\x11\xbd\x57\xa7\xd5\xae\x52\xc5\xf5\x28\xfb\x2d\x64\x57\x41\x1c\xb2\x11\x7e\xcc\x7e\xa7\x74\xea\x65\xdd\x98\xcf\x6b\x0e\x15\x66\xf6\x28\xaa\x5d\x62\xae\xf9\x2c\x3c\x0e\x37\xfd\xbb\x3d\x4c\x1d\x82\xfc\x90\x5d\x05\x71\xc8\x46\xb8\xa2\xed\x33\xcd\xfa\xb3\xaf\x1a\xc4\x74\xf1\xbe\xa2\x5a\x03\x8f\xe3\x1f\x2d\x69\xa9\x11\xa7\x65\x04\xcb\x64\x2f\x1b\x45\xcd\x0a\x20\x22\x83\xb8\xff\x33\xc2\xff\x73\xf7\xf3\xbf\xbe\x47\x98\x9e\x99\x8f\x4a\x50\x5c\xfb\xe7\xac\xc0\x87\x25\xc7\x28\x2a\x0e\xf7\xef\xd3\x54\x59\xf8\x8f\xce\x4d\x7f\xd2\x7d\x32\x1d\x56\x9e\xf2\xb7\x11\x16\x7d\x54\x7d\x65\xcb\x54\x2c\x8b\x2c\xd2\xb6\xae\x5d\x2d\x18\xab\x52\xd8\x41\xe7\xab\x13\x71\x56\x20\x91\x37\xff\x07\xb2\x78\xc1\xbf\xd0\x4b\x1b\x15\x58\x72\x82\x1f\x5b\x18\xe6\xf4\x57\x34\x76\xb5\x44\x24\xad\x8a\x94\x9c\xd2\x25\x2f\x79\xda\x8c\x98\xd8\x0f\xe9\x30\xfe\xd7\x8c\x30\x68\x68\x7f\xd7\x08\x2b\xc3\xcd\xd2\x2c\x6f\x81\x6e\xd9\xcd\xa8\x35\x9a\xc3\x66\x22\x86\x97\xd8\x58\x99\x4a\xb8\x14\x38\x94\xd5\x9f\xf2\x45\x35\x1e\x1f\xff\x96\x9c\x3d\x93\xcd\x4a\x64\x23\x6c\xbc\xba\x7f\x4f\x5b\xa2\x9f\xf6\x50\xb5\x8a\xd0\x9d\x75\xab\x28\xd4\xe2\x8e\xf7\x1d\xe9\x9b\xfb\x8d\xa6\x96\x14\x19\x09\x13\xb7\xcf\x64\x6b\x56\x13\xf9\x66\x5d\xf2\x5e\x0f\x7a\xc7\x6e\xb6\x7a\xc9\x42\x1e\x9d\x62\xed\x1c\xed\xc8\xca\x94\x27\xc1\x2a\x8c\x45\x7c\xaf\xb6\x71\x27\x86\x98\xce\x64\xb4\xc8\x46\xd8\xf3\x7c\x5d\xe5\x9c\xf7\x9a\x0b\x8b\xb5\x8a\xeb\xac\xb0\x10\x2e\x7f\xca\x3b\xa7\x4b\x65\xd8\x74\x96\x95\x85\x2e\x75\x25\x5d\xe8\x67\x32\x5a\x17\xa4\x9f\x4d\x90\x9e\x1f\xad\x49\xb5\x8d\x12\x9d\xdf\xbb\xae\x46\xf8\x44\x27\x36\x7d\x8c\x32\xc9\x75\x59\x56\xbe\x1d\x83\x50\x32\x2d\xeb\x0c\x7a\x64\x1b\xfc\x3b\x11\x9d\x96\xf9\xae\x76\xbd\x6c\xfd\xb3\xfb\xa3\x52\xa8\x73\xdc\x7d\x57\x75\xab\x69\x9a\xff\x0e\xcb\xe0\xed\x6e\xaa\x17\x26\x0a\x0b\x25\xd7\xd1\x98\x11\x33\x3e\x88\x83\x67\x3e\x85\xd4\xb7\x09\x33\xc3\xa2\x78\xc1\xc4\x4a\x52\x9f\x03\x3c\xaf\x63\x45\x13\xee\xdd\xcf\xbc\xe2\xf7\xba\x81\xb2\xc9\xba\xd9\x12\xda\x11\x06\x71\xf0\xcc\xd7\x16\xb2\xff\x80\xa7\xd4\x94\x20\x4c\xfc\xf5\x68\x27\xf5\xb0\x65\xb7\x48\x64\xdd\x83\xd7\xfc\xda\x1b\x63\x56\xb6\x41\x93\xf9\x50\x4d\x33\x88\x0b\x90\xf9\xdf\xd6\x80\xa4\x97\xcc\x44\x9c\x4a\x84\xb7\xf1\x75\xec\x34\x14\x7b\x8a\x9d\x9f\x2e\x59\x76\x33\x9b\xe9\x73\x5f\x62\x61\x5a\x48\x11\x5d\x86\x3a\xa4\x80\xb8\x00\x99\x73\xff\x13\xf7\xc1\xae\x50\x01\xa9\xa8\xde\x70\xa7\x51\xed\x95\x7b\xdb\x74\x14\x5b\xd5\x9b\x0c\x84\x5b\x55\xc1\xd3\x94\x99\x74\xf1\x0c\xda\xb4\x08\x23\x0c\xe2\xa0\x1a\x61\xe5\x7f\x5c\xfc\x80\x5e\xe8\x53\x8f\x44\xda\x9a\xaf\x1e\x6e\xe2\xb9\x46\x5c\x18\x8e\x8b\x30\xc4\x1f\x9d\xd2\x74\xe1\xa4\xcf\x0d\x14\xbc\x72\x83\xa1\xbe\x6b\xdb\x18\xda\x59\x01\x71\x70\x09\x7c\x20\x8b\xe0\xf3\xf4\x72\x61\x97\x4b\xd1\xe3\x66\x8c\x2f\xa3\x27\xfd\x24\x5f\xe6\xf9\x44\xab\x80\x25\xe5\xc9\x4e\x0b\x9a\x42\x13\x22\x2e\x88\x83\x4b\x00\xff\x20\x3e\x1c\xf5\x57\x4b\xd1\x79\xad\x89\x5a\x92\x9e\x07\xfe\x73\x4d\x61\xad\x0e\xe4\xed\x37\x54\xae\xe5\x53\xf7\x07\x39\x71\x22\xe2\x82\x38\xb8\x04\x8c\x37\xc7\x9e\x7c\x1e\xe2\x30\x0d\xdd\x6b\xdb\xda\xb7\xef\x3f\xff\xf5\xc7\xda\x33\xa1\x8f\x51\x21\x38\x1f\xe7\xb0\x2d\x7f\xa4\x43\x77\x52\x82\x38\xb8\x04\x12\xaf\x1f\x26\x15\x12\xa7\x7b\xe8\x5c\x9b\x1c\xb4\xc2\xc0\x23\xe0\x61\x9a\xb1\xe0\x2a\x74\xf1\x10\xcc\xfa\x76\x01\xcb\x3a\xec\x13\x62\xf1\x03\xe2\xa0\xda\x40\x80\x11\x06\xcd\xae\xa7\x5e\xa1\x65\x8f\xfa\xf4\xf6\x2a\xcb\xfd\x5f\x54\x05\xaa\x0c\xd7\x16\x7e\xbc\xf8\x8c\x7e\xd2\xd8\x9a\xc6\x40\xed\xf0\x30\xa9\x58\xb8\xe7\x17\xd4\xcc\x06\xc0\xc1\x35\x20\x8d\xcd\xb6\x65\x82\xc6\xfc\x34\xa0\xf8\xf0\x05\x17\x79\xe8\x82\x13\xae\x99\xb1\xc5\x64\xe8\xc4\x3c\xdd\x76\xc4\x06\x51\x0b\xd4\x80\x09\xc4\xc1\x35\xf0\xfa\xaa\x79\x9e\xa3\x6d\x0b\x39\x9a\xc3\xeb\xda\xdd\xa4\xdb\xa3\x5c\xfd\xec\x77\x2e\x5a\xc8\x55\x1d\x69\x78\x11\x63\xe7\x10\x46\x23\xe2\x82\x38\xb8\x06\x50\x15\x7b\xdd\xdf\x3a\x0a\x1b\xd6\x3b\xcc\xb3\xd3\x1e\xba\x19\x31\x46\x4b\x99\xa7\xb1\x0c\x2b\x7f\x97\x27\x09\xd7\xca\x9c\x84\xba\x5c\x83\x38\xb8\x06\xf8\x97\x2e\xe0\xff\xc0\x98\x61\x97\x39\xa6\x5f\xa1\x70\xe5\x0c\x44\xff\x30\x22\x97\xd8\xf8\x29\xc3\x55\x32\xb9\xd5\xa2\x96\xc0\x10\xa1\x01\x10\x07\xd5\x06\x6a\xfe\xb3\x06\x40\xa9\xee\x34\x0d\x64\x45\x5d\xd5\xd1\x57\xbf\xdc\xe6\x7d\xd4\x35\xd9\xd2\x2e\xd8\xcd\x20\xdb\x4d\xbd\x53\x9b\x26\x69\x32\xeb\xb8\x9c\xf2\xe1\x0a\x74\x7f\x2e\x88\x83\x6b\x00\xf3\x82\x49\xd8\x85\xca\x6c\xf1\x92\x47\xd5\x65\x7a\x81\xa5\xd3\xb8\x15\xce\x11\xba\x6b\xbd\x5b\x98\xe6\x1d\xd1\x17\x66\xf8\x4c\x10\x71\x41\x1c\x5c\x03\xb6\xd8\xcc\x57\xee\x0a\x6b\xa1\x18\x6e\xfe\xb8\xe5\x1d\xdf\x5e\x80\xfa\xb5\x31\x7c\xcd\xd5\x6e\xa2\x33\xaa\x9b\x81\x36\xc4\x08\x3a\x19\x02\xe2\xe0\x1a\x60\x5e\xbb\x8d\x26\xc4\x1f\x5d\x56\xef\x78\x33\xdb\x62\x79\xdb\x48\x5e\x9c\x47\x5f\x7a\xfb\x73\x1f\x87\xfb\xf6\x3b\xe5\xe4\x20\x2c\x44\x5c\x10\x07\xd7\x40\x84\x34\xa6\xf9\x95\xd1\xa5\x81\x77\xcd\x6e\x93\x63\x95\x35\xd4\x18\x44\xa6\xc4\xe8\x8f\x74\x5e\x89\x71\x73\xf5\x3c\xd9\xd3\x8f\x45\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\xd6\x1d\xa7\x69\xa0\x7b\x58\x56\x24\x1c\xa7\xde\x3d\x42\xac\xa1\xca\xa3\xdd\xe3\x9e\x86\x6a\x15\x6a\xcd\xec\x02\x75\xbc\x75\x4a\xe4\x7c\x59\x59\x11\x62\xec\x20\x0e\xae\x01\x75\x1b\xa7\xa6\x5d\xe3\x7a\xce\x8a\xf7\xcb\xb9\x4d\xab\x2a\x8b\x16\xc3\xb2\xb4\x21\xb6\x93\x38\xd3\xf6\x7e\x37\x5b\x52\xdc\x6a\x11\x71\x41\x1c\x5c\x03\xdb\x4b\xfd\x24\x2f\xe6\x28\xaf\xf2\x31\x3d\x5a\x8f\xbc\x5f\x65\xf0\xb2\xf2\xce\xcc\x0b\xef\x68\x31\xec\x9e\x30\x56\xd2\xa4\x38\x54\xe8\x14\x0f\x80\x83\x6b\x60\x7d\x42\x21\xf9\xb7\xac\x67\xda\x23\x14\x97\x5b\x98\x12\xd8\x74\x3f\x82\xf2\x6a\x04\x5b\x1b\x43\x71\x8c\x99\xe5\x8e\x12\x6a\x73\x11\x71\x41\x1c\x5c\x03\x58\xe4\x94\xc1\x4e\xcf\x03\x5e\xfb\xda\x4d\x7b\xec\xe6\x1e\x16\xb7\xf2\x6c\x4a\xa0\x7e\x56\xfd\x88\xcf\xbd\xa4\x77\x22\xad\x69\x83\xd0\x00\x88\x83\xe6\x01\x97\x7f\x36\xc2\x20\x13\x75\xba\x11\x8e\x60\xb9\xf0\x98\x3c\xeb\xf7\xf5\x00\x51\x5d\xae\xef\x7d\x55\x6f\x03\x7c\xb0\x27\xf8\x46\xe9\x4b\xd4\x32\xe2\xcb\x6b\xc5\x58\xbf\x20\x4c\x25\x88\x43\x36\xc2\xaf\x2f\x0d\x09\xe4\xda\xa6\x9e\x53\x11\x11\xc2\xaa\xa1\xd2\x93\x7c\x99\x1a\x90\x2a\xfa\x14\xaf\xa9\xaf\x27\x6a\x46\x53\xe6\xae\x27\x22\x32\x88\x0b\x90\x43\xa1\xfd\xdf\xc8\x44\x8a\x4b\x69\x9a\x3a\xbf\x70\x54\x3f\x24\x3d\x58\x6d\x60\x63\xbd\x1b\x94\xf5\xe6\x51\x77\x73\xf8\xca\xbb\xd5\xa6\x66\xd9\x94\x35\x44\x64\x10\x17\x20\x77\x0e\xf6\x34\xfe\xf5\x3d\xc2\xc1\xb2\xa6\x56\x0e\x98\x64\xaf\x23\x0a\xfc\x29\xbf\xb6\x68\xbd\x70\xb1\x38\x26\xda\x2b\x55\x53\x96\xfe\x42\xf2\xb8\xf8\x75\x4b\xe6\xdf\x46\x58\xf3\x32\xdb\x87\x2f\x52\xea\xce\xda\x47\x0e\x9c\xe7\xe8\x0c\xc8\x43\xd4\x55\x36\xfa\x63\xbb\xc2\xd6\x3e\x2d\x78\xfd\xe8\xc5\xd0\xfc\x0b\xbd\x3b\x9f\x3f\xf5\x3e\xc3\x44\x6a\x34\xe2\x21\xbe\xf7\xaa\x17\xf7\xb3\x2e\x96\x9a\x3d\xf9\x20\x7f\x6f\xcb\x4f\x47\xa6\xc5\xba\x8e\xff\x35\x23\x0c\x1a\xda\xdf\x35\xc2\x48\x46\x98\xb6\xa1\x65\x2b\x21\xd5\xcb\xdb\xb0\xcd\xc2\x44\xb5\x76\x85\xbc\xe4\x31\x13\xd9\x7c\x5a\x6f\xbe\x23\x45\x52\x10\x91\x03\x75\xe4\x99\x6c\x56\x22\x1b\xe1\xa9\xd7\x3d\xbc\xf3\x77\x12\x87\xb1\xe6\x13\x1b\x30\x13\x1f\xe4\xfd\xdc\x47\xb3\xcd\x38\x7a\x50\xfc\x8c\xa5\xe8\x2b\x46\xc2\x9f\xdd\x33\xd9\x9a\x45\x36\xc2\xee\xc5\x35\x7c\xf4\x44\xdf\x57\xf7\xd9\x7f\x75\xe4\x17\x1d\x4e\x58\x5a\xa1\xb9\x37\xcc\x7e\xe2\x1b\x3f\xcf\x54\xec\x16\x85\x43\x73\x26\xa3\x45\x36\xc2\xc2\x58\x42\xe6\x97\xeb\xbe\xfc\xac\x33\xab\x40\xf1\x7c\x67\xfa\xe3\xbd\x35\x45\x48\x07\xa6\xb5\x24\xd3\x5d\x1b\xf1\xac\xda\xca\xce\x33\x19\x2d\xb2\x11\x4e\x7e\x3f\x48\x16\xe1\x96\xc7\xbd\x59\x1f\x6b\x4f\x8b\x95\xd3\xf8\x7a\xb1\x4a\xf6\x62\xf6\xa6\xad\x73\x2b\xa6\xfd\x27\xad\x14\xbe\x33\x33\xc2\x20\x11\x9d\x96\xf9\xf4\xde\x4a\x28\x4b\x64\x87\xaf\xd0\x62\xd6\xce\xa2\xa2\x8d\xd9\x89\xdf\x56\xde\xe8\x73\xad\xae\x54\xde\x9e\xb8\x8e\x8e\x6b\x45\x0c\xb5\xde\x04\x70\xf0\xcc\xe7\x56\x20\xba\x5d\x7d\xef\x5a\x6c\x3e\xc9\x87\xed\x82\xfc\xf6\x0c\xb3\x91\x48\x87\x43\x9c\x9a\xe6\x05\xef\xf6\xb9\x8f\x46\xc7\x90\x0b\x02\x71\xf0\xcc\x97\xda\x76\xee\x58\xf1\x7b\x17\x85\xd2\xc4\xe5\xcd\x73\xf2\x36\xee\xf9\x9b\x37\x4d\x76\xe7\x2f\x92\x9e\x70\x19\x84\x48\xf2\x31\x88\x20\xe2\x82\x38\x78\xe6\x5b\x45\x2d\x6a\xb1\x3d\x2c\xc4\xac\xba\xda\x5d\xa8\xb1\xee\x26\xc3\x6a\xfa\xd8\xf7\x69\x1c\x7e\xf3\x34\xf7\xcb\xd8\x30\x5f\x92\x05\x44\x5c\x10\x07\x8f\x1b\x4f\x31\xa4\x4d\xd7\x79\x35\xfa\xad\xd9\xb9\x66\xf9\xad\x59\xce\xa7\xb8\xb7\xac\xe7\xf8\x93\xa9\xf7\xbc\xf6\x65\xdc\xd3\x34\xb0\x10\x46\x18\xc4\x41\x35\xc2\xff\x6c\x84\x41\x2f\xf4\x69\x12\x78\x1a\xf7\xdc\x2a\xe8\x99\xe4\xc3\x47\x47\xe3\x83\x41\xf8\x54\x3d\x1f\x5f\xdd\xd9\x28\x9f\x0e\x2d\xcf\xd9\x63\x0c\xfe\x5d\xf7\x01\xfa\xfa\x0d\xe2\xe0\x12\xb8\xfb\x89\x72\xd4\xa3\x8b\x6b\x93\xf0\x44\x3d\xde\x4e\x19\x8f\x39\x85\xb9\xbe\x2a\xdc\x44\xf3\x7c\x77\x07\x3a\x19\x86\x68\x30\x74\x17\x23\x88\x83\x4b\xc0\xa0\xaa\x73\xa0\x4e\x94\x87\x75\x7b\xbf\xbd\x8a\xbf\xe7\x88\xea\x1a\x1e\xcf\xae\x20\xdf\xf0\x9b\x15\xda\x70\x7a\x22\xe3\x94\x12\x44\x5c\x10\x07\xff\x57\xbd\x93\xa1\xd8\xe0\xa2\x28\x53\xfa\xd8\x13\x78\xa3\xcd\x45\x29\xa2\x7f\xe2\x85\x8d\x32\x71\x17\xda\xfd\x2a\x22\x2e\x71\x4f\x75\x1b\x44\x5c\x10\x07\x8f\xeb\xae\x47\xe0\x96\x69\x7e\x5e\x22\xa3\xa5\x77\x25\x83\xd5\x4b\x37\x46\x6c\xac\x75\xa5\xdf\xe9\x97\x80\xc2\xda\x80\xc1\xbc\xbd\x1c\x54\x1b\x08\xe0\xa0\xda\x40\x80\x11\x06\xcd\xae\xa7\x69\x80\xfd\xa2\x8d\xed\x55\x1d\x8e\x32\x95\xcc\x07\xde\x56\xfe\xb9\xf1\x4a\x34\xd2\x49\x8c\x64\x36\xe4\x57\xd0\xf7\x0a\x39\x05\x6a\x36\x10\x63\x07\x71\x70\x0d\xc4\x36\xba\x5c\xbc\xf7\x23\x76\xbc\x2b\x6e\xf8\x4d\xf3\x22\xbf\x72\x5b\x7a\xf8\x8b\x87\xee\x7e\x5e\x17\x54\x7e\x71\xb5\x90\xdf\xba\x8f\x88\x0b\xe2\xe0\x1a\x50\xce\x63\x3b\x27\x88\x4d\xdb\x4e\xe8\x78\xeb\xa2\x7c\xde\xde\x0f\xce\x84\xf2\xfc\xb8\x84\x91\x19\x83\x34\x1a\xdf\x2d\xc5\x29\xe8\x63\x08\x88\x83\xff\xaf\xfc\xa2\xde\xdd\x6d\x8a\xc9\x6c\x19\x8a\xb9\x50\x12\xa5\xd5\x74\x7d\x33\x43\xc8\x77\xe2\x2e\xca\xb7\x21\xf9\x68\xb9\x9b\x4c\x6e\x50\x5c\x10\x07\x8f\xeb\xba\x89\xe5\x54\xec\xb0\x68\xde\xfe\x7d\x74\xe7\xa5\x88\x1f\xe3\xb3\x3b\x4a\x2a\x91\x5f\x87\xc2\x1d\x5e\xec\x1b\x15\x96\xe5\x87\x20\x34\x00\xe2\xa0\xda\x40\x80\x11\x06\xa5\xba\xd3\x34\x70\x30\xb8\xf3\xc6\xe8\x66\x64\xa7\x61\x8f\xfe\x07\xf9\x24\xd3\x3d\x0f\x55\x1f\xda\x63\xa3\x86\x55\xde\x94\xcb\xfa\xf6\x45\x76\x55\x88\xb1\x83\x38\xa4\x2a\x99\x8b\x1e\x93\x4a\x8c\xbb\x7d\x7f\x8c\xef\x7a\x64\x8f\xba\x79\x08\xcd\xe4\x4e\x6b\xeb\x8b\xa4\x57\x47\xee\x3a\xd2\x4a\x78\x75\x40\x55\x32\x00\x0e\xae\x81\x41\x99\x2a\x6a\xb5\x89\xac\xae\x3b\x69\xf9\x32\x2c\xc4\xe2\x97\xc8\x4a\xd6\xa3\x94\xbf\x25\x26\xa5\xb9\x85\xb8\xdd\x6a\x3a\x88\x42\xc4\x05\x71\xf0\xff\xd5\xda\xa3\x80\xa4\x88\x79\x9a\xd5\xb0\xdd\x9f\xde\x6c\xa1\xa2\x82\xfd\x84\x83\xb5\x58\x91\x17\xb5\x4d\xe9\x86\xa7\x8f\x52\x5b\x02\x11\x71\x41\x1c\x3c\xae\xff\xed\xdb\x7a\x96\xb5\x72\xf6\xbf\x63\x5f\x27\x3c\x7c\xf6\x27\x89\x3b\x46\x09\xe7\x31\x8a\xfe\xf2\xdd\x96\x1f\x73\x43\xa9\x12\xb7\x11\x1a\x00\x71\xd0\x3c\x00\x30\xc2\xa0\x75\xc7\xa9\xa7\x02\x16\x1d\x72\x85\x4c\x51\x06\x66\x51\x33\x57\x44\x1c\xc8\x54\x72\xef\x16\xe5\x90\x39\x5e\x28\x1a\xc1\xca\x0b\x9f\x4a\x65\xab\x80\xde\x2b\x00\x07\xd7\x00\xe9\x3a\x8d\xc8\x5b\xa6\xc6\x9a\x7b\x3f\xe6\xf3\x79\x2e\x37\x5f\xaf\x1b\xd0\xe9\xb3\x94\xb2\x67\xc7\xbc\xdb\x9a\x4b\xf6\xbe\x2e\x02\xfa\xce\x0c\xe0\xe0\x1a\x58\x09\xec\xfc\xb2\xac\x58\x64\x23\xe6\x37\x8c\xe3\xf6\x7d\x81\xd0\xee\x53\x98\xb8\x56\xf4\x03\xb1\x2b\x81\xe5\xb5\x0f\x49\x99\xa0\x2b\xbf\x40\x1c\xfc\x7f\xa5\xef\x91\x5a\x8f\xff\x71\x2b\xa6\x77\x8f\x7d\xaf\x32\x74\x34\x81\x12\x5b\x03\x53\x8b\x9c\x74\x70\x3f\x82\x5b\x59\xaf\xe5\x0e\xd4\x34\x0f\xc4\xc1\xe3\xf2\xd5\xd5\x58\x55\x5d\xb0\x7b\xec\x9f\x5c\x96\xc1\xfc\xa6\xce\x15\xeb\x63\x84\xb4\xc5\xe5\x43\xe6\x3b\xcf\x1f\xc8\xb9\x38\x69\xe6\x22\x34\x00\xe2\xa0\x79\x00\x60\x84\x41\x26\xea\x74\x23\xcc\x4e\x9d\xe6\x51\xd7\x33\xe3\x75\x34\xd9\xbe\x58\x4b\xcc\xd2\xfd\x9c\x6d\x62\x51\xe3\x7c\x48\x27\x41\xd7\x7c\x43\xe6\x30\xce\x7d\xe8\x92\x23\x00\x87\x6c\x84\xed\xbe\x94\xb7\x39\x0a\x32\xcc\x1f\x4d\xe5\xda\x59\x89\x52\x5c\xde\xea\x4c\xc9\x31\x4b\x77\x0d\x30\xc5\x6a\xbb\xaa\x4c\xe9\x4a\x86\x88\x0c\xe2\x90\x8d\x30\xe9\xec\xfe\xd5\x2f\xd8\xbe\xbe\x8a\x05\xf6\x99\x37\x0f\x69\x8d\x75\x16\x73\xf0\x0e\xdf\x62\xe1\xc4\x86\x6f\xfc\xd9\xd0\x1e\xe9\x42\x44\x06\x71\x01\x72\xe8\xb0\xa7\xf1\xaf\xef\x11\xc6\x53\xfb\x62\x33\x8e\xae\x68\x24\x92\xdc\x52\x88\x2d\x7a\xe3\x92\xe6\xb9\x3c\xd1\xab\xcc\xbd\x9c\xe1\xa3\x5d\xe8\x33\x06\x25\xbd\x7f\x1b\xe1\xa0\x66\x5d\xe9\x18\x4f\xe6\xc7\xcf\xef\x2b\xed\xd2\xe4\x37\x8c\xe6\x5d\xff\x1c\xab\x39\x63\xda\xe4\xa0\xef\xa0\x2e\xf0\xad\xe1\xda\xdf\x27\xca\x8e\x3f\x3f\xbd\x3e\x41\x11\x66\x6e\xab\x5a\x96\xa5\xab\x3d\xbb\x8e\x52\x22\x72\x7e\xed\x13\xd7\x9f\xc0\x3f\x7b\xdf\x1e\xfd\x2c\xf9\xaf\x19\x61\xd0\xd0\xfe\xae\x11\x46\x32\xc2\x8b\xde\xf6\x95\x26\x55\x24\xa3\x35\xbb\x0a\x1c\x5f\x19\xcf\x8f\x79\x59\xbc\x2f\xc5\xd8\x12\xc6\x4b\x92\x2b\xcb\xe0\x54\x7d\x83\x7a\x26\x9b\x95\xfc\x48\x1e\x4d\xd9\xe1\x3c\x99\xec\x84\x2e\xd3\xb8\x82\x2d\x93\xd5\xe8\x4b\x51\x91\x97\xdb\x53\x1e\x7a\x7d\xc2\x61\x9c\x8c\x1d\xe4\x5c\x17\xce\xa6\x7d\x33\xb2\x11\xde\x88\x11\x35\x54\x7d\x42\x76\xa5\xa0\xb2\xe8\x4a\x55\x2a\xc1\x3b\xf5\x8f\xb9\x9b\xbf\x79\xef\x1f\x1f\xca\x46\xc5\x49\x45\xbf\xe9\x3d\x93\xd1\xde\x45\xfa\x59\xbc\x2f\x93\xe7\x6c\x97\x0a\xcd\xdb\xe8\xe7\x84\x82\x13\x15\xf0\x93\xf4\x66\xfa\x44\xfc\x1c\x3f\x7e\x90\x9e\xe9\xdc\x1a\x32\xa3\x38\x93\xd1\x22\x1b\xe1\x85\x5f\xf4\xb6\xda\xda\xcb\x78\xfc\x93\x54\x34\xd7\x74\xec\x2d\xd0\x84\xc4\xa2\x25\x31\x6b\xdf\xad\x29\x36\x64\xac\x68\x7b\x2b\x9e\x99\x11\x06\x89\xe8\xd4\x0b\x44\x35\x0e\xe7\xb7\x0d\xeb\x8d\xa6\xf7\xc5\x84\x2d\xb5\x88\x13\x29\xce\xf9\x99\xca\x72\x87\x88\xb8\x2d\xf9\xb3\xd8\x7a\x07\x41\xe7\xc0\x40\x1c\x3c\xf3\x75\xd3\x14\x8d\x88\x04\x2d\x27\xef\xb3\xa9\x1f\x57\x1e\xd7\x8d\x2a\xf3\x88\x77\x77\xb4\x5f\x71\xfb\x79\x85\x97\xc3\xd9\xe7\x39\xb4\x73\x0b\xe2\xe0\x99\x4f\xc8\x33\xcb\x4f\xbc\xa7\xed\xe0\x9b\x69\x3a\x1e\x6e\xa5\x92\x26\x16\xc1\x3b\xff\xca\x6e\x79\x54\xb3\xca\x19\xcc\x81\xc2\x9f\x3b\x50\xf7\x1d\x00\x07\xcf\x50\xc5\xef\x9b\xd8\xeb\x14\x69\x86\x82\x04\x9b\x9b\x28\xbd\x04\xb1\x03\x2b\x45\x6c\xaa\x6c\xe8\x2f\x11\x19\xbd\xa8\x99\x4f\x75\x87\xce\x5a\x82\x38\xf8\x73\xe8\x37\x27\xeb\xf5\x4b\x30\x2f\x89\xd9\xd9\xae\x75\x9f\xe2\x2c\xbb\x85\xd6\x8f\x9a\xc8\x99\x7f\x2e\x5e\xb7\x74\x3b\xf6\x84\x59\x0e\x61\x84\x41\x1c\x54\x23\xfc\xcf\x46\x18\xf4\x42\x9f\x26\x81\x8a\x4a\x43\x7c\xf5\x04\x41\x82\xd7\xa4\xad\x17\x1a\x27\x6b\xe6\xd9\x58\x99\x5d\xfd\x29\x35\xe9\xef\x67\x9f\x27\x2e\xfc\xa8\x84\x8b\x18\x3a\x88\x83\x0f\xbd\xc8\x9b\xfc\x20\xb2\xf2\x93\xb9\xde\xe6\x27\xd3\x84\x32\x52\xe7\xdb\x38\xf8\xb8\xdc\xe4\x8a\x4d\xf2\x76\x97\xae\x9e\x2f\x10\x55\x46\xc4\x05\x71\x70\x09\x68\x18\xd0\xee\xab\xca\x84\x77\x58\x94\x76\x71\xd9\xf3\x32\x6f\x6f\x2c\x0c\xb8\x17\x65\x29\xa7\x2a\xfc\x69\xcd\x6a\xc5\xc3\x86\xae\xbe\x06\x71\x70\x09\xe4\x79\x08\x5c\xc5\x9a\x67\xbc\xa5\x5b\x19\x72\xd5\x88\xc0\xf7\xeb\x28\x15\x45\xfe\xa2\x0d\x73\xb4\x4f\xca\x61\x95\xce\x55\x0f\xa8\x9e\x15\xc4\xc1\x9f\x83\x35\xf7\x77\xb4\x51\xb1\x48\x92\xc7\x16\xf3\x5f\x97\xaf\xca\x1f\xb3\x78\xdb\xa9\x14\xb4\xad\x4d\x25\x48\xe0\x99\xf9\x3e\x1f\xcc\x42\x2c\x7e\x40\x1c\x54\x1b\xc8\xff\xcf\x0b\x60\xd0\xec\x7a\x9a\x06\x5c\xd1\xc5\x9d\x09\x3d\x5d\x5f\x5c\x8f\x5f\xa5\x8c\x38\x4f\xad\x65\xd2\x90\x50\x3c\xcf\x68\x52\x79\xb5\xec\xf0\xfc\x5e\x75\x24\x74\x84\x19\xc4\xc1\xc7\x2e\x2f\xd1\x6a\xf3\xe0\x92\x88\x44\xbb\x77\xa3\xe6\x97\x3b\xb7\x9e\xfd\x39\x72\xc3\x55\xa0\xed\x9e\x1b\xcc\xb9\xf6\x50\xc3\x23\xe0\x35\x22\x2e\x88\x43\x3a\x1a\xdd\xb2\x3f\x2e\x15\xa9\xf5\x2a\x63\xdc\x3e\x65\x7d\xbc\x70\x3f\x23\x67\x7b\xc6\x65\xc4\x69\x5f\xda\xbf\x89\x6f\x55\xea\x37\x54\xcf\x0a\xe2\xe0\x1a\xf8\x85\xf3\xf2\x6a\x23\x76\x3b\x8a\xa1\x2a\x3f\xf9\xa4\xaf\x52\x00\x63\x9a\xb3\xe5\xe4\x5b\x62\xd3\x6e\x7e\xab\x6a\xef\x9f\x97\x89\xa0\x66\x41\x00\x0e\xfe\x1c\xd6\xc6\x2e\xde\x28\x19\xdb\xc1\x6d\x50\xeb\x33\xff\xaa\x88\x6e\x69\xe3\x25\x9b\x70\x7f\x88\x90\x24\xd9\x8b\xdc\xa5\x5e\xb9\x74\x04\xa1\x01\x10\x07\xd5\x06\x02\x8c\x30\x28\xd5\x9d\x5a\x1f\xca\x58\xa8\x3f\xdf\xf6\xdc\xb5\x39\x2f\x25\x78\x8d\xd7\x20\x8a\x70\x05\x5b\x62\x9c\x7d\x54\x30\x93\x5f\xfa\x4d\x10\x63\x20\x54\x77\x0d\xe2\xe0\x63\x8f\x7e\xd6\xff\xc3\x23\x1b\x1b\xbf\x7f\x69\xcf\xd4\x5a\x32\x7c\x7c\xe1\xd6\xef\x37\xe3\x5e\xb5\xc6\xf3\x4d\xa5\x8f\x69\x9a\xd1\xeb\x11\x71\x41\x1c\xd2\xd1\x68\x9a\xf1\x3e\xaa\x15\x35\x82\x4b\xed\x84\xb2\xd7\x6f\x99\x04\x14\x58\xd9\xe1\xce\x24\x90\x78\x9b\x76\xfe\xfe\xc4\xe3\x7b\x15\xaa\x92\x01\x71\x70\x0d\x04\xd0\x94\x5f\xc2\xa9\x21\xd6\x6c\x0b\xc6\xf3\x6b\xe6\x1a\x52\x78\xdf\x55\x28\xe6\xda\x80\xd6\x7f\xb1\xc0\xae\xf6\xf6\x57\x4e\x3f\x44\x5c\x10\x07\x7f\x0e\xba\x7a\xa8\xbe\xa2\xd9\x49\x1b\x57\x54\x3f\xe4\x6b\xee\x7a\xbf\xba\xf0\xc0\xbb\xfa\x5a\x48\x2c\xba\xc3\x67\x7a\xc6\xf4\x01\x9c\x76\x84\x06\x40\x1c\x34\x0f\xdc\x05\x34\xcd\x03\xac\x3b\x4e\xd3\xc0\x9f\x2b\x01\xcb\x73\x0f\xc5\xdd\x54\xdd\xcf\x53\x89\xb0\xf6\x3a\x1d\x0f\xea\x17\x8a\x85\xf4\xab\xbf\x6c\x25\xd4\x9b\xb9\xc1\x01\x35\x0c\x04\x71\xf0\xb1\xf7\x4a\xdf\x0e\x3c\x0e\xe4\xfe\x8c\xbb\xec\x66\xed\x14\x40\x62\xa8\x94\x77\xd7\xde\x75\xf5\xfc\x8d\x02\xf2\x04\x26\xa7\xe0\x18\xe8\xa4\x05\x88\x83\x6b\xc0\xef\xf7\xfe\x3d\x27\xf5\x86\x09\x6e\x55\xa3\x73\xbe\xe1\x63\x14\x18\x75\x8a\xee\x37\xf6\x9f\x9c\x57\x9c\xdb\xe4\x79\x75\xb9\x12\x3a\x72\x0d\xe2\xe0\x1a\xb0\x7c\x6f\xdc\xe3\xe5\x46\xe7\x7a\x53\xbb\xac\xe5\xab\x33\xef\xc9\xf0\xdd\x84\x4b\x7a\x57\x07\x5e\xfe\x3a\xc0\x5f\x9c\xed\x51\x87\x4e\x1b\x80\x38\xf8\x73\x18\xe5\x35\x76\xde\x5a\x25\xd9\x35\xf7\x15\xe9\xbf\x8b\x87\x72\x65\xc0\xc5\xd5\xe0\xcd\xb3\xcd\xa1\x3f\xf5\x8f\xe3\x0a\x88\x15\xfa\x10\x1a\x00\x71\xd0\x3c\x00\x30\xc2\x20\x13\x75\xba\x11\xfe\x11\xe6\x79\x9f\xaa\xfc\x77\x74\x66\xfd\xba\x41\xbc\x50\xde\xa2\x1a\x8e\xad\x74\xb2\x61\xc9\xfa\xc0\x37\x5c\x5a\xb4\xf2\x89\x44\x84\xa9\x04\x71\xc8\x46\xb8\xdb\x6b\xa2\x8a\xf6\x5a\x74\x45\xd9\xb3\xa2\x17\x14\xcb\xd1\x45\xc1\x01\x6e\x66\x64\xf7\xe4\x42\x50\x6f\x4f\xf2\xb1\x98\x89\x42\xd5\xc7\x20\x0e\xd9\x08\xef\x5f\xe0\x7a\xf9\xfb\xa9\x2b\x17\xcf\x94\x11\xb5\x77\x73\x4d\xac\x5b\x2e\xe6\x9c\x22\x63\x66\x62\x60\xae\x67\xb6\x5c\x3d\xb7\x0f\x22\x32\x88\x0b\x90\xc3\x86\x3d\x8d\x7f\x7d\x8f\x30\x87\x82\x74\x5d\x92\xb3\xe4\xeb\xf0\x8b\xa9\xdf\xef\x6c\x91\x15\x7e\x6c\x8d\xd0\xc1\xbb\x4c\x3b\xba\x9b\xb1\x51\x8b\xa5\x14\xf5\xe7\x6f\x23\x5c\xe9\xf8\xd2\xd1\x91\xe8\x9c\x24\xcb\x02\xc5\x2f\xbd\x2f\x57\x25\x7d\xfe\xf0\x93\x79\xae\x5f\xf7\x7e\x93\x72\x7c\xfc\x42\xdc\xdb\xe2\x2f\x94\xfc\x40\xa1\x93\x55\x60\x8e\x63\xb2\xfa\x08\x83\xe6\x45\x80\x74\xd2\x9b\xeb\x5e\x86\x21\x9b\xac\xa9\xe8\x11\x75\x79\x6a\x3f\x19\xfe\x6b\x46\x18\x34\xb4\xbf\x6b\x84\x91\x8c\xf0\x7b\xa9\x6c\x56\xcb\x0f\x8f\x39\xdf\xa5\x99\x99\xb0\xa5\x0d\x49\x68\x87\x4b\x7f\x09\xd6\x64\xa1\xc6\x43\xef\xca\x09\x72\xe5\x76\x3f\x93\xcd\x4a\x64\x23\x1c\x20\xda\xc9\xbd\x33\xa2\x12\x8c\xaa\x45\xf1\x58\x0f\x57\x5c\x7e\x41\x47\xf2\xfd\xaa\x8d\x24\x63\xe9\xf5\xe9\x8b\x2d\xf3\x9f\x94\xce\x64\x6b\x16\xd9\x08\xff\x3c\x4a\x5c\x42\xc3\xd3\xb8\xcb\x67\xa0\xe4\x76\x2c\x4f\x26\x95\x3d\x32\x11\x73\x5e\x21\xa7\xc8\xcc\xbd\xa2\xa8\x9e\x2c\x8a\xeb\x4c\x46\x8b\x6c\x84\xcf\x49\x7e\xe2\x67\x5f\xb8\xc4\x33\x97\xd2\xf4\xf1\xe5\x4c\x9d\x51\x5a\xc5\xf5\x85\x15\xa5\xc6\x0e\xcc\xbd\xdb\x9d\xcb\xc6\xc5\x97\xcf\x64\xb4\xc8\x46\x38\xf7\x99\xa7\xcc\xa5\x2d\xb9\xe9\xaf\x9f\x72\x84\x1f\xe9\x51\x48\x7f\xb7\xb1\xb2\x51\xa0\x1d\xac\xaf\x63\xd3\x08\x65\xbc\x1b\xde\x7d\x66\x46\x18\x24\xa2\x53\x9b\x65\xdd\xdc\xe2\x1d\x7b\xf8\xc0\x38\x2f\xa0\xee\x40\xe7\x45\x99\xab\x4e\x4a\xf4\x54\x59\xb9\x8a\x5a\x69\x13\x1d\xfa\x65\x89\xc7\x8e\x50\xb3\x2c\x00\x87\xd4\x29\xe9\x73\x97\xdb\xe7\xbb\x57\xea\x8b\xcb\x19\x2e\x5e\x70\x37\xf3\x53\x08\xa7\x32\xc4\xf9\xed\xea\xf3\x70\x6d\xa4\x8c\x2f\x5f\xdb\x01\x2a\x36\x02\x70\xf0\xcc\xd7\xea\x2f\x12\x17\x26\xd1\x8c\x8a\x86\xcd\x73\xef\x56\x54\xe3\x9f\x44\x1e\x75\xc6\xd5\xd4\x99\x8c\x87\x1b\xdd\x5a\x27\xa1\x79\xd0\x0a\x18\xc4\xc1\x33\x5f\xc5\xd1\x4e\xb1\x5f\x01\x03\x66\x33\x1e\x81\xdd\x9b\x46\x67\xbe\xa2\xb2\xec\xac\xd0\x66\x12\xf5\x0d\x0e\xaa\x11\xff\xea\x18\xe8\x2c\x14\x88\x83\xff\xbd\x17\xa8\x1b\xea\x9e\x07\x05\x25\x2a\x92\x7f\xa1\xc4\x5c\xe9\x91\xf1\x9e\xd5\xc9\xe6\x64\x61\x1f\x77\xb2\xf4\x21\xd2\x1d\xf6\x68\x47\x18\x61\x10\x07\xd5\x08\xff\xb3\x11\x06\xbd\xd0\xa7\x96\x89\x37\x49\xdf\xda\x2f\x7c\x76\x5e\xe9\x68\xae\x7b\x33\xf9\x4d\x1e\xf5\x8a\x49\x64\xd8\x28\x8e\x70\x14\xa3\x66\xcf\x60\x9f\x06\xd4\x28\x09\xc4\x21\x1d\x89\x7c\x4b\xe9\x95\xc8\x27\xb8\xde\x43\x7d\xe2\x26\xf1\x66\xa1\x38\x83\x41\xff\x71\xd4\x03\x2d\xdc\xb4\xa4\x79\xef\xbb\x6e\x97\xa0\xab\x99\x41\x1c\xfc\x91\xaa\x2f\x50\x98\x94\x2b\xeb\x63\x3d\x76\x28\xbb\x4d\x76\x31\xfd\xbb\xe9\x72\xe1\xd3\x4b\x58\x0a\xae\xc3\x9d\x26\x28\xd7\x08\x0b\xc4\xa1\x63\x76\x00\x0e\x2e\x81\x9c\xf2\x25\xe3\xdf\xfb\x37\x05\x02\xc2\xf8\x22\xd5\x1e\x75\xaa\x27\xcd\xe4\xf7\x91\xf1\x3e\xbf\xbc\xea\x34\x7b\xc7\x99\x40\xfc\x0e\x22\x2e\x88\x83\xff\xbd\x12\x69\x96\x31\xa5\xd8\x57\xbf\xcc\xd7\x4e\x8d\x7e\xd3\x9b\xb2\x1b\xa3\xc5\x09\xd8\xbf\x24\x36\x5b\xe8\x52\xda\xe0\x28\xad\xdc\x81\x58\xfc\x80\x38\xa8\x36\x10\x60\x84\x41\xb3\xeb\x69\x1a\x18\xb1\x10\xa0\x39\x27\x2b\x5d\x3c\x41\xb6\xbe\x77\x39\x47\xcb\x91\x3b\x27\xcf\xef\xd3\xea\xc3\x00\x2e\xf6\x38\x5f\x0d\xff\x62\x4b\xc4\xd8\x41\x1c\x5c\x03\x53\x5d\x7b\x0f\xad\x30\x9e\x70\x3a\xd5\xe9\xf9\xcc\x6b\x38\x13\xe6\x7c\x1b\x12\xb8\x89\xf6\xf1\xde\x54\x81\xb6\xca\x4d\xb9\xe5\x32\x44\x5c\x10\x07\x7f\xa6\x2e\x4c\x8f\x6a\x93\x68\xec\xe8\xfa\xd8\xb0\xc6\x42\x32\xad\xf5\x5a\x3a\xb3\x67\xd7\xc5\xfb\x1e\x35\xc6\x5e\xf6\xbe\xa4\x6e\x16\x8b\x88\x0b\xe2\xe0\x1a\x40\xcf\x57\x66\x17\x18\xfa\xf1\xf0\xe2\xeb\x3a\x8f\x06\xb9\xcb\x61\xf4\xf2\x0c\x21\x16\x37\x6e\xb6\xb9\xd4\xdd\xa0\x27\x65\x4a\x13\x44\xc4\x05\x71\xf0\xbf\xf7\xfb\x27\xe3\xc2\x23\xe9\x83\x1b\xaf\x35\xa9\xf3\x3e\x5e\x66\xa7\x6a\xb6\xdc\xfe\x4e\xf5\xe7\xfb\x02\xc1\xa6\x52\xa6\xa3\xb7\x07\x74\x34\x1a\xc4\x41\xb5\x81\x00\x23\x0c\x4a\x75\xa7\x7e\x10\x73\x94\x54\x58\x9e\xe4\x9d\xb5\x39\x27\xb5\x96\xd3\xd9\xf7\x62\x6d\x35\x58\xd7\xb7\xeb\x3c\x15\x7a\x78\x06\xfd\xab\x61\x7c\xa8\x6f\x22\x88\x43\xba\x47\xf8\x06\x0b\xae\x3a\x45\x7f\x46\x30\xd5\xaa\x81\x98\x9c\xc7\x4d\xef\xca\x14\x3f\x93\xb7\xa6\x8d\xae\x15\x62\x4f\x6f\x57\x2c\x61\x43\x1d\x78\x01\x1c\xfc\x99\x92\x37\xa4\xce\x29\xf8\x0d\x12\x48\x88\xa4\x57\xd8\x55\x8e\x64\x50\x0a\xa6\xb0\xd6\xd0\x25\xa7\x13\xd9\x87\xbe\x33\xa7\xee\xfc\x83\x88\x0b\xe2\xe0\x1a\xb8\x7d\xe5\x4e\xdc\x74\xc2\x4c\xaa\x38\x1f\xa9\x71\xd8\xa1\xb2\xb8\xfc\xad\x81\x7c\x7d\x63\xd9\xae\x93\x0f\x71\x41\x25\xd3\x4f\xa1\x0f\x83\x20\x0e\xfe\xf7\xfa\x5a\x2b\x84\x7b\x7e\x64\xa1\xcb\x55\xe1\xc1\x99\x91\x69\x08\xd8\x36\xcc\xc0\x89\xc2\x41\xe9\x6b\x76\xf1\xb2\xa2\xe9\xe0\x90\x45\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\xd6\x1d\xa7\x69\x20\xe9\x0b\xbf\x7c\xa8\xee\x3e\xb5\x5a\x9c\x48\xc5\x87\x90\x16\x1d\xb2\x52\x34\xce\x31\x42\xe3\xcd\x57\x2b\x13\xc3\x83\x77\xbe\x41\xbd\x02\x40\x1c\x5c\x03\xe5\x38\x86\xa8\x8a\xcc\xb4\xed\x78\xf3\x54\xe2\xe5\x47\x58\xbf\xfc\x29\xa6\xeb\xe2\xd0\x3c\x64\x57\x0c\xdf\xb8\xe3\xbe\x35\x84\x0c\x36\x88\x83\x3f\xd3\x48\xc2\x5e\x45\x3a\x16\xb3\x7e\x6b\xa7\x7e\x0f\x94\xa3\x4a\x55\x54\x8a\x7b\x7c\xe7\x2c\x18\xeb\xf6\x83\xbb\x03\x29\x9e\xce\x43\xfd\x2d\x40\x1c\x5c\x03\xb4\x4c\xc2\x81\x66\xfd\xab\xd6\x7f\xa4\xbc\x99\x2c\x7f\x4c\xa4\x74\xb2\x5d\xd1\xcd\xca\x92\xd5\x7b\x5d\x8f\xe5\xb3\x30\xdf\x0b\xe5\x18\x10\x07\xff\x7b\xf9\xe9\xf9\x84\x39\xf6\xa8\xc4\x3d\x58\x48\xdb\x9e\xf5\xdf\xb6\x16\xfe\x51\x32\xcb\x74\xae\xad\xea\xc3\x9d\x4d\x66\x42\xdb\x65\xe8\x06\x01\x10\x07\xcd\x03\x00\x23\x0c\x32\x51\xa7\x1b\x61\x53\x2c\xfa\x2b\x7d\xbd\x35\xaf\x87\xfa\x2f\x56\x37\xe2\x10\x12\x25\x37\x3d\xec\xcf\x42\xaf\x5f\xae\x2c\x8f\x53\x94\x19\x7b\x78\x1d\x61\x2a\x41\x1c\xb2\x11\xf6\x0c\xa2\x2e\xb4\xf0\x76\xa0\xe2\x90\xf7\x7d\xf2\xfb\xdb\xb0\x2f\xb3\xfd\xe1\x3b\xf4\xfc\x35\x65\x87\x89\xef\x89\x92\x5a\x55\xbf\x11\x91\x41\x1c\xb2\x11\x2e\x5d\x55\x8e\x42\x89\x8f\x56\xec\x8e\xbe\xe4\xd0\x61\xc8\x94\x1b\xee\x97\x51\x86\xf1\xad\xf5\x9b\x79\xec\xf7\x7e\xfb\x50\xd5\x1f\x88\xc8\x20\x2e\x40\x8e\x16\xf6\x34\xfe\xf5\x3d\xc2\x54\xeb\xc7\x2d\xa3\x5a\xe7\xbe\x24\x3b\x2b\xaf\xee\xa9\xbd\x94\x29\xf6\xde\xbb\x72\x74\x91\x80\x26\xfa\x22\xc9\x4b\x03\x92\xd5\xb9\xbf\x8d\x30\xcd\x05\x27\x63\x55\x2c\xc3\xba\x20\x9e\x24\xbb\xb7\x3f\xe4\x08\x6f\x0a\x7e\xcb\x74\x7b\x23\xa5\xed\xff\x04\x25\x28\xf6\xd2\x0f\xaf\xbf\xd0\xaf\x42\xef\xe3\x5e\xc9\x57\xa7\x39\x9e\x17\x08\xea\x2f\x32\x9e\x58\x66\xe2\x7c\x71\x33\x6f\x45\x99\x6c\x98\x4d\xb8\x73\xc2\x4a\xef\xbf\x66\x84\x41\x43\xfb\xbb\x46\x58\x05\x6e\x96\xb4\x31\x37\x98\x93\xbb\x9f\x97\xbe\x47\xfb\x16\xb8\xae\x6d\x3c\xeb\xc6\x19\x95\xbb\x68\xd4\x57\xdf\x2a\xb6\xed\x66\xbb\xf9\x62\xed\x4c\x36\x2b\x91\x8d\x30\xa7\x35\xd6\x10\x93\x04\xaf\x66\xab\x5b\xd2\xe5\xb2\x13\xb9\xcd\xee\x85\x3f\x04\x58\xab\x41\x3d\xf5\xec\x47\xe7\x92\xc4\x2d\xd1\xce\x64\x6b\x56\x0b\xe9\x67\x49\x19\x4a\x70\x0b\x63\x46\x87\x13\x99\x7d\xcc\xa3\x7f\xac\xfa\xb7\x0f\x8b\x09\x10\xbe\x62\xb0\xaa\xac\x45\x8d\x2b\x09\xe8\xce\x39\x93\xd1\x22\x1b\xe1\x17\xb2\xee\xe3\x9d\x8c\x77\x86\x3c\x44\x51\x3e\xcd\x7e\x63\xa2\xc1\xfc\xed\xd1\xdf\x75\xa1\x4f\x06\x7d\x21\xc9\x85\x5e\x3f\x0a\xe5\x4c\x46\xeb\x8a\x7c\x7d\x71\x2a\x6a\x5c\xde\xd7\xab\x5c\xa2\xdc\x86\x23\xbf\x7e\x7f\x10\xca\xea\x65\x4a\x43\x31\xc9\xe7\xab\xfd\x54\xaf\x33\x53\xc2\xa4\x7e\x66\x46\x18\x24\xa2\xd3\x32\x9f\x49\x1e\xa6\xfe\x78\xad\xfe\xbb\xd6\x37\x99\x3e\x62\xdc\x04\xce\x95\x0b\xaa\x45\x0a\x7d\xb2\x4f\x1c\xe6\xea\x54\x31\xac\x89\x3f\x20\x66\x7c\x10\x07\xcf\x7c\xdb\xbf\x32\x3c\x1e\x77\x3f\x22\xcb\xf8\x5a\x30\x5d\xba\x55\x18\x91\xdc\x3b\x4b\xc5\xf3\xe0\xda\xf2\xad\x8a\xb2\x4d\xd5\x8b\x5d\xd0\xcd\xfc\x20\x0e\x9e\x49\x9a\x3b\xee\x67\x62\xb2\xa3\x97\x48\xd5\xe0\xc5\x33\x05\xa2\xcd\x1e\x96\x29\x0c\xc9\x88\x10\x79\xf8\xcc\xb2\xf2\x87\x92\x17\x41\x45\x4c\x20\x0e\x9e\xf9\x58\x6c\x51\x7d\xd1\xa2\x98\x7b\xf2\xc6\x87\x25\xcc\x9d\x17\xd5\x3f\x8b\xde\x25\x25\xf9\x64\xc5\xd8\xf2\xc6\xaa\xe6\x63\x68\x5b\x1c\xb4\x1d\x02\xe0\x02\x64\x50\x7c\xff\x8e\x3b\x4e\x1d\x33\xbc\x71\xa7\xb3\x45\x70\x76\x7d\x34\x8d\x30\x99\x8e\x8b\xa6\x82\xad\xfe\xd6\x4e\x5c\x4d\x5b\x56\xe1\x61\xff\xdd\x30\x84\x11\x06\x71\x50\x8d\xb0\xca\x3f\x2e\x7e\x40\x2f\xf4\x69\x12\x10\xa9\x77\x1e\x09\xb9\xdc\xb3\x32\x3b\x36\x42\x75\x59\xe3\xf8\x28\x75\x18\xd5\x42\xfc\xe5\x51\xd5\xea\xfc\x94\xe1\x95\x6e\xa3\x02\xc4\xd0\x41\x1c\x5c\x02\xd7\xf4\xd1\xf5\xc9\xde\x0a\x4c\xf6\x1c\x2b\x16\x07\xba\x69\xa9\x13\x7a\xed\x6d\x50\x5f\xa8\xf4\x7b\xc0\x5e\x2e\x39\x9a\x39\x0e\x3d\x52\x10\x07\x97\xc0\x10\x55\xd1\x85\x4a\x3e\x45\x5d\xb4\xa3\x66\xca\xa0\x1e\x35\xf5\x09\x72\x81\xc4\x56\xfd\x25\xcd\xb2\x50\xf5\x88\x5b\x35\x86\x6e\x88\xb8\x20\x0e\x2e\x01\x36\xb2\x6f\xf7\x70\x17\xa4\xc9\x79\x6f\x4d\xa1\xdd\x88\x4f\x0c\xe9\x0d\xb0\xfe\x55\x9e\x1f\x5b\xe4\x4b\x90\xef\xac\xae\x5a\x01\x5d\x21\x04\xe2\xe0\x12\x48\xcf\x2b\x3a\x57\x78\x6f\xb9\x08\xff\xcb\xb6\x7f\x31\x77\x7a\xe2\x87\x31\x3a\x75\x2b\xe2\xbc\xf4\xae\xda\x19\x67\x94\xf7\x4f\xde\x22\x16\x3f\x20\x0e\xaa\x0d\x04\x18\x61\xd0\xec\x7a\x9a\x06\x0c\x3f\x8c\x0b\xa8\x3c\x29\x17\xdd\xd6\x21\xb6\x78\xe6\x7b\xf2\x1a\x4f\xf2\x9e\x87\xe6\x41\x01\xf7\xb3\x0c\xe2\x2e\xee\x91\x72\xa8\x49\x14\x88\x83\x6b\x60\xf7\x31\x89\x10\x65\xc5\x09\x6e\xc7\xdd\x6b\x02\xa3\x0f\xd6\x85\xb2\x8d\x2b\x98\xbb\x85\x45\x19\x07\xf9\x75\xf9\x27\xd6\x71\xc7\x10\x71\x41\x1c\x5c\x03\x7d\x2d\xd2\xdb\xb1\x27\x36\xa9\x64\x71\x4b\xa1\xd3\x02\x23\xc6\xe7\x83\x8e\xda\x24\xe2\xd0\x03\xf8\xc5\x3a\x6e\x8d\xfa\xb4\x78\x22\xe2\x82\x38\xb8\x06\x30\x35\xe9\xa5\x6d\xf4\x1d\x3f\x85\xd4\xbc\x08\xef\x90\x8d\xd6\xa0\xc6\x88\x69\xb4\x9e\xa7\xd1\x61\x75\x4d\x09\x42\xf3\xc1\x86\x34\x0b\xe2\xe0\x1a\x78\x24\x57\x64\xc2\x82\x65\x9d\xb6\x1c\x18\x7d\xe7\xa3\x56\x0b\xff\xbe\x9c\x9c\x86\x08\xbd\xd9\x3d\xc2\xc0\xcd\x2c\x3a\xc5\xe7\x1a\x08\x0d\x80\x38\xa8\x36\x50\xeb\x9f\x35\x00\x4a\x75\xa7\x69\xa0\x5a\xf9\x9c\x94\x8e\x53\xa6\x84\xd4\x56\xfc\x71\xf1\x70\x9e\x37\xb7\x6b\xe6\xa7\xed\x76\x46\x77\x2c\x7b\x7f\xdd\xbe\x34\x53\xa8\xee\x1a\xc4\x21\x7d\x0c\x09\x3a\xef\x5a\xa5\xb2\xd6\x95\x31\xb4\x62\xbb\x74\x5e\xf2\xe3\xca\x3b\x74\xf9\x68\xfa\x6f\x7f\x64\xb6\xa8\x26\xfe\x04\xea\x09\x41\x1f\x43\x00\x1c\x5c\x03\xb8\x38\x0f\x54\x59\x13\x1a\xd1\xef\x79\x04\x1e\xe4\x6e\x5d\x91\xbf\x15\x2f\xbb\xf1\x91\xd8\x03\x07\x8b\x60\x2c\xe4\xa7\xe3\x1c\x74\xdc\x16\xc4\xc1\x35\xe0\x25\x74\xdd\x6f\x67\x3b\x80\x37\xae\x81\x73\x90\x57\x80\x98\x8e\x27\x7d\x73\x1d\x95\x1b\xbd\x67\xf2\x6d\x78\xdd\x32\xe6\x33\xa8\xdb\x3d\x88\x83\x6b\x00\x7f\x7c\xfd\x69\xf6\x42\x4f\x39\x6e\x72\x97\x62\xb5\xd6\x2b\x2b\x5a\x0a\x12\x4f\x0d\xb6\xc2\xb5\xaf\xf6\xaa\x1c\x62\xdd\x92\x07\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\x34\x0d\xcc\x2c\x3e\x68\x5b\x25\xd3\x96\x6c\xc3\xde\x67\xd9\x2a\x78\x1d\x40\x40\x67\x46\xd4\x79\x4b\x4a\xb9\xc8\x2a\x59\x3b\x6e\xad\x07\x9a\x5b\x41\x1c\x5c\x03\x0d\x11\x0b\xb9\x39\x5e\x3c\x26\x09\xf8\x17\x2e\x8a\x89\xb4\x79\xed\xfa\xde\xa7\xc2\xd4\xd1\xad\xac\x4f\x1a\xf2\x36\x5d\x4e\x83\xd2\x36\x88\x83\x6b\xa0\x60\x55\x2f\x87\x4b\xfa\x64\x98\xee\xe0\x8f\xd1\x65\x56\x32\x8c\x4e\x56\x3b\x29\xf2\xa7\xe3\xb6\x14\xf7\xcd\xf9\x2d\xe4\x16\x25\xa1\x8f\xb8\x00\x0e\xae\x01\x0a\x94\x03\xf1\xb0\x12\x9b\x17\x58\x02\xdf\x69\xaf\xd3\xff\x92\x1c\x4e\xa9\xfb\x6c\x90\x7c\x53\x91\x33\x3b\x4d\xe0\x21\x27\xc6\x35\x44\x5c\x10\x07\xd7\xc0\xa1\x6e\x04\xb1\xfa\x5b\x55\x4a\x8b\xd2\xf4\xfc\x9f\x0a\x27\x09\x7f\xe2\x83\xb1\x2d\x48\xea\xed\x5d\x3d\x73\x9e\x1c\xbe\x3b\x08\x46\x68\x00\xc4\x41\xf3\x80\xeb\x3f\x1b\x61\x90\x89\x3a\xdd\x08\xd3\x29\xdb\xbd\x6d\x7b\xab\x27\xb1\xbc\xe6\xbf\xff\xe6\x59\xaa\x55\x6d\xc7\xa4\xf1\xb6\x3f\xcf\xfb\x60\x26\x13\x81\x87\x3d\x84\x2a\x08\x53\x09\xe2\x90\x8d\xb0\xce\xd7\x94\x73\xda\xf5\xc4\x5b\x74\xdb\x38\x6d\x36\x27\x6a\x9e\x32\x2d\xd2\x29\x75\x9a\x41\xb7\x37\x08\x77\x99\xf8\xbc\x9e\xc4\x23\x22\x83\x38\x64\x23\xec\xb9\x97\xff\x3e\x90\xf7\xfb\xda\x8d\xb1\xa3\x57\xcf\x45\x92\x89\xb9\x58\xdc\xd7\x1e\x3a\x68\x27\x1d\x93\xfa\xb0\x87\x1c\x5c\x6a\x82\x2c\x36\x80\x0b\x90\xf3\x85\x3d\x8d\x7f\x7d\x8f\xb0\x29\x8d\xcc\x1a\x1f\x0f\x27\xcf\xae\x54\x81\xc6\xfe\xcd\x77\xec\xe8\x7d\xe1\x35\xec\xb2\x6f\x82\xab\xd2\xc6\x5f\x39\x3f\x8b\xda\xfe\xdb\x08\x17\x45\x45\x7f\x9e\xb9\xc6\x5e\xc8\xff\xf0\x9e\x91\x73\x4a\x21\xa6\xc4\xe1\xc8\xb0\x84\x0c\xd3\x2a\x6f\xd9\x10\x45\x21\xb9\xe2\xdf\x65\x9a\x37\x54\x25\x7d\xb6\xb4\x78\x69\x6c\x72\x7f\x2b\xb0\xe3\x59\xde\xfa\x90\xff\xc7\xc8\x3f\x86\x0c\xd5\xed\xe7\x46\x7a\xe3\x6c\x47\xcb\x7f\xcd\x08\x83\x86\xf6\x77\x8d\x30\x92\x11\x36\x69\x54\xcd\x39\xe2\x4f\x4d\xf9\xf4\x5b\x4f\x91\x77\x8b\x0c\xc5\x83\xa5\x6b\xe9\xcb\x53\xb4\x1f\x28\xe4\xd7\xc4\xc8\x31\xeb\x1f\x9c\xc9\x66\xe5\x29\x3b\xc2\x4f\x5a\x78\xfb\xe9\xc2\x5f\x60\xc5\x9a\x6f\x6a\xed\x7e\x55\xde\x99\x5e\x9e\x92\xb1\xe2\x20\x7e\x6f\x1a\xee\xae\x9e\xd0\x38\x70\x26\x5b\xb3\xc8\x46\x38\x4d\x48\x87\x1a\xad\xf1\xe5\x72\xa3\x50\x20\x76\xc5\x33\x21\xb7\x55\x26\x02\x2d\xba\x20\x27\xba\x3b\x73\xf9\x2a\xa4\xaa\xfd\x43\x67\x32\x5a\x64\x23\x8c\x4e\x13\xbe\x63\x7e\xb7\xcb\x21\x3c\xb3\xc3\xc4\x57\x73\xd6\x56\xec\xe4\xaa\xeb\xda\xb4\xa5\x7b\x1b\xfb\x3a\xa6\xe7\x7c\xfe\xd7\x33\x19\x2d\xb2\x11\x76\x68\xef\xa1\xad\xc5\x3e\xee\x6e\xb5\x70\x0c\x57\x0b\x32\xe4\x74\xdc\x27\x50\xf8\xf3\xe3\xc2\x78\x0c\x21\xbf\xf7\xdc\x75\xf6\xc3\x33\x33\xc2\x20\x11\x9d\x96\xf9\x7e\x6f\x9a\x19\xbf\xbb\x4a\x42\xc3\xb6\xdc\x26\xa7\x6a\x69\xf5\x8a\xe8\xe8\x7b\x43\x80\x9e\xea\x10\x16\x96\x95\x9e\x57\xc7\x80\x07\x62\xc6\x07\x71\xf0\xcc\xa7\xa1\x5c\xc5\xcf\xfb\xd1\x46\x48\xd1\x4b\xce\xad\x24\x69\x57\x53\xdc\x3e\x11\x75\x50\x04\x63\x59\xcd\xdd\x73\xc3\x95\x73\xc3\x10\x3a\xbf\x0a\xe0\x90\x0a\x44\xa9\x89\x35\x0d\x6d\xee\x73\xe7\x99\x17\x8a\x4f\x4f\x29\x56\x1b\x7c\x19\xf8\xf3\xb0\x7e\xa5\x5b\x4a\xe7\x20\x27\xf2\xd6\x11\x54\xd0\x0a\xe2\xe0\x17\xfc\xbd\x6f\x6c\xd2\xde\xbe\xb0\x4d\x2c\xad\xe1\x8d\xff\xf3\xba\x62\x61\x36\xa3\x59\x8c\x2a\xf5\x5a\xa2\xe2\x2f\x5e\xe5\x5d\x31\x4f\xe8\x39\x80\x38\x78\xfb\x49\x94\xe9\x00\x9a\xf4\x0b\x5f\xb2\x2f\x1d\x50\x4f\x5c\x8a\xfe\x45\x7b\xf8\xc4\x6f\x7e\xe2\x9a\x16\xed\xe3\xa6\x92\x0f\x68\x9e\x46\x86\x08\x23\x0c\xe2\xa0\x1a\xe1\x7f\x36\xc2\xa0\x17\xfa\x34\x09\x18\x5d\xf2\xa3\x63\x17\x5b\xbb\xb1\xac\xf8\x6c\xee\xf3\x17\xbf\xa2\xb7\xe1\x63\x57\x08\xed\x3f\x75\xde\x8a\x1f\xc3\xe0\x16\x6b\x83\x6a\x03\x41\x1c\x5c\x02\xaf\xd3\x6c\x35\xff\x14\x69\x1a\xfa\x4d\xa6\x7a\x12\xcf\x60\x72\xc6\x4a\x24\x6b\xe6\x94\x7f\xbd\x7a\x8b\xc8\xb3\xca\xea\xc2\x4f\xa8\x46\x18\xc4\xc1\x25\x30\xe6\xe6\xa3\xbb\x3a\x34\x49\x79\x57\xf0\xae\xe2\xcd\x1b\xfa\x65\x7e\xb9\xd3\xed\x74\x5f\xaf\x89\x4a\x37\x39\xec\x13\xac\xe2\x72\x23\xe2\x82\x38\xb8\x04\xd8\x59\xd2\x39\xe8\x70\x45\xec\x6f\xce\x4c\x18\xae\x33\x8e\x3c\x50\x54\x2e\x26\xd8\xbb\x28\xc5\x9b\xd0\xb5\x54\xb9\xfc\x6b\x01\xba\x3a\x07\xc4\xc1\x25\x90\x9d\x17\xe9\xfe\xd3\x62\xa8\x3b\xfc\x58\x6f\x44\x9b\xf9\xb6\x68\xc1\x66\x40\x20\xf3\x5b\x19\x75\x49\x2f\xb1\xd2\x6f\xf1\x03\x89\x88\xc5\x0f\x88\x83\x6a\x03\x01\x46\x18\x34\xbb\x9e\xa6\x01\x3e\x53\x85\x39\x11\x0f\x2e\xd9\xb8\x7b\x1b\x8f\x02\xe9\x8d\x4b\xcc\x79\x70\xdf\x54\xd1\xc6\x1c\x90\x64\x63\x3f\x7d\x5b\x24\x3b\x84\x18\x3b\x88\x83\x6b\xc0\xb3\x0f\x93\x6a\x54\x64\x63\xb1\xcb\xc4\xfa\xb7\x9b\x10\xb9\x2d\x4a\x7f\x15\xd5\xf7\xf5\x69\xd1\xe2\xc9\x38\x26\xce\x65\x23\x0e\xa8\xc9\x3b\x80\x83\x6b\x40\xe9\xb3\xf2\x1d\x2b\xe9\x5b\x98\xe2\xa1\xc7\x63\x9c\xd5\xbd\x22\xa5\x29\x97\x0a\xe7\x24\xef\x98\xb6\xd2\x7d\x31\xae\x96\xc9\xd2\x47\xc4\x05\x71\x70\x0d\xa4\xf2\x78\x61\x54\xfa\xd2\xe7\x35\x75\xf2\x0f\x79\xf8\x88\x44\xa9\xd9\xb9\xa2\xdf\x24\x50\x6d\x51\x65\x20\xee\xd6\xb5\xbc\x0f\xdd\xa5\x0b\xe2\xe0\x1a\xa8\xb0\xcf\x13\xdb\xdc\x22\x63\xa3\x29\xd0\x37\x5e\x27\xb2\x4e\xbe\x2a\x15\x1a\xec\xcb\x37\xd5\x1a\x72\x48\x43\x78\xf0\x8e\x3d\x10\xa1\x01\x10\x07\xd5\x06\x02\x8c\x30\x28\xd5\x9d\xa6\x81\x86\x48\x22\x11\x2f\x02\x6f\xaa\x83\x1f\xd5\xf7\x2c\x1e\xfc\x2a\x88\xc7\x22\xf3\x0c\xc1\xc0\x10\xaf\x63\x8c\xb7\xbe\xa2\x95\x08\x75\x63\x07\x71\x48\x0d\xd3\x7c\x8d\xa3\xf9\xd2\x9f\xfc\x3a\x58\xbe\x9a\xc3\xc8\x7e\xf3\x75\x5c\x8e\x57\x33\x87\x80\x95\x5a\xc5\xde\xd7\xfb\x19\xd7\x04\x57\xa0\x86\x69\x00\x0e\xae\x01\x54\x3a\xd1\x3e\x4b\xf9\x3c\x0e\x73\x74\xd4\xc7\xb5\xa6\xf7\xe6\x2b\xcc\xae\x62\xbf\xb2\x6c\xc0\xbc\x2d\x38\xa6\x18\x80\x63\x46\x0f\x35\x36\x03\x70\x70\x0d\x44\xf7\x88\x3f\xf8\xc5\x7f\xf9\x7c\xde\x64\xd5\xb3\xd1\x28\x65\x56\x4d\x7b\x94\x77\x92\x3f\xde\x70\x1e\xc7\x14\xf3\xd1\xa5\xec\x43\x06\x1b\xc4\xc1\x35\xe0\x64\xc5\x6a\xe0\x52\x33\xeb\x7f\xee\x43\x76\x55\xea\xfe\x93\xf8\x8c\x92\x67\x69\x57\x75\xf2\x8b\x71\x0d\x59\x50\x2f\xe0\xb1\xee\x21\x34\x00\xe2\xa0\x79\x00\x60\x84\x41\xeb\x8e\xd3\x34\xe0\x86\xcd\x68\xe7\x5f\xe0\x37\xfd\x2c\x71\x35\x5a\x7f\xc5\xe6\x78\x8e\x5b\xfe\xde\x66\x8a\xf8\x4f\xb3\x8f\x77\x8a\x84\xbd\x27\x97\xa0\xd6\x1e\x00\x0e\xae\x01\xaf\x49\xd6\x8c\xaf\x98\x2a\xb2\xfc\xed\xf8\x5d\xb2\x18\x3c\x81\x99\x7a\x16\xd4\xce\xb1\xe7\x99\xb5\x31\xb6\x7e\x4d\x6d\x0a\x40\x27\x38\x40\x1c\x5c\x03\x4f\x3b\x9e\xd2\x07\xf8\x14\x35\xe4\x4c\x7f\x2f\xbf\xc6\xfd\xd8\xa6\x04\xef\xea\xc0\x70\xea\xcc\x95\x3c\x71\x09\x9d\x13\x05\x61\xe8\x72\x0a\x10\x07\xd7\x80\x63\x84\xd8\x52\xd6\x07\x19\xa3\x45\xbf\xeb\x1a\x8a\x27\x82\xe4\xbf\xbf\xb0\x9e\x28\x93\x8f\xa3\x50\x26\x7d\xde\x6a\xbf\x41\x29\x86\x88\x0b\xe2\xe0\x1a\xb8\x5f\x86\x6d\xc9\x76\xf2\xee\x45\xe2\x65\xee\xce\x2f\x83\x43\xe2\x97\xe2\x1a\xc5\xe2\x1d\x2f\xa1\xf7\x10\xc4\x84\x50\x6c\x7e\xfb\x8e\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\x99\xa8\xd3\x8d\xb0\xd5\xe3\xa9\x80\xf0\x5e\xe2\x4b\xd7\xec\x84\xdd\x43\x3e\x5f\xd7\x6f\xd5\x2d\xca\x50\xb0\xea\xcb\xdd\x3c\x6f\xca\x2a\x22\x9f\xfc\x1a\x61\x2a\x41\x1c\xb2\x11\x6e\x26\x7f\xf7\xe8\x5b\xd7\x7a\xba\x30\x5e\xb7\xad\x93\xcb\x5d\x17\x06\x4a\xc1\xb2\x46\x9a\xa7\xa5\xad\xdc\x24\x03\xfa\xa1\xa9\x8e\x88\xc8\x20\x0e\xd9\x08\x97\xdb\xeb\xde\x19\x14\xd9\xe7\xca\x2b\x5e\xa0\x50\xb7\x66\x37\x98\xc2\xd8\xbd\x41\x2d\x35\xc4\xaf\x51\xcc\x10\x29\xd3\x38\x2d\x8c\x88\x0c\xe2\x02\xe4\x50\x50\xff\x37\xf2\xbf\xbe\x47\xd8\xcc\x41\xea\x1b\x81\xa5\x68\xc4\xe3\x54\x7c\x12\x12\xff\x38\xb9\x2a\x17\xe9\x52\xdb\xde\x7d\xa7\x63\x42\x97\x19\xe7\x71\x09\xe1\xbf\x8d\xf0\xaf\x60\x75\x91\x00\xbd\xa6\xbe\xac\xd9\xa8\x21\x7f\xfa\xdd\x20\xde\xb4\xfb\x9b\x39\x2e\x5d\x13\x9f\x1a\x04\xc7\x87\x50\x15\x94\xff\x3e\x51\x4a\xfa\x23\xc6\xf2\x9a\xaf\x74\xea\xa0\xd5\xed\xea\x1d\xb3\x6b\x72\x5b\x8f\x94\x96\xec\xbc\xd9\x46\xda\x43\x7a\x9a\xf5\xb6\x68\xfe\x6b\x46\x18\x34\xb4\xbf\x6b\x84\x91\x8c\x70\xf4\xc1\x81\xe8\x7a\xc1\xb9\x9f\x5a\x76\x31\x19\x79\x05\x5f\xf8\x45\x33\xf9\x6a\x73\xf0\x4a\x0c\xe3\x37\x87\x48\x28\x73\x29\x6c\xcf\x64\xb3\x52\x00\xb9\x7d\xf3\xe2\x1f\x02\xb2\x45\xea\xd2\xdf\x96\x9a\xb4\x1f\xf7\x2f\xca\xdf\xf0\xbf\x99\x59\x61\x90\xb8\xd2\xe8\x1a\x40\x9f\x3d\x42\xef\x71\x26\x5b\xb3\xc8\x46\xd8\xea\xb6\x95\x56\x02\x2a\x65\x59\x43\x34\xaf\x1b\xc7\xc5\x9b\xf7\xd9\x1d\x05\x9b\xa6\x5b\x22\x1f\x4e\xea\xe4\x19\x86\x08\x67\x6c\x9f\xc9\x68\x0d\x91\x7e\xb6\x58\x70\xbc\x67\x87\xf2\xa8\x81\x35\xb3\xf4\x7b\x75\x92\xc7\xea\x81\xa7\xaf\xc4\xcb\x29\x59\xb5\x07\xab\xfe\xe3\x4b\xb6\x42\x11\x67\x32\x5a\x64\x23\x3c\x79\x65\xa3\xfa\xa9\x15\xdd\x37\xbc\x78\x25\x97\xdb\xd7\x3e\xa7\x54\x1b\xbe\x74\x32\x6e\x3c\x36\x46\xdb\xc9\xc3\xae\x36\x4d\xd5\x3a\x33\x23\x0c\x12\xd1\x69\x99\xef\xb6\x8a\xd8\x21\xd1\x7d\x74\x54\x06\x94\x9f\xe7\xe9\x53\x35\x4c\xf9\xf2\xd2\xb1\xcf\xfd\x64\xba\xc9\x37\x4b\xbe\x50\x68\xb9\x0c\x5d\x9a\x08\xe2\xe0\x99\x6f\x06\x47\x88\x43\x52\x83\x03\xed\x84\x93\xb4\xbb\x48\x3d\xeb\x81\xa9\xd6\x0f\xe3\x82\x92\xbe\x56\x89\xcd\xa4\x13\xd9\x77\x03\x50\x47\x23\x10\x07\xcf\x7c\xd1\x1a\xa1\x73\x8e\x5a\x76\x4c\x2b\x29\xef\x7c\xd8\x5e\xaa\x7c\x1c\x19\x58\xee\xd9\xd3\x77\xe6\xb3\xa1\x7e\xf1\x41\x75\x51\x03\x3a\xbb\x08\xe2\xe0\x99\x2f\xfb\x30\xf1\xee\xe5\xc8\x7e\x73\xd1\x87\x1f\xb7\xc6\xf8\xf0\x1d\xdf\x1c\xf4\xe0\xea\x14\x9b\xee\xe8\xed\x0a\x63\x8f\xb8\x66\x41\x05\xa2\x20\x2e\x40\x46\xea\x7f\x6b\xb0\xbb\x13\xd0\x06\x6b\x72\xc6\x03\x08\xbf\x2e\x3f\xbd\xd8\x38\x9b\x84\xe9\x35\xbe\x77\xa7\xd1\xb8\x85\x76\x91\x9d\x5c\xd0\x5d\x1e\x61\x84\x41\x1c\x54\x23\xfc\xcf\x46\x18\xf4\x42\x9f\x26\x01\xfa\x72\xb1\xee\x7c\x0e\xed\x13\x2c\xac\x1d\x23\x71\x66\xd3\x15\xaf\xf9\xb0\x72\x2b\xfd\x89\xcb\xcf\xaf\x3d\xc1\x61\x96\x37\x83\xae\x37\x01\x71\x48\x4d\x72\xa6\x66\x29\xa8\xee\xac\xa1\x62\x47\x0e\xbf\xb1\xa4\x32\x68\x8a\x13\xa5\x3e\xd0\x92\x62\xf1\xe2\x34\x7b\xe9\xe3\xa2\xd2\xc6\x03\x35\xc9\x01\x70\x48\xbb\x81\x56\x2c\x6a\xf1\x3b\x7c\x62\x9e\x09\x45\x9b\x38\x7b\x16\x73\xba\xa2\x92\x8f\x42\x8a\xce\x3b\x32\xd1\x27\x68\x08\x1a\xef\xd9\x42\xbb\x81\x00\x0e\x2e\x01\x37\x89\xc4\xe4\xc2\x6e\x96\xd0\xb9\xbb\xdd\xb5\x5c\x2a\xa4\x96\xa5\x4d\x4a\xb7\xc8\xd2\x34\x8e\xc5\x3f\x8f\x2e\x24\xb8\xfa\x42\x06\x1b\xc4\xc1\x25\x40\xa8\x5c\x93\x50\x73\x98\x61\xa3\xaa\xbc\x33\x6e\x2b\x75\xf0\xb1\xb3\x51\x02\x2b\xea\xe5\x6d\x09\x8e\x4a\xc1\x3f\x3a\x29\x5d\x8c\x88\xc5\x0f\x88\x83\x6a\x03\x05\xfe\x79\x01\x0c\x9a\x5d\x4f\xd3\x00\x4f\x76\xbc\x8f\x49\x5a\x05\x63\xa6\xec\x49\x60\x65\x32\x9e\x48\xfe\x08\x93\x4f\xfe\x76\xc2\xc8\x9f\xdc\xfd\x81\x8f\x3a\xeb\xd0\x91\x48\x10\x87\x54\x27\x9e\x21\xa4\xf0\xa0\x3a\x9f\xc8\xce\x83\xc7\xc7\xa1\x6e\x10\x4b\x0a\xbb\xb4\xe3\xba\x97\x59\x70\x5f\x18\x6b\x8b\xe1\x5c\x2a\x23\x54\x27\x0e\xe0\xe0\x1a\x78\xb6\xb4\xac\xe5\x46\x79\xdd\xcd\xf3\xa4\x6a\x7e\x75\x4c\xfc\xc2\xb7\x46\x99\xb5\x9e\x96\x0a\x0c\xc6\x71\xf6\x49\x17\x7f\x52\xa8\x05\x01\x88\x83\x6b\xa0\xd7\x59\xea\x37\x6e\xba\x70\xc1\x98\x74\x24\x7f\xe8\xcc\xef\xa8\x45\x6e\x1f\xe1\xef\x8e\xb7\x45\xc7\xa7\xc7\xaa\x70\x1f\xc7\x93\x42\xb5\x8c\x00\x0e\xae\x81\x45\xd6\x62\xbf\x6c\xc3\xcb\x22\x26\x85\x7e\x2a\x81\x31\x91\x03\x4d\xad\x42\xdf\x27\xdd\xb1\x87\xc4\xcc\x09\x94\x9b\xba\x44\x23\x10\x1a\x00\x71\x50\x6d\x20\xc0\x08\x83\x52\xdd\x69\x1a\x60\x50\xfd\xde\x32\x25\x4f\x79\x7d\x3d\x6a\x61\x96\x35\x86\xbe\x41\xd3\xbe\xb5\x28\x31\xed\xde\x9b\x3b\x2a\x8b\xcd\xbc\xfb\x4a\xfd\x88\xb1\x83\x38\xb8\x06\xe6\x87\xc3\xce\xff\x91\x2c\x73\x0a\xec\xa6\x7b\xe3\x4d\x4b\x4f\x7f\x64\x9a\x51\x19\x59\xe8\x2b\x3f\xc6\x1b\x5b\x99\x9c\xa9\x44\x89\x88\x0b\xe2\xe0\x1a\xd0\x66\xc5\x60\x33\xfb\x78\x49\x8e\xaa\x7b\x6a\xea\xcb\x89\x7d\x97\xce\x61\xc1\xeb\x7b\xba\x77\xe8\x7d\x6f\x54\x3f\x95\xe7\x5f\x82\xea\x4e\x41\x1c\x5c\x03\x32\xee\x57\x53\xd7\xbc\xaf\x68\x84\x5c\x1f\xbe\x51\x61\x6b\xf4\xe7\x53\xd2\x52\xaa\xe2\xcd\x3d\x01\x97\x00\x26\x75\x0c\x4d\x1f\xe8\x68\x34\x88\x83\x6b\x40\xdd\x86\xe2\xfd\x39\x75\xd3\x99\xb1\x0a\xa1\xe6\x27\x92\x53\x54\xc6\xe6\xb4\x52\x07\xd8\xaa\x97\x0e\x1e\xd1\xc7\x3e\x8d\x7f\xe7\x82\xd0\x00\x88\x83\xe6\x01\xc3\x7f\xd6\x00\x68\xdd\x71\x9a\x06\x9e\xc8\xb7\x0e\xf2\x0f\x94\xab\x72\x5e\x4f\xe0\x17\xe7\x78\x55\x4e\xfb\x44\xf5\x73\x06\xe5\x45\x22\xe1\x9b\x65\x1f\x3a\xc2\x24\xa0\xce\xf9\x20\x0e\xae\x81\x39\xa5\x1f\x32\xe7\x4c\x17\x85\x34\xf3\xeb\xbd\x76\x4d\xea\xcd\x1e\x8e\xdf\x8f\xe4\x5b\x0f\x51\x17\x72\xec\x88\xc3\x6c\x26\x82\x3a\x87\x83\x38\xb8\x06\x7a\x86\x78\xf2\x96\x5a\x0c\xc8\x6d\x7c\x7f\x7f\x31\xe0\xff\x7a\x61\x07\xdd\xe6\x47\x87\x5f\xd8\x77\x2e\x34\x59\xb9\x54\x71\xad\x47\x88\xb8\x20\x0e\xae\x81\x4f\x16\x4d\x2e\x53\x09\x45\x6e\xe9\x61\x01\x7b\xd7\xd1\x16\xd2\x46\xb9\x1d\x87\x78\x15\x2f\x3d\x25\x7c\xce\x96\x83\x21\x55\x08\x19\x6c\x10\x07\xd7\x80\x8d\xae\x64\xbe\x84\x9f\x37\x47\x34\xef\x33\x2b\x3a\x85\x93\x9b\x5d\xe4\xee\xf7\x6e\x94\x3a\x52\x50\xc8\x4f\xe7\x12\x49\xc4\x11\x22\x34\x00\xe2\xa0\x79\x00\x60\x84\x41\x26\xea\x74\x23\xfc\x4e\xa5\x25\xeb\x15\x26\xdf\x43\xf6\x02\xeb\xc5\x6f\xe7\x7a\x68\xa9\xf5\x25\x31\xb3\x8d\xc4\x3f\xed\xba\x5a\xe8\xcb\xbd\x2d\xef\x40\x98\x4a\x10\x87\x6c\x84\x77\xc6\x2e\x19\xd1\x7b\x6e\x68\xd7\xe2\x7c\x75\x99\xa9\xa7\xb0\xa2\x21\x8f\xbf\x28\x1f\xb1\xc4\xcd\xf0\x7e\x5d\x3e\xcc\xee\xcd\x08\x22\x32\x88\x43\x36\xc2\x8e\x6b\x63\xf3\xb3\x98\x02\x87\x7f\x9e\xb1\xe2\xcc\x7c\x0c\xbc\x2c\x81\xcd\xfc\xe7\xf7\x7e\x1b\x2d\x21\xb1\xba\x49\x72\xa2\x75\x37\x22\x32\x88\x0b\x90\x43\xc1\xfe\xdf\xc8\xff\xfa\x1e\x61\x2e\xc9\x0b\xa5\xfd\x3a\x3c\xa1\x93\xb7\x1c\x3d\x3a\xfa\x2f\xb6\x3b\x1e\xf6\x05\x19\xe2\x2b\x8e\x7e\xdd\x27\x67\x93\x1c\x92\x5a\xfc\xdb\x08\x7b\xb3\x0d\xb1\xc5\xfb\x2c\x2b\xf3\xd1\x2a\x61\x1b\x24\x47\x73\xcf\x5e\xe0\xcc\xe1\xb2\x2f\xab\xce\x35\x8b\x1d\x64\xf4\x12\x26\xff\x0b\xe5\x57\xd4\x4c\x79\xd4\x9d\x44\x32\x4c\x7b\x75\xb1\x48\x9e\x78\xa5\x52\xd5\xbf\x1f\x45\x3c\x81\x30\xa9\xdc\x2d\x32\xf7\x3e\x81\xec\x7f\xcd\x08\x83\x86\xf6\x77\x8d\x30\x92\x11\xae\x0e\xf7\xeb\xd8\xf6\x3c\x9e\xc3\xfc\x14\xf9\x04\x6f\xfe\x77\x83\xb9\x7a\x7c\x51\xd5\x95\x69\x52\x55\x42\xeb\xb7\x23\x4e\x83\xbf\xcf\x64\xb3\x12\xd9\x08\x8f\xda\x4f\xe4\xa8\x15\x8d\xb6\xf5\x27\x29\xde\xfc\x72\xaf\xc5\x79\xbb\x44\x2a\x6b\x26\x3b\xe9\x05\x1e\xb9\x85\x82\x87\xa9\xc0\x99\x74\x8d\x6e\x40\x36\xc2\xe3\x18\x76\xc9\x3d\x5c\x37\xae\x85\xea\x11\x9c\xb4\xf2\x7b\x27\x0a\x99\x54\x3f\x7c\xaf\xc6\x86\x7b\x63\x7c\x99\x55\x59\xb1\xeb\x4c\x7a\x74\x49\x21\x1b\x61\x06\x34\xc9\xee\x09\x14\x9e\x96\xd0\x47\x99\x72\xf9\x8c\x53\xcd\x38\xbe\x1f\xae\xa3\x3c\x93\xe5\xfb\x72\x32\xf8\xfb\x72\xf7\xc4\xd9\x6c\xbb\x23\x1b\xe1\x30\x05\x0b\x33\x3b\xaf\xa4\x58\x99\xc2\x73\xbf\x08\x93\x8e\x84\xd2\xd8\xd1\xdc\x0c\xb4\xde\x67\x3a\x7a\x4d\x92\x61\xba\xf2\x9e\xc1\xcf\x1a\xfc\x3b\x11\x9d\x96\xf9\x76\x37\x3b\x1c\x53\xb2\x7f\x05\xca\x49\x5b\x8b\xd1\x7d\x9f\x36\xaa\x59\xd8\x4f\x9c\x4e\xca\xb7\xc0\x0e\x2d\xc7\x29\x74\x9b\x8d\x81\xce\x2e\x02\x38\x78\xe6\x8b\x09\xff\xfe\xa6\x5f\xdf\xdb\x42\xf7\xa7\x99\xec\xdb\x84\xb4\x8d\x07\x2c\x2d\xda\x24\x29\xc7\x44\x7d\xd6\x68\x5c\x11\x1e\x75\x90\xb1\x04\x71\xf0\xcc\xa7\xbb\x86\x9a\x85\x91\x27\x14\xab\x93\xee\x6c\xd2\x9e\xa2\xef\xa6\xdd\x6c\x78\x2b\x22\x7c\x9d\xf3\x39\xd3\xf1\xa2\xf5\x49\x19\x0e\x22\x2e\x88\x83\x67\xbe\x6d\xfb\xe8\xd7\x55\x89\xcd\xec\x4f\xf6\x6f\xe2\xfb\x9a\xb7\xa8\xe5\xbd\xf8\xe8\xe4\x56\xb5\xff\xc6\xad\x32\xbd\xfc\xbb\x92\xc5\x79\xe8\x28\x37\x80\x0b\x90\x41\x41\xff\x3b\x6e\xf1\x55\xc5\x22\xfa\xc8\xca\x8a\x44\xf9\xa4\xd2\x07\x51\x92\x32\x47\x86\xd3\xcc\xc3\x17\x4b\x28\x12\x32\x2f\x46\x96\xb2\x8e\x32\x22\x8c\x30\x88\x83\x6a\x84\xff\xd9\x08\x83\x5e\xe8\xd3\x24\x70\xcc\x61\x6b\x49\x2a\xdf\xc8\x18\x2e\xc2\xd2\x4f\x65\xd0\xd3\xd7\x7c\x9f\x6b\xab\x70\xbb\xe8\xd1\x7d\x8f\x28\x9a\x84\xbd\xef\x4f\x10\x43\x07\x71\x48\xc7\x62\xa5\xbc\x9d\x49\x79\xf0\x45\x2f\xd7\xe6\x0f\xd6\x99\xe8\x6b\x5a\x5f\x20\xb8\x28\x68\xc7\xbd\x65\x9b\x9e\x1a\x72\xc1\x19\x0f\x32\xd8\x20\x0e\x2e\x81\x0e\x15\xa2\x8b\xc4\xb3\xe3\x3c\xa3\x8c\x47\x17\x0e\x05\x1d\x9a\xcd\xef\x55\xf2\x2e\xac\xcb\xcd\xb2\xcb\xca\x29\xb7\x5f\xa7\xa3\x43\xc4\x05\x71\x70\x09\x1c\x26\xd0\xf7\xdc\xb4\xfb\xb3\x1a\xb8\xbd\xda\xe3\x5f\x2e\x7d\x51\x65\x3a\x66\xea\xc7\xae\x64\x4b\x9e\xf7\x5b\x61\x27\x21\x4b\xc8\xb4\x81\x38\xb8\x04\xaa\x67\xf2\xb3\x8f\xbe\xb4\x07\xe9\x8d\x12\x38\x04\xab\x0d\xba\x74\xb3\xa6\xed\x33\xe9\xaf\xec\xcb\x76\x8d\xdf\xf3\x12\xc4\xa0\x46\x2c\x7e\x40\x1c\x54\x1b\x08\x30\xc2\xa0\xd9\xf5\x34\x0d\x94\xa1\x51\x1c\xa5\x10\xbb\xf0\x58\x73\x1a\x92\x68\x64\x08\x4c\x76\xb6\x09\x1a\x66\x26\xc5\x56\x98\xbb\xb2\x4e\x93\xac\xf1\x56\x22\xc6\x0e\xe2\xe0\x1a\x18\x13\xca\x46\x5b\x6c\xcd\x0c\x31\xb2\xcc\x56\xbe\xb1\x8d\x9f\xa8\xc9\x54\xb1\xb4\x7b\x41\x37\x3c\x3b\xf3\x5c\x72\x04\x96\xee\x2b\x68\xf7\x1e\xc0\xc1\x35\xa0\xf7\x86\x41\xd7\xd9\xee\x52\xd4\x61\xf4\x63\x82\x2a\x7b\xce\xd8\xfd\xc2\xf1\xc5\xf2\xed\xa7\xe9\x35\x5f\xb0\xf7\x57\xf5\x16\x8d\x11\x71\x41\x1c\x5c\x03\xbe\xc2\x2c\x86\xb7\x14\xd5\x88\x0d\x34\x03\x65\x38\xb4\x1a\xec\x3d\x99\x7e\xf7\xcb\x8a\x4d\x98\xad\x0c\x7f\x15\x69\x55\xc6\x5e\x46\xc4\x05\x71\x70\x0d\xa4\x99\x59\x58\xe5\xd7\x7f\x1e\x21\xdb\x9c\x36\x3e\x44\x49\x8b\x7d\xf2\xc2\x79\x55\x25\xa3\x6a\xea\xe6\x64\x38\x13\xdf\x5a\x17\x74\x97\x34\x88\x83\x6a\x03\x01\x46\x18\x94\xea\x4e\x2d\x91\x78\x60\x30\xfe\x41\xcb\x99\xfe\xd6\x7b\x5e\x99\x1e\xc2\xb0\x07\x15\xfc\x62\x11\xc1\x3c\xcd\xfe\x5e\x13\x18\x05\xa8\x77\x9b\xa0\x54\x00\xe2\xe0\x1a\x70\x11\xd5\x7c\xe7\x17\xc0\x50\xd4\x94\x42\x9b\x64\x78\x93\xdd\xc2\xde\xfd\xf8\xf9\xe7\xf7\xf6\xa2\x6d\x14\xf6\xb2\xc1\x74\xa9\x50\xbb\x08\x10\x87\xd4\x28\xa9\x22\xb6\x67\x97\xa8\x80\x54\x4f\xe9\x19\x8a\x5a\xdb\xaf\xee\x1b\x65\xf5\x5e\x39\xdd\x2b\xc7\xea\x7a\x6f\x6a\xb4\xf2\x3b\xa0\x6b\xdf\x40\x1c\x5c\x03\xdf\xf3\x6e\x26\x09\x14\xbf\x49\xcc\x32\x2a\xd0\xf7\xfc\x2e\xfc\x36\x62\xab\x18\x97\x35\xed\xb5\x48\x54\x0d\xc3\xfe\xde\xbd\x42\xe8\x3e\x71\x10\x07\xd7\x80\xab\x0a\xcb\xa6\x73\xa4\x06\x43\xa2\xae\xb2\x9a\xfa\x48\x91\xc1\x61\xf7\xc5\x38\x5d\xd4\xb7\x65\xfe\x01\xcd\x39\xfd\x6b\x87\x37\xa0\xce\xe1\x00\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\xf5\x3e\x71\x6a\xe3\x32\x72\x56\x76\xbc\xdf\x59\xae\x9f\xcf\x6f\x8a\xce\xbd\xc2\xd1\x96\xa8\x68\x8c\x0b\x30\xc8\x0f\x0b\x9c\x97\x49\x9f\x44\x8c\x1d\xc4\x21\xdd\x23\x9c\xce\xcc\xf0\x83\x2f\x01\xfd\x6a\x4e\x85\x8d\x5d\x8d\x72\x3b\xb6\x91\x50\x99\xa7\x99\xc8\xa0\x4f\xfb\xcf\x20\x49\x5e\x1b\xe8\x12\x09\x10\x87\x74\x9b\x62\x66\x19\xc9\xe7\x74\xfb\xb7\xd5\xf9\x4b\xa4\xb1\x5b\x9d\x63\x54\xdd\xe2\x14\xf2\x4f\xa9\xd9\x7c\x76\x0c\xf9\x98\xf9\x82\x98\x10\x71\x41\x1c\x5c\x03\x28\x85\x8e\x4d\xe8\x52\x3c\x8e\x37\x78\x93\x7e\x86\x9d\x9c\xf8\x79\xfd\x94\xb9\x10\x68\xff\xa7\x33\x38\xfe\x5b\x04\x3e\xfe\x4e\x0d\x22\x2e\x88\x83\x6b\x40\x7a\xb4\xed\x5c\xf6\x23\xaa\x09\x12\x4a\xaf\xef\x83\x43\x9d\x6b\xe1\xad\x12\xdc\x64\xdf\x1c\x53\x83\x9f\xdc\xc7\x6b\xe6\x55\xb4\x45\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\x4c\xd4\xe9\x46\x38\x46\x9f\x30\x95\x4f\x72\xb9\xbd\xdf\xc7\x45\x40\xdc\x6b\xa4\x02\x6f\x0a\x2b\x5d\xd1\x8b\xef\x7a\xb6\x7f\x05\x51\x0f\x5e\x30\xb4\xbb\x0a\xe2\x90\x8d\xf0\x2d\x29\xad\x6d\xda\x8f\x92\x9b\x0c\x24\xdd\xa8\xa2\xd8\x39\xa5\x74\xa1\x5b\xdf\x3f\x0e\x08\x90\xbf\xfc\xb3\xd7\x31\x6c\x92\xc1\x83\x88\x0c\xe2\x90\x8d\xf0\x09\xcb\x2f\xbc\x37\xde\xfd\xa3\xb5\xb4\xbc\xaa\x99\x4e\xc5\x4e\xf9\xbd\x95\x3d\x97\x52\x29\x46\x2b\x3c\x34\x8b\xd3\xde\xbd\x61\x40\x44\x06\x71\xc8\x91\xff\xf5\x3d\xc2\x6d\x61\x97\x09\x1d\xae\x89\x6a\x14\x0d\x7a\x68\x68\x2c\x50\xca\xd2\xaf\x17\x9b\x51\xd5\x33\x18\x1e\x5d\x73\xcd\xb8\x2c\xfc\x72\xfe\x6f\x23\xcc\xcf\xbc\xf1\x12\x87\xa2\x97\xf5\xe2\x85\xdf\x6e\xdf\xd9\x6e\xdf\xb9\x58\xc6\xfc\xa8\xd8\xaf\xc9\xcb\x2c\x29\xa7\xc3\xcb\x9c\x20\xed\x2f\x54\x82\xf8\x79\x8f\xa5\xe2\xa3\x52\x5f\x96\x0e\xbd\x1f\x71\x7b\x7d\xcb\x1c\x2f\x19\xd6\x35\xd5\x14\x1c\x52\x6f\x5f\x75\xe5\xa6\x66\xfb\xaf\x19\x61\xd0\xd0\xfe\xae\x11\x56\x85\x9b\xa5\x1f\xb7\x0b\xf3\xb3\x12\x1b\xfd\x6c\xb5\x2f\x9e\x7c\xe9\x67\xe0\x90\xce\xd9\xf4\xbb\x76\x3d\xbb\x9d\xb9\xa4\xb2\x2d\x22\xb9\xe4\x4c\xda\x47\xf9\x22\x1b\x61\xbf\x72\x47\xa9\xab\xaf\xe5\x43\xdf\xf9\x0f\x67\x1a\xb1\xb0\xbe\xd2\x29\xda\x6e\xd5\x5f\x27\xdc\xcd\xef\xae\x5a\xe5\xc8\xa5\xd2\x3c\x93\xad\x59\x6d\xa4\x9f\x15\xc5\x1a\xe4\xe5\xa2\x33\xd8\x5c\xd7\x2b\x79\xf5\xb3\x3a\x70\xf7\x4d\xda\x96\xf5\x0f\xb6\x97\xed\x14\x56\x4c\x09\x23\x32\xce\x13\x67\x32\x5a\x64\x23\x9c\x6c\x59\x48\x91\x41\x5b\x41\xe0\x32\xb3\x47\xf0\x41\x8b\xfd\x87\x41\x5d\x8b\xe3\x6d\x9f\x1b\xdf\x1d\x63\x23\x18\xe4\x3e\xf9\x15\x9c\xc9\x68\xdd\x90\x7e\xf6\x0b\xea\x9e\x64\xa8\xd3\xf0\x85\xf7\x7b\x59\xaf\x8e\x94\x62\xaa\x1c\xb8\x36\xc3\xae\x45\x2e\xa6\x0b\x4c\xbd\x92\x1c\xad\xc3\x72\x3d\x33\x23\x0c\x12\xd1\xa9\xe7\x62\x75\xe5\x63\xef\x9e\x8b\x67\x7a\x1a\x5f\xc5\x55\xf3\x53\x99\x31\xfc\xe0\x21\xe1\x0f\xf3\x56\x11\x59\xbb\x00\xc1\x2f\xda\x1e\x90\xab\x00\x71\xf0\xcc\x47\x9d\x6b\x21\xa2\x20\xc7\x9c\x19\x31\xbb\x70\x71\xd7\xdc\x47\xc2\xb1\x6d\xb6\xc6\x44\xb1\x5f\xff\x71\x98\xef\xcf\x45\x81\xe7\x2e\x88\xb8\x20\x0e\x9e\xf9\xcc\xcf\xdf\x37\xbb\x5f\x7d\x44\x47\xa0\xa4\xff\x56\x71\xa3\x90\xe9\x06\xe9\x6d\xee\xb2\x66\xbc\xfe\xb0\xb2\xd4\xfd\xaa\x5b\x87\x66\x88\xb8\x20\x0e\x9e\xf9\x82\xcb\x7a\xf1\x8d\x7f\x57\xad\xbc\xdb\x39\xba\xc6\x6c\x18\xf8\x01\x95\x94\x5a\xda\xe7\xd1\x57\x23\x0d\x27\xfe\xfc\x35\xb5\x1d\xa8\x1b\x35\x88\x0b\x90\xf9\xdf\xdb\xd8\x51\xb1\xbe\x31\x99\x4e\x0b\xa1\x4e\x67\xb6\x6f\x6d\xd5\x55\x58\x62\x78\x32\x0f\xa9\xee\xa6\xe6\x63\xf5\x97\x63\x63\xae\x93\xd4\x22\x8c\x30\x88\x83\x6a\x84\x55\xff\x71\xf1\x03\x7a\xa1\x4f\x93\xc0\xfc\x7a\xcb\xc5\x4a\x57\x05\x75\x9b\x4c\x52\x29\x0f\x35\x37\x6a\x3d\x8b\xf7\xb5\x7f\x22\x36\xe2\xad\x38\x03\x47\xfa\x24\x0f\x1e\x43\x3b\x36\x00\x0e\x2e\x81\x32\xcc\x5f\xf1\x18\x03\x94\x27\x5f\x87\xda\x88\x9b\x28\xe9\x2d\x5f\xf3\xbc\xbe\xdb\x7f\xf4\x50\x26\x9a\xf4\x43\xa6\xaa\x9e\x08\xd4\xdd\x19\xc4\x21\x99\x20\x6a\xbf\x3b\xc2\xfd\xbc\x64\xa5\x51\x15\xb1\xfd\x29\x4f\x63\x7e\xbe\x31\x8f\x90\xa1\xa7\x31\x49\x46\xbd\x45\xb1\xf0\x6a\x22\x15\x32\x41\x00\x0e\x2e\x81\x7b\xd8\xe3\xcf\x77\x9b\x65\xab\x97\xfb\xf7\x13\x3e\xc6\x58\x1b\x3c\x1b\x8a\x31\x7b\xf7\x76\x99\xc1\xc4\x1f\x9f\x52\x99\x41\x2d\x1e\xea\x42\x0b\xe0\xe0\x12\x38\x61\xca\x12\xa9\x9f\xbe\xed\x1d\x76\x22\x72\xbf\x2f\x8e\x8e\x46\x57\x0c\x03\xed\x77\x4f\xc7\x55\x1f\x47\x9b\xe7\x3b\x3c\x3e\x51\x88\xc5\x0f\x88\x83\x6a\x03\x01\x46\x18\x34\xbb\x9e\xa6\x01\x82\x8f\xd8\x75\xe8\xe8\x23\x8d\x11\x69\x73\xed\xee\x4c\x37\xa3\x6d\x98\x0e\x46\x1d\x7e\x59\x0a\x9f\x57\x65\xb8\xac\x69\x6c\xe3\x8d\x18\x3b\x88\x43\x6a\x1e\xff\x90\x39\xd4\x87\x5c\x35\xc4\x26\xa4\x71\xba\x96\x8d\x6e\x73\x9b\x82\x56\xbb\x35\xd7\x7f\xc0\x3e\xc8\xf1\x85\xe3\x66\x97\x01\xd4\x3c\x1e\xc0\x21\x4d\x03\x51\x53\x69\xe3\xf5\x72\x03\xe5\x4e\x66\x54\xd1\x46\xe3\x5f\xfb\x3d\x8b\xfa\x5e\x87\x48\xef\x89\xe8\x61\x67\x14\x86\xde\x81\x4e\x05\x80\x38\xb8\x06\x18\x6a\x88\x73\x96\x73\xae\xae\x5b\xe3\x1c\x2a\x5e\x67\xef\x65\x70\x79\x83\xcb\x7c\xe9\x2b\xeb\xe5\x7e\x65\x49\xff\xc0\x15\x22\x68\x27\x08\xc4\xc1\x35\x70\x59\xce\x5b\xfe\xb9\x65\x22\xff\x27\x05\xa7\x97\xa1\xc5\x0c\xaa\xbb\x51\x8c\x57\x48\x3e\x0c\x39\xf6\x53\x97\xde\x88\xc8\xf3\xbd\x85\xd0\x00\x88\x83\x6a\x03\xb5\x01\x57\xe7\x00\x52\xdd\x69\x1a\x50\xf9\xb8\x19\xf7\x1b\xcb\xa2\x2a\x69\xaf\xca\x4c\x18\x53\x53\xe2\x06\xfb\xcd\x7d\x4c\xdc\x80\x80\x2b\xfa\x06\xe6\x7b\x6a\xb9\x6a\x88\xb1\x83\x38\xb8\x06\xde\xcd\xc7\x63\x8d\x99\xe3\x4e\x0d\xee\x09\xbd\xb7\x5c\x59\xd5\x71\xec\xbc\xf3\x42\xbb\x84\xc7\x32\xd1\x22\xff\x7b\x8b\x6a\x3c\xd4\xdf\x10\xc4\xc1\x35\x10\x64\xd5\x6b\xdb\x66\xaa\xcb\xc7\x75\x3c\x4d\x7b\xf7\xf9\xb1\xce\xb8\x29\x99\xc9\xc0\xf6\x82\x6b\x93\x02\x55\xd8\xb3\xef\x6b\x97\x10\x71\x41\x1c\x5c\x03\x96\x31\x32\x73\x17\x5a\x63\x4a\x57\xc4\xaf\x14\xb7\x2e\xd2\x77\x62\x04\xb6\x3f\x7c\x45\xe2\xbc\xbd\xc8\xfb\x7c\x6a\xe9\xb5\x17\xb4\x23\x0c\xe2\xe0\x1a\xc8\xc5\xf4\x61\x52\x71\xa6\xd1\x4d\x33\xa4\xdc\xd2\x2e\x25\x78\xe4\x6f\xc9\xf1\xd4\x7d\x21\xe9\x92\x40\x6a\xd7\xad\xfa\xdf\xbd\xf5\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\xd0\xba\xe3\x34\x0d\xf8\xb9\xdd\x16\x99\x76\xcf\xab\x5d\x2f\x4a\x46\xd9\xe7\x8b\xd1\x1b\x9a\x61\x8c\x6d\xcf\x4e\x72\x2f\x7b\x6e\xd9\x69\xdd\x4e\xf4\x05\xfa\xb8\x00\xe0\xe0\x1a\xf0\x67\x66\xe1\x0b\xfc\x7f\xcc\xfd\x79\x38\x55\xfb\xff\x07\xfc\xef\x65\x88\x28\xf3\xb0\x96\x29\xf3\x3c\x44\x24\x42\xe6\x79\x0c\x09\x09\x99\xe7\x29\x21\xe3\x32\x64\x4e\xa1\x90\x99\x94\x39\x99\xa5\x90\xcc\x42\x24\x54\xe6\x39\xf3\x1c\x4a\x7e\x57\xf7\xe7\x7b\xce\xb7\xbd\x3f\x67\xdd\xce\xef\xba\xbe\x7f\xdc\xfd\xe3\x5c\xfb\xbc\x3c\xf6\x5e\x7b\xbf\xd7\x5a\xaf\xf7\x7b\xad\xfd\xe4\xca\xc2\x6d\x51\xa6\xf9\x32\x14\x5b\x91\xfe\xf1\xe7\x8f\x6e\x23\x17\x46\x64\xfa\x27\x73\xe7\xf7\x22\xf7\xff\xce\x0a\x38\xa9\x0e\x73\x0c\x78\x96\xd8\xc7\x3d\xea\x58\xd1\xa0\xca\x98\x59\xb6\x3e\x57\x62\x6c\xf1\xc6\x4e\x8e\x99\x53\xc8\xc8\xdc\x6e\xff\x8b\xa9\x93\x80\xc5\x5f\xee\x49\x75\x98\x63\xe0\x5c\xa0\x85\xb5\x51\xb1\xb4\x7f\xf3\xf4\xc3\x1d\x47\x3e\xfb\xcf\x3c\xe5\xee\x29\x31\xaa\x19\xf3\xc9\x77\xea\xde\x8b\xe6\x5a\xff\x3d\xb6\x4e\xaa\xc3\x1c\x03\x5f\x9f\x4b\xd3\x5c\xb7\x1f\x25\xa4\x18\xbc\x17\x46\x12\x13\x16\x71\x3a\x4b\xb1\x11\xe0\x17\x6d\xc9\xdf\xf1\xd1\x3e\xcb\x6e\x79\xfc\xd7\x18\x38\xa9\xee\xef\xe3\x80\xcf\xff\xfb\x44\xf8\xa4\x49\xd4\x3f\x4f\x84\xa5\xb2\x03\x35\xbe\x8d\x4a\x24\x54\xac\xc3\xdf\xa7\x0b\x0b\xba\x1d\xab\x56\xad\x6b\x04\x0e\xc6\x54\x72\xf0\x97\xef\xa0\x4e\x97\xfe\x35\xa9\x3c\xa9\xee\xbf\x27\xc2\x31\x31\xf5\x0f\x34\x7c\x14\x66\x3d\x5d\xe5\x0a\x33\x94\x37\xee\x92\x94\x73\xf4\xf8\x98\xd9\x1a\xf3\x67\xd2\x94\xdf\x10\xdb\x56\xff\x4b\x3e\xa9\xee\xbf\xa7\xab\xb3\x29\xa2\x9f\x40\xf7\xf0\xf7\x5c\x4f\x19\x16\x17\x74\x70\xc3\x58\xe7\x2f\x8c\xde\xcc\x9c\xa0\x16\xca\xf0\xdf\x19\x83\xf7\xe2\xfe\x92\x4f\xaa\xfb\xef\xd7\xfc\xaf\xff\x8e\xb0\x80\xbf\x5b\xb0\x41\xa8\x19\x97\x88\x55\xbc\xfd\x47\xae\x07\xb3\xbf\x98\x37\xca\xfd\x1d\xbb\x9f\x90\x09\xc5\x70\x8a\xf9\x12\x0b\xfd\x39\x11\xf6\xac\xee\xd3\xd9\xbc\xcb\xf5\x33\xb0\x20\x56\xe7\x82\xe2\x19\xa3\x95\x64\x2b\x82\x64\x0d\x9d\x6e\x76\xbd\xd3\x6a\xa9\x32\x3e\x7f\x86\x65\x45\xf3\x29\x81\x65\x96\x32\x96\x5d\x6a\xd5\x72\xcc\x60\x15\xff\xce\x0e\x99\x39\xa9\x0f\x67\x9c\x6a\xf1\x99\x0a\x5f\x4e\x41\xa6\xff\xaf\x4d\x84\x4f\xda\xb4\x3f\xbf\x23\xfc\x5f\x13\xe1\xef\x78\x7e\xbf\xe4\x9e\x1e\x17\x44\x97\x1d\xbf\xab\x04\x75\xa4\x71\x0d\x9e\xae\x3c\x88\x65\x59\xf6\x53\x9a\x8a\xa0\x64\x7c\x7d\xf0\x7f\x72\xb1\xf2\xbf\x27\xc2\xd0\xc2\x87\xa4\xfb\x0e\x33\xe2\xca\xcf\x22\x38\x2c\xf4\x5d\x3d\xb2\xef\xf3\xcc\xf5\xd5\x59\xd1\xba\x1f\x65\x71\x89\x1c\x65\x7b\xfc\x9f\x5c\x9a\xfd\xef\x89\xf0\x0b\xdf\xee\x89\x9d\xed\xea\xd4\xb3\x49\xd6\x1f\x52\x8b\x12\xbf\x3a\x3b\x9c\x66\xd2\xa3\x88\x2f\x1b\x54\xd6\x09\xae\x14\x78\x5c\xff\x7f\xb2\xb5\xff\x3d\x11\x3e\x60\xef\x58\x59\x38\xfc\xf9\x44\xc6\x51\xb9\xe8\x4d\xfb\x7c\xa5\x5b\x5b\xe0\xce\xb4\x6e\x39\x85\xff\x3e\xe5\x04\x07\xdb\x7d\x99\xff\x93\xad\xfd\xef\x89\x70\x1b\x91\x98\xef\x52\x43\x92\xf5\x1b\x8b\x47\x57\xf0\xef\xe4\x7f\x2f\x7e\xf9\x23\xbf\xe2\x0b\x56\x2d\x23\x9e\x8d\xcf\x5b\xb0\xf5\xc9\xff\xd9\x44\xf8\xa4\x41\xf4\x4f\x67\xbe\xe1\x7a\x79\x6d\xbb\x72\xcf\xe4\x18\xae\xfe\x9a\x03\xe1\xc9\xef\xdb\xb1\x1c\x2b\x45\x0b\xaf\x3c\xdf\x36\x71\x60\xa5\xc6\xbc\x1f\xfb\xeb\x88\x7f\x52\x1d\xe6\x99\xcf\x9c\x9e\x3a\xa3\xb0\x8e\x57\xd7\xf2\x39\x1d\x77\x87\xa6\x25\x05\xbd\xe5\x70\xf8\xa7\xde\xfa\x69\x8f\xe9\x63\x41\x6b\xcb\x9f\x7f\x4f\xb0\x4f\xaa\xc3\x5c\x52\x75\x67\x3f\x7c\x90\xf2\x56\x69\x93\x63\x0c\x5b\xda\x9b\x94\xd0\xe5\xd1\xbb\x5e\xca\x9b\x29\xf8\x65\x65\x15\x92\xf8\x44\x46\xd6\x2e\x7f\xdf\xbb\x75\x42\x1d\xa6\xdb\xfc\x2b\xbd\x23\x63\x60\x76\xb5\xc5\x91\xcd\xe8\xac\xcc\xd3\xf7\x01\xe1\x9a\xf2\x25\xfb\x2e\xb7\x33\x9a\x38\x2b\x3a\x65\xed\xac\xff\x72\x4f\xaa\xfb\xaf\x0e\x98\x4a\xa7\x7a\xdf\xb4\xeb\xf0\xbc\xf0\x6c\xff\x08\x99\xce\x32\xaf\x0e\x65\xd0\x87\xad\xa5\xf7\xbc\xdc\x99\x9b\x6f\xf7\x1e\x0f\xff\x35\x11\x3e\xa9\xee\xef\xef\x08\xff\xbf\x4f\x84\x4f\xda\xa1\xff\x69\x08\xdc\x97\x2e\xf5\x7b\xe0\x4b\x52\xe2\x65\xb7\x4e\x1e\xb0\xf2\x6a\xed\x02\x3b\x0e\xf5\x7c\x2a\xf1\x2b\x2c\x25\xa1\x9c\x35\xfa\x12\x91\xbf\x36\xfd\xa4\x3a\xcc\x21\x60\xfb\xe8\x54\xb2\x3f\xb6\xfe\x58\xcb\x7c\xae\xd4\x7c\xc4\x90\xf3\xc7\x7e\xf5\xc3\xfd\xe4\xcf\x2a\x7d\x8d\xb8\xec\x24\xa3\xbe\x37\xfe\x72\x4f\xaa\xc3\xfc\xa8\x50\x82\xa9\x75\x9b\x6c\xeb\x44\xd3\x2a\x26\x4a\x6f\x76\x38\x99\xde\x31\x5c\x05\x3b\x8a\xdf\x9d\x1a\x0f\x62\xf8\xac\x7c\x26\xff\xef\x5b\x38\x4f\xaa\xc3\x74\x05\x5e\xb0\xfb\x99\xb8\x64\x35\x7d\x1f\x7a\x2f\xf3\xad\xf3\xda\xc4\x07\x5b\xea\xc2\x24\xf7\xfd\xfd\x14\x96\xd9\xc3\xa7\xde\xaf\xff\x6e\xaa\x4e\xaa\xc3\x1c\x02\xe4\x3c\xb7\x55\x8f\x1f\x2d\x2f\x3e\x18\xea\xb4\xbf\x67\xb6\xe0\x65\x5e\x9f\x81\x53\xd7\x57\xfb\xc0\x23\x55\x5f\xf1\x50\xe2\x14\xc1\xdf\xb7\x46\x9f\x50\xf7\xf7\x77\x03\x4f\x98\x08\x9f\x74\x74\xfd\xa7\x31\xf0\x20\x90\xc1\xc6\x47\xec\xde\xfe\xb9\xaf\xc7\x7c\xc2\xc9\xcc\xb3\xee\xb9\xa9\x52\xee\x2d\xde\xa7\xc4\x12\x56\x76\xcf\x5e\x8d\xb9\xf0\xd7\xb6\x9f\x54\x87\x39\x06\xca\x5d\x77\x8c\xe9\x62\xe5\x6f\x30\x46\x59\x9c\x26\x6f\x12\xf9\xea\x97\x4d\x51\xf1\x60\xbc\x48\x15\x37\xbc\x5d\xf8\x6e\xef\xfd\xbf\xbf\x21\x71\x52\x1d\xe6\x67\xb5\xf3\x56\x97\xe6\xe1\x4b\xfe\x2c\x96\xab\x33\xfb\x72\x04\x91\x3c\xc5\xab\xb8\xd7\xf6\x18\x5f\xb6\x5f\xdc\x9e\x88\x14\xe4\x70\xe2\xfe\xfb\x06\x8e\x13\xea\x30\xdd\x2d\xdb\x06\xca\xe8\x6a\xfb\xcf\xad\x1d\x2a\x14\xf8\x13\xee\xd9\xe4\xd4\x04\xd9\xee\x6c\x3f\xed\x04\xbe\x5f\xc1\x6a\x99\x1b\xd6\xf8\xcb\x3d\xa9\x0e\x73\x0c\x94\xc9\xe5\x78\x0b\x13\xb7\x79\x26\x0a\x6b\xb4\x75\x90\x09\x5e\xd9\x56\x18\xc7\x23\x4a\x5f\x88\x4d\xb6\xb2\x56\x4f\xff\x45\x1b\xf8\xd7\x18\x38\xa9\xee\xef\xef\x06\x9e\x30\x11\x3e\xe9\x54\xf7\x4f\x63\xc0\xdc\x31\x27\x21\x32\xfd\x3d\x4f\xba\xa1\x8e\xc5\xe1\xea\x74\x58\xe2\x8f\x2a\x1a\x07\xd1\x38\xbf\x2d\xe6\x0e\x69\xcd\x83\xce\xbf\xf7\xd7\x93\xea\x30\xc7\x40\xcf\x6d\xfc\xcd\xe8\x95\x57\x3a\x4f\x96\xc9\x2e\xec\x51\x1d\x06\xe0\xbd\xdb\x29\xcb\x65\xcf\xdc\x7e\xb8\x16\x16\x4d\x2b\x58\xf7\xbf\x77\x70\x9c\x50\x87\xf9\x59\x6d\x0e\xee\x5e\x1d\xd0\xd4\xb9\x72\x7c\x8b\xba\xfb\xe9\x50\xd3\x3d\x65\xba\x19\xda\x18\x27\xe3\xab\x2d\x35\xca\xc6\xa0\x58\xe4\xdf\x7f\xf2\xeb\xa4\x3a\x4c\x57\x5c\x0d\x4b\x38\xc6\x86\xe6\xb0\xf5\x49\xab\x6f\xb1\x81\x93\xe1\x15\xca\xf8\xe1\x89\x0f\xa2\x03\xfa\x3c\x8e\x84\xf3\x74\x9f\xb2\xfe\xbe\x32\x7e\x42\x1d\xe6\x18\x48\xe1\x17\xd3\xba\x12\xaf\xaf\x1c\x58\x67\x45\xd6\x7c\x74\xa5\xce\xff\x7a\x0e\x97\xb1\x2b\x7f\xf7\xd3\x29\xbe\xfb\x43\xfa\x6a\xf4\x7f\x8d\x81\x93\xea\xfe\x3e\x0e\x9c\x30\x11\x3e\xa9\xef\xf8\xa7\x31\x60\x2f\x3b\xa5\xbd\x3c\x5b\x58\x48\x66\x52\x97\xfb\xea\x91\xf1\xea\x63\xa1\xe0\xc0\x8b\x72\x41\x19\x1c\x6c\xa9\xef\x62\x74\xb6\xff\xbe\x72\x7b\x52\x1d\xe6\x18\x38\xc4\xa7\x82\x26\xd5\x9f\x3a\xb7\xaa\xbf\x57\x6d\xff\x14\xec\xb5\x54\xfc\xe8\x2b\x6e\x98\xa8\x63\x4e\xde\xe6\x06\xf6\x93\x55\xdd\xbf\xa3\x48\x4e\xa8\xc3\xfc\xac\xd4\x6e\x36\x71\x95\x4c\xb5\x48\x7a\x13\x46\x17\x07\x8c\x29\x5f\xfe\x12\xb9\xd2\x19\xd9\x94\x75\xa6\x5d\xcd\x55\xeb\x71\xae\x64\xf8\x5f\xee\x49\x75\x98\x6e\xf8\x74\x4a\x7c\xc7\x13\xb3\x0d\xae\x26\xe9\xd9\xb6\xc1\xfb\x12\xc1\xaf\x0c\x95\xe5\xb4\xfb\x2e\x65\xaa\x7d\x38\x7a\xe8\xa8\x6d\xf7\xf7\x77\x8f\x4f\xa8\xc3\x1c\x03\x22\x5f\xf2\xb9\x5d\xcb\x3c\x8e\xe5\x1f\x3c\x53\xba\x13\xe4\xad\x99\x2e\x21\x73\x9a\x76\x39\xff\x2b\x96\x0a\x05\x6b\x18\xae\x86\xda\xdf\xa9\xd1\x27\xd4\xfd\x7d\x1c\x38\x61\x22\x7c\xd2\x24\xea\x9f\x27\xc2\x2f\x99\x0c\xaf\x27\x14\x86\x25\xa6\xdf\x7a\x3e\xd5\x03\x14\x5b\xd7\x6a\x7b\x39\x18\xc4\x2b\xd2\x97\x30\xbd\xd1\x0c\x23\x74\x21\xf9\x6b\x52\x79\x52\xdd\x7f\x4f\x2a\x69\x86\x63\xa4\xc9\x0e\xb3\x47\x33\xfb\x76\xc2\xfa\xdc\x4b\x37\xc7\x42\xba\x22\xbc\x6e\x37\x9a\x68\x2e\xa9\xc5\xb0\x2a\xc8\x2f\xfc\x25\x9f\x54\x17\x22\x8f\xc2\x41\x97\xdf\x9f\x0d\x69\x73\xd2\x67\x7a\xb5\x19\xb1\x16\xb0\xb0\xd5\x4c\x25\x35\xec\x65\x3f\x5a\x55\x70\x66\xee\x73\x7b\x89\xc3\x39\x57\xd9\xbf\xe4\x93\xea\x42\xe4\x51\x28\xf4\xb1\x7b\xe2\xdf\x11\x96\xfc\x4f\x9d\xe6\x50\xe7\x8f\xab\x9a\x1c\xcf\x1f\xcf\x60\x11\xe0\x65\x65\xc5\x6e\x4b\xe8\x6d\x07\x2e\xb3\x80\x96\x9b\xcd\x13\x07\x7d\x77\x62\x60\x7d\xa0\x3e\xe6\x23\x64\xc3\xc0\xdf\xd9\x14\xfa\xe2\x9e\x4a\xd5\xb4\x5e\x4e\x8f\xcc\xa8\xd1\x7f\x7e\x5b\x8c\x41\x71\x7e\x58\x7a\x5f\x9e\xde\xe4\x1b\xae\xea\x13\x02\xb5\xa9\xaf\x67\x89\xf6\x77\x17\xaf\x99\x7c\xe3\xbf\xa0\x59\xa3\x3b\x07\x5f\x17\xc4\x86\x7f\x18\x48\xb3\x33\x49\x26\x2b\x4e\xbf\xca\xfc\xc0\x6a\x64\xac\xc7\xd2\x54\xc6\xe6\x31\xfa\xf2\xbd\xf6\x06\x2c\x1f\xde\xd3\xa7\x50\xab\xcf\xb8\x0c\x92\x90\xa9\x51\x52\xd1\xb3\x2e\x39\xfb\x9d\x07\xf4\x51\x54\xd6\x76\x8e\x02\x17\x05\xee\x58\xb9\xdb\x59\xdb\x59\x59\xba\x5b\xd9\xd8\x79\xdc\x76\xf7\xf9\xe7\x47\x83\x80\xff\xbc\x18\xb7\x17\x89\x84\x93\xea\xd9\x14\xfa\xad\x54\x6e\x9d\x4e\x36\xdf\x77\x39\xcc\xdd\x5b\x34\x69\xac\xe7\x3f\x3d\x4c\x50\x25\xdb\x26\x0b\x91\x45\xfd\x79\x91\x94\xd8\xd4\x52\xad\x66\x0d\xdf\x58\xcd\xa5\x5a\x24\xcd\x78\xac\xc7\xec\xcc\x80\x22\xff\xcd\x97\xa6\x0b\xc4\xd3\xaa\x4f\xaa\xc5\xcf\xfe\x51\x0a\xfe\xb2\x7f\x6f\x9e\x9b\xeb\x70\x46\x54\x42\x55\xfc\xfe\x33\x35\x98\x67\xab\x2b\xf5\x6a\x90\xf6\x83\x34\xef\x41\x7c\xfd\xa8\x33\x17\xfe\x9d\x18\xfc\x9f\x6c\x6f\x38\x58\x16\xa5\x23\xcd\x09\xe8\xa3\xc8\xfe\xb3\x41\x1e\xb7\x5d\xdc\xcd\x6d\xac\x5c\x5d\xbc\xac\xdc\xff\xfb\x91\x6f\xff\xb3\x79\x38\xde\x64\xba\x81\x37\x0a\xb2\xeb\xef\x49\xe5\xcb\x68\x6d\xe4\x96\x00\x1d\x97\x0c\x63\xce\x5e\x3a\xa0\xf6\xd3\xf8\xf6\xb3\xbf\x3f\x4e\x09\x05\xd8\xa2\x50\x28\xd4\xff\xfe\x24\x22\xf9\xf3\xa7\x1c\x8a\x50\x1a\xf3\xff\x49\x07\x5f\x07\x51\x58\xa3\x8e\xa8\x7f\xf8\x67\x80\xc2\x6e\xfa\xa7\xc7\x4f\x9d\xfa\xe3\xad\x61\x3a\xc5\x35\xb1\xcc\xd0\x7a\x09\xa7\x0e\xda\xf5\x33\xc9\xf6\xbd\xed\xb8\x37\x97\xb2\xad\xdd\x9c\xfe\xa9\x7a\x6b\x26\xd7\x3a\xe2\xcf\x30\xe7\x38\xb8\x4c\xe1\xa2\x84\x32\x4f\xbd\xfc\x3d\x91\xd2\xc3\x30\x07\xdc\xf7\x6d\x3e\x54\xc3\xd6\x35\x7a\x3f\xb3\x07\x0f\xb7\x22\x38\xf6\x56\x80\x7f\x87\x06\x2b\x05\xa1\xf0\x51\xb2\x28\x54\x28\x1c\x2c\xe3\xfe\xc7\x33\xdc\xbe\xc4\xde\x2f\xad\xfb\x5a\x6a\x6b\xae\x6c\xf0\x0a\xb7\xcb\x2f\x33\x8f\x0f\x66\x52\xaf\x9b\x12\x7f\x9d\x0f\xd7\x4f\xd4\x79\x7c\x0b\x0e\x96\xf9\xf3\xfe\xfd\xe9\x9a\xba\xca\xee\x8c\x11\x12\x59\x6c\x36\xfb\xc0\xc7\xa3\x39\x5c\x26\x07\xb2\x7e\xa5\xc6\x5e\x86\xbc\x6d\x93\xf5\x09\xc4\x6f\xe1\x60\x19\xcd\x3f\xca\xa5\xdd\x33\x7f\xa0\xea\x52\x8e\x04\xaf\x19\xba\x72\x4d\x61\xeb\x2b\x82\x1f\xd3\x23\xe5\xe2\x48\x02\x06\xcb\xa6\x29\x01\xa7\x3c\x38\x58\xe6\xcf\x35\x98\x07\x6a\x4d\x54\xf1\xd4\xdc\xea\xcf\x9f\x11\x0c\x58\x6c\xbd\xc7\xbe\xe6\x0d\xde\xa9\xbe\xcc\xfb\xcb\xc9\xe0\xfa\x99\x1c\xbb\x78\x2f\xc5\x7f\xf7\x9a\x43\x4f\xa1\xb0\x42\x94\xb1\xff\xe7\xcd\x0f\x0a\x0e\x96\x43\x2d\xe2\xc9\xc2\x40\xb0\x1c\x6a\xf9\xf7\x4f\xa9\x7f\xb7\x2d\xa1\xa7\x50\x40\x88\x32\xf0\x17\x03\x07\xcb\xa1\x56\x7f\xff\xba\xe2\xbf\xdb\xb6\x7f\x78\x15\x4b\xff\xf3\x2a\x56\xfe\x78\x15\x27\x6d\xf3\x3f\xbc\x8a\x6f\xbf\x7f\xbd\x06\xf8\x77\x43\x24\x58\x3e\x58\x06\x85\x7d\x0f\xfe\x7f\x9e\x3e\x04\x4f\x11\x25\xf1\x9f\xd1\x8c\x75\xfd\xf7\xcf\xff\x6c\xd4\x3f\x3e\xbc\xf8\xcf\x0f\x2f\xff\xf3\xc3\x2b\xff\xfc\xf0\xb7\xff\x7e\xf8\x7f\x0e\xa3\x6a\x4d\x4b\xc1\x34\xd4\x26\x0b\xbb\xb4\x80\xb1\x5a\x71\xe5\x3d\x2c\xf7\xb9\xef\x6e\x2f\x29\x77\xdc\x82\x87\x77\xb5\xc8\xc8\x47\x60\x7d\x40\xfc\x99\xfe\xa8\x5b\xe5\x66\x04\x45\xe6\x43\xef\x88\x26\xb9\x4f\x8d\x1a\x9f\x79\x40\x40\x1f\x45\xf0\x9f\x5d\xde\xc2\xdd\xc5\xf9\x7f\xff\x4b\xe8\x3f\xac\x55\xff\x97\x61\xcb\xf8\xf7\x9f\x3e\x90\x40\xfe\xcd\x0e\x9f\x7e\xe0\x35\xf5\x85\xbd\x1f\x7d\xb1\x45\x12\xda\x34\xe8\x7b\x44\x6d\x08\x07\x07\xcb\xa2\x70\x70\x83\x65\x51\xb8\xa7\xb9\xff\xf3\x2b\x13\x0a\xb7\xdb\x2a\xb2\xeb\xec\x3b\x5e\x97\x25\x56\x26\xf9\x25\x70\xc5\x7a\x3b\x7e\x58\x3f\x2c\x1f\x58\x78\x3a\x4c\xeb\x95\x4c\x00\xcb\xa2\x2c\xfe\xe7\xe8\x0d\xaa\x6c\xef\xb2\xde\xff\x62\x36\xbd\xaa\x91\x7c\x5a\x84\xee\xf8\xc9\x98\x2d\xb9\xba\x27\x4a\xf2\x6b\xeb\xb4\x2a\xcb\xc7\x71\x87\xdf\x47\xef\x07\x55\x3c\x5a\xf5\x54\x5e\xdd\x99\xbd\xd7\xe4\xd3\x7e\xc6\x3b\x3e\x54\x1d\xcf\xbd\xe1\xab\x82\x57\x55\xc5\xcf\x7b\xc1\x7f\xf2\x36\x1f\x45\x67\xe9\x13\x47\x0f\xb5\xe4\x08\xad\x47\x5f\xa3\xec\x9d\xa7\xff\x67\x7d\x35\xaa\xe4\xd1\xe2\x4a\xa3\x7b\xd2\xec\xab\x63\xcf\x92\xa9\x86\x47\xae\x84\x51\x38\xad\x9f\x52\x0f\x12\xae\xd7\xe3\xdc\x20\xf6\x6f\x8d\xfb\xf3\x2c\xe8\xa1\xa7\x23\x6a\xb5\xfa\xac\x80\xa8\x4e\xd6\x32\x02\x90\x9c\x74\xd6\xe3\xe1\xc7\x67\x38\x2e\x8a\xba\x65\x99\xca\x79\xee\x02\xda\xc2\x14\x15\x78\xd7\xd4\xaf\x5d\x66\xff\x93\x77\x55\xd4\xf7\xfb\xfe\xe9\x17\x23\x79\x82\x9d\xdf\x87\x6b\x0f\x1a\xa5\x0e\x1f\x8d\x3a\x0a\x4a\xcb\xa1\x80\xc9\xff\x3f\x8e\xdd\x7f\x94\x7a\xe4\xe0\x98\x04\x77\xcc\xfb\x13\x15\xdb\x34\x2f\xe5\xd1\x85\x57\x6d\xe4\x91\x09\xfd\xda\xba\xb6\xae\xdd\x90\xca\x1b\xfa\xe5\xcf\x33\x82\x42\xa2\xf6\xc8\x4e\x86\xc2\x7e\xb5\xe4\x7a\xf4\x70\xb6\x64\x1b\x4d\xb8\x0a\xde\xc8\xd7\x22\xfa\x51\xe3\x7c\xfd\xf8\xe4\x63\xf6\x3f\xb7\x2e\xca\x0c\x9e\x23\xaf\x7f\x6d\xf2\x2a\xe7\x9a\x28\x49\xe2\x92\xee\x87\x26\xcd\x25\x28\xbf\x73\x34\x8f\x57\x96\xd9\x99\x8f\x48\x0c\xbf\x04\x64\xfb\xa3\x3e\x67\xb5\x4a\xa8\xb8\x30\xb6\x22\xfa\x76\x3a\xd6\x98\x44\x68\x54\x91\x51\xe3\xfb\x84\xb2\x31\x5c\x26\xd5\xc4\xb6\x37\x17\x39\xb8\xa4\x77\xcd\xff\xdd\xdb\x16\x2d\x8b\xb2\x94\x45\x59\x06\xed\x5d\x67\x47\xb1\xe2\x03\x64\x8c\x1f\xbb\xfb\xde\xad\x0f\xf4\x07\x73\x78\xa7\xca\xf3\x6d\x7c\x12\x23\xca\x55\x70\x82\xd8\x14\xf0\xbd\xd9\xca\x7b\x8f\x04\x52\x4a\x82\xf0\x68\x7e\x9f\xa0\xb0\x18\xf7\xcc\xff\xdd\x1b\x12\x7a\x0a\x0b\x08\x51\x46\xa1\x18\xff\x9f\xbd\xf9\xcf\xf6\xe3\x27\xf9\x85\xbd\x3c\xfd\x6a\x4f\x1d\x12\x53\xa7\xf9\xfa\xbe\xbe\x1b\xc1\xcd\x39\xc5\xe4\xc3\xbb\xf7\x7c\xcf\xc2\xd9\x65\xa2\x7d\x41\x26\xff\xae\xee\xb7\x1e\xf4\x5f\x7a\x47\x5c\x2a\x94\x57\x6d\x90\x36\x27\xa2\xb0\x67\x13\x5b\x37\xff\x20\x40\xff\x7d\xe3\xb9\xd7\xda\x16\x0e\x84\xdb\x4f\x88\xba\xbf\x04\x89\xfc\xbb\xba\xdf\xfa\xef\x7f\x38\xa8\x20\x58\x16\xc7\xaf\x0e\xf7\xdf\x7d\x62\xa1\xb8\x00\x04\x4c\x86\xc8\x1f\x07\xa2\x50\x7f\x8e\xe3\x1c\xf3\x10\xa7\xc9\xe6\x70\xdc\xcb\xd5\x79\x92\xdb\x31\x05\xdd\xf7\x3b\x0f\xe3\xaf\x3d\x9f\xe4\x4e\x72\x2a\x75\xfd\x4a\x2e\x9c\xf6\xe7\x28\xce\xb6\xb8\x4b\xaa\xfe\x09\x77\xad\x7b\xbc\x41\x7a\x15\x3c\x2d\x62\xce\x2b\x7f\xfb\x3c\x51\xfc\xec\xd2\xcb\x1a\x54\x47\xdf\xcf\x3f\x4a\x75\x86\x20\x3c\x2d\xfb\x30\xca\xc8\x98\xad\x37\xdf\x5f\x86\x4b\xc6\x6a\xcc\x08\x54\xd5\xee\x12\x58\x7f\xea\x1e\xf0\x01\xca\x9c\xff\x28\xbd\xc0\x5e\xe0\xf0\xc2\x8b\xff\xc0\x88\x2c\x98\x9b\x64\x22\x08\x77\xaf\x52\x7f\xd7\x92\x63\xda\x49\xfc\xd8\x3d\x3a\x4e\x33\xe1\xcd\x1f\xa5\x2a\xb7\x27\x29\x52\xde\x8c\x14\xd2\xdb\x99\x03\xa6\xb5\xd3\x99\xdc\xc6\x95\x4d\x6a\xac\x5d\x03\x89\x4a\x2a\xe3\xaf\xb4\xbe\x55\xfe\x51\xea\xb0\x2f\xbc\x6a\x69\x64\xc8\xb5\x80\xd2\xa5\xbe\x2d\x5b\x37\x22\xfa\xf5\xda\x95\xb9\x29\x99\x29\xf7\x8f\xc1\x2a\xad\xa7\x1b\xe4\xfe\xbc\x37\xfd\xd2\xaf\xf3\x57\xfd\xbc\x2a\x39\x94\x75\x7c\xc6\xec\xf4\x73\xb2\x29\x96\x70\x9d\xa7\x6d\xc8\x02\x09\xd8\xd4\x8a\x18\x98\x8d\xfe\x28\x15\x04\xf3\xd3\x5d\x38\x24\xbb\x87\x9f\x29\xb4\xec\xd8\xce\x6f\x44\x4a\x64\x94\xba\xdf\xdb\x34\xa9\xa4\x0e\x3d\x5f\xea\x11\xb1\xfa\x47\x69\xc4\xdb\xf5\x45\xfb\x25\xbb\x87\x0a\x07\xc4\x76\xca\xb7\x12\x95\xc5\x3f\x9f\x37\x0b\x91\x27\x3d\xd4\x2b\x27\x72\xfd\x52\xea\xfe\xf0\xcf\xf7\x55\x71\x7b\xd5\x35\x25\xab\xe3\xf4\x00\x7d\xc8\xe4\x79\x72\xd6\xd7\x61\x73\x53\x75\x9f\xdc\x63\xe3\xb9\x22\xcd\xdd\xa4\x8b\xff\x3c\x9b\x8b\x4f\xe2\x70\x28\x8d\x0b\x10\x3d\x8c\xe6\x2c\x3f\x85\xff\x69\x3c\xde\x87\xc5\x42\xa7\xe7\xbc\x9c\xec\xf9\x04\xd3\xb7\xf2\x26\x13\x7f\x8e\x37\x91\x9f\x32\x47\xcf\x05\xa9\xfa\x39\x3b\x35\x19\x15\x45\xe3\xcb\x12\x4d\xd7\x41\xd5\x87\xa9\x9c\x83\x54\xe9\xc3\xb2\xee\x6f\xff\x28\x4d\x1e\xf9\x22\x9e\x58\x6b\x20\x6d\xfb\x81\x22\xb2\xb4\xff\xdc\x83\xe0\x9b\x7c\x4d\xc9\x1a\x01\x82\xa4\xd6\x1c\x72\xee\xe7\x5f\x96\xfe\x79\xdb\x55\x8c\xe2\xce\x19\xf9\x40\xda\x28\x3e\xe6\x07\x57\x6c\x3a\xdd\xe4\x1e\xe7\xda\xa5\xdb\xa1\xde\x5f\x7a\xb5\xa8\x6b\xa4\xea\x1a\xfc\x47\xa9\xa9\xd6\x60\x26\xcf\x59\xb3\x6e\x77\x3f\xf7\x77\x67\xcf\x56\x54\x05\x49\x4b\x73\x50\xdf\xed\xe3\xa7\x3b\xf0\x3c\xeb\x3d\x23\xe3\x17\x34\x41\xf6\xef\x86\x60\x88\xfc\xf1\xf1\xf1\x71\x50\x32\x63\x2c\x0a\x6f\x84\xfb\x3a\x17\x0a\x08\x9e\xc6\x86\x17\xb1\x18\x39\x97\x4c\x78\x44\x82\xb3\x6d\x72\xd5\x5d\x52\x88\x66\xbd\xda\xbf\x5d\x7e\x13\x96\xf4\xad\xaf\x79\xc2\xc4\x75\x51\x70\xf8\x05\x04\xa3\x50\x34\x28\xea\xe7\xa4\xd2\xca\x28\xac\x9d\xe9\xdf\x3b\xbc\x2c\x0a\x90\x96\x46\x49\xc7\x02\xe8\xd0\x0a\x8e\xf7\xa5\x45\xfb\x5d\xed\x55\x2d\xc5\xb6\x6f\xb9\xe7\x8e\x8b\xaa\x7e\xa1\x06\x4c\xfc\x03\x19\x03\x39\xa4\x04\xf6\xd2\x54\x61\x00\x09\xc2\x42\x87\x88\xcf\x8b\x8e\x34\x68\xc5\x52\x3e\xfe\xd0\x2a\x50\x64\x7e\x74\x38\xa3\x26\xf5\xed\xf2\xaf\xd8\x46\x14\xb3\x13\x4f\x68\xfe\x0f\x41\x18\x0b\x09\xc2\x46\x87\xbe\x59\xe7\x86\x0a\x0c\x0b\x7e\x65\x79\xe4\xbf\xe0\x54\xdd\xf1\xbd\x8c\x23\x39\xa2\xc1\xf9\x53\x01\xb0\x14\xd0\xf3\x3c\x6e\x44\x04\xc6\x46\x82\x70\xd0\x21\xe9\xab\x62\x99\xb4\xcd\xef\x52\x4f\x7d\xb6\x54\x1a\x7a\x4d\xf6\xea\x56\x7e\x74\xb2\xdb\x05\xf8\x86\x21\xec\x3d\x9e\x70\xc5\x9d\x1f\xc6\x41\x82\x70\xd1\xa1\xb7\x24\x1f\x82\x8e\xdb\xd9\x68\x0b\x2b\xab\x43\xf5\x3e\xb0\xad\x91\xad\x31\x68\x55\xb4\x84\x49\x7c\xb3\x1f\x60\x0f\x98\x95\xf5\x80\x71\x91\xa0\x53\xe8\x50\x1b\xf5\xba\x1e\x60\x80\xbb\x25\x79\x2a\xa9\x52\xa8\x98\x05\x48\x28\x86\x25\xf6\x56\x66\x0a\xfb\x4d\x02\x48\xbe\x33\x54\x29\xc2\xa7\x90\x20\x3c\x74\x28\xe2\xa9\xdd\x7c\x87\xed\x3e\xf7\x56\x36\xf6\xf2\x9c\x4f\xdf\x0e\xa4\xd1\x57\xe1\x09\xe1\x77\x5e\x66\xd6\x48\x69\xfc\x25\xa8\x0d\xe3\x21\x41\xf8\xe8\x90\x11\x8a\x09\xf5\xe1\xf2\xc3\x01\xbb\xd8\xd7\x17\x1e\x7d\xb4\xa8\xe7\x9e\x84\xf4\xe7\x27\xcf\x11\x10\xe8\x10\x1d\xe7\x2b\xfb\xba\xc1\xf8\x48\xd0\x69\x74\x48\x90\xdd\x55\x28\x52\xf7\xe7\x23\xf5\x67\x4b\x31\x77\x92\x0d\x0f\x84\x5f\xaa\x74\x6b\x2a\x5d\x1d\xfc\x8c\xf5\xe8\x9a\xe4\xd3\x3a\x27\xf8\x34\x12\x44\x80\x0e\xa9\xd0\x1c\x92\x50\xb2\x7f\x9a\x94\x2b\x51\x11\x6a\x10\x89\xfe\xfe\x44\x56\x51\x2c\x79\xa2\xd7\x93\x97\xa3\x45\x76\x33\xca\x4f\x00\x26\x40\x82\x08\xd1\x21\x2b\xee\x47\x09\x67\x0c\xce\x3f\x72\xe8\x58\x7d\xf1\xca\xd8\x88\xfa\x90\x31\xe2\x26\x8d\x60\x67\xb0\x36\xad\xd5\x9d\x08\x4a\x4d\x2c\x98\x10\x09\x3a\x83\x0e\x5d\xbf\x9f\xd8\x95\x95\x53\x7f\x1a\xdb\xc4\xee\x0e\xfb\xe4\x01\x85\x17\x8e\x6c\x68\xf7\xe9\x53\x49\xfa\x2f\x9c\x69\xec\xe7\x32\xa9\xe0\x33\x48\xd0\x59\x74\x88\xbf\xfc\x07\x01\x36\x7b\x8f\x15\x6e\xd7\x47\x63\x07\xee\x23\xa8\xf1\x32\x6e\xce\x03\x9f\x67\x8a\xa2\x15\x84\xd4\xa7\x8c\x5e\x9a\xc2\x67\x91\x20\x22\x74\x88\xaa\x13\x94\x26\x49\x51\x3f\x78\xff\xe4\x7b\x83\x71\xef\x08\xa3\x21\x76\xeb\xd4\x81\xe8\xf4\x64\xa5\x6e\xf1\x2a\x5f\x4f\x38\x2d\x4c\x84\x04\x11\xa3\x43\x7d\xb8\xeb\x9e\xea\x2d\x9f\xfb\x5b\x0f\x15\x95\xf4\x9e\x24\x7b\x3a\x3d\x72\xa6\xf5\x36\xd9\xd1\x20\xe8\xa6\x98\x7f\x43\xa2\x6a\x07\x13\x23\x41\x24\x18\xfb\x9a\xb9\x76\xe1\xaa\x60\xb5\x62\x2d\xdc\xa0\xc4\x65\x17\xb5\x17\x77\x50\x58\x73\x9f\xf7\x56\x65\xd3\x39\xc2\xf5\xf6\x9b\x6e\x5c\x30\x09\x12\x44\x8a\x0e\x71\x13\xa4\x04\x3e\x70\xfc\xce\x3e\x1e\xb6\xc2\x14\xa0\xf7\xca\x9b\x34\xc0\xe3\xc9\x95\x8a\xd8\xfa\xb2\x47\xce\xe7\x97\x5d\x96\x40\x98\x14\x09\x22\x43\x87\x22\x1b\x52\xb8\x1c\x12\xc4\x2f\x7c\xe9\x95\x76\x56\xde\x16\x2c\xcb\x55\xfb\xe9\x5e\xbd\x18\xb2\xf9\x61\x9f\xcf\xfa\xfc\x44\xb4\x28\x4c\x86\x04\x91\xa3\x43\x37\xca\xb5\x9c\x9f\x8e\xbb\x35\x6c\x05\x60\x27\x7e\x1a\xa9\xb3\xb6\xf8\xe4\x86\xe7\xfe\x79\xac\xfa\xf8\x28\x08\x5c\x69\x36\xe7\x84\xc9\x91\x20\x0a\x74\xa8\x52\x4d\xec\xa7\x29\x36\x71\xfd\x93\x67\x77\x62\x1f\x9d\xaa\xd3\x6e\xd0\xb2\xcf\x20\xd3\x20\x3c\xe0\xfc\xa5\xac\xa1\xeb\x7c\x56\x05\xa6\x40\x82\x28\xd1\x21\x03\x70\xba\x76\x1a\xb5\xcf\xc9\xbf\x1e\x92\xf4\x4d\xa8\xb3\x66\x59\x29\xaa\xa3\x4f\xbd\xb2\xfb\xe9\xe0\x7a\xd0\x72\x5b\xa5\x0a\x4c\x89\x04\x51\xa1\x43\xfe\x7e\xb8\xc2\x74\xa4\x39\xb7\xef\x2e\x4b\x16\x9b\x1a\x97\x46\x6d\x5a\xed\x2b\x5e\xbc\x43\xff\xaa\xaa\x09\xa7\x43\x6a\x9a\x95\x0e\xa6\x42\x82\xa8\xd1\xa1\x99\x97\x31\x51\xfe\x92\x14\x1a\x61\xed\x44\x6f\xef\x54\x4d\x19\xbf\x01\x46\x06\xea\x33\x62\xdf\x36\x27\x69\x39\x4a\xc3\xf3\x24\x30\x35\x12\x04\x82\xe8\xd2\x02\xc1\x57\xd1\xd2\xc8\x38\x97\x56\x16\xaa\x24\x15\xfc\xa1\xca\x71\x2c\x30\xce\xd2\xb7\x80\x23\x90\xee\xea\x01\xc1\x43\x2c\x4e\x18\x04\x11\x29\x08\x9d\xd2\x9d\x32\x91\x20\x2f\x8b\xef\x5f\x4c\x52\x64\x74\x8b\xe4\x03\x20\xf7\x5f\xf6\x07\x8c\x11\x23\x96\x0f\x64\x22\x97\x1e\xba\xd0\xc0\x20\x84\x48\xd1\xa0\x53\xab\x69\x41\xd3\x50\x4f\x80\x5b\xc2\xbd\xe1\xe3\x6b\x36\xe0\xcf\xb7\xd4\x2c\xbd\x4f\x33\xf8\x33\x33\x09\x8c\x52\x1e\x49\x76\x68\xc1\x20\x0d\x22\x45\x8b\x4e\x85\xce\xdf\xd2\xd7\xca\x28\xd2\xb4\xf6\x5c\x7c\xfc\x76\xec\x96\x42\xc3\x79\xeb\xb5\x39\xb6\x3a\xbc\x00\xc7\xfb\x0f\x39\xd9\x28\x38\x61\x90\x16\x91\xa2\x43\xa7\x96\x1e\xbe\xb6\x34\x8f\xfe\xd6\x31\xa6\xfc\x2a\xe0\xe6\x96\xd8\x37\x76\x35\x2f\xa1\xaa\x34\x6a\x26\x36\xb3\x1f\xba\x8e\x7a\x29\xb6\x30\x48\x87\x48\xd1\x63\x1c\x51\xae\x70\xe5\x5c\x8d\x1b\x75\xa1\x8b\x4d\x33\xa9\x12\xa3\x6e\xbe\x69\x0b\x64\x07\x7a\xbd\x51\xa7\xa0\x37\xa2\xa6\x2a\xb9\xc3\x0e\x83\xf4\x88\x14\x03\x3a\x15\xd2\xfa\xcc\x79\x07\xcf\x8b\xdb\xa4\xed\xe8\x15\x9e\x34\xe5\xf5\xdb\x8c\x6c\xba\x76\xcd\x45\x87\x47\x4e\x15\xfe\xf6\x36\xc6\x96\x30\xc8\x80\x48\x9d\x43\xa7\xba\x9a\xae\x3e\xd9\x38\xc8\xa0\x84\x97\xd2\xae\x7a\xe1\x76\x1a\x8c\xe4\x45\x9e\x1a\xda\x93\x10\xd4\xc0\x6f\x2b\xb4\x2e\x4c\x61\x86\xc1\x73\x08\x54\x1c\xf9\xbf\x6b\xdc\xff\xb7\xc1\x02\x19\xd1\x9f\xdb\x8b\x88\xfa\x05\x4b\xf6\x44\x3b\xa5\xd8\x71\xdc\xf4\xe8\x65\x4e\x7a\xc6\x1d\x82\x57\xcf\x87\x84\x68\xed\xc1\x6f\x96\x6c\xdd\xee\x30\xc8\x88\xb8\x19\x4c\xe8\x94\x5f\x8e\x54\xe4\x72\x75\x55\x11\xd5\x3d\xf1\x87\x1a\x64\xc9\x81\x7c\xab\x75\x75\xfa\x6f\x2f\x29\x3a\x07\x3f\x4a\xda\xd6\xad\x17\x81\x41\x26\x44\x8a\x19\x9d\xca\x6f\xbd\xb5\xd9\xc1\xc3\x49\xab\x7f\xd5\x51\xb2\xa5\x9d\xbe\xcc\x86\x21\xa3\xd5\xc0\xb5\x60\xea\xbc\x82\xbf\xc8\x95\x70\x16\x0f\x18\x64\x46\xa4\x58\x30\x8e\xb4\x92\xec\xc9\x2e\xf8\xcc\xc2\x13\xd4\x52\xa7\xe0\x6e\xcf\xe8\xd6\x91\xd0\xdd\xcd\xbc\x15\x6f\x16\x00\x9c\xf9\xc0\x17\xac\x06\x83\x2c\x88\x14\x2b\x3a\xf5\x45\xfb\x3b\x43\xd9\x05\xea\xce\xc7\x0f\xf2\xe8\xd7\x08\x2d\xbe\xb2\x74\xee\xba\x5f\x5b\x19\x75\xd8\x6b\xb1\x04\xe6\x83\x3f\x9a\xc1\x20\x2b\x22\xc5\x86\x4e\xa9\xda\xa8\xb6\x94\xd2\x92\xa7\x74\xdd\x5d\x25\xcc\xb3\xef\x35\x4e\xb8\x1d\xa4\xe6\xb7\x90\x34\xb8\x86\x7f\xee\x43\xf4\x4f\x76\x65\x18\x64\x43\xa4\xd8\xd1\x29\x5e\x62\x7f\x4f\x97\x01\xe9\xb1\x17\x3b\x9e\x8a\xd2\x9f\x95\x7e\xed\x13\xf3\x33\x50\x7f\xc4\xbe\xe0\x57\x6c\x84\xef\xe8\x37\x68\x06\x83\xec\x88\x14\x07\x3a\x25\x99\x5c\x27\xfe\xe3\x3b\xe5\xb2\xa6\xdb\x19\xdb\x77\x96\x2c\x06\x71\xba\xe5\x04\x0e\xa5\x40\x4d\x77\xff\xa6\xf6\x65\xd1\x2b\xea\x30\xc8\x81\x48\x71\xa2\x53\x2e\xd3\xd3\x21\xe1\x87\xc1\xd5\x97\x79\xac\x3c\x73\xbf\x1e\xc7\x7f\xab\xfe\x49\x4a\x3f\xfe\x22\xe3\xd1\x33\xf9\xb5\xdb\xba\x3b\xb6\x30\xc8\x89\x48\x71\x61\x74\x81\x54\xfd\x53\x71\x3d\x44\x99\xd4\x7e\x12\x01\x23\x5e\xa6\x0a\xcd\x49\xb3\xf0\xe4\xb3\xb0\x99\xc7\x1b\x84\x9f\xec\xc9\x0d\xc8\x60\x90\x0b\x91\xe2\x46\xa7\x7e\x49\xf9\x57\xcf\x97\xcd\x14\xbf\x38\xf7\xed\xbb\x4c\x43\x8a\xe8\xc4\xcb\x29\x6b\x09\xae\x5b\xb3\x71\x1f\x71\xc4\x3f\xa8\x14\x99\xc2\x20\x37\x22\xc5\x83\x4e\x0d\x3f\x1e\xec\x1a\xee\xf2\x53\x92\xd0\x49\xfb\x3e\x59\x0b\xe6\xf3\x09\xe2\xe6\xb7\x48\x0a\x96\xd5\x79\xe3\x58\x34\x4c\x7e\x17\x83\x41\x1e\x44\x8a\x17\xa3\xab\x10\x50\xc5\xaf\x5f\x7b\x59\x48\x1e\x67\x97\xb3\xf1\x73\xe2\x59\x2e\x57\x36\x47\x49\xde\x65\xb7\xd4\x61\xe9\xdd\x4a\xc1\x3d\x7c\x18\xe4\x45\xa4\xf8\xd0\x29\x2e\x5e\xe2\x3d\x96\x29\x89\xed\xad\x89\xf4\xd3\x94\xca\xa7\xbf\x70\x50\x27\x02\x44\x5e\x14\x79\xd6\x94\xc6\x5f\x7c\x1e\xbd\xd0\x81\x41\x3e\x44\x8a\x1f\x9d\x7a\xfe\xa2\x91\xfd\x43\xe5\x51\x42\x7f\xfc\x83\xee\x30\x9c\x35\xd4\x9a\x82\x4e\x56\x25\xfe\x8b\x62\x66\xdc\xbc\x64\xbc\xf4\x05\x1e\x18\xe4\x47\xa4\x04\xd0\xa9\x98\x6f\x1b\x83\x78\xe6\x0a\x74\x77\x02\x45\x2b\xa2\x25\x6d\x9b\x8c\x07\xd8\x9e\xf1\x06\x55\xe0\xe3\x7c\x6e\x7b\x95\x36\x55\x7b\x03\x06\x05\x10\xa9\xf3\x18\xad\x5c\xd7\x95\xa6\x85\xc4\x52\x23\xc8\x65\x9f\x35\x88\x54\xd2\xc8\x92\xb2\x40\x38\x6e\x60\xce\xcb\x92\x57\xd6\x57\xed\xeb\x0a\x1e\x0c\x9e\x47\xa4\x04\xd1\x29\x11\x22\xa2\x67\xb6\xe4\x26\xe7\xbc\xb8\x5c\x6c\x2b\x5e\xaa\x0b\x9f\x2a\xbb\x85\xcf\xf6\xe3\x86\x29\xe7\x92\xcc\x44\x51\x5d\x2d\x2e\x0c\x0a\x22\x52\x42\xe8\x14\xf4\xfc\xe7\x48\xa8\xc3\x6c\xf7\x37\x9f\xaa\xc4\x0f\x39\xa5\xa5\xfa\xa9\x9d\x14\x67\x6b\x18\xc4\x7a\xf1\x18\x9e\xfd\xe4\xfd\xc5\x03\x83\x42\x88\xd4\x05\x74\x6a\xbb\xdc\x95\x64\x3c\xe3\x43\xaa\x94\xb3\x8d\x5a\xa2\x8a\x87\x95\x5e\xe2\x94\x49\xe4\x3b\x0b\xf7\xb7\xef\x0f\xa2\x1d\xcf\xcd\xb8\xc0\xe0\x05\x44\x4a\x18\x9d\x72\xbe\xcb\x22\x54\xae\xe5\x2c\x45\x1a\x66\xbb\x2b\x96\x7f\xdb\xa8\x78\x4f\xdb\x4d\xc5\xf4\xf1\x29\x23\x9b\x28\x95\xb1\x89\x04\x69\x18\x14\x46\xa4\x44\xd0\xa9\xbb\x21\x7d\x3e\x7b\xad\x42\xef\xb0\xf2\x6b\x6e\x24\xda\xc6\xd5\x48\x6d\xad\x19\xb8\x66\x7e\x72\x7d\xea\x1a\x55\xda\x28\x78\xc4\x09\x83\x22\x88\xd4\x45\x74\x2a\x8c\xf6\xb5\xde\xe3\x20\x0a\xa7\x6b\x1f\x0f\x24\x9e\x28\xb9\xb2\xf2\x0a\xd6\xbc\xe3\xc3\x0f\x69\x15\xfa\x2c\xf0\x9a\x8a\xd0\x82\x06\x06\x2f\x22\x52\xa2\xe8\xd4\x69\x75\x11\x6a\xc2\x1f\x5a\x1d\x47\xec\xb9\xc2\xd8\xf4\x8b\x83\xc5\x57\x2a\x09\x9b\x49\x6d\x6a\xb5\xb3\x72\x76\x9c\x86\xdc\x39\x60\x50\x14\x91\xba\x84\x31\xda\x4b\xe9\xab\xec\x19\x02\x33\x6e\xdb\x9a\x75\x91\xc3\x6f\x81\x8f\x0f\xf0\x4d\x05\x2f\xf6\xe7\x64\xca\x67\xdb\x36\x34\x33\x3a\xc3\xe0\x25\x44\x4a\x0c\x9d\xb2\xad\xdc\x9b\xe7\xa5\xeb\xae\x18\xf8\xb6\xce\x26\x8f\x63\x2c\x1b\xbd\x60\x27\x67\xe3\x78\x81\xb4\xf9\x96\x0d\xf9\x78\xf3\x65\x1d\x18\x14\x43\xa4\xc4\xd1\x29\x19\x47\xdb\xa6\x1e\x13\xc5\xbe\x67\x65\xfd\xbb\x05\xbb\x6e\xef\x18\xd3\xb7\x99\x6d\x17\x53\xdb\x8e\x6f\xd4\x27\xb5\x34\xbd\xe4\x81\x41\x71\x44\xea\x32\x3a\xd5\xb1\xc0\x2e\x4c\x94\x48\x4b\x67\x6c\xbc\x79\x8a\x63\x8f\xee\xa5\x7d\xe1\x7a\x2f\xb9\xe9\xed\x0b\x0a\x6a\x4c\xad\x2e\xd4\x3c\x97\x61\xf0\x32\x22\x25\x81\x31\x44\x25\x44\x60\xf7\x70\x36\x6d\xd4\x63\x9e\x96\xae\xfa\x7d\x82\xc0\x53\x2f\x07\xc8\xd6\x44\x35\x82\xdd\xd9\x75\x54\x43\xb9\x2e\xc1\xa0\x04\x22\x25\x89\x4e\xc9\xd9\xd4\xa5\xea\xd7\xb8\xe6\xdc\x0f\x34\xa9\xfb\x95\x55\xe0\x35\x99\xbe\x11\xde\x4e\xab\x74\x51\x21\x30\x97\x57\xf1\xbb\x9f\x23\x0c\x4a\x22\x52\x52\x18\x13\x61\x0f\xf1\x40\x80\x57\x52\xcd\x87\x65\x8e\x4e\xe3\xa3\x09\xd6\x69\x09\xa5\x92\x0f\xdd\x7d\x4e\x71\x3b\x24\x8e\x16\xd5\x3e\x32\x30\x28\x85\x48\x5d\x41\xa7\x98\x47\x95\x48\x23\xcc\x67\x1d\x2f\x16\xf2\xde\x20\x8e\x03\xdd\x6b\x23\xe8\x8c\x9a\x71\x63\x33\xd4\xb4\x49\x94\xef\x57\xe3\x3b\xc0\xe0\x95\x13\x1a\xb2\x93\x96\x47\xff\x68\xc8\xa4\x31\x06\xe2\xf7\x0e\x8a\x62\xa1\x98\x12\x2e\xe5\x29\x63\xbd\x59\x0f\xe9\xf9\x35\xa9\x30\x33\xb3\xfc\x3c\x50\x2e\xb2\xe9\x81\xef\x67\x0a\x18\x94\x46\xdc\x0c\x19\x74\x4a\x89\xd3\x3f\x9a\x43\xbb\xa5\xd1\x60\xf0\x46\x6b\xa2\xaa\x4c\xf5\xfd\x79\x9a\x2d\x9d\x80\x26\xf3\xa6\xf9\xf6\x9f\xa2\xfb\x1d\x6a\x30\x28\x83\x48\xc9\xa2\x53\x36\xdd\x58\xb5\x12\xdd\xc9\x3b\x0d\x42\x87\x6e\xe5\x0a\x9e\x9f\x98\xdb\xb5\x2a\x7c\x8b\xc4\x2f\x7d\xad\x19\x11\x8a\x52\xb3\xb8\x08\x83\xb2\x88\x94\x1c\x3a\x95\x49\x95\x76\x46\x16\x67\xcc\x61\x82\xcf\x4d\xf2\xf3\x9b\x30\x87\xcb\x7e\x3d\xc1\xb9\xdd\x67\x1d\x4a\xb2\xec\x5e\x3e\x7c\xaf\x88\x0f\x83\x72\x88\x94\x3c\xc6\xf2\x60\x63\x96\xc1\xb5\xcc\x94\x7c\xf1\xb4\x6f\x8b\x6d\x78\xe5\xdf\x82\xfc\x0a\xdd\x8f\xbf\x4e\x99\x7e\xc9\xdf\x7a\xbd\xe7\xcf\xa5\x0e\x83\xf2\x88\x94\x02\x3a\x45\xba\x10\xa7\xf1\x6e\xea\x71\xb4\x2d\x79\x7d\x5b\x14\xde\xda\xbd\x49\x3e\xa5\x0f\x5c\xb4\xde\x37\x6f\x4c\xdb\xbd\x13\x79\xe1\xcb\x00\x83\x0a\x88\x94\x22\x3a\x15\x38\x5b\x7b\x67\xa1\xa5\xfb\x02\x81\x3f\x0b\x57\xed\xbd\xa9\x1f\xf2\xcd\xf3\x57\x0b\x43\xce\xa7\xeb\xf9\xe4\x4b\xb0\x3b\x1a\x70\xc1\xa0\x22\x22\xa5\x84\x4e\x15\xbb\x16\xa5\xf7\x39\xb4\x3d\x37\x77\x3a\x25\x95\x27\x6f\xc4\x6a\xd6\xb8\x54\xdd\x92\x1d\x4b\x6a\xf6\x8d\x67\x3d\x63\x6c\x92\x19\x06\x95\x10\x29\x65\x74\x2a\x38\x9c\xdc\xf2\xdd\xdb\x6f\x4b\x94\xc4\xc4\x5f\xbf\x12\xd6\x55\xee\x78\x90\x83\xfa\x29\xce\xe2\x1d\x81\x09\x13\xb6\x4b\xdb\x96\x30\xa8\x8c\x48\xa9\x60\x9c\x38\xd7\xea\xc8\xa1\x39\x5c\x22\x97\xa6\xeb\x3b\x81\xba\x2c\x16\xdd\x17\x0c\x75\x49\x1c\x94\x2e\xc8\x8b\xe5\xf5\x6c\x3f\xb4\xa6\x86\x41\x15\x44\x4a\x15\x9d\x4a\x2f\x30\xcd\x50\x13\x8f\x83\xed\x9f\x30\x13\xc6\xf3\xd6\x47\x7a\x48\x53\xa6\x1d\xd0\xde\xcc\x49\x21\x7e\xeb\x6b\x68\xc8\xac\x0c\x83\xaa\x88\x94\x1a\xc6\x72\xc1\x41\x5b\xe5\xbe\x25\x85\x46\x1d\x7d\x6c\x76\x53\xc4\xa7\x58\xd6\x7c\xe2\xa3\x4f\x92\xe6\x17\x6b\x9e\x19\x44\x86\x5d\x0d\x61\x85\x41\x35\x44\x4a\x1d\x9d\xc2\x22\x9d\x68\x0c\xd8\x92\xa4\x74\x8c\x77\xd6\xdd\xd8\x62\x68\xbe\xc4\xdb\x5b\x52\xa5\x63\x71\xb1\xa6\x61\xe3\x5d\xc6\x1a\xaf\x21\x0c\xaa\x23\x52\x1a\xe8\x94\x87\x5a\xce\x0d\x3f\x26\x4e\xf9\x1a\x42\x2f\xda\x87\xb1\x76\x9f\xa7\xac\x24\x5d\x9c\x83\x14\xb5\xd4\xdd\xab\x75\xba\xc7\x61\x61\x18\xd4\x40\xa4\x34\x31\x8e\x4a\xd9\xde\x9c\x44\x7c\x52\x1f\x3c\x46\x8e\xc5\x59\x2a\x1b\x92\x7b\x63\xaa\xa2\x88\x70\x20\x43\x66\xac\x61\xe3\xd1\x2a\x39\x5c\x18\xd4\x44\xa4\xb4\x30\x3a\xce\x45\x59\x3e\x05\x30\x18\x27\x9a\xd2\x56\x78\xac\x2c\x60\xed\xe0\x79\x44\xcd\x0d\x3f\x2e\x21\x22\x45\x54\x8e\x0d\x87\x11\x2e\x0c\x6a\x21\x52\xda\xe8\x94\xe5\xcd\x23\x61\xec\xdd\x86\x9f\xac\xf6\xfe\x21\x1c\xc4\xd1\xb8\x57\x8a\xfc\x7f\x45\x98\xa2\x1e\xaf\x4b\xa9\x05\x6f\xdc\xd3\x63\x83\x41\x6d\x44\x4a\x07\x9d\xa2\xd0\x0d\x35\x31\x17\xc0\x21\xe3\x4e\xf4\xd0\x71\x3d\xbf\x39\x42\xaa\x67\x5e\xe9\x58\x41\x61\xd8\x93\xb4\x25\x34\x19\x5f\xcb\x04\x83\x3a\x88\xd4\x55\x74\x6a\x3f\x5c\xd0\x67\x64\x8a\xe2\xab\xb9\x6d\xae\xe3\x66\xcd\x60\x2a\x78\xf8\x8e\xee\xd4\x48\x38\x0d\xfb\x5a\x66\xc1\x6d\x97\xb3\x20\x0c\x5e\x45\xa4\x74\xd1\x29\x29\xe8\x03\xc0\x30\xd7\xcd\xd2\xe3\xfd\x98\xed\x9a\x80\xb9\x50\x88\x6f\xac\x12\x09\x65\x86\xaf\xb0\xd8\xb9\xb7\x33\x0a\x82\x4c\x30\xa8\x8b\x48\xe9\xa1\x53\xd7\x2a\x2b\x72\x1a\xf5\x24\x04\xdb\x86\x69\x2f\xae\xdc\xeb\x55\xae\x56\x91\x4d\x82\x8d\x56\x23\x2d\x7a\x8e\xa4\xd9\xc3\x63\xb0\x61\x50\x0f\x91\xd2\x47\xa7\x8e\x70\xdc\x39\xe6\x97\x06\xdc\x95\xee\x67\x12\x60\x81\x0c\xc9\x4a\x46\xb4\xbb\x49\x0c\x2a\x32\x2d\x43\xdc\x89\xd3\x76\xf4\xfc\x30\xa8\x8f\x48\x5d\x43\xa7\xc8\xf6\xb5\x1e\xab\x9e\x92\xc5\x12\x48\xcb\xb6\x16\xda\x0b\x8f\xe1\xe7\x32\x7c\x74\x8b\x46\xf6\xac\x5b\x9c\xdc\x80\x0e\xcb\xb8\x0b\x0c\x5e\x43\xa4\x0c\xd0\xa9\x51\x6c\x22\x8e\xfb\x19\x02\x1f\xc4\x62\x55\xdd\xc7\x70\xb7\xf6\x78\x2f\xdc\x71\x15\xf0\x3c\xa7\x1a\x59\x2e\xce\x6a\x43\xbe\x48\x0b\x83\x06\x88\xd4\x75\x74\x8a\xb6\x87\x30\x78\x3b\xb0\xec\x21\x90\x6e\x51\xae\x6b\x76\x1b\x4b\x1c\x76\xee\x0e\x31\x0e\xf0\xef\xa5\xe9\xcd\x84\x6e\x07\x49\xc3\xe0\x75\x44\xca\x10\x63\x1f\xac\x2d\xca\x2f\x13\x52\x36\x32\x70\x79\x5d\x09\xea\x02\xce\xa1\x24\x69\x56\x84\x7c\x0d\x10\xfe\xcc\x24\x37\x9b\x20\x0e\x00\x83\x86\x88\x94\x11\x3a\x55\x51\x57\x1d\xf6\x66\xe2\x88\x22\xb8\x26\xe6\x2d\xab\x7e\xf0\xd5\x88\x7e\xa5\xd9\xc7\xd6\xb1\x0e\xcc\xf5\x82\xb9\xb7\xd4\x4a\xf8\x60\xd0\x08\x91\x32\xc6\x98\x21\x63\x65\x89\xdc\x91\xbb\x37\x4f\x95\x24\x16\x6d\xc2\xae\xc6\xab\xe8\x79\x07\x7f\x4f\x33\xb5\xcf\xc5\xe8\xe3\x4d\x33\x4b\x1a\x09\x18\x34\x46\xa4\x6e\x60\x5c\x95\x60\x18\xeb\x67\xe9\xbd\xae\x50\x48\xf2\x83\xfc\x45\xe7\x65\xd9\x5d\x82\x11\x39\x66\x9f\xbb\x83\x23\xe7\x7c\xcd\xde\x0f\xe4\x8b\xc2\xe0\x0d\x44\xca\x04\xe3\x42\x59\x23\xe3\xd7\xd9\x05\x6c\xfd\xf2\x8f\xb2\xde\xdd\x39\xe2\x6b\x02\x59\x4b\x1c\x99\x59\x85\x29\x5a\xe9\xea\xfa\xaf\x87\x12\x6d\x60\xd0\x04\x91\xba\x89\x4e\x4d\x26\x61\xfb\x16\x0a\x13\x29\x9a\xbd\x8b\x8f\x7c\x86\x53\xd3\xaa\xd4\xc3\x6a\xec\x50\xcc\xe8\x2b\x86\xba\xe4\xaf\xd3\x10\xae\x09\x83\x37\x11\x29\x53\x8c\x95\x97\x89\xcc\xe8\x8d\xaf\xc5\xce\x67\x6c\x6f\x0c\xa5\x1d\xb7\xf5\x50\xce\x9a\x7e\xa3\x98\xd5\xd3\xd2\x5f\xd9\x92\xb6\xbe\x3b\xce\x03\x83\xa6\x27\x34\x64\x27\x5d\x84\xfe\xa3\x21\x33\x43\x7f\x6e\x77\x2c\x75\xba\xf5\xce\x5f\xf1\x3a\xf7\xd3\x37\x03\xe0\xb6\x0a\x7a\xa5\x5a\x72\xa9\x9f\xb3\xb5\x6e\xde\x07\x79\xaa\x04\x47\x1c\x30\x68\x86\xb8\x19\xe6\xe8\x94\xa1\x7f\x78\xbf\x5b\xc4\xd0\x19\xa6\x94\xc7\x46\xf9\x76\x7e\x76\x1a\x72\xe2\x09\x1b\xc9\x87\x73\xcb\x35\x1e\x62\xc9\xea\x6a\xe6\x30\x68\x8e\x48\xdd\x42\xa7\x12\xc5\x3f\x9d\x29\xd0\x18\x00\x17\x6e\xab\xf8\x57\x2a\x7c\x5d\xd7\x18\xc0\x7a\x15\x77\x65\xb3\xff\x9b\x4d\xb6\xf8\x88\xce\x14\x00\x83\xb7\x10\x29\x0b\x74\x4a\xad\xd4\x2c\xbc\xd5\xb9\xbc\x27\xf8\xcd\xd3\xd2\xa4\xec\x94\xb4\x1f\xd2\xad\x37\x07\x6a\x2b\xf0\xe9\x34\x4b\x7d\x5f\x9c\x17\xc3\x87\x41\x0b\x44\xca\x12\x9d\xa2\xdb\xbf\x80\x63\x58\xfc\xd4\xee\x78\xbc\x4c\x28\x41\xfb\x5a\x1c\xd5\xd5\xb9\xc4\x31\x2e\xbc\x30\xd6\x33\x55\x7a\x7c\xaa\xd7\x98\x61\xd0\x12\x91\xb2\x42\xa7\x12\x94\xc8\xaf\x5f\x13\x72\x27\x66\xa4\x6b\x7e\x71\x63\xe3\xd6\xd3\x0f\xa5\xc7\xb5\xb1\x5c\xec\xb3\x9f\xa7\xc2\xcf\x18\xe2\xdc\xb4\x84\x41\x2b\x44\xca\x1a\x9d\xea\xbf\x7c\xfa\x33\x01\xc5\x01\x4f\xe8\xc8\x3d\x4a\xba\x26\x7f\x30\xe4\x63\x4f\x7b\x76\x74\xf3\xea\x35\x47\xe2\xb5\x79\xb3\x5f\x86\x30\x68\x8d\x48\xd9\xa0\x53\x3e\x65\x56\xc1\x4f\x06\xdd\x2e\x5d\xc1\x1f\x1b\xa7\x6c\x52\x30\xd3\x60\xa8\x95\x11\xd3\x9a\xa6\x6f\xae\x6c\xfe\xba\x32\xd3\x2d\x0d\x83\x36\x88\x94\x2d\x3a\x35\x56\x17\xd4\x4f\x3c\xb2\x13\xdf\x6b\x63\xd1\x98\x89\x95\x12\x62\xe2\x45\xe2\x45\xbf\x34\xa2\x11\x70\x51\x59\xa9\x75\xbb\xd4\x0c\x06\x6d\x11\x29\x3b\x74\xaa\x6c\x8b\x41\xc3\x65\xdc\x05\xc7\x66\x33\xba\xda\xfa\x62\xea\x23\xdd\x43\xcd\x79\xe2\x82\x26\xca\x9c\x14\x41\x9d\x27\xcd\x2d\x1e\x30\x68\x87\x48\xd9\x63\xac\x07\x17\xaf\x3d\xb4\xbc\x37\x94\xd8\x9e\x72\xbc\x8a\xeb\xea\x6a\x79\x8a\x29\xcf\xaf\xe3\x95\x15\xa1\xb6\xfa\x3b\x4b\x86\x3d\x4b\x3a\x18\xb4\x47\xa4\x1c\x30\xae\x27\xff\xdc\xf5\x7e\x90\xaf\x25\xc9\x1f\x7c\xf3\x7e\xe0\xe6\xdb\x14\xc2\xa7\x2e\x0a\x31\xfc\xf1\x96\x41\x09\x7a\x94\x99\x4c\x62\xba\x30\xe8\x80\x48\x39\xa2\x53\xe7\xaa\x76\x3c\x03\x24\xbe\x25\xe6\xcf\x8e\xaa\xa6\xdd\x8a\x52\x27\x49\x51\x6c\xf0\x12\x41\xa1\x5e\x9c\xa9\x7c\x52\x83\x73\x49\x04\x06\x1d\x11\x29\x27\x74\x8a\x92\xd3\xb2\xd5\x7f\x75\x0e\x0b\x6b\x3d\x64\x81\x72\xdd\x96\xfa\xec\xbd\xf1\x72\x1b\xed\x78\xfa\xa8\x60\x59\xa7\x87\x8b\x86\x5a\x30\xe8\x84\x48\x39\xa3\x53\xaf\x14\x58\xe6\xd2\xc7\xc5\xed\xf0\x44\x14\x99\x48\x9c\x28\x92\x8e\x38\x73\x5f\x7f\xa8\x9f\x75\xb6\x92\xed\x76\x6b\x60\xe2\xe3\x85\x41\x67\x44\xca\x05\x9d\x92\x98\xbd\x39\x44\xa5\xd9\xe9\x51\x90\xd9\xbf\x4d\xc1\x36\x39\xeb\xa0\xdf\x65\x25\x34\x5b\x98\x22\xa6\xb3\x58\x23\x80\xe7\x23\x0c\x83\x2e\x88\x94\x2b\x3a\x55\xa5\xa5\xd9\xc5\x13\x1c\xd2\x0d\xbc\x3d\x97\xca\x15\xf6\xfd\x65\x59\xc5\x5d\x87\xfd\xb3\x33\xed\x3d\x3f\xfb\xc3\x53\xcb\x02\xf1\x60\xd0\x15\x91\x72\xc3\x18\xed\xda\xcc\xcc\x2e\x59\xbf\x76\xd3\x5a\xbc\x0e\x7b\x96\x9e\x7d\x39\xc3\x92\x23\xc4\x1c\x6f\xea\x71\x95\x21\xb3\x6c\x8d\xe3\xfd\x25\x18\x74\x43\xa4\xdc\xd1\xa9\xf7\x82\x3a\xf7\xc4\x32\xbd\x4d\xc7\x3b\xc6\x4a\x8d\x72\x15\xb4\xad\xa7\xcd\xe7\x1b\xed\xcf\xa7\x19\x1d\x74\xb0\x07\xf7\x4c\xde\x82\x41\x77\x44\xca\x03\x9d\xca\x4d\x94\xf3\x48\xa0\x7e\x59\xce\x38\xf1\x28\x5a\xd1\x03\xe7\x56\xfa\xa9\xa4\x97\x2f\x74\x40\xe3\x2b\xf2\x17\x3c\xdc\x6b\xa4\xc8\x60\xd0\x03\x91\xba\x8d\xb1\xb4\x7c\x6d\xb4\xba\xc8\x6b\x23\x65\xff\x88\xe7\xc3\xc4\x54\x9c\x57\xa9\x73\xee\x43\x35\xdc\x82\x7c\x8e\xfa\x28\x19\x76\xf3\x9f\x1a\x30\x78\x1b\x91\xf2\x44\xa7\xf4\xbe\x85\xb6\x06\x3e\x2c\xde\x57\xe6\x71\x2e\xd2\xee\x4f\x3f\x0a\x78\x36\xc0\x0e\x77\x51\x7c\x08\xeb\xdd\xfb\x2a\xff\x0c\x65\x0f\x83\x9e\x88\xd4\x1d\x74\x8a\xe7\xd2\x75\x3c\xbb\xfe\xaa\x85\x36\x2d\xfd\x16\xc7\xed\xdc\x97\x66\xce\x0d\x87\x45\x49\xc7\x94\x17\xe6\x12\x82\x3f\x2f\x1d\x8b\xc0\xe0\x1d\x44\xca\x0b\x9d\x52\x90\x5a\x36\x7f\x5d\x48\xdb\xc2\xd2\x93\x9f\xd0\xe1\x76\xa7\x65\xc5\x3d\xff\x87\xd9\x0d\xc7\x1b\x25\x6a\x06\x84\x7a\x87\xb8\xea\x30\xe8\x85\x48\x79\xa3\x53\xdd\x29\xe7\xe0\xbb\xda\x53\xe4\xa7\xc5\x60\xd1\x37\x17\xcc\xef\x40\x94\x5f\x17\xc3\xc7\x87\x5f\x56\xca\x2d\x10\x9b\xb7\xb7\x63\xc3\xa0\x37\x22\xe5\x83\x4e\x3d\x4a\x64\xc6\x8a\x38\xdf\x26\xed\xbf\x4b\xb0\x79\x6c\x4c\x30\x36\xea\x80\xd5\x78\x99\xb1\xd5\xd2\x17\x27\x99\xe9\xf2\xb2\x31\x00\x83\x3e\x88\xd4\x5d\x74\xea\x8c\x62\x9e\x2c\xf5\xd4\xcd\x8a\xc6\x4f\xeb\x8c\x87\x9e\x25\xde\x4c\x76\x15\x94\x1d\x41\x94\x1b\x72\x02\xbc\x87\xcd\xeb\x82\xb2\x30\x78\x17\x91\xf2\x45\xa7\xca\x45\x07\x09\x4a\x0f\x67\x32\x49\x93\x47\xaf\x3f\xbe\x65\x01\xcc\x0e\x84\xdf\xf5\xec\x9e\x12\xa6\x0f\xd5\xc8\x66\xed\x1e\x95\x80\x41\x5f\x44\xca\x0f\x63\xb9\xe4\x92\xf0\xa7\x45\xbf\xb8\x8c\x80\xe4\xe8\x39\x62\xbd\xc5\x84\x8b\xeb\x7b\xf5\x77\xf2\x45\x49\x44\xcd\x9d\xae\x3f\x4f\x0a\xb2\x84\x41\x3f\x44\xca\x1f\x63\x77\x4e\xb4\x25\xfa\xce\xd7\x1d\x58\x73\x39\xfa\xb8\xa3\x20\xd5\x4e\xb8\xe4\x60\x86\xa2\x51\x59\xaa\xb1\xb3\xdb\xab\x4d\x0d\x70\x84\x41\x7f\x44\x2a\x00\x9d\x8a\x52\x19\xe1\x03\xdd\xf9\x77\x0b\x05\x74\xaf\xf3\x98\xa5\x6f\x85\xf4\x5c\x48\x3b\x56\xd8\xd8\x76\xfa\xf2\x02\x45\xd2\xaa\xc7\x01\x83\x01\x88\x54\x20\x3a\xe5\x70\x29\xea\x1a\x3f\x49\x0e\xe5\x0d\xda\xda\xd5\x96\xcb\x4f\x7c\x6d\x42\x19\x3b\x5e\x8f\x85\x27\xcf\x74\x4b\xec\xa4\xc5\x9f\x97\x84\xc1\xc0\x13\x1a\xb2\x93\x6e\xf5\xfb\xa3\x21\x0b\x42\x7f\xee\x9c\xa5\x5b\x63\xfc\xef\x22\x1b\xd2\x78\xbe\xec\x72\xe1\x3f\x0f\x7f\x6e\x57\x77\xaa\xe7\x8a\x01\x8e\xa1\x81\x78\xc0\xd8\x0d\x7e\x11\x18\x0c\x42\xdc\x0c\x18\x63\x16\xf5\xeb\x1e\x8d\xe2\x62\xf4\x72\x8d\x4b\x46\x2a\x27\x5f\xe2\xe8\x79\xd3\xa8\x2f\xaf\x70\x0f\x2f\x4e\xdf\x4f\xef\xb7\x50\x24\x53\x86\x41\x18\x91\x0a\x46\xa7\x92\xf2\x20\xe7\x88\x50\xa1\xa2\xba\xda\x6b\xab\x7a\xf7\xf3\x28\xc5\xfb\x89\x49\xf2\x22\x04\x3d\x80\x7c\x2f\xb2\x75\xa2\x0e\x37\x18\x0c\x46\xa4\x42\x30\xae\x71\xe8\x4b\xba\xa7\xd6\x30\x3a\x7f\x6c\x76\x2e\x66\x7a\x15\x11\x97\xa1\x9f\x35\xcb\x00\xdb\xdd\x54\xe5\xc2\x7e\x6c\xad\xd6\x27\x02\x83\x21\x88\x54\x28\x3a\xe5\x06\x4e\xdc\xa8\x92\xd1\xbf\xcb\xf1\x50\xbb\x93\x12\x0c\xe0\x7e\xfe\x20\x2f\xa0\xa5\x61\xb6\xe3\x5d\xf0\x96\xae\x50\x9a\x8a\x23\x0c\x86\x22\x52\x61\xe8\x54\xe9\x0f\xd7\x9f\x65\x2b\xcc\xd9\xa7\xa5\x4a\xdb\xaa\x64\x55\x8d\xb8\xd2\x34\x99\xca\x33\xf9\x59\xf6\x58\x62\x1f\xab\xba\xad\x0a\xc2\x60\x18\x22\x75\x0f\x9d\xda\xf8\xc5\x48\xfa\x6d\xd4\x45\x5b\x61\x43\x51\xda\xda\x4d\x4d\xed\xfe\xf7\x2d\x42\xa5\xf2\xfb\x11\xea\x79\x4d\xa7\x04\x36\x1e\x52\xc1\xe0\x3d\x44\x2a\x1c\x63\x59\x7b\xb0\x54\x9c\x34\xec\x0e\x0e\xf8\x73\xf9\xee\xbe\x6b\x99\x7f\xd6\x4d\xbb\xcd\x9f\x5c\xa3\x73\x4b\x9d\x05\x2c\xe4\xf7\xe9\x64\x61\x30\x1c\x91\x8a\x40\xa7\x9e\x96\x0d\xd0\x11\xa9\x52\x33\x7b\xe1\xe4\xf5\x6c\xe4\xf3\x39\x53\x53\x30\x47\x90\xea\x51\xb1\x2c\x5f\xba\xa7\x5e\x1e\xb0\x74\x0e\x06\x23\x10\xa9\x48\x74\x4a\x60\xde\xfa\x0b\xd3\xb8\xe4\x85\x75\xbd\xb8\xd0\x26\xe7\x0e\xf8\x3c\x24\x87\x25\xd0\xc8\x9a\x5f\x40\x06\x9f\xde\x16\xb9\x65\x01\x83\x91\x88\x54\x14\x3a\x05\xce\xf0\xf8\xe5\x59\xd5\x46\x6c\x79\xa8\x4e\x2d\xbd\x0d\x3d\x67\x58\xb4\x16\x7b\xbe\x40\xfc\xd5\xa3\x22\x4b\x56\x85\xfe\x41\x51\x18\x8c\x42\xa4\xa2\xd1\x29\x0b\xba\x1d\x3a\x4b\x8f\x37\xba\xa7\xfb\x4f\x2d\x1b\xe3\x04\xfa\x1d\xda\x4c\x9e\x97\x8b\xf5\x0e\x3b\x32\x30\xbd\xd3\x9f\x75\x4f\x02\x06\xa3\x11\xa9\x18\x74\xca\x64\x4d\xd0\xd4\x75\x7b\x4c\xcf\xa0\x94\x21\x0a\x97\xeb\xfe\x5b\xc1\xd8\x67\xd7\x29\x2e\xae\x5e\x97\xbc\x16\x2e\x72\xe5\x0e\x13\x1b\x0c\xc6\x20\x52\xb1\xe8\x54\xbc\xda\xfd\x97\x74\x5c\xa4\x51\x25\xef\x69\x34\xf6\x5e\x70\xf3\x35\xfc\x72\xae\x77\x6e\x19\xca\x14\x73\xc7\x1d\x1b\x56\xb8\x24\x07\x83\xb1\x88\xd4\x7d\x74\x8a\x80\x2d\xa4\x39\xf2\xf3\x71\x8d\xf6\x59\xfb\x50\xc1\xe9\xde\xb2\x44\x03\xdc\xf6\xa9\x80\x5b\xce\x4e\xed\x82\x13\x15\x17\x9f\x70\xc1\xe0\x7d\x44\x2a\x0e\x63\xce\xa0\xe6\xab\x4a\xf0\xd4\xeb\x74\x23\x57\xae\x3c\x71\x49\x44\xde\xad\x8b\xc0\x18\x4e\x2e\xc9\xf7\xec\x4b\x0b\xe4\xe7\xc5\x9e\x99\xc3\x60\x1c\x22\xf5\x00\xe3\x1a\x47\x4e\xd3\x3d\x96\x9f\x45\x7e\x2f\x83\x35\x0b\xeb\x3e\xa5\xa4\x15\xd1\x6f\x39\xf2\x00\x2f\xfd\x5d\x37\x06\x4f\x55\x3e\xd9\x14\x85\xc1\x07\x88\xd4\x43\x74\x6a\xf6\xd4\xaf\x07\x44\x87\xc3\x45\xb1\xbf\xf4\x13\xeb\x4c\xba\x7a\x92\xe6\xdc\x24\xb2\x98\xb2\x54\x3f\xf0\x61\x19\x8b\x32\x2e\xf1\xc3\xe0\x43\x44\x2a\x1e\x63\x51\xa4\x84\x2e\x48\xf5\x5d\xc7\xb3\xd3\x0d\xac\x75\xb7\x77\x93\xea\xb9\x44\x9a\x48\x48\xed\x25\x17\xee\x89\x54\xf6\x45\xb5\xa4\xf1\xc0\x60\x3c\x22\x95\x80\x4e\xb5\x17\xb3\x63\x2b\x66\xbd\x2a\xe9\xea\x4a\xc7\x5b\xf7\xb2\x9e\xcf\xab\x22\xea\xf8\xbe\xe5\x2f\xfd\xe3\x06\xa7\x57\xd3\xe1\xd8\x4d\x18\x4c\x40\xa4\x12\x31\x3e\xc1\xd5\x99\xb5\x4e\xdd\x59\xf1\x9a\xb0\x04\x56\x7c\x0a\x23\x2d\xc5\x60\x53\x4d\xb9\x2f\x82\x2e\x9a\xbc\x9f\xe6\xc4\xce\x11\x91\xc3\x60\x22\x22\xf5\x08\x9d\x2a\x3c\x27\xf0\x2d\xbe\xcd\x35\x27\xe6\x63\x93\x2b\x71\x44\xc6\x25\x23\x19\x83\xc8\x26\xea\x82\xd5\x0f\xbd\x17\x6a\x46\xc1\x41\x14\x0c\x3e\x42\xa4\x1e\xa3\x53\xf3\xb5\xbd\x1f\x61\x36\xf6\xee\xe7\x0a\xcd\x2c\x13\x13\x86\x62\x6b\x02\x79\x14\xc6\xfb\xc3\xde\xc7\x45\x5d\xf6\xd6\xa7\x03\x98\x61\xf0\x31\x22\x95\x84\x4e\x89\x35\xf1\xe3\xbf\xfa\x60\x5f\x74\x45\x52\x22\x44\x30\xcd\xbe\xf5\xca\xc7\x25\x85\xe8\xfd\xd1\xf6\x92\x9c\xe0\x03\xb3\xfc\xeb\x24\x30\x98\x84\x48\x25\xa3\x53\x33\x35\x59\x6f\x8f\x7c\x02\x13\x7b\x1f\xb9\xbe\x3d\x58\x6c\x69\x19\xca\x3c\xd8\xd5\x72\x23\x46\x49\x9a\x78\xab\xda\x33\x13\x81\x30\x98\x8c\x48\xa5\xa0\x53\x1f\x2e\x5e\x65\x2d\x17\x1e\xbc\xc2\xa3\xb8\x9b\xe8\x62\x7f\x73\x41\x9a\x4c\xef\x8b\xa1\xa8\xea\x54\x64\xab\x30\xef\xd3\x1e\x4f\x05\x18\x4c\x41\xa4\x9e\x60\xdc\x43\x72\xed\xee\xf1\xce\x8f\xb6\x51\x45\xbc\xc4\xb4\x9b\x9a\x96\x1e\x86\x37\xdd\x06\xea\x32\xb9\x6c\x72\xf0\x09\xa2\xf6\x3c\x5c\x74\x60\xf0\x09\x22\x95\x8a\x4e\x7d\x3f\x23\xf3\xae\x3c\x73\x4c\xe2\x5a\xf8\x17\xee\x5f\xc5\xa9\xf4\xaf\x5c\x6b\xa4\xc2\xa6\x06\xa3\xaf\x03\x87\x05\xea\x2d\x1f\x75\x61\x30\x15\x91\x4a\x43\xa7\xe8\xc5\xa2\x7e\xcc\x8a\x79\x28\xb4\x14\x3f\x29\x28\x92\x22\xf0\xb7\x7f\x62\xe4\xf2\xac\x75\x21\x38\xe4\x33\x3d\x76\xec\x95\xe8\x8b\x30\x98\x86\x48\xa5\xa3\x53\xe7\x9d\x49\xab\xe7\x77\xd6\x7e\xd4\x4d\xc9\x27\x19\xe2\xc1\x3c\xce\x24\x46\xef\x6f\x0a\x99\xc8\x9c\x4e\x2b\x49\xe8\x33\x75\xbc\x09\x83\xe9\x88\x54\x06\xc6\x82\xb7\x5f\xf5\xd7\x71\xfd\xf9\xd9\xa1\xb3\xa2\x47\xdf\x3d\x6e\x98\x1d\xf3\x4e\x67\x5c\x8c\x79\xec\x66\xe2\x5a\xa9\x5c\xe6\xd4\x85\x05\x83\x19\x88\x54\x26\xc6\xbc\x3d\xed\x95\xd7\xa9\x12\x3d\x1c\x49\xf2\xb7\x4b\xb5\xa8\xfa\xbe\x7d\x46\x31\x06\x97\xb2\x14\x4b\x6c\xac\xe8\x9a\xea\x5f\xd4\x46\x30\x98\x79\x42\x43\x76\xd2\x17\x2a\xfe\x68\xc8\xb2\x30\x76\x0f\xee\x37\xe7\xc6\xb8\xaf\x24\x53\xb8\x76\x34\x37\x85\xee\x56\xcb\x62\xf5\xc4\x5e\xca\x6d\x72\x39\xe4\x61\x4a\xdd\x7b\x42\xc9\x00\x83\x59\x88\x9b\x91\x8d\x4e\x5d\x51\x90\x95\xbf\xdd\xa4\x39\x38\x4e\xf9\x74\xec\x35\x74\xf3\x52\xc2\x6c\xbf\x20\x5f\xf2\x2f\x5f\xd5\xa9\xe7\x9c\xa1\x59\xe2\x78\x30\x98\x8d\x48\xe5\xa0\x53\x21\x8c\xfa\xd8\xd2\x6e\xe9\xb2\x3b\x5a\xb5\x77\x1e\xfb\x19\x1c\x75\x85\x55\x1f\xe3\xda\xd6\xa6\xc3\x91\x9c\x3f\xcf\xea\xcb\x41\x30\x98\x83\x48\xe5\xa2\x53\x25\x2e\x55\x3a\xa0\x61\x5e\x6b\x5d\x62\x40\xd7\x91\x87\x13\x95\xfd\xa6\x42\x7e\x2d\xe9\x5d\xf1\x4a\x4f\xfe\x1f\x5a\x3a\x6c\xe7\x61\x30\x17\x91\x7a\x8a\x31\xf5\x69\x2a\xc6\x0e\x89\xbe\xc0\x49\x81\x0a\xa4\xa6\xe9\xf6\x5d\xa8\xc6\xda\xd1\xe3\xea\x16\x64\x62\x3a\x95\x08\x87\x3a\x12\xdb\xc2\xe0\x53\x44\x2a\x0f\x9d\x82\xc9\x2a\x48\x2e\x7c\x10\xe2\x8f\x50\xb1\x3a\xa6\xb5\x0f\xf4\xf1\xd1\xfb\x5a\x75\x5f\x80\xbf\xfa\x60\x97\x9c\x51\xa9\x2f\x8a\x03\x06\xf3\x10\xa9\x67\xe8\xd4\x50\x85\xd3\xbe\xbd\x3c\xaf\x67\xa1\xe9\x4e\xfa\x19\xda\x5a\xae\x85\x49\xf7\xb9\x21\x62\xda\x8d\x6c\x79\xeb\x9d\x6e\x5d\x56\x49\x18\x7c\x86\x48\x3d\xc7\x38\xec\x4a\x07\x3c\x6c\xf6\x2a\x27\xd8\xb4\x5c\xe2\xd5\x60\xb9\x3f\xa8\x58\x37\xbb\xb7\xa1\x42\x4d\x85\x7f\xfb\xed\x93\x17\x57\x41\x73\x18\x7c\x8e\x48\xe5\x63\x4c\x5e\xc7\x86\xa7\x37\x06\x37\xb0\x77\x24\x5e\xd7\x3f\x74\x63\xfd\x4a\xf2\x59\x41\x80\xb6\xbf\xea\x2b\xe9\xe9\xf4\xda\x0e\x9d\x50\x7c\x18\xcc\x47\xa4\x0a\x30\x0e\x70\x52\x86\x55\xc4\x22\xd2\xcc\x06\x26\x32\x65\xd3\x17\xb5\x72\x3d\x3e\x65\xa6\xbc\x4c\xf3\xcb\x4b\x14\x8e\x09\x63\x5c\xfe\x71\x1d\x06\x0b\x10\xa9\x42\x8c\xd3\x39\xe7\x72\x96\x4e\x45\x08\x98\x47\x7f\x97\x25\xe8\x21\x47\xcf\xb4\x15\xe5\xbe\x7e\x21\x79\xa9\xc6\x3a\x2f\x96\xda\xf0\x3a\x23\x0c\x16\x22\x52\x45\x18\x6b\x51\xa4\x6b\x37\xf9\x6a\x09\x18\xce\xc3\xef\x9a\x47\xb3\xdd\x54\x8a\x2e\x43\xb6\x67\x2a\x0a\xf2\xaf\x12\x8c\x7e\xe9\x99\xbc\x81\x07\x83\x45\x88\x54\x31\x3a\xa5\x79\xfc\x20\x94\x59\x2e\x7f\x8b\x50\xa5\xe8\x96\x53\xfe\x5e\xaa\xd7\x2a\x34\x9a\x70\x53\x4d\x58\x85\xff\x3a\x48\x3e\xf3\xca\x16\x06\x8b\x11\xa9\x12\x8c\x0b\xa9\x0a\xf2\x2e\x0c\xf7\xf9\x8e\x68\x3d\xdf\x9b\x7c\x38\x1d\xfb\x54\x3d\x8b\x64\x02\xec\x3d\xb0\x4e\x9b\x66\xea\x92\x78\x34\x42\x0c\x83\x25\x88\x54\x29\xc6\x45\x67\xd1\xfa\xf6\x65\x1f\x36\xe9\x1c\x9f\x0a\xbb\x11\x2b\x2f\x61\xc5\x7b\xab\x9f\xbe\xd1\x84\xbc\x08\x5c\x98\x3e\xab\x77\xec\xa5\x0a\x83\xa5\x88\xd4\x0b\x74\x2a\x0b\xe5\xcd\xee\x19\x4d\x62\x19\x5e\xcb\xd3\x7f\xbb\x73\x6f\xb6\xc3\xc5\xa4\x71\x43\x45\xeb\xbb\x4e\xd6\x4b\x86\xef\x3d\x1a\xd2\x30\xf8\x02\x91\x2a\x43\xa7\xea\x72\xc3\x99\xda\x84\xef\x07\xf5\x41\x8b\x52\x3f\x34\x70\xf6\x04\xeb\x0b\x04\x74\x27\xdf\xac\xcc\x2b\x74\x28\xbe\xa6\xbd\x69\x0d\x83\x65\x88\xd4\x4b\x74\xaa\x08\x4f\x40\xe0\x86\x08\x8e\x3d\xdb\xfd\xe8\x56\x86\x4f\x5c\x51\x44\x9c\x5e\xa2\x84\xfe\x78\xbe\x86\x04\x2f\x04\xae\x99\xea\xb3\xc0\xe0\x4b\x44\xaa\x1c\x63\xfa\xc1\xd0\x3b\x9f\x90\x97\xf8\xa0\x48\xfb\x97\xaf\xe4\x2d\x9e\xcb\x81\x29\x67\x86\x84\xd5\x2d\x16\x9c\x05\xfb\x22\xde\x37\xbe\x38\x03\x83\xe5\x88\x54\x05\xc6\xb8\xa2\x33\xe9\xda\xbe\xa7\xc1\xd0\x71\x16\xf7\x13\x90\x19\x3e\x77\x3b\x39\x67\xcf\xf7\x83\xc4\x55\xd3\x83\x44\xca\xa8\x6f\x74\x17\x61\xb0\x02\x91\xaa\xc4\x58\xa5\xbe\xa9\x9a\xae\x22\x67\x5a\xb0\x38\x77\x8b\xf2\xf3\x4e\xe5\xd9\x22\x5b\xcd\xe9\x62\xfd\x6e\xac\xa6\xc8\xaa\x6b\xb8\x3c\xbc\xf8\x30\x58\x89\x48\x55\x61\xec\x38\xd1\x84\x56\xc6\x01\x86\x55\x03\x46\xd1\x43\x69\x5c\x95\x4c\x9a\xd3\x02\xa7\xfd\x9b\xe4\x49\x08\x29\xc0\x4b\x61\xdf\x97\xd8\x61\xb0\x0a\x91\xaa\xc6\xb8\xe8\x4c\xea\x18\x02\xed\x09\x33\x93\x11\x6c\xab\xe7\xd7\x27\x73\x70\x26\xb9\x71\x0f\xc5\x48\xaf\xfd\x38\x37\xca\xf1\x81\x85\x92\x15\x06\xab\x11\xa9\x1a\x8c\xf5\x95\x63\x81\xaf\xc6\xdc\x9b\xbd\x0f\x96\xef\x27\x4c\xb4\x73\x2a\xac\x1b\xda\x94\xeb\x7f\x50\xc0\xe1\x0d\x28\xce\x13\x1b\x15\x54\x81\xc1\x1a\x44\xaa\x16\xe3\xb6\x81\x12\x5e\x03\x2b\x85\x83\x04\x25\x99\x51\x23\xcd\x6a\x9f\xf9\x3e\x12\x66\x48\x26\xee\x6e\x1e\xb7\x0e\x6e\x8c\xb6\x25\x9d\x34\x0c\xd6\x22\x52\x75\xe8\xd4\x2f\xe9\xc3\xce\x4c\xc5\x62\xb7\xda\x61\xca\x30\xfd\x0a\xe7\xf2\x8e\xef\x6f\xdc\xe1\xc6\x03\x6f\x4d\x1f\xbd\x97\x1a\x23\xbd\xe4\x30\x58\x87\x48\xbd\x42\xa7\x88\x03\x02\xde\xfc\xba\xf6\x5a\xb0\x52\x70\x13\xf5\x82\x6c\x08\x7a\x16\xfb\x2e\x3c\xaa\xd0\xf8\xaa\xd6\xc8\x4c\x23\x63\x72\x32\x0d\x0c\xbe\x42\xa4\xea\xd1\x29\x4f\x6d\xdc\x8d\x7e\xee\x5a\xbf\xb6\xb2\xbd\x3b\x84\x1a\x45\xd9\x7c\x49\xad\x4c\x1d\x65\xa9\x3e\x7b\xe4\x0f\xfa\xdf\xa6\x92\xf1\xc3\x60\x3d\x22\xf5\x1a\x9d\xc2\x59\xd2\x24\xb8\xce\x5d\x3a\x36\xe7\xf2\x3a\xcf\xcf\x54\x2f\xcc\xb1\x67\xfc\x9c\x70\xe2\x02\xbf\xe4\x22\x33\x35\x1d\xd9\xb9\x8b\x30\xf8\x1a\x91\x7a\x83\x71\xa5\xc8\x1e\xfb\xf4\xd3\x3b\x6b\x6c\x43\xb6\x4b\x82\xda\x85\x5c\xb1\x9a\xaa\x82\x6f\xcf\x5b\xd8\xe1\x1d\x0d\x6c\x45\x6c\xbf\xb9\x87\x05\x83\x6f\x10\xa9\x06\x8c\x5b\x2c\x54\xe2\x5e\xd5\x44\x67\x84\xc9\xed\x72\x80\xfe\x74\x94\x7b\xaa\xc9\xba\x34\x93\x8b\x1c\xbc\xf9\x75\xa6\x14\xab\x22\x84\x36\x30\xd8\x80\x48\x35\xa2\x53\xd4\xb1\x35\x3d\xd3\x29\x11\xa4\x9c\x75\x1a\x83\x21\x8b\xcd\x21\x13\x3c\x45\x0d\xac\x66\xc3\x71\xfb\xb4\xa6\xe7\xfb\x8e\xef\x58\xc3\x60\xe3\x09\x0d\xd9\x49\x5f\x5b\xfd\xa3\x21\x6b\xc2\xb8\x2f\xea\xa8\xab\xe5\x35\x5f\x83\x96\xcb\x83\x68\xd4\xab\x45\xf7\x25\xd2\xa2\xbc\x89\xaf\x9d\x49\x4e\x89\xa1\x7d\x6b\x1c\xd7\x0a\x00\x18\x6c\x42\xdc\x8c\xb7\xe8\x94\xba\xf7\x7a\x8f\x9b\x52\xbe\x02\x21\xa3\x7a\x81\xe6\x92\xec\x2b\x09\x31\x0e\x81\xdd\x51\xdb\xc1\xbb\x75\x8e\x73\xe5\x96\xe4\x57\x61\xf0\x2d\x22\xd5\x8c\x4e\x35\xf9\xc5\xa3\xf0\x1e\xbf\xd4\x6c\x78\xae\xa6\xa5\xfc\xd5\x27\x3c\xed\xce\x38\x17\xed\xdc\xa4\xeb\xfe\x17\xc0\xb8\xfa\xa6\xb1\x22\x0c\x36\x23\x52\xef\x30\xba\xdd\x6a\x45\x6f\xc3\xd5\x7b\x16\xc3\xed\xfb\x17\xeb\x7d\xed\x3a\xcf\x4f\x05\xb0\xf6\x57\x5c\x6e\xfa\x19\xae\x92\xfa\x63\xe1\xae\x10\x0c\xbe\x43\xa4\x5a\x30\x26\x19\x74\x35\x22\x03\xb7\x78\x6e\x7e\x91\xb7\xba\xc1\xc9\xbb\x6c\xd1\x1b\x79\xae\xfe\xbc\x99\x8f\xac\x7a\x26\x8a\x57\x03\x15\x65\x0b\x83\x2d\x88\x54\x2b\x46\xc7\x69\x01\xca\x4d\x97\x7d\x57\x58\xf9\xf8\x76\xc6\x81\xb6\xb9\xbc\x6a\x9c\xca\xb7\x48\xcf\x63\x44\x63\x20\xa9\x9a\x18\xcb\x4e\x13\x06\x5b\x11\xa9\x36\x8c\x31\x5d\xc5\x41\xf1\xfa\x52\x8e\xd5\x96\xa6\x84\xf5\x99\x5b\x73\x2a\x82\xec\xbb\x8c\xa4\xc7\xa7\x6c\x0d\x15\x6f\x5a\x3d\x14\x4d\x94\x82\xc1\x36\x44\xaa\x1d\x9d\xe2\xbe\x7f\x38\x5c\x21\x25\xbe\xfe\xc5\x60\x3d\x69\x78\x17\x7b\x44\xc9\xb9\x6d\x9b\x5b\x5c\xa8\xbd\x5b\x9b\xf0\x90\x97\x6c\xda\x05\x06\xdb\x11\xa9\x0e\x74\xca\x48\x46\xac\x7a\xda\xec\xca\xd3\x52\xb2\x06\x32\x6f\x05\x81\x26\xb1\x47\x6f\x89\xf0\x7e\x41\xda\x3c\x56\x4e\xef\xf8\x3a\x5d\x2c\x61\xb0\x03\x91\xea\xc4\xe8\x38\x9f\xe5\xb2\xcd\x2c\x60\xff\x54\xad\xf7\x5d\x77\x78\xd6\x6d\x68\x5e\xb6\x9e\x3e\x13\x66\x39\xcb\x6f\x29\xe4\xdd\xec\x30\xcf\x01\x83\x9d\x88\x54\x17\xc6\x1a\xe7\xba\x69\xc0\x7a\x61\x8c\xe3\x1c\xbb\x6b\x80\x2a\x6b\xf9\xcb\x2e\x82\x57\x2c\x31\xdd\x1b\x23\x64\xa7\x46\x5f\xcd\x94\xe5\x30\xc2\x60\x17\x22\xd5\x8d\x4e\x3d\x04\x1a\xe7\x06\xbf\xda\xdc\xf4\x2e\x73\x40\x89\x14\x28\xea\xa2\x1e\xec\x6a\xd5\xbe\x35\x26\x29\xe7\xd6\x0a\x24\x93\xa2\x07\x61\xb0\x1b\x91\x7a\x8f\xd1\x71\x92\x25\xb0\xf4\x09\x65\xaa\x05\x8d\x26\x24\x19\xe1\x77\x3a\x11\xe7\xdd\xb1\xa7\x2b\x29\x28\xe9\x4c\x74\x6c\x7e\x7e\xab\x47\x1e\x06\xdf\x23\x52\x3d\x18\x17\x26\xa6\x56\xe9\x24\xef\xd6\xcb\x67\x15\xac\xc8\x5f\x0e\x24\x72\xfc\xa8\x9c\x3f\xb4\x20\xcf\x40\x9c\x41\xb1\x2a\xf5\xc5\x07\x25\x03\x83\x3d\x88\x54\x2f\x46\x6f\x77\x79\x62\xa0\x2e\xef\x13\x10\x55\x58\x0d\xd0\x99\x3e\x9c\x0f\xe4\x75\x3c\xd0\x30\x20\x12\x7e\xb8\x4d\xd0\xc5\x69\xca\x42\x04\x83\xbd\x88\x54\x1f\x3a\xe5\x04\xbf\xa9\x7f\x19\xe2\x9a\xbc\x72\x40\x88\x7f\x25\xc6\xb9\x2b\xe0\x11\x70\x49\x46\x61\x28\xc6\x74\xb9\xaa\x84\x55\xaa\xea\x0a\x0c\xf6\x21\x52\x1f\x30\xce\x76\xe5\xcf\x54\x83\xb6\x5a\x70\x33\xa6\x6d\x26\x9f\xb3\x96\xb0\x7c\x5c\xcc\x27\x4c\x6d\x7e\x6d\xae\xab\x4f\x2f\xc9\x1a\x49\x8d\x05\x83\x1f\x10\xa9\x7e\x74\xea\xb1\x85\xad\x7c\x57\xd1\x95\xc7\x34\xcf\x72\xda\xf1\xc6\xb2\x38\x9d\xae\x65\x86\xbb\xf8\x8e\x91\x47\xeb\x82\x37\x0c\x1b\x98\x8c\x60\xb0\x1f\x91\x1a\x40\xa7\x74\xe0\xa0\xc8\xa6\xd0\xac\xda\x56\x9a\xd5\xcb\x37\x08\xbf\xcf\x48\x47\xce\x92\x45\x4d\x7b\x51\x06\xcc\xde\x9a\xf0\xc3\x6b\x95\x81\xc1\x01\x44\xea\x23\xc6\x4c\x26\xd9\x88\xf4\x5e\xca\x0f\x2b\x66\xcd\xcc\x6b\xd3\xd9\x92\xaf\xd2\x6f\xe6\xc8\x9d\xbe\xf9\x42\xc6\xc3\xc0\xa8\x4d\x32\xd2\x96\x03\x06\x3f\x22\x52\x83\xe8\x54\xfd\xe3\xa4\xb5\x97\xa9\xf4\x1f\x93\x5e\x34\xc7\x0a\x9c\x79\xc4\x6f\x94\xa8\xe8\xd8\xd2\xd8\xc3\xc2\xb3\xbf\xb0\xf1\xa3\x32\x94\x0e\x06\x07\x11\xa9\x4f\xe8\xd4\x9d\x8e\x6d\x7a\xa5\x4d\x45\xab\xee\x21\x8b\xd7\x8f\xe7\xb6\x6d\x8b\xf9\x29\x2a\x8a\x17\x7b\xef\x5c\x49\xe0\xd2\x6d\x0f\xd0\x38\x03\x83\x9f\x10\xa9\x21\x74\xaa\xc6\xfe\x17\x1d\xa1\xb8\xc7\xfb\x6f\xcf\xb6\xab\xbb\x9f\x05\xdb\xe8\x27\x50\x0c\x1d\x1c\x26\xef\xd6\x99\x67\x48\x34\xa9\x26\xa8\xc3\xe0\x10\x22\x35\x8c\xd1\x64\xe4\xb9\x78\xb2\x4b\x08\x03\x32\x12\x04\xfc\xa9\xc9\x16\x58\x8c\x0b\x2c\x8d\x73\xf8\xee\x9b\x77\xca\x7a\xc8\x9f\xbe\x6d\x31\x84\xc1\x61\x44\x6a\x04\x9d\xba\x34\x23\x7b\xce\xa3\xe9\xa0\xee\x29\xd1\x93\xf0\xa3\x6b\x3e\x67\x4b\x35\x7e\x8a\x1b\x6b\x71\xc5\x6e\x54\x11\xdc\xc3\xba\x6b\xc8\x01\x83\x23\x88\xd4\x67\x74\xaa\x31\x48\x3c\xfc\x80\x48\xba\xfe\x3d\x4f\x33\xe9\x93\x4d\xa7\x83\x4e\x27\xaa\xc4\xc2\xe0\xea\x6b\xf8\x6d\x25\xe3\x7c\x24\xf3\x17\x60\xf0\x33\x22\xf5\x05\x9d\xfa\x9c\xb4\x87\x1b\x67\xe8\xa3\x5f\x6a\xcb\x67\x54\x27\xc9\xf2\x00\x47\xf0\x0e\x7e\x6b\xa6\x91\xa4\x9e\x6f\x7a\xaf\x56\x54\x8e\x05\x0c\x7e\x41\xa4\xbe\xa2\x53\xa6\x0a\x19\xee\xdf\x1a\xc5\x82\xf2\x18\x7e\x95\x86\xee\xc3\xf4\x8b\x5c\xea\xfc\xa1\x5d\xf7\xbc\x83\xc3\x3e\xb2\x72\x65\x45\xb2\xc2\xe0\x57\x44\x6a\x14\x9d\xa2\x22\x9f\x92\xf2\x0c\xa3\x4c\x13\xb6\x2a\x38\x1d\x48\x7a\xbe\x2a\xbd\xbf\x78\xf7\x55\x36\xe5\x31\xd5\x2c\x8d\xd8\x61\xbb\xcc\x35\x18\x1c\x45\xa4\xc6\xd0\xa9\x27\xd8\xef\x79\xb3\xe2\x0b\x00\x54\xf4\xc7\xf9\x88\xac\x8f\x73\x3f\x2c\xae\x2e\x35\x68\x6a\x36\x07\x92\xc7\x38\x9e\x17\x10\xbb\x00\x83\x63\x88\xd4\x38\x3a\x85\xc7\x08\xf4\x06\x88\x7a\xbd\x57\x52\x5c\x9d\xbc\x27\x0c\x98\x3e\x89\x74\x7b\xc8\x85\x75\x3d\xae\x6c\xd1\xe6\x5d\xce\xf3\xb3\x76\x30\x38\x8e\x48\x4d\x60\x2c\x2d\xbb\x5c\x65\x38\xb5\xb1\xe5\xb7\xe3\xf0\x70\xfa\x5e\xf4\x68\x17\x5e\x1f\x01\xf3\x58\xb1\xa9\x53\x1b\x8b\x54\x89\xee\xb0\xa9\x01\x0c\x4e\x9c\xd0\x90\x9d\x14\x0e\xf2\x47\x43\x36\x89\x71\x9f\xc1\x74\x9e\x42\x83\x77\x30\x45\x3c\xc3\xee\xc0\x94\x4c\xd7\x4f\x4a\x2d\xab\x88\xb7\x9a\x55\x94\x56\x17\x6e\xe8\xe4\x5c\x28\x33\x82\xc1\x49\xc4\xcd\x98\x42\xa7\x02\x99\x7d\xde\x84\xe4\x18\x87\xac\x3e\xcd\x1c\xfd\x95\x58\xc9\x2c\xd1\x6b\x74\x6e\xc8\xca\xb5\xe0\x76\xac\x3d\xbd\xdc\xf1\xa0\x07\x0c\x4e\x21\x52\xd3\x18\x4b\x35\x62\x6f\xef\xf8\xb8\xec\xf3\xb6\x24\x36\x2d\xb8\x99\x4a\xfe\xb4\x79\x4c\x28\x58\xcc\x74\x5d\x65\xfc\xc1\xc3\xaa\xf0\xbb\x91\xf6\x30\x38\x8d\x48\xcd\x60\x9c\x38\xa3\x14\x7a\x95\x03\x4a\x3e\xf2\x0c\xb3\x92\xee\x4e\xad\x46\xf6\xbf\xe3\xeb\x2b\x0f\x30\xa6\x38\x5d\x15\x62\x65\x32\x60\x74\x15\x06\x67\x10\xa9\x59\x74\x8a\xe9\x9d\x23\x57\x7c\x25\x67\xc6\x5a\x4b\xe0\x68\x67\x64\x5f\x06\xfd\xc7\x6e\x14\x9f\x0f\x69\xae\xfe\xad\xe3\x2f\x85\x7d\xdb\xf2\x30\x38\x8b\x48\xcd\xa1\x53\xbc\x61\xd1\xde\x76\xdb\x36\x0c\x1e\x29\x70\x01\xa1\xb2\x1d\x45\xf6\x07\x61\x72\x85\xb3\xfd\x6a\x0d\x62\xe2\x9c\x0e\x9f\x16\xe5\x60\x70\x0e\x91\x9a\x47\xa7\xde\xe9\x37\xbf\xe2\x49\xa7\x97\x22\x6c\x10\xad\x15\x6f\x77\xdf\xa1\x5f\xd1\x57\x52\x8a\x7c\xf9\x19\x30\xfd\xa1\xf7\x62\xa8\x82\x16\x06\xe7\x11\xa9\x05\x74\x8a\xc5\x8e\x25\xed\x7e\xfb\xb0\x82\x50\x50\xd8\x3d\x81\xf0\x8d\x1f\x57\x86\x73\xbc\x28\xce\xe6\xdb\x87\xa8\x40\x2e\x3e\xa3\xd4\x44\x30\xb8\x80\x48\x2d\xa2\x53\xf6\x0d\x93\xae\x9d\x3d\x10\xbf\xf8\x16\xf5\x35\x5d\x85\xa6\x37\xcc\x1b\x89\xb3\x87\x54\x5b\x47\x5d\x1e\x4e\xc2\x58\xde\x81\x42\x30\xb8\x88\x48\x7d\xc3\xd8\xff\xc3\xb5\x73\x6b\x4d\x28\x6d\xcb\x74\xbf\x0d\x64\xa7\xe6\x6d\x70\x6c\x70\xdf\xb2\xc7\x6a\xe5\xaf\x7c\xe6\xa5\x82\x47\x45\x42\x03\x83\xdf\x10\xa9\x25\x74\x6a\xf5\x6a\xa6\xc8\x6a\xc8\xaf\x4b\xb0\x56\xa3\xa3\xe3\x13\xb6\x01\x86\xed\xde\x3b\x52\x3c\x6a\x41\x79\x55\x5a\x15\x7b\x2d\x3c\xcc\x30\xb8\x84\x48\x2d\x63\xbc\xaa\xed\xa3\x5f\x4b\xdd\xd9\xf2\xc2\x29\x2f\xd2\x03\x65\xf4\x7b\x52\x23\x38\x65\xd2\x21\xab\x53\xd1\x35\x8f\x3a\x34\xef\x9c\x25\x81\xc1\x65\x44\x6a\x05\x63\x30\x30\xe1\x5e\xdf\x54\xab\xd1\xd4\x25\xef\x74\x28\xbc\x5d\x50\x79\x31\x6b\x99\xa0\xc0\x72\xc6\xf8\x72\x67\x48\xac\x0f\xc1\xb1\x05\x0c\xae\x20\x52\xab\x18\x97\xe1\xbe\x3f\x89\x5b\x1a\xb5\x75\x70\x0d\x0c\x64\x3e\x4d\xb8\x76\xe6\x4e\x03\x89\xdc\x97\x72\x9d\xa1\x2b\x86\x1e\x9b\xf1\xbf\x78\xcf\xc0\xe0\x2a\x22\xb5\x86\x71\x4d\xf6\x2d\xcd\xb3\xb4\x11\xce\x10\xf3\xeb\x2f\x72\xe2\xd3\xd6\x1c\x8e\xb0\xb1\xe7\xdc\xb6\x19\xb7\x1a\x9b\x54\x12\xbd\x1e\xc5\x73\xc2\xe0\x1a\x22\xb5\x8e\x4e\x6d\xe3\xbc\x5b\x81\x3f\x01\xe5\x16\xd7\x55\xa2\x2d\x8a\x3a\xaf\xae\xf4\x68\x7d\x56\x5b\x58\xd9\xc8\x58\xb9\xb4\xf6\x9c\xa9\x00\x82\xc1\x75\x44\x6a\x03\x9d\x4a\xa6\x22\x4b\x0b\x00\xfc\x77\x43\x1e\xd4\x0d\xcd\x2c\x34\xa4\x3b\x91\xbc\x52\x62\x63\xe1\xcc\xdb\xb1\xfd\xb1\xe1\x29\xde\xc5\x00\x83\x1b\x88\xd4\x26\x3a\x55\x90\x70\x30\x7d\x50\x4a\xb3\xfa\x3c\x9c\x4b\x7c\xf6\x65\xee\xc7\xfc\x94\xb6\xdc\xba\x4d\x7b\x4b\x95\x7e\x9e\x76\x0d\xa9\x0f\xbc\x30\xb8\x89\x48\x6d\xa1\x53\xbd\x06\x5b\x17\x4b\xa8\xdf\xd0\x4e\x6f\xb9\x1d\xdc\x51\xd5\x20\x7c\xe8\x15\x6b\x40\xd3\x2f\xf6\xe9\xa3\x2f\xcb\xcf\xa0\x7e\x53\x10\x06\xb7\x10\xa9\x6d\x74\x4a\x78\xa1\xf9\x86\x16\xea\x75\x1a\x5d\x56\xa7\x16\x7f\xdc\x60\xe9\xbc\xb9\xa6\xb6\x7d\x5b\xd3\xcb\x2b\x57\x3b\x89\xd5\x4d\xbf\xb0\xc3\xe0\x36\x22\xb5\x83\x71\x40\x96\xba\xeb\xcd\xf8\x8b\x65\x0a\x67\xc4\xac\x7d\x41\xa8\x85\xce\xd5\x5d\xe2\x9b\x75\xd4\x7a\xba\x1a\xaf\x94\x4d\xe6\xd3\x75\x71\x18\xdc\x41\xa4\x76\xd1\xa9\xae\x4b\x2d\xe7\xfb\x72\xc7\x3b\x97\x9a\x0f\xfd\x7c\x27\xb3\x43\xa7\xfa\xb9\x42\x14\x2b\xdf\x8a\x08\x6d\xa5\x89\xe7\x18\xbe\xe7\x80\xc1\x5d\x44\x6a\x0f\xe3\xbd\x7a\xce\x91\x32\xa1\xd5\x30\x40\xf8\xe4\x60\x32\xeb\xf1\xcc\x7e\xf8\x6b\x45\xc3\xf2\x8b\x9c\xf5\x6c\x74\x16\xb6\x7e\xa5\x25\x66\x30\xb8\x87\x48\x7d\x47\xa7\x6a\x45\xa7\x6f\xca\xa2\xee\x72\x8e\xd8\x0e\x12\x12\x29\xca\xed\xa5\x93\xf3\xbe\xf8\x72\xf5\x92\xad\x0e\x97\xc7\xbd\xa9\xa2\xdb\xf2\x30\xf8\x1d\x91\xda\x47\xa7\x7a\x06\xc1\xb3\x9d\xde\x47\xe5\x33\x64\x86\x9e\x19\x95\xcf\x63\x6b\xc4\xe5\x46\xf6\x26\xb4\x18\xf3\x1b\xac\xf2\x53\x63\x82\x9d\x60\x70\x1f\x91\x3a\x40\xa7\x5a\x5a\x08\x77\xcc\xef\x97\xe1\xf1\x3e\xaa\x13\xfe\xa8\xda\x3a\xff\xad\x87\xb9\x75\x85\xf5\x92\x45\x28\x93\x81\x3e\xed\x66\x08\x2d\x0c\x1e\x20\x52\x87\x18\xb7\x58\x50\x5d\xc4\x2e\x54\xff\x34\x2d\xb2\x39\x74\x65\xb7\x9d\xec\xbc\x67\x1c\x4f\x85\x8b\x5c\xf6\xe2\xf2\x57\x2c\xd6\x0d\x56\x0d\x0a\x18\x3c\x44\xa4\x7e\xa0\x53\x34\x9e\xee\x39\xe3\xef\x68\xe7\xe8\x9c\x9a\xce\x5a\xb5\x5e\x3b\xf7\xa6\x11\x7f\xa5\x50\x3b\x6f\xa6\x60\xe5\xbb\xf6\x47\xa6\x7b\xd2\x30\xf8\x03\x91\xfa\x89\x4e\x45\x5e\x2c\x6e\xd7\xae\xb8\xde\x30\x5e\x9c\x43\x75\xee\x6a\x02\x41\xd1\xe7\xc5\x26\xb2\x4d\x82\x97\x05\x76\x2f\xe6\xcc\x5d\x5f\x88\xc0\xe0\x4f\x44\xea\x08\x9d\x52\xfe\x51\xdd\x96\x5d\x85\xc5\xb3\x22\xee\xa0\x56\x5f\xa3\xad\x91\xa1\x49\xb5\xd5\x9c\xcc\x33\x7e\xd8\x69\x6d\x17\x9e\x64\x8a\x0b\x83\x47\x88\xd4\x2f\x8c\xc1\xf0\xf6\x46\x12\xf1\xf3\xd1\xd9\x50\xc9\x85\xf2\xad\x4b\x9d\x61\x51\xe7\x52\x47\xa5\xb7\x2a\x79\x96\xfc\x2e\xd1\xb9\xbb\xdc\x77\x82\xc1\x5f\x88\xd4\x31\x3a\x25\x2f\xa8\xa6\xd9\x5b\x4a\x17\xd1\x29\xa3\x1e\x92\x54\x4c\xac\x47\x57\x3f\xfd\x46\x27\x89\x9f\xb8\xe6\x56\xe1\xeb\x9b\x77\x0e\xb1\x60\xf0\x18\x81\xea\x23\xff\x77\x11\x6c\xff\xdb\x90\x41\x00\x46\xb2\x18\xc1\xeb\xf7\xd6\x42\xcf\x1d\x16\xa2\x2a\xb9\xc9\xd7\xd4\x8d\xfa\xfc\xca\xb0\x2c\xae\x8b\xfd\xa8\x91\x0a\x6e\xf1\x27\xdb\x22\x10\x87\x21\x00\x31\x5b\x0c\x02\x30\xd2\xc5\x2a\x37\x26\xbf\x8e\x08\xbd\xe3\x9b\xb3\x5a\x34\x6e\x33\x9b\xb7\x0f\xf0\x69\x3a\x73\xd1\x23\x99\xa6\xb0\x6a\xad\x2c\xe4\x93\xba\x3d\x0c\x01\x88\xf9\x62\x10\x80\x91\x30\xd6\xb8\x75\x63\xa3\x63\x5f\x32\x89\xf9\x8e\x83\x1a\xb4\x99\x87\xdd\x53\xa1\xd0\x29\xde\x0f\xdf\xfb\xd2\xb5\x10\x7f\x7d\xd2\x91\x1e\x86\x00\xc4\x8c\x31\x08\xc0\x48\x19\x8b\x54\x66\x8d\xbd\xfe\xed\x9d\x7c\x3c\x7b\x41\x62\x9c\xb9\xbc\xe2\xf6\x20\x2f\xb7\xc2\x17\x5c\x47\x3d\x96\xb9\x9f\x77\x19\xd8\xa5\x60\x08\x40\xcc\x19\x83\x00\x8c\xa4\xb1\x46\x1a\x3a\xdf\x4e\x8a\x95\xad\xe1\x71\xc9\xd0\xc5\x1b\xc4\xad\xf4\x64\xe7\xbb\x3b\x72\x8d\x68\xb0\x00\x79\x98\xd1\xac\xc4\x06\x86\x00\xc4\xac\x31\x08\xc0\x48\x1b\xbb\x5d\xb7\xed\xdb\xdc\x31\x2a\x37\xe3\x73\x2e\xbb\x64\xec\xb5\xfa\xf3\xe3\x48\x0f\x68\x9f\xe2\xee\xed\x4d\x4b\x77\x62\x1c\x40\x04\x86\x00\xc4\xbc\x31\x08\xc0\x48\x1c\x9b\xc8\x23\xd0\xab\xbc\x55\x48\x94\x45\xdd\x47\x4e\x06\xf1\xb0\xe4\x45\xc5\x7f\x8d\xd1\x9d\x61\x1f\xf8\xc1\x38\x63\xf8\x53\x5f\x03\x86\x00\xc4\xcc\x31\x08\xc0\x48\x1d\x0b\xd6\x17\x05\x05\xe4\x6e\x69\x77\xd6\x13\x85\xf5\x4e\xea\x86\x56\x3e\xc3\xaf\x11\x9b\xe9\x79\xde\x5a\x41\x1a\x35\x3f\x25\x8f\x0b\x43\x00\x62\xee\x18\x04\x60\x24\x8f\xcd\x1e\x95\x4e\x71\xd1\x2e\x4b\xdc\x38\xdd\x3f\x2e\xb3\xaa\xaa\x1b\x7a\x3f\x03\x77\xa5\x2c\xff\x25\x41\x79\xff\x1e\x50\x88\x62\x86\x21\x00\x31\x7b\x0c\x02\x30\xd2\xc7\x02\xec\xcf\x7a\x93\x69\xdc\xae\x9d\xe3\x97\x7c\xe4\x5f\xa6\xd4\xb6\x38\x79\x06\x67\x32\x63\xa5\x22\xf0\x73\x9f\x2c\x0b\xcd\xa0\x0c\x0c\x01\x88\xf9\x63\x10\x80\x91\x40\x76\xab\x03\x7c\xd2\x5d\x08\x5c\xa5\x6b\xed\x41\x3d\x7f\x5b\x40\x70\xbd\xb9\xa6\xf6\x85\x6b\x38\x7b\xea\xaa\xfe\xad\xfe\x65\x6c\x52\x18\x02\x10\x33\xc8\x20\x00\x23\x85\x6c\x24\x24\x67\x48\xd0\x37\xc7\xa1\x47\xd8\xba\x3e\x37\x76\xcb\x5b\x6c\xf1\xb6\xe4\xcf\x53\x54\xbd\xb8\xd9\xb1\x92\x76\xee\xb3\x0c\x30\x04\x20\xe6\x90\x41\x00\x46\x12\x99\xbe\xc4\x29\x0f\x6a\x69\x87\x1b\xee\x2b\x7a\x15\x9b\xe2\x71\x11\x12\xc3\xc1\xf2\xbe\x42\x65\x6e\x14\x3e\x50\x6c\xff\xd0\x80\x0b\x0c\x01\x88\x59\x64\x10\x80\x91\x46\x16\xec\xe5\x10\x13\x15\x92\x7a\xae\xad\xe0\x47\xd6\xd5\xd5\x37\x0d\x9c\x86\xb6\x9d\x6c\xf6\x3b\x14\x66\x51\xcd\xfe\xca\x24\xb3\x7a\x30\x04\x20\xe6\x91\x41\x00\x46\x22\x59\x09\xbb\xe2\x6e\xe4\x60\xe3\x13\x81\xbe\x56\xa0\x76\x93\xfb\x82\xef\x5d\xb3\xc1\xef\xb9\x82\x8b\xdc\x51\x17\xfd\x83\x9e\x85\x11\xc2\x10\x80\x98\x49\x06\x01\x18\xa9\x64\x1a\x9e\x6f\x32\x87\x47\x6b\x82\x47\x06\xcf\x09\x6e\xa5\x96\xda\xa6\xcd\x75\xfb\xbd\xc9\x9c\x67\x17\xd6\xf6\xba\xdb\x03\xcc\x31\xc2\x10\x80\x98\x4b\x06\x01\x18\xc9\x64\x6d\x5c\x05\xa6\xb9\x2f\xb0\xfc\x1e\x9b\xe0\xaf\xc4\x56\x75\xfe\xb2\xb1\xff\xd8\x82\x32\x56\x58\x25\xee\x72\xb4\xaf\xa8\xa2\xb9\x04\x43\x00\x62\x36\x19\x04\x60\xa4\x93\xe5\xec\xda\x0a\xe8\x38\x96\xdb\xe0\x9e\xe1\xae\xd6\x77\xbe\x91\xd0\x75\xf3\x6b\x8b\x53\x4a\x37\x2e\x20\x59\xee\x71\xfe\xfb\x28\x2b\x0c\x01\x88\xf9\x64\x10\x80\x91\x50\x66\xd6\xfe\x44\xf9\x13\x1e\x05\x58\x19\x31\xf4\xe8\x67\xe6\xf4\x36\x1e\x89\x45\xf7\xcb\x35\x22\x5f\x85\xbb\x22\x04\xaf\xf7\x1b\x50\x30\x04\x20\x66\x94\x41\x00\x46\x4a\x59\x5b\x87\xb4\x6d\xe1\x51\x0d\xc3\xf6\xa5\x63\xc1\x26\x57\x67\xec\x68\xb5\x39\xc9\xbe\x7c\xcf\xe6\x77\xa1\x16\x3a\xed\x8b\x4e\xbf\xf7\x4d\xc4\x9c\x32\x08\xc0\x48\x2a\x8b\xff\x59\x55\x75\x96\xaf\xb1\xd6\xae\x25\x84\x9e\x21\x21\x5a\x61\xf0\xd1\x45\xa7\x6c\xe3\xe7\x1f\x44\xf1\x5d\xa6\xd4\x2b\xbf\xfc\xc6\x10\xb3\xca\x20\x00\x23\xad\xac\xa4\xfd\x19\x91\x71\x5d\xe2\x4a\x8c\xf5\x4f\x31\x19\x0f\xc1\x71\x5d\x0a\x55\x83\xf9\xc0\x2b\x5b\x17\xf5\x9f\x00\xbf\xaa\x5d\xd4\x61\x08\x40\xcc\x2b\x83\x00\x8c\xc4\x32\x22\x0f\xf6\xa0\xfb\xaa\x95\x0d\x47\x3a\x83\x1b\x87\x56\x07\x6b\x0f\xd7\x48\x07\xb4\x0c\x25\x1c\xb4\x59\xf6\x47\xaf\x8d\xce\xc9\xc3\x10\x80\x98\x59\x06\x01\x18\xa9\x65\x92\xc1\xc6\xda\x2e\x2a\x0f\xe4\xd8\x7a\xa4\x06\xba\xb2\xdf\x95\xa8\xce\xaa\x9d\xf9\x4a\x07\x7e\xba\x0e\x98\xd2\x64\x51\x6b\xfd\x3e\x6a\x20\xe6\x96\x41\x00\x46\x70\x99\xed\xc7\x79\x9e\xd3\x2a\x23\xc4\x97\xe6\x6e\x67\xaf\x37\x35\x49\xb4\x6d\x47\xb6\x94\x5f\x04\x22\xc5\x22\x7b\xf0\xa2\x3f\x69\xe1\xc1\x10\x80\x98\x5c\x06\x01\x18\xd1\x65\x3b\x0f\x88\x97\xcf\xa6\x64\x74\xdc\x3a\x37\xfd\xb5\xc7\x55\x21\x29\xd0\x3d\xca\x3e\x4e\xca\x16\xaf\x88\xcb\x12\x25\xbe\x2c\xc1\x06\x43\x00\x62\x76\x19\x04\x60\x84\x97\x9d\x35\x25\xbf\xf3\x2a\x90\xfa\x96\x74\xeb\x9b\x4b\xb1\x9e\x6f\x05\x24\x6a\x7b\x99\x22\xb1\x4f\xab\x2f\x04\x62\xaf\xa4\xc6\x34\x29\xc0\x10\x80\x98\x5e\x06\x01\x18\xf1\x65\x59\x07\x33\xba\x6c\xcd\xc4\xcb\x61\x81\x58\x5a\x9f\x17\xbd\x1b\xa6\x7b\xa8\xcf\x84\x1a\xf1\x11\x4e\x1d\x4e\xde\x1a\xcf\xb7\x15\x82\x21\x00\x31\xbf\x0c\x02\x30\x02\xcc\x6a\x9f\x28\x4b\x39\x13\x75\x10\xd1\x3e\xf0\xf7\xb4\x4c\x73\x8a\x3c\xf4\x16\x79\x2d\xec\xb2\x6f\xd3\xce\x29\xe3\x5b\x60\x47\xa9\x0a\x43\x00\x62\x82\x19\x04\x60\x44\x98\x99\xfa\xe4\xf8\x5b\xfa\x31\xba\xc9\x2c\x28\xbd\x7e\x24\x59\x50\xa9\x15\xa6\xcf\x18\xb4\x35\xcf\xb8\x2d\xd7\xf6\x22\xbe\x77\xd3\x08\x86\x00\xc4\x0c\x33\x08\xc0\x08\x31\x13\x54\x7f\x4f\xa5\x79\xbb\x7d\x4c\x7d\xaf\x6d\x9f\xa0\xe8\xac\xa0\xe5\x72\x58\xe8\x63\xa3\xf3\x33\x8c\x1f\x2d\x7e\xf8\xf7\x5d\xe6\x87\x21\x00\x31\xc5\x0c\x02\x30\x62\xcc\x4e\xc7\x88\x28\xc7\xbf\x49\xd6\xb2\xa5\x0a\xa8\x95\xc7\x12\xd6\x6c\x9c\x00\xf1\xa2\x1e\x8a\x18\x04\xab\x47\x7e\xd4\xca\xa0\xfb\xbd\x3b\x21\xe5\x98\xfd\xd5\xd0\x9d\x14\x94\xfb\x67\x43\x87\x11\x64\x56\x64\x6b\x5a\x25\x23\xd0\x76\xd3\xf9\xe1\x62\xd6\xfe\xcb\x41\x35\xe7\x99\x1b\x81\x6b\x59\x67\xae\x78\x0a\x1a\x70\x5f\xf0\x78\x7a\x0b\x86\x00\xc4\x24\x33\x08\xc0\x88\x32\x8b\x0d\x12\xb5\x94\xfb\x42\x44\xe9\x94\xbc\xfb\x3e\xe9\x02\x51\x47\xf9\xda\xcd\xcf\x7c\x9c\x3d\x4b\x5f\x2c\xab\x3e\x37\x7a\xcb\xfc\x6e\xe8\x10\xb3\xcc\x20\x00\x23\xcc\x4c\xc9\x1a\xfe\x4e\x15\xec\xa8\x43\xec\xab\xbb\x13\x28\x34\x9b\xa7\x4c\x7d\x6b\x42\xbd\x92\xbe\x25\xcb\xaf\xd3\xa3\xdf\x80\x5d\x18\x86\x00\xc4\x34\x33\x08\xc0\x88\x33\xab\x53\xe3\x36\xb9\x41\x93\x7f\x46\x4e\x74\x9c\xec\xcd\x3d\x41\xdd\x18\x4d\xe3\xa5\x3a\xe5\xfc\x26\xff\xc3\xb4\xfa\x0b\x39\x86\xbf\x7b\x30\xc4\x3c\x33\x08\xc0\x08\x34\xe3\xb3\xc8\xc0\x87\x78\x07\x68\xce\x5e\xf9\x41\xf1\x74\x51\xf5\x46\xf7\xfa\x25\x8e\x05\xfc\xd6\x88\x58\xaa\xae\xef\x81\x31\x96\x82\x30\x04\x20\x26\x9a\x41\x00\x46\xa4\x99\x48\xc1\xfd\xed\xd7\x84\x9c\x89\x56\x5f\x6c\x37\x0b\xbf\x3a\x75\xdf\x2f\x23\xbc\x27\x1f\xad\x9f\x19\xe9\xdf\x3c\xf0\xb0\xb3\xe8\x1a\x0c\x01\x88\x99\x66\x10\x80\x11\x6a\xf6\xd9\x36\xd7\x3e\x7d\xbb\x26\x4f\xe0\xe0\x41\x47\x94\x69\xb5\x6a\x1a\x81\xfc\xb6\x57\x2d\xd7\xf7\x74\x6b\xa9\x2b\x47\x23\xc7\xda\x30\x04\x20\xa6\x9a\x41\x00\x46\xac\x99\x0f\x99\xdc\x4b\xdf\x46\xc7\xd0\x10\x03\x7a\xde\xae\x7c\x25\x63\xce\x88\xb5\xda\x7a\xa6\x0e\xe7\xe4\x92\x82\x9f\xa5\x95\xf1\x86\x30\x04\x20\xe6\x9a\x41\x00\x46\xb0\x99\xa2\xf5\x61\x50\xd5\x2e\x8a\x32\xe7\x1e\x19\xd3\x66\x44\x74\x7b\x2f\x8d\x5b\x4e\x46\x84\x04\xc1\x53\x61\xb2\xde\xcc\x69\x2c\x65\x18\x02\x10\x93\xcd\x20\x00\x23\xda\x8c\x15\x58\x48\xb7\x2a\x34\xbc\xdb\x7c\x56\xa9\x63\x80\xb4\x51\x9c\x64\x25\xea\xbb\xb2\x4a\x45\x85\xa1\xe2\xa9\x03\xcd\xe9\x8f\x37\x61\x08\x40\xcc\x36\x83\x00\x8c\x70\x33\xcb\xa3\xaa\xb8\x75\xa6\x67\x32\xba\x45\x8a\x8f\x88\x4e\x93\x5d\x2a\x7f\x53\x28\x46\x71\xb7\x1a\xd0\x59\x2c\xe3\x29\x96\x5d\xf9\x3d\x34\x10\xd3\xcd\x20\x00\x23\xde\xac\x1b\xe7\xfa\x87\xf3\x86\x66\xe9\x65\x9f\xd7\xbf\xff\x84\x0b\x59\xf5\x59\xed\xd8\x75\x25\xdf\x74\x34\x3f\xbf\x62\x45\x2e\xd2\x7d\x16\x86\x00\xc4\x7c\x33\x08\xc0\x08\x38\x4b\x65\xf4\x14\xe0\xf8\x06\xae\xa4\xb4\x95\x4c\x68\x73\xc4\xd8\xad\xfb\xf2\x7d\x92\xcc\x36\xe3\x4e\x10\xe4\x40\xfd\xb4\xe2\xb3\x86\x21\x00\x31\xe1\x0c\x02\x30\x22\xce\x32\x09\xd2\xbf\xf4\x46\x38\xc7\x67\x99\xf4\xf3\xb9\xbe\x62\xfb\x30\xec\x74\xae\xe7\x85\xf1\xa3\x03\x39\x16\x75\x1c\xc5\xaf\x0f\x7e\x9f\x68\x11\x33\xce\x20\x00\x23\xe4\x6c\xd4\xad\x6a\xff\x7a\x57\x78\x83\xe9\xd0\xb9\xe1\xe0\xda\x90\x08\xb2\x4c\x30\xfe\x14\x69\x5c\xd6\x25\x7e\xf5\x45\x6d\x5a\xf9\xab\x30\x04\x20\xa6\x9c\x41\x00\x46\xcc\xd9\xe9\xeb\xd2\xac\xcb\xed\x4c\xbe\x7e\x64\x17\x79\x77\x70\x24\x92\xf5\x1a\xf3\x94\xca\xcd\xe1\x25\x01\xd1\x2e\x97\xc1\xf1\xa7\x20\x0c\x01\x88\x39\x67\x10\x80\x11\x74\x46\x7c\xc6\xc6\x87\x2b\xf4\x6e\xfd\x53\x85\xa7\x41\xcb\xcf\xec\x62\x9e\x60\xe1\x5e\xa2\x52\x18\xd6\x09\x02\xef\x0e\x91\xf3\x89\x49\xc0\x10\x80\x98\x74\x06\x01\x18\x51\x67\xdd\xb6\x22\xb4\x55\xdf\x52\xac\x29\x74\x48\xd2\xf5\xa4\x16\x49\xce\x8b\x5d\x6a\x67\x3b\x67\x29\x7d\x47\x5e\x40\x6b\xdc\xb3\xe7\x77\xdf\x8a\x98\x75\x06\x01\x18\x61\x67\xf4\xfd\x51\xea\x2d\x4e\x9c\xe4\x11\xf4\x43\x5e\x3f\x7c\x29\xb7\x9e\x1b\x2e\xe8\xdf\x13\x9c\xb2\x0a\xcf\x21\xe8\xbd\xaa\x91\x7a\x19\x86\x00\xc4\xb4\x33\x08\xc0\x88\x3b\x3b\xeb\xed\xec\x4c\x12\x87\x23\x8a\x72\x00\xec\x98\xbe\x0a\xae\xef\xb0\xa9\x14\xfd\xf0\x8c\xcf\x9d\xd2\xe3\x1a\x92\x5e\x25\xd7\x81\x21\x00\x31\xef\x0c\x02\x30\x02\xcf\x3e\xe2\xea\xbf\xf0\x2f\x94\x2f\xe8\xd9\x8b\xf6\x17\xba\x2f\x7a\x76\xf7\x54\x9b\x10\xcd\xed\x1f\x06\x63\x17\xbd\xd8\xb1\xee\x4e\xfe\x6e\x4e\x10\x13\xcf\x20\x00\x23\xf2\x0c\xe5\xf5\x6b\xbf\x5d\xa7\xbf\x8a\x1a\xe8\x93\xa2\x69\xb0\x8c\xa1\x4b\x8b\x87\xed\x84\x94\xf6\x16\x6b\x2f\x75\x55\xef\x68\x2a\xc1\x10\x80\x98\x79\x06\x01\x18\xa1\x67\xc7\x6e\x07\x11\xe7\x0a\x79\xe4\x0f\x94\x9f\xba\xcf\x5b\x55\xa3\xc4\x39\x56\x1e\x75\x66\x0a\x47\xa4\xba\xda\x29\x54\xc6\x67\x90\xc0\x10\x80\x98\x7a\x06\x01\x18\xb1\x67\xd4\x5b\x59\x25\x71\xc4\xab\x1f\xf7\x2f\xe3\x5e\xd3\xb2\x6f\xef\xfb\xb8\xc7\xe1\x25\x80\x47\xfb\x60\x88\xca\xb6\xc3\x63\x82\x90\x0c\x86\x00\xc4\xdc\x33\x08\xc0\x08\x3e\x73\x5f\x4e\xce\x3e\xa8\x0d\xc9\xd1\x19\x64\xf9\xbe\xb6\x7c\x9f\x90\xfb\xee\x68\xa3\x18\xce\x58\xb8\xdc\xe6\x4a\x03\x69\xaf\x19\x37\x0c\x01\x88\xc9\x67\x10\x80\x11\x7d\x36\x7e\xe5\x5c\xd1\xeb\xe4\x5e\xba\x99\xbc\x4f\x02\x46\x13\xc4\xc5\xbc\x15\x97\x6b\xcb\x3c\xdf\xe0\xeb\xeb\x4f\x2f\x32\xcc\x91\x9f\x86\x21\x00\x31\xfb\x0c\x02\x30\xc2\xcf\x22\x7e\x8d\xb1\x9c\x9a\x50\xfc\x72\xc3\x7b\x96\xdc\xf0\x02\xbe\x25\x2f\xd8\x60\x38\xbf\xba\xbd\x74\x37\x5e\x63\xc1\x26\x9b\xf6\xf7\x79\x13\x31\xfd\x0c\x02\x30\xe2\xcf\xce\x1a\xd9\x89\xa5\xe6\x3a\x46\x5f\x30\xfa\x3a\x8b\xab\xb4\xe3\x73\xcb\xd0\x2f\x43\x16\xdf\x74\xaf\x64\xd8\x49\x78\xa2\xa4\x1e\x82\x21\x00\x31\xff\x0c\x02\x30\x02\xd0\x2a\x2b\x05\xd6\x2f\x85\xcd\xd3\x0a\xd0\xc5\x4a\xe5\x3e\xb9\xad\x98\xa0\xbe\x6e\x27\x3d\x87\x77\xeb\x6e\x37\x55\xfb\x8a\x75\xce\xef\x71\x86\x98\x80\x06\x01\x18\x11\x68\xc2\xcf\x39\x93\xae\x95\x9d\x16\xae\x59\xa1\xc2\x3e\xfb\x5c\xa9\x78\x7a\xca\x5c\x5d\x47\x4b\x6b\xa4\xed\xc6\xf0\x5c\xd8\x6c\x86\x29\x0c\x01\x88\x19\x68\x10\x80\x11\x82\x96\xf2\x99\xdb\x9b\x2b\xf5\xf9\xa8\xaf\xc4\x22\x91\x0e\x58\xab\x49\x9b\x30\xd6\xf4\x33\x18\xcf\xf9\x3d\xcf\x9a\xf3\x3b\x59\x13\x49\x18\x02\x10\x53\xd0\x20\x00\x23\x06\x2d\xdf\x17\xe4\x20\xfe\x24\x98\xc9\x2b\x23\x2b\x4f\x1d\x7f\x69\xb0\xd2\x95\xbc\xbf\xaf\xdb\x9f\x60\x79\x65\x24\xfe\xa8\x23\xe4\xf7\xa7\x89\x94\x83\xf6\x57\x43\x77\xd2\x9f\x33\xf8\xb3\xa1\xc3\x08\x42\x2b\xb3\xeb\x24\x19\xef\x8a\x95\x56\xbe\x6a\x66\xc5\x93\x03\x34\x5f\x30\x2f\xba\xa3\x81\x3f\x73\x70\x83\xf1\xed\x6c\x1c\x8e\x2e\x03\x0c\x01\x88\x49\x68\x10\x80\x11\x85\x66\x6b\x16\x34\x76\x0d\xe0\x03\x24\x33\xcc\x64\xaf\x86\x15\xad\x0c\x85\x70\x5f\xe5\x52\x62\x51\xa0\x52\x42\x2d\x9b\x93\xee\xb2\xc3\x10\x80\x98\x85\x06\x01\x18\x61\x68\x71\xf1\x36\xf3\x8e\x7c\x82\xe3\xac\x2e\xda\x13\x15\xdd\x83\x77\xe4\x9f\x2f\x3b\x35\x73\xaf\x83\x7c\x31\x85\x83\xc4\xc2\x35\xbf\xfb\x79\xc4\x34\x34\x08\xc0\x88\x43\x0b\xeb\x7b\x97\xe5\x4c\x43\xd0\xb1\xf6\xec\x3a\x59\x57\x45\x85\x14\x61\x63\x08\x6b\xf4\xb9\x57\x78\xa4\xa3\xd0\xce\x4b\xd1\x0b\xbf\xe7\x40\x88\x79\x68\x10\x80\x11\x88\xe6\x30\xf4\x80\x5e\x7a\x54\xe2\x8c\x87\xad\x41\xe9\x96\xed\x7b\x66\x73\x11\x89\xf7\x0e\x32\xcc\x9f\x3f\xbe\x26\x31\xf0\xbe\x28\x70\x1d\x86\x00\xc4\x44\x34\x08\xc0\x88\x44\xdb\x55\xc2\x37\x03\x56\x57\x0c\x1e\x84\xed\x3c\x9b\x13\xf6\x0f\x94\xba\xe8\x6d\x3d\xdf\xfe\x1c\xb7\xce\x64\xc0\x2c\xc5\xea\x31\x2f\x0c\x01\x88\x99\x68\x10\x80\x11\x8a\x96\xbb\x36\xc1\xdb\x7e\x67\x6f\xdc\x2a\x28\xf8\xcc\x8a\x8d\x39\x21\xc0\x72\x9d\xe4\x51\xe0\x73\xf9\xd3\x71\x3f\x72\xe4\x67\xb9\x7f\xbf\x32\xc4\x54\x34\x08\xc0\x88\x45\x7b\xb1\x45\x70\x6b\x30\x54\xd7\xf4\x0b\x3c\x31\xf6\x08\x87\xe3\x5b\x97\x27\xfb\x7c\xdb\x7d\x97\x9b\xe3\x96\x37\x9e\x4e\x5e\x88\xfe\xdd\x02\x20\xe6\xa2\x41\x00\x46\x30\x5a\xee\x4d\x9c\xbb\xae\x97\x67\x26\x4e\x7d\x6f\xd2\x3b\xea\x95\x9a\x5f\x00\x22\x86\x96\x32\x98\x43\x93\xea\xf7\xb0\x64\xb5\x7c\x51\x30\x04\x20\x26\xa3\x41\x00\x46\x34\x1a\xb9\x7d\xa9\x60\xbc\x7d\x67\xa0\x98\x4e\x27\x3f\x2e\x85\xe0\x8e\x5d\xc8\x5a\xd2\xfe\x6b\xdb\xaf\x9c\xf1\xa4\xbd\x0d\xb0\x04\x33\x0c\x01\x88\xd9\x68\x10\x80\x11\x8e\x96\xb2\xab\x7a\xaa\x6f\x76\xbf\x76\x7d\x64\x7d\x5f\x5d\x9d\x6d\x89\x3c\xb5\x33\x81\x4b\xd5\x04\x4f\xfd\xfb\xa0\xd1\xad\xc4\x3e\x62\x18\x02\x10\xd3\xd1\x20\x00\x23\x1e\xad\xde\x4f\x8b\xed\xc1\xfe\x53\xfa\x73\x96\xe7\x88\x14\xd3\xd4\xe4\x43\x69\xee\xca\x55\xe1\x51\x64\x78\xf8\xcf\xa6\xf6\x3e\x78\x20\x0a\x43\x00\x62\x3e\x1a\x04\x60\x04\xa4\x39\xd3\xb0\xe6\xd3\x50\x73\xf5\xe8\xe5\x98\x46\x05\x50\xdc\x1e\x57\xb1\x48\x78\xb2\x1b\x3f\xe8\x69\x95\x9c\xb8\x40\xca\x59\x42\x07\x43\x00\x62\x42\x1a\x04\x60\x44\xa4\x49\x52\x5d\x79\x25\xaf\x88\xfb\x2d\xd7\x40\x0c\xdb\x7f\x1d\x55\x7d\x60\x8e\x3f\x97\xd2\xa9\x08\x9b\xef\xf8\xd4\x5a\x3f\xf5\xfd\xdd\x9e\x23\x66\xa4\x41\x00\x46\x48\xda\x94\x63\x22\xcf\xe1\x73\xa1\x72\xbb\x50\xc5\x90\xd7\xc6\xd5\x2c\xd7\x9c\x4a\xc4\xba\xf3\x2b\xcf\xb5\x4d\x3c\xb0\xe5\xd7\xad\xfe\xfd\x69\x22\xa6\xa4\x41\x00\x46\x4c\xda\xc3\xe1\x88\x85\xcf\x55\x52\xd8\x22\x76\x94\x2b\xd7\x73\x63\xa5\xd4\xb2\xad\x49\x37\xf7\x0e\x9e\xfb\x65\x2a\xd9\x75\xe4\x51\xfd\xde\x37\x11\x73\xd2\x20\x00\x23\x28\xed\x14\xa7\x87\xe6\x95\xf2\x43\x7e\x03\x11\x9e\x1c\x3a\xcb\xc8\x37\x9f\x57\xa9\xf7\x6f\x29\xb3\x65\x3c\xe7\x27\x20\x90\x4c\x75\xfd\x7d\x3a\x43\x4c\x4a\x83\x00\x8c\xa8\xb4\x2b\xfc\x38\x4a\x82\x71\xee\x1a\xaa\x92\x37\x78\xf5\xb8\xb2\xee\x93\x32\xcf\x74\x7a\xd9\xe1\xc8\x37\x07\xeb\x3b\xf3\x61\x93\xfc\x1e\x1a\x88\x59\x69\x10\x80\x11\x96\xc6\xc6\x6a\x5d\xd5\x67\xa9\xa5\x9d\x4a\x0a\xf3\xbe\x8d\xd3\x23\x4c\x1c\x80\x44\x1f\xf4\xde\x44\x3d\xe1\xeb\x26\xbf\x9c\xb4\xf2\xfb\x38\x8f\x98\x96\x06\x01\x18\x71\x69\xb8\x9b\x0e\x4f\xed\xd3\xec\xf0\xee\x39\x2f\x9c\x77\x55\xb6\xaa\x18\xad\x2b\x1f\x26\x3d\x54\x18\x1b\x65\xf6\xd4\x96\xf0\x19\x12\x80\x21\x00\x31\x2f\x0d\x02\x30\x02\xd3\xae\xbc\xd6\x4f\xcb\xcf\x38\x6a\xdd\x36\x4d\x3a\x47\x34\x57\xcb\x3c\xad\x7b\xd9\xb4\x6c\xd2\x5f\x71\x57\xb4\xdd\xd5\x96\x63\xfa\xf7\x8e\x8e\x98\x98\x06\x01\x18\x91\x69\x5b\x96\x52\x17\xf4\xae\x3f\xf2\x6e\xc7\x7d\x23\xf0\xe8\xae\x11\xf5\x99\x8d\xda\xfb\xb2\x26\x3a\x2f\xe5\x7f\xd1\x71\x55\x34\xba\xfc\x3e\x04\x21\x66\xa6\x41\x00\x46\x68\x5a\xb1\x9d\x6c\x71\xed\x12\xa3\x27\xd6\xbd\x55\xcd\xe9\xd9\x33\xb9\xad\x0b\x4c\xe4\x17\x19\x2d\x57\xaf\x1d\x30\xd9\xf8\x6b\x73\xff\x3e\x38\x22\xa6\xa6\x41\x00\x46\x6c\x9a\x21\xa1\xf3\x30\x2d\x83\x24\x8e\x4b\xe4\x4f\x03\xc1\x96\x94\x3c\x8b\x7a\xad\xcb\x4b\xef\x8e\x56\x20\x91\x3e\x86\xfb\x65\xea\x67\x60\x08\x40\xcc\x4d\x83\x00\x8c\xe0\xb4\x8e\xab\x66\x51\x6f\xd8\x02\xfe\x7f\xcc\xbd\x75\x54\x15\xd1\xff\xfe\xcb\x50\xd2\xa0\x82\x32\x02\xd2\x21\xdd\xa0\x74\x09\xd2\xd2\x82\x08\x0a\x08\x48\x8a\x08\x88\x80\x1c\x1a\x41\xe9\x96\x4e\x01\x51\x90\x52\xba\x43\x42\x42\xa4\x41\x29\xa5\x5b\xda\xbb\xfc\xfd\xd6\xe1\xf2\x19\x3c\x6b\x3e\xdf\x7b\xfd\xe3\xbb\x96\x7f\x3e\xbe\xcf\x7b\xf6\x73\xce\xde\xfb\x99\x3d\xf3\x02\xfb\xaa\x4e\xfd\x6f\x92\x33\xd7\xd1\x0f\x1a\xb8\x1a\xa4\x1a\xdf\xe8\xae\x48\xd4\xd7\x59\x7d\x5a\xff\x13\x50\x51\x92\xd3\x40\x00\x82\x4e\x63\xb1\x2d\x30\x4c\x2f\x9f\x54\x32\x0f\x93\x29\x1b\x1b\x6e\x7b\x91\xcb\x6d\xcc\x1f\x7f\x8e\x94\x13\xd8\x36\xa2\xe1\x61\xc6\xff\x93\xc3\x51\xb2\xd3\x40\x00\x02\x4f\x73\xbd\xec\xff\x41\xe4\x8e\xbf\x75\x09\xeb\x8d\xd5\xa3\x02\x01\x13\x2c\xfb\x83\x3a\x3e\x30\x84\x73\x68\xb1\xe7\x72\x59\x2e\x1f\x2f\x02\x04\x50\xd2\xd3\x40\x00\x82\x4f\x43\xbc\xe5\xfb\xb6\xed\xd2\x56\xa2\xd1\x4c\x21\x6f\x80\x87\x19\x78\xbb\xd6\x17\xc3\x4c\xba\xf3\xd5\xc1\x67\x41\xbc\x55\x22\xa3\x07\x08\x10\x40\xc9\x4f\x03\x01\x08\x40\xed\x4a\x76\xd5\x54\xe5\xf7\x37\x89\xe9\x6f\x5e\xd1\x60\xd5\x1e\x76\x5a\x67\xf9\x8f\xb2\x1a\x0f\x2a\xb4\x76\xd1\xc6\x73\xe0\x88\xa2\x23\x40\x00\x25\x41\x0d\x04\x20\x08\xb5\x4c\xc6\xb8\xb6\x25\x47\x45\xff\x44\xdf\x20\x46\x0f\xc5\x25\xa3\x33\xd9\xb1\x76\x54\xfc\xb6\xf4\x6d\x13\xb6\x88\xa0\xce\xe5\x3f\x5f\x5a\x94\x0c\x35\x10\x80\x40\xd4\xb2\x6a\x1e\x54\xb7\x0e\x69\x5c\x19\x71\xb8\x3f\x73\xa8\xa4\xa2\xd0\xbd\xf8\x31\xf5\x7a\xf8\x7d\x96\xad\x2f\x68\x0c\xac\x5c\x9f\x49\x11\x20\x80\x92\xa2\x06\x02\x10\x8c\xda\xc1\xa2\x50\x8e\xa0\xcb\xaa\xf0\x1b\x86\x7c\x5d\xd6\xeb\x54\xe4\x26\xa1\x39\x64\xd7\x3f\xb4\x32\x0d\x88\x60\x13\x86\xd0\x87\xe8\x23\x40\x00\x15\x47\x0d\xb9\xa1\x83\xfb\xa3\x53\x27\x37\x74\x10\x90\x1a\x6f\x99\x39\xd5\xb0\xe8\xf5\x48\x29\xe0\xbc\x69\xc0\x60\x05\x27\xc1\x37\x8f\x0d\xad\x57\x1c\x04\xc1\x24\x77\x29\x54\x37\x92\x0d\x11\x20\x80\x92\xa4\x06\x02\x10\x94\x5a\xad\xc2\xfc\x70\x39\xdd\xde\x19\x37\x34\xde\xdc\x01\xa7\xcb\x9d\x7a\x4c\x6c\x31\x6f\xf7\x06\x48\x15\x26\x6b\x6f\x87\xbe\xbc\xfc\x67\x9e\x47\xc9\x52\x03\x01\x08\x4c\xed\x59\xe4\x81\x91\xf3\x40\x54\xf7\x6a\xe3\xe7\xc6\x57\xf6\x31\x73\xb9\x43\xb7\x63\xf5\xf2\x27\x4a\x6e\xa6\x2b\x14\x3f\xa0\x2c\xe7\x40\x80\x00\x4a\x9a\x1a\x08\x40\x70\x6a\xa1\xd3\xec\x37\x67\xcb\xab\xd5\xaf\x32\x44\x7b\xa1\xed\x7a\x07\xeb\x8b\x3d\x6b\x68\xaa\x5b\xf7\x6b\x25\x2a\x6d\xec\x76\xab\xf9\xf3\x93\x41\xc9\x53\x03\x01\x08\x50\x6d\x7e\xf7\x59\x68\xef\x9a\xb9\xd1\xeb\xa6\xe2\xf3\xf9\x05\x6a\xbb\xe4\x3f\x9a\x31\x69\x22\x7c\x30\x82\xee\xf2\xdd\x75\x4d\xbf\xff\x67\x6d\x44\x49\x54\x03\x01\x08\x52\x4d\x94\xd6\xa2\xbe\xda\x6e\x65\x7a\xaf\xcc\x24\x1e\xed\x28\xbd\x8a\x29\xa4\xab\x23\xe2\xce\x99\xf7\xe8\xb8\x92\xbe\x57\x17\xf7\xff\x84\x50\x94\x4c\x35\x10\x80\x40\xd5\xd4\xdd\x13\xe8\xe8\x4a\x5a\x5c\xae\xdd\xde\x2f\xea\xf9\x7a\x0f\x37\xe4\x22\x77\xb0\x0c\xf5\xa0\xc2\x85\xcb\x04\x35\x78\xad\x3c\x17\x11\x20\x80\x92\xaa\x06\x02\x10\xac\x9a\x7c\x80\xde\x6d\x9e\x77\xf1\x2f\xc1\xfe\x37\xad\xdf\xab\xeb\xec\x26\xa7\xe5\x36\xab\x84\xaa\x26\x86\x3c\x7b\x2b\xe2\xab\x92\xfe\x6c\xcf\x51\x72\xd5\x40\x00\x02\x56\xf3\xbd\x31\xbf\xbf\x94\x7f\x63\x65\x20\x27\x04\x43\x3a\x34\x23\x8b\x67\x51\x71\x39\x92\x48\x20\x31\xde\xb6\xfa\xc3\xa1\x68\x28\x0d\x02\x04\x50\x92\xd5\x40\x00\x82\x56\xbb\x57\x2b\x5a\xcf\x63\x9c\xbd\x25\x30\x4c\x81\xde\x6d\x61\x4e\x23\xf7\x43\x52\xba\xdf\x97\xf5\x28\xd9\x8f\x82\x00\xdb\xc3\xd3\x12\x01\x02\x28\xd9\x6a\x20\x00\x81\xab\xdd\x74\x15\xcd\xee\x21\xf4\x69\xfd\x29\x19\x3d\x96\x7e\x68\xe8\xe3\x0e\xa0\x81\x67\x6c\x1d\x8a\x25\x5f\x47\xea\x4f\x61\xca\xd2\x23\x40\x00\x25\x5d\x0d\x04\x20\x78\xb5\x3d\x96\xc9\xea\x72\xe6\xc3\x6a\x4a\xf4\xa4\x92\x77\xc1\x96\x93\xbf\x3f\x2f\xac\xab\x04\x29\xb7\x24\xfe\x74\x2f\x6a\x7c\xf9\xee\x4f\xa2\x45\xc9\x57\x03\x01\x08\x60\x8d\x24\xc3\x37\x56\x93\xf5\xf1\x9b\xad\x20\x02\xa9\xb5\xcd\xa0\xef\xf8\x49\x86\x19\xbe\xfc\x7d\x83\x1b\x53\xac\xe1\xc6\x25\x0f\xc8\x10\x20\x80\x92\xb0\x06\x02\x10\xc4\x1a\xaf\xd3\x51\x3f\x66\xef\x87\xaf\x2a\x2d\x84\xfa\x4f\xb9\x88\x43\x29\xa9\x13\x07\x73\xea\x44\xfc\x3b\xcc\xfc\x56\x04\x63\x42\x2c\x10\x20\x80\x92\xb1\x06\x02\x10\xc8\x1a\xe6\x8e\xbc\xca\xe7\xe2\x72\xdd\x7e\x36\x96\x24\xb4\xf7\x94\xa2\xba\xed\x0d\x52\xe7\x66\xdf\xc6\x89\x75\x88\xe0\x27\xbd\xb4\x64\x46\x80\x00\x4a\xca\x1a\x08\x40\x30\x6b\x46\x9a\xf5\x5b\xcf\x04\xf4\xa3\x66\xa9\x1f\xf3\x76\x33\x06\x3d\x9f\xbb\xfe\x46\x3c\xb5\xb3\xb1\xf2\x66\xea\x4a\x9a\x49\x4c\xbd\x0d\x02\x04\x50\x72\xd6\x40\x00\x02\x5a\x8b\x33\x3a\x7b\x51\x23\xe9\xda\xb5\x52\xd5\xc4\xd2\x15\x9c\x0a\xf4\xa9\x57\xf7\x69\x7e\xa9\x04\x85\xe4\x7f\x4c\x5d\xcd\xd4\x05\xcf\x20\x40\x00\x25\x69\x0d\x04\x20\xa8\xb5\x00\x2f\xcb\x3a\x60\x60\xfe\xf1\x4e\x5c\xca\xd1\x2f\xaa\x68\x46\xa3\xa8\x45\x1a\x5e\xa6\x77\x96\xd5\xbd\x0d\x1f\x04\xde\xc6\xc8\x23\x40\x00\x25\x6b\x0d\x04\x20\xb0\xb5\xd7\xaa\x60\xbd\xb4\x18\x17\xc6\xac\x8e\x77\x2c\x70\xab\xec\xdd\x7d\x23\x44\x35\xbb\x1c\xe5\xf4\x55\x3d\xcd\x8a\x42\x53\xcf\x3f\xbb\x43\x94\xb4\x35\x10\x80\xe0\xd6\xdc\xf3\x9d\x45\xb3\x0c\x43\xa9\xe8\x26\xbc\x5e\x85\x93\xfb\xe6\x3c\xca\x7f\xde\x6d\x62\xb6\x67\x60\xcf\x54\xe7\x19\xf6\x42\xfc\xcf\xf7\x0c\x25\x6f\x0d\x04\x20\xc0\xb5\x96\x27\x72\x47\xdc\x8e\x01\x78\xdf\x3f\xb1\xe8\x1e\xca\x6a\x6c\x67\x12\xdd\xe4\xfd\x6a\x24\x10\x7e\x5f\x87\xde\xef\x79\x7f\x9a\x36\x02\x04\x50\x12\xd7\x40\x00\x82\x5c\x6b\xf9\xf9\xdc\x4e\x4e\xd4\x3e\xfb\xa1\x44\x14\xdf\x76\x09\x46\xd5\x4b\xcf\x72\xab\xcc\x86\x65\x52\x82\x2b\x9a\x14\x6f\x12\x15\xfe\xec\x74\x50\x32\xd7\x40\x00\x02\x5d\x0b\x29\x5d\x09\x1f\xe2\xe1\xfb\x90\x22\xf1\xfa\x90\xb9\x4e\xa6\xc5\x7d\x90\x31\x96\x36\xd8\x05\xbd\xf9\x60\xb8\xa8\xd0\xdc\xe7\xcf\xee\x10\x25\x75\x0d\x04\x20\xd8\xb5\xf1\x89\x59\x33\xbe\xef\xa4\x5d\x8d\x8e\x7c\xc1\xd7\xfc\xc8\xee\x3b\x3e\xb2\xa4\x65\xe9\xaa\xff\x49\x48\x6d\xa8\xf2\x2d\x12\xf3\x4f\x0c\x44\xc9\x5d\x03\x01\x08\x78\x2d\xee\x92\xcc\xec\xe4\xf9\xd5\x1b\x2d\x4f\x82\x94\xb9\x2c\xfd\x31\x7d\xe3\x2c\xa5\x62\xe7\x1b\x10\x34\x21\x35\x04\x3a\x42\x67\xa8\x10\x20\x80\x92\xbc\x06\x02\x10\xf4\x1a\xd6\xd3\x2e\xea\x52\x57\xe3\xc9\x67\xeb\x2b\x0a\x3f\x4d\xab\x97\xad\x18\xaf\xdb\xf9\x9a\x99\x34\x76\x18\xfb\x26\x70\xf8\xcb\x4a\x21\x40\x00\x25\x7b\x0d\x04\x20\xf0\x35\x15\x8a\xd9\xa1\x58\xf2\x30\xc3\x4a\xcd\x78\xbe\x62\x5e\x83\x45\x5c\x13\x4d\x27\x97\xed\x98\xbc\x52\xb2\xc8\xe4\xd4\xc8\xed\xf3\x08\x10\x40\x49\x5f\x03\x01\x08\x7e\xed\x65\xd2\x5a\x51\xed\xf2\xaf\xe2\xee\x98\x6c\xf1\x41\xea\x46\x13\xfe\x94\x41\x5e\x76\x2d\x55\xf2\x6f\x19\xbf\xbf\x63\x6d\xef\xb3\x20\x40\x00\x25\x7f\x0d\x04\x20\x00\x36\x6b\xb2\x1c\xb1\x87\x49\xc9\x3e\xf7\x74\x71\x33\xe6\xf6\xd5\x42\xd9\xce\x99\x1d\x2c\x19\xb6\x16\x7d\xf1\x6c\xb6\x9a\x74\x33\x34\x41\x80\x00\x4a\x02\x1b\x08\x40\x10\x6c\x6a\x2c\xf4\x7a\xa5\x86\xe9\xb3\xb6\x9c\x53\xb7\xec\x57\x64\xd8\xf0\xf3\x34\xa2\xb4\xd8\xd4\x2e\xe8\x34\xfc\x26\xe4\x2a\xe2\x96\x46\x80\x00\x4a\x06\x1b\x08\x40\x20\x6c\x4c\x92\x91\x89\x2c\xc6\x98\xd8\x88\xa5\x64\x37\x6e\x1f\x96\x1c\x02\xd6\xc6\xa1\xe6\x3a\x96\x4f\x4a\x07\xfb\x2f\x0b\xec\x9c\x44\x11\x20\x80\x92\xc2\x06\x02\x10\x0c\x1b\x67\xb6\x59\xa0\x4f\x86\x38\x3b\x3f\x86\x9b\x90\xe7\x20\x23\xfe\x90\x4a\x91\x4c\xf5\xaf\x92\xf0\x18\x9b\xcc\x8e\xf3\xd3\x37\xff\xb8\x89\x8a\xc3\x86\xdc\xd0\xc1\xfd\x69\xd0\x93\x1b\x3a\x08\x88\x8d\x92\xc8\x44\x3f\x8a\x26\xa8\x99\xaa\x4c\x56\x42\xb7\xc7\x54\x3b\x54\xd6\x15\xf7\x62\x17\xf6\xcd\x0f\x93\x20\x57\xc8\xd9\xc3\x3f\xcb\x19\x4a\x12\x1b\x08\x40\x50\x6c\xd4\x66\x1a\xb2\xd5\x29\xc9\x6b\x4f\xcd\x2a\x92\x75\xd3\x65\x34\xa2\x9f\x15\xee\x03\xb8\xef\x82\x66\xe5\x1c\x67\x79\xf8\x7b\xfe\xec\x27\x50\xb2\xd8\x40\x00\x02\x63\x7b\x6b\xe3\xae\xc5\x7f\xe5\xc7\x58\xc6\x94\xcb\xd1\x32\x8e\x96\x44\x5e\x0b\xe5\x9a\xe0\xd7\x3a\x15\xfe\xb7\xfd\x02\x97\x2b\xef\xcb\x22\x40\x00\x25\x8d\x0d\x04\x20\x38\x36\x01\x9c\x8c\xef\x5f\xc4\xa6\x07\x81\x9c\x01\x97\xc1\x10\xc9\xfa\xee\x98\x50\x42\xae\xf6\x3d\x6c\x2a\xff\xac\x6e\xdf\x4f\x0d\x7f\xf6\x60\x28\x79\x6c\x20\x00\x01\xb2\x69\x3d\x3c\xa4\xe5\x74\xe4\x4a\xc6\xde\xfa\x15\x7c\xbf\x7f\x43\xfa\x96\x0f\x2b\x00\x04\xdb\x2d\x8f\xb2\x7f\x20\x9a\x00\xbb\xb5\x10\x20\x80\x92\xc8\x06\x02\x10\x24\x9b\xfb\xd4\x48\x0c\xeb\x76\xef\xb5\x30\xd5\xab\x5f\x9d\x4a\x8d\x86\xb5\x97\xc4\x47\x94\x7f\xbb\xc7\xbe\x66\x15\xcf\xb9\xca\x3e\xfa\x67\x6a\x46\xc9\x64\x03\x01\x08\x94\xad\x36\x02\xeb\xc7\x90\xf0\x7e\xd7\xeb\xb6\xef\x97\x3a\x9a\x8d\xd3\xd7\x9d\xdf\x32\xb1\x44\x68\x29\xc6\x3a\x76\x2a\xa5\x5f\x3f\xa7\x81\x00\x01\x94\x54\x36\x10\x80\x60\xd9\x6c\xe4\x2f\xfb\x7e\x8d\x4d\x7a\x0d\xb2\x63\x84\x28\x6e\xf5\xae\xab\x62\x74\x54\x27\xaf\xed\x86\xdc\x53\x03\xd1\xde\x7b\x95\xfd\xd9\x36\xa1\xe4\xb2\x81\x00\x04\xcc\xd6\x39\x5d\x28\xeb\x90\xef\x00\x30\x1e\x18\x62\x54\xc5\xde\xf4\xe5\xb7\x19\x97\xb9\xba\x43\x3d\x70\xa6\xcb\x4e\x54\x49\x8b\xfb\x4f\x70\x40\x49\x66\x03\x01\x08\x9a\x8d\x7d\x29\xa2\x4e\xdd\x4d\xef\xf3\x8d\x7e\xa7\x1d\x1d\x7a\x9e\xba\x51\x0a\xad\x9c\x73\x68\xa9\xf1\xdc\x3d\x9a\xe5\x5f\xf8\xa9\x74\x11\x20\x80\x92\xcd\x06\x02\x10\x38\x5b\xda\x35\x05\x07\xd3\xed\xbc\x62\xde\x60\x92\x2c\xcb\xa3\x8d\x1b\xaa\x04\x03\x85\x16\x77\x3d\xf7\xb1\xde\xb4\x10\x3f\x4a\x64\xe2\x42\x80\x00\x4a\x3a\x1b\x08\x40\xf0\x6c\x17\xaf\x38\xdc\x1e\x5e\x11\x45\x4f\xfb\x41\x1e\x21\xfa\x55\xc5\x1e\xff\xa0\xca\x77\x6e\xa4\xf0\xd1\xa7\xa8\xd5\xf0\xc0\x8f\x68\x77\x11\x20\x80\x92\xcf\x06\x02\x10\x40\xdb\x07\xed\x0f\x97\x4d\x02\xa6\xdb\x53\xaf\x35\xf2\x9a\xfe\x08\xbb\xa1\xbf\x6c\xca\xf8\x8d\x4a\xf6\x9e\x55\xdd\x33\xc4\x77\xbc\xbb\xe6\x08\x10\x40\x49\x68\x03\x01\x08\xa2\x8d\x51\x9a\x60\x10\x7f\xb2\x3b\xf3\x8c\xb2\xe9\x68\x05\x36\xfe\x8f\x17\x5b\x65\xca\xa5\x09\x87\x23\xa4\x5f\x65\x4d\xf6\x5c\x84\xfe\xfc\x36\x51\x32\xda\x40\x00\x02\x69\xb3\x6f\x0d\xce\xc4\xfb\xda\x47\xfb\xda\x8b\xf0\x71\x08\xc6\xc6\xcb\x64\x2c\xf4\x0f\xc3\xc5\x74\x64\x81\xb3\xb9\xf9\xb9\x02\x0d\xbc\x08\x10\x40\x49\x69\x03\x01\x08\xa6\xad\x71\xb3\x2a\x02\xcb\xee\xd0\x95\xaa\x4e\x77\x78\xa5\x63\x0e\x4c\xc1\xd3\x9e\xcb\xb9\x93\xe1\x1a\x1e\xf8\xe3\x36\x86\x03\xf8\x67\xdf\x8a\x92\xd3\x06\x02\x10\x50\xdb\x7e\x58\xbd\x7b\xdb\xba\x50\xaf\x6c\x14\xde\x07\x3a\xfe\x6e\x15\x8c\xb5\x3a\x26\x63\x29\x04\x26\xfe\x68\x7d\x99\x2f\xbb\xae\x29\x02\x04\x50\x92\xda\x40\x00\x82\x6a\x13\x7c\x4e\xd1\x70\xee\xdc\x43\xfd\xb7\x9f\xee\xfe\xe6\x0f\xfc\xc8\x88\xa1\xd4\x4b\x85\xb7\xcc\xbf\x9f\xef\x46\x4a\x10\xb6\x51\xfb\x27\x6c\xa1\x64\xb5\x81\x00\x04\xd6\xd6\x93\xcf\x18\x24\xbc\x25\xaa\x45\x98\xc4\x14\x77\xde\xc0\x29\x3a\xbf\xf3\xce\x96\x5d\x18\x17\xd5\xad\xf7\x05\xf7\x27\xc8\xbb\x70\x11\x20\x80\x92\xd6\x06\x02\x10\x5c\xdb\xc1\x3c\x29\x63\xfd\xa2\xde\x45\xec\x33\x2f\xba\xde\xba\x11\xf7\x88\x57\x52\xb5\xb0\x58\x29\x45\x28\x92\x6c\x62\x31\x89\xee\x10\x22\x40\x00\x25\xaf\x0d\x04\x20\xc0\xb6\x8e\x0c\x2d\x92\x9c\x19\xbf\x58\xc4\x8b\x26\xd9\xfc\xc5\x66\x57\x99\x14\x37\xcf\xd5\x3b\xbd\x7b\x4c\xc9\x07\x71\x1f\x00\xf6\x3f\xd1\x19\x25\xb1\x0d\x04\x20\xc8\x36\x4d\xfc\x8a\x97\x84\x99\xd5\x35\x84\xc5\xd6\xde\x3e\x11\x33\x88\x68\x46\x71\x72\x80\x4b\xc1\xf5\xa8\xf2\xec\x95\xd0\x8c\x07\x7f\x76\xd4\x28\x99\x6d\x20\x00\x81\xb6\xa9\xf8\x1a\x4a\xb0\x88\x64\x78\xd0\x8a\xab\x3a\x4a\xec\x9e\x5d\xac\x65\x1c\x3b\xef\x74\x06\xf3\x09\xa3\xff\x30\x65\x45\xc1\x0f\x65\x04\x08\xa0\xa4\xb6\x81\x00\x04\xdb\xa6\xa8\xfc\xe8\x2e\xd5\x3b\xf9\xb2\xc4\xe1\xb1\x66\xc2\x71\x99\x17\xb5\x4f\x93\x39\xf6\x23\x89\xfc\x1a\xea\x4a\x18\x64\x31\xa6\xb1\x11\x20\x80\x92\xdb\x06\x02\x10\x70\x1b\xef\x52\x6b\x1c\x3b\xa5\xd6\x5d\xa2\x8d\xb7\x03\x8b\x08\x3f\xfd\x95\x6f\x42\x0f\x9f\xb5\xad\xec\xb2\x44\xea\xd0\x55\x15\xa0\x53\x22\x40\x00\x25\xb9\x0d\x04\x20\xe8\xb6\x43\x36\x8c\x5b\x8c\x03\xef\xba\x5e\xa9\xf3\xac\x63\xc7\x69\xe3\xce\xe9\x24\x16\x85\x36\x9e\xe7\x59\xa7\xbb\x6c\x42\x6d\x45\x6d\x86\x00\x01\x94\xec\x36\x10\x80\xc0\xdb\x6e\xee\x54\xe1\x5b\xa9\xe7\xbe\x26\xed\x8d\x20\x98\xbd\x10\x4f\x5b\xf3\xf2\xd7\xe2\x86\xe1\x7d\x5a\xf1\xb7\x3d\x3e\xcd\x24\xb2\xfa\x08\x10\x40\x49\x6f\x03\x01\x08\xbe\x0d\x51\x7d\x57\xa5\xf1\x83\x88\xe2\xcc\xdb\xc0\x5e\x40\x9b\x3d\xee\xf2\xe8\xd5\xdb\xbf\xd3\x75\xe4\xd4\x53\x38\xf0\xfa\x92\x18\xac\x10\x20\x80\x92\xdf\x06\x02\x10\x80\xdb\xee\xce\x1c\x6b\x5f\x52\xed\xb5\xc1\xbe\x33\xcb\xb7\xa5\x2e\x94\x97\x1e\xb8\xdc\xcf\xb9\x6c\x7d\x28\x13\x41\x2e\x5d\xce\xc3\xc1\x80\x00\x01\x94\x04\x37\x10\x80\x20\xdc\xd4\xee\xbd\x52\xde\x9d\x30\x0b\x90\x93\x9f\x6d\xcf\xb8\x95\xde\x76\xe5\xc7\x27\xbb\x1c\xb7\x87\x3f\xec\x92\x1f\xe0\xe1\x08\x58\x5e\x43\x80\x00\x4a\x86\x1b\x08\x40\x20\x6e\xef\x84\x18\xc8\x4d\x93\xe9\x3d\x07\xaf\x06\x19\x0d\x77\xc5\xd8\x7e\xb2\xad\x78\x9f\x8a\x3d\x5d\x21\x49\x20\xa5\x52\xe2\xdf\xf0\x08\x01\x02\x28\x29\x6e\x20\x00\xc1\xb8\xf9\xf2\x1a\x2e\x87\xed\x52\xe9\xeb\x67\xaf\xcb\xe9\xc9\x81\x15\xd5\x8b\x65\x5b\x93\x4e\x6c\xf7\x77\x3f\x53\x15\x2b\xe9\xc9\xfe\x49\x21\xa8\x38\x6e\xc8\x0d\x1d\xdc\x1f\x70\x3f\xb9\xa1\x83\x80\xdc\xec\xc5\x52\x9f\x6c\x31\xf4\xf1\x27\x5a\x7c\x10\xe7\x59\x78\x51\x20\xf1\x6d\x22\xe4\xd6\xef\x2f\xc1\x3d\x98\x4c\xa1\x17\x06\x2a\xff\xec\x4d\x51\x92\xdc\x40\x00\x82\x72\x1b\xd9\xcc\x1c\x93\x7b\xa0\x6b\xe5\xee\xf0\xb9\x73\xc1\xbf\xeb\xc6\x63\xd9\xc2\xe7\x4d\xfa\x36\x60\xce\x79\x26\x87\xd7\x18\x8f\xee\x21\x40\x00\x25\xcb\x0d\x04\x20\x30\xb7\x5b\x5c\x6b\xe3\x1e\x89\x40\xda\x5d\x76\xb4\xb5\xd0\x88\xa8\x11\x0b\x19\xd5\xb1\x51\xd1\x44\xc4\xea\xbd\x35\x9f\xf9\xf7\x35\x76\x08\x10\x40\x49\x73\x03\x01\x08\xce\x8d\x29\xd5\x55\xf9\x77\x32\x55\xaa\xbb\x01\x70\x75\xdf\x61\xcc\x54\xf5\x32\x0f\xc3\x25\xa3\xaa\xb6\xbe\xbe\x95\xe1\x19\x0e\x90\x1a\x01\x02\x28\x79\x6e\x20\x00\x01\xba\x69\x51\x10\xa1\x13\xca\xa7\xa5\xbd\x23\x39\x4c\x21\x4b\x7b\x3c\x84\xe9\xc1\x92\xb6\x6b\xd7\x3b\xb4\x3e\x1c\x81\xf3\x6c\x02\xfb\xcf\x26\x18\x25\xd1\x0d\x04\x20\x48\xb7\x34\x12\x93\x67\x12\xad\x86\x45\x80\x74\xf6\x99\xf2\x62\x9d\xac\xed\xc9\xe9\xa9\x44\xb4\x9d\x2f\x3d\x36\x52\x2a\xf5\x14\x61\x7f\x56\x20\x94\x4c\x37\x10\x80\x40\xdd\xe8\x79\x75\x5b\x6a\x54\xec\x46\xf0\x84\x6b\x33\xcf\x30\xd6\x78\xd1\xaf\xec\x26\x60\xdd\x8b\x55\x56\x2b\x73\x75\xce\x1f\x3b\xf3\x67\x0b\x80\x92\xea\x06\x02\x10\xac\x1b\x07\xde\x16\x87\x82\x89\x53\xe5\x65\xc6\x98\xa2\xf5\x6f\xb7\x2d\xd3\x37\x04\x9e\x27\xb9\x7d\xf3\x69\xab\x5c\xa7\xc6\x48\xdb\xc1\x43\x80\x00\x4a\xae\x1b\x08\x40\xc0\x6e\xef\x2e\xf7\xce\x94\x5a\x7d\x29\x24\x54\x90\xae\xe9\xf9\xd0\xa9\xc7\xf4\x1c\xfb\xfe\x54\x0f\x28\xe3\x74\x2b\xa2\x3f\x34\xfe\x9a\x24\x02\x04\x50\x92\xdd\x40\x00\x82\x76\xab\x97\x2c\x97\x24\x8a\xbc\xab\xeb\x82\x6e\x4a\xf6\xcc\xb7\x9b\x8e\x92\xed\x53\x85\x37\xf5\xe5\xf6\x0d\xb9\x49\x9f\xb9\x9a\xb9\x3f\x9b\x60\x94\x6c\x37\x10\x80\xc0\xdd\xc2\xef\xd9\x52\x1c\x81\xd1\x6f\xf7\x3d\x2f\x93\x52\xf3\x49\xad\x31\x4c\xb2\xc7\xb2\xc8\xb4\xbe\xc3\xa5\x0a\xa2\x21\x6c\xd1\x17\x40\x80\x00\x4a\xba\x1b\x08\x40\xf0\x6e\xd7\xbe\x64\xb7\x3c\x47\xaf\x75\xcf\x0b\x59\xd0\xc1\xb9\xaa\xa0\xa3\x7e\x53\xd8\xb0\x28\x90\xeb\xd6\x70\x2d\xf3\xab\x61\xa2\xb7\x7f\x72\x23\x4a\xbe\x1b\x08\x40\x00\x6f\xaf\xcf\x32\x36\xe8\xea\xca\x11\x04\x09\x17\x9a\xab\xee\xb5\x76\x71\xc8\x35\xbd\xe2\xbe\x5d\x12\x44\x62\x33\x7f\x39\xb5\x29\x18\x07\x01\x02\x28\x09\x6f\x20\x00\x41\xbc\x3d\x4a\xed\x74\xd1\x5b\x9e\x9a\xf7\xb8\x46\x9c\x6e\x60\xc4\x52\xf5\x65\x84\xcb\xd6\x29\x6f\x30\xf8\xc7\xba\xf9\x9d\xf3\x13\x6c\x7f\xe6\x79\x94\x8c\x37\x10\x80\x40\xde\x76\x63\x7e\x7c\xd4\x10\x35\x6c\xf0\x35\x15\x21\xa2\xc3\xbc\x5e\x5c\x9f\xeb\x15\xfa\xe1\xbd\x3f\xbf\xf6\xba\x4b\xcd\x1a\x7b\x9f\x0e\x02\x04\x50\x52\xde\x40\x00\x82\x79\x1b\x9f\x09\x64\xb5\x4d\x7e\xf8\x85\x35\x2e\x2b\x2c\xb1\x83\x56\x7e\x90\xf8\x5c\x43\xf2\xfb\xfe\xf3\x32\x0a\x07\x54\x91\xd5\x6f\x85\x10\x20\x80\x92\xf3\x06\x02\x10\xd0\x5b\x78\xf9\x3b\x89\xb5\x06\x4a\xb7\x14\xf1\x40\x22\xce\x6f\xe4\xbb\xd9\xf4\xb8\xa5\x84\x60\x0f\xd6\x2c\x37\xd0\x78\x15\x7d\xec\xcf\x1e\x0c\x25\xe9\x0d\x04\x20\xa8\xb7\x03\xbe\x77\xe4\x93\xac\xe2\x51\x65\x16\xcf\x69\x0a\x22\x4c\x1d\x41\xd6\x05\xc6\xf6\x4c\xa6\xe6\xc7\x0c\xba\xdc\xbc\x12\x67\x69\x11\x20\x80\x92\xf5\x06\x02\x10\xd8\xdb\x77\x44\xce\x4e\xb6\xeb\x5d\xe1\xdd\x26\xbc\x36\x2e\x92\xde\x2e\xdb\xaf\xd6\xc1\x6f\x9f\x6a\x66\xd6\x71\x2b\x3a\xf3\xcc\x44\xde\x46\x80\x00\x4a\xda\x1b\x08\x40\x70\x6f\x02\x19\x14\xfa\x31\xdb\x69\xf4\xdf\x13\x65\x84\x62\x43\x11\xd8\x84\x7b\xf3\xe8\xf1\x6f\x25\xf1\xea\xf7\xc3\xf2\x78\x76\xb1\xff\x04\x07\x94\xbc\x37\x10\x80\x00\xdf\x2e\x99\x1e\xa9\xff\x74\x6e\x58\x0c\x5a\x34\xef\x13\x5b\x27\x73\xf4\x2b\xbc\x6b\x47\x28\xa3\xad\x9c\x58\xbd\x4f\x75\x6e\x2d\xf6\xcf\x0f\x1d\x25\xf1\x0d\x04\x20\xc8\xb7\x83\xbe\x59\x15\x3c\x2c\x4d\x66\xc5\x37\x1a\x12\x4f\x4c\x8a\xa5\xb7\x9f\xf1\x5c\xd4\x23\x5b\x0d\x48\x2c\x79\x8e\xc7\xee\xad\x2a\x85\x00\x01\x94\xcc\x37\x10\x80\x40\xdf\x52\xb0\x7a\x9c\xf8\xa5\xbe\xae\x75\x6a\x1c\x5d\x6d\x28\xb9\x7d\x59\x55\x43\x11\x7c\xaf\x71\x45\xf2\xdb\xc7\x9d\xf0\xb9\x16\xbc\x3f\x99\x12\x25\xf5\x0d\x04\x20\xd8\x37\x87\xa7\xcf\x9f\x29\xa6\xed\x68\xec\xbc\x4b\x8b\x1d\xba\x59\x56\x2a\x16\x4b\x7a\xc3\x78\xff\xc7\x87\x8c\x0a\x63\x76\x4e\x8c\xf3\x7f\x8a\xa1\xe4\xbe\x81\x00\x04\xfc\x16\xff\xbd\xf4\x37\xa3\xa6\xb9\x85\xab\xf7\x99\xb9\x89\x2d\xbb\xa3\xbd\x07\xd1\x8b\xb7\xeb\xe2\x14\x45\xf5\xc6\x82\x5f\x91\x1e\xa8\x23\x40\x00\x25\xf9\x0d\x04\x20\xe8\x37\x49\xc1\xf0\xda\x6c\x11\xb2\xb2\xcd\xba\xe7\x99\x3a\x36\x40\xe6\x2f\x9b\xb7\x85\x33\x77\x49\x65\x36\xd9\xdb\x3a\x89\x4c\x70\xff\xcc\x1a\x28\xd9\x6f\x20\x00\x81\xbf\x51\xcf\x45\x55\x37\xa6\xd8\x7b\xb3\xed\x1e\x7a\xae\xcd\xd6\xed\x58\x8f\xbc\xf3\x1a\x8c\x0e\x64\x1f\x36\x21\x27\xcc\x3c\x2a\xba\x8e\x00\x01\x94\xf4\x37\x10\x80\xe0\xdf\xb6\x6d\x87\x62\xe8\x8d\xbc\xac\x1f\x87\x14\x36\x11\xe3\x07\x30\xf9\x1e\x31\xdd\xb5\x9f\x38\x9c\xba\x33\xcb\x14\x67\xa1\x95\xa5\x88\x00\x01\x94\xfc\x37\x10\x80\x00\xe0\xde\xd9\x0f\x9d\xed\xfd\x1c\xb1\xf7\xf0\x7d\x79\xbd\x38\xfd\x9d\x12\xbd\x5f\x6e\x56\x68\x9d\x31\x84\x08\x07\xf4\xf9\xde\x4b\x44\x06\x08\x10\x40\x49\x80\x03\x01\x08\x02\x2e\x7c\x4f\xd1\xd3\x6e\x7d\x3f\x68\x4c\xd6\x4c\xf3\xf1\x05\x6e\x33\xf4\x67\xf9\xa4\x29\xc2\x22\x99\x39\x0f\x3a\x05\x79\xd3\x69\xfe\x64\x4a\x94\x0c\x38\x10\x80\x40\xe0\x5e\x91\x95\x28\xd6\x4f\xf0\x4f\x24\x19\x35\x5b\x4e\x97\x8a\xdc\x79\x6a\x93\x22\xb6\xba\xf4\x4d\x4f\xde\x52\x7f\x8c\x2a\x21\x9f\x19\x01\x02\x28\x29\x70\x20\x00\xc1\xc0\x75\xe0\x75\xb1\x0c\x3c\x48\x62\x36\x71\xf1\xa4\xf4\xf1\xc8\xcb\x2c\x79\x8a\xad\xfd\x9c\xe6\xa2\xc3\x4d\x3a\xd7\xb7\x1d\x5a\x5d\x32\x08\x10\x40\xc5\x81\x43\x6e\xe8\x8c\xd4\xfa\x93\xd9\x08\x8d\x3f\x39\xb8\x39\x34\x10\x12\xbe\x2f\xf1\x94\x94\x64\xbe\xe8\xda\xcd\x49\xb9\xfb\x98\xd0\x65\x4a\xca\xed\xe4\x86\x0e\x02\x82\x23\xba\xa4\x48\xf7\xbe\x30\xa5\x0c\xcf\xe3\x6a\x37\xc3\x4f\x2c\xd1\x8e\xba\x97\x54\x38\xd4\xc5\x5d\xe1\x09\x03\x44\x5c\xba\x5d\x4a\x08\x10\x40\x49\x82\x03\x01\x08\x0a\xee\xb7\x9e\x6b\x59\xb3\xa4\x81\x45\x91\x3a\x7f\xf3\x4c\xcc\xa4\x7b\x92\xd6\xa5\x9d\xe8\xc4\x16\xce\x8b\xd7\xb4\x18\xda\xb7\x84\xfe\x6c\x4e\x50\xb2\xe0\x40\x00\x02\x83\x73\x37\x0e\x40\xab\x7a\x7f\xd6\xee\xe1\xaa\x6c\x24\xf1\x37\x05\x1d\x3b\xc4\xa5\x67\xd2\xce\x17\xce\x07\x0f\x53\xe7\x59\xf3\x62\xfe\xd9\x35\xa3\xa4\xc1\x81\x00\x04\x07\xf7\xa9\x47\xc9\x29\xa5\x59\x22\x53\xdd\xb6\x51\xc1\x25\xd0\x54\x79\x4c\x80\xa1\x77\x70\xef\x53\x7f\x59\x5f\xc7\x10\x43\x74\x83\x1a\x02\x04\x50\xf2\xe0\x40\x00\x02\x84\x1b\xad\x75\x5a\xee\x09\x1f\x20\x7d\xa1\x50\xdd\xaf\x79\xb4\x22\x2c\xe2\x54\x4a\xa8\xe0\x4a\x03\x72\xf2\x1d\x88\x64\x8b\x9f\xff\x13\x42\x51\x12\xe1\x40\x00\x82\x84\x23\xd9\xef\x69\xdb\x6f\xe4\xce\x19\xbb\x49\x1c\x7d\x93\x4e\xc4\xca\xce\xf9\xc5\xd7\xee\x74\x3e\xf1\x34\x5f\x23\x53\xe1\x00\xec\x3f\xab\x36\x4a\x26\x1c\x08\x40\xa0\x70\x3a\x0e\x3f\x64\x9c\x97\x04\x74\x18\x8c\x04\xee\x89\xa2\xab\xde\xcf\x8a\xa2\x72\x16\x19\xba\x77\x86\x03\x93\xd5\x6e\xe3\xf9\x03\x2c\x04\x08\xa0\xa4\xc2\x81\x00\x04\x0b\x37\xbe\xf0\xd3\x93\x21\xe5\xf5\x33\x61\xdd\x81\x0b\xd7\x7c\x81\x59\xf6\xdb\xce\xf3\xdb\x18\xdb\xf3\x95\x26\xb7\x76\x04\x64\x8e\xe4\x11\x20\x80\x92\x0b\x07\x02\x10\x30\x9c\xe3\xd7\x97\x31\x1a\x9d\x8c\xd7\x95\x3b\x95\x25\x17\xbe\x4a\x6b\xac\xe3\x79\xad\x1d\x08\x8c\xda\xf1\x44\xbd\xaa\xd3\xf0\x63\xa2\x43\x80\x00\x4a\x32\x1c\x08\x40\xd0\x70\x2f\x10\x94\x35\xe7\x5a\xd3\x96\xdd\x2f\x84\x88\x50\x51\x1e\x86\x58\x5e\xea\xea\xbf\xda\x10\x5f\x61\x6e\x2c\x99\x36\x20\xf1\x9d\x0a\x01\x02\x28\xd9\x70\x20\x00\x81\xc3\x75\x63\xa4\x6e\x0a\xe6\x3c\xc5\x08\xf3\xc7\xd2\xba\xae\xf9\x31\x35\x5f\xc6\x8d\xa6\x3d\x71\x27\xc2\x5b\xf8\x6b\x90\x83\x92\xe6\x9f\xac\x8d\x92\x0e\x07\x02\x10\x3c\x5c\x81\x73\xb3\xb8\x42\x23\xce\x19\xfb\x48\x5d\xdf\xec\xde\x74\x3c\x1e\x75\x52\x12\x70\xe6\xe3\xf6\xc0\xd4\x6a\x9e\xed\xdc\x28\x01\x02\x04\x50\xf2\xe1\x40\x00\x02\x88\x7b\xe8\x72\xe7\x91\x94\x8b\x5d\x00\x77\x2e\x5b\xb0\x08\xe1\x8c\xfb\xb5\xd8\x80\xc9\x94\x8a\xf7\xa4\x40\x9c\xe0\xf3\x11\x42\x33\x0a\x04\x08\xa0\x24\xc4\x81\x00\x04\x11\xa7\x6b\xda\x06\xa2\xd9\x84\xb8\xf7\xbe\xc6\x02\xbc\xf0\xfb\x59\xd9\x28\xa2\xa7\x39\xd6\x30\x24\x49\x5b\x3f\xee\x8e\x7a\xef\xde\x44\x80\x00\x4a\x46\x1c\x08\x40\x20\x71\xfa\xd4\x83\x29\x1f\x1c\x8b\xd5\x30\x73\x73\xaa\x73\xdf\x51\x11\x9e\x53\x7b\x74\x36\x3c\x3b\xef\x95\xfa\x2c\x8d\x72\xf4\xbb\xab\x7f\xa6\x66\x94\x94\x38\x10\x80\x60\xe2\xae\xa7\xf7\xe3\xab\x27\x74\xfb\x36\xe9\x51\xb6\x17\x3e\xd5\x7c\x43\xcf\x9c\x4b\x2c\xc3\x29\x6e\x67\xfe\x36\x02\xcd\x42\x49\x9e\x05\x01\x02\x28\x39\x71\x20\x00\x01\xc5\xb1\x33\x88\xc4\x4a\x4a\x5d\x6b\x55\x3d\x33\xfe\xf4\x67\x7d\xd3\xa0\x1a\x49\x0a\xe1\x9b\xbb\xbd\xfb\x34\xcc\x82\x09\xcd\x39\x59\x7f\xf6\x60\x28\x49\x71\x20\x00\x41\xc5\x2d\x54\x1a\xe6\x39\xea\x92\xbf\x74\x4c\xf8\xf6\x2a\x6f\xf5\xc1\xd3\x3d\x41\x37\x09\x73\xde\xe8\xed\x37\x14\xb1\x06\x04\xe4\x3b\xb7\x10\x20\x80\x92\x15\x07\x02\x10\x58\x1c\x02\x63\x67\x5a\xa0\x7f\x19\x83\x87\x6a\xb7\xb3\xa2\x0c\xff\x88\x3c\x36\xb9\x7d\x69\xc3\x39\x70\x95\x1c\xbb\x22\xc8\x23\xf8\xcf\x97\x16\x25\x2d\x0e\x04\x20\xb8\x38\x74\x2b\xb1\x8a\x24\x5d\xfc\xcc\x2f\x43\x52\x75\x1c\xd8\xe6\x6c\x17\x00\xab\x3b\xba\xb1\xbb\xaf\xa8\x94\xf3\x25\x3f\x90\xec\xea\x22\x40\x00\x25\x2f\x0e\x04\x20\xc0\xb8\x81\xb0\x94\xde\x0f\x7a\x97\x1f\x9b\xf6\xb6\xbe\x8d\xd7\x35\xaa\x54\x56\x67\x77\x3f\xdb\xee\x9b\x37\x69\xdd\x37\x73\xe1\x20\x47\x0f\x01\x02\x28\x89\x71\x20\x00\x41\xc6\xad\xc9\x46\x7f\x0d\x08\xd0\xf5\x1b\xd8\x74\xbe\xcd\x1d\xe1\x7c\x61\xec\xcb\xc5\xd6\xaf\xbe\xfd\x92\xf6\xf8\x51\xcc\x57\x62\x1a\xd9\x11\x20\x80\x92\x19\x07\x02\x10\x68\x5c\xc6\xe7\x7b\x39\xc2\xf2\xde\xa9\xd5\xf3\x68\x54\x87\x81\x7c\x35\x38\xd6\x17\x9b\x31\x72\x5e\x2c\xb1\x9c\x67\x42\x77\xb7\x7e\xab\x8d\x00\x01\x94\xd4\x38\x10\x80\x60\xe3\xd8\x27\x93\x77\x77\x6e\xee\x5a\xd6\x73\x84\x8c\x75\xdf\x33\x54\x93\x7c\x77\x19\x34\x0c\xfd\x7a\x31\x39\x67\x59\x27\xd7\xd6\x9c\x09\x01\x02\x28\xb9\x71\x20\x00\x01\xc7\xf5\x5b\x9c\xd5\x6c\xb5\x17\xac\x5e\x14\x61\xfd\xfe\x32\xf1\xc6\xc7\xab\x96\x51\x1c\xb5\x7b\xf1\xcd\x3f\xfd\x69\x49\x46\x65\xf2\x6c\x11\x20\x80\x92\x1c\x07\x02\x10\x74\xdc\x40\xb6\x75\xe1\xcf\x82\x33\x8f\xf1\x1e\x5b\xf7\x5e\x8b\xfe\xae\x33\x7d\x66\x28\x8c\xcb\xf9\xcb\xb3\xdb\x0f\xf3\x5d\xae\x2a\x8b\xdb\x20\x40\x00\x25\x3b\x0e\x04\x20\xf0\x38\xd0\x0c\xdc\x11\xd1\xae\x57\x29\x5c\x3b\x27\xe9\xa3\x6d\x5a\xd6\xe9\xfa\x4c\x29\xd3\x49\x30\xd7\x34\xa9\xca\x40\x8f\xd6\xeb\x0a\x02\x04\x50\xd2\xe3\x40\x00\x82\x8f\x33\xd7\x71\x8c\x65\xd0\xea\x5b\x5d\xdf\xb6\xd7\x1b\xde\x37\xb9\x3d\xac\x26\x65\x14\x17\xe0\xa2\xf1\x10\xcb\xc6\x85\xd4\x58\xc6\x0a\x01\x02\x28\xf9\x71\x20\x00\x01\xc8\xf5\xb7\x12\x57\xc6\x7d\x0e\xa9\x7c\x21\xd8\x24\x71\x97\x55\x20\x86\xaf\x59\xd0\x62\x99\x3c\x04\x63\x69\xc6\x76\x8c\xd3\xc5\x14\x0d\x01\x02\x28\x09\x72\x20\x00\x41\xc8\x55\x25\x1a\xd7\xe0\x77\xfe\xea\x19\x7f\x74\xe6\x26\x8e\x89\x4c\xd0\x72\x8b\x4a\x43\x71\xc2\xc2\x05\x07\xd2\x81\x12\xc5\x50\x4e\x43\x04\x08\xa0\x64\xc8\x81\x00\x04\x22\x77\x3d\xaf\xb2\x7c\x4e\xec\x70\xd3\x5a\xdb\x39\x8c\xb5\x6d\xa6\x64\xda\xea\x85\x54\xfe\x83\x2b\x4e\xd3\x36\x55\x6e\xe7\x63\x89\x1f\x20\x40\x00\x25\x45\x0e\x04\x20\x18\xb9\x92\x14\x21\x29\x0b\xd3\x4a\xcd\xea\xbc\xd6\xb6\x0c\xae\x16\x4c\x47\x63\x5a\x25\x71\x29\x15\xca\xfe\x9a\x23\x4c\x0c\x6c\xd9\x3f\xb3\x06\x2a\x8e\xdc\x07\x92\xff\xbb\xa1\x4b\x5b\x2a\xe1\xcd\xcf\x7d\xf1\x3e\xc8\x31\x11\x7d\x4c\xd4\xe7\x79\x9e\x7e\x4d\x47\xc4\xbb\x31\x2c\x5a\xc5\xc8\xe6\x2a\x41\xe6\x2b\x88\x58\xee\x41\x56\x3d\x66\xb4\xff\xab\x56\x39\x9a\x72\x1f\x89\x62\x21\xe4\xa0\xd4\x4a\x90\x0d\xdd\x54\x1e\x0e\x48\x4f\xfa\x71\xff\xe1\x3a\xb9\xb3\xfc\xcd\x17\xcf\x4d\xae\x9d\x90\x7a\x3d\xa6\xfb\xd5\x2f\x4f\xec\x74\x6b\x5f\xde\xfe\x93\xee\x4f\x9e\xc9\xa9\x70\xac\xbb\x77\x6d\x24\x0a\xc4\x44\xe2\xd2\xdc\x52\x79\x4f\x48\xad\x4b\xd0\x44\xb9\xdb\xf1\x74\x0a\xd8\x15\xac\x14\x3a\x3a\x45\xf9\x9e\xc5\x89\xf0\xd9\xe6\x4d\x9c\xfb\xfd\xd8\x55\x55\xf8\xe6\xfd\x13\xd2\x2c\xe6\xc4\x9f\x66\x87\x12\xb6\x7d\x19\xf7\xb8\x32\x9e\x99\x3a\xcb\x84\xc6\x4d\x2d\x07\x19\x56\x92\x64\xa8\xef\x45\x7d\xf5\x17\x38\x21\x95\x8e\x5b\xab\xc1\xe9\x53\x5f\x5e\x54\x51\xdd\xba\xbd\x7a\x48\xeb\x15\x69\xf0\x71\x33\x35\x95\xc7\xf0\xf5\xcc\xf5\x40\x1d\xee\x94\x13\x52\x1f\xc3\x2b\x9d\x81\x6e\x83\x57\xc8\xb3\x52\xef\xad\xce\x32\x54\x97\x5d\x9b\xb0\xa3\x78\xb5\xff\xc1\xb5\xe7\x52\x6f\x44\xd8\x7a\xd8\x09\xe9\xcb\x1e\x86\x60\xca\x23\x09\xaf\x28\x5a\xee\x5b\x54\xe2\x6f\x43\x5d\xbf\xbd\xbe\x73\x79\x39\xfd\xc6\x99\xf3\xb5\xb2\x5f\x19\xc8\x9d\x4f\x48\x4b\xb9\x19\x10\x56\x59\x34\x34\xd8\x03\x3a\xba\xef\x2f\xa2\xb1\x61\x37\x9e\x35\x61\x2b\xdf\xd6\xf0\x95\x29\xc7\x3c\xc4\x16\x55\x39\x21\xf5\xb8\x18\x1e\x67\x21\x35\x41\xb1\x4e\xe9\x51\xb6\xf9\xc4\x2a\xb2\xaa\xa9\x54\x9b\x62\x58\x93\xac\x8b\xc1\x9b\x59\x48\xed\x27\xfd\x09\xe9\x24\x9d\xfe\x67\x31\x2c\xb2\x1b\xe1\xb9\x1b\xfa\x9c\x98\x3f\xe3\x1f\x05\x6a\xe7\x5f\xb2\x3f\xe2\xbe\x7b\x77\x97\x2b\xc9\x92\x96\xe2\x84\xb4\x31\xe9\xe7\xa7\x7d\xd9\x3a\x2e\xf7\x84\xf5\xb3\x2f\xc4\x65\x7d\xa9\x33\xbb\x1d\x5f\x09\x0e\x15\xed\xba\xf4\xd1\xf2\x3e\x18\x88\x3f\x21\xad\xbc\x9f\xb4\x6d\x32\x60\x1a\x39\xf7\xab\x1c\x33\x47\xb9\xe9\x15\x8e\x51\xd2\x46\xb4\xb3\xa8\xa7\x96\xb8\x3e\x20\x63\xe1\xfb\xe8\x84\x94\xc1\xa6\xb2\x5e\xdc\x51\x45\xfd\x8c\x08\x87\xfd\xe5\x9e\x82\xb4\x9d\xa8\x9a\xfc\x85\x32\x47\xd6\x6f\x77\xc5\x1b\x36\xf9\x7a\x05\x4f\x48\xb1\x77\xed\xbb\x96\xf7\xe4\xa2\x74\xba\xaa\x2a\xc5\x8a\x75\x42\x33\x87\x1f\x55\x8e\x0a\x78\x7b\x44\x29\xd2\x3a\x94\xf5\x08\x5f\x39\x21\x2d\x5f\x1a\x7e\xdd\x0f\xfa\x54\xa8\x63\x2f\xe9\x7c\x09\xbb\xd6\xd9\xe7\xc3\x8c\xc7\xa7\x6e\xbf\x43\x97\x6a\x50\x52\xcc\x9f\xd6\x78\x42\xda\x3a\xa3\x5d\xc5\x3b\xc8\x69\xf3\x9a\x06\x21\xfe\x54\x01\x4b\x10\x8b\x2a\x05\xf3\x26\x78\xb6\xbd\x3f\x9f\x45\x02\xb7\x59\xfb\xe8\x84\x94\xaf\x46\x40\xac\x45\xb4\xd6\x57\x98\x5b\xab\xcd\x52\x2c\x99\xee\x83\x9c\x21\x27\xed\x07\x71\x89\x68\xcf\xc2\x22\xf5\xc6\xd2\xe7\x27\x1b\x40\x6c\x4e\xd6\x78\x1f\xbd\xdc\x91\x0c\x4a\x33\xe3\xab\x1b\x69\xcc\x38\xe0\xd3\x78\xee\xf8\xf9\x62\x61\x45\xed\x4d\xce\x5b\x8c\x27\xa4\x44\x36\xe2\x39\xcc\x2d\xb3\xf3\x46\x76\x47\xa1\xc4\xa5\x99\x84\x75\x79\x31\x7d\xef\xc5\x45\x4c\xee\xc9\x5a\x17\xfb\xf8\x6f\x9e\x1c\x01\x31\xec\xd2\x54\x4b\x76\xa2\xdd\xea\xdc\xaa\x95\x91\x27\x49\x15\x8c\xed\xaa\x2f\x70\x33\x3c\x86\x9c\x71\x02\x58\x0b\xf6\xc3\xbf\x9c\x90\xb6\xe9\x75\x7e\xa2\x78\x9d\x63\xe2\x30\xee\x7b\x10\x3f\x2f\x2e\xff\x05\xbb\x92\x9b\xb2\xf6\x60\x5e\xd3\xfb\x40\x6c\xc4\xb3\x6b\xf5\x84\xf4\x72\xd6\x39\xba\x98\x1e\x79\x2c\x0e\x19\xf3\x5f\x7c\x96\xeb\xf4\x01\x11\x6b\xa6\xdd\xa5\xd6\xf6\x32\xd7\x85\xe7\x0f\x5a\x7d\x66\x4f\xfe\x0c\x35\x37\x95\x10\x26\xcf\x8d\x7d\xf3\xaf\x61\x5e\x18\xf9\xcd\xb2\x9f\x7d\x73\x24\xf9\x77\xd7\x4f\x65\x37\x3e\x2c\xc1\x1d\xec\x9e\x13\xd2\x2e\xfb\xfa\xb1\x4e\x39\xe0\x50\xfb\x16\x7e\x93\x0c\x93\x80\x4c\x97\xb7\x48\xb1\x82\x5e\x20\x75\x60\xd9\x43\x8d\xc6\x6b\xff\xd1\x40\x29\x2d\xb7\x61\xa3\x73\xda\x12\x89\x4c\x5f\xe0\x03\x27\x34\xa7\x0d\x2b\x62\xdd\x0c\xa9\x57\xc1\x11\x44\x31\xa4\x2f\x41\x2d\xaf\x13\xd2\x8f\xb5\x2c\xee\xe5\xfa\x8d\x99\x05\x3a\x49\x39\x78\x76\x67\x3f\xcc\xc5\x9e\xe1\x70\xf5\x29\x25\x4d\x48\x4e\xd7\x19\xee\x08\x61\x39\x21\x0d\x10\xbd\x3c\x29\x9f\x54\xc8\xfb\x22\x3e\xde\x69\xff\xbb\xee\x77\x66\xd6\x47\xbc\x2d\xc3\x61\x31\x37\xcb\x1e\x37\x0f\x19\x3a\x50\x9d\x90\x26\x2b\xa8\x53\x7d\xc0\x7a\xdb\xca\xa1\xa1\xf1\xfe\x05\x1f\xdb\xb2\xdf\x60\xe7\x44\x8c\x35\x71\x2e\x6e\x09\x0e\x91\xf9\xa0\xf8\x9b\x13\xd2\x4f\x62\x12\x0e\x7e\x11\x2e\xe5\xbf\x63\x1f\xde\x8b\x27\x35\x2e\x1d\xb9\xe3\x1e\x75\xef\x40\xe8\xfb\x99\x98\x91\xae\x18\xad\xbd\x93\x83\x95\x4a\xa0\x8a\xfd\xf9\xe7\x17\x62\xde\x27\x1e\xa9\x72\x53\x8e\x4d\x32\xa2\x79\x3e\xda\x83\x22\xc3\x41\x9f\xbc\x6e\x24\xbd\x7b\xf2\xfb\x84\x54\xde\xe7\x2e\xcf\xfd\x5f\xc6\xed\x9f\xa4\x78\x0b\x46\x39\x7f\x58\x30\xbb\xcd\x7f\x54\xb4\xdc\x9e\x8c\xaf\xe8\xd6\xff\xe4\x93\x19\x7e\x42\xda\x92\x6b\x79\x49\xe1\x08\xf3\xb6\xfc\x1d\x1c\xbb\xc0\xda\xbd\xec\x5a\x67\xb6\x3b\xc9\x37\xfc\xc8\x94\x7f\x8d\x3d\x5c\x30\xe8\x1d\x3d\x21\xf5\x23\xcd\x74\xfc\xd8\x6b\xed\x7a\xc4\x83\x35\x91\xa6\x13\xca\xfc\x6c\xfb\xa6\x5b\x16\xbd\xda\xab\x68\xfa\x44\x82\x1e\xd6\xe5\x93\x23\xb0\x55\xfd\xd5\xe3\xcd\x4c\x7f\xb3\xf1\xc3\x6c\x34\x5c\x1b\xa3\xd8\x3b\x5d\x38\x34\x91\x4d\x03\x72\x4e\xb9\x55\xf2\x4c\xdb\x8b\xf7\x4e\x48\xf1\xb1\x49\x43\x68\x02\x6c\x99\x95\xdb\xa8\xb7\xde\xa2\x67\xe7\xe0\x15\x5f\x21\xfe\xf5\x58\xfd\x71\xb8\x0d\xd5\x4b\xe6\x0b\x59\x27\x67\x42\xfc\xfd\xf3\xd5\xef\xfc\xe5\xa7\x49\x13\x1a\x03\xa9\xb1\x86\x14\x7f\x3c\xbe\xd5\x17\xf3\xca\xdc\x80\xfc\xe1\x86\x06\x57\x8c\x5b\xf6\x09\x69\x1a\xc7\x47\x26\x50\x9c\xbb\xec\x52\xbe\xc0\xdc\x30\x62\x87\xac\xba\xdf\xac\xd0\xe7\x6c\x56\xc9\x51\xf5\x3b\x62\xe6\x62\x95\x98\x13\xd2\x65\x73\x4d\xb2\xd7\x1d\x15\x77\xc5\xda\x64\x06\xb4\xb6\x37\xcb\x0d\xd9\xb8\xb2\x5f\x65\xee\x94\x9f\xc9\x7c\xfd\xeb\x5b\x0b\x73\xfc\xff\x37\xe9\xd5\xb4\x2a\xd3\xc3\xf7\x0b\x81\x04\x95\xc5\x3c\x1e\x8f\xed\xc2\xd3\xdc\xf1\x58\x6c\xd3\xdd\x04\xdf\x78\x26\x24\xdf\xa0\x24\x39\xf9\xdb\x8a\xc1\x9d\x3c\xba\xf1\xca\x89\x2a\x60\x40\xbb\x3c\x31\x7b\x5a\x67\x8c\xa2\xd2\xcb\xa0\x7c\x1c\xf1\x81\x39\x71\x2c\x42\x55\x76\xe7\x84\x34\x51\xbd\x3c\x75\xbe\xe8\x05\xeb\xd5\x90\xf8\xef\xdd\x4e\x62\xd3\xbb\xed\x0f\xf5\x52\x94\x3f\xbd\xc0\x7a\xc0\x34\x6e\x1f\x1c\x91\x78\x42\xfa\xcd\x53\x26\xf5\xa1\xe7\x76\xd4\x93\xd2\x23\x71\x41\x0b\x7f\xe2\x87\xd8\x81\x8e\x22\xfc\x57\x4b\x6e\x16\xce\x0f\xc5\x6d\x77\x8d\x9c\x90\x6a\x5f\xac\x90\xeb\x38\x6f\xbe\xd2\x7a\x31\xc8\xe9\x37\xc2\xa9\x06\x8c\xe9\x15\xbe\xcd\x1b\xc9\xec\xd4\xe9\xe9\x93\xf0\xd8\xef\xe3\x09\xa9\x40\xbe\x58\xed\x54\xa2\xd3\xa8\xe7\xf2\xbc\x4a\x3c\x6d\x43\xa5\x5f\x6d\xae\x41\x57\xed\xcf\xe2\x87\x2a\x3c\x5b\x60\x30\x81\xe1\x09\x69\x48\x5f\xde\x8d\xf8\x2b\x67\xe6\x7a\x15\x6b\x69\x9e\xeb\x1e\xc5\x9b\x3c\x5b\x9c\x7a\x35\x9e\xcf\xf3\xb5\xe2\xf3\x7d\x7b\x35\xee\x93\x2b\xcc\x20\x30\xbc\x40\x2b\x26\xf1\xf2\x79\x72\xf1\x68\xca\x86\x11\xd6\xdb\xf5\x66\x1d\xff\x37\xdb\x76\x93\x3f\xae\xb2\x97\xa8\xa5\x84\x9e\x90\xe2\x90\xf4\x69\xa7\xc9\xdb\x91\x7c\x7f\x49\xe9\x98\x3d\xdb\xe0\xaf\xa1\xb2\xf9\xa2\x4a\xf6\xd5\x84\xf7\x5a\x91\x7e\x8b\x09\x5d\x85\x2f\xfa\x7f\xb7\x19\x38\x39\xbb\xd6\x02\xbb\x56\xe1\x99\xac\x81\x04\xcc\xeb\xd3\xe3\x97\x03\xbc\x48\x2e\x85\x25\xeb\x86\x3b\x70\xfc\x54\xe2\x5f\x0e\xd1\x9c\xe8\x3d\x21\x2d\x2a\x7a\xa0\x9a\x52\x18\x74\x5d\x9a\xf1\xdc\x8c\x54\x98\x3a\x4d\x82\x32\x17\xfb\x3d\x3f\x23\xb9\x1b\xb7\xec\x6c\x49\xce\x32\x1e\x4a\x4a\x12\x10\x78\x49\x4a\x9e\xf8\x1f\x77\xc8\x0e\xc3\x85\xe2\xb8\xed\xdb\x9a\x97\x9b\x3b\x6c\x37\xe7\xf6\x69\xf1\x72\xb2\x2d\x9b\xb4\x34\x02\xba\x72\x4b\x7f\xd8\x64\x9c\x90\x7e\x4e\x78\x16\x9b\x26\xfe\xf3\xcb\xf8\x88\x62\xd5\x2b\xfb\x2f\xf2\xf1\x26\xdb\xd5\x59\x5f\xbb\x1a\xa9\x8b\x9a\xd6\x4b\xba\x17\xa5\xff\x07\x55\xb7\xb0\xfe\xbb\x4b\xf3\xc1\x40\xc3\xf6\x96\x92\xf0\xf4\x0b\x92\xd2\x92\x94\xfc\x8f\xc6\x3f\x3f\xc5\x30\xd8\xf7\x25\xf5\x5b\x97\xb9\x48\x79\x6e\x4a\x3f\xd5\x5c\xcc\x82\xb6\x19\x67\x21\xee\xc5\xa6\x71\x1a\x8e\xc0\xf3\xda\xff\x41\xe3\x5e\x72\x68\x92\x68\x68\x68\xd7\xd1\xd0\x3d\xd1\xd0\xd0\xbc\x24\x25\xff\xef\xbf\x20\x19\x4f\x25\x00\xf2\xa9\x91\x9b\xe9\x61\x5e\xbe\xe8\x1c\x24\x15\xbf\x7a\xd1\x7c\x6c\x04\x19\xcc\x52\xa6\xd7\x8c\x24\x05\xdc\x6c\x08\xf8\xf8\xad\x37\xa8\xfe\xc1\xa7\xca\xa2\x09\x49\x42\x3f\x56\xcf\x5a\x80\x9d\x7c\x51\xa6\x74\x6e\xc5\x19\x30\xa3\x10\x3a\x78\x78\xb9\x5a\xe9\x1b\x8d\x25\x87\xe6\x4c\x50\x2c\x36\x37\x5b\xf1\xbf\xf8\x58\x4f\x8d\x53\x1f\x4b\x65\x87\xd8\x34\x30\xd0\x7c\xe5\x3d\xd2\xa2\xbd\x42\x30\x6b\xa1\x29\xa8\x76\x5d\x4d\xd0\xcb\x76\xea\xc9\x8b\x25\xc4\xd1\xe5\xa4\x7f\x72\xb5\x77\x4e\x7d\x6c\x6f\xe3\x65\x1c\xfb\x49\x39\x65\x40\xff\xbb\xa1\x04\x7e\x43\x7a\x8f\xb2\x9e\x46\x02\x9f\xcb\x97\x9b\x5c\xae\x55\xcf\xf9\x5d\xb6\xfe\xc9\xd5\x3e\x39\xf5\xb1\xe7\x7a\x76\x34\xbd\x1f\xd0\xb6\xf9\x65\x82\x3a\x7b\x54\x38\x17\x7e\xb9\x77\xdc\xdd\xbc\x95\xf7\x58\xe5\xc9\xec\xe5\xcc\x3e\x49\x9f\xff\xff\x1f\x6b\xf0\xdf\x7d\x75\x7d\x30\xb1\x00\x6f\x69\x74\x34\xc4\x89\x4f\xec\xbc\x5c\x35\x7a\x74\x04\xe8\x85\x09\x05\xd1\xb8\x4a\xb1\xc4\xd5\x51\x46\xb4\x8d\xbf\x8a\x57\x55\xfa\xe8\xa7\x26\xc5\x92\x7c\xcf\x53\xf7\xbf\xd3\x79\x4b\x7b\xfe\x47\xdd\xe8\x22\x5f\x47\x5c\x56\xd9\xd9\x3d\xf7\xc9\xef\xbf\x99\x84\x22\xe5\x3f\xeb\xb2\x77\xad\x63\xd0\x70\x29\x18\xc8\x19\x5d\xca\x3f\x87\xac\x0b\xa7\xf3\x96\x46\xc3\x3c\x59\xb7\x9c\x32\x46\x44\x26\x8f\xb5\xb3\x8d\x66\xd8\x63\xb1\x6a\x5f\xec\x23\xc1\xcb\x2b\xa3\x5a\xf8\x38\x18\x02\xfb\xd9\x32\x79\x58\x25\xc8\xba\x70\x3a\x68\xbf\xd4\x64\x94\x3a\x0f\x8e\xfa\x1f\x5e\x6f\x3f\xa0\xb0\xbe\xba\x81\x4b\x7d\xee\xc0\x34\x87\x89\xb3\xe8\x7d\xd8\x55\xfa\x30\x70\x80\x19\x59\x17\x4e\xe7\x2d\x4d\xf2\x1f\x75\xc7\xc0\xd2\xfd\x5f\x6a\xed\xf8\x9d\x56\x8f\x7e\xaa\x26\x7e\x9f\xd4\xb5\xfa\x8d\x81\x31\xc1\xce\xda\x68\x67\x45\x3a\x53\xf5\x1d\xdb\xd3\xe0\xbf\x9b\x00\xfe\xe6\xdd\xee\xa5\x6f\x6c\x5b\x66\xf6\xa4\x7a\xc6\x21\x4f\x5b\xb4\x41\x11\x66\x3b\x82\x70\xdf\xb9\x3e\xf6\xc6\xcf\x3c\x3e\xf8\xec\xd2\x53\xc8\x9e\xe1\x74\xd0\xb1\x08\xce\x56\xc9\xf4\x7f\xce\x11\x91\x19\x49\xd2\x9a\xcd\xf8\xde\xeb\xc3\xa5\xa4\xac\x7e\x6e\xb3\xee\x6c\xdc\xbd\xd7\x0f\xde\x50\x30\x21\xeb\xc2\xe9\xa0\xde\xbd\x94\x49\xa2\xab\x1b\x92\x5d\x0c\x0b\xbc\x1f\x8c\x7d\xc8\x10\x78\xd0\x0a\xbe\x0c\x35\x7a\x95\x26\x56\x88\xc1\xe6\x19\x21\x7a\x07\x59\x17\x4e\x07\xed\x37\xdd\x55\xd9\x95\x5d\xb1\x39\xaa\xb1\x89\x8f\x05\x5c\x9d\xae\x53\x2f\x74\x0d\xac\xb9\xa2\xa8\xaa\x30\x68\xf2\x62\x25\x93\x67\x18\x59\x17\x4e\x07\xf5\x8e\x25\x84\xcf\x90\x65\x6a\xe1\x03\x86\xa8\xad\x56\x26\x45\xf3\xcd\xeb\xad\xfd\x2d\x0b\xf6\x97\xf6\x3f\xe2\x60\x06\xec\x51\xcd\x7e\x42\x7a\x07\x37\x8b\xfe\xcd\x3b\x26\xb3\x2f\x93\xd5\x24\x4c\xde\x45\x34\xf6\xd8\x2a\xbb\x4f\x42\xe3\x95\x38\xd3\x25\x12\x84\x97\xae\xef\x30\x3b\x54\x39\xde\xd5\x40\xf6\x0c\xa7\x83\x8e\xc5\x45\x76\x52\x16\xd9\x89\xa8\xeb\xd8\x37\xbc\xb4\x92\x0d\x13\x23\xf0\x49\x08\x2c\x82\x99\x4a\x2c\x9a\x8d\xcf\x71\x04\xde\x1d\x29\x46\xd6\x85\xd3\x41\xbd\xdb\xd9\xef\x1e\xab\x2c\x09\x54\xcb\x8d\x78\x56\xa7\x21\x3d\x4f\x6b\x83\xd5\x2e\x73\x14\x90\x22\x8c\x9e\xe8\xc1\x41\x2c\x69\x9e\x80\xac\x0b\xa7\x83\xf6\x9b\x66\x9d\xc4\xf3\xfe\xfa\x8d\x68\x1a\x77\x2d\x26\x52\x2e\xa7\xf1\xc4\x74\xb4\xf0\xef\xe8\x9d\x45\xf5\x8a\x6f\xbf\x13\x48\xa6\x07\x21\xeb\xc2\xe9\xa0\xde\x1d\xb5\x5e\xaf\xb9\x61\xe1\x25\x96\xaa\x82\xa6\x55\x9c\x3d\xce\x58\x2b\xb0\xba\x76\x75\x60\x9f\xe5\x1a\xb3\x7a\x0c\x49\xbf\xa8\x0c\xd2\x3b\xb8\xa5\xe8\x6f\xde\xc9\x61\xc6\xd3\x2f\x07\x0b\x73\x99\xb0\xd7\xba\x8e\x3c\xa4\x88\xbb\x8a\x61\xe6\x2d\x92\x56\x8f\xd1\x79\x8f\xb1\x4b\x2f\x7c\x8b\x04\xd9\x33\x9c\x0e\x3a\x16\x11\x52\x74\xd8\xd9\x77\x9d\x8d\xf7\xbc\x8d\x13\xba\xb2\x85\xad\x8b\x5d\x46\x3b\x53\x26\xd4\xf7\x32\x71\x70\x65\x10\x03\x46\x0a\xc8\xba\x70\x3a\xa8\x77\xf5\x85\x9f\x3a\xa3\xf2\xbc\xe5\x8f\x02\x3b\x57\x69\xd1\xb5\x16\xba\x62\x8d\x38\x79\xce\x0c\x5e\x2d\x7e\x5b\xf3\x94\x71\x27\xde\x16\x59\x17\x4e\x07\xed\x97\xa7\x38\x6e\x1c\x8f\x88\xbf\xe3\xd0\xd2\xdb\xf9\xd9\x17\xec\x0b\xc5\xea\x29\x0e\x47\x8b\x0a\xa9\x67\x8d\x97\xc0\x95\x50\xb7\x33\xc8\xba\x70\x3a\xa8\x77\x4e\xae\xb6\xaa\x11\x47\x16\x6b\xc2\x75\xce\xa2\xbe\x82\x76\x6a\xa5\x78\x96\xf3\x4e\xf2\xdf\x98\xb8\x3e\xda\xdf\xba\x57\x58\x52\x80\xf4\x0e\x6e\x3d\xff\x9b\x77\x02\x15\xba\x5d\x5b\x8c\x73\x56\x35\xdf\x65\x9a\x79\x42\x3c\xab\xe7\x0a\xa3\xf9\x3e\xce\x74\xbd\x60\x67\xfe\x79\xdb\x81\x93\xfb\x78\xce\x84\xd3\x41\xc7\xa2\xe3\x33\xce\xa1\xcc\x59\xc5\xe7\x77\xdb\xd5\x07\xfc\xd8\x09\xb5\x5c\xe9\xba\x62\x7d\x74\xa2\x25\xd2\xcb\x34\x17\xb8\x9c\xcd\x44\x90\x75\xe1\x74\x50\xef\x94\xd9\x05\x1f\x0a\xe2\xa7\x52\xe8\x5e\x4b\x77\x3a\xb7\xab\x5a\x9a\x2e\xeb\x5b\x22\x63\xd0\xb9\xdd\xf1\xb9\x7f\xf4\xe3\x74\xaa\x13\xb2\x2e\x9c\x0e\xda\x6f\x43\x6a\x07\x59\xcd\x88\x11\x56\x5b\xb3\xa8\xfb\x17\xf7\x47\xe4\x60\x34\x61\x85\x25\x51\x76\xd8\xa3\xc9\xc4\x8f\xc6\x52\xfd\x8b\xc8\xba\x70\x3a\xa8\x77\x2b\xfd\x4b\x06\x31\x14\x53\x12\xa2\x5e\xf7\x3b\x25\x3f\xda\x90\xe9\xcb\x72\x36\xd4\x28\x05\x7f\xf4\xb9\xb7\x22\xe1\xef\xad\x69\x8c\xf4\x0e\x6e\x53\xf4\x37\xef\x4c\x96\x95\xbf\xf4\x1d\xd1\x3e\x4b\xbb\x33\x4f\x0f\x0c\xc4\xf3\x3e\x79\x12\xc1\xb4\x77\xdb\x8c\x22\x43\x8b\x4a\xe4\x43\x85\xa1\x20\xb2\x67\x38\x1d\x74\x2c\x9e\xcc\x69\xbf\xac\xdb\x9e\x94\xf6\x3f\x74\x6c\x6f\xce\xfe\x62\xb6\xea\x59\x29\xb1\x64\x8b\xc8\x17\x26\xca\xf1\xd5\xc6\xd5\x7c\x88\xac\x0b\xa7\x83\x7a\x47\x1b\x13\x9e\xa8\x70\x16\xbf\x44\xf5\x6c\x1b\x21\xab\x1e\x97\xf7\xe0\x8e\x5a\x8a\xad\xc2\x59\x5c\x3d\xc1\x57\x5a\xf2\xc1\xf3\xf2\xc8\xba\x70\x3a\x68\xbf\x98\xef\xef\x60\xdf\x62\xee\xaa\xdd\x98\xfc\xc5\xee\xe7\x2d\xc6\x25\xc9\xd3\x3b\x57\x55\x17\x50\x18\x9c\xf8\xce\xd0\xec\x47\x22\x29\xb2\x2e\x9c\x0e\xea\xdd\x26\x91\xeb\xcf\xd0\x24\x7b\xa5\x9f\x36\x4e\x6e\xe7\x77\xd9\xdf\x0d\x8d\x82\x75\x0f\x79\x92\xa6\x5a\xc9\x87\x1e\x7b\xe5\x04\x04\x78\x1a\xfe\x77\x69\xd0\x07\x0b\x13\xf0\x96\x45\x47\x43\xfb\x8f\xea\x04\xf2\xf8\x31\xf5\x77\x84\x14\x9c\xa9\x6a\x13\xa6\xf3\xe8\xcb\xd3\xb0\x6d\x74\xd2\xac\xde\x4e\x58\x84\xfd\x9c\x52\x78\x2c\xe6\xe0\x79\xeb\xbf\xd3\x79\xcb\xa2\x79\xfe\x67\xe5\x5f\x32\xeb\x06\x85\xaf\x0b\xae\x37\xc9\x64\xd1\x8b\x3c\xbc\xe2\x81\x15\xac\x78\x4e\xd0\xe1\x4c\x9a\xdb\x45\xca\xa9\xf8\x38\x86\xa7\xc8\xca\x70\x3a\x6f\x59\x34\xf4\xff\xac\x7c\x53\x2c\x7e\x61\xf4\xc1\xb4\xf2\xd3\xb0\x20\x5c\xa1\x2c\xd9\x2f\xa4\x44\x67\x1e\x62\xb9\xe6\xe2\x0c\x06\x7a\x45\x2e\x61\x49\x84\x23\x2b\xc3\xe9\xbc\x65\xd1\xd0\xfe\xf3\xbb\xe1\x47\xbb\x70\x8f\xdc\x66\xf3\x45\xcc\x6a\xe4\x68\x6b\x20\xd5\x61\xae\x98\x13\x53\x8d\x0d\x9b\xaf\xd0\x2e\xc6\x7c\x91\x47\x62\xb0\x27\x32\xd1\xc3\xdd\xb3\x3f\x99\xe8\xcf\xea\x7a\x0f\x2f\xc5\x82\xc6\x86\x62\xb8\x4e\x7c\xfa\x82\x14\x1e\x6f\x3d\x44\xa8\x18\x87\x9a\x36\x63\x6e\xee\x0e\x37\x75\x8e\x9f\x94\x8a\x89\xb3\xb5\x7d\xb1\xa9\xe1\xbe\x57\x11\xfc\x64\xce\x17\x2d\x86\x46\xb5\x6e\xb7\x7d\xc4\x53\xbb\xf2\x6e\xae\x7b\xe7\x95\x95\xff\x2d\x89\x7e\x1b\xeb\xbf\xbb\xb4\xff\x37\xd1\x4b\xab\x93\x42\x02\x18\x31\x5b\x79\xd3\x20\x39\xdb\x5d\x5e\x8d\x84\x11\x15\xfa\xb0\xdc\xe2\x8b\x69\x07\x24\x19\xba\x7b\x98\x25\x2f\xdf\x48\x59\x8b\xb1\xff\x8b\x48\x5f\x7b\x2a\xd2\x3f\x50\xc2\x77\x54\x36\xe5\x2f\x47\x70\xad\x4c\x5d\xf1\xf4\xcc\x6e\xa0\x98\x64\x99\x14\xb8\x95\xe8\x2b\xac\x2b\x1d\x18\x98\xda\xfe\x2f\xd2\xa6\xe4\xe9\x48\x2f\x36\x18\x9b\x59\x65\xb1\xea\x2d\xc3\xd8\x5c\x56\xc4\x6e\x28\x24\xc3\x13\xe6\x8e\xfb\xeb\x72\xef\x91\x72\xfd\xe8\xca\x43\xe5\xa2\x7f\xf1\xb1\xb5\xa7\x23\xfd\xe0\xb4\xc4\x02\x26\x5f\x60\x75\xde\x3b\xf1\x4e\x33\xdc\x6d\xf1\xe7\x38\x1f\x9f\xd7\x4f\x2f\xbb\x8e\xb0\xd8\x2d\xa2\x7b\xf1\xfe\x93\x1b\x18\x92\xa7\x23\x3d\xff\x10\x66\xb0\xb5\x50\xea\x9a\x63\x10\x43\xb8\xcb\x3d\x91\x95\xf4\xc8\x6c\xc3\x4b\x4e\x4f\x62\x15\xc5\x4d\xf7\xc2\x06\xe4\x59\xfe\xc9\xd5\x9e\x8e\xf4\x78\x3d\xaf\x93\x2d\x97\xe5\x42\x34\xb4\xdc\x36\xaa\x9d\xce\x2b\x07\x7a\xec\xbc\xa1\x59\x2b\xea\x68\x48\x1f\x70\xcf\xd9\x88\xa9\xff\x67\x91\x1e\xee\xab\xfb\xb7\x65\xd2\x5e\xf7\x0a\xe6\x98\xb7\xe1\xf0\x7c\x23\x11\x4d\x9d\x7d\xd7\xb9\x7d\xba\xd7\x9c\x0d\xd9\xb7\x3e\x08\xe2\xd5\x6e\x2d\x52\x68\xe2\x21\x97\x07\x38\xdd\xa9\x68\xa1\x7f\xe9\xb7\x6d\xa5\x28\xd7\x85\xef\x02\x43\xd7\xcf\x5c\x88\x69\xf2\x7a\xd6\x3e\x2e\x8a\x71\x44\xb5\x14\x24\xfd\xab\x58\xe5\xf3\x71\xb4\x80\xd1\x41\x97\x49\xa5\x1a\xb4\x9f\x84\x01\x14\xe7\x12\xc6\x0d\x30\x52\xb4\x4d\xa6\x87\x5b\xdc\xb6\xcb\xc8\xdd\x1f\x70\x10\x1b\xd9\x6c\x13\x45\x0a\x20\xeb\xc2\xe9\xa0\xfd\xfe\xb8\x6f\x44\xc3\x70\xd0\xe5\xcc\x4c\xd0\x34\xf3\xc0\x3e\x50\x98\xc4\xc4\xda\x8b\xe0\xf6\x47\x15\x32\x9e\x1b\xd1\x2b\x42\xe7\x32\x91\x75\xe1\x74\xde\xd2\x68\xc0\xc9\xba\x85\x19\x0d\x37\xdf\xe2\x95\xf4\x39\xb5\xec\xdc\x69\x5d\x92\xf1\x17\x09\x2d\x64\xbd\xa3\x97\x2f\xa7\xb5\xc1\x39\x5e\x9e\xce\x2d\x8c\xdc\xe2\xc0\x4d\x00\x7f\xf3\xae\xee\xc1\xb9\x60\x8f\xfa\x2f\x45\x13\xb8\x6f\xd8\x77\x0d\x31\xce\xd4\xb6\x26\xd2\x3b\x72\x13\xc5\x06\x39\x87\x4b\x1b\xcb\x5e\xfa\x82\xec\x19\x4e\x07\x1d\x8b\xb5\xf3\x77\xc6\x1e\x73\xdc\x24\xb5\xea\xf4\xd6\x4d\xd2\xec\x66\x9e\x3a\x24\x9b\xf6\xf8\x25\x5c\x50\xff\x09\xab\xfa\xc7\x8c\x67\x00\xb2\x2e\x9c\x0e\xea\x9d\x8c\x30\xf0\x4b\x67\x64\x9d\x11\xcf\x0d\xdd\xad\x03\xd7\x53\xfa\x0c\x1a\xaf\x4e\x1a\xb5\x90\x9f\xa9\x01\x1d\xc0\x2c\xf1\xc5\x02\x59\x17\x4e\x07\xed\x37\x56\x38\xa3\x44\xd7\xc5\x83\xea\x6b\x2d\x7e\xce\x6b\x3d\x1c\xff\x92\x54\xeb\xaf\x73\xed\xd6\xad\x98\x0d\x57\x8b\x18\x10\xf9\xc7\x5b\x1c\x38\x1d\xd4\xbb\x28\x13\x45\x8e\x62\x51\x32\xe7\xdb\x77\xb7\x16\x84\x3d\x22\xc5\xed\x76\xf4\xdd\x2d\xd0\x14\x9f\xf5\xa8\x6a\xd6\xf6\x48\xb0\x49\x20\xbd\x83\x9b\x45\xff\xe6\xdd\x03\xb1\xca\x02\xea\x16\x17\xd5\xbd\x04\x56\x26\xae\xbb\xa2\x17\x78\xd3\x44\x37\x1e\x98\x6e\xfe\xe2\x54\xd9\x51\xdf\x19\x0a\xf4\x45\xf6\x0c\xa7\x83\x8e\xc5\x83\x6f\x9c\x75\xd9\x64\xcb\xaa\x1f\x3d\xc6\x49\x1d\x84\xbc\x04\xcf\xba\x7d\x75\x21\x4c\xb1\x2b\x7c\x67\x91\x9d\x9a\xa5\xfb\xf9\xf8\xf6\x06\x9c\x0e\xea\xdd\x75\xfa\x0f\x5d\x51\xb6\x92\xac\x3f\x6b\x5a\x08\xaf\x75\x72\xe0\xb5\x87\x62\x87\x31\x19\x24\xa5\xbd\xd5\xe4\x28\xda\xc4\xc5\xfd\x8e\xac\x0b\xa7\x83\xf6\xeb\x8b\x73\x38\xe6\x97\x67\x62\x57\x7e\x2b\x62\xc5\x3d\xec\xc2\x15\xed\xa0\x94\x69\x21\xea\xd8\x71\x09\xe5\x67\xeb\xee\x5f\xc4\x4c\x90\x75\xe1\x74\x50\xef\x14\xbf\x1b\xf6\xd0\x03\x56\x81\xca\xbc\xe4\x41\x79\x1a\xcd\x73\xbd\xf5\xfd\x0c\xb7\x9d\xb2\xfc\x3c\x1b\xd3\x0e\xba\x56\x9b\xe4\x90\xde\xc1\x2d\x45\x7f\xf3\xee\xd2\x84\x22\x47\x85\x0a\x93\x15\x73\xb3\xc1\xd4\x3e\xc1\xb6\x5f\xbe\xb9\x67\x30\xfa\x2c\x51\x79\x86\x9b\xc1\x8d\x7d\x82\x52\x1a\x64\xcf\x70\x3a\xe8\x58\xac\x18\x2f\xb7\xf0\x95\xab\x28\x68\x8d\xc4\xdd\x4b\xd0\xd2\xff\x45\x29\xb3\x41\xe8\x33\xdd\x11\xad\xa6\x12\x58\xb1\xf9\xfe\xfe\x38\xb2\x2e\x9c\x0e\xea\x5d\x84\x56\x2d\x86\x80\xca\x0e\xde\xf8\x46\xf5\xa8\xc7\x9b\x9c\xa6\x24\x63\xa9\x55\xe6\xa5\x94\xf4\x4f\xb5\x97\x42\x14\xe9\xb3\xa2\x8f\x6f\x15\xc0\xe8\xa0\xfd\x62\xf3\x6e\x9a\x27\xea\x39\x16\xb0\x5d\x4e\x7e\xd1\xf2\x3c\xf0\xea\xaa\xb2\x10\xe5\xea\xd9\xda\xc6\x29\x11\xaf\x8a\x4b\x92\x7d\x14\xc8\xba\x70\x3a\xa8\x77\xce\x6f\xe2\x35\x3c\xec\x34\xf0\x5d\x6e\x98\x46\xdf\xb9\xd3\x9c\xa0\x42\x9c\xb7\x6b\xdc\x5f\x78\xf6\xa0\x5b\x6d\xcf\x87\x51\xd0\x13\xe9\x1d\xdc\x7a\xfe\x37\xef\x42\x00\xc1\x8f\xb9\x78\xb3\x9f\xc6\xe3\xa3\x17\xf8\x2a\xaa\xd7\x4c\x9e\x2a\x98\xe5\x7a\x86\x71\x62\x7e\xc8\x99\xd2\x35\xd1\x46\x47\xf6\x0c\xa7\x83\x8e\x45\xfd\x1b\x2a\x09\xf7\xd8\xbe\x39\xef\xc3\xd8\x99\x3a\xde\x3c\xd7\xdb\x1e\x57\x28\x03\xb3\xef\xcb\xf6\x04\x7e\xea\xf3\x91\x10\x4a\x3e\xbe\x6d\x02\xa3\x83\x7a\xb7\xb0\x6d\x63\x59\x7d\x73\xbc\xed\x82\x91\xe0\xaa\x1a\x59\x6b\x29\x15\xf3\x81\xe6\x4c\x75\x5c\x75\x38\x0e\x55\xa0\x32\x7b\x9e\x2b\xb2\x2e\x9c\x0e\xda\x2f\x5f\xb2\xb3\x3e\xd1\x95\x8f\xa6\x1a\x86\x6f\x8d\x48\xb8\xc8\xde\x81\x0e\xf3\xa5\x35\x37\xa5\x57\x3c\xde\x26\xac\xe7\xd3\x7e\x69\x45\xd6\x85\xd3\x41\xbd\x2b\xfe\xb2\xf8\x64\xf8\xda\x25\xac\x7d\x44\x10\xb3\xd7\x1c\x95\x2f\x77\x5a\x3c\x5a\x88\x57\x52\x01\x19\x3a\x95\xbc\xac\x93\x11\x26\xd2\x3b\xb8\x4d\xd1\xdf\xbc\xfb\x28\xf7\xad\x16\xf3\xf3\xb0\xe0\xbd\xbb\x1f\xdc\x53\xa5\x7e\x57\x33\x1f\xf4\xf0\xe4\xb8\xf0\x75\xec\x8b\xd3\xf1\x4c\x80\x71\x9a\xc8\x9e\xe1\x74\xa7\x8e\x1f\xc2\x7e\xf9\x87\x8a\x72\xf9\x13\xa5\x74\x2b\x62\x17\x04\x3b\xd7\x0a\x52\x4c\x3e\xf6\x3c\x12\x3a\x34\xa4\x47\x48\x97\xbc\x62\x3c\x3e\x7e\x80\xd1\x41\xbd\x9b\xcb\xa1\x3e\xe3\x7f\xb6\xef\x41\xf1\x13\x7a\x7e\x65\x31\xc5\xaa\x67\x5a\xaa\xa5\x07\x25\x15\x68\xf2\xcf\x86\xee\xd8\xf0\xd0\x1b\x21\xeb\xc2\xe9\xa0\xfd\x36\x0e\xee\x37\x17\x6c\xd4\x01\x7e\x77\xb5\x95\x05\xf9\x22\xcf\xff\xa6\xfd\x35\xe6\xef\x63\x51\xc4\xfc\x4d\xb2\xb3\x4e\x81\x6b\x10\x59\x17\x4e\x07\xf5\x6e\xa6\x4b\x28\x5e\x2b\x90\xcb\x6a\xa1\xcb\xb9\xa8\xb4\xac\x54\x91\x71\xd6\xbb\x24\xda\x8b\xc8\xe6\xaa\xf2\xc8\xb5\x94\xf3\x17\x4b\x91\x91\x1e\x2e\x0e\xfe\x3d\xd2\xbb\x3e\xb0\xce\x1c\x1c\xc3\x14\xe3\x1c\x0f\xac\x4d\x8d\x64\x68\x92\xa6\x6f\x99\x13\xab\xbe\x90\xac\x5b\xd3\x17\x8d\xa0\x93\x7e\x8c\x8c\xc7\x70\xba\xd3\x91\x3e\xe8\x99\x28\xfe\xa0\xe7\xec\x51\x14\x8e\x64\x03\x87\x1e\x9d\xac\xbb\x8e\x2d\xa6\x34\x37\x7b\xa5\xe4\xf5\xe2\xc2\xec\xd4\x54\x76\x64\x65\x38\xdd\xe9\x48\xff\x4d\x7d\x51\x9c\xd2\xdf\x98\xd3\xf2\xb2\xea\x87\xe8\x77\x4a\x60\xbd\x76\x24\x79\x79\xe6\xd5\x74\xaf\xc1\x06\x9c\x0c\x13\xc7\xb3\xc8\xca\x70\xba\xff\x13\xe9\x49\xfe\xe3\xd8\xe4\x8e\xf5\x58\xd3\x48\x8a\xbe\x8b\x67\x6b\x99\x83\x80\x57\x4a\x43\xd3\xea\xf9\xe8\xdf\xb7\xce\x73\x5c\xf3\x8f\xd3\xfd\x7d\xfd\xf3\x71\xa4\x87\x7b\xb6\xee\x64\xa4\xb7\x9e\xcc\x8b\xba\x27\x41\xe5\xad\xa1\x37\x6d\x4f\x3d\x1e\x90\xd7\xbf\x47\xb9\x36\xe5\x8a\x99\x1e\xfb\x94\x3b\x8c\x39\xd7\x04\xed\xe4\xd3\x27\x77\xef\x37\x5c\x98\xe1\x7a\x15\x61\x44\xb3\xc4\x3f\xbe\x57\x55\xa6\x37\xec\x33\x33\x69\x76\x33\x96\xea\xc3\xc0\xc7\xe8\xbd\xfa\xff\x6d\x91\x1e\xee\xd2\x4e\x44\xfa\x50\x68\xa4\xcf\xdf\x37\xb8\xb2\x35\xf1\x5c\xb2\xea\xeb\x54\x57\x20\xaf\x1c\x4f\xeb\x72\xf2\x08\x86\x1b\x9a\xe8\x93\x48\xa7\xb5\x6b\xe4\x05\xe6\xff\x22\xd2\xa3\x29\x43\x63\x9f\x46\x38\xcd\x5a\xb2\xbe\xb3\xfc\xf3\x1a\x49\xae\x6c\x1c\x22\x11\x29\xf4\xa9\xb0\xed\x97\x39\x2f\x55\x6c\x2c\xbe\x5c\xba\x8d\xe0\xfd\x27\x07\xc8\xa7\x23\xfd\x62\x41\xe9\x02\x5f\xfb\x87\x48\xa6\x4a\xb4\x1a\x06\xd9\xbb\xa0\xfd\x90\x20\xde\xc2\x46\x4e\x35\xbe\x91\x3e\xce\x6a\xdc\xf5\x7f\x12\x72\xd1\x34\x4f\x7d\xac\x05\xe8\xc6\xe1\x5a\x52\x6c\x7e\xcb\x46\xd1\x5c\x60\x83\x40\x5f\xcb\x3a\xa1\xf2\xcd\x4f\xf6\xa7\xea\xce\x6d\x14\x87\x18\x3e\xa4\xff\xe4\x6a\x4f\x47\x7a\x92\x76\x47\x4d\x1c\x5d\x5b\x67\x0a\xc1\x3b\xea\x1f\xbc\x9f\x8a\x75\x93\x63\x5e\xcd\x59\x7f\xdd\x54\x11\xb7\x2c\x24\x5d\x43\xfe\x4f\x9e\x49\x40\x73\x3d\x7d\xb5\xce\xe2\x6c\xc5\x09\x13\xa9\x8c\xc4\x3b\x2f\xb4\x94\xb2\x30\x23\xdd\xf9\xfc\xaf\x04\x99\x97\x9e\xfb\x41\x57\x4f\x19\x59\x1e\xf2\xcf\x22\x3d\xdc\x57\xf7\x6f\xcb\xe4\x19\xeb\x98\x92\x07\xc1\x1a\x91\x06\xf9\x97\x15\x8d\xfb\xd1\xdb\xca\x22\xd8\x07\x6a\xeb\x92\x30\xdc\x25\x47\xce\x7b\xa3\x6d\xb0\x21\x97\x07\x38\x1d\x74\xd9\x51\xc1\x26\xde\xb6\x36\xa7\x17\xcf\xb1\xa2\xdd\x19\x76\xc7\xbf\x96\xb9\xf2\xe5\x61\xb6\xf4\xe6\xd0\x4e\x29\x87\x4f\xe3\x4b\x8c\xe3\x53\x3d\x38\xdd\xa9\xd3\xc2\x9b\xd3\x75\x3e\xcf\xfc\xf6\x79\xf2\x3e\xfd\xd4\x0a\xbc\x81\x17\xf5\x60\x63\x79\x8d\x6c\x54\x85\x6e\x48\xe4\x60\x21\x97\x05\xff\xf8\xb4\x10\x46\x07\xed\x57\x84\xfe\x9b\x5a\x1e\x86\x7e\x6c\xab\x69\xf3\x87\xa5\x12\x76\x35\xc7\x7b\x9d\x61\x01\x42\xf3\x8a\xb1\xdc\xb4\x43\x2b\x69\x3d\x2e\xc8\xba\x70\x3a\x6f\x69\xc8\xd4\xad\xd4\x7a\xf5\x93\xd1\x9b\x51\x0d\x65\xfc\x41\xf6\xae\x57\xb7\xfd\xba\x19\xb4\x37\xd0\x87\xe4\x46\xc3\x38\x14\x4d\xad\xa5\xfc\x91\x5b\x1c\xb8\x09\xe0\x6f\xde\xc9\x26\x9c\x13\x17\xad\x66\x78\x28\xc8\xe4\xcb\xe0\x54\x6a\x5c\x70\xc5\xe9\xa0\x97\xf8\x63\x6c\x31\xd3\xad\xf9\xf9\x86\xd7\x35\x2f\x91\x3d\xc3\xe9\x4e\x9d\xd2\xff\x72\xef\x74\xbf\xd0\x58\x96\xa1\x7f\x38\x7f\x6d\x5f\xd7\x0f\x87\x9d\x44\x2b\x87\xdf\x68\x29\xe5\x25\x3d\xb9\xf4\x33\x67\xb4\xe3\x53\x7a\x18\x1d\xd4\xbb\xe0\x40\x01\xb2\x5b\xf7\xe5\xc5\x09\x1e\x46\xb5\x35\xf8\xca\x06\x0b\x16\xd2\x72\xbb\xe4\xdf\xad\x24\xf6\x5d\xb5\x55\xbd\x35\x8e\x7b\x5c\x17\x46\x07\xed\x57\xd4\xf1\xdd\x24\xb5\xdf\xc5\xe6\x50\x67\xfb\x24\x11\xdf\xef\xaa\x1e\x57\xd9\x88\x3f\x33\x5f\xc8\xb0\x16\xe8\x20\xea\xe7\x0a\x32\x46\xd6\x85\xd3\x41\xbd\xdb\x40\xbf\x18\x3c\xd1\xe3\xb2\x76\x23\x6b\xf9\xe6\xba\x59\x81\x2b\x03\x42\xa2\x81\x46\x4f\xdb\x52\xc1\x9d\x7e\x60\x4a\x86\x86\x0d\xe9\x1d\xdc\x2c\xfa\x37\xef\xcc\xf2\x0f\xe4\xd4\xeb\x6f\x4c\xec\xf4\x2a\x53\xd4\xca\x4f\x2c\xb1\x9e\xb9\xf9\x71\x20\x46\xc7\x07\xb3\xa3\x52\x01\x78\xf2\xfe\x3c\xb2\x67\x38\x1d\x74\x2c\xbe\x0f\x2c\x98\xd9\x69\xef\x0b\xdd\x46\x07\x42\xa6\xf3\x3e\x6d\x8e\xaf\x14\x1f\x06\xbf\xdd\x1a\xef\x4e\xbc\xef\x6c\x91\x28\xa5\x8c\xac\x0b\xa7\x83\x7a\x57\xc4\x46\xf7\xfd\x73\xb7\x37\xef\x30\xf5\xb0\x5b\x7a\x7f\x9f\xce\x43\xe1\xda\x2f\xa2\xfc\x66\xda\xce\x74\x64\xf7\x88\x34\x2e\x1e\xc7\x4d\x38\x1d\xb4\x5f\xe1\x85\x4b\xed\xde\x52\x34\xd4\x63\x57\x78\xb8\x70\x86\x43\x3a\xe4\xf9\x8a\xef\xe0\x1e\xe4\x34\xab\xa5\x08\xdc\xe1\x99\x48\x48\x44\xd6\x85\xd3\x41\xbd\xf3\x74\xa0\x09\xfd\x72\x48\x24\x4a\xe3\xc4\x87\x4b\xb7\x75\xdd\x27\x9e\x99\x6c\xa1\x2e\xa3\x54\x83\x5c\x62\xe5\x0b\xed\x96\x21\x1e\xd2\x3b\xb8\xa5\xe8\x6f\xde\x69\x6d\xe2\x6c\x66\x70\xa9\x59\xe8\x3f\xe2\xe6\xdc\x7d\xd5\x12\x13\xb4\x87\x66\x23\xa2\xc6\x31\x9d\x49\x53\x73\xeb\xb1\xfd\xad\x05\x64\xcf\x70\x3a\xe8\x58\x4c\xa5\x61\x16\xc9\x11\x5e\x59\xb1\x3f\x22\x75\xed\x89\x4a\x66\x51\xf0\xc5\x50\xe1\xda\x51\x9f\x97\xbb\xc8\x6a\x64\x3c\xa7\x98\x8f\xac\x0b\xa7\x83\x7a\x47\xce\xe1\x41\xf2\x0d\xad\x9d\x23\xb0\x46\xb0\x2f\xaf\xcb\xe3\x7a\x9e\x79\x95\xf2\xd3\xa9\xaa\xef\xca\xef\xc7\x5c\x82\xc9\xb6\xc5\x90\x75\xe1\x74\xd0\x7e\x9b\x98\x6f\x6b\x0e\x7c\xc4\xd8\x52\x36\xc9\x70\x17\x0c\x6d\x20\xb1\x36\xea\x8f\x40\x17\x54\xe6\x04\xa4\x23\x66\xdc\xb0\x95\xf8\x91\x75\xe1\x74\x50\xef\x02\x7c\xd0\x76\x63\x04\x05\x34\x2e\x45\xd5\x62\x3c\x10\xbf\x6a\x91\x89\x65\x48\xa7\x30\xea\x65\xef\x94\x6f\xd4\x2b\x3f\x14\xcd\x8b\xf4\x0e\x6e\x3d\xff\x9b\x77\x85\xed\x7e\x34\x6b\x21\xc4\xf8\xf8\x81\x9b\x66\x3d\xf6\x77\x08\x1c\xb9\x5d\x9d\xac\x93\x7e\xa6\xb4\x19\x10\xe2\x52\xe2\x1d\x80\xc8\x9e\xe1\x74\xd0\xb1\x20\x67\x29\x70\xea\xbc\x64\xdc\xe5\xa5\xff\x19\x2d\xd7\xd9\xbc\xd9\xb9\xb9\x13\x9f\x30\x39\xec\xd0\x81\x2c\x85\xdc\xfb\x17\xb7\xea\xf1\x18\xc3\xe8\xa0\xde\x0d\x8b\x6a\x29\xcf\x9e\x29\x73\x62\x5c\x11\x2e\xf8\x5e\xc9\x43\x3a\x14\xe6\xdd\xad\xe5\xa0\xfa\x59\xa9\x00\x7f\x60\xef\xb2\xe2\xf1\xad\x66\x38\x1d\xb4\x5f\xbc\x4f\xab\xfb\xa9\x0f\x5b\xe9\x97\xb6\x43\x68\xb8\x97\x88\x4a\x08\x67\x03\x52\x33\x4a\xdc\x3a\xb4\x30\x95\xa8\x23\x6c\x53\x0e\x90\x75\xe1\x74\x50\xef\xce\x1a\x22\xaa\x3d\xf9\x9f\xb0\x7e\x34\xcb\x66\x08\x62\x92\xa1\xab\x64\xb8\xfb\xde\x18\x7b\xef\x29\x09\x0e\x37\xe9\xce\xa6\x70\xdd\xf1\xef\x0e\x66\x53\xf4\x37\xef\xa6\xc0\x05\xfa\xd8\xa9\x48\x25\xf3\x2d\x85\x8e\x12\xde\x32\x97\xcc\x31\xdd\x7a\xfe\x3a\x41\xf9\x0b\x91\xf7\x4d\x1a\xa8\xcd\xe8\x8f\x7f\x1f\x30\x3a\xe8\x58\x84\x0d\xc7\x15\x84\x4b\x4c\x11\x3a\xad\xb5\xdf\x3e\xe7\x7a\x33\x3d\x59\xe1\x9c\xd7\xd4\x8d\x22\x67\xae\xb8\x87\x81\x19\xfb\xd8\x3f\x90\x75\xe1\x74\x50\xef\xf4\x9e\x3a\xbd\xc1\x32\xe1\x6b\xcd\x91\x63\xb4\xf8\x60\x45\x42\x1c\x50\xe9\xa5\x70\x46\xa2\xd7\x2e\x29\x8f\xd2\x99\x9c\x56\xee\xb8\x5f\x38\x1d\xb4\xdf\x2f\x72\x99\xa5\x63\xb4\xf4\xa3\x97\x09\xef\xcc\x66\x0e\x81\x05\xdd\xf5\xdc\x17\x70\x52\x0a\xd0\x9b\xd6\x89\x78\xc5\xd4\x43\x8e\xd7\x51\x38\x1d\xd4\xbb\xea\x56\x4c\xa2\xe4\x5f\x20\x86\x67\x07\xed\xaa\x79\x71\xb1\xbf\x9b\xd2\x38\x61\xe2\xd5\xb9\xbe\xf7\xd2\x9c\xee\x26\xe1\x2e\x21\xc8\x48\x0f\x17\x07\xff\x1e\xe9\x27\x96\x68\x89\x97\xde\xd1\xab\xcb\x0f\x92\x46\x8c\xad\xf5\x8d\x2c\x66\xbd\xd3\x29\x1b\xdd\xcc\x6c\x4a\x1f\xb8\xa5\x87\xde\xf1\x00\x19\x8f\xe1\x74\xa7\x23\x7d\xdf\x45\x1d\x1a\x04\xdf\xb7\xa6\x7a\x9d\x7b\x1e\xd8\x4a\x1c\x69\xfa\x1f\x0d\xe3\x67\xc6\x17\x6f\x54\x0d\xb0\x67\x3e\xf4\x70\x53\x41\x56\x86\xd3\x9d\x8e\xf4\x91\xde\x25\x3b\x4a\x92\x45\x31\xe3\x2f\x65\xc3\xcd\xcf\x39\xe7\x5f\xd8\xa4\x49\xfa\xce\xbc\xfb\xa3\x99\x8d\x8b\x45\x78\xfc\x82\x00\xb2\x32\x9c\xee\xff\x44\x7a\xc9\x93\x95\x2b\xca\x4a\x55\x1f\xe7\x94\x16\xfb\x0a\x87\x2f\xa6\xcf\x69\x10\x7f\x6c\xa9\x49\x11\x1b\x42\xcb\x3e\xbf\xe7\xe9\xff\xa8\xfd\xeb\xd4\x71\xa4\x87\x7b\x07\xee\x64\xa4\xaf\xc4\x0a\xb8\x57\xba\x6b\xff\xa4\x63\xd4\x5e\xd0\xa9\x7d\xe2\x4b\xce\xf9\x57\x3a\x03\x5d\x39\x68\x3f\x33\xfa\x05\xaf\xba\x91\x94\x9c\x90\x7a\xff\x6a\x0b\xb4\x77\x1f\xf1\x65\xac\x96\xc4\xfe\xce\x57\xa5\x4f\x47\xac\x25\x19\x16\x9e\x5b\xff\xbb\xfd\xde\xb9\xdb\x74\x18\xed\xff\xdb\x22\x3d\xdc\xa5\x9d\x88\xf4\x9f\xa1\x91\xbe\x4d\x94\xdb\xe4\x4e\x61\xb5\x89\xdc\xf7\x51\x26\x50\x77\xa2\xfc\x65\x6c\x24\xcd\x81\x03\x1f\x9b\x8b\x4f\x5d\x43\x68\xb0\x4f\xcb\xbf\x88\xf4\x92\xa7\x22\x7d\x91\xb6\xa8\x20\x42\xd0\xf9\xa6\x75\x6a\x25\x6d\x76\xe8\xef\x6d\xbc\x9b\x5a\x94\x9e\x08\xc6\x70\x49\x05\xc1\x5a\x05\xd3\x65\xd7\x7f\x72\x80\x7c\x3a\xd2\xa7\xfe\x28\xf1\x92\x26\x6e\xb9\xf2\x48\x26\xcf\xfe\x9a\xea\xd7\xe5\xe5\x66\x3a\x62\x2b\xd0\xf7\x73\x49\xf8\x3c\x75\x05\x85\xe6\xdb\x7f\x72\x5c\x7e\x3a\xd2\x93\x25\x61\x5a\xf0\x97\x77\x5b\x4f\x11\x63\xf0\x85\x35\x1f\x04\x94\x6e\x0e\xde\x6a\x70\x7c\x2c\xe2\x54\xe1\x84\x69\x8d\x16\x7f\xf0\x4f\xae\xf6\x74\xa4\xc7\x27\x60\xaf\xcb\x5a\xe3\x4b\xbf\xe3\x77\xde\x29\x61\xf0\x09\x7a\xca\x23\x77\x4b\x53\x04\x89\x44\x16\xbb\x37\xc5\x11\xa2\xe0\xf7\x3f\xb9\xda\xd3\x91\x5e\x75\x76\xa3\x62\x24\x85\x2e\xaf\xba\x4a\xbf\xc2\xb1\xdd\x3c\x89\xf8\x36\x7d\xaf\x7e\x54\x5d\x4b\x50\xa9\x7d\xe0\x91\x55\xbd\xd6\x3f\x8b\xf4\x70\x5f\xdd\xbf\x2d\x93\x82\x56\xa2\x75\xad\xac\xe4\x22\xf7\x43\x74\x74\xbf\x2d\x4c\xdd\x4c\x97\x18\xff\xf6\x11\x7d\xfd\x31\xed\x8f\x6c\x5d\x71\xd1\x31\x5d\xe4\xf2\x00\xa7\x83\x2e\x3b\x83\xfc\x7d\x29\xa3\x8f\xe3\xbd\x82\x1e\xbb\x8b\x8a\xfd\x5a\x64\x7f\xb9\x44\xd4\x1e\xd5\x2a\x45\x2c\x37\xea\xeb\xaa\x90\x6c\xb9\x84\xac\x0b\xa7\x83\x2e\x93\xec\xca\x77\x1f\x79\x17\xb8\xb6\xbd\x95\x9f\x31\x5d\x90\x4b\x9c\x69\xd2\x3d\xeb\x76\x4d\x34\xb7\x1b\x2d\xea\x00\x57\xb3\x8b\x5c\x0d\x59\x17\x4e\x07\xbd\x43\xfd\xc5\x3f\x66\x56\x17\xdd\xd7\xe1\xeb\x03\x97\x85\xe2\xe8\x8c\x36\x09\x22\x73\xab\x6f\xa2\x21\x99\x86\x5c\x73\xbf\x13\xb9\x78\x28\x8f\x97\x49\x18\x9d\xb7\x34\xf0\x1f\xe3\x70\x80\xe6\x37\x9c\xd2\xe9\xbd\x23\x83\xbe\x50\x24\x34\xf8\xb9\xec\xea\x3b\x6d\x9c\xb9\xa5\xc9\xfa\xd9\x7c\x2e\x80\x23\x35\xd7\x0b\xb9\xc5\x81\x9b\x00\xfe\xe6\x1d\xc1\x1d\x34\x2d\xb5\xc8\xd1\xc7\x83\xde\x32\x7a\xf9\xc5\xa3\x9a\xa4\xbf\x06\xc7\x2b\xe5\xc4\xf5\x87\xa9\x8d\xf1\xc9\xb9\x94\xe4\x90\x3d\xc3\xe9\xa0\xde\x5d\xf8\xe4\x24\x12\xe7\x8c\x25\x3d\x62\xae\x20\x62\xe0\xc8\x92\x45\x43\xd1\x54\xf3\xca\x7e\xfd\x91\x64\x43\xff\x9b\x24\x92\x67\x7c\xc8\xba\x70\x3a\xa8\x77\x3f\xc8\xdb\x6b\x4d\xfd\x43\x88\x5e\x20\xb0\xdc\x39\x6a\xa3\x2a\xa6\x08\x8f\x1c\x7e\xdc\xd3\xc6\x79\x48\xda\xfd\xf8\x30\x30\x09\x38\x7e\x12\x02\x46\x07\xf5\xae\x15\x5f\x40\xb1\x55\xc9\xe5\xb7\x7d\x7b\xde\xe7\x87\xba\xc9\x01\x04\x16\xae\x87\x84\xb6\x2f\x6e\x53\xb3\x16\xb2\x58\x07\xf0\x1f\x9f\x4c\xc3\xe9\xa0\xde\x3d\x6d\xd2\x61\x09\xbe\x41\x74\xcd\x08\x3f\x60\xf4\xa3\x38\x06\x8b\x2d\xf3\x4f\xb5\xe2\x75\x83\x1d\xb4\xbc\x55\x12\xb4\x1f\xce\xa3\x48\xef\xe0\x66\xd1\xbf\xde\x4a\xf3\xff\xf1\xde\xe9\x1a\x56\xfe\xc6\xa8\x5e\xf2\xd6\x6e\x5a\x52\x1e\xce\x37\xd1\xd7\x81\x41\x43\x57\x58\xe7\xbd\x72\x05\x6f\x71\x1d\xdf\x4a\x83\xd1\x41\xbd\xab\xad\x33\xab\xba\x4e\x3a\x1f\xaf\xa1\xa6\xf5\xdb\xcb\xc2\xf2\x36\x47\xb3\x28\xd3\xdd\x0b\xbe\x34\x95\x25\xbd\x82\x4f\x31\xb0\x8f\x1f\x00\x86\xd3\x41\xbd\xab\x5e\x20\x38\xe7\x42\x7a\x91\xec\xa7\x23\x73\x73\x79\x0d\xd9\x2c\x46\x8e\xae\xae\xb9\x7b\x36\xc6\x93\xc6\xbc\x0e\x33\xea\xd4\xe3\x87\x53\xe1\x74\x50\xef\xe6\xd4\xd6\xc6\x52\x52\x54\x28\x05\x5d\x77\xd5\x8b\x79\x22\x33\x64\x48\x12\xae\x7b\xad\x44\x52\x12\x15\xce\x2f\x4f\x2b\x99\x39\x1c\x9f\x64\xc1\xe8\xa0\xde\x3d\x7c\x68\xe4\x8d\x43\x6b\x86\x99\xcb\xfe\x73\x57\x4b\x7e\x25\x86\xac\xe4\x39\xdf\x34\x7f\x2d\x69\xad\xb6\x8e\x5d\xfe\xf9\x6a\x10\xe9\x1d\xdc\x52\xf4\x37\xef\xbc\x65\xee\xb2\xac\xd7\xcb\xcd\x2a\xaa\x21\xf0\xf9\xb9\x38\xe5\x6e\x04\xc8\x51\x93\x11\x52\x8d\x46\xd5\xaf\x7e\x3e\x17\x2c\x74\x0d\xd9\x33\x9c\x0e\xea\xdd\x2a\x71\x49\xaf\xa3\xe5\x9b\x96\xe2\xd1\x45\x41\x89\xfb\x26\xf3\x7b\xd5\x1b\x7e\xbb\x69\x1f\x13\x66\x34\x2f\xae\x86\x62\xfc\x38\x8e\x59\x70\x3a\xa8\x77\x55\xd6\x9f\x3b\x0e\x0b\xe6\x15\x16\x49\x76\xfd\xcb\x6b\x14\xaa\xc2\x6f\x7d\x7b\xb2\xd8\x67\x37\x8f\x6d\xf7\xf3\x63\x64\xf3\xf8\x59\x64\x5d\x38\x1d\xd4\xbb\x68\xbc\xf3\x11\x2c\xc4\xd9\x89\xec\xe3\x97\x98\xfb\xc6\x13\xf6\x5d\x8c\x74\xbe\x89\x2c\xad\xf4\xc7\x5c\xf1\xd3\xea\xca\x15\xb8\x79\x7c\xba\x09\xa3\x83\x7a\x47\xd9\x9f\x60\xb9\x9f\xc8\xdd\x34\xf2\xee\x65\x7e\x94\xce\x43\xd6\x91\xd2\x48\x0f\x45\x25\xc1\xa0\xaf\x3a\xd9\x15\x6c\x34\xad\xc7\x2f\x2b\xc1\xad\xe7\x7f\xf3\x8e\x97\x3d\xfa\x22\xff\x58\x3e\x63\x20\xd6\x63\xb3\x9f\x3d\x39\xd8\x25\x97\xc6\xa7\xc4\x75\x13\x23\x7f\x1b\x88\x5c\x1e\x13\xe3\x3a\x8e\xde\x70\x3a\xa8\x77\xc5\x56\x13\xb5\xfa\xee\xb3\xd3\xd4\x04\x3c\x8d\x9f\x33\x06\x4c\xa7\x29\xb2\xc9\x17\x2e\x69\x3c\x50\xae\x14\xee\x78\xd6\xf5\x41\x0f\x59\x17\x4e\x07\xf5\x6e\x63\x4c\x7c\x3b\xb5\x62\x76\xd9\x09\xfd\xb9\x85\xd1\x97\xec\xe9\x24\xcf\xdc\xb6\xb3\x2e\x2a\x3e\xd7\xcf\x60\x60\x8d\xf1\xa9\x1f\x21\xeb\xc2\xe9\xa0\xde\x39\x8c\x84\x11\x70\x1c\x98\x44\x38\xe9\x8a\x4d\xcd\x1f\xae\xdf\xdb\x29\x7a\xe1\x98\x70\x5b\xe5\x49\xd4\x75\xec\xf7\x62\x75\x0c\x51\xc8\xba\x70\x3a\xa8\x77\xb5\x23\xd7\x7f\x55\x9d\xbf\xea\x7b\xfe\x12\xe9\xe3\xed\x58\xbd\x56\x21\xbd\x9b\x6d\x69\x07\x01\x6e\x8e\x32\x9b\x76\xe7\x74\xb9\x13\x91\xde\xc1\x6d\x8a\xfe\xe6\xdd\xd7\x95\x17\x0e\xb6\xca\xcc\xfe\x51\x45\x2c\x71\xcb\xe1\x56\x63\xd1\xb8\xc2\x1e\xec\xf2\xdf\xcf\x2b\x91\xbc\x3f\x7a\x7f\x56\x6d\x16\xd9\x33\x9c\xee\xd4\x4b\x13\x77\xad\xe9\xb7\x88\x92\x55\x56\x3b\x46\xde\x79\xa6\x60\x3d\x17\x3a\x78\xb6\xf4\x61\x1b\x5d\x8b\xb7\x94\x30\xc7\x05\x2f\xfa\x78\x4f\x01\xa7\x83\x7a\xc7\x25\xbc\xab\xab\xf1\xd4\x33\x77\x4b\x3b\xc0\x63\xe8\x26\x1e\xde\x13\x4d\xda\x82\x46\x0b\xce\x77\x19\x89\xb3\x3d\x5e\x03\x31\xc7\xb7\xdc\xe1\x74\x50\xef\xf8\x16\x37\x0f\xb7\xd8\x86\xf9\xf5\xc9\x2a\xe9\xe7\x89\x8a\xeb\xc4\x88\x12\x74\x13\xf6\x13\xe7\x85\x4d\x72\x07\x74\x3d\x14\xe3\x8f\x9f\xb0\x80\xd1\x41\xbd\x7b\x54\xba\xb6\xcd\xa5\x41\xb7\xe6\xe6\x4b\xf3\x38\xe9\x83\xce\xea\x0d\x52\x92\x6b\xf7\xbf\x1b\xa7\xb3\xe8\x67\x2c\x5f\xc2\xb1\x69\x47\x46\x7a\xb8\x38\xf8\xf7\x48\x5f\x46\x71\x79\x87\xd2\xf3\x4a\xb6\xb4\xd5\xe5\x33\x38\xa1\xaa\x17\x29\xdb\x6e\x3d\xc0\x78\x91\x64\x0d\xcc\x35\x21\x6a\xbc\x18\xa2\x90\xf1\x18\x4e\x77\x3a\xd2\xdf\xd5\xd9\x29\xe5\xdb\xa7\x3e\xaf\xc1\xd0\xea\xfb\xe8\x25\x95\x21\x93\x86\xf7\x5b\xe5\x50\x41\x3c\x6c\x10\x8d\x27\xa1\x54\xc8\x0f\x59\x19\x4e\xe7\x2d\x8b\x86\x09\x89\xf4\xee\x58\x63\xfb\xe2\x61\x7b\x4b\x7a\x42\x04\x5e\x5c\xb9\x2b\x41\xd5\x0d\x03\x9c\xd5\x53\x02\xaf\x67\x98\xf1\x11\x09\xf7\x2d\x8f\x23\x3d\x8c\xce\x5b\x16\x80\x8c\x46\x6d\xdb\xcc\x47\xbf\xa3\x78\x23\xf5\x07\x9b\xdd\xdf\xbe\xc8\x60\x76\xf7\x70\x7d\xf5\x54\x09\xcd\xf5\xd5\x2e\x13\xd1\x59\x48\x6d\x39\x8e\xf4\x70\xac\x9a\x93\x91\x9e\xbb\x88\xaf\x3c\xf3\xd0\xca\xe9\xf6\x8d\x81\xc0\x6b\x46\x32\xda\x7d\xcc\xbe\x9f\xf3\xdf\x11\xe2\xfb\xd3\xe8\x3c\xe7\x22\x9b\x58\x39\x21\xcd\xfc\x6c\xc6\x36\x39\xad\xf8\x6e\xda\x6f\x3d\x06\x63\xa4\xee\xee\xf3\x77\x83\x3d\x18\x3e\x43\x99\xdf\x53\xd4\xed\xfa\x25\xb7\x17\xfe\xb7\x45\x7a\xb8\x4b\x3b\x11\xe9\x49\xc8\x20\x01\x4c\x29\x8a\xc8\xf3\x7b\x68\xcf\x77\x9c\x4c\xe7\xb6\xb0\x01\x74\xfb\x0b\x0b\x58\x82\xd3\x0a\xad\xb9\x3f\x2f\x87\x87\x04\xb1\x71\x7a\xff\x8b\x48\xef\x79\x2a\xd2\xff\xdc\xfe\xc5\xaa\xce\x8f\x4f\x46\xdb\x45\xac\x95\x9a\x6d\xc8\x14\x13\x48\x86\xcb\xc3\x37\xe6\x38\xe7\x5d\x62\x9f\xa1\x68\xf5\xec\x9f\x1c\x20\x0b\x9f\x4a\x9b\x44\xa9\x24\xb4\x52\x99\x8a\x3a\x1f\xe8\x3a\xa3\xce\x68\x57\xbb\xa5\xb9\x1f\x5c\x00\x58\xfb\x1c\x95\x9b\x39\xbe\x45\xfa\xab\xdd\xf8\x27\xc7\xe5\xa7\x23\x7d\x98\xc4\x11\xdd\x4c\xe7\x8d\xcb\x79\x76\x85\x9f\xb8\x5f\xd7\xb6\xaf\x8e\x57\x35\xaa\xd5\x99\x7e\x2b\x7d\x61\xe6\x6f\x3f\xc9\x5c\xf8\x4f\xae\xd6\xe8\xd4\xc7\x3a\x99\xe9\x6c\x89\x75\x0d\x91\xe5\x05\x1a\xad\xb0\x34\x63\xb1\xc9\x89\x2d\xd2\x51\xd3\x2e\x25\xa4\xad\x7b\x5b\xe1\x46\xd1\x7b\xfc\x93\xab\x3d\x1d\xe9\x6f\xa8\xd1\xf8\xd5\x81\xec\x0b\x23\x83\x06\x8f\xa6\x3a\xb1\x72\x5f\x67\xb8\xaf\x3d\x4e\x38\x8f\x6b\xff\xeb\xfb\xb3\xa7\x3a\x23\xdb\xff\x2c\xd2\xc3\x7d\x75\xff\xfa\x2e\xfd\x95\xf7\xdf\x3e\xf1\xd3\x9c\x2f\x17\x7a\xef\xe7\x3b\xb3\x60\x67\xb9\x81\xf6\xde\x25\x5b\xda\x80\xc8\x25\x4a\x09\xcc\x2d\xe4\x3d\x7e\x97\x1e\x46\x77\xea\x61\x68\xdc\xaa\xec\x2f\x94\x60\x88\xa5\x39\x8d\xbe\xc0\x61\x6b\xc1\x05\xa9\x81\x92\x7c\xc1\xeb\x74\x22\xd3\x54\x9f\x1e\x2d\xb5\x1c\x3f\x30\x08\xa7\x83\x2e\x93\x79\x5e\x96\xc9\x0c\x2a\xae\x79\x8d\x74\xe6\xc3\x67\x9f\x5d\x0a\x14\xae\xfc\x7a\xb6\xe1\x5d\xf1\xe1\xac\xc0\x25\x9c\x27\xa5\x89\xc7\xef\xd3\xc1\xe9\xa0\xcb\xe4\x56\x50\x5e\x8a\x61\x19\xe7\x8c\x60\xa6\xaf\xe1\x79\xee\xc1\x16\xf4\x6f\x67\x15\xd9\x7f\x15\xf7\x5e\x5b\xbf\x14\x57\x7a\xf8\xf0\x78\x3b\x0d\xa7\xf3\x96\xc6\xf9\x8f\x71\x98\xa7\x3b\xb0\x1a\xc0\x7a\x14\x48\xf1\x5d\xe7\xb9\x01\xc9\xe0\xa3\xc3\xbe\xed\xf0\x10\xca\xde\x1b\x95\xe5\xa3\xf7\x3b\x38\xc4\x4d\x90\x5b\x1c\xb8\x09\xe0\x6f\xde\x5d\x2c\x55\xbc\xd7\xdd\x38\x44\x2a\xd0\x85\xe3\x47\xa1\x9f\x5e\xc7\x2f\xbf\x1b\xb6\x38\xda\x7b\x6b\xa8\x30\x79\x47\xce\x48\x6f\xf7\xf8\xe5\x06\x18\x1d\xd4\xbb\xf3\x66\x0f\xc2\x2e\x2a\xa9\x2c\x9e\x37\x1c\xbb\x70\x9f\x8e\xac\x86\xf9\x2c\x8e\xc0\xeb\x35\x47\xa1\xb5\xe5\xcd\x50\xcb\x7b\x2f\x9f\x21\xeb\xc2\xe9\xa0\xde\x59\xdb\xe2\x14\xd4\xac\xcd\x37\x16\x7f\x15\xba\x99\x1a\xe8\x61\xff\x84\x86\x8c\x75\x65\x6b\xf5\xeb\x1b\xdb\x0d\xd6\x18\x66\x29\x4e\x64\x5d\x38\x1d\xd4\x3b\x9e\x7e\xbd\x94\x50\xec\x3b\x87\x29\x26\x16\x79\xe6\xd4\xd1\xa6\xd4\xe9\xb7\x14\x5f\xcf\x84\xfe\x8a\xba\x5a\x75\x8f\x45\x53\xc3\xf1\xf8\x9d\x5e\x18\x1d\xd4\x3b\x32\x36\xb3\x04\x4e\x4a\xa6\x3b\xd4\x6b\x3c\xee\xd1\x01\x36\x5f\xbf\x99\x89\x49\x84\xe4\x60\x30\x1a\x6e\x0c\x9a\x4d\xc8\xa2\x33\x22\xbd\x83\x9b\x45\xff\xe6\x5d\xd0\xe6\x4c\xc0\x63\xa7\xb2\xe7\x83\xbf\x2a\x30\x02\xa6\xd2\x69\x85\x97\x68\xd4\xc8\x06\x23\x3b\xe5\x7f\xf3\x1c\x7e\x0d\x29\x3e\x8e\xc8\x70\x3a\xa8\x77\xbd\xd4\x9c\x5b\x5b\xa3\xb4\x2d\xf7\x89\x56\x26\x45\x0f\x85\x9e\x35\x03\xdc\xf1\x7a\x5b\x7a\x4d\xe7\x52\x74\x7e\x7a\x68\x8d\x1d\xd7\x85\xd3\x41\xbd\x93\x76\x08\x6e\x9f\xdd\x4d\xeb\xc7\xd2\x5f\x6f\x4d\x8c\xf7\xfb\xf1\x13\xf0\x73\xb2\xf4\x1f\xc8\xab\xb5\xb1\x9a\x95\x3f\xa3\x71\x88\xac\x0b\xa7\x83\x7a\xd7\xed\x40\xf1\x29\xf4\xd1\x2e\xff\x30\x46\xad\x87\x43\xd6\xc6\x13\xd1\xc0\x3b\x2b\xac\xce\x67\xa2\xf8\x1f\xbd\xc3\x8a\xec\x20\x20\x40\xd6\x85\xd3\x41\xbd\x23\xa5\x52\x0b\x49\xbb\xe4\x5d\x26\x33\x8a\xf6\x1e\xa7\x72\x9a\x5f\xdb\x99\x67\xbf\x8e\xfc\x25\x8b\x84\x32\x63\xad\xde\xbd\x0f\x4f\x91\xde\xc1\x2d\x45\x7f\xf3\x4e\x08\x3f\x98\xa6\x93\xf4\x85\x05\x21\xc6\xa5\xf3\xeb\x7e\xd1\x64\x43\x2f\x69\x16\x30\x6e\xc6\xed\xf3\x2a\x3e\x62\x8b\x2a\x06\x8e\x9f\x84\x80\xd3\x41\xbd\xcb\xd7\x7e\x37\x9d\x56\x1f\x3d\x23\x61\x78\xe9\xa2\x42\x49\x2f\x1b\x1f\x5b\x56\x65\xca\x22\x4e\xbe\xf7\xa7\x11\xb7\xb3\xb6\x32\xc7\xb7\xd2\xe0\x74\x50\xef\x52\x58\xe8\x13\xd1\x0d\xed\xc3\xbc\x3a\x2f\xf9\x57\xdb\xf8\x71\xfb\x76\x67\x4b\x7c\x9c\x44\xdb\x15\x8e\xa7\x8f\x35\xde\xd4\x3d\xbe\xe5\x05\xa7\x83\x7a\x67\xc4\xef\x26\xe6\x53\xa9\xa1\x7b\x4e\x7e\xa8\x26\x61\xe9\xaa\xa4\x69\xbf\xcc\xb8\x21\xfa\xe6\xd6\x86\x9a\xcf\x6a\xaf\x6e\xf5\xf1\xed\x18\x38\x1d\xd4\xbb\xb4\xf7\x34\xa9\x6c\x8e\x86\xaf\xdc\x67\x47\x36\x19\x2e\xbe\x0a\x18\x27\x66\xbd\xd6\x91\xc3\x79\x5b\x8a\x0d\x3d\x4f\xee\x13\xe1\xf1\xd3\x31\x70\xeb\xf9\x5f\x5f\x9a\xe0\xaa\xed\xde\x70\x68\x7e\xb2\x75\x85\xf2\x91\xc4\xf8\x04\xc6\x4e\xf8\x4e\x27\x77\x54\xdf\x2c\x5a\x7a\x71\x3b\x17\x81\x51\xd9\xf1\x4b\x13\x30\x3a\xa8\x77\x5c\x0c\x51\xd1\x3d\xb4\x78\xe7\x12\xb1\x9f\x47\x1b\xa5\x57\xec\x5c\xd5\x2c\x30\x1a\xf4\x60\xff\x22\xcd\x2d\x18\x8a\xc6\xf0\x45\xf1\x38\xbe\xc1\xe8\xa0\xde\x7d\xa5\x0e\x45\x6c\x5f\xfc\xfd\x6b\x0e\xbd\x22\x8f\xc1\x5f\xf2\xe3\xeb\xe0\x0b\x21\xe6\x59\x8f\x7e\x9d\x9b\x9c\x8d\xd0\xa9\x93\x3f\x7e\xd1\x0c\x4e\x07\xf5\xae\x1a\x67\xb9\x53\xef\x5a\x57\xe9\x7c\x9a\xc3\xc4\x95\x8f\x1b\x20\xe3\xd2\xc1\xb2\x30\xe1\x7a\xef\x05\xdf\x9c\xde\x49\xf7\xdf\x75\xc7\xb7\xe8\x60\x74\x50\xef\xda\x2e\xf3\x39\xb1\x67\x39\xd2\x95\x61\x3a\x4e\x27\xda\xbf\xd5\xbc\xbb\x41\x94\xc0\x65\xc3\x68\x85\x2e\xec\x25\xd1\xc3\xe8\x49\x83\xf4\x0e\x6e\x53\xf4\xd7\xdf\x9d\xb1\xc3\x4c\x6f\x97\xc1\xa5\x36\xe7\x82\xa1\xbd\xf4\xf3\x81\x0f\x30\x89\x4c\x29\x5b\x19\xb9\xb0\x56\x9d\xf9\xe2\xf1\xc6\x88\x8f\x7f\x77\x30\xba\x53\x73\x66\xcb\xd4\x19\xb3\x0a\xf3\xa8\x51\x0a\x51\xd3\xf6\xbe\xe7\x3d\xe7\x44\x29\xba\x58\xe6\x03\x3d\x31\x99\x64\xfb\x9b\xd3\x2a\x8e\x39\x3a\x70\x3a\xa8\x77\x82\x3f\xfc\x24\xee\x6c\xff\xd8\x4c\xa2\xe3\x7d\x5b\xfd\xcb\x54\xea\xce\x2f\x91\xe0\x54\xf3\x4b\x24\x0f\x86\x8f\xba\x93\x5f\x6b\x0e\x1d\x1f\x97\xc0\xe8\xa0\xde\xa9\x0b\xd4\x6a\xae\x7f\x3d\xfb\xf3\x2a\x97\x92\x95\xf4\x1d\x73\x25\x52\x6d\xd5\x82\xa3\xa4\xc1\x47\x7b\x06\xcd\xda\xb2\x26\x8c\x61\xc8\xba\x70\x3a\xa8\x77\xd7\xa5\x0e\x95\xc3\x71\xd5\x97\xe4\x89\xbc\xbe\x84\x8c\x81\x34\x73\xdf\xd7\x47\x46\xbb\x2a\x35\x39\x92\xf0\x45\xcc\x03\x7f\x2d\x22\x23\x3d\x5c\x1c\xfc\x7b\xa4\xff\x3e\x79\xd0\x41\x1a\x47\xed\x76\x3d\x52\x5e\x3e\xff\xc1\xd3\xb9\x40\x12\xd6\xb5\x50\x11\xa9\xc6\xfd\x9c\xda\xce\x41\xb4\x6a\x42\x64\x3c\x86\xd3\x9d\x8e\xf4\x38\x9f\x9d\x82\xf7\xf7\x83\x92\xee\xec\xa7\xbc\x25\x66\x69\x09\x62\x2d\xf3\x67\x91\xda\x9b\xf1\x67\x20\x1b\x9c\xe6\x5c\xe2\xf6\x46\x56\x86\xd3\x9d\x8e\xf4\x75\x66\x89\xbd\x3f\x23\xea\x07\xa8\xae\x23\xa2\x25\xbf\xbd\x0c\xde\xdc\x3a\xe7\x5f\x52\x72\xe5\x87\xeb\x63\x7c\x4f\xf5\xb7\x11\x81\xc8\xca\x70\xba\xd3\xa3\xf1\xec\x5a\x74\xb6\xa7\x68\x38\xa6\xd9\x2f\x69\xa2\xec\xcf\x2a\xfb\xc3\x5f\x5f\xcd\xb7\x12\x5b\x0e\xd9\x9b\x85\x27\xad\x6c\x7a\xe5\x1f\x47\x7a\x38\xa6\xec\xc9\x48\x5f\xd2\xd6\xb1\x91\x82\x6d\xe6\xed\xc9\x61\xc9\xf7\xb6\xff\xcc\x2f\xe7\x9b\xc3\xdf\xb6\xbf\x88\x6f\x3b\x9a\xb6\x7d\x52\xfd\xf4\x62\xf3\x84\x54\x3f\xd1\x9b\xbe\x09\xdb\x44\x99\xea\xb2\xe4\xfb\x60\xaf\x98\x5b\x7d\x33\x07\xd1\x0f\xbf\xed\x8b\xb4\x80\x86\x0c\xbb\x59\xe7\xe9\xff\xb7\x45\x7a\xb8\x4b\x3b\xf9\x2e\x3d\x34\xd2\xa3\x75\x28\xca\x17\xa4\x7a\x32\x74\x88\xba\xc5\xc5\x1b\x3a\x18\x2a\x72\xe0\x9e\x65\xd9\x6b\xe4\x6e\x7c\xec\xfe\xcc\x60\xa8\x9d\xf3\x5f\x44\xfa\xda\x53\x91\x3e\xe7\x8e\x20\xf1\x6c\x27\xee\xd8\x8f\x06\x05\xbb\x77\x0e\x9e\x58\xbc\xd7\x89\x86\x93\x0d\x17\x33\x46\x38\xb4\x46\x79\x5c\xa2\xfe\x27\xe3\x85\xfa\x00\xf9\x74\xa4\xa7\xba\x31\xff\xe4\xb3\xee\xda\x81\xd4\x3b\x8b\xa9\xbd\xfb\xed\xc5\x64\xa6\x4a\x83\x85\x0d\x00\x55\x48\xdf\x65\xa5\x3d\xa7\xb9\x0b\xff\xe4\xb8\xfc\x74\xa4\xc7\x13\xa3\xe2\x96\x0f\x78\x83\x37\x71\x44\xac\x46\x6e\x42\x54\x9b\xad\xad\x0a\x36\xe6\x9a\x34\x75\xff\xb2\x36\x0b\xdf\x8b\x2d\xfb\x27\x57\x7b\x3a\xd2\x6b\x76\x95\xf2\x04\x4a\x15\x5d\x49\x68\x66\xdb\x48\xad\x5c\xfc\x79\x56\x02\xef\xf7\xab\xe7\x16\x4b\x6f\xed\xcf\xaa\xca\xcf\xa9\xd7\xfc\x93\xab\x3d\x1d\xe9\x0d\x02\xd8\x12\xc4\x85\x65\x56\x33\xdc\xcb\xde\xcd\x96\x8c\x72\xe3\x19\xb9\x31\x76\xee\xd9\x15\xa3\x1b\xfc\x14\xaf\xf8\xce\x3e\xf4\xcf\x22\x3d\xdc\x57\xf7\x6f\xcb\x64\xec\x6c\x64\xf2\x95\x90\x0e\x9d\x2e\xa1\xc1\xdb\x6d\xaf\x44\x23\x37\x95\x1e\xc7\xfc\x1e\xfb\x61\x22\x7a\x3d\x1b\x51\xa7\x24\x7c\x7c\x87\x1a\x4e\x07\x5d\x26\x99\xeb\xb2\xb3\xa6\x13\xf0\x73\xf9\xf2\x6d\x79\x32\x77\xac\x37\xd9\xdf\xdc\xe9\x34\xa8\xfe\x4d\x9f\x9a\xfe\x1e\xcf\x65\x82\xbf\x1e\x59\x17\x4e\x07\x5d\x26\x8b\x2f\x17\x18\xec\xa8\xcb\x7d\x54\x9c\x12\x22\x53\x95\x24\x8a\x6d\xfa\xed\x4a\x65\x69\xc1\x77\xaf\x24\x3f\x94\x39\xba\xc5\x2b\xeb\xf8\x34\x04\x46\x77\x6a\x99\xcc\x6c\x0f\xf7\x32\xcf\x6b\x18\xae\x9a\xf9\x5a\xb2\x25\xe4\x6e\x66\xb0\x11\x30\x76\xb1\xef\x47\x22\xcd\xf7\x28\x80\x47\xef\xf8\xa9\x02\x38\x1d\x74\x1c\x7e\x3d\x2a\x5b\xb1\xc0\xdb\xeb\x02\x89\x7f\x44\x18\x94\x8e\x59\x09\xff\xc8\x38\x44\x67\x0c\x0b\x1a\xec\xce\xcb\xc1\xe7\x8b\xdd\x47\x6e\x71\xe0\x26\x80\xbf\xa2\x9e\x38\xe2\x71\x45\xc4\x2a\x10\x84\x9a\x0a\x73\x77\xee\x02\xfc\xef\xb1\x6c\x87\x3a\x71\xfd\xaa\x98\xa6\x79\x36\xfd\x16\x43\x64\x8f\x51\x4f\x30\x3a\x68\xcf\x3e\x21\x17\x9d\xbd\x59\x38\xe7\x2b\x2f\x22\xc6\x73\x83\x9e\xbb\xd9\xf2\xa7\x36\xc8\x33\x2b\x7b\x78\xba\xd5\xe5\x06\xf8\x9d\xc1\x40\xd6\x85\xd3\x41\xbd\x4b\x18\x95\xe9\x61\x13\x24\xe0\xc7\x21\x91\x7c\x56\x5a\x9f\xcc\x49\x74\x76\xeb\xbe\x1d\x2e\x39\x21\x50\x56\xeb\x8d\xa7\xdd\x86\x89\xac\x0b\xa7\x83\x7a\x87\x19\x94\x6f\x48\xe4\x2a\xc9\x76\xd9\xda\xc5\xdd\xe7\xf5\x72\x9c\xb4\x25\xe5\x63\xe5\x92\x29\x37\x53\xf6\x47\x0a\xcc\xdb\x38\xc7\x0f\xb1\xc3\xe9\xa0\xe3\x00\x82\xf9\x64\x41\x7e\x3c\x7b\x47\x39\x1e\xae\xb7\x15\x7b\x48\xa6\x5e\xdb\x04\x65\x19\x3a\x1d\x50\x3b\x68\xf2\x05\x4e\x94\x28\x1c\x23\xd6\x60\x66\xd1\xbf\x46\xfa\xe7\xd8\xa2\x5c\xd3\x38\xd4\xb2\x04\x21\x77\x4a\x63\xef\xcb\xb9\x32\x69\xc4\xd9\x3c\x5f\x7a\xee\x11\xfa\x6d\xc2\xb9\xe7\x95\xf9\x71\xa4\x87\xd1\x41\x7b\xce\x88\x4f\x59\xb6\x9a\x92\xa8\xc0\xb9\x5d\x42\xfe\x6a\x4e\xd5\xd6\xb0\x82\x79\xee\x9a\x5e\x47\xf8\x0d\x79\xef\x7b\x63\x83\x1b\xc7\x0f\x43\xc3\xe9\xa0\xde\x35\xf6\xa1\x83\xa9\x9f\xe9\xec\x5b\x3f\xdd\xc9\x4e\x11\xb7\xd8\x36\xa6\x94\xb4\x2d\x68\x2c\xdd\x7d\xb1\x37\xa4\xdc\x12\x13\x94\x7e\xfc\xfe\x26\x8c\x0e\xea\x9d\xb8\xae\x64\xf0\xd5\xd9\x78\xe5\xea\xc2\xd6\x9e\xec\x89\x7d\x06\x8f\xdb\x5f\x44\x80\x0b\x5b\xb9\xd7\x31\xca\x0a\xb3\x5e\x16\xac\x22\xeb\xc2\xe9\xa0\xe3\xa0\xd9\x12\xe4\xdc\x28\x4e\x41\x5a\x79\x26\xcf\xea\x55\x9d\x7f\x9e\x6c\x74\xaf\xe0\xcb\x00\x72\x0b\xf9\xd7\xa6\x51\x97\x3f\x3f\xe0\x3b\x7e\xa7\x17\x66\x29\xfa\x9b\x77\x19\x8c\xb9\x33\xc9\xac\xf8\xf4\x9e\xd4\x37\xa4\x17\xae\x47\x17\x6c\x65\x79\xe1\xe7\xa0\x01\xbd\x39\x7e\x1c\x47\xcb\x8f\x64\x8f\xb7\xd4\x70\x3a\x68\xcf\xf8\x25\x8f\xae\x30\xdb\xd2\x91\xfd\x28\xb0\xbe\x81\xe7\xb6\xe8\xc2\x9b\xf6\xa2\xa4\xd7\xe4\xec\xf6\x57\x97\x7a\x3c\x4d\xf7\xfd\xe3\x53\x6f\x38\xdd\x29\xef\x0a\x65\xaa\xf3\x47\x26\x8e\xae\x27\x1a\x69\x6c\x38\x6b\x54\xab\xd4\x6f\x55\x55\x68\x2c\x5c\x6b\x25\x3c\xbf\x46\x54\xc0\x55\x71\xec\x1d\x8c\x0e\xea\x5d\x76\x24\x41\xcd\x59\x09\x92\xf0\xf2\xeb\xfa\xb7\x8b\xb2\x1e\xde\xe8\x92\x60\xab\x2b\xe9\x2a\x31\x3d\x10\xe6\x7d\x5d\x3d\x19\xcb\x80\xac\x0b\xa7\x83\x8e\x43\xd0\x60\x4b\x6b\xfa\x05\xda\x1c\xe1\xaf\xd4\x37\x03\xe5\xed\x78\xe3\x5f\x56\x59\x94\x94\x3d\x7b\x8b\x2f\x23\x3f\xde\xef\xa0\x1d\x85\xf4\x0e\x6e\x3d\xff\x9b\x77\x55\x2f\xd9\x13\xe2\x7d\xba\x36\x8d\x8a\x6c\xdd\x3f\xba\xad\xc5\xfa\x68\xcc\x47\x68\xbc\x1f\xa8\x23\xd6\x60\x09\xed\x4d\x7b\x7c\x7c\x3a\x0d\xa7\x83\xf6\x2c\xc5\x44\xeb\xcc\x8b\x5f\xba\x4c\xc3\x31\x8e\x7d\x30\x85\x37\x10\x27\xaf\x1c\x87\xf1\x26\x89\x31\x0e\x6f\xa1\x43\x28\xfe\x8b\x0a\xb2\x2e\x9c\x0e\xea\x9d\x8d\x20\x7d\x81\x56\x96\x93\x2e\x49\x93\xcf\x8b\x71\xee\xb8\x83\xa7\x73\xdd\x8e\xf3\x0f\xd0\xf8\x7d\xc4\x67\x55\x6c\xd5\x24\xdc\x91\x75\xe1\x74\x50\xef\x98\x32\xb7\x15\xa7\x9e\x34\xc7\xaf\xe4\x74\x2f\xb2\x9b\x33\x76\xec\x57\xbf\xea\x7a\x63\xca\xc2\x09\x0e\xdd\xb8\x72\x29\x78\x2b\x0d\x59\x17\x4e\x07\x1d\x87\x14\x77\x86\xbb\x0b\xed\x66\x8b\xfa\xcc\xc5\x57\xdf\x49\xa8\xf7\x29\x5f\x71\xc2\x3f\x78\x4f\x5b\x80\x7f\xb6\x33\x4c\x2a\x75\x60\x10\xe9\x1d\xdc\xa6\xe8\x6f\xde\x95\x90\xa5\x67\x88\x7a\xa5\x5f\xf8\xbd\x93\xfe\x82\xfc\x35\x49\xe6\x45\xdb\x09\x63\x56\x35\x1a\x1c\xc6\xd8\x2b\x8e\xe8\xcd\x33\x19\xc8\x9e\xe1\x74\xd0\x9e\x99\x96\xee\xef\x6c\x5f\x7d\x57\xee\xc5\xf1\xf3\xb0\x36\x5f\x35\xe8\xc0\x36\xad\xd0\xa5\x31\x2b\xa2\xe1\x86\xf1\xfb\xbc\xcf\x71\xc7\xb7\xf3\xe1\x74\x50\xef\x68\xfa\x84\xe9\x42\x94\x3c\xa8\x23\x43\x76\x45\x43\xe3\x2a\xaf\x89\xe8\xbc\x7f\x33\xae\x2f\xba\x9c\x65\xe9\x7c\x99\xec\x5b\x22\x36\xb2\x2e\x9c\x0e\xea\x9d\x56\x9c\xf1\xd8\x53\xfa\x46\x55\xd6\xac\xd9\xaa\x2a\xf5\x0f\x15\x31\xd1\x1e\xbf\x99\x05\xdb\xc7\x6f\x36\xab\xd8\x05\x6b\x4a\x97\x1e\xbf\xf8\x03\xa3\x83\x8e\x83\x21\x10\x5b\x39\xf2\xc1\x97\x34\x0f\x4f\x49\xd8\x73\xc6\xbc\x8f\x69\x35\x49\xf4\xd5\x10\xda\xb8\x0a\xa9\x50\x54\x61\xf2\x6a\x23\x32\xd2\xc3\xc5\xc1\xbf\x47\xfa\x6f\x5f\x9b\x1c\xcf\xc8\x45\x6f\x5f\x79\x2f\x24\x91\x96\x6d\xfd\xaa\xa4\x36\xe9\xc1\x08\xd6\x33\x81\x58\x6e\xe1\x37\xe8\xab\x67\x52\x8e\xdf\x4b\x87\xd1\x9d\x8e\xf4\xe5\xe7\xaa\xd9\xd7\xee\xcc\x79\xdd\x44\x98\x86\x57\x93\xc9\xaf\x55\xe5\x5a\x5f\xd6\x29\x7d\xa2\x63\xb9\x7c\x5b\x96\x3a\x99\xb8\x0a\x59\x19\x4e\x77\x3a\xd2\x97\xa5\xac\x2e\xe0\x76\x8b\x26\x33\x87\x7d\x56\x3a\xb8\xfb\xd5\xd1\xbb\x65\xf8\x66\x41\xc2\x12\x13\x5a\x48\x11\xe8\xa2\x1f\xc9\x77\xfc\x64\x01\x8c\xce\x5b\x16\x07\x7a\x83\x03\xb7\x95\x4f\x7e\xc0\x7b\x66\xfb\x10\x97\xc0\x44\xcc\x94\xf4\x69\xd9\xf0\x64\x73\x8f\xcd\x83\xcf\xad\x7c\x1c\x35\xec\x8f\x8b\x8e\x23\x3d\xdc\xdf\x7e\x39\x19\xe9\x15\x28\x7e\xc7\x4b\x58\xd6\xec\x32\x6e\x49\x16\x10\x30\x5b\x0a\xb5\x7a\x5e\x13\x1e\xe3\x5f\xe0\x9d\x55\x33\xf8\x8a\x5d\xde\x9f\x76\xf2\x9c\xf1\xbe\x61\x93\x5a\xd3\x4f\xbb\xe6\x67\x25\x13\xe7\xf2\x29\x74\x0d\x0c\x36\x28\xf8\x70\x06\x87\xe3\x29\xfd\x5d\x38\xba\x71\x6f\xff\x6f\x8b\xf4\x70\x97\x76\xf2\x5d\x7a\x68\xa4\x57\x4b\xb1\xa4\x78\x2c\xe1\x50\x22\xca\xe9\x4e\x1c\xbf\x49\xc7\x1b\xd9\xbc\x04\x06\x56\x45\x27\xdb\x5c\xbb\x75\xc0\xc3\x57\x56\xfa\x2f\x22\x3d\x9a\x0a\x34\xf6\xe5\xa5\x12\xf7\xef\x60\xca\x05\xda\xf8\x0f\x1f\xb4\x05\x5e\x9d\x9d\xdf\x2a\x62\xa6\x09\x56\xbf\x1e\x7c\x80\x3b\xbc\xcd\x5c\xae\xfa\x4f\x0e\x90\x4f\x47\xfa\x79\x3a\x4e\xff\xe0\x2c\x4e\x8c\xf1\xed\x2e\xfa\x43\x2d\x9a\xea\x01\x0e\x92\xee\x8c\x07\x75\xeb\xc6\x1f\xb3\xaa\xba\x7d\x9d\xfe\xc9\xb9\x35\x9a\xd6\xa9\x8f\xa5\x63\xcb\x79\x44\x1e\x12\xc1\xb0\xd3\x56\x2f\xda\xcf\x7b\x38\x3a\x99\x97\x97\xb0\x5b\x9e\x1b\x53\xf7\x5e\x34\xa6\xc3\xa5\xe9\xc7\x3f\xb9\xda\xd3\x91\xde\x41\xff\xf5\xa0\x76\x56\x0a\xe6\x48\xf0\x4c\xcd\xcf\x9d\x17\x65\x99\xa3\xfa\xfc\x17\x32\x6d\x97\x19\xac\x34\x9d\x02\x0b\x06\x04\xfe\xc9\xd5\x3e\x3d\xf5\xb1\x2b\x51\x39\x0e\x53\x8c\xcc\x3c\x71\xb7\x8a\x53\x43\xed\x84\x5b\x54\xed\xca\xab\x93\x8c\x19\x6d\x1e\x60\xb7\xf5\x61\x60\xf3\x70\xfc\xb3\x48\x0f\xf7\xd5\xfd\xdb\x32\x19\x95\x32\xcd\xe3\x96\xf5\x36\xbb\x52\xe3\xe3\xa8\xa0\x03\x09\xf7\xee\x1a\xae\xfa\xd3\xc3\x29\x59\xc0\xee\xc5\x88\x54\x81\x30\x0f\x72\x79\x80\xd3\x41\x97\x07\x13\x36\x0a\x5f\xff\xe6\xf9\x0b\x17\x52\x6e\x57\x51\xa4\x85\x04\xde\x75\xbd\x52\x79\xa9\xc9\x87\x7c\xea\xd5\xab\x09\xb4\x37\x84\xc7\x64\x7a\x38\xdd\xa9\xf7\xd3\xf2\xfa\xb9\x4d\x34\x14\x7f\x27\x6f\xb5\x5f\x67\xbd\xae\xfa\x49\x74\xa8\xd0\xcd\xc5\x24\xe1\xf3\x43\x52\xc1\xb9\x05\xfb\xe1\x81\xe3\xf7\xd3\x60\x74\xd0\x65\x92\xca\x58\x29\xd5\x8d\x63\x66\x10\x21\x62\xc6\xd5\x5a\xf8\x33\xfe\x10\xcb\x46\x4f\xb6\x8b\xff\x7c\x4a\x41\x91\x50\x8a\x80\x8f\x34\xb2\x2e\x9c\xce\x5b\x1a\x0d\xe7\x64\x5d\x97\x5d\x77\xf4\x35\xab\x78\x1a\x4f\x0c\x77\xce\x77\xe8\xcd\xba\x51\x7e\xe1\x93\xb2\x3b\x98\x86\x3b\x45\x9f\x87\x03\x3b\x46\x16\x90\x5b\x1c\xb8\x09\xe0\x6f\xde\x3d\xcd\x7a\x42\xfe\x08\x11\x47\x45\x9e\xcf\xee\x77\xcf\x84\x7c\xee\xb5\x4f\x04\x19\xa5\xd1\x93\x5b\xb2\xcf\xd1\xdf\xe5\xd4\x8e\x1e\xbf\x23\x0b\xa7\x83\x7a\xb7\x63\x48\x99\x7e\x2b\x70\x2d\x28\xe4\xb6\x9f\x10\x78\x9f\x06\x8c\x0d\x8b\x2d\x14\xc9\x95\xd9\x9e\x2d\xdd\xb3\xca\x97\xfd\xb0\x7c\xcc\x2b\x80\xd1\x41\xbd\x6b\x6e\x92\x95\x3a\xdf\xdc\x7e\x34\xf7\xbd\xd9\xcf\xb7\x5c\x96\xda\x9f\x87\xac\x47\x88\x75\xcf\x0d\x9c\x10\x63\x6e\x08\x5b\x3c\x3e\x21\x83\xd3\x41\xbd\x0b\x18\x14\x54\xd4\x76\x8c\x3c\xfc\xa1\xb0\x36\x1a\xac\xa7\x97\x6c\x1d\xf5\x5e\x3a\xfa\x9a\xd8\x38\x7e\x99\xe2\xf4\xc3\x1e\x5e\x7f\x64\x5d\x38\x1d\xd4\x3b\xbe\x4e\x27\x71\xc6\xb1\x1f\x8c\xc9\x3e\x6d\x68\xd7\x64\x2d\x37\xaa\x68\x2d\xbb\x94\x0f\x4d\x5e\x1b\xa8\x5d\x11\x76\xd6\x65\xac\x42\x7a\x07\x37\x8b\xfe\xcd\x3b\x15\xbe\x0f\x8b\x6a\x21\xeb\xcd\xf2\x5c\x57\x29\x47\x99\xdc\xe4\x6b\x64\xd3\xc2\x6c\x4a\xca\x78\x4a\xaa\xc3\x0a\x6f\xac\x1b\x1c\x3f\x44\x0a\xa7\x83\x7a\x37\x30\x25\x6b\xa5\xca\x5a\x64\xa9\x70\xf4\x29\x35\xc7\xe0\xac\xb4\x45\xf2\xff\xc3\xdc\x5f\x46\x55\x11\xb5\xff\xff\x38\xd2\x2d\x21\x25\x48\x09\xd2\x21\xdd\x20\x21\xa5\x74\x87\x84\xa4\x80\x02\x82\x74\xa7\x80\x20\x9d\xd2\x20\xdd\x5d\xd2\x20\x48\x2a\x2d\x20\x21\x48\xaa\x74\x89\xff\xf5\xf9\xaf\x75\xe6\xeb\x3d\x87\xdf\x9a\xfb\x01\x0f\xee\xe7\xaf\x75\x9d\x99\xfd\x3e\x33\xd7\x7e\xcf\xde\xd7\xb5\xb7\x5e\x22\x7f\xf0\x75\x7e\x7a\xab\xf0\x16\xa7\x94\x0a\x60\xe9\xa1\x38\xb0\x76\x13\xe5\x3f\x54\x09\x34\x6a\x8b\x3c\xda\x29\x6c\x33\x32\x91\xd3\x59\xba\x1f\xe0\xcb\xbd\x5c\x3d\x7d\x37\x27\x86\x35\x5d\xa5\x01\xac\x16\x42\x71\x70\x05\x2f\x74\xb4\x48\x75\xf7\x1b\x37\x95\x5a\xa2\x6b\xee\x75\xb1\x14\x91\x59\xd0\x96\x91\x1b\xe9\xbf\x75\xe8\x5d\x5c\x2a\x6a\x6d\x02\x6c\x21\x14\x07\xd6\x8e\xd9\x61\x45\x29\x2d\x77\xee\x6f\x23\x47\xfe\x5f\x0b\xd4\x05\x1f\xf5\x0f\x7c\x4e\x78\x38\x05\x0d\x64\x16\x6b\x79\x25\x2a\xdb\xd5\x30\xed\xa0\x52\xd1\x55\xda\x51\xdd\x5d\xed\x2a\x78\xc5\xdf\xfd\x14\xa9\xf8\x26\xb7\xd4\xf3\x47\x3d\xde\x3c\x8d\x82\xe3\x44\x0d\x88\x41\x93\xf8\x2b\x8e\xdf\x80\x82\x17\x28\x0e\xac\x9d\xc6\x4f\x54\xb7\xdf\x22\x4c\xdc\xdc\xa3\xf9\x15\xd1\x34\x3d\xce\x89\xd9\xc5\x68\x7d\x07\xc2\x51\x3a\xea\xc3\xb7\x57\x50\xd7\x3e\x02\x53\x75\x08\x0e\xae\x96\x7e\x68\x49\x7a\x5b\xfe\xa8\xda\x9f\x26\x68\x99\x36\x6c\x74\xbd\xa0\x99\x16\x6f\xf2\xa7\xeb\xf8\x9a\xcc\xbb\x18\x21\x5b\x2c\x52\xa0\xce\x1b\x82\x03\x6b\x77\x22\x3b\xfb\x45\x37\x4d\x78\xc6\xea\xb5\xcf\xe6\x94\xd8\x5f\xd2\x8b\x92\x0a\x9d\xdc\xd1\xd2\x3a\xe2\x66\x56\x85\xd5\xa9\x77\x5f\x81\xf7\x04\x04\x07\xd6\x4e\x81\xbd\xf7\x9e\xe3\x28\x6b\x3e\x7d\xf5\x62\xd7\xc1\xdc\x63\xcf\xd9\x5f\xf9\x6d\x9f\x8b\x23\xd1\x9e\x1e\xd8\x7d\x1e\xae\x3a\xa1\x85\x69\x07\x95\xcf\xaf\xd2\x8e\xdb\x85\x43\xd5\x89\x8a\x3b\xed\xdc\xee\x44\xad\x26\x8b\xd8\x52\x24\x84\x87\xde\x8b\x5c\x91\x6d\x55\xd6\x5f\xcf\x76\x53\xa3\x12\xd8\xb4\x0c\xc1\x81\xb5\xb3\xd1\xd9\x40\xdb\x3b\x55\xab\x8b\xfd\xac\x17\x35\x27\x41\x60\x71\x89\x20\xf1\x50\xf2\xbe\x37\xd3\xf2\x9d\xba\x17\x8b\x77\x8a\x6d\x60\x71\xa1\x38\xb0\x76\x37\x50\xb6\x0f\x82\xb4\x98\x99\x1f\x1d\x52\xb5\x68\x2c\x37\x95\x98\x0c\x5f\x52\x24\x26\xda\x8f\x72\x60\xd3\x09\xbd\xa6\xe6\x07\x76\x42\x40\x71\x60\xed\x62\x30\x87\x75\xd5\x9e\x48\x4e\x61\xf1\x24\x23\x0b\x9e\x9b\x55\x2d\x31\x70\x1d\xcc\x7d\xad\x17\xf3\x56\x21\x1a\xa9\xc7\xed\x01\x4e\x35\x81\xe2\xc0\xda\x9d\x92\xfc\xc0\x3a\x3c\x38\x8d\x67\x2d\x3a\xb2\x08\xb3\x37\x0c\x2f\x6f\x6c\x59\xa2\x76\x37\x9c\x4c\x13\xf4\xe0\x8b\x64\xb2\x99\x82\x69\x07\x35\x29\xba\x4a\x3b\x29\xd5\xbd\x42\xc2\x8d\x8b\x2d\x96\x45\x39\x8d\x17\x8c\x3b\xb7\x5e\x26\xf7\xf6\x5b\xc6\xa8\x0f\xfd\xc6\x18\x63\x18\x55\x6a\x06\x7a\xa6\x40\x71\x70\x2d\x45\xe7\xce\x68\xe6\x18\x4c\xb6\x2c\xcf\x62\xb3\xf9\x67\x3d\x2f\x08\xad\x56\x8a\x2a\x39\x29\x78\xe3\x28\xf4\x55\x8a\xd1\xf7\x81\x93\x26\xa0\x38\xb0\x76\xe8\xa6\x75\x84\x19\xf9\x33\xa8\xdc\xa2\x61\x22\xf7\x3c\x2f\x5e\x8e\x48\x75\x4b\x64\xcc\xdc\x3b\xde\x7a\x1c\x58\x13\x17\xb3\x07\xd4\xbc\x43\x71\x60\xed\x08\x7e\x24\xdb\x38\x52\x35\x6c\x3e\xa8\x5a\xae\x72\x47\x1f\x2d\xee\xc1\xd4\xe2\x44\xc9\x79\xa8\xf9\xd5\xb5\x8a\xb6\xfa\xdb\x31\x50\xe4\x01\xc5\x81\xb5\x7b\x3d\x2f\x32\x1d\x58\xce\xa7\x44\x65\xe9\xa5\xbe\xe5\xd0\x7a\x3c\xeb\x60\xf8\xa7\xa3\x02\xdd\x33\x4b\x39\x4f\x6b\x48\xb5\x98\x0e\x66\xe9\xa1\xec\xe0\xd5\x96\xbe\x49\xb0\xf5\x79\xc6\xd3\x5f\xa7\x89\x3f\x45\x1c\x90\x8d\xd8\x33\x1f\xbe\x29\x39\xd5\x4e\x3a\xac\xfe\xe5\x29\xba\x46\x9b\x85\x9f\x0e\xb3\xc7\x50\x1c\xbc\xa5\xff\x5d\xe6\xdb\x91\xeb\x90\x85\xe8\x43\xaf\xf6\x3d\x13\x73\xb3\x96\xe2\xae\xe5\xe6\x4d\x05\x9c\x0a\xda\xe8\x37\xbd\x64\xf7\x63\x8c\x61\x91\xa1\x38\x78\x4b\x9f\x72\x83\xc6\x27\x78\x23\xfb\x53\xac\x47\xf6\x7b\x46\xfa\x4f\xa4\x21\xb7\x49\x6f\x9f\x09\xa3\x98\xa0\x8c\xac\x3d\xf6\xaa\x50\x61\x80\x45\x86\xe2\x02\xa4\xa9\x41\xa3\x71\xa8\x94\xc3\xef\xa4\x3a\x32\xa2\x33\x21\x75\x86\xf8\xc7\xd6\x05\xc9\x7a\xde\x6e\xd8\x75\xab\xef\xcd\x8b\xa9\x4e\xfb\xb3\x79\x49\xc0\xd2\x43\x9d\xd1\xfa\xaf\xa5\x27\xd5\x7f\x40\xf5\x6e\x87\xea\x55\x56\xb7\x68\x58\x03\x31\x4a\x77\xad\x76\x6d\x26\x72\xb9\x2a\x83\xf3\x7d\xf2\x87\x62\xf3\xc5\xff\x76\xed\x1a\x2a\x6c\xe4\x8d\xd7\xb7\x79\xa3\xdf\xeb\x88\x8c\x51\x5b\x6f\xac\xf6\xc1\xba\x56\xa7\x2b\x72\x08\xa5\xa3\xac\x37\xc5\xe0\xb0\xf8\x7f\xcd\xd2\x43\xdd\xda\xbf\xb5\xf4\x60\x4b\xbf\x53\x19\xaf\x6c\x69\xbc\xc4\xe7\x71\x1e\x5d\x64\x56\xf9\x20\xa5\x06\x39\x46\xe0\x99\xd3\x07\xec\x01\xba\xe3\x8c\x8e\xef\x85\xfc\xd7\x61\xe9\x25\xe0\x2c\xfd\xf2\x73\xfd\x67\x3f\xea\x58\x63\x13\xbd\xf7\xb9\xc2\xb8\x28\xce\x1c\x9a\xd7\x07\x8e\xf9\x0a\x4a\x50\x35\x8f\x8d\x7f\xe3\xf0\x5f\xc7\xaf\x4a\xb7\xc3\x5b\xfa\xdf\xcd\x3b\x4a\xb9\x37\x05\x28\x9d\xba\x71\x77\x8f\x24\x7e\xe9\x4e\xb1\xdd\xee\xad\x08\x91\xfd\xa1\x95\xf1\x2c\x3f\x4d\x63\x8b\xe2\x5a\x96\xcb\xe1\x2d\x3d\xee\x56\x71\xbb\xad\xb9\x43\xad\xad\x4d\xca\xcf\x99\xaa\x7e\xa5\x18\xc1\xc0\x68\x74\x1e\x39\x85\x1a\xb3\xae\x15\x0e\xf9\xf6\xdb\xd7\x72\xb7\xf0\x96\x7e\xfb\x63\xaf\xa1\xb9\x43\x95\x61\xf9\xfc\xcf\x32\xef\xdf\x4f\xa4\x79\x55\xdc\x1b\x87\x33\xfc\x07\xbb\x3f\x37\x75\x9d\xc9\x1a\xaf\x5f\xcb\xdd\xc2\x5b\xfa\xc8\x96\x33\xd6\x9b\xd4\xea\xb3\x5d\x16\xcf\x30\x39\x83\x99\x95\xa2\x74\x9d\x0d\xb6\xbf\x6c\x76\x46\x18\x3b\xfc\xc8\x8d\xfe\x7d\x0d\xfd\xfd\xf5\xff\xbb\xbf\xee\x55\x69\xb2\x8c\x27\x05\x47\xf3\xaf\xda\x42\x7a\x9b\x16\x3a\x4a\xc3\x71\xea\xe3\xfb\x0b\x4b\x92\x04\x7e\x53\x4d\x23\xc6\xbc\xf6\xef\xf2\x59\x61\xe9\x01\x8a\x03\xa7\xc9\x46\x96\x2c\x74\xd2\x92\x04\x02\x4c\x59\xce\xc1\x89\xaa\x2c\xf6\xcc\x9f\x78\xa5\xad\x15\xeb\x4f\xdc\x3a\xf9\x22\x6f\xdd\x94\x15\x81\xc5\x85\xe2\xc0\x69\x32\x97\x5a\x26\x1a\xf3\x01\x4b\x72\x59\xee\x0e\x5b\xc1\x33\xf5\xc1\x02\xfd\x77\xa4\x0c\x06\x68\x77\x7b\xd7\x15\xde\xf7\x0f\x68\x03\x53\x32\x28\x0e\xae\xa6\xd7\xa7\xa9\x68\x44\x6c\xf2\x73\x9f\xf9\x1a\xc9\x5e\x47\xcc\x52\x26\xd7\x54\x39\x59\x7a\xb8\x41\xd9\x4c\xd7\xa7\xdd\x84\xe1\x43\xa0\xa6\x17\x82\x0b\x90\x44\xf0\xfd\x37\xae\x72\x74\x49\xb4\xeb\x01\x2d\x61\x66\x41\x59\x6e\x25\xf5\x37\x2f\x7b\xf7\xb5\xb0\x38\x65\x6f\xfe\x8b\xc7\x14\xad\x31\xf2\xe1\x86\xb0\x29\x0e\xd4\x0b\xe0\x2a\xed\x44\x90\x02\xdd\x85\xcd\x5f\x7f\x33\xca\x8b\x9b\x2a\x6a\x91\x7d\xd3\xcb\xc2\xe4\x80\x40\xe1\x5f\x10\x21\x11\xf6\xb4\xa1\x68\x66\x08\x68\x0b\x07\xc1\x81\xb5\xb3\xb2\x91\x26\x32\xa1\xc3\xfc\x78\x71\x97\x64\x6d\x68\x40\xd9\x41\xd6\xaa\xa9\x25\xfd\x3d\x09\x3a\x27\xb9\x4e\x05\x13\xe9\xb3\x17\xb0\xb8\x50\x1c\x58\xbb\x3b\xba\x9d\x37\xbc\x89\x27\xdc\x02\xa9\xc2\x6e\xbb\x28\xe8\xa3\xd2\xec\xa4\x0d\x4b\xe7\x51\xb9\x69\x39\x51\x57\x7f\xd3\xae\xfa\x09\x7c\x36\x81\xe0\xc0\xda\xed\xe8\x27\xb1\xfd\x1e\xd0\x63\x96\x5b\x4a\x9c\x59\x31\x0a\x39\x4b\x41\xd3\x0f\x5d\x2e\x3c\xb2\x14\x28\x3c\xee\x88\x94\x72\xef\x81\xc5\x85\xe2\xc0\xda\xbd\x69\x2a\xca\xaf\x5e\x7f\xee\xbb\xc6\x87\xf9\x62\x7a\x87\xc9\xe8\x71\x85\xe6\x36\x6a\x8c\x03\x32\xd7\xc7\x5a\x66\x82\xf5\x6a\x03\x98\x76\x50\x6f\xd1\xab\xb4\x5b\x45\xc6\xdb\xaa\xac\x43\x1e\x17\xb2\xe6\xa3\x23\x25\x56\x6e\x0a\x7c\xf2\xbd\x99\x8e\xda\xed\x48\xca\x2f\xbe\xef\x3e\x46\x1f\xb0\x19\x1a\x8a\x03\x6b\xa7\xfc\xab\xed\x8d\x2e\xc1\x65\x73\xc0\x97\xee\x5d\x86\x9f\x2a\xd4\x89\x25\x5b\x47\x0f\x59\xb8\x07\xd1\xdc\x1a\xa8\xfa\x87\x7f\xb9\xc1\xe2\x42\x71\x60\xed\x9c\x27\x74\x5d\x1c\x03\xa6\x06\x43\x3f\x35\x78\x1c\x29\xa7\xf7\xa1\xad\x62\xc6\x1d\xf1\xa3\x91\xd7\xba\xb9\x60\x78\x95\x74\x92\xc0\xe2\x42\x71\x60\xed\xf0\x3d\x2b\x2b\xbe\x2e\x84\x88\x71\x7b\xdf\x75\xa6\xb2\x89\x5a\x58\x3a\x92\x5f\x0c\x5f\x22\x1d\x4e\x59\x6c\x24\x56\x38\x2e\x00\x7a\x58\x40\x71\x60\xed\xac\xff\xf2\x63\xa4\xea\xf2\x73\x75\xb0\x71\xf8\x6f\xcc\x65\xdc\x7d\x1d\x9f\xb5\x60\xe4\xf5\x8e\x79\x90\xf7\x06\xc9\x4d\xa4\x91\xc7\x40\xd1\x04\x44\x2a\xba\x4a\xbb\x19\x94\xdf\xc6\x2d\x2a\x62\xf2\x3f\xfb\xb8\x4b\x10\xa7\xb7\x50\x3a\x79\x8e\x8d\x3a\xdf\x7d\x0e\x72\xbb\xe1\x30\x10\xe8\x5d\x1a\x0b\xbb\x66\x28\x0e\xac\xdd\x73\xf9\xd3\x4b\xad\x41\x04\xc9\x57\xfb\xad\xc2\x18\x4d\x37\xf5\xef\xe4\xde\xb6\x5c\x91\xa9\xac\xf7\xf8\xc6\xee\xa4\xd6\x55\xdb\x08\x8b\x0b\xc5\xc1\x9d\x34\xe1\xce\xdd\xa1\x74\x52\x16\xb1\xc6\x84\x83\x3b\x90\x20\x48\x8b\x33\xdd\x2c\xef\xa0\x37\xe2\x5f\x11\x72\x53\xd9\x2f\xe9\x4f\x2f\x60\x85\x20\x38\xb8\xd5\xc2\xe7\x86\xf4\xc8\x87\x7e\x0d\xea\x45\x73\x43\xbe\x3b\xd2\xe6\xc9\x49\x38\x54\x99\x6d\xa4\xf7\x73\x6c\x24\xf8\x7f\x1b\xc4\x00\xed\xbf\xa0\x38\xb0\x76\x0d\xce\x39\x5e\x76\x17\x0e\x4b\x7b\x78\xdc\xd1\x6f\xd2\x95\x12\xc8\xb1\x94\x86\xd6\xdc\xb6\xe7\x26\xf4\x5f\x96\x0c\xf0\xbc\x63\x03\xda\x52\x42\xe4\xf3\xab\xb4\x4b\xee\x67\xac\x58\x0c\x7f\x95\xa9\x25\x63\x9c\xc0\x67\x2a\x53\x77\xbe\x8e\xdc\x50\x12\x84\xb6\xb7\xde\xf3\xde\xfc\x4d\x2b\x2d\xf0\x0e\x82\xe2\xc0\xda\xa1\xf7\xa5\x6c\x32\xd4\x19\x72\xed\xff\x10\xf2\xc1\x1e\x6e\x3b\x33\x63\xbd\x54\x75\x12\x16\xf4\x7a\xff\x6b\x7e\xff\xbc\x0d\xcf\x19\xb0\x6f\x10\x1c\x58\x3b\xde\x9c\x5b\x89\x2c\x67\x05\x31\xf3\xdf\x84\xb3\xa5\x49\x64\x57\xa8\x49\xf8\xde\xa0\xab\x4a\xd5\xdf\x1d\xb5\x6b\x9c\x79\x9d\xb7\x08\xec\xc4\x82\xe0\xc0\xda\xbd\xdd\x9e\xfa\x7e\x37\xeb\x84\x66\xcb\x76\x76\xf0\x82\x84\xdf\xf1\x42\xca\xe8\x9e\x9c\xe9\x9f\x22\x6b\xa7\x55\x83\xf2\xf9\x39\xa0\x68\x0b\x8a\x03\x6b\xd7\x5e\xf9\x99\x06\x33\x18\xd7\x4c\x5a\x6c\xc1\x8f\x85\x17\x21\x69\x06\x27\x23\xd4\x30\xad\xcd\xfd\xb8\xf9\x78\xd7\xef\xc7\xca\x07\x98\x76\x50\x93\xa2\xab\xb4\x33\xa9\xcc\xef\xe3\xd5\xf6\x70\x4c\xf5\xd2\x73\x77\x61\x12\x8f\x95\x2e\x67\xbe\x19\x34\xaf\x84\x2a\xac\xff\xeb\x32\x19\x25\x30\x13\x76\xcd\x50\x1c\x58\x3b\x4e\x34\xaf\x3f\x45\x62\xa4\x0c\xe8\xe3\x8f\x35\xe9\x03\xb9\x93\x98\xc5\x89\x9d\xdc\xbf\x79\xef\x3b\x97\xc5\x85\x50\x58\x3e\x03\xda\x5d\x42\x71\x60\xed\xe6\x5e\x7e\xda\xa0\x93\x1b\x3f\x24\x9b\x43\xa3\x09\xaa\xab\x7a\x23\x84\xd9\x45\xa2\x13\xc2\x2f\xf7\x2c\x3d\x6b\x27\x64\x67\xbe\x1c\x16\x17\x8a\x03\x6b\xd7\x38\x23\xb7\xf0\x62\xc9\x38\x8d\x02\xe7\xfe\xf1\x72\xba\x5f\x5e\x82\xb1\xb0\xc8\x9b\xf7\x31\x42\x16\x6b\xf6\x63\x1d\x53\x4f\x81\x4f\xe3\x50\x1c\x58\xbb\xf8\x62\xd1\xdc\xcf\x6d\x74\x3e\x69\x45\x24\xdb\x19\x12\x6b\xce\x42\x16\x22\x58\x68\xb5\x02\x0f\xec\xce\x67\xc4\x05\x9e\xa6\x7e\x81\x59\x7a\x28\x3b\x78\xb5\xa5\xff\x8a\x3f\x6b\x76\x32\xd1\x46\x16\xf1\xce\x21\xb2\x6b\x83\xcc\x96\xad\xfe\x51\xb5\xdd\xb6\x74\xe9\x84\x44\xbb\x19\xbd\x2e\xce\x5d\x98\x3d\x86\xe2\xe0\x2d\xfd\x22\xa5\xa4\xc9\xf9\x61\x85\x44\x2d\x07\x49\x58\x56\xb1\x42\x72\x71\xb3\xdd\x73\x35\x06\xb3\x4c\xe5\xcf\x7c\xe5\x31\xef\x47\xa2\x80\xc6\x7b\x10\x1c\xbc\xa5\x6f\x6a\xd3\x4f\xfb\xcc\x3d\x67\x87\x33\xb6\xae\x11\x5a\x28\x16\xa4\x3a\xa6\xbe\xc1\x2f\xb2\xe7\x30\x41\x77\x33\x82\xba\xb8\x0c\x68\xe9\x07\xc5\x05\x48\xfb\x82\x46\x43\x5f\xd3\x8d\x2e\x2c\xff\x62\xef\x42\x2f\xbd\xb1\xab\xfe\x4d\x1e\xad\x9e\x74\xaa\xe7\x79\x92\x92\x5c\xf6\xf3\xe3\x91\xf9\x36\x1c\xc0\xd2\x7b\x93\xc4\x24\x5b\x3d\x58\x24\xdf\xa3\xf0\xae\x3f\x70\xb3\x89\x6b\xed\xa9\xd3\x24\x9f\x55\x27\x1a\xa6\x0b\x60\xe0\x57\xde\xb8\xfb\xaf\xa5\xbf\xc9\x59\xc1\xe8\xf8\x84\x91\x72\x8f\x30\x60\xfe\x9e\x10\x37\x01\xff\x5f\x1f\xae\x21\x99\x1a\xad\x56\x01\xdc\x27\x1b\xa4\xce\xab\xff\xa0\x6a\x5b\xe3\x2c\x3f\x3a\xb3\xe6\xd4\xaa\xdb\x14\xba\xdf\x3f\xe2\x57\xd4\x4f\x41\x14\x90\x11\x66\x69\xc0\x3b\xc7\xd8\xd8\x29\xf5\xfa\x5f\xb1\xf4\xc7\x28\xff\xdd\xad\xfd\x3f\x4b\x2f\x85\x20\x09\x76\x60\xd8\x47\xf2\xac\x6f\x97\x0a\x06\xa9\x59\x1d\x06\x31\xad\x48\xe9\x35\x1e\x62\x1f\xa2\xbe\x21\x1f\x6b\x46\xa3\x64\x91\x19\xc5\xcf\xbe\x0e\x4f\xef\x0b\xe7\xe9\xef\xb2\x18\xcb\xec\x84\x32\x34\x8b\x8e\xa7\xd7\xa2\x32\xb9\x15\x12\x91\x23\xbd\xe1\xfd\x35\x7a\x68\xe2\xd1\xa0\x18\x39\x35\xa0\x77\x2d\x2b\xc8\x82\x70\x76\x73\x31\x78\xcf\x9d\xaa\x49\xde\x4f\x00\x01\x4b\xdf\xfc\x37\x19\x22\xcd\xc3\x31\xd7\xb5\x33\x12\x3e\x0a\x93\xfc\x92\xc4\x84\x32\xa3\x6b\x59\x2f\x87\xf7\xf4\xf6\xb3\xcd\x28\x6f\xfd\xef\xb2\x48\x67\x7d\x94\x45\x6f\x68\x41\x62\x61\x4f\xb0\xa5\x16\xba\x1b\x82\x1c\x6a\xaa\x37\x3b\xa4\x21\x73\x2d\x77\x6b\x0f\xf7\xb3\x9a\x41\x61\x46\x31\xbe\xdd\x69\xa8\xf5\xa2\x8c\x93\xd2\x11\x31\x4d\xe4\x86\x25\x4f\x5d\xc7\xe2\xc8\x63\x10\xb4\x2d\xf4\x53\xa8\xaf\xe5\x6e\xe1\x3d\x7d\x10\x66\xc3\xcd\xf4\x2f\xa5\x7f\x29\xcf\xba\x94\xdd\xe6\x56\xc4\x6e\x05\xbc\x90\x6a\xdb\x34\x9f\x17\x45\xe3\x6f\x19\x0c\xb3\x9e\xbf\x36\x4f\x0f\xf5\xd7\xbd\x2a\x4f\x2e\x0f\x71\x71\x30\xe3\xa0\xd6\xbe\x32\x5f\x5a\x19\x53\xf0\xbb\x33\xd8\xc0\xa5\x10\x94\xd5\x40\xf4\xf6\x26\x1f\xab\x66\x1a\xce\x06\x2c\x3f\x40\x71\xe0\x3c\xf9\x27\xc4\x4e\x9b\xab\xc8\x0d\x7f\xa9\xf0\xcf\xd6\xde\x28\xb5\xec\x45\xa2\x63\x9e\x61\xe1\xdd\x6c\x85\x68\x8c\x48\x87\x51\xc2\x01\x58\x5c\x28\x0e\x9c\x27\x83\x06\xc4\xda\x51\x09\xac\x6d\xf9\xc4\x9f\x8b\x86\x98\xc8\xa2\xe9\x0b\xc4\xba\xe9\x22\xb5\x8f\x14\xf4\xef\x3d\x94\x39\x61\x07\x5a\xe9\x43\x71\x01\x92\x08\x88\xff\xb1\x9c\xbe\x1f\xad\x9d\xd0\x93\xfc\xea\x49\xce\x45\xbb\xcd\xc3\xd3\xad\x87\xe7\x74\x5e\x8d\x5e\xdd\x7a\x7d\x0c\x15\x1d\x1a\xc4\xcf\x81\x03\xfa\xa1\xb8\x00\x49\xe4\xff\x6c\x4b\x4f\xb0\x86\xba\x60\xb4\xf8\x4d\xe5\x05\xdb\x83\x97\x13\x42\xf9\x99\xba\xc6\x4d\x37\xf2\x44\x8b\x94\xc2\x62\x09\xad\x4f\x31\x9d\x60\x73\x1c\xa8\x17\xc0\x55\xda\x29\x86\x6a\xf0\x49\xdc\x4f\x0a\x15\x2a\x3e\xca\x46\x7d\x39\xb6\xce\x23\x95\x6f\xd9\xa0\x92\xe9\xb0\x66\xc3\x6a\x40\x54\xd7\x00\xec\x22\x85\xe2\xc0\xda\xbd\x9b\x1d\x34\xa6\x2e\xe4\xc0\x4a\x68\x14\x9d\x53\x7b\x60\xca\xe6\xb9\x3e\x2d\x97\x13\xc1\x2d\x7c\xc8\x1a\xfe\x36\x10\x35\xef\x25\x2c\x2e\x14\x07\xd7\xdb\x10\xd7\x1d\x7b\x3c\xfa\xde\x57\xf1\x87\x27\xc7\xf7\x66\x78\xd5\x3c\x30\xfe\x36\x44\x28\x35\x92\xd0\x2e\x7d\x70\x5e\xa2\x96\x02\x8a\xde\xa1\x38\xb0\x76\xfc\x52\x62\xc4\x96\x7e\xa5\xda\x42\x04\xf4\xa2\x81\xfb\x9f\xad\xf9\x6a\xdd\xeb\x04\xd2\x07\xad\x55\xeb\x37\x3d\x35\xc6\x47\x80\x82\x6c\x28\x0e\xac\xdd\x11\x0e\x8b\x5e\x20\xe7\xf8\x13\x8d\x97\x12\xfc\xb3\x2a\x76\x71\xcb\x33\xe8\x97\x01\x34\xba\xa8\x2e\x9d\xcd\x91\x82\x4f\x9f\xfc\x86\x69\x07\xf5\x16\xbd\x4a\x3b\xea\x82\xfd\x64\x95\x07\x92\x12\xe1\xe3\xf2\x41\x61\x4e\x9f\x29\x9b\xe8\xfa\xbb\x8c\xf6\x17\x6d\xd2\xcd\xdf\xf1\x4d\xa1\xe6\x01\x55\x08\x50\x1c\x58\xbb\x0d\x6b\x9b\x47\x1e\x98\x4d\x47\x06\xc6\x11\x3e\xee\x03\x8f\xb4\xbb\xb2\xfd\xfa\x85\x24\x1c\xe2\xd0\x32\x2b\x19\xde\x29\x2e\x03\xa7\x69\x41\x71\x60\xed\x6c\x1a\xf1\x26\x75\xf7\xc9\xc2\xa7\x84\x54\xe5\xb1\x5b\xe2\x75\x73\x63\x9c\x75\x9e\x68\xd1\xd8\x13\x0f\xbd\x8d\xbd\xd1\x72\x79\x0e\x2c\x43\x42\x70\x60\xed\x7e\x0a\xaa\xba\xbd\x7c\xfb\x65\xee\xa2\xaf\xe2\xd9\x40\x99\xa1\xcf\xeb\x3a\x9c\x28\xce\x85\xaf\xa4\x82\xe9\xae\x55\xf2\x42\x7c\x81\xb0\xb8\x50\x1c\x58\xbb\xa1\x81\x52\x2c\xda\xe1\x4d\x92\xc5\xa3\xf3\x1b\x97\x8b\x9a\x7c\xbf\x25\xf2\x0d\x9c\xe9\x03\xd6\xa9\xa8\xb5\x5c\x27\xea\xa5\x48\x61\xda\x41\xa5\xa2\xab\xb4\x93\xac\x8c\x2d\x71\xca\xf6\x72\x9b\xce\xa0\xfd\x90\x45\x51\x71\x7f\x80\x9e\x34\x12\x3d\x9a\x8f\x7a\x29\x4e\x9e\xd9\x44\x1f\x5f\x05\x68\x2c\x00\xc1\x81\xb5\x3b\xaf\x29\x98\xb0\x4b\x70\x8a\x8a\x5b\xbb\x75\x93\x68\xbf\x99\x9a\xec\x4f\xa4\xf5\x8b\x26\xb2\x99\x07\xd9\x9a\x76\xaa\x53\x64\xc0\xe9\x91\x50\x1c\x58\xbb\xc0\x6c\x0c\x75\x7f\x35\x71\x3b\x13\xf5\x03\x3b\x03\x9f\x22\x39\xa2\xfd\x92\xe4\x66\x1c\x1b\x67\x89\x17\x7e\xbd\x06\x72\x0e\x66\x40\x25\x0d\x04\x07\xd6\x6e\x8e\xc7\x1b\x3b\x90\xff\x71\x0d\xab\xf5\x8e\xb3\xb1\xa4\x39\xff\x28\x9b\x6a\x3f\x3a\xdb\x36\xee\xa3\x7a\x93\x8d\x04\x9a\x79\x60\x09\x19\x8a\x03\x6b\xb7\xfc\x7b\x3b\x99\x67\x90\x66\xd3\x1e\x59\xc2\x5e\x7d\xb7\x69\x1f\xcd\x39\x2e\x5f\xf9\x45\x2d\x96\x44\x73\xd6\x79\x6b\xe8\x8b\x2e\x98\x76\x50\xf9\xfc\xca\x8a\x17\xde\x3f\x3f\x6a\x5f\xd2\xad\xe9\x30\x34\x17\xdf\xba\xa8\x73\x6d\x3a\xf2\x5c\xe2\xf2\x2f\xa0\x42\xd7\xe2\x9c\x21\x33\xca\x4f\x06\x2a\x5e\x20\x38\xb0\x76\xa6\xe4\xd3\xf3\x88\x26\x96\x06\x58\x34\x12\x36\xe8\x3f\x38\x3a\x38\x5c\x7e\x69\x62\x68\xdc\xa8\x4b\xfa\x9a\xae\xd7\xb3\x79\x03\xa8\x82\x82\xe2\xc0\xda\x6d\xbe\x5b\xa5\xe2\x57\x51\x2a\x3a\x57\xae\x9c\xb9\x91\xed\x4b\xaf\xf7\x93\xa5\xf0\x22\x4c\xab\xfc\xd5\xc9\x53\x3d\xc4\x0f\x51\xc0\x36\x16\x28\x0e\xac\x9d\xdd\x3b\xce\x17\xd2\x6b\xd9\x44\xc4\xa1\xd6\xf7\x19\x06\x15\x3a\x13\xb6\xcb\x4d\xf2\xea\xcb\x6a\xdc\x2e\x92\x83\xa3\x9e\x78\x02\x71\xa1\x38\xb0\x76\x7e\x5d\xe6\xbc\x42\x3f\x54\xc3\xd0\x1e\xb2\x1a\xd7\x9d\xa1\x91\xdd\x7e\x3d\xfe\x1e\x47\xae\x54\xe3\x80\xa2\xa9\x06\xfd\x40\x06\xd8\x79\x0f\x35\x29\xba\x4a\x3b\x52\x4e\x24\xa7\x08\x94\xa0\x80\xde\xd9\x77\xfd\x7e\xb7\x3e\xcf\xe6\x23\xa1\x9a\xcb\x4e\x7a\xf5\xc4\x1b\x9f\x91\x2e\xa1\xa8\x10\x00\xdb\x4d\x20\x38\xb0\x76\x79\x3b\x77\xfa\x5e\x8d\x5e\x60\x16\xdd\xee\xb8\x34\x1e\x46\xf9\xf0\x3a\xe1\x83\xb8\x49\xed\x6c\x68\xa2\x46\x08\xd2\xfc\x7c\x0e\xb0\x9c\x0e\xc5\x81\xb5\x43\xf2\x40\xa2\x53\x4b\x4f\x6c\xc8\xe6\xed\x78\x59\x62\x39\xe4\xd0\xf1\xbe\x44\x44\xd9\xf3\xe8\xd3\x04\xfe\x97\x0a\x76\x01\x26\x22\x58\x5c\x28\x0e\xac\x1d\xae\x8e\x37\x8e\xbb\x6d\x30\x85\x89\xe1\x7b\xbd\xd0\x6a\x74\x1c\x1b\x1b\x96\x8c\xb2\x1b\x09\x84\xeb\xc2\x03\xe5\x6f\x83\xd0\x81\xef\x52\x50\x1c\x58\xbb\xdc\x2a\x5a\x73\xd4\x9e\x21\xbd\xfc\x49\xcf\x0e\x09\xfc\x57\x56\x22\xbc\xd8\x31\x1c\xe2\x0b\x12\x6e\x33\x4d\x29\x07\x4e\x8d\x8c\x30\x4f\x0f\xe5\x07\xff\x3f\xfa\xe3\x71\xa7\x87\x35\x19\x10\x7d\x17\x16\xc1\xfd\x75\xea\x7f\xeb\x5d\x69\xf9\xa4\x60\x44\x37\xeb\x97\x11\x44\x79\x59\x5c\xf3\xe8\x1e\x60\x17\x3b\x04\x07\xef\xe9\xef\x1a\x9a\x9e\x66\x79\x0f\x08\x52\x4f\xbb\xdd\x1c\xd5\x78\x21\xf9\xe9\x2b\xa2\x47\xe2\x0e\x46\x67\x29\x55\xdb\x71\x68\xf5\x79\x0a\x2c\x32\x14\x07\xef\xe9\xb1\xd6\xd2\xee\xba\x1a\x44\xcd\xec\x4f\x52\x55\x52\xbb\xe7\xcd\x8b\x1a\x8b\x65\x68\xa8\x3e\xa2\x9c\x77\x64\xfc\xda\xef\xdc\x55\x09\x8b\x0c\xc5\xc1\x37\xd3\xff\xaf\x0f\xa6\xff\x46\xab\x37\x2a\x8a\x42\x24\x1f\x53\xb4\xaf\xc7\x8e\xbc\x91\xf2\xf2\xb5\x66\xc9\x6d\xfb\x4b\x4e\x13\x93\x53\x8e\x74\x6b\x1a\xf2\x7f\x3d\xbd\xc0\xf0\x44\x7d\x1e\x75\x4b\x32\xfe\x09\x5b\xdd\x9f\x81\xac\x9b\x8d\x56\x3e\xca\x7b\x5e\x1e\x6a\x64\x87\xae\xb7\x39\x59\x5b\x1b\xff\xcd\x35\xac\x9c\x36\xd1\x37\x08\x33\xbc\xf2\x6d\xef\x7b\xc5\xe5\xee\xe2\x2b\xd8\x4f\xa8\x2a\x1f\x3e\x0d\x69\x10\x47\x8d\x92\x5a\x0c\xfd\x5f\xf3\xf4\x50\xb7\xf6\x8f\xa7\x97\x80\xf3\xf4\xf4\x88\x11\xd8\x0f\x59\x9e\x6b\x07\xfd\x59\xfd\x20\x35\x40\xc4\x66\x88\x46\x49\x6c\x41\x8c\x6b\xec\xdb\x80\x9e\xfa\xca\xad\x53\xf4\x3a\x3c\x7d\x3b\x9c\xa7\x7f\xb1\x22\xf8\x90\x39\x38\xae\x87\x20\xb6\x5f\xc2\x23\x04\x21\xf4\xd3\xe3\x1d\x3c\xe5\x85\x3c\x9e\x82\x62\x95\x56\xd9\xf7\x7c\xbf\xaf\x65\x09\x19\xde\xd3\x7f\xb4\x51\x49\x1d\xb0\xe8\x66\x5e\xb3\xd6\x47\xcb\xc9\x74\x1d\x58\x44\x51\x31\xbe\x61\x8f\x95\xa9\xd2\x86\x4a\xe4\x19\xc4\x8b\x74\x2d\x0b\xe6\xf0\x9e\x7e\x78\x54\xa3\x59\x30\x22\x50\x8c\xc7\xbc\xed\x5e\x60\xe0\xb2\xd0\x0b\x7b\x7e\x9a\x9d\x48\xff\x07\x3a\x71\x86\xf1\x73\x3d\x09\xd7\xd3\x6a\x1f\xde\xd3\xa3\x3d\x36\x4b\x22\x14\x1d\x99\xc0\xfa\x9e\xe3\xb4\x37\x1e\xc5\x7a\x7f\x38\x7c\x84\xfa\x59\x06\xdb\x70\xbc\x04\x5d\xba\x68\xd1\xd3\x6b\xb9\x5b\x78\x4f\x4f\xec\xf7\x48\x9b\x3c\xc4\xad\x34\x77\x6e\x8e\x41\x44\xcc\x1b\x4d\x19\x0f\xe9\x2e\x4b\x95\x7a\x98\xea\x4c\x77\x40\x24\xcd\x4b\x9e\x6b\xf3\xf4\x50\x7f\xdd\xab\xf2\xa4\xd2\x03\x2e\xea\x9e\x04\x84\xf0\xec\x79\xff\x5f\x94\x36\xc6\xce\x0a\xcd\x41\x13\xe6\xec\x23\x32\x54\x7d\x6e\x32\xc2\x1f\x23\x81\x1e\xd9\x50\x1c\x38\x4f\xca\x1f\x88\xa2\x2c\xb9\xec\x30\xfa\xce\x3b\x56\x96\x36\x30\xa1\x67\x19\x19\xb5\x63\x3c\x4f\xd5\x76\x38\x50\x08\xb6\xba\x65\x0b\x9c\x64\x0d\xc5\x81\xf3\xa4\x72\xfe\xbc\xd3\x93\x79\x0c\x02\x8f\x2f\xfd\x92\x01\xf4\x28\x36\xfd\x9e\x46\x3e\x63\x81\x13\xec\x0c\x6b\xf7\x50\xc7\x90\x3d\x13\x81\x75\x48\x08\x0e\x9c\x27\xa9\xbc\xd8\x18\x22\xe5\xd6\xea\x54\xff\xfe\xd8\xdf\xa1\xc7\x5e\x46\x2a\x43\x39\xc0\xf2\x33\x51\xc4\xaa\xbf\x38\xa5\xb4\x9f\x02\x2a\x64\xa1\xb8\x00\x49\x89\xff\xdc\x62\x9d\xa0\x75\x2f\xf4\xd9\xf8\x29\x66\x51\x20\x6e\xda\xb0\xfe\xf0\xe7\xd4\xfe\x60\x5e\x0a\x59\x8e\xc7\x89\x26\xaf\x3b\x2c\x36\x1b\x61\x73\x1c\xa8\x17\xc0\x55\xda\x39\xbe\x7e\x5a\xe3\x3c\x8c\x49\xe4\x45\x9d\xe5\xc9\xbc\xab\x13\xe2\x6b\xa3\x4f\x14\x26\x41\x4b\x3e\x9b\x9a\x25\x4e\xfd\x39\x0d\x38\xd5\x1b\x8a\x03\x6b\x77\x3b\xa8\xbe\x2f\x9d\xee\xcb\x2f\x64\xc4\xbb\xd1\xe6\xe9\x84\xd9\xe5\x4b\x56\xe5\x3f\x6d\xf6\x3f\x95\x60\x5a\x5a\x0f\x36\x87\x01\x27\xc8\x43\x71\x60\xed\x0a\xfe\x74\xed\x33\x1b\xe8\x92\x34\x2c\x6a\x5d\xa2\xe7\x32\x09\x98\x63\xd0\x76\xf4\x11\x4e\x5c\x88\xdf\xcf\xf5\x2f\x5a\x14\x04\x4a\x05\xa0\x38\xb0\x76\xf8\xb6\x5a\x27\x66\x1b\x7f\x73\xd9\x67\x2e\x9e\xb9\xe5\x36\xe7\x2c\x7a\xec\xfd\xae\x15\x18\x0a\x35\x74\xb9\x69\x19\x5b\x7d\x04\xf8\x58\x28\x0e\xac\x5d\x94\x4f\xd4\xb8\x1b\x36\x1b\x19\xa5\x50\x40\xd5\x0f\x99\x4f\x56\x75\xec\x35\x45\xa5\x5e\x22\x9f\x8b\xb7\xd4\xf9\xf8\x7e\xc5\x7d\x84\x69\x07\xf5\x16\xbd\x4a\xbb\x14\x83\xfd\xa2\x80\xc5\x5e\xc2\xc7\xf9\x4b\xf4\x6f\x8d\xee\x5b\x69\xf4\xae\xae\xf2\x4c\xdf\x71\x8d\x15\xf5\x27\xc3\xc4\x5d\x04\x8e\x4d\x84\xe2\xc0\xda\x31\x7a\xf3\x27\x35\xac\x85\xaa\x39\x9a\x2f\x3b\x0a\x33\x10\xde\xba\x37\x1c\xf2\xd9\x6c\x97\x2e\x80\x50\x0d\x6d\x35\xe5\xf8\x81\x1f\x2c\x2e\x14\x07\xd6\x8e\xe1\x6c\x50\x93\xde\xe2\x73\x27\x26\xdd\x88\x2b\x45\x63\x65\xbd\x91\x8f\x94\xf2\x66\x66\xbb\xaa\x5c\xa6\x75\x68\x95\x4b\x14\xf0\xcd\x0b\x8a\x03\x6b\x57\xa3\xea\x60\xe4\x16\xf6\x91\xa5\x3a\x9e\xf9\xef\xd6\x2f\x1d\xca\x31\xb9\x84\xc2\x92\x19\xbd\x19\xaf\xfe\x3e\x67\xe4\x7d\xea\x3d\xa0\x3b\x06\x04\x07\xd6\x4e\xbf\x57\x0f\x95\x66\x1b\x67\x0f\xed\x49\xd2\x62\x17\xc6\xf7\x27\x6f\xea\x3e\x44\x50\x91\xcf\x46\x53\xd5\x2a\x35\x47\xe0\x0e\xe4\xc2\xb4\x83\x4a\x45\x57\x69\x77\xb0\x4c\xcf\xff\x33\xe0\x87\x22\xce\xbd\x14\xf6\xd2\xb4\x05\xb2\x68\x55\x6a\xc3\x75\x26\x9b\xf8\x4f\xaa\xed\xdb\x55\x71\x44\x15\xb0\x6b\x86\xe2\xe0\x4e\xe9\x0f\xb5\xf5\x58\xdb\xed\x95\x89\x71\x10\xaf\x95\xca\xe6\x11\xe9\xab\x5a\xe4\x2a\x7f\x28\x62\x3f\x4f\x69\x9c\x7b\xe9\x76\x02\x74\x20\x81\xe2\xc0\xda\xdd\x5d\x77\x64\x0a\x3b\x34\x67\x92\x3d\x51\x93\x59\x89\x6b\xd2\x68\xb0\x48\x7a\xab\xfe\xf1\xf1\xed\x3a\x2e\xf1\x5c\x4d\xa1\xdb\xc0\xf1\x78\x50\x1c\x58\x3b\xf6\x3f\xf6\xac\x65\xe1\x63\xaf\x17\x93\xf2\xf6\x96\xe7\x25\xa9\x97\x64\xfc\x1f\x07\x78\x72\xa4\x05\x8c\xb6\x13\xae\x1f\xbe\x04\xbe\x4b\x41\x71\x60\xed\xc4\xc8\xf6\x8c\x43\x0a\xf5\x3f\xf5\x07\x39\xdf\x0c\x65\x30\x72\xfa\xbb\xf6\xea\x37\x3d\x5f\x72\xb2\xfc\xdf\xae\xa1\xe5\xa2\xdf\x69\x30\xed\xa0\xf2\xf9\x55\xda\x59\xe3\x7c\xca\xcf\xae\x6b\x3c\x49\xff\xb5\xc8\xf8\x57\x4f\x8d\x19\x0b\x25\xce\x10\xa5\xbf\xa5\x2a\x3d\x9c\x97\xbc\x58\xae\x09\x28\x17\x80\xe2\xe0\xbe\x61\x13\xee\xa7\x27\x6c\x32\xf7\x56\x0b\x6e\x72\xd9\x95\xaa\xbe\x90\xd8\x7d\x9e\x8d\x33\xeb\x58\xbe\x15\x91\xed\xe4\x62\xa5\x14\x06\x7c\xc3\x86\xe0\xe0\x9a\xac\x8d\x7d\xa5\x3b\x7f\x83\xdb\x12\xc9\xc1\xcd\xaa\xbc\x55\xfd\x9c\xf0\xfd\x67\x7e\x2a\x91\x65\x2e\xc4\xea\xc6\x2c\x83\x6e\x2e\x66\xa0\xc9\x1a\x04\x07\xd6\x6e\x17\xa1\xc4\x5d\xda\x43\xed\xae\xb7\xe7\xf3\x68\x74\x74\xd3\x3b\xcf\x23\xbe\x57\x72\x9d\x70\x90\xec\xf5\xfc\x09\x46\xce\x7e\x05\x54\xe9\x43\x71\x60\xed\x2a\x50\x48\xbe\x7f\x10\x3f\xd7\xcd\x8b\xac\x49\x62\x6e\x50\xfe\x9a\x9b\x1e\x35\x71\x40\xfb\xe0\xb2\x5d\x37\x38\xe4\xe6\x65\x2d\x31\x4c\x3b\xa8\x49\xd1\x55\xda\xdd\x8c\x7e\xab\x51\x48\xb2\xa9\xbe\xc8\x82\x70\xf4\x32\x1e\x63\x6e\x54\x9e\x89\x24\x42\xd0\xbf\xea\x41\xfa\xc9\x2a\xfd\x4c\x60\x1a\xec\x9a\xa1\x38\xb0\x76\x18\xf2\x1a\x8a\x1b\xbc\xa3\xba\xcf\x16\x8b\x28\xa2\xda\x07\xe3\x27\xe4\x9f\x2c\xc5\x75\x4e\x4d\xc7\xab\x9e\x1f\x6c\xae\xdf\xed\x86\xc5\x85\xe2\xc0\xda\x6d\x8d\x91\xd0\x9d\x6c\xd8\xdd\xf7\xc9\x29\x44\x31\xdc\x14\xbd\xdc\x1e\x27\x7f\x99\x11\xeb\x2c\x1f\x83\x56\x9e\x60\x74\x91\x48\x0d\x8b\x0b\xc5\x81\xb5\x2b\x57\x49\xb3\xeb\xde\x19\xb6\xe9\x48\x18\xb0\x7c\xd6\x2d\xf5\x80\x85\xe4\x80\x32\x64\x9e\x3f\xaf\xc6\xd8\xcb\xb0\x98\x6c\x00\xc8\x1d\x50\x1c\x58\x3b\xbf\xdb\xb4\xa4\x2f\xb0\xc4\xce\x19\xfb\x9a\xf4\x17\xb0\x7c\xbf\x69\x44\x26\x3b\xb7\xa3\xf6\xd8\xbb\x4e\x6e\x88\x22\x70\xd8\xfa\xc2\x3c\x3d\x94\x1f\xbc\xda\xd3\xdf\x59\x2e\x7d\x6a\x18\xea\x44\xa7\x7a\x2f\x79\x9a\xe7\x9d\xc9\xe1\xb7\xea\x81\x1f\x1e\x5f\xe3\x5f\x3f\x5c\x73\x3c\x8e\x0e\x51\xaf\x83\xf9\x63\x28\x0e\xde\xd3\x87\x1e\x70\x2e\x26\x37\x26\xd8\x34\xb9\x76\x4b\xef\xaa\x22\x0d\x87\x67\xa6\xb4\x9a\xc7\x88\x1b\x0d\x70\xa5\x1e\xbf\x5e\x1e\xc5\x82\x45\x86\xe2\xe0\x3d\x3d\xc7\x1b\x0e\xc5\xe9\xb0\xba\x96\xb1\x01\x5f\x44\xf9\xc2\x5d\x43\xbd\x97\xc9\x4f\xcc\x2d\x75\xf5\x8c\xc2\xbb\x7d\xf4\x72\xa2\x75\x60\x91\xa1\xb8\x00\x69\x04\xf4\xff\x8c\xfc\x5f\x9f\x4c\xdf\x9d\xbe\x31\x78\x2e\xdd\xc1\xe1\x95\xba\x87\xff\x46\x4c\x3a\x88\x2a\x6f\xc4\x29\x8d\x6f\xa6\xea\xd4\xf5\x33\x0d\xd7\xb3\xc9\x94\x7f\x3d\xfd\x93\xbc\x82\x57\xfa\xf8\xbb\xc2\x27\x61\x48\x18\x2f\x45\x63\xf5\xa2\x0f\x14\x06\x04\x07\x94\xbe\x11\x2b\xab\x7a\x8f\xfd\xba\xfd\x6f\xe3\x71\x82\xe1\x76\x7e\x92\xbb\x5a\x11\x6f\xb7\x88\x22\x37\x84\x27\xac\x9a\x25\xf8\x8c\xf3\xe5\x3b\x49\xd4\xd6\xf1\xe9\x49\xce\x8a\xea\x25\x24\x30\x31\xff\x17\x3c\xbd\x2f\xca\x7f\x77\x6b\x81\x48\x08\x28\x01\x0f\xa8\x7c\x83\xc2\xa5\x7c\xe1\x3c\xbd\xf8\x1b\x6b\x6a\x5a\x54\x91\xd9\xf1\x40\x53\x3b\x99\x3b\x64\xb3\xb3\xcc\xf6\x13\xfe\x6f\x0b\x4e\xb3\x23\xd9\x1c\x19\xfc\x6f\xa4\x5e\x87\xa7\x47\x50\x02\xff\xaa\xa2\x98\x60\xc0\x26\x79\xc2\xf7\xfa\x75\x3c\xbc\x7e\xc5\x81\x9f\xc8\x1c\xd3\x21\x2b\x97\xeb\xb9\x8d\xd2\x24\xf6\xa1\xa9\xa9\xd7\xd2\x06\xde\x17\xde\xd3\xf7\x49\x13\x9b\x1a\x32\xb7\x6a\x73\x68\x4c\x7c\x32\x2d\x9a\xe1\x0a\x2d\x18\x09\xe4\xf2\xac\xc9\x91\x19\xdb\xc9\xc1\xfe\xf3\x41\xe5\x5a\x16\xcc\x35\xe1\x7e\x96\x2c\xe2\xcb\x7b\x87\xd0\xa0\x1c\xdd\x5c\x7c\xba\xe5\xbe\x64\x6e\xfd\x39\xf7\x9e\xa2\x4a\x6a\xe3\xbc\x6d\x65\xfb\x44\xaf\xc4\xeb\xd8\x0b\x21\xed\x0b\xef\xe9\x99\x8e\x63\xbf\x13\x4c\x9a\x1d\x74\x24\xd0\x87\xb8\xab\x1e\x59\x05\x0a\x60\x3f\x33\xd2\x5c\xf9\xa4\xcb\xbb\x82\x16\xf2\xd9\x6e\xea\xda\xcc\x35\xd4\x7f\xe8\xaa\x84\xc5\xc1\x81\x82\x4c\x60\xc8\xb2\xab\x61\x94\xee\xdc\x88\xbf\x63\x67\x35\x20\x8f\x70\x71\x6f\x55\x33\x2b\x95\x25\x0d\x73\x2b\x17\x58\xf4\x80\xe2\xc0\x09\x0b\xc1\x5d\xd3\xf7\x24\x90\xb3\xcc\x89\xad\xd4\x7d\xde\x4c\xc0\xc9\xff\x30\x6d\xd1\xec\xe5\x39\xc5\x03\xda\x08\xb7\xcd\x91\x79\x2d\x58\x5c\x28\x0e\x9c\xb0\xde\x2d\x61\x07\x34\x33\x55\xea\x30\xbc\x4f\xe8\x14\x88\x71\x1b\xb4\xd6\x2b\x3f\x3f\xf5\x59\xf0\xc3\x4c\x7f\x50\x61\xd6\x63\x0b\x4c\x14\xa1\x38\x70\xc2\x4a\x59\x88\x20\x29\x8f\xd1\xba\x7f\x26\xad\xd1\xd2\x62\xfa\x43\x8e\xe6\xd2\xcb\xb5\x2f\x22\x2f\x67\x7c\xca\xff\xd2\xdb\x77\x33\x0b\x30\x3b\x10\x1c\xf8\x7a\x0f\x27\x07\x64\x5a\x4b\xbf\x8b\x46\x0e\xd0\xd3\x0d\x3d\xcc\x29\x13\x4c\x73\x40\xec\x74\xb7\x34\x1b\x3e\xd4\xd9\x24\x28\xe4\x1d\x80\x4d\x36\xa0\x9e\xc4\xab\xb4\x3b\xd6\x45\x0e\xdf\x35\x42\x4a\xdd\xcb\xd5\xcd\xea\x5f\xfe\x20\x26\xd4\x59\x8b\x6c\x7c\x8e\x85\x8a\x2b\xf7\xae\x47\xfe\x6c\x0e\x38\x3f\x18\x8a\x03\x6b\x17\x9b\xe4\x1f\x6b\xa0\xc7\x47\xad\x88\xc4\x5b\x7b\xb1\x43\x8b\x63\x93\x9b\xfd\x73\x31\xc5\x33\x8a\x06\x67\x47\x7c\xea\xfd\x2c\x25\x2c\x2e\x14\x07\x1e\x0b\xc4\x8f\xa1\x9f\x3a\x7c\xa9\x30\xc4\x93\xa5\xb4\xf0\xda\x36\x03\xf7\xbb\xc6\x4b\xf7\xc5\xb3\xd8\x7b\xda\xe6\xfc\x56\x52\x25\x81\x05\x41\x28\x0e\xac\x5d\x03\x7e\x59\xb7\xf3\xc7\x18\xe6\x91\xc9\xc7\xf1\xaf\xf8\xf4\x0d\x97\x6f\x85\xba\xab\x38\x90\xfc\x39\xcc\x2d\xac\xb0\x28\x7e\x46\x0c\x8b\x0b\xc5\xc1\x6d\x40\x6d\x7d\x98\xd5\x4c\x1c\x91\x34\xba\xd3\x36\xe5\x41\xdf\xc9\x98\xf5\x82\xc7\x85\xb2\xf8\x73\x81\x19\xcd\xa3\xc0\xf2\x82\xb3\x47\x30\xed\xa0\x5e\x67\x57\x69\x37\xe8\x31\x32\x8c\x24\xa7\xdd\x5e\x6e\xf7\xa0\xae\xad\xad\x51\xec\xa2\xd1\x0f\x69\x7e\x62\x31\xa9\x40\xb4\x6c\xec\xc8\x3a\x09\x38\x94\x0c\x8a\x03\x6b\x77\x9f\xd0\x7b\x5c\xe4\x77\xaf\x2f\xdf\xab\x0c\x32\xc1\x80\x51\x64\xfe\xb5\x31\xdc\x1a\xbc\xb5\xf0\x5b\x27\x3c\xde\x2f\x9c\xde\xea\xc3\xe2\x42\x71\xe0\xb1\x88\x7f\xcd\x11\x54\x4a\x7a\x47\xe4\x70\xc5\x11\x39\x68\x3f\x8b\x22\x1c\x49\x0e\x4b\x59\x16\xab\xa3\xf4\xe4\x89\x67\xb4\xb4\x27\xb0\x51\x14\x8a\x03\x6b\xf7\x4a\xc2\x78\x7b\x19\xc5\x53\x53\x78\xca\x9b\xdb\xfc\x32\xc2\xd7\xfd\x45\x6d\xd0\xaa\x36\x99\xf2\xdf\x14\x26\xd1\xde\xfb\x42\x54\xb0\xb8\x50\x1c\xf8\x7a\x17\x2f\x98\x92\x9c\x53\xcc\x5a\x24\x27\xd3\xb0\x07\x14\x1a\x1e\x99\x4a\xbc\x08\xaf\xfe\xfb\xe4\xe6\xc4\xc8\xe0\x2b\xbf\x22\x76\xe0\xd4\x07\xa8\x9c\x70\x95\x76\xbe\xfe\xdb\x8e\xfc\x16\x82\x21\xe5\xe2\xee\x07\x44\xcf\x73\x08\x7f\xb5\x36\x9e\xa2\x61\x3e\x51\xfc\x85\x70\x98\xf7\xa9\xce\x13\xa8\xaf\x85\xe2\xe0\x16\xee\xe8\x1b\xbd\xaa\xa5\x0a\x3a\x91\x1e\x09\xde\x72\x0e\xb5\x20\xb7\xf3\xdd\x09\xea\xc2\x73\x28\x7c\xd7\xc4\x21\xb8\xed\x5a\x0e\xb4\x5c\x84\xe2\xc0\x63\x71\x62\xed\x48\xcf\x69\xce\x94\x11\xe0\xa7\x28\x27\x25\x45\xc5\xa6\x9f\xd2\xc9\x29\x25\x78\x7e\x9b\xae\x81\x86\xe9\x95\x80\x0a\xb0\xa1\x04\x8a\x03\x6b\xb7\xd9\xf9\x2e\xba\x23\x3c\x64\x97\xb2\xfd\xd0\xfe\x90\xf3\xe6\x03\xd9\x4e\xd6\x52\x31\xac\x68\x47\xfc\x03\xec\x5a\x61\x93\x34\xc0\xec\x40\x71\xe0\xeb\xd5\xea\x4f\xa7\x11\xba\x8c\xd4\x63\x2d\xe4\x97\x7a\x43\x3c\xe0\x23\xfa\xa7\x60\x70\xe4\xc2\xfd\x89\x49\xb0\xce\x42\xd8\x0d\x41\x3e\x98\x76\x50\x89\xf5\xca\x13\x3b\x6c\xc7\x37\xfb\xbe\x35\xb2\x3c\x59\xe0\xa8\x15\x60\x98\xa8\xf8\x80\xa8\x38\xd8\x13\x11\x95\x84\x98\xaf\xcb\x23\xcf\x36\x00\x6c\xb8\x82\xe2\xe0\x0e\x72\x14\xd1\xf8\x59\x53\x63\x99\xed\xfe\x54\xd1\xed\x7d\x65\x40\x2e\x36\x7d\xab\xa3\xc9\x0c\x79\x3c\x15\xea\x73\xf2\xb7\x1e\xef\xc4\x60\x71\xa1\x38\xf0\x58\x64\x9f\x87\xa9\x19\x8b\xcd\xb5\x2f\x31\xa0\xdc\x39\xd5\xbc\x91\x88\x8b\xe5\x53\x96\x75\x27\xa2\x87\xf8\x08\x55\xad\x44\x7a\x03\x30\xd7\x50\x1c\x58\x3b\xd2\xaf\x92\xbb\x46\x6b\x97\x91\xcf\x47\xf4\x5f\x98\xb6\xe2\xed\xdf\xef\xe2\x7d\xe6\x1f\x84\x7f\xb4\x6d\xec\xe7\x17\x95\x72\x02\x6c\xa2\x80\xe2\xc0\xd7\xfb\xb3\xe2\x43\x9a\xca\xc7\xa7\x16\x37\xc5\x68\x02\xd6\x89\x29\xc8\xfd\xbd\xf6\x3c\x8a\x83\xb5\x47\xcb\x7f\xbe\x8c\xfa\x48\xd5\xd9\x0a\x33\x68\x50\x93\xfb\xab\x0d\xda\xa7\xe8\xa1\x4c\xae\xd7\x96\x44\x23\x1b\x2d\x37\x8e\x7f\x5a\xfe\x8c\x6f\xbd\xf9\xbc\x6a\xbe\x72\xa6\xcc\xf8\xa8\xb6\xad\x04\x0b\xa8\x8d\x86\xe2\xe0\x0d\x5a\xa4\x02\xbf\x03\xd3\x0c\xa5\x8c\xdf\x72\x47\x7a\xdd\x8d\x45\x7d\x8d\x8f\x8b\x3f\xed\xde\x16\x62\x61\xe9\x44\x46\x78\x5b\xfb\x18\xc2\x22\x43\x71\xf0\x06\x2d\x2b\x4b\x62\x59\x80\x20\xae\x49\x64\x2a\x12\x39\x82\x99\xd2\x2b\x5a\x7a\xf3\x25\xe7\xeb\xe2\x14\xc4\x44\x0a\x57\xfc\x82\x47\x40\xbb\x33\x28\x2e\x40\x1a\x81\x1a\xb4\xe8\xea\x8b\xe7\xef\xf7\xa3\x76\x65\x28\x92\xe9\x76\x39\xef\x9b\xa8\x28\xaf\xaa\x85\x93\x5e\xee\xf3\x3d\xc3\x4d\xaf\x67\x8f\xdd\xde\x00\x06\xad\xc5\x22\xfd\xe8\xe9\xa4\x59\xdc\xfa\x71\x03\x72\xc1\xa3\x9e\x34\x74\xa3\xf4\xfd\x04\x17\x11\x5f\x0d\x31\xbd\x1b\x52\x56\x41\x2f\xff\x35\x68\xb8\x1a\x16\xde\x5a\xc7\x1f\x5c\x4b\x56\xc2\x2e\x30\x35\x3c\x58\xbf\x6b\xff\xc8\x11\x4d\xe4\xaa\xc1\x2d\xa6\x14\x1d\x79\x16\xdd\xf0\x0f\x3a\xfd\x7a\xae\x44\x50\x12\x83\xa4\xba\x38\x44\xcb\xd0\x2e\xf8\x60\xb9\xfe\x80\x49\xcb\xd6\xf1\xc9\xa2\xf6\xe1\xc6\x9f\xf4\x4e\xca\xff\x35\x83\x06\x75\x6b\xff\x18\xb4\x76\x38\x83\xa6\x5a\xb2\xfc\xd2\x98\xd5\xea\xcd\xfe\x7d\xc9\x57\x51\xec\xb6\x6c\x21\x0e\xc1\xc6\xd5\xb4\xdb\x72\xe7\x9a\x13\x77\x58\x9f\x1c\x3d\xb8\x0e\x83\x26\x01\x67\xd0\xe4\xbd\x8e\x65\x88\x84\x33\x46\xc8\x34\x69\x97\xcb\xa6\xc2\xa3\x96\x5c\x06\x83\x6d\xf3\x6f\xdc\x7d\xd4\x55\xf0\x5e\xbf\x77\xef\xdb\xb5\xac\x07\xc2\x1b\x34\x71\xee\x69\xc5\x74\x97\x95\xa7\x37\x9c\x52\x5a\x9a\x4c\xb0\x67\xab\xeb\xfd\xd4\x79\x2c\x6c\xa3\x2f\x39\x14\x0f\xad\xc8\xf2\x98\xaf\x65\xf5\x13\xde\xa0\xa9\x72\xea\x7c\x98\xdb\xdb\xd4\x49\xa6\x11\x99\xd7\xff\xde\xf3\x7b\xbb\xe9\x21\x65\x8b\xde\xd1\xb3\x8c\x30\x87\xef\x6c\x79\x76\x61\xd7\x72\xb7\xf0\x06\xcd\x41\xb6\x01\x29\xc0\x42\x2f\xa5\x6a\x35\x93\x2c\xc2\xa5\xee\x41\x95\xca\xfb\x4a\xf9\xf2\xf7\x3e\x0a\xe2\xab\x29\xeb\x02\x6e\xd7\xb0\xb2\xad\xff\xdf\xfd\x87\xae\xfc\x92\x7f\xaa\x45\xe8\xcc\x12\xec\x7c\xf9\x6b\x9a\x4c\x31\x9d\x0a\x2f\x59\xe6\x8e\x7d\x7d\xb0\xe6\x79\x4c\x84\xcb\x9e\xba\x62\x06\x70\x24\x0d\x14\x07\x4e\x58\xd6\xfe\x64\x6b\x99\x1c\xe6\x6d\x5f\xff\xe0\x7f\xd2\xd0\x48\x7a\xee\x71\x19\x67\x66\xc2\xb7\xac\x4f\x2a\x86\xcc\xc0\x19\x9a\x0c\x34\x34\x83\xe2\xc0\x09\xe0\x59\x50\x03\x49\x5e\x20\x46\x4f\xfc\xa0\x9a\xf7\x98\x9b\x77\x46\xee\xeb\x97\xc1\x1f\x13\x82\x5c\x1c\x8e\x6c\x95\x2b\x5e\x7d\xb1\x07\x9a\x84\x40\x70\xe0\x84\xa5\x54\x8d\x14\xe3\x42\xb3\xfc\x25\xb3\xa9\xcd\x3e\xf6\x07\xb2\x77\xe3\xdd\xd4\x0a\x37\xa6\x61\x7c\xe9\x27\xa3\x09\xf1\x8f\xd6\x81\x4a\x57\x28\x2e\x40\x12\x41\xe2\x3f\x2a\x04\xe7\x97\x9f\x67\xe4\xea\x86\xfb\xbd\xaf\xef\x76\x2c\x46\x10\xd2\xdf\xfe\xc6\x95\x18\x45\xfb\x82\x76\x33\xfd\x22\x88\x69\x3b\x11\x38\x2e\x05\xe2\x49\xbc\x4a\x3b\x6f\xf6\x91\xa6\xc4\x19\x64\xb2\x9b\x8d\x4b\xb8\xfc\x0a\xa4\x47\xfb\x9f\x4f\x37\x82\xdf\x38\x0f\x1a\xe0\xdf\x4a\x95\xad\xd1\x2f\x83\x5d\x33\x14\x07\xd6\x6e\x6f\xce\xc2\xed\x12\x1f\x6b\x93\x8a\xe6\xfd\x0e\x3b\x5a\xe8\x6d\xe1\x5f\xf1\x38\x0e\xc2\x92\x87\x17\xb5\x4b\x31\x74\x25\xbe\xad\xb0\xb8\x50\x1c\x58\xbb\x08\x87\xfb\x1d\xc3\x49\x79\x71\x9d\xa5\xa5\xd1\x7b\xbc\x68\x01\xd4\x06\xdf\x42\xb7\xa2\x95\xca\x46\x51\x7a\x53\xdb\x6f\xb4\xfa\xc3\xe2\x42\x71\x60\xed\xcc\xbd\x57\x5f\xb5\xa5\x72\x95\x8c\xcc\xcb\x10\xe4\x84\x1e\x4b\xb1\x1b\x9a\xbd\xc1\x6a\x98\xfe\x40\xe2\xbc\xb4\xc0\xf3\xaa\x77\x1f\x16\x17\x8a\x03\x6b\xd7\x7a\x2b\x96\xc8\x14\xe9\xab\x27\x13\x46\x7e\x84\xe2\x8f\x69\xe2\x52\x6c\xe6\x24\x02\xfb\xb1\xe5\x26\x4a\x24\x82\xa6\xa0\xe1\x1c\x98\x76\x50\xaf\xb3\xab\xb4\xd3\x55\xef\x44\x50\x7c\xe3\x37\xff\x25\xc2\x85\x78\x0d\x6f\xf4\xf1\xf9\x01\x13\x57\x19\x9f\x1c\xef\x84\x80\x8d\xeb\x6f\xa4\x73\xa0\x5f\x3b\x14\x07\xd6\xee\xc2\x77\xf5\xb7\xef\x69\x67\x4a\xb6\xac\x98\x6f\x6e\x17\x82\x93\x78\x11\x15\x65\x9e\xed\x5c\xa2\x7a\xbf\xf3\xc3\x9e\x66\xf6\x11\x58\x5c\x28\x0e\xae\x79\xd5\xa3\x27\x4d\x17\x87\xc8\x84\x84\xe5\xca\x6c\xfb\x4a\x86\x05\xe9\x86\x6b\x54\xf2\x05\xfc\xb9\x5f\xe7\xfb\x56\x85\xda\xc5\x96\x80\x09\x1d\x04\x07\xd6\x8e\xd0\xe7\xb0\xdd\x6c\x68\x4b\xad\xd4\x0e\xa7\xb9\xcc\xf4\xce\xbb\x7c\xef\x34\xfe\xa3\x96\xb2\x51\xfa\xa9\x2c\x85\x47\xd5\xdd\xc0\x09\xcc\x50\x1c\x58\xbb\x10\x11\xff\xb4\xaa\xf4\x20\x96\xfe\x5f\x7f\x5e\xdf\xa7\x88\x7e\x73\xc8\xf1\x7e\x2f\xcf\x30\x11\x99\x12\xdd\xb0\x58\x61\xfe\xbc\x0a\xa6\x1d\x54\x4e\xb8\x4a\xbb\xbb\xb7\x03\x27\xff\xe4\x1d\x2f\x27\x1c\xc5\xf1\xe1\xeb\xff\x6c\x33\x9b\x6e\x7b\x9c\xc9\xdd\x24\xbd\x6b\xf8\xf2\xeb\xc8\x9d\xdf\x40\x25\x38\x14\x07\xd7\x07\x3e\xe8\xef\x7c\x78\x8f\xd2\xcb\xf2\x12\x31\xfe\x1e\xf5\xe6\x50\x22\x17\x1b\x19\xbc\xcc\x17\x4a\xe9\xdc\xbe\x17\x7c\xf6\x4e\x78\x40\x07\x06\x08\x0e\xee\xc4\xef\x4e\x62\x02\x1a\x9f\x34\x3f\x5a\xce\x7c\x52\x8e\x37\x9e\x52\xed\x9f\x6f\xb9\x29\xe2\x8d\x3a\xe8\xbc\xb3\x8e\xe2\x88\xbe\x04\x1a\xf3\x41\x71\x60\xed\x9e\xbb\x0a\xdf\xdb\x98\xd0\xce\x6b\x5e\x75\xf9\x51\x57\x37\xc4\xe9\xac\xc7\xe6\x2a\x3f\x22\xc0\xbf\x3a\x35\x8b\x87\xc5\xda\x61\x04\x54\x55\x43\x70\x60\xed\x76\xf0\x88\x6d\x44\x26\x51\x4b\xff\x64\xe1\xd3\xf3\x0f\x69\xc8\x4c\xf3\xd9\x12\x3c\x56\xa4\x48\xe9\x64\xd9\xc5\x7e\x41\x81\xf8\x0d\xa6\x1d\x54\x62\xbd\x4a\xbb\xc8\x2f\xf5\xa8\x81\x77\xca\x17\x4a\x65\x86\xd9\x16\xe5\x16\x62\x3e\x24\x30\x7c\x5c\xe6\x7d\x7c\xa1\xe7\xa8\xb7\xc7\x7c\x42\x0b\x54\xf0\x40\x71\x60\xed\x74\x4f\x49\xc8\x37\xac\x42\x47\x22\x6c\x9d\x85\x42\x8d\xb3\xbd\xea\x5a\x84\xd2\x14\x78\x22\xdd\x1d\xdd\x95\xd6\x86\xaa\x08\x80\xdd\x01\x50\x1c\x9c\x76\xcf\x38\xf1\x70\x27\x37\x70\xf1\x31\x7d\xe4\xe2\x5b\x0d\x16\x5e\x31\x3c\x1a\x13\xec\xb8\x2c\x8c\x3d\x7f\x86\xda\x13\x60\x04\x34\x08\x83\xe2\xc0\xda\x3d\xc9\xd6\xff\x12\xfa\xb0\xfe\x35\xc6\x7a\x8b\xf6\xaf\x2f\xab\xac\xc4\xcf\xfe\xfe\x54\x16\xde\x74\x71\xa8\x21\x44\x45\xa1\x9f\x07\x1a\x6d\x42\x71\x60\xed\x30\xb7\x6d\xf4\x84\x8c\x9f\xd6\x97\x46\x0f\x0a\x49\x6a\x1e\x26\x2d\x2c\xc9\x99\x9e\x8b\x6a\x7f\x7e\x69\x42\x70\xf3\x7c\x86\x2f\x04\x66\xd0\xa0\x26\xf7\x57\x1b\xb4\x9b\x7b\xdd\xbd\x9b\x1f\xee\x04\xa1\x05\x55\xae\x7a\x6f\x7e\xca\x2e\xac\xcb\x43\xb5\x0c\xde\xa9\x6a\x15\x32\x88\xde\x6c\x7d\x7b\x09\x33\x3b\x50\x1c\xbc\x41\x2b\x8e\x8a\x76\x90\x73\xb0\x3f\xeb\x08\xa3\x1a\xed\xbd\xb5\xf8\xa0\x4d\xff\xfe\xee\xeb\xd9\x4e\x55\x8f\x5c\x39\x94\x00\xf7\x5a\x6d\x58\x64\x28\x0e\xde\xa0\x45\x47\x0d\xf9\x88\x8d\x7c\x60\x4d\xbe\x21\x43\xd0\x16\x4a\x46\x46\x45\xab\x57\x9d\x7f\xd2\x55\xf5\xa7\x01\xad\xeb\xeb\x89\xda\x27\x58\x64\x28\x0e\xfe\x9a\x91\xdf\x11\xe4\xef\x4c\x2c\x12\x32\x9d\x72\xbb\x5e\x1c\x3e\xa9\xf7\xc1\x11\x15\x30\xa2\xbc\x39\xf1\x53\x6b\x4f\x70\x5f\xba\x9f\x12\x30\x68\x74\x76\x2d\x9d\x62\x4e\x8f\x55\xd0\x84\xd9\xec\x29\xc7\xca\xb2\x4f\xe2\x3f\x94\x6c\xd5\x3b\x31\x2f\x99\x88\x75\x1d\x70\x8f\xf3\xfd\x3b\xf3\x4d\xdd\xb5\xba\xfb\x8e\xc9\xf0\xfb\xf6\x9b\xf4\x38\x39\xfb\x90\x63\xb9\xf6\x8f\xcb\x84\x9f\xac\x16\xb1\x5d\xbe\x91\x7d\xc8\xed\xd2\xff\x07\x7d\x11\xfb\xf9\xd1\xbc\x79\xa9\x2c\x5a\xcd\xee\x9f\xbd\xd4\xcd\xcf\x23\xc8\xa8\xea\x39\x4e\xdf\x7e\xf9\x8a\xd7\x5c\x22\x22\xa5\x59\xfc\xaf\x19\x34\xa8\x5b\xfb\xc7\xa0\x21\x48\x81\x67\xf1\x56\x36\xfc\xca\x03\xcb\x01\x06\xb9\x5a\xe4\x43\xc7\xc9\x01\x36\xc3\x3d\x92\x86\x8d\x5f\x9e\x6a\x27\xce\x7f\x48\xbc\xad\xd3\x9b\x77\x1d\x06\xcd\x17\xce\xa0\x99\x94\x6a\xeb\x93\x6b\x89\xc8\x93\x9e\x7e\x8c\xd5\x2a\xd1\xc3\x1c\xec\x5b\xd8\x68\x8c\x73\x25\x9f\xe9\x6c\xa2\xfd\xb3\x63\x58\x78\x2d\x4b\x59\x42\x70\x96\x25\xfc\x4c\x33\xf5\xb2\x22\x67\xe9\xb9\x1d\x13\x7d\x1b\x63\x71\x76\xbe\x37\x57\x83\x73\x6b\xd1\x2c\xae\x6e\x65\xa2\xcc\x51\xd7\xec\xb5\x2c\x65\xc1\x1b\x34\x52\x2e\xa9\xa6\xca\x93\x41\x2b\xd6\xb8\x4c\xb2\xaf\xd2\x18\xcd\x86\x0a\x4b\x7e\x26\x9f\x02\x59\xd9\x31\x50\x33\x5a\x8e\xb4\xdf\x5e\xcb\xdd\x3a\xc0\xfd\xac\xe5\xc4\x9d\x2a\x0d\x0c\xd4\x4f\xbf\x62\xbc\x05\x5a\x4e\xde\x62\xe1\x9c\xc9\xbd\x99\x2e\x5c\xd4\xf3\xe9\x97\x58\x5b\x6e\xe4\xba\x86\x43\xb2\xf5\xff\xbb\xff\xd0\x55\x09\x2b\x21\xc1\x2b\x21\x46\xb7\xca\xf2\x6d\xfd\x94\x85\xbb\x0f\xbf\x25\xb7\x18\x5d\x86\xc8\x27\xeb\x21\x94\xed\xf7\xe9\x6a\xf6\xbe\xc5\xb0\x17\x35\x14\x07\x4e\x58\x29\xfb\x28\x8e\x34\xe6\xc1\x74\xcd\x71\x35\x66\xf6\x77\x54\xef\x8c\xc4\x9d\x2e\x22\x8d\x2b\xb2\x57\xea\x4f\x8e\x55\x04\x04\xde\x00\x56\xa4\x20\x38\x70\xc2\xea\x22\x95\xe4\x4e\xd6\xd1\xb2\xfc\xd0\x69\x84\xe3\x2b\x5f\xd6\x77\x2a\xd9\x53\xe9\x14\x2c\x19\x88\xc1\x13\x78\x3e\x69\x22\x09\xb4\x66\x80\xe2\xc0\x71\xeb\xb8\x50\x65\x85\x1f\x34\x12\x19\x93\xb0\x7b\x6f\x9f\xde\x8c\x78\x24\xfc\xd6\x47\xce\x29\x79\xf9\xf1\xeb\x1f\x9e\x73\xb6\x5a\x40\x82\x85\xe2\xc0\xe3\x3b\x3d\xdf\xbe\x81\x5a\x1a\x52\xf3\x9d\x90\x76\x9a\x71\x79\x55\x6f\x90\x4e\x6d\x44\x46\x34\x3c\xac\x55\xea\x2f\x79\xf0\x24\xbb\x25\x6c\xb2\x01\xf5\x24\x5e\xa5\x1d\x72\xa9\xa7\x74\x7e\xfc\xdc\xab\x4d\x6c\xd3\xe7\x98\xf6\x96\x64\x65\x98\xc9\x33\xf5\xbf\x15\x2d\x5a\x63\x3d\xd3\xe8\xf1\xb2\x4d\x60\xd7\x0c\xc5\x81\xb5\xb3\x6c\xa2\x65\x98\x31\x19\xc7\x2d\x62\x7f\x91\xf5\xfd\xd7\x4a\x6a\x7e\xde\xb0\x62\x23\x5e\x5b\xec\x6a\x42\x88\x4f\x45\x43\xbc\x00\x2c\x2e\x14\x07\x57\x2e\x5c\xab\xe7\xcb\x8d\x1d\x9a\x71\x73\xb5\x60\xd2\xab\xca\x86\x9c\x04\x7b\xd3\x56\x2c\x30\x80\xd0\x92\xd3\xf9\x88\xf3\x76\x0e\x30\xc9\x87\xe2\xc0\x71\x55\xa4\xd0\x17\x6f\x3f\x0f\x1a\xb2\xdc\x3d\x1e\xdf\x42\xfa\xf1\x74\x39\xfc\x83\x5a\x2f\x95\xe1\x4e\x2f\xb6\x0e\x91\x38\x72\x0c\xd0\x4e\x0b\x8a\x03\x8f\x2f\xd7\xb0\x78\x3b\x4b\xf9\x09\xa5\xc0\x0f\x5e\x97\x34\x7c\x65\x4d\xc7\x94\x14\x22\x92\x8f\x6a\x4a\x4f\x67\x2a\x22\xe2\x73\xe7\x28\x60\xda\x41\xbd\xce\xae\xd2\xee\x06\xde\x78\x6c\x14\xd3\x7e\x00\x49\xbc\x26\x81\xf9\x58\x9f\xf4\xc3\x16\x7e\x2c\xf7\x6f\x81\x88\x72\x3f\x29\x2b\x22\xdf\xa8\xd5\x00\x1d\x5f\x21\x38\xb0\x76\xab\x1e\x4c\xf6\x2c\x08\x13\x6f\x45\x0c\x54\x36\xb9\x34\x28\xbb\x2f\xd0\x7b\x75\x5d\x62\x91\x1d\x32\xa4\x90\xda\x4e\xa8\x35\x9b\x80\xf6\x54\x10\x1c\x78\x8c\xdb\x46\x5d\x12\x0c\x42\xcb\x12\x9a\x33\x4c\x7d\xec\x4a\xbe\x91\x9d\x3f\x53\x6a\x2d\xb7\xf5\x15\xff\xf2\x8c\x73\x42\xaa\xd3\x1b\x78\x9e\xa1\x38\x70\x5c\xf7\x45\xb4\xd3\x9e\x43\x4c\x0a\x71\xee\x58\xff\xa1\x1b\x7c\x0b\xc9\x98\x2b\x85\x1f\x64\x90\xe2\x87\x73\xfa\x4a\x09\x77\x98\xe9\x61\x71\xa1\x38\xf0\xf8\x12\x88\x7e\x43\x24\x0e\xb0\xbd\x4c\xdc\xfe\x8b\x2c\x1d\x35\x89\xcd\x12\xe9\x22\xe8\xe1\x28\x84\x51\x6e\x8d\xc1\x6a\xda\x9f\x98\x0c\xd3\x0e\x2a\x27\x5c\xa5\x1d\xa7\x57\x5d\x37\xa6\x84\x17\xd1\x39\xe3\xd1\x33\x95\x1d\xee\xd7\x17\x31\x1a\xe7\xc9\xfd\xe6\x71\x03\x4a\x63\x43\xa6\xb4\x02\x55\x40\xdb\x19\x08\x0e\xee\xdc\xf4\x8b\x84\x5f\x76\x6d\x92\x27\x67\x02\x7e\x5f\x2c\xf0\x5b\x03\x89\x57\x46\x6e\xc9\xf5\xb6\xcd\x23\x6c\xa8\x4d\x32\x4e\xa5\x02\xed\xa9\xa0\x38\xf0\x18\x63\xbf\x88\x7f\xcc\x37\x3c\x1f\x2c\xa8\xae\xce\x47\x32\x66\x47\x61\x35\x52\x1c\x9b\xee\xd1\xa2\x9e\xa0\xe9\x41\xb5\xc1\x1a\x0f\x6c\x37\x87\xe2\xc0\x71\x13\xd8\xa7\x85\x05\x69\x11\xf8\x8e\xd7\xa7\xe3\xb6\x3e\x1d\x56\xe6\x48\x91\xae\x36\xbd\x15\xbf\x8f\x13\x3f\xfb\x41\x52\xc6\x05\x38\xa8\x0b\x8a\x83\xdb\xd5\x51\x41\xb9\x2f\xf3\xdc\xf9\x85\xc5\xdf\xbd\xb0\x37\x31\x0c\xc9\x55\x61\x4e\x7e\x69\xf4\x5e\xe5\xb4\x64\xd5\x8e\x1d\xbe\xa6\x8a\x30\xed\xa0\x12\xeb\x55\xda\x0d\xfc\xc8\x19\x5f\x54\xdd\x72\xda\x12\x22\xfa\xce\x9a\xdb\x72\xe1\xfb\xf4\x65\xee\xdf\xc2\x8b\x69\xf5\x08\xdf\xf0\x14\x0b\x4b\x71\xd8\x35\x43\x71\x60\xed\x64\x18\x4c\x32\xc3\x9b\x1f\xa4\x3d\x56\x7e\xee\x2d\x4a\x63\xfd\x10\x79\x0c\x91\x76\xbe\x79\xd5\x7c\x37\x6f\xb3\xa2\x4e\x2f\x0a\x68\xf7\x04\xc5\x81\xc7\xb8\x43\xdb\x5f\xae\x2b\xd9\x43\x16\x37\xb3\x21\xf6\x36\x85\xe1\xd0\x1e\x66\xd8\x86\x9b\x54\x86\x71\xa5\x4e\x98\x2b\x1e\x01\x23\x2e\x2c\x2e\x14\x07\xb7\xaa\x4a\x6b\x95\x92\xe0\x44\xaa\xfa\x46\x8b\x5e\x74\xa6\x5e\xf7\x5b\x7b\xdb\x6d\xae\x77\x6a\xdb\x4f\xfa\xbf\xd2\xc6\x7c\x44\x1e\x1a\x07\x56\x55\x21\x38\xb8\x93\x26\xfc\xf4\xb6\x5b\x2c\xb2\x0d\x56\xeb\x3b\x45\xa7\xb8\xf6\x5e\x1a\xb2\xbf\xa8\x8f\x39\xf2\x76\xf7\x4d\xb3\x23\x3b\x5d\x77\xdb\x84\x19\x34\xa8\xc9\xfd\xd5\x06\x0d\xf9\x0c\x0d\x67\xcc\x26\x9e\xec\x81\x5c\x58\x0e\x4f\x4d\x4e\x61\x8c\x11\x73\x4e\xab\x76\x70\xdd\x00\x71\x31\x81\xab\x14\x82\x25\xcc\xec\x40\x71\xf0\x66\x87\x8e\x79\x2c\x42\x2e\xa2\xf5\x01\xd3\x57\xb2\x6f\xc3\xb8\xd2\x24\x95\x16\x63\x6f\xd1\xbe\x9a\xf8\x98\x84\x0a\x95\x29\x62\xd2\x3f\x82\x45\x86\xe2\xe0\x0d\x5a\x64\xf2\x7b\x3f\xbb\x99\x0b\x69\x02\x26\xe6\xe9\xc0\xcc\x0e\x0f\x7e\x2d\x1b\x64\xaf\x5b\xdf\x1f\x7b\x97\xd5\xad\xcc\x3d\x7d\xe2\x0d\xac\xcd\x41\x70\x01\xd2\x08\x08\x37\xfe\x23\x72\x87\x50\x37\xaa\xed\x7c\x88\x8d\xac\xc4\xbc\x72\x7e\x5e\x99\xa1\x5e\x36\x15\x7e\x91\x62\x8e\x19\xf9\x12\xae\x95\xf2\xdd\x27\x2e\x80\x41\x43\x3d\xb5\x1f\xde\x3d\x93\x89\xd7\x1a\x6e\x6d\x11\xad\xd1\x7a\x9b\x37\xfb\xb2\xe5\x2b\x6f\x80\x77\xbc\x02\x8d\x63\xfd\x98\x00\xd3\xbf\x06\x4d\xd8\x61\xf3\xf2\x3e\x8e\x2e\x97\x98\xe2\x9b\xe3\xcf\x88\x66\xfd\x93\x56\x1f\x84\xdc\xd6\x44\xb2\xbd\x57\xb6\x5c\xa4\xed\x1b\x9d\xfe\x41\x6d\x0b\x47\xb2\xdb\xe5\xb7\x1e\x79\xeb\xfd\xc2\xa5\xca\x69\x72\x57\x7b\x15\xa9\x9f\xa6\xf3\x53\x4b\xb7\xd1\xb3\x70\x63\xc9\xa1\xf2\x7f\xcd\xa0\x41\xdd\xda\x3f\x06\x4d\x02\xce\xa0\x25\x14\x0c\x5b\x52\x64\x70\x79\x0a\x8f\x25\xcc\xbb\x88\xdc\x7f\xd5\x8b\xba\x78\x57\x72\x3a\xa3\xca\x8a\x06\x3d\xed\x4e\x4a\x10\xc2\x75\x18\xb4\x76\x38\x83\xf6\x9e\x5a\x42\x46\xa0\xc2\xc7\x87\x42\xba\x83\xc5\xe8\x02\x33\x13\x9b\x80\x67\xd2\xc0\x58\x5a\xe9\xf4\x91\x07\xcd\xc0\x87\xd3\xd1\x6b\x59\xca\x82\x37\x68\x1d\xb1\xee\x99\x11\xea\x5f\x55\x9f\xef\x72\xcc\x5e\xdc\xef\x13\xf9\x9a\x93\xaa\x28\x98\xb4\x81\xf5\x72\xe0\x02\x85\x5e\xb0\xd4\xe9\x5a\x96\xb2\xe0\x0d\x5a\xf2\x24\xe5\x0f\xcc\x82\xed\xd9\x7b\xcf\x91\xc6\xaa\x1f\x67\xc4\x8c\xa0\x73\x71\x52\x04\x77\x33\x3e\x21\xa4\x78\xf1\x78\xfc\xc2\xfe\x5a\xee\x16\xde\xa0\xd5\x4a\x51\x0c\xf8\xdd\x29\x44\x3e\x1e\x1a\xd1\x12\x11\x67\x0c\x38\x0a\xa0\x58\x32\x20\x47\xf8\x7b\xcf\x7c\xf0\x35\x7a\xef\x47\xab\x6b\x33\x68\x50\xff\xa1\xab\x12\x96\x73\x38\xc6\x63\x3e\x43\x44\xdc\x1b\xa2\x89\x0a\x9b\x73\x8a\x02\x59\xf2\xbc\xb1\x6b\xdc\xe8\xee\xed\x51\x88\x93\x44\x64\xf6\xc0\x6a\x09\x14\x07\x4e\x58\x7c\x2c\xf3\x8b\x6f\x7e\x8c\x45\x0b\x30\xe1\xf6\x07\x62\x8f\xd4\x46\x87\x53\xfc\xac\xc9\x88\xee\x94\xca\xfb\x79\xf9\x89\x7f\x0b\xa8\xc7\x83\xe2\xc0\x89\xc5\x33\x06\x57\x2e\x94\xfd\x74\x99\x2a\xee\xc2\xb4\x72\x1f\x2f\xb5\x7c\x5c\x21\xc5\xcd\x4e\x66\x5d\xef\xe7\x85\xdf\x84\xdf\x02\xd0\x97\x18\x8a\x03\xc7\x3d\x35\xbc\x78\xf9\x7c\xd3\xa2\xe6\x07\x2d\x7d\xb6\x72\x34\x4b\x40\x85\xed\x1a\xeb\x82\xe9\xbc\x35\x36\x0e\xb9\xf4\x39\xfb\x63\xe0\xa8\x21\x28\x2e\x40\x92\xfa\x3f\xc6\x41\x78\xff\xdc\x58\x7d\xce\x2c\x09\x2f\x35\x1e\xb7\xd2\x31\xcb\x33\xa3\x85\x67\xdd\x59\xba\xfe\xaf\x85\x28\x26\xed\x4d\xba\x5c\x5e\xd8\x64\x03\xea\x49\xbc\x4a\xbb\x82\xf5\xfe\xaf\x8b\x4f\xd4\x4c\x0b\x8c\x95\x36\x0b\xbe\xbc\xcc\xba\xcd\xf9\xfa\x47\x20\x83\xa2\xc1\x6d\xb4\x37\x89\xfe\x45\x3a\x40\x6f\x00\x28\x0e\xac\x1d\x52\x9c\xcd\x31\x91\x76\x76\xac\x82\xb3\x7b\xad\xfd\xb7\xc0\x0d\xcc\x8a\xf4\xe1\xd1\x0e\x62\xf1\x18\x39\x4b\xd2\xc4\x4f\xeb\xc0\xe9\x9d\x50\x1c\xdc\xf6\x97\xfa\xc0\xaf\xdf\x78\xb9\x10\x7c\x65\x2a\x1b\x2a\x63\xa3\x35\x7e\x92\x33\xb7\x7d\x2e\x4c\x89\x15\x19\xc1\x2a\xfc\xb1\xf1\x14\xa8\xfd\x84\xe2\xc0\x71\xe3\x30\x67\x5e\x7c\xe4\x5c\xfa\x56\x6a\x88\x7e\x18\x14\x99\xdb\xca\x16\xfc\x77\xd8\x59\xf0\x9c\x64\x7e\x57\x76\x2d\xf0\x4b\x90\x26\x2c\x2e\x14\x07\xd6\xce\x5a\xfd\xed\x52\xbe\x6b\x96\x1f\x4a\xc2\xa7\xf5\x87\x29\x59\xf9\xde\xd9\xcc\xca\xcf\x56\xcd\x55\x54\x72\x04\x72\x55\x19\x74\x2e\x60\xda\x41\xbd\xce\xae\xd2\x6e\x5a\xb4\x46\xe9\x13\x06\x0d\x61\x57\x7d\x83\xfc\xc9\x97\xc4\x5e\x46\x2a\xf9\xac\xf8\xb8\x4f\xef\x14\x30\xe3\xc7\x5b\x85\x6a\xde\xc0\xae\x19\x8a\x03\x6b\xe7\x8a\x50\xd4\x86\xe2\x95\x3c\xf6\x30\x24\xa2\xd2\xb2\xe1\xe0\x93\x1d\xeb\xe5\x59\x6b\xdf\xc3\xf0\x44\xef\xf7\x76\xa4\xd3\x15\xef\x80\xde\x56\x10\x1c\x78\x8c\x5f\x8b\xdf\x7e\x58\xd8\x89\x15\xc8\xb3\x55\x50\x46\xac\x85\x9e\x7c\xc6\x23\x95\x4d\xf1\x57\x38\x41\x90\xc8\xee\x56\x4c\xf5\x34\xf0\x7c\x40\x71\xe0\xb8\x55\xa1\xfe\xdf\x29\x45\x69\xab\xf1\x53\x3a\xd2\x1e\xdd\xc5\x6d\x50\x4d\x32\x7b\x1c\xa8\x6c\x97\x75\x3c\xa0\xcc\x31\x3e\x95\x0f\x7c\x70\x81\xe2\xc0\xda\xad\x72\x2f\x38\x14\xeb\x29\xd1\x9d\x37\xe2\x6d\x49\x65\x1c\x70\xa3\x58\x57\x9a\xdf\xeb\x24\x8f\xff\x42\xf2\x43\x82\xc1\x22\x6f\x19\xa6\x1d\x54\x4e\xb8\x4a\xbb\xed\xfd\x8f\xc7\xf2\xdc\xbc\x1a\x35\x08\xb4\x56\x98\x71\x3d\xe6\xbe\x66\x41\x9c\xee\xb7\x0f\x5b\xd0\x6e\xe0\xd2\x2f\x4d\x45\x03\x27\x98\x43\x71\x60\xed\x46\xb1\xb4\x42\x7e\x6a\x44\xc6\xaf\x7c\xb7\x64\xd2\xf3\xd4\xe1\xcf\x9e\x4e\x7a\xf7\xc8\xa2\xf0\x54\xd2\xd0\xcc\x76\xc7\xa4\x0a\xd8\x66\x0d\xc5\x81\xc7\x58\x82\x37\xf4\xc0\x52\xfe\xc8\x5f\xba\x22\x45\xaf\xf8\xc2\x58\x78\x47\xda\x61\x84\x55\x86\xa4\x69\xe8\x8d\xca\xf3\x3f\x05\x88\x6f\x61\x71\xa1\x38\x70\x5c\xe3\xc5\x9a\x10\xe4\x31\x4d\xb4\x7a\x96\xfe\xe2\x16\xd9\x20\xd6\xd4\x50\xfc\xfb\xc4\xf4\x98\x8d\x6f\xc3\x51\xf7\xa3\x4c\xcb\x5e\xc1\xe2\x42\x71\x60\xed\xa8\x67\xe6\xc2\x67\xf8\x33\xa9\x0a\x57\x88\x69\xf0\x51\x96\xe5\xbe\xf4\xae\x4e\x7e\xba\x4f\x64\x65\xc5\xac\xf8\x9b\x8b\x9e\x39\x0b\xa6\x1d\x54\x62\xbd\x4a\x3b\x5c\x5f\x6c\x5e\xd5\xb4\xf7\x89\x0f\xd9\x58\x4c\xbf\x3c\xdd\xe5\xf7\xd0\x40\x7e\xa3\x67\x53\x7a\xeb\xd3\xbe\x31\xa1\xbb\xad\x1e\x50\x6b\x0c\xc5\x81\xb5\x5b\x0f\xd5\x8b\xf5\xc2\x1b\x2a\x94\xb8\x91\x22\x42\x39\xfb\x20\x8a\x5a\xb6\x39\xfc\xc9\x90\x74\x55\x93\x4e\xad\x94\xaf\x8c\xfe\x4d\x58\x5c\x28\x0e\xee\x83\x64\xea\xc1\xd3\x42\xca\xca\xb8\x79\xb2\x51\x3e\xfd\x48\x3d\x74\xa9\x5e\xe3\x5b\x6d\x99\x1a\x25\x91\x6f\x27\xa5\x5f\x52\xde\x07\x7a\x66\x41\x71\x70\xef\xcc\x42\x34\x75\x6a\xeb\xd2\xda\x6a\x94\x60\x7d\x62\x21\x99\x31\x83\xdb\x71\xd4\x11\xda\xb3\xeb\x78\xe5\x6c\x39\x67\x69\xd3\xc0\xae\x03\x28\x0e\xac\x5d\xbf\x64\x39\x8a\xda\xba\x82\x17\x35\x61\xe0\xd3\x51\xb1\xf4\x16\x44\x6e\xba\xb5\x50\xb6\x21\x56\xe5\x57\x59\x54\xf6\x16\x92\x1c\x30\x83\x06\x35\xb9\xbf\xda\xa0\x79\x47\x66\x78\xc8\x4a\x0c\xed\x1a\x6b\xd4\x6c\x3f\x62\xee\xf4\x7c\x59\x80\x40\xc7\x63\x1c\x84\x2b\xd2\xb8\xdd\xfc\xbe\x61\x26\x04\x66\x76\xa0\x38\x78\x83\xd6\xf2\xa9\x7c\x13\x25\xe8\x59\xbc\xf4\x33\xf2\x0a\x4f\x87\xdd\xe5\x53\x59\xb6\x71\x8e\xc2\x5d\xa9\x57\x2a\x81\xe3\xb5\x88\xa4\x22\xb0\xc8\x50\x1c\xbc\x41\x73\x5e\x0d\x70\x9f\x19\x5e\xd7\x8f\x54\x4e\x44\x6e\x33\xa5\x1e\x1a\x49\xc2\x18\x48\xce\x6d\xc0\x50\x33\xb7\xe0\xbf\x79\xdb\xa8\x1e\x16\x19\x8a\xfb\x3f\x83\xf6\x9f\x3d\x7c\x3c\x50\xa7\xc3\x62\x17\x43\xa5\xf0\x0f\xb3\xfc\x75\xb4\x54\xd5\xa2\x7b\x90\xcd\x63\x50\x75\xbf\x8d\x34\xe9\xa9\xe6\x6b\xea\xdc\x04\x0c\x5a\xc3\xce\x6c\xe1\x17\xb2\xc0\x66\x15\xd4\x1d\xad\x89\x68\xa1\xa1\xcf\x81\x0c\x98\xdc\x2a\xf6\x27\xb4\x59\xfa\xb5\x35\x3c\xd9\xdd\xff\x1a\xb4\x4f\x25\xf6\xcc\xf4\x55\x15\x06\x0e\xb8\x23\xe4\xeb\x88\x5b\xa9\x3d\x26\x56\x5f\x7d\x2b\x29\xce\xf7\x84\x4c\xd7\xd3\xdd\xb6\xff\x3d\xfa\x63\xe4\x91\x35\x2f\xd5\x40\x60\x41\x8b\xfe\xaa\x7d\x3f\x36\x8a\x2a\xf7\x48\x57\xf0\x85\x2c\x42\x4d\xa4\x79\xd6\xc1\x05\x3e\x87\xef\xff\x9a\x41\x83\xba\xb5\x7f\x6b\xd0\xe0\x0c\x1a\xff\x3d\xce\xc4\x77\xa6\xbc\x7e\x58\xb3\xe2\x44\x77\x29\xfe\x2c\xe4\x64\xd4\x08\x98\x34\x06\xc6\x93\xad\x15\x2a\x9f\xb2\x71\x64\x5c\x87\x41\x43\x50\x06\xff\x2a\xab\x4c\xef\xed\x1e\x61\xd5\xf3\xd7\x29\xae\xce\x1f\x1f\xe2\xc5\x22\xb6\x3e\x5e\xce\xc8\x2d\x62\x69\x0b\xf1\xbf\xed\xf3\xa3\x96\xee\x5a\x96\xb2\xe0\x0d\xda\x8a\x3a\xf6\xb2\xc8\xa4\xf8\x47\x5b\x05\x3b\xf6\xc1\xd0\xa1\x7d\xbe\xe9\x88\xf1\xdd\x66\x54\x9d\x70\xed\x64\x3a\x01\x7c\xf6\x8f\xd7\xb2\x94\xa5\x05\xf7\xb3\xf9\x2d\x95\xdd\x45\xf7\x53\xf6\x54\x3d\xde\x4a\xf8\xf8\x6c\x97\x0b\xdc\xe5\x76\xd9\xd6\x2d\xe9\x78\x96\x74\x77\x17\x61\x4c\xa3\xea\x5a\xee\x16\xde\xa0\xfd\x1c\xa1\x6a\xac\xb7\xaf\xb8\xb1\xb8\x94\xa4\xe4\x8a\xa3\x3f\x5c\x46\xf4\x5c\x5e\x70\xae\x22\xb3\xbb\x71\x7a\xe9\xc2\x33\xd1\xef\xda\x0c\x1a\xd4\x7f\xe8\xaa\x84\x15\x40\x6c\x25\xdb\x67\xfc\xb1\x2d\x74\x5e\x42\xec\x43\x2d\x86\x40\x46\xe3\x1d\xa4\xcb\x84\x09\xed\xbc\x74\xbe\xbc\xcf\xb2\x92\xfd\xb0\x17\x35\x14\x07\x4e\x58\x2a\xc7\x82\xb6\x1f\xb1\x0b\x8a\x36\xec\x10\xfe\x04\x9a\xcd\x7b\x4d\x20\x58\x16\x85\x13\xb2\x2f\xde\x36\x9a\xb9\xf3\x73\x9b\x16\x1f\x58\xd5\x80\xe0\xc0\x89\xe5\x51\xbf\x43\x5d\x3a\xa2\xeb\x08\xa6\xb5\xb9\xf6\xd4\x64\x5f\xef\x4e\xf1\x01\xc3\xb8\x55\x23\xa1\xb0\x39\x39\xfa\x83\x00\xd4\x29\x58\x5c\x28\x0e\xae\x18\x9b\x5f\x97\x79\x47\x9d\xd5\x24\x9d\x9b\x53\x10\x31\x0f\xb9\x07\x9b\xfa\x99\x2b\x59\xb5\x26\xd2\x28\x95\x82\xea\xc4\xe1\x04\x26\x50\x8c\x0d\xc1\x81\xb7\x92\x14\xb4\xbd\xcd\x57\x47\xcd\x92\x22\xc4\xb6\x8d\x8a\x6f\x55\x96\xf4\x2e\x60\xf8\xfc\x7a\x8a\x86\x36\x77\x46\xc4\xb0\x87\xdb\xfc\x01\x6c\xb2\x01\xf5\x24\x5e\xf9\x35\xf8\x35\xea\x74\x22\x2d\xe3\x64\x32\xc2\x1f\x0c\xa4\x1c\x97\xae\x86\xbd\x86\x29\xe5\xae\x2a\xfb\x8e\xde\x16\x6c\xd4\x15\x39\xa0\x09\x2a\x14\x07\xd6\xce\x7b\x3e\xc0\x7c\xee\x64\xc2\x42\x84\x93\x59\xf5\xe9\x1e\x7b\xa4\x62\xf8\x0a\x9b\x2d\x57\xc5\x7b\xbe\xe6\xb8\x41\x53\x1f\xdf\x1c\x60\xeb\x24\x04\x07\x1e\x63\xfe\x1d\x6d\x29\xde\x48\x9e\x78\x8d\xed\xf4\x6a\xde\x7a\xcc\x56\xd4\xbb\xa7\x1b\x38\x9a\xf4\xb1\xf9\xf4\xec\x24\x3c\x28\xb7\xbe\x00\xcd\x55\x21\x38\x70\xdc\x3f\xbd\xea\xf5\xf2\x3f\xb9\x74\x62\x7e\x19\xc7\x2a\x10\xd8\x49\x1f\x89\x93\x8b\x21\xbe\xec\x41\x6e\xe5\x2c\xae\x0a\xfc\xc6\xed\x02\x34\x57\x80\xe0\xe0\x9a\x20\x9c\xe3\xbd\x18\xb1\xb0\xf6\x1c\xe0\x17\xd2\x08\xb5\x7c\xcb\xd8\xf2\x6b\xda\xc3\xeb\x17\xa7\x65\xf9\x99\x2c\x3a\x55\x11\x82\x06\x4c\x3b\xa8\xd7\xd9\x95\x67\xab\x8e\x49\x9c\xf6\x1c\x6d\x48\xe4\x9d\x17\x57\x12\xda\x17\xdd\x7f\x54\x72\xae\x48\xae\x4c\x8d\x30\xd8\xea\x41\x17\xe7\x34\xf0\x10\x76\xcd\x50\x1c\x58\xbb\x04\xb1\x40\x34\x9b\x8c\xd9\xe2\x6a\xfb\x91\x75\x31\xdc\xc6\xa5\xcd\x60\x8e\x7b\x53\x58\xfc\x02\x4c\xe5\x95\x32\xe9\xe6\x4b\xc0\x0a\x01\x14\x07\x1e\xe3\xb5\xb6\x79\x4f\x6a\x15\x84\xdb\xc4\x19\x71\x09\xdf\x6f\x28\x1b\xee\x98\x24\x31\x1b\xa3\xa2\x46\x2f\x2e\xf0\xce\xfe\x89\x74\x58\x80\xc5\x85\xe2\xc0\x71\xa9\xf5\x90\x4f\xbf\x4e\x2e\xf1\x13\x28\xfe\x8a\x61\x2e\x2a\xd2\x4b\x78\xbb\xed\x2d\x1e\x56\x94\x9e\x6b\x21\x7b\x12\x6f\x13\x01\xd4\xcc\x41\x71\x60\xed\x2a\xe8\x90\xfc\x71\xf8\x54\x78\x5f\xcf\xa4\x76\xb0\xf3\x39\x56\x11\x94\x86\x1a\xb2\x3f\xd8\x8c\x0d\x7f\xed\x99\x4e\xa7\x18\xba\x0e\xd3\x0e\x2a\x27\x5c\xa5\x5d\xed\xc1\x9a\x31\xc5\x3d\x73\xa7\xa5\xa0\x22\x5c\x3a\x3f\x72\x3d\xbf\xfd\x47\x99\x8a\xc3\x49\x23\xa5\x22\xdc\x3c\xeb\xf7\x1e\x2a\xc2\xae\x19\x8a\x03\x6b\xf7\xd9\x48\x8b\x46\x33\x72\xb4\xc1\xfe\x9b\x4d\x5e\xe6\x79\x0a\x91\x8a\xa2\xce\xc6\x4b\xe5\xbd\x06\xf6\xe6\xa1\xb6\xd3\x56\x6f\x60\x3b\x1b\x14\x07\x1e\xe3\xf2\x19\x1a\xca\x24\xf2\x68\x23\x9b\x94\xb0\x13\x3f\x49\x81\x59\xaf\xfb\xd9\x14\xe5\xa5\xbc\x87\xd4\xf7\x34\x79\xb2\xfc\xa5\x80\x06\x16\x50\x1c\x38\x2e\x5a\x45\x1c\xcf\x5c\x5e\x60\xd4\xd9\x87\xbc\x4b\x05\x22\x65\xea\x3f\x3c\x5c\xf8\x2c\x59\xbf\xbd\xff\x76\xbd\xe2\xfb\xec\x85\xef\x01\x8b\x0b\xc5\x81\xb5\xb3\x79\xa5\x36\x6e\xcc\x99\x3a\x48\x61\x38\xe4\xe3\xc9\x88\x94\x52\xb4\xc1\xe5\x63\x35\x31\x58\x47\xcf\x80\xf9\x70\xfe\x25\x69\x1e\x70\x3e\x27\x44\x62\xbd\x4a\x3b\x7e\x77\x62\x86\x8e\xe4\x47\xac\xcd\xbf\x05\xbe\xec\x2c\xe2\x71\x23\x1c\xbe\xe9\xa0\xd0\xc5\x7e\x31\x5b\xec\xe0\xda\x8d\x4c\x08\xd4\x52\x42\x71\x60\xed\x70\xe8\x7d\x08\xd3\x1e\x2b\x7e\x9f\x19\x78\x3f\xed\x8b\x6b\xf5\xc6\xec\x0d\xb7\xce\x67\xeb\x6f\x89\x85\xaf\x77\x70\x2d\xce\xda\xf9\x60\x71\xa1\x38\xf0\x18\xdf\xa3\x4c\x4d\x1e\x7a\x85\x3a\x63\x34\xdf\xb7\x7e\xf4\x92\x62\x54\x50\xe4\x9c\xcc\x3e\xa9\x5a\xbc\x19\xaf\x51\x2a\x58\x9b\xc8\x12\x16\x17\x8a\x03\xc7\xa5\x79\x8a\x79\xbb\x91\x44\x56\x80\xf5\xa2\x63\x92\xa5\x93\xfd\xbb\x2d\x21\xdd\x64\x7e\x72\xbf\x52\xe0\x3d\x66\xa9\xf4\xf0\x69\x6b\x58\x5c\x28\x0e\xac\xdd\x00\x81\x4e\x4c\x5c\x88\xbd\xca\xcc\xeb\x0b\x06\x77\x8d\x3b\x58\xc3\xbe\x93\x6f\x57\x96\x77\x9f\x7c\x1f\xfb\x4e\xaf\xef\x40\xba\x00\x33\x68\x50\x93\xfb\xab\x0d\x9a\xb3\xa4\xf3\x6f\x12\xed\x76\xa4\xe0\x09\x2c\xcb\x31\xfe\x5b\xd3\x1c\x2d\x99\x34\x81\x31\x32\x92\xee\x2a\x31\x2c\xbf\xf4\x75\x8d\x00\xb3\x03\xc1\xc1\x1b\xb4\x47\x32\x6b\xfc\xb9\x86\xcf\x88\x3b\x4d\x8b\x16\xfa\xf3\xac\x0d\xe8\x3a\xad\x90\x24\x5f\x4c\x76\xba\x92\x25\x79\x39\x1f\x89\x00\xed\x47\xa0\x38\x78\x83\xe6\x2f\x31\x2a\x18\xb4\xf7\xfa\x72\x3b\x38\xf2\xd5\xfd\x69\x64\x85\x4e\x02\x06\x9c\x24\x71\xe2\x5b\x81\xa9\xbf\xcb\xeb\xb6\xed\x33\x61\x91\xa1\xb8\xff\x33\x68\x78\xff\x11\x39\xed\x89\x98\x9c\x5e\x3d\xab\xfd\x31\x93\x3e\xee\x6c\xd1\x8f\xe7\xdc\x15\x37\x73\x22\x89\xa7\xb4\xa6\xca\x9f\x16\x2f\x45\x77\xb3\x02\x06\xad\xff\xbb\x66\x2b\xd7\x34\xbb\x5d\x21\xb5\x9f\x98\x87\x1c\x0a\x1f\xca\x9d\x4c\x64\x55\x32\xfc\x81\x2f\x25\x8c\xe2\x18\xbd\x9a\x97\xff\x1a\xb4\xfb\x99\x92\x8d\xc3\x54\x78\xcb\x66\x51\x2e\x6f\xc6\xbf\x5a\x09\x2c\x1c\xa4\x6b\xd8\x89\xb7\x2e\xb1\xa2\xb9\x1d\x63\xbe\xc0\x64\xf8\x07\xf5\x23\xc8\x8f\xf1\x2c\xc6\x5c\xe1\x41\x68\xf8\xdd\x25\x2a\xe8\x39\xfd\xb5\x92\x1e\x6b\x83\x23\x21\x3e\xe0\x5d\x29\xe5\x73\x5e\xb7\xff\x35\x83\x06\x75\x6b\xff\xd6\xa0\xc1\x19\x34\xae\xd9\x8d\xcd\x97\xac\xcf\x70\xf4\xd9\x8e\xdc\x4b\xe9\xa8\x4c\x62\xe8\xfb\x1a\xe3\x88\x55\xcc\xe6\x9f\x60\x60\x69\xc4\x28\xdb\x5d\x87\x41\x93\x80\x33\x68\x37\xd0\x79\x5d\x02\xd5\x05\x9f\x59\xb1\xe1\xf5\xa6\xd5\xe0\x71\xf6\x17\x4a\xb7\x26\xa7\xbb\x72\x4b\x74\x72\xf8\xdc\x6a\x30\x0c\xbc\x96\xa5\x2c\x78\x83\x26\xd2\x8a\xf0\x9c\x14\xb1\x60\xf8\x96\xe3\xc4\x50\xa9\xed\xdb\x87\x47\xc1\xc8\x2a\xe4\xc7\x71\x1f\x5f\x11\xf2\xdf\xe3\x33\x46\x6e\xba\x96\xa5\x2c\x78\x83\x56\xf6\x87\xf5\xcf\xf0\xf7\xbd\x18\x21\xfd\xbb\x48\xfb\x89\xa2\xf7\x7e\xca\x26\x22\x92\x76\x3c\x3e\x21\xf5\xfd\x1e\xd8\x59\xb7\xf8\xe6\x5a\xee\x16\xde\xa0\xcd\x33\xcf\x15\xd1\xfe\x52\xfa\xe5\x28\xa1\xb6\xc1\x75\xe4\x4e\x53\x36\xe0\xa4\x6d\x8c\xe7\xdc\x2b\xf9\xf7\x73\xb3\x8f\x1d\xe2\xe1\xb5\x19\x34\xa8\xff\xd0\x95\x5b\xad\xf6\x6f\x78\x1f\x5e\xa2\x08\xb9\x7a\x1b\xec\x54\x89\x88\x0d\x67\xf9\x63\xaa\x91\x2d\xbb\xcf\x37\xf7\xc5\x4a\x8b\x4d\x32\x1c\x00\x5b\xad\x20\x38\x70\xc2\xd2\xb2\x8a\x7e\x2f\x81\x33\x42\xff\xe9\x19\x79\x61\x9e\xd0\xdf\xe7\x0d\xc9\xc4\x8e\x79\x81\x2e\x37\xb5\x14\x3f\xde\x90\x66\x15\x00\xea\x13\xa0\x38\x70\x62\xe1\xac\x44\x8e\x3e\xee\x15\x2c\xc8\x2f\x3b\x79\xb5\x9c\xf2\x4b\xc7\x56\x4e\xc0\x76\xd2\xcd\xa9\x8e\x76\x75\x3e\x2d\xf6\xc7\x12\xb0\x6a\x04\xc5\x81\xe3\x22\xf3\x76\xb6\x4c\x0d\xce\x3a\x23\x9b\x62\xca\x60\x62\xed\x53\x71\x46\x78\xe9\xaf\x5e\xdc\xc7\x63\x20\xba\xd9\x1c\xc0\x8c\x6f\x0e\x6c\x17\x84\xe0\x02\x24\x11\xa8\xff\x8d\x7b\x87\x6b\x90\xee\x93\xfb\x7b\x81\xe4\x24\x2f\x81\x4c\xda\xfb\x0f\x75\x1a\x2b\x8d\x95\x3f\x64\xbf\x52\xad\x5b\xc6\x58\x6a\x7c\x00\x34\x09\x81\x7a\x12\xaf\xd2\x2e\xca\xe9\x39\xeb\xf7\x66\xa6\x3b\x03\x8e\x1f\x1f\x61\x3d\x3d\x55\xe0\x58\x79\xd8\xb2\x82\x6f\x96\xda\xa3\xc0\x84\xc2\x5f\xf5\x06\x18\x0b\x28\x0e\xac\x9d\xa3\x56\xfe\xa1\x47\xd6\xcd\xcb\x3b\x0f\x9f\x89\x1f\x66\x11\x7f\xea\xfc\x18\xbf\x50\x74\xbe\x3e\x13\x22\x26\xb8\xdf\xb6\xf8\x11\x98\x34\x43\x71\xe0\x31\xde\x31\xff\x1d\xf5\xb0\xbc\x85\x9d\xb4\x70\xe6\x80\xac\x94\x91\x19\x33\x5a\x94\x63\xbd\x9f\xfe\x29\xda\xc3\x04\x6d\xef\x52\xd7\x75\x58\x5c\x28\x0e\xae\x90\xfe\xde\xfe\x1c\x31\x63\x1c\x15\xed\x93\xfa\xfb\x3f\x44\xa4\xbb\xaa\x2e\x4a\x56\xf6\xef\xa1\x78\x3f\xb8\xac\xf7\xef\xce\x44\x00\x0e\x03\x87\xe2\xc0\xda\x05\xa0\xcd\x34\xec\x24\xce\xcd\x10\x11\xf0\xeb\x32\x56\xd3\x94\xf2\x3d\x0e\xda\x1f\xbf\xfc\xc5\xb8\xe6\x62\x50\x25\xfa\x18\x41\x05\xa6\x1d\xd4\xeb\xec\x2a\xed\xf2\x89\x84\xd5\x39\x04\xee\xa7\x44\xf6\xa4\x67\x09\x7a\x6d\xee\xf5\xb7\x4f\xd8\x57\xa1\xdc\xee\xd4\x40\x7b\x6d\x6c\x7e\xd7\x0e\x98\x20\x41\x71\x60\xed\x64\x31\x24\x6a\xf7\x5a\x0d\x2c\xc6\xf7\x09\xcd\x9f\xfe\x1a\x14\x90\xd7\x34\xeb\xdd\x49\x56\xec\x14\x13\xc7\x20\x9c\xac\xc9\x29\x80\xc5\x85\xe2\xc0\x63\xec\x3a\x43\x83\x70\xf1\x4a\x7f\x74\xba\x94\xc1\x12\x0d\x07\xbf\x3e\x56\x6c\xed\x0f\x1b\xa3\xd0\x9c\xc8\x76\x9c\xd0\x07\x7b\x4d\xe0\x80\x78\x28\x0e\x1c\x37\x94\xf6\x76\xe5\xed\x0c\x7f\x9f\x63\x8e\xaf\x5e\x1b\xac\xac\x7a\xba\x74\x51\x1f\x5f\xb8\xb7\x86\x3f\xfa\x15\x1f\x92\xba\xa5\x18\x03\x8b\x0b\xc5\x81\xb5\x1b\x28\x63\x99\xa1\x23\x51\xfb\xfc\x73\x58\xfe\xe6\x37\xe9\x4e\xec\xfc\xb9\x49\x92\x36\x24\x8b\xb1\x1f\x0b\x17\xb7\x98\x9d\x96\x14\x60\xda\x41\xe5\x84\xab\xb4\x43\x99\xf1\xf0\x74\x1b\xd0\xfe\xf1\xf3\x0e\xa7\x19\xf7\x90\xec\x5f\xd5\xfc\x97\x5d\x1b\x58\x32\xb7\x98\xec\x88\xee\x6d\xee\x0a\x00\xc6\x04\x8a\x03\x6b\x17\xb1\x82\xc2\x3a\xa2\x22\x94\x26\xa2\xdd\x9c\x9f\xd9\xa4\x22\xaa\x43\xca\x3f\x42\x84\x96\xfb\xa2\x14\x43\x72\x9b\xaf\xcf\xdd\x02\xa8\xd1\x84\xe0\xc0\x63\x4c\xa5\x5f\xe7\x9f\x98\x5b\xfd\xf5\xd9\x4d\xd6\x4f\xee\x32\xaf\x5f\x18\xaa\x7d\x66\xbf\xc7\x12\x3f\x1a\x72\x67\xfd\x5c\xb2\x19\x01\x58\x99\x83\xe2\xc0\x71\xad\x1f\xe2\x34\x7f\x74\x6e\xe9\x12\xa9\xe6\x5c\xd0\x96\xf5\x28\x7e\x84\xb3\x2a\x9b\x50\x6f\xf9\xc5\x20\x8c\xa5\x9b\xe0\xb1\x2a\x70\xaa\x0f\x14\x07\xd6\xee\x46\x7b\xcb\x47\xbc\xcf\x8d\x14\x3c\x8a\xd1\x17\x11\xdc\xc9\x67\xc8\x4c\x6a\x15\xdf\xa4\x3b\xe4\xab\x94\x9b\x63\x17\x6b\x51\xf6\x61\xda\x41\x25\xd6\xab\xb4\xa3\x90\xdf\xdc\x54\x45\x65\x7b\x7c\xfe\x14\x07\xa7\xcb\x6b\x41\x41\xa8\xcc\x47\x45\xf3\x83\x19\xca\xbe\x94\x33\xa2\x4a\x67\x08\xb0\x22\x05\xc5\x81\xb5\x13\xab\xed\x56\x2b\x1a\xc4\x7d\x57\xac\x5a\x69\x5b\x9b\x6a\x27\xde\x59\x19\x47\xc0\x73\xa6\xf8\xbd\x5c\x7d\x59\x01\x61\xaf\x18\x28\x15\x80\xe2\xc0\x63\x4c\x6c\x67\x26\xf0\xc7\x5d\x42\x51\x5f\xb3\x5b\x7e\x7f\x02\xc3\x3d\x2a\x85\x3a\x8c\x1e\x21\xfd\xe7\x0a\x26\x8b\x23\x96\xb4\x3d\x50\xab\x0a\xc5\x81\xe3\xe2\xe8\x8a\xb0\x8b\x05\x50\x77\xf4\x9b\xb5\xc6\x19\xc5\xb3\xdc\x7e\x27\xed\x32\x53\xab\xff\x4e\x89\xb5\x6d\x71\x87\x65\x27\x12\xe8\xd4\x0b\xc5\x81\xb5\x73\x7e\x1a\x30\xa5\x5f\x98\x26\x95\xe2\x2b\x32\xf6\xf7\x3c\x60\x8c\x79\xc5\x9b\x01\x7d\x58\x15\x7b\x78\x4b\xda\x29\x42\xad\x41\x01\x66\xd0\xa0\x26\xf7\xff\x1f\x27\x33\x24\xfa\x14\x1c\xd1\xda\xc4\x33\x22\x95\x64\x04\xbd\x4f\x99\xe6\x57\xfa\x71\xc0\xb1\x86\xb0\x45\x49\x90\xe2\x6a\x7a\xc6\xe7\x0f\x9c\xcc\x00\xc1\xc1\x1b\x34\xd5\xec\x94\xd5\x3b\xc7\xba\xd5\xe5\x8a\x25\xed\xdf\x9a\x4b\x48\xc9\x06\x5c\xbf\xe6\x22\x7c\x63\x78\x41\x12\x4c\x83\x9d\xcc\x8b\x0b\x8b\x0c\xc5\xc1\x1b\xb4\x18\x1f\x5d\x94\x59\x3f\x87\x37\xf4\x6e\x53\x5e\x7a\xcf\x37\xd8\xce\xea\xed\xb3\xc9\x9b\x5e\xcf\x20\x31\x2d\xf7\x67\x2e\xb9\xbc\x80\x45\x86\xe2\xfe\xcf\xa0\xfd\x67\xc7\x4c\xb7\x9a\x1c\xa9\xe6\x64\x44\xc9\x75\x11\x5c\x23\x8d\x32\xde\x9b\x47\x3a\x04\x73\xf2\xe6\xc9\xa2\x43\x81\x27\xb2\xbb\x45\xb8\xdb\x80\x41\xe3\xfe\xc0\x2b\xda\x27\xd2\x1e\x24\xc0\xa9\xf1\xd1\x5a\x34\x83\xb6\x51\xc6\x90\x9d\xa6\x51\x4c\x3c\xc1\xb7\xb2\x4a\xa5\xbb\x2e\xec\x5f\x83\xe6\x57\xd1\x6b\x4e\x2d\x5c\x8a\x82\xf3\x56\x7c\x5b\x95\xe7\xb3\xd6\x50\x92\xb6\x2d\xa7\x4e\xf4\x57\x91\x07\xbf\xbc\x3f\x1d\x3a\xb2\xfd\xfb\x01\xf3\x98\xb5\x91\x64\x3e\x8a\x43\xe8\xc4\x13\xb7\xea\xc5\x29\xa5\xcd\x45\xc2\xdf\x3f\x94\xb9\x3e\x62\xfd\x3a\xe5\x36\x3b\xd9\x34\xff\x6b\x06\x0d\xea\xd6\xfe\xad\x41\x93\x06\xcf\xe2\x85\x56\xbf\x9f\xd1\xe7\x91\x95\x35\x60\x44\x38\x30\xaa\x9e\x17\xff\x46\x91\xc1\x35\x51\x7c\x7b\xbe\x12\x19\x2b\xab\xdf\xf5\x5e\xe7\x3a\x0c\x9a\x2f\x9c\x41\xcb\x49\xee\x20\x6a\x12\xaf\x8b\x0e\xbd\xf7\xf5\xe6\x06\xd3\x81\x33\x29\xd5\x9d\x7b\x89\x24\xb2\x11\xa4\xac\x28\x7e\xc7\xa2\x73\x1d\xd7\xb2\x94\x25\x0c\x67\x59\x14\x8d\x84\xb6\x1a\xc9\x1a\xb6\x06\x78\xf8\x6b\x84\xc8\x84\xb0\x88\xf1\xed\x1c\xfc\xee\x11\x6c\x2e\x99\x5e\xdc\x41\x9c\xef\x59\xba\x96\xa5\x2c\x78\x83\x96\x35\xcb\x6b\xa5\x96\x5c\xd9\xce\x10\x45\x66\x6c\xc0\x4d\x97\x2f\x7d\x27\x90\x58\x70\xa6\x90\xcf\xf4\xd8\xc0\x40\x37\x6f\x94\xed\x5a\xee\xd6\x11\xee\x67\x39\xb9\x69\xba\x8d\x6b\xa5\x37\xff\x1a\x20\x7d\xcb\x2f\x10\xdd\x21\x19\xfd\x94\x96\x8f\x5e\x6b\x93\x45\x3c\x48\x76\x6f\x65\xb5\xf3\xda\x0c\x1a\xd4\x7f\xe8\xaa\x84\xf5\x6a\x06\xd9\x4c\x50\x8f\x51\xd2\xea\xae\xbb\xb3\xa5\xa2\x6f\xb9\x8a\xe4\x5d\x23\xd4\xba\x9c\x23\x5d\x6d\x5c\x6e\x5e\x25\x4e\x03\xa0\x8b\x1a\x04\x07\x4e\x58\x28\xb3\xe9\x71\xaa\x0a\x84\xaa\x6b\xd3\x9d\xf1\xa2\x5e\xc9\xb7\x7f\x3c\x7e\x49\xfc\x5a\x2b\xfa\xe9\xec\x2a\x59\xfb\x90\x07\x1b\x30\x19\x87\xe2\xe0\xb6\xc9\x7d\x13\xc7\x22\xd4\x43\x13\x2f\x2a\xad\x64\xfe\x9b\xd3\x18\xb1\xb9\xa1\xd7\xbe\x55\x30\x64\x28\x2b\x2f\x27\x11\x1d\xbe\x0b\x34\xf3\x80\xe2\x02\x24\x11\xd0\xff\x8d\x9b\x83\x41\x75\x1e\x74\x48\x1c\x5d\xfd\x98\xc9\xa3\x24\xb3\xf5\xf0\x20\xfd\xfe\xcb\x3c\x4e\x71\xd5\x98\xe1\xa3\xc9\x98\x0c\xcc\xdb\xb0\xb8\x50\x5c\x80\xe4\x7f\xee\x13\x77\xd8\x9b\x8a\xa4\x0b\x60\x1c\x3a\x34\xfc\x9e\x1d\x19\xbc\x35\xd8\x57\x8e\xbc\x8c\xdb\x6d\x2a\xf7\x35\xeb\x3b\xcd\x5a\x3e\xe5\x29\x6c\xb2\x01\xf5\x24\x5e\xa5\xdd\xcf\xa9\xdd\xf1\x3a\xd6\x5c\x16\x42\x41\x32\x7d\xdc\xaf\xbe\xed\x4c\x7c\x0f\xf4\xf3\xba\xd6\x77\x31\x4f\x70\xdf\xa6\x86\x66\xfb\x02\x63\x01\xc1\x81\xb5\x0b\x8f\xa1\xcc\xb2\xff\x1e\x4a\x39\x73\x8f\x8a\x5b\xee\xa6\x8f\x1d\x47\xe3\x7c\x35\xf1\x23\x6b\xfe\x58\xbe\x0f\xce\x38\xdd\x3e\xc0\x56\x44\x28\x0e\x6e\x92\xef\x60\xc3\x6d\x55\xa2\x51\x95\x12\x29\x21\xef\xdc\x34\x19\xe5\xc5\x20\xa3\xb7\xff\x00\xaf\xaa\xba\x2a\xb2\x21\xa0\xe8\xff\x75\x24\x83\xe2\xc0\xda\xdd\x5a\xdd\xf9\x82\x9e\x71\x3b\xfa\x31\x47\x75\x2f\xc9\x96\x36\x6f\x99\x42\x2a\x19\xeb\x0c\xed\x41\xc5\x72\x81\xa1\x68\xbc\x33\x60\xae\xa1\x38\xb0\x76\x79\xd2\xf4\xf7\xb4\xa2\x1f\x71\xce\x19\x68\x3f\xc7\x4a\x63\x6c\x71\xee\xe4\xf1\x0c\x7f\x54\xc6\x71\x88\xf0\x54\x88\xae\xba\x8f\x1a\xe8\xc0\x09\xf1\x3a\xbb\x4a\x3b\xae\xa9\x49\xff\xf3\xa3\x77\x9e\xfe\xc7\x74\xfe\xf6\xb1\x45\x13\xb7\x74\xec\x29\xfc\x23\x12\x7c\xdc\x3a\xf4\x95\xe2\xe7\x12\xf3\x61\xd7\x0c\xc5\x81\xb5\xdb\xa4\xc5\x35\xa7\xd6\x73\x63\xab\x7b\xdf\x24\xf6\x10\xa9\xae\xe0\x86\x35\x5a\x93\x65\x53\xe3\x2d\x2c\xbd\xfb\x4a\x2f\xcb\x86\x80\x86\x10\x50\x1c\x58\x3b\x85\xe1\x26\xb7\x1e\xb9\x9d\x08\x53\x07\xd6\x05\xa6\x76\xdf\x53\x7d\x67\xb2\x1f\x94\xaf\xde\x1b\x0f\x49\x12\x30\x35\x5a\xc5\x16\xc1\xe2\x42\x71\x60\xed\x66\x37\x3d\x4e\x53\x9b\x4b\x38\x46\x51\xb4\x6e\xcc\xdc\xf1\xd7\x21\x7e\x97\x44\xd3\xd7\xfe\xfd\xe3\x27\x52\xf7\x36\x41\xb2\x54\x1f\x58\x5c\x28\x0e\xac\x1d\xfe\x04\x4a\x5b\x54\x9f\xbc\xf4\xcf\xcb\x77\xae\x28\xbd\xf9\x9a\xbd\x9b\x08\x0c\x4f\xf7\x14\x3e\xe6\x05\x91\xce\x95\x4a\xe6\x32\xc1\xb4\x83\xca\x09\x57\x69\x97\xab\x2b\x42\xcc\x8a\x79\xf7\xd6\x56\x4a\x09\xbf\xce\x1d\x8f\x7a\x04\x32\xe6\x23\x29\x4b\x85\x1b\x46\xa6\x45\x43\x2d\x19\xbb\xc0\xf6\x54\x28\x0e\xac\x1d\xd7\x38\xfd\xbb\x4f\x07\x34\x86\x28\x88\x1d\xa9\x16\x35\x95\x07\x2b\x4c\xfe\x8f\xfe\x68\x51\xbd\xaa\x0c\xfc\xfc\xa1\xe1\x5d\x07\xb0\x9b\x01\x8a\x03\x6b\x37\x1b\x6d\x43\xb6\x21\x98\x49\x5a\x1d\x80\xdd\xd9\x36\xa6\xd9\xc4\x81\x3e\x61\x10\xf2\x9d\x4a\x9a\x68\x6c\xf9\x39\x77\x0c\x1f\x2f\x30\xc6\x10\x1c\x58\xbb\xec\xbc\xc8\xf7\xf2\xe1\xca\xa9\x22\x3c\x7d\x1f\x52\xd6\x76\xf1\xce\xef\x47\x09\xf1\xe5\x49\xe0\x25\x31\xa2\xda\xb3\x1b\xdd\x8b\x04\x3e\x8c\x40\x70\x60\xed\xce\x7c\x27\x17\x26\x7d\xad\x7f\xa7\x1d\xff\x38\x2c\x48\x16\x5a\x51\xdd\xde\x41\x73\x3b\x62\x88\xa9\x8f\x8f\xb9\x59\x29\x5a\xe9\x0c\xd3\x0e\x2a\xb1\x5e\xa5\x9d\x65\xe5\x94\xe7\x93\xb0\xa1\xd9\xc6\x3f\x89\x75\x44\xb2\xcc\x5b\x92\x22\x22\x33\x2b\xe9\x12\xae\x5f\xf1\x7c\x3b\x52\xd5\x7b\x81\x7a\x55\x28\x0e\xae\x39\x4f\x70\xcc\xd2\xb3\x09\xf2\x8b\xa9\x12\x97\xef\x6e\x43\x2a\xc3\x69\x21\xf7\x2c\xd6\xc4\x63\x54\x09\x46\xf2\x48\x58\xf4\x14\x79\x80\xe6\x3c\x10\x1c\x58\x3b\x9d\x6a\x96\x9a\xfe\x69\x4d\xee\x1f\xed\x8c\xba\x2a\xc2\x47\x29\x75\xf6\x83\xb7\x88\x3f\x5b\x25\x51\xec\x56\xdf\x1e\x25\xa3\x00\x56\x6b\xa1\x38\xb0\x76\x3f\xb9\xb4\xea\x35\x3c\x7a\x51\xa5\x57\xb3\x3d\x46\x3e\x91\x59\xfb\x35\x79\x5a\x20\x22\xe0\x95\x44\x6c\x2b\x94\x0c\x38\x4f\xe4\x02\xb9\x03\x82\x03\x6b\x97\x95\xfc\x31\xe5\x2b\xf7\xdb\xe2\xdb\x9d\x05\xbb\xa3\x4b\xd2\xb4\xe8\x21\x15\x8d\xab\xf8\xf9\x45\x1e\x3b\x96\x89\xde\x48\x1e\xc0\xd1\x79\x50\x93\xfb\xab\x0d\x1a\x1a\x51\xc3\x67\x8c\x0a\xff\xad\x3f\xc9\x34\xb6\x43\xc7\xe4\xd6\x59\x8e\xcb\xd9\xc8\xdc\x73\xb6\xfe\xdd\xae\x0d\x94\x42\x8e\x32\x30\xb3\x03\xc5\xc1\x1b\xb4\xdb\x9a\x5a\xf4\x24\x74\xee\xa1\x1d\x1d\x69\xe3\xf8\x9a\xc8\xf7\xca\x8b\xb1\xbb\x2c\x33\x67\x22\x0d\x33\xa3\x32\x70\xf7\xb5\x80\xcd\x93\x50\x1c\xbc\x41\x0b\x9e\x68\xb2\x60\x9b\xa2\xe0\x6b\xc4\x09\x65\x30\xdb\xa9\x7a\xeb\x32\x4b\xdc\x72\xff\x96\xe5\xc0\xad\x3a\xaa\xb5\xbc\x71\x8a\x65\x58\x64\x28\xee\xff\x0c\x1a\xc2\x8d\x7f\x23\xeb\xe3\xfc\xd0\xfa\xfa\xc7\x51\xcb\x61\x5d\x6c\x10\x33\xec\x57\x7c\xd6\x78\x87\xa3\x5b\xd6\x07\x76\x27\xf9\x74\x6c\x7b\x97\x5c\xd1\xff\xb7\xc5\xd1\xef\xe0\xdb\x87\x80\xcb\xc8\x13\x89\xf0\x6c\x73\xee\x8e\xb9\xee\xdc\x0b\x6e\xb5\x30\xa7\x51\x92\xca\xe6\x76\x55\x76\x5d\xfa\x7f\x0d\x5a\x0e\xef\x0b\x14\xbe\xad\xc3\x88\x75\x53\x2e\xc1\x07\xcb\x6b\x88\xb7\x3d\x12\x58\x0d\x09\xa9\x27\xfe\x90\x3c\x56\x94\xd9\x15\xf8\x17\xf5\xe0\xa5\xa7\xd8\x4c\xeb\x5e\x4a\x42\x96\x62\x1c\x95\x39\xa0\x61\xb3\xe5\xfc\x21\x39\xa2\x5e\xf1\x7e\xc5\xf3\xfb\xf7\x02\xdc\xba\xff\x35\x83\x06\x75\x6b\xff\xd6\xa0\xc1\x19\x34\x2f\xa9\x52\x96\xcc\xa6\x13\xfc\x79\x27\xdc\x93\xee\x07\x1f\xe6\xc3\x2b\xfd\x3d\x8d\xab\xbe\xab\x99\x56\xcb\x85\x51\xca\xa8\xad\x5c\x87\x41\x6b\x87\x33\x68\xc1\x58\xc7\x5f\x69\xef\xcd\x74\xe0\xdf\xf3\x54\x54\xb6\x95\xdb\xb6\x5e\x68\x59\xce\x1c\x5c\xdf\x7f\x64\x42\xdd\x35\xfb\x5a\xf2\x1a\x8e\x57\x0b\x97\x96\x80\x37\x68\x2f\x27\x73\xfd\xef\x14\x99\x8a\x27\x7c\xa7\x3f\x43\x0a\x1f\x78\xa3\x81\xb1\x55\xf1\x57\x63\x47\xe7\x39\x86\xe9\x23\x3f\x23\xa9\x4f\xd7\xb2\x94\x05\x6f\xd0\x54\xd4\xc7\x73\xc3\x52\x2a\x93\x50\x02\x4e\xdb\x48\x3f\xd8\x36\x92\x56\x09\x05\x1f\xf5\xbe\xf0\x79\xce\x1f\xec\x44\x7e\xbf\x35\xf1\x5a\xee\x16\xde\xa0\x91\x0a\x14\xff\x42\xbc\x44\xfd\x9b\xf9\xce\xd9\x51\x88\x49\xf0\xfd\x01\xb6\x6d\x6a\x8d\x5e\x19\x71\xc9\x2b\x52\xdc\x83\x31\xe1\xfd\x6b\x33\x68\x50\xff\xa1\xab\x12\xd6\x2d\xa6\xca\x90\x85\x72\xda\x30\x63\xce\x6f\x77\xc5\xc3\x42\x48\x0b\x78\x55\xf5\x56\x62\x1d\xdf\xfa\xdf\x18\x61\xb4\xa5\xfc\x89\x03\x4c\x6e\x21\x38\x70\xc2\x5a\xb2\xb6\x13\x55\x35\x92\x17\xef\xeb\x62\x3b\x6c\x93\x53\x27\xf9\xb2\x7e\x1a\x5d\x35\xf5\x27\xee\x41\x6c\xbe\x3c\xf2\xc2\x65\x3d\x2c\x2e\x14\x07\x37\xd9\xe0\x79\x76\x12\x92\x26\x6b\xcb\x4b\x65\x94\xbe\x50\x8c\x24\xbc\x6a\x97\x7e\xac\x44\xdb\xa6\xff\x6a\x62\xea\x4b\x66\x85\x2b\xd0\xe2\x1a\x8a\x03\x27\xac\x26\x6c\xcb\xf9\xc3\x09\xbf\x0a\x5c\x22\xce\x43\x02\x56\xc7\x1f\x04\x36\x7e\xa2\xaf\xf2\x18\xd8\x7a\xd8\xca\x0c\xf6\x93\xbc\x67\x60\x71\xa1\xb8\x00\xc9\xff\xdc\x86\x60\xea\x8b\xa3\x4f\x2f\xfa\x82\xca\x21\xe9\x2f\x76\x0f\x11\xab\x7e\xab\x6b\x21\xa3\x54\xce\xde\x07\xd1\x20\x17\x1c\x7d\x72\xe4\x7a\xd8\x64\x03\xea\x49\xbc\xb2\x9b\xdc\xa4\x52\xea\x25\xf1\x36\x0f\xfd\xd8\x63\xd5\xc3\x42\xff\x4a\x72\xa5\xd7\xd8\x02\x92\x67\x4b\x52\xa1\x2b\x99\x6d\xd9\x9c\xc0\x57\x50\x28\x0e\xac\xdd\x5a\xd4\xce\x34\x51\x41\xec\x2d\xe4\x7a\xc7\x86\x7a\xfb\x6f\x76\x5f\x6a\x87\x64\x5e\x7f\x4a\x8f\xec\xc0\x15\xda\x69\xb9\x17\x03\x7c\x65\x86\xe2\xc0\xda\x8d\x69\x9d\xe5\x12\xc8\x86\x2a\xb6\xae\x11\x52\x51\x70\xda\x8f\xb1\x06\x47\x3a\x8d\xbe\xad\x7b\xc4\xf2\x67\xf8\x80\xa5\xf9\x2b\xb0\x15\x11\x8a\x03\x6b\xe7\x50\x18\xbf\x68\xc8\x4a\xc8\x6a\x26\xd1\x1a\xce\xd7\xd8\x29\x3c\x4a\x53\x33\x7a\xe7\x5e\xf7\x7c\x84\xf6\xa3\xc7\xa7\x98\xc1\xc0\x79\x4c\x50\x1c\x58\x3b\xcf\xf7\x9a\xc8\x33\x82\xcf\x9e\x75\x2f\x3c\x99\xe6\x44\xf8\x75\x5b\x0b\x73\x8b\x88\xbb\x4d\xd5\xee\x9c\x98\x90\xbc\xce\xfc\x41\x21\x4c\x3b\xa8\xd7\xd9\x55\xda\x9d\x8a\x17\x1e\x5a\xbb\x72\xc5\x85\x99\xed\x85\xbc\x4d\x57\x8b\x14\x11\x39\x0a\xdb\x9a\x8c\x6b\xf8\x42\xe4\x86\x4c\x20\xea\x7c\x17\xa8\x79\x84\xe0\xc0\xda\xb1\xf6\x7e\xdf\xf3\x58\xe4\x53\x77\xa4\x72\xba\x6f\x63\x9e\x21\xcc\x89\x44\x69\xaa\x74\x6b\x8f\x53\x51\xb9\x45\x15\xfd\xd9\x43\xa0\x2b\x2b\x14\x07\xd6\x2e\x4f\xe4\xd6\xdf\xac\xcc\xc7\x28\x9a\xaf\xee\xce\x8e\x9b\x32\x7e\x5d\xcb\x78\x42\x90\xaa\xd9\xea\x27\xa0\xdc\xfc\x81\x72\x23\x96\x11\x16\x17\x8a\x03\x6b\xc7\x80\x5a\xfa\xb4\xed\xcc\x89\x82\xe1\x86\x16\xc3\xac\x56\xb8\x98\x83\x41\xc7\x49\x72\xc6\xc4\x53\xd9\xa0\x2c\xeb\xe3\x89\xf1\x47\xb0\xb8\x50\x1c\x58\x3b\x65\x3f\x95\x43\x96\x02\x03\x8e\xfc\xdd\xbf\x1f\x6e\xb9\xbb\xbe\xa2\xa2\xce\x2f\x64\xc0\x75\xad\x3d\x42\xc4\xfb\x5d\xce\xf2\xe8\x2e\x4c\x3b\xa8\x9c\x70\xe5\xae\x83\x41\xa4\x30\x41\x5b\xc6\xf0\x2f\xd6\x2a\x7f\x89\x4c\xc6\x64\xdc\x17\x69\x7d\x24\x4d\xca\x3f\xf2\x3e\x6a\x68\x34\x73\x1a\x44\x03\x76\x1d\x40\x70\x60\xed\x36\x2a\x5e\x86\xcb\xdb\xfe\xea\x31\xdd\x3f\x0f\x28\xfe\x93\xd5\x90\x96\x56\x99\xfe\x59\xd6\xb5\xbb\xb2\x72\x2e\x9a\xd4\x8d\x24\x0e\x16\x17\x8a\x83\x6b\xc4\xb2\x8f\x46\xc8\xa1\x32\xa4\x42\x44\xae\xaf\xec\xc1\x64\x36\x32\xa6\x54\xa3\xb9\x66\x63\xed\xc7\xad\xa3\xac\xad\xa9\xf8\x0d\x38\x3b\x12\x8a\x03\x6b\x47\x5c\x5b\x46\x88\x78\x96\xa0\xc0\x67\x1c\x9c\x4a\x9c\xf6\xde\xa7\xd9\x56\x18\x45\xdf\xa6\xc0\x12\x49\x59\x43\x36\x3b\xe6\x3d\x70\xe4\x09\x14\x07\xd6\xae\xad\x33\x9f\xfe\xa4\x4c\x36\x72\x32\x68\x37\xd8\x6f\xe9\x67\xea\xe3\xd0\xfd\x7d\x14\x5e\x15\x5e\x06\x0e\x1c\xc5\x33\x5d\x59\x76\xa0\xc1\x0b\x44\x62\xbd\x72\xf5\x73\x5b\xe5\xa3\xf4\x7c\x14\x4d\x4c\xb5\xcc\x44\x16\x55\x72\x79\xa6\x50\xc7\xb8\xf1\x1f\xee\x92\xee\xef\x94\xaa\x5c\x5c\xcc\xc0\x8a\x14\x14\x07\xd6\xae\xef\x06\x5b\xb6\xf9\xe4\x61\x5d\x6e\x05\x45\x19\xa3\x57\x4a\x6c\xd8\xcd\xac\xe7\xac\xc5\x64\x59\xc3\xf3\xcc\x0c\x0b\x96\x88\xf3\xb0\xb8\x50\x1c\x58\x3b\xb2\x57\xeb\x71\x21\x7b\xba\xe1\x15\x4f\x29\xe4\xab\xce\x73\x4d\x4e\xcd\x79\x14\x9f\x1b\x2a\x7a\xed\x57\x56\x50\xb9\x65\xed\x01\xdb\x5e\xa1\x38\xb0\x76\xf1\x43\x0b\x73\x4c\xa4\xf8\xd2\x7d\x54\x47\xae\x16\x3a\xf5\x3f\x5d\xad\x9c\xca\x51\x6e\x20\xd0\x6a\xaf\x0c\x18\x3d\xbc\xfb\x8c\x0c\x16\x17\x8a\x03\x6b\x97\x35\xbb\x2c\xf7\x34\xa6\xe4\x97\xba\xc4\x93\x66\x8d\xe3\xfb\x3b\xf5\x7d\xd6\x14\xec\x27\x2e\xe5\x24\xc3\x4b\xc6\x78\x16\xad\xc6\x30\x83\x06\x35\xb9\xbf\xda\xa0\xd9\x10\xde\x7f\xcd\xbb\xbb\xe2\xa9\xf8\xc3\xac\xcf\x14\x3d\xe8\x69\xe0\x6b\xbf\x44\x12\x2a\xf7\xe7\x92\xcf\xc4\x4d\xf6\x64\x84\x04\x60\x66\x07\x8a\x83\x37\x68\xd9\x36\xba\xdc\x64\xbf\x98\x0d\xc6\x8c\xdd\xc4\x4e\xe3\x02\x5c\xbe\x4e\xca\xc9\xd0\x5d\x2e\x9e\x06\xf3\xdb\x92\x37\xfa\xbf\x1f\x87\x45\x86\xe2\xe0\x0d\xda\x47\x0e\x72\xde\xd7\x97\x3e\x61\x64\x06\x21\x37\x9d\x6b\x70\xe9\x5f\x6b\x8c\x32\xbf\x34\xa0\x55\x38\x3b\xfd\x49\x61\x50\xe8\xf6\x06\x16\x19\x8a\xfb\xff\x1b\xb4\xff\x7c\xae\x29\x4a\xa3\x95\xa7\xcf\x75\x68\x02\xbc\x65\x7e\x16\xc8\x33\x9b\x0d\x11\x21\xd8\xf7\xcf\x14\x55\xea\x5c\x7a\xd4\xf1\x90\x5b\x02\x06\x0d\xd7\x4e\xac\x80\xa1\x6f\x6d\xd3\xe8\xc5\xe5\xdb\x9b\x75\x79\x38\x1d\xc5\x89\x9f\xab\xc5\x84\x9f\x9a\x4a\xdb\xd6\x04\x86\x1c\xfc\x47\x17\x47\xfa\xbe\xfe\x60\xa9\x3b\xbf\xcb\xe3\xd7\x14\xb5\x1b\xa5\x42\x31\x3f\x72\x75\xae\x68\xa1\x3e\x91\xcf\xc4\x60\x11\x96\x7e\xf8\x73\xe3\x1f\x74\x21\x26\x46\x13\xb3\xfb\x23\x06\xa5\xf9\x83\x22\x62\xb3\x5d\x53\xac\xa6\xc4\xb8\x27\xb5\xe9\xca\x24\xc5\x97\x85\x11\xed\x8f\x70\xff\x57\x0c\x9a\x1f\xca\x7f\x77\x6b\xff\xd6\xa0\xc1\x19\x34\x7d\xf4\x64\x6c\xd1\x65\x01\x75\x3c\xad\xb1\x89\x00\xc3\xcf\x5d\x32\x66\x23\xc8\x04\x54\x37\xf1\x22\x2e\x10\x26\x5d\x94\x5f\xb4\x5d\xcb\xea\x0e\x27\x9c\x79\xe0\x25\x57\xc7\xf3\x0f\xfe\x71\x81\x4f\xce\xf5\x34\x94\x7a\xcb\x4b\xd8\x5c\xb5\xbe\x8d\xb1\x24\xe7\x74\x46\x69\x9c\xe9\xf4\xf2\x5a\xf6\x38\xfa\xc2\x3b\x34\x37\xa2\xa3\x50\x6d\x13\x65\x1d\x14\x7d\x29\xba\x90\x3a\xfb\xe7\x42\x95\x82\x77\x93\x56\x0d\xc2\x7f\xef\x7a\x31\x29\x85\xdf\xd9\xbe\x96\xbb\xd5\x86\xfb\xd9\x41\x2e\xe5\x90\xd8\xa0\xaf\x69\xbc\x98\xb7\xb2\xbf\x8b\xf2\xf2\x2b\x33\xf3\x2e\xdc\xdd\xc2\x71\x4a\xe4\xac\x95\x49\x74\xda\xc3\xbe\x96\xbb\x85\x77\x68\x23\x0a\xe9\x1e\x6b\x11\xe1\x16\xd5\x0f\x34\xa5\xaa\x30\x6a\x93\xe7\xe6\xe7\x5b\xdc\x13\xf3\xe2\xa9\x25\x9a\x8e\xbc\xe8\x4b\xb4\xae\xcd\xa1\x41\xfd\x89\xae\xca\x58\x97\xdb\xf4\x2b\x44\x8d\xac\xdd\xe1\x77\x16\x49\x77\xf8\x35\x44\x2c\xa4\x57\x6b\x0a\x62\x35\x11\xdd\xbe\x0f\xcf\x46\x95\x1b\x4d\xc0\xde\xd4\x50\x1c\x38\x63\xa9\x8b\xd5\x55\x4a\x7d\x54\x14\xdd\x32\x44\xed\xad\x09\xe1\x61\x88\xc2\x77\xf5\x78\xc2\x7c\xc7\xb0\x61\xd5\x9d\x81\x3a\xa3\x0c\x28\xea\x82\xe2\xc0\x19\x8b\xd5\x05\x6d\x41\x61\x83\xe0\x6f\x4f\x6b\x2a\x72\xda\xe1\xc5\x17\xe1\x27\xc3\x88\x2c\x73\x8e\xea\xd3\xa3\xa7\xa5\x88\xcb\xa7\x24\xc0\x0c\x14\x82\x03\x67\x2c\x3d\xb2\xa1\xe3\xdf\x13\x83\x67\x78\x39\x94\x9a\xd5\x5f\xfc\x31\x0f\x36\x48\x94\xdb\x4e\xea\xfd\xf0\xef\xef\x26\xd2\x30\x6a\x00\x7b\xce\xa0\xb8\x00\xc9\xff\xfc\xcc\xf5\x70\x5c\x91\x83\x0a\xc9\xa6\x49\xb8\x53\xbc\x9c\x8f\xbc\xe3\x1b\xd5\x79\x8b\x2b\xe1\x99\x27\x5d\x11\x1a\x63\x2b\xbb\x8e\x74\x0f\x6c\xb6\x01\xf5\x24\x5e\xa5\x1d\x99\x31\xdf\x5b\xe6\xa4\x66\xab\x2d\x8a\xb5\x33\x3c\x8a\x53\xb5\x06\xba\x87\x73\x9f\xe7\xfc\x33\xd3\xd2\x75\xd8\xac\x50\x63\x53\x80\xec\x0d\xc1\x81\xb5\xbb\xf1\x30\x56\x56\xea\xa1\x10\x31\xea\xad\x50\xe7\x5e\x59\x42\x13\xc2\xc5\x68\x7b\x5e\xbc\x1a\x96\x18\x09\x07\x5e\x53\x51\x39\x2c\x60\x06\x0a\xc1\x81\xb5\x53\xe2\xe9\x7b\x98\x75\xf6\x73\xe1\xf8\x14\x6b\xeb\x2e\x6d\xf1\x27\x0c\xae\x04\xe1\xbf\xc8\x3b\x69\xe7\x3e\xce\xa3\x23\xde\xbc\xe9\xb0\xb8\x50\x1c\x58\xbb\x32\xcc\x02\xed\x1b\xc8\xc1\x1a\xf2\xf8\xb8\x28\x7c\x1e\x6f\x91\x9c\x17\xe2\x12\x18\xf9\xc9\x69\xd9\xa2\x97\xc7\xe4\xf5\xa5\x3f\xc3\xe2\x42\x71\x60\xed\xa2\xdb\x45\x67\x33\xaa\x9c\x8a\x7f\x85\x32\xe8\x8a\x68\xc9\xe4\x0f\xd0\x9b\xb5\x11\xcb\x4f\xae\x09\x37\x0b\x3d\x4f\xf8\xbd\xc5\x03\xd3\x0e\xea\x75\x76\x95\x76\xe6\x97\xfc\x16\x8f\xed\x36\x90\xd1\x6c\x43\xa2\xe9\xec\xbe\xf5\x3d\x4e\xe3\x55\xb8\xc8\xb3\x0d\xfb\x92\xcc\xbb\x22\xe7\x21\x08\x9c\xd0\x0c\xc5\x81\xb5\x2b\xae\x1d\xba\x78\x5d\xf9\x2a\xfb\x1d\x99\xd7\x5a\x89\xbe\xf0\x68\xac\xce\xcc\x57\x57\x6a\xbf\x92\x6d\xa6\xcc\x17\xf4\x6e\x76\xc0\x58\x40\x71\x60\xed\x1a\x34\x9a\x26\xb0\x3e\x5f\xf4\xbf\x0e\xd9\x3d\xe8\x4e\x88\x8b\x3f\x6f\x76\xfc\xc1\x3b\x33\x40\x7e\xba\x7c\x84\xc8\x88\xd5\x67\x0b\x8b\x0b\xc5\x81\xb5\xdb\x13\x12\x0c\x65\x58\xd5\xc8\x40\xc4\x88\x3d\x8f\xe7\x6b\xbb\xe7\x38\xb9\x9b\x24\x97\xfe\x8b\x91\xde\x62\xe6\x29\x4b\x3a\x23\xb0\x94\x08\xc5\x81\xb5\xe3\x10\xa4\xb9\xdc\xdc\x4e\x94\xae\xc7\x1e\xaa\x34\xb9\xbb\x49\x85\x7d\xa8\xff\x93\xce\x6d\x5f\x7d\xee\xf7\x03\x42\x2b\xb3\xdb\xc0\xd2\x35\x54\x4e\xb8\x4a\x3b\x0d\x1b\x75\x75\x3a\x51\x86\x09\x5c\x2e\xe4\x6c\xc5\x0e\x61\x9b\x54\x8e\x66\x7d\x11\x9a\xe6\x81\xa2\x58\xde\x5f\x28\xe5\x46\x2a\xb0\x6b\x86\xe2\xc0\xda\xdd\xed\x7b\xe5\xbc\x9c\x45\xf8\xdd\xd0\xc6\x6f\xfe\x55\xf2\x6f\x73\x69\xac\x64\x96\x10\x63\x74\x4c\xf6\xc5\xb4\x57\x1d\xfd\xd4\x80\x76\x50\x1c\x58\x3b\x36\x19\x9b\x78\xe6\xbf\x32\x37\x16\xef\x7f\xe4\x74\x38\xdf\x88\xbe\x43\x19\x42\xd8\xf8\xae\xc7\xc4\x63\xc3\x90\x78\x93\x26\x16\x68\x95\x09\xc5\x81\xb5\xcb\x1b\xb9\x99\xb3\x84\x3e\x45\x7a\xf4\xee\xad\xdf\x7c\x79\xd6\x1f\xa5\xef\x0e\xc8\x0f\xfa\xa9\x35\x7f\x67\xf9\xce\x3f\x49\x56\x01\x5a\x17\x42\x71\x60\xed\x94\x9d\x26\xd9\xe8\xf3\x7d\x93\x02\x58\x44\x7c\x25\xed\xcf\x6a\x49\x52\x4b\x7e\x8b\xbe\xa7\x2e\x3d\xd6\x10\xf6\x9a\x43\x08\x2f\x87\x69\x07\x95\x58\xaf\xd2\x6e\x85\xc3\xdc\xcb\xc6\xa7\xb3\x44\x8b\x59\x6e\xfb\x23\x52\x6c\x3d\xf7\xa8\x7c\x98\xa1\x85\x59\x97\x9b\x90\xcf\x80\xe4\xfc\x63\xe0\x5c\x07\x28\x0e\xac\x1d\xff\x49\x89\x85\x26\x4d\xd3\xff\x8f\xb9\xf7\x0e\xe7\xf2\xfd\xff\xff\xad\xec\x95\x2d\xc9\xca\xca\x88\x24\x21\x5b\x44\xc8\x4c\xf6\x0c\xa1\xec\xbd\x67\x46\x24\x3b\x19\x99\x21\x7b\x65\x95\x2d\x23\x7b\x65\x94\x10\x21\x23\xbb\x08\xbf\xe3\xfd\xf9\x7c\x9e\xd7\xd1\xeb\x7a\xfa\x75\xbe\xbe\xc7\xe1\x8f\xf7\xff\xb7\xe3\xc1\x79\x5d\xf7\xe7\xf9\x38\xef\xd7\x79\x3e\x1e\xe7\x22\x2e\xe5\xf0\x05\x59\x29\x8f\xae\x1b\xe2\xc2\x05\x4f\x14\xf3\xb7\x43\x8b\xc9\xed\x2f\xd4\x3c\xdc\x80\x8a\xdb\x00\x1c\xfc\xdd\xf9\x4f\xd0\x86\xa7\x44\x5e\xb5\x91\x5a\x2b\x38\x2a\x4b\xd6\xb1\x56\xdc\x0e\x45\x59\xcf\xbc\x76\xc6\xe3\x05\x83\xf3\x7d\x14\x5a\xa8\x80\x10\xc4\xc1\xdf\x1d\x26\x6e\x4c\xfb\xfc\xa6\xef\x0d\x75\x97\xde\xee\x6b\x2c\x64\xdd\x69\x5c\xbf\xe6\xac\x8c\xa3\xcf\xc7\x04\xfd\xac\xce\x5e\xd2\x85\xda\xc8\x82\x38\xf8\xbb\x33\xc4\x5d\x6b\x65\xed\xbb\xf6\x64\xe4\x5e\xa5\x4a\x69\xe1\x0f\xc2\xb1\x9d\x51\x6a\xea\x67\xaf\x77\x6f\xae\xfe\x62\x69\x54\x08\x59\x40\x38\x34\xd0\xea\xfe\x64\x87\xc6\x5f\xb7\xda\xbf\xd7\x26\x48\x6c\x32\xb3\xd3\x21\x21\x8e\x1e\x28\xa5\xa2\x12\x6e\x2c\x73\x95\x83\x89\x48\xa7\xb0\x2c\x9f\xec\x17\xc2\xed\x80\x38\x64\x87\xc6\x5b\x4b\xb1\x51\x13\xf5\xfe\xc7\xad\x9b\x6c\xec\x0f\xfc\x30\x17\x87\x22\xe5\x24\xe8\xc4\x83\x26\x14\x0c\x62\xe4\xcd\xdf\x2d\xdc\x46\x44\x06\x71\xc8\x0e\xed\xb6\xf6\xbb\x76\xb2\x54\xd7\xc9\xe7\x9d\x3e\x85\xd8\x26\x5a\x92\x72\x3c\x0a\x54\x74\x76\xe2\x5b\xd8\xaa\x2f\xec\xc6\x73\xec\xc9\x10\x91\x41\xdc\xff\x38\x34\xe2\x7f\x6c\xce\xfd\xdb\x8b\xd0\x44\x30\xab\xd2\x1f\x70\x12\xfe\x7a\x97\xff\x76\x7d\xd2\x2d\xb5\x8e\xb9\x4b\x29\x02\x27\xcb\x7b\xdc\x05\x3b\xe4\x52\xd1\x41\xf4\xc8\x9f\x0e\x6d\x8d\x24\x2d\xdd\xbe\xd2\x7d\xdb\xec\x15\x73\x83\xec\x8b\x6e\xdc\x38\x69\x86\xe6\x9e\xb7\xe5\x6d\x13\x2d\xf2\xe1\xfc\xa9\xa8\x89\x7f\xe6\x1a\x54\x9a\x77\x13\x83\x0f\x98\x42\x53\xa7\x28\x08\xca\xe2\x47\xb8\x7b\x9e\xf1\x1b\x2e\x06\xd8\x84\xf3\x51\xbc\x33\xa7\xcb\x8e\xfc\x6f\x73\x68\xa0\xa1\xfd\x59\x84\x86\xe4\xd0\x8c\x3d\x33\xfd\xf7\xbc\x31\x45\x88\x29\x58\x06\x70\x08\x16\x7d\xad\x73\xf8\x56\x72\xc7\xc3\x6a\xcb\x0f\xf3\xd2\x7a\xf1\xd8\x16\x4e\x65\x7b\x07\xd9\xa1\x6d\x9e\xe5\x13\x76\xbf\x39\x71\x96\x69\x25\x83\xaf\x83\xb1\xa4\xe2\xc5\x84\x23\xef\x6c\x43\xac\xb7\x5c\xc2\x02\xf6\x27\x83\xf2\x53\xe9\xd7\xd1\x88\xec\xd0\xcc\x98\xae\x9c\x29\x41\x6d\xbe\xf0\x96\xef\xaa\x9b\xc0\xba\x45\xdd\x4e\xca\xf5\x1b\xce\x4b\x7e\x5f\x29\x72\x9e\xc9\x60\x7f\x18\xf0\x38\x95\xd1\x22\x3b\xb4\xdb\x4b\x7a\x8d\x69\x63\x68\x18\x04\x28\xf1\x6e\xb5\x94\x2c\x51\x98\x67\xd5\xa7\x79\x67\x9b\x95\x0f\x19\x88\xe8\x7d\x75\x22\x9c\x4e\x65\xb4\xc8\x0e\xed\xbc\xc4\xd1\x10\x4e\x96\xa2\xc6\x70\xdb\xe7\x32\x8c\x0b\xc4\xf9\x32\xdd\xbb\xd4\x82\x73\xb5\x9b\x38\x99\x44\x0f\x9d\xe3\x72\x4e\xc1\x7d\xeb\xfc\x3b\x11\x9d\x94\xb1\x5a\xfa\x0a\x93\x95\x69\x54\x69\xa6\x9c\xd5\xf9\x3d\x8f\x9a\x04\x5f\x45\xb8\x12\xc4\x08\x91\xae\xdb\xb8\xfa\x17\x7c\x33\xbc\x8c\x06\xf5\x89\x02\x70\xf0\x8c\x45\xe7\x2c\xf4\x44\x23\x80\xfc\xf1\x97\xbd\xdd\x33\x62\xa4\x53\x4f\x4b\x7c\xd2\x5b\x3c\x6a\x0b\xea\x43\x51\x38\xc6\x9a\x4b\x18\xad\xa0\xca\x07\x00\x07\xcf\x58\x11\x5c\x41\x94\x19\xcf\x15\x30\xdd\xed\x54\xdb\x42\x83\xa7\xfb\xfa\x3b\x71\x4a\x07\x2e\xf0\x1e\x19\x8d\xbe\xb9\xe8\xcf\xc8\xfb\x01\x11\x17\xc4\xc1\x33\xd6\x77\xaa\x5c\x5e\x49\x75\x5f\x93\x77\x2b\xdd\x06\x96\x4f\xa7\x75\x0e\x05\xae\x19\x46\x85\x89\xfa\xe8\xb8\xbc\xb1\xb5\x79\x18\x0e\xed\xc3\x80\xb8\x00\xc9\x7f\xce\xa2\x3f\xef\x55\x7b\xe7\x7f\x5e\x66\x08\xf5\x14\x3c\x0e\x1e\xdc\x67\x8e\x50\x98\x22\xbc\xb3\x90\x70\x90\x8a\x4b\xc0\x18\x1b\xfe\x9c\x1a\xb1\xda\x00\xfd\x12\x4f\x7a\x77\xfa\xca\xc7\x21\x8f\xf8\x52\x24\x1d\x43\x57\x70\x09\xf5\xd8\xf0\xed\x2f\xdf\xfc\x8a\x46\xd6\x40\xca\xa1\xac\x95\xf4\xcd\x14\x1b\x7a\x16\x20\x0e\xfe\xee\x70\x2e\x34\x4c\x4d\xea\x0e\x3a\xbd\x7d\x81\x62\xc6\xf5\x2a\xca\x8c\xc3\xab\xce\xca\x15\xdd\x3a\x5d\x4d\x8a\x92\x9d\x7e\x4e\xb8\x0a\x11\x17\xc4\x21\xb5\xf3\xd8\x6f\xae\x8e\x1a\x51\x4e\x59\x74\xe5\xbd\x44\x32\x7a\x67\xda\xe1\x4e\x17\x03\xfd\x56\xd0\x58\x5f\x69\x1e\xbb\x09\x75\x38\xe4\xfc\x40\x1c\xfc\xdd\xb5\xdd\x99\x2d\xf8\xcd\x9c\x8a\xf3\x56\xe5\xe9\x92\x27\xc7\x15\xbe\xd6\xad\x3c\x31\x2d\x81\x60\x3b\xa3\x50\xa2\x32\x8b\xf4\x47\xd0\xbe\x2a\x88\x83\xbf\xbb\x68\xef\xc5\x39\x27\x4e\xa7\x27\x8d\x33\x28\x0d\x7d\xa8\xd7\x1d\xe4\xd3\xf7\xf5\xf4\x7a\x9f\x0f\xe2\x9c\x29\xa4\x5f\xfa\x19\xa5\x8b\x78\x77\xa0\xe9\xec\xa4\x77\x67\xf4\x62\xf8\x6e\x48\x79\x62\x8f\xb7\xdc\x46\xb7\x94\x3b\xe5\x5d\x4b\xb2\xdf\x17\xf2\xf9\x99\x1c\x9e\x8d\x19\xb3\xdc\xb1\xc3\x84\x2e\x33\x00\x71\xf0\x77\x77\x7e\xa4\x6d\xd4\x2d\x5f\xa0\xb2\x22\xee\x6d\xf5\xad\x9e\x5c\x92\x31\x1f\x1a\x5c\xef\x6f\xfc\xcb\x43\x02\xce\x4d\x77\x86\x44\xa4\xa0\x2a\x1b\x00\x87\x54\xb5\x92\x86\xd3\xe1\xb7\x61\xb8\x5c\xef\x9f\xc2\x5b\x89\xee\xbc\xb3\xd1\x8f\x42\x24\x88\x76\xff\x1d\xf5\x67\x76\x17\x34\xea\x75\xe8\xcb\x08\x88\x83\xbf\xbb\x07\x09\xd6\x62\x76\x2f\x68\xc6\xb7\x18\x39\xbf\xdb\xbd\xb1\x8a\x0c\xd4\x4b\x65\xde\xe6\xaf\x90\xb5\x8a\x50\x8f\x68\xc0\x4d\xff\x02\x55\x32\x01\x38\xf8\xbb\xe3\xc2\x0c\x7b\xcb\x3d\xeb\x41\xf2\x52\xb8\x33\x99\xaa\x8a\xb7\x15\x9d\xac\xd3\xfc\xa9\x1b\x9e\x3c\x6a\xd6\x88\xf3\xab\x0f\x17\x0d\xa0\x03\xaa\x80\x9c\x70\xd2\xbb\xc3\x2f\x27\xda\x5d\x55\x71\x5b\xe3\x45\xf5\x9b\x2f\xef\x17\x3f\x08\x3b\xb3\x50\xa0\x1c\xdb\x96\x7d\x5b\xf4\x47\x69\x7f\x8a\x56\x1e\xe2\x7f\x06\x71\x48\x07\x54\x3f\x5d\xfb\x42\x68\xfb\xf5\xdd\xb0\x8e\x2a\xbe\x52\xc7\x46\xe8\x41\xc6\x61\xee\x53\x85\x2d\xf4\x7a\x6e\xda\xe7\xa2\xbc\x0b\x50\x55\x29\x88\x43\x72\x68\xf3\x44\x26\x34\xd5\x8f\xdb\xaf\x6e\xd4\x4a\x34\x6d\x89\x8f\xd3\xe3\x17\x3e\x18\x8a\x77\x2c\xb9\xf1\x74\x46\xe1\x5c\x20\x1a\x74\x49\x02\x88\x83\xbf\xbb\xb0\x32\xd5\x2f\x09\x82\x61\x4c\xad\xdf\x8c\xd6\xb9\xb5\xcd\xc8\xdf\x2a\x62\xea\x36\xf6\x62\x09\xf2\xea\x6a\x26\xab\x7e\x28\x85\x6e\xdd\x03\x71\xf0\x77\x37\xd0\x11\xc6\xf8\x6a\xc4\xef\x42\x39\x41\xab\xb9\xcc\x05\xb5\xe8\x8e\xd7\x1c\xf6\xf7\xd4\x5e\x64\x6b\xb0\xeb\x71\xc7\x79\xe7\x7d\x47\xbc\x3b\x50\x62\x3d\xe9\xdd\x19\x8b\x98\x78\x14\x2b\xaa\xd9\x96\x6e\xd1\x7e\xa8\x54\xd7\x49\x17\x8b\x9d\xf2\xc6\x39\x5f\xf5\xe5\xac\xc7\xc1\x42\xd0\xd7\x9c\x16\xc4\xff\x0c\xe2\xe0\xef\x4e\x35\x4d\x17\x4b\xa6\x87\x7e\x5c\xba\x6e\xfb\x88\x78\xd2\xfe\x01\x4a\x73\x28\xf1\xe2\x1b\xa5\x8f\x4e\x15\xeb\x4b\x09\xf2\x93\x50\x6b\x25\x10\x87\x74\x99\x41\x1c\xce\x48\xe9\x2d\xab\xb6\x1b\x2e\x5f\xe4\xc8\x6c\xae\x04\xf5\xe9\x1f\xee\x5e\xba\x2b\xfe\xeb\x2a\x65\xa6\xb9\x05\x21\xfe\x1e\xd4\xf6\x07\xc0\xc1\xdf\x5d\xd5\x16\xb6\xbc\xd5\x2d\x94\xdc\xe8\xd0\xa2\xe2\x12\x46\x0f\x5e\x7a\x9f\x9a\xfb\x8b\xe3\x95\xfa\x2c\x1c\x14\x89\x54\xd5\x4f\x38\x10\x71\x41\x1c\xfc\xdd\xd1\x72\x85\xb5\xcb\x61\x53\x46\xe9\x07\xed\x39\x90\xe7\x49\x3b\x74\xdd\x45\x7d\xad\xff\xcc\xf6\xd6\x5d\xda\xb3\x01\x97\x49\xcc\x5c\x11\x0e\x0d\xb4\xba\x3f\xd9\xa1\xe1\x72\xdf\x79\xa2\x70\xf9\x46\xe3\x27\x65\xb9\x92\xc1\x36\xb7\x0e\xaf\xb8\x49\xac\x7b\x33\x41\xbf\x0a\xa2\x05\x44\xb3\x9c\x02\xc7\x11\x6e\x07\xc4\x21\x3b\x34\x47\x79\xd3\x36\x4d\x94\x24\xf7\xfb\xfa\x7a\x64\x5e\x46\xd7\xa2\x8f\x2c\x38\xf7\xf8\xc8\x2f\xd7\x8f\x65\xd4\xa1\xeb\xfb\xea\xb1\x23\x22\x83\x38\x64\x87\x76\x83\xd0\x3a\x5b\x27\x38\x2a\x9e\x65\x99\x95\xfc\x8b\xa6\x7f\xde\x5a\xad\x07\xdb\xeb\x7a\xc1\x19\x5d\x9c\xf0\x1a\xba\xd7\xa2\x0c\x88\xc8\x20\xee\x7f\x1c\xda\x3f\x6e\x9d\xfb\xd7\x37\xa1\x75\xde\xeb\xe9\xa6\xc9\xcb\x35\xb1\xff\x1c\xf4\x3b\x69\x59\x54\x76\x04\xb3\x9e\xe7\x7c\xe3\xef\x65\xb5\x80\xdf\x22\x93\xbe\xbd\x3f\xfe\x74\x68\xe8\x0c\xac\xce\xe7\x8b\x28\x19\xde\xf7\xcd\x93\xd9\x19\xbd\x1e\xf5\xc6\xb0\xaf\x20\xce\x09\xba\xf7\x43\xfb\x72\xaa\xf5\x2d\x03\xed\x3f\xf7\x1d\xfd\x7b\xdb\xdb\x05\x94\xc5\x36\x15\xca\x37\xb1\x08\x93\xf0\x2e\x49\xac\x9b\x55\x79\x48\x0a\x66\x9b\xd5\xe8\xbc\x55\x77\xaf\xff\x6f\x73\x68\xa0\xa1\xfd\x59\x85\x76\x13\xbe\x8a\x8f\x0b\x20\x63\xdc\xf2\xe4\xc8\x9a\x9b\x7a\x32\xcd\x68\x7c\xf7\x1b\x4b\x54\xc8\x4f\xfe\xee\xf0\x68\x99\x35\xa2\x22\xd6\xab\x9b\xd8\xa7\xb2\xbd\x83\xec\xd0\x50\x5c\x76\x99\xe3\x5d\x6e\x28\x14\xf5\xb4\x7c\x37\x2a\xc2\x27\x3a\xe6\x55\xd8\x7f\x67\xab\xb2\x4d\x86\xfa\x93\x83\x1e\xcf\xbd\xf4\x54\x36\xb3\x6e\x20\xfd\xd9\xa5\x9b\x5b\xc1\x0d\xeb\x3c\x5f\xee\xe4\x44\x0e\xd3\x7b\xe3\x50\x1e\x0a\x51\x64\xd8\x8f\x2d\x9a\x7c\xbe\x2e\xb6\xd3\x5f\x31\x73\x1a\x4d\x51\xa4\x7d\x91\x1d\xda\x5c\xcf\x1b\xea\xd1\xd7\x63\x71\x13\xdf\xc3\x86\x50\x92\xb1\x99\x2d\xd5\xda\x71\xca\xdd\xd4\x53\x57\x1e\xe6\xa4\x38\xb2\x73\x3e\x3d\x95\xd1\x3a\x20\xfd\xd9\x5f\x9b\xe6\x9c\xce\xd8\x69\xb6\x84\x86\xfa\xf4\xb9\x4d\x4a\x4b\xb5\x6b\x33\x9b\x87\xb2\x75\x2e\xec\x0f\xd6\xc3\x64\xaf\x4e\x55\x9d\x9a\x43\x03\x89\xe8\xa4\x8c\xa5\x4a\x5c\x2b\x32\xb2\x6c\x47\x2c\x12\x37\x9a\xd7\xa4\xa4\xb4\xe5\x79\xe6\x0b\x5b\xa0\xf6\x4d\x82\x1f\xf2\xf8\xef\x73\xa4\x59\x20\x87\x06\xe2\xe0\x19\xcb\xe5\x20\xf5\x96\x4e\x2d\x6f\xcf\x79\xcc\xdc\xa9\xc5\xe4\x96\x57\x85\x42\x68\x14\x73\x87\x7a\xda\x49\xda\x07\xe1\x4a\x21\x8c\xd0\x09\x3c\x10\x07\xcf\x58\x9a\xce\x92\x67\x72\x49\x7c\x88\xbf\x0c\x4b\xeb\xf0\xbe\x13\x36\x32\xee\x54\xc5\x5f\xeb\x64\xb7\x56\xb7\x15\xfe\x9e\xbf\x94\x04\xed\xf9\x81\x38\x78\xc6\xba\x1c\x6f\x9c\x62\x72\x60\xc3\x6f\x70\xf1\x07\x6f\x09\xdb\x6d\xbe\xbb\xf3\xe2\x12\x5e\xb8\xa1\x76\xa6\xae\x62\x4d\xd7\xad\x3c\xa0\xfb\x67\x41\x5c\x80\x24\x8a\xef\x9f\x71\x2f\x34\xa5\x65\x35\xce\x33\x63\xe0\xe1\x7b\x25\x99\x5d\x59\xdb\xa0\xd5\xf5\x73\xd3\x79\xad\x77\xf0\xc9\xaf\xd5\xe4\x66\x1e\x57\x85\xaf\xcc\xbf\xe3\x02\x24\x51\xe8\x7d\xfd\x82\xfe\x67\xea\x90\x44\x41\x43\x12\x82\xce\xbf\xfb\x41\x9f\x24\x81\x1b\xc5\x02\x45\x26\xc9\xbb\x53\x87\x0f\x9f\x68\x3f\x1d\x2d\x5b\xd9\x4f\xa9\x74\x43\xfd\x14\x11\xd9\xa4\x82\x6b\xc4\xd2\x9f\x03\x5d\x21\x0d\xe2\xe0\x12\x28\x79\xd9\x33\x65\x3a\xfb\xb3\xff\x32\x61\xb7\xf1\x98\xb6\xfe\xea\xb1\x2d\xbd\xa0\xea\xe8\x9b\x11\x0d\x8c\xb6\xd1\x67\xb3\xe3\x02\x88\xb8\x20\x0e\x2e\x81\xd9\xb2\xeb\x35\xac\xf8\x3c\x7d\x85\x13\xe3\x61\x57\xe6\x7d\x1f\x66\x3c\x4f\x4e\xa9\x7e\x77\x01\x4d\x40\x4c\xc9\xfe\xc1\x3c\x3e\x74\xdb\x17\x88\x83\x4b\x60\xbf\x19\x4f\x52\x32\x60\x3f\x92\xda\xe2\x55\x7b\xf8\x99\x85\x68\xd2\xd5\x68\xda\x96\xaf\xf8\xb2\x3d\x2f\xf0\x94\x05\x38\xb8\xa1\xc3\x9d\x20\x0e\x2e\x81\xf9\x36\xd2\x5b\xeb\x11\x4f\xba\x54\x34\xc2\x2e\x3a\x66\x2c\x5f\xe1\x91\x72\x77\xdc\xc3\x95\xe6\xf8\x41\xbb\xe2\x13\x35\xb0\x56\xeb\x2b\xfb\xef\xb8\xff\x93\xc0\xff\xce\xe3\x7f\xd1\x00\x68\x76\x3d\x49\x03\x58\x29\x74\xba\xe7\xad\x30\x79\x97\x68\x57\x38\x92\xaf\x06\x4f\xd7\x52\x9c\x91\xd3\xe5\x12\xf6\x6e\x56\x89\x0f\x6f\x11\x09\x0b\x81\x7a\xf2\x01\x38\xa4\xc3\x5f\x7c\xa8\xd4\xcd\x6f\xa5\x09\xf0\xe7\x72\x7b\x0d\x85\xad\x76\xe9\x53\xab\x3f\xbe\x49\x45\x79\x4f\xe4\xbf\x1e\x60\xe9\x62\x90\x08\x1d\xfe\x02\x70\x70\x0d\x14\x49\xfc\x56\x4e\x18\x24\x61\x57\xd8\xaf\x29\x1c\x73\xbe\xe6\xcf\x9b\x70\xb4\xff\x78\x5c\x0c\xe7\x50\xdd\x39\x88\x7a\x57\x93\x15\xda\x36\x05\x70\x48\xdb\x42\x4a\xce\x7d\x92\xd9\xf9\xef\x9e\xc7\xda\x3c\x34\x9d\xe8\xe4\x5a\xeb\x93\x23\x1d\x76\x43\xd7\xd5\x27\x73\x4b\xa7\x4f\x12\xa8\x87\xb6\x85\x00\x1c\x5c\x03\x11\xb4\xa1\x95\x7e\x45\xbe\x95\xef\x36\x57\x6c\xe3\xa9\x74\x74\x5a\x97\x94\x8e\x82\xef\xcc\xef\x5e\x4c\xe2\xe8\xb1\x18\xf6\x3b\x44\x68\x00\xc4\x21\x34\xf0\x3f\x49\xf5\x2f\x1a\x00\xa5\xba\x93\x34\x10\x15\xf3\x9d\x5a\xbd\xa6\xf3\x70\x7b\x51\x4e\x5c\x7e\xa4\xa7\x5b\x03\x47\x33\x30\x4a\xc3\xf9\x57\xdf\xf3\xf1\x26\x77\xf4\x79\x68\xca\x06\x71\x70\x0d\xcc\x3e\x5a\x14\x10\xb3\xa4\x12\x4c\x70\xeb\x17\xa2\xe2\xa6\xb0\xf5\xe5\xd8\xba\xfe\xb6\x97\x32\x33\xe8\xf5\x70\xf1\x93\x1b\x61\x24\xd0\xef\x15\xc0\x21\xf5\x91\x74\x0c\xa5\x0c\x60\xb1\x89\xd7\x7d\xb7\x7a\xe7\xd9\xf7\x57\x28\xf3\xaf\x2c\x75\xa2\x33\x7c\xa3\xeb\x73\x66\xa4\x37\xb1\x6c\x0a\x21\xcd\x02\x38\xb8\x06\x50\x23\x65\xaf\x7e\x26\x52\xc3\xaf\x48\xd8\x69\xf2\xb9\x6a\x9e\xad\xc9\x45\x7b\x2c\x84\x53\x7c\x55\xee\xfe\x55\xcb\xc0\x77\x23\x50\xbf\x59\x10\x07\xd7\x40\x78\x4c\xe5\x73\xf9\x54\xba\xcf\x44\xaf\xb9\x6c\xfb\x9f\xb6\x78\x67\xe9\xc8\xaf\xce\x56\x14\x85\xfb\x19\x7d\xfd\xb9\xa4\xa9\x4e\x81\xd0\x00\x88\x83\xe6\x01\xcd\xbf\x6b\x00\xb4\xee\x38\x49\x03\x4a\x76\x9d\xf7\x47\x34\xb9\x5a\xae\xf0\xc6\xee\x3e\x3b\x60\x1b\x99\x6f\xf9\xe1\x57\xce\x79\x5f\xca\xfa\x67\xb7\xf6\x8b\x49\x22\x28\xbd\x82\x38\xb8\x06\xc6\xe9\x53\x5b\x64\x73\xe7\x9f\x2e\x0e\x69\xc5\x2b\x68\x8e\x9e\x69\x53\xca\xbf\xf9\x18\x23\xf3\x25\xcb\x9a\x46\xc5\x6d\x67\x1f\x4d\x44\x5c\x10\x87\xa4\x81\xf2\x97\x3b\xf7\x47\xf2\x33\x95\x6b\x76\x66\xa9\xeb\x39\xef\x7d\xa9\x0d\x22\x18\xa4\x4b\x76\x2d\xb3\xab\x3c\xb8\x31\xfb\x99\x0e\xd2\x00\x80\x83\x6b\x60\x97\x12\x8d\xec\x95\x70\x73\x82\x4e\x66\x59\x09\x9e\x5e\x5f\x93\x90\x01\x66\x51\xf6\xfe\x25\xeb\x76\xea\xfb\xf3\x58\xfd\xef\xa1\x03\xbc\x20\x0e\xae\x01\x1b\xac\x86\x79\x03\xca\xc7\x6a\x03\x4a\xa1\x2a\xc6\x2f\x53\x3a\x17\xdb\xf3\xa6\xdf\x37\x5c\x26\x36\xe6\x4d\x96\x9d\x5b\x98\xfe\x88\xd0\x00\x88\x83\xe6\x01\x87\xff\x1f\x0d\xe8\xfd\x3b\x13\x75\xb2\x11\xce\x65\x96\x4e\x73\xd0\x17\x55\x49\x99\xba\x88\xbf\xf2\x32\xa5\xe7\x4d\xea\x51\x4e\x57\x58\xc7\xf9\x99\xd5\xf7\x65\x68\x02\xfe\x5e\x08\x53\x09\xe2\x90\x8d\xb0\x85\xa8\x95\xbd\x7d\x48\x98\x6b\x59\x75\xa5\x7b\x0e\x65\x8b\xe2\xd6\xf0\x01\x73\x49\x80\x5c\x2a\xaf\xbf\x6b\x3a\xe5\x13\xec\x4d\x44\x64\x10\x87\x6c\x84\x1b\xbd\xaf\xf6\xa1\x30\x3d\x8d\x9e\xf8\x36\xaa\x19\xb2\x36\x21\x25\x68\x58\x73\x9d\x57\x5d\xa4\xf0\x01\x37\x15\xae\xcf\x7d\xf3\x56\x44\x64\x10\xf7\x3f\x46\xf8\x1f\xef\xec\x5f\xdf\x38\x77\x21\x87\x84\x31\x61\x40\xf6\x0c\x97\x94\xf9\x1e\xdf\x83\x4d\xa6\x90\x98\x0d\xd3\xbe\x2a\x6b\x5b\x29\x99\xeb\xcb\xbf\x3b\x02\x17\xfe\x34\xc2\xf6\xbf\x1a\x73\xb6\xce\x16\xd6\x6b\x16\x10\x60\x8a\x7e\x9b\x4f\x9f\xda\xa2\xf6\xed\x92\xf0\xd0\x72\x76\x67\xb3\x89\xf2\xf1\xc5\xfd\x03\x9d\x58\x5b\x33\xeb\x0c\xa7\xb2\xd2\xe5\xaa\x35\x2e\xa7\xc9\xab\xe4\x91\xa2\xce\x1a\x8d\x7f\x7a\xfe\x90\x7a\xe3\xfd\xe3\xdf\x18\xda\xff\x6d\x46\x18\x34\xb4\x3f\xab\xfd\x90\x8c\xb0\x57\x57\x02\xda\x11\x69\x6e\x2a\x79\x5e\x2a\x8b\x9c\x8a\x9a\x8f\xbe\x9b\x63\x5c\x65\x6c\x8e\xac\x54\x41\xf3\xf7\x8f\x93\x37\x4e\xa5\x31\x4a\x23\xb2\x11\x4e\xaa\xa9\xe0\x31\xf8\x2a\x86\xc7\xcc\x49\xca\xbf\x93\x7a\x63\xe0\xa3\xf5\xeb\x5a\x4e\xde\x6d\x53\x6a\x0c\x76\x26\xcb\x72\x65\xc2\x53\xd9\x33\x44\x36\xc2\xad\x1e\x03\x51\x51\x31\x3f\x0a\x3f\x28\x71\xdd\xfb\x39\x9b\xfd\x4e\x5f\x63\x2e\xc2\x7e\x6e\x74\x81\xc9\xae\xf0\xcc\xd5\xf7\xb2\xbc\xa7\x32\x5a\x64\x23\xac\xe0\x5b\xca\x3e\x78\x97\xc4\x73\x24\x0d\x8f\xe4\xe5\x99\xe6\x5b\x95\x03\x92\x2e\x84\x04\xef\xdb\x2a\x4b\x18\x5c\x22\xe3\xce\x9d\xca\x89\x5d\x71\x64\x23\xbc\x98\x38\x11\xcc\x17\xea\x86\xe1\xf7\x20\x34\x9e\x9d\xa0\x7c\x4d\x7f\x39\xaa\xa9\x6e\x26\x79\x42\xc8\x45\x46\xfb\x2e\x8a\xc1\x29\xdc\x80\xae\xf3\xef\x44\x74\x52\xe6\x1b\x5c\xdb\x0e\x1c\x5f\xcb\x70\x9a\xbd\xd5\x50\x6c\xe5\xca\x14\x7b\xc0\xc8\x63\x57\x14\xe2\xc6\x73\xe8\x37\xad\xe6\xe5\x62\xf4\x13\x31\xe3\x83\x38\x78\xe6\x4b\x75\x6f\xf0\x33\x30\xb1\xd2\x13\x4c\x78\xf7\xa6\x6c\xef\x7a\xb5\x0d\xf1\xeb\xf4\x47\x84\x9c\x5e\x4e\x4d\x36\xbd\xc6\xd7\x04\xa1\x0c\x05\xe2\xe0\x99\x6f\x3c\xfb\xa2\x81\xf0\x70\x96\x65\x28\xc3\x9b\xd9\xee\xe0\x23\x0a\x49\xa3\xd1\x42\xcd\x43\xad\xa9\x72\xfd\x4a\x15\x54\xae\xca\x63\x28\xa3\x02\x38\xf8\x27\x56\x6a\xb2\x67\x4d\xe1\x59\x8e\xee\x36\x33\xe5\xc3\x81\x6f\x24\xe6\xc6\x4c\xae\xc6\x98\xf9\xc8\x0e\xce\x59\x98\x5c\xee\xa3\x33\x85\xae\x2d\x03\x71\x01\x92\xd8\xff\xec\x3a\x5c\xfc\x1a\xad\xc0\x6b\xf4\xfa\x70\x58\x93\x70\x82\x2c\x6d\x1a\x7d\x08\xde\x80\xd1\xa3\x49\x46\x2d\xa3\xd1\x48\x76\x4f\xfd\x5c\x84\x11\x06\x71\x01\x92\x28\x68\xff\x31\xc2\xe2\x7f\x37\xc2\xa0\x1f\xf4\x49\x12\xe0\xb2\x6c\x29\x90\xdc\xcf\xe1\xc9\x47\x59\x1c\x31\xf9\xac\x97\x12\xe2\x32\xc8\xef\x6b\xc8\xda\xc4\x58\x88\x57\x31\x1e\x9c\xae\x05\xed\x64\x00\x38\xb8\x04\x56\x2f\xd8\x8a\xab\xdf\xea\x4f\x7e\x6e\x55\xd8\xa9\x2b\x2b\x9e\x58\x5c\xe1\xbe\xd9\x83\xe5\x15\x44\x47\xf6\xdc\xf0\xdb\x94\x27\x54\x59\x03\xe2\xe0\x12\x90\xc3\xc8\x8b\x2d\x7b\x60\xa4\x5d\x6b\xa8\x92\xe6\x66\x7a\x3f\xb7\xb6\x97\x99\x6e\xd5\xbc\xea\xc3\xd0\xd6\x86\x5f\x52\x83\xdb\x2c\x22\x2e\x88\x83\x4b\xc0\x88\x67\xcb\x2d\x9f\x4c\xf9\x71\x1c\x36\x2a\xa7\x70\x7b\x56\xa9\x23\xa7\x01\xc7\xf4\xe4\x56\x65\xe4\x95\x28\x87\x09\xbc\x14\x4c\x68\xf7\x10\xc0\xc1\x25\xf0\x5a\x53\xd0\x2f\x74\x89\x1e\xff\x80\x82\x45\xb7\x59\xbf\xb0\xb2\xf8\x77\xd8\xe3\x05\xaf\xb3\xcd\xba\x2a\xc3\xf3\xa9\xef\x70\x56\x11\x8b\x1f\x10\xf7\x7f\x12\xf8\xdf\x79\xfc\x2f\x1a\x00\xcd\xae\x27\x69\xa0\xe7\xca\xd4\xe8\xe6\xe8\x17\xca\x4f\xc4\x77\xbf\xd3\xbe\xde\x71\x76\xeb\xd6\xdf\xc4\x7e\xf9\xe4\xd2\x78\x31\x03\xb9\x57\x11\x4e\x30\x62\xec\x20\x0e\xae\x81\x64\xe2\x77\x06\x94\x26\x72\x47\xb7\x75\x05\x59\x8a\xbc\xfc\x87\xfd\x0a\xea\x4b\x9e\x99\x0b\x67\xb8\xd1\xec\xf5\xdf\x78\x18\x93\x81\x88\x0b\xe2\xe0\x1a\x28\xb9\x42\xe0\x7b\xe7\x03\xa9\xbb\x78\xa6\xcd\x8d\xdd\xca\xf5\xb6\xaf\x67\x5c\xdc\x3e\x95\x2b\x1e\xa5\x08\xf4\xfe\xd8\x61\xbb\x0e\x9d\x85\x03\x71\x70\x0d\xd8\xb9\xb2\x6c\x7f\x66\x8e\x2e\x65\x7f\x1c\xf3\x44\x0c\xbb\x90\xcd\x8b\x12\xdb\xf8\xe2\xa1\xa2\xd6\xa7\xa5\x2b\x59\x4f\x3b\x29\xb9\xa1\xca\x51\x00\x07\xd7\xc0\x18\x11\x45\xf7\xaf\xdf\x84\xa1\x11\x11\xf5\x61\xd8\x1b\x37\x1b\xc4\xbd\x24\xcc\x66\xf1\x55\xd6\xf6\xd5\xa2\x7c\x07\x08\x05\x1a\x10\x1a\x00\x71\x08\x0d\x88\x03\x8c\x30\x28\xd5\x9d\xa4\x81\xed\x9f\xd7\x4a\x9c\x74\xf7\x5d\xe8\x7e\xa3\x78\x7f\xa9\x23\x76\x96\xf8\xd9\x22\x61\xc2\x3c\x96\x44\x49\x4e\x37\x48\x23\x97\x04\x7d\x08\x02\x71\x48\x57\x9d\x97\xea\xe5\x71\xb4\xd7\xd1\xcb\x8c\xeb\x45\xce\x9b\xcd\x87\x3e\xfd\x44\x90\xa5\x26\x74\x4b\xd9\x3a\x33\xa5\x90\xd6\xdf\x19\xea\x25\x09\xe2\x90\x6e\x09\x7d\xc1\x37\x57\x57\x80\x7b\xa5\x56\x7d\xef\x81\xe5\x9c\x36\xf6\xb5\xf1\x69\x29\x05\xdf\x30\xaf\x90\xba\x9f\x2c\xc1\x8d\xdb\x45\x50\xc5\x2c\x80\x83\x6b\xe0\x43\xf0\x4a\x3c\xed\x47\x95\x6f\x3f\x5c\x38\x0c\xe6\xe7\x08\x0b\x9f\x63\xf2\x4c\x09\x10\x69\x7e\xb6\x11\xca\x50\xe0\x4c\xbf\x08\xed\x0e\x82\x38\xb8\x06\xba\xcb\x85\x7e\xb4\x4a\xb2\xc6\xd5\x89\x08\x94\x11\xc5\xe6\x8b\x1d\x16\xf7\xcc\x5c\x29\xba\xdc\xb5\x1d\xc0\xf1\x98\xf2\xf1\x81\x1a\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\x49\x03\x53\x1a\x9d\xe5\x22\xd5\x62\xaa\xfd\xae\xeb\x62\x06\x3a\xcc\xef\xcd\x29\x4c\x5d\x7a\xdb\x1a\x0e\x7e\x85\x8d\xde\x0b\x56\xbb\x36\x8a\x18\x3b\x88\x83\x6b\x80\x3b\x85\xa0\xea\xc0\x66\x84\xec\x05\xd9\x1e\x7f\x8e\xbf\xcb\xe8\x25\xbf\xda\x14\x26\x91\x47\xbc\x64\x17\xdf\x71\x17\xf6\x32\x41\x1f\x5b\x41\x1c\x5c\x03\xac\x6f\x9e\x64\xce\x8d\x75\x36\x24\xe0\x6e\xdd\x91\xcf\x4f\x13\xd2\xc2\xb6\xa6\xb1\xc7\xcf\x13\x93\xc0\x78\xb2\xa6\xfd\x60\x4e\x1a\xaa\x16\x06\x70\x70\x0d\xb8\x92\x97\xea\xa1\xdc\x88\x3f\xf0\xba\xf2\x3a\xb3\x89\x32\x27\xe6\x85\xf0\xc3\x63\x85\xfc\x9a\x58\xfc\xf2\x1b\x8d\x63\x85\xfc\xd0\x3c\x00\xe2\xe0\x1a\x30\x73\x64\x8a\xf9\x66\xa1\x10\x50\x1e\xa4\x85\x5f\xb9\xee\x39\x41\x9d\x22\x70\xa6\x8a\x89\x47\x6b\xa9\xdb\xd5\x5b\xc6\xf8\xe6\x3b\x84\x06\x40\x1c\x34\x0f\x00\x8c\x30\xc8\x44\x9d\x6c\x84\x49\x67\xec\x4b\x07\x66\xa8\xcc\x7f\x3f\x16\xc8\x1c\x24\x30\x2d\xc2\xa6\x93\x24\xf1\x2c\x3c\x7e\xc5\x69\xf1\x53\x6c\xc3\xf3\x8c\x11\xc2\x54\x82\x38\x64\x23\x9c\x72\xb9\x8a\xbc\xbf\xf0\x03\xbe\xd3\x72\x31\xb9\x94\x16\x1a\x8b\xd3\xae\x50\x77\x2b\x7f\x68\xf5\x7a\x40\xf1\x63\xef\xc4\x0b\xb7\x10\x91\x41\x5c\x80\x34\x0a\xf6\x3f\x23\xaf\xf1\xcc\xf2\x07\x51\xc6\x5c\xb4\x32\xf9\x3d\x50\xab\x39\x74\xd4\x70\xd9\xe0\xf0\x32\xc5\xc7\xa0\x8d\xcf\x97\x5a\x0e\x19\x34\x7c\x10\x91\x41\x1c\xf2\xd3\xf8\xd7\x37\xfb\xf9\xab\x6d\xdf\xf6\x33\x09\x33\x0c\x2a\x10\xc2\xa0\x98\x3c\x66\x3b\x78\xa5\x32\x99\x76\xdc\xbb\xa4\xe0\xc9\x77\xe6\xda\x4f\xcc\x81\x3f\x8d\xf0\x19\xf9\xd7\x87\x49\x3a\xae\xbe\x76\x84\xa1\x14\x26\x9a\x36\xdf\xb8\xe4\xd7\xef\x61\x59\xd2\xe7\x33\x14\xf1\x59\x49\x1a\x5d\xd0\xfc\x03\x0d\x5e\xbb\x48\x5d\xe1\x80\x9b\xf2\x4d\xd6\xf8\xf2\xe5\xf8\xe4\x7d\x7e\x07\x8e\x27\x68\x4e\x02\xc3\x9a\xe3\x92\x72\xbf\x36\xe6\xe8\xfe\xdb\x8c\x30\x68\x68\x7f\x56\x55\x22\x19\xe1\x28\xe6\x44\xc7\x95\x55\xcf\xdb\x09\x52\x67\x08\x07\x72\xfa\xa3\x2d\x9e\x7a\x10\x16\x3d\x0f\xd4\xb8\x32\xa9\x24\xb8\xa3\x3c\x7f\x2a\x2d\x59\x50\x78\x91\x3c\x5a\xb6\x6b\xca\xc2\xd1\x0a\x41\x6d\x25\x6a\xed\xfe\xd4\xd0\xd9\x0c\x41\xf4\xc6\xa6\x49\xf3\x8b\x21\xa6\x51\x23\x64\xf5\x93\x14\x7c\xa7\xb2\x35\x8b\x6c\x84\xb9\x1d\xab\xa5\x5f\xda\x4f\xfc\x92\xd2\xa5\x8b\xea\xba\xe5\x9b\xc6\xca\x43\xb1\xbd\xfb\x9b\xb5\xd7\xe7\xc1\xf9\xac\x80\xed\xe3\x53\xb9\x04\x1d\xe5\x1e\xd2\x9f\xe5\x2a\xcc\xfc\xf5\x2b\xe0\x96\x9f\x96\xf6\xda\xcc\xad\xc7\x01\x52\xa6\x6a\x74\x16\x4a\x4f\xab\xab\x22\xfd\xa5\xfa\xe5\x31\xc8\x4f\x67\xdb\x1d\xd9\x08\x8f\xe3\xee\xa7\x16\x8d\xea\xe5\xcd\xd9\x19\xcb\x38\xa6\x8c\x15\x9b\xb3\x6b\xe2\xe0\x86\xe0\x73\x77\xb6\xc7\xb9\x7d\x30\xde\x8a\x3a\x35\x23\x0c\x12\xd1\x49\x99\xef\x22\xbb\x9d\x35\xa9\x6a\xa6\xf6\xbe\xb2\xf2\x46\xaf\x23\xe1\x84\x5a\xac\x71\x93\xce\x32\xa5\xba\xf4\xf9\x4c\x77\xde\x7b\xb2\x17\x11\x33\x3e\x88\x83\x67\x3e\x0e\xdd\x06\x8e\x70\x13\x1d\x91\x9f\xb9\x75\xa3\x5d\xd7\x5a\x29\xdd\xdd\x9e\xe6\xae\xd3\xb8\x0f\xd5\x63\xe9\xa5\x7c\x2a\x4c\xad\x41\xc4\x05\x71\xf0\xcc\xc7\xa8\x12\x21\xa0\xb4\x7c\xa6\xdc\xf8\x42\x93\xe5\x7b\x97\x6f\x51\xca\xa2\xc9\xee\xf2\x03\x66\x06\xad\xaf\x64\xee\x4d\xbc\x2c\x3e\x44\xc4\x05\x71\xf0\xcc\x67\x8e\xb3\x9b\x85\xaa\xd8\xbc\xf8\x46\x2e\x8f\x89\x56\xe7\xea\x54\x1c\xbd\xa6\xcd\x82\xdd\x6b\x74\xc5\xbb\x97\x6e\xcc\xaa\x3f\xb0\x87\x1a\xd6\x01\x38\xa4\x8e\xe2\x38\xdd\xcb\x4c\x85\x8f\xbe\x65\x16\xd2\x1e\xeb\x77\x3a\xdd\x10\x77\xb4\x7a\xc6\x24\x6a\x98\xdf\x3e\xa3\xe9\x53\x5f\xaf\x58\x89\x30\xc2\x20\x2e\x40\x92\x1e\xe5\x3f\x46\xd8\xf7\xef\x46\x18\xf4\x83\x3e\xb1\x48\xcc\xfe\xed\x45\xdc\x9e\x42\x47\xe9\xbd\x78\xb9\x65\xb4\x66\x75\xf2\xe0\x52\xf7\x5f\xed\x03\xd3\x43\x13\x45\xe7\x6d\xe2\x45\xa0\xa2\x2b\x10\x07\x1f\x7a\xd0\x91\xc4\xe3\x67\x2e\x49\xdf\x7f\xcb\x6c\xa6\x31\xf3\xe0\x7f\x7a\x56\x4a\xd4\x7f\x39\xb2\x55\x94\xfd\xd3\x2b\xbd\xbe\xc6\xa0\x45\x44\x5c\x10\x07\x97\xc0\x59\x85\x92\xf5\x4f\xe5\xd5\x0f\x75\x6a\x0a\x7b\xb5\x52\x8f\x1c\x66\x09\x38\x55\x6e\xbe\xd4\xc6\xe9\xac\x25\x97\xf1\xf6\x0b\x95\x44\xc4\x05\x71\x70\x09\x14\x7c\xb9\xc9\x11\x83\xc7\x3d\x8d\xb1\x84\x61\xdd\x63\x8b\xeb\x69\x31\xb4\x6d\x40\x34\x33\x2a\x9a\xb4\x8a\x97\xac\x7e\x56\x0f\xea\xf3\x0a\xe2\xe0\xcf\x61\x1f\x95\xa5\xdb\xe6\x79\x4b\x83\x83\x31\x77\x9c\x62\xdb\x3d\xcf\xf9\x08\xda\x90\x9d\x30\xba\xeb\x13\x22\x39\x63\xa8\xf7\x64\xcf\x20\x16\x3f\x20\xee\xff\x24\xf0\xbf\xf3\xf8\x5f\x34\x00\x9a\x5d\x4f\xd2\x00\xbf\x0f\x7d\x71\x8a\x49\x24\xe1\x99\xa9\xa2\x2a\x81\xaa\x54\xb2\xc2\x2d\xb4\x62\x72\xdb\x79\xaa\x99\x6f\x8a\x0e\xf6\xc7\xd4\x50\xcb\x15\x10\x07\x1f\x7b\x77\x92\x1f\x01\xa5\xb3\xe6\x8b\x90\xe0\x30\x5e\x6a\x2d\x54\x57\x57\xdf\xaa\xa1\xec\x67\xd7\x6a\x0f\xbf\xe1\xb2\xd3\xb7\x97\x53\x20\xe2\x82\x38\xb8\x06\xe2\x6e\x65\x9a\xb6\x94\xf7\x94\xb7\x16\x1b\xa6\x98\xfe\x7e\xb9\x49\xe9\xac\x6c\x7d\x67\x6d\xba\xe2\x68\xb7\x92\x3c\x75\xda\x9b\x10\x6a\xdb\x01\xe0\xe0\x1a\x78\xde\xc0\xa4\xe4\x1c\xbf\x75\xad\xb8\x7f\xaf\xb9\xd2\x6f\xab\x7b\xe1\x85\xdc\xd7\x6b\xac\x1a\x61\xd6\x78\x0b\xd6\x12\x7b\xf3\x77\x11\x71\x41\x1c\xfc\x39\xf8\x99\xac\xde\xb9\x62\x21\xf2\x5d\x3a\x45\x43\xf0\x39\xee\xcc\xdd\x0d\x49\xf7\x29\x4c\x5b\xb4\x61\x83\x5b\x01\x4b\xd4\xe2\x47\x05\x08\x0d\x80\x38\x84\x06\x7c\x01\x46\x18\x94\xea\x4e\xd2\xc0\x80\x9f\x6c\xff\x35\xba\xd9\x0a\xa3\x00\xca\xcc\xae\x3d\xbf\xe2\xe5\xc7\x94\xe7\xea\xfc\xdb\x93\x67\xc6\x2c\x3b\x85\x14\x3f\x40\x85\xf0\x20\x0e\xe9\x96\x57\x77\xd9\x97\xc1\xb1\xf8\xf6\xe1\xaa\xaa\x7e\x6f\xee\x63\xd5\x3f\xd4\x2c\xf6\xd4\x0b\xc9\x1d\x36\x78\x8f\xf9\xe0\x0b\x79\x9e\x3e\x22\x2e\x88\x83\x6b\x20\xa5\xbc\x18\x5d\xaf\x97\x1d\xcb\x37\x78\xfd\x91\xc0\xaa\xb1\xb0\xdd\x42\x1d\x57\xd8\x33\x69\xc1\x60\x6b\xed\x4b\x8b\xd2\x24\xd0\x37\x5c\x10\x07\xd7\x80\xd5\xd0\x43\x72\xa9\x59\x8c\xed\xd1\x35\x02\x9f\x8f\x07\xbf\xcf\x93\x4f\x37\x0e\x8e\x38\xd0\x57\x0e\xf2\xc5\x6b\xde\xad\x3a\xda\x41\xc4\x05\x71\xf0\xe7\xd0\xc9\x16\xc0\x77\xd4\xa5\x8e\xff\x46\x87\x7b\xf3\x30\xc0\x63\xa3\x20\x35\xf3\xd2\x17\x39\x7c\x8c\x47\x33\x35\xe9\x42\xab\x92\x43\x08\x0d\x80\x38\x68\x1e\xb8\xf7\x77\x0d\x80\xd6\x1d\x27\x69\x40\x53\xd5\x02\xb3\x36\x89\xab\x89\x4e\x32\xa3\x9e\xfb\xb1\xe7\xfe\xd2\xd8\xbd\x65\x4c\xcb\xf9\x4d\xff\x0d\x87\xfc\x01\xeb\xac\x35\xe8\xc0\x15\x80\x43\x1a\xbb\x4d\x93\x64\xf8\xfe\xb8\x30\x3a\x4e\x61\x9e\x30\xcf\x87\x9d\x09\xfa\x6b\x16\x05\xee\x69\x8d\x16\xb1\x8c\x54\x3f\xda\x3d\xa0\x13\x27\x20\x0e\xae\x81\xd2\xcc\xdf\x0d\xf8\xcc\x24\x8e\x9d\xe5\x95\x3d\x4d\x87\x3d\xea\x65\xe1\x38\xcf\xac\x22\x32\x29\xd9\xba\xf7\xfb\xee\x4b\xc6\x3e\x43\xc4\x05\x71\x70\x0d\x78\xe2\x48\x19\x39\x68\x27\x47\x9a\x4a\xea\xb3\xc6\xe9\xdf\x2e\xbc\xcb\xa8\xac\xec\xe7\xf0\x41\xe8\xdc\x9a\x10\x45\x3f\x3a\x1d\x54\x72\x04\xe2\xe0\xcf\xc1\xe9\x93\xe3\xbe\xc1\xbd\x95\x87\x1f\x66\xbc\xae\xec\x96\x93\x9c\x17\x94\x0f\x62\x0c\x2b\x7c\xd6\xa4\xce\xa0\x90\x92\xdf\xea\xb4\x88\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\x99\xa8\x93\x8d\x70\xfe\x3b\xdb\x88\xc8\x7a\xb2\xb6\x89\x22\xd7\xd0\x3d\x41\x5f\x9e\x1a\x0e\xa5\xbc\xdc\x5a\xb9\x0b\xdd\xbf\x53\x04\x4b\x77\xea\x65\x10\xa6\x12\xc4\x21\x1b\x61\x33\x3c\x4b\x97\x0c\x06\x27\xdd\x9d\x73\x83\x83\x74\xbe\xc1\x4c\x64\x66\xe6\xa2\xcb\x7b\x19\x01\x9d\x9b\xc2\x66\xf9\x4c\x63\x65\x88\xc8\x20\x0e\xd9\x08\xa3\x7e\xf6\xfa\x4d\xf0\x15\x5d\x64\xd7\xf5\x7b\xc2\x70\xb1\x1d\x13\x6d\x5a\x08\x0b\x01\xcd\x0b\x1b\x8c\x03\x61\xb5\xd4\x00\x39\xa8\x67\x2d\x88\x0b\x90\xc6\x86\x3d\x8d\x7f\x7d\x83\x62\xaf\x6d\xf3\xa7\x9e\x9b\xa8\x87\x1a\x5a\x78\x6d\x52\x2c\xfc\x52\xbd\x01\xc2\x15\xb7\xee\x85\xd2\x85\xbe\xb1\x53\x6d\x15\xfa\xe7\xd1\xe8\x98\xee\x7c\xcb\xb6\x75\xd5\xbb\x63\xcf\x3a\x54\xce\x87\xe2\xe4\x53\xba\x0f\xca\x9d\x57\x52\x57\x90\x16\xbf\x21\xc2\xf4\xa3\xc9\xf5\x0f\x94\x58\x34\xdf\xd9\xb6\x79\x90\xfe\xbd\x4c\xef\x24\x59\xbe\x01\xdd\xdc\xe7\x0b\x3f\x3a\x75\x75\xd0\x29\x57\x26\x42\x4d\x97\x43\xda\xff\xdb\x8c\x30\x68\x68\x7f\x16\xaf\x22\x19\xe1\x60\xf5\xab\x87\xe6\xcc\xe9\xd7\xb9\x6b\x38\x1b\x54\xef\x26\x48\x1c\xb6\x5e\x1e\xe2\x74\xaf\x11\xa5\xad\xc3\x29\xa5\xcc\x1b\xc8\x3d\x95\xcd\x4a\x64\x23\x3c\x1e\xf4\x51\xaf\x16\xaf\x3e\xbd\x90\xf6\x45\x9b\xe6\x72\xca\x8b\xd7\xc4\xb1\x28\xba\x21\x44\xf1\x81\xe7\xae\x19\x7c\xb5\x94\x3e\x3c\x95\xad\x59\x64\x23\xbc\x5e\xff\x02\x77\xa6\x84\x9b\xbd\x46\xc0\xfb\x07\x46\xe2\xf4\xb7\xfc\x19\x1b\x8c\x6f\x34\x4c\x89\xd6\xa8\x09\x2c\x67\xce\x5c\x7a\x74\x2a\xa3\x45\x36\xc2\x31\xcb\x8c\x2c\x6b\xa8\xa6\x25\x7b\x39\x2f\xb3\x6c\x8c\xad\x79\x07\x1e\x27\x79\xd0\x58\x60\x30\xad\x37\x30\xe1\x97\x0e\x7a\x28\x9f\xca\x68\x91\x8d\xf0\xf2\x2b\x2a\x5f\xcf\x9b\xe8\xcb\xba\x15\xaf\x6c\xcd\x68\xb6\xa8\xb2\x5a\x1a\xbd\x6d\x28\x7e\x8c\x5c\xf9\x80\xf2\x52\xe6\x47\xf6\x29\x3c\x64\x9d\x7f\x27\xa2\x93\x32\xdf\x48\x67\x63\xd8\x56\xd8\x2b\x2e\x1d\x0b\xa2\xc1\xfd\x24\xa9\xab\xd5\xd7\x51\x9f\x0d\xe0\x6d\x35\xfd\xb8\x31\xd6\xdd\xb6\xa5\x7b\x03\x31\xe3\x83\x38\xf8\x8c\xcf\x52\xf4\x7b\x98\xec\x1b\xc1\x68\x28\xef\x2a\x8b\xa8\xa5\x83\xff\x43\xfa\x50\x87\xe6\x98\xc8\x8d\x8a\x33\x7a\x4a\x6c\xd3\x93\x50\xab\x0c\x10\x07\xcf\x7c\xd7\x7d\xb6\xb1\x6c\x1a\xaf\x4d\xf1\x9e\x8b\xa9\xb9\xe9\xfb\xc6\x17\x8d\xd1\xbf\x93\xc4\x38\x24\x87\x0f\x2f\x89\xb8\xed\xe3\x21\xd4\x30\x12\xc4\xc1\x33\xdf\xad\xb5\x59\x6e\xb6\xe8\x81\x02\x16\x27\xa1\x91\xf7\x7c\x6c\x96\xa4\xc2\xa4\xed\xab\xfb\x68\xae\xf5\x9c\xb6\xf7\xa9\x2e\xe7\x5e\x46\xc4\x05\x71\xf0\x33\x56\x68\xc7\x47\x69\x2d\x5f\x65\x19\x5f\xe5\x34\x07\x3f\x6d\x5c\x3e\x3c\xeb\xdf\xb3\x6b\x95\x73\xc7\xd5\xab\xb0\x71\xef\xbc\x7c\xb4\x28\xc2\x08\x83\xb8\xff\xbc\xb7\xff\x18\xe1\xc6\xbf\x1b\x61\xd0\x0f\xfa\x24\x09\x30\xda\x8a\x09\x3f\xc5\x8c\xcb\x41\x79\x28\xd2\x7a\x66\xba\x54\xa6\xbb\x92\x95\xa2\xf4\x86\x08\xda\xcf\x01\xbc\x70\x91\x84\x9b\x5b\xd0\xb7\x05\x00\x07\x97\x40\xd7\xe2\x35\x34\x7f\xfb\x20\xb2\x0a\xc1\x2b\xb3\x3b\xd5\x13\xe1\x39\x0c\xa1\xc9\x19\x03\x0f\xb5\x6e\xd2\xe0\x0f\x4b\x89\x2d\x40\x1d\x69\x40\x1c\x5c\x02\x82\xbf\xd7\xda\x5f\x29\xd0\x57\xdd\xdb\x5c\xfd\x50\xf1\x26\xd7\xa8\xe1\xe1\x16\xf9\xad\xbc\x34\xd9\xaf\x91\x1a\x21\x3b\xee\x4e\x7a\x88\xb8\x20\x0e\x2e\x81\x17\xe3\x9a\xd9\x2f\x31\x15\xd5\xe4\x63\x9e\x73\xc4\xb6\x06\xbf\xf0\x6f\x4b\xeb\x3f\x1b\x95\x72\x4e\xcd\x80\x3d\x7a\x2d\xb9\x01\xda\xc1\x06\x71\x70\x09\x98\xdd\x29\xc2\x66\x8c\x97\xdb\xbf\xb3\xf5\xbe\xf7\xdd\x3d\x57\xf3\xa5\x77\x9b\x9c\x6a\x4e\x79\x36\xf6\xa6\x31\xf3\x3f\xcf\xcc\x24\x42\xbb\x00\x00\xee\xff\x24\xf0\xbf\xf3\xf8\x5f\x34\x00\x9a\x5d\x4f\xd2\xc0\x46\xca\x44\x31\xae\xcb\x91\x45\xaa\xf4\x57\x36\x7e\x4d\x9e\x77\xb2\x9d\xd8\xe3\xfb\x26\x8f\x1e\xbe\xfb\xb5\x9c\xcc\x11\xe1\xe2\x8c\x18\x3b\x88\x83\x6b\xc0\x44\xb4\x84\x8d\xc9\x7d\xaa\xba\x85\xc0\x3d\xe4\x4d\x75\x41\x56\xb7\x49\xd0\x46\x87\x5b\xc2\xf7\x15\x27\xd1\x4a\x97\x4e\x6e\xe8\x68\x34\x88\x83\x6b\x60\x25\xd1\x6b\x20\xf5\x58\xaa\x40\xcb\x04\xd7\x9b\xb5\xde\x8a\xf3\xec\x33\xb5\xac\xda\x89\x17\x38\xb7\x08\xd4\x2f\x66\x86\xa8\x7b\x22\xe2\x82\x38\xb8\x06\xd2\x7e\x8d\x5d\xe3\x32\xc8\x28\x77\xc0\xa3\xba\x9e\x51\xd9\x5f\xec\xcc\x8b\x3b\x34\x2f\x72\x13\x4b\xb6\xa6\x90\x90\xa6\x84\x1e\xaa\x1f\x05\x71\x48\xb5\x82\xa8\x89\x1f\x5c\xe7\x29\x3f\x0b\xb6\x3f\x5e\xbc\x28\xbe\x3c\xea\x7b\xf7\xed\x5c\x50\xca\x94\x82\x9c\xfc\xed\xb9\xb5\xa5\x34\x7f\x84\x06\x40\x1c\x42\x03\x8d\x00\x23\x0c\x4a\x75\x27\x69\x60\x78\x76\xa9\x58\x6e\x6c\x28\xb4\x8f\x7f\x34\xae\xe7\xfa\x8a\x22\xe5\x6e\x04\x99\xc2\x5c\xe1\x48\x16\x8d\xba\x24\x19\x7b\x28\x31\x62\xec\x20\x0e\xae\x01\x32\x8d\xab\xe2\x18\x55\x1c\xd9\x7b\xd7\xe5\xe9\xd7\xf2\x8e\xc4\xdb\x44\x0e\x7c\x02\x6c\x29\x56\x76\xfc\xaf\x10\xbd\xf9\x85\x0a\x19\x4b\x10\x07\xd7\x00\x69\x12\xab\xaa\x81\x31\x03\x87\xd5\xde\x31\xc9\x57\x9e\x4f\x0b\xad\xee\xdc\x25\x79\x2d\xa4\x9b\xfc\xb3\x96\x97\xed\x56\x5f\xc8\x43\x3b\xcd\x00\x0e\xae\x81\x11\x97\x8c\x5f\x67\xda\x48\xbc\xcd\x8e\x3e\xeb\x1f\xf5\x61\xd3\xdd\x93\x94\xb3\x9e\x34\xae\xbc\x97\x60\x9d\x6f\x65\x7a\xf1\xe7\x26\x94\x12\x01\x1c\x5c\x03\x1b\xfb\xea\x4f\xa4\x50\x45\xae\x5a\xc4\xe4\xd4\x2b\x27\x5c\xb2\x54\x6b\x14\xbb\x4c\x3b\x9f\x5a\xf6\xe1\x03\xfa\x0d\x07\x07\x33\x6d\x84\x06\x40\x1c\x34\x0f\x00\x8c\x30\x68\xdd\x71\x92\x06\x6a\xfd\x6f\x66\xfa\xc8\xe2\xb1\x0d\xad\x46\x04\x88\x92\x95\xe6\xc8\xc5\x91\x46\xf1\xcf\xea\xb7\xfd\xc6\x51\x2a\xf8\x25\xc1\x0c\x5d\x54\x05\xe2\xe0\x1a\xf0\x55\x08\xfe\x12\x52\x94\x4b\xee\x8c\xa7\x1d\xe5\x97\xc1\x4c\x21\x6a\x20\xd2\xe7\x30\xc6\x92\xc3\xa0\xfe\x50\xca\x50\x4b\x02\xfa\xd0\x06\xe2\xe0\x1a\x78\x71\x35\x4e\x59\x51\x4c\x5e\xeb\x5d\x14\xe7\xb5\xce\xd6\x66\xb4\x5f\xa8\x75\xa9\x02\x05\x0d\xf3\x79\xe8\x14\x85\x09\x59\xab\xd0\xbb\x02\x71\x70\x0d\x08\xe4\xd6\x6a\xe4\xdc\x8b\x72\xf2\x8d\x5a\xdc\x6d\xd6\x4d\xdb\x66\x38\x23\xdb\xa6\xc9\x4b\xa3\x5e\xcf\xb6\xbe\x4f\x92\x3b\xe6\x04\x75\x8b\x02\x70\x70\x0d\x54\xde\x7f\xb4\x2a\x9c\x51\x38\xda\x5d\xb2\xa4\x34\x93\x75\xfe\x61\x63\x48\xb0\x3c\xaf\x58\xb8\x6e\xac\xc5\x44\x1b\x2e\x76\x9d\x3e\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\x64\xa2\x4e\x36\xc2\x7b\x98\x2c\x1e\xc3\x8c\xf7\x0f\xc8\x3e\x9d\x0b\x0e\xdc\x4d\x4b\x54\x59\xbf\x30\xe7\x67\xee\xe0\x63\x95\xfa\xc6\x03\x93\x5b\xef\x13\xc2\x54\x82\x38\x64\x23\x8c\x4d\xea\xee\xf3\x92\x94\x11\xe7\x86\x9e\x6a\xfe\x53\x8c\x7b\xce\x8a\x12\x1d\xf2\x3f\x69\xd6\xa7\x70\xf5\x02\xf3\x7d\x86\x68\x49\x10\x91\x41\x1c\xb2\x11\xee\xcf\x2d\x23\x52\xf0\xb5\x7d\x9c\xb9\x5c\x19\x8d\xa7\x34\xa4\x22\x9a\xef\x18\x90\xf9\xc4\x33\xa3\x4e\x42\xde\x9a\x1d\xdf\xe3\x15\x22\x32\x88\x0b\x90\xa6\x87\x3d\x8d\x7f\x7d\x53\x65\x15\x03\x8f\x5e\xab\x4b\xc6\x2a\xb1\xd4\x50\xa8\xa5\x33\x8a\xf3\x96\x15\x91\x66\x96\x44\xf2\x93\x18\xc2\x04\xb2\x48\x6a\x75\xff\x3f\x8d\x70\xee\xd1\xbd\x4e\x76\xb5\x96\x09\x6c\x19\xe1\xb8\x3d\xc5\xf2\x62\xc6\x2e\x0c\xc5\x72\xe3\xa5\x29\x4c\x5e\xe2\x9e\x2b\x79\x68\x04\x7f\xa0\xbd\xcb\xe6\x8d\xa2\x1c\x15\x6e\xc5\xeb\x13\x15\x6e\x79\x21\x2a\x44\x05\x5f\x7d\xe8\x36\x8e\xa3\x22\x83\x1d\x30\xde\x8d\x88\xe4\xfc\xb7\x19\x61\xd0\xd0\xfe\xac\x11\x96\x81\x9b\xa5\x59\x1b\x1e\x59\x1a\x6a\x1b\x2b\x21\x09\xfc\x63\xd9\xd7\xb3\x5f\x02\x43\xda\x63\xb6\xc6\x38\xb5\xf9\x85\x65\x8e\x3d\x1f\xea\x65\x9f\xca\x66\x25\xb2\x11\xae\xb5\x91\x10\xbb\xa2\x5d\xee\xf5\xfd\x3d\x13\xb1\x06\x51\x63\xb4\x6b\x5b\x87\x4f\x64\x80\xc1\xa6\x0a\xb7\x2f\x0a\x8d\x1d\x83\xcf\xa9\x6c\xcd\x8a\x20\xfd\xd9\x07\xe6\xaa\x81\x64\xa5\x87\xf1\xf3\x28\x1f\x9f\x63\xd0\x2d\x6a\xbf\x4f\x7e\x3e\x5a\x43\x3b\xb0\x32\x6a\x8d\x5b\xcf\x9a\x5a\x27\x77\x2a\xa3\x45\x36\xc2\x55\x22\x76\xc4\xfe\x4f\xd7\xbf\xc5\x25\x3b\x17\xa7\xc5\x68\x8e\x3e\xf6\x3f\xfc\x7a\xfd\xd3\xab\x4a\x8e\x97\xe8\x43\x11\x87\x65\x35\xa7\x32\x5a\x47\xa4\x3f\x3b\xb1\x2c\xf7\xb1\xcd\xa5\x99\x1b\x85\x50\xc1\x61\x5d\x0a\x3d\xdd\xa5\x69\xb3\xef\x7c\x82\xbd\xee\x3d\x7f\xcf\xc2\xe3\x62\xb5\xfe\x53\x33\xc2\x20\x11\x9d\x94\xf9\x96\x82\x98\x67\x08\xc2\x3e\x08\xda\xb9\xdc\x6e\x56\xe9\x9d\xbe\x90\xce\xb1\x1b\xab\x4b\xaa\x88\xd3\x7d\xb6\x2d\x43\x17\x3d\x51\x18\xea\xbe\x0f\xe0\xe0\x99\x8f\x57\x31\x7c\xb6\x7c\x2b\x9a\xbc\x74\x60\xeb\xd7\xaf\x7d\x1d\xc2\x71\xc6\x72\xad\x69\xc7\xef\x3b\x83\x04\xd1\x52\x1f\x8b\x27\xa1\x2b\xc1\x40\x1c\xd2\x4d\x28\x73\x16\xb5\xde\x77\xc9\xcf\x8e\x2f\xcd\x11\xc4\xf7\x10\x7c\x9e\x43\xaf\xfa\xae\x29\x66\x17\x7a\x1d\x43\x70\xd9\x56\x98\xdc\x00\x11\x17\xc4\xc1\x33\x1f\x31\xe3\x35\x47\xd6\xf3\x55\xe9\xb6\x4a\x77\x67\x9f\x2b\xa7\xee\x16\x26\xa3\x8e\xae\x75\x06\xf3\xa6\x13\xc6\xee\x92\x7a\x90\x43\xd7\x33\x82\xb8\x00\xc9\x7f\x76\x5a\xb8\x18\xd4\x68\xdd\xcb\xda\xe9\x2c\x2b\xa7\x89\x1e\x7e\x2f\xbf\xfe\xc3\x92\xd9\x47\x91\xde\xd7\x9c\x07\x86\x06\xa8\xd9\x49\x1b\x18\x08\x23\x0c\xe2\xa0\x1a\x61\x99\xbf\x2e\x7e\x40\x3f\xe8\x93\x24\x70\xf3\xd2\x70\x18\xcd\x52\x6b\x12\x5f\x8f\x25\x49\xc9\x1c\x86\x1b\x6f\x69\x10\x61\x59\xd1\xb7\x6f\x3f\x23\xe2\xe2\xdd\xa9\xd0\x49\x11\x43\x07\x71\x70\x09\x7c\x61\x98\x42\xa1\xaa\x90\x8b\x64\x7f\x10\x76\x94\xcf\x30\x4f\x71\x87\x71\x71\x73\x2c\xb6\xb1\xa9\x59\x63\xfe\x13\x36\x4a\x0b\x0a\x22\x2e\x88\x83\x4b\xc0\x47\xce\xc1\xc4\xdf\xef\x4e\xb9\x3e\x69\x49\x14\x5a\x88\x50\x4f\xdd\x43\x5f\x8a\xb2\x50\x81\xab\x8d\xa1\xef\x5f\x3b\x5a\x07\x42\xd7\xcf\x83\x38\xb8\x04\xf6\xbe\x8d\x3e\x30\xd8\x9f\xc7\xfe\xfa\x3e\x31\xac\x65\xae\x7b\xe5\x23\x39\xe5\x95\xbe\x99\x0f\x59\x3d\xd9\x2e\xf5\xaf\x96\x1b\x3a\x11\x71\x41\x1c\x5c\x02\x4b\x8f\xfc\x23\x74\xbc\xf2\x0b\x2b\xef\xc6\x9d\x7f\x85\x4f\x81\x23\xa3\x71\xc9\x32\x52\xf8\x32\xa6\xc7\x88\x5c\x32\x9b\x1b\x29\x37\x62\xf1\x03\xe2\xa0\xda\x40\x80\x11\x06\xcd\xae\x27\x69\xe0\xf6\xcc\x03\x76\x09\x07\xe2\x3b\xf7\x04\x1e\xa4\xe3\xa9\xf7\x92\x75\xe3\xce\xbe\x93\x35\x4d\x39\x08\x73\x34\xdd\xc2\xe6\xb5\x81\x8e\x18\x82\x38\xb8\x06\x6c\x7f\xc5\xe6\x38\x34\x0a\x95\x7f\xca\x21\x0b\x54\xa9\x3c\x0a\x19\xcf\xbb\x63\xfa\x08\x35\xe6\x93\x63\x77\xbc\x4c\xb3\xb1\x33\x54\x77\x0a\xe2\x90\x76\x82\x30\x24\xd6\x74\xee\x54\xe7\xb1\xed\xe8\x67\xe1\x75\xa8\x5d\x10\x99\x63\xb3\xbc\xc9\xeb\x10\xd1\x33\xd3\xd2\x2e\x86\x9e\x39\x01\xed\x04\x01\x38\xb8\x06\xba\xeb\xe4\xda\xeb\x3a\xfa\xba\xb9\xb0\x7f\x7a\x24\xda\xfc\x30\x6d\x34\xcd\x65\xec\x7d\xc0\xaf\x6d\x15\x10\x4a\x94\xaf\xe6\xcf\x08\xed\x60\x03\x38\xb8\x06\xc2\xee\xd6\xdc\x77\x19\x15\x9c\xa5\x5b\xe1\xbe\xc5\x69\x18\x97\xf6\xbb\x4d\x6a\x82\x6c\x47\xeb\xd6\xfc\x34\xb5\x5e\x97\x6d\x9d\x21\x42\x03\x20\x0e\xaa\x0d\x14\xf9\xbb\x06\x40\xa9\xee\x24\x0d\xe4\xaf\x45\x4e\xb4\xf5\x44\x25\xb6\x8c\x7c\xad\x79\xe8\xa6\x72\x56\x7b\x0c\x45\x77\x77\xfe\x71\xf2\x59\xba\xf8\xc6\xca\x55\x59\xe8\x63\x08\x88\x83\x6b\x40\x3f\x2a\x3b\x3a\x9f\xb3\x63\x2e\x56\x37\xbf\xc5\xbc\x4c\x6e\x6f\x65\xe7\x36\x0e\xb6\xee\x68\xf0\x23\x13\x51\x9d\x85\xae\xd4\x4a\xa8\xd9\x1c\x80\x43\xaa\x13\x3f\x57\xbb\xe6\x57\xb9\x2a\xba\xd2\xeb\x68\x71\x23\x90\x24\xbe\x29\x84\x7d\x65\x75\x93\x8e\xcd\x2a\x90\x51\x88\xd6\xec\x3c\xd4\x66\x1c\xc4\xc1\x35\xa0\xdf\xa8\x72\x57\x85\xd5\x08\x7b\xfb\xa3\x83\x7f\x63\x71\x4e\x9a\x59\xd9\xae\xf4\xf3\xfb\xec\xf4\x07\x11\x5b\xaa\xf4\x14\xaf\x56\xa0\xff\x17\xc0\xc1\x35\x80\xd5\x4d\xc0\x7c\xdc\xa6\x3d\x44\xd3\xe5\xc3\x2e\x66\xc5\xec\xa4\xc5\xd8\xb7\x9a\xac\x28\xfd\x53\x82\xf7\x56\x0f\xf3\xea\xb1\x2d\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\xb4\xee\x38\x49\x03\x77\x36\x7f\xaa\x89\x36\x05\x2a\x24\x0c\xf8\xd2\x9b\x37\x84\x5a\x94\x3c\x98\xaa\x14\x8b\xa9\x28\xf0\xbf\x23\xc2\xb3\x10\x73\x03\xba\xe9\x16\xc4\x21\x1d\x8c\xd2\xc2\x0c\xac\x19\x73\xe4\x52\x0e\x5a\x92\xaf\xe6\x63\xa5\x7f\xb7\x29\x69\xfe\xf0\xcd\xa0\x5e\xe6\x9b\xf0\xba\x3b\xa1\x34\xe9\x88\xb8\x20\x0e\xae\x01\x5d\xba\xdf\x95\x47\x38\x11\x16\x1d\x47\x8d\xda\xe5\x2f\x54\xbf\x11\x98\xd4\xe7\xbe\x25\x2e\x7e\x6b\xfd\x01\x0d\xaf\x16\xa3\x0c\xba\x80\x06\xc4\xc1\x35\xa0\xc0\x3a\x2b\xdd\x44\x95\x57\x14\x6e\xf2\xb2\x7c\x02\xb3\x37\x2a\xd1\x4f\x7b\xda\x47\xcb\x10\xf5\xbc\x24\x21\xfd\x3c\xea\x3a\xd4\xde\x18\xc4\xc1\x35\xe0\xfb\xd8\x7e\xeb\x93\xe0\x93\xe7\xc7\x2d\xcf\xd1\x66\x0a\x78\x2e\xfa\x46\x86\x27\x3c\x3f\x90\x5d\xfc\x69\x33\x2c\x6f\x72\xd6\x90\x1d\xa1\x01\x10\x07\xcd\x03\x8e\x7f\x37\xc2\x20\x13\x75\xb2\x11\xb6\x7d\xb6\x43\xa7\x71\xcb\x15\x57\x47\xbf\x8a\xec\x58\xee\xa9\x8f\xc9\x9a\xd0\x76\x40\xe7\x00\xc7\x45\x65\x3b\x9d\x7d\x19\x66\xe8\x68\x34\x88\x43\x36\xc2\x37\xcb\x65\x4b\xd3\xd5\x6f\xc6\x2a\x3e\x35\x21\xe9\x36\x5b\xb7\x63\x2c\x09\x12\x39\x3b\xf5\x06\xd7\xed\xd1\xf3\xfb\x87\x78\xde\x91\x88\xc8\x20\x0e\xd9\x08\x0b\xac\x56\x3f\x7f\x3d\xc0\x72\x8e\x28\x25\x48\x56\x8e\x74\x5d\x4e\x4e\x51\xa2\xe0\xa5\x85\x78\x4c\x85\x55\xc7\xfa\x6c\x6a\xbb\x27\x22\x32\x88\x0b\x90\xf6\x85\x3d\x8d\x7f\x7d\x23\x68\x6d\x23\x9b\x57\xb5\x76\x6b\x76\xd1\xdd\xd4\x5c\x5c\x9b\xb3\x35\xdf\x12\xb1\xb8\xdc\x03\xab\xc8\x5e\xa4\x65\xde\x9d\xf8\xf0\x94\xed\x4f\x23\x2c\x77\xf5\x40\x46\x0a\x85\xe4\xca\x51\x82\xfc\x87\x16\x1e\x53\x2d\x7b\xff\x78\x0c\xc3\xcd\x2d\x3f\xce\x9c\xa5\x98\xcf\xe7\x96\xb5\xfe\x40\x85\x96\x93\x4b\x69\x34\x07\x86\x5e\x6f\x2c\x26\xd3\xb4\x69\xf1\x69\xd2\xed\xd8\x28\x66\x57\xb3\x63\x5f\xb8\xc3\xb9\x37\x7f\x69\xea\xbf\xcd\x08\x83\x86\xf6\x67\x8d\x30\x92\x11\xfe\x58\x85\x69\x85\xdd\x2e\xfe\xd3\x50\x89\xb5\xa6\xa6\x42\xe0\xc1\x33\xf9\xc0\x4c\x4e\xb3\xf3\x7a\xdb\xb7\x93\xdd\x47\x3b\xe8\x07\x4f\x65\xb3\x12\xd9\x08\x6b\x75\x07\x1f\x16\x65\x47\x10\xd8\x72\xbe\xa2\xba\xaf\xf5\x79\xa0\xbe\x44\xb6\x0e\x93\xa7\xc2\x6d\xa7\x4a\x3c\x9c\xfb\xd3\xb9\x53\x69\xf0\x2b\x8e\x6c\x84\x33\x94\x66\x1d\x59\xa3\xa2\xb3\x79\xcf\x92\xa0\xfb\xe4\x78\x4b\x0a\x5c\x63\xc1\x6f\x6f\x26\x20\xf5\x73\xa2\x7b\xf9\x36\xa0\xfd\xe8\x54\x46\x8b\x6c\x84\x51\xee\x39\x2b\x39\x4a\xf1\x8c\x78\xea\xd3\xe1\x97\x14\x27\xa2\x88\x45\xa7\xa0\x1c\x48\x54\xb1\x98\x32\xaf\xa9\x7d\x1e\x2f\x4c\x3d\x95\xd1\x22\x1b\x61\xd9\xec\xfc\x3b\xfa\x0a\xde\xd9\xdb\xac\x89\x0d\x98\x7b\xb7\xa9\x65\xdf\x87\x37\x74\x7d\x23\xbc\xe1\x83\x37\xe3\x66\xe7\x29\xcb\x7a\x6a\x46\x18\x24\xa2\x93\x32\x5f\xdb\xcf\x92\x4b\x13\x26\xd8\xfb\xf3\x7b\xaa\x83\xe5\x9d\x94\xc2\x07\x51\x54\xbe\x58\x92\xe2\x36\xa6\xbf\xb1\x2f\x7e\xd7\x56\x2a\x87\x5a\xc1\x02\x38\x24\x17\x34\x79\x5b\xde\x91\x90\x58\xe8\xea\x34\x9a\x36\x61\x45\x7e\xe4\x39\x2f\x46\xee\x37\x53\x5f\xbc\xa3\xfb\xf0\xbd\xbc\x0b\x5a\x20\x83\x0d\xe2\xe0\x99\x2f\xac\xe4\xbb\x60\xa3\x66\xcf\xb1\xd0\xec\x51\xb5\x2f\xb3\x22\x4a\x2d\x5f\xae\x49\xdf\xa4\x76\xff\x79\x8e\x00\xba\xa6\x3d\xa3\x29\xa8\x85\x26\x80\xfb\x4f\x26\xf9\x33\xee\x93\x5b\xd1\x7a\x76\x2d\x9f\xf9\x26\x4c\x3f\x6c\xb2\xc5\x1d\xc8\x64\x24\x24\xa6\x0e\xfd\x20\x77\x61\x38\xe7\xec\x35\x10\x98\x33\x89\x88\x0b\xe2\x02\x24\x31\xfe\xd9\x85\xa8\xf3\xd1\x93\x50\x9e\x30\x53\xb7\x95\x8e\xa4\x1f\x64\xaf\x88\x53\x3f\xda\x46\x63\xfc\x6c\xa4\x48\x71\x36\x60\x91\xed\x1f\x6a\x47\x18\x61\x10\x07\xd5\x08\xff\xdd\x08\x83\x7e\xd0\x27\x49\x20\x0d\xa3\x67\xaf\xe6\x41\x0a\xeb\xba\x3a\x2a\x66\x55\x7a\x4f\xcb\x59\xfa\x17\xd9\x38\x93\x24\x73\x33\x8e\x84\x5f\xb5\xa8\xdc\xa0\x4e\xb5\x20\x0e\x2e\x81\x9c\x28\x59\x83\x87\x66\xca\x63\xca\x93\x8d\x4e\xc5\x9f\xd3\x62\xd7\x6a\x9d\x99\x03\x4d\x4d\x35\x43\xe8\x07\x7e\x64\x06\x39\x73\x22\xe2\x82\x38\xb8\x04\xd8\xe3\xbc\x7d\x29\xdd\x31\x0a\x1e\x73\x5e\x15\xc1\x9c\xb1\xc5\xc3\x13\x4d\x44\x67\xa8\xe0\xdf\x77\xff\x41\x22\x5e\x37\x3e\x6c\x81\x88\x0b\xe2\xe0\x12\xf8\xb2\xef\xfe\x80\x23\x9b\xee\xfe\xd1\x26\xdf\xa3\x85\xef\x3e\x75\xe1\x81\x0b\x14\x33\xa5\x44\xb2\x9f\x34\x3e\x0e\xf4\xe6\x8f\xa9\x42\x92\x05\x70\x70\x09\xd0\x53\x3c\x3c\x0a\x9e\x13\x7e\x6e\xe9\xca\x22\x90\x10\xfe\x84\x8c\xfc\xde\xe7\x17\x55\x06\xeb\x0c\x69\x23\x8c\x05\x8b\x2c\xbd\xeb\x88\xc5\x0f\x88\x83\x6a\x03\x01\x46\x18\x34\xbb\x9e\xa4\x01\x86\xda\x86\x50\x5e\x94\xb6\xb9\xd6\xba\xb3\xb4\x0f\xa5\x79\x6e\x94\x6d\x36\x13\xa9\x86\xb7\xec\x35\xcb\xca\x75\x3d\xc5\x37\x51\x44\x8c\x1d\xc4\xc1\x35\xc0\x77\x23\x1e\x6f\x16\xaf\x6d\x93\x70\x87\x5f\xfc\xd6\x40\x89\x5e\xc2\xe0\xfd\x41\xaf\x99\xb3\x99\x07\x0e\x53\xdf\xe7\xdd\x43\xa1\x6e\xc5\x20\x0e\xae\x81\xc7\xd8\x1c\x22\xef\xd5\x7d\xa3\xaf\x30\x9e\x15\x28\x17\x49\xb4\x3b\x5f\x54\x65\x6c\x7c\xc1\x8b\x99\x02\x5b\x84\xa1\xa2\x4d\x13\xba\xaf\x07\xc4\xc1\x35\xa0\xb9\xa2\x89\xce\xb3\xad\xe5\x6c\x43\x11\x8d\x6f\xe3\x59\xd9\xf4\x30\xfe\xe6\xd8\xa8\x3c\x29\xa1\x6e\xc4\xf5\x97\x68\x7b\x8f\xc3\xa0\xa3\xa1\x00\x0e\xae\x81\xcc\x28\x36\x9f\x06\x37\xd1\xdb\x62\xb3\x1f\xf7\xbc\x3f\xa8\xa7\x58\x5d\x0d\x57\xdf\xd1\x6e\x39\x63\x4a\xc5\x9a\x51\x72\x67\xd4\x02\xa1\x01\x10\x07\xd5\x06\x02\x8c\x30\x28\xd5\x9d\xa4\x81\xeb\xe4\x3d\x31\x21\xa8\x7c\x85\x6e\x9a\x6c\x3a\xb1\xdf\x5c\x39\x5a\xec\xca\x6d\x5f\x77\xb7\xe9\x8f\x15\x26\x12\x5b\x28\x1e\x41\x87\x78\x40\x1c\x5c\x03\x6c\xbf\xd6\x32\x59\xfd\x6d\x02\x7a\xed\x7e\xd3\x3d\x53\x28\x77\xba\x32\xa7\x2a\xa9\xa6\x95\x51\xd9\x8f\x83\x92\xc6\x51\xf6\x82\x0b\x11\x17\xc4\xc1\x35\xf0\x92\x94\xa2\x71\xf4\xe5\x1c\x5a\xe5\x86\xd0\x8c\x3f\x41\xba\x74\x5c\x82\xc9\x99\xbb\xf4\xf9\xd9\xcf\xa3\xfb\xc5\x7f\x99\x85\xc4\x23\xe2\x82\x38\xb8\x06\x94\x65\x0e\xcf\x89\xad\xa1\x8a\x9a\xac\x8a\x8a\x84\x92\xe0\x8d\x7b\x62\x7e\x21\xc3\x61\xcb\xba\x28\xbc\x44\xc0\x9f\xd9\xbb\x0e\xb5\xb7\x00\x71\x70\x0d\x44\x9b\x63\xe6\x44\x53\xfb\xb9\x34\xe8\x2c\xc5\x5d\x1f\x6d\xac\x0b\xc6\xcf\x69\x92\xd2\x97\x09\x49\x68\x71\x5c\xf3\x68\x53\xbc\x8e\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\xad\x3b\x4e\xd2\x80\xa7\x7c\x3d\xde\x21\x5e\x7d\xc2\x18\xde\xb5\xe3\x90\x1f\x2f\x9e\xf5\x33\x07\xc7\x3c\xb8\x5e\xf1\xe3\xa2\x58\x6b\x9e\x92\x13\x39\x11\x74\x24\x18\xc0\xc1\x35\x80\x9f\x83\xff\x9a\x78\xcf\x29\x66\x61\x62\x3d\x6d\xcd\x32\x33\xb7\x10\x25\x3c\x15\x7f\xd6\x7c\x79\xab\xca\x4e\xb5\x1b\xa3\x10\xba\x21\x1c\xc4\x21\x75\xea\x4e\x44\x17\x1d\x9e\x88\x7d\x80\x99\xb8\xf2\x2a\x6f\xf0\x4e\x10\xd5\x98\xd6\xdc\xef\xf8\xde\x1f\x23\x1b\x14\x3b\xb5\xd4\xa2\xd0\x69\x03\x10\x07\xd7\x80\xd7\xd4\x76\xde\x1b\x2c\x11\x0b\xa1\xf9\x4f\x6e\xd1\xfa\xc7\xbf\x6c\x99\xef\x1a\x09\x4b\xa8\xa9\xba\xf1\xca\x89\x45\xbe\x2f\x29\x45\xc4\x05\x71\x70\x0d\x04\x70\x54\x47\x35\x72\x65\xcf\x8d\xd2\x4d\xf9\xa5\x31\xa3\x3e\xa3\x2a\xba\xba\x87\xca\xea\xad\xaa\x32\x9b\x23\xee\xb1\xcd\xaf\x83\xd0\x00\x88\x83\xe6\x01\x80\x11\x06\x99\xa8\x93\x8d\x70\xe7\xbe\x33\xb7\x78\xaa\xf7\x70\x39\x4f\x27\xc5\x53\xa3\x37\x5a\x18\xd3\x89\x0d\x94\xf2\xe7\x2c\xc5\x35\x3c\x8d\x4d\x57\xa5\xa0\x96\x56\x20\x0e\xd9\x08\xdf\xa9\xa6\xcc\x2a\x3f\x3c\x6e\xa3\x13\x5d\xed\xc6\xbb\x63\xea\x72\xdd\x8b\x20\xa2\x72\xdd\xe8\x5e\xb1\x99\x53\x44\xb5\x82\x8f\x26\x22\x32\x88\x3b\xa1\x46\x78\x9d\x59\x42\xc3\xfd\x8d\x95\xe3\x54\x8f\x88\x0c\xbe\xfb\x33\x62\x89\x47\xba\x3c\x4f\xe4\x48\xa5\xfa\xed\xf5\xbe\x18\x18\xbd\x80\x6a\x84\x01\x5c\x80\x34\x0a\xda\x3f\x23\xff\xeb\x9b\x57\x43\x6e\x5c\xf8\x22\x9b\x5a\x7a\x25\x22\x29\xc9\xf9\x60\x56\x73\x96\xf5\x92\xc3\x95\xf7\x13\xcf\x12\x54\xde\x38\xb5\x8f\xeb\xd9\xd3\xfe\x69\x84\x0b\x95\xb5\x2b\x18\x2c\xda\x1a\x64\x27\x93\xa5\xfc\x08\x7e\x30\xbc\x31\xed\x26\x54\x8e\xbf\x90\xca\xa6\x76\xdc\xf9\x48\x81\x3b\xfa\xcf\x91\x49\xe7\x71\x8d\x8d\x3e\x4a\x6f\x8e\xd1\xb1\xfa\x2a\xae\x52\xd4\xb4\xb4\x7e\xed\xb9\xa1\xeb\x37\xeb\x57\xf4\x9e\xa9\xce\xf8\xa2\xff\x6d\x46\x18\x34\xb4\x3f\x6b\x84\x91\x8c\x30\x05\x5a\x2b\xa6\x4b\xf8\x91\xbb\x9b\xcc\xd1\xeb\x26\xaf\x2a\xc2\x63\x8a\x5b\xe9\x5b\x64\x9e\xf5\x12\x7b\xfe\x95\x0d\x86\x85\xe2\xa7\xb2\x59\x79\x05\xf9\x52\x50\x2a\xd6\x29\xeb\xd7\x74\xbd\xd4\x86\xba\x2d\x82\x8f\x63\xe4\xde\x06\x6b\x96\x8c\x56\x5f\x0a\x69\x3a\x92\xfe\x8e\x25\x32\x6b\x7e\x2a\x5b\xb3\xc8\x46\xd8\x54\x5b\xed\xae\x54\x53\xc9\x5b\xf7\x87\xdd\x7c\x5e\x4c\xcc\xb8\x72\x5f\x9b\xf9\x28\xdd\x78\x8f\x45\x43\x5c\x3a\x1a\x6c\x62\x7b\x4e\x65\xb4\x5a\x48\x7f\xb6\x89\x9d\x88\x63\x1c\xf3\x59\x2f\x83\x9d\xce\xcd\xbd\x79\x9b\x54\x14\x2d\x13\x67\x01\x8e\xcb\xef\x9a\x48\x92\xc9\x03\x92\x30\xe2\x4e\x65\xb4\xc8\x46\x38\xe9\x01\x23\x4d\xac\x1d\x8f\xb5\x2b\x6e\x74\x94\xb3\x41\x9e\x12\x43\x40\xc4\x27\x05\xad\xdd\xf0\xc6\x2d\x36\xcd\xa4\x47\xc2\xff\x2f\xb2\xfc\xbb\x11\x06\x89\xe8\xa4\xcc\x47\x69\x8a\x51\x80\xba\x2d\x49\x3a\x12\x57\x6c\xec\xbd\x1b\x9b\x1d\xa9\x70\xdc\xa2\x3f\xff\x5e\x53\x56\xb6\xe7\x17\xf1\x4f\xd4\x46\xc4\x8c\x0f\xe2\xe0\x99\x6f\x1a\xa3\x6a\x8b\x74\xbf\xd6\x4c\xfb\xb9\xef\xcb\x8c\x90\x69\x82\x3b\x99\x5e\xbe\xda\x8d\x6b\x78\xb7\x49\x22\x0e\x02\xa5\xb2\xa0\xb3\x50\x20\x0e\x9e\xf9\xfc\x38\x5a\x3b\x6a\x33\x7c\xf1\x3d\x5d\x05\x72\xf7\x6f\x63\x47\x39\xfd\x30\xd6\xe9\x9d\xa0\xb0\xa1\x72\xdf\xcd\x39\x2b\xf3\xf4\x26\x22\x2e\x88\x83\x67\xbe\xbc\x28\x5b\xd9\xf6\xb3\x21\xef\x19\x27\xea\x31\x1e\xb8\x3a\x4e\x0c\x08\x95\x3f\x1b\xca\x38\x73\x2d\x12\x77\xec\xdd\x68\xac\x0f\x74\x16\x0a\xc4\x05\x48\x8a\xff\xf3\x53\x78\x3a\x75\xbb\x73\x7e\x3b\x9e\xd1\x83\xec\xaf\x21\x04\x22\x1d\xb4\x4e\x32\x5d\xb9\x8f\x9f\x0f\x2f\x5c\x0d\xb8\xea\x4f\xd8\x3b\x05\xd5\x08\x03\x38\xa8\x46\xf8\xef\x46\x18\xf4\x83\x3e\x49\x02\xe2\xd8\xde\xf7\xda\x79\x3f\x39\xdb\x9b\xdb\xcb\x76\x87\xce\x3c\x15\x0e\xab\x13\x1d\xfa\xe6\x76\x59\x46\x9a\xaf\x02\xbd\xe6\xd7\x43\xc4\xd0\x41\x1c\x5c\x02\x55\x78\x6f\x1b\xd6\x36\xab\x28\x63\x19\x3a\x9f\x73\xf8\xe8\x47\x4e\xf8\xaf\x8a\x56\x76\xdc\xbe\x6d\x72\x0e\x4b\xcd\xe9\x8a\xcb\x0c\x74\x75\x04\x80\x83\x4b\xe0\x43\x5c\xb9\x2d\x9a\x69\xe7\x1b\xcc\xf5\xfb\xa8\x23\x39\x9e\xe1\x38\x0d\x3c\xa5\x65\xd3\xeb\x46\x3b\xac\x37\xbe\x99\x56\x9d\x81\x16\x3f\x20\x0e\x2e\x01\x14\x12\x8c\xea\x1d\xe5\xde\xab\x1e\x47\xcb\x9f\xa4\x7c\xbd\x79\xa4\x30\x05\x87\x70\xd4\xbf\xae\xfc\xee\xcb\x61\xb3\x35\xe2\xbb\x84\x88\x0b\xe2\xe0\x12\x30\x36\xa6\x1f\x8c\x53\xac\x8f\xd9\x11\x11\xc2\x7f\xfd\x36\x69\x5c\xfa\x22\x3e\xe3\x3b\x77\x95\x14\x35\x8e\x4b\x2b\x9e\x69\x05\xed\x88\xc5\x0f\x88\x83\x6a\x03\xaf\xfc\x7d\x01\x0c\x9a\x5d\x4f\xd2\x00\x5a\x0f\x0d\x31\x61\x93\xee\xe0\x2f\xf3\x52\xea\xa4\x88\x91\xc8\x18\x9c\x51\xdb\x32\xa1\x97\x23\x24\x63\xdc\xaa\xc2\x22\x8b\x46\x88\xb1\x83\x38\xb8\x06\x34\x5e\xbe\xe2\x1a\xf5\x31\x1a\xd2\xbb\x68\xf8\xf2\x61\x69\x63\xd7\x80\xdc\xbd\x28\x72\x99\x47\x53\x54\xcc\xaa\xaf\x57\x45\xb8\xa1\x6e\xb1\x20\x0e\xae\x81\x37\x73\xb6\xdd\x6d\xee\xee\xc2\x76\xf8\x96\x9b\xd4\x99\xfb\x46\x2f\x45\xd5\x2d\x8a\xad\xfa\xba\x8e\x52\x32\x1a\xed\x32\xfd\xc4\x11\x71\x41\x1c\x5c\x03\x6d\x2a\xa1\x3b\x76\x68\xe7\xd3\x8b\xb5\xf0\xf3\x7f\xb5\x5e\xb8\x51\x12\x5b\xa0\x51\x75\xbd\x8a\x82\xc1\xe6\x4d\x9b\x8a\x56\x04\x0f\xf4\x5d\x10\xc0\xc1\x35\x50\xb3\x6a\x75\x55\xf4\xaa\x24\x46\x29\x5e\x69\x13\x9d\xc7\x02\x7a\x7c\xe9\xa5\x62\xe7\xdb\x2a\x99\xa5\xdd\xf8\xf8\xb6\x87\x9f\xa5\x11\x1a\x00\x71\x50\x6d\x20\xc0\x08\x83\x52\xdd\x49\x1a\x88\xbc\x90\x51\xcb\x28\x92\x76\x26\x80\x48\x60\x1d\xcb\x6c\xb4\xfd\xce\x88\xc4\x1a\xdb\x88\x2d\xa1\x38\x57\xf5\xd2\x9c\xfb\x1c\x74\xd2\x02\xc4\xc1\x35\xe0\x73\x8e\xd2\xcf\xdd\xc7\x79\x8f\xf1\x5b\x9e\xaf\x4f\xae\x99\xc6\x32\x59\xa5\x7f\xba\xfb\x0a\x41\x20\xcd\x88\x74\x75\xc1\x04\x3f\x74\x82\x03\xc0\xc1\x35\xa0\xff\xaa\xb8\x9d\x5f\xf4\x63\xec\xcc\x93\x3e\xa7\xee\x26\x2c\x6b\xe7\x64\x05\x5f\xb5\xca\x9a\x0e\x9d\x0b\x77\x59\x5a\x9a\x5f\x2e\x40\x3b\xb7\x00\x0e\xae\x01\x5f\xf3\x39\x7c\x4e\x6a\xb3\x67\xef\xdf\xa2\x6f\x26\xea\xa0\x73\x09\xbd\xbe\xed\x2c\xe7\x47\xca\x97\x90\x32\xb1\x15\x48\x59\x76\x1b\x3a\xc6\x0b\xe0\xe0\x1a\x68\xd6\x71\x3e\xdc\xda\xb9\x4e\x95\x19\x1f\xc8\xd5\x97\xc5\x96\x21\x58\x8b\xd5\xa8\x69\x1f\xb7\xe1\x8c\xf3\x95\x4a\xd0\x7c\x14\x6a\x98\x06\xe2\xa0\x79\x40\xeb\xef\x1a\x00\xad\x3b\x4e\xd2\x40\x31\xc7\xb0\xce\xfd\xba\x2d\x76\xb7\x77\x59\xcd\xb1\xbc\x83\x57\x62\x3a\x8a\x27\xad\x5a\x0e\x14\xcb\xf0\xdd\xde\xa7\x7e\xbd\x0a\xe5\x02\x10\x07\xd7\x40\x1b\x25\xa7\xc8\x22\x29\x9b\xf7\xfb\xc0\xc0\xba\xc8\xc0\x7a\x4d\x5c\x9f\x4f\xb4\xb2\x17\xd3\x70\x39\x46\xbf\x30\x49\xf7\x64\x3d\x85\x7e\x57\x00\x0e\xae\x01\xbb\x11\xca\x97\x57\xa3\x1d\x14\x2f\x5f\x8e\xa0\x9a\x2c\xe4\xd6\xb8\xfe\x26\xcd\x94\xf6\x20\x31\x7b\xd3\x35\x82\x8f\x21\xb6\xf1\x2b\xd4\xdc\x0e\xc0\xc1\x35\xa0\x7a\x8e\xf8\x25\xe1\x0b\x71\xeb\xd6\xe9\x63\x02\x37\x8b\xfb\x87\x39\x49\xb7\xda\xe6\xc3\xd2\x1e\x5f\xea\x11\x60\x10\x1f\xdf\x84\xca\x64\x40\x1c\x5c\x03\x42\xa5\x2f\x0b\x38\x75\xed\xdc\xaf\x0a\xbe\xe1\xa1\xe0\xf8\x2d\x42\x7a\x6f\xd1\x65\xb2\xa4\xec\xa2\x57\x41\xe1\xbc\x9f\x6f\x76\x0c\x42\x03\x20\x0e\x9a\x07\x00\x46\x18\x64\xa2\x4e\x36\xc2\x82\xed\x8c\x51\x58\x5b\x67\x0b\xb7\x53\xe5\x08\x76\x93\xcf\x0d\xdf\xf7\x99\xa0\xdc\x4a\xa1\xbe\xcc\x6f\xcf\x27\x52\x6f\x4d\x52\x84\x30\x95\x20\x0e\xd9\x08\x2f\x3c\x32\xc5\x58\x6f\x7a\xe1\x17\xf3\xe3\x9c\xa1\xe1\x85\x2f\x54\x89\xb4\x9b\x3f\x8c\xb8\x96\xdd\x8a\x19\xbb\xbd\x70\xb9\xcf\xa9\x20\x22\x83\x38\x64\x23\x2c\xf3\x5e\x67\x2a\xdb\x66\xb6\xb9\x5a\x57\xeb\xe9\x05\xe5\x2b\x02\x3c\x43\xdc\x04\xab\x56\x42\xd3\x8c\x06\x18\x23\xf6\xad\x95\xde\x88\xc8\x20\x0e\x39\xf2\xbf\xbe\xe0\x36\xed\x96\x32\x6d\xcd\x99\xe2\x0e\x2e\x55\xd5\xf2\x08\x3e\x8e\xb5\xe0\x8f\x3d\xd3\x09\xd6\x44\xf9\x38\x95\xd8\x84\xe6\x1f\x45\x0b\xff\x34\xc2\xae\xf5\xaf\xbc\x6e\x09\x92\x79\x04\xb3\xbc\x35\x51\xed\xdf\xdb\xbb\xf0\xac\x6e\xc0\x3e\x87\x93\x32\xd8\x33\x77\x87\x82\xc9\x49\xf6\x0f\x74\xe0\x36\x57\x40\xed\xae\x1f\x51\x39\x97\xfd\x20\x67\xb4\x84\x72\x98\x8e\xe5\xa8\x75\x59\x22\x13\xf1\x05\xa6\xb1\xf1\xdd\x27\xa4\xff\x6d\x46\x18\x34\xb4\x3f\x6b\x84\x91\x77\x84\x5f\xd0\xd7\x61\x36\xbf\xb9\xf9\xd4\x3c\xa6\x00\x37\x9b\x98\x11\xf5\x96\x0c\x21\xc6\xcd\x92\xb8\x7b\x79\xb4\xbb\x6f\xa8\xe7\x71\x4e\x65\xb3\x12\xd9\x08\x3b\x94\x8f\x6c\x2f\x34\x89\x0a\x27\x88\xa8\xad\xdf\xe6\xc1\xed\xf7\xf5\x1c\x6d\x76\x0a\xcd\x5a\xdf\x54\x8d\x3b\xfc\x5c\xfa\x95\xe0\x54\xb6\x66\x91\x8d\xf0\x8b\xc7\xad\x95\x83\x01\x32\x4a\xf7\xbd\x13\xa2\xf0\xc8\x2c\xec\xb6\x97\xeb\xf6\x83\xbd\xee\xf0\x37\x44\x74\x6b\xfe\x12\xa8\x73\x39\x95\xd1\x22\x1b\xe1\xa7\x52\x13\x9d\x49\x3f\xbe\x10\x89\xad\xb0\x4e\x3b\x70\x7f\x17\x23\x98\x8f\x1e\x9f\xaa\x20\xc7\x50\xe0\x73\x15\x90\x78\x69\x42\x7a\x2a\xa3\x45\x36\xc2\xd6\xcb\x43\x59\xc4\xab\x92\xfb\x2a\x5f\x0c\x95\x9f\x08\x25\x31\x93\x14\x1f\x7c\x34\x37\x2c\xe9\x3b\xc3\xc8\x12\x96\xd3\x3e\xf7\xe5\xf4\x76\x84\x01\x22\x3a\x29\xf3\x11\x54\x04\xe2\x98\xde\x5d\xa5\x21\xeb\x5c\x98\xb7\xee\x65\xba\x7f\x3e\xc1\xd2\xa5\x92\xbc\x76\xa7\xa8\xb5\x5d\xf2\x9a\x5c\x54\x10\x62\xc6\x07\x71\xf0\xcc\xf7\x96\xab\x31\x74\xcf\xdb\xe1\xfe\x1e\x67\x3b\xd7\xb6\x6e\x1c\x81\xaf\x7c\xec\x7d\x02\x0d\x54\xde\x88\x41\x8d\x49\x8f\x44\xa6\x47\x88\xb8\x20\x0e\x9e\xf9\xe6\x22\x36\x62\x7d\x9d\xbe\x2d\x2d\xf0\x3f\x73\x31\xf0\x36\x67\xe1\xe4\xe1\xfd\xb5\x9e\xa4\x44\xe0\xae\x7d\x17\x7d\xd8\x7c\x49\x16\x11\x17\xc4\xc1\x33\x5f\xab\xf7\x82\xd5\x1a\xc9\x07\x3d\x62\x5f\x27\xb3\x1c\x3a\x4e\x91\xfc\xfd\x0d\x1d\xed\xa2\x6a\x2d\xb5\x4e\xac\x05\x5e\x76\x6c\xa8\x3b\x06\x88\x83\xff\xbf\x2d\xef\x8b\x50\x76\xa3\xf2\x9e\x7d\x70\xaa\xf5\x34\xc8\xcf\x2c\x65\xb4\x7d\xbb\x98\x3c\xcd\x3a\xf2\x30\x8a\xce\x22\x6d\xcf\xf5\x22\xc2\x08\x83\x38\xa8\x46\xf8\xef\x46\x18\xf4\x83\x3e\x49\x02\xb2\x21\xcf\x57\x87\x67\x68\xb4\xb0\x08\xe5\xfa\x5b\xdd\x6d\xb8\x15\x63\x7d\xc9\x2e\x8f\x62\xf9\x3d\xfa\x36\x5a\x27\x8a\x35\x0d\xdd\xd7\x09\xe2\xe0\x12\x78\x68\xec\xc6\x9e\x75\xd7\xa9\xa9\xbd\xf3\xce\xf7\xc4\x6a\x3b\xf5\xf7\x8e\x2a\x8d\xcf\x1d\xc5\x71\x1c\x39\xb0\xae\x7d\xe7\x3d\x9f\x85\x88\x0b\xe2\xe0\x8f\x74\xba\x07\xe5\xac\xdb\xb5\xe3\x17\x74\xde\x83\xb1\xa1\x6c\x17\x3f\xe5\x35\x3a\x5e\x33\xd3\x4b\x36\x28\x63\xe6\x76\x19\x6a\x24\xf5\x80\xbe\xb1\x00\x38\xb8\x04\xe8\x63\x4a\x3a\x54\xf0\x17\xdd\x87\x42\x79\x7f\x28\x99\xc8\x3a\x08\xb6\x26\x15\xad\xf4\x3b\xa0\x51\xef\x5c\x34\xe5\x15\x5d\x81\xbe\x85\x80\x38\xf8\xff\x7b\xfb\x33\xbb\x7d\xb8\x28\x66\x4f\x9a\xf4\xd2\xac\xc5\x2b\xb6\x8a\xef\x97\x75\xe4\x3d\xbd\x48\xbc\x2e\x92\x8f\xb7\x87\x8e\x49\x58\x22\x16\x3f\x20\x0e\xaa\x0d\x04\x18\x61\xd0\xec\x7a\x92\x06\x6c\xc3\xb3\x0d\x3a\x22\x2e\x0c\xa7\xf3\x2b\xdd\x6b\xff\x10\xd5\x67\x78\xef\xd2\xb8\xc7\xa1\xd6\x90\xe4\x99\xd2\x28\xb9\x49\x1d\xa8\x36\x10\xc4\xc1\x35\xb0\x58\xa0\xd7\x96\x16\xdd\xaa\x5b\x8a\xa7\x64\x5f\x48\xd5\xaf\x98\x71\xe3\x5a\xe1\x93\x63\xc6\x8e\xf2\xa5\x97\xe7\x9f\x7c\x78\x41\x8b\x88\x0b\xe2\xe0\xcf\x94\x26\xbd\x2b\x73\xac\xff\x16\x0d\xaf\x23\x39\xb1\xe6\x88\xd9\x83\x3b\xcf\xea\x7e\x9f\x65\xcb\x5f\xd0\x4b\x44\xed\x5b\x33\x2b\x52\x42\xc4\x05\x71\x70\x0d\x84\x4e\x8f\xf1\xa2\x85\xd9\xa5\xbb\xf1\xbe\x4c\x2a\xb4\x67\xa2\x98\x72\x18\x79\xf7\xc6\xe8\x29\x11\x89\xf5\xdd\x84\xa4\x92\x79\x1a\x44\x5c\x10\x07\xff\x7f\x2f\x75\x0a\x1b\xd5\x26\x0d\x5b\x47\xb0\x8b\x64\x5c\x13\x28\x9c\x51\xee\x3e\x58\x13\x5d\xf3\x4b\xff\x8e\xa1\xe3\x2e\x18\xd0\xe1\x84\xd0\x00\x88\x83\x6a\x03\x01\x46\x18\x94\xea\x4e\xd2\xc0\x81\x3a\x7d\xee\x42\xc1\xa3\xb4\xce\x88\x61\xc3\xac\x95\xa2\xd5\x5b\x8a\x9d\xd5\x8c\x7b\x3b\x83\x36\x4e\x62\xb4\x9d\xcc\x62\x50\x7f\x43\x10\x07\xd7\xc0\x9e\xab\x47\xba\xbf\x06\xb5\x6c\x8c\x1c\x1e\xab\xab\xec\xed\x91\x64\x5b\x7d\x26\xfd\x2f\xea\x24\x2f\x32\x3c\x0e\x3f\xb9\xda\xf9\x40\x25\x07\x00\x0e\xfe\x4c\x7d\x3d\xbf\x05\x94\xab\x61\x5d\xaf\x6a\x0b\xe1\x88\xcc\x95\x4f\x73\x08\x10\xff\x45\x7c\xbb\x3d\xa9\x96\xb5\x06\xe5\xcc\xc1\x11\x54\xcf\x0d\xe2\xe0\x1a\x70\x4a\x90\xac\xb9\x40\x39\x6e\xc4\xc3\x33\xf5\x65\x44\x93\x5f\x78\xdd\xd6\xbb\x49\x70\x60\xe9\xd3\xb4\x98\x85\xac\x30\x43\x75\x28\x22\x2e\x88\x83\xff\xbf\x52\xb4\xe6\x71\xf9\xfb\x99\x56\xfa\xc5\x75\x0e\x0c\x89\x53\xfd\x25\xba\x38\xf9\xfc\x2c\xbf\x35\x1d\x8b\x4c\xf8\xa3\x8a\xa9\xc2\x10\x1a\x00\x71\xd0\x3c\x00\x30\xc2\xa0\x75\xc7\x49\x1a\xa8\x57\x4b\xa4\x0e\xe8\xa5\x71\x72\x0c\x1b\xb0\xed\x4e\xf4\x13\x6a\x8d\xba\x4e\x20\x69\x9a\x97\xeb\x9e\x53\x88\xbb\xf9\x3c\x17\xfa\x2e\x0e\xe2\x90\x4a\x24\x52\xa8\x25\xa3\x9e\xe4\x2f\x67\x35\xe5\x04\x3a\x4f\x91\x11\xe8\x62\x3c\x19\x3a\xce\x71\xba\x95\x7b\x23\x29\x3b\xbe\xf0\xc0\x16\x9a\x5f\x00\x1c\xfc\x99\x3e\xc4\xe5\xf3\xc8\xd6\xec\xf2\xd8\x90\x5e\xf3\x4d\x37\x5c\xcd\xca\xdf\x70\x60\x30\x73\xf1\xbf\xe8\xba\xd4\xfd\xc6\x9e\x1a\x07\xfa\xd0\x06\xe2\xe0\x1a\xe0\x5a\x1e\x08\xfd\xb9\xa8\x6b\xa1\x99\xe6\x25\xfa\x3d\xb1\x90\xf6\x97\x45\xc3\xf3\x49\xdd\x2f\x46\xf7\xbf\x6c\xa3\xa8\xde\x4a\x80\xca\x85\x40\x1c\xfc\xff\x95\xb9\xc8\x7b\x30\x4c\x3c\xa1\xd1\x21\x7e\xd4\xb4\x7f\x18\xd1\x5c\x23\x1f\x25\x82\xfb\xbb\xb3\xef\xb6\x19\x2d\xe7\xa3\x67\x59\x99\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\x90\x89\x3a\xd9\x08\x1f\x25\x3b\xc7\xf2\xb4\xf6\x0d\x7b\x7e\x7a\x3c\x62\x5b\x2b\xb9\x4e\xb6\xc1\xde\x80\x8a\x5b\x3b\x9d\x2b\xaf\xc9\xaf\xb6\x7f\x73\x05\x61\x2a\x41\x1c\xb2\x11\xb6\x7f\x64\x42\x77\xee\x81\xa9\x59\xec\xb6\x55\xda\x8d\xe6\xe0\x3d\x5a\xeb\x7a\x81\x85\x46\xc9\xc5\x56\xda\xe4\xdd\x15\xd1\xb4\x1c\x44\x64\x10\x87\x6c\x57\x1d\x1e\x6a\xac\x70\xbc\x99\xc6\x57\xfa\x51\xed\x60\xde\x4c\x15\xb9\x79\x9b\x3b\xfb\x91\x52\xfb\xcf\xaa\x0f\x96\xb5\x98\x2c\x7e\x4e\x88\xc8\x20\x2e\x40\x1a\x85\xfe\x9f\x91\xff\xf5\x3d\xc2\xdd\x22\x62\xf6\xc1\x31\xae\xd5\xc7\x89\x76\xc6\x49\x64\x86\x55\x93\xfa\x5e\x71\xc6\xbf\x05\x66\xb1\x12\x26\x7b\x13\xd4\xf7\xff\x71\x7d\xd2\x76\x78\xe6\x19\x43\xe2\x4c\xaf\xb5\x4b\xdf\x66\x5a\xb1\xb9\x74\x8e\x1a\xf5\x3f\xd7\xde\x65\x5d\xa3\x73\xd0\x2b\x6e\xd2\x79\xe6\xfe\xe7\x6e\xe5\xa5\x94\xb4\xb7\xd3\xe4\x86\x69\x58\xac\x1e\x5c\x04\xbf\x22\x7f\xb2\xbe\xa1\x11\x44\xc1\x13\xbf\x47\x25\x2b\xcc\xf8\x94\x24\xf5\xbf\xcd\x08\x83\x86\xf6\x67\x8d\xb0\x2c\xdc\x2c\x45\xee\x5b\x26\x71\xb1\x72\x19\xfc\xf8\x6d\x3b\xdf\x94\x82\xb1\x88\x45\xcc\x65\xfc\xe2\x4c\x68\x5c\x51\xa0\xff\x75\x1f\x02\x9d\xb0\x53\xd9\xac\x44\x36\xc2\xcd\xb7\xee\xdd\xcf\x60\x33\xf2\x89\x54\x37\x29\x78\x16\x5b\x80\xd3\x3a\xb4\xf6\xd2\xae\x59\xf2\x07\x7f\x8b\x9f\x4e\x79\xd4\x08\xd5\xa9\x6c\xcd\x8a\x22\xfd\x59\x9c\x3b\x55\x19\xce\x5f\x1a\xd9\x12\x3f\x1c\x0b\x9e\x1d\x96\xb7\x41\xed\x15\x0c\x0b\x17\x79\x23\x69\x18\x3d\x2e\x84\x7d\x5d\xa8\xfb\x54\x46\x7b\xc2\x8e\x30\xc9\x4c\xe0\xec\x3d\xc6\xac\xcc\x09\x8c\xe3\x6b\x63\xaf\x48\x3b\xa2\xcf\xb0\xcf\xe6\x2a\xe0\xb6\x6e\xd2\x59\x60\xdb\x2f\xdc\x3e\x95\xd1\x3a\x21\xfd\x59\x8a\x4d\x5f\xee\x91\x37\x81\x78\x03\x6b\x2b\x19\x23\x84\x78\x44\x8f\x51\xe6\xdd\x4d\x1b\x8b\x0a\xc9\x38\x97\xa2\x85\xef\x8f\x9c\xc2\x68\x75\xfe\x9d\x88\x4e\xca\x7c\x4d\x37\x0d\x6f\x79\x62\xcf\x2c\x5b\x3c\x28\x26\x4a\x65\x58\xfb\xb4\x6e\xe9\x43\x7a\xe9\x1d\x5a\x35\xbe\x57\xa3\x6c\x01\xbb\x31\x94\x49\x40\x1c\x3c\xf3\x29\x66\x29\xa2\x0a\x6e\xaf\xfd\xce\xbf\x75\x35\x88\x6c\x03\xf5\x99\x4a\x02\x1b\x29\xda\xb9\x24\x0d\x3d\xbb\x0b\xa1\x09\x2b\xf1\x4c\x88\xb8\x20\x0e\x9e\x49\x8c\xe6\xc6\x42\x54\x85\xa3\xad\xc8\xc2\x2c\xb1\xa3\xee\xd3\x8e\xf7\xa0\xb4\x73\x13\x15\x4d\x2d\x4e\x66\xa0\x51\xb6\x0b\xdd\x09\x47\xc4\x05\x71\xf0\xcc\x47\x34\xbf\x1c\x77\x6c\x32\x2e\x68\x99\x1d\xe3\xc4\xa4\xa2\xe1\xfa\x70\xee\x5a\x88\xcf\xf6\xde\x4f\xaa\xb5\xd7\xd3\x25\x65\xba\x90\x13\x00\x71\xf0\xb8\x42\xce\x23\x72\x3e\xfb\xe1\xbe\x8f\x73\xf8\x2e\x7e\x52\x38\x5e\x7b\xeb\x13\xff\x76\x69\x91\x4f\x1c\xc5\x36\xbd\x4c\xb2\x26\x69\x07\x61\x84\x41\x1c\x54\x23\x2c\xfb\xd7\xc5\x0f\xe8\x07\x7d\x92\x04\x8e\x2b\x7b\xc6\xaf\x56\xb7\xd2\xcf\x0a\x33\xb9\x66\x39\xe2\x4b\xbf\x77\xe7\x65\x53\x4a\xaf\x94\x88\xfe\x4e\x73\xce\x5c\xd7\x0a\x6a\x98\x0d\xe2\xe0\x12\xa0\x1a\x16\x8b\x77\xd3\xe4\x1b\x7d\xb2\x7e\xb6\x39\x0d\x97\xfb\x55\xb1\xa0\xa0\x45\x02\x57\x57\x71\x47\x45\x42\xf8\x6a\xf7\xef\x57\x88\xb8\x20\x0e\x2e\x81\x56\x27\x6a\xd1\x48\xbd\xdf\xfe\x3f\x3f\x30\x3c\x1d\xf4\x17\x51\x7c\x6d\x8a\x39\xdb\xe3\xd0\x8a\x1a\x6f\xef\x65\xd8\x60\x9d\x69\x09\x7d\xb3\x00\x70\xf0\x57\x55\x35\x19\x95\x19\xfd\xf5\xa5\xaf\xfb\x34\x91\x97\xfa\x27\xda\x87\x56\x53\x1f\x44\xf9\xb8\xda\xd1\x42\x6c\xe7\xbd\x3f\x60\xf1\x42\x1d\x48\x41\x1c\x3c\xae\xde\x87\x47\xbf\xcc\xb0\x83\x25\x3e\x87\x2d\xeb\x39\x4f\x58\x8d\xf5\xcd\x56\xed\xab\x57\xa3\x8b\x6b\x3e\x0a\x88\x24\x60\x55\x5c\x42\x2c\x7e\x40\x1c\x54\x1b\x08\x30\xc2\xa0\xd9\xf5\x24\x0d\x9c\x4f\x68\x93\xf2\x44\xab\xc1\x7c\x20\xfe\xe9\x51\x95\xb2\xb5\x47\xe6\xfe\xea\xb9\xd7\x4f\xf9\x6d\x3e\x95\x53\x54\xbd\xbb\x7a\x53\x1d\x31\x76\x10\x87\xd4\x35\x7a\x84\x30\xbe\x95\xd8\xf1\xd7\xa3\xcd\x6e\x2d\x8b\x85\x8d\xe1\x07\x93\xb6\x3d\x57\x59\x48\x8e\xab\x7b\x27\x77\xd9\xb8\xbb\x6c\xa0\x9a\x5b\x00\x07\xd7\xc0\x6e\x9a\xf1\xb9\x2b\x9e\xf6\x29\xef\xa5\x1e\xd6\xed\xb5\xa5\xee\xf4\xb5\x57\xb9\xd8\x2c\xf1\x95\x38\x12\x8d\xa7\x75\xfd\xfc\x0d\x4d\x2f\x20\x0e\xfe\xae\x74\x27\x18\x6d\x26\x2f\x0f\x7d\xfb\xd6\xe8\xe5\xc3\x92\xd7\x48\xe2\xaa\xc3\x17\xd5\xf0\xa4\x83\xee\x90\x23\xa4\x3e\xd4\x77\x0a\x2a\x13\x00\x71\xf0\xb8\x2c\x62\x9d\xe2\xe8\x14\x91\xfc\x91\x99\x0d\x03\x73\xc2\xb9\x72\x85\xe6\x56\xf9\xfa\x24\xce\x69\x9c\x2f\x7d\x5d\xb9\x29\x19\x6b\x10\x1a\x00\x71\x50\x6d\xa0\x28\x60\x47\x18\x90\xea\x4e\xd2\x40\x5e\x96\x9e\x88\xc1\x63\x26\xeb\x23\x12\x22\x9c\x0b\x0d\x26\x3d\xc2\xef\x92\x8f\xcd\x2f\x0a\x4a\x7e\x79\x15\x70\xb6\xde\xda\xa2\x19\x3a\x14\x03\xe0\x90\x8e\x46\xf3\xc4\xa3\xd3\xdc\xb5\x50\x0f\xe2\x6c\x4c\x56\x3e\x17\x29\xc4\xf8\x9e\x12\xdf\xc0\x4f\xcf\xa0\xc2\xe1\x67\x24\xe3\xd5\x1e\xe8\xf7\x0a\xe2\xe0\x1a\xd8\x92\xd5\x97\x45\x7d\x2c\x79\x93\xe0\xa9\x87\xae\xa6\x1f\x95\x7e\xbb\xeb\x75\x49\x5a\xc5\x51\xfe\x2c\x07\x9b\xe4\x97\xd8\x29\x3f\x10\x71\x41\x1c\xd2\x94\xcd\x42\x7e\x33\x0b\xf7\x07\x8b\xa2\x94\xc9\x5d\x03\x22\xe1\x15\xca\xe9\xbe\x22\x2c\x22\x4a\x6b\x1d\x73\x2b\x65\xae\x5a\x41\xe8\x22\x05\x10\x07\x8f\xfb\xbd\x78\x7b\x24\xa8\x56\xdc\xa6\xcf\xda\x57\x7a\x35\x61\x99\xd7\xe5\xbb\xff\xb2\xf5\xf3\xcd\xa7\x1d\x9f\x49\xdc\xdf\x3d\x42\xd9\x42\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\xd6\x1d\x27\x69\xa0\xd7\xac\xec\x98\xe6\x80\xe7\xfc\x2f\xc9\x27\x8f\x8b\xa2\x75\xb2\x5e\x08\x56\xbc\x28\xdd\xa5\xae\xf1\xa7\x88\xd7\xef\x09\x51\x4a\x43\x8c\x1d\xc4\xc1\x35\xd0\xb7\xd2\xb9\xc3\xc2\x25\xe4\xe6\x3a\x60\xa9\xf8\x35\x72\x8f\xa5\x4e\x10\x97\x7f\xb3\x72\x84\x53\x3e\x87\x66\x1b\xc3\x4b\x18\xda\x69\x06\x71\x70\x0d\x04\xa5\xf4\x90\x13\x48\x52\xad\x04\xec\x89\x3d\x2f\x33\xba\x41\xe8\xbd\x27\x5b\x58\x8c\x2e\xfa\x68\xba\xb5\x41\xf2\x71\xb3\x2a\x3d\x22\x2e\x88\x83\xbf\xab\xc9\x10\xe5\x00\x8e\xa0\xfb\xd2\x18\x07\x8f\xce\xab\x4b\x5f\x31\xb8\x70\xf9\x53\xdc\xf8\x51\xe6\xe4\xf5\xcd\x8c\x59\x1b\xa7\x03\xe8\x3e\x71\x10\x07\x8f\x3b\xde\x62\x58\xb1\x76\xf1\xb3\xb9\xab\xbe\x5d\xaa\x4f\x79\xbf\x37\xa6\x93\x02\xcf\x1d\xf2\x59\xdf\xab\xd6\xe9\x67\xb1\xe6\x3a\x79\x10\x1a\x00\x71\xd0\x3c\xe0\xf4\x77\x23\x0c\x32\x51\x27\x1b\xe1\xe6\x91\x60\xd3\x0d\x9c\xca\xc0\xa5\x8a\xb5\xa1\xe7\x32\xe3\x53\x04\x5c\x1e\xb7\xa7\x0f\x4c\xb6\x0e\xf5\xd4\x9e\x54\x35\x5c\xb2\x47\x98\x4a\x10\x77\xc2\xf5\x49\x15\x3b\x09\x86\x89\x8e\x35\x2f\xad\x5e\xce\x46\xd1\xe4\x4a\x78\x58\x8a\x7c\x4b\x4a\x53\x8b\xfa\xb1\x11\xdf\x87\x2d\x5b\x26\x01\x5d\x9f\x04\xe0\x90\x8d\x30\xb1\x45\xee\xc3\x8b\xfa\x77\xda\x85\x3f\x69\x6b\x07\xe8\xd7\x29\x69\x33\x8c\xb5\x9f\xbd\x1d\xe7\xb6\xeb\x3f\x71\x70\x37\xdc\x61\x12\x11\x19\xc4\x05\x48\xff\xe7\x49\xfe\x63\x89\xfc\x6f\xef\x11\x4e\xc7\x57\xc2\xec\x5f\x1a\x21\xba\xe2\xe6\x9d\x7e\x73\xce\xb1\x4d\xea\xc6\xeb\x40\x8d\x8f\xc2\x13\xe1\xdd\xfe\x72\xa9\x25\x6e\xc7\x7f\xba\xb8\x8b\x43\x9e\xf4\x57\xe6\x5f\xa9\x26\xb5\x4b\xbc\x28\xbb\xcd\xeb\x8a\x93\x83\x27\xc0\x3d\xc7\x87\x79\x1c\x7b\x5b\x96\xaf\x6b\xe8\xdb\x1f\xa8\x5b\x87\x64\xd7\xf8\x6a\xcd\x85\x02\x35\xec\xe4\x2f\x53\xa9\x33\xd5\x35\x93\xb2\xb7\x1a\xf5\x8e\x15\xb1\x2a\x30\xf7\xd0\x12\x4c\xff\xdb\x8c\x30\x68\x68\x7f\xd6\x08\x23\x19\x61\x12\xcb\xe7\xbd\xf6\xbc\x44\x8e\x29\x92\xfb\x67\x98\x4d\x7b\x1b\x2e\x38\x4b\xa9\xc9\x77\x79\x7d\x95\x92\xc5\x52\x94\x36\xc4\xa1\x3e\x95\xcd\x4a\x64\x23\xfc\xb4\x82\xe0\x1a\x21\x7b\xb4\xc4\xfa\x16\x63\xcc\xb3\xf9\xcf\x31\xd9\x5b\x67\x1c\x46\x85\x29\xae\x92\x92\x4a\x17\x07\x9e\x89\xdd\x3e\x95\xad\x59\x64\x23\xac\x17\x9c\xe5\x84\x4b\xa8\x95\x3a\xe1\xbc\xe6\x2c\xe2\x5b\x49\xc0\x22\xf4\x65\xb7\x32\x86\x25\xc6\xbd\xd0\x45\x89\xcb\x93\xfe\xde\xa9\x8c\x16\xd9\x08\xab\x93\xc7\xd6\x67\xf8\xf1\x9c\x5f\x98\xbb\x89\x61\xba\xb7\xa6\xf4\x24\x43\xf5\x60\x5f\x93\x4e\xe1\xf3\xe7\x3c\x11\x23\x14\x06\xee\x53\x19\x2d\xb2\x11\xe6\x12\xa9\xb0\xd1\xc8\x17\x0f\x6e\x7b\xc8\x7a\xc7\x7a\x3f\xa8\x5b\xf0\xa2\xe1\x37\x47\x69\xbd\xb5\x0e\x0a\x45\xea\x57\x9f\x7e\xbf\x3e\x35\x23\x0c\x12\xd1\x49\x99\x0f\xbf\xc3\xe9\xbc\xc3\x15\x9e\xeb\xea\xcf\xae\x61\x55\x47\xbe\x22\x30\xb0\x24\xe0\x76\x1e\xc0\xd1\x61\xaa\x7e\x9a\x3e\x12\xba\x04\x6d\x81\x80\x38\xa4\xf3\x70\x68\xa8\x8e\x03\x4d\x93\x79\x14\xb1\xfc\xc3\xda\x01\x89\x53\xda\x8a\xe1\x8f\xf5\x8f\x65\x02\x0d\xce\xde\x35\x62\xfe\x32\x38\x0d\x9d\x87\x03\x70\xf0\xcc\x27\xba\x5d\x42\x42\xb9\x4d\xf6\xab\x2f\xf5\xde\x85\xb4\xb2\x54\x75\x81\xb5\xf1\x36\xa2\x97\xf8\x34\x23\x2f\x84\x34\xa3\x9c\x47\x9a\xa0\xae\x1b\x00\x0e\xde\xc5\xa2\xc4\xf0\x37\xf5\xd5\xfe\x2f\x59\xcd\x26\xc5\x97\x0b\xcb\xd2\x3b\x13\x1d\xdd\x8e\xd0\xe3\x32\x5b\x52\x5f\x76\x0c\x65\xe8\x6f\x2a\x23\xe2\x82\x38\xf8\xf3\x15\x76\xcd\xbc\x18\x65\x73\xd4\x86\xba\x8f\x41\xd0\xe7\x1e\x9e\x97\x82\x9a\xf2\xe3\xce\xeb\x90\x44\x2d\x9e\x4d\xe5\x9f\xe7\x02\xd8\x11\x46\x18\xc4\x41\x35\xc2\x7f\x37\xc2\xa0\x1f\xf4\x49\x12\xf8\x6c\x85\x6d\xf2\xfc\xe6\x32\x6b\xe9\xc3\x2b\xb9\x1e\x25\xf5\x17\x6f\xde\x70\xe5\xbd\x7c\x9b\xbb\x28\x8e\x45\xed\x7e\xc1\xa1\xc4\x00\x62\xe8\x20\x0e\x2e\x81\x82\x42\x8d\x87\xbf\x27\xdc\x94\x8d\xc3\x3f\x0b\x55\xfa\x33\xec\x24\xc9\x54\x1d\xe1\xb4\xf6\xb5\x3e\xde\xcc\x92\xc6\xee\xb4\x80\xae\xcc\x00\x71\x70\x09\xa8\xce\x75\xea\xb8\xe0\xa4\xaf\x60\x18\xdf\x94\xfa\xde\x60\x94\x77\x86\xfb\x5a\xb0\x56\x5c\xce\xfe\x2f\x33\x91\x1b\xc7\xac\x82\xd0\xbd\xc7\x20\x0e\x2e\x81\x0f\xa8\xb8\xb7\x8a\xa5\x0a\xfd\x64\x4c\x45\xf0\xcc\x6e\x34\x8e\xde\xb9\x21\x17\x98\x12\x9d\xd3\x4c\x4d\xf8\x7d\xe9\x90\x64\xd3\x0c\x3a\x72\x0d\xe0\xe0\xcf\xf7\x31\x56\xc5\x23\x21\x91\x76\xea\xa2\x2a\x69\xd5\x76\xb5\xb3\x28\xba\x17\x43\xf4\xa9\x6f\xe1\xf4\x6a\x2a\xad\x97\x09\x53\x3f\xde\x47\x2c\x7e\x40\x1c\x54\x1b\x08\x30\xc2\xa0\xd9\xf5\x24\x0d\x6c\x71\xd2\x97\xf0\x10\x53\xbc\x62\x34\x95\x73\xdc\xd6\x5a\x2d\xe0\xcf\xc7\xbb\xbc\x50\x77\xe0\xec\xc3\x75\xed\x27\x3a\x76\xb6\x20\x64\x2a\x00\x1c\x5c\x03\xdb\x98\xad\x95\x42\xb6\x3a\x69\x6d\x8b\x3a\xee\x1e\xdc\xe9\x0b\x8c\xd7\x53\x96\x02\xdf\xe4\xe6\x5c\xff\xb5\x87\x6a\x52\x7f\x06\xfa\xb8\x00\xe2\xe0\x1a\x68\x7f\x7a\x24\xd9\x2d\x23\x78\xbb\x3a\xb5\x21\xfd\xf6\x22\x8d\x92\x5c\xf2\x8a\x2a\xc9\x4a\xbc\xb9\x40\x66\x54\xed\xd2\x11\x0e\x54\xcb\x0b\xe2\xe0\x1a\xb0\x1f\xf4\x4f\x0b\x4d\xd1\xbf\x6a\xa4\xad\xb2\xf7\xc0\xc7\x3f\x25\x29\xf6\x7b\xde\xdb\x47\x3a\x23\xd5\xef\xbf\x0e\x84\x5c\xa6\x87\x9a\x86\x81\x38\xf8\xf3\x5d\xcd\x98\xaf\x09\xbb\x3a\xe0\xfa\x24\x38\x6c\x6c\xa7\x58\xb2\xee\x11\xf5\x4c\xe3\xf9\x06\x59\xc5\xee\x79\xe7\xd4\x34\xdd\xce\x79\x84\x06\x40\x1c\x54\x1b\x08\x30\xc2\xa0\x54\x77\x92\x06\xda\xb9\xc6\x38\x37\x14\xf9\xf3\x3f\xc5\x9f\x3b\x93\x5c\xef\x79\x33\x69\x23\xf0\x1a\x5e\xc2\x8b\x97\xd1\x49\x46\xdd\xa9\x42\xf2\xd0\x91\x60\x10\x07\xd7\xc0\x96\x54\x04\x3a\x93\x33\x2d\x79\xec\xbe\x89\x89\x1e\xe6\xd4\x59\x42\x75\xb2\xcd\x2e\x1a\x31\x57\x23\xae\x1d\x87\x36\xeb\x0d\xe8\xdb\x25\x88\x83\x6b\x80\x7e\xc0\xc9\xeb\x39\xc9\xf0\xe7\x14\x2e\x32\x9c\x2f\x57\x52\x64\x02\x1c\x19\x89\x39\xb6\xec\x9e\xcb\x1d\xfe\x7a\xfd\xe1\x49\x0f\x54\xc7\x09\xe2\xe0\x1a\x30\xe8\x3a\x48\xd7\x45\x2b\x4f\x77\x60\x2d\x20\x39\xb6\xef\x28\x41\x59\xd9\xee\x7f\xb6\xdb\x74\x6e\x87\x5a\x5d\xe6\x38\x4e\xaa\x10\x11\x17\xc4\xc1\x9f\xaf\x3f\x09\xe1\xb3\x5c\x9e\xcd\x2b\x91\xf8\x39\x8d\xe8\xe7\xbb\x7f\x88\xdb\x2c\xc8\xca\x2e\x86\xc7\x15\xbf\xc1\x13\x1d\xb1\xe6\xc2\x46\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\xd6\x1d\x27\x69\xe0\x65\xfc\xb1\x73\x7e\xee\x57\xe3\x9d\x97\x65\x06\x85\xc7\xba\x3d\x5f\xdb\x34\xec\xb9\x54\xb1\xa9\x4b\x7a\xee\xe3\xf4\x8d\xbc\xea\x87\xea\xae\x01\x1c\x5c\x03\xd7\xac\x65\xba\xd0\x2b\xc9\xb0\x5f\xdc\xfa\x3a\xc2\xe7\xbd\xf4\x91\xdc\x7d\x42\xd5\x24\x90\x9f\xab\x85\xed\xbe\xd5\xc0\xe8\xaf\x31\x44\x5c\x10\x07\xd7\x40\x6d\x5e\xad\x4d\x50\xfe\x18\xd3\xe7\x90\xb1\x73\x8c\xd4\x99\x83\x5f\xa9\x85\xaf\x52\xff\x6c\x5c\x1c\x94\x8c\x99\x54\x13\xe3\x7b\x07\x75\xb9\x06\x70\x70\x0d\xac\x72\xdc\x1a\x7d\xc3\x8e\x17\x2b\xbf\x1b\xd4\xac\x8c\x63\x4f\xfa\xcd\xa2\x76\x10\xcb\x6b\x6b\x62\x94\xe8\x99\x43\xd9\x97\x4b\x50\x33\x3e\x10\x07\x7f\xbe\xa4\x83\xcc\x37\x0d\x3c\xdd\x54\xc5\x9a\xad\x05\x7f\xbd\xb8\xc6\x79\x2e\xbb\xe4\x31\x16\x76\x7a\x9c\xea\x87\x3b\x73\x8d\xc6\x45\x9c\x08\x0d\x80\x38\x68\x1e\x00\x18\x61\x90\x89\x3a\xd9\x08\x0f\xbb\x0c\xd3\x33\x9a\x84\x57\xff\xce\xdd\x98\x88\xbe\x34\xc4\xc5\x8a\x65\xab\x7b\xf6\xc1\xd7\xf7\xb9\xea\xde\x6a\x28\xb8\xd8\xf7\x11\xa6\x12\xc4\x21\x1b\xe1\x7c\x73\xdc\x8d\xe2\x07\xc7\x4a\x55\x5d\x41\x0f\x6d\xe5\x7c\x67\xeb\x9b\x3d\x73\xad\xef\x7a\x9d\x47\xe9\x8e\xbc\xfe\x0d\xa7\x28\x16\xba\x98\x09\xc0\x21\x1b\xe1\x2e\x91\xcb\x79\xda\xba\xdd\xfc\x7e\x43\x9f\x74\x58\x98\x5f\x72\x69\x74\x5d\xb9\xb7\x55\x71\x2f\xf2\x22\x5b\xbf\xa1\x0d\x5e\x33\x3b\x22\x32\x88\x0b\x90\x46\x41\x41\xfd\x47\xe4\x7f\x7d\x8f\xb0\x6c\xa0\x11\xaf\xd9\x9e\x61\x57\xb7\xc4\x95\xa2\x29\xee\x45\x0b\x56\xcf\xe5\x5a\xf9\x07\xbb\x5f\x92\xea\xfa\xb4\xbb\x03\xb3\xa3\xff\x34\xc2\x4e\x4b\x6b\xa9\x4b\xe9\x9e\x94\x2c\x6a\x1e\x14\x26\x8e\x54\xc3\xa2\x33\x53\x1f\xb4\xc5\x7d\x1e\x31\x63\x6e\x63\xe4\x18\xe5\xfd\x79\x83\xcd\x02\x66\xff\x27\x56\x2c\x91\x2f\xec\xdd\xee\xc7\xb7\xba\x07\x06\xf4\xf0\x59\xbd\x6c\x72\x03\x7e\x4a\xce\xa7\xb7\x90\x48\x61\xf6\xfc\xb7\x19\x61\xd0\xd0\xfe\xac\x11\x46\x32\xc2\x1c\xde\x1a\x36\x66\x89\x6d\x3b\x63\x56\x76\x59\xe4\x76\xad\xef\x84\xed\xcd\x15\x79\x0c\xe6\x5d\x0d\x92\x68\x5a\x7c\xa9\xd0\x7e\x9e\xca\x66\x25\x1f\x92\x47\x1b\xa2\xd5\x5f\xc6\x3a\x3b\x20\xed\x5c\xc6\xfc\x95\x7f\xce\xad\xde\xae\x83\x3c\x56\xe7\xb2\x48\x88\x5c\xb8\xc8\xd6\x64\xab\xff\xb3\x53\xd9\x9a\x45\x36\xc2\x72\xd8\xf6\x0b\xb7\x54\x68\x9b\xd9\xf1\x18\xe9\x50\x39\xe2\x5b\xcf\x7a\xbe\x1d\x1a\x3b\xd4\xb9\x90\x52\x27\x27\x95\x3a\xb0\xe2\x70\x2a\xa3\xd5\x46\xfa\xb3\x22\x9c\x64\x3c\xa5\x37\x9c\xbc\x31\xdb\x6e\x58\x8d\xdc\x09\x0c\xe9\x7a\xc9\x24\x72\x41\x68\x99\xdf\xe2\x72\x49\xa6\x48\x09\xda\xee\xa9\x8c\x16\xd9\x08\x5f\xf3\xb7\x58\x6d\xed\x99\xcc\x19\x32\xfc\xc2\x1b\xea\x55\x29\x44\xeb\x40\xe6\x72\xa6\xba\xc9\x8d\xca\x22\xb4\x2f\xef\x3b\xfb\x29\xf8\x6f\x9d\x7f\x27\xa2\x93\x32\xdf\x11\xfe\x4c\x59\xeb\x07\x99\x92\x67\x51\x73\xdc\x37\xc8\x7b\xc7\x53\xa2\x48\xb4\xda\xa4\x5e\xab\x1b\x33\x10\x18\x5f\xd8\x30\xa2\x42\xcc\xf8\x20\x0e\xe9\xde\x14\x9f\x39\x42\xb3\x0b\xa5\xf6\x23\x85\x42\x75\x82\x6d\x0d\x96\x0f\x17\x9f\x19\x44\x64\x7d\x5a\xf4\x08\x94\xba\x4b\xc2\xfa\x1d\xba\x41\x1f\xc4\xc1\x33\x5f\xc7\xe8\x2a\x4b\x8e\xc8\xbc\xdd\xf4\x48\x4b\xce\x7a\x37\xf9\x5d\x9b\xb3\x4d\x9a\x85\x41\x92\xcd\x6f\xb5\xd4\xd8\xad\xdd\xa3\xa1\x6d\x46\x10\x07\xcf\x7c\x9e\x65\xec\xeb\x06\x28\xe5\x25\x0e\x44\x37\xbf\x5a\x12\xef\x35\xb3\x3f\xda\xd0\x9a\x15\x7b\xfd\x3d\xb9\xf7\x51\xfe\x36\x4e\xb8\x1c\xd4\x25\x04\xc0\x05\x48\xd2\xff\xe3\x39\xc4\xc7\x2a\xee\x35\x15\x91\x2e\x7f\xc5\x94\x8f\x1d\xcc\x62\xa4\xaa\xce\x8d\xd9\x75\xd5\x89\x5b\xc0\x3f\xac\xd6\xb1\xb0\xfb\x9d\x85\x30\xc2\x20\x0e\xaa\x11\xfe\xbb\x11\x06\xfd\xa0\x4f\x92\x80\xdc\xe8\x6d\xbe\x64\x97\x0e\xba\x77\x02\xb5\xd7\x12\x33\x8b\x5e\x67\x55\x47\x06\x28\xb5\x72\x1e\x2d\x99\xd3\xe9\x3b\xf1\xd4\x43\xc7\xd6\x40\x1c\x5c\x02\x52\xa2\xe4\xd7\xee\xd6\x6f\xeb\x3b\x94\xdf\x49\xfd\x1d\xb5\xa6\xc5\x92\xf4\x40\xa8\x38\x28\x5a\x01\x7b\xcf\x5c\xbc\xd0\xe7\x15\x74\x7f\x28\x88\x83\x4b\xc0\x45\x17\xd5\x98\xe8\xf2\x35\xe6\xd7\x66\x94\xe7\xe6\xa5\x93\x5e\x4d\x3c\xf9\x26\xff\x34\x15\x9b\x40\x55\xf9\xdb\xce\x4a\xa7\x60\x04\x22\x2e\x88\x83\x4b\x40\x22\x82\x3a\xfb\xdc\x83\x56\x02\x66\x47\xe6\xd0\x85\x8b\x29\x2c\xb7\xbd\x70\x68\xaa\x7c\xd9\xae\xbf\x6b\x0e\x0b\xbc\xcb\x13\x08\xed\x86\x80\x38\xb8\x04\xe4\xbf\x1b\x10\x85\xdc\x0c\x46\x15\x94\x7e\x2f\xe7\xc5\xe1\xd6\x67\xea\x37\x5f\xc6\x90\x60\x63\xe8\x55\xf2\x90\xd7\xd6\x88\x06\x32\xc2\x20\x0e\xaa\x0d\xe4\xfb\xfb\x02\x18\x34\xbb\x9e\xa4\x81\x9f\x1a\x23\xc2\x8e\xc2\xf6\x11\x45\xed\xcb\x3d\x46\x7a\xf7\xb2\xb1\x2e\x77\xb8\x7b\x3b\x3c\x7c\xef\xfc\x39\xab\xec\xbe\xc4\xd7\x3e\xc4\xd8\x41\x1c\x5c\x03\x0b\x39\x0a\x1a\x6f\x63\xce\x7b\x59\x94\xfb\xb5\x92\x64\x3b\xce\x0c\x61\xb0\x28\xe2\x0e\x7d\xc4\x64\x50\x0c\x4f\x1c\x77\x7b\x0e\xed\x06\x82\x38\xb8\x06\xcc\x8c\x50\x05\xf0\x5e\xb0\x2f\xe8\xcf\x0d\xe2\x63\x19\x85\x51\xfe\xc8\xd2\xe5\xdc\x90\x0b\xc2\x3a\x1a\x58\x96\x2b\x79\xed\x0e\x5d\xcd\x05\xe2\xe0\x1a\x50\x71\x53\xe8\xd2\x6c\xa4\xc4\x22\xbf\x9e\x7c\xf6\x59\x76\xe8\xd2\xb9\xa0\xb3\xc3\xe5\x8c\x9e\x17\x45\x05\xc5\x47\x02\x98\x96\xd9\x10\x71\x41\x1c\x5c\x03\x4f\xf8\x03\x19\x72\xef\xe6\xf5\x48\x2d\x4e\x78\x69\x72\xe8\x2c\x18\x60\x6a\x85\xfb\xd5\x51\xbd\xcb\x40\xc5\xe9\x45\xed\x57\xcf\x43\x68\x00\xc4\x41\xb5\x81\x00\x23\x0c\x4a\x75\x27\x69\xc0\x9f\x72\x5b\x11\xfd\xc7\x2b\xa3\xf7\xef\xaa\x14\xbd\xc7\x2c\x42\x68\x49\xbd\x4c\x6f\x8f\x26\x85\x04\x9d\xd7\x50\xf5\xde\xe1\xc1\x42\x8c\x1d\xc4\xc1\x35\x60\x83\xa7\x6d\xe5\x18\x3e\x48\x1b\x45\x21\x11\xfc\xe3\xde\x45\x26\x72\xc9\xf2\xc7\x19\xfa\xb3\xf4\xdf\xa9\x3f\xef\x39\xd5\x1c\x40\xd7\xb3\x81\x38\xb8\x06\x48\xee\x0f\x78\x57\xa3\x24\x31\x3a\x5e\xf0\x78\xdd\x81\x41\xcb\x56\x7a\xbe\x50\xdf\xc5\x42\xf7\x9b\xbb\x69\x9d\x67\x79\x97\x1a\xb4\x1b\x08\xe2\xe0\x1a\x48\x2f\xe0\x7f\x54\xf4\x56\x19\xfd\x66\x49\x8d\xfc\x86\xff\xf5\xe9\xbb\xc4\xb3\xae\x5b\xfa\x14\xa8\x96\x8f\xc9\x07\xab\x55\xd8\xa0\x94\x08\xe2\xe0\x1a\x88\x9d\x7f\xed\x5f\xb7\x12\x78\xae\xcd\x1c\xcb\x10\x2f\x82\x61\x08\x6f\x8f\x0c\x83\xb4\xd3\xf1\xd0\xb5\x77\x7f\xb2\xc6\xc4\x81\x0a\xa1\x01\x10\x07\xcd\x03\xda\x7f\xd7\x00\x68\xdd\x71\x92\x06\xd8\xc6\x85\xb5\x48\x6f\x6f\x14\x18\x0b\x3d\x5c\x1b\x58\xff\xfe\xa0\x6b\xe1\xb5\x66\xd6\xf4\x98\x03\x7d\x29\x57\xb8\xa0\xea\x24\xd4\xd7\x01\xc4\x21\xcd\x03\x19\xe3\xec\x95\xa4\x37\x27\xee\x3e\xb7\x2c\x3b\xe3\x61\x34\xe2\x42\xff\xa3\x59\xa9\xdf\x70\x36\xd5\xfb\x76\xc0\x70\xf0\x71\x2e\x34\x0f\x00\x38\xb8\x06\x36\x12\x6c\x1a\xa7\xcf\x2a\x4f\x5e\xc4\x93\x7b\xb2\xe0\xc6\xe8\xbe\x8f\xa7\x2b\xbb\xcc\xfb\xf6\x73\x9a\x68\xad\xed\x7b\xd4\x0b\x1b\x88\xb8\x20\x0e\xae\x01\xe1\x7a\x66\x35\x69\x96\x50\x8a\xe5\x5c\x39\x2f\xdb\xd1\xce\xc4\x07\x09\x62\xe3\xde\x19\xbd\xc5\xed\x7a\x11\xf4\xf3\x98\x72\xd0\x55\x62\x20\x0e\xae\x81\x8c\x83\x5f\x3b\x35\x1c\x97\xf9\x13\xc5\x3e\x06\x7e\x0f\x5e\x9f\xb6\xc7\x27\xe7\xaf\xe9\xa2\x56\x09\x94\x27\x99\x55\xa8\x9b\xda\x45\x68\x00\xc4\x41\xf3\x00\xc0\x08\x83\x4c\xd4\xc9\x46\x58\x21\x62\x31\xe0\xe9\x8b\x82\x60\xbe\x8c\xf7\x4b\xad\x33\x4e\x57\xd4\xa4\x17\xe8\x29\x2c\x1b\x4b\x7d\x0c\x1f\x11\xc7\x58\xcd\xc5\x21\x4c\x25\x88\x43\x36\xc2\x05\xb4\x33\xd9\xb6\x62\xfd\xc3\x76\x1f\xe9\x44\x99\x45\x26\xf0\x35\x79\x06\xe9\x5a\x0c\x8b\xfd\x4c\x24\x2d\x7f\xe2\x69\xba\x43\x6d\xb8\x40\x1c\xb2\x11\xae\xbc\x21\x2a\xb1\xe1\xe7\x76\x9e\xd2\x7c\xc4\x74\x3c\xed\x72\x86\x09\xb9\x70\xab\xa6\x6a\x0d\x23\x8e\xfc\x62\x58\x92\x4c\xa9\x24\x22\x32\x88\xfb\x8f\x11\xfe\x67\x83\xb3\x7f\x7d\x8f\xf0\xfb\xfc\x07\xe7\x6e\x1d\x61\xe8\xca\xea\x63\xdb\x84\x36\xee\xbf\x6a\x74\xe1\xd0\x4f\x93\x0b\x26\x57\xd8\xfb\x64\xf7\x5d\x67\x70\xea\x4f\x23\x6c\x57\xf9\x69\x41\xd8\xb5\xcf\xed\x59\x85\xab\x7f\xb6\x86\xf9\x4c\x89\x65\xa1\x65\x4c\xd3\x87\xb6\x9a\x40\xfc\xc1\x9e\xa0\x10\xbd\x3f\xd0\x10\xb1\x66\xed\x4b\x4a\xfd\x0a\x99\x56\x12\xef\x8d\x7f\xcd\x30\xd2\x76\x61\x65\x3a\xa5\x32\x86\x11\xee\xdc\xfb\x92\x55\x72\xb9\xe9\xbf\xcd\x08\x83\x86\xf6\x67\x8d\x30\x92\x11\x7e\x6c\x7b\x9e\xc0\x18\xdd\xbc\xdd\xec\xbb\x68\x48\xef\xae\xdb\xd7\x3d\xeb\xa3\x6a\xaa\x58\x4f\x41\x25\x49\x8d\xcb\xee\x34\x71\x4b\xa7\xb2\x59\x89\x6c\x84\x1f\x57\xac\xde\xd1\x0d\xd7\x3b\xcb\x4a\x84\x5d\x86\x3b\xc9\xa5\x70\xb8\xcb\xf4\xf8\xd1\x48\x6b\x79\x4d\xc2\x64\xd4\x46\xed\xc2\xa9\xb4\x8f\x6a\x44\x36\xc2\x4d\x96\xd8\xf8\xeb\x91\x66\x41\xe1\xe1\x9b\xd6\x03\x9e\xa1\x06\x85\x9a\xc1\x4b\x8c\xfa\x9b\xba\x4f\x78\xcd\x2f\xc4\x4c\x12\x9e\xca\x41\x70\x71\x64\x23\x7c\xbe\xae\xec\xaa\x9d\x44\xc6\xc2\x8c\xd4\x25\x97\x2e\x8f\x2e\xde\x27\x62\xb6\x7e\xb2\xd6\x75\x2d\x07\x4e\x92\xdb\xf2\x9b\x23\x16\xa7\x32\x5a\x64\x23\xac\xfe\x24\x42\xa1\x2b\xf6\xb2\xff\x44\xb7\x18\xad\x2a\xa3\xca\xc1\xf0\xf0\x75\x3f\x19\x19\x46\x5c\x27\xd2\x27\x4d\x5e\x15\x0c\xdf\x4e\xcd\x08\x83\x44\x74\x52\xe6\x2b\xc4\x74\xfe\xfa\x5b\x16\x5d\xf4\x32\xbf\xca\x17\xf4\xf8\x57\x19\xfe\x7a\xee\x78\x76\xd4\x37\x04\xe4\x0a\xbd\x69\x35\x89\xa6\xa1\x15\x30\x88\x83\x67\xbe\xbc\x80\x60\x03\x52\x71\x53\xfa\xc9\xbc\xec\x23\x41\x2d\x11\x8a\x25\xc9\xa8\x27\x37\xd1\x69\x71\xbd\x2d\x49\x12\xea\xab\xba\x84\xa0\x73\x76\x00\x0e\x9e\xf9\x3c\xb0\xb7\x5d\xef\xbe\x92\x6d\x3c\x4f\x6e\x7e\xd0\x6e\xad\x54\xb9\x4d\x7c\xcb\xb1\xa9\xa5\x90\x04\xeb\xc2\x88\x48\x50\xf0\x2e\xd4\xd1\x05\xc4\xc1\x33\x5f\xd3\x03\x27\xae\xfe\x3d\x16\x4c\x02\x65\xdd\xd8\xce\xcd\xc2\x87\x7e\x65\x3f\x53\xb0\xa4\xb0\xc2\x52\xfd\xb5\x66\xce\xfd\x88\xd7\x80\x8e\x88\x03\xb8\x00\x49\x14\xb4\x3f\xe3\xfa\xdd\xe7\x12\xa9\xb4\xfd\x70\x4e\xb5\x5f\xc5\xcd\xec\x92\xeb\xcf\xc4\x43\x9e\xce\xb8\x8e\x20\xe9\xd1\x84\xb1\xbe\x70\xdf\xe7\x9e\x08\x23\x0c\xe2\xa0\x1a\xe1\xbf\x1b\x61\xd0\x0f\xfa\xc4\x1d\x61\x26\xba\xc5\xef\x5d\x32\x9a\xb8\x73\x6b\xd6\x9d\xc5\x34\xdc\xa6\xce\x66\x4c\xb7\xbf\xe3\xad\x07\x55\xff\x32\xbb\x18\xb0\x05\xed\xd8\x80\x38\xa4\x63\xb1\x53\x5c\x6d\x91\xea\x3d\x1a\x6b\xbf\x59\x37\x3c\xc8\x82\x1c\x22\x75\x0b\x77\x7d\x33\x07\x8e\x70\x05\xbf\x4c\x54\xdd\xc6\x86\x16\xaa\x20\x0e\x2e\x81\x7c\xb4\x2b\xfd\x2b\xf6\x1b\xcc\xda\x85\xc4\xf8\x2c\x01\x84\xad\x89\x13\x78\xd6\xea\xf6\x8e\x7b\xdd\xfe\x37\xef\xee\x98\x0b\x43\x9d\x88\x41\x1c\x5c\x02\x1e\x02\x1d\xe3\x8e\xe1\x1d\x5b\x57\x1d\x4a\xda\x2f\x74\x91\x8d\x1a\xd2\x6f\xe9\x18\x51\x46\x8e\x12\x84\x9c\xfd\x2c\x89\x23\x06\x1d\x8b\x05\x71\x70\x09\xfc\xc0\x93\x56\xcb\x09\x62\x35\x8e\x09\xaa\xd9\xef\xdd\xca\x94\xf8\xc8\x6e\x8b\x79\xb4\x3f\x64\x3d\x98\x56\xe3\x46\xbb\xfa\x89\x1a\xb1\xf8\x01\x71\x50\x6d\x20\xc0\x08\x83\x66\xd7\x93\x34\x90\xc4\xee\x1f\xa2\x3f\x4c\x15\x5c\x13\x80\x5f\xf7\xf8\xbc\xc5\x55\x73\x52\xe1\x31\xf6\x7e\x41\x8d\xc7\x3b\xf9\xc6\xaf\x72\x48\x72\x10\x63\x07\x71\x70\x0d\xfc\xdc\xbf\xbc\x54\x2b\x72\xfc\x91\x53\x93\x60\xbf\xa9\x3b\x31\xa6\x64\x7b\x73\x44\xd8\x4b\x63\x5d\xac\x37\x51\x6f\xae\xfc\x3c\xb4\xc3\x04\xe2\xe0\x1a\xc0\x10\xc6\x08\x65\x73\xbb\x5e\x63\xf5\x5a\x5f\xe8\x55\xfb\xe0\xd9\x2b\x9d\xe2\x59\xc9\x37\x53\xfc\x4d\x12\x87\xaf\x60\xb9\xd0\x40\xcd\xe3\x41\x1c\x5c\x03\x04\x46\xd7\xf4\xdb\x9b\xe7\xdd\x3a\x8c\x26\xad\x5d\xa7\x74\xd2\x72\x86\x88\x9a\xf2\x08\x33\x5c\xbb\xab\xae\xec\x3d\xfd\xe6\x07\xed\x08\x83\x38\xb8\x06\x8a\xae\xfd\x0c\xed\xa0\x9d\x4d\x22\x65\xcd\x34\x99\x20\x60\x8c\xbf\xda\xd3\xc6\x81\x42\x9b\xf1\x5a\x95\xe9\xd1\x28\xa9\x8a\xc6\x11\x42\x03\x20\x0e\xaa\x0d\x04\x18\x61\x50\xaa\x3b\x49\x03\x0f\x51\xdf\x19\x5b\xac\xac\xee\xd6\x71\xc5\xf7\x3c\x09\x3a\x76\x71\x57\x54\x66\x79\x9e\xaa\x46\x3d\x52\xf5\xbb\x46\x44\xdb\xe4\x2c\x54\x6f\x09\xe0\x90\xee\x11\x4e\x0a\x2f\x0a\xb5\xf8\x5e\x98\x1c\xcb\x1e\x41\xe7\xcf\x2a\xf2\xe9\x79\x67\xdf\x37\xbf\x9c\xc5\x08\x23\x66\xb3\x32\x72\xdc\x28\x44\x5c\x10\x07\xd7\x80\xd6\xa8\xc5\x77\x7d\xa6\x2a\x12\x56\xe2\xae\x68\x2a\x11\x2e\xd3\x1c\xb5\x33\xd8\x99\xe8\x43\xd2\x2f\x97\x34\xf2\xd7\x9e\x5e\xee\x40\xc4\x05\x71\x70\x0d\xf4\xd1\x7a\xe8\xba\x36\x39\x58\x36\x7f\xae\xb3\x67\xb3\xea\xd4\xd9\xb5\x68\x17\xc4\xe4\x56\xd0\xfa\xfe\xdd\x4e\x92\xd9\x97\xf6\x1e\x74\x8c\x17\xc0\xc1\x35\x10\x29\x52\xc2\x70\xdf\x5f\x8c\x47\xd1\xe2\x8e\xe5\x03\x12\x8b\xd5\x2b\x84\xc9\x71\x64\xf2\x6f\x35\x22\x45\x97\x22\xaa\xa8\x51\x6b\x11\x1a\x00\x71\xd0\x3c\x00\x30\xc2\xa0\x75\xc7\x49\x1a\x28\xc3\xf7\xfe\xfa\xff\x31\xf7\x96\x51\x55\x35\xef\xff\x3f\x20\x21\x02\x22\x21\x82\x48\xa8\x28\x2a\x20\x22\x20\xdd\x21\x21\x2d\xdd\x20\x20\x08\x48\x97\x74\x87\x22\xa1\x74\x77\x77\x49\x8a\x08\x88\x34\xd2\xd2\xa1\xa0\x74\x97\xf0\x5f\xbf\xff\x5a\x67\x7f\xbd\xf7\x61\x7d\xe6\x7e\xc0\x83\xfb\xf9\x6b\x5d\xe7\xcc\x7e\x5f\x7b\x66\xde\x7b\x66\xae\x21\x1a\x62\xa7\xc8\xf5\xca\x2a\xd5\xe4\xc9\xfa\xec\x9e\xf2\xfb\x75\x7c\x54\xe1\xdb\xba\xe2\x41\x07\x7d\xe1\x76\x63\x44\xdb\x41\x1c\x3c\x07\x7c\xf3\xd2\x39\xb7\x0d\x50\x37\xb4\x48\xda\xae\x09\xe6\xd1\x46\x69\xd7\x3a\xf4\xb2\x6d\x37\xb5\x78\x33\x91\x3d\x21\x41\xab\x81\x0a\x9b\x81\x38\x78\x0e\xb0\xdd\xe7\xb9\x18\x8f\xc6\xd8\xc2\x6a\x93\xb2\x6a\xd8\xd1\xb8\x74\x60\x14\xf4\xfa\x2d\xee\x1a\xa5\x35\xc5\xd1\x17\x14\x07\x6c\x34\x44\x5c\x10\x07\xcf\x81\xcb\x07\xc3\xd7\xbf\x94\xfd\x94\xec\x0e\x98\x11\xde\xd4\x71\x8b\x4b\xb1\x2b\xcd\x92\xa8\x37\xd1\x0e\x5b\xe6\x11\xc6\xe7\x0e\x3c\x46\xc4\x05\x71\xf0\x1c\x38\x28\xba\x78\x37\x6f\x2a\x34\xa5\x9f\xe2\xad\xd1\x62\xf7\x1e\x1a\x61\xf5\xb5\x7a\xdd\xe0\x5f\xbb\xc2\x8b\x12\x5a\xaf\xda\x83\xae\x21\x72\x00\xc4\x41\xfd\x00\xc0\x08\x83\x4c\xd4\xe9\x46\x58\xd8\x44\x79\x61\xb1\xd2\x98\x38\x76\xfc\xca\xfb\xfd\xef\x0e\xe9\x71\x04\xef\x5b\x9d\x05\xcd\x6b\xdb\x1f\x05\xb1\x58\x34\xd2\xf6\x21\x4c\x25\x88\x43\x36\xc2\x0e\x98\x26\xd5\xfc\x95\x3d\xfd\x68\x63\xdd\x28\x7c\x71\xcd\xeb\x69\xcf\xdb\x30\x22\x5c\x9d\x25\x7c\x8c\xdf\x4f\x99\x0e\xed\xbc\x40\x44\x06\x71\xc8\x46\xb8\x60\xcc\x09\x53\x7e\x9a\xe5\xe1\x73\xb5\xdd\x59\xaf\x6d\x61\x2d\x94\xcd\x44\x9f\x7c\x9b\xb9\xeb\x59\xe8\xfd\xf1\x55\x9b\x62\xd0\x19\x61\x10\xf7\xff\x8c\xf0\xa5\x7f\x44\xfe\xd7\xf7\x08\xfb\x12\xa7\xdb\x54\xf7\x99\x3a\x1d\x33\x61\x4c\xa6\x28\x85\xd0\xba\xed\xc8\x39\x67\xdc\x94\x89\x8b\xb8\x19\x8f\xdb\x7b\x6f\xe5\x1f\x55\xa3\x53\x96\xc7\xe9\xc9\xea\x72\x3f\x57\x57\x0b\x9a\x91\xde\xf8\x40\x4e\x69\x37\xd1\xe0\x9e\xfe\x1c\x87\x4e\x9b\x98\xb2\x93\xed\x85\xcf\x5f\xa8\x71\x5d\xd1\x54\xd9\xbe\xbd\xa3\xf7\x44\xb8\x84\x77\x8f\x4b\xb3\x63\x92\x16\xfe\x5d\x2c\xe5\x2a\xe7\x4a\x4f\xf7\x23\xc2\x56\xc3\xff\x9a\x11\x06\x35\xed\xef\x33\xc2\x62\x70\xb3\xf4\xb3\x88\x86\x4c\xe5\xd0\x70\x26\x87\x2e\x7a\x70\xea\x4a\x34\xe5\xb1\xf6\x4c\x69\x34\x97\x5d\x29\xd3\x8f\x73\xb5\xc6\xc1\x21\xe6\x67\xb2\x58\x89\x6c\x84\xc5\x2e\x30\x9a\xc4\x3c\x0d\xe3\x5b\xd1\xd8\x99\xf0\xed\xe0\x92\x8b\xb3\x99\x60\xfe\xee\x67\xbd\xad\xdf\x5b\xf7\x07\x3b\x7f\x96\xfa\x4c\x96\x66\xf9\x90\x7e\xb6\x36\x4b\x4b\x77\x85\xb6\x91\xdf\x74\x57\xe1\xca\x6c\x63\xaa\x92\xbc\x00\x5e\xe3\x40\x9f\xdb\x5e\x09\x9a\x36\x73\x64\xfc\xb3\x7b\x67\xd2\x5a\x64\x23\x3c\x21\xff\x40\xbc\xe4\xc5\xd7\x8c\x3c\x1d\x0c\x93\x86\x20\xd5\x32\x37\x25\x19\xbb\xf4\xd5\x72\xef\x04\xc1\x47\xd6\xf3\xd3\xfb\x8e\x67\xd2\x5a\x3b\xa4\x9f\x5d\xc9\xb4\xda\xa1\x4e\x71\x9b\xd2\x09\xb0\xa6\x72\xab\x6c\xae\xd1\xe6\x88\x0a\xc0\x9a\xe6\x61\x28\x8d\xe5\xdf\xea\x22\xe7\x3b\x83\x85\x68\xf5\x7f\x97\x44\xa7\x8d\x7c\x7d\xb6\x12\xd6\x94\x93\x1c\xe8\x78\x8a\x5f\xc5\x14\x30\xf2\xd9\xb0\x6d\x02\xf8\xdd\x5b\xb7\xb4\xde\x16\x3f\xf1\x2f\x0a\x3d\x81\xaa\x42\x80\x38\xf8\xc8\x67\x3e\x5a\xf7\xbd\x6c\x4e\xf7\x38\xf7\xdc\xa8\xc6\x2b\x35\x65\x8b\x6b\x8f\xf8\xf2\x97\xbe\x36\x0c\x19\x3a\xa3\x6d\xb8\x8f\xf6\x3d\x42\xc4\x05\x71\xf0\x91\xaf\x48\x36\x8c\xf9\xa1\xb7\x4d\xca\x6e\xf7\x79\xfd\x35\x02\x33\x34\xa3\x9c\x5e\xa2\x68\x8c\x7b\xdf\x13\xde\xed\x6d\x3e\xa4\x60\x81\xdc\x15\x88\x83\x8f\x7c\xbc\x0d\xc9\x5b\xfa\xaf\xba\x42\xc8\x06\xbf\x5c\xb3\xd2\x59\x4a\x5c\xe7\xa1\xc0\x9b\xdd\xea\x8d\xd3\x20\xee\xfe\xc0\xe1\x8f\x5e\x0d\x6d\xb9\x06\x70\xf0\x0b\x09\x0b\x5d\xd6\x56\x31\xe6\x05\xc2\xe7\xc4\x5a\xed\xc3\xed\x9b\x42\x84\xd5\xfb\x0a\xd0\x57\x76\x96\xf0\x7f\x0d\xf1\xfa\x51\x3f\x5c\x46\x18\x61\x10\x07\x9d\x11\x16\xfb\x9f\x93\x1f\xd0\x0b\x7d\xea\x76\xb8\x57\x1e\x19\x19\xcd\x6d\xb5\x34\x6b\x8e\xf1\xfc\xf7\xbf\x15\x39\x6d\x67\x66\xbc\x9c\x2a\x6e\xda\x3f\x7a\xfc\x48\x4b\x21\x17\x5a\xb9\x05\x71\xf0\x14\xe0\x78\xd9\x4e\x69\xa5\xb7\xf4\x72\xdd\x58\x37\x61\x44\x44\x57\x86\x93\xd8\xc4\x2e\x39\xa4\x7c\xaa\xfc\x98\xc0\x85\x52\xa0\x7a\x03\x11\x17\xc4\xc1\x53\xc0\x29\x08\x85\x97\xcc\x93\x16\x77\xea\xf2\x86\xfa\xd7\xf8\x9d\x78\x0a\x29\x7c\x1c\x1f\x9c\x79\x6e\xd4\x46\x72\x52\x86\x7c\x7d\xa8\xf8\x0e\x88\x83\xa7\xc0\x8a\xef\x80\xaf\xd1\x01\xb6\x5b\xe9\x5b\x9c\xab\xdb\x23\xb9\x43\xf3\xbb\xdc\x5f\x92\xf5\xe6\x4f\x6a\x1e\x9b\xf1\x15\xd1\xce\x36\x21\xe2\x82\x38\x78\x0a\xec\x74\x46\x31\x13\xa6\x1c\x2a\x49\xea\xe1\xe1\xbd\xc3\xab\x26\x1f\x52\xcb\x6d\x16\x6e\xd6\xcb\xb9\x23\x15\x49\x3f\x70\xc7\x03\x5a\x09\x02\x71\xd0\xd9\x40\x80\x11\x06\xf5\xae\xa7\xe5\x80\xe0\xe8\xf7\x07\xfd\x0f\x6d\x5c\xf7\x64\x1e\x2d\x7a\x76\x7f\xbe\xbc\x2c\x1e\x4e\x57\xe3\x6c\x4c\x34\x58\x12\xb9\xb7\xb0\xf0\x07\x32\x2b\x20\x0e\x9e\x03\x46\x03\x1f\xae\x1d\xcd\x1f\xef\x7c\xc6\xde\xfc\xea\xc6\x1e\x54\x1e\x47\xfe\xe7\xbe\xe9\x72\xb8\x5c\xe4\x6d\x92\x07\x51\x53\x97\x9e\x20\xe2\x82\x38\x78\x0e\x3c\x34\xe4\xe8\xcb\x66\xf8\x6a\xff\x14\xef\x87\x1c\x81\xa1\xd4\xf9\x9c\x07\x92\xef\x74\x1c\xdf\x15\x6f\xbf\x58\xaf\x64\xfd\x18\x01\xdd\x4d\x0b\xe2\xe0\x39\x70\x89\x1d\x77\xed\x66\xfb\x1e\xf3\xec\x41\x7e\x31\xc7\x85\x51\xa2\xb4\x1b\x5c\xe6\xbf\x89\xbe\x04\xbf\xb4\x18\x90\x2b\x53\xb2\x32\x42\xc4\x05\x71\xf0\x1c\xc0\xfa\x4e\xeb\x76\x41\xd8\x4f\x95\xe9\x71\x11\xa3\x76\xf2\xe0\xd3\xc9\x4f\xc6\x3d\xdc\xdb\x33\x73\xf5\x75\x7e\x4f\x17\xa2\x63\xb1\xa0\x3b\x64\x01\x1c\x74\x36\x90\xef\x7f\xe7\x00\x68\xa8\x3b\x2d\x07\x32\xa9\x7e\xbe\xcc\x39\x0c\x69\xf8\x53\x1f\x17\xf3\x7a\x68\x5a\x21\xcb\x3a\x5b\xa5\x5b\xa2\x29\xa3\xa0\xe5\x5a\x41\xe3\xcf\x54\x28\x07\x40\x1c\x3c\x07\x6e\x85\xdb\xe6\xdf\xd0\xb0\xed\x9b\x77\xb3\x59\x76\x7d\xfe\xd5\xc2\xd1\x02\x55\xe2\xc5\x6a\x50\x7f\x97\x97\x14\x7a\xcc\xcb\x6f\xd6\x88\xb8\x20\x0e\x9e\x03\x59\xb3\x81\xac\x2a\x29\x4e\x1f\xf1\x9c\x8a\x02\xef\x3a\xdd\xbd\x4c\x8e\x45\xfb\x4b\xbe\xe4\x55\xc9\x44\xcc\xfd\x75\x3a\xbe\x6a\xe8\x1c\x27\x88\x43\xda\x15\x40\x63\x6d\xee\xe4\xd4\xa4\x53\x89\x2e\xff\x04\x3d\xee\xa1\x42\xb7\xbb\x80\xf8\x4b\x6d\xd2\x3e\x34\xd1\x04\x91\x10\x9d\x55\x4a\x68\x57\x00\x80\x83\xe7\x40\x54\xaf\x4d\x87\x19\x41\xeb\x5a\x70\x36\xf3\x9d\xdb\x52\x68\x69\x92\x4e\x43\x5c\xeb\xec\x5e\xc5\xd3\x5a\x2f\x48\x07\x9c\xa7\x70\x10\x39\x00\xe2\xa0\x7e\x00\x60\x84\x41\xf3\x8e\xd3\x72\xc0\x45\xde\x26\x81\xa0\x16\xeb\xa9\x4f\x98\x9a\x4c\xf9\x5d\x96\xd9\xfb\x9d\x41\xf5\x3f\x1c\x6e\xdc\x12\x37\x64\xfc\x88\x55\xb7\x1a\x8e\x68\x3b\x88\x83\xe7\x40\xe1\x61\x67\x40\x7d\x26\x8d\x00\xf5\xf7\x8b\x0a\x92\x8f\xd8\xc8\xd3\x51\xbd\x0f\x3f\xe9\x5e\x7a\xd2\x49\xa7\xf3\xbc\x78\x20\x51\x0d\xaa\x46\x0d\xe0\xe0\x39\x30\x62\x3b\x2a\x51\xa2\x7a\xf2\x24\xd4\x4b\xcf\x01\x5b\x84\xaf\xe7\xab\xc8\x53\xdb\x48\x3d\x31\x7d\x9f\x29\xe2\xdd\xa8\x8e\x70\xe8\xa4\x14\x88\x83\xe7\x80\xb8\x4d\xeb\x98\xa5\x8c\x38\x07\x51\x5e\xd9\xdc\xe3\x5d\x9b\x00\x7c\x79\x8a\x9c\xeb\xb9\xbf\xcb\x5f\x8c\xb5\xcc\x61\x72\x30\x42\xc7\x04\x40\x1c\x3c\x07\xda\x82\x22\xfc\x22\xce\xb5\xac\xf2\x9f\xbf\x50\x5e\x59\xae\x85\xb3\xe7\xd5\x67\x98\xe1\xd5\x48\xf9\xf0\xcf\x0d\x2b\xa9\x50\xbc\x05\x44\x0e\x80\x38\xa8\x1f\xb0\xfb\xdf\x46\x18\x64\xa2\x4e\x37\xc2\xe6\x78\xcc\x86\x6f\xdd\xd6\x49\x6f\x24\xd7\x85\xaa\x15\x73\xd1\xd5\x64\x3e\x29\xdf\x22\xa1\x17\xd0\x93\x51\x25\xb8\x4e\xf3\xc6\x0c\x61\x2a\x41\x1c\xb2\x11\x0e\xaf\x89\xfc\xf0\xd4\xf0\xb7\x81\xa5\x94\x88\x36\x95\x71\x05\xa6\xab\x0b\x6a\xa8\x0b\x9f\xa8\xd6\x21\x75\x57\xa2\xe7\x11\x6d\x2a\x22\x32\x88\x43\x36\xc2\x8f\x22\x57\xf1\x6e\x7c\x1e\xcc\x51\x76\xf1\xb5\x14\xa0\x4f\x6d\xb0\x54\xd0\xd0\xc9\xb8\xa9\x29\x8e\x5e\x49\xb4\x41\xdf\x7a\x93\x02\x11\x19\xc4\xfd\x3f\x23\xfc\xcf\x4a\xdf\xff\xfa\x1e\xe1\xed\xfa\x21\xd7\xfc\xf9\xfe\x16\x1d\xcb\x4c\x14\x6c\x33\xed\x28\xad\xae\xf3\xd4\xef\x9a\x07\x45\xec\x72\xea\x1e\xdf\xde\x59\xd2\xfb\xdb\x08\xcf\x7d\x75\x6a\xa6\x55\x12\xd9\x4d\xd4\x21\xaa\xa3\x54\x4b\x67\x9b\x65\x3f\x96\xbf\xba\x29\xc4\xd0\x89\xbd\xbf\xc8\xf3\x6c\xe9\xef\xb3\xb0\xa3\x7a\xf5\x24\xe8\xf5\xa4\x13\x9c\x41\xec\xc9\x5e\x49\xd8\xc2\x05\x71\x26\x92\x92\xb8\x2c\xa3\x72\xf2\x39\x1d\x51\x68\xa5\xa8\xff\x35\x23\x0c\x6a\xda\xdf\x67\x84\x91\x8c\x70\x6a\x4e\xc0\xdd\x1b\xa5\x9d\x1e\x23\xc4\x6f\xf2\x87\xb6\x02\xc6\xea\x76\xc7\xe4\xa6\xd0\x54\xba\xee\xde\xde\xc2\x39\x7f\x59\xf0\xf1\x99\x2c\x56\x22\x1b\xe1\xf7\x4d\x03\xd2\xdd\xaf\x7e\x35\x60\x9a\x2f\x3f\xca\x23\x1b\x3f\x7a\x8b\xad\xdd\x39\x32\xe4\x7c\x41\xc9\xd1\x78\x5b\x64\x95\xe1\xe5\x99\x2c\xcd\x22\x1b\xe1\x09\x06\xea\x7b\x1d\x79\xbb\xc9\xae\xc6\xe7\xd6\x8d\xeb\xe4\xd2\x1b\x6a\xd8\x9f\xc5\xdd\xb8\x19\xf8\xf0\x5d\xd4\x03\x15\x7f\x5c\xa6\x33\x69\x2d\xb2\x11\x9e\x36\x62\xf1\x0c\x68\x18\xd2\xa3\xf1\xc3\x7b\x87\x4b\xd7\x5a\xae\x35\xb2\x1a\x85\xce\x5d\x8c\xad\x5e\xeb\x7e\xfe\x63\x5c\x97\xec\x99\xb4\x16\xd9\x08\xaf\x7d\xc8\x7f\xe4\xbc\x24\x76\x7e\x10\xad\xcc\xf0\x95\xd1\x04\x9a\x3f\xd3\x6c\xef\xfa\x76\x98\x71\x79\xcc\xb4\x4e\x6e\xcc\xab\xe0\x33\x33\xc2\xa0\x24\x3a\x6d\xe4\xdb\x5e\xa0\xdb\x8c\x68\x2e\xfa\xa2\xc5\x3a\x8d\x6b\xf8\x5e\x6e\xe7\x84\xd5\x44\x99\xb5\xe8\xc9\x60\x77\x2e\x53\x74\xd6\xcd\x24\xa8\x58\x16\x88\x83\x8f\x7c\x09\x96\xa3\x74\xdd\x5c\x82\x8f\xf4\x24\x03\xf7\x25\xd2\xe8\x58\x2e\xb5\xec\x85\x6a\xb8\xd5\x65\x1a\xe5\xcf\x87\x76\xbc\x54\x82\x4a\xf0\x82\x38\xf8\xc8\xf7\x8b\x55\x72\xd8\xad\x0b\xf7\xa7\xd3\xf5\x1e\x81\xc5\xea\x47\x53\x2f\xb9\x3f\x24\x10\x9a\xba\x39\x29\x9f\x58\x63\xf5\x12\x74\x33\x21\xe2\x82\x38\x2f\x41\x14\xf7\xbf\xe3\x4e\x46\x7f\x4f\x2f\xee\x98\xec\x6a\x8c\x88\x2d\x15\xce\x7c\x24\x2f\xb1\x98\x2a\xcb\xec\xac\x41\xd7\x3f\x61\x20\xe2\xea\x23\x08\xed\x87\x03\x71\x5e\x82\xff\x3c\x60\x32\x4c\x51\x46\x6f\x2d\x85\x17\xd8\x96\x29\xf5\x63\xfc\xa5\x7a\x59\x7a\x09\xe6\xbc\xb6\x7d\x85\x39\x25\x8b\xa2\xc2\x92\xb2\x01\x03\xc2\x08\x83\x38\xe8\x8c\xf0\xff\x36\xc2\xa0\x17\xfa\xb4\x14\xf8\x86\xd9\x58\xfc\x80\xfe\x67\xf7\x6d\xaf\xfc\xed\x9e\x3f\x27\xcf\x85\x7e\x4d\xe3\x76\x07\xf8\xde\xbd\x5e\xc0\xc5\xa5\xfa\x6b\x01\x5a\x05\x00\x71\xf0\x14\x10\x75\x1f\xd1\x99\x46\xed\xb6\x62\xfb\x32\x9f\x34\x2e\x35\xb6\xdc\xa0\x1f\x10\x2c\x5e\x5c\x92\x4a\xc9\x64\x96\x71\x8d\xda\x27\x16\x11\x17\xc4\xc1\x53\x60\xb5\x00\x23\xa0\xef\x44\x7f\x67\xc5\x39\x41\x65\x84\xf5\xf2\xe5\x1b\x17\x9d\x38\x9e\x48\x97\xee\x7f\xc2\x11\xa2\x26\xbe\xb6\x0b\x4d\xd8\x41\x1c\x3c\x05\x2e\xf5\xef\x61\xd3\x5e\xff\xc6\x12\x92\xb0\x7e\x30\xf8\xe7\xa6\xef\x97\x58\xb3\x91\xf5\xbd\xe4\x16\xeb\x2f\x9e\x6e\xfe\xaa\xa6\xd0\x55\xd2\x20\x0e\x9e\x02\xa3\x13\xef\xef\x4f\xcf\x7a\xf1\xf7\x6b\xde\x70\xb5\xbe\xb3\x1a\xa7\x43\x9d\xd2\x1f\x2a\xa1\x29\xbe\xdd\xba\x1a\x48\x92\x31\xa2\x84\x98\xfc\x80\x38\xe8\x6c\x20\xc0\x08\x83\x7a\xd7\xd3\x72\xa0\xca\xb5\x7d\x3e\xb3\xde\xeb\xf2\x15\xd2\x18\x8d\xda\xc5\x88\xd4\x50\x37\xbb\x8b\x87\x42\xe3\x05\xb1\x4f\x3f\xfc\x69\xfb\x9d\x05\x6d\x5f\x05\x71\xf0\x1c\x98\x7d\x7f\x2d\x7a\xff\x25\x6b\x83\x51\x1a\xaa\x47\x59\xef\xfa\x77\xb4\xf3\x44\x56\x82\x34\x9d\xf5\xca\xcf\x28\xd0\x1f\x34\xdc\x84\x0a\x1a\x81\x38\x78\x0e\xf4\xfb\xf9\xeb\x76\x05\x93\xf3\xb6\xde\x31\xb7\xaf\xb9\x8f\x51\x47\xcf\x17\xa6\xb5\x69\x4c\x11\x52\xfe\x9d\xbf\xa6\xd9\x64\x18\x2a\x4a\x0f\xe2\xe0\x39\xa0\xcb\xbb\xb3\x5e\x4c\xaf\x1f\x49\x67\x66\x22\x3f\xd5\xe5\x7c\xb5\x26\x22\xd5\x66\xc5\x84\xdc\xab\xd6\xcc\x65\x4f\x34\x9a\xd3\x15\xaa\xc5\x07\xe0\xe0\x39\xc0\x94\xd6\xb3\xbd\xe7\x8d\xda\xaf\xec\x73\x2d\x30\x5c\x3d\x2d\x90\xc1\xf8\x93\xb1\xcb\x6f\x1e\x63\xef\x69\xce\x96\x95\xda\xc3\xab\x88\x1c\x00\x71\xd0\xd9\x40\x80\x11\x06\x0d\x75\xa7\xe5\x80\x56\xb8\xa2\xbc\x24\xd5\xf5\x5f\xcd\x4c\x8a\xc6\xb1\x71\x0b\x96\x3b\x5f\xed\x30\x3c\x18\xb6\x5a\xdf\x1b\xd5\xe6\xa6\xd9\x6d\x29\x20\xda\x0e\xe2\xe0\x39\xd0\xb5\xf5\xf5\x7e\xdc\x7d\xfb\xdf\xe7\xdc\x94\x2a\xcc\x69\xeb\x27\x23\xd8\x99\x23\x53\x74\x2a\x2f\x5c\x2e\xac\xb9\x28\xe3\xcb\x25\x08\x15\x60\x02\x70\xf0\x1c\x68\x0f\xb2\x37\xaa\x5d\x36\x09\x26\x53\xad\x68\x7c\xb9\x2c\x74\x28\x50\x11\x87\x26\x66\x66\xc4\x20\xcf\xb7\x40\xc9\x10\x63\x00\xdd\xa4\x07\xe2\xe0\x39\x90\x38\xfe\xd9\xc5\x3a\x87\x77\xc5\x8e\x6d\xc5\x53\xe6\x53\x6b\x59\x2a\x31\x43\xe3\x3d\x8c\x5b\x77\x24\x48\xf6\x4b\xc8\x05\xfd\x8f\x10\x71\x41\x1c\x3c\x07\x3e\x2c\xe6\xa1\x24\x90\xb7\x44\xfc\x49\x54\xe5\x4b\xd7\xdc\xf1\xe6\x37\xa2\xb2\xdd\xad\x71\x1e\xc4\x52\x54\x19\x69\x2e\xd3\x6c\x82\xae\xd0\x02\x70\x50\x3f\x00\x30\xc2\xa0\x79\xc7\x69\x39\xf0\xa3\xf0\xd7\x66\x17\x11\x96\x27\x51\xb1\x4d\x70\x03\xee\x50\xf7\x06\x3b\xfe\x4b\x1e\x3a\x47\xec\x60\x97\x80\xbe\xa4\x7a\xbf\x79\x68\x0b\x33\x80\x83\xe7\x00\xbe\xd0\x51\xdf\xad\xdb\x7d\x2f\x2d\x85\x54\xe2\x1c\xc8\x78\x7d\xf6\x3e\x4f\x3e\xc7\xae\xc4\xcd\x51\xe0\x4d\xd3\x60\x25\x36\x85\x2a\xfd\x83\x38\x78\x0e\x30\x3e\x95\x64\xc4\xc8\x89\xdd\x0e\xa2\x20\x70\xda\x6b\x3e\xf2\x7f\xf2\xb4\x90\xa8\xed\x58\x2d\xd8\x02\x77\x5f\x99\x9b\xf7\x19\x64\xb0\x41\x1c\x3c\x07\xfa\x92\x4d\xbc\xee\x61\x06\x0f\xd9\x76\x56\x2a\xb8\xb2\xb9\x9f\x0f\xd5\x49\x64\x6f\x68\x22\x66\xee\x28\x53\xa4\xe3\xdc\xd3\xc0\x84\xd6\x07\x00\x1c\x3c\x07\xcc\x14\x7e\x3c\xc7\x7d\xb1\x42\x15\x32\xfd\x5a\xf5\x67\xc3\xa5\x15\x1e\x7a\x6a\xda\xac\xa6\xa4\xa9\x4e\x47\xfc\x14\x8c\x54\x72\xa8\x1f\x00\x71\x50\x3f\x00\x30\xc2\x20\x13\x75\xba\x11\xa6\x68\x5c\x60\x29\x60\xdd\xbd\xd1\x87\x36\xe4\xf3\xee\xf7\x4c\xaf\x9d\x62\xa0\xef\xb0\x8d\xfd\x87\x5f\x5f\x9f\x4b\x69\x89\xc6\x7d\x40\x98\x4a\x10\x87\x6c\x84\xe5\x5a\x1d\x51\x3d\x9d\x53\xd4\x8d\x8c\x9e\x2b\x55\x0f\x4e\xf5\xe5\xcc\x7f\xd7\xad\x37\x2f\xdb\xdc\xf9\x1c\x1a\x72\x49\xc3\xdb\x06\x11\x19\xc4\x21\x1b\xe1\xcf\xc6\xa9\xab\x9c\x16\x07\xc9\xc6\xf9\x98\xcb\x06\xa3\xf5\xef\xd2\xee\x3c\x1a\x26\x3f\x22\xa6\xb3\xb1\x72\xf5\xb8\xc8\x13\x50\x87\x88\x0c\xe2\xfe\x9f\x11\x46\x41\xfd\xc7\x87\xf7\x7f\x7b\x8f\x30\x0e\x26\xf1\x5b\x6a\x7f\x73\xda\x27\x6d\x54\xdb\x85\x68\x99\x59\x17\xca\xee\xe2\xef\xda\xca\xda\x86\x99\x51\x04\xd3\x92\x64\x24\xfd\x6d\x84\x6b\x0e\x93\x56\x07\x92\x3a\xc3\x06\x4f\x7a\xf7\x39\x1e\x5e\xe1\xa2\x4c\x94\x21\xaf\xae\x32\xae\xb8\x99\x30\x2e\xc4\x5b\xcf\xfa\xb7\x7f\x60\x7b\xb7\x65\xd7\x8b\xa5\x6e\xc6\xab\x2c\x5f\x5f\x99\x37\x34\x2d\x73\x57\x36\x8b\x97\x86\xe2\xc0\xbe\x54\x90\x31\x6d\xb7\x83\xe2\xbf\x66\x84\x41\x4d\xfb\xfb\x8c\x30\x92\x11\xfe\x96\x82\x2b\xae\xf9\x26\x47\xdd\x6d\xe7\xee\x33\x6a\x5f\x02\x65\x7d\xaa\x57\x7c\x9d\xb1\x93\xe2\xf2\x58\xe8\xc9\x3a\x46\x07\xba\x67\xb2\x58\xc9\x82\xe4\xd1\x24\x0f\x09\xed\x49\x3f\xb5\x2a\x2c\x2d\x52\x5c\xd4\x65\xee\x7f\x45\xb0\x10\x9c\xbd\x85\xda\x71\x4e\x3d\x9e\x7a\x56\x91\xe2\xa2\xf2\x99\x2c\xcd\x22\x1b\xe1\x8c\x0b\x15\x09\x12\x55\x59\x2e\xe7\x9b\x5f\xe4\xea\x72\xca\xb4\xa7\x5b\x7d\xeb\x7d\x33\x9a\x86\xf9\xac\xfb\x6a\x8a\x47\x54\xb1\xe6\x99\xb4\x56\x1d\xe9\x67\x6d\x28\x3e\x93\x93\x30\xbd\xcd\xec\x37\xda\x6e\x47\xdf\x93\xbc\xbe\xe5\xfc\xcc\x93\x5b\xfd\x0a\xdb\x05\xb6\x27\xc7\x5b\xb6\xcf\x88\xcf\xa4\xb5\xc8\x46\x38\x3a\x79\x47\xeb\x9c\xc3\x78\xb6\x5f\xf4\xb3\xe4\x9b\xb5\x31\xef\x09\x62\xb0\xfc\xf3\x9c\x58\x58\x68\x0e\xc8\x89\xfa\x8f\x38\xce\x60\xd9\x5d\xfd\xdf\x25\xd1\x69\x23\xdf\xeb\xab\x97\xfc\x31\x48\xf3\x88\x7a\x2b\xda\x0f\x35\xbb\x9a\x9a\xb1\x2e\xc5\x16\x4e\xbf\x8f\x0a\xb0\x8c\xf0\xbf\x3b\x20\x7f\x7f\x19\xd1\xe3\x83\x38\xa4\x4a\x49\x56\x53\x8f\x96\x35\xa5\xbf\xfd\xba\x47\x67\xfa\xda\xc8\x29\xee\xc4\x2a\xd4\x46\x51\x6e\xe5\x52\x5a\xc1\x28\x6b\xc2\x52\x2b\x74\x79\x24\x88\x43\xba\x3b\x67\x6a\x70\x70\x20\x2f\x60\xf8\xa1\xcb\xb9\x55\xe1\xc4\xa7\x5f\xa5\xa4\x95\x39\xad\xf8\x45\x65\xf2\xa8\xa5\xf8\x2e\xb7\xe6\xdc\x87\x0c\x2b\x80\x83\x8f\x7c\x9f\x1c\x70\x16\x0a\xa5\x94\xf7\xf5\x3d\x84\x0c\xf1\x04\x9d\x5a\xee\x3b\x77\x7b\x0b\x14\xd5\x45\xbf\x9c\x75\xb4\xb2\xa4\x63\xa7\x45\xc4\x05\x71\x5e\x82\xff\xdc\x57\x23\x9b\xc0\x90\x2f\x33\x20\x75\x50\xc8\xea\x9c\xa7\xf0\x12\x5b\x7e\xce\xab\x82\x6f\x4d\x37\x3c\x33\xa4\xbf\x3e\xe4\x38\x18\x8d\x14\x61\x84\x41\x1c\x74\x46\xf8\x7f\x1b\x61\xd0\x0b\x7d\x5a\x0a\xa4\xad\x5a\xea\xb6\xd5\x8a\x51\xdd\xbd\x9c\x34\x1c\x2f\xa9\xcf\x1e\x36\x53\x46\xa2\x59\xd0\xf7\x34\x0d\x2b\x74\xcd\x9c\x2f\xdc\x1d\xd1\x74\x10\x87\x74\x4c\x3c\xae\x3c\xb4\xa6\xe0\x8e\xf8\xe5\x74\x5d\x57\x33\xae\xfd\xaa\x35\x89\x27\x4e\x41\xca\xdc\xae\xfd\x2f\xd8\x73\x43\x2a\x51\xa1\xeb\x93\x40\x1c\x3c\x05\x8e\xf7\x87\x05\xdc\xea\x8f\x58\x3b\xef\xda\xbd\xc2\xec\x94\x2a\x4e\x8a\x78\xce\xc2\xa9\x58\x6d\xac\x31\x53\x25\x7b\xac\x18\x02\x6d\x61\x06\x71\xf0\x14\x78\xcf\xa3\x74\xc8\xad\x63\xba\xb6\x6e\xe1\x47\xc0\x6e\x6b\x91\x61\xf9\xe3\x21\xbe\x36\xa1\x60\x85\x97\x74\x19\xee\xf9\x54\xe1\x1b\x88\xb8\x20\x0e\x9e\x02\x2b\x71\xdc\x4a\xd1\x3e\x57\x99\x9e\x85\x05\x6a\x2a\x18\xac\xac\x37\xae\x71\x15\xef\xb8\x0b\x0a\x2a\xb3\xbc\x2a\x7e\x3e\x95\xfa\x10\x31\xf9\x01\x71\xd0\xd9\x40\x96\xff\x3d\x01\x06\xf5\xae\xa7\xde\x25\x6d\xc3\x49\x72\xdb\x25\x97\x2b\xb0\xeb\x7a\x3d\x26\xab\xb5\x5f\x12\x9f\xb8\xb6\x1d\x85\x33\x8b\x96\xe8\x12\x7f\x78\x3e\x15\x64\x58\x41\x1c\x3c\x07\x58\x46\x63\xb2\x35\x8b\x05\xe9\xae\x47\x62\x24\xba\xa9\x13\xbd\xef\xc2\x9a\xb8\x68\x4b\x70\x73\x48\xbf\xe4\xc6\x93\xc2\x76\x4e\xa8\xba\x33\x88\x83\xe7\xc0\x30\x17\xa3\x84\x81\xb9\x5e\x3a\x91\xb3\x23\x71\x73\x8c\x46\xbf\x3e\x5d\xaf\xa0\xe7\xb4\x2c\x6d\xab\x86\x9a\x76\x74\x55\x1b\x54\xd8\x0c\xc4\xc1\x73\xe0\x1b\xc9\x75\x0f\x14\xa7\x7d\x7a\x96\x91\x0f\xfe\x13\x53\x1c\xa1\xb5\x64\xa4\xcd\xbc\x0f\x8a\xdf\x86\x13\x8c\x09\x1d\x84\x32\x13\x42\x1f\x85\x00\x1c\x3c\x07\x6c\xf5\x9e\xdf\xb4\xa2\x7a\xc0\x6f\xae\x2a\xad\xd8\x61\x14\xbf\x9a\xcc\xa7\xfb\xa6\x4b\xf3\x4e\x76\x98\x84\x71\xe3\x5e\xcf\x63\x3c\x44\x0e\x80\x38\xe8\x6c\x20\xc0\x08\x83\x86\xba\xd3\x72\xc0\xea\x45\x5a\x59\xd7\xe6\x35\xad\x70\x57\xbb\xb1\x07\xba\xcb\xe3\xd6\xa8\x37\x7a\xea\x33\xae\xf4\xd8\xd8\x29\x6f\x17\x68\xe5\x42\xb5\x02\x40\x1c\x3c\x07\xe6\x74\x1c\x73\x08\x0f\xa7\x9b\x0d\x8b\xb9\x62\xfc\x87\xdc\xff\x94\xcd\x7f\xfe\xa8\xc8\x95\xa7\x72\xa3\xe8\xb5\x11\xce\x96\x30\x74\x43\x1f\x88\x43\x3a\x27\x3e\x16\xec\x80\x99\xf6\x4b\x8d\x70\x4e\x21\x2d\xc7\xcb\x9a\x74\x92\x54\x89\xcc\xa8\x8e\xe5\x72\xe5\xb0\x32\x66\xef\xbc\x2b\x0f\x74\x4e\x1c\xc0\xc1\x73\x00\xf7\xdc\xd5\x99\x76\xf5\x3b\xf1\x47\x31\xec\x2e\x6a\x3f\xcf\x55\x09\x56\x60\x95\x0f\x12\xdf\x56\x89\xd7\x26\xf8\xf4\x47\x5f\x8c\x04\xaa\x1f\x09\xe0\xe0\x39\x10\xb7\x17\xaa\x43\xf9\x5a\xcb\x5c\x26\xb9\x2b\x71\x3e\x7e\x85\x8e\xda\x43\xeb\x1b\x83\x45\x10\x8e\x4d\xf2\x79\xfe\x0b\xac\x59\xdd\x88\x1c\x00\x71\x50\x3f\xa0\xfe\xbf\x73\x00\x34\xef\x38\x2d\x07\x5e\x16\xcb\xbc\xfb\x19\xb1\xed\x9e\xaf\xb1\x78\x27\x6f\x48\x09\x73\x3e\xed\x0f\xeb\x0d\x0e\x31\x2c\x86\x88\x4b\x76\x96\x46\x3e\xd0\x33\x05\x71\xf0\x1c\x08\x63\xc1\x68\xd8\x38\x88\xbc\x2f\x60\xd9\xca\xa8\x36\xfc\xc2\x4b\xcc\xfc\x6b\x8f\x47\x6a\x42\xb0\xc1\xa7\xee\xc3\xce\x89\x8d\xeb\x88\xb8\x20\x0e\x9e\x03\x78\x25\x6a\x95\x35\x79\xa3\xa1\xc6\x0f\x8b\xa3\xfc\xdc\xb4\xd8\x6e\x0e\x24\xae\x2f\xa8\x9f\xf0\x55\xa3\xd0\x44\x5a\x4e\x1d\x40\xff\x17\xc4\xc1\x73\xa0\xa7\x37\xd3\xd0\x11\x47\xf9\xae\x65\xcd\x0d\x3a\x89\x85\x81\x5f\x57\x8a\x13\x53\x2d\x3a\x14\x5e\x1f\xf6\xdd\x93\x2c\x12\x70\x64\x46\xc4\x05\x71\xf0\x1c\xb0\x70\x77\xa4\xf0\x27\xa6\xbb\x19\x1e\x83\xe3\x42\xbe\xb8\x34\xc6\x90\x7a\x3d\xe9\x58\x3a\x8a\x57\xe5\x79\x45\xbb\x25\xc7\x94\x23\x22\x07\x40\x1c\xd4\x0f\x00\x8c\x30\xc8\x44\x9d\x6e\x84\x05\x0b\xbe\x0f\x79\x94\xe9\xe4\x91\xb0\xc7\x70\xda\xe8\xdc\xee\x4f\xc8\x4a\xfb\x16\xb8\xca\x4f\x2a\xe8\x81\x6b\x33\xa6\x2f\x09\x55\x8d\x06\x71\xc8\x46\xf8\xb0\xa3\x3d\xd3\x88\x8f\x0b\x2f\x6e\xf4\xe6\xb8\x91\xd0\x37\xe6\x31\x76\xa1\x3a\xbe\x06\x2e\xd5\x5a\x5c\x72\x47\xab\x16\xbd\x1d\x44\x64\x10\x87\x6c\x84\xeb\x2d\x23\x77\x99\x7c\x6d\xbd\xd1\x7f\xf7\xac\x73\xf5\xd2\x6d\x33\xcb\x61\xd3\x58\x72\xea\xb0\x2d\xd9\x30\xf1\x51\x1e\xf0\xdc\x42\x44\x06\x71\xff\xbf\x11\xfe\x47\x8e\xfd\xeb\x7b\x84\x71\x0e\x89\xea\x8b\xfc\x1e\xcf\x11\xc7\x7e\x0e\xa0\xc2\x18\x91\x58\xb0\x55\xfd\x16\x19\x67\xa4\x4e\x6a\xb9\x29\xcf\x18\xe9\x9c\xf9\xb7\x11\x5e\x3a\x69\x0a\x12\xfd\xce\x33\xef\x59\xf2\xd1\xe1\xce\x3e\x0b\xf7\x43\x74\x7d\xbe\x7b\x78\x8d\x43\x59\x52\x15\xe6\x8c\xe4\x2e\x3c\x7f\xa1\x18\x6f\xe8\xba\x2e\xe0\x54\xd6\x2e\x9e\x4c\xca\x2e\xe4\xe4\xcf\xf8\x91\x52\x18\xf4\x25\x90\xf0\x72\x35\xa3\xe4\x7f\xd9\x46\xff\xf6\x5f\x33\xc2\xa0\xa6\xfd\x7d\x46\x18\xc9\x08\x5f\x54\xce\x26\x9c\x0a\xca\x8e\x6b\xe5\xd8\x1b\x2b\x31\xdb\x22\xf2\xcd\x14\x54\x7d\xaf\xae\x65\xba\xc4\xf8\xc0\xf0\xf1\xb1\xcd\xdc\x99\x2c\x56\x22\x1b\x61\xd7\x7e\xca\xa7\xf1\x36\x69\x15\x09\x51\xef\x0f\x9b\x84\xc3\x7f\x09\x27\xca\x57\x54\x63\x6b\x5c\x71\xd1\xa4\x54\xae\xa6\x1e\xa4\x3a\x93\xa5\x59\x64\x23\x5c\xd9\xfd\xe8\xe7\x1f\xfb\xcf\x36\x21\x85\x66\x17\xd4\x31\x42\x49\x13\x98\x3f\x64\x9e\x97\xad\xb8\xfd\x72\xe1\x85\xbe\x68\x09\x2d\xef\x99\xb4\x16\xd9\x08\xe7\x3d\x77\xa2\x16\xe5\x18\x0e\xdd\x57\xe6\x19\xb1\x7f\x3e\xc8\xcd\x49\xdb\x49\x98\x3f\xf1\x66\x39\xb0\x8b\x13\xe5\xc6\x96\x75\xe2\x99\xb4\x16\xd9\x08\xcf\xb2\xff\xa8\xd2\x7a\xfa\x1b\x9d\xd2\xb2\xed\x73\xd8\x8d\x36\xff\xb9\x3d\x9b\xed\xe5\xc7\xa2\xf6\x7e\x33\x25\x7d\xf8\x18\xbc\x76\x67\x66\x84\x41\x49\x74\xda\xc8\xf7\xc8\x83\xba\xdf\x3c\x79\xa9\xef\x0a\x97\xf2\x60\xce\xe7\x02\xf3\x9e\xdc\x03\x69\x03\xc1\xe9\x99\xf4\xea\x6b\xc1\xa5\xab\x04\x90\x5b\x01\x71\xf0\x91\x8f\x73\xca\x7d\x22\xe9\xb5\x40\xfb\x28\x8e\xb4\x74\xf7\xf7\x05\xfc\x48\x63\x2c\xcf\xcf\x73\x4d\x5c\xdd\x15\x72\xb4\x3f\xe2\x19\xa1\x7d\xb1\x20\x0e\x3e\xf2\xfd\xa4\xf7\x14\x23\xf5\xfd\xf2\xe6\x67\x84\x42\x9f\xbb\x6d\xdf\x4a\x8b\xe2\x65\x03\x81\x16\xfc\x10\xde\xbd\xcc\xc1\x97\xad\x8d\x12\x88\xb8\x20\x0e\x3e\xf2\x61\x3f\x71\x8a\x30\x60\x9e\x3f\xd7\x13\x53\xe1\x2a\xb2\xfa\x90\x2c\x40\xf4\x31\xd9\x2a\xc7\xb5\xfb\x38\x05\x47\x6f\xe2\x8a\xf1\x7f\x22\xe2\x82\x38\x2f\xc1\x7f\x7e\x4e\xdc\xd7\x11\x32\xed\x9f\xac\x30\x77\xfa\x42\x49\x50\x5f\xa2\x6c\xc7\xa0\x8f\xf7\x1c\xe7\x8a\xfb\x5a\xa1\xc5\x97\x93\x90\xa6\x77\x1f\x10\x46\x18\xc4\x41\x67\x84\xff\xb7\x11\x06\xbd\xd0\xa7\xa5\xc0\xef\xba\x30\x57\x2a\x2b\x56\x37\x3c\xb4\xa6\x24\xfe\x99\xdd\x24\x27\x09\xe2\x3b\xd2\xd1\xd4\xe1\xb8\x0b\x1d\xe1\x81\x2e\xe5\x90\x11\x06\x71\xf0\x14\xf0\x2b\x6d\xd9\xc7\x2f\xfd\x94\x6c\xa4\x8e\x9a\xbd\x5f\x2d\xa7\xb1\xa7\xfc\x23\x6d\xfe\x75\xdb\x83\xab\xc7\xf8\x07\x24\x24\xe6\x11\x88\xb8\x20\x0e\x9e\x02\xcd\xc4\x94\x3b\xfd\x3e\x0a\xe4\x19\x5b\x0e\xc9\xd8\x09\xe2\xc9\xb6\xdd\x34\x4c\x09\x3f\x39\xda\x3a\x56\xe8\x7f\x4f\x76\x17\x4d\x20\xe2\x82\x38\x78\x0a\xdc\xec\x9e\xfc\xf1\x71\x1f\x2d\xee\x43\xf7\x80\x74\xc3\x9f\x17\x09\xef\x87\x3c\xbc\x8c\x82\x3f\x78\xfe\xbe\x86\xd7\x6f\x75\x58\x57\x89\x88\x0b\xe2\xe0\x29\xa0\x57\xf9\xf2\x39\xc5\x4c\x0e\x31\x81\x9a\x63\x90\xa0\xb8\x63\x50\x51\xdc\x21\x2a\xb9\x97\xeb\xf2\xe7\x21\x2b\x1f\xaf\xea\xef\xa1\x88\xc9\x0f\x88\x83\xce\x06\x02\x8c\x30\xa8\x77\x3d\x75\x45\x38\x33\x5f\xc9\x45\x2e\x5c\x4a\x25\x72\x20\xcf\x7c\xd9\x27\xb0\x02\xb3\x36\xec\xb5\xaa\xdb\x4d\xcb\xe5\xda\x71\x54\xc7\x5d\xa8\x00\x19\x88\x83\xe7\xc0\xe4\x27\xe3\x55\xe9\xab\xee\x76\x28\x72\x95\x4b\x25\x18\xbf\x79\x44\x95\xf8\xa7\xad\x0c\xc5\x66\x08\xda\xf5\x3f\xe7\xe2\x8a\x93\x41\xdf\xad\x00\x1c\x3c\x07\x7a\x8c\x93\xaf\x4f\xdf\x20\x36\xa3\x15\x5d\x29\x7c\xbd\x93\x7e\xae\x98\xc1\x03\xf7\xda\x38\x96\x6d\x3c\xf5\x72\x8d\x9e\xb6\xed\x37\x68\xa2\x0a\xe0\xe0\x39\xe0\xd0\xe3\x34\x5f\xf9\x64\xc9\x83\xf8\x8f\x66\x7e\x8d\x46\xe9\x4e\x99\xdb\xfe\x55\x96\x40\x2e\x8f\xef\x99\x4c\xd8\x9e\xc9\xb4\x78\x88\xb8\x20\x0e\x9e\x03\xb8\x77\x03\xc4\x0a\x7c\xb5\xe8\x58\x7f\x97\xde\x8e\x26\x50\xe8\x5e\x2c\x76\x9b\x13\x1e\x93\xcf\x5c\xf6\x53\xfb\x1d\xf1\x3c\xb4\x0e\x91\x03\x20\x0e\x3a\x1b\x08\x30\xc2\xa0\xa1\xee\xb4\x1c\x50\x3b\xd4\xc7\xef\x51\x94\xa6\xfa\x52\x6c\x65\x25\x8e\xd2\x27\x33\x28\xba\x72\x62\x2a\x94\x56\x8a\xb5\x3b\x89\x1d\x43\x3e\x09\x9d\x92\x01\x71\x48\x5b\xa3\xfd\x7f\x57\x84\x79\xdd\x98\xb4\x8f\x5c\x32\xea\x4d\xdf\x9c\xc8\xec\x8c\x9a\xbb\x20\x4c\x48\xc3\x1e\x50\x77\xa7\xef\x9b\x08\xb4\xc2\x0a\xe2\xe0\x39\xc0\xcf\x7f\x23\x67\x21\x41\x2d\xe5\x51\x70\x41\x2d\x29\xc1\x77\xc2\xac\x71\xff\xe8\x97\xf3\x3b\x8d\x38\x7a\xc1\x36\x74\x09\x03\xdc\xd0\xc7\x1b\x00\x07\xcf\x81\x8a\x85\xfd\x8c\x1e\x51\x37\x8a\xcf\x0f\x7e\xc5\xcc\x95\xb6\xd7\x38\x97\x34\x54\x52\x0f\x7c\xa8\x5d\xc5\xd1\x42\x65\x29\xbf\x05\x7d\x0c\x01\x71\xf0\x1c\x28\x72\xbc\xef\x8c\x7a\x75\x63\x54\x09\xb7\x46\x53\x32\x83\x9e\xc0\x94\x27\xe2\xf1\x3d\xbe\xda\x9b\x1f\x7c\x6e\xc5\xd3\xa7\x36\xd4\x20\x72\x00\xc4\x41\xfd\x00\xc0\x08\x83\xe6\x1d\xa7\xe5\xc0\xdc\x38\xc1\x1e\xf1\x1d\xb7\x8b\x0d\x1f\x65\xd6\xee\xb5\x14\xbc\xdd\x94\xf8\xe5\xee\x88\x4b\x6b\xff\xb8\xe2\x86\xa2\x6d\xc6\xca\x21\xf4\xd1\x02\xc0\xc1\x73\x20\x75\x96\xe6\xc1\xeb\x95\xf4\xaf\x54\x0f\xb9\x77\x52\xaa\x72\x9e\x53\x2d\x3e\x45\x5b\xc7\xb9\x36\x9d\x9b\xa0\xe7\x67\x2f\x91\x3a\x87\x88\x0b\xe2\xe0\x39\x40\xb2\x5b\x89\xee\xc3\xc8\x33\xb1\x29\x60\x87\xfb\x67\xbe\xba\xae\x5f\xa9\x80\xed\x62\x66\xf2\x71\x48\x19\x2d\xde\xbd\x7a\x53\xa8\xc0\x1b\x88\x83\xe7\xc0\x0d\x32\x6d\xef\x7d\x0d\x89\x17\x36\x96\xc7\x47\x7b\xa1\xa4\xa9\x2d\x8e\xec\x86\xf7\x72\xef\xb7\x6c\xca\xb9\xc7\xd6\x8f\x39\x94\x22\xe2\x82\x38\x78\x0e\x3c\x7e\xb9\x95\x75\xae\xf3\x8f\xf5\x72\x64\x02\x13\xce\xdd\xfe\xc8\x37\x7b\x93\xa2\x03\x19\x75\x56\x3f\xf3\xd9\x92\xfd\x5d\x02\x4f\x10\x39\x00\xe2\xa0\x7e\x00\x60\x84\x41\x26\xea\x74\x23\x7c\x87\xce\xc0\x29\xa8\x17\xfd\xf1\xd0\x8f\x9a\x1e\xbf\x57\x3b\xcc\xfd\xcf\x64\x99\xe3\x12\x2d\xd9\x52\x89\xee\xdc\xc9\xba\x49\x27\x82\x30\x95\x20\x0e\xd9\x08\x3f\xec\x7b\x56\x24\x46\xc7\x7b\x60\xfd\xeb\xee\x4c\xda\x43\xf6\x8f\x13\xb5\x5f\xf8\xda\x42\xf3\x12\x87\xe4\x1e\x77\xf3\x31\xab\x6b\x20\x22\x83\x38\x64\x23\x1c\x72\xbc\x9e\xfe\xe5\xa9\x71\x94\x22\xb1\x61\x08\xd6\x5c\xfb\x15\x05\xd3\xa9\xa4\xa3\xae\xa6\xfa\xd6\xf1\xe3\xb8\xaa\x9d\x1c\x79\x44\x64\x10\xf7\xff\x1b\xe1\x7f\x6c\x67\xff\xd7\xf7\x08\xa7\x30\x54\xdf\x26\xe3\x7d\x50\x79\x35\x8f\xf5\xe7\xa8\xc7\xde\xe5\xfa\x7e\x83\x62\x6f\x82\x8c\xf2\xe3\xfa\x22\x7c\xda\x32\xa9\xc8\xbf\x8d\xf0\x54\x74\x35\x7e\x8a\xb8\xfe\x05\x02\x56\xed\xef\xd8\xd9\x5e\x62\xb5\x7a\x62\x06\xfc\xce\xb8\x86\x15\xef\x65\x5f\x5c\xe9\x32\xe9\xff\x0b\xcd\x57\xe4\x40\x21\xa1\x0f\xc3\x08\xee\x08\x49\xe6\xbe\xe5\x96\xe7\xc9\x39\xe8\x22\xd1\xb3\x2b\x71\xad\x57\x3a\x45\x99\x79\x7e\xe7\xbf\x66\x84\x41\x4d\xfb\xfb\x8c\xb0\x38\xdc\x2c\xd9\x6a\x30\x8c\xf7\xf5\xdb\x6f\x7e\xf7\x14\xcb\x95\x70\x62\xcc\xaf\x59\x33\x44\x79\xcb\x15\xaf\xdf\xf9\xc9\x7f\x17\xc5\x84\x40\xfc\x4c\x16\x2b\x91\x8d\x70\x5b\x5a\x61\xcb\x4d\xa9\xa7\xed\x61\x2b\x3c\x0e\xbd\x14\x54\x2a\x86\xb5\xdb\x8d\x1b\xe5\x0b\xe9\x4c\x3b\x63\x82\x4e\x44\x42\x67\x72\xa1\x10\x8a\x2c\xd2\xcf\xc6\xeb\xdb\x52\xf5\xa7\xb4\x58\x37\x7c\x13\x16\xb6\xd6\xf8\x15\x59\xf6\xb9\x84\x67\x92\xbb\x83\x50\xe4\xc5\xa0\xa4\x44\xe3\xd1\xda\x99\xb4\x16\xd9\x08\xd3\xe2\x1b\xb2\x8b\xb9\x68\x30\x7f\x6d\x6b\xe1\xee\x7a\xd7\xb2\xf6\x46\x81\x7d\xe2\xd5\x1c\x63\x83\xec\x4e\x3f\xbd\x49\x83\xa0\xd4\x99\xb4\xd6\x1e\xe9\x67\x5f\xd8\xab\xe0\x10\x5d\x68\x51\xcd\x75\xf8\x2c\x1c\xc8\x20\xe4\xc0\x1c\x37\x56\x1c\x5b\x67\x98\x78\xc7\x22\x92\x0f\x43\xae\xbf\xe6\xcc\x8c\x30\x28\x89\x4e\x1b\xf9\x9e\x2b\x67\x39\x17\xde\xd1\xd7\x68\x17\x11\x59\xb4\xec\xa7\xd1\xfa\x70\xd3\x78\xc4\x74\x79\xfa\xfe\x63\x0e\x0b\xf9\xfb\x73\x2f\xa1\xbd\x80\x20\x0e\x3e\xf2\x79\x60\xf2\xc6\x6e\x59\x70\xc9\x97\xa1\xa8\xa3\xb5\x57\x4a\xba\x8a\x72\xb1\xe3\xc8\x8f\xae\xb2\xf4\xb6\x58\x7e\x9b\xed\x28\xc3\x46\xc4\x05\x71\xf0\x91\x8f\x86\x55\xed\x6e\xee\xdc\xd5\xb4\x87\x0b\x2b\xf7\xdc\xfc\xfa\x7d\xf1\xee\x91\x1c\x06\xba\x1e\x30\x4e\xa0\x56\xe0\xc9\x13\xd1\xa4\x22\xe2\x82\x38\xf8\xc8\xf7\x6b\xea\x56\x66\xd3\x7c\xce\x56\xa1\x36\xc5\x65\xbb\xb4\xf3\xb3\x8c\xab\x17\x8c\x84\x3f\xed\xe8\x75\x8c\xd0\xfe\xfc\xb4\x13\x3f\x0c\x6d\xb9\x06\x70\x5e\x82\x28\xe7\xff\x8e\x4b\xd0\x1f\xaf\xf7\x9c\xa6\xb6\xc6\x42\xf1\x8b\x7f\x34\xb7\x97\xa9\x3b\x5d\xb6\x5d\x6d\x4c\xe5\xf2\x3b\x6b\x54\xfd\x00\xd4\x6a\x42\x84\x11\x06\x71\xd0\x19\x61\xf1\xff\x39\xf9\x01\xbd\xd0\xa7\xa5\xc0\xaa\xde\x57\x29\x5b\x25\x9d\xf1\x68\xf6\x57\x11\x28\xbc\x94\x99\x3d\xe4\xca\x76\xbe\x79\x51\xfe\x1a\x04\xf5\xfb\x2a\x92\x82\xd0\x16\x66\x10\x07\x4f\x01\xeb\xc9\xe1\x41\x2e\xb2\xaa\xad\xd9\xb5\xbc\x6e\x09\x55\xf4\x48\x0f\xbb\x32\xf7\xef\xcd\x73\x28\xd2\xdd\x92\xd4\x6e\x71\x0b\xd0\x79\x4b\x10\x07\x4f\x81\x6f\x51\xcd\x02\x17\x75\x33\x54\xf4\xd1\x46\x8d\xaa\x78\x92\x1f\xac\xa8\x7c\xca\x53\xae\x90\x60\xae\xb4\xcd\x58\x10\xe3\xb5\xfd\x03\xad\xda\x01\x38\x78\x0a\xe4\x6c\x1c\x62\xcc\x47\xfe\x7c\x31\x92\x8d\xa1\x3d\xda\x25\xaf\xf3\x4b\x64\xab\xaf\x45\x4e\x7a\x63\x69\x2e\x9b\xd2\xcc\xfb\x1a\x74\x1d\x0b\x88\x83\xa7\xc0\xec\x94\xd3\xdb\x9d\x07\x9c\x0c\x6d\xbc\xda\x6b\x4c\xc7\xb9\x7c\xca\xce\x68\x5b\xf3\xa2\xc4\x6d\x5f\x3f\x59\x8a\x10\x3c\xcc\x83\xce\x87\x82\x38\xe8\x6c\x20\xc0\x08\x83\x7a\xd7\xd3\x72\xe0\x6d\x07\x77\xaa\x7c\x97\x8a\xb5\xea\xd2\xda\x9f\x73\xc7\xc2\xd9\xb3\xf4\xfe\x04\x4a\x1b\xae\x1a\x47\xf7\x7f\x56\xf6\x6e\xed\xc7\x20\xda\x0e\xe2\xe0\x39\x40\x16\xae\x6a\x55\xc0\x2c\x90\x28\xdd\x19\xd0\x59\x72\x1e\x45\xd4\xc9\x0e\xfb\x5b\x9f\xef\xd5\xa0\xa2\xa4\x28\xa2\x3b\x26\x18\xd0\x39\x4e\x10\x07\xcf\x81\x70\xf2\x05\x49\x1e\xe1\xd7\x06\x3c\x6d\x8e\x26\x3b\x23\xae\x5a\x3e\x6b\xd2\x89\xa5\x38\x99\x95\x1e\x24\x3f\xec\x8a\x4f\xf8\x2c\x11\x71\x41\x1c\x3c\x07\xaa\x44\x2e\xca\x79\x2f\x66\x72\xfd\x11\xd0\xc7\x77\x7a\xbc\xe1\xd3\x49\x5b\xec\x5b\x15\x72\x31\x8c\xdf\x57\x59\xc7\xd5\x3d\xc6\x0e\xfa\x20\x00\xe0\xe0\x39\xf0\x64\x61\x0c\xf5\x93\xc2\x6d\x93\x83\x27\x45\x0f\x16\x2e\xaf\x0d\xdf\x78\x48\xcf\xb8\xc7\xed\xf3\x5b\x72\x47\xdd\xba\x43\x86\xfa\x39\x22\x07\x40\x1c\x74\x36\x50\xf6\x7f\xe7\x00\x68\xa8\x3b\x2d\x07\x22\x27\x3f\x9c\xaf\x9e\x21\xa4\xa4\x50\xc5\xc5\x2e\x7e\x4f\xf4\xec\xb3\x21\x56\x70\xd1\x86\x71\x8a\x9d\x7e\xc5\x91\x76\x35\x5b\x17\xa2\xed\x20\x0e\x9e\x03\x66\xa6\x34\x1a\x82\x6e\x4a\x87\xd5\x9e\xf6\xc4\xc6\x4e\xef\x18\x51\x0b\x4e\xba\xec\x95\x3b\xdd\xef\x2c\x96\x52\xb1\xc5\x94\x76\x42\x45\xb8\x00\x1c\x3c\x07\x3e\x30\x5f\xae\x1c\x53\x12\x63\xfe\xce\x6b\x67\x60\x1f\x8d\x27\xb4\xcd\x10\xd2\xc1\xdb\x1f\x48\x83\x85\xbf\x56\xda\x81\x31\x01\x15\x4c\x03\x71\xf0\x1c\xf8\xc9\x5b\xf6\x4e\x88\xd8\x84\xec\x68\xf2\xfa\x9b\xa5\xad\xe8\x4f\x3c\x1b\x64\xd7\xb3\xb3\x33\xfd\xcf\xbd\xdf\xa3\xa1\x2c\x95\x7a\x01\x7d\x6b\x05\x70\xf0\x1c\x78\x91\xdf\xad\x74\x60\x26\xab\xbe\x26\x8a\x5a\x45\xb4\x8e\x53\x28\x1a\x6f\x68\x44\x2c\xa5\x18\xca\xa1\x9b\x81\x23\x1a\xea\x36\x85\xc8\x01\x10\x07\xf5\x03\x00\x23\x0c\x9a\x77\x9c\x7a\x8d\x5a\xae\xa6\xbc\x64\x4c\x89\xad\xe0\x78\x07\xa1\x3a\x93\xc4\x1b\xc6\x1b\x9d\x7a\xaa\x1f\x7a\x1e\x77\x29\xad\x08\x24\xf4\x6c\x42\x97\x32\x80\x38\xa4\xda\x99\xbf\x65\xc9\xe9\x3f\x24\x71\x5a\xb8\xfa\x25\xd1\x7f\xb0\x1b\xa8\x14\x69\xfa\xa3\x49\x9f\x44\x52\xf1\xf3\x36\x9a\x90\xfc\x33\xa8\x6a\x34\x88\x83\xe7\xc0\x55\x74\x41\x6a\x71\x63\x99\x46\x0a\xda\xbe\xa0\xd5\x03\x25\xd4\xe5\xfc\xba\x0d\x03\x06\x71\x5c\x7c\xf2\xcb\xd3\x85\xef\x0c\x7f\x21\xe2\x82\x38\x78\x0e\xb0\x32\xc6\xb6\x09\xea\xb6\xe4\x58\xa8\x7c\xe9\xb4\xc3\x1e\x4e\xa0\x20\x92\xf4\x73\xd7\xe3\x24\xd8\xff\x1d\x25\xe7\x78\xbb\x10\xda\x15\x00\xe2\xe0\x39\x60\xaf\x30\xa5\xd6\xed\x7f\xad\x8b\x48\x93\xf6\x25\x5e\xfd\x88\x9f\xad\x33\xf1\x34\x41\x28\x15\x97\xb3\x24\x4b\xc9\x13\x7b\xba\x47\x88\x1c\x00\x71\x50\x3f\x60\xff\xbf\x8d\x30\xc8\x44\x9d\x6e\x84\x7d\x52\x56\x9e\x3e\x54\x5d\x37\xf1\x32\x7c\xca\x8f\x3b\xff\xe9\xf5\xc1\xc1\xc7\xae\x8e\xd8\xc8\x7c\x73\xa9\xaf\xa5\x2a\xb3\xc4\x6f\x11\xa6\x12\xc4\x21\x1b\xe1\xd6\x18\xda\x26\xfa\xef\x85\xd6\xcd\xcc\xad\xc1\x58\x99\xd5\x22\x93\x99\x77\x86\xa4\x8a\x92\x85\x8b\xb0\x0a\xed\x03\x33\xc8\x54\x11\x91\x41\x1c\xb2\x11\x0e\x4f\x0b\xbc\xe3\x41\x90\xdf\x80\xc9\xaf\xa4\x71\x41\xc8\x7f\xed\x86\x51\x68\xa0\x99\x4d\x4b\x53\x9b\x5d\x3b\xf9\xb8\xc4\xd7\x97\xd0\xe9\x63\x00\xf7\xff\x1b\xe1\x7f\xdc\xfd\xfc\xaf\xef\x11\xe6\x48\xa9\x7b\xf6\xa7\xf4\x77\x00\x6e\x6d\x19\x93\xab\xed\xcb\xb0\x14\x97\x0b\x77\xcc\x53\x9d\x1f\xe5\xbb\xc7\x26\x8a\x5f\xbb\x34\xf0\xb7\x11\xe6\x1d\x23\xbe\xda\x57\xdb\xf6\xaa\x98\x28\x69\x7b\x29\x39\x59\x91\x7b\x7c\xc9\xa2\x41\x9c\x80\x07\x3f\xaa\xfe\xa6\xd7\xf8\x16\xfb\x5f\xe8\x8f\x36\x77\xce\x62\xbd\x64\x41\x5c\xcd\x9b\xe2\x3a\xbf\x36\xc3\x68\x4a\xaf\xa8\x90\xcf\xd9\x74\x7a\xaa\xb6\xb9\xae\xe6\x1b\xfc\xe7\xb6\x46\x83\x9a\xf6\xf7\x19\x61\x24\x23\x4c\xd6\x84\x47\xf8\xa8\xc0\x4f\x75\x46\xf4\xd1\xd4\xdd\xf4\xa0\x46\x8e\x28\x63\xb4\xb6\x7b\x6e\xdc\x99\xb7\xb3\x3f\xcd\xf9\x6d\xa8\x9d\xc9\x62\x25\xb2\x11\xde\x68\x4f\x20\x8f\xa4\x0b\xbf\xd6\xca\xc5\x1d\xcb\x82\xe2\xf5\xba\x00\xe3\x6e\xb8\x2c\x0a\x0d\x2e\xca\x2e\xa6\x62\x3f\xc5\x9b\x8c\x33\x59\x9a\x45\x36\xc2\x17\x67\x02\x64\xf7\xef\xb2\x0d\xc6\x93\x6d\x3b\xbd\x9d\x7a\x80\xcd\xba\x1f\x37\x93\x48\xc2\x23\x93\xe3\x65\x27\x1f\xed\xaf\xc8\x70\x26\xad\x45\x36\xc2\xb8\x1a\x4d\x02\x74\xba\x62\x9d\xa2\x02\x9b\xcd\xdc\xee\x15\xc1\x2c\x86\x5a\xf4\x23\x77\xb8\x75\xc2\x14\xfb\xc7\x71\xdf\x5e\xee\x3e\x93\xd6\x22\x1b\x61\xf3\xeb\x59\x2b\xd8\x0b\x65\x96\x8e\x9b\xa9\xef\x2e\xbf\x34\xa4\x52\xd0\x63\x19\xc3\x65\xe0\x37\xcd\xa0\x14\x95\xc3\x35\xba\x2f\x7a\x66\x46\x18\x94\x44\xa7\x8d\x7c\x1d\x8e\xcb\xe5\x04\x57\xd5\xdf\xef\x0c\xe0\x84\x96\xeb\xfe\x9c\x4b\xdb\x9c\x0f\x25\x7a\x2c\x11\xea\x3e\x3f\xc1\x50\x1b\xf7\xe9\xff\x2e\x4f\x05\x70\xf0\x91\xef\x3d\xdb\xe8\x53\x72\x93\xd5\x8d\x1b\xf7\xc5\x95\x5a\x37\x8f\xee\xef\x37\xbd\xb4\x7e\xc7\x43\x8b\xbe\xde\x81\x21\xdf\xc9\x5b\x02\xed\x87\x03\x71\xf0\x91\x44\x12\x27\x5e\x5a\xfc\x0b\xee\xde\x1c\x77\xb6\x52\xce\xc2\xa8\x59\x1c\xff\x0d\x89\xa5\x58\xa2\x4d\x8d\xfb\x34\xbf\x98\xf7\x6b\x05\x10\x71\x41\x1c\xfc\xf0\xce\x77\x4c\x05\xde\x99\x57\x6a\x37\x77\x65\xf4\x6a\xcd\x7a\x6a\x16\xbf\xbf\x3a\xf7\x2e\x89\x6a\x60\xd3\xeb\xc9\xb9\xeb\x7a\xe9\x5c\xe7\x10\x71\x41\x1c\xfc\x39\x44\x92\x8f\xca\x5f\xef\xba\x15\x9a\xf9\x0c\xb5\x55\x64\x73\x9e\xd1\x0f\x4f\xf1\xc5\x0f\xd6\x78\xca\x5d\x97\x3d\x41\xa7\x24\x69\x2c\x77\xf5\x7f\xf7\x26\x9e\xa6\xdd\xfd\x16\xda\xbc\x90\x37\x82\x92\x86\x8b\x98\x76\x63\x5d\xd5\x97\xa2\x6e\x31\xdc\x8b\x23\xfd\xae\xd4\x24\xf6\xea\x53\x73\x1a\xf7\x2a\xe2\x3f\x83\x38\xf8\x7f\x7e\x76\x4e\xdb\xf7\x8e\x1f\x3e\x6d\xbe\x89\x15\x79\x92\xfd\x9e\x85\xcd\x33\xec\xca\x13\xf7\xf4\x96\xce\xeb\x2b\x2b\x5e\x2f\x36\x79\x11\x71\x41\x1c\x5c\x3b\xa5\x83\xdb\x0e\x5d\x84\x21\xdf\x66\x0a\xe7\xa8\x6f\x08\xdb\x11\x38\xb0\x5e\x77\x7f\xf5\x6b\x59\xe4\xd7\xb8\x3c\xea\x4e\x1c\x3f\xb4\xe4\x04\xe2\xe0\xda\xbd\xa9\x56\xe6\xf1\x62\xd1\xfc\xb8\x7d\xa4\x16\x94\xfe\x7b\x23\x5b\xcb\x5e\x47\xdb\x45\x45\x04\x2b\xac\x87\x31\x25\x94\xb8\x7a\x16\x11\x17\xc4\xc1\x9f\x83\x93\x0a\xa1\x63\xaa\xc1\x05\xde\x94\x2f\xfd\xcb\x29\xf7\x5c\x94\xc3\xb8\x27\xbe\x2e\x0f\xd9\x2e\x3c\x12\x5d\x1d\x56\xff\x69\x29\x8c\xd0\x0e\xd4\x9d\x9d\xa6\xdd\x7c\xd7\xad\x88\x57\xcb\x0e\xde\xf1\x1e\x46\x1b\x91\xcc\x4f\xad\xd7\x46\x1d\x24\x55\x07\x04\x1c\xeb\x6f\x5a\xb1\x84\xc6\x55\x42\x15\xbf\x40\x1c\xfc\x3f\x13\x1e\xaa\x25\x2e\x71\x9a\x3f\x0e\xb5\x78\xa1\x10\xe2\x28\x90\xdd\x63\xe3\x83\x7e\xfe\x65\xd8\x70\x88\xb7\x08\x4f\x3d\xee\x6a\x21\x22\x2e\x88\x83\x6b\x17\xd6\xa5\xb2\x33\xa9\x97\xb3\x73\xd5\xcc\x4c\xda\x72\x69\x87\xd5\x95\xe3\xe7\x42\x42\x9a\xed\xd3\x6c\x23\xfe\x42\x27\x7a\x13\xa8\x2a\x0d\x88\x83\x6b\xb7\xfa\xf2\x7e\xe9\xf7\x37\xc2\x24\x53\x49\x49\x4d\x1a\xfa\x3a\xb8\x1e\x91\x19\xef\xc9\xb6\x6b\x29\x22\x9e\x1e\xe8\xf3\xea\xee\x40\x71\x41\x1c\xfc\x39\x38\x6c\x60\xd9\x16\x59\xff\x32\xe8\xe8\x1d\xdf\x7e\xcf\xe9\x41\x13\xa8\x26\x26\xf1\xb6\x65\xf4\xb5\xf5\xbb\x3d\xad\x82\xf2\x3c\x7f\x84\x76\xa0\x31\xe1\x34\xed\xb0\xde\xd7\x93\x5b\x11\x09\x28\x8b\x7e\x49\x0e\x7d\x97\x2c\x42\xbe\x38\x29\x3c\x71\xd2\x49\xcc\xa9\x5c\xab\x67\x67\x4b\xe9\x35\x88\xf8\xcf\x20\x0e\x69\x1f\xf9\x2a\xeb\x88\x5c\x55\x74\x5f\x08\x47\xc4\x23\xb7\x8a\xb7\x49\x75\x7e\x3e\x53\xb9\x99\xb5\x37\xa7\xc7\x4e\x02\x5a\xf0\xe5\x73\xa1\x7d\xe4\x00\x0e\xae\xdd\xcf\x42\xdc\xac\xf3\x14\x9e\x1c\x95\xc9\x8e\xdc\x03\x9f\x8a\x8a\xda\xbf\xe1\x06\x54\x94\x3e\x0c\xa8\xce\xb0\x2b\xf0\xcd\x7e\x0b\xdd\x05\x03\xe2\xe0\xda\x71\x2a\xfd\x2a\xfb\x99\x7d\x8f\x7b\xb8\xae\x22\x97\xda\x97\xf9\x76\xac\xd2\xc0\xdc\x06\x77\x44\x95\xc5\x77\x67\x5c\x8c\x8a\x3b\x0e\xd0\xae\x1f\x00\x07\x7f\x0e\x9e\x4a\x4a\x2a\x46\xb5\xc2\x96\x07\xe1\xd1\x31\xc6\x81\x27\x71\x4c\x61\x62\xd8\x16\x28\xaa\x4b\x1a\x5f\xfa\x7e\x8c\x26\xf2\x2a\x21\xb4\x03\x0d\xac\xa7\x69\x97\xe2\x8a\xa2\xf1\x19\x77\x43\xa9\x60\x3b\xdc\x3c\x5c\x45\x7a\x7a\x50\xc6\xbc\x08\x93\x39\xaa\xb8\x92\x2a\xd9\x46\x53\xec\xfe\x36\xe2\x3f\x83\x38\xa4\x83\xd0\xaa\x04\x9c\x6c\x42\x09\x4e\x2a\x6f\xcb\xed\xdc\xf3\xd1\xcc\xc4\xcd\xd7\x5b\x6f\x3c\x8b\x11\x75\xc0\xe4\x92\xaa\xb6\xfb\x03\x39\x3d\x10\x07\xd7\xce\x7b\x75\x22\xfa\xd1\x9a\xd1\x23\x33\x2a\x6f\x83\xac\xc8\xcb\x29\xbb\x53\xdf\x5a\xa8\x6c\xca\x13\x9a\xfb\x12\x96\x2b\xb5\x16\xa0\x23\x3b\x20\x0e\xae\xdd\xc6\xc5\x5a\xd1\x10\xaf\x72\x0d\x2f\x36\x31\x16\x39\x02\xab\xcf\xb8\xa6\xd4\x45\x11\xc5\x23\x23\x91\x25\xee\x0f\xea\xbb\x1b\xa1\x72\xee\x20\x0e\x29\x87\xeb\x6a\x4c\x3e\xe0\xbc\xb4\xf0\x8c\x2f\x4f\xa1\x4d\xaf\x73\xc0\xaa\x0f\x16\x30\x24\x38\xa4\x55\x7b\xf3\x5c\xd8\xde\x56\x36\xc7\x5d\xf3\xdf\xcd\xee\x4f\x77\x68\x16\x62\xca\x53\x61\x57\x1e\x1a\x6f\x48\x8c\xfb\x08\x57\x45\x3f\x88\xc5\xae\xe5\xc9\xe0\xf4\xec\xcc\x89\xd1\x6c\x16\xb1\x2c\xbb\x8d\x70\x3b\x20\x0e\xd9\xa1\xbd\xd6\xa5\xf2\xb4\xb6\xf5\xd8\x52\xd7\x7a\xfb\x2a\x6d\xec\xcd\xc6\xce\xf4\x5d\xca\x94\x39\xde\xbb\x57\x71\xa9\x1e\x72\xe1\xdf\xf7\x46\x44\x06\x71\x5e\xc2\x28\x97\xfe\x19\xb9\x19\x83\x77\x05\x4d\x3e\x39\xfa\x59\xf7\xa5\x38\x1f\x4a\x1e\x69\x59\xad\x47\x3b\xc1\x53\xe3\x37\xd3\x6f\xdb\xa7\x46\xdd\xd1\x6b\x43\x44\x06\x71\x5e\xc2\xe7\x61\x4f\xe3\x5f\x97\x33\x8e\xc4\x9e\x3a\x16\x8f\xb3\xa3\xf0\x1f\x54\xac\x8a\xcf\x9c\x53\x1a\x27\xaf\xf5\x54\xaf\x9a\xf0\xf8\x40\x1b\x3f\x1e\x2e\x2d\xbc\xf7\xb7\x43\x0b\xb4\x18\x89\x18\x7d\xf1\x4c\xb7\xe6\x6b\x95\xbb\xb5\x80\xc3\x1d\xe6\xdd\x9c\x96\x92\xc1\x8c\x8c\x90\x93\x9b\x8d\xa1\xf9\xcc\x56\x7f\x3b\x23\xf1\xba\x19\x5c\x9a\xf8\xdb\x34\xf3\x4e\xe1\xb1\x7b\x64\x34\xd1\xdc\xf1\x34\x84\x61\xdd\xd9\x89\xb7\xd7\xb9\x2c\x62\xf1\x8c\xfe\x6b\x0e\x0d\xd4\xb4\xbf\x0f\xaf\x22\x39\xb4\x21\xb2\xef\xad\x52\xa3\xf9\x62\x77\x9e\x8c\x15\x2d\xb0\x93\x12\x9b\x60\x14\x36\x36\x0c\xa4\x8d\x25\xf4\x06\x38\x7d\x69\xa0\xbb\x7c\x26\xab\x68\xac\x48\xe6\xa1\x2f\xd9\x24\xe5\xe2\x6e\xc5\x33\xca\x87\x99\xa2\x8d\x7e\x5c\xfe\xf9\x3f\x6a\x43\xb2\xc9\x4a\xef\x3e\xbd\xac\x99\x79\xe8\x35\xcb\x71\x26\x6b\x86\xc8\x0e\xed\x52\x44\x5f\x76\xf1\x39\x65\x33\x95\x5b\x8b\x57\x6c\x92\xe7\x86\xf7\x7b\x0b\x2f\x14\x4a\xe2\x67\x10\x61\x0f\x28\x6b\x4f\xb9\x90\x9e\x49\x6b\x35\x90\x7e\xb6\x9b\x90\xa9\x26\x30\x86\xd7\x8a\x69\xca\x75\x02\xef\x59\xf7\x83\x59\xcf\xfb\xf5\xe1\x28\xea\x95\x25\x8f\xe6\xd8\x93\x4d\x36\x3e\x9e\x49\x6b\x91\x1d\x5a\xef\xfb\xe1\xbb\x4a\xe8\x9c\xad\x7d\x79\x6e\x0a\xcb\x87\x82\xbf\xbd\xef\xdf\x89\x39\x09\x8d\xda\xf7\x93\xe4\x3a\x1a\x4d\x19\x18\x38\x33\x87\x06\x4a\xa2\xd3\x46\xac\x78\xfa\x6b\x78\xd3\x4e\xd7\xae\x17\x47\x4b\x88\xd1\x7a\xd6\x9b\xa4\x58\xdf\x1b\xc1\xa9\xb6\xc1\x8c\xef\xd9\xeb\x27\x9a\x31\x72\x41\xf4\xd4\x20\x0e\xa9\x8a\xd3\xbc\x6d\xd2\x15\xeb\xd1\x12\x5f\x69\xd3\xe1\xd4\xce\x77\x4f\xd7\xf0\x8e\x33\x3c\xa9\x7c\x07\xf7\x3e\x5e\x70\x6c\x1a\xa8\x87\xbe\x79\x82\x38\xf8\x88\x85\xe3\x55\xf7\x8d\x7d\xd4\x8f\x24\x61\xec\xf3\x8e\xfd\xb9\x67\x3f\x89\x02\x3e\x8d\x57\x0b\x12\x6c\x7d\x29\x22\x0d\xbf\x31\xc9\x09\x9d\x5c\x04\x71\xf0\x11\xeb\x66\xd9\x94\x07\xd1\x9c\xd9\xb3\x51\x52\xec\x92\xd6\x90\xfd\x1f\xed\xb2\x0e\x72\x4c\x6a\x4e\x45\x9b\x3e\x19\xfd\x3d\x63\x3c\x50\x0d\x4b\x10\x07\xff\x96\x3a\x64\x40\xda\xef\x11\x63\x50\x1a\xb6\xbd\x55\xeb\x34\xc3\x58\xae\x78\x6e\x08\x2d\x96\x31\x0f\x35\x52\xb9\x6c\x2b\xfc\x98\x16\x9a\xe5\x83\xde\xc4\xd3\xb4\x43\xc9\x41\x53\x45\x73\xc6\xc2\xa4\x32\xfa\x7a\x12\x9a\xa9\x95\x65\x76\x8d\x87\x8c\x99\x2f\x76\xfb\xb2\x6b\x45\xa5\xbd\xc3\x17\x1b\xc4\x7f\x06\x71\x70\xed\x84\xa3\x04\x1a\xd0\x08\x93\x0a\x8d\xde\x54\xb7\xdb\x5c\xa6\x8f\x98\x0c\xd5\xc5\x52\xe3\x7e\x92\xf7\x58\x24\x24\x95\xe8\xcb\xff\xdd\x71\x04\xe2\xe0\xda\xf5\x38\x51\x0a\x95\x8b\xf1\xce\x29\xbe\x21\x6d\x27\x15\x0f\x6b\x7a\x10\xe5\xb1\xd4\x9b\xb6\x8b\xd7\x93\xe8\x4a\x6e\x1d\x8a\x01\xd5\xca\x04\x71\x70\xed\x5c\x86\xb0\x66\x4b\x7b\xd7\x9c\x84\x1e\x0b\xa5\x37\xf7\x48\xa0\x0e\xf8\x67\x3d\x15\xaf\x12\x1d\xe3\x68\x51\x26\x10\xf1\x99\x86\x4e\x9d\x82\x38\xb8\x76\x2f\x98\x7a\xcf\x8d\x73\xbf\x25\xb1\x30\xfc\xd9\xb2\x74\x4b\xe4\xcf\x5d\xd7\x97\x12\xf9\xed\xab\x33\x31\xbc\x17\x9f\xb9\xbf\x19\x49\x43\x68\x07\xea\xce\x4e\xd3\x2e\xb6\x6a\x6a\x1f\xdd\x66\xf8\x15\x65\xdb\x9c\x74\x56\x1d\x67\xfb\xbb\xc1\x8a\x6c\xe7\xc0\xc1\xa8\x90\x64\x45\x56\x22\xa2\x41\x03\xc4\x7f\x06\x71\x48\x9b\x64\x35\x73\xd6\x70\x4d\x6a\x98\xf5\x69\x64\x24\x2e\x88\x9b\xb6\xd7\xf8\xbf\x10\xab\x38\x51\xe7\xbf\x92\xb1\xe7\x28\xab\xfd\x18\xaa\x4d\x0d\xe2\xe0\xda\x71\x60\x0f\x8f\x3f\x22\x18\x94\xa7\x36\x5c\x6d\xb0\x29\x8e\xba\x1d\x56\xc0\x11\x84\xb1\xb8\x40\xd5\x90\xee\x9a\x5e\xdf\xab\x78\x0b\xaa\x4d\x0d\xe0\xe0\xda\x25\x3a\x3e\xf3\xad\xda\x98\x78\x6b\x88\x65\x2f\x6b\xf7\xcb\x08\xf7\x89\x81\xa1\x65\x4b\x4a\x69\x55\xc1\x17\x02\x82\x8f\x37\xbf\x42\x25\xb9\x40\x1c\x52\xa9\xaf\x09\x5c\x99\xd2\x89\x6d\xbc\x8f\x4f\x06\x0d\x5a\x1e\xa3\x1b\x99\xba\x08\xc5\xe8\x8e\x12\x91\xc4\xbb\x5c\xb5\x6f\x10\x2f\x1b\x43\x68\x07\x1a\x13\x4e\xd3\xee\xc0\x2b\xc2\x7b\x58\x32\x44\x25\x06\x4f\xb2\x4f\x96\x9c\xd2\x46\xc9\x56\xe7\xdc\xf6\x6e\xbf\xee\xb6\xa7\x45\xe8\xb5\xc7\x05\xd0\x5d\x68\x20\x0e\xae\xdd\xcd\x14\xbe\xd9\xe4\xbd\x11\xdf\xb2\x27\x4e\xb1\x85\x97\xc2\x38\x51\xf3\xfd\xec\x56\x57\x27\xd3\xc9\x73\x3f\x85\x1b\xe8\xac\x41\x5f\xb5\x40\x1c\x5c\xbb\x0e\x03\x2e\x91\xe8\x93\xab\x36\x8d\x84\xd3\xcb\x6b\x65\xa6\xdc\x1d\xec\x0e\x5d\x37\xcb\xe3\x87\xc3\x30\x7b\xda\x9a\xc8\x3b\xa1\xf7\x19\xc4\xc1\xb5\x33\xbd\x5a\x6a\x80\x73\xe1\x75\x0c\xb3\xb4\x44\x43\xbd\x34\xa6\xd0\x05\xaa\xe7\xf4\x34\x16\xb2\x49\x3d\x15\x13\x72\x7c\xf5\xde\xb7\x11\x71\x41\x1c\x5c\x3b\x65\x15\x34\x77\xae\x8c\xb8\x75\x32\xc9\x92\x3c\xd9\x1d\xd7\x28\x9c\xe7\xae\xd5\x77\xfc\xc3\xd1\xad\x3f\xdf\xa0\x49\x1e\xc6\xee\x40\x68\x07\x1a\x58\x4f\xd3\xee\xa9\x57\x22\xdb\x37\xad\xe0\x5a\x1d\x92\x13\xdc\xf4\x9f\x62\xf8\x53\x7a\x8d\xf4\x4a\x3f\xd9\xf9\x43\x26\x3c\x8f\x4c\xf7\x3e\x42\x9b\x52\x41\x1c\x5c\xbb\xb6\x29\x4f\xea\x24\xab\x3c\x73\x65\xfc\xc2\x77\xec\xee\xf6\x53\x5c\x0b\x16\x92\x33\xab\x6f\xfc\x4a\x5e\xbe\xa5\xa4\x7c\x9c\xbf\x82\x88\x0b\xe2\xe0\xda\x6d\x9f\x67\xd8\x3b\x34\x4a\x98\xd1\x6d\x24\x3f\xc7\xf0\x7b\x9d\xd3\xcb\x3f\x00\xaf\xd7\x14\x2b\xb5\x92\x9a\x57\x84\x48\xe4\x12\xb4\x81\x18\xc4\xc1\xb5\xbb\xd8\x2a\xea\xc1\xc0\x7d\xbd\xed\x98\x0e\xf3\x17\x9a\xda\x3a\x8d\xb4\x44\xe6\x2b\x1a\xbc\xe2\xf7\x32\x2f\xfd\xff\x7c\x1e\x7d\x00\x1d\xa8\x00\x71\x70\xed\xc6\x99\xb5\xed\x36\x57\x48\x76\x0c\xdc\x39\x87\x34\x2e\xa2\x90\x0d\xdb\x3b\xa8\xa7\x07\x6e\x8c\x9e\x34\x58\x44\xe4\x5f\x16\x1d\x44\x38\x34\xd0\xec\xfe\x74\x87\x76\x69\xad\xcf\xe7\x76\x4f\xa5\x3f\x6e\x8f\x47\x56\x54\xad\x7b\x75\x7e\xcc\xe6\x62\xb0\x0e\x89\xee\xfc\x93\xcc\x5b\x9f\xbc\x7b\x4a\x10\x6e\x07\xc4\x21\x3b\xb4\x67\x9e\xeb\x9d\xcf\x50\xd5\xfa\xb6\xdc\x37\x0f\xb7\xf8\x49\xfd\x96\xa7\x8a\xe3\x94\x5d\x9b\x1c\x4d\x44\xd1\xe3\xfc\x75\xaf\x68\x23\x22\x83\x38\x64\x87\xd6\xd9\xa6\x90\x99\x7f\xee\x38\xe3\x45\x38\x85\xff\xfe\x62\xbd\xf8\xdd\x24\xcf\x98\xe2\x5f\x71\x0f\x50\x72\xbe\x52\x3f\xf2\xd6\x82\x4e\x55\x82\x38\x2f\x61\x6a\xd8\xd3\xf8\xd7\x75\x76\xe3\x65\xab\x92\x7f\x95\xbc\xb9\xc7\xf1\x36\x66\xa6\xdb\x8e\x67\x6e\xff\xab\xa5\x4a\xd2\x93\xf6\x37\x18\x26\xb7\x27\x2c\x5e\x87\xc7\xff\xed\xd0\x1c\x65\xd4\x0a\xaa\x42\x99\x68\x72\x3c\xbd\x49\x09\x08\x8f\x37\xcd\xd4\x78\xaf\x63\x61\xc8\x99\x1c\x8c\xda\x2f\xb2\x25\xa6\x67\xff\xbd\xdc\x16\x49\xc1\xe2\xdf\xf6\x46\x97\x74\x51\xe9\x16\xb3\xf3\xec\x86\x73\x4b\xd9\x22\xd1\x13\x66\x49\x75\x19\xec\x07\xae\x06\x17\x2b\xff\x6b\x0e\x0d\xd4\xb4\xbf\x4f\x55\x22\x39\xb4\x4d\x0c\x87\x4b\x0d\x59\x02\x68\xbb\x6a\x94\x97\x67\x87\xb2\xa7\x28\x50\x9e\x76\xce\xd9\x87\xe2\xcc\xd3\xfc\x98\xe7\xad\xff\xfd\xe5\x4c\x96\x77\x90\x1d\x5a\x82\x4a\x78\x45\x24\xc6\x34\x63\xeb\x92\xf7\x93\x09\xd9\x01\x94\x5e\x62\xc9\xa1\xbd\xf9\xa8\xdc\x76\xec\x72\xbb\xf3\x63\xa4\xee\x67\xb2\x98\x85\xec\xd0\x32\x37\x04\x3b\x0e\x85\x48\xe3\x9e\x71\x33\x6c\x17\x95\xa8\xbd\xa9\xcb\x45\x7d\xff\xcc\x4d\xb8\x55\x6b\x94\xb1\x39\xad\x52\x0f\xf7\x4c\x5a\x8b\xec\xd0\x32\x76\x5c\x12\x17\x75\x8f\x25\xd6\xcf\x57\xbb\x0a\x5b\xda\xd0\x5a\x2b\x26\x7e\xde\xf9\xe5\xb6\x17\x3c\xf3\x61\xe2\x89\xe9\xdb\xd5\x33\x69\x2d\xb2\x43\x7b\xce\x9f\x1a\x6e\xf1\x6e\x1e\x7b\xe2\xf6\xb5\xd4\xfa\xf5\x21\x7f\x8c\x16\xc1\xde\xa8\x4f\x96\x9f\xdc\x3e\xb6\x3e\x65\x71\x9c\x7e\x73\x66\x0e\x0d\x94\x44\xa7\x8d\x58\x04\x21\xbf\xd7\x6d\x07\x9e\x9d\x4c\x88\xac\xce\x78\x13\x91\x09\xbe\xb5\xe7\x2e\xf3\x89\xa2\x6a\x9d\x9f\xb6\x5a\xf1\x30\x31\x84\xca\x0b\x81\x38\xf8\x88\x45\x15\xfe\x43\x96\x49\xaf\x50\xf9\x4f\x53\xd4\xe7\x5b\xdc\x45\xfe\x98\x5b\xb8\x1b\x57\xd1\xf9\x1e\x73\x6f\x0a\xf4\xd3\x5f\x72\x86\x6e\x5e\x05\x71\xf0\x11\x4b\x13\xd3\x61\x6b\x73\xc0\xc2\xab\xe6\xdd\x5a\x09\x1a\x29\x56\x38\xfd\xc9\x6f\xef\xfc\xdf\x92\x4c\x86\x2a\xb4\x18\x91\x8c\xe7\xa0\xab\xd6\x40\x1c\x7c\xc4\xc2\xff\x3d\xc3\x6c\x79\xfc\x95\x40\x54\x9c\xce\x8e\xb5\x33\x9f\xa9\xec\x76\x3f\x6f\x45\x0b\xd7\xa3\x67\x01\xab\xb6\x83\xbc\xa6\xd0\xac\x0b\xc4\xc1\x2b\xd7\xe3\x50\x7e\xac\x7b\xe3\xe3\x13\xfb\xf8\x6a\xf3\x35\xcc\xe5\x6f\x82\xae\xf3\x4f\x33\x18\xef\xd2\x4f\xda\x1a\xb9\x11\x2b\x7f\x7f\x05\xcd\x36\x40\x6f\xe2\x69\xda\x71\xe2\x35\xec\x70\xb4\x5f\x94\x27\x89\x1c\x6e\xfc\x63\xe2\xbf\xf0\x5c\x31\xb8\xb6\x45\x49\x5e\xe9\xb3\x46\xe3\x37\x0b\xc6\x1f\xd0\x46\x60\x10\x07\xd7\x6e\xf4\x61\xc3\xf0\xcd\xf7\xb8\x3a\x4c\xdf\x70\x64\x63\xe6\x5c\x94\x5e\xbc\xdf\x13\x3e\x8f\x89\xd1\xec\xa4\xb9\xdf\x9f\xd7\xfb\x0e\x1f\x11\x17\xc4\x21\xad\xc3\x98\xf8\xc4\x68\xed\x5c\x78\x77\x93\x25\xee\xd1\x6f\x92\x73\xf2\xc6\x91\x89\xdf\x0b\x05\x62\x7e\xec\x0f\x31\xbc\xcb\x77\xc0\xbe\x08\xad\xc3\x00\x38\xb8\x76\xe1\x99\xb5\xa6\xca\x69\x41\x41\x52\x6d\x2b\x23\x6f\xf6\x4d\x9e\x5c\xdf\xeb\xa0\x4b\xa1\x99\xde\xc9\xc7\x73\x55\x68\x09\xbf\x05\x15\x89\x05\x71\x48\x97\x10\x25\x19\x85\x95\x9d\xbf\xd5\xfc\xb3\x76\x66\xbc\x4d\x65\xe6\xe5\x04\x35\xb6\xd7\x1e\x3e\xf7\x7c\x81\x7d\xd9\x47\x1b\x01\xf1\x4e\x84\x76\xa0\xee\xec\x34\xed\x48\x66\xc8\x8d\x24\x2a\xee\x51\xa3\xa3\x5e\xf3\xc2\x9e\xc1\x69\x26\x6e\x6e\x62\x67\xc1\x17\xf0\x6b\xbc\xa1\xd0\x52\xea\x78\x0b\xda\xb9\x07\xe2\xe0\xda\xd5\xcf\x28\x17\x69\x37\x9e\xdc\xaf\x94\xfa\x73\xb1\xb4\x02\xe5\xd7\xcf\x93\x94\xbe\x3b\x09\x57\x86\xd6\x2c\x2e\xe6\x5c\xb8\xe2\x04\x3d\x63\x10\x07\xd7\xae\x62\x8a\x66\xa6\xf6\x59\x3f\x61\xda\x49\x8c\xdb\xd6\x57\xde\x90\x12\xcd\x84\x45\x17\x06\xea\xe6\x5f\x89\xf1\xbd\xb6\x24\x0f\xa1\xcd\xd6\x20\x0e\xa9\xf0\xa4\xcd\x43\x35\xd1\xf0\x3f\x9e\x2b\x7a\x58\x0c\xef\xcf\x67\xe8\xcc\x2f\x05\xcb\x32\x11\xe3\x1b\x45\x5f\xb9\x7d\x2c\xad\x43\x99\x0d\xed\x34\x04\x70\x70\xed\x7a\x1b\xb5\x0b\x8e\x04\xf6\x65\xa2\x65\x29\x73\xeb\x09\xe8\x29\x5a\x8d\xb6\x7a\x29\x4e\x7a\x17\x09\x37\xc4\x52\x6d\x5c\x5f\x69\x22\xb4\x03\x8d\x09\xa7\x69\xb7\xef\xab\x43\x4b\xd2\xf1\xfe\xdb\x8b\x8a\x3a\xa2\xaf\x05\x77\x14\xd0\xc5\x6f\x7d\x12\xeb\xa5\xd1\x88\x58\x77\x6a\x64\x97\x67\x4d\x47\xfc\x67\x10\x07\xd7\xee\xc9\xf2\xc0\x48\x87\xcd\x9c\x16\x56\x20\x51\xa8\x6b\xcf\x48\xdf\xc2\xac\x5f\xc4\xcc\xe1\x43\x03\x8a\x8a\xef\x86\x63\x65\x27\x01\x88\xb8\x20\x0e\xae\x5d\xc9\x6b\x14\xd5\xd5\x88\xb6\xba\x85\x9b\xc5\xc5\x31\xc2\x54\x0b\xb4\x21\xbf\xcd\xb2\xa8\x8a\x06\xf0\x0e\x3c\xb5\xde\x87\x18\xde\x41\xc4\x05\x71\x70\xed\xbe\xdc\x64\x58\x7c\xad\x4c\xc1\x36\xba\xff\xe6\x6a\xaf\x19\x6d\xe9\x58\xe1\x28\xe1\xf1\x87\xb9\x85\x87\x95\x6a\x34\xda\x87\x9e\x50\x01\x5d\x10\x07\xd7\xce\xfd\x85\xe8\x6b\xe7\xfa\xbb\xd7\x73\x24\x1e\x62\xcf\x09\x7e\xf4\xda\xd2\x4c\xc1\x0e\xc1\x46\x19\x6c\xb5\x77\x31\xa1\xea\x64\x10\x42\x68\x07\x1a\x58\x4f\xd3\x0e\x7f\xcd\xe8\x43\xc2\x35\x4b\x11\x1a\x53\x94\xec\x70\x8b\x7a\x11\xe7\x5b\xf8\x87\x02\x0a\x72\x3b\x91\x41\x2f\x7f\xf3\x5e\x94\x73\x86\xfa\x79\x00\x87\x74\xc5\x30\x0e\x06\xc6\x97\xcb\xd2\x43\x4d\x1a\x5d\x31\x03\x8a\x49\x1b\x1d\xaf\x0d\x78\x02\xde\x74\x70\xb0\xd5\xa8\x28\xcc\xe7\xa6\x43\xd7\xb5\x82\x38\xb8\x76\xba\x42\x95\x11\xc5\x47\x28\xd1\xdf\x1a\x1e\xbe\xd7\x52\x46\xbb\x22\x75\xef\x58\xe8\x21\xda\x45\x91\x77\x12\x4f\xb9\xf1\xe8\x96\xa0\xff\x0b\xe2\xe0\xda\x79\x0b\xaa\xe9\x5b\x53\x05\xfe\x4c\x71\xe7\x8c\xed\x2c\x74\xcb\xf1\x3c\x92\x97\x2f\xed\xae\x65\xec\xfb\x3d\x75\x78\x43\x1e\x35\x14\x5a\x9b\x03\x70\x70\xed\x58\x6f\xb0\x70\x30\xec\x52\xf0\xbc\xba\x7b\xa5\x3d\x70\x48\xe9\x05\x47\x5f\xe9\xfc\x6d\xd4\xf6\x0f\x25\x6a\x1b\xb4\x44\x66\x4b\x77\x11\x0e\x0d\x34\xbb\x3f\xdd\xa1\xa9\xd8\x8d\xf0\x8a\xeb\xee\xc9\x68\x9a\x6f\x4b\x2c\xa7\x8b\x59\xda\x30\x50\xd9\xba\xb5\xb3\xed\xf7\x90\xc8\x6f\xc6\x45\x49\x43\x0e\x0d\xc4\x21\x3b\x34\xa1\xb0\xdc\xa4\xad\x42\x46\xd1\xf2\xcd\x60\x34\xea\xe2\xd7\x14\x5d\x0e\xcf\x2f\x05\x1c\xa5\xcb\x1b\xa2\x0c\xc4\xf8\xe1\x33\x41\xa5\x65\x41\x1c\xb2\x43\x5b\x77\xba\xf9\x42\xf3\xcb\xee\x8c\xff\x36\xfe\x1b\xe1\xd7\x1f\x7b\xce\xd1\x7e\xee\xbe\x24\x1c\x51\x7c\xee\xce\xc5\xf7\x17\x7e\x1c\x40\x57\x82\x82\x38\x2f\x61\x77\xd8\xd3\xf8\xd7\x05\x60\xa7\xdd\x85\x92\x2d\xdd\x77\xde\x3b\x56\x1c\xf3\x3e\x7a\xee\x87\x6f\x89\x19\x60\xc3\xc5\xc2\x51\x2e\x57\xfc\x6b\x24\x7a\xa7\xeb\xfb\xdf\x0e\xed\xbb\xe5\x64\x4f\x2c\xff\x7e\x8c\xe7\x6c\x28\xd9\xb3\xcf\xd5\x0a\x0e\xf3\x87\xbe\xb7\xf0\x56\x5c\x4e\x26\x2b\xd9\xe3\x71\xb1\x3e\xfc\x85\x16\x8e\x86\x6c\x5c\xf8\xcd\x92\x64\xd4\x68\x94\x7e\x43\x5d\xc4\xb7\x6b\xd8\x20\x8b\x8e\x44\xa1\xbc\xf7\xb0\xae\xa6\x3e\x82\x57\xe8\xbf\xe6\xd0\x40\x4d\xfb\xfb\xb8\x9f\x04\x7c\x16\xaf\x57\xfb\xcd\x77\x7a\xd3\x54\xa1\xbb\x6c\x96\xd0\xff\x35\x8d\xef\xb7\x4e\x42\x7c\x5e\x07\xc7\xe0\x75\x0c\x17\x2b\xfb\x1f\xa4\x3f\xce\x64\x79\x07\xd9\xa1\xcd\x79\x90\xde\x78\xb1\x54\xa9\xfa\x29\x8b\x91\x20\x95\xf9\x71\xb3\xf9\xa5\xa5\xfa\xf0\x76\xb3\x5b\xf3\x99\xbb\xa3\xb3\xb1\x6e\xd7\xce\x64\x31\x4b\x0e\xe9\x67\x9b\xea\x94\x3d\xda\xb9\x96\xde\x8f\xa4\x7c\x59\xc9\xc9\xdc\x11\xc1\x3b\x9c\x57\xf4\x5e\xe3\x16\xaf\x92\xb3\x0f\x77\x4d\x15\x46\x3d\x93\xd6\x22\x3b\x34\x02\x76\x7d\xb2\xd8\x11\x7b\x9c\xad\xab\xd3\xbb\x73\xab\x38\x7d\x2b\x21\x17\x56\x12\x05\x2b\xd3\x4b\xd8\x5f\x2d\xc9\xee\xdc\x57\x38\x93\xd6\x3a\x20\xfd\x6c\xb1\x82\xe5\xad\xc1\x10\xed\x1a\xd3\x96\xa9\x39\x27\x63\x0b\xd9\x87\x81\xbb\xcc\x74\xfc\x39\x42\x53\x15\xb3\x82\x23\x8c\xcf\x8f\xce\xcc\xa1\x81\x92\xe8\xb4\x11\xab\x1e\x9b\x8e\x67\xae\x51\xb1\xb2\x72\xed\x96\xef\xca\xda\x7c\xb0\xd1\x6d\x07\x7e\xab\x5c\xba\xe3\x9d\x5f\xef\x4b\x46\x32\xb9\x21\x67\x02\xe2\xe0\x23\x56\xd2\x45\xaf\x19\xbc\x3b\x2f\x5f\x91\xfb\xca\x38\xff\xb6\xa7\xea\xfe\xb9\x5b\xa9\x25\x6e\xf8\x83\xb9\xf3\xd8\xfd\xd9\x48\xff\xd6\x05\x44\x5c\x10\x07\x1f\xb1\xf2\xf2\x67\xb4\xa8\xd2\x8b\x62\x18\x2f\xad\x3d\x7f\x8f\x26\x34\x6d\xe8\xf6\x0d\xdf\x76\x9f\x64\xdd\xa2\x7d\x3a\x59\xf2\xf3\x21\x74\x5d\x05\x88\x83\x3f\x87\xdc\x98\x23\xc2\x5d\x79\xb4\xa9\x2d\x5a\x07\x7e\x46\xb6\xe1\x3b\x3f\x97\x1c\x97\x0f\xb5\x07\xfb\xf7\xf8\xbf\xbd\xf9\xfc\x1a\x07\xba\xbc\x1b\xc4\x79\x09\xa2\xff\x73\x4d\x83\x32\xec\xfb\xba\x5a\xd7\x17\xb6\xf9\xb5\xf1\x24\xa2\xf8\xeb\x0f\xa8\x2a\xe9\x1a\x14\xb7\x23\x6a\xda\xd3\x0a\x0e\x87\x34\x82\x10\xb3\x0d\xd0\x9b\x78\x9a\x76\x9a\x5d\xaa\xe5\x98\xea\x47\x6f\xac\x38\xac\x7e\x04\x3e\x4f\x16\x72\x62\xe8\xc2\x31\xff\x45\xd7\xeb\x94\xb4\xb8\x7d\x5f\xfa\x17\xf4\xcd\x1d\xc4\xc1\xb5\x3b\xe9\xa6\x9d\xc1\x62\x6c\xab\xb5\x1b\x65\xdb\xc8\xe0\x74\x75\x16\x5e\xc3\xb3\xe4\x90\xcd\x7e\xc1\x20\xfe\xab\x27\xc6\x82\x02\x8a\x0b\xe2\xe0\xda\xb1\xbf\x4c\x3a\x77\x51\xce\x7a\xc9\xf0\x4a\x63\x63\x81\x87\x6e\x7b\x07\xa1\x8d\x50\xac\xf7\xc1\xe2\x0c\xd9\x09\x2f\x4e\xb4\xa5\x26\x22\x2e\x88\x83\x3f\x07\xdc\x8f\x18\xbe\xfb\x1e\x16\x07\x9a\x9d\xc7\x83\xa4\x9c\xe6\x5c\xec\xb7\x50\xd0\x51\xef\xeb\x73\x12\x18\xfb\x46\xbc\x39\xf8\x32\x0d\x55\x6c\x04\x70\x70\xed\x92\x73\x0b\x51\x0b\x74\x96\x0a\x2f\x35\x6f\x79\x16\x31\x25\xc7\x96\x4c\x5c\x97\x32\xb9\x9c\x9b\xdc\x5d\x3b\x67\x87\x52\x6c\x95\x89\xd0\x0e\xd4\x9d\x9d\x7a\xb6\xea\xdc\x7d\x34\xbe\x42\x32\xab\x18\xaa\x43\xd5\xef\xfc\x6c\x25\xec\x94\x99\x99\x41\x15\x9b\x9a\x41\x71\x92\x37\xd6\xb9\xae\x41\xe7\x49\x40\x1c\x5c\xbb\xe7\x9f\xc3\xa4\xee\x39\x8c\x53\x58\xcb\xf1\x91\xf9\x6e\x60\x14\x3c\x29\x72\x15\xbf\x46\x80\xf1\xc1\x85\x93\x62\xfa\x83\xfa\x23\x2f\xe8\xf8\x2e\x80\x83\x6b\x27\xbe\x1c\xf5\xcc\x9b\xb2\x04\x1d\x8d\xf0\xe3\x76\x93\x7a\xb6\x7b\xb6\x48\x6f\x3b\xc5\xc0\xc7\xef\x0b\xfa\xbb\xf9\x92\x84\x25\x1d\x88\xb8\x20\x0e\xfe\x1c\x6e\x93\x34\x38\x85\x71\x0a\xd8\xdd\xaf\xbe\xf8\xe7\xfd\xfa\xd5\x9d\x46\x55\x91\x4b\xd1\x8e\x3e\x1e\xcc\x4c\xdc\x57\x58\x26\xf3\xa0\xba\x5b\x20\x0e\xae\x9d\xb9\x70\xa1\xde\x5d\xac\x17\x49\x4b\xde\xa1\x6a\xf5\x72\x5f\x58\xf7\x84\x85\xa5\x39\x6f\x3c\xd3\x21\xf2\xde\x48\xbb\xfe\xf8\x8d\x34\x42\x3b\xd0\x98\x70\xaa\x76\xae\x5d\x23\xc3\x13\xcb\x83\x93\xb1\x5d\x52\x99\x33\x69\xec\x15\x03\x8f\xf6\xa2\xb4\x3a\xdf\x5e\xf1\xc7\xb1\xb6\xa2\xc4\x7c\x0b\x69\x07\xe0\xe0\xda\x95\xd6\x18\x11\xae\xbe\x96\xc5\x6e\xa6\xb2\x49\xf9\x4c\xff\xc2\x7f\xe6\x15\x9b\xbc\x52\x12\x75\xd0\x9a\x96\xce\xe8\x22\xed\xd5\x06\x44\x5c\x10\x07\xd7\x0e\x5b\x61\x91\x27\xda\x7c\x21\x4c\x2e\x2f\x6a\x92\x8d\x56\x93\xc0\xf5\xe6\x48\xea\x20\x55\xa4\x7b\xc5\x2d\xf7\x77\x0b\x84\xaa\x90\x76\x20\x0e\xfe\x1c\xec\x1a\x8f\xf0\xff\x04\x6c\x53\xf4\xbd\x11\xde\xb9\x2c\x12\xdb\xcd\x98\xbb\x8f\x21\x98\xaf\x25\xf3\x09\x77\x5c\x9f\x24\x15\x37\x0f\x11\x17\xc4\xc1\xb5\xbb\x34\xb9\xe6\x97\xb1\xf8\xad\x02\x2f\xbe\xfb\x71\xb5\x5c\x94\x09\x35\x39\x89\xb3\x34\x5d\xc1\x6a\x8b\xa5\x24\x03\x77\x0f\xdf\x3e\x42\x3b\xd0\xc0\x7a\x9a\x76\xe9\xfb\x36\x43\xda\x02\xbf\x0a\x3d\x0f\x5b\x0d\x77\xb8\x19\xd2\x3b\xf0\x3f\x90\x9d\xa7\x7d\xf7\xd6\xf6\xea\x8d\x2d\xd5\xc2\x78\xa8\x62\x28\x88\x83\x6b\xc7\xbb\x3f\xf7\xa7\x2b\xac\xca\x9c\x85\xe1\xa3\x91\x99\x94\x44\x12\x1b\x6e\x93\x69\xf8\xb1\x8d\x5b\x35\x4e\x84\xf6\xb5\x30\xb2\x44\x44\x5c\x10\x07\xd7\xae\x92\x4b\xac\x6c\xd1\x15\x4d\x5a\x82\x9a\xf3\x91\x79\xd2\x97\x19\x61\x12\xeb\xb2\xf7\xf2\x43\xdb\x59\x26\xce\xba\x02\x8d\xfd\xd0\xd9\x66\x10\x07\x7f\x0e\xad\xba\x97\x4c\xd6\x03\x85\xb5\x5e\xa8\xc7\xe6\x3b\x49\x5e\xa7\x6e\x23\xfb\x11\xda\x53\xa4\x3c\x15\x45\xec\x6b\x36\x72\x27\x45\x09\x11\x17\xc4\xc1\xb5\x3b\x54\x0e\xbe\x2c\x95\x29\x79\xcd\xb0\x2c\x39\x6f\x40\xf4\x38\xe6\x24\xd2\xf7\xbc\x21\x49\x83\xa5\x83\x73\x96\xd5\x61\xf6\xbe\x2f\xc2\xa1\x81\x66\xf7\xa7\x3b\xb4\x50\xcd\xaa\x67\x82\xe1\xa6\xbd\x6f\x5b\x94\x49\x1c\x36\x0e\xa9\x65\xe9\xcc\xd8\x0e\xf8\xcb\x26\x43\x35\x2e\x29\x1a\x95\xaa\x9b\x22\xdc\x0e\x88\x43\x76\x68\xed\x9b\xc1\x62\x09\x97\x37\xf3\xc8\x92\x16\x8f\x70\x39\x72\xe7\xe9\xaa\x5a\xc5\x09\xe3\x16\x6f\xb1\xf6\x96\x44\xe7\xa9\xdf\xa4\x46\x44\x06\x71\xc8\x0e\x8d\x6e\xe8\x07\x7d\x95\x63\xb4\x8c\xef\xad\xe5\x5f\x06\xf1\x2e\xfd\xb9\x6c\x8b\x2a\xd3\x03\x82\xfb\x63\xf7\x58\x7b\x1c\x95\x94\xa0\x5d\x8e\x20\xce\x4b\x18\x05\xed\x9f\x91\xff\x75\x65\x52\xc5\x2b\x35\x22\x1d\x44\x46\xab\x5f\xae\x04\xd9\x9d\x78\xd8\x35\x90\x45\xf6\xb1\x6b\x3c\x7c\x47\x6b\xd7\xe9\xee\x1d\x6b\xeb\x5b\xfd\xb7\x43\xab\xb7\x4a\x4b\x10\xc9\x9a\xcb\xe6\x25\x47\x7b\x90\x70\xf9\x53\xe8\xb0\xff\x52\xf3\xf5\xcb\x0a\x16\x97\x0f\xaf\x87\x7a\x27\xe8\x92\xff\x85\x9e\xff\xac\x50\xc8\x32\x3c\x6b\x70\xc1\x9b\xb9\xdb\xab\x85\x28\xd7\x95\xdd\x94\xc7\x40\xc8\xf3\x4a\xc0\x9d\x4e\xfe\xdf\x6f\x4e\xee\xff\xd7\x1c\x1a\xa8\x69\x7f\x9f\x43\x43\x72\x68\x09\x09\x23\xbf\x8c\xc9\xb7\xd4\xe2\x3c\x3f\x98\xcb\xd3\x54\x6b\x66\xde\xea\x7a\xad\xfc\x88\xfe\x52\x89\x34\x56\x8d\x51\x8c\xfa\xd9\x9c\x43\x43\x76\x68\xc3\x06\xca\x3a\x66\xab\x96\xc9\x57\xdc\x31\xbc\x7b\xaf\x8e\x36\xdc\x41\xd5\x97\xb5\xa9\x63\x15\x52\xaf\xb2\xb0\x4a\x0c\xc4\x3a\x93\x4b\x2b\xf8\x91\x1d\x5a\x84\xe1\xe3\x41\x0d\x0f\x7e\xb9\x20\xa9\x40\x6f\x7f\xb2\xf7\x1f\xe6\xec\x94\x2e\xe3\xcc\x5d\xf1\x1c\xad\xad\x7f\xf0\xe9\xe6\x9a\xf6\x99\xb4\x16\xd9\xa1\x55\x0f\xf9\x31\xe9\x6c\x61\xae\x60\x3f\xe6\xc7\x26\x9d\x7c\x97\x25\xdc\xf1\xe7\xfb\x47\x61\x8f\x29\xf7\x2f\xac\x6a\xa9\x81\x6a\x57\xce\xa4\xb5\xc8\x0e\xed\x01\xfd\xf5\xa4\xee\xda\xf2\xd2\x92\x79\x51\x9a\x5c\xa7\xef\x2d\x98\x1d\xeb\x3d\x55\xd8\x16\x4b\xd8\x86\x9f\x0d\x0f\x5d\x27\xcf\xe0\xf8\x9b\xfa\xbf\x4b\xa2\xd3\x46\xac\xe3\x9c\x43\x49\x8f\xad\x94\x23\x2e\x5e\xba\x0d\xbb\xa9\x8f\xa5\x4e\x33\x1e\x72\xbd\x1f\xce\x05\x71\xf3\xf2\x4f\xc8\x2c\x63\x0d\x21\x7a\x6a\x10\x07\x1f\xb1\x1e\xb5\xbb\xc9\x07\xb1\x1f\xe6\x5d\x12\xcf\xee\xa5\xfd\xee\xda\xf6\xc6\xc5\x48\xd6\xb3\xc0\xe6\x42\x54\x2f\x33\xf9\xed\xf6\xc8\x05\xa8\xe2\x29\x80\x83\x8f\x58\xf7\xc3\xd3\xaa\x8a\xc8\xe6\xbb\xd0\x6b\x3f\x3c\x1c\xae\x1e\x74\xbd\xf6\x34\x44\x5b\x8e\xd6\x35\xfc\xe1\xca\x5e\x81\x0c\x6d\x03\x1b\x74\xf6\x0a\xc0\xc1\x9f\x83\xfb\xd0\x96\x65\x54\xcf\x84\xb4\x3e\x6b\x97\x82\xd3\xe5\x30\x2f\x12\x3f\x79\x26\xee\x68\xb3\x01\x01\x54\x9b\xb0\x5f\xbf\x5d\xa4\x11\x71\x41\x9c\x97\xe0\x3f\x6f\xfc\x45\x99\xf5\xa2\x4a\xc6\x69\xce\xc0\xdf\xa7\x9c\xc2\x0f\x5d\xa0\x3e\xb4\xf2\xf8\x39\x75\x47\x8e\xda\xa2\xa9\xb4\xe4\x9c\xb3\x16\xf4\x2d\x1f\xf4\x26\x9e\xa6\x5d\x8b\x47\xb7\xc6\xbb\x62\x46\x2d\x92\xf3\x24\x5b\x0f\x0a\xb2\x9a\x31\x45\xc2\x85\x46\x8c\x6a\x08\xb1\xaa\x54\x24\x31\x88\xbd\xa0\xf2\x69\x20\x0e\x49\xbb\x8b\xf4\x16\x06\xbf\xd8\xbe\x79\x5c\x0c\x8c\x2c\x23\xf9\x39\xeb\xc5\xb6\x8f\x17\x10\xfe\xce\x58\x2f\xe0\x2a\x8d\x81\x81\x2d\xb4\x43\x15\xc4\xc1\xb5\x9b\x9b\xe5\x90\x15\xb6\x2d\x1d\xc2\xda\x38\x9a\xcf\x0f\xe8\xb1\x74\x25\xde\x0f\xff\x22\xee\x65\xf4\xbd\x04\xc5\xe8\x84\xd6\xe1\xff\xca\xde\x01\x38\x24\xed\x62\x7f\x46\x32\x5e\xd5\x34\x49\xc3\x77\x23\x3b\x70\xc6\xab\xb9\x35\x8f\x4f\x90\x45\x25\x6b\x67\x3c\xf4\x72\x3c\xf0\xb8\x03\xaa\xff\x0e\xe2\xe0\xda\x65\xe4\xbe\x75\x1a\x30\x1c\xed\x79\xfd\x47\x65\x4c\x9e\x56\x89\x2b\x7f\xc3\xcb\x9b\x36\x53\x50\x8a\xcf\x85\xbb\xac\x2d\x72\x38\x16\xa1\x1d\xa8\x3b\x3b\x4d\xbb\x29\x59\xab\x16\xfa\x3b\x8e\xd5\x27\xcb\xf7\x4e\x52\x2c\xec\x1f\x84\x67\xdd\x52\x4e\x4d\xc0\x68\x8b\xaf\xca\xfe\x51\x2f\xca\x06\xad\x31\x83\x38\xb8\x76\x69\x63\x0f\x94\x7e\x5b\x68\xa7\x77\xa6\x84\xf1\x7e\x8b\x20\x96\x10\x7e\x52\xac\x52\x24\xf1\xb1\x79\xe0\x0f\xd1\xf4\x86\xff\xb6\x18\x22\x2e\x88\x83\x6b\xc7\x37\xb8\xc0\xf6\xb5\x88\xab\xae\x63\xed\x47\xa1\x86\x7f\xd3\xa7\xdc\xf9\x6c\x74\x66\x92\xac\x0b\x59\x4d\x45\x1b\xeb\xee\xff\x77\x91\x21\x88\x83\x3f\x87\xa1\xc9\x4b\x1b\xc6\x26\x68\x2b\x9d\xdb\x96\x3f\xd4\x73\x15\xad\x5b\xf1\x67\x39\xbe\xda\x70\x3d\x0f\xfa\x89\x3b\x8e\xc1\x2f\x03\x7d\x71\x01\x71\x70\xed\x2a\x2d\x73\xb9\x37\x36\x49\xe9\xa8\xf2\x55\xb5\xd7\x88\x5f\xc4\xdf\xe2\x0f\xf0\x75\x67\x99\xf9\xea\x7f\x48\x45\xb4\x9f\x4d\xef\x8d\xd0\x0e\x34\x26\x9c\xba\xef\x80\xc7\x1e\x4f\xcd\xc9\xc1\x4e\x5c\x93\x92\x98\x4e\xf5\x07\xe5\x56\xee\x17\xc6\x4e\xba\x16\x4d\xcc\xb1\xd9\x7e\x79\xca\x12\x39\x68\xdf\x01\x80\x83\x6b\xa7\xfe\x2c\xc1\xb3\x2e\x7b\xc7\x85\xb0\x5e\x58\xf4\x39\xb9\x45\xc1\x86\x6c\x2c\xc7\xd7\xfe\xf5\xaf\x5f\x52\x07\x36\x14\x54\x7e\x52\x21\xe2\x82\x38\xb8\x76\x6c\x86\xd8\x57\xc5\x59\xd1\x1f\xd5\xad\xaf\x04\xb0\x87\x7c\xa4\xd7\x16\xbd\x4d\xde\xca\xbd\xf1\xf9\x8f\xf1\xad\x09\xbc\xb7\xb5\xd0\xbd\xc1\x20\x0e\xfe\x1c\xda\x8c\xbc\x7d\xdb\x53\x17\x5d\x02\xd9\x87\x51\x24\x58\x3b\xbb\x8e\x30\x39\x31\xa4\x5e\xdf\x7f\x72\xaf\x30\x0a\x55\xa7\x24\x10\xba\x2e\x09\xc4\xc1\xb5\xb3\x35\xb9\xa7\x6e\x5f\x33\xef\x89\x5a\x92\xf1\x21\x71\xcf\x2a\x32\xa5\x34\x30\xe9\xd6\xd3\xbc\x22\x3c\xcd\xbb\x68\x38\x17\xef\xed\x22\xb4\x03\x0d\xac\xa7\x69\xf7\xe4\xb9\x3b\xb7\x8a\xd6\x7c\x7f\x36\x57\x85\xee\xdc\xf6\xfa\x4b\xd9\xfc\xbc\x81\x7d\x54\xab\x91\x01\x34\xf6\x67\xbb\x38\x32\x4d\xd0\x3a\x25\x80\x83\x6b\xe7\xca\x70\x23\xaa\xc6\x0a\x67\x2a\x35\xcd\xe4\x75\xc9\xc3\x8c\xe6\x99\xf7\x37\x5f\x15\x35\xc8\x39\xf6\xca\x5d\xa4\x51\x4f\xf4\x86\x76\xeb\x82\x38\xb8\x76\xb5\xd7\x71\x25\x53\xdd\x6f\xd7\x3c\x3e\xea\xa7\xfd\x28\xef\xaa\xa5\x95\x24\x2b\x74\xbe\xf4\xb9\xe8\xdc\x5b\xd2\x03\x3e\x94\x47\xef\x11\x71\x41\x1c\x52\xff\xc3\xf3\x76\xd6\xc5\x17\x8d\x59\xd3\x43\xf8\x09\x56\x5f\x0d\xc6\x67\x36\x87\xf1\x95\xb4\x25\xee\x32\xee\x8b\x4f\x53\x18\xa4\x84\xa1\xfe\x07\xc0\xc1\xb5\xd3\x2d\x3f\x6f\x44\x77\x9c\xfd\x2e\x96\x80\xa9\xab\x79\x64\x94\x07\x3f\xe2\x13\x77\xa4\x0d\x3e\xfa\x37\xc2\x30\x7f\xf2\x8d\xb6\x5e\x84\x43\x03\xcd\xee\x4f\x77\x68\xe5\x2d\xcc\xa5\x5e\xd7\x46\x7b\x6f\xe8\x4c\xf3\xa8\x89\x34\x24\x44\xe9\x7e\x15\xb2\xe4\xbb\xcc\x7f\x39\x5d\x37\x54\xf4\xd2\x12\xb4\x86\x06\xe2\x90\x1d\x9a\x7e\x54\x42\x7e\x88\x11\xef\x79\xa6\x6f\x65\xbb\xfb\xb7\x65\x9e\x6e\xbc\x9b\x2f\x8f\x29\x23\xb0\xee\xc7\x7e\x54\xef\x8c\x33\xc0\x8f\x88\x0c\xe2\x90\x1d\x1a\x41\x2e\xfa\x1d\xb5\xb4\x39\x07\x06\xc7\x16\xcb\x9a\xcb\x3f\x9e\x14\x34\xf1\x91\x7a\xf6\x8e\xcb\xed\x8f\xc5\xff\x99\xdc\xae\xf0\x45\x44\x06\x71\xc8\x35\x48\xfe\x75\xc9\x4c\xd6\x3c\x9e\x8f\xb3\xf1\x76\x63\xee\x2b\xbf\xa4\x62\xae\x37\xd5\xfa\x7e\xcc\x51\xef\xfa\xb8\x58\x66\x29\xc5\xb4\x4d\xf6\x1a\x57\xf3\x6f\x87\xb6\x82\x4b\xb4\x3f\x7b\x34\x1e\xe9\x3a\x36\xa7\x91\xf0\x46\xb4\x97\xd9\xb8\x68\x55\x1e\x85\x94\x8e\xdd\xc0\xb8\x46\xd1\x7a\xb3\xee\x2f\xd4\xbf\x5e\x2a\xc9\x98\xf2\xfe\x43\xbb\x30\x7b\x52\x7f\x4b\xd9\xe3\x7a\x0b\x7e\xf4\x00\xdc\x52\xb5\xa8\x0a\x74\xdd\x6b\x0c\x5f\xb8\xfe\x6b\x0e\x0d\xd4\xb4\xbf\xcf\xa1\x21\x39\xb4\xb7\x63\xf7\x7f\x0f\x63\x4e\x48\xc6\x71\x51\xf4\x71\x0f\xec\xbd\x8b\x5f\x3b\xfa\x2c\x65\xab\xd5\xf8\x51\xe9\xce\x23\x6f\xcc\xe3\xc0\x33\x59\xde\x79\x84\x64\x1e\xbe\x96\xcb\x51\x50\xaa\xaa\x98\x4a\xcd\x58\x65\x73\x06\x78\x3b\xaa\xed\xc9\x2c\x39\x37\x50\x1b\x2f\x06\xb2\x7b\x56\x86\x5c\xd1\x3f\x93\xc5\x2c\x64\x87\x36\xdc\x9a\xd4\x9c\x91\x54\xe5\xb1\x31\x82\x6b\x40\xab\xb7\x70\xee\x16\xbe\x50\xb2\x95\x48\x87\x71\xf4\xba\xc7\x03\x47\xb6\x5b\x43\x67\xd2\x5a\x4d\xa4\x9f\x55\x13\x71\xeb\x60\x8d\x0f\x92\xe9\x6a\x60\xbe\xc7\xbb\x18\xb0\xfd\x7c\xa5\x8d\xae\x79\x38\x5e\xc5\xa7\xc4\x54\x04\x3d\xd8\xf4\x0c\x6a\x57\x06\x09\xbb\x23\x3b\x34\xf9\x50\x54\x3a\x55\x1d\xbd\xbc\x18\x71\x8e\x6a\xd9\x2f\x31\x33\xa8\xcc\x8e\x27\xb9\x3d\xa1\x68\x94\xa6\x37\x57\xf2\x37\x23\x1d\xce\xcc\xa1\x81\x92\xe8\xb4\x11\x4b\xef\xca\x6d\x2d\xa6\x4d\x67\x1b\xbf\x88\x8e\x23\x73\xf2\x69\x9a\xc2\x2c\x13\x12\xbe\x3e\x0b\x07\xd6\xf3\x21\x64\x8d\x7b\x4a\xbb\x88\x9e\x1a\xc4\xc1\x47\x2c\x6f\xa2\x97\xd1\x47\x6b\xeb\x4a\xb4\x8f\x2f\xb7\x25\x7a\x48\x05\xc9\xd5\xca\xf5\x13\xfe\x16\x4e\xf9\xd1\x13\xfb\xa7\xe2\x62\x1d\x34\xdb\x00\x71\x48\x25\x28\x97\x38\xf3\xda\x0e\x79\x8e\xcf\x61\x79\xba\x2e\x12\x7f\x2b\x59\xd1\x6d\x93\x1a\x9b\xda\xab\x38\xcf\x65\x45\x6d\x73\xc9\x19\x3a\xa5\x0f\xe2\x90\x4e\x90\x9f\xaf\x93\x3b\x5f\x3a\x5f\x34\x86\x96\x5f\x69\xa5\x82\xbd\x67\xb7\xef\xe1\x6c\x6c\xe2\x1e\xb5\x6e\x54\xd2\xd6\xd0\x58\x00\x55\x20\x01\x71\x5e\x82\x28\x68\x7f\xc7\x55\xed\x89\x39\x37\x52\x93\x35\xe9\x45\xd4\xb2\xe4\x87\xfb\x69\x3e\x0e\xd3\x65\x72\x57\xed\x93\xf6\x17\xea\x5f\xf4\x57\xd9\x9c\x44\x10\xb3\x0d\xd0\x9b\x78\x9a\x76\x2a\x1f\x7f\xf4\x57\xad\xf0\x4f\x45\xf8\x8e\x15\x7d\xca\xc6\x44\xf7\xba\xf0\x2d\xe4\x56\xd6\x8d\x8c\x3f\x53\x9f\xa4\xaf\x63\xce\x40\x55\x5e\x40\x1c\x5c\x3b\xc3\x3b\xd4\x37\xce\xa1\xc5\xca\x09\x60\xfa\xfe\xfc\xcd\x9a\xd3\xda\x15\x14\xd4\xc4\x63\xfe\x58\x87\x8b\x7c\xe6\xa3\x7c\x22\x36\xb4\xcb\x11\xc4\xc1\xb5\xfb\xb8\x50\xd6\x4a\xb5\xf5\x25\x45\x76\xc9\x2e\x49\xf7\xc2\xa5\x1f\xef\x33\x6d\x4e\x28\x19\x55\xe2\x8a\xac\x82\xc6\xaa\xb4\x14\xa0\xda\x9c\x20\x0e\xfe\x1c\x6e\xe2\x48\x88\x0a\x1c\x5f\x9e\x1e\x21\x32\xf1\x1b\x69\xf2\xce\x6f\x0a\xcf\x94\xe8\x4f\xd6\x22\xff\xb0\x9a\x83\xad\xe1\x45\x41\x01\x9d\xdf\x01\x70\x70\xed\x88\xc4\x6b\x62\x6a\x0e\x53\x4c\x25\xc5\xb7\x27\xcd\xf8\xf7\xeb\xbb\x3e\xf1\x62\x85\xbc\x57\xe2\x65\xa8\x62\x3b\x79\x9a\xd0\x4d\x03\xb9\x6b\x40\x77\x76\x9a\x76\x27\xf8\x9f\xec\x55\x77\xf1\x77\xb4\x28\x76\xc9\xd7\x8f\x58\xc6\x74\xd6\xa8\x9c\x43\x83\x36\xeb\xcd\x50\x7a\x97\x54\x1e\x07\x33\x40\xeb\x94\x00\x0e\xae\x9d\xc8\xbd\x12\x23\x1f\x82\x8b\xa5\x23\x1c\x56\x57\x47\xa4\x8e\x77\x1b\xa4\x31\x52\x36\x8d\xc2\xf4\x92\x44\x2f\x2e\xfa\xdd\xfd\x6a\x8d\x88\x0b\xe2\xe0\xda\x09\xf8\xc5\x56\x71\x1a\x6a\xd5\xf9\x1d\x2c\xde\x4b\xc9\xcc\x29\x19\x30\xe1\x71\x7c\xd2\xd0\x26\x92\xf9\xa6\x6f\x62\x3e\x21\x0c\xca\x09\x10\x07\x7f\x0e\xa3\x6d\x52\x7a\x58\x07\xa9\x5c\x6e\xaf\xf4\xd9\xba\x14\xfe\x94\xbc\x60\xe2\xe0\x08\x78\xf0\x38\x53\xee\x87\x1a\xa3\x1b\xc6\x15\xe8\x2e\x18\x10\x07\xd7\xee\xd7\xbd\x22\x8f\x0c\x4d\x02\x4e\xbd\x02\x0f\x09\xef\xb0\xb7\xc3\x4d\x5f\xd9\x7b\xa7\x9d\xce\x8f\x72\x1b\x10\x8a\x37\x75\x73\x05\x23\xb4\x03\x8d\x09\xa7\x69\x67\x28\x3d\xa7\x2f\xe4\x97\x13\xfb\x9c\xe3\x31\x1b\x19\x73\xf4\xc6\x5b\xca\xce\x84\xd1\xc0\x6a\x54\x74\x21\x9a\x0f\xd6\xcf\xb2\x21\x77\x0d\xe2\xe0\xda\x69\x9e\x5c\xd5\x90\x4c\x12\xaa\x48\xee\x28\xff\xa1\xbc\x25\x56\x2a\x5e\x89\x63\xdb\xee\x6a\x66\x52\xfa\xdd\xc2\xbb\x4e\x58\x11\x2a\x07\x0c\xe2\xe0\xda\xf1\x6f\x2e\x56\xda\xa5\xd9\x3d\x98\x14\x69\xea\xbe\x60\xe5\xf0\x3e\x74\x4e\xd6\xe9\x8b\xfe\x8e\x33\xb3\x5b\x7b\x5b\xbe\xd4\x0b\x7f\x44\x5c\x10\x07\x7f\x0e\xe4\xab\x05\x18\x04\x7a\x1f\xb7\x3e\x04\xb5\xc8\x5f\x15\x5b\x30\xac\xe8\xb3\x69\xab\xe7\xb8\x9a\xc6\x93\x20\x1b\xdc\x31\x61\xa9\x8d\x88\x0b\xe2\xe0\xda\x49\x99\x92\x17\xa3\x4a\xe9\xcf\x4d\x54\xb2\xb7\x5a\xf1\xcd\x50\x68\x1b\x50\xf3\xef\x9f\x97\xc4\xdf\x37\xbf\x11\xee\x17\x99\x6d\x8f\xd0\x0e\x34\xb0\x9e\xa6\x1d\x5a\xe0\x37\xd3\x15\x1d\xdf\xd0\x48\xa1\xc9\xdc\xe9\xac\x8c\xb9\xaf\xf1\x5d\xef\xea\xbe\xa6\xd9\xf5\x94\x71\xf2\xa5\x39\xe3\xf1\x23\xfe\x33\x88\x83\x6b\x47\xbf\x44\xd3\x32\x7b\x2c\x13\xaf\xcb\xd0\xea\xd2\x6e\xc1\xf6\x8a\xef\x48\x73\xba\xf9\x3b\xf5\xf6\xeb\x79\x99\xfb\xf3\x1c\xd3\xd0\x45\x16\x20\x0e\xae\x9d\x93\x57\x5c\xab\x4e\x67\x2e\x6b\xc3\x75\x99\x3d\xb3\x7a\xba\x73\x7c\x14\x38\xba\x92\xd5\xe8\xd9\x39\x92\x14\x07\x63\x9b\x91\xe8\x88\xb8\x20\x0e\x69\xdc\x97\x2d\xc5\x46\x7b\xac\x1a\xf1\xb1\xfc\x17\x8f\x1e\xa9\x8e\x47\xbf\x5f\x6c\xc6\xf8\x0f\xbf\xb4\x66\xec\x08\xcb\xd7\x83\xe3\xd0\x7e\x06\x10\x07\xd7\xce\x54\x99\x2f\x8f\xd7\xc3\x95\x21\x94\x39\xd0\xe4\xba\xe8\xb1\x42\xf7\x55\x27\x1d\x99\x32\x1b\x72\x72\x91\xd9\x1c\x62\xde\x08\x22\x84\x43\x03\xcd\xee\x4f\x77\x68\xd7\x2e\x31\xd2\x89\x3d\xe4\x97\x16\x68\x5e\x91\x26\xe2\x32\xba\xa4\xe5\xb1\x18\x59\x93\x28\x36\xae\x8b\x59\x58\xd3\x9e\x96\xc7\x8e\x70\x3b\x20\x0e\xd9\xa1\x4d\x99\xcc\xb2\x9c\x5c\x42\xf5\xe1\x4b\x3d\x12\xea\xfa\x34\xb8\x1e\x76\x97\x49\xe5\xc7\xbc\xa5\x0b\x66\x2c\xe1\xeb\x41\x03\xbb\x24\x44\x64\x10\x87\xec\xd0\x6e\x46\x4a\xbf\xf4\x41\xa1\xfb\x8c\x6d\xd6\x13\x78\x2b\x46\x34\x5d\xc5\x9a\x0e\x17\xa7\x65\xfe\xfc\xf9\x87\x44\x14\x9c\x42\x8d\x7e\x88\xc8\x20\x0e\x39\xf2\xbf\xae\xe5\xf8\xf6\x5b\xae\x78\xcc\x5d\xac\x9f\x7d\x12\x1f\xa9\x03\x95\x8f\x63\xf4\xdd\x96\x66\xe3\x26\xf2\x98\x86\x6a\x7a\x0c\x2d\x64\x1e\x48\xfd\x6d\x2f\x94\x6e\xf3\xb7\xd7\x67\x28\xd5\xc7\x10\xda\xf8\x59\xec\xa2\x70\x3e\x3b\xb7\x6e\x8e\xaf\xa3\x6a\xb5\x52\x56\x1c\x40\xc2\xbc\x83\xf5\x17\x9a\xf3\x3d\xd8\xb1\x86\x3f\xee\xa4\xf9\x1e\xca\x33\xef\x6c\xb1\xdc\xfb\xe5\x04\xa8\x3d\xc3\xb4\xcd\x9d\x3f\xec\x51\x7e\xf9\x60\x4a\xff\xd7\x1c\x1a\xa8\x69\x7f\x9f\x43\x43\x72\x68\x54\x92\x8e\x2d\x4f\xf4\xcc\xf0\x69\xd2\x09\x31\x50\x68\xf3\x57\xf2\xfc\x9d\xf6\xbb\x5d\xb8\x1e\x2e\x68\xc6\x7d\xee\x38\xc2\xe3\x39\x93\xe5\x1d\x64\x87\xc6\xd3\xf9\xd3\xa7\xc2\x6f\xe3\xee\xa8\x89\x92\x6e\x78\x6b\x4b\x46\xa8\xba\x6f\x2c\xad\xd2\xca\x15\x25\x92\x26\x5a\xae\xfe\xdb\x67\x72\xcd\xfd\x47\x64\x87\x56\x86\x17\x5f\x65\x73\xd1\xb6\x6a\xba\x3a\xe6\x7c\x34\xf9\xc9\x03\xdb\xf4\x52\x9a\x2c\x0f\x4a\x0f\x1e\x6b\x22\xbd\xbb\x5c\x4a\x5b\x67\xd2\x5a\x64\x87\x56\xaa\xf3\xbc\xde\xd7\xe2\xa3\x62\xa3\x27\x4a\xc4\xd4\xd7\xa0\x22\x7f\xdd\xc3\xf2\xea\x05\xbf\xf5\x07\xca\x0b\xf8\xa2\x26\x57\x03\xce\xa4\xb5\xc8\x0e\x8d\xd6\x66\xe5\x9e\xe2\x73\xd6\xac\xeb\x8f\x5e\x1f\x26\x8f\x17\xf9\xf4\xa2\x51\x27\xcf\x7a\xff\xd1\xc2\xf4\x0f\x15\x7b\x83\x37\xfc\xed\xcc\x1c\x1a\x28\x89\x4e\x1b\xb1\x50\x49\x2e\x62\xe0\xf4\x5d\x47\x69\x7e\xc2\xde\xc0\x96\x4b\x13\xed\x75\x23\x59\xcb\x55\x97\xba\x2b\xf3\x6a\x72\xc3\x44\x43\x32\x54\x79\x1e\xc4\xc1\x47\x2c\xc1\xa8\x45\xfd\xdb\x07\xd5\x3e\x3b\xe2\x13\x24\x5b\x16\x16\xb5\x5e\x0a\xaf\x7d\x8c\xec\x03\x7e\x08\x35\x0a\x62\x93\x1b\xf6\x42\x95\x10\x40\x1c\x7c\xc4\x7a\x7e\x7f\x19\x2b\x9b\x3c\x5d\x3e\x23\x6e\xd8\xd1\x74\x31\x64\x84\x48\xe5\xe8\x6e\xde\x2b\xa7\x78\xaa\xdd\x43\x54\xb6\xac\x47\x50\xb5\x09\x10\x87\x54\xcd\x79\xbf\xaa\x1a\xaf\x8a\xd7\x67\x11\x7d\x20\x22\xb6\x16\xfd\xdc\xfa\x38\x9f\x0f\xd5\x42\xc8\x0f\xaa\x58\xbe\xf9\xef\x47\xe5\x53\x50\x35\x67\x00\xe7\x25\xf8\xcf\x8a\xb8\x45\xb7\x1e\x17\xde\x78\x5b\x55\x19\x2b\x12\x57\xf6\x3c\x84\x4f\xf0\x48\x73\x96\xf6\x3b\x6e\x29\x79\x4c\x2a\xee\xdb\xb2\x7b\xe3\xd0\x2c\x1f\xf4\x26\x9e\xa6\x1d\x55\xf4\x6e\x95\xf8\xef\xb9\x39\xb4\x91\x6d\xf2\x05\x46\x31\x5f\xbb\xe7\x99\x78\x3d\x02\x16\x43\x06\x29\x38\x71\x3d\x38\x7f\xa0\xbb\xc9\x41\x1c\x52\x1d\x4e\x39\x99\x80\x46\xa5\x05\x13\x89\x4f\x2f\xa7\xe7\xd6\xcd\x37\x4c\x3a\x82\xdd\xf0\x6d\x8c\xb5\x92\xad\x82\x5b\x62\xe9\xf5\xee\x41\x75\x38\x01\x1c\x5c\xbb\x46\xad\x52\x2c\x96\x3f\xba\x5b\x54\x26\x3a\x02\x46\x77\x7b\xac\xaf\x0d\x64\xbd\xf3\x8f\x72\xa9\xfe\x5e\x32\xfb\x0e\x27\x3c\xea\x1a\x22\x2e\x88\x43\xda\xa9\x2b\x40\xb3\xba\xba\xa3\xd9\x47\x1d\x3d\x62\xb5\x14\x1b\xfe\x53\x3f\x3e\x99\x20\xb0\x43\x09\x47\xc7\xb8\xe2\x4e\x1b\x0a\x6f\x1b\xb4\x53\x17\xc0\xc1\xb5\xab\x9e\xcb\xcb\x38\x6a\xee\xf0\x51\x19\x27\xb4\xf6\x7d\x32\x62\xdf\x73\x2f\x69\xef\xb6\xea\xf2\x9e\x50\xf7\xa4\x8e\x0b\x1b\x06\x25\x42\x3b\x50\x77\x76\xfa\x95\x8a\x3e\xb7\x8d\xa3\x2b\xe3\xd9\x08\x25\x02\xf6\xee\x5a\xea\x1b\x69\x3f\x1d\x5a\x46\xb3\x88\xad\x5a\xce\x9c\xcf\x93\x57\x85\xae\x28\x04\x71\x70\xed\xf4\xa8\xdd\x9e\x33\x87\x26\x8d\x39\xd3\x6b\x3c\x79\x5a\x1f\x44\xec\xba\xda\xdb\x81\x23\x64\xc6\x84\xf3\xa4\x74\xc6\xf9\x47\x0e\x54\x93\x14\xc4\xc1\xb5\x3b\xff\xcd\x27\xdc\x2a\xee\xa7\x22\x25\xd9\x15\x79\x36\x45\xb3\x75\x6b\x96\xed\xd5\x73\x7c\x8c\x84\xa5\x3f\x04\x8c\xb5\xa9\x7b\xa1\xdd\xd0\x20\x0e\xfe\x1c\x3e\xa6\xab\x3a\x6b\xd4\x47\xbd\x77\xc2\xed\x28\x2f\x8d\x92\x20\x1f\x7a\x99\x32\xa4\xfb\xe5\xfe\x0f\x26\xa9\xc8\x67\xd8\x6f\x05\xf7\x20\xd7\x0e\xe0\xe0\xda\x25\x3d\x33\x34\xc9\x6b\xf8\x3c\x46\xba\x31\xab\x7d\x88\x92\x14\x6e\xf5\xce\x6e\x45\x22\xe5\xc3\x8c\xc2\xf4\xeb\xdb\x2c\xab\xdd\x1f\x10\xda\x81\xc6\x84\xd3\xb4\xf3\x1e\xb3\x44\x1f\xd4\xbd\x5d\x14\x93\xb8\x9c\x95\x23\xff\x7c\x5c\x7a\x96\xdb\xfa\xe1\x08\xf7\x9a\x83\xa4\x2c\x75\xcd\x2b\x2e\x68\xdf\x01\x88\x83\x6b\x57\xce\x67\x35\x7a\x50\xec\xba\xe5\x1d\xba\xde\xef\xb8\xdc\x15\x91\x1a\xf6\x70\xa2\xc5\x6e\x55\xe3\xa3\x12\x93\x42\x87\x1e\x5f\x24\x22\x2e\x88\x83\x6b\xb7\xa5\x97\xb0\xe0\x1a\x6a\xd9\x80\x91\x5a\xac\x74\xac\x4e\xd9\xc2\xa7\x12\x78\x6f\x53\x4f\x50\x50\x0a\x6b\xf4\xe9\xcf\x16\x3b\x68\xe7\x2b\x88\x83\x3f\x87\xe0\xaf\x59\x84\xdd\x6a\x8f\x53\x3b\x0c\x4b\x8a\x67\x8c\x78\x56\xfd\x02\x3d\xe4\x63\xef\xd0\x6d\x4d\x5e\xf0\xba\x99\x8f\xa5\x3f\x82\x88\x0b\xe2\xe0\xda\x39\x48\xdc\xdd\xb0\x7b\x2b\x7d\x33\x56\x59\xfc\x89\xd4\x58\xa1\xfa\x61\x0f\x6e\x84\x32\x5a\x66\xb9\xa7\x57\x6b\xd6\xd0\xea\xa1\x0c\x42\x3b\xd0\xc0\x7a\x9a\x76\x0c\xec\xdd\xe3\xd7\x5e\x2b\xbd\xf9\x54\x2c\x1d\x52\xc4\x7d\x41\xb7\xbc\x5d\x96\x5e\xb3\xe1\x85\x65\x86\xbc\x98\x78\xc1\x44\x0d\x3b\xe2\x3f\x83\x38\xa4\x2f\x92\xc2\x9f\x82\xec\x31\x45\xc3\x89\xdc\x9d\x36\x92\x44\x27\x59\x5e\x3c\xe4\xd2\xa6\xd9\xf8\x6c\x17\x14\x26\x86\x19\xd0\xe2\x52\x06\xe5\x04\x80\x83\x6b\x57\xc3\xdf\x90\xa1\x16\x24\x18\xaa\xbd\x7d\x59\xe5\xde\x05\x32\x2f\x25\xbc\x66\x46\x83\x92\x7d\x0a\x2e\xa2\x0c\x41\x62\xe6\x6b\x90\x0b\x06\x71\xf0\xe7\xf0\x8e\x12\x5d\xec\xb5\x79\xee\x6a\x40\x5c\x5d\xf0\x6e\xd6\xb8\x52\x66\xf3\x05\xfa\x84\x27\x91\xda\x5f\x6a\x03\xcc\x02\x63\x70\xa1\x5a\x8e\x20\x0e\xae\x9d\xc0\x78\x3b\x6a\x86\x39\xc5\x14\xc9\x35\x97\xde\x91\xd1\xae\xd5\xd7\x5f\x79\x99\x48\xdb\x6c\x12\x7d\xad\x74\x2f\xb6\x32\x3f\x36\x43\x38\x34\xd0\xec\xfe\x74\x87\xb6\x97\x2f\x17\x3c\x98\x98\x72\x7b\x44\xa8\xe5\x96\xb1\xa9\xf6\x9a\x33\x4b\xf7\xa3\x07\x97\x1f\xd2\x1d\x1a\xd4\x66\x4c\xd5\x4e\x78\x22\xdc\x0e\x88\x43\x76\x68\x2a\x57\x5a\x7f\xfa\xd6\x4e\xed\x6b\x33\x2e\xe9\x76\xe2\x0b\x93\x46\x95\x06\x5f\xc9\x6c\x35\x77\x4c\xb1\x33\x4b\x28\x3b\x11\xfa\x04\x9d\x70\x03\x70\xc8\x3e\x2a\xd9\xd9\x41\xe4\xe3\x6e\x39\xc7\xbe\xe1\xc0\x04\xef\xa4\xf9\x94\x39\xfa\xb7\x1f\x41\x3d\xf8\x6d\x14\x68\xca\x82\xc4\x2a\x3f\x25\x10\x91\x41\x9c\x97\xf0\xff\x9b\xfb\xfd\x1d\xf9\x15\xe6\x70\x60\xf8\xa4\xbf\x10\xc1\x76\xb2\xa7\x8a\x92\x9c\x7c\x68\x33\xba\x41\x18\xa6\xea\x54\x77\xb5\x9a\x5c\x86\xa2\x0a\x3e\xe4\xd0\x86\x51\x47\x7f\x5f\xe7\xe1\x0b\x0e\x4c\x2c\x1b\x4b\xda\xd4\xc6\x28\xdc\x68\x51\xf2\xcb\xdf\x79\x39\xb5\xc0\x41\x5f\x2e\x93\x14\xf2\xb7\x43\xb3\xac\x7f\x88\x13\xde\x4b\x19\xcf\x91\x6a\x34\xa1\x81\xce\x9b\x3b\x3c\x48\x4a\xcb\x5d\x42\x16\xe3\x90\xa5\x42\xdf\xb9\xf9\x86\xe2\x2f\x54\x42\x58\x44\x83\x34\x81\x98\x2d\x71\x62\x81\xab\x9e\x51\x0b\x73\x41\xe2\xa6\xd6\x61\x08\x2b\x63\x2d\xba\x56\xc8\x53\xed\xcb\xb5\xff\x35\x87\x06\x6a\xda\xdf\xe7\xd0\x24\xe1\xb3\x78\x4a\x87\xa8\xcc\xa3\x28\x9b\xf8\x9e\xdf\x62\xa8\xd6\x2d\x32\xf5\xf7\x0c\xa3\x3c\x59\xb7\x65\x0c\x24\x62\xd3\x4c\x2f\xe7\xcc\x95\x9c\xc9\xf2\x0e\xb2\x43\x93\xbe\x70\xab\xd6\x3a\xd7\x95\x75\x30\x83\xed\xa4\x65\x82\x86\x6a\x20\x82\xe9\x09\x71\x04\x4a\xb5\x38\xab\xb6\x01\x13\xc9\xb0\xc1\x99\x2c\x66\xc9\x23\xfd\xac\xaa\xa1\xc0\x38\x07\x0f\xd1\x57\x29\xaa\xd0\x85\x27\xe7\x2a\x3b\x43\x95\xd2\xf1\xed\xbb\x04\x9d\x9c\xaf\xd7\xdd\x8f\x69\x70\xfa\x70\x26\xad\x45\x76\x68\xce\x8f\x25\xba\xed\x65\x8f\xff\x98\x05\x78\x1c\xf5\x85\x6e\x50\xb0\x31\xf3\x64\x1c\xd8\x68\xb9\x1d\xaa\xf9\xc4\x24\x4e\x1e\xf2\x9f\x49\x6b\x1d\x91\xd7\xd0\x48\xd1\xf0\x4c\x50\x0f\x52\x49\x2a\x1c\x2a\x51\x99\x7d\x8e\xf6\x14\x1f\x49\xd3\x5f\xf0\xba\xff\xf1\x7d\xfa\xb9\xce\x6d\x8d\xe6\x33\x73\x68\xa0\x24\x3a\x6d\xc4\xd2\x70\x65\xf2\x3d\x0a\xe3\xbe\x46\xf1\x56\xc6\x9c\x23\xf2\xfe\xc1\x5b\xe1\xb5\xee\x0f\x9d\x9e\x9d\x78\xf4\x96\x79\x2a\x56\xfb\x90\x33\x01\x71\xf0\x11\x0b\xe7\xb9\x46\xe2\x30\xdb\xdd\xcb\x28\x2e\x35\xcc\x76\x87\x62\x8b\x6b\xe4\xaa\xe3\x1c\x76\xfc\x95\xee\x9d\xe3\x62\x2e\xc2\xe7\xa0\x6f\x8a\x20\x0e\x3e\x62\xb1\x68\x9d\x7f\x43\x64\xeb\x4d\x9a\x85\x83\xae\xfb\xe8\x62\x40\xa1\x79\x81\xda\xc6\x05\x19\x45\xb7\xa1\x7a\x33\x2c\xc9\xe7\xd2\x50\x6d\x2b\x10\x07\xdf\x3f\x6f\xf3\xf9\xf6\xbd\xa0\x83\xa6\x83\xfa\xeb\x84\x0a\xfc\x6f\xfc\xc3\xea\xd8\xb2\xbf\x5b\x70\x7a\x28\x4c\xec\x99\x8a\x87\x39\x55\xbf\x46\xc4\x05\x71\x48\xdf\x6c\xb1\xda\x6e\xeb\xcf\xb2\xa3\xcd\xa6\x76\x6c\x6e\xd6\x55\x1a\x61\x38\xd3\x8e\x4a\xee\x24\xe6\x61\x0d\x55\x9c\xc7\x5c\x23\xa9\x45\xcc\x36\x40\x6f\xe2\x69\xda\x91\x75\xbf\x5f\x79\x27\x66\x22\xe2\xa5\xf7\xe0\x03\x0e\x3d\xae\xad\xe3\x8b\x30\x14\x62\x89\x9b\x2c\x63\xf2\x2f\xe5\xc2\x58\xd2\xa0\x5a\x8e\x20\x0e\xae\xdd\x62\x8b\xbc\xd8\x71\x86\x8f\x6a\xd2\x91\x92\x35\x8f\x7c\x07\xd5\xa0\xac\x79\x23\x3a\xd1\xcf\xdb\xee\x41\x69\x7f\xb8\xad\x2e\x6e\x21\xe2\x82\x38\xb8\x76\x3b\x87\x0d\x83\xdf\x96\x03\x75\xcd\x16\x8f\xed\xd5\x75\xf6\x39\xcf\x53\xd9\x2d\xdf\xb3\x67\x68\x4d\x9a\xfd\xd4\xc5\xed\x28\x3e\x83\x88\x0b\xe2\xe0\xda\x8d\x17\x55\x29\xef\x65\xd4\x95\xeb\x6b\xae\xb5\xc4\xa1\x29\x0a\x11\x7e\x49\x9d\x76\x74\xd5\xac\x7d\x7a\x4e\xd8\x79\xd5\x21\x13\xaa\x47\x0a\xe2\x90\x76\x00\xdf\x4e\xe3\x6c\x98\x55\x72\x0d\x3a\xe6\xd4\x1d\x8c\xb8\x4e\xa5\xcc\x8d\x71\xee\xe0\x5b\xe7\x2d\x37\x1b\xd3\x37\xdb\x0f\xdd\x42\x10\xda\x81\xba\xb3\x53\xdf\xbb\x69\xd2\x0f\x49\x51\x22\x92\xb9\x7a\x57\xc7\xdb\x7d\xba\x34\x22\x30\xef\x94\x48\x14\x30\xad\xb0\xc9\x26\x4b\xba\xd9\x8e\xde\x84\xde\x3b\x00\x87\xe4\xae\xd7\x3f\x1e\xe4\xdb\xf1\xa5\x4e\x97\x24\xfd\x0e\x56\x13\x98\x71\x56\xac\x1b\x8a\xfc\x9d\x43\xb1\x38\x80\x63\x2d\xf6\x79\x1e\xaa\x58\x00\xe2\xe0\xda\x19\x66\x5d\xb6\x5d\x7f\xf2\x80\xaf\xfb\x64\x27\x3b\xee\xeb\x05\xfe\x4c\x4d\x29\x27\xd1\xd0\x0e\x02\x1f\x5b\xb7\x68\xaa\x5b\xf7\xa1\x4a\x21\x20\x0e\xae\xdd\x27\xda\x6c\xa9\x09\xcf\x00\x0e\x0e\xad\xc8\x91\xac\x1b\x84\x4d\xd4\xeb\x26\xd3\xf7\x78\xb0\xbe\x04\x89\x32\x53\xfd\x78\xf8\x1e\x9a\x81\x82\x38\xa4\x9d\x88\xc2\xae\x22\x6f\x8c\x62\x59\x1b\x45\x6d\xdf\x07\x14\xdd\x94\xdc\x09\xa1\x21\x23\x29\x19\xb5\x19\xa2\x2c\x93\x09\xce\x75\x57\x44\x68\x07\x1a\x13\x4e\xd3\x8e\x82\xb3\x39\xc5\x66\x66\x88\xd1\x86\xa5\xa0\xa9\xa8\x68\x32\x4d\xb4\xe8\x4d\xd4\xa8\x3b\xef\xfd\x83\x95\xc8\xc1\x63\x97\x43\x68\xd7\x20\x88\x83\x6b\xf7\x82\x62\x50\xfd\xc7\xe5\xe4\x43\xba\xfd\x02\x1b\x86\xab\xa2\x1a\xaa\x35\xbb\xf9\xed\x89\xd1\x29\xbe\x22\x8e\x33\x77\xa2\x92\xa3\x11\x71\x41\x1c\x5c\xbb\xa8\x48\xc6\x51\xf7\x8b\xce\x4a\xea\x72\x8d\xdf\x14\x31\xa7\x9a\xf4\xd5\xc8\x30\x3f\xd7\xa8\x4b\xdb\xbd\x5d\x92\xd0\x53\x64\x7d\x87\x88\x0b\xe2\xe0\xda\x59\x92\x4c\xae\x37\x2b\x7a\xa7\xbe\xc8\xb5\x1c\xc8\x9c\x63\x7c\xf9\xe0\x65\x5b\x5c\x17\x85\x9c\x96\x74\x90\x30\x47\xcc\x83\x0a\xa8\x86\x2a\x88\x83\x3f\xdf\x1c\x4c\xb7\xdb\x12\x76\x54\xca\x49\x9a\xd7\x36\xe5\xcb\x08\xcd\x3d\x8d\x18\xfc\x9c\x16\xe3\xf0\x1f\x25\x76\x2b\x36\x1c\xf4\x37\x40\x6b\x68\x80\x81\xf5\xd4\x3a\x9c\x5a\x32\xea\x7a\xd1\xc6\xb4\x5f\x9d\x4b\x63\x19\x6f\x3f\x9f\xac\xb6\xa2\x0c\x3c\xb9\x76\xce\x7a\x3f\x74\xda\x54\xd2\x3a\x29\x0a\xaa\xc3\x09\xe0\xe0\xda\xe5\x97\x4b\x3c\xc8\xc2\x6e\x88\x25\xf0\x2a\x75\xcc\xcf\xef\x21\xc0\xf1\x50\x92\x29\x23\x17\x7c\xd7\x71\x4e\xc6\xfb\x24\x82\x10\x3a\xc7\x0c\xe2\xe0\xda\xed\x2d\xef\x5c\x77\x5d\x13\x19\xff\x5d\x8d\xb6\xf6\x92\xec\x52\x1f\x49\xdd\xe0\x0b\x9b\x6a\xd4\x74\xce\x7c\xf7\x03\xb6\x27\xff\x1f\x73\x7f\x1a\xfd\x4b\x4d\xa5\x8b\xe3\xa8\x20\x0e\xa0\x0c\x82\x22\x6a\x83\xed\x04\x2a\x6a\x2a\x43\xdb\xa8\x80\x08\x2a\xa2\x80\x8a\x03\xdd\x8a\x19\x2a\x95\x54\xa5\x92\xaa\x24\x95\xaa\xc4\xa6\x99\xc5\x11\x14\x27\x9c\xd0\x06\x15\x6c\x27\x04\x71\xc6\x6e\x51\x44\x65\x70\x46\xda\xa1\x11\x1b\x94\x16\x54\x44\x01\x91\xab\xfc\x17\x7d\xef\xe1\x7f\x2e\xb8\xd6\xb9\x2f\xac\xb5\x7e\xef\x58\xac\xe7\xe4\xbb\x3f\x49\x2a\x7b\x3f\xcf\xde\xd9\x79\xfb\x41\x77\x74\x20\xd9\x04\xee\xce\x6b\x77\xfc\x65\xbf\xff\xaf\xbd\x9e\x17\x7e\x77\xe3\xb6\xbb\xde\xeb\x47\xcf\xfb\xd3\x61\xb7\x5c\xfe\xeb\xf3\x8f\xbc\xf5\xad\x3f\x7d\xed\x51\x0f\xbd\x76\xfb\x0f\x6c\x7e\x47\x8d\xcb\xa6\x70\x77\x9e\xdf\x1f\x9d\xb1\xf7\x83\x5f\xd2\xfe\xf8\xbe\x0f\xf8\xde\xab\x8e\xdf\xe6\xf5\xc7\xbf\xfa\xde\xef\xdb\xff\xdf\xee\xb6\x07\xf9\xca\x99\xbf\xcf\x07\x6f\xfd\x28\x71\xdb\x06\x86\xb6\xa9\xe8\xfe\x2f\x33\xb4\xad\xdf\x79\xfa\xb5\xc3\x8d\x37\xfe\xe6\xf2\xfd\x5f\xfc\x23\xf5\xd0\x5d\xb6\x7c\xe4\xab\xef\xae\xdf\x42\x36\xdf\x6a\xcb\x37\x7d\xeb\x77\xcb\x99\x57\xee\xb8\x81\xed\x6c\x0a\x77\x57\x86\xf6\xac\xf7\x2f\x47\x9f\xf7\xee\xfe\xb6\xf7\x9e\x41\x0f\x3f\x69\xba\xe2\x86\x2d\xfc\x56\xbf\xba\x71\x8f\xb7\x2f\xa7\xbd\xe2\xac\xf9\x88\x93\xbf\x7b\xe9\x86\x91\x37\x85\xbb\x2b\x43\xc3\xef\xfc\xfd\xc9\x17\x3d\x3d\x7e\xea\x2d\x3f\xfb\x5d\xd9\xf2\x18\xf5\x99\x5d\x4e\x7a\xcb\xce\xed\xc7\xf6\xf8\xf4\xd7\x9f\x7d\xf1\xcd\x7f\x73\xcb\xb6\xdf\xd9\x30\xf2\xa6\x70\xc7\x3e\x63\xb3\xcd\xfe\xef\x6e\x2f\xef\x7e\xf9\xd3\x9e\x75\xd8\xa7\x1f\x37\xdc\xbc\xdb\x3f\xdc\xef\x87\xff\x7a\x8d\xad\xce\xba\xff\xe9\x27\xee\xf8\x83\x17\xfd\xe0\xe3\xfc\xc3\x57\xbe\xe9\x2b\x8f\xbb\x83\xa1\xdd\x6b\x9b\xef\x1e\x7a\xda\x33\xdd\x36\x3f\x3b\xf1\x21\xf1\x8c\x9f\x7f\xf9\x84\xe7\x3f\xf7\xf7\x6f\x38\xef\x19\xef\xbe\xe2\xd8\xdf\x9e\x7d\xd8\x85\xfc\xe1\x9f\xdf\x98\xa1\x7d\xe8\x55\x6f\xbe\xea\xcb\x47\x52\xf2\x90\x53\xaf\xbf\xd1\xec\xdd\xee\xfe\xac\x1d\x3e\xc6\xee\xd1\xf5\xc7\x5d\x72\xd9\x67\xb6\xb9\x6f\x78\xf1\x35\x1b\x41\xdb\xf1\x90\x3d\xf6\xfd\xa7\xcb\xbe\xbf\xeb\xeb\xfc\x41\x7b\x85\x83\xf1\xf5\x27\x5c\xf6\xf1\x5b\xbf\x78\xf8\xe7\x9e\x4d\x9e\xd3\x9c\xf2\x85\x2d\xce\xf9\xff\x1a\x43\xdb\xd4\x4f\xdb\xf8\x1e\xda\x5d\x18\xda\xc1\x0f\x7a\xed\x37\x5e\x30\x6d\x71\xe5\x7f\xb3\x8b\x96\xcb\x5e\x7d\xd8\x59\x97\x7e\xf5\x03\xdf\x6c\x77\xdc\xe5\x27\xef\x7b\xca\xc7\x1f\xf8\xcc\xee\xb2\x8b\xfe\x2a\xe9\x9d\xbb\x32\xb4\x2d\xf7\xdb\xed\x1f\x6f\x7b\xf8\xdb\x77\xdd\x29\x8c\x67\x1c\x7b\xf6\x83\xef\x7b\x2b\xbf\xe9\x7f\x3d\xf0\xd0\x97\xbd\xb9\x7f\xea\xae\x2f\xfb\xc9\xaf\x4e\xf9\xdd\x5f\x25\x99\x75\x57\x86\x76\xe0\x4f\x3f\x7a\xfa\x15\xe9\x4b\x5b\x1c\xfd\xea\x33\x1e\x72\xee\xf1\x9b\xdd\xed\xdf\xde\x76\xd5\x2f\x0f\x3f\xfd\xe8\x9b\x68\x79\xf0\x95\x8f\xdb\xf6\xee\x47\xfc\x55\x7e\xed\x5d\x19\xda\x01\x37\x9e\x5b\x5f\xfd\xdf\xe0\xc7\x5f\x79\xee\xcd\x07\x55\xd7\xdf\xeb\xb1\x3f\x46\x1f\x79\xf3\xc9\xdf\x21\x3b\x6d\x93\x0f\xfc\xed\x95\xc7\xbd\xee\xaf\xf0\x30\xd9\xeb\x9e\xb1\xf7\x5d\x19\xda\x4d\x07\xef\x7c\xc1\x2d\x37\xbf\xfb\x63\xdf\x3f\xf3\xcc\xaf\x9e\xfb\xc7\x63\xd9\x99\x0f\x5e\x7e\xb4\xe5\xb3\xbf\xff\xb5\xdf\xdc\xb4\xdb\x56\x0f\x78\xe9\xcd\x7f\xbd\xf7\xd0\x36\xb5\x89\xfe\x92\xc7\xfa\xc3\x2d\xf7\x3f\xf8\xd2\xfb\x3c\xfc\xe3\x5f\xb8\xdb\x4b\x3e\x72\xc4\x43\x6e\x3b\xf4\x84\x0f\x5f\xfd\xa3\x87\x7c\x5b\x77\xfb\xca\xbd\xef\xc7\xec\xb7\xbe\x7d\x87\x07\xd8\x04\xee\xce\x1e\xeb\xcb\x4f\xbb\xf1\x57\x87\x1f\xb9\xfb\x27\x3e\xbc\x23\x7e\xe2\x07\xff\xfb\xd1\xbf\xfb\xfe\x13\xbf\x7f\xee\xdf\xc5\xd7\xec\xf4\xd8\xcb\x5e\xba\xdb\xfb\xcd\x63\xb6\xdc\x30\xee\xa6\x70\x77\xee\xe6\x7b\xab\x7d\xd5\x3f\xdf\xfc\x88\xd7\x3d\xff\x97\x0f\x7b\xe9\xd1\xfe\xd6\x53\x4e\x7d\xdb\x21\x3f\x78\xfa\x56\x2f\xff\xfd\xd5\x0f\x18\x9e\xba\xd7\x8e\x27\x1c\xb5\xef\x86\x71\x37\x85\xbb\xb3\xbd\x07\xbc\xef\x51\x1f\x7d\xe9\x6f\x6e\xbd\xe4\xed\x0f\x38\xed\xe3\xa7\x7f\xe4\xac\xeb\xbf\x7a\xbf\xf3\xf6\x79\xdb\xef\xd3\xbf\x4d\x8f\x38\xe0\xeb\x4f\x79\xfb\x35\x0f\xd8\x30\xee\xa6\x70\x77\x89\x14\x77\x3c\xe4\x53\x7f\x38\xfc\x1b\x7f\x7c\x22\xbc\xea\xdb\x97\x6f\x77\xc8\xb5\x8f\x3b\x64\x87\xa3\xbe\x75\xc3\x2f\x2f\x7e\xdc\xee\xef\xfd\xed\x97\x6e\x7a\xdb\x0f\x36\x44\x1b\x9b\xfa\x12\xff\x62\x2f\xc7\x37\xbe\xe7\x83\x6f\x7d\xdd\xc5\xd7\x1f\x7c\xe6\xab\x9f\xba\x13\x35\x17\x6e\x9f\x1e\x7f\xe0\x5b\xbe\x7a\xd8\x45\x1f\xba\xf9\x05\x1f\x78\xef\x4f\x5e\xaa\xef\xe8\xe5\xb8\x09\xdc\x9d\xe7\x62\x9b\x93\x2f\x7c\xd0\xe7\xf7\x3a\xee\xb4\xfa\x5f\xd2\x95\x3b\xbf\xe1\x9f\xfe\xeb\xc5\xf5\xad\xc3\x03\x3f\x79\xce\x97\x1e\x73\xef\x8b\xe5\x87\x5e\xfd\x84\x4f\x6f\x18\x77\x53\xb8\xbb\xbe\xe4\xfb\x85\x1b\x77\x3c\x1c\x6d\x7f\xfa\xe5\x67\xf2\x9d\x0e\x41\xbb\x5c\xb7\xff\x29\x6f\x3c\xfe\xb1\x87\xbc\xfc\x21\x3b\xfc\xf0\xdc\x5b\x3f\xbc\xdd\xd1\x1b\xc6\xdd\x14\xee\xce\xf6\xfe\xeb\xa7\x0f\x3c\xfa\xa1\xff\xf1\xba\xff\x75\xcd\xc1\xff\xfa\xf1\x6f\xed\x73\x7d\x78\xfd\x0b\x6e\xfc\xf7\x17\x9d\x7e\xf8\x9e\x67\x90\x2f\xfe\xe4\xc2\x17\x3f\xe0\xc4\x0d\xe3\x6e\x0a\x77\xe7\xf9\xdd\xfe\xb1\xf1\x80\xdb\xde\x7a\xed\x35\x6f\xbc\xec\xeb\xed\xab\x5e\xf1\x8b\x99\x7e\xfe\xd4\xcd\x3f\xfb\xcd\xcf\xbc\x31\xbc\xeb\xd0\xfd\xff\xf8\x94\x7b\xde\x67\xc3\xda\x6d\xea\x38\xfb\x4b\x6b\x77\x44\x35\x3d\xf2\xaa\xff\xbc\x68\xdb\x3d\xb6\x3b\xf0\x89\xd7\x9e\xf4\xad\x87\x1d\x72\xdf\xcf\xdd\x60\x9e\x48\x7e\xf7\x77\xc7\xbc\xe8\x7f\xfd\xfb\xe7\x1f\x7c\xd5\x06\x9b\x37\x85\xbb\xf3\x5c\x1c\x7e\xc4\x85\x07\xa8\x7f\xbd\xe4\x7e\xdf\x7c\xd5\x56\xc7\xee\xbe\xe5\xf3\xb7\xbb\x07\xfb\xf4\x9e\x87\x5d\xfb\x8a\x9f\xdd\x3f\xde\xf7\x7d\x17\xfe\x6d\x7f\x47\x27\x84\x4d\xe1\xee\xbc\x76\x27\xdc\xb0\xc3\x3b\xdf\xf1\xea\x6d\x9e\xf9\x8a\x83\xfe\xe6\xcc\x83\xee\xf3\xe5\x9f\x3c\xed\xaa\x77\xdf\xe7\x91\x77\x3f\xc1\xec\xf0\xe4\xf3\x0f\x3d\xe1\x9f\xda\xdd\x36\x8c\xbb\x29\xdc\x9d\xed\x3d\xf1\x65\x3f\x3e\x68\x78\xd8\x6b\x0f\x7d\xda\xef\xdb\xc3\x1e\x75\xf2\x73\x6f\x7d\xcd\xe5\x9f\xd8\xe7\xe8\x4a\x5f\x7a\x9f\xe9\x11\x0f\xde\xed\xfd\x97\xdd\x51\xe5\xb8\x29\xdc\x9d\xe7\xf7\xac\x7d\x4f\x5b\xe0\xfd\xbf\x3a\xbd\x05\x3e\xf7\xab\x5f\xdb\xee\x49\x7b\xfd\x6e\xbf\xff\xdc\xf2\x7e\xef\xf9\xc5\x1b\x4e\xa9\xe5\x81\xef\xf9\xf3\xce\x47\x6e\x58\xbb\x4d\xf9\x84\xbf\xb4\x76\x5b\x6c\xf6\xa4\xe3\x1f\xbb\xc3\xe1\xe9\xb3\xa7\x9d\xdf\x5f\xfd\xf7\x3b\x7f\xe3\x8f\x67\xec\x78\xea\x47\xcf\xf0\x17\xfe\xdb\xa3\x1f\xfe\xdb\x1f\xff\xed\x9e\xfb\x6d\xb0\x79\x53\xb8\x3b\xcf\xc5\x55\x97\xbe\xe2\xfc\xef\x5c\x75\xda\x72\xdb\xab\xde\xf7\xf2\xd3\xb7\x7e\xfb\x7b\x4f\xbc\xc7\x61\xe0\xa8\xe3\x3f\xf5\xb1\x5b\x9b\x0b\x1e\x30\x3d\xf4\x98\xcf\xdd\x71\x4f\x73\x13\xb8\x3b\xaf\xdd\x97\x2f\x02\xaf\xf9\xfd\x43\x9b\x8f\x5e\x77\xf4\xee\xdf\xfa\xc9\xd1\x3b\x5f\xdc\x3d\xf3\xd6\xe7\xfc\xe6\x88\xcb\x4f\xff\xc7\x73\xf2\xd5\xcf\x52\x0f\xdb\xfa\x8e\xb3\x78\x13\xb8\x3b\xdb\xdb\xfc\xea\xd2\x7f\xbc\xe1\xe6\x7b\xec\xd4\xfe\x68\x3a\xec\x0f\xd7\x8b\x1f\x3c\xf3\xe3\x47\xfc\xe4\xc0\x13\xbf\xff\xbc\x93\x5f\xf4\x0f\x8f\xfb\xc4\x17\x0c\xde\x30\xee\xa6\x70\x77\x9e\xdf\x77\xec\xf1\xe4\x83\xf6\x3a\xf9\xd0\x67\x1d\xf9\xd9\x7a\xbb\xf3\xff\xb4\xd7\x67\x8f\x78\xc9\x69\xbb\xfd\xc3\xb0\xc7\x45\xef\xbf\xf2\xf1\x27\x5e\x76\xe8\x73\x1e\xba\x61\xed\x36\xe5\x58\xff\xd2\xda\xdd\xfc\xf8\x5b\x4e\x79\xef\xf8\x95\x83\x7e\xf0\xd4\xcf\xbd\xef\x5d\xef\x7f\xd4\x47\xde\xf9\xb8\xef\xdd\x7c\xc3\xdb\x2e\xf9\xfd\x3f\xef\x7b\xb7\xf3\x9e\xff\x8c\x2b\x4f\xd8\x60\xf3\xa6\x70\x77\x9e\x8b\x5b\x1f\xb4\xe5\xe3\x2f\x3e\xff\x49\x87\x3c\xd8\x5e\xc1\x7e\xf0\x77\xdb\xee\xbc\xfd\x1f\x6f\x79\xeb\x6e\x07\x1c\xfd\xad\xf1\x23\x0f\xf8\xc0\x8e\xdf\x3e\xf1\x8e\x1c\xf3\xa6\x70\x77\x5e\xbb\x3f\xee\x73\xf3\xa3\x7f\x7b\xcf\x2b\xaf\x7c\xf2\x75\xd5\xc7\x8e\x7a\xc7\xe1\x5b\x3c\x7d\xef\x73\x9e\x75\xd9\x97\xf7\x3f\xf1\x23\xf7\xbd\xe6\xda\x87\xfd\xee\x0b\xf4\x0e\x46\xb9\x09\xdc\x9d\xed\xfd\xd2\x6f\x9e\x52\x9f\xb0\xf9\xe6\x6f\xe1\xcf\xbf\xe1\xea\x6d\x7f\x7e\xe9\x37\xaf\xba\xe4\x1e\x5f\xfe\x8e\x3f\x72\xfe\xfa\xa7\x3f\x72\xf6\x0f\x8e\x2e\x77\xe4\xda\x37\x85\xbb\xf3\xfc\xa2\x1f\x9e\xb9\xfb\x70\x56\xb8\xed\x19\x6f\xfc\xe0\x33\xd3\x51\xcb\xf3\xde\xf3\x94\x7d\xee\xbd\xf3\xb5\x67\xfe\xe8\xee\xcf\x7e\xc0\x23\x8e\xdf\xe2\xb9\xcf\xd9\xc0\xd0\x36\x15\xdd\xff\x65\x86\x76\xe0\x35\x5f\xbf\xe6\xd4\x4b\x76\xbd\xf8\x53\xee\x75\x3f\xdf\xf2\xe0\x0b\x5e\x75\xf6\x9e\x9f\xb9\xea\x7d\x6f\xff\xc5\xd7\xae\xfb\xc5\xc9\xfb\x7d\xee\xf2\x6f\x5d\xb6\x81\xed\x6c\x0a\x77\x57\x86\xf6\x16\xd8\x1d\x7e\xe8\xd3\x0f\xfe\xe9\xb3\xce\xf7\xfb\xfd\xe1\xfa\x8b\xb6\xdf\x75\xff\xbf\x3b\xb5\xbb\xf1\x9e\xfb\x9b\x0b\x9f\x53\x7e\xfa\xd4\xe3\xf5\x86\x91\x37\x85\xbb\x6b\x3f\x8f\x3f\xde\x72\xea\xa3\xa7\x3f\x6d\xfe\x8d\x4b\x5e\xfb\xa2\x93\x8e\x39\xf9\xbc\x07\xee\xf9\xac\xeb\x0f\x7c\xd1\x76\xbf\x7c\xcc\xf3\xef\xb7\xdb\xaf\x5f\xf3\xe6\xb7\x9f\xb7\x61\xe4\x4d\xe1\xfe\xe7\xc5\xea\xbb\x6d\x3c\xf2\x26\xdf\x43\x7b\xc8\xdd\x0e\xdd\x6c\x2b\xa9\xcd\x13\xf0\x13\x42\x0e\xb1\xee\x37\xfe\xef\x47\xff\xef\x41\xf6\x3b\xeb\x9b\xe7\xef\x72\xe9\x75\xff\xf0\x4f\x0f\x61\x5f\xf9\xde\x4e\x4f\xfd\xbb\xab\xae\x7d\xff\x89\xaf\xde\xc1\xbf\xfb\x17\x87\xbf\xfb\x3e\x67\x5d\xf5\xa5\x7f\x3f\x6a\xf7\xbb\x1d\xba\xd9\xf6\xff\xe7\x1f\x46\xe7\x69\x53\xf7\xd4\x77\x75\xfc\x0b\xff\xeb\xac\xff\xc3\x08\x5f\xf7\x9f\xb7\xec\xf0\xd9\x17\x5e\x71\xf6\x73\xc4\x7f\x1d\xb4\xdf\x63\x1e\x75\xe6\x3b\xf6\x3f\x75\x37\xf2\xd0\xf7\x5c\xf8\xe5\x27\xbf\xe4\x84\xf1\x98\xf7\x1c\xf5\xba\x8d\x7e\xc4\x1b\x7e\x74\xf5\x57\x37\x3f\xe9\xbe\xdf\x09\xd7\xbd\x27\xe6\xeb\x3e\x79\xe3\x27\x7f\xf1\xba\x1d\xda\x47\xf0\x97\xbc\x79\x5b\x77\xe5\xe9\xa7\xed\xf3\x8e\x8d\xf3\xd4\xcf\xdb\xf5\x88\xdf\xfe\xeb\xf6\xbb\xfe\xee\x47\xe7\x7c\xfe\x87\xaf\xdf\x03\x5e\xfe\xdc\x07\x5e\xb7\x3d\xff\xf5\x53\xee\xb5\xc5\xaf\x5e\xb8\xf3\xb1\xa7\x3d\x6d\xe3\x34\xfc\xd7\xe6\x9f\x76\xe7\x3d\x93\x9d\xff\xb1\x7c\xaf\xbf\xfd\xf0\x59\xff\xf2\xe5\x0f\xdc\xf8\x93\x27\x7f\xed\x07\x3b\xbb\xfc\x89\x7f\x7e\xf8\x0b\x7e\xbc\x71\x77\xbe\x07\xfd\xb9\xbd\x98\x9e\x7e\x7a\xb7\x15\x79\xca\x01\x7f\x7f\xe2\x07\x9f\x73\xf4\x63\x6f\xf8\xc6\xbb\x9e\x7f\xd4\xc1\x6f\x7c\xf7\xf2\xbd\x7b\x1d\xfa\xda\x8d\x1b\xcb\x3f\xff\x31\x87\xc1\x03\xbe\x8b\x5e\xfe\x9e\x13\x76\x7d\xfd\xe5\xaf\xbf\xf1\x2b\x4f\x7a\xe5\x8f\x3f\x0f\x0f\xd9\xf7\x82\x34\xea\x7d\x97\x3d\xcf\xbf\xfb\x4e\xf7\xfd\xbf\x5e\xd9\xda\xfd\x80\xe9\x5e\x4f\x3c\xe6\x9e\x57\x5d\x70\xd3\xd1\x27\x2f\x87\xdf\xe7\x1b\x17\xfc\x96\x7e\xf1\xd3\x7f\x73\xd1\xf7\xdf\xf8\x84\x8b\xcf\xae\xcf\xb8\xc7\x2e\x7b\xef\xbd\xf7\xb9\x77\xfb\x7f\x9b\x85\xe3\xb6\xb8\x7d\xf0\x63\x9f\xb1\xe5\x66\x9b\x6d\x76\xec\x46\x7f\xe3\xd0\x7d\x7e\xf9\x48\xbf\xff\x17\x6e\x79\xfb\x51\x1f\xd8\xef\xf3\xfe\xe4\x2f\x5d\xf0\x86\x53\x36\x7f\xd9\xfb\xbf\x74\xfc\x36\x2f\x38\xf3\x7d\x6f\xbd\xf5\x88\x9f\x6e\x04\xdd\xec\xc6\xfa\xcc\xfa\xac\xbd\x87\x0f\x1c\xf7\xeb\xff\x7c\xc9\x4e\xbf\xdc\xf9\x80\x77\x3f\xfe\xd9\xf7\xb9\xfc\xc5\x07\x5d\x79\xe5\x0f\xc9\xce\xfb\x7d\xe2\x79\x1b\x41\xbf\xff\xae\x9f\xff\xf3\xe5\xb7\x9d\x74\xe4\x4e\xa7\xbe\xec\xa5\x2f\x3d\xf2\x25\xaf\x7c\xda\x31\xf1\x7e\x17\xec\x72\xfa\xbd\xca\x9f\x5e\xb6\xdd\xb7\x2f\xb9\xe8\x7d\x47\x9d\x74\xdf\xff\xb7\x3f\x7f\xec\x33\x6e\xbb\xed\xb6\xdb\x4e\xd9\x65\xa3\xb1\xbf\x76\xc4\x25\x67\x3e\x60\xff\x4f\x7e\xef\x13\xd7\xfc\x74\x7b\x91\xdf\xf8\x86\x2f\xfe\x72\x9b\xcd\x1e\xb1\xd7\x9e\xfb\xef\xb4\x93\x3b\xfe\x9b\x3f\x79\xcc\xc6\x3f\xee\xde\xbf\xdf\xfe\x72\xf0\xfc\x9d\x8e\x7f\xc3\x7b\x8f\xe4\x97\xfd\xc3\x31\x3b\xff\xf2\xa3\x9f\xb9\xc7\x47\xcf\xb9\x1a\xfd\x69\x9b\x9f\x3c\xe4\x19\x9f\xbc\xef\x49\x1b\x41\x77\x7f\xcf\x93\x1f\xf3\x87\xbd\xfe\x5b\xec\xf5\xce\x17\xe3\x73\x7e\xbd\xe3\x15\x97\x7e\xf7\x8a\xb3\x3e\x7b\x39\xf9\x54\x2e\x37\x3c\xe5\x7d\xfb\x3c\x65\xe3\xcc\xef\xfd\x77\xbf\xe9\x47\xdf\x3e\xfb\xa5\xe9\xcc\x27\x6d\xf5\x92\xab\xf9\xf3\xf7\x7d\xd5\x8b\xff\xfc\x8a\x6e\xc1\x57\xef\xf6\x95\x73\xff\xeb\xb6\x3f\xdf\x77\x8b\x8d\xd3\x36\xd7\xbc\xe8\xb7\x27\x7f\xe8\x71\x07\xdd\x78\xca\x4b\xcf\x39\x75\xff\xa7\x7f\xf7\x33\xe5\xe4\x4b\xae\xfa\xfa\xdf\xdc\xf4\xfa\xc7\xf5\xef\xf9\xe8\x37\x5e\x70\xfe\x46\xd0\x1f\x3e\xe9\xf9\x5f\xfd\xc4\xde\x87\x1c\xf8\xf8\xd3\xc6\xb7\x9f\x7d\xc2\xb3\xff\xfc\xc7\xff\x78\xc4\x87\x1f\xf9\xda\xfe\x14\xfc\xad\x27\xb2\xd7\x5f\xad\xf6\xdd\x18\x7a\xe9\xdd\x2e\xdd\xbb\xfa\xfb\xe5\xd8\x6d\x4f\x7b\xee\xb8\xcf\x2b\xc6\x43\x2e\x7e\xaa\x3e\x6e\x38\xfd\x75\xfb\x1c\xa0\x0f\x44\xef\x3a\xe0\xd1\x1b\x41\xaf\x3e\xe9\x19\x4f\xfc\xc1\x71\x57\xec\x7b\xb9\xb5\xe8\x98\x57\xfd\xc7\xf1\xf6\xac\x27\x3c\xe5\xef\xef\x73\xae\x3e\xf7\xdf\xbf\x74\xc9\xf7\x5f\xff\x9a\x8f\x6d\x04\x3d\xf9\x17\x4f\x3f\xfe\x61\xa7\x7c\xe7\x0f\x67\xde\x70\xc4\x0e\x6f\xa6\xec\xdb\xbf\xfa\xca\x4d\x5b\xde\xda\x6e\x7d\xde\xdf\x6e\xb1\xd7\x21\x87\x7c\xe6\x3e\x1b\x97\xc3\x1e\xb6\xfd\xd3\x76\xf9\x8f\x53\xde\xfb\xf6\x47\x5f\xb0\xaf\x38\x98\xbc\xf3\x99\xff\xf5\xbc\x47\x5d\x73\xd0\x0b\x5e\xf5\xdc\x37\x3d\x35\x3d\xec\x13\x7b\x5d\xf2\x8f\x1b\x73\xd7\x1f\xbf\xff\x8c\x47\x9d\xb4\xc3\x35\xb7\x5c\xcc\x8f\xbb\xe7\x59\xff\x75\xf9\x3b\x6f\xf8\xee\x73\x8e\x3b\xf5\xba\xbb\x1f\xf0\xf2\xa7\xd0\x17\x7e\xf5\x5e\x2f\xdc\x08\x7a\x0b\x35\x47\xff\xec\x8c\x2d\xde\xfa\xb9\xb3\xdf\xd9\x7e\xfe\xd6\x53\xcf\x79\xea\xf7\xe2\xad\xef\xbc\x69\xbb\x3f\xde\xfd\xcf\x57\xe5\x5f\xec\xf2\xa9\x27\x6d\x04\x7d\xec\x1f\xce\xdf\xea\x35\xdf\x7a\xe8\x89\x4f\x7a\xd1\xfb\x9f\xbd\xd7\x8b\x9a\xf3\x3e\xba\xd3\x2b\x3f\x7c\xed\x3b\x5e\xb9\xed\x36\xe7\x9c\xfd\xf3\xcd\x77\xfd\xf5\xc6\xef\xa1\x7f\x78\xf3\xed\xce\x79\xc9\x33\xb7\xb8\x62\x87\x13\xdf\xf5\xc5\x9f\xbd\xfd\xac\xed\xc3\x8d\x0f\x7a\xfc\xd3\x76\xfc\xf1\x7b\xee\xf5\xb6\x77\xbd\xf0\x57\x6f\xdd\xf1\x92\x8d\xa0\x3b\xfb\x7b\x6e\xb6\xf5\xc5\xd3\xd3\x2f\xe6\xbf\xfd\x97\x07\x6c\x2d\xf5\x91\x0f\xb9\xf7\x29\x9f\x72\xff\x1e\xae\x3f\xf7\xc5\xc7\x1e\xf8\xa2\x17\x6c\xfc\x2d\x6c\xf3\xc7\xcb\xbe\xfe\xa7\xd3\x4e\x78\xe4\x0f\xf6\xb9\xfe\x9e\xbf\xfb\xee\x73\xfe\xfb\x91\x47\x1f\xc1\x2f\x10\x9f\xfc\xf4\x9e\x5f\xbe\xc7\x9b\xae\x7d\xde\xbf\x7c\x7a\x23\xe8\xe5\x3b\x90\xd3\x6e\x3b\xeb\x37\x9f\x7c\xc2\x67\x3e\xf2\xbd\x57\xc8\xaf\xfd\xb6\xf9\xc0\xad\x68\x9b\xcb\x77\xd2\x0f\xfc\xc8\x33\x37\xf3\x5f\x79\xcc\xc6\x17\x41\x77\xb9\xcf\x2f\xf7\xfb\x9b\x74\xb3\xea\x9f\x7c\xdc\x77\xcb\x45\xbf\x7c\xc4\x71\xf7\xfe\xd4\xd7\xea\xc3\xbe\x78\xed\x91\x6f\xfc\xc7\x0b\xf7\xdd\xee\x8c\x8f\x6c\x04\x7d\xcd\xa7\xff\xed\xd0\x17\xbe\xeb\xa2\x37\x3d\xac\xdd\xf6\xc0\x9f\xef\x70\xbf\xc3\xfc\x0e\x7b\x6e\x8e\x7f\x70\xe9\x11\x97\x3c\xe6\x61\xf7\x7b\xed\x05\xff\x57\x8b\xd6\x97\x9b\xe1\xea\x2d\x8e\xa0\x17\xbe\xf2\xa2\xaf\x1d\xf9\xf3\x87\xdf\xe3\x79\x47\x55\x9f\xba\xf8\xe7\x0f\x7f\xf8\x71\x17\x3d\xe8\x95\x2f\xbd\x6f\x7c\xfc\x71\x1b\x41\xaf\xdf\xe9\x11\xdf\xbd\xf0\x85\x0f\x80\x6a\xeb\xdd\xa7\xef\xdb\x0b\x7e\x76\xf9\xe3\xcf\x0e\xbf\xdd\xe6\x9f\x5e\x30\x7f\xb6\xdf\xfd\x64\xf9\xac\x9b\x36\x82\x3e\xe1\x73\x87\x3c\xee\xa4\x2d\xdf\xf0\x9b\x3d\x8f\xb9\xe8\x3f\x7f\xb5\xcf\xcb\x28\x3b\xfe\x73\x5f\x3d\xee\x82\x93\xcf\x7e\xd2\x56\x7b\x6c\xf7\x8f\x8f\x7c\xce\xb8\xb1\x2c\x7a\xc3\xd5\x06\x9f\xf6\xf9\x41\x3e\xfc\xc8\x93\x9f\xf9\xfd\xcf\xbe\xe9\x1d\xc3\x3d\x77\xdd\x75\xeb\x73\xff\xf9\xbc\x7d\x5e\xf9\x98\x27\x7e\xee\x82\x2f\x6e\x04\x7d\xfd\xad\xfb\x1c\xfa\x89\xc3\x7e\xf1\xb9\x07\xdf\xfd\x7d\x5b\x3c\xe8\xc5\x0f\xca\xd3\xb7\x6e\xbe\x6e\x8f\xcd\x4f\xfc\x67\xbd\xcd\x07\xf7\xd8\xfc\xfc\xdb\x0e\xde\x08\x6a\xf7\x7c\xfd\x7e\x8f\xfc\xf0\xef\xcc\x4f\xae\xbc\xe2\x19\x7f\x7e\xc4\x66\xee\x85\x5b\x3d\xe3\x91\xaf\x3e\xf6\xfe\x2f\x3f\xef\x8b\x7f\xfb\xbd\x47\xfd\xea\x82\x6d\x37\x82\x3e\x5a\x5c\x73\xfa\x0e\xfb\x7d\xe1\x8f\x7f\xfe\xc8\x07\x2f\xe6\xc7\x8a\x97\x9e\x7e\xdb\x77\x1e\xf6\xe8\x3d\x97\x54\xfe\xf4\xdd\x2f\x6f\xf6\x86\x43\x0e\xdc\x08\xfa\xc5\x6f\xff\xcd\xe7\x9f\xfd\x87\x9f\x6c\x75\xe9\x33\x76\xba\x65\x87\x17\xfe\x9d\x7f\xd7\xe3\xbf\x70\xd0\xe1\x67\x7c\xe8\xc4\x1f\x7e\xe0\x33\xc7\xed\xfe\x81\xea\xa3\x1b\x41\x5f\xf1\xe6\xb7\x5c\xf3\xec\x7f\x20\xc7\x3e\x7c\xeb\x7b\x7f\xc8\xc6\x5b\xef\x71\xf1\xbf\xbd\xe5\xd2\x63\xce\x7a\xf4\xe9\xfb\x3f\x7f\xeb\x57\x9f\x79\xc5\xe1\xa7\x6c\x7c\x64\x6c\x77\xeb\xab\xef\x7f\xe9\xb7\xdb\xc3\xbb\x37\xde\x72\xdd\xf3\xf6\xd8\xed\xc6\x73\x77\x7c\xd0\x7e\xe7\x1e\xfa\xc0\x4f\x6f\x7d\xaf\x73\xb6\x3f\x7d\xb9\xff\x46\x50\xf7\x88\x69\x78\xed\x15\xd7\x3f\xf4\xa3\x8f\x7d\xe3\x23\x7e\xf4\xdf\xaf\xdc\xf3\x5e\xcf\x7d\xfa\xfe\xea\xea\x53\x4f\xf9\xf8\x8b\xcf\x3d\x64\x5b\xab\xae\xdb\x58\x14\x7e\xf1\x85\xcd\x81\x67\x1f\xf0\xac\x7b\x1e\xd3\x7d\x7a\xb7\xfd\xd5\x11\x17\xff\xe8\xbc\x5f\xbe\x6d\xab\x97\x55\x0f\xfb\xf1\xa1\xdf\x7c\xdf\x7b\x8f\x7a\xf5\x46\xd0\xa7\x5c\xf7\x9e\x2f\xef\xf8\x41\x7e\xd2\xf6\xbf\x3e\xf7\x0d\xc3\xcd\x67\xbc\x65\xc7\xef\xb8\x3f\x3d\xfc\x6b\x6f\x7a\xed\x31\xcd\x49\x7b\x5c\x74\xe2\x71\x5f\x3c\xea\x37\xbb\xfe\xbf\x9d\xae\xff\xfb\x40\x3e\xea\x94\x5d\x6e\x77\xc1\x8f\xd9\xec\x6e\x47\xff\xec\x1e\x27\xef\xb2\xcb\x93\x5f\x74\xbf\x57\x6e\xff\xa1\x3d\xb7\x3c\x6d\xdf\x3f\x3d\x7a\x97\xdb\xce\xb8\xe8\x69\x0f\xdd\xe3\xe0\xc3\xce\x61\xa7\xe6\xdf\xf3\xed\x0f\x79\xdc\x0f\xef\xf9\xe0\x5d\x36\xdb\x6c\xb3\x1b\x9f\xbe\x99\xd8\x77\xb3\x6b\xb6\x5c\xf6\x61\xb4\x61\xae\xa6\x90\x21\xca\x38\xed\x54\x67\xa6\x14\x0d\x4d\xac\xc7\x7e\xca\x15\x2c\xac\x0a\x6a\xf0\xa4\x55\x0e\x67\x23\x49\x5b\x08\xb3\x78\x31\x23\xa2\x19\x0d\x26\x97\xcd\x1e\xbc\xd9\x03\xcf\xd8\x76\xef\xbd\xf7\xfe\xab\x59\xc1\x2a\x5a\x0f\x14\xba\x11\x2c\xa9\x13\xf3\x84\xfd\xdc\xa0\xc6\x7b\x42\x90\x99\x17\x42\xd9\x14\xd0\x90\x48\xa0\xa4\x28\x95\x17\x62\x15\xef\xfe\xfa\x56\x50\x51\xc6\x86\xf4\x06\x46\x68\xf9\x6c\x2c\xf3\xed\x90\xec\x48\x2a\xbc\x88\xb6\x27\x2e\x38\x82\xfd\x4c\x46\xaa\xa3\x95\x8e\x77\x1e\x17\xbf\xc2\x5c\x00\xd3\x4c\x8e\x73\x92\x8a\xaf\x7a\x5f\x3a\x32\x28\x3b\x57\xbd\x47\x68\xac\x71\xaf\xfd\x10\x1d\x98\xa7\x51\x80\x88\xcb\x1c\x33\x99\x59\x5a\x61\x2e\x46\x1e\x54\x33\xf8\x65\x9c\x45\xec\x85\x0d\x85\x2b\x00\x30\x93\x2e\xf2\xc4\x65\x19\x61\x1b\x47\xe9\x64\xa4\x26\x57\xa0\x8d\x18\x7a\xb7\xc2\x5c\x8c\x7a\x04\x9c\x0e\xc4\x17\x29\x5c\x32\xad\x9d\xea\x2e\x6a\x6e\xaa\x31\xa0\x3c\xd4\xa4\xc7\xf5\x38\x61\x17\xc0\x1c\xea\x42\x9c\x1e\x63\x5c\xc1\x0a\x3f\x2e\x08\x75\x94\xa7\x2c\xb1\xc6\xa3\x95\x68\x6a\xba\x99\x37\xb4\x8f\x29\xd0\x58\xd0\xd2\x43\x97\x2c\x5f\x0c\xe6\xa2\xf2\xc8\x76\xcd\x0a\x56\x70\x59\x5b\x15\xfb\x11\xa8\x2c\x4d\xe9\x38\x25\x06\x26\x08\x09\xa2\xa5\x5d\x54\xd5\x20\x5d\x98\xa8\xe3\xac\x83\x8d\x0d\x21\xb0\xef\xc6\x15\xf6\xc5\x3c\xd2\xba\xa6\x96\x3a\xe8\x41\x3b\xe5\x6a\x60\x31\x2c\xed\xac\x5c\xe9\x20\xed\x93\x29\x0b\x15\x50\xd2\x69\xd2\x8e\xe0\xa9\x1e\x71\xb5\xc2\x37\x42\xfb\xb6\x71\xb4\xe8\x30\x11\x18\x52\xd3\x59\x30\xf5\x0e\xf4\x32\xe2\x76\x9a\x65\x0d\xe7\x18\x54\x67\x3a\x1b\xe8\x94\xba\x8c\x41\xeb\x8c\x5d\xc1\x8a\xa0\x01\xd1\x9a\x75\xed\x9c\x20\x63\x00\x84\x36\x2c\x19\xe4\x05\x41\xa0\x5b\x21\x62\xd3\x90\x52\x40\xc8\x2d\xae\xb5\xc9\x79\x22\x6c\x58\xc1\x8a\xd2\x76\x61\x6e\xc7\x9c\xca\x18\x52\x82\xbe\xb2\xc3\xd2\xda\x34\x49\x02\x6a\x5e\x4b\xd8\x78\x5f\x1a\x26\x69\x53\x49\x07\x6a\xd6\xc5\x91\xaf\xb1\x2f\x6a\x17\xa2\xec\x98\x4e\x15\xab\x59\x02\xc0\xcc\x75\x35\x0e\x41\x8a\x85\x7a\xa6\xdb\x90\x5b\x0a\x4c\x32\xa6\x72\xa2\x4d\xce\xa8\x3c\xaf\x60\x85\x49\x81\xf4\x92\x36\xed\x6c\xfb\x89\xc3\x34\x81\xca\xf6\x69\x00\x8d\x25\xaa\xe7\x40\xd6\xa2\x4c\x45\x88\xa1\xcf\x86\x43\x21\x53\xdf\x91\x15\xac\x90\x73\x2b\x18\x65\xac\xe9\x7a\xa2\x9a\x36\x21\x84\xcd\xa0\xec\xa8\x79\xa1\x03\xc7\x02\xb7\x0b\x34\xa3\xd1\x13\xea\xd1\x34\xc3\x8a\xe5\x6a\x85\xf3\x22\x66\x89\x10\x98\x8a\x6f\x0a\x50\x9c\x4c\x3e\xa8\x2e\xd8\x76\x44\xc6\x86\xb4\xb0\x19\x73\x84\x7d\x33\xa6\x90\x27\x08\xb0\xa7\x21\xb6\x6b\xf8\x11\xc1\x3a\x9e\x1c\xe8\xed\xac\x01\xd4\x62\x08\x4a\xca\x29\x27\x34\x0d\xa4\x49\x66\x10\xbe\xef\x3b\xd0\x53\x95\x0d\x22\x22\x41\xd8\xae\x61\x45\x37\x76\x51\x92\x42\x2b\xb5\xd4\xd5\xa0\x4d\xc5\xd8\x50\x3a\x33\x61\xea\x87\x52\xca\x34\xa0\xe8\x67\x54\x31\x69\x5c\x23\xd2\x4c\xc0\x98\xd7\x38\xc1\x2d\x8e\xf5\x34\x2f\x75\x01\xcd\x60\x7b\x38\x0a\xd7\x8a\x12\x45\x2f\x45\x3b\x60\x25\xed\xa2\xc7\x21\x23\x86\x99\xed\x73\xb6\x84\x97\x65\x85\xb9\x58\x64\x68\xd1\xd2\xb5\x4b\xf4\x4b\x55\x14\xa4\x70\x02\x4b\x6f\x42\x89\x02\xa4\x3c\x3a\x38\x97\x6a\xae\x06\x42\x7a\x2a\xc4\xdc\xd7\xb9\xd5\x2b\xcc\x85\xe5\x46\x29\x2c\x31\xcd\xc3\xe2\x6c\xd7\xa3\xc9\x86\x49\x98\x30\x49\xdc\xa2\xd4\xc2\x3a\x58\x36\xc0\xe0\x49\xd0\x6d\x6a\x67\x28\xba\x35\xf6\x45\xca\x19\x76\xd0\xd5\x54\x65\x49\x17\x47\x28\x5c\x50\x5d\xfa\x68\x89\xd1\x58\xf6\x3e\x82\x7e\x8e\x12\xb4\x49\x0d\xa3\x48\xd0\x5a\xbe\x86\x15\xc4\x40\x3a\x01\x96\x6b\xcb\x9d\x47\x6e\x1e\x6c\x6f\x90\x05\x88\x2f\xbe\x5f\x60\xdd\xdb\x38\x8b\x19\x19\x33\xd2\xba\x50\xe2\xea\x96\xc2\x15\x56\x24\x23\xef\x83\x54\x60\xd0\x53\x3b\x73\xe8\xc4\xcc\x1c\x00\x98\xcf\x08\x51\xd5\x5b\xe9\x20\xf6\x0b\x85\x52\x82\xc1\x7a\xaa\x45\x19\x57\x88\x2f\x58\xc9\x5d\xd5\x57\x00\xf1\x7e\xb0\x84\x87\x46\x4e\x4b\x5b\xd7\xd6\xda\x06\x53\xdd\x6b\x5c\x44\x95\xea\xb8\x60\xc5\x03\xa9\x65\xcb\xa9\x5f\x61\x77\xd2\x89\x30\x33\x61\xa6\xfa\x3a\x00\x35\xb5\xce\x7b\xea\x9a\x3a\x00\xaa\x8b\x33\xa4\x49\xb8\xa5\x5e\xf4\x4d\x5b\x73\xe6\x55\x6a\x79\x95\xc1\x1a\xac\xe8\xf6\x23\xc2\xb3\x18\x0d\x76\x4d\x9b\x6d\x22\xa4\x2b\xd1\x7b\xd2\x30\x0e\x3d\x44\x6d\x8d\x25\x18\x0a\xe6\x01\xc4\xa6\x8b\x55\xe0\x2b\xc4\x17\x8c\xa9\xa6\x6f\xbb\x89\xa8\x64\xda\x12\x95\x01\xf5\x9c\x95\x9b\x6b\x6f\x71\xc3\xa2\x43\xa5\x95\x4b\x2d\x16\x58\xd5\x2e\xd4\x13\xef\x24\x5b\xe3\xbc\x00\x93\x5f\x7c\x68\x04\x27\x6d\x11\x6e\xf2\x2e\x62\x53\x15\x11\x41\xdb\xb4\xb6\x8a\xd2\xf6\x90\xc3\x31\x74\x59\x55\x9d\x9d\x65\xdb\x98\x35\xf6\x85\xf4\x44\x36\x5e\x4a\x81\xa1\x85\x4e\x57\x8a\xa3\x79\x82\x7e\x18\x03\xb6\x94\x02\x4e\xaa\x65\x49\x0d\xd3\xaa\x03\x1c\x9a\x0e\x20\xbf\x06\x13\xa0\x58\x4e\x65\x19\x34\xab\x16\xd9\x3a\x68\x89\x05\x14\x51\xd6\xcd\x62\xaa\x69\x48\x0d\x70\x3c\x0d\x68\x00\x95\x8d\x43\x4a\x8d\x9b\xab\x7a\x05\x2b\xc2\x4c\xbb\xce\x0e\x0c\xf7\x98\xcf\x14\x27\xc5\x83\x83\x1c\x86\x84\xf3\x34\xd7\xa3\x4d\xcb\xac\xc6\x3c\x01\xde\x34\xa9\x8d\x5d\x6a\xda\xff\x7f\xdc\xb9\x41\xf0\xd8\x94\x46\xbc\x82\xe0\x81\xb2\xe3\x78\x09\x4a\x3b\x92\x61\x17\x23\x81\x03\x34\x4e\xcc\x1d\x45\xb5\x00\x34\xb9\xa4\x40\x2e\x6c\x06\x63\x46\x32\x70\x13\xaa\xb0\xc6\x91\x2f\xb9\x02\x35\x5e\x6c\x4a\xa9\x37\xba\x77\x93\x6f\xa7\xb6\x1d\x49\xb1\x68\x86\x55\x48\x8e\x29\x26\x1a\x44\xa7\x14\x48\x49\xca\x95\x15\x48\x3e\xeb\x1a\xd9\x9b\x0c\xc7\xae\x68\x61\xbb\x54\x57\x0c\xe5\x28\x7c\xd5\x0b\x25\xc0\xd0\x77\xa9\x1a\x93\x1a\x23\xf5\x06\x35\x13\xc9\x4e\x57\x2b\xd0\x6b\xda\x79\x54\x83\xbe\xc1\x9c\xf1\x26\x0e\xde\x0d\x63\x33\x2a\xb9\x18\x8e\x65\xc5\xf9\x60\xa0\x95\xc8\x43\xde\x50\x9d\xe1\xa0\x79\x45\x83\x59\x61\x2e\xe6\x30\x62\x38\x18\xda\xe7\xa5\x34\xa6\x65\xad\x46\x28\xcb\x59\xcd\x45\x14\x05\x96\x3a\x2d\x7d\xe5\x13\xb1\x5e\xd4\x54\x45\x2d\xa7\x8a\xae\x41\x29\xa3\x6a\x0d\xef\x60\x93\x63\x54\x52\xa5\x4a\x9b\x29\xa5\x1e\xce\x30\xba\x40\xeb\x99\x28\x15\x48\xe7\x20\xa7\x04\x70\x49\x72\x1b\xd6\x38\xe6\x0c\x1d\x86\x04\x66\x32\x05\x5a\xcd\x0b\xd1\xa8\x6b\xb4\xe8\xa7\x81\x2c\x99\xc1\x85\x41\x89\x23\xed\xcb\x52\x0c\x07\x8c\xcd\xaa\x24\xb1\xc6\x5c\x0c\x7d\x5e\x6a\x34\x2c\x28\x27\x64\x95\xe2\x42\xe8\x6c\x03\x6f\x12\x1c\x3a\x57\xe8\x04\x90\xa3\x4d\x05\x97\x69\xf0\x1d\x45\xd1\x0d\xa0\x5f\xc1\x8a\x8a\x70\xd8\xb1\x3c\xe0\x89\xcf\x19\x85\xb9\x98\x34\x0d\x96\x90\x7a\x69\xe7\x0a\x33\xae\x1c\x4e\x78\x68\x4d\x1b\x6a\x54\x80\x54\x48\xac\xe1\xfe\x38\x9d\x81\x1a\x33\x89\xda\x45\x68\x96\x3c\x08\x5c\xb1\x2a\x61\xef\x78\x20\x41\x8b\x2c\x9b\x71\xf1\xc5\x42\x6a\x40\x4a\xac\x49\x79\x85\x53\x8b\x11\x8f\x87\xb9\x72\xb6\x57\x22\x85\xc5\x13\x30\x2c\xba\x21\x6d\xb0\x98\xcc\x6a\x9c\xfb\x81\xb5\xbd\x09\x9a\x4c\xb9\x56\x46\xd7\xb1\x03\x2b\xd0\x6b\x96\xe0\x0c\xa2\xb4\x43\x88\x50\x43\x2c\x85\x52\x0b\xe4\x90\xf9\x8e\xd9\xa6\xe6\xc0\x7b\x86\x9a\x26\x9b\x80\x69\xdd\x3b\xe2\x18\x2a\x2b\x48\xd6\x74\x64\x43\xab\x6b\xb3\x54\xc9\x27\xdd\x66\x0c\xec\xed\xcc\xde\x92\x36\x09\xd9\x8c\x61\x30\x56\x2a\x9b\xcb\x92\x00\xc5\x33\x10\x02\x8d\x6b\x7c\xa9\x5d\xdb\x33\x52\x71\x95\x5b\x88\x87\x62\x89\xd2\x2d\x4f\x35\x8d\xb3\x57\x1c\x77\x94\x8b\xb8\xf0\x10\xe6\x5e\x76\x55\xd5\xc2\x62\x0c\x58\x43\xb2\x6e\xd1\xb0\xc0\x68\x99\x55\x28\x0c\xba\xc8\xba\x31\xe3\xc4\x1d\xa4\xca\xe9\xa4\x01\xb3\x54\x27\x3c\xf3\x9a\x59\x19\xa9\x28\x55\x29\x6b\x9c\xe0\x42\xb5\x58\x74\xd4\xe5\x4e\x0a\x5f\x29\x6c\x51\xf4\x3d\x9e\xfd\xc8\x2b\xa0\x03\xe8\x4d\x4d\xe7\xbe\xa6\xed\xec\x9a\xa5\x73\x4e\x38\xbe\x06\x8d\x8a\xb8\x53\x84\xba\x41\x4a\x67\x74\x3f\x13\xcc\xea\x91\xea\x08\xe6\x58\xf3\x79\x8a\xad\xc0\x01\xa6\x6a\xd6\x86\xf3\xc1\x4a\xb4\x54\x54\xad\xb0\x2f\xac\x76\x0c\xc4\x66\xac\x01\x12\xa8\x0a\xa1\xaa\xf4\xec\xf2\x94\x2d\x6d\x66\xe6\xe9\xd8\x0e\x95\xf1\x43\xf0\x20\xb0\x0a\xa7\x2a\x3a\x2a\x57\xb0\xa2\xb1\x8a\xc4\x5e\x6b\x40\xea\x32\x4c\x4b\xb4\xfd\x04\xb8\xef\x90\x09\x29\x0e\xb5\xd7\xc2\x2e\x22\x43\x08\x59\xc6\x53\x85\x79\x21\x7e\x8d\x7d\x01\x51\x70\x54\x5b\xa4\xe6\x31\xf6\xa4\x81\x05\x98\xe0\xeb\xa5\x29\xdd\x14\xe2\x98\x2a\xee\x44\x6f\x4b\x2f\xa2\x2a\xde\xce\x8c\xe4\x6a\x0d\x99\xb6\x8a\xa0\xee\x8b\xa9\x63\xe5\x54\xd6\xb9\x03\x2a\xa9\x66\x52\x7a\x4e\x3d\x2e\x5a\xf1\xd0\x91\x90\x85\x9c\x0a\xec\x5a\xe5\x10\xa9\xc1\x1a\x3e\x15\x4f\xa2\x20\x48\xac\x6f\x43\xee\x59\xe7\x2d\x80\xc1\x4f\x9a\xd8\x82\xb1\x59\xa4\x83\x35\x01\x29\x77\x1a\xd6\x5d\x02\x24\x0a\xb2\x8a\xf8\xc3\x74\xb5\xf8\xae\xb5\x94\x4e\x36\x19\xab\x70\x0b\x63\x2b\x16\xda\xb2\xbe\x69\x2a\xd8\x18\xad\xc7\x81\x47\x39\xb7\xc3\x32\x1a\x3a\xe7\x35\xe8\x35\xe5\x5d\xdf\x4c\x66\x5c\x30\x18\x8a\xc0\xc1\xea\x32\xd1\xde\x61\x9f\x64\xaf\x30\xa0\xcb\x38\xfa\x1e\x43\xc9\xb4\xe4\xd8\xcf\xa8\x87\x7e\x85\x2f\x95\xb5\xc8\x89\x19\xcc\x93\x8a\x24\x16\xd0\x8c\xb9\xe9\xb8\xa3\x90\x53\x17\x03\xad\x25\xee\xdb\x19\x34\xbe\xc5\x5e\x32\xcb\x49\x5f\x6b\xb1\x42\xa2\x8d\x02\x39\xe1\x2a\xf2\xac\x1a\x33\x0f\xad\x8b\x55\x91\x7a\xe4\x72\x1e\x27\x03\xd1\x34\x35\xa5\xea\x9b\x5e\xc3\x3a\x47\xc5\x87\xa1\xaf\xdd\x1a\x7e\x84\x8e\xa6\xb7\x82\xf6\x60\xe9\x9a\x82\xa3\x61\xd3\x90\x92\x02\x8b\x18\x0b\x8d\x4b\x09\x35\x50\x3a\x0e\x62\xc0\x8b\xac\x02\xe1\x3d\xeb\xdb\x35\xce\x8b\xa0\x54\x9d\x01\x45\x92\x56\xc2\xdb\xb4\x40\xdd\xd4\xa4\x62\xa5\x37\x5d\x32\x0b\x84\x35\x20\x6e\x2c\x53\x17\x0a\xcb\x69\xf1\xae\x2b\x6b\xc8\xf7\xb0\xc0\x66\xa6\x8b\x64\x45\x76\x94\xb6\x7d\x87\xeb\xd2\x21\x32\xf2\x48\x28\xc8\xa8\xae\x17\xd7\xa0\x26\xd7\xd0\x37\x9d\x94\x5a\x77\xed\x0a\x92\x35\x1d\x2b\xb5\x34\xb7\x7f\xa3\xd5\x38\x75\x4a\xe1\xc5\x16\x02\xc6\x2e\x20\x42\xe3\x92\xf5\xe0\x73\xa5\x61\x55\x77\x04\x09\xe9\xc5\xe0\x88\x58\x23\x06\x2f\x26\xaa\x96\x8c\xdc\x30\xd4\x5a\x18\x54\xd1\xb0\x5d\xda\x04\xe8\xd8\x2a\x2f\x40\x35\x35\xa6\xa0\x39\x13\x44\x47\xeb\x7d\xd5\xe3\x8e\xad\x60\x85\x9e\xa1\x86\x3a\x8f\x79\xa8\xed\x58\x75\x93\xe1\x90\x61\xe5\x47\x98\xb2\xa7\x4e\xa6\x71\x94\x7e\x1e\xea\x79\xa2\x63\xcb\x95\xe9\xb9\x30\x77\x11\x3c\x36\x55\xe9\xf6\xd7\x17\x3c\x58\x4b\x96\x42\xbb\x2e\xf7\x53\x9f\xa6\x69\xf2\xb9\xab\xba\x18\x54\x33\xaa\x06\x65\xa2\xbb\x2c\x68\xe2\xc1\x8f\x23\x6c\x33\xd7\x6a\x99\xf5\xb4\xc2\xe4\xf9\xa2\x87\x59\x06\x37\x35\xf5\x82\x0c\xd2\x4b\x23\x83\x97\xb5\xb0\x93\x83\xd9\x0e\xf5\x64\x70\x66\x23\x64\x65\x56\x64\xac\x88\x0f\x7c\x85\x4f\x9b\x16\x6c\x68\x07\x45\x09\x30\xe3\x40\x84\xc4\xd1\xcf\x2d\x5f\x4c\x6a\x79\x46\xaa\x6a\x30\x32\x4a\x43\xbb\x58\x9c\x9b\x4e\xd6\x73\x2e\x2b\x64\x29\x99\xca\x73\x1c\x9b\xba\x66\x0d\xb2\xc3\x10\x00\x6c\x51\xd5\xe0\xdc\x81\x52\x0d\xb1\xc9\x52\x63\xc3\x52\x02\x95\x16\xed\xdc\x68\x98\xfd\x3a\xd4\x41\x92\x89\x99\x64\x15\x2c\x89\xa2\xb6\x80\x41\xe7\x2c\x2a\x09\x7a\x3a\x84\xa4\x24\xc1\x15\x94\x03\x4a\x9d\x0a\x4b\xac\x14\xe8\xba\x35\x3e\xed\x7a\x50\x1e\x35\x50\xe5\x7e\xf6\x76\x62\xca\xe1\xc6\x6b\x81\x11\x5b\xa8\x4c\x02\xd1\x4e\x57\x03\x1b\x64\xc9\xb1\xcd\x3d\x00\x18\x67\xbc\x86\x1c\x47\xea\x85\x55\x6e\xf0\x8d\x69\x7a\xa9\x80\x2e\xed\xc2\x85\x13\x18\xd4\xd9\x44\x29\xbb\x49\x34\xdc\x25\x8d\xad\x56\x63\x6c\x72\x2a\x2b\xe4\x81\x98\x11\x63\x72\x0e\x62\x80\x9b\x09\x8d\x33\x60\x1e\x4f\x89\xcb\xa9\x15\x74\x21\xc9\x58\x2f\x99\x9f\xf4\xcc\x40\x6b\x10\x1e\x6c\x95\xd9\x0a\x99\x7c\x46\x27\xc5\x6d\xe8\xd5\x38\xb4\x48\x77\x23\x16\xb8\xaa\x7a\x59\x45\xab\x26\xd7\xb7\x7e\x4c\x7d\xb1\x19\xf5\x23\x81\xb1\x42\x93\x4b\x70\x0d\x75\x99\xda\xc1\x2d\x75\xeb\x63\xd1\x92\x95\x05\xd2\x59\x4d\x03\x6a\x43\x93\xb1\x69\x6c\x9f\x9a\x5a\x18\x0d\xcb\xa4\x9d\x95\x65\x29\x85\x97\x71\x85\x5c\x29\x53\xb6\x35\x78\xa8\x67\x37\x0d\xa3\x4c\xed\xa4\x47\x13\xf4\x6c\x16\x6e\xa2\xa6\x5d\x29\x58\x57\x06\xf8\x36\x08\xcc\x06\xdb\xa7\xa0\x57\x91\xe3\x12\x29\x19\x80\x61\x2c\x74\x6a\x67\xe8\x2b\x61\x59\xe6\xb5\x35\xa2\xad\x13\x55\xa4\x4a\x2d\xea\xeb\xca\x0c\x6d\x58\x7c\xc3\x93\xa4\x65\x8d\x15\xa1\xa3\xaf\x30\x59\x10\xf4\x88\xa7\xb9\xad\xab\x10\xb1\x28\x0c\x8d\x3e\xcb\xa8\xba\xca\x76\xbe\xef\x2b\x33\x0c\xcb\x98\xdd\xe0\xa0\xe1\x6b\xc8\x2e\x10\x98\xa9\xbd\x9d\x41\xb5\x5a\x87\x6a\x9c\x51\xae\x42\xd3\xcc\x71\x1e\x58\x3f\xe1\x19\x57\x13\xd5\x45\x4d\x19\xa6\xb9\x53\x12\x21\xda\xae\xe1\xcd\x74\x62\x03\x9d\x28\x34\x2d\x06\xac\x20\x4f\x0a\xa8\x1d\x30\xa8\x69\x9c\x0f\x20\x4f\x62\xac\x85\xec\x43\x4d\xe7\xc5\x0c\xce\x74\x63\x5e\x83\x5e\x8f\x4a\x6b\x3d\x4f\x5d\x53\x73\x1a\xa4\xef\x00\x9b\xaa\x39\x2b\x54\x2d\x65\xc2\xb5\x71\x8b\x80\xb2\x2e\x14\xfa\x91\x4e\x6d\x0c\x6e\x1e\xd7\xb0\xa2\x70\x4c\x26\x40\x15\xb2\x98\x8c\xa1\x99\x48\x2f\x6a\xa8\xf2\xcc\x5a\x92\x2c\x26\x88\x73\x42\xb9\x71\x78\x08\x66\x34\x59\xf7\x89\xad\x61\x85\xe4\x71\xf4\x6e\xe6\x26\xd7\x5c\xa7\x56\x43\xe0\x1d\xcd\x83\x98\xa9\xef\xfc\x58\xe9\x4a\x46\xee\x7b\x58\x49\x12\x1a\x33\xb6\xd2\xb1\x15\x42\x44\x86\x6b\xd5\x48\x88\x7c\xd6\x53\x65\xc7\xd9\xeb\xaa\xc7\x4d\x85\xda\x26\x67\x62\x98\xcf\x6c\xce\x23\xb4\xdc\x56\x13\x49\x12\x34\x58\xe8\x35\x82\xf6\x61\x2c\x80\x52\x8f\x8a\x33\xf5\xd0\x2c\x5e\x7a\xd9\xe5\x65\xe6\xfd\x24\x06\xd7\x4c\xae\xa6\x29\x16\x14\xb5\xd3\x24\x2b\x3f\x75\x7d\xbb\x46\xb8\x9c\xd2\x34\x3b\x6f\x70\x62\xb0\x51\xc2\xba\xa6\xcc\x28\x88\x1e\x06\x39\xb7\x92\xb5\x03\xed\x00\x9a\xeb\x59\xc5\x01\x69\x1a\xf5\x20\xa8\x58\x43\xb2\xd6\xb5\xd3\x11\x5b\x30\x07\xd7\x8a\x8c\x54\xee\xa8\xee\x19\x6a\xb8\x32\xda\x12\x23\x33\x6e\x25\x85\x6d\xf2\x5d\x88\xbe\x09\xaa\x5d\x83\x5e\xd7\x4b\x6e\xb1\xa9\x27\x16\x38\xd5\x4b\x29\xda\x34\x8d\xa9\xf4\x20\x98\x93\xb2\x2f\x5d\x1e\x81\xd6\xcd\x22\x04\x10\xa0\xd5\x41\x2d\x71\x8d\x4c\xfe\x42\x05\xcb\x31\x23\xe5\x07\x40\x61\x06\x21\x86\x6a\xe2\x44\x22\xdf\x37\xb6\x52\xd4\x54\x49\x20\xa9\x63\xef\x41\xed\xa3\x57\x80\xae\x40\x6c\x69\x83\x2d\x73\x6c\x68\x08\x1a\x43\x4d\x0b\xc8\x28\x74\x76\x54\x9a\x7a\x30\xca\xa5\x5f\x28\xa8\x86\x82\x21\x6c\x66\x17\x61\xbf\xb4\x94\xaf\x21\x84\x41\x94\x93\x9b\x0c\xed\x83\x36\xad\x99\xc9\x20\x27\xc1\xda\x91\x57\x53\xcd\xb9\x6b\x3a\x5e\xec\x92\xfb\xd1\x67\x42\xa5\x0e\x91\x33\xba\xc6\x79\xd1\xa3\x32\x03\x5e\x55\x0b\x41\x3c\x30\x33\x88\x86\xd5\xbe\xcb\xf5\x34\x69\x20\x05\x6e\x65\x6c\x7c\x4a\x41\xba\xe2\x27\xeb\xeb\xc5\xb4\x6b\xd4\xb1\x56\x99\x4f\x14\x2c\xfd\x08\x1b\x98\x4d\xeb\x5c\x6f\xcc\x14\xeb\xd9\xf0\xc6\xa5\x8a\x7a\x14\x5c\x1c\xd4\x8c\xe7\x39\x9a\x32\x36\xba\xf1\x2b\x08\xe7\xb4\xd7\xb8\x5a\x74\x50\x31\x64\x3d\x27\xc6\x70\x8e\x89\xd4\x71\x1e\x97\xc4\x4c\x5f\x37\x3a\x96\xc1\xdc\xbe\x53\xaa\xaa\x17\x8d\x95\x1d\x5b\x23\xe2\xab\x24\xa9\x85\xc5\x6d\xc9\xa2\x9b\x8b\x6d\xc6\x98\x8b\xf3\x22\x55\x7e\x98\x44\xe2\x83\x42\x34\x75\xfd\x44\x54\xd7\x77\x33\xb6\x56\x8a\x35\x44\xc1\x5c\x2f\xd4\x22\x30\x59\xea\x74\x19\x7b\x55\x4f\xed\x94\xb9\x19\x7c\xa7\xca\x14\xe4\x0c\x50\x5f\x33\x14\x03\x65\x79\x48\xba\x42\x0c\xac\x51\x7d\x3f\xcf\x24\x62\x49\xd8\x8c\x7a\x9b\x9b\x66\x5c\x9a\x39\x46\x02\x6d\xd4\x09\xfa\x01\x07\xa9\xea\xce\xab\x64\x2a\x15\x34\x8b\x2a\x2d\xfe\xae\x82\xc7\xa6\xee\xeb\xad\x50\xe1\x01\x47\xde\x8e\xce\x91\x30\xe0\xd0\xea\x8c\xd4\xf0\x3f\xe7\x9d\xed\x33\xd2\x18\xb2\x66\x58\x20\x0c\x50\x71\xac\xca\x94\x24\x4d\xa4\x5d\x23\x03\x33\x1b\x34\x12\xbd\x08\xde\xcc\x6c\x1c\x4b\x94\x01\x24\x36\x2d\x19\x74\x56\xf7\xa8\x55\xb0\xce\xc4\x04\xbc\xd8\x2a\xaa\xa6\xaf\x73\xa8\xd6\x38\x60\x24\x03\x60\x6a\xba\x10\x5d\x10\x22\x2e\x3a\x18\x34\x7b\x8e\x96\x0a\x58\xa0\x99\x49\xa2\x10\xac\x34\x0e\x05\x31\x65\x7a\x29\xb2\x5e\x23\x14\x08\xc8\xf5\x5c\xc0\xae\x4a\xa1\xcc\xcc\x54\xad\x74\x01\x8f\x25\x2a\x55\x69\xc1\x13\x9a\x52\x9e\xfb\x9a\xe5\x98\xdc\xe0\x96\x48\x9d\x5e\x83\x46\x29\x95\x9b\x9e\xcb\x68\x64\x6d\x15\x41\xa8\x67\x21\x58\x2d\xad\xc8\x73\x67\x42\x69\x97\xb6\xa5\x98\x07\x2d\x64\xea\xc6\x79\x9a\x92\x5f\x83\x5e\xd7\x40\x71\xdb\xcb\xbe\x8f\x81\xc1\x91\x95\x31\x0d\x26\xe6\x46\xb6\xcd\x98\x2a\x52\x79\xd1\xde\x4e\xad\x6c\xcc\xbd\x62\xbe\x1f\xf5\x12\xd7\x28\xde\x9a\xda\x8a\xa9\x7e\x9c\xa4\x2a\xd2\x71\xeb\xd9\x98\x44\xa4\x0a\x34\xb5\x00\x43\x03\x07\xdd\x9b\x6c\xe6\xd4\x57\x74\x40\x55\x6c\x18\x09\x6b\x90\x39\x6c\xc7\x7e\x66\x6d\x4a\xc2\x2b\x4a\x46\xbf\x38\xcc\x17\x5a\x77\x99\x5b\x01\x60\xcd\x5d\x37\x40\xed\xa0\xb4\x0d\xaf\x86\xd9\xa9\xb0\x46\x4e\x8c\x2d\xb6\x8c\x42\x8f\x64\x56\x53\x30\xaa\x71\x19\x91\x08\x59\x1b\x29\x40\x0e\x6a\xe5\xd4\xd0\x55\xac\x59\xa0\x0d\x5a\x13\x4e\x94\x89\x6b\x58\xd1\xab\x20\x4a\x33\x93\x25\x0e\xd4\x47\x22\x38\x9a\xfb\x5c\xb5\x8b\xec\x22\x69\x95\xeb\x05\x6a\x33\xed\x80\x6c\x5a\xdf\x35\xb6\x97\x5e\xac\x51\x8b\x85\x50\x8f\x80\x9e\x5b\x36\xcf\x21\x8a\x12\x09\xb1\x34\x65\x45\x0b\x6d\xea\x26\x2c\x25\x48\xd0\x4f\x32\xd1\xd8\x88\x7e\x1c\x86\xbe\xac\x52\x8a\x3c\x0e\x10\x27\xd8\xb2\x8e\x0f\x6a\x5a\x74\xbd\x4c\x6e\x20\x19\x8a\x46\x9b\xc9\x2f\x93\x11\xcc\x85\x36\x68\x56\x83\x89\xcf\x43\xe0\xae\x5b\x63\x2e\x14\x4a\xd8\x83\x05\x0e\xaa\x0d\x61\x72\xed\xc2\xbb\xe8\xbd\x9e\x22\x1d\xa3\x14\x06\xa2\x92\x28\xa5\x1d\x16\x72\x8a\x5d\x35\x6a\xb7\xca\x45\x3c\xd9\xea\x3e\xf2\xa5\xaa\x06\x49\x35\x73\x84\x12\xc5\x97\x65\x1e\x65\xb6\x63\x35\x98\xba\x80\x31\x68\x97\x13\x0d\xdc\xce\x1a\x8f\x73\xb7\x06\x75\x70\x41\xd6\x43\x28\xd5\xe2\x81\xad\x45\xec\xbc\xbf\x3d\x3e\xf0\xad\x24\x48\x72\x5f\x95\x49\x56\xd0\x2f\x4d\x37\xce\xc6\x35\x84\x73\xd3\xae\x21\x16\x0f\xaa\x36\x95\x61\x7d\x9c\x5b\xe7\xa6\x42\xa6\x21\xf2\x31\x60\x56\x84\xe9\x16\xd9\x74\xfd\x52\xa7\xae\x8f\x61\x1a\xf4\x0c\x97\xd1\xe1\x35\xc4\x1f\x66\xbb\xa1\xad\x24\x5f\xe8\x24\x4a\x4f\x21\x57\xb0\x92\x0d\x27\x43\x6f\xc7\xd9\xa2\x66\xc1\xd4\xc2\x41\xc0\x8a\x34\x7e\xc4\xb6\xa2\x24\xaf\x11\x5f\xe0\x6e\xac\xb5\x6f\x88\x56\x18\xcf\xae\xd7\x88\x80\xb2\xa4\xce\xce\x63\x5f\x3b\x2f\x6a\x3d\x05\x83\x4a\xaa\xd5\x44\x66\xb1\xf0\x21\xb2\x35\xae\xb4\x44\xe6\xbb\x46\x88\xa8\xaa\x6c\xc8\xd0\xfb\xc5\x3a\xd3\xf9\xa9\x9b\x44\x03\xdb\x11\xdb\xa1\xea\x1a\xee\x64\xc2\x4e\xd7\x80\xf5\x55\x16\x6b\xf8\x54\x0d\x27\x6d\x4b\x69\x24\xf2\xb3\x1e\x2d\x91\xbd\xd1\xa5\x8c\x3a\x4f\x88\x02\x53\x09\x03\xbc\x60\x36\x62\xcf\xa2\xb3\xc5\xb8\x61\x5c\xa3\x3a\x8e\xf3\xb9\x0a\x55\x37\x23\x32\x46\x05\x07\xd0\xe1\xb1\x22\x63\xc6\x08\x39\x0b\x7c\xe1\x21\xcb\xd4\x4c\x7c\x70\xb0\xd3\x75\x6c\x04\xe1\x6b\x90\xb9\xa4\xda\x31\xf2\x85\xd4\xb6\x27\xac\xe6\x73\x95\x4c\x27\x74\xa9\x88\xc1\x53\xd5\x72\x4b\x5d\xc7\xa3\xd6\x26\x2e\x73\x65\x79\xd7\x53\xb1\xc6\x55\xea\xae\x64\x43\xc5\x1c\x27\x9b\x20\x11\x35\x4e\xae\xb6\xb1\x00\xd5\x1b\x6a\x01\x19\x52\x07\x17\x02\xbb\xa8\x4a\x1f\x47\xd3\xe3\x44\xd6\xa8\x6f\xa6\xbe\xc5\xc8\x8e\x55\xe9\xc6\x2a\x8f\x1e\x56\x5d\x1d\x0b\xcb\x8b\xf5\xaa\x77\xdd\x34\xcc\x99\x43\xeb\x5d\x07\x02\x58\x6e\xff\xaa\x27\xb6\x46\x8a\x8b\x05\x58\x04\xa6\xcb\x34\x29\xc6\xfb\x3a\x46\xda\x2e\xcb\x54\x66\x8e\xc6\xc2\x17\x8b\x3d\xc3\x18\xe0\x5c\xe9\x91\x28\x86\x46\x38\xf8\xbc\x86\x10\x26\xfb\xa9\xd6\x4c\x8f\x7d\xd3\x68\x86\x49\xc7\x17\x4f\x90\x1d\xd3\xe2\xa0\xed\x99\xc1\xae\xd0\x9c\x82\x9a\x59\x9d\xeb\x1a\xe1\x79\xce\x6b\x30\x01\xc1\x9b\x29\x31\x36\xe4\x0e\xcf\x8e\x20\x53\x15\x4a\x5a\x00\x00\x66\xcc\x36\xc5\x9b\x50\x53\xbe\xe4\xba\x31\xa5\x27\x86\x39\xdc\x77\x6b\x9c\x17\xbd\x5f\xc0\x28\x3b\x84\x17\x11\xa1\x2e\x7e\xe1\x39\x14\xdf\x34\x74\xa8\x41\x27\x96\x09\x39\x03\x6b\xc0\x2a\xc6\xed\x54\x87\x7e\x59\xd8\x1a\x82\x47\x29\xb9\x89\x1d\x1e\x49\x3d\xc4\x42\x5a\xcf\x89\x64\xa8\x73\xbe\x2e\x33\x22\x95\x99\x51\xd2\x0d\xd4\xc2\x65\x63\x0d\x8f\x65\xa0\x62\x0d\x26\x60\xfb\xc9\x52\x35\x38\xe3\xcc\x80\xab\xb8\x70\x42\x0a\x9f\xca\x0c\xda\x29\x2d\x10\x37\x52\x92\x96\x12\x43\x82\x33\x8e\x88\x7a\xa6\x66\x8d\x6f\x84\x87\xb6\xa2\xb3\x1f\xa1\x77\x78\x4e\x1c\x4f\x20\x4b\x3b\xb6\x15\x9c\x44\x99\x4a\x29\x04\x48\x2c\xca\x5c\xcd\x69\xa0\x54\xf7\x5d\x62\x6b\xf8\x54\x50\xb2\x6f\x0d\x87\xb5\xe4\x3c\x39\xb6\x38\x65\xf3\x88\xca\x84\x2b\x35\x8e\x63\xef\x87\x06\x8d\xb8\x77\x2a\x14\x88\x83\x6b\xeb\x9e\xa1\xbb\x08\x1e\x9b\xea\x3a\xb4\x42\x85\x87\x5e\xba\xde\xb8\x80\x46\xd8\x2e\xc0\xf1\x65\x5e\x92\xac\xeb\x6e\x60\x48\xd9\x06\x8e\x36\xb6\xa4\x83\x5c\x86\x54\xc0\x50\xb9\x94\x8d\x5f\xe3\x32\x09\x19\xf0\x98\x6d\x6d\x41\x6d\x90\xab\x66\xa2\xa6\x4a\xd2\xb9\xb4\x0b\x1b\x0d\x96\x36\xb9\x51\x12\x5d\x39\x29\x26\x04\xa4\x9f\xfa\x7a\x8d\x5c\x29\x93\x48\x0a\xb9\x68\xcf\x58\x48\x0e\x56\x63\x5a\x6c\x17\x54\xd7\xc9\x16\x80\x5a\x79\xd6\xf6\xba\x91\x65\x14\x9d\x58\xb8\x59\x46\x14\xc4\x1a\x05\xd1\x11\x24\x95\x4a\xbb\xd8\x42\x6d\xd5\xc2\xba\x4a\x7d\xdd\x20\xed\x05\xc4\xdd\x3c\x3a\xad\x26\x66\xe5\x50\x4f\x9d\x16\xa1\xc4\x7a\x89\xab\xb8\x3f\xa8\x73\x85\x9c\xe9\xc6\x2e\x0d\x3a\x16\x3e\x35\x2d\x9f\x7a\x05\xbb\xa4\x02\x0f\x0b\xf2\x12\xc3\x58\xf7\x8a\x2e\xa1\xeb\x4b\x9b\xc3\x2a\x9f\xb6\x59\x2a\x27\xb0\xb9\xfd\x34\x9d\xea\x3a\x22\x33\x37\x73\x62\xf5\x34\xfb\x36\x7a\xc5\x45\x3f\x11\x99\x3d\xe9\x35\xb4\xa1\x48\x25\xaa\x76\x8d\x15\x81\x0a\xd7\x54\xe3\xb8\x88\xa1\x63\x9c\x50\x1f\x68\x5f\xf2\x34\x07\xe8\x30\x29\x74\xf6\x28\x78\x50\xd7\xa5\x75\x94\xe6\x85\xb0\x5a\xaf\x51\xf9\x13\x9a\x29\x65\xc4\x04\x33\x33\x1d\xfb\xa1\x80\x0a\x10\x96\x0d\x25\x96\x9a\x32\x11\x41\x58\x5b\xc5\x80\x53\xb0\x6d\xdd\xb7\x19\x2a\xbe\x86\xfb\x6b\xe5\x08\xb4\xa3\x30\x8c\x4b\xdd\x56\x63\xdb\x3a\x8b\xf9\xc4\x41\x35\x2e\x7c\xf4\x7a\xac\xbb\x89\x67\x8f\x67\x57\x37\x6d\x28\x0a\x81\x71\x8d\x2e\x09\x86\x34\x7d\x65\xb9\x58\x3c\x6a\x86\x25\xb5\x02\xd6\x99\x2d\xbd\xa7\xed\x28\x24\x1b\x6b\x83\x48\x1d\xa6\x2e\xd4\x13\x63\xaa\xc4\x2e\xc7\x15\xc2\x22\xda\x28\x21\x2d\xee\xba\x62\xb3\x17\x45\x35\x61\x61\xc8\xd0\xac\x15\x28\x69\x58\x34\xe8\x65\xab\x3a\xd4\x9a\xae\xaa\x6b\xcf\x91\x48\x6b\x64\x1d\x68\xce\x10\x8f\xae\xd1\x10\xa1\xae\xaf\x11\x67\x8b\x31\x3d\x57\x98\x28\xd0\x93\x51\xd0\x11\xda\x81\x73\x02\x12\x20\xae\xd2\x80\xb1\x55\x32\x30\xcb\xe0\x1a\x39\x2c\x0c\x62\xd4\x79\x03\xa0\x9a\x3a\x3a\x4d\x19\x8d\xad\xf7\x73\x94\xa3\x64\x33\x4a\xbd\x00\x69\x52\xcd\x44\x96\x5e\xb7\x2b\x64\xf2\x59\x1d\x8c\x07\xd9\xe7\x4e\x7b\xdf\xcd\x30\x37\xc1\x62\xb0\x84\xc9\x58\x4c\xca\x62\xe6\x6a\xae\x01\x18\x62\x80\xa3\xac\x16\x33\x75\x8e\xaf\xb1\x2f\xb8\x97\xe3\xc0\x74\x9c\x07\x32\x23\x4d\x01\x98\xea\x46\xf9\x1e\xf5\xf5\xd4\x41\x0e\x87\x6c\x70\xdf\x2e\x4d\xe5\x8b\xaf\x70\x89\xb6\xf1\x6b\x54\x84\x4d\x9d\x19\xac\xa4\xa9\x15\x0b\x6b\x48\x88\x1a\xd4\x0c\xcf\xff\x13\xa4\x34\x99\x22\xc0\xa4\xe0\xa2\x02\xdc\x29\xc5\xfb\x2c\x62\x1b\xd7\x08\xda\x47\xc4\x33\x17\x5c\x11\x69\x86\x90\x73\x1d\x53\xb7\xa8\xae\x44\x25\x8d\x58\x4a\x93\xbb\xcc\x66\x89\x17\x06\x9b\x89\x02\xd0\x26\xd8\xae\x91\x99\x2b\xb4\x21\x40\x53\x84\xe7\x25\xb9\x86\xc0\xd4\x4f\x8b\x74\x30\xc5\x7e\x81\x29\xc7\xa2\x19\x9b\x98\xb4\xd4\x68\x6e\xfa\x2a\x30\xb0\x46\x47\x2a\x0a\x91\x15\x81\xd6\x69\xc4\x7a\xca\x75\x05\x5b\x59\x5c\x04\x65\x70\xa5\x6d\x16\xca\x68\x6d\x3a\xb5\xc4\xdc\x5b\x3b\x15\x2c\xfb\x56\xb1\x35\x4a\xd4\x3d\xea\xeb\xcc\x26\xab\x25\x48\x8b\xec\x93\xd2\x0a\xa1\x6a\xb6\x25\xc9\x79\x52\xbd\x47\x24\x0c\x89\x0e\xf3\xc2\xb4\x23\x74\x48\x4b\xb7\x46\xd5\x24\x5f\x2c\x1c\x96\x3e\x4c\xa4\x56\x5d\x95\x4d\x5d\x6a\x46\x3b\x39\x45\xd0\x8c\xed\x30\xc1\x11\x83\x46\x2e\x13\x34\x4d\x82\x13\xf4\x58\x8c\x6b\x74\xe7\xea\x46\x22\xc9\x54\xa4\x8f\xe3\xd4\x35\x56\x8d\x62\x64\xb8\x6e\xa1\xe3\x40\x4b\x93\xe3\x48\x97\xa4\x66\xc4\xa2\x8f\x33\x71\xcc\x27\xba\x86\x7c\x5f\x52\x2e\x55\x9b\x79\xdb\x36\xc5\xc5\xc9\x8c\x5e\x54\x64\x48\xc1\x0d\x4e\xe2\xe0\xf5\x4c\x32\x40\x70\x20\x1d\xee\x6c\x1b\x69\x20\x6b\x24\x97\xa8\x73\x54\xe6\xda\xa4\x49\x74\xa9\x27\x11\x0c\xb5\x68\x1a\xd7\x24\xdf\x12\x30\xa4\xda\x70\x92\xab\x28\x40\xa5\x27\x4e\xe4\xd8\x8d\x33\x5d\xa3\x87\x47\x46\xcb\x24\x28\x01\xd8\x90\x10\x55\xdb\xc1\x86\x11\x35\xf5\xad\x6f\xe6\x48\x20\xe9\x62\xe5\x19\xa4\x02\x2c\x26\xb7\x6d\xe2\xb5\x58\xa5\xdb\xce\xc4\xe6\x4e\x07\x53\xdb\x66\x52\x30\x4d\x16\xf5\x93\x45\x49\xa2\x02\x28\x6f\x3b\x3b\xcd\xed\xd2\x9a\x31\x47\xdf\x4e\x32\x84\x1e\xa0\x6e\x8d\xba\xb4\xa1\x9b\x07\x43\x48\x8b\x71\x53\x79\x41\x07\x59\x43\x53\x54\xa3\x21\x28\xa6\x64\x24\x5d\x4f\xa4\x8c\xa0\xe6\xb4\xf3\xa6\x52\x4d\xb5\xca\x05\x4d\x94\x7b\xad\x58\x25\x15\x46\xca\x1b\x3d\xcc\xbe\x23\x60\x6e\x67\x65\x81\xe3\x55\x44\x6c\x60\x20\xc8\x34\xd2\x01\x24\xd9\xf4\xed\x04\x56\x49\xa8\xb4\xc5\x1b\x84\xb5\x33\x51\x2f\xbc\x2b\x4d\x6a\x53\x4f\xe8\x44\x4c\x17\x5b\xdb\x90\x76\x96\x10\x33\xad\x66\x8d\xa8\x6b\x22\xe1\x6b\x54\xdf\xd3\x5e\x38\xde\x54\xce\x22\xe5\x88\x83\x98\xfb\x7a\x31\xb5\xc8\xbc\xab\x1c\x67\xb6\xcf\x8b\x0f\x26\xd1\x31\x2a\x69\xc3\xa0\x12\xae\xf8\x1a\x67\xa7\x14\x70\xae\x2c\x82\x69\x68\x60\x34\x14\x58\x82\x30\x2a\x29\x67\x45\x64\xf4\x2d\xb4\x53\x1f\x4a\x4e\x00\xca\xa9\xe5\xb9\xa9\xc2\x2a\x5d\xdb\x10\x84\x4b\x5b\x8d\xd6\x74\x13\x1d\xb1\x57\xe3\xd0\x2d\x94\x9a\x25\x92\x5c\x53\xe8\x61\x85\xc6\x28\x03\x6d\xe8\x64\x66\x5c\x0d\x50\x02\x70\x17\xc1\x63\x53\xbd\x93\x57\x10\x3c\x8a\xef\x96\x69\x40\xa0\xf3\x24\xd2\x4e\xb1\xd0\xf0\xcc\xf9\x60\x6c\xe0\xd4\x34\x19\x38\x29\x32\x5b\xc8\xd4\x15\x16\x87\xaa\x9d\xa4\x5e\x63\x09\x07\x20\x75\xcb\x55\x3b\x72\x07\xe2\xc0\x4c\xdb\xa0\x65\xec\x13\x74\x75\x84\x51\x47\x6e\xfa\x4c\x0a\x9a\x52\xb6\x4a\x72\xde\x51\x37\xae\x51\x2a\x44\x0b\xed\x26\x36\x51\xd8\x23\x6d\x40\x4d\x9c\x98\x43\xc1\x72\x20\xae\x1b\xe7\x6a\xc0\xcc\xe8\x85\xbb\x2c\x78\xab\xc9\xd8\xa4\x6e\x5c\xa5\x81\xab\x31\xc3\x9c\xb4\x1f\x67\x2b\xf3\x0c\x8b\x26\x73\x47\x52\x99\x81\x8c\x1d\x96\x1c\x78\x47\xfd\xa0\x91\xd1\xa8\x75\xc4\xaa\xc4\xdb\x76\x0d\xc7\x23\x1d\x4d\x23\xcb\x8a\x97\x28\x69\x47\x29\xc9\x8b\x30\x72\x59\x0a\x9a\xa9\x01\x52\x77\xce\x34\xf5\x18\x38\x9b\xa6\xb1\xe1\x4d\x16\xd5\x1a\x12\x14\xd5\x61\xee\xb5\x50\x13\x0b\x12\xd4\x75\x28\x03\x11\x36\x29\x8c\x4d\xe9\xa2\xad\x8c\xf0\x83\x04\xd5\x10\x91\x8e\x35\x13\x90\xf0\x55\xee\x95\xa6\x14\xed\x02\x9b\xc9\xb3\xde\xcd\x49\x12\x54\x23\x36\xda\x6a\xec\x06\x05\x59\x71\x26\x8d\x83\x18\x72\xc7\xbd\x68\x70\x94\xa9\x69\x37\xd2\x32\xff\x8a\xc1\x59\xa0\x03\xd0\xb0\x46\x28\x30\x93\xe7\x16\xf8\xbe\x9d\x7c\x46\x89\x37\x8b\x0a\x83\x85\xbc\xe5\xd0\xd0\x11\x35\x2c\x76\x4b\xaa\x1b\xb1\x06\x81\xf1\x0e\x01\xe2\x07\x96\xd4\xed\x1e\x4e\x94\x41\x56\x41\xe6\xd0\xce\x79\xac\x24\x0f\xb8\xc1\x7e\x5e\xac\xe7\xbc\x47\x8b\xa8\xa5\x60\x74\x8d\x7d\x31\x31\x6c\x1a\x30\x62\xdb\xd1\xba\x35\x09\x8c\x76\x84\xba\xaa\x89\xae\x22\x98\x87\x12\xfb\x1e\x0e\x21\x14\x6d\xeb\x7e\x9c\x46\xb7\x60\xb0\xca\x8d\xce\xa2\x91\x1b\xa5\xe8\xa1\x10\x3c\x78\x80\xbd\x18\xb9\x0e\x43\x1c\x78\x3f\x75\x64\x4c\xb6\xe3\x6e\xa9\xab\xaa\xf4\xb4\x95\x68\xa8\xca\x1a\xe5\xb7\x52\x7b\x54\x06\x5e\x39\xda\x89\x9c\xb5\x18\x31\xaf\xc2\xb8\xf0\x60\x8d\xea\xfb\x79\x14\x32\xa6\x66\x92\x35\x9f\x61\x65\x1a\x4c\x97\x55\xba\x24\xc4\x85\x04\xce\x79\x3d\x22\x8d\xf5\xff\x54\x71\x70\x3b\x4f\x83\x6d\xaa\x05\x4d\x3d\x2a\x35\xc0\x6d\x0f\xea\x60\x42\x16\xb4\xc5\xca\xc5\x55\xae\xf7\x00\xa9\xfd\xe2\x91\xf0\x96\x4c\x76\x31\x91\x23\x40\xeb\x5c\xb5\xbc\x9f\xa8\xb6\xb8\x69\x1c\x91\xb1\x2d\xd9\xb3\xa2\x71\x6b\x66\xba\x46\x85\x07\xf5\xcb\x32\x08\x3c\xe3\x56\x6a\xee\x55\xec\xab\xb6\x62\x61\x71\x96\x37\x63\x35\x23\x03\x34\x18\xdd\xb2\x90\x42\x38\x4b\xdd\x80\x11\x58\x21\x6f\xcc\x34\xa5\x03\x8d\xca\xf0\x3c\xf6\x41\x54\x63\x87\xbd\x8b\x35\xb1\xa5\xd1\x16\xb9\x8a\x40\xde\xb6\xa4\x4a\x42\x4b\x2f\xaa\x0a\x82\xd8\xad\x41\xe6\x9c\x15\x23\x1c\x61\x6f\x6b\x37\x0a\xe5\x23\x60\x98\xd8\x66\x6c\x91\xf7\x8b\x9b\x02\x9e\x08\x5d\x96\xd9\xf5\xde\x69\x0d\x30\x9b\x97\xb8\x46\x9b\xb7\x2e\x2b\x09\x97\x94\xad\xae\xad\x0e\x19\x71\x2c\x45\xd5\x85\xc8\x47\x27\x59\x15\x1d\xaf\x10\x45\x28\x05\x9e\x06\x89\x8c\xc4\xa9\x5d\x23\x6f\xdc\x52\x5c\xaa\xd8\xaa\xb6\x9f\x02\x4f\x89\x91\x58\xa9\xe4\xf9\xec\x2a\x12\xeb\xc6\xf6\x96\xf7\xfd\x10\x67\xd8\xbb\xc1\x8b\xc6\x10\x93\xd7\xa8\xfc\x91\x1a\x9a\x45\x0e\x8a\x05\x2b\xaa\x9a\x02\xe6\x12\x6d\x86\x3c\x14\x33\x45\xee\x87\x1e\xe3\x51\xf9\x56\x12\xdc\x4f\x7c\x96\x2e\x28\xb6\x86\x7c\xbf\x74\xb8\xed\xdc\x14\x46\x40\x92\x9a\x5c\x97\xc7\x54\x29\x60\xb4\xb0\xc6\x32\xe5\xa4\xe1\xa9\xf4\xac\x67\xdc\xa6\x2e\xf3\x30\x9b\x35\xfc\x08\x1d\xa1\x61\x36\xa4\x99\x84\x32\x2f\xad\x4c\x1c\xcf\x71\x9c\x2a\xad\x3b\x07\xf5\x32\x06\xe2\xa8\x1e\x35\x9d\x25\xcd\x8a\x73\x32\x80\x35\x9a\x10\xd2\x42\xbd\x0d\xcc\x47\xe4\xa7\x5a\xb7\x34\x41\xd0\x27\x8e\xca\xd8\x16\x1d\x50\x0e\x29\x4d\xbd\x16\xcb\x30\x2b\x0c\x6b\xa2\x79\x23\xdb\x55\xb2\xd7\x03\x91\xc4\xa6\xb9\x5b\x7c\x01\xda\x2d\x62\x8a\x15\x11\x61\xf4\xc3\x60\x64\xac\xea\xe4\x46\x3d\x71\x9e\x49\xea\xa7\x09\xa2\xdc\xaf\xd2\x46\x96\x26\x2b\xbd\x99\x3b\x3f\x94\x60\xc5\x24\x16\x0e\x5a\x50\xa9\x58\xe6\x81\x53\xcf\xc2\xd8\x0f\x43\x17\xc2\x34\x69\xe9\xbd\x6e\xb4\x5a\xe3\x4a\x0b\x23\x81\x12\x53\x17\xec\x53\xef\x1a\x68\x9d\xec\x65\x37\x97\x19\xf5\xb3\xc6\x18\x2f\x92\x5a\x42\x24\xac\x21\xee\xa6\x59\x36\xc8\xc7\x35\xe4\x38\x2a\x2a\x3c\x00\x4c\x60\x4a\xb0\x69\x80\x10\x50\xd3\x04\x5b\xdb\x37\xb6\xf1\x0b\xcb\x03\x4f\x9d\xb1\x6d\x4d\x66\x25\x16\x38\xb6\xbe\xa1\x6b\xf4\x76\x41\xdd\x48\x97\x6c\x79\x97\xf2\x10\x85\x61\x28\xce\xcc\x36\x60\xd1\xad\x0d\x84\x07\x11\xe4\x18\x2d\x24\x7d\x0d\x47\xa0\x68\x99\xeb\x55\xc4\x62\xa6\xba\x36\x4b\x39\x76\xc9\x55\x4b\x98\xc9\x20\xe5\xe0\x87\xd4\x32\xd3\x97\x65\x60\xd8\xd6\x13\x84\x8b\xa8\x00\xe3\x1c\x3a\x56\xab\x55\xda\x0d\xd4\x55\x47\xfb\x1a\x68\xb4\xb8\x7a\x31\x8d\x07\xde\x77\x3c\xf1\x28\x3a\xd7\xea\x0c\x79\x2f\x84\xad\x05\xa9\xa6\x25\x78\x51\xaa\x8a\xad\x22\x35\xe8\xd0\x7a\x8c\xcc\xc0\x21\x1e\x13\x23\x5d\x9b\xf3\x30\x39\x66\x50\xe8\x22\x6b\x7d\xca\x4a\xd7\x70\xee\xbc\xeb\x08\x8f\x73\xec\x78\xb5\x46\xc4\x27\xa1\x9d\x49\x83\x65\xd3\x6b\x5e\x4f\x26\x44\x37\x8d\xc3\xd4\x4b\x8a\x89\x74\xa9\x82\xad\xa0\x00\x2b\x32\x36\x80\x34\x42\x11\x8c\x36\xf2\xec\x77\x08\x1e\x9b\x78\x01\x6a\x95\x57\x5a\x50\x31\xdc\x64\x63\x71\x8b\x96\xc2\x78\xa6\x8b\x99\x94\x04\xa3\x4f\x2e\x20\x32\xe3\x36\xa0\xb9\xb4\xac\x19\x50\x8e\xc9\x76\xab\x5c\xe3\x88\x22\x23\xd2\x2c\xdc\x23\xad\x27\x19\x68\x94\x6d\x5b\xa5\x5a\x3a\x0f\x55\x1d\x03\x41\x0e\x5a\xd1\xa9\xe4\x4c\x0f\xe7\xd2\xe8\x1a\xac\x51\x66\x39\x0a\x18\x6e\x0f\x13\x65\xf2\x2d\x20\x9d\x0b\x60\x68\x85\x5d\x22\x83\xd0\x55\x03\x0f\x0d\x91\x90\xe5\xc1\xcf\x23\x33\xae\x92\x70\x06\x6b\xb8\x3f\x84\x66\x5d\xa0\x8c\x55\xdf\xf4\x83\x81\xc3\xed\x51\xa0\x45\x73\x0c\xed\x08\x25\xe1\xed\x64\xa3\x1a\xe8\x50\x18\x68\xe3\x80\xb0\xc3\x7e\x8d\xb9\x40\x19\xce\x10\xa0\x3a\x7b\x63\x2a\x5b\xeb\xd2\x41\x49\x67\x37\x67\xec\x7c\x3d\x54\x73\x2f\xe8\x20\x59\x5d\x54\xa6\xd2\x37\x23\xe3\x6b\x10\x18\x46\x2b\x21\x18\xc3\xb2\x57\x8b\x5e\x66\xab\xc6\x41\xd8\xde\x42\xd9\xa7\x54\x65\xa3\x96\x0e\x4c\x6e\xe8\xeb\x6a\x9a\x96\x39\xab\xb1\x06\xdd\x1a\xb7\xd5\x6a\x94\x6a\xd8\x99\xec\x24\xef\x97\x52\xc3\x41\x34\xcc\x7b\xd7\x85\xd6\xd7\x15\x08\xb4\x1e\x08\x2d\x93\x0c\x3e\xe0\x7e\xd6\x71\x90\x6c\x0d\x51\xb0\x9b\x1c\x31\xa6\x6a\x06\x0f\x10\xb1\x72\xa8\xe0\x02\x08\x18\xd5\xcc\x95\xad\xc4\xd0\x74\x1e\x34\x46\xc0\x79\xa2\x86\xe8\x99\xc9\xbc\xc6\x4d\x5f\x3a\x07\xa6\x9a\xca\xd5\x99\x91\x29\x2c\x4c\x0e\x63\x18\x18\x0f\x64\x64\x25\x2c\x74\x84\x8c\x60\x21\x35\x9f\x8b\xb1\xb9\x9f\x61\xa8\x56\xe9\x10\x9d\x52\x33\xf5\x01\xab\x92\x05\xf1\xd2\xcc\x98\x0c\xd6\xc5\x7e\x9e\x0d\x9b\xc5\x52\xaa\x0c\x65\x1f\x03\x87\x85\x85\x41\xb0\x66\x29\x6b\x08\x61\x14\x0e\x83\x41\xc4\x91\x6e\xea\x6d\x0c\xa1\x87\x02\xb7\x3a\x18\xd9\xbb\x8e\x75\x88\x2b\xd1\x18\x2c\x7a\x56\xb3\x19\x2e\xc6\x57\x4c\xfb\x35\x82\xb3\x5a\xb3\x85\x04\xd4\xce\x95\x32\x05\x1a\x0a\x32\x6d\xe6\x69\xea\xa7\x4c\x83\x00\x13\x71\x0d\x33\xbd\x36\x75\x17\x86\x01\xb6\x02\xaa\x35\x3a\x03\xb0\x89\x86\xd0\x7b\x88\xfb\x89\xb4\x8e\xda\x52\xc3\xc5\xe8\xba\x0f\x95\x1e\xa6\x54\x35\x93\x92\x36\x35\x33\x8c\x52\xf4\xb9\x8b\xb3\x8c\xdd\x1a\xfb\xa2\x5f\x18\x9a\x9c\x00\x38\x55\x3a\x8c\x5d\xac\x78\xad\x2c\x19\x61\xd5\xc4\x96\x4f\xd6\x16\x50\x8b\xac\x0a\x94\xca\xaa\xca\xaa\x40\xf9\x2a\xfd\x09\x4a\x55\x91\xd6\xc4\xf6\x76\x2a\x29\xbb\x64\x47\x26\xfc\x50\x44\x89\x44\xfa\x79\x08\xb1\x5b\x58\x06\xad\x80\xb9\x2b\x7a\x92\x58\xe7\x35\x42\xc4\xaa\x67\xcb\x8c\x2a\x41\xab\x31\x8a\x79\x08\x3c\x6b\x85\x9b\x06\x85\x88\xc3\x44\xe3\x38\x76\x12\x80\x46\x12\x80\x52\x9a\x82\x40\xb6\x5d\xa3\xa5\x2e\x49\x61\x2a\x52\x33\x38\xd7\x74\x1e\x5c\x5d\x08\x9d\x60\xe8\x80\xc6\x11\xf1\x89\x2e\x0d\xe6\x8b\x1f\x53\x93\x34\x52\x53\xd0\x41\xe6\x35\xea\xd2\x64\x14\x96\xf1\x3e\x75\x85\x84\x6c\x3b\xab\x67\x45\x89\x03\xb4\x13\xb6\x03\x43\x76\x55\x55\x55\x53\x9b\xe7\x29\x67\xe3\xfb\x0a\xea\x6e\x0d\xea\x30\xf5\x6c\xe4\x35\x64\x4c\xd2\x45\x70\x9f\xaa\xb6\x32\xa3\x24\x43\x06\xd4\xab\xc0\x24\x5f\xb8\x83\xdd\x82\x8a\xe0\x15\xc2\x74\xf0\xab\x34\x9b\xf3\x7d\x36\x5a\x67\xdb\x0c\x55\x3f\xf9\x1a\x29\x30\xc3\x6e\x8c\x95\x9b\x90\x01\xbe\x6e\x78\x87\x13\xa2\x4b\x93\x00\xc8\x19\xe7\x00\xd6\x28\x88\x66\x0e\xce\x81\x2c\x46\x34\x19\x01\x67\x00\x19\x27\x2b\x61\xd3\x76\x26\x80\xe0\x45\x53\xbc\x24\x65\xf2\x61\xc1\x4a\x61\x81\xaa\x96\xad\x71\x1d\x90\xa2\x59\xe3\xde\x4d\x03\xec\x9a\x7e\x91\xa8\xcf\x08\x86\x2a\x90\x06\xc8\x5e\xe6\xce\x28\xa3\x74\x29\x95\x20\x75\x69\xbb\x41\x2c\x30\xea\x35\xea\x58\x6d\xd5\x91\xec\xe8\xec\x62\x2c\x71\x02\x16\xa2\xb9\xb8\xa8\xeb\x02\x52\xe8\x3b\x6b\xf1\x00\xa2\x00\x55\xc8\x3d\x56\x91\xd6\xa9\x5e\xa5\x1d\x39\xb2\xd2\x22\x10\xfa\x81\x4d\x54\xd2\x98\xb9\x77\xd1\xf5\x4d\x43\x3d\x85\xd0\x57\xa4\x68\xed\x4c\x5e\x6e\xe7\xdb\xdc\x85\x5e\xf8\x55\xba\x30\x39\x25\xb4\x1e\x16\x35\xaa\xb2\x34\x81\xa2\x66\x52\x24\x19\x15\x84\x75\xed\x82\xc5\x34\x83\x41\x36\x0d\x61\x56\x77\x63\x66\x6a\x9a\xd7\xb8\x62\xcf\x06\x48\x55\x27\x48\x10\x81\x2e\x43\xc3\x97\x71\xf4\xd1\xe4\xb9\xc2\xae\xb5\x93\x69\xdb\x6e\xba\x3d\xc2\xa1\xde\x27\x5b\xe5\xd9\xb3\xe2\xd7\xa8\x3f\x9a\xfb\x05\x67\x9e\xf1\x6c\x4a\x37\x2f\xcd\x68\x3a\xb0\xd4\x38\xa8\x9a\xd6\x8d\xac\xa8\xf7\x3d\x31\x1a\x27\x8d\x21\x2a\x45\xe5\xa4\x57\xa9\x63\x5d\x80\x8c\xa5\xb8\x38\x94\x32\xf2\xe0\x11\x49\x6e\x8c\x50\x73\x35\x68\x29\x1b\x8e\x58\xd3\x8d\x05\x6a\xc9\x5c\xac\xc7\x09\x30\xbe\x86\x1c\x47\xe5\x18\x61\x4d\x94\x61\x3a\xc5\x11\x34\xa6\xd3\xed\x00\x75\x64\xb6\x47\xa0\x99\x07\xe3\x12\xe3\x0b\xf1\xb6\x50\xa0\x14\xea\xdd\xd8\xad\x21\x78\x34\xa3\x28\xe3\xdc\xb1\x3a\xb5\xb4\xa6\x7a\x99\x48\xe3\xf9\x68\x55\x19\xaa\xde\xb6\x2e\x0d\xc1\xb5\x15\x53\xb8\x86\xbd\x1d\x33\xc7\xae\x5d\x43\x08\x63\x85\x52\xa5\x14\xb4\xd5\x52\xbc\x98\x6c\x35\xd0\x31\x03\xca\x17\x08\xbc\xcc\x85\x77\x9a\x1b\xae\x2a\x06\x84\xca\xce\x77\x4e\x98\x35\xa4\x49\x1e\x87\x4e\x0f\xd4\x42\x15\x86\x08\x9a\xa5\x1e\xf8\x08\x24\x2a\x61\xbc\x3d\xc0\xe2\x72\xb1\xbd\x41\x33\xec\x75\xc1\x29\xb5\xc8\x2d\x60\xb9\x8b\xe0\xb1\xa9\x77\xac\x57\xa8\xf0\xe0\x8a\x4f\x89\x57\x10\xd7\x9c\x87\x96\x21\xe4\x02\x94\x14\x26\x42\x53\x8b\x42\xf6\x63\xe7\xe6\xa9\x9b\xbb\x1e\xc0\xae\xf1\x42\xf5\x7c\x8d\x50\x80\x14\x3e\x34\x38\x2b\x1d\xaa\x71\x98\x41\xab\x30\x24\xa0\x33\x5a\x7b\x58\x8a\x65\x24\x45\xe9\xf8\xb4\xb4\xc2\x74\x22\x31\x42\xd2\x1a\x77\xf2\x59\xe7\x4b\x96\x95\x0a\x15\xc9\x32\xf2\xb6\x1d\x95\x72\x72\x88\x15\x11\x2a\x64\x19\x85\x61\xcc\xb0\x1a\xa1\xba\xf6\xf3\x2c\x96\xc4\xcd\x1a\x99\xb9\xba\xef\xf4\xa2\xea\x91\x24\x0b\xfa\x84\x5c\x4b\x3d\x5e\x46\x5c\x71\xe7\x6f\xa7\x90\xa4\x8f\xd8\xf4\x1d\x8d\xb6\x17\x7d\x72\xa8\x9e\xc3\x1a\xef\xe6\x68\x27\xec\x38\x15\x69\x99\x8e\xd5\xd2\x6b\x82\x61\x69\x6a\x48\xd4\x88\xc0\x20\x47\x6a\x4c\xe1\x8d\x4f\x5d\x5e\x48\xd5\xa5\x9e\x40\xb0\xc6\x31\x67\x6a\xe9\x2d\x6c\x22\xac\x94\x28\xa5\x44\x6a\x5b\x66\xeb\x26\x48\xc9\x00\x05\xac\xf1\xda\x02\x29\x2b\xe8\x5a\x20\x59\x42\x06\xac\x51\xa2\xce\x46\x90\x72\x87\xf8\xa2\x34\x52\x59\x56\xd0\xa2\xac\x8c\x58\x24\xa2\x08\xf9\x6e\x72\x1e\xb6\xb3\xea\x47\x7e\xfb\x54\x84\x05\xd9\x7e\x8d\x67\x26\xa9\xae\xda\xda\x39\x8d\x3c\x5e\xf4\x54\x34\x63\x7d\x23\xb1\x20\x0c\x17\x02\xb0\x57\x4e\x52\x9b\x58\xd2\x4d\xd0\xc5\x22\x88\xb2\x5c\x85\x46\x81\x84\x21\xcb\x7d\x8c\xba\xc8\x8c\x86\x5a\x82\xb9\xb3\x1c\xb2\xa1\xe5\x98\x77\xae\xc5\xe3\x8c\x0d\x86\x13\xac\x6c\x33\x32\x35\x92\xb2\xc6\xee\x94\x93\xea\xb8\xaf\xc6\x45\x27\xcb\xb3\x54\xc0\x85\xa9\xb1\xc0\x40\xa6\x30\x4d\x4d\x0d\x46\x9e\xa7\xc5\xb4\x6d\x5c\xda\x5a\xf8\xbe\x5e\x23\xf7\xc1\xaa\x2e\x44\x08\x70\x45\x09\x56\x9c\x4e\xe4\x76\xaf\x17\x2c\x37\xd3\x88\xf1\xa0\x54\x3f\x78\xd3\x3a\xda\x19\xdb\x0d\xf3\x50\xf5\xba\x2b\x6b\xe8\xfd\x72\x89\x64\x21\x2e\x05\xc4\xf4\x08\xda\x68\x20\x1a\x10\x4d\x26\xf6\x95\xa7\x53\x2d\x94\x2e\xfd\x24\xf4\x62\x61\x2a\x4c\xa9\x5e\xe8\x35\x9e\x2b\x36\x8c\xd1\xd4\x0f\x3c\xa0\xa5\x2d\xad\x57\xc1\x98\xd4\x82\x2e\x5a\x36\x4f\x22\x8d\xa9\x33\x35\xb4\x36\x2e\xb7\x47\xca\x09\x8e\x89\x54\x6b\x7c\xa9\x45\x2d\xb1\x53\x38\x2d\x42\x5b\x9b\x15\x26\x85\xb3\x5a\x62\x28\xc4\xbc\x64\x5d\xab\x39\x85\x4e\x19\x81\x67\x13\x71\xd3\x0e\xd0\xd0\x35\xa8\x43\xc6\x4c\x74\xb1\x2d\x33\xd3\xa3\x1d\x93\x37\x88\x87\xce\x39\x08\x08\xa2\x3d\xc3\x1d\x1c\x62\x2d\x8a\x21\x23\x6f\x83\xaf\x8a\xa9\xd7\x78\x5a\x91\xc1\x5c\xe7\x61\xd6\x22\x69\x36\xb7\x3e\x8d\xa1\x37\xbd\x4b\x30\x4c\x4b\x5f\x92\x42\x21\x10\x85\x62\x6e\x51\xc5\x32\x02\x31\x88\x4e\xaf\x51\xaf\xd8\xd0\x99\x77\x4e\x41\x6a\x10\x9e\x59\x61\xce\xcd\x70\x88\x15\x52\xc6\x72\x8e\x6a\xd7\xb6\x42\xf2\x40\x34\x50\x15\x66\x20\xa6\x30\xae\x20\x16\xb3\xae\x8f\x44\xf9\x21\x9a\x11\xa0\x39\x66\xd7\xb5\x00\x86\x0c\xd4\x84\x74\x54\xa2\x53\x6e\xf0\xb6\x0d\x75\x9c\x5a\x93\x51\x13\xd1\xc4\xd6\x20\xb6\x31\x2c\x58\x57\x1d\x90\x08\x89\xc1\x0f\x35\x1c\x8a\x2b\xb2\x06\x1c\x7a\x87\x9b\xe4\x9a\xd9\x2b\xd5\xa1\x06\x17\x41\x02\xb5\x7c\xc9\x6b\xd4\xa5\x59\xa5\x72\xeb\x6a\x4c\x25\x8c\xa3\xeb\x58\xe8\x06\x09\x14\x6a\xcd\xd2\xf4\x52\x49\x0a\xe6\x26\xf3\x1c\xf1\x34\xb7\x0c\x35\x92\xcc\xab\x54\x35\x90\x82\x87\x16\x72\x46\xbc\x80\x35\xb7\x63\x6e\x14\x84\xa5\xd7\x4a\x8c\x4e\x63\x17\xca\xd4\x21\xec\xa6\xd9\x30\xdc\xe3\x01\xb4\x55\x59\xe3\x04\x0f\x3e\xe7\x31\xf7\x44\x63\x5c\x54\xea\x25\x8e\x70\x18\xc6\x4e\x30\xc5\x40\x3d\xe5\xc6\xa7\x29\xd7\x20\x4a\x38\x41\xd5\x79\x19\xe3\x2a\xe2\x4f\x4c\xaa\xc6\x3d\xc2\x11\x61\xa0\x65\x49\x78\xa0\x13\x37\x4e\xe1\x5a\x2d\x5e\xc8\xd8\xfb\x59\x72\x14\x3a\x25\x84\x65\xb8\x43\xc6\xac\x52\x8b\xc5\x16\xd8\x0e\x75\x4d\x05\x90\xa2\x6f\x7c\xa2\x86\x15\x51\x2b\x34\x21\xde\xcf\x1d\x99\x43\x50\x6c\x92\xbc\x33\x71\xac\x46\x30\x23\xbe\x86\x64\x1d\xdd\x24\x68\x03\x03\x56\x68\x36\xde\xd7\xb3\x49\x11\x80\x6e\x10\x76\x51\x2d\x43\x1e\xcd\xa4\x85\x63\xe7\x87\x28\x13\xb7\xb9\xd0\xb8\x42\x6f\x17\xe6\x9b\x9a\x0d\xa0\x11\x22\x8d\x14\xce\xad\x71\xed\x04\xac\xec\x4d\x59\xda\x32\xf9\xde\x54\xac\x56\xcc\x67\xad\xbb\xa5\x9b\x2c\x11\x74\x95\x88\xaf\xa1\x73\x93\x19\x98\x62\x93\xa0\x06\x44\x24\x4f\xf0\x22\x7c\xdd\x8b\xe4\x61\xaa\x9a\x0a\x88\x49\x4d\x6e\x99\x33\xaf\x63\xe6\x3a\xae\xf2\xa0\x44\x13\x93\xeb\xbc\x45\x63\xae\xe0\xe4\x9a\x6a\xa4\xb6\x5f\x78\xea\x15\x42\x0b\xac\x5d\xe9\xc2\x38\x2d\x1e\xc4\x4a\x2d\x9d\x68\x83\x60\x61\x8d\xdd\xc9\xdb\x39\x45\x91\x58\x0f\xf2\x52\x0d\x5d\xd1\xe3\x2c\x50\xdb\x36\x3c\x99\x4a\x4d\x3d\xad\x17\xcf\xba\x0c\x02\xb0\x03\x4c\xe3\xc2\xcc\x2a\x17\xfd\x83\xaa\xe6\x4a\x74\xc2\x6a\x2e\x87\x59\x4c\x00\x98\xc5\x55\x89\xc6\x1e\xb7\xd9\x0c\x72\x9c\xb2\x1c\x86\x21\x05\xd3\xd8\x46\x14\xb7\xac\xd1\x8e\x9c\xb9\x86\x99\x60\x46\xd2\x62\x08\x03\x17\x55\x41\x01\x6b\xd8\x47\xd6\x77\x02\x5b\x94\x47\x15\xe6\x31\xe1\x89\xb0\x2c\x7c\x69\x88\x58\xe3\x1b\xa1\x9e\xf9\xd6\xaa\x1e\x99\x11\x7a\x51\x4f\x3c\xd6\x22\xe0\x99\xe2\x44\xe1\x32\x78\x03\xa6\x7e\x91\x59\x55\x2e\xa7\x6e\xf1\x83\xb2\x78\xbc\xeb\xb3\xb4\x27\xff\xe2\xe9\xc7\x3f\xec\x94\xef\xfc\xe1\xcc\x1b\x8e\xd8\xe1\xcd\x94\x7d\xfb\x57\x5f\xb9\x69\xcb\x5b\xdb\xad\xcf\xfb\xdb\x2d\xf6\x3a\xe4\x90\xcf\xdc\xe7\xc5\x2b\x54\x78\xf0\x04\x8b\x8f\x42\xb6\x95\x81\x58\x1a\xdd\x8d\x11\x95\x46\xa6\x58\xc1\x99\xb2\xa6\x99\x59\x21\xae\x8a\x88\xce\xf5\x30\xb5\x43\xcd\xfd\x1a\x8e\xc7\xaa\x11\x0a\x8b\xc6\x7e\x16\x72\x09\xb3\x01\xbc\xca\x65\x74\x3d\x88\x78\x50\x94\x66\x1b\x63\xa4\xb6\x4b\x76\x70\x33\x67\xa8\x8b\x6b\x34\x8f\x62\x03\x09\x26\xe6\xde\x63\x86\x02\xf4\xaa\x07\xc0\x08\x95\x41\x47\xb1\x9d\x2d\x87\xc1\xcd\x7e\x6c\x84\x4d\x61\x51\xa1\xed\x1d\xad\xe8\x1a\x57\x17\x78\xa7\xeb\xd0\x24\x0f\x9c\xd0\xa1\xe5\xb6\xeb\x27\x8f\xc6\x49\xfb\x25\x82\x71\xe6\x93\x77\x80\xa6\x59\x6a\x4d\x24\xf1\x88\xc1\xd6\xaf\x11\x22\x0e\x19\x08\x8f\x60\x90\xaa\xc7\xc6\x20\x38\xf4\x35\x62\x8e\x12\xaf\x11\xd7\xb9\x5f\x82\x14\x46\x5b\x5a\xd3\xae\x1e\xeb\xb1\x61\xc6\xac\x91\x43\x47\xb2\x60\x8b\xa0\x0c\x0d\xd4\x83\x5f\x82\x42\x2c\x2d\xae\xca\x51\x2a\x82\xeb\xa5\x69\x86\xcc\x3d\x52\x2d\x34\xb5\xd3\x6a\xd4\xb4\x5d\xa3\xc3\xcc\x82\x24\x6b\xbb\xff\x1f\x6d\xff\xfa\x02\xd0\xf7\xaf\x05\x42\x32\x39\x32\x13\xcd\xe0\x38\x9d\x29\x69\x32\x83\x66\x1a\x88\x21\x66\xaf\xb5\xf6\x22\xa6\x99\xa1\x24\xa4\xc6\x2c\xf0\x64\x21\x12\xad\xfb\xfd\x7e\x5f\x22\x22\x1d\x0a\x7b\x61\xf9\xc2\xb4\x23\x19\x8a\xe2\x0b\x0d\x4c\x4d\xa3\xc8\xa2\xb2\x0c\x35\x02\x25\x0d\x84\x42\xc3\xbc\x74\xd1\x22\x4b\xa5\x0b\xdf\xf3\xeb\xc4\x81\xe3\xab\xe6\xb7\xff\x83\xc5\xda\x7b\x7d\x2e\xcf\xf3\xf9\x3c\x8f\x37\x67\x3a\xfa\x14\x9a\xfb\xe9\xcc\x84\xb6\x0c\x92\xd5\xd9\xb8\x39\xeb\x30\xf4\x28\xdf\x4b\x60\x0c\xf8\x4c\xf7\x45\x12\x26\x6d\x2a\x18\xd8\x5b\x00\x73\x5c\x80\xc5\x87\xbc\xa0\x48\x4d\xe5\x18\x47\xf8\x94\x32\xbf\xab\x43\x1f\x4e\xad\xbe\x27\x56\xbf\xb0\x56\xa4\x57\xa3\x09\x4a\x6b\x0a\x7b\x5d\x13\xe9\x23\xbd\x46\xaf\x31\x06\x14\xf5\xc9\xc4\x03\x59\x26\x3b\x65\x86\x55\xdf\x43\x9e\x41\xbe\xf0\x8a\x21\xb8\x3b\x3a\x21\x15\xdd\x8f\xcd\x5b\x83\x39\xcc\xbc\x8e\xc8\x75\x1b\x48\x14\xb1\x47\xbc\xa8\xdd\x8d\x57\xca\xc6\xd4\x3a\xe7\x27\x4c\xfe\x59\x86\xb3\x18\xb6\x2b\xd4\x99\x14\x7c\x37\x64\x60\xf2\x34\xd6\xce\x71\x00\x54\x0f\x4a\x81\xdd\x6e\xe0\x66\xf0\xe6\x5d\xe4\x7c\xb1\x63\xbb\x04\x1f\xde\x73\xf6\x22\x16\xb3\xea\xe6\x4e\x30\x92\xc2\xe2\xa5\x17\xd1\x87\x03\x4c\x14\x03\x9a\x78\x13\xa2\x9e\x63\xcb\x4b\xbe\x98\x3f\x9a\x16\x92\x7b\x6b\x2a\xdc\xfb\x7a\xd3\x99\xb2\xbf\x02\x19\xcc\x28\x7c\x5e\x2a\xcc\x7b\xdb\xa2\xa7\x9a\xd7\xdc\xba\x0d\x8a\xe3\x13\xa7\x01\xd2\x77\x4c\xca\x4c\x02\x01\xc7\xdc\xf5\x17\x11\xe7\x17\x00\xb9\x1a\x2f\x47\x68\xd6\xbb\xb7\x38\x45\xd9\x62\x79\x0a\x4a\x2f\xfb\x42\xa8\xd3\x5b\x65\xc0\x73\xfa\x94\xb8\x9b\x0d\x71\x35\x74\xf3\xd3\x46\x00\x20\xdb\x12\x2d\x42\x5c\xe9\xc1\x26\xab\x2b\x2f\xe2\x22\x35\x5f\x78\x8e\x75\x3f\xf7\xca\x28\x6f\xb9\x8b\x0f\xd1\xe8\x5b\x5f\x17\x1f\xf8\x08\x08\xb7\xdc\x37\x07\x0c\x4f\xe7\x66\xf0\x9d\xbd\x2a\xfc\xda\x2f\x0a\xd5\x5a\xed\x94\xf9\xd1\xfe\xb0\xdc\xbc\x7c\x98\x0e\x75\x3d\xb0\xe3\xae\xa3\xb7\xd0\x10\x06\xcc\x5e\x05\xb7\x1e\xa2\xbb\xc0\xa9\xfa\xc5\xfc\x91\xd9\x33\x92\x3d\x19\x90\x2d\x40\x56\x8e\x9b\xcb\xcd\x2d\xaf\x78\x9d\x07\x11\x1a\x10\xee\x0d\xac\xb0\x1c\x5b\x0a\x27\xe7\x4d\xbf\x80\xef\x8f\xd2\xdd\x8a\xe8\xe8\x19\x9c\x3d\xa6\xce\x31\x71\xcb\xaf\x84\x47\x33\x5a\xe1\x0e\x39\xd1\x8b\x86\x7b\xeb\xa4\xee\xcd\x35\x97\x4f\xbe\xc8\x32\x86\x0e\x37\x71\xdc\x1c\xdc\x5e\xf1\xad\x87\x1e\x05\x09\xf4\x36\xb7\x0e\x3a\x32\x69\xd3\xa0\x29\xe7\x4e\xf3\xb7\x00\xf3\x89\xda\xce\x86\x6b\x3d\xe5\xf1\x11\x6f\x3a\xa0\x25\x07\xf1\xc7\x9e\x55\xd3\x68\x03\x28\x60\x1c\x18\xd8\xf0\xc4\x78\x86\x52\x79\xfb\x89\x87\x10\xf5\x49\x8f\xa3\xe5\x4e\x61\xa0\xa6\x54\xc4\xf4\x1a\x79\x3b\xdf\xad\xb3\x2a\x65\xbe\x1d\x6b\x7c\x79\x98\xe1\x21\x1a\xfb\x00\x3e\x99\xad\xe0\xbd\x8b\x87\x18\xd8\xe6\xd8\xe0\x9d\x7c\xea\x82\x6d\xc3\x1d\x8c\x8a\x8e\x41\xa2\x3f\x57\xd7\x39\x89\xc1\x07\x54\x1f\xef\xfd\x62\x3a\x8e\xe4\xc0\x7c\x34\xea\x6d\xa1\x98\xd0\xe0\x93\x57\xbb\xae\x40\xed\x9d\x83\x55\x96\xbb\x0e\xe4\xdc\xcd\x42\x1c\xe6\xae\xd0\xd4\x9f\x2f\x72\xea\xa3\x3a\x3c\xb3\xb4\x96\x0e\x85\x30\x39\x24\x29\xc2\x24\x90\xac\xd4\x9b\x04\xb4\xa1\x2e\xa2\x44\xef\x2c\x45\xf2\x4a\xe4\xfa\x17\x22\xc7\x14\x89\x42\xf1\x2c\x40\x85\xf7\xd2\x4a\xf1\x59\xe0\xce\x23\xbc\x04\x38\x39\xa9\x26\xbf\x6f\x24\xfc\x59\xce\x0b\x42\x50\x5a\xf9\x13\x6f\x29\xee\x30\x8b\xc0\x0f\x7c\x76\xb0\x24\xf8\x6c\x4f\x9d\x0f\x64\xfe\xc2\xcd\x35\xe3\xcc\x70\x2a\x55\x4a\xf8\x70\xd4\xe2\xb9\x85\x7d\xf1\x46\x8c\xbe\x30\xda\xe6\x4b\xc9\x28\xb1\xfd\x92\x96\x81\x1e\xba\xe6\xcd\xee\xf0\xe5\x52\xf6\xc8\x21\x5f\xfe\xee\x1f\x8e\xe8\xca\x43\xbf\x98\x38\x4f\xe2\xb1\x04\x2b\xc8\x97\xa1\x27\x5e\x82\xfd\x0c\x2d\x29\xc0\xf2\x93\xc9\x03\x4e\xe4\x19\xd3\x0e\x93\x63\x34\xa7\xb1\x9a\x74\x5f\xc8\x0b\x6f\x70\x87\x7d\x97\xc1\x94\x24\x49\xde\xf4\x43\x87\x34\xde\xa7\x47\x96\xcb\x74\x8d\x12\xdd\xe0\x29\x59\x95\x57\xcd\xd7\x06\x04\x3f\x99\x14\x0c\x2e\xdc\xe2\x05\x44\x4a\x83\xa9\x72\xac\xfb\x50\x37\xcb\x13\xbc\x40\x89\x1d\x2b\xdb\xa3\x78\x6d\x74\x00\x8e\xe3\x0b\xdf\x74\xbf\xa0\x3e\x59\x08\x6a\x0a\x2b\x73\x38\x16\x0d\x1a\xf0\x3c\xa6\x50\x6e\xfa\xc4\x00\x06\x92\xd9\xa8\x6a\xfa\x23\xba\xb0\x4f\xd4\x17\xea\x9f\xd3\x8f\xfc\x2c\xe0\xf1\xeb\xfe\xe9\x7f\xf5\x97\xff\xaf\x7f\xe7\x7f\xe3\x77\xfc\x7b\xff\xd4\xaf\xe0\xff\x49\xfc\xd3\xbf\xf2\xaf\xfe\xea\x7f\xfe\xaf\xff\x27\x7e\xcd\x7f\xe1\x3f\xfe\xdb\xfe\x95\xf9\xcb\xfe\x5b\xff\xda\x9f\xfb\xf5\x1f\x4c\x78\x38\x60\xfc\xfb\x0c\xe6\x5f\xe5\xef\xb6\xfc\x91\x04\xb3\x83\x4c\x03\x09\xc6\xa4\x31\x98\x84\x16\xbc\x5d\x70\x5b\x9a\xbb\xb5\xfd\x44\x39\x9c\x07\xa2\x50\x13\x7a\x95\xc4\xe6\xba\x15\xa5\xd0\xe0\x2d\xa8\xc9\x86\x6e\x8e\xcd\x5b\x73\xf7\x8c\xe3\xca\x09\x14\xde\xa5\x7c\x31\x5b\x41\x2a\x50\x45\x83\x1a\x49\x0f\x4e\xe8\xbd\x06\x1e\x19\xde\x64\xad\x33\x0c\xd5\xf8\x76\x39\xf8\x66\x8e\x60\x65\x53\x36\x33\xd9\xfa\x45\xb9\x9c\x9c\x97\x36\xcd\xa3\xa6\xa1\x95\xf6\xbc\x4b\xdb\x8b\x73\x36\x60\xb0\x37\xbe\x33\x39\x33\x39\xd1\xe0\x1d\x70\x87\xfb\x88\xf5\x09\xd4\xe0\x3d\xef\x47\xd0\xe6\x55\xe3\x46\x75\xfc\x9e\x31\xfa\x10\x63\x2b\x8f\x20\x64\xf9\x1e\x73\x96\x30\x8f\x5c\xee\x45\xf8\x9c\x4b\xbf\x70\x22\x8f\xd1\x56\x70\xc1\x61\xd7\xb4\xda\xd0\x78\x74\x9d\x3e\x2e\xd0\x60\x5a\x44\x9e\x50\x85\x77\x2b\x9f\x86\x13\x7b\x9c\x81\xdd\x3d\x5f\x0c\xb2\x2d\x6f\x46\x9c\x16\x40\xb4\xc7\xd8\xb8\x0b\x65\xaa\xcd\x20\xb4\x01\xa9\x65\x59\x21\x74\xa4\x06\xf7\xb9\xf5\xd5\xf8\x45\x15\x3f\x5f\x70\xe8\xaf\x69\x26\x9d\xbd\x33\x08\xa5\xd1\x99\xb4\x0d\xd7\x0d\x91\xd6\x35\x95\x6f\x5f\xd3\xa5\x97\x6e\x5b\x7d\xb4\xb8\x6d\x6f\xc5\x27\x5e\x31\xb5\x2b\xec\x88\xf7\xc8\x10\xb6\xaa\x09\xa2\xd2\x57\x09\xb3\xeb\x9b\xb8\x3d\x8f\xd4\xc3\xe8\x22\x9d\x89\xa4\xdd\x27\xbf\x82\x7c\x62\xc5\x6a\x09\x85\x6f\x5a\xde\xb5\x9b\x3d\x25\x4f\x7d\xcd\x63\x0c\x78\x53\xf9\x21\x66\xe4\xd4\x98\x5d\xe9\xce\x56\x8b\xc2\x52\x27\x39\x9e\x2f\x9a\xfc\xab\xd1\x5a\xfa\x7d\x4d\x54\x46\xda\x67\xd5\x31\xe9\x11\x55\x24\xd9\xf6\x9a\xbc\x49\xfe\xac\x43\x26\x7f\x64\x91\x69\x09\x09\x3e\x31\x29\x6b\x47\x78\x6e\x38\x59\x9e\xf4\x75\x62\x07\x78\xe3\x46\x9e\x61\xd9\x14\x75\xb4\x30\x2e\xda\x5b\x04\x69\x2f\x0e\xc3\x76\xdf\xce\x17\x70\x9c\xba\x24\x8d\xdd\xf2\x63\x0e\x6a\x01\x46\x9f\xb0\x23\xfd\x9c\x27\xe7\x1c\x16\x72\x39\xd2\x40\xa6\x55\xc1\x6a\xc2\x5f\xe5\xbc\xff\x42\xab\x41\x1f\xd7\x77\x0c\x88\xf1\xd4\x5c\x91\x60\xd8\x98\x18\x62\x7e\xa8\x1d\x47\x86\xc0\x3f\xa0\x6d\x38\x94\x79\x02\xa9\x3c\x6e\xc1\xbe\x60\xf2\x37\xaf\x6b\x43\x59\xdb\xd0\xfb\x66\x14\xf4\xbb\x8b\x83\x46\x33\xd2\x3a\x0c\x56\xd0\x52\xeb\x5b\x78\xf1\x2d\x20\x6a\xe8\xaa\xec\x8b\x29\x28\xe6\x8e\x21\x2d\xed\x7a\x69\x8e\x2f\x15\xb1\x86\xb7\x30\x7e\x15\x1b\xfb\x6d\x23\x87\x4e\x8b\x9e\xec\x8d\xaf\x8b\xd8\x45\x64\xc9\x17\xf3\x04\xfc\x84\x80\x60\xeb\x94\x3f\x3b\x35\xe1\xad\x20\x28\x75\xd5\xf9\x0f\x2d\x1e\xeb\x45\x36\xf9\x20\x73\x88\xe2\xcf\x73\x6c\x7b\x92\xfd\xc2\xc9\xa8\x01\xa3\x46\x04\xfe\x09\x37\x1c\x27\x99\x10\xc8\x15\x9c\x8a\xa0\x45\x0b\x18\x92\x35\x38\x54\xa2\x43\xa5\xd9\xe2\xac\x7d\xff\x04\x82\xd2\xa9\x56\xab\x82\x01\xd6\xb0\x24\x28\x98\x7d\xe3\x88\xaa\x87\x53\x7b\xdd\xa7\xa7\xb5\x42\xd9\x4e\x36\xc5\xdd\x6b\x05\x50\xf7\x0b\xde\x98\xfb\x13\xef\xa6\x94\x1f\xa1\x20\x51\x8b\x78\x2b\x74\xec\x1c\xe0\x21\xa6\x78\xf6\x0b\x66\x73\xf5\x65\x93\xda\xe7\x92\xf4\x88\x4f\xa4\x10\xc7\x91\x6e\xed\x0d\x5c\x13\x53\x2b\x1c\x19\x40\xca\x69\x9e\x78\x9e\x04\x70\x2e\x54\x1f\x38\x7a\xf4\xc4\xbe\xc5\xa1\x7a\x9e\x4f\x94\x87\x08\xdf\x3f\x54\xe7\x69\xa4\xba\x86\x2f\xbc\xdf\x97\x3b\xac\x2c\x27\xb0\x37\x6b\xd8\x63\x9b\xc1\x20\xd5\x44\xcf\x75\x20\x9b\xde\xbe\x88\xe0\x18\x54\xac\x04\xc5\xae\x7a\xd3\xe1\xa8\x96\x37\x78\x1b\x08\x84\x3e\x02\x2f\xeb\x5b\xc0\xaa\x09\xbb\x20\xb7\x66\x3d\x56\xea\xf2\x45\x7d\x21\x71\x1b\x6c\x9d\x97\xe3\xf8\x64\xc8\x17\x75\xcb\xa2\x19\x72\x7f\xfb\x7b\xfa\x4e\xfe\x68\x9e\x4c\x0c\xb2\x9b\x4b\x2f\x7a\xd9\xf9\x22\x6a\xc1\xed\x3b\x2b\xb8\x27\xc1\x87\x35\xc8\x18\xbc\x11\x98\x07\xb2\xeb\xb2\x4f\xfe\x4d\xe6\x67\xb8\x1e\x0d\x73\xd8\xc7\x40\x78\xe8\x17\xd4\xe7\xae\x98\xbf\x13\x5c\xa5\x12\xef\xf5\xf1\xd3\x66\xef\x73\xc1\x9e\x86\x15\x10\xa8\x81\xcf\x3d\x84\x74\x33\x33\x44\x72\x72\xe2\x7c\x21\x3b\xcd\xf4\x0b\x46\x2d\x71\x3f\x0a\xd8\xa4\xeb\x25\xdd\x8b\x5b\xca\xa5\x81\x33\x2c\xfb\xdd\xf1\xcd\x53\x4f\xd1\x22\x44\xfd\x61\xea\x7e\x31\xe1\xc1\xdd\x13\x05\xbc\xdb\x80\x50\xc3\x9d\x73\x61\x41\x26\xc7\xe6\xf5\xcc\xcb\xd7\xc2\x52\x8c\xc7\xc0\x81\x09\xa2\xea\xf9\x01\xe9\x13\x65\xc3\x28\x87\xc4\xbb\x57\x9a\x15\x0f\xbb\x5e\x6e\xdf\x91\xa2\x36\x75\x74\xdb\xf7\x6a\x45\x4b\x82\xaa\x9e\xed\xac\x83\x97\x8a\xe6\x0b\x95\x47\x12\xa5\x96\xcc\xcf\x18\x88\x55\x0d\xbc\x47\x16\x4e\x57\x1f\xd9\x6b\x06\x65\x19\x67\xb8\x6c\x71\x08\x61\xab\x0d\x17\x7b\xad\x6e\x5f\xac\x89\xaa\x74\xa5\x85\xac\x2b\xa4\x41\x45\xfd\x3e\x24\x39\x11\x7c\xe9\x05\xb4\x9c\x20\xc5\x82\x11\xb4\xc3\x71\x38\x45\x40\x87\xd8\xf6\x13\x4d\x41\x0e\x38\xe9\x05\x4f\x5b\x3b\x5c\x82\x95\x26\xd8\x6b\x79\x9d\x72\x24\x62\x11\xef\xaf\xcf\x43\xa6\x0d\xd4\x69\xfe\x85\x95\xfc\x9c\x37\xf2\xb3\x80\xc7\xdf\xfd\xcb\xbf\xef\x0f\xfc\xf3\xff\xe5\x9f\xf8\xeb\x7f\xef\xcf\xb2\x9f\xfa\x45\x7f\xf8\xaf\xfe\xa5\x9f\xfe\xbf\xfc\xf9\x7f\xfd\xa7\x7e\xf7\xff\xe1\x1f\xf9\x8f\xfd\x67\xff\x83\xe4\x27\xff\xa7\xff\xd8\x4f\x7e\x00\x78\x04\x6e\xaf\x30\x11\xb5\x11\x0d\x15\x52\x1c\x2e\x65\xaa\x84\x97\xda\x83\x9a\x3b\x74\x63\x60\x86\xf3\x18\x45\x61\xd3\xc5\x8c\xf3\x45\xeb\xf0\x70\x52\x78\x9a\x81\xd8\x48\xc4\x7b\xe1\x61\xcc\x39\xf6\x6c\xa0\x56\x09\x53\x0a\xe7\xb4\x88\xac\x86\x7a\x08\x8a\xa5\x72\x64\xbf\x28\x97\x39\x6c\x01\x77\x75\xbc\xad\xe0\x34\xf5\x0e\x85\x57\x96\xc8\xa0\x26\x06\x9e\x0b\x94\xea\x10\x0c\x0c\x70\xe9\x9e\xa2\xbb\x8d\x9f\x88\xcd\xd1\x94\x4f\x2a\x0a\xaa\xe2\x2e\xdf\x2e\x2c\xd2\xae\xbb\x40\xe5\xe2\xf7\x4b\x9b\x65\x07\x6f\xc3\x2b\xdf\xe4\xbe\xed\xf4\x14\xee\x17\xe8\xf2\xf3\xae\x46\xd2\xa0\x9b\x42\x5a\xef\x2a\x13\xa5\xd7\x8e\x70\x4c\xa7\x6a\xbc\xe1\x3c\x0f\x15\x3e\x20\x9d\x49\x71\x08\xf2\xe0\xbf\x90\x85\xa4\xc8\x69\x4a\x0b\xe1\x20\x07\xf7\x1a\xe3\x91\x54\x70\x3c\xfa\xc1\xf7\x55\x17\xaa\x78\x97\x1e\x90\x81\xb6\x53\x0b\x2c\x2c\x2f\xeb\x17\x0d\x8c\xc1\x09\xc0\x15\x12\xda\x0b\xdc\x76\x28\x29\x01\xd5\xbe\x18\x3b\x54\xc4\x40\xa9\xf4\x78\x20\x46\x3a\xc7\x60\x58\x96\x8c\x6b\x5f\xdc\x85\xc7\x8d\xda\x1a\x2d\x65\xdd\xe3\x68\xf8\x7e\x51\x1b\x8c\xe5\x27\xb9\x34\x7a\x8a\x75\xa4\x88\x72\x84\x97\xc1\xd1\x0b\xd7\xec\x0b\x36\x8a\x9a\xe7\x25\x15\x69\x92\x30\x07\x90\xe7\x5c\xd8\xc0\x5b\x73\x74\xb7\x26\x4a\xc4\xf8\x8c\x57\x38\x66\x73\xc2\x8b\x58\x2a\xde\xf7\x7c\x21\xd4\x29\x80\x9b\xe7\x5c\xf1\x2c\x9b\x21\x9c\xbc\xd9\x44\x86\xe3\x1c\x71\x5b\xf2\xb6\xf9\x95\x30\xf2\xd8\xaa\x28\xf5\x3e\xd8\xb0\xfc\xc5\x9c\x09\x55\x79\x5a\xc3\x03\xbe\xfa\x6c\xbe\x51\x05\xf8\xd8\xaa\x98\x7f\x4a\xef\x59\x5c\xe5\x9c\xf3\x83\x8f\x8b\xde\xe1\x6d\xb5\xb6\x9f\x4f\x4c\x50\x01\xb4\xb0\x5d\xfa\x4a\xc1\x47\x5e\x46\x9f\x64\x9e\x24\x56\x15\x82\x5b\x24\x74\x34\x9a\xb5\xac\x15\xce\xa2\x67\x6d\xa9\xf8\xc4\x2b\x06\x94\x47\xb4\x41\x87\xbc\xf6\x4e\xe7\xc4\x86\x2e\x1f\xa7\xed\x6e\x36\x24\x7b\x27\x0a\xed\xa9\xcf\xf2\x4a\x0c\x08\x4d\xab\xde\x7c\xb1\x93\x9f\xcd\xd2\x2f\x12\xa6\x16\x89\x54\x9d\x29\x19\x9e\xf7\x2e\x34\xee\x1b\x84\x48\x5e\x25\x6b\x1e\xb2\x38\xe2\x77\xd3\xee\xcc\xfb\x7c\x51\x9c\x1d\x1f\x5a\x99\x78\xda\xdb\x96\x1d\xc7\xd4\xc1\x77\x8d\x20\x98\x67\xc5\xb5\x7a\x6f\xc8\xac\x92\x61\xdc\xb0\x44\xb2\xa5\x8e\x9f\x30\xf9\x22\xed\xca\x3b\xea\xd1\xbe\x24\x3c\xab\xc9\x1c\x3c\xab\xe7\xc9\xcd\x0f\xd9\x29\x87\x79\x61\xd5\xf7\xd5\x8f\x8e\x5a\x38\x27\xeb\x17\x79\x84\x56\x93\xa2\xe6\x38\xec\x47\x5e\xdf\x9d\x43\x8c\xd7\x66\x7a\x4e\x17\x0d\x8f\xcb\x69\x46\xac\xec\x92\x2f\x8e\x9a\xf7\x2e\x48\xbf\x28\xda\xf3\x4d\xa4\xf2\xce\x39\x68\x76\x4a\xfe\x6c\x1a\x5c\x19\x0f\xe5\xa5\x0a\x5f\x61\x43\xc0\x92\xca\x82\x24\x6d\xc6\xb3\x8a\x12\x5f\x88\xd9\x12\x6b\x45\x78\x1e\xf8\x5e\x96\x1d\x8b\x95\x13\x1b\x8e\xd2\xd3\x30\x38\x1e\x13\x7a\x16\x2a\xf9\x43\xec\xf0\xc9\xb3\x80\x6e\x06\xe4\x8b\xdd\x6b\x9a\x6b\x4c\x4d\x4d\xcd\x2d\x79\xb9\x42\xf7\x96\x44\x85\xf2\xe1\x85\x5b\xdd\x98\x44\x7e\xcc\x4e\xe8\x98\x3e\x1d\x79\x75\x9f\xf5\x8b\xbb\xc8\x08\xba\x95\x5c\xd5\x1b\x9d\x7d\x27\x96\x07\x53\xd0\x40\x31\x9b\xb9\x80\x26\x0e\x9a\xe4\xc9\xb3\x8b\xaf\x4e\x74\xb0\x7c\xda\x17\xd9\x0c\x76\xa1\xcf\x9d\x66\x89\x99\x39\x2f\x3e\xdb\xdc\x26\x92\x43\x9e\xf0\x32\x68\x60\x69\xc8\xa9\x33\x2c\x2e\x50\xaa\x0b\x5e\xf0\x49\x95\xe3\xb9\x35\x6e\xf9\xfa\xd4\x1f\x2a\x2e\x13\x81\x4b\xd0\x37\x72\xcd\x2b\x21\x2c\x55\xc5\x4a\x42\x5f\x33\xbe\x96\x06\xf4\x4e\xe2\xbe\xa8\x72\xc8\x32\x3e\x02\x5f\x97\xae\x88\xd4\x7d\x3a\x66\x5b\x69\x66\xbb\xf5\x7c\x47\xdd\xf7\xb3\x38\xde\x8b\xb6\x98\x32\x7f\xb4\x27\xfd\x8b\x75\x40\xda\x58\x0b\x4c\xfa\xc7\xfa\x97\x1c\x38\x63\xd9\x98\x11\x3e\x02\xd9\xf0\x84\x0d\x55\x49\x62\x4e\xff\xbe\xf9\x65\x47\x4e\xb8\xe1\x27\x84\x8a\xe3\x69\xde\xf4\xe8\xa4\x89\x8d\xfd\xb2\x82\x36\xd8\x31\x74\x1e\x9d\xa2\x85\x5b\x55\x1a\x2b\x9b\x70\xd4\xb0\x20\xa7\x25\xf6\x0d\xc5\x55\xde\xf2\xc2\xbe\xf6\xd0\xb1\x3d\x6d\xb4\x5c\xf0\xb3\xb9\x3b\x47\x26\xfe\x06\x16\xce\xad\x70\xc7\x0e\x54\xe5\x0f\x78\x46\xf8\x62\x7d\x98\x92\x98\x55\x2e\x38\xbc\xca\xae\x69\x43\x50\x8f\xf6\x41\x12\xcb\xdc\x0f\x6d\x5a\x51\xd7\xb1\xbb\x52\xbe\x83\x2e\xea\x0f\x81\x1b\x7c\x62\xdd\x1c\xf5\xde\x15\xdc\x33\x63\x5f\xf5\x01\x9a\x12\xb2\x49\x06\xdd\x87\xf1\x70\x74\x5c\x27\x80\x8a\x50\x7b\xa5\xdd\xac\x52\x32\xf9\xc4\xa3\xd0\xca\xae\xc5\xfb\x20\xe6\xca\x9b\x8e\x67\x57\xe6\x2b\xd3\xb3\x8f\x1e\x6f\x50\xaf\xb6\x23\x9e\x0a\xfb\x06\xa9\x28\x09\x01\xf8\x24\x6a\xd9\x89\xa3\xc3\xa1\x2e\xd7\xa4\x8e\x5b\xdc\x2d\xf1\x94\xe3\x69\x2a\xa3\x86\x1c\xab\xa3\x85\x33\xb2\x9f\x86\x88\x32\x19\x1e\xe4\x0b\x62\x1e\xeb\xa0\xde\xc1\xc3\xab\x8b\x66\xab\x59\xcf\xb6\xb4\x9c\x3e\x8a\xf3\xc6\x06\x75\x75\xde\x4b\x7a\x0c\xe9\x28\xba\x74\xd3\xfc\x1f\xe2\xd2\xf2\xf7\x88\xff\xcd\x7f\xe5\x0f\xfc\xa3\xbf\xfd\xbf\xfb\x47\x7e\xda\xfe\xf7\xfe\xc1\xef\xfe\xa3\xff\xca\x5f\xe8\xff\xe0\xa7\xff\xee\x2f\xf9\xfb\xff\xc8\xff\xeb\x7f\x77\xfe\xf7\xbf\xfc\x8f\xff\x4b\x1f\xac\xb4\x84\xb9\x03\x4c\x68\x64\xa6\x5a\x25\x85\x09\x20\x2a\x0f\x7e\xf9\x12\xa0\xc4\x59\x4d\x01\xe5\x50\xe6\x08\x4e\x79\xd4\x59\xeb\xe7\x0b\xb4\xa8\x30\x83\x7c\xf4\xc5\xec\x87\xa0\x97\x90\x30\xdd\x73\x01\x45\xdd\x1d\x71\xe6\xcd\x1e\x3f\xcf\x71\xa2\x1e\x45\x7c\x33\x06\xea\x2f\x4a\x44\x82\xe1\xc0\x35\xef\x3c\xc7\xbc\xf8\x04\x3b\x94\xe8\xf5\xd8\x7c\x91\x03\x32\xd9\xb2\x64\x00\xef\x33\xb9\x79\xcc\xaa\x93\xde\x44\xbf\xe0\x4a\x85\x16\xb2\x9a\x37\x26\xf9\x3a\x02\x9b\x95\x83\x11\x0e\x8f\xe6\xec\xd1\x13\x43\x5d\x13\x7d\x1d\x0f\x85\xcf\x75\xba\xde\x37\x7f\x11\x6c\xe9\xb3\x6f\x7e\x4d\x94\xd0\x6b\xff\x0e\xe8\x23\xe9\xb3\x6d\x81\x5f\x73\x10\xe7\xc4\x18\xd1\x4b\xa1\x67\x1d\xdb\x83\x44\x4e\xdd\x4f\xe6\x09\x32\xa5\x91\x53\x0f\x01\xce\xb0\x23\x9f\x0e\x7c\x08\xc7\x4e\x67\xab\x2a\xd6\xe1\x8a\xe7\x25\xef\x2d\x82\x39\x52\x06\x7c\xef\x7b\xbe\x48\x3c\x83\xa3\x1e\x2a\x93\x31\xe9\xfc\x33\x5b\x36\xa8\x3d\xda\x2f\xc1\x42\x66\xf0\x98\x53\x0e\x06\x54\xd0\xa0\x4b\xd8\x50\x86\x12\xcc\x17\x2d\x65\x85\xc6\xd3\xc4\x79\x10\x4f\x3d\x01\x59\x9f\x0c\x74\x38\x30\x80\x09\xac\x0c\xdb\x6c\xf7\xde\x19\x75\xa2\xda\x4e\xd1\x03\xfd\xc5\xee\x35\xa5\xce\x22\x8f\x5e\xe0\x99\x45\xd8\xbb\xca\x0f\x37\xce\x38\x6b\x6b\x45\x55\x26\x24\x49\x52\x2b\xdd\x01\xe6\xbb\xf5\xdb\xaf\xa0\x5f\xbc\xd4\xb3\x88\xee\x94\xb3\x23\xf5\x3b\x1e\x34\xd4\x61\x17\x0d\x95\x0c\x93\x88\x12\x21\xa7\x90\xd2\x63\x8b\x69\x01\xb4\x70\x8d\x08\xff\xa2\x75\x18\xfe\xd1\xad\x23\xc6\x83\xb8\x7c\x0c\x2a\x17\x1a\xf9\x9d\x80\x72\x44\x04\xa1\x8d\x82\x94\xdc\x23\xa8\x0b\xc3\xfb\x5a\x4c\xa5\x5f\xe8\x56\xbc\xd5\x40\x86\x7d\xb1\x18\xed\x93\x88\xd4\x73\x2e\xa6\x54\x3f\x1a\x3f\x7c\x62\xd1\x83\xb7\x9d\x5f\xf0\x78\xb4\x3c\x33\x28\x90\x2f\x5e\xaa\x90\xa2\xac\x20\x95\xeb\x73\xee\xe7\x2c\xce\xe8\xab\x1f\xb3\x4f\xf1\xfd\xa6\xc7\x52\x3b\x9e\x1c\xb2\x3e\xd7\x35\x5b\xbc\x7b\xca\x17\x3b\xb6\xa1\x2f\x0c\x1c\xb1\x63\xde\x07\x29\x98\xb8\x7b\x72\xd8\x05\x0b\x02\xf9\x9b\x50\x75\x8a\xea\xc4\xe1\xb9\x41\x21\x08\x6c\xfe\xc4\x5b\x8a\x50\x7d\x0c\x52\x88\x46\x79\x1c\x76\x6c\x39\xf1\x12\x76\xeb\xc9\x6c\x5f\x4f\x07\x13\x5b\xcd\x37\x74\xd0\x29\xa0\x29\x1b\xf8\x7c\x21\xbc\x47\xf6\xd3\x8f\x7f\xf6\x1b\xdd\xd3\x76\xa7\x2f\xb2\xed\xc2\x76\x36\xdb\xda\x3c\xab\x23\x93\xe2\x69\xaf\xe4\x26\xe7\x61\xeb\xcd\xe5\x93\x6d\x78\xe5\x30\x13\x7e\x4a\x5d\x1f\xed\x80\x40\x3a\x2e\x04\x85\x5f\x64\xf3\x5e\x3b\xa3\xe8\x89\x35\xe9\xe7\xa6\x49\x5f\xd6\x66\x52\xe6\x0b\x0e\x9d\x09\x16\x35\x29\x7c\x6e\x97\x36\xb4\xdd\xe8\xf7\x85\xe9\x06\xeb\x70\xdb\x8b\x91\x50\xd5\xa2\x03\xa0\xb1\xf8\x16\xcf\x83\xe5\xf3\xc5\x29\x9c\x4b\x5c\x53\x21\xb2\xcd\x24\x77\x19\x09\x3c\x44\x06\x90\x03\x57\xfe\x25\x00\x7a\x26\x79\x6f\xbc\x2d\xd6\x77\x3a\xcb\x92\x4f\x60\x17\x1c\x43\x82\xaf\x0b\x3b\x14\x3e\x6a\xfc\x19\x11\x59\x13\x8c\x77\xbc\xcf\x26\xc3\x7b\x80\xc4\x36\x6e\x62\xd7\x0f\x65\xd9\x79\x72\xf9\x02\x14\xac\xe0\x9a\x8d\x39\x41\xc2\x50\x5f\xc3\x72\x6c\xe3\xc9\xa4\x44\x53\xd2\x6b\xba\x9c\x0f\x56\xcb\xaa\x30\x2b\x2f\x8f\x8c\xd6\xb4\x2f\x96\x55\x2b\xb6\xd5\xee\xe1\x32\x2f\x03\x9d\x8e\xa5\xed\xef\xf3\x14\x9d\x43\x2a\x0c\xaa\x6d\xd3\x0f\xbd\x14\x39\xce\x75\x9e\xd6\x7d\x1a\xfb\x42\x6d\x87\xa3\x85\x5e\x1b\x5b\xb0\x7d\xab\xc2\xb1\xcb\x48\x60\x32\x74\x05\x08\x90\x76\x8b\x09\x21\x13\x1a\x22\x56\xcf\x72\x67\x65\xca\xbe\x80\x5d\xf6\xc2\xf0\xb6\xae\x4f\x19\x17\x30\x6d\x02\x0c\xda\x71\xea\x6e\x1f\x29\x8e\xc6\x9c\x4a\xc7\x8f\xf2\xe8\x07\xd9\x5d\xae\xa1\xdf\x90\x08\xe6\x31\xb9\x27\x22\x70\xb1\x9a\xef\xce\x9e\x20\xd1\x38\x89\x0a\xd9\xe5\x18\x5c\x69\x77\x12\x69\x94\x23\x4c\xab\xe7\x89\x9e\x0f\xfa\x11\x42\x3d\xb8\x27\x83\xf0\x76\x02\x29\xc6\x12\x3c\x06\xc9\xe6\x11\xe8\x5e\x4c\xae\x30\xf5\x32\x64\x16\xce\x11\xb2\x87\x75\x52\xfd\x64\x65\xb6\x1b\x00\x41\xb8\x45\x89\xea\xd7\x2b\xb5\xaa\x7d\x95\x2b\x37\x20\x36\x44\xbb\xc3\xab\x57\x7b\x27\x08\x32\x8c\xfe\x96\x6b\xd1\x27\xd6\xcd\x7c\xbc\xaf\xba\x81\x82\xbd\x57\xd7\x37\xdb\xfb\x02\x92\xa1\x39\x77\x0c\x1e\xb8\xf0\x6c\xd8\x13\x12\xb7\x1a\x43\xc3\x70\x7c\xef\x17\x39\x15\x90\x39\xc9\xbb\xb9\x1e\xb8\xd4\x2a\x13\x8b\x02\x62\x34\xb0\xa0\x9e\xd9\x86\x2f\x70\xe8\xb2\x1b\x3d\x51\x2a\xe6\xa2\xcf\xf6\x5f\x08\xb8\xf6\x6b\x44\x0c\x3e\xec\xc8\xe1\xdd\x0c\x9d\xe7\x26\xbe\x87\x72\xc7\xcf\x68\xad\x9b\xd4\x5b\xe8\x65\x2c\x18\xd3\xb1\x81\x08\xec\x8b\x85\x6e\xdb\x48\x6b\xa9\x95\x43\x04\x79\xc8\x0b\x34\x80\x8a\x31\x56\x1d\x09\xd2\xb3\xd8\xeb\xa2\x92\xcb\xb1\xb1\x06\xf5\xd9\xea\x45\xf5\x0b\x72\xc9\x4f\x1d\x96\x38\xd6\xd2\x57\x96\x87\x28\x4c\x77\xe1\x81\x39\xf6\x5e\xbb\xae\xd0\x79\xef\xb5\xac\x4d\x20\xca\x5b\xec\x6b\xc6\xcf\x91\xe0\xfe\x59\xc0\xe3\xdf\xf7\xff\xf8\x1f\xfd\x5b\x7e\xcb\xff\xf2\xdf\xf9\x5b\xff\xa5\x5f\xfb\xfb\xfe\xa3\xff\xda\xaf\x55\xff\xfd\xff\xe6\x2f\xfd\x0d\x7f\xf0\x6f\xfd\xd7\x7e\xc3\x3f\xf5\x8b\xff\xe8\x1f\xf9\x6b\xbf\xf0\xdf\xfd\x7f\xfa\x17\x3f\x00\x3c\x34\x49\x21\x46\xeb\x8c\xf0\xe7\x24\x90\x2a\xc5\x0e\x9b\x65\x66\x28\xa6\x22\xd2\xe4\x9b\xc8\x35\xa0\x1f\x72\xe5\xab\x2b\xc7\x5f\x18\xb6\x11\x0d\xa4\xb3\xcc\x23\x23\xf0\x2b\xd1\xf2\x09\x62\xf7\xd6\xa1\xc6\x58\xf9\x3d\x78\x11\x63\x17\x93\x6f\xa8\x7e\xc0\x73\xba\x1d\x5f\xb4\x94\xd4\x83\x98\xa7\xe3\xc6\x65\x03\x56\x4b\xea\xd5\x2f\x3a\x42\x9a\x8c\xfc\x81\x29\xb3\xb8\xf6\x91\xaa\x5b\xff\x0e\x35\xb2\x3f\xb7\x7d\xb1\x4b\x19\x8d\x19\xbd\x46\x97\xb3\x00\x84\x3c\x75\xf6\x03\x98\x1e\xb4\xac\xdc\x5e\x43\x1e\xff\x3a\x6c\x38\x05\x14\xa9\xfb\x32\xb8\xcb\x17\x2c\x25\x99\xbc\xe2\x51\x1a\x44\x34\x77\xc8\xb3\x47\x30\x04\xe0\xb2\x2a\xed\x96\x32\x09\x23\x21\x44\xbc\xe3\xf1\xf2\x52\x90\x6b\xef\xcf\x17\xcc\x1c\xce\x1c\x24\xdf\x26\x5a\x4d\x3b\x33\x60\x4a\x3b\x3d\x40\xe2\xd5\x26\x1a\x38\xae\xae\x71\x5e\xc1\x35\x57\xdf\x49\x60\xbb\xfb\x8b\x66\x8e\x16\xd1\xc9\x1e\xb1\x25\x0d\xee\x33\x60\x3f\xe5\xb9\x9d\x2b\x6a\x70\x4b\xef\x6e\xc1\x89\xee\xaa\xb4\x05\xa9\x68\x53\x1d\x41\x7c\x22\x23\x0b\x9c\xe6\x0f\x43\x59\x89\x77\x8a\xd0\x0e\x81\xd9\xfa\x07\x49\xd8\x12\xc9\xca\x23\x8d\x2b\x56\x7a\x89\x7e\x2e\x61\xf7\xc8\x08\xbe\x18\xb3\xec\x59\x2c\xc9\xb4\xf4\xbc\x11\xd1\xf0\xd9\x86\xef\x15\x24\xa7\x76\xc4\x9d\x85\x4a\xf9\x70\xec\x49\xee\x3d\xeb\x2a\xa7\x09\xec\x8b\x82\xc4\xeb\xd8\x32\x99\x04\xb3\xf3\x50\x81\x0c\xda\xc7\x9d\xda\x79\x49\x90\x47\xe7\x8a\x28\x64\xa8\xc8\xe9\x70\x7d\x73\xd7\x8d\x76\x5f\xc4\x0b\x53\x1f\x4b\xaf\xb2\x68\xfa\x55\xae\x39\x42\xaa\xa8\x71\x56\xcd\x25\xda\xbd\x67\x0f\xa7\x85\xa3\xe2\x7d\xd2\x14\xdd\xfb\xd8\x4f\xb8\x52\x79\x6d\xb2\x29\x4e\x70\x21\x71\x35\x15\x25\xba\xee\x7e\x3c\x90\x78\xdc\xde\xe3\xef\x0b\x96\xbc\x70\xcb\x5c\x9a\x13\x60\x90\x2f\xec\x8a\x69\x72\x73\x8b\xac\x34\xd3\xe2\xba\xd2\x67\xa5\x2d\xf4\x61\x59\x73\x0f\xba\x8d\xf9\x63\x90\xa9\x55\xed\xe2\x71\xd1\x95\x8c\xf3\xc9\x22\x9e\x75\x8c\xf6\x40\xf6\x51\x79\x0c\x3e\xce\x55\x70\x07\x4e\xf6\x23\xe2\xbb\xc0\xb8\x71\x00\xbc\x63\xb5\xf3\x11\x21\x23\x5d\xe2\xf9\x02\x9a\x84\xca\xd4\xd6\xca\x9c\x6f\x17\x6a\x1c\xc1\xfd\xac\x90\x62\xcd\x07\x26\x83\xfa\xbe\xe6\x10\xc6\x9d\x7e\xa7\x9b\x6d\x72\x5f\x3e\x61\xe6\xaa\x1e\x7b\xd9\xe2\x00\x46\xd9\x24\xc8\xe6\xfb\x20\xac\x52\x52\x91\x50\xeb\xde\xec\xd8\x3b\x2a\xb2\x92\x65\xe3\x0b\xdd\x42\x99\x2f\x5a\xca\x17\xd6\x63\x5f\xd8\x61\xdd\x8f\x65\xd6\xb1\x79\x85\x79\xc2\xdb\x0d\x7f\x35\x69\xe1\xfc\x10\x5e\x19\xd9\x5b\xb1\xf5\xb2\x76\xe6\x17\xae\x4e\x24\x0e\xc7\x33\xad\x42\xf4\xea\xdd\x86\xeb\x64\xac\x9a\x00\xc3\x1a\x6e\xb3\xa5\x0f\xdb\x49\x75\xf4\x9c\x1f\xbe\x4f\x33\x58\x17\xf2\x05\x89\x30\x62\x10\x4b\xf6\x8a\x2c\x74\x45\x5d\x68\xc7\x65\x31\xee\x28\x67\xb8\x33\x67\x07\x60\x95\x30\xcd\x1e\x50\x0a\x20\xd7\xda\xcb\x17\x11\x1c\x6b\xc7\x4a\x83\x12\xb0\xc3\x20\x27\x99\xa7\x34\xd1\x4b\xf0\xb0\xef\x2e\x09\x26\xc7\xbd\x4d\x76\x0c\xa1\x07\x19\x9d\xdf\x97\x7c\x01\x84\x75\x29\x5c\x31\xae\xde\xa0\x3a\x23\x07\x54\x27\x66\x5f\x21\xbc\x8d\x0f\xfa\x1a\x0a\xd9\xfb\x78\xc4\xa2\xc6\xb0\x2b\x58\x98\xff\x82\x5c\xfa\x21\x0c\xed\xa4\x09\xb0\xf1\xdd\x50\x01\x03\x04\x2f\xcd\xbe\x9e\x84\x25\x06\xa6\x85\xfc\xf0\x77\xa0\x8c\x32\xa9\x52\x19\x67\x9e\x4f\x06\xe5\x7b\x90\x7e\xe0\x56\x12\x12\xf9\x94\x0e\x7b\x1f\x1a\xc3\xca\x81\x22\x62\xa7\xaa\x50\xd1\xa4\xc2\xe6\xe9\xfb\xf0\x86\x1e\xf4\x7c\xb1\x88\x47\x5a\x0b\x29\x96\x0a\x02\xd3\xeb\x4d\x68\xee\xa4\xe8\xce\x42\xf3\x44\x72\xca\x0d\xbc\x70\xd0\x87\x07\x5d\xe2\x14\x95\x11\x7d\xc9\x17\x62\xb6\x61\xc7\xcb\x42\x3b\x9a\x8d\x20\x74\xd6\xfe\x5d\xa8\x91\x13\xd6\xce\x50\x80\xcd\xf0\x6b\x11\x86\xad\x4a\xb6\x84\x7b\x1f\x48\xca\x17\x2b\x70\xd8\x7a\x12\x43\xf3\x73\x96\xfb\x24\x49\x42\x6e\xe4\x09\xd3\xb1\xac\xdd\x93\x80\x14\x4a\xb0\x70\xb0\x30\xe5\x0d\x21\xaf\xa5\xc1\x17\xd3\x71\x23\x9f\x3d\xe4\x5a\x43\xba\x29\x5c\x94\xe2\x04\x78\xbc\x1d\x26\xe2\x0a\xc0\x7b\xe1\x83\xc2\x29\x1d\xf9\xb7\x96\xce\x29\xa9\x5f\x18\x4a\x50\x12\xdf\x20\x15\xb4\xc9\x02\xeb\xdb\x83\x59\x6a\x44\xba\x76\x95\x79\x41\x81\xf3\x62\xc4\xdd\x65\x93\x1a\x1a\xa9\xb7\x17\x5a\xfe\xc1\x3a\x20\x7d\xf3\x81\x70\x46\xad\x17\xd1\x3e\x44\x45\x71\xf2\x95\xd4\x98\xe4\xc2\x15\xaa\xe8\xc8\x1b\xfb\x3b\xb4\x38\xc7\x38\xc8\x99\xff\xc4\x2b\xa6\x03\xd6\xab\xca\x7d\x03\x59\x29\x1b\xf9\x2e\x37\x6a\x78\x74\xb3\x16\x71\xb9\xb0\xe3\x30\xe9\xa1\xb0\x06\x8e\x1a\xc1\xdd\x63\xbf\xf8\x22\x81\x6e\x51\x82\xb2\xfa\xf2\xc2\x03\xef\xec\xc1\xc0\x6b\x9b\xc0\xf2\xf1\x41\x40\x1b\xa3\x60\x43\x83\x70\x46\xed\x7a\x4e\x2e\xe0\x0b\x20\x8c\xda\xe6\xf7\xb6\xfc\x35\xc8\xdb\xe8\x32\x6c\xd2\x53\x56\x7b\x42\x2f\x6a\x00\xfb\xc3\x97\x8c\x3d\xf7\x41\xd0\xaa\x72\x96\xfa\x73\x60\xda\x9f\x05\x3c\xfe\xe0\x2f\xfc\x25\x7f\xf4\x3f\xf3\x2b\xff\xd1\xff\xcd\x4f\xfc\xd6\xdf\xf5\x27\xff\xca\xef\xf8\xc3\xff\x74\xfb\xbf\xfd\xdb\xff\xc5\x7f\xf5\x9f\xf9\xcb\xff\xf5\x7f\xec\xbf\xfa\xbb\x7e\xf2\xff\xf8\xdb\xff\x99\x3f\xf7\x01\xe0\x01\x29\x1a\x12\x62\x67\x55\x57\x2d\xad\x9a\xec\xab\xf4\x3c\xc0\x57\x0c\x75\x3e\xef\xca\xf8\x59\x2a\x32\x4a\x55\x23\x3e\xc6\x4c\xbf\x08\x30\x0b\x8f\xb1\xd3\x70\x4f\xdb\x31\xbe\x5b\x0e\x15\x51\xe2\x10\x36\x3f\x4d\x3b\x67\x56\xf7\xc4\x11\x9e\x22\xae\x4a\x6e\x14\x05\xc1\x17\xc8\xd9\xb2\xf9\xd5\x59\x23\x6d\xe8\xb0\xa5\x1d\xa2\x6b\x63\xf6\xfa\x05\x8c\x89\x3a\x82\x4d\x61\x5f\x04\x93\xb3\x6b\xe9\xd3\xeb\x0c\x3e\x19\x7c\x9d\x34\x5b\x95\xb1\x3e\x68\xc8\x77\x2e\x62\x2f\x8e\x37\x3e\x97\x25\x7e\x4e\x33\xaa\xe1\xbd\x05\xd2\x03\x67\xe0\x5b\x7b\x94\xf9\x60\x4f\x8c\x4c\x02\xe8\xa1\xe4\xa9\x88\x0d\x77\x28\xc5\x91\xb0\x55\xb5\x5f\x46\xe4\x33\x9c\x7c\x7d\x7e\x7c\xc0\x72\x8d\x4e\x29\x46\x2f\xad\x5f\xb0\xd7\xa6\x94\x10\x71\xc7\x8d\xa1\x65\xc8\x90\xf6\xe8\xcd\x1e\x19\xed\x5e\x90\xb7\xa4\xb5\x21\x98\x3b\xc4\x80\xa3\x76\x53\xba\x85\xff\x22\xcc\x99\xdb\x1c\xe6\xe0\xed\x3e\x83\x20\x79\x2d\x52\x12\xd8\x00\x26\x95\x23\x0c\xef\xa2\x9e\x75\xaa\x04\x8e\xe0\x49\xef\x8a\x0f\xfd\xc4\xf7\xda\x1b\xf7\x8e\x35\xca\x01\x6b\x97\xcc\xbc\x44\xed\xf5\x65\x9e\x27\xf2\x37\x3c\x67\xea\x0e\xa1\x62\xa1\x67\xdd\x38\xa4\x8f\x7c\xc9\x17\x0b\x57\x81\xbc\x8f\x6f\x20\x3c\xef\x5c\x42\x8d\x52\x26\x7e\x14\x84\xcf\xa2\xaa\x1a\xae\xe2\x79\x2b\x97\x74\x87\x15\xfa\xd3\x8c\x1d\xe9\x13\xcd\xee\xd2\xc8\xa6\x84\x20\xc9\xa9\x43\x90\x88\x4b\x66\x7e\x19\x7c\x4d\x81\x32\x4b\xb0\xc9\xc1\x1c\xc8\xac\x6a\x26\xa5\x77\x80\xef\x27\x7b\xa5\xa2\xb3\x78\x22\x86\x2a\xac\x89\xd1\x21\xba\x0c\x0e\xef\xe0\xd0\x0a\x48\x7e\xe8\x35\x19\xbf\xec\x90\xa6\x83\x17\x44\xc1\xb4\xea\x17\x53\x0d\x69\xcd\x81\xf9\x19\x64\x91\xbc\xe6\xc1\xcf\xb3\x28\x81\xa3\xcc\x56\x9c\x80\x12\x84\x61\x25\x0a\x68\x16\xaa\x7b\x8f\x04\xf9\xe7\x0b\x66\xce\x99\x2a\x36\x9d\x69\x3e\x92\x36\xd9\x6b\xf0\xda\x02\x14\x6a\xaf\xd1\x6c\x76\x4f\x60\x70\x2d\x59\x09\xc8\x8e\x3f\x05\x7a\x4e\xbe\xe0\x81\x20\xa2\x77\x42\x59\xc1\xe6\xc8\x62\x3e\x38\xe2\x3e\xe6\x56\x73\x9a\x20\xec\x05\xd1\xf4\x80\xa9\x54\x61\xd7\xfe\x58\xf4\xba\xe7\x8b\x82\xe4\x0d\x1b\x31\x24\x45\x66\xe8\x24\xb6\x4c\x3a\x49\x18\x26\x62\x54\x6c\x3a\x6a\x69\x8a\xbd\xc0\x47\x7a\xd8\xcf\xc6\xa7\xdd\xf1\x89\xf2\xd0\xde\xb2\x8a\xf9\x33\x7b\xbe\xcf\x98\xb6\xdb\x51\xfb\x56\x8c\xd5\xf7\x50\x68\x83\xd6\xa8\x3f\xc5\x0e\xd5\x34\xe4\xcb\x79\xe4\xef\x17\xa0\xa0\x98\x67\x11\x8c\x79\x39\x30\xb7\xc2\x11\x33\x49\x82\x52\xeb\x1b\xb5\x08\x02\x04\x6e\xee\x23\xd8\x1b\x02\xa1\xa7\xc0\x22\xf7\x17\x1e\x42\x14\xd3\xbe\x48\x48\xc4\xd5\xb7\x2d\xb0\x2a\xab\x64\x3e\x76\x19\x44\xae\xf4\xb3\xf9\x36\xa5\x00\x5c\x3b\xcb\xb6\x22\x97\xbf\xc2\x7e\x01\x0a\x9e\x41\x27\x87\x2e\xbd\x9d\x6a\x0e\xa1\x63\xcb\x4a\x68\xa2\xec\x3d\x3d\x68\x99\xeb\x01\x70\xa9\x41\x16\x98\x4b\xf0\xbc\x5e\xb2\x2f\x98\xb9\x18\x05\x8f\xd1\x66\x34\x99\xc8\xd5\x3e\xe5\xee\xce\x8c\x61\xb4\x44\xec\x27\x91\x6a\x66\x43\x64\x90\x2f\xac\x33\x1c\xdc\x68\xff\x82\xbd\x56\x5d\xe0\x6b\x52\x43\x2f\x47\x4d\xbe\xe7\xbe\x5d\xef\x4b\x1d\x12\x6a\xc9\xb2\x5e\xee\xb8\x9b\xca\x82\xbc\x01\x1f\x36\x73\xf5\x49\x36\xc3\xaa\xc3\xab\xca\xa0\xae\x0b\x24\xdd\x33\x2a\xce\xb2\x02\x53\xf6\xca\xf0\xd4\xb4\xc8\x7c\x99\xb0\x20\x06\x47\xcd\x32\xaa\xb7\x2f\xfe\x0b\x43\xe4\x23\x01\x37\x25\xed\x57\xab\x29\x71\xbd\x27\x3d\xf3\xe8\x96\x9c\x95\xb4\x87\xa7\x49\x49\x12\x4f\xfb\x34\xdf\x61\x62\xfd\x8b\x79\x45\xd8\x41\xb5\x78\x4c\xb3\x8f\xf3\xd0\x53\x33\x0e\x90\x06\xe4\x58\x51\x27\x4e\xb4\xa3\x01\x62\xf0\xb1\x09\x10\x59\x36\x51\xe2\x13\x42\x45\x6d\xb6\x00\x6e\x6e\x00\x1d\x29\x32\x8a\x62\x0d\xf0\xb3\x30\xde\x4f\x74\x3e\x9d\xad\x68\x97\x92\x9f\xa5\x50\x6d\x89\x5a\xcc\xbe\x98\xe9\x2d\x74\x35\x4f\x5c\x4a\x67\x2e\xfc\x04\xce\xa6\x74\x77\x15\x6e\xf3\x8e\x6b\x03\x7e\x7f\x68\xed\x28\x36\x5e\xd9\x3b\xb4\x52\xcc\x7d\xd1\x8f\x68\xac\xdb\xc2\xc1\x1a\x5e\x4a\x98\xb8\xe3\x40\x5e\xdd\x03\x7f\x79\x00\xe9\x18\xb9\xc4\xaa\x62\xc5\x71\xce\xa1\xab\x61\x14\xda\x17\x33\xbd\xa8\x27\xa0\x7c\x53\x1b\xb2\x58\x9f\x83\x43\x92\x14\xca\x53\xec\x90\xf8\x74\xc5\xa0\xc2\x78\xd7\x89\x6e\x55\x5d\x0e\x69\x6d\xfb\xa4\xee\xe4\x05\x08\x83\xe4\x10\x1d\xdb\x03\x74\x52\x4c\x9f\x3a\x51\x74\xe7\x45\xaf\x5a\x44\xc5\x06\xd5\x61\xb0\x30\xe4\x2d\x1d\xbc\x7d\xa0\x7f\x44\xc5\x7e\xac\x23\x0a\xc3\x0d\x6a\x4e\xc3\x5c\xd7\xd3\xf0\x9c\x5c\xc3\xf2\xbb\xa8\x35\xf4\xe8\xd4\x9e\xf2\xac\xa8\xce\x75\xca\x7c\x22\xe0\xaa\xc9\x5c\x53\x06\xb9\xef\x00\x6f\x96\xb8\x76\x0b\x1b\xe0\x6b\x77\x10\x57\xe1\x00\xea\x08\x65\x10\xe9\x71\x0f\x18\xe9\x6e\xff\x8d\xb7\x14\x71\xf7\x8c\x18\x9e\xf1\x0a\x54\x77\x25\x04\x96\x8a\xdd\xb6\x71\xe6\xc0\xa5\x67\x95\x30\x74\x25\x33\xfd\x99\x58\x49\xdb\x1b\xff\x79\x80\xc7\xbf\xa3\xfe\xa2\x5f\xf0\x4f\xfc\xd9\xf1\x1f\xfe\xb3\xec\xef\xfc\x9e\x7f\xeb\x3f\x21\xcd\x6f\xfa\x67\xff\xf1\xdf\xf9\xc7\xd3\xff\xb0\xfd\xed\xff\xf6\x7f\xfa\x3f\xff\xab\x7e\xed\xaf\xf9\xdf\x7e\x00\x78\xf0\xf2\x58\x53\xbd\x0e\x91\x2c\x28\x35\x4c\x29\x8b\x3e\x8a\xcb\x2a\x1c\xa5\xe9\xc3\x08\x5e\x5d\x5b\xa9\xde\x45\xcf\x9e\xb9\xb7\x2f\xf0\x3b\xfc\x9c\xec\x00\x0c\x85\x81\xc8\xae\x24\x51\x29\xb8\xfc\x4b\x70\x78\x5d\x89\xb9\xca\x81\x0e\xdc\x34\xa5\x36\x44\x97\xd9\xc5\x4f\x78\x20\xec\x49\x25\xc4\x83\x70\x6a\x44\x07\x93\x2a\x06\xc5\x65\x94\xd9\x73\x11\x51\xbf\xa5\x6f\x76\xec\xb9\xab\xe0\x19\x17\x17\xf4\x13\x73\xdc\xf6\x56\x1b\x81\xa3\xb5\xfe\x90\x7d\x14\xaa\xcc\x64\x26\x96\xe9\x0a\xa9\xd1\xa2\x5c\xfa\xb9\xd9\xf9\x3c\xde\x00\x44\xb3\xb1\x3c\x5f\x28\x03\x6c\x45\x12\xd8\x91\x8b\xb5\x58\x53\xa3\xe6\x35\x5c\xc6\xe9\x4d\x14\xa4\x07\x90\xa7\xf1\x47\x90\xd0\x60\xc0\x50\xa7\xde\xa1\xf8\x42\x2d\x9b\x08\x0d\x1e\x2d\xf0\xae\xb4\x4c\x9e\x26\xe3\x70\x39\x51\xf9\x7a\x40\x4e\xaf\x42\xb9\x23\xae\x02\x76\x92\x3a\x1c\x0a\x34\x85\x96\x2f\xda\xa8\xd9\x1b\xa2\x74\x67\x60\xa7\x3b\x4d\xbe\xd1\x33\x5d\xa8\x80\x77\xaa\x36\xd2\x4e\xe9\xbd\xc1\xf0\xf6\x50\xea\x22\xbe\x67\x3c\x9f\x28\xca\xef\xed\x91\x22\xcc\x1a\x69\x33\x84\x32\xcf\xb2\xb4\x63\x85\xdf\x1a\x7c\x05\xef\x44\x85\xbf\x60\xfa\x73\x9e\x8b\xc9\x33\x34\xfe\x42\x60\x8d\x20\xb5\xeb\xe3\xa7\xec\x56\x9a\xab\xc2\xd3\x19\x41\xd9\x0f\x31\x76\xa3\x8e\x66\x8e\xe9\x04\x75\x77\x2e\x03\x3c\xd2\x9a\x60\xeb\x37\x22\xc7\x94\x37\x5c\x65\x93\x0c\xdd\xb7\x46\x7e\x01\x1f\x29\x03\x0e\x2c\xf7\x3a\x9a\x94\x78\x77\x68\xa5\xc3\xc8\xf0\x9e\xe3\x53\xbe\x58\xc4\xeb\x87\x0f\xfd\xf0\xe8\x38\x20\xc9\x9c\x44\xdd\x30\xd7\x82\x69\x62\x30\xf1\x65\xb4\x0d\x84\x99\x3d\x2a\xa9\x5d\xe3\x15\x6b\x9c\x2f\xc0\x62\xdf\xf7\x39\x58\xd4\x4a\x0c\x41\xc7\x9a\x09\xe5\xc0\xd6\x29\x56\xab\x23\x8e\x12\x95\xe5\xf6\x20\xc6\x83\xcb\x8c\x3b\xe5\xfd\x89\x15\x2b\xf4\xc7\xdf\x3b\xd8\xcb\x73\x25\xc7\x0d\x07\x83\x0e\xea\x75\xd8\x3e\x9d\x89\x44\x8d\x04\x2b\x38\xc2\x95\x5d\xd5\xc7\xf2\x5c\xf3\x85\x20\xe3\x04\xe2\x8a\x50\x08\x08\x39\x6f\xeb\x1a\x35\xb4\x18\x89\x8c\xab\x9e\x27\x9f\x8c\xcf\x95\x44\x42\x6d\x93\x0f\xd6\xc9\xe8\xd7\x7d\x21\xb5\xbc\x0a\x06\xac\xf8\x86\xe4\xb0\x90\xb9\xe9\xe4\x3b\xdd\xa1\x0f\x37\xcd\xa2\x5b\xb9\x98\x7a\xa6\x24\xe9\xad\xc4\x36\xef\x49\x72\x5f\xdc\x45\x9d\xfc\x29\x72\x52\xf5\xe6\xb2\xd9\x2c\x5a\xb9\x25\xd1\xd4\xde\x72\xf1\x4e\xf2\x96\x9b\xf4\xdd\x2b\x7b\xd8\x09\x1d\x62\xd5\x4f\x46\x91\x3d\x15\x3a\x05\x41\x8a\x7d\x2e\xd5\x24\xef\x0e\x90\xa6\xc1\x2f\x96\x19\x2b\x04\x78\x4f\x1f\x8f\x1a\xb1\x77\xf5\xcc\x5d\xb5\xf5\x8b\x96\xf2\x41\xd0\xaf\xb9\xcd\x3c\xa7\xde\xc7\xee\x13\xe0\xcc\x47\x8d\x17\x3f\xea\xbe\xfc\xbd\xb7\x35\x00\xdc\xa3\xe0\xf1\x41\xd1\xfa\xb2\x2f\x00\x52\x62\x38\xe6\x8d\xfb\xa9\x13\x09\xa7\x82\x37\xc5\x9d\x40\xd9\xb8\x9c\xce\x32\x9c\x20\xf7\xf4\x0a\x4c\x14\x51\x3b\xc9\x8d\xf8\x17\x2e\x70\x84\x74\xaf\x17\xba\x70\x1e\x3f\xb6\x43\xad\x24\x2a\x07\x57\xc9\x9d\x45\xe4\x9c\x70\xc2\x83\x55\xa2\x4f\x97\xc1\x30\x58\xe9\xfb\xc9\x74\xdc\x1c\x75\x70\xeb\xdb\x22\x6f\x9a\x2d\xca\x26\x73\xb7\x7e\xe2\xcc\x82\x23\x4b\x3f\x22\xb9\xb2\xe6\x4b\x80\xea\x70\xf8\x7c\xdd\x27\x6b\x1c\xd0\x89\x06\xfc\xa9\x8c\xed\x02\x7c\x36\xe8\x81\x8a\xd9\x9d\xe4\x42\xcf\xf0\xb0\x4e\x28\x9f\x4a\x34\x61\x70\x0a\x38\x6e\xae\x9f\xd8\x15\x5b\x55\x82\x1b\xbc\x54\xc8\x87\xc2\x69\x10\x82\xf0\x12\x5d\xe7\x63\x62\xf1\x30\x10\x64\xea\x5e\xad\x88\xab\x88\x7d\xd7\xf5\xcf\x17\xc0\xb9\xd7\xa4\x63\x88\xcb\xc8\x37\x6a\xca\x00\x7f\xd1\x45\x55\x3e\xfd\x21\x8b\x64\xda\x76\x28\x0f\xf4\x17\x3b\x9d\xdc\x33\x15\xbc\xf7\x8b\xf6\x7a\x72\xc3\xa4\x85\x05\xd2\xb5\xc1\xe2\xcb\x6d\x56\x9f\x34\x7a\xaa\x37\x2a\xd7\x40\xd1\x4f\xf7\x3c\x75\x7a\x29\xe3\x49\x68\x07\x3e\x70\xa0\xa0\x73\xea\xd8\xce\xdb\x7d\xd1\x69\x48\xed\x80\x6a\xda\xf9\x24\xe6\x16\x04\x87\xcb\x3c\xd8\xcf\xc4\xf3\xc0\x18\x32\x81\xe3\xe4\x4f\x8c\x3f\x95\x97\x5c\x43\xbe\x66\x62\x76\x1d\xcc\x44\x23\xa5\xba\x65\xe3\x1b\xb3\xc5\x63\x5b\xbf\xd4\x33\x95\xd5\x13\xf9\x18\x18\x27\xf5\x0b\x20\xec\x3e\x2b\xb5\xc0\xcc\x54\xfd\xe5\x37\x07\xc8\x0e\xf0\x68\xa9\xad\x1e\x8b\xc8\xc4\x2a\x98\x4c\xad\x66\xd4\xc7\x4c\x9c\x22\x05\x7c\xd1\x21\x4e\x65\xe8\xfb\xda\x3e\x44\xde\x4d\xf5\x58\x2d\x0e\x62\x72\x2f\x6f\x3f\x07\xa8\x0a\xca\xa9\x90\xbe\xe0\xfa\x04\xc6\xd6\xe5\x92\x2f\x88\xb6\x1c\x50\x60\xb8\xec\x9e\xf7\xa3\xb3\x56\xf4\xa9\x94\xd6\xa1\x19\x4e\x07\x29\xa8\xa3\x00\x28\x78\x2d\xa4\x5a\x6b\x4a\x4b\x7c\xfb\x22\x82\xd7\xe9\x77\xfb\xa1\x53\xcf\xe8\xad\x4b\x3a\x04\xab\xf4\xe2\xf5\x31\x8b\x98\xd4\xe0\x9e\x3b\x29\x41\x32\x20\xa2\x5c\xec\x2d\xfc\x0b\x55\x15\x1a\x23\x51\x88\xac\x72\x25\x74\x09\xbb\xdd\x94\x1d\x65\xc3\x44\xf9\x08\xa4\x8c\x95\x1b\xb5\x23\x45\x9b\xf1\x4b\x0a\x2d\xa1\xfe\x9c\x9c\xfa\xb3\x80\xc7\x2f\xfe\xfb\xff\xab\xff\xf9\xff\xf3\xf7\xfe\x17\xff\xb9\xbf\xf8\x1f\xfa\xdb\xbf\xe8\xff\xfa\xe7\xff\xf5\xbf\xf1\xcf\xfd\xe6\xdf\xc8\xfe\x14\xff\x63\x7f\xe2\x5f\xfe\x1f\xff\x9b\x7e\xdb\xdf\xfa\xd5\xbf\xe7\x4f\xfc\x1b\x03\x3c\xc4\xaf\xf8\x05\x7f\xe3\xe7\x6f\xb7\x92\x3d\xd8\x69\x4f\x2f\x29\xf5\xe9\x71\x13\xa0\x22\xb3\x5c\x88\x6f\xe5\xc8\xa3\x8e\xc4\x61\x8a\x0b\xb6\x15\xb5\x32\xa5\xd2\x7f\x06\xa7\xf9\xfd\xbf\xf4\xff\xdf\xcb\xfb\x87\x9e\x22\x6a\x81\x4d\xb6\x63\xd8\x47\x86\x82\xb6\x16\x3c\x05\x0a\x24\x67\xf8\x46\x73\xd6\xbb\xb0\x4c\x8d\x99\x4b\x16\x6e\xfa\x26\xf9\x23\xdd\xd9\x1f\xf3\x29\x2c\x00\xc7\x3e\x55\x65\x4b\x0d\xeb\x73\xfb\x28\xfa\xbc\xef\xaa\xa4\xc4\x27\x00\x46\xf5\xb8\x86\x34\x1b\xf5\xc2\xc5\x35\x80\x7f\xb4\x4c\xf2\x63\x3e\x85\x74\x39\x20\x34\x08\xf6\x2a\x52\x41\x5d\x30\x59\x83\x18\x18\x24\xc5\xb8\x68\x9d\x7b\x2b\x71\xd8\xbc\x9a\x20\x7e\xd3\xa0\xc5\xbd\x3f\xfe\x53\x10\xec\x78\x65\xc6\x97\x71\xcb\x82\x4f\xea\xb3\x03\xb9\x5e\xae\x58\xef\x0b\x28\xbc\x33\x99\x1a\xe0\x47\x01\x5e\x75\x16\x83\xbd\xd5\x7f\x70\x8a\x8c\x44\x71\xe9\x31\x36\x15\x87\x47\x2c\x7e\xe2\x59\x44\xa6\x98\x0e\x53\xfc\xa8\x19\xc7\x68\x65\x07\x57\x1c\xc1\x8a\x05\xdb\xee\x0f\xbe\xc8\xf3\x06\x09\x6e\x92\x33\xea\xed\xe4\x63\xe7\xb4\x2d\x2a\xab\x76\xd8\xe0\x70\x75\x1c\x13\x40\x61\xe3\xe5\x73\x5b\x79\xcc\xab\x8d\xf9\xe0\x2e\x1c\xae\x95\xa4\x83\xf5\x0c\x00\x50\x8d\xd0\x85\xca\xa9\xd3\x9a\x76\x2e\x13\x12\xa8\xc5\xf6\x28\xfe\x2e\x1e\xb6\x99\xab\xec\x1f\x39\x19\xfd\x98\x4f\xb1\x14\x7d\x3c\x85\x36\x21\xb4\xf7\x36\x38\x06\x83\x18\xd4\x8e\x14\x28\xc5\x62\xb9\x98\x47\xbd\x1a\x6a\xba\xa7\xf0\x80\xfa\x7c\xd4\x07\xa7\xe0\xa8\x3e\x35\xf2\x8d\x6d\x7a\x91\xa1\x07\xca\xe8\x80\x5f\x9b\xc4\x18\x9e\x10\xee\x10\xa6\xb5\x85\x8d\x6f\x5d\x1e\xfe\x16\x62\xc4\x07\xff\x05\x52\xe7\xad\x36\x4e\x75\x64\xee\x42\xe6\x3d\x64\x49\x74\x65\x79\x45\xb4\x41\xc4\xe8\xab\x8c\x25\x0b\x92\x8f\x11\x40\x84\xd8\xd3\x07\x77\xb1\xab\x6f\x39\x00\xc1\x20\xef\x54\x4f\x86\xee\xf2\x62\x19\xd9\x53\x28\xe4\x31\x75\xb6\x0d\xba\xb6\x8e\xf3\xb3\x91\x86\x74\xd6\x0f\x4e\x41\x27\x06\x8f\xea\x41\x44\x22\x55\x49\xa1\x05\x8f\x42\xa2\x9c\x52\x72\x15\x0d\x41\xfa\xee\x2b\x4b\xc8\x97\x67\x7a\x04\x0a\x45\x75\x7d\x70\x17\xcf\x95\xb6\xbf\xf3\x59\x9d\x3b\xf6\x43\xbf\xd6\x4e\xda\x24\x28\xb1\x37\x35\xd2\xcb\x5b\xbd\x7b\x7b\x2f\x79\x6d\xe5\x9e\x51\x50\x93\x1f\xdc\x45\xf6\x5c\xe7\xd2\xc6\x8b\xe2\x80\xe6\x90\x36\x7c\x5b\x8e\xc4\x1c\xc7\x59\xdd\x1a\x41\x25\xf1\xb6\xaa\xb5\x4d\x61\x4f\x9d\xf1\x47\xa3\xc8\x3f\xe6\xbb\x30\x77\x87\xe6\x37\xb7\x80\xfb\xeb\x22\x71\xb5\x91\x70\x46\x9d\xe8\xf1\xd3\x8c\xc4\xa0\x0a\x56\xbd\xc2\xbb\xf6\x86\x31\xae\x61\x5f\x44\x70\xd9\x58\xe6\xa6\x17\x29\x56\x8d\x97\xd5\x83\x1f\xef\xde\xc9\x47\x2c\x84\x5c\x98\xd0\xa3\xd1\x15\x6e\x63\xcd\x48\x7e\x11\xb2\x07\x7c\xf0\x45\xc0\xa1\x43\xfa\x2d\x5d\x13\xf8\xec\xd5\xa9\x9d\x42\x05\x10\x55\x1b\x4d\x6a\x86\x6e\x5e\xae\x67\xa5\xa0\x74\x70\xdb\x6b\x0a\xfd\xe0\x8b\xd0\x07\xef\x49\xfa\x8e\xcd\x29\x9d\x86\xb6\x4d\x2b\x78\x31\x35\xc8\x5e\xb1\x8b\x0e\xb2\x61\xe2\x99\x69\xdd\x7b\x6b\x71\x85\x89\x9e\x2f\x22\x78\x6b\xc3\xa6\xb2\x01\xb4\x85\x4a\x7c\x58\x2a\x82\x77\x05\x31\x0b\xae\xdf\xe5\xef\xd4\xfd\x58\x8f\x19\xc4\x29\x8b\x8b\xb5\xfd\xa0\xbe\xa0\x39\xb2\xeb\xaf\x65\xef\x0b\xab\xb6\x28\xd7\x97\xe7\x58\x56\xf2\xfe\x19\xd1\x00\xae\xde\x7c\xcd\x24\xc7\x91\xcb\x25\xaa\xb3\xdf\x2f\xde\x48\x78\x33\x73\x4a\x8c\xb3\x16\x42\x99\x1d\x18\xa1\x44\x46\xd9\xf2\x6c\x71\x76\x1a\x3c\x95\x2b\x53\x67\x58\xc1\x1e\xa2\x3f\xed\x47\x6d\xd4\x8f\xf9\x2e\x8a\xbf\x8f\xf3\x83\x50\xd5\x36\xf0\x18\x8a\xfb\xca\x27\xc3\xf0\x74\x1e\xdb\x7e\xeb\x55\xd3\x3a\x26\x79\xb8\xfd\x44\xab\x43\xa9\xe5\x83\xbb\x50\x26\xc5\x58\xc9\x55\x4a\xf1\x95\xd7\xce\x97\x25\x56\x70\x29\x83\xbc\xec\x05\xa5\xa2\xaa\x5a\x67\x14\xa8\x90\x08\x1d\x55\xfd\x68\x29\xf1\xc7\x7c\x8a\x46\x93\xee\x79\xbe\x1e\x8a\x14\xb0\x10\xfc\x14\x32\xda\x4a\x72\xf2\x29\x67\x41\xf2\x44\x6c\x29\x02\xcf\x1b\xa5\xbd\x56\x68\xf7\xc5\x4b\xcd\xc8\x21\xbf\x03\x95\x15\xc2\xc2\x7b\xe2\x0c\xcc\x46\x8b\x78\xfd\x95\x21\x03\x13\x78\x62\x5d\x98\xa2\x0e\x15\xa5\xd8\x9c\x5c\xf8\xe0\x2e\x3a\x7c\x35\x5d\x91\xb3\x55\x15\x79\xa5\xf4\xa3\xbe\x4e\x3c\x21\xe8\xeb\x34\x46\xb8\x98\x8d\xc4\xb4\xbb\x82\x52\x2f\x8d\x59\x3f\x1f\x64\x33\x72\xcb\xc5\x37\x49\x33\x2a\xc9\xa4\x7b\xb9\x4d\xe3\xa7\x9a\xfc\xf2\xb7\xc6\xdc\x7e\xf8\x47\x3d\x22\x27\xbb\x44\x2c\xa3\x73\x8b\xda\xbf\xf8\x22\xa1\x6c\xb3\x32\x20\x4f\x75\xf5\xb1\x1d\x50\x66\x14\x94\xa1\x2e\x91\x57\x99\xbe\xa7\xc6\x5c\xa1\x47\xb7\x65\x74\xe5\x9d\xfc\x68\x3a\xee\xc7\x9d\x53\x27\xdf\x0f\x6b\x04\x20\xbe\xc1\xb8\xe2\xc2\xa7\x92\xbb\xe8\x9e\x45\xec\x3c\xe2\xee\xc2\xd7\x67\x49\xd8\x0a\x06\xd4\x18\xe7\xbe\xe8\x10\x15\x57\x66\xe0\x19\x0f\xe0\xf8\x48\xd7\x8e\xc8\xd8\x9f\x23\xfc\x9b\x23\x98\xdd\xa8\x65\x07\xa1\x20\x69\xbb\x98\x5b\x3b\xbe\x3f\xf2\x53\xfa\x31\x9f\xc2\xe4\x5b\x22\xd3\x24\x97\x50\xa1\x43\x45\x9b\x25\x7d\x47\x8f\x45\x33\xc8\xa5\x9d\xbf\x3e\xd4\xa8\x17\x7b\x69\xca\x22\x8e\xfc\xe0\xff\xdf\x29\x7e\x16\xf0\xf8\x4b\x3f\x81\x7f\xef\xff\xfb\x0f\xff\x9f\xff\xd8\xbf\xff\xbf\xf3\x87\xfe\xc2\x7f\x4e\xfe\xe9\xbf\xa3\x7e\xff\x3f\x40\xbf\xf8\x2f\xfd\x52\xf3\x6f\xfb\x43\xbf\xf2\x17\xd4\xff\xc9\xbf\xc0\x3e\x00\x3c\x50\xdc\x52\xf4\x62\x23\xda\x03\xd2\xb2\x9c\xdc\xcb\x1d\x19\x54\x6f\x56\xc3\x3b\x30\x32\x8c\x91\x8b\xdc\xe1\xa3\xf7\x64\x97\xaf\x5f\xfc\x48\x2b\x4d\x0b\xab\xf2\xe0\x50\xe2\x67\x62\x04\xd7\x56\xf0\x54\x55\x91\xd4\xba\x4a\x73\xab\x20\x75\x6d\xb6\x4e\x62\xcb\xf9\xff\xda\x83\xfd\x98\x4f\x51\x95\x0a\x85\x09\xb1\xd5\x08\xb4\x4b\x79\xc3\x54\x8d\x3c\x93\x15\x4f\xd0\x5b\x5d\xed\xa7\x1d\x53\x9b\x8d\x41\xe2\xee\xfc\xfc\xd1\x4a\xcb\x8f\xfb\x2e\xf2\x79\x2e\xa1\x8f\x4e\xf8\x8e\x6b\x7d\x03\xc3\xd5\x4b\xd6\x74\xed\xf1\x61\x77\xc1\x70\x95\x48\xb7\x95\x70\x61\xdc\x0e\x51\xe8\x07\xa7\xd0\xd8\xbb\xe6\x8b\x43\x23\xbf\xfe\xa5\xed\x42\xd0\x2e\x8c\x42\xec\x31\x0c\x94\x5c\x15\x88\x15\xaf\xf0\xf8\x47\x15\x8e\x63\x3e\x1f\x3c\x6d\xf2\x68\xef\xf1\x45\x56\x20\xd8\x60\x12\x7c\xc5\x79\x21\x96\x0f\x29\x15\x59\x92\x5c\x23\x6e\x87\x1c\xae\xb0\xc3\x8b\xc5\x36\x2d\x1f\x14\xed\x94\x4f\x5b\xe8\xf6\x72\x75\x37\xac\x69\xce\xbe\x66\x23\x1d\xba\x70\x4f\xd9\x51\x08\x1e\xdf\xe0\x7f\xc8\xce\x8e\x1d\x65\x16\xb9\xe6\x8b\x12\xb1\xa3\x06\x5d\x54\xe5\x1a\xc7\xf9\xc8\xc7\x3b\x00\x20\x6c\x7b\x16\x7f\x18\xa9\xcf\x93\x23\xe7\x6d\xb7\xc7\xcd\xb1\x2b\xa9\xf1\x47\x78\xff\x8f\xf9\x8b\x14\xb7\x82\xac\x04\x87\xf7\x70\x3f\xcb\xc2\xfe\x75\xc2\x92\x72\x9d\x02\xe8\x15\x52\xf7\x67\xf6\xc9\xdd\xe3\xf1\xd1\x4c\x02\xff\xc9\x4b\x85\x15\x12\xca\x9a\x57\xf4\x32\x8a\x16\x50\xc8\x62\xc6\xdb\x12\x26\xf4\xf2\x62\x9b\x9a\xb2\x85\x89\xd0\x02\xe3\xa4\xfb\x41\xc0\x17\x85\xea\x4c\x2a\xc6\x35\x1d\xe4\x65\x01\xde\xb5\x03\xbe\x51\xcd\x4b\xd2\x4b\xa4\x20\xac\x79\x3d\x90\x5e\x57\x31\xcb\x8e\x09\x58\x71\xbf\x28\x54\xf5\xa5\xd4\xf1\x65\xae\xb5\x9e\xb3\x1c\x08\x1e\x9a\xbc\xa0\x06\x2f\x96\x6e\x54\xdd\x61\x59\xd9\x0f\x02\x46\x9b\x52\x0a\x4a\xf6\x83\x08\x4e\x6b\x10\xed\xe4\x10\x68\x50\xe4\x4d\xe9\x22\xb1\x15\x5b\xc0\x3e\xed\x91\x19\x6e\xd5\x6b\xf4\x70\xdc\xf5\x58\x84\x03\x03\xd4\xfb\x2f\x4a\xc4\x31\x01\x7d\x9d\x92\xba\x4c\xe6\x66\x18\x38\x84\xfd\x38\xb2\x1a\xdf\x6f\xe5\x2e\xdb\xa4\xc0\x4e\x5a\xef\x8d\x37\x44\x6b\x29\xf7\xc5\x1b\x01\xe2\x75\x4c\xee\xda\x85\x1a\xc1\xf1\x27\x07\x19\x4d\x10\x89\x13\xd3\x01\x75\x0e\xa3\xac\x0a\x5c\x53\xc8\xc1\x44\x80\xe5\x31\xec\x83\x53\xd8\x2b\x69\x67\xc9\xe3\xb2\xad\x9c\x61\xae\x6c\x48\x7a\x21\x78\x78\xf0\x90\x24\x0a\xc3\xc3\x73\xe3\x90\x34\x69\x6b\xbc\x13\x3f\x5f\xe4\x11\xf4\x28\xe9\x22\xcf\xf0\xcd\x87\x62\xde\x8c\x3b\x04\x1f\x81\x90\x11\xd9\x9d\xb8\x57\x08\x8a\x27\x0f\x4a\x01\xba\xa8\x49\x31\xfb\xe0\x2e\x68\x5f\xe4\xa9\x07\x34\x35\x1e\xf1\xee\xae\x87\x80\x3e\xb5\xd8\xec\x61\xbd\x79\x2a\x25\x87\x5a\x12\xbc\xc3\xab\x53\xc6\x30\x41\xf7\x01\x58\x4c\xab\xcd\xda\x25\x93\x8b\xe1\x91\x4d\xa4\x85\xb2\xb8\xae\x84\x10\x06\x42\xfb\x27\xe6\x4a\x36\x71\xc9\x00\x41\x7b\xd8\x4d\x29\xff\x05\x58\x7c\x4c\xac\x38\x03\x0d\x22\x07\x39\x8d\x2e\xa2\x87\x50\x17\xfb\x43\x77\xc7\x03\xef\xc1\xcb\x2a\x0b\x27\x36\x95\xf4\x10\x5f\x7c\xff\xe2\xef\x44\x91\xc8\xd6\x0b\xd3\xc4\xb0\x74\xe4\xc0\x65\x9b\xc7\xea\x4c\x19\xac\x9b\xd6\xe5\xe9\x44\x82\x07\x2b\x5e\xab\x99\xa8\xd3\x9c\x0f\x62\x27\x7d\xd7\x76\xd8\xfa\xe3\x2c\xaf\x9c\x1c\x79\xec\x36\x62\x76\xa5\x24\x12\x03\xdb\xa7\x3e\xf7\x35\xdb\x0a\xd3\x73\x47\xae\x48\xef\xbf\x80\xac\x0f\x89\xce\x0b\x0b\x82\xe3\x14\x82\x10\x22\x78\xd8\x6b\x26\x82\xa6\x65\x8a\x3a\xc6\x54\x50\x49\x6b\x31\x20\xd1\x5c\xe7\x2e\xed\x8b\xba\xb3\xfa\xe7\xaa\x19\x14\x2a\x0f\xb9\xaf\xf0\x7a\xad\x8e\x22\x17\xee\x35\x03\x0d\x38\x79\xd7\x90\x36\x1d\xa0\xae\x45\x34\x06\x33\xf9\x02\x6a\xa8\xfb\x76\xec\x28\x6e\x2b\x6b\xb8\xbb\x9d\x10\xaf\x34\xab\xaf\x37\x74\x83\xa5\x11\x1d\x6e\xa6\x78\x98\x00\x91\xf7\x3d\x6a\x9d\x2f\xee\x02\x73\xc9\xef\x8c\x9b\x18\xd9\xc1\x7d\x94\x6e\xb6\x74\x64\x15\x26\x62\xc3\x89\x8c\xcb\x23\x4d\xa6\xe3\x79\xcc\x0a\x08\x9d\xf6\x05\xf5\x49\xfc\xb6\x4b\xaa\x4a\x80\x04\x8e\xf3\xfc\xe4\x2c\x4c\xd8\x88\x36\xa3\x68\xed\x86\x4e\xf7\xf0\xeb\x03\x1f\x53\xd0\xd0\xdb\x51\xf7\x0b\x8a\x2b\x8f\x97\xb9\x93\x36\x58\x5d\x81\x5d\x33\x6b\x1a\xd2\x87\x8e\xe2\x41\x5d\x75\x13\x6a\xdf\xe6\x59\x10\x28\x84\x55\xe0\x50\xef\x27\x79\xa4\x3f\xbb\x4d\x42\x0d\xdd\x4e\x8a\xd2\x2b\x30\xae\x85\x4a\x77\xf4\xae\x8e\xe8\x9e\xcb\x14\xc9\xfa\xed\xb5\x05\xa2\x89\xf3\xf4\x8b\x7e\x84\x02\x6e\x42\xf1\xde\x43\x67\x30\x9a\xa4\x83\xda\x9d\x5b\x40\xe5\x37\x97\x2a\xba\x60\x6b\x88\x73\x1c\xc1\x9e\xec\xc1\x3b\x5b\xed\x03\xf8\x9e\x30\x76\x75\x51\x99\xd2\x10\x33\x80\x4b\xf5\xa5\xe3\x7e\x6a\xb8\x19\x01\x7a\xcb\x98\x15\xc4\x98\x5f\x5f\x21\xae\x8c\xfb\x4d\xca\x07\x6f\x84\x5e\x3f\x88\x23\x6b\xc4\x97\xe2\x1b\x3d\x79\x54\x5e\x53\x2b\xf8\x6c\x12\x75\xa4\x4b\xbe\xc8\xa4\x8e\xaa\x78\xfc\x7a\x26\xa0\xb9\xb2\x9f\x07\x78\xfc\xf2\x7f\xf3\xdf\xfc\x8f\xfc\xbb\xe6\xff\x5d\x87\xff\xc0\x4f\xfd\xf9\xfb\x67\xfe\xe6\xbf\xe7\xa7\xfe\xf1\x3f\xfe\xa7\xc5\xaf\xfb\x93\x7f\xeb\x37\xfd\x57\x7e\xfd\xff\xec\x57\xfc\x92\x3f\xf0\x87\x7e\xfc\x80\x07\x99\x94\x42\x3c\x44\x22\xa4\x03\x78\xc2\x3b\x44\x0e\xd4\xef\x04\x8f\x41\xf3\x55\xe9\x86\x9c\x9e\xa3\xea\x1d\xe3\x98\x45\xd1\xa6\x5f\x4c\x78\xa4\xd7\xf5\x9e\xd7\x1b\x78\xbf\xb3\xc2\xa0\x45\x23\x8a\xaa\xa0\xaf\x7b\x57\x21\x7d\xc8\x67\x1f\x4d\xb3\xab\x29\x8d\x10\xd7\x7b\x3e\x60\xf2\x89\x37\x83\xa5\x2c\x05\x35\x8b\x85\xc0\x96\x3b\xf6\x7d\x9f\x64\x30\x60\x51\xd5\x9c\xcc\xc0\xbc\xb2\xa8\xc0\x14\x00\x0c\xc3\x30\x9b\x5f\x4c\xbb\x50\x9b\x04\x6b\x33\xc2\xc3\x70\x34\x21\x9f\x7b\xba\x4a\x02\x5f\x9d\x51\x16\xaf\x3e\x23\xf4\x64\xae\x49\x8b\xfa\x17\xab\x7e\xbe\x68\xaf\xad\xba\x1d\x76\xa3\xf5\x56\x58\xab\x9c\x3d\x56\xc1\x27\xc5\xed\xa3\x25\xa4\x9b\xac\xc9\xc0\x46\x32\xce\x45\x71\x2f\x4e\xb0\x4f\x8a\xf6\x9d\x1e\x3a\x1e\x8a\x0c\xc3\x28\x8c\x21\x21\x7b\xc3\x12\xe5\x94\x1d\x0e\x0d\xc3\x60\xff\x3c\x54\xa7\x6c\x0c\xf4\x12\x77\x5b\xcd\x17\xec\x35\x58\x1c\xb4\x46\xb4\x09\x47\xf3\xc6\x70\x7f\x24\x55\x03\x0f\x31\xd6\x4c\xb5\x2d\x02\xbd\x40\x08\x3e\xbb\x24\x75\x96\x1c\xe3\xc4\x2f\x26\x3c\xf2\x56\x4f\xb0\xf3\x4c\x9b\x8f\x1e\x3b\x4d\x44\x40\x5a\x6b\x26\x19\x64\x5d\xcf\xd3\xca\x8a\xae\x2c\x6e\x92\x48\xe9\x21\x85\x7f\x01\x35\xb0\x4d\x98\x23\x6d\xb8\xe2\xdb\xb1\xa6\x99\x9e\x8c\x82\x6a\xa9\x29\x98\xd9\x5a\xe0\x88\xb8\x07\xdc\xbd\x4c\x85\x4d\xfb\xc1\x5f\x30\xb6\x64\x87\x15\x1d\xd0\x0c\xb9\x05\x65\xf4\xbc\x9d\x95\xf4\x62\xa3\x34\x53\x85\x5e\x4f\x26\xb0\xd2\x51\x4f\x4c\xfe\x11\x4e\xb7\xfb\x09\xc6\xcd\x29\xa2\x3b\x2d\x9b\x8b\x0f\x73\x26\xfe\x4e\xbe\xb6\x05\x01\xfb\xd7\x4f\x49\x14\xf3\xc4\x6e\x28\x78\x1f\x09\x96\xe9\x96\xe1\x1f\xb4\xd7\xb4\x00\x37\x4f\x3f\xea\x20\x5a\x4d\xf0\x7b\x5d\x9f\x08\xa3\xcd\x9c\x60\x2c\xdb\x65\x1a\xaa\xf7\x19\x6a\x3d\x7c\x77\xe3\xdf\x54\xbf\x00\x7f\xa8\x6c\x72\x6e\x16\x95\x8f\x0a\x30\x6a\x90\x9b\xdc\xc6\x0a\x09\x85\x58\x8f\x59\xf6\xca\x95\x59\xf2\xde\x03\x6a\xa6\x4f\xb8\xfd\x03\x1e\x88\xbc\xd2\xd8\x16\xe7\x51\x0d\x29\x05\x1e\x45\xec\xb3\x10\x95\x96\x84\xed\xef\x6e\x6d\x09\x16\x0f\xa9\xf8\xc4\x37\x09\x5a\x30\xa7\x5f\xbc\x54\xeb\x21\x56\xd7\xd9\x23\xc1\x39\xa7\xae\x4c\x8a\xe9\xb7\x2b\xac\xa5\xae\xc8\x5a\x93\x48\x03\x33\x3a\xa0\x20\x3b\x99\x5a\x57\xbf\x28\xda\x5f\x08\x9f\xaa\x6d\x5a\x16\xc5\x20\x88\x70\xc2\xf4\xa8\xeb\xc8\x5e\xe7\xd3\x7d\x17\xea\x64\x04\x38\xed\xc1\xa1\x8a\x4c\xd3\x5f\xe4\x54\x4a\xc8\x62\x33\xf4\x18\x82\x1c\x52\x73\x65\xca\x46\x9c\x69\x28\xae\x65\x06\x47\x09\x55\x06\x43\x90\xb8\xb9\x45\x36\xb3\xb8\x9e\x2f\x72\x2a\x38\x84\x4f\x08\x64\x35\x69\x85\x0d\xb3\x48\xb4\x3f\xde\xbf\xa0\x65\x72\x5f\x75\x4f\x4a\x43\x38\xe0\xd6\x6e\x87\xe3\x13\x5a\xfb\x82\xd6\x21\x9a\xd8\xc1\xc5\x64\x0e\x61\x9f\xa1\xf5\xa3\x31\x32\xc6\x0c\x46\xd2\x4e\xa6\x42\x79\x24\x80\xd4\xad\xa8\xf8\xd4\x12\xa6\xe5\x8b\xf9\x23\x16\xe1\x84\x4f\xb7\xc2\x33\x82\xde\xd8\xbb\x85\x26\x89\xba\xb6\x82\x39\x21\x2b\x98\x52\x83\x1d\x33\xec\x69\xd9\x47\x13\xd1\xf9\x60\x9a\x96\xc0\xd6\xce\x13\xbc\x3f\x8d\x6c\xc2\xc6\x45\xf6\xb1\xeb\xc9\xc8\x39\x09\xdc\x13\xf2\x61\x45\x6c\x0e\x67\xf7\x42\x53\x7f\x50\xa6\x5f\x64\xf6\xaa\xea\x91\x54\xac\xc3\x13\x52\x5d\x3f\xa8\x8c\xf3\xc8\x08\x8b\x7e\x29\xe3\xe4\xb9\x22\xb6\x23\x5a\xe8\x12\x62\x8a\x62\x0f\x5f\xcc\x56\x50\x93\x66\x8f\xac\xc0\x04\x62\x0c\x1a\x87\x81\x9e\x47\x21\x42\x02\x0d\x17\x28\xbf\xe9\x78\x0c\xa7\x0a\x78\xcc\xe4\x0b\x79\xef\x3f\x87\x2b\xfd\x31\x36\xb6\x15\x75\xda\xdb\xc4\x77\xe1\x87\xa7\x1a\xde\xd6\x57\xb5\xb7\x36\x6a\x49\x26\x5d\xd6\x2b\x75\x22\x87\x27\x81\x76\x98\xce\xf6\x4f\xa8\x0c\x66\x35\xc2\xae\x48\x7b\x00\x44\x81\x31\xd4\x89\x7b\x27\x7d\x11\xf3\xa9\xb4\x4d\xc5\xac\x7e\x95\x0c\x61\xf1\xad\x51\x12\xe8\x17\x00\xe9\xc0\xaf\xe6\x50\xe0\x71\x5f\x54\x1e\xa1\x3d\x48\x24\x1e\x95\x03\x99\xaa\xdb\xed\x21\x28\x31\x24\xf1\x84\xa4\xde\xfd\xe8\x15\xc8\x17\x40\x18\xf6\x55\x8f\xa5\x87\xf6\xd3\x5b\x63\x97\x37\xb9\x89\x7a\xe1\x50\x87\x79\x4e\x57\xa9\x14\x38\xdc\x20\x7b\x10\xc8\x8c\x2b\xf9\x45\x36\xa3\xac\x12\x4e\x32\x4e\x60\x26\x77\x0b\xf0\x12\x15\x5c\xbb\xa9\xe0\x09\x25\x20\x59\x68\x85\x7b\xe7\x77\x22\x39\xfb\x12\x31\x83\x4f\xaa\x1c\x3f\x96\x3c\xb3\xc8\xee\x92\x11\x69\x70\xbc\xe3\x1b\x86\xa3\x7e\x06\x34\x64\x7a\x73\xbf\xd1\x1d\xf1\x18\x2c\xe2\xa8\xf0\x82\xf2\xc1\x4c\x2f\xc1\xfe\x9c\xac\x76\xe0\x44\x59\x4a\x8d\x08\x3e\xe2\x40\x20\x5f\xeb\x8c\x7c\xe4\xb6\x12\xef\x68\x69\xf4\x0b\xbc\x84\x78\x03\xf8\x27\xc0\x79\x33\x39\x95\xd2\xf0\x74\x6d\x73\x7b\x66\x81\x83\xcc\x07\x62\x14\xd9\x9d\xaf\x69\x8f\x77\x03\x13\x89\xef\x09\xa8\xdb\x5a\xce\x17\xd3\xb4\x37\xf4\x78\xdf\xd3\x0d\x57\x08\x8e\xea\x98\x66\xfb\x7d\xb5\x72\x00\x26\x2c\x09\x8c\xba\x18\x96\x6e\x43\xb9\xd9\xf5\xd6\x87\xfa\xf8\xf3\x00\x8f\xdf\xf2\x27\xfe\x07\xff\xa9\x9f\xfc\x5d\x7f\xe6\xb7\xfd\x32\xfb\x4f\xfd\xaa\xbf\xf6\x13\xff\xe4\xaf\xab\x3f\xf1\x2f\xff\xc2\xf7\x2f\xfe\x2f\x7e\xe3\x9f\xfb\x17\x7e\xd9\x3f\xf9\x5f\xfa\x53\xbf\xe9\x9f\xfd\x60\xc2\xc3\x11\xc7\x73\xbe\x82\x83\x9a\x15\x90\x8b\x83\x7a\xd5\x5e\xaf\x8c\x17\x87\x89\x17\xe3\xd4\x04\x31\xe2\x2b\x81\x52\x87\x45\xcb\x3e\x08\x73\x34\x40\xd5\xbd\x5d\x4a\xa7\xdc\x37\x06\x18\x9c\x2a\x10\x9c\x51\x87\x7b\x10\xfd\xa1\x95\x62\xab\xac\xd2\x8b\x6f\xf1\x9d\xb3\x3f\xed\x0b\xfc\x2e\xc3\xfe\xd6\x95\xeb\x12\x38\x26\xc8\x7d\x51\x9a\xb5\x87\x0d\x8a\xa7\xf0\xcb\xd6\x31\xd9\xf3\x22\xbf\x76\x4a\xe5\x40\xd8\xd4\x17\x61\x8e\xfe\x7f\x68\xfb\xb7\xd0\xff\xbf\x7f\x2f\x10\x92\xd4\x0e\xe4\x66\x9b\x65\x6d\xbb\x28\xdc\x69\x96\xe4\xae\xd6\xe9\x15\x78\x25\x68\x25\x85\x65\x29\x61\x07\x6d\x9d\xcf\xe7\xb5\x5e\xeb\x60\x69\xe8\x0e\xbc\x50\x2b\xf3\xa2\xe8\x26\xda\x68\x49\x05\x65\x58\xb9\x3d\x04\xc5\xce\x40\x91\x1c\x47\x18\x06\x1c\x99\x01\x1d\x2f\x94\x39\x31\x07\x47\x46\x87\xdf\x66\x04\xe1\x7f\x3b\xaf\xdb\x2f\xdf\x8b\x37\x9f\xd7\x5a\xcf\xf5\x7c\x3e\x9e\x8f\x83\x6c\xc8\xd5\x4b\xe1\x14\x37\xea\x09\x11\x34\xa8\xf3\x48\x6d\x9e\x1b\xe3\xf2\xa4\xb2\x5b\x28\x81\xce\x61\xe4\xbd\xdd\xc6\xfb\xc9\x36\x0a\x6c\xb4\xaf\xea\x54\x34\xb6\xec\xe8\xbc\x68\xb9\x5c\x7c\x1d\x5c\x99\x67\x90\xb8\x6d\x0f\x28\x45\x00\x87\xf6\x22\xb7\x2c\xcb\xbf\xc0\x75\x91\x42\xbb\x29\x40\x97\xe7\xfa\x88\x17\x8d\x6a\x39\x2d\x41\x69\x1c\x9a\x83\xcc\x08\x67\x0e\x35\x9d\x18\x24\xb9\xbd\x9d\x44\xf8\xc5\x23\xfc\x76\x00\x6b\xad\xe1\xbd\xdb\x79\x0b\xc5\x62\x75\x50\xde\x6b\x19\x93\xbb\xf8\x28\x48\xbb\xde\xbb\x14\xe4\x60\x59\xc5\xcf\x6a\xbf\x18\x60\x5c\x2b\x8f\x30\x6b\xd3\x3c\xdf\x98\xfc\x56\xf4\xd1\x45\x77\xf1\x46\x80\xc2\x44\xfc\x31\x43\x6d\xda\xed\x03\x75\x52\x6d\x88\xf8\x05\xfd\x96\x86\x81\x22\x56\x14\x8d\x17\x59\x5d\x89\x20\xfc\x45\x78\x8b\x84\xd4\x03\x99\x8f\x65\x68\x1f\x05\x76\x5d\x15\x51\x13\x3f\x34\xd4\x2f\xc6\xa8\xfc\x16\x02\x59\x7c\x50\x39\xc8\x7a\x70\xaa\xc9\xe8\xbe\x12\xc7\x35\xf5\x64\xbc\xa2\x8b\xf9\x7d\xfb\xce\x98\xd7\x3e\x02\x1b\x9f\xf0\x8f\x70\x9e\xe3\x21\x8e\x09\x94\xf9\x79\x41\x37\xfa\xdc\x1b\x5d\xa2\x1a\x3e\x8f\x6c\x6f\x5e\x25\xf7\x87\x7a\xb6\x30\x8b\x03\xad\xc1\xbe\x80\x69\xd7\x0a\x0b\xb1\x91\xa9\xd9\xe3\x8d\xe8\x41\xa5\x8a\xd3\xd4\xcc\x0e\x29\x46\x4a\x63\x93\x22\x6a\xd5\x28\x66\x44\xb3\xaf\x91\x5f\x30\x3c\x28\xf7\x0e\x0e\x63\x37\xaa\xce\xb5\x79\xe5\x02\xe7\xe9\xc9\x16\x44\xb7\x03\x63\xb4\xb7\xaf\x57\x20\x7e\xa2\x1a\x26\xba\x09\xbd\xfd\x02\x82\x0a\xf2\xc6\x47\xa4\xc7\xe5\x34\xdf\x3a\x10\x5d\x7c\x12\xe1\x4a\xa5\x9d\xcf\xb1\x95\x94\x0b\x5f\xbc\xdc\x93\x69\x4a\xd5\x9a\xf5\x45\xd5\x62\xe3\x55\x76\x86\x84\x24\x91\x00\xe7\xc4\x65\xe5\x63\x56\x69\xdf\x69\xd3\xdb\xc5\x88\x42\x43\xd6\xe8\x3a\xaa\x3f\xfe\xca\xcb\xd9\x17\xa7\xd3\x60\xac\x07\x78\x48\x7e\x8d\x1c\xaf\xca\x72\x75\x7f\x5e\x80\x12\x50\x83\xbd\xbd\xe6\x0b\x1d\x4b\xd7\x1e\x68\xf7\x5d\xe2\x51\xe2\x0b\xe6\x8f\x07\x4d\x65\xf6\xc6\x22\xb5\xf6\x38\x33\xc9\xdf\xbd\xde\x54\x9a\xda\xaf\x29\x6f\xc3\x17\x6a\x51\x70\xa1\x7e\x20\x8b\xd6\x46\xfc\x8b\x37\xd5\x80\xc1\x45\xb6\xd4\x78\x40\x9a\x1e\xcd\xde\x7c\x11\x20\x20\x5a\x1b\x5f\x30\x23\x1a\x1c\x3c\xd1\x97\x81\xe8\x93\x49\x4f\xee\x7e\x41\x0e\x7f\x95\x7e\xd2\x4b\x1c\xe2\x40\xd1\x08\xb4\x49\xd9\x61\x6a\xda\x20\x07\x26\x26\x89\xda\x0a\x90\xe4\x13\xa1\xb3\x97\x75\xb1\xf8\x44\xc6\x91\x6c\x56\x88\xbc\x96\x70\x89\x15\x80\xad\x82\xf6\x54\xd8\xaf\xea\xcf\xdd\x7d\x4d\xa0\x1f\x10\x91\x7d\x83\x46\x74\xf4\x93\x3f\x91\x89\x52\xf1\xf0\xf6\xac\x0d\xee\x96\x69\xb7\x3d\x21\xa4\x3b\xad\x4e\xc2\x6e\x36\x4f\x54\x11\x02\x85\xda\xc6\x1b\x61\x11\xa7\x8e\xe4\xf8\xa0\x5e\xd0\x63\x9f\x97\xe7\x6d\x96\x97\x90\xa0\x3b\x76\xe1\x63\x2a\xe1\x40\xaf\xdc\x38\x07\x54\x2e\xc1\x2e\xf6\x80\xf6\x1e\x7c\x20\x63\xe2\x8b\x5d\xe9\xa1\x4e\xe7\xcd\x7b\x1e\x83\xda\x81\x65\x10\x6d\x8e\xd1\x5d\xa1\x88\xef\xab\x2c\x2b\xfd\xc6\xb1\x22\x73\xef\x9a\x09\x1e\x25\xbe\x80\xac\x27\xad\x7e\x6c\x03\x2c\x77\x53\x2e\xc0\xc2\x35\x26\xa7\xfd\xb2\xae\xe0\xd8\x51\xcc\x79\xcb\x2a\x2a\x67\x8d\x9c\x9b\xad\x3d\x9f\x08\xae\x4a\xf1\x76\xbc\x83\x03\x97\x1a\x8f\x77\x6e\x6e\x53\x78\x18\x52\xb3\x63\x2d\xbb\xbb\x08\xa7\x33\x87\xcd\x1a\x78\x1e\xb0\x19\x9f\xf0\x58\xd9\x04\xe0\x1d\x5e\xe7\xb1\xfd\xa2\xa9\x79\xd0\x73\x5a\x8d\xd3\xf7\xdc\xca\xd7\x66\x0c\xf1\x09\x08\xaf\x67\x60\xfc\xf2\xfc\x8c\x2f\xa0\xc9\xee\xaa\xea\x77\x0f\xa2\x52\x16\xc7\x16\x77\x3c\x70\x85\x04\x00\xef\x6c\x80\xb8\x36\x38\x9c\x0f\x7e\x1f\xfd\x3c\x7e\xf7\xcb\xbf\x60\x41\x51\x79\xf4\x01\xf0\x48\xde\x78\xc3\x2b\xb5\x57\xfb\x63\xa2\x44\xfc\xdc\x69\xa1\xd7\xbe\xa8\x2b\xc1\xa0\xa3\x3d\x4c\xd3\xc3\xc4\xf8\x80\xbb\xc9\x46\xe1\xb5\x81\x2b\x2c\x99\xe3\xc1\xa2\xd9\x9f\x9f\x47\xb0\x58\xeb\x05\x9e\xb0\xfd\x2a\x46\x1e\xf1\xe8\x24\xea\x95\xcb\xc8\xf1\x05\xfb\x9e\x35\xe9\x8c\x4e\xd1\x1d\xc5\x10\xd7\xf1\x8a\xc0\x50\x8a\xce\x2a\x4c\xab\x11\x80\x3d\x8e\x24\x2f\x39\xe6\xb8\x65\xeb\x53\x88\xfc\x8b\x9b\xfa\x00\x60\x8b\x71\x7a\x6a\x40\x88\x95\x89\xd6\x57\x2a\x7b\xd5\x73\xc1\x60\xbd\xc0\x4a\xbb\xe7\x88\x9b\x86\x31\x4c\x86\xf8\xcc\x3f\x20\x29\xd0\x6c\x44\x7b\x7c\x78\x30\x90\x02\x11\x84\xa0\xe4\xd1\xe0\x37\x89\xc1\x04\xa9\x8f\x1b\xba\x84\x55\x23\x1b\x98\x10\x67\xfb\x98\xf5\x47\x19\x1e\xbf\x33\x94\xbf\xf9\x8b\xff\xc7\xf4\x2f\xfc\xee\xbf\xf8\xff\xfb\xbd\x7f\xeb\x27\x7f\xe1\x6f\xf9\x9f\xc0\xff\xfb\x5f\xfa\x5b\x3f\xf9\x93\x3f\xfd\x17\x7f\xe2\x77\xff\x8e\xff\xe0\xf8\x75\x3f\xfd\x01\xc3\xc3\x31\xfb\x16\x8b\xec\xb6\xf8\x1e\xd4\xf4\x28\xf8\x70\x48\x9e\xa7\x65\xd1\x6d\x45\x23\x17\xef\xcd\xe2\x52\x1b\x66\x78\x0e\xee\x13\x82\xa3\xe8\x6f\x1f\xa4\x2b\xd8\x70\x99\x00\xd1\x57\xde\x27\xe4\xf1\xde\xbb\x54\xb9\x55\x97\xa5\x88\x5b\x8c\x2a\x7d\x5e\xdb\xe8\xa5\xfd\x03\xcc\x8a\xe1\x67\x4c\xea\x43\xee\x4e\xdd\x4a\x32\xf7\x3b\xe6\xd1\x78\x3a\x75\x6f\x7d\x83\x80\xa1\x43\x39\x64\x02\x4f\x92\x2b\x83\x38\xd9\x27\x8f\x70\xac\x24\x1b\xb9\x75\x0d\xb7\x90\xd5\x66\x54\x82\x14\xa9\x5e\x55\x10\x21\x2f\x9f\xde\xf3\x60\x1e\xa9\x47\xed\xb5\x27\x4d\xc0\x17\x03\x8c\x18\xb3\x31\xc1\x6c\x9c\x15\x41\x9c\x67\x34\xe7\xa5\xf1\xdd\xd0\xfa\x33\xfb\x93\x15\x86\xab\x7a\xfe\x3e\x1c\x01\x3f\xe2\x30\xe3\x0b\xd8\xa5\xcf\x5e\x1e\x9b\x13\xc7\xdd\x6e\xc2\x67\x55\x1e\x94\x1b\x36\x1f\xc4\x05\x8c\xd8\x03\xef\xd3\xe4\x09\xc8\xcb\x81\x6a\x7d\x9b\xf8\xa2\x5d\xe6\x08\x6c\x2a\x3c\xbc\x8e\xf4\x72\xe6\xbd\xa1\x81\x32\x48\xa8\x2d\x3d\xde\x74\x9d\xd9\x9b\x6a\x0a\x4c\x82\xc8\xa5\xa5\xd1\xb6\x2f\x06\x98\x69\x1f\x40\xaf\x65\x98\xc0\x47\x10\xad\x9f\x1e\x01\xd8\xef\x56\x70\xca\x32\xbc\xcb\xdb\xfa\x00\x07\x7e\x33\x49\x06\x04\x15\xdb\x17\x18\x37\x7c\xda\x5e\x6c\x03\xd2\xe2\x39\x5b\x34\x6d\x6f\x9e\xc9\xbf\x7e\x72\x9a\x09\xc9\x0e\xf2\xc6\xb3\x95\x6d\x5b\x12\x4e\x66\xd8\x7f\xb1\x43\xd7\x3a\xca\x92\x13\x5e\x40\x4d\x88\x89\x43\x2b\x32\xc2\xd4\xc3\x1e\xfd\xe8\x72\x4b\xe9\x09\x9c\xec\x62\x2c\x51\xae\x00\x1e\xfe\x09\xcf\x84\x30\x1b\x1f\x65\x56\xc4\xbe\x05\xad\xc0\x98\x4f\x9e\x4f\x99\x94\x42\x2e\x14\xb8\x80\x49\x89\x22\x14\x1e\x6e\x01\xdf\xa8\x1f\xf6\x09\x2d\xdb\xf8\xa8\x0e\x6c\xd3\x61\xa6\x39\x89\x42\x6b\x45\xca\x06\x9c\xd8\xc2\x87\xf2\x6e\x96\x11\xdb\x5c\xc5\xd8\x96\x33\xb7\x88\x7f\x71\x3a\x93\x32\xc1\x42\x57\xf0\x5d\xe9\x95\x5c\xd7\xdb\xbb\xa6\xea\x74\x9e\xc5\x33\xda\x33\x65\x47\x08\xe9\x37\x2c\x1c\xb9\xc8\x2e\xf8\x4f\x78\x26\x90\x33\x31\x18\x52\x1c\xe2\x44\x2e\xc4\x13\x72\x97\x38\x6b\x36\x43\x6e\x76\x46\xc3\x3f\xca\x34\x9a\x60\x39\x07\xbf\xab\xd4\x0f\x76\xa5\xec\xf4\xe7\x1d\x59\xb7\xf0\xe2\x77\xdc\x41\xdb\x74\x77\xed\xca\x89\x69\x6d\x5e\x33\x79\x4e\x5a\xcf\x1d\x0e\x54\x6a\xad\x32\x37\xfd\xc2\x85\xc9\x73\xd4\x71\x3c\x52\x3c\x70\xfd\x30\xe5\x3e\xa5\xed\xcd\x8e\x98\xac\x63\xc8\xf2\x66\xbb\x26\x87\x1f\x20\x25\xf3\xda\xcc\xb5\x3e\xd9\x03\x09\xc8\x6d\x8c\x08\x23\x19\x44\xcf\xa8\x07\x38\xbb\x9a\x95\xea\xe0\x33\x49\x47\x6b\xde\x8a\xf5\x26\x24\x08\x1d\x7d\x5e\xec\xc5\x17\x77\xe4\x61\x24\xbd\xcb\xab\x2c\x35\x82\x2e\xe6\x41\x91\x5c\xb9\x8e\x97\x01\x6d\x3d\x75\xfa\x74\x66\xc3\x65\x02\xf8\x30\x95\xf0\xed\x0b\xa2\x3c\x2b\xea\xdd\x09\xa8\x2c\x4e\xcd\x61\x5e\xef\xe3\x50\x33\x2c\x7d\x0a\x27\x4b\xbb\x3a\xd1\x11\x70\x9d\xc0\x48\x53\x79\x37\xfc\x7c\x21\xb8\x62\xa6\xbb\x5c\x02\x7a\x4a\xea\xbc\x41\xe8\x46\x38\xe9\x4c\x76\x35\xbd\xf4\x24\x8b\xb5\x41\x28\x55\x2d\x5a\x1c\xce\x52\x11\xf6\x17\x02\x0a\xa6\x5f\xb6\x83\x7c\x60\x4c\xd8\xda\x67\x8c\x75\x5d\x1e\xdb\x46\x1d\x82\x7f\x63\x6e\x2f\x46\xb4\xe0\x08\x9f\x85\x6b\x7a\x11\xd2\xf7\x03\xe6\x0f\x4d\x84\x17\x08\x60\xaf\x2f\x8d\x4e\x61\x75\x1b\x65\x43\x3c\x11\x20\xc4\xd2\xc1\x8b\x38\xf5\x78\x4f\x86\x79\x96\x69\x90\x36\xe6\x3f\x70\xe7\x62\xef\x28\xf9\x79\x1b\x6e\xef\x33\xe7\x7c\x59\x4b\x57\x43\x0e\x45\x6f\x7e\x25\x98\x07\xdd\xb7\xee\x55\x2b\xa8\x92\x25\xe9\x56\xe9\x5f\x74\x39\x79\xac\xda\x31\x09\x01\x3f\x92\x49\x87\xb3\x4a\x2d\x5d\x1e\xc3\x11\x1a\x1b\xa5\x5e\xf2\x82\xf4\xae\x08\x64\xc3\x2f\xbb\x7a\xf2\x2f\x3a\x3e\x41\x12\x42\x6b\x76\x7b\xd0\x53\x39\x7c\x79\x5a\xaf\x0d\x8f\x2b\x21\x32\xbb\x25\xd6\xf4\x18\xb6\x0b\x4f\x6a\xc6\x40\x21\x9e\xfd\x8b\xb5\x0e\x7d\x40\x4f\xd1\x80\x5c\x8a\x77\x54\x42\xe7\x53\x70\x0a\xcb\xcd\x70\x29\xce\x2e\x0b\x41\xf6\xcc\xc6\xcc\x2f\x19\xef\x84\xd5\x7d\xe1\x5b\xd1\xfb\x5b\xac\x23\xab\x84\xb3\xc9\x52\xba\x71\xe7\xfb\xf4\xf6\x44\x03\xe3\xe8\x5b\xd1\x8a\x36\xad\xbb\x0f\x6e\x7b\xf7\xf0\x7c\xe1\xb6\x43\x61\xdb\xc3\x10\x00\xa8\xb0\x39\x9a\x13\x11\xe0\xbc\xbc\xa7\x65\x44\x5c\xf5\xdb\xd7\x7b\xc2\xe3\x7c\xa1\x82\x54\xf8\xd6\x60\xc0\x17\xc2\x9a\xa6\x80\x75\xd8\xdb\xec\x8f\x5a\xf1\x35\x91\xea\x81\xd3\xa1\xa1\x31\x17\x56\x4a\x36\xd6\x4b\x8f\xb3\x56\xc0\xe4\x71\xc2\xe5\x8b\xa5\x23\x4b\x25\xb9\x02\x63\x6a\x7b\x3a\x0e\x36\x16\x4f\x33\x0f\x89\xa7\xa5\xf3\xf2\xfb\xe0\xa0\x3b\x07\xc3\xbf\x85\x8c\x0b\x1a\x6a\xff\x8e\x41\xfc\xbf\xdb\xec\xfb\xb8\xcc\xa4\x57\x7b\xdb\xa1\x48\xcc\x35\x7d\x33\x8a\xa4\x98\xb2\x0a\x04\xe5\x41\x82\x95\x18\x5d\xdd\x1c\xef\x01\xc9\x63\xc4\x17\x6b\x1d\x9d\xe8\xfb\x34\xb6\x45\xd8\x4d\x71\x97\xba\x67\x0a\x97\x48\x89\xa2\xfb\x2a\xb9\x29\x79\x41\x2e\x64\x71\xa1\x03\x08\x67\xd4\xfa\xa3\x1e\x1e\xff\xe2\xaf\xf8\x55\x7f\xf5\x2f\xfc\xb6\xff\x08\x32\x3f\xf6\x6b\xe7\x5f\x4b\x3f\xf7\xcf\xfd\x53\xbf\xee\x4f\xf6\x7f\xe9\x97\xfe\x8f\xfe\xdb\xeb\x4f\xc7\x5f\xfb\x47\xd4\x7f\xf5\x5f\xfb\x80\xe1\x01\x05\x6d\xf6\xb9\xca\xe5\xc2\x4d\xbd\xa2\x89\xe7\x20\xbc\xa9\x94\x68\x93\x57\xe6\x0e\xa8\x4b\xcb\xf8\x4c\x6b\xae\x36\xb4\x03\xbf\x18\xa3\x86\xde\xe4\x5e\x22\xba\x2d\x33\x6f\x00\x15\x88\x38\x18\xa5\x20\xf4\xe0\x9e\xa5\x09\xbb\x46\xf3\x30\x0e\x86\x5e\x6b\x43\x3c\xfd\x62\x6f\xfc\x76\x88\x2e\x1d\x8e\x00\x1e\x6a\xef\x34\x82\x99\xe6\x78\xf3\xd3\xde\x5a\x9e\x3b\x92\xa0\x82\x45\xd8\x17\x2f\x7c\x81\xe6\xfd\x27\xe4\x2d\xf0\x56\x99\x0e\x10\xcc\x10\x2a\x78\x98\xe7\x5c\xac\xc7\xf4\x8b\xcd\x61\xf5\xd8\xec\x5d\xef\x50\x89\xf3\xe8\x37\x44\xc3\xc9\x4f\xe8\x74\xf6\x72\x7e\x09\xee\x91\x75\x26\x21\x14\x54\x70\x48\x83\xa1\xc8\x9f\x09\xf9\xe6\x92\x5c\xf0\x8c\x9d\x94\x70\xf7\x41\xce\x51\xfa\xc5\x7e\xf0\xa8\xd5\xca\x2e\xe3\x49\xa3\xf1\x7b\x17\xb4\x91\x1c\x42\x20\xc6\xcf\xcb\xa0\xe0\xc8\x57\x6f\xd3\xb0\xf2\x50\xed\xc0\x09\xd8\x7e\x61\x79\x37\xfd\x5a\x19\xa2\x9c\x40\xdf\xc7\xf8\x41\xae\xec\x10\x52\x72\xdd\xdc\x54\xa1\x32\x1c\x80\xf7\x96\x95\xf2\xf2\x4f\xf2\x81\xd0\x2f\x9a\xb3\x8a\xde\x19\x78\x8b\xe0\x85\xda\x82\x57\xbf\x84\x9f\xf1\xf2\xcb\x05\x79\x40\x6c\x37\xa7\x23\x6d\x8d\xf7\xec\xc8\xb1\x5b\x00\x7f\x01\xc7\x31\xb3\xe4\xe3\x69\x5c\x00\xbd\xba\x1c\x79\xcf\xb3\x02\xea\x28\x6b\x1b\x63\x81\x35\xbd\x6e\x2d\xed\x0d\xee\x78\xc3\x29\x06\x88\xe1\x13\x03\x57\x79\x74\x51\x65\x70\x4c\x7f\x3e\x02\x77\x89\xf1\xc3\x69\x11\x77\x5a\x5e\x43\x62\xea\x72\x02\xac\x69\x50\xf8\x59\xef\x4e\x4b\x7c\xf1\xf0\x80\xb7\x61\x42\x08\x0c\x6a\x76\xd8\x2c\xb2\x77\xef\xa8\x20\x1f\x93\x3d\x62\xa7\xb0\xda\x81\xb0\x88\xc2\x0e\x78\xc7\xcb\x5b\xfd\x44\x7c\x36\xbd\x42\xe1\x72\x7d\x90\x35\xf1\x2e\x19\x0a\x40\x2f\x0d\x1e\xe1\x87\xde\x7a\xe0\x3e\xb8\x6b\x48\x9f\x64\xa5\xe6\xa7\x24\x76\xbf\x68\x11\x8d\x85\x70\x2b\x4c\xf6\xa2\x7a\xc1\x15\x1f\x7c\x06\x06\x3b\x64\xad\x0b\xc2\x8c\x0a\xea\x9e\xd4\xc0\x0a\x97\x63\x31\xb4\x39\x9f\x80\x82\x3e\x64\x24\x22\x43\x72\x71\x2f\x2b\x15\x89\x65\xde\xc7\x66\x74\xbe\x39\x87\x47\x54\x30\x8c\x35\x0e\x90\xe3\xcb\x39\x11\x30\xfe\x45\x8b\x68\xf9\x22\x68\x3e\x8c\xb2\x8c\x5e\xc1\x62\xa5\xb7\x25\x0a\xb7\x30\x5c\x0d\x0b\xfd\xe3\xbd\x0d\x21\x05\xc3\x06\x7f\x00\x68\xe1\x13\x6b\x33\xfe\x38\x78\xd9\x94\xce\xf7\x97\x35\x27\x91\x3a\x61\xc9\x97\xc9\xb3\x54\xa5\x95\xb0\xb3\xa2\xae\x76\x38\xdf\x1e\xab\x53\xb5\x9f\x28\x7d\xc9\x23\x6b\x6f\x94\x18\xf1\x36\x1f\xc6\x1d\xaf\xe6\xe3\xe4\x9b\x15\xd5\xe9\x75\xcd\x31\x98\xee\xf3\x80\x49\xea\xf4\x37\x39\x02\xe6\x17\x40\x98\x1d\xad\x49\xce\x3c\x59\x12\x99\xeb\xb7\x53\x47\x0f\xd5\xc7\x61\x94\xfa\xf8\xc3\xbf\x22\x34\x6f\x76\x3e\x26\xea\x17\xbd\xec\x0b\x1e\x6b\xe1\x6a\x7a\x8f\x46\x7c\xa4\xb3\x8c\x03\x40\xfb\x83\x66\x1e\x16\x0a\x6a\x67\x87\x45\xb9\x2a\x21\x1f\x58\x15\x6a\xc4\x4d\xf1\x7e\xe2\xd5\x90\x1c\x4e\x1a\xfb\xea\xc0\x56\x46\x9c\xb9\x5a\x42\x9a\x15\x0b\x16\xc5\xa3\xdb\x4b\x60\x32\x99\x3f\x11\x2a\x23\xec\x49\xa9\x7d\x21\xa0\xd0\xcf\x94\xbe\x68\x0f\x15\x53\x03\x6e\x13\x8f\x8a\x65\x08\x10\xf2\x03\x41\xb7\x0f\xb8\x2a\x32\xe3\x36\x2b\xf2\x2d\xac\x88\xf4\x45\xd3\x4e\x0d\x63\xfb\x1d\xae\x2c\x80\xe0\x82\x00\xd1\x06\x9a\x1c\x1d\xb5\xe8\x30\x02\x34\x00\x8e\x09\x6e\x67\x4d\x00\xa8\x17\x85\xd5\xf3\x45\xed\x64\xe7\xf0\xd0\x10\x95\x49\x46\xb0\x86\xd5\xf1\x3e\x54\x13\x88\x58\x36\x36\xd0\x84\xc8\xe4\xb5\xf3\xc7\xab\xf9\xe8\x74\x6b\xf9\x64\xdd\x87\x8a\x6d\xc7\x73\x23\xb5\xbe\xc8\x85\xea\x3b\x55\x10\x56\x76\x98\x58\x2e\x15\x6c\x18\x4b\x15\x97\x49\x2c\x46\x79\x6c\x2b\xc0\x17\x00\x69\x87\x77\x0c\xa7\x35\x1f\x39\xe8\xa0\x94\x88\x85\x59\x64\xa2\x5d\x03\x3d\x1c\x9b\x52\x26\xed\x24\xab\x57\xd1\x07\x5f\x1d\x0e\xfb\x62\xbc\x0e\xcf\x04\x69\xe0\xce\xd3\x30\x38\xb5\xe0\x52\x87\xb2\xce\x64\xde\xae\x42\xac\x56\x97\x37\x54\x37\xf6\xf3\x04\x60\x79\x08\xfd\x7e\xe0\xb6\xc3\xd0\xe4\x8c\x5e\xf1\xd2\xf9\x16\x3e\x2f\xe8\xa7\x02\xbd\xd1\xb3\xc8\x8d\x3d\xf4\x2e\x6f\xdc\x66\x6c\xe3\xa1\x76\x3b\xc9\x33\xef\x17\x6f\xea\x30\x85\xb8\x62\x1b\x2e\x40\x53\x55\xf9\x93\x44\x31\x20\xe2\xeb\x70\x73\xae\xb7\x9d\x17\xbf\xaa\xf5\x71\x77\xeb\xe8\x0a\x3e\xbe\xf0\xd1\x23\x67\x9c\x4d\xf7\x03\x9a\xad\x1e\x40\x8e\x1e\x11\x6b\x07\x20\x57\x0c\x9d\x8e\x02\xe7\x29\x57\x1f\x36\x78\x82\xd0\xe0\x0d\x81\x2f\x2c\xb8\x71\x7c\xc8\xe8\x86\x71\xfb\xa6\xc3\x72\x0e\xd2\xde\xea\xcc\x62\x39\xef\x28\xa9\xae\x0f\x53\x0e\xba\x04\xe4\xd2\x9c\x51\x9f\xc1\x27\x26\xc7\x79\x10\xdd\x01\xe1\x97\xe2\xe9\xe2\x60\x42\x8e\x3a\x94\x2d\xaf\x97\xf2\xde\xf5\x5c\x5f\x30\xc2\x8f\x84\xc7\xc5\x45\x45\xf7\x5f\xf0\x8f\x82\x4d\x29\xf1\xe0\x62\x69\x88\x1a\xb1\x11\xa0\x48\xe8\xb9\xe4\x95\xd9\x95\x9c\x6b\x30\x11\xae\xb9\xee\xb6\x6c\xbe\x83\xb3\x36\x7f\x04\xf0\xf8\xcf\xff\xec\x6f\xfd\xcf\xfd\xcf\xfe\x7d\x7f\xe8\x5f\xf8\xf5\xbf\xef\x2f\xfe\x33\x7f\xf7\x37\xfc\x0f\x28\xfb\x9f\xfe\xec\xff\xf7\xa7\x7f\xee\x8f\xfc\xc9\xff\xe2\x2f\xf9\xa9\x5f\xf6\xdf\xff\xd5\xff\xb5\xfa\x01\xe0\x91\x2a\x27\x97\xfa\x20\x4c\x30\xe2\xb2\xbe\xa2\xd0\xc9\x9e\xa0\xe6\x20\xaa\xf8\x63\x26\x8e\x06\xb5\xb9\x82\x7b\x27\x53\xc2\xb4\x2f\x8c\xb4\x40\x7e\x5f\x9a\xcb\xfb\x3e\xe2\x2d\x6d\x99\x44\x25\xf5\xf8\x1e\x1b\x4f\xe0\xa1\x6b\xa3\x97\xb7\xf4\xa6\x29\x7c\xf1\x47\x47\x04\xbe\x40\xda\xb5\x6e\xa8\x6c\x2b\x71\xc2\x5e\x2f\x04\x42\x97\xd8\x0e\xc9\x32\x4a\x98\x33\xe1\xb7\xb3\xb8\xb3\x36\x69\xba\x07\xa2\x4d\x14\xf8\x64\x7b\xbd\x54\xf0\x89\xb1\x53\x2f\xd7\x92\xf4\x43\x8f\x52\x1b\x5d\xe9\x44\x8d\x92\x60\x35\x96\x2f\xf2\x25\x69\xbf\xee\x9e\xce\x61\xfd\xa2\xcc\x3d\xe2\x05\xc1\x71\x03\xfd\xfb\x3a\x06\xb2\x31\x79\x94\x56\x1c\x3d\xa3\xbd\x67\xf0\x16\xca\x6c\x86\x2a\x4f\x9f\x28\x82\x67\xe9\x7c\x51\xe6\xec\x0d\x5a\x0f\xe8\x82\x8e\x2f\x5b\xaa\x08\x24\xe5\x7b\xc4\xe3\xfd\xc3\x4c\xc0\xc4\x3a\xb4\x45\xaa\x10\xef\x34\xb0\xd6\x34\x7d\xa2\x99\xdb\xe3\xd9\x48\x75\x04\x02\xd7\x04\x58\xb6\x0d\x9e\x55\x59\xfb\x9a\xba\xaa\x1c\xec\x52\xc4\xb2\xac\xb8\xe1\x84\x0b\xbc\x7d\xc2\x2f\x86\x7c\x4e\x25\xeb\x63\x04\x74\xef\x1a\x85\xdc\x4d\x59\x3d\x65\xbc\x3c\x0d\x5a\xd3\x0f\x0f\x0e\x24\xf4\x99\xf5\x71\x2b\xe6\xf2\xa2\x65\xbf\x18\x1d\xb6\x9d\x4f\x1f\xf5\x51\x57\x02\x80\xc0\x12\x49\x9d\xea\x56\x7c\xa3\x51\x57\x53\xc1\x9f\xeb\x8d\x9b\xe5\x8c\x42\x02\x60\x5d\xd6\x2f\xf8\x47\x39\x53\x78\x53\xf6\x32\x2d\xb7\xd5\xb2\x64\xf0\xf6\x6e\x42\xa7\x68\xef\xdb\xe0\xcd\xfa\x41\x6a\xaa\xfc\x88\xde\x0b\x1f\x5e\xd7\x2f\x20\x28\x5f\x13\x45\x78\xbc\xae\x1b\x75\xc0\x78\xbd\xd6\xf5\x3c\x80\xc3\x03\xb6\x15\x57\xb4\x81\xd6\x7c\x34\x3f\x80\xcb\x3d\xd6\xb3\x3f\x81\xe3\xc4\xdd\x51\x07\x4a\x08\x50\xcf\xb8\xfa\x36\x30\xc8\x85\xb5\x2c\x84\xda\xc5\xad\xdd\x9b\x92\xe4\xd7\x72\x13\x20\xbc\x70\x04\xf6\x45\xd3\xee\x9e\x8a\x56\x4a\xd1\xcf\x97\xf4\x55\x6d\xe5\x3d\x10\x7a\xa8\x8b\x07\xc1\x97\xf6\x5c\x06\xb7\xaf\xbf\x6e\x2b\x4d\xe5\xbb\xc6\x17\xe4\x70\xaa\x55\x04\x42\x85\x26\xf2\xc9\x92\x9d\xf3\x42\x52\xef\x82\xcd\x8e\x4d\xa7\xdd\xa7\x27\xb1\xfd\x03\x78\x89\x34\x24\xaa\x8f\x6b\x5f\x54\x70\x65\x0e\x18\x13\x66\x36\x46\x18\x8b\x2d\x70\x27\xf6\xd6\x76\xb9\xb1\x99\xcc\xaf\x61\xf3\x5e\xbb\x16\x34\x92\x03\xba\xc7\x3c\xbe\x00\xce\x2d\xd7\x05\x5c\x6a\x8c\x13\x40\x8e\xa0\x9f\x41\xf4\xa3\x1e\xfb\x76\x83\x5f\xe3\x88\x94\x7d\x09\x5c\xd5\xea\x53\xba\x26\xaf\xba\x5f\x54\x70\x0e\xcf\x39\x90\xa1\x5e\x6b\x25\x22\x06\x9b\x84\x16\xef\x00\xc3\xb7\xc8\x82\x1d\xba\xb9\x86\x2a\x53\x83\xf1\x73\x9e\xb5\xa1\xff\xa2\xbf\xe8\xc6\xbf\x68\xbe\x81\x5a\x1d\x21\x6c\xd4\x57\xf6\x62\xe3\xb8\x8c\x0b\xf1\xb5\x00\xd1\x1c\x9a\x18\x0e\x7b\x23\x0f\x7d\xa2\x16\xbe\x38\x9d\xb8\x08\x64\x18\x99\x9b\xbf\xa8\x1d\x23\x8e\xe6\x47\x32\x5e\xb0\xe9\x32\x98\xd7\xaa\x1a\xdd\xb1\xc4\x55\x84\xdf\x68\xcc\x83\xc6\x17\x14\x75\xc2\x13\xc6\x81\xa8\x49\xa7\xcf\xf6\x0e\xee\x0c\x06\xac\xbd\x50\x93\xec\xdc\xf1\x60\x77\x84\xfd\xe3\x23\x6d\x20\xd6\xc0\xcb\x27\x09\x14\x2d\x86\x22\x17\x08\x66\x84\x6e\xbd\xce\x06\x48\x6f\xce\x7e\xf6\x0d\x26\xad\x44\x95\x6d\x8b\x4d\x35\xbb\x3d\xcb\x5c\x4c\x07\xfc\xe2\xa6\x3e\x05\x1c\x47\xd9\x72\x0a\x08\x0c\xb0\x30\x58\xe2\x48\xca\x21\x15\x0d\xd9\x6c\x7c\xc8\x81\xd4\x8d\x27\x04\xf5\xda\xb0\x7d\x38\x5f\xdc\x54\x32\x98\xaf\xb5\x39\x09\xac\x48\x53\x61\x9f\xaf\x84\xca\xc9\x63\xc5\xd9\x3e\xb9\x27\xd8\x9a\xe5\xaa\xb0\xf5\xae\xa5\x34\xf9\x0b\x56\x03\x93\x05\x56\xe0\x9f\x84\x03\x3b\xa4\x71\xe9\x39\x84\x4c\x06\x0e\x34\x26\x62\xa5\x7b\x56\x8a\x41\x71\xa3\x25\xe4\xe6\xde\xc3\xbf\xf0\x82\xa2\x96\x3f\x35\x5c\xd8\x1e\xc0\x24\xb9\xd6\x6f\xbc\x20\x38\x1d\xde\xb2\xc5\x16\xda\x4a\x5e\x4c\xd0\x76\x39\xd0\x4b\xab\x62\xd1\x2f\xee\x08\xe3\xd2\x48\x7e\x27\x7f\x15\xc5\xe7\x2a\xaf\x0b\xcc\x0f\xb4\x8b\x97\x9a\x32\xdb\x8b\x69\x88\x34\x7a\x91\xab\x0b\x9b\x68\x9c\x16\x5f\x38\x89\xb0\xa2\x16\xcd\xa3\xa1\x09\xb9\x6f\xa3\x87\xe3\xe8\xa8\x55\xb1\xde\x8b\x40\xb9\xe4\x86\xab\x82\x06\x35\x75\x51\xf6\x04\x36\xf1\xc5\x90\x0f\xc1\x15\xea\xc1\xc1\xea\x69\xbc\xcb\x07\x78\x19\x8e\x28\xc2\x8e\xd7\x33\x49\x8b\x09\x88\x12\xc1\xa6\x07\x57\xbb\xe5\x1e\xcb\xbe\x78\x47\x82\xa7\xb9\xd3\xf4\xd6\x6b\x88\x19\x00\x86\x4b\x5a\x00\xda\xe0\x45\x5a\xe9\x59\xbe\xe8\x71\xbd\xc5\xd6\x7b\x93\xbb\xc9\x3d\xcf\x17\x4a\x04\x0a\x39\xa8\x38\x5b\x36\x1d\x18\x3b\x6a\x9f\x56\xef\x0c\x10\x71\xf8\x64\xde\xc5\x18\x0d\xf1\xed\x8d\x11\x8d\x06\xf1\xed\x99\x7e\x21\x8d\x24\xb4\x6a\x29\x38\xde\xb3\x5e\xfd\x44\xe4\x98\xd5\x9a\x4d\xc6\x37\x7e\x30\x19\x3f\x4c\x26\xa0\x47\x5b\xe7\x99\x10\x98\x57\x79\xfb\x49\x7c\x41\x47\xb4\x92\x08\x35\x2f\xca\x59\x7b\x01\x7c\x96\x7c\xf2\x3d\xd4\x41\xd7\x65\x7b\x06\x96\x55\x17\xff\xba\xe9\x9e\x23\xb4\xe3\xe3\x47\x00\x8f\x1f\xfb\x97\xff\x66\x20\xff\xbb\x3f\x53\xd4\x4f\xfe\xde\x3f\xf2\x5f\xf9\x6b\x7f\xfa\x7f\xf1\xbf\x2e\xff\xde\x5f\xf9\x2b\x7f\xec\x4f\xfd\x9e\x3f\xf7\x1b\x7e\xf7\x7f\xe6\xbf\xf0\xb3\x3f\xf7\xe7\x3f\x61\x78\xb8\x4c\x4d\xd3\x72\x92\xa5\x34\xab\xdd\x63\x2e\xb6\xc8\x2d\x1f\x42\x99\x1f\x2e\x8c\x1f\xfe\x67\xb1\x0a\xf1\xd7\xee\x91\x3f\xd9\x5e\x87\x97\xe8\x05\x79\xb0\x6a\xde\x83\xf2\x92\x7d\x6e\x15\xdd\x15\xe5\x21\x35\x79\xfa\xaa\x57\x5d\x5e\xc0\x53\x70\x0f\x86\xab\xe7\x8b\xcd\x1c\x73\x4d\xe9\x25\x78\xe4\x1d\x6b\x2f\x16\x6b\x92\xa3\x18\xa3\xc6\xca\xbc\xd7\x4d\x19\x58\x5a\x96\x4b\xb8\x21\xeb\x94\x6f\x3d\xbf\x30\x4c\xa2\xc7\xa7\xe1\x9f\xe4\x2e\x6f\xf0\x38\xe7\x46\x8d\x9b\x9e\x32\x1f\x4c\x97\x6d\x87\x80\x27\x76\xda\x90\xf9\xa1\x7d\x0b\x6c\x77\x4a\xbf\xd8\x7d\xc0\xcc\xa3\x9b\x89\x76\x95\x52\x54\x85\xa6\x4d\xa9\x11\x12\x49\xe7\xab\x2f\xd8\x01\x54\xd6\x8b\xea\x0b\x74\x41\xd5\x36\x9e\xc3\x17\xad\x40\x27\xd6\xda\x5a\x4a\x9e\xe7\x65\xe9\x80\x9a\x11\x60\x33\x55\xe6\x2d\xd8\x4e\x0a\xaa\xdb\xcf\x87\x74\x94\x5d\xb4\xe2\xd7\xf3\x2f\x74\xa5\xac\xed\x58\xcf\xa4\x3c\x60\x2a\x7a\x3a\xac\x75\xd2\x45\x1c\x06\xd3\xab\xec\x04\xde\x10\x99\xb0\x43\xea\x9c\xfa\x82\xa7\x19\xdb\xbf\xb8\x23\x98\x17\xaa\x81\x11\x7e\xc5\xfd\x90\xd9\x47\x93\xef\xd5\xfe\x4e\x33\x91\x20\xc5\x88\xcc\xed\x76\x49\x40\x7d\xbb\x8d\x56\xe2\x4f\x02\xa4\x83\xac\x9d\x87\xd6\x08\xaf\xa2\x03\x77\xde\x91\x99\x38\x5b\x0c\x7d\x75\x8b\xa9\xa1\xba\x99\x15\xef\xec\x8d\x6b\xfa\x60\xdc\xcf\x17\x8c\x30\xda\x72\x66\x21\xe4\x20\x2b\x72\xab\x37\xeb\x91\x93\x37\x1f\xa3\xe7\xb3\xf7\xda\x49\xe8\xc0\xeb\xbb\x4a\x59\xc6\x8e\x52\xea\x17\xbf\x82\x9d\x47\xce\x29\xd6\x4d\x5d\xaa\xfc\x12\x93\xad\x42\xa2\x93\x07\x67\xa4\x5c\x29\xe5\x4d\x9a\xe1\x00\xa0\xbe\x7b\x3e\x58\xc3\xf5\xc9\x78\x8d\x11\xfb\xf9\x1c\x0e\xdc\x31\xce\xb9\x91\x84\xf5\xf0\x6b\xcd\x2e\x99\x75\x18\xa7\x8c\x92\x18\xea\xb9\x72\x80\xc0\xe7\x90\xe9\x0b\x03\x57\xea\x63\x32\x4f\x16\x37\x32\x4d\x23\x26\xb3\x4c\xea\x1e\x86\x0e\xe3\x8f\xdc\xea\xb1\x8e\x4e\x99\xe7\x0d\x91\x50\x8f\xc2\x9e\xfd\x7c\x51\xb5\x6e\xc1\xf0\x95\xb4\x73\xd1\x83\xac\xcb\xb6\xa9\x4c\x25\xca\xeb\x85\x3b\x99\x07\xd6\xb0\x0e\x79\xf5\xa1\xc2\x2e\x04\x00\x80\xee\x0b\x1d\xba\x2c\x13\xba\x86\xa7\x6b\xf3\x4c\x6c\x84\x47\x74\xaa\x6a\x99\xed\xbc\x9c\x37\x86\x87\x10\x98\x5d\xe0\xca\x5c\xcd\x14\x0f\x0f\xff\x62\x57\xca\xc0\xfb\x44\xfa\x5e\x6a\xc9\x98\x17\x70\x5c\x03\x79\xdd\x43\x3a\x82\xa4\xeb\x57\x9a\xb4\x35\xbf\xc6\x05\x25\xf2\x0e\x61\xa4\x4f\x6e\xea\x15\xc6\x95\xf3\x84\xc7\x8e\x88\x1a\x26\xf5\x56\x5c\xbb\x2e\xfe\x12\x1e\x05\x06\xdd\xa3\xe7\x81\xbd\xd1\x31\x5f\xdd\x05\x57\xfd\x8b\x3b\xd2\x5c\xe3\x1e\x91\x64\xb1\xe1\x0f\x31\x4c\x8f\xe6\x8f\x59\x82\x5c\x14\xbd\x6a\x3c\x08\x48\x61\xe0\x09\x75\xa3\xc1\xab\xee\xfe\xc4\x0a\x71\x9d\x85\x51\x32\xfe\x5e\x97\xec\x53\xe3\xed\xcf\xfb\xb2\xd6\x3d\x9b\x42\x81\x2c\x8a\x88\x55\xfa\x7b\x9e\xc8\x7a\x7a\xd8\x1b\x3f\x91\x0f\x87\x12\x9a\x9a\x84\x23\xb3\x17\xc0\xb3\x89\xc2\xfd\xee\x99\xf9\x86\x91\x08\x52\x61\x07\xe2\xa6\x71\xee\x07\xad\x04\xce\xb4\x9f\xd8\x91\xa3\xe6\xbd\x01\xc2\xed\x10\xe1\xcc\x05\x89\x64\x90\x49\xee\x15\x94\x53\xb3\x3a\xcc\xe1\xe4\xa5\xd5\xf1\x75\x73\x08\x12\x9d\x5f\xb8\x73\xb1\x31\xce\x25\x99\x34\x78\x78\x4c\x08\xb6\xfd\x12\x28\x67\xbf\x76\x04\xff\x4e\x43\x5d\xa0\x9c\x3b\x7c\x6a\x45\x01\xf8\x4a\xec\x17\x61\x97\x0c\x3e\x3e\x89\x6c\x33\xa7\x91\x34\x08\xed\x0b\x90\x4c\xef\xe6\x2a\x94\xf5\xd0\xa2\xb2\x73\x5e\x76\x86\xb5\x97\x94\xc3\x53\x9f\x4f\x32\x41\x80\x18\xd1\x1d\xbb\xdb\xe4\x44\x65\x94\xb0\xb7\xce\x2e\x22\xf6\x3b\xd4\xd6\x41\x68\x18\x14\x4d\xeb\xa6\xbd\xee\x58\xf8\x25\xf4\x8b\x77\x24\x90\xce\x2e\x7a\x8d\x69\x56\x95\x0e\x66\x20\xfa\x45\x1a\x00\x13\x25\x21\xb7\x96\x8b\xb3\xd1\x13\x6a\xfd\x2e\x7c\xee\x03\x1d\xf8\xe4\x5c\x68\x86\x10\x0a\xef\x88\x19\x21\x41\x8b\x92\x17\x68\x95\x5f\x06\x74\x6e\xbb\x20\x11\x8e\xea\x75\x1f\x9c\xe4\x9a\x71\xcb\xfc\x85\x4c\x94\x11\x0c\x0e\x86\xbc\x2a\xf2\xca\x09\xde\x21\x13\x1e\xde\x8c\x80\x4b\xa8\xc6\x09\x66\xa6\x4d\xcc\x30\xa3\xfa\x19\x31\x0e\x5e\xdb\x17\x1d\xdf\x21\x4b\x3a\xc3\xde\x2e\x51\x3f\x4e\xea\x23\x5d\xd3\x2f\x7b\x5f\x6d\x39\xe0\x9b\x35\x80\x0d\x1f\x08\xc8\x4c\xe5\x23\xe6\x13\xbf\x00\x8b\x99\x08\x25\x3f\x7d\xe7\x83\xc0\x7e\xa0\x50\x02\xac\x6d\x89\xaf\x6b\x43\x38\xfa\xc6\x34\x09\xd1\x34\x44\x53\x3f\x8c\x14\xf7\x72\xf1\xc5\xe9\x64\x31\x27\x5a\x53\x6a\x69\x85\xb0\x5f\x00\x38\xd0\x91\xfa\x0d\x44\xb1\x31\x19\xb8\x3b\x80\xe4\xbc\x72\x68\xd0\xb6\x47\x1d\x7e\xf1\xb2\x33\x7f\x67\xd6\x69\x5c\x6a\x23\xdc\xa5\x3f\x1d\xd5\x77\x92\x2a\xf1\xa5\xb1\x6d\x3e\x58\x0f\x4b\x20\x12\xc5\xeb\x5f\x5b\x83\xb0\xf7\x0b\x1e\xab\x03\x40\x20\x95\x68\x7a\x68\x46\x9b\x92\x65\xfd\x9c\x33\xfa\x5e\xb7\x02\xd1\x3b\xb7\xc9\x29\xe2\xc0\xb5\x77\x99\xaf\x64\xe0\x1f\x3b\x9d\xff\x08\xf0\xf8\x83\x7f\xff\x37\xfc\xf6\xff\xeb\x7f\xf7\x9f\xff\xd9\xff\xf8\xbf\xe7\x7f\xfb\x8b\x7f\xe2\xbf\xf3\x13\x67\xfe\xff\xff\xf5\xbf\xf3\x53\xbf\xe8\x0f\xff\x1e\xfb\x4b\xff\xf8\x4f\xfd\xa2\xff\xf7\x3f\xfc\x6f\x7e\xe0\xe1\xe1\xef\x39\xc3\x02\x80\x4e\xf4\x8d\xf7\x02\x74\xa0\x6e\x4a\xa2\x7d\x3b\x1b\x6f\xf8\xe4\xd7\x72\x9c\xe9\x7d\x50\x88\xcf\x88\xfe\x0b\xfd\x20\xe5\xbd\xee\xb1\xc8\x5c\xc5\x6c\x86\xdb\x8e\x3a\x3f\xc6\x02\x7e\x8f\x7b\xac\xe7\xfc\xc6\xe7\x76\x3b\xf3\xb1\x27\x20\x05\x36\xff\x84\x1c\xfe\x43\xb5\xd5\x85\xc2\x7a\xab\x32\xa3\x91\xb7\x54\x97\x00\x4c\x71\x7a\x77\xd2\x99\x44\x87\xc5\x4d\x2e\xd5\xb6\x33\x3a\x13\xe9\x93\xc8\x4d\x19\xf4\x68\x54\x24\x34\x2a\x9b\x19\xc3\x9d\xd7\x06\xae\x24\xbe\x29\x5d\xa8\x58\x58\x4f\x64\x99\xf4\xf3\x1a\x9a\x9d\x0e\xfe\x7e\x31\xcc\xed\x77\x4c\x28\xa8\x84\x97\xc4\x2c\xf8\x73\xe6\x8a\x45\x2f\xf6\x76\x56\x14\xa7\x6f\xb1\x4b\x48\x99\x6d\x54\xa4\xa7\x69\xde\x4e\xbf\x28\xf9\x4f\x61\x86\x73\x7f\x30\xa9\x5d\x9a\x59\x39\x09\xec\x3a\xc2\x85\x26\xe3\x85\x4b\xaf\xe9\x66\x15\xc7\x4a\x72\x1e\x53\x2d\xcc\xfc\x13\x44\xb5\x12\x58\xf5\x72\xb2\x27\x8a\xa6\x6b\x34\x92\xc0\x8f\xdf\x53\x0d\x8a\x13\x7d\xaa\x81\x43\x70\x37\x2d\x62\x08\x76\x61\xa3\xff\x42\x33\x17\xb0\x71\x7d\x0d\x27\xa7\x3e\xd8\xaf\xa7\x22\x1a\xa1\x41\xfa\x4a\x7b\x20\xa5\xec\x01\xb4\x24\xeb\x89\x9d\x2f\xd3\x2d\x01\xc0\xbf\x38\x17\xf6\x1d\xce\x24\x3c\x2f\x26\x80\xae\x55\x6b\xd3\xbd\xb9\x90\x6b\x8b\x4b\xa9\x25\xb5\x3e\xca\x2b\x2a\x78\x94\xf1\x62\xff\x1e\xf0\x81\xc7\x3f\xa3\x7e\xf6\x14\x42\x6a\xef\xa0\x6d\xd5\xd0\x4c\x92\x62\x78\xa2\x6d\xb7\xd6\x90\x42\x67\xa5\x23\xba\x59\x17\x4c\x1b\x6a\x2c\xdb\x17\x23\x25\x8c\x81\xc6\x28\x7c\x0c\xce\xbe\x5b\x26\x95\xdf\x31\x17\x2b\x0c\x2b\x56\xd0\x14\x75\x77\x1a\x46\xee\x2b\x07\x48\xc5\x96\xf3\x0b\xe9\x02\x85\x8f\xcf\xdc\x0c\x22\x58\x89\xfa\x14\x35\xe9\x9c\x0a\xce\x77\x0b\xa0\x34\x40\x4a\xc7\xe9\x24\x5a\x1e\x1b\x16\x36\xc7\xf7\xa1\x5f\x58\x58\xc5\xd9\x14\x0d\xcd\x09\x54\xee\x56\x26\xbb\x7d\xf0\x8b\xeb\x73\x26\xf4\x00\x3b\x49\x07\x0e\x82\x7a\x67\x71\x4f\xe7\x71\x53\x7c\xc2\x14\x5c\xb7\xfe\xd0\x8f\xcc\x17\x1c\xa4\xb5\x3e\x75\x58\xab\x1c\x84\xa9\x9b\xec\x32\xab\x37\x90\x9b\xb9\x2c\x9e\xa0\xbd\x75\xbd\xf5\x93\xb0\xcb\xe9\x21\x64\x75\x85\x49\x2a\x2e\x7d\x1b\xc0\x76\x50\xef\x79\xc7\xc6\x8d\x55\xbf\x61\x22\x37\xde\xfc\x30\xd4\x4e\x6e\xee\xa1\x9f\x44\xf4\x56\xdb\x02\x50\x0f\xa0\x6f\x74\x46\x16\xee\x6f\xc9\x3d\x75\x2f\x9e\xc5\x93\xbd\xca\x82\xb3\xf3\x5b\xfb\x70\x1e\xed\x37\x85\x61\xbf\x18\xe6\x14\xe2\x41\x49\x04\x71\x8b\x26\xbb\x97\x8f\x19\xb3\x33\xb4\x3e\xc6\x69\xbb\xad\xc0\xd9\x0c\x41\x5c\xb6\xc3\x16\xb9\x03\x3e\xe2\x13\x68\x32\x4f\x9c\x02\x65\xb6\xd8\x03\x64\xa4\xd3\x49\x62\xf3\x0b\x44\x9d\xa9\x0c\xd4\xce\xeb\x12\xb0\x49\x5a\x40\x01\xf4\x08\x92\x2f\x72\x30\xd8\xd1\xfc\xb4\x62\xeb\xe3\x66\xf6\x99\x4d\x22\xfa\x1b\xbd\xf3\x44\xbd\x4b\x90\x13\x46\x69\xb1\xa7\x8d\xe4\x33\xd6\x38\x9e\x3d\xfe\x8b\xa6\x3d\x9d\xe0\x82\x9b\xe5\x50\xc5\x37\x5c\x45\x36\x76\x6c\xe9\xa1\xf5\x26\xee\x18\xf5\x8c\x60\x9e\xc6\x1c\x34\xdb\xe4\x64\x34\x87\x5f\x88\x06\x3a\x11\xd6\xf1\x67\x49\x28\x5e\x77\x69\xca\xd7\x59\x9a\x98\x66\x76\xf0\x0b\xad\xe6\x91\x68\x16\xa8\x01\x87\x4e\xf9\xc0\xd4\x3f\x71\x55\x51\xf1\x14\xcc\x9b\x78\xc2\x24\xc3\x05\x19\xa4\xc4\x48\x00\x37\x38\x35\x81\xf5\xf2\x6a\x3a\xd5\x29\x38\xbc\x50\xbd\x96\x77\x20\xbe\x20\x87\xc7\xb5\x30\x46\xed\xe9\x48\x90\x89\x54\xb3\x02\x8b\x82\x94\x51\x06\x39\x36\x02\xa1\x8b\xd7\x62\xde\xad\xfb\x59\x6a\xbf\x20\xb6\x2f\xce\xc5\x13\x6b\x37\x64\x42\x4a\x27\x5b\x56\x3f\xe8\xb4\x72\x9e\x4d\xf1\x93\xb5\xac\x91\x22\x46\x93\xc5\x39\x51\xb1\x11\xbe\x75\x86\xf3\xc5\x24\x20\x12\xe9\x0b\x87\x0a\x2d\x95\xa1\xa0\x7a\x16\xda\x20\xea\x1f\x1a\x0f\xd6\x43\x06\x19\xc8\x1c\x3a\x91\x01\xb6\x32\x81\x75\xf2\x0b\xd6\x24\x5d\x03\x80\xa0\xa6\x52\xe4\x09\xa9\x8a\x41\x8b\x6b\x93\x5b\xb7\x7a\x88\xa4\xbf\x2f\xd1\xf7\x7a\xc2\x22\x49\x4a\x69\x06\xdf\x58\xbf\x90\x0f\xdf\x6b\x46\x58\xa4\x8f\xc2\x36\x8f\xd0\x11\xef\xd6\x75\x4a\x81\xe1\xf9\x36\x62\x56\x33\x2b\xce\x05\x59\x8b\x41\xcb\xf6\x1d\x9f\xc8\x38\x0a\x99\x19\x8b\xe7\xc2\xd8\x04\x48\xb1\x3b\x1d\x89\xc7\x4c\x78\x7c\xcf\xac\x18\x43\x13\x8f\x01\xf9\x90\x1d\xbd\x01\x7a\x5b\xf8\x05\x9f\xe0\xc8\xa0\xf1\x53\x96\x3d\x30\x28\x15\x94\xa7\xeb\x15\x45\xec\x43\xf4\x13\xae\xe6\xbc\xd6\xeb\x12\x2d\xf5\xde\x1d\xd8\x64\xed\x13\xc3\xe7\x67\x5d\xff\xcc\x6a\x76\x9b\x46\xb7\xf9\x34\xb9\xa5\x55\xef\x3d\x1b\xb2\xe5\xb3\x14\x09\x60\x26\xa9\x49\x98\x5f\x02\x60\x24\xe7\x0b\xae\xb7\xbd\x81\x71\x71\x29\x3e\x8f\x84\x0f\x5d\x58\x0c\x28\x4c\xae\x62\x37\x80\x63\xf0\xeb\x05\xe8\x64\xfe\xbc\x94\xe8\x61\xab\x91\xf0\x0b\x41\x37\x76\xe2\x19\x18\x99\xfb\x92\xd4\x8c\x29\x72\xbc\xcf\x51\xf3\xe2\xad\xd4\x50\x38\xef\x60\xd6\xab\x8c\x58\x62\x11\xa7\xf4\xb9\xed\x47\x53\x5a\xd2\xaf\xff\x83\xbf\xe9\x57\xff\x1f\xff\x95\xf0\xd7\xff\xd9\xbf\xf1\x1b\xff\xc1\xaf\xfa\x05\xf9\xb7\xfd\x92\xdf\xf8\xab\xff\xc0\xef\xff\xf1\xdf\xf9\xe7\xfe\xfc\x7f\xea\x9f\xfc\x4f\xff\xdd\x9f\xfb\x0f\x7d\xc0\xf0\x98\x34\xe9\xca\xb8\x98\xfb\x4d\xb2\x88\x64\x5d\xed\x92\x97\x16\x33\xdb\x88\x5a\x30\xde\x4b\xa7\x64\xf0\xa5\xa6\x6c\x4a\xc7\xd3\x3e\x11\x0d\x54\x13\x86\x2a\x94\xad\xbb\xac\x79\x05\xe7\xe5\x11\x8b\x7a\x98\xed\x2e\xb0\x3e\x2c\xbc\x7d\xd0\xaa\xd7\xeb\xdf\xdd\xf9\xd6\xf7\x8b\x83\x04\x91\x31\x25\x92\x87\x5d\x5e\x55\x87\x30\x85\x93\x66\x5b\x0d\x92\xf4\xaa\x21\xc9\x65\x33\xbb\xcc\x11\x2c\x63\x93\x1b\x64\x69\x5f\xfc\x8a\x13\x59\x85\xae\x27\xea\xeb\x62\xfd\x36\xb9\x54\x35\xd0\x59\x32\x20\x07\xd9\xa0\x37\x84\x77\xea\x7a\x78\x99\x70\xca\xfd\x46\xff\x05\xab\xc1\xcc\xbe\x1f\x5a\x50\x8f\xc5\x80\x6a\x03\xee\xa9\x78\x8b\x5f\xcc\xd8\x2c\xda\x2f\x52\x48\x47\x57\xe4\x27\x5a\x3f\xb7\xaa\xe0\x13\x74\xd9\xd9\xc0\xc4\xfb\x48\x8f\xcc\xd2\x02\x54\xc4\x1c\x2e\x25\x3c\xf0\x58\x1d\x5f\xd3\x3a\x03\x3d\x61\x36\xf2\x71\xb4\xed\x45\x7d\xfd\xa2\xd8\x66\xe2\xa1\xe2\x03\x0e\x31\x20\x5a\x72\x9c\x9a\xae\x73\x9e\x1d\xc7\x34\x25\x9b\x7b\x76\xef\x99\x96\x17\x59\x9f\x7d\xdc\x6d\xe2\x0b\xc1\x55\xa0\xd2\x55\xba\x83\xdc\x49\x36\xd0\xdf\x5d\xf3\xa2\xf5\xca\x81\x86\xc0\xc1\xd6\x25\x82\x11\xec\xa1\x88\x35\x68\x08\x67\xd8\x7e\xe2\xae\xef\x33\xdf\x19\x19\x35\x2f\x1a\x50\x10\xd6\x13\xc3\xaa\x26\x2a\x1f\x91\xbb\x1b\x33\x03\x42\x28\xb6\x92\x86\x59\x16\x11\xca\x7d\xe2\x6b\xcf\x1f\x18\xd9\x4c\x64\x90\x23\xcf\x69\x4b\x41\x76\x26\x1a\x5d\xf0\x37\x8a\x4d\x5e\x04\x3b\x9a\x89\x4e\xa6\x8e\x43\x6d\x9d\x4f\xb2\xe1\x41\xf2\x00\x72\x87\x59\x57\xe9\xb5\x9d\x82\x99\xcb\x01\xb6\x3c\xb7\x5c\xcc\x6e\x2a\x24\x85\x1b\x20\x1a\x94\xc0\x5e\x72\xf6\xe0\x8b\x5d\x29\x6c\x79\x30\x0f\x3a\x58\x99\x14\x75\x1b\x45\x3e\xd2\x37\xa3\xa7\xf5\xab\x85\x7b\x53\xaf\xdc\x48\xcd\x36\xd6\xfb\x06\x3c\xa9\xfd\x62\x87\x5e\xe7\x99\x93\x10\x7c\x54\x77\x2f\x56\x39\xa8\xdb\x62\xb8\x29\x2c\xc8\xa9\xa9\xf5\xa8\x20\xc4\x43\x66\x41\xde\xc5\x50\x25\xfb\xe2\x1d\xa1\x5a\x1b\xec\xc2\xbd\x8b\x48\xa0\x6f\xe9\x82\xa3\xa2\xcc\x20\x9a\xcd\x89\xac\x6d\x8c\xf5\x24\x16\xa9\xb8\xf3\x20\xdf\xc3\xe3\x17\x63\x14\x35\x8f\xa6\x10\x22\x2b\x0c\x7d\xce\x41\xd4\x03\xa2\x47\x83\xd0\x16\x94\x5b\xd7\xd7\xb6\x44\x4d\x23\x07\xc1\x75\xdf\xaa\xeb\xfc\x22\xad\x9f\x21\x53\xcd\x0e\x74\x4d\x76\x6b\x0f\x2e\x2e\x12\x1e\x7d\x2c\x57\xed\x06\x6b\x6c\x55\x97\xec\x64\x48\x3c\x82\x79\x7c\xb5\xe4\x5f\xf8\x13\x30\xf7\xae\x5e\xeb\x4b\xc5\xc1\xf9\x09\x6c\x54\xd2\x6e\x20\x24\x67\x92\xe9\xe3\xca\x6e\x0d\x5e\x50\xe8\x86\xe5\xa1\xcc\xda\xc1\xbe\x38\x9d\x2c\x41\xb4\xd5\xa4\xa0\x83\x4e\x32\x7b\x26\xde\xee\x6c\x80\xf2\x52\x98\x93\xd6\xc4\xc3\x13\x19\x86\x75\x8f\xed\x8e\x34\x3f\xa4\x7f\x02\xc7\xa5\xd6\xcb\x7c\xe2\xed\x6d\x43\x70\x4b\xf0\x24\x74\x91\x25\x7b\xb7\xce\x12\xe7\x1a\xd0\x8a\xcc\x68\x2c\xa1\x4a\x48\xaf\xf9\x45\x97\xc3\x5c\x24\xdc\x29\xc1\x6f\x0c\x92\xa6\xd4\x0f\x58\x2c\xbf\x66\xf0\x35\xd9\xe1\x43\x15\x31\x72\x63\x62\xa9\x67\xf0\x36\x56\xec\x1f\x01\x61\x1a\x3c\xa4\xa1\xf6\x10\x9e\xbd\x55\x6d\x84\x72\xde\xc6\xcc\x14\x1e\x93\x7d\xeb\xb3\xbc\x96\x1d\xbf\x77\x6f\xc5\x63\x3d\xf6\x8b\xfe\xc2\x88\x11\x49\x5c\xcb\xd9\x56\x9a\x4d\x53\x07\x49\xb8\xb3\x08\x26\x42\x35\x54\x22\xbb\x37\x6c\x5e\x22\xc7\x5a\x00\x79\xd6\xb0\x5f\xec\x4a\x43\x6f\xaa\x66\xde\x93\x1c\x35\xdf\x08\x6d\x59\x55\x3d\x6f\x51\x27\x6d\x95\xb5\x30\x06\x5a\x70\x8e\x60\x7a\x18\x9b\xc9\xcb\xef\x17\x03\x0c\xf7\x11\xa8\x35\xd3\xa9\x1b\x0f\xb2\x22\x49\xaf\x43\x46\x3f\x02\x64\x50\xd2\x59\x01\xa6\x1c\x63\x52\x8f\x38\x84\x19\xd3\xfd\x27\xb2\xaf\xfc\x78\x07\xb9\xa3\x36\xf3\xa2\xbb\xc1\x35\x73\xf5\xa8\xcc\xd6\x58\xcc\x78\x49\xf2\x10\x42\xec\xd6\xe7\x0c\x0c\xa2\x12\xa7\xfb\x02\x2c\x9e\xfb\x62\x5e\x33\x27\xad\xf7\xa3\xa7\x07\xf6\x59\x36\x51\x34\x76\xc6\xb1\xd9\x54\xe7\x9b\x1f\x10\x4f\x9e\x6f\xca\x3e\x50\xf6\x09\x9b\x36\xee\x2a\xfd\x8b\xae\xba\xda\x73\x22\x0f\xcc\xab\x94\x1e\xda\xb0\xfe\xc6\x13\x4a\x1e\x1b\xe1\x78\x0a\x5e\x69\xc4\xba\x04\xfc\x42\xc4\x4c\x1f\xbf\x0f\x1c\x78\x6c\x12\x0c\x10\xc8\x48\x27\x86\xca\x3d\x6a\xcb\xc1\x5e\x26\xf3\x13\x1e\xd0\x08\x97\xfd\xcc\x8c\x51\x0a\xee\x0b\xc8\x5a\x3f\x6b\x6c\xeb\xa9\x65\xfd\x5d\x9a\x29\xfb\x2c\x16\x82\x06\x5e\xeb\x2e\xc3\xd0\x13\x0d\x5f\x28\xb5\xfc\xf0\x99\xdf\x03\xa3\xff\x62\xd1\x26\xda\x0f\x7f\x81\x08\xae\x5e\xee\x09\xa7\x38\x4b\x4c\x04\x83\x43\x51\x7c\x1f\xf2\x39\x95\xbb\xbc\x40\x5f\x2a\xd2\xc4\x21\x6d\x5f\x2c\xda\x18\xd5\xf9\x65\x99\x2e\x1c\xb5\xe2\x5a\x1c\x20\xa1\xf0\x61\x0e\x7d\x81\x99\x3f\x34\xc6\xfc\xf1\x4f\x1a\x25\x94\x84\x1f\xf8\xcc\xe7\x7e\xd1\x77\x76\xe0\xfd\x44\x41\x00\x61\x9b\x19\x12\x80\xb0\x00\x25\x15\x1f\xcd\x99\x57\xdb\xef\xd9\x19\x36\xb3\x1c\x88\x5f\x0a\x4f\x20\xe7\xfd\x11\xc0\xe3\xd7\x88\xbf\xfd\x33\xbf\xfc\x37\xfd\xd9\x7f\xf3\x1f\xfc\x9f\xfe\xf8\x5f\xe2\xbf\x5f\xfc\x8e\x9f\xf9\x87\xff\xc4\x7f\xe2\xd7\xfc\xfa\xfd\xde\x7f\xeb\xaf\xfe\x7f\x7e\xc1\x1f\xfa\xad\xff\xf5\x0f\x18\x1e\x80\x6a\xab\x89\xd6\xcb\x95\x67\x08\x72\x3a\x13\xb0\x2b\x18\x96\x2a\x86\x07\xe8\xcd\xbd\xee\x6d\x6f\xab\x48\xb7\x0e\xae\x7a\xd8\x17\x23\x25\xbe\x6c\x51\xfe\x44\x5e\xdf\x8c\xaf\xb3\x7d\x43\x5b\xce\x72\xfe\x69\x84\xc7\xfa\x18\x52\xe2\xfa\x61\xec\x24\x88\xbf\xf3\x69\x75\x7c\x81\x2e\x5f\x6d\xed\x34\xb0\x5d\x54\x43\x03\x86\x21\x95\x07\x1c\x34\xd4\x8d\xf0\xbc\xd2\xcd\xed\x91\x24\x4f\x2c\xd2\xf4\x21\xf2\x2b\xc0\x17\x7c\x82\xe4\x5e\x2f\xd8\x08\x5e\x18\x66\xb0\x75\x68\x41\x6f\x8e\x48\xe4\x69\xa0\x39\x87\x51\xee\x99\xa5\x18\xdd\xc9\xa6\x23\x10\x4e\xf8\x04\xd7\xb5\xfe\x39\x56\xae\x09\x89\x4a\x4a\xac\x64\xd9\xae\x10\x39\xe5\xb1\x1a\xf4\x55\x42\x98\x4a\x65\xb3\xe4\xd2\xb4\x1e\x75\xe5\x17\x0d\x09\xa5\xa5\x47\x20\xe2\x1b\x77\x83\xaa\x3c\x2c\xf6\x54\xb3\xac\x68\xa4\x77\x05\xfb\x16\x7e\x1e\x23\x0f\x7e\xd4\x33\xda\x8c\xed\x99\x5f\x70\x6e\x58\x0c\x40\x54\xc6\xef\xf2\x85\xc7\xc9\x46\x71\x8b\x60\x17\x92\x4e\x16\xbf\x13\x18\x60\x95\x91\x19\x9a\x87\xcc\x68\x5b\x96\x03\x7c\x42\xa7\x7b\x1a\xa5\xb6\xbe\x0c\x2b\x12\x5f\xe7\x82\x2f\xe5\x5a\x0d\xc7\x3c\x01\x30\x08\xe1\xf0\x25\x89\x8e\xa7\x50\x91\xf3\x9c\x47\xff\xe2\x8b\xd4\x57\xf5\x92\x6b\x8c\x77\x77\x61\xab\x51\xe3\xea\x2e\xa6\xcf\x5c\x87\x6c\xa1\xa9\x2a\xc7\x65\xb4\x74\x25\x3f\x8c\xe9\x4c\xbe\xc8\x7e\x60\x22\xcb\xd8\xf6\x0a\x4c\x20\xb2\x6a\xe6\x59\x3a\x04\x71\xf7\x08\x49\x7f\x3d\x28\xbb\x04\x1a\x81\x2a\x49\xb6\x27\x5c\x96\xca\x17\xd1\xcd\xd4\xaa\x71\x5f\x07\x04\x8d\x32\x0e\x51\xcd\x6d\xb3\x72\xed\x5b\x5f\xfd\x18\xd0\x50\x93\xae\x07\x4f\x14\x14\x5a\xeb\xdd\x08\xec\x5f\x9c\x8b\x89\xf3\x70\x4f\x1e\x2b\xcc\x81\x7d\xc9\x44\x25\x8c\xc1\xcb\x4e\x5e\x69\xed\x8e\xc0\xc8\x4f\x97\xb4\xd7\x05\xf7\xc3\x34\x51\xe2\x8b\x61\x0e\xe2\x85\x1d\x00\x67\x70\x51\xc2\xce\x57\x63\xf2\x36\x6c\x05\x17\xeb\xb1\x83\xf4\x03\x4e\x7d\xd4\x12\x8a\xba\x63\x6a\x96\xed\x93\xc0\x36\x89\x68\xd2\x7b\xa9\x1b\x41\xf6\x41\xea\xd9\xe0\xaa\xc8\xf4\xc4\xd9\x7d\x71\x34\xa6\xcb\xb1\xf4\x23\x8c\x4f\x9e\x6e\xd5\xe0\xf9\xa2\x82\xbb\xf7\xee\x9b\x01\x6c\xed\x51\xca\xa5\x7d\x69\x91\x82\x00\xa9\x18\x3c\x65\xbe\xd5\x32\xc5\x1c\x4c\x62\x5d\xb9\x8b\x3c\x8e\xb8\x2f\x06\x5b\x11\xbb\x6d\xb5\x20\x55\xf6\xae\xa0\xa9\x04\xc9\xcb\xe6\xbd\x90\x71\x69\xd4\xad\x93\x16\x93\xbc\x72\xcf\x53\xb8\x97\x73\x8e\x2f\x38\x7a\x14\xc2\x24\x6c\x1e\xcc\xa6\xb2\x88\x78\x6d\x13\x81\x95\x61\xe1\x33\xfa\x0d\xe1\x88\x2a\xe4\x91\x43\xb8\xa4\xfb\xad\x35\x5a\xfb\x09\x9f\x40\xa7\xf2\xde\xc2\x6b\x67\x68\x42\x99\x8e\x54\xc7\xe0\xb7\x3a\x61\x36\x53\x2f\x5b\xd1\xd3\xea\xf3\x9a\x1a\x08\x1e\xb4\xad\xda\x7e\xa1\x43\x6f\x25\x50\x34\xe6\x5a\x8a\x20\xa5\xfa\x63\x75\x64\x5d\xe3\xd6\x9f\xd0\x7a\x99\x37\xea\x73\x68\x22\x73\x72\x6f\x6f\xa7\xa7\xf8\x2f\x5c\x98\x46\x35\xf6\x19\xe3\xea\x53\xf1\xe5\x97\x0b\xbe\x9f\xfa\x5e\xad\x5b\x1d\xdc\xc5\x74\xa9\xb8\x21\x5d\x58\xd8\x3b\x1e\x3f\x3e\x8a\xbd\xbf\x35\xb0\x93\xcf\xf3\x08\xf2\x8e\x0d\x54\x88\x18\x59\x5f\x1a\xec\x3f\xb4\x3d\x05\x2a\x72\xf9\xbe\x33\x95\x05\xb5\x0a\x68\x28\xff\x81\x4c\x94\x71\x43\x9d\x19\xcf\x6e\xfc\xbd\x21\xca\xd9\x0e\x84\x81\x2a\x3c\xc9\x43\x7c\x76\x91\x0c\x0f\xf7\x6b\x4c\x83\x96\x20\xc0\x1f\x04\xbf\xd8\xe4\x03\x78\x5f\x68\x58\x70\x49\x06\x76\x33\x44\x20\x0a\xa2\x1b\x3b\x88\xdb\xd2\x7d\xb2\x6c\xbe\x47\xd0\xd5\x82\x77\x23\x7a\xbf\x3f\xe1\x99\xf4\xe4\xe7\x94\x8c\x50\xb4\x7a\x8c\xb0\x2f\x38\xab\xd4\x4f\xe6\xa9\x58\x1b\x8d\x8f\x1a\xb8\x04\xd3\x03\xc3\x5c\xa2\x12\xc5\xcf\x07\x23\x25\x75\x0c\x4f\x3c\x99\x12\xd2\x70\xa5\x23\x47\x67\x22\xc5\xd4\xb9\x4c\x13\x04\xdd\x3b\xcd\x51\xde\x95\xf5\xf6\x2d\x6c\x95\xf5\x7c\xc2\x76\xf1\xad\x89\xc8\xbd\xd2\x9a\x69\xcc\x08\xdf\xe8\xd4\x9d\x3c\x98\x8f\x15\xb4\x8d\xe7\x35\xe2\x3a\xe5\xfa\x9c\x1b\x14\x93\x02\x6c\x1f\xf0\x09\xd8\x01\x98\x0b\x24\xb1\x2a\x85\x5e\xa8\x0f\x31\x4c\x8b\xc4\xc7\x0e\x97\xf6\x2b\xe5\xcb\xe6\x78\x81\xd3\xe6\xcd\x74\x85\x82\xe2\x27\x77\x04\x51\xac\x04\x81\x77\x11\x7f\xdd\x40\x75\xac\x32\xde\x19\xfc\x70\xfb\xec\xaa\x44\xcd\x8e\x9c\xd2\x27\x45\x16\xa7\xd4\x3b\x73\x5f\x18\xb8\x56\xe9\x6e\xdf\xfd\x61\x1d\xe2\x5c\x7c\x63\xd8\x96\x41\x49\x10\x0c\x15\xc7\x21\x59\x7a\xc7\xb9\xd8\x3c\x02\xc5\x77\x50\xb9\x3e\xc9\x8a\x79\xea\x89\x22\x37\x83\x51\x63\x8a\xf0\xdb\x2d\x02\xf0\xc6\x6a\x26\x7e\xeb\xb8\xc8\x79\x16\xd3\x9b\x8b\x6b\x18\x57\xa4\xd2\x73\xbf\x38\x9d\x75\x5b\x42\xc3\xb3\x0c\xdc\x90\x18\xe9\x07\x85\x70\x40\x2d\x76\x06\x2b\x8a\xc7\x34\x3d\x90\x90\xb0\xb9\xc0\xf7\x94\xdd\xa2\x4f\xf8\x47\xca\x55\x70\xa5\x85\xaa\x95\xde\x25\x85\xe5\xc6\x31\x1d\xd0\xfd\x69\xcc\x96\xab\x1d\x78\x77\x54\xb6\xce\x11\x95\x84\x05\xe1\x7f\xac\x76\xfe\x23\xc0\xe3\xcf\xff\x95\xff\xe4\x9f\xf9\xcd\xff\xc6\x5f\xff\x25\x7f\xf9\x37\xfe\x8a\xbf\xf7\xcb\x7f\xdb\x7f\xa9\xfd\x6f\x7e\xdd\x9f\xfd\x6f\xfc\xae\xff\xfd\x9f\xf8\xc3\xff\xf4\x1f\xfb\x7f\xfe\xf4\xaf\xfd\x63\xf0\xff\xfc\x01\xe0\x41\x5d\x3b\x92\xbc\x93\x96\x25\x7c\xcd\x00\x81\xe5\x2d\x48\xee\x7d\xef\x15\xd2\x9d\xd6\x5e\xe2\x71\x3c\x55\xbe\xe3\x0c\x3d\xf0\x27\x9f\x90\x84\x67\xd3\x29\x24\x4c\x8f\xf2\x26\x10\x85\x99\x0d\x22\x9f\xb2\xb0\x92\x85\xe2\x95\x99\x0e\x19\x91\x29\x75\xb9\x88\x6a\x5c\xbf\xd8\x52\x12\x00\x61\xf3\x68\x46\xbf\x18\x70\x26\xce\xa4\xdd\xb4\xa9\xcd\xa6\x9e\x40\xef\x1b\x12\xc6\xba\x23\xbc\x2b\xbd\xec\xe1\xec\x88\x2f\xc6\x6b\x90\x96\x19\x52\xd2\xb7\x10\xf5\xf0\xcd\xda\x8b\xce\xf1\xda\x38\x6b\x5d\xa9\x50\xc7\x39\x00\x35\x01\x04\xf0\xd0\xf5\xb0\x3a\x3f\x49\x65\x4f\x2a\x48\x60\xca\x1a\x33\x47\xa0\x82\x17\x1a\x86\xb7\xa2\x9a\x76\x8a\x29\x90\x7a\x72\x93\x0e\x4d\xe9\xe5\xc0\x89\x87\xca\xbf\x08\xaf\xa3\x57\x54\xcf\xde\xae\xd1\x3e\xcf\x03\x32\x8c\xe3\xe8\x37\xff\x7c\x44\xfc\x2e\x63\xea\x88\x8a\x5d\xb9\xf8\xd5\x8c\x3a\x0a\x1c\x40\xbf\x90\x2e\x34\xc2\xd5\x45\x4d\x9d\x20\x45\x57\xaa\x8b\xd4\x2c\x01\x08\xa2\x29\xfc\xea\xd9\x85\x36\xe0\xb1\xcd\x04\xbe\xcc\xaa\x30\x56\xf7\xc5\x96\x52\xcb\xe9\xf7\xae\x53\x9c\x08\xa7\x57\x37\x95\x1b\xd8\xd2\xb7\xd3\x27\x82\x85\x8b\x11\xa5\x6c\x33\xfa\x23\x8c\x16\xa5\x61\x03\xbf\xd0\xa1\xdb\x07\xa7\x0e\x03\xdb\xda\x61\xbb\x02\x5e\x53\xc7\x46\x93\xd4\x46\xf2\x32\x52\x87\x63\xf5\x23\x31\x7c\x9b\xe9\x52\x32\xf4\x4d\x5b\xf4\x28\x78\x5e\x92\xfd\xac\x12\xbe\x6e\x97\x22\x1f\xbf\xde\xea\x47\xe7\x69\x30\xe2\xee\x61\xa4\xba\xe9\x0a\x91\x57\x7a\x03\xe6\x17\x3a\x74\x46\x1d\x0d\x67\xdb\x78\x0e\xe0\xfb\x02\xf8\x3a\xae\xfa\x09\xaa\x95\xbb\x53\x34\xa1\xbf\x86\x73\xe5\x11\x49\xd1\x45\xf9\x12\x69\xbf\x00\x7f\x20\x34\xd5\xa3\xc8\x83\x8d\x12\x68\xde\x69\x4c\xe2\x72\x52\xa7\xf2\xf8\xc6\x98\xd5\x23\x8d\xa1\xb5\x3b\xd6\xad\xad\xe0\x5e\xfa\x45\x43\x62\xac\xec\x94\x02\x21\x74\x7f\x1f\x3c\x56\x9e\xcd\x88\x76\xcc\xcb\xdb\x78\x57\x94\x9d\x49\xb4\x7b\x1f\xe2\xf5\x87\x1e\x59\xe2\xf9\x24\xc9\xa8\x4c\x97\xc9\x23\xf5\x2c\xd8\x94\x28\xc4\x14\xb4\x17\x6f\xd9\x6c\x32\xbd\x3b\xb5\x23\xcc\xf5\x93\xae\x12\xf1\xa4\xfb\x9a\xf3\x45\xb6\x14\x9d\xbd\xb7\xa6\x1d\xe7\x4b\x89\xf7\xae\x46\x90\x23\xd4\x95\x61\x14\x30\x52\x71\x3f\x11\x61\x7b\x0b\x39\x5e\x79\xcc\x68\xee\x13\xa8\x81\x60\xd5\xd5\x48\xdd\x2b\xe2\xf6\x20\x06\x3d\xe7\x59\x2e\x00\x4d\x0f\x7e\xfc\x82\x76\x01\x4d\x1b\xaa\x26\xfb\xf7\x2d\x62\x07\xf6\x85\x10\xaf\x1a\x85\x1d\x4c\xef\xd2\xe6\xf5\x83\xa9\x94\x55\x0a\xb1\x59\x64\x90\x53\xfd\x24\xb4\x9e\x07\xf2\xf2\x82\xe1\x92\xee\x2c\x99\x2f\x2c\x75\x19\xe1\xcc\xf1\x2a\x89\xc4\xcd\xb5\xe5\x4f\x7c\x80\x9c\x3a\xb0\x0c\xcb\x32\x19\x89\xc3\x02\xd0\x89\x03\x79\xbd\x16\xcb\x05\xfe\x09\x28\x28\xe4\x12\x6e\x20\xb2\xf6\x82\xe5\x3c\xa9\xe0\x32\x93\xa1\x24\xc8\x7d\xc4\xab\x91\xbd\x88\xa4\xdc\x14\xdb\x0d\x20\x2b\xa5\x66\x5f\x30\x48\x1b\xf0\x12\x4d\x8a\x14\x09\x79\x03\x9f\xea\x73\xac\x96\x79\x93\x17\x17\xd2\x4d\x18\xb8\x34\x2c\x1f\x8e\x87\x83\x84\x9d\x59\xf8\x27\x02\xcd\xe3\xea\x40\x81\xed\xce\x9b\xd3\x3f\x9f\x61\x45\x6d\xf4\x2c\x0f\x6b\xc1\x9b\x47\xc9\x98\x25\x37\x6c\x82\xa0\x33\x6f\x50\xef\x5f\x6c\xf2\x0d\x99\x79\x32\xe9\x32\xf7\xbe\xd0\x86\x02\x95\x83\x6f\x93\x5f\x18\x12\x92\x98\xed\x9d\x69\x85\x50\xc6\xbb\x5e\x40\x78\x2a\xf0\x8b\xe5\x12\x83\xf9\x11\x4f\xd0\xdb\xfe\xd0\xc1\x90\xbe\xd3\xd9\x1c\xde\x95\xd2\xd9\x37\xb1\x2b\xbc\x2e\xf9\x3d\x11\x5a\x8c\xbd\x42\x4c\xd7\x2f\x62\x69\x8d\x94\x02\x73\x2d\x77\x85\x3e\x57\x41\x19\xed\x41\x38\x84\xc9\x7a\x60\x28\x08\xda\x16\x1b\xe5\x56\x10\x3d\x74\x09\xda\x98\xf3\x85\xec\xab\x05\x1c\xbc\x56\x23\xcf\x98\x47\x7e\x64\x4b\x2a\xee\x6a\xab\x57\x3c\xe6\xc7\xa5\xc5\x1f\x53\x81\x94\x5d\xd8\x74\x2a\xc9\xfd\x93\x30\xed\xa6\x66\x78\x9e\xa6\x2c\x8b\x2f\x41\x9a\x39\x56\xb6\x7e\x9e\x75\xe3\x30\x80\xca\x4b\xcd\x72\x0c\x27\xb8\x89\x59\x12\xcc\xb3\xf9\x17\xa9\x91\x84\x10\xaf\xba\xcb\xa3\x81\x89\x8d\x11\x75\x8d\x65\x4d\x79\xd7\x19\x09\x8b\x78\x2b\xe5\xf0\x50\x8c\xac\x5c\x70\x60\xa9\xde\xfe\x85\x8c\x03\x84\x44\x7f\x28\x13\xc0\x5c\x25\x85\xbb\x49\x70\xf2\xc8\x50\xda\xf6\x85\xdb\x94\xe9\x16\x33\x44\x71\x64\x22\x60\x17\x98\xf3\x27\x82\x6e\x7b\xe4\xc6\x5d\x1d\xba\xb7\xec\x85\x5a\x2a\x35\x7c\x1c\x6a\xb0\xb0\xb7\x8c\x18\xd7\x49\x83\x0f\x7e\xde\xc7\x88\xe3\xb0\xa7\xf4\x0b\xb0\x18\x95\x49\x3a\x42\x05\x06\xb8\xf3\x7a\x6e\x23\xc9\x98\x19\xe0\x02\x89\x42\x4c\x08\x2e\xbe\x09\xc4\x5b\x23\x78\xaa\x18\xc9\xe3\xbe\x98\x10\xb3\x53\x55\xb5\x49\x46\xac\x0a\x04\xa3\x47\x04\xd6\xb7\x47\x67\x59\xf1\x9d\x2c\x2c\x9f\x19\x77\x61\x6f\xe4\x8e\xca\xb9\xfb\x4f\x84\xfe\x60\xbf\xf0\xf0\x7c\xe2\xed\xee\x88\x44\xc6\xab\xef\x03\xb8\x0b\xab\x57\xf6\x26\x06\x8d\xc8\xc0\x45\xa3\x61\xd4\x88\xa0\xe4\xe0\x8f\x7a\x78\xfc\x0f\xff\x97\x7f\xf4\x6f\xff\xe6\xff\xde\xf3\xfb\x7f\xf2\xc7\xfe\x03\x7f\x22\x8d\xbf\xff\x0b\xff\xd2\xff\xeb\x8f\xfe\xe5\xdf\xf7\x7f\xf9\x35\x3f\xf3\x5f\xfe\x6f\xfd\xd8\x1f\xf8\x3f\xfc\x8d\xdf\xf5\xbf\xfa\x42\xd2\x52\xa4\x27\x77\x19\x95\xdc\x11\xc2\xc4\x55\xe2\xdd\xbc\x56\xfd\xc4\x46\xd0\x1a\x6b\x55\xff\xb2\xfe\xa4\x09\xaa\x78\xde\x5b\xdd\x17\x68\x51\x48\xfa\x81\xeb\x82\x4e\xd6\xcb\x46\x67\x90\x1f\xa9\x24\x17\x0a\xea\xb5\x18\x3d\x8c\x9e\x20\xf5\x18\xaa\x3f\xdb\x00\x90\xad\xfd\x82\xd4\xb7\x7d\x79\xb5\xa0\xdd\x38\x3d\x07\x8c\xd9\x06\x4a\x8e\x2f\x55\x3a\xd7\x30\x13\xdd\xc5\xce\xeb\xca\xc6\xd6\x78\x5f\x7c\xa8\xfe\x22\x2b\x86\xc2\xd7\x8c\x12\x5e\xfb\xb2\x7a\x97\x41\xeb\x45\xe6\x7d\xe9\x65\x3f\x4f\x0e\xca\x62\xe5\xee\x0a\xe3\x93\xe7\x93\x9a\x86\x7d\x9b\xf0\x05\x5d\x7f\x6a\x8f\xfb\xaa\x92\x72\xc7\xc1\x60\xa3\xad\xfd\xbc\x31\x8d\x65\xe8\xa4\x14\x96\x64\xc0\x19\x5b\xd6\x7d\x64\x66\x9b\xbe\x99\x7e\xa1\x86\xdf\x31\x70\x31\x1b\xd6\xa4\x30\xbd\x97\x3c\xc6\x8e\x09\x4c\xf7\x8c\x2c\x6c\x8c\xd3\x6f\xa5\x40\x49\x3d\x29\x14\xe5\x5a\x22\x3e\xd9\x89\xb5\x2b\x2a\x3f\xfa\xae\x32\x2a\xd8\x7b\x6c\xab\x90\xb1\xc7\xf2\x7a\xfa\xa2\xf6\xe5\xd3\x4a\x88\xbd\x50\x64\xbb\xf9\xbe\xe6\x1b\x87\x19\x7f\x4c\x30\x3e\x2b\x13\x26\x66\x9d\xdb\x41\x37\xda\x9a\xec\x88\xa0\xc1\x2d\xa7\x40\x56\xf2\x24\x92\xa3\x03\x47\x01\xcd\xcb\xbf\x00\x05\xcb\x60\x4e\x49\x78\x9d\xf4\xb6\xd2\xe4\xc3\xf0\x13\x00\xb3\xad\x5d\x36\x47\x30\x9a\x28\xb5\xd3\xd8\x47\x63\x4e\xc5\x4c\x97\xff\xe2\x8e\x2c\xd7\xc0\xbb\x05\x70\x2d\xf3\x8c\x5a\x55\xdc\xb0\xb4\x4e\x7f\x27\x99\xf2\xc0\x8b\xb9\x52\x3d\x3c\xd1\xca\x9e\x4c\x48\x54\xd6\x2f\xf0\x7e\xa7\x28\x5e\x17\xcf\x79\x15\x30\x23\xbf\x29\xbb\x37\x5b\x63\xb3\x6c\x2f\x7a\xb8\x7f\xce\x9b\xa9\x8a\x1d\xef\x89\x9e\xde\x6c\xfd\x44\x6f\x6c\x9a\xd1\x67\x51\x2f\xba\xe5\x73\x26\xc2\x5f\x54\x69\xd4\x64\x58\x86\x33\x10\x58\xc0\x31\x76\x88\x04\xd4\x12\x1c\x8b\x71\x7f\x92\x34\x40\x5f\x28\xe5\xee\x57\x5d\xa6\x24\x7f\xc0\xec\xe5\xd0\xbc\xb1\xd6\xe7\x4a\x92\xc6\xb6\x0f\x44\xef\xba\x2f\x2c\x70\x28\xb9\xc9\x27\x8c\xb0\xf1\x14\xe1\x35\xed\x9e\x55\xf7\x64\x27\xb3\x12\x80\xa5\x65\x10\x0a\xa5\x0f\x97\xcb\x64\xde\x77\x13\xbb\x20\xe6\xda\x00\x9b\xff\x62\x80\xb9\x51\x52\x77\xfb\x05\xc0\xf7\x67\x2c\xfc\xa2\x0e\x08\x95\xab\xa0\xd0\x0a\xda\xb1\xa6\x1c\x1b\x13\x0a\xf4\x6d\x79\x58\xd6\xd3\x2f\xea\x45\x46\xe7\xf1\x36\xd7\x9b\x17\xc0\x07\xe3\x23\x57\xb0\x47\x8d\xab\xcc\x8b\x67\x79\xba\xca\xa6\xca\x81\xa2\x86\xd1\x48\xf9\x91\x8d\xec\x79\x9c\x87\xa8\xc1\x96\x4f\x4f\xd2\xcf\x30\x50\x45\xe5\x85\x83\x01\x12\xb1\x2a\x97\x25\xf9\x08\x23\x4d\xe1\x6f\x49\x80\x3f\xf0\x8b\x73\xe1\xd3\x4a\x06\x03\x98\xee\x73\xf0\x03\xbd\xb9\xb8\x74\x17\x76\x0a\x89\xe0\x2d\x9e\xfd\xe2\xb0\xbd\x04\xd2\xc1\xc7\xdb\xda\xf9\x27\x72\x40\xba\xcd\xd0\x38\x41\x91\x1a\x79\xc5\xba\x41\xd6\x63\x26\x6b\x7d\x5a\x87\x61\x96\xe7\x98\xc7\x85\xd7\x97\x72\xc0\x7a\x7c\x4c\xec\x8b\x01\xa6\xbe\xd9\x82\x67\x8a\x68\x64\xb6\xad\xae\xcb\xad\x77\xce\x5a\x42\xb2\xe3\xad\x81\x97\xb9\xf8\xa8\xde\xd3\xd1\x0d\x5d\x80\x84\xfb\xe2\x65\xbf\xcf\xc8\xa6\xc7\x75\x1e\x65\xd1\x83\x40\x54\x4f\x55\x34\x86\xd0\x5e\x67\xc5\x43\xea\x19\x66\x00\x44\x8d\xb1\x8f\x89\x15\x62\xfe\x05\x4c\xeb\x3a\x4a\xb6\xe6\xca\x53\x18\x89\x71\x7f\x99\x34\xb2\xfa\x82\xa2\xa2\xf9\x38\xc0\xc8\xc4\xda\xf5\x60\xc7\x3e\x42\xca\x82\xdd\x17\x70\x5c\x21\xa1\x08\xeb\x55\xbb\x0c\x48\x79\x54\xd1\x4a\x6a\x4e\xaf\xe3\x93\x4e\x08\x7c\x4d\xdc\x0e\x31\xb2\x6e\x20\xb9\x16\xee\xfd\xc4\x46\x16\x23\x6f\x01\x6e\x10\x0d\x47\x00\xe7\xb0\x6b\x16\x28\x51\x1e\x29\x36\x1a\x5b\x87\x44\xd4\x4b\x30\xe9\x81\x83\xf7\xc1\x4e\xe5\x5f\xdc\x54\x5e\xfc\x54\x5d\x23\xeb\x5b\xc4\x6d\x31\x67\xd8\x7a\x24\x26\x19\x6c\xaf\xf7\xd2\xb8\xcd\xd9\x3a\x45\x38\x00\xf0\x48\x01\xcc\x27\xf2\x9e\xe6\x02\x6e\x3a\x93\x93\x0c\xe2\xd5\x10\x3c\x93\xb5\xd5\xb8\x6b\x1a\xc5\x4f\xa1\xc8\xcb\x16\x27\x7b\x34\x35\x05\x52\x36\x33\xff\x62\xa1\x52\x6e\x07\xc8\x68\x97\x1c\x32\xf4\xb1\x48\xd0\xc6\xbb\x71\xe7\x75\x7c\x33\x3e\x68\x84\x7d\x3b\x4c\x21\x73\x82\x3a\xf4\x5e\x79\x3f\x31\xbf\xee\x6a\xf2\xc4\x9d\xad\xa1\x91\xa7\x6a\xeb\xee\x16\xa8\x61\x04\xcc\xf2\xcc\xf1\xb7\xf2\xdb\x80\x86\x6c\x69\x07\xf5\x30\x98\x7e\xd1\x5f\x04\xbd\x0b\x1b\x6a\x94\x0c\xa1\xa4\xad\x01\x0c\x95\xc7\xcc\xa2\xa8\x5f\x8e\x4a\xa9\x34\x32\x82\x0d\xdc\x79\xd2\x1e\x39\x10\xfc\x0b\xa1\x3f\xe0\xf1\xa5\x5e\x5a\x5f\x53\x36\xe6\xf5\x09\x1b\xdd\xab\x89\xb0\x2a\x7d\x46\xa6\x3e\x65\x59\x60\xf3\x0d\x9d\x46\xc4\xf3\xc6\x36\x3e\xf8\x22\x91\x43\x53\xec\x18\x13\xcd\xf5\xb6\x95\x79\xeb\x4e\x8f\xa2\xe3\xd4\x2e\xcd\x70\x2c\x2b\x61\xd0\x65\xb6\x9e\x79\xc7\x5a\xbb\xff\xe2\x5c\xd4\xd1\x93\x43\x8e\x64\x62\x17\xa0\x0b\x3e\xbd\xe1\x0d\xc6\x40\x11\x36\xf6\xf2\xd4\x63\xc2\xd7\xdc\x19\x08\xac\xb5\x4a\x87\x6f\xfe\x11\xc0\xe3\xc7\x7f\xd9\xdf\xff\x03\x3f\xfe\x97\xff\x8a\xfb\x5d\xfe\x7f\xfe\xf7\xfe\xce\x6f\xf9\xa9\xff\xec\xbf\xfa\xa7\xfe\xa3\x3f\xf1\x9b\xfe\xd4\x6f\xff\x8f\xfd\x3f\x7e\xec\xdf\xff\x7f\xfb\x0f\xff\xcc\xfe\xf1\x0f\x18\x1e\x9d\xda\x8d\xd8\x4a\xec\x1c\xe6\x11\x51\x91\xb0\x8a\x8b\x9a\xb1\xf6\x42\x16\x85\xda\xab\x24\xc4\x0e\x86\xb6\xf1\x6f\xd3\xf6\xf6\x51\xe3\x3e\x65\x5d\x20\xe5\x9a\x2e\xf9\x86\xa0\xd8\x8a\xe5\xdb\x59\x53\x33\xdd\x99\xb9\x67\xd6\x92\x4c\x45\x2a\x5f\x92\x36\x51\x8a\x5a\x9d\x99\x7b\xde\xe7\xbe\xe7\xe5\x9e\x77\xc3\x35\xb4\x22\xdb\x56\x28\x6d\xad\x34\xca\xc4\xa4\x68\x49\x4a\xcd\x4a\x22\x29\x23\x25\xc5\xa0\x42\x41\x24\x96\x95\x44\x79\x49\x16\xd0\x93\xe0\x9e\x1f\xbf\xd3\xe9\x7b\x0e\x7b\x0e\xe7\xec\xfe\xee\x7f\x9f\xe7\x7a\xce\x99\x67\xee\x99\x6b\xae\xeb\x73\x7d\xae\xcf\x55\x7d\x36\x98\xde\x51\x13\x9b\xc9\xa0\x08\xba\xd9\xfc\x4c\x34\x6a\x4e\x6c\x09\x26\x1d\x88\x87\xd5\xe0\x5c\x69\x9e\xfd\xf2\xfd\x14\xfc\x08\x01\x01\x0b\x56\xbe\x43\x5d\xbf\x18\x06\x54\x32\x8c\x70\x72\x76\x66\xb8\x9f\x52\x1c\xa3\x1c\xc0\x81\xb8\xf0\xdc\x1b\x49\x24\x6f\x87\x8c\xa9\xcb\x44\x83\xc5\xfe\x8e\x6e\x35\x29\xbd\x9d\xc0\x27\x19\x9a\xec\xc2\x96\xcb\xa1\x72\xf2\x10\xc3\x8a\x71\x9d\xb9\x69\x4e\xb3\x3e\x81\xa2\xcb\xf4\x0d\xea\x9a\xef\x41\x11\x3b\x30\x28\x81\xd5\x03\xb9\xca\xd8\x21\x4a\x89\x2a\x7a\x12\x0a\x21\x29\x07\x80\xe2\x72\xd5\xc7\x91\xce\x68\xf5\x59\x38\xef\xe5\x0e\x8d\xff\x2d\xb6\x0e\x40\x1f\xc9\x68\x17\xce\xb2\xb4\x4a\x2b\xb6\xeb\x62\xe3\x6c\x97\x2f\x55\x4c\x47\x0c\xad\xd0\x35\xc2\xcc\xb2\xfe\x4a\x77\x5c\x6d\x50\x86\x8c\x97\xb3\xea\x62\xce\xc5\x76\x89\x20\x6a\x28\x94\xc3\x96\x34\x20\x51\x5c\x25\x16\x09\x91\x92\x68\xa9\x13\x72\xbd\xcc\x1d\xe7\x02\xec\x11\x0e\x1d\x06\x3a\x0b\x1e\x2d\x09\x4f\xa4\xef\x59\xa0\xd6\x72\x26\x16\x6f\xd9\xd7\xc3\x1c\x0d\x77\x21\x4e\xe3\x09\xde\xd7\x0d\x15\x18\xca\xa1\x15\x84\x27\x3c\xf6\x1d\xe0\xc5\x47\xd9\xc8\x46\xb1\x2e\x72\x1f\xb8\xa2\x38\x0f\x3e\x68\xed\xf8\x2a\x41\x76\x73\x1a\x05\xd2\x2d\xe3\x8a\x21\x20\x18\x49\x93\x0e\xe3\x84\x56\x28\x6e\xb0\x90\xa6\x66\x13\x6d\x34\xad\x00\x5e\x0a\x34\x58\x24\x1a\xd3\x17\x1b\x79\x33\x77\xd0\xb2\x8f\x40\x98\x3b\xa1\x3d\x64\xef\x6b\x4f\xc8\x38\xac\x2b\xbd\xcc\x88\xad\x1a\xec\xa5\xe1\x0b\x5f\x56\x2e\x4d\x36\xa8\xce\xb1\xf0\xba\x43\xe4\x98\x80\xd3\xe8\xe3\x30\x0f\xbd\xf3\xed\xe2\x5e\x97\xf3\x62\x58\x75\x82\x6a\x2b\x32\x40\xd5\x78\x80\x26\xa2\x8b\x25\x18\xf0\x2e\xac\xb9\xe3\x11\x06\x68\x3b\x8a\xbb\xa2\xbd\xae\x2e\xaf\xbd\x0f\x7e\xad\xd0\xce\xc2\x6d\x71\xc6\x0a\x27\xc0\xae\xcd\xee\x0c\x19\x22\x14\xe9\xe2\x9e\xef\x18\x57\x8c\x9b\xcd\x64\xd1\xb8\xe8\x45\x5c\x4a\x27\x75\xda\xe1\x6d\x0f\x75\x2d\x86\xcc\xce\xe0\x46\x66\xd4\xe9\xa1\xb8\x49\x46\xcf\xaf\x74\x47\x40\xc2\x88\x61\x94\xef\x0c\xa3\x1c\x0e\x3d\x67\x25\xe0\xe2\x0b\xb0\xea\x55\xcf\x60\xe3\xdb\x8e\xcf\x6d\xc5\x4c\x01\x46\x6a\x9f\xfa\x5a\xb7\x70\xf4\x16\x60\x3b\x6b\xf9\x28\x2a\x22\x8c\x9d\x9d\x82\xa5\xb9\x5d\x47\x94\x41\x87\xa2\x12\x36\xae\x5a\x2a\xc0\x69\x2e\x46\x97\x09\xf4\x8e\x55\xd0\x16\xba\xf2\xbe\x40\x5b\xb5\x0d\xb2\x06\x70\xed\xab\x5e\xc5\xed\x60\x6a\x68\x1b\x94\x29\x0a\x4d\xd7\xda\x3d\x63\xdc\xa4\x02\xd7\x1d\xa3\x58\x2f\x62\xc0\x55\x27\x48\x18\x5e\xd9\xbf\x6f\x7c\x0e\xb1\x08\x35\xc7\x03\x29\x7d\xf3\xfe\x40\x9a\xa3\xcb\x73\x92\x69\xc9\x5b\xd2\xd7\x1d\xc0\x39\x00\x69\x8c\x1c\xc1\x70\x87\xaf\x74\xc3\x36\x4f\xca\x7b\x03\xa3\xf4\x84\x40\x97\xa8\x68\xb8\x19\xb3\x71\xcf\xbc\xde\xb1\xbc\xfc\x1d\xc5\xa5\x9a\xce\x85\xe2\xd5\xa7\x2a\x99\x37\xd4\x80\x77\x43\xab\x79\xf2\xcd\x97\x70\xca\x21\x14\x67\x69\xe9\xda\x53\x8e\x25\x63\xdd\x6e\x51\xdb\x21\xd7\x09\x00\x8a\x45\xaf\xa5\xf3\xbc\x14\x95\xa8\xd8\x04\xab\x3b\x37\x20\x3a\x2b\xd0\xe2\x8c\x13\x9b\x54\x27\xeb\x7a\xa8\xf7\xb4\x2e\x30\x3e\x65\xed\x44\xb9\x41\x02\x4d\xab\xfb\x23\x25\x48\xf6\x3d\x73\x22\x2e\x08\xb3\x19\x8b\x6c\xbc\xac\x93\xf0\xa0\xa7\x4d\xd3\xdf\x01\x35\xa4\x0b\xca\x88\x1d\x98\x31\x5f\x4a\xec\xda\x67\x65\x83\xb7\x6a\xd1\xd8\x56\xb5\x0a\x5d\x88\x56\x29\xca\xd8\xb0\x2d\xc1\x63\x65\xef\xe0\x13\xa0\x1c\xc2\x42\x27\x19\xb4\xb7\x8c\x4a\xad\x78\x93\xf9\x32\x30\x5d\xc1\x15\x96\x37\x8c\x60\xc6\xc8\x3a\x03\x59\x53\xfe\x9a\x03\xdc\xf1\x8e\x38\xa9\xb7\xe5\xce\x94\xb6\x7a\x88\x2d\x76\xc7\x03\x47\xf3\x64\xba\xb3\x3a\x7a\xe4\xb5\x7a\x66\xe3\xa5\xba\xe8\x21\x5b\xd9\xe5\xba\x43\x61\x86\xc5\xac\x11\x1e\x55\xfb\xb9\xcb\x2a\x76\xb8\x0a\xd5\x99\xe5\x3d\xb0\xb2\x9b\x94\xf7\x6c\xc1\xa5\x51\xdf\x51\x08\x02\x5e\x7b\xe0\x77\xf0\x15\x07\x8b\x08\xce\xa9\xa7\x66\xe6\x5c\x0a\x2c\xa7\x3a\x07\xc4\x49\xbb\x63\x68\xf5\x7a\xdf\x94\xed\x72\x36\x78\x48\xbd\xe1\x32\x2f\x7f\x07\x04\xd5\xa0\xde\xa9\x56\xc4\x2d\x54\x93\xb9\x14\x83\x0b\xc1\x1d\x7b\xb7\x9d\x62\x24\xbe\x10\xa6\xc9\xb3\xb0\xb8\x99\x18\x4f\x7b\x76\x7a\x47\x83\x26\x64\xab\x72\x79\x96\x63\x03\x83\x2a\x22\x76\x92\x78\xb9\xb4\xd3\xd4\xed\x36\xd6\xc3\x6b\x85\x8f\xb6\x8b\xe0\xd9\x96\xc5\x36\xf9\x1d\xa7\x93\x0d\xa3\x8a\x53\x01\xeb\xd0\x23\x16\xbd\xf4\xcb\xe9\x7a\x4c\x62\x45\x6c\xf2\x02\x96\x5d\xd1\x31\xa9\x4b\x30\x68\x43\xae\xf9\x33\xdf\x11\xfd\x12\xa2\x12\xa5\xfe\x28\x5d\x1b\x7f\xb2\x87\x1e\x54\xb6\xba\xd8\xfa\xa8\xd5\xd6\xb5\xa1\x90\xcf\xcb\x71\xcc\xb8\x07\x0a\x8f\xd4\xef\x90\xe0\xa6\x72\x9e\xd3\xb2\x13\x5a\x7d\x69\xe3\xfa\x8a\x2e\xe3\xdd\x73\x77\x35\x7d\x0e\xd6\x37\xa4\x00\xbe\x62\x9d\xdb\xa0\xa1\x1f\x49\x0a\x07\xdf\x0f\xf0\x08\x9f\x5a\xe3\x37\xff\xdc\xdb\x3f\xe1\xef\x7e\xe6\xb3\x3f\xf5\x35\xbf\xf0\x75\xbf\xfb\x43\xbf\xfc\x0b\x9f\xac\xff\xaf\xbf\xf6\xed\x2f\xfc\xea\xef\xff\x43\x8f\x39\xf5\x2f\xdd\xc0\xf0\x58\xa6\xcd\xd2\xc0\x7e\x4e\xb9\x26\x22\xd3\xa1\x4a\xe4\x69\x53\x34\x5d\x03\x23\xd0\x39\x85\x11\xda\xc1\x15\x74\x9b\x56\xcb\xc1\xef\xa0\x16\xfa\x40\x27\x95\x79\x4f\x21\x0c\xd5\xba\xd5\x14\xc2\x0d\x3a\xca\x2c\x8e\x14\x9a\x25\xbc\x83\xb6\x34\x50\x41\x8f\x78\xe3\x16\xd9\x3b\x48\x7d\xf9\x04\x8a\xb5\xa6\x42\xa8\xde\x63\x74\x69\x10\xb1\x39\xe0\xa2\x41\x75\x69\xcd\x55\xc1\x15\xdd\xa9\xb8\xdb\x49\x3f\x0e\x67\xb7\x5b\x04\x5c\x05\xc1\xf1\xd0\xe7\x56\xce\x33\x07\x97\x0b\x51\xc6\xc6\x3a\xe7\x26\x23\x0c\x52\x35\x91\xfd\x65\xb1\xce\x2e\xa6\x96\x99\x8f\x3b\xb8\xa3\x1a\x35\xa4\x1e\x13\x76\x89\xab\xec\x0d\x98\x2b\x79\xd2\x33\x9e\xfb\x16\x37\x09\xe5\xe5\x64\x3f\x8d\xa0\x97\x65\x42\xc7\x4b\x63\x26\xcc\x1d\x09\x0c\xec\x28\x6d\xb1\xd1\x45\xc8\x51\x7d\xef\x43\x8f\xa5\x43\x04\x97\x02\x57\xe2\x08\x4e\x4e\x85\x8b\x51\x41\xa3\x01\x0b\xcc\xb2\x7b\x34\xfe\xd9\xda\x2d\x9e\x28\xd6\x61\x3d\xd5\x66\xa5\xed\xc2\x08\xd9\x1d\x34\xee\xb3\x6e\xd8\x54\x47\x73\x4e\x9d\xd2\xd9\x66\x38\xcf\x5b\x46\x2b\xaa\x58\x93\x3d\x64\x9e\x07\x96\x3c\xf2\x6c\x90\x28\xbd\x86\xb5\x66\x57\x87\x0c\x69\x41\xe6\x2e\xa5\x8a\x6b\x13\x68\x9c\xfd\xf2\x77\xa4\x0e\xd5\xec\xae\xa5\x04\xed\x2c\xdd\x2f\x0b\xd8\xb0\x92\x1b\xd7\x79\x9f\xcb\xaf\x68\xf6\x7d\xeb\x49\x20\x62\x81\x09\x2a\x9e\x41\xa4\x3b\x42\x44\x6d\x36\x00\x08\xdf\x7a\x4b\x7e\x09\x10\xab\x94\x44\x98\x1a\x3b\xee\x31\x8c\xe1\xaf\x36\x8a\x53\x52\xed\x2a\x57\xed\x00\xc5\xfc\x8e\x04\x66\x24\xde\xed\x20\x0a\x85\xda\x77\x98\x40\xce\x89\x30\xad\x27\x39\xdb\x04\x83\x08\xd6\x0b\x4f\xbb\x84\x21\x75\xba\x9d\x45\x9e\xb7\xe8\x1f\xd5\xba\xa9\x41\xa7\x83\x8d\x0f\xd2\xa7\x35\xf1\x5c\x53\x69\xb7\xb0\x60\x1c\x9f\x11\xa3\xb6\xb9\x19\x4f\x24\xed\x40\x2a\xcf\x63\xbf\xe3\xa6\xa2\x4d\x6a\x2a\xc2\x0e\x41\x39\xf6\xd5\xcc\x70\xec\x38\xae\xc2\x34\x08\x16\x79\x86\xb4\x9f\x8e\x0e\x5c\x1c\x9a\xbb\x82\xd3\xe0\x72\xc7\x5e\xe4\x23\x2b\xac\xb4\xd3\x9b\x6f\x1e\x9f\x06\x13\x1f\x8c\xd5\xe5\xbc\x90\x88\xab\xe1\xe2\x94\x43\xe2\xec\xd6\x0a\x33\xeb\x6e\x19\xbb\x83\x96\xbd\x35\x74\xd8\x23\x92\xc8\x69\x3f\x84\xe0\x5b\xf5\xb0\xcb\xed\xda\x3b\x20\x20\x1a\x31\x68\xd1\xb4\x10\x3f\x29\x9d\xce\x1a\x3c\xef\xa0\x22\xb3\x4d\xd5\x4c\x08\xe7\x54\xee\x6d\xe5\xe6\x77\x0e\x69\x41\x05\xbb\x23\x10\x61\xce\xe2\x80\x97\x29\xd5\x66\xc5\xc5\x7a\x70\x54\xcc\x3b\xee\x88\xdc\x45\xaa\x18\x12\xee\x90\x19\x7b\x73\xd3\x51\x40\xc4\x91\x59\xb6\x86\x59\x05\x46\x3f\xfc\xa4\x8d\xed\x47\x28\x4c\x36\x9b\xee\xd0\x76\xa1\xd2\x7b\xea\x9b\xb4\x54\x05\x55\x65\xa6\xc1\x33\xc5\x55\x49\x29\x2b\x3c\x36\x61\x04\x8f\x28\xc3\x5d\xf5\xb8\x52\x7b\x9f\xdc\xfc\x1d\xb4\x6c\x27\xe2\xf2\xd7\xd0\x84\x8a\x99\xb4\x11\x35\xf0\xad\x54\xbb\x5b\xed\xdd\x58\x09\x71\xc2\x89\x84\x60\x72\xda\x4e\xbd\xc8\x95\xec\x1d\x50\xc3\xc0\x60\xc2\xa5\x55\x74\x68\xe2\x42\xac\xdc\x4c\x2e\xc9\xd8\x19\xcd\xb1\x7b\xd2\xaf\x4e\x08\xc1\x5b\xcb\xfc\xa8\x87\x70\x63\x37\x77\xc8\xff\xf9\x5d\x14\xe7\x6d\x83\x0e\x9c\x0c\xb9\xbd\x2e\x7f\xb8\x3d\x69\x00\x42\x51\xd4\x00\x55\xf7\x51\xe4\x15\xc0\x45\x32\x3a\x89\xf2\x77\x08\x81\xd3\x11\x8a\x36\xd6\xdb\xb1\xaf\xd9\x13\xd6\xcb\xf1\xb1\x94\x41\x0d\xe7\x90\x37\xc5\xbc\xdb\x2e\x89\xcf\x70\xd6\x70\x8d\xa8\xa4\x5c\x77\xa8\x24\xf4\x5d\x73\x1f\x0c\x52\xb6\x81\x2d\x52\x72\x39\x99\x5c\x31\xa2\x77\x95\x82\xd4\x55\x8d\x01\xc8\x28\x6a\x5c\x66\xa1\xc4\x05\xbd\x63\x08\x2a\x75\x1b\x58\x62\x11\xe9\x58\x58\x2c\x95\x7a\xec\x5c\x20\xe1\x1d\xc8\xed\xa4\xce\x7b\xa2\x4e\x37\x6a\xaf\xf9\x62\xcd\x1b\x7d\xe8\x75\x47\x13\xb3\x30\xd2\xc6\x83\xae\x94\x31\x31\xd1\x9c\xbe\x78\xb3\x0f\x68\x0b\x35\x87\xe5\x00\x53\x40\xd5\x56\x9b\xbd\x34\x76\xee\x7d\xb1\xf1\x1d\x29\x25\x84\x00\xe0\x93\x28\x56\xbb\xd8\x26\x00\x76\x72\x74\xed\x0d\x4b\x50\x7b\xeb\x6c\x55\xb0\xe9\xd3\x1c\x80\xf9\xda\x11\x53\x12\xd0\x3b\xd2\xeb\x8e\x94\xa3\xee\x42\x89\x68\x11\x60\x76\x64\x64\x3c\x55\xea\x67\xde\x99\x88\x47\x0e\x78\x53\xa2\x72\xa6\x65\x2b\xa0\x1f\xc7\x2d\xe9\x35\xa5\xb0\x98\x61\xd4\xe6\x0a\x86\x02\x18\xb3\xb7\xa3\xda\x49\xc3\x66\xc1\xae\x6a\x61\x22\x18\x9d\x8e\x7e\xd9\x88\x9b\x93\x1e\x45\x77\x07\xe7\x66\x8a\x32\xd0\xa5\xcf\x43\xbb\xd3\x62\x6a\x53\x1b\xc9\x41\xd0\x57\x85\x53\x2e\x1c\xaa\xcc\xfd\xd8\xf6\x42\x63\xdd\xbb\xbe\xae\xcb\xdc\x71\x3a\xf7\x91\x79\x42\xb6\x16\x64\xe4\x20\x0d\x90\x86\xf0\xc1\x32\xd5\xd7\x71\x91\xbe\x03\x23\x8a\xdd\xb8\x4b\x6c\x6e\x47\xdc\x87\xba\xf2\x1d\xaf\x59\x99\x3b\xc5\xa5\x22\x52\x27\x06\x82\x41\x8b\x09\x58\x00\xac\x45\xf2\x29\x22\x16\x9a\x87\x64\xbd\x54\x7b\x1e\x70\xf7\x24\x74\x7f\xc7\x2a\x12\x8b\x30\x8e\x13\xcb\x83\xe9\x44\xaf\xe8\x18\xcd\xdb\xb4\x66\xbf\xe4\xf6\x50\xc0\xb9\xa7\xcd\x80\x6d\x91\x35\x02\x34\x6c\xed\x62\xbe\x7f\x4b\xcb\xef\xff\xea\x7f\xa9\xbe\xec\x45\x5f\xf2\xfb\x7f\xd3\x33\xdd\x0f\x7e\xfa\x93\xf5\x33\x5e\xfe\x9a\x1f\x7e\xf3\x5f\xfa\xb0\x3f\x0e\x7f\xeb\x6b\x9f\xfa\x93\x7f\xfd\xb9\xdf\xf0\xac\xff\x7f\x80\x87\xfc\xa2\x47\xbd\xf9\xfd\xc9\xe1\x18\x9d\x25\x11\xb3\x8b\x21\xcd\xb8\xfc\x09\xd5\x21\xa2\x37\xcb\x8c\xc5\x59\x12\x92\x6b\x48\xa7\x49\x4a\xfa\xc9\x6a\x45\xc9\xbf\x0f\x6a\x78\xfe\x4f\xfe\x7f\xdd\xbc\xff\xd7\x55\xec\x4e\x6c\x5b\x8c\xb6\x9d\xb8\x2a\x21\x28\x76\xb0\x1b\x53\xf1\xc6\x74\x1f\x70\xf5\x3d\xa9\x71\x36\xb4\x65\x2e\x6a\x3a\xf4\x95\x1f\xee\xe8\x7c\x84\x57\xd1\x50\x3d\xb9\x88\x82\xd7\x40\xa8\x00\x07\xe7\x12\xb5\x3c\xad\x90\x34\x17\x62\xe1\xc5\x48\x3a\x48\x3e\x68\x59\xe0\x8c\x4d\xaf\x2c\x1f\xf9\x55\x30\x6e\x7c\xb0\x58\x78\xa7\xf7\x43\xd5\x7c\x58\x66\xdc\x95\x39\x00\x70\x65\x97\x97\x44\xdd\x66\xaa\x77\x86\x32\x3d\xd9\xdc\xa4\x7e\x78\x18\xd5\x23\xbc\x17\x3c\x5d\xd8\x36\x82\x66\xde\x59\xbb\x2e\x0b\x8e\xa5\x7b\x77\x40\x4c\x6e\xd1\xee\x52\xaf\x51\x9e\xee\x80\x28\x19\x31\x4b\xd2\xdc\xe1\x3b\xce\x85\xe5\x18\x6d\xf2\xc0\xf0\xca\xc3\x12\x52\xfc\x56\x70\x76\x96\x20\xe3\x09\xde\xa0\x47\x34\x91\x70\x32\xc1\x9d\x88\x1b\xc4\xa0\xa8\x1b\x56\x91\x3a\xc4\x57\x77\xa1\x68\xe1\x57\x8c\x07\xf7\x16\x60\x71\x50\x56\x47\xc8\xab\x60\x58\xe3\x54\x1c\x6e\x48\xad\xb8\x9f\xa5\xa5\x3d\xdd\xb0\x0a\x9d\xf6\x73\x33\x21\xd3\x2b\xd6\x59\x72\xbb\x5c\xee\x9b\xed\x12\xb9\x14\x7b\x9c\xdb\xd8\x95\xa6\xc2\x6b\x01\xce\x1c\x24\xbe\xca\xc3\xb4\xec\x47\xf8\x74\x36\xeb\xcf\x5d\xab\xda\x84\x25\x47\x33\x1b\x23\xb3\x9b\xb2\x78\x34\xd9\xe3\xc4\xf2\x35\xe4\xba\xa4\x5b\xb3\x46\x98\x40\x74\xc3\xb4\x1b\xf6\x42\xad\x19\x4f\x89\x5b\xcd\x6c\xdf\x8c\x4e\xfb\x48\x8e\x43\x09\xf9\x50\x30\x73\x49\x96\xd4\xa1\x0c\x19\x8c\xdc\x67\x88\x57\x44\x0f\xcf\x3b\x78\x84\x57\x81\xf7\xbc\x2f\x35\x6a\x24\xac\x29\xb2\xd0\x3a\x3a\x62\x3d\x4d\x70\xcc\xce\xf6\x86\x03\x42\x64\xee\xa8\x28\x07\xe4\xe5\xb4\xbf\x1e\x4e\x29\x1f\xe9\x2f\xc2\x1b\x9a\x03\x9c\xdb\xda\xa0\x48\x70\x53\x51\xd6\x6d\xc0\xcb\x4b\xc6\x8f\xe0\xc2\xda\x29\x12\xd2\x71\x9d\x5d\x91\x84\x38\x0a\x6e\xb8\x23\x2c\xc9\xad\x72\x82\xfd\xac\x3b\xde\xd5\xc0\xc9\xa1\x1d\x28\xbd\xf8\xd8\xcf\x61\xcd\x71\xad\x38\xab\x3c\xc0\x45\x63\x01\xea\xb0\xe4\x61\x21\xad\x47\x78\x15\x43\xa2\x83\xec\xa1\x4e\x5a\xcd\x72\x61\xb2\x93\x2d\x86\x3c\xa2\x4b\x5b\x9e\xc0\xe5\xd2\x20\x87\xa3\x76\x15\xef\x76\xea\x28\xce\x37\xbc\x66\x2c\xb4\xb8\x35\xca\xcb\x79\xd0\x13\x91\x23\x51\x7a\xe8\xb9\xb3\xaa\xfa\xa6\x20\xa2\xba\x22\x73\x98\x4b\xb3\x35\x41\x2f\xcb\xcc\xee\xe8\x1d\xfe\x42\x83\x35\x96\x11\x21\x71\x1d\x99\x9f\x79\xa1\xaa\x92\x5d\x47\xdd\xa2\xf6\xc7\x34\x04\x58\x00\x09\x91\xa3\x43\x18\x08\x5e\x0f\x0b\x3e\x3f\xc2\x7b\x81\xf8\xce\x39\xe8\x24\x05\xd0\x34\x85\x83\x43\x40\xaa\x88\x74\x8b\x33\x0f\x22\x4c\xb0\x42\x93\x3a\x7a\xf4\x99\x4d\xbf\xb7\xf5\x70\x4b\xcb\x23\xbc\x17\xb0\xa0\x13\xc0\x75\xc6\x83\x23\xb1\x9c\xbb\x50\xd9\xd8\xa6\x2a\x0b\x9a\xb4\xcb\x7a\xb0\x6d\xa5\x95\x71\x22\x71\xe8\x09\xaf\x5d\xd2\x79\xc3\x2a\x80\xc5\xb0\xd5\x24\xa5\x5f\xa6\x2c\x7c\x46\x4d\x0d\x47\x6e\x5d\x6d\xcc\x9d\x5b\xb0\xc1\x4d\x0a\x6a\xe1\xda\x93\x1e\xba\xe6\xfe\xb0\xba\xfe\x23\xfc\x45\x28\x48\x48\xa1\x53\x17\x83\x19\x6c\x7d\x18\xa7\x78\x11\xe6\xa8\xb3\xeb\xcb\x40\x9d\x52\xd7\x84\xd5\x75\x9e\x61\x50\x79\xf1\x02\x6e\x38\x9d\x2c\x3b\x79\xf5\x7a\x6d\xa7\x17\x72\x89\xb9\x2d\xb5\x37\xb1\xba\x8c\x7b\x85\x55\xce\x2b\x31\x26\x21\x90\x7d\xa5\x68\x8c\x36\x27\xf6\x77\xbc\xec\x7c\x6c\x2a\xa2\x0e\x86\x46\xd1\x24\x77\x45\x41\x88\x29\xfe\xac\x48\xef\xb3\x4f\x31\xf0\x49\x4e\x30\x90\x87\xb3\xb7\x26\x41\x2b\xec\x86\x55\x74\xd2\x3c\x70\xfb\x8a\xda\x53\x49\xa2\xdd\xfc\xb5\x0d\x33\x8a\x86\x4e\x8e\x2a\x98\x40\x96\xdb\xd8\x39\x9c\xc0\xd0\xc5\xfd\x7a\x78\xaa\xd3\x23\xbc\x8a\xb2\xb1\x79\x62\xec\x8f\x65\xb7\x8d\x45\xc4\x2b\x82\xf8\xf0\xf5\x92\x02\xc9\x49\x0d\x86\x08\x01\x2d\xa4\xec\x93\xd0\xae\x33\xbe\xe5\x8e\x58\x09\xdb\x8e\x8e\x51\x40\x93\x71\xf7\xc1\xd1\x3c\x9d\x25\x6d\xa8\xb9\xf0\x09\x4c\x74\x0e\x47\x79\x2e\x1c\x56\x86\xac\x12\x0f\x6f\xf8\x22\x4c\xa5\xe8\xf6\x9e\x28\x83\x11\x65\x34\xab\xee\x81\x25\xc5\x2e\x76\xa2\xdc\x8f\xa6\x00\x4d\x63\x60\xeb\xe5\x39\x3c\x1a\x56\x68\x7e\x47\xc4\x67\xd0\xa2\xb9\x85\x82\x25\xd8\xe7\xbe\x5d\xda\xca\x96\x2c\x8f\xa3\x21\x4c\x5c\x18\xdb\x54\x9a\x9b\x1e\xaf\x4b\x51\x7c\xc0\x96\x1e\xe6\xf4\x3e\xd2\xf9\x88\x10\x36\xc5\x70\x9a\x56\x96\xee\x1b\xc3\x53\x1e\x67\xb0\x12\x2e\x7e\xd6\xc6\x21\xeb\xe4\xcc\x38\xa0\x4c\x89\xc3\x9b\xdb\x38\xbd\xe1\x1d\xa1\x81\x37\xb0\xb9\x63\x13\x23\x0c\x1e\x7c\x0a\x6a\xc8\xeb\x6a\xca\xe2\x14\x37\xe3\x48\xc7\x97\x22\x48\xf8\xfd\x14\xc1\x1c\xbd\x9f\xf4\x86\xf8\x82\x92\x53\xad\xea\x0e\x20\xaf\x53\x07\x9f\x39\x49\x66\x6e\x4d\x51\x1f\x62\xd8\x91\xd2\x40\x8c\x54\xd2\x91\xf6\x58\xb2\xbf\x98\xdc\xd7\x0d\x37\x95\x5d\xc2\xc2\xac\x72\x59\x6c\x4d\x7b\x50\x19\xcd\x24\x64\x26\xb7\xe9\x30\x0e\xed\xb3\x1c\x9a\x79\x7c\xd0\xe8\xbd\x80\x5e\x5e\xc9\xac\x1b\xf6\x62\x6c\x10\x8c\xce\x50\x9a\x52\x13\x69\xbb\x88\x32\xed\x23\x82\x74\x6a\xaf\x61\x8f\x54\x29\x56\xa9\xdb\xf0\xdc\xc9\x48\x94\x2f\xf7\x5f\x63\xad\xff\x02\x78\x7c\xde\x2f\x7d\xe7\x4b\x3f\xf6\x7b\xf8\xb7\x3c\xf6\xad\xdf\xff\xe7\xe3\xbb\xff\xd6\xb7\x7e\xec\xbf\x09\xef\xf9\xe4\x97\x3d\xe7\x9b\x9f\xa9\xbe\xe5\x77\xfe\xf8\xff\xf6\x4d\x2f\x7e\xe4\x01\x0f\xc6\xc1\xd9\x5d\x0b\x6c\x83\xa4\x5f\xa5\x62\x47\x8d\xef\x4c\xb3\x2b\x61\x13\x43\x23\x67\x41\x6b\x35\x32\x18\x9d\xb0\xe9\x13\x2b\x70\x43\x40\xc2\x50\x8b\x51\x82\x15\xab\xe5\xdd\x70\x00\xf6\x0e\xb6\x8e\x00\x86\x90\x91\xb9\x76\xe9\x2c\x8f\x59\x5b\xb1\xae\x39\xda\x4a\x63\xba\x1b\xa0\x06\xca\x05\x9b\x61\xf3\x44\xb5\x22\xd4\xa2\x5e\xb0\xe5\x06\x3e\xb5\x41\xe1\xc4\x44\x73\x5c\x32\x56\x2d\x58\x15\x77\x5f\x71\xf5\xc7\x7e\xde\xb0\x0a\x1f\x12\x03\x01\x83\x61\x76\x32\xeb\x95\xb4\xf4\x42\xbb\x4d\x55\x3a\xc6\x49\xb6\xad\x2b\x94\xb6\xbe\x3c\x72\x02\x86\x33\xe9\xee\xef\x78\x84\x8b\x92\x93\xf5\x33\x5d\x28\x9b\x5c\xec\xa1\x9b\x33\x71\xbb\x90\xba\x54\x49\x0a\xf0\x92\x0c\x60\x44\xda\x3c\x24\x95\xba\xab\x23\xdf\xb1\x0a\x84\xbb\x8a\xa0\x1f\xc0\x4b\x51\x7d\x8e\xb8\x9e\x72\x10\x74\xec\xab\x6f\x1e\xea\x1a\x7b\xa6\xda\x56\x77\x10\xaf\x54\x06\x2d\x80\x3b\xd2\xa8\xed\x8c\x5b\xea\x44\x9b\xcd\x00\x87\x2e\x9c\x67\xab\xd6\x4c\x81\x3d\x6b\xf4\xc0\x54\xb5\x78\x4d\x06\x4f\x24\xb1\x95\x07\x01\x64\xdd\x91\xd8\x3a\xe3\x05\xc1\x73\xc3\xb4\x35\xa2\x90\x81\x92\x76\xb2\x07\x8c\x5d\xe8\xb3\xb7\x64\x58\xb0\x70\x3b\x4e\xb7\x51\xa3\x98\x6b\x1b\xb8\x23\xc9\x47\x10\x46\x73\x80\x61\x5a\x35\xa3\xd3\x76\x48\xad\x8c\x0a\xea\x6c\x6b\xdf\xcd\xe9\xc1\x61\x2f\xe0\xe7\x76\xba\xa0\x43\x39\x1b\xb1\x37\x84\x45\x8c\x30\xee\x3c\xcc\x0c\xa2\x22\xf2\xa1\x4b\xec\xd9\x6f\x2e\xea\x02\xf6\x38\x92\xda\xc6\x2c\xd7\xc6\xec\x55\x26\x06\xa1\x4d\xc1\x6c\xbf\x61\x2f\x2e\x28\x8e\x68\x3c\x8d\x59\x73\xed\xf3\x75\x12\x46\x65\xb0\xf6\xb2\x97\x79\xc8\x5b\xe1\xc1\xea\x56\xb3\xf0\xb5\x05\x75\x94\x52\xae\x3b\x40\x41\xe8\x49\x5d\xe2\xcc\xba\x1e\x80\xb7\x51\xcd\x11\xbd\xbf\x48\x17\xd6\x57\x10\x60\x2f\x91\xb6\xf3\xd4\x7d\x58\x84\xdc\x0e\xbc\x70\x77\xa4\x94\x36\x1e\x5a\xb2\x43\x19\x37\x2b\x3e\x45\x57\xa4\xd4\x0d\x92\x34\xd2\xae\xe8\xd6\xd9\x0a\xc7\xac\x3b\x80\x85\x7b\x84\x8e\x76\x96\xeb\x0e\xb0\x58\xb8\x29\x85\x9c\x93\xec\x17\x40\x89\x01\xdc\x9c\xcc\x03\x62\x45\xc3\xf2\x47\x99\x1c\x1c\x71\x0b\xcc\x59\x90\x54\x0f\x9a\xe9\x5b\x52\x07\xd7\xb2\x4e\xfb\x76\xa6\xca\xac\x3c\x4e\xbb\xb2\xd3\x1a\xf4\xc3\x2c\x71\x35\x28\x2a\x0b\x73\x34\x29\xd4\x2e\xf7\x33\xae\xdd\x6b\x77\x07\xd4\x60\x2e\x41\xfa\x71\x39\xb7\x47\xe9\x16\xbe\xe0\x3a\x3d\x98\x87\x09\xa3\x66\x76\x61\x36\x16\xf1\x24\x0e\x13\x4f\x9e\xba\x37\x61\xda\x1b\xc2\x65\xaa\xd1\xc1\x49\x66\x5e\x25\x9f\xcd\x96\xa4\xd9\xbd\xb5\x54\xe8\xec\x85\x15\xc7\xa8\xa2\x55\xe7\xe8\xdc\x8f\x83\xe5\xcd\x25\x5f\xae\x7c\xc3\x2a\x18\x03\x07\xf3\x71\x39\xa6\x98\xe2\x97\xae\xb1\x71\x09\x81\xee\xd9\x34\xad\xce\x95\x90\xa3\x73\x6c\x9b\xda\x15\x3f\x8e\x34\xae\x74\x03\xd4\x40\xb9\xbe\x00\x77\xee\x1a\xfb\x25\xbb\x14\xa1\xb2\xd0\x70\x83\x67\xed\xf6\x34\xd4\x46\xe7\xd3\x0c\xb6\xb4\x58\xfc\x91\x48\x27\x67\x71\x37\x9c\x0b\xd6\x9d\xc2\xc3\x52\x5d\x48\xdf\xd9\xf4\x2c\x6b\x6e\xa8\x92\xb6\xcb\x4b\xf9\x50\xe0\x21\x56\xf7\x57\xe2\x82\x29\x13\x30\xdc\xe9\x0d\xc5\x25\x16\xe1\xba\xf0\x98\x3c\xad\x3a\xa5\xd8\x77\xd5\x45\xcf\xe9\x04\x8d\x59\xdd\x3c\xaf\xf1\xe0\xd6\xa2\x92\x1d\x0d\x24\x66\x8c\xf6\x75\x47\x7a\x5d\xa0\xcf\xb3\xf7\x0d\xcf\x4a\x27\xe2\x31\x1e\x12\xe7\xcb\x8d\x35\x93\xed\x87\x3d\x4f\xb2\x86\x23\xa9\xa6\x62\x13\x2f\x3c\x56\x7e\x83\x07\x67\x7e\x55\x77\xd6\x72\xf1\x20\xb7\x3d\xba\xe4\x8a\x8b\x47\xef\xf3\x64\x40\x8e\x60\x87\xe1\x9e\x75\xa1\x70\xc6\x33\x19\x65\xca\xe2\x77\x14\x11\xb2\xac\x53\x75\x37\xe1\xb0\x11\xf6\x0d\x46\xa9\x8e\x64\xbb\x33\x5c\x90\xb2\xae\xc4\x4b\x04\x6d\xc6\x30\x1b\x3c\xd8\x96\xd1\x49\xef\x48\xf2\xf9\x76\x26\x27\x09\xa1\xb5\x1a\xa1\x87\x91\xe0\xc0\xa4\x27\x94\x8b\x7c\x28\xe5\x3e\xae\xe9\x16\xc6\x53\x34\x32\xe5\xb9\x93\xcc\xd8\x1d\xa7\xf3\x54\x6c\xe7\x83\xaf\xf3\xe4\x3c\x23\x77\x18\x4e\xdc\xa6\x13\xd9\x4c\x0f\xec\x3a\x2e\x01\x36\x12\x96\xac\xc2\xd7\x75\xa9\x66\x08\xbf\x23\xca\x19\x04\xf2\x13\x9e\x39\x39\xdf\xc2\x38\xc5\x75\x65\xb7\x9d\xa8\xc5\x59\xe6\x69\x99\x23\x1b\x4c\xbb\x2b\xdb\xb5\xc7\x9e\x37\xa0\xcd\xba\x21\x1f\x61\x15\xc9\x1a\xfb\x8a\x67\x9e\x47\x17\xd2\x6c\x9b\x03\x95\xf2\x08\x71\xda\x4e\x0c\x0d\x41\x39\xd8\xbc\x26\x44\xc3\xd9\x8d\x2c\xbe\xdf\xe1\x3b\xb7\x73\x06\x1f\xd9\x86\x88\x18\xa7\x9c\x76\x86\x2c\xa4\xbb\x0e\x6d\x12\x39\x57\x77\xbb\x18\x31\x75\x45\xa1\xe1\xc7\x55\x08\x28\xf9\x86\x32\x30\x1b\x05\x04\x21\x0a\x39\xe3\xda\xec\x7e\x4e\x8c\x9c\xb8\xb4\xaa\xb2\x8b\x11\x85\x37\xc7\x29\xec\xe8\xd9\xa6\x20\x4e\xb6\x0f\xbd\xdd\x52\x98\x97\x29\x20\xce\xe9\xd8\x81\x2f\x90\x6c\x17\x99\x93\xb7\xb3\x9f\xa7\x9e\x07\x6c\xd5\xd8\x26\x42\xc4\xf9\x50\x8e\x3a\x0d\xc6\xe8\xe0\x0e\xaf\x65\x21\x39\x7d\xd2\xb4\x8a\xe0\x57\x3d\x40\xd8\x2d\x3b\x42\xf0\x2c\x99\x01\x00\xda\x70\x34\x55\x55\x1e\xcb\xd6\x37\x11\x71\x29\xf9\xbf\x46\x39\xdf\xf2\x9b\x1f\x06\x3c\x1e\xf5\x4e\xf1\xbd\xe2\xef\xfd\xde\xf8\xbc\x6f\x7a\xeb\xeb\x9e\xf6\x5b\xde\xfc\xf1\x5f\xf2\x1d\x9f\xf5\x07\x1e\xfd\xea\xaf\xfe\x8a\xff\xf0\x1f\x7e\x86\x7c\xfc\x17\x7f\xdf\x1f\x7c\x18\xf0\xf8\xf6\x4f\x7c\xf5\x67\x3c\xed\xd3\x1e\xf5\xf0\x9f\xbc\xe1\x6b\x7e\xcb\xd3\xbf\xeb\x95\x9f\xf4\x9c\x37\x7e\xd9\x7b\xff\xda\x9b\xbe\xe4\xed\x9f\xf3\x1c\xfc\xa2\x4f\xfa\xc4\x17\xfc\xdb\xf3\xd9\x6f\x7c\xc7\x47\x7c\xd5\xc7\x7e\xd7\xd3\x1f\x30\xad\xff\xf6\x65\xaf\xfa\x73\x5f\xff\x59\x2f\xf9\xc8\xd7\x7f\xd8\x8b\x5f\xf2\xdb\x3f\xfc\x79\xbf\xfc\xcf\xde\xf8\x9b\x5e\xf7\x83\xef\x7c\xce\x87\xfc\x9d\x97\xbc\x31\x7f\xe2\x73\x9e\xf1\x80\xe9\xdb\x9e\xf8\x8d\x9f\xf3\x95\x6f\x7b\xd7\x4b\x1f\xfd\xcd\x2f\xfc\xd8\x9f\x7a\xd4\xa3\x1e\x93\xbe\xe2\xff\xf8\xe1\xbf\xff\x8d\x1f\xf7\x43\x4f\xf9\xba\x5f\x7f\xfe\xb3\x5f\xf7\x21\xdf\xf2\x80\xe9\x97\xfe\xa9\x0f\xfe\x03\x8f\x03\xdf\xfe\x3f\x7d\xa5\x7e\xd2\xab\x3f\xff\x37\xbd\xee\xc3\x5f\xf9\xa6\x9f\xfe\xb1\x0f\xf9\xd6\xbf\xf0\x63\x1d\xbd\xf2\x4f\xff\x86\xaf\x7f\x91\x7d\xc0\xf4\x45\x9f\xff\x6f\x5f\xf9\xe1\x6f\x7a\xcb\xe3\x5e\xfa\x51\xfc\x5f\xff\xb3\xbf\x02\xbf\xf6\x8b\x5e\xf4\xf1\x1f\xfd\xbb\xfe\xac\x7b\xfd\x4f\x95\x1f\xf8\x99\x17\xff\xf2\x17\x3c\xe1\x01\xd3\xe7\xbf\xe6\xd5\xcf\xff\x1f\x7e\xcf\x47\xb5\x77\xbe\xe8\xcd\x9f\xfc\x9f\xbe\xfd\xa5\xbf\xe5\xf7\x7e\xc3\xf8\xa7\xbf\xf2\xdb\x9e\xfc\xbd\x9f\xf8\xa2\x37\x7f\xf6\x1f\x7b\xfb\x13\x7e\xe4\x01\xd3\xcf\x7b\xcb\xdb\x9e\xf6\x23\x6f\x94\x9f\xfe\xa8\x57\x7d\xd6\xbf\xfb\xee\x3f\xff\xf3\xef\x7c\xe6\x17\x9b\x7f\xf9\x31\x6f\x68\x8f\xfb\xd0\xf2\x9d\xbf\xf1\x2b\xfe\x68\x7c\xcb\x03\xa6\x8c\xee\xcf\xfa\xbf\x1f\xf3\x85\xe9\x17\x5f\xfc\x69\xcf\xfa\x91\xfd\xf7\x3d\xf1\x69\x2f\xfd\xe8\xa7\x3e\xf5\x77\xdb\x7f\xf4\x0b\xcf\xfc\xf7\x4f\x7f\xe1\xeb\xdf\xfb\xe5\x0f\x98\xbe\xeb\x3d\x4f\xf9\x47\x4f\x79\xfa\xbf\x7a\xea\x6f\xf8\x86\xaf\xfd\xea\x6f\xfa\x98\xed\x0d\x7f\xe7\xef\x3e\x93\xfd\xce\x3f\xfc\xf9\x9f\xf7\xe3\xdf\xfb\x47\x9f\xf6\xfb\xdf\x31\xff\xe4\x03\xa6\x7f\xef\x53\x7e\xe2\x59\xfd\x4b\xbf\xf1\x85\xbf\xf8\xa3\xbf\xf2\xda\xf1\x45\xf1\x63\x7e\xfd\x39\xe8\x85\xf8\x9f\x3f\xe5\xed\x9f\xf5\x13\xf3\xab\xfb\x9b\xdf\xf0\xbb\x1e\x30\x7d\xcc\xbf\xfe\x07\x5f\xf3\xca\xcc\xff\xf6\x73\xbf\xe0\x3f\x3e\xf9\x6f\xfd\xc0\xdf\x80\xff\xe3\x47\xc0\x0f\xfa\xe8\xb7\xfd\xf9\xc7\x7f\xda\x63\xe4\x33\x5e\xf2\x57\x5e\xf7\x9f\x1e\x30\xfd\x36\xf2\x85\xff\xe6\x4f\xa5\x77\xbd\xf3\x3f\x3c\xfa\x55\x6f\xfc\xf7\x4f\x7a\xed\x47\x3e\xe1\xa5\xf8\xbd\x4f\xfa\x95\x4f\xd2\xaf\xff\xd9\x97\xfc\xc4\xcf\xbd\xe5\xb7\xfd\xd0\x03\xa6\xbf\xe3\xf5\x3f\xf4\xa3\x3f\xf8\xe2\x47\xff\x63\xfe\x96\xef\xe1\x2f\xfb\xa4\xcf\x2b\x6f\xfe\xde\xf4\xf2\xc7\xfc\xce\xbf\xf0\x87\xbf\xc2\x7d\xe9\x53\xbe\xf8\xc9\xcf\xfd\xda\x07\x4c\x7f\xc3\x37\x7d\xf0\x2f\x7c\xd9\x5b\xfe\xc4\x47\x7f\xc3\x9b\x7f\xf2\xf9\xff\x42\x7e\xeb\x4b\x3f\xe5\x2f\xbe\xf5\x4b\x5f\xfb\x18\xfb\xd8\x6f\xe4\x2f\xfa\xd4\xc7\xae\xcf\xf8\xcc\x07\x4c\xff\xf2\xdb\xff\xfb\x37\xbe\xf6\x07\x9e\xfd\xce\xff\xf8\x4b\x8f\x7e\xd5\x13\xff\xe2\x27\xfd\xca\xb7\xbd\xe1\x3b\x5e\xfe\xee\xcf\x78\xd1\x6b\x3f\xe5\x39\xbf\xef\x59\xef\x8e\xbf\xb8\x1e\x30\xfd\xee\x27\xbf\xf7\xa9\x6f\xff\xc8\xd7\xfc\x25\xf3\xac\x17\x7f\xc4\x57\xfe\xc5\x0f\x7f\xec\xd3\xfe\xe7\x6f\xfb\x3d\x2f\x7c\xd3\x8f\x3e\xe3\x1f\x3f\xfb\x67\x5f\xd5\xbf\xfe\x95\xbf\xfa\xe0\x27\x78\x6e\xff\x77\xef\x7c\xad\xfa\xa3\xdf\xf0\xce\x0f\x79\xcb\x67\x7d\xdf\xeb\x3e\xeb\x89\x2f\x7b\xf6\x2f\x7d\x07\x13\xe1\x3b\x1f\xf7\x6b\x2f\xfc\x4a\x3b\xe2\x83\xff\xd6\x8f\x3a\xf8\x84\xaf\xf9\xfc\xd7\x7c\xf6\x9f\xf9\x97\x4f\xf8\x6f\x9e\xf4\x27\x9e\xf8\xf8\x47\x7f\xd3\x97\x7c\xfc\xe3\x7e\xf6\xb9\x4f\x38\x5e\xf6\x91\xff\xe4\xd7\xfe\xc1\x83\x87\xf0\x6b\x3f\xe1\x83\x7f\xe1\x0f\x3c\xff\x4f\x3f\xef\x67\x3e\xf2\x3c\x1f\xfd\xbf\xff\xec\x4b\xbe\xf3\xdb\x3f\xe8\x2b\x7e\xda\xbd\xe2\x87\x3f\xf5\xe7\xcb\xe7\x7e\xd1\x5f\x78\xec\xfe\x80\xe9\xb7\x3c\xf1\xe3\x3e\xf7\x9f\x7c\xde\xab\xbf\xfe\x6b\xbe\xeb\x1d\x2f\xf8\x4c\xfd\x97\xfe\xd4\x9f\x7e\xf7\xeb\x9f\x4d\xeb\xcb\xbe\xe7\x90\xcf\xfe\x17\xff\xf1\x6d\xd7\x27\x3f\x60\xfa\xcb\x4f\x78\xd5\xab\x3e\xfd\x9f\x7e\xc6\x37\xff\x8d\xdf\xf7\x05\xef\x7c\x37\x78\x82\x7a\xd2\x0b\x7e\xa3\x7d\x75\xfd\xa1\xb7\x97\x67\x3f\xf9\xb1\xed\xcb\x3f\x93\x3f\x60\xfa\x92\xd7\x7f\xed\xbb\x1f\xff\xf2\x67\x7c\xe3\xff\xfa\x13\xcf\x7b\xcd\x6b\x7e\x99\xfe\xfc\x9f\x7c\xdc\x8f\xbf\xeb\x3d\x5f\xf0\xa1\xdb\xaf\x1f\xcf\x4f\x5f\xf8\x3d\xff\xec\xe5\x0f\x98\x6e\x6f\x78\xc5\x19\xde\xf9\xd3\x9f\xff\x6b\xaf\xc6\x5f\xf4\x94\x3f\xf2\xb4\x77\xb5\xbf\xfb\xc1\x2f\x79\xf7\xdf\xfe\xa9\x2f\xfc\x57\x7f\xf3\x8d\x5f\xf6\x8b\xbf\xe3\x93\xbe\xe7\x01\xd3\x17\xbc\xf6\x25\x5f\xf9\xf1\x9f\xf2\x1d\xcf\xfb\x88\xe3\xaf\xfc\xfb\x1f\xdf\x1e\xfd\xda\xe7\x8f\x17\x3f\xe9\x15\xbf\xfd\x8f\x7f\xe8\x4f\xfc\xf6\x4f\xf8\x99\x17\x3c\xf5\xe7\x7e\xe0\x01\xd3\xa7\x7c\xeb\xa3\x5e\xf5\xf8\xaf\x50\x4f\xf8\xa0\x4f\x7e\x9e\xfe\xfb\xef\xf8\xa8\xbf\xf3\xa9\xaf\xfc\xe2\x6f\xfb\xa7\x7f\xef\x73\x1e\xf7\xe2\xa7\xbf\xe1\x99\x9f\xfb\x76\xfa\xe0\xdd\xfa\xcb\xff\xe0\x1d\x3f\xf7\xd8\x97\xc2\x5f\x7d\xf7\x33\x7f\xee\xb1\xaf\xf8\xfb\xff\xf8\x65\x9f\xfd\x1b\x7f\xfa\xf1\xcf\x7a\xdd\x2f\xfc\x93\xef\xfb\x57\xdf\xf1\xcf\xbf\xea\x67\x9e\xf3\x91\x0f\x98\x7e\xd0\x5b\x5f\xf0\xf8\x4f\xf8\xcd\xef\xfc\xc3\x9f\xf3\xcb\xcf\x7b\xfb\x87\xff\x9b\x4f\x7f\xeb\xf7\xbf\x4b\xed\xe5\xb3\x5f\xf2\x69\x6f\xfc\x43\x9f\xfd\xde\x5f\x7d\xda\x4b\x7e\xfe\x01\xd3\xef\xf9\xab\xff\xdd\x2b\x9e\xfe\xc9\x3f\xf6\xa6\x77\xec\xdf\xfd\x61\xbf\xed\x29\x7f\xf5\x15\x3f\xfe\xae\x0f\xb3\xff\xf9\x47\xea\xa7\xfc\xb1\x4f\xf8\xba\x67\xfe\xe6\x9f\x7c\xde\x9f\x78\xc0\xf4\xad\x3f\xf8\x37\xff\xe4\xcf\xbe\xe0\x07\xde\xf3\xdd\xdf\xfb\xfa\x1f\x7a\xcf\xbf\xfb\xb5\x1f\xfc\xa8\x17\xfe\x91\x1f\xf9\x87\x3f\xfe\x97\x5f\xff\x7b\xbe\x1a\x7c\xe7\xf7\x7f\xf7\x7f\xfe\xb2\x07\x4c\xff\xfa\x7b\xd8\xdf\x7a\xfc\xcb\xff\xec\xdb\x7e\xf8\x4b\x3f\x6d\x7d\xe8\xf3\x5f\xf7\x83\xbf\xf7\xcd\x8f\xf9\xaa\x9f\xfa\x5f\x7e\xeb\x3b\x9e\xf4\x63\x6f\xcb\xcf\x60\x6f\x7a\xdb\x03\xa6\x5f\xff\xe2\x2f\xff\xdc\x8f\xfe\x43\x3f\xf6\xbc\x37\x7e\xe1\x37\x3d\xfd\xcf\xfd\x99\x4f\x81\xfd\xe3\x3e\xae\x1c\x6f\xff\x6f\xbf\xee\x6f\xbf\xe6\xa9\x2f\x7c\xe5\x13\x9f\xf4\x0f\x1f\x30\x7d\xf3\x4f\xff\xd4\xdf\x78\xcf\x63\x7e\xe9\x57\x7f\xf2\xdb\xcd\x77\x3d\xd7\x3c\xff\xb9\x6f\xfa\x2a\xf5\xde\x67\x7c\xfa\x1f\x7c\xf6\xff\xf9\xb4\x77\x7c\xcc\xf7\x3d\xfb\x59\x3f\xfa\x0d\xff\x05\x81\xfe\x40\xde\xf5\x06\xca\xdd\x8c\xa7\x3b\x47\xed\x3b\xde\x92\xd9\x43\x2b\x58\x70\x17\xb1\x4f\xf4\x38\xd9\x96\xa8\x21\xc9\xe0\x68\x86\xc1\x78\x10\xbb\x51\x0e\xef\x88\xf8\x30\x57\xbc\xca\xab\x93\x30\xf2\x5a\x27\x31\xb1\x79\x52\x92\x03\xa5\xb7\x33\xac\x29\x5c\x8f\xbb\x05\x7a\x9f\x69\x2f\xc7\xbe\x36\x7b\x07\xf6\xdb\x72\xac\x62\x07\x73\x4f\x4d\x9e\x6e\xbb\x2e\x04\x9a\x53\x0c\x6f\xd0\x28\x96\xd0\x79\x98\x52\x93\x3a\xb2\xa4\x63\xd9\x53\x6d\xdd\xd9\x1b\xf6\xa2\x70\x59\x6a\x3b\x83\x3f\x56\xaf\xc2\xe4\xcd\xfb\xbd\xaa\x7d\xd0\x91\x76\xad\x4a\x2f\x74\x4a\x53\xd7\x40\xd6\x27\xe2\x06\x35\xfe\x8e\x9a\xc0\x3c\x20\xe7\xf6\xb0\x03\xf1\x8a\xae\xe5\x96\xbc\xd0\xe0\x6d\xcd\xde\x2f\xa5\x51\x00\x9b\x64\x63\x8e\x68\xd0\x0e\xa6\xce\x7b\x81\x77\x50\x31\x67\x99\xb5\xf8\xba\x30\x55\xfb\x89\xf8\x41\xaf\x80\xd5\x7e\x0e\xc9\x22\xe9\x30\xe9\x38\x10\x6a\x1b\x44\x00\x89\x18\xf2\x4e\x55\xb9\x03\xbf\x68\x08\xec\xa6\x12\x26\xea\x38\x58\x00\xd1\xd4\x1c\xa2\x3a\xba\xc5\x76\x12\x20\xa6\xa4\xe1\x14\x43\x4d\xdc\x92\xf6\xc4\xcd\xcc\x6f\xa1\x62\x36\xe8\xfa\xa8\xd6\x5e\x19\xb0\x22\x95\x3b\xe4\x52\x64\x13\x48\x1d\x70\x8d\x66\x65\x13\xe1\x5a\x68\x6b\x95\x1e\x17\x80\x32\xf9\x5b\x70\x2d\x47\x81\x64\x1d\x79\x65\xb9\x37\x15\x90\xa3\x3b\x0c\x76\x0e\x2e\xc8\x50\xad\x59\xc2\x39\xa2\x73\xcc\xaa\x5d\x4a\x72\xa5\xbc\x6e\xc8\x96\x59\x11\x57\x3a\xc5\x46\x0a\x6c\x52\x18\x5d\x94\x19\x23\xb6\xdc\x44\xa6\xab\x5b\x3f\x79\x98\xad\x10\x49\x06\x23\x7b\x40\x57\x48\xd7\x1d\xa4\xa6\x53\x6e\x25\x36\xe2\x85\xf6\x9b\x6c\x9d\x73\x59\xd8\x11\x4b\xaa\xf5\xaa\xd5\x52\xa8\xb3\xaa\xa8\x6f\xa3\x08\x82\xc9\xb6\x6d\x60\xdd\x51\x06\x66\xec\x5a\x0d\x58\x45\xa5\x19\xb9\xed\x6b\x1d\x07\x41\x56\x1e\x66\xa3\xf0\xcc\x65\x24\x2f\xe7\x3a\x87\x3d\x4c\xf2\x2c\x0e\x5e\x6f\xa9\x8f\x34\x3b\x69\x20\x3c\xef\xa6\xae\x85\x48\xb8\x56\x89\x61\xd3\xfd\xe8\xc1\x1f\x79\x94\x92\x4d\x6b\x98\x46\x16\xd3\x99\x1a\x1b\x8b\xdf\x41\x27\xca\x0b\x20\x9d\x26\x14\x57\x5d\x9c\x77\xc7\xc1\xbe\x59\x1c\x4a\x5b\xbb\x77\xba\x24\x30\x47\x9c\x95\xf0\x7c\x68\x4e\xf7\x96\xf6\x29\xee\xc8\xd9\x19\x8f\xdb\xd4\x1b\xa5\x60\x6f\x55\xb9\x63\xd1\x91\x0d\xaa\xa0\xe1\xe2\x47\xe4\xd6\x00\x2c\xe6\x0e\x9a\xa5\x79\x16\x51\x3b\xb8\xe1\x1d\xa1\x5b\xf1\x49\x27\x33\x0f\xa1\x29\x77\x17\x13\xeb\xa4\xa0\x0c\xac\x8c\x34\x51\x1c\x62\xf3\x72\x47\xdb\xd8\x54\x89\x21\x02\x40\xcc\x7e\xc7\xe9\x44\x26\xf3\x3d\xe3\x6c\x71\xe9\xca\x3e\xe4\x19\x3a\xa6\x10\x54\x79\xc6\x95\xab\x72\x4e\xe5\xb0\x17\x58\xac\x3c\x2e\x52\xa0\xb6\xf3\x8e\xba\xd9\x05\xd9\x56\x0a\xca\x41\x6e\x8e\x1e\x6d\x54\x6f\xce\x50\x80\x85\xc1\x25\xdb\x80\x01\x08\xa8\x63\x73\x72\x3b\x58\x19\x94\xb9\xd3\xdd\x41\x4b\xcd\xed\xe8\x60\x95\x42\x03\xbb\x70\x8c\x45\x0a\xdb\xb5\x12\xb8\x50\x33\x6d\x18\x3d\xd8\xb9\x6d\x41\x6f\xcb\x55\x77\x80\x13\x8f\x74\x47\x7c\xa1\x55\x2d\x3b\x0c\x33\x9c\x76\x49\x48\x83\xad\xc6\x5c\x68\xdf\xcf\xe6\xdc\x96\x6d\xaa\xa0\xed\x39\xac\x7e\x0d\x8f\x2c\xeb\xb4\x98\x3b\x68\x23\x3d\xa4\x73\xe5\xe5\xac\xb1\xd9\xee\xd4\xf3\xae\x68\x3f\xb5\x77\xdc\xef\x3b\xdd\xd1\xec\x88\x68\xee\x60\x6a\x10\x82\x59\xc7\x79\xcb\xe9\x6c\xe3\xd4\x80\x9d\xb3\x94\x52\x58\x49\x80\x93\xcb\xae\xa3\x99\x60\xb7\x78\x11\x2e\xa1\xd9\x9c\x29\x1b\x84\x22\x59\x41\xdf\x57\x45\xbc\x61\x2f\x0e\x4b\x84\x2e\x72\x70\x51\x03\xe0\x16\x84\x76\x60\x25\xbb\x4b\x58\xfa\x8b\x26\x93\x2f\x2c\xb7\x9d\x9e\x45\xeb\x84\x50\xe3\x15\xde\x70\x47\x58\xd5\x58\x6b\xa7\x0b\xdf\xcb\x94\x4a\x25\x09\x20\xc2\x47\x02\x1d\x26\x3a\x38\xab\xad\xa4\x43\xed\x02\x88\xcd\xba\x0d\xbb\xd3\xd0\x3b\xaa\xba\xf9\x10\xa3\x2e\x71\x5d\x85\x40\x8e\x0e\x64\x81\x18\xd3\xc0\x63\xd3\x84\x1e\xee\xb2\x1a\xee\x99\x03\xdc\x01\xec\xa6\x29\xcd\x05\xbf\x83\x10\x4a\x20\xec\xe3\xda\x76\x8e\x77\x74\x86\x0e\xc9\xca\x34\x54\xd1\x24\x2d\x4a\x66\xa0\xa8\xb9\x02\x9c\x98\x68\xb2\xa1\x14\x34\x52\xee\x86\x73\x41\xa9\xea\x0a\x1e\x5e\x42\x1d\x0a\xba\x14\x18\x73\xdb\xf3\x9c\x01\x51\x27\x91\x3b\x51\xcb\xf5\x98\x3e\xef\x69\x69\x44\x6d\x62\x76\xdd\xf0\x9a\x51\xa9\x05\x4a\x17\x2e\xb4\x27\x53\x07\x55\x63\xd9\x05\x32\x67\x92\x9d\x3b\x6d\xab\x48\x9b\x49\x58\xba\xd6\xc6\x36\x46\xa7\xa2\xf6\x0e\x72\x2c\x2a\x33\xd0\x83\x87\x78\x5d\xb5\x1e\xd8\x17\xdc\xb7\x22\x59\x31\x27\x1b\xc8\x6e\xe3\x28\x58\x9d\x11\x04\x35\x2b\x84\x0d\x6a\x63\xc0\x1d\x77\xa4\x1e\xa3\x7a\x2f\x1a\x3f\x3d\xf1\x3e\xac\x73\x0b\x2c\x0c\x3a\x81\x5c\xb3\x6c\x0d\xbb\xc6\x23\x65\x1a\xe9\x32\x76\x8a\xcc\xa4\x77\xe4\x66\x4d\x5f\x48\x39\x48\x4a\x18\xdd\x0e\x3e\xda\xee\xe1\xb2\x13\x5e\xb0\x0d\x28\xe9\x48\x60\xcb\x6a\xdb\xce\xfd\x38\xc5\x01\x2f\x4b\xd9\x2d\x8c\x98\x2e\x89\xb0\x54\x8a\x55\xd5\x44\xf9\xda\x92\x3e\xf1\xea\x27\xaa\xd8\xc1\x99\x66\xc3\x9e\x30\x49\x6b\xa4\x78\x3b\x2e\x78\x55\xc6\xdf\x8f\x72\xf7\x81\x30\xe2\x1b\x00\x8f\xc1\x92\x17\xa5\xc9\x9d\x63\xb7\xac\x62\xab\x81\x4c\x63\xeb\x6c\x0c\xe6\x87\x53\xb5\x41\x7b\xee\x97\x4d\x4e\x27\x22\x39\x4e\x77\x94\x81\xe9\xd1\xf2\x05\x33\x61\x41\xc8\xad\xac\x62\xc9\xc9\xfa\xc4\x0c\x1d\xb3\xb1\xc8\x7a\xb6\xb3\xc6\xb5\xe4\xaa\x7e\x3f\x64\x44\x91\xdf\xe1\x6c\x59\x6c\x5a\xec\x30\x04\x7e\xf9\x14\x09\x86\xc6\xd0\x20\x49\xdb\x50\x06\x2b\x34\x98\xc5\x2e\xb3\xf6\xe1\x90\x01\x45\xdd\x8d\x5d\xf6\x0e\x37\x27\x50\xe3\x39\xe8\x86\x2e\x69\x69\x43\x9a\xb2\xa1\x50\x50\x65\x94\xb2\x65\xde\x5c\x83\x2d\xe2\x32\xd0\x0e\x8a\xde\xb0\xa2\xf2\x8e\x92\x38\xed\x18\xcf\x49\xc4\xb9\x7a\xf4\x3b\x50\x9e\x8c\x13\xae\x21\x8e\x4d\x5f\x9a\x9e\xcc\x45\x3f\x3a\xf0\x59\xe1\x36\x0b\x4b\x38\xee\xf3\x0e\x3a\xd1\xc5\xdd\x2e\x50\x74\xa4\xce\x88\x4f\x6b\x43\x29\xe8\x3a\xad\x5a\x30\x9c\x43\x04\x36\xa6\x1f\xa6\x52\xbb\x0d\x77\x6d\x74\x6c\xf1\x96\x2f\x72\x2a\x5a\x83\xdd\x55\xaa\xe6\xb8\x86\x5a\xe7\x34\x9b\x77\x48\x64\x99\x65\x4b\x6b\x30\xc9\x36\x73\x45\xc9\xc0\xd4\x12\x9c\x05\x27\x74\x47\xa7\x63\x36\x40\xad\x0a\x12\x88\xa2\xf1\x43\x36\xe0\x03\x89\xac\xa2\x3e\xae\xd8\xed\xcc\x36\x37\x38\xc6\xd8\xaf\xcd\x25\x56\x80\xb9\xee\x78\x78\xa0\x1a\x87\x96\xd1\x67\x8f\x41\x1a\x27\xc0\x9d\x0f\x59\x69\x26\x02\x2f\x0d\x2b\xac\xe8\xdc\xea\xde\x0d\x35\xf8\xca\x29\xc3\x68\x6e\x70\xb6\x94\xcc\xb5\x04\x74\xa9\xd8\x41\xbd\x74\x97\x5f\x7d\xcf\xb4\x0d\x7d\x78\x70\x6d\x84\xd2\x43\x54\x74\x82\x29\x1b\x6b\xc1\xa8\xae\xef\x00\x05\x29\x1b\x16\x6e\x75\xe5\x85\x91\x30\xbd\xda\x4c\x2e\x5f\xb6\x66\xdb\x81\x37\xd9\x36\xa3\x74\x3d\xe5\x94\x02\x54\xcc\xf8\xdc\x2f\x77\x07\xb5\x8a\x2a\xe3\x06\x3a\xd2\x38\x56\x6c\x68\xa6\xb4\x56\xc4\xb6\x9f\x8d\xcd\x63\x99\xb0\xd5\xc6\x8e\xdd\x57\x0a\x4d\xd3\xed\xea\x4c\x53\x7a\x07\x34\x49\xb3\x68\x3e\x6b\x39\xb6\xd1\xf1\x66\x88\x89\xa7\x6b\x75\x88\x8c\xa8\x61\x06\xac\x9e\x2d\x71\x9c\xd8\x0a\x50\x3f\xf4\xe6\xca\x75\x47\x32\x77\xec\x38\x46\x7e\x6c\x09\x59\xe0\x23\x1a\x47\xcd\x56\x59\x15\x14\x5b\x73\x06\x05\xe6\x41\xf6\xe4\x8a\x00\x6e\xc9\x93\x20\xba\xec\x1d\x80\xc7\x3c\x06\x66\x78\x4c\x5c\x65\x40\x6d\x81\x92\xe3\x58\x81\x9c\x50\x5e\x6a\x9c\x7a\x90\xa1\xed\xac\xb0\x2d\x0b\xd4\x46\x45\x48\xec\x06\xf2\x0a\x5b\x27\x88\xeb\xbc\xdc\x95\xde\x87\x46\x11\x12\x38\xf5\xa5\x6e\xa7\xdd\x66\x31\x00\x5f\xfe\x52\x8b\xfa\xac\xad\xed\xcb\x21\xe3\xd8\x1d\xc1\xd9\xc6\x20\x42\x0d\x80\x1d\xc6\xae\x32\x3c\x8f\xa5\xd6\x36\x26\x53\x10\x2e\xc5\xd2\x28\x68\x74\xcb\x58\x94\xf8\x70\xae\xaa\x0d\xde\xd2\xb9\x74\x58\xb9\x51\xdd\x45\x95\xac\x2d\x1a\x5c\x65\x96\x74\x53\x02\xe0\x66\x6e\x40\xe4\x70\x0d\xbb\xf0\x91\x67\x40\x09\xca\x75\x21\x7b\x0b\x39\x16\xc8\xe0\xb3\x83\xce\x64\x3b\xbd\xa5\xd7\x39\x22\xa0\x93\x76\x5a\x3c\x3b\xaf\xa3\x54\x2c\xd5\x91\x0e\xb5\xec\xee\xed\xa0\x25\xdd\x01\xfe\x64\x12\x87\x51\x52\x98\xa8\xc7\x80\x86\x4c\x5b\xce\xb6\x73\xe0\x11\x9f\x7a\x43\xc2\x68\x8f\xaa\x36\x42\x06\x8f\x97\xa6\x38\xba\x3b\xa8\x55\xcb\xe1\xc3\x0a\x7b\x44\x58\x94\x37\xf2\x08\xba\x78\xae\x1e\xba\xc2\x5b\x3f\x90\x89\x59\x6d\xe1\x24\xbd\xa9\x1d\x5e\x45\x81\x60\xae\x3b\x3a\xe6\x35\x08\x59\xe4\x90\xa4\x23\xa3\xc4\x4d\xad\x56\xf7\x36\x05\x60\x07\x5c\x69\x05\x76\x00\x21\x60\x3b\x2f\x18\x21\xe6\x2c\x9c\x65\xde\xb1\x17\x75\x5c\xfb\xd9\x5c\x14\x58\x7a\x0e\x75\xc4\xa0\x3e\x14\xe8\x92\x3d\xe0\x8b\x6b\xd6\x47\xb3\x9e\x0a\xed\xb4\x76\x1d\x9c\xc4\x77\x7f\x47\xb9\xef\x68\x1b\x01\x82\x4f\x61\x55\xe3\xc8\x91\xaa\x95\xe2\x2d\x5d\xc8\x64\x5f\xb9\x4e\x3d\xb6\x5d\x07\x3b\x4f\x1f\xba\x4c\x0e\xf0\x5b\x48\x90\xc7\x25\x65\xe1\xf0\xb2\x6d\xec\x47\x55\xdb\x2a\x20\xa3\xeb\xdc\xa3\x51\x15\x51\x70\x3a\x6f\x35\xdc\x50\x3f\x0f\x87\x0e\xc9\x4e\x7c\x47\xc4\xc7\xf4\x71\x9a\xc6\x2e\x5c\x3c\x8a\xc5\xa1\x43\x69\x7f\x60\x20\xbd\x0b\xf6\xaa\x6e\x46\x9b\xf6\xd3\x22\x58\x1b\x3c\x21\xc3\x48\x93\x3b\xc8\xf4\x6c\x5b\x9c\xcb\x6e\xb0\xaa\x94\x9b\x33\x59\x71\x9c\xfe\xb8\x56\x64\x54\x85\x2e\x5d\x95\x98\x25\xc6\x96\x91\xb9\xd3\x74\xea\x2a\xc0\x1d\x99\x80\x15\xde\x83\xb1\x44\x46\xfc\x20\x00\xef\x76\x6c\x1e\x0a\x52\x54\x3a\x8d\xbc\x36\x7e\x45\x4d\x28\x4c\x80\x55\xcc\xe3\x8c\x83\xf3\x3b\xa2\x1c\x37\x84\xe5\xba\xd4\x7d\xc2\x1c\xaf\x06\xb5\x6d\x4e\x50\xba\x07\x30\x0e\xd8\xe6\x6e\x88\x62\xee\x14\xc4\x4b\x03\x87\x0a\xd4\xaf\x3b\x6e\x2a\x16\x79\x9f\x68\xd7\x93\x6f\x49\x25\x5c\x7d\x0e\x39\x1e\x27\xbb\x34\x4d\x1e\x98\x52\x8e\x9a\xb0\x72\x67\x80\xda\x27\x6e\x67\x4f\xb7\xa8\x07\x10\x02\x41\x5b\x71\x71\x09\x35\x37\x71\xd9\xab\x4e\x9b\xab\x72\xe7\xde\xd3\x41\x3c\x3d\xb6\x49\x36\x59\x29\xb8\xc0\xc1\x2f\xb8\xdf\x42\x63\x9f\x47\x77\x2b\xb0\x13\x1a\xc7\x10\xb0\x60\x82\x8b\x83\xe9\x21\x57\x24\x9a\x85\x49\x38\x4a\x8d\xb6\x10\xc0\x0f\x73\xa9\xcd\x53\xfa\x7e\x80\xc7\x07\x62\xba\xdd\x00\x78\x9c\x33\x1e\xdb\x75\x68\x1f\x2c\x46\x2a\x40\x51\x09\xa1\xcb\xce\x13\x36\x89\x8b\x09\x05\x34\xb5\xa9\x82\x70\x5c\x20\xb2\x26\xd4\x1d\x42\x42\x74\x63\x7a\x39\xe4\x8d\x14\xac\xa0\x93\xc6\xaa\xe0\x39\x3a\xb2\x1e\xb3\x75\x8d\x0b\x0e\xa6\x3a\x0b\x33\xed\x08\x10\x24\x8d\x85\xfc\x0e\xf6\xbd\x5d\x82\xa5\xd2\x0f\x7b\x09\xab\x58\x28\x51\x46\xbd\x0b\x3b\x6b\xed\x1e\x1a\xee\xc6\x62\x2a\xe6\x0b\x28\x5f\x29\xd8\x2e\xef\xe0\x1d\x57\x5b\x96\xa4\xdb\x70\x8e\x9f\x8b\xc8\x36\x29\x1c\x2e\x70\x45\x69\x6d\x94\x94\xab\x8a\x0a\xc6\xe1\xed\x4e\x37\xb5\xa6\x3b\x76\x5b\xaf\x3b\x1e\x1e\x09\x08\xe0\x04\x98\x3c\x5a\x3b\xad\x39\x82\xa3\xb1\x5f\x63\x82\x8b\x6a\x70\x5a\x7c\xd5\x7d\x41\xe0\x06\x2c\x59\x70\xc1\x04\xb4\xdb\x1d\x10\x54\x46\xd6\x12\xb8\x4d\x74\x4a\x21\x04\xee\xc2\x2f\xa3\x4c\xc8\xcd\x68\x89\xe9\xbc\xe0\x70\x27\xb1\x5c\xd7\x3d\x3f\x94\x4a\xf4\xfd\x0e\xc0\xa3\xa7\x12\x47\x44\xe4\x48\x19\x93\x2b\x57\x7a\x19\x84\x8d\x42\xcd\xf0\x13\x2b\xe9\x9d\xda\x4c\x01\x35\x6b\x21\xf1\x60\x10\x96\x74\xc3\x5e\xd0\x7d\x75\xb5\xf1\xd4\xc4\x8a\x72\x59\x77\x2e\x7e\x92\x75\xca\x12\xf2\x4e\x13\x6a\x20\x8b\x86\x63\x9d\x47\xd4\xa9\xb8\x7e\xa4\xe8\x6f\x70\x73\x8c\x01\x24\x99\x76\xc0\x71\x88\x97\x66\x68\xab\xbb\xf5\x0e\x61\x1a\x71\x65\x94\xe9\xcd\x9c\xcc\xe7\x6d\x23\x87\xdc\xeb\xa6\x82\x82\x77\xb0\x5d\x7a\x64\x02\x78\x91\xaa\x53\x1d\x17\x73\xe4\x91\xa9\x5f\xa7\xf2\x00\x91\xc3\xf2\xc0\xd1\x9e\xc7\x80\xb2\xea\x95\x41\x51\x85\xdf\x52\xfb\xf0\xbe\xca\xa6\x8c\x6c\x9b\x0c\xf6\xd4\xc1\xe5\xe9\x46\x41\x1e\xe3\x04\xc5\xac\xaa\x9e\xbc\x10\xb5\x57\xa9\xa0\x13\x06\x5f\xc4\xde\xe1\x3b\x09\x4d\x67\x21\xc2\x76\x6a\xea\x5e\x99\x06\xa7\xbf\x98\x17\x25\x0a\x51\xe3\x34\x1b\x2d\xf4\x64\x6b\x02\x83\xa6\x72\x3b\xb5\x21\xdd\x91\x5e\x87\x84\x77\xa4\x0f\x39\x3b\xa7\x31\x23\xef\xd7\x05\x6b\xf4\x39\x5e\x25\xef\x60\xe5\x11\x14\x95\x6a\x07\xe7\xae\x77\x57\x41\x12\xec\x0e\x7f\x71\x08\x10\xfa\x49\x92\x72\x07\x84\x04\xd9\x22\x22\xde\xf8\x80\xc7\x56\xae\xc0\xb0\x15\x64\x8b\x43\x58\x14\xcb\xd9\x16\x5e\xa3\xdd\x51\x8d\x62\xb6\x9f\x4b\x1e\xc6\x0c\xa2\x9c\x6f\x62\xa4\x7d\xef\xa0\x9c\xf2\xb0\xce\x41\xe7\x26\xa5\x6a\xb7\xfd\x3a\xb4\x25\x7e\xcb\x07\xf4\xf4\x8e\xc4\x56\x59\x7e\xb6\xb2\xb6\xad\xb7\xde\x36\xdc\x30\x6c\x64\x2b\x49\x2f\xdb\xa8\xce\xaa\x74\x51\xcf\x9c\xd8\xbe\x7c\x94\x34\x57\xae\xdd\x1d\x29\xe5\x26\x8e\x43\xc8\xbc\x2b\x70\xd0\x05\xb6\x3c\x2a\x45\x88\x67\x4b\x7a\xcc\x68\x46\xd8\x49\x9b\x78\xd3\xcc\x48\x1c\x24\x06\x02\x99\x3b\xbc\x96\xa6\x52\x63\x3a\x6a\xda\x91\x57\x9d\x59\x10\x66\x16\xb6\x16\xe7\xa0\x2f\x0b\x13\x5a\x9a\x69\x93\xe5\xb9\xc3\x34\x20\x6f\xd0\xdf\x11\xa8\x16\x80\xa3\x45\xec\xea\xbe\x86\x85\x83\x09\x94\x2f\x66\x27\x4c\x8b\x09\xdc\x39\xf0\x91\x0f\x30\x78\x4c\x4b\xbb\x31\x68\x80\xb7\x74\xc0\x2e\x1a\xd0\xbe\x9d\xba\xb5\x29\xb7\xac\x5a\xa9\x74\xaa\x39\xe6\xc8\x1b\xd7\xb1\x43\x0f\xc3\x4a\x0e\x03\xc1\x2b\x28\x7d\xc9\x2d\xdf\xe1\x3b\x37\x37\x30\xcd\x81\xd2\xb4\x81\x73\x2a\xed\x8a\x69\x73\x2b\xec\xca\x5d\x1e\x89\x8b\x2b\x66\x7b\x59\x11\x30\xa2\x6c\xb1\xd8\x5c\xbe\xe3\x5c\x0c\x77\xea\xc6\xaf\x33\x58\x28\x46\xe9\xcd\x8d\xa3\x5b\x89\x07\x6e\xde\xad\xa4\xd3\x4e\xd0\xd2\x91\x67\x2a\x14\x32\x58\xa0\x7a\x8b\x74\xe4\x49\x3c\x9e\x55\x96\x62\x9d\xd7\xc7\xb6\x61\x51\x7a\xa0\x59\x2e\xa5\x7a\x48\x60\xf7\xb9\x42\x1d\xea\x4e\xaf\x9d\xa0\x90\x56\xe1\x77\x24\x30\x87\x8e\xc6\xad\x3c\x52\xba\x44\xe2\xe7\xf0\xfb\x43\xb9\x53\x95\xe6\xc8\xcb\x03\x54\x4a\x2a\x28\x9a\x34\x92\x41\x6c\xd3\x4d\x81\x5b\x38\x7a\x82\xe9\x2d\x1f\x1e\x51\x92\x0a\xb8\xe6\xa9\x73\xab\x1a\x15\x20\xcc\x0e\x42\x1d\x08\xd9\xd9\x4a\x8f\xdb\x43\x4f\x2f\x5f\x40\x4b\x7b\xc7\x1d\xf1\xf2\x38\x4c\x75\x74\x83\xfb\x1e\xe6\x95\x2e\xa7\xda\x43\x11\x8f\xa2\xa7\x16\xba\x07\x3d\x3b\x36\xe2\x6c\x39\xa5\xdd\x3e\xe4\x3b\xef\x00\x8b\xe9\x31\xd5\x3a\xb7\x73\x27\x2c\x6f\x9b\x39\x91\x30\x7b\x0f\x5b\x2d\x2c\xaa\xbe\xb4\xa2\x0c\x5b\xb5\x4b\x75\x68\x99\x38\x37\x5b\x22\xe0\x8e\xbd\x00\x18\xbb\xb0\xfb\x82\x94\x96\x27\xd4\x11\xb0\x23\xab\xab\x09\xdd\x32\xac\x3b\xc9\x1a\x00\x5e\xe5\xcc\x0d\xdb\x12\xc0\xae\xc4\x2d\x1d\x6d\xa0\x9e\x03\x6d\x80\xfa\xe5\xa5\x8a\x9b\x13\xa1\xb1\x6b\x87\x34\xed\xe3\xb0\x27\xc6\x29\x15\xbf\x85\xed\xba\x7a\x85\xa8\xec\x60\x63\x77\xe4\x66\x75\xb6\x11\x0b\x6d\x2d\x59\x70\xc0\xa4\x65\x2f\x9d\xa2\x11\x96\x3a\x55\x83\x06\x88\x11\x75\xf5\xdd\x18\xc9\x7b\xcb\xaa\x18\x70\x47\xe9\x93\x06\xb6\x56\x9b\x0c\xe5\xe2\xd9\x06\x0f\x84\xc5\x45\xb3\xe0\x3b\xe7\xbb\x14\xd9\x37\x98\xb5\x63\xfa\xa1\x1f\x03\x4b\x22\x90\xf7\xf8\x8b\xd3\x44\x91\x5c\x4f\x67\xd3\x03\x5a\x25\xcf\x42\xb2\xb0\x7d\x6e\x47\x92\xfc\x3a\x32\x17\x94\xb8\x60\x00\xc6\xd6\x3c\xf4\x9b\xe9\xde\x0f\xf0\xf8\x40\xfd\x7a\x37\x88\x2a\x9d\xce\xf5\xeb\x50\x32\x94\x05\xf1\xc2\x82\xee\x56\x1c\xe5\xc0\x65\x61\x7c\x7a\xd0\x2f\x83\x50\xee\x89\x04\x49\x33\xf5\x15\xb5\x3b\x54\x1e\x19\x3e\x2e\x43\x7a\x54\x07\x8a\x00\xf8\xf7\x69\x06\x4d\xe1\x65\xbd\x32\xe6\x60\xc5\xda\x45\x5b\x16\x44\x95\x74\x89\x1b\xd6\x98\xdd\x82\xdf\x81\x75\x12\xbd\x09\x37\xe9\xa4\x51\xb9\x15\x5b\x49\x90\xec\x97\x4a\x83\xbb\xc3\x46\xaa\x2e\x10\x2f\xed\xd9\xd5\x6c\x0f\x84\x37\x77\x47\x28\xb0\xe2\x3e\x0e\xc9\x90\x12\xcc\x2f\x18\x15\xab\x51\x36\x23\x9a\x04\xad\xf1\x7e\x29\x8c\x02\x3c\xab\x16\x9e\xc0\x43\x81\x8a\xf4\x1d\x15\x18\x56\xeb\xa5\xa3\x73\x19\x47\x91\x4f\x80\x51\xc2\x41\xa2\x82\x95\x00\xd7\x4c\x93\xa0\x8a\x81\x33\x6e\xf0\xa9\x77\x8d\x02\x6c\xa5\xdc\x41\xcb\x3e\x93\x26\x0d\x08\x86\xca\x82\x00\xfa\x56\x05\x0e\xf2\x3c\x1d\x65\x7b\x70\x12\x1f\x73\x1e\xd3\x3d\x14\x38\x4e\x5e\xf0\x12\x79\xb1\x3b\xf8\x47\x81\xa0\xcb\x5f\x47\x5c\xa2\x96\x8a\xc5\x9e\xb0\x77\xe3\x12\x47\xa0\x9e\x50\x06\x00\x17\xd4\x1f\x58\x25\x7d\xe9\xd4\x81\x77\x85\xde\xb1\x0a\x2f\x40\xd0\x27\x06\xac\xa1\x2e\x54\xb3\x85\x6f\x49\xef\x27\x4b\xcc\x80\xe4\x11\x3a\x2e\xd8\x94\xb0\xf6\x0c\x07\x91\x75\x8a\x01\xee\x80\x5d\xc2\xb6\x33\x7b\x10\xe2\xa1\x41\x87\x07\x60\x3a\xd2\xb8\x01\x96\x46\x30\x17\x9e\x74\x33\x05\x69\x24\x80\xf0\x2a\xb4\xa9\xb1\xd8\xe3\x0d\xa7\x53\x6d\x17\xde\x4c\xaa\x24\x6a\x93\x9d\xf5\xc7\x06\x6c\xe0\x5d\xb9\xba\x68\xd5\x17\x37\x38\x1f\x1a\x1d\x71\xc7\x3a\x93\x39\x30\xba\x83\x67\xc2\xc8\x96\xa5\xe7\xd4\xa8\x9e\x77\xbb\x72\x1b\x5c\xe2\x9e\xd2\x8c\x41\xef\x26\x0b\x6b\x49\x3b\x5a\x39\xf8\x35\xd0\x29\xaf\x42\xc9\x1d\x21\x22\x85\xb6\x09\x0d\x94\xc8\x6a\xdb\xb2\xd6\xce\x63\x26\xd7\x60\x18\xda\x1d\xcd\xe3\x62\x24\x94\x03\x74\x92\x75\xda\x38\x55\xc5\x70\x7a\x03\xd9\x93\x42\x70\x6a\x05\x29\xc3\x2a\x2a\x2b\x46\x3c\x1d\xba\xce\x90\x13\x21\x91\xfa\xe4\xaf\xb1\x5c\x54\x81\xef\x4d\x36\x87\x0c\x38\x0b\xbb\x83\x28\x7f\x3a\x23\x02\x02\x27\x73\x03\x1f\x4e\x80\x22\x2f\x98\x99\xcc\xf2\xf2\xe4\x64\xe3\xdc\x22\xc7\x2c\x60\x14\x59\xa3\xca\xeb\x9d\xdc\xd2\xa0\x29\x37\x49\xb6\x5a\x80\x49\x48\x1e\x78\x6d\x83\xb6\x73\xf4\x63\x03\x08\xd9\x55\xad\x4d\x60\xd4\x1a\x66\x24\xbb\x4a\x67\xa7\x6c\xa7\x77\xc8\x19\x1d\x47\x42\xdd\x0c\x4f\x63\x67\x51\xf9\x8d\x6a\x06\x0e\x80\x53\xd8\x33\x41\xc1\xcf\x89\xa9\x03\x76\x42\xba\xb4\x45\xa5\x0c\x31\xef\x60\x84\x59\x13\x82\x01\x07\xba\xfa\x12\xa4\x02\xbd\x03\xd9\x0c\x33\x97\x11\x87\xaa\x98\x5e\xcb\xf2\xf3\x6c\xa7\x3c\xa7\x3d\x67\x4e\x94\x94\x1b\xfc\x05\xbd\x34\x73\x0c\x11\xbe\x15\xb4\xe6\xae\x39\x96\xc5\xb3\xbd\xc3\x85\x32\x14\xc7\x9e\x0c\xea\x10\x8d\x24\xa0\xbb\x90\x54\x8e\x1a\x77\x47\x11\x61\x63\x3d\x64\xcd\xf6\x5a\x31\x08\x40\x28\xd6\x06\x67\x93\x90\x9d\x9d\xd0\x8c\x2d\x4a\x60\x4b\xa9\xbc\xec\xdc\x36\xd9\xb1\x67\xb7\xd4\x8d\x29\x47\x9d\x56\x75\x2c\x89\x45\x87\x34\x25\xc5\x51\x9c\xbb\xc2\x83\xe9\x38\x8a\x69\xb6\x6d\xd2\x46\x38\xaa\x95\x4d\xcd\xec\xcd\x1d\x41\x7b\x3f\xd2\x89\x17\x5e\x3e\x59\xe4\xbb\x82\x19\x67\x92\x93\x57\xac\x9d\x99\x0c\xb2\x57\x35\x17\x2d\x2a\xe6\xe9\x65\x33\x3b\x1a\xec\x0e\xa8\xa1\x45\x23\xce\x25\x3b\x5f\x51\xaf\x9d\xbb\xc3\xb8\x46\xca\xe1\x8f\x58\xeb\x7e\xaa\x7c\x6c\x0e\xc7\xc6\x2b\x10\x87\x2d\x54\x61\x6b\xef\x90\x6a\x91\x6a\x99\x92\x9a\x9b\xd4\x37\xdb\xd9\x3a\xa5\xce\x87\x0c\xdc\x05\x7f\xee\x1b\xa1\x40\x18\x49\x02\x96\xc7\x0a\xa1\x0f\x74\x5a\x7a\xc7\x3b\x72\xca\x11\x04\xba\x5a\x10\x58\x63\x12\xa8\xd9\x7b\xb5\x6e\x1d\xe9\xd4\x6a\x27\x72\x68\x15\x3a\x9e\x48\x43\x80\x60\x51\xa1\x8f\x5b\x84\xc7\xec\x91\xb0\x65\xea\xaa\x98\xca\x93\x65\x6a\xa8\xe3\x48\x3a\xc4\x0f\x4d\x0d\x3b\x0b\x5e\x75\x1f\xd8\x5d\x0b\xb5\x33\x5d\x26\x14\x7a\x83\x42\x2e\x9b\x7a\xc3\x06\x93\x2c\x12\xb3\x04\x5c\x3a\x5f\x08\x62\x58\x3c\xda\xf0\xd4\x7b\x99\x9a\xa7\x4d\xa2\x7c\x19\x15\x48\xc1\xf5\xb8\xa5\xc9\x88\x8e\x26\x8c\xd3\x7c\xa4\x56\x41\x1f\xba\xe6\xc2\x63\x03\x5b\xb4\x32\x58\x9e\x11\x16\x84\xce\x01\xd5\x8e\xc0\x56\x66\xf5\x4b\xdf\xd2\xa0\xb9\xf5\x09\xf1\x86\x14\x0e\x1a\x10\x68\x93\x15\xed\xf4\x13\xc1\x63\x15\x19\xb6\x4b\xa4\x52\x49\xd8\x1a\x04\x24\x86\x7d\x1d\x14\xdf\x31\x67\x88\x45\xe1\x5a\x62\x92\xf3\x4d\x95\xbe\x1a\xb0\xc9\xc6\x33\xf4\x9a\xec\xda\xfa\x71\x4d\x8b\xcf\x66\xb7\x2a\xe7\xc0\x6b\x5d\x85\x5a\x7e\x07\x83\x54\xc1\xd8\x2b\xdc\x37\x4d\x49\x88\x38\x41\x3a\x16\x16\x48\xc4\xd3\xf7\xb0\x5f\x6d\x42\x7e\x6d\x57\x69\xe7\xec\x20\x57\x83\x2c\xca\x77\x64\x45\x73\x29\x48\x70\x3c\xba\x87\xf4\x52\xdb\x69\xe1\xca\x7d\x56\x62\xb0\x85\x11\x74\x20\x89\xd7\x4b\xe4\x7c\xee\x8e\xae\x35\x04\x4a\x77\x70\x7a\xc5\x50\xd2\x4e\xcb\x8f\x9a\xda\x34\x3e\x0d\x42\x32\xc2\x51\x67\xcd\x1c\xc8\x22\x33\x5c\x8e\x8a\x7c\xdb\x48\xbe\xac\x1e\x44\xce\xf1\x7e\x80\xc7\x07\x52\x1d\xba\x01\xf0\x68\xde\xf3\x4e\x2c\x8d\xf1\x38\x44\x8d\x05\x93\xac\x14\x34\x9c\x9a\x3e\x59\x98\x83\x33\x8b\x7a\x33\x69\xb8\x2d\x54\xca\xb1\x66\x77\xf4\x46\x4d\x23\x5a\x67\xe0\x32\x20\x52\x0a\x87\x63\x89\x00\xa6\xed\xea\xa8\x13\x4e\x8e\x1c\xe6\x26\x85\xad\x28\x49\x80\x3d\x3d\x2e\x75\x8b\x52\x99\x41\xf3\x12\xde\x92\x41\x59\x82\x90\x42\x71\x60\xfa\xd0\xca\xce\x22\x9c\x00\xa9\x85\xf3\x48\x6e\xd7\x8c\x1e\x98\x22\x40\xce\x7a\x8b\x8e\x9e\xef\x47\x25\xad\xf9\x25\x31\x8f\x3e\xd4\x53\x4b\xcb\x5b\x4e\x27\x43\xc9\xac\x93\x77\x4c\x5b\x4a\xa2\x6f\x95\x8f\x94\xfd\xd6\x6f\x19\x4c\x14\x73\x29\x80\xe8\x46\x25\x38\xa4\xb4\xa1\x00\xb1\x64\x35\x5c\x51\xce\xc1\xbc\xf8\xc0\xc7\x24\xcc\x40\xec\xc9\x44\x1b\x09\x97\xb9\xa3\x26\x36\x73\x23\x0e\xc4\x92\xf2\xee\xdd\x2e\x51\xd4\x79\xd3\xab\xb6\x6e\xc0\x25\x1a\xdf\x0c\xf2\x0d\x09\x9d\xf3\x16\x9d\xc2\x49\xd3\x72\x87\xb3\xc5\x52\xce\xc3\x77\xcd\xc0\xde\x89\x73\x9b\x12\xc9\x53\x82\xf6\x42\xf8\xaa\x34\x0a\xc9\x8d\x6e\xc9\xef\x3a\x9e\x73\x93\x8e\x4d\x7e\x47\x32\x97\x5c\x4e\xae\xc3\x6b\x49\x11\x5a\xa6\x28\xc5\x3e\x43\x24\x67\x08\xce\x48\x81\x1c\x4d\x66\x5d\xbe\x12\x94\x8f\xea\xf8\xa9\x4b\xbe\x83\x05\xe5\x4a\xb4\xa6\x26\xd7\xda\x75\x6c\x9a\xe6\xd2\x32\xcb\xd8\xbb\x93\x8c\x8a\x5b\xde\x03\x2d\xbb\x6a\x4d\xec\xeb\xdc\x4e\x12\xcf\x6c\xef\xa0\x59\xd6\xd1\x40\x9a\x08\x6f\x68\xa3\xbb\x43\x40\x9b\xdd\x9c\xec\xca\x45\x9d\x1c\x2c\xaf\xc0\x3e\xfc\x31\xb7\x7c\x81\x89\x04\x42\xd0\xc1\x3b\x1e\x9e\x50\xc3\x1e\xc6\x14\x54\xd4\x23\x6d\x7b\x03\xb8\x93\x4e\x76\x92\xd0\x95\xed\xe2\x45\x41\x78\xa8\x58\x8d\x19\x86\x23\x15\x68\x86\x77\xd0\x6f\xf1\x69\x04\x67\x5e\x8a\xc9\xcc\x0a\xd5\x09\xb1\xf3\x01\x76\xe5\x04\x4f\xbb\x59\x7a\xeb\xd0\xfa\x5a\xe8\x71\xa1\x7c\xe4\x38\xf2\x2d\xe1\xb2\xd4\xc5\xad\x53\x69\x84\x35\x3f\xa0\x42\x68\x8f\x31\x95\x4d\xb7\xd3\x6d\x41\xc2\x8e\x41\x3b\x56\x07\x5e\xd8\xcb\x10\xbb\x22\xbb\x85\x10\xed\xe0\x38\x54\x9d\x07\x07\x02\x80\xb1\xa1\x40\x8f\x63\x3f\xec\xd1\xcb\xc8\x07\x31\x3c\x6b\xbd\xb4\x62\xfe\xe8\x9a\xef\x9b\x83\x2e\xdd\x51\x37\x26\x4e\xe6\xba\xc3\xf7\x65\x2f\xfc\x42\xef\x6b\xa6\x88\xe1\xc2\x7b\x3a\x0e\x65\x54\x9d\x7b\xaa\x6b\x6f\xa7\x3f\x07\x3a\x5b\x4e\xcc\xde\xa1\x73\x43\xa4\x80\x5b\x5c\x9d\xec\x27\xb7\x3b\x2c\x63\x2e\x78\x22\x79\xcc\x02\xe0\x21\xe4\x35\xc3\xee\xa6\xb6\x2a\xed\x16\x5f\x63\x1f\xcc\xdc\x11\x2e\x5f\x51\x64\x4e\xfd\x71\x91\xed\xf4\x9b\xac\x39\x9e\xc6\x5c\xbe\xcc\x0d\xad\xe9\xc0\x12\x19\xc9\x4a\xf8\x11\xe5\x76\x6d\xed\xe2\x07\xbb\x25\xa5\xd4\xf3\x6a\x3c\xcc\xc0\x59\x55\x7a\x2e\x6c\xf8\x25\xfb\x15\xcc\x1c\x86\xaf\x86\xc7\x9a\xfd\xd2\x4d\xfb\xb4\xb4\x58\xca\xaa\x75\x47\x88\xd8\x84\xe3\xf8\x9c\x0a\x58\x66\xd4\x79\x4e\x37\xb6\x3a\xf3\xbe\x47\xd4\x9d\x69\x33\xac\x32\x80\x3a\xd1\x2c\x2b\xda\x34\x7c\x32\xfb\x2d\x2d\x70\x22\x48\x97\x17\x94\x25\xcf\x89\xae\x45\xf7\x1d\x4f\x2a\xcd\xe4\x6c\xc1\x2a\x64\x30\x84\x53\x4c\x84\xf1\xac\xe2\x42\x7c\x05\xb7\x00\xa4\x27\xf2\x2e\x72\x36\x57\xbb\x8e\xe8\xa5\x8e\x17\x1e\x27\x83\xd8\x38\x81\x67\xe0\x47\xad\xc7\xbe\xae\x8e\xb8\x9c\xb1\x9b\x74\xdd\xc1\xad\x60\xe1\xa1\xcf\x4d\x59\x15\x17\x77\x3d\x6c\x3c\xb7\x39\xb6\x05\x69\xd0\xa8\xd5\xbc\x31\x6a\x8a\x99\xe7\x01\xf8\x4e\xd7\x30\x60\x82\x75\xc7\x90\x26\xbe\xa1\x98\x29\x6f\x7e\xa1\x6a\xe0\xc6\x35\xbb\xea\x45\x94\xee\x97\xef\x51\x44\x4d\x2f\xb4\x5d\xd7\x05\xcf\xaa\xdd\xa6\x72\xcb\xee\x8e\x55\x24\x54\xe3\xa9\x92\xdd\x63\xf7\xb5\xec\x8e\x04\x27\x56\x84\x76\x67\xf6\x42\x31\x3b\x74\xa1\xed\x18\x92\x03\xda\x05\x37\x04\xb7\x3b\xa2\x5f\xe6\x42\xa5\xcc\x63\x02\xa7\xdd\x7c\xe6\x5e\x38\x27\x53\x75\x05\x62\xb8\xe7\x10\xc6\xce\x40\x95\x58\xd2\x7e\x9e\xc7\x29\xe4\x31\xd9\x2d\x7b\xe1\x13\x29\x7b\xe8\x75\x21\x1a\xaf\x51\x9c\x1d\x07\x32\xf1\x04\x69\x1c\x56\x27\x81\x63\x46\x7c\x2b\x0d\x1d\xb0\xd0\xa3\x1c\x61\xde\x01\x9c\xa3\xbd\x77\x12\x0f\x7d\xc9\xd9\x4a\x19\x0a\x9d\x7b\xda\xa4\x00\xdd\x1c\x5a\x17\xe2\x62\xb0\xb5\xa6\x6d\x00\xb4\x91\x29\xaf\xd0\xef\xf0\x5a\x2c\x37\xba\xe6\xde\x85\xda\x80\xe8\xc0\xa3\xb3\x78\x35\x77\xb6\x2e\x20\x69\x3d\xcb\xec\x2a\x18\x6e\xdc\xa9\x06\x2f\x48\xa2\x94\xd6\x0d\x4c\x41\xba\xef\x60\x36\x1d\xf7\x0b\x74\x60\xf5\x09\x35\x37\x1a\x0d\x79\xed\x2e\x78\xb2\x3b\x73\x12\xaf\x22\x39\x60\xb4\xf2\x34\x3a\x0f\x60\xee\x18\x26\xec\xe5\x74\x65\xdf\x89\x06\x5c\x85\xc0\xae\x05\x81\xce\x6b\xe5\x13\x5d\xd1\xa1\x88\x38\x1c\x1b\x39\xbb\xbf\x86\x54\x21\x5d\x42\xf8\x3b\x32\xc4\x59\xb3\xdc\xf8\x08\xcb\x9e\x17\x38\x64\x65\x66\x33\x54\x96\xa3\x1c\xf8\x48\x1a\x79\x22\x16\x46\x48\x75\x8d\xea\x46\xf6\x4d\x8c\x5b\x60\x97\xb2\x5f\x2c\xc9\xc0\x0f\xc8\xb2\xc9\x26\x88\xd3\x5e\x5b\x51\x3b\xae\x98\x26\xa7\x58\x2e\xfc\x44\x1b\xb9\x08\xcc\x9b\xf4\xa6\x00\xcb\xde\x0f\xf0\xf8\x40\xda\xc9\x37\xb4\xb4\xd8\x05\x44\xd8\x04\x75\x84\x06\x08\x0e\x0e\x2f\x30\x0f\x04\xf3\x25\x94\x0d\x20\xf6\x6d\x2c\xc9\x9c\xda\xd1\x3a\xb2\x07\x8d\xb9\x5b\x3a\xc0\xf1\x41\x77\xde\x2b\xba\x56\x8e\xd0\x84\x73\x04\x5d\xb2\x58\x57\x93\xac\x2f\x07\x68\x0b\x50\xa1\x8a\x65\x32\x57\x62\xbe\x1d\xb7\x84\xcb\x8c\x32\x68\xb5\x26\x8b\x18\x51\x41\x71\x10\x6d\x22\xe6\x98\x8f\x7d\xd8\x5d\x3a\x19\x83\x3c\x7b\xbf\x7c\xee\xfc\xec\x73\x1f\xf9\xbc\x67\x2e\x1f\xf4\x36\x1b\xe0\x68\x28\x6d\xe1\xdd\xe9\x3e\xfb\x71\x9c\x45\x2b\x5a\x37\x82\x1b\x32\x44\xfb\x5a\xdb\x89\x76\x78\x68\x79\xc9\x72\xcb\xf0\x2e\x4a\xed\xd4\x75\x58\x86\xd5\xd6\xf2\xb9\x25\xb3\x2b\x0f\x21\xf6\x65\x65\xc1\x91\x30\x0d\xe5\xbd\xee\xd0\x56\x8b\x63\xc4\xc8\xdd\x21\x61\x25\x25\x3e\x81\x27\xed\x22\x96\x9a\xdc\x76\x96\x02\x2a\x2e\xd7\x13\x5a\xdc\x43\x3a\xb6\x3e\x47\xe1\x1c\x33\xb7\x0d\x79\x80\x6b\xde\x31\x33\x9d\x05\xc6\x69\x87\x1a\x1e\xde\x5a\x61\x4d\xa9\x79\x2a\x61\x56\x1e\x03\x71\x18\x11\xb2\xac\x36\xb0\xfb\x71\xda\x1d\xcc\x63\xa5\x7c\xcb\xe4\x76\x77\xe0\x2b\x98\x5c\x51\x49\xb6\x95\xec\x82\xa4\x62\xcd\x0b\x55\xd7\x25\x42\xc3\x0f\x28\x36\x65\xe7\x08\xa3\x2a\x8c\x89\xb6\xf0\x0e\x22\x5b\x90\xac\x5c\xd1\x24\xe9\xd0\x49\xd9\xa8\xf8\xac\x49\x91\x10\x45\x16\x41\xce\x1d\xc8\x7e\x5a\x70\xc6\x13\x17\xe1\x3b\x62\xb2\xdf\xa2\xb6\x13\x68\x4e\x97\xaa\x31\x88\x8a\x95\x85\x83\xb7\x3d\x47\x9b\xb1\xab\x22\x35\x0f\x15\xac\x46\xe5\x2c\x8e\x83\x52\xa6\x4c\x49\xe2\xba\x63\xa8\x1b\xa4\x7a\x41\x48\xb3\x0a\x86\x6a\x4e\x83\xdb\x2a\xdc\x97\xc6\x04\x72\x7a\xed\xab\x5e\x2d\xbb\x9d\xee\xaa\x55\x33\x69\x08\x25\xe6\x5b\xfa\xd0\x71\x28\x46\x14\x71\xc0\x91\x93\xc0\x86\x96\x20\x0a\xac\xbc\x83\x0e\x7a\xaf\xf5\x54\x17\x74\x09\xe7\xa4\x90\x0f\xba\x2a\x43\xef\x60\xfe\x98\x15\x19\xe4\xd3\xd5\x90\xd3\xff\x43\xdb\xbf\x85\x7e\xf8\xfd\x7b\x41\xe0\xc8\x30\x37\xc2\x28\x5b\x91\xb9\x19\x18\xc4\x61\x06\x9c\x19\x2f\xd6\x71\x18\x9c\xa2\x34\x0b\x0c\xda\x60\xa2\x14\x94\xeb\x7c\x3e\x3c\xeb\xf4\xac\xb5\xc8\xb0\x34\xf0\x26\xd0\xcc\xa0\x08\x24\x88\xb2\xa2\x0c\x09\xc3\x04\x11\x2c\x29\x32\x83\x14\xba\x68\x5b\x26\x42\xa6\x59\x46\x78\xe8\x22\x8b\xdf\xfe\xb3\x69\xc3\x16\x84\xfa\x3f\x97\xdf\xab\xef\x62\x7d\x9e\xf5\x3e\xbc\xde\xaf\xf7\xeb\xc5\x2f\x05\xa0\x83\x8b\x2d\xac\x9c\x3d\xe5\xac\xd0\x65\xcc\xa3\x58\xd4\xd4\x50\x01\x96\x4a\x49\xfb\xa2\x81\x51\xb2\x37\xd4\x8c\x3b\xcd\x6a\x7d\xd8\x71\xea\x0a\xdd\xd2\xb9\x0a\x30\x8c\x6d\xcb\xa6\x64\x26\x84\x27\x63\x41\x8d\xca\x64\x9f\x38\x31\x77\x60\x1a\xa1\x8f\x27\x27\x3e\x2d\xef\xf8\x8e\x67\x5f\xed\x21\xcd\x58\xf4\xf0\x3e\x7e\x58\xbb\x7d\xcf\x03\x09\xd5\xcc\xcb\xed\xf8\x22\x6a\x39\x09\x70\x38\x48\x8d\xeb\x51\x41\x05\xbc\xe2\x76\x33\x86\x28\x39\x5e\x76\x00\xb8\x12\x0d\x93\x1b\x04\xec\x79\xf2\xee\xd1\x80\x4f\x00\x0f\x56\x2e\x03\x58\x31\x74\xf9\xbd\x7a\x2a\x4c\xd2\x89\xaf\x5f\x2d\xf1\xeb\x1d\x35\x2b\x25\x4b\xcc\x60\x20\x08\xe2\x1f\x54\xfc\x17\x93\xb9\xcb\x22\x2a\x37\xd2\x8e\x06\x70\x59\x90\x94\x66\x42\xe3\x10\x42\x9a\x35\x69\x3e\x61\xc0\xa6\x05\x8a\x4f\x5c\xc6\x41\xfb\x8a\x2f\x54\x98\xb8\x7f\xaa\x09\x92\xdf\x41\xcb\x92\x4f\xee\x3a\x34\x13\xd4\xe5\xa3\x72\xcf\xe7\xe5\xd8\x15\xd4\xc1\xd2\x5b\x24\x0a\x4a\xf4\xeb\x13\x6f\x6c\xb4\x74\x04\x0c\x49\x7e\x42\x4a\x1d\x90\x77\x58\x63\x32\x91\xbc\xd4\xc0\x6e\xbe\x3b\x80\x07\x1f\x63\x06\xd9\x5e\x90\x98\xb0\xff\xc2\x65\x76\xa4\x81\x35\x5b\x8b\xe3\xda\xcc\x3d\x4a\x13\xfe\x1e\x38\x4c\x4a\x8b\x95\xea\x45\x91\xe8\xa1\xc8\xee\x83\xd0\x8d\x60\xd5\xf6\x09\x9f\xa0\xb6\x2e\xc8\x39\x57\xe1\x38\x8b\xf2\x92\xe6\x1e\xef\x44\xae\x78\xcd\x42\x4c\xbe\xba\xde\xe4\xdb\xba\x36\x59\x3c\x27\x0f\xd0\xbf\x18\xf7\x99\x61\xc1\x5e\xfc\x3d\x35\x9c\x08\x72\xad\xca\x5e\x88\x8e\xf7\x1e\x97\xad\x75\xd4\x17\xe8\x97\x81\x3b\x9a\x7f\x58\x78\x53\xfc\x64\xed\xeb\x22\x34\x25\x6b\x1e\x8d\x64\xe9\xd6\x8f\x6e\x8e\xd5\x79\x6c\x82\x62\xa5\x9d\xe5\x28\x64\x14\x2e\x4e\x65\xb2\x55\x42\xe2\x89\x5f\x70\x37\xf7\xd8\x6e\x0e\x8b\x70\x72\xb2\xeb\x04\x7e\xe8\xf2\x09\xd5\x94\xc1\x0e\x25\x8b\x9d\x53\x8e\x88\xaf\xa0\xce\x76\xd5\x60\xc3\x3d\x5f\xd4\x17\x42\xeb\xa7\xa2\x96\x03\x26\x10\xca\x9b\x8a\x98\xda\xac\xd7\x0b\xca\x6d\x0b\x7b\x09\x56\xe9\x94\x04\x29\x79\xea\x9d\x7c\x65\xf1\xc5\x4b\xcd\x27\xe2\x2d\x12\x9c\x53\xc5\x4a\x33\xbd\x82\x32\x5a\x5c\x85\x4c\xec\x3c\x34\x23\x99\x23\xaa\x30\x66\x70\x49\xd0\x41\xe3\x5f\x80\x3f\xac\xd4\x53\xba\x99\x73\x52\x9c\x79\x78\xcb\xf5\x90\xaf\xec\x43\x8b\x8c\xb9\xf9\x6c\x9d\xce\xf3\x52\x3d\x37\x7e\xb4\x83\x32\x7e\x32\x8c\xe6\xb3\x8b\x62\x7c\x19\x5d\xdb\x86\xe7\x6e\x03\xcf\x79\xa0\x77\x90\x92\x07\xce\x60\xba\xd0\xdd\xd1\xe1\x67\x6b\x79\x2d\x86\x5b\xf8\xa2\x4f\x6d\xa6\x9e\xa7\x0a\x1f\x05\xe3\x00\x84\x47\xeb\x8c\xf4\xf2\x2a\x0b\xeb\xd4\x70\x8b\xe0\xbe\xeb\xf3\xa8\xc2\xb9\x65\x05\x91\xe1\xbf\x80\xa0\x1e\xc0\x28\x60\x1e\x17\xf6\xe2\x97\x20\xd4\xfb\xe6\xef\xab\x41\x3e\xaf\xd0\xab\xa9\xc6\x1a\x64\xb1\x68\x63\x5f\xa0\x07\x34\xe3\x7c\x31\xfa\x2c\xf9\x3e\xfa\xb5\x75\x4b\xa9\xac\xe0\x8e\xf1\x79\x66\x67\x4d\xb9\x0e\x63\xd0\x55\x41\x6b\x71\xb2\x01\x4c\xce\xa5\x8d\x1d\xc6\xbf\x89\x4f\xf8\xdf\xc2\x01\xea\x03\xc0\x43\x88\xdc\x5e\x7c\xe5\x7c\xa6\x44\x89\x98\x92\x40\x5c\x27\xbe\xf4\x18\x75\x88\xe6\x3f\xfd\xc4\x87\xa2\x74\xae\x87\x4a\x00\xd8\x27\xdb\x6a\x0b\x07\xa6\x2f\x9d\xb0\xda\x3a\xe5\xcd\x72\x21\xab\x21\xdf\x67\x8e\x80\x40\x09\xb9\x21\xd0\x34\x98\x75\xcc\x94\x49\x85\xa3\x7f\x91\xfe\x4c\x48\x68\x20\xd0\x37\x15\x69\x73\x75\x89\xf3\xae\x78\x32\xb6\x3a\xd4\x0d\x05\x1d\xb5\x9c\xdf\x07\x73\xb3\xb6\xa7\x9e\xf8\xe7\x0b\x2c\x33\xe8\xb4\x59\x99\x4c\xeb\x66\xb0\x54\xcf\x1c\x76\x78\x5b\xb7\xc0\x73\xac\xa3\x98\xb8\x4d\x90\xd0\x1d\x16\xcf\x78\x20\x81\xd5\x7d\xa1\x92\xb0\x1b\xc3\x3d\xc3\x71\xf6\xa8\xae\xd6\xac\xb8\x37\xfa\x30\xb8\x57\xce\xb9\x68\xd1\xf1\xed\xae\x94\xc5\x8d\x0e\x28\x49\x99\xfd\x17\xab\x4e\xf3\x84\xc1\xc8\xd2\x5a\x68\x36\x9d\x3a\xe7\xae\xc1\x0f\x4e\x5b\xe0\x1d\x65\x34\x1a\x87\x68\x40\xca\x13\xcd\x73\xc8\x6b\x68\xf8\xa2\x99\xbb\x13\x8b\x03\x8a\xc1\x01\x29\x73\xf8\x79\x84\x43\x23\x83\x06\xd0\x49\x4d\xee\x3b\xca\x49\xce\xad\x8d\xdf\x05\xdf\xa2\x63\xff\xc2\x89\x99\x6f\x5c\x8b\xb1\x38\x1f\xf0\x06\xe3\xeb\xe0\x98\x3c\x72\xbd\xb3\x14\xbc\xf3\x63\x70\x46\x4f\xef\xdc\x2b\x54\x57\x8c\x62\x2c\xf2\xc5\xdc\x98\xd9\x8c\x22\x52\x91\x1f\x13\x58\xa1\xa0\xb9\x79\xa1\x2a\xd2\xd8\x1d\xcd\x28\x7e\xfa\xf2\x12\xf0\x38\x66\x6a\xc4\xc0\x99\xf3\x7c\xe1\x40\xc1\xeb\x2a\x3e\x9c\x66\x0e\xd7\x12\x47\x88\xd8\xc8\x56\x23\xab\x73\xa6\x73\x60\x33\xed\x2a\x07\x5b\x24\x83\x03\x4a\x16\x5e\x55\xf8\x42\xd7\x3e\x2e\xf9\xc8\xd2\x0c\x33\x46\x01\x09\xa0\xd3\x47\x56\xf6\x6a\xec\xea\x53\x97\x6c\x4a\x18\x33\x8d\xdd\xe6\x2d\x4c\x6e\xa8\x36\xfb\x64\xdf\x18\x33\x14\x1d\x4c\x25\x65\xb4\x7d\x5c\xd0\xd6\x30\x18\xa8\xf2\x49\x80\x3a\x1d\x21\xb4\x34\xf6\x75\xcf\x5a\xd4\x91\xec\xf8\xf3\x45\x59\x64\x05\xb1\x7e\x0d\x73\x0c\x93\x11\x1a\x82\x90\x84\x22\x67\x48\xe8\x1e\x59\xb3\x58\xd5\xf3\x43\x40\x13\xcc\x54\x93\xeb\x66\x49\x7c\x41\x45\x7e\xfd\x4d\xec\x02\x60\x6e\xaf\xa3\xe9\x3c\xd7\x2a\xdc\xa7\xa7\xbd\x2d\xbf\x06\x27\x3b\x8f\x6c\x01\x53\xf0\x0e\xce\x18\xe2\xf0\x7e\x01\xd3\x3e\xba\xe4\x25\x28\xb5\x46\x9c\x8e\x2f\x75\xa5\x9c\x17\x81\x65\x41\x3a\x35\xb7\x46\xa5\x36\x50\xb5\xdc\x64\xac\xdb\x1b\x05\xc0\x17\x39\x75\x9a\xdb\x92\x58\x08\xa2\x55\xc9\xed\x05\x5d\x16\xd5\xd8\x47\x8a\x17\xa8\xc7\x88\x47\xbb\x6d\x22\x8c\x82\x25\x7f\x48\xd5\x83\x7d\xe0\x83\xc1\x21\x94\xeb\x15\x47\xf7\x83\x4a\x91\xa1\x66\x15\xa9\x04\x2e\xe1\x95\xeb\xfb\x42\x75\x65\xcb\x0d\x9b\x39\x97\x4c\x32\xbd\x75\x7d\x23\xf3\xe6\x33\xc4\x81\xc5\x28\x98\x9b\xbc\xe7\xa7\xfa\x65\x68\x42\x98\x6b\x60\xba\x58\x0f\x58\x07\x25\x23\xda\x93\x29\x0f\x41\x7a\xf0\x09\x34\x89\x84\xb1\xde\x9d\xbd\xd1\xf2\x9b\x3b\x86\xdc\xde\x12\x73\x26\x97\xfe\xa1\xed\xd5\x32\xb2\x6e\x3b\xa7\x56\x6d\x25\x5a\xba\xee\x8b\x66\x2e\xd5\x60\xa3\x93\xc1\x1f\x9c\x3c\xc0\xc9\x5c\x73\x38\xb5\x10\x0c\xa3\x4d\xa6\x58\x20\x67\x71\xd3\x7c\xa9\x83\x4c\x4d\x7c\x9e\x2f\xf8\x47\xec\xa1\xaf\x52\xbd\x4c\x61\x35\xe2\x84\x63\x1f\x31\x59\x8c\x4e\x42\x81\xba\x1d\x01\xdf\x4d\x53\x0a\x8c\xf9\xb0\xb1\x80\xe7\x9f\x80\xc5\x14\x5d\xc2\xbb\x8b\x6e\x11\xb5\x8f\x0c\xe7\x8d\x66\x67\xf9\x86\x31\xe8\xe5\x83\xe5\xce\xab\x63\xc0\x2d\xc5\xf1\x26\x78\xfb\xfb\xc5\x62\xcd\x3b\xea\x43\x39\xa0\x3c\xb8\x56\x68\x04\xac\x3e\x15\x15\xac\x31\x7d\x60\x7f\xbb\x3c\xe1\x7d\x9e\x92\x59\x90\x2a\x36\x8b\xba\x78\xbe\x60\x90\x32\x5d\xdd\xa3\xec\x81\xf8\x61\xe9\xe8\x4d\xdb\x00\x69\xcc\xa3\xf2\x46\xc3\x8c\x43\x07\xb3\x34\xc6\xf6\xea\xc7\x77\x87\x84\x3a\x5f\xc4\xce\xe3\xe7\xe0\x5a\x18\xcb\xa7\xd7\x84\xca\xe7\x85\x4b\x18\xde\x5b\x6e\xbc\xaa\x97\x6e\x3d\x8f\x9b\x4e\x64\x0f\x3b\xc6\x13\x45\xfe\x85\x6a\x1b\x11\xcf\x23\x8d\x7f\x52\xee\xbb\x8e\xab\x2b\xd1\x71\x20\xea\x4a\x08\xf9\x0d\x2f\x08\x86\x1a\x3b\x1e\x33\xba\xb4\x97\x31\x46\xce\x17\xd9\x8c\xc3\x1f\xfe\x3e\xb4\x8d\xe0\x6a\x50\x7b\xed\x3b\xa6\x1b\xef\xa6\x8f\x8e\x8e\xde\x44\xb3\x3a\x55\x77\x0f\xcb\x70\x09\x35\xd5\xbf\x00\xc2\x10\x3f\x0e\xd1\xc0\xba\x8c\xec\x8c\xa0\xa6\x3a\xe8\x99\xe0\x24\xd0\xeb\xf5\x01\x96\x54\xc5\x55\x71\xdf\x43\x6a\x1c\xac\x85\xf8\x45\x6f\x06\xc2\x6d\xcd\x93\xf2\x3e\xde\x54\x91\x26\x4a\x6e\x2d\xa9\x26\x5c\xaf\xec\xcc\xec\xad\x1a\x0e\x5a\x0e\xfc\x16\xe6\x0c\x0e\xfe\xf9\x82\x41\x3a\x0b\x02\x40\xb3\x74\x70\x63\x16\x70\xd6\x80\x2f\x29\xcf\x4b\x2a\x2c\xc7\x67\xcc\xe0\xe3\x28\x83\xf1\x72\xd9\x25\x14\x83\x7d\xa2\x1d\x07\xf1\x0d\x0e\x53\x50\xf8\xbe\xc8\x22\x8c\xc9\xbd\x01\x3e\x83\x71\x63\x11\x9e\x6f\x02\xb3\x57\xb7\x20\x7d\x51\x69\x0b\x6a\xf6\x7c\xd1\x09\xac\x9a\xa0\x7a\x16\xd7\x82\x80\xcd\x23\x39\x8c\x92\xd4\xf0\xcc\x58\x23\x88\x49\x13\xdd\x1f\x16\x5e\x2b\xb1\x1d\x62\xbb\xb1\xc2\xcf\x05\x3c\xfe\x56\x3e\xd6\x1f\x00\x1e\xee\x69\x76\x21\x19\x02\xb2\x48\xb9\x87\x1e\x67\xb4\x88\x91\xbe\x73\x65\x8d\x36\x08\xaf\xee\x8b\xe0\xb1\x6d\x18\x41\x11\xd9\xdc\x27\x92\x34\x67\x99\xd7\xaa\x58\x0b\xde\x9e\x98\xd2\x32\xcc\x43\x78\x33\x81\xdb\xaf\x37\xc1\xed\x66\x0d\x23\x40\x17\xf7\xa2\x77\xac\xf1\x09\xc1\xf1\x8d\x2c\x4b\x54\x1f\x92\xe4\xbe\x7e\x5a\x07\x84\x21\x9c\xc5\xba\xd9\xa6\xf7\x9d\x39\xc0\x42\x25\xf5\x6a\xa6\x5b\x1f\xdc\x81\xfc\x42\xab\xc1\xbc\x24\x65\xb2\x32\x89\xf2\x21\xd6\xa7\xb5\x2a\x8c\xd4\x9e\xd5\xcd\x1b\x9d\x7e\xdf\xd8\xd5\xbb\xbc\x7b\x6a\x83\xda\xdd\xfe\x49\x93\xcf\x4b\x66\x00\x59\xd3\xe6\xd2\x53\x6e\x32\xe8\x70\x6b\x77\xa0\xc1\x68\x36\xdb\x6e\x33\x74\x21\xb0\x0e\xd0\xe0\x75\xbc\xc0\xc0\xf6\xc5\xa3\xda\xeb\xbe\x3b\x99\x9c\x9e\x57\xa6\x88\x05\x86\x1a\x92\x8a\x97\x16\xfb\x46\x01\xeb\x01\x8a\x3d\x61\x9e\xd9\x42\xd3\x78\xe5\xf9\x89\x08\xe1\xde\x99\xbf\xcd\x83\xdc\x40\x05\x09\x4b\x46\x70\x9d\x6f\x58\xe8\x3a\x38\x71\xc3\x6f\xd0\xca\x87\x1c\x5d\x8f\x33\xb0\x99\xf3\x27\xe4\x70\x10\xaf\x2b\x1e\x36\xec\xbb\xc2\x9d\x6d\x58\x6e\x5d\xab\xc6\x99\xc2\x86\x4f\x8b\xb7\xf8\xa1\xd1\xea\x2f\x15\x2c\x07\x0c\xec\xf3\xc5\x1b\x39\x52\x9a\x4a\xde\x76\x84\x5d\xd5\xeb\xb7\x98\x15\x75\xd1\x57\x02\xe6\x94\x7b\xb7\x01\x79\x23\xce\x61\xe8\xbe\x8d\x62\x52\x6d\x5f\xf0\x8f\xc6\xc3\xb5\x5a\x41\xee\x23\x6d\x7f\xab\x9c\x66\x59\xd2\xb9\x57\xfc\x69\x81\x76\xce\x1b\xc9\xf4\x82\xa3\xd4\x6c\xd1\xa8\x59\xbf\xd0\xb5\xe7\x34\xd4\x46\x73\x0c\x31\x5e\xfa\xda\x12\x60\xe6\x27\x49\x85\x08\x91\xf5\x41\xeb\xac\x42\xeb\xe5\x2a\xdf\x23\xc9\xdb\xc3\xb9\xfc\x8b\xbb\x50\xeb\xec\x26\x07\x51\x4c\xce\x51\x0f\xd6\x52\xd2\xd5\x35\x99\x5c\x97\x69\xaa\x67\xcf\xd1\xe4\x45\xc9\x4f\x98\x42\x30\x34\xba\x2f\x16\x6b\xd8\xeb\xfb\x24\xe6\x05\x96\xf8\xa0\x4f\xf0\x89\x3f\x98\xd3\x3e\x34\x4a\xd9\xc6\xd4\x81\x50\x44\xd2\x04\x4e\x59\xba\xa3\x13\xef\x17\xac\x06\x60\x21\xe6\x45\x03\x8d\x2d\x8d\x89\x62\x13\xd7\x7b\xb7\xcb\xab\x46\xe0\xc1\x13\x57\xd5\x1d\x5a\xcf\x89\xa5\xe1\x64\x31\xde\x4f\xa6\x51\xa5\x71\x27\x11\x8e\x1d\xe0\x47\x3c\xb1\x04\x0b\x92\xf2\x4f\x32\x49\xf1\xbe\xf3\xbc\x83\xcd\xea\x88\x7d\x28\x4a\x93\xee\x33\x3e\xf1\xc1\x58\x1b\x83\x48\x2f\x91\xef\x2b\x05\x86\x9e\x77\x70\x97\x7a\x69\xb1\x96\x94\x5a\x7c\x56\xfa\xba\xc2\x05\x82\x81\x92\x8e\x97\xf4\x5f\x64\x33\x57\xf8\x08\xfa\x39\x9c\x87\xd9\x66\x67\x70\xbd\x01\xbf\x43\x55\x87\xb0\x2d\x44\x1f\xdf\x88\x43\x4f\x57\x8b\x77\x68\xde\x94\x3e\x91\x23\xdf\x4c\x0a\x48\xaa\xb9\xf5\xb0\x67\xbf\x89\x50\xc7\x97\xee\xf5\xd0\x6d\x6f\x34\xae\xf3\x7b\xe0\xee\x8d\x81\x71\xa1\x73\x92\x7d\x22\xd4\x59\x65\xf6\xfa\xe0\x94\x5c\xb2\xb6\x09\xbf\x84\x8d\x9e\x00\x28\x2f\xb4\x95\x01\xd2\xaf\x8e\x59\x47\xa3\x64\xe1\xc7\x26\x84\x3f\x91\x23\xaf\x5a\x2d\x1e\x5a\xd0\x20\x34\xbb\x4b\x7e\x40\x19\x7e\x9d\x97\xd5\x2a\x3a\x7a\x92\xd8\xc7\xbe\x7c\x61\x27\x90\x18\x9e\xcc\x7e\x3f\xe1\xdc\xec\x9c\xbb\xb5\xc3\x4d\xef\x6c\xcc\x6d\xac\x20\x3c\x61\xe4\x9a\xac\xbd\xb9\x84\xd6\x8c\x3a\x31\xbe\x18\x3d\x3b\x53\xf0\x88\x4f\x38\x37\x15\xcc\x2e\x9f\xba\xec\xe2\xe2\x1d\xd1\x08\x40\x37\x0a\x01\xc0\x7c\xf8\x18\xcf\xa8\x26\xbe\xab\xb6\xae\xc1\x26\xee\xc6\xd9\xbe\x80\xa0\xe2\xdb\xca\xa0\x31\xcd\x1d\x8b\x69\x17\xfb\x65\x5a\xc8\x07\x99\x11\xe2\xe6\x04\x91\xd6\xfb\x9e\x3d\x3a\xf8\xb4\x54\xf5\x74\xed\x0b\x3e\x81\x30\x70\x48\x03\x1f\x04\xd5\xd5\xc2\x1f\x6e\xbd\x31\xc8\xb3\xd8\xf0\xa1\xcf\x4e\x6d\x3d\xe5\xb1\x11\x1f\x80\x4f\x62\x17\x0a\xf7\x05\xf3\x27\x35\x6a\xb9\x35\x0f\xf6\x97\x93\x06\x77\xc3\xb7\x7b\x7e\xdc\x23\x26\x21\x55\xcd\xf1\x0e\x8f\x86\xab\xd7\x43\x45\x8c\x40\xfb\xf9\xe2\x14\x7e\xcb\x24\x40\xec\x6b\xf4\xaa\x5a\xad\x0c\x77\x51\x3a\x6b\x71\x9e\x9c\x83\x60\xcc\x03\xe0\x4d\x1b\x46\x95\x42\x2c\x44\x1c\x7c\x01\xd3\xf2\xe1\xca\x79\x3d\x7b\xb5\x6c\x73\xa2\xd3\x29\x20\xb0\x68\x74\x1a\x76\xb0\x69\x5a\xc1\x13\x89\x43\x66\xd7\x89\xea\x8b\x74\xf8\xc2\x1c\x97\x6f\x00\xaf\xd9\x6c\x8c\x40\x19\xb4\x8c\xac\x76\x87\x94\xc0\xda\x86\x7b\xc3\x54\x99\xd3\x0d\xa1\xd5\x0e\xc6\x08\x68\x64\xf4\x2f\xd8\xb4\x3c\x44\x80\xaa\xd3\x6f\xed\xcf\x78\x1e\x22\x94\xaa\x95\x8b\x5d\xce\x43\x88\xa8\x09\xe5\x7c\xbc\x6a\x0b\x5c\xd7\x0e\x1e\xe8\x1b\x75\x2e\xb6\x73\xc0\x94\x98\xa7\xce\xd1\x68\x2d\xe5\xb6\x00\x90\x1d\x6c\x41\x60\x72\xc9\xa2\xbd\x1e\xce\x94\xfb\x1e\xc9\xe6\x97\x6c\xf8\x85\x8e\x1e\x7f\x8e\xa0\x42\xc8\x02\xb6\xdc\xed\xe4\xc7\x28\xce\x96\xf5\x04\x6c\xa8\x27\xc0\xb4\x9c\x5c\xca\x50\x8f\xd6\xf6\x95\xfe\x15\xfb\x13\xb6\xcb\x71\x93\x3b\x45\x57\x3f\x79\xd3\xd8\xd6\x50\x14\x4b\x4d\xd2\x7e\x65\x26\x31\xc4\x5b\xc6\x18\xad\x3c\xa7\x26\x6a\x87\x0b\xe7\x67\x79\x08\xfd\x0c\xe0\xf1\x57\xff\xa7\x9f\xfc\x77\x7e\xf2\x1f\xfc\x0f\x7e\xfd\xcf\xfb\x2d\xbf\xe9\x37\xfc\xb6\x5f\x82\xff\xec\xbf\xf6\xaf\xff\xe3\xfc\x57\xfc\xba\xbf\xfd\x57\xfe\x87\xbf\xf7\x1f\xf8\x8d\x7f\xcf\xff\x70\xfe\xb1\x0f\x34\x3c\xec\x70\x84\x10\x9d\x5a\x9d\xbd\x6d\x17\x6c\x9a\xfd\x10\x15\x1d\xac\xd6\xfd\xd0\xf3\x22\xe0\xdd\x91\x02\x4c\xe5\x35\x4b\x08\x7e\xb1\xad\xc6\x9c\x73\x6a\xf0\x39\x12\xa0\xbb\x44\xac\x90\xf6\x52\x5a\xa1\x47\x39\xb2\x8f\x00\x40\x58\x39\x1c\x59\x07\xcf\xb5\xcf\x23\x23\xfb\xa2\x99\xeb\x00\x46\x73\xdb\x85\xe1\xe4\x8a\x5e\xf3\x26\xaa\x45\xae\x99\x85\x34\x5c\xe8\x4f\x25\x79\x13\x74\x65\xc5\xe4\x40\x5c\x4f\xff\x42\x30\x89\x21\x87\xcd\x8e\x33\x15\x70\x79\x09\x5e\xc6\xec\xd2\x12\x55\x8b\xd8\xb7\x84\x9d\x13\xb6\x95\x7e\x59\xe3\x71\xd1\x00\x4b\x3d\x9f\x4c\xf2\xf1\x31\xa5\x8c\xb9\xf7\x5e\x49\x6f\x7f\x2f\x4c\x51\x11\x5c\x16\x98\xa6\x5f\x61\xd2\x04\x85\x9b\xd5\xc5\x7a\x61\xe9\x08\xef\x2f\xda\x6b\x76\xdd\x28\x80\x55\x72\xc9\xe9\x53\x1c\x5c\x3c\xbf\x2d\xb5\x2b\xe0\x9d\x21\x97\xe7\x7d\x94\x96\xb8\x3c\x92\xd1\xb2\xb4\xa1\xf4\x0b\x7d\x02\x8e\xc7\x33\x86\x07\x37\x78\x00\xd9\x91\x00\x53\xd0\xdf\x12\x14\x79\x39\x77\x3c\x72\x5e\x06\x8e\x07\x13\xc5\x27\xd4\x00\x65\x7d\x3e\xd8\xbd\xe6\x33\xf7\x15\x99\xcc\xf0\x2d\xc9\xdc\xfc\x32\xf7\x44\x43\x40\xeb\x7a\xee\x24\x74\xa7\x32\x6f\xc6\xec\x0e\x83\x0f\xd0\xc5\xe0\xf1\x8b\x42\xd5\x2b\xdb\xae\x8e\xec\x74\x1a\x63\xe5\x28\x55\x41\xa4\xa4\xd5\xac\x95\x70\x33\x5d\xd0\x3c\xf8\xf4\xf0\x01\x00\xbf\x17\x9a\xc4\x3f\xa1\xdf\x76\x71\x4f\x80\xbe\x5c\xe4\xe5\x45\xa8\x6c\x96\x86\x7a\xcf\x02\xb5\x99\x7a\x04\xea\xce\x9e\x63\x2a\xa7\x48\x89\x4e\x97\x75\x5f\x88\x8a\x51\xb1\x8c\xa0\x68\x6a\x9c\x59\x13\xe2\x05\x66\xef\xd7\x2e\xe0\x1f\x66\xdc\x20\x12\x12\x0a\x21\x85\x77\xfb\xd5\x28\x46\xb5\x7c\x62\x6a\x78\x78\x24\xb0\x66\x03\x78\x9d\x44\x67\x77\x09\x74\xe1\x25\xc4\xcb\x09\x3b\xee\xf8\x0d\xbe\xd2\xea\x45\x18\x22\x8e\x03\xf4\xfc\x44\x78\x8f\x8d\x92\xd3\x38\xad\xdc\xd5\x93\xcd\x2e\xf3\x18\x40\x5e\xc0\xbe\xcb\x17\x68\xe7\x46\x86\x1e\x95\x61\xdb\xaf\xb7\x18\x50\xf7\x05\x47\x8f\xd3\x3e\x96\x80\xe6\xfc\x50\x0c\x3f\x59\xe6\x93\x1c\x44\x46\x5f\x8c\x47\xc2\x93\x8b\xed\x80\x6f\x09\x68\x1f\x4d\x65\xa5\x3c\xe7\x8b\x72\x99\x47\xe4\xa2\x72\x87\x1b\xc7\x64\xbd\x3e\x56\xca\x35\x8b\x67\xa0\xb6\x46\x61\x28\x2b\x32\x5e\x3b\x7b\x99\x23\xec\x60\x5a\xfb\x46\x49\x64\xd8\x84\x04\xe0\x79\x04\x24\x70\x42\x20\xee\x6c\x0c\x83\x5c\xce\x8c\xe0\xda\x05\x12\x61\x55\x98\xef\x16\xb5\xed\x83\x1b\xf6\x5f\xf0\x15\xb9\xb6\x01\x55\xb9\xa2\x19\x4f\xbe\xb1\xb5\xd2\xc2\x59\xaa\x9b\xe2\xdb\x8e\x39\xb1\xeb\x6c\x6c\xf8\x52\x8a\xa7\xe7\x7c\x54\xfe\x05\x58\x9c\xc5\x19\x25\x25\x54\x11\xf3\x0a\x87\x09\xa4\x7b\x0a\x55\x0a\x32\x48\xd6\x26\x2b\xd2\x5d\x95\xb3\x13\x62\x63\x09\xaf\xf2\x11\x5f\xc8\xc8\xfa\x98\x59\xa7\x20\x45\xb9\x81\x15\xed\x96\x90\x43\x67\xaa\x34\xc8\xe9\x1b\x46\x1d\x10\x3e\x1c\x9b\x4d\xc9\x00\xfd\x1d\x8e\x7e\xf2\x5d\x48\x87\x40\xb7\x9d\x4a\x67\xd8\xe9\xed\x92\xb6\x52\xbd\x66\x60\x92\xa6\x2a\xb5\xd4\x6e\x9c\x7a\x18\x86\xce\x34\x57\x86\x87\x5f\x88\x96\x72\x1d\xe8\x4e\x03\x38\x17\xc4\x75\x7b\x2b\xa4\xcb\xac\xda\x88\xc5\xea\xc3\xae\x12\x4b\xe5\x44\x4e\x84\x28\x21\x97\x50\x4c\xe4\x7e\x01\x16\x0b\x48\xfc\x55\x5e\x8c\xd4\xa5\x4e\x71\x2a\xc4\x2d\x50\x40\xd5\x15\xe2\x18\xaf\x8a\xa9\xc6\xe0\x35\xea\x97\xaa\x36\xef\x6a\x5f\x18\x3c\xf2\x75\x8d\xda\x5b\x13\xa9\x19\x97\x0f\x40\x3b\x1a\x12\x93\x29\x85\xd5\xc3\x5e\x86\x56\x7d\xb5\xba\x0a\xa2\xb1\xcc\xe5\xd2\x26\xf6\x85\x62\x84\x62\xbc\x19\x51\xb7\xe3\x0a\xa2\x54\x22\x0d\x21\x5d\x10\xd4\x29\xc1\xba\x65\xb0\x1b\xdc\xdf\x8a\xdc\x7b\x54\x58\x65\x8f\xf1\x49\x27\x70\x20\xab\x26\x47\x3d\x61\xa9\x8c\x4b\x29\x6e\xc0\xf3\x75\x8d\x5d\xc3\x39\xb2\xce\x8d\xa5\x5e\xbf\x17\xc1\xa9\x80\x87\x55\xfc\x85\x98\x2d\xcf\xda\x12\xb9\x00\xc7\x47\x12\xc0\x8a\x7b\x4f\x51\xeb\x15\x84\x94\xa7\x00\x7a\x4f\xde\xa2\x5a\x39\x2f\x83\xd3\xbe\x8f\x9e\xe7\x0b\xa5\x32\x6e\x78\x0a\xc2\x4d\x54\x08\xc3\x20\x12\x3d\x06\xdf\x58\x15\x70\x8d\x80\x40\x3b\x79\xdd\x61\xcd\xfa\x07\x51\x0f\x4d\x1c\x59\x88\x2f\x22\x78\xdf\x70\xdc\x67\x67\xb7\x7b\x66\x62\x9c\x35\x5c\x56\x89\x77\x39\xc3\xc9\x9a\x18\x18\x73\x95\x7a\x8d\x58\xec\x85\x04\x12\xd2\x3e\x00\x7f\x38\x55\x3b\x78\xd2\x90\x75\xaa\x4a\xb9\x48\x2a\x32\xfa\xdb\xc1\x8b\x64\x84\x39\x97\x95\x97\x34\x87\x76\xa5\xad\x4d\x41\xe3\x18\xbf\xa8\x72\x1e\x66\xc1\x2a\xe0\x62\x52\xdb\xbb\xac\x1f\x0f\xc9\xef\xf1\x4e\xc9\x6d\x0b\xb4\xa4\xbb\x57\xcd\x20\x48\x9c\x14\x92\x95\x74\xe1\x5f\x74\x88\xb1\x17\xd2\x02\xdd\x45\xa3\xfb\x38\xe0\x50\xe1\x0d\x7b\x8a\x0b\xa6\xfa\xe1\x55\x21\x04\x33\x4a\x6f\xcd\x63\x56\x87\x63\x25\x5f\x6c\x22\x70\xd7\xee\x33\x07\xb8\x79\xcf\x94\x4d\x08\xc5\x93\xb7\xf5\x69\x9a\x12\x11\xa2\x49\x1f\xfd\xe8\x86\xd7\x56\x8a\x48\x03\x75\x37\x3f\xcb\xee\xe4\x67\x00\x8f\x7f\xf3\x97\xfd\x89\xdf\xfe\xfe\xda\xdf\xfa\xfb\xfe\xe2\x1f\xfb\xeb\x3f\xb5\x7f\x55\xfd\x25\xff\xf3\xef\x44\xbf\x8f\xfc\xbb\x3f\xf9\x97\xff\x3f\x7f\xe2\xfc\x86\xf7\x2f\xfc\xd9\xff\xdf\x07\x0c\x0f\x50\xd7\xa5\x24\x5d\x5b\xcb\xaa\x53\xf5\xcb\x37\xf5\x41\x75\xa6\xcc\x24\x10\x97\x27\x16\x03\xb7\xb4\x67\x85\xf7\x87\xba\xe4\x7d\xbe\x68\xe6\xca\xab\x65\x4e\xcb\x3f\x11\x48\x8e\x9e\x1b\x6e\x25\x00\x9b\x87\x1c\xba\x1a\x50\x70\x9a\x64\x01\x02\x51\x39\x22\x98\xec\xcc\x3c\x9f\x14\x24\xe0\x14\xe9\xe0\x33\xc7\x1b\x73\x26\x4f\x1b\xcb\x97\x3e\x76\x82\x08\x06\x08\x54\xbb\x43\x55\x30\x00\x91\x21\x70\x5e\xb2\x3d\x5f\xac\x2e\x0c\x76\x6e\xb0\xe8\x39\x4f\x75\xf4\x60\xab\x14\x55\xd8\x42\xf9\xf4\xe0\x1f\x65\xd4\xd3\x51\x82\x0c\x04\x35\xfb\x45\x30\xe9\xdc\xbe\x40\x11\x5d\x7a\x0e\x31\x73\x0c\xa9\x37\xd4\xa5\xab\xee\xc8\x76\x29\x15\xee\x38\xe5\xdd\xe8\xe7\x3a\x98\xd1\x21\x0d\x74\x00\x18\x3f\xf1\x8b\xef\xc2\xd3\xa9\xcd\xa2\x33\x9d\x8c\xc6\x3e\xa2\xb5\x13\x47\xd2\x44\x02\x57\x6b\xbf\xa5\x6f\x06\x78\x1d\x67\x38\x3c\x87\x84\x64\xf7\x2f\xca\x65\xcd\x02\xcd\xd3\x5c\xf4\xcc\x72\x9e\x0e\xb3\xb0\xb9\x88\x54\xac\x00\x2e\x49\xed\xf6\xd1\x62\xcf\x73\xdc\xcd\x4f\xb1\xcc\x0f\xf1\x89\x2d\x2d\x6d\x9e\xbc\x67\xcb\x5a\xe9\xb1\x71\xc3\x13\xbd\x69\xd9\xa5\x19\x49\xb0\xfe\xe6\x26\xe0\xe6\x14\x87\xb5\x10\xd7\x4f\x35\x9f\xd0\xf5\xa7\xb2\xdb\xea\x9b\xc0\x94\xf0\xaa\x07\x32\xb7\xb0\x7a\x8b\x64\x50\x5b\x0b\xaf\x57\x18\x9e\xfe\x80\x5c\x8d\x01\xd7\x51\xf3\x7e\x61\xdd\xcc\x33\xdc\x54\x84\x9d\xd4\x0f\xf7\xdf\xc8\xbe\x85\x70\x6c\x2f\x5c\x13\xf5\x01\x7e\xe8\xa8\xe0\x8a\xf4\x39\xcf\x40\x9a\x19\x30\x60\xfb\x22\x5e\xa8\x02\xe7\x63\x3c\x5c\xb8\x6c\x93\x0e\xb9\x7b\x48\xff\x5c\x36\x36\x69\xcb\xf6\x8a\x0f\x89\x0e\xb4\xb9\xe2\x7d\xf6\x8c\x53\xf4\x2f\x26\x30\x46\xe7\xb5\xd0\x6d\x77\xb4\x48\xf1\x8b\x86\x87\x14\x68\x65\xf0\x41\xbe\x24\xaf\xa0\x6e\xf2\x68\xb7\xc5\x5b\x19\x84\x24\xb8\x4f\x98\x3f\xa4\xbc\x19\x75\x9b\xb1\x38\xa8\x58\x5f\x47\x03\x0d\xd2\x38\x0b\x84\xc7\xc1\x3b\xcd\x01\xcf\xa9\xe7\x87\xfc\x41\x40\x81\xc3\x7c\x31\x43\xe7\xe3\x80\xee\x27\xa0\xf3\x04\x11\x5e\x9b\xb3\x99\x13\x84\x3c\x23\x62\xbb\x3b\x09\xa0\x09\x24\x0b\x0e\x09\xd3\x4b\x2d\x5a\x1a\xfc\x62\x92\x5f\xce\x89\x6d\x0d\x83\x25\x03\x7d\xcf\x7a\x90\xdd\x89\xd1\xfd\x3e\x37\x3a\xba\xde\x53\xfc\x05\x36\x5e\x0b\x63\xc7\x2f\xa2\x65\x7c\x01\x84\xb5\xec\x8e\x9f\x4a\x23\x29\x9a\x44\x5a\x66\x54\xa6\xdd\xc5\x8a\x71\x11\x60\x24\x6a\xa9\xc7\xd5\x79\xbe\x99\x5e\x58\x5d\x74\xe0\x8b\x37\xb2\xb9\x57\xcc\x5a\xe0\xd8\x6b\x3d\x7d\x0f\x48\x9a\xbc\xf4\x84\x58\xdf\xa2\x4d\x29\x2f\x14\xde\x15\xca\x68\x41\x36\xdb\xc8\xfa\xfd\xc2\xa5\x65\x3f\x21\x6b\x6a\x56\xb5\xef\xb1\x0f\xe5\xd7\x89\xbb\xe6\x41\x4d\x03\x1e\xc3\x6a\x8d\xd3\x3a\x0e\x30\xdb\xc1\xbb\xf7\xf4\x7e\x7c\xb1\xde\x83\x8c\x61\x99\x5c\x10\x88\x3a\x16\x40\x14\x45\x92\x82\xd0\xce\xae\xe6\x7d\xaf\x59\x27\x56\xa2\x07\x4e\xf0\x50\x4b\x6b\x0d\xef\x17\x8a\x11\x0f\xc3\x47\x13\xec\x31\xda\xb4\xa1\xd7\xf3\x9e\x2f\xee\xfb\xd9\x85\xda\x20\xf0\xe8\x66\x1d\xa6\x56\xb3\xf3\xae\xa7\x17\xa8\xbe\xf0\x8a\x61\xb9\xf2\xa2\x40\x08\x0f\x72\x59\x9a\x47\x5a\x0e\x6c\x99\xba\x8b\x19\x94\x42\x4a\xcb\xd1\xa7\x66\x71\xe0\x78\x34\xe1\xa9\x6d\xfe\x05\xab\x61\x66\xe3\xc2\x7c\x21\xe3\x32\x8f\x3c\xf8\x88\x0b\xcd\x76\xfa\x1e\x38\xbe\xda\x76\x68\x5b\xe0\xba\x54\x41\xa5\x20\xfc\x4d\xe2\xf9\x42\xfe\xcf\x5f\x47\xfb\x3e\x7e\x36\x59\x90\x02\x1e\x83\xb4\x51\xf6\xfe\xe0\x56\xf5\xda\x1c\x40\x5f\x58\xb8\xac\x88\x73\x16\xc8\xb2\x7f\xf2\x75\x82\x7a\x53\xa0\x72\x3f\x0f\x4d\x19\x85\x05\xf1\x51\x98\xb8\xe1\x01\xd8\x44\xc7\xd5\xc9\x50\xe0\xb6\xae\xf0\x7d\x3d\x18\x2f\x93\x5f\xac\x46\x26\x98\x7d\x36\xa5\xd0\xec\xd7\xf2\xfc\xa4\x52\x1e\x61\xa4\x2b\x41\xa4\x08\xf3\xdb\xbb\xb8\x3c\x32\xcb\xce\x36\x6f\x2d\x51\xf0\x2f\xee\xa2\x0f\xb7\x64\x1f\xc8\x31\x92\x55\x0f\x2e\xc5\x9a\x0c\x44\x99\x24\x9d\x50\x6f\xdc\xe8\x53\x5c\xc1\x88\xb6\xb9\x39\xce\xbc\xb2\x2f\xd6\xca\x6f\x1b\xf6\x1d\xc4\xe5\xda\x56\x59\x98\x52\x57\x3d\x89\xa4\x01\xd2\x3d\xc0\x6b\xf3\x68\xed\x0f\xc1\x84\x89\x7d\x0b\x2d\x99\x81\x2f\xd6\x7b\x0a\xde\x2a\x26\x18\x92\x17\xac\xf5\x74\x49\x1c\x4b\x12\x5d\x91\xbe\xec\xed\xb2\xa3\x7c\x91\xb4\x62\x50\x36\x9e\x70\x7b\x70\x9f\x78\x82\xc4\x53\xa7\x9d\x14\xb0\x4c\x44\x44\x57\x40\x8e\x05\x3f\x08\x31\x0c\xdd\x2d\x49\x4e\x4f\x3c\xef\x07\xa0\x8c\x40\x7e\xa1\x7a\xfa\x17\x8b\x78\xa6\x71\x27\x19\xe3\xfb\x87\x7f\xfa\x5a\x62\xc2\x05\x56\x1b\x8c\xb5\xdd\xe9\x70\x49\x94\xf3\xda\x8c\x47\xa2\x26\xea\x0f\xfd\xeb\x27\x75\xe7\x6a\xfa\x99\x0c\x05\xee\x2f\x96\xf2\x8e\x4e\x2d\x90\x28\x49\x10\x08\x67\x13\xd0\xc4\x21\x10\xcb\x05\xca\x68\xe2\xf2\xfa\xd5\x3f\xf0\x28\x64\x9e\x83\x78\xc0\x3b\x03\xe1\xfb\x2a\xc3\xdc\x68\xf3\x81\x23\xd7\xbe\x56\x3c\x8f\x6e\xc8\xac\xb0\x0c\x48\xfb\xbd\x86\x6d\x1c\x9a\xf8\x39\x80\xc7\x4f\xfc\x47\xff\xd6\x3f\xfc\x27\x9b\xf8\x57\x7f\xcf\xdf\xf1\xe7\x7f\xcd\xbf\xfc\x07\xfe\x05\xf8\xff\xfd\x05\xf0\xff\xf8\x8b\xfe\xbb\x7f\xf2\xff\xf2\xff\xfc\x09\xfd\x9b\xff\xc8\x3f\xf7\x9f\xff\xf7\x1f\x00\x1e\xd4\xde\xd5\xea\x9b\x05\x07\xb9\xe4\x59\xb0\x3c\xbb\x84\x84\xd4\x8b\x23\xe3\x32\x98\xfa\x56\x2b\xf7\xc3\x03\x58\xf7\x8d\x07\xf5\x2f\xb4\x99\xe5\xe3\x48\x7a\xf4\x60\x04\x6d\x73\x43\x9f\xfa\x56\x0d\x77\xc0\xcb\xa0\x91\x09\x7d\xdb\x2e\x9c\x1e\x30\xb9\x6f\xf8\x9a\xf1\x80\x2f\x68\x53\x9d\xae\xf0\x6a\x95\x52\x27\x31\x4e\x4e\xd8\xd3\x79\xa5\xf3\x7d\xb0\x0e\x30\xd1\x16\xc2\x0c\xda\x66\x84\xdf\xb7\xa3\x40\xcf\xfc\xa2\x99\x63\xe1\x11\x3b\x59\x64\x34\xb6\x6a\x16\xaa\x1f\xd1\x03\x63\xad\xc1\x3c\x9e\x0e\x01\x88\xc2\x38\xc2\xf5\xee\xd5\xf4\x1a\x60\xd2\xec\x8b\xbb\xb8\x9d\x93\x13\x62\xf7\x52\x72\x6b\x76\x05\xa9\x48\xef\xf7\xb9\xee\x09\xc7\x43\x7d\x7b\x3c\x74\x9d\x51\x1f\x67\x7c\x98\x3c\x7e\xa1\x5f\xce\x4a\x52\x86\xcb\x87\x91\xf0\x3a\xef\x97\x7e\xa1\x0a\x0c\xbc\x53\x10\x71\x44\x7f\xe1\xe4\xf5\x88\x97\x14\x07\xda\x48\xd3\x32\xfe\x7c\xd1\x52\x76\x4a\x84\xe2\x79\x2d\x33\xf3\x0e\xe8\x6d\xfd\x91\xb4\xcf\x31\xb2\x1c\xbd\x8f\xa8\x59\xe2\x6e\x3f\x21\x98\x56\x9a\x5c\x96\x86\x2f\xe4\x42\x2b\x86\x48\x64\x2f\x04\x66\x96\x2f\xb4\x6b\x90\xbb\x26\x9a\x0f\x8d\x0f\xa7\x86\xb1\x0a\xe2\x40\xed\x48\xac\x28\xbc\xfe\xbd\xe7\x0b\x9a\xa5\xdb\xd5\x4e\x1f\x89\xbb\x56\x38\xcc\x9b\x53\x09\xb5\x08\xa2\xaf\x03\xcd\x5e\x17\xde\x78\xd7\xa0\x9a\x46\x33\xad\xcb\xe1\x00\x5f\xcc\x81\x06\x06\x2a\x80\x1f\x0e\xb3\x76\x93\x52\xdb\x80\x74\xc9\x8f\xd3\x15\xa7\x91\xa8\x35\x17\xcf\x8d\x3a\x1a\x36\xd9\xd7\xe6\xb7\xc2\x0f\x0a\x12\x46\x56\x3e\x92\x11\x08\xb0\x71\x64\xea\x70\x1b\xc6\x7b\x96\xe2\xd8\xc1\x86\x55\x13\x3c\xde\xd9\x07\x38\xdb\xdb\xb2\x49\x51\xb1\x2f\x66\xa5\x7c\xf7\xdc\x56\x78\x0b\xd9\x8e\x95\x3e\x75\x97\xa5\xe8\xcb\x2a\xe3\xbd\xc6\xf7\xa6\x62\x5f\x16\x04\x1d\x83\x80\xb2\x51\x4d\xf7\x8b\xbb\x70\x7a\x2a\x11\x0c\x22\x85\x42\x1b\x74\x75\xb1\x51\x21\x37\xd5\x25\x4a\x22\x62\x51\x78\x40\x93\x33\x72\xc2\x70\xf4\x86\xd2\x9f\x2f\x40\x41\xa0\x38\x88\xcc\x20\x2f\xe5\x25\x6e\x25\x38\x62\x9e\xea\x89\x42\xee\xcc\x07\x61\x1b\x95\x90\x0b\x0a\x01\xec\xe4\xa8\x57\xf4\x13\x91\x63\x73\x68\x59\x1a\x96\x45\xea\x7b\x0e\x99\x73\x40\xf2\x8e\x95\x2c\x22\x0a\xbb\x4e\x4d\xf0\x80\xc9\x5c\x44\xd7\x19\x63\x31\x50\xf8\xe2\x14\x93\xfd\x50\x0b\xb7\x7a\x4b\x83\x77\x3d\xb8\x06\xe4\x8b\x1c\xf2\x42\xbb\x16\xdd\xd3\x31\xc1\xdc\xbc\xf7\x64\x27\xb6\x1e\xcc\x7c\xa2\x24\xe2\x81\x3e\x55\x3b\xe2\x72\x34\xad\x40\x0f\x6e\x9c\x3e\xb7\x14\x40\x27\xf1\x71\xf0\x25\x43\xee\x4b\xa6\x5a\x8a\x39\x8d\x63\xf9\x44\x0b\x0a\x3f\x14\x8b\xa8\xbb\xa6\x8e\xa6\x01\x5f\x27\x09\xb5\x01\x33\xb6\xde\xc2\x46\xe1\x5a\xdb\xeb\x40\x72\xc9\xc0\x04\x1e\xfc\xea\xfe\xc5\xac\xd4\x70\x10\xcc\x3b\xde\xb2\xeb\x15\x1e\x74\x71\x1f\x76\x31\x1f\x4d\x05\x9f\xf5\x79\x32\x23\x7a\x30\xa4\x87\xaa\x98\xf5\x25\xec\x27\x12\x99\x69\x0f\xbb\x39\x0e\xa1\x82\x1f\xaa\xd1\x73\x7b\x84\xb1\x29\x0b\x97\xc6\x71\xf0\x6d\xb6\x65\xf8\xd5\x80\x9a\x99\x4e\x19\xc0\xcb\x2f\x22\x38\x50\x7d\xa5\xfa\x9a\x03\x57\xa1\x9d\xdb\xa1\x5e\xce\x58\x37\x91\x5a\x8d\x54\x4d\x32\x29\x19\xa4\x45\xae\xa1\x1c\xf9\x76\xcf\x27\x51\x6b\xa9\x7b\x1d\x67\x8b\xdd\x1a\xc3\x80\xdb\x71\xba\x5e\x8d\x75\xa1\x00\xf3\x4a\x04\x3f\x25\x41\xc8\xec\x74\x71\xbc\x9e\x32\xe1\xbf\x00\x48\x0d\xcf\xac\x0f\x5f\xfb\x99\x4f\x75\x8d\xeb\x49\x99\x3b\x55\xe6\x4a\xcb\x0f\xcd\x9c\xaa\xaf\xe3\xd9\x44\x3c\x2b\xb2\xcf\x4e\xce\x7d\xf1\x5d\xbc\xb2\x41\x96\xa9\xca\x9c\xfa\xe3\xcf\x8a\x7c\x2d\x8c\x36\x5e\xda\x20\xd7\x97\xba\xe0\xf0\xb7\x90\x0a\x03\x4a\x7c\x3c\xe0\x7e\x62\xb2\xae\x83\x4f\x9c\x47\x6b\x76\xf4\x9a\x05\xf2\x96\x0d\x30\xac\x24\x77\x98\xfb\x0b\x9f\x28\x0c\xf1\x45\x38\xf5\x58\x73\x8c\xc1\xf0\x13\xd5\x36\x71\x64\x6a\x53\xec\xfb\x50\x64\x34\xd7\x5c\xa2\x52\x76\xc3\xb5\xca\x85\xe9\x48\x6a\x58\x95\x66\x38\x69\x2b\x23\x86\x70\xf3\x13\x5d\x2c\x64\xc9\xdb\x2f\x3d\x16\xd4\xac\xb9\x62\xa9\x20\xdf\x23\x03\xf5\xe6\x89\x70\x5d\x9d\x4a\x2d\xa5\x7b\x1f\x07\x42\x49\xc6\xe6\xf1\x05\x28\x78\xcc\x30\x4a\x27\x01\x70\x0b\x95\xa6\x36\x1b\xd4\xc3\xed\xb2\x7a\xd3\xc1\x47\xf4\x48\xbf\xbb\x4c\x0a\x3d\xb2\xbe\xd0\x9f\x4f\x6a\x2d\x3e\x26\x5f\xd8\xd1\x71\xcc\x33\x4d\xf2\x60\xe3\xb8\x60\x11\x6f\x99\xb9\xc1\xed\x84\xf1\xbd\x6c\x5a\x3a\xb6\x9e\x9d\x27\x22\xe5\xbf\x00\x7f\x10\xd3\x50\xb7\x72\x0a\xbf\x92\x15\x54\x4a\xed\x61\x60\x6b\x0a\x18\x8a\x8c\xd6\xa8\x2d\xca\x83\x14\x69\xd2\x6b\x1e\xb3\xf1\xfd\x00\x8e\x63\x23\x43\xdb\x63\x82\xa2\xd3\x71\x14\x35\x44\x80\xe6\x47\xc8\xaf\x76\x2f\x91\x67\x91\x1c\x5e\xdf\x62\x09\x5d\x58\xe1\x1b\xd8\x9f\x64\x76\x1a\x93\x8d\xb2\x2a\x6d\xab\x07\x9d\xcf\x9e\xad\xca\x50\xe1\x8b\x07\xaa\x3c\x76\x54\x8c\x08\x8f\x12\xc7\x07\x6c\xd4\xbc\xee\x67\xad\x95\xff\x0c\xe0\xf1\xbb\xe9\xdf\xf9\x9f\xfc\x13\xcf\x5f\xfd\x2b\xff\xe5\xcf\xff\x53\x7f\xee\x3f\xfd\xd5\x3f\xf5\x0b\xff\xaf\x7f\x94\xfc\x8d\x5f\xfd\xd7\x7f\xa9\xfd\x33\x7f\xfa\x8f\xfc\x89\xff\xe2\x2f\xfd\xdf\xfe\xe0\x07\x80\x47\x8c\x5d\x54\x5f\x6d\xe1\x47\xf9\x74\x9d\x83\xd8\x8c\x95\xbc\xcd\x61\xc7\x55\x5e\x34\x62\x13\x03\x0b\x46\x76\x7d\x86\x74\xcf\xf9\x82\x5a\x68\xb2\x08\x7d\x82\x8a\x56\x8b\x45\xe3\xf1\xc8\xf7\xee\x04\x7a\x1e\xa3\xd4\x91\xd2\x14\x16\xbe\x94\x69\x02\xf2\x06\xec\x6d\xe5\x13\x3e\x01\x83\x5d\x82\x47\x0d\xbe\xd4\xed\x6e\xc8\xcb\xdb\xb5\x8f\xb8\x3b\x8d\x59\x9f\x9d\xd9\x96\x39\x26\x46\x6b\xa0\xe6\xac\x47\xc9\xf1\x45\x12\x2e\xf9\x06\xde\x02\x73\x71\xc1\x24\x8a\x45\x85\xf3\x18\xee\xb4\x4a\x11\x6b\x7e\xc8\x33\x7d\xfb\xd4\xdc\xa3\x5b\x95\xb6\xb1\x2b\xbe\x80\xa0\x00\x64\x33\xb4\xe7\x30\x9c\x70\xae\x76\x64\x4f\xb1\xb1\x3c\x6d\x8e\x27\x48\x4e\xc4\xf9\x8a\xdb\x88\x23\x77\x22\x5d\xa6\x22\xee\x0b\xf0\xa7\x73\xa2\x3c\x2c\xaf\x01\xc0\x5d\xa6\xed\xab\xcc\x74\x01\x96\x97\xb9\x2d\x67\xc7\xaf\x91\x40\xa1\x4e\xba\x48\x12\x92\x5c\x5f\xf6\x05\xa2\x6a\xb2\xb6\xf6\x0d\x88\x15\x33\xc6\xbb\x8c\x7f\x4e\x79\x01\xb0\x32\x07\x26\xa9\x3d\x8e\x8d\x7c\x80\x59\x46\x61\x95\x99\x6a\xe7\x7e\x22\xec\x6b\x68\x16\xd9\xd0\xc6\x73\x0f\x26\x1f\x79\xd5\x03\x8c\x1b\x22\xed\x60\x99\xaf\xda\x89\x28\xed\x2a\xdb\x08\x17\x58\x20\x12\x7e\x62\xa1\x57\xde\xb9\x7e\xe8\x0b\xb2\xa2\x23\xd1\xfe\x82\x03\x65\x89\xb3\x93\xad\x3c\x82\xf9\x65\x89\xc1\x35\x91\xf2\x08\x3d\x5c\x98\xf1\x85\x08\x21\xcf\x54\xf1\x53\x58\xb0\x80\xbc\x9d\x91\xc3\x67\x9c\x2b\x21\x49\x03\xcf\x10\xf0\x19\x90\xb3\xee\xa1\x4f\xe5\x02\xd4\x68\x93\xf8\xc2\x98\x8b\x13\x50\x26\x0a\xb1\xd7\xd1\xde\x8e\xba\x87\x71\x86\x45\xda\xcb\x55\xa9\xd3\x43\x6c\x89\x7c\xb5\x00\x29\xcc\x8b\x32\x34\xbb\x87\x2f\xa2\xd6\x09\xce\x83\xab\x91\x77\xc5\x0e\x27\xad\x7a\x83\x73\x40\x55\x2e\x8e\x99\xc1\xd2\x54\x4d\x22\x4e\x23\x88\x28\xec\x21\xf1\x25\xbf\x88\x17\x8d\x57\x10\xcd\x72\x58\x2a\xf1\xc6\xba\xa9\x06\xfb\x15\x35\xe6\x61\xde\xe7\xfa\x93\x27\xa7\x52\x81\x43\xd0\x01\x50\x48\x41\xc5\x07\x53\x07\xfe\xf6\xf7\x8a\x21\x25\xf7\xb1\x62\xec\xad\x45\xa6\x7b\x4e\x56\x45\xc0\x30\xcb\x37\x89\x07\x7b\xcc\x41\xa6\x8c\xb9\x64\x4a\x3b\x5f\xa8\x24\x88\x73\x54\xd6\xf0\x4c\xb7\xf2\xd8\x39\x75\xa2\xdb\x35\x20\xdb\x99\x71\x1f\xec\xe9\x3d\x6e\x45\x1f\x6a\xda\x89\x92\x5a\x5e\xfb\x17\x22\x84\x28\xc9\x88\x63\x20\x5c\x16\xf4\xf0\xb3\x51\x41\x44\x90\x25\x4a\x16\xfb\xc5\x85\xf4\x3d\x12\x47\x89\x43\xa0\xd6\xab\x4f\x22\xed\x0b\x9e\x09\x34\xd9\x73\xbd\xc7\xf0\xdc\xd7\xda\xa9\xeb\x9c\x7b\xf2\xe0\x4b\x6f\x5d\xcc\x1e\xb9\x7c\x2a\xf7\x48\xb6\xb0\xe7\xba\x27\xf0\x89\x9e\x09\x6d\x5d\x0d\xba\x9b\xbe\x9e\xa8\xd5\x59\x21\x9c\x94\xb3\xa5\x92\x1b\xf1\x23\x8e\x8b\xc9\x5e\xb2\x51\x11\xef\x68\x90\xc7\x02\x3f\x71\x5d\x68\xed\xb9\xc3\x33\x30\x39\x27\x68\x58\xba\xa3\x8d\x40\x1a\x5c\x99\xc6\xb7\xbe\xb3\xe1\xa2\x73\x37\xda\x84\x27\x8d\x06\x9f\xfe\x45\x7d\x01\x32\x0a\x32\x34\x6b\x68\xa5\x52\xda\x5d\xa4\x56\x4d\x8f\x24\xed\x39\x61\x1a\xd5\xde\x37\x6e\xb5\x16\x8c\x32\x03\xdd\x7e\x88\xa9\x5f\x28\x03\x60\xf7\x68\x15\x7b\xea\xc7\x35\xc4\xea\x4c\xbe\x75\x43\x61\x8e\xaf\xb0\x76\x02\xc9\xd7\x8b\x24\xa5\x0b\x8d\x0a\x8d\x54\xf2\x93\x55\x27\x32\x73\x6d\x3a\xbb\x35\xc7\x98\xef\x5c\xc4\xd4\xb6\xcf\x43\xa8\x2e\x34\xcc\x63\x7b\x67\xef\x58\x40\xd2\xa3\xe9\x83\xd0\x04\x9f\xf8\x1d\x24\x5c\x6e\x14\x92\xc6\xa3\x18\xa1\xa6\xf5\x39\x01\x88\x8e\x12\x4d\x02\xb6\x37\x02\x2a\x65\xc5\x18\xdf\xcd\x68\xbb\x3d\x0f\xfe\x85\x51\x30\x45\xe0\x44\x30\xf6\xbe\x32\xbc\xa4\x3a\x06\xeb\x72\x9d\xbb\x81\x1f\xa6\x9e\xe6\xd9\xbe\x03\xee\x60\x2c\xf4\xa5\xeb\x38\xec\x27\x92\xfd\x43\x63\x0b\xd4\x98\x4a\xac\x1c\x30\x4f\x30\xf1\x12\xce\x1d\x02\x62\x63\xe6\x9b\xb6\x70\x0c\x87\xe7\x0d\x9e\xb5\x62\x6c\xb0\xf2\x8b\xc6\xf6\x98\xde\xdb\x46\x05\x12\xdf\x10\x7e\xbd\xd8\x2b\x3d\xb5\x52\x81\x7b\xd0\x47\xb2\x8d\x45\xa9\x90\x0b\xd2\x87\x17\x76\x3b\xf2\x85\x4c\x3d\xdb\x98\xc9\xca\xf0\x22\x75\x3e\xda\x84\x52\xb2\x28\xee\x39\x8a\xc9\xfa\x50\xde\xf8\x59\xfc\xf6\x86\x85\x44\xe1\xe4\xcb\x87\xff\x42\xdb\x85\x5f\xd0\xe7\xc3\xa5\xa3\x96\x1d\x62\x80\xe3\x28\xad\xa9\x80\x46\x17\x5a\x56\x50\x56\x14\x59\x23\xf9\xeb\x94\xeb\xa4\xaa\x35\xc0\x17\x40\x18\x46\x39\xbf\xd1\x78\xd5\xd5\xe8\xea\xec\x24\x46\xb9\xfd\x45\x6a\x26\x44\xe9\x02\x0e\x72\xfe\xba\x57\x67\x98\x49\x98\x63\xd1\xf0\x05\xab\x21\x62\xec\x9e\x95\xe5\xcd\xeb\x4e\x84\xa4\xf2\xd6\x99\x73\x6e\x39\xb4\x02\xbd\x5c\x6b\x21\xc3\x9b\x8c\xc0\x12\xf7\x52\xf6\xfc\x64\x1d\xb0\x25\xa8\x34\x1e\x88\x8b\xe4\xea\xd1\x8a\x0e\xab\x67\x35\x2b\xa4\x60\x5f\x0e\x16\x4c\xf1\xdd\xc5\xbd\x95\x41\x62\x5a\xe6\xb5\x7d\x31\x50\x69\x12\x9b\x8e\x56\x03\x0c\xa3\xc1\x92\xac\x47\x03\xac\xce\x88\x5b\xcd\x10\x2b\xaf\x1e\xbb\x6a\x5d\x49\xa2\xb8\xfb\x48\x7b\x7e\x16\x55\xe2\x67\x00\x8f\xff\xf7\x9f\xf9\x83\x7f\xec\xdf\xfe\xc3\x3f\xff\x0f\x89\xbf\xf4\x2f\x89\x7f\xff\x97\xfe\xca\xf1\x17\x7e\xef\xf3\xc7\x7f\xe2\x57\xfc\x53\xbf\xee\xef\x0b\xbf\xf6\x27\xff\xae\x5f\xf3\x7b\x7e\xd3\x07\x1a\x1e\xb7\x02\x1e\x70\x39\xde\x97\xf1\xe0\x5b\x1e\x61\xc4\xb0\x51\x26\x91\xf8\x82\x35\x5c\xe0\x54\xdb\x28\x44\xf2\xc2\xa6\xcf\x9c\xe0\x0b\xf9\x3f\x67\xc1\x2c\xba\x8b\xde\x58\x0e\x0a\x69\x98\x81\x83\xd8\xf5\xf8\xbe\x3b\x87\xd4\x51\xc5\x27\x5f\xec\x5e\x87\xfa\xf3\xea\x3a\xe2\x17\x3b\xf9\x38\x3c\x77\x09\x32\x07\xdb\x20\x41\x2a\x5a\xb5\xf8\x41\x2b\x62\x7f\x43\xbd\x69\xc1\xf2\xbe\xb8\xa0\x86\x2c\xb3\x20\xf8\x90\xd9\x17\xcd\x5c\x7b\xa5\x56\x2c\x84\xec\x51\x0a\xe1\x4a\x93\x91\x98\x76\x9b\x09\x28\x7e\x1e\x39\xdb\x6d\xc8\x4c\xbe\x03\x00\xef\x32\xe0\x01\xee\x8b\xfd\xc1\x07\x08\x02\x42\x41\x06\x0b\xf2\xac\x35\x89\x09\x18\xd9\x9e\x10\xad\x03\x6f\xb8\x43\xd0\xd5\x12\x78\x93\xa5\xc8\x72\x84\xaf\xf8\xc2\xa4\xcc\x1a\x72\xfb\x5b\xae\xb8\x9e\x9c\xe7\x5d\x4a\x9e\x14\x24\x63\x0c\x74\xb1\x83\xd6\x33\x64\xa4\x37\x02\x3f\x34\x19\xc6\xda\x95\xef\x17\x2d\xe5\x76\x9d\xee\x62\x22\xf6\x8f\x4b\xe5\xb9\x44\x46\x6d\x98\x42\xa1\xc2\x0a\x6e\xbb\x43\x16\xb4\xec\x99\x73\x80\xae\xfb\x8a\x61\x7c\x81\xf7\x83\xa3\x5f\x8d\xc5\x61\x87\xb3\xfe\x5e\x79\x61\x4e\x25\xd1\x51\x8f\x72\xe8\x39\xed\x51\x8e\x98\x60\x1b\x61\xed\x61\xfc\x9c\xe5\xbe\x20\x87\xe3\x73\x63\xf0\x17\xc1\x96\x1f\xdb\x32\x63\xea\x45\x0e\xc4\x42\xd4\x8a\xad\x57\x54\x42\xa5\x88\x51\xc0\xf9\xa5\x30\x44\x76\x3e\xf9\x45\xd8\x6e\x1e\x0d\xf1\xdc\xd6\x1f\xac\xa4\x04\x72\xd6\xc1\xd5\xe2\x77\x18\x6f\x82\x35\xfe\xd5\x52\x8b\xb5\x94\x9a\xa7\x58\x24\xc4\x17\x54\xe4\x34\xba\x7f\x8e\xea\x93\x9e\x71\xee\x48\xe8\xa5\x61\xb6\xb6\x8d\x3d\xe8\x7a\x56\x9c\xc5\x8f\x19\x24\xf2\x14\x8c\x34\x0f\xbb\x9f\x08\x3e\x3b\x3a\xb4\x37\xc7\x61\xdd\x9c\x20\xde\x05\x62\xaa\xc0\x1c\x35\xd6\x0e\x02\x6b\x36\x61\xd5\x3b\x5b\xf2\x85\x69\x01\x5b\x39\x9f\x34\x30\xdd\xc9\x52\x1e\x5d\x2b\xca\x2b\x40\xc7\xd4\xbd\x8e\x62\x33\xc4\x4b\x80\x75\x92\xd8\x54\x06\x4b\x50\x31\x43\x9d\x8c\x48\x9a\xf3\x09\x45\xfd\x7d\xea\x8a\xa1\x08\x53\xde\x56\x53\x45\xe1\xc2\xa9\x3c\x1f\x12\x6e\xb8\x20\x77\xaf\xc8\x64\xc6\xf0\xd3\xc6\x63\x0a\x11\x73\xbe\x30\x16\x27\x64\x88\x22\x34\x9f\xf3\x59\x69\x8c\xb3\x4d\x53\xe0\x45\xef\x1c\x5b\x4b\x80\xdd\xdb\xcf\x96\x85\xa6\xc2\x92\x04\x95\x08\xe8\xbe\x80\x5d\xde\xc0\x76\x20\x5b\xdb\x2e\x91\x1e\xa5\xf8\x23\x79\x23\x44\xbc\x9d\xc5\x67\xa7\xca\x2d\x72\x8a\xe2\x91\x68\x3e\xf7\x90\xc0\x3e\x21\xca\x63\x0d\x8b\x0b\x8a\xee\x77\x3e\x17\x0f\x60\x70\xa1\xf5\x9a\x84\xa7\x5a\x25\xdd\xaa\xf0\xc5\x0f\xed\xa5\x1a\x22\x5f\xa8\xf4\x03\xbf\x60\x78\xb4\xaa\x99\x2a\x5a\x36\xca\xdd\x73\x01\xa3\x4f\x7b\xd6\x5d\xef\x93\xc4\x2b\xc7\x13\xe6\x75\x4b\x6a\x96\x09\xf4\x29\xa1\x06\xf0\x17\x76\xc5\xcc\x7b\x94\x08\x55\x38\x76\x5b\xcf\xa8\xeb\xf5\x00\x44\x48\x43\x0f\xf9\x69\x57\xd6\x1a\x92\x13\x73\x2e\x32\x73\x64\x00\xc6\xf4\x09\x2d\xdb\xf7\xca\x90\x17\x0e\xd7\x5b\xc3\x91\x19\x86\x7b\x0f\x0b\x28\x57\x8b\x96\x86\x9d\x0f\xb7\x2b\x72\x70\x41\xe0\x50\x3b\xf7\x15\x5f\x08\x75\xbe\x0a\x0e\x21\xad\x7f\x1b\x28\x04\xef\xbc\x9f\x76\xca\x4e\xe5\xe1\x21\x55\xce\xbc\x76\xc0\x71\x37\x03\x24\xca\xdd\x76\xd8\x47\xcb\xaa\xa7\x97\x07\xbf\x8b\xee\x48\xa5\xf7\x42\xcf\x78\x7c\x78\xd4\x0b\x22\x42\xa4\x01\xcc\x13\x0d\x9c\x98\x23\x62\x50\xb9\x96\x13\x3e\x78\xa9\x3c\xa3\xf3\xc6\xb9\x9d\x05\x42\x43\xdf\x6d\xe4\xac\xe3\xd5\x92\x22\xf6\x2d\x19\xf4\x6c\x5f\xf3\x98\x65\x69\x3e\xc5\x29\x51\xca\x17\x46\xc1\x1c\xef\x55\x0f\x02\xd0\x91\x45\x07\x65\x1d\xf3\x02\xd4\xea\x6c\x30\x7d\xcf\x83\x00\x54\x11\x10\xa6\xdc\xb3\xfa\x9e\xa4\x54\xfa\x49\x95\x33\x40\x21\x4b\xa4\xc9\x2e\x9d\xc7\xbb\xe8\x6c\x7b\x2b\xf2\xaf\x99\xed\x0d\xfe\x8d\x7b\xbe\xda\xbb\xbb\xe4\x48\x49\x5f\xed\x5f\xf1\x45\xd4\x92\x80\xca\x4c\x3b\x8e\x17\x17\x9e\x01\x97\x2f\x73\x2d\x0b\xeb\x11\xe1\x65\x5e\x6b\xdd\xf5\x79\x8c\xbd\xcb\x7d\x3b\x32\xcd\x7c\x92\xd9\x29\xb9\x07\xc6\xc1\x02\x93\x02\x85\x55\xdd\xd4\x7b\x01\xb1\xb4\x4d\x38\xbf\x58\xa6\xb5\x20\x80\x97\xa7\x16\xba\xb5\xc2\xdd\x4f\x1c\xae\x20\xa6\xd7\xb1\x89\x4d\x40\x77\x1c\xbb\x1e\x5d\x71\xa0\xa7\xc0\x85\x1e\x08\xb0\x9e\xb9\x29\xd6\x66\x77\xe1\x4e\xd2\x0d\x7e\xbf\x90\xec\x67\x0c\x04\xdb\xd0\x72\x30\x30\x32\x98\xd0\x0f\x5b\x47\x6c\x9c\xa8\xe4\x3b\xcc\x76\xe4\x7c\x6e\x8a\x9d\x9a\x43\x7d\x8d\x91\xdc\x4f\xd8\xf7\x29\x25\xf6\x16\x83\xcb\x85\xf7\x79\x5c\xaf\x0f\xc2\x0b\x79\x6c\x95\x8f\x61\x23\xeb\x46\xee\x15\x0e\x14\xa9\x6f\x53\xf7\x09\x3f\xd1\x57\x64\x24\xda\x7a\xf7\xca\x0f\xba\xd3\x85\x72\xb8\xc7\x74\x90\x67\xc9\xce\x9f\x39\x78\x3b\xef\x86\x94\xa5\x11\x1a\xf8\xa1\x10\x85\xee\x0b\x98\xd6\x76\xe3\x76\x30\x25\x60\xed\xd0\xab\x02\xe6\xe0\x9e\xc1\xca\xe0\x78\xcf\x3d\x7c\x86\xde\x87\xd3\x8e\x6e\x1d\x87\x91\x5a\x64\xf5\xe7\x00\x1e\x3f\xef\xb7\xfd\x9f\xfe\xeb\xbf\xf7\x2f\xfd\x23\xbf\xe8\xb7\xfc\x85\xff\xf8\x5f\xf9\xf7\xf4\x3f\xfd\x47\x7f\xd9\xef\xfa\x6f\x7f\xed\x4f\xfd\x84\xff\xc5\xbf\x55\xfc\xfe\xff\xfb\x2f\xbe\xbf\xfc\xff\xf5\xbf\x0f\xf0\x30\xbf\xea\xff\xf0\x17\x7f\x2e\xe0\xf1\x06\x03\x48\x22\xb9\xb3\x5e\x1c\x55\x7d\x3f\xef\x13\xd6\x66\x7a\x26\x55\x85\x44\x04\x3d\x0f\xb3\x57\xc7\x16\xf9\x35\x0c\x85\x9f\x9e\x3a\xfc\x1b\xbf\xfe\x7f\xeb\xe5\xfd\x4d\x4f\x81\x0f\x19\xb1\x55\xd0\x04\xa4\x34\xd4\xec\x1e\xbc\x90\xd5\x9e\xb0\xc2\x3d\x47\x75\x76\xe7\x7f\x78\x75\xa1\x88\x9a\x28\xb0\xe1\x80\x0f\x4e\x21\x83\xf3\xb6\xfa\x9a\xfc\x92\x4e\xcc\xb6\x00\x86\x81\xfe\xf0\x41\x4d\x0a\x89\x5c\x69\x18\x59\xf4\x7d\xc6\x48\x25\x94\x94\xdd\x8f\x56\x17\x7e\xbc\xa7\x60\xbd\x1f\xa2\xb9\x53\x5e\x3f\x03\x82\xce\x6e\xe9\x3f\x24\xbb\x75\x00\x91\xa2\x3f\xa3\xd2\x09\x10\xb2\xdb\xf7\xca\x0b\xb7\x79\xff\x68\x92\xff\x63\xbe\x0b\x15\x18\x0d\xa6\x0c\x39\x1d\x13\x46\x3e\x3c\x2c\x97\xc5\xea\x05\x2d\x29\x8a\x71\x12\xaa\x8b\x11\x2b\x1c\xc5\x4b\xab\x1d\xed\x47\x86\x6d\x3f\xe6\xbb\xa0\xd9\x3f\xcf\x34\xc9\x26\x20\x20\x7a\xb3\x6b\xae\x15\x19\x58\xd9\x2f\x75\x3f\xfc\xeb\xe7\xb8\xdd\x77\xc1\x42\xb7\x6b\x3a\xbb\xf0\xf9\xe0\x14\x87\x4c\xda\xf5\xdc\x4c\xf5\xf9\x4e\x87\x2d\x08\xf5\x46\xd1\x53\x8f\xce\xbe\xd4\xb1\x05\xd4\x5a\xf5\x26\xb3\x79\xc6\xf7\xc8\x1f\x89\x8a\xfd\x98\x7f\x11\x27\xce\x13\xce\x02\x17\x6b\xf1\x6a\xe1\xce\x7e\x12\x94\x62\x4c\xed\x24\x60\x38\x1e\x20\x41\xd1\x51\x2e\x67\x35\x2d\x4e\x17\xf6\xc5\x1b\x59\x80\x08\xdd\x9d\xe7\x38\x3c\xb2\xb7\xb2\x8b\xde\x60\x26\xec\x87\xe5\x20\x0a\x6a\xe7\xcb\x08\x4a\x21\x4c\x13\x12\xdc\xb4\xfd\x68\xea\xf0\xe3\xfe\x45\xb8\x6f\xa2\xe2\x6b\x31\xf1\x75\xb4\xa5\x94\x6d\xa6\xb7\x02\x19\x9e\x41\xd2\xbc\x85\xd3\x6d\xdd\xb1\x4b\x6c\xbe\x84\x04\x2f\xfc\xe0\x14\x98\x03\x09\x27\x7d\x30\xc3\x09\x72\x78\x21\x00\xc8\xc6\xc2\x8a\x38\xbe\x9d\xa2\xab\x39\x8c\xae\x20\xde\x54\x0d\xdf\xe9\x79\xc5\x07\xa7\xe0\x87\x0c\xf6\xb2\x49\xac\x9f\xc1\xf3\x07\x2d\xda\x05\x7e\x94\x5c\x13\x53\x63\xa6\x30\x27\xd8\x14\xba\xb4\xe3\x11\x8d\x24\x52\x7f\x24\x2a\xf6\x63\x3e\x85\xa6\xa4\x30\x67\x75\xe1\xf9\x8d\x9c\x89\x22\x15\xd4\xf5\x02\x7a\x99\xcc\xc9\xe3\x36\x71\x25\xa4\xd9\x88\x89\x3b\x2c\xaf\x1a\xe5\x07\xa7\x98\x26\xd4\xc1\xcb\xb3\xe6\x26\xc0\x42\x74\xe6\x61\x80\x65\x9f\xc4\xf1\x8f\x5f\x4f\xd2\x18\x16\xa8\x01\xc4\xfc\xd9\x87\x18\x07\xbe\xf8\x2e\x42\x7f\x50\x3f\x69\x54\x5a\x7e\xf8\x2f\xcd\xd5\x61\xa3\x7b\x9b\x56\x14\x60\xa5\xba\x18\xaa\x6c\xbb\xc6\xec\x64\x09\xbd\x8f\x75\xf1\x83\x53\x4c\x02\x21\x29\x08\x8c\x08\x6d\x72\x56\x9d\xd8\x33\xb1\xb2\x05\xdd\xb7\x41\xea\x19\x70\xdb\x95\xf9\x0b\xa8\x1a\xd7\x9e\x37\xf4\x0f\xbe\x0b\x46\x45\xe7\x1c\xe3\x1e\xeb\x09\x53\xcc\x29\x38\x4a\xa5\x79\x4b\xfa\xbd\x0f\x2d\x34\xfa\xad\xdd\x31\x44\x96\xe9\xd1\x44\xa6\xfe\x88\x04\xfc\xe3\xce\xec\x3a\xbe\x49\xf3\x27\x16\x09\x0e\xb0\x55\x16\xdb\x09\x21\xca\x5b\x01\x89\x24\xfc\x11\x2b\xac\x2e\xfa\x6c\x78\x47\x03\xaa\x86\x5f\x64\x76\x83\x2c\xd9\x4a\xbd\xa9\x79\xe1\x93\x60\x73\x6e\x67\x9a\x1d\xe3\x80\x47\x4e\x75\x67\x7b\xf0\x7a\x9a\xf7\x43\xc1\x81\x77\xdf\x3f\x32\xfe\xfc\x31\xdf\x45\xf2\x19\xed\x1e\x4d\x23\x24\xbc\x71\xd6\x57\x1c\xc9\xb8\x66\xd2\xd5\x1b\x70\x4f\x28\x89\x57\x63\xda\x8d\xa7\x84\xa7\x8e\xc8\xfd\x22\x8f\x6c\x27\xeb\xe4\x64\x0d\x86\x86\xcd\x39\x61\x0c\x78\x7f\xa7\x0c\x75\x02\xd2\x5f\x39\xaf\x69\xa7\x3a\xc6\xf3\xb0\x38\xda\xcb\xa4\xfd\xe2\xa5\xba\xb8\xd9\xdd\xe0\x58\x0c\xed\xd2\xbc\x44\x72\xf5\xa6\xe4\x16\x84\x06\x57\x62\xf6\x44\x07\x55\x63\xe1\xee\x5f\xf3\x1e\xc6\x3e\x88\x5a\x2c\xd2\xb9\x09\xbb\x04\x86\xa7\x81\xc5\xbd\xed\x2f\x41\x04\x50\x7f\xad\x2c\x71\x6d\x73\xc7\x5c\xd8\x08\x0c\xd2\x69\x4a\x74\xc5\x3f\xa8\xf8\x98\x7c\x59\xa5\x00\xea\x9c\x8a\x1c\xf1\x5d\xd8\xfd\xd0\x46\x5f\xb8\xd6\x89\xfe\xf6\x94\x0f\x88\xa4\xe1\x9d\x5c\x19\x6a\xb7\xe6\xef\x07\x9d\x00\x43\xd8\x2c\x60\xc1\xeb\x5e\xed\x84\xe7\x54\x08\x1b\xfb\x40\x5a\x09\xd4\x17\x25\x1b\x84\xc2\x18\x20\x9a\xa1\x57\xa9\x20\x55\x3b\x5f\xf4\x23\x50\xc1\xd3\xb2\x8e\x4b\x5d\xe9\x5f\x5e\xdc\x60\x93\x55\x25\x2c\x14\x9c\xe2\xf3\x22\x25\x82\xd4\xd3\xc7\x4d\x1d\x78\x6e\x0d\xcf\x17\x75\xe7\x9a\xaf\x8b\x2a\xbd\xc9\x71\x16\x68\xf6\xc1\x53\x74\xad\x93\x42\x2f\xd8\x8d\xb2\x6a\xa1\x56\x03\xb3\xc4\xc0\x7b\x4c\xf3\xc7\x7d\xf1\x46\x4a\xa4\xc3\xd3\x93\x5e\xd1\xd3\xae\xef\x6b\xa7\x6d\x3d\xd8\x0a\x09\x3c\x6e\xda\x48\xdf\x47\x85\x68\xab\x55\xd4\x23\xb8\x1a\xea\x1f\x74\x02\x9c\x03\x1c\xb9\x2b\xcb\x23\x7d\xd0\x7c\x69\x00\x93\x6e\x73\x88\x56\x52\x3a\xa2\xeb\x8b\x07\x79\x5c\xd8\x7b\xc6\x7a\xda\x62\xe1\xf9\x20\x76\x32\x82\x94\x8b\x77\xab\x40\x85\x97\x2d\xb5\x5e\x18\x96\x6f\x20\xa7\x48\x39\x8d\x23\x40\xbc\x73\xc7\x95\xc5\x93\x2c\x1e\x32\xfa\x56\x3e\x38\xc5\x76\x62\x0b\x74\xde\xa0\xfc\x51\x84\x36\x67\x0b\x51\x2f\x4c\x69\x14\x1c\xf5\x3e\xcc\x4c\x12\x8a\xc9\x06\xdc\xa4\xa8\xb7\xf5\x7e\xf1\x5d\xdc\x84\x3b\xd5\x2a\x3f\x29\x97\x7b\x14\x7a\x70\x50\x4b\xa4\x33\x1a\xe5\x98\x78\x74\x0f\xa4\x1a\x25\x54\xc7\x80\x03\x08\x81\xc5\xff\x1a\x3b\x7f\x06\xf0\xf8\x67\xff\xf2\xff\xe3\xcf\xfd\xd4\x1f\xf8\x1d\x7f\xe5\xcf\xff\x37\x3f\xff\x4f\xfd\xff\x7f\xd7\x2f\xfd\xeb\xbf\xfb\xcf\xfe\xf3\x7f\xfc\xaf\xfd\xf2\xdf\xff\x53\xbf\xec\x77\xfe\xdd\xbf\xfd\xaf\xd5\xbf\x78\x3f\x00\x3c\x34\x31\xc4\x29\xb8\xed\x7b\x3a\x5c\xc8\x6b\x69\x9a\x99\xfc\xa8\xa0\x11\xbe\x0d\x15\xb1\xa1\xe8\x1c\xa0\xcd\x40\x37\xec\x16\x70\xbf\x78\x54\x25\x6f\xcf\xd1\x95\xe3\xd8\x11\xa2\x72\x2d\x63\x13\xb5\x5f\x08\x55\xe6\xe1\x6b\xac\x57\xfc\x81\xcf\xe9\x72\xbf\xe9\xa7\x57\xc1\xbf\x80\x1a\xce\x2e\xc3\xb1\x2e\xc8\xa6\x90\x96\x06\x35\x21\x58\x32\x8a\x38\x23\x6e\xc5\x83\xfc\x4d\xb9\x4f\x68\x39\xe6\x13\x2d\xe2\xc4\x07\x65\x11\xaf\x0b\xd5\x91\x92\x0e\x98\x52\x84\x58\x15\x08\x8e\x68\x51\x8b\xef\x28\x4f\xb1\xe4\x2d\xdc\xea\xeb\x3c\xe1\x16\x34\x5a\x36\x13\xea\x83\x53\x44\x71\x99\x28\xa2\xde\x62\xc1\xd4\xf5\x3e\x8f\xcc\xaf\x84\xfa\x9c\xcd\x0b\xb8\x80\x28\xd5\x17\xb1\x06\xa2\x06\xfd\x2e\x5a\x7c\x71\x17\x8c\xd2\x1c\x38\xdb\xc5\x3f\xe1\x0e\x88\x0b\xed\x01\xe0\xd2\xb0\xf7\x42\x89\xe7\x01\x7b\xeb\xcc\xb1\xe9\x89\xb6\xd1\x84\x61\x95\x7d\xd0\x5e\xf3\x72\xae\xa7\x80\xd9\x40\x5e\x11\xaf\x80\x35\xba\xf2\xbc\xfd\xe4\x79\x45\xee\xaf\x26\xbd\xa1\x3b\x23\x42\x11\xc8\x02\x93\xf1\xe7\x0b\xc0\xa3\xfe\x10\x3c\xc0\x12\x2f\xd7\x95\x6b\x53\xd2\x64\xc7\x8c\x90\x9f\x28\xeb\xc3\xdb\x7a\x81\x7e\x9c\x7e\xb2\xcf\x8d\x0a\x44\x40\xbb\xee\x83\x53\xf4\xd4\x04\xbe\x79\xb4\x1e\x68\x65\xcb\x8b\xd0\xb6\xb4\x34\x07\x91\x0d\xd6\x45\xc5\x8c\xd4\x7b\xda\x30\x06\x42\xf2\x06\x30\xc4\x07\x2f\x95\x8f\x60\x9e\x42\x75\xe1\xb0\x36\xe8\xe7\x78\x1f\xa7\xa4\xd6\x2c\x04\xab\x30\xb0\x4f\x99\x36\xf9\x92\xd1\xc1\xf6\x75\xe7\x05\xa0\x7d\xd1\x5e\xe7\x35\x9e\xc8\x15\xcc\x85\xa8\xa7\x6f\xf1\x8e\x42\xcf\xcb\x85\x95\x39\x06\x08\xa1\xa2\x3a\xdf\xed\x0e\xb8\x99\xbc\xce\x45\x11\xbe\xb8\x8b\x44\x12\x59\x8d\x21\x88\xd3\x00\x17\xd6\x67\x65\x1c\x33\x7d\xee\xe8\xb4\x76\x64\x73\x2d\x02\x51\xbc\xd9\x1a\xe4\xd1\xb2\xfa\xf6\x41\x04\xe7\xeb\xf1\xbe\xa2\x13\xcd\x4a\xd8\x03\x3a\xde\x82\xcc\xc1\x13\xb1\xb6\xdb\x1b\xb5\x14\x41\xfb\x81\x37\xbf\x44\x06\xae\x00\xf1\xe2\x8b\x53\xbc\xe5\x68\x36\x68\x3f\x55\x14\x11\x46\xbf\xa7\x0f\xb7\xa3\xca\xaa\x5b\xd7\x85\xe1\x36\x26\x63\xde\xc4\xaf\xe2\x50\xf4\xf9\x84\x2f\x60\x5a\x44\x03\x26\xcc\xff\x90\xcc\xca\xa2\x61\x32\x31\xf7\x0f\xf9\x24\x69\x40\xcb\x79\xfa\xb4\x4d\x12\xf5\x12\x37\x2c\x78\x78\x97\xe6\x47\xd2\x66\x3f\xe6\xbb\x68\x80\x97\xca\x54\x68\x30\xad\x23\x11\x8d\x87\x44\x81\x68\x7f\x9f\xd0\xe0\xc3\x5e\x16\x51\x78\xf2\xa2\xaa\xb1\x43\xcb\x30\x4c\x7c\x11\x3b\xb9\x85\xfc\x25\x30\xd8\xc7\x33\x11\x34\x9e\x05\xd5\x3a\x8a\x7c\x70\x93\x52\xd3\xc8\xb5\x6a\xd7\xad\x00\x87\xe8\x01\x20\x39\xfc\x17\x2d\x65\xc2\x28\x23\xbe\xb1\xac\x9c\xdf\x32\xf5\x9b\x65\x63\xce\x01\xa3\x8d\x67\x0e\xce\xe3\xe3\x7c\x73\xa5\x1e\x3c\xd0\x97\x2a\x37\xfb\x00\x82\xe2\x1e\x74\x73\x97\x84\x99\x10\x65\x32\xd5\x7d\x79\x48\x43\x46\xfe\xa7\x01\xf4\x1d\x14\x32\x98\x38\x63\x15\xb0\xc3\x07\x91\x4e\xac\x5f\x00\xe7\xd3\x8c\x97\x14\xc4\xaf\xad\xc4\x61\xf9\x8e\x8a\x68\x20\x86\x02\x70\x04\xe0\x70\x42\x85\x28\x05\x86\x97\x0a\x48\x79\x35\x75\x9f\x64\xb3\x4e\xd6\x15\x80\xbd\x0e\x08\xe7\x38\x18\x0f\x13\x07\x8a\x20\x2e\xe1\xdd\xbd\x14\x42\xcf\x28\x23\x8a\x42\x06\x5f\x91\x4b\x78\xbe\x18\xeb\xf4\x87\xbc\x6f\x7e\x5b\x77\xcf\x7c\xf8\xa5\xfc\xa8\x84\xb5\xdc\x5b\x76\xbd\x41\xe4\x40\xbe\x6a\x68\xbb\xaf\x92\x64\x3d\x94\x8a\x4f\xaa\xdf\x87\xac\x80\xb1\x3b\x7d\x09\x48\xeb\xf6\xa8\xf6\x9e\x57\x64\xef\xf5\x9e\xd7\x6e\xd2\x1b\x5b\xf2\xa1\x3a\x1f\x7c\x7b\x8a\x4f\x5f\x54\x39\x8c\x2f\xf0\xa2\x64\x0e\x7d\x63\x1b\x4b\x10\xa3\x26\x2b\x24\x0e\xc7\xf5\xd6\x65\xb2\x07\xdc\xbb\x53\x86\xae\x99\x44\x0d\x71\x08\x7c\x01\x9c\x2b\x5c\x1f\xbe\xa0\xc4\x4e\xb2\x5c\x9f\x00\x2f\xe0\xa2\x26\x80\xce\xca\x26\x6c\xea\x61\xad\xef\xad\xa3\x1c\x6e\xb5\x5b\xf5\xfe\xc8\xf8\xf3\xc7\x7c\x0a\xa1\xcd\x89\xae\x3d\xe8\x2c\x32\x22\xb8\xc9\xd5\x47\xc4\x2a\xd8\xae\xcb\xa7\x96\xf2\xbd\xba\x31\x08\x61\xdf\xbc\xe4\x55\xe4\xf8\xa0\x06\x67\xb8\xd9\x1c\x1a\x0d\x49\x23\xb0\x0f\x5d\x6f\x02\x7c\x39\xbb\x1b\x1a\x26\x8a\x44\xef\xca\x1b\x59\xf4\x54\x0c\x3a\x9e\x11\x6e\x19\xbe\x88\x9d\xa3\x59\xbe\x2d\xd4\x15\xfb\x63\x09\x3b\xb0\x6f\xba\x1f\xbc\xe9\x53\x2a\x64\x1e\x75\xad\xf6\x49\x44\x0a\x45\x4c\x73\xac\xf9\x2f\xaa\x1c\x62\x4d\x9d\xed\xa1\x16\x52\x16\x0b\x7e\x48\xf6\x54\x0c\x45\x53\x30\x36\xed\x93\xde\x07\x6b\x5c\x09\xba\x35\x7b\xaa\x4f\x7d\xa5\xff\x22\x5e\x9c\xbd\x0b\x24\x3e\xbd\x6a\x94\x77\xc7\x84\x32\x3e\xee\xaa\x93\x36\x33\xe1\x25\x32\xd4\x21\xfa\x74\x8a\x0f\xbd\xd0\x14\x4b\x8c\x2f\xbe\x0b\x21\x41\x98\x44\x00\x7d\x6b\x93\xb1\x69\xda\x2d\x2c\x41\x2c\xc0\x72\xd8\x86\x50\x08\xc7\xd1\x05\x02\xbd\x6a\x32\xe0\x75\xe3\x83\xbb\x60\x3c\x07\xc1\x1a\x52\x8b\x9f\x08\x02\x15\x17\x52\x56\xb4\x9f\xcf\x01\xee\x34\x3e\x2e\xd2\x9d\x2b\x9f\x15\x86\x04\x0e\x36\xe3\xa1\x3f\x07\xf0\xf8\x17\x7f\xcd\xdf\xf8\xf5\x7f\xf9\x17\xfe\x67\xff\x8c\xfb\xed\x7f\xf8\x17\xfc\xfd\xbf\xeb\xff\xfc\x8b\x7f\xe3\x3f\xf4\xbb\xff\xb6\xdf\xf7\x5f\xfd\xb1\xdf\xfc\x87\x7e\xc7\x9f\xfe\x53\xef\x3f\xfa\x27\xff\xc7\x1f\x3f\xe0\xc1\x16\xf5\xd7\x31\x81\x0d\xab\xb2\x53\x3c\xc3\x7d\x53\x5b\xcf\x99\x8c\x2f\xfc\x0c\xd4\x8a\x89\xe1\x1e\x7d\x62\x04\x40\x11\x78\xc7\x17\x05\x89\x55\x1b\x9f\xf4\xb2\x74\x40\xf6\x5a\x32\xb7\x9a\x89\xdb\xa3\x29\x1f\x56\xba\x3f\x88\x04\x32\x9b\x54\xbc\x12\xae\x23\xd5\xf8\xf9\x22\xf1\x88\x6a\xb6\xe7\xba\xf3\xdb\xf2\x84\xcb\x53\x04\xbc\x49\xf6\x3d\x79\x01\x31\xc8\x6c\x20\x26\x7f\x2f\xc3\x6c\x13\xd0\x70\xb7\xf1\x8b\x0f\x89\x40\x84\x9b\x0b\xea\xf2\x05\xb3\xc5\xa4\x73\xf4\xb4\x95\x0d\x83\xa0\x98\x3d\x15\x85\xc0\x98\x57\xed\x15\x1e\xbe\x64\x65\x66\x7c\x01\x35\x6c\xe8\xf9\x0e\x41\xa4\xb6\x24\x53\x30\xef\x27\x60\xf6\x46\xa2\xf9\x83\x97\xbe\x16\xdd\xe8\xb3\x26\xb7\x89\x71\x26\x7e\x3a\x02\x1f\xb4\xd7\x2c\x3f\x79\xaa\x19\xdf\xf0\xca\x7d\x7a\xe6\xa7\x93\xae\x74\x1a\x25\x3e\xc2\x39\x7b\x9f\x14\xd0\xd4\x9c\xfb\x3e\x66\x2b\xca\xc5\xe7\x83\xf4\xc7\x68\x97\x24\xd5\xe2\x0e\x48\xb9\xa4\xc2\x12\xe0\x1a\xc7\x00\xf2\xb0\x01\x68\xd3\xa0\x22\x0f\x54\x6c\x46\xac\x75\xaf\xcc\xee\xf8\x05\x1c\x27\xec\x83\x7d\xef\xf5\xe2\xbd\x27\x2e\xb9\x4d\x9b\x2e\xaf\xc4\x93\xe7\x2c\x77\x80\x27\xf5\x7d\xdf\x0c\x70\x1e\xab\x11\x3f\x3c\xfb\x22\xd8\x0e\x2e\xeb\x2e\x9e\xe0\xf7\x4e\x26\xe3\x03\x69\x0f\x6c\x3a\x6d\x43\x69\x21\x70\x93\x45\xd6\x41\x05\x39\x76\xaa\xfd\xb1\x13\xc7\x2f\xa6\xd7\x28\x52\x0a\x94\xae\x5c\x3e\x21\xf9\x6b\x79\x19\xa1\xd8\xfb\x3e\x5c\x75\xf7\xe8\x48\xdf\x43\x30\x21\x84\x1b\x54\xad\xa8\x79\x82\x2f\x66\x62\xb9\xc1\x31\x23\x58\x6f\x12\x06\x23\xc0\x9f\xc7\x99\xa0\x5c\x02\x66\x3f\x5b\x23\xca\x07\x65\xbe\x43\x91\x70\xa0\x93\xa5\xd4\xf9\x07\x78\x3f\xd7\xff\x0b\x6d\xff\xfa\xfa\xe1\x17\xa6\x85\x42\xa1\x49\xe2\x8b\x0c\x66\x60\x02\xc7\x17\x99\x2f\x2c\x15\x63\x1d\x11\x12\xf1\x50\x51\x14\xfa\xc2\xa2\x03\xa1\xeb\x7c\x5e\xcf\x3a\xaf\x67\x2d\x2a\xca\xca\x22\x02\xa7\xe8\x8c\x22\x15\x23\x58\x13\x25\x4a\x10\x99\x4e\x74\x1a\x51\x64\x62\xcb\xde\x9e\x15\xd9\xc8\x96\xbd\x37\x5b\x94\x71\xd8\xe0\x66\x6f\x7e\xb3\xf7\xc0\xc0\xbc\xf5\xf9\x0f\xbe\x7c\x3f\xeb\xb9\xef\xfb\xba\xee\xeb\xba\xee\x26\x57\xe3\xcb\x46\xc6\x84\xdb\xaa\x5a\xae\x89\xba\x93\x04\x64\xe5\x03\x63\x0d\xfe\x4c\x5a\x88\xe7\x8d\xb0\xac\x25\x53\xff\xae\x50\xfe\x9f\x37\xdf\xaf\x9d\x05\x88\x5a\xd5\x44\xe3\xb5\x12\x4f\xf2\x79\x38\x31\x0b\xed\xc7\x3c\xd9\xca\x47\xc1\xe5\x74\x0f\x6f\x89\x24\x17\x97\xbe\x18\xce\xb8\x19\x88\x6f\x84\x38\x59\x2c\x27\x3f\x6b\x99\x2a\x9b\x4d\x21\x8f\xde\x9b\x40\x32\x87\xaa\xdc\x27\x8c\x03\xfb\x4e\xee\x25\x84\xe5\x2f\x06\x12\x38\x49\x79\x1f\xe1\x97\x51\x06\x03\x48\x31\x0b\x29\x58\xad\x5f\x0e\xd7\xf6\xac\xbf\xd9\x0f\x5a\x9c\x37\x66\x30\xe0\x85\xf8\x62\x3f\xc8\x83\x64\x03\x76\x60\xb9\x73\x5a\x06\xd1\x10\xf6\xf0\x68\x69\x0d\x96\x3f\xfc\x3e\x92\x5e\xa0\x8b\xa2\x99\x1f\xc7\x09\x32\x4b\xb1\xf9\x85\x76\x53\xb4\xa1\x39\x41\x42\xb5\xe9\xf3\x62\x6e\xa5\xb6\xce\xd2\x0e\x84\xf7\x0c\x8e\x50\xf6\x8f\x04\xb9\xea\xca\x81\x07\x8c\xd9\xf3\xc5\xb8\xac\x74\x14\x58\xe0\x1a\x1f\xeb\x42\x45\x8c\x91\xb9\x64\x3e\x3d\x3f\x91\x86\x44\x1a\xcd\xfb\xfc\xf0\x6b\xbc\x11\x64\x08\x39\x8f\xfc\x0b\xe8\xc0\x59\x8c\x8c\x72\x3c\x00\xa2\x4c\x8d\x97\x1b\x44\x43\x48\x0b\x23\x05\x3d\xc1\x14\x57\xad\x66\xcb\x17\x88\xf1\x5e\x01\xf8\xfe\x42\x05\xc5\xc8\x13\x58\x65\x8b\xfb\x56\x75\x7e\x41\x83\x76\x5b\xf6\xc2\x08\x4e\x82\x1b\x1a\x6b\x96\xc2\x54\xa7\x5b\x5d\xc1\x37\x22\x65\xc2\xfb\x05\x41\x1a\x4a\xed\x2b\x17\xd8\xcc\xdb\xcc\x55\xcc\x07\x3b\x94\xd0\x55\x9a\x5a\xb1\xdc\xe0\xda\x99\xa9\x7c\x21\xe1\x17\x56\xb3\x9f\x4f\xde\x05\x95\xa7\x8f\xae\xf0\x22\x63\xac\x74\x77\x17\xca\xc4\x5a\xb6\x21\x29\x27\xf4\xc6\x33\x3b\x6a\xf3\xdd\x56\x01\x7a\x2d\xae\x05\x7c\xb1\xe2\xda\x0c\xd7\x23\xc8\xcb\x4b\x35\x6a\x69\x01\x98\xd1\x96\x04\x03\x22\x59\x2f\x56\xc3\x58\xe3\x94\x53\xc4\x2e\x93\xbd\xd0\x84\xc5\x2f\xb4\x15\x5b\xec\xf7\xd9\x80\x5f\x48\x5b\x7e\xd2\x31\x9c\xc1\x87\x2b\x8c\x72\x10\xc7\x4f\xd1\xe7\xe9\xb2\x35\xdd\x41\xda\x6f\xa5\x5c\x9d\x2f\xb4\x58\x08\x46\x1b\x98\x65\x65\xb5\xfa\x00\x64\x93\xd8\xc9\x04\x97\x16\x7f\x2c\x0c\xa2\xcf\xbb\x16\x5a\x72\x8a\xf2\xbc\x63\xba\xac\xdc\x07\x55\x8b\x79\x89\x19\xb8\xe4\xb0\x81\x92\x38\x66\x7b\xd8\xfc\x34\x20\x17\xe4\x4b\x23\xb8\x05\x04\x0f\xd0\x8c\x9b\xf1\x3a\xba\x52\x46\xee\x03\x6a\x92\x11\x70\x54\x6f\xd9\xb9\x6e\xf9\xd3\xaf\x10\x65\x56\x30\x83\xbf\x6a\xc7\x62\xa4\x9d\xe1\x2d\xcb\x55\x86\x1e\x39\x4b\x7a\x4b\x87\x5f\x80\x7c\x3a\x0b\xc4\xb2\x90\x3e\x29\xb7\xc5\xbc\xc8\x4f\xe2\xc8\xbb\xc8\x63\x8e\x2b\xdc\x2c\x27\xd5\xf2\x17\x14\xfa\x1e\x61\x49\x15\x5f\xa8\xa0\x38\x2d\xbc\xec\xa4\xf4\x6d\x2d\xe1\x19\xe2\x8b\x1e\xcc\xb6\x7b\x5f\x50\x9e\x2e\x57\x81\x30\xea\xed\xa5\x33\x76\x03\x0e\xf6\xc9\x5f\x28\x8b\x39\x92\xae\xf9\xde\x8f\xbf\xde\xc9\xa7\x51\xae\x78\xd7\xb5\x55\x41\x65\x06\xc5\x9d\x2a\x71\x37\xfb\x1e\x4a\xab\x34\x34\x0f\xd1\xbe\x40\x45\xf8\x20\xb8\x79\x15\x14\xb8\xc4\xbd\x56\x0c\x9f\x83\x79\x7d\x4a\x8e\x5a\xa4\xf0\x46\x0d\x5c\x4d\x54\x86\x10\xed\x0d\xab\x51\xff\xc5\xff\xe2\x94\x5c\x75\x6a\x35\xda\x98\x76\x22\xef\x43\x03\x37\x64\x0d\x08\xf1\x5b\x3d\xca\x21\x48\xdd\xfd\xf2\x84\xb8\x02\x4c\x95\xd4\x87\x5f\x46\x78\xf0\x3f\xb1\xff\xc5\x9f\xfb\x5b\xe6\xbf\xfa\xdf\xfe\xb9\xff\xc0\xbf\xfe\x5b\xff\xf4\xdf\xf9\xad\xbf\xe3\x67\x7e\xe2\x5f\xfb\x63\x5c\x3d\x7f\xfc\x47\xff\xd9\xff\xf9\x0f\xf8\xb7\x7c\xa0\xf0\x30\x23\xd0\xd6\x49\xb4\x75\xd8\xba\x1b\x3d\xc1\x83\x96\xd7\xbb\x21\xc1\xb1\x47\x9f\x74\xa1\xf3\x5d\xd2\xc5\x89\x26\xbe\x1c\xb4\x0f\x60\x14\x7f\xd8\x78\xac\x08\x03\xff\xd0\xfb\x7c\x94\x1e\x6c\x2a\x98\x42\xa4\xbf\xb3\x96\xd3\xb5\xd8\x7d\x95\x16\xf2\x9e\xc3\x05\x5a\x20\xfb\x02\x3a\x30\x84\xa0\xeb\xb7\x73\x9c\x47\x88\x1a\xed\x33\x12\x58\x74\xba\x2d\xa5\xdf\x6b\x96\x47\x3c\x79\x4e\xab\xf3\x73\x97\x82\x22\x8a\x4f\x46\x81\xe7\x21\x1b\xe6\xa7\x3e\x36\x99\x2e\x3a\x11\x94\x43\x5f\x9e\xb9\x81\x5f\x30\x2d\xe3\x28\x32\xa5\xc4\x33\x68\x64\xba\x1f\xff\x49\xb1\x75\xfd\xc4\xf7\x2a\x5c\x2b\x52\x48\x61\x9d\xa5\xef\x1b\xbc\xdb\x14\xc8\xf9\x6b\xd3\xa9\x56\x81\x49\x8a\x2f\x2e\x54\x63\x9d\x6b\x5f\xc8\x6f\x03\x7a\x39\xcf\xe4\x9d\xd2\x7b\x69\x0c\x40\xf6\x85\xaf\xf6\x96\x3a\x87\x6a\xe2\x7b\x91\x7a\x4a\x59\x9b\xc2\x3e\xf9\x0a\x82\xf1\xf3\x05\xb0\xbd\xb7\x1d\xdd\x80\xee\xd2\xd2\xd9\xe8\x3d\xcf\x34\x8c\xf9\xb4\x0f\x91\xca\xf9\xf7\xe9\x2f\xe1\xc6\x4f\x6b\xb8\x7c\xf2\x5b\xfb\x17\xc3\x59\x7b\xf7\x39\x45\x63\x2e\xe8\x93\x16\xbd\xaf\x72\x72\xf1\x94\x7c\x00\x0e\x8e\xac\x76\x20\x87\x1b\x20\x1a\xbb\xaa\x28\xbf\xd1\xfd\x82\x8e\xb3\x0f\xb6\x22\x16\xbb\xd3\xb1\x82\x3e\x67\x59\xd2\x35\xe3\x94\x95\xf8\xda\x27\xf0\xed\x8e\x1f\x56\x84\x28\x7f\xa1\x3b\xa0\xd1\xbe\x00\xb6\xbc\x5b\x22\x23\x84\x2b\x10\x46\x9f\xe5\x9e\xdc\xcd\x2d\x2f\x78\xf5\x66\x9c\x5c\xae\xca\x29\x91\x14\xbb\xdf\x6a\x8e\x81\x4d\x7e\xd1\x78\x78\x5a\x08\x44\x3d\x8f\xd8\x0a\x4d\x10\x27\x7e\x1d\x78\xda\xee\x13\xb6\x55\x9d\x08\x6c\x39\x59\x77\xbc\xc5\x26\xb5\x8a\x99\xca\x7f\x20\x2d\xe4\x4d\xd1\x49\x42\x7e\xad\x67\x6b\xc9\xfb\xfa\xa4\x1f\xf0\x4a\xb5\x40\xd4\x9a\xcf\x19\x95\x12\x67\x17\xc4\xf0\xc2\xb7\x9f\xcc\xce\x17\x92\x53\x64\x48\x97\xa6\xfb\x99\x63\x1e\x2b\x8a\xc6\x0d\x90\xb9\x6a\x61\x66\xb2\xcc\x47\x93\xb2\x5b\x6a\xe2\xe3\x67\xf0\xb1\x0f\xce\xbf\x68\xc2\xaa\x9a\x76\x9b\x58\x98\x71\x00\x9a\xae\x37\x06\x20\x3d\x20\xc9\x2b\xec\x67\x6d\x94\xd6\x8a\x95\xe1\xfe\x35\x12\xdb\x58\x37\x40\x5f\xc8\xf5\xd1\xc4\x34\x28\xbf\xdb\x7d\xfd\xa3\xfc\xd3\x2b\xf8\x01\xf0\x23\x72\x6d\x67\xc6\x33\xde\xc6\xd0\x71\xf5\x56\x24\x6d\x41\xa1\xfa\x45\x1f\x11\x8f\x57\xe4\xc2\xeb\x9a\x3e\x51\xc8\x48\x40\xa9\x25\x42\xb1\xb3\x10\x55\x10\x3b\xc3\x3a\x91\xbe\x53\x91\xc7\xbd\x4e\x83\xa7\x7f\xd1\x53\xd3\x54\x52\x6c\x5a\x0f\x0e\x96\x9e\x0e\x0b\x45\xba\xbb\x67\x19\x18\x2f\xd7\xc6\x38\xc2\x4a\x5c\x57\x47\x7d\xa4\xe5\x15\x5c\xf9\x05\x05\x95\xa0\x0d\xbc\xc0\xb2\xe6\x06\xc1\x3f\x13\x1c\x7b\x2f\xda\xe6\x72\xd4\x14\xa3\x8c\xbb\x49\x5e\x9c\x58\xd5\x98\x71\x57\xe6\xbf\x97\xf9\xf3\xcf\xfb\x75\x1e\xfa\x3e\x9c\xc7\x08\xe0\x6a\x57\xb6\x03\x38\xf5\x96\x3c\xae\xbf\xd9\xb1\xc7\x93\xcd\x29\xb2\x39\x3c\x71\x49\xc6\xee\x1b\xda\x07\x90\x92\x19\x0c\x19\xb2\x1c\xbd\x3f\x3c\xcc\xce\x94\xd9\x02\xef\x15\x6f\x3f\x09\x43\xbe\x37\xa2\x76\xdb\xbd\x46\xc2\x00\xbc\x52\x26\x55\xbf\xa0\x5d\xbc\x0b\x57\x37\x65\x51\x9f\xd6\x4d\x87\x73\x0a\x08\xc6\x3b\x9e\x1a\x96\x96\x37\xc8\x06\x5a\x87\x69\xd7\x78\xb9\x33\xe6\xa1\xe7\x83\x77\xc1\x6d\xcd\x7b\xca\x45\x4a\x6f\x6f\x4b\xa4\xea\x69\xd6\xe0\x1c\x35\x7a\x65\xbd\x86\x9e\x8c\xf0\x10\x0f\x7e\xa9\xff\xa1\xf5\x66\x5f\xbf\x98\xb5\x80\x6a\x46\xd7\x74\x23\xa9\x44\xf9\x2a\xb6\x15\x8a\xb3\xa6\x97\x70\xe4\x6c\x47\xa9\x39\xa4\xe1\x7b\xe7\xcb\xfa\xf4\xe7\xa4\xfe\x85\x8d\x23\xf8\xb2\x1f\x3c\xf3\x2b\x75\x6d\xe5\x46\xf5\x6a\x03\x5e\x97\x79\xa6\xc6\xc8\xb7\x48\xba\x21\x75\xef\x66\x0b\x03\xe3\x95\xe2\xf2\x8b\xd7\x99\xc4\x09\xb0\xdc\xf0\x10\xf2\x38\x7c\x48\xba\x4f\xe6\xaa\x6f\x42\xc4\x80\xcf\x2a\x1d\x9d\xc3\x24\x17\x49\xe2\x14\x28\x0a\xe2\x8b\x59\x8b\x75\x29\x99\x57\x5e\x08\xa3\xaf\xd4\x5c\x95\xa7\x2b\x96\xed\x92\xac\x18\x19\xde\x42\x05\x15\x19\xa1\xa2\xe3\xc5\x72\x40\x38\xfd\x17\xb4\x8b\xcb\xb1\x25\xfb\x56\xee\xd5\xd3\xd3\xa9\x70\xca\x2a\xfa\x38\xee\x4d\x70\x9e\xab\xcc\x1b\x5a\x2d\xf0\xcc\x4e\x1e\xa6\xe1\x53\xda\x17\xab\x4f\x40\xb4\xa9\x8d\x48\xd6\x16\xf3\x6e\x0f\x65\x0e\x98\x16\x76\x06\x66\x27\xce\xb6\xa4\xf3\x52\x1e\x6c\xa5\x3c\x9c\x36\x2f\xfb\xc9\xba\x0f\x4f\x49\x50\x20\xe5\xca\xb3\xec\x3e\xa5\x9e\xf9\x74\xef\xa3\x2e\xc8\x78\x28\x6d\xc5\xfb\xe4\x49\xad\xe8\x9e\xe1\xf7\x61\xbe\x7e\x81\x53\x99\x91\x82\x0c\x6b\xdc\xf8\x05\xb2\x56\xe7\xb4\x7b\xb4\xb0\xe4\x8a\xe1\x1b\x4f\x69\x3d\x2a\x39\x43\x92\x80\xdf\xd4\xab\x7a\xe3\x17\x4b\x47\x9e\x32\xa8\x72\xab\x0c\x00\x46\x0e\x94\x75\x37\x7e\x91\x03\x6d\x04\x6e\xba\x7c\xf5\xc9\x60\xbe\x23\x73\x6a\x1b\x34\x57\xfa\x4f\xf4\x8a\x7b\x52\x06\xaa\x90\x4f\x57\x46\xbd\xbc\x3c\x1a\x8e\x7b\x66\xca\x8b\xcc\xcc\x9e\x26\x1c\x2b\x95\x72\x68\xa7\xab\x05\xdd\x4a\xa4\xfe\x65\x84\xc7\x6f\xf9\xff\x06\xf8\xe3\x7f\xf0\x77\xfe\xcd\xdf\xf6\x3f\xf8\xff\xfd\xf8\xbf\xff\xf7\xfe\x37\x7e\xc7\x8f\xfd\x9a\xff\xde\x7f\xee\xd7\xfd\xe8\xdf\xfe\x13\x3f\x9e\x7e\xe6\xd7\xfe\xb9\x7f\xf6\x67\xff\xe8\x07\x0a\x8f\x6d\xe5\xd9\x52\xef\xe1\x65\x2a\x90\x7b\x28\x16\xc3\x83\xe1\x5f\x88\xa7\x4c\x9a\xe2\x0b\xeb\x61\x96\x5f\xc2\x22\x42\x85\x57\xfe\x85\x5b\x2d\x2c\x7a\x94\x64\x52\x9a\xe7\x15\xb3\x67\x89\xa1\x78\x06\xe5\xdc\xa9\xb4\x7a\x6c\xe4\x80\x78\xa1\x20\xd8\x37\xab\x53\xac\xf1\x0b\xda\x85\x61\x6f\xc6\x16\x0c\x1e\xf3\xb0\xb0\x9d\x72\x10\x3d\x98\xda\x9b\x0e\x67\x6c\xcd\x97\x8a\x66\x09\x9b\x36\x20\xed\x4c\xce\x5d\xc8\x2f\xf8\xbb\xb7\x1a\x43\x70\x61\x3a\x1e\xad\x8d\x48\xd5\x90\x67\xbc\x2d\x03\x13\xb6\x0a\xf3\x1c\xea\x4a\xbe\xbd\xc2\x9d\xd1\xd5\x11\xf2\x4f\xc6\x22\x5b\xaa\xb8\xf9\xe1\x66\x29\xd5\x74\x91\xd7\x93\x67\xb7\x17\x01\x4d\xcd\x96\x48\x6a\xe8\x13\x69\xa6\x55\x47\x29\x75\x9b\xea\xfa\xc1\xde\x98\x5f\x0a\x67\x96\x72\x1c\xd1\x76\x92\x42\xea\x41\x59\x82\xf0\x9a\xa3\x3b\x2f\x4d\x44\x2c\x5d\xa3\xa1\x68\x62\x72\x7e\x22\x1f\xf7\x0b\x78\xbd\xbd\x5f\x39\xcc\xe3\x52\x3b\x53\xbd\x74\x8a\xbb\xe7\x12\x52\x76\xf5\x8a\xae\x69\xdd\x41\xe3\x7b\x62\xf4\x7a\x18\x5a\x0f\xef\x5f\xd0\x2e\xc8\x44\x3c\xf0\x9e\xed\xec\x23\xc4\xb8\x86\x2c\x1b\xda\x0f\x2d\x60\x86\x0b\x0b\x8f\x30\x88\xce\x32\x37\x5d\xa3\x87\x50\x8b\xf8\x17\x65\xce\x95\xc7\x2f\xc1\x09\x97\x7b\x42\xf5\x54\x77\x62\xdb\x35\x56\xa1\x03\x78\xa0\x22\x4f\x59\x53\xbd\x63\x9f\x2b\x41\x8a\x2c\x7b\xfe\xc5\xa0\xba\x62\x47\x33\x23\x52\x64\x79\xe6\x7c\xf9\xd8\xc2\x00\x3a\x87\x34\xf8\xa9\x75\x6c\x19\x7b\x8c\x3d\x25\xf1\x3e\x2f\x29\xcf\xb9\xe2\x8b\x81\x44\xa7\xd9\xe5\xbe\x30\xf9\x03\xdb\xdb\x1d\x95\x9e\x8b\x9a\x6b\x60\x7d\x00\x44\xd8\x79\x59\x21\x5b\x12\xe2\xa5\x8b\x45\x58\x29\xbe\xd0\x56\xec\x0d\xb5\xa5\x51\xc7\x63\x04\xa4\x0f\x09\xfb\x1e\xdb\x84\x68\xb5\xad\x4d\xc1\x18\xba\x73\x02\xc9\x12\x1c\x88\x9c\x01\x79\xf9\x17\x22\xe0\x54\x34\x2e\x84\x84\x37\x46\xce\x7b\x0d\x0e\x35\x87\x4f\xa3\xf8\xbe\xb8\x01\xca\x5a\x12\xcd\xfa\xad\xc7\xe6\x23\x3d\xc4\x64\xff\x85\x8d\xc3\xdb\xc6\xd7\xa3\x2e\x8f\xba\x51\x7f\xbb\xb2\x8f\x11\xc2\x8a\x6d\x0a\xcf\x17\x90\x6a\xce\x8b\x29\xb7\x47\x8c\x87\xbf\xef\x7a\x3e\xc9\x76\x49\x25\x5b\x0b\x57\xbe\x2d\xc5\xa4\x47\xda\x60\x9d\x53\xd4\x7e\x4e\xcf\xa4\x85\x00\x63\xf3\x25\x70\xa3\xf1\x1b\x23\x0a\xa8\xf2\x0f\x08\x0f\x46\x1e\x09\xcd\x5c\x16\xb8\x64\x08\x48\xd8\xcf\xb9\xa3\x52\x11\xe1\x94\x5e\xfd\xa0\xf3\xe2\xce\x97\xa3\xcf\x0b\x06\xea\x60\x9c\xf3\x05\xe1\x81\xe2\x0e\xdb\x90\xf8\xd4\x4c\x47\x00\x8e\x37\xaa\x83\xf5\xde\x23\x2f\x39\x97\x30\x9b\x66\x69\x7f\xd8\x70\x61\xa2\xb7\x35\x04\xbe\xa8\x9d\x8c\x40\xef\x4a\x54\x76\x8f\x24\xad\x1f\xc0\x33\xf3\xa8\x72\x9d\x6c\x28\x76\xd4\x0a\xa3\x6e\xbd\x72\x41\x24\x20\x0b\xae\xcb\x4f\xc8\xe2\x9a\x14\x4b\xe7\xed\x39\x38\x7f\x56\x39\x8c\x68\x82\xf5\x9e\xb7\x5b\x4e\x1e\x9e\x1e\xdd\x5f\xbd\xaf\xf5\xb5\x56\x29\x19\x88\x9f\x24\xcc\x98\x59\x3a\xb9\x7b\x1d\x85\x39\x28\x92\xc8\xf0\xf2\x34\xdb\x42\xd3\xbc\x7a\xb4\x2b\xd6\x78\x6e\x5c\x86\x01\x91\x97\x50\xfc\x3d\x5f\x54\x2d\x5c\xc3\x5b\xca\x7e\xc8\xdb\xa4\x35\xf0\xb0\x82\xab\xa1\x3d\xbc\x81\xea\x39\x04\x45\xc1\xec\x27\x34\xf8\xe6\xf0\xce\xc3\xc7\xfa\x24\x9d\x6b\x76\xef\x59\x93\xb0\xae\x31\xe7\x79\xa0\x75\xa5\xb3\xac\x30\xbf\xab\x07\x96\xf6\xe8\x8a\xa0\x31\x4f\x7c\x38\xe3\xa9\xbd\x3c\x7c\xd1\x53\xe1\x2b\xd2\xab\xa3\x22\x29\xce\xfd\x00\xfa\x38\xd6\x7c\x32\x65\x8d\x8a\xa9\x9d\xc1\x46\x93\x64\x69\x32\x57\xf2\xb2\x62\x56\x3e\x5f\xd0\xb4\x88\x71\xeb\xf8\x74\x58\xc1\x01\x15\x02\x19\x72\x76\x96\x41\x98\xdc\x76\x61\xab\x37\x12\x05\x21\x6e\x07\x96\xa8\x78\x0a\xe7\x7e\xf0\xa5\x72\x66\xea\x3e\x59\x54\x3f\x7a\x4e\x85\xd2\xd1\x5f\x14\x51\xa0\xe4\x21\x35\xeb\x67\x91\x9e\x4c\x51\x06\x82\x49\x40\x3f\x8e\x3c\x9f\x28\xce\xb9\x0c\x7c\x40\x36\x4b\x0a\xe8\x41\x83\x2b\xc9\xd3\xdc\x2f\xc6\xc5\x2e\x10\x44\x65\x1c\x3f\xa4\xcf\x6c\xed\x8d\x6e\x2b\xa5\xc4\x17\x0a\x52\xd8\x42\xec\x67\x41\x47\x53\x72\x7a\x27\xd5\x00\x5c\xc3\xb5\x9e\x45\xe4\x14\xdc\xec\xe5\x6c\x6d\xd0\xbe\x71\x1a\x4d\xc5\x1a\x3f\x31\x19\x55\xf4\x3c\x74\x16\x67\x87\xe8\x81\x71\x4e\x42\x73\x98\xa0\x22\x06\xd6\x31\x07\x8b\xb9\xae\xb5\x49\xb2\x89\xe3\xf3\x1d\x30\x7c\xf1\xa5\xc2\xdb\x3c\x78\x02\x46\xc3\x6a\x5e\xde\x44\xa3\x61\x38\xe5\x87\xb8\xe8\x86\x15\x48\xda\x4c\xb7\x66\x63\xbd\x97\x83\xe1\xe3\xfa\x24\x5f\x91\xdd\x12\x40\xde\x52\x4a\x8d\x61\xd8\xf2\x40\x7a\xb8\x7c\x36\x19\xe6\xb5\x98\x0a\x8e\x2a\x1c\xc3\x95\xdc\x5f\xd7\xf5\xd2\x9b\x7d\x91\x8b\xb5\xed\x0c\x47\x2e\x78\x02\xa5\xe3\x51\x0f\x5b\x21\xf6\xae\xd2\x50\x92\x9b\x0c\x77\x8f\x2d\x5a\xf8\x46\x2b\x1e\xa7\x38\x1f\xf5\x7e\x61\x8d\xa4\xcb\x56\xc0\x37\x2e\x98\xbc\x20\x83\x34\x61\x52\xc8\x24\x9c\xb3\x93\x26\xe8\x2b\xd2\xfb\x5e\x9a\x9c\x98\x92\xa1\xf9\x0a\x36\xd8\x2f\x23\x3c\xfe\xd0\xaf\xff\x55\xff\xf0\x3f\xfb\xa7\xfe\xc8\x4f\xfe\x8d\x5f\x9b\xf3\xaf\xf9\x5f\xfe\xed\x9f\xfe\xe3\xff\xab\x5f\xf9\xfb\xfe\x7a\xf8\xd9\xff\xc7\x6f\xfc\x07\xe3\xb7\xff\x9e\xff\xe9\x8f\xc8\x0f\x08\x8f\x3e\x0f\xe2\xbe\xb0\x6a\x43\x47\x5a\x67\x9a\x4e\x4f\x46\x36\x7b\x27\xd4\x6a\x16\x67\xa8\x7a\xba\xa2\xaf\x7c\x88\xbf\x9c\xe6\x2f\x0c\x14\xbc\xb6\xa7\x70\x23\x3a\xe1\x00\x78\x49\x4e\xe4\xf6\x35\xfc\xf2\x78\x85\x0a\x5a\x5c\xc0\x1b\x40\x7c\xaf\x84\x55\x7c\x27\x22\x04\x7c\xd1\x84\x83\xd6\xc6\x88\x7c\xc6\x45\x73\xa9\xac\x87\xd6\x37\xcf\x78\x48\x25\xd3\xda\xfe\x04\x4f\x2d\x75\xd8\xc4\x31\x7a\x6f\xc3\xae\xf1\x89\x60\x29\x76\xa6\x04\x2e\x2b\xf7\x5b\x6f\x66\x95\xdf\x90\x14\x70\x46\x32\xed\x5a\xb7\xa5\x2e\x6e\xef\xc5\xdd\x31\x1d\x9d\x10\xe5\x13\x29\x72\x7a\x7a\x18\x00\x26\x3d\xf7\x9e\x96\x17\x11\x63\x14\xb1\xa5\x08\x64\x4e\xd6\xcc\x63\x88\x6c\x48\xb0\x7b\xec\x14\x31\x79\xde\xbe\x90\x65\xcb\x0a\x5a\xd6\x9a\x4e\xdb\xb5\x05\xba\x5f\x6b\x9f\x38\x5c\x79\xa9\x66\xc7\x7b\x90\xa7\xe0\xfe\x41\x81\x8c\x4d\x22\x5e\xad\x7e\xe2\x56\x43\x33\xce\x3d\x4e\x36\xb3\x18\x97\xd3\xf5\xf0\x0e\x45\x91\x2b\x61\x9e\x44\x10\x17\x86\xbf\xce\x16\xe9\x05\x66\xd9\x2e\x9b\xbe\x28\xb6\xdc\xa3\xce\xe9\x86\x65\xc0\xf8\xec\xce\xc7\xd4\xe1\x4d\x14\xaa\x5e\xa0\xe8\xe0\x5c\xe0\x0e\x27\x40\x37\x11\x50\x81\xd3\x99\xce\xbf\x90\x9c\x46\x64\xde\x3c\x78\xb6\xa5\x37\x2d\x46\x87\xfb\xf4\x66\x08\xbc\x0e\x49\xcc\x00\x8e\x70\x2e\xe0\x24\x54\xb4\x6e\xbc\xc5\xb8\x5f\xc0\x6b\x56\x3d\xee\xb4\x3d\x3a\xcf\x36\x68\x0a\x2b\x03\x7e\x23\x09\x66\xc1\x0d\xdd\x93\x6c\x85\x85\x4f\x1c\x94\xbc\x2f\x82\xf4\xad\x5e\x7e\xc1\xf7\xd3\x75\x25\xd1\x8c\x95\x31\x5b\xaf\x87\x20\xcb\xe2\x11\x0a\xe5\x56\x76\x4d\x84\xbb\xc0\xf9\x50\xcf\x7b\x7d\xe1\x00\x2d\xb9\xdc\x17\xf5\x62\xa3\xb7\x6d\x33\x90\xe2\x32\xed\x72\x88\x7f\x38\xaa\x0b\x2d\x9c\x2b\x8d\xd1\x7b\xcd\x2c\x8d\x84\x27\x2b\xc2\x6a\x77\x78\xde\x3e\x08\x21\x64\xf2\x1d\xa2\x92\x5e\x0a\x1b\xcf\xc0\x54\x18\xc0\x05\xe6\x63\x60\x46\x66\x20\xd2\xbb\x83\xeb\xa4\xb6\x57\x33\x4f\xe2\xe9\x19\xf0\x8b\x3d\x10\xa5\x45\x9a\x15\x80\x08\x51\xf9\x26\x59\x64\x8f\x77\xef\x58\x1e\x86\x6e\xc2\x2c\x11\x64\x0c\x99\x27\xe2\x6e\x59\x2b\x09\x14\x7c\x51\xb5\xf8\x0c\x85\x07\xd8\x7f\x21\x68\x29\x66\x39\x1f\x55\x48\x20\x30\x6d\xcf\x28\x65\x38\xd1\x28\xa1\x98\x99\xe7\x70\x8e\x47\xb7\xc5\x0f\x52\x12\x98\x94\x27\xc2\x34\x8f\xed\x4e\x8a\xc5\xa0\xf1\x8d\xd5\x2b\x32\xe6\x44\x6c\x5e\x3d\xb6\x57\xe0\x3e\xd5\x15\x94\xb9\xf1\x2a\x28\xbe\xa0\x1a\x08\x95\x36\x08\xb1\xa8\xf6\x61\x60\xeb\x06\x6e\xd7\x90\x3e\x69\xd2\x11\x5b\xa9\x8b\xa3\xc9\xa8\xb4\x65\x22\xbd\x71\x8a\xc7\x27\xda\x8a\x87\x8f\x8d\x92\xae\x85\xca\x47\x84\x00\xc7\xbb\x17\x8e\xca\xb1\x16\x2b\x7a\xd9\x0e\x24\xf5\x91\x19\xef\x91\x20\x9c\x13\xe3\xf7\x0b\x9a\xb6\xef\xa4\xde\x50\x1f\x4f\x1a\xd0\xb8\x87\x14\x7c\x82\x8e\xd6\xf6\xe4\x51\xcd\xe9\xd6\x4a\x3c\x4d\x9a\xc5\xf1\x08\x14\xb4\x13\x7c\x41\xd3\xc6\x9d\x19\xdd\x61\xe7\x15\x5e\xf0\xbc\xaf\xcd\x69\x6c\x93\xa4\xdf\xf4\x4a\x83\x37\x1e\xb9\xbe\x8f\x94\x4c\xa0\x4a\x1d\xc2\xfd\x7c\xf1\x57\xc0\xa0\xfc\x63\x6c\xcb\x2f\xb2\x97\x1d\x2f\xe5\x05\x62\xf2\xb2\x81\xdc\x07\x3d\x70\x60\x42\xd5\x84\xd4\xf8\x65\x23\x33\xf7\xf9\x22\x31\x82\x21\xa7\xca\xab\xde\x1a\xef\xde\x6d\xd7\x0e\x09\x24\x96\xa8\x64\x47\xd1\x57\x12\x89\xb3\x7f\xee\x11\xc3\x14\xad\xec\xdb\x4f\xe3\x5f\x98\x49\x4e\xdd\xa7\x2c\xba\x7f\x18\x29\x40\x75\x5c\xb2\x34\x66\x3b\x2e\x13\x33\x8a\xe9\x2a\xd3\xa6\x2c\xa0\x7a\x3c\x98\x5b\x2c\x57\xfe\xc2\x64\xc4\x76\x7c\xdf\x45\xc8\x2c\x2f\x24\xd5\xe2\xde\x89\x6e\xdd\x9e\x3b\x69\x95\x4b\xf8\x3d\x71\xc7\x72\x18\xe4\x92\xc6\xf0\x22\x0c\xc5\x17\xb5\x53\xb3\x18\x4e\xdf\x12\x0d\x1f\x18\xcc\xc9\xf0\x56\x5f\x8d\xed\x2c\x84\xa7\x60\xd7\xeb\x35\x22\xa2\x79\x3b\x4a\xbf\xda\x33\xfc\xc9\xeb\x14\x4d\x2d\xf0\x2a\xfe\xfa\x35\xc0\x4d\x3c\xc3\xc0\x45\x0d\x14\xba\x85\x30\x09\xba\x0c\x87\xfc\x7e\x52\xae\xaa\xb9\x8a\x47\x64\x5f\xc4\x91\x93\x9e\x1f\x0e\x43\x05\x29\x34\x4a\xac\x8e\x96\x4b\x9f\xc7\x8a\x8d\xa4\xec\x8e\xaf\x75\xad\x98\x72\xdc\x4f\xe1\x72\xf8\xc1\x3e\xa1\xac\x81\xa4\xa8\xb2\x60\x83\x7e\x8a\x3e\x15\x49\x35\xa7\x22\x13\x53\xe6\x61\x5f\xdd\xf0\xb3\x47\x19\x6f\x4b\xd2\x49\xb6\x63\xe8\xfd\x0b\xad\xf7\x88\x93\x1a\x0e\xe0\x9c\x29\xa4\x49\xa5\x58\x53\x30\x9b\x57\xf6\x81\x93\xb7\xeb\xc4\x67\x11\x7e\x77\xa1\xda\xa2\xc1\x3a\x14\xbe\x78\x17\x55\x1f\x96\xa8\x4f\xe8\x75\x74\xa7\x34\xf9\x53\xf3\xe4\xb1\x26\x2c\xec\xe3\x04\x46\x31\x85\x64\xf7\x34\xb2\x02\x1b\xe6\x20\x5f\x90\x82\x8c\x91\xce\x67\x0f\xea\xb5\x83\xa9\xe6\xed\x43\xa9\x48\x1e\x27\x6f\x35\x92\x99\x3c\x51\x58\xa0\x4f\x3e\xec\x86\x11\xf2\x85\x79\x7c\xb1\x12\x1f\x74\x20\xa1\x1e\x5e\xf4\x26\x86\xe7\x1d\x1f\x61\x96\x7a\x1f\x2c\x96\x03\x04\x64\x5d\xea\xae\x4c\x01\x7d\xcb\xb9\x1b\x1e\xcf\xd0\x2f\x23\x3c\xfe\xe8\xef\xf8\x0f\xff\xf6\x3f\xf7\x9f\xfc\x6b\xff\xad\x3f\xf8\xbf\xfb\x27\x3f\xf5\x9b\xed\xff\xe2\xbf\xff\x47\x7e\xfe\xef\xfd\x04\x9b\x3f\xf3\x27\x93\xfe\x89\xff\xcf\xbf\xf2\x6f\xf4\xdf\xf0\x45\x68\xe9\x31\x69\xa9\x46\xbc\xbb\x3f\x20\xa8\x82\x42\x5c\xb4\xc3\xc4\x05\x18\xe6\x79\xa4\xd8\x25\xc2\x47\x50\x27\x68\xa3\x43\x37\xf0\x05\xc7\xcd\x68\xd6\xb6\x1f\x9f\xd1\xda\x4c\xb9\xf8\x30\x70\xb6\x5b\x55\xef\x4b\x0c\x24\x37\x09\x03\xde\x02\xe5\xfb\x3a\xa6\x69\x43\x54\xb1\x2f\xf8\xbb\xa1\x23\x8c\xc3\xd2\xdb\xe5\x24\xb6\x74\xcf\x31\x20\x40\xbc\x17\x26\xbd\x3d\xef\xa2\x82\x6b\x54\x59\x85\x59\xc6\xe2\xd4\xea\x8b\x02\xc3\x68\x64\xb7\x73\x8f\xac\x6a\x7d\x37\x08\x53\x4d\xda\xa8\x3a\xbc\x35\x91\xe9\xc0\xe2\x51\xb1\xbc\x3c\x74\x6a\x9b\x68\x97\xc0\x4f\xf2\x09\x46\xef\x17\x2d\xe8\xb6\x30\xb8\x75\x03\x4e\x72\x7e\x3a\xe6\xeb\xe0\xbc\x0f\x0c\x9b\x3c\x70\x89\x00\xb1\xe2\x6b\x12\xf9\x9c\xf3\x05\x98\x43\xb6\xc5\xdd\xd4\xd0\x4a\x6f\x04\x83\x2b\x84\x70\x6e\xc8\x25\xce\x6c\x59\xb6\x50\xd4\x3c\xcb\xc7\xbe\x83\xee\x67\x66\x0e\xce\x17\x1c\x37\xe4\xe6\x71\x4b\x5e\x11\x66\x1a\x6a\xe8\xa8\x24\x8b\x27\xb8\x5c\x7c\xc5\xa8\xea\xd2\x10\xcc\x25\x9a\x99\xfb\x29\x93\x0d\xc7\xbe\xa0\x5d\x46\xa2\x5c\x91\xe2\x11\x61\x70\x3b\x97\x38\x59\x31\x16\x52\xf5\xa9\x6b\x96\xde\x9c\xf2\x09\x0e\x5d\x4e\x51\x16\xe1\x9a\x70\xfc\x82\xf0\x28\xb9\x8c\x68\xf4\xea\xe9\x20\xbd\x2d\x0f\x8e\x75\x73\xcc\xec\x9b\x1f\x76\xc2\x72\x3e\xad\xe3\x1b\x82\xfe\x2c\x49\xed\x33\xbe\x09\xde\xeb\xa0\x64\xce\xb5\x37\x87\xb4\x62\x9c\x0a\x35\xbd\xcf\x7d\xdd\x16\xf3\x4a\x07\xfd\x45\xa7\xb3\x88\x85\x1f\xd0\x51\x30\x51\xfc\x22\x54\xac\xe4\x75\x1e\x04\xec\x98\xcc\x3a\xa5\x75\x43\xdd\x6b\xc2\xd1\x80\x0e\x6c\x86\x5d\xb6\x59\xea\x63\xe9\x30\xe1\x08\xef\x86\xa8\x5f\x80\x39\x9b\x13\xe6\x6a\xa6\xb1\x8a\xf0\x7a\x05\x1c\x93\xd9\x82\xa9\x58\xce\xfb\xf0\x91\xd7\x0a\x61\xc5\x43\x90\x1d\x57\x9e\xa0\xdb\xf9\x82\xfc\xd1\x40\xb7\xd6\x5e\x8f\xdf\x50\x21\x97\x8d\x1d\xf8\xb8\xed\x61\x6d\x6f\x68\x51\x31\x2f\x56\x70\x0b\x54\x78\x6a\x50\xb5\x01\x73\xbe\xd8\x5e\x53\xcd\xd8\x5b\xc0\x34\x8f\x9e\x73\x1f\x11\x8e\x9f\x1d\x0e\x9d\x28\xaa\x73\x07\x1f\xb7\x25\x1a\x3c\x4f\x79\x45\x2b\x77\xcd\xf5\x49\xfe\x11\x95\x39\xd0\x18\x59\x21\x3d\x1a\xaf\x47\x15\xa5\x08\x32\x90\xb2\x9e\x0a\xca\x25\x86\x96\xbe\x2e\xe3\x95\xa0\xbd\x1e\x04\xf3\x85\x22\x8c\x3f\x1a\x39\xc3\x8d\x46\x97\x82\xb7\xc5\xc8\xe0\xce\xac\xf8\xc9\xd4\x28\x36\x5d\x31\x42\x6e\x94\xe9\xce\xe2\x68\xaf\x50\x34\x85\x0f\x34\x37\x8c\x60\xdd\x99\x6c\x07\x61\x89\x06\xea\x98\xbd\x6c\x99\x1d\x92\x8a\x47\x6e\x9e\x30\xab\x3c\x9e\x73\x9f\x40\xa7\x37\x2b\xd5\xf0\x45\x98\x2d\x63\x9b\x25\x18\x14\x5a\xf2\x51\x3c\xde\xcc\x49\xce\x6b\x79\x62\x20\xa3\xcc\xb3\x73\xfc\x10\x46\x13\xf1\xe2\xab\x33\x06\xa2\xb5\x0f\x76\xe8\xac\x16\x9e\x93\xd8\x71\x62\xb0\x0b\x6a\x63\xcb\xed\xcf\x2b\x1f\x17\xea\x06\x6a\x90\x76\x8d\xdf\x41\xbb\x85\xc3\x01\x16\xf4\xf5\x89\x27\x1f\xf3\xe7\xed\xdb\x8f\x27\x0c\x56\xeb\x25\x12\xb2\x4e\x63\x0d\x7e\x8e\xcc\xdf\x0d\x6a\x4e\xec\x07\xd4\xe0\x08\x29\x39\x6d\x3d\xd9\x17\x94\x35\xc6\xa3\xb1\xfe\xf4\x26\x6f\xf2\xde\x4a\x0e\x83\x6a\x6a\x32\x40\xad\xc8\x1d\x8b\x1b\xb5\x31\xaf\x5d\xda\xcc\x8a\xe4\xa1\xd6\x7d\x61\xfb\xea\x3f\xcc\xe9\x08\x10\x1e\x14\x22\xd3\xa8\x87\x92\xb7\x32\x21\xe2\x91\x0f\x5e\xa6\xd3\x94\xf3\x4e\xe0\x5d\xcf\x68\x4e\x43\xd9\xd9\x17\x7d\x24\x72\x8c\x99\xd6\x24\xbf\x2b\x00\x9b\xc8\x73\x24\x1d\x64\x76\x40\xd1\xeb\x78\x2d\x42\x01\x4f\x0d\x7c\xeb\xbb\x0c\x6b\x7e\x4e\xf0\xc5\xdc\x89\xc3\xb8\x37\xcc\xa0\xe9\x7c\xa8\x50\xce\xab\x33\x94\xae\xca\xc7\xfe\xe2\x7c\x08\x4a\xa3\x35\xa5\xcb\x78\xe0\x51\xf4\x0e\xd4\xbf\x88\x4e\xd5\xee\x18\x90\xb6\xc4\xa9\xd4\x4c\x93\x76\x63\xf8\xd2\xb3\x2e\x24\x09\xce\x4e\x49\x5d\x14\x5b\x93\xc8\x2c\x52\xc2\x22\xa1\x9f\x68\x2b\xd2\xc1\x6d\x28\x14\xf5\x7b\x4a\xb8\xf8\xae\x45\xd1\x68\x0f\x22\xe5\x3e\x1d\xd4\xc8\xd0\x63\x2e\xf2\x4a\xd0\x17\x84\x4a\x57\xb8\x5f\xa8\x26\x8f\x94\x25\x3e\x8e\xd7\x46\x2c\x43\xee\x4a\x13\xaa\x6b\x2c\x04\x32\x9f\x02\x2a\x6c\xc4\x79\x50\xdd\x63\xdf\x5d\xd1\x71\x6d\x7f\x41\xdf\xb3\x82\x3b\x79\xed\x59\x3e\xdb\xa3\x62\x22\x68\xae\x8e\xd3\xc0\xf0\xbc\xa9\x93\x83\xc3\x41\x6d\x54\xc1\x3d\x41\xb4\x80\xac\xe0\x17\x4b\x47\x3e\xad\x20\x7b\x3c\x0b\x8d\x6b\x52\x1b\xad\x62\xf1\xc8\x94\x74\xed\x41\xd1\xb7\x17\xbd\x90\x94\x45\x97\x09\xe7\x9c\xc4\x1f\x14\xbe\xe8\x23\x90\x9f\xee\x74\xbf\x24\x92\x8c\xbb\xcf\x42\x15\x6f\xf3\x04\xae\xa8\xac\xa9\xad\xea\x66\xa7\xca\x94\x4d\x56\x8f\xf6\x1d\xa5\x7f\x81\x8a\x9e\xe3\x88\x89\x52\x85\x19\x4a\x1f\x22\x07\x28\xcf\x6b\x79\x4d\x03\x71\xe4\xd7\x4e\x0e\xea\xea\x7b\x17\xe1\x59\xed\xa1\x2c\xb0\x2f\xde\xc5\x43\x8d\x5e\x70\x00\x2f\xd6\xaa\x7c\x73\xa3\xb0\x0c\x39\x5b\x31\x3b\xbd\xeb\x68\xac\xde\x39\xf3\x30\x0f\x63\xba\x89\xcb\xf0\x2f\x39\x6b\xf1\x8b\x84\xc7\x3f\xfe\xf1\xbf\xfa\x57\xff\x63\x7f\xe1\x3f\xfe\x3f\xfa\xdf\xfe\x67\x7e\xd7\xcf\xfd\x3c\xf8\x71\xf3\x7b\x7f\xea\x57\xf8\xbf\x36\xff\x6f\xff\x68\xfc\xc4\x7f\xfa\x47\xd6\x7f\xe1\x37\x8b\x0f\x08\x0f\x1a\xee\xc4\xea\x3a\xc5\x76\xce\x70\x72\x30\xdf\xf9\x04\xc9\x22\x89\xbd\x56\x78\x05\x99\xe7\x38\x1c\x81\x4f\xef\x69\x83\xca\xfe\x85\x9e\x80\x03\xb7\xa5\x07\x65\x86\xd1\x1d\xe1\x8a\xbc\xdc\x57\xa9\x46\xc3\x55\x2b\x92\xa9\x77\xd1\x35\xff\xe2\x37\xf6\xe3\x50\x2c\xb5\x7d\x51\xe6\x70\xe0\x19\x01\x0a\x27\xe1\xab\x3a\x82\xb9\x3d\x3a\x9a\x87\x40\x94\x55\x18\x72\x3d\x13\x30\xa6\x15\x0b\xc7\x2d\x67\xca\x83\x3f\x91\xdf\xbe\xb5\xf6\x74\xee\xc0\x0f\xbd\x50\x50\x4b\x38\x8c\x16\xb3\x53\xbb\x4d\x8d\xbf\x3e\xb8\xc8\xae\xdb\x54\x82\xe0\x17\xc3\x48\xb0\x4f\x52\x12\x3c\x41\xf9\xb9\x74\x16\x11\x56\x59\x59\x24\xf0\xc8\xb5\xc6\x5c\x9b\x20\x4b\xfd\x92\x19\xcf\xf8\x12\x9f\xa5\x66\xd7\x27\x5f\xbf\xd8\x1b\xaf\xeb\xf3\xdb\xde\x84\xd1\x6b\xcb\xd2\xda\x7b\x53\xce\x10\x3c\x3d\xda\x68\xb6\x60\x02\x59\xd4\x29\x98\xe7\x4f\x44\x8c\x23\xce\xbe\x80\xd7\x4f\xea\xba\x53\x3d\x0d\x64\x21\x6c\x73\xf4\x8b\x4c\x10\x3d\x1c\x8f\x4f\x4b\xa4\xf4\x30\x85\x66\x98\x10\x22\xb7\x07\xb5\x53\xff\x45\xc9\xaf\x8b\x9d\x4b\x9c\x48\x43\xa5\xf5\xb4\x9b\xa1\xc0\x04\xcf\x4e\x21\xb4\x0a\xd2\x78\x9e\xa8\xdc\x99\x56\x43\x61\x26\xf1\xf4\x93\xfc\x72\xb6\x74\x7f\x98\x7d\x5a\x9e\xa2\x24\xe3\xbb\x7b\xa1\xf2\x87\xbc\x38\x52\xd9\x21\x84\x08\x9b\xcc\x0b\x41\xc7\x70\x01\x05\x08\xd5\x7f\x41\x90\x3a\x0d\xc4\x53\x08\x79\x25\xbd\x2d\x8d\xf2\x92\xe7\x3e\xd3\x4a\x13\x1b\x92\x3b\x8b\x0d\xe8\xd3\x3a\xf6\x6f\x6e\x33\xb2\xe2\x99\xfb\x82\xfc\xc9\xca\x9d\xa3\xa4\x9c\x40\x17\x3d\x87\xb8\x95\xc6\x6a\x8f\xc0\xae\xcf\x71\x91\xaf\xdd\x0c\x42\x89\x8c\xa9\xf7\x86\x7b\xec\xed\x8b\x7b\x07\x11\xcf\x0c\xbd\x95\xf0\x31\x22\x5e\x00\x76\xd4\x4f\x46\x1b\x3b\xa2\xe7\x5b\x97\xef\xb8\x72\xfb\x44\xfc\x0c\xbe\xef\x30\x1a\xf6\x2f\xea\x05\x6b\xc0\xe6\x1f\xa6\xf5\xb2\x58\xba\x9e\x26\x43\x5c\x60\x42\x4e\x31\xbb\xed\x74\x8c\xd7\x4f\xe9\xd9\x35\x34\x04\x78\x2d\x9e\xe2\x8b\xa1\x1d\xb0\x84\xdc\x6a\x67\x9c\xd7\xe7\x5e\xbd\x55\x43\x1f\xf8\x64\xcd\xe3\x72\x22\x71\xfc\x6a\xee\xdd\x2e\xfa\xa5\x59\x4a\x58\x82\xfc\x22\x6d\xa7\x93\x31\xa1\x68\xf0\x38\xda\x42\x74\xe7\xad\x21\x2a\x83\x80\x6d\x3a\xd2\xce\xae\x9f\x95\x66\x36\x2e\xa0\xb5\xcf\xee\xa4\x0d\x5f\x6c\xaf\x87\x68\xfa\x42\xab\x68\x76\x54\x38\xc1\x8e\x4d\x9b\x28\xf0\x6c\x00\xb0\x7b\xef\x91\x3e\x12\xdb\x05\x39\x44\x6f\xdf\x87\xa0\x9f\x88\xc3\xcb\x56\x13\x2c\x53\x6b\xf3\x72\xa0\x41\x8c\x1f\x0b\x9a\x29\x08\x3e\xab\xa5\x7d\x4a\x19\xe9\x92\xe9\x4e\xa4\xce\x81\xb1\x6b\xfd\xa2\x5e\x44\x5d\x48\x7f\x99\x2d\x76\x89\x47\x91\x98\xed\xd3\x59\x58\xa7\x1c\x90\x0c\xe9\x2b\xaf\xf0\xbe\xa6\x70\xe5\x9e\x24\x8d\xf5\xfc\x93\xa4\x32\xfd\x20\x1f\x85\x45\x3b\x5a\xd8\xe6\x58\xd0\x25\xda\x1c\x62\xe8\x25\x64\x57\x35\xa7\xcf\x29\x77\xcd\xde\xbd\x49\x52\x7d\xcd\x4f\x24\xea\xb3\xbc\x8f\x62\x8f\x70\x3e\x64\x26\x9c\xb3\x15\x8e\x13\x0a\x7e\x9d\x79\x17\x0d\x8f\x78\xd8\xe3\xdb\xa0\xa1\xbd\x6a\x38\xc4\xbf\xb9\x09\xd2\x51\xcc\xb2\xa6\xe4\x25\x02\x96\xcb\x6c\xc8\xf3\x42\xa2\x08\xc1\xf3\x8c\xc2\x87\xe6\x78\xc5\x0c\x8c\x7a\xeb\x9c\x7c\x0f\xfd\xc5\xb1\x4b\xc6\x5c\x27\x13\xe2\x65\x02\xe7\x35\x5e\xf2\x60\x5b\x44\xb2\x43\xa0\x7b\x0b\xb3\x50\x40\x96\x2f\x7a\x6e\x5b\x52\x9d\xfe\xb8\xe7\x93\xf4\x0c\x8f\xd4\x4d\x30\x36\x6c\x30\x7f\x1a\x53\x94\xd5\x2a\x38\x13\x5e\x72\x20\xfd\x8d\x96\x0f\x55\xe0\xcb\x2a\xf2\x2a\x0d\x4f\x5a\xfb\xc2\x58\x73\x4a\x79\x5f\xa7\x7d\x71\x2d\x77\x07\x74\xab\x6d\xc9\xfd\xb0\xd3\xed\xa3\xd7\xd9\xa5\x19\xbf\xd9\xb9\xa3\xce\x26\x5e\x51\xbd\xf8\x82\x14\x5c\xa6\x41\x54\xbc\xb2\x30\xaa\x5b\xb5\x62\x37\xa4\x11\x38\xe8\x04\x48\x39\xd0\xb1\xd5\xd8\x24\x0d\x65\xae\x64\x00\x1f\xae\xcf\x17\x37\x0a\x25\x2c\x52\xd2\x29\xf9\xa3\x7b\xea\xef\x24\x07\x5a\x57\xea\x75\xc3\x55\x44\x1f\x0b\x80\x22\x7d\xb9\x8a\xe4\x15\x12\xe7\x72\xce\x17\x89\x54\x80\xef\x6c\x30\xe5\x11\x4b\x64\x05\x9b\x65\x3a\x81\x31\x70\x23\x2c\xf8\xd2\x58\x18\x1e\x08\x08\xf2\xe8\x02\x64\x34\x22\xa2\xf8\x09\xbc\xde\x20\x6d\x2b\x64\xee\xe4\xe5\x29\x73\x60\xf7\x72\x40\x1b\x96\x96\x92\x66\x48\x94\x6f\xa0\x4c\x3d\x86\x4f\x6f\xd5\x31\x88\x7f\x12\x23\x7b\xee\xb2\x11\x73\x25\x60\xcf\x15\xee\xfe\x94\x02\x65\x2c\xa0\x36\xa5\x9e\x06\xb0\x79\xd5\xa8\x5a\xba\x04\x5c\x7a\x60\xeb\x9f\x5c\x3e\xdb\x7d\xbd\x40\xd9\xd0\x69\x65\x52\xbc\xd3\xa6\x43\x13\x35\xf3\xb4\x79\xb1\x98\x3a\x88\x5e\xec\x61\x8f\x14\xf0\xbe\xae\xc3\x77\x7c\x91\xf9\xa3\x28\xc8\x57\xe1\x0c\x65\xef\x9b\xaa\xf7\x14\xaa\x61\xd2\x58\x6a\x31\x0d\xdf\x80\xa6\xa7\x64\xb0\xf0\x22\x62\xba\x7d\x4e\xf8\x24\xc0\x75\xdb\xc3\x32\x80\xce\x19\x5d\x5b\xac\x8f\x95\x0f\x1d\x6f\x59\x22\xc0\x30\x7d\x32\xa2\xba\xbe\x75\xd3\x09\x20\x70\x35\x2c\xbf\x54\x29\xf8\x8b\x84\xc7\x4f\xff\xbd\x3f\xf4\xf3\x3f\xf6\x97\xff\x9b\xff\xdd\xff\xf1\x5f\xf9\xc9\xbf\xf9\x37\xff\x31\xfb\x07\xff\x9d\x1f\xfd\x4b\xff\xf4\xdf\xfa\x5d\xbf\x1a\xff\xdb\xe9\x4f\xd5\xdf\xfd\x27\xff\x9f\x7f\xf9\x03\x4b\x4b\x59\x0d\x06\x70\x1a\x96\x27\xe1\xc7\x7b\xc5\x73\x33\x05\x9e\xe7\x61\x73\x08\x54\x99\xb0\x47\x71\xb6\xa9\x2e\x32\x5b\xe6\xda\x17\xcc\x19\x7f\xb2\x46\x55\x92\xb2\x63\x5f\x9c\xf2\xbb\xea\xa5\x4b\x06\x19\xc7\x0a\xa6\xc3\x51\xd1\x4a\x93\xc8\xd7\x21\x0e\xec\xf4\xf2\x9b\x9d\x18\x5a\xe1\x50\x7d\x9f\x8a\x15\xb6\x94\xd3\x87\x1b\x6c\x8f\xb8\x6d\x98\x17\xe2\x8c\x46\x85\xfb\x06\xcd\x7a\x16\xe5\xe5\x75\x46\xff\x45\xc0\xda\x53\x6d\x12\x4b\x8e\x26\x19\x2d\xd1\xf6\x61\xc0\xbc\x23\xa4\x0e\x39\xbb\xf7\x28\x4d\xb6\x21\x82\x15\xea\x51\x55\x35\xb7\xfc\xc5\x95\x65\x8e\x8b\x53\x4f\x31\x1d\x70\x38\x90\x63\x5b\xf6\x6e\xaa\x93\x5a\xf0\x96\x2a\xbc\xf1\xf2\x77\x68\x31\x65\x10\x96\xe7\x36\xd2\x82\x5f\xec\x4a\x95\x88\x8c\xf7\xa4\x77\x28\xef\xe0\xef\x71\x11\x09\x13\xa0\x8c\x63\x44\xb7\x4a\x84\x7b\x51\x97\x43\x7d\x5e\xe7\xac\x71\xc8\x82\x2f\xe4\x74\xc4\x25\xf0\x98\x75\x69\x1e\x03\x25\x42\xb6\xc3\x63\xf9\xd6\x67\xe5\xe8\x64\x7d\x3b\x48\x74\x06\xb5\xf9\xd9\x80\x51\xe7\xfb\x17\xd0\x81\xf7\xc7\x74\x81\xea\xf1\x47\x14\x0d\x54\xc7\x4d\xc6\xb7\x36\xf0\xde\xde\xcc\xb9\xe6\x01\x12\xd9\x06\x16\x4a\x72\x2f\x09\x63\x83\x5f\x94\xb9\xdb\xfb\xb2\x70\xc0\xd7\x5d\xc9\x22\x2c\xa9\xb3\xed\xa0\x0f\xb1\x9b\x07\x6d\x81\xb1\xeb\x48\xe9\x67\xe9\x1d\xed\xdc\x7b\xd2\xf6\xc5\xa0\x0a\x5f\x7c\x81\xe5\x4a\xf4\xc3\x88\x61\xc2\xd2\x9d\xde\xa9\x30\x9e\x4e\x5a\x62\xf4\xf3\x84\xb1\xe9\xf3\xa8\x1b\x92\x8b\xce\xe8\x2f\x64\x96\x2c\x46\xc0\x33\x26\x74\xae\x79\x2c\xeb\x95\x2f\x83\x10\xa0\xd9\xf0\x54\xb7\x9a\xa6\xa2\xc0\x42\x9d\x41\x28\x9d\xe0\xb3\x10\xfd\xc4\x87\x4e\x8f\x5b\x47\x16\x22\x65\x4f\xe7\x71\x7b\x9d\x45\x9f\x8c\x8e\x51\x16\x99\x6b\x8d\xd0\x10\xf7\x12\xe1\x12\xcc\x7b\x2d\x0e\x03\x5f\xe8\x8f\x26\x49\x36\x6a\x53\x9b\xf6\x72\x2f\x0a\xc2\x13\x28\x8b\xa5\x69\xd7\x91\xee\x39\xdf\xdc\x46\x23\x9b\xcc\x5b\x82\x02\xa8\x7f\x63\xfb\xaa\x24\xc2\x9e\x87\x4d\x0e\x59\xe8\xe6\x9b\x99\xde\x8f\x6b\x89\x50\x6f\xd3\xd6\x0b\xba\xb8\xdc\x36\x7b\xaf\xf8\x1a\x14\x72\x93\x5f\x40\x87\x61\x33\xc6\x25\x2b\xd7\xda\x66\xb5\x88\xfb\x8c\xca\xc7\x25\x39\x97\x18\xa5\xb1\x76\xd6\xdd\x9a\xeb\x17\xf8\x05\x80\x73\xf9\x0b\xa1\x3c\xf7\x4d\x09\xea\x46\x41\xa3\x96\x86\xdb\x3d\x1e\x8b\x07\x07\x59\xf5\xc8\x64\x77\x29\x76\x8f\xac\x0a\x97\x80\xaa\xb0\xa1\x56\xe1\x17\x84\x87\xa0\xfb\x79\x0c\xbf\x05\x4d\x6e\xa4\xe0\xae\x85\xa3\x9e\x0b\x6e\xb9\x9a\x5c\xf3\x02\x33\x67\x44\x47\x24\x55\x26\x7f\xb4\xe9\x5f\x80\x39\xe6\x70\x1c\x05\x22\x8a\xa8\x4d\x2b\x13\x85\x99\x4d\x12\x77\x84\x7b\x4d\xac\x0b\x3a\x9e\x19\xfa\x29\x87\xab\xae\x48\x21\x50\xf1\x4f\x14\x61\x9d\x3a\x99\x65\xe8\xb6\x8d\x89\xbc\x49\xa8\xef\xbe\x9c\x05\xc5\xf0\x57\xc3\x84\xdc\x22\xf5\xb8\x79\x6d\x2e\x5b\xd2\xcb\xce\x17\xbf\x08\x4c\x75\xdc\xc0\xbd\x78\x27\x75\x41\x1c\xdb\xc8\x2a\xfd\x5e\x65\x90\x8d\x6d\x94\x18\x60\xf1\x0a\x04\x7c\x78\xd2\xb8\x44\xfb\x89\x82\xf4\x56\x15\x54\x55\x19\x5b\x0b\x92\x87\xbd\x78\x1a\x44\x7f\x38\x3e\x32\x42\x55\x7a\x0d\xe4\x34\xcc\xa1\xc5\xb1\xd4\xda\xcc\x64\x9f\x54\xf0\xaa\xb2\x29\x07\xf9\x6b\x79\x52\xdc\x88\x8e\x9a\x5f\x0b\x13\xe0\x78\xb3\x8e\x33\x3c\xad\xc4\xab\x40\x66\x9e\xad\xc9\xd3\xe3\x17\x36\x8e\x19\x8f\xd2\x2e\xc5\x87\x6b\x2e\x8c\x68\x7d\xb0\x9a\xd1\x05\xfc\x5d\xda\x6b\x81\xca\x4b\xce\x6e\xcf\x33\x75\xc9\x6e\xfa\x94\x3f\x39\x14\xac\xc9\xb5\x84\x6b\xd5\x10\x29\xab\xbe\xd7\x78\x67\xf7\xb5\x44\x00\xa6\x16\xbb\xd0\x0b\x14\x93\x9e\x88\xac\xe0\x1e\x6f\xd4\xae\x5f\x4c\x7c\xf2\x51\x3e\xed\x5c\x07\x79\x6e\xab\xf6\x69\xc4\x04\x9e\x61\x9e\x40\xa7\x9b\x0a\xdb\xe1\xe8\xb5\xdf\xec\xb9\xb9\xb2\x58\xc7\xef\x27\x9a\x1b\x4a\x2d\x37\x00\x72\x1d\x4c\xcd\x0f\x6a\xd8\xb8\xdd\x65\x82\x19\xec\x7c\x45\x73\xc2\x54\x8d\x5f\xfa\x46\xbb\x46\x3c\xd7\xba\x2f\xac\x4e\xb0\x65\x7c\x33\x68\x58\x14\x30\xac\x09\xf8\x5d\xe0\x87\x3a\x7a\xba\x0b\x25\xf0\x8c\x6e\x1a\x80\x42\x2b\x24\x42\x8f\xa0\x68\x7f\x72\x97\xaf\x29\x86\x19\x74\x3a\xb1\x1c\xcc\x84\x7c\x1f\x1f\xda\xae\xbd\x09\xc3\xb9\x8c\xa6\x25\xc9\x41\xde\x4a\x3a\x20\x12\x04\x14\xf9\x2f\x66\x70\xe6\x8e\xc6\x8a\xa8\x67\xe0\xac\x5e\xb6\x09\x26\xc2\xa0\xf7\xe8\x42\xd8\x32\x8a\x85\x6a\x4f\x42\xcb\x1c\x0a\xe1\x20\xcb\x3c\xe3\x8b\x55\x06\x4b\x9b\x83\x08\x71\x15\xc5\xbe\xbe\x3e\x85\x73\x17\xa9\x91\xf9\x19\x5b\xe6\x4b\x6c\xaf\x3b\x22\x7f\x15\x03\x46\x05\x54\xee\x27\x0a\xd2\xb5\x64\x7a\x40\x60\x10\x4c\xcb\x43\x08\x1b\xe9\xb6\xde\x64\xc5\x7a\xb3\x39\x3d\xd7\xa1\xed\x29\x4f\x97\x36\x64\x85\xe3\x42\xf0\x13\x23\x9e\x67\xc0\x0c\x03\xcd\x30\x64\x21\x88\xe9\x13\x33\x94\xb4\x4e\x5b\x43\x5e\xb1\xf6\x62\x9e\x18\xb5\xea\x5e\x51\xc2\x66\x97\x22\xff\x32\xc2\x03\xff\xfd\x9f\xcd\xcf\xcf\xfd\xf5\xdf\xf9\xcf\xfe\x1a\xf9\x3d\xbf\xff\xbf\xf2\x5f\xfe\xa7\xeb\xff\xf4\xab\x7e\xfa\xe7\xff\x0f\xff\xff\xdf\xfd\x17\xff\xf7\xff\xf2\x7f\xfe\x5f\xfd\x2d\xff\x91\x3f\xf9\x81\xc2\x23\x3c\x07\xb2\x4d\x56\x62\x5e\x2b\x93\x82\x72\xd8\x7a\xda\xd0\x58\x69\xd8\x18\x38\xc7\x8c\xae\xd9\x29\x3e\xec\x3a\x13\xb8\xab\x5f\xb0\x88\x90\x4c\x74\x1f\x88\x21\x31\xea\x98\xa1\x52\xc2\xeb\x16\x23\xf1\x0f\xd8\x61\xb5\xf0\x3c\xd9\xb7\x8a\xf4\x1c\x32\xcd\xf8\x5c\x2c\xbe\x80\x51\x77\x4f\x75\xe0\x0e\xea\x3e\xb8\xba\xc2\x04\xf2\x98\x38\xbb\x88\x73\xea\x55\xac\x3b\x90\x2f\x26\x58\x08\xe6\x61\xdd\x8b\xc7\x4f\x52\x12\xea\x7a\x4c\xad\x0c\x4c\x5d\x66\x7c\xe6\x2c\x6b\x8f\x44\xf5\xc4\x1d\xb0\x90\xe8\xc8\x37\x11\xc9\x04\x16\x8d\x51\x24\xbb\x09\x9f\x3c\xe7\x86\x3c\xdc\x10\xf5\xb7\xfa\xf2\x70\xba\x65\x6f\xe7\x36\xd6\x44\x16\x35\x93\x28\x05\x67\xb8\x02\x27\x70\xa9\x4c\xea\x21\x61\xf8\xc2\x3f\x38\x41\x84\x0f\xed\xbe\x24\xc1\x20\xdb\x34\x1a\x3a\x81\x49\xb6\x30\xe4\xaf\x17\x04\x52\x5a\x74\x82\xb2\xd9\x8d\x70\x51\x1e\xb8\x2f\x0a\x0c\xa1\x54\x2c\xea\xef\xf4\x83\x5a\x1a\x6c\xf3\x49\x02\xd8\xb5\x1d\x68\xc0\x47\x8d\x69\x3d\xe1\x86\xed\x93\xc1\x74\xf2\x81\x46\x7c\x31\x9c\xe1\xad\x22\x7b\xa6\xb9\x4c\xd5\x61\xac\xde\xeb\x4c\xcc\x18\x4f\x5e\x2d\xc6\x07\x25\xf8\x7a\xb9\xfd\x8c\xa6\x22\xda\xa8\x1b\xfd\x0b\xcd\x0d\xf5\xf3\x60\xd2\x54\x98\xb2\x99\xe9\xed\x43\x55\x44\x2f\xde\x37\x0e\x61\xe2\x40\xd6\x1e\xcd\x06\xaf\x56\x72\x95\xf1\x19\xdf\x30\xed\xeb\xbc\xc2\xcb\x57\xbc\x95\x65\xd4\x03\x8f\x77\x48\x11\xe3\x9e\xb3\x49\xef\x51\x2f\x87\x8e\x44\xb9\xec\x78\x02\x91\xa9\x79\xdc\x17\x5a\x2c\xd5\xd7\xdd\x26\xbc\x9c\xb7\x60\x6f\x95\x78\x6c\xd3\x51\x5b\xbe\x12\xd2\x1f\xa2\xf1\xc9\x6b\xdc\x9d\xf8\xb5\x66\x28\x42\xf4\x17\x47\x93\xf9\xcd\x3c\xf4\xb4\x39\x7a\xa7\x31\xeb\x3d\x24\x4d\xed\x15\x55\x17\x7b\x6f\x20\x5e\x31\x9e\x47\xd9\xc6\x18\x52\x9a\x72\xda\x9e\x2f\x86\x33\x1e\xdb\x93\x33\xc8\xf5\x76\xe4\xdf\xb2\xee\xcb\x03\x8a\x25\x7b\xdd\x5b\xf2\x93\x4a\x87\x4a\x7d\xb2\xae\xa9\x36\x50\x9a\x47\xe6\x7e\x41\xfe\xc4\x5d\xe1\x3a\x8b\x7b\x5b\x1a\x8b\x7b\x46\x5e\x38\x81\x09\xf9\xbd\xdb\xc4\x53\x3c\xd8\xcf\x0e\x39\x0d\x14\xc5\xb6\xf2\x40\xf7\x93\x93\xde\xda\x0b\x35\xcf\x40\xc8\xde\x87\x30\xf6\x1e\xfc\x8a\x2b\x8c\x31\x2b\x42\xc8\x31\xbf\x63\xd0\x47\x4f\xc5\x25\xa9\x0a\x49\x0f\x3f\xa0\xac\x19\x63\xcc\x9f\x44\x0d\x9d\x28\x75\xa0\x12\x43\xcf\x3c\xcc\xfa\xd2\x62\x22\xce\xf1\xcc\x54\x11\x60\x87\x2c\x75\xb9\x77\x3e\x56\x7c\x41\x35\x10\x7a\x6d\xd6\x4f\x52\x10\xb2\x0d\x9e\x13\xf4\x66\xdc\x86\xad\x6f\x86\x28\xd5\x58\xd6\x84\xbc\xfb\xb8\xfc\xf6\x52\x0e\xc3\xfb\x17\x44\xd8\xd8\xde\x34\x81\x6d\x7d\x09\x40\xe8\x79\xca\x3c\x97\x77\x8e\x64\xdf\x12\xe9\xb2\x42\x72\xc9\x16\x57\x00\x70\x29\x9c\xfb\x8d\xfe\x88\x07\x7a\x90\x7e\xbc\x29\xd8\x9b\x17\x87\x6d\x9e\xf7\x2a\xdf\xb7\xdb\x11\xce\x5b\x97\x87\xd2\xc9\xf8\x78\x46\x7b\x3c\x94\x92\x12\xbe\xa8\x17\x91\xbd\xfb\xd5\x15\xb7\x30\xbd\x80\x99\xb3\x77\xcd\x8d\xf8\x26\x93\x9d\x49\x19\x37\xeb\x87\x67\xea\xdc\x3c\xde\x49\x21\xd7\x09\x1f\x10\x1e\xdc\xd9\x57\xc7\x89\xb2\xd4\x3d\x94\x10\x31\xa5\x4f\x32\xba\x68\xfe\x74\x1f\xdd\xda\x5a\x6c\xe5\xf7\xb3\xe2\x1b\x38\x95\x2a\x55\xf9\x05\xc8\x47\x94\x1b\xb9\xf1\x73\x0b\x78\x1d\x16\x6c\x98\x23\xca\x98\xad\xdc\x62\x78\x28\x94\xb2\x7e\x93\x51\x3b\xcf\x58\x5c\xd6\xf9\xf9\xc2\x40\xc1\xd5\x63\x84\x93\xf6\x71\xa1\xd0\x98\x4f\xa3\x6e\xae\x37\x75\xde\x24\x7a\xe5\xb3\x11\xbd\xc1\x95\x26\xb9\x8b\x63\xa8\xce\xa4\x66\x5f\x64\xfe\xc0\xde\x86\xd9\x56\x1a\xa7\x2e\x64\xe3\x25\x8e\x42\x5e\x09\x49\x43\x5a\x61\x94\x33\x65\x9e\xf2\x38\xaa\xc2\xde\x76\x48\xb4\xfc\x27\x36\x8e\x64\x11\x42\x2f\x61\x93\x64\xc4\x3b\x67\x39\xa4\x16\x67\x39\x03\x5b\xab\x59\xc6\xa5\xb6\xad\xd8\x50\xed\x4d\xe0\xc9\x13\x87\x2f\xc2\xf2\x67\x21\xe0\xe9\x67\xe2\x61\xca\x40\x2a\xe7\x57\xa5\x04\xc6\x03\xae\xc4\xe6\xd5\xad\xc7\x68\xce\x19\xc3\x2d\x20\x51\xb7\xda\x9e\x2f\xd6\xc0\xeb\xfd\xa1\x16\x60\xad\xe4\xbd\x69\x07\xd8\x51\x61\x9d\xde\x49\x52\x07\x37\xda\xc7\x0c\xa3\xb6\x62\xd0\x1d\x67\xae\xaa\xb9\x8f\x2f\x7a\x6a\x16\x4d\xec\x85\x81\x71\x8b\xae\xf5\x62\xe3\xc4\x75\x13\xc6\x45\x69\xed\x99\x24\x6d\xe4\x02\xaf\xc5\x3c\xa5\xb6\x1e\x50\xdf\x2f\x0e\x48\x33\x86\xef\xfb\x70\x08\xa2\x43\x4b\x35\x03\x72\x61\x7b\xd7\xa1\xf2\x9e\x74\x0b\x7d\xa8\xd8\x3a\x56\x86\x77\xb2\xb4\xef\xba\xf0\x27\xd6\xc8\x62\xdc\x81\xaa\xec\xb8\x1e\xdc\x86\x78\x06\x27\x82\xc9\xda\x67\xaa\x6a\x8b\x3c\x5c\xb4\x32\x5d\xca\xb9\x8e\x96\x1d\x9d\x67\xfc\x62\xb9\xe4\xc7\x6b\x59\xf7\xdb\xbe\xee\xf1\xa8\xdd\x55\x9e\x4a\x0a\xd5\x8a\xc4\x47\x46\x96\x24\xa0\xaf\xae\xc5\x63\x06\xc9\x7b\xa2\x80\x5f\x7c\xa9\x0c\xd4\xd7\x6a\xa5\xb2\x7b\x0c\xda\x66\x96\x94\x5d\xab\x8e\x92\x8b\x98\x10\x5b\xb5\x37\x38\x50\x26\x5c\x0d\xd2\xb5\xcb\x81\xf1\x97\x18\xba\x7f\x91\xf0\xf8\xa9\xbf\xf5\xd3\x7f\xe0\xd7\xfd\x47\xff\xd8\x4f\xfe\x07\xd3\xff\xe6\x5f\xfa\x4b\xf8\xd7\xfc\xad\x3f\xf5\xfe\xf9\xdf\xfb\xb3\xbf\xe9\xbf\xfe\xab\xff\xca\x6f\xfa\xf5\x7f\xe3\xa7\xfe\x8b\x7f\xf7\xff\xfa\x81\xc2\xc3\x5f\x08\x86\x34\x26\x5f\xa7\x55\xce\x76\x21\x04\x7d\x1a\xfd\xc6\x3d\x79\x0c\x55\xe6\xba\x0c\xd5\x56\x71\xdb\xd3\x20\x20\x8c\x4f\x24\xa7\x35\x07\x21\xaa\xcd\xce\x63\xc8\x5b\x2d\xe5\xde\xb2\x47\x25\x11\x14\xd6\x8e\x19\x10\xae\x1f\xba\x12\x65\x6f\xb0\x27\xc0\x54\xbf\xe0\x75\x99\x47\xa8\x55\x40\x72\xa3\xfb\x78\x81\xf5\x34\x7d\x1f\xb6\x20\x08\xc2\x7a\x1a\xda\x83\x87\xe2\x2f\x68\xea\x09\x74\xd7\x13\xfa\x17\x06\x0a\xb0\x2e\xa0\xf0\x6e\xc4\x40\x84\x61\x12\xd0\xea\x78\x19\xf4\x0b\xe0\x12\x1d\xb9\x95\x98\xbc\x75\xd1\x9d\xa7\x44\x84\xd9\xf8\x93\xdb\x0f\x93\x45\xa3\xdd\xe0\x00\x97\xc7\x5e\xf8\x92\xd1\x1e\xc1\xcd\x1b\x8c\x78\x7a\x3c\x63\x6d\xc6\x67\x92\xfa\x3e\xfe\x64\xbd\x80\xfb\x44\xbc\x35\x20\x63\x95\xbf\x44\xd5\x34\x1c\x81\xd9\x00\x1e\x77\xe1\x88\x18\xb3\xf0\x69\x51\x4b\x5d\xc8\xbc\x0b\x34\x36\xd4\x7e\xc7\xf8\xe2\x6c\x1c\xdf\x96\x73\xe8\xeb\x35\xb0\x5c\xd9\x41\x23\x8e\x76\x1a\xa5\xca\x5a\x04\x24\x3b\x21\x26\x57\x9b\x08\x96\xa7\xfb\x97\xb9\xf7\xf1\x5f\xc0\xa8\x29\x34\x9c\x09\x07\xab\xf1\x6c\xf9\xdc\xa0\x80\xc2\x95\xa9\x19\x1e\xa6\xdb\x5e\x56\x06\xb9\x5b\xc2\x26\x3f\xcb\xf3\x31\xfd\x27\xc1\xbe\x70\x67\x33\x50\x97\x1a\xe7\xe6\x87\x5b\x6d\x3d\x9a\xbe\x9b\xc9\x1c\x1e\x80\x73\xa7\x8c\x5c\xde\x14\x28\xf5\xb9\x46\xdf\x80\xbf\x70\x80\x73\x45\x9e\xde\x22\x4d\x48\xd7\x9a\x6c\xb8\xe9\xde\x45\x18\x76\xd9\x63\x84\x65\x00\x31\xde\x17\xce\xe0\x8e\xea\x55\x41\x41\xd5\x17\xd6\x05\x26\xc3\x13\x3b\x38\x22\xbc\x17\xf4\x6a\xae\x75\x9c\x7b\xf7\x94\x67\xb9\xcd\xf7\x78\x1f\x94\xdc\x83\xd8\x1c\xed\xa6\x73\xb7\x5b\xed\x0b\xeb\x42\x5e\xe0\xae\x5e\x96\xae\x49\xd6\xb4\x05\xbc\x80\x99\x51\x95\x73\x62\xd8\xb9\x6f\xd2\x74\xf7\x5d\x92\x4a\xa3\xba\x99\xc9\xf8\xc2\x58\xc3\xa2\xd7\x45\xea\xe9\x17\x02\x1b\x64\x61\x6a\xa2\x29\x1f\xff\xb8\xf4\x3c\xe2\xcd\xab\x8b\xfb\x28\x99\x2c\x74\x6b\xb1\x5d\x86\xfd\x24\xf3\x07\x3b\x28\xac\x70\xc4\x44\xe4\xfa\xdd\x2c\x17\xf1\x0a\x68\x11\xa0\x08\x55\xde\x30\x6e\x36\x31\x4c\xeb\xc2\x2d\x07\x00\x3b\x15\x5f\xfc\x2f\x58\x93\x5e\xf5\xb4\xb6\x7a\xb6\x96\x3a\x26\x0d\xb1\x0d\x2b\x15\x34\x4b\xdd\x58\x95\x05\x9c\xf7\x3a\xbf\x3d\x83\x15\x47\x95\xf5\x8b\x50\xb1\x4e\x36\xc9\xb4\x31\x9d\xa9\x0f\x79\x8a\xf4\xaa\x13\x39\x3b\x08\x3f\x12\x91\x5d\xd6\x09\x60\xf5\x77\x8c\x67\xbc\x2a\xe0\x75\xdb\x27\xba\xb4\xcc\x23\x10\x80\x90\x84\x1f\xa1\xfd\x1b\xa8\x81\xc8\x1a\xc1\x41\xd3\x63\x07\x90\xb9\x19\x7c\xb6\x23\x66\x3e\x4c\x3c\x85\x9f\x2f\x2a\x78\x9d\x02\x09\xaa\x53\x71\x96\x08\xa9\x3c\x0d\xcc\x34\x11\xb9\xc0\xa5\xc2\x90\xdf\xcb\x48\x88\x5e\xb3\xd6\x04\xb4\x29\x86\xd0\xbf\xb0\xb4\x00\x4c\x1f\x6d\x8e\xb9\xae\xd7\x19\x24\xbb\x13\xea\x9e\xa9\xa8\xda\x6c\x2d\xae\x2d\xcc\xad\x04\x1f\x20\xaf\x33\xae\xb0\x15\xdc\x17\x07\xa4\xaf\x2d\x01\xea\xac\xb2\x14\x86\x0a\x9f\x85\x28\x34\xe2\xec\xe1\x6b\xfa\xc5\x6a\xf1\xb1\x18\x12\x67\xc6\x4b\x12\x53\x4a\xda\xfe\xc5\xd0\xee\xa8\xc7\x64\x0d\x03\x7a\x79\x45\x60\x4f\x33\x95\x95\xf9\xaa\x87\xcf\x44\xe1\x25\xbc\xe6\x8b\xb1\xdc\x38\xbf\xf1\xb5\x4d\x0b\xf7\x45\xe6\xcf\x89\x4a\xa4\x13\x5d\x5f\x02\xc9\x86\xf7\xac\x0f\x7e\x93\x03\x39\x8e\x9b\x21\xd7\x43\x61\xd8\x20\x5f\xca\x7b\x7c\x5f\x46\x23\xf8\xc2\x0e\x48\x7b\x19\x60\x47\x48\xde\xcd\x40\xb1\xb8\x99\xfe\x64\x3e\x98\x36\xc9\xcd\x32\xb8\xbf\x8c\xcc\xd3\x19\x2f\x2e\x13\x8f\x6d\xad\x5f\xa4\xed\x64\xba\x71\x03\xa2\x7a\x66\x0b\xec\x2d\x23\xf7\xc6\x40\xf0\xa5\xf0\x2c\xab\x45\x7a\xf0\x6c\x5c\xbf\x4f\x20\xf7\x25\x24\x57\x50\xbf\x50\x59\xab\xe8\x5e\xac\x99\x27\x01\xcc\x39\x0e\xd9\xf9\xb1\x4d\x6e\x8d\xc4\xda\x0f\x8b\x22\x51\x51\x40\xaa\x06\x70\xd8\x2a\x79\xaf\xff\x24\xc3\x03\x67\x23\xbb\x06\x92\x8b\x33\x6e\x0e\x96\xc8\x55\xf0\xe5\x89\x96\x7d\xf1\x41\x89\xa4\xf1\x62\x62\x5b\x21\xf3\x18\x86\xc2\xf3\x85\x69\x80\x45\x67\x79\x85\xb5\xe6\x90\x12\x74\x88\xb5\xc1\xf0\x28\xa2\x47\x9e\xc3\x89\xfe\x6d\xc5\x9d\x6a\xa7\x10\x42\xcd\xb2\x5e\x86\x3f\xe9\xec\x2f\x58\x38\x2f\x83\x5a\x4d\x9e\x78\x34\xeb\x42\x24\x44\x04\xe4\x6c\x57\x1e\x8b\x11\xe7\x81\x8a\x27\xef\xe8\xd2\xc6\x37\x21\xfe\x89\xfe\xc8\xb2\xf1\x8a\xb6\xed\xc2\xd0\x3f\xc2\x97\x75\x40\x42\x3e\xec\xe8\xb3\xee\xcb\xf0\xb1\x2a\xd5\xa7\x95\x4d\xf1\x0d\x1e\xe3\xfe\x05\x42\x7c\x8a\x81\x6e\x86\x61\xb6\xf6\x06\xf1\xb4\x4a\x66\x8a\x06\x6b\xf2\x4c\x8a\x42\xe5\x2f\xca\xb7\x75\x72\xa8\x8f\x03\x55\xae\xce\x27\x84\x47\x74\x2e\xd5\x18\xf5\xba\x3d\x08\xfd\x96\x48\x03\x1c\xda\xa2\x7a\x00\x8f\x63\x23\x26\x2d\xf5\xaf\x5d\x66\x6f\x92\x0d\x02\xec\x8b\x75\x9f\x33\x34\x83\x50\x08\x3e\x0e\xb4\x73\xf2\xec\x7a\xb2\xf6\x12\xb2\xb6\x64\x3b\xc5\x1b\x62\xaf\x35\xc4\x20\xa3\x4f\xc0\x87\x37\xfe\xf2\xb3\xb4\xbf\xff\x7f\xf6\xef\xfb\xab\x3f\xf6\xfb\xcc\x8f\xff\xca\xdf\xf0\x93\xf6\xcf\xfc\x93\xff\xd0\xff\xf1\x37\xfe\x0b\xff\xa9\xff\xf9\x5f\xf8\xbf\xfc\x27\x7e\xf4\xcf\xff\xd7\xfe\xfe\x1f\xfe\xed\xff\x88\xfd\xf8\x07\x0a\x8f\xa1\x94\x15\xc6\xaf\xb1\xa4\x19\x0f\xf3\x80\xa0\xac\x4f\x94\x6f\x0e\x07\x10\xfd\x84\xab\x0f\x32\x26\xe2\x0a\x99\x5c\x1c\x40\xf9\xc5\x43\x7a\xa3\xc6\x48\x88\x53\x6e\x74\xc5\xd1\x55\xa4\x97\x6f\xd4\xe5\x4e\xd7\xdc\x4d\xd8\x56\x8a\x00\x30\x3e\x79\x65\x23\x72\xc2\xc6\x2f\x98\x76\x72\x38\x29\xfc\xac\x04\xe4\x7d\x14\x6b\x39\xf8\x85\x58\xdf\x16\x3a\xec\xec\x83\x84\xcb\xdc\x35\x46\xc2\xf5\xf9\x39\x05\x6e\xf7\xc5\x66\x0e\xdc\x17\xd0\xe7\x4d\x55\x29\xb5\x0c\x90\x5a\xf8\xc2\x6f\x8e\xb2\x36\x5b\xe3\xcb\xc6\xe0\x65\x71\x73\x09\x6c\xf4\xa8\xf1\xa8\xfb\xc5\x36\x6a\xb1\x4e\xbd\xb1\xf8\x66\xb7\xa7\x5d\x95\xb5\x47\xc9\xa9\x7c\x94\x9e\xb3\x03\xcc\x93\x24\x62\xf5\x9a\x87\xa7\xaa\x4d\x26\xf4\x8b\x0d\x0c\x13\xeb\x10\xdc\xec\x15\x62\x47\x84\x86\x30\x68\xae\x89\x99\x8a\xcf\x2b\x0b\x73\xcf\x55\x8b\xc2\xc1\x88\x02\xc4\x5f\xf8\x7a\x3f\xbe\x70\x3d\x57\x20\xbb\x1f\x0c\x4b\xb6\x43\xdb\xce\xd3\x23\x90\x91\x40\x1c\xf1\x78\x5e\x43\xc9\x92\x9a\x43\x08\x68\x62\x9e\x17\x92\x52\xeb\x27\x9e\xb9\x27\xb8\x6d\x67\xd8\xba\x39\x76\xbd\x9b\x29\x0f\x6f\x35\xc1\x41\x90\x67\xc5\x66\x35\x16\xe0\xe4\xc1\x75\xbc\x6e\x97\x00\xbf\xc8\x2f\xe7\xbe\x86\x7a\x02\x31\xc3\xec\xdd\x6d\x48\x0d\x54\x54\xd0\x7b\xc7\x71\x37\x3b\xca\x29\x66\x63\xbf\x3e\x43\xee\x82\xec\xb3\xe7\xf3\x05\x41\x9a\xbb\xbf\x22\x2a\x7e\xf4\x72\x92\xbc\xd2\x78\x53\x41\xec\x7d\x40\x9e\xf4\xe1\x91\x8f\x74\x3b\x98\x2f\x73\x09\x8f\xe8\x15\xf8\xc4\xc5\xd8\x3d\x0b\x5d\xbe\xa8\xdb\x73\x2f\x5e\x9b\x2c\xac\x6e\xa1\xd9\x17\xc2\xef\x5e\xf9\xba\xd4\x2a\x44\x24\xc1\xb4\x6b\x91\x05\xb7\x2f\x2c\x70\x53\xb7\xca\xe7\x8c\xb6\xb0\x47\xf5\xd3\xd4\xa6\xf3\x01\x9d\x9f\x6c\x86\xb3\x26\xbe\xdc\xf9\x1a\x0c\xf7\x73\x49\x08\xf8\x63\x3e\xb9\xca\xae\xc7\x13\xa9\x41\x7d\x82\x45\xd6\x4b\x26\x83\xb0\xda\xd7\x5b\x52\x5e\xb3\xfd\xe3\x9e\x5b\x49\x6b\xcd\xba\x5b\x86\x3a\xe3\x79\xdc\x17\x39\x37\x91\x23\x66\x64\x00\xad\x58\x4c\x9f\x65\xfc\x32\x82\x58\x2d\x66\xd9\x9e\x60\xf1\x76\x89\x04\xa5\x09\x37\x61\x92\x4c\x7a\xa9\x4f\x12\x23\xc0\x2b\x2b\x9f\x66\xcd\x00\x0f\xa8\x1e\xf8\xd0\x07\x45\x5b\xc2\x09\xde\x67\x47\x2e\xac\x17\x7c\x16\x4e\xfb\x96\xa7\xda\xe4\xc3\x17\x5a\xac\x30\xed\x5b\xba\x21\xc7\x58\x4c\xa0\x5b\x05\x91\x93\x36\x7c\xa1\x2f\x63\xe2\x35\x9e\x2e\xed\x03\x81\x79\x5b\x14\x95\x95\x6e\xf8\x17\x00\x46\x68\xf0\xbe\x96\xae\xac\xd0\x82\x82\xe9\x25\x97\x8a\x1e\x01\xaa\x74\xdd\x26\x6f\x18\xf0\x7c\x79\x6a\x3a\xd7\x88\x30\x52\xfd\x93\xd8\xe9\xfe\x82\xd6\x83\x5f\x19\x18\x92\xc8\x33\x44\xb6\x71\x2d\xc4\x3d\x5a\x8c\xbf\xf1\xec\xb3\x1d\x7f\x33\x8a\xc2\x36\x08\xad\x56\xf0\x8b\x84\x19\x5f\xd0\xcc\x80\x83\x0b\xd7\x1e\x4a\xe0\x18\x5f\x8a\xde\x1b\x9e\x56\x4a\xaa\xa9\x26\x36\xd5\x35\xaf\x3c\x36\xdd\x68\xcf\xd9\xfe\x0b\x18\xa5\xfc\x0b\x5e\x9c\x3a\xf6\xe9\xd0\x32\x64\xe5\x2b\x95\x2b\xec\x0b\x31\x0d\xbd\x42\xb0\x73\xa4\x30\x25\xac\x2b\xa4\x82\xe3\x4f\xb2\x1a\xf8\x52\x57\x63\x89\x3b\xa1\xb2\x93\x63\xeb\x19\x9a\x87\x30\x70\xe6\x3a\x75\xa8\x0c\x43\x20\x30\x9d\xf2\x75\xcb\x51\xab\x2e\x96\x9f\x5c\xef\x79\xc6\xa5\x9b\xde\xd8\x83\x7e\x55\x03\x73\x3c\x4c\x9e\x13\x6f\x64\xcc\x84\x76\x96\x4a\x1a\x4a\x0f\x79\x94\xb3\xc6\x92\xf5\x27\x27\x37\xdf\x64\xba\xd5\xf0\x0d\x71\x5a\x82\x0c\xba\x88\xbc\xf6\xe5\x32\x1a\x33\xa8\x56\xf3\x45\xa3\x79\x16\xa6\x46\xc7\xa7\x60\xb7\x14\x5f\xc8\xf5\xb7\x74\x68\x09\xf7\xf4\x89\x71\x75\xd4\x9b\xce\x90\xb2\x21\x15\xbc\x8b\x30\x9b\x7a\x5c\x4e\x39\x5b\x49\xc9\x39\xb9\xd5\x79\xf0\x05\x29\x58\xdd\x43\xe6\x21\x64\x03\x9d\xa0\x9c\x45\xd7\x09\x08\xec\xc1\x4e\xaa\x78\x7b\x1a\x3c\xeb\xf8\x42\x2e\x91\x87\x59\x91\xf2\xfa\x24\x17\xab\xa9\x59\x10\xab\xf6\xea\x44\x39\xc0\x86\xa6\x48\x1a\x12\x4f\xba\x60\xf3\xc9\x08\x22\x31\x81\x10\x03\xe8\x82\xc4\xf4\xa2\x71\xbf\x50\x4d\xa2\xbb\xce\xdc\x54\x51\x5d\x5e\x72\x80\x9d\xdd\x4c\x60\xe2\x0b\x60\xe4\xef\x8e\x17\x6d\x03\x56\xdb\xde\x88\x2c\x36\xda\xe5\xe9\x5f\x10\x61\xd0\x5f\x1c\xb5\x1a\xcf\xc1\x05\xe5\xa1\x3d\x3b\xb7\x52\xd5\x75\xf5\x06\x28\xe2\xc6\x0b\x0a\x54\x1c\xe2\xfe\x62\x0c\x1f\x2e\xeb\x27\xd9\x2e\x6b\x6d\xbe\x86\xb0\x7a\x6c\x6f\x9b\x32\x11\xb4\x0e\x48\x45\x4e\x43\xe8\xb5\xee\xed\x78\x23\x0e\x37\x0d\x04\x78\x06\x43\xed\x8b\x05\x2c\x54\x30\xac\xdc\xba\xbd\x38\x6c\x0e\xb4\x0d\xe2\x0c\x37\x49\x01\x3b\xb0\x04\xa5\x0e\x03\xba\x59\x46\x3a\xb5\x97\xd7\x63\xc8\xbe\xc0\xa9\x11\xf4\x54\x6d\xd3\xef\x8d\xb3\x09\x34\xf9\x8a\x0d\xe5\x12\x29\x69\x13\x14\x09\x65\xbd\x83\x84\x27\x87\x9e\xfc\x3b\x8e\x39\x9f\xe0\x54\x11\x06\xd8\xa4\xf7\x15\x98\x90\xd2\x0b\x2f\x84\x1a\x9b\x8e\x44\xd3\xea\x6f\xa1\x5a\xfa\xb5\xf1\x82\x5e\xec\x58\x15\xed\xf3\x97\xa4\x3c\xfe\x22\xe1\xf1\xbf\xfe\xb3\xff\xe4\xef\xfe\xc8\xff\x0b\xfe\x9b\x3f\xff\x87\xff\xee\x8f\xfc\xec\x9f\xf9\xbf\xff\xcc\x6f\xfb\x15\x7f\xfd\xc7\xfe\x87\x7f\xe7\x1f\xfe\xb9\x3f\xfd\x17\xff\xd8\xff\xfb\xbf\xf4\x37\xfe\x27\xbf\xf6\x03\xc2\x23\x01\xb7\x65\xd3\xea\x8a\x88\xd3\xe2\xc5\xdc\xd1\x07\xfb\xe1\xb3\x8a\x7a\x4d\x25\xa4\x79\x6f\x2c\x8a\x0b\xd5\x10\xd8\xf7\x5d\x5f\x38\x3a\xf9\x00\x82\x79\x94\xa8\xe1\xb3\xdc\xce\x8c\x24\x52\xeb\xeb\x37\x2c\x01\x94\xab\x1a\x19\x2f\x67\xd6\x47\x8c\xc6\xdb\xf3\xaa\x14\x7e\xb1\x07\x1a\x00\xa7\xa1\xac\xb6\xf9\x15\x59\xe8\x2d\x9c\x1d\xec\xa0\xb8\xb8\xeb\x8e\xc9\x75\x5a\x2f\x25\xbd\x6e\xe2\x17\x12\xde\xd8\xf8\xe2\x3c\x18\x3f\xa3\xf7\xf7\x35\x8f\xa0\xd1\x6e\x24\x96\x35\xc6\x68\xe8\x78\x46\xe3\x80\x0c\x57\xf1\x6f\x53\x90\xf9\x14\x17\x91\x30\x4e\x5c\x3f\x91\xd3\xd1\xa6\x09\x0f\xa1\x90\x6d\xa0\x36\xe3\x1a\xf0\x04\xe3\xe7\x5b\xcb\x7a\x5a\x40\x4d\xab\xfe\x78\x2e\x3b\x0d\xad\x65\xd9\xf0\x27\x1c\x77\x18\xe2\xdc\xf7\x61\xbe\xd8\x14\x84\xc7\xa3\x05\x8e\x46\xa3\x12\x6d\x63\x76\x64\x75\x3c\xc5\x3c\x04\x10\x28\x63\xa2\x53\x96\x4f\x76\x1f\x42\xf4\xd7\x52\x72\x97\xc1\x64\xe0\x74\x22\xc7\xf5\x9e\xd3\x74\xd9\x37\x64\x54\x48\x99\xc2\x25\x40\x1f\x47\x44\x2e\x58\x3f\x5f\x08\xe5\xf9\x5b\xb0\xb4\x7d\xbc\x13\x08\x03\x52\xa8\x98\x97\x9c\xfd\x75\x49\x92\xbd\x62\x65\x44\x02\x58\x1f\x04\xdc\xc0\x16\xbd\xa6\x93\x2f\xe2\xbc\x18\xbc\xba\x25\x08\xd1\x7a\x1e\x80\xe6\x5e\x8e\xa2\x7b\xcd\x5d\x9c\xdb\x7f\x87\xb6\x3f\x0f\xfe\xb0\xcb\xea\xc2\x40\x1c\x9c\x41\x27\x62\x54\xc8\xa4\x27\x28\x1a\x51\x1a\x19\x27\xe0\xbd\xf7\xb9\x17\xe3\xb8\x9b\x44\x0d\x50\x60\x02\xd2\x03\x0c\xdc\x7d\x7f\x9e\xbb\x3e\x77\x61\x51\x68\xc4\x86\x81\x69\x88\x15\xd6\x91\xad\xd9\x03\x42\x47\xd9\x62\x8c\x08\x83\x63\x58\x84\xc6\x21\x83\x0c\x98\x2e\x81\x66\x09\x9b\xb2\x48\x83\xdd\x4c\xbd\xbc\x50\x79\xab\x98\x2a\xab\x26\xef\xf3\xe7\xaf\xea\xfc\xaa\xce\xf7\x3e\xf7\xde\x73\x3e\x9f\xf3\x39\xe7\x1e\xc4\xcf\xa0\x78\x9c\xe3\x10\xf7\x45\x75\x87\xd8\xcc\xb6\x9e\x00\x73\x26\x00\x9b\x92\xaf\x42\x79\x1a\xe8\xbd\xd8\xa0\x56\x45\x42\x8f\xe9\x57\xb0\x28\x9e\x51\x41\x2f\x1c\xbb\x7b\x41\xe1\x5a\x03\x3d\xd1\xe9\xcb\x8a\xca\x73\xa4\x33\xba\x44\x06\xd3\x8c\xaa\x8b\x6a\x59\xe6\xbe\x10\x85\x4e\xf4\xe0\x94\x3b\x7a\xa7\x29\xd4\x75\xce\xc8\x26\x6f\x4f\x10\x1e\xc7\x95\xaa\x9c\xc5\x86\x99\x4a\x33\xfd\x08\x5c\xc0\xb0\x1d\x3c\x37\x3f\x52\x8c\x4e\x29\x07\x6a\xea\x0b\x51\xb9\xdd\x32\xe3\xca\x4f\x88\x80\xd5\xca\x39\xe7\x2a\xf2\x30\x37\x1f\x0c\x5a\xcd\x08\x6a\xe8\x5c\x4a\x48\xda\xa0\x75\x2a\xb1\xdd\x2d\x8a\x17\x93\xb8\x0e\xe3\xe8\x13\x34\xed\x09\x69\xce\xa0\x21\x16\x04\x30\x64\xd9\xeb\xba\x7c\x5e\xe7\x1c\x88\x5f\x52\x80\x1b\x24\x0e\x6e\x6a\x37\x0a\x16\xfa\x6c\xcc\xa6\x4f\xa8\x1a\x4e\x5a\xa0\xca\x7e\x1d\xf7\x79\x07\xe9\x77\x5a\x60\x32\xa4\xc7\x11\x28\x37\x56\xc1\xa4\xb5\x9e\xa2\x43\x77\x27\x07\x17\x99\xc4\x3f\xd1\x7b\x1d\x81\xce\x32\xb5\x24\x86\xd2\x7b\x8a\x03\xee\x8c\xf8\x5a\xf6\xec\x7b\x95\x61\x76\x32\x57\xc8\x7e\x47\x54\xc2\xbd\x89\x06\x57\x7d\x66\x08\xe1\x8a\xdb\x0e\x6e\x39\x53\x47\x4e\x23\x02\xd6\x95\xae\xea\x2e\x04\x81\xdc\x80\x96\x96\x32\x70\x9f\x69\x60\x29\x94\xf4\xe9\x91\xe7\xcd\x31\x67\xb3\x9f\x27\xb3\x30\x84\x28\x30\xc4\x00\xdf\xeb\x3e\xd6\xf0\xb0\xce\x5e\x66\xe1\x21\x42\xce\x12\x98\x0b\x8f\x06\x66\xd8\x4f\x44\x33\x54\x30\xbe\x64\xd2\x4d\xaf\x7c\xf2\xc3\xc2\x48\x16\x32\x83\x18\x68\xf7\x1e\x99\x08\x43\x6b\x63\x96\x83\x3b\xf1\x7d\xed\xb0\xf7\x13\x8d\xbb\xf3\xdc\x66\x1f\x32\x89\x55\x64\xa2\x50\x31\x35\x0e\x6a\x35\x11\x46\xc7\x5c\x79\xa0\x93\x01\x03\x06\x21\x51\x12\x6a\x9d\xc9\xf0\x89\xdd\x49\x4c\x88\x36\x68\xc3\x94\x4b\x3a\x01\x7a\x97\x58\xea\xe9\x3d\x3e\xe4\xc1\xf4\xc9\x76\xba\xf0\xed\x77\x98\x95\x62\x42\x22\x15\xfb\x89\xf6\x61\xb4\xc5\x34\x54\x32\x71\x4a\x2a\x33\xe6\xbb\x9d\xab\x0a\xb5\x40\x20\xf3\xce\xf4\xbe\x78\x96\x44\x5d\x2b\xa6\xcd\x22\x30\x08\xf3\x27\xf2\x8b\x01\x0c\x37\xa4\xeb\x5c\xc1\xb1\x33\x53\x4b\xea\x00\xdd\xc0\x8c\x0c\x52\x5c\xd3\x4b\x9d\xd1\x62\x9c\x3d\x53\xb6\xfb\xd0\xdb\x23\xd3\x76\xe6\x6e\x8e\xf8\xb5\x1b\x29\x31\x11\xa1\x58\x93\xb0\x76\xe3\x75\x6d\x0a\xa3\x24\x5b\x05\xb4\xab\x8e\x2a\x34\x97\x59\xa1\x72\xf6\x44\x1c\x59\xf1\x54\xaa\x69\xa5\x99\xb7\x67\x46\x8e\x34\xc3\x2b\xd5\x4a\x77\x75\x74\x2d\x38\x67\x4c\x6b\xb0\x26\xc0\xb2\xb9\xe8\x30\xa3\x4f\xa8\xe3\x44\x80\x2d\x90\x5b\xb0\x79\x4b\x88\x7d\x04\xc5\x43\xdc\x44\xea\xe8\x1c\xbd\xda\x5d\xed\x05\x45\x81\x05\x28\xda\x23\x29\x8d\xac\x27\x6a\xe8\x63\xd0\xe1\x95\x57\xe4\x4e\x7c\x6c\x38\xeb\x36\x74\xf0\x6d\x72\xd0\xbd\xa0\x7e\xba\x53\x13\x62\xa0\xdc\xf8\x3a\xa8\xc9\xe2\x91\x37\xc7\x58\x90\x2d\xc6\x41\x11\x1f\x8b\x16\xd1\x0d\xa2\x3e\x4b\x1d\x0e\x13\x13\x4a\x8c\x90\x75\x9e\xcd\xd3\xbc\xb2\x1d\xf6\x28\xc1\xac\xf0\x44\x64\x5f\x7d\xf0\xa3\xde\x83\x89\x4d\x6b\x48\x8a\x4b\x93\x2a\x47\xc5\x63\x88\x9b\x4a\x89\x90\x17\x62\xff\x5c\x66\xc9\x7b\xdd\xd7\xcc\x4f\x68\xf4\xa8\xed\x3c\x18\x26\xb6\x39\x5d\x6b\xe7\x1e\x4d\xe1\x72\xe6\x3e\xe6\x4d\x12\xb5\xf7\xa5\xce\x98\x5d\x33\x3b\xb8\x6b\x28\x02\x32\xb6\x4f\x90\x82\xa9\xe1\xa6\x3b\x75\x85\x92\x79\x1c\x2d\x5e\x27\xcb\xe5\xe0\x9a\x9e\x14\x55\x98\xc7\x68\x29\x84\x30\x0c\x2e\x97\x87\x46\x2a\xeb\x9e\xd0\x7a\x1f\xde\xeb\x1a\x97\x3a\x64\xb8\x50\x8a\x74\x5f\x0e\xf4\x84\x10\x8f\xf1\x26\xf7\x9e\x9c\x19\x1d\xf0\x35\x64\xb1\xb4\x84\xae\xf5\x4b\xa6\xaa\xfc\x3a\xe1\xf1\xb6\x3f\xf5\x15\xff\xee\xef\xf9\xb7\x7e\xfe\x3f\x7b\xcf\x7f\xf9\x45\x3f\xf3\xf6\xdf\xfd\x87\x7e\xea\x6b\x7e\x41\x8b\xf6\x1e\xdf\xf8\xca\x1f\x7a\xff\xf7\x78\xeb\x9b\x3f\xe8\x1b\xdf\xf4\x00\xe1\x31\x1b\x51\x74\x6b\x3d\x69\xb9\xf7\x4a\x07\x84\xc9\x95\x59\x5b\xbe\x6c\xf3\xb1\x6c\xb3\xcb\x26\xe7\x41\xf9\xc8\x27\xaa\x37\x5f\xf0\x91\xb9\x15\x17\x82\xe6\x34\xba\xb6\x44\x3d\x94\xfe\x72\x1c\x99\x95\x18\x62\xa1\x8c\x8a\x15\xd8\x32\x79\x9f\xb6\x90\x12\x50\xb6\xe8\x70\x4f\x0c\xea\x0c\xce\xca\x98\xad\xa7\x97\xd5\x8e\x5e\x22\x25\x7b\x0d\x79\x90\x23\xa6\xac\x56\xc3\xf3\x64\x5e\xcf\x53\x6e\x92\xbb\x8f\x87\x98\x4f\x3c\xcc\xc5\xae\x6e\x00\x96\x65\x5b\x31\x88\xeb\xb5\xe8\xe3\xf0\xf4\xe4\xb9\x1f\x33\x3a\x11\x32\x61\xf2\x8a\x28\x75\x6d\xb1\x12\xdb\xb7\xf5\x88\x6c\x0a\xee\xaa\x7d\x62\x7e\x0d\x40\x6d\x91\xf7\x0c\xc3\x20\xe8\xa2\xbf\x83\x6f\x1b\x32\xbf\x40\xb9\x97\xb3\xfe\xb4\xb3\xca\x7a\xdf\xe2\x89\x0b\xa6\x8e\x1b\xa1\xaa\xb3\x82\x7e\xa2\x92\xcf\x33\xd2\x26\x55\x3e\x84\x21\xf7\xa1\x8c\xcc\x7c\x10\x1a\xae\x72\xc0\x82\x88\x3e\x8f\x9b\x3d\x20\x39\xa5\xb8\x5f\xe3\x85\xbc\xb0\xea\x71\x81\xe9\xa4\x58\x5e\x5a\x21\xb7\xca\xa4\xde\x64\xe5\x78\x55\x14\xa1\xd9\x04\x36\x56\xc6\x81\xae\x67\xe6\x99\xdc\x4a\xab\xac\x2e\xb9\xfa\xae\xe6\x22\x21\x04\x7e\xec\x34\xef\x0e\x81\x66\xc6\xec\xac\x92\xba\xdc\x08\xde\xba\x7c\x45\x98\xd8\x13\xd5\x6b\x98\x07\xa2\x62\x79\x35\x72\xb1\x82\x2a\x27\x3b\xbc\x32\xd3\x32\x01\x6b\xa8\x80\x20\x25\xa1\xb1\x71\xc7\x4e\x7a\x40\x7c\x83\x47\xde\x04\xf1\x96\x92\xa3\x16\x66\x1b\xab\xc6\x0c\x37\x25\x6e\x00\x1a\x2a\x48\x4d\x31\x06\xb8\x60\x54\x26\x87\xc0\x1b\x41\x6a\xb9\x40\xec\x13\x83\xb4\xf6\xb9\xb7\x0f\xd4\xcd\x8a\x4a\x3c\x64\x53\xc6\xd8\x21\xe0\xa6\x4e\xc5\x96\x95\xab\x87\x55\xc7\x59\x52\xd9\x49\xd2\xac\x94\xe1\x4f\x54\x29\x09\xb3\xe9\xa8\x0b\x4b\xa8\x94\xbe\x17\xc8\x51\xe9\x84\x2d\x4b\xc3\x1e\xb7\x73\xf4\xba\x82\x41\x82\x23\x7d\x8d\x3d\x97\x62\x2a\x3c\x71\x77\x76\xe9\x64\x04\x2e\x41\xd7\x8b\x8f\xfc\xae\x71\xdf\x38\x31\x7c\xf1\xc6\x2c\x0b\x3b\xdc\xbb\x9e\xda\xdc\xab\xd3\xdd\xf3\x55\xad\x7b\x42\x4f\x70\x18\xcc\x45\x64\xa7\x6b\x65\xeb\xcb\x3a\x80\x50\x24\x63\xb3\x34\x33\x5f\xea\x24\xae\x1e\x2c\x58\x3c\x09\x49\x4b\xbb\xc1\xcf\x47\xa8\xc9\x63\xcf\x01\xbd\x6b\x7c\x55\x1d\xb4\xcb\xa0\xc2\x99\xea\x51\x99\x04\x0d\xa6\x1b\xdc\x14\x33\xcc\x6b\x3e\xba\xa9\x26\x5b\xa6\xdc\x13\x31\xd5\x23\xaf\x2f\x13\xf8\xd4\x73\xb7\x73\x84\xf3\x6a\x22\x0e\xe3\xfc\x85\xec\x19\x4f\x7d\x9b\x54\xf6\x79\x40\xd9\xae\x91\xfd\x8e\x16\x3c\x41\xc7\x85\x91\x62\xbf\x27\xd2\x13\x8b\x33\x6b\x7a\x71\xea\xd9\x85\xba\xce\x43\xcb\xd9\x62\x3a\xa1\x49\xca\xb4\x8a\x32\x99\xa3\x0a\xf6\x48\x8a\x68\x04\x9b\x9c\x38\xcb\x35\x9f\x18\x02\x0d\xc3\x9a\x35\x04\x62\x84\x28\xb7\x51\x37\xee\x8d\xa9\xa6\xd6\xa1\x85\x05\x04\xc4\x5d\x9f\x38\x23\x88\x1d\x47\x13\x86\xcd\xb2\xe0\x62\xe8\x00\x9b\x62\x6f\x82\x24\x8b\xd4\x62\x3a\x3e\x5a\xa7\x4e\xa2\x2a\x51\x9d\xda\x42\xa5\xf7\x13\xa5\x8c\x59\x4d\xb9\xb2\xd6\xc7\x25\xd6\x51\x71\x3d\x18\x9a\x20\x02\xa6\xd8\x86\x2d\xa4\xcb\x17\xbb\xe2\xac\x13\x5e\x47\xc2\x1b\x25\x20\x9e\x28\x71\x6d\x59\x80\xe1\x82\xda\x00\x30\x38\xce\x06\x79\xbc\x45\xee\xa2\xdf\x58\x07\x36\x90\xc0\x1b\xe6\x85\xe9\xc8\x17\xb6\x40\xd4\x6d\x9f\xd0\xdc\x6c\x91\xae\x3a\x96\x0c\x97\x02\x91\x6c\xd1\x84\xd1\x36\x5c\x8d\x91\x89\x36\x8e\x14\x0e\x70\xaa\x95\xf0\x69\xd1\xbd\x5a\x51\xad\x3c\xa2\xc5\x52\x31\xef\x10\xef\x8b\xdd\xee\x88\x0b\x92\xd9\x84\x26\xac\x00\x5c\x32\x8b\x47\xdc\x79\xa7\x9a\x0d\x5c\xfb\x4c\x9b\x74\x1e\x9f\x18\x9d\x4a\xef\xb0\x6e\xcb\x96\xbb\x4f\xb8\xee\x13\x20\x4c\xed\x55\x04\x35\xdd\x42\x80\xba\xb8\x48\x8e\x0b\x6c\x03\x6a\x3c\x19\x56\x2d\x86\x27\x5e\xe3\x60\x73\xc3\x63\xa9\x74\x2e\x9f\x50\xe6\x1e\x4d\x35\x33\x35\x95\xa6\xe3\xda\x97\x75\xdc\x6a\x2b\xc3\x51\x13\x4c\x1c\x7b\xa6\x0c\x7d\xe4\x0d\xa1\x81\xd8\x5a\x7d\x8c\xcc\x46\x83\x45\x1d\x12\xee\xb9\xe1\x72\x03\xf8\x72\x82\x1e\x33\x3e\xca\x79\x97\xc9\x4a\xc6\x04\xdf\xf7\xae\x4f\x34\xab\xa6\xb6\xe4\xd9\xd5\xb1\x64\x37\xfe\x5a\x45\x91\xaa\x87\x8d\xa8\x31\x30\xf8\xd9\xb2\x54\x00\x41\x08\x3a\x8a\xd4\xb8\x34\x8f\xd3\x3d\xd1\xf6\xc5\x52\x60\xf6\xbe\x6a\x02\xf6\xbe\xd2\xe0\x50\xd8\x13\xf2\xd1\x1b\x46\x6a\x15\x56\xcf\x42\x33\x1d\x9a\xef\xa3\x2a\x8e\xe4\x52\xfc\x89\x42\x9b\xd5\x70\x9c\x66\x42\xda\xa5\x68\x79\x60\xe4\xfb\x3a\x1c\xcd\x4b\xa6\xd8\x69\xdf\x5a\x96\x60\xcf\xee\x12\x25\x43\xa3\xa6\x70\x78\x22\x9a\x41\x18\xce\x7d\x5d\x32\xdc\x47\x51\x3c\x40\xae\xe4\x28\x72\x86\xa3\x4d\xa5\x80\xd9\x61\xa9\x6a\x29\x19\xb9\x74\x44\x6d\x61\x67\x7e\x42\x8b\xc5\x6a\x41\x70\x57\x0e\xeb\xb5\xb4\xa3\x5a\xd3\x93\x29\x7c\xa6\x3c\x90\x27\x6e\x02\x31\xe7\xac\xdc\x54\x17\xe5\x54\xbc\xc5\xf0\x44\x29\x83\x61\x78\x22\x8f\x4d\xdc\x3d\xfa\xeb\xf4\xed\xe8\xa9\x21\xc2\x9d\x87\x00\xd1\xb9\x4d\x24\x68\x50\xf0\x02\x88\xe6\x99\x94\x7a\x9c\xc5\xfe\x06\xc2\xe3\x8b\x3f\xfb\xdf\xfb\xae\x0f\xfe\xfd\xdf\xfa\x23\x3f\x2b\xbe\xf0\xb7\xfd\xde\xf7\xfb\xec\xef\xfa\xb6\x5f\xf8\x6d\xee\x97\xbf\xa9\xbf\xcb\x87\xfc\x9e\x8f\xf8\xd8\x7f\xeb\x3b\xbf\xe8\x23\x9f\x20\x3c\x50\x88\x25\xb5\xcc\x88\x53\x30\x37\xd2\x44\xc2\xcb\x30\xc3\x99\xd5\xe5\xe2\x6c\xdd\x4d\x4f\xbc\xf2\x88\x7a\xde\x02\xd1\x67\xc6\xbc\xa5\x66\x25\xa9\xc7\x30\x48\xcb\x86\xcc\x1e\x96\xb2\x2e\x97\xd0\x85\xd1\x11\xa1\x45\xf3\x60\x37\x71\x3a\x5d\x3d\x10\x9b\x00\x08\x8f\xf4\x5e\x2b\x49\x77\x2c\x31\x92\x0b\x82\x59\x06\xe7\x26\x75\x0f\xfa\x31\x2a\x2f\x12\x44\x23\xa1\xc2\xe8\x0e\x1e\xec\x2d\x41\xad\x66\x3f\xd1\x3f\xd8\x05\x86\x1d\x1e\x03\xe2\x35\x63\x0c\x98\x08\xcd\x1d\xd1\x84\xc1\x26\x4d\xee\x05\x81\x79\x94\x95\x42\x2f\xcd\x59\xef\x0e\xf9\x88\xb6\x22\x7a\x90\xf3\x90\x70\x4d\x6b\x70\xbf\x2f\x95\x63\x45\x39\xdf\xda\x23\x31\x80\x5a\xba\xb1\xed\x27\x03\x24\x33\xa6\xf5\x65\x05\x78\xa2\xea\x70\x96\xa0\x62\xa6\xa8\xe1\x49\x05\x8f\xf6\x98\xb4\xf3\x7e\x52\xb0\x74\x6e\xed\x12\x96\xd5\x7d\x5a\x1a\x5a\x3c\x39\x9e\x67\xe2\xfc\x89\x84\xc4\x46\x30\xf2\x74\x27\x2e\xfe\xf4\x45\xdd\xfd\x22\xb2\x17\x7c\x37\x62\x1a\x4c\xe2\xe8\x61\x1c\xde\xd2\x71\x8c\xbc\x23\xdb\xe3\xca\x4f\xc8\xb2\xad\xcc\xf1\xba\xce\x50\x92\x09\x0d\x66\x50\x83\xa6\x1b\x99\x23\xae\x06\x2a\x8a\xb5\x8d\xcc\xab\x64\x15\x91\xad\xa3\x59\xa5\xd4\x27\xae\x7c\x22\xb1\xd5\x80\xb7\xb6\xa5\x81\x87\x0f\xea\xf2\x15\xdf\x6d\x4d\x16\xba\x88\xab\x78\xd1\xed\x84\x59\xdf\x65\x24\xac\x0b\x25\xec\x11\x6a\x92\x68\xa6\xdd\xb1\xfd\x91\x20\x88\x61\xdc\x08\x58\x15\xf2\x61\x58\xd8\x9d\x1f\xde\x53\x98\x35\xec\x84\xeb\xbc\x8a\x2d\x68\xd8\x27\x2a\xf9\xb7\x2d\xe6\x72\xbd\x68\x21\xdb\x2d\xae\x32\x6b\x25\x68\x81\x91\x2f\x78\x07\x45\x6e\x5f\x33\x88\xc2\x27\x22\x28\x3a\x82\x76\x81\x3d\x41\x0a\x2a\x9e\xe6\x01\x60\x48\xbe\xd9\x66\x10\x8f\xae\x0e\xdb\xf8\xb9\xc2\xaa\x7e\x0e\x4a\xe6\xc4\x32\xbb\x70\x74\xd4\x90\x48\x97\x7f\xe4\x31\x6d\x7c\x99\xa9\x2e\x9d\x66\x35\x82\x60\x64\xee\xbd\xec\xb1\xdd\xe9\xce\xb3\x5d\xd7\x18\xd9\x66\x22\xd6\x8d\x8b\x00\xb0\xc5\x4a\xb9\x7b\x82\x14\x34\x86\xc1\x9d\x4c\x4a\xee\xc0\x2f\x24\x06\x78\xaa\xc5\x3d\x00\xc2\x4d\x03\x16\x66\x23\xb9\x62\x9a\x1c\xa2\x27\x28\x12\x6d\x78\x3f\x71\x46\x16\xa0\x62\x95\x2d\x07\x6f\x0d\xdc\x10\x73\x8b\x36\xb0\x37\xf2\xec\x30\xa2\xfa\x61\x88\xb7\x7c\x8c\xdc\xf5\x62\x20\x45\x3d\xf8\x13\x20\xff\x50\x78\x67\x2f\xe0\x00\x77\x5e\x4e\x13\x33\x28\x74\x78\x9a\xd9\x5d\x20\xca\xaa\xb2\xdb\x31\x7c\x12\x32\x8c\x70\x63\xf2\xc2\xc5\xf5\x44\x33\x89\xd6\xb0\x07\x31\x47\x5c\xe9\xb8\xcc\x71\xb8\xce\xcb\xb2\x52\x2a\x7e\xd5\x2b\x75\x9f\x56\xaa\x0a\xa0\x53\xb8\x98\x3b\x66\x1e\x3c\x01\x6c\x13\x76\xc5\x02\x22\x99\x1e\xe5\xba\x40\x65\x09\x64\x62\xa5\x3a\x14\x86\x9c\x0f\x6b\x45\xbc\x0c\x09\x6d\x6d\x41\xcc\x4c\x8b\x94\x27\x88\x73\xdd\x94\xa3\x95\xab\xa3\x25\x76\x48\x76\x74\xc1\x8f\x4b\x35\xd0\x07\x70\x72\x4b\x6d\x70\x20\x0e\x2b\xc3\x5b\x8e\x96\x54\xb3\xfc\x13\x27\x75\x41\x89\x85\xf3\x53\x1d\x32\x85\xe9\x6f\x70\x2f\x03\x28\xb7\xae\x5e\xc8\x65\xcc\x60\x94\x4d\x79\x25\xe2\x4d\xa8\x74\x36\x12\xfe\x84\xe6\xe6\x5a\x00\x7b\x75\xc7\x0e\xe3\xdc\x86\x37\x48\x31\xd6\x05\xd3\x33\xe7\x86\x5b\x85\xb0\x59\xa7\xce\xd6\xee\x5e\xae\x11\x20\x8e\xe5\x01\x35\x2d\x2d\xe7\x4c\x71\x57\xba\x2f\x54\xba\xdd\xc8\xde\x04\x67\xb3\xf4\x38\x9b\x0f\x85\x2f\xba\xd6\x72\xe9\xba\x03\x2a\x6d\x9e\x71\xa8\xf5\x84\xe6\xa6\x9d\x07\x57\xee\x98\x46\xeb\xce\x14\x2c\xa7\x4c\x72\xdc\x4c\xb9\xf3\x86\x80\xd8\x34\x17\xa8\x56\xe7\xa2\x62\x16\xa7\x3a\x75\x7e\x64\x68\x29\x2b\x64\x93\x3d\x0f\xe0\x92\x54\x35\x52\x8a\xed\xb4\xfb\x94\x60\x26\xab\x7d\xbc\xf5\x84\xd3\xe3\x88\x93\x06\xde\x89\x93\xc3\xf0\x04\x12\x38\x46\x9e\x06\x8d\xcc\x1d\x3e\x81\x59\x0d\xcb\x55\x9b\xc5\xd1\x44\x5d\xa8\x73\x36\x07\x5d\x5c\xb0\x06\xdf\x97\x6a\x47\xa1\xf6\x91\x7d\x41\x68\x3f\x07\x0e\x37\x6e\xe7\x45\xf3\x4a\x6d\x4d\x6e\x34\xea\x2e\x94\x6a\xe8\x75\x92\xb2\x19\x9e\xfe\x88\xf7\x55\x1a\x18\xb5\x3f\x41\x59\xd3\xd9\xc9\x46\x92\x1a\x7a\x46\x80\x43\xe2\x02\x4a\xa5\x30\x3d\x81\x9c\xec\xb8\x8b\xba\xb3\x76\xd4\xe8\x5b\x51\x39\x2c\x9d\xb1\x3c\x91\x83\x33\x65\xc8\xee\x61\x51\x5b\xb5\x44\xc0\xb1\x71\xbb\xd4\x1a\x23\x47\xb5\xc3\x69\xa2\xdb\xa5\xae\x0e\x6d\xc0\x70\xb6\x51\xb8\x66\x8f\xac\x05\x16\x09\x11\xc5\x99\xcf\x83\x9d\xa9\x7a\x41\x5c\xab\x0b\xee\xbb\xf5\x73\x24\x77\x19\xbb\x91\xf1\x03\x7b\x12\xf3\x61\xee\xcc\xf3\x13\x71\x04\xb9\x21\xe3\x05\x38\x0b\x77\xe0\x7e\xe1\x9d\xe4\xb9\x6c\x3c\x49\x0b\xe7\x32\x66\x44\x66\x22\x40\xb9\xbb\x58\xc2\xd5\x95\x0a\xf9\x09\x84\x48\x00\x04\x70\xd5\xc9\xbb\x83\x73\x26\x89\xe2\xb5\xf8\xf0\x52\x51\x0f\xe0\xa0\xcd\xdd\x00\x55\x10\x67\xa3\xf4\x34\x6c\x01\xfa\x08\x1d\x97\xef\xd0\x48\x9b\xc9\x5d\xb3\x37\x42\x90\x8c\xa7\xad\xa7\x1e\x8e\xe4\x8b\xe2\xe8\x2f\xb1\xea\x79\xc5\x9b\x62\xce\xdc\x19\xd5\x64\xf9\x37\x10\x1e\x3f\xf5\x75\xaf\xfb\x98\x1f\xf8\x8a\xaf\x7d\xcb\x17\x7e\xe9\x1b\xbf\xe1\x2d\xff\xc3\xbf\xfe\xba\xdf\xf1\x55\xaf\xfa\xa6\xaf\xff\xb6\xcf\x7c\xe3\x9f\xf8\xcb\xe0\x6f\x7e\xcd\x17\xfe\xf2\x7b\xff\x2f\x23\x3c\xcc\x9f\x7d\x9b\x9f\xf8\x0d\xdb\x59\x7b\x23\x3a\xcf\xe6\x94\xa8\x29\x7e\x9e\xaa\x14\x3a\xed\x7d\x23\x1d\x15\xeb\x23\xca\x4b\xfa\xcc\x44\xd5\xc4\x6d\x91\xf8\x8d\xec\xaf\x72\x56\x5f\xf2\xb7\xff\xff\x5d\xbc\xff\x5f\x5e\x50\x05\xe8\x79\x66\x38\xf2\x12\x53\x2e\x07\x2b\xbc\xac\x3a\x8c\xdd\x27\x58\x17\xea\x59\xe3\x14\xf3\x15\xaf\x8b\x0a\x7c\x2e\xd1\x2d\x80\x0f\x78\xd1\xd1\x69\x0f\x29\x2f\xac\x1b\xe9\x3a\xbb\x02\x3b\x83\xfd\x1e\x00\x58\x26\xa9\x0b\xf7\x65\xbb\xf5\xcc\x16\x52\x9d\xbd\x6e\x02\x5f\x4c\x11\x5f\x66\x2f\x34\x4e\x39\x31\xec\x00\x99\xc5\x40\xb6\xbb\x38\x2e\x28\xd3\x80\xbc\x9e\xc9\xc6\x60\x55\xaa\xc1\x18\x07\xaf\x29\xcf\x6b\x9f\x8d\xab\x07\xbc\xb8\xe3\x0d\x94\xc1\x67\xc7\x5b\x78\xc6\x5b\x0b\x6a\xec\x39\x76\xa0\x77\xb2\xe8\xb6\xf7\xb5\xe9\x30\x47\xe0\x60\x5d\xc7\x89\xf8\xc5\x9e\xd8\x17\x5a\x61\x57\x55\x04\x6e\x68\x79\xba\x3d\x97\xdd\x9e\xc8\xa0\x26\x83\xa9\x21\xd9\x1a\x82\xc0\x25\xe4\x97\x68\xc6\x63\x8c\x7f\xed\xb2\x7d\x99\xbd\x08\x3b\x5e\x87\x0e\x31\xb0\xb3\x93\x00\x7a\x1d\x46\x1f\x02\xc9\x98\x78\x4c\x09\x38\x15\x24\x1b\x08\x5e\xa0\x3b\x7c\x5f\xf9\x4a\xf9\x01\x2f\x18\xd5\x94\xbb\x19\x46\x8e\x27\x0d\xf2\xb0\xc7\x99\x34\xcd\xee\x5c\x0d\x21\x98\xb3\x40\x40\x89\x9a\x88\xa8\x7d\x40\x80\x2b\xe6\x40\x3f\xe0\x85\x53\xfa\x20\x57\x88\x38\x28\xee\x0a\x3c\x0d\xc4\x18\x93\x15\xb4\x5c\x27\xa0\x47\x6d\x2b\xd1\x6b\x70\x52\xed\x09\x90\x85\x24\xbd\x38\x9b\xf9\x65\xfe\x22\x57\x5c\xb9\xf8\xb0\x58\x5a\x3e\x87\xb9\x3b\x2e\x67\xda\x0a\x93\xe9\x27\x88\x1c\x4e\x48\x03\x1e\x33\xd7\x24\xb5\xf4\x5e\x5c\xfe\x81\xb5\xa0\x97\x38\xe3\x19\xb4\xe2\x8c\x80\x00\x2d\x2f\x3a\x9a\x32\x7d\x66\x97\x94\x53\x6b\x71\x2b\xc8\x65\x41\xb5\xe9\x7a\x85\x7c\x93\xc6\xf0\x03\x5f\xc4\xf0\xcd\x69\x2f\xb5\xa8\xbb\x30\x77\x5e\xbc\xed\x23\xb0\x82\xb3\x9f\xbe\x9d\xa5\x04\x30\xb0\xc8\xe5\xe8\xc7\xc4\xd0\x41\x9a\x5f\xd4\x1f\xbd\xcc\x5e\x9c\x98\x73\xe3\xe4\x28\xfb\x3c\x4a\x3c\x1a\x8e\x71\x30\xa3\x6f\x67\xb6\xaa\x33\x8d\x84\x93\x3b\x12\xa0\x47\xcc\x77\xb3\xed\x8c\x2f\x0a\xe5\x5f\x66\x2f\x22\x46\x25\x8d\x1a\x9a\x47\x7d\xe7\x79\xa8\x39\x86\x96\xc2\x2d\x01\x37\x65\x9b\x71\x87\x1b\x36\xfb\xaa\x15\x08\x24\xd1\xd5\x68\x7e\x60\x5f\xc0\x38\x38\xb7\x37\xf7\xa5\xde\x22\x93\x5b\x23\x20\x73\xdc\x88\x79\xd7\x99\xc3\x90\x51\x8b\xf2\x1e\xe6\x58\x07\x8c\x76\xc6\xf9\xe2\x23\xa8\x2f\xb3\x17\x64\x4d\xbd\xe5\x8d\x7a\x5a\x41\xf9\x49\x8a\x28\x24\x2f\xc1\x19\x38\x4b\xce\x56\x2a\xa9\x92\x67\x2c\xb7\x4d\x90\x83\x97\xdb\xec\x89\x93\x8a\xcd\x02\x0c\xe9\xa5\x13\x22\xb7\x83\xae\x43\xb6\x28\xf3\xe7\xa1\x6d\xc6\x33\x9e\xba\x22\xe2\x6f\x15\xfa\xe1\xad\x57\x62\x3a\xff\x84\x17\x6b\xc3\x5e\x97\x94\xb5\xfb\x43\x76\xe2\x34\x1d\x7a\x4e\xb5\xf1\x85\x26\x5b\x80\x91\x26\x6c\x0c\x67\xf7\xea\xee\x9a\xa6\xe2\x5f\x14\x87\xbf\xdc\x31\xb5\x3a\x14\x61\x1a\x9e\x4d\x12\x88\x97\x52\x49\x9e\xab\xc5\x13\x08\x60\x61\x35\x0b\x0e\x7a\xb1\x82\x2a\x92\x06\xb9\x48\x45\x9e\x0f\x78\x71\xb8\xcb\xe4\xdd\x41\xf6\x8b\x5d\x4b\xb6\xb0\x25\xbc\x8b\xa2\xe5\x8c\x3e\x1f\x77\x85\xbc\xb2\xb8\xec\x90\x77\x31\x82\x59\x13\xeb\x03\xb9\x16\x1b\x53\xab\xe8\x69\x4a\x6c\x9f\x4b\xee\x7d\xcd\xc6\x00\x67\x23\x1a\x79\x2d\x99\x63\xac\xfb\xbe\xe7\x0b\x80\xa2\x02\x1f\x0b\x2c\x8f\xe4\x5a\xf4\xb2\x5a\xd4\x6d\x20\xe6\x36\xfa\xeb\x08\xc2\x66\x38\xa4\xf3\xd4\xdc\xd7\xd9\x4a\x80\xbb\xba\x38\x40\xc9\x8b\x17\xcd\xe3\x7c\xf1\x19\xeb\x97\x79\x2d\x72\x47\xf8\x60\x01\x1d\xb2\xad\xa1\x53\xcb\xf4\x38\x66\xb5\xda\xaf\xb2\x70\x85\x3c\x19\xcb\x44\x47\xf4\x48\xcc\x32\x93\xd4\xf9\x62\xb9\xef\x65\xf6\xe2\x92\xe2\x38\x8f\x7d\x26\xd6\x0a\x8b\x27\xbd\x0f\x60\xd9\xf4\xf9\xa6\x5c\xdf\x04\xef\x3e\x81\x01\x47\x85\xee\x3e\xb1\x91\x1b\x29\xff\xc0\x17\x61\x1a\x9e\xd6\x6b\xee\xa6\x71\xc1\xec\x34\x84\x51\x65\x1f\x21\x22\x2e\x45\xda\x63\x1f\x3e\x90\xc1\x84\x25\x40\xd8\x56\x8d\xed\xfe\x81\x93\xca\x28\xbe\x29\xcb\xc1\x13\x78\x58\x5e\x80\x60\x46\x5f\xd5\xe3\x73\xd3\xde\x52\xe2\xf2\x9e\x9a\xd5\xba\x6e\xdb\xa7\x94\x26\x1b\xc9\x1e\xd8\x17\x34\xa5\x79\x70\xef\x47\x3e\x96\x83\xd2\x4b\x76\xa1\x43\xc1\x06\x9b\x38\x54\x92\x91\x68\xe5\x04\xd1\xec\x74\xbc\x1e\x4e\x50\x2f\xcb\x13\x48\x00\xe3\xae\xaf\xeb\x42\x28\xce\x83\x60\x87\x08\xc1\x73\xdb\xc6\xd7\xbc\x65\x77\x10\xb7\xc5\x16\x70\x63\x5a\x42\xf1\xc9\x1d\xcb\xf0\x89\xbc\x73\x37\xd1\x89\x2b\x7a\x36\xa0\x2c\x3e\x9c\xca\x62\x73\x94\xa3\xda\xc5\x38\x94\x2b\x9f\xe5\x14\xb1\x04\x9e\x4a\x65\x3b\xbb\x58\x9e\x88\xec\xf3\xb2\xc8\x1a\x56\x93\xe5\xe2\xf4\x54\x5c\xc2\x0f\x5c\xed\x3c\x43\x99\xc6\x0c\x76\x8a\x3d\x88\xcc\x28\x06\x66\x7b\xf2\x23\xbe\x38\xb5\xed\x65\x5e\x8b\x03\x9f\x48\x75\x81\xb6\xf5\x5b\xf3\x34\x9b\x1d\x04\xba\xdd\x31\x19\x74\x21\xc8\x0c\x3a\xd7\xd0\xf9\x7c\x01\x20\x54\xa9\x6b\x2a\x4f\x64\x7c\xa1\x21\xe9\xe7\x45\x9c\x26\xcb\x9f\x09\xc4\xa9\x62\xc5\x59\x08\x19\xcb\x6d\x5a\x37\x21\x53\xed\xf6\x99\xcb\x79\xdf\x16\xd8\xb9\xff\x67\x54\xf4\xeb\x84\xc7\xe7\xbd\x85\x7d\xc9\xbf\xfb\xed\x9f\xf0\xd3\x7f\xef\x3f\x7d\xe5\xfe\x2d\x5f\xf6\xcf\xbe\xee\x4f\xfd\xf8\xef\xfc\xc0\x37\xfc\x95\x77\xfe\xd9\x3f\xf7\xad\x3f\x5d\x3e\x8a\xfd\xc8\x4f\xbf\xfc\x84\x07\x6d\x98\xcb\x0b\x10\x67\x00\x4e\xbe\x64\xdc\xec\x08\xb0\xd8\x8a\x26\x3f\xe8\xc1\x5b\xbc\x19\xb2\x71\xe3\x2d\x1d\x40\x57\xa6\x2a\x3f\x01\x1d\x12\x06\x20\xa9\xf3\xf4\x95\xf5\x62\x15\x0e\xd7\x38\xeb\x71\x55\x22\xdc\xbe\x2b\xb8\x6a\x1f\xe7\x52\x9b\x57\xc3\xe7\x3a\xc8\x80\xec\x81\xa3\xcd\x70\xc7\x40\xd9\xa9\x26\xb8\x59\xc8\x57\x1f\xdc\xb2\x35\xdb\xd5\x5d\xf2\x47\x8f\x93\x96\xb2\xa3\x99\x67\x30\x58\x04\x8a\x2d\x2e\x0f\x04\x1e\x7a\xf6\x85\x45\x23\xf2\x30\x72\x38\xc5\x0b\x21\x58\xee\x1d\x89\x62\xe7\xad\x99\x71\x7d\xdd\x1e\x49\x11\x23\x6b\x3b\x5e\xc5\xc3\x66\x9e\x48\x97\x5d\x6e\x43\x2c\x0e\x71\xd0\x46\x9a\x63\x59\x63\x1b\x68\x9c\xc4\x99\x2c\xb8\xb1\xed\x0b\x87\x34\x11\x64\x5c\xaa\xab\xdd\xee\xc5\xc9\x00\x2f\xf3\x17\x01\xae\x02\x1d\x5b\xf1\xa1\x98\xa3\x13\x38\x8f\x12\xc1\x11\xc7\xc1\x49\x05\xb0\x66\x82\xb7\x62\x7c\x30\x71\x50\x60\x66\xef\xcc\x8b\x07\xbc\x98\x12\xd9\xe6\x4e\xef\xae\x9b\x18\x84\xf9\x4d\x0a\x65\x74\x1d\x61\xc8\xe5\x4d\x5c\xf9\x94\x9e\x5d\x20\x5e\x49\x04\x67\x4f\x6a\x5e\x1c\x17\xfa\x32\x7b\xd1\x36\xd0\xbd\x6e\x5d\x10\x5c\x60\x04\x06\x8e\x8e\x50\x3b\x72\x80\x19\x89\xbb\x37\xd1\xfd\x1d\xd1\x41\x2b\x1b\x87\x30\xc1\x08\xe7\x9f\x00\xf9\x96\x78\xcc\x4a\x1d\xcc\xc6\xfb\xd0\x52\x2f\xc7\xdb\x02\x97\x0e\xe1\xb8\xb3\x43\xa0\xa4\xeb\xba\x56\xa2\xfd\xf4\x49\x59\x85\x1b\x7b\x62\x5f\x10\x87\x2e\xdc\x85\xa1\x8d\xe7\x4d\xea\xa1\x54\xe8\x42\x57\x5c\x98\xe0\x38\x15\xc7\xb0\x73\x3c\xcc\x44\xf2\xb5\xa4\x30\x86\xd1\x07\xd6\x02\x49\x68\x48\xb6\x09\x56\x79\x43\x98\xa3\xaa\x21\x1c\x6a\xdd\x7a\x2b\x94\x46\x10\xb8\xb8\x98\xb5\xb1\x67\xef\x61\xc3\x4b\xfd\xda\x83\xb0\x2f\x37\xc8\xf7\xbc\x3b\x33\x82\xf3\x55\xd7\x96\xbb\x48\x17\xa6\xbc\x72\xd5\xc4\xec\xda\x67\x91\x92\x8a\x32\x31\x67\x88\x56\x9d\xed\x5f\x9b\x4f\xf0\x32\x7b\x61\xed\x75\x31\x82\xd0\xd0\x07\x1e\xbd\x26\xe2\x83\x92\x04\x0d\x34\x87\x57\x9a\x36\x31\x7d\xf0\xde\x5f\x96\xe3\x45\x00\xae\xfa\xc5\xd9\x2e\x2f\xb7\x17\xd4\x13\xde\x9a\x3b\x27\x73\x67\xb3\x55\xfa\x17\xfc\x42\x97\x50\x39\xcc\x7c\xf6\x81\xba\x3a\x0f\x56\xe9\xe1\x8c\x9f\x7d\x8c\xf0\x40\x5a\xc4\x48\x1b\x54\x05\xb8\x21\xdc\x2b\x12\xa3\xeb\x7d\x13\xb5\x99\xaa\xf5\x2c\xb7\xa5\xc2\xc7\x9c\xf3\x18\xfb\x4a\xc7\x11\x91\x17\xde\x3e\x11\x53\x0f\x5a\x36\x94\x57\xa4\x75\x56\x90\x6f\x55\x20\x1d\x7a\x37\x25\x92\x8b\x9e\x40\x6a\x89\xa5\x79\x4e\x44\xb0\xc8\x99\xb4\xb3\x3e\x91\x2e\x33\x10\x84\x0c\xe1\xc8\xf7\x54\x68\x2c\x5c\xae\x0b\x1f\xf6\x50\xdc\x82\x65\x82\xa4\xaa\x70\xa4\xb1\xf4\x3e\x18\x11\x5b\xb3\xf3\x5c\xc7\x03\x5e\x2c\x4b\x19\x34\xb4\xe8\xbb\x5c\xf9\x02\x67\x97\xec\x2c\xa9\xe8\x25\x2b\x5d\x96\x84\x04\xb5\x46\x73\x5d\x2a\x90\xf3\xbc\xa1\x46\x8f\xd0\x2e\xfd\xa8\x5b\x2e\x74\xc0\x6e\x44\x40\xb2\x01\xec\xfc\x2a\xd2\xc7\x9c\x64\x46\xcc\x6e\xc8\xce\x93\x2d\x62\x6b\x61\xa4\x95\x5b\xf3\x27\xe0\x35\x9e\xf1\x50\xd0\xe0\x8e\x18\x03\xf2\x3a\x77\xb8\xfd\x59\xb2\xcb\xe2\x4e\x59\xc1\xe9\xdd\x4d\x23\x11\xf7\xc8\xa3\xea\xa1\xd9\xb5\x9e\x48\x97\xd7\x98\x66\xc4\x88\xab\xcf\x05\xb4\x61\x61\xbb\x61\x25\xc7\x3d\xd1\xee\x0b\xef\x30\xea\x79\xe6\x79\x47\xd0\xc2\x65\x11\x21\xc0\xa6\x27\x92\xf6\xd5\x2b\x85\xdb\xa5\x12\x8a\x30\xa1\x60\x9c\xba\xb8\x69\x3c\x7c\xcb\x7b\xab\xc8\xf9\xe2\xc7\x11\x12\x01\xd6\xc3\xed\xaf\xce\x9f\xd8\x9d\x2a\x68\x83\x1c\x47\x9c\xdb\xb9\x20\xde\x3a\x18\x1b\x88\x75\x87\x46\xe3\x9e\xac\x76\xd3\xbc\x69\xad\xc7\x03\x4a\x01\x6d\x84\x2f\x8e\x85\x7c\x99\xbd\x48\x40\x25\x54\xe3\xb9\x67\xe7\x3e\xa9\x81\xa9\xaa\xd2\xca\x0e\x90\x3a\x8e\xce\x32\x4b\xd4\x2a\x7b\xbb\x03\xd1\xe5\xdc\xb4\xde\x3d\x10\xd9\xe9\x02\x44\xe6\x39\x4d\x41\xb9\x3b\x10\x56\xa4\x2d\x76\xd4\xe6\x60\x6d\x61\xcc\xfc\x59\x60\xc7\xa6\x84\xb3\x49\xbb\x60\xf6\xbe\x3e\xb0\x16\xbf\x0a\x13\x8d\xbb\xcf\x7c\xe6\x60\x5d\x8a\xb2\x50\x95\x42\x09\xf7\x14\xf9\xa4\x71\x84\x69\xc0\x1c\xfe\x38\xf0\x99\x36\xd5\xcd\x95\x27\x4a\x5c\x47\x2a\xc6\x9c\xd6\xa0\x9a\x49\xc2\x71\x98\xd3\xca\x17\xd2\x0a\x00\x18\x83\x01\x0f\xc6\xb2\x58\xb2\x46\xc1\xe5\xf2\xa1\xdd\x2a\x3c\x71\x83\x53\x6b\xa1\x20\xb1\x55\x47\xc1\x2e\x7e\x75\xb1\x94\x95\x6d\xf7\xda\xa5\x72\x5d\x70\x98\xbc\x24\x77\xe7\x85\x95\x80\x03\x6a\x8f\xec\x4e\x7f\x8d\x78\xb8\x4b\xb1\xe3\xaa\x08\xa8\x18\xae\xc5\x60\xb7\xd2\x94\xcb\xd1\x60\x25\x34\x8d\xb2\xab\xf7\x83\x83\x9b\xad\x2b\xe1\xf5\xc4\x17\x59\x63\x51\xc3\x0f\x61\xcf\x03\xf8\x03\xdd\xfe\xf4\x55\xdb\x0c\x33\xdb\xd7\x9d\xb3\xd2\x56\x53\x57\x43\xe9\x28\xc8\xa3\x92\x96\x2d\x79\x22\xbf\x20\x7d\x61\x6e\x80\x6c\xbb\x4e\x8e\x56\x83\x18\xc8\x29\xc8\x72\x67\xa4\x06\xd0\xa4\x61\x65\x34\xfb\x1b\x5d\x2b\x1f\xc4\xbb\xf5\x04\x41\xda\x28\x3a\x8d\x48\xa8\x7a\xeb\x38\x5b\xde\x26\xec\x8a\x77\xda\xda\xa9\x4e\x7f\xdd\x1e\x43\x0b\x95\x0e\x03\xb7\x9a\x07\xdf\x69\xab\xdf\x40\x78\x7c\xf4\x7f\xf7\x3e\x7f\xf4\x77\xbd\xff\xb7\x7e\xd1\x0f\xfd\x99\x8f\xfb\xe0\xff\xeb\x5f\x7f\x17\x38\x5e\xf1\x8a\x16\x7f\xe6\xb7\x7e\xc4\x97\xff\x7f\x3e\xe0\xab\xfe\xc9\x1f\xff\x73\x5f\xff\x00\xe1\x21\xfd\xe2\x06\x08\x6c\x29\xba\x9c\x3d\xe5\x0c\x12\x63\x96\x89\x63\xd9\x19\xa0\x22\x34\x9e\xb1\xe3\xca\x6c\x53\x30\x6b\x83\x96\x3d\xc1\xb4\x6f\x1c\x9b\x29\x46\xe9\xd0\x69\xc1\xe4\x42\x87\x7d\x21\x4f\xbf\x49\xee\x81\xd3\xd3\x21\x8e\x56\x5d\x2d\x78\xa5\x79\x71\xe1\x84\xe2\x09\x18\x25\x91\x3c\x18\xbf\x3c\x1d\x28\xc6\x22\x93\x89\x12\xaf\xc6\xf4\xa4\x5e\x9c\x86\xb9\x9e\x7d\x47\xea\x18\xb7\xc6\x9b\xb3\x61\x20\x7d\x22\x69\x0f\x77\xa6\x38\xd6\x53\xb0\xb4\xb9\x3a\x41\x8f\xae\x95\x99\xac\x3c\x1d\x35\x85\xfb\xd1\xc2\xc8\x17\x1a\xf8\x3e\xf7\xc0\xb4\x11\xfe\x44\xe0\x71\xc1\xba\x93\x59\x0a\x8d\xac\xc0\xd0\x9d\xc2\x35\x4c\xe8\xa7\x9e\xd0\xe5\xca\x60\xe5\x00\x5b\xa7\x36\x25\xfe\x54\x34\xb5\x5f\x9b\x10\xfd\x72\xd3\x2e\x9c\xb0\xa6\x3b\xdc\x52\x8b\xc0\xc3\xce\x96\xae\x35\x80\x3c\x26\x96\x83\xd1\xc2\x07\xbe\x59\x43\x97\xae\xc4\x27\x8d\x0d\x76\x4f\x00\x18\x73\xee\x1a\xed\x89\x07\x03\x08\x20\x98\xb2\xd4\xd2\x82\xe0\x0b\x49\xfb\x1e\xa7\x40\x5d\xdd\x6a\x58\x95\xa4\x24\xd1\xe3\x6a\xf2\x03\xfb\x82\x6e\x31\x42\x99\xc7\x79\x88\x94\x0e\x44\x2d\x3d\x52\x04\x41\xc7\xce\x36\x5a\xcc\x1c\x38\x27\x3a\xe6\xd4\x64\x2b\x73\xb6\xa0\x16\x7b\x22\x39\xdb\xc4\x22\x5a\x0f\xca\x74\xef\x46\x9c\x24\x82\x25\x0f\x21\x33\x3f\x94\x27\x1c\x90\x7b\x29\x45\x2c\xa8\x73\x91\x01\xc5\x21\xeb\x23\xbb\xf3\x3a\x33\x70\xb6\x05\x50\x24\xd7\x96\xdc\xf6\xe0\x7e\x17\x62\x40\x53\x97\xc8\x5a\xe3\x55\xc3\xd6\x2d\x0f\xc8\x8e\xb8\x47\x71\x8f\x24\x67\x73\x08\xd3\xaa\x5d\x35\x9f\x03\x16\x35\xad\x24\x3a\x57\xb7\xbb\x41\x62\x73\x43\xe9\x79\x7b\x7e\x53\x0c\x17\xeb\x84\xe7\x8d\xd7\x13\xe1\xcf\xe5\xa5\x95\xf6\xa5\x25\xce\x13\xe9\x4c\x88\xaa\x8e\xb9\x39\x8f\x2b\x80\xb4\x30\xcb\x37\x6d\x77\x6e\xa7\x91\x24\x35\x4a\x17\x7f\x80\xfc\x61\x7e\x24\x73\x4f\x6e\xad\x68\x26\x22\x4f\x14\xc5\x0d\x9c\xf6\xae\xe1\xbe\xb1\x53\x3d\x23\xdb\x8c\xb3\xd5\x1b\xa2\x45\x51\xd3\x83\xfd\x44\xd2\xbe\x47\x95\x53\xb7\xab\xb5\x0b\xc8\xf3\xbe\x47\x3a\x99\x1e\xb4\x8e\xfb\x9a\x42\xf7\x12\x75\x58\xa0\xf1\x63\x1c\x73\x2a\xb5\x52\x7d\x00\xd8\x32\x79\xc8\xd1\x67\xed\xfc\x64\x91\xdc\x4c\xac\x3c\xd7\xb9\xe6\x60\xf1\xa8\x8c\x73\x61\x24\x60\x3c\x5d\x5c\x76\xba\x91\xb3\x98\xd2\x07\x4e\x2a\xed\xca\x91\x0b\x8f\xbe\xd4\x59\xc2\x75\x34\xec\x27\x12\x51\xf1\x13\x0a\x02\x6a\x22\xfa\x48\x8e\x2f\x64\xe8\x39\x34\xac\x5d\xa8\x27\xf4\x04\xcc\x91\xe3\x72\x12\x26\xa7\x76\xe7\xc4\xde\x87\x2e\xb4\x96\xcb\x66\xc0\x32\xc5\xb0\xd8\x86\x6f\xc8\xb4\xcc\xfa\x4a\xbc\x1f\x16\xd0\x27\xce\xc8\x45\xee\x92\xcd\x54\x8b\x9e\x02\x2c\x5c\x66\xc0\x6c\x6b\xeb\x99\xdc\xdc\x8e\x32\xb0\x2b\x54\x68\x46\x0e\xb2\x4f\x63\x0f\xa7\xd9\x13\xaa\x06\x79\x1a\x41\x16\x1d\x4d\x88\x7c\xae\x43\x8f\x9b\x38\xe4\x0d\xa8\x2d\xe7\xba\xdc\x79\x81\x4d\x07\x12\xa4\xeb\xdd\x71\x00\x14\xbb\x27\x08\x8f\x32\x8e\x5a\x0d\xb3\xd5\x84\x5b\xe3\xf3\x48\xeb\x88\x2b\x0c\x40\x9c\x92\x68\x1d\x6c\x86\xe3\x50\x58\x5e\xf0\x18\x67\xc1\xca\x87\x27\xd4\x71\xac\xb9\xd5\xe7\x64\xb7\x9e\xad\x61\xa4\x66\xda\xd6\xbb\x41\x8a\x3e\x58\x94\xa4\xdd\xad\xa7\x6d\xee\x9b\x6b\x43\xab\xe1\x76\x29\xfb\xc0\x7d\x41\x35\xcc\xc1\xe4\x8e\xb9\xbd\xf3\x4c\xc6\x3b\x83\x25\xd2\x96\xa4\x11\xa5\x2d\xb7\xd7\x55\xe1\xae\xfb\x3d\x4f\x71\x57\x4b\x96\x76\x4f\xe8\x58\xbd\xce\xe0\x1c\xe0\x68\x4a\xc5\x40\x2f\xd7\x0f\x4d\xae\xde\x63\x2c\xb7\xf3\x05\x73\xcc\x64\xd8\x36\x66\x49\x84\x35\xaa\x38\x19\x9e\xf0\x02\xf2\x43\x56\x0c\x52\x25\xb7\x51\x70\xae\x1a\xb2\x8d\x44\x5c\x9e\x21\xa6\xd1\x38\xbb\x96\xc3\x85\xeb\xbe\xb9\xb8\x4b\x69\x04\x3f\x92\xf1\xf1\xc4\x0e\xad\x4b\x6f\x20\xe4\x6b\xcf\x4b\x25\x52\x01\x16\x50\x4e\xd7\xc6\x0e\xac\xc9\x21\xef\xb9\x97\xb9\x1a\x6a\x39\x1c\x6d\x3f\x50\x43\xa7\x0c\xa7\x54\x8d\xa4\xbe\xd6\x5d\xaa\xb1\x26\x79\xb8\x53\x12\xb7\xf1\xd3\x8c\x78\x18\xb1\x85\x98\x99\x11\x60\xb7\x4d\x42\xba\xf5\x44\xb9\x8f\xba\xd4\x17\x52\x1e\x06\xed\x30\xbb\x03\xb0\x46\xcc\xb3\xae\x30\xea\xed\x60\x82\xea\xf0\x7a\xe9\xa8\x6a\x65\x10\xe8\x0a\x2f\xf7\xc4\x5a\xb8\x63\x95\x66\xa9\x2c\x50\x51\x50\x3a\x38\xc0\x09\x71\x3b\x66\x8f\x5e\xde\xd9\xf5\x83\x78\x0a\xc8\x69\x9b\x02\x14\x81\xbc\x15\x78\xa2\xb8\x94\x06\x98\x24\xbb\x34\xc5\xc9\x71\x86\xc2\xdf\x2b\xb9\x99\xbb\x77\x17\x18\x27\x1e\x44\x0d\x4d\x6e\x20\xd3\x36\x19\x76\xe7\x46\x7e\xa2\x07\x80\xa6\x2c\x95\xeb\x52\x59\x7b\x85\x39\xd3\x8e\x4e\xc1\x0a\xd6\xaa\x6c\x1e\x97\x50\x7c\x15\x58\x84\x1d\xe3\x5a\xba\xc4\x8a\xc6\x7a\x42\xbb\xa9\x07\x01\x68\x76\xa3\x9a\xbc\xb7\xb9\xa0\x59\x3c\x9e\x15\xa0\xde\x82\x13\xca\x1a\xce\x46\x3d\x23\xf4\x55\x36\x23\xfd\x12\xce\x3e\x42\xfe\x04\x08\x1a\xf0\x69\x42\xa3\x82\xc4\x84\xe5\x5b\xa3\xb6\x4e\x6d\x99\xc0\x73\xf3\x70\x67\x7c\x32\xbf\xf7\x59\xba\xef\xdd\xd5\x5a\x7e\x03\xe1\xf1\xe3\xff\xf4\x0d\x9f\xff\x96\xdf\xf9\x13\x6f\xfe\xce\xcf\xb0\x5f\xf0\xb9\xf6\xcb\x3e\xf7\x47\x3e\x50\xbf\xf5\xa3\xfe\xd0\xfb\x7e\xca\x0f\x7e\xd0\xcf\xfe\x3b\xaf\xff\x94\xd7\xfc\xc3\x27\x14\x1e\x13\xdc\xe0\x90\xd7\x4e\x49\x27\x6d\x6e\x42\x23\x6d\x64\x54\xa9\xf2\x71\x91\x02\xf8\x58\xbe\xf1\x6b\x0f\xca\x34\x0d\xe3\x64\xfb\x09\x30\x07\x9b\x80\x8e\xe6\x2b\x6d\xc8\x0d\x22\x35\xef\x73\x9e\x13\x9a\x89\x80\x02\x52\xf5\x09\x8e\x85\x74\x5e\x50\x12\xa8\xe0\x92\xf4\x91\x06\x8a\xd8\x2f\x14\xcb\x40\x52\xf8\xdb\xee\x58\x0b\x89\x0e\xf1\x04\x0f\x03\x1a\x76\x55\x1c\x40\x8d\xbd\x98\xcf\x69\x53\x15\x80\x4d\xee\x89\xca\x5c\xb7\x13\xfa\x88\x79\xba\x5a\x38\xad\x61\x55\xc3\x70\xb3\x43\x0d\x8a\x05\x3e\x13\x23\xea\x28\xb7\xe0\xf6\xe8\x44\x29\xeb\xe4\xb1\x9f\x68\xe3\xc0\x98\xc0\xd0\x01\xc5\x49\xd7\x5a\x3b\xf7\xe4\x58\x61\x78\x27\x0e\xbc\x61\x54\x61\xa3\xa5\x89\xd3\x49\x06\x01\x6b\x02\xd4\xb2\x27\x98\xf6\x66\x27\xa4\xc3\x55\x55\x45\xbd\xe9\x85\x9c\x54\xbb\xc9\xe3\x9e\x2a\x04\xcb\x49\xac\x15\xac\x1e\xc7\x42\xea\x42\x41\x9e\x60\xd1\x07\xaa\x51\xd4\x53\xb7\x7b\x4a\x66\xf8\xdc\x14\xb6\xd8\xd0\x4c\xb8\x4a\x13\x61\x42\x9b\x3f\xee\x84\x8c\xd6\x1c\xa3\x7b\x32\xdc\xcb\x99\xeb\x13\x81\x87\x05\x7f\x0b\x82\xc1\x80\xac\x1a\x5e\xa6\x04\x17\x21\x09\xc5\x3e\xb7\x26\x87\xb2\x80\xd5\x89\x82\x19\xfe\xbc\xa3\x97\x64\xe9\xf9\x88\xe6\x66\x9e\x93\x5d\x78\x22\x73\xe9\x8b\xdc\x62\x4d\x48\x35\x9b\xcd\x08\x4f\xb6\x00\x40\xe6\x2a\xeb\xba\x0d\x89\x28\x37\xcd\xbb\xf7\xe1\x81\xca\x1c\x05\xc1\x49\x33\x0f\xe9\x13\xd2\xe2\xec\x03\x22\x1a\x39\xa8\x8c\xda\xf3\x54\x6c\x8f\x0e\xeb\x72\x24\x07\x12\x93\x28\x26\x4a\x93\x9f\x90\xdf\xde\xf9\x5a\x9c\x32\xc7\x7a\xeb\xb5\xcf\x03\x69\x3e\x17\x36\x3c\x1f\x7b\xd3\x4c\xce\x99\x0e\x18\x38\x95\xc7\x01\x5b\xf6\x79\x14\xff\x44\xd2\x7e\x6e\x5a\xae\x11\x9c\x30\x2d\x34\x78\x65\xb9\x5c\x0a\xeb\x3a\x20\x3a\xe6\x08\xfe\xe8\xd7\x82\x24\x0f\x8f\xcd\xb4\x6c\x46\xc8\xca\x13\xd5\x6b\xcd\x20\x9a\x17\xba\xb1\xd5\x10\xa5\xb9\xea\x60\x9c\x1f\xe2\xc4\xba\x27\x61\xa5\x2a\x45\x02\x7f\xa3\x58\x6e\x28\x94\x38\xc7\x7c\x02\xcc\x51\x90\xca\x2d\x81\xaa\x2b\x9e\x8b\xdd\x1a\xcd\x82\xca\x0c\x96\xaf\x7b\x85\x7e\xd5\x74\x61\x32\x66\xbd\xe9\x91\x23\x77\x18\x61\xd6\x9e\x50\x84\x61\x7e\xb3\xe3\x96\xca\x0f\xd0\x99\x31\x8e\x1b\x48\x68\x2e\x86\x77\x29\x42\x3e\x10\xc5\xad\x94\xe3\x70\xa2\xd2\x5b\x99\x83\x90\x27\xe0\x35\x6d\x03\x96\x7a\xa3\xca\xcc\xc0\xd3\x86\xfb\x4e\x97\x23\x77\x32\x76\x1b\x47\xe7\x31\x4c\x06\xf1\xd8\x5e\x98\xbe\xe4\xa2\x82\x6d\xff\x84\x5e\xd1\x74\xbe\xb8\x04\xad\x8d\xcd\xb8\x4f\x5c\x46\x7d\xef\xc4\x5d\x3e\x82\xc2\xe5\x20\x11\x98\x04\xd5\x3a\x8a\x52\xc0\xc8\xdb\x5b\xff\x44\xdb\x57\x65\xd0\xdf\x9c\xda\x08\xdb\xa5\xaf\x2d\xfc\xb5\x6e\x8b\x46\x33\x5d\xd7\x60\x0c\xe8\x33\x85\x45\xc7\x19\x37\xa5\xb3\x11\x04\xe8\x13\x54\x43\x45\x43\xdf\x35\x21\x31\xd1\x6a\x6d\x0b\xc1\x32\x83\xc8\x0e\x74\x04\x7e\x5f\x27\x17\x04\x15\xe3\x7b\x05\x61\xe2\x11\xa7\xcd\xf0\x09\x6d\xc5\x48\xf0\x6a\x53\xb2\xbe\xfd\xa9\x89\xb8\x24\xd6\x8c\x91\xe9\xaf\x2c\x0c\xf4\xa0\x4f\x5c\xf2\x52\xd9\x92\x76\x94\x86\xe7\xd4\x4f\xb4\x3a\x31\x0a\xec\x39\x69\xb6\x40\xe1\x70\x69\x0d\x8e\x7d\x99\xc9\xcf\x11\xe4\xdd\x2c\x3d\x65\xb3\x77\x3a\xbb\x3f\xf7\x28\x97\x3a\x2f\xe4\xf8\x23\xf0\x9a\xe9\x5b\x59\x9f\xbd\xd0\x20\x03\xcf\x2c\xe0\xd6\xf8\x1a\xc9\x35\x34\xdd\xf1\x28\x85\x88\x2d\x11\xbc\x0e\x90\x36\xc8\x71\x3f\x42\xbb\xcc\x79\x55\x89\x8e\x5b\x8e\x7c\x35\x92\x02\xd4\xe4\xf4\x34\x12\xcb\xd2\xd1\x01\x3d\xa4\x5b\x9c\x2c\x87\xf8\x4d\xf6\x3a\x3b\x60\x2f\x4e\x61\x7a\x99\xbd\x10\xb1\x61\xa7\xa6\x49\xb3\xc4\x7a\x5b\x18\x82\xc6\x9a\x54\xad\xdb\x4c\xd6\xe1\x75\xc7\x7c\xdd\xe7\x8c\x1b\x5e\x09\x86\xee\x3b\x7b\xa2\xb8\xa4\x54\xcf\x85\xae\x7b\x6c\x60\x7c\x60\xea\xa2\x11\xe0\x92\xe8\x5c\xbe\x08\x49\x62\xc8\xc9\x2b\x6d\xfb\xb9\x55\x82\x42\xd9\x49\x9f\xa8\x5e\x0f\x68\x5c\xc7\x0c\xc2\x5c\x46\x81\x6e\x98\x4a\xdd\x4d\x82\xda\x4c\xd4\xdb\x64\x5e\xf5\x22\x6a\x93\xeb\x92\x41\x93\x39\xe0\x09\x9f\xc0\x23\xd8\xd2\x5b\x34\xbd\x9c\x2f\x0a\x83\x05\x5a\xef\xfc\xaa\xa4\x38\x9f\x92\x3c\xd9\x29\xd4\x59\xe5\x28\x57\x1d\xdd\x5f\x62\x57\x69\xed\x13\xb7\xd6\xd5\xb1\xba\x5b\x86\xa1\x1a\xb1\xda\x4d\x80\x60\x8e\xbe\x80\xba\xa1\x8b\x26\xec\xa9\x41\x4e\xb7\xc5\x4d\x21\x6d\x8d\xf3\x17\x7b\x22\x8e\x10\x90\x59\xc1\xd1\xdc\x83\xa7\xea\xc0\x1a\x2d\x5b\x06\xe2\x29\xf8\x00\xad\x24\xd1\x8b\x48\xdb\x59\x28\x9b\x82\x1b\x0c\xb1\x9f\xc8\xf8\x28\xe1\xe0\x85\x9b\xd9\x0b\x4a\xd0\x32\x2a\x15\x25\xf3\xe2\x66\xa2\xb0\xa8\x31\xb7\x0a\xf2\x14\x98\x36\x8b\xfb\xec\xf2\x8c\x37\xcb\x4f\xec\x4e\x1e\x26\x9d\x40\xc6\xa6\xbd\x09\xb6\xc2\x90\x32\xce\x2d\xc7\x75\xa4\x3e\xc3\x29\x07\x02\xe0\x02\x33\x5a\x24\xe7\x0b\x1f\x88\x8b\x27\x50\xd1\x28\xe2\x26\x49\x53\x03\x43\xec\xb2\x1f\x09\xea\x15\x7c\xb9\x53\x5d\x09\xd6\xb6\x2c\x66\x36\x93\x1d\x63\x01\x47\xe2\xa5\xd9\xf6\x3f\xef\xce\x4f\xfe\xad\x2f\x12\x1e\xdf\xf3\xd9\x6f\xfa\xe8\xef\xfd\x95\xd7\xfe\x95\xff\xfd\xe7\x7c\xe8\xab\x5e\xf5\x57\x3e\xe8\x23\xfe\xc4\xc7\xb6\xdf\xfe\x2d\xbf\xef\x75\xbf\x65\xbf\xe5\x43\x7f\xd7\x1b\xbe\xe3\xdb\x3e\xef\x57\x09\x8f\xb7\xfd\x8c\x7f\xef\x7b\xdf\xfd\x83\x5e\xf9\x36\x2f\xfe\xcb\xfd\xfa\x77\xfc\x98\xb7\x7b\xfd\x3b\xfd\xe2\x0f\xff\xb7\x3f\xdc\xde\xe7\x55\xbf\x45\x7d\xd2\xcf\xfc\xdc\x9b\xfe\xf9\x7f\xf8\xfa\x1f\xfc\x33\x1f\xf2\xba\x1f\x20\x5f\xfc\xd6\x3f\xfd\x12\xd3\xcf\xf8\x3a\xf5\x1f\x7d\xce\x1b\xdf\xf8\x8d\xe5\xdf\xff\xf8\xbf\x7d\x7e\xe0\x1f\x7e\xfb\xbf\xfd\x31\xef\xf6\x79\xf7\xf7\xfe\xdc\x97\xbe\xdd\x67\x7e\xf6\x1f\xff\xb4\x4f\x7c\xe3\x9b\x5f\x62\xfa\x86\xff\xe9\xf7\xbf\xf9\x4b\x7f\xdf\x7b\x7f\xca\x6f\x3a\x5f\xff\x39\x6f\x7a\xd5\xbf\xf8\x1b\xff\xa3\xf8\xa8\x57\xfe\x9e\x9f\x7e\xd5\x37\x7f\xe9\x6f\xfa\x97\x9f\xf0\xbb\xf4\x8f\xff\xd1\x97\x98\x7e\xf3\x7b\x7f\xdf\x47\x7c\xfa\x5f\xff\x23\x9f\xf8\x85\x1f\x6c\xdf\xf2\x9a\x8f\xfd\xae\xff\xe4\xeb\xff\xe0\x0f\xbd\x9d\xfa\xcc\xfb\xf7\xfd\xa5\xb7\xf9\xbc\xef\x7b\x9f\xbf\xfb\xea\x77\x7a\x89\x29\x7d\xb5\xfe\xc7\xaf\xff\xf3\xf6\x3f\xff\xa8\x77\xff\xfb\xff\xfa\xcd\x3f\xff\x9e\x6f\x90\xf8\x43\x3e\xf6\x0f\xbc\xe1\x5f\xbd\xef\x4f\xbc\xee\x43\xdf\xf0\xdf\x7d\xfb\x2b\xff\xe2\x4b\x4c\xff\xe9\x8f\x7e\x7f\x78\xa7\xd7\xff\xb9\x7f\xf4\xd5\xc7\xef\x7d\x9f\x6f\xfc\x77\x7e\xfc\xf5\x6f\xf9\xd0\x7f\xfe\x2d\xe4\x1f\x7c\xc6\x5f\xfa\x80\x1f\xd6\xe2\xc7\x5e\x87\xfe\xe0\x4b\x4c\x3f\xfb\x57\xfe\xce\xef\xf8\xb2\x57\xbf\xe2\xfb\xbf\xfb\xc3\xde\xf1\x63\x3e\xe7\xed\xfe\x93\x1f\xfe\xe3\x1f\xff\x39\xff\xf8\x33\xde\xf2\x6e\xef\xfd\x0d\x5f\xf7\xcb\x6f\xfd\xee\xf7\xff\x9f\xde\xff\x25\xa6\x7f\xed\x47\xfb\x87\x7f\xf1\x07\xfe\x07\xff\xfc\x7b\x3f\xfc\xfd\xd4\xfa\x4d\xd7\xdf\x7a\xf3\x87\x7e\xdc\xc7\xfd\xdd\x77\xf8\x53\x7f\xf3\x4f\x7c\xd8\x67\xbd\xee\x23\xbf\xf3\xf3\x3f\xeb\x25\xa6\x1f\xff\x61\xff\xab\xcf\x3a\xdf\xfa\x39\x9f\xfa\xbf\x79\xe7\x30\xe3\x97\xbf\xf6\x8f\x82\xb7\xfe\x3f\xbf\x67\x7f\xd3\x07\xfd\xfb\x5f\xf5\x4f\xfe\xfc\x7b\xfd\xab\xcf\xfd\x17\x3f\xff\x12\xd3\x1f\x7b\xd7\xb7\xf9\x8f\x3e\x5b\x7c\xfa\x7f\xf1\x9a\xaf\xff\x93\x9f\xfb\x7f\x79\xcb\xb7\x7c\xdb\x57\xff\x81\x9f\xfc\x82\xe3\x1d\xbe\xef\x93\xff\x5f\x3f\xf7\x01\x1f\xfd\x7e\xaf\x7d\xdb\x57\xbd\xc4\xf4\xed\xbe\xf3\xcb\xfe\xc0\xbb\xfd\xeb\xbf\xf6\xa6\x2f\xf8\xd4\x4f\xff\x3b\xef\xf2\xb5\x5f\xf9\xbe\x3f\xfb\x9a\x77\xfa\xe8\xf5\xc7\x3e\x7f\xbd\xeb\x1b\x3e\xe9\x64\x7f\xe0\x95\x1f\xf7\xd2\x0f\xfb\xa9\x7f\xf1\x2b\xff\x51\xfc\x3f\x7d\xcc\x47\xbb\x57\x8d\x8f\xfc\x62\xf8\x0d\xaf\x78\x9f\xcf\xfb\x98\xd7\xff\xc9\x57\x7f\xcf\x07\x7e\xe2\xdf\x1f\x7f\xe1\x3f\xfc\x92\x4f\x7e\x89\xe9\xcf\xfd\x17\x3f\x26\xc4\x96\x6f\xf7\xfb\x3e\xe4\x17\x3f\xeb\xb5\x9f\x36\xfe\x9b\xb7\x7e\xc3\x8f\x7f\xd3\x5f\xfa\xab\xff\x8f\xf7\xfe\xc8\x0f\x78\xaf\x2f\xde\x5f\xf5\x8a\xaf\x7d\x89\xe9\x67\xc1\xdf\x65\xbe\xe2\x7f\xf8\x81\x5f\xf9\xf2\x2f\xf9\xc9\x7f\xf0\x9f\x7e\xba\xf8\xf0\x2f\xfb\x3d\x3f\xfa\xbb\xff\xc4\x7b\xfc\x75\xf8\x96\xd7\xbd\xfa\xcb\xbe\xf2\x1d\xbe\xed\x3b\x5e\x62\xfa\x61\xff\xfd\x1b\xdf\x37\xfd\xe0\x7b\xfd\xee\xbf\xf5\x1f\xf0\x3f\xf2\xc1\x1f\xbe\xbe\xe9\xb3\xbe\xe1\xa7\x3f\x7e\xfe\xd0\xbb\x7f\xd5\xbf\x7a\xdf\xff\xad\xfb\xe2\x2f\xfa\x99\x5f\x7a\x89\xe9\xff\xf9\xcb\xbf\xe6\x35\xef\xf4\xa7\x3f\xf8\x27\x5f\xfb\xa6\xb7\x7f\xf5\x78\xb7\x57\xbc\xfe\xd5\xef\xce\xfe\x8f\xfd\x95\x3f\xf0\xf7\xfe\xfb\x77\xfd\x4b\x6f\xfe\xa4\xef\x78\x8f\xf4\x12\xd3\xbf\xfb\x46\xf5\xf6\xff\xe3\xdb\xff\x85\x9f\xf9\xbe\x1f\xfc\xfe\x7f\xfc\x87\xd9\x97\xbc\xe9\x6f\xbd\xdf\xdf\xff\xc8\x5f\x80\x9f\xf8\x6e\xaf\xfb\xc2\xd7\xbe\xfb\xc7\xbd\xeb\x67\xfd\xd6\x97\x98\x7e\xf5\x6f\x7e\xe7\x57\x7e\xf8\xbb\x7c\xcf\x1f\xfe\x8b\x1f\xf6\x69\xbf\xf0\xc3\xef\xf7\x1d\x7f\xec\x3d\x5f\xf7\x0d\xdf\xf4\x4d\xbf\xfc\x97\x3f\xff\xfd\xbf\xfa\x1f\xfe\xc9\x37\x7d\xe4\x3f\xfa\x23\x2f\x31\xfd\x2d\xff\x30\x7f\xee\xff\xfa\xc7\xde\xf9\xe3\x3f\xfd\xcf\xff\xe6\x8f\x78\xaf\xb7\x9e\xaf\xfa\xbf\xfd\x57\x1f\xfd\x5b\xdf\x51\xf0\x8f\x10\xbf\xf8\xd5\x3f\xf9\xdd\xbf\xe9\xfb\x7f\xee\x25\xa6\xff\xe4\xb3\x7f\x29\xfc\xe5\x77\xf8\x9b\x93\xbe\xb2\xfc\x48\xfe\x9a\xbf\xf1\x3b\x7e\xfb\x6b\xfe\xce\x6b\xde\xf9\x75\x7f\xe4\x5d\xff\xe3\x77\x84\xdf\xfc\x17\xff\xc6\x6f\xfb\xea\x97\x98\xae\xaf\x7d\xc7\xdf\xfe\x9e\x6f\xf3\x1f\x1f\xbf\xff\x0b\xbe\xee\x3d\x7f\x51\xfd\xce\x9f\xf9\xcc\x5f\xfc\x3f\x7c\xcc\x6b\xfe\xfc\xef\xfe\x17\xff\xed\xaf\xbc\xf7\x4f\x7c\xe8\x7b\x7d\xd8\xff\xfd\x25\xa6\x1f\xf5\x57\x5f\xfd\xcf\x7e\x22\x7c\xfe\x5f\xf8\xde\xf5\x87\x7f\xe8\x9d\xde\xfa\xc3\xdf\xf9\xed\xff\xbb\x7f\xfb\x3d\xde\xe1\xbd\xdf\xf3\x0f\xbe\xe7\xfb\x7e\xf1\xa7\xfd\xbd\xb7\xf9\x95\x9f\x7a\x89\xe9\x6f\xfe\xa1\xf7\xfa\xde\x57\xbd\xcb\x9f\xfd\x8e\x37\xff\xd4\xa7\x7c\xf0\x5f\xf8\xb7\x3f\xf5\xbf\x7e\xc5\xd7\xfd\xde\xd7\xde\xaf\xfe\xfc\x3f\xf4\x09\x5f\xf9\x53\x9f\xf0\xc1\x5f\xf0\xa9\xef\xf8\x12\x53\xf5\xee\x6f\xfb\x45\xdf\xfa\x29\xf2\x5b\xd7\x2f\xbd\xe9\x53\xbe\xe7\x15\xff\xef\x4f\x7e\x9b\x3f\xf3\x7d\xff\xcd\x77\xfd\xb1\x3f\xfe\x13\xc7\x37\xbe\xcf\xef\xfe\xe6\xaf\xff\xe4\xff\xfa\x25\xa6\x9f\xfc\xb9\x3f\xf8\xdb\xff\xe5\x6b\xff\xd8\x8f\xfe\xc2\xb7\x7c\xd4\x3f\xfb\xa4\xd7\xfc\xe9\xf7\xff\x91\x9f\xa7\xff\xf4\xd5\xef\xf2\x1e\xff\x65\x31\xdf\xf8\x4b\x1f\xfe\xea\x6f\xfd\xd8\x97\x3a\xf0\x9f\x7d\xc5\xb7\x79\xf6\x0f\x5e\xf9\xd7\xfe\xcb\xf7\xff\xcf\x3f\xf0\x2d\x6f\xfb\x91\x1f\xf4\x29\xff\xd5\x1b\xcc\xb7\xff\x3c\xf8\xb3\x3f\xfb\x2b\x6f\xfc\x53\x9f\xfb\x01\xef\xf4\x57\x7f\x9d\x7f\xfd\x37\xdd\x2d\x0f\x8c\x14\x7a\x21\xa3\x93\x8d\x4c\x70\x79\x7c\xb2\x5b\x29\x07\x37\x6f\x7c\x6a\x49\xc7\x70\xad\xe3\x26\xaf\x90\x84\x98\x42\xcc\x43\xa8\x5c\x1e\x11\x59\x55\x4f\x60\x5f\x49\x79\x70\xe5\x48\xe9\x22\x07\x9d\x28\x86\x1b\x79\x21\xba\x75\x44\x34\xd3\x8d\x88\xb7\x91\x27\x1f\x9a\xf3\xf6\x84\xea\x9b\x5a\x95\xa0\xf2\xf5\xee\xa8\x77\x3e\xae\xba\x0d\x53\xc1\xfa\x05\xe4\x2a\x2d\xfb\x56\x77\xec\x21\x82\x56\x7c\x14\x57\xc4\x75\xd7\x27\x5a\xfe\x6b\x82\x6b\x22\x89\xef\x4b\x01\x23\xba\x8b\xbe\xd0\x72\x2c\x06\xd2\x21\xc8\xe6\x3e\x76\x7d\xc6\xab\x03\xab\x73\xed\x9b\x00\x92\x9f\x58\x0b\xad\xef\xe8\x68\x56\xd8\xcd\x75\x45\x5e\x8c\x8c\xd3\xd9\xd3\x16\x7e\xc4\xc5\x55\x21\x8c\xf9\x5b\x47\x0b\xe9\x41\xfb\x4d\xa2\x86\x0f\x30\x19\x14\x01\xbc\x4e\x67\xcc\xa5\x34\xaf\xb7\x9b\x38\xe5\x26\xa9\xdd\xa8\x9d\x87\x0a\x8d\x75\x45\xbb\xbc\x94\x05\x00\x1b\x73\x67\xac\xc0\x13\x88\x55\x01\x64\x5d\x41\xf4\x92\x54\x86\x3b\x65\x0b\x04\x6b\xac\x34\x2e\x85\xba\xf3\x6e\x7c\xab\xbb\x81\x7c\x47\x1e\xaa\x2e\x55\x5d\xfb\x89\xac\x4b\x6a\x45\x18\xbc\xb7\xae\xb8\x49\xc6\xc2\xa9\xbb\x21\xfa\x10\x69\x4f\x98\xcf\x7b\xd1\x7a\xdd\x11\xb3\x1a\xa8\x14\x02\x15\xba\xda\x13\xb8\x79\xb9\x45\x2f\xb7\x3a\x23\xaa\x9c\x71\xed\x18\x2d\x44\x36\x92\xb9\xf8\xe8\x03\xe2\x62\x29\x3e\xac\x9a\xb3\x4d\x66\x4c\x44\xae\x3d\xc1\xbf\xe2\x2d\xae\x79\x7b\xa5\x9b\xb7\x75\x6c\x03\xef\x81\x29\xaa\x19\x1e\xe8\x92\x39\x5d\x98\xc6\x78\x92\x66\xe5\xb5\xdb\xf6\x67\x5c\xee\x89\xea\xc0\x1c\xa7\x40\xee\xea\x6d\xd8\x44\x38\xf4\xa9\xdf\x91\xc3\x3c\x91\x74\xee\xce\x95\xa0\x9c\xeb\x75\x9c\x9b\x8d\xd3\x8f\x62\xcd\xb5\x9e\xd0\x9e\x8b\xd8\xf7\x81\x44\xb4\x00\xd2\x72\x7a\x78\xbf\xb0\x47\x80\x17\x00\xa5\x03\xc2\x83\x9e\x14\xe6\x08\xf3\x6e\x56\x8b\x7a\x4e\x9f\xea\x13\x05\x61\x52\x04\xb8\x5c\x37\xc7\x48\x83\xbb\xe6\x60\x29\x13\x96\x8c\x16\x9e\xdc\x02\xba\x59\x88\x81\x31\x19\x8e\x05\x71\x8b\x44\x06\xff\x00\x87\xc0\x1a\x73\x07\x81\xfe\xbc\xb2\xc9\x54\x1e\xa9\xeb\x92\x38\x14\xce\xde\x15\x38\x16\xc8\x51\xa9\x23\x96\x71\x21\x78\x45\xb6\x09\x9a\x1f\xc0\xcd\x6c\xd9\x59\x49\xe5\x84\x4d\xa1\xe2\x72\xe6\x4e\x2e\x96\x30\xeb\x8e\xac\x92\x82\x89\xa8\xc5\x69\x2b\x72\xc4\x8e\xdd\x70\x66\xf6\x44\x05\x8d\x89\x03\xda\x92\xa1\xf5\x13\x60\xad\xe0\x4a\xd0\xa4\xc0\xac\x23\xda\xd7\x34\x04\xd2\x65\xb7\x0b\x05\x75\xe5\x3b\xfa\x1b\xe0\x02\x9f\xb8\x2f\xfc\x6c\x17\x9b\xa0\x5c\x52\x69\x51\x42\x2a\x2a\x66\x44\x24\x23\xc3\x5e\xe2\x12\xf4\x92\xab\xe1\xf3\x90\xb5\x12\xe0\x6e\x03\x35\x7b\x62\xd4\x14\x23\x05\x2b\xe6\x5c\x5c\x08\x7b\x9c\x94\x9a\xf1\xe6\xad\xad\x10\x5c\x50\x38\xdc\x5e\xcf\x75\xb5\x29\x40\x3e\x50\xb9\xca\xb4\xf9\x89\x7e\xae\x1d\x6a\xf6\x34\x1d\x8c\xe8\x46\x0e\xd4\xb6\xf0\xc6\xee\x6d\xaa\xba\xbc\x16\xa0\x4d\x4d\x01\x6d\xb1\xb7\x76\xca\x55\x03\x71\xf9\x89\x71\x29\x0b\xb0\x2a\x8b\x3d\x6a\x0c\xb3\xaf\xa3\xe8\x8b\xdf\x99\x5a\x6c\x8f\x70\xed\xd8\x01\xd3\xbd\x67\xa6\x4f\x19\x89\x1c\x00\x8c\xcc\x9f\x60\xfb\x7a\x65\xdd\x51\xaa\xc2\x70\xe4\x4a\xad\x16\xd6\x7c\x10\x70\xe5\xdb\xcc\x06\xab\x86\x49\x65\xe5\xca\xa5\x3c\x4f\x84\x8f\x69\xf8\x03\x5d\xeb\x14\xb7\x8b\x15\x82\x66\x6a\xa4\x20\xaa\xed\x88\x19\x21\x2c\x46\x29\x88\xc5\xaa\x99\x82\xba\xb6\xd3\x4b\x03\x2d\xc0\x0a\xad\xbe\x9f\xe0\x5f\x7b\x93\x56\x01\x87\x06\x03\x0b\x1f\x6c\x98\xb3\xe8\x71\xb6\xbe\x58\x8c\x41\x35\xab\x0f\xbd\xd1\xcc\xa1\x9b\x3a\xdb\x39\x93\xb6\x4f\x54\x13\x3d\x5f\x00\x53\xe1\x6d\x3a\xb8\xd8\x87\xd4\x31\x02\xb3\xb6\x11\x6d\x27\x8a\xea\xa9\x15\x37\xd7\xe5\x2f\x2e\x64\xb6\x4b\x35\x46\x9f\x98\xec\xc0\x13\xcc\xea\xba\xb9\x3e\x38\xbc\x8f\x61\x02\x46\x41\xae\xa4\x8b\xf4\x5c\x9c\xa5\x70\x8b\xac\x2d\xeb\x70\x24\x74\x0f\x58\xdb\xee\x89\x31\x3a\x27\x36\xc6\x1a\x0b\x7d\x2a\x4d\xef\x21\xbb\x2a\xaa\x62\x20\x64\x27\x68\x1d\xd4\x1e\x45\xe8\x7d\x8f\x9c\xcf\xec\xce\x7d\xb9\x03\x3c\xc1\x39\x0a\xe3\x95\xb8\x13\x08\x97\x21\x3e\x9c\x1d\xec\x36\x0e\x79\xa9\x42\xc3\x1a\x2c\xa7\x83\xc2\x65\xe6\x62\x11\x4e\x22\xf5\x99\xcf\x47\x86\x05\x5e\xa7\xcc\xc1\xe3\xd1\x53\x5c\x0d\x2b\x87\x2e\xab\x9d\x5f\x80\x21\x0b\x81\xab\x4e\xcd\x72\xe6\x01\x0c\x4a\xa0\x49\x94\xa7\x7f\x84\x11\xef\x27\xf4\xdb\x5c\xb7\x39\xf3\x70\x12\x6e\x95\x51\x62\xc3\x33\xd3\x86\x3c\x97\xab\x5a\x25\x07\xa5\x2b\x2f\x20\xc4\xc4\xa4\x7e\xa6\xb7\x6d\x4e\x75\xa0\x2b\x49\x55\x7a\x6d\xc0\x87\x23\xdf\x84\x70\xce\xea\x79\x8a\x78\xab\x7b\xc0\xa9\xda\xa6\xb4\xd8\x43\x12\x61\x64\xf6\x4f\xd4\xf1\x36\x15\xa4\x4e\x07\xcc\x44\x09\xb3\x32\xac\xbd\x92\xd6\xfa\x50\xe8\xde\x9c\xfa\xd2\x99\x40\xdd\x7b\x62\x76\x77\x34\x2c\x73\x81\x27\x5a\x4f\x32\x63\xf9\x88\xdb\x87\x7c\x75\xcd\xb8\x05\x95\x37\x05\x69\xa9\xd8\x31\x55\xa0\xbb\x28\xb7\x19\xbf\x10\x6a\x7c\x15\x51\x6f\x0e\xd2\x6f\x10\x9c\xfd\x9b\x18\xd2\x07\x08\x8f\x3b\x99\xcb\x58\x0d\x0f\x8d\x77\x38\x47\x5f\x1c\xc7\xfb\x34\x14\x78\x23\x81\x16\x75\xc5\x16\xa4\x1e\x83\x73\xb8\x4a\x0d\x07\x0d\x4f\xc8\x15\x42\x3f\x2e\x77\xb0\x78\x78\x7b\x5b\x13\xea\x09\xef\x73\x25\xc6\xfa\x69\xf9\x6e\x6c\x30\xd9\x97\xdf\x52\xb8\x03\x63\x06\x96\x27\xeb\x89\x6e\x80\xdb\xda\x70\x8d\x95\x36\x45\x29\x43\x9f\x57\x6b\xe3\x6e\x60\xaa\x5b\x6d\x09\xa4\xeb\xb3\x5b\xc2\x09\x34\xa4\xf7\x89\xac\x4e\xfe\x89\x5e\x15\x2d\xa8\x16\x48\xef\x04\x24\xd1\x2d\xac\xc8\x10\x1c\xa7\xac\x17\x2b\x0b\xd7\x74\x8a\x6a\x8c\x5c\xa7\x70\x79\x9c\x2e\x14\xf5\xcc\x9c\x2e\x3d\xee\x65\xf9\x08\xe9\xb2\x25\x92\xdc\x2c\x5f\xed\xd2\x60\xf5\x08\x8c\x32\x8a\x8b\x73\x0b\x53\x8e\xbb\x16\x04\x1b\x22\x95\x97\x27\x7a\x98\x6e\x64\x0e\x29\x30\x16\x33\xf4\xae\x8a\x65\x18\xb0\xab\xc9\x8c\x2a\x42\x8a\xf7\x72\x58\xa6\x2f\x0f\x30\xc0\x87\xb9\xce\x39\xc7\x13\x45\x50\xea\xa2\x65\xc1\x87\x40\xfa\x2d\x1a\x9c\x1c\xdf\x3d\x29\xa3\x94\x3d\xda\xdc\x32\xf1\x5d\x40\x55\xe2\xa0\x4d\x70\x20\xe5\x71\xd2\x27\x48\x41\x8a\x52\xbb\x84\x27\x5d\x5e\xc2\x4c\xb8\xae\x7c\xe7\x3a\x33\xcc\x79\xfb\x52\xa0\xad\xa5\xcf\x66\x74\x9b\xe6\x74\x42\xb1\x21\x42\x79\x82\x82\x3a\xae\x7e\x6e\xe0\x5b\xba\x52\xec\x0a\x66\x84\xbd\xe7\x28\x48\xa4\x7a\xc5\x20\x45\x82\x85\x98\x92\x45\xa6\x79\xc1\x6b\xde\x8d\x3e\x91\x90\xec\xb9\x60\xeb\xd8\x9a\xc1\x4f\xbf\x9d\x9d\x69\x5f\xa6\x18\xc1\x69\x2f\xab\xf9\x8a\x73\xc0\x96\xe5\x1c\xec\x69\x1c\xd5\x74\x3d\xd1\x54\x4d\x99\x54\xd9\xbd\xf0\x9b\x19\xde\x89\xd4\x12\x25\xb5\x15\x76\x26\x8f\x10\x26\x2a\x74\x10\x5a\x23\x0f\x7c\x17\xad\x44\xf7\xf6\x2e\x4f\x48\x00\xa5\x86\x2b\x8f\xa0\x00\xa0\xc7\x70\x21\x72\xe2\x50\xb6\x7c\x1a\xad\xe4\x85\x28\x59\xa7\x5e\xfe\x2c\xa6\xf0\x88\xce\xe2\xe5\x09\x9e\x90\x7a\xc5\x00\xf7\x22\x90\x95\x69\xd1\xe8\x99\x47\x9d\xcf\x62\x03\x3a\xef\x2b\x0e\x60\x88\x2c\x8b\x0e\x3b\x38\x4a\x36\x4e\x9f\x7b\x79\x22\x45\x64\x8e\x9d\x50\x8d\xdb\xf0\xc9\x88\xd0\xd2\x8c\xec\xd6\x56\xee\x05\xf4\x70\xdc\xa8\xf2\xc3\x24\xe4\xd7\x36\xde\xf6\x51\xca\x05\xcb\x23\xd2\x50\xd7\x05\x33\x64\xd0\xe2\xfd\x7d\x80\x4b\xa3\x78\x5b\xd7\xb2\x71\xad\x8b\x12\xf6\x39\xb8\x58\xcd\xe6\x17\x16\x48\xd7\x5e\x8f\x5d\x9e\x80\xd7\x60\xfe\x6a\xab\x10\xaf\xce\x1c\x1a\x5d\x97\x94\xec\x9a\xad\x31\x2e\x37\x20\x3a\xed\xcb\x73\x97\x3c\xeb\x40\x86\x52\xbc\xd2\x81\x3e\x71\x5f\x54\xdf\x08\xf1\x2b\x4e\x64\x2c\x68\x9b\x4d\xc9\x2e\x61\x37\x62\xb9\x53\xd8\xc5\xd5\xa0\xa8\x11\x93\x09\x97\xef\xdc\xc6\x85\xca\x03\x82\x33\x6a\x49\x91\x00\xb4\x8c\x64\xf7\x8e\x6f\x8c\x5e\x80\x4b\x8b\x03\x4a\x80\xbd\x2e\x57\x50\xbc\x71\xbd\xdc\x59\x7c\x5e\xc9\x01\xbb\xe8\x03\x9d\x11\x2c\x31\x37\xa9\xd5\xf2\x05\x20\x05\x06\xb1\x9e\x07\x83\x11\x1d\x19\x5e\x1e\x81\xcd\xc5\x9a\xcd\xcf\x8a\x14\xbb\x4f\x72\xaa\xdb\xad\x27\x84\x88\x51\xd0\xa4\xc1\x0b\xd9\x4b\x56\x1e\x2a\x18\xbb\x08\x69\xb6\xbd\xe8\x59\x6e\xcb\x27\xb9\x75\x66\x23\xf0\x36\xe8\xc9\xca\x45\x19\x7b\x62\x9a\x41\x82\xf5\x16\x2c\xf2\xa1\xd8\x0d\xd2\x1c\xbe\x72\x59\x6e\x59\xcf\xb0\x4a\x68\xac\x36\xd7\x2a\x30\x97\xb0\x46\x88\xa2\xfb\x89\xf8\x13\xfb\x62\xf3\xc0\xe7\x38\x75\x4a\x38\x45\x2d\x34\x28\xe1\x98\x7e\x11\x7f\x9d\x85\xae\xe8\x8b\x1b\xf6\xd8\xc9\xb9\xa1\xa5\x6c\x71\x7b\xf0\x44\xde\x09\x8f\x9e\xfa\x8d\x39\x3f\xc3\x76\xac\x18\x21\x4e\x38\x66\xf0\x57\x91\xa7\x9b\x1d\x8f\xec\x29\x5f\x4a\x74\x71\x9e\x2f\xfc\xe9\xe9\x13\xfd\x9f\x96\x2d\xe9\xf3\x36\xed\x88\x87\x09\x73\xec\x1b\x52\x7f\x5f\xb0\x70\x63\xb0\xbb\x81\x65\x19\x0c\xb1\x31\xbe\x16\x00\x2a\xc7\x05\x1e\xa0\x26\x29\xc8\xb1\x19\x74\xc5\x5a\xce\x79\xe1\xd3\x4f\x93\x6f\x70\xd8\x99\x0e\xab\xe9\x95\x33\x61\x5a\x81\xe5\x6e\x31\xd0\x95\xef\xe3\xb8\xe0\x13\x63\x74\x64\x2a\x75\xa8\x2c\x75\x83\x45\xd6\x86\xf8\xd9\xc9\x9e\xc2\x9b\x54\xcf\x1b\x7b\x70\xc6\x36\xe0\x9a\x11\x62\x93\x71\x51\xd5\xe4\x27\x84\xcb\x6c\x40\x4a\xa8\x9a\x1d\x31\xbe\x5b\x3f\xeb\xf0\x24\x44\xd2\x84\x99\x3a\xb7\xd0\xdc\x72\x09\xc2\xd3\x49\x28\xb2\x39\x64\x99\x4f\xcc\xd6\xa6\xbd\x6d\xca\xc6\xb9\x20\x3b\x66\x0e\xc4\x25\x76\x37\x0f\x45\x95\x2a\x09\xae\x23\xa9\x88\x84\x7c\xc5\x80\x09\x57\x99\x20\xdc\xe9\x23\x82\xf6\xa2\x2f\x8d\x91\xc2\x0a\x79\x11\xf1\x2c\xfc\x9e\x91\x24\x7f\xc8\x70\xd6\x10\x32\x38\xdb\x5c\x3d\x20\x36\x51\x4e\x5d\x95\x55\x9f\x28\xa8\x24\xac\xa2\x8b\xb1\xd7\x69\x99\x9d\xcd\x52\x8d\x2b\x45\xd1\x45\x73\x00\x82\xe1\x59\xca\xb2\xfd\xf2\x5b\xe6\x4a\xda\x39\x53\x7b\xe2\x8c\x30\x37\xfd\xb4\x85\x43\xcb\x43\x0b\x5c\xaf\x54\xd5\xd8\x98\x24\x26\x68\xa8\xc3\xdf\x32\xd1\xc1\xf8\x96\x2c\xa0\xa8\x51\xb9\xae\x47\x26\x3b\x10\xa5\x78\x1f\x99\xd1\x6d\x91\xab\xb7\x1b\x74\x68\x1f\x8f\x39\x11\xe0\x27\x06\x87\xb5\x19\xae\x5b\xa9\xe5\x4e\x4f\x80\xd6\xf9\x25\xa2\xcc\x5f\x27\x3c\xfe\x4d\x3a\xaf\x07\x08\x0f\x29\x2c\xba\x66\x5e\x85\xdc\xf9\x08\xa1\x94\x06\xea\xbe\xbc\x51\x56\xc8\xae\x7c\x96\x6d\x19\xdf\x2e\xda\xb1\xf6\x44\x45\x62\x9f\xe8\x12\x61\xb4\x01\x38\xf3\x95\x54\xe3\x2c\xc7\x2b\x6e\x52\xdd\x99\x5a\x4b\x89\xa4\x9c\xc1\xac\xe9\xb8\x39\x9e\x5d\xcc\xa3\x9c\x9b\xcb\x5d\x9e\xe0\xac\xc6\x75\x47\x50\xe9\x9d\x35\x38\xc5\x59\x96\x3a\x88\xf2\x7a\x1f\xb1\x4b\xc9\x61\xeb\x73\xab\x06\xa7\x89\x64\xca\xfb\x98\xf7\x9d\x9f\x18\x9b\x4f\x0f\xaa\x57\x02\x9a\xb6\x0b\x46\x93\x37\x49\x89\xc2\xeb\x0a\x83\x36\x3b\xd6\x19\x2f\xe7\x7a\x55\x68\xa5\xc5\x48\xbb\x0e\x4c\x58\x79\xa2\x02\x83\x86\xf4\xae\x2f\xd4\x49\x44\x21\xba\xc2\x58\xd9\xf8\x3c\xb9\x98\x08\xdc\xb7\x6d\x1b\xf6\x0c\x7c\xa5\x98\x09\xb4\xa1\x4a\xc0\x3d\xc1\x2e\x67\x1f\x86\xbe\x75\xbd\x54\x07\xc9\x98\x8e\xad\x5a\x69\x06\xc8\x6a\x10\x11\x5c\xb1\x36\xb3\x29\x39\x28\xee\xce\xf2\x63\xa4\xfc\x88\xe6\x86\xf6\x7d\x37\x37\x78\x5b\x92\x4f\x46\x4f\x0d\x78\xa0\x10\x05\xc5\xcf\x7a\x42\x6e\x79\xa7\x1b\xd3\x6d\x7d\xb0\x71\xc8\x50\x1c\x78\x42\xd5\x60\x05\x86\x59\x69\xc5\xa4\x43\xe9\x82\x92\x5e\x8b\xac\xa2\x02\xe1\x9b\x39\x9b\xfd\x52\xbc\x23\x2a\xa2\x99\xca\xb8\x9d\xe5\xf1\x84\xb6\x82\xa9\xba\x61\xed\x23\xcc\x04\xea\xc9\xd8\x1c\xa2\x77\x26\x47\x23\x23\xc6\x54\x40\x86\x3a\x16\xb7\xce\x62\x99\x63\xa5\x38\x8d\xc0\x13\xe9\x32\x29\x91\xd1\xda\x2f\xe0\x67\x3a\x6f\xa6\x01\x82\x89\x5f\xb7\xa2\x49\xd9\x7a\x0d\x9b\xd6\xe9\xc9\x9d\x38\xb7\x45\x5c\xc3\x5c\xa4\x3e\x30\x4f\x9a\x55\x5b\x29\x30\xc5\x88\x2a\xd8\xec\x10\x55\x9a\xd8\x56\xe8\x30\x00\x1f\x38\xc9\xe3\xba\x1a\xb3\x5c\xa3\x60\x10\x4c\x8c\x6c\xfd\x44\xcf\x23\x2d\x8b\x41\xbc\x4f\x7d\x77\x51\x9c\x3f\x83\x74\x4e\xea\xd9\x76\x6e\x08\x73\x09\xce\xc0\x69\x9e\xbe\x5c\xaa\x25\xb8\xa8\x6d\xf6\x09\x1d\x3e\x95\x9c\x13\xdd\x39\xe9\x96\xf7\x54\x0e\x2c\x24\x8d\xf1\x46\x86\xde\xfa\x44\x8d\x29\x6f\x55\x5f\x34\x64\xd1\xa5\xdd\x3a\x0a\xfa\x88\x2e\x2d\x45\x11\x71\xd2\xab\x1b\x9e\xb0\xe6\x42\xc0\x92\x78\xef\xc7\x46\x91\x84\xab\xb4\xfb\x24\xfd\x4c\x0d\x2b\x27\x42\xeb\xc1\x8b\x47\x7a\x1e\x21\x8d\x1e\x07\x1f\xfc\xf4\x0e\x37\x6c\x95\x8e\x5e\x53\x25\x86\xeb\x2c\xbb\x2b\xdb\x91\x99\x66\x0a\xc1\x41\x11\x28\x58\xc6\x67\x26\xbf\x67\xe4\x67\xb6\xc7\xb1\x72\x8d\xa4\xf5\xe2\x3a\xd7\x69\x40\xd7\x4f\x78\x97\x99\xee\x7d\x9f\xc1\x51\x36\x6f\xc3\xcd\x9d\xa1\x0f\x4f\x74\x6a\x9f\x45\xa4\x8a\x2f\x7e\xee\xab\xe9\xce\x55\x08\x1e\x79\xa6\xee\x21\x67\xf0\x45\x4d\xdd\x32\xe2\x75\x9c\xd5\x61\x4c\xb0\x2a\x8e\x3e\x01\x6c\xa7\x70\x30\x18\xe0\xee\xe4\xf6\x38\x00\x96\xc8\x34\x8a\xe3\x29\xb1\x37\x97\xde\x37\xf4\x0c\x55\x0b\xcc\x4e\x94\x4a\x44\xc4\xf1\x04\xbc\x66\x98\x23\x28\x1c\xf3\xd8\x92\xb3\xc2\x4a\x98\xae\x93\xb2\x76\x6b\xe8\xb3\x1c\xb8\x7b\x97\xd2\x91\xe6\x75\x32\x43\x44\x1b\x51\x3d\x43\xd3\xc6\x05\x9c\xf6\x4e\x8a\x10\x75\xbb\x38\xdc\x07\x2d\xd0\x8a\x43\x22\xaa\x45\x2a\xb5\x97\x3e\xce\x1b\x73\xc5\x99\xf1\x74\xf4\xfa\xc4\xbe\xa8\xcd\xc8\x1e\x18\x1d\x06\x40\xcc\xaf\x08\x5b\x6b\x9d\x38\x32\xfb\xe1\xcf\xd1\x88\x90\x06\xa7\xe6\xea\xe9\x11\xa1\xbc\xd5\xf2\xc4\x9c\x71\x86\x62\x48\x3d\xb6\x53\x00\xa0\x55\x51\xcd\x99\x01\x23\x70\x29\xce\xd3\x5c\xf6\x9c\x72\xd5\x88\xf3\xaf\xc2\x1c\x0c\xfe\xbf\xb4\xbd\x49\x0b\x78\xdf\x96\x1d\x14\x14\xcc\x07\x70\x12\x10\x44\xb1\x88\x8e\x4f\x77\x63\x03\x19\x88\xa0\xa2\x22\x42\xc4\x80\x28\xa7\x6f\xef\xe9\x7b\x42\x61\xb0\x21\x88\xa1\xa8\x0c\x0c\x44\x30\x9a\x41\xc4\x40\x88\x82\x04\xe3\x44\x08\x8a\x82\x03\x11\xcd\xc4\x99\x13\x21\x42\x06\x62\x44\x07\x5a\xc8\xef\xfd\x7d\xf8\xa0\x0a\x1e\x98\xff\xfd\x06\x97\x73\xf7\xd9\x67\xef\xb5\xd7\x5e\xab\x5c\x86\xda\x17\x5f\x31\xc5\xca\xfd\x11\x1d\xbf\xfa\xe1\x32\xf2\x67\x38\xe8\xdf\xbb\xc9\x0c\x02\xe1\xbd\x29\xbd\xe3\x60\xaa\x69\xe0\x00\x41\x5c\xca\x17\xa3\x0c\x86\xef\x73\x31\xe6\x39\x23\x19\xc5\x50\xde\x63\xa3\x9e\xa1\x4f\x81\x6a\x83\x61\xc6\xf6\xb6\x08\xed\x3d\x18\x2d\x3c\x8b\xe2\xdb\x3f\xd9\xe7\x02\xb9\xa2\xe1\x5d\xb2\xa7\xfb\x34\x1f\x21\x92\x6f\x05\xc9\xae\x9b\xe4\x5d\x3d\x78\x35\xcd\x1e\xc7\xae\xe0\x14\x0c\x3c\xf9\xf9\xc2\xde\x0d\x1a\x07\x29\x43\x4a\x9b\x26\x9d\xc2\xee\x3c\x20\x40\x0e\x91\xa8\xcb\x4c\xd1\x52\x9d\xb4\xbd\x28\x07\xfd\x3a\xb0\x29\x5b\xfb\x93\x9d\x47\xd6\x51\x26\xfb\xca\x4d\x90\x38\x9a\xd9\xbd\xf0\x73\x6e\xeb\x6f\x1a\xe3\x49\x43\xdd\x37\x98\x79\x16\x05\x0f\x16\x55\xbf\xf8\x85\x5f\xdc\xd4\xb7\xb1\xa3\xde\x3c\x82\xcf\x63\x3f\x4f\x97\x60\xd4\x52\x01\xcf\x9a\xc8\x4e\x27\x2f\xa9\x56\x5e\xfc\xa6\xe3\xd4\x34\xc3\x03\xfa\x17\x5f\x21\xdc\x2e\xa2\xd1\x31\x95\x7a\x96\xf3\xb4\xa7\x15\xe9\x6e\x2d\x2c\x44\x4f\x7a\x3a\x7f\x64\x93\xe2\x85\xe3\xa9\xa6\xdd\xc9\xc2\x27\x37\x95\x93\x62\x23\x26\x3e\x49\x8d\xf6\x1e\xab\xf7\xb9\xab\x30\xa9\x63\xf1\x64\x88\x5a\x0c\x00\xf2\xe7\x49\xe6\x06\x15\x3a\xf4\xd5\x7d\xc1\x9a\x64\xdb\xbb\xa7\xa3\x94\x1f\xb0\x80\x8d\xe9\xf5\x2e\x1d\xc5\xbb\x8a\xb7\x32\x89\x74\x24\x6f\x0e\x2a\xc8\x12\xe3\x63\xed\x6b\xf9\x27\x9c\x1b\x15\xca\x0b\x5d\x8d\xc1\xa6\x90\x06\x83\x8f\x91\x33\x5b\xf2\xda\x14\x5b\xe4\xcd\x59\xc9\x3c\x91\x11\x9a\xfe\x12\x25\xe0\xd5\x41\xfc\x2e\xc0\xe3\xd7\x6d\xab\x7d\x00\x78\x10\x2a\xdd\x66\xf7\x80\x88\xd4\x7d\x8f\x25\x51\x0b\xcd\x85\x4c\xf0\x79\x1f\x5a\x71\x5b\x03\xed\x36\x44\x51\x46\x1c\x5a\x77\xfc\x42\x12\x9c\x2a\x7e\xc4\x55\x87\xb0\x9d\x31\x7b\x0d\x2c\x5c\x02\x4e\xdf\xc7\x02\xcb\x2c\x61\xa8\x0a\xb0\x97\xde\x87\x26\x3c\x13\x1d\x83\xf2\x2f\xc8\x9e\x76\xad\xb0\x3d\x5b\xd1\x9b\xd8\xab\xd9\xfd\xa2\xb4\xea\x30\x77\xb7\xaa\x7c\xc6\x6a\x86\x11\xf7\x0c\xb6\x29\xdf\xdb\x4e\xb2\x7d\x31\x07\x4a\x43\x25\x44\xa9\x94\x5d\x44\x7b\x66\x3b\xf4\xbd\xc0\xdc\x8a\x79\x8c\xd5\x3e\x83\xb5\x9b\x0f\x13\x18\x52\x1d\xfa\xc9\x8c\x9c\x4f\x64\x31\x62\xc9\x96\xbe\x6d\x75\xcd\x69\xf2\x68\xbf\xc6\x9f\xd9\x33\xb5\xc5\x3f\x0b\x4e\xb7\x59\x85\x7c\x73\x34\x70\x51\xed\xa1\xb0\x7d\x41\xb3\x7c\x73\x77\xa2\x4b\x22\x51\x7e\xa2\xc1\xac\xdd\x9a\x32\x06\xf1\x80\xe2\xd5\x2b\xb0\x10\xac\x5f\x4d\x3d\x65\x40\x6b\x39\x83\xbe\x5f\xcc\x3e\xa2\xe2\x71\x46\x64\x3c\xbb\xbb\x68\x35\x15\xdf\xa4\xef\xbe\x5b\x8e\x30\x3f\xb5\x96\x36\xfb\x26\x4c\x61\x54\x25\xb6\x0b\xac\xfb\xc5\x23\xcc\xd0\x64\x8a\xad\x79\x0a\x95\xa0\x6f\xef\x12\xbf\xd7\x97\xe2\x60\x85\x97\xa6\x87\xb7\xa0\xd7\xd9\xc6\x5e\x5c\xe0\x08\x07\x7d\x31\xfb\xa0\xd1\x0d\x60\x14\xc3\x20\xf4\x9c\xa0\x17\xe4\x3d\x28\x23\xca\x41\x0e\x85\x43\x46\xd2\x30\xee\x89\x4a\x28\xd5\x5a\xce\xef\x0e\xf7\x8b\x7c\x11\xf2\x00\xb5\xc3\xf6\x84\x92\x16\xe5\xe9\xbd\x97\x31\x61\x78\x6b\xe0\x71\x14\xbb\x5e\xc2\x50\x88\xba\x57\x48\xae\x9e\x1c\x2d\xfb\x80\x7e\xcb\xd8\x90\x51\x55\xf8\x64\xcf\x40\xd0\x77\xeb\xe8\xeb\x8b\x2f\x34\xb7\x2d\xcd\x37\x34\xda\x68\x96\xb3\x24\x85\x32\xb0\x6b\x3a\xe2\x0b\x3e\x81\xc2\x42\x2c\x01\xad\x8f\x36\x87\x13\xbb\x13\xce\x53\x49\x10\x18\x2b\x74\x02\x80\x33\xd4\x5e\xd9\x16\x2c\xcf\x90\x58\x2a\xd9\xbf\x98\xcc\xbd\x95\x60\x72\xa9\x1f\x16\x48\x8a\x29\x39\x8c\x0d\x0b\x9c\x81\x93\x17\xa0\x68\x7d\xfd\xd6\x3a\xf4\x8a\xf2\xa5\xdb\xc0\x22\xe9\x17\xe0\x0f\x5f\xa8\xa0\x79\x52\x27\xb9\x06\xf1\x26\x5c\x72\xd0\x4f\xf2\x30\xf7\x60\x04\x7c\xaf\xe2\xf5\x52\x1e\xf8\xa8\x60\xf5\x56\xe1\xfd\x82\x73\xa3\xa2\x95\x0a\xf4\x1d\x9a\xf2\xb5\x4c\x0d\x80\xa0\x1d\xd3\xd0\xc8\xb3\xfa\x36\x52\x97\x6c\x18\x00\xfa\x9a\xd4\x44\x48\x92\x7c\x21\xc2\xc0\x16\xd4\xd6\x4d\x5c\x33\x36\x70\xf1\x75\x6e\xf0\x44\xed\xf7\xf1\x8a\x6e\xc2\x1f\xa0\x22\x94\x87\x8b\x5b\xd2\x7c\x0c\xa5\x5c\x7e\x02\x78\xcc\x94\x9a\xc5\xcf\xb4\xb6\x5a\xcf\x61\x20\x4f\x37\xc7\xa0\x28\x20\x4d\x61\x18\xb5\x9a\x67\xa7\xe2\xf8\x6a\x16\xdf\x17\x36\x03\xbf\xb0\xba\x5b\x5d\xa1\xa5\xe6\x52\xd3\x3e\x1d\xc3\xdb\xf4\xcb\x79\xeb\xcf\xa1\x5d\x0c\xef\xa8\xee\x2f\x56\x2d\x3d\xf6\x2c\xa1\x07\xf3\xf4\x0b\xa7\x08\x66\xe0\xea\xb5\xea\xfc\x5c\xbb\x04\x31\x8b\x4d\x62\x4f\x74\x8e\xbd\xf2\x32\x13\x6e\x34\x77\xf9\xa7\x8a\x7e\x99\x30\x0c\x88\xc2\x3f\xf9\x8a\x0b\x02\xdf\x92\xf6\x87\x9a\x1b\xf1\x53\xd5\x79\xcf\x59\xe2\x45\x35\x69\x1d\x82\xed\xcd\xe7\xc3\x20\xc8\xb9\x86\x99\xde\x1b\xbe\x80\x26\x1b\x02\x47\xf2\xe7\xb4\x5f\x88\xc1\x46\xa7\x7c\xf3\xad\x8f\xd6\xd0\x6e\x48\xdb\x17\x05\xfc\xcc\xd2\xee\x29\x5d\xa0\x0c\x21\x3d\x5f\xf0\xd2\x02\x4c\x4b\x3c\xbb\xae\x2d\xa3\x2d\x00\xef\xb4\xb2\x5d\xd5\x14\x91\xaa\x71\x30\xce\x5a\xdc\x63\x5a\x7c\xc1\x30\x9a\xad\xc2\x3e\x61\x16\xf3\x9d\x1f\xc4\x18\x31\x9a\x4d\x19\x00\x20\x3d\x16\xd4\xea\x31\x22\x44\x23\xe7\xa5\x78\x9a\x83\x45\x4c\xea\x16\xd9\x29\xb3\x9f\xf0\x09\xb8\xd6\x19\x67\x69\x19\x86\x1d\xeb\xa0\x52\xeb\xfa\x02\xf2\x5e\x6d\x9f\x5e\x8f\x0b\xc1\x64\x6b\x92\xb4\x16\x9c\x52\x76\x7b\xf9\x17\x59\xab\x5d\x86\x77\xde\xda\x19\x93\xf7\x80\x72\xed\x30\x06\x38\x56\x3c\x13\xe7\xc0\x84\x2d\xa5\xd4\xa0\xcd\xeb\x9b\x84\x29\x74\x01\xbe\x00\x48\x33\xac\xbd\x1c\x9e\x77\x72\xc8\xeb\x9c\x9f\x9d\x0b\xaf\x00\x32\x8b\xac\xf6\x67\x10\x1a\xb2\x99\x10\xb6\x27\x5d\x6f\x85\x70\xe2\x8b\xc6\xb6\xbd\xf3\x36\x55\x72\x27\x00\x63\x5f\x65\x95\x54\xde\xa5\x4c\xd6\x1c\x81\x3d\x16\xd2\x48\x31\xac\xf4\xe0\x02\x14\x36\xf9\xf3\x89\x58\x60\x70\xf8\x1d\x53\x46\x69\x54\xa3\xc0\x4d\xe7\xd5\xeb\x9a\xe7\x57\xef\xc1\x52\xf0\x85\x26\x5f\x01\xe5\xae\x42\xb4\xcf\xbd\xf3\x93\xfa\x62\x95\xc8\x2a\xe1\xbb\x2b\x4f\x12\xa9\x2b\xdb\xac\x2c\x54\x4e\x98\xd1\xec\xf2\xaa\x35\x7f\x5f\x9d\xfd\xe1\x8a\xbf\x18\x8f\x97\x7d\xe2\x0c\x1d\xa5\xed\xf8\x79\xc8\x6d\x6e\xbf\x29\x68\x87\x07\xdc\x4f\xa9\x0f\x74\x67\x1e\xd0\x35\x11\xaf\x44\x32\x8d\x57\x20\x68\xdd\x02\x5f\x70\xf4\xc8\x48\xfb\x8d\xd5\x46\x96\xd3\x52\xcb\xc7\xdc\xf1\xc1\x5c\x00\x02\xa8\x44\xaf\x5c\x12\x16\x58\x74\x22\xd5\x40\x9c\xa8\xcb\x9f\x2c\x5c\xe1\x84\xaa\x51\x91\xc7\x86\x0b\x20\x11\x13\x45\xa6\x6d\xd7\x71\x5d\xf8\xce\x04\xe3\x6e\x2e\xda\x1c\xc7\xa7\x4b\xed\x7c\xbc\xbf\xa2\x76\xfe\x4b\xc0\xe3\xd7\x69\xee\x7c\xa0\xa1\x1c\x31\x40\x75\x3d\x1c\x7a\x05\xc0\x02\x49\x16\xd6\xd2\x8d\x8e\x1f\x7b\x59\x01\xab\xeb\xb5\x3b\x74\x19\xd3\x5f\x38\x03\x5b\x0c\xbe\xd0\xf0\x40\x30\x52\xb0\xec\xf6\xd8\x82\x7d\x91\x0b\x3c\x3a\x0c\x89\x47\x2a\xd1\x98\xe7\x48\x4b\x51\x3f\x42\x87\x02\x3e\xc9\x5d\xdf\x3f\xa1\x9c\x5e\x98\xb7\xd7\x33\x51\xa0\xcb\xfd\xf1\x22\xbf\x83\x56\xc2\x43\xd0\x62\xbf\xa7\x2b\xce\x04\x44\x18\x61\xf4\x56\x83\x07\x80\xa0\x7c\x71\xb5\xbb\x4a\xb2\xe1\x31\xdd\xc0\x7c\x13\x38\x12\x91\x32\x85\xd8\xc3\x11\x0d\x0c\x42\xd3\x38\x2f\x6d\xe6\x0d\x2a\x49\x4c\x29\xdb\xee\x0b\x4f\x66\x4a\x90\xa0\x72\x9f\x16\x04\xcd\xfc\x05\xe9\x4d\x89\x31\x47\xd2\x2a\x76\x3b\x57\x85\xd7\x65\xd9\x8b\x2d\xb6\x72\xb5\xd7\x0a\xfb\x49\x03\x63\x4b\xd0\xa9\x57\xb7\x2f\x25\x91\xf3\xc5\xd7\xec\x23\x9c\xc0\x01\xab\x33\x5d\x56\x14\x61\xfc\xe1\x58\x66\xc1\xc1\x23\xb6\xfd\x02\x69\xc7\xe0\x5d\xb2\xa1\x6c\x30\xd6\xf7\x98\x9a\x4a\x20\x8a\xf5\xce\xf4\x44\x6d\xa8\xad\x16\xce\x8a\x12\x7e\x28\x8a\x76\xd9\x46\xf9\x17\x77\x44\x68\x73\xae\x0f\x26\xd9\x9e\x8f\xc4\x7d\xb2\x0b\xfa\xe6\x98\x88\x8a\xf5\x86\x6b\xdc\x8c\xd0\xfb\x92\x72\x25\x50\x15\xbf\xf1\x93\xfd\x41\xd2\x93\xb9\x48\x38\x9f\x1f\xd6\x46\x04\x0c\x30\x3a\x74\xd0\x3a\x35\x5a\x8d\x42\xae\xf3\xa5\xf0\x73\xb5\x7e\x25\x6d\x2f\x45\xe1\x0b\xa4\xbd\xc2\x84\x2e\x5f\x71\xad\x98\x9c\xaa\xbd\x49\xc7\x0a\x54\x62\xb7\x92\xb3\xb9\x48\xe7\x1e\x60\xd1\x5b\x8d\x0c\xa3\x03\x26\xb0\x2f\x48\x7d\x83\xd9\x66\x08\x4d\x15\xee\xe9\xf5\x93\xdf\x8c\x32\x14\x05\x27\xd1\xd3\x5d\xca\x5e\x87\x4a\x74\xb8\x81\x0d\x53\xf4\xa2\x8f\x4f\x94\x9c\xdf\xf2\x6a\x23\x82\x79\x41\x36\x86\x63\xe7\x03\xd1\x00\x86\xcd\x2d\xc2\xf0\xb0\x94\xbd\xae\x1c\x46\x28\x47\x89\x38\x56\x2e\xec\x17\xec\x38\x87\xc4\x56\x40\x8d\xfb\x02\x6b\x0e\x9b\xaf\x78\x1f\x3a\xb4\xa4\x9e\x60\x82\x27\x59\xb1\x4a\x80\xf1\x33\xaf\x25\x94\xa1\xb7\x7e\xe2\xdc\x38\x94\xc4\x7d\x98\x42\x9c\x54\x25\xb8\xfe\x78\x70\x93\xe2\x1a\xa1\x0d\x1b\x9c\x89\x45\x6f\x93\x25\xef\x99\x14\x37\xf2\xea\xfa\x85\x63\x38\xa5\xd3\x57\xdf\xc4\x51\x82\x5e\x20\xc4\xa9\x5c\x8f\xfa\x0c\x11\xf9\x1e\x1e\x8a\x85\x0a\xb7\xa5\xdf\x77\x9d\xe1\x46\x2c\xab\x9e\x4f\x78\x26\x50\x1b\x1e\xca\x95\x07\x15\x52\x3c\x7e\x2a\x26\x8d\xce\x07\x2c\x52\x13\xf1\x0b\x10\x56\x05\x79\xc0\xc3\xdf\x3a\x39\xb7\xe6\x13\xc8\x5a\x2d\x14\xcb\x95\x10\xcc\x93\x67\x37\x04\x85\xd7\x1f\x01\x44\x96\x0e\xb0\x5b\xcd\x7d\x37\xb6\xce\x98\xbe\x2d\x2d\xdd\x21\xd4\xbe\x88\x4e\x22\x54\x7c\x07\x49\x67\xf2\x9e\x96\xbc\xc5\x9d\x7a\x2e\x53\x81\x4e\xbc\x95\xe6\xee\x79\x36\x83\xef\x2b\xbb\xb1\xb8\xbe\x82\xf1\x2f\x5e\x76\xa1\xd3\xb9\x93\x6f\xbf\x46\x1f\x11\xf2\x4a\x70\x97\x5a\x27\x42\x46\x83\xe2\x29\x69\x94\xfd\xc8\xe1\x28\x25\x68\x7b\x4f\x4a\xf9\x82\x67\x42\x0b\x64\xa7\xd6\xb7\xeb\x55\x9a\x60\x83\x4b\x7d\x7c\x5a\x36\xe7\xdd\x96\xb2\xfd\x9d\x04\xa9\x0c\x51\xeb\x94\x0d\x08\x0f\xae\x9f\xa8\x9d\x73\xa5\xd4\x8b\xbc\x9d\x4c\x52\x2e\xc7\xf5\xe0\xbe\x61\xf8\x2c\x71\xe8\x00\x05\x16\x9c\x2e\xd6\xe7\xf1\x32\xbb\xc6\xac\xed\x0b\xab\x3b\xda\xd3\xb3\x9d\xbd\x25\x76\xcd\xa9\x30\x10\xcf\x30\x16\x08\x8a\x58\x2b\xf3\x10\x56\xc2\x32\xe7\x0d\x34\x3e\x4d\x78\x9e\xd0\x69\x9f\x2c\x19\x49\x6b\x4b\x99\x4f\x00\xad\x6f\x9c\x66\x38\xd4\x37\x58\x09\x04\x69\x3e\xee\x02\xaf\xdc\xe9\x12\x29\x05\x71\xf2\xb8\xbb\xf9\x85\x83\x08\xf3\x86\x10\xe0\x6b\xbb\xef\x83\x79\xb0\xda\xb8\xb5\x4a\xb5\x2f\x5c\xd8\x3d\x95\xa0\x74\x4a\xcb\x4f\x90\x23\x3c\x8a\x3d\x6d\xb9\xfa\x05\x9b\x96\x77\x0f\xb3\x96\x4b\x18\xa5\xb6\x74\x89\x21\x80\x85\xed\xf0\x4e\x1d\x25\x4b\xc6\x9f\x8a\xce\x10\x66\x02\x50\x2c\x9e\xf7\xb2\x2f\x78\x26\x65\x0d\xe5\x78\xdc\x9d\x52\x1a\xf4\x93\xda\xf4\x96\x55\xd7\xfc\xf1\x9c\xd7\x17\x5b\x0e\x98\x9e\x27\x6d\x1b\x7b\x7a\x71\x6d\xdf\xd4\xe0\x45\x91\x28\xbd\x31\xbd\xbe\x70\xb2\xd1\x3b\x6a\x1e\xab\xd1\x96\xbb\x8b\x23\x56\xcc\x18\xee\x15\xe3\xf1\xa8\xb1\x9c\xa1\xe4\x5f\xa8\xaa\x74\xc0\x06\x66\x2c\xd3\xc3\xa1\xc2\xaf\x58\xcc\xf7\x30\xc9\xe6\xf4\xfa\x48\x36\x05\x0e\x48\xdd\x9d\x13\xf8\xf5\xbd\xac\x82\x3f\xa9\x72\x7c\x77\x67\x28\x58\x6e\xac\x6f\xce\xb6\x79\x44\x7c\xbd\xe3\x7a\x97\x8c\x86\x28\x66\x9b\xac\xad\x8d\x69\xb5\x31\x3a\x01\x84\x4f\xd6\xca\x21\x74\xf5\xdd\xd9\xe8\xc7\x05\x50\xbd\x01\xdd\x84\x85\x23\xf0\xaa\x78\x33\xae\x17\xa3\x8b\xfd\x8c\x53\x6c\x9b\x3f\x92\xc9\xf9\xc2\x59\x86\x3d\x09\x76\xba\x67\x7d\x89\x73\x08\x57\x48\x0d\x5e\x43\x6a\x37\xed\xbb\x99\x77\x6e\xac\x24\x07\x67\x74\xd3\x91\x30\x8c\x50\x7d\x32\x44\x70\xda\xbc\x90\xbb\xee\x49\xd7\x41\x07\x33\x6f\x80\x12\x28\x30\x40\x1e\xfa\xad\x4c\x4d\xbf\x2b\x75\x30\x6b\x41\xb8\x5b\x70\x95\xf1\xbb\x00\x8f\x5f\xa7\x1c\xfc\x01\xe0\x41\xe1\x24\xf3\xd1\xa4\x8f\xa2\x1d\xd4\xb6\xcd\xc0\x14\x62\xe3\xbc\x85\xe9\xbc\x4e\x9a\x86\x11\x9c\xdf\x29\x34\x72\x36\xec\xe8\xbe\x48\x73\xba\x95\x33\x19\x26\x7d\xbe\x5c\x4c\xc8\x2d\x2c\x45\xa2\xe9\x8f\x12\xa9\x59\x3e\x34\xce\x80\x2d\x51\x00\xef\xe8\x91\x0f\x98\x9f\xec\x1b\x97\x71\xc4\xdb\xb7\x8f\xf3\x3c\xbc\xb4\xf2\xea\x4e\x9c\xd1\x74\x04\x90\xc4\x23\x7a\xe2\x15\xad\xf0\x6a\x4f\x12\xe1\xe1\x98\x24\xbe\xe0\x99\xe0\xa3\x9d\x6d\xa1\xd9\x96\x56\x1a\x4d\xbd\x8f\x1d\xaf\x23\x62\x72\x3e\xaf\xc9\x83\x55\x92\x27\x6e\xa8\xcf\x59\xcd\xc3\xf8\xf5\x5f\xb0\x1a\x0c\xcc\xa9\xfe\x48\xa9\x17\x3e\x64\x9b\xde\x13\xa0\x37\xa6\x55\x81\x5b\x0f\xb2\xab\x35\xf4\x72\xb7\xe1\x10\x06\x53\x23\xf9\x2b\xbe\x58\xa0\xf0\xb5\x88\x8d\x0a\x3f\x8d\x91\x36\x48\x59\xb9\x20\x30\x8f\x82\xbc\x51\x4e\xb0\xc2\x46\xf0\x23\x14\xa1\xd9\x21\x91\x39\x9a\xfc\x8b\x65\x12\xe8\xe2\xec\x4f\xb1\x14\xef\x10\xf6\xab\xa0\xaa\xf4\x98\xb0\xaf\xc3\x08\x94\x42\x49\x57\xbc\xb1\x7a\x13\xb5\xc9\x05\xe7\x56\xfb\x62\x92\x1f\x0d\x93\xaf\x7c\xb0\x79\x00\x7a\xf4\x06\xc9\x83\x67\xc3\xc7\x18\x66\x64\x7c\x18\x78\x6f\xe1\x26\x97\xa5\xf3\x65\x6a\x93\x6b\xee\x17\xa6\x0e\x75\x6d\x74\xdf\xf3\x4a\xd3\x38\xd1\x4d\x4a\x47\x6e\xd7\xca\xbf\x0d\x11\x26\xb0\x22\x6f\x7f\xd0\x91\x8e\x95\x5e\xd1\x8b\xa8\x02\x5f\xdc\x91\x5b\x07\x20\x2b\x4f\x17\x22\xb5\x64\xbe\x0a\x56\xcd\x45\x51\xc1\x11\xcd\x5a\x51\xd9\x3e\x72\xb1\xa8\x99\x2f\x2f\x74\x4a\x5e\xf7\xc5\xf4\x9a\x75\x71\x5c\x2d\xb9\x2d\x03\x34\x73\x4d\x2d\xac\x9a\x6a\x78\x7a\x8b\x64\xd7\xa5\x12\xf8\x68\x39\xa0\xf4\x33\x08\x60\xcb\xa0\x5f\xac\xc0\x6d\xa5\x7a\x5c\xe2\x86\xbd\xec\xb0\xb6\xcc\xda\xfc\xc3\x28\x7d\x3c\x0e\x6c\x95\xd8\xb7\xcd\x9a\x59\x53\x3d\x8d\xd2\x0b\x7e\xec\x17\xfc\x23\xb0\xc8\x33\xde\x7b\xef\x32\xd3\xe8\x36\x20\x5e\x2d\xb7\x12\xcb\x9b\x7c\x04\xe3\xc7\x2b\xbc\xaa\x39\xcd\xeb\x10\x1f\xe6\xc6\x3d\x5f\x08\x75\xde\x7e\x40\x87\xd7\x91\x15\x41\xa6\xe1\x66\xb6\x70\x78\xde\xb4\x98\xd3\x15\xbc\x86\x69\xe3\xbd\x1d\x5c\x50\x1c\xc3\xb3\x06\x64\x5f\xc4\x85\x06\x0e\x99\xda\xe0\x89\x98\xdc\x67\xd4\xe2\x50\xa2\x52\x23\x47\xa7\x82\xb7\x64\x78\x2f\xa9\xa0\x2e\x00\x8c\xc5\x38\x39\xf4\x89\xce\x8d\x7f\xfb\x2a\xe3\x61\x0b\x83\x15\xd0\x1b\x14\xb6\x89\x5e\x1a\xf6\x2b\xcb\x96\x6b\x9a\x74\xa2\x9b\x48\x9d\x6d\xf9\x36\x1d\x72\xf1\x05\x0b\x4a\xd9\x69\x7b\xf2\x25\x9a\x86\x60\x89\xb2\x8f\x03\xd3\xdd\x0c\x04\xd3\x0a\xd2\x94\x10\x7b\xcb\xdb\xdb\xb5\xa6\x6b\xc2\xba\x08\x5f\xb4\xd7\x4b\x42\x75\x5f\xd9\xf2\x20\xa5\x5a\x0e\xf2\x2b\x05\xc9\x34\x1f\x7a\x75\xc8\x4b\x02\x45\x33\x17\x0c\x79\x72\x63\xdd\x77\xe9\x2f\x14\xa9\xd8\x0b\xd5\x7b\x95\x87\x58\x8e\xd0\x8f\xc8\xab\x47\xd3\xae\x5e\x2f\xec\x69\xe7\x57\x20\x18\x68\x75\xf9\x1d\x1c\x9a\x1b\x97\x4e\xf7\x8b\x3f\x72\xe0\xc5\x6b\x63\x4e\xd8\x5c\x1b\xc9\xf4\x34\xfa\x14\xc4\x1b\xf5\xda\x20\x05\x5b\x52\xd5\xc8\x84\x8c\x0c\x92\xb7\xcc\x4b\xa3\x5f\xc0\x71\x28\xd5\x7b\xd9\xd3\x0b\x5e\x7c\xf2\x5b\xaa\x88\xca\x56\x80\xa4\xb5\xbd\x33\xc5\x0e\xdf\x41\x49\x45\x00\xa1\xd8\x45\xeb\x6d\xf9\xc2\x49\x5e\x0c\xfb\x20\x84\x5f\x45\xee\x6b\x6c\xa8\xfe\x8a\x10\x12\x05\xb6\xd4\x19\xb5\xc1\xf7\x36\x8c\x1f\xdf\x33\x88\x8d\xe0\x83\xbc\xfb\xe2\x2b\x2a\x08\xfd\x46\x88\xcf\x6e\xcd\x77\xfb\x80\x0c\x01\xe9\xfe\xc6\xa7\x3d\x5b\xc5\x66\x1d\xa9\xbd\xbb\x1c\x50\x35\xb9\x6d\x2e\xfb\x27\x6e\xc8\x63\xd6\x9a\x29\xb0\x20\xe1\xfc\x98\x46\x9b\x18\x6e\x98\x5e\x75\x6b\x20\xb4\xb1\xb8\xe1\xca\x74\xf2\xb0\x16\x81\x4c\x54\xdb\x2f\xe6\xc6\x29\xa0\x16\xb6\xcb\xc2\x28\xea\x2d\xa9\x79\x14\x77\x7e\x94\x1b\x50\x34\xcb\xb9\xa4\xfa\x2a\x2b\x4b\x33\xf7\x5a\x2b\x54\x45\xe5\x0b\x0d\x8f\xca\x98\xea\x8d\xdf\x5e\x72\x2f\x0c\x8c\x39\xe4\x09\xc8\x53\xc4\xf5\xd9\xbc\xb1\x94\xe0\x39\xf2\x04\xc9\xb5\x79\x1d\x4c\x87\x7f\xc1\xad\x00\x5a\x80\x45\x72\x3e\x6e\x00\xf8\x2e\x60\x3b\x69\x93\x3e\x5b\xab\xc8\x8d\x6d\x03\x24\x9b\x55\x7d\x2e\x5e\x4f\xdf\x38\x74\xdd\xbf\xc8\x9d\x39\xf1\x58\xde\xe0\xa4\x1d\x8e\x93\x75\xf1\x55\xad\xdd\xa5\x20\x24\x4f\x45\xe8\x76\x3b\x4f\x82\xa9\x60\xda\x97\xd1\x56\xad\xf6\x05\xec\xb2\x9e\xe1\x46\xb4\x18\xf1\x1a\xee\x9b\x77\x3f\x8c\x17\x96\xf5\x73\xfa\x74\x63\x2b\x7f\xf6\xa6\x58\x80\x61\x8e\x2b\x65\x20\xff\x05\xfb\x9e\xaa\x59\x5f\x82\x8a\x8e\xca\xb7\xbd\x56\x4d\xca\xb6\x0b\x06\xc7\x29\x31\x7d\xb4\x74\xdd\xd4\x8e\xed\x94\x74\xc8\xe0\x27\x41\x9f\xa8\x67\xa8\xd2\x13\x66\x98\x47\x54\x0b\x92\x16\x78\x3b\x6e\xb0\x44\xd4\x32\xd2\x23\x89\x2e\xb3\xb4\xb1\x60\x61\x7d\x2e\x4e\x26\xa8\x9f\xf8\x96\x8b\xea\x04\xe9\x37\x9d\xc5\xed\xa8\xba\xb1\xce\x86\xe2\xc0\x36\x4d\xcf\x83\xd9\xe9\x22\x08\x8a\x98\x33\x8f\x18\xb0\xe1\xb0\x7f\xc5\x49\xfe\x97\x80\xc7\xaf\xf3\x3f\xfa\x00\xf0\x70\x9c\x11\xfc\x76\x1f\x0c\xc2\x61\xec\x6d\x8f\x82\x37\xcc\x8c\xd8\x23\xd4\xa3\x89\xb0\x49\xd1\xb2\xc0\x86\xb1\xe8\x26\x46\x65\x5f\x5c\xaa\x66\x56\xbe\x0f\xed\x81\xb3\x1f\x09\xaf\xb2\xf4\x28\xac\xe5\x91\x98\xcf\xab\xc5\x00\x91\x12\xbe\xe9\xc5\x53\xa4\x24\xa3\xc1\xe5\x0b\xcc\x8a\xb7\xb7\xd4\x27\x25\x6e\x82\x3d\x48\xec\xa5\x60\x74\x17\xe8\xb9\xcc\x96\xc8\x68\x42\x6d\xf3\x10\xa2\x29\x2d\xdb\x12\x4d\xeb\xbe\x28\x05\x4a\x95\x13\x71\xd7\x8a\x4b\x0f\xaf\x4b\x41\x9a\x09\x75\xe0\x17\x86\xa3\x33\xfb\x98\x96\xc9\xb2\x39\x07\xe1\xac\x43\x7b\xa4\xbe\xf0\x8f\x64\x8a\xd3\xb7\xf2\x39\x75\x85\xf4\x50\xb2\xed\xf0\xe4\x81\x6d\xe6\x3e\x30\x78\x11\xf1\x17\x2f\xfe\xe4\x77\xf8\x8a\xab\xa1\xed\xa1\x5f\x00\x1e\x89\xdc\x38\x1a\x13\xa7\xa4\x4c\x4e\xf4\x51\x56\x84\xa9\xbd\x94\xcd\x63\x84\x48\xdd\x4b\xfa\x20\x46\x32\x72\x26\x1d\x78\xe1\x17\x9c\x1b\x86\xde\xd3\x14\xc6\x8c\x24\x09\x19\x7d\x4d\x99\x34\x2f\xd1\x09\x52\xad\x6a\xf9\x54\x12\x7a\x4b\xef\xbd\x4d\xc4\x14\x87\x34\x02\x7c\xd1\xc0\xe8\xd1\x07\xa8\xd1\x2d\x40\x55\xf4\xb9\x27\x85\x10\x26\x7d\xcd\x0b\xb1\x0c\xb6\xe5\xd8\x2c\xf5\xcb\xa7\x85\x00\xde\x35\xce\x4f\xbc\xf1\x2a\xa9\x7e\x4a\x86\xa0\xf7\x74\xa7\x51\xc2\x91\x15\x17\xd8\x19\xad\x12\x3e\x49\x3f\x42\x9f\x61\x5e\x95\xcc\x99\xc1\xe9\x21\xe9\x17\x7f\x04\x12\xc8\x50\xb6\x8e\x91\xdd\x73\x3e\x4d\x3c\x99\x63\x36\x6d\xdd\x6f\x35\xd5\x37\x4f\xd4\xc4\x5e\x3f\x6a\xac\x82\x28\xaf\xc7\x7f\xd1\x5e\xe3\xb7\xdc\xba\xa5\xb8\x7a\xcd\xf9\x6e\x63\x4c\x8b\x01\x45\x28\x1f\x9d\x38\xf4\x88\x68\xac\x65\x09\x68\xd7\x78\x84\x22\x7b\xb3\x4f\xf8\x04\xe4\xd0\x67\x38\x36\x85\x7f\x53\x2e\x37\x4c\x25\xb8\x09\x59\x53\x50\x6d\x2a\x2a\x73\x0e\x5d\x65\x76\x43\xf8\x20\x29\xd9\xfa\x86\x04\x6c\x49\xba\x29\x97\xd9\x82\x0a\xa7\x6b\x22\xa9\xd0\x70\xf0\x71\xa8\x9e\x28\x78\x25\xb1\xb2\xae\xb7\x02\x61\x8a\xc7\xf2\xd8\xbe\x98\x52\x4a\x8c\xae\x93\xf9\x18\x73\x71\xd1\xe9\x81\x2d\xe4\xbe\xf8\xa9\x05\xee\xc0\x96\x62\xa4\x79\x1b\xba\xe5\x0d\xbf\xd8\x37\x2a\x3f\x21\x7b\x6e\xaf\xf7\x34\x99\x3f\x40\xb6\x57\xdd\x37\x84\x5b\xd6\x89\x07\xb9\x6b\x3b\x79\xe4\xe0\x84\x6b\xe6\xda\x90\xa0\x35\x22\x0e\xac\x5f\xd0\x6f\xfd\x13\x2a\x9f\x5d\x53\x42\xf1\xe5\x04\x94\xd7\xb6\xf9\xf4\x59\x42\x83\x2f\xf7\xfa\x0e\xaf\x8c\xa9\xba\x5a\xd9\x93\x00\xef\xf9\xe2\x8f\x50\x90\xdc\x18\x94\xde\x47\x30\xa7\x5f\x4e\x96\xa6\x05\x96\xd7\x92\xeb\xb7\xd8\xb2\x61\x8a\x6b\xc7\xfa\x17\xd3\xca\x22\x01\x8a\x5f\xc0\x71\xcc\xc7\x89\x07\xdf\xe1\x46\xb3\x11\x6c\x18\x6d\x74\x35\xa3\xd1\xc0\x77\xb9\xd9\x9e\x42\x63\xc7\xe6\xbe\xfb\xea\x74\x4e\x19\xa7\x7d\xd1\x46\x79\xbd\x8c\x41\xbd\x35\xa7\x0a\x49\x25\x7a\xa5\xb7\x2b\xdc\x45\x17\x53\xb4\xa9\x06\xe4\x06\x20\x95\xbf\x07\xbd\xc0\x97\xe7\x94\x2f\xf4\xd2\x0e\x04\x4b\x32\xce\x68\x0e\x77\x2d\x0d\xeb\x9d\x29\x2f\xfe\xd2\x91\xd0\xaa\x57\xda\xa7\x40\x8a\xaf\x85\x21\x59\xc3\x67\xb2\xf5\x0b\x7f\x6a\x25\x44\xc0\x4d\xa8\x3d\x97\xcd\xe2\x3d\x9d\xa4\x70\x38\x0f\xb4\x3d\xba\xd6\x96\xd0\xb8\xaf\x7d\x1f\xf6\xea\x2c\x1e\xec\x0d\xfd\x62\x27\x9f\xfa\x50\x07\x0b\xe1\x6e\xd9\x63\x0c\xec\x4d\x98\x77\x47\xef\x70\x82\x17\x38\x0b\xf0\xf6\xd5\x35\xde\x43\xe5\x34\x9d\xd4\x50\xc4\x17\xaf\x99\x79\xa8\x5e\x3a\xc3\xa6\x44\x2d\xe7\x05\x8b\x35\xc3\xde\xf2\xd0\x2e\xbd\xb5\xd2\x9b\x99\xb3\xaf\x19\xe8\x02\x6a\xeb\xb2\x92\x4f\x9c\x49\xda\x54\x30\xa6\x5c\x80\xcc\x16\xe3\xd1\x66\x57\x33\x0d\x5d\xb2\x13\x6b\x52\x7c\x4b\xa6\xc4\x3e\xae\xbc\xfe\x96\xc1\x3d\xd6\xf6\x0b\x81\x78\x3d\xe6\x46\x5c\x5f\xad\x16\x20\x74\xdf\x4d\x7c\x7d\xdd\xe9\x30\xdf\xe1\x12\xa5\xf1\x29\x41\xb4\x93\x98\xaf\x21\xac\x3d\x57\xfd\x82\x29\xf8\x96\xd3\x23\x30\xb9\x1c\xa4\x31\x7e\x36\xa7\x09\x8d\x91\x08\xf8\xc5\x76\xd5\x38\x72\x18\xbe\xbd\x90\x3e\xa2\x73\xd3\x4a\xab\x7d\x51\xfd\x1a\xb4\xb7\x62\x3b\x60\x5e\xba\x41\x65\xed\xb7\xd7\xe0\x19\xe2\x62\x1e\x51\xc7\x7a\xf6\x50\x32\x26\x3c\x9f\xf6\x9e\xec\x4d\xfd\xc2\x93\x99\x3a\x3d\x9c\x3a\x03\xe5\xd7\x0c\x32\xba\xd0\xf3\xee\x39\xe2\xf6\x2c\x9e\xfd\x4c\x3b\x39\x09\xf3\x56\xa6\x58\xf2\xea\xc9\xd4\x96\x4f\xfc\x94\xe2\xd8\x25\x47\x4a\xea\xe3\x2c\xeb\xe2\x28\xbf\x0c\xd4\x09\xea\x25\x60\xc5\x4d\xdd\x61\x98\xde\x05\xeb\x3b\x5f\x02\x2c\xf8\x02\x20\x65\xaa\xb3\x72\x6d\xde\xbc\xc6\x85\x41\x61\x64\x9a\x9c\x4a\x1d\xf1\x74\x57\x94\xeb\x29\xeb\xe3\x30\x8c\x69\xc9\x55\xf9\x23\xc0\x27\xb0\x0b\xa6\x77\x2c\x33\xb9\xb6\xd2\x95\xba\xdd\x43\xc0\x4a\x84\xe9\x23\x3d\x44\x20\xed\x65\x48\xb8\xe6\x9e\x67\x44\x23\xa9\x88\xf0\x8b\xd7\x8c\x1e\x0d\xb1\x3d\x08\x1a\x2c\x32\x4d\x92\x27\x1a\x45\x19\x2b\xbb\x20\x7d\x79\xaf\x9f\x6c\xc2\x6e\x9f\x49\x59\x7d\x83\x52\xf2\xfe\x4a\x27\xf0\x4b\xc0\xe3\xd7\xb9\x38\x7f\x00\x78\xb0\xa6\xca\x4b\x1b\x98\x5d\x75\x7a\x67\x8d\x6b\xee\xe7\xb0\x6d\xf4\x3e\x6c\xab\xf3\x3c\xac\x70\xe3\x39\x43\x0a\x04\x97\xa4\xfa\x62\x37\x8a\xbe\x4d\xb2\x7c\x09\xca\x54\x9a\x8b\x57\x79\xd5\x62\x4a\x8e\x7d\xc1\xa0\x98\x76\xab\x42\x4b\x6b\x98\x18\x0b\x88\xbc\xfc\xe8\xb8\xbe\xd8\xbd\xe6\x8d\x2d\x7c\x9f\x19\xca\x05\x36\xab\x3e\x25\x4d\x33\x28\x55\x24\x29\x07\x48\x36\xf4\x89\x18\x8c\xb6\x56\x3d\x44\x2e\xf2\xda\x2f\x4a\xc4\xa6\xd3\xc0\x31\x6a\x19\xc5\x06\xfb\x0e\x94\xaf\x66\xfc\xc8\xe5\x22\xad\xd9\x3e\x01\x6a\xf9\xba\xbb\x31\x7b\xfc\x8c\xa3\xde\x2f\xf6\xc4\xd8\x88\xd4\xaa\xdb\x23\x78\x2f\x4b\xca\x09\x59\x60\xac\xac\x1f\x18\x5f\x25\x8e\xf5\x67\x28\xe3\x8a\x62\xb1\x44\xf3\x2c\xa6\xc9\xfd\xe2\x52\x19\xa4\x40\x7c\x48\x58\xcb\xbc\xcf\xf3\x34\xba\xf7\x22\x06\x1f\x7a\xb8\x11\xa2\x0b\x8b\xc8\xa9\x57\x13\x0a\xf3\x92\xb2\x3c\xe1\x0b\x73\x5c\x06\x55\xba\xd9\xa6\x0e\x02\x83\x45\x16\xf0\x68\x72\x3a\x85\x6a\x89\x95\x51\x58\x49\x6d\x7b\x16\xef\x04\xf9\x12\xf6\x63\xa2\x81\x5f\x30\x3c\x5e\xed\x07\xa2\x2a\x12\x3a\x04\x05\x69\x88\x93\x8b\xba\x74\x4c\x6d\xca\x01\x6f\x44\xd7\x2a\x3b\xf6\x5a\xd0\x32\x9f\x15\x95\xf0\x0b\xa4\xbd\xf2\x3b\x2f\x1b\xf1\xb5\x51\xad\x04\xe8\x5b\xa7\x4f\x4e\x99\xf7\x62\x47\x52\x93\xc7\x13\x0e\x22\xcb\xa6\xd3\x6a\x99\x1c\xb5\x7e\x41\xf6\x9c\xb3\x9e\x12\xf3\xdb\xed\x2e\xe7\x51\xbe\xf9\x7d\x0f\x7d\xe1\xbe\x19\x21\x1e\xd4\x38\xed\xbd\x98\x0f\x61\xf8\x3b\x96\x0e\xa1\x7c\x51\xb4\x77\xdc\x0d\x6f\xce\x5a\x3b\x61\x3f\xe9\x5c\xc9\x7c\x29\x0c\x46\x74\xc5\x23\xa5\xa6\x04\xbf\x8e\x9b\x52\x77\x2a\x11\xd5\xa4\xbe\xb0\x99\xa4\x0b\x6e\xff\x70\x1f\x02\x7a\xb6\x40\x0f\xf0\xdb\x89\xe7\x01\x66\x68\xa5\x0a\xeb\x02\x84\x2e\x37\x47\x6a\xe2\x8d\x71\xdc\x0c\x7f\xc2\x8e\x43\xfe\x85\x60\x3d\x2f\x66\x9d\x4f\xb1\x08\x78\xa8\x50\xb0\x0f\x4d\x7d\x05\x62\xc1\x17\x57\xff\xc8\xd6\x37\x73\xd0\x7a\x65\x64\xf9\xc4\xe1\xca\x89\x6b\xa8\x21\xf3\xa5\x95\xa5\xa9\x8d\x78\xab\xe7\xf4\xc1\xef\xab\xb1\xcc\x40\x88\xea\x24\x0e\xe8\x8d\x38\xa8\x1c\x6c\x72\x5f\xb0\xa0\x76\xa1\x9b\xdd\xab\xca\xf4\x1d\xb2\x26\x2c\x7e\x10\x7f\x9f\x50\x59\x9f\x54\x93\x9c\xdb\x59\xd6\x51\x04\xfd\x34\x4f\x68\x5e\x9e\x2f\xce\xe2\x80\x9e\x99\x5a\x94\x83\x18\xdf\x51\xa0\xda\x22\xd3\x5d\xef\xe3\x39\x1d\x99\x3f\x12\xb0\x62\x85\x43\x5d\x6a\xdd\x4e\x78\x22\xfd\x82\xbb\x69\xf8\xc8\xb9\x88\x99\x53\x75\x30\x99\x87\xfa\xd2\x7b\x89\xd8\x3f\x24\xd8\xdc\x7b\x40\xde\x80\x19\x38\xdb\x96\x60\x7c\x4c\xbf\x5f\x80\x3f\xfa\xdc\x5e\x90\xa1\xb7\x8b\xa1\x2a\x0e\x07\xb7\xb6\xcf\x73\x5b\x30\x84\xe0\x99\x78\x51\xc6\xe8\xd8\xd4\x1c\x73\xe0\xf6\x88\xfe\x45\xee\x3c\xb6\x6d\xe3\x7a\x78\x27\x6c\x0f\x22\xf0\x20\x1a\x06\x5a\x27\xb2\xbb\x9e\x63\xb7\xb9\x0a\x18\x45\x24\x26\xb4\x12\xc9\x8f\xb7\x5f\x2c\xd6\xf0\xd7\xd6\x8d\x9d\x82\xc5\x2b\xf3\xf6\x16\x4a\xb1\x76\x93\x98\x72\xeb\x2e\x0a\x47\x7c\x33\x2e\xc9\x52\x21\xed\xcb\x1a\xf2\xf0\x2f\x6a\x2d\xdc\x0d\x90\xc3\xc3\x05\xf5\x23\x2c\x38\xa0\xa5\x87\xb6\x61\x69\x29\x55\xaa\x1f\xfd\x2e\xe5\x97\x24\x9e\xd3\x95\xad\x07\xe4\xfc\x17\x00\x29\x1e\x2f\x70\x01\xf7\x33\x96\x3e\x39\x5b\x18\xaf\x1e\x5b\xe2\x27\x2b\x55\xdb\xa5\x71\x03\x8d\x51\x19\x46\x1f\xfb\x16\x5f\x28\xf8\x64\xed\xcb\x37\xfc\xa8\xd7\xd1\x09\x97\xcf\xdc\xcb\xe2\xd4\xce\x2a\x26\xba\x1b\x3a\x2d\x4b\xc7\x8c\x08\x10\x36\xa0\x8b\xe0\x0d\xf9\x4f\x54\x55\x78\x0c\x41\xe4\xc4\x02\x86\xca\x3b\x4a\xc1\x00\xd6\x52\x36\x24\xa1\x07\x11\x3f\xb3\x91\xe4\xcc\xa6\x44\x2e\x42\xe8\x84\x10\xf8\x62\xad\x7c\xcc\x33\x47\x62\x30\x09\xf6\x4c\xf8\x78\xeb\x1f\xd5\x27\x3b\x70\x06\xc3\x67\x7d\xdf\x28\xe0\x76\xcf\x8b\xe6\x4e\x2f\x50\xab\x8b\x2f\x80\xb0\x3a\x82\x70\xb2\x72\x72\xe8\xba\x2e\x41\xee\x65\xcc\x63\x02\xe3\x3c\xdd\xa2\x09\xd6\xec\xc3\xf1\xe4\x9d\xc8\x6b\x5e\x97\xf3\xfd\xa2\xb1\xdd\xc9\xed\x78\xa4\xf9\x85\x6b\x02\xe2\x36\x86\x6c\x58\xe8\xfa\xfa\xdb\x1a\xef\x06\x76\x7a\xec\xa0\x0d\x83\x37\xc6\xcb\xce\xfa\x24\x2e\xfc\xdb\xd3\x80\x20\x6b\xdb\x59\x1a\xd2\x4f\x33\x4d\xb2\xa1\x44\x31\xb2\xc6\x27\xe9\x27\xa3\xf7\xa1\x1d\xef\x54\x82\x6f\x67\xde\x2f\xd8\x2e\xf4\x96\xb5\xd9\xc1\xd5\x66\xdf\x0e\xe4\xee\x35\x55\x49\xa5\x17\x99\x0b\xbb\x94\x9d\x32\xd1\x00\x23\x3d\x92\xbe\xbe\xa5\x92\xfe\x09\x8f\x15\x10\xcb\x5f\x84\xf4\x64\x2f\x4b\x0d\x5a\x57\xe7\xd4\xfe\xed\xc3\x9a\xc3\x68\x3f\x39\x53\x65\x33\xe1\xeb\xed\x32\x66\x6f\x3f\xd1\xc5\xf2\x57\xa5\x8e\xda\x91\xa1\xee\xa5\xe2\x1e\x79\x8a\x67\x85\xce\x3d\x98\xe9\xc7\x9d\x85\x04\xc8\x28\x48\x21\x86\xcd\x8e\x7a\xff\x82\xa4\xc0\xce\x3a\x46\x6b\xb6\x39\x97\xc8\x25\x01\xc3\xb3\x35\x55\x45\x33\x6b\x48\x50\x8c\x58\x8e\xab\x96\x44\xb2\xca\x37\x5b\x71\xc1\xdf\x03\xf0\xf8\x37\xfe\xe5\xbf\xed\xcf\xc4\xdf\xf9\x77\x7f\xfb\xef\xf8\xbb\xc3\x7e\xff\xc2\x6f\xfd\x83\xe0\x77\xfe\xab\xbf\x76\xff\xea\xbf\xf0\xf7\xfe\xa5\xff\xfe\x1f\xff\x43\xff\xc7\x9f\xfd\x5f\xff\xf7\x0f\x00\x0f\x84\xb0\x2f\xc8\x2f\x96\xdf\xcd\xc4\x2e\x02\x73\x35\x87\xc5\x11\x3e\x56\xdf\xfe\xde\x67\xa3\x9d\x19\x81\xa5\x88\x47\xb7\x18\xf9\x17\xc8\xd9\xb4\x76\x03\x3e\xa5\x05\xd5\x4a\x60\x2a\x38\x4f\x82\xdb\xd8\x05\x15\xd7\xf7\x1a\xcd\x01\xac\x1d\xcb\x40\x46\x85\x10\xa0\xe4\xbf\x48\x73\xb2\xb1\xc9\x04\x70\x44\x37\xab\xe2\x92\x87\x41\xc9\x4e\x42\x2f\x08\x4d\xe1\xd2\x73\x60\x6e\xbd\xad\x92\x53\x65\xbc\x8b\xb1\x4f\xf6\xd0\xdf\x57\xa5\x5d\x04\x91\xeb\x35\xad\x57\x69\x78\xcc\x19\x2a\x8d\x34\xea\x5e\x4e\xdb\x6d\x03\xea\x64\x70\x7a\x01\x87\x43\x49\xbf\x70\x9c\xa6\x91\xb5\x64\x5f\x77\x73\x0f\xb6\x82\x1d\x63\x7f\x72\x1a\xae\xa8\x5b\xdb\x63\xaf\xf4\xe4\x79\xc2\x88\x68\x8d\x38\x3a\x58\x15\xf1\x2f\xb4\x1a\xa4\xed\x45\x66\x87\x0b\xaf\x00\x1d\x92\xfc\x7a\x56\x37\x24\x8d\xfc\x1a\x4a\xdf\x17\x1c\x41\x02\xba\x83\xc5\xb9\xd6\xed\x2c\x80\x2f\x92\x6d\x9a\x44\xe7\x28\xe5\x8a\x71\x99\xe4\xa9\x5e\x87\x11\x24\xc9\xc4\x56\x67\xd8\xd1\x1c\x76\xc5\x8a\xf9\xeb\x5e\xbd\x1e\xcb\xbe\x81\xe3\xfc\xe9\xe7\x05\x52\x9e\xc4\x92\xcb\x47\x47\xbe\x24\x7e\x75\x51\x4f\x78\xef\x0a\x85\xc4\xfb\xe6\xa4\xcc\xe5\x67\x85\xf8\x6c\xfe\x8d\x14\x62\x8d\xf4\x06\x2b\x0e\x2e\x5b\x46\xfb\xe6\x94\x15\x7b\xcc\xc5\xda\x01\xc6\x76\x1e\x45\xd8\x6d\xfd\x8d\x4b\xa2\x0d\xc7\x95\x9f\x68\x78\x80\xeb\x32\x82\xfb\x47\x2d\x4a\x5f\x8e\x05\xcf\x02\x38\xc7\xa6\x3a\x81\x10\xfa\xbc\x31\xc6\xd7\x85\x18\xf9\x94\xab\x93\xa3\x63\xf8\xc2\xa5\x45\x1f\xe4\x8c\x5b\xf5\x41\xa5\x42\xaf\xc6\x86\x96\x1c\x29\x56\x13\xee\x92\x1c\xe4\xd2\x32\xac\xb4\xc7\x44\xce\x4f\x26\x1b\xfb\x02\x6a\x60\x07\x6b\xc6\xf3\xf6\x25\xad\xfb\x58\x26\x12\x33\xd7\x13\xe5\x2c\x04\x1d\xf4\x2e\x5e\x9e\xab\x8c\xa9\xd8\xd7\xcf\x2c\xb5\xb8\xe5\x8b\xdc\xd9\x0c\x2e\xa5\x9f\x08\x54\x20\xba\xe9\xd7\x1e\x76\x0c\xec\xd7\x2a\x8d\xa3\xea\x9b\x71\x7d\x99\x0b\x56\x09\x60\x9f\x58\xf7\xeb\xbf\x98\x95\xa6\xb7\xb6\xb8\x48\x78\x16\xda\xdd\x08\xa9\xe7\xf3\x6c\xdb\x59\xc7\x7a\x2d\x85\xed\x6d\x57\x63\xd3\x90\x5d\x38\x47\x64\xce\x66\x5f\x50\xd4\xa1\x8b\x34\x26\x92\x53\xaa\x8b\xbd\xfe\x5a\xc6\x60\xeb\x3b\x1b\x9d\x8f\xf7\xc6\x13\x26\xcf\x34\x27\xcc\x31\xd7\x00\xe9\xdc\xf0\x45\xb9\xbc\x70\xa9\x32\xea\x7d\x92\x10\x47\x97\x53\xdd\xe8\xa4\x88\x5e\xf2\x3b\x8c\xe0\xaa\xd2\xea\xfb\x84\xba\x83\xe5\x02\x23\x69\x7c\xa2\xae\x3f\x98\x71\xe2\x26\xbe\x86\x1e\x1a\x71\x68\x5b\x62\xfa\xd9\x24\x4f\xcb\x4b\x3e\xdb\xbd\xe3\xb4\xc2\x82\x5f\xa2\x86\x69\x25\xe9\x5f\x44\xe7\xd5\x5e\x03\xac\xbd\x32\x5c\x59\x32\x54\x62\x43\x33\xa1\xd4\xcb\xfa\xde\x3a\xba\x72\x46\x07\x5d\xce\xc3\xa8\x30\x72\x6a\xc3\xbe\x98\x52\x56\x7a\xa6\xf4\x18\xef\xa3\xca\x8b\x9f\xde\xa2\x4f\x15\x94\x88\xb0\xca\x75\xf6\x1a\xb7\x13\x2f\x5e\x02\x16\xc1\x27\x6c\x36\x7d\x62\x2c\x9e\xcb\xac\x77\x33\x08\xd1\xbd\xb7\x52\x5b\xdf\x25\x59\x22\x97\x0b\x00\x4d\x15\x89\xa1\x39\xae\xa7\x87\x61\x70\xf0\xe1\xf5\xd2\x2f\xe0\xfb\x4d\x6c\x1b\x23\x45\x52\x37\x2a\xeb\x8a\x0b\x7e\x24\x2e\xdb\x27\xa4\x2d\x89\xca\x42\x27\x1e\x9a\x35\xde\x87\x11\x29\x34\xe4\xe2\x0b\x5a\xf6\x68\x1b\x6b\x4d\x59\xce\x84\xc0\x58\xb1\x71\x0e\xf0\x20\x8b\xf7\x9c\x2e\x20\xd8\x92\x61\xbf\x41\x03\x38\xa6\xb6\xcc\xa2\xfc\x09\x2f\x8d\xee\xf9\x23\x1c\x59\x29\xc3\xfa\xa7\x7a\xf0\xa2\x40\x00\xa4\xb7\x5f\x5f\x03\x2c\x1e\xe0\x28\x5a\x1d\xbe\x18\x89\x59\x4b\xcf\x17\xb2\x90\x2c\x68\x21\xaa\x91\x80\x84\x00\xcc\xb3\x79\x7a\x0a\xb7\x7d\x39\x55\x50\x3e\xb4\x5b\x26\xe5\xca\x0d\x02\x25\x1b\x9d\x93\x4b\xf1\x89\x99\x76\xea\x3d\x3a\xce\x0d\xe7\x95\x95\xdb\x55\x9c\x97\x97\xf4\x78\xfb\xf8\x96\xd1\x20\xa1\x4d\xd5\x27\xc2\x71\x2d\x93\x93\x16\x5b\x7c\x91\xb5\xdc\x26\xf5\x38\x7d\x0f\x1a\x03\x28\xc9\x87\x78\xe5\x4e\x59\xf5\xa9\x51\x78\x0e\x24\xd9\xa9\xa1\xef\xd1\x5e\x6e\x55\xc7\x92\xec\x13\x39\xf2\x42\x8a\x1f\xd6\xce\xac\x71\x8b\x34\x65\x8d\x35\x36\x11\x07\x3b\x9b\x6f\xf0\x91\x77\x28\xb7\x8b\xbc\x2f\xa0\xd7\x4d\xe9\xbf\xb0\x72\xa0\x38\xd5\x50\x44\x21\x22\x2d\x82\xc4\x03\x66\x61\x84\x83\xc4\x38\x62\xd6\x65\x18\xca\x1b\xae\xb1\x50\xd3\xbb\x16\x78\x67\xab\xec\x0b\xe6\x4f\xf5\xaf\x1c\x89\x64\x37\xb2\x7c\x5f\xf4\x00\xd1\x3a\xe4\xbb\xe2\x7e\x70\xbc\xf6\x45\xc1\x0f\x61\x79\x4a\xdd\x80\xc2\x1f\xc4\xc0\x17\x6b\x5f\x8a\x0e\xa4\x88\x41\xf6\xa2\x65\xaa\xa3\x0c\x00\x96\x00\x9f\x0e\x3b\x1b\x8e\xb5\x39\xc9\x21\x80\x99\x0f\x8b\xb2\xc8\x93\xb5\xfb\x42\xb2\x9f\xf5\xd3\x4f\x50\x91\x6d\x13\x90\x9a\xaf\x4a\xb8\x73\x0a\x4f\x5a\x01\x57\x46\x5d\x38\xe9\x47\xd0\xf0\x0b\x80\x0c\xd2\xa8\xc6\xbe\xc8\x9d\x44\x09\x99\x28\x4a\x61\x9a\xc8\xc9\x53\x60\x9d\x28\xf0\x46\x1a\xf3\x01\xc5\x57\x6a\xe7\x2f\x29\x76\x7a\x64\xb7\x51\x19\x90\x5f\x59\xef\xf9\x25\xe0\xf1\xd7\xff\xe0\xef\xfb\xc7\xfe\x1d\xf1\xa7\xff\xd4\x9f\xf8\x4f\xff\xf0\x9f\xfd\x97\xfe\xef\xff\xf2\xbf\xf9\x8f\x7e\xe3\x6f\xfc\x39\xfc\x77\xfe\x8f\x7f\xf2\x7f\xf8\x9b\x7f\xe4\x37\xff\xd9\xdf\xfa\xdb\xff\xe8\x07\x80\x07\x1c\x62\x68\x6f\x06\xa1\x6e\x8f\x0c\xfd\x73\xa9\x62\x1b\x22\xbb\xe6\x7e\xf7\x40\xdd\xa7\xb1\xb1\x61\x5d\x2a\x19\x1e\xfc\x8a\x2f\xf6\xd0\x99\x5b\xb6\xa3\x5e\x12\x74\xb6\x5e\x36\x1f\x0b\x4f\xf7\xfa\x3e\x3a\xbe\x16\x2f\x7b\xc6\xae\x5d\x38\xb1\x71\x99\x08\x4b\x07\xbe\x51\x12\xa9\xba\xf3\xd2\x48\x25\xa4\x57\x56\x9e\x60\x53\xf2\xaa\x3c\x8f\x51\xe6\xa9\x07\x9a\x89\x1a\xb5\x6b\xb1\xa7\x2d\xe2\x8e\xdb\x9d\x7f\x71\xa9\xbc\x5f\xd4\xf0\x1e\x6d\xbb\x48\xe5\xd0\xc5\x81\x22\xf1\x46\x12\x54\xd9\x88\xf7\x35\x35\x47\xe5\x96\x72\x00\xb3\x67\x59\x7d\xe0\x17\x53\x4a\x4d\x8d\x55\x3c\x1e\x8b\x13\x35\x72\x0e\xca\x5f\x87\x1e\xd2\x7a\xae\xfd\xe8\x63\xba\xbe\x53\xae\x22\x2d\xf2\xba\x08\xb2\xcb\x27\x06\x4c\x9b\x76\x30\xdf\x4b\xc4\xd2\x02\xc1\x31\x5e\xb0\x05\x8a\x5c\xb3\x1b\x47\xbc\xb5\xf4\x7b\x6e\xb1\x0d\xf7\xe1\x57\xe1\xb9\xd0\xfb\x89\x60\x12\xd1\x4d\x50\x7d\x61\x8e\xba\x1f\x89\x4a\x49\x95\xe6\x8e\x09\x45\xa8\x19\x54\xb1\x55\x91\x6f\x38\xc2\xcc\x40\x8e\xd0\x48\xff\xa2\x50\xb5\x34\x6f\x44\xb2\x17\x13\x77\x56\x74\xd5\xef\x8f\x77\x97\x8c\x9e\x37\xa8\x6f\xdb\x03\xf6\xf9\x90\x3d\xc1\x81\x35\x57\x12\x20\xf8\xe2\xe1\x29\x3c\x6b\x31\xd8\x18\xf0\x3e\x29\x58\x21\x46\x47\xd5\xd8\x62\x7f\xf4\x72\x0b\x2c\x35\x05\x55\x0f\xba\xc5\xcc\xc6\x98\x91\xaf\xfb\x42\xcc\x36\x8f\x16\x7b\x1d\xfe\x96\x76\xdf\x5a\xee\xb0\x8a\xe5\x5d\x41\x22\x42\x9a\xfb\xbe\xf1\x55\x96\x9f\x3d\x62\xd3\x3c\xee\x5e\x05\xf8\x82\x67\xb2\x46\xa3\xe0\xdd\xaf\xaa\x47\x45\x75\xa5\x32\xc4\x42\x0f\x39\x7f\xae\x95\xad\xe5\x6c\x9b\xe1\x13\x3c\x01\x92\xaa\x2e\xa2\xe9\x13\x7d\x02\x78\x62\x0b\x28\x02\x1e\x48\x85\x6b\x83\xcc\xa2\x3e\xf1\xa5\x85\x01\xcf\xcf\xf4\x68\x8d\x35\x34\x58\xed\x96\x63\x05\xc9\x8f\xfd\x82\xae\xff\x32\xbf\x31\x0d\xdc\x48\x99\x0f\x77\xa4\xd9\x88\xa6\x60\x8a\x06\x60\x9f\x46\xaf\xf2\xd8\x4c\x78\x51\x84\x48\xbb\xac\x35\xf3\x5f\x08\xfb\x1a\x61\x64\x7a\xb2\x94\x81\x50\x5f\x26\xc8\x9d\x68\x49\xc1\x46\xfd\x20\xf4\x56\x85\x3a\xc8\x28\x54\x62\xf1\xca\x39\x19\xb8\xbf\x98\xcc\x31\x88\xaf\xe3\xcb\xa7\xb0\x47\xb4\xfd\x40\x34\x29\x83\x0c\x14\x95\x8d\xe9\xc1\x3f\x02\x17\xe3\x28\x4d\x88\x87\xe8\x8c\x57\xbc\x7d\x51\xa8\x52\xe2\x09\x0b\x93\xbd\xbc\x72\xd2\x80\x25\xf5\x9e\x0c\x33\x89\xc5\xe2\x41\x6e\x27\x5b\x6a\x1e\x93\xdc\xb2\x5a\xee\x6e\x73\xf6\x8b\x55\x27\x07\x43\x42\x39\xdd\xb7\x0b\xd4\x38\x85\x0c\x93\xa0\x0e\xd4\x6f\xb9\x24\xb2\x30\xe5\xab\x92\xeb\x5b\xe7\xa5\x49\x81\x78\xd9\x4f\xea\x8b\x37\x71\xd7\xec\x36\x90\x29\x05\x12\x35\x85\xa5\x4e\x53\x5a\x61\x0d\xb8\xd7\x90\xa5\x91\xfd\x44\xcc\xb2\xd2\xf4\x39\x0f\xa9\x9f\xf8\x6c\x21\x9e\xec\x7d\x83\x96\xe7\xd6\xe8\xca\x7d\xa5\x79\x8b\xf5\x56\xe7\xea\x85\x6a\x32\x45\xcd\x8b\xaf\xdc\xa7\xa6\x48\x3f\x33\x7f\x52\x5f\xd4\x51\x0e\x03\x24\x50\xb8\xcc\x5c\x92\xde\x24\x5f\x40\x5f\xc6\x81\x76\xa9\x48\x96\xc2\x72\xe7\xec\x75\x75\x4a\x82\x28\x86\xc4\x17\x30\xad\xcb\xb9\xe4\x63\x94\x15\x92\xea\xd6\x8b\x60\x4f\x01\xed\xde\x14\x76\xb2\x30\xd9\x80\xa4\x7a\x0c\xcc\xee\x61\xc7\xab\xf9\xc6\x6f\x7c\x30\x78\xd4\x34\x29\x41\xe5\x1b\x9d\xb3\xed\x06\x9c\xc0\xba\xbe\xc9\x11\x46\xb3\xb5\x8a\x27\x8c\x95\x94\xee\xa9\xe0\xa4\xa6\xfd\x84\x29\x88\xb1\xed\xc9\x3f\x30\x65\x1f\x2b\xe1\xf4\x70\x6c\x5d\x8b\xc4\xef\xec\x66\x91\x38\xed\x97\xcc\xde\x82\x8d\x7b\x3d\xec\xa1\xdb\x7d\x01\xdf\xa7\xa8\xe2\xe6\x82\x9c\xb9\x33\xd3\x08\x2b\x51\xc8\x21\x77\xbe\xef\x98\x59\xdc\x9d\x63\x11\x46\x09\xea\xa5\xe4\xc6\x13\x8a\x3e\x99\x1b\x67\x64\x83\x7a\x86\x79\x10\xc6\x9b\xc1\x9b\x47\x27\x86\xd7\xc2\xbb\x17\xb0\x54\x77\xad\x87\x12\x9b\x72\x25\x32\x1e\x58\xfd\x7c\xc2\x6f\x16\xc0\x59\x18\x17\x46\x1c\xe1\xf7\xe5\xfd\x91\xe1\xdc\xa7\x11\x25\xc0\x68\x25\xe0\x63\xe9\x5e\x4a\x6a\x5e\x31\x01\x29\xf7\x56\xbf\x90\x17\xc6\xfa\xee\xb7\x69\xc7\xd3\x3a\x64\x38\x94\x2b\xa5\x90\x6b\x12\x6b\x96\x31\x97\xd8\x1a\xb7\x1c\x62\xb8\xf6\xd2\x24\xe1\xd3\xcf\x17\x86\xf3\xd7\x86\x62\x2d\xa3\x6f\x91\x05\x72\xb7\xc7\x0b\xe9\xeb\x2f\x92\x05\xc2\xb0\x13\xdf\x2e\xc6\x47\x4e\x37\x26\x9d\x56\x11\x85\xbe\x90\x4e\x65\xe1\x98\xe2\xa1\xbb\xec\x15\x94\x77\xe6\x42\xc6\xd1\xbf\xa9\x5e\x9a\xc7\xb6\x07\x9d\x95\x46\x59\x09\x6b\xd6\x9a\x9f\x79\xc8\xf2\x45\xf5\xdb\x23\x02\x61\x2d\x30\x80\x78\xf2\xbd\x4c\xa0\xd2\x13\x11\x7e\x16\xb6\x8d\x9a\x3c\x47\x3d\x28\x35\x90\xd7\x45\x7b\x1a\x34\x7f\x62\x20\xfd\xf6\xe0\xf6\x45\x0e\xb7\x46\xc2\x76\xaf\x37\x74\xeb\x5d\xd2\x66\xc4\xb6\x5c\x2c\x53\x19\xee\x4a\x0a\x00\x7b\x95\x81\x40\xab\xdf\x98\x28\x04\xa6\x17\xf3\x12\x2d\x00\xd0\x25\x72\x45\x14\xb8\xb4\x04\xfb\xab\x95\x74\x71\x97\x52\x0e\x10\xca\xc3\x4b\x2a\x11\xdc\xbd\xbf\x0b\xf0\xf8\xfd\xff\xed\x7f\xf8\x1b\xff\xc0\xff\xf5\xaf\xff\xcf\x7f\xee\xb7\xff\xf4\x7f\xf2\xf7\xfd\xe5\xbf\xf8\xcf\xfc\x6f\x7f\xe2\xef\xfa\xcd\xf3\x0f\xff\xfb\xe7\x0f\xfe\x77\xff\x56\x64\xbf\xf1\xf7\xff\x6b\x1f\xd8\xd2\x2e\x43\x89\x0f\xd5\x42\xd4\xcb\x19\x81\x73\x5c\x6a\x46\x99\x42\x84\x8c\xdd\xd7\x69\x3c\x3c\x53\x2f\xe5\x01\x8c\xa0\x3d\xbc\xec\x0b\x9a\xe5\xe9\xec\x62\x2f\x48\x91\x34\x8e\x1a\x6d\x7e\x7a\xf1\x0c\xe9\xa5\x4e\xa9\x8c\x9b\x02\xac\x4b\xde\x67\x6c\x74\x59\xe5\x99\xe8\x7e\x81\x71\xe7\x75\x6a\x58\x64\xf8\x07\xd5\x49\xc9\x84\x56\x72\x5a\x59\x00\x8a\x02\x63\x7d\x32\x15\x0d\x9a\x6d\xee\x22\x85\xe4\x91\xeb\xfc\x8b\x04\xd3\x3d\xf5\xfe\xbd\x29\x89\x5a\xcd\x3e\xd8\x3f\xe2\x40\xe0\x35\x7f\x48\xaa\x0f\xbb\x0a\xc0\xf6\xce\x07\xb4\x78\x77\x97\xfb\x75\x9f\x6c\xfa\x92\x1b\xc7\xaa\x38\x7a\xcf\xa3\x23\x7b\x48\xb7\x7c\xea\x22\x54\x74\xa0\xb8\x44\x78\x54\x52\xc5\x25\x57\xe1\x2d\x25\xb0\xa8\x2f\x2c\xf4\x68\x49\x46\x80\x25\xb0\xb6\xf9\x32\x13\x65\x25\x66\x3a\xc9\xde\xfd\xe8\xc6\xae\xe2\x7d\x81\x7b\x1f\x51\x32\x6a\x1d\x27\x57\xb1\xfd\x42\x55\x85\xd2\x40\x9b\xc2\x2b\x3c\x95\x41\x59\x1f\xf9\x42\xf4\x8a\x36\x17\x4e\xd5\x54\xa4\x4a\x8a\xe6\x3e\xf4\x21\xa3\x6d\x8d\x38\x1f\xe0\x0b\xf3\xba\x56\x8a\x26\x5c\xc6\x45\xa4\xc5\x4e\x16\xa8\x1a\x6f\x2f\xe0\x46\xdf\xeb\xc3\xa6\xbb\x81\x86\xda\x55\xcf\x7d\x4e\xbc\xa3\x9f\xfa\xcd\xd6\x33\xce\x81\xaf\xe7\xed\x8f\x9a\xde\x42\x56\x5c\x5f\x8e\x50\x00\xe8\xb2\x50\xb9\xab\x87\x54\xa4\xed\x00\x5a\x97\x51\xbf\xe5\x13\x07\x0a\x74\x88\x51\xc8\x16\xd0\x44\x1a\xb7\x92\xa1\x59\x74\xb9\x1d\x0d\x79\xa9\x31\xed\xa8\xf5\xc0\xde\x19\x3f\x55\xa8\x71\x81\xd2\xbf\x68\xf2\x83\x9c\x7e\xaa\x3b\x4a\x1c\x75\x75\x20\x96\x90\x52\xb4\xd4\x7b\x9a\x85\x23\xda\xa1\x33\x25\x6f\xa6\x20\xa8\x81\x05\xc4\xd7\x17\xa6\x86\x94\x84\xb3\x18\x31\x61\xb8\x02\xa7\xe1\xa3\xc6\x94\x69\x06\x4e\xc6\xa6\xd3\xf0\xb7\x43\x47\xfa\x78\xc6\xd3\x9b\x7f\x9b\xa5\xf2\x8b\xb3\xa0\x56\x66\xe8\xe6\xbb\x93\x0b\x36\xd9\x9e\x41\xe5\xf7\x79\xd3\x4b\x0c\x9a\x02\xe9\x91\x84\x31\xec\x16\xdf\xed\x80\x0b\x65\xf4\xf8\x2f\xca\x22\x89\x68\x22\x61\x82\x3b\xa0\x4e\x78\x6a\xf4\x5a\xbf\xd0\x92\xb2\x90\x9e\x17\xc1\x8e\xb7\xb7\xe1\xf4\x3a\xd7\x1d\x67\xe8\x85\xf7\x8b\xa2\x9d\xeb\x36\xd5\x2e\x47\xac\x65\x4d\x93\xb6\x4d\xa6\x8d\x1e\xce\x58\x84\x9a\x5e\xeb\xb8\x4b\xde\x0b\x87\x4a\xa8\x61\x9c\xa3\x6b\x5f\x94\x45\xb4\x87\x40\xa9\x70\xea\x86\x77\xb6\x28\x33\x70\x1c\x78\xf8\xec\xc4\x8b\xae\x8f\x70\xef\x1d\x7c\x66\x24\x58\x61\x4b\x0b\x6e\xf9\x17\xb3\x52\x32\x7d\x57\x0d\xbd\xbe\x1e\xed\xfd\x1e\xda\x31\x62\xcc\x02\x33\xed\x6e\x09\xdb\xec\xea\x24\x11\xab\x54\x34\x3c\x1f\x32\x51\xfd\x82\x1d\xd7\xb3\x67\x10\x4e\x6a\x6e\xd0\xce\x09\x41\xf9\x5c\xf0\xa0\x23\x0c\xdf\xe0\xe4\xb6\x6f\x6d\xa7\xc1\x1b\x6d\xb6\x3d\x5c\x2e\xfc\x17\x1a\x61\xa7\x56\x33\x8f\xca\x9a\x1b\xdd\x30\xb5\x9e\x1e\xa3\x19\x1a\x44\x59\x7f\x7d\xd9\x74\x91\x21\x24\x92\x48\x85\x5c\x2e\xca\xb0\x7d\x51\xa8\x62\xcf\x2c\x6c\x16\x30\x2f\xa9\x69\x17\x96\xf4\x6e\x30\x12\x7b\xb6\x77\x62\x3c\x4f\x67\xc4\xf5\x27\x79\x48\x2a\x36\xac\x90\xe7\x0b\xe6\x0f\xf3\xef\xa1\x17\x0c\x0b\x83\xc9\x03\xb7\x84\xc6\x2b\x3c\xe6\xb0\x8c\xab\xf7\xa3\xbb\x87\x6e\x75\x59\x05\x23\xc5\xc9\x3a\x5f\xfe\x85\x28\x3a\x5d\xbc\xb2\x75\x12\x00\x4f\x1a\x17\x45\xb8\x33\xbc\x0c\x37\xcf\xfd\x41\xc0\xbf\xb5\x1c\x59\x78\xe1\x8c\x96\xe9\x0e\x7f\xc5\xa4\x1f\x88\xd9\xd2\x53\xd0\x53\xfc\xc0\x64\x59\xc3\x01\x30\x06\xd5\xfa\x24\xd2\xd3\xc8\xdb\xbe\x59\x63\x84\x34\x0c\x4c\xea\x4d\x6a\x81\x4c\x23\xfe\xc5\x57\x70\x9d\xd1\x53\xe2\x30\xd1\xe1\xf3\x16\xd8\x88\xf5\x07\x30\x42\xde\x26\xa7\x3f\x0a\x5a\xb1\x60\x62\xb7\x00\xc1\xb9\x0c\x4d\x7c\x32\xc9\x87\x2b\x3f\xf4\x69\xf4\x79\x7d\x94\x30\xd3\x1e\x5f\x62\x16\x5a\x10\x3a\x75\x49\x8b\xa5\x47\xc5\xfd\x19\x99\x66\xbf\x6d\x56\xa2\x7c\x71\x47\x28\x02\x5b\x24\x87\x26\x75\x7b\x68\x13\x88\x51\x69\x3e\x5c\x37\x61\x5c\xd5\x0e\xec\x74\x77\xe7\x48\x27\x51\x07\x6f\x01\xc6\x4f\xa4\x53\x29\x4c\xa3\x20\xa4\x24\xe2\x16\x71\xc3\x18\x9e\xc7\xad\xde\x87\x51\x54\xb7\x88\x4d\xd6\x60\xc3\x7d\xf8\xa1\xd6\xd8\xa6\xa8\xff\xa2\xd6\x5a\xd2\x03\x18\x71\x42\xd9\xd3\x6b\x3c\xaf\xb3\x22\x6d\x36\xa4\xcc\x87\x86\x88\xd0\xa5\x7b\x94\x8f\x4d\x15\xd8\x3c\x86\xdb\xf6\x0b\xbe\xe2\x6d\x00\xbe\x72\xdf\x07\xf2\x5d\xaa\xdf\x07\xb2\x11\xf9\x35\x6f\x48\xc2\xe0\x75\xe8\xe9\x2a\x2b\x8c\xc7\x6d\x72\xae\x87\x4c\xf0\x45\x06\x97\x07\x16\x7c\xa0\xc0\xb4\x24\xf7\xde\x00\x3b\xb4\x23\x6d\x82\x43\xf7\x3c\x47\x5b\xcf\x23\x4b\x21\x70\xdc\xc4\x14\xd3\xc3\xf7\x2f\x3a\x44\x16\x27\xf1\x1a\x7a\x1a\x1e\xd7\x29\x79\x25\xc0\xf6\x7d\x0c\x76\x84\x59\x16\x98\x78\x4d\x6d\xb4\x71\x99\x02\x0e\x13\x58\xa3\xe0\x17\x83\xb6\x5b\xf2\xe9\x4b\xc6\x8a\xd3\xbc\xa4\xca\xd5\x9a\x3f\x09\xe9\x11\xca\xe8\x75\xe3\x62\xd1\xa8\xcf\xf3\x5c\xde\xb1\x56\x4f\x14\xbf\xc2\x63\xfd\x25\xe0\x31\x7f\xfb\x9f\xfc\x8b\xff\xf5\xfb\x8f\xfc\xf1\xdf\x74\x7f\x74\xfd\xb1\x3f\x0f\xff\xca\x1f\xf8\xa7\xff\xbd\x3f\xfe\x1f\xff\xe1\x7f\xf5\xaf\xfd\xf3\xff\xe6\x7f\xbe\xfe\x89\x7f\xe8\x3f\xf8\x93\x7f\x6b\x80\x87\xfd\x47\x7f\xdf\xdf\xf8\x3d\xb6\x9e\x79\xbb\xf5\x9d\x7c\xf4\xb5\x21\xca\x06\x07\x65\x61\x5f\x17\x74\xd8\x94\x7e\xa5\x06\xe4\xca\x82\x9d\x0c\x7e\x71\x14\xe3\x4f\xba\x15\x7f\xe1\x7f\xfa\xff\x7b\x78\xbf\xe7\x57\x98\x68\x46\xeb\x7e\x01\x13\x7b\x13\x15\xc9\x03\x94\xb8\x89\xfb\x67\x2f\xed\x02\x1b\xc9\xb2\x7b\x00\x7d\x3d\xc8\x7c\x2e\xb9\x7f\x5a\x1a\xf8\x99\xbf\xc2\x99\x18\xe6\xd3\xdf\xa4\x1b\xef\x9d\x51\xa4\x9e\xb0\x66\x1f\xbb\x35\x73\x81\x0c\xe7\xdd\x35\x35\x22\x54\x9a\x05\x2b\x62\x81\x3b\x3f\xff\x57\xd0\xa1\xa4\xa2\x33\x2c\xfb\xe4\x09\xe6\x26\x7c\xc5\x30\x5e\xaa\xa2\x55\x01\x6a\x45\xe1\xc0\x62\xf5\x38\x6b\x04\xcf\xbc\xb6\x54\x6b\x3e\x38\x8b\x33\xc2\xdd\x5e\xc0\xe1\xc1\x8f\xdb\x1d\x62\x58\x8f\x23\x7a\x8a\x3c\x73\x4c\x8f\x95\xe3\x72\xb5\xe1\xd9\x26\x03\x41\x2d\xeb\x3f\x19\xb6\xfd\xcc\x67\x91\xa3\x33\xb3\xe3\x4c\xa6\x68\x47\x36\x5e\xfd\xc4\xf8\x00\xb9\xa3\x19\xae\x52\x26\x71\xd9\xb5\xd6\x7b\x06\x69\xd8\x29\xaa\x7e\xb2\xdc\xfc\x99\xcf\x62\xa2\x8b\xdf\x44\x26\x18\x73\x41\x06\x03\xe0\xa7\x89\x82\xb7\xc6\x77\x92\x31\xe4\x8f\x68\xb5\x82\xbe\xca\x99\xe5\x19\x6d\xeb\x27\x1b\xa8\x9f\xf9\x2c\xe6\x4e\x80\x45\xa8\x9d\xae\xb9\xce\xc9\x40\x71\x33\x4a\x4f\x85\x92\x5d\xc5\x0e\xc5\x78\xef\xa1\xa1\x8a\x81\x51\x21\x7d\x90\xcb\x3e\x38\x0b\xfd\xb0\x40\x1b\xd4\x5d\xd0\xc7\x23\xe2\x40\x09\x30\xcd\x0d\x86\x43\x7b\x06\x57\xc3\x2c\xe7\x75\xbd\xa5\x74\x9c\x1a\x40\x09\xf6\x41\x5c\x30\xd4\x6e\x28\xa1\xdb\x40\x6e\x2d\x18\x74\x27\x76\x05\xfe\x91\x60\x45\x2e\x87\xa8\xd3\x30\xb3\xa7\x6f\xe6\x59\xc7\x57\xa6\xf4\x4f\x44\xf9\x9f\xfb\x2c\x4c\xe8\xcf\xf6\x4f\xe4\x6b\x27\x9b\x4c\xe3\x31\xb7\x37\x5e\x56\x1b\x01\x84\xeb\x45\xd0\xa2\x53\x92\x32\xee\x8b\x02\xa4\xf4\xa7\xc6\xf6\x67\x8e\x8b\xbb\xac\xe0\x0f\x9e\xf9\x82\x52\xc3\xae\x45\x72\xb4\x95\x33\x66\x84\xb0\xe3\x7c\x36\x32\x17\xc4\xfb\x6e\xb7\x49\xa3\x8a\xea\x9f\x94\x44\x7e\xee\x3f\x62\x40\xd7\xf6\x76\xe2\x9e\xf1\x66\xaa\xdb\xf2\xb0\xa4\x5c\x21\x9d\xe4\x01\xeb\x88\x12\x26\xcb\x28\xb9\x94\xda\xf3\x96\x9c\x7f\x32\xf2\xfb\x99\xcf\xa2\x5f\x63\xd4\x6b\xf4\x8e\xf8\x99\x6b\x49\x15\x4b\xf3\xdd\x57\x8b\xf8\xb8\xb0\xac\xdc\xc7\x0e\x8f\x0f\x78\x74\x97\x0a\xd8\xe4\x27\xb2\xe7\xcf\x7c\x16\x55\xba\xb8\xf9\xa6\x0e\x69\x67\x44\x55\x60\x65\x7d\xdf\x7b\xdd\xe0\xd4\xdc\x24\xde\x59\x50\xa3\xaf\x43\x7e\x68\x8c\xd6\xd3\x7e\x5a\x3e\xfb\xb9\xb3\x96\x1c\xcf\x88\xe1\xe6\x78\x6e\xd5\x50\x93\x1d\xba\x2e\xe6\xbe\xaf\x5f\x54\x50\xf4\x1a\x5a\xba\x7b\x4c\x24\x2f\xe3\xbb\x6e\xc6\xc8\x07\x5f\x21\x75\xa4\x8e\xc8\x5a\x52\x07\x3d\xc6\x26\x72\x99\xf1\xca\xf0\x78\x06\xdb\x6a\xdd\x4b\x62\x28\x78\x15\x89\x36\x0e\x17\xa6\x61\xf7\x83\xb8\x70\x9d\x4d\xdb\xa5\x9b\xa5\x6f\xb5\xab\xcb\x1c\x87\x97\xa0\x7d\x76\x63\xce\xb9\xc0\x10\x25\xed\xa1\x60\x0d\xe8\x24\x75\x1d\xb4\x2f\x5e\x76\xde\x52\x80\xad\xea\x22\x9e\x9a\x95\x33\x53\x8e\x5e\x9e\x53\x2c\x35\x68\x06\x8e\x3b\xcc\x0c\xf9\x71\x12\x14\xbb\x7a\xd2\x23\xfc\x22\x3a\xfb\x03\xe4\x0d\x6f\xb4\x44\x9a\x72\xf0\x3b\xcd\x04\xd4\xda\x9c\x57\xd4\x5c\x1b\x21\x83\xa2\xef\xb1\x65\x34\x81\x1d\x22\xca\xb3\x0f\xce\x82\x95\xd0\xba\xa9\xeb\x45\xa8\x5a\x7b\xf8\x75\xc3\x49\xf7\xbe\x41\xd7\x1d\x25\x6c\x4d\x2c\x04\x21\x65\xe5\xb1\xab\x24\x4a\xb3\x82\xf6\x8b\xaf\xc0\x10\xe1\xe4\x31\x4f\x00\x98\xa5\xc9\x89\xc9\xc7\x07\x79\x9f\x23\xb3\xd4\x44\x99\x71\xed\xd2\xde\x80\x88\x9a\xd9\x18\xf9\xd3\xb8\xef\x67\x8e\x8b\x80\xba\x7b\xd2\x2b\xb1\xf7\xaa\xa1\xb5\x5e\x13\x27\x29\x2a\x08\x46\xd4\xc1\x1b\xec\xb9\x92\x21\x3f\x1e\x76\x8a\x37\x0e\x32\xfd\x64\x14\xfc\x73\xd7\x9d\x62\x13\x93\xc6\x0b\x45\xee\x46\xe0\x8a\x12\x16\x62\xaa\xf0\x94\x9d\x70\xa4\xa9\xbd\xf5\x3e\x84\xd0\xe3\x12\x69\xa5\x8a\x29\xe2\x17\xf9\x22\x83\x63\xdc\x09\x80\x94\x4e\x1c\x55\x48\x96\xf2\x54\xbf\x50\xd5\x48\x97\xcd\x11\xdb\x6b\xef\xb7\x76\xc4\x7a\x55\x11\x4c\xf0\x41\x3f\x42\xb1\x57\xfb\xa9\x49\xe1\xf8\x70\x24\x29\x9c\x12\x3f\x76\x1b\x7d\xa1\xce\x9d\xce\xa0\x2a\x93\x1c\xd5\x1e\x46\x96\x49\xe4\x51\xcb\x17\xd1\xc9\x4c\xd1\x62\x99\xea\x1c\xbe\x4f\x24\xaf\xe9\x73\xb2\x93\x13\x4c\x28\x17\xd1\x2d\xba\x50\xb8\x06\xf4\xcb\xcb\x2f\x3e\xb4\xfd\xc4\x82\xfa\xb9\xbb\xa2\x84\x55\xdf\x42\x35\xb8\x2b\x09\x9d\x2d\xa7\x6f\xe2\x04\x57\x5a\x3a\x7a\x3b\xcd\x14\x70\x4a\x5f\x0d\x50\xe6\x21\x3a\x09\xc1\x17\xfd\x48\xb4\xcc\xcc\xb8\x99\x2e\x2a\x60\x22\x4b\x47\xb2\xbe\x3b\x90\xf7\xf4\x03\x61\x09\x6f\x3c\xc5\xe9\x3b\xe5\x8f\x37\xce\x1b\x11\xf9\x17\xd1\xc9\xe8\xe8\xa2\x2b\xe4\xc5\x1e\x45\xa3\x86\x29\xe2\x9d\x70\x53\x4a\x6e\xb0\x87\x63\x22\x95\xe2\xbd\x5c\x93\x39\xb3\x79\x05\x62\xe0\x83\xe8\xd4\x40\xec\x26\xe6\xce\x03\x72\x4b\x4a\x6a\x41\xe2\x47\x42\x00\x76\x18\x48\x09\x8e\xfa\x93\xd9\xdd\xb2\xd4\xd2\x99\x94\x73\x9d\x2f\xea\x4e\xcb\x32\xa9\x0f\x6e\x40\xdb\xba\xb1\x75\xc7\xfb\x41\x22\x5b\x4f\x25\x31\x34\xa8\x44\x8a\x47\xb0\x57\x75\xc3\xc6\x9d\xe3\x3e\xf5\xff\xeb\x04\x7e\x09\x78\xfc\xcd\x3f\xf5\xd7\x85\xb8\xf2\xf7\xff\x3d\xff\xe2\xff\xf9\x67\x7e\xeb\xdf\x5e\xff\xd9\xef\xfc\x95\xff\xe5\xaf\xfe\x73\xff\xca\x7f\xf1\x4f\xfd\xb1\x3f\xf2\x87\xfe\xfc\xfd\x4b\x7f\xe0\x2f\xff\xfc\x80\x07\xe5\xbd\x78\x5e\x58\x0c\x8b\xef\xb1\x9e\x6a\x28\x00\xe5\xc9\x6e\x26\x6e\x02\xa2\xd4\xa5\x76\xa3\x49\x92\xda\x9a\xcd\xea\x50\xfb\x0f\x7e\x21\xa3\xeb\x19\x59\xc5\x1c\x8f\xa0\x5d\xb2\x87\x18\x5b\x9c\xf1\x5c\x58\x2f\x58\x62\x34\x66\xe5\xad\x21\xca\x6d\x02\x1d\x06\x9a\x85\x2f\x9a\x39\x0e\x48\x7e\x16\x7e\x77\x33\x28\x4d\xbd\x30\x07\xd2\x70\x06\xa4\x3d\x17\xf4\xa4\xae\x62\xa0\x15\x35\x4a\x3c\x8b\x3b\x3a\xe0\x4f\x92\x77\x3f\xf3\x57\x80\x20\x5a\x10\xd1\x0e\xcf\xe4\x98\x21\xeb\x70\x2f\xcb\x6b\x25\x5e\x90\x17\x71\xe2\x83\xab\xa6\x34\x5e\x1a\x7c\x11\xf5\xfa\xfa\xc1\xd5\xa6\xc4\xba\x98\x7c\xe6\x94\xd3\x7c\x08\x12\xca\x35\xc4\xa3\x80\x0c\xf6\x10\xd5\x03\xdc\xec\xfd\x2d\x0e\x4d\x7d\x1a\xa9\xdb\x89\xf3\x45\x63\x1b\x31\xba\xa6\x72\xb2\x43\x09\xf7\xe9\x26\x78\x86\x09\x22\x8f\x6c\x6c\xa8\x6b\xba\x29\xef\x7c\x68\x08\x4e\x90\xfd\xd4\xd8\xb6\xfd\xe2\xe1\xb1\xa3\x3b\xc5\x59\xa7\xbd\x16\x4b\x59\xae\xfa\x12\x58\xd2\xcb\x84\xf7\x99\x39\xa2\x47\x87\xe2\x95\xb3\x5f\x4b\x36\xe2\xd4\xc3\x2f\x12\xcc\x7a\x16\x74\xf0\xea\x91\x87\x9b\xb2\xaf\x4e\x71\x30\xb9\x47\x02\xac\x0e\x5c\x22\x6d\x6d\x3d\x82\x4e\x78\xce\x33\x79\x9d\x1e\x7e\x10\x9d\xd4\xb9\xc8\x88\x20\xe6\x0a\x6c\x12\xc5\x21\x89\x59\x91\x82\xdd\x0f\xad\x4f\xa4\x74\x8e\xaa\x6b\x36\x0d\xd1\xa2\x53\x07\x4f\x66\x1f\xb4\xd7\xb4\xa6\x16\x47\x63\xdb\x1c\xa4\x22\x03\x08\xd2\xd9\x1f\x8d\x85\x4d\x27\x8f\x96\x17\xac\xce\x6a\xfb\x34\x79\x31\x7e\x17\x7c\xd7\x27\x85\xea\xf0\xd8\x5f\xe6\xd3\xe3\xa8\xb3\xab\x77\xfd\x88\xe9\x13\x3a\x40\xd0\x7b\x48\xbc\xf0\x6c\x29\xf8\x41\x94\xf0\xd7\x8d\xbc\xc4\x6d\x5f\xc4\x45\x15\x4f\xd9\x81\x16\xee\xe8\x4c\x13\x93\xa1\x66\x95\x1e\x70\xa3\x1e\xb9\x03\x16\x9a\xaa\xfc\x3e\x05\xd6\x16\x03\xb6\x52\xd8\xfd\xc1\x1d\x79\x0e\x72\x40\x57\x6a\x4c\xbc\x10\x4b\xc2\x90\xd1\xe1\x8c\x78\x8c\x84\x85\x0d\x31\x6f\x1d\xc0\x60\xfa\x8e\x08\x23\xdc\x89\xf6\x2f\xfe\x08\x25\x50\x50\xa2\x40\x0e\xca\xfa\xc5\x97\x72\x54\xcc\x46\x40\x7f\x50\x73\xeb\x05\x87\x53\x57\xb9\x43\xf0\x0a\x5f\xd9\xc2\x99\x7e\xd1\xcc\xb1\x19\xa9\x75\xca\xbd\x32\x32\x44\x67\x2f\x8a\xed\x58\xc2\x63\x65\x05\x5d\xfa\xc2\xb6\x43\x5c\x17\xc4\xad\xb2\x5b\x67\x0b\xe9\x17\x25\xe2\x9b\x2c\xf3\x9d\x6b\x22\x2b\xd8\x55\xaa\x97\xb5\x0e\x70\x17\x80\xf0\xbc\xd1\x1c\xca\x0e\x3e\xfb\xc6\x2c\x11\xe9\xd8\x23\xff\x5f\x53\xc3\x9f\xfb\x4d\x8d\x82\x8a\x0c\x2b\xdb\xc5\x75\x04\x56\xb1\xa7\xd7\xb5\x1c\x77\x76\xc7\xa6\x04\xe1\x2c\x73\x1d\x73\xd9\x37\xf4\x00\x30\xf1\x1f\x34\xf9\xd4\xe7\x40\x54\x97\x3e\xeb\xc2\x91\x0e\x38\x0a\xf9\xc4\xe4\x1e\xfb\x60\x12\xa1\x66\x4f\x07\x9a\x5a\x71\xaf\xd5\xf0\x48\xac\x1a\xff\x22\x2e\x42\x98\xbc\x39\x29\xb9\x4a\x07\xbe\x56\xc4\x16\x1b\x16\x3b\xd1\xc4\xe1\x33\xbc\x85\x27\x6a\xd5\xb5\x29\xa7\xd4\x90\x53\x1f\xe5\x0b\x20\xcc\x1e\x84\xe9\x5d\xda\x6f\x07\x72\xbc\x1d\xdb\xba\xf6\x7a\x54\xdf\x3b\xfe\x78\x50\x00\xa2\x77\x05\x3b\x6d\x7a\x51\x8b\x41\x1f\xfa\x01\x58\x4c\x5d\x73\x00\xc8\x2d\x1d\x3d\x6f\xdf\xcd\xaf\x06\xaf\x72\xa7\x46\x0f\xbd\xf0\x54\x9f\x37\x67\x7e\x45\x9a\x6a\x5e\x45\x17\x4e\xed\x8b\x2a\xa7\xca\x07\xa4\x7d\xd1\x09\x2f\x85\x10\x60\xa5\xbb\x6e\xe8\xe0\xcd\x97\x70\xfb\x94\xa6\x08\x22\xc4\x66\x10\x14\x08\x5a\xa8\x5c\xbf\x18\xb4\x31\xa4\xd2\xc2\x95\x81\x37\xea\xa2\x16\x78\x32\x94\x85\x5f\x3f\xb5\x3d\x56\xfd\x3f\xb4\xfd\x5b\xc8\x47\x5f\x9c\x17\x0c\xbd\x81\x41\x6f\xa4\x56\x0e\x21\x68\x06\x49\x6a\x66\x39\xae\xc3\x5e\x03\x41\x11\x81\xa8\x89\x58\x37\x62\x43\xe8\x3a\x9f\xcf\xa7\xbd\x96\x16\xc5\x84\x8d\x11\x99\x08\x4a\x56\x84\x4e\x29\x5a\xda\x14\x99\x48\x49\x64\x20\x49\x4d\x41\x51\x48\x68\x09\x1e\x2a\x50\x33\x08\x53\x23\x8d\xff\xa8\x20\xcc\x7b\x39\xfb\xfa\xb9\x79\xf8\xed\xbd\xbf\x87\xcf\xe9\xab\xae\xca\x18\xc8\x65\x9c\x92\x6d\x21\x7d\xf1\xfe\xe7\xa9\x6d\x3f\xcf\xbf\x45\xf6\xf4\x4e\x81\x86\xc8\x49\xef\x21\xf2\xbb\x79\x8f\x83\xda\xc9\x05\x69\x1b\xa7\xa1\xe3\x0b\x2a\x3d\x92\xc3\xc8\x3d\x94\xa9\x7e\xb1\x09\xe4\x51\xc6\xd1\xa6\xa2\x05\x9f\x7e\x78\xa1\xf3\x04\x19\x76\x04\x59\xeb\xe8\xc3\x44\x96\x32\x09\x5e\x64\xc1\x7b\xd4\x4c\x2c\xd5\x2f\x66\xf0\x30\xfd\xdc\xea\xaa\xe6\x6b\x3d\x72\xe0\xeb\x28\x1f\x8b\x54\xc4\x75\x3a\x9a\xcf\x9b\x3b\x7b\xa6\xce\xd9\xb8\x5c\x99\x4d\x0e\x7e\xd1\xd9\xdb\xaa\x14\x96\xa7\x0c\x44\x02\x90\xad\xe0\x25\x35\xe5\x04\x19\xa5\x1d\x1e\x8f\xba\x96\x35\xbd\xda\x80\x06\x49\xfb\x82\x02\xc1\x17\x60\x71\x12\x2f\x67\x52\xc3\x9d\xb7\x4b\x6b\xcd\xd8\x6f\x51\x88\xba\xf3\xa0\x5b\xc6\xca\x00\x94\xe7\x41\x62\x49\x52\x56\xd5\xc3\x0b\xff\x05\x95\x81\xa0\x72\x1b\x3a\x1e\xe3\xe3\xb7\x2f\xb0\x80\x93\x8e\x0f\x65\x0f\x5e\x94\xb5\x38\xcb\x54\xb1\xe8\x40\x23\xf1\x32\x15\xed\x39\x9f\x74\xb3\x07\x3d\x03\x42\x46\xae\xa1\x2a\xcc\xa1\xcb\x3c\xb5\xbd\x98\x05\x59\xf0\xac\x3f\xac\xf6\xea\xb5\xfa\x30\x7f\x7e\xb6\xa0\x04\xfb\xc5\x26\x00\x4f\xcc\x92\x61\x38\xbb\x8b\x6c\x73\xcc\xe6\xa2\xa0\x94\x12\xf4\x78\x33\xae\x0b\x27\xbc\xc2\x13\x27\x9c\xc3\x71\x48\x17\xe7\x9f\xd0\x3a\x96\x8b\x1c\x93\xdd\x86\x16\x41\xac\xf6\x48\x67\x23\xe8\x0b\x8b\x40\xe4\xf5\x8b\x1d\x21\x45\x31\x9b\xe6\x47\x22\xd7\x69\xf0\xf9\xe7\x00\x1e\x7f\x14\xfe\x3b\xcd\x7f\xff\xff\xf4\xd7\xff\xd9\x9f\xfe\x93\x7f\xef\x7f\xf1\x9f\xf8\x23\xe2\x77\xff\xa9\x7f\xf7\xff\xfd\x97\xff\x47\x7e\xfd\x7f\x09\xfe\xff\x7e\xea\x27\xfe\xd4\x9f\xf9\x25\xff\xeb\x9f\xf9\x00\xf0\x48\x29\x9e\x89\xae\xae\x55\x60\xa0\x90\xf2\x0a\xb0\xa7\x69\x70\x5b\x36\x12\x31\x35\xda\xb3\x03\x7a\xdd\xb9\x82\x89\xc4\xc4\xf8\xe7\x82\xa5\x9f\xe7\x1f\xcf\x73\x3f\x5c\xb1\xfe\x6d\x3c\x29\x18\x31\x4b\x97\xec\x0a\xd6\xf4\x4a\xb4\x51\xf5\xe9\xc2\xa3\xcc\xdb\x30\x20\xb3\xc0\x68\x3b\xf9\x0b\x74\xb9\x85\xe9\x59\x59\xb2\xf0\x14\x8e\x55\x34\x54\x86\xb0\xcf\xe0\x49\xaf\x7e\x6f\x84\x58\x00\x00\x5a\xdb\x3c\xbf\xe5\x79\x5e\x7f\x3e\x80\x5d\x68\x7c\x51\xe1\xdd\x28\x94\xb8\x02\x83\x1a\x55\x92\x6a\xa9\xad\x89\x63\x36\xe2\xdd\xde\x52\x38\xd1\x2a\x6d\xd4\xb3\xaf\x15\xb8\x7f\xc0\xcc\xd1\xc8\xf2\xb4\xcc\x80\x63\x6e\xdd\x68\x29\x43\xc8\xed\xbc\xc1\x31\xc3\xee\x8f\xe2\x8f\x40\xd8\xdc\x61\xa9\x69\x75\x67\x36\x84\xdb\x5f\x8c\x45\xa5\x37\x46\x12\x0d\xfd\xc9\x4e\xd1\x36\x6d\x83\xf8\x20\x83\x39\xf0\xe0\x44\xe3\x4a\x03\xf4\xbd\xf4\x67\x8f\x2c\x82\xa0\x0d\xfc\xe2\x89\x94\xa9\xc5\x48\x03\xf3\x21\x98\x6f\xb3\xbe\xee\x62\x2d\x98\x3a\xfb\xa9\x1d\x40\x80\x98\x2c\xe0\x86\xa5\x73\x52\x67\x94\xbc\xd8\x07\x48\x3b\x85\x50\xb7\xcb\x6f\xb5\xb8\x8c\x65\xf6\x10\x71\x9c\x1f\x0a\xdb\x79\xaf\x13\xd8\x8d\x57\xe2\x61\xde\x97\x75\xe1\xdf\x4a\x5d\xa7\xe0\x8b\xd5\xe1\xd6\x3e\xd2\xb8\x45\x01\x63\x3b\xab\xa6\x5a\x4d\xb2\x98\x15\x58\xc3\xfd\x0a\xb3\xba\x89\x61\xe4\xee\x4e\x00\x59\x56\x38\x8a\x0f\x96\x39\x6a\x6a\x7d\x01\x2a\x05\x9c\x90\x88\xa0\xcc\x79\xf2\x8e\x23\xc4\x09\xe7\xf8\x12\x95\x10\xf3\x9e\x01\x61\x9b\x51\xb9\xd8\xc8\x3c\x5f\x7c\x23\x64\xef\xaa\x99\xa6\x16\x3e\xe5\x4e\x23\x8e\xd1\x72\x0f\x00\xdf\x43\x52\xba\xda\x0a\x04\x5f\x90\x96\x28\xbd\x63\x2f\xa8\xf6\xfe\x8b\x35\x0a\xe9\xe4\x97\x19\x87\x5a\x0c\xaa\x0c\x11\xdb\x2b\x58\xcd\x90\x46\x3a\x73\x27\x8d\x36\xed\xbc\x2e\x63\xf5\x87\x18\x41\x35\xb2\x5f\xf0\x40\xd7\xa2\x6c\xba\xb5\x7a\x03\x8a\x9e\x76\x9e\x19\x3d\xae\x1a\xca\x93\xa1\x1c\x4d\xa1\x41\x89\x4c\x90\x32\x80\xed\x16\x5e\xe5\xf6\x85\x16\x2b\x68\xe5\x07\x3f\xb7\xf2\x19\xe8\x3b\x03\x0f\x91\x02\xb1\x40\x42\x17\xc9\xa9\x46\x1c\xaf\x4f\x75\x26\x09\x74\x56\x31\xbd\x9a\x7f\x01\xbb\x58\x29\x1f\x20\xba\x8a\x00\x8b\x19\xeb\x7e\xc5\x2c\xe6\xbc\x98\xb6\x1b\xb3\xec\x95\xf4\x68\x62\x24\xa4\x0e\x69\x84\x18\x4c\x7c\xc1\xa1\xd3\x61\x39\x61\x56\x99\xd0\xcb\x25\x82\x77\xc0\xda\xd5\xce\xa6\x71\x2a\xaa\xda\xea\xb4\x94\x14\xf3\xa4\x15\x28\x89\x96\xcf\x43\xbf\x78\x22\x30\x48\xe7\xb0\x4f\x15\x3e\xe6\xd9\x90\x2e\x70\x0e\x9b\x0c\xc9\x3d\xbd\x5b\x93\x10\xec\x37\x0f\x33\x24\xeb\xeb\x4e\xc0\xea\x4f\x3a\x3b\x5b\x9a\xcc\x98\x8b\x79\x93\xab\x96\xc2\xac\xb6\xd5\x97\x2c\x78\xf2\x21\xdb\x0c\x84\xde\xb5\xaf\x0d\xad\xec\x83\x02\x55\x89\x7e\x00\x35\xd0\x98\xa1\x89\xe7\x3e\x68\xbf\x3e\x92\xb4\xab\x3d\x82\x19\x71\xe7\x96\x7d\x1c\x14\xca\x52\xe3\x8e\xfb\xbc\xba\xbc\xbe\x4d\x19\xfb\x07\x3d\x95\x3d\x24\x96\x16\x1c\x98\x71\x44\x7f\x99\x2c\x9e\xf7\x00\xb7\x4d\x62\x9a\x26\x73\x5f\x6f\x30\xa9\xcb\x68\xf5\x2a\xba\x1d\x46\xe1\x17\xab\xc3\x60\x5c\x66\x0e\x0d\x4a\x03\x21\x02\x4c\xd4\x3a\x3c\xa8\x3e\x1a\xdd\x31\xc0\xee\x07\xaa\xed\x91\x20\xc5\x6c\x83\x5d\x0a\xd9\x7d\xa1\x6a\x40\x91\x5a\xf7\xbc\x13\x6d\x44\xf2\x5e\x98\x9c\x8b\xe8\xb4\xc5\x6d\xe3\xe4\xa3\x4e\x73\x7e\x5d\xf6\x72\xd8\x21\x80\x49\xd7\xcc\xbf\xd0\x37\x7b\xca\x9e\xc8\x84\x11\x84\x84\xac\x17\x0c\xeb\x46\x2e\x2e\x9d\x22\xdd\x34\xa6\xa5\x4a\xcb\x74\x62\x9d\x5b\xd3\xbd\xa0\x4d\xf4\x0b\x2d\x56\x3a\xae\x77\x09\x04\x26\x7a\x3f\x1d\x06\x6c\x46\x96\xfa\x8c\xba\xe7\xa6\xec\x7d\xc0\x59\xa0\x36\xf0\x2c\x9e\x54\x01\xd8\xbc\xec\x8b\x2f\x75\x07\xfe\x58\x68\x26\xe1\xa0\x0b\xb7\x65\x38\xc2\x9f\x4a\x81\x71\x2b\x5f\xf0\x1c\xb8\x43\xde\x40\x68\x70\x9f\x60\x1d\x1a\xba\x7d\xd1\x53\x1b\x25\x5e\x55\x86\xac\xa4\x56\x70\x5c\x92\xc0\xef\xd1\x90\xbe\xa4\x62\xdf\xb0\x11\x76\x29\xc5\x6b\x93\xd9\x2c\x63\xc4\x0c\xf0\x93\x3e\x32\x09\xd3\x66\x96\xd2\x76\xf3\x5b\x02\x12\x07\xe5\x29\x71\x68\xf5\x2e\x4d\x69\x0d\x18\x5b\xbe\x27\xf6\x1a\x1d\x83\xc9\xd9\x7e\x01\xbb\xa0\xfe\x3a\xa7\x32\xed\x0d\x31\x01\x9f\x3a\x62\x5c\xae\xb5\x34\x65\xc6\xe6\xa6\x49\xd8\x9b\x80\x8b\xb0\x3d\x6c\xe7\x83\x46\x3a\x5f\x10\x2a\xcd\x80\x3a\xa2\x12\x14\x99\x36\x34\x5e\x02\x9d\xe6\x4d\x16\x58\xe1\x12\xd7\x4e\x7b\x3c\x79\xa5\x64\x14\x99\x27\x6c\x1d\x6f\xf8\x62\xca\x69\x6a\x76\x4d\x78\xc8\xf6\xd0\x4a\x72\x54\x91\x42\xff\xf6\x3c\xa9\x48\x45\xab\x75\xae\x03\x79\x3c\x02\x27\xcd\x5f\x1b\x16\xf9\x82\x8c\x66\x8d\x41\x2d\xa8\x61\x4b\xe5\x57\xf8\x1d\xa6\xf5\x09\x9f\x37\x9b\xd6\x9f\x6b\x4f\x98\x92\x9d\x48\xa7\x1e\x1b\xac\x57\x76\xad\xe1\x17\x2a\x28\xca\x67\x90\x82\x5c\x87\x35\x44\x22\x57\xd9\x98\x83\xab\x61\x12\xb3\x39\xad\x1b\x7e\x7b\x36\xe2\xd2\x55\x54\x27\xb6\x1c\xfb\x6f\xa0\xf0\xf8\x5d\x7f\xe5\x6f\xfc\xb6\xf2\x37\x7f\xec\x97\xff\xd9\xff\x10\xff\x0d\x3f\xfe\xbb\xcf\x5f\xfa\xa3\x7f\xe1\xff\xf9\xfb\xde\xbf\xf5\x6b\xff\x07\xff\x9f\xdf\xf6\x6f\x75\x7f\xe2\xbf\xfb\x0f\xfe\xc9\x07\x96\x16\x6e\x02\x6e\x82\xf9\x3b\xc5\x5a\x4b\xd4\xb1\x11\x4d\x89\x0c\x41\x56\xcb\x32\x95\xad\x7a\x79\x01\x24\x8d\xb3\x15\x74\x8d\x8e\x7e\xd1\x78\x18\x35\x29\x05\xf8\x56\x11\x1e\xf5\xda\x70\x25\xf2\xb6\x02\x46\x61\x64\x6f\x1d\x59\x83\x82\x90\x8a\x26\xc7\x26\xf1\x4c\x8a\xba\x0f\x3e\x2a\x3a\xd8\x38\x39\x70\xba\xaf\xe9\x61\x4d\x39\xce\x56\x46\x5c\x43\xe2\x22\xb0\x1b\x01\xe4\x75\x46\xac\x37\x76\xd7\x64\xdc\x56\xf6\x0f\xf4\x04\x74\x12\x06\x36\x2d\x31\xa8\x38\xfa\xdd\x94\x81\x38\x5e\x16\xdc\x3b\x52\x15\x82\x44\x4f\x81\x48\xe9\x39\xf4\x5d\x87\x62\xac\x80\xfb\xa2\x09\x13\xb0\x40\x99\x4b\xee\x07\x18\x2a\x09\xb9\x8f\x1c\xe5\x20\x67\xe1\x1b\x53\x7b\x8e\xd7\x7a\x6d\x28\x68\x7d\x77\x60\x74\x32\xf5\x85\x75\x81\x3e\x68\x70\x44\x3a\x4e\xb7\x72\xf1\xe0\xd4\xe6\xc8\x5e\xb2\x07\x2c\x50\xa9\xa5\x9b\xef\x0c\xd9\x80\xbb\xb3\x5a\x93\xe7\xe7\xdc\x2f\x0a\xcc\xbc\xcc\x22\xbb\xfd\xd5\x67\x07\xbd\x9f\xad\x61\x76\x3b\x71\xe7\x16\xec\x94\x30\x9a\xa6\xb4\x2e\x24\xf2\x3a\x2d\x1c\x6e\x8a\x7e\xc1\x03\x55\x97\x6b\xf6\x9a\xdd\x51\x24\x68\x55\xaf\x18\xf5\xc4\xc0\x66\xd3\x1b\x22\xb8\x36\x1a\x9b\x29\xcc\x9f\xcc\xf7\x53\xd8\x95\x5f\x08\x1c\xa9\x35\x0b\xbf\x45\x1b\x7f\x39\xbc\x4a\x83\xf7\xb1\x46\x3a\x5b\x51\xd8\x3a\xcd\x81\x54\x55\x85\x87\xd6\xcd\x04\x39\xcf\x48\xaa\xfb\xe4\xb7\xf0\x66\x63\x1d\x96\x40\x64\xf8\x59\xa9\x11\x14\x76\x44\x0d\x9f\x97\xab\x23\x33\x71\x75\xe1\x0c\xac\xf0\xdb\x27\x63\xe9\xf9\xc4\x4c\x22\xb5\x93\x5b\x35\x67\xee\x0a\xb4\x74\x57\x4b\xc4\x69\x49\x68\x9e\x10\x9e\xa0\x7d\x6f\xfb\x79\x5d\x77\x66\x86\xeb\x2b\x57\xff\x22\xf3\xe7\xe7\x9d\x2b\x7d\x33\x65\x2b\x39\x40\x2c\x69\x08\x11\x1f\xed\x6b\xef\xe4\x65\x7a\x2a\x75\xd6\x1c\x55\x60\x95\xa2\x82\x8b\x36\x1f\x2d\x3f\xa9\x17\x6e\xd3\xd1\xdd\xc3\xdf\xa6\xde\x0d\x51\x94\x30\x71\xdf\x68\x59\x6f\x0e\x9a\xa9\x0c\x84\x02\xef\xc3\x52\xc0\x98\xa3\xae\xb9\xfb\x44\x28\xdf\x9c\x5c\x99\xd5\xa2\x97\x49\x9a\x0e\xc0\x5d\x12\x6d\xed\xd6\xdc\x1a\xce\xee\xce\x68\xdf\x8e\x36\x3d\x1f\x43\xb4\x9e\x89\x7d\x62\x69\x11\x35\xfb\xe0\x28\x53\x76\x60\xa7\x80\x27\x98\x23\xcd\x1f\x8b\xe9\x12\x75\xbe\xdc\x09\x48\x69\x26\x18\x54\x69\xd5\x1e\xe6\xf9\x64\x75\xb0\xb4\x99\x13\x11\x26\xe5\xe9\x48\x02\x0e\x1f\xdb\x28\xcc\x3d\x1d\xdf\x91\x78\x91\x91\x78\x57\x41\x72\xcd\xdc\x3f\x9a\x09\xf2\x89\x08\x98\x0b\x67\xcb\xc5\x1a\xc8\x5a\x2d\x83\x55\xae\x7e\xb9\x54\xa7\xd6\x97\xaa\x9d\xfd\xbb\x64\x66\x89\x3e\xbe\x0f\xd3\x87\x7c\x16\xfd\x02\xa6\x0d\x36\xf5\xfb\x44\x6c\x3a\x34\x9d\xc0\x55\xfa\x8e\x1a\x83\x37\x37\x7e\x60\x7d\xae\xa1\xbe\x32\x36\xab\xdf\xef\xdc\x2f\x84\xf0\x7c\xc0\xa1\xb3\x9d\xdf\x95\x99\xbc\xb8\xd8\x2a\x4a\x78\x6f\x9c\x44\x58\x72\x9b\x21\x88\x97\x70\x9e\xf5\x28\x6f\xcf\x98\xba\x9b\xa1\x95\x06\xfd\x0b\xb0\x98\xfa\x6a\x49\x29\x3a\x07\x26\x36\xc5\x75\x44\xc3\x97\x94\xd4\xb9\x19\x1f\x8f\xce\xda\x95\x6f\xd1\x39\x9b\x26\xe6\x4a\x50\xf8\x02\x76\xa1\xb4\x71\x67\x5c\x24\x4f\xce\x2e\x39\xc7\xfa\xab\xa9\xc5\xd8\x1b\xed\x66\x57\x9d\xc0\xde\xdf\xaa\x13\x38\x87\x9c\x97\xdf\x40\xc7\x17\xbf\xc5\xf0\x2a\x49\x76\xce\x6e\x8d\xd3\xf7\x39\xac\xcf\x0c\x9b\x2c\xf6\x21\xce\xdd\xf4\x1c\x13\xd7\x65\x6f\xba\xcd\xb4\x77\x6d\xb9\xd8\x17\x7a\x02\x6d\x77\x61\x18\xab\x3e\xa2\x79\x04\xb5\x8a\x5b\xa0\xfa\xbb\x9a\x04\x46\x25\xe9\x52\xa0\x05\x46\x04\x9b\xc0\xc5\x0a\x35\x6a\xff\xc0\x32\xcb\x46\x3c\x0c\xf4\x76\xb7\xd7\xad\xbd\xd7\xe8\x28\x92\xce\xb7\xfb\x1d\x75\xc8\x19\x96\xbc\x8d\xf1\x25\x47\x16\xd7\x5b\xa7\x40\xfc\x83\xaa\x45\xe3\x75\x09\x26\x63\x5d\x79\xb0\x90\xd4\x55\xcf\x5b\x34\xf1\xd9\xad\x54\x28\x0e\x4e\x72\x50\xf3\x86\x4d\x74\x00\x15\xaa\x85\xeb\x17\xf6\x61\x1c\x16\x2f\xcc\x03\x92\xde\x22\xcd\x4a\x33\xcd\xca\x30\xc9\x23\x90\xdd\xfd\xc8\xeb\xb8\x27\x41\x27\x34\xec\x31\x95\x56\x5b\xfb\x60\xbe\x60\xa3\xd1\x88\xc8\xf5\x15\x12\x8d\x6f\x90\xeb\x80\xd7\xaf\x9f\xbd\x2d\x84\xde\x2d\x70\x78\x7d\xed\xeb\x9d\xa3\x96\xce\x6c\x17\x10\x7c\x01\x84\xbd\x79\x8a\x97\xa6\x5d\xcf\xb8\x20\x54\xfc\x28\x74\x97\xa6\x32\xc3\x11\x74\x24\x17\x40\x47\xa9\xef\xc5\xab\x2e\xa2\x4d\x46\xf5\x2f\xd4\xf7\xd6\xa2\x7b\x1e\x3d\x7d\x29\x8d\x69\xef\x6a\x52\x6e\x8f\x42\xd1\x0b\x76\x1e\xc6\xc8\xc2\xd6\xc1\xb7\x82\x41\x7c\x88\xab\x48\xf0\xc5\x86\xe8\x07\xb2\xf6\x9d\xa5\xb6\xa9\xba\x9c\x93\x77\x25\xd9\x9b\xfb\x62\x8e\x07\x85\xe3\xb4\x1b\x2c\x13\xe9\x3d\x9b\xe2\x58\x49\xfd\x62\x5b\x66\x8a\x27\x84\x32\x6c\x61\x8a\x37\xcb\x8e\xc6\x2a\xb5\xa2\x96\x58\x12\x3a\xec\x0c\x34\xa9\x3b\x38\x45\x75\x2a\x20\x7b\xd2\xa6\x50\x5f\x00\x61\xfa\x91\x7c\xcf\x68\x8f\x93\x68\x2d\x60\x72\x78\x5f\xf9\x06\x39\xe7\x3a\x1a\x69\xc1\xd2\x0c\x9c\x35\x5a\xa1\xb1\x7c\x9e\xf2\xaf\x6c\x02\xff\x12\xf0\xf8\x4f\xff\xe9\x3f\xf7\x93\xbf\xec\x3f\xf6\xe3\x7f\xef\x0f\xfc\x9d\x5f\xf8\x13\xfb\xd7\xfc\xd2\xff\xe1\x4f\xfc\x5a\xf6\x1f\x9c\xbf\xfa\xaf\xff\xc5\xbf\xf2\xab\xfe\x53\xff\xf8\xbf\xf2\x33\xbf\xbe\x7c\x00\x78\x20\xdb\x1e\x47\xb8\xb1\x45\xfb\xbb\x9c\x38\x37\xe8\x1e\x63\xeb\xdb\xb3\x1b\x5e\xd3\xeb\x2b\x45\x1f\xe0\xa5\x88\xf7\x96\xf0\xae\xe8\x8b\xc5\xd6\xbd\x2c\x37\x9b\xa8\xd1\x0e\x79\x06\xb4\xbe\x14\x1f\x48\x2d\xaa\xc3\xc1\x93\x7c\x6d\x6b\x20\x2c\xfd\x21\x1b\xf7\xae\xd8\x17\xa2\x3e\x46\x51\x0c\x88\xf9\xdd\xf1\x9e\x6f\x00\x8c\x22\xe0\x77\x7b\x7a\x42\xfc\x4d\x37\xef\x41\xd3\x64\xc3\x63\x62\x66\x5c\xbd\xd1\x53\x3f\xc0\x75\x99\x75\xa0\xd3\xbd\x03\x7a\xba\xb7\xec\x00\x03\x01\x54\xca\x1e\xd8\xd6\x99\x9d\xcf\x8e\xc1\x5a\xb4\x79\xb5\x93\xd4\xfa\xb2\xf3\x85\xd3\x97\x42\x16\xf3\x5b\x97\x43\x5d\x78\x82\x0e\xda\x9e\xd3\xde\xf1\xe6\x58\xdc\x51\x56\xed\x11\x9f\xcc\xc0\x6b\x73\xb6\x52\x9a\x67\xd5\x0f\xf8\x41\x2a\x85\x3d\x04\x01\xff\xd2\xb5\xf2\xe9\x9a\xab\xd7\xbc\xef\x16\xd4\x25\x76\xdc\xde\xc8\xd7\xeb\xc5\xc9\x8f\x99\x6b\x2d\x5b\xfc\x37\x6f\xe7\x0f\xab\xb4\x88\x32\x56\xa0\x42\x5f\x2a\xbe\xb9\xbb\xcb\xa8\x30\x66\xb3\xe8\x25\x82\xb3\x8f\xd0\xd8\x5e\x63\x76\x53\x8d\xe4\x5f\x48\x0b\xb3\x42\xb6\xef\x31\x91\xee\xe5\x32\xbf\x68\x80\xba\x06\x3e\x38\x7b\xda\xe3\xbd\x35\x8e\x35\x08\xb6\xd5\x36\xd9\x88\x00\xcd\x5f\x8c\x45\x34\x91\xdd\xe4\x13\x0d\x85\x0a\x58\x43\x86\xb1\x6b\x69\xdb\xf4\xd6\x0f\xd8\x81\x4a\xfb\x64\xce\x06\x23\x54\x5c\x7a\xd2\x5c\xe1\x0b\x63\x0d\xcb\x70\x87\xd9\x20\x62\x27\x49\xbc\x87\xcb\x7b\x44\xa2\x3c\x38\x6f\x36\x4c\x3c\xbe\x3c\xfe\x20\xcf\x60\xa4\x25\x75\x7d\x57\xfc\x84\x37\xbe\x64\xd6\xe6\xf1\xd5\x3e\x44\x9a\xa7\xcc\x0f\x99\x3f\x2c\x10\xc5\x65\x67\xb6\x45\x99\x1e\x3c\xcc\xec\x88\x94\x40\xe9\xbb\xe4\x17\xc9\x43\xb4\x07\x4d\x0e\x6a\x29\x3e\x20\x5d\x3f\x5f\x11\x4b\xcf\x72\x99\xd5\x15\x4a\x87\x22\x93\xd1\xf2\xba\x3e\x56\x63\xe4\x90\xcb\xf6\x93\x0c\x0f\x96\x14\xd6\x56\xf8\x96\x2a\x1a\xd1\xdd\xeb\x0a\x28\xe0\x75\xd5\x88\xee\x91\x0b\x91\x32\x63\x4b\x30\x3b\x8e\xbb\x19\xb6\x31\x7c\x91\xaa\x02\x7c\x05\x00\x2e\xde\xae\x9c\x4b\x04\x27\x77\x0d\xfc\xa9\x4f\x37\xf4\xa5\x2b\x4d\x11\x48\x7c\x2a\x18\x3a\x6d\x99\x78\xc8\xf6\x93\x2f\xb5\xd3\x40\xb6\x58\x77\x3c\x8a\xcd\x91\x98\xb5\x18\x79\x53\x35\x79\xdd\x32\xbc\x4a\x3c\x41\xa8\xd0\x91\x64\x37\xb6\xeb\xb9\xbb\x7e\xc1\xc0\x9c\x91\x5e\x13\x30\x04\x59\x79\x7a\x99\x2c\x36\x45\x41\x49\xd6\x80\xa9\x4d\x59\xde\x9b\x19\x7f\xdf\x77\x0c\x38\x43\x1f\x75\xfb\x2f\xcc\x67\x3b\xfb\xee\x36\xda\xa1\xe3\xca\xde\x52\x1e\x9b\x5a\x4d\xda\x66\xd1\x17\x6e\x07\x66\xfd\xa8\x88\x79\x19\x6e\x23\x9b\x44\x94\xee\x8b\xf7\xe2\xb9\x67\x72\xce\xf5\xd5\xd1\xab\xb3\x01\x09\xb0\x44\xf2\xd6\xda\xcd\x45\x50\x55\xe5\x00\x8e\xd3\x8d\x20\x73\x8a\xef\xb2\xff\x22\x51\xfe\xe7\xbb\x6a\xd5\x68\x8d\xcc\x80\xc2\x8b\xce\x6b\xc6\xdb\x9f\x1f\xba\xe8\xbb\x6d\x90\x63\x2a\x79\x94\x95\xe6\xe1\x85\xc9\xe7\xf4\x36\x01\xf9\x04\x14\x2c\x0d\xa4\x82\x82\xe4\xc9\x34\xd4\x9b\xcd\x4a\x46\x10\x5a\x02\x6c\x7a\xdb\x6d\xdf\x73\xd2\x74\x6f\x5c\x1b\xa7\x41\x8f\x51\xfc\x03\x4d\x2f\x7d\x78\x64\x3d\x76\x19\xf6\x22\x6f\x77\xf7\x60\xb5\xb2\x39\x0a\x55\x38\x1a\x01\xe9\xcd\xa6\x67\x18\x79\x7b\xe1\x0a\x5e\xae\xe7\x7e\xf1\x5e\xd4\xca\x1f\x32\xe1\x32\x0b\xd4\xe9\xde\xac\x21\x5f\x8d\x78\xac\x8d\x9a\xe7\x2e\x32\x33\xeb\x8f\xf7\x0f\xec\x39\xc8\xa5\x7f\x68\xf6\x1f\xfc\x16\x60\x3d\xc3\xd7\x8e\x45\x9d\x6e\xbf\x96\x14\xc7\x4a\x1a\x73\xf5\x10\xa0\x7c\xfd\xd8\xbd\xcd\xd8\x94\x30\x46\x3f\xe3\x69\xe7\xe9\x5f\x4c\xbf\x13\xa4\xe1\x92\x22\x30\xb2\x0b\x5e\x36\xcd\x65\x99\xf3\xee\x88\xa4\x0f\xd2\xef\x46\x10\x48\x59\xa8\xd5\x06\xbc\xb3\xb2\x99\xfc\x17\x4f\x84\xc2\x8a\x24\x2c\xf4\x35\x76\x91\x34\x58\x81\x08\x4c\x96\x03\x4b\xb4\xab\x24\x6c\x04\xeb\x11\x31\x33\x72\x5f\x60\x6d\x3b\x79\x7c\x41\x65\xbc\xfd\x92\xf3\x3e\xd3\x75\x64\x47\xdd\xed\xad\x49\x80\x97\x99\x6b\xc4\x21\x87\x1c\x69\xfc\xb1\x18\x62\x8a\x23\x0e\x82\x23\xed\xbf\xa0\x75\x68\x0d\xe4\xe2\xf6\x56\x96\x3a\xfc\xd9\xc1\xb2\xc7\xa2\x79\xae\xee\x31\xc5\xa0\x43\x19\x1c\x33\xdb\xed\x16\x57\x26\xb6\x36\x7b\xf9\x42\xc7\xfa\x8c\x3b\x1f\xeb\x83\xc1\xe3\xbe\x40\x5a\x12\xdb\x9a\xe4\x8a\x74\x53\x4d\x34\x15\xb4\xc9\xbe\x30\xac\x5d\x32\x54\x86\x61\xfe\x45\x6e\x45\x73\x63\x69\x74\x0f\xa5\xc4\x04\x28\x24\xee\x34\x88\x3c\xe2\x63\xf0\x95\x31\xa2\x73\x75\x46\x37\xbd\x47\x9b\x58\x52\x65\xf4\x7e\x01\x35\x1c\x24\x6c\xc6\xec\x61\x83\x1f\x15\x53\xb2\x07\x4c\x3c\x06\x04\xcf\x08\x02\x5f\x29\xca\xf3\xae\x49\x56\xb7\xee\xb4\x76\xa8\xbb\x5f\xf4\x54\x58\xd5\x5a\x67\x4a\x31\x89\xf1\x06\xe7\xae\x1d\xe2\x6a\x29\xab\x84\x3c\xa2\xf6\x19\xfd\x63\x24\x1a\xd8\xd7\xf3\x2c\x7c\x8b\xfb\x02\x82\x2a\x53\x11\x79\x04\x5e\x78\x69\xc4\xf8\x29\x65\x67\x23\xa1\xa1\xbb\xe1\xfe\xf6\x61\x83\x34\x53\x54\x76\xa5\xf5\x6b\x5a\x19\xe0\xcf\xb5\xb4\xfc\x4f\xff\x86\xfa\x85\xff\xd7\x5f\xf8\x9b\xff\xc1\xff\xf9\x6f\xfe\xb5\xff\xed\xaf\x63\x7f\xf2\xef\xfc\xd9\xdf\xfe\x3f\xff\xbd\xff\x10\xfe\x97\x7f\xcd\x4f\xfd\x77\xfe\xc0\xaf\xfd\x2f\xfe\xaa\x3f\xfa\xaf\x7f\x60\x69\xd9\x0a\xa5\xc9\x98\x5d\xb0\x31\x82\xee\xa8\x31\x93\xf8\xa6\x1c\x26\x51\x2d\x66\xbd\xe6\x52\xf2\x55\x4d\xba\x0c\x48\x85\x96\x7f\x22\x45\xee\xfb\x35\xb8\x9c\x76\x19\x86\x78\xbc\x8b\x2a\x6e\x82\x28\xb3\xaf\x8d\xc3\xea\x40\x0e\x15\xaa\x32\xd0\xa6\x97\x6e\xc3\x26\xfb\x44\x8a\xac\x8c\x07\x32\x75\x60\x48\x98\x82\x8b\x4e\x02\x9f\x3c\x48\x06\x48\xdf\x50\xf9\xbe\x12\x77\x31\x4c\x87\x3b\x7c\x9f\x04\xd3\xfa\x44\xf8\x6a\x27\xed\xb3\x38\xff\xe0\xa3\xd0\xac\x2c\x20\x1d\x4a\x7d\x55\x07\x61\xdf\x34\x30\x57\x48\x4b\xc8\xee\x00\x3d\x16\x78\x5e\xfa\x85\xa5\x85\xed\xd4\x09\x46\x45\x0e\x5f\x51\xbb\xb1\x74\xf0\xf4\x1f\x46\x8f\x49\x25\xe8\x48\xf9\x6b\xd8\x04\x08\x20\x40\xf8\x28\x84\x15\x01\xbf\x68\x7f\xb8\xb5\x10\x51\x80\x6c\x5f\xde\x4e\x9d\xfb\x7d\xf2\xd3\xbd\x8a\xa1\x46\xbf\x35\x7d\xb0\x35\xb0\x64\x9f\x12\xd9\xa1\x5c\x8d\xef\x17\xaa\x06\xed\xfb\x01\x47\x91\x3c\x02\xe3\xce\x94\x35\x27\x13\x38\x76\x9f\xda\x53\x8d\x76\x61\x50\x21\x74\xdf\x29\xd3\xca\xec\x91\xa6\x7d\xa1\x76\x81\x48\xa3\xc3\x89\xe5\xa7\x27\xde\x39\x68\x54\x54\xdd\xb7\xbe\x5d\xf2\x31\x7b\x57\x42\x25\x75\x95\x38\xe2\x12\x80\x2f\x43\x5f\xf0\xc6\x94\x25\x4f\xe0\xb6\x20\x82\x0a\x53\x27\x4b\x4c\x71\x66\x3f\x91\xe8\x52\x4e\x0b\xd9\x59\xb4\x32\x55\x6e\x0f\x91\x66\xf4\x43\x7c\x91\x67\xc2\x96\xb6\xa3\x34\x2b\x51\x9f\x06\x11\x73\x66\xea\xcb\x22\x06\x8f\x8c\xcb\x09\xca\xf1\xf4\xec\x9c\xd7\x9e\x1e\xdb\x93\x76\x74\x5f\xe0\xfd\xec\xd2\xd1\x36\xc6\x03\x8a\x97\x78\x68\x98\xb8\x7c\x17\x59\x16\x02\x90\xea\x4e\xb4\xf7\xd8\xec\x07\x5e\xd8\xef\x22\x4c\x6f\x6a\xbf\x80\xe3\xd8\xc8\x08\x13\xdc\xf4\x30\x66\x2b\x25\x7a\x47\x28\x86\x37\xbd\x7d\x25\x97\xa2\x6f\xb9\xc8\x6d\x55\x97\x4f\x74\xb1\x71\xbb\xce\x17\x6b\xd4\x13\x74\xf6\xf4\x29\x12\x26\x36\xf1\x2d\x55\xa4\xea\xa0\xc4\x7d\x48\xdc\xb5\xc9\x8b\xde\xa1\xb6\x0f\xfd\xd9\x08\x4e\x5b\xa8\xfb\x42\x5b\xb1\x32\xd7\x13\x79\x7e\x5a\x8d\xef\xb8\xb0\xac\x17\xdc\x82\xa3\x54\xf8\x25\x2b\x9a\x5b\xac\x63\xcd\xad\x4a\xaa\x10\xad\x00\xfa\x89\x14\x39\x4a\x7e\x07\xb8\xaf\xa6\xc5\xe2\x41\x97\xc2\x38\xf4\x6e\x5e\xf1\xe8\x34\xd4\x0f\x8f\x49\xf4\x94\x6c\x6d\x25\xc5\x44\x54\xd6\xe2\x8b\x3e\x42\x3b\x8d\xcf\x42\xb2\x9f\x7d\x39\x11\x8a\x07\x33\xa6\x51\x7c\x43\xad\xf9\x5d\xe2\xbe\xad\xbc\x7a\x0b\xbb\x52\xef\xaf\x41\xf3\x7e\xd1\x47\x18\xde\x1c\x2a\x69\x38\xd2\xb6\x65\xf7\x14\x16\xe6\x4e\xd4\x2b\xae\x57\x79\x77\x8e\x2f\x17\x96\x72\x7a\x75\x68\xab\xa7\x89\xed\x17\xe3\x32\xbe\x69\x08\xcb\x48\xf6\x31\xb4\x3d\xa6\x83\xa5\x41\xae\xe1\xa0\x76\x5d\x3a\xe3\x95\x1d\x19\xec\x5d\xc1\x81\x23\x24\xf6\xf1\x5f\x80\xc5\x45\x07\xbc\x26\x47\x83\x80\x5b\x84\xa9\xf3\x3a\xcb\x9e\xd5\x7a\xec\xa9\xb1\x50\xa1\x3f\xd8\xac\x67\xec\x03\x49\x58\xa9\x03\xf0\x45\x2e\xd6\xab\xe9\x4e\xc4\xd0\x58\x46\x72\xbb\xdf\xb8\xe9\x21\xcc\xa9\x93\x52\x62\x75\xad\x02\xd9\xc2\x43\xd1\xbd\xb2\x8c\x7c\x35\xfa\x89\x81\xc2\x10\xdc\xec\xde\xdb\xfb\xc1\x62\x11\x95\xad\xc3\x09\xb7\x66\x75\xf9\x30\x67\xdf\xc5\xa6\xb1\x59\xe5\xf3\x5a\xe1\x49\xb0\xbc\x7e\x91\x73\x93\x29\x8e\xa4\x4e\x25\x6e\x37\x63\xe3\x50\xf8\x50\x57\x1e\x31\xa7\x1e\x1a\x79\xc8\x73\xf5\x0f\xbf\x42\xeb\x0c\x6a\xe3\x58\x86\x2f\x80\xf3\x72\x44\x4e\xde\xa3\x7a\xcd\x9b\x8d\xa6\xfd\x6a\xe3\xdb\x00\x3a\x2b\xf3\x94\x7c\xd0\x6b\x84\xe0\x3e\xce\xf0\x1c\xa9\xe8\xc3\xea\x17\x53\x8e\x0a\x7d\x21\x0c\xbc\xe6\xf9\x72\xca\xd6\xb4\x2c\xed\xf3\xee\x8a\x8e\x55\xe1\xde\x91\x1e\x71\xa6\x66\x21\xb7\x61\x00\xbf\x8e\x7f\x61\x1f\x76\xc3\x1b\xf9\x56\x20\xde\xee\x1a\xcc\xa1\x44\x3f\x98\x6a\xbb\xb5\x99\x4d\x92\xd3\x72\x8f\x97\xa2\xcb\xb0\xa3\xa6\x09\x8f\xff\x24\x9f\x40\x5d\x3d\x0b\x5b\xd0\x6c\xda\x19\x4c\xec\x81\x47\xd5\x3c\x53\x05\x28\xd6\x6d\x81\xee\x60\xbc\x7e\x52\xa2\x8c\xb0\xc6\x47\x47\xbf\xf8\x52\xa9\x5f\x51\x58\xeb\x5f\xfd\x54\xd7\xe0\xd3\x14\xa4\x18\xc9\xc7\x0d\x1e\x07\x79\xe9\x5c\xa4\x6d\x2c\xb1\x01\xf7\x09\x23\x87\xf3\x49\x16\x14\x61\x1c\x57\xd8\x5e\x00\x00\x47\xd9\x24\x74\x7a\xe9\x05\x94\x96\x45\x1a\x62\x35\xad\x44\x45\x9d\xf9\x9a\x5e\x6b\xd4\x71\xe7\x0b\x08\x8a\x9d\xce\x15\x29\xc6\xbc\x95\xb4\xb5\x7b\x50\x64\x3e\x3c\x06\x11\x8e\xd9\xcf\x3b\x54\xff\x61\x04\x0f\x0d\xf4\xa2\x90\x8a\x92\x23\xf1\x05\x19\xfd\x46\x66\x39\x1e\x3d\x13\xbe\xd8\x80\xe6\xac\x42\xab\x2a\xc3\x4e\x24\xdf\x9c\x5c\xa0\xd6\x9c\x69\x45\xba\x28\x6b\xfe\xec\x08\xbe\xd8\x96\xab\xde\x73\x91\x8e\x50\xb3\xef\x30\x08\x67\x54\x2a\xb6\x5e\x92\xc3\x2b\x8c\xc6\xb6\x97\x65\xb8\x48\xe6\xed\x4a\xed\x87\x58\xf5\x03\x5a\x87\x39\x47\xea\xf2\x30\x1a\xb4\xa8\xcf\xb4\xa6\x0c\x04\x55\x5e\x69\xca\xed\x3e\x5c\xcf\x77\x57\x50\x12\xa3\x7b\x70\xa6\x05\xbc\xbc\xfe\x1c\xc0\xe3\xa7\x7f\xc1\xaf\xf8\xd5\xbf\xfb\x57\xfe\x1f\x7f\xdd\x6f\xf9\x5d\x7f\xf8\x1f\xfe\xed\xdf\xfe\x33\xff\xe1\x1f\xfd\xa9\xbf\xf0\x97\xfe\xd2\xff\xf7\x77\xfc\xb1\xff\xe4\x4f\xff\xe5\xff\xe8\xdf\xf9\xbd\xff\xab\xdf\xf0\x81\xc2\x63\x8d\x03\xcd\x30\xd7\x9a\x63\x0c\x0c\xe0\x89\x6a\xc8\x10\xbd\xd3\xaa\xa3\x5c\x5c\xed\x67\xaa\x69\x8c\x3a\xf4\x3d\x11\x06\xf8\x85\x27\x9f\x11\xb4\x81\x51\x0b\xf3\xb6\x35\x51\xe2\x69\x15\x17\x2f\x3d\xa0\x4f\xb6\x8d\x29\xfb\x8e\xb0\x59\x4e\xfa\x96\xe4\x10\xab\x38\x7c\xb2\xd8\x92\xa3\x9c\x04\x61\x2c\x1e\x4f\x26\x9d\x96\xf3\x5e\xb6\x04\xa8\xe2\x39\x4a\x76\xbc\x8e\x84\x53\x0e\x8d\x95\xcc\x00\x67\xef\x3e\x49\x94\x4f\xe4\xe1\x82\x16\x4e\x05\x5e\x7e\x93\x3c\x3c\x95\x86\x17\x98\x64\x9a\x99\x61\x71\x91\x3e\x03\x53\xab\x3c\x70\x71\xf5\x7a\x3e\x41\x54\x3b\x50\x3b\xe5\x35\x9c\xda\xd1\xc0\x3d\xe9\x0c\x55\x77\xc7\x31\xca\xe3\x31\xa0\x5e\x76\xf8\xd4\x0f\x83\xb0\xdb\x06\x10\xdd\xfe\x0b\xff\xa0\x78\xe4\x83\x1e\x40\x10\x55\xf9\xfa\x11\xb3\x94\x2b\xb4\xe2\x55\xe0\x5a\x2e\x36\x5f\xb2\x91\x9a\xf7\x39\x47\xe9\x88\x95\x10\xf7\x0b\xb1\x27\x7f\x84\x9c\xa6\x09\xfa\x5a\x8a\xb8\x54\x77\x99\x4d\x1e\x99\x7b\x02\x19\xb3\xb2\x07\xf7\xdd\x52\x26\x8f\x85\x95\x8a\xd7\x5a\xf8\x05\x87\x2e\x96\xa6\x7d\xc4\x5d\x02\xce\xbd\xab\xe6\xe3\xb6\xec\xd6\x59\x46\xea\x0f\xd7\x0b\xfb\x77\x0c\x66\x75\xaa\x6c\x38\xd0\xeb\x05\x1f\x3c\x11\x76\x68\x99\xab\x00\xdc\xf8\x1a\xf8\xe9\x84\x3c\x19\x27\x64\xcb\x11\x7e\xf9\x87\xda\xb8\xec\x51\x5e\xe6\x9e\x33\x7f\xb9\x59\x05\x7e\xc1\x3a\xc0\x79\xb3\xd3\x04\xbc\x44\xf7\xc1\x0a\x14\x3d\x3f\x7d\x9a\x66\x6c\x4b\x3b\x6f\x3c\x5f\x6b\x9c\x8b\x14\xdd\xdb\xde\xfa\x9a\x70\x3f\x59\x1d\x76\x2f\x4e\x02\x8b\x1e\x19\xc8\xbc\xc4\x1b\xfb\xbc\x3d\x13\x80\xa5\x7f\x47\x96\xa9\xa4\x57\x50\xbc\x22\x17\x4f\x7c\x35\x19\xfc\x0b\xbc\xbf\xe3\xee\x6b\xe6\x30\x30\x52\xda\x5c\x7a\x82\x11\x8d\x6f\x5a\x74\xf8\x3e\xd7\x3d\x90\x15\x68\x41\x7e\x0e\x39\xb2\x0b\xaa\x8b\xf8\x82\xa5\xec\x55\x18\xcd\xaf\x80\xd2\x50\x1a\x05\xbf\x0b\xec\x15\xc5\x3c\x17\x6b\x1a\x62\x7a\xdf\x4c\x59\x14\x10\xa2\x41\x19\xad\xf6\x61\x5f\x48\xd4\x85\x27\xce\x8f\x33\x0c\x06\x2f\x2d\x8f\x45\x3e\x5c\xbc\x4f\x1f\x17\x0e\x12\x59\xf3\xdb\xdf\x13\xba\x09\xb6\xc8\x87\x50\x02\xbe\x88\x4e\x65\x98\x19\xf9\xb2\x8e\xb0\x63\x39\xe8\xc6\xde\xbc\x0d\x22\x59\x98\xd9\x67\x0d\x42\x35\x6f\xe1\x53\x65\x38\xe4\xb5\x79\x5d\x33\xeb\x17\x23\xa2\x2c\x30\x8f\x64\x6d\x82\xed\x56\x38\x18\x0f\xd0\x29\x00\xfa\x76\x96\x60\x89\x20\x75\x66\x86\x4d\xd2\x36\x55\x3b\x0f\xd0\x37\x4a\x41\xf1\x32\x2a\x1e\x4e\x99\x50\xc8\xf9\x81\x5e\x79\xf2\x10\x3a\xcc\x34\x98\x26\x75\xed\x13\x6a\xe2\x45\x6f\x69\x6c\xa2\x80\x3d\xfe\x8b\x70\x4a\x34\x0a\x31\x5e\x71\xa6\xaa\xc7\xba\xe9\x59\xa2\x44\x0f\x3b\xd3\x33\x0e\x57\xb6\xf9\xec\x72\x1a\x79\x70\x0f\x4d\x23\x5b\xf7\xf9\x42\x04\xac\x10\x3c\x26\x1f\x29\x65\x3f\xdc\x18\xb4\x22\xe8\x9a\xae\xdc\x06\x56\x9d\x31\x89\xde\x99\x55\x3f\x24\x05\x34\x44\x44\xf1\xe9\x5f\x74\xf6\x38\x3a\x4d\xeb\x67\xef\x28\x86\x56\xb2\xed\x98\xd7\xa8\x63\x09\x6f\xcf\x0f\xf6\x4f\xe8\x8e\xd5\xd2\xd6\x43\x64\xb9\x54\xe0\xf4\xc9\xb8\x7c\x74\xbc\xbe\x6c\xf5\xc3\xc8\xb5\x21\x7a\x18\x9d\x6e\x69\x10\xc6\xd9\x94\x79\x3a\xcb\x9b\xeb\xeb\x8e\x06\x90\xd0\x15\x40\x88\xdf\x40\xd6\x15\x4a\x2b\x87\x75\xf1\x61\xc5\x6e\x90\x16\x7a\x8a\x1b\xa9\xe8\xd3\xdc\x2a\x47\x21\xb2\xe0\x28\x89\x94\xe4\x57\x6b\xe4\x7e\x71\x97\x8f\x25\xe2\xfd\x1c\x11\x85\xfa\xf0\x03\x0b\x67\x96\xb5\x95\x6c\x10\x82\xa3\x99\xa4\x78\x73\xce\x9b\x20\x3f\x5f\xf3\x9c\x65\x5b\xf3\x9f\x64\x78\xec\x8b\x2b\xa3\xdc\x61\x34\xe9\x01\x4b\xbc\xb2\xcb\xba\xf2\x49\x0f\x0e\x49\x24\x0d\xf4\x31\xe0\x79\xa8\x19\x2d\xc5\x58\xca\xf8\x22\x14\x5d\xb8\x9d\x81\x44\xa7\xea\x37\x89\x6c\x5a\xaa\x6f\xbc\x74\x43\x17\x4d\x1b\x34\x41\xfe\x94\x85\xc6\x59\x99\x84\x8e\xab\x1f\xa2\x7e\xf1\x44\xcc\x8a\x8e\x63\xc5\xb6\xcc\xd8\xcc\x04\x48\x38\xd0\xb2\x4c\xeb\xb2\x53\xf1\xdc\xe6\x46\xfb\x5d\x7d\xd7\x1a\x91\xce\x4f\x7d\xfc\x17\x9b\xc0\xb8\xe0\x95\x0c\xb8\x1c\x17\x64\x00\x47\xd8\x9c\x90\x8e\x2c\xf1\x64\x0b\xa3\x10\x42\x1e\x98\x53\x2e\x7d\x1e\xe1\xf7\x65\x41\x7c\x41\x3a\x06\x06\x2f\x9a\x2f\x61\xc9\xba\xf9\xbc\xad\x47\xc4\x72\xa4\xea\x87\x3a\x41\x43\x18\x77\x97\x25\x8e\xb5\x69\x56\x46\x0d\x1e\x0b\x7c\x41\xb4\x8d\x79\xc0\xca\x6b\xd5\x04\x76\x0c\x46\x18\x25\xa5\xb1\x8a\x14\x50\xa9\x3c\xe0\xc5\xbb\x8a\x17\x1c\xb3\xf5\x18\xd1\x43\x53\xe0\x17\xf3\x05\xfa\xa1\x79\x30\xa7\xf5\x88\xdd\x1e\xa2\xab\x77\xed\x24\xa0\x23\xc7\x25\x6d\xef\x09\xc7\xfc\xc8\xcd\x3b\xab\xba\x1b\x5a\xfe\xc5\x49\xef\x9f\x6f\xdd\x3b\xb0\x2a\x12\x59\x9c\xf0\x3a\x54\x6d\x1f\x90\x6c\x89\x28\x37\x42\xf9\xb6\xc6\x2e\x81\xd3\x14\xdb\xd0\x07\x6b\xc5\xfc\x80\xf0\x8b\x6d\x99\xad\xc5\x66\x78\x7c\xc2\xa8\x54\xdb\x87\xb9\x54\x46\x8f\xb0\xc9\x15\xd2\x6d\xf1\xa6\x55\x28\xce\xde\x96\x7e\xf8\x5b\xb1\x53\xd0\x9f\x03\x78\xfc\x5b\xfe\x72\xfd\x6f\xff\x9b\xff\x1f\xbf\xe2\xf7\xfd\x91\xdf\xf4\x0b\x7e\xcf\x8f\xfd\xd3\xf4\x3b\xff\xab\xff\xbd\xff\xdc\xbf\xfe\x23\x82\xff\x1e\xf1\x8f\x7e\xfa\xef\xfd\xef\xff\x4d\x7f\xed\xff\xfd\x01\xe0\x31\x96\x81\xfc\x58\xca\xf8\x11\x6f\xc7\x37\x55\x2c\xde\xdb\xab\xf1\x4e\x72\x51\x57\xf0\x7b\xe0\x95\x28\xbc\x2f\x2f\x61\x99\xd3\xbe\x40\x54\x4f\x30\xdc\x73\x9d\xad\x22\x48\x94\x1c\xcf\xd4\xe5\x41\xe4\x9c\x25\xc7\xc6\x92\xde\xe7\x88\x61\xfb\x2d\xa3\xe4\xa7\x72\xd9\x3e\xf9\x2f\x54\x9d\x2f\xd2\x7b\x84\x1d\x5f\xf5\x22\x42\x82\xcb\x0b\x5d\xfc\x4a\x93\xc9\x80\x1b\xcc\x81\xd5\x25\x63\xde\xb7\x44\x27\x41\x02\x5f\x14\x5b\x01\xdc\x28\x7c\xa3\x41\x30\xd3\x6e\x5b\x85\xf2\xc6\x69\xaf\x2a\x6b\x2c\x6c\xc4\xd5\x87\x0b\xa4\x4a\x05\x14\x8c\xf6\xd1\xe2\x8b\x74\x7d\x4a\x1f\x26\x22\xe6\xa9\xbf\x86\x75\xb5\xe4\xba\x74\xa6\xc7\x28\xa8\x4a\xcd\x4f\x67\xef\xed\xa4\x90\x89\xa1\x31\xaa\xe9\x26\x5a\xfd\xc2\xe9\xfb\x0e\x40\xdb\x73\xc9\x05\x2f\x3e\xf4\xf6\xa8\xd2\x5b\x5a\xbc\x83\xfb\x59\x10\xb2\x55\xf0\x61\xcd\xe3\xd7\xc1\x8e\x24\xcc\x55\xff\xe2\xd3\xf6\x76\x14\x89\xd9\xed\x87\x4a\x75\x3d\x11\xeb\x25\xf3\x11\x17\x2b\xbe\x1b\xf7\x17\x36\x93\xe7\x1b\xb9\x4f\x6b\x6e\xcc\x1d\xfa\x04\xef\x57\x42\xef\x04\xf6\x03\xd0\x71\x73\x66\xfc\xee\x35\xbd\x08\x70\x1b\xda\x6d\xd7\x44\x12\x64\x8e\x9b\x38\x3a\x0d\xba\xdb\x15\x83\x2f\x52\xd4\x2f\xd3\x22\x9e\x90\x86\x94\x18\x74\xbb\xa5\x69\x48\x6b\xac\xca\x83\x1f\xd4\x70\xe9\xef\x14\x6e\x2a\xc5\xdc\xdc\x1e\x8d\xe6\x3f\xf1\x0f\xd2\x00\x28\x29\xee\x55\x4e\x2b\x5c\x43\x0d\xbd\xd8\xdc\x90\x42\x82\x60\xba\x6d\x97\xc0\xbb\xc7\xbd\x95\xf2\xa8\x2c\x65\xfa\x7e\x72\x81\x62\xa2\x01\x8a\x04\x75\xca\x78\xa4\xa8\x77\x59\xf7\x22\x72\x63\x97\xd1\x2c\xd2\x72\x59\x3c\x05\xcc\x9f\xa4\x1c\xe2\x0f\x17\x52\x7c\xc1\x89\x11\x95\xef\xa1\xef\x61\x90\xfb\x04\xbb\xf7\x1a\xe9\xf5\x98\xfe\x92\x1c\x2a\x7e\x46\x56\x93\xa2\x32\x2b\x7a\x5f\x06\xbc\x9b\xc2\x7f\xb1\xe4\x8b\x06\x1d\x96\xb5\x44\x31\x66\x76\xb1\xe6\xea\x25\x80\x4a\xfb\x0c\xa7\x0d\x33\x58\xe1\xd8\x25\x3d\xd4\x68\x3b\x1c\xfc\xd9\xec\x8b\xe1\xcc\x75\x24\xc2\x63\x38\x06\x23\xe3\x8a\x7b\x49\x05\xae\x72\x9f\x47\xfb\x21\x13\x6a\xf9\x54\x43\xba\x1b\xb6\xdc\xa7\x1c\xe1\xc3\xf9\x40\x73\xc3\x9e\x59\x57\x64\x44\x65\xb9\x4b\xe7\x49\x1a\xbe\x52\x06\x85\x21\x17\xfb\x83\xd0\xe3\x9c\x52\x94\x4e\xbd\x00\x49\xf2\xd8\x02\xf9\x07\xb9\xf6\xcc\x16\xd3\x1d\x78\x17\xd5\x65\x88\xa0\x96\x22\x11\x15\x5d\xb9\xc2\x75\xbc\x77\x41\x76\x14\xac\xcf\x23\x2d\x1f\x28\x1f\x34\xc4\x17\x39\x37\xec\x66\x0f\xbc\xd1\xf1\x11\x6a\x3f\xb9\x95\x32\x4a\x62\x33\x40\x2a\xed\x34\xb1\x6a\xa7\x7a\xec\xf4\xd1\x98\x70\xb9\x5d\xc0\xfb\x8b\x50\x74\xda\xe0\x2b\x3c\xa2\xa9\x6a\x23\xf7\xa1\xc9\x3d\x61\x95\xa7\xbe\x6d\x08\x95\x80\x94\xbb\x01\x3b\xd2\x1b\x89\x40\x57\x27\x4c\xd7\x27\x0e\xf0\x59\xed\x38\x21\xb6\xe7\x91\x9d\x89\x0a\xd3\x73\x19\xd6\x16\x40\x14\xd1\xe2\xf7\xa8\xb4\x6a\x6f\x05\x38\x41\x0e\x0d\x02\x3b\xff\xc5\x4a\x99\x1f\x9d\xae\xa9\x5b\xed\x53\x63\xdc\x36\x26\xad\x35\x0c\x8f\xa5\x12\xf6\xf5\x88\xc4\x28\x68\x62\xbd\x08\xd4\xc3\xb0\x58\xf7\x8b\x8b\x78\xb4\x5f\x73\xc2\x98\x56\xf6\x7a\x7b\x17\x76\xa6\xe2\x41\x98\x85\x9d\xe7\xa4\x45\xd0\x7c\x2e\x2d\xa0\x0b\xc3\xe2\x5b\x18\xd1\xab\x7d\x71\x99\x24\xb0\x19\xf0\x60\x8b\xe4\xc4\x9c\xf1\xf4\xe8\xf3\xe4\x1d\x93\x6e\x64\xe3\x38\x10\x8f\x52\x89\xea\x9f\x86\x1b\x03\xe8\x49\xa9\x7f\x61\xdc\x65\x9c\x25\xfd\x3e\x79\x05\xe1\x28\xab\x99\xa2\xf0\xc0\xe6\x94\x24\x2c\x8f\xc2\xb3\x4e\x90\x9a\x0b\x32\x97\xcf\xa2\xb0\x30\x25\x3e\x81\x1a\xd0\x33\x07\x32\xe0\x42\x8e\x80\x97\x58\xc9\xca\x2e\x8d\x82\xf5\x50\x4c\x51\xaf\xf2\x86\xa6\x5e\xc7\x7e\x16\xcd\x98\x96\x15\xbe\xa0\x75\x4c\x96\x47\x26\x33\x19\xc8\xbb\x37\x59\xa0\x1f\xaf\x71\x3c\x4c\xb4\x1a\x2b\xf1\x09\xf5\x58\x43\xcb\x1d\xe7\x75\x41\xa6\xc6\x3e\x39\x57\xdc\x97\x83\x14\x50\xc1\xd2\x0a\x27\xf5\x45\x3a\x39\xb6\xc8\x7c\xaf\x15\x17\x76\x2d\x15\xf4\x33\xe2\x33\x68\x83\xd3\xbc\xcf\xbe\x5f\x4c\xbf\x3c\xd9\xb6\xd8\xa2\x5a\xc7\xa2\x3d\x4e\x65\x98\x96\x28\x83\xe0\x1d\xb0\xd9\x96\x80\x5d\xb5\xec\x65\x70\xf3\xad\x5d\x2a\xa7\xf8\x62\xca\x59\x88\xce\x18\x71\xb2\xa0\x60\x77\x2d\x4e\x53\xa2\x97\x67\xef\x00\x07\xa9\xd3\xbe\x65\x69\xd9\xda\x1c\x0f\xb5\x53\x61\xd3\xec\x17\xf5\x42\x44\xea\xbc\xee\x9d\x27\x94\xb0\x00\x5a\xb8\x31\x6e\x91\x0c\xdc\x7b\xd5\x0b\x31\x21\xeb\xd4\x53\x71\xa8\xe9\xbd\x92\xb5\xf7\x7c\x71\x2b\xe6\xa9\xa1\x79\x78\x98\x87\xc1\xc8\x77\x1c\x1c\x54\x2d\x43\x50\x4e\x0c\x4c\x87\xe6\x8c\x90\x1f\x36\xb4\xdb\x70\xe8\x10\xe8\xdd\xbe\xd0\x6e\xb2\x46\x3d\x13\x42\x54\x29\x5f\x0e\x1f\x01\xbd\x49\x79\x4c\x95\xfc\x15\x97\x6a\x76\x38\x7e\x92\xc3\xd2\xa7\x78\x98\x29\xae\x7d\x71\x2b\x86\x81\xc3\x68\xe1\x81\xd0\x84\x84\xd2\x55\xe9\x36\x5b\xe7\xbe\x38\x46\xa0\x78\xef\x8b\x81\x36\x4f\xee\x8d\xcb\xd2\x98\x24\xcf\x75\xea\xe7\x00\x1e\xff\x87\xff\xc6\x3f\x09\xbf\xe3\x97\xfc\xb7\x5e\xfa\xab\xdb\xff\xad\xfe\xb9\x3f\xf4\x6f\xff\x45\x3f\xf9\x3f\xfe\xc9\x5f\xf1\x53\xbf\xe1\x57\xfd\xc6\x1f\x81\xff\xcb\xdf\xf2\x87\xfe\x6d\x3f\xfd\x01\xe0\xd1\xaa\x08\x9c\x02\x34\xec\xee\x3d\x21\x65\x1f\xd9\xc1\xd4\x0d\x1b\xa5\x13\xad\x15\x73\x15\x59\xf5\x28\x08\x45\x74\x05\x7b\x7c\xe2\x07\x1a\x9c\xc3\x53\x59\x9b\x0f\x7a\xb6\x37\x3c\xcc\x7b\x87\x13\xf0\x91\x74\xd1\x26\xb0\x71\xfc\x4e\x65\xb9\xd7\x07\x22\x6d\x4c\xfc\x42\x4e\xc7\x62\xf7\x2a\x39\x5d\xd4\xed\xdd\xc5\x88\x56\xed\xe8\x94\x8c\x55\x07\xd4\xc8\x93\xa1\x4e\x3c\x70\xac\x29\xee\x68\xcf\x6d\xa2\xfb\x62\x99\xb3\x95\xbb\xea\x7b\xa4\xa2\x10\xa6\x1f\x9e\x25\x14\x39\x34\xcd\x64\x79\x52\x1a\x86\x30\x54\xb4\x74\xb6\x10\x2a\xc7\x8e\x35\xb9\x4f\x38\x31\xa7\x84\xad\x00\x8a\x03\x2e\x92\xda\x29\x8b\x0a\x0a\x9b\x46\xd5\x94\x03\x60\x26\xe5\xb0\xc6\xbe\x51\x10\x89\x33\x87\x0e\xfb\x49\x12\x70\x65\x58\x74\x3f\x36\x20\x81\x13\x05\x0f\x61\x1d\x52\xa7\xc1\x9b\x7b\xe8\x32\x5b\x9d\x78\xc3\xec\x99\xbe\x5e\x4d\xf5\x28\xe1\x1b\x37\x7c\x85\xda\xc7\xe4\xbc\x2b\xea\x74\x7a\x48\x58\x61\xb1\x96\x1a\xb9\x8f\xb4\x8f\x38\x85\x1d\x44\x53\xa1\xd5\x6c\x4f\x41\xfd\xe4\xa8\xa1\x7f\x2c\xc4\x0f\xab\xf1\x90\xa6\x77\xbd\x37\xb6\x97\x06\xb1\x35\xb3\x8f\xa0\x79\xa4\xd9\x68\x05\xfb\x89\x12\xbe\xa2\x4f\xbb\xdc\x17\xfc\x60\xe9\xe0\xed\xf1\xad\x72\x6e\x7c\xa6\xb8\x59\x31\x75\xfd\x1c\xb8\x94\xdb\xca\x7d\xf6\x02\x53\x5d\xe2\x63\x8c\x89\x08\x78\x8e\xf8\x44\xe1\x01\x27\x0a\xba\x39\xde\x16\x28\xa0\x5a\x87\xcc\x94\xfe\x3d\xe0\x30\xb4\x29\xe1\x9d\x16\xf2\x72\x58\xe0\xde\x7d\x8e\xc2\xf9\x17\x91\xba\x6c\x2a\xf7\x9c\x36\xae\x40\xdc\x01\xe6\x68\xd2\x47\x8c\x73\xa2\xf4\x87\x9e\x3c\x5d\x71\x0f\x6c\xb0\xdd\xb2\x7b\xe5\xb7\x06\x36\xbe\xe0\x3e\xc2\x4b\x81\xdd\x82\x9d\x95\xfb\x4d\xc9\x08\x23\x0e\xc6\xb9\x3b\x9e\x5d\x15\x3c\xa9\x17\xe5\xc4\xaf\x8d\x0b\x92\xc4\xc3\xc8\xed\x0b\x1b\x87\x7e\x5d\x7f\xec\x59\x0f\x36\x1b\xb3\x37\x48\x13\x7a\x69\xd2\xa8\xb7\xcd\x04\xcb\x15\xa8\x81\x79\xed\x70\xea\xa4\xcd\xb6\x22\xe7\x0b\xd7\xb3\x9f\x2f\x7b\x44\x70\xa0\xa3\x6b\x05\x31\x1c\x36\x50\x8a\x7c\xc6\x8e\x94\x50\xbd\x9f\x07\x4a\xfe\x66\xa1\x9b\xb7\x22\xbb\xc3\xbf\xd1\x13\x98\xf6\xd0\x15\xa8\x13\xb8\xa4\x0c\x6f\xbb\x4b\x5f\x1d\x1f\x4d\xdc\xe3\x15\x14\xc5\x49\x21\xe4\x38\x5d\x17\x9a\x12\x47\xfd\x8b\xa3\x86\x8c\x14\x9f\x1e\x2b\xca\x35\x21\x68\xe7\x06\x03\xf5\x9d\x9b\xc5\x6d\x79\x1b\xb3\x09\xa8\x2f\x7b\xd7\xe6\x3d\xf4\xe8\x9d\x87\xaa\x7d\x72\x4f\xc9\x78\xd6\x7c\x19\x9c\xd4\x6b\x16\xa7\x87\xa7\xde\x21\x00\x4a\x83\x81\x72\x2d\x8c\xbd\x9c\x86\x8d\xbc\xa5\xaa\x8c\x24\xeb\x17\x5a\x2c\x4a\xcd\x34\x0c\x71\xd9\x61\x95\x91\xd1\x56\xfd\x3a\x0b\x86\x9d\x39\x26\x4e\x64\xf0\x50\x12\x03\x92\x77\x5e\x89\x75\xab\x6f\xfd\x64\x99\xd3\xf7\x75\xcb\xde\x56\xdd\x1e\x49\x6e\xae\xc3\xbb\x2f\x95\x99\x3a\x2f\xc4\x88\xac\x76\xcf\xb1\x36\x6d\xea\x37\x0f\x46\xd1\xfc\x22\x79\x88\xc2\x59\xe3\xc9\xb7\xea\xe7\x4d\xa2\x44\xc9\x7d\xb6\x83\x95\xca\x90\x10\x1d\xb3\xa9\xb0\x54\x20\xa4\x11\x2f\x8e\x80\xe6\x6b\xbe\x50\x90\xb2\xc1\x1b\xb4\x50\xc3\x87\x51\x06\xb1\x6b\xe0\x84\xbc\xe6\x9b\xc1\xb6\xaf\xd3\x80\xa5\xa3\x39\x26\x2c\xd3\x94\x99\x29\x25\x65\xf0\x05\x34\xa9\x21\xba\x42\xaa\x4b\xf9\xbb\x84\x75\x2c\xe4\x52\xde\x8b\x82\x2c\xf5\x3e\xfc\x6c\x69\x3d\xae\x1a\x97\xd7\x8b\x97\x4a\x45\xe4\x27\x66\xd5\x4c\x8f\x31\xbd\x26\x6e\x27\x5a\xb0\xa9\xf0\xe0\x76\xf8\x1e\xe4\xa1\xbe\x03\x74\xe5\xda\xda\xc6\x00\x83\xcb\x19\x49\x5d\xbb\xfd\xe2\xed\x2c\xf4\x4d\x01\x5e\x5f\x1d\xb0\x45\x73\x9f\xf0\xd9\xe4\x79\x7b\x22\x4f\x65\xe3\x10\xf2\x38\x23\xcf\x76\x21\x93\xce\x2e\x7c\xc1\x17\x77\x73\x98\x08\x78\x51\xe1\x2e\xeb\x31\x61\xaf\x62\xf3\x40\xc9\xfb\x5c\xcf\xdc\xbb\x6c\x7d\x5f\xcb\x1c\x7b\x80\x30\x07\x70\x93\xe4\x3b\x3e\x79\x3b\x77\x76\x15\xdf\x0c\xd8\xd2\xd6\xe3\xa2\xd6\x84\xbc\xc5\xa4\xaa\xea\x98\x06\x4f\x97\x52\xa4\xd3\x1a\x02\x3d\x5b\xaa\xe6\x20\xfd\x02\xb2\x1e\x71\x58\xb6\x18\x7d\xa6\x52\x49\x85\x67\x49\xa7\xf6\x40\xec\x21\x8a\x6f\xa7\x9f\xc3\x97\xf6\xc6\xba\x47\x55\xb8\x8f\x6b\xb5\x7f\x31\xfd\x8e\xfd\xda\xf4\xd8\x11\xb0\xdf\xd2\x5e\x82\x9e\xac\xc2\xa5\xa2\x8c\xc2\x95\x54\x51\xc1\xd4\x09\x83\x5d\xb6\xcd\xe0\x40\xdc\xd2\x2f\x8c\xbb\xb9\x06\x17\x33\xe6\x5e\x16\x42\xd2\x1b\xf7\x29\x69\x22\x4b\x4c\x2e\x53\x41\x76\x70\xf7\xb7\xd0\x23\x56\x8c\x19\x03\x3f\x9d\xfd\xe2\x89\xc8\x13\x58\x60\xe7\x0a\x28\xd7\x5d\x4d\x30\x10\x34\x34\x62\xc1\x47\x16\x9c\x1a\x93\xe7\x15\x95\xd9\x2a\x19\x4c\xb2\x1e\x9e\xc5\x17\xf3\x05\xd5\x8a\xa9\xf7\x3e\xdd\x4d\x88\x01\xc0\xc1\x8d\xbe\xba\x54\xbb\xd1\x62\x19\x96\xf6\x4a\xc5\x0a\xa3\x31\x0d\x4a\xdf\x16\x57\xfd\x62\x4f\x9d\xa6\xc3\x94\x5e\x4a\x6b\x7b\x07\x86\x40\xba\xc5\x5b\x85\x5c\x51\xb7\x78\xe5\x98\xc7\x72\xb4\x09\xb5\xde\xfd\x78\x2a\xad\xf4\xe4\xe7\x00\x1e\xe7\x7f\xf2\x23\xbf\xe8\x47\xff\xb5\xdf\x88\xff\xbd\x7f\xfc\xcf\xff\xe8\x3f\x52\xff\x8e\x7f\xf0\x5f\xff\x47\xff\x81\xff\xc2\x4f\xfe\xa6\x5f\xfe\xff\xfa\x9f\xfd\xb3\xdf\xfa\x77\xff\x33\x3f\xf6\xbb\xfe\x9b\x1f\x00\x1e\x75\x86\x97\x43\xd1\x62\x58\xbe\xaa\x34\x42\x95\xbc\x54\x21\x36\xe5\xd9\xd1\xe4\xd4\x32\xf8\x06\xc8\xed\x36\xd5\x1c\xd3\xa5\xfb\x62\x5c\xf6\xdc\x19\x9a\xbc\x91\x6a\x1e\x34\x58\xaf\x4f\x2c\xc1\x0f\xbf\x23\x08\xc1\x01\xc0\x33\x1d\x17\x84\x06\x6b\xd9\x68\x67\xe1\xda\x17\x07\xdb\x52\xf0\x5d\xf9\xe3\xa8\x23\xa3\x53\xf3\x8c\x67\x35\x64\xa2\x14\xd6\x33\xca\x70\xb4\x97\x37\x28\x48\x88\x90\x5a\x4f\x97\x1d\xfc\x8b\xd3\x47\x5a\xa3\x42\x8b\xf3\x87\x46\x8b\xde\x17\x74\xd2\x87\x01\x04\x28\x1f\x9c\xe3\xfc\x6c\x0f\xc0\xbb\xa3\xd4\xce\x75\x4e\x96\x4e\x9f\x44\xa7\xd2\x5c\xc5\x40\x43\x07\x1b\x19\xdb\xfa\x20\x1e\x21\x80\x4f\x95\x22\x9f\x5d\x46\x78\x75\x60\x2d\x47\x4a\xda\x6b\xe1\x5b\x67\xb3\x5f\x1c\xfe\xc4\x2e\xb3\xba\x50\xb7\x4c\x0b\x96\xd5\x3b\xea\xb9\x11\x63\x5e\x64\x4e\xa9\x3f\xea\xb1\xe1\xb4\x66\xcf\x96\x94\x4b\x3c\xf9\x1c\x5f\x14\x18\x58\x4e\xa4\x1b\x75\x93\xd0\xe3\xa6\x26\x4f\x7c\xd9\x33\x4b\x2f\x2f\x1b\x11\x4d\x25\xf2\x19\xfb\x8d\x35\x41\x3e\x2a\xac\xf0\x8a\x2f\x1c\xe0\xc2\x3e\x4b\x87\xd2\x2a\x4d\x8a\xfa\xc7\x28\x3a\x73\xad\xb0\xb4\x2d\x22\x8f\x0f\xb5\xfa\xc4\x77\xe0\x18\x61\xb6\x6a\xf9\x72\x3e\x51\x78\x00\x16\xb6\xea\xe6\x89\x51\xd1\x2b\x53\xe2\x6d\xa4\x45\x12\x04\x43\x0d\x19\xfc\x3e\xa3\x30\xc3\x07\xd2\xd9\xfb\x17\x89\x47\xdb\x2f\x8a\x2d\xe4\x23\x22\x2e\x02\xa5\x2f\xc8\x23\xd6\x04\xd6\x9d\xe2\x4a\x95\xc0\x76\x84\xaf\xa0\xc9\x56\xeb\x8d\xf2\x68\xfa\xdc\x32\xf1\x27\x01\x6b\x67\xfb\xc7\xe2\xcb\xb6\x57\x80\xb1\x43\x27\x84\xc1\x00\xfc\xce\xf2\xb6\xe7\x2d\x6f\xe4\x48\x5c\xc5\x70\x26\xa9\x78\xd1\x6b\x0f\x5f\x18\xae\xfc\x3c\x8f\x51\x96\x3d\x38\xb9\xe0\x80\x7c\xb9\x6c\xd3\xd5\xe7\x85\x46\x30\x55\x30\x7b\x9e\x94\x02\x17\x3a\xd2\x3b\x8b\x87\xf1\x93\x53\x69\x85\xba\xa9\x4b\x34\xac\xb9\x63\xf2\xa4\x8f\x06\x04\x42\xe8\x10\x77\x13\x71\xcf\x7c\x3e\xb6\x58\x45\x64\xd6\x8f\x0d\xd7\x88\xf3\x85\x81\x82\x04\x50\x24\xd9\x83\xb6\x53\x4b\xd2\x67\x35\x5d\x9f\x4d\x72\x46\xae\x41\x28\xd8\xe5\x95\x94\x45\xa4\x81\x32\xac\x78\xe8\x74\x5f\x78\xf2\x29\x6e\x23\x19\xa7\x34\xc3\x0c\x1e\xc0\xe9\xed\xbe\x8e\x12\x08\x7c\xd9\x2e\xee\x0d\x1a\x76\x3d\xd6\xfb\x4c\x25\xeb\xc3\x64\xae\x5f\x2c\xb6\x26\xd2\x47\xc4\x79\xa1\x96\x67\xcd\xa3\x0c\xb7\x37\x44\x42\xd8\x9b\x33\x4a\x3b\xd2\xee\x86\x30\x35\xe4\x28\x68\x91\x8e\xe1\x2f\x74\x69\x14\xcd\xb1\x18\x03\x76\x09\x7a\xed\x33\xb3\xef\x88\x87\x85\x30\xb4\x11\xb9\x46\xf5\x42\xc9\xbf\xe5\xb4\xfc\x10\x14\x9e\x71\xeb\x17\x36\x0e\x96\x19\x66\x8b\x0d\xc8\x33\x7a\xf5\x80\xad\xbd\x8c\x93\x60\x6d\x8e\x8a\xc3\x08\x9f\x37\xf3\xa4\xca\x24\xec\xbc\xb6\xd8\x57\xb4\x4f\xe2\xff\xd4\x78\xcc\x86\xbe\xe7\x3e\x55\x27\x71\x11\x75\xdd\x84\x64\xd2\xea\xec\x6e\xc5\x8c\x8b\x8c\x27\x95\x30\x57\xe1\x91\x28\x54\xfa\x45\x20\xe3\x10\x2c\x9a\x3e\x83\x46\xa6\xc0\xb6\x30\x19\xf8\x40\x69\x20\xda\xa3\x07\x87\x68\x4b\x67\xa2\x88\x7c\x25\x62\xf7\x70\x58\x0b\x5f\x7c\xa9\x08\x3b\x8a\xb6\xb6\x14\xd3\xf5\xcc\x4b\x6c\x43\x35\x04\xf3\x78\xbe\x62\x78\x45\x41\xe1\xe1\x18\xb8\x49\xa9\xbc\x6a\x2b\x5e\xea\x17\xeb\x35\xe1\x9c\xe2\xd7\x5b\x21\x98\x63\xec\x7d\x1d\x64\xf8\xa0\x47\x09\xe3\x5f\xcb\x87\xca\x01\xb2\x4e\xc4\x2b\xed\xa9\x34\xb7\xe1\xda\x17\x6b\xd4\x12\x06\x4c\x20\x21\x4d\x89\xb8\xae\xe8\xb6\x3e\x79\x87\xa1\x85\xcf\x66\x39\x37\x2f\x5f\x54\xf0\xc0\x17\xa7\x4e\x97\xb4\xf0\x7c\xa1\x6a\xc8\x90\x10\x26\x24\x74\x98\x34\x98\xa4\x98\x2a\xa4\x06\x29\x7b\xde\x6a\x05\x46\xcf\xfb\xb6\x36\x75\x81\x88\xcf\x1e\x4a\x08\xe6\x0b\x43\x37\x5b\x9b\xb3\x03\x08\x91\x27\x1d\xfe\xa0\x9c\x77\x64\xdb\x3a\x72\x18\x9c\xf2\xb5\xd5\x5d\x08\x84\xf7\xf1\xf0\xdc\x59\xd5\x56\xb8\x2f\xb4\x15\x90\x00\xf2\x64\xb6\x68\xa6\x5d\x12\x87\x2e\x7a\x55\x77\x9b\x43\xcc\xb7\xfb\xe1\xad\x64\x24\xb4\x57\xbe\xfb\x1a\x69\xfd\x38\xe9\x13\x5b\x39\x95\x31\x42\x54\x04\xbd\x10\x87\x84\xf6\x24\xa9\x88\xfc\xe8\xae\xec\x73\xf9\x00\x94\x74\x2d\x5a\xcd\xb1\xc3\x2b\x70\x5e\xf7\x8b\x08\x6e\x86\x19\x11\xcc\x42\x22\x53\x3c\xcb\x38\xb2\x44\x41\xe8\x1c\x85\x22\x0b\xc9\x3b\xba\x2a\x14\xb8\x6a\x77\x2b\x13\xf5\xf0\x89\x3e\xa1\x32\xc2\x74\x84\xbd\xe6\xdc\xda\x74\xa7\x6b\x1d\xce\x6d\x12\xb9\x84\xbd\x49\x17\x2b\x6f\xc0\x30\x69\x80\x2b\xc3\x9b\x23\xf6\xd2\x4f\xcc\x24\x86\x87\xc5\x30\x5a\xd4\xa7\xd3\x77\x7e\x7a\x8c\xb2\xa1\x1b\x2b\x3c\x33\x42\x56\x81\x2a\xaf\x17\xae\x55\x0f\xb4\x2d\x0d\xdc\x2f\x42\x8e\x59\xe6\xb3\xa0\xf4\xb8\x68\x66\xd3\x23\x66\x38\x10\x03\xa1\x27\x7a\xd0\x88\xd6\x0c\x94\x14\x07\xef\xe8\x31\xe7\xb5\xc4\xb5\xe8\x8b\x6d\x99\x5e\xc8\x17\x4e\x08\xb9\xa8\x61\xf8\xd9\x73\x9d\x2d\xe0\xb7\x6d\xd5\x0a\xc9\xcf\x03\x15\xee\xaa\xab\x1b\x2f\x73\x84\x82\xb1\xd1\xbf\xe2\x87\xf8\x97\x80\xc7\x7f\xf6\x3f\xff\x13\xff\x97\xbf\x1b\xfe\xd8\x6f\xfe\xab\xe7\xd7\xfd\xad\x5f\xf6\x4f\xff\xf6\xff\xee\x7f\xf3\xef\xfa\xc5\xbf\xfe\x97\xfc\xd6\x1f\xfd\xf7\xfd\xe8\x6f\xfb\x13\x7f\xf8\x2f\xfe\x6b\xff\xec\xef\x7f\x10\x5a\x2a\x68\x15\xc9\xe7\x9a\xec\xd5\x9a\x1e\x50\x7c\x9d\x8c\x83\x85\x57\x7f\x5f\x5b\x4d\xc9\xa9\x9b\xee\x95\x8d\x66\xcd\x4c\xbd\x19\x1f\x2c\x30\xcc\xf9\xde\x0c\x44\x55\xe5\xa1\x2b\xa3\x68\x10\x00\x49\x1a\xcf\xca\xaa\xa6\xbc\x5f\x2c\xc9\xcc\xe7\x0d\x4a\x99\x32\x89\xa1\xef\x27\x91\x77\x32\x64\xda\xf5\xc1\xef\x3b\x41\x93\xba\x52\x53\x68\x7d\xdb\x03\xc8\xe4\x47\x6d\x3a\x17\xa1\xf7\xfa\xe3\x57\xe5\xa4\x75\xd9\xd8\x17\x65\x2e\x59\x79\xb1\xee\xc2\x61\x94\xc9\x56\xf9\x79\x41\x05\xa7\xb5\xc1\x7a\x2b\x91\x53\xda\x57\x87\x7d\x7b\x54\xd3\x7d\xd6\x82\x90\x7e\xf1\x5f\xbc\xfb\x3c\xaf\x3f\x69\xc1\x65\xf6\x79\x23\x07\x66\x2e\xcc\x84\xac\xdc\x6c\xd0\x48\x2b\x38\x9f\xac\xa4\xbd\xfd\x31\xe2\x98\xf9\x85\x14\x99\x21\x53\xef\x8e\xd3\x3f\x13\x3c\x85\x0b\x27\x8c\xb8\x6d\x9d\x4e\x92\x0b\x1c\x61\xc2\xb6\xc1\xb5\x5e\x17\x98\xd1\x63\x7a\x6a\xbf\xb9\x7b\x3d\x4d\x8c\x2f\x63\xab\x8f\x47\x63\x92\x49\xc7\x28\xd5\x27\x57\x2e\xb5\xd8\xe5\xd6\xc5\xd8\xce\xb3\xd8\xf0\xc0\x5e\x05\x86\xf4\x0b\x59\x36\x99\x07\x20\xee\x75\x09\xf8\xf8\x40\xb6\x8b\x08\xbe\x5e\xa0\xb2\x85\xcc\xc9\x30\xf3\x40\x6c\x2e\x78\x80\x53\x39\x08\xc6\xcb\x17\xd0\x24\x03\x85\x04\x3a\x4a\x0e\xc9\x35\x1d\x5a\x28\x7a\x4d\x06\xdd\x35\xac\xd6\x48\x37\xe3\x2d\x9f\x74\x97\x6e\xc1\x3c\xe0\x21\x2b\x7d\x91\xb6\xc3\xd8\xb0\x6b\x03\xf7\xf8\xba\xe9\x55\x8b\xab\xc5\x2c\x68\x84\x13\xf3\xbc\x93\x17\x69\x28\x05\xcb\x1d\xa8\x2f\xa0\x24\xc3\xe7\xfd\x42\x96\xcd\x9c\xf0\xf8\x86\xf5\x14\x0b\x66\x7b\x56\x0c\xbd\x0b\xf1\xdc\xa2\x1e\x4b\xd5\x8d\xef\x39\xc3\x5e\x9f\x85\xa9\x52\x5e\xee\x9f\x4f\xee\xe4\x33\xf1\x64\x19\x1b\x4d\x4a\xd3\x70\xd7\x11\xdb\xb5\x22\xa3\x16\x97\x14\xe6\x5f\xcc\xbb\x0a\x07\x34\xfb\x3e\xc2\x83\xa7\x1e\x43\xe8\x17\xe3\xb2\xb8\x2a\x83\xe1\x1f\x22\x93\x33\xa9\x16\x7e\x3b\x86\x9a\xf3\x1d\x03\x8d\xf6\x66\x7d\xdd\x24\x39\x18\xb4\xdf\x28\xda\xf2\xd6\x7e\x31\x16\x1d\xf4\x8a\x94\x08\x77\x6f\x57\x6c\x35\x24\xe2\x4b\x76\xb6\xe1\x99\x1d\xda\xde\x27\xb2\xb8\xc6\xa2\xc4\x0c\x31\x06\xdd\xda\xf0\x5f\x24\x03\x44\x77\xf3\x7d\xf5\xb3\x4f\x54\xcc\xe6\x18\x53\x5f\x82\x09\xaf\x3c\x09\x3b\x2b\xd4\x05\x45\xe8\x18\x73\xa8\x07\x9d\x8f\x24\xc0\x07\xeb\x35\x43\xa6\xa7\x34\x42\xf0\x93\xc2\xbd\xca\xa9\xab\xcc\x76\x1b\x80\x53\x2d\x77\xbd\xbe\x90\x2e\x71\x0f\x7a\x6f\xf1\x5d\x1c\xa5\x3e\xf1\x5e\x57\x0c\x82\x5b\x52\xa7\xae\x8e\x3b\xe6\x78\xd7\xf6\xeb\x5f\x46\xeb\x18\x42\x45\xf2\x88\x15\x65\x60\x28\x3b\x50\x72\xb4\x16\xc0\x4f\x8e\x1a\x02\x33\x0a\x4d\x7b\x3b\xdb\x33\x78\xf6\x55\x1c\x5e\x0e\x9d\x2b\xc0\xae\x54\x65\x55\xaa\xe0\xac\x9a\x73\xae\x20\xfb\xc3\xda\xf9\x85\x75\x81\xf6\xbe\xd1\xdd\x35\x3a\x4d\xcc\xe5\x07\x2a\xc2\x64\x3b\x80\x88\x5b\x59\x31\xd4\x2e\x92\x02\x28\xa2\x8a\x1c\xb6\x0d\xb5\xd8\x4f\xac\x0b\xc6\xd0\x40\xb6\x19\x20\x5f\xd7\xca\x55\xc9\x8f\x5d\x58\x75\x53\x81\x41\xe4\x05\x2b\x3a\x3a\x19\xa0\xd5\x50\x14\x94\x54\xe0\x8b\x7c\x82\xa7\x35\x1f\xa4\xa7\x09\x2c\x91\xb3\x06\x88\x39\xb2\x3c\xcb\x89\x00\xb6\xe1\x83\x9f\xed\xd9\x44\xfe\xdd\xf1\xb9\xae\x03\x56\xc0\x17\x44\x1b\x2d\x41\xde\x5e\x9d\xbb\xa6\x4c\x9e\x17\x47\x15\x8b\x44\xc4\x4b\x0b\x89\x3b\x8b\xcc\x80\xd8\x76\x24\x00\x84\x84\xa0\xe8\xfe\x45\x7a\x06\x25\xd4\x62\x74\xb3\x9e\x19\x28\x1f\x1f\xd1\x61\x9a\x3d\xa5\xf6\x46\xd3\x4d\x36\x36\x23\x94\x05\x6c\xfb\xce\x23\xb1\x1c\xaa\xf6\x2f\x0c\x57\xfd\x91\x8c\x36\x9c\x1d\x8e\x2e\xf1\xd2\xe9\x2b\x8e\x12\x81\xa4\x2d\x98\xa5\xa5\xf7\x3e\x66\x18\xe8\x0d\x8f\xcd\x75\x80\x79\x3f\xd1\xf4\x8e\x2c\x59\xcb\xcb\x5b\x7a\x66\xa9\x27\x94\x79\xe3\x1b\x7c\xa5\xc5\xde\x82\x6a\xb0\xcf\xd3\xaa\xe3\x83\x09\x89\xa6\xce\x0f\xfc\xe2\x3e\x0a\x3d\xd6\x8f\xb2\x56\x1b\x77\x85\x46\x80\x4f\x6e\x14\xcc\x30\x80\xc9\xdc\x9e\x65\x6b\xec\x70\x58\x2c\x08\xca\x11\xba\xac\x41\x5f\x24\x89\xd0\x8e\xa2\x84\x4f\xb2\xe0\xa4\xc0\xde\x04\x1d\x83\x16\x4b\x22\x8d\xca\x02\xb2\x65\x90\x54\x20\x15\x7f\xd7\xda\x40\x15\x62\x1f\xfa\x45\xed\xf4\xa1\xd7\x8e\x4d\x37\x50\x76\xc8\xd5\x45\xf8\x30\x89\x47\xda\xf7\xb4\x50\xea\xf0\x0a\xe0\x49\x59\x4c\xe9\xb9\xfa\x2c\xe4\x3f\xa1\xfb\x9e\x5c\x7a\x95\xcf\xb1\x92\x03\x6c\x19\x71\x5a\xeb\xb2\x38\x2f\xe5\xc6\x71\x7b\x0b\xbd\x4e\x5f\x45\x4f\x2f\xe7\x1b\x84\x41\xbf\xe8\xec\xb4\x3d\xdd\x5f\xb6\x57\x64\xf6\x25\xb1\xa4\xb1\xba\xe0\x4d\x98\xf4\x18\x4b\x9e\x5d\x74\x4d\x21\x38\x6d\x47\xec\x63\x32\xca\xa2\xff\xa2\xb3\xab\x34\xa9\x3d\x1c\x32\xc3\xed\x00\x5a\x37\x0f\x8f\x6a\xe3\xc0\x4c\x70\xf4\x76\xaa\x33\xfc\x23\xee\xc6\x49\xab\x77\xa4\xce\xce\x17\x44\x9b\x79\xe8\xcc\x0a\x1b\xae\x7b\x0d\x77\x75\xa1\x70\xda\xfd\x4e\xa1\x74\x39\x93\x37\x31\x9c\xcd\xcc\xe2\x0d\x92\xe9\xdd\xa5\xf4\xaf\x84\x5f\xff\x4b\xc0\xe3\x17\xfc\xad\x1f\xfb\xab\xbf\xf3\x57\xfe\xc7\x7f\xe6\x1f\xff\xfd\xff\xda\x8f\xff\xe6\x5f\xfc\x07\xff\x47\xbf\xf4\xcf\xff\x7b\xfe\xc0\xfa\x89\x3f\xf6\xef\xff\xfd\x7f\xe6\xef\xff\xfe\x1f\xff\xe3\x7f\xf0\x47\x3e\x50\x78\x28\xd7\xd7\xd9\xfa\x54\x17\x13\xe9\x4b\x05\x68\x5f\xb1\x8e\x24\x4d\x1a\xe8\x88\xb9\xae\x30\x09\x4c\x37\xcd\x36\x75\xa5\x5b\xfc\x8b\x83\x6d\xc1\x1c\x60\xc9\xe9\xe2\xad\x09\x0c\x73\x5b\xd6\xea\x88\xd5\x55\xab\xa8\x2e\x56\xf6\xd3\x12\x26\x09\x93\xd1\x0a\x8c\x2e\xd8\x2f\x2e\xd4\xb3\x20\xdf\x36\xcc\xa3\x09\x2a\xd3\x08\xc2\xd1\xc8\xaf\x2e\xf1\x6c\x4d\x22\x59\x23\x52\xa4\x24\xc5\x2c\x3b\xf9\x96\x68\xcd\x28\xfe\x0b\x7e\x70\xfd\x50\xda\xd4\x3c\x14\x04\x30\x2c\x27\x67\xbf\xa1\xd1\x74\x6b\x34\xdc\x41\x3d\x1e\x43\x71\xea\x0a\xad\x05\x03\x03\xf6\xbd\xfe\x83\xc6\xc3\x04\x89\x32\x60\x84\x7f\xa8\x78\x22\x09\x83\x13\xe6\xe7\x87\xa2\x3a\xe5\x72\xef\x89\xd4\xb6\x45\x49\x42\xab\x46\xf0\x14\x47\x4b\xfb\x42\x72\x0a\x17\x1d\x0b\xe5\xc5\x33\x7c\x14\x05\x0e\x63\xa3\xd1\xa8\x91\xeb\xdb\xc1\xa3\x01\x9a\xeb\x11\x2f\x05\xeb\x91\x74\x0b\x3a\xcc\x27\xf1\x7f\x26\xc6\xd0\x5d\x46\xb6\xe8\x1e\xa5\x79\x97\x9e\x07\xa5\x18\xf0\x6a\x7d\xf3\x57\x12\x9e\x74\x1a\x0f\x04\xf9\x65\xbc\xea\xcd\x3f\xb9\xd6\x6f\x56\x40\xc8\xdf\xce\x31\x81\x88\x8e\x86\x01\x0b\x91\x61\xbf\x15\xaf\xc7\xe6\x01\xae\xb8\x0f\x22\xf2\x01\x66\x2a\x00\x04\xf8\x44\x96\xdd\xe0\x75\x5d\x9e\x16\x79\xd8\xf2\x89\x4c\xd7\x77\x3e\x5b\x41\xb0\x59\xc7\x4f\x37\xcf\x11\x38\x25\x4f\x65\xe8\x64\x69\x38\x6a\xff\xc2\x4c\x02\xb7\x0d\xa9\x69\xd6\x1b\x27\x63\x34\x26\x57\xef\xd3\x6d\xe7\xda\xe2\xa7\x23\x78\x9a\x3d\x35\x3e\x9e\xfb\x9e\x63\xa2\x28\xd5\x2f\xda\x1f\x79\xfa\x3b\x1a\xf0\x6f\x11\xe6\x3c\x1d\x5e\xbc\x9e\x8c\x31\x2a\xeb\x60\x97\xcb\x46\xcb\xb4\x56\xde\x37\x3c\xe1\x3c\xbc\x4d\x75\xbf\x60\x6c\xa9\xd2\x24\x23\x24\x2e\xd5\x3a\x8f\xdc\x4c\x11\x33\xea\x3c\x82\x4b\x68\x32\x82\x5f\xd0\xfd\xd0\x3e\x2f\xf6\x3a\x3f\x53\x3d\x5f\xc4\x0b\xb3\x13\xdf\x07\x94\x1d\x69\x62\x55\x1b\xba\x97\x11\xe7\xf8\xb2\x07\x01\xb0\xd1\xe4\x2a\x9a\xcf\xab\x98\xe5\xf1\x5c\x8e\xdb\x22\x5f\x9c\x8d\xa3\x22\x41\x05\x2b\x39\xcf\x8b\x40\xa4\x54\x14\xae\x5e\x9c\x8d\x88\x53\xb4\xa4\x77\x16\x13\xb0\x5c\x9f\xe4\xf7\x1c\xe2\x1e\x31\xdb\x17\x70\x5c\xe5\xc7\xec\x38\x03\xc2\xba\xd1\xbe\xa8\x6b\x8c\x6d\x1d\xf5\x44\x2b\x96\x32\xa1\x54\x68\x08\xd4\x12\x6e\x0d\xed\x0a\xd9\x27\xa7\x15\x59\x74\xe6\xd2\x91\xf6\xa9\xce\x6b\x7a\xd4\xc9\x12\x14\x09\x74\x7a\x4c\x5b\xb7\x99\xdb\x8f\xad\xaf\xd1\xbb\x3b\x98\x9e\x88\x02\xff\xa2\x6a\xdd\xc1\xf0\x02\xd5\xab\xc6\x2a\xf1\x5b\x69\x04\x98\xaa\xac\x54\x32\xb8\xa4\x67\x6c\x24\x7d\x41\xf9\xd1\xe2\xc1\x5d\x27\x83\xd9\x17\x1c\x3a\x89\xf3\x21\x78\x59\xc2\x73\xca\xdd\xde\x91\x83\x9e\x55\x8a\x4c\xe0\x03\xa7\x68\x63\xa0\x46\x50\xc9\xaf\xe9\x5b\x73\x74\x06\xfc\xc2\x7b\xdd\xc2\x73\x39\x45\x27\x32\x7a\xf0\x39\x49\x9f\x37\xa4\x97\xc3\xb3\x83\xe2\xbe\x22\x91\x5b\xbb\x7a\xb5\x43\x4e\x79\xf0\xba\xe3\x93\x03\xd2\xf4\x5d\x06\xed\x33\xdc\x01\xd4\xbe\x9e\x3e\xab\x37\x57\x9d\xd2\x95\x92\x81\x45\x26\x61\x5c\x82\x8e\xb2\x72\x96\x33\x94\xf5\x9f\x0c\xed\xec\xff\xcf\xde\x7f\x46\x55\xcd\x7c\x0f\xff\x30\x20\x2a\x60\xef\x5d\xb1\x62\x2f\xc9\x49\x62\xc3\x06\xf6\xde\x05\x6b\xfa\x49\x4f\x4e\x4e\xaa\xd8\xc0\x8a\xd8\x2e\x7b\x07\x7b\xc3\x8a\x8a\x5d\xb1\x63\x43\x54\xec\x5d\x54\xec\x15\xbb\x3e\xeb\x7b\xff\xee\x75\x91\x7b\xfd\x9e\xb5\xae\xeb\xcd\x79\xf5\xff\xb2\x16\xef\x3e\x67\xcf\x9e\x9d\x9d\x99\x3d\x7b\xf6\x4c\x34\x44\xd1\x50\x1c\x36\x40\x9b\x90\x71\x99\x91\x39\x8f\x0e\x28\xa8\x26\x52\x9a\x40\xa0\x5e\x0f\xed\x26\x44\x56\xd2\x31\x84\xb0\x05\xca\xc3\xd3\xb8\xed\x8b\xb8\x93\xe6\x31\x97\x25\xa9\x18\x26\x50\x20\x0e\xd0\x2e\x93\xe4\x71\x09\x71\x5b\x24\x49\x70\x0c\x0d\xb2\x36\x4a\x5a\x94\x5b\x25\x0c\x1b\x51\x78\x2f\x08\x99\xa8\x2f\x62\x2d\x59\x67\x08\x11\x90\x10\x8d\xe0\x5c\x2c\x8d\x11\xba\x2d\x0b\x38\x02\x32\x0a\xe9\x25\x24\x43\xa1\x4d\x08\x86\x01\x8f\xd7\x32\x01\xd0\x96\x0d\x41\x63\x7d\xb2\x87\xae\x62\x2c\x21\xc9\x22\x41\x08\x80\xc2\xe1\x84\x24\x78\x70\x88\x63\x30\x9b\xd0\x65\x49\x46\x79\x0d\xb0\x51\x4a\x15\x04\x45\x75\xe9\x08\x8b\x5b\xa2\xe9\x93\x2a\x6b\x55\xa2\x15\x82\x90\xdd\x9a\xe2\x41\x31\x1a\x75\x13\x94\xe1\x75\x69\x10\xc6\x19\xb2\xc5\x33\xa4\x49\xc9\x1a\x8f\x80\x6e\x0b\x32\x20\x0d\xa2\x3c\xb4\x5b\xf1\xc5\xa8\xc5\x03\x0a\xe8\xb5\x30\x98\x21\x60\xce\xab\x42\x26\x05\x00\xa6\xcc\x19\x1c\xe3\xd6\x6c\x17\xea\xd5\x6c\x15\x44\x51\x14\x61\x65\xb7\xae\x48\xba\xdb\x42\x71\x5f\xcc\x66\xba\x57\x92\x09\xc5\x63\x08\xb2\xe6\x56\x21\x1e\xb3\x01\x44\xe4\x20\x06\xfd\x4f\xa8\xa7\xca\x28\x24\xb9\x28\xaf\x80\x92\xb0\x0b\x27\x15\x43\xf2\xc0\x88\x2f\xbe\x88\x87\x0a\x8c\x4b\x06\x6d\x0d\xe0\x30\xce\xf0\xa0\x10\xee\xb5\x28\x40\x14\x51\x08\x74\x71\x1e\x97\x8b\xa5\x11\x06\xc3\x34\x81\xd1\x3c\x90\x07\x46\x75\x12\x14\x38\x5f\xd4\xe8\x09\xaa\x49\xb0\x34\xad\xc8\xb8\xa4\x12\x98\x69\x01\x90\xae\x89\x0a\x82\x53\x24\xcd\x29\x2e\x8f\xae\x81\x26\xeb\x91\x01\x8f\x6c\x0a\xa8\x42\x8b\x02\x82\xfa\x62\x4b\x5c\xb1\xbd\xa2\xcd\xc0\x98\xd7\x65\x30\x1c\xc7\x72\x0c\x07\xb9\x38\x08\x35\x24\x44\xe6\x10\x40\x31\x10\x46\xe2\x08\x94\x23\x0c\x8f\xdb\x8b\xdb\x8c\x5b\x43\x7d\xb1\x42\x64\x48\xcb\x46\x0c\x37\x27\x89\xaa\xea\xa6\x4d\x4c\x62\x75\x45\xb7\x5d\x16\x0b\x78\x69\x95\xb2\x39\xd6\x2b\xb2\x04\x42\x59\xb8\x00\x1b\xa6\xc1\x19\x9c\x2f\xb6\xb8\x50\x19\x62\x2d\x12\xb5\x55\x80\xe0\x50\x51\xc0\x39\x93\x73\x19\x2e\x45\x55\xbc\x38\x49\x98\xb4\x06\x92\x28\x4b\xb2\x00\xee\xa6\x75\x9a\xa4\x65\xb7\xa9\x2a\xea\xff\x4a\x78\x50\xf5\xf3\xad\x4d\x9f\x4d\xa6\x5b\xdf\x9f\xce\xbe\x56\xfe\xfa\x0c\xbf\x0e\xb7\xf6\x67\xb4\x0a\x7f\x05\x1d\xed\x59\xf9\x78\xea\x8c\x9d\x3e\xa8\xf0\xa0\x4d\x5a\xd0\x6c\x02\xa1\x01\x5c\xa6\x78\x55\x62\x48\x2f\x00\x90\x98\x89\x9a\x94\xa4\xb8\x40\xda\xb6\x3d\x02\x25\x30\x28\x01\xab\x94\x05\x52\x8c\xe0\x8b\x4f\x1f\xa1\x2c\x4d\x9a\x0c\x69\x90\x14\x8b\x18\x9a\x17\x95\x21\x09\xa2\x54\xdd\xe6\x41\xd3\x86\x45\x56\x47\x00\x0b\x27\x65\x8f\x29\x68\x06\xc8\x51\x88\x0c\xcb\x80\x2f\x42\x44\x03\xf2\x20\xb6\x6a\xea\x98\x49\x79\x10\x95\xf2\x50\xbc\x8c\x58\x22\xe7\x41\x30\x8e\xb2\x48\x8d\x22\x19\xd2\xc4\x18\xb7\x41\xe3\x24\x2c\xa8\x1c\x09\x59\xbe\x58\x3a\x28\x10\xc1\xe8\xa4\xfc\x9f\xd8\x03\x45\x14\xcb\x8d\xe2\x06\x62\x7a\x05\x9c\xf2\x32\x86\x05\x1a\x88\x44\xb8\xbd\xb4\xe6\xa2\x29\xc0\xd4\x60\x1c\x65\x38\xde\x17\xa1\x00\x41\x1b\xb0\x4a\xe3\xac\x20\xaa\x20\x8d\x19\x16\x48\xc0\x2e\x53\x36\x75\x52\x60\x30\x14\x50\x11\xc3\x30\x11\x0e\x47\x50\x2f\xca\x52\x94\x68\x7a\x20\xdc\x17\x97\x8a\xb1\x16\xad\xe1\x26\x22\x79\x3d\x30\xc9\xb8\x35\x99\xd1\x54\x0a\x07\x18\xcd\xc6\x19\x8c\xc5\x35\xd6\xe4\x21\xd2\x90\x09\xaf\xa6\x5a\x6e\x8f\x41\xf2\x0c\xe3\x8b\x40\x55\x17\x6c\x95\x65\x60\x84\xf4\xf0\xb0\x57\x31\x48\xb7\x47\x46\x00\x8a\xe2\x5c\x6e\x59\x55\x40\xd6\x14\x40\x43\x81\x10\xcc\xed\x11\x0d\x56\x54\x28\x41\xb6\x7d\x72\xcf\x0d\x2f\xc3\x20\x69\x58\x2e\x0f\x6e\x5b\x1a\xc4\x5a\x20\xed\xa2\x20\x88\x10\x31\x50\x65\x74\xcd\x14\x64\x58\x54\x6d\xc5\xad\x90\x32\x6b\xca\x06\x2d\x29\xbe\x08\x8b\x60\x50\x10\x69\x94\xc1\x60\x97\x04\xe8\x1e\x11\x20\xdd\x90\x89\xd2\xa4\x46\xdb\x1a\xe3\xc1\x61\x5e\xd1\x24\xaf\xe2\xa1\xdd\x24\xca\xeb\x96\xac\x83\x84\xe2\x8b\x44\x98\x00\xaa\x24\xc5\x40\x08\x26\x4b\x80\x4b\x97\x25\x90\x33\x50\x05\x33\x60\x4a\x96\x04\x15\x77\xdb\xa4\xc4\x00\xa6\xcb\x6b\x01\x22\x06\x32\x8c\x8e\xe9\xbe\xb8\x16\x12\xe5\x30\xe0\xff\xdc\x3f\xa0\x4b\x5e\x14\xd7\x45\x2f\xab\xba\x31\x1d\x15\x60\x8e\xd5\x19\xaf\xa8\xeb\xac\xe6\x01\x45\x5a\x44\x68\x9a\x13\x24\x9e\x45\xbd\x3e\xf1\x0b\x4b\x54\x58\xc5\x45\x19\x9a\xe8\x92\x5d\x5e\xce\x70\xd3\x2e\x49\xd7\x58\x18\xe6\x3d\x34\xa0\x19\xa8\x09\x5a\x28\x44\x51\xb8\x48\x60\x86\x84\x78\x60\xc2\x17\x5f\x69\xc1\x18\x9a\xc3\x01\x93\x84\x3c\xb6\x8b\xa3\x71\xc5\x84\x25\x95\x42\x10\x9b\x36\x5d\x30\x09\x53\x32\x23\xeb\x9c\xac\x20\x82\x2a\x60\x8a\x2c\xc2\xa6\xc2\xf9\xe2\xa4\x2f\x86\x41\x8c\x1b\x60\x09\xc6\x22\x45\x4e\x15\xdc\x98\x22\x53\x2c\x0a\x89\x0a\xcb\x68\x2e\xaf\xc9\xf3\xba\x86\xd8\x1e\xdd\x65\xa2\x16\x4c\x82\xb6\x24\x19\xaa\x2f\x46\x2d\x44\x87\x01\x4e\x56\x2c\x86\xa2\x44\xc3\x4d\x18\x14\xab\x4a\x16\x08\x5a\x5e\xd6\x36\x24\xde\x02\x20\xd2\x25\xdb\xb4\x61\x4b\x14\x85\xa3\x90\xad\xc9\x1e\xdf\x7c\xed\x0b\x63\x6d\x0d\x14\x55\x80\xb6\x41\x18\x93\x34\x5a\x25\x55\x88\xf3\x88\x98\xc4\x53\x06\xe9\x01\x31\x05\x72\xbb\x78\xc4\xed\x02\x28\xd9\x63\xb8\x21\x5f\xec\x0f\xa2\x06\xc1\x81\xa0\xdb\x6b\x49\x3c\x64\xbb\x10\x91\xa1\x34\x9d\x23\x5d\xaa\x04\x6b\x10\x83\x78\x39\xcd\x62\x45\x5a\x94\x49\x48\x86\x21\x49\x53\x38\x9e\xf1\xc5\x3d\x37\x98\x6d\x33\x6e\x8e\xc0\x45\x51\x55\x09\x97\x05\xba\x21\xd6\xa0\x01\x92\x73\x09\x6e\x40\x23\x4c\x00\x44\xbc\xa0\xce\xeb\x96\x87\x37\x0d\xd0\xe3\xd6\x48\x13\xf3\xc5\x3c\xc2\x03\xba\x6d\xc3\xb0\x42\x82\x0a\x03\x23\x0c\x64\xd1\x6e\x4a\x01\x79\xc8\x24\x2d\x18\xf4\x18\x0c\xec\x51\x4d\x17\x65\xaa\x9a\x28\x02\x90\x60\xa8\xb0\xe5\x8b\x64\x31\xa6\x49\x1e\x94\x71\x4b\xa2\x20\x50\xa2\x0e\xb8\x29\x94\x16\xdd\x36\x24\x42\x2c\x88\x92\x08\x29\x7b\x60\xca\xf0\x0a\x08\x4b\x58\xa4\x17\xc5\x74\x49\x06\x7d\xb1\xa4\xf4\xba\x68\x92\x76\x01\x18\xaa\x43\x00\xa6\xf3\x86\xa2\x02\x80\x0b\x83\x11\x49\x02\x25\x9a\xf2\x18\x14\x0f\x88\xa4\x26\x20\x84\xc4\x72\xb8\xe6\x81\x25\xcc\x17\xf5\x8a\x5e\x5e\x84\x29\x0a\x55\x0c\x4c\x96\x28\xcb\x23\xca\x2e\x14\xd7\x55\xb7\xa9\x02\x02\x20\xb1\x1e\xc9\x20\x0c\x9e\x63\x05\x91\x30\x0d\x03\x36\x6d\x40\x04\x7c\x71\x64\x16\x50\x04\xd1\x50\x70\x4d\x50\x79\x81\x60\x78\x12\xd2\x5c\x1e\x96\xc5\x05\x1b\x05\x24\x5e\x76\x11\x18\x83\x53\x1a\xeb\x75\x0b\x80\x57\xa2\x74\x81\x15\x7c\x72\xe7\x0f\xe7\xf5\x32\x2e\x04\x24\x5c\x98\xc4\x31\x3c\xab\x13\x02\x66\x7b\x6d\x43\xf1\x52\x5e\xd1\xf6\x00\x00\x44\xc8\x2e\xce\xc3\xc1\x18\x64\x70\xa2\xcc\x63\xb0\x4f\x0e\x74\x43\x84\x81\x79\x05\x43\xd4\xbd\x98\x2c\x0b\x02\x45\xf0\x10\x4e\x2a\x36\x25\x9b\x2e\x0c\xd5\x6d\x2f\x86\xd9\x84\x97\x44\x30\x97\xc1\xc0\x34\xc6\x6b\xb2\xd7\x17\xf5\x04\x82\x26\x00\x8c\xae\xcb\xaa\x97\x82\x05\x93\x95\x3c\x94\xed\x75\xcb\x28\x40\xa2\x1e\x92\x10\x79\x06\xb5\x41\x1e\x85\x19\x4b\x05\x5d\x28\x01\xa8\x16\xad\xf8\xa4\xda\xc5\xcd\x7b\x78\x5d\x80\x05\xc4\xe3\xe6\x55\x0a\x50\x54\xcd\x40\xbc\x02\xa0\xc3\x32\x61\x49\x5e\x8f\xce\x93\xba\xe2\x41\x61\x04\x93\x15\x5b\x11\x00\x02\xf5\x45\xb5\x8b\xc9\x92\x36\xc5\x8b\xb8\x2c\x33\xb2\x0b\x75\x13\x2e\x06\xb7\x00\x08\xd4\x6d\x8f\xe8\x21\x64\x9d\x03\x69\xc9\xed\x96\x04\x90\xb0\x21\x98\x12\x05\x80\xf7\xc9\xc1\x1a\x0b\x01\x3d\x80\x87\x97\x55\xc5\xe2\x41\xc3\xb2\xfe\x13\xfc\xf1\x9a\xe0\xf5\x92\xaa\x17\x65\x40\xde\x46\x44\x58\xb3\x60\x18\x75\x29\x5e\x8f\x84\x88\x22\xe6\x83\x99\x1d\x53\x48\x84\x93\x69\xc1\x50\x10\x85\x75\x4b\x3a\x06\x2a\x26\xcb\x42\x2c\xaf\x20\x94\x48\xb0\xa2\x4a\x9b\x24\x8e\x8b\xa6\x26\x10\x2e\xaf\x60\xb2\x38\xe9\x93\x63\xe5\x1e\xc5\x43\x21\x84\x1b\xb6\x14\xcd\xa5\xd1\xac\x8b\xb4\x60\x8b\x30\x3c\xb4\x61\x7a\x74\x2f\x6f\x9a\x28\x8d\x91\x8a\x28\x49\x0c\xeb\x61\x39\xc1\x45\xe3\xb8\x2f\x56\x02\x0a\x88\x98\xb8\xcd\x79\x20\xce\x63\x99\xa6\xce\xd8\x1e\x1c\x03\x4c\x01\x91\x25\x55\xd4\x4d\x01\xa1\xbd\x86\x80\x90\x2e\xda\x80\x74\x56\x07\x20\x0a\x40\x3d\xff\x2b\xe1\x31\x63\xe5\xe3\xa2\x1f\x66\xb5\x7a\x9e\x7b\x72\xcc\xbd\x84\xa9\xed\xfb\x3e\xfb\x8c\xde\x8c\xab\xd9\x64\xbe\xc7\x7d\xf4\xfb\xa8\xb8\xf4\x58\x5f\x54\x78\xe8\x08\x4f\x0a\x02\xe0\x62\x29\xc5\xf0\x88\x28\x01\x28\x92\x2d\xb2\x14\xc3\x80\xb2\x0d\x81\x1e\x01\x55\x2d\x55\xd0\xdd\x1c\x6c\xf2\x36\xa3\xd9\x84\x4f\x2e\x8f\x52\x61\xd4\xab\xda\x98\xae\x5b\x18\x4b\x81\xb2\xad\x81\x02\x4a\xba\x08\xc8\xc2\x50\x95\x97\x3c\xa0\xdb\xc5\x42\x36\x21\x00\x1a\x24\xe8\x86\x82\xd1\x04\xee\x93\xef\x1b\x23\x08\x0f\x58\xac\x0a\x8a\xaa\x8a\xf1\x82\xc4\x59\x34\x48\xea\x1a\x43\xb8\x65\x92\x40\x30\x8e\xc4\x59\xd0\x85\xa3\x88\x65\x53\x88\xce\xaa\x24\x61\xfb\x22\x5c\x96\x00\x4d\x95\x4c\x82\xf7\x7a\x45\x09\xa2\x60\xb7\x06\xb8\x34\xda\x4b\xaa\x3c\xad\x6b\x2a\xa5\x60\x30\x0d\x2a\x2c\xaf\xc2\xb2\x08\x12\x2c\x0b\x43\x1a\xeb\x8b\xfc\x1d\x8a\xe0\x1c\x6b\xb9\x34\x98\x86\x69\x48\xc0\x69\xd6\x44\x68\x82\x43\x60\x58\xe6\x40\x14\x13\x18\x4b\x45\x30\x8d\xc4\x11\x9c\xc1\x51\x0e\xe7\x65\xde\x17\xb7\x24\xa0\x02\x29\x82\x1c\x48\xf2\x00\xcc\xc0\x38\x47\x62\x2e\x58\xf0\xb0\x24\x2e\x53\xac\xdb\x45\x68\x32\x61\xba\x0d\xc0\x03\x63\x04\x4f\x00\x86\x4e\x9b\x96\x0e\xfa\xa2\x78\x0b\xf3\xd0\xff\x71\x49\xc6\x10\x01\xda\xb2\xbd\x8c\xc4\x7a\x31\xcc\x6b\xe1\xa4\x8a\xa2\x9a\x4a\x32\x22\xa3\x19\x94\xad\x4b\x34\xc5\x68\x82\xcb\x85\x73\xbe\x38\xf6\x85\x6a\x5e\x1b\x56\x48\x02\x14\xdc\x96\xe1\xc5\xbd\xb0\x49\x0b\x3a\x65\xe9\xb2\x40\xba\x0c\x98\xe2\x54\xd6\xd2\x0d\x8f\x86\xc2\xa4\x8b\x83\x74\x45\xc3\x40\xc6\x17\xa7\x9e\x71\xdc\xa3\xf1\x2e\x55\x70\x1b\x84\x9b\x36\x25\x4a\xe2\x54\x92\x30\x2d\x52\xd3\x41\x0c\x00\x71\x5c\x24\x5c\x06\x03\x1a\x6e\x58\x51\x68\x54\x71\x7b\x28\xcb\x17\x87\x8c\x18\x17\x84\x09\x6e\x98\x44\x68\x16\x36\x61\x11\x02\x69\xc3\x22\x55\x82\x63\x6d\xcc\x82\x55\x80\xb7\x35\x86\x11\xbd\xac\x5b\x33\x5d\x00\x28\x4b\xa8\xee\x93\xef\x1d\xc8\xb6\x6e\xd2\xa4\xa2\xf0\x24\xa8\x08\x04\x87\x21\xb2\x8e\x2a\x8a\x84\x62\x06\x27\xbb\x58\x0e\xa4\x08\x18\xc3\x05\xd8\xeb\xd6\x40\x5b\x53\x14\x17\xef\x8b\x65\x14\xa6\x32\x9a\x82\xcb\x3c\x04\xd0\x1a\xaa\x79\x11\xc1\x23\x62\x20\x0b\x93\x18\x2b\xba\x14\x42\xd1\x30\x0a\x85\x69\x0a\x62\x54\x82\x11\x50\x04\x55\x00\xdd\x27\x25\xa7\xa4\x2d\xb9\x25\x8e\xb4\x78\x41\x75\xb9\x48\x4e\xc0\x59\xc1\x06\x09\xdb\xa3\xa2\x9a\x20\x50\x14\x4e\x7a\x20\x91\xd6\x21\x54\x47\x35\x4c\x97\x24\x40\x06\x7c\x11\x90\x78\x15\x2f\xe3\x25\x69\xb7\xa6\x7a\x78\x44\xc4\x28\xc2\x2d\x03\x00\x02\x68\x12\x03\x12\x8a\xa4\x79\x50\x94\xc7\x64\xd3\x2d\x9b\x22\x23\xc1\x26\xaf\x61\xaa\x2f\x46\x2d\x02\xe0\x19\x10\xb2\xbc\x6e\x84\x43\x19\x88\x34\x2c\x1c\xc0\x35\x08\x00\x64\x86\x86\x4d\x5e\x07\x11\x86\x87\x54\x9e\xc1\x59\xd2\xab\x78\x49\x82\xe0\x7c\x31\x82\x63\x90\x40\xb3\xa8\xe4\x52\x21\x06\xb3\x40\x0b\x97\x5d\x32\x0b\x1a\x80\xa5\x4a\x26\x8e\x1a\x8c\x06\xb0\xa4\xaa\xca\x86\x84\x50\x3c\x07\x7b\x74\x83\x37\x7c\xb2\x8c\x92\x0c\x8f\x8c\x18\x0c\xef\x72\x13\x28\xa4\x53\x30\xa2\x0b\xb2\x4b\xe5\x0d\x50\xe0\x14\x92\xa6\x51\x05\x51\x19\x90\xc1\x11\x40\xb4\x74\xaf\x64\xb2\x96\x2f\x6a\x2b\x30\xdd\x65\xd9\x26\x84\x88\x22\x89\x81\x2c\xa4\xab\x8c\x2c\x29\x5e\xd0\xb6\x4d\x17\x69\x88\x14\x06\x63\xb6\xe0\xb6\x5d\x14\xc5\x49\x22\x06\x32\x18\x81\x7b\x7d\x91\x9a\x04\x65\x1a\x15\x59\x0f\x0b\xf1\x88\x69\xc8\x6e\x91\x92\xbc\x90\x87\xc0\x74\x42\xd7\x38\x12\x66\x34\x46\x64\x15\x08\xe7\x3c\x18\x28\x08\x22\xc3\x20\x92\xea\x8b\xb1\x13\x72\x61\x10\x6f\xa9\x22\xc0\x51\x80\xcd\xda\xb6\xa5\xc8\xa2\xae\x88\x2e\x0d\xb4\x21\xc2\xcd\x0a\x2c\x6c\xd1\xaa\xe5\x85\x19\x06\xf2\x48\x28\x07\x53\xbe\x48\x9c\xa3\xbc\xc7\xa5\xc2\x24\x4a\xe0\x88\xa0\x49\x32\x82\xf2\x24\xaa\x68\x12\x20\x63\x3a\x24\x4b\xbc\x65\x2b\x16\x23\x00\x5e\x9e\x06\x31\x11\x14\x24\x80\x33\x71\x5f\xdc\xaa\xc2\x58\x5e\x18\xd1\x4d\x12\x14\x04\x80\xf7\xf2\x1e\x56\x31\x51\x0d\x84\x65\x0b\x92\x6c\xaf\x88\xd3\xb0\x60\xda\x3a\xe0\xf5\xe0\x5e\x08\xa4\x35\x52\xa4\x7d\x71\xbc\x07\xf3\x00\xaa\x97\x42\x01\x51\x91\x0d\x9b\x71\x79\x61\x4d\xb0\x34\x01\x34\x49\x9c\x64\x38\x9a\x42\x45\xc8\x05\xe2\x1c\xac\x41\x36\x81\x40\x82\xe4\xa1\x01\x9f\x7c\x8b\x0e\x02\x75\x17\xef\x05\xdc\xba\x24\x7b\xdd\xba\xad\x61\x2a\xc3\x18\x1a\x0a\xe8\xa6\xe6\x02\x10\x9a\xa6\x75\x5e\xc1\x20\xd3\x23\x9b\xa2\x4d\x20\xb2\x5b\xf0\xc9\xb1\x2f\x19\x87\x3d\x80\x81\x52\x2c\xe3\x62\x0c\x93\x90\x21\x83\xd4\x3c\x1e\x89\x24\x09\x51\x70\x7b\x68\x15\x37\x54\x42\x10\x04\x82\xd4\x4d\x52\x52\x01\xdc\xf2\xc5\x71\x40\x14\xa2\xbc\x82\x69\xe9\x96\x87\xa0\x54\x5e\x83\x31\x50\x46\x08\x46\x87\xdd\xba\x57\x95\x71\x0c\x42\x2d\x0a\x01\x00\x90\x17\x04\x95\x71\xf1\xa8\x9b\x36\x18\x5f\x6c\x03\x23\x10\xa7\xc0\xa2\xc7\xcd\xa3\x92\x0e\xf3\x3a\xc6\xe3\x3c\x65\x8a\x12\x8f\x90\x98\xe2\xf6\xe0\xb0\xea\xa2\x29\x9a\xb7\x59\x95\x25\xbd\x92\xe5\xc6\x5d\x1e\x5f\x7c\xf6\x1e\xd1\x75\x84\xa5\x71\x54\xe6\x6c\x42\xf3\x72\x00\x09\xc0\x22\xa9\x2a\x92\x57\xe0\x4d\x5a\x72\x13\x1a\x89\x8a\x1a\x84\x61\x3a\x06\x52\x2c\x8e\xe2\xb4\x2f\x3e\xa2\x80\xb9\x35\x9a\x33\x34\x14\x06\x78\x8e\xe5\x6d\x83\x17\x0d\x17\xaa\x4a\x38\xaf\xaa\x08\x26\xb1\x14\x84\x10\xb4\x47\x20\x69\x89\x97\x68\x17\xec\xe6\x05\x9d\xf3\x45\xfd\x11\x2a\x20\xb0\xc0\x98\x00\xa9\xb8\x04\xdc\xa0\x51\x12\xc2\x09\x9e\x32\x65\x37\x06\x19\x30\x84\x52\x1e\x50\xb2\x41\x95\xb7\x59\xda\x0d\xb9\x78\x17\x28\x33\xbe\x88\x2f\x44\x93\xe7\x25\x59\x27\x19\x45\xd6\x15\xde\x06\x41\x18\x47\x28\x9b\x01\x58\x0f\x28\x78\x20\x55\xa6\x59\x8d\x55\x00\x13\xd4\x70\x8f\x01\x53\x02\xaa\x82\xbe\xa8\x4b\x63\x21\x5c\x94\x70\x45\xc2\x6d\x17\x64\x92\x9c\x81\x48\x2e\x86\x82\x04\x12\x91\x20\x17\xc5\xb8\x31\xce\x56\x30\x0d\xf2\xf2\x18\x6b\xf1\x2a\x47\x8a\x3c\xa6\xff\xef\x23\x2d\xfd\xb7\x9c\xe3\xb0\x63\x61\x93\xe6\xf7\x1d\x30\xe8\x57\xbe\x98\x21\xb3\x37\x5f\x76\x9f\xff\x0c\x44\x7c\xfc\xf3\xa0\xdd\xca\x81\x95\x7c\x50\xe1\xa1\x82\x6e\x95\xc0\x00\xc4\x40\x51\x85\x90\x65\xc5\x00\x6d\x9c\xd2\x55\xdb\x94\x0d\x99\x00\x11\x00\x03\xbd\x22\x64\xb8\xdd\xb2\x5b\xd5\x79\x9a\x32\x59\xc2\x17\xc1\x99\x87\x94\x79\xd5\xa2\x75\x02\xd5\x79\x5d\x46\x35\xd5\x32\xdc\x1c\x08\x88\xb8\x07\x84\x09\x97\x5b\x31\x4c\x12\x15\x20\x8f\xc4\xf3\x6e\xd9\x8d\xd2\x32\x60\xf9\x62\x01\xe3\x82\xdd\x12\xa3\x01\x02\x4d\xbb\x54\x84\x10\x48\x56\x82\x21\x97\x0b\xe6\x6d\x86\x73\x53\x24\x4b\x81\x2e\x8a\x32\x44\xc9\x03\x2b\xaa\xcd\x0b\x36\xa5\xfa\xe4\x8e\x7f\x09\x84\x39\xd6\x84\xbc\x9c\x2c\x29\x2c\x64\xb9\x49\x84\xd2\x55\x8f\x2a\x5a\xb6\x49\x08\x18\x29\xe0\x18\x4e\x53\xb6\xc8\xc1\x2e\x4a\x03\x21\x4a\x06\x7c\xf2\x51\x43\x05\x91\x39\xcc\x46\x01\x5e\x70\x6b\x80\x69\x5a\xaa\x4d\xe8\x8a\x87\x53\x30\xd4\x50\xdc\x26\x0b\x1b\x84\x8b\xc5\xbd\x06\xc4\x6a\x82\x84\x99\x90\xa5\x79\x7d\xe1\x17\x2e\xd3\xe5\x16\x59\x08\x30\xbd\x20\x0e\x8b\x32\xec\xa6\x74\x0b\x60\x75\x5a\x37\x40\x96\xf3\x02\x9a\x86\xe8\x1c\x45\x7b\x01\xce\x45\x9b\x1e\x92\xb4\x6d\x9f\x24\x3c\x04\x8c\x63\x70\xde\x12\x78\x55\xd6\x68\x15\xd7\xbd\x10\x43\xa9\x1e\x4b\x24\x58\x1c\x62\x3c\x04\xa3\xba\x75\x13\xc6\x25\x84\x57\x14\xd5\x25\xa0\x3a\xe5\x93\x73\xe8\xa0\xcc\xea\x5e\x97\x05\x89\x16\x84\xb0\x38\xff\x1f\x27\xa5\x40\xca\x34\xbd\x5e\xc1\xe5\x32\x4d\xd2\xe5\xf1\xf0\xa4\x2e\xc3\x5e\x82\x73\x13\x3a\xc4\x80\x9c\x2f\x6e\xcb\xe6\x60\x53\x47\x78\xc1\xa2\x2c\x58\x87\x24\x4b\x70\x23\xff\x89\x5a\x6d\x05\x92\x29\x45\xc0\x54\x43\x30\x61\xd9\xe5\xc1\x39\xd1\xc6\x19\xc2\x4b\x6a\x16\xe6\x83\x53\xcf\x98\x8b\x61\x25\x83\x11\x2c\x0b\xc4\x55\x50\x04\x69\xaf\x5b\x92\x68\x88\xc5\x10\x05\x86\x3c\x02\xc8\x08\xac\x87\x52\x2d\xd4\x25\x19\x26\x04\x10\xb8\x6c\x01\xbe\x08\xda\xdd\x26\x61\xb8\x54\x54\x44\x49\x80\x50\x4c\x41\x67\x10\xcd\xf0\x82\xac\x8c\x41\x36\x27\xe2\x26\x2b\xd0\xb0\x81\x2b\x96\x42\x01\x00\x46\x4b\x22\xed\x62\x7d\xb1\x0f\x44\xa2\xb2\x89\xe8\x6e\x5e\xf6\x10\xb0\x2c\x62\xb0\x4b\x75\x9b\xac\x06\x82\x3c\x05\xc9\x5e\x55\x20\x21\xd8\x62\x45\x5c\x53\x15\x19\x95\x39\x97\x26\xc3\x98\x2f\xa6\x3f\x09\x10\x75\x02\x72\x69\x02\x2a\x09\x0a\x6e\x1a\xb6\x85\x72\x00\xc0\x50\x82\x8b\x13\x19\xaf\x6d\x78\x64\x45\x17\x11\x9e\xc2\x00\x9b\xd1\x45\xca\x26\x7c\x72\x7b\x06\x61\xa0\x22\x45\xc1\xac\xa0\xc9\x1a\x60\xd3\xa0\x45\xd8\x22\x61\x9a\x5e\x4b\x92\x65\x06\x54\x01\x53\xd7\x4d\xaf\xa2\xba\x60\x80\xf5\x30\xac\xa6\x21\x3e\x39\x0d\xcf\x31\xb0\x5b\x23\x39\xcc\x46\x10\x05\x30\x31\xd3\xa5\x91\x82\xc7\x63\x48\x0a\x87\xc3\x2e\x96\x97\x71\x5c\x62\x0c\xc3\xf2\x70\x5e\xc1\xab\x31\x10\xea\xc6\x7d\x91\x20\xb5\x0c\x37\x2c\x82\xa6\x4d\x6b\x16\xc7\x1b\xa0\x28\xd3\xa2\x2e\xc3\x10\xcc\x10\xba\x4d\x43\x24\xea\xc1\x19\x4d\xc3\x60\x01\x22\x50\x0e\x62\x00\x4e\xf1\xc5\x85\x8c\x28\x86\x68\x96\x5b\x62\x35\x2f\x8c\x79\x10\xaf\x97\x17\xdc\x2a\x2e\x8b\x1a\x84\x8a\xb2\x06\x51\x1e\x91\xb6\x39\xc2\x83\x63\x06\x0b\xd2\x22\x83\x78\x08\xc2\x17\x17\x32\xa2\x2e\x40\x61\x2c\xd9\x56\x71\x00\x67\x64\x50\x64\x68\xb7\x80\x2a\x9c\xd7\x85\xeb\xbc\x44\xd2\x94\x9b\x73\xa3\x6e\x15\x43\x45\x4d\xb2\x30\x02\x03\x48\xc4\x17\x47\x17\x50\xd4\x30\x0c\x5a\x00\x49\x08\x93\x01\x11\x44\x6c\x1d\x31\x09\x96\xb7\x24\xc1\xa5\x11\xb0\x17\x70\xe9\x1a\xcb\xe9\xaa\xa1\x71\x94\x40\x99\x16\x44\xa0\x3e\xd9\x1f\x94\x04\xc2\xab\x72\x24\x60\x58\x94\x6c\xd3\x0a\x4f\x4b\x24\x29\xc8\x34\x61\x71\x3a\x66\xc3\x84\x82\x31\x8c\x25\xc2\x98\xcc\x98\x32\x6b\xa2\x92\xea\x22\x7c\xb1\x98\x23\x14\x41\x61\x10\xaf\x88\x78\x59\x84\xd3\x38\x86\x36\x2d\x9b\xd4\x64\x1e\xb5\x04\x9c\xb6\x49\x4a\x40\x25\x9c\x76\x31\x14\x6a\x20\x5e\x9c\x93\x05\xce\x47\x37\xcc\x28\xbc\xd7\xd2\x24\xc0\x03\xf1\xb2\xa0\x10\x0a\x28\xb3\x3c\x25\xd8\x6e\x8e\xa5\x35\x9e\x34\x31\x1d\x46\x25\x81\xa6\x45\xdb\xa0\x35\xd8\xcb\x82\xaa\x2f\xae\x42\xa4\x60\xd2\x23\xd9\x36\xe6\xa5\x20\xd1\x0d\x82\xb4\xa9\x30\x1a\x64\x83\x96\x08\xb8\x2c\xcb\x92\x61\x97\xc1\x61\xa8\x2a\x00\x34\x64\xb9\x0c\x5b\xa0\x58\x9f\x7c\x1f\x85\x61\x59\x4d\xd5\x59\x9c\x02\x08\xc8\xd6\x41\x90\x55\x04\x04\xb2\x11\x43\x25\x68\x40\xa6\x40\x0d\xc1\xbc\x12\xed\xe5\x78\x58\x05\x6c\x01\x92\x21\x54\xf1\xc5\x55\x88\x22\xe2\x86\x64\x4e\x15\x10\x81\xb0\x4d\x10\x02\x55\xd9\x4d\x4a\xb6\x0b\xb6\xbd\xa6\xe0\xd6\x2c\x2f\x0c\x09\xba\x6e\x8b\xbc\xe1\x02\x50\x03\x12\xbd\x0c\xef\x0b\xbf\xa0\x54\x5a\x47\x44\xc3\x65\x90\x2e\x9c\xb0\x08\x18\xd1\x28\x1a\xd6\x48\x98\xc6\x29\x5d\xf2\x68\x0a\x2a\x6b\x6e\xdc\xc2\x49\x0a\xa1\x39\x0f\xaa\x5a\xb2\x6f\xee\xc5\xe2\x68\x0d\xf3\x30\x1c\x07\xe0\x84\xcd\xa9\xbc\x46\xea\x94\x28\xc8\x22\x63\xa2\x8c\xea\xa1\x51\x10\xe2\x75\x08\xc5\x11\x84\xa3\x54\x12\xb1\x28\x0a\xf5\x45\x2d\x16\x88\x11\x3c\x04\x0b\x02\x43\xe8\xa8\x00\xa2\x34\x47\x23\x90\xcc\xab\xa2\x47\x51\x5d\x08\x6a\xb8\x58\x5b\x06\x61\x13\x35\x04\x8d\x14\x48\x0f\xab\x70\xaa\x2f\xe2\x4e\xc2\xe3\x36\x19\xc0\x0b\xb2\x92\x0a\x90\x6e\x8b\x47\x0d\x46\xc7\x08\xd3\xad\xc8\x2e\x95\xc6\x19\x53\x27\x18\xc3\x66\x69\x52\x30\x75\xd2\x6b\x48\x02\x84\xf9\x22\xbe\x20\x19\xcd\x96\x4d\xd6\xb6\x70\x18\x46\x6d\x8e\xa2\x5d\x2c\x87\xd9\x6e\xd9\x44\x70\x15\x94\x01\xc6\x85\xb8\x08\x9e\x83\x19\xd1\x85\x60\xb2\x2e\x9a\x92\xc7\x17\xb3\x99\x89\xaa\xbc\x05\xc3\x12\xac\x1a\x3c\x8d\x89\x9a\x22\xc9\xbc\xe9\x32\x3d\x18\xa0\x79\xdc\x3a\xad\xa3\x88\x0a\x08\xaa\x08\x00\x8a\x4c\x32\xbc\xa4\x7b\x54\x5f\x54\xc7\x91\x9c\x17\x10\x01\xda\x80\x08\x16\xc0\x64\x13\xf1\x12\x92\x0b\x41\x05\x9d\xa7\x31\x48\x93\x19\x5a\x50\x35\x9b\x45\x25\x5a\xe1\x34\x56\xf5\x28\x32\x8d\xe5\x55\x16\x9f\x29\xf6\x3f\x09\x8f\x89\xbd\xaa\x8f\x79\xbf\xa9\x54\xf5\x8f\xb7\x77\x1d\xb8\x95\xd0\xd8\x75\xa3\x67\xb9\x57\xa5\xf0\x37\xad\x83\xf2\xbf\x1e\x50\x29\x6e\x55\x9b\x89\x05\xfc\x2b\x14\x6a\x17\xd7\xe5\xcf\x7f\xfe\xaa\xf9\xf9\x2d\x6a\x74\xa3\xfe\x90\x30\xbf\xff\xf9\x71\xf7\x9a\xbd\xbe\xe7\xdf\x7b\xf6\x67\x72\xc6\xc7\x12\x51\x59\xe5\x76\xbf\xec\x3c\xe8\xe7\x8a\x4e\x9f\xcb\xd4\x7f\x96\x7e\x77\xc7\xf5\xe6\xc5\xff\x8b\xfe\x17\xfd\x2f\xfa\x5f\xf4\xbf\xe8\x7f\xd1\xff\xa2\xbe\x41\xc7\xef\x0a\xf8\x77\xe0\xff\x9d\xc3\xff\xcf\xf6\x45\xbb\x38\xbf\xd0\xd0\xff\x2f\xff\xcf\x2c\xf4\x3f\x46\x33\xcf\x18\x0f\xb8\x43\x9d\xb1\xb4\xad\x56\x50\xcd\xcd\xdb\x93\x8e\xaf\xfd\x7c\xb7\xc5\x99\xeb\x95\x24\x6b\xc7\xd8\x1a\xfd\xef\xfc\x8c\xfd\x3f\xfb\x3d\x8b\x42\x1d\x0f\x24\x77\x55\x93\x43\x48\xbd\x75\x6d\x97\x6a\x45\x59\x77\xfc\xfe\xec\x91\x95\x8e\x7d\x29\xba\xa6\xf1\x5e\x7f\xff\xde\x9d\x2f\x27\xce\x7c\xe0\x40\x0f\x6f\x9e\x57\x9b\x3c\xb5\x30\xa6\xc4\xd5\x35\xbf\x76\xb7\xa3\x4f\x04\x1e\xff\x4b\x97\x6a\xaf\x2d\x2d\x1c\xf9\x12\x7a\xa3\xe2\xd7\x08\x07\xda\x3c\xa3\x6a\x81\x4e\x3d\xc6\xef\x2b\x72\xa3\xdd\x9a\xd1\xdf\xea\xae\xb8\xb4\xab\xed\xeb\x2e\x5d\x46\x0f\x79\x58\xa8\x76\x55\xf6\x67\xbe\x59\x0e\xb4\x7a\x6a\x8f\x71\x1d\x0f\x3d\x2c\x30\x25\xf2\xe9\xa9\xf0\x8b\x17\xe6\x97\x2b\xea\xff\x22\x3a\x2a\x78\xe8\xe0\x04\x69\x74\xcb\xd4\x8c\x2d\x0e\xb4\x61\xcf\x3a\x50\x50\x56\xc5\xce\x5d\x77\x88\xdb\x53\xfb\xa6\x7e\xba\xdd\xe8\xc3\xfd\xe7\x8b\x23\x7b\x25\xec\x13\x57\x36\x3a\x73\xa5\x81\x03\xfd\x92\xf0\xfd\x2e\x74\xff\xcc\x31\xb1\x5f\x52\x42\x89\xe3\x03\xb5\xf6\x19\xcb\xea\x06\x55\xf8\x16\xb3\xaa\xf9\xd0\x62\x5b\x03\x77\xcf\x77\xa0\xf2\xa8\x1d\xf9\x5e\x25\xec\xb1\x0e\x15\xfb\xbd\xe1\x41\xa1\xf8\x0f\x59\x73\xf7\x4c\xdf\xd5\x36\xd3\xff\x35\xd3\x27\xb8\xf8\x19\xa6\x8e\x03\x2d\x3b\x27\xb7\x70\xb5\x40\xe4\xa3\xf7\xb5\xb4\xa8\xef\xa6\xfa\xbf\x36\xae\xf8\xb1\x2f\x76\x52\xab\x86\x1f\xfa\xa6\xbf\x8a\x39\x3f\x7b\xb9\x03\xed\xdd\xe7\x55\xd9\xf5\xbd\xb7\xf3\x31\x55\x0e\x5c\xf7\x3b\xba\x10\x9e\xe6\x19\xfd\xf5\xe2\xeb\x7c\x05\xde\x05\x74\x77\x4d\x6b\x5e\x7c\xb2\x03\xfd\xd0\xee\x00\x92\xf3\xe6\xb9\x3c\xf6\xfc\xe9\x29\xf7\x6b\xa1\xb0\x59\xab\x72\xf9\x76\xdb\xf9\xd0\xf6\x77\x6e\xf4\x9e\x91\x7d\x25\xd7\x81\xfa\x77\x6f\xb5\xa9\xcc\x8f\x6b\xcd\x47\xd7\x17\xeb\x20\xec\x88\x16\xc4\x9e\x17\xa3\x4b\xd6\x5d\xd5\x73\xf8\xa6\x85\x95\x85\xb7\x44\x79\x07\xba\xaf\xfc\x90\x16\x1f\xe7\x77\xa9\xa1\xf7\x1d\xbe\xb4\xd7\x3c\x6c\xc5\xdb\x76\xe8\x87\x66\x83\xc2\xfb\xa6\xcc\x29\xd1\x78\x5a\x85\xfb\xa6\x03\xc5\x33\xeb\x97\x4a\x8d\x38\x5d\x3a\x99\xc9\x58\xca\xa6\x47\xad\x18\x95\xb6\xb7\x4a\x83\x8a\xbb\xa7\xdc\xfa\x58\xa1\xf9\xe6\xd4\xb7\x5e\x07\xca\x28\x61\xf9\xea\x97\x11\xac\xd1\x1d\xf7\x8f\x3e\x1e\xe3\xfe\x15\xd2\xae\xf7\xd4\x3d\xb3\x83\xaa\xe0\x29\x8d\x27\x9f\xcb\xdf\xf2\xa3\x03\x2d\xfe\xfe\xcf\x22\xbe\x4b\xff\xb0\x2f\xeb\xd0\xd8\xd1\x19\x69\x5f\x11\xfb\xc1\x83\x3d\x1b\xbe\x04\x7c\x9e\x76\xf8\x5d\xcd\xec\xf8\x9e\x0e\x74\xc9\x9e\x27\x6d\x8a\x4e\x08\x18\x69\xe7\x13\x96\x37\x9f\x06\x6e\xbb\xeb\x7e\x7a\x6f\xe8\x9b\x8f\x5b\xa7\xde\xbf\xd7\xac\x70\xed\x75\xe9\x0e\x54\xa8\x35\x62\x58\xb7\x90\xd3\xc7\xdb\x27\xeb\xc0\xe3\xbe\x43\xa3\x67\x74\xea\x1c\x35\xac\x79\x6e\xa3\x43\xaf\xc6\x26\xad\x5c\xd5\xd7\x69\xac\xb3\x64\xf5\xf8\xb0\xed\x99\x21\x23\x47\xa7\xab\xd7\xa7\x1d\x84\x87\xbf\x5e\x1c\x31\xd7\x1c\xfd\x7c\x89\x3e\x7e\x15\x7b\x71\xba\xe2\x40\xcf\x7c\xad\x18\x96\x53\x93\xe9\x1c\xdc\x21\xe4\xfd\x99\xe2\x0f\xce\x5c\xaa\xa5\xbd\xbe\x5f\xa2\xe6\xef\xa4\x27\x76\xc2\x9c\x8f\xec\x55\x07\x1a\x77\x7e\x79\xf6\x71\xf7\xa5\x8d\xd5\x23\x7a\x5d\xeb\x43\xaf\x5e\x51\x98\x21\x6f\x75\xdb\x77\xdc\x5d\xa9\x63\xd1\xf1\xfd\x0e\x3e\xbf\xe6\x40\x41\x20\x60\x48\xfd\x2f\xa9\xdd\x1a\x6f\x18\x5c\x38\xfc\x56\x70\x97\x62\x05\x9a\x96\x3a\xe8\x57\xee\x44\xe3\xd9\x52\x48\xad\x39\xed\x7a\x39\x5d\xbb\x54\x11\x84\xbe\xf0\xee\xec\xce\x31\x93\x9a\x8f\x0f\x6c\x42\xdd\xfb\xb5\xbc\x6f\x85\xe2\x27\x7e\xb6\x2a\x36\x6f\xe8\xa8\x97\x91\xa5\x1c\xe8\x8a\xa4\xa1\xc1\xad\x27\x5f\x5b\xa8\x4f\x1e\x75\xfb\xc2\x08\xa3\xf5\xe0\x02\x45\xfd\xdf\x8c\x6c\xb1\x6a\xda\x0a\x72\x4e\x8f\x35\x8c\xd3\x09\x4f\x34\xa9\xd8\xef\xc3\xb4\x9b\xca\xd5\x7c\x57\x8a\x6e\xaa\xbf\xbb\xc1\xa6\xaf\x63\x16\x7d\x7c\x39\x60\x06\xd0\xae\x5f\x8f\x42\xe4\xb3\xb5\x0e\xf4\xc7\xa7\x6d\xe4\xc4\xaa\xed\xab\x86\x6f\xda\x31\xf0\xf9\xfc\x08\x60\x16\x51\xd4\x73\xe7\xe3\x82\x1d\x9f\x0f\x46\xff\xc6\xf7\x8d\x6a\xe7\x40\x39\xe1\x53\xd1\xf1\xa0\xf1\xde\x0d\x85\xdc\xdd\xfd\x6d\xce\xe8\x7e\xbf\xfb\xb4\x6c\x9b\x61\xde\x2b\xbb\x37\xbf\xb8\xff\x8d\x6b\x84\x03\xfd\xfe\x34\xfa\x77\xed\x1f\xfb\xf7\xfe\x76\x65\xce\xeb\xb1\x16\x1d\xde\x34\xbc\xf9\x13\x6e\x42\xc7\x39\x8b\xec\x27\x59\x8d\x5d\x91\xce\xa7\xb5\xf8\x4b\xd9\x7c\x54\xa7\xd4\x0d\xdf\xa6\x54\xbf\x95\xdd\x36\xfc\xcc\x8c\xa1\xad\x5e\xdf\x69\xf2\x78\x5e\xa1\xf2\x6d\x5b\x69\x76\x9f\xa1\x4e\xcf\x1a\xd5\xa5\x73\x87\xed\x01\xf8\xb2\xcf\x95\x67\xa1\x3b\x2e\xf5\x18\x9a\x56\x29\xb7\x4e\xe9\x25\xe3\xbb\xc0\x2f\x97\x30\xf9\x07\x38\x87\xb7\x92\x6f\xee\x8f\x29\x98\x9e\xff\xab\xf0\x76\x69\xc9\x91\x0f\xca\xd4\xf9\xfd\xcc\x4f\x1a\xd4\xeb\xec\xe7\xde\x93\x0a\x28\x75\xea\x7d\xa0\x1d\x68\xd0\xb2\x1f\x71\x95\x9f\x94\xea\xf5\x7b\xd1\xc9\xb4\xd2\xe7\x08\xb3\x5c\xe7\xac\x98\x9a\x3b\xc1\xd3\x53\xee\x7f\xfb\x33\x2c\x64\xee\x42\x07\x7a\x5b\xae\x73\x7c\xd0\xf7\x07\x47\xdb\x3c\x5b\xea\x51\x5a\x6e\x4a\x8b\x71\xef\x5f\x1a\x12\x6b\xa5\x75\x29\x86\x5f\xcb\xde\x3a\x2c\x5f\x46\xe9\x7f\x37\xb8\xfe\xff\x19\x8f\x07\x67\x35\xe8\xdd\x36\xf2\x76\x52\xbf\xfa\xd3\x5e\xcd\x18\x3e\x15\xbe\x11\xf8\xa2\xbc\xfc\xe7\x41\xb9\x7b\xcf\x1a\x16\x4a\x7f\x36\xd3\x76\xa0\x0d\x6e\x7b\xc7\x35\xf0\xff\x6d\xb7\xab\xf4\x3b\x2a\xcb\x24\xba\x14\xeb\xf0\xad\xe7\xae\xdc\xea\xf5\x43\x2e\xa7\x75\xf8\xda\x6d\xe3\xcb\xb8\xd8\x21\x75\xfe\xef\xfb\xd5\xb5\x6f\xe4\xa8\x64\x6a\xe4\x40\x7e\x63\xd0\xdc\x4d\x27\x06\xcf\x2e\x5f\x62\xea\x8b\x66\x8f\x2a\x0d\x4a\x4a\xfb\xab\xda\x8c\x13\x7d\x73\xff\x26\x97\x8d\xed\x32\xa4\xc9\xcb\xfa\xfd\x3a\x4d\xbe\xb9\x71\x73\xf2\x60\x0e\x37\x0e\x25\x0f\x76\x2f\xff\x1a\x54\x91\xbb\x04\x2f\xdb\x5a\x29\x8f\x7c\x7f\xe9\xcc\xc7\xee\x49\xf9\x67\xcc\xf5\x1c\x1f\xf6\xe7\x25\xe9\xf9\xf9\x71\x0b\xbf\x77\x70\xd8\xa7\xb1\x57\x6f\x97\xd8\x82\x97\x3e\x96\x9b\xd7\x7c\x9f\x3e\x7e\xef\xe6\xf9\xdf\xbf\xfa\x6d\xd5\xee\x96\x39\xc3\xd7\xaf\x9b\xf1\x31\x84\x1e\x85\x8d\x2a\x1f\x5e\x30\x6d\x8c\xd7\xfe\x20\xe7\x09\x1d\xff\x07\x5e\x67\xb4\x1e\x5f\x25\xb6\xdb\xae\xaf\xc5\x42\xb6\x25\x4c\x58\x87\x67\x17\x4d\x6d\x37\x2f\x69\x4b\xb9\x55\xf1\xf1\xe5\xa0\x3c\x72\xe7\x8b\x9d\x83\x6b\xeb\xa1\x9d\xcf\x7a\x4f\xd5\x7b\x5b\xa0\xf6\xaf\x65\x03\x65\xba\xdf\xfa\x1a\x73\xa7\x9f\xbb\xd3\xfa\x44\xf7\x2d\xb9\x4e\xd7\x1a\x77\x71\xcd\xdd\xc7\xc5\xd7\x87\x8c\x0f\x6d\xfc\xb2\xbe\xff\xb4\x95\xaf\x6a\xdd\x45\x03\xad\x2a\xa9\x73\x86\xfc\x5e\x7d\x2f\x42\x1d\x94\xa7\x29\x33\xe1\x84\x2b\x65\xc3\x84\xbe\xd6\x92\xf9\x1d\xef\x04\x6f\xdb\x38\xe1\x51\xbe\x56\x75\xba\x0d\x39\x75\x86\x8c\xba\x5d\xab\x8c\x7a\x35\xaf\xfd\xd5\xa7\xb7\x1c\x3a\xb6\xb8\xd4\xaf\x22\xbd\x07\xb0\xde\xad\xd0\xd0\xb2\x25\x6f\x79\xde\xee\x1f\x52\x79\xc9\xd8\xc1\xa9\x70\xe2\x86\x6b\x79\xe4\xad\x1b\xbb\x27\x29\xab\xff\x8a\xff\xdd\x39\x79\x79\xe7\x92\x59\x7e\x9d\xfa\xf7\x90\xe0\x7a\xc1\x57\xb0\xb6\x56\xf1\xbe\x1f\xd9\xf1\x4e\x4d\x43\xd4\x93\xe7\xc7\x84\x25\x06\xa4\xd7\x3b\x1a\xd3\x09\x57\x22\x06\x35\xca\x77\x45\xfa\xa3\x21\x7b\x17\xec\x6a\x12\xfa\xa3\xd8\xd4\x3c\x4d\xd9\x24\x5d\xf7\x9e\x18\xb2\xa6\xed\x80\xb9\x41\x05\x7a\x1f\x4d\x4c\x10\x3b\x9e\x9e\xb0\xab\xcc\x89\x52\xf3\x1b\x85\x55\x9d\x79\x22\x20\xaf\xfd\xc4\xcb\x25\x0a\xb7\xbe\xb9\x36\x6e\xc6\x82\x82\xfe\xa3\x1e\xf4\xfe\x18\xf0\xfe\x7a\xf0\xb9\xec\x15\xc8\xfd\xb4\xa4\xf2\x27\x53\xe3\x7f\xe7\x91\xeb\x8b\x07\x17\xbb\x18\x1b\xdc\xe7\x42\x93\x56\x1d\x4e\x9e\xcb\xee\x59\x76\xc6\xba\xc5\x9d\xb7\x1e\xbe\x7a\xf9\xe0\xe3\x8a\xcd\x6e\x47\xad\xcd\x8d\xfd\x1b\x2d\x3e\xa0\xe8\xef\x94\x94\x31\xb5\x2a\xc5\x4c\x8e\xde\x9f\x58\xaa\x67\xa3\x53\x9e\x81\x69\xc3\x96\x2d\xdc\x42\xcd\xd8\xdb\xa1\x79\xc7\xe5\x79\x42\xcb\x6d\x2b\xd8\x7e\xf8\x8f\xc0\xf9\x3f\x5e\x1d\x78\x5e\xb2\xc6\xb7\x8d\xf8\xc4\x76\x45\x5e\xba\xeb\xde\x29\x33\x32\xe5\x46\xd6\xec\xb3\xf1\x0e\xa1\xbb\x8e\x75\x2b\xf2\x79\x4f\x0d\xff\x94\x9e\x55\xfa\x26\xfb\x17\x8d\x2e\xb7\xe4\xbe\xdb\x24\x8f\x56\xd8\x7c\xe8\x20\x92\x7f\xf9\xda\x82\x79\x42\x5f\xc3\x91\x74\x7c\xc0\x86\xb8\xa2\xef\x76\x05\x28\xc5\xbf\x7f\xc2\x80\xb9\x8b\x83\xf9\x69\x9f\x57\x5f\xe9\x7b\xa9\x1f\xe1\xdf\xd1\xe1\x7c\xe5\xac\xf2\xd5\x5b\xaf\xec\xf4\xe2\x5d\x25\xf1\xd0\x4c\xe3\x6e\x62\x7d\xb0\xae\x1d\xf8\xb5\x5d\x8d\x92\xd7\x72\x7b\x26\xe7\xf3\xde\xca\x13\xaa\xc8\x33\xdb\x1c\x09\x64\x36\x4d\x3c\x33\x33\x5f\xd1\xa8\x57\x37\x77\xe6\x9b\x73\xe4\xf5\xb2\xb7\x67\x72\xb6\x1c\xe8\x3e\x78\x83\x27\xc7\xe1\xfb\x1f\x17\x35\xab\x36\x2b\xfe\x36\x1c\xd6\xb8\x56\x6c\x82\x67\x88\xdf\x68\x6e\x69\x9d\xe8\xb3\x6b\xfe\x94\x8e\xdd\x9c\x5d\x99\xec\xeb\xe8\x53\xe9\x83\x03\xe8\xa1\xe5\x53\xbb\x7e\x8c\x7d\xfe\x53\x2a\x17\xb6\x31\xb1\xfb\xda\xdd\x93\x67\xec\x19\xb1\xe8\xd6\x17\xe8\xc2\xe0\x6e\x58\x9e\xd0\x8b\x78\x8d\xb6\x35\x42\xdb\x11\xc1\x51\xd1\xdf\xd5\xc1\x7a\x35\xe2\x5d\xdd\x8c\xdc\xfc\x56\xc5\x6e\x23\x12\x26\xee\x08\x6c\x70\xd1\xd1\xa7\xfa\x8b\x5e\xd5\x8e\x4c\x18\xdf\x70\xf9\x97\x63\xaf\x2e\x8c\x9f\x70\x6d\x68\xd9\x94\xa6\xb7\xe6\x94\x5f\xd2\xb3\xf4\xf3\x42\xc5\xaf\x9f\xf9\x99\x27\x74\xcc\x82\x7a\x35\x6f\xf8\x83\x45\x82\xf7\x86\xaf\x7d\x98\xbc\xad\xd5\xdb\x48\xa2\xc4\x8c\xa9\x9f\x62\x1a\x1d\xae\x76\x7e\x71\xe7\xf7\x3b\xf2\xc8\xa7\x15\x9f\xa0\xe0\xf2\xfb\xf4\x9d\x29\xe1\xdb\xaf\xa6\x6b\x95\xbe\x5f\x3c\x7c\x71\x7d\xd3\x1e\x89\x54\x4a\xb3\xd6\x10\xb0\x6f\xb9\xd3\x4d\x4f\x2d\x60\xba\xe7\x0e\xa4\xd4\x8c\xd3\x2d\xbf\x8e\xf3\x3b\x51\x69\x7c\xf4\xe0\x7c\x6f\x7b\x2f\x69\xb2\x2b\x68\x44\xda\xfa\x37\xc1\xa3\xf3\x34\xed\xf9\x31\xde\xbb\xe6\xc6\xc5\x29\xf9\x46\x57\xfb\x1e\xe2\x1e\x5b\x60\xdf\x33\x75\x18\xd9\xf5\x73\x81\xde\xd9\x23\x63\xdc\xb1\xda\xe1\xbc\xf6\x67\x8e\x06\xef\x17\xad\xdb\x61\x4e\xdd\xb1\xfb\x4b\xe4\xe4\x7c\xed\x1e\xbe\xef\x5b\xbb\x59\xbf\xc0\x26\xfb\x77\x6d\x69\x35\xec\x72\x05\xff\x3c\x72\xdb\x5b\x28\x27\x65\xf6\x8a\x63\x61\x15\xf6\xfe\x29\x64\x77\xfe\x71\xf5\x76\xff\xed\x25\x42\x12\x8e\x74\xbe\xb6\x3d\xb0\x5b\xc1\x01\x13\x1c\xd6\x1f\x1f\xce\x4e\xbb\xd2\xf4\xa7\x71\x16\xd7\xfb\x2d\xad\x3a\xb9\xeb\xd6\x3a\xd3\xc3\x5e\xcf\x1a\x9d\xd8\xb4\x11\x70\x39\xbe\xd8\xc9\x22\x79\x42\x0f\xe6\x46\x34\xeb\xa2\x6d\x7f\x37\x6f\x7b\xeb\x45\x65\xc4\x4c\xa5\x6d\xff\xae\x1d\x85\x0a\x15\x77\x2a\x2f\x77\x96\x58\xf0\xb3\x61\xb8\xb3\xfb\x75\x67\x74\x63\xeb\x1e\xfb\xb4\xfb\xaf\x65\x6d\xd5\x9e\x0f\x4e\x1e\x10\x57\x8f\x87\xeb\x4b\x65\xc3\xa7\xf4\xed\x7a\xd2\xaa\xdd\xe5\x48\x5e\xf7\x89\x1e\x11\xf0\xf0\x88\x26\x4f\x0b\x35\x2d\x9d\xf1\xf2\xf2\xde\xdb\x9b\xde\xcd\xff\xa5\xe6\x43\x32\x27\x16\xf8\x73\x62\xeb\xbc\x75\x0e\xe7\xbb\x1c\xda\x3b\xf0\x74\xa9\xd2\xf5\x0a\x6d\xd1\x9a\xa5\xc5\xf6\x9b\xda\xf0\xd6\xb1\xd5\x21\x35\xf0\xc7\xed\xa3\xd6\xb4\x8c\x6a\x96\xed\x18\x4f\x9e\x0e\xc5\xdb\x0e\x1c\x53\xe9\x66\x78\x99\x1b\x1b\x8a\x3c\x1d\xd9\x68\xdb\xae\x63\x51\x9f\x9e\x1f\xe8\xb2\xb4\xd3\xf9\x85\xc5\xb2\x3f\xd7\x70\x6a\x9a\x5d\x7f\x62\xfb\x11\x43\x27\x2f\x1d\x21\xc8\xdb\x76\x1d\x29\xdc\xa7\xc3\x3b\x6f\xf3\xbb\x2b\xae\x9f\x3c\x5e\x65\x5e\x89\xe2\xed\x5a\x64\x3b\xd0\x49\x21\x74\x76\x63\xe2\x95\x1a\xfe\x73\x72\xd9\xfe\x57\x4a\x7f\x3b\x57\x00\x0f\xee\x5e\x6d\xe4\xd2\x29\x97\x06\xed\xcc\x36\x3a\x8e\xce\x33\x2a\x49\x2c\xae\xf9\xfd\xc0\x7c\xbc\xce\x60\xeb\xd7\xc4\x5a\x8b\x9a\xf5\x59\x7d\x66\xd1\x56\xee\xdc\xf3\x25\x3b\x1f\xbe\x3c\x38\x6c\xce\xb1\x3c\x55\xbf\xe6\xb0\x2f\xed\x57\x8d\x2e\x86\x1c\x4a\xeb\xaa\xcc\x25\xab\x43\x95\x4b\x2d\xb8\x5f\x21\xba\x40\x91\x9a\x93\x43\xb6\x25\xcf\xd6\x1d\x2e\x3d\xa3\xcb\x23\x5d\xdf\xb2\x68\x57\xd8\x0b\xd3\xd3\x82\x98\xb7\xa1\x5e\xa5\x71\x07\x7b\xae\x39\xf1\x25\xa9\x7e\x13\xac\x47\x55\xbe\x97\xc3\x51\xd2\xbb\xdc\xda\x1f\x58\xf1\x01\x7c\xe8\xc4\x96\x6e\xcf\xf3\x13\xa9\xe3\x84\x0e\xbf\xbe\x24\xaf\x5c\x9c\x93\x78\x72\xfc\x41\xbf\x32\x79\x64\xce\x87\xaf\x25\x5b\x9a\xb5\x33\x27\x4c\x48\xde\x3e\x3f\x3d\x4d\x8e\x2a\x3b\x72\x5c\x5a\x69\x79\x7e\xa5\x0e\x8b\x73\x76\x2c\xaf\xb4\xc3\xe1\x28\x37\xcb\x8f\x1a\x5f\xb6\x6a\xc0\x96\x65\x13\x2f\xfa\x63\xd5\x97\x57\x69\x30\x0c\x5c\x35\xb2\x86\xdf\x5e\xbf\x5d\x6d\xea\xd6\x9c\x54\xa0\x77\x9e\xd0\x3f\xaf\xb7\xbf\x69\xb5\xb0\x71\xf3\x85\xf5\xa9\x0b\x0d\x36\x5f\x3b\x0a\x37\xf8\x76\xb5\xd6\x8b\xa1\x11\xdd\xab\x04\xd7\x15\xf5\x4b\xa5\x72\x27\xfc\x8d\x3e\x7b\x55\xb2\xc3\x9a\x53\xd5\x92\xcf\x94\x94\x77\x44\x98\x59\xbb\x7f\xcf\x7e\x96\xb1\x66\x61\x6e\xb3\xe9\xc3\x67\x95\xd0\x8b\xfe\xba\xec\xe8\xfe\xac\xdd\xa7\x6e\x17\x6e\xf1\x22\xa6\xfb\xaa\xaa\xe8\xf3\x4f\x0d\x5a\x0f\x4e\x88\x8f\x78\x16\x7f\xa0\xf0\xb2\x3d\x60\x74\x93\xc7\xa9\xee\xbc\xf6\x0f\xad\xa9\xb8\x17\x09\x49\x1a\xbe\xbd\xf4\xa5\x6e\x31\x11\xa3\x43\xa6\xdb\xf7\x4b\xc7\xa3\x2a\x54\xe3\x4e\xcb\xde\x67\xc6\x23\xfb\xf2\xc8\xc7\xbb\x32\xc3\x07\x8a\x6d\xf6\xdd\x31\x16\x8e\xdb\xa6\xe0\xab\x7f\xce\x1d\x52\xa5\x46\xc9\x79\xbf\x6f\x56\x2d\x48\x76\x3d\xf2\xf3\x84\xd3\x51\xb6\x8f\xea\x90\xf5\xab\xc2\x7b\x1b\xfc\x36\xa5\x77\xcb\x2e\xc1\x13\x1b\xb7\x6e\x7d\xb1\xeb\xd0\x84\xb3\x60\x7c\xb1\x7d\xcb\x9b\x64\x49\x0e\x74\xb4\xd4\x63\x78\xd5\xd3\xd1\xd0\x0c\x70\xc0\xa8\xe9\xc0\x31\xdc\x2b\xce\x51\x9f\x8d\x38\x97\xb9\x22\xe1\x71\x04\x53\x72\xb0\x91\xd7\xff\x19\xe9\x35\x96\x9e\xed\x72\x73\xfa\x45\xf7\x89\xdb\xf3\x17\xe9\x83\xfd\x0f\x8d\x2f\xba\xf3\x64\xeb\x98\x7e\xf5\x3b\xbc\xe9\x51\xa6\xc5\x74\x87\xa9\x06\xf7\x2c\xa0\x84\x8c\x4d\x88\xfb\x9e\x56\x62\xf5\x98\x1e\x74\xf1\xb8\x16\xb2\xee\xbe\x78\x74\xa6\x7a\xf4\x06\x33\x66\x59\xb3\x94\xff\x47\xd7\x17\xe8\x9b\x30\xe2\xf8\x91\xfc\x25\x66\x18\xd9\x39\xd0\xd6\x46\x7b\x99\xc5\x8b\xa6\x82\xf7\xab\x3f\xda\x75\xb6\xe6\xe7\xb0\x7d\x79\x4f\x75\xc4\xfe\xaa\x17\x6b\x3c\x1e\xff\xe8\xed\x00\x70\x68\xc7\x29\xdf\xe7\xed\xd2\x96\xf6\xfd\x5c\xb9\x8f\x72\x67\xf4\xf7\xfa\x59\xa7\x47\xb5\xc8\xb3\x55\x52\x81\x85\x54\xd7\xec\x07\x01\x15\x3f\xb4\xef\x73\xab\x1b\x27\x40\x87\x2f\x27\xb7\x73\x0d\x14\x1f\x34\xf5\x86\x94\x2a\xb6\xc3\x70\x3c\x2a\xe9\xf0\x84\x1a\xfd\x72\x9b\x83\x55\x6a\xa2\x83\x23\x5f\x4d\x1f\x33\xf6\x65\x83\xb8\x89\xbf\x3f\x57\xb9\x78\xb5\x4a\xff\xb0\xcb\x65\xb7\x3b\x06\xaa\xca\x51\x7b\x8e\xf5\xcf\x6d\xb6\x26\x7e\x12\x5f\xe2\xe7\x7c\x57\xd0\xa2\xda\x41\x83\x9f\x14\xbc\xff\x62\xcb\xbd\xf8\x96\x31\x3d\x1a\xe5\x91\xb7\x97\x4c\xb8\x09\x26\x7e\x9b\x62\x06\xe6\x36\x6e\x52\x73\xcb\xc0\xb7\x77\x2f\x4d\xad\xf6\xe4\xfa\xc9\xf8\xb1\x13\xf1\x56\x14\x90\x9e\x7b\xc3\xff\xdf\x85\x87\xb1\x91\xa1\xe3\xfd\x02\xe3\xf2\x4c\xb0\xb0\x70\xfc\x99\x29\xc2\x83\x80\x53\xef\x06\x68\xc6\x8c\x8a\xd3\x7a\x7e\x9b\x9b\xbe\x2e\x6b\x79\xb0\xbb\xfe\xa3\x06\x7d\xd3\xb3\x67\xe6\xe9\xb0\xf1\x45\x6e\x6d\x3c\xb0\xf8\xb1\x4d\x3d\x9f\x76\xce\x48\xfb\xa9\x8f\x3e\xbc\xb2\xe0\xf7\xac\xa9\x4f\x6a\xcc\x9b\xff\xb2\x4c\xf0\xdd\x1e\x8e\xa7\x15\x57\xf3\x4c\x91\x42\x42\xe6\x5f\xb5\x3f\xf2\xe0\xf9\x4a\xeb\x40\xff\x84\xf1\x3a\x51\x21\xf0\x47\x81\x5e\xca\x8a\x7d\x0f\x81\xc9\x0e\xb4\xfa\x88\xed\x8f\xec\x1d\xfd\xa6\x67\x4e\xcd\xdc\x85\xff\xea\xb0\x88\xa9\xdd\xec\x6a\xea\xa3\xc4\xe9\xd3\xcf\x2c\x1a\x18\x1d\xde\x38\x37\xf7\xba\xff\xbf\x8b\x66\x63\x3b\x84\x02\x13\xf3\xe4\xbe\x88\xcc\x6c\x34\x6a\x5e\x70\x23\xf5\xe9\x48\xfc\xb6\x37\x70\x75\x68\xff\xc0\x8f\x09\x7d\xaf\x17\x38\xf1\x63\x63\x40\xcf\x21\x07\x8b\x3a\x54\x28\xf3\xa5\xcb\xb4\xdb\x43\xe7\xce\x2a\xfc\xac\xe2\x8a\x99\x43\xfb\x14\xdb\xdc\x5b\xe8\x54\xe1\xd3\xc3\x01\xc2\xa5\x2e\x3d\xca\x56\x8a\x1f\xe6\x40\x37\x36\x0a\x58\x39\xf6\xd0\x90\x9e\x55\x36\x0f\xbe\x7c\x7d\xe0\xc7\xfe\xc2\xea\x63\xed\x93\x7f\x6c\x48\xdc\xbd\x6d\xc4\x83\xe5\xd0\x8a\xea\x0e\xb4\xea\xb8\x73\x03\x5b\x56\x2b\xda\x29\x6c\x5f\xf7\xd4\xf2\x43\x4e\x85\xf7\xe1\x5f\xe1\x53\xde\xdf\x89\x39\x5a\xf6\xc1\xc7\x7a\xdf\x88\xb8\xbf\x1f\xd9\x3f\x45\x9f\xb1\x11\xd5\x13\xfd\x1c\x3d\x63\xbf\x7f\xce\xb7\xe9\xc6\x94\x5b\x29\xc5\xd7\x50\xe0\x96\xeb\xc9\xd3\xb9\x1b\xfb\xe7\x15\xbb\x16\x14\x54\xf2\xc5\xa7\xfc\xe3\x72\xce\x39\x74\xc8\x7d\x51\x7e\x5f\xe0\xc2\xe2\xd5\x1f\xf6\x78\xda\xb9\x41\xe2\x97\xef\xaf\xeb\xff\x60\xac\xfe\x71\xe7\xce\xed\x7d\x14\x7d\xa0\x47\xa5\x99\x0e\xf4\x62\xab\x7b\x7b\xaa\x46\x37\x90\xf6\xaf\x14\x56\x9c\xe9\x74\x71\x9d\xbe\x73\xd4\xfb\xba\xed\x27\x94\x39\x7e\xb3\x75\xd3\xa3\x1f\x63\xc2\x1d\x68\x32\xf6\xe2\xe3\xac\x73\x0f\x73\x2a\x37\x1e\xa0\x2e\xeb\x9e\x75\xba\x51\x97\x0b\x13\x47\x07\xcd\x1c\x62\x0f\x3f\x3a\xb0\x2a\x1e\xf9\x2a\xf7\x46\xc0\xbf\x8b\x56\x63\x23\x03\xf3\x85\x86\x4e\xca\x73\xc6\x7c\x73\x97\x6c\x3c\x51\x6a\x53\xf3\x0f\x97\x1a\x4b\xf2\x5f\xdf\xf8\x90\x50\x6b\x08\xf7\xc0\x7d\x2d\x67\x43\x3e\x73\x7a\x83\xb6\xef\xf2\x9c\xf1\xb7\x3c\xba\x32\x94\x16\xa8\x06\x94\xaa\x16\x7b\x60\x64\x95\x35\x0f\x22\x33\xfe\x08\xe7\xbf\xac\x3e\xfe\xa6\x61\xb9\x83\x2f\x76\xbc\x77\xa8\xbb\xe1\x6a\xc9\xb5\xb8\xa7\xf8\xe3\x5e\x57\x9e\xa2\xbd\x3e\x34\xed\x3a\xbb\x0d\xde\xb9\xdc\xa4\xad\xc3\x9a\x8f\xdf\x32\x37\xb1\x60\x64\x07\x07\xca\xf3\x2b\x5e\xb6\x28\xb8\xf8\x8d\x9e\x39\x60\xfe\x8d\xa8\x4d\xc4\x7b\x66\x6c\xdd\x6c\xb4\xcd\xa7\xb2\x63\xc5\x47\xe5\x33\x76\xfd\x76\x4c\x08\x13\x0f\xf4\xf5\xac\x9e\x03\x3c\x2f\x09\xb5\xec\x72\xa6\xcc\xa8\x93\x07\x5b\x0d\x9e\xfa\x72\xca\xa6\xac\x35\x76\x8d\xc2\x6d\xd6\xbe\x8b\xc8\x53\x35\x5e\x6f\x9c\x78\xe5\xe5\xb8\x91\x03\xd6\x95\xef\x9a\x76\xa6\x9d\x1a\x7d\x15\xfc\xb2\xff\x72\xa3\x8d\xfc\x80\x0e\x70\xc0\xf2\x17\x9b\x1c\xed\xc7\x0c\xed\x32\xe6\xce\x84\xc9\x9b\x4a\x1c\x0b\xc8\x6c\xc7\x34\x58\x98\xba\xaf\xe6\x9e\x97\x4d\xb6\x8c\x7d\x7c\xa1\x56\xbf\x6d\x59\x27\x07\xe5\x4e\x0c\xf8\x77\x01\x56\x6c\x64\x07\xbf\xa9\xfe\x93\xf2\x24\x07\x9d\x58\x88\x64\x4c\x3c\x87\x1c\x96\x56\x9f\xb9\xfc\x75\xe1\xf9\x75\x17\xb7\xd5\x0f\xac\x48\x25\x74\xba\x3b\x71\x4f\xfe\xf0\xb9\xcd\x9c\xb3\x52\xc3\x47\x07\xca\x78\xf7\x3d\x4d\x7a\xd5\xe4\x9c\x54\xe5\xe8\xcb\x9c\x17\xf9\x93\x91\x17\x85\xba\x6c\x0d\x2b\x12\x53\x78\xe2\xf4\x6f\x0e\xf4\x58\xed\x0f\x29\x39\xe7\x17\xec\x5f\xfa\x30\x94\x3d\xfc\x6d\x63\x81\xb7\xbb\x03\xaf\x27\xef\x54\xeb\xd7\xfa\x26\x05\x55\x07\x36\x3b\xdf\xf3\x93\x05\x6b\xbf\x5f\x37\xf0\x71\x17\xa9\x5b\x96\xcb\xff\x48\xc2\xb9\x5b\x9b\xdb\xed\x49\xeb\x59\xaf\x61\xef\xb6\x7b\x3b\x57\xd9\xd1\x2c\xbf\x03\xbd\xbc\xe9\x61\x54\xaf\xab\xe5\x97\x8c\x1b\x33\xfb\xf1\x82\x7b\xb1\x75\x8b\x9f\x56\xb6\x45\x6d\xac\x9a\xde\x34\xed\xd6\xdc\xaf\x35\xd6\x29\x7f\xbf\x39\xff\x14\x67\xc5\x46\xb4\x3b\x1a\xe4\x78\x73\xf6\xf6\x3c\x7f\x3a\xdf\xec\x6b\xa7\xae\xd0\x47\xd2\x6f\x42\xcd\x66\x9e\xad\xb1\xf7\x67\xb5\x63\x53\x36\xbc\x1a\x1b\x10\xfb\xf3\xb5\x39\xd8\xf9\xa2\x3f\x7a\x70\x2a\xb8\xc7\xf5\x6b\xe3\x72\x6f\xc7\x0d\x6f\x50\x7a\x7d\x74\xf1\x19\x37\x1f\x5e\x6f\x72\x61\x1d\x50\xe6\xf4\xc4\x63\x6c\x6b\x07\xea\x29\xf5\xab\x40\xc6\xf0\xa3\x89\x1b\x33\xb1\x85\x46\xfd\x6b\xb9\x29\xbf\x3b\x76\x29\x3c\x7d\xf5\xa4\x75\x01\x2b\xfe\x9c\x9d\xb4\xe4\x91\x03\x6d\xe9\x3e\x7f\x68\xca\xe3\x52\xde\xf5\x17\xaa\x17\x3c\xbb\xe9\xa5\xf9\x6b\x49\xcd\xdb\x09\xad\x86\x4c\x03\x87\x5c\xba\x7f\xfa\xda\x94\x12\xb9\xb7\x02\xfe\x5d\x5c\x16\x1b\xd9\xb0\xbc\x5f\xe9\x29\x79\x92\x8b\xb5\xba\x50\x14\xaf\x07\x1d\x03\xd7\x1e\xcf\x42\xae\x3e\xea\x45\x64\xf1\xd3\x13\xa7\xfd\x58\x6b\xc8\x45\xb1\x61\x6b\x57\xa4\x38\x94\x28\xdf\xaf\xf1\xce\xf3\x0f\x9f\x89\x33\x26\x64\x3c\x6c\xb5\x2c\xf0\x49\xec\xd3\x51\xad\x86\x4e\x27\xf3\x1f\xa8\x34\x99\x6b\xa4\x88\xe7\x1d\xe8\xc4\xd4\x4e\xa3\x8b\x8c\xaa\x5d\xed\xe1\xdc\xb6\xa3\xc6\x80\x64\xa5\xb3\x63\x02\xad\x88\x1b\xef\x5b\x9f\xa8\xd7\xa5\x53\x4e\x8b\x2d\x75\x1d\xa8\xb1\xfe\x5a\xd5\xcc\xda\xf7\x53\x06\x40\xb2\x5f\xbe\x47\xd5\x4e\x85\xbd\x1c\x10\x36\x2d\xf9\x6a\xd4\x88\xa9\x29\x05\x56\x5c\x2e\xd1\xd8\x81\xee\x3e\x18\x9b\xfc\xf2\x56\x78\xca\xb2\x49\xe3\xba\x47\x6d\xeb\xfc\xfc\x7d\xd9\xb9\x3b\x83\x8f\x76\x1e\x36\xfb\xea\xa5\x49\xeb\xea\x11\xb0\x03\xdd\xd1\xe1\xc8\xb0\x7d\x3d\x66\x37\x1b\x57\x71\xf5\x03\x64\xd2\xb3\x12\x4b\x12\x07\xd7\x2c\xf4\x7d\x05\x55\x37\x83\xed\x43\x76\x7d\x33\xce\x81\x7e\xdf\xd6\x38\x31\xf9\xee\xfa\x2f\x6d\xca\xe0\xeb\x86\x16\x0d\xeb\x95\xdd\x70\xe8\xba\x56\x7e\xf3\x87\xf5\x7c\x37\x7f\x62\xdf\x6e\xaf\xcd\xdc\xe4\x80\x7f\x19\xc8\x46\x44\x16\x8f\x74\xbc\x3a\xf2\x89\xd6\x17\x1b\xec\x3d\x1d\x44\x25\xd5\x1b\xea\x2a\x9a\x76\xa6\xda\x4e\xf0\x54\xd5\x41\xe1\x97\xf7\xd7\x98\xdd\x2c\x34\xad\xce\x2a\xc7\xa0\x10\x52\x76\x5b\xc1\xaa\x55\x0a\x8b\xef\x26\x6f\x82\x5a\xd4\xb9\xa7\xcc\x49\x59\x14\x3a\x22\x68\x8f\xda\xe9\x17\xfb\x76\xcc\xc2\xed\xcf\xf3\x06\x85\x4e\xd8\xe0\xa2\x7d\x2b\x4d\xda\xdb\x9b\x18\x70\x76\x56\x89\xc8\xdd\x9f\x52\x5b\x54\xed\xd6\x38\xb4\xf7\x82\x63\x6d\x90\x71\x29\xfe\x0d\x1d\x1d\xeb\x9f\xef\x72\x81\x79\xbf\x6e\xa4\x16\xe9\xb7\x64\xc0\xde\x39\x67\xdc\x03\x7b\xf5\x2a\x77\x63\xea\x58\xec\xc4\xf6\x6b\x56\xd0\xdc\xf8\x2a\x0e\xb4\xe1\xc2\x25\x89\x37\xb3\x43\x7b\xff\xc8\x0e\x1f\x78\x0e\x72\x17\x8e\xbf\xf3\xea\x39\x5b\x12\x1e\xb1\x55\xdc\xd4\x62\xc9\xa2\xc1\xce\xa1\xe6\x0b\x32\xb3\xe8\xf2\x7e\xef\x90\x72\x93\xa7\xfd\x0c\xa8\x70\x64\x6f\xe7\xa6\xa5\xa6\xdc\x0f\xb8\x71\xdd\x55\xbb\x4e\xad\x3f\x99\x58\xe3\xbf\x87\x9a\x7f\x8a\xfc\x62\x23\x23\x43\xfd\x66\x3b\xec\x55\xea\x9e\x6d\xc6\x73\x15\x82\x7a\x24\x0f\x2f\xf8\xb5\x63\xf5\x66\xc1\x9d\x4a\x3e\x6e\x01\xaf\x5d\x58\xeb\x41\xd2\xe2\x27\x8d\x57\xad\x77\xce\x24\xba\x35\x36\xe4\xdb\x91\x2e\x0d\x8a\x9d\xdf\x7e\x61\x8d\x5a\x09\xf9\x78\x7c\xed\x85\xe7\xe5\x87\x77\x5e\xd2\xe5\xdd\xf9\x5f\xfb\xf7\x39\xd0\xc9\x74\x54\x25\xf4\xd9\x8d\xf8\x45\xae\x8c\x61\xf4\xe9\x0d\xf3\x52\x1a\x85\x6c\x4b\x9d\xda\xf7\xfa\xfd\x3a\x74\x54\xd0\x34\xe5\xae\x03\x05\xbb\x4e\x28\xb9\x27\x52\x29\xf0\x48\xca\xfd\x36\xe5\xe4\x81\xc4\xf9\xcb\x23\x66\x0f\xf0\x87\xba\x79\xf3\xa5\x96\x58\x11\x1b\xd5\xd9\x81\xbe\x5d\xe6\x8f\x74\x0d\x6d\xdb\xa0\x48\x4c\x05\xbc\x85\xe7\xe1\xd3\x40\xed\xf8\xf3\xe6\x1b\x9a\x1e\xd0\x32\x3a\xac\xbc\x33\xb4\xf7\xee\xbf\xad\xf0\x4f\x41\x6d\x6c\x64\x50\x21\xbf\x50\x87\x15\x5a\xd6\x0f\xd7\xbe\xec\xfa\x9d\xf3\x76\xc7\xa8\xcf\x1b\x6f\x34\xbf\x72\xe4\x6d\xb4\x9d\x59\x2d\x68\x3f\xb4\x6e\x74\xdc\xf5\xce\x20\xee\x50\x42\x78\xd0\x71\xdf\xe0\x2b\x85\xbb\xe6\x8b\xcb\x3a\xd0\x74\xfe\xe6\x1b\xc3\x83\x37\x9f\x09\x6f\xf8\xe8\x7a\xeb\x89\xfe\x63\x2a\x1e\xbd\x50\xc7\x39\x97\xb5\x7d\xb5\x78\xc6\x98\xcb\x19\x2d\xcb\xc8\xae\xb0\x39\x6b\xa8\xd2\xf5\xb4\x06\x4d\x5f\x37\x3c\xbd\xd2\xea\xd3\x7d\xef\x82\x36\xf3\x1d\xe8\x84\x43\x6d\xa6\xa4\x0e\xf9\x6b\x92\x59\x1b\x4e\x5c\xd8\xe4\xd1\xe4\x6a\x1f\xf7\x2c\xcb\x18\x57\x71\xd0\x30\x6d\xe6\x83\x93\x53\x96\x6d\x70\xa0\x2f\xd6\xe5\x16\x9f\x7d\xed\xd0\x47\x63\x97\xe8\xa9\x38\xbb\xf7\x93\x49\xdb\x27\xc4\xd7\x99\x3d\x6e\xd5\xf6\x91\x3f\xe2\x23\x7f\x2c\x79\x98\x1b\x17\xf0\x2f\x23\xeb\x88\xd0\x22\xce\x59\xa7\x17\xaa\x64\x94\xcd\xef\x57\x71\x40\x40\xf3\xf8\x5f\x37\x26\x2d\x9d\xf1\xfd\xfd\xd4\xf3\x4f\xb2\x0b\xcf\x96\x63\x3f\x0d\x3e\xba\x75\x8a\x43\x87\xb1\xc3\x1f\x0f\xe9\x1f\xb6\xfe\x10\x30\x25\x69\xeb\xcf\xa0\x3a\x0f\x9e\xe7\xdf\xbf\x77\xeb\xca\x97\xc9\xe3\x99\xa4\xc4\x3e\x6d\xf7\x75\x74\xa0\x8b\xb6\x6e\x79\xf1\xeb\x9c\xbc\xf9\xee\x9c\x36\x6b\x80\xdc\xf7\x65\x7f\xb5\x2a\xf4\xd7\x1b\xb6\x51\x00\x2d\xed\x2c\x52\x7b\xfd\xc3\xb5\x0e\xb4\xd6\xb3\xf9\x01\xed\xc2\x3a\xee\x78\x32\xe6\xd1\xfa\xeb\xb5\xde\x2e\x5d\x18\xb1\xf9\xec\xaa\xac\x62\xed\xdb\xae\xa8\x3f\xbe\x10\x11\xea\xf4\x9a\x1d\x29\x39\x8d\x32\xea\x67\xec\xc9\x69\xbc\xe1\xce\x5d\x57\xb5\x19\x6d\x5a\x56\x99\x91\x61\xdc\xea\xff\xf6\x91\x06\x55\x0c\x2e\x1b\x9e\x9b\xf5\x7f\x6b\x88\xfe\x69\x9b\x2b\x36\xf2\xcb\x98\x3f\x47\x16\x55\xce\x13\x5d\x6f\x57\xd2\xd6\xd5\x97\x2e\x27\x47\x4c\x7e\x38\xab\xac\xdd\x93\xe3\x6b\xe4\x1e\xdd\x53\x15\xa9\xfa\x2b\xb5\x4f\x85\x27\xeb\x9e\xd5\x77\x2e\x5e\xa6\x7d\xea\xf7\x4b\x9f\x77\x67\xe0\xee\x7d\x9f\xc4\x98\xe5\x9d\x6b\x85\x2d\x52\x9e\xd5\x38\x7c\xc3\x6a\x56\xf5\x47\x85\xe4\xa9\x58\xd7\x3c\xa9\xcc\x1b\x29\x72\xd3\x98\xf8\xed\x63\x5a\x77\xaf\x32\x36\xce\x7d\x7b\xfb\xce\x90\x73\x67\xbc\x1b\xbb\x6c\x6b\x16\x76\xff\x0d\x90\x1e\xed\x94\x9a\x16\xbe\x3d\xa3\xec\xe4\xec\x59\xae\xb8\xe8\x21\xdf\x12\x7f\xdd\x6a\xf6\x78\x46\xa7\x9b\xe9\xcd\xf9\x7d\x03\x7a\xb8\xa2\x8a\xc4\xec\x75\xee\x61\x35\xed\x98\x6f\x44\x4a\xe1\x29\x6b\xaf\xac\xf9\x48\xee\x7c\xbe\x79\x45\xc5\xb1\xc5\x4e\x2c\x22\xca\xc6\x8d\x3c\x57\xf2\x40\x03\xfe\x94\x03\x6d\xd5\x90\x6b\x81\xb5\x29\x9f\xb3\x83\xd7\xbb\x0d\x7d\x5e\xff\x7e\x87\xdc\xa3\x85\x5b\x24\x0c\x1d\x56\xfd\xca\xec\x59\x9f\x47\x17\x20\x1c\xe8\x7e\xec\x25\xb8\xe4\x6c\x97\x92\xd2\x90\x1b\xd7\x22\x72\xa7\xdd\x4f\xa9\xab\xe4\x23\x8b\xc5\x6e\xfd\x55\xf6\xbe\xd7\x7d\xf2\xfd\xb1\xbc\xe5\x53\xa1\x7c\x45\x1f\x16\x9e\xbc\x31\x35\xb3\xc9\x74\x70\xf5\xed\x9e\x11\x15\x76\x56\x19\x54\x62\x5a\xc9\x2b\xfb\x2a\xae\x5e\x62\xac\x13\x7f\xe5\x8d\xa1\xf5\xbf\x24\xc6\x56\x7b\x7e\x23\x40\x3b\x52\x72\xa6\xa7\xd6\xda\xa8\x55\x17\x1f\x16\x38\x9d\x76\xe9\x52\x0d\x76\x62\x9f\x61\x53\x0e\x87\xe7\x91\x5d\x4f\x06\xf4\xfc\xf8\xd6\xbf\x63\xa9\x22\xfe\x5f\x86\x56\x30\x4a\xa6\xa4\x7f\x28\xb9\xc5\xd8\x35\xaa\xee\x90\x4d\x09\x2f\x24\xa6\xae\x63\x08\x2f\x5b\x69\xe2\xc3\x65\x67\xde\xb5\xef\x32\x31\x6e\xb5\xbf\xde\xab\x4c\xad\x3a\x75\xcb\xdf\xe8\x73\xa0\xf0\x7b\xa9\xda\x35\x71\xe3\xba\xe1\x79\x42\x8f\x6f\xee\xb5\x22\xa9\xed\xc9\x21\x13\x4f\x1d\x85\xae\x83\x03\xa6\xfd\x59\xd2\x8e\xcb\x4e\x1a\xfe\xe4\xfc\xa5\xbb\x8f\x3b\xdc\x5b\xe7\x4c\x70\xef\x29\x97\xb8\x94\x59\xdd\xa9\xf4\x74\x2e\xae\xe3\xc1\x88\x66\xdd\xe7\x0c\x2e\x7a\x1f\x28\x5d\xa1\xd0\x95\x09\x09\x85\xf0\xd4\x8f\x5d\xf3\x84\x5e\x4a\x6c\x6d\x08\xbf\x3b\x4f\x78\x93\x76\xe3\x66\x62\xf7\xc6\x5f\x07\x76\x6f\x04\x34\xaa\xfa\x6c\xf5\xfc\x87\xa7\xc8\xb6\x7e\xed\xc6\xe5\x91\x6f\x7f\xbf\xa8\x58\xc4\x6e\xbd\xf8\xdb\xc3\xfc\xdf\x8a\x64\x42\xbd\xb3\xd7\x4e\x2f\x94\xb2\x38\xbc\x43\x7c\xf8\xa6\x2f\x87\xef\x3e\x50\x1d\xae\x9d\x5e\xf1\xfb\x60\xb4\xf9\x12\x28\x22\x76\x75\xd3\x33\x1d\x5f\xe5\xfe\xee\xd5\xbb\xfd\xbd\x53\xf9\x82\x2a\x0e\x5a\x73\x73\x42\xca\xde\x69\x8e\xee\x97\x7f\x37\x66\xf1\x32\x3c\x65\x4d\xdd\xb1\xd4\xc3\xae\x6d\x6e\x4c\xed\x9d\x16\xd0\x61\x7a\xc9\x1d\x77\x0f\xad\x57\x3d\x33\x6b\xac\x77\x68\x3a\x70\x14\x58\x3c\x66\x7d\x02\x96\x99\xfd\xaa\xf9\xb8\x11\xf2\xba\xc9\x15\xf7\xbf\x67\x9e\x56\xa5\x2b\xaf\xac\xf1\xa5\xc3\xc1\xc4\x11\x8e\xf6\xaf\xd5\xaf\x7d\xe5\xf2\x1a\x4f\xc1\xd7\x15\x3e\xb9\x8b\x5e\x2a\x56\x26\x60\xf4\xa8\x61\x61\xcb\xaa\xe6\xfb\x58\xee\xea\x2e\x6c\xfa\x99\x30\xa7\xa7\x16\x66\xdc\xdd\xd7\xf7\x8e\x51\x3b\xcc\x7c\xd8\xac\x6e\xf5\xf1\x43\xbe\x06\x24\x6e\xdf\x22\x1f\xe0\x8b\x57\x2d\x30\xab\xe6\xea\x9f\xf7\x1d\x68\x34\x93\x3c\xfb\x47\xb1\x2a\xb7\x8e\x75\x9b\xb0\xfa\xe9\x97\xdb\x2b\xa4\xca\xf8\xfd\xfe\x61\x1d\x07\x3c\x7b\xd1\xbc\xf0\xd1\xa9\xf3\x0b\xe5\xd9\x5f\x5c\x6b\x9e\xe8\xf9\xac\xf7\x0c\xff\xc0\x86\x73\x33\x7f\x7c\x99\xd4\x6a\x79\xe9\x71\xd7\x03\x9f\xbc\x6a\xfb\x61\xd3\xce\xfd\x87\xe2\x2b\xe7\xf5\xca\xe3\x2d\x3b\x18\xbd\x42\xd6\xac\xce\xd9\xc5\xd3\x4b\x9e\x7e\xff\x74\x6d\x48\xd7\xfc\x3b\xd3\x9a\x52\x05\x4f\x3c\xed\xb0\x40\x24\xf2\xc8\xbb\x07\xdb\x7f\x5d\x35\x77\x3a\xe5\xcd\x39\xf9\x7c\xe7\xd5\xb3\x62\x91\x00\xcf\x21\x38\x63\xe3\xd0\xc2\xf3\x72\x8b\xf4\xcd\x5e\xd8\xc8\x61\xd4\x91\x51\xe0\x9d\x19\xe5\x0b\x7e\x1c\xfd\x76\xe2\x02\xab\x69\xf4\xd6\xca\xed\xcf\xad\xd0\x87\x55\x52\xfd\x3e\x8d\x9d\x19\xc7\x57\x7c\x9b\x27\xf4\x6c\xfc\xdd\x6a\x49\xfc\xa4\xf2\x0f\x37\x29\xc0\x84\x93\x39\x95\x4a\xfc\x59\x36\xf6\x20\xb9\x7e\xf9\x8b\xae\x8b\x9e\xc7\xd9\xbf\xf6\x38\x8c\xca\x84\x9f\x7e\x34\xf5\x48\xa7\x1f\x9e\x65\x09\x69\x8d\x4a\x4c\x5f\xb0\xed\x45\xee\x57\xfb\x4d\xf2\xbd\xe5\x2d\x2f\x46\x8e\xef\x15\x5b\xdd\x69\xd4\xb9\xdd\x5a\x44\x76\x99\x19\xd4\x7f\x97\x58\xf3\xc8\x62\xa0\x5a\x9d\xd5\x07\xeb\xf5\xb4\x6a\x5f\x4f\x2a\xf5\x75\xc5\xc6\xc4\xb3\xe1\xc1\x79\x96\xaa\x7c\x70\x57\x7b\xee\x4f\xce\xd7\xd7\xf1\xa7\x6f\xf9\xb7\x2d\xd2\xa4\xde\xf1\x12\xbd\x5b\x2e\xae\x3d\xac\x94\x89\xa4\x3f\x49\x8f\x4e\xcf\x53\xb5\xca\xad\x29\xfc\xfc\xbb\x7d\x3c\xd7\xb3\x7a\x78\xaf\x0e\x26\x66\xe0\xcf\x57\x34\xdd\x37\xa4\xcf\xe2\xc1\x87\xfb\xc5\xea\xf9\x1e\x3a\x5e\x94\xdd\x13\xba\x87\xaf\x6c\xb0\xea\xf5\x87\xf6\x73\x0f\xbc\xcf\xb7\xab\x49\x4c\xf3\x73\xf6\xd9\xd8\x9f\xf6\xad\x11\x6f\xc6\xd6\x2a\x57\x31\xca\xa9\x69\xbf\x62\x6f\xe6\x25\xcc\xc9\xca\xbf\xf0\xc9\x8e\xbe\x1f\x86\x49\x07\x23\xef\x33\xe2\xb9\x3b\xf1\x51\x11\xfe\x13\x12\x33\xce\x9c\x2c\x98\x67\xd4\x3b\x15\x27\xee\x2d\x33\x99\xb1\x80\x6a\x53\x7f\xee\x29\x9c\xef\xd2\xb2\x7e\x03\xb8\x65\x4d\x1e\xd8\xbb\xde\x56\x73\xb5\x1f\x66\xbc\xca\x6b\xff\x67\xe1\x46\x73\xe9\x36\x0d\x07\xdf\xe9\x1c\x7a\xb3\xc6\xde\x06\xbd\xc2\x87\x6f\x98\xbe\x7a\xcc\xac\xa3\x1f\x3e\x1d\x7d\xfa\x34\x3e\x2c\xc6\xd9\xfe\xf2\xb3\x0b\x5a\x6f\x99\x8a\xe8\x47\xba\x15\x8d\xcf\x2a\x23\xec\x3f\x9d\xda\xf3\xc8\x90\x52\x09\x97\x07\x30\x77\xe5\xbe\x29\x7f\x45\xe5\xb5\x9f\xd6\x7d\x31\xe6\xb9\x9b\xf2\xaa\xbf\xfd\x62\x8e\x9f\x38\xb6\xd8\xa3\x1d\x8b\x52\xa8\x81\x22\xc7\x56\x98\x7f\x64\x21\xda\x7e\x58\x5e\xfb\x8f\x52\xaa\x1f\x9c\x19\xdc\x07\x9d\xd4\xf7\xf1\xda\x11\x9f\x5e\x17\xac\x7e\xad\xdf\xa5\xb2\x51\xd0\xa3\xc7\x43\x73\x99\x36\xc7\x36\x17\x76\xb6\xdf\x6d\xd3\x92\xcf\x62\x95\x97\x76\xc4\xa2\x1e\x37\x1b\xa9\x09\xd2\x82\xed\xaf\x07\x44\x67\x55\x49\x19\xdd\x83\x7e\xd7\x66\xeb\xce\x43\x8e\x8c\xe4\xf8\x51\x5b\x17\xcf\x9e\xd9\xb1\x44\x95\xf6\x6b\x17\x27\x4f\xc5\x5e\x95\x46\xc6\x6c\x88\xf4\xd6\x79\xc9\xd7\x2d\xf0\xe1\x64\x7c\x1f\x47\xfb\x35\xaa\x7f\xe8\x7b\x75\xca\x9c\xa8\xe9\xa3\xb3\xe9\xe2\xeb\x3e\x86\x59\x95\x47\x86\x9f\x89\xbd\x5f\x2e\xbe\x67\xfa\xbe\x9f\xd3\x93\x1c\x03\x55\xbe\x35\xa7\xb8\x0e\xc9\x6d\xfb\xe3\xfe\x89\xd7\x4b\x1f\x1c\xdc\xe3\xdd\xc2\xba\x3d\xca\x8d\x6a\xf2\xaa\xcf\xeb\x21\x8f\xbd\xa1\x58\x83\x3c\xa1\xc5\xd8\xcf\xa9\xf4\x59\x24\x38\x7e\x4a\xab\xcf\x7b\x53\xab\x3c\x0c\x5c\xb8\xb7\x76\xfa\xeb\xdd\x31\xc7\x4f\xb6\x2f\x5c\xa5\x47\xc2\xb6\x3c\x12\xe9\xd3\xa8\xd7\xa9\xa3\x2b\x5f\x77\x4b\xba\xb0\x8a\xbd\x7a\xb4\xd9\x89\x12\x13\x56\xc5\xdd\xdb\xb3\x76\xe6\x98\x2f\xc5\x0b\x6f\x9c\xf1\xdb\xd1\x3c\xf0\xe3\x43\xee\xbb\xf0\xde\xf9\xc7\xbd\x7f\x7c\x37\xbd\x3d\x73\xe7\x78\x78\x78\x76\xbd\x23\x56\xa5\x02\x17\x83\x84\xd7\x85\x46\xec\xca\x13\x1a\xde\x39\xbd\x71\xf5\xe6\xa1\xc1\x45\x12\xc7\x69\x29\xfb\xc6\x94\x0e\xfa\x5d\x61\xda\xfa\xed\xeb\x8b\x7d\x1a\xc8\xfd\x2c\x58\xd2\x4b\x39\xbc\x2f\x29\x64\xca\xd9\xf7\x19\xb5\x83\x17\x26\x9f\x4a\xac\x5d\xac\xdb\xc1\xaf\xad\x58\xcb\x93\x2e\x06\x34\x8d\x3b\x76\xe1\xcb\xae\x8d\xb9\x37\xfd\xff\xdd\xcc\x1b\x1b\xe9\xef\x17\x1a\xe2\x58\x4e\xc6\x6d\x0c\xbb\xb8\x7a\xf1\x5a\xb2\xc0\x88\x4a\xc3\x8b\x25\x62\x8a\xe7\xd5\x12\x6b\x56\xe1\x55\xa1\x9b\x8b\xbc\xbb\xf4\x23\x90\x19\xe2\x5c\x4e\x5e\x59\x7e\xf4\x6e\xf1\xac\xc9\x46\xfb\xc3\x15\x4b\x0e\x4b\x59\xba\xa5\x63\xe5\x7c\x0d\x12\x4b\xd2\x54\xbb\x4d\xcb\xcb\xa6\x67\x17\x72\xa0\x25\x3e\xdf\xae\xbf\xf3\x65\x5a\x52\x85\xfc\xa5\x62\xea\x2c\x6f\x13\x7c\xac\xc9\xef\xf3\x4f\x1e\xdd\x89\x7c\x8b\x37\xba\x7c\x29\xfd\x92\x73\x5c\x8f\xf8\x78\x6e\xea\x17\x69\x9a\x7f\x54\x97\xdd\x55\x2f\x37\x4f\xb6\x27\x17\x4f\x99\xff\xa8\xc4\xb5\xa3\xd7\x3a\xd4\x59\x57\xcc\xed\x7f\xe2\xef\x85\xf2\x3f\x4d\xff\xb1\x11\xe3\x87\x38\x53\x4c\xee\x94\xe0\x31\xe7\x4e\x8d\x8e\x38\x90\x32\xa2\xf9\xa3\xa8\x5a\xab\xb6\xfc\x4c\x36\x8b\x55\x1b\xe2\xad\x7a\xaf\x51\x36\x1f\xf0\xca\x99\x02\xb8\x56\x34\x7b\x68\x2d\x4f\x2d\x20\xb3\x75\x95\x41\x13\x4b\x8b\xdb\x53\x7b\xb0\x67\xbe\x00\x92\xf5\xba\x68\xb1\xed\x17\xfc\x87\xcd\x70\xa0\x67\x4e\xc6\x8d\x6a\xd2\xe4\xc7\x8e\x42\x9f\xe2\x36\x6c\xa8\x3f\x63\xca\xef\x55\xf5\x63\x7e\x51\xd5\xe6\x35\x2a\xda\x74\xdf\x56\x37\x5e\xcf\x81\xb6\x8d\xce\xbc\xbc\x3e\xbb\xc9\xa3\x40\xbf\xce\x77\xf8\x0f\xa5\x46\xef\x2a\xa9\x20\x93\xfd\xe6\xe5\xc6\x0c\xd8\xf0\xf6\xcd\x9c\x1a\x05\x73\xb7\x06\xfc\xbb\x68\x25\x36\xb2\x9d\x7f\x81\x40\x47\x8a\xe9\x4e\x6c\xc1\x83\x83\xcf\x85\x8d\x2c\x1e\xf0\x57\xf5\x49\x2d\xfa\xf4\x0b\xe9\xd7\xa5\x4e\xd3\x0b\xef\x5a\x56\x59\x3b\x78\xd7\xa2\x43\x65\x4b\xe5\x39\xce\x8b\xf6\x57\xab\x4e\x3c\xcb\x1f\x68\x9b\xf5\xa0\x24\x92\xff\x97\xb7\x76\x94\xc7\x42\x3e\xd7\xa3\x1a\x2d\x63\x77\xac\x06\x77\x38\x63\xed\x59\x7f\x4d\xed\x94\xfb\xb1\xf1\xc0\xa8\xc9\x9b\x6f\x4e\x69\x94\x2d\x9d\x78\x1f\x5f\xf1\x98\xab\xfe\xbb\xfd\x75\x5f\xae\x9a\x95\x3a\xf4\xb9\x03\xed\x10\xf0\xc6\x28\x3d\x90\x9d\x97\x94\xb4\xb2\x6a\xf0\x8d\x8c\xd3\x97\xb6\x35\x48\xdc\x95\x52\x65\xf6\xb8\x76\x95\x3a\xbc\x99\xb3\xb3\xad\x03\xcd\xd1\x7a\xed\x4f\x3c\xfd\x71\x54\x70\x4f\xfb\xe5\xe6\xed\x57\x8f\xfe\x35\x25\xb7\xc5\xc5\x1e\x0b\x67\xc4\x41\xdf\x23\x9a\x6e\x6a\x7d\xda\x81\x16\xa6\xc1\x31\x87\x6f\x6d\x5b\x55\x36\x2e\x75\xf0\xb1\xa2\x99\x81\xa5\x17\x85\xce\x1b\xf5\xe3\xe4\x03\x3c\x6d\x97\xdc\xae\x54\xd3\x61\x7f\x67\x51\xff\x29\x64\x8b\x8d\x98\x1a\xe4\x17\xe7\xf0\xf1\xa0\xb4\x08\xbf\xa1\x23\xe8\xae\x09\x75\x28\xf6\x58\xf4\xb6\x9c\x62\xc5\x4f\x3c\x9f\xbf\x60\x7e\x6e\x74\xcf\x87\x9b\x82\x3e\x64\x3b\x66\x39\xeb\xc2\xb0\xeb\x67\x06\xdc\x59\x3e\x45\x6b\x0d\xc5\xe4\xef\xa5\x3e\xea\xbe\xb8\xf7\xb7\x25\x39\xc6\xab\xb1\x97\x07\x2f\x8c\x1b\xd0\x2c\xcf\xb2\x59\x8d\x73\x1f\x1e\x2f\xa3\xcc\xdf\xd0\xe1\xf5\xe6\x97\xd4\xcf\xc3\x6b\x52\x93\x12\xa3\x4a\xfe\x91\x35\x57\xda\x9a\xb6\xd3\x22\xae\x39\xcd\xd5\x3e\x7f\xd7\x32\xf0\xd8\xe5\xc3\x4f\x15\x3b\x2d\x9f\x2d\xb5\xbb\x7f\x8d\x05\xda\xe0\x5a\xaf\x3b\x2f\x68\x59\xa7\xdd\x92\x8c\xdb\x2d\xfe\x7e\x7b\xff\x29\xc0\x8c\x8d\x1c\x3f\xde\x6f\xa2\xc3\xc7\xe3\xef\x0f\x9d\xf0\x32\x39\x35\x6e\xd0\x8e\x2a\x51\xc6\xa9\x23\xd7\xb5\x0f\x83\xea\xaa\x03\xe3\x37\x8f\x3b\x55\xe4\x55\xf3\x5d\xa7\x9d\xfb\x34\x5b\x4a\xad\xff\xf4\x65\xd8\xfe\x9e\x45\xb0\x13\x65\xb2\x76\x77\x9b\xfe\x1c\x2b\x80\x1d\xee\xf6\x61\xda\xb4\x19\x43\x1a\x14\x7a\x51\xb1\x8c\x03\x1d\xb6\xb8\xd7\xe2\x7d\x46\xd0\x92\x4e\x1d\x63\xa1\x8b\x8f\xda\xf5\x91\xdb\x96\xc7\xba\x5c\x2d\x13\xd3\x6e\x77\xbf\xa3\x5f\x9b\x26\x27\x38\x50\xa5\xf5\xcc\xd3\xc3\x0e\x8d\x7f\x33\xb7\xce\x02\xaa\x45\xa3\x16\xab\x97\xcf\x4f\xcd\x24\xaa\xce\x4a\xda\xf3\x4d\x5c\xdb\x75\xf3\xca\x55\x7f\x3f\xb3\x7f\x0a\x89\x62\x23\x42\x83\xfd\x1c\x29\x7d\xcd\xaf\xe4\xcf\x94\xfe\xa1\x97\xb6\xf3\x52\xc1\xd2\x2f\x66\x5b\xeb\x4b\xd6\xd9\x91\x31\xaf\xd4\xef\x9e\xf9\x52\xae\x3d\xb2\xfb\xce\xcf\x7b\x10\xb9\xe9\x71\x33\x57\x14\x0e\x22\x87\xb4\xac\xbd\xb6\x48\xe8\xfd\x4e\xe8\xca\x4e\x4f\xe6\xb6\x6e\xee\x7e\xb0\xe1\xda\x1e\x13\xe8\x6a\x38\xb4\xbd\xd3\xf3\x8b\x5f\xcc\xcb\x9c\x3f\xed\x1e\x5d\x1b\x5f\xfd\x57\xff\xe3\x8f\xa4\xba\x6f\x8a\x87\xb6\xec\xf7\x95\x2c\xbc\xe5\xdb\xe8\xed\x59\x0e\xb4\x62\xfd\x31\x0b\x0e\x0c\x0a\xff\x18\xff\x3b\xf4\xbd\xb7\x58\xd6\x81\x92\xd7\x3b\x36\xa3\x0a\x7f\x3e\x49\x56\x1e\x35\x34\x61\x48\x81\xfb\xb9\xdb\xf3\xfd\xbb\x00\x2e\x36\x72\x4a\x71\x77\xe0\xb4\x3c\xc9\xf4\xac\xfe\xcb\xbf\x4c\x78\x91\x8c\x1e\x79\xef\xba\xbb\x7c\xd6\xa3\x5b\xcd\x32\x53\xaf\x6d\x99\x77\xe7\xcf\xde\x16\x5b\x87\x27\x8d\x4e\x72\x28\xd1\x23\xfa\x57\xef\x51\xdd\x56\xa7\x74\xaf\x5b\xc8\xbe\x38\x27\xbd\xd0\xa1\xe8\x71\xa5\x7b\x5e\x0b\xeb\x9f\xbc\xb0\xd6\xc3\x27\x27\x1e\x2f\x73\xa0\xcf\x63\x22\x43\x23\xa6\x07\x67\xed\xf9\x53\xb8\x42\x86\x12\x10\x5a\x62\xec\x7c\xbf\x22\x35\x4a\x1c\x9b\x38\x26\xa6\xe3\xe9\x55\xac\xe4\x40\xa3\x96\x0c\xe2\x57\xd6\xae\x7f\xd2\x30\x9f\xb5\x2c\x57\xba\xd7\xdc\x2f\xdf\x73\x92\x5e\x16\xfa\xbd\xbe\x70\x09\xb3\x4b\xef\x1d\x4d\x1b\x39\xd0\x5e\x05\x6f\x54\x2d\x71\x82\x5e\xfa\xd8\x6f\x19\xdb\xb8\xca\xf2\xa2\x85\xd2\x53\x47\xed\x2e\xd7\xe1\xb8\x97\x67\x46\xf0\x2d\xc7\xb7\x72\x0e\x8c\xaf\xbb\x7e\x6c\xfe\x62\xd5\x39\x6e\xcb\xe1\x72\x77\x66\x1d\x39\xb9\xf5\xce\xe4\xc5\x57\x52\x47\x94\x2b\x14\xdc\x3a\xad\xe7\xd8\x81\xaf\x9d\x2f\xfa\xf5\xae\x7f\xbd\x1e\xa9\xb7\xbe\x10\x33\x71\x54\xb7\xca\xad\x73\x7f\xae\xdb\xc6\x86\x2c\x1b\xf4\x66\xf7\xd0\x1d\xcd\x4a\x66\xa2\xce\x89\x64\xef\xa4\x77\x8d\xef\x28\xed\x5b\x44\x4e\x2d\xaf\xcf\xae\x36\x02\xd8\x74\x6d\x9d\xea\x09\x3f\xfa\x54\xde\xf3\x9c\x3b\x63\x5e\x76\xa6\x30\x6b\x2f\x79\xf3\xad\x22\xde\x67\x45\xc3\xf1\xd5\x4b\xb6\xd6\xc6\x0e\x48\xed\x79\xa6\xee\xed\x3a\xe3\xe3\xd6\x3f\x6d\xba\x68\xe9\xec\xb6\x87\xff\x4e\x00\xfc\x53\x20\x19\x1b\x31\xbe\x78\x92\x23\x01\xb0\xb6\xcd\xf0\xc1\x4f\x0b\x3e\x52\x7b\x4f\xac\xda\x30\xe4\x6c\x56\x33\xe4\x0b\x7a\xf4\x47\xad\xcf\xf3\xda\x0c\xbd\x7a\x57\x8e\xae\xe7\x5c\x7f\xbf\xe8\x9d\x58\xb4\xad\x3b\x32\xe9\xf7\xef\x66\xf2\xcd\xac\x2f\xdb\x8c\xe2\x6a\x91\xa5\x0f\xbb\xb7\x7a\xbb\xe2\x69\x4c\x7a\xff\xcc\x9e\x0e\x34\x72\xf7\xb5\xfd\x8d\x0f\x95\x2c\xf7\x36\x67\xc2\xb1\xe2\x13\x2e\xcd\x6a\x0f\xfa\xaf\xcd\x3f\xbc\xcd\xa5\xa6\x93\x07\x3d\xd9\x37\xb7\xff\x4b\xe7\xaa\x9e\x59\x17\xa4\x24\xce\xcf\x80\xfd\x3b\x75\xd8\x5b\x42\x7a\x5e\x2f\x38\xee\xd4\xf9\x0b\x8d\x4b\x6f\x69\x9a\xbf\x4b\xe1\xcc\x47\x4d\x1d\xe8\xba\x2e\xef\x6e\xb9\xcb\x12\x2f\xa7\xfc\xf9\x60\xee\x0e\xeb\xb5\x72\x44\xc7\x5f\x3d\x16\x6c\x5f\xfc\xa7\x78\xe6\x14\xcc\xd3\xbc\x52\xa1\xbf\x8d\xf0\x8f\x31\x6a\x64\x80\x5f\xd0\x54\xc7\x50\xb3\xab\x50\xcd\x95\x5f\x57\x2e\x43\x52\xa2\xab\x6f\x27\x16\x59\xc5\xde\xad\x1b\xd1\xf3\xfa\xa0\x75\xdf\xde\xdf\xdf\xbc\xe8\xc0\x87\x37\xc5\x1d\x4a\x4c\x1f\xd8\x3a\x42\x4a\x4a\x4a\x28\xbf\x65\xf1\x0e\xb2\x53\xe7\x67\xb4\x39\x74\xd3\xb8\x2a\x6f\xae\x17\x3c\x37\xb2\xd2\xbb\x93\x86\x33\x39\xeb\xe1\x83\x2a\x04\xdd\xa9\xd1\xa2\xbf\x7f\x8c\x37\x2d\x74\xf7\x82\x8a\x5f\x9b\x2c\xac\x36\xb9\xf9\xc2\x35\x9f\xee\x87\xb5\x6e\x35\x53\x74\x0c\xcd\xdc\x80\xde\x76\x87\x7a\x07\x81\xf0\xb2\xfd\x36\xb7\xee\xd6\x3f\x5c\xbc\x3d\xf1\x68\xf9\x9a\xd7\x4e\x85\x67\xad\xe9\x85\x34\xde\xe1\x5c\x7f\xde\x5e\x7e\x26\xb8\x54\xe4\xe3\x1f\x03\xc2\x3a\xec\x68\xb8\x6f\x7b\xe4\x25\xef\x46\xb8\x76\x7a\x64\xfe\xe8\x63\xcb\xb7\x1d\xbb\x39\xeb\xef\x90\xe2\x1f\x03\xe5\x88\xc0\xe2\x91\x0e\x1b\x8c\xfc\x3d\x62\xc7\xd6\x4d\x65\x72\x63\x6d\xbb\xc4\xaf\x67\xf5\xb1\x9d\x17\x57\xed\x7e\xfe\x23\xb3\xd3\x8e\x40\xef\xbc\xe5\x47\xf2\x17\x76\x74\xac\x93\xd8\x7f\x04\xcf\x5f\x78\xf6\xab\x4c\xe3\xce\xdf\xb9\x2f\x37\xc5\x27\x2b\x70\xf4\xe3\xf9\x8e\x7b\x5f\x9f\xbd\x90\x90\xeb\x15\x1c\xe8\xe7\xda\xdf\x36\xed\x4d\x5c\xfa\xbc\xfd\x87\xcb\x3b\xba\xfe\x28\xe3\x57\x7b\xeb\xea\x9b\xcb\x66\x2c\x4b\x5d\x3a\xa9\xcc\xbb\x26\xbb\x1e\x1e\x73\x7a\xc2\xbd\xce\x49\xc5\x9f\x7c\xd8\x14\x48\x6d\x0f\x5b\xb1\x80\xed\x36\x23\xa6\xce\xc8\xb6\x2b\xd2\xf6\x6e\xe3\x5a\x6d\xad\x33\xe2\xf9\xab\xbf\x67\x92\x7f\x0c\xc1\x23\xdb\xf9\xf9\xc9\x8e\xae\xed\xf7\x1b\xbe\x78\x4c\x7f\xbf\xb7\xaf\xb2\x77\x46\xd7\xad\x06\x5d\x7d\x3f\xbb\x58\xeb\x65\x97\xe6\xdb\x75\xd8\xcd\xab\x50\x3a\xe6\xa4\x43\x09\xda\x6a\xfb\xb8\xe1\xfd\xd5\x25\xaf\x2c\xa9\xfe\xa5\xd5\x8a\x5a\x73\x86\x1d\xdf\x0d\x48\x75\xb8\x9c\x07\x39\x31\x03\xb7\x44\x65\xb5\x71\xa0\x87\xf9\x4b\x2b\x9b\x5f\x1b\x9e\x7b\xe1\xd7\xc1\xce\x97\xe0\xf4\xcc\x4f\xd9\x11\x05\x73\xde\xa4\xad\x7f\x39\x5e\x9d\x9f\xfa\x38\xd5\x99\xf6\x1d\x67\xf5\x79\xb2\x5f\xeb\x75\xd2\xfb\xb4\xc6\xca\x56\xc9\x05\x95\xe4\x92\x21\x27\xdf\x12\x51\x3b\xf0\x80\x1b\x3b\x6f\x25\xbe\xdc\x9e\xfb\xa7\xc4\xff\x80\xff\x54\x76\x1d\x1b\xf9\xe7\xcf\x8f\x3f\x8b\xaa\xe5\x45\xe4\xb5\x33\xcb\xcd\x7e\x3a\x30\xf2\x1b\xb9\xeb\x71\xbf\x37\xc5\x1e\xee\x1a\x77\xfe\xea\xf9\xba\x61\xfa\xe1\x73\x78\x0b\xbf\xd8\xeb\x98\x63\x87\x7c\xe1\x72\xd8\xea\x52\x94\x6c\x58\xf6\x79\x4e\x64\x88\x67\xa5\xf5\xf8\xe7\xf2\x72\xf1\xef\x2f\x54\x48\x4a\xe8\x11\xde\x38\x6d\xd3\xc1\x3c\xf2\xdd\x8e\x0d\xfb\xb6\x0c\x0c\xe3\x57\xcf\x2b\xae\xec\x1b\xf3\x7a\x95\xce\x87\x94\x5d\x79\xab\x79\x9f\x00\xe6\xe9\x97\x11\x7f\xf5\x9e\xec\x58\x10\x04\x45\x3f\xba\x2c\xe9\x1b\x97\x9c\xf8\x76\xb2\xcc\xa3\xe0\x4f\x4b\x8e\x7e\x39\x42\xbc\xa7\xd9\x4a\x9f\x0b\xca\xfe\xcb\x82\x17\x1f\xca\x13\x1a\x5c\xf3\x75\x63\xf2\xd8\xbc\x93\x33\xcb\x25\x77\x1d\xd6\x61\x77\xf1\x03\xe3\x2f\x5e\x79\xb8\xfa\xda\x5f\xcf\x8a\xcc\x24\xd6\xd5\xd8\xb6\x31\x8f\xa4\xdd\xc1\x01\xd7\xe2\x17\xf6\xe8\x54\x45\x3f\x36\xba\xe2\xd3\xf6\x8b\x47\x64\x4c\x8a\x58\x21\x16\x59\x54\xa7\x4c\x74\x52\xa9\x8f\xf9\x1c\xef\x4d\x97\xf7\x51\x93\xf7\xbd\xd4\x4a\xfe\x95\xd6\x62\xe7\xcd\x31\x5b\x83\x1a\x62\xcc\xae\xee\x6e\x91\x5c\x39\xbd\x88\xe0\x96\x8f\x74\xcc\x13\x7a\x6e\xc3\x98\xbd\xaf\x73\xba\xc4\x7c\xbc\xac\xf6\x48\x1b\x5f\xab\x55\x6c\xf1\x96\x0d\xd7\xed\x5b\xd6\x60\xef\x88\xd4\xc9\xcf\x4d\x79\x8b\x43\x68\xd7\x41\x05\xae\x55\xbb\x3c\xa1\x7a\x93\x37\x39\xe7\xc2\xe2\x96\x3e\xfa\x5a\xfe\x53\xfd\xe8\xcd\xbf\x7f\x0c\xdb\x1b\x1a\xd4\xf8\x6c\xb3\x8a\x79\x42\xb9\x90\xb9\x17\xaf\xa8\x37\xd6\xef\xed\x3a\xd3\xdb\x0f\xda\x92\xff\xc4\xda\x25\x4f\x9e\x3e\x29\x73\x13\xff\x71\xe8\xe8\x91\x1f\xdd\x43\x9c\x25\x94\x27\xaa\x94\x9d\x36\xb0\xc8\x92\x7e\xd7\xaf\x5f\x59\x78\xa5\x69\xe0\xf1\x52\xe5\x33\xd6\x29\x3f\x46\x2f\x3e\x12\x78\xb6\x56\xf3\xba\xd1\x79\x42\xe7\x30\xc3\x17\x7f\x4f\xeb\x90\xf4\x46\xcc\x9d\xfd\xa6\xe5\xc1\xa6\x4d\x8f\xdf\x0c\xa8\xb1\x44\x29\x11\xf4\xf6\xf2\x83\x5a\xfb\x0b\x7b\xf2\xc8\xfb\xde\xc5\xe9\xd1\x99\xcb\xde\x74\x07\x4a\xf7\x3d\x71\xd4\x26\xd6\xf8\xb5\xad\x2d\xf4\x6e\x1b\x32\xae\xed\x25\x8c\x8c\x3a\xe0\x2c\x4f\x69\xf9\x76\x7d\xc2\xcf\xe8\xac\x0b\xcf\x85\x55\x37\x9e\x6c\x8a\xdc\x93\x3c\xc4\x3b\x22\x73\x52\xcf\x26\x6f\x56\x7e\x3d\x54\x52\x3f\xe9\xa8\x22\x98\x56\x6d\xc2\xfc\x09\x89\xb5\x5a\xc6\xc5\x64\xdf\x19\x99\xef\xe8\xd4\xb5\x63\xc7\x6e\x1d\xb3\xf3\x79\x79\xbf\x5a\x29\xdd\x7b\x2e\x4e\x04\xf2\xc8\x87\x2b\xb0\x71\x6f\xff\x3c\x23\x92\x4b\x97\x1f\x79\xa6\x45\x44\xd4\x92\x51\x99\xc7\x9e\x6e\x9e\x76\xfb\x43\xfd\x75\x9f\xaa\x82\x85\x92\x9d\xcb\xe6\x05\x8c\xd6\xff\xe0\xe7\x79\x09\x15\xb6\xcd\x50\x7a\x8e\x68\xda\xfd\x49\xf6\xc5\xb0\x3a\x8b\x5b\x46\xff\xbe\xbf\xfa\xcc\xd3\xe8\xe4\x05\x0e\xf4\xfd\xb9\x41\xfd\xfb\x90\xcf\xae\xef\xf1\xbf\x7c\xb2\x6c\xb5\xd8\xf2\xd1\x15\x3f\x1d\xd9\xdd\xe6\x53\x95\x71\x33\x26\x1f\xb2\x7e\xad\x0f\x72\xa0\x9d\x9f\xc3\x4d\x2e\xf7\x2c\xd4\x3d\xfb\x66\xe2\xca\x90\xaf\xd2\x92\x91\x7f\xf6\x27\x37\x9b\xb0\xd0\xef\x50\x29\x77\xbf\xdc\xdc\x4e\xa8\x03\xfd\xe5\x6d\xdb\xe8\xeb\xa5\x59\xbf\x67\x5e\x55\x9a\xb5\x9a\x51\x60\x93\xc2\xa4\x1e\xe8\x3a\xa0\xd6\xc7\x09\x50\xd7\x8d\xbb\x97\x5e\xab\xe8\xa8\x8c\xcc\x4c\xeb\xba\xaf\xc7\x43\x70\xe2\xee\x29\xf9\x7f\x97\x2d\x1d\x4a\x7f\xbc\xf3\xbe\xc7\xec\xd0\x21\xcb\xa2\x5b\xb7\xcf\x3a\xca\xd0\x79\x06\xd8\x54\xcf\x5a\xf4\xfb\x76\x8b\x34\xff\x88\x4a\xa3\xa2\xa7\x5f\xd9\x70\xc7\xdc\xbd\x21\x7a\x7b\xf2\x89\x4e\x71\xf5\xac\x39\x50\xdb\xda\x4e\x03\xbc\x6f\x9a\xf8\xed\xc2\xe9\x35\x43\x8d\x81\xd9\xf5\x82\x2a\x6f\x2e\x7b\x7b\xc2\x83\x91\xb9\xab\x9f\xb4\x29\x74\xbd\x7f\xbd\x62\x39\x47\x06\xe4\x0d\x16\x07\x2f\xaf\x9f\xf3\xa5\x6c\x9b\x79\x6b\xf7\x9f\xeb\x71\x36\x70\x1b\x12\x50\xfe\x61\xb1\xa1\xc5\x0a\x3c\xcf\x02\xe6\x14\xaf\x12\x7e\xe1\x90\x33\x6f\x35\xc6\xea\xb5\x23\x6b\xee\x2c\x36\xba\x73\xe0\x5f\x85\xa6\xab\xeb\x92\x0f\x53\x5f\x6e\x7e\x77\xff\x59\xd2\x6b\x25\x79\xea\x2f\x3c\x4f\xd5\x1f\xdb\x5c\x5b\x5f\x7c\x28\x5f\xad\xf2\xf0\x12\x1d\xbf\x2d\xad\xb7\xf0\xea\x99\xb7\x59\xa9\x5b\x3b\x2f\x50\xda\x56\x9f\x7d\xe4\xce\xd2\x67\x4e\x55\x03\x5b\x25\x5c\x3b\xf9\x1d\x1f\x05\x6f\x2f\x58\x25\x62\xc4\x9a\xc0\x1b\xeb\x1e\xe4\x14\xce\x5e\x1d\x1b\xf6\xcd\x6f\xfe\xd3\x31\xf3\xe4\xbc\xf6\xdd\xed\xc3\x7f\x4d\x5c\xd6\x77\x06\xbb\xd2\x2f\xe3\xfe\x91\x59\x25\x1a\xce\x7e\x3d\xa6\xdf\xcf\xf3\xed\x8f\x3e\xcd\x28\xf4\xbe\x9e\x92\x95\xd7\xfe\xde\x0f\xd0\x94\xcc\xaa\x07\xec\x85\x67\xc2\xa7\xd6\xc7\xb0\x9d\x1b\xb1\x8d\x6f\x9e\xed\x8c\xfb\xe3\xff\x6c\x94\x72\xb3\xcb\xca\x07\x8e\x4e\x1d\x5c\xda\x07\x9c\x74\x7b\xf0\x94\xdf\x7c\x08\xf5\xa1\xa6\x67\x48\x8d\xfc\xdd\x02\x67\xe6\x3c\x49\x6e\x52\x19\xc8\x27\x07\x92\x55\xf2\x84\xbe\x0c\xb6\x5a\x37\xe7\x9e\x55\xef\xf6\xb6\xe2\xcf\x43\xd9\x21\xe5\x73\x1a\xed\xe9\x7a\x7c\x48\x81\xc5\xfa\xe5\x98\x3d\xef\xe0\x46\x81\x0e\xff\x1f\xcc\x52\x7f\xac\x7a\x65\x7b\xb6\x3d\x9d\x70\x27\xe2\xe4\xef\x72\xa1\xf3\x8b\xb7\xab\x7f\x09\x98\xfd\xe1\xe5\xa5\x12\xe7\x7b\xb0\x8a\xa3\xe6\xc7\xd5\x6b\xf5\x68\x32\xaa\x5e\xdb\x13\x47\xa2\xa3\x7b\x6c\x1b\xb1\xf9\x4c\xc6\xc1\xa3\x49\x13\xd3\xcb\x6e\x47\x07\x56\x7a\x30\xa8\x90\xc3\xff\x8b\xaf\xde\xdd\xa3\xcc\xee\xad\x8f\xe6\x1d\x2b\x1c\x92\xf1\xf5\xdb\xec\x9b\x31\xbb\x8a\x34\xc8\x28\xfa\xf0\xae\x59\xa2\xfc\xc6\x81\x5f\x9c\x36\x1d\x7f\xf5\x42\xd5\xc4\xd0\x13\x29\x5f\xcb\xbf\x2b\xb2\x63\x4c\xd7\xed\x5f\x17\x55\x03\x83\x4a\x03\xd3\xb3\x07\xcd\xec\x77\xa6\x5e\xb0\x95\xf7\xf8\x87\xbf\xcb\x9f\xef\xdc\xa5\xde\x7b\xdf\x71\x5f\xd7\x35\x8d\x6e\x2a\xb6\x3f\x96\xcc\xe4\x4b\xa8\x9b\x58\x2c\x83\x2c\x9c\x74\xec\x40\x92\xc3\x52\xa3\xe2\xa6\x68\x8f\x3b\xf7\x7a\xb6\x68\x9e\x1f\x5b\xd1\x9f\x9a\xfd\xe0\x2f\x60\x51\xd1\x01\xb1\xb5\x73\x96\x85\x5d\x19\xe4\x6a\x57\x3d\x4f\xd5\xb1\x33\xc1\xc5\x1f\xaa\x45\x25\xc5\x65\x9d\x9e\x8b\xf7\x88\x58\xbc\x65\x4b\xf3\x51\x41\xbc\xff\xb9\xd6\x7b\x7f\xb5\x6b\xb6\xe7\xc6\x6e\x87\xa5\x6a\x47\x9d\x1c\x7a\xa2\xca\xc0\x36\xd0\x9e\xed\xed\xff\x00\x2b\x2f\xfb\x35\x25\xc2\xfe\xcc\x2b\x72\xe9\xea\xd6\x9b\x57\xb2\x12\xd2\x6a\xe6\x09\xf5\x06\x04\xe7\xb4\x5a\xd5\x71\xc0\x0b\xff\x47\xb3\x02\x22\xd3\x26\xc4\x4f\xdc\xfe\xea\x57\x42\x68\x97\xb8\xb7\xab\x1e\x54\xf8\xc0\xf6\x70\x04\x2d\x03\x96\x85\xb3\xc2\xd4\xd2\x5b\x0e\xf6\x1f\xf0\xa9\x9d\xdd\x3b\x61\x70\x57\xfa\x66\xd0\xd8\xe3\x1d\x5a\x16\xaa\x59\xdd\xd5\xc9\x39\x01\x07\xac\xfd\xd9\xe1\xfa\xf7\x6d\x8d\xf8\x3a\xad\x03\x2e\xd6\x18\x3b\x70\xdf\xf9\x9d\xa1\x8d\x52\xee\x2c\x71\x97\xdd\x35\x77\x61\xb5\x8d\xce\xe5\x77\xf9\x36\x1b\x72\xc5\xe9\x8d\x42\x1e\x45\x0e\xe8\x15\x59\x8b\xc4\x3e\x34\x59\x99\x6f\xd2\xa2\xb0\x46\x67\xba\x86\xe4\x9e\xcd\xf2\xa7\x9c\xf6\x7f\x52\x32\xe3\x26\xdb\x30\xf3\xe1\xf1\x31\xd0\xd2\xaa\x13\x13\xb2\x7a\x5c\x7a\x37\xe1\x67\xe7\x69\x0f\x0b\xd5\x16\xb7\xac\x1b\xe2\x79\xe4\x40\xd3\xa7\x37\x59\x76\xae\xcb\xad\xcf\x0c\x86\x4e\xec\xbb\x6a\x25\xf7\xf9\xe8\x83\x49\x95\x57\x34\xac\x57\xed\xec\xc5\xb5\x1b\xba\xb6\xf9\x92\xa7\x00\x1a\x5c\xee\xda\xcb\x36\x33\x7e\x76\x12\xd9\xf7\x5b\x86\x0f\xbb\x92\x94\x51\xf6\x55\xca\xfa\x87\xf7\xba\xb4\x3c\x14\x53\xaf\xce\x79\xe7\x0e\xde\xb8\x43\x05\xd8\x11\xe1\xc5\xa6\x75\x4a\xc8\x6d\xfb\x27\xa2\xe7\x8b\xec\x69\xc8\x07\xf6\xcf\xfa\xbf\x8e\x24\x74\x1d\x95\x5b\xad\xd5\x7d\xc7\x53\xbd\xf8\x3a\xc7\x33\x19\x1b\xb2\x60\xdf\x05\xa4\xe6\x7c\x21\x22\x6d\x4b\xed\xa3\x23\x73\xb6\x28\x2b\x57\x16\xee\x9b\xdc\x7f\x44\xa3\xd6\x79\x66\xfd\xe0\x7a\x0a\x1e\x9b\x65\x69\x4d\xad\xaa\xfc\x87\x08\x6c\x43\xe2\xa4\x55\x17\xa3\x96\x37\x1e\x56\xad\xe3\xd6\xb9\x11\x89\x3d\xfe\x9f\x8a\x5f\x3a\x2b\x9a\x2d\x51\xbf\x55\xbb\x26\xb0\xdf\xd3\x31\x8f\x32\x33\x6f\x8e\xec\x38\x4a\x7f\x9b\xff\xd3\xb1\x87\x6b\x99\x93\xf3\x76\xde\xcd\x73\x80\x9a\x7e\x9e\x5f\x9b\x53\x2b\x9e\x6f\x74\x31\xb7\x6a\x8a\x35\x7b\x5b\xa7\x72\xcf\xbf\x8f\xf5\x3e\x6d\xba\xe1\xf8\x2b\xa9\x57\xe9\x93\x35\x1c\xf5\xd6\xa1\x89\xf7\x52\x4b\xd1\x25\xfe\xf4\x4b\x97\x4f\xf6\x3e\x5c\xb6\xe6\xa1\x9e\x63\xe6\xb6\xac\xde\x27\x30\xab\x34\xd1\x6f\x68\xbd\x76\x0e\x57\xe1\x77\x35\x1d\xff\x64\xef\xc9\x21\x73\xed\x92\xed\x03\xb6\x36\x18\xfb\x31\xec\xc8\xb3\xb7\x0b\x8e\xce\x32\xef\x7c\xcd\x18\xfa\xce\xf8\x3b\xb6\xfb\xa7\x79\x22\x36\xd2\x3f\x30\x34\xd4\x11\xdb\xe5\x74\x3c\x37\xa1\xda\x1f\x30\xa5\x46\xa2\x5f\xad\xca\x23\xdb\x08\x64\x27\xa5\xb7\xd6\xe4\x52\xcc\x93\x62\xaf\xae\x7e\x78\xbb\xd3\x59\x57\xb1\xc9\x5a\xff\xb4\x61\xe9\x94\xdb\x43\x2b\x0d\xff\xc9\x2e\x5f\xb5\x65\xca\xde\xe0\xb5\x15\x9f\x86\x66\xb5\xea\x9f\xd4\xe2\xf5\xbe\xee\x21\x0e\x34\x1f\xf7\xd7\x8f\xaf\x39\xb5\xbf\x0e\x52\xa7\x7d\xdb\x2f\xd4\x3b\xd4\xfb\x65\x5a\xcd\x1b\x0d\x3e\x04\x3e\x28\x1a\x2c\x37\xee\xb5\x56\x77\xa0\x7f\xfe\x2c\x6b\x58\x30\xe5\xc1\x57\x64\x58\xfe\x4d\xf3\xfb\xb6\xef\xd3\x70\xec\xdb\xc3\x7f\xad\x3f\x5c\xb6\xca\xd9\x29\x4d\x16\x2c\xaf\x76\xef\xef\x80\xfc\x9f\xe6\xb5\xd8\x48\xff\x76\xa1\xce\x34\xc1\x6e\x69\xd8\xc5\x12\x7b\x26\x07\x2d\x58\xf5\x62\x44\x8b\x3e\xcb\xae\xef\xe8\xf7\xa2\x63\xcd\xa0\x9a\xdb\x7e\x3d\xfb\x33\x2c\x61\xf0\x74\x47\x02\xff\x62\x87\x65\x61\x65\xb6\xcf\x4e\x1b\xe8\xbf\x65\x5b\xca\xa8\x6a\x5d\x73\x27\x6c\x3e\x98\xd9\xaf\x53\xe9\x45\xe2\xec\x59\x5f\x56\xaf\xaf\xe6\x5c\x49\xde\xbc\x73\x6b\xdb\xb5\xb7\x43\xb6\xa7\xb4\xd8\x21\x94\xbe\xdd\x54\xa9\x0e\xcd\x03\xca\x0b\x35\x95\xa4\x52\xe7\x73\x16\x3e\x9a\xe3\x5c\xca\xde\x22\xa6\xd8\xe2\x9c\x94\xcc\x4a\x0b\x26\xfd\xfc\xb3\xff\xf7\xb8\xbf\x0e\xd6\x1c\xb2\xee\x46\xdb\x41\xfa\xc8\x92\x85\xd3\xdf\x6a\x7f\xf7\xec\x9f\xa6\xe1\xd8\xc8\xf1\x7e\xa1\x01\x8e\x9e\xf5\x5e\xe1\xc9\x5c\x8a\xac\x5d\xf4\xed\xf2\x5f\xc4\xe6\x1a\x1b\xb7\x8a\x59\x63\x7b\xee\xec\xb0\xfb\x1d\x54\xb2\x69\xd4\xfe\xb4\xcf\x0e\xc7\x79\x9c\xff\x6d\xd4\x9a\x7e\x2d\x4b\xfc\x5c\x5b\xd5\xcc\x2d\xd6\xaf\x36\xdb\xdc\xdd\xa7\x76\x41\x83\x98\x4e\xbd\x8a\x9f\x0e\xdd\x9d\xe7\x50\x37\xd5\x9b\x91\x28\x0b\xf7\x1e\x94\xbd\x37\xa1\x47\x78\xf1\xb8\x3d\x03\xb0\xbe\xeb\xcf\x37\x68\xc5\x35\x0a\xfd\x1a\xdc\xb5\xca\x1f\x67\x29\x0a\xd6\x75\x32\xba\x11\x39\x2c\x72\xf3\xdb\x6c\x2d\xb6\x25\xec\x6d\x27\x1d\x5a\x80\x30\xf2\x58\xba\x70\xe9\x75\x35\xc6\x9e\x04\xff\x76\xc7\x7f\x8c\x1a\x22\xfd\xfd\x02\x66\x3b\xdc\xb1\xaa\x7b\xf3\xfa\xf7\x1f\xfa\xbd\x28\xb8\xb1\xd3\x9d\xaa\xb7\x46\xc2\x43\x5c\xcf\x6f\x7d\x2e\x76\xef\xdc\xf8\x21\xb7\xff\x14\xae\xf2\xa8\xa6\x43\x89\x1f\x7e\x2b\x1e\x16\x2a\x79\x63\x55\xcf\x21\x7e\xbb\x33\x57\xe5\xc4\xb9\xd3\x07\x3e\x4f\xb3\x54\x6e\xde\xea\xec\x8a\x76\x17\xd9\xb9\x48\x0e\x1e\x10\xba\x3a\xc4\xbd\xa5\x40\xc5\xa9\x99\x7c\xbf\xb6\x61\x2d\x0b\x95\x4d\xce\xa8\xd6\xec\x6e\xa1\x1f\x05\x7b\x0d\xa8\x12\xe0\x2a\xed\x40\xaf\x4e\xfc\x70\xf3\xf6\x97\x73\x99\x1b\x0f\xad\x98\xc6\x08\x81\x63\xdb\xde\x3c\xbd\x71\x4f\xe1\x0d\x01\xf7\xc4\x76\x27\xdb\xdf\xf2\x44\xfc\x5d\x30\xf1\x4f\x01\x49\x6c\x64\xf1\x80\x76\x05\x1c\xa9\x82\x02\x23\xc7\xed\x9e\x3d\x70\xd8\xb5\xdc\x97\xc5\x42\x4a\xee\x4d\x1f\xf6\xab\xd9\xcd\x27\x95\x5f\x22\x7c\xa3\xff\x1f\x63\x6f\x19\xd5\xf5\x13\x6d\x0f\x03\x92\x02\x12\xd2\x21\x08\x48\x4b\x77\xc7\x97\x46\x40\xba\xbb\x95\x46\xa4\xbb\x91\x94\x6e\xa5\x3b\xa4\xbb\x53\x40\x42\x42\xba\x91\xee\x8e\x67\xad\xff\x73\xaf\xcc\xef\x15\xf7\xfd\x5e\xf3\x99\x33\x79\xce\x99\x7d\xf6\x07\x89\x44\x35\x1b\xaf\x0b\x24\x67\x99\x2d\xc9\xd5\x5b\xa4\x6e\xe9\x14\xf1\x7e\x99\x6d\x69\xb9\x29\xeb\x0c\xc8\x4b\x13\x6d\x31\xbb\x28\xce\x2a\x2a\xdd\x89\xfa\x36\x06\x40\x29\xaf\x1a\x9b\x67\xef\xd7\xfa\x08\xa6\xe6\x6a\x6d\xe6\xca\x82\x36\x75\x3c\x03\x49\x3e\xdd\x6a\xf4\x55\x12\x13\xce\xf7\x7c\xd6\x07\x69\x67\x7e\xa8\xf0\x9e\xf1\xdb\x0d\x7f\x67\xd5\xd4\x67\xbc\x72\x27\xcc\x64\x37\x7d\x36\xd6\xb6\xfa\xa4\xde\xbc\xa8\xd8\x28\xe6\xe2\x04\xa0\xaa\xd8\xef\x11\x51\x3e\xfb\xbf\x0f\x08\x67\x49\x6e\x2a\xfb\x5c\x59\xfe\xaa\x30\xc1\xa4\x78\x43\xdc\xa8\x6e\x4e\xe8\x68\x0e\xb9\xfd\x5f\xaa\xe0\x49\x5f\x47\x14\x16\x31\x1f\x18\x84\x9d\x38\x7e\x2a\xb7\xab\x55\x29\x48\xb2\x0f\xd2\x07\xe2\x3e\x39\x36\x27\x9f\x4a\xe1\xba\x83\x3f\xda\xfb\xd6\x3f\xab\x02\xe2\x33\x81\x3e\x40\x35\x69\xc3\x2a\xf6\x51\x7d\x54\x0a\x14\xdf\xf4\x29\x61\xde\xce\x4a\xe7\x7f\x03\xa9\x33\x94\x83\x6b\x55\x53\xec\x43\xa8\x70\x03\xa0\xa5\x27\x06\x7e\xef\x7a\x02\xee\xcf\xf6\x05\x89\xff\x60\x51\xa0\x12\x1d\xec\x18\x06\x49\x8c\x31\x5f\x4f\x63\x9b\xfe\xa4\x24\xa0\x05\xa0\x93\x1b\xd3\xcf\xe2\x47\x13\x7f\xe6\x2f\xbb\xd8\xf5\x8e\xcd\x5f\x45\x75\x10\xec\x3b\xaf\xe2\x68\xd4\x63\x7b\x96\x86\xee\xd5\x82\x99\x7f\x0a\xc1\x8f\xd2\x75\x9c\xa4\x28\xcc\x73\xb0\xe1\x44\x39\x39\xdd\x27\x91\xa2\xe8\xc6\x75\x2c\xf3\xad\x18\x4d\x72\x87\x70\x6b\xa1\xff\x72\xf4\x4f\x39\x27\xbe\x10\x16\x74\x28\x58\x60\x14\x04\x26\x92\xad\xf7\xe6\x85\x8e\xaf\xc5\xb7\x45\x02\xe8\x02\x45\x1d\x86\xdd\x5d\x3e\x0f\x10\x90\xd3\x13\x87\x78\xa5\x7b\xb9\x97\x83\x34\xa6\xa9\x21\x94\xec\xbd\x92\x0f\x9d\x46\x7b\xfd\x8b\x9d\x86\x9e\x59\x1b\x6b\x86\x19\x32\x51\x76\xe1\xb3\x88\xdd\x87\x22\xa1\x20\xd7\xc7\xae\xfe\xec\xa5\xfd\x6a\x16\xe6\xce\xd4\x30\xff\x65\x39\x95\xc8\x57\xb5\xcc\x22\xbd\x9a\xce\xa2\x04\x8b\xc8\x43\xc4\xd3\x04\x90\x32\x4a\x8f\x9b\x95\x48\xea\x2e\x92\x29\xf1\x75\x75\x26\x20\xd8\x81\x6d\x9e\x7a\xb1\xa1\x2f\xe1\x28\xe1\xc2\x06\x66\xbe\xc8\x82\x0e\x1f\xb8\x4e\x51\xd4\xb3\x79\x5b\x8c\xea\xe6\x79\xb8\x96\x24\x7c\xce\xbc\x4b\x32\x6d\xdd\xbe\x64\x44\xc2\x15\xea\x4a\x5d\x3f\xc7\x4e\xc7\x93\x7c\x3c\x6b\x5e\x7f\xe1\xc6\x36\x78\x49\xab\xa3\x9c\xee\x88\x92\xc7\xad\xea\xd3\xe8\xe6\xb1\x4e\x10\x61\x16\x57\x69\x4d\x2e\x42\xfb\x77\x1a\xfb\x7c\x12\xfa\xff\xe6\x4c\xf8\x8a\x3c\xf3\x06\x52\xf4\x97\x88\x4c\xed\xed\x0e\x23\x29\x0c\x04\xe9\x83\xbf\x89\x7e\x74\x50\x58\x68\xd3\x7d\xb7\x6c\xe6\x16\x1b\xfc\x11\x99\xa3\xf3\xe5\x1d\xd0\x59\x3a\x1e\x09\xbf\x45\x2d\xd9\x89\xf7\x70\xc6\x38\x28\xc4\x6c\xcc\x76\x67\x05\x32\xaf\x6d\xc4\xdf\xce\x9c\xc3\xcb\x0d\x3d\x84\xe7\x3f\x76\x56\xd2\x93\xde\xf7\x8c\xda\xe0\x9d\xd1\xce\x95\x9c\xd4\xdc\xd8\x77\xaf\xb1\x80\xbb\x8c\xa8\x3d\x9f\xa3\x57\x51\x6b\xd2\x5e\xbd\x77\xe0\x2b\x14\x5c\xc1\xee\x20\xf1\x45\x7d\x7d\x74\x4d\x63\xf8\x8f\x21\x6e\xe2\x69\x14\xdb\x30\x06\x13\x76\x5c\x72\x6b\x7b\x8c\x54\x9e\x92\x7f\x9b\xe1\x29\xcf\xc7\x57\x94\x34\x14\x06\x58\x06\x57\x08\x27\x74\x58\x03\x5f\x06\x48\x53\xce\xee\x78\x0a\xcc\x7f\xe8\x13\x68\xdf\x89\x39\xb5\x96\x45\xb1\xca\x8b\xb5\xba\xa1\x9c\x02\x7d\x20\xd4\x10\x44\x7b\x69\x65\xc0\xbd\x23\x1a\x1a\x13\xdc\x41\x19\x2f\xe9\xc0\xe8\x17\x4c\xfb\x2e\x96\x30\xd5\xb4\x2a\x44\xa6\x9b\x02\x64\x5b\x05\xd3\x79\x12\xb0\x4a\x3b\x6b\xa5\x4c\x58\xe1\x18\x44\x92\xbe\x49\xf8\x29\xb1\x08\xc7\xf8\xb9\xaa\xd1\xd6\x5b\x39\xaa\xe7\x3b\xf8\x14\x27\xea\x86\x0f\x2d\xb8\xbc\x0f\x43\x77\x16\xf4\x95\xec\x30\xca\xdc\x5d\x29\x59\xb8\x45\x2d\x9b\xbf\xcb\x40\xd3\x51\x92\x19\x7c\xe0\x53\xc0\x8e\x20\xc1\x39\x6e\x7a\x7d\xa7\xc1\xb2\xde\xd8\xcc\x71\x06\xa7\x40\x25\x26\x32\xb8\xea\x95\xd0\x39\x16\x9f\x79\x4d\xdd\x7f\x5e\x06\xf3\x7f\x73\x94\x7c\x21\x88\xfe\x30\x64\x81\x8f\x2d\x53\x37\x12\xac\x9e\x9c\xe0\x7b\x4c\x11\x4b\x1f\xa5\x0a\x1e\x46\x88\x3a\x40\x3c\x1d\xde\xe0\x9b\xd2\x2b\xf9\xbb\x4f\x4d\x2c\x83\xf7\x4e\x6e\xe6\x0e\xba\xeb\xa0\x6e\xa3\xd7\x59\x8b\x34\xa9\x42\xce\x59\xdc\xf2\x2c\xe7\x02\xd4\x51\xf4\x00\x3f\xb1\x99\xab\xe0\x30\x98\x9d\x3e\xe7\xcf\xdb\x1f\xa1\xde\x2e\x5f\x61\xa8\x9c\xf8\x4e\x2e\x37\x9e\xc7\x1b\xee\xbf\x91\xd9\x9c\x87\x8e\x20\x5d\x24\xf8\x82\x7b\x1a\x80\xf6\x6a\x31\x36\xb2\xf2\xca\x25\x47\xa2\x65\x30\xa7\x46\xd8\x5e\x5d\xdb\xb4\xf1\x99\x75\x14\x14\xb4\xe1\xf6\x56\xdc\x6a\xa4\x44\x81\xfc\x56\xf9\x00\xac\x95\xa1\x70\x88\xa1\xdd\x91\x6f\xf9\x9f\x25\xf2\xc8\x1f\x24\x6c\x8b\x68\x2d\x1e\x16\xef\x9e\x3f\xdb\x6c\xfa\x8e\x09\x40\x07\xa5\xde\xb8\x93\xbe\x0c\xfd\x49\x36\xe0\x92\x3c\x8a\x46\x0b\xbb\x3f\xd0\x53\x27\x49\xd7\xee\x3c\xc7\xad\x3f\x10\x9f\xea\x60\xf7\x8f\x6e\xf5\x54\xfd\xbf\x2f\xc4\xec\xe1\xe6\x21\x91\x08\x70\x46\x9f\xcd\x6f\x6d\x75\x85\x59\xdb\xe5\x58\xe1\xfb\xd3\xd0\xe7\xfe\x21\xd9\x68\x5b\x37\x1a\x57\x45\x65\xc2\x3b\x26\x61\xe7\x22\xb7\x7f\xec\x45\xde\x17\x95\x37\xd7\x38\xc7\x97\x8b\xc6\xfb\xfc\xa3\x8a\x8d\x26\x3e\x7f\x85\x29\x4d\x07\x3a\x6b\x23\x6f\x36\xf7\x2a\x58\x26\xca\x80\xbd\x03\xcd\x89\xcd\x63\xbb\x85\x51\x52\x48\x81\x57\xe8\x44\xa9\x7b\x4f\x05\x5d\xd1\x29\xc0\x60\xdb\xee\x52\xb3\xfa\xf5\xb8\xc9\x18\x60\xe6\xd8\x85\x8d\xc1\xba\x4b\x85\x31\xaa\xd8\x18\x69\x8c\xcd\xa8\x74\x47\x32\x9d\x22\x5e\xfd\xe1\x6b\x4f\x3c\xb7\x8e\x54\x67\x43\x46\xff\x0f\xdf\xc0\xed\xf5\xc6\xda\xcc\x07\x59\x0a\xa8\xa0\x08\xe4\x29\xd2\xf4\x33\x15\x27\xac\xaf\xfe\x4b\x47\x25\xac\xbc\x7c\x27\x65\x15\x38\x8f\x5d\xa5\x62\x3c\x0f\x78\x69\x03\x7d\xca\xaa\x6b\xd6\x5c\x2e\x56\x6c\x64\xe2\x75\x97\xc6\xf1\x2e\xf7\xaf\x5f\xbe\x55\xbd\xe6\x85\xcb\x15\xd8\x2a\x4e\x33\xd1\xb9\x14\xdf\xd7\x42\xa4\x9f\x94\xd9\x56\x5d\xed\x7b\x57\x8a\xb7\x29\x1e\xae\xb0\xfa\xc3\x8e\x09\x31\x4d\x06\xeb\x32\x00\x94\xdb\x96\xa3\xf4\xc3\x72\xca\x45\xb9\x09\x0d\x99\x20\xd3\x7e\xba\x30\xd6\x00\x69\x20\xa6\xdc\x22\x29\x3e\x82\xa3\x65\xf9\xd1\x8f\xc7\x01\x78\xa7\xda\x04\x17\x32\xa2\xaf\x8e\xbf\x85\x7d\x34\xd2\x26\x9d\x24\x51\x31\x29\xb8\x79\x23\x27\xe3\x01\xe7\x59\xed\x95\x40\x04\xb0\x58\x7e\x62\x63\x30\xfe\xd5\x7f\x1e\x4c\xef\x41\x37\xc4\x37\xda\x94\x76\xc8\xa5\xe9\x13\x10\x8f\x4f\xa5\xb9\x08\x15\x8f\x29\xad\xbb\x0a\x76\xd5\x25\xc4\xf8\xdd\x3c\x93\x50\x4d\x07\xb5\xf0\xb4\x4e\x12\x17\xc4\xae\xa6\x2d\x3d\x33\xe2\x8f\x18\x59\xc9\x92\xb4\xab\x90\x5a\x2f\x00\x1d\x76\x19\x5e\xad\x90\x40\x80\x1f\x8c\xd6\x39\x0d\xeb\x35\x83\x4d\x71\x4d\x44\x9b\xc6\x93\x45\x4b\x49\xdd\x56\x71\x58\x72\x3a\x78\x8c\x31\x7c\xf8\xe2\x8c\x49\x10\x0f\xa9\xbc\x9b\x1a\xb0\xaf\x54\x4c\xe5\x7d\x3d\x6d\xb1\xc3\xe9\x2e\x73\x27\x3c\xfd\x27\x3b\x73\xcd\x98\x1e\xbb\x1a\x57\xb5\x49\xc9\xa1\xe0\xa9\x13\x6c\x96\xa1\xbf\x22\x0b\x15\xbe\x98\xfe\xfd\x67\xd8\xa4\xf8\x1e\x3c\xa9\x64\x53\x5d\x22\x41\x21\xe0\x2a\xbe\xe6\xe4\x2d\x27\x0d\x13\x61\x84\x5f\x0a\xd4\xed\x95\xad\x4f\x8b\x12\x1e\xc5\x8e\x43\x11\xa4\x27\x6f\x3a\x99\xc5\xb3\xfe\x01\xc4\xb8\x5a\xd6\x4b\xe4\x46\x26\x08\x1a\x08\xe6\x4a\x59\x06\xf9\x9c\xdb\x65\x85\xbb\x26\x98\x39\x6b\x8c\x31\x21\xa1\xdb\xb8\xd8\xcd\x40\xba\xfd\x8b\xc9\xe9\xba\xa3\xec\xe9\xb5\x5d\xa6\xce\xfb\x45\x21\x34\x73\xee\x81\x01\xec\x91\x1a\x66\x1d\x09\xff\x5d\x9d\x63\x63\xc3\xce\x47\x64\xeb\x17\xd8\x34\x14\x4e\x2e\x8c\xd4\x6b\x72\x5a\xe5\xcf\xcb\xda\x2b\xb2\xf3\x53\x33\xb2\xbf\x72\xfd\xc4\x24\xfa\x07\x5f\x1c\x7c\x00\xc7\x94\xac\xb6\xa1\x6f\xd8\x73\x30\x6d\x31\x49\x43\xf6\xdb\x3c\x31\xc3\x0b\x6b\x08\x82\x68\x79\xc2\xb3\xe8\x6c\xeb\x5e\x99\xea\xdd\x68\x00\xea\x04\x5b\xff\x19\x96\xe5\x48\x56\xee\x17\xf5\x82\x43\xf3\xaf\xb5\xf6\x8c\xe0\xb1\x19\x95\x17\xb3\xf2\xe7\xa3\xe4\xa2\xb1\x29\xdb\x8f\xeb\x2f\x6e\xac\x06\x3d\xee\x20\x07\xc5\xb0\x76\xa4\x08\x9f\xbb\x22\x71\x93\x48\xe5\xef\xd2\x40\x89\x1d\x42\x88\x20\xd3\x0c\x14\x77\x08\x60\x3f\x26\xa2\x44\x5d\x2f\x2a\x0d\xfa\x3b\x63\x41\x84\x83\x91\x53\x4e\xc2\xa0\xe6\x93\x50\x66\xcb\x2c\xc8\x25\xcb\x0a\xea\x83\x1f\xee\xa3\x55\x22\x83\x94\xbd\x26\x1f\x64\xa5\xb8\xac\xb1\x79\xab\x33\x74\xc9\x7d\x8e\xd9\x76\xd3\xc3\xf8\x37\x94\x5f\x13\x91\xb1\x73\x59\x01\x31\xc8\xa1\xa1\xd9\xd1\xa5\x7e\xcb\x9a\xc4\x41\x31\x8b\x92\xbb\x38\xf2\x6d\x29\xfe\xfb\x83\x8a\xa4\xad\x89\x12\x5f\x67\xb7\x19\x53\x1f\xd0\xfe\xd3\xec\xb4\x36\x99\x52\xb9\xda\x9d\x59\xc4\x34\xaf\xe4\xa2\x84\x50\x7c\xd5\x16\x06\x31\xb1\xf6\x6e\x35\x91\x84\x63\x0b\x1c\x08\xc8\x8c\xf2\xdc\xfe\x96\x64\x68\x47\x2a\xb3\x44\xca\x94\x80\x6a\x4f\xcc\x6b\xe2\x4d\x04\xdd\x33\xa5\xf1\x85\xf7\x9d\x5b\xe0\x92\x50\x00\xb8\xa9\xa0\xea\xf2\xba\xcf\x8d\xb7\xea\x4b\xcd\x02\x0d\xd1\x9d\xdc\x13\x14\x7a\x7a\x33\xdf\x7b\x2b\xb3\xb8\xee\xdc\xa8\x7e\xa1\x12\x7b\xb4\x5f\xb9\x89\xf3\x2c\x9e\xa6\xbd\x1d\xeb\x37\x77\x9b\x49\x46\x17\x62\xc0\x97\x6a\xe7\xad\x42\xc7\x0f\x0b\xae\x30\x45\xa1\x85\xc1\xb9\x8f\x56\xf9\xb1\x68\x9f\xf1\x85\x17\xb6\x53\x4f\x70\x94\x2f\x8b\x57\x16\x68\xa3\xa6\x78\x42\xb4\x36\x2d\xb5\x14\x6d\x06\x18\xf8\x35\x3c\x80\x18\x6c\x65\xaf\x97\xe7\x84\xa8\xc3\x16\xea\x0e\x89\xaf\x97\x10\x55\x36\x5a\xb1\x09\x93\x93\xeb\xcd\xd8\xf4\x9e\x94\xff\x21\xaf\x32\x70\x52\x19\xf1\xe7\x6a\xca\xcc\x43\x2e\xad\xe2\x22\xf7\x6f\x7e\x31\xe1\x4e\x30\x12\xc8\x4e\x42\xbf\x0a\x3d\x83\x8c\x2e\x52\x23\x54\x73\x02\x83\x1a\x49\xe4\x87\xcc\x84\x20\xf7\xce\x73\x70\xad\x3d\xb1\x44\x57\x57\xb7\x4e\xb4\xf5\x77\x4f\x87\xfb\x56\x80\xa8\xbc\xe4\xd7\x3c\x60\x4e\xe9\xee\xb0\x3b\xe1\x27\xf2\xec\x34\x15\x43\xfe\xbc\x33\xbb\x46\xfb\x91\x5f\x82\xc8\x47\x4b\x0e\xa7\xfc\xc6\x54\xe9\xab\x93\x03\xef\x63\xa3\x3f\xca\xb7\x17\xc4\xdf\xea\xcf\x89\xca\x94\x0d\x76\x2d\x50\xfc\xf2\xb3\xa0\x22\x28\x57\x95\x6a\xcd\xe8\xe3\x69\xf9\x28\xd5\x15\x05\x64\xed\xae\x7c\x45\x08\x7f\x4b\x54\xf5\xbf\x8a\xa7\xc9\xb2\x37\xdf\xf4\xaf\x8e\x16\x44\xce\xeb\xf5\x1c\x86\xab\x2f\xb2\xfa\x30\xdd\x08\xd8\x24\x57\xa4\xcd\x79\xf9\xb9\x78\x58\xe6\xfd\x9b\xef\xa8\x44\xa6\xf3\xec\x44\x09\x5e\x1a\x2e\x5c\xc4\x7b\x29\xa6\xae\x61\x46\x3a\x75\x8f\x8d\xfa\xcb\xd8\x4f\x39\x37\x6c\x84\x9d\xad\x65\xe3\xeb\x52\x5a\x4a\xdc\x06\x8c\x98\xb6\x34\x78\x42\x4f\x9e\x7a\x0c\x2f\x0a\x54\x0c\x81\x0b\xc5\xcf\xc5\x7f\x56\x4c\x96\xea\x99\x1b\x24\xc6\x75\xe7\x27\x45\xf7\x86\x17\xbb\xc4\x2e\xd6\x1c\xf1\x88\x39\xbb\x32\x1f\xcb\x59\x12\x00\xdd\xdc\xe6\x91\xb1\x1b\x64\x64\x0a\x7b\x2d\xab\x51\xcd\xd7\x89\x49\x56\x72\x93\xcf\xac\x80\xf3\xcd\x0d\x12\x11\xaa\xc7\xdb\x42\x0b\x40\x95\xca\x3d\xa8\x11\x43\x86\xd9\xa0\xb3\xb4\x4a\x67\x15\xf8\x20\x28\x2d\x48\xfd\x3e\x5e\x2d\xe9\x79\x03\x26\x8b\xc6\x96\x3f\xb1\x1e\x07\x95\xf3\x99\xb7\x55\xd6\x1b\x37\xd4\xf1\x4e\xeb\xe9\xf1\x15\x2e\x03\x3f\x03\xd2\x88\x04\xcc\xaf\xa4\x25\x55\x9b\x67\x9a\x88\xcb\xa1\x8f\x56\x25\xd6\xb7\x8b\x6b\xfb\x72\x2b\x1a\xd3\x5a\x06\x93\x24\x35\xab\x7a\x26\x5d\xea\x05\x8e\x04\x25\xb1\x44\xdd\xdd\xa2\x63\xb8\x5e\x02\x87\xaf\xc2\xe5\xd6\xd5\xc8\xd8\x7c\x0c\x53\xaf\xb8\xb9\x4d\x57\xa2\x0e\xcc\x38\xb4\xbd\x1c\x83\x86\x0f\x8b\x85\xa2\x1b\x72\xf5\x03\x30\xa7\xbe\xc3\x78\x62\x99\x47\xdc\x6b\x99\xb2\xef\x58\x67\xbf\x31\x13\x14\xee\x7d\x16\x18\x0c\xd4\x46\x0b\x75\x73\xba\x0a\xf1\xff\xfc\xe2\xb1\xd1\xc8\xb8\x36\x71\x9d\x68\xb8\x9b\x0e\x23\x36\x95\xbf\x3a\x01\xc2\x4e\x1a\xab\xa5\x38\xc5\x22\x62\xed\x68\x04\xa1\x71\xce\x0b\xfe\x40\x95\x20\x17\x3f\x7f\x4b\x9b\x00\x4d\xfb\xb1\x72\x3a\xbb\x01\x0f\x9c\xfb\x07\x17\x5d\x1b\x32\xf2\xb0\x35\x37\xe2\x9e\x8f\x3a\xa4\xf1\xff\x62\xdf\xa7\x2e\x69\x5f\x48\x94\x37\x3a\x48\x4a\x0a\x46\x66\xa6\x72\x60\x70\x7e\xb0\x91\x10\x85\x9b\xfa\x44\x95\x48\x57\x0d\x41\x73\xd3\xac\x61\x72\x1d\xa9\x71\x21\x7c\x53\xe9\x0e\x38\x17\xab\xcc\x24\x10\xbb\x6e\x52\xc3\x21\xf2\x99\x83\x6d\x9b\xcc\x75\x8f\x80\x66\xc5\x62\x92\x8c\x1f\xfb\x84\xc3\xe1\x6f\x4f\x5f\xb6\x82\x59\x9b\x2d\xb6\xb1\xdd\xe5\x9f\xf8\x9f\x33\xf8\x66\x97\xdf\x5a\xde\x64\xd4\x13\xa8\xe5\x36\x73\x98\x3d\x8b\xf1\xff\xd0\x3d\xfe\xfa\x03\x00\x75\x7a\x1e\xa4\x94\x21\x69\x4f\xb2\xd3\xe9\x50\x22\x33\xb9\x6b\x21\xc7\xc4\xf6\x65\x83\xe2\x0b\x4f\x75\x56\x12\xf2\x95\x3f\x95\xfe\x3f\xd3\x9e\xba\xd4\x7d\x21\xa4\x51\xa4\xa0\x69\xdc\x8a\x67\x4b\xdc\xa4\x44\xf5\xf3\xeb\x7b\xda\x30\xb7\x16\xf4\x7d\x35\x74\x25\x6d\x32\xe3\x17\x56\xb0\xda\xdb\x4c\x96\x78\x2e\x40\x27\x5a\x85\x1b\xe8\x13\x49\x45\xe3\x37\x5a\xb5\x98\x1b\x6d\x18\xd3\x56\x55\x06\x88\x8f\x74\xb0\xf8\xf7\x08\xfc\x6c\x6a\xeb\xea\x44\x01\xa8\x0b\x04\x55\xd1\xb3\xce\x83\xdd\x0b\x47\x83\x9a\x6a\x5d\x48\xeb\x6b\x29\xd9\x62\xa1\x2e\x63\x10\x86\xeb\x6c\x8e\x2c\xd9\x73\xb0\x30\xe9\x4d\xae\x2d\xce\xc3\x29\x3c\xac\xf1\x9b\x0b\xa9\x3b\xe3\x89\x05\x93\x07\xb6\xef\x31\x33\x27\xab\xed\xf6\x7e\xe3\x21\x39\x3a\x21\xff\x72\x31\x4f\x79\x16\xbe\xa2\xb0\xb0\x64\x80\x65\xb9\xf8\x2b\x6e\x81\xdb\x45\xde\x06\x8b\x5a\x35\x11\xcc\xa3\x34\xf5\x9d\xa2\x9e\x10\x35\x52\xdf\x82\xed\x2c\x07\xb8\x34\x76\x5b\x30\xa0\x6d\x50\xbb\x1c\xa0\x62\x50\xde\x90\xcf\xb1\x54\x69\xe7\x16\x14\xfb\x98\x1b\x51\xb9\x66\xfd\x6c\x45\xaa\x9a\xaa\x77\x55\x0c\x64\x98\x7c\x16\x56\x95\xfb\x29\xc0\x3f\x4c\x0c\x03\x7b\xec\xde\xb2\xd6\x6e\xda\x70\x3d\xb6\xab\x19\xd5\x53\x87\x87\xef\x9d\x85\x66\xfc\x1e\x80\x06\xe7\x29\xfc\x10\xea\x6a\x50\x17\xa0\xd4\x86\x5e\xab\x3b\x23\x7d\x20\x44\xa2\x97\x3e\x4d\xbb\x36\x2f\x82\xbc\x24\x4f\x55\x67\xfd\xe7\x98\x3f\xe9\x08\x41\xbe\x40\xc1\xc2\x03\x8e\xf9\x2a\x8c\x3a\x04\xba\xe3\x07\x24\x80\xe9\x93\x51\x6c\x48\xb2\xc1\xde\x42\xa3\xa6\xbe\x35\x47\x1b\x64\x5e\x59\x22\x40\x0e\x7a\x1d\xe8\x44\x3f\x8e\xd6\xf3\x44\x27\x1e\xf9\xf6\x52\xa8\x96\xad\xa1\x23\x95\x76\xf5\x15\x52\x1c\x3d\x4b\x91\x64\xb5\x43\x74\xb9\x02\x05\xb0\x4e\x2e\xc2\xc7\xb8\x7c\xfb\xeb\xa1\xc5\xc8\x64\xa0\x78\x77\x75\x4b\x1d\xcf\xcc\x9a\x5d\x1a\xd1\xd1\xf0\xba\x82\x87\x37\x59\xa5\x51\x00\x00\xd5\xe5\x28\x86\x6a\x48\xb6\x18\xa7\x28\xfb\xaa\x5b\xda\x7c\xf4\x97\xad\xcb\x87\xf2\x85\xc3\xe6\x01\x15\xd1\x29\x59\xa8\x47\x9a\x0c\x00\x7d\xe1\x8b\x46\x93\xde\xe4\xce\x51\xac\x77\xe0\x99\xd5\x44\x2c\x97\x6d\x33\xef\x59\xcb\x24\x71\x79\x69\xff\x4a\x84\x06\xfe\xcb\x2d\x00\x25\x79\xcf\xa6\xa3\x64\xfe\xcd\xfe\xcd\xec\x65\xb2\x98\x77\xf4\xea\x61\x27\x4b\xad\xb9\x08\x53\x5b\x1d\x17\xa9\xfb\x09\x3a\x09\xcf\xbf\x70\xee\x29\xcf\xcd\x17\x42\x2d\x04\x05\x96\xdf\xd9\xdd\x4e\xa4\xb0\x7b\x0b\x09\x1d\x97\x79\x85\xe9\x2a\x64\xbd\xd1\x71\xf6\xb5\xa4\x33\x5d\xdc\x38\xe4\x65\xc3\x3d\x79\x35\x09\x26\xaf\x48\xf0\xdc\x08\x0e\x7e\x70\xab\xa4\xed\x53\x23\xbb\xd3\x65\x62\x07\x0c\xd3\xd1\x20\xdd\x19\xf9\x63\x6f\xf5\x3a\x3b\xc9\x47\xb3\x81\x31\xc7\x7a\x89\x80\xb3\x4d\x9a\x73\xcd\x3a\x1b\x71\x21\x6e\xb1\x65\x8f\x6e\x93\x9f\xf0\x31\xee\x94\x67\x6e\xb1\xbe\xfc\x10\x86\x1f\x70\x89\x40\x0d\xe9\x2d\x3d\xcb\xd9\x6f\x27\x57\xec\x16\x62\x63\xa5\x5f\x29\x0c\xb3\xfd\x7d\x75\xcb\x1d\x0c\x15\x84\xfc\x2b\x3b\x84\xd4\xf7\xf1\x14\xc3\xe0\xc1\x35\x1e\xe3\xd8\x4c\x0f\xc7\x0d\x4c\x15\x94\x28\xa7\x98\xfb\xe8\xf0\xe9\xd7\xd7\x7c\xfa\xa6\xf3\x6d\x4e\xaf\xa6\xce\xb8\x7f\x5b\xfd\x29\x9f\xd4\x17\x42\x0a\x4b\x01\x6e\xf5\xfd\x08\xb8\xe1\x8c\xb3\x5c\xba\x5f\x30\xb5\x61\xd2\xd7\xbf\xfd\x12\x5f\x5f\x77\x4e\x09\x13\x4e\x7d\xe6\xa8\xb7\xd4\xbb\x24\x03\xd3\x36\x5f\x1e\x52\x5c\xbf\xac\x7c\x6b\x21\x5f\x2c\xec\x6f\x76\xcf\xa0\x29\x14\x25\x0b\x69\x7d\x1d\xf0\x25\xab\xc3\xba\x18\xc3\xac\x0a\x2c\xa4\xba\xb8\x7d\x16\x6b\xd4\x56\x7b\x31\x4c\x1a\xed\x15\x1c\x17\x53\x60\xc9\x42\x9a\x13\x34\x3b\xcf\x25\x67\x0e\x91\x46\xac\xee\x05\xc9\x33\xef\x2f\x4b\x6e\x2d\x6a\xe5\xa0\xcb\x65\xa9\xea\x0d\x0f\xf1\x7d\xea\x63\x7b\x47\xd1\x19\x1a\x1e\xee\x7a\xf5\x08\x48\x93\x93\xf6\xfe\x99\xf6\x94\x17\xe9\x0b\x81\x15\xc2\x03\x4d\xa3\xde\x1c\x97\x79\x29\x98\xd1\xa7\x42\x1d\x9b\xa1\xd2\x3c\x99\xb2\xe0\x02\xf1\x5d\xf7\xae\x18\x6d\xb5\x5b\x7a\xa3\x17\xf8\x45\x0e\xcc\xe0\xbd\xaf\xf1\xf1\xa9\xae\x76\xd5\xad\x31\xfe\x63\xc3\xcc\x9e\x76\x27\xde\xa3\x7d\x44\xcd\x34\x39\x29\xba\x20\xb9\xaa\xd5\xf0\x03\x64\x83\xa4\x30\x3c\x93\x7c\xd0\x4c\x22\x5e\x70\xec\x72\xd0\xeb\x0b\x59\x9c\x19\xcf\x71\x26\x9f\xfb\xb4\xe8\x52\xc0\x29\xf8\x41\x56\x03\x80\x32\x87\x8e\x50\xc3\x30\x2d\x8f\x8f\x62\x38\xd9\x04\x84\x1d\xbc\xf5\x46\xfa\x49\x42\xc9\xc6\xe9\x84\x13\x95\xb3\x40\xff\x12\xa3\xfe\x9f\x69\x4f\x79\xbd\xbe\x10\x58\x74\x21\x6f\xc0\xb4\x80\xed\xfb\x19\x6d\x19\xda\xea\x6c\xfa\x95\xab\xb6\x0c\x77\xed\x04\xeb\x1a\x93\x5a\x59\xaa\x2c\x93\xce\x5f\x3f\x18\xc4\x52\x46\x41\x72\x52\x28\x1a\xdf\x41\xe7\x7a\x98\x53\xea\xcd\xb8\xb5\xf5\x29\xc2\x66\xcd\x3d\x4d\x6b\x3b\x43\x8c\x23\xff\x07\x66\x0d\x17\xa5\x44\x30\x23\x95\x76\x57\xec\x69\x50\x18\x47\xd9\xad\x3e\x43\x82\x84\x1c\x6f\x19\x43\xd5\x12\xdc\xfc\x33\xe6\xd2\xe8\x6d\x5d\xea\x8a\x31\x78\x40\xdb\x3f\x63\xce\xe3\xaf\xaa\x1e\x50\x8d\xae\x92\x66\xb6\x3f\x7a\x06\xe1\x53\x08\x5a\x45\x54\x7c\xeb\xd2\x99\xcc\x2f\x5d\x20\x45\xf2\x8f\x2c\xf8\x94\xef\xeb\x2b\x0a\x0d\x0d\x0b\x64\x8f\x4e\x7b\x92\x6c\x1f\x10\x6c\x38\xa7\xbe\x6f\xfe\xec\x2e\xf0\x35\x7a\x45\x5c\x6b\xff\x26\x4f\x13\xcb\x0b\xc5\x73\x7a\x55\x5b\x10\xe4\xef\xa2\x12\xdc\x30\x73\x7d\x9d\x56\xfd\xa0\x9c\x1f\x13\xe6\xc5\x39\x2e\xc9\x4d\x28\xa7\xbf\x50\xf2\x2b\x95\x46\x8b\x81\x79\x1d\xa7\x09\xd8\x69\x4e\x17\xb9\x53\xf0\x53\xba\x15\xc6\x0f\xc8\x21\x3d\x1f\xb5\xd7\x72\xef\xfb\xeb\xd2\x2f\x86\xbd\xa6\x4b\xd3\x25\xd7\x30\x04\x30\x1e\x77\xda\x96\x45\xaf\x1b\x2a\x07\xce\x29\x99\x93\x7a\x4b\x47\xc1\x27\xf6\x8f\x93\xf9\x3c\x3f\x79\xe7\xb5\x42\x70\x5a\x31\xe9\xe9\xde\xcf\x3d\x52\xcf\x9e\xf0\xd4\x7d\x21\xa4\xd0\xc2\xe0\x72\x2c\xd3\x58\x13\x8c\xdb\xbb\xdf\x85\xa9\xe0\x94\xa8\x68\xc5\xb2\x54\xa3\xd0\x6f\xc5\xce\x22\xac\x1e\x7b\xdd\x9d\x03\x13\x21\x95\x0a\x74\x97\xde\xd3\x2f\xf4\xdb\x8b\x15\x7b\x67\x4e\xc8\x78\x74\x42\x69\xf4\xac\x87\x7d\xf0\x0a\x9c\x1a\x5d\xbe\x50\xe8\x37\x07\xde\xb5\x24\x20\x2f\x66\x3d\x5e\x93\x97\x90\x21\xe5\x88\xce\x7a\x88\x7f\xa5\xee\xf2\x4a\x4b\x04\x5d\x9b\xb2\x56\xa3\x18\xa5\xcd\x3a\xd4\x64\x0e\x4c\x4d\xc6\xa7\xee\xac\x85\xf0\x2a\xdb\xf3\x93\x3f\x24\x24\x1c\xfa\x38\x7c\xa3\x64\x37\xec\xff\x82\xb7\xba\xca\xdc\xe4\x52\xea\x10\x49\x08\x40\x9b\x06\xe6\x35\xd0\xee\x18\xa2\xd2\x85\xa1\x8a\xd8\xd5\x86\x7a\x3f\x22\xaf\x51\x34\x89\x63\xc6\x2e\xf6\x0c\x4c\x8c\x85\xbb\x2c\x3f\x5e\xbf\x4f\xc4\x20\xbe\xa2\x88\x50\xd1\xc0\x18\x10\x31\xb1\x96\xad\xad\xa6\xbe\xa4\x9b\x17\x35\xd2\x95\xa4\x88\x13\x35\x9b\x6b\x7b\xc9\x17\x9a\x5d\x34\x30\xe6\xfb\xe3\xe3\x47\x70\xdd\xea\xe2\x3a\x99\xdb\x48\x45\x72\xda\x86\xb7\x30\x19\xda\x0c\x56\x53\xdd\x4e\x35\x26\x41\x0d\x07\x70\x04\x92\x04\xbc\x9a\x6a\x01\xef\xa8\xa4\xf3\xb7\x95\x37\xae\x8c\xe8\xb9\x79\xb3\xe6\x50\x08\x33\x81\xa3\xcb\x7c\x74\x7d\x7c\x19\x37\x67\xbf\x0a\x4a\xf2\x86\xfe\x5c\x02\x50\x6b\xcc\xba\xd4\x95\x23\xa9\xd2\xcf\xd5\x3e\x29\x39\xc9\xdd\x1b\xeb\xae\xc5\xba\x0a\x11\x81\xd8\x9a\x1a\xd9\x2f\x3f\xbd\x6e\x0e\xfa\xb7\x25\x9f\x72\xc5\x7d\x21\xb0\x92\x50\xb0\x80\x69\x74\x87\xcd\x7c\xa9\x52\x64\xcf\xe4\x56\x6c\x44\xbe\x66\x49\xb2\x1a\x11\x0f\x72\x28\xaa\x96\x4d\x0b\x91\xcc\x18\x7b\xe8\x5c\x94\x02\x9d\x70\x10\x0b\x93\x99\xc2\xca\xd7\x7f\x09\x2f\xbc\x4e\x31\x4f\x0a\x2f\x17\x46\xc3\xef\xd2\xa4\x6f\x60\xbd\xb8\x48\xfc\x8a\x93\xf3\x04\x7c\x2f\xc0\xc8\xba\xd7\x50\x63\xab\x7f\xfd\x99\xa4\xd7\x9c\xa5\x80\x49\x8e\x8c\x75\x78\xa9\xff\x53\xc0\xbb\x7d\x6e\x8c\xb8\x8b\x34\x50\x0b\xc2\xee\x99\xeb\x41\xe6\xea\x37\x77\x66\xdc\x62\xbc\x7e\xb7\x19\x9d\x24\x31\x73\xbc\x10\x0f\xc7\x24\xda\x95\xf2\x06\x41\x2f\x0d\xb3\x7f\x4f\x21\x4f\x85\x0e\xbe\x10\x38\x0c\x28\x74\x20\xf1\x39\x50\x8c\x52\x43\xb1\x21\x2b\x9d\x59\xe0\x95\x8f\x18\xc3\xe9\x35\x67\x41\xce\x63\x14\x8b\xe1\xd9\x8e\xc4\x69\x89\xa4\xf1\x15\x3c\xf2\xbe\xb6\x7c\x66\x65\xa4\xe2\x3b\xd1\x22\x78\x63\x7c\x10\xf3\x39\x9e\xe7\xad\x0d\xe1\x58\xaf\x6a\x63\xf2\x95\xad\xba\xfa\x50\x8d\x2b\x00\x8d\x75\x79\xc7\x6c\x0f\x8f\x67\x3a\x9b\x9e\x47\xd4\xf0\x7d\xf2\x68\x0c\x8d\x81\x36\x24\x3e\xa7\xbf\x55\x1c\x19\xcb\x8d\x6d\x01\x3c\x6d\xb4\x8b\x8e\x95\xe8\x13\x02\x4f\xb3\xef\xde\x51\x1c\xe5\x51\x92\x18\xf2\x79\x3f\xbf\x96\xc0\x4b\x18\x2c\xac\x76\x2d\xf8\x8e\x95\x0d\x40\x37\x1d\x14\x72\x97\x8b\x1e\x8e\x2b\xc5\x2a\x7f\x4e\x4c\x19\x56\xb8\xfd\x8c\xe8\xec\x0d\xd4\xb9\x2e\xbb\x47\x23\xc7\x67\xa7\x6f\xf8\xb7\x74\x9f\x8a\x8a\x7c\x45\xd1\xfb\xc0\xed\x1b\x53\x16\x6f\xf2\xbe\x85\xa0\x52\x1e\x49\x5b\x34\xa4\x32\x9d\xc7\xa7\xf2\xe3\xdc\xc0\x05\x7e\x8c\xcf\x11\x37\xc1\xe2\xa9\xbd\x29\xd0\x87\x4c\x6c\xeb\xca\xcc\x61\x6f\x61\x8c\xef\x42\x18\x69\xbc\x3c\x3e\xe5\xca\x79\x92\xee\xcd\xaa\x15\x35\xeb\xef\x1d\xa4\x50\x9a\xc0\x64\xf5\x2f\x72\x23\xd7\x92\xeb\xe4\xb6\x01\x2b\xfc\xb8\xd5\xea\xec\xc5\x67\x7f\xd1\xb1\xa2\xe7\x93\xeb\xc8\x48\xd1\xa5\xcd\xdc\x76\x40\xf1\x0c\x5c\x5c\x3f\x2b\x5b\x1c\xbc\x7c\xd3\x8d\xa3\xf0\xcf\x1e\xb0\x64\x77\x0a\x8d\x81\x0b\x96\xcf\xb4\x17\xed\x85\x37\x10\x2f\xf3\x45\xce\xf3\x5e\xfe\xcf\xe9\xf1\x84\xec\xe8\xff\x53\xf1\x5b\x04\x59\x75\x46\x50\x9a\x61\x2a\x7d\xf2\x1a\xd8\xf3\x51\xc3\x69\x52\xe9\xeb\x1b\xc1\x83\x6c\x5e\xca\x75\x78\xdc\xa9\xbf\x1a\x9d\xf6\xeb\x84\x81\x7a\xb4\x79\xf3\x54\x5c\x85\x97\xe5\xf8\x3f\x4c\x09\xad\x82\x5f\x43\x7f\x12\x6e\xcf\xdf\x25\xfd\xfc\x6b\x7d\xb6\x4c\xfa\x03\x39\x27\xda\x23\xf2\xd7\xdf\x02\x6b\x0b\xb2\x04\xff\x7e\xde\xd2\xb2\x65\x35\xec\x2b\xe5\xdf\x3f\x6e\x38\x68\x4b\xa8\xcd\x9c\xb5\x22\x62\xca\xde\x87\x01\x71\x5f\xc8\x11\x47\xe8\xb8\xb9\xd5\x25\x71\x7b\x55\xda\x99\xcd\xad\xda\xf7\xee\xd7\x35\x97\xf8\x9c\x32\x9f\x8d\x47\x78\xd0\x3d\xb9\xf4\x01\x31\xa1\xd4\xdd\x67\xad\x74\xbc\xe8\xcf\x0d\x19\x63\x09\x7d\x02\x62\xe9\x9a\x9c\xcf\x2b\x32\x30\xfd\x5a\x8e\xe0\x51\x37\x5b\x03\x87\x1e\x91\x3d\x72\xcd\xf2\xca\x1e\xf5\x33\x05\x86\xe2\x21\xf7\x33\x5f\x0b\x5d\x8f\x53\x86\xb2\x70\xf2\xb9\xe0\x43\x0a\x24\xb6\x27\xa1\xad\x80\xd3\xf6\x55\xef\x3a\x2b\x43\x95\x14\x3d\x7a\x46\x18\xfe\xd8\xc8\xde\x40\x68\x33\x4f\x42\xec\xdf\x1f\xd9\xd6\x99\xe1\xec\x92\x9e\xf7\xfb\x8f\x8d\x5e\x2b\x57\x16\xb1\x12\x58\x7f\xcb\x4b\x5e\x79\xc3\x6f\xa2\x30\x92\x3e\xeb\x1b\xde\xcb\xbb\xc4\x35\x15\xdf\xb2\x65\x27\x9d\xad\x08\xc6\xf2\xa4\xae\x5a\xc4\x36\x58\xb8\x3f\x7d\x38\x4e\x03\x5b\xdf\xba\x64\xd2\xc1\xbb\x21\xb1\xbd\x92\xd2\xab\x54\x49\x48\x11\xd9\xef\x3c\x7e\xfc\x3e\x55\xc0\xc7\x20\x5a\x21\x9e\xda\x94\x75\x8f\xe2\x2b\x2d\x5b\x24\x69\x71\xc5\x25\xdc\xdf\x49\x7d\x62\x05\x4e\x23\xe4\xdc\x63\x80\xca\x48\x9c\x97\x5a\x99\xd5\x5c\x56\x5c\x59\x75\x3d\xdd\xc5\x37\x7b\xbe\x3c\x34\x97\x6a\x25\x78\x25\xd8\x3e\x14\x9f\xdf\x8b\xa7\x9f\x8c\xfe\x93\x73\x7d\xfe\xc5\xb3\xf8\xcf\xd7\x97\x31\x03\x72\x51\x5b\x83\xa9\x8e\x1b\x7b\xcf\xd6\x7f\x44\xb3\x8a\x66\x51\x24\xd9\x7d\xfe\xc3\x58\x08\xa8\x0e\x8d\x77\x2b\x73\x3e\xb0\x21\x7d\xed\xb0\x5e\xb6\x9e\xb5\x4e\x49\xa1\xe5\xfc\x54\xe1\xc3\x1c\xfd\x0e\xef\x3c\xb3\x9d\xd2\xfb\xe1\xf1\xfb\x4e\x6f\xfb\xc9\x7f\x30\x1e\x92\x79\x75\x66\x59\xe9\x9b\x50\x46\x76\xe6\x77\x6c\xe7\xdd\x8f\xf6\xec\x3a\xad\xb3\x47\xf4\x62\x3a\x02\x73\x5a\x84\x45\x35\x68\xf6\xc5\x2a\x90\x86\x36\xf0\x3b\x73\xe9\x41\x86\x84\x26\xfa\x07\x08\x62\xaa\xb1\x19\x03\x0c\x41\xe9\x0d\x7c\x2d\xa0\x24\x56\xaf\x86\x49\xca\xd9\x81\xcf\x4c\xce\x73\xc5\x3e\x73\x64\x9d\x54\x5e\x82\xfb\x25\x48\xbf\xa7\x56\x2f\x7b\x76\x51\x14\x1a\xd0\xfb\xdb\xdf\xa6\xc3\x64\xc5\x0e\x14\xd4\x4a\x80\xbf\x6e\xaa\xc1\x91\x56\x35\x75\x39\xa9\xbd\x5c\xa9\xc4\xe5\x3e\x18\xe8\xb2\x50\xb9\x00\xcb\x66\xaf\xe5\x87\x9e\xed\xc9\x3b\xbc\x88\xf1\x8e\xdf\x63\x56\xee\xa7\x15\x88\x4b\xa5\xa6\x25\xa8\x94\x8e\x56\xe3\xd2\x23\xa0\x00\x52\x5e\x6a\x86\xf2\xac\xcc\xa4\xaa\x7d\x12\xe2\x5c\x3c\xb2\x16\xbe\x61\xd0\x6c\xd4\x12\x2a\x06\x27\x62\xcf\xe3\x91\x1d\xf1\x99\xeb\xad\xc1\x77\xe9\xed\xaa\x1d\x9c\xb7\x27\x71\x7c\x19\xbc\x90\xae\x40\x26\xa9\x79\x9f\x0b\x41\x8c\x37\x63\x2c\x31\xa6\xc7\x87\x88\x9d\x29\xff\x49\xe5\xa0\x59\x14\xb1\x4a\x08\x63\xa4\x26\x9c\xb5\x2b\xdf\xc3\x74\xee\xe6\x92\xad\xd0\x77\xe4\xb4\x53\x18\x8a\xc6\xfe\x89\x59\x5b\xe2\x01\xc5\x5c\xa9\xd0\x39\x56\x05\xcd\x11\x45\xa0\x82\xf6\xe1\x9a\x5b\x54\xfc\x57\xd3\x17\x0c\xd9\xb9\x73\x85\x79\x7c\x66\x8a\x20\xd0\x68\x00\x14\x8a\x51\x51\x70\x6a\xb2\x68\xe5\xb5\x7c\x4f\x67\x16\x69\x59\xa9\x01\xc9\xd8\x5e\x56\x14\xae\xa7\x53\xc3\x83\x50\x5d\xbe\x08\x3a\x40\x6b\x89\x0a\x7c\x29\x6e\xf8\x9d\x83\xf0\x1a\x8f\x0b\x69\x7f\xb6\xb3\x2e\x16\xca\x0a\x76\x97\x6c\x5b\xed\xe5\x05\x71\x88\xe2\x0f\x40\x1c\x50\x34\x3a\x0b\xa5\xf9\xd5\xfc\x44\xd8\x68\xf0\x09\x07\xca\x26\x67\xcd\x87\x48\x75\x61\xa7\xa5\x5c\x11\x26\xfb\x8b\xb0\xa3\x88\xf5\x47\x64\x3a\xab\x2e\x97\xd4\xdc\x88\x6d\xba\x80\xd8\x72\xb7\x27\x5e\x83\x96\x7f\xc8\x57\xba\xb4\xeb\x88\x66\x78\x87\x14\x21\x25\xe5\x2e\x60\xfc\xc9\x51\xb9\xba\x6f\xaa\xdd\xe8\x5e\x4b\x55\x7f\xd7\x8c\x1a\x5f\xa1\x30\xb6\xb1\xbf\xe0\xbd\x82\x7e\xab\x16\xf4\xdc\x15\x3e\x60\x09\x48\xd0\x54\x4f\x0e\x36\x57\xe0\xc1\x21\xce\xd5\x2c\xde\x60\xa3\x6b\xf0\xbf\x49\x5a\xc7\x8e\x42\x1a\xa0\x1b\x9f\x2b\x8c\xed\xde\x01\x5f\xd5\x28\x6c\x38\x60\x52\x5a\x57\xee\xd8\x71\x68\xf8\x22\x74\x72\x61\xc7\x11\xaf\x30\xee\x97\x97\x89\x71\x4f\x87\x28\x27\x43\xac\x66\x80\xef\xa3\xd1\x84\xc9\x99\xf5\xda\x19\x44\x19\xc3\x7a\xd6\x90\x78\x8b\x97\x1b\x4e\x5b\x66\x1a\x58\x6c\x5d\xae\x91\x8a\xc2\x0b\xe0\x5b\x03\x07\x85\x18\x07\xc6\xeb\xbb\x5f\x77\xb6\x48\x9a\x84\x37\x7f\x02\x37\xc6\x67\x5c\xab\x1f\x10\xd0\xff\xf2\xbe\x8a\x31\x9c\x8d\xcc\x33\x06\x1a\x25\x8c\x61\x67\x3e\x79\x27\x9f\x91\xc6\xed\xf7\xda\x5d\xff\xc8\x3f\xb1\xd9\x87\xd0\x8d\xe5\xcc\x5b\xc0\x5b\xc6\x58\x2c\x76\xd7\xea\xb1\x51\xf5\x22\xfa\x7c\xa4\x24\xaa\x40\x8a\xd1\x5c\x74\xe9\x2f\xe9\x04\x3f\x43\x1c\x59\x1d\xe9\xc4\x84\xbc\xff\xc4\x64\x8d\xed\x35\x6d\x81\x2b\xa5\x95\xa9\xa5\x08\xef\xdc\x4f\xaa\xc1\x97\x8a\xb0\xff\x19\x39\x6c\x4a\x11\xb4\xe4\xa1\x06\x96\x1d\xa9\x72\xc3\xdc\xc5\x95\x0c\xde\xe3\x9c\x4a\xc4\x6a\xd7\xf6\x97\x4c\x79\x6a\xdc\x37\xe2\x6c\x85\x9a\x52\xbb\xe3\x0e\x6b\xdd\x12\xac\x35\x57\xb0\x44\xa7\x72\xb2\x3b\x7e\x7e\xfc\xbe\x8e\x7f\xf8\xe1\x2b\xa5\x05\xf8\x8e\x21\x83\xa1\x43\xa8\xf2\xfa\xbc\xfa\x72\x99\xb9\x2d\x63\x8c\x5a\x28\x45\xc6\xce\xc1\x41\xa0\x18\xb4\xf2\xf4\x85\xd0\xb7\xc4\xf8\x26\x0b\x6b\x7a\x23\xc1\xb7\xa5\x34\x6f\x47\xfb\x3d\x8f\x4c\x79\xe6\xbd\x04\xd2\x0e\x11\xac\xd5\x25\xc0\x9e\x1e\x8b\x27\xe0\x59\x2d\x7f\x4b\x4f\x6f\x30\x73\x90\xb4\x0a\xbf\x7c\x96\x11\x13\x8a\x62\x8b\x1e\xa7\xda\x58\xb7\x4c\x46\xdc\x4d\xf6\x38\x52\xaf\xbb\xa9\xde\x46\xb3\x49\xfb\x6a\xb3\x66\xdd\xfb\xc4\x9b\x96\x85\xf1\x85\x53\xa4\xb6\x9f\x92\xd9\xbb\x8f\xe0\x51\x1d\xb8\x02\xd9\xd9\x2d\x03\xaf\x3a\x5e\x2f\xbf\x50\x52\x96\xc3\xdd\xdd\x9b\x9d\xfc\x25\x0c\xca\x25\xe2\x1d\xfb\x11\xc9\x1d\xd8\x14\x87\x4f\x11\x25\xa0\x83\x73\xe4\x27\x98\x2c\x8a\x25\x5f\x1c\x60\xc7\x49\x5d\xe9\x92\x46\x42\xf5\x2a\x86\xcc\x43\x20\xf9\xf9\xd1\x05\xb7\xa4\x62\xbe\x23\x30\x53\x26\x9a\x97\x59\x03\x44\xc4\xd1\x2f\x9e\xf3\xeb\x19\x6d\x8b\xbc\x23\xcc\x31\xef\x82\xbe\x44\x45\x2e\x80\xec\x67\x5f\x68\xc4\x3d\x7f\xfc\xfe\xd2\x57\xde\x70\xcc\x62\x42\xe6\x2c\x32\x39\x4b\x93\x52\x35\x0c\x7b\x45\xf1\xec\x0b\x4e\x1b\xe2\xf8\xe6\x0f\xf3\x58\xd7\x6f\xc7\x81\x46\x71\x31\x8c\x5f\x18\x6b\xe7\x50\xab\xdc\xaf\xd0\xc1\x91\x8f\xbf\xbd\x65\xe2\x7f\x83\x2c\xf8\x9e\xce\x73\x81\xe8\xd8\xb0\x63\x15\x28\x28\xe3\x5d\xef\x7f\xee\x59\xbb\x5f\x95\xd3\x16\x0a\x55\x5a\x69\x3c\x92\x8a\xfd\xbe\x2d\x1a\xa3\x9e\xe6\x5d\x5b\x6d\x3c\x43\x59\x19\x1f\xd0\x28\xb1\x0e\xab\x60\x55\x5c\x8f\xcb\x5b\xef\x52\x89\x77\xcb\x51\x58\xf8\x08\x85\x04\x33\x59\xa5\x8d\xf8\x14\xe5\xf1\x95\x17\x2c\x80\x30\x69\x0c\xd2\x61\xbf\x58\x5a\x51\xb3\x7a\xbf\xea\x32\x36\x64\x2b\x60\x6d\xbb\x30\x3b\x70\xe9\xee\x8c\x52\x59\x73\xa2\xa0\xc4\x3c\x08\x38\x7c\x25\xcb\x97\x9e\xbd\xe6\xe9\xaf\x23\xc7\x19\xe6\x3b\x37\x89\x0a\xd1\xab\x68\xa6\x53\x87\x25\xec\x96\x17\xe6\xf3\x3a\x0b\xa3\xd6\x7b\x6c\xd4\x81\x92\xaa\x48\x3f\xc4\x2b\xfe\x13\x0e\x26\xa2\xdd\xdb\x60\x2b\xfa\xe2\x8c\x07\xed\x10\xbc\x26\xe6\xbf\x84\xee\xaa\x22\x96\x00\xfb\x6d\x67\x5a\xd4\x4f\x4f\x98\x50\x7a\xaf\x9d\xe2\x3e\xf6\xf2\xb6\x25\x10\xf7\xe4\x06\xad\xa2\x24\x0f\xb9\x08\x11\x43\xa9\x9c\x13\x14\x30\x93\x1b\x1f\x67\x4e\x33\xcb\xa3\x7a\x31\x8a\x13\xaa\x69\x37\xf3\x2b\x35\x78\x8a\xfb\xb4\x8d\x2a\x32\x7c\x77\x38\xab\x1c\x8d\xdb\x02\x24\xd4\xd3\x48\xda\xd1\x97\x84\x6a\xcf\x53\xe8\x08\x63\xfc\x65\x6d\xfd\xe5\xaf\x9b\xd4\x55\xec\xca\x6d\xcf\x81\x3c\xe7\xeb\x8f\x0a\x1c\xfe\x6e\x9f\x49\xbc\x54\xe2\xe2\xc4\x8e\xd2\x56\x9e\xff\xc8\xe4\x7b\x6b\x37\xa4\x99\x1b\x9a\x87\xf6\xea\x16\x37\xb3\x0b\xbf\xd9\x43\x0b\xe0\xbe\x27\xca\xe5\x96\x4c\xbd\x5f\xaf\xed\xcb\xc2\xbe\xfd\x6c\x59\x5c\xfb\xbb\x4e\xb3\x9b\x6d\xe4\xbc\x71\x04\xb9\x98\xd5\x5e\xb3\x10\x18\xfd\x1e\x4d\xc5\x75\x68\xbe\x91\x38\x17\x8a\x33\x45\x78\x2f\x26\x37\xcf\x9c\xc0\x9b\xcf\x97\xbf\x3c\xc6\x2b\x5e\x3e\x9f\x0a\x20\x86\x03\x2a\xe1\x2b\xcd\x2a\x58\x1b\x14\x8a\xb2\x0b\x86\x0a\xe0\x76\x18\x45\x1e\x66\xd8\x04\xaa\xe3\x19\x74\x2e\xb1\x44\x39\xaf\x0c\x8b\x12\xc1\x7d\xa2\x17\x64\xdf\x69\x54\x58\xb4\xf5\x1d\xf9\x00\x4f\xfc\x03\x55\x25\x7e\xcf\x42\x28\x9f\xb2\xcd\x2d\x94\x61\x3a\xf9\xa6\xdb\x62\xdf\xff\xc6\x18\x4f\xba\x08\x10\x44\x28\x21\x38\xc0\x07\xfd\x83\x0f\x7d\x75\xf3\xa5\x5f\xa7\x97\xd5\x54\xbc\x27\xec\xac\xef\x0e\xa6\xcb\x12\xde\x7e\x74\x29\xc8\x23\xca\xba\x46\x6f\x00\xac\xc1\xa8\xa5\x3a\xac\x76\xfc\x49\xe0\xe2\xbb\x3f\xf6\xd3\xf9\x1d\x89\xbd\x80\x0b\xa4\x68\xbe\x9d\x8d\x82\x39\x97\x6a\xad\xad\xe9\xbe\x00\xac\x16\x6d\x50\xc7\xe5\xac\x3d\x6b\xa5\xed\xd5\x69\x6f\xc5\x99\x80\x1f\x6d\xf9\xe4\x22\xfe\x37\x4b\x80\xe6\x4b\xde\x0c\x36\xc3\x72\x1d\x00\x75\x5d\x69\x0c\x0f\x28\xd2\xf4\x59\xf6\xa5\x16\x0d\xc7\x7f\xe9\xf1\x23\x35\x11\x5f\xd8\x34\xe8\x42\xbd\x7b\xa8\x43\xae\x8d\x6a\xe0\x5f\x74\xfc\xa4\xf7\x01\xf1\x86\xfd\x4f\x74\xbc\xc6\x2a\x55\x74\x6b\xe1\x51\x47\x35\xf4\x90\xc5\xb0\xeb\xa3\xba\x64\x90\xe2\x2b\xdc\xa8\x02\xd1\x66\xfe\x4b\x3a\x58\xd1\x0b\x0a\x82\x89\x15\xff\xe5\x60\x62\x6b\xe1\xd3\x24\x67\xb5\xb8\xe7\x66\x2e\xba\xfc\x84\xe4\x89\x64\xce\x85\xb1\xec\x51\x5a\xdc\x1a\xd9\x6a\x0f\xe6\x75\xd0\x6c\x02\x1e\xa0\x7a\x61\xa8\xe8\x65\x82\xc2\x1c\xc3\x21\xec\xdc\x3e\xdf\x85\x48\x85\x9f\xcd\xe2\x7c\xc2\x0a\x55\xe5\xdb\x02\x96\x02\x51\x55\x3c\x7d\x50\xd5\x4c\xd0\xc5\x96\xe7\xd1\x5d\x1a\x41\x9b\x87\xee\x4c\x25\x0b\x9b\x7d\xc5\xab\x23\xdb\x9a\xa6\xbe\x60\xda\xc7\xa5\xb0\x36\x50\x69\x68\x19\xf1\xa2\x1b\xae\x47\x04\x0a\xa2\xda\x52\xa2\xae\xf5\xde\xc3\x6d\xbf\x95\x8c\xf3\x6c\x74\x33\x29\x7f\x69\xf6\x5f\xa0\xf5\x94\x0f\xe0\x0b\xf1\xf7\x26\x05\x45\x7a\xce\xa3\x10\x16\x12\xd9\xb1\xf4\xc3\x64\x0d\x53\xcc\x76\xce\xa1\x9f\x63\xaa\x6e\x8e\xd1\x5c\x11\x64\x72\xe9\x63\xa3\x18\x4a\x81\xc9\x38\x83\x1f\x29\xb0\x87\x68\x1f\xe8\xcd\x18\xe9\x5e\xca\xc1\x34\x7e\xb9\xbf\x84\x4d\x83\x47\x4e\xc3\xd2\xbb\x4b\x40\x10\xa4\x2e\x4d\x06\xa0\x64\xed\x24\x63\x22\x96\x50\x7f\xeb\x2d\xcc\x38\x08\x9b\xdb\x42\x0d\xf1\x33\x6a\x92\xc6\x58\xa3\x15\x68\xc7\x43\xa6\xb6\xbe\x58\x80\xd9\xe9\x11\x7e\x92\x07\xfa\xb6\xd9\x43\x48\x3c\xf2\xa7\xbe\xb5\x6c\xa6\x75\x28\xf5\x09\x4e\xcc\x71\xbe\x76\x61\xc4\xd3\x9f\x86\x8c\x00\xb4\xdb\xf7\x72\xc2\xfc\x82\x61\xa6\xec\x72\xec\xca\xd4\xd8\x7b\x8d\x7e\x18\x5b\x2c\xd8\xc7\x23\xa3\x8d\x49\x3d\x4f\xba\xe0\x27\xdb\xbf\x51\x78\xca\xbd\xf1\x85\x40\x23\x21\x82\x2a\x3d\xcb\x91\xa5\x18\x49\x18\x83\x76\xae\x93\x0e\x85\x38\xab\x72\xbf\xbd\x45\x26\x2d\xc4\x2a\xd6\xcb\x05\xa8\x7a\x29\x52\x33\xfc\x40\xe2\x2a\xd1\x77\xf5\x0e\x75\xa4\x9b\x02\x23\x73\x2f\x5b\x88\x75\x56\xd4\x4b\x82\xf7\xb5\xe7\x43\x8d\xbf\x7f\x09\x5b\x7c\xcc\x2f\x17\x00\xeb\xad\xe8\x8d\x06\x3f\xdf\xd4\xce\x38\xd2\x10\xf0\xde\xe1\xfe\xf8\x8a\xbe\xdc\x71\xab\xa2\x1a\xed\xc8\x36\xaa\xa7\x40\xbb\x90\xbf\xff\x0b\x80\xf6\xf0\x8e\xf5\xa2\x9c\x1c\x60\x3a\xee\x15\xf7\xde\x0e\xcd\x25\xdb\x8d\x7e\x7f\x8e\x0a\x4b\x71\x21\x77\x59\xdd\x2c\xb0\xda\x0a\x8a\x61\x91\x52\x1a\xd9\x88\x70\x5c\x57\xd9\x72\x88\xda\x35\x56\x09\x1b\x0e\xa2\x93\x85\x04\x67\x27\x95\xfe\xf1\x14\x32\x3c\xf9\x2e\xe5\xf8\x2f\x9f\xf0\x94\xe7\xe6\x0b\xf1\x7e\xfe\x9f\x7c\x82\x41\x41\xc6\x65\x70\x49\x03\xdc\xee\xda\x4b\x72\xf6\x02\x95\x28\xa7\x22\xa8\xb6\x11\x86\xca\x69\x6f\xe6\xdc\xdb\xdc\xd3\x5d\x50\xde\x92\x54\x3f\x98\xca\x79\x8b\xa2\x3c\x0e\xd7\xcd\x85\xca\x58\x7d\xc3\x85\x30\xfd\xe7\x7d\x39\xb2\x71\xd7\x4b\x2f\xc9\xa9\xb9\x21\x90\x17\x54\x7c\x5e\xc7\xee\xde\xfc\x87\xcb\xda\xf6\x1b\x07\x82\xd0\x82\x99\x05\xad\x89\x0a\xd6\x0b\x01\x4e\x75\x25\x23\x65\x5a\xcc\xa8\x6a\x90\xe9\xab\x5b\x8e\x89\x8e\x20\xd8\x4a\x49\x16\x9b\xe9\x45\x81\xb8\x55\xd5\x45\x26\x7b\x6f\x74\xdd\x42\xab\x12\x9e\x70\x3d\xba\xfc\x48\x62\x7e\xca\x81\xf1\x85\x90\x42\x21\x62\x02\xa6\x91\x73\x42\x0b\x3c\x3f\xc5\x9c\x65\xd1\x2c\xfd\x76\x2e\xe4\x6a\x9e\xc1\x53\x0b\x2b\x7e\x44\x61\x0d\xdf\xd8\x30\x68\x37\x7a\xdf\x06\x74\x42\x2b\xf9\x4b\xc2\x1b\x01\xf8\xc0\x60\xd6\x36\x12\x3d\x34\x35\x66\xb1\x85\x94\xf2\x5a\x57\x55\x91\xa9\xb2\x95\x3f\x68\x09\x27\xe0\x23\xcc\x0a\x82\x0a\x76\x1e\x85\x3e\x2b\x5c\xed\x9f\xe6\xed\xf2\x0a\x9a\x01\xbf\x33\x35\xc2\xd5\xcb\x1f\x8a\x8a\xa8\xaf\x69\xfc\xa2\xfe\xc3\xb9\x42\x39\x55\xd7\x8e\x8c\x78\xae\x9c\xa0\x51\xb2\x48\x92\x46\x15\x69\xae\xde\xf9\x0b\xf7\x01\x51\xd7\x18\xef\x35\x76\xf4\x72\xed\xbf\x63\xec\x49\x8f\x07\x02\x0b\x05\x0d\x9a\x96\xc4\x36\xbe\x85\x8e\x68\xc0\x1d\x46\xbe\x2e\xa5\x84\x73\x3f\x87\xbf\x62\xd5\x35\x8a\x7f\x6d\x41\x5c\xb4\x3c\x12\x9a\x23\x96\x04\x52\xff\x67\x70\x56\x3a\x04\xc2\x5d\x7e\x9c\x16\xf1\x93\x9f\xbf\x8d\x38\x29\xfe\x96\x9a\x70\x73\x7f\xde\xbe\xa9\x1d\xac\xac\x20\x86\x0a\x8a\x72\xf7\xb3\x6e\x84\x2c\x2e\x9d\xa1\x16\xd9\xb9\xf9\x9c\x31\xbd\xe6\x3a\x8e\x10\x26\x72\x0a\xbb\xd5\x6e\xd2\x61\xc3\xde\xaf\x07\xc4\x1d\x47\x27\xdb\x0a\x9e\x37\xc3\xf8\x7e\xf2\x2b\x56\xae\xd7\xc2\x0c\xd9\xac\xf0\x60\x6f\xe4\x35\xe1\x72\xdf\x23\xf2\xa6\x73\x63\x04\x35\x0d\x7a\x1b\xc3\x8b\xc6\xa8\x7b\x5f\x66\x35\xe4\x2e\xb0\x71\x26\x8b\x8e\xbe\xa3\x6a\x2e\xaf\xfd\xae\xa5\xf0\xac\x93\x70\xe2\x28\xdd\xe5\xdf\xfc\x3e\x75\x9d\xf9\x42\x84\x30\xff\xb3\x74\xf9\x84\x3a\x14\xee\xd2\x8e\x6d\x54\xaa\xc4\x23\xaa\xc2\x93\x6b\xa4\xd8\xf0\x4a\x65\x6e\xe9\x0d\x5f\xa2\x9b\xcb\x44\x7b\x1d\x2b\x01\x9d\x08\xa2\xa0\x9e\xb3\x1f\x6d\x8f\x23\x98\x30\xbe\x91\x67\x53\x89\x0c\xf0\x99\x73\x80\x25\xf4\x68\xd1\xdf\x5f\x4b\xce\x4a\xee\x00\x65\xfa\x66\xd4\x21\x42\x24\xc7\x95\xde\x54\x76\x07\x4a\x11\x0f\x31\x07\x2e\x96\x91\xd6\xd8\x66\xfd\xb0\x5a\xfb\xd1\x27\x6a\x66\x9a\x60\xf9\x41\xe4\x0b\xcc\x67\x6a\xc8\x05\x22\xda\x6f\xaa\x34\x7e\xcb\xa7\x73\x91\xd8\x68\xbf\x6c\xb9\xa1\xb2\xa8\x3b\x69\x9c\xc9\xd9\xe5\xb3\x38\xf7\xc6\xfc\xff\x81\x4f\xfd\x76\xe5\x7f\x7f\x78\xf0\x38\x15\x4c\x7a\xaa\xe9\xfe\xe9\xac\x76\xb0\x59\x65\xf6\x31\x3f\xa6\x3c\x4a\xf5\xd9\x8e\xd0\x75\x4f\x34\x4b\xbf\xaf\x2f\x93\x9c\xc9\x03\xb2\xdf\xef\xdf\xbf\x66\x9e\x8a\xa4\x37\xf5\xd3\x41\x86\xc8\xdd\x4c\xc6\xa5\x4b\x3b\x08\xc0\xd8\xfd\xd5\xa2\xfe\xf9\xf7\xaa\x5b\x93\xea\x0f\xd0\xdf\xf9\x32\xd8\xcb\x46\xf5\x8f\x64\x74\x92\x81\x25\x6c\xdf\x32\x83\x4b\x60\x3f\xfe\x3c\x46\x75\xf1\x93\x90\xfa\xb5\x83\x3e\x99\x03\x0a\x0f\xb7\x65\xd8\x7d\xd6\x9e\x14\x54\xc9\xd2\x94\x48\x78\xb5\x80\xfb\xae\x60\x5f\x00\x62\x19\x82\x08\xb1\x4a\x27\x0f\xc2\x2a\x88\x04\xd9\x6f\x5e\x1c\x45\x7f\x5c\xed\x0e\xff\xfa\x85\x6b\xf0\x78\x70\x22\x74\x2c\xc3\xcd\x65\x53\xb1\xc8\xe0\x8c\xce\x42\x93\xd6\xc2\x9f\x57\x03\x0b\x4c\x4c\x16\xb5\x8e\xa2\x4b\xde\x7c\x6c\xff\x15\x73\xb3\xe5\xf3\x84\x60\x81\xa0\xa6\xbd\xea\xf4\x56\xdf\x6a\xcc\x9d\xda\x22\x31\xc8\xa3\x55\x46\xd1\xb7\xb7\xd5\x8b\x3f\xcd\x7f\x3f\x63\xf7\x5d\xce\x90\x26\x67\xc0\x87\xde\x15\x71\x58\x88\x1a\x31\xcb\xfb\xfc\xb6\xae\x39\x1c\x68\x94\x2d\xc0\x82\xa9\x75\x9e\x76\xa7\x82\x24\xa9\x37\xa7\x69\x86\xb4\x17\xaf\x20\x9d\xf3\x81\x87\xc2\x73\xb0\x3d\xb2\x0b\x9f\x08\xd0\x52\xf7\x7c\xd3\x89\xcb\xd0\x96\x19\xdc\xc2\x42\x86\xf4\xb6\xee\x60\x41\xa8\x87\x6e\x9a\xd8\xbf\xae\x5b\x44\x1f\x8f\xf6\x6b\x40\x53\x1f\xe8\x5c\x0d\xca\x29\xc1\xca\x6a\x8b\xb5\xa7\x4c\x14\x1c\x53\xff\x9c\x55\x6c\x0f\xac\x30\xcb\xb7\xb9\x27\x37\x50\x32\xec\x75\x63\x94\x76\x7e\xb4\xdf\x9d\x06\xed\xc4\xbf\x8e\x37\x61\xe3\x36\xae\xc2\xc7\xc4\x38\x67\x6b\x57\x0a\x73\xa6\x12\x9d\x85\x76\x11\x41\xb4\xc1\xf7\x1c\x64\x08\xbd\xc2\xd1\x20\x67\xdf\xf0\xd5\x8e\x54\x37\xc9\x36\x65\xa0\xd5\xe6\x74\xc3\xf3\xf0\x80\x3e\x62\x2c\xe4\xa7\x91\x4f\xae\x4b\x07\x18\x52\x02\xf0\x1f\x8f\x87\xfd\xb9\x75\xe1\xaa\xda\x64\xec\x14\xf8\xf8\x26\x2e\x4b\xd0\x6e\x8f\x77\x3f\x5b\x31\x53\x98\xdd\x75\x19\xf0\x3c\x22\x07\x18\xcc\xea\x22\x1f\x3c\xb8\xb1\x3c\xb5\xd2\x45\x8e\xce\x3f\x2c\x71\x1a\x18\x1f\xa1\xd3\x68\xe0\x48\x5d\x14\x59\x11\x53\x12\x03\x23\xb5\x22\x85\x21\xe6\x22\x27\x9a\xb8\x41\x34\xf8\xbb\xd3\x40\x65\x81\x6f\xf8\xe3\x18\x6b\x96\x6c\xca\xa5\x50\xa0\x65\xfc\x76\x1f\x50\x83\xb7\xa1\x01\xa7\xbd\x5e\x5f\xaa\x21\x5c\x53\xd2\xfb\x96\x87\x2e\xd0\xd0\x0c\x6b\xd6\x2d\x4d\xb3\x66\x3b\xd5\xa6\x20\x98\x9c\x09\x54\x84\x95\x80\xb6\x4d\xc7\x16\x3d\xf2\x59\xb8\xdb\x6e\x75\x27\xc6\x11\x60\x53\x56\xc4\xc3\x42\x94\xce\x47\xca\xcf\x62\x9f\xb7\x43\x04\x38\x12\xdd\xe6\xf1\x09\x87\xf3\x7e\x48\xfb\x46\x17\x7a\xb8\x38\x5a\x30\x17\xf3\xdb\x7c\xf1\xa1\xea\x0b\x2a\xd4\xdf\x88\x44\xc8\x43\x9e\x03\x8d\x7e\x7d\x49\xd5\x26\x66\x6f\xf8\x41\x9f\xb6\x71\xb1\xcf\xbe\xeb\x08\xc1\xdb\xd1\xc8\xbe\xee\xb0\x07\x4d\x5c\x94\xe1\xc1\xdb\x02\xfc\x8d\x44\xcd\x7b\x97\xb1\x3f\x90\xb2\xfc\x97\x4c\xa6\x98\x6f\x61\x79\xe8\xbd\x34\xdc\x9e\x7d\x92\x7d\xc7\x76\xf4\x63\x10\xbd\x27\xf0\x08\x9c\xd3\xe6\x40\x65\x44\xbf\x53\x52\xd8\x95\x1c\x01\x3b\x85\x62\x9d\x14\xcd\x62\x71\x02\x4c\xe2\x8f\x68\xe9\x85\xa9\x52\x51\x59\xfe\x60\x06\x64\x69\x32\xc6\xbe\x71\xbc\x5b\x89\xbd\x01\xbb\x7e\x79\xb8\x64\xd7\x8a\xb8\xd9\x2e\xb8\x95\xf8\xcd\x58\x5c\x1b\xe2\x31\x45\x19\x0a\x00\x6d\x8f\xbd\x4d\xe9\xc8\x16\x69\x14\x9a\x31\x9c\x63\xb1\xdb\x79\x9f\xb7\x71\xea\xea\x6d\xcc\x43\xf3\xf6\xc3\xe6\xd0\xc6\x3e\x9a\x04\xa0\xf3\xb3\x08\x29\x12\xa9\xfd\x4e\xd6\x47\x7b\xae\x91\x19\x37\xdc\x86\x94\x90\x91\x4c\xb6\x59\x20\xa2\x4b\xe9\x44\x6a\x02\x7d\x09\x94\xc0\x66\x37\x39\x95\x26\x33\x35\xb0\x6b\xd4\x84\xc9\x53\xfb\x0a\x4a\x2e\x43\x3b\x1a\xba\x6a\xb7\x16\x16\xc4\x77\x0f\xae\xa5\xc6\x80\x64\xa2\x94\x0d\x4b\x97\xe0\xa3\xbc\x77\x25\x78\x7a\x73\xed\x1b\x94\x2a\xfd\xee\xec\xad\xed\x7b\x52\x37\xa3\x8c\x04\x93\x77\xb1\x7b\xc0\xa0\x6a\x48\xc7\x07\xbc\xf7\x7b\x9b\xbe\x31\xf3\x91\x7b\xf0\xfd\xa9\x4d\x99\x1f\x7f\x54\x03\x4c\x3a\xfb\x74\x50\xfd\x3a\xdc\x8d\xa4\x1f\xb0\xa6\x34\x57\x9e\x8d\x34\x1c\x7c\xfb\x49\x17\x67\x96\xa5\x36\xdb\x30\x73\x3b\xb5\x7c\xf8\xde\xe0\x6d\x4b\xef\x11\xf7\x5c\x19\xb4\x33\xd0\x28\x5f\x2c\x8c\xae\x0e\x76\x99\xbd\x5b\x3d\x46\xe4\xe7\x77\x0b\xe5\x19\xf8\x59\x11\x4a\x76\x9b\x70\xc7\xc3\x10\xab\x91\x34\x69\x80\xf4\x26\x69\x67\xc4\xcd\xfd\x77\xfd\x0a\x55\xfe\x10\x77\x4d\x7d\x7a\x0e\xa7\x39\xa8\xb1\x12\xfe\xf3\x8d\x65\xd6\xac\x3f\xb6\x96\x7a\x17\x98\xb3\xdf\x3f\xc4\xc8\x56\x96\xec\xd6\xff\xe0\x52\xbc\x15\x1a\xaf\xe6\xac\x6f\xc8\xb1\x42\x71\xc3\x82\x41\xf2\x51\x24\x58\x02\x1b\x24\xa2\xa3\x5b\xe5\xaf\x97\x50\x0f\xf5\x7e\x3b\x69\x71\x34\x73\x68\xe5\xeb\xdc\x3e\xef\x9c\xbd\x6f\x78\x4b\x53\x48\xff\x7d\x26\xa0\x05\x1d\x50\x6e\x2b\x7c\xb1\x68\xe1\x1e\x4f\x66\x6b\xa6\x6c\x96\xee\x9e\x34\x58\x7f\xe8\xf1\x25\x58\x72\x9f\xba\xa7\xc9\x83\xbf\x39\xf4\x35\xb8\x4f\xb1\xe2\x97\xec\x54\x8e\xd4\x0c\xe1\xec\x68\xf1\xdd\xf4\xe8\xe9\x94\x0a\x50\x1c\x9d\x06\x50\xba\x3c\xbf\x9b\xe8\xc6\x9d\xd8\xaf\x3d\x36\x9a\x72\xd9\x9b\x15\xfe\x5c\x30\xdc\x22\x05\x7b\x06\x99\x02\xb6\x1e\xd1\xeb\xc5\xef\x10\x0d\x8a\xb1\x1f\x46\xdc\x77\x7c\xea\x7f\x8e\x1e\x91\xe5\xfd\xb0\xa3\x5c\xe9\xd7\x83\x82\xdd\xa5\xd7\x21\x4a\x7b\x3b\x4c\x35\x73\x6a\x1e\x92\x2b\x3b\x24\x71\x6e\xb0\x05\xbe\x3a\xc4\xc0\xe7\x87\xc4\xe1\x2c\xd7\x72\x2f\xcf\xb0\x09\x98\x51\xc9\xa3\x66\x65\x6a\x3b\x58\xf2\x24\xc5\xbe\xd5\x99\xe5\x94\xb7\xdd\x1d\x2f\x83\xcf\x88\xb6\x91\x2f\xe4\xd0\x27\x31\x1b\x2d\x3a\x0b\xbe\xe3\xef\x16\x17\xd3\x8c\x23\xe7\x4b\xde\x98\xb1\xf4\x36\x6b\x30\xfd\xf9\x00\xec\xe8\xdb\xf3\x76\x62\xed\x4f\xf7\x63\x90\x35\x18\x2c\x1d\x43\x44\x06\x0b\x34\xba\x31\xd5\x8e\x37\x6c\xf3\x37\x34\xc3\xbc\x4c\x97\xe0\xbb\x82\xad\x5c\xa2\x3e\xc6\xcf\xcb\x7a\xb5\x71\x06\xdb\xb0\x42\x24\xe3\x17\x2d\xac\x06\x04\xe1\x3e\x68\x61\x3c\xca\x0c\xd6\x7b\x1c\xff\xc9\x2a\xf9\x89\x61\xa4\x93\x3a\xa3\x8e\xaf\x77\xfd\x41\x41\x9d\xc9\x4b\x10\xac\x16\xb6\x3f\x18\xf7\xc1\xf3\x1c\x50\x86\x77\xf4\x8a\xbc\x04\xa0\x7c\xac\x36\xe2\x7d\x34\x92\x43\x0f\x53\x33\x23\x73\x36\xdc\x72\x4c\x26\x38\x28\xf2\xf9\xdf\x84\xda\x59\x70\x7b\x08\xd1\x73\xbd\x1e\xed\x27\x69\x32\xd1\xfd\x79\x68\x8b\xbd\xd5\x7b\xb2\x5e\x7a\x5b\x8a\x46\x9f\xbc\x6c\x91\x3b\xb7\xfb\x35\x09\x6b\xda\x10\xbe\xd2\x49\xe6\xd1\x2a\x1e\x09\xd6\xe1\x71\xc5\x1c\x83\x43\x4d\x8c\x88\x65\xf8\xda\xe2\x2f\x16\xbd\x92\x64\x85\x8e\xb6\x26\xbd\x95\x78\xdb\x67\x6f\xb8\x00\x25\x7b\x9d\xd9\x0a\x3d\xe8\x28\xc4\xe1\x6f\xd3\x88\x59\xd7\x72\xad\x7f\xdf\x44\xc3\x1e\x3e\xbb\xa6\xe1\x66\x97\x5f\xbb\x2b\x3a\x62\x06\x8d\x7a\xdf\xbb\x4f\xc7\xf5\x61\xc1\x3c\xfb\xd5\x74\xbe\xde\x6c\xdb\xd7\xdf\x1c\xf0\xca\xde\x0e\x46\xfc\x2e\x45\xcc\x4d\xa6\xc2\x75\x7d\x00\xb5\xe2\xb7\x55\x7b\x78\x6b\x0e\x39\x1d\x85\x59\x5d\xd6\x6b\xc2\x05\x7a\xb9\xa5\xac\x89\x14\x91\xec\xb9\xbe\x9c\x16\x4a\x2b\x08\x90\x56\xd1\xe9\x7d\x96\x9b\x0a\xe9\x8b\x26\x68\x21\x29\x7f\x38\xcc\xab\x34\x71\x51\xc3\xd2\x53\x93\xe5\xca\xd1\xc5\x0d\xa6\xa7\xce\xf8\x8f\x1a\x9a\x0b\x2d\x4a\x47\x0a\x62\x18\xa6\xba\x6f\xba\x5e\x7c\xe1\xdb\x4c\xe7\x78\xc6\x9f\x04\xeb\xf9\x41\x08\x30\x29\x0c\x28\x39\x1a\xf8\x20\xe7\x93\x11\x3a\x1d\xc1\x75\x71\xed\xef\xf7\xcb\xde\xb8\x1d\xfe\xe9\x61\x39\x66\x0c\xd2\xdb\x21\x43\xd6\x57\x46\x6e\x02\x55\xd6\x0d\x8f\xb3\xea\x67\x6e\x98\x68\xe6\xbc\x11\xdc\xc6\x9a\xf2\x73\xdf\xb4\xd5\x05\x27\x41\x7d\xae\xd7\x06\x03\xbf\xb6\xbf\x76\xb9\xb2\xee\x8a\x1b\xcc\x6a\xe2\x78\x53\x78\xb6\x8f\x1e\x41\x27\x76\xa1\x86\x7b\x0a\x0a\x9a\xd9\x6d\x04\x27\xa2\xaa\x49\x0f\x5b\xe2\x2e\x9e\x75\xa0\x6e\x02\x65\xed\xb1\xe1\xdc\xc7\x1b\x31\x59\xb8\xb0\x21\xc1\x3b\xc8\xc3\xdc\x1c\x57\x51\x79\xb3\xd1\x53\x75\xb1\x2f\x3b\x10\x13\x86\x05\x25\xff\x29\x3b\x3f\x75\x9d\xfa\x42\xda\xc8\x14\xbc\x01\x65\xe7\x69\xff\x4c\xce\x1b\x9b\x87\x65\xcf\x60\x1c\xbc\xec\xa1\xce\x04\x7a\x2d\x2b\xa3\xc6\xbe\x1c\x22\x71\xbf\x99\xca\xfb\x80\x0c\x30\x5b\x50\x62\x2a\x38\xb8\xc1\xc9\x60\x7b\x2d\x88\x7f\xd6\xd2\x6d\x36\x4c\x4d\x4d\x60\x06\x5d\x6b\x9c\x88\x22\xd0\xf5\x21\x8e\xf9\x0f\x2c\xf8\x2e\x5b\x2d\xbe\xd7\x27\x72\x6a\x54\x95\x41\x1f\x12\xa5\x1f\xf1\xf1\xf5\x43\x88\xf3\xea\x5e\x69\xea\xc8\xf7\x5e\x4d\xb4\x8a\x65\xb0\xae\x71\x07\x76\x57\x92\x17\x99\x4e\x99\x72\xeb\xb8\xfe\x44\x3b\x81\x87\x02\x76\xdc\x67\xb6\x75\xb8\x47\x45\x84\xaf\x64\x8d\xda\x0c\x54\xa7\x19\x9d\x58\x71\x54\xfd\x96\xf6\x67\x08\xe2\xef\xce\xaf\x16\x1e\xbe\x1f\x8e\xd3\x8a\x65\xc6\x26\x4a\x9d\x54\xcf\x39\xf7\x66\xa7\x1f\xa4\xed\x34\xb4\x85\xea\xa6\xfc\xfe\x5a\x29\x23\x27\x4c\xf0\x2c\x1b\x83\xf7\xfa\x34\xa3\x4d\x62\x93\xbf\x6f\x1b\x6b\xdd\x6c\x35\x15\x94\xcc\xb2\x3f\x54\x3a\xd9\x7c\xe8\x40\xf0\xb1\x87\x23\xce\x73\xab\x4c\x1b\xe0\xa8\xef\x6b\xde\x8f\xff\xd5\xf3\xc2\xe8\xd3\xb5\x65\xc7\xe8\x3f\xc7\xf9\xa9\x6b\xcd\x17\x82\x09\x0d\xfb\x1f\xde\x5d\x6f\xd9\x6f\x89\x18\xe9\xfa\x99\x00\xee\x6a\xd8\x12\x35\x8d\xe7\x3d\xd5\x84\x0a\xb4\xea\x7f\x33\xdf\x06\xf5\x87\xe4\x96\x82\xb5\x15\x1b\x35\x2d\x7d\x36\x92\x9d\x57\x4e\xac\x0f\x78\x34\xfd\xab\x52\x53\x48\x32\xcc\xad\xe6\xc1\x79\xf4\xa5\x5d\x6b\x9e\x26\x92\x08\x00\xb4\xea\xb7\x33\xe1\x9f\xc5\x39\xc1\x6d\xd7\x9c\x4a\xb3\x7c\xf4\x85\xdc\x0f\x15\xe8\x39\x0f\x3f\xbe\x44\xe3\x18\xe2\xfd\xb1\x8d\x03\x9f\x6f\xd3\x97\x2c\x63\xf1\x11\x19\xe3\x7f\xee\xa2\xbc\xc8\xd9\x77\x2f\x57\x90\xfd\xa8\xde\x1b\x28\xa0\x13\x6e\xd9\xb6\xed\xc6\x22\x07\xf7\x2f\xa8\x7f\xea\x1a\xf6\x85\x88\xc1\x40\x43\x01\x41\xbd\x85\x6f\x54\x03\x97\x95\x04\x89\xa1\xfd\xc3\x15\xbe\x0c\xe1\x37\x9d\x9b\x23\x2e\xc5\x25\xe3\x74\x76\x01\xa9\x04\xce\xb7\x07\x20\x23\xe8\x66\x46\xd2\xb0\xfd\xb3\x6a\x16\x7a\x94\x4f\x34\x51\x83\x0b\x01\x84\xc6\xb5\x8d\x32\xa0\xdc\x1a\x8e\x91\x65\xf7\x30\x48\x06\x5c\x61\x1a\x3d\x89\x42\x47\x81\x19\xf4\x54\xb7\x21\x8c\xfc\x23\x93\x1e\x33\x96\x70\xf1\x42\x4a\x77\x62\xbf\xab\x9b\xe9\x7f\xe1\xca\x83\xe1\x2c\x1b\x6f\xe5\xb7\x74\x9e\x35\x72\xed\xdf\x2c\xb0\x14\x8e\x13\x95\xbb\x58\xfd\x8d\x9b\xd8\x96\x87\xc7\x12\xe2\x50\x4e\x72\xf4\x96\x60\xd1\x59\xb2\xca\x33\xa6\xb8\x69\x2f\xa5\x0f\xcf\x13\x60\x90\xf7\x72\xb5\xdc\x7d\xf5\x24\x25\x82\x11\x7c\xe9\x78\xfe\xc4\xe1\xd9\xcd\xfc\x1b\x85\xa7\x3c\x0c\x5f\xc8\x33\x28\x68\x0a\x60\x14\xea\xbf\x97\x27\x4c\x05\xe1\xaf\x87\xb5\x94\xc3\x3d\x87\xde\x7c\x85\x97\x78\x9b\x21\x6a\x68\x70\x3e\x6c\xd7\xfb\x87\x91\xd0\x7d\x08\xe8\x44\x34\xed\xd9\x66\x69\x7c\x71\x28\xda\x9f\xc8\xe8\xea\xda\x7e\x9b\xf9\x20\x3b\x73\x2b\xad\xae\xef\xd9\x5d\x23\x45\x52\xa9\x54\x60\x64\xd4\x93\xdd\x85\x25\x65\x28\xf1\x7c\x5c\xaa\xaf\x60\x15\x8e\xaf\xc2\x2f\xb5\xa0\x27\x04\xd2\x29\xaf\xea\x10\x36\xec\xa5\x63\x98\x05\x40\xbb\x66\x5f\xc3\xfe\xf6\xe5\xe0\xb7\x50\x4b\xe3\xeb\x93\xc4\x4c\xb6\x61\xfb\x19\xa0\xdb\xae\x28\x24\x32\x82\xc8\x1c\xb4\x85\x08\xd6\xa7\x99\x0a\x13\xf1\x74\x0b\x3a\xac\x5e\x57\xce\x63\x60\xee\xd0\x8f\xb5\xad\x0e\x7d\x24\x3d\xc3\x38\x37\xc9\xb6\x2a\x70\xff\x76\xf6\x18\x1f\x3e\x75\xd5\xf8\x42\x10\xa1\xa1\x5e\x03\xcb\x3c\xd6\x56\x0e\x7e\x0c\x86\x36\x99\xd8\x2f\xf7\x98\x51\x39\x5a\x92\x8a\xc3\xf2\x0c\x15\xff\x00\x3d\xf4\x95\x0d\xd7\xa6\x98\x04\xa8\x3a\x93\x9c\x36\x84\x0b\x67\x39\x2a\xc0\x3b\x37\x79\x42\x6b\x11\x9f\x9d\x88\xa4\xf3\xc5\xb4\xd9\x2a\xfa\x98\x83\xa8\x76\xb0\x5b\x1e\x24\xde\xf1\x76\x10\xcb\x31\xa8\xbc\x88\xb0\xf9\xbc\x16\x48\xc6\x2f\x9d\x87\x5b\x2b\xbb\xe5\x77\x2b\x7b\xcd\xb3\xaa\x64\x6f\xa1\xd8\x02\x56\x61\xfe\x8a\x5c\x47\xf6\x33\x4f\x3f\x17\x46\xe4\xc9\x3f\x08\x9e\x3c\x0b\x4b\xb9\x6f\x0b\x7d\x36\xf4\x1c\x4e\xf5\x5b\x06\x15\x4b\x47\xf7\xbf\xd3\xf1\xa9\xab\xd1\x17\xa2\x8f\x09\x21\x05\x4e\x47\x8e\x89\x0b\xdd\x3d\x11\xd5\x30\xdc\x6d\xe3\x9e\x88\xaf\x35\xa7\x70\xc8\xfd\xc1\x68\xa6\x53\xca\x5d\x23\x77\xf5\xbc\xea\xbf\x8a\xc0\x09\x96\x77\xd2\x69\x2a\x0b\xc0\xad\xa5\x7b\x68\x94\xec\x56\x55\xcd\x45\xdd\xb5\x5e\x7e\x69\x41\x35\x55\x4a\xef\x9f\x63\x64\x51\x0b\x40\x95\x58\x7e\xd9\x18\xfb\xd4\x1d\xaf\x4b\x0e\x0a\xf3\xc1\x6c\xd1\x93\x85\x4e\x51\xbe\x6c\x44\x84\xea\xd9\x4c\x2d\x52\xf9\xb4\x01\x26\xa4\x3e\x42\x09\xd6\xe8\x70\xed\xbb\xfc\x40\xf0\xc7\x30\x9e\x67\xb0\xd9\x37\x7d\xf9\xeb\xcd\xa5\x34\x9f\xda\xef\xcf\xc5\x24\xef\x9a\x67\x00\x68\xe8\x8f\x78\xb1\xe5\x1f\x74\x2b\xb7\x19\xf3\x48\xcf\x2b\x1b\x9e\x8d\x47\xda\xc9\x0b\xbe\x36\xa6\xec\x0a\xe2\x2b\x93\xd7\xf2\x22\x02\xa0\xfe\x6a\x62\x08\x38\xe6\x66\x1e\x41\x2c\x68\xda\x46\x44\x1d\x0d\xc2\xae\xd8\x4d\x1e\xdc\x1f\x0a\xbe\xf4\xea\x4d\x45\x90\x6e\xfd\x05\xa0\x71\xd5\xcd\x05\x6f\xe3\x15\xb1\xec\xe9\xa2\x4c\x8b\x1c\xd6\x3a\x51\xff\xbc\x88\xec\x39\x54\x1e\xdd\xd0\x2c\x13\xa1\xa3\x6a\xf9\xf4\x2f\xb7\xf2\xe4\x65\x0e\x21\x25\x45\x07\x49\x6f\xc4\x94\xab\x86\xf3\x70\xe6\x96\x6b\x3d\x72\x62\x35\x0b\x07\xe5\xf2\x69\x82\x1d\xa3\xce\x0f\xf8\x4e\x8c\xe4\x5a\xad\xfe\xa5\xe0\xcf\x4e\x3a\x32\xf0\x18\x8e\x0e\x10\xaf\x03\x78\x0e\x8b\xeb\xff\x60\x92\xc6\x75\x5e\x6e\xce\x4b\xce\xaa\xbc\x6d\xf4\x9e\x97\xc4\x7c\x03\x4a\xfa\xcb\x98\x7c\x83\x33\xab\x62\xe0\x27\x65\xa4\xef\x8d\xa7\x25\x4e\xe3\x79\x3d\xe3\x1b\x9b\x9d\x28\x72\xc7\x60\xcd\x5e\xba\xeb\x01\x92\xfe\x7d\x82\x61\xa5\xb4\x34\xe8\xbc\xc6\x05\x18\x60\x2f\x71\xda\xb5\xcd\x2c\xb5\x8c\xf9\xeb\x0a\x5f\x6f\xe6\xb4\x4d\x9f\x35\x4c\xbe\x02\xf8\xe9\x8c\x67\x99\xf0\x11\x14\x04\xcf\xce\xd3\xa7\xa7\xa3\x5b\xd2\x0b\x07\xb8\x56\x37\x94\x74\x19\xdf\x20\xf7\x63\xaf\xb3\xe1\x92\xfc\x5b\x60\x4f\x79\x14\xbe\x10\x58\xdf\x58\xf0\xfa\x75\xde\x58\xc8\xae\x51\xed\xb8\x4e\xb3\x17\xbe\x48\x64\xeb\x7e\x2e\x13\x52\x2e\x16\x6d\x1d\x6d\x32\x87\x7d\x60\x5a\x8c\xd5\x03\x16\xca\xfd\x12\x88\xf7\xbc\x5c\x29\x81\xb6\xd8\x91\xc0\xdf\x18\x3b\x5f\x1b\x9d\xe9\x77\x9e\x91\xed\x6b\x2c\x99\xa4\xdc\x6b\xcc\x98\x06\x49\x8d\x3c\xbf\xc6\xeb\x48\xbe\xfe\x35\xa7\xc8\xd8\x0b\x2d\x64\x76\xfc\x5d\x42\xe3\x2b\x91\xd2\x81\xa8\xd6\x85\xc6\xa0\x1f\x20\x52\x07\x0d\xae\x9a\x49\xfd\x86\xef\xaa\x97\x7e\x17\x63\x71\x85\x41\x02\xb5\xa3\xaf\x7a\xf7\xa1\x88\xc8\x94\xd8\x17\xb7\xca\xf6\x25\x9a\xf9\xc0\x37\x88\x91\x9f\x2c\x31\xce\x8c\x39\x29\x32\x1b\x46\x52\x37\x9f\xdf\x7b\xa9\xbc\xc6\xc3\x6d\x6d\xf5\x13\x4f\x30\xb1\x94\x1c\xaf\xb3\x02\x27\x8c\xc9\x9d\xee\x94\x51\xb3\x8b\x28\x63\xf5\x7c\x58\x24\x36\x2f\xfa\x74\x7f\xd8\x64\xf2\xd0\xda\xef\x37\xb6\x68\xe4\x64\xa0\x3e\x98\xa3\x2e\x3f\x0d\x7b\x56\xb9\xea\xd9\x84\x3a\xf9\x8d\x6c\xb4\x22\x8a\x02\xea\x5d\xbe\x17\xcb\x2f\xbc\x8a\xa0\xe2\xd7\xc3\x82\x68\xe5\x2a\xff\xea\x56\x9f\x72\xc1\x7c\x45\x33\xa1\xa0\x7c\x1f\xa7\xf7\x3d\xba\x6c\x04\xf1\x1b\x0b\x8d\xde\xd5\xdf\x77\xde\x9b\xe7\xb4\x42\x41\xb1\x4d\xfa\xf4\x9d\xe2\x88\x28\xcb\x59\x4d\x1e\x15\x8d\x8f\xd3\x6b\x99\xc9\xbf\x4c\xf6\x4d\xc9\xca\x58\x17\x3b\x6d\xfb\x23\xea\xe4\x0b\x4e\x27\xbc\xd7\xa8\xdf\x96\x63\xe5\x4f\x28\xc6\xc6\xa5\xa7\x81\x35\x63\x2c\x5a\x6b\xdb\x5d\x7e\x4b\x81\x9c\xd7\x43\xde\x43\x60\x48\x0b\x3f\xdf\x5d\x2f\xd4\xbc\x24\x25\x49\xf7\x43\x52\x67\x25\x14\xe0\xb6\xfc\x0e\x11\x08\x9f\x40\x51\xe2\x73\xf0\x2a\x8d\x8f\x23\x96\xa9\xe0\x8e\xc7\x1c\x35\x38\x96\x8e\x08\x4a\x54\xc9\x9a\x08\x7c\x45\x79\xee\xfd\x3f\xaa\x59\x4f\xfd\x00\xd8\x17\xe2\x75\xf0\xf0\x90\xf8\x0a\xf0\x46\x61\xe8\x2e\x26\xa2\xcd\x12\xb8\xef\xcb\x05\x50\xcb\x97\x2e\x7b\xdf\x1f\x62\xf8\xcb\x0d\xe7\xc9\x22\x96\xf9\x9d\x21\x5a\xd7\x5e\x01\xd0\x15\x06\xab\x24\xba\xcf\x4a\x17\xfe\x8c\xcc\xe1\x78\x15\x63\x74\x65\x24\x62\x6a\xf2\x31\x54\x03\x22\x6f\xda\x06\x5d\x0d\xac\xe5\x81\xba\x1e\x17\x05\xf8\xf2\x1c\x7f\xe9\x2d\x02\x28\x3d\x03\x5c\x46\x9e\x19\x27\x6d\xe7\xcb\xd2\xe3\x13\x57\x0d\x58\x87\x46\x1e\x5c\x6f\x40\xf1\x77\x67\x4a\xa2\xf7\x5d\xfe\x3c\xb9\x81\x4e\x16\xcd\xe6\x43\x8a\x0f\x6c\xf7\x6a\x64\x69\x02\xdd\x82\xed\xab\x44\x8e\xbb\x3c\x30\x69\x45\xff\xca\xfe\x63\x89\x6c\x4c\x6b\xa0\x9b\xa9\xba\xd5\x3d\x76\xb2\xbb\xaa\xf0\x94\x46\xe1\x2f\x56\x8b\xe4\xde\x04\x4a\x7e\x4c\x30\x18\x84\x4b\x08\xbb\x3f\xe1\xf6\x60\xbf\x11\xa8\x74\x8b\xba\x9f\xf6\xa5\xea\x54\x8f\x26\x2b\x18\xfc\xcc\x1b\xc8\xfb\x7d\x59\xcb\x1f\x50\xce\x49\x44\xe5\xc5\x7c\x10\xb5\x6b\x84\x3e\x21\x10\x9e\x5c\xda\x76\x72\xd6\xfc\xc6\x84\x29\xf0\xfc\x23\x65\x1c\x96\x45\xd2\x9b\x52\x4b\x40\xe3\xc8\x4b\x23\xd2\xf9\xf5\xa4\x55\xae\x21\x3a\x86\xcf\x80\x64\xb7\x82\x67\x7b\xa1\xf2\xa8\x4b\x7e\x11\x7a\xc2\x54\x52\x96\xaf\x07\x30\xb3\xb4\x6e\xef\x09\xa8\x2f\x78\xc3\xd2\x04\x03\xfb\x11\x07\x57\xdb\x8a\x4a\x83\x76\x02\xd9\x16\x1d\x35\x4a\x37\x7e\x7c\x0c\xef\x06\x9e\x2e\xcd\x11\xbd\x02\x0e\x5f\x70\x48\x42\x89\x90\x96\x7f\x8f\xf2\x9b\x5d\xfc\xe8\x31\xcb\x7c\x91\xf4\x7b\xc5\xc9\xa8\xa5\xa0\x9f\xb3\x0d\x0c\x31\xd2\x15\xe2\x78\x31\x94\x48\x53\xef\x3b\x7f\x9f\xfb\xf1\x3d\x7f\x79\x8f\xff\x7c\x03\xbb\xe0\xfb\x2b\xb9\x16\x78\x4a\xcc\xc3\xce\xdc\xc7\xef\x5f\xa4\x44\x99\x1e\xa6\xab\x2e\x9e\x9c\x86\x20\xa8\xad\x40\x04\x0b\x06\xe2\xf7\x98\x83\xd8\x37\x5b\x85\x9c\x3e\xb3\x15\x47\x03\xca\x35\x97\x9f\x4c\xa3\x35\x6a\x56\xc5\x92\xd4\x5d\x6b\xa9\xff\x3e\xbc\xe2\x0d\x6b\x31\x8b\x2c\xd4\x57\x59\x5c\x92\x51\xc3\x14\x1d\x10\x07\xbf\x5f\x62\x90\x2f\xa2\xdf\x9c\xc5\xe6\xdf\xde\x4d\x2d\xc9\xaf\xb4\xc7\x71\xf7\xf5\x77\xf8\xae\x4a\xd8\xb8\x93\xa2\x6f\x6f\xb9\xd6\x35\x00\xbd\xba\x40\xaa\x1f\x77\x99\xa7\x90\x3e\xc7\xd5\x3e\x45\x28\xf5\x3e\xd0\x52\x5f\x0e\xd1\x3a\x90\x0e\x6e\xe6\xa7\x91\x85\x0f\xda\x07\xf5\xfe\xaf\x84\xac\x43\x25\xaa\x75\xbf\x3c\x98\x3f\x43\xc2\x46\xf4\x26\x40\x15\x1a\xcf\x6c\x14\x08\x3e\xda\x16\x7b\x66\xa8\x9d\x7f\x0a\x40\xcd\x43\x5d\xb1\x96\xe1\xdb\xa4\x19\x58\xcc\xdc\x3b\x2b\x42\x8c\xc2\x3f\xa5\x29\xb6\x95\x0a\xaa\x5c\x10\x06\xe8\x5f\xb4\x99\x03\xac\x35\xb9\x29\x8b\x3c\x11\x72\x99\x40\x57\x27\xd4\x20\xa2\x02\x39\x56\x5d\x05\x8a\x42\xf4\x69\x73\x95\x38\x3a\x0b\x6c\x42\x5f\x6f\x20\x1a\x32\x89\x11\x9d\x35\xe0\xb4\x8f\x5f\xb4\xb5\xff\xd5\x28\xff\xb1\x2f\xc3\x5d\xc0\xad\xf6\x59\x70\xb3\x2b\xcb\xb6\x1b\x3f\xfe\xa7\x73\xa0\x5a\xcb\xff\x2b\x1b\x76\x78\x96\x46\xc4\xba\x55\xac\xb8\xc3\x0a\xc7\x35\x8b\x97\xbc\x32\x12\x44\x00\xfb\x95\xd9\x9f\x8d\x68\x61\x3f\x60\xa5\xca\xb2\xdb\x49\xfe\xf9\x25\xd7\xb2\x64\x14\xe2\x73\xbe\xbd\xcb\x8a\xe2\x4e\xe4\x91\xdf\xfc\x02\xfd\xac\x91\xee\x59\x9a\xb0\x72\x22\xb0\x54\x08\x1a\x5b\x3a\x78\x3a\x63\x33\xa5\xbb\x3d\xf0\x0e\x65\x51\x35\xfd\xed\xf0\xe8\xd0\x10\x3c\x2d\x59\x62\x8b\x5a\xd1\x3b\x09\x80\xf4\xea\x05\x97\x03\xcc\xab\x4c\x66\x72\x31\xc9\x23\x1a\xb2\x88\x3b\x3d\x3a\x5b\x93\xd9\x5f\x4c\xed\x36\x6a\xa3\x4e\x85\x5e\xe6\x1f\xc0\x73\xb0\xef\xc3\x99\x32\x6c\x85\x0d\xba\x35\xa6\x52\x9b\xe7\xf6\xfb\xf7\xa8\x5b\x10\x0f\xfb\x98\x4f\xef\xee\x48\x6f\x0a\xe7\xc3\x18\x85\xc1\xb8\xf1\x23\x37\x0e\x7b\x10\xe5\x2b\x38\x92\xd4\x7e\x7e\x06\x38\x9d\xac\x96\x04\x54\x63\x5e\x3d\xce\xcc\xe2\xa9\xcf\xdd\x34\x48\x9e\x40\x26\x96\x28\xeb\x3a\x77\x43\xfa\xce\x38\x62\x4f\x17\x9a\xf7\x55\x4e\x55\xa8\xaa\x92\xf5\x9d\x39\xcf\x22\x9b\xb1\x0f\xf5\xcd\x31\xe8\x25\x7b\x34\xd3\x45\x8e\x59\xba\x7f\x3c\x12\xbb\x3f\x73\x5e\xe5\x8a\x8e\x20\xbb\x9d\xb3\x7b\x39\x4f\xb2\x87\xde\x8e\x38\xb7\x43\xdf\x03\x7c\xbf\x2d\xf6\x03\x39\x53\xbf\x54\x9d\xd9\x95\x51\x64\x0c\xe5\x78\xf0\xee\xa7\xc1\x15\xd5\xdb\x38\x34\xd5\xee\xea\x40\x6b\xc2\x3a\x40\xe4\x78\x40\x35\x99\x99\x72\x79\xa0\x4f\x98\x49\x87\x62\x35\xdf\x03\xa7\xba\x28\x19\x2f\x74\x6b\xee\xc8\x5c\xdb\x06\x11\xdf\x29\x50\xe1\x3f\xda\xec\x78\xdc\x8e\xcb\xc2\x5d\x1c\x49\x28\x94\xb5\x53\x8d\x4e\x69\x3a\xf8\xbf\x59\x61\x63\xf0\xd9\x05\x8d\x28\x29\x92\x20\xe8\xfb\x8f\xdf\xa7\x61\xd9\xa3\x51\x5b\x59\x08\xb8\xe7\x08\xf1\x6c\x97\xe2\x0c\x2c\x3a\x8e\x6f\x6b\x3d\x74\xfc\xac\xc8\xa9\xa1\x40\x5a\xde\x0d\xd4\xb5\x95\x46\x26\xf7\x29\x6e\x27\xb6\x2f\x2b\x11\x25\xcc\x41\xc8\x66\x5d\x9e\xf9\x63\xa1\x86\xd2\x5e\xd2\xcd\x32\xd0\xfb\x97\x7c\x03\x35\xb6\xe0\x15\xd2\x58\xa7\xee\x2c\x3d\xd9\xa9\xd9\x71\x4e\x50\xf2\x1c\xce\x42\x43\xa1\xf8\xef\xd1\x37\x25\x32\xe9\x3c\x3c\x07\xb8\x81\xe3\x8f\x84\xda\xe3\x75\x88\xc7\x03\x84\x7a\xb1\xae\xfa\x8b\x60\x5d\xd2\xea\xd9\xc7\x6b\x6f\x93\x79\xab\x4c\x55\x94\x19\x9e\xb5\x2e\x80\x8c\x64\x35\x91\x91\xe3\x3b\x91\xb6\xeb\xe6\xe2\x40\x47\x4a\x8f\xe4\xf8\x56\x7d\x21\xeb\x47\x9b\xbd\xc8\x45\x0a\xec\x49\xd8\x05\x21\xc8\xf1\x80\x85\xd3\x91\x42\x30\xa5\x9f\x5b\xa6\x9e\xd8\x1a\x15\x59\xd4\x71\x09\x94\x42\x37\x4f\x43\xe8\x56\xcd\x73\x38\x14\x28\x4b\xce\x7b\x6c\x54\xa1\x9a\x85\x33\x83\xc8\x39\xef\xa4\xc5\x40\xf5\xcb\x9b\xf4\xbd\xc8\x02\x69\x1d\xb5\x12\x8f\xba\x2b\x9d\xf1\x32\xef\xe1\x5f\xad\x8f\xc8\x93\xcc\x35\xc3\x70\x42\x35\x8f\x15\x05\xcb\x9a\x8e\xc4\x34\x12\xbd\xcb\x94\xde\x5b\x8b\xdf\x52\x99\x9f\x2d\x60\x5e\xb7\xeb\xa0\x01\x53\xca\x4c\x67\x4a\xfb\xdd\x42\x31\xb7\xaa\x5d\xfe\x76\xfc\x20\x6b\xb8\x4d\x07\xe6\x25\x64\x18\xa3\xf6\x52\x22\x97\x28\xf5\x86\x15\xdc\x52\x97\x99\x14\x2f\x84\x48\x82\x57\x47\x49\x09\xd2\x58\x78\x2e\xf6\xca\x6a\xeb\x15\xd5\x42\xab\x27\xf0\x4b\x91\xd5\x12\x96\x91\x00\x9b\xdc\x8e\xf1\x9a\xec\x25\x2c\x83\xa1\x3e\x61\x98\xd8\xb1\x17\x4f\xb2\x35\x33\x50\xc5\x7d\x58\xe4\xf8\x4a\x80\x8f\x8e\x5d\xf5\x09\x20\x58\x65\xa6\x28\x4b\xd9\x85\x31\x8c\x5a\x48\x0e\xb5\xab\x15\xdc\x1c\xc1\xb4\x60\x76\xa1\x3a\x94\x47\xa0\xe6\xf5\x2f\x68\x18\xa9\x7e\x07\x5e\xc4\xf8\x24\x53\x32\x86\x8f\x3f\xf9\xbd\xdc\x1d\xa4\x6d\x85\x6c\xce\x39\xa3\xda\x50\xa8\xba\x93\x05\xb9\xbb\xde\x89\xcf\xa1\x21\x82\x81\xe7\xe2\x22\x2b\x42\xa5\x8e\xf9\x3e\xe9\x42\xce\x84\x49\xd3\xe1\xd0\x5d\xf3\xab\x9d\x91\xd7\x97\xb3\x83\x69\x09\x8b\x43\xfc\xe0\x8f\x5a\x13\xff\x46\xa7\x8d\xc1\x85\x25\xa2\x42\x73\x8f\xdb\x4b\x10\x4d\x54\xd0\x59\x9f\x9d\x7f\xd3\xf5\x50\xb6\x39\x2f\xc8\xfd\xec\xd7\x03\xe4\x81\xc7\x6d\x69\x92\x30\xe9\x13\xdb\x2b\x73\x07\x7f\xb0\x5f\x78\x30\xf6\x1b\x10\x91\xbc\xc7\xf9\x10\x88\xc7\x8c\x6e\xa9\x1f\xa0\x0c\xae\xe8\xfd\x6a\x1d\x3a\xc1\xdd\x0d\xa3\xce\xef\x5c\xf6\x03\x67\xf7\x1a\xcb\xd8\x45\xe9\xee\x1c\xb0\xce\x54\x9e\x38\x78\xdb\x29\x36\xed\x00\xf4\x40\x4d\x97\x83\x75\x10\x1f\x85\xc8\xff\xa0\xb3\x78\xbb\x1d\x06\xdd\xa8\x7d\x4e\xbd\x36\x35\x06\x8d\x43\xbb\x2e\xf6\xad\xef\xc3\x63\x57\x39\x49\x63\x6e\xcc\x5c\x58\x9b\x6e\x84\xe4\x13\x6e\xaf\x63\xc3\xa0\x59\xa5\xa2\x50\xb0\x12\x33\x08\xb7\xeb\x1a\x79\x23\x64\x4b\x1e\xbb\x2a\x8b\x7b\xd6\xbd\x4c\x1a\x5a\xf1\xa2\xb5\x86\x75\x82\xe4\xed\x6c\x34\x61\x15\x81\xc5\x97\xe6\x4e\x9a\xa2\xaf\xbb\x8d\xd2\xb3\xbb\xff\xe2\xde\xa7\xdc\x09\x5f\x08\x0c\x3e\x22\x18\xfd\x37\x6b\x6b\xf7\x54\x44\xf8\x56\xa1\x3a\xab\xa7\xf7\xc7\x89\x11\x4f\x4e\x22\xc9\x4d\x14\x3a\x1b\x48\x98\xd9\xaa\x40\xd9\x34\x13\x00\x93\x80\xef\x1f\x59\x27\xac\xad\xc1\x14\x9b\x94\x15\x32\x24\x9f\x49\x6f\xd3\xe8\xfa\x76\x7b\xa9\x2b\x54\x2e\x7b\x93\x7f\x55\x58\x0d\x14\xa7\x3d\xff\x64\x8c\xb6\xaa\x4c\xb9\xf5\x7b\xfc\xd7\xcf\xcc\x61\x3d\xe9\x5a\xba\xbe\xc6\xd5\xf6\xf1\x9e\xfc\xab\x10\xc6\x1f\xf6\x95\xf1\x60\xce\x26\x94\xa2\x88\x2b\x26\xea\x6f\x7b\xbb\xcf\xc2\x82\x95\xd6\x9b\x09\x94\x85\x69\x4e\x29\xec\x18\x3f\xfc\x4d\xb4\x39\x28\xcd\x7d\x00\xba\x8e\xf6\xe3\xe7\x8b\xbf\xf2\x37\xdf\xeb\x7b\x4a\x5a\x94\x82\x37\x88\x86\x43\x7f\x0a\xef\x47\xa4\xc6\xdf\xf7\x2a\x5c\x6d\x0b\xd6\xfe\x1b\x85\x27\x3d\x25\x88\x02\x8c\x37\x48\x6c\x38\x8a\x68\xed\xd2\xaf\xe0\xfa\x5d\xfb\xa1\x6a\xb7\xc0\x1a\x76\xcf\xcd\xdf\x35\xfe\x8c\xee\xe1\x90\x69\xf8\xa0\xa3\x7f\x48\x4a\x05\xe8\x04\x67\x3f\xdd\xf2\x5f\x9b\x19\xb2\xe2\x5c\x85\x9d\x5f\x7b\x30\x58\x6f\x11\xff\x74\xa2\xce\xea\xf9\x11\x96\x5c\x53\xb7\x94\x7c\x05\xdf\xbd\xe1\x07\x6a\x04\x5b\x94\x75\x44\xa4\xdd\x17\x2c\xbb\xb1\xae\x31\xa7\x36\x74\x3b\xd8\x99\xfc\x04\x19\x95\x8e\x14\xe1\x6f\xcb\xc0\x27\xe7\xfd\x2f\xde\x4a\x12\xbd\xbc\x3e\x32\x86\x9a\x2e\x5b\x51\xef\x97\x8d\x5b\x11\xa7\x25\x74\x3f\xe8\x59\xc1\x8a\xf9\x55\x88\x63\x8d\x80\x65\x43\x9b\x81\xec\x75\x51\x25\x28\x5b\x81\x8c\xaf\x79\xec\xb2\x77\x02\xcd\xb5\x9f\x07\xa7\xaa\xbe\x35\x1d\x44\x98\xba\x56\xc2\x13\xf8\xc7\xa3\x7f\xd2\x61\x11\x45\x86\x12\x02\xa2\xb8\xe4\x17\x8d\x94\x6b\x66\xe5\x3d\xc8\x79\xc7\xb6\xa8\x68\x99\x43\xc9\xc4\x9a\x84\x17\x35\x5f\xef\xfb\xf4\xb6\x3d\x8e\x39\x50\x1e\x80\x3e\x24\x56\x73\x22\x8c\x3c\x38\x6f\x85\xea\xf0\x24\x38\xc5\x05\xb0\x59\x4b\xac\x2d\xdf\xda\x5c\x44\x0e\x38\xa6\x22\x05\x6f\x84\xf8\x03\x50\xe1\xe1\xfc\x91\xd7\x3b\x0b\x1d\x22\x46\xe1\xf7\x13\x50\x99\x26\x6d\xdc\x47\x65\xaa\xce\xa7\xe4\xc6\xf1\x65\x6c\xf5\x1c\x7b\x60\x05\x26\x2f\xa3\x6c\xb2\x99\x62\x36\x6b\x8a\x28\xf7\x4d\x2a\x25\x5f\x26\x7c\xf6\xa0\x52\xe2\x9a\x28\x4d\x6e\xbd\x1e\x86\x1f\xfe\x37\xf5\x7f\x79\x8d\xa7\x5c\x21\x5f\x88\xbf\x37\x0c\x98\xbe\x23\xfc\xeb\x16\xcb\xf8\x59\xce\xa5\x5a\x6c\x19\xda\x28\xc3\x5b\x60\xf7\x4e\xb8\x8d\xc5\x4a\x2d\x9e\xb0\x70\x69\xc4\x6a\x76\x0c\x14\xee\x1e\x55\xea\x7c\xb9\xf6\x87\x80\x14\x9d\x53\x63\x42\x57\x21\x2c\x7d\xa2\xf2\x18\x3b\xa3\xbf\x49\x71\xb1\x8d\x29\xe5\x92\xc2\x11\x7c\xcc\x76\x2a\x4d\x1c\xab\x87\x37\x0d\x2d\x82\xbc\xdc\xfc\xd3\xd1\xf8\x07\xdd\x96\x9e\x2e\x9a\x14\x39\x67\xf4\xa6\x90\x9c\x4c\xa6\xdb\x13\x80\xea\xac\x1c\x7e\xae\x4c\x31\xa9\x55\xd8\xc6\xc7\xa8\x68\x1f\x42\xa5\x73\x3e\xd2\xb1\xe3\xd7\x7e\xa8\x38\x14\xac\x42\xf2\x47\xd4\xfb\x17\x7b\x3f\xe5\xba\xf9\x42\x10\xbd\xa1\x24\x01\xd3\xfa\xbf\xc9\x30\x6f\xa7\xff\x2d\xab\xf9\x65\xa7\xf7\x25\x74\x4f\x33\x0f\x26\xfd\x26\xba\xe4\x8f\x51\x65\x07\x2b\xcc\x5b\xa2\x72\x50\xfb\x7f\xb0\x99\x14\xdf\xd2\x8d\x3b\x9e\x63\x91\x9b\x05\x69\xd3\x92\xff\x9e\xc7\xe4\xf9\xf9\x27\xf5\x72\x66\xa4\x17\x3d\x44\x0e\x14\xa0\x70\x96\x2d\x2c\x9f\x3d\xea\x76\x10\x3b\xd6\xac\x6b\x81\xff\xee\x06\xcc\x01\x7d\xab\x23\xcf\xb0\x00\x02\xec\xa6\x40\x24\xcd\xcc\x5d\x00\x70\xe0\xce\x45\x92\xb6\xdd\x37\xde\x27\x21\xba\x0b\xa4\x94\xcc\x9f\xcb\xa1\xdc\x29\x21\xe7\x2a\xbc\xf9\xfe\x25\xa6\x86\x4c\x2e\x79\x20\xf2\xf1\x14\x3b\xc2\x11\x09\x7b\xe5\x1e\x31\x9d\x0c\xc7\xb1\x1c\xe5\xbc\x38\xa6\xda\x85\x9c\xd3\xb5\x8c\xd5\x8a\xad\x33\x19\x98\x3f\x13\x1e\xf3\x6f\xff\x3e\xe5\x94\xfa\x42\x84\xc8\xa8\xc1\x53\x2c\x83\xed\xca\xbc\x71\xcb\x56\xc8\xcb\xdd\xca\x2e\x1d\x8f\x86\x9e\xd0\xe9\xd5\x85\xe0\xed\x8c\x24\x63\x13\x5e\xa2\xa8\x50\x87\x1e\x60\x19\x9e\x3f\xdb\xc3\xae\x9f\xd5\x97\x24\x8e\xb3\x36\x0f\x3d\x16\x3c\x61\x9e\x75\x5f\x1f\xa8\xb5\xc5\x3f\x51\x6a\xee\x78\x87\xcd\xe0\x8f\x73\x14\xf6\x12\xd0\x75\x8f\x0d\xfa\x5e\xb4\x7b\x59\xaa\xba\xcd\xca\xbe\xfc\x75\xaf\xc4\xb9\x77\x4c\xce\xb8\x30\xcd\xce\x35\x2b\x4f\x06\x40\xeb\xcb\xe6\x3a\x9c\x7f\xe1\x40\x5e\x1d\xe7\xd8\x90\x72\x89\xe4\x44\xbd\x32\x3a\x2a\x9e\x5a\x8f\x44\x8d\x6c\xd7\x13\x92\xb4\x02\xb9\xea\xa9\x8b\xef\x30\x3a\xfc\x7e\xdb\xda\x29\xe4\xf8\xec\xcb\x95\x1a\xb3\x66\x54\x1c\xf6\xf7\x0d\x93\x2a\xda\x3b\x58\x0d\xb9\xc5\x3d\xfb\xb7\x7f\x9f\xf2\xb7\x7d\x45\x61\xa1\xcc\x81\x95\x60\xcc\xf1\x53\xf4\xcc\x91\xaf\x8a\xb6\xd0\xa2\xbe\x33\x57\xf6\x34\x50\x23\xf1\x6a\x70\xdd\x45\x6a\xa7\xe0\x77\x08\xf5\x88\x2d\x98\xa3\xae\xa9\x71\xc5\xa3\x50\xd8\xa6\xd7\x4d\x0e\xf5\x08\x15\xc8\x15\xbf\x35\x0e\x31\xb8\x8c\xde\xfb\xee\x40\xc4\x05\x49\x77\xac\x06\xff\xa1\xc6\xcb\xc4\x77\xf4\x49\x38\x7a\xbf\x00\x71\x5c\x72\x8e\xdc\x36\xe7\xd4\x3f\xbb\x62\x27\xb5\xfe\x23\x56\x6c\xcf\xe6\x1f\xd6\x76\x1e\x30\xdb\x39\x88\x65\x69\x10\x5f\xbc\xf7\x13\xce\x47\xe4\x8d\x59\x6b\x14\x43\x34\xc1\xca\xa5\x0d\x7c\x98\x59\x79\x38\x65\x89\xed\x96\xf4\x3f\x9d\xaf\x27\xfd\x43\x48\x30\x14\xd4\x12\x30\xbf\x7e\xa1\x34\x8d\x84\xba\x5b\xa7\xc7\x63\xd7\xe5\xf8\x5b\xdb\xac\xc5\xac\x96\x35\x0c\x48\x25\xe3\xde\x6c\x79\x67\x1e\x8e\xfb\x2d\x40\x27\xee\x45\x11\xa7\x57\x4a\x4d\x3f\xe6\x3a\x11\xd4\xff\xac\x55\xcc\xe3\xbd\xfe\x30\xca\x42\x6a\x1c\xb9\x64\x75\x53\x59\xef\xdf\x48\x03\xac\x5c\x38\x66\xcc\x06\x4e\xf5\xf7\xd9\x8e\xfe\xad\xc1\x0a\x48\x02\xdd\x32\x5f\xca\x1d\x2b\xff\x8c\x2b\x1f\xb2\x79\x6a\xb4\xec\x4f\x1d\x3f\xae\xdc\x21\xe6\x04\x96\x7b\x1c\x2b\x6c\xa7\x36\x9d\xa5\xa5\x81\xaa\xc6\x40\x81\x05\x51\xd1\x11\xa1\x18\xe5\x9a\xc8\xaa\x9f\xbb\x22\x20\x63\x84\xfa\x79\x58\xfd\xe0\xf8\x04\x16\x51\xeb\x6f\x44\x65\x24\xf2\x91\xab\x72\x53\xa8\x4d\x49\xca\xd3\xce\x03\x9a\x73\x9d\x70\x29\x3b\x90\x06\xb2\x27\x7b\x91\xb5\x2c\x80\x9c\x5c\x40\x2b\xc8\xa1\x73\xf6\xfe\xe0\x41\xa2\x87\xfd\x48\x5d\xfd\x44\xa1\xae\x1c\xf3\xf4\x0a\xea\xdf\x4a\x78\xca\xfb\xf0\x85\xc0\x40\xff\xe7\x67\x1c\xe1\x27\xc7\xb8\xcd\x0b\x09\x47\x36\x1f\xea\x1d\x24\x07\xbc\xfa\xdb\xf0\xea\x2c\x03\xa1\xcf\xf2\xbf\xe8\x0a\xa8\x5c\x28\xd6\x80\x75\x4e\x47\x43\x67\x4b\xb5\x46\x7b\x9a\x56\x1b\x4e\xc7\x8a\x63\x6c\x52\xb6\x11\xfe\x34\x22\xf4\xa7\xfd\x94\x28\xe1\x01\xd3\x91\x44\x93\x20\x27\x37\xec\x9a\x39\x8b\x3a\x37\x56\x19\x61\xc3\xa0\x63\x2f\x15\xdd\x05\x3b\x5d\x75\xec\xe6\x93\xaf\x99\x89\xe8\x72\x2c\x97\x0f\xf0\x1b\xb5\xbf\x9e\x5b\x44\x3c\xbf\x59\xb1\x4e\x5c\x84\x8d\xe2\x70\xe0\x22\xfd\xcc\xb6\xc4\x45\x94\x1b\x02\xe4\xa6\x7b\x56\x43\x3e\xa2\x2c\xfc\xfb\xc5\xe6\x93\xce\x92\x28\x2c\x9e\x30\xf0\x53\x16\x0a\x2e\xb5\x46\x33\xf7\x11\xf1\xf3\x20\x8d\x29\xa5\x48\x49\xcf\xe2\x39\x69\x75\xe5\xd7\x4e\x2f\xa6\x85\xb4\x7e\x0f\xb9\x20\x41\x3d\x76\xa1\xe8\x6b\xb7\x76\xd6\x7a\xac\x9d\x67\xdf\x36\x4b\x61\x2d\x82\x86\xeb\xd2\x0a\x54\x19\x81\x4a\x45\xe3\x87\x5e\xf2\x06\x32\x37\xb0\xea\x0f\x57\x62\xb6\x8a\xdd\xbe\x72\x59\x1a\xdf\xe3\x7e\xc3\xce\xb2\xa3\x64\x76\x66\x7a\xb2\xcf\x87\x5e\xe3\x76\x5f\x79\x7b\xbe\x08\xa4\xad\x16\x18\x35\x7d\x4a\x98\x6f\x71\x8f\x6d\x88\x4f\x38\xaf\xe1\x46\x5e\x66\xc6\x22\x53\x62\xa7\x54\x6b\xbe\x19\x29\x21\x09\xcf\x9d\x03\xa0\x11\x16\x52\x61\x8a\x2a\x2f\xb8\xda\xf6\xbf\x65\xf8\xb8\x20\xa1\x9c\xf4\x68\x6c\xac\xcb\x1f\x25\xb8\xe8\x9b\xb0\x78\x68\x7f\x07\xf3\xbd\xdc\xcb\x8b\x6b\xad\xe6\x6c\x9a\x8e\x08\x69\x10\x76\x1c\xb8\xe7\x86\xbf\x82\xb6\x8f\xa1\xe3\x32\x4d\x86\xc7\xb2\x8a\x6b\x17\x35\xce\x8b\xfe\x27\xc1\x84\x13\x7d\x8e\x42\x02\xcb\x79\xe2\xb8\x67\x93\xf8\xbe\x90\xf6\xae\x20\xfd\xa6\xde\x37\x80\x97\xfe\xf8\xfd\xc0\xae\xfb\xcf\xa8\xb4\xff\xc7\x8a\xba\x48\x24\x79\x1c\x30\x58\xa2\x41\x5d\xf8\xc9\xc5\xf5\xab\x40\x74\xa5\x09\x9b\x6f\x15\x2e\xeb\xac\x12\x88\x44\x06\x51\xd6\x7a\xce\xce\x45\xed\x7f\x60\x80\x00\x33\xb1\x0e\xbf\x73\x26\x5e\x96\xfe\x4d\x70\xa9\xa7\x70\x47\x8a\x4c\xce\x4f\x92\x94\x80\x1d\x28\x8e\x34\x9a\xd4\xc5\x8a\x55\xd0\x1d\xff\xfd\x86\x47\x62\xd4\x7f\xe4\x00\xf5\x60\xfb\xb7\xdb\x05\xab\x4b\x2b\x5e\x60\x62\x6f\xcb\xf5\xa4\xa0\x7b\xba\x0f\x8f\xce\x3b\x30\x33\x1b\xf4\x5d\xa7\x7f\xbd\xff\x21\xc1\x26\xd4\xfb\x87\x38\x4a\x15\xe5\xd9\xc7\x29\x33\x05\xfa\xcb\x75\x47\xf7\x10\x89\x28\xad\x02\x9c\xc7\xef\x1f\x44\x54\x69\x94\x30\xcb\x36\xa6\x0f\x93\x5f\x26\x90\xb5\xfc\xe5\xbe\xe7\x6a\xd3\xc2\xa4\x27\xb6\xe2\x25\xc6\xa3\xd7\x48\xe7\x00\xdd\x71\x09\x0f\x13\x94\xd3\x60\xd6\xac\xef\x9c\xee\x48\xfb\xd5\x1a\xe1\x70\x06\xa3\x23\xf4\x5f\x07\x78\x62\x4a\xf7\x32\x86\x14\x66\x26\x41\xc1\x5d\x9d\x28\xcd\xfb\x91\x11\x02\x09\xc4\xab\x00\x1b\xea\xbd\x12\x0e\xf5\xf5\x72\x7c\xd6\xb8\xeb\x8f\x93\x82\xe4\x91\x2c\x15\x7b\x8f\x56\xa9\xeb\xa9\x4d\x27\x14\x4a\xeb\xe1\x61\xca\xd5\xe3\x2f\xc0\xda\x07\xd9\x6c\x87\xd7\x7f\xf2\xb5\x56\x19\xa1\xc5\xf4\x51\x2e\x02\xeb\x4d\x5c\xc5\xd9\x4b\x5b\xbc\xe0\xde\x71\xef\xd5\x20\x59\x70\x2c\x91\x06\x96\xac\xbb\x6b\x72\x18\xe6\xb8\x67\xf2\xbc\x7c\xbf\x03\x25\x07\x90\x6d\xf6\x5d\x0c\x38\x14\x5c\x3e\x07\x56\xdd\x7c\xd4\x33\x2a\x12\x88\x56\xf5\x4c\xfb\x6e\x45\xe0\xb6\x7a\x67\x32\x57\xea\xc7\xfa\x11\x88\xb1\xa0\x6a\xde\x3d\x9f\x88\x5d\x52\xeb\x18\xbb\x59\xc6\x47\xb1\x69\xc7\x9b\x59\x1e\x8a\xf7\x77\xb6\x5f\x97\x50\x0a\x6a\xdd\xe8\x5e\x7d\x6c\x14\xaa\xdd\xc5\xf8\x85\x8a\xda\xf7\x2b\x2e\xf1\x7d\x5b\x58\xf7\x91\xad\x37\x5c\xb3\x05\xc4\xeb\x3e\x03\x3a\xe9\x05\x7e\x5f\xd5\x01\x65\x76\xfc\xbb\xf5\x72\x64\x6a\x6b\xd5\x38\x0e\x0e\x3a\xee\x0f\xf5\x32\x51\x68\xb9\x6d\x0f\xcf\xac\xc2\x2a\xbd\x23\x2c\xf3\x07\x4b\xc0\xf7\x89\x12\x72\xf4\xb0\x90\x4f\x13\x16\x47\x8e\xd6\x74\x9a\x94\x68\xbe\x4d\xb8\x8d\xb0\x8b\xec\x05\x77\x67\xd3\xf0\x8c\x6a\x71\x55\x20\x23\x9b\x7c\x91\xe6\x8f\x16\xde\x40\xc4\x4f\x15\x7d\x14\x04\xaa\x1b\x75\xf1\x77\x4a\xeb\x49\x31\xb4\x83\xf3\x1f\xa2\x33\x1a\xb1\xc9\x01\x46\xb6\x02\xb1\x5b\x59\xfa\x9e\xba\x23\x9e\x23\xca\x3c\x6f\x05\x1e\x76\x66\xb1\xf0\x68\x17\xdb\x43\x82\xb4\xb1\xd7\xab\x58\x67\x2d\xb0\xd8\x0f\x52\x80\x13\xaf\x5b\x82\x5a\x11\x6a\x9e\xd4\x50\x67\xd2\xb9\xa0\xc7\xd7\xa8\x02\x9b\xcf\x3c\xfa\xe0\xc1\x7a\xbf\x29\x82\xd7\x0b\xa6\x82\x7e\x64\x88\xa6\x46\x06\xaa\xa3\x63\x48\xef\x2d\xcb\x0a\x87\x45\x33\xa0\xbf\xad\x84\xb5\xb4\x85\xed\x48\x4d\x18\x47\x03\x5d\x70\xa3\xd7\xfc\x08\x59\x6e\xa9\xf2\x32\x0a\x36\x77\x28\x1b\x07\xb8\x51\xa8\x4a\x77\xbe\x7f\x79\x95\xde\x99\x0f\xe8\xe0\x20\xbe\x59\x05\x86\xdf\x91\x85\x67\x2d\x06\x3b\x49\x38\x88\xd2\xb9\x11\x89\xc4\x50\x41\x0c\xd7\x82\xc6\xc2\x30\x5e\xce\x35\x7e\x54\xf8\xb6\x4d\xf8\x0a\xa8\x75\xc4\x66\x99\x3d\xda\xb1\xb8\xa3\xb2\xe9\xa0\x66\x26\x3c\xf7\xfd\x43\x6f\xe0\xce\x7a\xcb\x64\x3d\x54\x17\x53\x6f\xcd\x85\x01\x90\x92\xce\x89\xe2\xb6\xa6\xe0\xa5\xa8\x19\xd0\x2f\x5e\x14\xc2\x46\xda\x22\xa3\x30\xc3\x51\xad\x92\xfa\x0f\x77\x3b\xfe\x19\x4a\x58\xcc\x04\xcc\x57\x95\x66\x3c\x41\x65\x26\x79\x7f\xe0\xdb\x9a\xdc\xc5\x8a\x0d\x89\xa7\x10\x64\xe1\xbc\x67\x4b\xc5\xe9\x79\xc0\x46\xd7\x23\x7f\x0f\x10\xfd\x38\x50\x85\x70\xd5\xfc\x28\xc6\x7f\x2c\xcb\x7f\x25\xe5\x14\x35\xb3\xec\xff\x66\x48\x65\x00\xb5\xc4\x1f\x93\xa7\x18\x46\x5f\x05\xd8\x84\xff\x06\x5f\x06\x7d\x9a\x47\xb0\x46\xdd\x8b\x53\x35\x3f\x60\xcc\xcf\x33\x90\x20\xc5\xe6\x23\x7a\xb6\x6a\x03\xc2\xc3\x7b\x67\x07\x40\xec\x3f\xed\x74\x7f\xba\xf3\x5a\xc3\xf2\xc7\xea\xb4\x36\xb6\x48\x54\x87\x55\x6c\x1f\x69\x38\x8b\x96\x07\x1e\xa1\x78\x6a\xc5\x09\x70\xb6\x6f\xed\xf6\x59\xd6\x36\xe3\xa9\x1d\x59\xe7\x50\xc3\x8f\x08\x15\x88\x4f\x6d\x1d\x4f\x67\xf8\xb3\x38\x0d\xe5\xb4\x4a\xd5\x25\x81\x0a\x21\xaa\x41\xa2\x19\x0c\x0a\x0b\xa6\x72\xf6\x13\x43\xf9\xc8\x2e\xb8\x5e\x21\xd9\xa1\xbf\x4b\x09\x7e\x71\x0a\xa6\x8d\xbc\x6a\x9b\xa7\x03\xa0\xd8\xd7\x22\x43\xbd\x3e\xa7\x8a\xb2\xbc\xfd\x39\x49\x2f\x13\x64\x5f\x1f\x5c\xe9\xeb\xe4\xd3\xad\x06\x40\xcb\x74\x43\xa3\xf0\xfb\x83\xbb\xff\xbe\x34\xf0\x50\x03\x5a\x7a\xdc\x4c\xc7\x18\x45\x2a\x47\x2b\xc5\x14\xf1\x20\xf3\x45\x4a\x72\x5b\xb6\x99\x62\x6f\x11\x01\x64\x0d\x78\x93\x11\x46\x2f\x91\x3e\x17\xed\x8b\x21\x2a\x08\x75\x45\x5e\x38\x47\x26\x37\xa9\xef\xbf\x70\x0e\xe7\x75\x36\x47\x97\xdd\x29\x72\x06\x5b\x8d\x8d\xf1\x7a\x39\xdb\x18\x6c\x96\xc7\xb0\x07\xd3\x16\x70\xe5\xa2\xd9\xd9\x51\x32\xbd\x4a\x1b\xbe\xab\x2d\xb9\x9c\x24\xb8\x6b\xfa\x38\x55\xdc\x39\x5c\x31\x28\x1b\x7f\x0d\x3e\xb3\xd2\x89\x41\xd7\x08\xf9\xf0\xd9\xdf\x71\xea\xa7\xd9\x39\x0c\xed\x31\xef\xf0\xbd\xc1\xb4\x7d\x1c\xab\xa9\xbb\x7c\x5b\x12\x3e\x7f\xc2\xf6\xfe\xeb\xa5\x1a\xb1\x2e\xce\x07\x78\x45\xac\x16\xcc\x5f\x8d\x8d\x1d\x7b\x47\x57\x5f\x72\x1f\xc0\xef\x8b\xa1\x8c\x5b\xbc\x43\x6e\xaa\xd3\xd7\xc8\xd1\xa6\x60\xd4\xdd\x7e\x80\x3d\x5e\xe1\x85\xe0\xf4\x0a\xfb\x43\x55\x42\xfb\x55\xa3\x3c\xce\x2a\xb4\xc9\x44\x02\x71\x27\x9c\xf9\x17\x95\x08\x28\x37\x52\x94\xc8\xdf\xef\xa8\x9e\xa3\x5a\x20\x3e\x2f\x5a\x4f\x29\xef\xdc\xe6\x06\x6a\xc8\x84\xd6\x36\x8f\x07\xd8\x14\xb4\xec\xb9\x3a\x04\x97\x04\xdf\xf2\xb5\x95\x29\xfc\xa9\x49\xab\x62\x31\x17\x65\xd1\x23\xec\xd4\x02\x32\x61\xca\x0b\xcf\xdd\xca\xcb\x4d\xf0\xab\x39\x8a\x91\x7c\x28\x64\xa8\xe5\x3f\x45\x0f\x2d\x20\xb8\x96\x35\xe9\x9f\xd5\xf1\x7e\x26\x87\x06\x7b\xfa\x49\x61\xc1\xa4\x8a\x35\x70\x4c\xbf\xe2\xb0\x09\xc3\xd2\xb3\xbe\x52\x45\xc3\x52\xb6\x44\x66\x87\xec\x9d\x5c\xa4\xb2\xa9\xa0\xf3\x63\x4f\xb9\x4c\xe0\xeb\x44\xe3\xa9\xef\xc5\xd3\xf7\x57\xe3\x7e\x9f\xe2\xf9\x61\x31\x4a\xd1\x10\xd5\x8c\xcd\xa4\x34\x30\x3b\x64\x3d\x4c\x01\xab\xca\xb7\xad\xaf\xac\x6d\xdb\xca\x06\x1f\xf1\x41\x57\x02\xdf\x85\x3e\xb6\xd6\x91\xd8\x75\x32\x72\x1c\x4e\xc5\x62\xde\x9b\xb7\x08\xc8\x99\x6b\x26\xa6\x9b\x40\x74\x1c\x79\x5b\xf9\x2b\x33\x0d\xb2\x2f\xdc\x52\xf2\xf3\x5c\x90\x4f\x8e\x77\xa2\xee\xaf\x9e\x3b\xc8\xa7\x00\x7b\x4a\x77\x9d\x45\xe4\xcd\xd6\xee\xf3\x61\x37\x31\x51\x81\x01\x02\xeb\x98\x4f\xef\xb1\x21\x44\x70\x1f\x3a\xd6\x7a\x34\x04\x19\x77\xcc\x01\xd1\x3c\xc5\xc0\x05\xac\x02\x88\x9c\x00\xcd\xe2\x54\x86\x22\x8a\x9e\xba\x50\x50\x69\x89\x3c\x72\xd9\x97\x3e\x53\xfe\x73\x07\xf1\x13\xa0\x51\x19\xc1\x39\xa4\x6c\xfc\x83\x50\x22\x46\xd5\x4f\x0a\x85\x49\x19\x3b\xc9\x1d\x95\x87\x27\x21\xc9\x9e\x36\x13\x32\x7e\xee\xca\x40\x4f\x8d\x5a\x23\x0b\x4c\x6c\x8c\xc6\x56\x82\xb7\x3d\x28\x16\x35\xa5\x98\xb5\x3a\x1d\x57\x94\x94\x47\x49\x1a\xe5\x38\xdf\x8d\xb9\xd4\x03\x8d\xb2\xfe\xa2\xe1\xc1\x75\x63\x46\xb1\x4e\x5a\x54\x65\x33\x08\x18\xa0\x2f\x1f\xe1\xd4\x19\x62\xce\xc3\xd4\x61\xdc\x65\xa8\x37\x07\x4a\x3d\x43\x03\x5f\x9d\x25\x04\xf0\xf7\x64\xfc\xe8\x91\xc4\x17\x44\xc8\xa5\xd3\xfa\xe2\x23\xc9\x5a\xf6\xfc\x40\x29\x38\x28\x74\xd4\xfd\x3f\x92\x89\xd7\xf3\xc5\x70\x5d\x0e\x32\x28\x09\xb0\x4a\x0b\x07\x0e\xc5\xa3\xaa\x2b\x8b\x3d\x32\x69\x57\xac\x57\x5b\x0a\xc9\x6b\x35\x0d\xe4\x00\x74\x37\x58\xef\x53\x3d\x5e\x56\xc0\xdc\x41\x82\x9b\x22\x67\x2f\x24\x5f\xb6\xea\x1b\xa3\xfa\xcc\x2f\xcc\x1d\x1e\x7c\xd5\x56\x38\x37\x50\x08\x52\xe5\x73\x38\xa6\xa7\xfb\x17\x86\xfe\x8a\x54\xe5\x77\x95\xc2\xef\x2a\x98\x97\xdf\x66\x1b\xe0\x67\xcb\x28\xa2\xc9\x14\x0e\x2c\xfc\xaf\x97\xff\xd4\x25\xed\x0b\x11\x85\xfd\x8f\x9a\x6f\x35\xc5\x5c\x45\xb7\xde\x64\xe3\xe6\x5f\x25\x8c\x88\x26\xa3\x2a\x83\xc5\x10\x09\x89\xaf\xe9\xb1\xb8\x7c\x9f\x2a\xd8\xaf\xe8\x32\x80\xe3\x42\x9f\xfc\xa3\xde\x9d\x77\xf6\xeb\xcc\x04\x88\x38\x71\xcf\xcd\xeb\xa1\xe9\xe9\x8e\x65\x91\xf3\x7e\x19\x85\x79\xce\x92\x8d\x31\x90\x18\x6b\xf5\x42\xff\xa5\xae\xf1\xed\xe5\xcb\x26\xaa\x68\xc7\x9e\x84\x77\x89\x0a\x96\x17\xf9\x45\x8a\x42\x1f\xbe\x96\x52\x55\xbe\x86\x71\x7d\x1c\xda\x2a\x9b\xe3\x5f\xfd\xbd\x1d\x79\x6e\x27\x36\x39\x64\x0a\xbd\x2c\x29\xa7\x7a\x18\xe8\x4a\xb4\xa8\x77\xd6\x35\x38\xa6\x78\x1e\x11\xc0\xf7\x8f\x0b\xab\xfe\x16\xb5\x45\xdc\x51\x5e\x63\x89\x90\xd6\x2c\x2c\x32\x09\x0a\x95\x67\xe5\xff\x25\xc3\x39\x1f\x78\x31\x80\xd5\x00\xb2\x1f\xb2\x21\x1b\xe4\x12\xc5\x9f\x63\xa6\xab\x92\xb2\x39\xe5\x74\xd1\xec\xe8\xef\xfc\xe3\x66\xb2\x22\x5b\x7f\x1a\xfb\x41\xd8\xcc\xc6\xff\x45\xbd\x4f\x79\x2a\xbe\x10\x75\x28\x18\x21\x60\xbc\xa6\x0f\x3e\x7c\xa0\xb8\x5c\x1a\xde\x30\xea\xa6\x34\xc9\xec\x2b\x31\x68\xdc\xac\x28\x56\x17\xaa\x4e\x23\x10\x21\x4d\x37\xac\x02\xc5\xc0\x2a\xcd\x2a\x9c\x7f\xef\x93\xf3\xed\x91\x53\x20\x3e\xc3\x45\x3d\x89\xc6\x3f\x99\xdc\x8a\x7f\x76\xa2\x68\x67\x7c\x37\xdc\x94\x51\x09\x40\xa7\xbc\xb3\xf8\xeb\x2c\xdc\x68\x09\xc4\xce\xff\x0e\xfc\x30\xc6\xcc\xdd\xec\xbd\xd6\xe0\x63\x27\x59\x2e\x33\x70\x6c\xf9\x5d\x93\x00\x40\xc3\x82\xb5\x8c\xc5\x2a\x9b\x76\x96\x85\x84\x74\x48\xfa\xcd\x71\x1d\x6a\x3e\xac\xbe\x3e\x98\xa8\xcf\x79\xab\x52\x39\x34\xcd\x7a\x08\x40\x6f\x33\x9a\x49\x62\x4e\x2e\xfd\x0d\x9c\x15\x0d\xee\x51\xb9\xfa\x58\xc4\x32\x27\x47\xf5\x59\xdb\xa4\xcf\x63\xf9\x66\x98\x67\xef\xfe\xe5\x76\x9e\x3a\xdc\x7d\x21\xb0\x30\xde\xa0\x58\x94\xe1\x44\x6e\x9a\xb2\xd1\xff\xc7\xd8\x5b\x86\x75\xf9\x04\x6d\xc3\xb4\x74\xa7\xd2\xdd\x5d\x02\x22\xf1\x23\x05\xe9\x6e\xa4\x5b\x5a\xba\xa4\x5b\x1a\x04\xa4\x4b\xba\x1b\x91\x94\xee\x4e\x11\x44\xba\x9b\xf7\x78\x9f\xe7\x7e\x64\xff\x9f\xbc\xbf\xcf\xb1\xd7\xcc\xee\x5e\xbb\xe7\xcc\xce\x9c\x83\xa5\x03\x7f\x19\xf3\x1c\xa6\x63\xa3\x44\x39\x1a\xd9\x8b\x11\xcd\x58\x43\xfc\x2c\x08\x06\x6a\x78\x03\xcc\xd6\x98\x5e\xbd\xfb\xf6\x07\xea\x57\x14\x62\x81\x13\xc7\x88\xe7\x7e\xc1\x96\xf3\x8b\x71\x2f\x8d\x61\x3f\xb3\xf6\x0a\x36\x31\x48\x5e\x15\x58\xa8\x50\xc8\x3c\x04\xdf\xa3\x8f\x5d\xdb\x8d\x55\x77\x8d\xc2\x53\x8a\x7c\x22\xcd\x5d\xff\x52\xb0\xb1\x6d\xce\x88\xf7\xac\xc3\x0f\x9c\x85\xb5\x86\x5c\x72\x8a\xda\x46\xf6\x86\x31\xcf\x07\x3d\xa9\x5e\x57\xab\x41\x7c\xd6\xe6\x51\x56\xb3\x7c\xf7\x20\xfc\xca\x33\xa8\xec\xbf\xa6\xfd\xf3\x86\x81\x60\x63\x42\xc1\x00\xa6\x9d\x67\x95\x3c\x8a\xa9\xe5\xf5\x78\x7e\xbb\xb6\xfc\x5d\x26\x20\x7d\x37\xf5\x2a\x0e\xd7\x46\xbd\xe6\x98\x79\xc3\x3b\xd5\x52\x72\x15\x50\xc2\x99\x6e\x2e\xc0\xb0\x6f\xf3\x7e\x08\xda\x82\xae\x7f\x4c\x4f\xa4\xca\xf9\x5d\x9c\xb6\x3b\xbf\x27\xd3\x8f\x5d\x1d\xb2\x9a\x3c\x30\x29\x49\xf3\xfd\x5e\xc0\x36\x5a\xca\x4f\xaf\xe3\x6c\x09\x9e\x18\xe6\x86\xdc\x69\xce\x90\x6f\x1d\x8e\xd2\xbc\x3f\xd6\x8e\x22\x0f\xf5\x8d\x01\xd1\x57\x6c\xf6\x76\xf0\x39\x04\x3c\x02\x3c\x9b\x93\xd4\x08\x08\x5d\x5b\xac\xb7\x1a\x19\x47\x1f\xd7\xe0\x63\x32\x67\xd2\xb6\xe4\x9e\xff\x35\xed\x5f\x97\x57\x00\x04\x16\x06\x0a\x13\x30\x4d\xee\xd3\x7a\xb6\x88\x3d\xb5\xa3\x87\x41\x1b\x21\xb1\x39\x9b\xe3\x4b\x62\x05\x09\xe1\x73\x8a\x1f\xa5\x24\x8c\x87\x71\x97\xbe\xa0\xcf\xb5\xe3\x6b\xfe\x7a\x63\x59\x09\xbf\x3f\x58\xb2\x22\x5e\x37\xe3\x47\x17\x5d\x6d\x54\xc4\xb3\x14\x1e\x9a\x67\xfa\x04\x73\xcc\x0d\x20\x86\x5d\x9e\x75\x4d\xf7\xcc\xc5\x77\x30\x68\xf1\x4c\xd0\x70\xcd\x9f\x61\xaa\xff\x53\x6f\xa3\x68\xca\xf1\x0d\x76\x23\xe5\xb7\x6f\x1a\x58\x75\x96\xfc\x2b\xef\x18\x4e\x0f\xee\x54\x66\xef\x8f\xc4\x97\x2f\x99\x2b\x0b\xf8\xb9\x1e\x17\xaf\x9f\x7d\x3d\xe6\xa0\xe0\xfc\xed\x47\x17\xfe\x37\x22\xf7\xaf\xdb\x2e\x00\x82\x89\xd8\x09\x06\x1b\xc3\x44\xcc\xa4\x93\xc2\xe3\x61\x79\x1d\x13\x02\x32\x24\xa4\x7f\xc8\x70\x10\x09\xa5\x65\xb5\xed\x9a\x7f\xd6\x7d\x28\xb1\x87\x01\x73\x1b\x85\x7f\xc7\x57\x8f\x07\xe5\x63\xa8\x5f\x9e\x39\x61\x89\xa8\x86\x59\xd0\x95\xe0\x17\x40\x69\x1b\xf6\x66\x7d\x3a\x92\x21\xec\x02\x6b\x9c\xe9\xd2\x0c\xdd\x97\x94\xed\x90\xe5\x50\xc9\x22\x8b\xe9\x0d\x0b\xd3\xcf\x7a\x24\x26\x37\xf0\xe3\x70\x2a\x4b\x4d\x84\xcb\xae\xca\x9f\x8e\xb1\x39\x65\x5a\xfa\x98\xf9\xd2\xd4\xea\x35\x6a\x93\x4f\x18\x48\x45\xfc\xa1\x7f\x42\xac\xa9\x60\xbd\xc9\x28\x19\xad\x48\xcf\xb8\xd0\x80\xef\xaf\x4b\xe0\xf6\x43\x24\x11\x9d\xf8\x99\xaa\xc4\xff\xd0\xe1\x3d\x24\x59\x68\x44\xa4\xb3\x93\xb2\x93\xde\x2d\xb6\x61\x93\x78\x31\xfd\x5d\xdf\x7f\xdd\x24\x01\x10\x11\x38\x28\x04\x60\x12\x9e\xb1\x22\x0a\xf7\x45\xa5\x32\xd7\xf4\x8e\x55\xcd\x10\x61\xbc\x3a\x94\x8f\x77\xfb\x39\xfd\x9e\xa4\x4e\xab\xff\xc6\x38\x11\x07\x8c\xb8\xae\x6b\xa7\xd2\xb4\xd6\x3a\xa7\xec\x7f\x44\x2f\xf8\xc3\x96\x4a\x29\x61\x05\x47\x4f\x27\x58\xc6\x59\x09\x43\xec\x22\x30\x88\xfc\xe7\x3f\x55\x85\x8b\xcb\x5b\x1b\xb8\x1d\x86\x96\x91\x4a\x2f\x53\x55\xd5\x66\x0f\x10\x44\xfb\xc4\xaa\xdc\x22\xf7\x94\x7d\xd7\x7a\x8e\xc1\xfc\xb4\x33\x8f\x7d\xae\xdb\xb0\xe7\xe7\x5b\x8b\x84\x31\x2e\xf2\xdc\xaa\xab\x5f\xd2\xf0\x1d\x96\x79\x23\x3a\xc5\xaa\x03\x83\x25\x4e\x9f\x52\x05\xff\x75\xf3\x05\x40\x60\xfc\xfc\xc0\x54\xc1\x0f\x4b\xca\x1e\xb7\x46\x68\xcf\x70\x3d\x35\x2f\xad\x16\x3c\xb8\x89\xa7\x90\x18\xa1\xdd\x2e\xd2\x88\x59\x32\x22\x8d\x48\x7b\xc0\x97\xe8\x10\x1a\x05\x87\xd2\x5a\x82\x19\xa2\xd8\xe4\x18\xa4\x42\x4b\x1c\x8d\xe5\xef\x63\xf1\xf6\x96\x92\xd4\x7c\x0b\x81\x1f\x96\x5f\xb4\x01\xa2\x93\xb7\xc4\xb0\x7b\x2e\xdf\x3d\x38\x5d\xbf\xd3\x93\xb6\x1c\x23\x47\x27\xf3\x68\xa9\xf6\xb1\x9a\xb5\xf8\x15\xde\x77\x21\x51\x83\x4d\x64\xff\x78\x9b\x29\xca\x5f\x85\x2d\x63\x65\x66\xbd\x5e\x93\x2c\x3f\x97\xdf\xd8\x42\xef\xd0\x08\x74\x31\xf1\x0c\x8a\xb1\x11\x63\x04\x3b\x56\xc2\x5c\x11\x0e\x86\x41\x68\xa8\x5c\xf6\x57\x37\x8d\x42\xfd\x33\x75\xbd\xc2\x5d\x7b\x6b\xc3\xaa\x7f\x7a\x30\xb3\x46\xe5\x26\xea\xfd\x0d\xc9\xfd\xeb\x52\x0f\x10\xaf\xcc\xc6\x04\x38\x0d\xc9\x7f\x2c\x73\x9f\xd5\x20\xde\x1e\x58\x0c\x44\x3f\xd7\x72\xd3\xbd\xfc\xd2\xd4\x7c\x18\x93\x3b\xb5\xb0\x4b\xe1\x53\x46\x6a\x0a\x06\x42\x0a\xe7\x23\xe0\x42\xa5\xa2\x48\x59\xa6\xac\x46\x24\xad\xd3\x83\x4c\x8a\x98\x8f\x96\x0d\x87\x37\x31\x8f\xad\x2e\x9b\x7e\xd1\x83\x5d\xfa\xe6\x7f\xd6\xf9\x21\xf1\x6a\x13\x1c\xa7\xd4\xfc\xb1\xda\xe8\x7b\x2e\x2a\xf9\xec\xfc\x04\xae\xdf\x62\x90\x91\x81\x24\xe0\xc7\x03\x38\x5f\xee\x2c\x4d\x0a\x55\x5f\xb7\xfd\x25\xf6\x12\x33\x44\xc6\xef\xbb\xca\x9c\x59\x89\x72\x98\x1d\xa5\x1b\xf5\xbf\xb2\x66\x63\x9f\x82\x0d\x23\x11\xa2\xeb\x3f\xa4\x44\xbf\x9c\xde\xca\xfd\x56\x70\xe9\xcf\xbb\x23\x69\x30\xcf\xdd\x1c\x4b\x4e\x61\x2a\xf5\xf5\xf7\xe6\xb3\xdf\x04\x80\xa8\x67\xd9\x39\xfa\x4b\x26\x4b\xea\xc2\xc8\x4c\x8f\xc8\xaf\x0c\xd7\xac\x9c\x07\xe2\x6c\x5a\xfa\x5a\x39\x30\xca\xcf\x72\x60\x75\x64\x2e\x26\xfe\xa7\x3e\x4d\x41\x71\x0f\xbf\x50\xa1\xd2\xc6\x8b\xa4\x65\x16\xaa\x33\x99\x37\xcc\xd1\xf3\x6a\x64\x1f\x16\xe1\x08\xe6\x0d\x77\x18\x3f\x66\x70\x00\xe4\xf6\xd1\xf7\x31\x85\x14\x58\x60\xdd\x03\x8b\xd4\x34\x8d\xca\xc1\x5a\xed\x38\x46\x3d\x5f\x4a\x1c\x7a\xbc\x4d\xc5\x6e\x5b\x8c\x85\xc9\xd9\xaa\xd4\x61\x42\x6d\x10\xb8\x59\x23\x17\x2b\xc7\xdd\xa9\x77\x93\x60\x70\x74\xed\x20\xc6\x3e\xee\x0b\x70\x1a\x36\x9c\x7b\x8b\xf4\x09\x2c\x47\xca\x3d\x7e\xd1\x03\x44\x67\xfd\xba\xfd\x30\x2e\x62\x0e\x4c\x54\xa4\xcd\x82\xf9\xef\x55\xe0\xc2\x67\xd1\x34\xcd\x76\xc2\x50\xcb\x15\xb7\xd2\xab\x93\xc5\x9f\x14\xc0\x96\x3c\xa1\xa6\xf0\x7c\xa1\x7a\xf4\x66\xe5\x53\x57\x31\xe1\x47\x34\x54\x03\xf9\x33\x4c\xe4\x4e\x69\x43\x1c\xfa\xf8\xc6\xf2\xe7\xc0\x61\x63\x79\x27\x20\x5f\xf8\x8e\x69\x2c\xcc\x2b\x4f\x3e\x43\x5a\x71\xbd\x38\xb0\x46\x66\x61\xbe\xa3\x14\x29\x1a\xd6\x63\x80\xa8\xe8\x06\x38\x6c\x18\x83\x5d\xcf\x73\x8f\xac\xe9\x9e\xc3\xe5\x84\xe0\xf8\x48\xca\x6c\xe7\xe6\x24\x24\x9b\x43\x35\x75\x49\x90\x19\xae\x72\xb6\x82\x56\x6d\xbf\xd6\xd6\xc4\x15\xb7\xea\x9e\x4b\xb1\x1d\xf0\x25\xc2\xd6\xe2\x28\x2f\x91\x51\xc9\x71\x77\xbd\xa5\xc5\x3f\x7b\x94\xfa\xd2\xfc\xe4\x37\x20\xf1\xa7\x21\xc8\x16\xd8\x8e\x47\x10\xf0\xe6\x8f\xa0\x12\x7a\x05\xaf\xcf\x14\x15\x0a\x7c\x8b\x8f\x7e\xd0\xc7\x96\xca\x50\xf7\x7f\xfa\x3e\x1e\x55\x13\x45\x8c\x07\xd3\xee\xa8\x72\xf2\x51\xd8\xe6\x3e\x8b\xd0\x44\xa7\x53\x33\x7b\x57\x8d\x35\xc3\xdd\x94\xb2\xae\xc3\xc0\x93\x24\x6f\x47\xa1\x91\xfb\xb6\x81\xb0\xa5\x47\x52\x12\x03\x69\x66\xdb\x09\x7f\x4a\x1e\xb2\xd2\xed\x76\xee\xe0\x22\x1d\x3b\x83\x37\x48\xff\x68\xf4\xe5\xba\xd7\xb0\x67\xfc\xc2\x53\xb1\x1c\x29\xb4\x39\xa1\x4b\x4b\xdd\x01\x2a\x4b\xfd\x36\xb7\xb2\xa7\xff\x1e\xb3\x88\xcb\xe6\x69\xd0\x13\x3a\x16\x8f\xcb\x59\x3d\xf7\xe0\x6e\xf1\xd2\xdb\x4a\xbb\x17\xcf\x42\x92\x8a\x7d\x6b\x21\x78\x58\xee\xb7\xd7\xad\x31\x71\x65\xa0\xf9\xdd\xf9\x6b\x2b\xae\xbf\x23\x5c\x29\x39\x02\xc5\x8c\xbe\x5e\xdc\x9f\xd0\x68\x6f\xee\x5d\xe0\x69\xca\x6a\xb1\xb3\xe3\x31\x38\x03\xd5\x1c\x62\x1d\x3b\x7a\xe5\xf0\x8f\x65\x0d\x7f\xe2\xed\x2c\x3b\xa1\x1e\xa1\xb2\x6b\x5f\x8d\xdd\xf8\xad\xac\xa6\xb7\xac\x05\xb1\x70\x71\x03\xb4\xe0\xb9\x54\x4b\x7a\xdc\x21\xed\x18\x6e\xbc\xfb\x72\x15\xd3\xe4\xb5\xa7\x12\x92\x6f\xfa\x06\xf8\xea\xfc\x94\x4b\xe8\x7a\x03\x81\x4c\xab\x92\x55\x16\xfc\xd8\xd8\x63\x9f\x0a\xae\x91\x74\xfe\x71\x77\xb7\x90\xdc\xcb\x56\x41\x0c\xd9\x96\x03\xf4\xab\x69\x55\x5c\x87\xe7\x40\xd4\x40\x21\xcf\xa3\xd6\xf6\xe0\xb4\x29\x2c\xf6\xb8\xb2\x03\xba\xfd\xd7\xe8\x9f\x13\x76\x21\xfc\x8f\xe1\xa4\x7b\x85\xe9\xfa\x8f\x8e\x40\x89\x4c\x95\x08\xaa\xda\x04\x82\x8d\x1e\x5e\x9b\xaf\x79\xd6\x0b\x35\xb5\x26\xfa\x7c\x12\xdc\xea\x3f\x44\x5b\xc6\x0e\x2f\x9b\xea\xf2\xe8\x9e\x24\xeb\xbe\x73\xf1\x1a\xe8\xb2\xa2\x78\xcb\x25\x75\x2f\xde\x8f\xeb\x40\x44\x93\x3a\xf3\x38\x64\x88\xc3\x05\xa7\x67\x8c\xee\x74\x7f\x80\x13\x45\xc8\x8e\xb3\x6e\x02\x9b\x60\x66\x98\x29\x50\x96\x5a\x2f\x6d\xa7\xaf\xa8\x68\x12\x11\x38\x1c\x1a\xd7\x90\x53\x6b\x7c\xa3\xd1\x08\x88\x8e\xb9\xe0\x9c\x8b\x8e\x36\x07\x3f\xe8\xc6\xfa\xd0\xb4\xea\xa7\xbb\x28\xd8\x90\xbd\xd6\x19\xb4\x44\xa9\x17\x45\x4e\x73\x43\x56\x06\x2a\x64\x1c\x8c\xfd\xe5\x14\xc2\xc2\xc8\xe7\x2f\x7c\x7b\x04\x15\x54\x49\x5f\xf2\x5d\x0b\xb3\xb0\xa7\x34\x20\x8c\x19\x37\xa3\x9a\x03\x4e\xbb\x84\xfc\xab\x82\x5b\xdc\xd9\xec\x1c\x4c\xcb\xb6\xfc\xd1\xf8\xb1\xc8\x79\xcd\xd5\x88\xe5\xba\x6b\x13\x4d\xe5\x0d\xd4\x51\x54\x80\xcf\x42\x26\x43\x25\xc1\xaa\xdb\xc7\x42\x6c\xe9\x38\x6f\x3c\x3e\x93\x89\xa5\x31\xec\x4e\x92\xcf\xe5\xce\x8b\xa3\x40\x6c\x4b\x65\x6b\x10\x98\x53\x06\xe9\x02\x49\x08\xc5\x06\xf2\x2e\x2b\x3d\x9b\x65\xf7\xee\xe2\xf3\xc3\x12\xc4\x3f\xbf\x53\xa3\xee\x6e\x6b\x78\x50\x15\x67\x3e\x3c\x0d\xfa\x51\x60\x68\x4a\x79\xae\x61\xec\xe4\x70\x67\x04\xd3\xdf\xa3\x0d\xdf\xd1\x82\xa1\x1a\xf7\x3c\x3b\xd6\x8f\xce\xd7\xaf\xfe\x39\xf3\x93\x64\x1f\xec\xd7\xf6\xd3\x28\xc3\x46\x4f\x16\x82\x89\x1f\x64\xb1\x77\xc9\xc5\x7b\x6e\x83\x69\xfe\x5d\x2c\x3e\x76\xca\x4d\x05\x0d\x6d\xe0\x9c\xd6\x50\x61\x1d\x07\x52\xc0\xbd\x3d\x35\xea\xa5\x83\x1f\x36\x7f\x2e\x1b\x30\xae\xa5\x1d\xcb\x3b\x3d\x3a\xa3\x9a\x46\x66\xb8\x25\x06\x04\xf7\x60\x67\x0a\xa3\xd1\x59\x11\x98\x5d\xfd\x52\x3a\xe5\xc5\xbb\x09\xb3\x68\x5c\x23\x69\xd9\xd1\x9a\x1e\xb9\x5f\x57\xa1\x38\x57\x3d\x7d\x9f\xf6\xc2\xc4\xc6\x3c\xc3\xe4\x62\x91\xb6\x4c\x77\xfc\x04\x1f\xfb\x4f\x40\x9c\x84\x7e\x44\x61\x03\xe5\x47\xc4\x1d\xe9\x4e\x3f\x58\xf0\xfb\xee\xa7\xe7\xb8\x0b\xb4\x57\x5c\x79\x02\xf3\x7a\xa8\xa2\xa2\x8c\x6c\xd7\x16\x39\xe8\x98\x07\x6a\x85\x2a\x6e\x28\xa9\x28\x1f\xee\x9f\x66\xea\x79\x80\x03\xf9\x6b\xb6\x3e\xd9\xaa\x75\x41\xf2\x2f\x70\xa7\xaa\xc6\xa7\x96\x37\x3d\x41\x30\x39\x2f\x75\xed\x48\xd9\x16\x7f\x5e\x3e\x7d\xdf\x60\x21\x73\xaf\xc9\x5c\x83\xd5\xaf\x4e\xb9\xef\x47\xa8\x54\xcb\x76\x72\xf1\x6c\x0e\x91\x0b\xc3\x59\xf1\x59\x4c\x3b\x95\x19\xd0\x67\xa0\x4f\x94\x07\x17\xd5\x24\xaf\x63\x22\x2d\x63\x90\x28\xab\xa6\x5f\xa5\x4e\x7a\xc4\xe9\x93\xfe\x92\xb8\xea\xfb\xbe\x0a\x7d\x93\xf7\xc0\xbf\x2f\x4f\x88\x64\x31\xf6\xf6\x72\xb7\x4d\xde\x65\x73\x40\x35\xee\xed\xf6\x8a\x4d\xa6\x6b\xca\x7c\x07\xd5\xe8\x45\x89\x48\x86\x17\xb0\xf9\xe7\xa1\xe5\x46\xb8\xf1\x74\xcc\x66\x58\x67\x17\x6d\x91\x59\xa5\xe6\x23\xd3\xa6\xea\x85\x03\x0d\x98\x1b\xdd\xe2\x06\x51\x7f\x8a\x81\xe6\x5f\xad\xd1\xb1\x1d\x0f\xbd\xaa\xc4\x4c\x1e\x0c\x8e\xc5\x5c\x17\x41\xd3\xec\xd6\x3a\x36\xd9\xa3\xaf\x10\xfd\x34\x26\xb7\x11\xb9\xf1\x74\x4a\x2b\xf0\x5c\x9b\xcf\xa3\xec\x41\x0f\xa8\x59\xb3\xbe\x97\x59\xc9\x68\x2d\x1c\x77\xc9\x9a\x73\x66\x3c\x9e\xc2\xcd\x0b\x62\xac\x50\x03\xf6\x94\x31\xb9\x21\x75\x56\x19\x6f\x00\x56\x3a\x61\xc7\x91\xfa\xed\x59\x27\xa4\x73\xfa\x6c\x0f\xff\x20\xa4\xc7\x03\x27\x2e\xbe\xa4\xeb\x49\x55\x5f\x34\xd3\xda\xd9\x2b\x68\x98\xe7\x25\xbf\x66\x10\x79\x98\x0b\x69\xdf\x38\x5b\xdc\xc7\xae\x17\xc4\x2b\x1c\x30\x30\x8c\xbf\x47\x78\x92\xf4\xbb\xb6\x1f\x7e\x25\xf9\x2d\xdf\x43\x6d\xa2\xf4\x35\xf1\x27\xb6\xde\x6f\xa1\x96\x79\x9d\x61\x68\xad\x5d\x29\x5b\xd4\x88\x50\xe5\xff\x89\x03\x9d\x42\x63\x9d\x1d\x74\x73\x54\xc5\x4b\x3b\x6c\x5c\xcc\x1d\xff\xca\x42\xfb\x58\x5e\x9c\xf8\x68\x10\x9f\x7f\xa7\x19\xd0\x70\xff\x34\xa9\x38\xe7\xa3\x64\x98\x0d\xac\xb7\xb2\x55\x33\xb2\x67\x1a\x26\xbf\x29\x2f\xe0\x4d\xd2\xef\x3e\xc4\xe7\xa1\x94\x06\xd7\x77\x92\x00\x69\x5e\xcb\xd3\x68\x13\x6f\x24\x8f\x48\xf5\xcc\xc9\x7f\xdb\x72\x89\x1b\xcc\x8b\xea\x06\xb9\xb5\xd4\x9a\x2b\x45\x9d\x67\xef\xd7\xee\x82\xd8\xa6\xcb\xdb\xd8\xa5\x80\x23\xcd\x87\x78\xac\x99\xd4\x53\x82\xa1\x97\xdb\xce\x3f\x71\x3c\x10\x6d\xf3\x67\x8d\x32\xc4\x5c\x40\x7f\x17\x98\x29\xf1\xd1\xe2\x46\x53\xbe\xdf\xb6\x9b\x51\x7d\x43\x89\x83\x82\x5c\x15\xc8\xd7\x78\xbd\x99\x90\xd6\xb1\xe6\xdb\xbe\x91\x0c\x37\xe0\x97\xce\xa9\x6a\xb4\x8f\x31\x7d\xd8\x18\xd2\x20\x5e\xc3\xe3\x9f\xfa\x85\xe5\xac\x79\x62\xea\x6e\x44\x42\x1e\x0f\xcf\x55\x48\xa8\x77\xfa\x24\xb9\xc4\xe5\x18\x12\xf7\x67\x4e\xf1\x83\x05\xa6\x52\x94\x5a\xa1\x60\x6f\x14\x66\x94\x3c\x94\x5a\x76\xf4\x0a\x96\xdf\x71\x27\x34\x3e\xb0\xa7\x46\x8d\xf3\x06\xab\x84\x8d\xf7\xa4\x4a\x08\xe4\x28\x5e\x06\xf9\x4a\x4e\xd6\x9a\x05\xeb\xd0\x21\xa3\x42\x2d\x06\x2f\xee\x13\x2b\x00\x59\x86\x2e\x67\x61\xdf\xaa\x8f\x74\x3a\x97\x43\xec\xb6\xbd\x4a\x74\xad\x6a\x19\x60\x16\xcb\x34\xd9\x55\xa2\x23\xfb\x63\xbd\xdb\xf7\xc0\x2c\xb7\x0c\xaf\xda\xc6\x5f\x6b\xd8\x98\xdf\x16\xe4\xe8\x35\x2b\xbb\xc9\x4e\x7d\xc3\x89\x7f\x61\x6b\x78\xcc\x16\xd9\x92\x06\x36\x01\x9c\x53\x11\x67\x92\x6d\x89\xac\xc8\xf8\xcd\xdd\x6f\x32\x7e\x2d\xe0\x0d\xae\xb3\x0c\x39\x68\xf3\xbf\x0a\xc0\x9c\x63\x1c\x16\x0e\xda\x06\xf2\x51\x33\x27\x3b\x88\x88\xd9\x62\xdb\x38\xc9\x63\xbe\xc2\x88\x28\xe6\xd3\x7e\x28\xd3\xfc\x39\x31\x3f\x41\x14\x91\xd1\x52\x31\x2a\x07\x86\xeb\x63\xae\x36\x3a\xd6\x9b\x30\x31\xbc\xf7\x63\xf0\x55\x1a\x04\xfc\x42\x3f\x0a\xef\x3b\x44\x61\x85\xca\xfd\xc8\x17\x2c\x6a\x93\x04\x78\xf6\xef\x0c\xd0\xc8\x68\x31\x5e\x74\x15\xaf\x25\x22\xa6\x5f\x22\x9e\xd3\xc8\x2f\x14\x2a\xae\xf1\xbc\x31\x6e\x10\x97\x3f\xb0\x40\x44\xf8\x8b\xc4\xff\x85\x7a\x02\x20\x22\xd0\x50\xc4\x00\x12\xb7\x83\x2e\x60\xa9\xe1\x98\x7b\xb5\x82\xca\xb5\x87\xb2\xc6\x38\x3f\x1d\x64\x91\x73\xe9\x9b\x59\x85\x7f\xf4\xb2\x5d\xef\xf3\x22\x98\x72\x1f\x81\x1d\xdf\xa6\xc6\x6b\xdc\x59\x32\x52\xc2\xd4\xce\x46\xda\x16\xa5\x90\x1b\x18\x92\xd2\xed\x76\x41\x4c\x1b\x46\x4c\x66\x03\x32\x71\x04\x17\x29\x88\x9d\x9e\x50\x66\x0e\xbe\x32\x5e\xb2\xd9\x3d\xff\x28\x2b\xf7\x56\x92\xf9\xe2\xd7\xda\x96\x07\xa6\x55\x33\x11\x8b\x3e\x20\xca\x95\xf4\x67\xd9\x92\x14\x8f\x10\x15\xfb\x91\xfd\x68\xe6\xc7\x51\x72\x4b\xfc\x11\xa3\xc3\x0e\x36\x2d\xfa\x95\xae\x2b\x89\x10\x18\xe0\xfe\x58\x02\xa7\x76\x83\x97\x5a\xa5\xda\x7a\x51\xc9\x62\x16\x24\x8c\x78\xd6\x5d\x03\x8f\x63\x11\xa0\x68\xf9\xd8\xe8\x9a\xce\x71\xf6\xf7\xb1\xf7\x5f\x80\x2e\x40\xdc\xd0\x0f\x2c\xbe\x28\x86\xf6\xdd\x88\xa6\x8b\x59\x64\xfd\xd2\xd8\x7b\x48\xc2\xbc\xaa\x56\xb6\x93\x53\xfb\xdc\x69\xa4\xd7\x0e\x6f\xc3\x34\x5b\x00\x0f\xd0\x21\xeb\xbb\x45\x90\x0d\x81\x86\x60\x94\xdb\xb2\x23\x99\x7a\xf2\x86\xaf\x87\x4d\xde\xce\xb8\xef\x6a\x1f\x55\x11\x71\xe1\x84\x0d\x18\x30\x42\xb0\xd8\x21\x48\x5c\x5d\x75\x3a\x56\xd2\x94\x9f\xbd\xe5\xc2\xa5\xd3\x52\xe8\xbd\x32\xce\x46\xb1\x8b\xa3\x70\x37\x1b\xf3\x02\x33\x7c\x86\xe1\xaf\x64\xb9\x0c\xe8\xd2\x1b\xd1\xb4\x3a\xf6\xd7\xe0\xc6\x72\x1b\xcd\xd3\xa8\x84\x61\x86\x08\x75\xdf\xfe\xd9\x3d\x26\x7d\xaa\xba\xfb\x17\xfe\x0b\x80\x50\xfe\x97\xc8\xff\x67\xc8\x49\x5f\x3b\x31\x37\x06\x6d\x6a\xe9\xf5\x4b\xfd\x9b\xfb\xa9\xfc\xc3\xee\xe0\x2f\x1e\x37\x53\x8d\xbb\x22\xcf\x8c\x20\x60\x45\x83\x35\x01\xad\x9a\xe0\xf4\x8d\x9b\x3c\x65\x5c\x4e\x1e\x97\x65\x04\xbb\x96\xa0\x81\x98\xd2\x69\x68\x51\xd6\xe1\xdb\x85\xcc\x2a\x30\xf9\xc1\xfb\x2a\xc1\xc6\x4c\x9a\x50\x8f\x00\xa5\x72\xfb\x90\xfe\x14\xc3\xb0\xea\x70\xf4\xf7\x48\x20\x51\xdf\x94\x90\x10\xe3\x73\x77\xf0\xa1\x33\x32\xf5\xf1\xab\x06\x89\x09\x0b\x54\xb7\xa6\xa2\xe3\xe5\x07\x9c\x8f\x6f\x90\x70\x1c\x99\x25\xdf\x9c\x66\xcb\xae\xb9\x0c\x0d\x5c\xfe\x35\xed\x5f\xd8\x2e\x00\x22\x42\xfe\x1f\x0a\x6c\x35\x4e\x7f\xf4\x86\x65\x9f\xb7\x77\x48\x5c\x9d\x5c\x10\x32\x92\x0a\x9e\xfb\x54\xb4\x81\xae\xaf\x01\xfc\x14\x5f\x32\x97\xe3\x27\x01\x25\x38\x26\xe1\xb0\x75\x8a\x3f\xa0\x38\x5f\x7e\xcb\x95\xbd\xd2\x91\x40\x59\xe6\x7e\xf6\x46\x11\xa5\x19\xa9\x75\x8f\x91\x0e\xc9\x0b\x4c\xa6\xc3\xde\xa5\xe8\xba\x2e\x7c\xf3\x21\xab\x4f\xca\x2e\xc9\xf8\x51\x02\xfd\x77\x1e\x8a\x80\x82\xb8\x23\xbf\xd2\xeb\xf9\xe9\xce\x79\x90\x49\x38\x4e\xeb\x3e\x5f\x37\x72\xe5\xee\x64\x93\xfd\xe3\x3e\xf9\x12\xd6\xa2\x66\xc3\xec\x16\xbd\x2a\xfb\x9c\x75\x87\x7c\x28\xa1\x75\xe7\x5f\xba\xfb\x7f\xa1\xb1\x00\x48\x36\x0c\x1c\x3b\xe0\x1a\x12\x87\x0f\xa2\x17\x2c\x5c\x65\x3f\xc4\xb9\x26\x59\x6b\xf6\xcc\x18\x1e\x9f\x6f\xc8\xda\x44\x7b\x09\x56\x45\xee\xb1\x4a\x4f\x81\x55\x82\x4a\x37\xc9\xe7\x45\xa8\x54\xe7\x4e\xd7\xb0\x7e\x43\x42\xe1\xf1\xf0\xc9\x48\xfc\x39\x30\x86\x30\x7d\x6c\xdd\x75\x72\x43\x03\xa6\x80\xa8\x76\xeb\xb5\x03\x66\x5c\xc4\x8b\x7b\x96\xc0\x24\xe6\x79\x4d\xd1\xc2\xf5\xa4\xe8\x4e\xdc\x9c\x65\x62\xc3\x16\x5e\x82\xcf\x81\xa4\x60\x32\x5d\xc0\x63\x24\xc9\x68\x5b\xa0\xa3\xbd\x99\xce\xdd\x7a\x2c\x8e\x1d\xaa\xe2\x83\x7e\x71\xc6\x9d\x6a\x13\x16\xff\xe7\x30\x23\x4e\x40\x74\xce\x7c\xc4\xa0\x8b\xcd\x34\x40\x4e\xc1\xd8\x9b\x31\xfb\x7a\xd8\xdb\xdc\x98\x5f\x6f\x2f\xa2\xd7\x28\x1f\x23\x5c\x57\x67\x02\x09\x10\xb5\x88\x35\xd8\x6a\xb2\x82\x55\x0a\x6b\x8f\x71\x21\x90\xcc\x4b\xfa\x20\x68\xd0\x2b\x52\x3c\xb9\x1f\x37\xff\xe9\x24\xca\x9a\x3c\xf4\xef\x0f\xfc\x2f\x4c\xfa\x7f\x52\xb8\x10\x81\x6c\x8d\x0d\xaa\x6d\x6c\x2b\xa1\xeb\xa0\x9a\x76\x59\x6a\x1a\x7b\xb5\x35\xe5\x4c\xa4\x59\xfe\x86\xdc\xcc\xbb\xef\xd1\xe3\x75\xda\x21\xdf\xc0\xd2\x86\xf7\xc8\x0a\xea\xf3\x28\x82\x65\xf2\xaf\x24\x15\x12\x8b\x7e\xd6\x4f\xbe\xb9\x73\x09\x1f\x26\x48\x94\x35\x2b\xb5\x96\x83\x02\x18\x49\x9d\xd8\x04\xf7\xf7\x7f\x43\xdd\x24\x61\x34\xe8\x12\xd7\x38\xf3\xcb\xbd\xf7\xbe\x57\x4f\xe2\xc6\x53\x93\x5f\x1d\xe0\xac\x50\x48\x07\x37\xd8\x98\x21\x87\xa5\xa1\xca\xaf\x37\x05\xf3\x59\xe6\xea\x86\x1a\x52\x87\xf6\xab\x34\xd2\x36\x3e\x2f\xc6\xac\xaf\xb0\x4e\x49\xd9\xfe\x1e\xd0\xff\x04\x91\x10\x7f\xa8\x20\x3f\xe0\x80\xfe\x3a\x10\x8f\xde\xf1\xb5\x50\xe2\x08\x39\xbc\xcf\x11\x27\xd1\xc2\xcc\x4e\x77\xc9\x0f\xbe\xca\xa5\x14\x9f\x9c\x41\xf5\x4b\x33\x58\xf9\xa7\x62\x32\xfd\x26\x85\xf1\xd4\x1d\x95\xdd\x33\x3b\x51\xbb\x27\x68\x09\x83\x6d\xc5\xac\x5a\x25\x85\xb6\x18\xfe\xea\xe4\xf7\x36\xd8\x6f\x57\x30\x22\x90\xea\xc1\xa9\xf7\x38\x4f\x6d\x2d\x4e\x8a\x02\x4a\x12\x8f\xec\x00\x17\x53\x4d\x7a\xd4\x71\x6d\x0c\x8b\x20\x3c\x5f\x07\x10\x8d\x2a\xf6\xfb\xde\x9b\x17\x68\x71\xa2\xc0\x6d\xbb\xf3\x7d\xa0\xd1\x3a\x5c\xb4\x4d\xb8\x34\x31\x9c\xdb\xd7\xfa\x4b\x65\xf7\x3b\xf0\x49\xe1\x13\x86\x59\x07\x9f\xe3\x42\xe8\x8e\xc9\x6a\x69\xf2\x6d\x99\xab\x11\x2b\x9b\xf9\x2d\x76\x6c\xe2\x7a\xf0\xd7\xb5\xb5\x9f\xde\x06\x7f\x7f\x88\x7f\x41\xd9\x00\xc8\x73\x22\x28\x28\xe0\x87\xb8\x78\x41\x11\xa5\x7f\x60\x8f\xc0\xea\x2e\xc9\xf7\xb5\x9b\xe6\xea\x87\xc5\x91\xf0\xdc\xf9\x37\x95\x20\x2f\x7c\x2a\xbf\xd2\x35\x30\x4c\xfe\x23\xbc\x4e\x13\x7f\x42\xda\xc7\x46\x8d\xd4\xa4\x02\xf2\x16\xd5\x2b\xba\xa5\x56\x50\x58\xc4\x81\xa8\x4b\xc0\x89\x14\x5b\x07\x8c\x02\x59\x43\x1c\x38\x94\x87\x04\xfa\x87\x9c\x5a\x6d\xb4\x8a\x06\xe6\xf1\x44\x06\x3c\x16\xdc\xe6\xbb\x38\x76\xef\xce\x65\xd1\x1c\xc1\x86\x95\x3b\x58\x1e\xa5\x90\xb8\xdd\x33\x3d\x13\x15\x4b\xef\xfa\x42\x49\xac\x59\x9e\x10\xc7\x11\xe9\x0a\x69\xd2\x15\xd1\x1d\x3e\x4d\x30\xa7\xb1\xe2\xdb\x8d\x9f\xf8\x67\x82\x89\x16\xb7\x0f\x43\xec\xd0\x7b\x95\x64\x13\xea\xb1\x7c\xeb\xab\x28\x6e\x14\xd4\x8d\xd2\x91\x8f\x60\xf0\x90\xfa\xb3\x22\xfe\x50\x1c\x03\x0f\x91\xad\xb9\x67\x60\x74\xc8\xad\xbd\xe9\x57\x51\x56\x84\x2c\x24\x2d\x89\xd4\xce\x6b\x8d\x87\x27\x5a\xeb\x7f\x81\xdf\x00\x08\x26\x32\x1c\xb8\x6d\xa2\xe3\x72\xdc\xaa\xcb\x94\x9d\xfd\xae\xb8\xfa\x06\x11\x5c\x61\x47\x58\x09\x9b\xfe\x8c\xaa\xaa\x14\xeb\x3f\x0a\xcb\x11\xc5\x81\xac\x3b\x0d\x79\x19\x7c\x5c\xe9\x5a\xf8\x05\xdf\x30\xe7\x10\xba\x03\x28\x8f\xef\x61\xa3\xae\xda\x24\xa9\x56\x1f\x58\x4d\x4b\x1c\x38\x8c\xc0\xcc\x5d\x66\x0a\x56\xa4\xba\x33\x21\xed\x3c\xf9\x46\xf5\x19\xc8\x73\x5b\xa4\x94\x71\xb6\x13\x15\x81\x17\x02\x62\x57\x52\x07\x14\x20\x81\xbd\x7a\x6a\xb2\xbf\x08\x8b\xb8\x8f\x3d\x41\x84\x91\xc3\xab\xec\x3d\xa6\xc5\xb7\x5e\xec\x56\x54\x6a\xd2\x29\x58\x2c\x1e\xa4\x68\x20\xb9\x77\x24\x29\x5f\xcd\x0f\xfd\xeb\x6e\x68\x15\x55\xed\xd7\x25\xf4\xc1\xf1\x73\xcf\x48\xaf\x4c\xc9\xa1\xe6\x0b\x4e\x04\xe3\x96\x2f\xb8\xff\x5e\x11\xff\x44\xcb\x10\x4c\xa8\x50\x30\xfa\xff\x1c\x03\x4a\x45\x89\xd0\x33\x1a\x86\xd1\xf9\x83\x7e\xcf\x24\x86\x95\xe0\xc8\xfd\xf9\x7a\x9d\x36\x52\x5d\xa1\x1d\xd1\x33\x17\x30\xa7\xf0\x8b\xec\xbb\x5e\x9e\xf8\x98\xe5\x63\x7e\x55\xe4\xde\xe8\x47\x71\xb2\x74\x3c\x34\x9c\x2c\xa5\xe0\x3b\x57\xef\xc7\x2c\xb3\xa2\x4c\xf0\x61\xe3\x38\x8a\x4a\x62\x89\x65\xd6\xdf\x35\xee\x42\x55\x77\xe7\x7b\x4d\x32\x1d\x4b\x49\xf7\xf3\x2b\x7c\x8a\x70\xe7\x5c\x77\x08\xd8\xf1\x26\x59\xea\xdd\xe4\x54\x7c\x6a\x76\xb6\x58\xe5\xc8\x87\x48\xd5\x3b\x9a\x09\x92\x07\xaf\xd1\xdb\x6b\x39\x69\x8d\x98\xe5\x2b\x85\xaa\x8b\x40\xf4\xff\x89\x82\x88\xb4\xf0\xfd\x3e\xd8\x71\xf0\x19\xea\x0b\x59\xa5\x36\xe2\x75\xa7\x26\x26\x14\xa9\xb4\x21\x17\x5d\x9a\x53\x88\xda\x9a\xbc\x08\x80\xfc\xf1\xbd\xf4\x4d\x79\x01\xf8\x0e\x36\xbe\x7e\xe8\xe6\x2d\x1c\xa1\x5a\x53\x9a\x1f\xb5\x44\xa5\x27\x0a\x87\xf4\x74\xcf\x25\x77\x3e\xd7\xc0\x3b\x0e\x90\x6e\x87\x5b\x3f\x1d\x79\x5e\xec\x8b\x4c\x63\x2d\x9d\x99\x37\xbf\xf5\x42\xd1\xf4\x47\xd3\xf2\x60\x39\x34\xb5\x56\xbb\xa8\x58\xf2\xa2\x1e\x2b\x86\xc5\x81\xde\x43\x8f\xc3\x0c\x93\xfd\xac\xae\xa5\xba\x84\x3d\xd5\x1a\x3a\x76\x06\x97\x8e\xd6\x98\xa7\x43\xbf\x62\x5e\x20\x23\x97\x1f\x37\x44\x58\x80\xbe\x8b\xca\xde\xa7\x75\xa7\x06\xfd\x31\x76\x8b\xb8\x20\xc9\xbb\x79\xd6\x31\xe3\x6c\x1c\xad\xab\x8c\x0d\xba\x9f\xd7\xf2\x43\x88\x2d\x60\x84\x2d\x4a\x2f\xac\xa6\xd5\xe9\x73\x59\x5d\x2c\xfd\xef\x21\x64\xc5\xeb\xe6\x67\x93\x08\x86\xd1\x8a\x93\x97\x25\xaf\x62\x9c\x0c\x11\x27\x00\xd1\x57\xab\x6a\xa6\x21\x3a\x68\xc3\x93\x7c\xd5\xda\x6f\x15\x0d\x76\x35\x20\x3a\x6d\x44\xa6\x15\x42\x68\x97\xef\x13\x66\x36\xc9\xf4\x9e\xac\x2a\x9e\xfd\x14\xfa\x71\xa5\x3c\x24\xc6\xae\x53\x34\xd8\x80\x40\x6f\x9a\x65\xcd\x71\x16\x39\x86\x1b\x45\x3a\xe7\xbb\x83\x10\x2c\x10\x62\x3a\x20\x89\x82\x8f\xca\x44\xce\x62\xce\xbe\x50\x8d\xf4\x78\xd3\x98\x25\xb3\xa4\x1e\xa7\xda\x2f\xd2\xb5\x65\x60\xd6\x25\xe7\x75\x07\xdc\x0e\x3a\xae\xcf\x2a\x6e\x18\xe6\x1c\x11\x36\x3f\x9c\xa5\x7b\xe2\xd6\xd4\x78\xee\x63\x15\xee\xa1\x72\x5d\x22\xd3\x31\xbf\x1b\x55\x38\x7b\x1a\xb4\xe8\x31\xa4\xd3\xa9\xe2\x9c\xed\xc1\xdc\x69\x28\x7b\x28\xc1\xfa\xc8\x79\x67\xe1\x2a\x8e\x35\xee\x00\xe2\xfa\xd8\xf1\x08\x89\x05\xa7\x6a\x98\x6e\x00\x26\x0e\xfb\x96\x67\xfe\x30\xc2\xae\xf2\xca\x01\x21\xff\xc8\xd1\x7f\x39\x4d\xc3\xea\xe5\x1e\xa9\xe3\x05\x23\x4d\xf8\xd3\x86\xc1\xb1\x22\xc7\x44\x9b\xb4\xe2\xe1\x93\x84\xae\x94\x72\x56\xca\x50\xdf\x1a\x0e\xe8\x52\x90\x0a\x83\x04\xa2\x25\xd0\x70\x8c\xd7\x03\xde\x8b\x58\x8c\x8d\x35\x7b\x73\xf1\xea\xc1\xce\x67\xc1\x92\xa5\x6d\x96\xf9\x5f\x92\x0b\x2e\x15\x17\x67\xbe\xd9\xe3\x85\x8e\x21\xa4\x40\x3c\xc4\x77\x84\xdd\x5d\x45\x5b\x4b\x86\xd4\xb5\x77\x8b\x56\x99\xb8\xd8\xd1\x14\xe5\x25\x77\xf0\xcb\x1c\xeb\xda\x6b\xee\xbd\x9e\xc2\x17\x4f\x92\xfd\xcc\xdc\x0c\x1b\xa5\x3d\xea\x15\xbb\xbe\x8f\xfd\x2a\x8e\xd1\x84\x75\xd1\x96\x07\xb3\x89\x63\xa1\x5d\xca\x18\xb9\xa5\xbc\xa0\xef\xc8\xf3\x42\x75\x5c\x83\x15\x27\xa8\xcf\xb8\xa8\xf6\x88\xc6\xb3\xb0\x98\xaa\xc4\x99\xe2\xdd\xa3\xf5\x2f\x1d\x4d\x15\xcd\xfc\xd6\xff\xa4\x3b\x90\xca\x20\xca\x49\xdc\x55\x6a\xc4\x10\x8c\x5c\x17\x50\x56\x8e\xd5\xe6\xef\x69\x33\x52\x59\xc0\xf5\xbe\x15\x38\x09\xed\x1c\xac\x05\xae\x3b\xd6\x18\xc5\x8d\x4a\x77\x98\x50\xa7\xaf\xb5\xb6\x85\x7a\x5c\x1e\xdf\x1b\xfa\xe5\x61\x8b\xfb\x24\xe9\xea\x83\x1a\x7f\xfb\x8b\x02\xf6\x9b\x44\xe5\x6e\x6d\xef\xa7\xa4\x87\x6e\x8c\x4f\xfc\xb8\x4a\x3e\x72\x27\xae\xbf\xb8\x2f\x59\xb8\x42\x90\x60\xba\x7a\x49\x19\xf9\xeb\xc9\x2a\xc7\x13\xd1\x8d\x53\xa8\x71\x47\x6b\x3b\xea\xbd\xe7\xe4\x29\x12\x9e\x62\xc6\xfd\x7b\x2b\x1f\xfa\xe6\xf5\x26\xe8\x5e\x6e\x7b\x02\x84\x29\x1f\x69\xa2\xae\xf9\xbd\xbb\xd6\xb5\xd8\x8d\x64\xa0\xec\x5c\x4c\xd6\x11\x79\x3b\xae\x1d\x65\x51\x2f\xc8\xd1\x6e\xa1\xa0\x14\xf4\xc0\xba\x37\x39\xa9\x08\xf9\x8c\x55\x78\xe7\x90\xcb\x2d\x57\xb4\x63\x33\x7b\x71\x1d\x7f\xc6\xf7\x4e\x2c\x1f\xa3\xbb\x53\xcd\x18\x58\xf7\x9e\x06\x0d\x65\x77\xe5\xcb\x5c\xeb\x62\xa4\x61\xa9\x67\xf9\xcd\x3c\x60\x4e\xd6\xda\xd0\xac\xc2\x2b\x40\x0f\xcf\x84\x5a\xfe\x51\x3d\xf6\x3f\x3b\xa5\x92\xbc\xae\x3b\x5c\xe8\xe0\xa7\x92\x5e\xd1\xf8\xfc\xee\x0c\x04\x21\xeb\xfe\x8a\xab\x4e\xbf\x69\xeb\x5b\x06\x7e\x2d\x1b\xea\x02\x18\x10\x31\x66\x5f\x6d\xbb\x20\x58\xc4\x1e\xd2\x47\x46\x3d\xb2\x7d\x59\xde\x8f\x95\x0d\x8f\x7a\xb1\x7d\x3e\xa3\xbf\x9b\xeb\x25\xc0\x0a\xb0\x65\xa5\x88\x7e\x4f\xb1\x4c\x7f\x8c\xe8\xe3\xfe\x6a\xd7\x55\x59\xd6\x3c\x41\x6c\xb5\x3e\x99\xcf\xc6\x8f\xb3\x95\x07\x9b\x9f\x02\x84\x38\xa7\x3e\x44\x42\x19\x84\x7f\x7f\x27\xd3\xa7\x0d\x15\x23\x72\x48\xe8\xa7\x67\xf9\xeb\xae\x54\xbc\x90\x8e\x88\x3d\x5f\x6e\x92\xc9\x14\x54\x55\x61\x9a\x39\x9d\xb9\xf6\x33\x65\x79\xad\x12\x4d\x1c\xd9\x1a\xe7\x4e\xec\x87\x10\xe8\x9f\x64\x77\xd5\x61\xe3\x3d\x94\x27\x4c\x23\x80\xa8\x58\xe2\x32\x26\xb3\xd2\x61\xa3\x76\xfc\x16\xcc\x40\x8e\xe1\xc9\x0e\xbe\xb1\x6e\x35\x0f\xad\xd4\x98\xf9\xa7\xf0\x03\xdf\x01\xa0\x0f\x7f\x3f\x57\xa5\xa7\x86\x23\x5b\x09\x3b\x56\x7c\x90\x59\x58\x0e\xab\x73\x39\xc5\x9a\x8c\x87\x63\x7c\xc7\x33\x5b\x2d\xf9\xaa\x20\x4f\x30\xf7\xb8\x19\xb5\x9f\xa3\x54\x82\xb0\xf1\x44\xeb\x13\xfb\xf9\x0b\xe5\xe1\xdf\xf3\xd4\x29\xbe\x90\xa3\x78\x8d\x86\x9a\x37\x1b\x9a\x3f\x9e\xac\x22\xa4\x0f\x74\xbb\xc5\x66\xa4\xb3\xf0\xb8\x7a\xe8\xd5\x81\x0e\xfa\x8e\x33\x45\x18\x76\x0b\xbd\xea\x87\x2c\x91\x2a\xfa\xb5\xd9\xe7\x3f\x61\xa6\x8a\xf8\x10\x1a\x9f\x76\x97\x4b\x96\x88\x93\x62\x38\x97\xca\x66\xd4\xb3\x20\x0c\x91\x6e\xc4\x2a\x41\xf9\xcd\xba\x54\x78\x12\x40\xf4\x71\xb7\x5e\x0f\x0a\x95\xc9\x8e\x76\xe8\x78\xdf\x53\x0c\x91\xed\xe8\x51\x78\x96\x93\x1b\x41\x3c\x04\x45\x1a\xb3\x4b\xc7\x09\xfa\x69\xab\x32\x6b\x7e\xbe\x73\x6a\x82\x42\x5a\xed\x3e\xb7\x53\x44\x97\x56\x8e\x5e\xf5\x63\x5b\x51\x2d\x29\x6b\xca\x9d\x7a\xc1\x60\xa4\x4e\x03\x9c\x2a\x95\x81\x64\x0c\x15\x57\x68\xdb\x48\x35\x7e\x73\xcc\x4c\x8c\x0d\x63\x3c\xc4\x8c\x76\x01\x95\x68\x5c\x5b\xb3\xe2\x5d\x96\x79\x4f\x92\x23\xfc\xfc\xba\xc2\x47\xb4\x37\x08\x16\xdf\x85\x1c\x24\xdb\x27\x38\xdd\x66\x74\xd4\x73\x9a\x38\xc8\x0e\xaf\xec\x22\x4e\xbb\x46\x81\x3f\xa5\x12\xdf\xd9\x5e\x77\xbf\x95\xef\x06\xaa\x80\x71\x3a\x6b\xc6\x94\x64\x30\xca\x6f\x66\x03\x9f\xd7\x24\xab\x10\x51\x5a\xc7\x0c\x80\xbc\x23\x4c\xd4\x07\x26\x12\xd0\x28\x26\x87\x25\x04\x90\xa1\xd7\x2b\x38\x19\x84\xa6\x23\x98\x8c\xd8\xc3\x66\x57\x53\xbc\xa2\xaa\x40\x31\xe3\x79\xa1\x49\xf3\xb7\xf2\xca\xf8\xfe\x66\x7e\x98\x2a\x8e\xba\x48\xdc\x16\x55\x99\xc1\x12\x0e\x82\xca\x04\xda\x39\x26\x45\xc4\x39\x70\x4e\xf3\x1d\xe2\x70\x2e\x3e\x7a\x4e\x52\x22\x5b\xb4\x91\xb9\xb5\x8a\x5a\xbf\x8a\x0c\x99\xbf\xff\x66\xbe\x20\xcd\x90\x9b\x96\xf7\x4e\xe9\xff\xc1\xfe\x7f\xde\x68\x10\x4c\x4c\x28\x18\x00\xf6\x37\x07\x67\xe1\x9f\x58\x91\x90\xbc\x2d\xa9\xf9\xb4\xfe\x8a\x5a\x98\x43\x54\x86\x6d\x52\x5c\x7c\x96\xcb\x46\x27\x13\xa5\x78\x39\x18\xd8\x2d\x25\x24\x22\x69\xd3\x24\x42\xe8\x6c\x17\x8d\xd5\x0b\x61\x9b\x09\x4e\x75\x5b\x3e\x95\x1a\x3d\x66\x84\x0b\x1c\xae\x1f\xcb\xc9\xf0\x9e\x2c\x2b\xa3\xcd\xa5\x45\x30\x54\xcf\x32\xb6\x56\x11\xdc\xee\xf5\x0d\x4f\x14\xbd\x20\xa7\x53\x7b\xe1\xbe\x08\x9b\xfa\x5b\x4f\x0c\x03\x2c\xa7\xd2\xe4\x7c\xfb\x91\x67\x8d\x03\x2e\xae\x4d\xd8\xce\x4d\x81\x89\xbb\xf1\xe5\x1e\xc9\x32\xa9\x33\xc7\xae\xd7\xd4\x70\xb9\x34\x83\xcf\xc5\x1c\xcc\xff\xee\xae\x0c\x80\x60\xd2\xb3\x83\xe5\x18\x62\x68\x41\x37\x37\xa7\x90\xf9\x5f\x04\x6f\xa9\xd2\xaa\x1f\x46\x88\x9f\x11\x2a\x21\x2d\x91\x98\xd6\xdb\xa2\x61\xda\x38\xa6\x81\x14\x38\x04\x1b\x98\xd7\x1d\x66\x03\x6a\x04\x67\x8e\xbe\x5b\x38\x32\x46\x4e\x51\x8e\x31\xa1\xf6\xcf\x2c\x1a\x5d\xcf\xa7\xd8\x06\x74\xc1\x26\xcb\x01\xd1\x5c\xa4\xb8\x95\x9f\x16\x58\x9b\x17\xe6\xb9\x59\xbc\xd7\x8e\xcf\xf3\xf3\x8c\xf1\xb1\x7e\x77\x54\xe4\x3a\xf8\x6e\xe8\x80\x58\x3e\xd2\xf3\x1c\x9f\x1a\xd2\x98\x1c\x3d\x3a\xa1\x4e\x2c\x64\x60\xbb\xde\xac\xaa\xb5\x5a\xfc\x5e\xb3\xcb\xb9\x8d\xd3\x70\x75\x61\x1b\xd8\x5e\x09\x27\xef\x73\x7e\x4a\x62\x26\x3a\xe4\x4e\xf4\x28\xe9\xb0\x2f\x56\x5a\x7a\x1b\x29\xac\x68\xde\x44\x3c\xe0\x29\xfc\xb6\xa3\xdd\x7d\x9a\xda\x5d\x4f\x4f\xe4\xf0\x55\xf8\x16\xdc\x4b\x3b\xda\xca\x6d\x3b\x27\xa1\x81\x4a\x49\xd8\xaf\x36\xee\xa3\xb6\x31\x02\xd7\xda\xdc\xc0\xa3\xd4\xe9\xf0\xfb\xfa\x83\xc2\xa8\x77\x6e\x0a\x9d\x31\x3a\x92\x1a\x56\x7f\xfa\xad\x1f\x54\xf9\x2a\x70\x34\xe8\xde\x7a\xfa\xfd\xa0\x21\xf9\xfb\xea\xfa\x2f\x68\x11\x20\x4e\x2d\x2a\x0a\x78\x12\xb4\x07\xb4\xf1\x2a\xe9\xc5\x4e\x59\x84\x5d\x53\x1b\xcf\xfa\xd9\x92\xfa\x03\x5f\x63\xd8\x57\x13\x11\x25\xa3\x7a\xaa\xc5\x0d\x81\x01\x2f\x0f\xaf\xeb\x0f\x1b\x6f\x5d\x88\x95\x57\x77\x0d\x30\x49\x5e\xd5\x2b\x0d\xfe\xf6\x83\x33\x42\x63\xc1\xbc\x3c\xe7\x8e\x99\xe4\x00\xd3\x34\xb7\xac\x5f\xe7\xea\x9b\xbc\x8f\xd6\xcf\xfb\xea\xb9\x74\x34\x79\x93\x36\xfd\x3a\x99\xdf\xc0\x58\xe7\x17\xbb\xd9\xf7\x73\x28\x2a\x30\x53\xbd\x3a\x4a\xce\x26\x28\x30\xe3\xe4\x03\x5b\x0f\x31\x59\xd0\x25\xdf\x1e\xc3\xcb\xbc\x3c\x03\x2f\xef\xd5\xce\x03\x0a\xbf\xcb\x0a\xb0\x67\x55\x9b\x35\xce\xea\x26\xd4\xfb\xe6\x5d\x7e\xc3\x77\xe9\x37\x6f\x56\x62\xde\xc4\x0f\xe2\xda\xb6\x7d\x55\x6b\x90\x20\x3f\x60\xd2\xf5\x03\xab\x67\x74\xba\xc5\x8b\xaa\x85\xd6\xc6\xf3\x50\x57\x57\x31\xee\x0c\x85\xcb\x95\x43\xd4\x6a\xca\x4a\x8a\xc2\xf1\x97\x7e\x38\x32\xc9\xfc\xf5\x24\xfe\x89\xaf\x20\x94\x70\x7e\x60\x83\x9c\xbb\xa5\x51\x63\x41\xe9\x4d\x46\xcf\x81\x3f\x03\xf0\x6c\x45\xa8\x11\x7e\xfc\x41\x77\xc6\xa1\x0a\x2e\x86\xaf\xa1\x65\x56\x3d\x08\x01\x25\xc8\xc5\x50\x3e\x79\xce\x30\x0c\x70\x5a\x18\xbb\xae\x1f\x9f\x34\x86\x35\x3c\x34\xf4\x29\x09\x84\x76\x04\x53\xa1\xf7\xf0\xf8\x83\xdc\xb7\xeb\xfe\x29\x0d\xe4\x83\x51\x11\x67\xfe\x77\x7f\x8e\xb3\x02\x10\xfe\xc0\x9d\x77\xa1\x60\x4f\xed\x7f\x99\x5f\x2a\xde\x6d\x1a\x61\x07\x44\x5d\xc6\x27\x2b\xda\x5f\xf5\xd3\xf4\x7c\xf7\x37\xc7\x8b\x15\xee\xd9\xd6\x0d\x76\xfc\x4e\xe0\xce\xb2\xf3\xe2\xd8\x76\x2a\x82\xf3\x16\x8c\xc8\xbc\xf8\x19\xed\xf9\x5a\xc8\x8d\x04\x7b\x91\x5b\xe4\x87\x29\xbd\x9d\x7a\xc8\xbb\x39\x46\x1e\x6a\xd2\xd8\xb2\xc5\xca\x99\xda\xc0\x8b\x00\x98\xff\x1d\x20\x0b\x10\x0f\x10\x01\x0b\xfb\x0c\x15\x49\x61\x9c\xa3\xa5\x84\xd5\x7a\x3d\x3f\x25\x0f\xeb\x93\x39\xfc\x0a\x45\x20\xae\x7f\x2d\x2c\x21\x99\x6e\xb6\x38\x32\x28\x03\x1c\x34\x7c\xb1\xce\xdb\xef\x9a\x4e\x8e\x2e\x5a\xb5\x13\xcf\xdb\x66\xce\x71\x14\x05\x1e\x69\xe5\x53\x10\xac\xb7\x43\xe8\x31\xde\x79\xb8\x02\x47\x68\xa3\x5c\x0c\xd1\xec\x6f\x72\xc8\x8d\xea\xf3\xb8\xb7\xb0\xce\xfe\x4e\xa8\xac\xbf\x89\xa8\x19\x1f\xb1\x84\x2e\x20\x68\xd1\x60\x09\xd1\x8e\x79\x00\x09\xb2\x8d\xa5\x5c\xb1\xde\x0c\x8f\xd7\xcf\xa0\xc2\x0f\x39\xab\x48\x3c\x09\x4a\xa8\x3f\x32\x68\x05\x3c\x0e\x51\x6c\xc0\xc2\xa4\x68\x6b\x19\x18\x66\x5f\x46\x24\xf6\xee\xdb\x25\xe4\x96\x4f\x85\x15\xc9\xc1\x9f\xab\x30\xc9\x8d\x10\x54\x7e\x55\x1b\xe5\x41\xff\xf5\xa6\xfe\x05\xca\x02\x20\x30\xc6\x50\x60\xc0\x8d\x76\x51\xa9\x48\xb1\x85\x71\x69\x6c\x92\x69\x65\xce\x54\x77\x2c\xa8\x26\x05\xfb\xcd\xcf\x13\xa3\xd6\xde\x5f\x50\xb6\xed\x7a\xa8\x60\x85\xa5\x73\x4e\xd6\x6c\xfa\xdb\x64\x47\x65\xbf\xa6\x9a\xad\x01\x91\x9f\xca\xa4\x97\xa5\x16\x4b\xa4\x0a\x11\x9a\x1a\x30\x15\x58\x60\x89\x58\x8c\x7f\xad\x3a\x0b\x3e\x1e\xfa\xb5\xbb\x59\x59\x21\x39\xb9\xff\xa4\x18\x42\x49\x1a\x5c\xf0\x37\x0d\x55\x91\x9c\xce\x62\x59\x3d\x30\x15\x3d\x00\x95\x71\xc8\x89\xdd\x5b\x6c\xe5\xb3\xd4\xf0\x40\x82\xa6\xc0\xed\x5b\x73\xe3\x97\xaa\x93\x83\x4a\x34\xd2\x6d\x05\xab\x6a\x7f\x37\xf9\xbf\x50\x54\x00\x44\x1a\x53\x04\xac\x5e\xe5\x3e\xfe\xbc\x43\x5d\x34\x55\x17\xf6\x5d\xa1\xc6\x2c\x38\x47\x7a\x4e\x15\xab\x01\x31\x5a\x4f\xee\x4d\x05\xb7\xf6\xeb\x57\xdd\x20\x5d\x10\x64\xd5\x5b\x13\xc3\xd2\xfd\x4d\x94\x47\x3e\x6c\xc5\x64\xd5\xd7\xc4\x75\xda\xb4\xaa\xb4\xdd\x42\x53\x85\x55\x68\xe9\x69\x2e\xb0\xc1\x95\x9c\x70\xc3\xc2\x52\x93\xc2\xc3\xea\x1b\x72\x24\xfc\x39\x99\xc2\xc1\xef\xb8\x7c\xe8\xcf\x0e\x47\x75\x21\xd4\x34\x68\x8b\x26\x20\x39\xd9\xdc\xb7\xa8\x0e\xae\x48\x09\x54\xa5\xb6\x69\x69\x77\xaf\xbc\xf2\xf6\xbb\xcf\x5e\x15\x5c\xd8\x77\xa9\xe8\x2f\x44\x55\x44\x7e\x83\xc7\x12\x0f\xd5\xab\xba\x61\xda\x83\x60\x59\x04\x3a\xca\xfc\x3f\xd4\x5a\x66\x14\x90\x28\x4c\xbf\x2d\x52\x4d\x3f\x0f\x43\xda\xe6\xb3\xdd\xbf\x51\xb4\x7f\x02\x44\x88\x08\x8c\x1f\x54\xe0\xd3\xd6\xa5\xbc\x2e\x95\x9e\xda\x28\xa0\xb7\x57\x0c\xfe\x39\x3a\x1e\xce\x81\x26\xf3\xfc\xeb\x7e\x14\x77\xea\xae\x51\x9d\x52\xa5\x80\x2a\xd0\x21\x39\xef\xbb\x6e\x39\xd4\xd8\x5b\xde\x6a\xdb\xd3\x6d\x12\x37\x33\x02\x66\xc4\xdd\xe4\x7b\xd6\x60\xac\x70\xe5\xeb\x4d\x06\x9a\x00\x30\xcb\xc4\xd2\x8e\x79\xc5\x52\xcb\xaf\xd4\x23\xe9\x47\x69\xa1\xf0\xb3\xba\xaa\x14\x1e\x22\xa3\xf2\x49\x2e\x0c\x25\x12\x54\xb5\x4d\x08\xf8\xa7\x6f\xc8\x57\xf7\x7b\xd1\x1c\xcc\xf9\x69\xd5\xd5\xb1\x0b\x4f\xe5\x75\x69\x28\xcc\xf5\xe6\x2f\x27\xf4\xe0\xcf\xf5\x19\x92\x63\xe9\xfd\xb5\xec\x5f\xd0\x33\x40\x9c\xf1\x3f\x51\xf0\x41\x25\x8b\x14\x51\xfa\x5d\x23\xb7\x7c\x99\x56\xdb\xb7\x11\x6e\xc7\x53\xe6\xd2\x0b\xcc\x43\x6c\xe3\x96\x94\x5a\xbb\x4d\x23\x5f\xc0\x62\x2e\x96\xe6\x12\xa4\x4f\x93\xd5\xd5\x75\x0b\x2f\x26\xf3\xfa\x92\xd0\x22\x33\x37\xe8\xaf\x30\x8f\xf9\xf0\x3b\xf7\x03\xba\xce\xc3\x00\x51\x37\xb9\x33\x03\x22\x6c\xfa\xec\x10\xba\xb2\x54\x34\x06\xef\xbe\x22\xcd\xc9\x1d\x95\x13\x44\xfd\x57\x6f\x3d\xea\x0b\xce\xe7\xc0\x07\x91\xe1\x35\xad\x9e\xe7\xb3\x0c\x6a\x0f\x1d\x29\x06\x94\x3a\x14\x73\x28\xe5\x8e\xe2\xe1\x5c\x7e\x37\xc5\xaa\xa6\xc3\x5b\x15\x5d\xb8\x7f\x7f\xca\x7f\x21\xe5\x00\x88\x2c\xd4\x7f\xda\xd9\x22\x7f\x76\x50\x2f\xb7\x9b\xba\xd0\x44\x39\xf7\x90\xa2\xc8\xd1\x10\x77\x6b\xe8\xa7\xea\x45\x17\x74\xf5\xa3\x95\x5b\x36\xa9\x53\x07\x94\xf0\xbf\x5c\x70\x14\x1c\xd3\xf3\xeb\x9a\xaf\x32\xa8\xf7\xae\x96\xf5\xa1\xc1\x39\xc3\xa8\x85\xbc\xe6\x99\xfc\x68\xd3\x62\xe3\x02\xae\x44\x89\xa4\x5e\x45\xec\x05\xc1\x45\x94\x3f\xb5\xef\x9b\xb5\x3b\x85\xd0\xac\xad\x4f\x46\x93\x8e\xbb\x73\xfa\xd6\x63\x9a\xd3\x9a\x60\xff\xdf\x90\x00\x16\xa5\xa9\xa2\x3c\x8e\x4c\xa4\x43\x0b\x6f\x5e\x24\x2c\x45\x9e\x95\x6f\x24\x3b\x14\xce\x25\x15\xe4\x52\x0a\x73\x78\xd4\x4f\xdb\xf1\x1f\xc8\x3a\x40\x1c\x13\x4a\x09\xb0\x2c\x91\x90\x57\xe1\xea\x20\xe6\x9e\xd7\xc4\x22\xb2\x26\xc2\xb3\x1a\xb9\x72\xba\x10\xdb\x6f\xdc\xfd\x55\xfa\xa0\x81\xdd\xe8\xdd\x14\xa0\x03\xe5\x5e\x36\xb3\x97\x9e\x3a\x9f\xc1\x41\xe7\x0b\x55\x1c\x6c\x32\xa3\x5f\x7a\x2f\xe8\x1c\x2e\x79\x36\xde\xb1\x13\x5f\x70\x7e\x78\x07\x46\xbb\x38\x19\x5c\xdf\xad\xd4\x32\xb4\xa4\x9c\x49\x5f\xcd\x9f\x37\x4b\xe3\x8e\x9e\x28\xc0\xfc\x5e\xe3\x0a\x1a\xaf\x89\xd8\x10\x06\x77\x2e\xc7\x67\x78\x29\x4d\x7a\xde\x51\x1f\x61\xfd\xf6\x38\x91\x71\x39\x4d\xf2\x2e\x5a\x19\x64\xa3\x51\x2e\x1d\x62\x92\xb9\xa8\xa8\x88\xbf\xc7\xcd\xbf\x1c\x81\x00\x08\x36\x39\x54\x2c\x70\xdc\xd4\xc2\xcf\xc5\xfa\xc2\xf6\x9f\xcf\xc6\x9d\x77\x0f\x87\x18\xf3\x65\x44\x55\xb6\x74\xb9\x28\x96\x47\xd1\x7a\xd6\x47\x75\xd4\x89\x80\x8b\xb6\xa1\x60\x83\xa8\x84\xc0\xcf\x50\xb9\xa6\x79\x4a\x87\x09\xcb\x6a\x6c\x4e\x77\x6a\x80\xd9\x20\xea\xf4\xce\x67\xd9\xd4\x14\xac\x43\x5c\xde\xfe\x4c\x41\x12\x48\x32\x5d\x43\xbc\xc5\xb2\x71\x36\xe6\x32\xa1\x6e\x7d\x6c\xbe\x4f\x52\x68\xd0\xca\xa9\x1e\x27\x2b\x03\x0f\x88\x9a\x1c\x8f\xa8\xc8\x6d\x3c\xb6\x7d\x75\xf0\x79\x39\x86\xed\x6e\x2f\x8f\x3d\x9e\xfb\xdc\x89\x28\xa2\x16\xf3\x27\xdd\x91\xcf\x16\x48\x85\xa2\xbe\xd8\x64\x78\xa9\x10\xbc\x66\xd4\xf3\xa5\xaf\x43\x94\xeb\x8b\xae\x89\x30\x9d\xd7\x3b\x5a\x29\x73\x27\x6a\x7c\x4a\xae\xc3\xc5\xbf\x5b\xf7\x5f\x28\x3f\x00\x02\x0d\x4d\x4e\x0e\x2c\x70\x4f\xf9\x91\xa8\xe3\x06\x76\x9d\xf6\xe7\x3d\x95\x74\x91\xe0\x6b\xb1\x23\x6f\x96\xdb\x17\x4e\x78\x27\xb4\x74\x74\x2f\xef\x6d\xc1\x40\xa9\x0c\x59\xf3\x64\xce\x28\x25\x94\x47\xb0\x70\x23\xb4\x29\x35\x5f\x2d\xbe\x81\x37\xa5\x55\xe9\x55\x2f\x69\x03\x01\xbb\xd5\x0d\xd8\xff\x97\x5b\xcf\x05\x16\x31\x9e\x01\xda\xee\x65\xc2\x01\xf2\xcc\x0b\xd9\x55\x96\xcf\xe9\x22\x3a\xc9\x9c\x05\x30\x4c\x61\x35\xa1\xca\xe0\x7d\x42\xf7\xc1\xd4\x88\x0b\xad\xcf\xe8\x56\x40\x41\x44\x82\xf9\xdd\x1d\x27\x47\xe7\x38\x6a\xde\x51\x92\x37\x4b\xa6\xb4\xf0\x7b\x38\xe6\x8b\x20\x8c\xff\x2b\x08\xfd\x46\xb0\x04\xef\x76\x9a\xdf\x93\xd1\x8e\x96\xcf\x4a\xff\xa5\x49\xfd\xae\x27\x36\x7d\x8e\xbc\x5e\x49\x32\xb1\xed\xa1\x09\x61\x00\xe4\xf1\x71\xf9\x31\x85\x14\x78\x2e\x9f\x24\x33\xb4\x79\x26\x0e\x37\xa5\x78\xb5\x31\x0f\xb9\x98\x33\xe2\x3c\xdb\x28\x2f\x22\x25\xe9\x4f\x21\x76\x93\xf9\xf5\x09\x78\xaf\x36\x6c\x79\xb3\xc9\xcb\xd8\xd2\x2a\xa3\xd0\xbe\xc7\x12\x8d\x24\xc2\x87\x23\xf5\x36\x52\x45\x46\xb6\xb3\xcd\xb7\x93\x33\xe1\x2b\x10\x47\xa8\x96\xbb\x89\x26\xc5\x30\xea\xa2\x80\xed\xad\x4f\xc8\x9a\x19\x67\xb9\xb4\x81\xde\x96\xd5\xf6\x36\x4a\xe0\x6e\x71\x0c\xc2\xd8\x02\x5d\xae\xcd\x95\x1a\x94\xd7\x5d\xf2\xa5\xcb\x5d\xc1\x9e\x6f\xb9\xce\xf2\x8a\x2c\x75\x3f\xf4\x6d\x2c\xbb\xbe\x0b\x50\xc9\xe1\xf4\x8d\xaf\x04\x44\x09\x44\xd9\xb3\x1a\x02\xc5\x15\x4d\x4f\x4b\xae\x62\x84\x78\x28\x32\x24\x1a\x3f\xec\xf5\x8d\x25\xc5\x49\x75\xb4\x8d\xff\xf1\xcc\x7c\x9a\x2f\x09\x6e\x05\x2e\x11\xf4\xfe\x91\x91\xfa\xbe\xe5\xd2\x13\x9d\x3c\x22\x72\x13\x42\x4e\xbc\x7d\x98\x17\x89\x0b\xcc\xb9\xa7\xf0\x84\xa0\x02\xb4\x30\x63\x28\x3e\x51\xe9\x48\xdf\x45\x30\x4b\x10\xd2\x68\x27\x1c\x98\x62\x5c\xe5\x63\xec\x71\x72\x23\xf2\xa6\xda\x84\xef\x71\x9e\x46\x35\xff\x28\xf6\xd0\xa0\x88\x9c\x56\xde\xd9\x75\xf2\x72\x86\x00\x5b\x33\x5f\xe9\xba\xa6\x56\x33\xa3\x22\x9e\x11\xba\x13\x11\x26\x0f\x1c\x35\x92\xd3\xf1\xf3\x40\xd7\xb8\xb4\xde\x85\x8d\xfa\x57\x9d\x6a\xd4\x37\xc6\x04\xfc\x82\xc5\x95\x26\xd4\x2b\x2c\x14\x1c\x99\x01\x77\x4f\x0b\x40\x28\xfa\x4d\x62\xf0\x97\x54\x84\xcc\xbd\xf5\x98\xb7\x85\x61\xc5\x96\x47\xed\xbe\xdd\x22\x07\xc7\xfc\xdc\xe7\x6c\x6d\x2a\xd7\x4f\x00\x45\x73\x75\xa0\xb2\x99\x08\x7d\x83\x1b\x4e\xe1\x89\x17\x9a\xdf\xd6\xbb\xb4\x4c\xe2\x1f\x48\xba\x27\xb2\x61\x97\x99\xd2\xf0\xd5\x7a\x4f\x92\xad\x1f\xfb\xd1\xb0\x8c\x3e\xbe\x83\x48\xf7\x2e\x91\x36\x42\xb4\xbb\xd5\xbb\x8d\x17\xa4\x4a\x28\xee\x45\x6a\x43\x5d\x10\x8b\x41\x2e\xca\xcd\x01\x28\x41\xb4\x63\xcd\xce\x31\x5b\x7a\xb3\xb1\x2e\x12\xc9\x03\x51\xe6\xb5\x08\x54\x76\xa2\xdd\x22\x8f\x9d\xda\x94\xf3\x7a\xd0\xa8\x77\x1e\x0d\xaa\x39\x7c\x0f\x38\x8b\x34\x3e\x61\xf1\xf4\x5f\x8d\x1a\x3b\xa2\xd9\xc3\xe4\x7f\x2a\xf9\xbc\x2b\x19\x48\xce\x56\x05\x09\xa4\x30\xea\xd7\x27\xb2\x21\x31\x8e\xce\x46\x9e\x2f\xeb\x69\x2e\xf3\x4b\xe1\xe4\x9c\x5d\x46\x36\xa3\xdf\x50\x62\xe6\xbc\x2d\x36\xe7\x02\x9e\xe0\x29\xcb\x37\x36\xa9\x35\xaf\xd9\xc5\xd0\x26\xf7\xaa\x65\xb2\x70\xd8\xbf\xde\xc3\xf3\x7f\xfd\x7c\x98\x9d\xdd\x5e\xdf\x92\xab\x00\x20\x56\xab\x8b\x16\x73\x2c\x39\x0f\x9e\xd6\xf9\x5c\xbe\xf7\x18\x61\xe7\xce\xcc\xa2\xf3\xfd\x6a\xa5\xfb\x17\xde\x6b\xca\x19\xd5\xd9\xa8\x00\x9d\x34\x39\x24\x46\x40\x5d\xcf\x6e\x1e\xf9\x33\xd7\x51\x67\x10\x05\xc5\xc0\xb0\x61\x2a\x8d\x14\x7f\x12\x59\x79\xb1\x1e\x35\xec\x7f\x36\x40\x2a\xb6\x22\x71\xac\x72\x3e\xaa\x63\x35\x4d\x16\xa3\xec\x0b\x6a\xf7\x5f\x6f\xfa\x93\x22\x42\xcc\x61\xa6\x72\x4e\xec\xf1\x39\x7c\x00\x0f\xe3\x04\x77\xa2\xaa\x3e\x43\x0e\xd7\x1a\x4f\x85\x69\x7d\x61\xbe\xdd\xc6\x8d\x09\xfa\xb9\x5d\x1a\x9b\xb1\xd5\xe3\x55\x32\xe2\x27\x60\x5a\x0b\x1e\xb4\xdb\xbc\xd6\x1e\x92\xdb\xa2\xec\xa5\x67\xdc\x46\xb8\xa8\x54\xca\x70\x1c\xdf\x73\xbc\x38\x9d\x96\xcc\xa1\xe5\xcc\xe3\x01\xac\x52\xc8\xf6\x0c\x3e\x0c\x25\xd5\x25\x3c\x0a\xef\x70\x42\x38\x0e\x7a\xe8\x87\xd5\x78\x17\xcd\x5f\x5f\x32\xea\x53\x68\xd7\xac\xd5\xfc\x64\x55\x86\x01\xed\x9b\x17\x13\xf2\x11\x9f\xbb\x5a\xed\xbd\xdb\xea\x8c\xdf\xad\x06\xc1\x60\x69\xad\x50\x97\x12\xa5\xc8\xf5\x71\xe8\x80\x89\xb8\xae\x32\x87\x52\xa8\xca\x92\x94\x41\x43\x0e\x83\xcd\x4a\xf7\xcc\x05\xda\xa3\x8e\xdf\xb2\x44\x3e\x1c\xb4\x64\x0e\xf4\x57\x15\x48\x01\xdf\x17\xae\x18\xc1\xc8\x75\x9e\x87\x9b\x7d\x2d\xac\x16\x43\xef\x7f\xc3\x55\xc7\xd6\xee\xe6\x7d\xd2\xe6\xf2\x3e\xea\xc8\xeb\xee\x55\x12\xd0\xfd\xa9\x88\x1f\xb6\xb5\x07\x2f\xea\xad\xed\xb1\xb5\xad\xc4\x8c\x6b\xcd\xd2\xc9\x7a\xa9\x96\x63\x73\x43\xcb\xfb\x06\xb6\xfd\x6a\x59\x60\x50\x2c\x3f\x3a\xde\x0a\x64\xd1\x97\xf2\x13\x7a\x87\xf7\xfe\xaf\x25\xa4\xd2\x29\xb3\xeb\x8c\xdb\xa0\xba\x07\x85\xb6\x1d\xbe\x1b\xbc\x7b\x1a\x94\xb8\xe2\x72\x5d\x97\x71\x61\xbb\xc0\x8a\xc4\xe0\x21\x4d\xe3\x4b\x81\x7e\xcc\x77\x71\x9c\x77\x17\x99\x21\xe6\x82\x16\x8b\x2f\xb7\xc1\xbc\x0a\x2f\x11\xa1\x43\x61\x38\x2b\xf9\xc3\x4e\x2a\x14\x61\xa1\x6b\x43\x57\x2e\x95\xc9\x06\x32\xa4\x1e\xbb\x8c\xd1\xac\xb4\x6e\xb0\x9b\x25\xb6\xd4\xc8\x49\x07\x22\x2b\x73\x25\xe1\x76\xca\x6e\x00\xcb\x8f\x31\xd8\x8a\xd0\xd1\xcb\x9b\xba\x62\xac\xbe\xd0\x9a\x4e\x27\x20\xab\xb5\x62\x04\xc7\x5b\x7a\x7c\xfc\xac\x89\x00\x6b\x83\x67\xe9\x8e\x78\xb2\xa1\x61\x95\x27\x56\x63\x3f\x9d\x75\x41\xd2\x95\x28\x2e\x0d\xa8\xef\x7d\x36\x32\x3e\x58\xce\x11\x88\xca\x36\xf2\x02\x9e\xe8\x31\x3f\xd7\x49\x8c\x73\x81\xd7\xd7\x66\xcf\xff\xf6\x52\xed\x61\x7c\x1f\xf8\xbc\x10\x29\x1e\x81\x2b\xd1\xdd\x6c\xfc\x78\x07\x4c\xfa\xc5\xa7\x95\x14\x53\x4c\x16\xb7\x23\x79\xe2\x43\x96\xae\xd7\xdf\x71\xe9\x37\x9e\x06\x7d\xb5\xa2\x59\x63\xd8\xf8\xe9\x43\x76\xfc\xa7\x81\xe8\x9a\x61\x48\xb7\xe0\xf1\xd0\x50\x51\x61\xeb\x03\xfb\x25\x5f\xab\xbf\x26\xc0\x8a\xd7\xab\x15\xfe\x82\x3e\xb3\xa4\xc3\x7c\x56\xd1\x8e\x8e\x37\x9e\x8b\xc8\x07\x8b\xea\x5a\x38\x93\xd2\x78\x15\x2e\xf7\x41\x92\x00\x7c\xe5\x55\x22\x35\xbf\xd4\xb4\xe8\xd8\x9e\x4e\x69\xcb\x4d\x53\x23\x14\x7f\xdf\xed\x5a\x42\x6d\x39\xd0\x96\x23\xdd\x58\x56\xd5\x5f\x5f\x0b\x6e\xff\x0b\xe8\x6d\xe8\x02\xc3\x60\x41\x8d\xb5\x4b\xd7\x5b\x09\xf1\x80\xaf\xa1\xa9\x1a\x5e\x3f\xff\x84\xbf\xcb\xa6\x7b\xd4\xb3\x99\x77\x02\x13\xfb\xae\xf9\x7e\x48\x63\xcb\x6c\xd8\x26\x59\xf8\x40\x25\xd7\x9b\xe5\xf5\xbe\x45\x7e\x75\xa0\x03\x77\x46\xbe\xf1\xbe\x23\x4a\xcb\xfb\x69\xf9\xb3\xa4\xf7\xcd\x59\x8d\x35\x72\x9a\xdc\xb5\x2a\xea\xf2\xc6\xe5\xdc\x85\x49\x26\x2e\xfa\x82\xe3\x2c\xd8\x0b\x43\xef\xc2\x45\x81\xde\x67\x87\xb1\x66\x4b\x6d\x19\x53\x7b\x6f\xe4\x07\x28\xdf\x20\xf5\xd5\xff\x1e\xf8\x2d\xe0\x60\xa8\x65\x25\x59\xdd\xcb\xb7\x36\x84\x28\x0c\xaa\x6a\x73\x2c\xd4\x43\xec\x37\x8c\x68\xf3\xd8\x24\x96\x58\x4d\xb6\x77\xaa\x6c\x35\xdd\x40\x50\x74\x72\x9c\xaf\xf9\x8a\x02\xe6\x59\x28\x20\xca\xdf\x45\xbb\x33\x70\xa8\x7c\x94\x95\x75\xf6\x3c\x60\x1e\xd6\x20\x7b\x37\xd7\xcd\x03\xae\x80\x24\x55\x38\x6e\x9b\xfd\xd9\x2c\xf7\x93\xaa\x93\x75\x7c\xde\xb3\xdc\x18\x1e\xcd\x0a\xa3\x21\xad\x87\xef\x95\x2b\x6c\xed\xa6\xe8\x64\xbc\x3e\xcc\xe5\xcf\x3a\xb8\xd1\x96\x00\x1d\x1a\x0e\xc5\x65\xe3\xe0\xff\x78\xf3\x15\xa1\xe0\x7b\x4d\x79\xa6\xf1\xb3\x99\xc2\xd7\x0c\x05\xbe\x28\xf0\xdd\x56\x27\x8b\x11\xca\xed\xfd\x0b\xb3\xfe\x75\xa7\x05\x40\xc8\xa1\x90\xb3\x01\x98\x85\x2c\x10\x5f\x7b\x17\x8d\x8d\x51\x8e\x71\xfe\xdb\x76\xe1\x20\x63\xc1\xf0\x32\x19\x6e\xd7\x9a\x38\xbf\x02\x4d\x87\x15\x59\x0a\x2c\xd3\x79\x5d\xcd\x5a\xda\x82\xe6\x9e\x22\xec\xca\x3f\xc9\xa7\x63\xd2\xde\x51\x40\x73\x7c\x2b\x7d\x8a\xd8\x86\x49\x30\x62\xe1\x54\x38\x0b\x88\xb2\x61\x60\x77\xe1\x8b\xfb\xcd\x39\x36\x6d\x1e\xe7\x9e\x98\xd3\xf8\x7d\x9e\x22\x56\x74\x20\x99\xa2\xa4\xf5\xb1\x5d\x3b\x78\x09\xb2\x3d\xd7\xdb\x5e\xe1\xce\xe3\xb7\x0f\xb4\x3c\xf0\x3f\x70\x1e\x2c\x33\x30\x07\x24\x0d\xf3\xa1\xf4\xdc\x8e\x08\x75\x6f\x33\xed\xf6\x61\x01\xa2\x0a\x17\x46\x31\x89\x47\x52\xf5\x56\x0c\x38\x15\xd3\xa8\x6a\xb1\x45\x7b\x8a\x18\xb8\xed\x1b\x95\x27\xd8\x7c\x86\x8d\xf3\x71\x44\x7f\x61\xd6\xbf\xae\xeb\x00\x08\xb9\x1f\x39\x98\xdd\x94\x29\x83\xd6\xc5\xa4\xad\x7c\x57\x04\x5d\x32\x54\x3d\x7d\xb4\xec\xfa\xe1\x7d\x96\xdd\x75\xf0\x70\x63\x0a\x8e\x4f\xd1\xf2\xd5\x47\x30\xaf\x67\x8f\x1c\x66\x00\x39\xfd\xf3\xde\x8c\xd6\xe9\x84\x81\xf4\x7e\x2d\x3e\xd6\x22\x1e\x2c\xbd\x3d\xef\xe9\xcc\xab\x39\x48\x08\x0e\x20\xea\x63\x1f\xe4\xd9\xf5\xc0\xee\xb2\x65\xa5\x70\x65\x25\x25\xc8\xdf\x87\x38\xfb\x83\x5a\xc0\xf1\x03\x67\x5b\x23\x96\x52\x2f\x21\xd8\xe1\x98\x43\xe4\x67\x05\x57\x1e\x93\x28\x7a\x4d\xe1\x12\xcb\xcc\xb1\xc0\x0f\xd1\x3c\x15\x25\x54\xa5\xe0\xa8\xe0\x89\x69\xd2\x2f\x6a\x83\x7f\x3d\x84\x7f\x61\x86\x00\x71\x38\x38\x76\xc0\x32\x69\x45\x4f\x83\xbb\x94\xdb\x80\x5c\x6b\x4f\x7e\x82\x1c\x3b\x75\x68\x24\x89\x81\x69\xb9\x4b\x74\xa3\xdf\x33\xce\xad\x7b\x41\x25\x80\x0e\x50\x89\x39\x93\xb0\xd9\x12\x39\x02\x84\x63\x16\x8a\xf2\xfd\x19\x05\x28\x33\xab\x7a\x27\xee\xef\x86\xcb\xd7\x55\x56\x23\xf9\x41\x75\x55\x28\xe8\xa7\xcc\x14\xe4\x7a\xd0\xc3\x9a\x7e\xc6\x05\x4d\x25\x09\x2c\xab\xb2\x8c\x32\x49\xf8\x34\x73\x61\xfe\xae\x6f\x19\x05\x9b\x16\x10\x94\x93\xf3\x37\x10\xb4\x67\xdc\x65\x0d\xa1\xb7\xdc\x50\x17\x4e\xae\xdb\x4f\xd3\x4a\xf3\xa0\x27\x84\x8e\x93\x2d\x50\x60\x50\xfd\x5d\xb4\x7f\xe1\x96\x00\x88\x08\xd4\x7f\x4c\xfb\xe9\xe3\x51\x6c\x1d\x35\x2c\xfc\x53\xf0\x08\x7f\x5c\x96\xd8\x31\x95\x0e\x2b\x81\xef\x42\x0c\x36\xb1\xb2\x10\xa9\x28\xe2\x10\x0c\xfd\x9d\x5d\x34\x4c\x64\x7d\x6f\x51\x0b\x1c\x73\x6d\xd5\xca\x77\x92\x4e\x49\xdb\xf2\x73\xb6\xf4\xc0\xa1\xbc\x34\xf9\x11\x6a\xad\x0b\xea\xcb\x7f\xf2\xab\xaa\x18\xcf\x82\x09\x97\xf7\x8d\x7b\x15\x01\xa9\xc9\x2d\xab\xe1\xc1\x8f\xf1\x65\xcb\xc7\x44\x25\x5c\x2c\x27\x05\x10\x71\x23\xdb\xb9\xf7\x6d\x0f\x99\x6c\x6b\xc7\x11\x9c\x18\x7e\x10\x28\xfd\xb9\x92\x8e\x8e\xc6\x8a\x93\xb0\x15\xe4\xcf\x5d\xe7\x6b\x98\xf4\xd7\xb4\x7f\xa1\x97\x00\x88\xa1\xd8\x7f\xc2\x48\xcf\x20\xaf\x55\x17\x07\x16\x59\xea\x67\x7c\x83\x8e\xf3\x99\x3b\xb2\xeb\xae\xd2\xab\x32\x71\x69\xe3\x0e\x2b\xe4\x32\xf7\x55\x9a\x00\x25\x1e\x02\x4c\x23\x0a\x26\x0d\x8c\xcd\x0a\xa2\xae\xd7\xa7\x5b\x95\xd5\x78\x8a\x05\xc8\x39\x0d\xd2\xee\x68\x11\xd1\x36\xf9\xd9\xf6\x00\x51\xc5\x09\x43\x88\x93\x9a\x92\x18\xf9\xeb\xd0\x95\xf1\x6f\x52\x65\xed\x42\x3f\x0d\x0e\xad\xf1\xb7\x6e\x34\x2e\x60\xa4\xf1\x78\x7a\x01\x51\x1d\xd3\x76\x49\x45\x63\xc5\xa2\x9f\x4c\x9a\xa6\x1f\xcd\x3b\x86\x0b\x0a\x42\xe6\xdb\x6b\xe5\x3e\xfe\x82\x19\xa2\x7d\xc6\xae\xf3\xf6\xaf\x69\xff\x42\x5b\xff\xff\xaf\xe6\x0f\x9a\x46\x8e\xcb\x9c\xe1\x93\x21\x51\x90\xc5\x02\xdb\x6b\xab\x66\xa0\xda\xf4\x35\xb1\x57\x26\x98\x06\x79\x9d\xc2\x43\x87\xc8\x26\xbc\x15\x50\x02\xb6\x81\x84\xc9\x22\xcd\x28\xe4\xb7\xc1\xd7\x25\xae\xe7\x8f\x6f\x12\x7d\xc2\x1c\x2f\xb3\x05\xc6\xd8\xdd\xdf\xa4\xc9\x48\x2f\xb8\x80\x85\x89\x68\x92\x16\x05\xa5\x56\x1f\x1c\x9e\x6f\xfe\xf6\xd4\xf4\x12\xec\x9c\x62\x29\x16\xa5\x81\x26\x45\xb9\x29\x44\xee\x97\xfc\x00\xd2\xf7\xa3\xb4\x25\xfe\x58\xba\x9b\xf1\x29\xa8\xcd\x34\xa3\x4f\xf2\xfe\xb4\x5a\xf5\xb0\xfd\x39\xd2\x49\x65\xf7\x15\x07\xc9\xdd\x94\x04\xd3\x85\x3f\xcc\xff\x0e\x9d\x05\x88\x75\xfa\x03\x86\x49\x98\xc2\x9b\xc0\xd0\x60\x2d\xef\xbe\x1a\xd4\x76\xfd\x63\xa1\xf7\xe3\x4b\x17\xc9\x07\xab\x1f\xbc\x4e\x9f\x8d\x9c\x3c\xa2\xb3\x41\xf6\x1e\xae\x2e\x75\xf8\xd3\x26\x0a\x15\x1f\x2d\x3f\xd5\x94\x5a\x91\xa6\x0a\x14\xa1\x21\x5b\x68\x6f\x3b\x05\x51\x7a\x98\x32\xd5\x51\x79\xb0\x91\xb1\xb1\xdf\xde\x07\xa8\x44\xf8\xac\x50\xf5\x8c\xd1\x55\x3f\x1a\x21\x87\xde\xc6\x24\x59\x44\x2c\xde\x7d\xe4\xce\x75\xfe\x33\xa0\xb6\x5d\x44\xe1\x07\xa9\x31\x61\x8b\x26\x5c\x53\x9a\xdc\xab\x57\x21\xbe\x35\x39\xc8\x15\xcc\x30\x1a\x8d\x4d\xac\x7f\xd2\xea\xe1\x4c\xc0\xd0\xe3\xb9\x6c\xb4\x50\xb0\x05\xcc\x7e\xd9\x72\x43\x8a\x57\x4b\x2b\x1a\xbe\x78\x35\x2c\x66\x80\xf9\xa0\x26\xbc\x3e\x62\x00\x2f\xa9\xd7\xdf\xeb\xe4\x5f\x37\x74\x00\x44\x04\x56\x04\x11\xb8\x4e\x5a\x04\x5f\x1e\xc0\x9d\xbc\x74\xe7\xbc\xa2\x7a\x73\xd8\x82\x62\xc0\x5d\xc1\xf8\x76\x6f\xea\x4a\x4d\xbb\x48\xcb\x07\x96\xef\x0b\x18\x84\xe5\x08\x39\x5d\x44\x79\x1e\xd7\xc7\x9f\x70\x49\xc7\x6f\xe3\x57\x15\x67\x46\xdf\x74\x08\x19\xfa\xe4\x87\xb0\x0e\xff\x0c\x0b\x53\x10\x74\xc5\xe1\xec\xec\xf0\x5d\x31\x6d\x3b\xcc\xb8\x20\xe1\x0a\xcf\x7e\x6a\x25\xd7\x6b\xea\x97\xc0\x20\x39\x6d\xcf\xce\x8e\x4c\x9c\xd2\x00\xa2\xf2\xd2\xd4\x93\xdf\xcd\xf7\xec\x2d\xf4\xf6\x45\xf2\x06\xe7\xde\x41\xc9\x75\x2c\x68\xcd\x50\x0c\x91\xa3\xd6\x2f\xa0\xc9\x27\x81\x1b\xa1\x8c\xf5\x88\xb5\x42\xf9\xae\x47\xa1\xad\x27\xe7\x43\xf3\x18\x8a\xf5\x9f\xe8\xf9\xbb\x73\x4b\x68\xf4\x82\x81\x97\x0a\x7c\x79\x62\x7f\xf7\xf8\x3f\xc1\x07\x84\x3c\x08\x0a\x1a\xd8\x0a\xca\xeb\xbd\x1c\x27\x09\x49\x4b\x9c\x34\x0b\x24\x9f\x45\x12\xa0\x61\x7a\x7e\x50\xd1\x69\x9b\xbc\xff\xb1\xc1\x8f\x50\xfe\xe7\x0b\xc8\xce\x44\xb1\x9d\xdb\x29\x3d\xd2\x49\x16\x3b\x67\x6a\xfd\x26\x82\x94\xe4\xa3\xfb\x0b\xb9\x6b\xcf\xb0\x22\x41\x6d\xf7\x7e\xe7\x57\x4c\x60\x54\xd5\x12\x63\x03\xa1\x03\x42\x90\x39\xf1\xf1\x61\x28\x30\x7a\x76\x55\xf8\x6c\xef\xf5\xb7\x2f\x19\x93\x95\x7e\x6c\xb2\xd1\x96\xcf\xc0\x08\x9d\xa5\x67\xc8\xfd\x05\x62\xc6\x7d\x3d\x6a\x9e\xef\x57\x9d\x1c\xcc\x06\x2b\x85\x34\xd4\x06\xeb\x6d\x43\x4d\x3b\xee\xc3\x1e\x6b\xa8\xbf\xa6\xfd\x0b\xd7\x04\x40\xb2\xa1\x10\xc1\x3a\x68\xe4\x7c\xb1\xb6\xa5\x5f\xa2\x75\xdf\x3c\x2d\xa0\x9b\x3e\x75\xad\x4f\x2b\x86\x84\x1f\xa3\x3e\x3b\x13\x9b\x2f\x63\xf1\xac\x09\x07\xa3\x5e\xc6\x31\xdd\x16\x09\xf9\x55\xf8\x94\x65\xfd\x86\x55\xa5\x2a\x08\xeb\x31\xd1\x92\x79\x54\xb6\x11\xd8\x22\xd9\x43\x8d\x75\xb2\x60\x42\x9a\x60\x7a\x24\xc1\x9c\xb8\xf8\x5b\x26\x6a\x3c\x27\x6a\xd8\x6f\x74\x8e\xec\x5c\x37\x67\xfe\x90\x36\xf9\x68\x94\xe8\x57\x8c\x07\x60\x98\x7f\x05\x99\xeb\x78\xb3\x9d\x95\x9a\x74\xf7\xeb\x9f\xb9\xde\x8f\xd2\x31\x37\x23\x27\xf5\xae\xb3\xb2\x44\x88\x07\x98\xdf\x5e\x3c\x0c\xfc\x35\xed\x9f\x38\x0c\x82\x26\xf2\x9f\x43\x97\x0c\x29\x97\x19\x91\x5e\x59\x88\x85\x77\x89\x27\x6a\x44\xa8\x4d\x94\x20\x9c\x95\x35\x41\x33\x6a\xc5\x40\x16\xc7\xc0\x7f\x3c\x04\x50\x42\x44\x74\xac\x25\xb7\x24\x16\x25\x96\xe3\xe5\xdd\x2b\x46\xbb\x6f\xa8\x8d\x5f\x26\x7f\x59\x79\x2c\x9f\x4f\xce\x23\xa5\xbf\xd3\x87\x80\xa0\x25\x28\x2a\x34\x5c\x6c\x80\x19\x4d\x61\x8b\x06\x6a\x2d\xdb\xd7\x01\x8e\x34\x5e\x7e\x6a\xee\x6d\x2d\x7e\x8e\x34\xe6\x76\xaf\x03\x20\xba\x58\x65\xb1\xb4\x4d\xd5\x9f\x0a\xfb\x93\x12\x76\x68\x83\x3f\xa8\xe0\x9d\xfa\x9f\x33\xf7\xf3\x12\x3d\x7a\x6a\x37\x38\x0f\x98\x8c\x8b\xd1\xff\xe9\xf0\xdf\x44\xa8\xf9\xf2\x34\x51\x9a\xd2\x55\x49\x2f\xfd\x6d\x82\x71\xe6\xa1\x88\xd1\x09\x87\xfa\x2b\xa5\xda\x38\x2c\xd6\x30\xa2\x55\xf7\x00\xc8\x68\xc7\xe3\x63\x0a\x09\xc0\xfa\x23\x83\xc5\x40\x1a\xb9\x33\x6e\x2a\x10\x14\xd7\xc5\x12\x38\x83\xc1\xf9\x5d\x9d\xbd\xbe\xa2\x5d\x6b\x97\x25\x32\x3b\x15\x1f\x48\x04\x90\x77\x10\xae\xc2\xd2\x38\x7e\xbe\xbc\x3d\xfe\xdc\x6e\xb0\x34\x6c\xd5\xa2\x88\xec\x33\x25\x23\x5e\x54\xb1\x81\x94\xd0\x65\x5d\xea\x93\xe4\xf6\x3e\xeb\x9b\xe8\x02\xd5\xdf\x78\xb7\x73\xd1\xbc\x0e\x6a\xd1\x90\x32\x2e\x2b\xab\x96\x12\xd9\x21\xe9\x7e\x39\x55\x31\x89\x2b\xb0\x75\x32\x6e\x65\xd9\xb6\xd2\x4b\x22\xa5\xa4\xe7\x93\xf6\xfd\xf5\xdc\xa9\xaf\xa4\x99\x22\x16\x1c\xf6\xb5\x32\xae\x08\x0c\xe8\xa7\xc2\x00\x57\x43\xbc\xae\xe5\xaa\x2a\x71\xa4\x12\x53\xb3\xfd\xd2\x5b\x21\x4b\x97\x0f\x6a\x22\xf8\xc1\xa4\x37\x41\xd8\x3a\xdd\x7e\x14\x8d\x18\x04\xe5\xb5\xb5\x35\x5c\x1a\xdb\xcf\xdf\xd1\xc6\xa2\xc0\xe1\x46\x2f\x69\x3c\x8f\x5c\xce\xec\x57\x80\x2c\x43\x21\xd6\xbe\x51\x2b\x7c\x2d\xfc\x34\xb3\x8e\x3f\x5d\xe7\xfb\x2e\xef\xb3\x3f\x9f\x26\x38\xfd\x54\xdd\x1c\xdb\xea\xfc\x29\xbe\x0b\xb1\xda\xd0\x3b\xc6\xed\xdb\x3b\x0a\xe5\x00\x73\x56\xc6\x83\x91\x1e\x91\xe0\xcf\x5f\xc1\xe0\x41\x2e\xbd\xef\x14\x07\x9a\xe5\x6d\x1f\xe1\x1c\xf0\x7e\x7d\x61\x80\xa6\x36\x9e\x01\xca\x18\x9a\x2c\xa6\x6a\x3e\x77\x09\x3e\x4f\x63\xd3\xd9\x15\x9f\x86\x9b\xfe\x74\xd4\xf7\x78\x32\x3c\x4f\x1b\x64\x0a\x1f\xc8\x94\x47\x54\x03\x38\x65\x78\xae\xd9\x2e\x4b\x7c\x02\x2f\x11\xd9\xbe\x11\x7a\x79\x67\xb9\x67\x8a\x1b\x2c\x91\x77\x25\xdb\xdc\x4d\x8b\x1d\xad\xab\xf2\x01\x8d\xa3\xf0\x8f\xa0\xd3\x6f\x8d\x9b\x7e\x34\x15\xe2\x6b\x10\xa4\x9d\x84\x6d\x6e\xcd\x5c\x0a\xc2\x41\x2b\xab\x6e\x30\xd4\xb3\xa0\x87\x01\xde\xa3\xe7\x3c\x02\x65\x86\xc8\xe9\x03\x21\x51\xab\x62\xd4\xf7\xe1\x0f\xbb\x5e\xd9\x78\x19\xdb\xbe\x81\x7d\xce\xe6\x7d\xb4\x4b\xac\x77\xc0\xe7\xcd\x2c\x63\x9a\xe9\x15\xc6\x8e\xdc\x8d\xd0\xb9\x2f\x4e\x91\xfe\xf4\x05\x70\xf2\x9e\x98\xc3\x93\x31\x95\x2d\xb1\x32\x17\xb6\x9c\x3f\x0d\xea\xee\x8f\xba\x84\x17\xb0\xe5\xe6\x24\x20\x8f\xb3\xdf\x76\xaf\x91\xd0\xea\x7c\x16\xf9\x4d\x34\x44\xe8\x88\x79\xd1\x97\x91\x1a\x28\x0b\x3b\xf2\xbe\x2a\x0b\x09\x5d\xfd\x3d\x40\x52\x75\x54\x28\x99\x6d\x1a\xc0\x7f\xe1\xfa\x7c\x6f\x9b\xb0\x98\x2d\xf0\x25\x25\xd7\xe2\x19\x30\xa5\x91\x51\x4b\x56\xee\x39\x51\x37\x06\x49\x8a\x24\x57\x9b\xdc\x42\x0f\x47\x2f\xe0\xd1\xcb\xc2\x3f\x98\x36\x95\x95\x51\x37\x2e\x9b\x3d\x0d\xba\xa6\x45\x2f\xcf\x6b\xff\x27\x9d\x1c\xd7\x6e\xe0\x05\x8f\xd9\x5d\x27\x99\x7d\x70\xc3\x88\xb2\xe0\xe7\x87\x51\x12\xbe\x9e\x94\x54\xc0\x26\xee\x3c\x6a\x32\x95\x32\x77\x9a\x26\x1f\x73\x18\x27\x47\x89\x56\x65\xb8\xa6\xc6\x26\xdc\x16\xfb\xc2\x50\x56\x11\xbe\x55\x3d\x80\xad\x3f\x51\xb0\x04\xd5\x3b\x85\x8d\xda\x44\x03\x8a\x47\xb1\xb8\x12\x6b\x6b\x2c\x2c\x5e\xde\xd1\x96\xa0\x6a\xbe\xa0\xd4\xe1\x8a\xae\xf2\x49\xb2\x20\xae\xe7\x17\x97\x30\x85\xb8\x4b\xca\x2c\x5c\xc1\x9e\xcc\xa8\xdc\x65\x4c\x98\x63\x9f\x37\x84\x2a\xd8\xd2\x16\x83\xf6\x17\xd5\x7f\x58\x4f\x96\x12\x49\xd9\xd0\xef\x55\x12\xf7\xc9\x39\xd0\xdf\x8a\x43\xa4\x31\x6a\x88\x4d\x17\x64\x16\xc5\xe4\x4a\x09\xbe\xbe\xcf\x07\x34\x15\x78\x6b\xe8\xd0\x6c\xf1\x4c\x9c\x8c\xa0\x31\x3d\xf3\xc3\x0f\x57\xdb\x30\xf7\xc5\xcc\x57\x92\xc6\x02\x3e\x9d\x8f\xd3\x46\x55\x00\x01\xa0\xe8\x33\x9d\x67\x5c\x88\x34\xbf\xbe\x35\x09\x75\xb6\xf3\xbe\x51\xfc\x60\x4a\xc5\xdb\x02\x4d\xc7\x7d\x62\x4b\x29\x3e\x24\x34\xe8\xfc\x24\xe9\x95\x54\x27\x5d\x69\x2b\x55\x70\x9c\x1c\x5f\xff\xaa\x2c\xa3\xd9\xf9\xc5\xb7\xb3\x9f\x24\x19\xb4\xdf\x0a\x02\xbe\xa2\x7f\x74\xf9\x0f\x4f\xb6\x88\x8c\x9a\xd0\x61\x9f\x02\x4c\x2d\x27\xdf\xa9\x76\xb0\xd1\x77\x91\xc9\x2d\xd2\x0c\x89\x54\x9d\x49\x26\x52\xf9\xbb\xb3\x8e\xf5\x27\x4d\x43\x5a\x22\x11\x1c\x2e\xf7\xad\x9b\xc4\x49\xbf\x40\x34\x77\x62\x62\xa6\xed\xa8\xbf\xf0\x46\xec\x59\xef\xb4\x3d\x5b\xa3\xe5\x61\x00\x48\x4c\x7c\x71\x56\x42\x54\x8b\x89\x04\x83\x82\xcb\x91\xde\x30\xb4\xb6\xbd\x57\x44\xf7\xcf\x2e\x37\x33\x68\x37\x21\x74\x8b\x86\x03\xd2\xa5\x7e\x07\x72\x67\x57\xbd\x42\x40\x4c\x27\x21\x62\x9c\x90\x55\xac\x57\x27\xc5\xc0\x5c\x47\x33\xf7\xa5\xbd\x51\x3a\x74\x0d\x66\xef\x00\xbb\x50\xee\x5d\xcc\x0c\x73\x3c\x0c\x35\x72\x11\xad\x06\xc0\xc4\xb6\x65\xde\x55\xed\x8e\x27\xb8\xcb\xbc\xf5\x10\x9f\x4e\x85\x93\x02\xb2\xf5\xa4\x04\xde\x34\x26\xb0\x0c\x35\x34\x76\x4b\x56\xd3\xec\x67\xc9\x40\x1f\x5d\x21\xeb\xed\x16\xf9\x2d\x0a\x5b\x3e\xaf\x66\x8a\xa3\x03\x63\x4c\x2f\xdc\x50\x97\x12\xe3\x47\xb2\x67\xf2\x50\xcf\x4c\xf9\x15\x1d\xe4\x55\xfb\x4d\x2e\x7e\x10\xf8\xec\x9b\x9f\xe5\xb7\x33\x4b\x3f\x0d\x6a\x6d\xda\xbf\x55\xa4\xbe\x52\x65\x59\x51\x3c\xa3\x5d\x0c\x15\xf6\x6c\x95\x5e\xcc\xc2\x3c\x9c\x49\xb4\x4f\xbd\xec\x71\xda\x01\x07\x58\x52\xab\x25\x68\xd2\xdb\x2b\x06\xe9\xc6\xaf\x18\x45\xc2\x24\xe7\xc3\x72\x39\x6e\xa7\xf9\xbd\xe9\xb1\x15\x28\x78\x77\x5f\x3c\x22\x56\x9f\x06\xf5\x6e\xda\x89\x80\xa8\x52\xdd\x28\x7c\x39\x9f\xba\x0b\x5a\x88\x1c\x5a\x27\x60\xc9\x92\xde\x4c\xd7\x9e\xc7\x74\x7e\x86\x8c\x7b\xff\x24\xf9\x30\x78\xf5\x33\x70\xf1\x47\xb4\xb5\x3d\x24\xf4\x24\x85\x09\xfd\x2b\xe6\xdb\xb9\x13\x0c\xe6\xef\x8f\x9f\x58\x0a\xfa\x71\xdd\xc0\xde\x7e\xe5\x6b\x54\xc7\x98\xb5\x8a\x58\xcb\x39\x41\xdf\x9f\xaf\x38\x25\xdd\xe8\xbf\x0c\x5a\xb2\xc0\xf5\xeb\xf3\xaa\x67\x65\xd4\x41\x02\xa8\xc1\x0e\x19\xb7\xf1\xd2\x1e\x13\xab\xca\x28\xc5\xfa\x25\x9d\x49\xd9\x26\xe3\xfb\xd4\x64\x92\x12\x98\xf7\x13\x03\x7b\xb3\xaa\xbe\xa3\x03\x83\x22\x2e\x54\xaf\xa0\xfc\x9a\xed\xf4\x74\x6f\x6a\xfa\xa8\xbd\x1e\xed\xb6\xc0\xee\x81\xb8\x82\x2c\x4c\xb1\xcb\x5f\x14\xe0\xbc\xa7\x0c\x54\x44\xe2\x66\xbc\xee\x30\x25\x82\x95\x1b\x1c\x9f\xe4\x50\x97\xb0\x96\xfe\x83\x0d\xaf\x65\x8f\x6c\xf8\xcd\x9c\xab\x5a\xf7\xb3\x2f\x0c\xb8\xf9\x56\x25\x2a\x8f\xe1\x8f\x1a\xaf\x3e\x22\x77\x33\xcb\xaa\xe7\x15\xb5\xb6\x30\xd5\xbe\x4f\xe3\x47\xb1\xb2\x87\x7f\xc1\xfb\x56\xbf\x04\xc8\xa6\x99\x93\x5a\x0e\x35\x83\x7d\x90\x88\x42\x32\x37\x2e\x38\xd5\xea\x7b\xf4\x0f\x13\x23\xb5\x97\x2f\x42\x6f\x39\x7f\x91\x75\x00\x72\x9f\xe3\x51\x5c\xf9\x3e\xf3\xd2\xa2\x0e\xd7\xbb\xb6\x92\xad\xea\x4d\x6a\xf7\x75\x3a\xb9\x25\x18\x74\xb2\x9f\xf0\x71\xdd\x36\x0c\x67\x06\x8f\x53\xb4\x7a\xd1\x49\xab\x3b\xc3\x04\x79\x99\xd7\x4e\x59\x7b\x95\x2c\x97\x82\xc9\xba\x29\x29\xe9\xaf\x6a\x28\xe5\x50\xf7\x80\x5c\x31\xff\x3b\x0c\x6a\x0e\x5c\x65\x15\x32\xbf\xb1\x8f\x96\xee\xec\x89\xa9\x85\x72\xac\x5f\xac\xde\x67\x42\x87\xf4\x22\x89\xa5\xbc\xde\x06\x8b\xd2\x6a\x61\x13\xdf\x49\x79\xa0\x65\xb9\x0b\x4d\x1a\x37\x44\xad\x87\x0d\xf8\xfb\xbc\xd7\x3f\xdc\xef\x14\x70\x7c\x95\xe8\xb8\x08\xec\xd3\xbe\xd4\x72\x06\x1c\x3b\xb2\x47\x74\x81\x08\xf8\x8b\x5d\x6a\x3b\xa2\x0b\x91\x0e\x05\x92\xfc\xa0\xf6\xb6\x29\xed\x1e\xb6\x2b\x33\xc0\x26\x0a\x26\x9e\xcc\x5b\x43\x9a\x4f\x5f\x51\xb5\x1e\x45\xaf\xfa\xe9\xb2\xb4\xb5\xed\xd0\x26\xd8\xb0\x8e\xaa\xeb\xea\xc2\x23\xea\x81\x46\x21\xfd\xc2\x50\xc8\xfa\x38\xdf\x5c\x1f\xe1\x1b\xf3\x30\xa6\xa8\x62\x5b\x7e\xf3\x61\x4f\xd1\x31\xe4\x4d\x6f\x62\xe6\x39\x79\xf3\x00\x14\x72\x4b\xdd\xcb\xad\xf7\xfa\xda\xef\xf7\x4a\xa3\xaf\x50\x78\x48\xb5\x29\xed\x7b\xed\xf1\x02\x82\x0b\x92\x53\x2f\xc3\xf7\xfe\x1c\xe5\x83\x0b\x45\xd9\xc4\xc3\xa8\xfb\x6d\xa2\x3d\x81\x51\x4b\xcf\x6c\xd6\x92\xc6\xb9\x38\xf0\x52\x81\xc2\x76\xd8\x35\xe2\xb6\x09\x41\x2f\x81\x0c\x10\xa5\x9e\xb5\xd4\xdd\x5b\x19\x20\x5b\x31\x7c\x5d\x9a\x2b\x1f\xee\xb0\x31\xfc\x22\x9c\x8c\x96\xbd\x39\xd0\x26\xe1\x65\x1b\xab\x73\x22\xd0\x04\x72\x78\x6b\x8e\xc4\x7a\x90\x22\x2c\x6f\x9e\x9b\xe8\x8a\x2d\xfe\x05\x3f\x04\xf1\x05\x37\x4b\x58\xd2\x41\x5a\x8d\xe1\xe0\x0c\x70\xa0\xf9\x85\x88\x1e\x1e\x39\xde\x5d\x67\x35\xb1\x5d\x52\xdd\x09\xf7\xbe\xc0\x92\xdf\x64\xe4\xef\x0a\xfe\xdd\x83\xb7\xea\xe6\xf6\x75\x03\x54\x15\xe5\xc5\x6f\x99\xe0\x3c\x55\x31\xfb\xfd\x06\x52\x75\x3b\x89\x16\xf1\x67\xf7\x33\xb8\x33\x96\x63\x01\xb2\xa3\x4b\xcd\xd0\x9c\x26\x80\x4f\x86\xe1\x77\x56\x84\xc7\x31\xb6\x61\x23\x3d\x69\x20\x3f\xfb\x5b\xc3\x84\xdc\x71\xb2\xb5\x13\x6e\xa5\xb3\xdb\x9b\x40\x80\x00\xe4\x9e\x7f\x67\x74\x1d\xe5\x45\xa4\xaf\xed\xfd\x3c\x40\x63\xef\xd5\xd2\xc2\xf5\xb9\x14\x71\x5c\x50\x62\x98\xc4\x97\x0e\x63\x1c\x0b\x6d\xa0\xd0\x71\xc8\x87\x1f\x0d\x17\x66\xce\xab\xad\x01\x87\x80\xc0\x4f\xf4\xc3\x59\xf7\xc2\x16\x15\xf5\x3b\x6c\x2b\x13\x9f\x02\x6a\x22\xee\x28\x00\x21\xf9\x2b\xdd\xb2\xf6\xc4\xd2\x06\xa0\x7b\xc4\xb9\xb2\xfd\x0e\x8c\xf0\xad\xc8\x90\x7f\x78\x29\xf4\xb2\xf0\xe8\x57\xff\x30\x77\xea\x5f\xf6\x97\x7f\x21\x99\x00\x71\x7c\x18\x90\xc3\xaa\x97\x89\x93\xa5\x56\x60\xc5\xbc\xef\x5e\x7f\xee\x73\xe0\xbb\x36\xb2\x88\x42\x27\x53\x42\xa8\x26\xdc\x4b\x62\x6c\x71\x64\x4a\xf0\x05\xde\x6f\xdf\x06\x96\xf9\x50\x39\xf6\x6a\x0f\xf5\xd2\xc6\x44\x24\x7b\x13\x01\x91\xdb\x7a\xcf\xe0\x21\x04\xa6\xed\xc8\xd7\x3d\xae\x19\xac\xca\xb8\xfd\x39\xe6\x31\x0d\xb3\x73\xc8\x1e\x97\x5c\xdf\x1e\xfd\x85\x2b\xfc\xcc\x88\xe3\x72\xa9\x32\x73\x71\x5e\x6a\xe4\x95\x04\x14\x58\xc6\x72\x1d\x89\x83\xcc\x2a\xb0\xa4\xd2\x1a\x9e\x98\x87\x9d\xb1\xd7\x23\xd7\x4b\x30\x57\x05\xb1\xd9\xde\x4a\xda\x74\xb6\x13\x53\x04\x43\x09\x6c\xa8\xe9\xbb\xd0\x5a\x5f\x70\xb2\xe3\x28\x9c\x6d\xb7\xe6\x22\x9c\xbd\x88\x39\x57\x83\xa4\xd3\x4a\x1c\x0f\x61\x8b\xed\x96\xff\xf6\x42\xfa\xd7\x8d\x1a\x00\xa1\x84\xa2\x46\x01\x7a\x21\xb9\x7d\xd9\x57\xab\x42\x18\x25\x9e\x8b\xf2\x58\x4f\xaa\xcf\x4f\x23\x69\x0a\x37\x2d\x86\x6a\x5c\xe6\x64\xe3\xd2\x22\x63\xe2\xa1\x07\x94\xc0\x4f\xec\xb4\x84\x0f\x59\x20\xe9\xe8\xda\x99\x2c\x6f\x30\xa7\x93\xef\x0c\x68\x53\x76\xca\x46\x28\x15\x1a\xf6\x5a\x2f\x27\xef\x07\x44\x6b\x2d\x87\x3f\x1b\xbe\xb7\xe8\x26\x76\xb6\x5d\x44\x76\xd5\xe1\x4c\xca\x08\xaa\xd3\x17\xb5\x46\x91\x34\x50\x9b\x3e\x3a\x64\x14\x03\x44\xa3\xf1\x50\x72\x5c\x24\x0e\x1a\x7c\x8a\xd8\xd3\xaf\xa4\x7c\xb5\x39\xd1\x1c\x1e\xf9\x3c\x57\xb1\xd0\x5c\x90\xd7\x9b\x71\x1c\xc1\x1e\xed\xe6\xf4\xc3\x1b\xe1\xd7\x2f\x53\xf7\x0d\x88\x82\xbb\x91\x33\xb4\x54\x9a\xbb\x6a\x03\x27\x7f\x76\x9b\xe7\x23\x30\xc5\x0c\x63\x80\x2e\xec\xc1\xaa\xfd\x0d\x1c\xbe\x2f\xc7\xc4\x5b\x0f\xbd\xb5\x97\x1b\xb8\xbd\x72\xc6\x12\xbf\xea\x13\xec\x7f\xa5\x7f\xaf\x17\x1c\x44\x00\x09\xc2\xd4\xa5\xd6\xa7\xc4\x23\x52\x0e\xbf\xd3\x62\xe9\x75\x04\x30\x0e\xa6\x07\x0a\x95\xb3\xf4\xe3\x5e\x20\x1d\xf8\xa4\x0d\x6b\x78\xb3\xff\x0d\x1b\xfe\x0b\x03\x04\x88\xfb\x41\x85\x01\xbe\x90\xc3\xe7\xcc\x7d\xf5\xf0\xe1\x6a\xdd\x94\x53\xcf\x19\xb3\xd5\x85\x10\x2b\x5a\xfd\x73\x03\xd5\xe3\xc8\xe2\x44\xb5\xa4\x84\x54\x30\xaa\x54\xdd\x67\x64\x59\x6e\x56\x58\x71\x05\xe5\x1c\x5d\x5d\x35\xe4\x28\xcb\xc8\xa8\x89\x76\x32\x3b\x25\xab\x02\x83\xb9\x35\x09\x0d\x3e\x26\x0b\x53\xac\xc4\xb8\xeb\x9c\x69\x90\x88\x11\x2c\x68\x98\xef\xbb\x51\x0b\x08\x5b\x9f\x5d\xfb\x43\xbf\x93\xa3\x36\xbb\xb9\x45\xe7\x02\x44\x8f\x36\xbe\x21\xd0\x54\x4f\xa9\xad\xe6\x6c\x98\x11\x39\x47\x8d\xe6\xc6\x58\x14\x1b\x49\x9a\xb6\x65\x04\x0f\x8f\xad\x9e\x19\xf6\xff\xad\x93\xfa\xd7\x05\x13\x00\x21\x24\xc7\x04\xb3\x1b\x45\xd2\xec\x51\x11\xb2\xd7\xb6\x6f\x0c\x97\xb9\xbf\x16\x29\x58\x12\x04\xdd\x15\x7e\x18\x3a\xa7\xb3\xbf\x67\x8f\x52\xd7\x72\x01\xe3\x0e\xce\xd0\x2f\x6e\xec\x7b\xaf\xda\x4b\x4d\x05\x2c\xde\xb2\x85\xfa\x7f\xca\x8f\x1b\x5e\x35\x9b\xc1\xfc\x46\xb7\x89\xd0\xb9\x78\x41\x0e\x88\x12\xee\x61\xc2\xd4\x64\xa9\xc0\x7c\xed\xcd\x1f\x84\x3b\xe5\xb3\x93\x48\x9a\x55\x3d\x58\x3b\xa0\xec\x76\xba\x1b\x5a\x4f\x7c\x09\x16\x0e\x4e\xe8\xbe\xb9\x5a\x7a\x89\xe9\xb1\xf9\xf6\xf9\xea\xe4\x3b\x38\x46\xd6\xaf\x9f\x24\x7e\x15\xbb\x4f\x68\xc2\xe2\xf6\x45\x74\x2e\xfc\xa7\x09\x20\xc1\x00\x53\xf2\x1f\xbf\x82\xb7\x65\x1a\x17\xb5\xc4\xd3\xd4\x63\x65\x22\x86\x87\xe3\xe4\xd4\x23\xc7\x33\x50\xe2\x01\x0d\x60\xc8\x5d\x66\x7c\x6f\x33\xf2\xa5\x5e\x92\x1a\xee\x87\x31\xd3\x7e\x0f\x85\x03\x31\xa9\x8c\x4e\x59\x45\x1a\x12\x1b\x52\x84\x57\xc4\x32\x52\x7f\xcf\x9a\x7f\x1d\xf4\x01\xe2\x94\xa1\xe0\x59\x93\x73\x16\x5a\x7e\xf7\xa7\xab\x48\x48\x7f\x55\x0d\xb5\xb9\x21\x94\xff\xc2\x2f\xc9\x2f\xad\x90\xa2\x87\x77\x05\xfe\x21\x76\x9a\x07\xd0\x81\x21\xf1\xa7\x06\xa3\x85\x46\x13\xd6\x33\x5d\xa2\xec\xe4\xef\x0c\x9d\x8f\xeb\x24\xab\x55\xcc\x08\xa9\x8e\xf7\xce\x90\x6f\xd0\x60\x9b\xb8\xf7\x17\xa4\xcf\xd9\x8f\x22\xd7\x2d\x04\x8d\x66\x6c\xeb\xa9\x74\xa9\xe3\x18\x0b\xd9\xe9\x8f\x83\xec\x39\xd2\x77\x3e\xf0\x22\xc2\x02\xa2\x9d\xd3\xe6\xba\x54\x25\xfb\xf4\x1c\xdf\x43\x2e\x92\xca\x47\x43\x72\xf1\x36\xe7\xd2\xf1\xfc\x96\x9a\xfc\x35\x98\xa9\x64\x97\x69\x01\xd1\xe9\x12\xea\x6f\x44\x08\x02\x0f\x46\xe3\xbe\xe5\x5f\x3a\xa3\x48\x8e\x24\x0d\x9e\x75\x90\x1d\x0f\x19\x9f\x74\x0b\x4c\x24\x10\xab\xfd\x9d\x84\x7f\x5e\x61\x10\x3f\x28\x28\x1c\xe0\x87\xd0\x92\x0d\x5f\x48\x69\x15\x94\xeb\x4e\x74\x1c\x4d\xa7\x58\x51\x08\xab\xed\x66\xf5\xee\x0a\x5b\x62\x7e\x6b\x54\x4f\xb3\x43\x02\xe6\x10\x85\x99\xae\x65\x14\x56\xff\xe0\x9d\xa2\x5f\x1d\x42\x38\xd1\xf6\x7c\xde\x43\xf5\xf1\x19\x53\x6a\x6b\x3e\xa3\x07\xb4\x55\x79\x05\xc8\xa7\x96\x5f\x08\x37\x6b\x91\xef\x66\x2b\xe7\xbb\x71\x56\x30\x8d\xce\xa9\x2b\x55\xe8\xa3\x4e\xfb\x03\xa9\xa6\x0a\xca\xbd\xff\x7b\x36\xd8\x4f\x39\x81\x97\xf8\xc3\xf7\x9a\x99\x4d\xf8\x67\x0e\xba\xd4\x8f\x19\x64\x91\x61\xbd\xe2\xd0\x71\x33\xc5\x5d\x61\x72\xda\xc4\x61\xed\xb7\xc0\x63\xe1\xa1\xfc\xde\xcb\x3f\x87\x5a\xe1\xd4\xf9\x71\x2b\xd4\xac\xf5\x2c\x6e\x31\x14\x6f\x5f\x63\xf6\x53\x19\x5a\x9c\x35\x17\x8c\x5b\xfe\xfd\x75\xfe\x75\x8f\x06\x40\x42\xe1\xd6\xc0\x12\xc3\x1b\x3b\xf6\x7b\x7a\x97\x3a\xfd\xc7\xa2\xe6\x61\x2a\x22\xf7\x76\xcd\xa5\xc9\x69\x7b\xc2\x08\x2e\x6f\x3a\xa8\x47\x9b\x88\x13\x90\x73\x8c\x54\x29\xf6\xa4\x39\xa1\x4c\x5f\xbd\x8d\x48\xad\x61\xe7\x62\x26\x3a\xaa\xd1\x7c\xed\x1b\xcf\xb3\xe3\x84\xec\x7c\x6a\xec\x12\xb0\xe4\x95\x7b\xf9\x61\x84\x9f\xd9\x5c\x7a\xbb\x02\x6a\x99\xba\x55\x26\xc8\x03\x77\x13\x31\xc8\xbb\x33\xc2\xf8\xd3\xb8\x79\x71\xde\xda\x7f\x9a\xf5\x15\x55\xeb\x5d\x70\x2b\x2b\x3d\xd7\x89\x8d\x9f\x08\x6e\x7d\xe7\x96\xb3\xd8\x6f\x1b\x6f\xb7\x07\x9d\x79\x0b\x4f\x83\xc4\x0f\xf2\xcf\xc5\x3f\xa8\xa5\x5a\x94\x15\x0b\x3c\xc7\x72\x11\xc8\x51\xaf\xd1\xb9\xb8\x3f\xb7\x3e\x48\x64\xaf\x68\xf8\x51\xe0\x6a\x5c\x3f\x0f\xd6\xe1\x29\xbf\x3a\x36\xfa\x54\xe9\x47\xc1\x62\xe0\x75\xcd\x05\xef\xba\xa3\x22\x36\xbd\x3b\x2b\x53\x15\xa8\xa5\x39\xe9\x78\xbf\xd7\x45\x70\x31\xfe\x3f\x71\x97\x77\x13\x8c\x38\x8d\xe2\x7d\xb8\x5f\x2d\xc7\xd2\xad\x06\xb5\x32\x0d\xbf\x35\x90\x30\x3d\xaf\x0b\x59\x38\x25\xe2\x2f\x6d\x3c\x74\x0e\x80\xf8\x3e\x3e\x3e\xa6\x80\x58\x69\x47\xe8\x84\xdf\x49\x1b\xe9\x54\xea\x8a\xc5\x2e\xe0\xac\x6b\x0c\xde\x69\xc2\xbb\xfb\x4c\x1f\x5e\x5e\x6c\x5f\xd4\xf6\x51\xd2\x09\x38\x1c\x1d\x95\xad\xd2\x85\xa4\xbb\x54\x04\xaf\xd2\xb8\x0f\xa7\xe6\x4d\xec\x46\xe1\x05\x63\xe9\x76\x1a\xfb\xa1\x0e\x91\x91\x74\x41\x00\xea\x5d\x11\x4a\x37\xfc\x05\x31\x7d\x63\xdc\x68\x13\x43\x38\xd3\xcd\x81\xf8\x8d\xf5\x99\x69\xc3\x03\xf9\x10\xb4\x2e\x8e\xde\x7b\x80\x6e\x7b\xe8\xd8\x92\xc1\x8e\xb3\x41\xe4\xf8\xde\x7a\xca\xef\x2c\xb0\x79\x28\x64\x62\x0f\xc5\x20\x35\xe5\x65\x37\x5d\xeb\xad\xb0\xab\x2e\x00\x80\x2c\x62\xc9\x1f\x6d\x3e\x34\x2b\x2b\x7d\x9b\xa9\x53\xfc\xe8\x72\x72\x58\x59\xd9\x94\x22\x41\xbe\x43\xdf\x13\xf3\x60\x88\x1b\xd0\x04\x38\x9f\xd5\x09\x48\xb2\x3b\xee\x7c\x31\xfe\x9f\x66\x6b\xaa\xc4\x13\x49\x10\x61\xd4\xee\xac\xab\xdd\x69\xfa\xd7\xbc\x45\xf7\xae\x00\xbe\xdf\x9f\xfe\x19\xba\x18\x96\xb9\x4c\xb8\x32\x68\x1e\x14\xde\xd6\x37\x03\x50\x5a\xec\x29\xc6\x82\x5c\xf4\x4a\x6f\xcc\x88\x22\xd0\xe8\x41\x54\x47\x9d\xdc\xa8\x5c\x6d\x97\xb0\xbb\xc2\x26\x50\xec\x1e\xc8\x61\xb0\xfb\xa5\x50\x8e\xc2\xe2\xfb\x49\x5d\x92\x82\xaf\x52\xca\x41\x15\xf8\xc4\xba\xf2\xfa\x1b\x03\x1f\x11\x7d\xb2\xbf\x17\x36\x05\x6d\x43\xfe\xf2\x25\xba\xe0\x27\xc9\x0f\x2a\xe3\x97\x9b\xf3\x30\x11\xf7\xa0\x53\xa3\x33\xed\x01\x2d\x8e\xeb\xd0\x6b\xff\xdd\xa5\xc5\xf2\xb8\xc7\x6e\xb9\x1a\xaa\x9c\x3d\x81\xaa\xfc\x8a\x9b\xfa\x84\xfa\x82\xed\x49\xd5\xae\xf6\xf3\xcd\x9c\x65\x75\x07\x4e\xd4\xdc\x4a\x71\xa3\x94\xf7\xed\x98\x88\x6c\x59\xfa\x1c\x41\xf0\x1e\x97\x25\xcc\xd5\x3b\x14\x60\x86\x81\x79\xfd\x91\x16\x6e\x09\xe9\xa0\xc9\x27\x4b\x19\x1d\x44\x72\xe1\x1f\x69\x7a\x92\x53\x5b\x7d\x6a\x3e\xf1\x34\x6d\x1c\xdf\x01\x9f\x0e\xdf\xb5\x08\x1e\xc6\xc5\x83\xf7\x0f\xc3\xf8\xf4\xa5\xf0\xf4\xdb\xe5\x65\x36\xc5\xcc\x17\x67\xcc\xd0\x8b\xef\xd7\xe2\xed\x17\xc0\x52\x35\x01\x61\xae\xec\xc2\x00\xdb\xf7\x7b\xd2\x5f\x75\xbb\xbd\x48\x76\x42\x33\x9e\x39\x23\x9c\x0f\x26\x9c\x1e\xd8\x6d\x3c\x5c\x9b\x31\x3d\x0d\x6a\x52\xa8\x35\xbe\xeb\x5f\xd1\x85\xe2\x21\x55\x7a\x88\x3d\x19\xe3\x46\x8b\x3b\x87\xce\xbb\x6f\xbc\xe1\x08\x87\x83\x6d\xf2\x69\x12\x58\xa8\x54\xb6\xca\x8f\xe2\x04\x8e\x98\x15\xfe\x2e\x0f\xdd\x88\x93\x5b\xc3\xfc\x9c\x52\xd4\x28\x2a\x05\x16\x66\xa6\x96\xb4\x2d\x61\xe0\xf4\xaf\x14\xe0\xf0\xbe\x3b\x8a\x64\x65\x82\x3d\x5b\x4b\xdf\xbb\xcf\xe7\x0c\x61\xd9\x55\xfd\x28\xf9\xad\x4f\xe7\x42\xbd\xb3\x39\xbe\x1d\x10\x9d\x91\x14\x11\x3b\x6b\x9a\xa8\xb2\x32\xbf\xb4\x9c\x92\x4d\xdf\x94\xd0\xea\x2f\x7a\x84\xb2\x6e\xf7\xbe\x09\xe3\x9d\xc4\x65\xdb\x01\x44\x39\xdd\xd0\xe5\xf8\x84\x38\x23\xf7\xd0\xe5\x47\x1c\x6b\x8d\x84\xd6\x4c\xad\xd1\xe7\x20\x2b\x05\xce\x5c\x08\x0a\xce\x81\x1a\x60\xe3\xc1\x4e\xfd\xcf\xba\xc1\x27\x2f\x3e\xb2\x3a\x98\x41\xef\x7a\x52\x91\xa8\x58\x9d\x5b\x63\x41\xab\x2e\xa7\x72\x07\x76\x60\xe3\xd1\x96\x83\x15\x60\x48\x0a\x65\xfc\xd8\x0a\x02\xcf\xc8\x7c\x12\x2e\x87\xc9\xaf\xf5\xac\x13\x07\x18\xc3\xdf\x48\x17\x1f\xe6\xc1\x2d\xb1\x38\x2c\x01\xa2\x5e\xe9\x8e\x87\x14\xf6\x82\xdf\x22\xcb\x6a\xe6\x62\xb9\xc7\x96\xdd\x9f\x11\xb3\xf2\xd4\x3d\x60\xe1\x06\x13\xa2\x5a\x68\xa0\x7b\x3c\xad\xaa\xdb\x5d\xb3\x70\xb9\xa5\xc4\x37\xcc\x9f\xfc\x2d\xbc\x88\x78\x89\x6f\x3b\xfd\x9c\x8f\xbe\x0c\x15\x48\x64\xcf\x51\x34\x89\x35\x08\x03\x1d\x46\x46\x03\x6e\x3c\x1a\x8f\x22\x2c\xee\x4e\xbc\x8c\x05\xd8\x71\x9d\xbc\xf0\x0b\xec\xb8\xa8\x82\x9e\x45\x74\xad\x2c\x71\x88\x8e\x83\xd3\xea\x77\xec\xf7\x75\x54\x22\x14\x2e\xbb\x7d\xa3\x2c\xaa\x8e\x9c\xf1\xc4\x50\xe0\x32\xec\xa8\x2a\x2d\xd1\x39\xeb\x92\xe3\x47\x55\xc9\xd3\x06\x50\x31\x33\x9b\xc1\xd4\x2c\x1c\xf0\xf2\xbb\xa5\x34\x1e\x48\x7e\xaf\x65\x92\x92\x64\xf1\x8a\xb0\xa6\xbc\xf2\x8d\x0c\xe4\x7e\xe9\x0a\xc8\x2c\x76\x40\xe2\x8a\x25\xe0\x65\x65\xf7\xe3\x38\x66\xfc\xf3\x8a\x67\x05\x6d\x79\x59\xe6\x06\xbe\x06\x9d\x65\x62\xf1\x60\xad\x16\x60\xbb\x3f\x22\x2a\x31\xf9\xf0\x36\xe2\xaa\x0e\xc9\xe6\x10\x27\xd7\x25\x09\x77\xf7\xeb\xe4\x9f\x72\xff\xc1\xad\x07\x12\x7c\x5a\x7a\x4f\x14\x60\xff\x51\x31\x19\x1a\x32\x58\x1c\xce\x7a\xa4\x67\xcf\x2c\xfd\xd4\xc3\x2b\x1d\xb3\x1a\x0a\xca\x3c\x34\xe2\x2e\x32\x78\x8c\xf9\x88\x99\x0e\x90\x6c\xf5\x8f\x10\x8f\x92\x04\xa0\x29\x60\x23\xfe\x21\x4c\x80\xda\xa6\xb2\xe7\x35\xfd\x65\xaf\x67\xec\xa3\x91\x68\xa5\x4f\xfc\x8d\x03\x28\x95\x7b\x59\x38\xc5\xe0\x79\x3c\x71\x72\xff\x68\x54\xab\xfd\x7c\x19\x4a\x50\xcb\xc7\x22\x93\x34\x52\xf8\x2a\x3c\x80\xf5\x5d\x3d\x48\xf4\x12\x9e\x9e\x71\x4b\x8c\x2b\xaa\xa9\x58\x83\xb3\xf3\x93\x50\xab\x82\x08\x45\xe9\x71\x73\x5a\x0a\xf3\xd5\x10\x79\xe4\x51\x27\x5a\x2d\x10\xd2\x70\xfc\xe3\x5b\x83\x56\x9a\xfb\xfc\x4c\xe6\xd7\xa7\xda\xcf\x61\x10\xf7\x38\x5d\xa2\x2b\x26\x2e\xd4\xba\x98\xc6\xbe\x71\xa4\xdf\xe0\xec\x13\xfb\xc4\xe0\x0b\xb7\x8b\x56\x74\x7f\x5e\xcf\xf8\x1a\x4b\xa3\xef\x6a\x58\xa2\x62\xc2\x58\x21\x77\x8f\xcb\xa3\x5f\x94\x89\xfa\xfa\xe9\xfb\x7a\xef\xda\x97\x70\x79\x54\xfb\x3a\x0c\xe5\x02\x82\x44\xef\x9c\x1b\x11\xa6\x53\x66\x73\x58\x3f\xdb\xb5\xc1\x05\x65\x05\xcf\xc5\x02\x6c\x64\xc1\xdc\x2d\xb6\x26\xe1\x06\xaa\xf0\xb2\x42\x27\xed\x2a\xf1\x2e\xe7\x8b\x8a\xb8\x8f\xcb\x6b\xd6\x58\x43\x63\xf8\x08\x72\xc7\xc0\x9c\xa6\x4b\x2b\x91\xd1\x0e\xb0\x0c\xf9\x0f\x5f\xf9\xf1\x33\xdf\xb0\xf0\x86\x3b\x4d\x18\x4d\x7a\xe5\x4f\x7d\x71\x90\xf7\x58\xbb\x02\xba\x84\x4d\xb6\x58\x6d\x0e\xbf\xf3\xa8\xdc\x12\x0c\x27\xac\x4b\xf9\xec\xd1\x5c\x66\xea\x6e\xe2\xca\x6e\xdd\xf9\x3e\x5b\x80\xd7\x70\x19\xc8\x84\x3a\xe6\x08\xfa\x33\x5f\x09\x99\x6b\xfd\x49\x76\xb3\x38\xb1\x18\x3c\x80\xe9\xc5\x0c\xa7\x93\xdd\xfb\xb3\xfd\xbb\x77\x18\xfe\x7e\x35\x30\xa7\x70\x52\xd3\x2a\x70\x93\x08\x66\xb9\x2b\x9a\xf9\x30\xdc\xf9\xd0\xdf\xa2\x5a\x71\x72\xc4\xe0\xe3\x1d\x67\x6f\x25\x7c\x5f\x27\x89\x3e\x0d\x4a\x89\xbc\x91\x16\xa2\xe9\xc0\x96\x14\x8a\x71\xa7\x88\x7d\x97\x6d\x9e\xe8\x2f\x3c\x24\x43\xe7\xd7\x56\x1e\x5c\x92\x9e\x19\x0c\xa6\x37\x31\x7e\xd2\xa1\xfa\xa5\x14\x8e\x80\x07\x97\x8e\x13\xec\x4d\x89\xff\x61\x5c\x56\x79\x91\x7f\xf2\x74\xa9\x75\x5e\xd5\xd9\x7f\x3c\xfe\x69\x50\x26\x79\x0d\x9f\x15\xa2\xb2\xaf\x19\x96\xb9\x3b\x42\x2d\xde\x23\x8f\xcc\xd0\x51\x88\x99\x3a\x93\xe2\x0e\x4b\x7c\x4d\x42\xcf\x81\x4c\xa4\xcd\x81\x8a\xb0\x43\xfb\x00\xe9\x7e\x1e\xd7\xc6\x9e\x29\x9e\x0c\xee\x3e\x06\x43\x35\xbb\x39\x22\x8a\x0d\x68\xf7\x5b\x02\x64\x14\x70\x49\x7f\x63\xd1\x61\x70\xb9\x33\xbd\x1e\x12\xea\xe3\x62\x89\xb2\xb9\x67\x3e\xab\x14\xd3\x1f\xa4\x7f\x6b\xaf\x92\x2c\x15\xa9\xe0\x19\xfd\xa4\x69\x24\xc2\x5d\x5e\xf7\x2f\x5c\x86\xcf\x5a\x79\xed\xb3\x3d\x5c\x48\x75\xaa\xcf\x27\xc3\x57\x53\x1a\x15\x06\x87\x57\x24\x69\x76\x80\x76\xbd\xf9\xed\x3b\xeb\x91\x6b\xaf\xf1\x5d\x4c\xd1\x92\xd7\x1a\xa0\x1e\xea\x04\x62\x99\xee\x8a\xdf\x09\x51\x8d\x4c\x24\xcf\x66\xbb\xa8\x3c\x49\x96\x36\xc8\x72\x25\xad\x58\x52\xc4\xee\x1e\x36\xae\x7d\x87\x4a\x5f\x9c\x17\xbf\x39\x91\xa4\x8f\xf2\x64\xb9\x6f\xfd\xb8\x2d\xed\x00\xb6\x2f\x98\xda\xff\x7c\xa4\x91\xc0\x8f\x60\x87\x9f\xe0\x92\x37\x3b\x55\x11\xd0\x63\x9b\xeb\xf6\x0c\x7f\xb9\xd4\xad\x9e\x99\xb0\x9a\xe0\x69\x50\x86\xcd\xb1\x90\xc9\x28\xfa\x9b\x49\xbd\xd4\xf9\x45\x54\x86\x3d\x17\x83\x86\xc5\x68\xb4\xa8\xc6\xe4\xbe\x5f\x42\xaf\x96\x83\xdf\x00\x83\x36\x0a\x9c\xea\xc9\xdd\x16\xbd\x78\xe9\x7e\xca\xed\xd1\x5f\x9a\x5b\xca\xe3\xca\x94\x51\xbc\xde\xaa\x84\xcc\x9b\xfd\xa0\x7b\x35\x0d\x50\x26\xf2\x5a\x15\x30\x7e\x7f\x58\xda\xe7\xa7\x12\xee\x22\x35\xb7\x7d\x0b\xef\x4c\x1d\xdf\x35\x2d\xc6\x43\xfe\xe9\xe0\xd3\x83\xcf\x32\xb0\xa4\x84\x55\xcf\x6e\x5a\x49\xc2\xcb\xc3\xe5\x9c\x95\xd0\x90\xbb\xfb\xcb\xa1\xbd\xa6\x4f\x67\xc7\x36\x24\x72\x5d\x72\x8d\xf2\x75\xbe\x3f\x0d\xfa\x35\xbb\x14\x02\x55\x55\x86\xd4\xb6\xb3\xfb\x79\xd8\x0f\x43\x53\xf3\x52\xfe\x5e\xa3\x3b\xf5\xb7\xb7\xbb\xf4\xe8\xce\x26\x46\x09\x10\xa4\x62\x9b\x29\x7a\x3d\x76\xf5\x69\xf7\x76\x74\xb5\xc6\xed\xb0\x62\xd7\xf3\xf3\xbb\x63\x16\xe3\x1c\x35\x51\x4b\x38\xf2\x00\xf7\x58\xe0\xf3\xe8\x9c\xab\xe8\x1b\x94\xa3\xf9\xfa\xad\xa7\xb6\x21\x8b\xa1\x91\xe3\x89\x94\xf7\xa5\x81\x37\xbc\x65\x34\xdc\xbf\xfe\xb8\x8a\x79\x3e\x0d\xfa\x5a\x8b\xbb\x03\x69\x68\x6b\x56\x12\xab\xb8\xab\x80\x01\x2f\x0a\x23\xf1\x42\xce\xd8\x6c\xc9\x3a\x00\xde\xe0\xe5\x37\x2b\x7f\x20\x46\x66\xd3\x0e\x85\xca\x30\x9f\x4a\x4a\xfb\x31\x30\x57\x0e\x4e\xb6\xa7\x46\x53\x0d\xdd\xf3\xe2\xb4\xf9\xb5\x9e\xa4\xd4\xf4\x6e\xaf\xfb\xdf\x17\xee\x7f\xe1\xb3\x00\x08\x32\x94\x24\x58\x75\x98\x86\x2b\xfe\x45\xae\x63\x1e\xfd\x8f\x1b\x0b\x9e\xe3\x5a\x48\xe4\x00\x86\x89\x0f\xef\x08\x5b\xe1\x27\x3b\x8e\x9e\x45\x3d\x04\xb0\x8c\x2d\xf0\x75\x7f\xe3\x22\xac\x5d\x9f\xaa\x65\xd7\x5b\x84\x83\x6a\xf4\xdf\x31\x5d\xd7\x88\x52\xf2\x77\x25\xac\x14\x34\x7c\x4e\x41\x20\x3b\x6d\x5b\xf2\x1e\x9b\xad\xb1\xba\x01\x79\x2a\xee\xef\xd2\xb5\xa2\xcd\xeb\xd6\xf3\x94\x2e\xea\x6e\x71\x6a\x8a\x06\xfe\xe1\xfc\x10\x30\xd5\xa1\x8e\xeb\x36\xf9\x76\x3a\x0d\xe5\x0b\xa1\x22\xfa\x4c\x08\x01\x72\xb2\xb6\xdb\xb5\x03\x33\x7a\xae\xcb\x55\xf9\x0d\x35\x7c\x3d\xe8\x8f\xbd\x3b\xaa\x7c\x5d\xfd\x9a\x6a\xa9\x6d\xf2\xc2\x84\xfa\xfd\xf3\xb9\xde\x9e\xc6\x3b\x76\x99\x2f\xba\x33\x23\x46\x53\xa9\x15\xfc\xaf\xff\xbe\x95\xfe\x0b\x7b\x05\x40\xa0\xfd\xfe\xd3\xc2\x7d\x31\xf9\xaa\x7c\x0f\x29\x57\x72\x89\xdf\x29\x67\x38\x21\xe6\x63\x61\xd6\x2d\x0d\x84\x6c\xa9\xa7\xa9\x00\xb6\xaf\x9c\x89\x03\x6c\xf2\x65\x7b\x1b\xc3\xd4\xed\xa1\xb7\x2b\x34\xff\x35\x7d\x4a\xac\x40\x46\xe7\xb3\x67\x16\xf3\x49\xf3\xb6\x8f\xbf\x53\x09\xdd\xf7\xdd\x69\x40\xf4\xb9\xa6\xba\x3f\xf5\xec\x22\xf9\x77\x3c\xb9\xff\x8f\xb1\xb7\x8c\xca\xf2\x89\xd6\x87\x69\x90\x90\x92\x6e\x10\x24\xa4\x4b\x42\x40\x78\x00\x01\xe9\xee\x90\x4e\xa5\xa4\xe3\xa1\xbb\x3b\x24\xa4\xa4\x5b\xba\xbb\x95\x6e\x90\x96\x14\xe9\x7a\xd7\x7f\xbd\xe7\xc8\xfc\x3e\x79\xbe\xef\x35\xf7\x9e\xb8\x67\xc7\x5c\xfb\xda\x43\x4f\x43\x73\x22\x8b\x3f\x2d\xc2\xbf\xbf\x46\x76\xfd\x53\xb0\x82\x6e\x2c\xae\x00\xe6\x53\x5a\x6c\xd5\xb0\xe2\xe7\xc5\xf6\x8a\xd4\x17\xe7\xac\x47\xd4\x93\x3d\x7e\x42\xcc\xbb\xd5\x1a\x47\xac\x11\xd2\x66\xd9\x02\x33\x37\xff\x66\x3e\xfe\xe9\x2b\x42\xb0\x28\x61\x44\x80\x0a\x1f\x82\x8b\x53\xb7\x60\xcc\x90\x2d\xa4\x9f\x4b\x76\x8d\xf1\x90\xb6\xcf\x74\xd5\x58\x6b\xbc\x6a\x09\x2e\xd8\x3c\xef\x9e\xc9\x4d\xae\x02\x34\x6a\x79\xd0\x81\xe7\x19\x1c\xcd\xb1\x7e\x74\x9e\x5f\xec\x2a\xfd\xf9\x30\x07\x37\xdf\x99\x8e\xfe\x28\x35\xe5\x5c\xbd\x4b\x9f\x00\x09\x4f\xaa\xea\xa9\x50\xc4\xe1\xd0\xf5\x26\xcc\xba\x4d\x8e\xc4\xb4\x83\xe3\x85\xe3\xee\x3e\x6c\x1b\x5a\x13\xd6\x23\x66\x07\x28\x5a\x98\x81\xc5\x5e\x2a\xab\xbd\xb3\x73\x87\x6a\x96\xca\xd0\xd7\x5a\xf7\x3a\x4b\xa9\x1c\x15\x30\x51\x21\x6e\x6a\xee\x46\xf2\x7a\x59\x51\x7e\xa1\x7f\xcb\x3a\xff\xe5\xb1\xfd\xbf\x99\xa1\xb4\x03\x47\xd7\xe5\xc5\x06\xda\x5e\x8e\x41\x0a\x23\x23\xa6\xbe\xc0\xb4\x21\x66\xf4\x95\x8a\xd7\xda\x1d\x2d\x26\xe6\x80\x12\x9d\xfa\xab\x0a\x10\xc6\xe9\x94\x13\x5c\xcc\x1b\x27\xa0\x33\x4f\xc6\xdf\xa2\x23\xe3\x6f\x2e\x4f\x7a\x58\xb4\x25\x7b\xb2\x4d\x21\x7d\x1a\x60\x15\xc9\x01\x12\x5d\x51\x7b\x7f\x54\x50\x22\x25\x33\x66\xa9\xe6\x35\xff\x56\xd9\x81\x82\x16\xfc\x96\x45\x45\xe2\xe1\x7b\x44\x8c\x05\xfd\x61\xc8\x1c\x35\x78\x7b\xf9\x3d\x49\xe4\xfa\xa4\xc6\x68\xa2\x28\x3b\x60\x81\x9e\x82\x26\x31\xe9\x1f\xfc\xde\x67\x3c\x70\xed\x47\xc1\x10\x53\x43\x29\x2a\x60\xe5\x36\x16\x9e\x17\x4b\xab\x6f\xe8\x8c\xbc\x1c\xd4\x2b\xfd\x42\x2e\xed\x35\x5b\x11\xda\x38\x12\xfc\xeb\x76\xe6\xc8\x7f\xd6\x16\xcc\x14\x51\xf0\x9a\x17\x94\xe3\x8c\x2a\x4e\xce\x1b\x14\x33\x09\xa2\x1e\xa3\x2d\x3a\xc9\xb2\xc0\xb4\xf8\x86\xb3\xd9\x38\x78\xf7\x3a\x73\xfe\x8d\xf9\xff\xe5\xb6\x42\x21\xb0\x94\xff\xa9\x68\x94\x3d\x6e\x95\x5c\x60\x12\x4f\x6d\xe5\x7d\x96\xc9\x57\x45\xb1\xc4\x50\xf8\xcc\x33\x4d\x28\x21\xb5\xe0\xa0\x88\x44\x14\xc7\x00\x0c\xe4\x1d\x2c\xe5\x36\xca\xf7\x63\x39\x05\x52\x66\xfc\xb2\x2e\x9c\x0a\x19\xb3\xb7\x1b\x9c\xb4\x6e\x09\xd2\xa1\xb2\xe5\x5f\x1b\xd7\x40\x2e\x99\xa8\x04\xc5\x1e\x7c\xa6\xda\xe6\xaf\x51\x07\x8b\xc2\x70\x07\x94\x86\x62\xfd\xa5\xbc\xc7\x05\x86\xed\xad\x17\xef\xc2\xde\x4a\x5d\x80\xd1\x8b\x6b\x88\xf3\xb5\xcd\xfd\xf4\xbe\x9e\x1d\xd7\xe7\x82\x7e\x9a\x17\xe9\x9e\x7d\xb5\x7c\x1a\x71\x87\xc1\x31\xc5\xca\x31\xfa\xc0\x6d\x5f\xe2\xa5\x41\x18\x55\x1d\x30\xf4\x5d\x1f\x76\x8c\x01\x26\xde\x90\x2c\x50\xed\x14\x6f\xd4\x6d\x5b\xe9\xa8\x0b\x6a\xbf\x36\xb4\xfa\xf7\x4f\xff\x97\x43\x0e\x85\x50\xc2\xc0\xe0\x01\x8b\xf0\x4b\x3b\xd5\x47\x05\xd9\x72\xe9\xd0\xb3\x10\x69\x6e\xc3\xe0\x75\xe5\x42\x7a\x94\xe2\x49\xc2\x08\xae\xa9\x3b\x31\x07\xbb\x6d\x01\x88\xfa\x34\x85\xbf\x8e\x67\xa9\xab\x66\x10\xd0\xbf\xbd\x49\x5d\x9b\x6a\x5b\x99\xde\x4f\x2c\x19\xb0\x41\x26\xcf\xea\x1c\xfc\x06\x41\x03\x44\x2b\x22\x8d\x15\x7c\x98\x7f\x63\x21\xa6\x59\x25\xb1\x47\x95\xf4\xef\x54\x85\xe6\x2d\xe4\xfe\x1a\xff\x9c\x1b\xb2\x32\x9d\x18\xc7\x0e\x02\x08\x35\x7b\x19\x9a\x4c\xf7\x9f\x9a\x0e\xdc\x5c\x28\x2b\x95\x22\xbb\xd0\x0d\x3f\x5b\xfb\x42\xa0\x4d\x5c\x59\xb0\x73\x2d\xc9\xf9\xed\xef\x55\xfe\xaf\x00\x02\x0a\x11\x79\x02\x0b\x76\x36\x18\x5f\x71\xd2\xc5\x46\xf7\x9d\xfe\x7d\x1f\x4d\x3d\x3e\x9e\xd3\x60\xee\xc1\xe1\x35\x31\x24\x74\x16\xe4\x30\xa1\xb4\xb5\xa1\x0f\xd6\x1e\xb2\x91\x4b\xbc\xf7\x28\xd1\x7d\xc6\xfa\x2a\x69\x5f\x54\x3a\x3f\x6b\x20\xe8\x2d\xd2\x04\xd1\x14\x67\x68\x28\x8e\x08\x4c\x4e\x31\xd8\xba\x53\x25\x28\xce\xe0\xa6\x51\xa9\x06\x21\xa5\x07\x41\x53\x04\x3b\xac\x05\x73\x5b\xe3\xdd\x79\x57\xab\xac\x38\xbf\xdd\x99\x69\x13\x98\x45\x0f\x81\x8e\xd5\xe0\x49\x2a\xbe\x0b\xf8\x7e\x9f\x8a\x51\xd6\xe9\x19\x70\x9b\x8e\x6e\x5f\xd9\x9a\x87\x87\x56\x76\xf8\xdb\xb1\x06\x4c\x92\xf8\x20\x29\x44\x6c\x56\xad\x27\x98\x13\x6f\x51\xc5\x8c\x5b\x09\xe6\x1a\xea\x47\x51\x23\xdd\x76\xbd\xd2\x50\xc6\xe4\x7b\x66\xe7\xf7\x37\xa9\xf3\xaf\xd8\x08\x0a\x41\x81\x85\x11\x04\x92\x3a\x52\xc9\xaa\xd5\xd4\xcd\x02\xcf\xac\x4d\x76\xed\x5f\x7e\x2f\x81\x9f\xb4\x2b\x8b\xa9\xa5\x84\xb2\x35\xaf\x10\x7d\xc5\xf9\x8c\x0d\x2a\xf1\x07\x67\xf8\xe4\xf3\xc2\xec\x7e\x52\x54\xc8\xf5\xf6\xe1\xd4\x1b\xf6\x09\x0c\x6f\x84\x85\x90\x69\xbb\xea\x87\xa8\x40\xbf\x3c\x90\xb0\xc8\x62\xcc\x19\xdf\x00\xf5\x6d\x13\xc1\x37\x86\x4b\xb9\xa5\x69\x6d\x4d\x99\xab\xd3\x01\x0e\xab\x4f\x9b\x4a\x31\xb9\xbb\xa5\x2f\xc0\x84\x3b\x7b\x1d\x0a\xec\xfd\xc2\x09\xe5\xa7\xd2\x6f\xe7\x59\x67\x56\x57\x1f\xf2\x7a\x3f\x28\x9a\xa9\x25\xaa\x5d\x7c\x88\x3e\x50\x45\x03\x93\x3a\x4e\x49\xb5\xc7\xd7\x47\x0f\x78\x38\x9a\xd9\xc8\x21\x41\x2e\xde\x3d\x62\xef\xbe\x96\xd2\x7e\xde\xc6\xd6\x62\x6a\x1f\x64\x2a\x74\x01\x73\xb7\xe2\x11\x75\x17\xe7\x9b\x1f\xba\xef\x62\xb6\x34\x55\xee\x91\x08\xbc\x3f\x98\x90\xf7\xbc\x99\x1b\x31\xe8\x14\x4e\x1a\x4b\x8e\xff\xfb\x47\xfc\x33\x42\x84\x60\xc1\x44\x83\x10\x28\x1d\xc7\x32\xe7\xd3\xb5\xe1\x43\x9c\x9c\x24\xf8\xfe\x3b\x4a\x92\x99\xd6\x88\x11\x44\xe5\xe1\x52\xaa\x06\x8c\x40\x7e\xff\x95\x3d\x40\x09\x75\xff\xbc\x99\x09\x52\x49\xc2\x5b\x32\x46\xa3\x2d\x3f\xe6\x1e\xbe\xac\xe2\x92\x2f\x6d\x4d\xc6\x01\x21\xb7\xa4\xb5\xc5\x65\x8c\x80\x28\x86\xc6\xca\xc7\x7a\x5c\x82\x97\x3f\x51\x0e\xdc\x66\xde\x91\x9b\x11\xd4\x67\x7a\xdd\xe9\x87\x74\xf2\xb8\xbf\xec\xdf\xbd\x75\x81\x02\xa2\xe2\x53\xf8\xda\x0b\xd4\x51\x7e\x41\x56\x86\x8c\x2c\x12\xf7\xda\x45\x35\x6c\xec\xca\x92\x45\x84\xa8\x30\x04\x4e\xc5\xf8\x30\x25\x7f\x6d\xdf\xbf\x82\x4f\xa8\x98\x8f\x39\x88\x80\xfa\x4e\x82\xbd\xac\x2e\x5d\xcd\x80\x42\xbf\x9f\xf3\xde\xba\x85\x74\x5f\xff\xec\xa3\xd0\x8e\x01\x4b\xbc\xa6\xd8\xa8\xec\xf7\x7c\xb0\xc2\x56\x9a\x8c\x08\x96\x1d\xe7\x55\x0b\x96\x31\xf2\xd2\x57\x0a\x63\x22\x2a\x33\x3f\x8a\xac\x56\x9e\x14\xb5\x03\x7d\xde\xdf\x4e\x79\x20\xb3\xe0\x3d\xcf\x6b\x27\x9c\xee\x3c\x6b\xa8\x25\xf5\xc2\x24\x43\x2d\x75\x0d\x25\xcd\xef\x33\x7e\xea\x4f\x98\xcb\xcf\xd1\x15\xf6\x78\xc1\x06\xb5\x4f\x77\x55\x50\xaa\x72\x9e\xaf\xb1\x20\x74\x2d\x52\x7e\x4f\xed\x08\x36\x24\xd4\x7f\x9e\x37\xf0\xae\xc7\xbc\x32\xaa\x9a\xf2\x0e\xe5\xef\xbf\xfe\xcf\xc0\x0e\x82\x05\xe7\x0f\x02\x13\xad\x98\x48\x15\x05\x6e\x89\x7b\x67\x16\x5e\x6f\x29\xd1\x04\x6c\xae\xdc\xdf\x24\x8f\xb9\xac\x16\x90\x5b\xb9\x70\xf3\xde\xb0\x48\x01\x4a\x08\xb2\x6a\x8d\xa4\xb4\x7d\x97\x67\xf0\x56\x27\x2d\x8c\x67\xd4\x71\x75\x7c\x2d\xe7\x2e\xe2\x4e\x4b\x3e\x23\x47\xb8\x47\x27\xe0\x0b\xbe\x98\x91\x5e\xcc\xc3\x8e\x8b\x86\xf6\xff\x0c\x7c\x82\xc3\xd4\x6b\xf6\x3d\x55\xc5\x5c\xdf\x6d\x77\xe7\xea\x22\xa1\x95\xa5\xd5\x14\x0e\x10\x45\x4e\x87\xc4\x2c\x5e\x1d\xcf\xf0\xbc\x47\x2f\x9e\xb4\x3a\x98\x5f\x26\xb8\x85\xcf\xd9\x8b\x21\x0e\x51\x2d\x5d\xa7\x19\x4a\x02\x8d\xaf\xae\x2c\x3e\x1d\x94\x10\x11\x5b\xd6\xa9\x7b\x57\xf0\x02\x6d\x31\x10\x63\xbe\x34\x28\xef\x27\x2c\xd4\xf6\x45\xe8\x15\x3e\x44\xf2\xaf\x07\xf0\xaf\x58\x08\x0a\x41\x41\xf5\x87\x01\x1a\x1b\xd2\xdf\xb3\x73\x28\x7c\x2f\xc0\xf6\x59\x0f\x5c\x62\xe7\x87\x0b\xa8\x52\x1b\x3e\x5a\xbf\x39\xd7\x08\x75\x75\xf5\x1c\x9c\xa6\x00\x58\x8e\xb2\x78\x53\xca\x05\x8f\x33\x54\x1d\x8a\xa7\xc2\x0e\x0f\x96\xe2\xf0\x39\x0d\x7e\xf8\xf4\x0e\xa1\xc5\xfc\xac\x10\xa6\x6e\xce\xfc\x02\xa8\x7b\x59\xc1\x1a\xdd\x57\xa3\xf8\xc9\xec\xe4\xeb\x81\xae\xc5\x92\x23\x75\xd9\xd2\xb9\xbd\xb9\x77\xa2\x60\x75\x6b\xbc\x1c\x1d\x4c\x0c\xb8\x08\x5e\xc8\x1d\x73\x17\x83\xdf\x9d\x8c\x32\xdd\x37\x8c\x84\xdf\xa6\x73\x74\xa6\xaa\x22\xf7\xc5\xcb\x72\x8f\x12\xc9\xe8\x2d\x80\xe5\xc0\x02\xee\x30\xdf\x6f\x3f\x9b\x59\x16\xe3\xe4\x91\x6f\x73\x11\x67\xf5\x5f\x0a\xde\xf9\xce\x4d\x3e\xff\x39\x65\x9d\x70\x37\x78\x05\x42\xec\x48\xa8\x88\xae\xda\x58\x4d\xfb\x7b\xd6\xa5\x2e\xfa\xb9\x0c\x67\x1e\x46\x32\xec\xa5\xd2\xad\x0b\x06\x6c\x87\xe6\xa7\xa1\x2c\xc2\xe7\xb7\xff\xd3\xd8\xd0\xe2\xe3\x0b\x78\x46\x3c\x1b\x57\x77\xf1\x46\xf7\x2e\x0f\xf3\x3b\x54\x11\xf9\xe0\xba\x68\x14\xb2\xf7\x35\x2c\x81\x43\x88\xfc\xa7\x50\xc8\x52\xdb\xc3\x5d\x32\xe9\x63\x6c\x82\xbb\xed\x92\x56\xba\xab\xf7\x6c\x97\x48\xe3\x86\x6d\x8c\x83\xca\x08\x49\x89\xa6\x83\x4f\xe7\x47\x2f\xad\xb4\xcc\x8e\x08\xe4\xe1\x71\xc1\xd4\x5f\xda\xea\xfa\xd4\xb9\x18\x7f\x20\x78\xaf\x6d\xbe\x5f\xe0\x7f\x24\x6e\xbe\x15\x1f\x31\xf5\x56\x5f\x11\x03\x3d\x55\x91\x10\xe8\xc7\xbe\x77\x69\x9a\xea\xf7\x53\x9c\x74\x23\xfc\x57\x44\xb7\xeb\x57\x21\x82\x40\x16\xa1\x83\xb2\xfa\x41\x41\xd7\x8c\x31\xba\xdf\x8d\xe3\x40\x68\x14\x31\xce\xbe\xa0\x58\x97\xc0\xb3\xad\x19\xdf\x74\x8d\xf1\x13\x37\x57\xf7\x49\x2f\x63\x44\xb0\x66\xab\xd0\xaa\x42\xf9\x2d\x3d\x90\x69\x9d\xb5\xf1\x91\x4e\xb0\xe2\x19\xb4\xe0\xa7\xa7\x0a\x3b\x8c\x91\x23\x5a\x90\x52\xf6\xf8\xdc\xc6\xf7\x95\x72\xa6\x5e\x51\x36\xdb\x1b\xa0\x0d\x69\x0f\xc1\x7e\x76\xb8\x12\x79\xa4\x32\xc2\xbf\xe2\xea\x80\xd3\xaf\x09\xaf\x3c\x95\xdc\x92\xa1\xfd\x89\xe1\x50\xc2\xb9\x50\x04\xc4\x59\x64\x61\x66\xd8\x7f\x0d\x72\xfc\xe9\x97\xb5\xaa\x4c\xb9\x1a\x5c\x02\xa5\xc9\xb0\xed\x4b\x7b\xfe\x16\x0f\x1f\x0f\x87\xb0\x02\x20\xc5\x79\xb9\xac\x0b\xdd\xac\xee\x78\x15\xed\xdb\x42\xdf\xd2\x9e\xd0\x97\x6b\x81\x97\x30\x67\x90\xd7\x30\x6e\x85\xf8\x8d\x16\xb3\x71\xfe\x51\x52\xf4\xc1\xc1\xc6\xd1\x33\xf6\xb0\x30\x38\x90\xcc\x2d\x9d\xbb\x05\xb6\x96\x64\xd3\x8a\x00\x96\x9e\xca\x64\xa7\x19\x83\x2a\xf2\x3f\x44\x43\x5f\xcd\x39\x19\xd9\xfc\x02\x61\x6c\x1b\xbe\x65\x41\x83\x60\x13\x5c\xbd\x11\x0f\x16\xca\x17\x37\xb1\xb0\xbf\xc2\x62\x3c\xa3\x83\x02\x44\x5f\xb1\xb9\x43\x15\x9e\x37\x66\xbf\x68\xb0\x7d\x60\x7f\xc1\x6d\x38\x79\x5d\xc3\xfe\x10\x1b\x49\x17\x1a\xa6\x46\xd9\x77\x2b\xd9\x79\xfc\xbe\x13\x3b\x37\x84\x5a\xd1\x16\x13\xb5\xd2\xdd\x77\x99\xd8\x1a\x4e\x55\x71\x8b\x3c\x5a\xde\x43\xbe\xdc\x27\x33\x69\xc4\x05\xb1\xfc\x51\x32\xd2\x2d\xdb\xe0\x65\x65\x0b\x16\x9d\x53\x5d\x2e\x41\x2a\xc1\x80\x8d\xf6\x99\x9d\xd1\x1e\xc5\xd7\x97\x9e\x76\x94\x1a\xdc\xc2\x9f\x00\x47\x0d\x6f\xfd\xe6\x4f\x42\x5c\x5f\xf5\x77\xee\x28\x01\xbd\xc3\x6b\xe6\x3c\xfe\xf5\x3e\x73\xef\x3f\x59\x47\x03\xb1\x65\x8e\x1e\xe2\x40\xcd\x59\x5e\x0e\xc2\x87\xbc\xae\x6b\x64\xf1\xd4\xf0\xfc\xa6\x22\x97\x88\x98\x46\x1d\x0e\x31\xdf\xce\xfd\xde\x91\xdc\xb6\x33\x0b\x71\x90\x7a\x31\x3e\x1d\x9f\xc4\xd3\xd8\xf4\x7d\x82\x44\xda\x20\x7e\x99\xb0\x6c\x4c\xfa\x1c\xda\x4f\x7c\x96\x77\x38\xa5\x01\x1c\xfd\xd9\x59\xb8\xe0\x4a\x31\x72\xa1\x8e\xfd\xa4\x9e\xf8\x6a\x8c\xca\xf3\x65\x0f\x76\x8d\xe0\xcf\x2b\x68\x12\x8e\x2f\xbf\x93\x97\xc8\xa9\x24\x54\x26\x35\xf4\x71\xa5\xa8\xf7\x32\x88\xa8\x09\xe7\x39\xe1\x95\xc2\x9e\xcc\x54\x0d\x8f\x3f\x87\x44\x71\x7a\x90\x84\xe6\xd8\x34\x05\x59\x4c\xcd\xb7\xcd\x01\x80\xf2\x75\x5c\x4d\x08\x3b\xab\x32\x6c\x56\x93\x47\xaf\x67\xf3\x9b\xbb\x82\xdf\xd2\xe6\x58\x4e\xb6\x98\x55\xcf\xd0\x62\x32\xee\x01\x46\x26\xd3\xfe\x90\x5f\x6c\x0f\xc1\x0a\x1a\x0e\x32\x12\xbc\x2f\x13\xe7\x7a\x48\x11\xab\xdc\x25\x1d\x42\x5d\x0f\x6a\x09\xcf\xba\x2d\xa8\x41\x4d\x8f\xe5\x51\xc5\x3e\xb8\x68\x3e\xe7\x86\x3f\x64\x6f\x2d\x79\xb5\x49\x9a\xea\x1a\x98\x3f\x21\xa0\xa8\x1f\x21\x49\xe7\xfe\xed\xb2\xf3\x51\x53\xee\x16\x4d\xe2\x15\x7b\x69\x3a\xec\x8f\x48\xad\x17\x5a\x18\x65\x4b\x8b\xf3\x84\xaf\x69\xcb\x38\x6d\xaf\xa2\x82\xdf\xbb\x23\x62\x01\xfd\x09\x6c\xe6\x04\x2b\xfb\xe8\xd1\x53\xcd\x62\xbc\x48\x08\xbd\xea\x66\x85\x34\x35\x63\x07\xd1\x3c\x12\xae\x24\xc5\x3c\x67\x95\x01\x40\x4e\x72\xb6\x6a\x11\xfc\x38\x35\x1b\x86\x87\x86\xe1\x53\x29\x7c\x45\x89\x50\x8b\x97\x32\xac\xa3\x66\xb1\x9b\xeb\x11\x0c\x67\x81\x20\x6b\xac\xf2\x7e\xf6\x0d\x63\x10\x9b\xfb\x6a\x5a\xc2\x24\xd6\x98\xe8\x5c\x10\x45\x34\xc5\x47\x4e\x66\x19\x11\x32\x47\xcd\x6f\x32\xed\x64\xe0\xa4\x5e\x13\x1f\xd4\x1f\xc9\xf1\xf8\xc6\x6f\xe3\x76\xfa\xae\x26\xb4\xc9\x28\x59\xaa\x8a\x0c\x7d\xf4\xf2\x76\xd3\x4d\x1a\x78\x53\x46\xf4\x78\x52\x24\x52\x5f\xca\xac\xbc\x1e\x96\xfe\xf2\xbd\x34\x6d\x8d\x87\xb2\xe6\x6d\xd2\x72\x2d\x01\x7f\x75\xca\x46\x2d\xa7\xbc\xc5\x20\x22\x00\xb1\xcb\xcf\xb8\xc6\x4b\x0b\xb3\x69\xbe\xa3\xbd\xb3\x86\x2f\xdd\xc5\x55\xf0\x23\xab\x0c\x83\xcf\xc7\x7a\x2e\x7f\xbb\x8a\x29\x58\x11\x0a\x1c\x3f\x98\xa7\xd5\x76\xe3\x8b\x59\xa9\x3b\x5a\x29\xae\xb3\xa9\xd8\x5f\x78\x71\x57\xc2\x5c\x77\x4a\xfa\x6e\x78\xdd\x16\x3f\x4a\xfe\x04\x72\x72\x6e\xcd\x33\xdc\x2f\xaf\xd0\xcc\xc6\xff\xc0\x25\x99\x79\x09\x7a\x48\xe5\x10\x7d\x23\x42\x59\x9c\x43\x4a\x75\xe7\x47\xd6\x3b\xc5\x07\x27\x95\xb9\xd1\x0a\xd3\x76\x1b\xf4\xba\x64\xb0\xff\x7e\x8b\x3c\x4f\x99\x00\x9d\x92\xda\xbd\x6b\x90\xc7\xc2\xde\x6b\xaf\xef\xf4\xd9\x0d\xd0\x76\x40\x10\x46\x55\xca\x23\x4b\x27\x53\xa6\xb1\xf4\x70\x48\x73\xef\x23\xbe\x79\x5d\x87\xb8\x80\xc5\xb9\x4c\x1e\xf5\x96\x6e\x95\xc0\xe3\xf7\xb9\x7a\xff\x9c\xac\xad\xe5\x73\x44\x3b\x77\xf3\x8d\x50\xbb\x88\xcc\x58\x53\xaa\x65\xdc\x4d\xf8\xce\x32\x47\x5c\x6c\x3b\x9c\x02\xd8\x99\xa4\x54\xaf\x1d\x23\x61\x5c\x99\x96\xc3\x9a\xb6\x77\x58\x68\xec\xcf\x33\x59\x5d\xa0\xf1\x3d\x63\x2b\x73\xc7\x1a\x0c\xdd\xdb\xa0\x73\xce\xf8\x3d\x73\xaf\x21\xfa\x78\x96\x31\x1d\x3b\xa8\x52\xa9\xbf\xde\x46\x43\x7f\x2e\x4a\x46\x16\x8d\x2d\x2b\xfa\x97\x26\x1b\x03\xc8\x7e\xf3\x5b\x4c\x74\xb5\x07\x99\x25\x44\xa6\x42\x70\xbf\x84\x3a\x8a\xb4\x76\x86\x57\xf1\x4a\x03\xaf\xc2\xd7\x53\x55\x31\x3b\x3a\x41\x09\x9c\x3f\x7f\x57\xc7\x8b\xb8\xa3\xcf\xf4\x9f\x93\x5a\xe7\x5a\x67\xe7\x6b\x5d\xd9\x60\xb6\xbb\x7e\xe9\x8f\xc7\xa6\x1d\x63\xf9\x57\x23\xa5\x81\xec\x5d\x8b\x51\x43\x88\x8e\x68\x5c\x48\x2e\x05\xb9\xda\xba\xc9\x41\x70\xc5\xf9\x0e\x70\x55\xca\x6d\x31\x88\x15\x91\x90\x79\x54\xfa\xc7\xad\x4a\xf5\x7a\x7e\x49\xe3\x2c\x04\x77\xa5\x97\x47\xa3\x8d\x28\x9c\x25\x92\xa3\x81\x3b\xcc\xd9\x3e\xc3\x4a\x2e\x94\xf8\x9d\x9a\x34\xe9\x71\x01\xb6\x54\x03\x1f\xce\x26\x8b\x2d\x32\x1d\x0e\xa7\xb4\xaa\x36\x9b\x9d\xfc\x83\x52\xd5\xf3\xa5\x3d\x3f\x45\xab\x89\x1f\x42\x70\xe3\x81\xfd\x17\x59\xf5\x87\x6f\xdf\x95\x7c\x0d\x13\x9a\x29\xa1\xdc\xdb\xb8\x44\x21\x2b\x9d\x09\x57\x66\x2b\xc5\x96\x57\x9b\x2e\xdd\xfa\x11\x48\x35\x16\x42\x43\x4a\xbf\x7d\x30\x8d\x4d\xae\xd7\x71\xc6\xe4\x35\x1b\x7c\xc1\x0d\xdf\x66\x1d\x58\xf8\xc7\x6d\x2c\x80\xa7\xf4\x7d\x1c\x3c\x70\xf9\xc3\xab\x78\xfa\x6f\x09\x26\x8a\x85\x5b\x8b\x56\xac\x56\x58\xfc\x61\x35\xe3\x3b\xbb\xff\x16\x35\x58\xf9\x34\xe9\x59\x7d\x6c\x2f\x50\x1d\x6e\x28\x1d\x11\xd7\x83\xde\x5b\x2e\x2f\x46\x75\xbd\x70\x1e\xf2\x1e\x05\x4a\x1c\xc2\x63\x21\x78\x16\x89\xf5\xb1\xf7\x8c\xdd\x02\xb8\x52\x82\xb6\x07\xca\xd5\x09\xc4\x6d\xbf\xf5\x1b\x2f\xdf\xca\x8d\xd2\x70\xb1\x3c\xa1\xe0\x3d\xc2\x45\xce\x18\x9d\x19\x63\xb2\x11\x05\x31\x8e\x68\x3d\x4e\x84\x8c\x0f\xc8\x56\x8a\x4a\x6d\x26\x3e\x99\x30\x52\x79\xb6\x7c\xb0\x1d\x1a\x24\x4f\x23\x4a\xb1\xe4\x98\x49\x66\x28\x1e\x07\x15\x12\x3c\x10\xc2\x80\x73\x9e\x76\x31\x8d\x22\x88\xf1\xfa\x85\x56\x8d\xb1\x76\xb6\xc7\xce\x4a\xa6\xef\x88\xee\x36\x87\x16\xa9\x0a\x76\xd4\xd5\x6c\x20\x6e\xc9\x45\xad\x36\xbf\x1e\x3b\x67\x83\xf0\x77\x4b\x5a\xef\x23\xdf\xa5\x84\x9b\xd6\x90\x3d\xf4\xb4\x1c\x62\x02\x74\xf2\x7f\x74\x58\xf9\xe2\xce\xdc\x0e\xbd\x4d\x52\x5f\x3f\x2b\xd2\x0b\xdd\x5e\x16\xa6\xa0\xc5\xc3\x13\x31\xdc\xf0\xa2\xdd\x47\xf4\x85\x07\x06\x25\x0b\xcb\xfc\xae\x3f\x83\xa2\x4d\xa2\x14\xc8\x0e\x71\xcb\x7b\x25\x58\xb3\x1f\x5b\x57\xdc\x68\x97\x57\x49\x4d\xad\xdd\x24\xa1\x06\xe0\xc1\xf2\xda\xc8\xdd\x8c\x4a\x1d\x6c\x7e\xc6\xb5\x4c\xeb\x5e\xb4\x3a\xa0\x52\xcd\xa7\x43\x65\x07\x36\x59\xaf\x8f\x11\xd0\x14\xed\xc0\x2d\x5d\xbb\xee\xe6\x2f\xe5\x14\x20\x9c\x0a\x42\x7e\x32\x4f\xd8\xb1\x7b\x50\xee\xde\x4c\x75\xd3\x3f\x92\xa2\xc5\xcf\x89\x40\xda\xf6\x38\xa8\x5d\xa5\x5d\xea\x2a\x27\xfa\x6b\xd2\xe2\xe3\x18\x52\x09\x74\x2f\x52\x93\x88\x21\x26\x12\x7b\xdc\x08\xb7\xe4\xc6\xd4\x90\xe1\x8f\xe7\x33\xb0\xff\x37\x6b\x0a\x15\x83\x0b\x06\xdb\x7b\xbb\x4e\x70\x90\x1d\x7b\x58\x28\xf7\x43\xf7\x04\x89\xa0\x03\x22\x21\x78\xbb\x67\x27\x3a\x53\x3a\x27\x54\x8d\xc7\x78\x12\x4d\x74\x80\xb6\xd6\x52\xc7\x7d\x38\x47\xaf\x88\x69\x64\x5a\x4c\x8d\x89\x60\x9e\x46\xaa\x69\xb9\x67\xfa\x76\x58\xea\xff\x29\x58\x9d\x61\x8f\x43\x01\x50\xeb\xcb\xd8\xa6\x25\xe9\xa8\xb5\x95\xb5\x0c\x85\x46\x3d\xb9\x5c\x2e\xad\xb4\xba\xe9\xf0\x38\xb5\xed\x51\x09\x45\x6b\x07\xe8\x20\x01\x33\x85\xa4\x6e\x45\x25\x35\x54\xc9\xa3\x9a\xb3\x63\x46\x0e\xef\xde\x40\x6c\xd6\x21\x8e\xbb\x31\x37\xab\x34\x64\xea\x15\xaf\x69\xff\xdf\x60\xe0\x5f\xc6\x0f\x0a\xc1\xa2\x84\x80\x90\x16\x21\x33\x9f\xf7\xe4\xbb\x37\xb5\xdb\xeb\x0b\x36\x48\x5f\xb3\x74\x93\x85\x9b\xd3\x7d\x89\xe4\x60\x02\x06\xd1\x2b\x7a\xd7\xfb\xaf\x01\x25\x02\x2b\xaa\xe4\x13\xae\x95\xc4\x2c\xcb\xd3\x12\xcd\x97\x12\x47\xc8\x5d\xf8\x8e\xf8\xaa\x4e\x05\xc7\xab\x82\x94\x68\x7c\x4a\x94\x01\xd1\x6c\xac\xcf\x97\x1d\xe2\x4f\xb8\x8b\x1c\xd9\xd4\x4a\x08\x34\xd4\xdd\xae\x19\xdd\xce\x6f\x2c\xf9\xa3\x59\x29\xb8\xa5\x6c\x24\x40\xa4\x5d\xaa\x8f\x71\xe7\xce\x53\x19\x83\x54\x55\x27\xf8\xa2\xc5\x0d\x05\x95\xee\xa7\xce\x42\xe5\xee\xef\x9f\xf9\xe0\xf7\x9a\x06\x06\x80\x95\x78\x67\x0d\x32\x18\x0a\x82\x14\x5f\x47\x5d\xbe\x76\xf8\x6e\xc0\x3a\x88\x37\xed\x71\x76\x26\x6c\x9b\x51\x8c\x7b\x13\x23\xb5\x4c\x4c\xfd\x8d\x63\xff\x65\x58\xa1\x10\x4a\x58\x98\x37\x40\xb4\xb7\xca\xac\x86\x66\xd0\xf6\x64\x63\xbf\xd4\x56\x86\x95\xdf\x2e\x8a\xcf\xf5\x4d\xc9\xaf\x75\xcc\x20\x3e\xfd\xdc\x50\xce\x4e\x17\x10\x5c\xc4\x13\xe8\xf5\x8c\x73\x6e\x29\x46\x77\x65\xfe\xdc\x89\x1c\x1f\x9a\xaa\x37\x39\x3e\x85\x2f\x09\x8b\x4f\x45\x1b\xfb\x55\x0f\x15\x07\x10\x3d\x51\x0c\x64\xbe\x2c\x8c\x3a\xb2\x19\x7f\x77\xfd\xcb\x99\x94\xb5\x49\x5b\x7f\xc4\x5c\xf8\xe2\x75\x17\x3b\x61\xc4\xda\x1d\x03\x2f\x88\x99\xea\x7e\x17\xaf\xc7\x3e\xc3\x30\xbb\xf0\x66\x88\xa5\x26\xfa\xbe\x7d\xca\xbf\x01\x0f\x86\x48\x60\x72\x87\x2b\x7c\x7a\xc8\x94\xe4\x2f\x32\xf0\x9f\xe6\x15\xa2\x80\x05\x8f\x08\x20\x03\x2f\x7f\xa2\x94\xb8\xe4\x7e\xa2\x23\x0c\xb3\xf8\x4a\xac\xed\x61\x52\x39\xfd\x9e\x55\x81\x3f\xc4\x94\x90\x88\x5f\x46\xf4\x23\xf6\x16\xa0\xc4\x4a\x53\xb1\x66\xc8\x3d\xb3\xb1\xe7\x35\x2d\x5f\x8f\xb2\x7f\x2e\xd9\x07\xd2\xd1\xe9\x57\xef\x68\xa3\x30\xc8\xf0\x39\x32\xac\xae\xc0\x02\xd9\xc5\x04\x72\xd5\xd3\x3b\xd5\xfa\x34\xea\x24\x39\xd7\xa7\x14\xed\xeb\x6a\x96\x7d\x69\x6f\xbf\xbb\x36\x24\x34\x39\xcb\xbc\x05\x21\x25\x77\x34\xa9\xd7\xc5\xd6\x76\x76\x90\x8d\xfe\xc2\xe2\x04\xc5\x95\x0c\x16\x4d\x69\xc6\x3d\xdc\x7b\x9e\x5a\x62\x8d\x30\xf6\x68\x90\x4d\xdf\x8d\x29\xf6\x5e\xe4\xd9\x7d\x27\x5e\xd7\x73\xae\x19\xc4\xd3\x94\x48\x31\xab\x2f\xf7\x97\x02\x95\x71\x16\xf0\x9f\x45\x44\x71\xc1\xc0\x5f\x82\x23\x73\x5b\x58\xfa\xb8\x02\x01\xab\x4a\x45\x37\xdc\x03\xf3\x68\x36\x85\x9e\x95\x2a\x72\x24\x84\xfb\x81\x06\xb3\xa6\x04\xec\x2c\x89\x0f\x53\x36\xf2\xcb\xfe\x13\x7a\x38\x65\xd8\xb7\xea\xcf\xea\xab\x58\xa9\xf1\x41\x63\x6a\xd8\x46\xf6\xb1\x5f\x5c\x36\x49\xdf\x34\xff\xcd\x11\xfc\xcb\xca\x43\x21\x22\x30\xe8\x20\x03\x16\x1c\xc1\x22\x5c\x95\x85\x18\x4f\xf7\xd3\xeb\x21\x9f\x4a\xc9\xc3\xa7\x89\x2b\xe6\x6c\x32\x45\xc3\xd5\x17\x13\x87\xed\xa6\x19\x00\xa6\xb7\xb6\x4d\x7f\x6d\x32\x60\x7d\xe6\x9c\x0e\xbf\xe0\xb3\x12\xad\x2d\x77\xbc\x2f\x6b\x0f\x9a\xe9\xe7\xd7\x0d\xaf\x30\x78\x3a\x60\xc7\x00\x75\xdf\xf0\xc9\xf4\xcb\x2e\xd7\xbe\x80\x86\x41\x49\xf4\x4d\x88\xf8\xd3\xfb\x29\xcc\x69\x68\xa5\x1d\xcd\xf5\xcd\x93\x49\x16\x48\xc1\x82\xd7\xfe\xca\xc5\x86\x55\x39\x97\xd7\x10\x23\xbb\x21\x25\x93\x88\xc2\x2e\xcc\x7e\xc8\x21\x44\xb2\x11\x53\xef\x36\xb4\x8b\x4f\xd5\xf6\xef\x0f\xf1\x2f\xfb\x0d\x85\x24\xff\xb7\x00\xac\x91\x92\xe0\x77\x28\x1d\x2a\xab\xa4\x8d\x9e\x6f\xf8\x86\xa6\x2e\x71\x8c\x9e\xfb\xd9\xf4\xf3\x18\x91\xd1\x42\x67\x13\xcd\x9f\x60\x0b\x39\xed\x6d\xf9\x6d\x77\xd6\xa1\xce\xe1\x77\x9a\xba\x39\xda\x0e\x7b\xe2\x53\x41\x82\x1f\x8a\x5d\xc9\x2b\xd7\x47\x57\x39\x8a\x58\xc0\xfd\xfd\x80\xaa\xd4\xd7\x5b\x46\xbc\x3d\xb8\x3c\x3c\x91\xdb\x9a\xa4\x59\xb5\xb4\x19\xa4\xb3\xc3\xb2\xde\x2e\x5d\x89\x89\x68\xe0\x08\x56\xcc\x55\xf9\xac\x66\xc5\xfb\xb9\x17\x68\xd7\x3e\xc9\x3e\x3c\x7c\x8d\xfc\xd0\x34\xcc\xce\xbf\x00\x7b\x45\xfc\x62\xb1\x59\xf6\x33\x6f\xc5\xdf\x1b\xef\x9f\xfe\x06\x44\x04\x16\x96\x1a\xb8\xf1\xb0\xdf\x2d\x5c\xaa\x6a\xcd\x75\xa3\xbe\x72\x6a\x46\x97\xa2\x0c\x76\x1f\xcf\xc1\x47\x88\x14\x6c\xcc\x6d\x2b\xea\xf5\xe9\xe8\x55\x01\x94\x58\xf4\x7f\xf3\x25\x22\xe9\x38\x05\x49\x36\xfe\xba\x7f\x97\x1b\x13\xd1\xa0\x34\xe2\x43\x3a\xaf\x0c\x76\x27\x3f\x4a\x71\xea\xd7\x4b\xb0\x0c\xee\x9d\x36\xd3\x83\x6c\x65\x2b\xd7\x0b\xca\x89\x2c\x84\xf6\x23\xd6\xdc\x09\x12\x6e\x6e\xac\xf1\x25\x02\x02\xee\xb4\x83\x19\x47\x30\xf2\xef\x4d\xd8\x2a\x63\x25\x19\x90\xb6\xfb\x60\xf7\xc4\x65\x92\xcd\xc5\x26\x6e\xaf\xf3\x06\x4f\x25\x00\x71\xa3\x8c\xe5\xf6\xd7\x30\x20\xfa\x5a\xc0\x59\xc8\xdf\xb0\xfc\x97\xd7\xef\x87\x3c\x9b\xf4\x4b\x65\x0f\x06\xd2\xa5\x54\x1b\xda\x50\x14\x05\xf9\xae\x96\xd7\x4d\x6f\xce\x67\xff\x87\x10\x1c\xeb\xe4\x21\xd9\xfa\xad\xf2\x8b\x8b\x7c\x43\xa8\xfb\x78\xe7\x25\xaf\xdb\xea\x6a\x5d\xe1\x05\xdc\x59\x48\xeb\x31\xcd\x66\xa8\x2c\x14\xf2\x50\xef\x7d\x03\x86\xf3\x54\x23\xb8\xfa\xa3\x42\x1d\x08\xa5\x1a\xd6\xec\xb5\xf9\xa7\xfc\xe6\xed\xf7\x1c\x69\x8e\x78\xf3\xfa\x7f\xf6\x36\x54\x36\xc6\x81\x20\x9d\xe9\x4c\x92\x06\x33\xc2\x84\x22\x5d\x90\x3d\x32\x22\xfe\x33\xc3\xf8\x50\x56\xab\x19\x24\xf7\x58\x12\xc1\xd8\x76\xf2\x9d\x14\x0e\x50\xb4\x73\x5a\xa9\xc0\xce\x1b\x79\x96\x31\x23\x11\x5c\x3d\x82\x40\xbf\x29\xa2\x66\xdf\x79\x2d\x0d\x81\xd7\xf9\x72\xde\xfe\x54\xd9\x04\x6c\x79\x86\x36\x86\xb3\x1d\xaa\x56\xfd\x87\x39\x9d\x6d\xeb\x4b\xd1\x11\xab\x1a\x7f\xb8\x89\x95\x8d\x6e\xd7\xaa\xdc\xed\x93\x77\xe1\x9c\x00\x35\x88\x84\xe0\xb7\x6a\xfb\x06\x9e\x86\xd6\x9a\x76\x2a\x53\xbb\x59\x89\xa9\xd4\x5e\xbb\x64\xe7\x9e\x7a\x58\x12\xa5\x9d\x77\xd0\xa8\x47\xc9\xb5\x07\xdf\x56\x76\x43\x1f\x83\xad\xaf\x29\x68\x5f\x7d\xa6\x76\x09\x65\x4b\x77\xa3\x1c\x19\x5e\xb6\x49\xd5\x5a\x1f\xf7\xa7\xc8\x82\x1e\xed\x7c\x85\x1d\x26\x77\xe1\x1a\xeb\x83\x48\x14\x29\xc3\xb1\xfb\x4b\xbb\x85\xc5\x3d\x79\xaa\xd5\x1f\x98\x4f\xd7\x1f\x3a\xc9\xa0\x4d\x80\xa8\x16\x47\xb6\x6a\x0c\x02\x9b\xbb\xf9\x57\xaa\x6f\x9e\xc1\xac\xb2\x89\xaf\xee\x51\x13\xf0\x97\x0b\x4f\x50\xe1\x3f\x28\x45\x11\xce\x02\x66\xef\xe0\xc3\xe0\xb8\x8a\x56\x11\x7b\x45\xc8\xbd\x76\x51\xb1\x90\x04\xfa\x33\xd5\x59\x71\x03\x32\x83\xe9\x38\xac\x3c\xaa\xff\xd0\x42\x64\xa4\xcf\x1f\xc2\x0d\xf3\xb0\xfa\xf8\xdf\x12\xac\x9f\x86\x47\xad\x9c\xed\x93\x85\xcf\xff\x9a\x1d\xab\x97\xe2\x29\x6a\x17\xfa\x0c\xea\xea\x65\x55\x84\x56\xe0\x4e\x42\x2c\x64\xc5\x39\x92\xbf\xea\x39\x3e\xa5\x62\x1b\xaa\x12\xc4\x1f\xfb\xb5\xb1\xa4\x9f\xc9\xe0\x23\xdf\xe3\x85\xc4\xec\xff\x9b\x6c\x5e\x7e\xeb\x10\x59\x3e\xa3\xc6\x6a\xd6\xae\xcf\x65\x7b\x9e\xec\x63\x30\xe1\x03\xc2\x0a\x27\xfb\x67\x9f\xac\x30\x80\xf1\xc4\xe0\x4f\xc4\x39\x0a\xba\xe3\x2a\x0a\xab\xf4\x79\xa7\xf8\x8e\x3d\x96\xb5\xaf\x0d\x1d\x05\x9f\x11\x83\x09\x42\xc4\x29\xdd\x7f\xda\x08\x12\xf8\x92\xe9\x76\x8d\xbc\x58\x99\xb2\xd7\xe1\xb3\x46\xe3\x5d\x6c\x71\x86\x71\xbd\x19\xb3\x17\x83\xbb\xf4\x61\x9c\xdb\x48\xac\x7e\xfc\x7e\xc5\x7c\x20\xad\x7c\xed\xd4\xd0\x3e\x9e\xa3\x78\x97\x4b\x9a\x4b\xb1\x57\x87\xb1\x53\x84\x6a\xdc\x60\xbb\x39\x7d\xf2\xbe\x35\xc0\xa2\x33\x32\x21\xcd\x40\x46\x88\x38\xe3\x6c\x1d\x23\x3e\xcd\xc4\x5f\x51\xdf\xd2\x70\xda\x7b\xb8\x1c\xa6\x26\x99\xea\xb0\xd3\xd3\x14\x0e\x7e\x9f\xc4\x1b\xfb\xfb\x89\x9a\xf2\xc7\x3e\xe9\x19\xc4\xf7\xc6\xbf\xe4\x4f\x6b\x17\xf7\xc3\x0c\x26\x5e\x26\x9c\x04\x69\x1d\x1a\xf0\x3f\x01\x1e\x58\xa7\x02\x55\x82\x8e\x44\xdc\x7e\x8d\xbf\xce\xa1\x61\x0e\xb7\x2d\x12\x69\xda\x47\x36\x5b\x90\x19\x9b\x78\xc2\x64\x6f\x7e\x41\x02\xf8\x69\x76\xab\xb5\x75\x5f\x60\x92\x54\x57\x33\x61\x1b\x58\xf4\x25\x5b\xf0\x77\x9e\xce\xe4\x34\x59\x52\x88\xf5\xe1\xe4\xc1\x19\x77\x03\x6d\xc7\x7c\xa4\x46\x7a\x94\x26\xd2\xf8\x19\x28\xe4\x5f\xe2\xa9\x1d\x63\xc8\xd3\x37\xb3\x77\x76\xe1\x75\xb8\x9c\xdc\xfd\xda\xbf\x57\xc1\xf8\x4f\x8d\x0f\xa2\x30\x73\x10\xad\x11\x0e\x91\xb7\xad\x8f\x5e\xfe\x6c\x0e\xb9\x02\x91\xd6\x07\x58\x43\xc6\x39\x6f\xa6\xe6\x27\x2e\x4a\xc0\x59\x61\xfa\xed\x51\x82\x78\xa7\xbf\x60\xb0\xb7\x11\xbc\x2a\x34\x03\x8f\x9f\x63\x97\x51\x37\xa8\x13\xc4\xdb\x82\x91\x77\x8e\x58\xb4\x0c\x8e\xda\xaf\x64\x79\xa7\x33\xc2\xf6\xb5\xff\x7d\xac\x27\xe1\x1f\x63\x5d\x69\x92\xdd\x6a\x04\x3f\xef\xd5\xd5\x56\x0d\x26\x7b\x0f\x29\x62\x40\x94\xcd\x22\x7c\x50\xc4\xa8\xbc\x3f\xf2\xa7\xad\xad\x26\xdd\x87\x96\x28\xa2\xe0\x03\x79\x45\x4c\x09\x97\xf7\x6e\x2d\x0b\x39\x8d\xe4\x8f\x0b\xf0\xa4\x7a\x7f\x63\xb3\x9c\x1e\x27\x69\x19\xf9\x19\x06\xda\x8c\x4e\x19\x73\x21\xff\xd9\x14\x2f\xcd\xea\x08\x8d\x4c\xf3\xe8\x18\x50\xdd\x59\x22\x33\x41\x6c\x47\xcd\x42\xde\xaa\x74\x9c\xaa\xfb\x4a\xa7\xaa\x99\xa1\x56\x38\x66\xd1\x79\x25\x77\x50\x3d\x36\x94\x6f\x1a\xec\xbd\xad\x30\x94\xb2\x78\xfe\x3b\x91\xc4\x32\xf9\xf3\xfd\xa0\xc0\x53\x59\xd6\x07\x1d\xbb\x95\x4d\x9d\x06\x2b\x02\xe3\xcf\x53\x0b\xed\x4d\xe0\xac\xd4\xe2\xdf\x8a\xbd\xcc\x62\xe0\xfb\x64\xff\xa4\x93\x95\x84\x09\xb9\xdc\xd6\x55\xbf\x2b\x5a\xfd\x06\x12\xde\xee\x29\x43\x3f\xd4\x0f\x76\x1d\xdc\x1c\x27\x4b\xf2\x57\xdb\x73\x75\x94\x5a\xe6\xfb\x8d\x8c\xf9\xba\x17\x63\xe9\x53\x8c\x27\x4f\x52\x47\xbf\xda\xc8\xd3\x28\xf1\xc7\x7b\x05\xab\x26\xa4\x17\x21\xf4\x37\xd6\x59\x40\x7c\x4e\xf8\xce\x77\x4f\xea\x65\x35\x29\xfe\xa8\xe9\x5f\x1e\x28\x6b\xcd\xae\x88\x9e\x00\x3f\x1a\x95\xce\x8f\xab\x7a\xec\x02\x93\xa9\xdb\x86\xf6\x95\x31\xc1\xaf\x4b\x65\x09\x35\xe1\x19\xd2\x75\x8a\x9f\x54\x0e\x96\x38\xbf\x6f\x3c\x4a\xbe\xc2\x8d\x67\x43\xcc\x22\xb6\xe7\xae\xc3\xf7\x13\x0f\x26\x69\x69\xc1\xdf\xe3\x81\x4f\xd4\x4b\x68\xe2\x3b\x98\x43\xfd\xd5\x18\x02\x3e\x53\x76\x09\x29\xcf\xed\x06\xbb\x56\xa4\x2d\x2d\x87\xe5\xa2\xc2\x39\x08\x90\xc7\xc3\x33\x46\x62\xe9\x20\x46\x93\xe8\xac\x8c\x02\xe5\x58\x1c\x1b\x0b\x3a\x2d\x16\x62\xca\xb3\xb7\x3b\x6a\x25\x6a\x09\x6d\xf0\xac\x3e\x16\x23\xdd\x6b\x6b\xcf\x9d\xbb\x17\x12\xb1\x7a\xf4\x80\xbb\x52\x6a\x9a\xf7\x64\x57\x1a\xe9\xc3\x7d\xa1\x39\x6d\x2a\x82\xd5\xde\x89\x78\xa3\xe3\x83\xea\xdb\x90\x37\x14\x72\x67\xef\x7b\xc8\x80\xdc\x63\x32\xb5\xaa\x92\xc3\x0f\xc9\xf7\x9b\xc2\xb6\xb1\x1b\xe4\x5a\x90\x56\x21\x22\x62\xe3\x3a\xf2\x14\x15\xa7\x84\x2a\x6f\x44\x12\xcc\x47\xc9\x5c\xb9\x02\x21\xef\xef\x3f\x06\x85\xdb\xa2\x18\xf4\x07\x44\x36\xe7\xf9\xb6\x20\x08\x17\x12\xcb\x6e\x05\x8e\x9a\x74\xbd\xa7\x91\xc0\x9c\xde\x95\xfe\xbc\x29\xd2\x5b\xb6\xef\x97\xce\xf3\x2f\xa0\x24\xef\xeb\x56\x55\x8b\xbf\xa7\xe3\x60\xdc\xd6\x35\x6f\xbf\x70\xb2\x02\x30\x9e\xd6\x2b\x34\x5a\x5f\x8a\x57\xe1\x1d\x18\x9f\xfd\xea\x0a\x1b\x19\x94\xc2\xb0\x73\x48\x2d\x58\x0a\x9e\x2c\xce\xad\x09\x1b\x16\x06\xf9\xae\x30\xe6\x39\x7f\x73\xa1\x8b\xe9\xce\x07\xcc\x0e\xfe\x18\xcd\xae\x4b\x11\x0d\xd9\x89\x14\xd9\xa3\xbb\xfe\xd4\x12\x15\xdf\x5d\xf1\xf9\x71\x50\x57\xaa\x5b\x86\xfa\x9d\xc0\xc1\x79\xe6\xd5\x0c\x82\xd7\xbd\xb3\xa6\x88\x36\x93\xa4\xfd\x97\xc5\x2b\x48\x35\x13\x76\x86\xd4\xa0\x65\x4d\xab\xf7\x53\xaf\x38\xea\x9c\xc8\xfe\xc0\xb1\xcd\x43\x55\x86\xf1\xe6\x84\x67\x4f\x87\x91\xe2\xeb\x8f\x45\xb3\xe3\x64\x44\x32\x29\xf0\xf4\x25\xe3\xf4\x1f\x92\xd0\xf2\x5c\x0e\x6f\x45\x2c\xc8\x87\x3f\xb9\x0f\x48\xfe\xa6\x9e\xa0\xcc\x53\x60\x70\xef\x25\x39\x29\x9d\x0a\xfb\xbf\xae\xd3\xbf\x0c\x05\x14\x82\xea\x03\x83\x00\xb8\x4e\xb8\xb9\x36\xee\x92\xfd\x9a\x3f\x55\x03\xd3\x60\xc5\x86\x1b\x9d\x39\xb9\x2b\x17\xda\x90\x3f\x7e\x0c\x0e\xb7\xfe\x7e\xa9\x2c\xdd\x05\xe8\x3b\xd9\x51\xac\xfa\xeb\x1b\xae\x8b\x75\x9d\x71\x6f\x38\xeb\x7e\x03\x72\xec\x20\xb9\x0d\xaa\xb0\x4d\x96\x55\xf4\x27\xc4\xf7\xaf\xa4\x01\xd1\x67\x5b\xf1\x76\xe8\x7e\xef\x7f\xd2\xe0\x09\x71\x55\x77\x7f\xc6\x33\xd4\xfa\x06\x11\x63\xfe\x32\x20\x86\xb3\x61\x17\xc2\x2f\x0d\x36\xf6\x71\xda\x69\xf6\x08\x43\xfb\xdc\x93\xb7\xf4\x41\xdd\x36\x74\x80\x9e\x42\xb9\x22\xa8\xfe\xe5\x06\x1d\x01\xac\xec\x9b\xed\xb4\x1c\xc6\xbf\xfe\xee\xbf\x0c\x1b\x54\x2c\x8b\x12\x7c\xed\x2b\x0c\xfb\x85\x4e\xc2\x4a\x6a\x3f\x5b\x46\x40\x87\x76\xe9\x3b\xce\xd1\x7c\xb4\xa4\xd2\xea\xe1\xca\xbf\xdc\xf1\x41\xd9\x50\x07\x09\x2c\xdc\x69\xc0\x4f\x8d\x26\x93\x3a\x1a\x4f\xa9\x77\xee\x78\x19\xc3\x2c\xd6\xfe\x36\x6d\xcd\xf1\xa0\x49\xfc\x2d\xde\x75\x56\xf6\x71\x3e\x58\xde\x42\x30\x89\x75\x5a\x23\x35\x16\xd0\xe2\x56\x56\x2f\x4d\xe6\xce\x35\xac\x5f\x55\xf5\xad\xea\xc0\x52\xf6\x42\x80\xdc\xe9\x0f\xf8\xe6\xa9\x92\xf7\x73\x2c\x6e\x83\xe6\x09\xdc\x91\xa3\xf6\x42\x81\x75\x13\x75\x15\x27\x83\x41\x53\x0b\xcd\x00\x8b\x9f\x7f\x87\xbc\xea\xab\xbf\xfe\xee\x3f\x2d\x26\x04\x16\x06\x0d\xf4\x77\x3f\x78\xcb\x0b\xd4\x37\xd4\xed\xe0\x7c\xf0\xa7\x0c\x9d\xa9\x2e\x4e\xbb\x42\xf7\x45\xa3\xb1\xe3\x21\x1c\x49\x83\x8d\xfb\xbe\x82\x00\x28\x81\x04\x93\xcd\x28\x11\xda\xe4\x5e\xd1\xf8\xa7\x4e\x97\x68\xb1\x43\x11\xbe\x00\x4e\x7e\x19\xc9\x5c\xc9\xb5\xae\x8e\x42\x28\x2f\x16\x10\xbd\x3a\x5e\xfd\xa2\x57\x29\xa4\x13\x8f\xf1\x80\xf1\xee\xf2\x85\x17\x8a\xe3\x83\x45\x8d\xab\xfb\xb7\x19\x54\xbe\x3c\xf8\x55\xb8\x78\x40\x14\x25\xa4\xd9\x74\x3b\xf4\xbb\x54\xca\x7a\x6f\xe6\x6e\xd9\x78\x20\xa6\xc4\x02\x22\x66\xb4\xae\x37\xd9\x7e\x22\xdb\xef\xe4\x3e\x91\x47\x42\xa7\x7f\x19\x63\x08\x0a\x0c\x2d\x38\xb5\x73\xd1\x64\xf4\xfd\xe1\x32\xd2\xf2\x4d\xac\xec\xbc\x30\xd8\x4e\x96\x84\x77\xc4\xe1\x0a\xfd\xa5\x75\xec\x3c\xba\xf5\x05\xd4\x20\x3e\x29\xb7\x63\xa1\x2c\x3f\xef\x46\x9d\x59\x1a\x43\xb7\xb9\x6a\x4c\x37\xff\x72\xa7\x28\x92\x46\x38\x71\xa4\x5e\x48\x59\xe0\xe7\x35\x48\x36\x6e\xaf\x62\x9d\xd9\x2d\xfa\x29\x4c\x0e\x01\xa5\x71\x69\x5c\x4a\xdc\x15\x16\x95\xab\x99\xe0\xd5\x29\x63\x67\xb1\x0e\xe3\xe9\x8c\x3c\x48\x53\xe1\xff\x6e\xbc\xd7\xc9\x1e\x11\x96\x2b\xf5\x2d\x59\x11\xe7\x80\xfb\x15\xa6\x80\x0a\x93\x37\xdb\x44\xa6\x4e\xe8\x93\xf4\xc5\xe6\xf3\x69\xd8\xff\x9b\x9d\x87\x8a\x42\x40\x3a\xff\x6a\x23\x35\x46\x0b\x89\xde\x3c\x34\x65\x51\xaa\xe3\x81\xb4\x8d\xbb\x3a\xf9\x30\x76\x78\xee\x3f\x90\x9b\x5b\xde\x3c\xc2\x45\x90\x70\xdd\x97\xe3\xf8\x58\x22\x8c\x0a\x9f\x69\xc1\xea\xb0\x32\x2d\xbc\x46\x2a\xa3\xfb\x27\x6a\xcf\xf7\xef\x6e\xce\xeb\xe1\x77\x07\x85\x0e\xc0\xc5\xf4\x72\x7c\x83\x77\xa5\x66\xf6\x5c\xde\x5e\xf1\x68\xda\x58\x34\xf2\xd7\x29\xd6\x68\x2b\x15\x14\xf7\x96\xaf\x9d\x71\x3b\xd9\x0f\x28\x92\xae\xfd\xe2\x61\x6b\x43\xd0\xca\xf5\xce\x70\x57\x2b\x36\xd8\x38\xd9\x37\x68\x63\x97\xce\x44\xfd\xfe\xcc\x34\x82\xc7\x23\x14\x0a\xf7\x77\xcb\xfe\xe5\x14\x40\x21\x94\x30\x94\xd8\xc0\x96\xb5\xf3\x31\x91\x7e\x4e\x56\x3f\x1a\xe4\x30\x6c\x85\xa4\x4f\x69\x38\x0e\x05\x05\xc4\x73\x9d\x7a\x61\xe2\x18\x85\x0e\xf5\xd6\x80\x25\x67\xe3\x29\x7f\x34\x3d\x6b\xe8\xf3\x77\x2e\x2d\xac\x05\xb3\x33\x05\xc6\xf9\x8d\x37\x91\x95\xae\x71\xb0\x3f\x59\xda\xf3\xae\x7a\x3d\x03\x44\xdf\x2e\xe1\x0b\x5b\x1b\x5e\x53\x66\xa2\x3e\xe5\xc8\xd8\x1c\x1d\x9b\x6e\x30\x4a\xc4\xa5\xd9\x31\x8e\x99\x45\x33\x48\xfc\x66\x09\xb6\x59\x4c\x54\xc2\xf0\x58\x55\x3f\xe2\x1d\xc0\x2d\xb5\x72\x7b\xb1\x71\x47\xe3\xcb\x43\xc2\xef\x6a\xca\x39\x36\x47\xed\x73\x6e\x98\x53\xfd\x77\x6a\xff\xf2\x4c\xa0\x10\xd8\x68\x1f\xf0\x34\x76\xb6\x0f\x3b\x6d\xe2\x7e\xae\x25\x17\xe5\x3e\x79\x46\x19\xbb\x75\x89\x9a\x1a\x1d\xd4\x34\x52\xd0\x83\x27\xc5\x27\x55\x41\x4c\x0c\x2a\x41\xbd\x4d\xe1\xe3\x81\x60\xae\x56\x2b\xd4\xc2\xec\x4a\xfa\x6b\x30\x46\x08\xb7\x35\x03\xde\x72\xe6\xb4\xec\xb7\xb0\xa0\x12\x58\x62\xd3\xfe\x5b\xae\x71\xdb\xb5\x8c\xfa\xd7\x84\xe0\x8b\x37\xbc\x05\x75\xef\xed\xe2\x0c\xb1\x99\x9d\x9f\x64\x47\x2b\xf4\x56\xdd\x5b\x83\x25\x85\xf9\xb9\xa3\xc7\xdb\xf8\x3a\xdf\x34\x3e\xf9\x7e\x7e\x4e\x31\xcb\xb2\x76\x96\xb0\xdd\x3b\x18\xfd\xac\x1c\x1a\xbb\xbb\xf5\x03\x49\xf7\x7c\x0a\xf6\xff\xe8\x49\x89\x8a\x20\x00\xcf\x6e\xd4\x48\xd9\x68\x9e\x94\x38\x7e\x08\xa1\xaf\x54\xa1\xe2\x88\xcc\xc6\xf2\x65\x05\x77\xb8\x0b\xb0\xd1\x48\x64\xde\x3f\xa4\x11\x00\xcc\xba\x60\xf5\xac\xab\x03\x49\x40\xfa\x47\x74\x36\x42\xdc\xd7\x7c\xf5\xdc\x19\x0e\xd9\xde\x11\x82\x06\x65\x09\x6c\x36\xd6\x52\x1c\x08\x8f\x92\x6d\x66\xbe\x36\xfc\x61\xb4\xa9\xe6\x15\x5e\xfd\xd1\x3c\x8a\xb4\x1a\xc9\x7e\xb4\x73\x42\xce\x31\xb9\x14\xf5\xf1\x70\x95\xb6\xc5\xc0\xb4\xe8\x50\x27\x8c\x3c\x6a\x3c\xdd\x4f\xdf\x6b\x8c\xaf\xaa\x90\x87\x40\x55\xd1\x7b\xce\xa4\x7b\xfa\xe9\x05\xb8\x2c\x55\xcf\x25\x9b\xfe\xee\xd8\xbf\xbc\x2e\x28\x04\x8a\xf5\x1f\xca\xe8\x65\xce\x11\x87\x27\xca\x28\xe7\x89\x19\xe1\x34\x96\xbb\x4e\xeb\x55\x2e\xc2\xcd\xf3\x76\x4c\xbe\x9a\x2c\x7a\xf7\xdc\x51\x8e\xe0\xc3\x3e\x29\xfd\xf6\x2a\x49\x18\x74\x93\x95\x56\x74\xa2\x48\x7b\x77\x63\xd0\x2f\xe2\x61\xb0\xb5\x92\xa7\x75\x42\x4d\xa2\x88\xb1\xb2\x16\x10\x65\x9e\xfd\xa0\x0c\xdb\x48\x8d\x31\xfe\xa4\xb8\xb8\x18\x13\x36\x55\xe2\xcc\xd9\x99\xb7\x76\x7c\x9b\xd5\x94\x2b\xf1\xa2\xed\xd9\x19\x68\xd5\xbb\x6d\xd5\x5c\x5e\x63\xbc\x70\xda\xa1\x33\x32\x7a\x20\x6c\xb5\xec\x4a\x30\xf9\x91\xd3\x4b\x05\x6f\xc8\x44\xd2\x9f\x33\x7c\xfb\x37\x15\xf0\x2f\x2f\x11\x0a\x21\x0c\x80\x01\x01\xac\x5b\x70\x99\xf5\x98\x5a\x5a\xa2\x09\x0e\xb2\xed\xc6\x37\x09\x64\x73\x68\x4d\xb0\xe2\xaf\x36\x28\x78\x89\x2c\x2c\x0e\xf6\x9f\xfc\xa7\x68\x75\x5d\xf2\x23\x06\x1f\xa7\x4b\xba\xfa\x11\x2d\x52\x56\x96\x63\xbe\xb0\x2b\x85\xa4\xad\xb2\x3d\xe6\x8a\x6f\x21\x4d\x98\x86\x04\x58\x7e\xe8\xe7\x22\x4e\xce\x45\x72\x0c\x1f\x41\xcd\xc9\x6c\xe8\x9d\x8a\x78\xe9\x0b\xaf\xcc\x96\x08\x3f\x93\x1b\x75\x18\xa1\x1b\x0a\xbe\xec\x3f\xfc\x59\x1c\x18\x1c\x20\xcf\x1f\x19\xf8\x22\x43\x94\x1a\x41\xa4\xce\x5b\xa1\xc7\x97\xc0\x2e\x78\xa6\xbe\x2b\x70\x76\xe4\x0c\x26\x18\x8e\xf5\x4f\x96\x5a\xc5\x75\x54\xc8\x8b\xd6\x93\x72\x88\x73\x7f\xf5\x9c\x8c\x05\x8c\x47\x0f\x74\xa6\x13\x33\x41\xe6\x8b\x46\x7f\xfc\x5d\x85\x7f\x39\x36\x50\x08\x82\x28\x16\x1c\x88\xfd\xd2\x62\x77\xe6\xd7\x5b\xd1\xcb\xcd\x8e\x40\xbf\xfa\xa3\x86\xff\x23\x3e\xa3\xcb\xce\xbd\x10\x5e\x24\xe1\xe7\x0d\x69\x7f\x3c\x33\x78\x95\xcf\xb3\xe8\xe4\x10\xb2\x8a\x29\x40\xb9\xb4\x2f\x3f\x77\x20\x3f\x8d\x6e\x4d\x4f\x50\xd4\x21\xea\x79\x99\x24\x4f\xb9\xc2\x0e\x3a\x2c\x10\xcf\xb3\x6b\x06\x56\xe2\x90\x46\x0e\x62\xca\x26\xd7\x04\xe8\x6c\xad\x45\x34\x83\x56\xcd\x26\x6c\xa5\x40\x41\x45\x2d\x57\x27\x20\xba\x25\x56\xd8\x1e\xad\x54\xb4\x7b\x4d\x7d\xc1\x45\xa6\xf1\xc6\xfa\x37\x4e\xf4\x67\xba\xea\x8c\xbd\xb7\x56\x65\xd7\x31\xef\x85\x3e\x81\xc9\x44\x5f\x4d\xd6\xdc\xc0\x54\x12\xb4\xe0\x39\xde\xd5\x66\xa2\x8a\xcc\x67\xf2\xef\x38\xbe\x23\xb2\x5f\xa8\x5e\xb0\x45\x59\x8d\xac\x9c\x8f\xe2\xfd\xff\x82\xa9\x75\x1b\x42\x4f\x7d\xe1\xf4\xdd\xe0\x6d\x32\x5e\x85\x70\x96\x2f\x99\x6f\x2d\x6b\x1f\x9e\x96\x05\xaf\x2c\xb3\xa3\xd3\xe6\x0f\x42\x21\x0f\x0f\x0f\x0f\xc9\x94\x60\x9c\x9f\xa5\xa9\xde\x9a\x18\xb4\xb4\x25\xca\xf3\xb1\x3b\x6d\xcc\x27\x14\x91\xd0\x7e\x5d\x4f\xdf\xda\x46\x1c\xee\xd0\x79\x5f\xee\x12\x80\x69\x93\xf5\xb1\xee\xc3\xe9\x8e\x92\x7f\xe9\x70\x3a\xbd\xce\x95\x0d\xbf\xfe\xe9\x6c\x63\x2b\xd0\xe7\x20\x78\x42\x48\x96\x1c\x07\x74\x57\xd6\x7a\xda\x75\x16\x65\xe6\x5a\x20\x6e\xb7\xd1\x27\xd1\xaf\x16\xe3\x39\xf6\xbe\x5e\xf9\x59\x50\xa4\xb3\xfc\x76\x90\x2e\x2a\x33\x90\x21\xb4\xcb\xc9\x90\xad\x0e\x7a\x71\xca\x52\xe3\x7e\x45\xc6\xb1\xe5\x33\x2d\xcf\x57\x21\x62\xf9\x7c\x04\xf1\x99\xd1\x7b\x07\x21\x8f\x24\xd0\x77\x0d\x20\xbc\x6d\xda\x76\x35\xba\xe6\xec\x46\xe7\x2b\x7c\x4e\xcf\x92\xf9\x44\x28\xc2\xac\xfb\x09\xdd\x29\x73\xfd\x0b\xf4\xa8\x7e\xdf\x47\x6b\x86\x6a\x5f\x75\x36\xec\xcc\xe1\x7c\x1b\x29\xcf\xcb\xf3\xae\x05\xce\x21\x7c\xf2\x1d\xa2\x20\xe5\x3b\xf3\x82\x0f\x0b\x26\x3d\x8d\xc0\xc3\xb1\xac\x59\xed\xcb\x7c\xed\xee\xa1\xeb\x8a\x04\xce\x66\x3d\x47\xfa\x77\x0c\xac\x54\x4b\x26\x8a\x1e\x06\x8e\x3e\xef\x2e\x76\x79\x30\x80\x78\x84\x29\xfe\x4d\xdf\x49\x7f\x2e\xf1\xf7\xf0\x8f\x6e\x73\xb3\x65\x75\xa9\x22\x22\xf5\x91\x89\x2b\x70\x3c\x18\x37\x44\xdc\x4a\x3f\x80\x41\xd5\x29\x44\xd1\x45\xeb\xc5\xb0\xc3\xda\xd4\x87\x6b\x28\xb8\x58\xbc\xd1\x53\x22\x63\x19\xb5\xb5\x8c\x92\xeb\xc6\x5c\x8e\x88\x86\x1f\x25\x53\x31\xec\x7d\x30\x39\xe2\x90\xe2\x11\xac\x3f\xe9\x90\x4f\x9a\xef\xf7\x39\x36\x1b\x7b\x57\x19\x2e\xcc\x4c\x77\x7d\xb1\x4f\x73\x03\x2c\xf4\xf3\xcf\x3f\x53\x38\x11\x5f\x1e\x6b\xd0\x8b\x58\x4c\x95\xcd\x4a\x59\x36\xc0\xf4\x6b\xd7\xb7\xc9\x04\xa4\x73\xf6\x8c\xad\x52\x01\xcd\xfa\xd3\x99\xa7\xfa\x4e\x2b\x27\xd9\x60\x24\x63\x24\x97\xa7\x67\x63\x18\x1c\xa2\xbc\x8b\xf8\x57\xdd\xb1\xbd\xc9\x6e\xb2\x8e\x4c\x77\x81\x39\x61\x47\xda\x06\xf6\xb7\x25\x26\xd6\xfa\x90\x9b\xab\xb4\x5b\xab\x72\xd2\xaf\xe1\x16\x95\x7f\x16\x6f\xb6\x5f\x8a\x84\x0a\xe2\x99\x3c\x0e\x0a\x45\x15\xbd\xd0\xbd\xad\xe9\x9b\xf1\xa3\x7b\x6a\x81\x1b\xe7\x28\xdf\xb6\x92\xc2\x8f\xab\x2f\x46\xf3\xe9\xbd\x77\xd2\xcc\x2f\xe0\xa2\xbf\x6b\x5c\x62\xe2\xb5\x57\xd2\x70\xfd\x58\xc7\xdd\xc7\x68\xeb\xb3\xfb\xac\x41\xc3\xd3\xbd\xeb\xe1\xa5\x4e\xc1\x0e\xac\x1e\xdb\x7f\x7a\x9e\x4d\x53\xf0\x6c\x73\xa2\x78\x78\x3e\x5d\xe5\xe4\xd8\x9f\xb2\x38\xdd\xf2\x5f\xb1\x93\x87\x62\xdc\xea\x07\xd6\x2e\x33\x34\x1f\xb2\x3d\x6a\x6a\xb7\x1e\x2c\x2c\xae\xbd\xd1\xb2\xfb\xf5\xe1\xf6\x85\xcc\xee\xb6\x2e\x95\x1c\x7a\x8a\x75\x35\x7b\xd9\x6d\x2e\x29\x8a\xe5\x2d\x50\x4b\x12\x70\xee\x22\xec\x03\xdd\x70\xf0\xe1\x98\x9c\x92\x2c\xa6\x79\x17\xf3\xae\x0e\xae\x71\xe7\x13\x81\x60\xf2\x27\x4b\xcf\x78\x6e\xca\x47\xc9\xf6\x22\x43\x3a\x8f\x4d\xe2\x28\x5e\xcf\x79\xc4\x32\x05\xb6\x8a\xd9\xd4\x82\xbd\x7b\xf5\x9c\x90\xa6\x85\x2a\x5d\x6c\x6c\x77\xb0\x3b\x14\x3e\x86\x0e\x94\x44\xf1\xf4\xf8\x4a\xfe\x68\xbf\xfd\x1a\xae\xb4\x03\x2d\x6a\x9e\x64\xe4\xa4\xdf\xd8\xe2\xf5\x40\x12\x05\x2a\xc0\x7f\xcd\xd8\x8e\x7e\x8b\x4c\x57\x73\x68\xbf\x85\xc2\x34\xbe\x8e\x9a\x17\xad\xa3\x4f\x22\x94\x18\xab\x54\xdc\x66\xb3\x15\xbe\xa7\x2a\xf9\x28\xa9\x56\x7c\x42\x60\x78\x66\xc4\x3a\x95\x65\x27\x93\x79\x2b\x56\x6e\x8d\x61\xf6\x65\xa4\xd0\x28\x68\xa4\x3a\x11\xf2\xce\x9c\x2b\x1e\x5c\xa8\x17\xf5\x9c\x78\xa9\x4c\x8a\x0b\xd8\x27\xc8\x4b\xf2\xbe\xbb\xfe\x01\x56\x7e\xf5\x54\x78\x1f\xeb\xa7\xca\x8a\x84\x42\xcd\x49\xaa\x1f\x35\x25\x28\x7e\xe7\x70\x15\x1c\x8b\xb2\x1f\x48\x42\x7a\x6e\x80\x91\x05\xf3\x33\xd2\x11\xfb\xd7\x1f\xa4\xea\x7e\x24\x54\x7d\x73\x22\x80\x1a\x66\x51\xc6\xa4\x09\x0e\x6f\x2a\x95\x54\x27\xf1\xf7\x4d\xf9\x9a\xa0\xfa\x8b\xbb\x46\x24\x11\x71\xd5\x51\x24\xe3\xcc\x2c\x0f\x6e\x20\x6d\x76\x9b\xea\x59\x6a\x2a\xc0\xe9\xba\xb9\xc0\x96\x7b\x37\x52\xc1\x9d\xe9\x27\x6a\xac\x13\xfd\xed\xc3\x6f\xd1\x37\x02\x9f\xcf\xe6\x40\x9f\xb3\x48\x36\x9a\xa8\xdd\x91\xee\x5b\x2d\x65\xe8\xb7\x94\x1f\x1f\xcc\xa7\x59\xab\x3a\x0a\xea\x86\x99\x86\x53\x25\x66\x9e\xd3\xe4\xeb\x03\x27\xfa\x2d\xa6\x4c\x63\x07\x03\x0b\x7d\x7a\xc6\x99\xe4\x27\xfe\x5c\x13\xe3\xa7\x7b\x70\x10\x9a\xd8\xfb\xf5\xa7\x61\xa7\xf5\xb1\xac\x80\xcf\x39\x22\x5a\xde\x7c\xfc\xc3\xdb\x94\x89\x31\xf0\x38\x31\xcd\xc9\x50\xfb\xc7\xa7\x97\x78\x4d\x01\xcd\x47\x10\x43\xb4\x2b\xa2\xcb\x75\x60\x50\xb8\x21\xf1\x9a\xe2\x2f\xe3\x0d\xce\xd5\x74\x76\x18\xc3\x45\xef\xd7\x65\x3c\xfc\x0f\x04\x43\xbe\xa2\xdf\xd2\x92\x96\xca\xc5\x8d\x3d\x0e\xaa\xcb\xc4\x6e\x1f\x13\x09\x7f\xbb\xd9\x46\xfd\x16\x79\x69\xc9\x52\x85\xc3\x6d\xc8\xfc\x94\xb6\xd2\x6e\xd4\x00\x0e\x39\xe4\x80\xf6\x3f\xa9\xa8\x5f\xaf\xc5\xdb\x46\x6f\xee\x07\xb0\x2d\x56\xcd\x24\x57\x62\x32\x8e\x35\xe8\xb0\x5f\xe9\x0a\x7b\xe2\xf1\x60\x24\x4a\xe5\x7a\x82\x11\xf6\x21\x82\x59\x67\xd1\xc4\xb9\x35\xd7\xa5\xc7\xae\x02\xfa\x26\x6d\x5e\x95\x29\x26\x42\x48\x8b\xc9\x6a\xdd\xe2\x73\xea\x15\x47\xa0\x5b\xbd\x0b\xe4\xbb\xe8\x27\x2b\xeb\x81\x3d\x98\x76\xdd\x05\xc5\xe9\xba\xae\x48\x48\x6d\x79\x17\xf3\x2f\xcf\x15\x49\x8b\x2c\x59\xb1\x47\x55\x75\xee\xa9\x48\x2c\x7d\x52\x09\xd0\x72\xda\x62\xe8\x19\xcc\x3e\xb1\x12\xcb\x6e\xac\x35\xe3\x84\x65\x59\xa2\x34\x97\xb5\xca\x8b\x82\x19\x06\xc5\xdd\xbb\x9e\xd2\xb9\x93\x63\x6e\x0e\xf1\x8f\x57\x5f\xd9\x52\xb3\xe1\x8e\xef\x9a\x8c\x6c\x76\x32\x1a\x22\x43\xb2\x0c\x81\x45\x2d\x8c\xa5\x8b\x72\xb2\xfd\x75\xcd\xac\x1d\x9a\x0e\xaf\xe8\xee\xee\x70\x1a\x48\xc3\xa1\xea\x92\x73\x19\x17\xec\x39\xd4\xab\xf3\x9f\xe3\x57\xc1\xb6\xc0\x18\x97\x20\x7e\xda\x68\x5e\xb0\x13\x44\x97\xe0\xcc\x8a\x2f\x92\xf2\x8e\x78\xe4\x6d\x74\x8b\x02\x0c\xda\xcb\x07\x15\x20\xe6\xa0\x72\xd0\xf2\x27\x70\x55\x41\xbf\x7d\x60\xac\xee\xd8\x9a\x35\x9e\xf8\x9d\xf8\x2d\x8e\x30\x72\x7b\xfe\x0d\xea\xb7\xe6\xbe\x76\x40\xd5\xcc\x21\x3c\x7b\x2d\xda\xc9\x43\x1c\x3f\x42\x94\x73\x5a\x98\x8a\x94\x12\x3d\xf2\x7e\x3b\x91\x37\x6b\xf9\x74\x7a\xf7\x47\x1c\x52\x40\x79\xd8\xb6\x7c\xbb\xfe\xf9\xc4\x0d\xcf\x66\x15\x73\x9c\x7e\xd1\x56\x1f\x6e\x68\x37\xa5\xf9\xd4\xd3\x82\x44\x5c\x71\x2d\xb6\x42\x44\xe0\x47\xa5\x83\x31\x78\xd6\x86\x8f\x59\x44\xff\xf6\xeb\xb9\x12\xf1\xc7\x1d\x0e\x51\xaf\xc6\x2c\xc2\x06\x4b\xcb\xe4\xee\xb7\x7c\x33\x67\x80\x9b\xc9\x59\x78\x1b\xc7\xcc\x6b\xd7\xf0\x2b\xef\x43\x06\x36\xb6\x1c\x87\x0c\xa5\x21\x69\xed\x4c\x13\xc9\x2c\x72\x55\x4a\x06\xb1\x5c\xd5\xa3\xe4\xfa\x5d\x8e\xed\x88\xaa\x8e\xe2\x26\x69\x56\x42\xae\xff\x15\x1f\xb6\x9a\x5f\xae\x92\x31\xbb\x47\xb7\xbe\x70\xd4\xdb\x22\x4b\x6f\x10\x88\x83\x7b\x40\x30\xcd\x27\xbf\x29\x47\x71\x37\x9d\xf8\x9d\xbb\x43\x8d\x3e\xbf\x4c\x5b\xe2\x3c\x7a\x98\x56\x30\xec\xd5\x9f\x3b\xa0\xb1\x91\xca\x49\x8d\xc8\xa6\xc7\x4b\xe9\xd6\xdf\xaf\xa8\x65\x3c\x2e\x03\xb4\x6d\x49\x98\xba\xab\x39\x2f\x6b\x0b\xa2\xd0\xe1\x46\x7f\x5c\x03\x83\x56\x5e\xf4\xe9\x95\x9a\x3f\x44\x8c\xb5\x19\xe3\xc9\x7d\xd3\x38\x87\xcd\x19\x6e\x78\x3d\xd6\x49\xef\x79\x61\x52\xa8\x29\x4e\x09\x80\x00\x4f\x88\xa3\x7f\x73\x65\xb8\x29\x3b\x52\xe5\x27\x15\xf3\x16\x3b\xe3\x26\x09\x34\xc6\xb5\x27\xb1\x51\xbe\x3d\x31\x19\x83\xc5\x0d\x07\x06\x85\xdc\x37\x94\x22\xee\x7d\x24\x25\xbd\x56\x90\x65\x0b\x7b\x2d\xf3\xc6\x04\x47\x25\x06\xde\xd7\x62\x74\x81\xa8\xd6\x5b\xb2\x18\xc8\xd9\x49\x47\xee\x8c\x06\x74\x08\xbe\x39\x69\x24\xff\xc2\xb4\x79\x22\xa0\x8e\x4a\xc9\x4a\xe8\x81\xb8\xff\x39\x7c\xdd\x8c\x78\xa5\xe4\x0b\xb0\xfa\x72\xf6\xc6\x11\x62\xab\x13\x9f\x60\x7b\xe5\xa3\xb0\xa9\x47\x13\xb5\x6b\xcf\x70\xfc\xd3\xaa\xbe\xed\xc4\xef\x7f\x90\x27\x75\x4e\x7e\x1c\x34\xf4\x39\xed\x5e\xc7\xc5\xe6\x93\x60\xef\xc9\x75\x13\xce\x0e\x34\xcc\x2a\xa8\xee\xae\x6e\x1b\xa6\x96\x9d\x22\x23\xb6\x63\x14\xec\xa3\xe4\x35\x65\xf2\x05\xe7\xc4\x47\x3d\xad\xe3\x27\x83\x83\xc9\xcf\xeb\xad\xa3\xb9\x0c\xea\xea\x66\x39\xb1\x7e\x38\x98\x68\xc8\x49\x50\x02\x73\x82\xea\xbb\x24\xe8\xd8\x71\xc5\x26\x4d\x6d\xe7\x6a\x31\xf9\x78\x91\x22\xb5\xdb\x46\x60\xc6\x61\xcf\x6d\xd8\x12\xdd\xb5\xee\xbd\x02\xaa\xd3\x3e\x22\xa1\x25\x0b\xbc\xe5\x77\xc0\x9d\x8f\xb9\x32\x2a\x1f\xad\x2a\xfc\xde\xa6\x04\xb3\x47\xf9\x99\xf7\xbd\xdb\xcb\x3a\x91\x6f\xe0\x96\xfe\xe1\xda\xe5\x6b\x7c\x9f\x8e\x56\x3e\x63\x63\xbd\xfd\x22\xa1\x03\x6b\x32\xe7\x6a\xdd\xf6\x40\x7b\x92\xa5\x27\xbc\x7b\x19\xc8\xad\xd6\x43\x1d\x62\x3d\x2e\x24\x49\x7c\x8c\xc9\xb6\xbd\x30\x6f\xb0\x29\x2e\xc5\xe3\x0d\x0b\x54\x79\x3d\x37\x2b\xce\xd0\xa7\xe7\xfe\x00\x0b\x45\x14\xfe\x50\x39\x7b\xe0\x38\x52\x9c\x3a\xce\xdb\x07\x73\x2e\xdf\x75\x22\xfc\x40\x6f\xf5\x8a\x17\xc6\x20\xc5\x5b\xbc\x54\x75\x04\xb0\x12\x1a\xc4\x38\x31\x75\x15\xfb\x11\xf1\xf6\x6d\x6d\x86\xd9\x07\xa4\x4c\xd1\xe8\xbc\xd3\x7d\xd8\x6c\x9e\x68\x7b\x84\x82\x26\x2e\x8f\x92\x7e\x73\x78\x53\xfb\xb1\xe6\xc8\x0c\x17\x30\x9a\x19\x0a\x9e\xaa\x67\xf0\x6d\x5a\xfe\x0a\x96\x6c\xfa\x0e\xfa\x92\x8b\x08\x93\xcf\x80\xcf\x23\x62\x10\x7b\xe8\x6e\xe5\xd1\x30\x9c\x12\x15\x90\xb4\x6d\xf2\x8e\x91\xac\x7c\x86\xd7\xa0\xe7\x96\x13\x21\xeb\xe2\x6f\x8c\x02\x1e\xb7\x34\x29\xca\x4f\x4a\xcd\x02\x3d\xa4\x22\xa0\x8d\xda\xbe\x98\x87\xef\xae\xb2\xa2\x9f\x3d\x51\xe7\x49\xaa\xc4\xed\x67\xd7\x1a\x01\xaa\x82\x63\x02\x3e\x36\x65\xa7\xfa\x8f\xd5\x2d\x89\x0c\x4b\x13\x9d\x89\xd7\x9b\x69\xf9\xf5\xeb\xa8\xd2\x45\xd2\x30\x68\x93\x3c\x1c\x19\x82\xf7\x89\x8d\x19\x0d\x3e\x2a\x03\xcc\x20\x2d\x02\x4f\x97\x72\xc0\xec\x90\x6c\xa5\x27\x26\x0c\x83\x52\x5b\xe7\xcb\xa7\x58\x26\xa2\xa2\xcf\xfe\xb7\x62\xe7\x5f\xce\x29\x14\x82\x00\x03\xa3\x02\x84\x6d\x28\x2e\x25\xc2\xf3\x15\x12\xd5\xb4\x97\x92\xdb\xbf\xfc\xb6\xb9\x5d\xb6\x36\xab\x8e\x69\x32\x92\xc5\x45\x26\x3b\x2f\x44\xc3\xc1\x7d\x7d\x16\x32\x22\x32\x5b\x6c\xdd\x8d\x59\xf0\x09\x15\x0b\xf6\x03\x0f\x07\xa1\x80\x43\x56\x02\xba\xff\x3a\xf6\xb7\x88\xfe\x8a\x12\xe0\x29\x50\xef\xe9\x7e\x39\x6f\x6d\x76\x1a\x82\x77\x7b\xce\xb6\x45\x6c\xe8\xb9\x04\xa7\x4c\x32\xd5\xc4\x02\x85\xb2\x9a\xef\xdb\xeb\x0d\xb0\xd1\x7b\xee\x4a\x3c\xab\x83\x9d\x92\xe1\xb5\x42\x62\x29\x3c\x47\xc7\x5a\x34\x0a\x2f\x89\x34\xb5\xb7\xa0\x8b\x61\xe1\x0d\x25\xd2\xe2\x7f\xda\xa1\x4b\x9b\x33\x6d\xd0\x63\x44\x9b\x36\x8b\xc7\x92\x2b\xa4\xff\x0c\xc4\xcc\x5c\x1c\xed\x26\xc3\x52\x67\x18\x80\x53\x28\xf8\x46\xff\x37\x76\xfd\xa7\xdf\x0b\xf1\x81\x31\x00\xcb\x96\x5e\x92\x28\xa5\x7f\xf8\x1d\x6b\x68\x44\x55\xd1\x3b\xdb\x21\x0f\x33\xf5\x79\xd3\xe0\xf8\xcb\x29\xb6\xd3\xdb\xa9\x73\x56\x9c\x00\xb0\xf4\xa2\x88\xf5\x29\x0b\xa7\x3a\x63\x8a\x41\xaf\xdc\xd1\x7a\x10\x75\x15\xb6\x41\xb0\xb2\x62\x85\x39\x65\x4c\x32\x76\x4a\xd9\xb6\x0a\xd8\x8d\x0e\x96\x21\x3a\xca\xb6\x8a\x0f\x53\x25\x6e\x3a\xbf\x94\x0f\x61\xb9\x52\xe4\xdd\x7a\x7f\x84\xd0\x83\x26\x67\x9d\x9e\x18\x39\x1f\x88\x93\x98\xa5\x65\x84\x18\x46\xed\x5b\x1c\x25\x04\xf9\xa2\x69\x78\x4b\xd6\xe3\xe1\x8f\x7b\xc6\x1d\x3e\x3d\xe2\x85\x8b\x28\xbe\x2d\xfb\xf3\x37\x6a\xfb\x97\xff\x07\x85\xb4\x47\xc3\x80\x2d\xbb\xbd\x5f\x26\x1e\x47\x0e\xc6\x3d\xc9\xd9\x3a\x28\xdd\x3d\x5a\xd8\x2a\xc3\x38\x43\x1a\xe4\xca\x14\xe6\x3d\x0d\xb9\x75\x7e\x78\x03\xf6\xde\x65\xff\xc2\x1b\xe9\xbc\xc7\xa8\xcf\x98\x94\x31\x8a\xf7\x5b\x5a\xb7\x51\xe0\xeb\x1d\x5e\x15\x75\xdf\x3c\x0f\x02\xb6\xea\xc2\x39\x48\x91\x25\xdd\xb7\x26\x96\xf2\xb2\xf6\x87\x65\x96\xdf\x53\xe5\xd5\x31\x6a\xa1\x01\xb9\xc8\x30\x69\x71\xda\xb7\xd2\x41\x21\x2a\x10\x42\x90\x7d\x96\xba\x6a\xc0\xff\xe4\x3a\xb5\xd5\x61\xa3\xc2\xc3\xba\xea\xf9\xf2\x2b\x42\x7e\xae\xaf\x47\x10\x64\xb8\x94\x6f\x3d\x2e\xe9\x04\x60\xde\x56\x71\x7d\x5c\x58\xcc\x2a\xb8\xc5\x98\x99\x8a\xae\x60\x1d\x65\x23\x62\x9b\x9f\x34\x7c\x36\x83\x5f\xdc\x89\xfe\xd5\x16\x91\x81\xef\xdf\x0d\xfe\x97\x73\x07\x85\x50\xc2\xfd\xa7\x2e\x6d\x3e\xb3\x50\x92\x7a\x33\xe0\x36\x18\x39\xcd\x66\x96\x6e\x97\x1a\x1b\x66\x69\xd6\x1c\xb6\x48\x6a\x34\x63\x39\xe2\x0c\xbb\x00\xc4\x50\x8d\x3d\xf3\xcb\x32\x71\x94\x74\x55\x87\xf9\xb9\xbe\x21\xb1\x5b\x23\xd0\x61\x27\x17\xf1\x61\xbf\x5b\x44\x40\xd9\x28\x7b\xfc\x03\x88\x18\x81\xf1\xbc\x31\x10\x45\xb9\x51\x3c\x30\xb8\x4b\x45\x37\xba\x3a\x8d\x34\xc3\x0c\x8d\xed\x82\x3f\x24\x0a\xb8\x77\xd7\x70\x96\x72\x06\x44\xb7\xbb\x1a\x84\x5f\x1b\xd8\x29\xdc\x52\x14\xa0\x16\x5a\x59\x7a\xd3\xf5\x48\x35\x98\xb1\x45\xb3\x6b\xfe\xee\x61\xeb\x1b\x28\x8d\x3c\xf7\x83\xff\xbf\x39\x4e\x50\x48\xb2\x08\x35\xc8\x30\x83\x6b\x44\x88\xdf\x8b\x89\xad\xb2\x4e\x22\x16\xb6\x54\xb1\x16\x9c\x97\xfe\xfe\x17\x81\x5b\x04\xaa\x86\xef\x76\x34\x7a\xd7\x19\x58\x27\x99\x65\xbb\x15\xc1\xeb\x15\x7c\xb3\x82\x5a\xb8\xeb\x19\xfb\x4a\x6d\x46\xe0\xfc\x6a\xab\xde\xd8\xba\x01\x93\x3f\x41\xcb\x68\x22\x0b\x44\x92\x65\x29\x6f\x35\x3a\x4b\x9f\x4d\xbc\x89\x14\x7b\xfb\x43\xcc\xfc\xca\x38\x5b\x73\xef\xd3\xc7\x38\x68\xd8\xde\x0f\x49\x8c\xb1\xf7\xc0\xb5\xc0\x47\x91\xe9\x34\x1e\x4f\xf3\x99\x3d\xe8\x27\x3e\x5a\x40\x81\x0e\xae\x5f\x6d\x19\xdf\x4b\x58\xaa\x0f\x3f\x5c\xe0\x6f\x91\xe9\x00\x07\x4a\xe4\x54\x91\xff\xf3\xa4\xe4\x84\x60\xa7\x1a\x61\xee\xe2\x8a\x76\x42\xc0\x90\x47\x8f\x3f\xfe\xd7\x5b\x59\xaa\x98\x88\x1d\x26\x3e\x60\x50\x1b\xec\xce\x87\xfd\x88\x1b\x8e\xb7\x86\xd4\x66\x6b\xf3\x5b\xe3\x06\x62\x17\xc4\x3f\x3c\xff\xac\xff\x98\x2d\x26\xec\xee\xfa\xa9\x02\xc0\xc3\x55\x72\x9c\x7e\xd0\xc6\xff\x46\x92\xde\x6a\xd6\xd1\x0c\x88\x75\xa5\xd6\x14\xcd\xbe\x10\x1d\xcf\x76\x35\xe9\xef\xd9\xed\x07\xbb\x8f\x7a\xd3\x89\x73\xff\x46\x2d\x63\xa2\xfd\x48\x47\xcd\x57\xa2\x34\x4e\x4e\xd5\x57\x23\xc9\xd4\xfd\x69\x2f\xc6\x5e\x78\xde\x86\xf2\x11\xe1\xf3\x4f\x97\xf4\xff\x9d\x2f\x10\xe1\xc3\xc0\xce\x96\xa7\x5d\xe0\xcf\xf3\xb2\x1a\x8e\x34\xbd\x34\x43\xa6\x1e\x81\x2d\x9c\x29\x80\xaf\x95\x6f\xef\xb5\x3d\x31\x8d\x22\x58\xb9\xde\x83\xc8\x9e\xfd\x14\xbb\x2e\xc3\x75\x78\xf3\xfa\xc2\x32\xf8\x50\xcb\x15\x8f\x9d\x81\xe1\x2c\xf9\xc7\x56\x3f\xca\xef\x4a\x90\xf0\x69\xa5\x94\x6d\xf8\x10\x03\x9b\xa4\xe6\xe5\xe9\x9f\xae\xdd\xb9\xf1\x72\xa5\x27\xb2\x3f\x95\xc2\xdb\x38\x4e\xb2\x4e\x8c\xee\x0a\xc0\x16\xac\xc5\x17\xaa\xea\x67\x38\x23\x07\xd1\x75\x03\x14\x86\xf4\x8c\xdd\xd6\xfd\xcc\x83\x5f\x42\xa6\x9e\xc8\x5b\xd6\x46\xc7\xe2\x92\xe7\xfc\xfd\x73\xfe\xe5\x97\x42\x21\x70\x30\x3e\xfe\xc0\x9f\xb3\x96\x26\x9b\x81\x9b\xdc\xfc\xed\x53\xe9\x59\x44\x56\xc1\x1b\xe5\x0d\x6b\xcc\x26\xce\xa1\x21\xee\xd1\x5d\x9b\x31\x24\x7f\x54\x10\xa2\xf7\x9b\xbd\xf2\xec\x8a\xd0\xac\x5a\xc4\x5f\x86\x53\x20\x6f\x03\x66\x16\xaf\xab\xc3\xd4\x6b\xa7\xb0\x34\xb4\x70\xa4\x0d\x46\x0f\xec\x3f\x56\x64\x6a\x65\x48\x64\x1c\x9c\xbf\x34\x5f\x36\x39\x14\x5b\xfa\x1a\xa6\xf0\xeb\x15\x2d\x24\x20\x77\xbb\xf0\xab\x6d\xf3\xb6\x3f\xb8\x69\x54\x35\xa5\x84\xf0\x02\xbc\xb5\x13\xaf\xa5\xf8\xb1\x87\x8e\xf7\x4e\x1e\xe2\x2d\x77\xfe\xd0\x2b\x33\xf9\xcc\x5e\x2c\x8f\x31\xa9\xfe\x05\x6b\xfe\xcb\x44\x42\x45\xe9\xc0\x3e\x61\xfe\xdc\xec\x43\x8e\x93\xc2\xf4\x05\x7d\xf6\xa5\x75\x3d\xad\xe8\xa5\x9a\x51\x47\x70\x93\x34\x03\x81\x08\x52\x53\x91\x47\x71\x9e\xa0\x8d\xe2\xc2\xcb\xbb\x52\xae\xbe\x37\xd0\x55\xf5\x5d\x81\x9f\x93\x82\xea\xf5\xa6\xbf\x87\x55\x1c\x6c\x20\xdc\x08\x98\x2a\x4f\x07\x0b\x3a\x83\x9d\xcc\xc5\x23\x7d\x87\xf6\x7f\xcb\xcb\x91\xba\xaf\xab\x7a\x2d\xed\xcd\x5d\x7c\xa4\x39\x4a\xe1\xa1\xe8\x11\xcc\x77\xaf\x02\x19\xb1\x37\xb0\xbf\xc3\x19\xd3\xfd\xbc\x08\xf4\xe9\x94\x81\x61\x9e\xde\x61\x7e\xf5\xcc\xc0\x89\x3e\xd8\xa2\x8f\xd9\x73\x6e\xee\x93\xa8\xf3\xf9\x14\xd6\xff\x4c\xec\xb9\x9e\x8e\x34\x6a\x5f\xd7\x9b\x52\x67\x8e\x9f\x8a\xda\x5a\x11\x12\x92\x9a\x3a\xaf\xce\x99\x5b\xf6\xbd\xb2\x3f\xe7\x28\x9e\x43\x21\x0f\x0b\x0f\x17\xc9\x64\x8f\xc7\x51\x3f\x82\x98\x90\x49\x9a\x64\x0f\x92\x79\xcb\x32\xf6\x91\xf0\x87\x20\xa2\x6f\x91\x8c\x7e\x68\x5a\x92\xe9\xbd\x30\x3b\x7a\x38\x80\x2e\x9f\xbd\xac\x8d\x46\x33\xa1\x41\x89\xc6\x2c\xe4\x6a\x13\xc0\xaf\x2b\x26\x5c\x71\x2b\x68\xb2\x96\x8e\xd1\x70\x7f\x1f\xb4\x2e\xf0\x00\xb8\x40\x24\x8e\xc5\xd9\x1f\xee\x1c\x06\x96\xaa\x4c\xf5\xfd\x5c\x64\x14\x02\xdb\x9e\x68\x55\x6c\xaa\x2c\x9a\xc8\xaf\x74\xb3\xf6\x53\x03\x48\x60\xc6\x87\xe1\xc9\x27\x28\xad\xe1\x75\x74\x68\x71\xba\xbf\x3c\x15\xe6\x84\x9c\x0d\x03\x25\x79\x17\x11\x08\x0d\x46\x73\x23\xb4\x00\x62\x1e\xaf\xf7\x30\x71\x1d\x55\x0f\x72\x01\x5d\xfe\x19\x69\xd8\xed\x64\x6b\xfb\x50\x8f\xad\x5b\xfc\x77\xd3\xa1\x17\x9f\x56\x9c\x4f\x7a\x81\xcf\x2b\x74\x76\x09\xd7\x1a\xcd\xb8\xe9\x74\xcb\xd0\xdd\x39\xec\xef\x73\x3e\x6d\x1a\x41\xdc\x84\x49\x17\xad\x62\xc9\x7b\x2a\xbc\x91\xfd\x38\x68\x81\xd8\xcb\x98\x55\x9e\xac\xe8\x39\x43\x68\xe4\xde\x37\xc7\x8b\x4c\x2f\x39\xba\x51\x26\x32\xb7\x8b\x6e\xe9\x37\x71\x21\x13\x8a\x8f\x92\xa3\xf3\x5b\xc1\x98\x1e\x72\xa4\x8b\x97\x33\x2d\xd5\x33\x58\x0b\xcd\x91\x12\xfa\xbf\x9f\x60\x9c\x7b\xc1\xd1\x07\xc5\xa4\xba\xac\x80\x1e\x58\x1b\xf7\xdb\xb7\xcf\x11\x0a\xea\x42\x7c\x11\xa5\x1c\xc6\x13\x91\x18\x96\x82\x6e\xd9\x2a\xee\xe6\xcb\x4b\x8d\x26\x11\xd5\x1d\xab\x00\x51\x96\xea\x95\x94\x19\x4c\x1d\xa4\x21\x29\x6c\x2b\xb4\x85\x1f\x41\xad\x79\x77\xa2\x6b\xca\x99\xfa\x96\xbb\x08\x35\x9a\xb8\x1f\x87\x00\xd1\xd4\x27\xf8\x9e\x9f\x28\xde\xeb\x16\x7d\x41\x53\xa7\x2a\x40\xb1\x81\x18\xa5\x37\x51\xbf\xd8\x17\x84\x56\x28\xc4\x0a\xa8\x74\xa0\x01\xa2\x55\xca\xc7\x83\x61\x2c\x42\x4f\x0d\xaa\xdb\xd3\xde\x77\x74\x4b\xd0\x0d\x79\xd3\x2c\xb2\xe9\x2d\x05\xa5\xd9\x7a\x8a\xfd\x2c\x88\x05\x44\x83\xe8\xe9\x35\x1e\x58\xca\x7a\xc2\x53\xe6\xa0\x08\x65\x15\xe2\x42\x51\x83\x41\xfe\x0e\x39\x93\x9a\x58\x04\x7d\xc5\x53\x42\x0a\xc0\xa6\xbe\x63\x98\x72\x92\xc4\xbd\x36\x7d\xf7\x5b\xb6\x85\xea\x45\xd3\x82\xa3\xb4\xa6\x10\xd9\x21\xef\x36\xdd\x8e\x69\x90\x27\x49\xcc\xe3\x5a\xd9\x0a\xaa\x69\x5e\x2f\x58\x10\xa8\x65\xea\xb3\x93\xbe\xa8\x23\x90\x29\xdc\x53\xb2\xe8\x69\xd1\x29\xe5\xc1\x72\xad\x99\xa2\x05\x5a\xef\x14\xd3\xf7\x8c\x18\x3e\xf8\x2f\x3c\x0d\x15\x5e\xb3\x58\x37\x62\xfc\xe1\x9f\x5d\xda\x6b\x53\xad\x7e\x37\xbe\x85\x2c\x12\xc3\x0c\xb2\x93\x35\x2b\x3d\x6d\x20\x68\x14\xb9\x33\x29\x85\x06\x4a\x5e\xca\xc6\x43\xa4\x0e\x49\x0c\x0a\x7d\x28\x83\x42\xc8\x5c\xf8\xfa\x23\x5e\x03\xfb\x6f\xc0\x13\x74\x43\x70\x64\x47\xf4\x43\xa2\x4b\x45\x4f\x57\xde\x32\x88\xd0\x57\xf1\xae\x38\x31\x48\xac\x03\x43\x2e\x27\x7f\xf7\xf5\xe3\xf7\x3f\xf8\xfa\xd8\x2e\xc2\x50\xfd\x79\x05\x1f\xba\x29\x8a\x75\x69\x2a\xed\x9e\xbe\xf5\x73\x52\xf7\x88\xa8\xb5\x9c\x07\x21\x5a\x14\x20\xa6\xe9\x48\x0c\xe9\x78\x6b\x3d\xfd\x31\x04\x7b\x45\x76\xcd\x5b\xdd\x4e\xad\xd8\x2a\xef\xd8\x87\xc3\xd1\xba\xbe\xa5\xe5\xb8\x77\x96\x04\xdc\x7f\x39\xc2\x91\x9a\x0e\xee\xad\x2c\xf4\xa2\x3e\x5e\xd8\xdd\xe1\xa3\xd8\x26\x11\x15\xc2\x4f\xb8\xb9\x15\x4d\x8a\x74\x52\x0d\xbc\x71\x80\x28\x04\x71\x67\x61\x82\xe0\x86\x63\x4f\xb7\xec\xa3\x4b\x81\x46\x85\x40\x87\xe7\x57\x5c\x91\xd5\xc6\x01\x67\xa9\x69\xde\xe5\x4a\xc8\xe3\xfc\x1d\xd8\x7e\xa0\x84\xc8\x89\x7e\x60\xee\x31\x36\xcb\x59\xc7\x31\xdf\x79\xf8\xb8\xf3\x50\x17\xcc\xbe\xad\x43\x16\xd0\x6e\xa5\x2a\x0c\x2a\xb0\x3a\x70\x59\xcb\xfa\xad\xb2\x42\x01\xc9\x98\xbb\x08\x21\x9b\x21\x77\x6f\x1d\x6d\x65\x26\x1c\x9b\xff\x19\x7d\xef\x40\x71\xd5\x32\x20\xaa\x62\x63\x6c\xdb\xea\x43\xf3\x9c\x0b\xee\xc5\xc6\x21\x83\x76\x28\x05\xe6\xa7\x8e\x3b\x06\x9c\x64\x89\xe6\x32\x92\xc3\xbc\x71\xb5\xc7\x55\xe5\x95\x97\x95\x86\x09\x28\xad\x45\x25\x0a\x7a\xc5\xaf\x39\x29\xfc\x49\x8d\xa7\xe7\xc9\x0d\xd2\x0b\x69\x23\x72\x4c\x38\xf5\x11\x91\xc7\xb5\x52\xcd\x54\x6d\x85\x5c\x31\x2a\x17\x55\xa7\x9b\xe2\x37\xff\xb4\xde\x4f\xe9\x9d\x61\x5a\x4d\x09\x28\xe4\xcb\x58\x9b\x32\xcf\x00\x58\xee\x33\x74\x26\xc6\xd0\x30\x4e\x06\xb4\xef\x57\x4c\xd2\x7b\x87\x9d\xd1\x53\xec\x07\xe5\x3e\x46\xee\xf0\xa7\x79\xcc\x7a\x1e\xc7\x4b\x82\x93\xda\x84\xa5\x7a\x8d\xf1\xa3\x8c\x42\xbe\x98\xdd\x43\x9f\xfe\xa4\xc1\x4e\x41\x77\xc4\x99\x76\xb1\xb7\x6d\x68\x41\xa9\x6c\xde\x35\x0f\x10\x35\x90\xa5\x6a\xf5\x53\xcb\x08\xfc\x22\x9b\xa4\x53\x22\xd7\xaa\xe7\xca\x49\xd6\x35\xc1\x9c\xa8\x16\xad\xb3\x5c\x8a\x9c\x92\x17\xfc\x38\x29\xcc\x06\x7a\xee\xc2\xfc\x99\xc6\xb5\xe7\x07\xfb\x65\xb8\x25\x5c\xda\x05\x11\x56\x21\x8d\x5c\xe6\x89\x5c\x43\xfe\x21\x47\x8b\x18\x8f\xaa\x12\x39\xf7\xfe\x98\x6c\x10\xcc\x57\x87\xe9\xa4\xc5\x0f\xc3\xa8\x89\x32\xae\x1d\x27\xe5\xea\x22\x8e\xed\x91\xfb\x78\x6b\x9e\xdc\xf7\x28\xb9\x0b\x77\x4f\x4a\x9d\x4c\x76\x30\xea\x4d\xce\xa0\x39\xa5\x72\x68\xed\x6b\x46\x7c\xa5\x70\xa7\x1d\xc6\x2d\x37\x94\x19\x24\xf8\x06\x38\xa9\x6a\x88\x83\x48\xa5\x3f\xf2\xe0\xc6\x50\xf9\x06\xd0\xb5\x02\xb7\x6f\x5f\x3b\x74\xb5\xed\x5d\x39\x91\xbe\xf8\x73\xf9\x7a\xc1\x64\x1b\xc8\xa8\x5d\xe5\x25\x53\xd8\x70\x5f\xcd\x45\x63\x77\xf7\xdd\x70\xd2\x19\xea\xde\x47\xd7\x64\x97\x8c\xb7\xe9\xd0\x65\x1b\xa9\x56\x01\x41\x6d\xbc\x54\xc9\x55\x82\x93\xe9\x6f\x67\x0e\x98\x49\x0e\x52\xe2\xa6\xe7\x18\xef\x4b\x22\xb9\x6b\x49\xf2\xa2\x8b\x0e\x8c\x7a\xb9\x70\xc0\x35\x95\x82\xcd\x68\x8b\x88\x31\xfa\x41\xf2\x36\x2d\xd9\xdd\xd3\x6c\xf8\x4e\x7a\x76\x95\xd6\x9f\x2a\xad\x88\x60\x75\x71\x68\x94\x1a\xe4\xda\xcb\xf4\xcd\x47\x08\x29\x1e\x9d\x27\x1a\x8b\x8a\x4a\x0c\x17\xae\xf6\x25\x36\x1b\xa5\xec\xe2\x11\xd3\x66\x20\x14\x49\xc2\xa9\xb4\x02\x44\xe3\xe5\x96\x5a\x57\xd7\xdf\xa0\xc6\x3c\xb3\x0b\xa2\xf4\x8f\xa5\xdc\xcc\xad\xa7\x33\x71\x1c\x4f\xd6\xa5\x1e\x7a\xae\xb4\xd4\x2f\xf6\x68\x7d\x3a\x7f\x58\xb3\x26\x70\xdd\xd0\xff\x9e\x3d\x70\x26\x89\x54\xec\x89\x8c\x8d\x84\x1d\x63\x5e\x9b\xbb\xfe\x96\x5f\x6e\xb1\x29\x52\x0a\x64\xbe\xe9\xba\x1a\x4e\x38\xa9\xfc\x62\x31\x92\x2c\xb0\x42\x64\xd5\x97\x44\x60\x9e\x20\x12\xb1\xa6\x28\x9c\xa4\x97\x1b\x74\x14\x27\x01\x0e\x61\x46\x4c\xb3\x4f\x1b\x03\x42\x41\xe6\xaf\x87\xc9\x58\xbb\xca\x87\x8f\x4b\xda\xe8\xc2\x99\x12\x8a\x44\x59\xc3\x6a\x43\x72\x66\x00\x2d\x75\x2d\x76\x82\x9e\x81\xcf\x4e\x82\x62\xd8\x09\x92\x7a\xd3\x2b\xc7\xdd\x8b\x43\xd7\x83\x5a\xfc\x02\xfd\xd5\x69\xb1\x1b\x69\xb2\x73\x60\xd0\x79\x55\xa7\x3d\xf6\xe7\xc1\xad\xe8\x24\x15\x6f\xe5\x0f\x94\x36\x82\xb2\x1b\x02\x19\x9a\xf4\x85\xd8\x3f\x4c\x54\xa4\x45\x21\xc0\x00\xa9\xdf\x77\x5f\xa6\xa1\x49\x7e\x2e\x5c\xb8\x85\x08\x7c\x38\x15\xe7\xdf\xf6\x30\x70\x3b\x47\xc5\x3c\x8f\x5f\x9b\xb6\xbe\xc4\xc9\xef\x07\xb6\x3f\x17\x59\x12\xf1\xe2\xcf\x39\x9f\xa7\x7c\xbe\xb7\x8d\xd5\xc4\x6b\x52\x2b\x91\xd7\xcb\xcf\xe4\x9f\x68\xd8\x6b\xfe\xa0\x22\x9a\x07\x78\xb9\xda\x6e\x15\x9a\xa6\x63\x65\xd1\xe5\xda\x71\x7a\x1d\x8c\x0e\x30\x95\x02\x02\x31\xa8\xd8\x16\x99\x07\x1f\x3c\x17\xb7\x7e\xa2\xcc\x3e\x4a\x2e\x07\x65\xcc\xa2\x53\x1a\x33\xb7\x45\xc1\xc1\xcc\xcb\xdb\x0b\xa7\x84\xf9\x56\xa9\x13\x4a\xf9\x91\x1a\x7e\xa3\x62\x8f\x79\x0d\x72\xa5\xa2\xc2\xb9\x1a\xda\xf5\x55\xf7\xe9\x14\xdf\x74\x63\xbc\xaf\xb1\xb0\x52\x45\x50\xfa\x66\xc9\x9b\xc4\xb2\xee\x20\x48\xc2\x37\xac\xfc\x97\xf6\xe0\x5f\x06\x0d\x0a\xa1\x86\xa5\x03\x23\x8d\xed\x9f\x5e\x9d\x30\x9f\x06\x65\x79\x10\x94\x26\x63\x2c\x33\x94\x7e\x1e\xbc\x67\xd6\x68\x35\x22\x2e\x9f\x61\xed\x84\x49\x67\x06\x3d\x26\x0b\x2e\xea\x52\x6a\x8c\xa6\xb3\xdd\x51\x17\xf9\xdb\xe6\xb5\x06\x6c\x2b\x5c\xff\xc0\x71\xf5\x2e\x19\xc7\xb4\x2c\x76\x8a\x68\x90\x90\x97\x26\xe2\xdb\xca\xe2\xa2\x84\xa2\xc4\x86\xad\x49\x44\xfb\xd2\x14\x8b\x03\x51\x2d\xd6\x6b\xf7\x21\x9e\xe4\x6a\xd7\x64\xa4\x55\x26\x40\x14\x4e\x74\x45\x59\x1e\x13\x3f\x8c\x62\x8f\x60\x40\x7e\x9a\x0b\xc1\x52\x3d\x2c\x9e\x7d\x24\x59\x8a\x4a\xec\x7b\xb1\xbb\xe4\x1e\x18\xea\xcc\xcb\x2d\xa7\xfe\xb6\x7d\x71\xde\x72\x46\xba\xe9\xab\xf1\x29\xa9\x7c\x27\xeb\x3c\xd3\x18\x3d\x2a\x3f\xdb\x08\xae\x96\x21\x31\x14\xa4\x94\x90\x25\x6e\x64\xe3\x16\xf8\x83\xba\x73\x97\xcd\x50\x6c\xdd\x66\x10\x27\xa8\x66\xd1\xdb\xa5\xae\x0d\xc3\x58\x74\x57\x91\xf7\xe3\x2f\xee\xe4\x5f\x66\x1d\x2a\x4a\x04\x16\x03\x15\xed\x6e\x5d\xec\x2e\x38\x96\x6c\x2b\xb1\x88\xbb\xf9\xb3\x2d\x95\x34\x86\x9a\xd6\x0c\xf5\xaa\x59\x97\x6d\xb9\x6d\xd3\x58\x5d\x80\x95\xdb\x7b\xa6\x3c\x38\xca\xd3\xbe\x65\x73\x0b\x87\xac\x32\x26\x07\x13\xed\x72\xc5\x47\x17\xe4\x1e\x1c\x37\x04\x1c\xc8\xd5\x43\x20\x72\x90\x80\xd0\x9b\x81\xa1\x4d\x93\x83\xbb\x88\x58\x51\x63\x46\xe8\x09\x2d\x57\x39\xad\xac\x2c\x8b\x85\xd7\x61\xc0\x3e\x8a\x1c\x0b\x50\x63\x26\x83\x96\xb8\xbb\x4d\x6c\x1f\xf9\x27\x02\x66\xf7\x87\xc6\x44\xba\xee\x42\xa4\xd1\x13\x28\x85\xa8\x84\xb1\xfc\xa0\xec\x7b\xcf\x9d\xbf\x35\xf1\xff\xf2\x41\xa0\x10\x38\x7f\x04\x4a\xa0\x26\xde\xde\xde\xfc\x5c\x92\x26\xd4\x54\x55\x37\x63\xeb\xdb\x20\xc3\x29\xa3\xe3\xb9\x51\x6f\x4e\xa0\x2b\x6e\x05\x27\x4d\xed\x2f\xe1\x16\xc0\x15\x18\x56\xa9\x88\x46\x87\x0a\xe2\xc8\x57\x85\x61\xd3\x14\x06\x79\x07\xb7\xea\x72\xf7\xb3\x7e\xa0\x7c\x19\x80\x79\x4e\x4c\x06\xd6\x19\x46\xca\xc5\x84\x74\x8a\x6d\x0e\x88\xce\xce\xbd\xd7\xf6\xeb\x44\xb7\x7d\x63\xed\xf0\x7d\x69\xc6\x2c\xaa\x5f\xac\x69\x29\x3a\x9c\x06\x10\x0d\xa2\xb3\xf3\x4c\xbe\xea\x2d\xea\x2f\xa8\x35\xc3\x71\x28\xf7\x8c\x1c\xc7\x84\x88\x79\x6a\x2e\x93\x6b\xef\x2f\xa9\x77\xae\x80\x0d\x62\x78\xbe\x21\x86\x1f\xd5\x6e\xcc\x75\xf6\x1d\xf3\x2a\x4f\x75\x37\x78\xed\x5d\x0b\xb5\x3d\xa8\xf2\xe6\x6d\x49\xcd\xff\xdc\xe9\x02\x99\x70\x0d\xa8\x73\x0c\xff\xdc\x1c\x93\x87\xb5\x7c\xde\xc0\x1f\x16\xc7\x16\x10\x30\xcd\x6d\x51\xc8\x67\x54\xea\x16\x8a\xf9\x73\xda\x60\xf0\x37\x3a\xfc\x97\x23\x06\x85\x20\xc0\xa0\x83\x27\xa1\x0c\xae\xdd\xb1\xa2\x9f\x92\x4a\xb0\x8e\x18\x31\x5e\xf4\xd7\xa6\xa7\xd1\xda\xf9\x72\x2a\xa7\x8a\x33\x9a\xd6\x57\x1f\x5e\xdb\x71\x40\x09\xb4\x41\x56\xe3\x60\x6a\x3f\xab\x37\x61\xd5\x0d\x5c\x8c\x4e\xf2\xa9\x2d\x8c\xc4\x07\x77\x2e\x82\x31\xc7\xa3\x17\xf8\x25\x21\xbe\xc0\x49\x80\x8d\x4a\x20\x59\xc2\x65\xb2\xd3\xbb\xc0\xcf\xce\x76\xcd\xcd\xcf\x2e\xc4\xac\xcc\xb1\xda\xf6\x29\xa7\x45\x4d\x9b\x19\xf1\x2f\x7b\xdc\x85\xf9\x0d\x31\x57\x85\xa6\xbb\xb7\x08\xcd\x4d\xf9\x4a\x56\xde\x1e\x96\x5d\xf1\x0c\x18\xa5\x14\xce\x53\xfb\xaa\x6e\xdd\x08\xda\xf3\x7f\x4f\xc2\xbf\xfc\x46\x28\x04\x0b\x25\x1a\xec\x70\xff\xca\xdf\xb3\xb3\x93\x63\xcd\x0b\x77\xef\x73\x1a\x8e\x85\xaf\xa2\x7a\x49\x58\x25\x83\x56\x34\xa2\x59\xb8\xfa\x86\x2b\x7f\x3e\xd8\x2b\xef\x90\x5c\xa3\xa6\x84\x49\x25\xa7\x53\x95\x2c\x4e\xff\xc6\xc6\x3b\x82\xce\xc2\x12\x2e\xf7\x78\x04\x62\x1f\x12\xe5\xe1\x61\x99\x0a\xcc\x0c\x1e\xee\x4d\x82\xdf\xdc\xd4\x8f\x1a\x4c\x95\x4c\x6d\x53\xd8\x23\x33\xde\xf9\x19\x0b\xd2\x1b\x2c\x58\x45\x08\x7a\x59\xa7\x18\xe0\x94\x46\xaa\xf6\x4c\x61\x2b\x58\x92\x73\x74\xfb\x91\x06\xc8\x6c\xfa\x70\x9a\xd2\xdc\x7c\x96\xfa\x86\x2a\xd4\xa5\x52\xe3\xa8\xd7\x03\x36\x78\x0a\xe8\x66\x8d\xcb\x74\x0a\xfa\xc0\x4e\xa6\xfe\xe7\x07\x7f\x94\x98\x67\xa4\xd2\xe4\x06\xd4\x64\x1d\xf3\x45\xa5\x41\x88\x70\x06\xb8\x09\x02\x5f\xf6\xde\xf3\xf2\x1d\xdb\xdc\xf4\xd7\xdc\xce\xae\x62\xfb\x8d\x27\x3b\x62\x5d\xbf\xdf\xfd\xed\xd9\x5a\xd3\xde\xb7\x9d\x7b\xf3\x37\x1b\xf7\x2f\x9f\x10\x0a\x79\x02\xe3\x8f\x05\xac\x17\xc7\xaf\x97\xf7\x3d\xee\x73\x2f\x4b\xda\xa9\x28\x22\xcc\xdf\x65\xd6\xbc\x8b\x89\x6a\xc7\xfe\x88\x5a\xfb\x39\xe0\xcb\x48\x31\x3d\x08\x92\x89\x71\x27\xf8\xa3\xe5\x4e\x1c\xd4\x2f\x09\x19\xe2\xde\x0b\xfa\xcd\x90\xcf\x8c\xc2\xdd\xa4\x6e\x15\x3d\x99\xda\x96\xbf\x05\x01\x49\xc0\xea\x7b\x4a\x9a\x9e\xa5\x3c\x79\xde\x2d\xa1\x2b\x8f\x5a\x71\xcd\x2d\x15\x38\x3e\x43\xc3\xd0\x3a\x14\x98\x98\x93\x17\xe1\x3d\xd5\x07\x88\x7e\xd7\x53\x7f\xb1\x30\xc5\xa1\xed\x23\x9f\x53\xdc\xb1\xf8\xb2\xb2\x42\x01\xb2\x4d\x53\x23\x34\x31\xfb\x8b\x6d\xc8\x58\xde\xdf\x0a\x44\x66\x38\x97\xb2\x99\x6a\xd3\x6e\x9b\x7e\x61\x58\xca\x98\x8d\x7a\x7d\xf5\xf9\x99\x97\x94\xaa\x06\x96\x4f\x62\x6b\xd7\x59\xe3\x10\xd1\xdf\x55\xf8\x97\xbb\x0b\x85\x20\xa0\xc0\x84\x00\xab\xd0\xed\x36\xa8\x13\xd3\x89\x70\x4b\x53\xf3\xb1\xbb\x66\x5b\x70\x30\xea\xd3\x04\x17\x99\x55\xda\x7a\x80\xeb\x57\xb1\xe1\x70\xe8\x2b\x40\x09\xdc\x65\x5f\x96\xd0\xc8\xc3\x5e\xcf\x4f\xf8\x3f\xde\x48\x11\x52\xcb\x95\xc6\x4e\x05\x2c\xeb\xb3\xde\xa4\x4e\x5d\xd9\x57\x8e\xd8\x82\xab\xc0\x6d\xb2\xaf\xaa\xa5\x77\x6d\xc3\x93\x9d\xae\x73\xec\x6e\x52\x19\xc6\x59\x21\x33\x40\xbc\xc3\x59\x10\xf4\xfc\x79\xcd\x1f\xb0\x51\xb9\x16\x93\xf9\x6d\xcb\xba\x82\x2c\x1e\x5a\xe2\x93\xf8\x5f\xcb\x21\x1e\x24\x45\xed\x14\x8e\x18\xbc\xfb\x6d\x5e\xf0\xb2\x7d\xe4\x84\x20\x4a\xd6\x62\x85\x9f\xc3\xa2\x14\x52\x11\xf1\xa2\x6e\xb1\xf2\x13\x9d\xb2\x4e\x38\x2d\x3c\x42\xbe\x8f\x6f\xe5\x60\x3f\x92\x18\x8d\xdd\x5f\xeb\xf0\x2f\xf7\x1c\x2a\x8a\x08\xa2\x12\xf1\x6d\xa5\x48\x0c\xb7\xf6\x0a\x73\xdd\x3d\x70\xf5\xa5\x67\xc3\x53\xdb\x2d\xef\xd2\x3e\xc6\x88\x0d\x36\xfc\x21\x14\xc9\xc6\xe0\x05\xf3\xee\xf8\x2b\xa8\x31\x72\x96\xc9\x59\x77\x77\x17\x1b\x21\xfa\x8a\xfc\xbc\x33\x35\x29\xf0\xeb\xec\x4d\x1e\xb8\x93\xc3\x31\x08\x40\x2b\xa4\x97\x88\x5d\x12\xf1\x4f\x33\x7a\x4e\xf3\xbf\x0e\xb7\x7e\xc6\x6f\x6c\x14\x53\xea\xcf\x0f\xc2\x17\xdd\x3d\xc8\x26\x1c\x7a\x6d\x0a\x52\x84\x4f\x7c\x5b\x84\xd3\x4f\x46\xbe\xb0\xa7\xb6\x3e\xa3\x8a\xe7\x31\x6b\xc0\xe8\x62\xb4\x1f\x2e\xba\xe2\xa2\xe3\x7b\xba\x36\x82\x48\xfe\x97\x03\xec\x5f\xb1\x04\x54\x8c\x32\x0f\x04\x4b\x9d\x47\x7c\xef\xce\x77\x54\x24\xf5\x2b\x8b\xe9\x95\x0a\x8e\xf6\xb1\x69\x86\x45\xdd\x37\xc5\x7d\x7f\xe3\x5f\x77\xf1\xbc\xef\x00\xe4\x7d\x62\xa8\x30\xd6\xd7\x6a\xc6\x75\x9f\x31\x4c\xe5\x37\x21\x13\x23\x5c\x7f\xf1\xe2\x56\x7d\xdc\x4e\xb5\x4b\x4b\x72\xe7\x26\x33\x1b\xac\x91\xb4\x5c\xd1\x88\x9d\xdb\x85\xd3\x63\x7f\x6d\xf4\x0c\xeb\xe9\xef\x40\x53\xf6\x16\xda\x5e\xbe\x06\xaf\x12\x12\x6e\x16\xe3\x80\x55\x90\x01\x1e\x09\xa2\xaf\xea\x3b\xcb\xaa\xed\x8a\x3a\x36\x2b\xe1\x59\x60\xe0\xc3\xc0\xea\x05\xc1\xce\x64\x3c\x43\x82\xad\xa6\x3f\xde\x02\x31\xba\x03\xee\x3c\x29\x99\x01\x93\x36\xe6\xb9\x37\x1e\xdb\xf6\x25\x95\x5e\xfd\xf2\x35\x68\xf3\x75\x68\xb5\x53\x14\x9a\x73\x8c\xb9\x75\x7f\x17\xe1\x5f\x61\x0a\x14\x82\xf5\xdf\x17\x05\xe8\xce\x12\x3c\xdf\xf9\x8f\x43\x94\x03\xcc\xf9\x29\x4e\x53\x38\x13\xd1\x90\x2b\xe2\xa7\x11\xa8\x42\x29\x77\x0f\x8c\x07\x85\x13\x20\xe8\xf4\x59\x5e\x7a\xd7\xb3\x84\x55\x8c\x6e\x8b\xa8\x0b\x53\xea\x4b\x22\x15\x73\x53\x8c\x90\x0d\x19\x4f\xb9\xf0\xd6\xda\xa8\x34\x5a\xe0\x24\x98\x9d\xb3\x95\x3c\x04\xd9\x07\xdd\xee\xc0\xdd\x71\x7d\x42\xdb\xa7\x28\xa1\x1e\x2c\xc9\x89\x52\x73\xd6\xac\xb1\x5e\xf2\x48\x07\x3c\xeb\x6b\x36\xbb\x5e\xca\xee\x7b\x3a\x6c\x5c\xfd\xc3\x24\x23\x62\xf1\x21\xde\x3b\xf5\x3f\x13\xbd\x09\x94\xd4\x89\x5b\x01\x5c\x5e\xcb\xc0\xf7\xfd\x90\xb8\x88\x2b\x06\x52\x25\x0a\x9a\xe8\xfa\x0c\x1b\x33\xde\xa6\xbb\x75\x45\x54\x8c\x22\x98\x75\xd7\x21\x5d\xb9\xe5\xbc\x2d\xfa\xfb\x9f\xff\x2b\x00\x83\x42\xb4\x60\x60\x40\xeb\x90\x96\xf3\x6e\xca\x2a\xa3\xa5\x06\x3d\x04\x71\x4e\x38\x62\xd8\x79\x30\x5e\x78\x18\x39\x3e\x30\x16\xdb\xe1\xd0\xd9\x38\x81\xb0\x15\x50\xe2\xd6\x14\xce\x7e\x1f\xf5\x52\xe7\xc5\xe5\x9f\xf4\x95\x00\xc6\xc1\xc1\x0a\x89\x9d\x83\xc1\xba\x77\x38\x30\x4d\x3e\xcb\xed\x45\xe0\x5b\x49\x48\x76\x4a\x7a\xa5\x9e\xbc\x31\xcd\xca\x24\x6d\xc1\xf6\xab\x05\x74\xf8\x66\x33\xa6\x4a\xec\xdc\xe0\xb1\x9c\x0d\xa3\x5a\xe7\x7b\x40\xd4\x45\x44\x76\x12\x07\xd5\x28\x28\xd7\x85\x5c\x0e\x71\xb8\x39\xd9\x20\x2b\x65\x61\x41\xe4\x53\xdb\x74\x1e\x1c\x4b\x40\xf2\x1a\x48\x47\x77\x41\xec\xeb\x67\x7d\xb2\xe9\x47\x98\x75\xe2\xd5\x9f\x1f\xfb\x81\xe5\x54\x38\x6e\x64\x15\x35\xd9\x22\x44\x76\x5c\xdc\xc7\x04\xe5\xaf\xf5\xff\x57\x74\x05\x15\x83\x43\x40\x05\x4e\xc2\xa5\x25\x33\xd2\x1a\x3a\x1e\xf2\xf7\x44\x65\x57\x2d\x2f\x1a\x0c\xc2\x4b\xb8\x87\x81\x98\x21\xa6\x5e\x91\xe4\xac\x99\x62\xf6\x25\x90\x3f\xe3\x6b\x78\x59\xb8\xd8\xf3\x89\x54\xb5\x22\x93\x97\x3d\xf8\x8b\x81\x02\x30\xcf\xde\xa4\x96\xe7\x2f\x6c\xa4\x3f\x3b\x89\xf6\x01\x11\x81\x44\xc5\x18\x7f\x68\xc9\x4f\x90\x64\x06\x4c\x79\x04\x4c\x44\x8f\x66\x2b\x7e\x21\x35\xf2\x7a\x88\xb1\x28\x8e\x12\xf8\x7d\xdd\x01\x19\xb5\xce\xd6\x14\x5e\xb2\x26\xce\xc4\xda\xf7\xd2\x0a\x26\x85\x2d\x16\xc9\xc0\x63\x65\x6d\x4a\xb6\x5a\xd3\x8b\x45\x5c\x62\x2f\x87\x3b\xfd\xdd\xdf\x7f\x05\x83\x50\x48\x34\x8c\x08\x36\xb0\xbf\x22\xdd\xc7\x4d\xf6\xd9\x62\x45\x63\x4c\x3e\x6f\x3c\x99\xea\xfb\x07\x5a\x7d\xd9\xb1\xa7\x98\x08\x5e\x4d\x1e\xaa\x16\x7d\xb0\x05\x6f\xdc\xf7\xcd\xdb\x7e\xe6\x1c\x86\x90\xfc\x73\x22\xec\x3b\xaa\x9a\x35\xb5\x97\x09\x4b\x63\xa3\xb0\x41\x96\xa5\x71\xa1\x81\xb9\x6b\x1d\x80\x68\xb4\x31\xf1\xd7\x97\xeb\xba\x6b\xa9\x84\x1b\xbc\x49\xe8\x12\xb2\xf4\x17\x43\x71\x0f\xfb\x43\x4a\x1e\x92\xbc\x4f\x1d\xb0\x0f\x41\x1e\x25\x28\x11\xfc\x7d\x64\x5e\xcd\xbb\x8f\x2e\x7b\x1c\x0d\x96\x8c\x34\xeb\x70\x0c\x8a\xca\xcc\x37\x50\x5a\xa3\x58\xfc\x28\xe1\x2a\x90\x5d\x4d\x37\x64\x40\x47\x3b\x4d\x5c\xab\x51\xa0\xe9\x8d\x02\xa7\x71\x89\xa4\xb9\xe2\x4f\x07\xf8\xa0\x55\x98\x1b\x3c\x47\xac\x3f\x34\x58\x7f\x57\xe1\x9f\x71\x2e\x84\xf8\xf9\x7f\xd0\xa1\x68\xd9\x51\x92\x84\xcf\xe9\x84\x98\xde\x44\x7f\x19\x30\xba\xc6\x7b\x13\xa7\x4f\x4a\x48\xe2\xab\xe2\x71\x22\x41\xfc\xb3\xde\x0d\x4c\x77\xa9\x1a\x06\x23\x0e\x1d\x4f\x05\xb7\x08\xef\x63\x49\x8d\xc8\xaa\x09\x4f\xac\x6e\xdf\x50\x58\xe1\xd1\xc1\xe2\xbd\x22\xc1\x12\x06\x7d\x90\x2f\x5e\x5e\xfd\x3d\x4b\x9d\x76\x42\x91\x6c\xbe\x06\x2f\xfa\x46\xa2\x17\x86\xdb\x89\x26\x05\x7e\x16\xce\x4a\xf6\x63\x74\x75\xbd\x01\x33\xe4\x8e\xc9\xc5\xc3\x79\x23\x21\xd5\x77\x32\x1b\x29\xfd\xe9\x47\x2d\x3e\xd8\x75\xaa\x1d\xa1\x34\x69\xeb\x14\xd4\xe4\x14\xae\x6e\xa0\x13\xb4\x67\x7d\x5b\xae\xbd\xff\x36\x21\x0f\x51\xfe\xfe\x8d\xfc\x67\xbe\x80\xf6\xde\xee\xf6\x0f\x51\x22\x27\xab\x87\xb2\x78\x6f\x66\xcf\xbf\xff\x0f\xef\xd3\x80\x09\x55\xe8\x8b\x8a\xef\xa8\xfa\xee\x83\x0e\x33\x21\xcd\x3c\xba\x07\x29\x62\x71\x2e\xee\x3b\xa9\xce\x3e\x39\x96\xa3\x61\x1f\xa1\x90\x95\xfb\xa3\x9b\x64\x52\xb0\x37\x79\x30\x93\xa0\x08\xea\x9f\x71\xa5\xa6\x03\xba\x97\xfc\x94\x25\x4d\xee\xaf\x25\x0d\xab\x60\xde\x2a\xb3\x62\xa1\x9c\x7c\x17\x6a\x07\x44\x0f\x51\xf9\xdf\xff\xd2\x0b\x8b\xe2\xe3\x5a\x1c\x47\x86\xef\x2c\x22\xe2\x4e\x5e\xf2\x84\xff\xda\xd8\x5a\xa5\xaf\xe7\xa6\xfe\xc6\x16\xe0\x53\x42\x78\xc5\x65\x7c\xf5\x76\x57\xf4\xc3\xdc\x25\xf5\xa6\x64\xda\xc1\x05\x81\x3d\x8b\x09\xf4\x79\x8a\xb5\x8f\x7c\xc5\x2a\x05\xf0\xb8\x44\xf9\x92\x8f\x2f\x53\xf2\xbb\x48\xef\xe7\x75\x0e\x3f\x26\xd3\x55\x8c\xc9\xf2\xb9\xa4\x8d\xda\x81\x53\x0c\x26\xd4\xd1\x0d\xdc\xad\x47\x49\x97\x4c\xc6\x61\xfd\xb9\x80\x88\x93\xc9\x87\x80\x06\x7f\x64\x79\xc3\x7e\xe2\x21\x8a\xe7\x9d\xf2\xc8\x82\x15\x18\x72\xb4\xdb\xd5\x20\x86\xf0\x49\x5e\xf6\x7b\xb8\x5f\x77\x22\x85\xed\x36\x46\x7d\x90\x8c\x0f\x29\x99\xd9\x31\x1a\xcb\xf4\x16\xf5\x7b\x2b\x3a\xe6\x32\x12\x40\x4d\x6b\x3b\xaf\x3b\x47\x55\xc8\xac\x86\xf6\x2e\xbe\x67\x27\x79\xb7\x6c\xd8\x89\x7f\x6e\xe0\xb4\xf0\xa2\x44\x67\xa1\xca\xd7\x4c\x78\x30\x41\xe3\xec\x2d\x10\x46\xaa\x65\x2f\xf3\xa9\xf4\x29\xe5\xf9\xb2\x5e\x89\x16\xff\xfb\x97\x97\x34\x7d\x66\xaf\x43\x7a\x7f\x2d\xed\x68\x1f\x3f\x4e\x9f\xc3\x6d\x91\x6e\xfb\x1b\x6b\xd1\x1f\x16\xb2\x1e\xb9\x72\xa9\x0b\x08\x57\xf2\xb5\x1c\x26\xff\x4d\xe1\x53\x65\x69\xfa\x34\x7f\x9b\xc7\xef\x3b\x53\x3b\xfa\x3a\xf4\xa8\x8e\xed\xab\xba\xed\xe4\x0b\x28\x25\x75\x05\x3a\xb2\x1c\x6c\x7d\x7d\x6b\xbd\x1e\xf2\x84\x39\xdc\xb8\x1e\x60\xc9\xc1\x88\x4b\x72\x83\x59\x35\xa6\x10\xcb\x2b\x38\x7f\x2b\xbd\x8d\x77\x51\xc9\xd3\x72\xf5\x30\x78\xf8\x19\xe6\x0d\x0c\xf5\x66\x0b\x08\xd4\xf6\xe6\xcb\x36\x78\xa7\xb5\xaf\x2e\x99\x39\x22\xb2\xf1\xa0\x51\x37\xf3\xeb\xa1\xcb\x6d\xe4\xcf\x02\xab\xd2\xc8\xf4\x43\xb9\x24\x90\xf5\xb0\x56\xbc\xe9\xc9\xef\xe0\x7f\x61\x98\xbc\xce\xf4\xe1\xf3\x8e\xac\xe3\x07\xae\x23\x8a\x23\x6c\x9f\x0d\xd3\x73\xef\x5f\x2b\xef\x72\x1e\xbf\x5f\x11\x7a\xc3\x2c\x4c\x00\x7b\x26\x33\x7b\x24\x11\xd6\x10\x7c\x89\xbe\xd9\xa1\x3f\x24\x21\xc4\x50\x95\xf9\xa3\xe1\xad\xa2\xb8\x1b\x90\x9e\x17\xa6\x9a\xe5\x36\x29\x57\x1b\xe1\x59\xbc\x5d\x2f\x7c\x66\x3c\xa6\xb4\x98\xb2\x37\xba\x1a\xae\x72\x6f\xb9\xac\xd9\xea\xd7\x02\x16\xd4\xbd\xa1\x63\x17\xe4\xb8\x36\xa4\xeb\xb7\x38\xf1\x95\x8f\x18\x7c\x2d\xd5\xda\xfe\xd4\x89\x16\x8a\x29\xfb\x2a\x49\xb2\x5d\x11\x78\x9c\xc8\xf8\xa2\x8a\xaf\x60\x07\xeb\x3d\x4d\xf8\x89\xe1\x12\xf7\xb2\x76\xf8\xb5\x8b\xc0\x57\x25\xdf\xdb\xd2\x0b\x77\x41\x9c\x17\x36\x7f\xc0\xba\x9c\xab\x85\xde\x82\xd2\xe7\xd9\x53\xd2\x29\x87\x30\x49\x68\x37\x52\xf5\x69\xc4\x2d\x79\xa4\x37\x99\x21\xfb\xfc\x56\xf3\x24\xe0\xeb\x84\x52\xbe\x24\x22\x5a\xd9\xbd\x68\x4c\x1f\xe1\xd8\xee\xab\x2d\xd5\x9d\x17\x9e\xf9\xdf\x19\x02\xeb\x3a\xa4\x49\xb6\x8c\x14\xd8\xac\x01\x9a\x38\xba\x27\x2c\x25\x24\x97\x5e\x86\x79\x14\x94\x30\xcb\x76\xc1\x98\xe8\xc9\x7e\x0e\x35\x63\xdd\x70\xb1\xb7\xcf\x60\x66\x91\x01\x3a\xa3\x3f\xb5\x51\x47\x69\xc7\xf2\xd1\xec\x08\xc7\xae\x26\xc3\x4c\xb0\x3f\xdf\x38\xf1\x05\xca\x91\xf0\x04\xfb\xb4\x89\x0d\xa7\xcf\xfa\x01\xd3\x37\xcc\x62\x61\x32\x2c\xc6\x59\x7f\xce\xd7\x5b\xba\x89\x49\xbd\x87\x4c\xfb\xcd\xe9\xa0\xff\x8a\x8c\xfa\x90\x55\x4e\xbc\x61\x05\xc8\x8e\x19\xd1\xa5\xd3\x99\xc5\xe9\xc1\xf6\x18\x97\x93\x31\x14\x78\x07\x1a\xfc\x48\xe2\xdf\x57\x6f\x7f\xcd\x67\x7e\x51\x90\x1d\x61\x54\x04\xf6\x57\x5b\x56\x22\x25\x6f\xa9\xb1\xb4\x63\x57\xad\x76\xb2\x66\xc7\x23\x7c\xa5\x51\xaf\xd9\xc0\x72\x95\xee\xb9\x4b\x72\x13\x39\xf8\x1d\xa8\x12\xd6\x3a\x9b\xd8\x5b\x7b\xe5\xb4\xc0\x92\xb8\xf6\x03\x11\xf1\x2a\xd8\x6f\x6a\xb2\xae\x04\x56\xc3\xba\x87\x8f\x0c\x6a\x43\x04\x74\xd7\x50\x59\x1d\x1b\x7c\xa5\x53\x16\x56\xb1\x49\x3c\x68\x01\xdb\x26\x5c\x9f\xa6\x35\x29\xff\x73\xd9\x47\xf5\x94\xdd\x67\x25\xb4\x8d\x05\xfc\x4d\x1a\x5a\xc4\x9b\x65\xd6\xa6\x15\xc3\x97\x3a\x64\xbe\xac\x39\x44\x3a\x17\x38\xd1\x85\x55\x0d\x12\x4a\xdf\x66\xcb\x1e\xc4\x1b\xbe\x7a\x9c\x3e\xed\xef\x6d\x27\x39\xa9\xae\xe9\x18\x74\x3e\x75\x92\xdf\x53\xae\xbf\x03\x30\x97\x3b\xbf\x24\xce\x4d\x53\x07\xa7\xe3\xaf\x9e\x7c\x00\x6a\x34\x37\xb9\x17\x55\xec\x83\x56\x91\xfc\x3c\xeb\xca\x24\x7d\x77\x16\x12\x32\x37\x83\xd8\xd7\xce\x54\xd0\x77\xd8\x56\x42\x99\x91\x80\xe9\x23\xa7\x19\x6e\xf9\x59\x46\xe9\x90\x87\xdc\xa7\xe2\xb2\x78\x6d\x3f\x3d\x20\x7a\x8d\xec\xe7\x31\xb7\xea\x32\x25\x2e\xbe\x80\x07\x10\x2f\x2d\x62\xc0\x4d\x28\x98\x5c\x28\x6b\xee\x90\x54\x91\x1a\x07\x39\x4d\x19\x4c\xf9\x58\xcc\xf4\xbc\x38\x9c\x9a\x75\x47\xd8\x2a\x8f\x7c\x94\x3c\x92\x8d\x7e\xde\xc7\xae\xf3\xe5\xd8\xd5\x8d\x33\x2f\x50\x42\x3a\x15\x99\x97\x51\xfc\xc5\xf7\xc5\x13\xec\xa8\x24\x75\xe6\x15\x38\x60\x4b\xd9\xf7\x3e\xb5\x8e\xc8\xf6\x66\x7e\xb3\xbb\x8a\x64\x41\x63\xde\xc5\x9b\x30\xd4\x98\xbf\x57\x98\xb8\xf6\x8a\xcf\xbe\x77\x30\x83\x3e\x0e\xda\xa4\x58\xb3\x44\x0b\x29\xbb\x8f\x77\xd0\x76\x41\x7f\x82\x69\x85\x9a\xf0\x32\xc4\x86\x2b\x5e\x8f\x49\x75\x3c\x49\x75\x2e\xb6\x0c\x98\x13\x25\x45\xa8\xcc\x93\xdf\x21\xc1\x49\xe5\x8d\x5c\xd9\xdc\x3d\x41\xe8\xd5\xbf\xd1\xa6\x04\x84\x54\xc9\xd8\x1d\x61\xe9\x39\x97\x5b\x1f\x07\x65\x46\x99\x8a\xb4\x51\x17\xaa\xfa\x58\x49\x8d\x56\x97\xd6\x5e\xf4\xd1\xe5\xc5\x85\xb3\x53\x57\xa6\x02\x16\xd6\xea\x3b\x0c\xf4\x89\x47\xc9\xaf\xaf\x3c\x78\x46\xa9\xbb\xad\x61\x48\xcd\xaa\x2f\xd8\x11\x94\xca\xdf\x7c\x59\xe8\x28\x7d\x45\x62\x68\xa4\x72\x5c\x83\x6d\xf2\x9f\x72\x7a\xc5\x81\xec\x0c\xc2\xba\xfa\xa7\xa5\x4e\xd8\xb4\x5b\x1e\x7e\xf8\x94\x9b\xd3\xaf\x14\xfc\xb0\xd5\x60\x1d\xd4\x9d\xb3\x7e\xad\x56\x3c\xfe\x7b\xdf\x9c\xc3\x08\x83\x4b\xa3\x24\xd1\xf7\xda\xe1\xbc\x92\x35\x73\xe5\xcc\xd9\xb7\x7e\xe2\xa8\x0b\xb1\xcd\x0e\x9f\x62\xd3\xa7\x4b\x80\x7d\x18\xe8\x72\x2a\x8e\x61\x60\xdf\x94\x5d\x98\x67\x66\x1d\x9c\x3c\x67\x42\xb1\x71\xac\x2c\x56\x50\x3c\x14\x44\xc3\x37\x6e\x3c\x00\xba\x7b\x24\xca\x72\x65\xcb\x3e\xbf\xcf\xf4\x0d\x50\x57\xb9\x0d\x3f\xc1\x65\x08\xe3\x20\x62\x8d\xbc\x4e\x1c\xc1\xae\xcb\xcf\xd6\xf3\x07\xb1\x9e\xf1\xed\x7a\xce\x5d\xd0\xb6\xec\x2e\x64\x5d\x32\x72\x03\x8d\xd0\x70\x91\x99\x92\x7e\xe7\xa6\xee\x30\xb9\x17\xef\x48\x5f\x64\x81\x93\x2a\x39\xed\xd8\x43\x2d\xe7\x74\x35\x4d\x7d\x7a\xad\xa3\xba\x5b\x82\x23\xfc\xff\x31\xf6\xd6\x41\x5d\x3e\xd1\xdb\x30\x2d\x0d\xd2\xdd\x21\xdd\xdd\xdd\x92\xd2\xdd\x48\x08\x08\x22\x0d\x1f\x42\x90\x10\xa4\xbb\x41\xa4\x4b\x42\xba\x5b\x90\x96\xee\x0e\x69\xc9\x77\xde\x79\x9e\x9f\xec\x77\xe6\x99\xf1\xf7\xff\x99\xbd\xf7\xdc\xf7\xd9\x7b\xaf\x3d\x7b\xae\xeb\x34\x23\x9c\x67\x49\x08\xb9\xd1\x4d\x6d\x46\xcc\x58\xca\x3e\xcd\x94\xdd\x2e\xe7\x24\x6b\xad\x46\xd2\x7a\xfa\x79\x97\x54\x03\x72\x3d\x46\x17\x1e\x5a\x90\x63\x30\x4f\x3f\xa6\x67\x7e\x7f\x55\x31\x09\x90\x38\xe3\xa6\x29\x94\x22\x27\x2f\x41\x57\xb0\x9e\x83\x9a\xbf\x08\xa0\xe0\x7b\x76\xa1\x18\xb2\x2a\xc1\xa5\xe4\x3d\x1e\xd7\x87\xc9\x03\xfc\x25\x9e\x69\xbb\xb1\x6d\xb7\xda\xb9\xd7\x97\x22\xac\xf2\xa0\xf6\x7f\xab\x73\x73\x3d\x54\x94\xfa\xd6\x73\x3e\x15\x2f\xbe\xa7\x17\x0b\xce\xf4\x0c\x89\xe6\x00\xe9\xc1\xfd\xa0\x85\x6b\x5a\x9e\xf4\x06\xaa\xb9\xf2\x73\x84\xba\x11\x21\xe9\xda\x1b\x95\xb0\xe7\x1e\xfb\x73\x20\x95\xba\x06\xa3\x78\xf5\x73\xbc\x0e\x2c\xe4\x10\xc2\x1f\xef\x98\x28\xbf\xb2\xa1\xca\x84\xa0\x2c\x7c\xef\xfd\x69\x17\x47\x49\x3c\x19\x13\xec\x83\xa2\x60\x2e\x81\x92\x3f\x6d\xd9\xb5\x92\xd6\xc9\x18\x9e\x90\x20\xd3\xb6\xaa\xcd\x86\x68\x69\xf9\x93\x23\x14\xce\x62\xcf\x22\x03\x30\x95\x8c\xd6\x43\xda\xdb\xa0\xff\x49\x71\xe4\x64\xfc\x55\xd9\x72\x30\x9c\x65\x45\x93\x26\xb4\x5a\x57\xd3\x3e\x2c\x8a\x80\x41\xf9\xe1\x29\xfc\xa9\xb8\x29\xa5\x9d\x1f\x75\xa2\x1e\xd1\xaa\xb7\x12\xed\xbe\xd3\x36\x71\xb1\xfc\x9c\xed\xfa\x7d\xf0\xb8\x2b\x3b\x75\xbf\xe7\x10\xf6\xf4\x02\x26\xa9\x0e\xe6\x8e\x27\xb3\x6f\xae\x88\x8f\x7e\x70\x44\x7c\x1e\x18\x58\x21\xa3\x26\x54\x0f\xae\xad\xd1\x29\x82\x2a\x3c\xaa\x80\x5c\xce\xc2\xfc\xef\x00\x0a\x44\x1a\x5a\x83\x02\x44\x76\xf5\xf0\x6b\x52\x5f\x03\xbc\xb0\x9d\x28\xee\x0d\xa0\x89\xb6\x58\xe7\x3a\xe9\xba\x62\x8e\x33\x4e\x65\xd6\xe7\xfa\x1f\x3c\xc4\xd9\xc1\xfe\xa2\x37\x7b\x88\x38\x78\xb6\xcc\x0d\x91\x2e\x50\x4c\x53\x91\xe4\xf4\x10\xdc\xe1\xb1\xb0\x76\xdb\xa3\xd2\x83\x29\x45\x4f\x51\xa0\xe9\x7c\x9d\x2c\xd4\x52\x2e\x41\x40\x50\x3e\xb1\xf5\x03\xbe\x5a\xfd\xbb\x74\xab\x95\x6e\x1f\xfb\xaa\x84\x69\xe7\x9a\x02\x7b\x7b\x4d\x63\xb0\x93\x7d\x43\x1e\xea\x9f\xc1\x80\xa0\x4c\x0c\x37\xd8\x90\x25\x96\xee\x42\xd1\xec\x84\xac\x77\x17\x6f\x93\x83\xc9\xe6\xce\xfc\xd6\x38\x9f\x06\x55\x7d\x75\x9f\xe7\x3e\xdc\xad\x02\x53\xf6\xd8\x2a\xfe\xe6\x21\x66\xbd\xab\xff\x12\xd5\x04\x7e\x00\x52\xa9\xa6\x52\x80\xed\x0e\x76\xe0\x6b\xe0\x5a\x3e\x27\x72\xd3\x53\x96\xab\x28\xf4\xcf\x52\x7e\x2e\x8a\x75\xfd\xc2\xb0\xbe\x1f\xb3\xd4\x49\x5a\x71\x13\x97\x99\x0c\x1f\x30\x3d\x80\xab\x1e\xd8\x30\xfe\x5c\xc3\xff\x00\xc7\x8d\xe3\xda\x04\x4b\xfc\x9e\x4b\x12\x8e\x39\x3d\x71\xeb\x00\x17\x4a\x76\x71\x7b\xe0\x2f\x66\xfe\x17\x9e\x83\x48\x87\x41\xc1\x52\x00\x6f\x96\xc9\x72\x78\x1d\xae\x57\xba\xbb\xae\x16\x9a\x65\x89\x47\x3e\x59\xe9\x78\x46\x5d\xc3\x79\xeb\xcb\xfc\x1b\x06\xd6\xe8\x57\x84\xe0\xc9\x3f\xe3\xc1\x3b\x52\x6e\xa6\xdf\x93\x87\xb0\xf3\x13\xc7\x64\x3b\xba\xf9\x8b\xa0\xa3\xe7\xda\x64\xad\x53\x55\x52\x23\x89\x4d\x5c\x67\x60\x9d\x86\x2d\x84\x85\x9b\xf9\xb4\x75\xa2\xc8\x3b\x91\x13\xa1\x6a\xdc\xe7\x21\x94\x3e\xf2\xa4\x1c\x1a\xa3\xcc\x40\xa8\x6d\x17\x13\x11\x3c\xee\xf1\x39\xef\xa6\x60\x60\xb3\x1c\xb4\xbe\xb2\x22\xd9\xca\xbd\xf1\x1c\xeb\x5d\x31\xe1\x69\x43\x46\x9b\xf4\x64\x7b\x8e\x73\x09\x16\xa0\x68\xbf\x5f\x0d\xe6\xe2\x58\x12\x21\xc2\xc1\xf7\xd2\x27\x3b\x91\xf5\x34\xff\x5a\xf5\xab\xaa\xba\xd4\x38\x35\x31\xfa\xe5\xb1\xd3\xd1\xdf\x93\xe1\xbf\x60\x1d\x44\x3a\x00\x1a\x0e\xac\x1a\x92\x30\x87\x11\x22\x4c\xa6\x2e\x51\xba\x1b\x2b\xdb\x1b\xc4\x90\xbb\x44\xb6\xe6\x0c\xa8\xea\x96\xf9\x52\x25\x4b\x1e\x18\x34\x0b\x20\xa1\x5d\xc9\x88\x13\xff\x1b\x09\x7f\x6e\x8a\xf4\xa6\x7e\xc5\x54\xcc\xe7\x6e\x48\x22\x6f\x1c\x29\x91\xcd\xde\x34\x70\xce\x85\x11\x83\x07\x87\x5a\x91\x07\x38\xbd\xec\xcf\xb7\x37\x07\x71\x2e\x94\x8a\x86\x92\xf9\x76\xa7\x21\x6e\x94\xf7\x7b\xcd\x11\x24\x61\x72\x92\x14\xc1\x80\xe9\xb4\xdd\x14\xe3\x34\xce\xa7\x8c\x2c\x2f\x98\x73\x66\xa7\xf3\xed\xdb\x6c\x89\x33\x54\x67\x47\x92\x35\x9f\xac\x6e\xea\x74\xb2\x86\xbf\x55\x43\xff\xdc\x89\xa5\xe1\x02\xff\xd3\xce\x7f\xd6\xf3\xa5\x18\xcd\x80\xa9\xa9\x3e\xd4\xd0\x06\x4b\x85\x59\x9b\x90\xc6\xd4\xc8\xf2\x5d\xb4\xa0\xb1\x2a\x57\x4b\x10\x0e\xa3\x00\x30\x89\xf5\x77\x08\x70\x81\x97\x2c\xec\x90\xea\xad\xb2\x1e\x3b\xe7\xd0\x5e\x54\x35\xff\x05\x65\xd1\xd9\x79\x81\x69\x42\x1d\xf4\x8f\xa0\xe0\xb3\x55\xbd\x75\x62\x4f\xe1\x9d\x07\xcd\x92\x13\x2d\xb3\x76\x54\x17\xf4\x11\xac\x74\x84\xeb\xe1\x9f\x7c\xd2\x9c\x40\xc2\x08\x08\xc8\x4c\x7d\x3f\x2f\x7b\xd0\x37\x76\xb0\x11\x50\xf1\x3e\xd8\xa0\xe5\xc3\xca\x23\xaf\xaf\x27\x3e\xe1\x45\xa0\xd4\x2b\xc7\x70\xca\x25\x9d\x85\xbf\xae\xfd\x6b\x47\xfa\xff\x43\x97\x02\x06\x70\xcd\x23\xc4\xd4\xe4\x8a\xa7\x23\xa8\x9f\x8e\xfa\xe4\x7d\x39\xd9\x69\xb2\x9e\x76\x15\x8c\x27\xce\x91\x45\x94\xcb\x15\xe6\x06\x1e\xe8\xda\x56\x2d\x59\x6e\xed\xfb\x29\x5b\x6d\xa5\x1e\xab\x4d\xa5\xe6\xf8\xd8\x6f\x45\x72\x6b\x23\x74\x2c\xee\x9a\x4e\xfe\x09\x0b\x25\x60\x4b\x80\x5f\xec\x5b\x30\x53\x6b\x6a\xd2\x3f\x29\x5a\x1f\xc4\x30\x3e\x06\x09\x62\x27\x8a\x73\xfa\x09\xc2\x21\xe5\xa3\x1f\x1b\xab\xa0\x82\xec\x6b\x0a\x31\x25\x0d\xb4\xe8\xf7\x24\x1d\xe2\x1c\xf0\xca\x1b\xcd\x29\x29\xa5\xb8\x22\x29\xe3\x3a\x21\xa1\xcd\x63\x19\x6f\xcf\xcd\xa5\xff\xc6\xe3\xbf\xf6\x25\x88\x14\x0c\xe2\x0b\xc0\xb3\xda\x03\x4a\x01\x44\xeb\xd7\x78\xd5\xcb\xb0\x64\xe1\x82\x53\xf6\xd5\xa9\xca\xaf\xac\xd8\xbd\x8f\xee\x34\x35\xb2\x60\xfa\x6c\x41\xcf\xbe\xbe\x60\x20\x24\x16\x68\x6c\xf1\xaa\xd6\x6c\xb3\x8f\x79\x40\x9c\x66\xd7\x46\xe9\x3f\xa2\xf8\xb6\xae\x79\xb6\xc3\xb2\x10\x99\x09\x4e\x97\xc8\xb5\x4b\x78\x3e\x2d\x27\x6a\x3c\xf5\x92\x96\xf0\x56\xc8\xd1\x2f\x99\x8e\x78\xe5\x27\xa6\x6a\x13\x41\x6a\xd8\x81\x21\xa8\xfb\x44\xe7\xf6\x26\x0c\x9d\x4f\xf8\x9c\xd5\x0f\x47\x86\x80\x40\xe9\x51\x9b\x9b\x68\x35\xfb\xe2\xfe\x7b\xe5\xa3\x48\x52\x97\x52\xf4\xe3\xdf\x8f\xf6\xaf\x7d\x0c\x22\x2d\x8e\x8a\x09\x92\x53\x57\x45\xc2\xc8\x4b\xcc\xf1\x55\x37\x8a\xc5\x05\x2f\xe1\xb6\xe7\x71\x48\xbe\x25\xbd\xfe\xba\xf3\x96\xfd\x3c\x69\xef\xed\xab\x3c\xb0\xa8\x33\xf9\x51\x36\x7c\x6b\x5f\x51\xad\x3a\x21\xee\x80\x04\xed\xcf\x67\xb7\x33\x38\xfa\x35\xd4\x80\x57\x49\x22\xe3\xb2\x81\x73\x84\xe0\x69\x3a\x7d\x5b\xc7\x92\xd6\xcc\xc8\x4b\xad\x11\x75\x3c\xd4\x53\x0e\xd3\x9c\x12\xf6\xf1\x8f\xec\x89\x46\xc1\x62\xca\x8d\xd1\x34\x32\xc8\xdb\x1f\xd3\x58\x37\xfb\xc2\x29\x25\x84\x78\xc2\x4f\x31\x28\x18\xb0\x5b\x5d\x41\x75\xa2\x6f\xc1\xf0\x8b\x1e\x96\xbd\xbc\xbc\x2a\x2d\xf7\x6f\x15\xdb\xbf\xf6\x5d\x88\x14\x3c\x54\x00\x90\x47\xce\xb8\x13\x3a\xb0\xd4\x9b\x65\x48\x9a\x61\x23\xe7\x8b\x43\xed\xdc\x6c\x8a\xac\x41\xcc\x53\x9e\x22\x56\x76\x93\xe4\xe1\xb6\x44\x01\xb6\x93\xc0\x07\x62\x89\x38\xb7\x16\x28\x9d\xb7\x04\x3e\xad\x6d\x7d\x22\x02\x98\x75\x48\xca\x86\xd1\x03\x65\x2f\x22\x3b\x24\x0c\xdf\x2a\x3d\xfd\x6e\xd2\x0c\xbf\x42\x4b\x3d\xa8\x53\x31\x9a\x67\x7d\x52\xb2\xef\xa2\xfb\x8c\xb7\xf5\x6c\xac\xaf\x45\xa2\xe1\x60\x51\x46\xed\x60\x51\x14\x64\xb1\x46\xce\x29\xc4\xbf\xa1\x12\x24\xa3\x5b\x9a\x1d\x1c\x9e\xdd\xbc\x60\xa8\x1a\x4d\x6e\x0d\x99\xcc\xcf\xde\xb8\xa2\xa2\x0e\xd5\xfb\x9b\x42\xfd\x17\x4a\x80\x48\xd1\x42\x83\x5b\x44\xdf\xc9\xa2\xcf\x76\x48\x30\xcd\xa9\x5d\xdb\x5e\x2a\x4d\x63\x07\x7b\x2f\x37\x32\x81\xd1\x12\x9b\x92\xaf\xad\x6c\x48\xed\x04\x48\x12\xce\x0c\xb5\xc6\xff\xf9\xd2\xd9\x82\x68\x97\x35\x64\x42\x45\xc9\x7d\xe9\x8c\xb2\x95\x0a\xdb\xca\x19\x77\xff\xbe\x28\xdb\x35\x0c\x2c\x94\xa4\x32\x63\xc7\xac\x55\x81\x14\xd7\x57\x8b\xb4\xab\xa0\xf7\x1d\xc3\x71\x7a\x8e\x7a\xb4\xb8\xc1\xeb\xd1\xad\x79\xb3\x3b\x3c\x5b\x05\x4c\xbb\x15\x79\xbf\x84\xd3\xd5\xb6\x85\xa4\x56\xed\x78\x77\xc7\x7d\xc7\xa8\x3d\xb0\xb5\x55\x2c\xb8\x38\xf0\x0d\x98\xf8\x50\xc8\x02\xd6\x0c\x57\x27\x4e\x37\x7e\xe7\x71\x61\x14\x8c\x41\xb1\xaa\xf2\x66\x99\x5c\xc5\x84\xff\xd5\x71\x8a\xa8\x29\xb0\xf7\x29\x75\x4b\xb1\xc2\xeb\xef\x92\xfc\x27\xfe\x91\x92\x37\x05\xe3\xd6\x82\x8f\xea\xf5\x72\xbe\xd2\x9f\xe6\xad\x08\x28\xd7\xe3\xbc\xb2\x2d\x93\xb7\xe3\xa2\x30\x5e\x17\x3f\xa7\x1c\x36\xda\x4b\xc3\xc1\x7e\x29\xcd\x31\x1a\x26\xd6\x29\x72\x07\x93\x53\x75\x4a\xfe\x0f\x2e\x9f\x3d\x72\x85\xfd\x2b\x94\xc7\xa4\x4c\xb8\x98\x79\x92\x7a\xaa\xc1\x26\x0a\x32\x17\x99\x88\x45\xb4\x30\xd4\x16\xe4\x67\xbf\xb2\x23\x6f\x6e\xc9\xd3\x94\xc6\x07\x25\x67\xef\x0c\x82\x6f\xf5\xba\x69\xd9\x40\x92\xf2\x81\x3b\x99\x97\x5f\xfd\xa7\xcc\x14\x9e\xfd\x70\xca\x08\xd1\xab\xec\x5a\x9d\xb7\x6f\xd1\xff\xf8\xbb\x0f\xa5\x20\x0c\x11\xe3\x7f\xb8\xcc\xc5\xfb\x3f\x86\xfd\xd7\x44\xf4\xbb\xd4\x76\x72\x48\x92\xc8\xbf\xfb\x31\x57\xfa\x7f\xd0\xb8\x1f\x2e\x3f\xa7\x7e\xc8\xd9\xf0\x8a\x8c\x3d\x7b\x3d\xf9\xff\x20\xd2\x8a\xa8\x3a\x04\xcd\x54\x29\x1e\x0f\xf8\xd1\xfe\xe8\xd3\xa4\x54\x4d\x38\xb1\x30\xb6\xe9\xc3\x7b\xe9\x30\xdc\x76\x7c\xba\x9e\xfe\x09\x30\x4d\xcc\x74\x14\x3a\x86\x5f\xdc\x49\x1d\x59\xe0\x08\x33\x29\x9c\x62\x39\x7c\xd7\x8c\x74\xfa\xad\x33\xfc\x24\xc3\xdd\xe5\xfd\x31\xd7\x53\x90\xbb\xed\x94\xf1\xc4\xbe\xd7\xc2\x4d\x81\x72\xb2\xba\xf3\x0d\xdd\xad\xf7\x66\x2c\x15\x4b\xba\x28\xe3\xf0\xb9\xd0\x6c\xc0\x84\x05\x68\x97\x8f\x90\xcb\xcb\x8a\x79\x0c\x61\x2f\xdb\x74\xd8\x6b\x97\x10\x62\x98\x91\x31\xeb\x0b\xbf\xb7\x7e\x2a\x04\xa9\x68\xb9\xd4\xcc\x8d\xc0\x09\x03\x21\xa5\xdf\xdc\xee\x0e\x9e\x96\xf1\x6b\x77\x66\x4f\x1b\xf1\x54\x9e\x0f\x4c\x0b\x53\x60\x9e\x8d\x98\x6b\x6e\x5c\xb1\x15\x36\xc0\x64\x0d\x99\x51\xc9\xfd\x68\xdd\x9b\x3d\xe4\xd9\x2c\x42\x83\xf4\x6c\x09\x3d\x37\x7b\xac\x48\xc4\x84\x34\x6d\xf9\xe3\x55\xd4\xfc\x1b\xa0\x10\x38\x35\x36\x52\xed\xa5\x6c\x65\x40\xd9\xe4\x47\xbc\x63\x5f\xb2\xb2\xf9\xe2\xae\x42\x41\xc4\x0b\x13\xda\x2f\x05\xea\x26\xef\x35\xe2\x40\xdc\x6e\x75\x7e\x9c\xf9\x7a\xfa\xcd\xda\xf0\xa7\x88\xd7\x69\x91\xa2\xf9\x76\xca\xcf\x5c\xbe\x5c\x9c\x44\xae\x86\xaa\x5a\x3c\x3b\x2f\xa0\x03\x20\x63\x74\xc1\xae\x78\xa1\x22\x75\x5b\x5a\x28\x76\x42\xe4\x06\xe4\xbd\x20\x37\x4d\x95\xfe\xe4\xd7\x96\x12\x7b\xa5\xe7\x99\xb9\xbc\x40\xc2\xa8\x4a\x40\xd6\xdf\x30\xe3\x5c\xd1\x77\x82\xed\x55\xea\x0c\x45\x1b\x99\x21\x5a\xe2\xf5\x2f\xba\x77\xaa\xe3\xe3\x9e\x25\xf3\x5d\x80\xfb\xe4\x13\x09\xfc\x4e\x68\x45\x11\x13\x92\xb1\xb8\xdd\x86\x6e\x9f\xd2\xcc\x4d\xe6\x1f\x8f\x75\x1a\x33\x3b\x7c\xe9\x7b\x08\x05\x00\x05\x5e\x4e\x77\xe6\x16\x45\x65\xd4\x61\x88\x1a\x8c\xc0\xc4\xcc\x07\x23\xb3\x04\xba\xa6\xcf\x99\x95\x91\x53\xbb\x24\x32\x42\xc8\x69\xa3\x00\xe7\x76\x4d\x61\x65\x4a\x80\xb9\x69\x67\x62\x90\xdb\x85\x4b\x01\x4d\xdf\x36\x87\xee\xee\xe5\x3e\x53\x31\x41\x3b\xf7\x3a\x3a\x1b\x11\xf0\xdf\x22\x64\x9e\xc7\x57\xea\x9f\xc5\x2b\xd6\xbe\x27\x68\xcc\xfb\x86\x35\xec\x4c\x68\x9a\xda\x7f\xab\x65\x83\xd2\x6a\x79\x2e\x8e\xf8\xe1\x69\xd0\xd6\x65\x56\x8d\xd1\x71\x93\x3a\xfc\x15\xfa\xd8\xed\xb9\x6d\x32\x78\xef\x5c\x28\x8d\xc5\xf1\x99\x68\x1b\xed\x9d\x3a\x03\x3c\x50\x0a\xc2\xd8\xd3\x79\xa2\x89\x60\x9f\x4b\xcb\x53\x95\xe7\x24\x74\x7d\xc4\xa3\x16\x67\x39\x5e\xe0\xbe\x4d\xef\x05\xd5\xcb\x8e\xf2\x07\x77\xe0\xf9\x5c\x84\xcf\xc9\x63\x50\x53\x77\x27\x42\x3e\x9c\x55\xb4\x7e\x3b\xf6\xc6\xcc\x18\x0d\x61\x22\x34\x47\x6e\x0c\xa7\xb7\xea\x5d\x00\x52\x5b\x6b\xd4\x24\xa4\xbf\x15\xbf\xdc\x67\x84\xdf\x85\xd7\x65\x1b\xc9\xb1\xa0\x7b\xa9\xd2\x8a\x65\x52\x94\xb8\x34\x57\xd2\xbf\x88\x74\x00\x06\x0d\x6b\x19\xfe\xa2\x77\x9f\x88\x46\x88\x9b\x2e\x68\x5a\x1b\x6c\x35\xca\xa4\x8a\xf4\xcd\x8e\x1c\xb9\x45\xe1\xe7\x33\xbd\xe4\x59\xa0\x9c\xb1\x4a\xcb\x72\xa4\xfd\xb8\x75\x2d\xad\x2c\x59\x47\x20\x40\x41\xe6\xcc\x2a\xa8\xb4\x4a\x80\x2d\x05\x69\x02\xb7\x03\xe6\x79\x26\xd8\x3d\xcf\x5f\xdf\x28\x84\xb3\xcc\xf4\x9e\x2b\x5d\xa5\xe7\x4b\x18\x63\xd4\xe3\x47\x73\x8b\xda\xef\xf5\x6e\xde\xa1\xdf\x52\xe4\xe0\x06\x95\x9f\x06\x0d\xad\xde\xbc\xb3\x77\x86\x0e\xc5\x0b\xec\xcd\x31\xf0\x64\x3d\xe1\x62\x77\x0e\x55\xa4\x3a\x9a\x55\x6d\xb7\x21\xfa\xa0\xf7\xbe\x06\xd8\x0b\x0a\x18\x0e\x75\x87\x94\x54\x17\x82\x44\x9e\x69\x25\xea\x75\x72\xb0\xb3\xfb\xa6\x7d\x52\x50\x7d\xf6\x9d\x41\x8d\x18\xc3\x07\x0a\xf0\x89\xad\x70\xc2\xf8\x42\xa2\x9a\x9d\xfb\xf5\x39\xe6\x36\x51\xb7\x1b\x14\x41\x44\x89\xd3\xe3\x7b\x3e\x77\xcf\x7c\x06\xa2\x0d\x1b\x20\x67\xa0\xb9\x68\x9c\x13\x67\x5e\xbe\x44\x25\x18\xb3\x70\xcf\xbf\xe0\x15\x93\xb4\xee\xb3\x21\x12\xb5\xb8\xc1\x70\xc1\xd5\xd3\xaa\xd9\x00\xf8\x44\x4b\x6a\xa8\x9d\x58\xed\x14\x11\xa0\xf4\xf9\x25\x26\xed\x46\x5b\x4d\x3f\x0e\xcf\xf9\x79\x02\xd9\x17\xf2\x98\xef\x14\xfb\x21\xec\x4f\x83\x5a\x31\x1e\xf6\x97\xf2\x93\x08\xe0\x61\x29\x8a\xdf\x72\x75\xa5\x9e\x5a\x4f\x14\xec\x59\x1c\x05\x3b\xa9\xa9\x92\x49\x4d\xc0\x58\x3f\x59\xfa\xaa\xeb\xcc\xf7\x84\x87\xc7\x32\x6d\x78\xd5\x88\x1a\x77\xbb\xb4\xaf\x5f\x7e\x47\x3b\xad\xaf\x10\x8a\xb8\xdd\xb4\xdd\xbf\x89\x02\x2f\x5f\x0b\x8d\x1f\x8c\x85\xb7\xcc\xf6\x63\xd9\xb6\x2a\x2d\x86\xf3\xbf\x07\x4d\x23\x1e\xc0\xf3\xad\x12\xb5\xef\xa9\xb2\xe7\x4a\x01\xd5\x5c\x0e\x71\x1e\xf4\x77\xec\xc7\xe5\x67\x2c\x07\x8f\x34\xdf\xf5\xd3\xf7\x7e\x39\x97\x22\x04\xc6\xab\x98\x3b\x6e\x21\x07\x17\x16\xca\x03\x83\x32\x51\x8d\xe8\xb2\x52\xbe\xdf\x38\x5a\x93\x3b\x20\x23\xfa\xe2\x2a\xd8\xdd\x93\x35\xc9\x82\x73\xa4\x89\xf8\xfa\x33\xfc\xa6\x20\xa0\xa8\xff\xe5\xf0\x57\xec\xed\x7c\x58\xa9\x37\x02\x0f\x54\x72\x2f\xf7\x0b\x7b\x85\xc6\x38\x2d\x7d\xce\x6f\x2e\x0c\x4c\x7b\xdc\x0a\x0a\x29\xc0\xa0\x32\x9a\x03\xc5\x23\x8d\x43\x1b\xfd\x3b\xe4\x70\x8e\xeb\xde\xf8\x55\xae\x04\x2a\x6a\xc1\x62\x6d\x7d\xdd\x35\xb3\xcf\x05\xc3\x75\x9e\x06\x7d\x4b\x05\x8b\x5f\xf9\x8d\xaf\x9d\xd5\x2f\x11\x35\x4d\x52\x75\xf7\x27\xdd\x17\xbc\x33\x61\x5a\x19\x93\x5b\x62\x8d\xcc\x2d\x71\x90\xc6\x4d\x83\xae\xa6\xce\x25\xc3\x9f\x4f\x28\xc7\x92\x1a\x92\x41\x76\xb8\x79\x0c\x85\xee\x37\xda\x3b\x3b\xfd\xf9\xe3\x31\xf9\xf9\xe7\x12\x40\xfe\xae\xab\x56\x60\xbc\x61\x8a\x70\x77\x11\xef\x35\x47\x0f\x8c\xef\x3b\x01\x4a\x15\x6d\xe4\x50\x81\x5f\x2e\x8b\xe7\x82\xcc\x76\x8c\x4f\x96\x59\xba\x44\x61\x1e\x90\xe1\x17\x2b\x01\x5c\x7f\xee\xfc\x46\xf2\xb7\xf5\xf3\xbf\xcb\xc8\x92\x46\x21\x97\x19\x37\xbe\x82\xa3\xb3\x07\x1e\xef\xc8\x9b\x80\x27\xf8\xc7\x2b\x2b\xaa\x72\xb6\x69\xcf\xba\x44\x9e\x6f\xc2\x9b\x94\xd8\xba\xba\x4d\x8b\xb3\x95\x33\xb5\x53\x06\xd0\x14\x8b\x74\x0c\x90\xdc\x84\xea\x64\x1e\xc1\x5b\x31\xd9\x8b\x86\xc7\xa5\x3d\x33\x47\x6e\x27\x0f\x5a\x4d\x5d\x10\x39\x5c\x90\x99\x01\xfe\xfb\xb9\x6f\xc3\x2f\x2d\xa7\xeb\xcb\xcf\xd5\x2b\xa6\xb2\x02\x87\xa6\x3c\xe2\xa5\xc3\x33\x44\x45\xf7\xdc\x63\xb0\x7e\x58\x5b\x2c\x1d\x82\x35\xe7\x05\x52\x0a\x3c\x90\x5d\xdb\x1c\xd5\x78\xce\xa2\xe9\xdc\x28\xb7\x3e\x44\xaa\x96\x5a\xb1\x06\xcc\x56\x03\x91\x9c\x72\x37\xa0\x40\xcf\xab\x19\x29\x3e\xd6\x52\xdd\x0e\xe7\x31\x9a\xff\xa5\x5a\x21\x5d\xaf\xea\xaf\xb5\x8b\xc2\x32\x9d\xf7\xbc\x57\x6f\x3f\x3c\x9a\xab\x00\x35\xc7\x3c\xce\x29\x2b\xc7\x06\xb2\x83\x62\x7d\x67\x2f\x25\xe7\xf3\x4b\xe9\xc7\xa2\x32\x82\xbb\x36\x13\xf7\x3f\xcf\x6f\x4e\xc2\x83\xb0\xc2\xaf\x56\x5a\x37\x82\xee\x99\xe2\x01\xa2\xe9\x0c\xc7\x50\x50\xe8\x63\xc8\x07\x3b\xac\x25\xc7\xa9\x5a\x1c\xca\xca\x0f\x23\x5b\x63\xc0\xc7\xff\xac\x7d\x6e\xbf\x4c\x9b\x50\x93\x52\x08\x39\xac\x26\xb3\xcc\xf2\x15\x80\x5d\x5b\x5f\x73\xa9\xea\xd3\x4e\x54\x98\x55\xea\x02\x9a\x59\x54\x77\xbd\x43\xb0\xdd\xf9\x25\x8b\xbe\x58\x0a\x2f\x88\x66\x28\x77\xcc\x56\x9e\xae\x36\xdf\x45\x53\xed\x09\x81\x67\xe2\xd4\x06\x7f\x7c\x72\x39\x53\x1a\x31\x29\x9e\xa7\x65\xd4\x74\x1e\x5f\x51\xf8\xa5\x06\xa4\x65\x06\xd3\xa9\x25\xff\x48\x8f\x9a\x65\x8f\x69\xdf\x01\x1a\xd5\xd7\xac\x15\xb8\xd4\xd6\x41\xd8\xac\xe6\x07\x52\xd7\x94\x2a\x0d\x91\xc8\x87\x5b\x5f\x8e\x74\xa3\x3b\xcc\xa8\xe5\x08\xa7\x1d\xdc\xc1\xcd\xec\x51\x93\x47\xd8\xcd\x14\x75\x5a\x1c\xdb\xa8\x03\x87\x25\xf5\xee\x08\x31\x61\x3b\x6a\xab\xf2\xa5\x8a\xb7\x81\x29\x46\xff\x7c\xc3\xd3\xeb\x47\xd1\xfa\x01\x1b\x98\xdb\x00\x91\x97\xbd\x92\xcc\x18\x81\xf3\xf4\x7d\x7d\xe1\x8f\x1d\xe2\x48\x6d\x31\x4a\xb2\x6c\x5e\x90\x25\x08\x44\x34\x37\x9c\x29\x7e\xa5\xb1\x56\x21\x24\x26\x46\x06\xaa\x81\x60\xca\xca\xc5\xae\xc8\xf3\x83\xc6\xe2\xf8\x8f\xf4\x8f\xa2\xb7\x21\xc0\xed\x03\x53\xd6\xae\x70\x60\x9e\x42\xac\x16\xe7\x77\xf5\x4b\x0c\x1c\xb1\x15\xd7\xd7\x0e\x8b\x2d\x0c\xed\x5f\xd4\x64\x95\xe9\x0c\xfe\xa3\x3c\x18\x2c\x51\x35\xfa\x2c\x44\x37\xf8\x45\xc6\xdd\xbe\x31\x43\x32\x99\xbe\x9f\x09\xca\x0f\x95\xa0\x11\x99\x51\x81\x1b\xdc\xb5\xd4\x3b\x90\x1d\xc0\xe9\x28\x8d\xe4\x32\x6f\x32\x49\xd2\x75\x23\xf6\x3a\x6c\x5d\x75\x51\x76\x4e\xf9\x1c\xdf\x48\xfb\x60\x7e\x2e\x64\x77\x58\x11\xc0\x12\xe5\x6f\x7b\x2a\x9c\x6c\x28\x2f\x24\x2f\xec\x73\x1b\x95\x4f\xca\xcb\x95\xbd\xab\x3c\xeb\x64\x33\x99\x66\x70\x0b\xa1\x8c\x56\x01\x1a\x85\xb0\xd4\xb0\x7d\x68\xba\x3d\x2b\xbe\xb4\x3b\x3a\x13\xed\x2f\x2f\x06\x4a\x58\x5e\x3a\xb5\x8f\xb8\x1a\xd9\xb9\x6f\xa4\x75\x81\x1c\x60\xdc\x48\x21\x86\xcc\xb8\x52\xac\x22\x76\x4e\xb1\x16\xe3\x82\xab\x5b\x06\xfb\x81\xb2\xd7\xe7\xdc\xa1\xf7\x92\xce\x43\x16\x3d\x04\x40\x48\x53\x51\x2c\x63\x0e\xbd\xa0\xfb\xf2\x1e\x89\xa9\xae\x9d\xbd\x87\x3f\xec\x90\x56\x20\x65\xd9\x67\x44\xf9\x8b\x72\x07\xf2\xa2\x0c\x10\xa8\x23\xad\xa4\x32\x7f\x02\x8d\x5e\x92\x6b\x45\x25\xf3\x52\xa2\x2f\xd6\xc8\x35\x56\x14\x23\x95\xad\xc5\x2b\x51\x7b\xbe\xeb\xf8\x00\xa4\xff\x7f\x37\x09\xef\x8c\x67\x9d\x4b\x90\xe5\x67\x97\xd9\xb2\x8f\xca\x7d\xb6\x4d\x6b\x66\x65\xfc\x94\x56\xb6\xe7\x30\x39\x45\xe8\x9b\x00\x3c\x1e\x47\x78\xc6\xfd\x00\x41\x39\x3f\xb4\xda\x97\x96\xc3\xcf\x9f\x35\x8c\x82\x92\xc6\x35\x76\x41\xa3\x49\xa1\x32\xf8\x7b\x93\x1f\x80\xa4\x8c\x85\xe0\x39\xd9\xb6\xfc\x2d\xf7\x8a\xa9\x13\xd7\x3a\x66\xfc\xed\x9b\x64\x70\x29\x90\x3e\xe2\x18\x9a\xe2\xc2\xad\x4a\x75\x2e\x3e\x59\x36\x47\xdd\x99\xf5\xf6\xbc\x3d\xd7\xf8\xa3\xba\x9c\x89\x7f\x86\xa2\x8d\x97\x63\x4e\x18\x80\xff\x86\xc0\x8a\xb0\xc0\xab\x78\x62\x19\x88\xe8\xe4\xa2\x43\x44\x3c\xd4\xd1\x1b\xe7\x8f\x23\x31\x7e\x59\x43\xf6\x04\xd0\x2a\xb8\x2b\xb7\x9a\x0a\x34\x9b\xf2\x2d\xa9\xe9\xbf\x81\x7b\x92\x9d\xf5\x0e\x07\x9f\xc2\x68\x7f\x34\x44\x9b\x4a\x4a\x2a\xf9\x4f\x52\x0b\x3b\x3f\x29\x36\x48\x99\xa7\xe3\x56\xe1\x19\xe5\xa2\x40\xde\xe4\xf8\xa9\x22\x5e\xd9\xaf\xa9\xe2\x92\xc5\x8d\xd9\x79\xd6\xcb\xfd\x23\xb6\x95\x87\x48\x2a\x8b\x9b\x0d\x9a\x76\xec\x01\xd1\x30\x93\xbf\xe8\xff\x5f\x80\x17\x22\x95\x1d\x80\x09\xa0\xff\x42\xd9\x72\x34\xf1\xaa\xb2\x5b\x95\x99\xc5\xa5\xa6\xae\xed\x46\x2e\xb4\xf9\x02\x4a\x8a\x06\x7c\x99\x4d\x24\x0c\x25\x71\xc5\x00\x60\x0e\x13\xdb\xef\x03\x4f\x96\x88\xf2\x9c\x89\x65\xda\x5f\x85\xcc\x8f\x40\x4a\x8a\xed\x24\x02\xef\x4b\x12\xba\xcf\x55\xd8\x45\xb1\xc0\xfb\x75\xf5\x49\xa2\xe6\xda\x81\x8e\xa2\xc9\x98\x40\x43\xbd\xb6\xb0\x47\xea\x8b\xef\x43\xec\xcb\x9d\x90\xa0\x0c\x81\x3f\x59\x54\xaf\x2d\xc1\xd2\x14\x1e\x2c\x33\x13\x5a\xc1\x1b\x29\x01\xc3\xec\xc4\xd0\x60\x3e\x55\xf4\xb6\xe7\x51\xb3\x65\x5f\x15\x79\x64\x8b\x2a\x94\x1b\xad\x2e\x21\x30\xff\x4b\x7c\x2e\x05\xd3\x0e\x26\x51\x66\x58\x8d\x9a\xbe\x7d\x8f\x5f\x2a\x4e\xaa\x99\x49\x53\xd1\x63\x34\xa7\xb3\xd3\xfb\xd6\x7f\x82\x52\x3b\x30\xc7\x10\x47\x1f\xec\x00\xcc\x01\x23\x44\x45\x8a\xa6\x08\x81\xb5\xf7\x21\x28\xc3\xbd\x1a\xaf\xd6\xc5\x0a\xff\x9d\x5a\xa8\x73\x38\x2c\x16\x1f\x4f\x4c\x34\xa7\x16\xf0\x75\x91\xe5\xa7\x9b\x3a\x51\xc6\x14\xc6\x93\x2a\x36\x1c\x7a\x50\x5b\x1c\x1a\x16\xe6\x9c\x20\x9a\xa2\x4c\xc5\x50\x27\x5c\x4a\xb9\x7a\x4f\x5f\xd7\xa5\x70\xb2\xee\xac\xca\x10\x07\x3d\x9c\xb3\x49\x59\x93\x5c\x14\xe6\xbd\x26\xf5\x54\xaf\xe5\xea\x1f\xc4\x67\x3e\xa2\x99\xab\xd6\xc0\xf3\xdd\x38\x7c\x8e\xfb\x79\xd7\x5e\x51\x79\xe4\x08\x38\x32\x51\x37\x14\x16\x7e\xa6\xa9\xc6\xff\x70\x9c\x47\x5b\xe4\xac\x4a\x3d\x22\xf4\xf7\x80\xfb\x4f\x90\x2e\x85\x83\x18\x03\x1c\x70\x97\x89\x6c\xbf\xf7\x0d\x3d\xda\x6c\x72\x0d\xfe\xaa\x9e\x19\x40\x6a\x0b\xeb\xfb\x38\x91\x21\xa5\xb3\xa4\x23\xd1\x85\xba\x8d\x02\x0d\xcc\x41\x59\x6f\x38\x8e\xed\xca\x39\xd1\xaf\xdc\x27\xe7\xbb\xaf\xca\xf6\xf2\xa3\x13\xad\x25\xc6\x38\x7e\xf6\xf4\x5a\x06\x39\x36\x22\xa8\x45\xbd\xc9\x48\xee\xef\x3e\xe8\xa0\xa5\xee\x17\x7b\x20\x05\xd5\xea\x65\x2f\x19\x95\x6b\x8e\xf0\xbc\xd4\x34\xb9\x1d\xde\xee\x79\x23\x28\xd4\xbf\xe2\x66\xd2\xc6\xa4\x0d\x95\xf2\x3b\x61\xca\x3a\x42\x91\x06\xc9\xfb\xd3\xc1\x31\xb5\xea\xc1\x46\x05\x1c\xab\x07\xb7\xb5\x0a\xa8\x2a\xe5\x9f\xf9\x99\x4e\x2b\xaa\xca\x6c\x7a\xf2\xf0\x35\xd1\x6f\x5b\x06\x7d\x8b\x1c\x97\xcd\x42\xb5\xe1\x64\xfa\xb5\x4e\x35\xb1\xeb\xb9\xbf\x81\xf0\xaf\x9f\x3b\x44\x0a\x06\x16\x33\x18\xb8\xe5\xaa\x90\x27\x33\x69\xd0\x36\x3e\xa7\xce\xce\x40\xc8\x1d\x60\x4c\xc9\xb9\xe0\x11\xbd\x93\x6d\xb8\x91\x95\xe0\xfb\x80\xea\x02\xec\x5b\xd1\xfd\xf0\x6f\x91\x1d\x7b\xfb\x98\x3b\x2e\xea\xb5\xee\x36\xa3\x90\xc3\xdc\x42\x1f\x24\xf6\x07\x0c\x42\x4b\x9c\xca\x52\xf9\xc1\xbc\x26\x94\x4f\xf7\xcd\x9a\x0e\x63\x89\xfe\x02\xf9\x9e\x1c\x46\x50\x66\x44\x2a\xfc\x8e\xbb\x33\x53\x35\x5e\x62\xb9\x2b\xfd\xa6\x37\x58\x3b\x11\x4e\x3c\xc6\x50\xcd\xb1\x93\x12\xd7\x58\xa9\x55\x9b\x84\x94\x06\xcb\xfe\xfd\xdd\xfb\x9b\x6a\x0f\xfa\x51\xea\xd9\x42\x94\x09\x30\x10\x44\xbc\x25\xac\x93\x79\x1e\x98\xe4\xcc\xcd\x02\x33\x2b\x08\x62\x86\xc3\x68\x7d\xdb\xca\x66\xee\xd5\x51\x10\xe8\x23\x83\xde\x52\xfd\x0d\x84\x7f\x6d\x1b\x10\x69\x0a\x4c\x0a\x0a\xe0\x25\x94\x1a\x7e\xea\xae\x44\x3f\xb1\x18\xda\xd5\x7d\xd9\x47\x56\x75\xcf\x6c\x68\x38\x43\x47\xb8\xcf\xd8\x6f\xd0\xd1\x25\x97\xb1\x68\x09\xe4\x81\x21\x95\xa3\x0e\x8e\xdd\x9d\xc8\x49\xad\xaf\x68\x1d\xf1\xef\x48\x06\xbf\x5a\xa1\x17\x71\x45\xc3\x87\x97\xf9\x91\x8f\xdf\x17\x00\xd3\xdd\xd9\x67\x7a\xe3\xb5\x11\x15\xe5\x7c\x41\xc2\x86\xd0\xc1\x93\xf4\xd6\xd5\x76\xdb\x6c\x5c\x4f\x2a\x0d\x33\x15\xb7\xb7\x7e\x09\x6c\x52\x88\xc6\x26\x11\x68\xff\xd5\x13\x35\x26\xef\xfb\xeb\x81\xdc\x9c\x56\x13\x3c\x24\xf2\xc6\x15\xb9\xfc\xb1\x51\x1e\x42\x27\x56\x7f\xb0\x22\x00\x5f\xd4\xd9\x29\xda\x38\x02\x8d\x0f\x1d\xf5\xce\x2a\x65\xc0\x37\x51\x2e\xf6\xf3\x77\x2b\x67\x86\x49\x2c\xc8\xb3\xd8\x9f\xe3\x11\x7f\x1b\x10\xfc\x6b\x43\x84\x48\x4b\x52\x10\x61\x02\x0d\x08\x70\x90\x1f\x30\x9d\x1e\x9e\xeb\x2b\xfe\xd9\x7b\x7b\x12\x47\x77\x20\xfa\xa8\x46\xf4\xda\xdf\xfe\xcd\xcd\x2a\x4e\x77\x09\xbf\xa0\x10\x30\x89\xb5\x09\x43\xc3\x0b\xad\xbe\xd6\x9b\x0d\x7e\x8f\xe0\xe3\xa2\x54\x0f\x98\xa3\x74\xd6\x66\xf6\x8d\xb0\x6d\xee\x3d\x04\xcb\x65\x33\xb0\xea\xb8\xf1\x5d\xfc\x62\x8e\xd9\xa7\x23\x5e\xdf\x0f\x4c\x19\xe8\xbe\x0f\x1d\x4b\x34\x45\xdd\x1b\xe9\x56\xc5\xcf\x91\xe3\xd9\x6d\xc1\x06\x04\xc5\xd7\x85\x96\x13\x93\x98\xf4\xba\xf4\xc3\xb9\x72\x99\xd7\x84\x23\x33\x1e\xf3\xbd\xd3\x65\xa3\xca\xd8\x79\x77\x8f\x99\x07\x19\x80\xa9\xd7\x65\xcb\x7d\x32\x15\x42\xd4\x86\x06\x33\x8d\xd4\x22\x26\xd9\xef\xd3\x05\x2e\x5d\x93\x01\x93\xdf\x51\x62\xd4\x97\x06\xbb\xa4\xe0\xa8\xea\xc6\x30\x86\x45\x37\x32\x82\xe1\x26\xaf\x42\xed\x7c\xe8\x7d\x3e\xe0\x3b\x1a\xc4\x7e\x21\xf2\x4a\x0c\x19\x74\x1f\xd8\x01\xd7\xa3\xf9\x36\xee\xab\xd4\x9e\x0c\x6a\xe1\xe3\x65\x9b\x5a\x2b\xed\x55\xbe\xea\x3f\x42\x75\x8b\x6f\xc7\x53\x02\x4a\x67\x3f\xbf\xed\xf0\xbd\x9c\xfe\xbf\xc5\x39\x41\xc3\x19\x9b\x5d\xb6\x3f\x8a\x29\xa5\x5e\x4e\xa9\xd9\xe4\x65\xa2\xda\x59\xfd\x52\x6c\xec\xb2\x25\x96\x41\x0f\xd0\x68\xde\x99\xfa\x7f\xe5\x5a\x26\xd0\xeb\x60\xc9\x38\x3e\xd0\x91\xaf\x51\xae\x60\x68\xbc\xaa\xec\x97\x9c\x2f\x78\xbb\xfb\x3a\xaa\xda\x07\xd9\xa5\x42\xe1\x25\x10\x37\x9f\x19\x83\xee\x77\xd9\xc3\x8e\xa0\x25\x88\xfa\x15\xa9\x79\xea\x17\xa0\x4c\x87\x14\x78\xb6\x63\xec\xd3\x02\x22\x68\xdf\x1d\x01\x13\x2e\x0f\x96\xab\xb0\x37\x7c\xcf\xe1\x4b\x71\xad\x9d\x59\x76\x4a\xe4\x7d\xa0\x2f\xb7\x9d\x23\xcb\x15\xd2\xda\x45\x78\x6c\x7b\x6e\x00\xec\xfb\x7e\x9b\xc4\x5a\xf4\x6a\x8e\x52\x9e\x55\x49\x1d\xca\xc6\xb2\x18\x2d\x77\x8f\x85\x84\x4b\x99\xb0\xe3\x01\xd1\xf6\xf7\xc7\xeb\x80\xc2\x57\x0a\x37\xed\x94\x54\x82\x46\x42\xc4\xb7\x58\x31\x56\x5b\xe6\xec\x56\x64\xec\x09\x03\x1d\xa3\x84\x24\xca\x97\xb8\x87\x15\xca\xc0\x81\xeb\xcf\xf5\x46\xc0\x6b\x96\x76\x7f\x46\xfe\xd6\xb7\x89\x9c\xfe\x91\x62\xc7\x28\xb6\x16\x99\x8c\xba\x52\x3c\x73\xf6\xd3\x2f\xf0\x77\x40\x28\x87\xf9\x8a\x6a\x0e\xfe\x0d\x32\x74\x22\x43\x76\x5c\xc3\xc3\xab\xfb\x40\x8f\x09\xe9\x18\xd1\x2b\x72\x5b\xa5\x5f\xdf\xeb\x2d\xa7\x21\x80\x29\x15\x0e\xa6\xf2\xa2\x56\x85\xf8\xee\xad\xd8\x28\x73\x13\xa7\xdf\x3e\x9f\x45\x00\xc2\xc7\x69\x5d\xdb\x6c\x56\x56\x3b\xc6\x8b\x56\x50\x93\xc4\x81\xcf\x4a\x3f\x5d\xcc\x0e\xd7\x9b\xdc\x2e\xe6\x36\x2e\x49\xbd\xbb\xa0\x8a\xc1\x2f\x24\xd0\xac\x82\xec\xa2\x47\xb2\xea\x69\xaa\xc1\x67\x43\x4d\xf1\x1f\x1a\xc2\xa0\x10\xf4\x49\x3f\x33\xa1\xa4\x51\xd9\xf5\x76\xc1\x92\xdd\xba\x39\xbc\xbb\xd9\x2e\xb7\xf0\x45\x7a\xb2\xdc\x7a\x1f\x88\x87\x19\x2f\xcf\x5c\xe4\x31\xf1\xc8\x72\xfa\xf6\x48\xa6\x49\x75\x28\xac\x53\x34\x75\x2d\x0b\xd2\x4a\x4f\xed\x8b\x0e\xbc\x53\x0e\x98\xc5\x2b\x21\x9d\x05\x1b\x0e\xd2\x1a\xea\x83\x3c\xcb\xc5\xdd\x8c\xdd\x51\x33\xff\x3c\xa9\xc1\x49\x09\xc7\x92\x63\xba\xe3\xa7\x41\xc5\x58\xa4\xbf\xc2\x55\x8e\xf3\x8d\xea\x14\x9f\xc4\x94\x4c\x58\xdc\x7c\x08\xfe\xed\xf2\x18\x56\x61\xae\xc4\xfb\x55\x7a\x8d\x13\xa8\x8e\x81\x74\x55\xf3\x1e\x1e\x64\xfb\x5a\x79\x6d\xf8\x23\x8d\x67\x3a\x64\x97\xd2\xb8\x71\x5c\x05\x5b\x63\xfe\xa0\xa5\x60\x9e\xdf\xf9\x8f\x34\xf2\xc5\x6b\x56\x6f\x06\x16\x8f\x32\x42\x08\x44\xbb\x03\xf7\xe7\x11\x09\x7e\x90\x3b\x96\xc5\xad\x07\x0e\x5f\x4a\x79\xc2\xdc\x54\xfb\xd3\x0f\x8e\x4f\x7b\xc4\x29\x7d\xbe\x5d\xf6\x76\x3f\x3d\x03\x1e\x5d\x56\x75\x2c\x29\x06\xcd\x99\xba\x1c\x47\x2c\x7f\x0c\x82\x5a\xe6\x86\xf2\xf4\xfc\x30\x95\xb9\x12\x9b\xc1\xcc\x3e\xc3\xfe\x6f\x55\x5b\xd7\xb4\x8c\x0e\xbc\x83\x94\x09\x8c\xcf\x64\x35\x3a\xb8\x82\x9c\x26\xbc\x56\x00\xf7\x59\x14\x55\xe5\xc4\xd8\x22\xb6\x1e\x89\x10\x3f\x1d\x0b\xab\xf1\xcc\xc9\x4e\x33\xf7\x76\x42\x75\x1b\x3f\x33\x39\xbc\xd3\x45\x00\x98\x30\x71\xb6\x88\x63\x25\xe9\x03\x91\x0b\x93\x65\xca\x82\xab\xb7\xca\xfa\x41\x28\x0e\x07\xea\xef\xb4\x62\x6d\x84\xb4\x3a\x7d\xbd\x32\x9e\x2c\x8f\xb4\xc8\x68\x6a\x2c\x9b\x7f\x4d\x06\x59\xc6\xe3\x51\xc5\x5f\xc4\x16\xdf\x62\x6a\x32\x6f\x97\x59\x2f\xb9\xee\xc5\xdc\x64\x13\x02\x8f\x47\xfe\x75\x4c\x07\x13\xf4\x56\x40\xed\x39\x96\xcc\x1d\x51\x9a\xba\xa3\x21\x22\xe5\x7e\x4d\x73\x3b\x2a\x0a\x5c\xee\x3c\x65\x21\xc0\x47\x36\xb6\xda\xb1\xaa\x37\x0c\xc2\x9f\x16\xe5\x54\x15\x20\xb6\x46\x77\xd4\x91\xe0\xac\x1c\x0f\xfb\x45\x57\xdf\x4c\x50\xf9\x3b\x0f\xa0\xcb\xec\xa3\x3e\x67\x28\x0c\xee\xc2\x9a\x2e\xb4\x4a\x75\x61\x9c\xc0\x87\xdf\xf9\x70\x35\x65\x13\x1b\xdf\x7a\xa0\x89\xb5\x61\x1c\xaa\x0f\x60\x1d\x89\x9f\x6b\x1f\xd8\x69\x8b\xe0\xfa\xf0\xbe\x14\x94\xf0\xf2\xdb\xf4\xcc\x59\xc9\x4a\x7e\x09\x99\x89\xf9\x10\x06\x67\x66\xc9\x08\xb4\x9a\x73\x8b\x7e\xa4\x68\x6f\xb2\xa7\x24\x0a\x90\xf1\x3b\x48\x99\xcf\x18\xfc\xb0\x1f\x17\x9a\xf6\x03\x67\x74\xee\x60\x3c\x1e\x6f\xa6\x1c\xfc\xa4\xce\x8f\x1d\x0a\x91\x9c\x4e\xa5\xcf\xc9\x7d\xef\xdd\x17\x83\x3e\x8c\x6b\x50\xcf\xc3\x05\x5e\x16\x88\x7b\xc8\xe9\xe5\x38\x35\xe4\x3c\x3d\x9f\x77\x5d\x3f\x07\x3a\x49\x0e\x1d\xd6\x3b\x23\x55\x2f\xac\x2f\x55\xdd\xd9\xa8\x79\xcb\xf8\xab\xe6\x7c\x96\x29\xa1\x8b\xd1\x24\x20\x1b\xf5\xc1\x60\x40\xc2\x46\x35\x12\x5d\x81\xfc\x9b\xfe\x75\x91\x21\x9d\x52\xd7\xe3\x4f\x1c\xf1\x8f\x5a\xd4\x19\x83\x3e\x55\x63\x16\x8e\xc0\x3b\xe5\xa3\x7b\x59\x5a\x81\x9f\xc2\x67\x77\x31\x5d\x70\xae\x18\x2b\x42\x2b\x2b\x9d\x7a\xc4\xe5\x88\x9f\x2c\xbc\x3a\x72\xad\xbb\xe4\x04\x44\xf4\xc6\x87\xf7\x4e\xbe\x47\xe9\x69\x3f\x4c\x88\x03\x57\x5a\x64\xbe\x4a\x55\x4f\xd0\x60\xed\x73\xbc\x1b\x71\xfb\xa0\xda\x50\x0f\x74\x99\xd4\xda\x46\x3d\x94\x80\x65\x0c\xa5\x81\x9e\xd1\xc4\xbc\xee\xaa\xae\xd5\x30\x62\xf5\x54\x20\x8c\xcd\xf9\x44\xee\x8b\x3a\x6e\x74\x0a\xfc\xcf\x0e\x6b\xc4\x49\x91\xa8\x22\x94\xf4\x26\x24\xd0\x89\x36\x52\x9c\x4d\x99\x27\x50\x2e\x90\xbd\x5c\x85\xec\xda\xde\x3f\x3c\x5b\x03\xf3\xe2\x43\x0c\xaa\x2a\x5f\xe3\x96\x6f\xc6\x18\x4f\xf8\xfb\x6b\x2b\x05\xbf\x09\x6a\xc6\x21\xcc\x8e\x56\x0d\x56\x6a\x14\x6e\x53\x8d\x87\x82\x2f\x75\x66\x3d\x60\x64\x2b\x0e\x31\xce\x90\xa1\xbf\xa6\xca\x06\xda\x1f\x9d\x27\x55\xe8\x5e\x05\x6e\xe0\x6d\xf5\x87\x74\x84\x28\x1c\xd0\xb4\xb7\xd7\x2c\x58\x28\x07\x95\xe9\xf7\xea\x72\xc3\xfe\xd2\x81\x0d\x03\xfc\x75\x5a\x5d\xd0\xaf\x7a\xbb\x6b\x28\xf9\xf2\x73\xb5\x28\xc0\xd4\x8e\xd5\xf3\xc2\xdf\x40\x22\x9b\xc0\xf2\xbd\x7e\xf7\x74\xb1\x75\x47\x5e\xc3\x65\x50\x27\x06\xa6\xf1\x4e\x7d\xef\x97\xc4\x83\x24\xc0\x14\x45\x8e\x65\xba\xfa\xd3\x12\x06\x0b\xa9\x53\x82\xee\xbc\x29\xd4\xbb\x78\xc6\x2b\xdd\x23\x78\x62\x75\x47\x5e\x61\xc4\xb6\xaf\xab\x4f\x5f\x55\xa7\x72\x57\xea\x01\x55\xe1\x38\x6a\x56\x1f\xad\x3c\x53\xca\x31\x7d\xfa\x68\xeb\x7c\x65\xe7\x35\xc9\x30\xf4\xe8\x79\x54\x0d\xa0\x43\xb9\xb5\x4a\x12\x4c\xcc\xbf\xcf\xbd\xbe\x47\x3b\xb3\xc6\x92\xed\xf5\x42\x48\x3a\xd8\xda\xf8\x87\xf6\x62\x15\xae\x64\x91\xde\xb2\x2b\x10\xaa\x23\xb9\x24\x26\xeb\xa6\x5e\x02\xfc\x9c\xac\x30\x2f\xcb\x12\x77\x5c\x99\xdf\x90\xf7\xee\xdd\x98\x8e\x5c\xeb\x47\x21\xe9\xaa\x02\x3d\xcc\x1f\x06\x8f\x90\x7d\x34\xc7\xc7\xaf\xe7\x7e\xb7\x2b\x95\x6e\xab\xaa\x85\xc9\x08\xad\x3d\x7e\xee\xbf\xbf\x75\xdd\x09\x83\xbe\x14\x05\x06\x95\x0a\x10\x30\x0b\x56\x34\x88\x46\xdd\x6d\xc8\xe5\xaa\x7a\x39\x25\x33\x41\xf8\x75\xed\x04\x46\x89\xf4\xbb\xea\xe2\xc3\xa0\x17\x50\x1b\x11\xe0\x4b\x70\x21\xfc\x4c\x26\xae\x8c\x85\xc1\x40\xf0\x6b\x2d\xbf\xa8\x5b\xb5\x70\x4c\x89\x42\xe1\xb0\xcc\xcb\x30\x9f\x28\xf1\x47\xf0\xfd\x17\x60\xa7\xc5\x20\x7c\xd7\x9c\x7b\xbc\x61\xc2\x47\x53\x1b\x20\xc3\x1a\x20\x25\x57\xc4\x3c\xd5\x86\xac\xca\x34\x8d\x1b\x35\x03\x2d\x2c\x4c\x83\xfa\x4a\xc8\xd0\x3c\x1b\x73\x31\x32\x94\x4b\x3a\xf7\x51\x7c\xb6\xf8\x35\xf9\x9f\xf5\x51\x88\x36\x39\xbd\xa4\x39\xe1\x05\x0e\xb2\x81\xd7\x69\x5a\x6c\x81\x12\x34\xe4\xf1\x36\x49\xd4\x22\xa3\x4e\x8f\xaf\xe2\x15\xb4\x84\x63\x3a\xdf\xc4\x6f\x19\xe7\xa9\xe6\xfc\x00\x9b\xad\xad\x6c\xab\x9d\xba\x87\x6a\x2e\x05\xda\x5a\xfa\xa1\x97\x6e\x3c\xe7\xf3\x1d\xfe\xce\x4b\x1b\x4f\x76\x89\x46\x7c\x4e\x48\x35\x0f\x5c\x5e\xf8\x46\xcb\x4c\x1f\x28\x98\xbc\xbc\x1f\xf9\xd2\x49\xc5\x9b\x44\xef\x55\xec\x2e\xdf\x36\xb1\x9c\x20\xd0\x09\xe7\x18\xf6\xee\xf0\x3f\xcc\x75\xce\x72\x8c\x22\xd6\xfd\x18\x52\xef\x03\x44\x9f\xf2\x35\xcc\x6e\xc7\x96\x25\x42\x7e\xe4\xb1\xa3\x78\x05\x49\xf7\x9a\xaf\xef\x01\x53\x61\xcd\xac\x25\xb8\xbb\x79\xe8\x4a\xc5\x01\x29\x12\xb4\x5b\xe4\xbe\xe9\xc8\x6c\xf1\xa3\xb6\x56\x4f\xb2\x7a\xec\x28\x3e\xb9\x2a\x80\xe6\x51\xf5\x2c\x1f\x3a\x01\xea\x26\xb5\xaf\xda\xdb\x49\x5a\xbc\x21\x19\x4b\x8d\x67\xe0\xdb\xa4\x6e\x6b\x6f\xa1\xf9\xdd\x0f\x3c\x3a\x70\x02\xcf\xef\x86\xb9\xae\x53\x02\xdb\x1e\x7c\x47\x83\x7a\x1e\x0a\xbe\xa0\x0e\x15\x3b\x72\xa8\xa1\x4a\xbe\x9f\x52\x6b\x96\x2c\x1b\xa9\xfd\x9f\x6b\xdd\x7f\x81\x14\x88\x34\x27\xd4\x7f\x34\x87\x95\xbb\x2d\x94\x85\x04\x28\xfb\x63\xe5\xab\x65\x73\x0a\x17\x5c\x86\xee\xaf\xfe\x44\xd9\x7e\x16\x3c\xc6\x87\xb3\x4e\x27\xde\x04\x85\x8f\x4f\x28\x1b\xc4\xd8\xf8\xfb\x99\x94\xed\x2b\x1d\x27\xb4\xf1\x72\xa8\xaa\xd1\x18\x32\xd8\x3e\x6d\x61\x7c\x54\xe5\x2b\x5e\x2b\x94\x07\x31\x63\x72\x31\x81\xe5\x5d\x4e\x7e\x2a\xe6\x0b\xe3\xb7\x28\x42\x58\x01\x01\x71\x08\x8a\x8d\x7b\xca\xa1\xa7\xcf\x8f\x6a\xdd\x09\x40\x26\x62\x5b\x75\x91\xcb\x8e\xff\x69\x60\x78\xaa\xc3\xdc\x6f\x32\x52\x14\xbc\xd8\x1c\x3c\x7c\x55\xb9\x13\x93\x8c\xa4\x20\x0b\x62\x8b\xab\xbf\x37\xd6\xff\xc2\x1f\x10\xe9\x18\x38\x18\xd0\x35\x93\x85\x3b\x8f\x3a\x3e\xb2\x2f\xa6\x36\x09\xfb\xad\xf2\xc4\x74\x69\x4e\xca\x16\x9f\xa7\xba\xc9\xb0\xa6\x2e\xba\xfa\x33\x27\xad\x80\x49\x08\xa4\x0f\x5d\xe7\x4f\x84\xd2\xa2\xb7\xab\xda\x52\x8f\x1d\xe2\xc6\x88\x11\xf3\x53\xdd\x8d\x70\x60\x63\xea\x2b\xe0\xef\x9c\x82\x6a\xbb\x25\x1e\x74\xb9\xb7\x48\x2a\x3c\xed\x89\x3d\x96\x07\x9b\x53\x6a\x73\x68\x9b\x87\x09\x46\x3c\x3f\xab\x93\x4d\x1b\x51\x9e\xf5\x81\x1a\xbe\x23\xa1\xd7\x6a\x06\x9d\xc8\x95\x51\xfc\xdb\xea\x93\x1e\xc2\xef\xf6\x26\x72\x57\xaf\xa4\xf2\x31\x23\x6d\xc6\xf7\x7e\x3f\xee\xc7\xfd\x3d\xf2\xfd\x0b\x2f\x41\xa4\x24\x61\xc0\xac\xc6\xac\x6e\xef\x23\x49\xd0\x9b\x0d\xca\xbd\x4f\xd5\xdb\xa4\x58\x46\xda\x8d\xdb\xe1\xfb\x7e\x33\xb7\xde\x0e\xcd\x1d\x02\xe1\x6a\xc7\xc0\x7a\x18\x85\x1d\xd5\xef\xdb\x20\xfc\xf2\xf6\x7e\x58\x4b\x0a\x13\x31\xaa\x02\x03\xca\x77\x55\x6b\x2b\x3a\x89\xcd\xdc\x05\xdb\x32\x01\xfb\x69\x3d\xcc\x5d\x27\xd5\x7b\x2b\x1d\x6d\xb9\x86\x58\xbb\x93\x1c\x39\x77\x4d\xe5\xe0\xde\x38\xb6\xb8\x85\x92\x0d\x5f\x45\xc2\x55\x89\x3c\x02\x8e\xa5\xed\xae\x2d\xd6\xb3\x25\xaa\x95\xd2\x12\x8d\xab\xa2\xf9\x21\x2c\x2d\x0e\x6d\xe5\xd2\x3e\xff\x05\x2f\xd9\x7c\xe9\xe0\xa3\x08\x12\x32\x90\xcb\x66\xb3\x47\x14\x95\xd1\xe1\x7f\x1d\xf8\xca\x45\x56\x7d\x99\xe3\x22\x11\xb9\x7c\x5c\xf7\x68\xd7\xf6\x88\x81\xba\xfe\xda\xf7\x97\xfc\xf5\x4f\x28\x24\x19\x08\x0d\x5c\xda\x5b\x39\x39\x6a\x53\x13\xf0\xc5\x68\x72\x1b\xea\xd7\xfc\xd2\xf8\x33\xf7\xed\x47\xcf\xf9\x0b\x9c\xb6\x05\xe1\x89\x46\x05\xde\x2a\xb0\x53\xa7\xda\x77\x79\x41\x59\x0e\x58\x2b\x79\x49\x42\x76\xb4\xd4\x17\x81\xd2\x6f\xf8\x47\x3b\x4d\xf3\x6d\xa6\x2c\x47\xdd\x13\x10\x09\x74\xc1\xf4\xc7\xef\x7b\x8e\x52\xa4\x38\xbe\x1d\x83\xa1\xa6\xdf\x5a\x4e\xcf\xc7\xc6\x89\xb0\x1c\x6b\xe9\x42\xd4\xe5\x53\xe1\x3c\xe9\x5e\x01\xa9\xbd\xae\x6f\x3c\x05\x5c\x82\x12\x5f\x04\xe4\xae\x39\xfa\x31\x5f\xcd\x2d\xd1\x40\x82\x26\xdc\xb4\xbe\x15\x38\x1a\x8a\xf5\xf3\xb9\xca\xfc\xcd\x58\xfd\x13\x0f\x48\x3d\x83\x02\xf3\x3a\x0d\xae\xa9\x89\x81\xb5\xfe\x0e\x9a\xc5\x48\x99\x3a\x36\x0e\xc7\x5a\x3a\x93\x3e\xa3\x1d\x18\xc1\x67\x43\x53\x86\x84\x11\x1d\xec\x80\x63\x38\x38\x1e\x91\x5e\xaf\x16\xac\xdd\x30\xa1\xbb\xac\x4b\xd6\x76\xe8\x21\xdc\x2f\x6e\xd7\xc2\x2b\x22\xef\x83\x6c\xe4\x0f\x1f\xd4\xc1\x55\xe6\x91\xc7\xa1\xe8\x40\x55\x77\x15\xf8\xa1\x2e\x8f\x8d\x85\x82\xe8\x73\xe3\x83\x5b\x52\x06\x31\x37\xf3\x9a\xa4\xa4\x05\x13\xd8\x89\xdc\xf9\xe7\xe6\xc7\x30\x0e\x24\x35\x29\x5a\xe3\x2c\x8c\x6f\x94\x34\xbc\x10\xad\x85\x6d\x1d\x9a\xb5\xfe\x2b\x59\xdd\x37\xb9\x51\x7d\x7f\x17\xe4\xbf\x36\x65\x88\xb4\x38\x26\x26\xc8\xe8\xe2\x13\x2d\x6d\x62\x10\x63\x3d\x28\xdc\x82\x76\x49\x6f\x62\x62\x77\xc1\xb4\x5a\xed\x92\x5f\xaf\x41\x17\x18\xed\x7d\x38\xa8\xe0\x02\xa9\x9b\x92\xf9\xdc\xf6\x51\x3a\x05\x05\x44\xb4\x31\x97\xc1\x17\xa1\x9d\xc1\x7c\x5c\x38\xec\x5b\x27\xda\xc6\xb4\x62\x02\xe1\xea\xa0\x9c\x1c\x8d\x39\xf2\x02\xb4\x12\xf6\x0f\x54\x94\x64\x36\x87\xe6\x14\x5e\x4e\x45\x29\x0f\x8c\x83\xd5\xbb\x0f\x06\xe7\x08\x3b\xbe\x10\x03\xc0\x74\x15\x1f\xed\x92\xe1\x5e\xa4\x8f\x63\x07\x4d\x5b\x91\x72\xbf\xa6\xa2\xfa\x56\x3a\xd4\x3f\xfa\x6d\x22\x4d\xd5\x1e\x0a\xf1\x1d\xcd\xdf\x8f\xf6\x2f\x10\x01\x91\x16\x87\x86\x42\x04\xc2\x91\x59\x97\x85\x71\x7a\xb8\xfe\xd3\x4f\xb5\x3f\x5d\x1a\xbc\xd0\x88\x3a\xd9\xa2\x3a\xbf\x76\xba\x74\xac\xa3\x96\x49\xca\x87\x32\x5d\x40\x6a\xec\x65\xdd\x81\xef\xd6\xa5\x42\x56\x96\xbd\xed\x39\x2b\x52\x06\x99\xa1\x4e\xdb\x94\x00\x9b\x35\x74\x0a\x8c\x10\xca\x3e\x2c\x58\xbd\xd8\x90\x5e\x0d\x91\xf9\x95\x1a\x91\xd5\xc4\x2f\x1f\x62\x8a\x58\x9b\x62\xa6\xbc\xef\x24\x01\x97\x97\x04\xcf\x9e\xf7\xe2\x32\x99\xf4\x29\x1c\x27\x34\x03\x2b\xe4\x3a\xca\xb3\x3a\xcb\xc4\x8f\x67\x1d\x48\x49\x93\xda\x38\x2e\x07\xd1\xb5\xa6\x94\x61\x6e\xed\xf3\x38\x82\x19\xfe\x7e\xb4\x7f\x61\x1e\x88\x34\x4c\x00\x94\x3c\xf0\xd1\x5a\x18\xdf\x9e\x3c\x2e\x7e\xe3\xfc\xf3\xba\x28\xaa\x93\xb7\xb2\x26\x95\x23\xc8\xcd\xec\x28\x42\xcc\xa9\x7c\xfa\x98\x89\x0d\x46\x0e\x4c\x8b\x26\x68\xaa\xa4\xfc\x10\x78\xbd\xbf\x48\x9a\x08\xe9\xe4\xae\x5f\x1a\x7b\x6e\xbd\x7c\xda\xe6\x1e\x95\xe6\x22\x54\x8e\x77\xf9\x1e\x04\x7f\x55\xcc\x39\xa6\x65\x07\xf8\x79\xcb\x6f\x4d\x4b\xea\x73\xd9\x9e\x5f\xf8\x9a\xaa\xa0\x35\x07\x5d\xcb\x62\x46\xec\xa3\x43\x61\x03\xa6\xc3\x3b\x78\x7f\xba\xc5\x93\x8a\x85\x1c\x56\xde\x6b\x54\x24\x9b\x8b\x84\x61\xf3\xc2\x9d\xcf\xa3\x86\xb3\xa0\xce\xf2\xd5\x1c\x32\xfe\x75\xed\x9f\x18\x4d\x5a\x1c\x0e\x06\xd4\xaf\xd2\xc3\xd2\x59\xe6\x4f\xa1\xcc\x75\x5e\x9b\x54\x17\xc3\x7e\x11\x0f\x23\x78\xa4\xa7\x0c\x79\x4f\x5c\xe6\xe5\xb1\x9a\xd5\x6a\x00\x96\x34\x05\x48\x0c\x87\x2a\xdc\xd0\x3f\xa3\x94\x4f\xc4\x3b\x1c\x17\x4a\xd1\x5c\x17\x29\xc6\x10\xa9\xa4\xa9\xe0\x8a\xc9\xeb\x18\x19\x02\x19\x73\xfa\xf8\xfd\x37\x23\x0d\xdf\xf2\x63\x58\xf6\x5b\x60\xb2\xee\xc2\x49\xba\xdf\x43\xfd\x9c\x37\xc7\x0c\x66\x12\xad\x4b\x31\x4b\x50\x01\x19\x4a\x62\xab\xad\x3b\xc1\xc4\x36\xe9\x41\x0b\xa7\x6f\xd3\x4f\xa1\xe7\xf5\xd6\xe0\x2d\x34\x9c\x90\x53\xca\x87\x9e\x7d\x66\x59\x5b\xf9\xeb\xda\x3f\x41\x95\x34\x0d\x94\x34\xb8\xf7\xc1\x90\xed\xab\xba\x94\xd5\x38\xfd\x36\x65\x7d\x17\xcb\x87\x8c\x5e\x79\x05\x8f\x8d\x5a\x09\xf5\x42\x40\x2d\x5a\x76\xaa\x37\x64\x1d\x98\x04\xa9\x7d\xa7\x54\x28\xc2\x50\xaf\x8a\xf0\x8b\x58\xa2\x0f\xa4\x2f\xa5\xcf\xbe\xdb\x78\x22\x54\xa2\xd1\x90\x94\xf8\x1c\xb5\x2a\x83\xb7\x69\x09\xae\xd6\x74\xf2\x92\x14\xda\x06\xbd\x47\xc1\x96\xf4\x6f\x83\x4f\xf7\x1c\x3e\xb0\x65\x86\xed\x4e\x32\x9e\xb4\xbd\xf7\x78\xd8\x00\xd9\x75\x4d\x65\x82\x5a\xa4\x28\x84\xf4\x2d\xdd\x2e\x69\x8c\x2b\xa9\x9b\x64\xef\x98\x88\x26\x42\xcc\xa2\x15\x7a\xdb\xd8\x6f\x24\x4e\xfe\x2e\xb5\x7f\x41\x2b\x88\x34\x1c\x26\x14\x26\xb0\xd4\x7c\xcf\x5a\x3f\x8a\x5e\xbc\x2a\x83\x76\x4f\x96\xd4\xcf\xe9\x3b\x71\x52\xdb\xe4\x72\xc0\x58\x71\xfa\x29\x73\xf6\xc3\xb3\xe0\x79\x2d\x78\x9f\x8b\x01\xeb\x05\xab\xf3\x79\x9e\xc9\x1e\xaf\x19\x7d\xe0\x60\x77\xc1\x7b\x1a\x82\x2b\x29\xc1\x91\x7e\xfb\x3e\x42\xb0\x73\x05\x50\x8f\x87\xe0\x74\x37\x2a\x97\x28\xd1\xa5\x1e\x97\xd3\xee\xa1\x87\xa8\x37\xf1\x2b\x76\x76\x5f\xe3\x29\x0f\xda\x6a\xfd\x2e\x4d\xf3\x05\x77\xb4\x01\x63\xfb\x52\x49\x16\xad\xc0\x00\x69\xe1\x9e\xeb\x55\x2d\xf5\x6f\x35\x0b\xed\xd6\xee\xeb\x73\x05\x07\xbf\x15\xc2\x11\xae\x33\xff\x96\xf4\xfe\x0b\x09\x42\xa4\xc5\x03\x60\x82\x81\x74\xb6\xe0\x4f\x0b\xea\x64\x61\x8f\x8e\xb4\x68\x55\xcf\x0e\x9b\xcb\xf1\x87\xa6\xb6\xc1\xfe\x4a\xec\xaf\x6d\x76\x4a\x02\xb3\x3f\x88\x42\x80\x49\x9c\xeb\xd3\xf3\xff\x48\xf6\xcf\xae\x11\x98\xc2\xb0\x18\x3e\xd5\xbc\x78\x73\x72\xac\x32\x51\xb2\xbf\xb4\xfd\xc3\x35\xe1\x2e\x0c\x44\x21\xc2\x83\x3a\x7d\xf4\xaa\xa5\xef\x53\x68\x8c\xd2\xf7\x38\x67\x7e\xaf\x4c\x1d\x47\x24\xac\x94\x0b\x9d\xe7\x23\xb1\x0a\xbe\x92\x04\x6b\x12\x77\x31\xd7\x6b\xda\x0b\x85\xae\xbd\x5b\x32\x5c\x3e\xdd\xea\x2f\xb7\x47\xed\x3c\xf6\x4b\x1a\x15\xfb\x4d\x7b\xac\x79\xca\x5d\x96\x83\x77\x0a\x2c\x8c\x55\xd2\x44\xe6\x0a\x1a\xc2\x88\x75\x68\x1c\x3c\x88\xee\x9a\x93\xdc\x9a\xf1\xb6\x93\x9b\x1c\x1f\xde\xf3\xf8\xe1\x1e\x5c\x06\xc3\xfe\xef\x90\x2b\x44\x1a\x11\xe6\x63\x30\x90\xc5\xb4\x40\x60\x3d\x1b\xbe\xb5\x4b\xbd\xfb\x29\x08\x77\x82\x30\x87\x7d\xe9\xff\x28\x2c\xb1\xd6\xca\x81\x53\xc8\x8a\xcd\x67\x1c\x1e\x0b\x56\xad\x91\x66\x4c\xbb\xcf\x08\xee\xd3\x09\x32\xc4\x24\x5d\x1e\x62\xf7\x1b\x45\x28\x22\xfb\x84\x8d\x3b\xb2\xae\x99\xad\x97\xa8\xdf\x01\xa1\x50\xf9\x2c\x7a\x41\xb1\x89\x1c\xbe\x3d\x91\x26\xe1\x97\x0e\xac\x50\x26\x13\x3c\xc3\x34\xaa\x17\xbe\x79\x29\x1d\x55\xb6\x68\x22\xc0\x00\x6f\x4b\xe5\x63\x4d\xa7\xe8\xa6\x73\xc6\xbc\xb9\x7a\xf7\xeb\xde\x26\x34\x55\xbd\x80\x30\xb4\x70\xe3\x95\xb2\xd0\xf8\xf0\x89\xac\x11\xf0\x7c\xc7\x84\x4e\x0c\xc3\x52\x81\xc8\xbb\x33\x4a\x65\x37\xce\x61\x3b\x6f\xba\x81\x73\xef\x00\x46\x16\xd2\x5d\xa9\x0f\x5b\xcd\xed\x4a\xe0\x07\xc3\x31\x24\x75\x8c\x2d\xdf\x6b\xda\x82\x1d\x1c\x60\xef\xe7\x87\x8d\x8b\xd5\x84\xa7\xa7\x77\x99\x87\x6f\xc5\x22\x9f\xd0\x07\xbd\x92\x84\x5e\xd6\x2c\x8e\x9d\x7a\x13\xf8\x02\xcd\x85\xf1\xdb\x3b\x0f\xba\x37\x1e\x4d\x3d\x2f\x97\x99\x67\xce\x45\x46\xb5\xa0\xf9\xc0\x09\x14\x14\x4c\x4d\xe4\x88\xe5\xfb\x65\xf4\x98\x7c\xda\xda\xd6\x9d\xc6\xfb\x53\x52\xe7\xaf\x76\x4e\x26\x9f\x5c\xb8\xf1\xbb\xae\xc8\xe0\xf2\x2b\xd6\xff\x31\xe4\xe2\x84\xd1\x65\xbc\x6a\x50\x64\xfd\xa2\x83\x2a\xf2\x0b\x49\x1e\x03\x81\x1d\xbb\x19\x0a\xbf\x9b\x35\xe6\x0d\x32\x4d\xac\xf8\xcb\xff\xc9\x77\x3e\x25\x12\x58\x87\x6d\xcc\x71\xf4\xaa\x7c\xf8\x7a\x7d\xbc\xee\xe0\x9a\x9e\x63\xae\x54\xcb\xe8\x5c\xff\xd9\x08\xe2\x0a\xce\xc1\xbb\xfa\x02\x74\xed\x53\xb1\xe4\xed\xd8\x4d\x85\xbe\x92\xe6\x9a\x67\x67\x08\x78\x29\x75\xf8\xc7\x66\x3f\x25\xe8\x28\xb1\x45\xab\xc9\x17\x21\xbe\x7b\x05\xa0\x64\xa8\xbf\xa7\x89\xf8\xad\xaf\x17\xcb\x79\x26\x1c\xf6\x91\x9b\x50\xde\xbb\xfa\xd1\x67\x81\xfe\xfb\x95\x28\xd3\x51\x2d\x79\x3e\xa8\x75\xd1\x58\x72\xc9\x85\xb6\x15\xc7\x27\xfb\x2b\x9d\x20\xb5\xe8\x02\x95\x34\x5a\xc5\x88\x48\xec\xcf\x77\x65\x6d\x7f\xa4\xcb\xb2\x78\xf0\x7a\x8b\xaa\xbc\x21\x14\xb7\xe1\x68\x3d\x5b\xd5\x71\x9e\x79\xc7\x45\xee\x35\xa1\xf7\xab\x20\xd8\xc7\x4a\x8c\xb0\xcb\x57\xd4\x7a\xfb\x97\x80\x29\xfb\xae\x8e\xc3\x91\xaf\xcb\xef\xec\x62\x2a\xbd\xd3\x59\x1a\x49\x07\x19\x46\xe8\xdb\xd0\x3d\x75\xd1\xa6\xac\x48\xdc\xd5\x37\xa0\x5a\xd2\xdb\xf3\x77\x73\x42\xfb\xf7\x69\x47\xbb\x77\x3a\xd7\x15\x04\x15\x52\x32\xba\xee\xb0\x28\xc4\xa4\x75\xb3\xee\x12\x38\x3f\xb8\x5e\x3e\x79\x35\x9e\xe4\x35\x25\x95\x38\xdd\x36\xc2\x5c\xb5\xd4\x68\xa8\x75\x5a\x7d\xc9\xce\xfd\x8b\x91\x97\x52\x57\xd2\xf2\xdb\x17\x23\xfa\x3b\xf0\x1c\xe7\xd4\xa2\xf6\x73\x0c\x82\xd5\x8e\x83\x61\xc5\x37\x4f\xb2\x48\x59\xa0\x95\x5d\x8b\x4c\x24\xc5\xcb\xdb\x40\x7a\xd1\xfc\xbd\xda\x06\x30\xdd\x2d\x72\x2d\x6f\x72\xfb\x5e\xc5\x58\xba\xc5\xc8\x21\xe1\xd5\xd3\x86\xf0\x7d\xa3\x98\xf8\x81\x14\xa7\x82\xf9\x47\x17\xe9\x2a\xc6\xd3\xa7\xe2\xa6\xa8\x16\xb9\xad\xdc\x6a\xde\x83\xe7\x56\xab\x66\x37\xd1\xe6\x76\x3d\x74\x31\x5c\x2f\x6a\x0c\x92\x9f\x55\x23\x0f\x59\x00\x14\xb0\x13\xf3\x4e\x55\x98\x84\x2a\x98\xb2\xcb\x7f\x33\xec\x11\x88\xc1\x1b\x9d\x9d\xd2\xee\x7f\x7e\x54\x5d\x0d\x30\xca\x75\x49\x0f\xab\x7c\xb2\x1c\x40\xc1\xba\x3d\x41\xbf\x60\xd6\x8a\x6e\x41\xfd\xc5\x92\xc4\x44\x80\xd2\x89\xd0\x6b\x49\x75\x08\x6f\x6e\xb3\x73\xae\x26\xda\x04\xa4\x9c\x78\x9c\x7e\xab\x73\x92\x3f\x2f\x72\x31\xd2\xa3\x39\xdd\x5d\x63\x09\x0a\x7c\xd0\x22\xc2\xee\x13\xbb\x66\x87\xae\xed\xa1\x98\x7c\xf6\x34\x28\x6f\x0b\x01\x3f\x92\x29\x77\x88\x4e\xd7\x3e\xed\xe0\x3b\x46\x2b\x3f\x5d\x45\xdc\xc6\xcf\xa7\x9b\xe5\x5f\x73\x7b\x56\x7d\x86\x81\x3e\x01\xd7\x45\x46\x35\x6b\x6f\xe8\xda\x8d\xb9\x56\xf4\x53\xb8\x9e\x1b\x3e\xd6\x87\xd3\x48\x45\xae\x97\x50\xab\x79\xdd\xaf\xbf\xa2\xbe\x01\xdf\xe9\xf9\x12\x9b\xc3\x72\xc4\x70\x5b\x7a\xb4\xf1\xa9\xc3\x8e\x21\xa6\x3e\xcd\xed\x8e\x2e\x7b\x3f\x6f\x97\xcc\xc4\xf1\xca\x0b\x29\xa6\xa7\xcf\x9f\x93\x90\x6b\x69\x4e\x29\xfa\xec\x25\xb6\x68\xbf\xd9\xf2\xed\x97\x1c\xf6\x55\x7f\xd4\x8e\x8c\xd7\x10\xa6\x38\xe6\x67\x3b\x1e\x52\x40\xa4\x90\x6b\xbc\x6b\xe5\xfc\xa0\xef\xd7\x7f\xeb\x3d\x54\x5e\xe6\x4f\x6b\xe9\xca\x50\xee\x70\x77\xe0\x42\xf0\x9b\x82\xee\x87\x46\x3b\x48\x9c\xcc\x9b\xb8\x57\x0d\xf7\x8f\x8b\x64\xb6\x57\x17\x22\xbd\x44\xf8\x90\x62\x51\x45\x31\xaf\x7a\xd0\xed\x8b\xcb\xe2\x4d\xb0\x99\x0f\x70\x10\x0a\xf8\xce\x0f\xca\xd7\x06\x08\xf2\x5f\x64\x7f\x13\x9a\x38\x0e\x46\x34\x5a\x45\x19\x1f\xf8\x43\x83\x9b\x9d\x4d\xc3\x99\x4b\x00\xb6\x62\x7f\xe7\x9d\xbd\xe0\xa1\x24\x5c\x83\x92\x2f\x5c\xf5\xc9\x88\xd1\xb1\x76\x37\xe5\xd9\x9b\x5e\x5a\x24\xce\x95\x90\x42\xe4\x75\xa3\xe9\xa7\x41\xeb\xef\xb0\x77\x74\x8a\xea\x78\x88\x47\x03\xaa\x74\xb8\xcc\xa8\xf0\xb4\x5f\xb6\xfd\x74\x7a\xe9\x56\xf8\x1b\xaf\xd3\x8e\xe3\x45\xe1\x7f\xc8\x63\xcb\xbe\x45\x58\x6a\x12\xc5\x2f\xce\x94\x15\xc6\xa5\x04\x14\x5e\x8f\x2d\xf2\x1a\x6f\xcf\x55\xff\x2a\x50\xc0\xf6\xd9\xea\x95\x02\x4c\x6f\x28\xa4\xb0\x18\xa0\x08\x79\xb4\xeb\x73\x65\x06\x51\xf0\xca\x4e\x8c\xe7\xa9\x3b\x71\x1c\xc2\x13\xdb\x0b\x38\x32\xc5\xa1\x6a\x01\x76\x07\x29\x1b\xab\xe5\x10\xdd\xee\xbe\x6f\x14\xb3\xef\xaa\x26\xf5\x67\x15\x8a\x7e\x8f\x23\x43\xf1\x62\x27\x92\xee\x6a\xb5\x52\x0c\xe0\xad\xe6\x70\xe9\x61\xe1\xdc\xe5\x60\xe9\x1e\xd2\xa3\xa4\xce\x9e\xbc\xf9\xd3\x31\x07\xc5\x87\x94\xcb\xf5\xce\x88\xff\x36\xf5\xa5\x69\xc5\x7f\x9a\x56\x8e\x23\x64\x9b\x7b\x0a\xff\xa1\x96\x77\x81\x8b\x1b\xc3\x7e\xbf\x14\x4d\xe1\xc3\xcb\x33\x62\xa2\x12\x9f\xd2\xcc\x45\x42\xe5\x02\x24\x52\x39\xe1\x48\xb3\xde\xe7\x93\xf8\x51\x35\x20\x04\x7e\x1c\x4d\x34\x74\x8d\xb4\x18\xab\x80\x4b\x52\xc0\x8f\xf7\x38\xfb\xcd\x02\xf4\x62\x4c\x72\x1c\x2b\x67\x21\xc0\x99\xe3\x84\xa2\x1f\x4a\x7c\x6d\xce\xce\x88\x3d\x1d\x72\xb1\xae\x88\x9f\xb1\x2c\xc3\x7f\xf0\x29\x0e\xac\x5d\x6e\xfe\xb9\x61\x34\x01\xe5\xf5\xfa\x63\xf9\x64\x34\x85\x7d\x55\x97\x3c\x5f\xc3\xce\x57\x15\x19\xa3\xcf\xb3\x9f\x15\x97\xd8\x35\xfe\x80\x53\xdd\xc7\xa0\x66\x5c\x8d\xe8\x6c\x8c\xae\x71\xf2\x79\x3e\x18\x79\x25\x47\x1a\x69\x80\x15\xfe\xcb\xe7\x00\x25\xfc\x5a\xb9\xf9\x60\x0e\xa0\xaf\xdd\x8f\xa7\x30\x11\xf8\x87\x2c\x07\x91\xfc\x76\x0d\xe8\xba\x54\x4e\x8d\x0b\xd3\xc5\xf8\xdc\xf4\xfb\x85\x48\x75\xa9\x45\x05\xf0\x57\x9d\x6e\x7e\x3c\x69\x0e\x64\x77\xca\x41\x81\x96\x84\x12\x76\xa0\x7b\xd5\x9e\xda\x7b\xc3\x5e\x5c\xea\x6d\x67\x94\x81\xf4\xc7\x1a\x48\x64\x6d\x39\x47\x1f\x14\x15\xb2\x58\x55\xf5\xf2\xa4\x59\x3c\xd0\xd2\x5f\x59\x47\x92\xe4\xff\x81\xa6\x26\xd8\xba\xbf\xcc\xe6\xf7\xe3\x04\x67\x2a\x6b\x6a\xa9\x50\xea\x1c\x3a\x10\x2b\xf5\xdd\x1b\x6f\xad\xae\xaf\xd9\x3e\x70\xdf\xa0\x51\x9c\xff\xc6\xd7\x9f\xa7\x10\x13\xd9\xf4\x69\xa6\x96\x32\x89\x31\x70\xa6\x1b\xf5\xf4\x87\xb3\x79\x47\x0f\x61\x51\xc4\x16\x66\x74\xa2\x3b\x32\xbf\xa9\xe8\xdb\x17\x70\xc5\xec\x00\x11\x76\xbf\xa1\x45\x63\x9a\xeb\x91\x1b\xac\xaf\xef\xe8\xe3\x88\x38\xa6\x27\xb1\x09\x55\x5c\xc5\x87\x29\xa6\x07\x42\xf4\x09\xeb\x6a\x08\x81\xba\x31\x14\x7c\x4c\x51\x97\xfc\xbb\x90\x1f\x1f\xfd\xb6\xfe\x48\xc6\xad\x97\x6a\x7d\x1b\xbd\x52\xf4\xdc\x7a\x7f\x97\x24\x71\x5d\x72\x04\xfc\x54\x5e\xd8\xf3\xc8\x8d\x4f\x7a\xe7\x30\xe0\x6f\x96\xec\xaf\x7f\xf1\xa8\x37\xf6\xd9\x31\xc6\x77\x7e\xb0\xa9\x42\xcf\x73\xe7\x61\x0b\x05\xb6\x9f\xb3\x86\x17\xb1\x8f\x9b\x2e\x4b\xf4\xf1\x6a\xa1\xe1\x78\x1c\x61\x33\x70\x08\xc9\x32\xca\xc3\x53\xd5\x63\x03\xd9\x21\x4d\x00\xcb\xd3\xb5\x6d\x43\xd8\x86\x66\x02\x17\x7d\x9f\x51\x44\x6b\x66\x85\xa2\x4b\xc0\x88\x1a\xd3\x6e\x6c\x1f\xc3\xfe\xf3\xd7\x88\x6c\xd6\x19\x60\xf9\x61\x75\xf9\xd1\xad\x0e\xe0\x25\xed\x90\x31\x36\x6c\xbf\x46\x97\xc9\x17\xab\x38\xfc\x16\x63\xca\x43\xe6\xab\x34\x56\x2e\xa1\xe0\x01\xd4\x61\xbe\xa2\xca\x2d\x9c\xcb\x62\x5c\x73\xe8\x5a\x87\x79\x85\xd8\x33\xc7\x70\xd3\x20\x58\x34\xee\xce\x95\x5a\x6d\x3a\x6a\xf8\x53\x10\x08\xa9\x25\xe7\x98\x8f\x62\xdc\xc4\xe8\x04\x78\x6f\x4f\x9d\xc3\xad\xed\x9f\xdf\x18\x16\xba\x9b\x95\x5b\xb0\x95\xbf\xd2\x43\x30\x50\xa2\x05\xcb\xa5\xd5\x50\x31\x13\x07\xfa\x04\x3b\x6d\x68\x94\xd6\xf4\xaa\x3f\x3a\x2b\x34\xd4\xc3\x2f\x28\x92\xbe\x3a\x21\xbb\xe8\x77\xb6\x0d\x04\xdc\x67\x23\x66\x1f\xeb\xd9\x3d\x77\xf5\x90\xfc\x73\x9a\x3c\x33\x1d\x5d\xbe\x49\xf2\x73\xde\x9c\x41\xf3\xc0\x3a\x47\x63\x18\x07\xa0\x6e\xaa\x43\xda\x8e\x54\x94\xa9\x28\xb4\x34\x43\x50\x0f\x32\x59\x47\x84\xf3\x86\x23\xdd\xd6\xb0\xea\xc9\xcb\xdf\x58\xd3\xa1\x7a\xe3\x01\xee\x3f\x57\xec\x79\xe5\xaa\xf9\x55\x4d\x4a\xa4\xb8\xb8\x51\x34\x8f\x82\x6c\x5c\x25\xc7\xaf\x8e\x13\x29\xcb\xd3\x3a\x70\x32\xb0\xfd\xeb\xd3\xa0\x41\x73\x8f\x06\x35\xbf\x3e\xe2\x05\x70\x8b\xdc\xed\xd9\xa4\xca\x3d\x12\x51\x79\x5d\x57\xc4\x9c\x6f\x95\xc7\xf8\x6d\xad\x89\x15\x80\xc1\x17\x43\xec\x37\x2f\x1d\xb2\xf9\xe7\x9d\xfe\xd5\xb5\x99\x82\xde\xdd\x5b\x67\xf2\xd9\xed\x68\x33\x41\x84\x21\x99\x54\x6b\xc7\x89\xb3\x27\xf7\x8d\xd7\x15\x0d\x3c\x15\x87\x5f\x96\x46\xc6\xa3\x7a\xdc\x1c\xde\xe4\xcf\x12\x7e\x27\x27\xfd\x40\x6e\xbe\x49\x4a\xa7\xc6\x93\x08\x5c\xe7\xbf\xd5\xb7\xa0\xbf\x0a\x23\x6d\xe6\xd5\x19\x20\x23\x31\x37\x0a\x0f\x6c\x16\x70\x09\xbe\x52\x1a\x8d\xfd\x30\xb9\xac\xc6\xd5\x1b\xf0\x64\xd9\x54\x69\xd6\xc4\xd5\xdf\xbc\xa6\x82\x24\x51\xf1\xa5\x45\x3d\x36\xd2\x42\xde\xb0\x56\x56\x61\x50\xfa\x9b\x65\xfe\xd8\xf3\x99\xeb\xbf\xc5\x07\xff\xda\xa3\x21\xd2\xa8\x98\xff\xa1\xc6\x14\x51\xce\x08\x2f\x5a\xa8\xf5\x5b\x5b\x96\xff\x1e\x41\xe5\xc5\x7f\xee\x48\x49\x90\x94\x9c\xca\x9e\xdf\x12\xc7\xe5\xf9\x32\x52\x0c\x78\xb1\xc1\x85\xe4\x3e\x6e\x81\x65\xec\x6f\x62\x27\xb3\x71\x79\xdc\xeb\xa9\x64\x5a\xde\xf7\x5d\x49\xdb\xdf\x87\x07\x5e\xcd\xcd\xdd\x02\xc2\x96\x59\xe8\xde\x6a\xdf\x85\x43\xf9\x79\x68\x7a\xda\x14\xf9\xb0\x54\x82\x97\x4e\x52\x06\xd5\x1c\x14\xd1\xe1\xa2\x7c\xf7\x86\x5f\x15\x03\x71\x25\x46\x8a\x73\xf3\xac\xd3\xba\xa1\x4c\x7d\x8f\x13\x76\x68\x52\x6b\xa5\x80\x09\x87\x87\xb3\x2d\x38\x86\xbb\x11\x2b\xf1\x66\x08\x0f\x30\xad\xd3\x5d\x27\x8a\xf4\x27\xbc\x8f\x45\x7e\xf8\x22\xdd\xd9\xa8\xeb\xf6\xc2\xb0\xff\xcf\xda\xe2\x79\x3a\xe9\x1c\xad\xda\xb7\xd9\xb6\xbf\x24\x9a\x7f\xa1\x0f\x88\x24\x49\x00\xf8\x0a\x4e\x8b\xdb\xf8\x85\x0a\xdb\x44\x0f\x2e\xd1\x50\x2b\xa9\xdc\x5b\xc4\xd3\xec\x1a\xd8\xf1\x76\xa2\xe4\x17\xcb\x09\xcc\x56\xc0\x8a\xa8\x20\x56\x8d\xe3\xc0\xcf\xb4\xf5\x48\xd2\x27\xae\x96\x81\x91\xce\x46\xd7\x8f\x89\x62\x36\xcd\x51\x34\xaa\x0f\x6c\x24\x7b\x0d\xa0\xf4\x5c\x1e\x2f\x5a\xd1\xc7\x58\x88\xc8\xc1\x92\x89\x0b\x9b\xd8\x84\xeb\xed\x1f\x07\x75\xd3\x40\x45\x4d\xe5\xb6\x71\x64\xb9\xd3\xc6\xd7\x80\x29\xb5\x8e\x6e\x44\x77\x8a\x5f\x3c\x89\xa1\xe2\x76\x73\x0c\xf2\xd2\x91\xfd\x8b\x0f\x33\xd0\x1d\x31\x78\xc8\xe5\x39\x73\x93\x69\x3d\x7f\x1d\xfb\x17\x5a\x80\x48\xc2\xd0\x01\x8e\xdd\x3d\x0b\x5f\x3a\x5f\xc0\x17\xf6\xf0\xeb\x33\xa8\x89\x7b\x8c\x4c\xf8\x92\x2d\xee\x77\x8e\x9d\x97\x61\xac\xf7\x8b\xfc\x84\x00\xcc\x8f\x27\x7e\xb9\x45\x3b\x54\x51\x83\xce\xab\x1d\x94\x85\x4c\xb4\xb0\x54\x3e\x10\xe5\x52\x94\x1d\xd0\x69\xd6\xb7\xce\x16\x5e\x8e\x82\xe2\x8e\xb2\xf4\x4c\x3f\x45\x2d\x5f\x06\xd3\x07\xc2\x7a\xb4\x27\xa9\x6c\xec\x4e\x64\x79\x93\x19\x50\x37\xc4\x0c\x5d\x33\xd8\x1e\x4a\xa2\x03\xa6\x0f\xfa\x42\xa8\xab\x46\xaa\xf5\x73\x68\x1d\x6c\x1c\xb8\xf7\xc9\x3a\x6d\x90\x10\x7c\xf3\x04\x8d\x19\x91\x20\x46\x97\x9d\xd6\xd1\xcb\x19\x98\xff\xdd\xde\x0e\x91\xa2\x86\x32\x05\x4f\x9b\xed\xf7\xcc\x8d\xbf\xb4\x63\xb2\xba\x7e\xf6\xa2\x87\x09\x25\xe6\x52\x42\xb0\xf5\x56\xf8\xc6\x3f\xa7\xf2\xd2\x98\x7f\x5e\x07\xf3\x66\xe9\x03\x69\x9b\x49\x7c\xc8\x82\x31\x0f\xdf\x05\x88\xfa\xc9\x6f\xe9\xc6\xcc\xe5\xbd\x7c\xb1\xc9\xa9\x85\xbf\x5e\xe8\x75\x42\x92\x81\x00\x67\x80\xbe\x62\x79\x23\x57\xb4\xdf\x4f\xe6\xf3\xe9\xdc\x87\x88\x59\x46\x0d\xee\xf0\x03\x6a\x56\x9c\xc2\x8e\x03\x11\xfd\xe0\x39\xd0\x09\x4b\x8d\x99\x91\x9b\xe3\x46\xfa\x79\xab\xa6\x34\x8b\xa8\x7a\x8b\x3e\xae\xcd\x05\xc7\xb2\x56\xfe\x23\x07\x5d\xd5\x54\xec\xce\xe7\xdf\xc0\xa0\xd5\xf3\x2f\x3e\x84\xdd\x40\x6b\x24\xc0\x56\x6f\xa3\x65\x29\x1c\x2e\xb2\x86\x7b\x73\x44\x76\xa4\xbe\x11\xdc\xba\xef\xd1\xa2\x8c\x07\x74\xfa\xa2\x63\x7d\xf8\x45\x96\xd1\xef\xd2\x75\x8d\x08\x8f\x60\xa5\xa7\x13\x3c\x19\x6a\xbf\x7f\x7a\x1d\x45\xba\xc0\x3f\x4c\x54\xa2\x0f\x38\x55\xaa\xe1\xf7\x2a\x85\x9c\x95\x0c\xeb\x5b\x6b\xdf\xd0\x0c\xf4\x9f\x49\x27\xa3\x77\x1e\x0a\xf6\x7d\x99\x97\xea\x6d\xa1\x15\x7d\xb8\x7f\x93\x2f\xff\x42\x42\x10\x69\x18\x28\x28\x4e\x20\x66\xe8\x4d\xb9\x94\x2a\xd1\x5f\xc2\x87\xcb\x3c\xa7\x82\x3a\x3d\x54\x6f\x8d\x5a\xd9\x1b\xca\xd0\x35\xea\xf2\xc2\x2a\x2a\x9d\x40\xd3\x00\x26\x61\xe3\x90\x3e\xf5\x90\x4c\x86\x57\x62\x5b\x7c\x32\xe1\x36\x7b\x40\xf7\x5e\x43\x91\x34\x6e\x3e\x6f\x25\x82\xc0\x27\x06\xae\x0f\x14\xe5\x42\xdb\x75\xfb\xf3\xcd\xba\x96\x5d\x27\x44\x5a\xe4\xda\x43\x97\xfa\xa0\x35\x52\x66\x02\x46\x4a\xeb\x05\xb7\x75\x2f\xfd\xb8\x2e\xc8\x4e\xaa\xc8\x2b\xb7\x58\x3e\x1d\x4f\x9f\x8a\xc4\x5f\x13\xc0\xdd\xab\xc6\xeb\x34\x81\x3a\xd2\xf8\x08\x89\xe5\xe5\x25\xc6\xaf\x2a\x2d\xfd\x2b\x60\xfa\x4f\x8c\x25\x0d\x4d\xd1\x1f\x00\x08\x98\xc2\x47\x6b\x30\xec\xdf\x70\x13\x3a\x96\xc5\x7d\xac\x52\xca\x85\x19\xcc\x30\x50\x6f\xfc\x69\x58\x48\xbc\xa7\x19\x7d\x6e\xfd\x13\xcc\x3b\x0c\xa0\x9b\x7c\x67\x4b\x60\xeb\xed\x85\x42\xb8\x29\x0c\xe9\x35\x5a\x1b\xa2\xb0\x32\x9d\xab\x41\xc7\x71\xb9\xda\x64\xc5\xec\xa3\x04\x4c\x5b\xaf\x0f\x49\xab\x61\x77\x93\x24\x8e\x5c\xf5\x28\x18\xf6\x04\xe2\x23\xf4\x33\x8f\x52\x3e\x31\xc7\x23\x28\x65\x6a\xb5\x93\x80\x8a\xfe\x7d\xd7\xfb\x1b\x8c\x35\xad\xb4\x4c\xd6\x53\x87\xaf\xf3\x93\xae\x3f\xe9\x3a\x55\x25\x6e\xfb\x1a\x4f\xf7\x37\x58\x06\xeb\x17\x80\x04\xd6\x0e\xff\x6a\x66\x45\xbc\x33\xc6\x39\x65\xe2\xbc\xd4\xd6\x1c\xab\x29\xde\xed\xf8\x4e\xe7\x82\x88\x2e\x02\xbd\x68\x76\x22\x25\x90\x16\xfb\x69\xde\xbc\xcf\xd7\x96\x84\xeb\xb1\x52\xf7\xf5\x7d\x6d\xda\xb5\x15\x92\x76\x67\x16\x21\xae\xdf\xe2\xa8\x76\x5d\x82\x15\xcc\xc8\xdf\x58\xf8\x17\xd2\x83\x48\x43\x43\xc1\xb0\x03\xb1\xb0\x33\xfc\xce\x89\x09\x2d\xa6\x75\xae\x5d\xe7\xf3\x14\xe1\xf3\x96\x64\x33\x45\x1d\x5c\x3c\xff\x78\xb4\x17\x07\xc2\x52\x7f\x38\x51\xc1\xec\xb4\xf8\x2d\xa1\xeb\x54\x2b\x5a\xb2\x99\x77\xb3\xe2\xfb\x17\xe4\xb7\x1f\xa1\xcf\xde\x62\xb5\xd3\x18\x32\x20\x48\xaf\xc4\x7f\x04\xfb\xa2\x2c\x07\xf5\x28\xd7\xbb\xe7\xe2\xae\xde\x20\xac\xab\x1c\xcf\xd4\xdd\x41\xcd\x4f\x2d\x2c\x99\xfb\x10\x1f\x57\x05\xf9\x2e\x45\x82\x5d\x58\x23\x56\x1c\x42\x06\x1c\x9a\x8c\x2c\xce\xec\x4f\x69\x97\x6c\xbc\x1c\xf3\xb5\x66\x1c\x74\xa5\x87\x1d\x2e\x6e\x04\xac\x94\x0c\x6f\xfe\x2a\x57\xfe\x0b\x1a\x42\xa4\xe1\xa0\xcc\xc0\x6e\x96\x9f\xbd\xb9\xd9\x8d\xf2\x19\x08\x1a\x86\x11\x9d\x38\xfe\x2c\x04\xb1\x9b\xb8\x76\x0d\x91\x0a\xfa\xcb\x8d\x68\x54\x3f\x2e\x1c\x81\x34\xf8\xbe\x81\x6a\xae\x26\x2b\x96\x99\x2e\x1c\xec\x7d\xdb\xc5\x59\xe9\x85\x4e\xbe\x5d\xa2\xa1\x1f\x44\xb2\xa7\x29\x19\x9a\x85\xf9\x9e\xc0\x5a\x37\xa4\x93\x86\xd0\x18\x9c\x66\x53\xc8\xe5\xbb\x13\x32\x5e\x62\xc9\xba\x7b\x28\xe8\x26\x38\x9b\x99\xb5\xed\xf7\xd1\x68\xd9\x02\x45\x21\xbf\x7d\x77\x8b\x50\xa2\xb3\x7d\x36\x95\x92\xfb\x48\x10\xbe\x12\x97\x23\x56\x24\x3c\x0c\x45\x21\xbf\xc1\xdc\x46\xbb\x9b\xb7\x02\x05\xda\xbc\x91\x24\xf5\xc9\x30\x4c\x26\x39\xa0\x38\x63\x83\x94\x5f\xf9\x6c\x15\x07\xae\x07\xc1\x6a\x8c\x91\xd3\xd5\x3b\x1a\xb1\x55\x82\xb8\x7f\x3e\xf5\x1d\x83\x16\x46\xab\x45\x16\xf6\xf3\xac\x82\xa8\x12\x0e\x1e\x68\x69\xad\x44\x7c\xc6\x36\x1d\x1e\xfc\xd9\xc2\x9f\x47\xf3\x7f\x43\xe1\x5f\x68\xe6\xff\x0f\x05\x04\xb0\xa9\x37\xb7\x41\x25\xc7\xde\xe1\x2f\xf1\x62\x97\xb6\x7e\x41\x09\x8d\x4e\x7b\xe3\xb8\x07\xe4\x1f\xdc\x2f\x93\xb2\x29\x56\xcf\x8f\x92\xca\x80\x49\x68\x55\xff\x7c\x1d\xcc\x7d\xc9\x58\x64\xea\x82\xde\x5c\xf2\x8a\x18\x81\xda\xf6\xc7\x57\xe5\x9a\xc1\xfb\x48\x9d\x9c\x3f\xbc\xd8\x6b\x80\x69\x4a\x73\xab\xd7\xee\xcf\xd7\xee\x3a\xf0\xa9\xef\x19\x66\x36\xb6\xac\x88\x0f\x3d\xb4\xb0\x5e\x48\xdd\xb6\x98\xda\xea\x78\xfe\x01\x77\x5e\x93\x80\xfa\x16\x68\x39\x7e\x81\xd2\x50\xa9\xef\xc8\xc1\x89\xe3\x7d\x14\xc1\xdc\x95\x76\x49\xd1\x59\x11\x75\xd2\xf6\x8a\x5e\x45\x97\x45\xff\x37\x5b\xc4\x8c\x8d\xc6\x67\x33\x72\x32\x50\xed\x1b\xc2\x1f\x00\xc7\x66\xbd\x74\x9f\xa1\x4e\x88\xd9\x7d\x27\x84\x11\x6f\x60\xba\x2f\x8d\x0d\x91\x7e\xf4\x79\x7c\x04\xdb\x25\xe8\x1d\xb8\xa1\x63\x2b\xf0\x9a\xbe\x7b\xd9\xe2\x9d\xdd\xce\xd0\x49\xfe\x1e\x35\x45\x2e\x08\xc7\x9f\x4d\xad\xb2\x43\x64\xac\x06\xb8\x38\x9b\xb3\xdf\x1c\x28\x75\x23\x67\x3d\x20\x37\xce\xb8\xa8\xc3\x81\x61\x17\x4b\x32\x54\x3f\x9f\x56\x9b\xd7\x1a\x39\x3a\xdd\xc3\x29\x00\x40\x30\xfb\x42\x58\x93\xce\x9e\x48\x68\xc4\x19\x8b\xc1\x36\x9a\x72\x02\x0b\x85\x1f\xeb\x5c\x77\x2d\xfa\xa8\x7a\xb5\x48\xf6\xbc\x2c\x70\x06\x56\xf9\xb5\x06\x6f\xf2\x5a\x1e\x8d\x76\x83\x93\xd4\x96\x14\xc5\xe5\x19\xa1\xa4\xa4\xff\xaf\x44\x5b\x14\xc6\xb9\xf6\xba\x50\x13\x80\x8b\x65\x39\x82\x1b\xb2\xb4\x5b\xa8\xdf\xad\x33\x3e\xaa\xc7\x76\xdd\xf6\xf3\xea\x0d\x87\xf5\x33\x46\x8e\x45\x59\x31\x1d\xe5\xd4\x60\xb0\x8b\xf3\x26\x71\xc1\x29\x9d\x57\xbb\xaf\xd7\x77\xf5\xc2\x38\xed\x53\xd1\xb8\x21\x61\xc5\x0f\x48\x14\xba\x76\x4c\x4d\xd0\xb1\x05\x5b\xa0\xf0\x2d\xa3\xba\x0c\x0f\x7f\x41\x4c\xa2\xe9\x98\x60\x2d\xa5\x81\xa2\x2c\xc5\x42\x74\x19\x73\x8e\x7c\x68\x84\x67\x04\xa5\x48\x09\x73\x3d\x88\x82\x55\xd4\x1d\xf7\x6b\x0c\xb0\x37\x89\x9c\xe0\x23\x43\x6e\x99\x69\x33\x69\x88\x2b\x8d\xbe\x20\xca\x51\xda\x52\x9f\xdb\xb9\xa2\x19\x3c\xf9\x8f\x9d\xfa\x4b\x49\xcf\x79\xb0\xd1\xb0\xeb\x1c\xda\xdf\xf5\x68\xbf\x29\x5f\x76\x20\x51\x24\x15\xf9\x39\x2d\xd1\x8e\xff\x07\x0e\x80\x8e\xd4\xf4\x11\x69\xbf\x5c\xcc\xb5\x66\x51\xd7\x83\x8c\x4c\xde\x85\xdd\xfe\x23\xae\x9d\x01\xdd\xbb\xc8\xa4\xa3\xb5\x82\x41\x66\x4c\xdb\x27\xcb\xa9\xe6\xad\xfb\x89\x2a\xcc\xfa\xcd\xca\xef\x22\x2c\x81\xd4\xa6\x4d\x5d\x74\x62\xc5\xbf\x8d\x75\x04\xf7\x22\x72\x07\x9c\x5e\x0d\x82\x33\xb5\x7e\x33\x28\xdb\x1f\x1b\xfc\x76\x8c\xa7\x7c\xe1\x40\x7c\x8e\xe9\x77\x91\xe8\x1f\xb4\xca\x83\xfc\xdf\xf4\x3a\xab\xb2\x54\x73\x13\x00\xbd\x31\x4d\x74\x8f\x97\xf0\xbe\x79\xbc\x50\xa5\x7d\x1a\x6a\x71\xa9\x1b\x31\x4a\xcc\x1e\xde\xeb\x2c\x84\xcf\xd6\xca\x73\x36\x85\xe5\xe9\xf9\x79\x6f\xd2\xe3\xf4\x21\xa7\x45\x07\xbd\x11\xb3\x30\x0c\x7e\xcc\xfd\x7c\x65\x9a\x77\xdb\xf9\xee\x06\xb5\xe7\xf7\x03\xe4\xb4\x06\x00\x13\x11\xd3\x57\xab\x61\xa5\xb5\x05\x5e\xcc\x37\xb5\x50\xc9\x4b\x3b\xed\x6c\x6c\x37\x5d\x71\xd8\x55\xe4\x15\xec\x35\x14\xee\x3c\xd8\x5a\x8c\x6d\xb8\x51\xbb\x47\x6b\xd1\x0d\x7d\x6a\xca\x29\x22\x4a\xe9\x8c\xbd\x00\x0b\x4f\x43\x09\x2a\x4e\x42\x4c\xc9\xd4\x1a\x19\x01\x60\xd9\x54\x38\xc2\xb9\xe7\x39\x7c\x23\xc1\x32\xae\xa6\x7d\x67\x1f\x44\xb5\xf1\xa8\xc4\x22\xe0\xca\x6b\x27\xb3\xa5\xd1\xb7\x50\xbd\xd8\xf1\x64\x39\xcb\xee\x74\xee\x64\xc0\xee\x12\xa5\xd8\x8b\xea\xbd\xd5\x0d\xa7\x4e\x5c\xad\x53\x8d\x83\xfc\x01\xc5\xd3\xc2\x68\x07\xfd\x8d\x1e\xf0\x78\xf9\x53\x69\xdd\x1b\x29\x14\x2f\x9b\x95\x2e\x2c\x05\x83\x6e\x0c\x1b\xd4\x4c\xf4\xcd\x82\xd6\xaf\xab\x2f\x2d\x1e\x4c\x96\x10\x3c\x9f\x06\xd5\x65\x45\x2c\xd8\xf5\xaf\x93\x34\x11\x29\x3f\xaa\x71\x24\xdf\xcc\x4f\xb2\x3f\x48\xa0\x3c\xa6\xcc\x10\x1f\xdb\xfc\x4a\xa3\x02\x70\x4b\x5b\x85\xbd\x64\x15\xb7\x9a\xda\x16\x4c\x9e\xb5\x7f\x20\x34\x8d\x31\x2c\x85\x55\x2b\x32\x79\xe5\xed\x1c\x17\x7a\x1b\x53\xd1\x34\x0f\x7e\xa7\x37\x2a\x7d\x33\x0a\xb9\xc8\x29\x5f\x78\x31\x99\x3c\x4a\xd0\x5e\xf5\x34\x69\x96\x95\xc5\x10\x25\xb1\x4e\xcb\x0a\x8e\xf4\x37\x24\x3c\xcd\x14\x8e\x3f\x1a\xb3\x25\xe0\x20\x02\x03\x7e\x05\xed\x54\x49\xa4\xbe\xa3\x95\xcf\xc6\x7e\x1c\xf2\xd2\x74\xeb\xc4\xe2\x3a\x79\x4a\xe2\xe9\xf9\x3e\xea\x5b\xa7\x32\x05\x32\x76\x75\x59\xe1\x5a\x49\xa5\xb9\x27\x82\x68\x5d\xd6\x2d\xf8\xa8\x10\xde\x2d\xa1\x2c\xd9\x37\x2a\x00\x0b\x77\x13\x9a\x41\xd2\xed\x93\xb2\xdd\x16\xa3\xd0\x73\xf1\x48\xa7\x24\xfb\xf0\x88\x71\x74\xaf\x1b\xce\x4f\x9a\x3a\xb6\x9a\x71\x0d\xca\xe0\x4c\x6f\x0a\x61\x8b\x89\xb8\xa6\x30\x54\x4d\xef\x3e\xf3\x0f\x41\x1e\xd3\x1d\xde\xc9\xe6\x3e\x56\xa7\xd8\x1e\x25\xd5\x3a\x96\x5c\x29\x83\x59\x3d\xd4\xc2\xa4\x81\x5d\x8d\xfb\xd5\x1f\x6c\x61\xce\x2f\xd7\xf8\x99\x69\xc7\xc2\xee\x99\x4c\x05\xc3\xea\x51\xe5\x1c\x91\x82\xc0\x5e\x1d\x95\x79\xae\x19\x06\x3f\x64\xf3\x8c\xb7\x8b\x67\x2d\xfb\x6a\x72\x82\x19\xdb\xb4\xd7\x9c\x50\x65\x0b\x65\x10\x04\xd6\x55\xb2\x7a\x01\xd3\x86\x1e\xfd\xe5\x20\xa5\xd3\xba\x75\xd9\x99\x8f\x86\x8c\x2b\xb2\x6f\x15\x3b\xde\xb6\x89\x97\x24\xf9\x6d\x45\x19\x91\xe9\x66\x8e\x3e\xfd\xd1\x12\x7e\x78\xd3\xcf\x97\xce\x7f\x52\x24\x24\x8f\x50\xa9\xcb\xfb\xda\x81\xda\x96\xf1\x05\x9f\x30\x44\xb2\xac\xc5\x6b\x3f\xf8\x0e\xe8\x81\xb7\xac\x62\x69\x13\xb8\xbf\xd2\x8b\x1d\x88\xd2\xa9\x35\x9c\xd9\x70\xd5\x58\xa9\xae\x78\x30\x15\xa2\x5f\xc8\x5c\x27\xb1\xb5\x3f\x00\xbe\x80\xbd\x31\x9c\x8e\x32\x46\x3e\x66\x85\xc7\xce\x71\x22\x8b\x09\x97\xc5\x1e\x45\xd9\xb1\xa6\x66\x81\x2d\x0e\xd2\x83\x01\xdb\xc0\x83\xa7\xe7\x3f\x2b\x90\xae\x67\xe4\x82\x4d\x8d\x75\x47\x33\x98\x39\x71\xdb\x6c\x70\x93\x96\x28\xfe\x65\xd2\x5d\x1a\xf4\x25\x7b\x86\x94\x61\xe3\xe9\xf9\xc4\xb5\x18\x31\x34\x62\xd8\x13\x69\x35\x7a\x67\x2d\xbb\x07\x12\x95\x19\x17\xbf\x26\xb7\x85\xa7\x4c\xc8\x70\x31\xe6\x62\xc4\xff\x93\xa9\x52\xc8\xe1\x8c\xeb\x6e\x85\x14\x33\xc8\xe5\xb1\xed\xcc\x68\x4f\x5b\xa7\x2b\x38\xa9\x68\x6e\xf6\xe7\xd4\x25\xa2\xe5\x93\x42\xa9\x3f\x85\x4a\x44\xb7\x98\xbb\xec\x8d\xaa\xcd\x3b\xc2\xb3\x58\x23\xea\xd2\x24\x0f\x28\x7d\x8d\xe8\xc8\x96\x17\x1a\xae\x3e\xac\xe6\xd1\x16\x80\x20\x59\xef\x5d\x96\x70\xed\x71\x7d\xd8\xfa\x74\xec\xd4\xb2\x28\xaf\xa9\xcc\x61\x6e\x0f\xe3\xb7\x0a\x02\xe8\xea\x6c\x2e\x79\x65\xb4\xba\x27\xcb\x43\x0c\xba\x13\xd6\xaa\x87\x9c\x02\xd1\x81\xdb\x1e\x3a\xa8\x97\x70\xe5\xb7\x5c\xcc\x86\xc1\x66\x77\xdb\x1e\x57\x66\xc5\xdf\x5c\x81\x35\x45\xd2\xfc\xe1\xe3\xe4\x4f\x73\x9f\xbd\x15\x22\x0b\xb7\xb6\x9b\x2c\xbd\x60\x8f\x0c\x47\xe9\x6f\xd7\xd1\x91\xb2\x3e\x86\x5e\xad\xc0\x1f\xfd\x95\xbf\x83\xcb\xa4\xaa\x76\x35\x6a\x3c\xe1\x88\x49\x14\x49\xe3\xbc\xd1\x5b\xdf\xf1\xf3\x67\xe9\xc8\xd9\xda\xd5\x28\x9b\x2f\x2f\x01\x96\x13\x66\x37\x1c\x6c\x3b\x67\x19\xb6\x89\xe8\x1f\x0d\x2f\x47\x27\xc3\x65\x98\xe0\x9e\xc4\x53\x77\xa5\xe4\x02\xdb\xa0\xb6\x2f\xef\x40\x95\xaf\x2e\x9d\x46\xda\x07\x55\x36\xe1\x7d\x05\xca\x87\x09\x03\x84\x2f\x56\xc4\xe4\xbc\x3d\x36\xe1\x96\x2d\x95\x35\xa9\xbb\x48\x40\xfe\x47\xbf\x32\x2c\xb1\xe8\xb2\xc6\xda\x86\x7d\xf8\xf0\x91\x9e\x03\x1f\x7d\xbc\xc5\x03\xc3\xed\x9a\xc0\xe3\xf3\xb2\xfc\x4f\xfe\xba\xf3\x27\xcb\x6d\xe1\xc9\xd1\x1e\x64\x8f\x6b\x42\xec\xdd\xb4\x49\x4a\x29\x69\x77\xdf\xc4\xb1\xcb\x04\x3e\x5b\x03\x9e\x7a\x32\xb1\x17\xfc\x1f\xc1\x46\x41\x04\xc5\x11\x22\x27\x24\x27\xfc\x5e\x48\x33\x6c\xe8\x5f\xb4\x53\xce\xb2\xbc\x17\xc5\xe2\x62\x8b\xd8\x8a\x4d\xcf\xb9\x2d\x3b\x9f\x06\x25\x15\xbf\x77\x7b\xc5\xdf\xbb\x1b\x91\xfd\xd2\xdf\x26\xff\xba\xfa\xcc\xb2\x7f\xbc\xbb\xf1\x47\xde\xe1\x01\x35\x77\xc1\xe9\xfd\xf2\x93\xa5\x27\x73\xfc\x22\xab\x1f\xd1\xa5\x83\xfc\x71\x94\xc0\xde\x38\x1e\xe3\x0a\x77\x19\xe5\x65\x27\x7d\x90\xa0\x6f\xf3\x41\xcb\x6b\xb0\x7c\x0b\xdd\x82\x59\x56\xac\xcb\xf8\xcf\xdc\x0a\x9c\x84\xd8\x15\x33\x3c\x76\xcd\xf4\x14\xf7\x15\x26\xb4\x69\x93\x78\xfc\xeb\x0c\x7d\xf0\x5e\xcd\x9e\x70\xfe\x77\xac\xfd\xbb\x35\x15\xc1\xeb\x59\x73\x08\x14\xe4\x2d\xea\x5b\xb7\x4f\xcf\xba\xf5\xee\xc4\xc5\x2e\x33\xc4\x48\x81\x2b\xd6\x4d\x2d\xe6\xcc\x71\xe3\x57\xe2\x7a\x84\xaf\xdf\x59\x76\xf7\xe2\x3f\x6b\xe6\x6f\xba\x19\x4a\x34\x75\xf6\xb8\xcc\xa6\x2e\xe2\x1d\x00\x65\x36\xf4\x86\x76\xb1\xdd\x3e\x54\xdb\xb4\x79\x64\x0a\x65\xfc\xae\xa2\x1d\x79\x26\x06\xf7\x7d\xfc\xb3\xcc\xb6\x5f\x8b\xa0\x9c\x68\xe2\xd3\xa0\xf7\xd5\xc8\xf4\x76\xf5\x26\xc6\x13\x69\x45\x67\xf8\xfb\x12\xf4\xbb\xc9\xef\x7f\x20\x8b\xfe\xe0\x5f\xb1\x0a\x4f\x22\x4d\x4c\x5c\x02\x63\x9f\x30\xf4\x2d\x61\x43\x6b\x97\xcc\x02\xba\xa2\x78\x6b\x07\x25\x1a\x7c\x51\x87\xd9\xf8\xa6\x97\xea\xcd\x76\x88\xde\x6d\xa4\x2b\x13\x60\x6a\x1b\x88\xc1\x4f\x07\x3d\x92\x48\x53\x35\x99\xfb\xc5\xef\x9a\x64\xb7\x36\xaf\xe7\x53\x66\xf7\x67\x4d\x5a\xb8\xe0\x94\xde\x33\xb5\xff\xc1\xcc\xff\xda\xcb\x21\xd2\xb0\xd2\x88\xa0\x1e\x96\x03\xb5\xf9\x5e\xdb\xa7\xa5\x8a\x6f\xfc\x9e\xde\xaf\x4d\xa5\x1b\xd0\x13\x2c\xac\x3b\x59\xac\x2a\x3c\x57\xc6\x02\xd1\xa2\x1c\x41\x2e\x03\x7f\xc4\x33\x77\xe4\x47\xf9\x56\x4c\x8f\x86\x55\xbc\xb3\xab\xb5\x9f\x3b\x5c\xca\xa8\x5c\x99\x15\x0b\x4e\x5a\x78\x6f\xb7\xbe\x81\x6c\x1d\x33\x76\x25\x19\x1a\x5c\xa2\xf1\x2a\x6f\xa6\x16\x63\x01\x6f\x23\xa3\x42\xe1\x43\xe2\x17\xd3\x5f\xe9\x86\xd7\x9b\x0d\x6b\xf2\x7e\x82\x92\xf7\x1e\x02\xdc\x91\x05\x16\x62\x11\x55\x7b\x95\xe3\x29\xc8\xea\xd1\xf5\x0d\xac\x65\x7a\xd4\x5e\x3f\x0d\x29\xec\x48\xa4\x48\x01\x61\xf8\x46\x1d\x93\xe2\xfb\xd5\xe7\x6c\x3f\x78\x8b\xfb\xb9\x9b\xc4\xd1\xed\x6a\x1f\x87\xb0\x86\x0c\xd1\x6c\x2d\x3e\x91\x0c\xbf\x96\x05\x4b\x70\x7e\x42\x59\xfa\x7e\x89\xd5\x26\x74\x48\x17\x7d\xeb\x83\xee\x68\x70\xbc\x39\xe7\x48\xd7\x18\x92\xee\x5f\xf9\xca\xef\xbb\x66\x0f\xed\x5f\xcc\xfc\x2f\x44\x01\x91\x8e\xff\x6f\x79\x62\x9c\x8e\xe7\xaa\x43\x4c\x66\x4c\xdc\xa1\xe3\x99\xef\xea\x73\x1d\xd5\x09\x45\xa9\x8a\x06\x7b\xc1\xae\xc1\x30\x89\x87\x32\x39\xb0\x28\xcd\x7f\xae\x50\xe5\x75\x79\x49\xe2\x0b\x08\xb6\x2b\x45\xf5\x72\xdf\x6e\x3a\x37\xe2\x5d\xf9\x8d\xa8\x6b\x02\xbf\x32\x8f\x3f\x3a\x38\x5f\x0e\xcc\xb2\xe9\x2f\x04\x1a\x2c\xfa\xf2\x5a\x61\xc9\xd2\xf9\x6d\x5e\x6e\x84\x9f\x6d\x3b\x89\xbf\x2b\x71\x16\xaa\xbb\xee\xca\x54\x82\x97\xb1\x3f\xd5\x24\x13\x21\xb3\xb0\x28\xe8\x4b\xe9\x68\xbc\xbf\x5d\x45\x20\x2f\x03\x7c\xea\x8b\x8b\x9c\x14\x83\xb8\xc9\xdb\x15\x08\xff\xba\xf6\xaf\x4d\x18\x22\x6d\x2a\xfe\x9f\xf2\xc4\x7a\xe1\xc5\xa0\x5e\xa7\x5b\xb9\xfa\xdf\xc3\xb2\xf2\x4a\xe2\xa5\xdd\x1a\xcd\x78\xb6\xed\x8a\xbf\x03\x10\xbf\xc4\x19\x08\x79\x81\xba\xec\x13\x2c\x8e\x79\x38\x1f\x09\x3d\x11\xd9\x2e\x68\x1e\x90\xaf\x29\x0e\x4f\x5d\x51\x6d\xa8\x1c\x32\x50\xb1\x68\x9f\x75\xd8\x05\x6d\x83\x4b\xd7\x10\x41\x09\x2b\x42\xc3\x47\x28\x5a\x87\x4f\x17\xe6\xd9\x7a\x0a\x1c\x02\xce\x08\x27\xbb\x5f\x09\x96\xbf\xc8\x66\x46\x1f\xc8\xd6\xa9\x63\x24\x1f\x65\x0f\xe7\x0d\xe8\xa8\xb0\x9b\xd8\xfe\x9e\xd1\x56\xb1\xe6\xbc\x61\x9c\xcc\xe5\xe7\x91\xab\xf8\x49\x8e\xac\x9a\xec\x6f\x89\xc6\xbf\x76\x6d\x88\x74\x00\x26\x14\x58\x9c\x57\xd8\xb4\xeb\xc4\xaa\x22\x2d\x55\xea\xc7\xad\x90\x6c\x4a\xab\x5f\x0e\xef\x88\x15\xdb\x12\x15\xc8\x15\x21\xab\x71\xb6\x4c\x42\x0e\xc4\x63\xbc\xe3\xd9\xe1\xde\xb5\xb1\xc5\xf4\xc9\x9f\x14\x9f\xfa\x30\xc7\x56\xc1\xe8\xe0\x74\x7e\xd2\x0b\x1c\x14\x94\xf9\xab\xf5\x38\xa0\x05\xc3\xfe\xdd\x9c\x9f\xeb\x2d\x8f\xcd\xfa\x50\xc9\x88\xc1\x9e\x02\x63\xc3\xee\xfc\xb0\xe9\x8c\x3b\xdd\x60\x36\x25\x06\xd3\xb9\xcc\x0e\x58\xf1\xb7\x4c\xd2\xbf\xb2\x1f\x1d\x7b\xd7\xa3\x0f\xbb\xb3\x5f\xe0\x71\xae\x98\xf3\x93\xd6\x85\xbd\xae\xe0\x8a\x66\x3b\xd5\x7e\xae\xf7\xb2\x04\xe6\x7f\x07\x32\x20\x92\xec\x34\xc0\x27\xcb\x4e\x58\x9e\xf9\x78\xc0\xda\x6a\xe7\xaa\x9a\x39\x3b\x07\x45\x44\x2f\x63\xd4\xe7\x29\x8f\x72\x6f\x78\x27\x83\xf5\x6b\xb6\xe7\x1c\xf0\x4b\x7f\x9f\x72\xe8\x84\xf6\x4f\x11\x86\x37\x74\x9c\x4a\x05\xc1\x9a\xc4\x87\x9e\x46\x35\xc2\x1f\xbd\xc8\x99\x8a\x5f\xb7\x8f\x7f\x34\x3e\xf9\x95\xf0\xa5\x70\xe2\x84\xae\x54\xbd\x90\x48\xfd\x06\x07\xfe\x63\xc7\xe8\x27\xd2\x34\x5d\x57\x63\x24\xa6\xc2\x2e\xe2\x32\xc8\x8b\x42\x60\xd0\x6f\x7d\x8e\x33\xe9\x66\x09\x7e\x95\xdf\x6c\xa0\x47\x75\x76\xba\x35\xa7\xdb\xcf\x66\x48\x24\xaf\x1c\xee\xdf\x78\x75\x55\x58\x7e\x06\x88\x3d\x83\xed\xc2\x90\x80\xf2\x37\x10\xe7\xa3\x17\x5f\xc5\x77\x48\x94\xff\x14\xc3\xa8\x2a\xc9\x90\x69\x31\x22\x55\x6f\x07\x91\x0f\x82\xf5\x55\x02\x66\xb0\xaf\x95\xae\x6d\xb1\xe0\xa6\x73\xad\x14\xfb\xf9\x33\x3f\xf2\x68\xfb\x26\x85\x8e\x2a\x59\x51\x0d\xd7\xeb\x88\x94\xff\x4d\x16\xfd\x0b\x66\x41\xa4\x71\xa0\xa1\x9f\x03\xc9\x22\xdd\x00\xc6\x6c\xb7\xf8\x5b\xa1\x79\x36\xa4\xc9\xc7\xe7\xa8\x27\xdf\x07\x3a\xdd\x91\x36\x02\x96\x4d\xa4\xea\x5f\x59\x29\x36\x83\xe9\xdb\xeb\xec\x5b\x04\xb8\xca\xab\xe6\xcd\x62\xdc\x7c\xb6\xaf\xae\xd4\x74\x6c\xfa\xa6\xda\x8c\xfd\xfb\x12\xed\x28\x25\x0e\xaa\x83\xb6\xe0\xe2\x7d\xc1\x66\xaa\x44\x9b\x57\xfe\x42\x84\x63\x3a\x43\xcc\xa8\xd5\xb2\x6b\xc9\xb8\xe3\x5e\xbd\xdf\x43\x5b\x0c\x1f\x6f\xa9\x1d\xcc\xc8\x52\xdc\x95\xf4\xa2\x93\x72\xdb\x53\x97\xbe\x27\x72\xda\xcb\x39\x36\x51\x9a\xb2\x1d\xa6\x95\x9f\xbd\x85\xed\xf5\xbe\x21\xa2\x03\x85\xf4\x09\x44\x7c\x99\x7c\x56\x38\x08\xd1\xdb\xde\xcc\x96\xf9\x67\xc1\x45\x9a\x9b\x05\x2e\x97\x5f\x9a\x57\xeb\xda\x25\xcf\x95\xb7\x26\x03\xa6\xeb\xe2\xa4\xaa\x58\xef\x12\x07\x73\xd4\x96\xba\x5f\xc4\x10\x6d\xd0\xf5\x77\x56\xa8\x53\xc8\x5c\xf4\xad\x65\x91\x7d\x3d\x98\x53\xfa\x5b\xfa\xf2\x4f\xb0\x29\x8d\x0a\x23\x89\x05\x94\xbe\xcc\xfd\x84\x41\xdc\x32\xae\xc0\x6a\x14\xc7\x21\x89\xe7\x23\xe6\x9a\xcc\x7a\xbf\x09\x55\xb1\xa7\xb3\x78\x02\x63\x57\x8a\x33\x0d\xa6\xcc\x6c\x7f\x5b\x3b\x7e\x7f\xcb\xeb\x90\x7e\x1d\x46\x98\xac\x35\xc0\xca\x8e\xfe\xcb\x4c\x59\x05\x4e\x8d\x84\xb2\x2a\xbd\x3c\x87\x1d\xa4\xbe\x0e\x57\x5f\x62\x31\x1e\xbc\x38\x51\x15\x77\x71\xc8\x74\x25\x20\x7c\xf6\x13\x35\xb4\x81\xf4\x25\x9e\x66\x6b\x3b\x69\x62\x71\x38\x98\x2c\xca\x92\xd0\xf2\x17\x6a\x6e\x5f\x7f\x9f\xfc\x2a\x4c\xb2\x1f\x3f\xc8\xb8\xb5\x0f\x6d\x6d\xdc\x1b\xfa\xf9\x42\xbd\xf3\x65\x1b\x5f\x25\x10\x8b\xde\x8a\x3d\xc1\x34\xa5\xd9\x1a\xb0\x15\x1e\x89\xd3\x18\xc8\x96\x6b\x7d\x93\x30\xba\x23\x22\x47\x27\x23\x2b\x87\x77\xf4\xae\xc0\x0d\x55\x60\x1a\xbb\x5f\xc5\xee\xa7\x30\x01\xe8\xe2\x61\x66\xfb\x5e\xb8\xd5\x3a\x71\x36\xc7\x37\x9a\xa3\x68\xb5\x49\xe4\x5e\x98\xb9\x20\x2d\x71\xa8\x59\x01\x7d\x53\xb1\xfb\xeb\xfc\xb2\xdd\x42\x78\x4e\x7f\x3c\xd1\x30\x1d\x5c\xfe\x2b\x97\x4e\xb5\xe1\xab\x1d\x8b\x71\x17\x13\xc0\x34\xf9\x48\xdc\xb5\xf8\x30\x06\x8a\xa2\x7b\xe4\xdb\x22\x1d\x4f\xa7\x94\x0f\x4f\xca\xa4\xf2\x82\x12\xbc\x08\xa3\x6e\x85\x88\x09\xd6\xdf\xc2\xe2\x7f\x42\x6e\xc9\x6c\x44\x40\x51\xf0\xfd\x98\x93\xdc\xa1\x75\x07\x56\xdf\xf3\x68\x7c\xce\xbe\xa9\x6e\xb6\xaf\x76\x61\x8f\x31\xba\x03\xea\xc1\x25\x41\xdb\xac\x07\x00\x2b\xe8\x80\x4b\x5e\x11\x46\x19\x8f\xe7\xe5\x67\xe6\x06\x5d\x59\xcc\xad\xb6\x73\x18\x07\xc5\x24\xcf\x45\x55\x9f\x8c\x6f\x32\xa4\xb5\x3e\x60\xdd\xc9\xc7\x36\x38\xf2\x24\xac\x6c\x19\x11\xe4\x4f\x68\x66\x16\x3e\x93\x71\xdf\xe4\x38\x0f\x4a\x5b\xb4\xdd\xf6\x8d\x17\xa8\xfc\xc0\xcb\x9c\x3b\x5c\x47\x08\x89\xc7\x87\x71\x5f\x03\x65\x95\x08\x56\xc5\x52\xb8\x82\x26\x9a\xfd\x29\x1a\x5e\x3a\x67\x1a\xfd\xe5\xc1\x0d\x81\x27\x15\xfd\x7f\x40\x79\x88\x34\x3b\xd4\x7f\xb4\x12\x17\xcc\x04\xd3\x5c\x05\x2c\x6d\xed\x7f\xa6\x25\xa7\xca\x98\x32\xb1\xb1\xaf\x2a\x88\xcb\xdd\xdf\xcf\x34\x87\xea\x8a\x62\x27\xc8\x3c\x79\x76\x35\x78\x64\xa9\x9e\x13\xbe\x01\xe5\x6c\x81\x7d\x97\x69\xe6\xd4\x72\x12\x45\x9f\x94\x76\x8c\x90\x5e\x3c\x3c\xea\xbf\x84\x05\x96\xc3\xa3\xda\x67\x14\xa8\x0d\xe3\x04\xb1\x30\xbf\x36\x66\x95\x53\xd4\x36\x4a\xd8\x95\xb0\x6a\x4c\xfd\xb9\x26\x1b\xf0\x60\x6e\x93\x0d\x6e\x4d\x75\xdd\x92\x2b\x7a\x25\x8c\x8d\x77\xd4\x1d\x3a\xa3\x1e\x41\x90\x5f\x1f\x4b\x1f\xb1\xfd\xd9\x8f\x18\x5b\x49\x5d\x14\xed\xbe\x42\xff\x2d\x87\xff\x17\x50\x83\x48\x05\x20\x12\x00\xbf\xe5\xf8\xe8\xf4\xce\xba\x6b\xb7\xf4\x7a\xf4\xbb\x3c\xe8\xb7\xdc\xcc\x3c\x9e\xd6\x6c\xec\x90\x43\xae\xa2\x8f\x57\xb4\xb3\x19\xee\x60\xab\xac\xdb\xcc\x33\xdf\xcf\xda\xc8\xf4\x48\xba\xc8\x99\x56\x33\xf4\x7b\xe6\xd0\xf6\xe1\xcf\x75\x50\xbf\x77\xb2\x2c\x39\x49\x31\x3d\xfc\x06\xb3\x65\xba\xce\x57\x73\x38\xc4\x08\xf2\x12\x47\xd0\xb6\xa4\x78\x92\xd4\x6d\x58\x6f\xb0\x3b\xaa\x87\x14\xdf\x56\x8d\x22\xc4\xe3\x92\x02\x6b\xc1\xe5\x13\x51\xd7\x9f\x73\xd8\xf9\xa5\x5d\xb4\xe6\xdb\x5f\xe1\x42\x98\x70\x54\x24\xbe\x85\xef\x10\x79\x6a\xf2\xd6\xc7\x9f\x8f\x01\x77\xb0\x95\x6d\xe5\x24\xb4\x25\xeb\x3e\xbb\x2e\x9c\x61\x5d\x1d\xef\xc6\xac\xa6\xbc\xe7\xad\x42\xf7\x48\xb2\xa4\x1f\xc7\xda\x24\xac\x50\xff\x16\x0f\xfe\x0b\x81\x42\xa4\x51\x29\x30\xc5\x01\x64\x59\xa4\x47\xdd\x32\x27\x54\x4f\x57\x98\x98\x9f\x6e\x56\x44\x95\x5a\x4d\xb1\xaa\x7f\x4c\x93\xf7\x65\x77\x3a\xc6\x7b\x55\x9e\x0d\xbc\xf9\x88\xba\x1e\xdc\xf0\x2f\x38\xe3\x40\xcd\xe6\xf1\x44\xb4\xae\x72\x09\xd8\x62\x2e\x32\x85\xe9\x2b\x3a\x30\x57\xd6\xc5\x74\xe8\x02\x9b\x24\xf4\x92\x6e\xcf\x34\xe9\x87\x7e\x7e\x7c\x39\x76\x51\xec\x8b\x88\x99\x5c\xb9\x7a\xed\x33\x2b\xfb\xc2\x3c\xc2\x52\x9c\xae\x0b\x33\x08\x30\xb5\xff\xa0\x5c\xac\xd7\x4a\xdd\xa1\x49\x39\xbe\x35\x7d\xf3\x3e\xa9\xba\x3a\xff\x9e\x74\xb1\xe0\xfd\xd9\xc7\x62\x2f\xc2\x8a\x5c\xb0\xee\xf5\x8d\x49\xbf\x06\x6c\x83\x57\x6a\x1c\x6c\xe5\x0d\xd2\x3c\xae\x45\x7c\x09\x1c\x86\xfe\x61\xe4\x91\xbc\xf7\xd8\xc3\x2f\xc3\x26\xe7\xcb\xfb\xff\x4b\xd3\xcd\xcc\x31\x40\x12\x0e\x9d\x4a\x7a\x17\x6a\x3a\x3f\x62\xec\x21\xac\x83\x80\x0e\x7d\x64\x22\x90\x1b\x9e\x69\x15\xab\x9c\x6f\x97\x01\x91\x3e\x6e\x3b\x7e\x4c\x26\x05\x5a\xc7\x9d\xd6\x79\x91\x4e\x24\xaf\x0c\x4e\x30\xe0\xd9\x18\x8b\xcb\x7e\x4a\xc0\x7e\xb6\xd6\x7b\x08\xab\xf3\xaa\xde\xe9\xcd\x14\x2e\x50\x32\x5d\xb6\x8f\x5a\x08\xdd\xcf\xcd\x4e\x25\x1c\x9e\xaf\x55\xbf\x9d\x56\x35\xf7\xa2\xe5\x8a\xe7\xcd\x32\x5b\xda\xa3\x16\xc5\x72\xa7\xc2\x93\xe5\x82\xd5\xb4\x3e\xf7\xcd\x76\x41\x5a\x61\xa7\xf7\x60\x5d\x79\xcf\xa5\xa2\xb9\xa5\x0f\x7a\x72\xba\x16\x31\x25\xa5\xef\xf6\x57\xb0\x6c\x8d\x15\x5d\xd4\xab\x5a\x80\x5b\x99\xa8\xb2\x70\x83\x3d\xa7\x42\xd5\xcf\xf8\x67\x68\x83\xc4\x3d\x62\x77\x7b\x8d\xbf\x75\x42\x2b\x19\x10\x34\x44\xbd\x0f\x32\x71\xa1\x21\xe4\xd8\x61\xfb\xb2\x9b\xe2\xf7\x2b\x32\x5a\x9d\xd5\x0c\x78\x70\x96\x50\x71\xca\x44\xc7\x92\x83\xc0\x19\xaf\x4c\x16\x59\x60\xb7\x8d\x1c\xc1\xe0\x6d\xe8\xdc\x56\xc4\x66\x28\x0d\x86\xfe\x0e\x4a\x89\x7e\xb9\x4e\xc7\x1c\xcb\x7e\xa7\x70\x05\x70\x70\x14\x38\x0a\x7f\xf7\x7d\xff\x4d\xb8\x6b\x07\x4a\xd6\x31\xbc\x45\x0a\x6c\xf3\xfc\x35\xf6\x6e\xef\x71\x83\x1d\x26\xc6\x4a\x5e\x5b\xe4\xd3\xa0\x26\x92\xbe\x84\xf2\x5d\x34\xcf\x74\x72\x8b\xdb\xd8\x93\xcd\x26\x70\x56\xc2\x8d\xed\x49\xcf\x65\x4d\xd5\xa7\x43\xc6\x1b\x14\x01\x21\xe7\x1b\xb7\x3d\xa3\x8f\x4c\x3f\xeb\x5e\x15\x16\x33\x7b\xc4\x38\x26\x37\xd6\xbb\x6c\x5f\xd8\x72\xe8\x66\xb1\x15\x86\x89\x37\x2a\x73\x01\x3e\x31\xe6\x7d\xac\xf6\x37\x4f\x2d\x87\xe8\xed\x23\x5b\x75\x3e\x54\x9a\xeb\xc4\xcf\xbe\xa4\xa3\xcc\xc3\x6d\x2e\xd8\x38\xad\xc0\x29\x00\xca\x26\x2c\x77\xe7\xed\xea\x54\xb3\xa0\x34\xd2\x7a\x85\x5b\x02\x3d\xd4\x94\xb1\x60\x91\x67\x62\x67\xe4\x98\xa7\x14\x7e\x04\xd7\x81\xaa\x01\xa2\xbf\x61\x1a\x69\x06\x24\x26\x84\xe3\x98\x61\x4c\xbf\x70\x9f\xb8\x2c\x18\xd2\x6f\xa8\x7b\xae\xdf\xc6\xb0\x12\x3d\xdb\x97\xfc\x8f\xde\x8c\x61\xb0\x53\x79\xa5\xe7\x6c\xe3\xd5\x35\xc1\x34\xae\x04\x97\xd4\x4f\x23\x6d\x03\xcb\xdc\x61\xd8\x1d\x7f\xca\xed\x12\xe2\x93\xae\xa7\xa9\x12\x9b\xd4\xbe\x73\x6d\x3e\x16\x74\xc3\x77\x17\xaa\x6b\xfd\x21\x64\x7c\x43\xae\xd7\x45\x60\x6c\xd9\x65\x45\x28\xe9\x81\xc6\x0a\xd0\x1f\x27\xb3\x6b\x3a\xbb\xd9\xa5\x44\xa7\xef\x2f\xfc\x66\x49\x28\x71\x87\x6b\xfd\xbf\x96\xd1\xe4\xd8\x9d\x68\xd9\x6e\x1d\xe5\xe4\x95\x83\xaa\x54\x93\x72\x2c\xb5\x39\x8f\xb7\xe8\x1d\x50\x6a\x28\x95\xbf\x26\xef\x9a\x19\x66\x83\x6b\x52\xae\xf8\x74\x92\xa1\x7e\xdb\x6e\x9e\x02\x9c\xca\x80\x63\x21\x2b\x07\x6e\x0a\x4b\x46\x2e\xcd\x87\x6b\xb6\x0f\x39\x85\x8e\x70\xb8\x96\x0d\x26\xbc\x46\xa2\xd1\x96\xa4\x2b\xfb\xe0\xa0\xe2\x4d\xca\x16\x9e\x5e\x71\x9b\x7c\xe6\x6f\x4a\x65\xcc\x13\x63\x9d\x65\x7d\x95\x05\xf7\xcd\xbc\xc9\xe8\xcd\x1c\x29\xf6\x5f\x3c\x0d\x6a\x96\x0f\xf5\x0b\xe9\x4f\x56\xeb\xd1\x15\x1a\xce\x2b\xe8\x96\x56\x6d\xe8\x0e\xef\x2b\x4e\xbb\x83\x29\x7f\xbc\xc3\xba\x8c\xc2\xff\x34\x63\x6d\x49\x10\xf2\x3c\xe4\x30\x89\x17\xf4\x77\xfa\xff\x18\x7b\xcb\xb0\x2e\x9f\xa0\x6d\x98\xee\x2e\x01\xe9\x06\x91\x10\xa4\x9b\x1f\x21\x21\x25\xd2\x8d\xa4\x34\xd2\xdd\x9d\xd2\x28\xdd\x21\x2d\xdd\x08\x48\x97\xb4\x74\x77\x83\xd4\x7b\xbc\xcf\xf3\xdc\xb2\xff\x4f\xde\xdf\xe7\xd8\x9d\x6b\xe3\x9a\x99\x73\xcf\x99\x61\x40\x76\x3b\x7a\x8c\x93\x1f\x25\x35\xaa\x16\xc6\x6e\x2f\x39\x2f\x3c\xb4\x38\xa5\x07\x44\x35\x3f\x24\x71\x86\xd8\xbf\x5b\x4e\xc4\xc1\x65\x62\xbc\x89\x96\x1a\x5e\xf7\xdc\xbc\x52\xdb\x81\x3d\xfa\xea\xf7\xf3\x6c\x28\x95\x0c\x10\x15\x46\x1f\xcc\x7d\xcd\x43\x12\x10\x1d\x50\x2d\x66\xfc\x65\x17\x5d\x89\x22\xe8\xdb\xfb\x6d\xd9\xfa\xe7\x1a\xab\x11\xb9\xbf\x3e\x3b\x03\xa2\xee\x55\xc2\x62\xae\x70\x82\x8b\xd8\x92\x2f\x3d\xcc\x8e\x94\x34\xc6\x73\x7e\x0a\x8a\x8e\x68\x10\x47\x64\x4e\x74\xd0\xe3\x57\x14\x3e\x1d\xea\x2f\x74\xbc\x51\xaa\x35\xdc\xee\x8e\xd1\x79\x5c\xdc\xbe\x56\xa2\xed\xed\xb4\xe7\x84\xc1\x3d\x06\x9b\x9a\x81\x38\x9b\x61\xcf\xb9\x9f\x16\xa0\x38\x8c\xfc\x25\x87\xd7\x68\x38\x5b\xee\x34\x22\x63\x5d\xe8\x79\x0f\x83\xce\xd1\xab\x68\xcd\x61\x52\xf6\x0a\x12\x6d\x38\x1a\xa0\x85\xc3\x4f\xf7\x29\x43\xfe\xdb\x8f\x91\x6d\x85\x9b\x41\x95\x44\xa7\xee\xd4\xe5\x6f\x09\xaa\xa3\x5b\x90\xb6\xee\xbe\x3b\x29\x52\xb7\xd8\x80\x4b\x95\x1f\xd1\xcd\xa4\xf4\x89\x62\x68\x46\x5a\x91\x5b\x41\x8d\xd7\x6f\x26\xcc\x98\x79\x59\x8f\xed\x97\x6c\x6a\x56\x9c\xa4\x05\xe4\xe2\x69\xab\x04\x05\xe8\x12\xc6\xcc\x5f\x66\x12\xe7\x7d\xf0\x4c\x72\x68\x3a\xfe\x69\xa4\x75\xa7\x21\xf3\x02\xb2\x84\x23\x36\x66\x66\x65\x64\xf9\x34\xff\x38\x3b\x9b\x92\x0a\xf3\x73\x6e\x73\xf1\x1a\x3a\x33\x98\x86\xae\x20\xe7\xe7\x45\x85\xf2\xbe\xd8\x3f\xa1\x06\x61\xfa\xbe\x99\x31\x02\xfb\xaf\x1b\x9c\xe0\x56\x90\xba\xfa\xa1\x5d\x2b\x77\xb0\x82\xeb\x55\xb6\x37\x4e\x58\x7e\x41\x52\xf3\xb9\xf1\x66\x7f\x29\xb5\x94\x2e\x3c\x50\x42\x8b\xea\x43\x6d\x1a\xa4\x99\x0f\xbe\x3f\x59\x53\x25\x8f\x97\x63\x3f\x0c\xaa\xc9\xf2\xab\x64\x9f\xfb\xf1\x11\x69\x03\xbe\x40\x2d\x30\xa8\x0f\xc7\x2a\xd4\x6f\x1a\x24\xbf\xd9\x0f\xd6\xef\x76\x29\xb1\x23\xec\x36\xd9\x70\xad\xe4\xbf\x3f\xc2\xaf\x66\xf8\x43\x7c\x0c\x00\x3e\x74\x88\xfd\xe7\x50\x4d\xc9\x2a\xd3\x0e\xbe\xcb\xaa\x64\x7e\x7e\x76\xb4\x1c\x08\x33\x9d\x39\xf2\x59\x53\x18\xb4\xf1\xf0\x68\x19\xd8\x4c\x46\x94\xcb\x55\xe6\xe3\xf5\x2f\x1a\xa4\x9d\xed\x54\xb7\x88\x7b\xe8\x54\xb6\x77\xbc\x22\x1e\x0b\x6e\xde\xc9\x58\xd5\x32\xb4\xc9\x20\x0e\xa1\x43\x13\x0a\xc7\xe6\xbc\x17\x97\x1d\xe9\xe3\x47\x1d\x07\xd7\x98\x18\x2e\xa8\xa5\xd3\x9f\x5e\x3b\x3d\xef\x84\x4d\x59\x70\x06\xb4\x05\x09\xa0\x5f\xba\x81\xba\x9d\xaf\x61\x33\x9d\x53\x0c\xb9\xa8\x24\xb3\xd3\x8f\x31\xc3\x62\x7e\x45\xf7\x2b\x1f\xef\x03\x35\x7a\x31\x3c\xb8\x53\xba\x0e\x72\xc4\xca\x49\x1d\x9d\x5c\x8d\x14\x79\x9f\xdc\xa5\x97\xd4\xa3\xf3\x21\x7b\xc5\x7e\xed\xfa\x08\xd8\x73\x04\x8a\x0f\x9e\x4f\x67\x8a\xe3\x9b\x4b\x59\x86\x08\x92\xd3\x4c\xdc\xc8\xb7\xdc\xef\x18\x45\x23\x1f\x5d\x25\x6e\x5e\xd5\xec\x49\xb9\xa1\xc5\x2f\x4d\x2e\x9f\x3c\xcd\x2f\x82\x5b\xcd\x66\xbd\x92\x0d\xf5\x8b\xa6\x28\xff\xfb\x4d\x62\x74\x0d\xad\x05\x0b\x15\xd1\x70\xd3\x33\x2c\x6c\x8a\xd3\xb3\xf7\x40\x2f\xe4\x7a\x3e\x86\xc4\xf7\x49\xe7\xf0\xab\x9b\x27\x0f\x9f\x9d\x64\x60\x8d\x6b\x8e\x37\xeb\xb5\xe0\xbd\x18\x15\x7a\x42\x0c\xf4\x56\x47\x41\x78\x93\x88\x6e\xdc\xc6\xfd\xd7\x5c\x66\xbf\x36\xbc\x67\xc6\x4e\x85\xe0\x59\x7c\x06\x52\xf3\xdd\x9d\x9b\xf3\xc1\x15\xa5\xda\x62\x37\x00\xf0\xad\x3d\x73\x75\x15\x69\xe1\xe9\x36\x41\xf6\x48\xbd\x8d\x8f\x91\x74\x6f\xa6\x23\x17\x17\x9c\x61\xbe\x0c\x0f\x7f\xfe\xd6\x1c\x28\x1f\x37\x44\xaa\x65\x9a\xa9\x1a\xae\x9f\xcb\x9b\xd5\xfd\xc2\x41\x87\x2f\x3f\x6f\x0f\x29\xd1\xdc\x54\xf6\x96\x92\xb2\xd5\x34\xdf\xeb\x00\xe4\x77\xb5\x28\x2e\xd1\x36\xde\xcc\xff\x2a\xf0\x51\xaa\xf1\x39\x9b\x5d\x6c\x50\xb2\x61\x33\x53\xc8\xe1\x2c\x4d\x81\x30\x8f\x9d\x00\xe9\xfc\x72\x3c\xb6\x46\x16\xf2\x2e\xe1\x84\xc3\x7b\xa8\x94\x9d\x62\x65\x7d\x5a\x42\x3f\xe8\xf3\x09\x82\xe3\x67\xee\xbe\x64\x84\x24\x94\x82\xcd\x2e\x5e\x74\x98\x09\xcb\xa6\x8a\xfc\xd6\xeb\xac\x29\x96\xdc\x68\x14\xe5\x57\xd9\x16\x19\x81\x3f\x17\xd8\x7f\x33\x82\xc1\x8e\x45\x09\x3c\x6e\x28\x5c\x98\xeb\x56\x9a\x66\xa8\x37\x79\xe2\x18\x78\xdc\x9e\x9e\xc1\x21\x88\x7a\x93\xb3\x2c\x32\xcd\x22\xfd\x2c\x09\xb8\x06\x2a\x37\x8e\x06\x5b\x2e\x46\x5c\x9a\x0b\x67\xd8\x69\x70\x60\xd6\xee\x37\x16\x9c\x8f\x71\xdd\x59\xd6\xdf\xec\x4d\x91\x77\x12\x16\x0c\x68\x81\xa5\x13\xdf\x0b\xc7\x4d\x16\x72\x54\x7d\x32\x46\x55\x97\x81\x7d\xdd\x63\xc7\x44\xde\x00\x5b\x4c\xa1\xf9\x42\x01\x1b\x57\x63\x36\x16\xe8\x0a\x72\xb6\xba\x2c\x75\xff\x71\x66\xcb\xab\x4a\xc0\xe8\x8b\xe9\x59\xf7\x96\x1f\x69\xef\x97\x84\xaa\xca\xee\xb8\x55\x8e\x6f\x52\xd2\xc6\xe0\x89\x9a\x7f\xb9\x4f\x13\x5a\x43\x47\xbb\xe8\x27\x85\x1a\x00\xa3\x98\xa4\x83\x60\xcf\xbc\x46\x6f\x90\x60\x6b\xa1\xa3\x73\x24\x8b\xf2\xf3\x69\x7e\xe6\xcc\x01\x6b\x35\xbe\xef\x6b\x0d\xd9\x85\xed\xf9\x58\xb4\x70\xad\x1c\x23\xbe\xa2\x18\x7f\x0e\x5c\xb0\x98\x83\x24\x9f\x8b\x03\x8f\x50\x96\xb5\x79\xed\x7e\x11\x9b\xb1\x34\x42\x8f\x29\x7e\xc1\x6f\x1c\x62\x5a\x07\xd2\x19\x68\x3b\xbe\x48\xde\xe6\x7b\xc9\x8f\x44\x08\xfd\xc5\x94\xfe\x69\xcd\x20\x62\x6c\x50\x20\xa6\x44\x9e\xa7\xc8\xfe\x12\xa2\xe5\x49\x08\x5b\x9c\xbb\x99\xf0\x00\xf5\x43\xdd\xe0\x3c\x52\x2d\xa6\x29\xa8\x4f\x2c\xe2\xf3\x07\x6e\x30\x79\x70\x59\x65\xb1\x5e\x47\xaa\xff\x8d\x5f\xd7\xf3\xae\xc1\x92\x4a\xe6\x0a\x58\x6d\x5d\xdc\x11\x27\x1f\x65\x91\x32\x74\xbd\xf4\x2a\x90\x79\x42\x2e\xe4\x65\xe9\x1d\x22\x06\x8b\xd1\x73\x60\x28\x69\xfa\x20\x18\xb6\x91\xf7\x91\xca\xa9\x1b\x0d\xbf\x31\xce\xa9\xcc\xdb\x96\x19\x8c\x5e\x0e\xf9\x98\x3f\x29\xfd\x9e\xde\xe4\x6a\x13\x4e\xd4\xa3\x22\xd4\xdb\x38\xa3\xc0\x9c\x29\x16\x0f\x68\xc8\x21\x95\xb5\x59\x7a\xca\x43\xfb\x97\xf9\xf1\x83\x88\x20\x41\x85\x80\xaf\xe7\x48\x1f\x0f\x4f\xbd\x30\xdf\x4b\xf5\x2d\xb4\xe9\x19\x2e\xab\xcf\xcf\x62\xa0\x07\x3b\xec\x3c\x7c\xe1\x47\x74\x46\x09\x23\xb1\x07\x94\x28\x8c\xb0\x4e\x93\xb5\x23\xe4\xd2\xee\xab\xa1\x7f\xe6\x58\xd7\x76\xfd\xb0\x14\xd1\x6a\x77\xd0\x6d\xed\x5e\x25\x30\x9e\xd6\x0c\x06\xbc\x9b\xbf\xae\xf7\xe3\xed\xca\xb4\x0e\x54\xec\xf0\x7d\xd5\x1b\x3e\xf9\xa8\x2a\xb4\xb9\xb3\xe9\x37\x9f\xa7\x8e\xe5\xfc\x5c\xde\x7e\x05\x88\xea\xc3\x8d\xf5\xa9\xf7\x44\x8c\x47\xd3\xe2\xe5\xe2\xbe\x56\x45\x8d\xf4\xd9\x54\x0f\x68\x2e\x7a\x13\x7e\xad\xcd\xa8\xd0\x61\xa8\xf1\x37\xe0\xfc\x97\xb9\xf4\x13\xa3\x02\x03\xce\xd0\xf4\x8c\x94\x72\xc2\x43\xa6\xca\x13\x4a\x07\x71\xbb\x8c\xb5\x3d\xce\x8f\xb6\xb8\xea\x5b\x18\xfa\x64\x2b\x78\x2c\xcf\x7c\x00\x47\xe4\x33\x9b\x26\x61\xf9\x56\x9d\x7f\xc7\x63\x1d\xad\x4b\xdc\x36\x2e\x24\xa3\xe1\x20\xae\xfa\x26\x51\x65\x44\xe9\x1b\xfd\x9b\x59\x30\x49\x29\x42\xad\xb5\x9d\xe0\xa6\x36\xd8\x43\xa3\xed\x42\xce\xa0\xa2\x2c\x7b\x0d\x71\xfe\xd2\x4d\xc7\xf6\xe1\x66\xb1\xa8\xb3\x25\xa9\x0d\x10\x25\xc6\x8d\x6a\x15\xf7\x16\xd1\xff\xa8\xfd\x5c\x4a\x6e\xa3\x23\xa8\xc4\xa8\x01\x09\xfa\x55\xce\x3d\x87\x9b\x63\x68\x70\xa7\x5c\xce\x5f\x82\xc8\xbf\x6c\xbb\x9f\x78\xa7\x0f\x1b\x00\xff\x6c\x96\x68\x5c\xa4\x61\xa0\x65\x85\xde\x1c\x37\xd7\xeb\xaa\x68\x4c\xae\x76\x8e\xcc\xc4\x63\x30\x4a\x7d\xd7\xb5\xf9\xb6\x3c\x56\x00\xe8\x60\x81\x6a\x69\x4d\xbc\xf7\x15\xee\x74\x6a\x85\x26\x38\x2a\x5d\xff\xf3\x25\x77\x63\x68\x13\x11\x41\x15\xec\x84\x26\x86\x67\xf9\x73\x50\x5d\xf2\x5a\xd5\x50\xff\xf9\x78\x54\xa4\x6b\xc1\xcd\xe6\x63\x15\x7b\x91\xcb\x6a\x87\x69\x7e\x1e\x78\x6c\x6d\xfb\x91\x5e\x7c\xd0\x1c\x7d\xad\x9b\xe6\x22\x09\xba\x6f\xdf\xfb\xbd\x4b\x64\x17\x8d\xc8\x69\x30\xf2\x26\xee\xa2\x2d\x8c\x55\x9f\x61\x91\xe5\xbd\x83\x0e\x48\xf7\xf7\x69\xff\x8d\x48\x71\xb3\xc8\xe4\x66\x7a\x6d\x27\x9d\x49\xcc\xa1\x1c\x3a\xab\x50\x2e\x58\x95\x2b\xe6\x26\xef\x94\xc9\x29\x0d\x16\x8f\xff\xca\x7c\x19\x86\xc2\xb1\x5f\x87\xda\xaa\x27\x2c\xa5\xfb\x06\x3d\x2b\x77\x93\xb6\xa4\xf3\xcd\x97\x5a\xd5\xe7\xb7\x6f\xe0\xe5\xd3\xff\x1e\xf1\x7f\x39\x38\x7e\x10\x18\x58\x38\xf0\xf6\x16\x66\xa2\xaa\xd0\xed\x87\xbc\x3c\x3f\xb5\xdd\x5b\x7a\xfb\xdb\x27\x5c\xea\x22\x2b\x25\x6b\xed\xf9\x04\x99\xdf\x5b\xee\xba\x7d\x90\x20\x12\xf3\x3a\x59\x87\x9e\xbd\xa8\xf9\xec\x85\xd5\x76\x86\xcc\x84\xab\x60\x5e\x78\x3e\xd9\x8c\x96\xef\xb3\x87\x66\x94\xf9\xab\x6d\x90\x9b\xf0\xf3\xfd\x09\x07\x46\x41\xb9\x0b\xbc\x0a\x8b\x8c\x31\xca\x7b\x71\xb4\xef\x85\xd6\xed\xfb\x0f\x52\x3f\x53\x7c\x30\xc6\xc3\xed\xc0\x96\x0e\x61\xf9\xa3\x09\x0e\xfd\xb4\xb7\xd8\x92\xf5\x64\xe7\xa3\x5a\xd2\x96\xe8\x0c\xb0\x21\x52\x34\x5e\xb8\x82\x94\x13\x1e\x74\x46\xc5\x7f\xa1\xc0\x7f\x7a\x44\x10\xe8\xf6\x18\x2c\xe0\x2c\x50\x8d\x38\xf2\xe1\x7c\xe0\xd0\x17\x5c\x96\x13\x61\x42\x93\x42\x5c\x95\x7d\x71\xe6\xea\x0d\xfb\x7b\xe5\xa1\x38\x0f\x36\xd4\x16\x0c\x39\xf5\xe3\xaa\x2e\x43\x38\xd4\x19\xd5\x6a\xf8\x70\xd3\x5f\x77\xef\x30\x52\x51\xdf\x84\xc5\x7a\x1d\x84\x5f\x50\x0d\xb6\xe4\x37\xa0\x80\x15\x09\x7e\xcf\x84\xbe\x7d\x1b\x61\x77\x4f\xd7\x7f\x26\x45\xa4\x24\xb5\xa3\xc9\xd9\xb7\xe9\xcc\x9b\x70\x2d\xb4\x2c\x14\x71\x79\x08\xf2\xc6\x9e\x27\x4d\xe1\x0e\xe8\x17\xfb\x71\xeb\x5d\xa4\xf5\xec\xa1\x6a\x70\xe0\x35\x1a\x50\xe8\x90\x9b\xbd\xd6\x88\x9f\xd8\x57\xd9\xd5\x07\x19\x40\xbf\x51\x92\xef\x8f\xb4\x3b\xa5\x5c\x93\xb5\xa3\x10\x8f\x8d\xc9\x89\x62\x37\x4a\x25\xe1\x88\xe2\x38\xa9\x39\x87\xd1\x45\xc0\xb6\xb1\x62\xfb\xca\x58\xa9\x5b\x08\x99\x75\x70\xb5\x55\xf1\xdf\xb5\x3f\x78\x3b\x45\xe0\x0b\xae\xec\xf2\xc8\xcb\x9e\x74\xc6\x9a\xd0\x26\xff\x3d\x0b\xff\x72\x4c\xfc\x20\x30\x78\x3e\xe0\x59\x58\xae\x62\xfb\x58\xdd\xe1\x21\xb9\x83\xb9\x4f\x12\xaf\xf6\x49\x9f\x16\x91\x9f\xca\x76\x70\xfc\xa1\x9c\xde\x65\x60\xa9\xd6\x10\x2c\xa4\x62\x46\x9e\x83\xf6\xed\x54\xd2\x82\xdf\xa7\x5b\x35\x5b\xb8\x80\xa1\x7a\xcc\xef\x28\x90\x22\x8d\x54\x77\x79\x73\xc4\x9a\x51\x2a\x0e\xfc\x3d\x17\x9d\xb8\x5c\x2b\xef\x91\xa4\xeb\x0d\x5d\x18\x1b\x72\x8a\x0e\x84\x51\x8f\xd6\x28\xf5\x35\xa2\x47\x74\x28\x7c\x58\xe4\x03\x9b\x49\xcb\x7e\x42\x4e\x4b\x46\xf0\x27\x7f\xaf\x1f\x43\x6c\xa8\xf0\xc3\xaa\x88\x37\x9e\x5f\xe4\x72\x22\x1b\x77\x52\x38\x3d\x0f\x5d\xfa\xc7\x5f\xba\xf4\x3f\x2d\xa4\x38\x16\x1c\x27\x00\x54\xc0\x50\x90\x0e\x0b\x6a\x24\x5c\xdc\x9a\x3f\x68\x50\x21\xce\xc2\x29\xc7\xb8\x7d\x43\xf6\x33\x81\xba\x99\x60\x35\xbe\x44\x4f\x00\x69\x6e\xf6\x02\x8a\x2c\x2f\x92\xce\xbe\x37\xe8\x94\x58\x3d\xd2\x66\x7c\x54\x52\x5e\xd7\x4d\x9a\x39\x31\x7f\x3f\x2f\x28\xf2\xa7\x0c\x16\x4c\x4d\x8d\xd2\x7e\x9b\x5d\x63\x8a\xb8\xee\xe7\x72\xfe\xc6\x05\x76\x3d\x6d\x01\x7e\x47\x35\x3e\x22\xab\x48\xf0\x33\x99\xfa\xe7\xeb\x02\x12\x30\x21\xf2\xb4\x3c\x03\x7f\x30\x59\x66\x85\x12\xdf\x96\xd9\xf2\xd9\x4c\x5f\x33\xbc\xc3\x67\x03\xe6\x4b\x64\xc7\xe0\x10\xdf\xe2\x21\x10\x2e\x4a\x7b\x4f\x5b\x97\xed\xb3\x15\xc5\xc0\x3f\x49\x6a\xd3\x89\x94\x78\x6d\xc7\x49\xd2\x2b\xe1\xe3\x9d\xae\x26\xac\xfb\x3d\x4c\x7c\xeb\xd2\xf7\xff\x01\x15\xdd\xac\xc4\xca\xa7\xa1\xb3\x76\x93\xb0\x13\x18\xc5\x4c\xb5\x2f\x8a\xaf\x3d\x93\xcf\xf6\xde\x45\xbe\x12\x51\x96\x43\xfd\xb0\x95\xe7\x07\xb9\x7d\x7c\x7c\x4c\x26\x07\x80\x0a\x87\x80\x06\x23\x42\x1b\x71\x8f\x78\x19\x42\x5c\x22\x9d\xe1\x74\x7d\x94\xf5\x86\x59\x5d\x6c\x6b\x39\xbd\xa0\xad\x15\x12\x00\x8d\xeb\xf4\x33\x0d\xd6\x7d\x45\x40\x51\xfa\xad\x53\xfd\x1a\xaa\xf1\xe8\x99\x89\xa7\x62\x4c\xca\xce\x9b\x8e\x8e\x07\x2c\x15\xe4\xe7\xcd\x40\x50\xe3\x33\x4a\x5a\x60\x29\x0f\xd3\xe2\xd4\xe1\x78\xaf\x2d\x95\xd1\x5b\xfd\x1e\x27\x3f\xdd\x7b\xc4\xd8\x2f\xfb\x0f\xb7\x2c\x2d\x04\x74\x6c\xb6\xd1\xdf\xee\xcc\xe4\x1a\xf3\xbd\x44\x1c\x09\x6d\xf7\x1e\x43\x5b\x71\x9d\x46\xd7\xf7\xbc\x6b\x28\x1a\xff\x28\x36\x22\x6e\x7a\xfb\xb4\x08\x4a\x17\x50\xce\x0a\xf2\x2e\x7a\xf1\x9e\x93\x13\xe4\xf9\x81\x57\x0e\x3a\x69\xa9\x4d\xce\xfe\x5c\x30\x22\x22\xc1\x5a\x5a\xa8\x87\x20\x28\xdc\x3b\xba\x60\x4e\x7d\xe8\x05\xbf\xb4\x86\x21\x25\xd2\x4d\xa7\x12\xb7\x16\xf5\xd5\x3c\x93\x32\xfe\xc4\x82\xa4\x3a\x59\x01\xc8\x2f\xfb\x75\xf7\xeb\xeb\xcc\xf9\x23\xdf\x6f\xa8\x5b\x87\x99\x8b\xc6\x8b\x09\x97\x1f\xbc\x66\x12\xa3\x56\x88\x93\xcf\x3d\xcb\x5a\xa9\xcc\x41\x55\xd9\x08\x27\xf6\xf3\xaa\x52\x7b\xe2\x35\xab\x21\xa7\xee\xfc\xd3\x8e\x66\xbc\x18\xc7\xd8\xed\x7e\x5f\x11\x0a\x57\x62\x24\x4f\x22\x80\x3a\xe7\x25\xed\x03\xb2\x9a\x35\x42\x1a\xcf\x7b\x9a\xc5\xb3\x5f\x37\x59\x3e\x2b\x8c\x7c\x65\xa4\x94\x64\x53\xdd\xff\x99\x44\x26\x9f\xe6\x69\xfe\x38\x45\x72\x24\x3e\x58\xec\x81\x94\x89\x6a\xdf\x4f\x44\xaa\x56\x79\xdd\x13\x84\xd5\x31\x8e\x0f\xde\x01\x9f\x35\x09\x7a\x58\xc1\xfc\x36\x7a\x7a\xc8\x4c\x40\xc0\xf5\x18\xf7\x04\x56\xe4\x12\x6e\x55\x81\x0a\x2e\x94\xf3\xf4\xb9\xbf\x4a\x11\xea\x9a\xc8\x58\x4b\x3f\xc0\x84\x30\x51\x42\xd4\x66\xad\x23\xd3\x7c\x94\x8e\x16\x98\x0b\x0c\xd3\xd1\xf4\xb2\xf8\x42\x2c\xba\x62\xd9\x35\xd8\xf1\x88\x65\x93\x07\x24\xe2\x0d\x39\x6b\x2d\xb8\x93\x8f\x72\x6f\x7d\xa5\x66\x1a\x5b\xe9\x49\x84\x45\x08\x8b\xf9\x66\x24\x7f\xcb\x61\x0b\x43\x95\x44\x55\x02\x56\xba\x46\x43\x39\xaa\xa9\x8b\x85\x31\xc7\x20\x16\x0d\xb6\x1a\x18\x0a\x2d\x6e\xad\x71\x76\x33\x96\xcd\xfb\x96\x39\x74\x2f\x96\x51\x0c\x80\x8b\x98\x5a\x3a\x9c\x36\x43\x99\x2a\x5c\x26\x5f\xdc\xd4\x5d\x24\x4a\x4a\x9a\x23\x4e\x58\x9b\xce\x65\x76\x03\x61\xa9\x95\x9c\x4e\xc0\x17\x45\xb9\x05\x79\x35\xbe\x2c\xec\x69\xdc\xbe\xa5\x51\xd2\x9a\x97\x2a\x44\x85\x8a\x94\xf0\x01\x8f\x16\x1e\x0a\xd7\x68\x1d\xe9\xaa\x41\x80\x68\x91\x88\x57\x83\xe0\x4d\xbe\x40\xf3\xec\x5c\xef\xc6\xde\xa4\xe5\xaf\xcc\xf4\x6b\xae\x21\x83\xc9\xaa\x88\xfb\x52\x9d\x0a\x38\x58\x40\x55\xf4\x9e\x42\x3f\x0e\xa4\x7d\x2a\x63\xbd\x51\x03\xda\xf0\xd8\x34\x3c\xfe\x5a\x84\x1b\x7e\x26\x8a\xfc\x4e\x94\x38\x75\xa4\x19\x80\x0c\x80\x75\x32\xec\xe7\x0e\x9b\xc1\xe3\x14\x3d\xda\x99\xa7\x87\xa3\xc2\xba\x23\x6d\x38\xeb\x66\x6e\x42\xc0\xef\x15\xb3\x28\x33\x50\x0d\xce\x1f\x77\xfe\x0b\xaf\xcc\x8f\x48\x46\x9a\x5c\x44\x7a\x72\xd8\x55\xff\xa7\xc7\xb3\xae\xb9\xc9\x8f\x6d\x1e\x7d\x6a\xcb\x27\x32\x91\xe0\x49\x49\xbc\xd4\x6f\xca\xcd\xee\x51\x1f\xc6\x43\xa0\xe7\xa3\xb8\x7e\x4d\x40\x78\x11\x8e\xd1\xee\xf3\xf6\x4e\xa0\x56\xaa\xf8\xad\xbb\xd3\xd3\xa6\x32\x67\x08\x35\xd5\x6d\x8f\x57\x3d\x5f\xad\x9f\xa5\xd5\xe7\xba\x4a\x53\xab\x10\x82\x6d\xa6\x22\xa2\xae\xc2\xd9\x42\x72\xef\xd9\x7b\x52\x55\xe6\xec\xb3\x66\xbb\x34\x7b\xb8\x30\x3c\x21\x27\xe4\xe5\x3e\xc5\x84\x50\x10\x49\x57\xd7\x07\x9f\x09\x91\x3e\x7c\x54\x4a\x2f\x00\x7d\xe8\xaf\x8b\xd0\xaf\x64\x0d\x2a\x46\x2a\xbd\x43\x26\xdd\x91\x52\x57\x3e\x92\x88\x1e\xa3\xde\xed\xfb\x73\xe3\x7c\x40\xb6\x56\x2e\x03\x6a\x7a\x25\xea\x3f\x5d\xc7\x76\xb1\xec\x30\xdc\x7b\x19\x47\x57\xc9\xb8\xb6\x48\x7c\x98\xe5\x1a\xa7\x1e\x79\xbb\x1a\xc9\x62\xc6\x91\x04\x94\x4f\xff\x65\xf5\x2c\x7a\x1e\xe9\x83\x5a\x03\x77\xfe\x54\x06\x4f\x3c\x7b\xea\x3d\x6a\x49\xac\xf5\xde\x04\x45\x07\x91\xcf\x1b\x35\xa0\x24\x6b\x5d\xac\x5f\x16\xff\x8e\x12\x8b\xc0\xce\x33\xd7\x76\xf9\x3d\x3b\xcb\x9d\xeb\xde\x49\x33\x81\xd3\x40\xe9\xd3\x1a\xce\xab\x41\x6e\xf0\x4d\xe8\xbc\x85\x3e\x0e\x02\x55\xc1\xc5\x94\xcd\xba\xc3\x73\x47\xf7\xb0\x37\x94\xd5\x1e\x9b\x27\xf0\xd6\x83\x67\xbb\xcf\x44\xce\x1f\x54\x15\x7d\x7a\xcb\xc1\xc6\x35\x55\xfa\x67\xe2\xd6\x16\xce\xf9\x76\xe9\x55\x5d\x3e\x41\xff\x61\x89\xbe\x02\xb3\x7b\xf7\xf1\xb6\x68\xe3\xd3\xa8\x01\xd9\xce\x21\x42\xec\x51\xcf\x7c\xbf\x4d\x15\x91\x13\x6c\xf0\x85\x73\x60\x45\x0e\x7c\x3b\x44\xce\x88\xda\x0d\x78\x1e\x44\x4b\x0f\x1c\x95\xf6\x99\xf5\xfe\xa2\x83\x74\x9a\x63\x77\xb2\x66\xc3\xdc\x17\x48\xde\xc9\xfd\x61\x2e\x48\x55\xb4\x26\x03\x10\xea\xd4\x46\x33\xa0\xd6\xf9\x25\x15\x8e\x88\xd6\x33\xfd\x72\xf3\xcc\x0a\x62\xe5\x8d\x48\x85\x65\xb1\x98\x81\x1f\x3f\xa4\xd5\xf3\x5c\xd2\xe9\x02\x36\x4b\xc1\xc6\x4d\x50\xbf\xcc\xaf\xfc\x94\x22\x73\xaa\xe3\x28\xab\x67\x26\xe8\x84\xde\x0b\x2c\x60\x61\xcc\xce\xcb\x4b\xca\x1d\xc0\xb3\x57\xc5\x33\x03\xf3\x3f\xef\x8f\x9f\x3a\xae\xb2\x7f\xc8\x75\xbf\x7d\x57\xaf\x7e\xbd\x9e\x97\x82\x5e\xfe\x7e\xfd\x28\x64\x28\xde\xde\x1f\x82\x97\x55\x00\xf0\x20\xd2\x89\xa7\xa5\x34\x7b\xa2\x7e\xa0\xcc\xa6\x91\x22\xcc\x0c\x0a\xc3\x2c\xf2\xdb\x07\xe0\xa8\x63\x46\x9e\x1a\xe1\x5e\xfb\x82\xae\x56\x12\x53\xf8\x4f\x7e\x77\x64\x87\x67\x82\x8d\x62\xfd\x4d\xab\xeb\xb3\x97\x50\x5e\x28\x2a\xfb\x87\x4b\xef\x18\xa5\xb8\x60\x8c\xe6\x00\xd1\x75\x5c\x3b\x91\x1e\x41\x8b\x4f\x21\x4a\xc7\xbb\xae\xfc\xf2\xa4\xd5\xb0\x34\xaf\xdd\x96\xd0\x0f\x48\x4e\x1b\xec\xe3\x5e\x55\x54\x83\x1b\x90\x8d\x83\xc8\x5f\x88\xcc\xde\xdd\xc7\x29\x13\x11\xb4\x7e\xf3\x2b\x07\xf3\xcb\x98\x90\x6c\xa2\x98\xff\x4d\x3d\x01\x72\x4f\x18\xc1\xd3\xa9\xb6\xbe\x95\x58\xaf\x77\x80\x84\xb3\xa1\xa0\xd2\x7a\xe4\x30\x3c\x57\xf2\xe9\x31\x86\x4a\xa3\xbb\x51\x80\x51\xc3\x59\xec\x79\x00\x8a\x8f\xf9\x84\x70\xed\x6a\x99\x38\xbc\xbe\x7a\xc1\x93\x8b\xf8\xfb\x18\xc9\x31\xe8\x0b\xec\x57\xc5\x29\x22\xe1\x72\x2b\x35\xc2\x83\x61\x00\x7f\xb9\xe2\xa5\xd6\x44\xe4\x92\x71\x3a\x0a\xc4\x35\x5e\xea\xbc\x3a\x40\xe4\x1b\x9e\x9b\x19\x40\xc9\x1f\x2c\xba\x7c\xfb\x2c\xaa\x0c\xec\x00\x7d\x01\x19\xd8\x35\x55\xee\x8c\x79\x07\x8f\x00\x6d\xd6\x45\xf4\x27\xff\xed\xc4\x97\xb8\x92\x0c\x4a\x9f\x87\x9b\x30\x68\x7f\x7e\x0a\x10\xd4\xf5\x68\xe9\xae\xca\x65\x8a\xba\x3c\xc4\x7a\x91\xa1\xec\xb2\x15\x8d\x5e\x24\xe6\x0f\x43\xfb\x32\xb2\x5d\x7e\x43\x02\x6d\x08\xec\xcc\x09\x77\x6d\xea\x90\x6f\x47\x61\xfe\xae\xbe\x51\xbc\xba\x90\xe3\xfe\x17\xfd\xc4\x15\x3b\xd1\x94\xf1\x47\x33\xc4\xb2\x3c\xa3\x4d\x80\x32\xda\xeb\xd5\x8d\xee\xfa\xe7\xe4\xd9\x2e\xa6\xdd\x8a\x74\x98\xea\x1f\xb9\x55\x74\x57\x77\xc9\xfc\xb4\xaa\x77\x6b\x41\x27\x44\x93\x60\xf1\x3f\x26\x3d\xf7\xac\x5a\xdd\x80\x23\xcc\xcf\xe4\xbf\xd4\x0a\x7e\x72\x86\xce\x4f\xf1\xcc\x69\x65\x86\x4d\x4a\xe6\x5f\xa0\x7f\x38\x02\x00\x18\x93\x86\xa5\x9b\x9a\x05\x09\x71\xc1\x46\x5a\x0e\xad\x1e\x9b\x02\xa2\x9e\x72\xaa\x79\xa1\x15\x41\x0f\xfb\xaf\x92\x68\x6b\x74\x32\x20\x61\x39\xe0\x32\xf2\xd6\xa9\x57\x5d\xc4\xc6\x05\x71\xcb\xea\x2d\x31\x4a\x95\xff\xeb\x5c\xfa\x8f\xfe\xa6\x8c\xc4\x0d\xa3\xb1\xef\x08\x80\x9c\x71\xbf\xb3\x53\x94\xf1\xd2\x2c\x1b\xdb\x12\xe6\xad\x8d\x64\x8e\xa6\xe9\xd5\x62\xb3\x8a\xcb\x2c\x6f\x24\xd2\x2c\xfe\x01\x4a\x80\xda\x3b\xdd\xaf\x3e\x47\x97\x98\x96\xb2\xbc\x7b\xb2\x21\xdf\xc4\xfa\xa6\x45\x03\x9d\x81\x01\x31\x6b\x18\x47\x93\xa8\xa6\x3d\x5a\x7a\xff\x6f\xd8\xf9\x2f\x83\xee\x27\x06\x83\x03\x70\x34\x3e\x3a\xd1\x70\xe7\x5e\x89\x50\xe7\x1c\xb0\xed\xfa\x1a\x60\x7a\x4c\x5f\xfe\xf9\x2e\xc0\xf2\xd5\xf2\xc0\x96\x66\x6d\x87\x10\xda\x08\x24\x42\x97\x7f\x97\xa7\xd3\x54\x26\xbe\x74\x60\xdd\x67\x34\x5e\x26\x4a\x72\xf5\x24\x7f\x5d\xcf\xa4\xa1\x02\xe1\xac\xec\x54\x3d\x86\x03\x96\x95\x64\xae\x34\x8c\x6f\x99\x38\x90\x5a\xf3\x82\x0e\x81\xd6\x43\x59\x77\x18\xed\x2c\xf0\x4b\x42\x0a\x09\x42\xcb\xee\xf1\xa2\x75\x11\xf0\x12\x36\x2d\x51\x32\xb9\x43\x3f\x57\x69\xfe\x89\x8e\xad\x80\x16\x5d\xa5\x2e\xa3\x2b\x6e\xe9\xf7\x66\x9f\x2c\x71\xa2\x1d\x6c\x07\xfb\x5f\xd7\xf9\x9f\xd6\x1f\x02\x81\x92\x06\x5d\x67\x25\x55\x6d\x6f\x72\x1d\xbe\x98\x12\x87\x7d\xad\x26\x08\xec\x87\x66\x4a\x17\x7c\x92\xb8\xa3\x5b\x2d\x19\x05\x5b\x78\x6e\x25\xb5\xff\xd4\x3e\x59\xee\xc2\x62\xc7\x99\x9d\x43\xbc\x37\x23\x7e\x91\x0a\x1b\xa6\xb7\x69\xfd\x4b\x16\x55\xfa\x37\xa5\xfb\xe7\x8b\x2a\x5a\x7c\x40\x74\x4a\xe0\xed\x4c\xe4\xf2\x94\xdc\xfa\x87\xb1\x62\xf2\x9b\xeb\xf0\xa4\xb8\xec\x81\x43\x1f\xd2\xec\x1a\x47\x5b\xfb\x38\x3d\xb5\x50\x90\xbd\xbf\x59\xb0\x38\x02\x39\x73\x94\x4b\x44\x90\xba\xf8\x82\x76\xce\xf6\xfb\x6b\xb9\xfe\xac\x98\xdc\x57\x0a\xa8\xe8\x8f\x99\x8e\x7a\x7f\x1f\xf9\xfe\x65\xae\xfc\x20\xb9\x58\x50\x70\x80\xef\x2c\xad\xf0\x72\xab\x1b\xf3\xc4\xba\x6e\xee\x86\x65\x9f\x77\xc1\x48\xf9\x3c\x33\x46\x65\x7a\x4e\x4f\xdc\x53\x7a\x1e\x7b\xc2\x1c\x04\x6d\xd8\x35\x37\x0b\x60\xa7\xe8\xcf\x7e\xa4\x7d\xb6\x98\xf9\xa0\x2e\x65\x6f\x4a\x20\x1d\x47\x4a\x6e\x2d\x7b\x53\x34\x46\xf2\x5a\x17\x64\x9a\xd1\xc3\xf1\x28\x0c\x20\x4a\x33\x93\xc8\x84\xe3\xbf\x77\x97\x60\x28\xe6\xb8\xc8\xc1\xe7\x96\x83\x9a\xf4\x84\x9f\xa3\xd8\x37\x06\xf3\x07\x0b\x59\x10\x6b\x71\xec\x4d\xb3\x93\x29\x5e\x1f\x0c\xa1\xe5\x8b\xd8\x97\xbe\x62\x41\x3e\x61\x7b\x6e\x86\x37\xeb\x12\xdc\x5e\x65\x0e\x92\x96\xf0\x28\x59\x5f\x13\x9f\x26\x0d\xf2\x1f\xf5\x9a\x4f\x48\x28\x95\x0b\x98\x17\xa9\x6e\x2f\x7e\x72\x44\x7b\xa7\xfe\x31\x53\x13\xfe\xef\x43\xf6\x3f\x4d\xa1\xb8\x8f\x3e\x98\x47\x81\xf4\x9d\x5c\x52\x80\x09\xf1\xb0\x66\x2b\x36\xee\xde\x45\xe2\x07\x75\x6e\x26\xba\xd5\x74\xc4\xb2\x39\x57\xb3\xd9\x7d\x37\x0b\x48\x8c\xdb\xca\xd1\x6a\x97\xb0\x2d\xa0\x62\xdc\x3d\xcc\x35\xd5\x96\xb9\x5f\xa8\x6e\x25\xc3\x68\x72\x9c\x1d\xef\x9f\xdf\xd3\x41\x97\x1c\x06\x89\x53\x75\x9b\x6e\xf2\x7e\xb6\x05\xfb\x22\x8c\xed\x95\x1c\xf9\x71\x0e\x22\xc4\xcf\xdf\x63\x49\xfc\xc9\x18\xa7\x67\xdc\xbf\x17\x07\xfb\xb1\x71\x97\x38\x28\xe0\x90\x5e\x90\x95\xcc\xb9\x62\x35\x8e\xcd\x23\x63\xf7\x21\xff\x80\xbe\xd5\xc5\xaa\x24\xad\x6f\x32\xf2\x94\x7c\xf8\xfb\x65\xff\xb2\x9c\x7e\xe2\xb0\x58\x60\x5d\xb7\x0f\x4b\xa3\x93\xfa\x84\x02\x77\x2d\xe8\xf2\x4a\x47\xa9\x81\x5a\xd1\xd7\x10\xfa\x01\x7c\xc3\x73\xce\x7b\x1f\xb3\xca\x30\x55\x90\xed\x66\x00\xe7\x18\x6c\x2a\xbe\xe4\xee\x69\x95\x82\xec\x24\x04\x7f\x24\xb4\x48\x49\x34\x79\xdb\x16\xc0\x64\x14\x8d\xe2\x28\xcf\x06\x6e\x84\xee\xee\x4f\xf8\xed\x85\xac\xd3\x09\x44\xf5\x96\x19\x03\x3e\x75\x69\x7b\xe4\x2c\x35\xbb\x2d\xe6\x0a\xf1\xa4\xf2\xf7\x87\x03\xc4\x80\x68\xc1\x67\x9a\x67\xfe\x6f\xe2\xf7\x0f\xbb\x10\x83\xb8\x34\x1f\x89\x3f\x8e\x0a\x1a\x6a\x8d\x43\x59\x97\xaf\xbe\xce\x51\xe6\x1f\x2d\xfb\x7b\x29\xff\x65\x92\xfc\x20\x28\x48\x50\x60\x82\xe8\x00\x0d\x77\x4d\x7a\xc4\xa3\x34\xb6\xfa\xe3\x61\xaf\xd6\x2b\xee\xdb\xe4\x4c\x91\x92\x22\x64\xcd\xaa\x8e\x77\x55\xde\x1f\x17\xd0\xc1\xf8\xac\x27\x09\x47\xe1\x7d\x3d\x24\x90\xdd\x81\x8a\x29\xfa\x43\x5f\xfd\x0f\x23\xb8\x41\x46\xed\x37\x29\x9d\x7d\x4c\xd0\xac\x06\x20\x00\xd0\x96\xb0\x62\xb0\xf5\x7c\x69\xfa\x4f\x30\x95\x8c\xef\xe5\xf7\x7d\x63\x3a\x36\xff\xbb\xc3\x95\x07\xbb\x09\xc4\x2c\xa9\xea\xf7\x29\x80\x68\x42\xb0\xa1\x49\x52\xd3\x5e\xc8\x2b\xfa\xb3\x0d\xc6\x47\x7a\x3f\xc9\xcb\x92\xb4\xa1\x33\x87\x17\xee\x61\xfc\x6b\x4b\x4d\x44\x8d\x97\xfe\x58\xff\x57\xf0\xf6\xfc\xdb\x87\x00\x32\x51\x32\xc1\xe2\x4a\xd5\xed\x04\xf1\x57\xd1\xc6\x18\xf6\x0b\x67\x89\x95\x17\xcd\x9a\x0f\x46\x0d\xfa\x22\x7e\x90\xc7\xab\xff\x3f\x94\x7b\x1a\xba\xfe\xa5\x3a\x6d\x3d\xe6\xee\x1f\x6d\x7e\xa8\xe7\x46\x53\x4b\xb1\x47\xd9\xca\x4d\x67\x79\x26\xaa\x6b\x29\x28\x77\xfe\x86\xdb\xef\x40\x5b\xde\x59\x7a\x8b\x18\xa9\x11\x13\x8c\xc5\xea\xf0\x39\x3b\x8e\x55\x4f\x8b\x3f\x29\xdf\xbf\x23\x36\x63\x5a\x50\x84\x6a\x6b\x8a\xef\xcf\xd3\xaf\xd4\x46\x28\x28\xed\x17\xe4\x9c\x34\xae\x23\xbe\xbd\xe0\x1d\x6b\xc9\x29\x59\xe5\x17\x92\x61\xc9\x8b\x00\x49\x45\x4b\x1a\x11\x3e\x80\x01\x5d\x9c\x0b\xc7\xcc\x4f\xae\x69\xd1\x5d\x20\xfb\x28\x44\xc0\x7c\x1c\x11\xf4\xd1\x68\x76\x13\x8e\x30\xd9\x5e\x48\x55\x50\x57\xe9\x0c\x9c\x9f\x6b\xa5\x3a\xbd\x27\xf8\x28\x11\xda\xe5\xb5\x3c\xb7\x93\xe3\x1a\xca\x96\x0b\xe3\xd0\x5c\x12\x8f\x70\x4a\x7f\xc8\xab\xbe\xb1\xbd\xa7\xaf\xda\x0b\x6a\xdf\x98\x68\x6d\x76\xf9\xf0\xbd\x32\x05\x95\x07\x52\x9e\x96\x01\xcf\x8b\xf0\x49\xdd\x60\x6a\x55\xdb\x8c\xec\xb1\x51\x0f\xf8\xeb\xab\xbc\x64\x34\x0d\x22\x40\xfd\x24\x0f\xf5\xfe\xbb\x77\xef\x6e\x78\x4e\xc7\xf2\xa4\xe2\x1c\x8b\xa7\xb7\x80\x1e\xf5\xb4\x55\xec\xee\x93\xaa\x55\xc5\x8c\xd3\x37\x4d\xfd\x9f\x39\xf0\x79\x9b\xc6\xcb\xd4\x8a\x0d\xc6\xba\x02\x0a\xae\xcc\xf6\x10\x79\x44\xf2\x5f\x8c\x8b\xcc\xfc\x27\x42\xdd\xaf\x45\x9e\xd6\x6f\x40\xd0\x8c\x6f\x84\xd6\x2f\x43\x1d\x9b\xb5\x7c\x3f\x46\xfe\x4d\x1d\xff\x74\x73\xc4\xa9\x8e\xae\x6f\xe6\xc9\xee\x9a\xa3\xf9\x1d\xd9\x11\x88\x71\x70\xc3\xd5\x36\x9e\x17\x30\xf2\x5a\xc9\x96\xbf\x69\x8b\xe7\x33\x0b\x2f\xd0\xbb\x3f\x6a\xb9\x04\x9c\xf9\x1f\x95\xe1\x3d\x8e\x8a\x8c\xcf\x8f\x55\x52\x52\x32\xf4\xc8\x2e\x30\xbf\xad\x62\x33\x93\x43\x6f\x87\x41\xdd\x49\xdc\x2a\xba\x1a\x01\x0c\xba\x8c\xd4\x08\xbc\xa9\xfc\x78\x7e\x73\x61\xe9\x30\xee\x8b\x52\x71\x92\x06\xdf\x82\x17\x26\x05\x52\xe4\x73\x88\xb1\x9f\x47\x4f\x40\x4d\xe3\x5c\xeb\xb8\xdb\x94\x5f\xcb\x37\x7c\x7b\x05\x6b\x97\xd3\x11\x72\x52\x1b\xb3\x4f\xb8\x20\xb9\xf2\xae\x31\x10\x75\xae\x86\x26\xe6\x69\xa5\x38\x49\x5d\x73\xbf\x8f\x20\xd2\x57\x37\xad\x17\x37\x66\x0c\x94\xab\xb6\x90\x6f\xa5\xb6\xc1\x9d\xaa\xe2\x06\x3e\x2b\x40\xa5\xa3\x03\xc8\xea\x5a\x06\xb0\xb3\x77\x5e\x93\x06\x4b\xa2\x9a\xf7\x66\x70\x1a\x76\x5a\x13\xb8\x05\x5a\x17\xbf\x91\x5d\x64\xd8\xf1\x0d\x06\xc1\xbe\x75\xad\x69\x05\x18\xef\x34\xdf\xe0\xf2\x99\x72\x3a\x97\xe5\x48\xc3\xe6\x3c\x3a\x6d\x8b\x22\x28\x38\x95\x63\x9e\x22\xf9\xe8\x3b\x91\x83\x25\x97\x3d\xfa\xde\xac\x44\xa9\xd4\x46\x0e\xbe\x88\xe9\xe6\xc3\x9e\xc6\x96\xab\x0d\xdc\xe1\xda\x45\x25\xcf\xc2\xf6\xc4\x93\x3e\x06\xca\x2a\x40\xf8\xbe\x2d\xee\x43\x1b\xfa\x4e\x1a\x8a\xf6\x65\xc8\x0d\x14\xa9\xeb\x6b\x5a\x51\x56\x10\x20\x96\x9a\x17\x0a\x4f\x20\x74\x03\xf9\x07\xfb\x56\xfa\x9e\x25\x76\xeb\x36\x86\xe3\x14\xe3\xae\xb8\x76\x2d\x38\xdf\x96\x66\x09\x45\xb2\x91\x44\x3f\x94\xcc\xbe\x2d\x53\x24\x02\x57\x6a\xad\xbf\x85\x52\x00\xdd\x67\xe8\x17\x47\xf6\x5c\xde\xad\x05\xe1\x0e\x7c\x37\xc1\x7b\x5c\x85\x52\x0b\x63\x63\x33\xa2\x80\xa1\x40\x40\xb4\x24\xda\x9c\xaa\xf5\x08\xa6\xb5\x63\x98\xca\xb5\xac\x05\xb3\x48\x8c\xf6\xed\x9c\xc7\x80\xf8\x32\x7b\xec\xa3\xb0\x97\x8b\xb0\x0a\xd0\x01\xa1\xe7\xad\x54\xa8\x85\x10\xb1\xf4\x82\x52\x54\x7c\x28\x09\xd6\xab\xd7\x19\xbe\x42\xfe\x7c\x74\xd8\xb7\x8b\x65\xdb\xc7\x27\x40\x8b\xff\xd1\xf7\xae\x05\xd1\x77\xa7\xf6\x19\x8d\x95\x74\x8b\x09\xd7\x0a\x01\xe3\x45\x4c\x59\xad\xc2\xa9\xac\x31\x8a\x16\xf4\x10\x4f\x2c\xb0\x3a\xb4\xd4\x4c\xcb\x21\x04\xc7\xe0\xbd\xa0\x3a\x4b\xe2\x47\x0f\x43\x4b\x83\xd5\xd2\x75\x5d\xf1\xa5\x73\x2a\x0c\x4f\xde\x62\x17\x29\x20\xe7\x78\xf7\x70\x4d\x82\xba\x8b\x08\x4b\x62\x81\x9a\xb5\xa9\x01\x12\x95\x32\xf2\x21\x70\xd1\x78\x5f\x16\x59\xe2\xf7\x16\xbe\x36\x03\xb0\x53\x1a\x86\x05\xca\x39\x65\xd7\x77\x1e\xbf\xaf\x72\xcd\xee\xfd\x67\x45\x59\x69\xa1\xe3\x93\x4b\x2c\xdb\xa0\x46\x16\x62\x8c\x27\xdb\xc1\xa5\xa2\x2f\xdb\x69\x92\x8b\xb6\xd7\x47\xe4\x29\xe4\xa3\x7a\x61\x08\x71\x94\x5c\xc9\xc8\x17\x44\x7c\xfc\x7e\xd3\x5a\x9a\x05\xf5\x67\xed\x69\x54\x67\xf6\x81\xc8\x55\x37\xdd\x7a\x22\xdf\x4b\x0e\x71\xa7\x10\xcc\x8d\x5e\x5d\xad\xca\xda\x79\x79\xb9\xa2\x8e\xe4\x03\xab\xa9\x02\x70\x54\xd5\xc0\xf6\x48\x8a\x78\x7e\x7b\x97\x87\x6d\xe5\x4a\xe7\xd1\xb6\x00\xff\xd4\x0a\xc5\xd7\xca\xb8\x89\x54\xe2\xcf\x79\xb9\xaa\x8d\xc1\x4a\xbe\x5d\x53\xa6\xe3\xa5\x58\xe2\x0b\x63\xc4\xf9\x8d\xa8\xb0\x8a\x36\x9a\xbb\x01\x66\xd7\x84\x99\x95\x65\x12\xcf\x58\x3a\xb5\xb0\x9e\x4e\x95\x09\xac\x95\x58\xd6\xb3\xb2\x55\x46\xfe\x67\x2d\xd6\x8a\x37\x1c\xc9\x49\x6a\xa3\xeb\xf4\xaa\xca\x3d\xa6\xb5\x07\xa1\x87\x8d\xbf\x81\xc7\xdc\xf0\x9f\x59\x5e\x96\x1f\x6a\xba\x77\x6f\x4a\x9e\x45\x65\xc7\x91\xac\x7e\xbc\x50\xc5\xb7\xee\x88\xe1\x77\xde\xb6\x8e\xb3\x00\x12\xc5\xd2\x0c\xe0\xec\xd1\x8f\xc5\xb1\xbf\xa3\xb4\xf9\x64\x64\xd1\xef\xf4\x8a\x97\x39\x5a\x9b\xf5\x48\xb6\x84\xff\xd8\xcf\xfb\xac\xa7\x0f\x6c\x15\x7c\x73\x1b\x92\xfb\x4f\x9f\x53\x7a\x15\x9a\x50\xb8\x68\x04\x87\x15\xe9\x13\x6e\x47\x7c\x32\xd2\x40\x0f\x86\xaa\x4a\x2c\xff\x9e\xa7\x41\x2f\x78\xb8\xef\x0a\x89\x05\x3a\xd9\x12\x34\xaa\x5e\xa3\xe3\x6f\xbe\x47\xf4\xd3\xfc\xa4\x1a\x9b\x3f\xcf\xef\x4c\x5b\x35\xfe\x07\x24\x7e\x27\x88\x86\xfa\x7c\x25\xb1\xa8\x25\x43\x90\x73\xb0\x9c\x9e\x9c\x99\xaa\x42\xd3\xa9\x2e\x76\x15\x23\x0f\x2f\x54\x4d\xbb\xc1\xc0\xf8\x4f\xfb\x72\x46\xe4\x7d\x52\x9c\x70\x06\x6b\xed\xee\xa2\x38\x82\x77\x4c\x33\x5e\x39\xc1\x7d\xba\x95\x77\xac\x68\x25\x8d\x61\x93\x4e\x66\x4f\x2b\x85\xae\x94\xcc\xd4\xfe\xe9\x88\x24\x5e\x7a\xe4\x4b\x4a\xaa\x55\x3f\xca\xcf\x88\x03\xdc\x7d\x66\x74\xdb\x5a\xf9\xa8\x8b\x93\x34\x16\xa0\xfe\xc3\x08\xc6\x8a\x67\xef\x12\x66\xa5\x95\xd5\xd1\xc7\x77\x8a\x78\xe1\xb7\x65\x58\x98\xe4\xa5\xec\xac\x02\xaf\x2c\xac\x99\x55\x80\x00\x65\xd0\x29\xf2\xa7\x52\x0c\x3b\xcd\x3b\x3b\xe4\xf1\x5f\x86\x47\xe8\x7b\xe6\x92\x07\x22\x2c\x6f\xa7\x37\xa9\xdc\x3a\x1c\x47\x20\xad\xc0\x4a\x21\x21\x61\xf7\xd4\x12\x73\x95\xf1\xbe\xc1\xda\x74\x7a\x75\xdd\x22\x51\xc1\xa6\x43\xad\xc6\x67\xc9\x87\x6c\x41\x79\x6f\xda\xa0\xf8\x34\x68\xad\xe5\x91\xdc\x20\xde\x86\x5d\x22\xe2\xdd\x10\x37\xf2\xe6\xcf\xf0\x7b\x13\xfd\x29\xea\xd7\x2d\xd3\xf6\xb3\x2a\x2e\xfa\xfd\x85\xe0\xe7\x1f\x7e\x3a\x40\x14\x77\x6d\xf1\x10\xd4\xc1\xe1\x17\x17\x71\x7f\x44\xaa\x39\x8d\x4e\x4c\x0c\x11\xf0\x52\x87\xfb\x49\x13\x26\xdc\xfc\x34\xbf\x40\xff\xdc\xed\x14\x86\x5c\x50\xd3\x11\xd2\x30\x87\x0e\x99\xe2\x0f\x87\xe1\x61\xbd\x5c\xed\xfa\xa2\x04\x1f\x1b\x9b\xfa\x31\xa0\xa8\xcc\x21\x82\x16\x01\x8a\x29\x3a\x49\xbf\x00\x4b\x50\x25\xc9\x86\xf2\x43\x0e\xd1\x1f\xd6\xf3\x02\x31\xb2\x7c\x35\x28\xec\xc1\x11\x30\xea\x2c\x42\x6e\xba\x32\x2b\x3a\xef\x68\x42\x20\xe1\x98\xa9\x6d\xee\x68\xdf\xf8\x82\x5d\x85\x49\xe7\xd7\xc0\xe6\xe0\x5a\x17\x3d\xf6\x1f\x55\xc7\x2a\x0d\xde\x5b\x26\x2b\x55\x23\x93\xf3\x93\xc5\xfe\xf8\xb2\x6b\xb3\x35\xc4\x70\xd0\xd5\x94\x18\x9f\xe8\x5a\x0f\x83\x09\xf7\xf3\x7f\x3c\xb7\x7f\x9a\x69\xf1\xe4\xff\xc0\xf5\x39\x44\x6f\x97\xa0\x93\x70\x29\x14\x6c\x75\x1d\xbe\xc2\x8d\x8d\x3d\xc0\xb5\x77\x6d\x1d\x76\x64\xb9\x5a\x4e\xfe\x6a\x7c\x3b\x04\x7a\x8f\x37\x96\x03\x6f\xa5\x62\xe7\x61\x58\xaf\xc5\x7f\xef\x72\x26\x9b\xce\x24\xce\xea\x34\xc0\xcb\x09\xc9\x45\xf1\xae\x39\x67\x2e\xd5\x00\xa2\xa8\x1d\xa6\x57\x15\x47\x01\x71\xcb\x41\xc3\x74\xde\x58\x70\xfd\x63\xa8\x0a\xa2\xd5\x0f\x7c\xbc\x2f\x25\xf8\x92\xda\x78\x98\x40\xda\x28\xe6\x31\x5c\x7f\x3b\xf3\x61\x5f\x78\x4a\xbb\xe8\x97\x1c\xe1\x4f\x47\xa4\x9b\xd4\x89\xc7\xdd\xa5\x4a\x4a\x55\xe5\x15\xf9\x43\xae\x7f\x3d\xb7\x7f\x39\x00\x7e\x90\x00\x8a\xff\x14\xa4\xa5\xf2\x9d\xda\x1c\xdc\xeb\x86\x5a\x9d\x6d\xaf\x21\x21\x35\x2a\x0e\xa5\xa6\x31\xec\x0a\xde\x63\xe7\x11\x4a\x7f\x57\x71\x10\x0f\xbe\x4a\x8d\x07\x71\x1d\x6b\x94\xe8\xc5\xf9\x93\x58\x32\x68\xe1\x90\x95\xfc\x24\x96\x29\xeb\x45\x7d\x4f\xb0\xa9\x1c\x33\xe8\x29\x85\xff\x09\x10\x8d\x93\x34\x4f\x6a\x61\x65\xa5\x84\x35\x8e\x43\x63\x59\x54\x27\x9e\xa1\xa3\x7c\xb5\x2b\x13\x6f\x08\xbb\x88\xb6\x34\xb2\x94\xe4\x0a\x56\x33\xe0\x41\xd7\x72\x95\xd1\x0a\xe3\xb8\x0a\x61\xc6\x6a\x58\xe4\xfc\xb1\x9d\x6d\xc0\xd9\xda\x74\x38\x86\x24\xae\xff\x03\x7e\xb5\xe3\xaf\xbb\xfd\x2f\x87\xc1\x4f\x1c\x19\x0a\x16\xcc\xcd\xaf\xf3\x77\x7d\xa4\xca\x67\x65\x8f\x7c\xeb\x15\x4e\x55\xba\xf5\xa9\x17\xd1\xab\x70\x14\xa9\x69\xd0\x45\x95\x70\x7b\xec\x00\x24\xf0\x32\x60\x0f\xc6\x17\xcf\x2b\x2d\x52\xa3\xc4\xb3\x9f\xc9\x0c\x4b\xee\x79\x14\x11\x04\x36\x96\x9f\x56\xde\x46\x8d\xa4\x7e\x8c\x02\x1b\xfd\x5c\x0a\xd0\x7c\x9c\x4b\x8b\x6f\xcb\x93\x5b\x39\x53\x35\xa9\xe3\xd6\x38\xc9\x8a\x5d\x3b\x32\x14\x29\x45\xa7\xbb\x8f\x09\x19\x02\x37\x4d\xb1\x9d\x83\x7c\xa2\x21\xa9\x5b\x76\xf1\xf7\xe0\x42\x6b\xdd\x60\xbe\xe8\xab\x79\x8b\x84\x5a\x45\x91\xd3\xe3\x3f\x49\xef\xf6\xeb\xfe\x6e\xda\x3f\x1d\x0c\x88\x22\xcc\x7f\xba\x87\xab\x7d\x31\x63\x41\x6c\x18\x44\xa9\x55\xc0\x93\x3a\x2c\x23\xde\x8b\xb8\xcc\x3d\x73\xa6\xb7\xe6\x53\x7c\xff\x95\x32\x45\xe2\x4a\x01\x50\x02\x5f\x6c\x54\x37\xc0\xe3\xbd\x42\xc8\x15\xae\xd5\x33\xce\x29\x21\x78\xcb\xd6\xc0\x42\x99\x98\xd9\x74\x52\x5e\xa5\xd1\x03\x46\x54\x40\xb4\xa1\x75\xd0\xea\xe0\x80\xd2\x9e\x6c\x55\x66\xa8\x7f\x08\x9d\x6f\x96\xc7\x33\xed\x24\x15\xfa\x63\x25\x0f\xe2\xfc\xd7\x0d\x58\x22\x10\x33\xc8\x99\xf5\xcc\x0a\x9e\xce\x80\x61\x45\x12\x50\xf5\x26\x26\x98\x49\xab\xab\xa3\xa5\x85\xf8\x47\x34\xe8\x43\x7d\x0e\x8a\x8b\xfe\x1b\x03\xff\xcb\x23\xf0\x83\x50\x04\x42\x21\x01\x31\xf0\xd8\x36\x6a\xde\x8b\xb1\x9b\x65\xbd\x5c\x54\xa6\xd4\xd7\x91\xce\x94\x89\x78\x2d\x9c\xc6\x13\xc6\xb4\x4a\x7b\x3b\x44\x92\xac\xe0\xeb\xbe\x9e\x72\xd3\xf2\x17\xa2\x20\xd5\x28\xad\xbd\x4b\x47\x27\xe4\xda\xbc\x91\xc0\x9b\x28\xb7\x61\x3b\xf5\x7e\x1c\x55\xa8\x6c\x75\x10\x65\x2e\xd6\xb7\xa9\x25\x78\x27\xcd\x38\xdc\xc0\x75\x42\x81\x5e\x59\xa1\xf8\x66\x99\x55\x92\xb5\xcd\x1f\x3a\x57\xb5\x67\x57\x53\x12\x6c\x56\xc6\xad\x3d\x71\xaf\xa6\x29\x26\x45\xbf\x2e\xec\xd3\xa9\xa1\x89\xd5\x00\x59\x79\xbb\x27\xeb\x1f\x7a\x86\x11\x3e\xec\x63\x93\x72\x07\x88\x06\xb9\xb9\xb3\xe4\xaf\x0a\x67\x22\xe2\xe3\x51\x68\x61\xcd\xd3\xca\xf2\x8e\x98\x28\x79\x94\xcd\x56\x1e\xba\xeb\xe5\x8c\x5b\x29\xff\xdd\xe0\x7f\x3a\x3b\x10\x0a\x28\x58\xb0\x96\x72\x7a\xe4\xf3\x10\x36\xb3\x9d\x56\xd3\x72\x8c\xc9\xda\xa2\xcd\xc0\x81\x40\x49\x79\x5f\xfb\x53\x06\x03\x9a\x2d\xd7\xb5\xc1\x18\x90\xff\x5f\x97\xe9\x48\x24\xa2\xd2\xa8\x80\x85\x45\xf9\x80\x4e\x2f\x59\x5e\x26\x60\x4c\xa6\x72\x12\xd2\x60\x5d\x84\xd7\x88\x80\x25\x0a\xbe\xa2\x99\x4e\x41\x8d\x3c\x5e\x41\x12\x0e\x77\xae\xa4\x0b\xd3\xaf\x8b\xc9\x15\x03\x8e\x5f\x04\xd4\xc8\x8e\xcf\xe7\x5d\xdd\x57\xd3\x81\xaf\x8e\x62\xd7\x3e\x78\x1c\x2e\xa9\xd3\xb7\x46\xf1\xf5\x07\xee\xcb\x0a\xf5\x7c\x8e\xdf\x78\x77\xf2\x67\x8d\x25\x0d\x89\x0d\xcc\x2a\x1c\xfe\xde\xca\x7f\xf9\x31\x7e\xe2\x48\x68\xe0\xd1\x15\x93\x80\xc3\x64\x27\x0f\x90\x5c\x79\x54\x0a\x82\x59\x89\xdd\x43\x73\xc4\xa6\x52\xa4\xa3\x80\x8e\xf4\x2e\x77\x6c\x99\xf1\xee\x06\x74\x38\xd7\xe4\x2f\xd7\xb5\x67\xb4\x1b\xf8\xa6\x39\x94\x3a\x4a\xfe\x2c\xc2\xf7\x9e\xe8\x73\x6b\xe3\x66\x80\xb9\x02\x9e\x93\x82\xfd\x08\x08\x87\xe8\x74\xbe\x33\xcf\x3f\x35\x0d\xa7\xe4\xc6\x50\x49\x3c\x8e\x74\x22\x5f\x5f\x93\x37\x49\x79\x3e\x70\xf6\x96\x7f\xc2\xfb\x3f\xa7\xfc\xe6\xdb\xa8\x5d\x04\x31\xcb\x57\x9f\x57\xe9\x21\x9a\x67\xe2\xf9\x7e\x8c\x3a\xfd\x21\xc7\x46\x6e\x8e\x88\x21\x0e\x7f\x1c\x34\x83\xfe\x6e\xda\xbf\x7c\x29\x3f\x08\x34\x14\x1c\xd8\x1e\xbe\x49\x64\x90\xec\x07\x79\x2e\x54\x66\x26\x29\xb5\x47\x10\x5c\x7c\xc1\xd5\x2f\xc3\x3d\xe5\x96\x73\xe3\x9f\x9f\x6d\x68\x7e\x0b\xbd\x00\x94\xa0\x55\x6d\xfe\x34\xcc\x48\x32\x87\x77\xf8\x4b\xd5\xcb\xac\xf7\xed\x29\x47\xd5\xf6\xca\xf8\xaf\x0f\x2f\x97\x0c\xde\x1c\x7a\x22\x2f\x00\xa2\xfb\x68\x5f\x42\xcb\x20\x2c\xc7\x53\x2a\xa7\x8c\x2f\x11\x96\xef\x09\x0f\x70\x8d\xb7\xfc\xdb\x32\xe2\xd1\xb7\x3f\x07\xd4\x98\x83\x29\x5f\x67\x94\x7e\xda\x89\xc3\x12\xfc\xbd\x0d\x9f\x6c\x24\xd2\xbb\xb5\x6e\xe4\x79\x92\xd3\x75\xcf\xdc\xc2\x52\xd2\x67\x94\x13\x21\x06\x7f\x6f\xe5\xbf\x7c\x3f\x3f\x88\x08\x15\x16\x78\x2b\xe5\x3e\x42\x9d\x9c\x85\x1f\xa9\xc8\x73\xe3\xbb\x6f\xa1\x42\xee\x7f\xa8\x6a\x7d\xbf\xa9\x69\x8d\xf8\x2d\xa9\x5e\x0e\x37\x34\xb1\x01\x28\x21\x92\x3a\xc4\x61\x7f\x79\xa6\xc0\xc7\x43\x53\x3d\x46\x1d\xb2\xe6\xe5\x84\xb3\x5c\x2e\x65\xcc\xac\xa4\xf6\xdd\x13\x9f\xd7\xc5\x10\x24\x24\xc8\x84\x47\xf7\x47\xa9\x8d\x41\xa3\xbc\xf7\xc3\xdb\xeb\x18\xd1\x19\x7a\xf7\x99\xa8\x42\x19\xeb\x67\xd2\x19\xd6\xca\x04\xe2\x37\x40\x54\x13\x4b\xe4\x1c\xf1\x5d\x72\x6d\xc1\x59\x7e\xf6\xfd\x1a\x5a\x06\x7a\x66\x84\xc8\x02\x5c\x5c\x00\xfa\x2f\x01\x21\xa9\x68\x66\xb0\xe9\xfc\x4b\xc2\x17\x90\xbb\x2f\xb0\x94\xd9\x90\xb5\x5e\x9f\x9a\xa6\xf5\xc5\x6e\xd4\x5e\x2b\x64\x44\xb4\xd9\xae\x44\x1e\x12\xee\xd5\x88\xbf\x1b\xfc\x2f\xbf\xce\x0f\x82\x04\x03\x0d\xa2\x1c\x95\xfd\x7a\x5c\x64\x1d\xe2\x28\xd4\x66\xbf\x60\x33\x7e\xa2\xc7\xbe\x72\x8c\xd3\x71\xf9\x00\x11\x15\x08\x7e\xe9\x6e\x47\xd2\x0e\xe6\xaf\xf8\x21\xa4\xbd\xe5\x63\xde\x8d\x30\xd4\xc8\x47\xa8\x63\x97\xf8\x65\xf7\x31\x67\xf9\x75\x8d\xe0\xdd\x67\x88\x9c\x0c\xfd\x3b\x0c\x90\xcf\x44\x7c\x85\x86\x6a\x2f\x89\xd5\x55\x22\x15\xaa\xf3\xc7\x7f\x44\xd0\x14\xe2\x6f\x6d\x44\xc6\xef\xd4\xab\x84\x6b\xfc\x86\xe1\x1b\x0b\x20\xfa\x42\x93\xc2\xcb\x12\x37\x8c\x91\x2f\xe1\x4b\x67\x87\x3b\x55\xda\xd8\x6c\x6b\xb1\x53\xae\x00\x39\xe5\x19\x5f\x56\x1c\xf4\x52\xfb\xdf\x1c\x8b\x7f\xfa\x6c\xe2\xa2\x30\xe0\xad\x4c\xce\x31\x4b\x0c\x67\x3f\x78\xdd\xea\xd2\xdc\x6c\xf1\x9b\xcf\x08\x26\xd5\x7b\x3c\xd5\xa4\xe9\x95\xf3\x9f\xdb\x72\x29\xeb\x01\xb0\x97\xfc\x5e\xd1\x77\xfc\x68\xb7\x67\xd1\x19\x32\x86\x1a\xc6\x53\x02\xa4\x05\x42\x5a\x9a\xed\xee\x17\x08\x9b\xfa\x39\xac\x66\x27\x43\xe7\x20\x09\xad\x17\xde\x5f\x35\x42\xd0\x7b\x55\x53\xde\xaa\x65\xd1\xa2\x85\x2b\xfe\x1b\xa2\x1b\xd3\x07\x74\x53\x81\xb0\x09\x13\xf5\x4f\x86\x60\x0b\xe9\x5c\xaa\x3a\x16\xff\xc1\x41\xce\x15\xfa\xd3\xee\x9c\x0e\x23\x76\x33\xa5\xba\x07\x91\xab\x0f\x6f\xb5\xf4\x7e\xe7\x34\x1f\x4f\x3d\xb9\x8e\x0f\x0d\x2b\x0e\x93\x3d\x71\x09\xf2\xb9\xcf\x62\x14\xcf\xea\x3c\x1c\x49\xe5\xf9\x05\xfb\x24\x8b\x37\xe5\x03\x9a\x48\xeb\xc8\x14\xfe\x36\x58\xfb\x97\x33\xe8\x07\x11\xc9\x65\x80\x03\xf2\xb3\xaa\x35\xb1\x74\x3e\xdb\x31\xc4\x8c\xa1\xf0\x63\x28\xf4\xa3\x7d\xb4\x73\xd6\xf6\xdf\x23\xb8\x9f\x3a\x80\x11\xab\xa1\x1c\x52\x01\x2b\xcd\x26\x48\x33\x2d\x70\x93\x1e\x6d\x2b\xac\x50\xe0\x2e\x5c\x7e\x84\x51\xd8\x2e\x74\xc0\x0c\x14\xaa\x4b\x22\xf0\x49\xad\x25\x26\x00\x09\x2f\x87\x5a\x44\xb9\x82\x3a\xa1\x77\xb5\xfc\xe8\xbf\xae\x68\xcc\xdb\x5f\x54\xff\xe4\x2a\x7d\x69\x17\x1b\x7a\x1f\x6b\x4b\x81\x24\xd1\x09\x9e\x84\x31\x44\x76\x79\xfd\x73\x51\x46\x44\xbb\x74\x0e\x7b\x6d\xfe\x44\x49\x06\x4a\x3e\xb4\xdb\x19\xff\x7a\x12\xd5\xd1\x04\x3e\xb0\x76\x1a\x87\xab\x52\x19\xc6\xbd\x70\x0d\xbb\xcc\x9f\x05\xbc\x97\x47\xb1\x65\x81\xee\x8e\xb9\x0b\x82\xac\x94\xfd\xb0\x0c\x2c\x3b\xf0\x60\x06\x20\x92\x7a\xaf\x40\x18\x4f\xdd\xda\xd7\x25\x6c\xe4\x1d\xd1\x26\xd8\xf3\x5e\x6e\x84\xe9\x5f\xb7\xe1\x94\xbf\xe2\x79\xbb\xb2\xcd\x40\xb3\xfe\x12\xd9\x6b\xb1\xff\xca\xa7\xe2\xf3\xc0\x56\x36\x7b\xcd\x95\x8b\x85\x5e\x97\x2c\x47\x07\xdb\xd5\x6b\x15\x87\xaf\xad\xf7\x55\xe8\x97\x77\xb8\xff\x57\xd0\xd2\xea\x1c\xc3\x87\xc3\xf9\xc4\xec\x35\xca\x62\xed\x4d\xac\xbb\xf2\x83\x22\x9f\xf0\xa8\xcb\x6f\x82\xef\xf0\xd6\x8d\x87\x9c\xba\xff\x53\x70\xf8\x69\x83\xcd\x6d\xf2\x8e\x0b\xa4\x39\x1c\x24\x43\xc5\x22\x32\x0a\xb6\x97\x15\x54\xb4\xad\x22\x8f\x3d\xde\x66\xe3\xe2\x37\x54\x2c\xd4\x02\xf9\x10\x2d\x75\xf3\xf8\x95\x70\x47\x6a\x42\x29\x3f\x05\x1e\x52\xb6\x5d\x17\x1a\xae\xc3\xd8\x4b\x76\x08\xf2\x36\xa9\x06\xcf\xf8\xcf\xa8\xc0\xee\xc7\xb2\xc3\x53\xb5\xe1\xf2\x34\x79\x34\x42\xa9\x9a\x43\x16\xcd\x21\x26\xf1\xe9\x02\x08\x73\x84\xdd\x0a\x72\xea\x9a\x98\x4d\x00\xde\xb2\x44\x63\xb1\x71\xba\x44\x8b\x56\x25\xb8\x74\x78\x34\x13\x6f\x3d\x74\xe4\x72\x8d\x78\xf4\x12\x8a\x3a\x36\xae\xa7\xc8\xc1\x19\x68\xaf\xb6\xc9\x3a\xfb\x01\xf2\x87\xac\x8a\x90\x76\xc3\xc5\xb6\x65\x4f\xd0\xf0\x81\x8c\xa9\x85\x43\xf7\x6e\xcb\xb8\xa0\xca\x77\xee\x1e\xcc\x2a\x34\x43\x7c\x03\x4f\x3c\xd2\x6b\xa2\xf9\x35\x3c\x7f\x28\xe1\x39\xb7\x4a\xcd\x86\xe9\xf7\x56\x41\xd3\x87\x6d\x44\x91\x5f\xa3\x27\x61\x60\x68\x22\xa0\xeb\x78\x0f\x17\x36\xa0\x7a\xdb\x27\xe8\x4a\xb6\x23\xcb\x4a\x39\xec\x54\xe7\x7f\xff\xe9\x75\xc8\xa5\xde\x9c\x00\x97\x8f\xd8\xd3\x47\x61\x2b\x3f\xf6\x0c\xa7\x1d\xc3\x86\xa4\x06\x7e\x3a\xea\xe0\xd2\x46\xd7\x70\x86\xe8\x4b\x39\xa1\xb8\x89\x7f\xe8\x84\xab\x1b\x00\x6a\x1e\x7e\xae\x36\x19\xae\xe7\x70\xac\x4f\x90\xba\xc0\x96\xdb\x55\xf8\x85\xdc\x1f\xcc\xb8\x81\x73\x65\x1a\x1f\xaf\x8d\xd6\x1c\x22\x3d\x0b\x50\x72\xa3\x55\x0a\x3a\x61\x7d\x19\x74\xc3\xb9\xb7\x5a\x74\xd3\x76\x04\x33\x3f\x30\x6b\xf7\x79\xbf\x34\x4f\xc2\x8d\x3c\xdd\x85\xb6\x03\x6e\xa2\xd2\x6a\x85\x17\x4e\xe8\x9b\xd5\xf8\xa1\x97\xaf\x06\x17\x8d\x30\x9d\x3e\x95\x65\x24\x65\x50\xcb\xbd\x71\xb6\xd2\x4a\x8e\x1d\x17\x06\x36\xea\xe5\x33\xe4\x81\x67\xc3\x4c\x62\xc9\xb7\xbf\x2a\x75\x51\x8c\xaa\xb7\x34\xba\xc9\x75\x10\xba\x65\xb1\xdd\x38\xda\x3d\xd8\x7d\x81\x41\xfb\x58\x49\x03\xbf\x60\xcd\x68\x33\xac\x4f\xbc\x84\x79\x01\x11\xf6\xf0\x5b\xed\x4a\xaf\xaa\x6a\x48\x58\x0d\xd2\x53\x9d\x6e\x02\x80\xb9\xf1\xc3\x2f\xa2\xdd\x3f\x60\xaf\x2c\x61\xeb\x8d\x67\x45\x0b\xf9\x02\x73\x44\xa1\x12\x25\x7e\x51\xc2\xb1\x5b\x34\x61\x9e\x3d\xb7\x04\xd7\x74\x8a\xd7\xe3\x7d\x43\x91\x3c\xf6\xc0\x87\x2d\xe9\x1b\x94\xc4\x9f\xc2\xf4\x2a\x62\x31\x09\x98\x36\xcb\xb7\x75\x06\x96\xeb\x13\xa2\x4f\xf3\xff\x56\x76\x16\x60\xbd\xeb\xf5\x4c\xde\x48\x9e\x9e\x95\x53\x84\x14\xbf\x60\xf1\x56\x9f\x3e\x0c\x31\x39\xb9\x27\xec\xdf\x7d\x03\xa4\xfd\xfd\xd1\x1b\xfb\x04\xab\xe4\x73\x40\x2e\xaa\x81\x09\xb1\x51\x83\xfd\xf8\xc3\x90\x75\x41\x56\xdc\xb4\x6a\x77\x9e\x7d\x92\x97\xe1\x3d\xd8\x76\x5f\x29\x06\xe5\x4c\x4f\x24\x5a\xef\x33\xf3\x29\x0e\x9a\xce\x7a\x00\x5f\x6b\xf5\x57\x68\x65\x1f\x1f\x73\xa4\x5f\x92\x62\xf2\x32\x4f\x83\xf2\x9d\xc4\x5c\x7c\xb2\x24\xce\x4b\xcb\xa5\x1b\xdf\x4f\x98\x9b\x86\x87\x37\x49\xe2\x09\x17\x15\x11\x5b\x70\x96\x31\x21\xc1\x2a\x03\x3f\x2a\x35\x48\x89\xf2\xe8\x04\xd1\x55\xa1\xf6\xa8\x76\x20\xbc\x90\xcc\xa7\x4e\xbc\x15\xe9\xac\x5f\x0a\x91\x0b\x46\x81\x99\x51\x7a\xf3\x69\x7e\x0b\xb8\x1b\x79\x81\x91\xd4\x13\xbe\x0f\xa4\x50\x13\xa9\x79\xc5\x25\x08\x23\x11\xd9\xd3\xe8\x13\xa2\x95\x72\xf0\xa5\xab\x01\x54\x00\x30\xc6\x66\x6e\x8f\xd9\x98\x76\x8e\x1e\xd7\x32\xbb\xbb\x63\x92\x6b\x4c\x19\xd5\x04\x6f\x60\xa7\xac\x03\xed\xdd\xc9\x86\x7c\x7a\x0d\x7c\x54\xed\xfe\x91\xbd\x4f\x64\xc7\x6f\xae\x0b\xcd\x3e\xdc\x10\xd5\xfc\x48\x2d\xa7\xe7\x35\x9c\x50\xf1\xcf\xb6\x4d\x4f\x7d\x35\x3a\x34\x9f\x06\xed\xb9\xcb\xbe\x99\x59\x29\x78\xd9\xdd\xb5\x0f\x39\x43\xe7\xcb\x96\xda\x28\x4a\x54\x62\x5d\xb9\x17\xa3\x46\xa6\x4a\xc9\x28\xf8\x0f\x30\xb8\x6e\x8d\xc3\x0b\x9b\xe8\x78\xda\xe1\x37\x7a\x21\x10\x16\x4b\xdd\xdf\xb8\xfa\x51\x39\x99\x2d\x08\xb1\xde\x53\xc6\xae\xcf\xd5\x05\xe8\x28\x7e\x26\x68\x2f\x69\xfd\x82\xc4\x89\x2e\xc5\x7b\x92\x9a\x53\x1b\xa5\x85\x04\x7b\x39\xeb\xcc\x3f\xe5\x8f\x81\x6b\xe8\xed\x58\xf6\xd3\xfc\x81\x89\x98\x0a\x46\x9c\xd5\xd8\x44\xb3\x7f\x5a\xb5\x56\x30\x42\xb4\x10\x7a\xe3\xf1\xc3\xd9\x52\xa1\x66\x39\x78\xf5\x62\xa7\x80\xba\x3c\xcb\xd7\xd3\xea\xe1\xe5\x71\xa7\x23\x3a\x74\xca\xce\x3c\x34\x61\x1a\x7c\xd8\x9b\x06\x44\xa8\xa7\xa5\x8e\x70\x5b\x9d\x8d\x36\xe3\xc0\x1f\xe5\x85\x6d\x58\x0b\x81\x49\x34\x96\xde\x97\xed\x24\xbe\xd2\x9c\xef\x69\x2a\x58\x21\x1a\x18\x12\x92\x0f\x8f\x0f\x83\xa6\xbe\x9d\x40\x36\xc6\x9b\xd0\xf7\xef\x22\xd0\xe8\xae\x32\x3b\x18\x2d\xa5\x21\xfd\xcf\x97\xa5\x15\xc4\xec\x92\xac\xc9\x2b\x44\x2f\x98\xf1\xd6\x74\x11\x00\x45\x17\x53\xf4\xed\x9b\x8b\x46\x59\x2b\x33\xdb\x94\x3b\x0d\xe1\x65\xfb\x97\xa9\xdb\x2d\xd0\xca\x0b\xbb\x3e\x34\x99\x19\x04\x0a\x80\xdd\x9f\x83\xda\xc5\x65\xb7\x09\xdb\x8d\x1e\x4d\x2d\x37\x50\x53\x73\x73\x3e\xe1\xcc\x46\x89\x55\xeb\xb1\x2d\x78\xa1\x07\x67\x5b\xf0\x3e\x0d\x4a\x51\xe9\xe5\x76\xcf\x35\xf8\xd1\x91\xbc\x0f\xc3\x25\xc9\x56\x87\x29\x09\x7a\x88\xe0\xed\x74\x69\xf1\xcf\xb5\xfa\x1b\xf5\x0b\x00\x15\xe3\x29\x5f\x9f\x23\x79\xe3\x80\xdc\x64\xdd\x17\xce\x4b\xd7\x76\x8a\xb6\xf3\x36\x81\x27\x2d\xad\x35\xa6\xe5\x47\x42\x0f\xeb\xe0\x0c\x30\x3d\xc7\x1c\x13\xfa\xb0\xdb\x5a\x3f\xbc\xdc\xa5\xef\x7e\x5c\x2f\x2b\x4c\xf6\x69\x08\xfc\x87\x3d\xd4\x86\x56\xdd\x67\x6a\x5c\x53\x1b\x4f\x83\x72\x26\x44\x2e\xb8\x64\x77\xf5\xf6\x8e\x27\x1a\x89\x62\x68\x6e\xa9\x0e\x2f\x06\x1b\x9b\xa8\x48\x58\xac\xd4\x12\x4c\xb4\x35\x46\x03\x09\x26\x8c\x45\xd0\x6a\x0b\x62\x36\x49\xc7\x4e\x19\x85\x1a\xca\x1b\xe3\x45\x4d\x9a\x24\xf0\x5f\xfe\x6c\x1c\x9e\x5a\xe9\x7e\x57\xc3\x07\xce\x9e\x11\xc2\x8f\xa0\x06\xe6\x00\x05\xe5\xf1\x6e\x33\x84\x01\xc6\x0a\x34\x7e\x2b\x0b\x63\xb8\x0e\x73\x5a\xd4\xf8\xd7\x1f\xa4\x36\x80\xaa\x44\x33\xa2\x8c\x2f\xc2\xc5\x66\x02\x18\xdf\xc5\x68\x19\xe3\x6b\xf6\xbf\x33\xfe\x70\x38\x67\x6b\x8f\x35\x8a\x79\x7f\x75\x29\x4f\x4e\x0c\x9e\xbd\xa8\x25\x78\x42\x0c\x95\xaa\x7b\x93\x9d\x43\x8e\xab\x33\xef\xd4\x86\xc2\x81\x53\xd6\xec\x17\x96\xa3\xce\x58\x09\xbc\xda\x6a\xcd\x80\xf9\x13\x0c\x9e\xb3\x0a\x8d\xe1\xb1\x90\x3e\x77\xd7\xea\xff\x94\x76\x2d\x9a\xba\x7b\x83\x39\x5f\x46\x90\x35\x1e\x9a\x0c\xdb\x1f\x0c\x8e\x2a\x9c\x74\x6b\xda\x4e\x97\x67\x69\xa6\x1d\x54\x72\x2f\x79\x91\x35\xc2\x72\xdd\xe9\xf9\x2c\xfc\x82\xac\x31\x46\x46\x8c\xb0\x01\xec\x2e\xc7\xda\x19\xb2\x4b\x24\xa1\x21\xd1\x19\x08\xeb\x2d\x35\x34\x27\x86\xd7\x27\x11\x26\xdb\x74\x6b\xc6\x56\xfe\x40\xd1\x69\x56\xb5\x0a\x14\x86\x11\x58\x2c\x22\xfe\xe5\xb5\x62\x27\x28\xda\x35\xb6\xad\x2a\xe7\xcc\x52\xcc\xd2\x6f\xec\x6a\x94\x4f\x30\x28\x77\x9c\x9a\x00\x1c\x7e\x32\xc5\xa1\x9c\xf1\x04\x83\xd2\xba\xc6\xbb\xc1\x44\x81\x2e\x37\xa1\xe4\x3e\x57\xd8\xda\xe3\x2c\x32\x95\xa3\xf4\xfd\x52\x18\x80\x0a\xc2\x10\x9a\x48\xbe\x58\xdc\x61\x9f\xe6\x61\xd1\xcb\xe7\xd8\xd0\xe1\xe4\xf6\xf2\x3e\xac\xed\x67\x81\x3d\x0c\x6c\xe8\xa9\xb4\x5f\x22\xb0\xfe\x1f\x7d\x7f\xb3\xb6\xdd\x61\x56\x13\x87\xe8\x16\x42\x3d\x46\x4b\xef\x5a\x46\xef\x49\xbd\x1b\xb5\x3a\xb8\x0b\x53\x4f\x2b\xfa\x6c\xf8\x34\xe8\x6e\x0d\x99\xdd\x46\xbb\xb3\x0b\xc1\xf7\x77\xce\x15\xd8\xd2\x41\xda\x2a\xf9\x8c\x8e\x92\xf5\x8a\x1f\x69\xc8\x8c\x2e\xb0\x4e\xfe\x83\x74\x9f\x48\x12\x08\xa4\x07\xbc\x9e\x58\x51\x57\xe5\xca\xde\xf4\x5c\xc0\xf4\x2c\x20\x96\x1e\xfd\x48\xde\xbf\xf5\xc3\x97\x18\x55\xae\xf4\x69\x7e\x49\xda\x81\x35\x56\xf1\xa8\xfb\x02\xba\x23\xd4\x60\x73\x34\xf6\x4b\x4a\x5c\x02\x9f\x31\x51\x76\xb1\x35\x5e\x49\x59\xb7\x7b\x0c\x80\x0b\x15\x54\xa7\xa7\xfd\x86\xf0\x84\xac\xa2\x17\xc3\x48\x6e\x97\xd8\xa8\xe7\xcc\x4f\x8e\xd7\x42\x46\xd4\xc1\x93\x66\x87\xce\xf6\x19\x38\xbf\x5e\xa0\xbb\xb9\x31\xc9\xb5\xc8\x50\x9f\x95\xf5\x6b\x41\x32\x68\x46\x5f\xba\x03\x65\xb8\x9e\xd0\xde\x97\xfa\x14\x17\xd2\x21\xb9\x4f\xcb\x0f\xa5\xdb\xed\x1f\xa7\x2a\x47\x4a\x9c\x98\x7e\x48\x99\x54\x6b\xae\x0d\x1d\x79\xb7\x4d\x6e\x6b\xcb\xe3\x76\x85\x20\x61\x69\x67\xf1\x34\x3f\x8b\x27\x0e\x6f\xa0\x40\xcb\xab\x4f\x38\x89\x1e\xc3\x87\x2e\x8c\x2f\x89\x0f\x60\xb7\x57\x3b\xbd\xe5\x54\x77\xbc\x6f\x38\x5c\x00\xa0\xbb\xcc\xf7\xf5\x1e\xae\xb8\x71\x9f\x32\x29\xa2\x50\xa9\xa0\xff\xd7\xf1\x60\x21\x1f\x84\x89\xe9\xb0\xf0\xa0\x5c\x1c\xbe\x6f\x3e\x5c\x80\x3b\xa1\xfa\xce\x40\xa6\x3b\x58\xae\x2f\x5b\x32\x66\xdd\xb8\x9d\x8e\x20\x82\x55\xe1\x45\x09\x2b\xd7\x18\xd7\xb4\x8c\xd5\xe9\x2b\x68\xd5\xff\xb4\x16\x1d\x0f\x78\x45\x9f\xea\x95\x28\xe4\x11\xc2\x39\xa5\xe6\xa9\x1e\x6a\xf8\x0a\xf9\x0b\x81\x0e\x42\x7a\x72\x14\xa2\x4f\x1a\xf9\x02\xb0\xa8\x88\x53\x70\x3f\x66\x10\xe3\x70\x66\x39\x97\xb4\x91\x6b\x58\xf8\xd4\x5d\x09\x0e\xa5\xec\x65\x99\x17\x64\xf3\xf8\xca\xd2\xf7\x9f\x54\xd5\x48\x84\xbe\x14\xf6\x71\x0b\x1e\x7c\xb8\xdc\x46\x0f\xd3\x79\x1b\xbd\xd4\x5d\x43\xc3\x2a\x66\xf6\x52\x92\x54\x9f\x6a\x44\xe4\xea\xaf\x67\xfd\x2f\x5f\xc6\x0f\x42\x89\x85\x06\x56\x3e\xb0\xa7\x87\x88\x50\xad\xeb\x0c\xe0\x58\xbf\xa3\xe1\x2a\xd7\xb2\x32\x4c\x86\x4a\xc8\xd3\xad\x64\xaf\xd8\x9e\xe2\xf7\x29\x97\x04\xc3\xdd\x7b\xf2\xe8\x7a\xe5\xa1\x16\xbb\x9d\xcb\x37\x16\x7c\x3b\xa2\x17\xd6\x62\xf7\xe6\xab\x83\x8b\x63\x92\xfd\x23\x3e\x6d\xf2\xdc\x39\x20\xc9\x6a\x3d\xf2\xf3\x86\xd5\xf9\x9e\x61\xbe\xc3\xbd\x5d\x68\xd1\xbc\xbc\x72\xd8\xef\xbe\xb5\x2e\xf8\xb4\x9b\xf4\xfa\xe8\x9e\x08\x2c\x40\x74\xa7\xd7\x11\x23\x09\xad\x3c\x4a\x8d\xa7\x8a\xbe\xe4\xe1\xce\x87\xfd\x47\x54\x34\xaa\x3f\x31\xa1\x5e\x6e\x07\x83\xdf\x92\xf4\x04\x20\x8a\xf2\x2c\xc6\xff\xd5\xc2\xad\xea\xd7\x45\xe3\x8c\x8c\x45\x6f\x1a\xb7\xd9\x13\xe7\xfb\x14\x03\xbd\x3f\x2c\xce\x31\xf7\x6f\x88\x7e\x01\xa2\xda\x48\x08\x74\x9e\x14\xd6\xcb\xd1\x43\xcb\x44\x2f\x56\x52\x34\x32\xa8\xa1\x49\x88\xd7\x6d\x60\x76\xd3\x6d\x56\xf9\x7f\xbc\x02\x5f\xbd\x03\xef\xb4\xf8\x62\xdf\x3b\x70\x1c\x5e\x86\x9d\x45\x74\x0c\xdb\x18\xc7\x8c\x3b\xbc\x71\x3f\xb0\xa5\xff\x34\xb1\x52\xba\xbc\x37\xf0\x97\x7b\xff\x4f\x9f\x06\x42\x0b\x8d\xf5\x1f\xee\x3d\xf6\xbe\xc9\x31\x44\x61\x0a\x0d\x4e\x38\x05\xbf\x0b\x9a\x92\x60\x83\x58\xa4\xcd\x8a\x57\x15\x47\x37\x80\x25\xf8\xc4\x14\x04\x9c\x37\xb1\x72\x0e\xc9\x70\xd1\xb2\xfd\x4c\xae\x28\xb5\xc2\x7d\x8b\xbe\x35\x22\x2a\x8b\xeb\x1d\x1d\x05\xe7\x91\x30\xef\xe6\x2e\x82\xad\x47\x1e\xe8\xf2\x4a\xcb\xdc\xb4\xf5\xcd\x78\x34\x29\xf2\x21\x96\x08\x1f\x6e\xb9\xc3\x28\xd5\x3a\xab\x13\x7e\xac\x51\xbd\xc4\x61\xfc\x0e\x88\xba\xd4\xbf\x6f\xa3\xe5\x5c\x38\x72\x2e\x6c\x1b\x8d\x32\x28\x16\x3c\xa5\x6f\x65\xf1\xf1\x91\x9d\x34\xca\xe1\x88\xe4\xb4\xb7\x6b\x02\x44\x3b\x3b\xd8\x3b\x2d\xa1\x7a\x8c\xf8\x0c\x3a\x0c\x92\xec\xc4\xc2\xbf\x4e\xbe\xd4\x2c\x26\x5e\xb1\x24\x70\xd0\xe1\x2f\xb3\x2d\x06\xcb\xbb\x92\x5f\x3a\x4d\xc6\x34\x8e\x92\x1a\x3f\xde\x61\xfd\x6c\xf3\x63\xbb\x60\xb3\x83\x91\xee\xc3\x6f\xbf\x2c\x2a\xb4\x20\xc0\xff\x1a\xf5\x17\xcb\xf8\xa7\xbf\x04\x81\xd3\x86\x02\x8b\x34\xe9\x25\x9e\x3d\xb0\xb9\xda\xf7\xeb\x97\xdf\x98\x45\x94\x9d\xb3\x20\xfd\x3a\xcb\xf0\x1b\xed\x16\xc5\xd3\x6f\xa8\x43\x5a\x43\xc9\x07\x94\x68\x3c\xf7\xd7\xa4\x90\x2b\xb3\x2e\x94\x54\x75\xcf\x37\xf2\x89\x73\xb1\x2a\x6f\xbc\x47\x2f\x42\x7b\xac\x60\xe8\x9f\xf5\x28\x02\xa3\x78\x7e\x9b\xa0\x3b\xe5\x1c\xdb\x94\x97\x57\x6c\x7b\xcc\x31\x12\x2e\xf5\xad\x8f\xf5\x7c\xbb\x8e\x15\xba\x26\xde\x42\xa1\x18\x64\x60\x1e\x86\x29\x72\x0e\x7d\xe3\xfb\x75\x9a\x9a\x17\xd3\x31\xca\xcf\x52\x53\x3e\x14\xd3\xb8\xde\x30\x7c\xec\xd0\xbb\xed\xc3\x6d\xe2\xf3\x06\x73\xf9\xff\x64\x63\x7e\x0f\x95\x0b\xb1\x3d\xf5\x09\xd3\x72\x0b\xe9\xd5\xb0\x98\xb8\x0d\x51\x95\x19\x98\xee\x87\xa5\xcb\x48\xb5\xc6\xf1\xba\x9c\x81\xfd\xdf\x39\x58\x7e\xe2\x06\x94\xa1\x21\x4f\x03\x67\xbe\xc4\x65\x30\x37\xbd\xff\x99\xe1\x8f\x47\x29\x24\x3b\x47\x12\x23\x19\xfe\xcb\x6d\x85\xeb\x2c\xe1\x71\xaf\xc2\x6f\x07\xb3\x11\xd0\xc1\x59\x57\xaf\x16\xe9\x98\x76\x82\x88\xd1\x97\x07\x22\xe0\x1d\xd3\x0d\x7d\xe0\x8c\x5a\x5d\xd6\x75\x4b\x8f\x73\xe5\x79\xf6\x05\xec\xd5\xf2\x72\x70\x34\x73\xef\xf7\x0f\x82\x0e\x76\x1a\xdc\xb4\xe0\xa4\xe0\x92\xea\xce\xdd\xc7\xe4\x3a\x61\x8e\x1a\x37\xd4\xda\x46\x0a\x90\x95\x64\x7e\x73\xa1\xff\x2e\xc8\xb7\xfc\x0d\x36\x36\xbe\x16\x4a\x41\xe0\xce\x57\x95\x07\x21\x0d\x9a\xc0\x38\xfd\x2c\xa6\x5f\xca\xea\xe9\x20\x99\x34\x9f\xf8\xf7\xfa\x98\x44\x21\x7b\x9f\xf2\x85\x93\x07\x0b\xac\x33\xb9\x09\x1a\x9b\x86\x32\x21\xed\xf7\xcb\xca\x02\x76\xf3\x11\x20\x97\xbb\x44\xfa\x2d\x4c\xa3\xee\x46\x64\x96\x77\x22\xef\xdc\xbe\xc0\x71\x30\x82\x8c\x29\xfc\xcb\x55\x6b\xf1\x28\x43\x12\x39\x23\x2a\x60\x50\x5b\x2d\xd2\x94\x89\x24\xfd\xac\x04\x9a\x4c\xdf\x04\x87\x85\xc6\xce\x6c\x43\x98\x33\x6b\x1d\x1a\x4c\xf2\xa9\xd1\x01\xce\xd1\x1b\x20\x76\x2a\xef\xd6\x27\x42\x10\x8b\x65\x66\xcd\x5b\xca\x6a\xb1\xfe\xe2\x92\x67\x1a\x5c\x33\x14\x37\xe9\x4c\xcc\xce\x20\x3c\x51\x03\x9e\x97\x2b\xd4\xcb\x4c\xb1\x79\x2a\xac\x37\x42\xa1\x47\xba\x18\xf9\x03\xcc\xc4\xee\x71\x93\x3e\x73\xc5\xd4\x17\x21\x58\x86\x95\x4d\x20\x99\xb4\x76\x4b\xa6\xee\x7d\x6e\xfb\x8f\x77\x66\xca\x34\x24\xed\x0d\x64\x3a\xfc\xb4\xb8\xbe\x56\x75\x7c\x90\xbb\x67\xbc\xad\xcd\xfe\x4b\x7f\x51\xaa\x7f\xb9\x2f\xff\x27\x95\x8e\x0a\xc0\x72\x76\x5e\x66\x38\x0e\x0e\x5d\xf2\xc2\x6f\xb8\xbd\x32\xbc\xcb\x45\xc7\xb8\xf0\xdf\xd8\x4d\x0c\xd9\xb3\xe4\x6c\xc8\x61\x19\x0b\xce\x04\x94\xc8\x9a\x9c\xef\x97\x91\xae\xc2\xf4\x37\xe4\xe4\x2b\x49\x12\xa2\x86\x60\x48\x0a\x39\x23\x3f\x8a\x42\x3b\x75\xb5\xd1\x6c\x35\x83\xf5\x1f\x02\xdd\x64\xfb\x4f\xb7\x3e\x6f\xbd\xcd\xb9\x69\xd4\x3a\x76\x39\xb1\xa3\xd5\x68\x24\xf9\xc6\x95\xe2\xb8\x11\xfb\xa6\xf8\x75\xcf\x3c\x20\x7a\x14\x15\x6b\x16\x53\x6f\xac\xae\x8e\x59\x11\xda\x0e\xc9\x25\x62\x8a\x25\x94\xc5\xb6\xbf\xac\x99\x82\x36\x17\xbc\xc4\x93\xb6\xf9\x8b\x1d\xff\xcb\x87\xf2\x13\xc7\x85\x42\x0a\x00\x4d\xb9\x1b\x3a\x1f\xa2\x90\x77\xd2\x99\x3e\x0a\xb1\x48\x31\x6b\x6f\x4e\x9f\x00\xcc\x77\xdf\xa6\xd1\x57\x96\x82\x76\xe4\xc7\x8b\xe7\x00\x69\xe2\x9e\xb8\xe8\xbc\x82\x27\x04\x27\x24\xdb\xd9\x36\x3c\x90\xb7\xdf\xa7\x64\x80\xf3\x94\xe4\xda\x76\xcf\xf1\x59\x62\xa7\x08\x88\x8a\x4b\xb6\x15\x59\x1b\x30\x66\xd5\xfa\x7d\x34\xa9\xce\xcf\xc1\x4b\xa4\x52\xc4\x10\xa7\x39\x1d\x14\xc6\x1b\x5b\xf0\xb9\xde\x7a\x05\xa2\x7a\x8b\xcc\x86\xd6\xe7\x3a\xe4\x78\x82\x8b\x4a\x54\x47\xb7\x3b\xac\x10\x65\xa5\xa5\x85\xf7\x8a\xce\x89\x08\x8a\x25\x68\x38\x17\xfe\x7f\x37\xed\x5f\x8a\xfa\x41\x7c\xa0\x50\xc0\x67\x38\x2c\x3f\x02\x6a\xc4\x6d\x0f\x47\x8b\x1b\xc8\xd7\xcf\xce\xcc\x34\xe9\xe7\x01\x96\x90\x4d\x85\x19\xfe\xb2\x26\x68\x25\xdd\x62\x01\x40\x89\x61\x84\xf4\x42\x27\x8e\xb1\xf7\x68\x6d\x44\x99\x03\x93\xcf\xfd\xe6\xfb\xbd\x6d\x9b\xcf\x5f\x4d\xe2\x55\x0b\x50\x2d\x7b\x90\x80\x58\x2c\x21\x3f\xc2\xcf\xe5\x6b\xd2\xbe\xfb\xe2\x8a\xc8\xda\xa8\x62\x2c\x2c\x3f\xf8\x4d\x18\xc4\x4d\x65\x14\xa1\x0c\x2d\xe8\x4b\x24\x21\x40\x94\x97\xeb\xa1\x20\xb8\x3f\xbe\xf1\xd7\xb0\x91\xcf\x02\x69\x8b\x85\xc7\x54\x8a\xeb\x65\x0b\x9d\xa8\x5a\x57\xde\x9e\x6d\xfc\x92\xe3\xe5\x2c\xcc\xff\xce\x9b\xf5\x83\xe0\x41\x89\x18\x03\x06\x8a\x9c\x85\x60\xf8\xb1\xf4\xaa\x9f\xa0\xb6\x28\x7e\x92\x3a\xf6\xc7\x92\x19\x32\xe1\x9a\xe0\x5c\x0e\xc9\x28\xf9\x6f\xf4\x8f\x0f\x20\xe2\x6f\x73\xf7\xdd\x7b\x1e\x1d\x61\x9a\xe4\x8e\x85\x8f\xfd\x50\xaf\x3d\x34\xd8\xe0\x2a\x63\x0c\x61\x85\xd1\x3b\x1f\x56\x18\xda\x12\xb4\x0f\xc5\xe9\xe5\xa4\x4d\xcd\x7a\xf8\xe4\x89\xd4\xf5\x0d\xf7\x51\x78\x93\x84\xbd\xae\x4c\x26\x45\x07\x77\xe2\x3e\x85\x0c\x07\x66\xa0\x4b\x11\xef\x55\xb7\xb8\x0c\x57\xd5\xeb\x22\x6b\xe8\x26\xd7\x29\x9a\x7f\x22\xb9\xde\x14\xe7\x3c\xbd\x88\xb7\xb6\xa7\x58\x25\xf7\x4a\x0d\xf8\x2b\x04\xeb\xc9\xbd\xcc\xbc\xf4\x54\x33\x51\x64\xef\xbb\x2b\x9f\x96\xd5\x85\xe1\x2d\xe5\x5b\xa3\x62\xe7\xb6\x77\xa1\xba\x29\xed\x06\x88\xbb\xf5\xa3\x6f\x9b\xbe\xd3\x71\xd6\xb6\x4b\x86\x85\x78\x22\xb9\xc1\xb2\xb0\x51\xbd\x7b\xcd\xb7\x1f\xd2\x2e\xc8\x1c\xac\x21\x9c\x31\x09\xe6\xb1\x4d\xae\x69\xa5\xbf\x44\xd2\x7f\x8f\x55\x24\x79\xbb\x9a\x63\xc7\x7d\x32\xcb\xd2\x60\x75\xde\x6b\x0f\xf7\x55\x0a\xdd\x01\x9e\xe2\x6f\xae\xd5\x3f\x3d\x65\x88\x08\x14\x4c\x48\x00\x90\xe6\x4f\xc0\xee\xd9\x2e\xaf\xfc\xe1\x53\x68\x1b\x4d\x50\x6e\x55\x56\x48\x41\xdf\x5b\xa9\x97\xb9\xb6\x3f\x0d\x87\xe3\x96\x30\x3e\x03\x00\x50\x7f\xa1\x6a\xa2\x42\xf8\x84\xac\xeb\x27\x8f\xa6\xc5\xdc\x7e\x0f\x2f\x63\x5e\x38\x19\x64\x83\x7c\x7c\xa8\x59\x3b\x82\x18\xdb\x08\xf0\xd9\x25\x46\x74\xf4\x56\x22\xee\x2a\xac\x89\x25\x25\xc2\x09\x0a\xbd\x11\xc7\x9f\xc1\xa4\x26\xcb\xc6\x0d\xe3\xeb\x2d\xfc\xe9\x47\x90\x7b\xf8\x02\x05\xf9\x12\x61\x33\x97\xa9\x93\x1b\x4b\x60\x27\x17\x8b\x4f\x20\x2a\x37\x64\xa4\x27\xce\xdd\xc7\x26\x20\x84\x50\x25\x08\xec\x3b\x1a\x5f\x2d\xa4\xf3\x2d\x5d\x2e\xa7\xb3\xe6\x92\x8f\x7b\x4c\x91\x58\xf2\xfa\x6b\xe8\x61\xe6\xc5\xfb\x14\x1a\x0a\x5a\x9e\x21\x93\xeb\xbf\x3f\x85\x7f\xb9\xeb\x7e\xe2\x14\x70\x28\xc0\xcd\xf1\x36\x5b\xc3\x0f\x82\x0f\xc7\x77\xa1\x5b\x79\xec\x3a\x8a\xa0\x53\xd0\xd4\xd3\xe3\xef\xb9\x88\x8a\xa0\xb2\xa5\x5c\x83\x53\xf0\x02\x74\x80\x7e\x03\x05\xbb\x14\x36\xe5\xfe\xe9\xde\x17\x5e\xd8\xa4\x3a\x57\xbd\x50\x53\x80\x14\x15\x56\xee\xf1\x73\x52\x36\xf6\x3a\x04\xac\xdc\x9f\x2d\xce\xb0\xf5\x0b\xf9\xf2\x3b\xef\xe8\xe8\xd5\x54\xcf\xb7\xa0\x0a\xe9\xb2\x9a\xec\xb4\xab\xd3\xa2\x43\xe5\xb3\xae\x07\x15\x46\x40\xf4\x11\x52\x2d\x91\x84\xb8\x0c\x85\xab\x40\x11\xf1\xcd\x8a\xa4\xf8\x35\xc2\xdb\xce\x79\xf8\x96\x17\x92\x6b\x25\x9d\x77\x03\x7b\x4f\xdb\xfb\x4f\x9f\x5d\x9c\x10\x16\x1a\x70\x54\x76\xaa\x27\x33\xc2\x66\x49\x5d\x15\xa0\x93\x60\x3e\xf6\x95\x76\xa0\x59\xb0\xb5\x04\x67\x9a\x2b\xf3\x87\xc4\x5d\xf5\x61\x48\x1f\x01\x3a\xe4\xca\xc4\x90\xb4\xee\x89\xaf\xb9\x77\xb1\x0f\x42\xc7\x8a\x5d\x57\x93\x48\xc6\xcb\x19\x63\x26\x95\x32\xb7\x7c\x56\x66\x25\xc6\x01\x44\x29\x97\xda\x47\x25\x0d\x3c\x39\x14\xc9\x06\x47\x2f\xb5\xfb\x5b\xcd\xf1\xf1\x8a\xa1\x4b\x10\x72\x96\xc4\x94\x58\x82\x93\x31\x41\xe6\x99\x57\x86\xf3\xcc\xd8\xc4\x46\xa8\x7b\x2b\x9d\xdd\xad\x36\x62\x05\x63\x79\x80\x0d\x1b\xf9\xa8\x64\xb4\x3b\xb4\x30\x12\xdd\x0e\xf8\xcf\x8f\x25\xa1\xec\x10\x39\xc7\xdb\x97\x5b\xf9\x7e\x10\x2c\xad\xb9\xb1\x9a\xf8\x33\xf0\x59\xa4\xf4\x5a\x5e\x40\x9e\x70\xbf\x5b\x78\xdb\xdf\xe2\xe3\x7f\x36\x35\x1f\x68\x6f\x1b\xbf\x3f\x70\x8e\x7f\x96\xcb\x33\xd0\x61\x13\xe4\x59\xb7\xf4\x95\x88\x4d\x76\x5b\xff\xc5\xc2\x09\xb9\xf4\x83\xdc\x3e\x8e\xfc\xa7\xf8\xf8\xb3\x34\xcc\x9e\xba\xa0\x8b\xdf\x46\x37\xb7\xb6\xb1\x9c\xc4\x0f\x58\x92\x36\xb0\xd0\xb2\x27\xde\xde\xc8\xbd\x8d\x3e\x0f\xd9\x00\xab\x64\x0b\x07\x99\x0b\xfd\xf4\xc5\x42\x6b\x40\xa1\x71\xa8\x4b\x71\x4b\x17\x12\xde\xe0\xc4\x11\xf3\x48\x7c\xca\x97\xaa\x06\x54\x49\x10\xe6\xc2\x76\x9a\xc6\x20\x8d\xfc\xf0\xf0\x5e\x00\x65\xc1\x8f\xde\xf3\xdd\xdb\x8b\x71\x37\xb1\x32\xf8\x8d\x0c\x87\x62\x77\xf2\x87\x6b\x34\x80\xa9\x04\x81\x3d\xf7\x7b\xf1\x83\x5e\xee\x08\x17\xe5\x2b\xf7\xac\xc8\xad\x9b\x19\x2d\xf3\x2b\x28\x3c\x5b\x44\xe3\xda\x29\xf7\x05\x6d\x30\x2a\x53\xf3\x56\x0f\xe0\x9b\xe4\x61\x8a\x33\x46\xdc\x95\x79\xf5\x3b\x59\xf7\x62\xc5\xbf\xb8\xa1\x39\xb8\xac\x2a\xb3\x94\x1d\x33\xe6\x37\x20\x1a\xb9\x3f\x93\xc4\x49\x97\xaa\x91\x7b\xc8\x96\x18\x2a\x6a\xed\xc6\x73\xab\x58\x1a\x0d\xbd\x00\x6f\xd6\xf0\x5b\x47\xfc\xeb\x98\x01\x10\x95\xe2\x4a\x36\xf4\x1e\xf5\x21\x34\x2b\x86\xb2\x23\x45\xce\x97\x3d\x0e\x88\x98\x3a\x59\x2b\x76\xc1\x40\x8f\x10\x9e\xd9\x96\xac\x01\xa0\x00\xdf\x8d\xff\xcc\x27\xc6\x8c\x7e\xf8\x3f\x6d\xcc\xa3\xd0\xc2\x0d\x25\x4b\x46\xc2\x76\x32\xef\xc2\x5a\x58\xc7\x1b\x91\x45\x81\xc2\x0b\x2f\x14\xe6\xa2\xae\x6a\x92\xa8\x98\x8f\xd3\x75\xd2\x1c\xc9\x43\xef\x31\x7f\xf9\x8d\x26\x23\xdd\x84\xb0\xf7\x05\xf3\x5d\xfd\xd6\x07\x30\x21\xbf\xa1\x8b\x6f\xf1\x02\xdc\x4b\x06\xb9\xd9\x1a\xd2\xfd\xc1\xee\x1a\x86\x12\xa8\xe4\x9c\x76\x16\x8c\xc3\x55\xa3\xe5\xe1\xa1\xab\x40\x7e\xa2\x26\xa7\x5c\x09\x9b\xe5\xcc\x09\xd7\x26\x7f\xa9\x10\x63\x53\xbe\xbc\x80\x40\xc3\xac\x88\x77\xd4\x71\x4a\xd5\x81\x42\xd4\xe2\x93\xe4\x7c\xf4\x3c\xc1\xa8\xa1\x1f\xdb\x05\xa3\xd0\xc6\xf7\xb7\x8a\x8c\x5d\x9e\xf8\x83\x94\x31\xa1\x8b\x29\xcf\x7e\xc5\xca\x54\x89\xb0\x00\xd3\xcb\x9a\xa9\xea\xdc\xa0\xc4\x7e\x2d\x9e\x4f\x62\xa6\xb2\x6d\xa1\xc0\x0d\x6f\x91\xb5\x91\x5d\x2f\xb5\x36\x48\xe1\xb2\xa2\x94\x07\x7a\xe3\xbb\xd8\x4b\x19\x37\x5a\xc2\x6d\x8b\xca\x55\x46\xc3\xb7\x57\xd6\xe4\x9e\x87\x25\x55\x30\x79\x30\x19\x25\xaf\xc1\x04\xfb\x0a\x00\x89\x24\x3f\x63\x09\xc5\x0b\xbf\x3a\x71\xf8\x71\xe6\x0c\xf8\x12\xd9\xa1\xc9\x1f\xe9\x48\x41\x11\x48\x93\xe8\x68\x98\xb7\xc6\xa8\xfc\x06\x6b\xd5\x46\xb1\x4e\x51\xbd\x75\x92\xd7\x9a\xed\xb2\x36\xdc\x2d\x2d\x46\x66\x60\x7e\x2d\x54\x24\x12\x3b\x7b\x29\xac\x8f\x70\xe9\x9a\x67\x0b\x04\xfa\x04\xa1\x4b\x87\xf7\x7b\x37\x66\x0a\x14\x08\x4a\x95\x22\x41\x73\x42\x5e\xaa\x52\x08\xbc\xe5\x05\xa1\x94\x24\xbe\xee\x43\x92\xe0\x39\x49\xd2\x6f\x3c\xd4\xfa\x66\xd1\x61\xd1\x3b\x21\x6f\xa3\x68\x46\xb1\x90\xdc\xe3\x69\x90\x97\xa7\xac\x9f\x5d\x54\x83\x47\x96\x04\x94\x5e\x87\x7d\x03\xdd\xe0\x6c\xa8\xa8\xb8\x0b\x1b\x7f\x18\x6e\x17\xbc\xd6\xd0\x97\xdf\xca\x9d\xaa\x86\x05\xcb\xc1\xbb\xdc\x91\x54\x87\xfa\x34\x7f\xf6\x3a\xc7\x70\x27\xef\x4c\x80\xc7\xc5\x82\xf6\xfc\xa8\xc2\x05\x8a\x87\xb0\x0d\x4e\xa2\x8b\x02\x59\x75\x1f\x7c\x6a\x48\x1b\x50\x3d\xf2\x38\x07\x26\xb6\x47\x80\x66\xd2\x5a\x8e\xd2\xea\x75\xb3\x3b\x74\xa9\xee\xb1\xb2\x7f\xba\x37\x89\x6f\x7d\xc9\xd7\x2c\xbf\x35\x49\x60\xf5\xb3\x32\xa5\x5f\x74\xd6\x32\x3a\xbc\x45\x1f\x3d\xe7\xa3\x96\x29\xae\x37\xd4\x76\x0b\x84\x7e\xbf\x3b\xb2\x43\xa0\x1b\x37\xd9\x0b\x14\x27\xca\xaa\xc7\x57\xce\xd1\xdf\x9f\xdc\x0b\x3c\x24\xfb\x3e\xe7\x82\xb6\x67\xb0\xa7\xe5\xac\xb6\x4f\xca\xbb\x79\x90\x3b\xee\x64\x62\x0f\x60\x47\x9d\xb4\xe4\x64\x92\x9e\xf6\xdb\xbe\xa5\x72\x65\xfd\xe5\x86\xd5\xb8\xf8\x62\x57\x5f\x64\xbb\xe8\x28\x27\x6b\xc2\x09\xd4\xc3\xc1\x85\x6a\x2b\x46\x3e\x76\x94\xb0\x52\xef\x98\xff\xde\x88\xcb\xfc\xf6\xce\x22\x29\x03\xc5\x25\x59\x04\x97\xdd\xb8\x94\x93\x68\x60\x5f\xe4\x69\xa3\x22\x34\x8f\x8b\x51\x86\x0f\x26\xb0\xb2\xc7\xf2\x33\xda\x42\x5f\x3a\xc0\xbe\xe2\xd2\x95\xe1\x7e\xf1\x83\x90\x4a\x7f\x96\xa7\xcf\x04\x48\xce\xbc\xcd\x8c\x84\xdf\x35\x83\xf4\xc3\x6d\x9e\x11\xac\x62\xdd\xcc\xe1\xf6\x97\xd8\x45\x2d\xb2\x2f\x57\xfb\x7e\xc2\xde\xb1\x8e\x01\x76\x3f\x63\x1a\x3d\x6a\x82\x99\x2f\x53\x36\x9e\xf9\x76\x80\x31\x0c\x33\x8a\x81\xfd\x47\xee\xd6\x23\xc7\x84\xd0\xda\x4f\x4f\x15\x61\xa0\xa0\xfb\xf9\xcb\xee\x2c\xe2\xde\xef\x5b\x43\xe2\xda\x28\x65\x71\xaa\xeb\x57\xf4\x6e\xc4\x5d\xe1\x18\xa8\xc6\x08\xa6\x21\xfe\x02\x8c\x2e\xc0\xa0\x0d\x6c\x4b\xd8\x24\x8c\xd0\xdc\xa8\x1b\xf3\xb6\x50\xb2\x53\x3a\x7f\x7e\x7f\x61\xb3\x51\xb7\xa8\xaa\x51\x6d\xd0\xcb\x46\x4f\xf4\x06\xae\xc9\x6a\x85\x9b\x38\x63\x0a\xa4\xac\xd1\xfe\xf7\xbc\xa5\x83\x96\x71\xaf\xcb\xe4\x4a\xe8\x4a\xdd\x4b\x9e\x24\x7f\x7a\x51\x37\x30\x29\xa5\x9d\x52\x48\x5e\xa6\x2e\xdd\xf9\xac\x36\x0e\x9e\xcf\xa9\xe0\x77\xdc\x64\x81\x7e\xdb\xa7\xc7\x0f\x03\xfd\x25\x5a\x90\x37\xde\xf5\xc0\x9e\xf2\x57\x08\x98\x25\xfb\xcb\xa2\x8d\x3b\xd1\xe8\xed\xb9\xae\x10\xb7\xba\xb4\x72\xf3\x16\x1c\x7b\x44\xce\x0b\x8b\x88\xa0\x9c\x03\xd7\xd4\xdf\xb1\x37\x24\x72\x7d\x9c\x24\x2d\xa4\x29\xce\x13\x4e\x6b\xfb\xd7\x2b\xf3\xc1\x85\x3f\xcf\xd6\xcf\x82\x7f\x6a\x35\x0d\xb2\x78\x3e\x49\xc6\x2f\x11\xcb\x57\xf6\x97\x1b\xe1\x55\x58\x0c\xb1\x9e\x71\x1f\xfb\xd2\x1c\xae\xf2\x37\x26\x8e\xd1\x07\x6e\x9d\x37\xc3\x2a\x58\x82\xe1\xa4\xcc\x19\xc5\xeb\x0c\x6c\x73\xae\x64\xc6\x28\x36\x02\x21\x44\x7c\x9c\x92\xeb\x36\x0e\x8d\xc7\x76\xd8\xe5\x2d\xaf\x68\x31\xeb\xff\xa4\x51\x76\xa5\x60\x72\x1f\x7e\xff\xca\x41\xa9\xcb\xec\x23\x25\x5a\xa8\x51\x6e\xd5\x36\x30\xdd\xc4\xa6\xbf\xb8\xfd\xe2\x0d\x17\x4a\x37\x20\xfa\x8e\x60\xd8\xa2\xf5\xd8\x8b\x06\x07\xde\xad\x9c\x8c\x18\x37\x27\x92\x71\xdf\x9a\xd6\x33\x6a\xc3\x58\x4a\x03\xce\x86\x4a\xea\xe4\x49\x81\x93\x5d\x7e\xe3\xc1\x01\xb5\xb8\x41\x4d\x42\xed\x73\x21\xb6\x37\x42\x1a\x6f\x0d\xa7\x37\xa5\x6b\xcc\xf9\x7f\x73\xfe\x5a\xeb\x00\x59\xa2\xd7\x9d\x82\x3c\xdc\x8c\xd4\xf8\xc1\x68\xad\xa2\x85\x09\x46\x18\x6c\xe7\xfa\xc6\xcc\x54\x27\xe7\xd5\x50\x28\x74\x9e\x2f\x2f\xc0\x26\x05\xd6\x47\x31\x15\xc7\xe2\x79\x5b\x83\x5d\x0d\x4a\xfc\x6a\xc3\x25\x5e\x65\x1e\x0a\x52\xa2\x9a\x96\xd6\xcf\xbc\xa8\x6a\xb3\x04\x38\x9e\xd6\x2a\xe6\x36\xdf\x84\x6b\xd2\xe1\xf7\x1b\xd3\x95\xca\x37\x78\x2b\x2f\x7c\x85\xd4\x43\x37\x24\xbd\xa7\xce\x09\x13\x4c\xe9\xf3\x74\x01\xe8\x36\xa3\x86\x2a\x2a\x2f\x94\xe7\xa7\x3a\x27\x4a\x69\xdf\xd7\x49\xae\x96\xb3\xb4\x46\x03\x9a\xa2\x85\x66\x25\x11\x4f\x54\x15\x36\x35\x70\xa9\xe0\x3d\x62\xde\xec\x52\x8d\x2a\xa8\xc0\xbe\xe5\x7c\xcd\x6f\x4c\x56\xb6\xf7\x87\xfc\xa1\x82\x90\x35\x7c\x81\xd1\x7d\x38\x7b\xe7\x01\x34\x3d\x63\x84\x6d\x0f\xfa\xd6\xec\x03\xb5\x3b\x24\xec\x41\x18\xf4\x3b\x84\xce\x89\x8b\xee\xa7\xf9\xbd\x56\xee\xa3\xfc\x9e\x96\xd6\x4f\x1f\xf5\xc6\xc3\x8b\x26\xc1\xd4\x90\xf9\xeb\x8a\x43\xd8\xd7\xb4\xca\x88\x0f\x07\x29\x77\x3c\x3c\xcd\x0d\x07\xb9\xdc\xf5\xe2\xb7\xd8\x35\xc0\x2f\x95\x07\x39\x28\x3f\x75\x1a\x99\xbe\xc2\xc8\x8d\x9a\x8a\x87\xf4\x35\x07\xb4\x17\x5e\xbe\x44\x72\x7b\x7e\xa4\x0f\x75\x38\x3c\x60\x7a\xa6\x54\xa9\x66\x73\xdb\xb8\xf4\x49\x60\x33\x1d\xa8\x14\x0c\xb5\xdf\xd8\x1f\xfc\x5c\xfc\xa4\xca\x57\x7f\x37\xf9\xd2\x99\x61\x9a\x00\xfc\xa8\x0f\x39\x96\x88\xa3\x98\x5d\xce\xb3\x33\xc7\x6f\xcb\xa7\x39\x08\x1a\xf4\x55\x2f\x96\x3a\x0c\x24\x3d\x90\x8a\xad\x5e\xdf\x67\x30\x01\xcc\xf7\x78\x7d\xf4\x9f\x2f\x76\x71\x3f\x16\x3b\x05\x23\x7f\xb0\x2e\xf1\x4f\xc0\x69\x49\x6e\x9a\xe0\xcd\x72\xd1\x3e\x57\x58\xe9\x24\x7b\x9a\x9f\xc3\x46\xd5\xdc\xab\xec\x47\xfd\xcd\xdd\x52\xd3\xe9\x4a\xf0\x7e\x6c\xc7\x57\xe1\x55\x93\x3b\xa3\x03\x5b\xf8\x69\xf5\xe1\xfa\x42\x60\xf9\x61\xf6\x9e\x13\x09\x47\xf6\xb0\x71\xb9\x3c\xbf\x67\xed\x40\x67\xf0\xca\x9f\x4a\xe1\x3c\x42\x8d\x18\xe7\x31\x58\x6d\xec\xcb\x04\xee\x74\x07\x71\xa2\x19\x73\x52\x11\x74\xb7\xbd\xf4\x0a\x01\x34\xe1\x71\x60\x9a\xce\xa9\xf9\x4a\x51\x0f\x09\x35\xc5\xb6\xc3\xf8\xdb\x03\xe0\x7d\x73\x50\xf9\xab\xe5\xc3\xdb\xf9\x1f\xdf\x8a\x9c\x30\x82\x06\x15\x47\x26\xb1\xc4\xde\xf3\xac\x42\x25\xfe\xdc\xa4\xd2\xc2\xf2\x87\xfa\x1b\x42\xfe\xcb\x97\xf0\x83\x20\x41\xc1\x83\x1c\x0e\xb2\x31\xab\x03\x35\x1f\xf4\x17\x1e\x1f\x9a\x9c\x35\x87\x02\x35\xb2\xf5\xcb\x03\x76\xdf\x0c\x29\x09\x6f\xe8\x58\x90\x22\xc6\x81\xad\x62\x7e\xe6\xe5\xf7\x16\x95\x2d\x96\xbb\x52\xdb\x87\xcf\x7a\x9c\x22\x21\x99\x55\x76\x74\xab\xca\x33\xb9\x9f\x9c\xb6\x15\x24\xca\x81\xad\xa8\x49\xb3\xbe\xae\x6e\x65\x31\xf0\x7f\xef\x80\x7a\xdf\x9e\xc8\xfe\x8a\x5b\x46\x6c\xbc\x02\xe1\xc3\x6d\xbb\x68\x4a\xea\x1c\xb7\x02\x78\x5b\x62\xe0\xd8\x14\x20\x9e\xe2\xfe\x74\x34\xa6\xd2\x8f\x6b\x8e\x75\x65\x86\x61\x7d\xbf\xc9\x72\x62\xdc\x27\x53\x16\xda\x08\x8b\xd9\xfe\xba\xf8\xff\xf2\x7d\xfc\xc4\x29\xb0\xc1\xc4\x29\xe3\x87\x41\x33\xa7\x65\xdb\x18\xdc\xe8\xb8\x1c\x13\x83\xc0\x2c\xd8\xe6\x4f\x93\xad\x53\xeb\x8c\xf8\xc6\xe8\xa4\x52\x73\xce\x60\xe1\x5c\xbd\x8e\xea\xf9\x5a\x56\xf5\x96\x1c\xbd\x3b\xbb\xb3\xa5\x89\x05\xb5\x87\xf5\x6a\x86\x50\x65\x9b\x70\x05\x89\xef\xfd\xc2\x69\x20\x99\x86\x24\xbe\x8b\x21\x9a\x3c\x8c\x22\xed\xe3\x6e\xec\x5b\xc7\xac\x56\xbd\x41\xbf\x3b\x6c\xf9\xbb\x3d\xe4\xae\x15\x2d\x2d\x94\xf9\x66\x40\xb4\x1f\x6d\x8f\x85\xed\x8f\x89\x98\xa1\x9e\x7f\xd3\xde\xf5\x85\x01\x71\xe6\xcd\x65\xab\x53\x82\xdd\xfc\xa5\x01\x04\x32\x2e\x7d\xf3\x77\xd3\xfe\x65\xd8\xfd\x20\xf0\x58\x50\x70\xc0\xa7\x39\xc3\x9d\xe8\x85\xee\x48\x38\x7d\xdd\x8a\xd9\x66\x6d\x21\x3b\x2c\x47\xb0\xd8\xff\xa3\x5c\x78\x23\x1f\x7c\x31\x2f\x99\x9b\x02\x36\xd5\x87\x0b\xed\x81\xd7\x21\x81\x43\x6e\x2f\x4d\x89\xed\x90\x7c\x9f\x10\x2b\xe3\xd3\x20\xc0\x58\x00\xfd\xae\x38\x27\x70\x3f\x26\x15\x2c\x04\x62\x76\x9e\x3c\x99\xc4\xb4\x87\x3b\xba\xee\xa6\x91\xe4\xf3\x2a\x10\x97\x7a\x95\x88\x69\x69\x47\xe0\x4b\xee\xfe\xa6\x54\x93\x14\x3b\x48\xac\xa2\xed\x62\x31\x21\xa5\xec\x3d\xc9\xb2\xef\xc0\x52\x45\x88\x5d\xd6\xbf\xf3\xfc\x8c\xe1\x18\x1d\x19\x3b\xf9\x48\xfc\xe6\x1d\xcd\xdf\x4d\xfb\xa7\x29\x16\x6f\x87\x12\x05\xbe\x6c\xad\xc8\x95\x63\xf4\x03\x32\x65\x00\x81\x8f\xe8\xc6\xa3\xb9\xba\x6e\xa3\x8a\x0e\x9f\x0e\x8d\xb2\x3a\x73\x91\x6a\xe5\xb0\x2e\x0d\xa8\xae\xb8\x2d\x99\xa2\xbb\xc6\x54\xcd\x60\xbd\x5e\x4a\xa7\xd7\xcc\x4e\x42\xde\xec\x1d\xb4\x4e\x3c\x51\x3c\x63\x5e\x9d\x12\x02\x98\xac\x8a\x2c\x09\xc7\xeb\x70\xfa\x9a\xeb\x4e\x50\x56\x64\xb2\x29\x54\x91\xa0\x75\xf0\x1d\x4e\x1d\x82\x61\xaf\x22\xbe\xbf\xa7\xad\x3e\x58\xd1\xc9\xce\x6e\x39\x2a\xee\x52\x88\x1c\x7e\xf8\xf3\xfb\x9d\xa1\xad\x6b\xef\xec\x6b\x59\x15\x55\x9d\x05\x21\xe9\xc3\x18\x3a\x2a\xcf\xf3\xa7\x0c\xc5\x7f\x58\x19\x3f\xf1\x10\x0a\x90\x06\xf6\xc6\x62\x15\x53\x5e\x36\xdd\xc6\xbe\x74\x7a\xc0\x7e\xe9\x35\x77\xaa\x25\xe7\x25\x6d\x8e\xd3\x41\x9e\xa3\x85\xd4\x56\xfb\x76\x07\xa0\x83\xa1\x5c\xf6\xdd\x26\x9a\x65\xf2\x6c\x48\xcf\x2f\x28\xd3\xae\xc2\x04\xa8\x10\x8e\x92\x59\xbb\x54\xdb\xf4\xb8\x26\x52\xa3\x9f\x20\xa3\xa7\x97\x62\xa3\x4d\x20\x53\x4f\x96\xe0\x61\x2f\xc7\x4a\xe8\xe2\xf6\xd9\x37\x67\xe9\x3f\xcf\x13\x02\xda\x97\x45\xb1\xbd\xf4\xc3\xf2\x00\xd1\x4f\x1e\xfd\x47\x52\xdb\x3a\xbd\xb5\xcd\x3d\xb3\x11\x34\x12\x58\x92\x66\x27\x76\xf1\xf1\x18\xc7\xb0\x3d\x53\x8d\x23\x2f\x02\x45\x2e\xbf\xc1\xfe\xef\x8c\xa2\x1f\x84\x30\x56\x1f\x09\x80\x85\x57\x6f\x53\x64\x59\x95\x93\xa7\x02\xa9\x1b\xfc\xf0\xa5\x50\x5d\x27\x6f\x46\x5e\xf6\xbb\x62\x5d\x8a\xe2\x08\x70\x39\x15\xca\xd5\x03\x4a\xb4\xa8\x48\x04\x1c\x38\x16\x6e\xf7\x63\xa1\xc4\x30\xd3\x61\x0e\x47\x32\x70\x84\xc6\x39\x78\xf5\x31\x7d\x53\x74\xdf\x7c\x94\xb0\x05\xfe\x8e\x8a\x92\x45\x2c\x91\xea\xdf\x51\x3f\xde\x31\xb8\x85\xf7\x7d\x8b\x23\xa1\x5f\x43\x82\xc7\xba\x7b\xec\x1c\x75\xaf\xe2\x5c\xba\x04\xaa\xb6\xce\xf7\x35\x2f\x76\x5e\x65\x56\x0a\xf4\xf8\x55\xc2\xf6\x9a\x99\xf0\xbf\xb6\x39\xf1\x63\x7a\x05\xa7\xdf\x66\xae\x8a\xc4\x2c\x4c\x08\xcc\xbf\x34\xe0\x32\x78\xde\xdf\x2c\x30\x28\x1e\x68\xe7\xf1\x0d\xe1\x40\x33\xff\x8d\xde\x8b\xe4\x36\x95\x2b\xec\xc1\x9c\x0c\x5c\x08\x88\x3d\xf0\xde\x6d\xf9\x2b\x4a\xdb\xf2\x0a\x64\x0d\x45\xcf\x19\xbe\x98\x4a\x19\x0f\x65\xef\x56\x5b\x4d\x67\x18\xa5\xf8\x28\xfa\xd3\x14\x44\x70\xad\x7b\xaa\xe8\x99\x06\x65\xd6\x23\x11\x2b\xf0\x08\x86\xaa\xde\x4f\xc1\xec\x93\xfe\xe8\xa3\x36\x1a\xad\x44\x5f\x62\xf9\x59\xd8\x05\xd2\xf7\x29\x28\xd3\xd6\xff\xf4\xa8\x5f\x4d\xf7\x60\xc6\xab\x25\x39\xa2\xe3\xc6\xa5\xcb\x7f\xc6\x46\x1b\x59\xd9\x25\x51\xe9\xbe\x02\xc1\xee\x40\xc1\x66\x78\x1a\xe8\x19\x8c\x00\xc8\x61\x15\x5e\x89\x56\xae\xc2\x95\x9d\x98\x33\xd3\xf3\x5c\xf3\xb3\x23\x69\x3f\x2c\xc9\xba\xbf\xe0\xda\xbf\xac\xb8\x1f\x84\xca\xc7\x87\x01\x00\xd7\xc6\x2a\xf1\x10\x38\xe3\x4c\x17\x98\xb5\x5e\xad\x0c\x30\xb9\xc0\x41\x53\x5b\x1a\xe0\x6d\x30\xce\x85\x1b\x48\xd1\xb3\xd1\x66\xbf\x03\xdf\xc0\x9c\x1d\x2c\xde\xf6\x19\x75\xf3\x47\xba\x32\xd5\xa7\x15\xc4\xcc\x7d\x67\x37\xcc\x79\x8f\xf6\xdb\x43\x81\xeb\x38\x4d\xea\x01\xcc\xb9\xc8\xca\xac\xe7\xf9\xb2\x9b\xc5\xad\xcc\xf8\x28\x73\xe9\x23\x4f\xdb\xa9\x45\xea\xb5\xbd\x39\x3d\xbb\xf8\x6e\x19\xe9\xb3\x6c\x45\x3d\xb0\xb7\xa3\xfa\xa1\x66\xda\x7e\xd9\xcf\x65\x1a\x1a\xec\xa0\xa2\x72\xef\x4c\xb9\x5f\x0f\xd2\xb4\xae\xf9\x30\x49\xcd\x22\x0f\xc6\xfd\x00\xde\xec\x8f\x82\x85\x55\x14\xb5\x22\xbb\x02\xbe\x07\x7a\xba\x3d\x5b\x49\xd9\x33\x4a\xec\xe9\xf3\xc8\x0e\xb9\xd1\xc1\x25\x5a\x44\x37\x13\x01\xe6\xff\x40\x90\x99\x14\x1e\x79\xe0\x1e\xba\xff\x51\x8f\x55\xeb\xf9\x12\x0a\x1a\xd4\x94\x2f\xd3\x3a\x4c\x85\xb9\xfe\xe0\xa1\x7d\x1f\x88\x56\xad\xbe\xd0\xbc\x55\xe0\x60\x56\x8f\xe4\xe5\xb4\xda\xb7\xf1\xa3\x7b\x67\xde\x43\xcb\x91\xaa\xb7\xf7\xd2\xd7\x23\x96\x9f\x94\x76\xf5\xef\x3b\xd1\xbf\xbc\x1e\x3f\x08\x15\x02\x14\x05\x00\xbf\xf4\x61\x09\x58\xdd\x86\x99\x4f\x5f\xdd\xbc\x84\xf1\xc1\xd9\x39\x0c\xbf\x9c\x82\x5b\x66\x0c\xb2\xbc\x9d\xc1\xac\xe4\xc4\x69\x9e\x05\x2d\x1f\xfc\x6f\x54\x3e\xee\x24\xb6\x43\x77\x2e\xe7\x62\x72\x5d\xc8\x28\xdb\x9f\x37\x4c\xdb\x3f\x36\x0c\x76\x83\xdd\xde\x31\xda\x81\x0d\xdd\x52\xdd\x5a\x76\xd6\x02\xe1\x86\x76\x6a\xf3\x46\x6f\x6d\xbf\xcc\x5b\xda\xb1\x7f\x27\x5e\xdf\xb3\xae\x5a\x3f\x32\x89\xb8\x8c\xdb\x07\x45\xf9\x22\x62\xbf\xd6\x33\xe8\x99\x19\xee\x66\xf3\x4d\x56\xa9\x7f\x7c\xb6\x37\x36\x47\xa6\xc6\x2e\xed\x5a\x61\x36\xd7\x4b\x06\x66\xca\xaa\x04\xd1\xd7\x6e\x2a\x9f\xa3\x9a\x57\x0e\x69\x7f\x43\x25\xaa\x13\x39\x2e\x4a\xcb\x91\x5a\x1d\xcd\xef\x2a\xcf\x9c\x6a\xed\xfd\xf3\xd7\x40\xfd\xcb\xa3\xf2\x83\xc0\xd3\xfc\xa7\xe6\x60\xf9\x56\xd2\x4d\xe1\xed\x25\x59\x2d\xd1\xed\x4f\xc3\xe9\xe0\xc0\x6d\x0f\x06\x12\x08\xa6\x61\xeb\x9c\x98\x37\xed\x1e\x6e\x3a\x48\x87\x53\xc0\xb9\xfb\x60\x1d\xe9\x95\x86\x1f\x7d\x75\x8d\x63\xec\x20\x2a\x87\xaa\x71\xe4\x2e\xf2\x4d\x67\x31\x52\xc5\x62\x5f\xd5\x77\x0d\x10\x7d\x1e\x0e\x45\x05\xbf\xeb\x25\x81\x05\xcf\xd2\x54\xfa\xf9\x8b\x61\x23\xa3\xa8\x47\x9b\x8e\xaf\xf5\xbb\x3f\xbf\xca\x9f\x93\xa7\x3b\x02\xa2\xb8\xde\xc6\x9c\xa5\xc3\xd7\x1a\x5f\xe2\x82\x7f\x7a\x60\x7d\x6c\x1c\x52\x36\x3c\x6d\x8d\xb8\x8b\xfe\x8a\xe6\x1b\x29\xd2\x73\x49\x7f\x59\xfa\xff\x32\x7b\x53\xae\x08\x60\x4d\x24\xeb\x0b\x6f\x82\x29\xe7\x36\x84\x05\xfb\x22\xb5\xf8\x0f\x16\x58\xd7\x3e\xa3\x12\x0a\xf3\x7f\x72\x53\xd4\xf2\x83\x7c\x7f\x7c\x7c\x4c\x06\xeb\xd9\xa2\xeb\xcc\x44\x8d\x35\xa6\xa9\xbc\xd4\xc7\xe8\x23\x91\x18\xf1\xe7\xc4\x9e\x28\x74\x14\x47\x59\x42\x68\x0d\x3d\x31\xb9\x86\x35\x02\x5b\x2b\x5d\x51\xdd\x7c\xfc\x55\x1c\xcf\xc9\x0a\x6f\x91\xe0\xf6\x9b\x22\x45\x70\x7b\x2a\x94\x73\x4a\x64\x6b\x97\xba\x6e\x50\x64\x2c\xf6\xc9\x15\x45\x22\xbd\x99\x2a\x2f\x12\x1c\xd3\x1a\xb3\x19\x1d\x87\x2c\x0c\x0b\x0f\xb9\xc3\x68\x6f\x0c\xee\xe4\xb2\x66\x77\xac\xc3\x29\x86\x3e\xdd\x08\xd3\x38\x98\x32\xba\x2e\x1b\xea\x8a\xf1\x58\xff\x4f\x11\x70\x3b\x51\xf5\x37\x41\x2e\x1c\x57\x33\xa8\xda\x89\x52\x3b\x99\x15\x8d\x4f\x92\xe6\xe7\xe3\xf7\x10\x32\xc5\x79\xc3\x5b\x52\xb5\xc8\x39\x7b\xac\x98\xe8\xd9\xb2\xfb\xad\xf3\x71\x84\xb0\x4f\x1d\x37\x62\xa5\x20\x27\xd2\x3d\xde\x96\x67\x9b\x3b\xa0\x4b\xeb\xf6\x4f\x79\x24\x6c\x57\x0f\x95\xbe\x3f\x21\x43\x14\x92\x9e\xd3\x3b\x82\xb4\xc7\x02\x39\x20\x5b\xaf\xfc\x27\xac\xcd\x5e\xdc\x44\xa6\xd5\xa9\xb5\x1f\x2d\xc4\x3e\x7d\xb6\xf3\x54\xda\xa3\x1c\x6e\x5c\xf1\x91\xe1\xd9\x61\xde\x3c\xe0\xb3\xcf\x1c\xb4\xf2\x39\x9c\x69\x4c\x1c\x64\x7b\xbe\xcd\xcb\x9d\x7f\x08\x33\xdb\x85\x86\xa1\x46\x7a\xb5\x49\x61\x60\x1b\x10\x8c\x03\x5a\x3c\x95\xfa\x15\xab\x87\x11\x89\xb6\x9d\x17\x53\x78\xee\xd8\xb7\x6a\x6a\xe6\x16\x2c\xbd\x3f\x07\xb7\x09\xa2\x56\x64\x2e\x4a\x13\x6c\xff\xc3\xcc\xb1\x85\x6f\xea\x97\x68\xc6\x32\x12\x4c\x98\x51\xcb\xba\xd1\x6c\xe0\x7c\x2d\xd1\x57\x85\x68\xe4\xd9\x28\xcf\x75\x08\x95\xc4\x01\xc2\x20\xfe\xd0\xbe\x4a\xfa\x5c\x12\xaa\x72\x6a\xe3\xa8\xbe\xc8\x08\x73\x9e\xf3\x73\xd0\x3e\x23\x1a\x55\xdb\xbc\x9b\x07\xe4\x67\x4f\xaa\x4a\x75\x71\xef\x34\xae\x53\x22\x10\xe2\x6b\x38\x84\xa7\x73\xdd\xdc\x61\x7f\x56\xf1\xf2\x6c\x8b\xed\xe6\xf6\xa5\x3f\x65\x64\x05\xa2\xeb\xac\x77\x88\xcf\xb6\x20\x73\x55\x39\x0e\xdd\x3c\x01\x88\xce\xac\x05\x7e\x18\x73\x3d\x29\x95\x25\x04\xa9\x7a\xfb\x33\xca\xf3\xff\xe9\x56\xbf\x72\x23\x16\x91\xc2\xf1\x0a\x41\xc8\x56\xec\x56\x9f\xfc\xf2\xd8\xe9\x22\x63\x76\xd1\x39\xea\xd1\x33\x42\x4b\x10\x06\xa6\x15\xec\xac\xef\x6c\xec\x64\x48\x2b\x1f\x60\x39\x1b\xf3\x2a\xe5\xd2\x2b\x13\xdd\x9a\xfc\x16\x1f\x0d\x5d\x48\x8c\xe4\x63\x86\x54\x1f\x89\x77\x0e\xd8\x31\x9b\x9b\xc0\xff\x78\x85\x9e\xb3\x42\x4f\xe4\xd9\x00\xfc\xb8\x21\xd4\x46\xdc\xf1\x5e\xc1\xc1\xbe\x37\xd3\xf9\xf2\x12\x93\xfa\x77\x80\xc4\xb1\xb1\x9c\x3e\x91\x55\x83\x57\x3b\xc6\x6b\xa4\x8c\x22\x34\x7a\x83\x7b\x20\xfc\xc1\xfb\xbd\xa1\x2e\x83\xc9\xbd\x87\x8d\x58\x2f\xc0\x5f\xc4\xca\x9d\x1a\x2b\x66\xfe\xe4\xf4\x9a\x42\xed\x54\x49\xb0\xc4\xa5\xeb\xb5\x3c\xc3\xf7\x36\xe5\xf0\x2f\x50\x30\xc1\x07\x6a\xf0\xc0\x49\x41\xce\xa5\xe1\x18\x3b\x22\xc7\xfb\x68\x5b\x15\x99\xb0\x76\x96\xf2\x32\x67\xeb\x8b\x74\x19\x75\xb3\x7b\x1d\x9d\xa7\x59\x2d\x0b\x21\x50\x79\x45\x16\xde\xc7\x22\x8b\xed\x66\xbd\xb0\x3a\xa1\x4d\x4f\x4b\xa8\x95\xd4\x18\xbe\xe8\x3d\xad\x9b\x1f\xde\xf3\xd7\x31\x37\xdf\x01\x5e\xd8\x54\x71\xd9\x88\x4c\x58\xd0\x28\x4d\xed\xde\xe3\x8c\x56\x14\x63\x71\x57\x64\xf8\xf3\x56\xc4\xc3\xd5\x9b\x73\x79\x07\xf6\x1b\x54\xc0\x72\x38\x51\x0e\xac\x0c\xce\x6e\x2a\x8b\x84\xbb\xc2\x52\x25\xf4\x6a\x27\x94\x3c\x5b\x88\x41\xf6\x24\x5c\x60\x26\x1f\xbe\xe2\x7c\x05\xc4\xc1\x7b\x77\x8b\x56\x04\x2a\xd8\xe4\xcc\x50\x95\x55\xa3\x85\x9f\xd5\xb3\xbf\x45\x8c\xce\xf0\x7b\x9d\xb7\xf7\x7f\x8b\x50\xbe\x40\x10\x04\x77\xea\xe6\x98\xac\xdf\x6f\x60\x9d\x94\xb8\x2c\x5f\xa6\xc0\x29\x57\x05\x16\xf9\xc5\xfa\xc8\x14\x82\x65\xf9\x24\x44\x30\xf1\xb9\x62\x08\x48\x4a\xe4\x6a\x8f\xb4\xf9\xff\x18\x7b\xab\xb0\xac\xa2\xa7\x7d\x98\x6e\x90\x14\xa4\x05\x04\x91\x96\xee\x0e\xe9\x46\xba\xbb\x1b\x69\x1e\x3a\xa5\xbb\xa4\x41\xa5\xbb\xbb\xa5\x04\xe9\x06\xa5\x91\x2e\x81\xef\xfa\xbf\x21\xeb\x77\x7d\x07\xbe\x27\x78\xe0\x7d\xad\xbd\x67\x3f\x2b\x66\x66\xcd\xdc\xf7\x74\x65\x7d\x27\xd3\xf2\x54\x50\x8b\xdf\x8a\x43\xfb\x97\x49\x63\xcc\x10\xe9\xe8\x54\xcd\xcc\xd7\xf4\xad\x14\x00\x74\x99\xa5\x79\x81\xb8\x0e\xf6\x9d\xb5\x0f\xeb\x37\xb7\x51\xf7\x34\x17\x52\xed\x78\x79\xc3\x0e\xcf\x47\xc1\xed\x4b\x39\x3e\xa8\x1b\x40\x2d\x30\x2e\x8c\x2f\x48\xb4\xf4\xb6\x25\xae\x42\xc9\xf9\x7c\x89\xa5\xc7\x2f\xfa\x27\x27\xc4\xbd\x87\x03\xb9\x37\x3f\x8e\x3c\x10\xea\xc9\xaa\x14\x62\xfb\x9d\x1d\xec\x57\x5f\x82\xbd\x66\x7e\xdf\x6e\xd3\xda\xbf\x0b\x6f\xd3\x16\x6b\x0b\x1e\x21\x98\x15\xe8\xef\x5c\x0c\x04\xaa\x9d\xae\xa2\xed\x19\x82\xf1\x6d\xf3\xa9\x53\x72\x75\x67\x97\x83\x82\x3e\x1e\xcf\xdc\x17\xce\xc1\x4f\xfd\xb8\x56\xda\x40\xa2\xbc\x4a\x02\xed\xc7\x2e\xbd\x1d\x47\xd1\xd1\x39\xd3\xf2\x18\x9b\xac\x08\x16\x6d\x5f\x95\x67\xbb\xb0\xe9\xcd\xcc\x44\xbb\x9a\x5f\x59\xa0\xe3\x8e\x07\x6a\x62\x91\x82\x2a\x19\xcd\x66\xc6\xf1\x59\xf8\xf3\xe4\xbe\x72\xc5\x05\x6a\x08\x5a\xb5\xaa\xcf\x28\x9e\xa7\x26\x5d\x54\xa9\xf0\x02\xaa\x92\x9b\x44\xfa\x02\x5f\x14\xde\x75\xbc\x8b\x31\x31\xa3\xd4\x77\xce\x1e\x15\xaf\x0f\x16\xff\xae\xed\x26\x9d\x0f\xc5\xb3\x39\x5c\x0d\x01\x9f\xef\x63\x15\x12\x96\x0a\x07\x1b\xf1\x55\xdd\xa2\x31\xcd\x98\x61\xbb\x6c\x34\x3c\x60\x0e\x83\x84\x41\x9a\xb1\x44\x31\xae\x73\x2f\x19\x80\xf2\xb6\x95\x18\x3e\xe6\x2a\xeb\x0a\xde\x4c\x1f\xf0\xe7\x23\xc3\xeb\xc7\x9b\x9a\xc8\xe5\x27\x9f\xae\x7e\x98\xe8\x35\x8c\xd5\x00\x0a\xb3\x4a\x0f\x96\xb4\xf6\x6e\xb2\x35\xc5\x37\x9d\xea\x2a\xb0\xd1\xd0\xd7\xb5\x5f\x42\x48\x4e\x95\x2f\x8c\x2d\x3c\xa8\x77\xde\xee\x01\xdc\xc3\x03\xfc\x8a\x91\x82\x4b\x56\xfa\x4c\xc4\xb5\x12\x89\xfc\x53\x2b\xda\x73\xbd\xe8\xa7\x71\xea\x9f\xa6\xe8\x4c\x49\x53\x2b\xad\x45\x9e\x90\x83\x5b\xb9\x9c\x1e\x74\x8d\x9b\x53\x6a\x68\xba\x78\xd6\x2a\x78\x84\x9b\x6f\xc3\xdd\x53\xba\x5c\x6e\x3b\x69\x92\xb8\xa4\xec\x85\x41\xa3\x0e\xeb\xc9\x9d\xbd\x30\x95\x6c\xcb\x3c\xbf\xf1\xef\x1c\xf7\x34\x2d\x29\x2e\x2f\xcc\x67\x7e\x32\x24\x2e\xd3\xc6\x24\xe4\x6b\xf9\xfa\xb4\xfd\x55\x3e\x4f\x98\xd9\x51\x2c\x20\x75\x40\x40\x23\x37\xb4\xa6\x2c\xae\x40\x8c\x8b\x3b\x50\xb0\xa0\x2d\xa6\x75\x62\xdf\x42\xec\x9d\xbc\x04\x4b\x30\xe6\x5d\x87\xce\xbb\xe2\x0d\x7f\x70\x5e\xe1\x18\x35\x1e\xbc\xb8\xd9\xe0\x86\x35\x8a\x7b\x5d\x1e\x49\x1d\xa8\x66\x46\x70\x05\xbe\x80\xba\x8e\x5d\x6e\xe3\xc5\x12\x3d\x77\xb9\x3b\x0e\x25\x09\x93\x59\x72\x48\xfd\xb1\x64\x81\x8c\x6e\x60\xf6\x64\xb9\x48\xcc\x33\x28\x20\x36\xe8\xd1\xb2\x46\xae\x38\x54\xe4\xfa\x46\x25\x28\x68\xef\x44\x2c\x2d\x4f\xdf\xbb\x83\x9a\xeb\x23\x46\x16\xd8\xb8\xf1\x29\x1e\x5c\xff\x28\xd8\x28\x25\x2f\xc9\xc5\x46\x0e\xf7\xcf\x30\x76\x20\x37\x46\x9a\x79\x9f\x36\x0f\xd0\x90\x53\x3f\x50\x42\x8c\x92\x25\xd5\x4c\x81\x8b\x85\x16\xb5\xf8\xf0\xd9\x9f\x90\x6d\xe3\x37\x2b\xcd\x85\xd8\xd2\x44\x79\x9f\xde\x78\x5e\xd4\xdd\xee\x1d\x9a\x43\xad\x30\xdb\xe8\x3f\x21\xf5\xaa\x84\x3b\x14\xb9\x7b\x9b\x96\xd6\xc7\x35\x51\x49\xba\x1d\xf8\x31\xa5\x3e\xe9\x94\x7c\xc6\x46\xc7\x28\x62\x5f\xa2\x35\xf9\x01\xac\x7f\xb5\x00\x07\x11\x4a\xb2\xf0\x3e\x85\x97\xe6\xb4\x39\x76\xee\x38\x81\x3d\x12\xd3\x5e\x62\x41\x2a\x30\xdd\x35\x33\x56\x96\x94\x4a\x40\xa5\xb1\x3a\x5f\x32\x3e\xac\x32\xaf\xfd\x58\x79\x24\x7c\xbb\xd5\xef\xb6\xb7\x52\x5a\xd0\x69\x7c\x7b\xae\xaa\xb4\x85\xb0\x82\x29\xbb\xe0\x97\xb2\xf9\x78\x7e\x87\xa7\x20\x6f\x27\x1e\x1a\x8a\x16\x03\x7b\x70\xfa\x36\x31\xc2\xb6\xd7\x34\x89\x3e\x59\x23\x62\xfa\xbb\x75\x5f\xf6\xff\x3a\x42\xff\x3a\xfa\x21\x62\xe4\x50\x48\xf0\x80\x23\xb4\x9a\x9b\xaa\x1c\xce\x33\xe8\x91\x4f\x7b\x18\xc4\x19\x85\x4d\xa1\x99\xba\xcc\x02\x97\xf1\xbe\xd5\x75\x5a\xd5\x05\xa6\xe7\x03\x48\xbe\xac\x44\x93\x1f\xc0\x4e\xe9\xbe\x1e\xcf\x3a\x39\x3f\x1d\x65\x7c\xbd\x02\xb7\x95\x28\xa2\xe5\x20\x37\xb4\x8e\x1f\xe0\xa3\xa2\xef\x07\x40\xdf\xa7\xb8\x26\xef\xeb\x5c\xbb\xe2\x47\xc5\x04\xf2\x5e\xbe\xac\x4d\xb7\xd0\xbf\x82\xf1\xe6\x57\xc9\x22\x8a\xe4\x65\x1d\xde\x06\xa9\x71\x1b\x92\xf0\x66\x6d\x6e\xb5\xf9\x16\x32\x29\x85\x4b\x3e\xaa\xc0\x62\x7b\xbc\x59\xe4\x1a\x7f\x63\x2a\xbb\xc1\xfd\xc1\xf3\x9b\xed\xd9\x5f\x1f\xef\x5f\xae\x0a\x44\x0c\x13\x1b\x1a\xf4\xf1\x24\xa6\x52\x26\xef\xf1\xf0\xce\x30\xcd\x4e\xf5\x53\x34\x0f\x10\xec\xfd\xa8\xb5\x0d\x4f\x94\xed\x8a\xcd\x58\xa7\xa0\x50\x05\xc1\x42\xba\x9f\x6f\xb1\xaa\x4a\x4a\xbe\xa7\x98\xb1\xa5\xa7\x66\xea\xf4\xc4\x04\xca\x04\xca\xbc\xfe\x8a\x69\xd8\x72\xd8\xc4\x45\x1e\xb0\x08\x3a\x6e\xdb\x98\x9f\x4b\xcd\xfb\xe9\x4e\x25\xb9\x08\xbc\x24\xbf\x29\x4a\xa8\x31\x3f\xa7\xfd\x82\x4f\x01\x11\x62\xa9\xd5\x5c\xdd\x51\x06\x4b\x1a\xae\xd2\xd2\xde\x75\x40\xef\x2c\xfd\x1e\x4e\x50\xa3\xff\x60\x47\x35\x45\x21\x16\x1c\x87\xba\xcc\x6d\x7a\xfd\x60\x34\x18\xe8\x89\xf2\xd7\x89\xff\x97\xc7\x00\x11\x9b\x80\x82\x01\x9d\x78\x67\xa2\x6c\x4f\x36\xf4\xf8\x0f\x8c\xee\x02\x8d\xf3\x27\xc7\x6c\x6e\x50\x13\x59\x77\xc6\x98\x1d\xa9\x6a\x4b\x8f\x25\x15\x5a\xa0\xb8\x47\x96\x56\x7d\xed\x3c\xeb\x8d\xa5\x9a\xae\x20\x6c\xe0\xaf\xc9\x98\xc5\x60\xaa\x5e\xd1\x2f\x44\xfd\x37\xe5\x29\x01\x2a\x57\x74\x30\x00\x14\xfd\x6b\x53\xd2\xc4\x22\x57\x0e\x64\x7c\xde\x26\x28\x31\xa5\xa5\x6b\xe0\xe8\xf9\x87\x05\xe7\x35\xed\x11\x3c\x73\x51\xf8\x7d\x90\x8e\xf4\xc5\x43\xee\x7b\xd2\x8e\xd8\xf4\x2e\x18\x7e\x18\x5e\xb4\xb2\x67\xb5\x18\x85\x37\xb5\x7c\xab\x16\x5c\x16\x2c\x2e\x07\xf5\xcd\x20\x9d\x51\xb1\xc0\x5e\x99\x87\x30\xc6\x0a\xdf\x8c\x9c\xdf\xfb\x98\x23\x82\x1f\x5f\x4b\x22\x52\xea\x96\x53\xf1\xf0\x84\x97\x6a\x8e\x30\x23\xfe\x5e\x24\xff\xcb\x1b\x81\x88\x3a\x90\x63\x02\x1f\x61\x76\x20\x0a\x56\xa6\xbb\xc5\x54\x05\x55\xf1\xa3\x1f\xdb\x8c\x79\x7b\x1c\x96\x84\x71\x48\x80\x39\xf6\x8e\xf1\xed\x05\x92\x66\x24\xf0\x0e\xa7\x3b\x9b\x2a\x85\x89\xc9\x1c\xb5\xb0\x99\xf0\x3c\xf0\x2c\xb0\x4e\xdc\x03\x81\x43\x32\x26\xaf\x67\x0e\x4f\x71\xd3\x3b\xbe\x81\xf3\xd1\x41\x3c\x3d\x55\x6f\x16\xa9\x76\x29\xfa\xe6\x59\xea\xa2\x9f\xe2\xbb\xe9\x85\xe4\x5c\x92\x78\x04\xd3\x04\x1c\x8a\x41\x42\xd8\x3c\xf0\x76\xf8\xb2\x18\x31\x8c\xe4\x5c\xa0\x49\x56\xc0\x23\xc4\x67\xfb\xd7\x16\x44\x2b\x68\x56\x8b\x1c\xd5\x6a\xf6\x5a\x6b\x7c\xb2\x14\xac\x51\x6c\x44\x5f\x2c\xeb\x2c\xa8\x21\x1d\xb8\x82\x19\xb1\xb8\x7a\xdc\x44\x2e\x31\x71\x71\xb7\x3d\x90\x91\x47\xb0\xa2\x1b\xdc\xbd\x59\xfe\xfb\x11\xfe\xe5\x67\x41\xc4\x0c\x90\x90\xc0\x59\xfe\xa9\x60\x4d\x42\x8c\xa2\xc7\xd7\x38\x87\x5c\x97\x3e\xe0\x10\xb5\xf0\x76\x6a\xf5\xd9\xe4\xb3\xf4\xcd\x6e\x8c\x7a\x6a\xe1\x8f\xba\xc0\xd6\x34\x69\x4a\x45\x60\x1c\x1f\xf7\xb5\x95\x2f\x7c\x68\xde\x7f\x66\x22\x47\x34\xf2\x68\x45\xc4\x76\x12\x02\x8f\x65\x91\xb9\x64\xf1\xe7\x69\x6b\x3a\xc9\xbb\x2e\x1b\xe3\x17\xef\x46\xf4\x0d\xdf\x8b\x69\x62\xe5\x5e\x99\xaf\x3d\xc8\x0a\xdf\xd9\x17\x7e\x1e\xd9\xc8\xb9\xd6\x0a\x52\xee\xf6\xfe\x92\x24\x8b\x82\x59\x28\xdf\x71\x44\xe3\x52\xff\x2c\x87\x59\xe7\xf0\x0e\x3d\x87\x92\x97\x8c\xaf\xcc\x01\xd9\xbc\x4a\x94\x09\x80\x86\x5a\x67\x57\x07\x98\x50\x8a\x72\xe6\x31\x64\x7c\x87\xc2\x97\xa5\x7d\x49\xf3\xd2\x49\x71\x93\x0e\x19\xdf\xa0\x77\x95\xc4\x95\xf7\x32\x10\xf6\xff\xe8\x41\x8a\x61\x41\x53\x42\x85\x3c\xed\xf9\x9a\x22\x7b\xbe\xce\x70\x88\xeb\xa2\x5d\xf2\x5e\x4e\x27\xbd\x4a\x04\xc7\x33\xef\x09\xdf\x2d\xff\x32\xfd\x40\x96\xc2\xe6\xdd\x0d\x94\x38\x17\xba\xde\x10\xbf\xe3\x41\xa6\xf6\x79\x23\x76\xe5\xbd\x33\x43\x91\x10\xb6\x9c\xa8\x14\x11\xa8\xfe\xaa\xa2\xba\xe7\xdd\x3a\x3f\xc0\x65\xd1\x64\xd3\x28\x9b\x2c\x25\xf7\x56\x74\x3f\xa9\x03\xe9\x57\x12\x71\x19\x0f\xe7\xe5\xa7\x71\x19\x68\x32\x9d\xa6\x8c\xfb\xd9\x19\x4d\xb0\x9e\xf1\x50\xfc\xfe\x27\x17\x72\xf7\x29\xb9\x94\xdd\x9f\xa2\xa1\x88\x11\x77\x1a\x91\xb5\x79\x45\x5e\x37\xcf\x44\x3d\xf8\xdb\xe0\x2a\x30\x3d\xcb\x6a\x9e\xe5\x63\x12\xf0\xfe\x5c\x75\x7a\x87\x7d\x58\xd8\x6a\x35\xa8\x55\x13\x69\x98\x8e\xb2\xd2\xd6\xf9\xe0\x5b\x15\x05\x58\x25\x19\x84\xb8\xa9\x40\x10\x8c\xab\xb3\xfd\x9a\xad\xe1\x19\x33\x39\xa6\x5a\x50\xd1\xaa\xb0\x64\x64\x76\xe1\xc5\x47\x6d\x97\x2c\x3b\x30\x50\x16\xeb\x74\x90\x4f\xbc\xf9\xb1\xb0\x6e\xa6\xb6\x55\xee\x2a\xab\xec\xe3\x9b\xf3\xa5\x37\x53\x1c\x76\x64\xac\xc4\x23\x5d\xf8\x2b\x98\x24\xf7\x61\xae\x9d\xfc\xbd\x35\xcc\x58\xa2\x35\xd2\x31\x75\x1e\x05\x27\x53\x2a\xfc\x2a\x83\x34\x47\x8d\x09\xdf\x19\x76\x57\x93\x2f\xf0\x6f\xfe\xf0\x5f\x2e\x27\x44\x14\x0e\x1a\x17\x98\x88\x04\x6f\x49\x84\x6f\x1a\x14\x7b\xa8\x45\x31\x5f\xd6\xd4\x78\x3f\xa2\xfb\x54\x67\xff\x61\xaa\x7f\xbe\xee\xb3\xc6\xee\x7d\x98\x68\x0b\xbc\x83\x26\x0b\x15\x87\xec\x79\xef\x5a\xc6\xe0\x49\xfc\xed\xe0\xc3\xe2\xdc\xce\x4d\xf9\x0f\xaa\xf7\x87\xee\xf6\xa7\x6c\x24\xd5\x7a\x60\x5d\xc7\xf9\x33\x34\xe1\x57\x1d\x63\xac\x65\x2a\xed\x26\x07\x5b\x22\x30\xb1\x84\x5a\xac\xe4\xe8\xe9\x3d\xc8\x78\x3d\xdb\xde\x37\xbf\x40\xe1\x3c\x87\x3f\xa8\x93\x1e\x3c\x37\x84\x49\xeb\xe8\x08\x46\x68\x11\xb3\x4d\xf3\xb7\x26\xe2\x66\x47\x14\xc9\x5a\xb5\x6f\xf4\xa1\x7a\xa1\xff\x16\x23\xff\xcb\x43\x86\x88\x89\x07\x41\xc1\x00\xe9\x28\x3d\xa8\x58\x91\x4f\x1f\x69\xa9\xbc\x3c\xa2\x4b\x6c\x46\x7b\x11\xd0\x85\xac\xad\x99\xfa\x91\x9b\xaa\x84\x0e\x88\xd2\xb5\x39\x40\xdd\x1f\xaa\xf7\x0a\x19\x3b\xc6\x48\xdf\xde\x15\xbe\x63\xb7\x74\x3c\x64\x42\x1c\xcb\x99\x96\xc8\x4c\x24\x2c\x1d\x95\x8f\xbc\x79\xf6\x08\x72\xd4\x16\x95\x43\x84\x9b\xcf\x29\xb6\xd8\x62\x99\x54\x84\x51\x56\x07\xae\xfb\x79\xee\x5c\xd1\x30\xfc\xc6\x3f\x71\x74\xd3\xc0\x96\x82\x15\x7a\x43\x19\x3e\xa5\xb6\x67\xa1\x2f\xa0\xaf\xdf\xaa\x05\x4f\x5c\xe7\x91\x58\x4a\x21\xcf\xe2\x4b\xa9\xe2\x34\xbc\x9a\x6e\x38\xf8\x0f\xdd\x83\xe6\x53\x72\xa1\x07\x39\xbb\x3f\xf5\xaa\xb1\xfe\x9f\x5b\x57\xfb\xae\x43\x74\x1b\xbf\xe2\x7e\x68\x78\xdd\xf3\xbb\x3e\xa0\xe2\x3f\x96\xee\x86\xc5\x2a\x9c\xbe\x83\xc5\xc9\x1e\x56\x92\xbf\xec\x33\x67\xbf\x23\x24\x3b\xcc\x25\x21\x89\xc6\x4f\x28\x9b\xbd\xc3\xbc\x21\xfa\x7f\xa7\xc2\xbf\xe2\x04\x88\x98\x10\x14\x14\x01\x20\x0f\xa0\xb9\x4f\xf2\xde\x9a\x0d\xdf\xa9\xcd\x87\xe7\xab\xbe\x33\x4a\xcd\xab\x30\x8d\x98\xd7\x01\x7f\xb6\x21\x32\xb6\xac\x89\x09\x8b\x80\x16\xee\xd7\x67\x46\x77\xd7\x8b\x6a\x88\xa6\x76\xdf\x29\x05\x68\xdc\xd7\x39\xf2\xd4\xaf\xeb\x91\xf9\x48\xa1\x8e\xaf\xb9\xd6\xa9\xd7\xf1\x81\xd7\x7d\xc3\x79\xf4\x52\x6b\xb1\xc1\x3b\x15\x41\x58\xfe\x87\x8d\x87\x55\x6e\x1a\xaa\xc1\xbb\x18\xad\xb7\x88\xb1\x29\x67\xa6\xee\xbf\x41\xad\x2e\xba\xa8\x61\xbf\x3d\xe9\xaf\xd4\xe1\xf0\x8b\x1f\x23\xe0\x22\x83\x2c\xbb\xa1\x0e\x8b\xc6\xa0\xdf\x59\x47\x1a\xaf\xcd\x3b\x7d\xd0\xfd\xdb\x51\xfc\xcf\xb8\x42\x84\x85\x0a\x38\x72\x96\x86\xe7\xa4\xd0\x20\xd5\x04\x07\xd5\xac\x56\xbe\x73\xac\x85\x83\xeb\xb7\x74\x0d\xeb\x1f\x5d\xbe\xbf\x85\x99\xab\xc7\x54\xac\x06\x5e\x21\xf5\x0a\xd5\xc7\xdc\x77\x26\xfb\x79\xb3\x38\x85\x3a\x2a\x55\x79\xce\x51\xd0\xa7\x66\xe8\x76\xd4\xd3\xa8\xc3\x9e\x0b\x8d\x0a\x50\xb9\xb8\xb3\x8f\xa4\xc1\x1f\x15\x06\xdf\xf7\x5c\x57\xd9\x22\x73\xbf\x99\x8f\xc6\x3d\x87\x4f\x9e\x0f\x22\x41\x3a\x57\x99\x81\x1d\x33\x0b\x40\x45\x46\xf8\xc4\x9e\xe7\x33\xec\x6b\xc0\x3e\xbb\x89\x34\xc7\x95\x9d\x88\x7a\xc9\x93\xc6\x7a\xaa\xd4\x80\x99\xea\x66\x39\x94\x1d\x01\x96\x22\xef\x04\xc3\x2d\x78\xd9\xe5\x4b\xce\x37\x5f\x5a\x49\x7e\xc4\x66\x36\x9e\xee\x49\x61\x17\x9c\xab\x68\x9d\xd6\xf8\x30\x8f\xba\xf9\xd7\xb1\xfa\x57\x6c\x03\x11\x93\x86\xfa\x0f\x72\x95\x17\x16\xd5\x3f\x0d\xbc\xa7\xef\x1c\x67\x8b\xae\xa2\xb7\xda\x75\x86\xd2\xdb\x22\xb5\x13\x59\x64\xf4\x08\x50\xe1\xbe\x4b\xc6\x81\x2b\x9d\xcb\xa8\xbd\xb6\xc6\x77\xa1\xae\x1b\x82\x1a\x27\xf8\xed\xfe\xf6\x5d\x14\x06\xfe\x28\xc1\x21\x92\x74\x42\xba\xb8\xa3\x81\xc8\x10\x00\xed\xa3\x1a\x42\x7a\xf1\xa1\x67\xfe\x55\xcb\xa0\x56\xc7\x9f\x05\xa2\x17\x05\xb6\xd1\xd7\x42\x30\xce\x69\xdb\x0a\x50\x7c\x2f\x86\x84\xc1\xeb\x30\x93\xd7\xa1\xb8\x49\x7f\x78\x0e\x78\xd5\x43\x0a\x57\x54\xf1\x06\x4a\x75\x25\xf6\xf7\x47\x93\xa6\x24\x3a\x26\x7f\x1e\x53\x2a\xfc\x3d\x4d\xff\x15\x8b\x41\x44\x61\xc9\x63\x81\xdf\x37\x99\xa7\x3a\x32\x6a\x37\xca\x3d\x93\xf5\xc3\x1b\x13\x94\x63\xe4\x53\xf9\x5a\x9a\xc6\xea\x5e\x89\xa4\x06\xd9\xef\x01\xe1\x16\xe0\xb5\x20\x66\x3c\x03\xe3\x38\x85\x82\x63\x47\xde\xf6\x91\xea\x64\x1f\x5f\x3d\xdc\x55\x51\x21\xc6\x12\x3c\xc7\xd7\x8d\x60\xf1\x08\x54\x30\xef\xfc\xf0\x2e\xac\xc5\x9c\x29\x40\x7d\x3e\x15\x2e\xa9\x21\x13\x5d\xa7\x3b\x20\x49\xe9\x9c\x66\x03\x9b\x3e\x19\x39\x54\xdd\xb1\x0d\x07\xbc\xc2\x24\x1a\xac\x91\x69\xb8\x85\x87\x43\x1e\x31\xd3\x23\x38\x7b\x77\x15\x0a\x13\xa7\x39\xe5\xa4\x59\xae\x28\xf3\xea\x00\x5a\xc0\x14\xbc\xe2\x22\x57\xc9\x7a\xb3\x3e\x71\xa8\x51\xd2\x83\x81\xe6\xc6\x07\x63\x31\xd4\x86\xcc\x6e\x71\x6e\xf1\xc9\x2e\xc3\x02\xdd\xc9\x44\xe3\xaf\x77\xf9\xaf\x30\x0f\x22\x06\x87\x8a\x09\xb6\x12\xfc\xc4\x38\x4c\x7b\xf3\x7c\x56\x35\x31\xfb\x9a\x49\xd6\x9f\xd7\x9d\x47\x46\xb6\xf6\x3d\x8c\x16\xf6\x8f\xfd\x3b\x2e\x89\x87\x0f\xa0\x68\x2d\x22\x56\xcd\x43\x74\xa3\xd2\x88\xfe\xf8\xdb\x38\xab\xe0\x43\x1a\xea\xad\xfb\xe0\x61\xd7\x93\x05\xba\x2b\xe1\xee\x6d\x7f\xc8\x16\x00\x9d\x93\xe3\xac\x5d\x2a\xf2\x76\xf7\x25\x64\x78\x3f\xc5\xc8\x0b\x2d\xdd\xaa\xfc\xe5\x14\x26\x98\x8d\xc3\x83\x2e\xf6\xd6\xf6\x12\xa4\x3d\x8c\x47\xed\xce\xc4\x40\x64\x9e\x39\x1e\x0a\x51\xeb\xc2\xa8\x91\x09\xf6\x31\x7a\xb9\x90\x82\xf4\x25\x8f\xe7\xce\x3a\x29\x8a\x09\x14\xe1\x48\x19\x23\x67\x7d\x18\xe1\x2a\x6a\x7b\x64\x1b\x2c\x31\x24\x62\xb3\x99\xa4\x74\xbd\xca\xcc\x2a\x46\x69\x3b\x48\xdd\x66\x5d\xb5\xff\xcb\x34\xfb\xaf\x58\x13\x22\x62\x80\x09\x30\xcd\xc2\xa5\x28\xc3\xb1\xf4\x34\x64\xbc\xd9\xdb\xe0\x79\x36\x99\x29\xf4\xcb\x50\x90\x18\x9e\x8d\x71\xe4\x1e\x81\x58\x08\xbd\x53\x04\xa4\xd9\x99\x54\xa5\x41\x55\xe9\x27\xb7\x8c\x3f\x36\x72\x5c\x1f\xce\x56\x8b\xfa\xae\x8d\x15\x3c\x77\x02\x55\x07\xb5\xec\xf3\x5e\x6e\x77\x15\xf0\xc0\x7a\x14\xbc\xda\xe8\x7b\x97\x04\x9d\x49\x03\x2a\xef\x1f\x6d\x1c\x18\xcc\x0f\x08\x9e\x4f\x72\x29\xa3\xf7\xdf\xb4\xa7\x72\x40\x03\xf7\xf9\xf3\xa7\x94\x3f\xa2\xdb\xb9\xad\x88\x96\x7b\x48\xb0\xec\xf9\xd3\x59\xbc\x2b\xa2\x3a\x22\x87\x16\xbf\xe6\xb5\x89\xa1\xc9\xe3\xfc\xf8\xbb\x37\xff\x2b\x32\x84\x88\x0a\xfb\x93\x83\x9c\x96\x7b\x8e\x70\xac\xbc\x4c\x26\xcc\xe4\x2b\x9e\x63\x78\xfc\xda\x31\x3f\x4b\xc6\x1e\x61\xf8\x06\xfa\xca\x83\x5f\xf4\xf9\x0a\x83\xbe\x0a\x5f\x9f\x64\x82\x95\xda\x6b\xa1\xb2\xf2\x1e\xbc\x8f\x41\x39\x23\x86\xfc\xb2\xac\x35\x5d\x5a\x09\xb1\xd9\xc8\xf6\xf6\x37\x1b\x20\xf4\xb9\x57\xe2\xf9\x0b\x9c\x7e\x83\xb4\xe7\x1e\x9f\x0f\xe8\xd1\xf7\x45\x65\xbc\x67\x95\x94\x31\xf6\xf7\x36\x6b\xf5\x24\x79\x44\xc0\x1b\xc1\x5f\x21\xf2\xa6\x6b\x27\xca\x6c\xda\x85\xc9\x1f\xc8\x34\xd9\x57\x5b\x35\x98\xb6\xda\xa8\x9b\x08\x1e\xaa\x8e\xb5\xef\xda\x78\xe9\x2e\xc7\xff\xa7\x1b\x1f\xd3\x40\x4a\x52\xa4\x12\xc6\x38\xf3\x82\xf8\xa3\x61\xd5\xb8\xac\x76\x37\xd1\x25\x35\x6e\xba\xbf\x14\xc7\x7e\xba\x25\xbc\x2a\x39\x44\xec\x78\xb5\xe3\x3f\x74\x14\x99\x35\x92\x2d\x1a\xf7\x32\xfc\x62\xeb\x35\x57\xb5\xd4\xfc\x5b\x1a\xb3\x6a\xe2\x2c\xae\x6a\xb1\x06\x70\x87\xb9\xb2\x96\x7e\xf3\x3e\x7d\x5e\x77\x2d\xec\xe7\x0e\x39\x66\x99\x3d\x53\x84\x85\xba\x87\xac\x87\x24\xcc\xf7\xf0\xb3\x79\xdb\x3a\xa4\x47\x19\xbc\x72\xdf\x83\x95\x81\xbb\xbb\xfe\x62\xb9\x42\x78\x63\x74\xa4\xcf\x6f\xad\x14\xbc\xc8\x27\x5b\xc7\xe1\xd6\xed\x8a\xb2\xaf\xed\xa6\x0b\x30\xbe\x07\x4c\x1c\x83\x51\x7a\x48\x75\x97\xd0\xd0\x2f\xc1\xea\x92\xf0\x59\x68\xb5\x43\x82\x72\xaf\x17\xcf\x8d\x1f\xaf\x07\x5c\xe0\x6f\x0c\x49\xac\x77\x06\xbd\x00\x57\x98\x8f\x40\x9a\xb0\x0e\x87\x36\x3a\xeb\x8f\x69\x1e\x59\x38\x35\x49\x9a\xe3\x91\xb9\x5a\x4a\x5b\x63\xa8\xf1\xe2\x07\x45\xdc\x1b\x70\xd4\x7b\xe2\xe7\x95\x49\x1d\xb9\x47\x8d\x70\x04\xce\x4d\x2f\x10\x37\xe4\x8c\x9d\xab\x68\xc9\x3e\x47\xd8\x2f\x1c\x18\x0b\xbe\x74\xbf\x7e\xb2\x5f\xc4\xf0\xd2\xbc\x00\xc7\xf0\xe7\xca\x19\x7b\xd6\xa6\x49\x8f\xcf\xb6\x40\x77\xcd\x1d\xc3\xf1\x64\x6d\xf4\x2b\xed\xf8\x64\xb3\x4f\x4f\x56\x29\x48\x33\xd2\xcf\x1c\x29\xa8\x5e\x93\xfa\xc5\xcd\x94\x74\xb9\xf2\x13\x23\x1c\x24\x4a\x63\xc3\xe4\x57\xe2\x0b\x1e\x6c\x37\xf0\x3c\x21\xb3\xc8\x66\x25\x49\xb0\x37\xe9\x75\x1f\x51\xb0\x37\x30\xfd\xc6\x7f\xd5\x45\xfb\x10\xc0\xcd\x48\xd1\x4a\x2e\xae\x88\x2a\x37\x9e\x83\x9a\x03\x8e\x27\x0d\x4c\x2a\x18\x6f\xfc\x6b\xd0\x50\x44\xb1\x4f\x74\xee\xb5\xd5\xa4\x2c\xc9\xfe\xa4\xb9\x93\x13\xf6\x92\xcd\xa1\x03\x42\x06\x8a\x36\xee\x75\x3e\xc6\x30\xf1\x89\xee\x83\xb5\x38\x0c\xf8\xc7\x51\xe3\xc7\x66\x24\xda\x04\x84\xee\x5c\xfc\x46\x2a\xd2\x0b\x40\x9d\x6a\x3e\xc6\xfa\x0a\x77\x14\xdf\x9b\xa6\xa8\xdb\x52\x87\x7c\xd1\x02\x11\x49\x44\xc4\x94\x69\x49\x68\x71\x23\x36\x87\x95\x71\x01\x4c\x90\xc8\xfa\xe0\x8c\x18\xea\x2e\xf1\xac\xc4\x4a\x7e\xee\x9d\xf7\x9e\xba\xcc\x5a\x29\x56\x5b\xbc\x3e\xa2\x78\xe8\x48\xc8\xfb\xbd\x40\x16\x80\x26\x72\x3d\xcc\xa8\xbe\x64\xfa\x1d\xfb\xfb\xaf\xb1\x05\x65\xe7\x81\xd9\x23\xea\x3b\x2b\xce\xf4\xb0\x72\x06\x30\xcf\xdd\x9c\x7e\x03\x89\x1f\xeb\x4c\x79\xde\x32\x8a\x84\x57\xb9\xad\x53\xfc\x17\xe4\xa9\xb6\x11\x61\x77\x38\xb0\x22\x88\xb9\xef\x8f\x45\x19\x6c\x46\xe4\xec\xc0\x26\x67\xc2\x44\x7e\xc3\x02\x46\x9e\x57\x1e\xf8\xca\x0f\x03\x82\x63\x03\x72\x9a\x64\xe3\xa6\xb2\x92\x10\x7a\xd2\xc8\x56\x1e\x7d\x58\xa0\x02\x07\x2b\x2b\xb6\xc5\x23\xf4\xb8\x7a\x71\xf7\xeb\x18\x01\x39\x4d\x3c\xbf\x11\x1a\xf4\x8e\x6a\xa0\x16\xc5\xe9\x9e\xd1\xe0\x63\x30\xc0\xe7\x89\x67\x7e\xc3\x68\x4b\x2c\xbc\xfd\xaa\x2e\x71\xfa\xf6\x8b\x61\x52\x15\x45\x9f\x3d\xf9\x2d\xc9\xd0\x08\xd7\xd6\xe2\xc7\x40\x2f\xd0\x45\xd4\x95\xac\x84\x9c\x6c\x77\x24\xc1\x34\x53\x74\xee\xbe\xd4\xb1\x52\x90\xf1\x75\x54\xf5\xa2\x78\x19\xce\x7a\xa4\xb1\xe5\xb2\x0d\xec\x42\x72\x1f\xe8\x9f\x7f\xa1\x96\x1d\xcc\x85\x83\xeb\xe5\xe9\x50\xde\x9a\x79\x16\x1c\xbf\x26\xd3\xc2\x96\x14\xf4\x6b\x58\x22\x77\x13\x48\x91\x16\x39\x25\x14\x27\x33\x37\xfb\xbb\x56\xaa\xe0\xa7\xfe\xd2\x52\x5c\x50\xbf\x92\x9f\x40\xbc\x7b\x61\x8b\x65\x6f\x91\x51\xfc\xbb\x1b\x30\x1f\xcd\x05\x7b\x6c\x7e\x5c\x9a\xbe\xef\x81\x1d\xa1\x10\x81\x7b\x29\x8e\xc6\xe2\xd2\x7f\x65\x17\x73\xcd\x35\x22\xa3\xe1\x59\x6a\xfd\xd3\xa0\x31\x89\x38\x91\xdf\xdb\x4a\x69\xaf\x3a\x46\x1d\xc6\x3e\x0e\xb3\x9a\x41\x98\x98\x73\x33\xc4\xfb\xfb\x3a\xa4\x61\x61\xdc\x1e\xda\x00\xe7\xf0\xf3\x2d\x1a\x99\xc3\xdc\x54\x75\x3f\x05\x8e\x46\x9f\xd4\x9a\x73\x7b\xc9\x81\x11\x8e\x26\x4a\xfb\x2d\x6e\x73\x21\x7a\xb8\x29\x28\xc9\x7e\x44\xba\x75\x2f\xf8\xb9\x26\x01\x8b\xbd\xfb\x4e\x44\xc7\xb2\x80\x3f\xc3\x8d\x53\xc9\xcb\x64\xf6\x86\xda\xd2\x30\x33\x1f\x10\xb1\xec\x84\xfe\xc1\xd9\x56\x14\x3f\x36\x5b\x46\x68\xf7\xc8\x4c\x31\x70\xb1\x96\xf7\xbb\x4f\xdb\x59\x83\xf5\x63\x7f\x07\xab\x85\x7d\x02\x30\xa8\xf9\xa7\x0e\xcc\xec\xc0\x36\x21\x42\x64\x64\x98\xc7\xdc\xa0\x04\x75\xc2\x82\xd5\xd3\x8f\x68\x2f\x36\x84\x78\x30\x93\x30\xf5\x6f\x81\xfd\x04\x13\xa5\xbb\x3c\x9e\x55\x7a\x76\x53\xc4\x86\x32\xb4\x48\x6c\x5c\x80\x24\x5b\x4d\x4f\x29\xf8\x80\xe9\x02\xe1\xcf\xe0\xa3\x3d\xf0\xa1\x0c\x2a\x8f\xa1\x96\xf5\xa8\x79\x5d\x8d\x54\xd3\xdb\xdb\x7e\xe9\xe2\xae\xc1\x1b\x56\x04\xdd\x2f\xa8\xb9\x62\x25\x4e\x2e\xea\x90\x03\x4b\x2f\x12\x95\x54\xf9\xf9\x82\x82\x60\xc0\x48\x56\x97\x8e\x40\x30\x59\x83\xc7\x79\x98\x17\xb2\x1d\x11\xb1\x1b\xb2\x5e\xcc\x3d\xd0\xb5\xdf\x15\x6f\xe4\xe0\x5b\x5f\x8e\xe7\x37\xab\xa4\xce\x54\xeb\x98\x74\x37\xb6\x54\xb9\x48\x44\xc6\xac\x6c\x3b\x2e\x39\x9f\x7e\xb9\x0a\x3c\x9e\x61\xdc\x94\xca\x05\x9b\x2d\x12\xd5\x1b\x2b\xca\xa5\xb3\x81\x24\xd6\xe9\xd1\x69\x65\x6c\xc8\x90\xbf\xbb\x73\x25\x4a\x49\x09\xd8\x23\x65\x5b\xb2\x2b\xc6\xe4\xd9\xfa\x8b\xab\xc9\xde\xa1\x8f\x8d\x53\x35\x90\x20\x5e\xae\xc1\xec\x3b\xee\x4e\x98\xca\x3f\xf2\x7e\x64\x7f\x42\xca\x5d\x1f\x6a\x7e\x22\x29\xeb\x7b\xbe\x0d\x35\x5a\x11\x93\x4d\xe9\x15\xc5\xd2\xaf\x64\x95\x47\xc1\x2f\x9f\xda\xaa\x05\xef\x2a\x04\x7c\xd2\x57\xce\x5e\x09\x17\x9c\xbc\x1f\xb3\xd3\x5b\x3e\x09\x57\xe0\xb8\x42\xac\x4d\x97\x0d\x9c\x67\x05\x08\x07\xd9\x32\xfd\x35\x70\x11\x40\x46\x1c\x15\x66\xda\x47\x0a\xc4\x7b\x42\xec\x69\xda\xa4\xe5\x87\xbd\x12\xa1\xda\x5d\xf1\xf1\x31\x4f\xcc\xf2\x4f\x50\xfc\x62\x16\xc0\xa0\x22\xab\xcb\xb3\xfb\x70\xb5\x7e\x54\xcf\x16\xc5\x5f\xef\x64\x7f\x37\x90\xb9\xa4\x44\x8b\x7a\x73\x83\xdc\x35\x52\x51\xae\x40\x9c\x04\x10\xb8\x47\xf2\x45\xb6\x09\x10\x9f\x78\x6e\xfd\x1e\xbe\xb0\x18\xc9\x19\xab\x7e\xc8\xdb\x75\x7c\x21\xa4\x0e\x55\xa7\x8a\x7d\x59\xb9\x0f\xee\xbb\x1b\x78\x88\x2d\xe4\x9d\x52\x8a\x88\x74\xfb\xcc\xea\x52\xb6\xe2\xeb\x67\x09\xae\xe6\x75\xe2\x6d\xc7\xe1\xa7\xbe\x4b\xc1\xa3\xc8\x4f\xdf\x14\x01\x6a\xe6\x52\x09\x8f\x6c\x45\x25\x5d\xd4\x95\x6a\x81\x78\xf4\x2d\x9d\x82\x5d\x0f\x84\xd4\x73\xd1\xc4\x70\xe6\x24\xad\x3c\x01\x48\x24\xfb\x70\x33\x46\x30\x70\x21\x75\xab\x94\xb1\xa8\xfc\x6c\x27\x7e\x78\xfb\x59\x72\x6e\xea\xb1\x6d\xe8\xbd\xe8\x3b\xc9\x71\x9a\xf7\xc0\x3d\x1e\x1b\x34\x7c\x99\x8c\xed\xd4\x51\xcf\x23\x96\xa2\x4e\xe7\x6b\x5e\x65\x45\x64\x87\x92\x17\x7a\x46\xa7\xb5\xf2\xba\x39\xfc\x66\x80\xf9\xb5\x01\xa4\x05\x69\x2b\x6b\xe4\x91\xbd\x4b\xdd\xb5\x09\x5c\xb4\x5f\x63\x56\xa6\x4c\x9e\xb3\x7e\xce\xa9\x1f\x1d\x6c\x35\x1b\x57\x03\xf8\x62\xde\x40\x14\x62\x9b\x7e\xf1\xc3\x21\xab\x3a\x2c\xc7\x69\xbf\x39\xc8\x61\x4d\xa5\x3b\xbf\x65\xc6\x3e\x17\x32\x71\xf1\x9a\x67\x03\xcd\x67\x91\x6c\x75\x3d\xf2\xb1\x3a\xbb\x14\x87\xa6\x57\x93\x5b\x87\xe3\x9a\x6d\x4b\x49\x5c\x1e\xd3\x60\xd3\x9a\x24\x84\x2a\x0f\x67\x04\xa0\x73\xd2\x8c\x44\xfc\x0a\xab\x04\xc5\x6f\x66\x13\x0a\x33\xfb\x75\x0c\x1d\x98\x13\x48\x3f\xfa\x28\x42\xa7\x3c\x43\x21\x9b\x49\xb3\x7d\xda\xa5\x74\x33\x23\xa2\x73\xaf\xf5\x6c\x95\x3b\xfd\x9e\x71\x8b\x9b\x1b\xc5\xcb\xfc\x40\x9f\x77\x15\xfa\x31\xa5\x90\xf8\xc5\x53\xe1\xe5\x2f\xc0\x2a\x5f\x82\xa4\xd8\xe8\x56\xfc\xcd\x98\x0a\x44\xce\x17\x38\x9f\xe7\x45\x88\xaa\x0c\x49\x1d\xa9\xec\x5e\x7f\xab\x15\x40\x7c\x5d\x4f\xf7\x64\x55\x6f\x85\x8b\xb8\x42\x74\x9c\x65\x12\xc2\x78\x25\x91\xf9\x76\x7d\xf0\x18\x12\x3f\x17\x8a\x7e\xef\xa7\x63\x84\xba\x77\x7c\xe9\x60\x0c\x19\xc9\x5e\xdd\x6a\xea\x17\x59\x54\xa8\x8d\xce\xeb\xf4\x53\x1c\x71\x43\x51\x48\x3e\xd7\x03\x83\x56\x94\x0b\x3b\x2c\x17\x25\x9c\x16\xfc\x00\xec\xbd\xd1\xdf\xd7\x5a\x86\x8a\x22\xc9\x8a\x2e\x0f\x1c\x7e\x2d\xe2\xd3\x11\xfe\xf8\xb5\x62\x39\xf9\x12\x89\x04\x6f\x4f\x17\x8f\xed\x69\xd4\xb2\x32\x21\x47\xb8\x12\xc2\x3b\x56\x95\x60\x6a\x18\xf6\x31\x6e\x7e\x87\xfd\xf5\x96\xf6\x7d\x46\xcd\xf5\xba\x58\x93\x8f\xb6\x72\xc0\xf2\x93\x62\xa5\xd8\xb2\x78\x49\x11\xb5\xa2\xd6\x4f\xa7\xa5\x96\x2c\xb1\x66\xb6\xc1\x77\xca\x29\x5a\xd1\xc3\xe9\xc7\x2a\xe7\x7e\x39\xfd\x64\x95\x6b\x3d\x37\x9d\xd6\xf4\x8a\xd3\x29\xec\xbb\x04\x63\x2f\xe7\x3e\x21\x83\xb0\x7c\x3e\xf9\x6c\xf1\x2a\x5c\xdc\xb7\x1c\x5e\x83\xc0\x45\xa2\x47\x3d\x57\x7c\x5c\xa6\xe4\x86\x1b\xdf\xd9\x72\x4a\x67\xd1\x6e\xb2\xd7\x09\x31\xb4\xac\x62\xdc\xa7\x0b\xf6\x39\xe8\x31\xd7\x32\xe0\xf1\x5c\xad\x17\x13\x77\xe9\xc8\x43\xab\x08\x48\x32\x8a\x4d\x35\xf0\x97\x8d\xe8\x3f\xd8\xf3\x7e\x8e\x57\x71\x2e\xc7\x66\x42\x09\x00\x81\x79\x75\x07\x79\xa2\xad\xc6\x87\x5e\xa3\x94\xbb\xd4\x3f\xcb\x9c\xa3\x0a\xf8\xf1\x4e\xb9\xb9\xb4\x58\xbb\x62\x2f\x54\xb7\x0b\xa6\xd3\x80\x0a\x98\xd9\xd2\x12\x71\x62\x71\x2d\x54\x3c\xb2\x82\xc1\xfb\xb7\x8a\xf1\x26\x14\xbe\x45\x28\xf2\x88\x44\x5f\x15\x06\x8c\xa6\x92\x11\xff\x06\x9a\xff\x72\x8f\x20\x62\x52\x50\xc8\x60\x6e\xf3\x2d\xe1\xca\x2b\x8a\x15\x2f\x93\x5c\xfb\xf0\x17\x38\x22\xb1\xec\x57\xa5\x31\x44\x59\x3b\x76\x32\x42\x96\x1d\x75\xa1\x3b\x18\x20\x81\x65\xd5\xad\x92\x09\x5a\xcd\x4d\x64\x2a\x25\x72\x58\x1d\xb2\x9a\x40\x42\x55\x96\x01\xc6\xd1\x74\x77\xe7\x01\xeb\x62\x77\xe5\x3d\x98\x4c\x59\x9a\xe4\x0d\x7b\x51\x4d\x4c\xbe\xdd\x4c\x07\xcb\xe7\xf2\x0d\x59\x39\x95\xa1\x46\x65\x66\x4c\xa7\xc3\x2d\x47\x66\x2f\xb0\x06\x64\x21\x84\xe9\x66\x4e\x44\xf5\x3f\xa4\x24\x7f\x81\xf9\x85\x05\x23\xe0\x3b\x5e\xd1\x51\xef\x19\x3b\x6d\xc9\x4d\x48\x6d\x96\x80\x0a\xb7\xc8\x5f\xd3\xfe\xe5\xa3\x41\xc4\x30\xd1\x30\x41\xd3\x42\xb8\xdd\x71\x51\xfb\xed\x11\x95\x3f\xe6\x50\x28\x0c\x89\x9f\xd7\x25\xf9\xa8\x79\x66\xc1\x67\x04\xc3\x38\x88\x50\x63\x48\x80\x12\xf4\x9d\x2a\xfd\x21\xbf\xe8\x86\xdb\xb6\xbc\xba\xf2\x69\xdf\x36\x48\xea\x30\xf3\x20\xe1\xd9\x27\x3f\x50\x68\x95\xbc\x5e\x9c\xb2\x03\x09\xf6\xe7\xd7\x16\x21\x33\x6c\x06\x18\xa4\x3f\xd7\xe3\x5c\xc6\xd8\x15\x11\x4d\x33\x25\xfc\xbc\x55\xe9\xc3\x09\x8f\xf0\xcb\xbd\xd1\x4e\x01\x68\x46\x72\x48\x1c\xb6\x80\x3f\x31\x07\x7d\x55\x76\x1b\xff\xc5\xd6\x37\x64\x41\x21\x14\x92\xe4\x5a\xbf\x96\x05\x6a\xde\xe6\x37\xe7\x7f\x63\xe8\x7f\x6d\x83\x10\x31\x4c\xa1\xff\x10\xbd\xdc\x7e\xf8\xc3\xc6\x15\x89\x0b\xa7\xdd\x51\xff\x20\xb0\xfe\x81\x98\x5f\x7a\x54\xae\x6e\x52\x3b\x36\xa0\x4b\x17\x0d\xb9\x3d\x11\x94\xde\x7e\xff\x91\x7b\x31\x98\x19\x3f\x23\x77\x50\x5e\xff\x83\x95\x64\xaa\x3c\xaa\x59\xa4\x45\x0f\x11\x63\xf1\xf2\x30\xea\xd8\x0e\xfa\xcf\xa7\x49\xe6\x3d\x9d\x0b\x73\x22\x81\xa8\xfc\x72\xd8\xde\x22\xbf\x37\x33\x4e\x62\x25\xc4\x42\xf7\xd2\xa5\xac\x38\x2b\x27\x2f\xeb\x40\x02\x64\xc5\x2c\x14\xeb\x09\xb8\x48\xc3\x41\x45\x3a\xbb\xf2\x19\x80\x2f\xd1\x3e\x45\xd7\x0c\xd9\xf3\xdc\xda\x63\xb1\xd1\x66\xea\x4f\x2c\x84\x02\xab\xf6\x69\xd1\x52\x42\x95\x5a\x79\x3d\x9e\x95\x8a\x2c\x88\xb0\x66\x58\xe7\x71\x68\xe6\x4a\xb8\x32\xf5\xcc\x0d\x68\x7b\x7a\x41\x1a\xff\x7e\x84\x7f\x6d\x86\x10\x51\x61\x64\x18\x20\x84\x36\x56\x92\x68\x08\x65\x36\x4c\x63\x0b\xc4\x44\x7b\xa0\x0e\x8a\x40\x3a\x4d\xea\x13\x4f\x13\x56\x30\xf8\xa8\xbd\xa1\x80\x86\x08\x72\x12\x54\xac\x5e\x63\x44\x39\x33\x5a\x47\x88\x3a\xa8\x44\x50\xa1\xd2\x2c\x4a\x07\x41\x75\x8a\x06\x42\x85\xe1\x27\x95\x67\x19\xe2\x83\xca\x7d\xae\x95\xb9\xa6\xab\xa8\xad\xab\x3b\x54\x17\x69\xdd\x30\x7a\x0c\x19\x61\x58\xad\x91\x7a\xd4\x52\xe4\x41\xf3\x5b\x3b\x3b\xcb\x60\x77\xe8\xc5\x54\x2f\xdb\x9e\x5f\xe5\x2a\xaa\x84\x02\x0d\x07\x3b\xa9\xff\x59\x70\x63\xc0\xcf\xb0\x25\x22\x78\xab\x8c\xde\xa2\x0c\x6b\x38\x30\x25\x9d\xcd\x59\x84\xc0\x31\xf1\x15\xf6\x30\xf6\xeb\xae\x61\xe6\x38\x61\x73\x7e\xad\x86\x58\xd3\x19\x47\x20\x1a\x63\xaa\xd8\x3c\xd3\xdf\x50\xf3\x5f\xdb\x3c\x44\x54\x04\x09\xa4\xfb\x74\x9f\x5a\x33\x59\xb3\x6e\x22\xe2\x50\x23\x27\x8f\xf8\xe4\xd7\xbb\x5b\xe4\x98\x80\xba\x28\xd4\x64\xaf\x63\xf7\xfc\xc4\x8d\x0d\x2c\x0a\xeb\xf1\xcd\x57\xc1\xc2\x8a\xc3\x12\xdc\xd5\xb8\x35\x68\x5b\xe0\xf7\x34\x68\x7e\xd0\x09\x1e\xe1\xa4\x3b\xf3\x3f\x7e\xf5\x3b\xe1\x04\x80\xbe\xca\x7a\x46\x45\x98\xbc\xc6\xae\x60\x69\xba\x2a\x28\x3f\xe8\xf9\x9e\x47\x88\x56\x9a\x01\x4b\xc2\xef\x1e\xe7\x5e\x76\x46\x16\x2c\x9b\x16\x83\x5a\x84\x75\xc1\x51\x78\x53\xce\x8c\x90\x3c\x5d\x53\xae\x7a\x03\x75\x45\xa8\x24\xc4\x69\x2d\x20\xcc\x57\x34\xd5\x69\xfa\xf3\xaf\x65\xff\xda\xea\x21\xa2\x83\x50\xa0\x9a\x47\xce\x54\xbc\x93\x34\x36\xb6\x83\x87\x26\x7e\x8b\x42\xdd\x70\x27\x79\x73\x38\x2d\xbe\x7d\x48\x05\x6d\x92\x6a\x59\x70\x3d\x2d\xa8\xd6\x92\x72\x2a\xae\x2e\x1c\x53\x66\x4d\xf5\xf9\x6a\x08\x76\x11\xce\xed\x3a\x46\xdb\xa2\x9a\xde\x71\xb3\x80\x48\xc8\x98\xb2\x2b\x09\xac\x3d\xdd\x4b\x62\x92\xf9\xd3\xc2\x3b\x11\x51\xde\x51\x67\xa8\xb8\x93\xe6\x68\x12\xba\x49\xaf\x63\x6f\xf9\x73\x63\x8f\x54\x37\xbe\xef\x06\xcc\x2e\xf6\x16\x04\xa3\xff\xd6\xe3\xa8\xf1\xce\x8c\xa6\x96\xc8\xbb\xd5\xe4\xf1\xcb\x17\xb7\x7e\x2f\x6d\x81\x3d\xda\x24\x2e\xcc\xc2\x7d\x59\xf6\x3f\x8d\x89\xd8\x47\xab\x3e\x88\xc3\xf0\xd7\xb6\xc7\x19\xd8\xfa\x6b\x78\xd4\x0f\xbf\xa0\xec\xd5\xe5\x87\x2e\x14\x82\x11\x1c\xa9\x69\x4f\xcd\xff\xff\x94\x76\xa4\xed\x7a\x29\x43\x70\x9f\xe7\x78\x6a\xc4\x26\x94\x09\x8a\x46\x39\x2f\xcd\x69\x65\x31\xa7\xec\x2f\xef\x6d\xfe\x18\x9f\x4f\x02\xa5\x1e\xf7\x2f\xe8\x3e\xcc\x14\xf9\x18\xa4\x09\x4b\xb0\x99\x62\x8c\x04\x10\x3e\x34\x8a\x9c\xcb\xc3\xbe\x08\x95\xf7\x60\x22\x18\x8a\x78\x0b\x2c\x74\x75\x37\x91\x17\x0a\x7b\x72\x6e\x86\xda\x50\x15\x5f\xa0\xe3\x44\xe8\xfa\x50\x88\xa3\x5c\x5a\x96\x96\xdd\xb9\xbf\x4a\xc1\x09\xc1\x01\xe7\x0e\x26\xfc\xcc\x5b\xdd\x9b\x3b\x55\xbe\xc9\x58\xca\xe9\xbc\x67\xf2\x7d\xf6\x94\xbe\x09\x38\x99\xb2\xab\xbb\xc6\xf6\x76\x7e\x48\xa0\x76\x73\x25\xd9\xc5\x5c\x55\x4b\x71\xe7\xdc\x3a\xdd\x5d\x40\x19\x6f\x62\x1a\x02\xd6\x6e\xd4\x6e\x04\x7d\x23\x54\x70\x90\x38\x6b\x35\x10\xc4\x4b\xd6\x0b\x97\xc4\x4b\x56\x7d\x4b\xca\x36\x6c\xd6\x1a\xa9\xcd\x41\x99\x42\xbf\xdb\x96\x30\xf6\x96\x26\xcb\x44\xe9\x90\x02\xda\x58\x1e\xd7\xc8\xe8\xfd\xba\xce\x90\x1a\x86\xfd\x92\xac\x34\x0f\x45\xf5\xa9\x5e\xd5\xf2\x7b\xdf\x31\x30\x62\x58\xe8\x5b\xb0\xb0\xb6\x00\x36\x11\x10\xca\xbe\x27\x99\xa0\xd7\xb6\x6a\x7c\x4e\xec\x44\xb6\xc9\x21\x10\x9b\xce\x9a\x0c\xd7\x36\xa4\x3c\x59\xaf\x2b\x65\xf3\xda\xeb\x69\x50\x21\x1b\x2a\xc4\xda\x7c\xb7\xc5\x85\x45\xd7\x68\xb5\xcf\xd9\x85\x9d\xbd\xdb\x28\x63\x2f\xf3\x4c\x11\x19\x7c\x2b\xae\xf4\x71\xfe\xa3\xe3\x85\x8e\xbd\x81\xa9\x03\x9d\x24\x5a\x99\x36\xda\x94\x9b\xb3\x2d\x36\xd5\x43\x5d\x45\x51\xf6\x13\xeb\xdd\x17\x68\x76\x75\x12\xa4\xe9\xa7\xe7\x93\xbd\x6a\xa2\x0a\x9f\xd9\x1f\x36\x9b\xdb\x08\x9a\xd0\x90\x5d\x52\x51\xb4\x0b\x33\xff\x94\x93\x52\xe4\x11\x73\x95\x83\x45\x07\xd4\xa8\x36\x31\x0c\x9d\x91\x30\xf9\x1d\x69\xa1\x0c\xcb\x51\xae\x92\xe3\xf0\x91\x53\x35\x56\x7d\x0b\xce\xe3\x3c\x97\xec\x9d\x69\xf0\x07\x1b\x7e\xa0\x28\x43\xfc\x09\x66\x5d\xef\xc8\xe2\x85\x6b\x84\x05\xcb\x5e\x17\x91\xf0\x16\xe3\xce\x85\x62\x39\xe3\x0e\x55\x14\x88\x12\x5e\x3d\x0d\x4a\x36\x70\xb2\xbc\x12\xcf\xd7\xc6\xca\xf5\x80\xf5\xd8\xf3\x38\x13\xc3\x3b\xe8\xa4\x92\x17\xf0\xb2\x3f\x53\xf5\x67\xaa\x40\xdb\x1a\xc0\x5f\xc1\x8f\x71\x9d\xa7\x7f\xc5\x7e\x66\x2e\x24\x38\x57\x6f\x14\x42\x9a\x16\x70\x85\x1a\xac\xf0\xe3\x94\x43\x0b\x5d\x25\xb3\x47\x1c\x98\xd7\x10\x32\x8e\x60\x42\x28\x4b\xec\x1f\xae\x73\x28\xa7\xde\xd9\x7b\x92\x5d\x1e\xf5\xd1\xf9\x43\x6f\xb6\x44\x69\xe4\x21\x42\xa8\x20\x41\xcb\xb1\xe0\x64\x7c\x3a\x7f\xe0\x12\xc6\xe0\xdc\x4f\xed\xb8\x8f\x83\x05\xe4\xb3\xcf\xfd\x29\x27\x8d\xa8\xc7\x3e\xac\x63\x06\x8c\xff\x01\x8c\x22\xdb\x2e\x5e\xcf\x5c\xce\x20\xd4\x0e\x46\xed\x51\x58\xdb\x3b\xe4\xa9\x2f\x58\xac\x89\xb0\x88\xe1\x1b\x5d\x4c\xf4\xa3\xe3\x73\x07\x66\x5f\xd7\x09\x79\xdb\xa7\x99\xa8\x8d\xec\x6e\xea\x77\xd9\xd4\x47\xf9\x75\x48\xbf\x5a\xdf\x1e\x1b\xaf\xc4\xa2\x97\x90\x2e\x95\xcb\x3d\x21\x3b\x58\x3e\x38\x8d\x8d\xcd\x2d\x12\x57\xeb\xa1\x8a\xa9\xf6\x19\x58\xf2\xe7\xcd\x38\x6b\x57\xea\xe7\xf2\x94\xf6\xdc\xf8\xd3\xaa\x01\x8f\xf7\xa5\x42\x20\x4b\xc0\x0c\x48\xe9\xd7\xe2\xdf\xb4\x8a\x1e\x90\x8f\x6b\xa2\x8e\xa6\xbe\xf5\x7c\x54\xcf\x43\xe4\x71\x5d\xfd\x7d\x0c\x10\xd8\xf3\x4f\xa0\x10\xdb\xf2\x38\xdb\x54\xf7\x23\xea\x3e\xa7\x45\x7a\xbd\x89\xf9\xc5\xd0\x19\xee\xc3\x1f\xf3\xdf\xcc\x90\x25\xc4\x06\xa0\x22\xa8\x4a\x2c\x18\x4b\x4a\xf6\xf3\x79\x55\x72\xd3\x8f\x39\xd9\x99\x88\x49\x06\x87\x8b\x8a\x0d\x0a\x6f\xa3\x48\x9a\x19\xf6\x8a\x2e\x70\x4a\x61\x42\x9a\x4e\x4e\x67\x85\x0d\xa7\x75\xa6\x88\x5e\x57\x5c\x88\x50\x84\xc0\x25\x12\xf8\x7d\x53\xbf\x81\x68\xc6\x22\xe0\x77\x03\xaa\x99\x14\x56\x04\x44\x65\x2d\x30\x49\x0a\x0f\x3f\x28\x63\xce\xe3\xcf\x22\xb8\xc2\x17\x5a\x39\xb6\x9b\xd7\x35\xfe\x18\x16\x35\x2b\xf7\x02\xb3\x1f\x33\xee\x79\x94\x4e\xde\xa0\x7f\x7e\xd6\x33\xc9\xcd\xa8\x4d\x51\x83\xdf\x6a\x13\xef\x2d\x98\x18\xde\xfe\x48\x77\x15\xee\xcd\x06\x64\x23\x9b\xd4\xbc\x63\xaa\x4c\xca\xe5\x03\xf9\x7b\xb2\xe5\xa1\x2f\x98\xce\x17\x8f\x32\x0e\xf2\xbe\xde\xd0\x97\x18\x8e\x10\x70\x0b\xf6\x80\xaf\x6a\x62\x65\xb3\x53\x63\x4d\x49\xfb\x83\x27\x78\xa7\x27\x5c\x46\xc6\x82\xed\xab\xb0\x9b\xb5\x61\x63\x15\x5b\x7b\xaf\x50\xaf\x74\x12\x20\x46\x3f\x6a\x11\x68\x1b\xa0\x6a\xbe\x11\xcd\xe7\x16\xe6\x6a\xde\x5f\x86\xd5\xcd\x75\xf4\x56\x8a\xbb\xc5\xaa\x10\xde\x94\x49\x49\x1d\x88\xf9\xa6\x32\x42\x44\x2a\xc6\xf0\xbe\x6e\xd2\xe4\x8c\x16\xca\xdb\x9f\x94\xa0\x9b\xbd\xb2\x63\xe1\x91\x5c\xfc\xdc\x54\x59\x60\xbc\x0b\xa4\x5b\xfa\x30\x56\x2a\x36\x42\xf9\xaa\x34\x0d\x15\x14\x49\xa3\xee\xde\x7a\x22\x64\x70\x93\x10\xa9\x33\x9f\xbe\xd3\x9e\x13\xb8\x1b\xfe\x0f\xd5\xfe\x13\x5c\xcb\x03\xc5\x83\x8f\xc5\xd5\xd4\xd9\xf2\x19\x2d\x33\x59\x37\x9c\xea\xbc\x5f\x56\xca\xa5\xe5\xa7\xde\x90\xa2\xbf\x33\x79\xfa\xa8\xa2\x0c\x54\x8d\x45\xe5\x97\xc3\xa8\x5c\xcd\xba\x19\x6a\x76\x06\x5f\x4c\x1d\x3d\xcc\x6b\xb6\x85\xff\xf8\x8c\xd5\xdf\x90\xe3\x2a\x02\x73\x5a\xf7\xdb\xca\x2e\x35\x23\xdf\xf3\xf6\xc2\xe9\x88\x12\x12\x65\xd3\x69\x0e\xbf\x96\xac\x37\x73\xe4\x91\x37\x15\xa2\xb7\xd0\x08\x24\xff\xa1\xdf\x62\x11\xf9\xb2\x53\x0f\xdf\xf2\x80\xbf\x9e\x19\xdf\xde\xd3\x17\xa6\x17\x8a\xf2\x70\xcc\xd2\xd0\x43\x6b\x62\x80\x59\x60\x96\x0b\x80\x86\xfd\xcc\xb7\xf8\x09\xc5\x8a\x7f\xee\xf2\x7d\x22\x58\xf7\x79\x92\xbf\x77\x1e\x6c\xdd\x4f\xa9\x35\x4d\xa8\x34\x18\xb2\xc8\x5d\xe4\xa7\x5f\x35\x2e\x8b\x17\x87\x0b\xdd\x46\xe5\xa4\x57\x5f\xa3\x8f\xe1\x5d\x2e\xfc\x7a\xe5\xd0\x6b\x69\xc2\x4b\xc8\xf3\x69\xc1\xc4\xc9\x41\x20\x8d\x32\xf0\xa9\x9a\x6c\x71\x71\xb4\x7a\x85\x67\x74\x97\x52\xea\x3d\xef\x46\xc8\x87\xa0\xfb\xd9\xca\xce\xc7\x7e\x73\xb1\xe4\x87\x9c\x67\xc0\x54\xb1\xde\xf1\xa0\x33\x48\x88\xa3\x46\x18\x81\xa4\xc5\xba\x2b\xf0\xc6\x04\x45\xa9\xaf\xb0\xfa\x25\xbe\x7d\x6f\x1b\xae\xd4\xd7\x08\x90\x2f\xe6\x94\xad\x49\xa3\xee\xbf\x6d\x8a\x24\x74\x40\x1f\x55\x7b\xe1\xb5\x84\xf7\x40\x36\x29\x16\x02\xb3\xd9\x5c\x58\x9c\xd8\x44\x0b\xde\x8e\xc7\x97\xb7\xe4\xae\xb4\x31\x05\x08\xd3\xe3\xa6\xc6\x74\xc9\x7f\x9e\x08\x77\xde\xa6\x97\x3a\x85\x3f\x50\xee\xc0\x0e\xd2\xe9\x09\x00\xd6\x9f\x39\xbc\x2c\x61\x6b\xf4\xf7\x6e\x03\xb4\x3d\x8e\x4a\x14\xc7\x57\xd9\x36\x73\xae\xe3\xe5\xef\x3f\x05\x84\xbc\xea\xf4\x6e\x86\xf5\x7c\x7a\x7e\xc3\xb3\x0f\x5c\x94\xc7\xf2\x31\x43\x3c\x61\x2a\xee\x38\xd7\xad\xed\x2e\xad\x3a\x5a\x85\xf5\x3b\x22\xd8\xfd\x2c\xb6\x1a\x2a\xc0\xa4\xbe\x5b\x7f\x33\x9e\x88\xdf\x53\xea\xe0\x5c\xe8\x1f\xa6\x66\x83\xf2\x5a\x78\x46\x4f\x5a\x94\x34\xdc\xce\xae\xef\x38\xfa\xb7\x0e\x48\xbd\xfe\x28\x75\xf4\x89\xd2\xe4\x72\xf3\xb7\xf7\x3b\xa8\xbb\x04\x36\x7d\x9d\x9c\xa4\x48\xd5\xf5\x82\xe9\x5c\xfd\x52\xd7\x3f\x49\x67\x20\x95\x03\xaa\x48\xef\x60\xdd\xcd\x5a\x5f\xf8\xf8\x88\xd7\x9d\x46\xe4\xc7\x37\x4c\x32\x52\xe5\x9c\x37\x37\xc7\x10\x2a\x37\x11\x2e\x8e\x0c\xc0\x28\xcd\x29\x35\x5c\x99\xc0\x76\x84\xa2\x8c\x88\xb1\x31\x25\xbb\x77\x63\x84\xe5\x9f\x7d\x1e\x6e\x1b\x15\x09\xc7\x83\xa3\x96\x38\x00\x51\x1c\xdf\x9e\xcf\xec\x93\x66\xf7\xc4\x11\x4a\xe7\xb3\xcc\x79\x48\xbb\xfb\x41\xa1\x3f\xbd\x46\x42\x72\xb0\xfc\x0d\x27\x3c\xd3\x68\xa2\x80\xf9\x4f\xa0\x51\x31\x39\x63\x6b\x47\xd2\xa8\xb0\x17\xa8\x2a\x30\x44\x81\x51\xf8\xfc\xb5\xa6\x45\x4d\xd0\x76\xcf\x7b\x5c\xea\x63\x1f\xe0\x37\xad\x26\x16\x5b\x55\xd8\xfe\x63\x4a\xab\x84\x2a\x13\x26\x2e\x88\x23\x0f\x13\xca\xa7\xff\x01\xb5\xc2\xfb\xe1\xd7\x17\xb3\xf2\xf8\xac\xa7\x41\x8f\x44\x78\xd3\x0d\x90\x4e\x6b\x09\x5d\xcd\x14\x9b\x76\x1b\x8a\xab\xb7\xc6\xb6\x1f\x72\xc3\xb3\x92\x26\x61\x42\x85\x4c\x7b\x2e\xc0\x39\x1d\x1b\xf6\xb9\xf9\xf3\xab\x91\x14\xee\x98\x10\x67\x91\x8e\x66\xa2\xcc\xcf\x9e\x08\x6f\x9f\x21\xae\xa0\x5f\xfd\x16\x09\xeb\x54\xd4\x7a\xfa\x52\x3c\x9e\x18\x57\x6a\x01\xac\x25\xdc\xf7\x66\x30\x63\x91\xb2\x24\xf8\x43\xce\xd8\xc1\x70\x97\xbf\x90\x2c\xed\xdb\x8a\x59\xe1\x41\x11\x3c\x8a\x29\x39\xed\x47\x29\xe2\xbd\xbe\x84\x0a\x51\xfe\x43\x1e\xc4\x8a\x6a\x89\x54\x71\xc2\x56\x4c\x54\x8d\x31\x2c\x8c\x88\x1b\xea\xbf\x41\xdc\x3f\x8f\x5e\x31\x68\x72\x28\x2c\xc0\x0d\x7c\xbc\x37\xb1\x6d\x5f\x87\xb4\x5d\x0d\xa4\x5c\x3a\x73\x0c\xa8\x08\xe8\x05\x22\x1c\x90\xaf\x1b\x98\x24\xd1\xe0\xd4\xa2\x17\x80\x6d\x2a\x39\x25\x9d\x9b\x6f\xc7\xf2\xf7\x5b\x76\x51\x1a\x9a\xb6\xce\x3d\xdf\x57\x32\x46\x6c\x94\x4f\x57\x9b\x1f\x95\x6e\xae\x04\xa6\x80\xa1\xec\xd4\x8f\xb5\xd9\x4f\x9d\x28\xf1\x91\xed\x13\x44\x1d\xec\xa3\x15\xb2\x3a\x2b\x18\x9b\xc6\x97\x95\xdf\x3f\x25\xae\x5a\xb4\x16\x04\x00\x50\xce\x68\xd8\x56\xef\xb0\x1a\x56\x39\x6e\xf9\x95\xe2\x44\x63\x25\xc4\x44\xcd\xe9\xad\xb5\xb3\x4d\x39\xa7\xef\x81\x6c\xdb\x34\x93\x7f\x4d\xfb\xd7\x11\x00\x11\x43\x82\x82\xc2\x01\x4c\xd3\x45\x85\x8f\xb6\x40\x86\xcd\x81\x5e\x57\xb7\x29\x46\xd2\xc8\x23\x89\xd4\x0d\x41\x62\x9f\xc1\xe6\x16\x54\x15\x75\x15\x5d\xc7\x05\x3b\x70\x74\x9f\x79\x96\x4b\x6e\x7f\x60\xf9\xcc\x8e\x55\x18\x64\xbb\x13\x6b\xaf\xf6\x82\x6f\x76\x20\x45\x7e\x53\xab\x37\x44\x7e\x1c\xec\x80\x99\x2e\x78\x27\x4d\x25\x34\xb0\xe6\x03\xf3\xf8\x7c\xb2\xdb\xbd\xdd\x65\x6c\x37\xc3\x38\x03\x47\x0f\xef\x96\xdf\x4b\xb2\x9e\x0e\xcc\xd4\x90\x5a\x25\x6b\xb3\xee\x35\xd4\xac\x19\xd9\x12\x11\x8e\x72\x24\xd1\x6d\x79\x65\xf6\x99\x91\xd2\x29\xa4\xd7\x50\x5f\x27\xda\x64\xfc\xf5\xdd\xff\x75\x64\x40\xc4\xfc\xa1\x30\x31\x81\xe2\x04\x29\x28\x24\xdb\x32\x9f\x28\x7e\x18\x31\x84\x86\x37\x59\x44\x90\x35\xb3\x17\x7e\x5d\x8e\xcd\x85\xe9\xea\xe5\x3f\xb7\x69\x0a\x01\x52\xee\x41\x11\x01\xce\x54\x53\xaa\x7e\x4b\xbd\x82\x5d\x21\x8b\x90\xf4\x63\x5e\x7d\xd9\xda\x49\x23\x2a\xf7\x4d\x6c\x29\x5d\x14\x64\xd0\x1b\x79\x49\x9f\x8b\x3b\x24\x54\xa1\xe4\xb1\x8a\xad\xf0\x59\x80\x99\xa3\x5b\x99\x88\xfe\x5c\x14\x63\x16\xf9\x01\x83\x5f\x53\x18\x15\x0b\x80\xf2\x8f\xe4\x70\x31\x3a\xe4\xb9\x29\xc0\x60\x04\x31\x69\x53\xdf\xe7\xf9\xb8\x26\x51\x71\x88\x0c\x51\x70\xbc\xc6\x20\x44\x74\x7e\xfe\xa4\xbf\xfe\x8f\x23\x06\x22\xe6\x8f\x89\x0d\x26\x15\xbc\xcd\xcb\x17\x17\x69\xf1\xc8\xf7\xe0\xc5\xbc\x5e\x33\xe0\xd8\xa6\x28\x18\xa5\xc2\x54\x11\x38\x5e\xd9\x56\xf4\xa3\x18\x9c\x83\x15\x43\xbd\x01\x71\x25\x95\x3c\x17\x9a\xf9\x61\x84\x31\x1a\x3a\xa4\x9a\xfb\xd2\xc5\xe8\xfc\x0f\x9c\xbb\x18\xfd\xd8\x6d\xf7\xc4\xbe\x20\x13\x8c\x4b\xe1\xa0\xdd\x2e\x5d\x90\xfb\xc1\xeb\x56\xab\x83\x92\xf3\x8e\x80\x6c\xd4\x18\xbb\x8d\x71\x1c\x7d\xdf\x53\x04\xe9\x94\x67\xe0\x6d\x6c\xed\xe2\x9f\x2f\x06\xc1\x63\xed\x3a\x8d\xa1\xc7\xaf\x59\x9e\x07\x3d\x83\x78\xa3\xa9\x29\xc9\xd0\xef\xbf\x3f\xbd\x11\x60\xdd\x58\xf8\x1b\x4f\xff\xeb\xf0\x82\x88\xb2\x91\x83\x4c\xfd\x16\xe6\xcd\xa1\xe5\xb0\x5a\x5a\xd9\x3b\x3a\xb4\x22\xf5\xf5\x16\x62\x9c\x7c\xcb\x2a\xf4\xc9\x4d\x1e\xbb\x2b\x61\xfa\x24\x2d\xfe\xc0\x3b\xf0\x6e\xbe\xaf\x56\x47\x60\x40\x4c\x36\x8e\x88\x49\x72\xab\x94\x50\x19\xcc\xb1\xfd\x4e\x25\x26\x55\xa5\x7d\x81\x39\x85\x84\xb9\x07\x40\xcf\xd2\x73\x62\xee\xa3\xf3\x2c\xdb\xcc\x2b\xbf\x08\x79\xf7\xff\xa8\x19\xb5\xb7\x95\xff\xbc\x89\xea\x3e\x9e\x13\x32\x29\x91\x5d\x00\xf6\xcc\x47\xe3\xe2\x06\x74\x14\x3b\xc2\x79\xbc\x96\xfc\xac\x02\xa5\x2f\xc3\x19\x11\xcf\xf1\xd2\x17\xda\xc6\xe8\xc0\x49\xe2\xbd\x37\xc8\x77\x8e\x43\x31\x60\xf5\x65\xb7\x2c\xe1\xf1\x31\xe7\x00\xa5\x81\xa9\x8f\x28\xb6\xf7\x6e\x5b\x99\x5b\x4e\xd3\xa4\x21\xc0\xf0\x3b\xb9\xd3\x65\x39\xcc\xff\xf1\x58\x16\x23\x47\x81\x06\xb3\x0a\x6e\x9e\xaf\x3d\xc7\x57\xe9\x67\x3e\x0f\x38\xf7\x5f\x90\xe3\x3a\xe8\x1b\xa0\xb7\x5c\x74\xf0\x05\x0a\xb6\x59\x0f\x26\x3d\xbc\x8c\x05\x5e\xe2\x6d\x74\xff\xc2\x00\xe7\xf6\x2c\xda\x54\x8f\xbb\xb1\xa2\xa6\x83\x0d\xdc\xa3\xa5\xa3\x8e\x78\x9e\xd4\x9f\xf3\xe1\x9a\x1b\xcf\x78\x60\x2b\x97\xb9\xf1\x13\x72\x8d\xd5\x8c\xfc\x95\x32\x5b\xb7\x7d\x86\xc7\x96\xb4\xda\x35\xcb\xaf\x71\xaa\xed\x52\x09\xcd\x83\x77\x0a\x0b\x48\x85\x7f\xaa\x5f\xf3\x90\xe3\x90\x59\x57\xb3\x4d\xbe\x67\x17\xbd\x43\x9a\xde\x8d\xe3\x1e\xc3\xfe\xe9\xcf\x9a\x36\xac\xb7\xdf\x14\x00\x6a\x35\xff\x46\x9e\xf1\xe2\xa2\xf2\x24\x09\x71\xda\x0e\x4e\xad\x67\xf8\xe0\x7c\x55\x19\x02\x67\xc4\xe7\x88\x62\xda\xf6\x6a\x43\x91\x15\x4c\xb2\x1d\x09\x5b\xf4\x1d\xb6\xd7\xda\x43\xb2\x2f\xb7\x9e\xfb\x18\x8b\x10\x52\x16\xef\xc9\x8c\x51\x4e\xbd\xbc\xfc\x81\x01\x5f\x73\xe3\xf6\x77\x3d\xfc\xeb\x74\x80\x88\xc1\x40\x75\x82\x2d\xad\xae\xd5\x1a\x8a\x78\x58\xc1\xe7\x63\xe3\xfd\xa5\x64\x6f\xcd\x87\x4b\x53\x74\xfb\x1b\x8c\x18\xd2\xf1\x56\xa3\xc7\xfb\x39\xf6\xc1\x1a\x9c\xd5\x8e\x23\x85\xee\xec\xd6\xb3\x44\x85\xc9\xcd\xb7\x2a\x76\xa7\x61\xf6\x9c\xe5\x44\x2f\x77\xf5\x6b\xf0\xce\x75\x19\x3f\xd6\x81\x4e\xda\xd8\xc7\x3a\xcf\x8f\xb3\xd1\x44\xa9\x57\x16\xe6\x2e\x1f\xd6\xe8\xd0\xc4\xdd\x15\x7c\x90\xc3\x50\x34\x9c\x6d\x11\xce\xbf\x23\x49\x03\x50\x9a\x02\x6c\xfb\x2b\x8b\x5c\xc7\x94\x61\x6d\x45\xf3\xb4\xcb\x97\xdc\x07\xb5\x86\x33\x9e\xc3\x0c\x13\x76\x42\xa5\xfc\xe2\x8a\xae\x97\x63\xb8\xff\x0d\x44\xca\xbc\x0b\x24\xde\xc2\x91\x7f\x48\xed\xeb\xc6\x1d\x31\xf1\xc0\x97\xfc\xe1\x4d\x59\xcd\x3a\x10\xba\x7a\xf3\xa8\x83\x92\x90\xf2\xff\xc2\x74\xbf\xe3\xff\xe8\xf2\x4a\x36\xac\x50\x1f\xbc\x3e\x46\x90\x21\xc8\xba\x3f\xf0\x08\x1a\x54\x69\x38\xa4\x73\xbd\xcd\x65\x77\xd5\x59\x3b\xd1\xc4\x99\x24\x7c\x72\x15\x48\xba\xb2\x1e\xa9\x96\xd4\x9b\x49\x62\x49\x52\xa9\x6e\xe0\xb4\x95\xed\x8e\x23\xd2\x11\x54\x6f\x44\xc3\x74\xd2\x8c\x16\x26\x00\x57\xe1\x13\x55\x64\xca\x7b\xd6\x2b\x87\xd2\xfd\x3d\x28\xf6\x0c\xa5\x98\x77\x9f\x3a\xa4\x10\x2d\xfd\xa3\xde\x33\x7f\x7b\x76\xb2\x73\x00\xd0\x9d\x54\x9c\x51\x94\x8a\xe5\x9f\x9b\x69\x3e\xd6\x92\xd7\x5e\x9d\x89\x70\xe2\x2d\x5e\x43\x2d\x37\xec\x7d\x0f\x31\xa7\x3e\x2e\x4e\x91\x01\x3c\x15\x52\xc7\x44\x35\x81\xda\x38\xf5\x19\xcf\x83\x45\x42\x58\xb8\x73\x3d\xbd\x6a\x6c\xca\x0b\x65\xd4\xb1\x94\x85\xd3\xb4\xd2\xc2\xec\xa7\x41\x29\x5e\xb1\xee\xb5\xe9\x7e\x93\xf3\x34\xe7\xc5\x33\xfa\x05\x87\x43\x2e\x3f\x4a\x09\xd7\x02\xf5\x96\x08\x99\xc3\x65\xab\xb1\xb3\xe0\x09\xf9\x3d\xd9\x1c\xbe\x32\x7b\xbf\xfa\x8b\xe3\x46\xe8\x83\x27\x2b\xdb\x8c\x6e\x3a\x99\xb2\x5d\xfa\x96\x3a\x4a\xda\x08\xe6\x11\x9d\x11\xf0\x78\x79\x2f\x82\xaa\x9d\x67\x7a\x5a\xad\xa6\xc6\x9b\x2c\x9f\xbb\xe2\xd2\x16\x23\xa6\xf2\x04\x46\xc6\xac\x4a\x5d\xd6\xf6\x76\xfa\x1a\x9f\x06\xb5\x59\xae\xda\xfe\x85\xba\x7e\x49\xf0\xc1\xaf\x99\xcc\x5e\x90\xef\x97\x0f\x4c\x0d\x6d\xb7\x0a\x7d\xd7\x86\x40\xd2\x89\xd6\x4f\xdd\x27\xe4\x68\xcf\xb3\x43\x16\x0a\xd8\x8a\xad\x29\x13\xa7\xe3\x5a\xb2\x00\xbc\xd9\xa5\xba\xd9\x16\xf6\x5d\x74\x96\x5f\x48\x1f\x51\x7e\x84\x01\xab\x2b\xfb\xa3\x8a\xff\x54\xb9\x57\xcc\x37\x38\x87\x1a\x21\x76\xda\x2d\x53\x89\xb9\x1f\xc6\x24\xaa\x5e\x58\xeb\xbf\x0b\xfc\x72\xf1\x01\xae\x99\xe6\xe7\xeb\x89\x36\x32\x26\xa3\xe1\xa2\xaf\x8b\xc7\xec\x66\xeb\xa2\x08\xf6\xd3\x35\xcc\xb6\xe9\x02\xdf\xac\xbb\x6e\x06\xeb\xf3\x01\x83\xe2\x60\x72\x42\x22\x30\xdb\x94\x20\x01\xe7\x7d\xd0\xbe\x1b\x50\x66\x69\xae\xdf\xcc\xd0\x38\x67\x74\x3a\xf3\x17\x56\x38\x17\xd2\x9f\x06\x15\xf6\x95\x55\x15\x3d\xf1\x91\x9a\x2b\xcb\x37\xd4\x64\x4c\xe8\x6c\xe7\x65\xb8\xe9\x59\x1a\xa8\x83\xef\xb4\x43\xb9\x9c\xcf\x03\x69\xb2\x2d\xff\xc4\x62\x3e\x86\x30\x3b\xc3\x5d\xf7\x2b\xf0\x99\xf6\x8b\x7d\xdb\xdc\x40\xe9\x64\x22\xdd\x6d\xc3\x22\xb7\x4f\x1a\xec\x01\xae\xa5\x7d\x6d\x05\xda\x20\x07\xf7\x2f\x67\x64\xad\x06\x7e\x8c\xb9\xae\x12\x0a\x9b\x31\x54\x24\xa0\xf3\x7f\x95\x7f\x2d\xc8\x1f\xc6\x4f\xff\x84\x4c\x6d\x4f\x2c\x1e\xac\x64\x0d\xa3\x5c\xca\x5c\x72\x7d\x20\x69\x80\xe9\xb4\xa6\x8b\x13\xa1\x1d\xde\x8d\xc8\x75\x12\x70\xc4\x07\x15\x6c\xde\xf2\xa3\x8a\xe3\xac\xc4\x49\xc8\xf3\xfa\x96\xb1\x1d\x85\x38\xe3\xdd\x99\xe4\xa7\xbf\x49\x64\xf0\xc8\x09\x63\xfb\x26\x76\x21\x0f\x98\x8f\x9d\x50\x47\x85\x46\xc7\xc6\x63\x4e\x44\xda\xec\x05\xef\x5a\x59\x1a\x39\xb2\xd1\x9b\x9b\x4b\x77\x4d\xc6\xcc\x9d\x34\xdc\x03\x48\x67\xbe\x8c\x1b\x24\x5f\xd2\x68\xb4\x61\x2c\x54\xae\x23\x9d\x47\x88\x71\xcf\x64\x36\xf0\x92\xcd\x14\xd7\x98\xb6\xc5\x0a\x99\xa3\x8c\x06\xcc\xf7\x51\x14\x25\x2b\x5d\xcc\x0a\xd5\x6c\x32\x1c\x3f\xe7\x3b\xd6\x72\xef\x2a\x79\x57\x1e\xf0\x52\x1a\x4a\xac\x0b\x3a\x13\x06\x87\xf2\x69\xd0\x80\xc4\x47\xe5\xfe\xde\x62\x54\xac\xfd\x17\x6e\x11\xdc\xce\xc2\x73\xcd\x9d\x0f\x2a\x97\x39\xd6\x14\xbb\x4c\xe7\x99\x56\xa5\xc3\xc0\x3c\x79\x4f\x2f\x34\xbc\x4b\x69\x76\x6b\xac\xba\x6b\x08\xd1\xbe\x55\x1d\x4f\xc8\x1a\x3f\x79\x10\x6a\x12\x12\x44\xf5\xa4\xd6\x02\x73\xbb\x7e\x02\xec\xed\x93\xb2\x99\xef\xa2\x6f\x72\x23\x3e\xc2\x50\x10\x7f\x28\x74\xd1\x7c\xaf\xb3\x0a\xe1\xce\x75\x78\xe9\xd4\x79\x8d\x0a\xba\xc9\x72\x07\xce\x44\x65\x6b\xf5\x0b\x45\x8c\x7d\x67\x1d\x51\x0a\xd5\x91\x69\xd9\x2f\x52\x63\x3d\x92\xb3\x7f\x2f\xe2\xea\x0f\x8b\xa8\x01\x39\x2a\x95\x8f\x6f\x19\x75\x92\xeb\xa7\x57\xcc\xb4\x5c\xde\x0c\xc3\xde\x4c\x29\xc0\x98\x8e\xf0\x6c\x54\x3f\x4c\x1e\x8b\x85\xe3\x02\x29\xb2\x93\x18\x3f\x2c\x83\x8f\xde\xcc\xc3\xae\x81\xe5\xbc\xbd\xd2\xa4\xf9\x2c\xf9\xc6\x12\x6c\x2d\x81\x2b\x45\xc1\x50\xdc\x49\x5d\x0e\xc0\x97\xd2\xe2\x97\xa4\x99\x17\x36\xc3\x5e\x58\xd8\xda\xbe\x1b\x94\xb1\x6b\xb6\xac\x64\xff\x38\x3c\xb9\x21\xba\xe8\x69\x33\xed\x92\x0e\x48\x39\x74\x45\x16\x85\x43\x37\xe1\xdd\x35\xc0\xad\xd7\x3e\x34\x93\xe7\x71\x91\x37\xda\x32\x61\xd7\x86\x31\x64\x2f\x38\x35\x2f\x5e\x56\x3d\x21\x7f\xa4\x67\x64\x0c\x99\x72\xf8\x5e\x8e\xd0\x9c\x47\x38\xe0\x3a\xd4\xb9\x7e\xb3\x99\x77\xb4\x7f\xf1\xb9\x92\x22\x7f\xf8\x9a\x7e\x1a\x34\x9f\x4d\xe2\x2b\xcd\xcd\xb9\xbe\x80\x3d\x07\xa2\x3f\xdc\x72\xc3\xe9\x34\x0d\xe7\x69\x90\x64\x86\x75\x66\xef\x70\xa6\x14\x39\x47\xce\xd3\x47\x55\x0a\xdf\x39\x3d\x78\x79\x1d\xb1\x67\x49\xcb\x29\x60\x24\x57\x72\x6b\xf2\xe9\x00\x43\xac\xdf\x2e\x7a\x37\xcd\x29\xd9\x8c\xe0\x1e\x30\x8a\x0f\x6b\xe7\x5e\x5b\xeb\x0e\x81\x45\x6d\x14\xda\x25\x6b\x14\xe1\xcb\x2d\xf5\xfb\x70\xca\xf6\x78\x36\x16\xe8\x68\x8e\x90\x9c\xfc\xa7\x57\x85\xf8\x6f\xad\xe5\xf6\x3d\xe2\x26\xd5\xfa\xbc\x7f\x07\xa7\xac\xc3\x28\xec\x6c\x4a\x57\x14\x2e\xbd\x12\x23\xa8\xfe\x36\x56\x40\xf4\x09\x79\x11\x96\xf4\xeb\x67\xf0\xfd\x95\xc9\x35\x42\x7f\x3d\x1b\x61\x4d\xe1\x8e\x04\x99\xce\x8d\x51\x78\x05\xcc\x8f\x77\x2d\xc1\xce\x30\xa0\x51\xdb\x7b\xd6\x3f\xbc\x75\x2c\xdd\xae\x82\x36\xff\xbc\x8b\x72\x6c\x95\x51\xfa\xde\x62\xa2\xe6\x4c\xb5\x20\xca\x77\xd7\xaf\x86\x74\xf2\xf4\xa6\xec\x75\xf3\x21\x15\x18\x38\x3f\x75\xf5\xe8\xd0\x7e\xf1\xa9\xe6\x21\x8a\xa7\x7f\x1a\x79\x10\xb3\x33\x0a\xbb\xb5\x2b\x88\xa4\x4b\x04\xba\x26\x25\x0d\x3d\x73\x19\xcb\xea\x66\xe5\x72\x20\x6a\x65\x2f\x6d\xde\xfc\x16\xb4\xb5\x13\x36\x3d\x0f\x63\x19\x45\xf4\x20\xa4\x03\x98\x8e\x1e\xc9\x72\x5e\x73\x1a\xe3\x4b\xc4\x9a\x98\x76\xf1\x99\xbd\xa2\xd1\x6c\xca\xf2\x58\xbd\x2f\x94\x16\xa5\xa2\xdf\x36\x30\x1b\x22\x01\x26\xaa\x4d\xa2\xf7\x34\xdd\x68\x10\xfd\x00\xd6\x43\x5e\xe2\xc7\x03\x5b\xdb\x29\x6b\xdd\xf1\xb6\xaf\x2e\x7c\x77\x51\xf4\x12\x99\x38\xe9\x00\x54\xb9\xdc\x76\x66\xb4\x1e\x2b\x3d\x62\x49\x00\xa9\xed\xa2\xdd\x9a\xa9\xd7\x67\xe9\x0a\x9d\x6e\x48\x49\x59\x63\xc7\x2e\x69\x88\x0a\xb4\x3f\xdf\x70\xe5\xac\x45\x68\x3d\xef\x4c\x00\xad\x17\x9a\x5e\xd4\x62\x3b\xb6\xb0\xde\x10\xb1\x13\x86\xa3\x28\xbe\xcb\x66\x47\xcf\x11\x28\x33\x52\x27\x10\xda\x97\x4b\xff\x93\x2f\xc0\x88\xbf\x8c\x14\x64\x37\xf4\x43\x8a\x27\x1d\x35\x43\xa0\x85\xb5\xb9\x9e\x3c\x2c\x65\xe8\xc9\xaa\x6c\xa6\x20\xc3\x79\x6e\x74\xe4\xbe\x9d\xd6\xc9\xdf\xb8\x7f\x48\xdc\x83\x7e\x47\xa8\x5b\x76\x44\x4b\xc3\x24\x20\x9b\xc7\xb7\x7f\x05\x68\xc6\xec\xb9\x69\x3c\xf7\x95\x7c\xe1\x2d\xa2\x61\xbc\x0b\x17\xf3\x5b\x16\x0d\x5e\x4d\xd4\x71\x08\xd5\x14\x15\xdd\x0d\xd8\x1a\x27\x02\x13\xc5\x84\x8b\x7f\x67\x9f\x01\x8e\xdc\xce\xe5\xf2\x39\x9c\x3e\x37\x59\x07\xf6\x6c\x91\xe9\x2a\x86\xb7\x0c\x21\x42\xa2\x82\x77\xb5\x25\x70\x9e\x48\xad\xe2\x38\xf1\xb1\x4e\xbc\x5e\xd1\x52\xab\xec\x91\x4e\xde\x75\xd5\x1f\xbe\x85\xe6\x59\x34\x0e\x4f\x31\xca\xeb\xa3\x04\x28\xfe\x6e\x44\x77\x62\x88\xf9\xde\xc4\x90\x16\x8f\xb5\x90\x38\xeb\x71\xd9\x1a\x63\x4d\x18\xbf\xfc\x78\x8f\xf6\xed\x4b\xf4\x9e\x92\xfd\x12\xb0\xf7\xa5\x91\xd3\x0a\x9b\x22\x60\x70\x95\xfe\x34\xec\x1d\xfe\x6d\xa9\x31\x16\x27\x82\xe4\x48\xf9\x82\xef\x9d\xb3\xa1\x38\x6f\x9e\x30\xd0\x87\x9d\xb3\xa5\x60\x8f\x2d\x96\x2c\xc6\x87\xf0\x10\x20\x9e\x59\x8a\xe0\x28\xc0\x3a\xc6\x4b\xab\x46\x37\xdc\x8a\xf4\x21\x25\x3f\xc7\x1c\xb0\x49\x44\x93\xe1\xa2\xec\x2a\xca\x80\x60\x58\x65\x2c\x0a\x87\xb9\x34\x6e\x54\xcf\xf0\xe3\x96\x55\x53\x68\xb2\x22\x5a\x35\x44\x09\x50\x9c\x11\xcd\x32\x4a\x3e\xb8\x7d\x2d\x24\x4c\xbb\xc5\xf6\xc3\xa0\x6e\x8c\xe7\xdb\xe3\x18\x46\xf2\x9c\x63\x42\x81\xbc\xf8\x0c\x1e\x16\xe6\x13\x32\xd2\x44\x60\x19\x56\xf5\xb1\xa0\x90\xb7\x2a\x60\x15\xce\xea\x21\x79\xcc\x62\xad\xbc\xc7\xe5\x11\x22\x81\x09\x6f\x68\x7a\x27\x06\x3c\x9e\x3e\xbf\xd3\x33\x47\xf7\x44\xac\xef\x3a\x10\xaf\x7f\x47\xf2\xbe\x24\xc0\x74\xc9\x8e\x2b\x66\x3a\x00\x99\x85\x4e\x57\x7d\x03\x38\x79\x12\x8e\x10\xc4\x84\x03\x34\xbf\xd8\x39\xc2\xc0\xfc\x34\xcf\x8b\xd8\x5b\xe3\xbd\xb1\x16\xfd\x8c\xf8\x0d\xfe\xf8\x0d\xda\x3e\xdb\xf5\x13\x72\x7c\x46\x81\x78\x17\x59\x44\xc9\x64\x55\x4f\x05\x56\x30\x4f\x8e\x54\xf5\x17\x8c\x5b\xe6\xc2\x89\xe0\xf4\xef\xd1\x0a\x9f\xa2\x2d\xe0\xf1\x18\x0b\xb6\x35\xd9\xd1\xc5\x7e\xb5\x3f\xa3\x3e\x9f\xec\x79\xf3\x26\x45\x6a\x24\x74\x12\x8e\xbf\x7a\x49\x82\xd4\x67\x0b\x37\x0b\xd4\xa4\x58\xc9\xca\x32\x33\xee\xc5\xff\xe6\x3c\x98\xa3\x82\xd3\x44\x65\x38\xcc\x34\x31\xef\x71\x22\x1e\xb1\xdd\xe2\x29\x2d\xa4\x17\xc9\x7d\x42\x3a\xcd\x2f\x19\xb2\x99\xb7\xbe\xc4\xff\x44\x4e\xd2\x18\x9f\x30\xcd\x27\x69\xbc\xa1\xa1\x9a\x81\x87\x2c\x58\xa2\x63\xa9\xd6\x04\x4a\x45\x7e\xc4\x50\x67\x6e\x5d\x50\x3a\x4e\x44\x35\x9d\x4c\x76\xa9\x18\x82\x23\x9e\x73\x78\x11\xe0\xfe\x73\xcd\x53\x67\xf0\x4d\xc2\xae\x25\xb8\x4a\x20\xcb\x49\x50\xe4\x68\x9e\xb6\x48\xda\x67\xc7\x86\x03\xb0\xd9\xb2\xea\x5e\xec\x6a\x83\xe6\xc1\x8d\x98\x95\xfd\x5d\xb6\xe4\xd6\x7f\x45\xfa\xff\xe1\x1c\x42\xc4\x20\x48\x30\x60\x33\x55\x03\x82\x22\xda\x2c\x2c\xa3\x78\xe1\x57\x55\x3f\xd6\xab\x0a\x59\x4b\x5a\xe3\xb3\xa4\x39\x84\x46\xed\x83\x47\x2c\x2f\xcd\x2e\x50\x6f\x5d\x2c\x3b\x68\x6e\x38\x15\x96\x8a\x7b\x69\x4e\xd0\xfc\x08\x3b\x5f\xd8\xb8\xf6\x0d\x57\x86\x0f\x9f\x63\xa3\x40\xa6\x44\x01\x11\x78\x1f\x4d\x74\xe2\xf8\xa2\xd1\x4f\x6d\xa9\x67\x35\xd5\x32\x32\x23\x32\x1f\xb9\x6f\x5d\xa2\x7c\xdc\x70\x71\xfa\xb1\x97\xec\x67\x80\x31\x37\x00\x0d\xa7\x84\xd2\xe2\xf9\x25\x84\xb2\x71\x2d\x9a\x18\x58\xf3\x45\x95\xa3\xcb\x3e\x23\x3a\x01\x7d\x2d\x3e\xc3\x9c\x68\x4a\x30\x1b\xbc\x24\xc0\x6e\x41\x5b\x31\x4f\xbc\x7f\x59\x53\xbe\x8c\xb9\x24\x73\x73\xc5\xd8\xf5\x19\x77\xb8\x90\x8d\x48\xb5\x63\xe0\x2d\xf4\x1c\x63\xe4\xe5\x2c\xf4\xff\xf1\x9c\x14\x25\x17\x86\x02\x8a\x7e\x45\xd7\xb5\x45\xd4\x91\xd8\x44\x59\x7b\xc2\x11\x86\x1b\x2c\x4a\x31\x68\x7d\x1c\x91\xc9\xe2\x45\xb5\x7e\x14\x94\xa0\x14\xf9\x8f\x00\xcb\x10\x5d\x78\xe6\xf4\xa3\xef\xc2\x1f\x75\xac\xee\x5f\x59\xde\x2f\x84\xf6\xb7\x6c\xdf\xa0\x6e\x9b\x4f\xc5\xa4\xbc\xca\x1c\x39\xf4\x3f\x7a\x9a\x09\x87\x07\xeb\x36\xb1\x9a\xf6\x13\x39\xc9\xb3\x28\x82\x45\xf1\x71\x55\x9d\x97\x2c\x13\x47\x69\xea\x5f\x60\x85\xf1\xbd\xdb\xff\xa3\x3a\x85\x62\xc8\x69\x12\xe6\x2e\x6a\xfb\xbd\x8b\x04\x9c\xb8\xae\x25\xca\x32\xbb\x6a\x6d\xf8\xf7\x68\xd3\x6f\xcb\x42\x9e\xda\x10\x38\xd7\xcb\x60\xd8\xff\xdb\x09\x08\x11\x43\x8b\xc7\xf2\x07\x18\x70\xb2\x36\xb2\x7e\x88\xde\x37\x4c\xb2\x5d\x1b\x50\x95\xd7\x16\x9c\x1c\xf1\x76\x1b\x20\x31\xbd\x9f\x3a\x6c\x6f\x3b\xd7\xfd\x4c\x00\x46\xba\xc7\xe2\xbb\x2e\xb7\xb4\x85\x47\x15\xa5\xdd\xf4\xf7\xe2\xe3\xc1\xf3\x49\xe2\x6f\xd8\x56\xda\xb3\xd0\xfa\xda\x7c\x3a\x4f\xf6\xea\x01\x28\x82\xe7\xfa\x55\x8f\x87\x85\xaf\x9f\x9f\xe8\x77\x4a\xab\xda\xc3\x2c\x46\xce\x35\x43\x38\x8c\x0f\x10\x5c\x5b\xfc\x1b\x08\x0f\x48\x8d\xf1\x06\x2b\xac\xf4\x70\x2e\x5d\xce\x2f\x7a\xb4\x70\x05\xde\x7c\x92\xfe\xca\x01\xca\x55\xd1\x73\x10\x3a\x7b\xe2\x3a\xd0\x8c\x0e\xf4\x84\x18\x3e\xa7\x08\x4e\x94\x2d\x46\x35\x5d\xdd\xf3\xb9\x42\x9a\x18\xf6\x0c\x1e\xdd\x7f\x8f\xbc\x65\xd4\x1b\x92\xad\xef\x39\x9b\x05\x9b\x1b\x89\x91\xfc\x3f\x04\x56\x36\x6b\x8b\xc6\x4d\xfc\xa1\x4c\x43\x94\x8d\xab\x42\xc7\x2b\x9c\x68\x34\x69\xb3\x39\xea\x53\xf7\x6d\x25\x07\xbb\x6d\x0c\x21\x59\x6e\xbc\x8f\x6d\x9f\x57\xa6\xe0\x85\x7c\x56\x6b\xea\xef\x7c\x97\x76\xe8\x34\x54\x8f\xcf\x45\x0b\xdd\x04\x5b\x65\xc0\x5c\x0e\xca\x7b\x6f\x3f\x62\x7c\xa4\x16\x98\x9c\x31\x54\x17\xf1\x8d\x1e\xfe\x04\x53\x67\xf5\x81\x00\xff\x2c\x05\xff\xbd\xfa\xeb\xa6\xbf\x59\x8c\x7f\x9d\xd9\x10\x51\x4c\x4c\x51\x60\x91\xd1\x4b\x8e\xef\x51\xbe\x5f\xf2\xa5\xa3\xf9\x14\xce\xc5\xb9\x17\xbf\xe7\xeb\xe0\x59\x15\x72\x75\xf2\x96\xb4\x1a\x7f\x83\xd5\x15\xa4\xf1\xa2\x35\xf3\x1e\xed\x2a\x7e\x68\xb2\x43\xed\xb9\xb6\xd7\x23\xe0\xaf\xf7\xad\x0c\x4e\xfc\x22\x9d\xec\x96\xc0\xec\xf3\xad\x5e\x1f\x6c\x5e\x4d\x26\x98\xb8\xc4\x50\xeb\xbb\x69\xf0\xce\x11\x2b\x64\xaa\xee\xb9\x8a\x34\xf8\x32\x66\xf5\xb2\x70\xf7\xc0\x00\x0b\x01\x1a\x17\x3c\xbb\x61\x58\xb0\x4c\x0f\x7a\xc3\x1c\xf5\xa2\xe3\xf8\x9d\x2e\x74\xa8\x0c\x8b\xe4\x1b\xba\x6c\xe0\xc6\x9f\xd1\x0e\x33\xb8\xe9\xb7\xd0\x00\xd0\xd1\xae\x92\x30\x7e\x5a\x94\x93\xfc\xa3\xc3\x52\x39\x23\x56\x4a\xd9\xa3\x8f\x0e\x82\xfd\xae\x27\x76\x72\x81\x8f\x71\xd9\x4e\xea\x7f\xdb\x0b\xfe\x75\x70\x43\xc4\xe0\xa0\x20\x52\xc0\x57\xf0\xd6\xc9\x98\x0b\x8a\x82\xe2\x44\xd5\x57\x21\xbe\xca\x27\x6a\xf0\x2f\xe2\x11\xa2\x74\x61\x32\xeb\xb9\xd4\x69\x0c\x5b\x6b\x34\x00\xeb\x59\xd6\x63\x2d\x30\x4a\x43\x53\xe7\xb6\x34\x71\xa4\xa7\x7f\x0d\x0e\x8c\x9f\x6d\xa1\xd0\xd0\xbf\xc9\x0c\x99\xb5\x1e\x5e\x5e\x03\x9b\x99\x50\xe2\xf4\xb1\x43\x14\x79\x50\xdc\x66\x6c\xd9\x86\x3e\xcc\xaf\x78\x0c\x87\x16\x42\xed\xd1\xb8\xb1\xf5\x4e\x7a\x43\xb1\x1b\x81\x05\x0f\x99\xe5\xb8\xe9\xcf\x61\x5d\x0b\x1c\x45\x1c\xf4\x2c\x55\xef\x46\x46\xc6\x1c\xc9\x0d\xda\xa0\xaf\x8f\x8c\xb2\x1d\x3d\x5b\xaf\x40\x92\x6b\xf1\x23\x91\x51\x05\x49\x62\x7a\x4a\x67\xfe\xb5\x9b\xc5\x67\x73\x01\xaa\x1b\x95\x74\x7e\xd6\x81\xea\x5f\xeb\x56\xec\xe6\xeb\x86\xff\xb6\x17\xfc\x6b\x63\x86\x88\x08\xbd\x06\x72\x90\xac\x59\x86\x17\xba\x14\x1a\xf5\xe5\x28\xf2\x29\x14\xe7\x4d\xa7\x56\x01\xcf\xd1\x22\x76\xe9\xc5\xd4\x66\x55\x44\x2f\x16\xde\xab\x3c\x6d\x1f\x23\xeb\x68\x68\xb4\x32\xc5\xde\x77\x43\xdc\xec\xfa\x0d\x04\xe6\xe7\x2f\x2b\xb7\x64\x37\x94\xa3\x78\xad\xa0\x8b\xd5\x2d\x9b\x40\x2a\xb5\xc5\x12\xdd\xe6\x9f\xd2\x4e\x24\x95\xe6\xc5\x04\xbd\x43\x52\x98\xf8\x52\xac\x41\x2a\x7c\xe2\xa5\x19\xe2\xac\xf3\x39\xfc\xf6\x92\x60\xab\x6f\x6d\xe9\x91\x12\xbd\xe5\x1b\xb9\x16\x38\x36\x8e\xeb\x06\xeb\xbc\xb3\x80\xe7\x2f\x30\xf0\xb5\x92\xb6\xda\xd9\xfc\xf0\x4a\x43\x2f\xef\xfe\xa7\x08\x7f\xd1\x81\xba\x47\xfd\x76\xad\x53\xe0\x57\x86\x93\x23\x4f\x59\xb7\xb7\x45\x73\x06\x0a\xe4\x43\xb7\xd4\x33\xe3\x99\xed\x72\x1d\x58\x88\xd8\xe3\x63\xc7\x63\x2a\xd9\xd3\x69\x4a\xd8\xac\x06\x27\xf2\x75\x65\x5a\x59\xf5\xdb\x04\xcf\x9b\x0c\xee\x06\x36\x66\x7b\xcc\x70\x0b\x28\x15\x23\x7b\xd7\x66\x7c\x03\x20\xe4\x60\x3b\xa2\x6a\x5f\x1f\x4d\x68\xc2\xef\x51\x10\xff\xfd\x32\xb7\xff\x75\xf1\x63\xc4\x4a\xf3\xe5\x0b\xef\x5a\x31\x78\x7b\x86\x9a\x93\x27\xe4\x2e\xa5\xb9\x2f\xc6\x3d\x9b\x6d\x15\x16\x05\x5d\xb1\x9f\x8d\x5e\xf7\xdc\xfd\x2b\x98\xec\x3f\xb9\x92\x3d\x75\x39\xeb\x59\x16\x7f\xc0\x23\x32\x55\x97\xc7\x03\x81\xcc\x50\x8e\x2c\xa3\xaf\x9a\xd7\x7b\xc0\x5c\x11\xf7\x68\x12\x77\x01\x97\xa3\xb0\x5d\x98\x63\xb1\xf1\x01\xa0\x1f\x41\x27\xd5\xfa\xa6\x8b\x5e\xf0\x81\xb7\x53\xef\x79\x75\x67\x43\x6a\xa4\x52\x0e\xe4\x00\x35\x1e\xbd\x1b\xe3\x93\x63\xb9\x38\x2b\x40\x6f\xf8\x03\xd1\x11\xf7\xfe\x1d\x8c\xa9\xa8\x75\x2a\x1c\xde\xaf\x21\x07\xdd\xf8\xd6\xe4\x0c\xfa\xbd\x3e\x82\x8c\xf7\x89\x56\xc3\xe3\xef\xc0\xe7\x6f\x7a\xad\x57\x9b\x9f\x2c\xfc\xa0\x41\x69\x28\xb0\xb6\xed\x27\x61\x29\x6d\x19\x5c\xcf\x61\x3d\x88\x77\x25\x92\xa8\xef\xf2\x03\xbe\x14\xfa\x08\x92\xa9\x93\x23\xc1\x15\xbc\x7c\x9d\x9c\x80\xe9\x9c\xf6\xc2\x17\x72\x66\xc8\x26\x9a\x57\x75\x8f\xcd\x6a\x59\xd3\x30\x40\xea\xf2\xb1\x7a\xe2\x19\xfa\x35\x07\x07\xc1\xac\x06\x92\x74\xb3\x9e\xc2\x84\x6e\xc2\x0d\x95\x29\x1b\x96\xa9\xd9\x4b\xad\x14\xf2\x22\x20\x36\x2d\xb2\xa7\x2e\x38\x13\x96\xdc\x62\x38\x18\xf7\x28\x17\x8d\xaa\xc5\xd3\x9d\x8e\xe7\xd0\x1f\x51\xcc\xb1\xc2\x46\x35\x73\x3c\x7c\x04\xdc\x1e\xf8\x8a\x9c\x66\x0c\x33\x73\xb5\x19\xb1\xaf\xfd\xe1\xb4\x5e\x28\xe5\x3b\x59\x11\xf3\xce\xa4\x43\x90\xa4\xba\x34\x3d\x43\x54\x60\x50\xbf\x9c\x40\x11\x55\xa5\x8b\x04\x0b\xa1\x4d\xf5\x6f\x13\xdd\xc9\x62\xc1\xd1\x5e\xc2\xe7\x7e\x2f\xfe\x5c\x68\x51\xa1\x5f\x04\x20\x01\x77\xad\xb6\x24\xf5\xd7\x57\x11\x15\x8f\x57\x64\x48\x98\x2d\x38\xe1\x2c\xbd\x89\x39\x06\xfa\xaf\x09\x11\x8b\x8b\x70\xb3\x5e\xfd\x34\x05\x3f\xd4\xd8\x60\x57\x9c\xe4\x22\x7a\x6b\xaf\x02\x9c\xab\xb4\xfa\x00\x4a\x7d\xea\x8d\xef\xe4\xcb\x6c\x64\x34\x57\x6b\x1c\x7d\x67\x21\xab\xa7\xd9\xaa\x9d\x37\x8c\x25\x39\xe2\xc1\x40\xea\xaa\x79\x45\x5a\x9f\xc2\xac\xf6\x8b\x47\x4d\x7b\x40\x7e\x4d\x25\xdf\xcb\xcd\x24\xe0\x27\x04\x38\x97\x05\x37\xd0\xac\x72\xfd\xd0\x7d\x9b\xbb\x5b\x1e\x24\xdc\x4e\xf4\x99\x36\xa0\x20\xd2\xcc\x56\xfa\xe7\x9f\x24\x1b\xd6\xa1\xd4\x81\xa2\xe5\x02\x49\x4b\x78\xf1\x46\x9c\x42\xe8\xf6\xa2\x70\x82\x65\x5d\x0f\xfc\x95\x05\xd2\x6f\xd0\x0c\x0f\xcb\xae\x9f\xa0\x72\x13\x49\xcd\xfe\x83\xb1\xf3\x32\x53\x55\x16\x4a\x7a\x1e\xf6\xf3\x49\xd2\xc7\x91\xe9\xd3\xc6\x01\xc5\x41\xca\x3f\x72\x54\x94\x51\xfa\xa6\xa2\x29\x9d\x21\x00\xb4\x8c\xe7\x5d\xc4\x52\xcc\x68\xd3\x4c\x3c\xf4\xa1\xa9\xc6\xd4\x87\xb7\x3d\xc4\x1e\x95\x2b\x06\xe6\xcb\xfe\x66\x14\xef\x7b\xec\x1e\x01\x68\x55\x24\xaf\xce\x95\xf1\xda\xcd\x24\xce\x39\xec\xee\x72\xe3\x06\xdc\xa7\x5b\xfa\xbc\xe9\xbb\x77\xdf\x42\x51\xb9\xad\x67\x5f\xfb\x03\xd9\x7a\x3d\x27\x6f\x3e\x42\x6a\xbd\xfc\xe6\x9a\x29\x1b\x7a\x19\xf2\xb2\x8f\x74\xac\x08\x0c\x85\x45\xfe\x49\x8e\xc4\x30\xc4\xfc\xac\xc0\xaf\x5a\x4d\x1f\x40\xb3\x3e\xfe\x2b\xc4\x75\xfa\x51\xc3\x4d\xc4\x29\xad\x35\xca\xb0\x40\x64\x39\x77\x38\xf4\x65\x29\xbe\x52\x3f\x01\xa0\x1f\xd7\x4c\x3b\xbc\x67\x85\x80\x1c\xb5\x8d\x3a\xe4\xd2\xe2\x34\x5f\xf4\x3c\x78\x2b\x85\x88\x86\x8a\x6a\x8b\xcf\x9f\x52\x82\x9e\x11\x28\x1b\xfe\x36\xf1\x15\x4b\x6b\xbb\x2a\x0f\x9e\x2f\x76\x6a\x45\x0e\x46\xa8\x4d\xb2\xfa\x47\xdb\x0b\x54\x57\x38\x65\xe9\x78\x1b\x8d\xcb\x5c\x30\x89\xd4\xd9\xdc\xcd\xb8\x10\xb9\x4b\x89\x60\x26\xd9\x30\x70\x17\x44\x23\x94\xed\x7d\x9e\xd8\xb5\x45\xec\x56\xe0\xa1\xbe\xda\x1d\xf8\x34\x68\xf7\x1f\x29\x64\xa1\x2f\xab\x4c\x84\x85\x2b\xa9\xa7\xb8\xe5\x84\x1a\x53\x32\x27\x33\xa4\x0b\x05\x3f\x5c\x85\xfb\xbe\xac\xee\x02\x62\x53\xbf\x69\x7b\xdc\xf7\x0a\x2f\x0e\xdc\x98\xbd\xa4\xed\x99\x53\x61\x83\x11\xec\xd2\x68\xed\x21\x35\xed\x5f\x82\x7b\x70\xf7\x8d\x40\xf1\xa4\xc9\x9f\x93\xc9\xa7\xdc\x8e\x36\x17\xbd\x4b\xd7\x55\xef\x88\x9d\x59\xbd\x13\xb3\xb2\x11\xba\xfb\x6a\x8b\xb6\x44\x42\x96\x73\x78\x81\x37\x55\x60\x63\xaa\xf2\x28\xfc\xcc\xfc\x67\x25\x55\xbc\x74\x99\x7d\xc7\x24\xc9\xf9\x60\x15\x63\x6a\x2c\x9c\xa2\xf0\x6b\x0f\xaf\x31\x90\x17\xd4\x81\xe6\x21\xf5\xdb\x47\x1d\xd7\xb1\xa2\x85\x75\x7a\x7d\x54\xff\x1d\xf7\x18\xaa\xa0\x48\x50\x75\xfc\x4a\x75\xdf\x4a\x45\x11\x50\x6a\x31\xc7\xbc\xca\xb5\x6a\xcc\xe1\xe1\x83\x84\xc6\xf9\x79\x29\xc8\x45\x69\xa4\x21\x7f\x41\xdc\x93\x63\x6a\x34\xf3\x8a\x3b\x6a\x41\x00\x1e\x1f\x63\x8d\x1c\x82\xbd\xc4\xff\x3d\xa4\x16\x35\x58\xea\x3d\x25\x6b\x7c\xdd\x8b\x6b\x04\x7b\xd4\x3f\x49\x11\xd3\x7a\x68\x3b\x91\x80\x03\x59\x6c\x76\xbf\xda\xf7\x85\x26\xf4\xc5\xe8\x43\xa8\xd1\xb8\x1e\xd6\x59\xc1\x54\x21\x8a\x15\xb1\x0e\xce\xd1\xa1\xa5\x25\x6d\x13\x50\x32\x5c\x2b\x9e\x3a\x85\xc4\x06\xa9\x72\x3d\x3a\xe4\xe8\xf5\x6f\xcf\x3a\xa4\x47\xdb\x70\x48\x14\x08\xa1\x33\xba\x4e\x9a\x63\xe0\x44\x02\xa7\xf4\xab\xa3\x6d\xd2\x07\x08\x9a\x89\xea\xe9\x32\xff\x2b\xe5\x6e\xae\x33\xbf\xe6\xac\x2e\xc1\xba\x39\x74\x3f\x7a\x04\x26\x44\x6f\x06\x00\xca\xea\xd2\x45\xc2\x2c\xa8\x70\xa7\xed\xe4\x48\xaa\xf2\x9d\xa8\x7d\x7e\xc9\x26\xc2\x11\x23\xa9\x66\x18\xa1\x04\xdf\x67\x8e\x5f\x11\xa8\xcd\xfb\x31\xb1\x83\x27\xff\x83\xd6\xf4\x6e\x39\x96\x29\x09\x33\x2c\x43\x6d\x7e\x4f\x8e\x85\xa9\x80\x3e\x81\xbd\xb1\x47\x8a\x45\x1e\xf8\xa5\x24\x9b\xbe\xb0\xa4\x99\x06\xee\x7d\x89\xa0\xb6\x0e\xd9\x32\x24\xa3\x16\x1e\x1c\xfe\xb9\xb2\x66\x9a\xb1\x92\x97\x4b\x48\xed\x0f\x56\x69\x32\xa6\x0b\xa9\x71\x11\xf8\x6b\x47\x9d\x47\x43\x0d\xba\xc7\x6b\xed\xa0\x0e\x50\x90\x2b\xe5\x74\xcd\xf4\x84\x5e\x95\x52\xbc\x03\xb3\xad\xe9\x29\x31\x36\x68\x97\x2e\x3f\x8c\x2d\x93\xac\x7a\x12\x0c\xbc\x1f\xbf\x97\x37\xd5\xe3\x25\x3f\x1b\xaf\x3e\xd3\xfd\x04\x69\x0f\x03\x96\x3f\x4b\xe2\xe7\x9c\xa8\x85\x71\x55\x44\x15\x76\xa9\xeb\xb3\x2f\x4a\xdb\x08\x2c\xc5\xac\xb0\x30\xd8\x99\x53\xd8\xe8\x30\xf1\xfd\x60\xc8\x8d\xea\x77\x65\x28\x5c\x20\xe6\x23\x61\xce\xde\xac\x67\xdf\xf4\xce\xa0\xfe\xe7\x86\x6e\x2f\x14\x0a\xbd\xa5\x8f\x74\x46\x0b\x50\xbf\x50\xed\xbf\x24\x9c\x73\x6e\x1a\xf0\x8b\x43\xab\x8c\xf2\x39\x54\x5f\x1a\xd5\x57\xa2\xb9\x95\x04\xf6\xfa\x45\x84\x2f\x93\x19\x6f\xe9\x80\x41\x21\x0a\xd3\x8d\xf7\x45\xaa\xac\x8e\xc2\x7b\x24\x77\xf0\xc2\xdc\xb2\x2d\xd6\xbd\xe3\x3e\x69\x39\x4c\x5d\x5d\x84\xcf\x93\x35\x6c\x00\x9e\x18\xf2\xe7\xbb\x16\xa2\x70\x7b\xa8\xbf\x47\xa1\xe2\x47\x4e\xce\x77\x1f\x96\xa1\xfc\x3f\xc7\xcb\x6d\x71\xe0\xc3\xbb\xe5\x9a\xdd\x02\x93\x8a\x65\x25\x2a\x0c\x53\x4b\xc2\x6c\xea\xec\x6d\xcd\x76\x64\x60\x1b\x9a\x7c\xf2\x1e\xab\xed\xd6\x54\x0a\x77\xba\x5e\x92\x28\x1d\x20\x9f\xa8\xe6\xfe\x05\xd9\x64\x64\x26\xf4\x46\xa5\x39\x1f\x26\x03\xaa\x73\x0a\x69\x0e\x47\x1e\xcf\xda\x6f\x70\xae\xe4\x82\xa2\xc1\x14\xa0\xa9\x71\x17\xe4\xf8\x8a\x96\x35\x71\x52\xe3\x5c\x5b\x29\x68\x7f\xac\x97\x26\xc4\xa6\xe9\x1c\x64\x94\x92\x63\x4d\x8a\xb4\x56\xef\x08\x07\x3c\x1e\x35\xdf\x74\x77\xb6\x7b\x5e\xda\x72\xa2\xf8\x2c\xe1\x7d\x46\x54\x53\xbe\x5b\xb6\x38\xc9\xfe\xe9\x48\x95\x61\x42\xc2\x3b\x53\x80\x7a\x47\x0a\x07\xf9\xe6\x80\xce\xdb\x52\x2b\x13\xeb\x58\x6b\x83\x4b\x5a\x7b\x1b\xa6\x98\xe7\x3b\x5f\x48\x77\x88\xc4\x41\x6e\x19\x4a\xe7\x13\xd2\x30\x81\xff\x38\xa1\x03\xf1\x25\x1e\x17\xe3\xf1\xae\x7c\x05\x73\x08\x0e\x01\x5b\xa8\xda\x20\xf6\x17\x18\x37\x4a\xc2\xe5\x28\x50\xb9\x14\x55\x35\x76\xa9\x1e\xcf\x29\xe4\x14\xd9\x2d\xcc\x7d\xa2\xf9\x9c\xc7\x56\xbc\xa5\x8a\x35\xba\x0a\x67\x6d\x98\x77\xc8\x32\xa3\xee\x69\xd0\xf7\x02\xbf\x27\xa0\x2d\x72\xe4\xdb\x33\x1e\x6a\x69\xab\x28\xfb\x9f\x6d\x32\x90\x62\xd2\xf3\x3d\x96\xd6\xf3\x13\xfd\x0e\x88\xd7\x05\x6c\x8a\xf7\x64\x6e\x9e\xb5\x59\xfa\xfd\xe8\xf6\x73\x72\xb2\x8f\x56\xea\x4f\x88\xfa\x58\x02\xdd\xfb\x29\x85\x4a\x96\xc3\x14\x51\x66\x80\xaa\x7e\x29\x9e\x4f\xe6\xd9\xe7\x7e\x18\x12\x9c\x5d\xb8\x83\x3c\xc4\xfe\xd9\xd4\x47\x32\x8e\x83\x61\x74\xfc\x3f\x21\x0d\xad\xaf\xa5\xc9\x80\x6c\xdb\x57\x65\x54\x09\x77\x47\xa7\xdb\x62\xee\x64\xb4\x8f\x09\xb1\xa7\xc3\xf3\xb4\x4e\x66\x15\x70\x88\x64\x07\xc5\x75\x6e\x19\x9b\xc0\xe3\x19\x45\xc5\xd0\xca\x38\x0c\x5b\x61\x05\x09\x04\x3f\x8c\x7c\xcb\x4b\xfa\xfa\xdb\x27\xf2\x05\x45\xbf\x4d\x29\x57\xdb\xc6\x20\x39\xc0\x11\xe5\x7d\x07\x05\xdf\x65\x12\x24\xd7\x95\x1f\xec\x80\xb1\xfc\x59\x2b\x5d\x33\x14\xd2\xaf\x0d\x79\x43\xd8\x52\x13\xcd\xe3\xcc\x26\xfc\x84\x2c\x95\x22\xe1\x55\x99\x76\x3f\x6d\x59\x80\x67\xe9\xa7\x24\x93\xe3\xb2\x97\xb4\x10\x45\xb7\xa2\x54\x2f\x09\xe5\x7a\x3e\x99\xab\xfa\xd7\xb5\xff\xa7\x2b\x25\x06\xd3\x09\x25\x02\xb8\xf6\x57\xce\x38\x26\x4a\x98\x0a\xc8\xd4\x2a\x11\xbf\xf7\x5a\x68\xb6\xfa\x04\xbc\xe7\xed\x17\xe9\xb5\x45\x75\x73\x4e\x9f\x13\x23\x88\x00\x8b\x3a\x21\x57\xf8\x13\xcc\x9f\x2c\x38\x8e\x0f\xe1\x5e\x56\xc9\x96\xe2\xe5\x23\xb9\x8e\xfb\xac\xdb\x4d\x3b\x34\x44\x2f\x9e\x09\x6a\xc1\x83\x17\xe6\xa2\x0a\x08\x38\xa9\xbf\x7e\x2e\x31\x31\x46\x4d\xf4\xab\xbd\x43\xfa\x29\x02\xa1\xf8\x3d\x20\x6b\x42\x6f\x7e\x4c\x97\x38\x09\x52\xd8\x5c\x65\x11\x70\xd1\xbd\x71\x88\x54\xb9\x21\x1e\x2f\xa2\x55\xb7\xbe\x1e\xbf\x7e\x37\x1e\xa8\xa3\x90\x52\xdc\xdb\xf8\xb9\x79\x1f\xd4\x5e\x4f\x2b\x6a\x48\xd0\x99\xac\x3a\xe5\x77\x6b\x24\x16\x42\x55\xbb\x3d\x51\xa0\x9b\x2b\x0b\x6a\x1c\xaa\xf7\xfd\x42\x05\x03\x0f\x8f\xf0\x57\x17\xf0\x5f\x0e\x1d\x44\x4c\x94\x1c\xc9\x00\xd0\x05\xe4\xe8\xaa\x1c\x3a\x76\xc5\x34\xd7\xc0\x5c\x55\x5d\x72\x8c\x55\xe0\xc3\x58\xa6\x66\x75\xa1\x78\xbc\x50\xe3\x95\x38\x81\xb2\xeb\x03\x7b\x11\xd4\xe7\x88\xde\xb8\x7b\xf6\xc0\x0a\x9d\x27\xcb\x3f\x6f\x88\xda\x14\xf6\xb2\xbc\xb9\xb5\x62\xdb\x58\x36\x67\x2e\xda\xac\x03\xa5\xd8\xae\xfd\x4f\x5c\xc2\xb1\x7f\xa1\xfd\x9c\xf5\xf0\x7b\xad\xf7\x7b\xc7\xb9\xed\x87\x13\x67\x48\xb6\xa1\xe8\x84\xab\xd5\xca\x00\x2c\x17\xd8\x9b\x6e\x4a\x4a\x8c\x60\x13\x80\x66\x88\x48\x7f\xa0\xd6\x78\x2b\x65\xbc\xe7\xf1\xa7\x06\xbf\xe2\xb6\x21\x8e\xf9\x5b\x8a\xa1\xf2\x6b\x00\xfa\x9d\x70\x93\x9d\xf9\x85\xa8\xd9\x27\x72\xa3\x56\x8b\xf0\x52\xbf\xd0\x63\x33\xc1\x15\x0d\xbc\xb2\xa6\xb3\xa3\x4f\x69\xe1\x1f\x0e\x01\xa8\x46\x50\xb9\x98\x57\x91\x3d\xec\xbb\x8e\x4a\x5c\x5c\x11\x19\xa2\x05\x07\x17\x7d\xc6\x7a\xbf\xf2\x5c\x74\x7e\x15\x45\xde\x67\xe0\x2f\x96\x5c\x3d\xfc\xdd\x48\x24\x42\x98\xdc\xc8\x65\x0f\xa9\x43\x88\x6f\x43\xee\x38\xf3\xc3\xf3\x5d\x6d\xaf\x75\x83\x81\x4a\x32\x07\x91\xbf\x57\xe0\xff\xf2\x01\x21\x62\xe4\x61\xb1\x60\x6f\xba\xee\x30\x69\xfa\x4b\xcf\x6f\x9b\xdf\x58\x4c\xd2\xcd\x0e\x8a\x69\xb7\x95\x03\xd8\x2c\x2e\x84\xdd\xbc\x89\xae\x78\x44\x26\x07\x9a\xc0\xee\xbd\x9f\x28\x33\xf5\x94\x6e\x18\xb9\xaf\xb9\x21\xda\xb8\x94\x3d\xcf\x12\x72\xe2\x67\xda\x6c\xab\xd7\x45\x73\x48\xfe\x90\x19\x01\xf7\xda\x8b\xee\x19\x5e\x0f\xc1\x9a\x6c\x03\x1c\x67\xcd\x4c\xe2\xcc\x47\x59\xa1\x52\x78\x3a\x6f\x0f\x0c\x59\x86\xf8\xaa\xbe\xd9\x62\x44\x03\x96\xc5\xec\x6a\x78\x43\x71\xcd\xfd\x2e\x2c\x53\x66\x99\xf1\x41\xe0\x57\xae\xf3\xfa\x8d\xba\xfc\xfb\xb5\x07\x97\x62\x4e\x6b\xc9\x22\xc8\x89\x1a\xb1\xb9\xb8\xab\x19\x1b\x3c\xc3\xfa\x4a\x80\x68\xd6\x5e\x79\x20\x8d\xa8\xc6\xe3\x55\xde\xd9\xa8\x68\x72\xdb\x10\xb2\xf3\x37\x0c\xb0\x79\xd3\x7e\xe1\xa7\xc4\x22\x17\x7f\xdc\x46\x08\xe9\xad\xc0\xc0\xf7\xe3\x80\x13\x4b\x9b\xde\x7a\x5e\x38\xb3\xbb\xdb\xb5\x87\x66\x9f\x27\xa2\xd3\x7f\x38\xa2\x10\x31\x18\x7f\x28\x64\xe0\x0a\x7c\x22\xa4\x4d\x29\x44\xff\x2e\xb3\x94\x1d\x41\x37\x98\x28\x89\x95\x2a\x58\x05\x5f\x8b\x01\xcf\x78\x2a\x2c\x30\x0f\x7e\x45\xa8\x1f\x78\x89\xe2\x6f\xeb\x24\xc9\xf2\x47\x06\xa5\xa8\xcf\x52\xcd\xcd\xa7\x69\xd3\x77\xa6\x10\xe0\x74\xae\x69\x38\xaa\x55\xde\x94\x70\x41\x81\xf4\xe9\x42\xdf\xe4\x95\xfc\x62\xb2\xd5\x39\x2e\xe4\x8d\x1b\x6e\xfe\xbc\x2d\x8a\xf3\x61\x7d\xeb\xb3\x57\x45\x63\xa1\x75\xe1\x86\xf7\x09\x8c\xa0\x9d\x9b\x14\xbe\x6a\x65\xb7\x50\xaf\xcb\xcf\x6a\xe3\x71\x53\x3f\xb3\x9e\x86\xe7\x9b\xf1\x15\xf5\xd1\x39\x86\xe2\x58\xe0\x0d\x5c\xff\x6b\xda\xbf\x1c\x67\x88\x18\x39\x34\x12\x48\x32\xce\xbd\x0f\x7d\x1b\x27\x92\xaa\xf4\x99\xfd\x5a\xa8\x9a\x15\x3d\x83\xaa\xc6\x5b\x2a\x03\x0e\x19\x83\x9f\x2d\xcb\xbd\xf9\xfc\x88\x02\x78\x89\xb8\x0e\x91\x59\x9e\x1e\x97\x2f\x06\x51\xd8\x96\x64\x5d\x69\x3a\xbc\xa4\x76\x69\x62\xb7\x59\xc2\x6d\xcf\x2c\xfc\xb0\xb9\xac\x06\xc1\xc2\x98\x43\x55\x7e\x8b\x98\x5b\x62\x3f\x54\x3d\xba\xeb\x9f\x02\x27\x3b\x70\xb2\x1a\x0f\x5d\x03\x4b\xeb\x0d\x49\xc2\x13\xb7\xfb\x60\xe1\x13\x7e\xca\x0f\x5e\x32\x02\xcd\x93\xaa\xd8\x47\xa4\x3f\xa9\x74\x6e\x97\x41\x16\x25\xd8\x46\x70\xdf\x78\xf8\xdf\xde\x1b\x0e\x1d\x7c\xfe\x3b\xcb\xff\xe5\xe8\x43\xc4\xe0\xe0\x84\x60\x83\x9f\xa6\xae\xde\xdc\xe1\x8c\x52\xd8\x50\x68\xe8\x68\x60\xed\x77\xcf\x48\xe7\xb0\x43\x38\x04\xf6\x37\xa7\x24\x36\x3d\x7f\x68\x17\x64\xeb\x01\xc1\xae\x00\x5f\xc2\x5b\x4a\xce\xc4\x4a\x4d\x56\x93\x3c\xa6\x3d\xa4\x2f\x5b\x8c\x08\xd7\x18\xe1\x4d\x72\x0b\x89\xdc\x53\x8e\xf9\x2c\xa0\xb6\x18\x7d\xaf\x61\x23\x53\x8b\xbc\xae\xfc\xb7\x91\xb0\xa0\x8f\x3e\x96\x5c\x1e\xba\x32\xd4\x5b\x8c\x5e\xa9\xbc\xcd\xa3\x9d\x06\xfe\xa0\x02\x16\xc5\x4f\x56\xd9\xe0\x8b\xc3\x45\xce\xb1\x11\x8c\xb1\xf4\xfc\xcf\x7f\x6a\xeb\x7e\x38\x65\x69\xff\xae\x38\x9f\x56\x7c\x55\xd2\x0d\x56\xbb\x34\xcc\x2a\xda\x36\xbc\x72\x74\x9a\x23\x9d\x4a\x42\xf8\x78\x4e\x1d\xb0\x42\x88\x25\x52\x37\x45\xc7\x70\xe6\x44\x0e\x7b\x8a\x0d\x92\xb2\xa3\x96\xf6\xd0\xad\x32\x9e\x5c\x0c\x68\x1f\xc0\x4e\xbb\x0c\x56\x26\x86\xf8\xee\xe7\x5b\xd6\x1b\x19\x6e\xc8\xa7\x57\x30\xcb\x6c\xfc\x9d\x0a\xff\xf2\x4d\x21\x62\x06\x50\x70\x20\x23\x09\xd5\xf2\x6b\x8b\xd6\xed\xc1\x59\xcb\xb2\x99\x8d\xc8\x4e\x49\x71\x61\xab\xb7\x76\x6f\xa2\xdc\x5b\xa7\xe1\xc3\x54\xfb\x35\x5e\xec\x83\x8d\x62\x57\x88\x7d\xbb\xed\x2a\xad\xef\xda\x55\x52\x04\x65\xec\x42\x37\x0a\x24\x70\x54\x1c\xe5\x6c\x74\x9c\xcc\xe2\xe2\xa8\x97\xc7\x00\x68\x2b\x9d\x97\xf7\x49\x14\xde\x7c\xa5\xbd\x61\xdd\xb9\xf3\x9c\xb0\xb1\xcf\xef\x0e\x7b\xe5\x2c\x15\xea\x0c\xdd\x5d\x12\xde\x52\x52\x00\x5a\x46\x1b\x73\x32\xa6\x69\x44\x81\xe6\x37\xe9\x21\x40\x85\x97\xcb\x83\xbf\xaa\x18\xab\xd9\x41\x7c\x31\x46\xbc\x09\xc7\xad\x2a\xf1\x37\x73\xfb\x2f\x5f\x1a\x22\x86\xcd\x0c\x4d\x08\x64\x6e\x1b\xac\x31\x4e\x7a\x3e\xb1\x1b\x68\x87\x66\xef\x33\x2a\xe7\x77\x57\x35\xa2\x37\x32\xee\x49\x95\xfd\xa1\x69\xf1\xee\x36\x34\x00\x49\x6a\xed\x35\x92\x97\xe1\xc6\xac\x8c\x94\x8d\x4b\x12\x8f\xd2\xf2\xca\x0c\xfb\x23\x18\x94\xe0\x5f\x40\xb8\x73\xa0\x45\xc4\xa8\x0d\x41\x16\x79\xb8\x9b\xd2\x5f\xa2\xe3\x7a\x52\x36\xed\x2d\x86\xd3\x8c\x8e\x4a\xa1\x93\xe1\x83\x6d\x4e\x88\xca\x7d\xc4\x87\xbb\x9a\x05\x1f\x5f\x01\x50\xd3\x3f\x64\x70\x45\x4d\x3f\x68\x7e\x09\xa4\x85\xdc\xbe\xd6\x66\x93\xa0\x24\x45\xff\xdc\x69\x41\x4f\x5e\x4f\x60\xc7\x87\x4b\x08\xb2\xd3\xb0\x6c\x48\x2b\x1f\x70\xd7\xce\x49\x57\x1b\xc6\xbc\xf8\x6a\x9e\x29\xab\x90\xec\x5c\x23\xd8\x8a\xb7\x52\x5f\xee\x9c\xcc\x3a\x0a\xd2\xe3\x98\xc7\xba\x94\x47\x89\x06\x54\x86\x9e\x49\xaa\x48\x9f\x04\x1e\x1c\xe6\x08\xae\x63\xae\xd5\x66\xa6\xa6\x71\xf5\xc9\x7b\x87\x2d\x83\x66\x35\x29\x3f\x97\x9f\xf9\xea\xf6\x8d\xf7\xbb\xac\x19\xe9\x6a\xf3\x18\x77\x4b\xfc\xaf\xc8\xdd\x8d\x10\x9b\x26\xb2\x34\xce\x3c\xf0\x8c\xf4\xf8\xa4\x1e\xac\x15\x39\x34\xec\x6d\xea\xff\x7b\x2b\x43\x77\x03\x85\xdd\x7c\xc3\x9b\xf9\xb2\xd5\xa2\x47\x84\x66\xd3\x00\xb9\xfd\xd2\xf7\xbf\x71\xca\xaf\xb5\xd8\xa4\xbf\xb3\xeb\x65\x85\xbe\x8c\x9a\x8b\xba\xe8\x65\xf1\x5a\x6a\x61\x53\x12\xed\x73\x73\xb4\x14\xf5\xe0\xed\x86\x81\x48\x19\xe1\x62\x42\x43\x09\xc1\x21\x47\x06\x40\x44\xa1\xf6\x10\x85\x20\x10\x11\x28\x4b\x21\x88\x28\xd4\x21\xa2\x50\x00\x44\x04\xca\xf4\xbf\xfe\x9a\x0b\xfd\xbf\xff\xde\x41\xfc\xaf\x7f\xf6\xff\xfb\x9f\x83\xff\x06\x98\xfc\xd7\x5f\x8b\xff\xfa\x6b\xf6\x5f\xff\xb1\x8b\x28\x14\x83\xfa\x3f\x61\xea\x1b\x69\x57\x24\x66\x08\xc2\x56\xdf\x65\x40\xbc\x87\x3e\xca\x70\xdf\x89\x61\x7b\x03\xd9\xc8\x4c\x2c\xd3\x68\xb5\x69\x31\xec\xff\x76\xe5\x00\x41\xd8\xf4\x92\x81\x40\xf1\x2d\x23\xe6\xd4\xa0\x5a\xcb\x69\x7e\x56\xd1\x16\x59\x2b\x7a\xb6\x50\xbd\xe9\x39\x1b\xfc\xe1\xa6\xf4\x8f\x70\x00\x8a\x3a\xb4\x17\x78\x71\x4a\x41\xb3\x1a\xd6\x3b\x45\x89\xf2\xf0\x2d\xb4\x62\x8d\xef\x7c\xc8\x47\x23\x6a\x5a\xcf\x7a\x81\xf1\xf7\x37\x30\x05\x41\x39\x77\xf8\x05\x1f\xd7\x38\xe8\x25\x91\xb3\x44\x92\x21\x93\xa7\x81\xc5\x03\x61\x13\x19\x27\x04\x63\x79\x03\x89\x7f\x20\x18\x80\x16\x7b\xd3\x6e\xd2\x22\xd6\x86\x0e\x5b\x2c\x53\xbe\x95\xd6\xae\xfa\xb0\x52\x81\xf5\x78\xb0\xa7\x08\xab\x0b\x2d\xdf\x01\xcd\xfa\x0c\x80\x0e\x76\x34\x21\x50\xb7\xfe\xf1\xe2\xb9\xcf\x80\xba\xcd\xc7\x83\xad\xbc\x29\x8f\x5b\x14\x88\xc6\xd3\x46\x9b\xcf\x7f\x4e\x9a\xf0\x11\x2c\x4d\x67\x17\xd8\xde\x7a\x16\x61\xb9\x23\x1e\x16\x6f\x75\x92\xb2\x9c\x3d\xc7\x4f\x76\x7e\x1c\xb7\x21\x4a\xee\x7d\x7f\xeb\xab\x89\x08\xb2\x6b\x8c\x60\x1c\x57\x5b\x52\x4a\x3c\x93\xfd\x13\xa9\x7a\x13\x3c\xb4\xc8\x47\x9c\xec\xd2\x4b\xec\x69\x92\x5b\x78\x42\x76\x8d\xf5\x12\x80\x7e\xf2\xd5\x5d\x12\x1f\xd8\x56\x91\x24\x5e\x3b\x93\xc7\xd7\x6a\x3a\x23\x65\x82\xfd\x66\x9c\x63\x9b\xbb\xf0\xba\x3c\x0e\x47\xf9\x14\x80\x62\x11\x73\xe7\xbc\xbc\x8b\x7c\xb9\x77\x52\x13\xb5\x97\x55\x3b\x7d\x8b\xb5\x50\x8a\xee\x17\x7d\x82\xee\x13\xf0\xf2\x03\xf3\x24\x58\x71\xb5\xc2\x2e\x88\xb7\x1a\xc6\x7c\x16\xe8\x9b\x6a\xb3\x2f\x37\x4a\x8a\x36\xc2\x24\x40\x6a\xbd\x4d\x33\xe3\xa6\x55\xce\xaf\x1a\x0c\x0b\x40\x45\xde\xa8\x44\x56\xda\x64\x1a\x98\x48\x0b\x8f\x48\xbc\x22\xfd\x26\xae\x37\x5e\x6a\x3e\x82\x2e\x59\xe1\x37\x7a\x70\x43\xb6\xb3\x06\x6a\x5e\x67\x13\x1e\xd0\x8b\x91\x2f\x97\x79\xf3\x88\x0d\x9c\xdc\xcc\xcf\xb7\xb1\xbc\xc2\x0e\x0a\xca\x21\x4b\xb1\x37\x47\xd0\x9b\xc7\x05\xa0\x6f\xb6\x49\x75\x0a\x61\x2e\x8d\x1b\xe7\x87\x35\xba\x75\xc8\x7d\x74\xdf\x7f\xc5\xf8\x6d\xf3\xbc\x8c\x7a\x24\x2b\x8e\x14\x56\x37\x0e\x80\xc2\x6e\xe7\x40\x7b\x97\x13\x93\x5c\x88\xac\xbf\xa1\x59\x6e\xa5\x80\xea\x6d\x41\x55\x90\x6b\xa1\x9c\x56\xb7\x7b\xa3\x48\xfc\x21\x12\x14\x72\xd7\x72\x2e\x48\xf7\x7f\xe0\xcd\x71\x75\x5d\xd0\x29\xc1\xc9\xe8\x70\x50\xfc\x44\xc2\x7c\x42\xe5\xd2\x37\xc2\xdf\x35\x82\x01\x8e\x7a\x98\x21\x41\x90\x7a\xd4\x7d\xd7\x9b\x55\x52\x2f\xdf\x6b\xab\xb5\x47\x7d\x34\xe8\xcd\x50\xfd\xbd\x3b\xf0\x8b\x91\x8c\xdf\xd7\x5f\x00\x94\x73\xcc\x3c\x13\x83\x30\x7c\x52\xb4\x04\x26\xa0\x37\xfa\x61\x67\x94\xd0\x4e\xc2\xd8\xec\xab\x6d\x53\x75\x8a\x81\x69\xab\x2f\x0d\xd8\x9f\xc2\xce\xaf\x82\xd0\x7d\x6b\x48\x42\x6f\x3c\x06\x6b\xb4\xbb\x17\xec\xe2\xdf\x7d\xa5\x1e\x22\x36\xaa\xae\x6e\x8e\x22\x42\x90\x09\x40\x5f\x6b\xb5\xa4\x19\x9d\x3d\x6e\xf5\x71\x6c\xa6\x2c\xe1\x2f\xac\xcd\xcc\x8a\x26\x84\xc2\x0e\x6c\xd8\xca\x96\xe4\x4b\x3f\x13\x06\xb3\x6b\x95\x6d\xed\xa4\xcc\x6a\xbe\x70\x89\xc6\xf3\x6c\x14\x78\x74\x7b\x8e\x6a\xad\x2c\xc9\xc4\x93\x01\x38\xfa\xda\x84\xa3\x57\xae\xe0\xcc\x92\x28\x0b\x70\x1b\x76\x0a\xa6\x2f\x9c\xe3\x2e\xbc\x69\xf2\x70\x17\xbc\x6f\x50\x30\xc9\x2c\x9c\x6a\x94\x53\x80\x7b\xdd\xf6\x16\x84\x32\x14\xc1\x16\xab\x7a\x44\xe9\x9e\xb8\x9c\xae\xf3\xd0\x8f\xf5\x20\xe6\x2c\x0c\x6a\x32\xca\x4a\xf9\x2a\xda\x31\xa7\xd1\x13\xe6\x00\xd0\xeb\xf4\xad\xd9\x57\xf5\xe2\x58\x35\x76\xc2\x9c\x1e\xb4\x68\x1f\x1f\x9d\x4d\x39\x0e\xeb\x71\x09\xb0\x55\x78\x7e\x45\xb8\xf9\x7b\x82\x32\x4f\x16\x52\x5f\xf9\x57\x26\x13\x18\x44\x2d\xdd\xfd\x3f\xc3\x75\xbe\x8f\x1e\xb2\x11\x25\x4e\x78\xc5\x3e\x89\x60\xcc\xf5\x95\x66\x04\x5c\x30\x85\x96\x7a\x78\x11\xc4\x2c\xe9\x92\x64\x34\xd5\xf9\x91\x5e\xfa\xe1\xf7\x0e\x6a\xb7\x55\xf5\x2d\xdd\x3a\x89\x6a\x90\x48\x2b\x00\x5a\x11\x8b\x56\x6a\x8b\x94\x52\xd0\xb8\x23\x37\x64\x30\x68\x6b\x5f\x0f\xb1\xf1\xf6\x18\x0e\x2a\xce\xb5\xc1\xd5\x31\x54\x27\x1d\x02\xa0\xbf\xba\x09\x27\x93\xa7\x64\xe8\x0d\x51\x38\x54\x0d\xa2\x36\x45\x59\xc6\x4a\x4a\x55\xe3\xb4\x93\x5d\x27\xd3\x47\xfb\x2b\x70\xda\x40\x7e\xe9\xff\x8f\xb1\xeb\x8e\xc7\xf2\x7b\xff\xf6\x4e\x28\x23\x2b\xa4\x28\x23\x23\x51\x29\xb9\x8d\x16\x0d\x95\x4a\x64\x65\x24\x33\x4a\x13\xcf\x21\x49\x36\x99\x11\x21\x64\x64\xef\x1d\xb2\xb2\x77\x32\x33\x42\x46\x66\xe6\xef\xe5\xf3\x3c\xcf\xfd\x3d\xbf\xbf\xee\xfe\x3f\xef\xfb\xbe\xce\x75\xae\x73\x5d\xef\xeb\x7d\xce\x73\x3f\xad\xaf\x7c\x38\x0f\xa8\xc5\x47\x0e\x1c\xf3\xa3\x70\x79\xf2\x37\xb0\x22\x9a\xc6\xe5\x77\x46\x89\xd0\x2c\x98\x14\xde\x7a\xf3\x1d\xbe\xa8\xa3\x14\xf3\xa4\x29\x25\x16\xbc\xf6\x0c\x3a\xf4\xd3\xb8\x6c\x89\xbc\x2e\x55\x43\xb9\x20\x49\xfe\xd2\x15\xb3\x5d\x57\xb9\x46\x2f\x41\x43\x9d\xaf\x06\x7b\xb0\xfd\x88\x96\x3c\xc5\xfd\xfd\xf5\xf2\x62\x39\x4b\x1e\x38\xcf\x65\x1b\xfe\xe8\xd7\xe8\xe1\xb3\x99\x6b\xa3\xbb\xd7\xa0\xa1\xde\x1e\x53\x4a\xa9\x94\x67\xc5\x9f\x53\x54\x1a\x5e\xd5\xb4\x90\xb6\x4e\xdc\xef\xf9\xa6\xd2\x6a\xee\x9c\x9e\x21\x53\xa8\x56\x50\x21\x34\xd4\x49\x43\x59\xb3\x8e\xae\x72\xd8\xf4\x65\x67\x49\xf4\xd7\xde\x90\x40\x1f\x95\xd1\x67\x35\x26\xf6\x37\x38\x1e\xe6\xc9\xcb\xf6\x84\x15\xec\xfe\xb7\xe4\x0a\x94\xb7\x36\x4a\x36\x83\x79\xa0\x47\x6b\xd9\x0b\x14\x30\x0b\x91\xbe\x78\x50\xc8\x62\x4f\x81\x7b\x96\x69\x57\x78\x53\x65\x83\x99\x3f\xc4\xf2\x33\x19\x9d\x9f\x89\xb9\x1f\x00\xc8\x67\x46\x68\x7c\x4a\xba\xda\x70\xfd\x83\x9b\x65\xbc\x4b\x96\xd1\xf3\x5f\xf9\x1e\x2c\x54\x7c\xe8\xa3\xa0\x50\xa7\xec\xf1\xbd\x67\x39\x7c\xd4\xcf\x1a\x20\x39\x64\xd0\x70\x36\xff\x17\xfb\xce\x7b\x64\x85\x85\x4d\x06\xe6\x5f\x94\x5e\x71\x70\x21\x53\xb7\x5f\xfa\x7e\x3f\xd7\x81\x6e\xb8\xe9\x9a\x67\xb5\x2c\x0e\x20\x89\xbb\xa0\xf1\xad\x64\x7b\x29\xbd\xf4\xdc\x97\x1f\x95\x07\xdf\xc4\x69\x8a\xec\x48\xb9\xdb\xb4\x18\x93\x28\x4f\x79\xec\x8d\xb5\x7c\x46\x3b\x5b\x1d\x0e\x20\xef\xe9\xa0\xf1\x85\x89\x7e\x69\xfb\x96\xb6\x02\xf4\x45\xaa\x6b\xde\x71\x96\xe8\xba\xbe\xa9\xb0\x26\x15\xae\x15\x7b\x78\x9b\xe4\x4c\x5f\xda\x61\x26\x67\x80\xf8\xec\x80\xe5\xc2\xf3\xc7\x8f\xf6\xf1\x5a\x3f\xad\x50\x93\xbf\xcf\x27\xa0\xfc\x9c\x97\xee\x5a\xfc\x09\xe3\xbc\x47\xa9\x4b\xd4\x0f\xfb\xb2\x40\x0d\x40\x7c\xe1\xd9\x96\xd6\xa6\xea\xdd\x74\x2e\x14\x77\xb9\xc3\x2f\x9f\xa8\x2a\x4e\x77\xe8\xef\x0b\x65\x9d\x7b\xc2\x72\xe3\x23\xe7\x6f\x06\x7b\x3f\xea\x04\x48\x1f\x2b\x9c\x01\x78\x0f\x3c\x8e\x88\x4c\x4a\x7e\x76\xb5\xa2\xee\xdc\xf4\x5c\x8f\x9e\x00\xe9\xd3\xbd\x0a\xce\x61\xfc\x7b\x7b\x68\x25\x99\x23\x26\x01\x50\x84\x8d\xaf\xb4\x8d\xb6\x4a\x3e\x22\x15\x42\xc1\xa3\xd8\x9e\x7e\xe3\xfd\xd7\x33\xa2\x40\xe9\xc2\x8e\xb7\x73\xa2\xde\x57\xa4\x59\x0b\xa9\xde\x00\xc4\x87\x12\x2e\x9d\x07\x79\xc8\xf8\xd4\x97\xb4\x6e\x51\x35\x5f\xa7\x99\xca\x67\x53\x73\xff\x79\x55\xc0\x87\x56\x6c\xf0\xe5\x70\x95\xda\x5a\x4b\x9a\x33\x40\x3c\x99\xa1\xf1\x75\x17\x4e\x2c\xb6\x58\xdd\xbc\xf0\xe9\x1d\x97\xb8\x71\xf3\xee\x23\xa1\xa9\x31\x0d\xbf\x0e\x92\x0c\x1f\x9a\x5f\xba\x6b\x2f\x67\x1c\x02\x90\x77\xa4\xd0\xf0\xb5\xd8\x57\x1b\x3f\x76\x9b\x17\x7b\x9c\xf0\x3e\x2a\xfe\xe4\xe0\xd8\xf5\x9b\xa7\xac\x19\xce\x24\x29\xc7\x4a\x4a\x5f\xc3\x29\xea\xaa\x03\x64\x93\x06\x1a\xfe\x94\xbc\x49\xd4\x83\x24\x46\x53\x59\xdd\xbd\x3f\x51\x9d\xdb\xae\x45\xa8\xca\x4e\x30\x21\x40\xeb\x6b\x78\x6c\xcd\xb2\xcc\x29\x3b\xd8\xe9\xb3\x61\x59\xad\x95\x25\x7f\x8e\x17\x98\xca\xca\x2d\x81\xe0\xfd\xf5\xec\xaf\x4e\xf1\x19\x72\xbe\xec\x72\x3a\x46\xbe\x5a\x41\x85\x03\xc8\x10\x6c\xf8\x4e\x55\xf9\xa0\x5a\x87\xc7\x46\x62\xa3\x92\xcf\xf4\x9f\x5b\x39\x9b\x3c\xfb\x56\xf7\x73\xc2\xd1\xf5\xa3\x1b\x1b\x8f\xe0\xe8\xbe\x58\x00\x90\x46\xd8\xf2\xcf\x22\xe2\xd7\xf4\xbf\xf7\x04\xb7\xe6\xb5\x91\xe8\x2a\xd5\x96\x49\x67\x51\xbc\xba\x9b\x15\xf5\xb9\x3c\x3b\xca\xf5\x73\xfa\x96\x26\x40\xe6\x19\xa0\xe1\x4a\x54\x53\x0c\x8c\x97\x1b\x72\x28\x07\x56\xf9\x23\x5f\x75\x57\x2c\x28\x56\x0b\xc9\xf1\x33\x1f\xcb\x56\x2b\x8d\xe2\xda\x7a\xfc\x09\x00\xc4\x07\x8e\xc9\xaf\xd3\x9b\xfb\xae\x8e\xb1\xf2\xb6\xc6\x16\x2e\x9b\x2a\x4d\xfa\xbb\x0e\xd0\x3e\xae\x17\xed\xa8\x14\x89\xff\xb8\x3f\x4a\xbf\x54\x0b\x20\xd9\xf0\x32\x49\xd4\x34\x17\xfa\x85\xef\xbb\x5c\x85\xd0\xef\x3d\xa5\x5e\xbb\x2f\x36\x3f\x28\xe9\xb0\x7b\x55\xc3\xed\x33\x8f\x82\x3a\x5f\x9a\x1f\x74\x06\x48\x02\x1c\x34\x8b\xfe\x07\xbe\x06\x3c\x1b\xe1\x66\x61\x2f\xbe\x64\xd1\x69\xff\x35\x6e\x5a\xab\xb4\x69\x4e\x86\x4f\xdc\xcc\x94\xfd\x9d\x3d\x8d\x33\x40\xf2\x28\xe0\x73\x39\xa9\xbe\xba\xea\x63\x8f\xaa\x26\xaf\xbf\x62\xa9\xb0\xc1\x85\x7b\xcd\xc9\xf1\xfd\xea\x4c\x9e\xbf\xdc\xdd\xff\xf2\xc7\x6e\xce\x48\x80\x94\xc3\xcb\x74\xc6\x9a\x81\xc3\xf3\x51\xdc\xd2\x85\x63\x7a\x75\x15\x66\x19\x5d\x31\x32\x59\x01\x19\xd7\x9f\x5b\x24\x5b\x8e\x87\xaf\xc4\xc9\xb6\xc3\xc1\x6e\x2c\x3f\xd9\xad\x50\x20\xac\x6d\x78\xc7\x3a\xc4\xcb\xfe\x0f\x6e\x56\x4e\xe6\xd7\xb7\x5b\x54\xfb\xdc\xd4\xcf\x5d\xe1\x6d\x85\x13\xd2\xf5\x2b\x5a\xa1\x88\x30\xae\xf8\x1b\x1f\xa8\xbc\xfa\xe7\xe9\xe4\xc2\x49\x61\xeb\x5e\xe4\xe0\x7e\x9b\xfb\xc6\x26\x67\x2e\x5a\xcc\x41\x43\x27\xe8\xef\xd0\xe6\x8f\x67\x08\x6e\x9d\x10\xa4\x12\x71\xb7\xd2\x67\x76\x77\xf8\x56\xd4\xf9\x97\x77\x73\x2d\xc0\xf3\x49\x4b\xf2\x3e\x67\x80\x94\xfe\xbf\xc5\xa4\x1c\x60\xc9\x3b\x60\x44\x3a\xd4\xe9\xf7\x39\x7e\x2f\x29\x77\x39\xdf\x0e\x06\xbe\xbb\xbb\x5b\xd9\x72\xa9\x6f\xe8\xaa\x66\xb4\x02\xa4\x93\x05\x1a\xce\xf8\x46\xdb\xdd\xf1\xc8\x5b\x4f\x21\x26\xf5\x37\x5f\xd2\xbf\x44\x6f\x92\xbc\xf0\xea\x5e\x8a\x7c\x7b\x2a\xcc\xf6\xb3\x54\xed\x0d\x72\x80\xf4\xc3\xa1\x65\x3f\xee\x7b\x21\x26\xd0\x63\x6a\xf7\xa4\x98\x55\x08\xff\xd3\x9c\xfd\xb1\x9e\x3f\x58\x83\x9c\x76\x7d\x70\x3b\xad\xf4\x30\xdb\x84\x0e\x00\xa4\x0a\x4e\x00\x7a\x1f\xbb\xef\xf7\x87\xb9\x8d\xb1\x94\x59\x77\xb8\xf2\xee\x39\x39\xc9\xc0\x1f\xb2\x75\x48\xdc\x8d\x93\xdc\x98\xe7\x06\x77\xf6\x00\x40\x96\x61\x6f\x0f\x5c\xe3\x9c\xd0\x50\x70\x7b\x67\x39\xbc\x19\xe4\x73\x54\xec\x9c\x06\x6d\xe0\x8c\x2d\xe9\xb7\x3b\xdd\x11\x67\x72\x98\x52\xd6\x5d\x70\x00\x09\xa5\x85\x57\x87\xea\x79\x26\x47\xe8\xab\x93\xe7\xcc\x12\xaf\x06\x05\x7d\xa4\xef\x56\x31\xba\x8d\x0b\x7e\x73\xac\x99\xf1\x67\x78\xfb\x05\x27\xb8\x62\xb7\xb9\x93\xfb\x5e\x22\xb9\x6b\xcb\xf9\x47\xf2\x4f\xea\x80\xea\x73\x9d\x23\xbe\x22\xed\x89\x33\x9e\xd1\x5c\xab\x55\x5c\x9c\xb7\xdc\x9c\x01\xe2\x4b\x05\x8d\xe7\xac\x88\xd0\x32\x38\xb0\x96\xf2\x59\xc2\x81\xfc\x6f\x07\xcf\xbc\x7d\x2d\xb5\x03\x8f\xfe\xe8\xb0\x52\xf1\xf1\x99\xe1\xaa\xf9\x8b\x00\xe9\x84\x39\x59\xcf\x9a\x0b\xf3\xf5\x56\x0f\xb5\xc5\x2d\x53\x1d\x24\xf3\xf8\x17\x59\x03\x63\xae\x3b\xa6\xbf\x42\x59\x86\x02\x7d\xfa\xd5\x6d\xce\x01\xa4\x0b\xf6\x4b\x12\x6f\x1c\xe7\xd8\xcf\xf1\xfe\xa7\x99\xec\xe9\x35\x73\x72\x0e\x11\x77\x3a\x3a\x4a\x48\xdd\xdd\xea\x63\x5f\xa8\xb9\x3e\x9c\xec\x71\x06\x48\x1d\x4c\xa5\x1d\x14\x2e\x38\xb2\xe5\xc4\x1f\x5d\xfc\xba\x6b\xce\xfb\x83\x9a\xaf\xdb\xc4\xb8\xea\x95\x89\xc3\xc3\x33\xa2\xb3\xb7\x3b\x7f\x92\x0d\x00\x64\x0e\x4e\xd3\x3b\xd8\x37\xbc\x7f\x7c\x9d\xb9\x67\x67\x50\x90\xf6\xb8\xeb\xe1\xab\x58\x03\x9d\xab\x59\xba\x0f\x90\xc3\x22\x0a\xc7\x4e\x53\x64\x86\x00\x64\x0b\x1e\x5e\x70\xa4\x42\x4d\x3b\x5c\x96\x23\x47\x63\xe4\x17\xd3\xd9\x91\x43\xa3\xc7\x6f\x9f\x38\x28\x16\x17\x6b\x3f\x7b\xdf\xc4\xaa\xef\x46\xa9\x33\x40\x3e\xc1\x51\xf0\x67\xbf\x14\xb5\xc7\x00\x13\xc9\xa7\xdf\x7d\xf1\x53\xe1\x76\x01\xb1\x26\xe2\xe5\xe4\x3b\x27\x4e\x9a\x34\xe5\xbb\x73\x38\x8f\x55\x02\x24\x11\x2e\x62\x89\xf3\xc2\x69\x15\x55\xab\xb6\xbd\x7c\xe9\xc7\x2f\x1f\x6c\xda\xf9\x22\xb1\x9c\xcb\x29\xa6\xfa\xb1\x8b\x82\x85\x0c\xcf\x29\x91\x78\x80\x64\xd2\x43\xc3\x4f\xbb\x0a\x2c\xf0\x3c\xa0\xe3\x62\xa3\x2f\xd3\xe6\x9e\xde\x32\xbc\x91\x53\x2b\xda\xf0\x25\xe0\x58\x8e\x36\xbb\x64\xb4\xa2\x57\x1b\x34\xb4\xfd\xa6\xd4\xb2\x8f\xb2\xac\xcc\xcb\x92\x25\x99\x45\xca\x02\x39\xbf\x85\x17\x0f\x2f\x71\x9d\x3d\xd5\xbd\x14\xcb\xc9\x1a\xdb\xd2\x83\x03\xc8\x67\x38\x15\xc5\x71\xad\x56\xa4\xcf\x57\x50\xc5\x7c\x98\x0c\x35\xb0\xa3\xab\x1d\x8e\xaa\xf8\xb3\xfa\xd7\x37\xf4\xed\x61\x7b\x76\xbf\x33\xa4\x1b\xd0\xd0\xfa\xdc\xb4\x63\xbe\xd9\x67\x0f\x74\x56\x1f\x20\xf5\xfb\x3e\x26\x29\x5d\x50\xa9\x94\x31\x67\x99\x6a\xcd\x9d\xf2\x7d\x86\xe4\xec\x80\x33\x40\x3e\xc2\xfb\x6e\xce\xe2\xad\xcc\x59\x8a\xe3\x37\x1d\x0d\xee\x3d\x28\xf9\xba\x57\xe1\xc3\x78\x33\x05\x9f\x45\x69\xf1\xc1\x36\xd9\x9f\x1a\xcf\xed\xbe\x01\x24\x95\x0d\x1a\x6e\x52\x39\xbf\x74\x74\xc8\xc6\xae\x5a\xc8\x39\xdb\x45\xfa\x08\xf2\xc1\x46\x9c\x41\x84\x9d\xed\x99\x72\x0b\xe3\x35\xd6\x5f\xe1\x1d\x00\xa9\x84\x5d\xa8\x5d\xe3\x21\x5d\x71\x91\xf1\x98\xad\xcf\x67\xd3\xc6\x32\x05\xa6\xea\x0b\x37\xc2\x04\x93\xdf\x1e\xfb\xc1\xa9\x56\x55\xfb\xc9\xac\xd2\x19\x20\xce\xf0\xe3\xd9\x92\xef\x1c\x3e\xe7\xc8\xaa\x9b\x10\x5a\xc8\x15\x74\xfb\xdc\x80\xaa\xef\xde\x5b\x0c\xf7\x74\x9e\xa8\x34\xab\x35\xd4\x17\xa9\xe8\x01\xc4\x1b\xee\x53\x9c\x85\x37\x59\x3e\x8c\x99\xe5\x7f\xc7\x9d\xc8\xfc\x31\xd3\x79\x2a\x37\x99\x9c\xa9\x2c\x7e\x2e\x81\x8f\x51\xe3\xcb\xd6\xb5\xdc\x42\x80\x0c\xc2\xdb\x2e\xd1\xa4\xe6\xe8\x72\xbe\x7a\xed\x7e\x19\x59\xc6\xca\xbf\xd9\x55\x21\x62\x12\x5b\xc7\x07\x37\xce\x52\x31\xa4\xbe\x78\x12\x60\xbc\x0c\x00\x52\x0e\x17\xea\x93\x6d\x17\x53\x3d\x6e\x07\xde\x5b\x8c\x38\xca\xbb\xc4\x17\x9e\x9d\x7e\xeb\xcf\xa7\xa6\x47\x0a\x93\xec\x3a\xa2\x1f\x63\xdc\x2c\x5a\x00\xd2\x01\xa7\x68\x8a\x99\x31\xd2\x22\x1a\xf2\x32\x9e\x21\x15\xea\x28\x16\x1a\x9a\xe7\x5f\x7b\xfc\xdc\x36\x6b\x33\xab\x3a\x96\xa8\x44\x39\xe9\x9e\x39\x03\x24\x0c\x0e\x47\x15\x83\x26\x4f\x9e\x47\x41\x2f\x72\x3c\x98\x48\x96\xed\xc1\x86\x88\xe8\x9b\xa8\x46\x26\x56\xbb\xbf\x66\xe7\x9e\x5b\x7e\x0e\x13\x01\x48\x22\xbc\x97\x34\x26\x3f\x6f\x28\x33\x54\x55\x57\x08\x3d\x0f\xed\xd9\x9d\x75\x59\x55\xc1\xbb\xb2\xa3\xe2\xc8\xa1\xca\x17\x35\x4f\xdd\x98\x45\x63\x01\xd2\x06\xe7\xa4\x07\x77\xcf\x37\xcd\xc9\xee\x8d\x6f\x1c\x90\x55\x62\xd5\x5b\x2f\x6a\xca\x4a\x31\xac\x3e\xc3\x9c\x1a\x3e\x4c\x66\x53\x4d\x97\xfe\x26\x9c\xec\x1f\x99\xa0\xb2\x1e\x89\x9b\xd3\x4b\x1c\x40\xbc\xe1\xbc\xc4\x54\x11\x97\x43\x26\xb6\x68\xd2\x88\xab\x53\x3a\x98\x20\xdb\xbc\x36\x32\x2a\xd2\xac\x55\x49\xa3\x48\x45\x47\xe6\x28\x7e\x85\x12\x07\x90\x75\xd8\x97\xc6\xaf\x96\xea\xed\xf6\xcc\x1d\xda\xb8\x7c\xfe\x3b\xa7\x12\xa9\x6a\xe7\x9d\x92\xe8\xb9\xdb\x97\x25\x32\xf6\xe8\x36\xeb\x46\x44\x9f\xc4\x01\xa4\x1d\x8e\xcb\x95\x8a\x7a\x39\x3d\x43\x1d\x5d\x13\xb1\x62\x7a\xd2\x33\x7a\xfb\xb5\x3b\x79\x9b\x3b\x02\xad\x8e\x37\x75\xe7\xa5\x77\x9c\x5c\xe2\xc2\x01\x64\x04\xce\x05\x49\xe4\xb5\x55\x4e\x82\x17\xaf\xeb\x76\xf4\xb6\xf3\x1b\x79\x58\x38\x70\x55\x3e\xab\xf5\x08\xd1\xac\x69\x8c\x96\x0d\x10\xae\xf1\xc6\x01\x24\x10\xce\x64\xb6\xbf\xe2\xa6\x1a\x43\xce\x18\x92\xc5\x9c\xb0\xb2\x76\x6b\x50\x94\xed\x0a\x69\x31\xcf\xec\xd5\xf6\x8d\xca\x0e\xdd\x90\x2c\x0c\x96\xf8\xb7\x69\x02\x45\x52\xdc\x7f\xae\x59\x92\xf8\xb7\x79\x12\x00\xeb\x74\x44\x00\xd6\x44\x09\x80\x76\x52\x22\x00\x6b\xa6\x04\xc0\xc8\x0e\x22\x00\x6b\xaa\x04\x40\x20\x23\x11\x80\x49\xf6\xf1\x80\xcf\x28\x00\x8b\xee\x13\x00\x39\x64\x44\x00\x16\xdf\x27\x00\x12\x77\x11\x01\x58\x84\x9f\x00\x78\x8f\xba\x15\x93\xf1\xe3\x01\x3e\xa8\x97\x30\x39\x3f\x1e\xe0\x8b\x4e\x1a\x93\xf5\xe3\x01\x7d\xac\x4b\x87\xff\x91\xf7\xff\x07\x50\x44\xa7\x80\x45\xfc\x89\x53\xa0\x24\x02\x30\x99\x3f\x1e\xe0\xc9\x4c\x04\x60\x72\x7f\x3c\xe0\x1d\x1a\x7b\x58\xec\x9f\x00\xd8\xa4\x59\x0a\x23\xfb\xb7\x26\x00\x28\xf1\x39\xf9\x6d\x67\x97\x55\x38\x53\x27\x8b\x45\x59\x38\x1d\x11\x32\x38\xa9\xa1\xd6\x63\x2f\xb7\x27\xca\xae\xd2\x90\x65\xd4\x68\xff\x81\xf9\xf3\x95\x85\x7f\x87\x90\x0f\x38\x80\xb8\xc1\xac\xc7\xe1\x5e\x16\xe3\x41\xbf\x5d\x93\xab\x65\xbf\x19\x63\x7d\xd5\x2b\x42\x4c\xed\x15\xd3\xa5\x4e\xfd\x6a\xa6\xd9\x8c\xd0\x57\xfd\xbe\x9d\x2d\x3e\xc2\xf4\x51\xfc\xea\x22\x30\xe1\xa3\x32\x48\xc0\xcd\xd1\xfc\xde\xf9\xb3\x56\x78\x23\x8d\x2b\xef\x46\x10\x95\xd5\x53\x12\xd6\xea\xe9\x44\x47\x1c\x50\x7c\x06\x0d\x57\x43\x36\xdd\x2e\x25\xf0\xa4\x66\x71\xf4\xb2\xe4\xae\x68\xe9\xdf\xdd\xef\xa3\x97\x3f\x7b\x20\x8e\x41\x2e\x2c\x96\x4d\x33\xfa\x04\x0e\x20\x35\x30\x15\x08\x6b\x7c\x23\xfb\xcd\x5f\xec\xce\x35\x4b\xb3\x07\xf2\xf5\x2f\x78\x90\xa2\x43\x81\x4f\xef\x75\xec\x90\x6a\x8c\xe4\x6e\x3e\x90\x35\x28\xf1\x6f\xb3\x24\x78\x73\x95\x96\xe8\x7e\xac\x69\x12\x00\x6e\x54\x44\x00\xd6\x3c\x09\x80\x8f\x2c\xc4\x18\xc5\x9a\x29\x21\x46\x9f\x11\x5f\x80\x35\x53\xc2\x0b\x6a\xe8\x89\x00\xcc\x26\x0f\x0f\x18\x42\x63\x14\xb3\xcb\xc3\x03\x1a\xd1\x18\xc5\xec\xf3\xf0\x80\x79\x06\x22\x00\xb3\xd1\x23\xec\x33\x34\x19\x61\xb5\x7a\x04\x40\x36\xba\x31\x31\x7b\x3d\x3c\x20\x81\x95\x08\xc0\xec\xf6\xf0\x80\x3c\x0a\x22\x00\xab\xdf\x23\x00\xca\x69\x96\x88\x75\x1f\xab\xed\x03\xca\xa4\x24\x64\x6c\xdb\x3b\xd3\x03\x6e\x18\xf4\x8a\x5d\x16\x0e\xba\xff\x61\xac\xfb\xb2\xec\x2d\x6a\x72\x21\xa9\x7b\xc7\xd8\xc2\xe8\x77\xf6\xdf\x1d\x87\x12\xba\xbf\x9e\x3c\xe3\xbc\xbd\x14\xf0\xf8\xe8\x9d\xed\x74\xb2\x27\x5f\xdf\x90\x6c\x75\xee\xd2\x19\x90\xeb\xeb\xd5\xea\x6f\xf7\x1c\x94\x0f\xf4\xbd\xd2\x49\xbd\xe4\xb9\x74\x1a\x07\x90\x5a\xb8\x8e\xa7\x0d\xdc\xe4\x34\xf9\xad\x52\xa2\x7a\xf8\xc5\x7d\x91\x43\x2a\xd4\xa1\xc7\x5e\xb7\x7d\x72\xe8\x28\xd0\x95\xb6\x2a\x98\x7c\xdb\xd3\x86\x03\xc8\x30\xcc\x43\x64\x1d\x77\x4f\x83\xc0\xcc\x08\xbe\x99\x50\x47\xd3\xfd\x1e\x5c\x9f\x6b\x1a\xed\x2e\x4e\xfe\xe1\x6f\xbb\x2e\xb0\x26\xdf\x21\x6d\x8a\x03\xc8\x12\x4c\xa5\x4d\x9e\xc9\xd4\x0a\xec\xba\x99\x72\xc2\x3c\x22\x68\xe4\x18\xd3\xa9\x72\x45\xb3\xbb\xad\xac\x66\xc9\xeb\xfe\x53\x12\x6d\xab\x32\x0f\x24\xfe\x6d\x9a\x04\x7f\x7a\xec\x26\x2e\x00\xd6\x3c\x89\x61\x8a\x02\xb0\x26\x4a\x00\xd4\xa2\x05\x0a\x6b\xa6\x04\xc0\x30\x4a\x45\xb0\xa6\x4a\x00\x2c\xed\x5a\xaa\x27\xfb\xb7\xfe\x1e\x28\x53\x08\x93\xf2\x6d\xc7\xc4\x3b\x98\xb5\xf3\x1c\x8f\xf0\xbc\x43\xc9\x18\x12\xec\xca\x75\x8b\xd1\x78\x28\x49\xe1\x46\x72\xb0\x81\xe4\x7b\x2f\x9f\xa9\x92\x92\x7b\x74\x9c\xda\x38\x80\x04\xc3\xd4\x34\x7b\xec\x41\x84\x1f\xc7\x83\xc5\xb3\x73\x93\xf9\x01\x9a\xb2\x0d\x53\x2c\x9c\x93\x54\xe4\x32\xf1\xcf\x68\x9f\xdf\x8d\x6f\xcf\x4a\xc0\x01\x24\x12\x26\xd6\xa7\x96\x9f\xaa\x58\x9e\xb4\x3d\x41\xb6\xc7\xe2\xe9\xed\xd1\x94\x1a\xa7\xc7\xfa\x1b\x7e\x00\x48\x8c\xa4\xee\xe4\x10\x9a\x5a\x5f\x02\x00\x89\x81\xab\x47\xb3\xff\xbc\x3f\x47\x99\x57\xd4\x44\x42\xf8\xd5\x45\x17\xaa\x17\xa3\x11\x7b\xb6\x46\x0d\x71\x5c\x34\x59\x4f\xb7\xca\x7d\x13\x9c\x00\x52\x0e\x2b\x31\x2f\xbb\x99\xe9\x78\x3e\x0a\x1b\x97\xc9\x51\x73\x77\xb9\x59\x9f\xcf\x55\x7f\x30\x52\x0f\xa8\x6d\xb4\xc5\x49\xf8\x28\xcc\x56\x97\x70\x00\x59\x83\x89\xf8\x41\x2b\xbd\xd3\xef\x78\xbb\x9e\x5d\x9c\xcd\xbe\xed\xfd\x9e\x61\x2c\x44\x4f\x5c\xe7\x4b\xa6\xf3\x31\x16\x6e\xf3\x38\x3b\xe6\x9d\x2b\x12\xff\xe6\x15\x62\x71\x65\x23\xae\x17\x96\x5b\x08\x80\x60\x1a\x22\x00\xd3\x2f\x78\x40\x24\x9a\x25\x30\x1d\x83\x07\xc4\xa0\x05\x07\xcb\x35\xc4\xb4\x82\x26\x2e\x2c\xdf\x10\x00\x6b\x3b\x97\xde\x91\xfd\x9b\x50\x04\x94\xd3\x48\x48\x28\xb6\x63\xae\xe0\xff\x29\xc0\xa3\x33\x9c\xbf\x68\xdf\xcc\xda\xa7\x4a\x6e\xda\x5f\xd5\x53\xa9\x7e\xfe\xb6\xa8\xbe\xc5\x70\xf2\x9e\xd2\x0e\xea\x1e\x63\x12\xdd\xed\xfc\x0b\xab\x7f\x37\xfe\x5e\x7b\xcd\x79\xe7\x40\x4c\x5f\xea\x44\x61\x76\xbc\x70\xc5\xab\xaa\x33\x8b\x2c\x38\x9b\xb9\xfb\x32\x82\x14\x49\x8c\xcb\xfb\xb7\xf7\x26\x13\x2c\xfe\xaf\xbd\xdb\x7f\xf6\x77\xb5\x77\x93\xe2\x6f\x50\x1c\x75\x32\xad\x7f\x3d\x53\xef\xdb\x46\xe8\x10\xb7\xbb\x9d\xf6\x1b\x51\xf9\x31\x1c\x50\xb4\x85\xdb\x68\x59\x06\xcf\xa1\x85\x2b\xa3\xcc\x19\x97\x9b\xd6\x75\xd5\x8e\x54\x54\x44\x0e\x79\x8a\xf7\x6a\x7d\x26\x3b\xbe\x5f\xbe\xaf\x64\xf7\x76\x8f\x00\xc7\x10\xd5\x45\x27\xd9\xb4\x05\x1f\x9b\x9f\xa4\x51\x47\x96\x3b\xe6\xb5\x7e\x71\xf9\xb6\x34\x57\x5c\xf0\x7d\x7e\xe6\x2d\xe5\xc5\xfe\xd6\x93\x12\xff\x36\x4b\x82\x3b\x0b\x50\xce\x88\x35\x4d\x62\x69\x42\x8b\x1f\xd6\x3c\x89\x79\x8b\x89\xc8\x10\xb0\x66\x4a\x60\x08\xb6\xc4\x17\x60\xcd\x94\xd8\x41\xed\x44\x0b\x3e\x96\x12\x88\x07\x94\xa2\x05\x1f\x53\x0b\xc4\x03\x3a\x59\x88\x00\x4c\x35\x10\x0f\xe8\x47\x39\x08\xa6\x1c\x88\x07\x54\xa1\xbd\x01\x96\x20\x48\x00\x2c\xa3\x5b\x19\x4b\x11\x24\x00\x42\x69\x97\xa6\x48\xff\x4d\x18\x04\xca\x08\x13\x09\xc9\x76\x3d\xfe\x08\xc7\x75\xd6\xb5\xe3\xd5\x8d\x2f\x5e\x3f\x10\x33\xa6\x3a\x96\xcc\xaa\xfc\x4b\xce\xec\xfb\x0f\x26\xeb\x3e\x96\xd4\x90\xa7\x21\x7a\x9f\x13\x4f\xe1\x00\x92\x01\x07\x2a\xfb\xda\x9c\x8b\x3b\x49\xc3\x8d\x62\x89\xde\x93\x9b\xfb\xae\x8c\xef\xbf\x1d\x53\x78\xa9\xc2\x3b\xab\x37\x3f\x4d\x54\x3a\x6b\xee\x32\x00\x88\x13\x9c\xab\x4f\x86\x98\xe2\x38\x24\x1f\x70\x85\x48\x4f\xcd\x2e\x17\x88\xc9\x3a\x72\x7c\xdd\x73\x7d\x8a\x97\x23\xd3\x28\x51\xae\xd7\xb5\x50\x1a\x20\x3d\xb0\x6a\xbe\x75\xaf\xdb\xda\x8e\x2d\x35\x39\x55\x5e\x6c\x98\x99\x4f\x89\xbd\x8b\x9e\x35\x83\xef\xf8\xfd\xaf\x33\x63\x0a\x5d\xaa\x2a\x95\xde\x12\xff\x66\x35\x91\xc7\x32\x11\xfd\x89\x69\x36\x1e\x90\x81\x46\x1d\xa6\xdd\x78\x80\x13\x9a\x4b\xb1\x2c\x27\x00\x7a\x50\x12\x88\xa9\xcc\x12\x1a\x4c\x94\xbc\x63\x6a\xb3\x84\xb8\x46\x29\x05\x96\x3a\x4b\x00\x74\xa1\x61\x8a\x29\xcf\xe2\x01\x75\xa8\x97\x30\x05\x5a\x3c\x60\x0e\x25\x2d\x58\x12\x2d\x01\xb0\x85\x02\x30\x35\x5a\x3c\xe0\x13\xba\x37\x31\x55\x5a\x82\x94\x80\x6a\x0f\x58\x3a\x2d\x01\x90\x49\xbf\xf4\x9b\xf4\xdf\xe4\x5a\xa0\x8c\xa3\xf8\xef\x2f\xa6\x90\x7e\xb8\x29\xdd\xd1\x6c\x75\x37\xc6\x48\xa3\xb9\x71\x8f\xee\x04\xaf\xd7\xf1\x5b\xa6\xaf\x29\x76\xc8\x1a\x54\xb8\x18\xca\xd6\x7b\x7e\xbc\x73\xc5\x12\x07\x90\x20\xb8\x29\x95\x17\x5a\xa4\x69\x94\xe7\x13\x77\xbc\x09\x36\xc9\xb3\x65\xaf\xd7\x95\xdd\x3c\x1f\xab\x33\x8d\x13\xfe\x75\xba\x2d\xab\x38\xa8\x6f\xfb\xf9\x70\x49\xf3\xf9\xe3\xfc\x4a\xe9\x45\x1a\xc9\x96\xda\x81\x3d\x0c\xd2\xd7\x8e\x66\xdc\x01\xbd\xec\x0e\xd1\x06\x53\x57\xaa\x1e\xef\x4e\x21\xaf\xdd\x2e\x0c\x30\x55\x4e\xbf\xf6\x2b\x33\x31\x47\xf9\x4d\xd7\xaf\x82\x7d\x4f\x37\x2e\x48\x8a\x92\x7e\xb7\x70\x76\x7c\xdc\x56\x50\x3e\x3e\xd6\xce\x1e\x17\x20\xf1\x6f\x66\x13\xb3\x23\x1a\xa7\x58\x76\x13\x00\x41\x68\xfe\xc5\x32\x9c\xf8\x06\xb4\x48\x61\x59\x4e\x2c\x83\x28\xf5\xc5\x12\xcc\x89\x0a\xd6\x2e\x34\x9d\x62\xe9\xe6\x40\x89\xcc\x85\x69\x7b\x89\x27\xe1\x6e\xa5\xd5\xd1\xa4\xaf\xcb\xe7\x15\xeb\x5f\x4e\x16\x31\xdf\xfc\x54\xfa\x6a\xea\x7c\x92\xa1\x1a\xa1\x9e\x8f\x1b\x56\x1c\x3b\x6a\x7e\x4a\xe1\x00\xd2\x06\x67\xdf\x36\xed\x36\xed\xe7\x5b\x52\x57\xa8\x8a\xbe\xb6\xcc\x66\xf6\x9b\x3a\x36\x3f\xbc\x63\x69\xd7\xbf\xe3\x77\xe1\x19\x56\x99\x07\x1f\xa8\x70\x00\x89\x87\x25\xe2\x61\x5d\x52\x2a\xb1\xe0\x66\xab\xf8\x0b\xe2\x3f\xaf\x4e\x96\x0e\x8c\x7a\x7f\x77\x89\x2d\x2e\xb4\x2f\x2c\x08\x4a\x53\x6a\xa2\xbf\x8a\x03\xc8\x02\x1c\x42\x45\x85\x4d\x54\xd5\x64\x2f\x6c\x8c\x4b\xcb\x7f\x69\x14\xa8\x7a\x9c\xfc\xee\xb4\x7e\x69\xba\xbc\xeb\x53\x75\xc9\x8e\xb4\xdf\x40\x40\xe2\xdf\xcc\x26\xb8\x67\x12\xdd\x95\x58\x76\x13\x00\x6d\x68\xfe\xc5\x32\x9c\x00\x88\x47\xb7\x31\x96\xe5\x04\xc0\x02\x1a\x44\x98\x07\x17\x84\x92\x80\xd2\x04\xcc\xa3\x0b\x3c\x20\x15\xe5\xe3\x58\x87\x17\x04\x40\x25\x9a\x59\x30\x4f\x2f\xf0\x00\x67\xf4\x0d\x98\xe7\x17\x04\x6e\x44\x8e\x26\x3b\xac\x13\x0c\x3c\x60\x10\x25\xf0\x98\x47\x18\x04\x02\x8f\x12\x48\xac\x43\x0c\x02\xa0\x03\xad\x83\x98\xa7\x18\x78\x40\x18\xba\xd2\x98\xe7\x18\x84\x84\x8d\x16\x1d\xac\x93\x0c\x62\xf0\xd1\x2c\x05\x10\x3e\x1b\x8e\x75\x85\x10\x28\x3b\x6e\x6d\x6e\x06\xf3\xe0\x80\x22\x7c\x9c\x94\xfb\x5d\x95\x79\xe9\x09\xd3\xf0\x89\x7a\x52\x92\xd5\x97\xa5\xd6\xa6\x6a\x4f\xbb\xcd\x82\x14\xf8\x27\x57\x05\xca\x29\xc2\xd2\xe2\x01\x40\xf2\xe0\xd3\x2d\x9f\xa2\xbf\x46\x6c\x1f\xe5\x36\x77\x2a\xb3\x30\x34\x5f\xbf\xd1\x10\xb1\x97\x5f\x54\x62\x86\xfd\xfc\xab\xdc\x8f\x35\x67\x7f\xaa\xf0\x00\x24\x1f\x96\x1e\xc8\x9b\xbf\xdc\x62\xd3\xe7\xbb\x99\xa2\x42\xf6\x85\x7d\x68\xed\x35\x1d\xa3\xba\x5e\xcd\x8e\xc4\x04\x3b\xb7\x37\x87\xf8\xbe\xa9\x3e\x01\x40\x51\x1d\x3e\xc0\xf9\xf0\x1d\xb8\x6e\x99\x04\xfa\x2f\x7d\x77\xcc\x4e\x7f\x1b\x78\xac\xd0\x67\x7a\xe6\x0c\xa0\xb9\xe3\x1e\x58\x4f\x29\xe2\x6a\x0c\x90\x3f\x70\x6a\xc9\x8c\x8d\xec\xb9\x9e\x4a\x12\xfe\xc8\x6e\x5c\xa8\xf0\xb2\xbe\x5b\xbf\x9c\xd5\xdd\xcf\x96\x25\x77\x6e\x0d\xd9\x90\x7d\x1f\x5e\x1c\x81\x86\x6e\xae\xcc\x73\xe4\x3d\x7f\x67\xe3\x23\x6d\x47\x46\x9d\x5c\x70\xe9\xa9\x92\xed\x83\xd6\xda\x23\x91\x8a\xd4\x87\xed\x26\xd4\x77\x53\xe2\x00\x32\x00\x1b\xae\xd8\x1f\x4d\x7f\x76\xe0\x84\xc9\x94\xed\xde\xa3\xc3\x3c\x66\x86\x8f\x91\xd2\x80\xfb\x0f\xc6\x79\xbd\x74\xea\x65\xe5\x67\x0f\x1d\x84\x6f\x37\x6d\x48\x7f\xac\x1c\x0d\x3e\xf2\xf1\x60\xc6\xe4\xcf\xd0\xd8\xe7\x4a\x09\x7d\x87\x0e\xd0\xb7\x9e\xce\xdf\xd7\xf0\xe0\xd3\x22\xf7\x17\x1c\x50\x14\x84\x4f\x64\x83\xcc\xde\x9b\x44\xd5\xbd\x68\x6a\x28\x4e\xbc\x5f\x54\x76\xcf\x3b\xad\xc7\x40\x38\x35\x85\xad\xd5\x6d\x86\xf6\xef\xe1\x11\x16\x67\x80\xa4\xc1\x74\xf1\x4e\xb6\x4e\x8e\x60\x06\xd9\xb7\xbc\x97\x9c\xd2\x9f\x9e\x92\x7e\xe3\xb0\x39\x93\x14\xfc\x09\xc8\xfb\x57\xe9\xf9\xcd\x85\x7d\x32\x05\xc8\x77\xb8\x49\xbc\x9f\xb5\x77\x88\xca\xc6\x73\xc0\xf7\xd8\xc5\x93\x6f\x7c\x0d\xce\x52\xe9\x9e\x7d\xc9\x61\xed\x65\x68\xe5\x13\xb3\x57\x7b\x2a\x3d\x1a\x20\x7f\xe0\xf5\x4f\x2c\x9a\x90\x37\x7a\x26\x9c\x42\x4d\x79\xd7\xf0\x8d\xc3\x13\x69\xc1\xde\xaf\x1e\xec\x6f\x1f\x69\x1a\x35\xbb\x6b\x9d\x9c\xad\xdc\xe9\x0c\x90\x48\x58\x67\x50\x9d\x18\xf5\x39\xb6\x61\xc8\xaa\xd9\x77\xef\xe4\x91\xfc\xab\xfe\x01\xc7\x2c\x0f\x0e\x87\x8c\x5f\x0e\xd0\x96\x94\x73\xe7\x3e\x44\x05\x90\x5f\xb0\x35\x62\x9d\x0a\xde\x27\x13\xa3\x97\x62\x2e\x17\xde\xa7\xad\x11\x3b\xd4\xee\xef\x56\x5f\x34\x48\x4e\xd7\x73\x59\xfd\xee\xc8\xc7\x1a\x3f\x80\xcc\xc3\xca\x59\xe9\x1d\xc3\xd1\x9d\x6e\x83\x31\x92\xe6\x6a\x2f\xd9\xbc\x74\x43\x62\xb7\xba\xdd\xae\xd0\x39\x0d\x91\x3f\x70\x9c\x62\xb2\xda\xe8\x85\xbb\xc9\x63\xa1\xf4\x5d\xd5\x87\x7c\x35\x19\x37\x2e\x70\x1b\x1c\xcb\xe7\x32\x9a\x32\x49\x31\x75\xeb\x92\xe2\xe4\xd1\xaf\x6a\x58\xd8\x09\x00\xf2\x05\x2e\x2b\xc7\x86\xc9\x4b\x3a\x19\xae\x94\x8b\x5a\x73\x91\x58\xf2\x24\x3d\xf0\xed\x12\xa1\x0e\xc8\xfb\x7e\xe4\xb1\xaf\xca\xa6\xbc\xd2\xdf\xfb\x00\x59\x82\x7b\x80\x89\xa7\x51\x7e\xf5\xc6\xcd\x33\xc1\x96\xa4\x72\x6f\x6b\xce\x95\x25\x0d\x2e\x4e\xe1\xbc\x32\x2b\x2c\x5b\x9e\x96\x4e\xb1\x07\x4e\x03\x80\x44\xc0\x3d\xc0\x3b\x89\x2f\xc1\xf7\x55\x5f\xb7\x96\xee\xdf\x9c\xbf\x7b\xe1\xe3\xd9\x82\xc8\x77\xa2\xa3\xc5\xf7\x96\x05\x4f\xcb\x8f\x1a\x88\xfc\x70\x07\x48\x2d\x3c\x7c\x9f\x74\x65\x5d\x1d\xb5\x7f\x91\x75\xde\xfd\x28\xf3\xf0\x55\x32\xa1\x9a\x33\x36\xcc\xda\x43\x57\x23\x1a\x91\x54\x97\xf8\xb9\x6b\xce\x00\x89\x87\x79\xcc\xb2\x84\xa3\xeb\xc5\xd4\xb2\x82\xf7\x47\xe2\x48\x05\x5c\x4d\x75\x3a\x1b\x4c\x6f\x53\xf8\x3b\x8f\x52\x05\x98\x45\x72\x33\xb7\xdd\x02\x48\x3e\x2c\xef\x38\xd8\xf5\xdc\x11\xe8\xad\xff\xbc\x70\x71\x2c\x84\xeb\x46\xa5\x98\x8b\x48\xf3\x57\x96\xb9\x9e\x23\x15\x0f\x6f\x93\x5a\x1b\x2e\xa7\x03\xa4\x1a\x3e\x18\xfc\x2e\xd7\x31\x11\x5d\xfb\xad\x5b\x44\x88\xb4\x8f\x6e\x20\x6e\x77\x34\x83\xcf\x2f\xf7\x4a\xd1\x7a\x4a\x83\x30\xf7\xce\x40\x6b\x4e\x67\xa0\xf8\x10\x96\xfa\x99\x98\x05\xdb\xb4\x59\xea\x55\xf3\x66\xf2\x06\xe3\xb9\xdb\xef\x17\x2b\x0c\x0b\x7f\xd0\x4a\xe4\xe8\xa5\x0e\x61\x78\xd6\x44\x02\x90\x30\x78\x97\xc6\xb7\xf8\xd6\xee\x36\xb6\xd3\x3e\xd4\xca\xd4\xf2\xe1\x9a\xd3\xdf\x7b\x92\x4a\x3c\x93\x8f\x0d\x47\x54\x02\xdd\xb6\x64\xb3\x35\x03\x01\x92\x00\xc7\x80\x5c\x61\x18\xa5\x85\xf0\x40\x41\x49\x9c\x0c\xe9\x88\xfb\xf9\xb3\x21\x7b\x3a\xd8\x0a\xe3\x77\x9f\x6e\x2a\xa3\x19\xef\x97\x49\xb6\x02\x00\x71\x86\xf7\xc7\x6c\x88\x10\x6d\x48\x86\xea\xfc\xbd\x9c\x4b\x13\xe7\xc5\xde\x7c\x32\xef\x54\x24\x8d\x18\xc2\x19\x97\xb7\x39\x90\x34\x76\x1f\xe8\x02\x48\x10\xcc\x20\xef\xe7\x89\x5c\x70\xfb\x7b\xce\xfd\xd3\xee\x39\xe3\x2e\x99\x2b\xc9\x06\x65\x75\x82\x4a\x46\xea\x06\x0b\x4a\x29\x97\x90\xc1\xd8\x1f\xd0\x50\xa9\x00\xc7\x6f\xb6\xd4\x0a\xbf\xd2\x27\x16\x59\xdf\x98\xa5\x38\x9a\x8b\xbb\x8d\xee\x8b\xd7\xd3\x68\xe0\x2c\x3c\xd2\xfd\xb6\xf3\x00\x34\x94\x55\x4a\x2e\xcc\xa7\xf4\x80\xe1\xfc\xab\xdd\xb5\x6a\x95\x0d\x4d\xe7\x77\x94\x75\xe5\xd4\x5c\xcc\x6a\xbe\xf4\x32\x72\x91\xa6\xfc\x02\x34\xd4\xb7\xbf\x24\x62\x67\x75\x29\x63\x45\x51\xb6\xcb\xe2\x4d\xab\x93\x6a\x2b\x4f\x28\xb2\x7e\xbc\x15\x8a\x7c\xa1\xdc\xe9\xee\xe2\x96\x03\x00\x52\x05\x87\x8a\x86\x73\xd2\xb3\x2e\x05\xc3\xce\x42\xeb\x59\xc6\x87\x4a\x9f\xd6\xd7\x9f\x68\x1f\x59\x8a\xdd\x8c\x66\xe2\xcd\x6c\xa7\x7c\x53\x5b\x03\x90\x2a\xd8\x7d\x53\x75\x5a\x79\xdf\x2c\xc2\x82\x2e\xfe\x29\xd9\xf3\xa0\xbb\x98\xb6\xec\x84\x4a\xd2\x08\xc3\xa4\xa4\x91\x77\x3c\x47\xb5\xeb\xa1\x37\x00\x20\x09\x30\x7d\x3a\xf0\xdd\xd7\xdd\xc2\x19\x69\xbf\x4f\x9b\x48\x7b\x37\x3b\x8e\xaa\x49\xc4\x49\x9d\xfc\xea\xb5\xf4\x65\xfe\x5e\xfb\x9a\x5b\x2f\xaa\x00\x92\x0e\x07\x62\x83\x1c\xb3\x66\x64\x1b\x73\xee\xdb\xc9\xcf\x2c\x5d\x12\x60\x1f\xfd\xe3\xfd\x2e\x9a\x93\x47\x72\x9f\x27\xd4\x96\x31\x21\x7f\x60\x9f\x94\x69\xfc\x88\x7d\xfa\x4b\x54\xbf\xaa\x74\x34\x41\xd2\x0f\x5c\x09\xe2\xb8\xc5\xd9\x7c\xb0\xc9\xd3\x84\xd7\x35\xbe\xe3\xeb\xfb\x47\xce\x00\x09\x81\x77\x68\xb7\xda\xa5\x92\xc0\x69\x9e\x5c\xd2\xb1\x33\x0e\xed\x1c\xbf\x6b\xf7\x37\x0e\xec\x3a\x5b\xa6\xc9\xaf\x67\xb9\xa3\xe4\xb6\xfb\x55\x75\x80\xbc\x83\x15\xd5\x67\xc5\x0c\x92\x64\x4f\xb2\xc5\xd5\x02\xae\x34\xdb\x47\x3d\xcd\x72\xea\x0c\x67\xf8\x1b\x10\xba\x95\xd0\xc2\x2d\xfa\x5a\x9c\xfd\x23\x40\x8a\x61\xc3\xd3\x7e\xde\x10\x60\xe3\x72\x0d\xdb\x79\xda\x34\xe8\x97\xf3\x4e\xf2\x1d\xbe\x86\x9d\x3b\x73\xf9\x86\x07\x6c\xdc\x16\xbe\x7c\xe2\xa8\xda\x66\xeb\xb0\xdb\x19\xbf\xda\xc7\xda\xe6\x9e\x9e\xdb\x2f\xd5\x35\x92\xb2\x6e\x1e\xcd\x2e\x13\xc8\xea\x2b\x9b\x25\xa4\x44\x3a\xdc\x49\x5e\x7e\x27\xde\x19\x20\x2f\xe1\x3d\xd4\x31\x1b\x45\x76\xb7\xe8\xb0\x36\xe5\xa2\xb7\x7c\xf7\x52\x7f\xed\x3b\x7d\xe6\xa2\x6c\x0b\xa9\xb5\xb8\xbe\x38\xe7\x2e\x2a\xe1\x05\x80\xf8\xc2\x8f\xcf\xa7\xca\x93\x59\x7f\xcf\x3a\x7b\xfa\xb2\x4e\x9f\x68\xa4\x83\x57\xc5\x44\xa0\x93\x5d\x07\xd9\xc4\xe6\xb2\xd9\x85\xe0\xfa\xe3\x57\x01\xd2\x07\x9f\xae\x31\x77\x16\xe6\xb4\xa8\x9f\x77\x9b\xf0\x66\x4b\xa2\xef\x58\x6f\x70\xed\xa6\x49\x3d\x21\xff\xd4\x76\x91\x75\xcf\x5f\x2f\xbb\xe9\x52\xb8\xe5\x79\x7a\xfd\xfe\xad\x83\xe7\x56\x8c\xee\x4f\xee\xa7\x37\x13\x62\x3d\xa1\xc9\x75\x4e\xbb\x89\x69\x57\x73\xe2\x49\x69\xd2\x92\x8f\xea\x00\x20\x39\xf0\x86\x90\x78\xde\x3c\xd7\xc7\x1d\x3e\xfb\x7c\x9d\x26\x4b\x3f\xc0\xd3\xcf\xea\xb1\x6d\x84\x62\xe9\xa5\xd7\x5b\x66\xee\x8f\x5f\x68\x74\x17\x01\x64\x15\xde\x6e\xbe\x93\xaf\x54\x98\x7b\x7c\x7b\x9a\x12\xa2\x77\x96\x27\xae\xf8\xd7\x1b\xde\xee\x0c\x08\xe2\xb7\xee\x49\x3a\x65\xf1\xd0\xdd\x18\xae\x74\xd7\xe3\xb9\xb8\x22\x8a\xfb\xea\x26\x84\xae\xed\xab\x0c\xb4\x75\x7a\x66\x96\x6c\xc4\x9c\x7c\x54\x87\xc6\x42\x61\xf5\xc2\x29\x87\x0d\x1c\x40\xfa\x60\x9f\x4c\x50\x5d\x53\x8e\xe7\x9b\x9c\x91\xa3\x0d\xdf\xb3\x26\x2e\x4a\x75\x85\x92\x35\x31\xf4\xb2\x65\xdc\x08\xeb\x4e\x97\x15\x4d\xc3\x1c\x68\xe8\x93\xe3\xa6\x7f\xf7\xaa\x5e\x7d\xbe\x53\x3d\x6e\xb6\x2c\xf0\x7c\xb8\x81\x30\xcb\x00\x8d\x91\xb4\x84\xab\xf5\xd6\x71\xf0\x0b\x41\x0e\xff\x23\xbb\x51\x24\xc3\x6d\x13\x22\xb4\x4b\xc3\x62\x37\xff\x8d\x47\xf2\x50\xfa\x8b\xc9\x6f\xf0\x80\xfc\x5d\x44\x29\x11\x93\xe1\xe0\x2d\x52\x27\xbe\x00\x8b\xe2\x10\x5e\xf0\x87\x09\xed\xdc\xb1\x98\x0e\x50\xa6\x04\x24\x24\xdb\x6d\x1d\x0e\x6e\xeb\x9e\x79\x5d\xe0\x1b\x9c\x7d\xeb\xf7\xd6\x98\x51\x62\xed\xda\xeb\xa5\x81\x09\x33\xe6\x9c\x83\x62\x77\x65\xd2\xfd\xfb\xae\x0c\xfc\x78\x8b\x03\xc8\x38\x9c\x67\xb2\xc8\xcc\xe5\x93\x8d\x85\xf4\x2f\x1c\xf9\x8a\x3b\x91\xfd\x7b\x7a\xe2\x0d\xff\x87\xde\x26\x37\x46\xa1\x7a\x31\x2e\xbd\xf9\x5f\x86\x38\x80\x34\xc0\x84\x2a\xb3\xeb\x51\xa5\xf0\x45\xd9\x5f\xce\xb3\x1a\x6f\x54\x68\xbf\xfe\x7c\x07\xc8\x41\x5e\x71\x52\x9b\x5f\x9a\x94\xc2\xda\x57\xdc\x5e\x1c\x40\x8a\xe0\x88\x57\x5e\x5f\x78\xed\x71\xad\xd1\x69\x34\x4e\xc4\x2c\x9a\x41\x82\xf7\x75\xcf\xa9\x96\xbd\xcd\x3f\x8f\x86\x38\x0c\x86\x86\xd0\x97\xf6\x48\xfc\x9b\xd9\x04\xff\xe0\xd0\xb6\x0e\xcb\x6e\x02\x60\x1c\x55\x98\xb0\x0c\x27\x00\x1a\xd0\xa3\x52\x2c\xcb\x09\x80\x22\xf4\x7c\x18\x8b\x6b\x12\x00\x03\xff\xeb\xdc\xb1\x28\x27\x50\x3a\xf8\xdf\xbf\x1f\x21\x45\x70\x8a\x2a\x1c\x5e\x19\xab\xe3\x60\x7d\xe7\xe8\x54\x3c\x44\xe7\xb7\x39\xfa\xf8\xb9\x21\xc9\xe7\xf6\x27\x19\x2f\xb5\xbc\x2f\x6a\x18\xb7\x55\xe0\x00\xd2\x0f\x2f\xd9\x0d\xb9\x7c\x67\x4d\xc3\x35\xb1\x7e\xd1\x53\x51\x8d\xf6\x22\x89\x4f\xee\xe4\xb9\xdc\x68\x6a\x09\xf6\xeb\xce\x23\x13\xff\xa1\x15\x8f\x03\x88\x1f\x9c\x91\xc3\x1c\x1f\xb4\x04\xd7\x51\x5f\x1e\x6f\x8d\xaa\x5a\x64\xad\x79\x71\xf7\xa5\x5a\x0e\x97\x76\x61\x36\xf7\xe4\xb7\x05\x25\xe3\x90\x42\x1c\x40\x16\x61\xee\x49\x22\x24\xf0\xf6\x20\x8f\x0f\xe3\x1d\x2f\xfd\xc3\x6f\x7a\x79\xdf\xec\x6c\xc9\x61\xda\xcd\x23\x57\xe8\x17\xa1\xcf\x65\x54\x99\xdb\x28\xf1\x6f\x66\x13\xfd\x89\x4a\x7c\x58\x76\x13\x00\xfd\xe8\x8a\x61\x19\x4e\x00\xf8\xa1\xd2\x35\x96\xe5\x04\xc0\x22\x39\x71\xdb\x63\x91\x7e\xc2\xb6\x17\x24\xbe\x00\x93\xf4\xe3\x5f\x90\x86\x2a\xad\x98\xb4\x1f\x0f\xf8\x8e\x36\xbd\x58\xc4\x9f\x98\x58\xd0\xdc\x88\xc9\xfc\xf1\x80\x48\xb4\x0f\xc7\xe4\xfe\x78\xc0\x2f\xd4\x24\x2c\xf6\x4f\x00\xcc\xef\x5e\x5a\x27\xfb\xc7\x26\x40\x49\x5b\x98\xf4\x15\x0e\x20\x4e\xb0\x48\x99\x73\x4b\x49\x99\x62\xcf\x6c\xe6\xa7\xbb\x63\x37\x45\xee\xb2\x59\x70\xef\x69\xb5\xaf\xe6\x98\xff\xad\x92\xd6\x1a\xf7\xf9\xee\x67\x72\x1c\x40\x96\xe1\xba\x94\x30\xf7\xfb\xca\xe5\x2a\x09\x72\x81\xfd\x15\xc7\xda\xc6\xb3\x74\x6e\x70\x26\x57\x0b\x47\x6a\x9e\x8d\x12\xf7\x66\xe9\x08\xc4\x31\xe1\x00\xf2\x0d\xa6\x1a\x5c\xe7\x77\x8c\xe9\x89\xad\x4e\xea\x9b\xed\x3d\x82\xb3\xe8\x79\xf6\x93\x61\x5a\xa4\x89\x96\x29\x77\x79\x53\xee\x92\xc3\x51\xce\x28\x1c\x40\x5e\xc1\xcf\x3f\xf8\xfc\xc5\x60\x60\x96\x52\x9e\xf2\xb3\xbd\xcc\x5b\x82\x6d\xe7\x4d\x2c\xcd\x2a\xda\x56\x42\x95\x77\x55\x3a\xf3\x3f\x0e\x94\x42\x70\x00\x59\x87\xef\x09\xb6\xd0\x9f\x66\xd7\x7e\x34\x65\x7a\x25\x40\x7c\x02\xa9\xb1\xe2\x3f\x95\xcc\xbc\x36\xc9\xfe\x2b\x91\x43\xb8\xa9\x43\x62\xcc\x59\x75\xdb\xa9\xf0\x78\xae\xdd\xc9\x17\x99\x3e\x07\x57\xd9\x87\x94\x7e\xbb\xa1\xef\xde\x37\x13\xde\x31\x36\x9b\xd4\x74\x42\x4f\xc6\xd7\x5c\xea\xda\x1b\x0e\x1c\x40\x12\xe0\xf1\xb2\x46\x7a\xeb\xa2\x94\x74\xc9\x63\x7f\xe6\x8f\x18\x4f\x8c\x55\x73\xbf\xad\x64\xa0\xe3\x6c\xc9\x6c\x59\x59\xe3\xdb\x3b\x5e\xbc\x29\xf1\x6f\x6e\x24\x2c\x97\x13\x2a\x9a\x62\xf9\x91\x00\x58\x46\x75\x16\x2c\x47\x12\x00\xdf\x50\x0d\x14\xcb\x93\x04\xc0\x2b\xf4\x0d\x58\xae\x24\x00\xd6\x51\x45\x0d\xcb\x97\xc4\xa0\x46\x01\x58\xce\x24\x00\x12\x50\x00\x66\xa3\x8a\x07\x7c\x41\xc5\x25\xcc\x56\x15\x0f\x58\x42\xc5\x25\xcc\x5e\x15\x0f\x88\x40\xbd\x84\xd5\xad\x12\x00\xb5\x28\x00\xb3\x5d\xc5\x03\xe2\xd1\x85\xc3\x6c\x58\x09\x3c\x0a\x3d\x74\xc7\x6a\x59\x09\x80\x6a\x46\x62\x06\xc6\x6c\x5a\xf1\x19\xf8\x21\xf1\x05\x98\x5d\x2b\xfe\x05\x61\xa8\xfc\x8b\xd9\xb7\x12\x16\x1a\x25\x16\x98\x8d\x2b\x1e\xe0\xfc\xbf\x1c\x8f\xd1\xba\x12\x00\x41\x0c\xe8\xe5\x16\xac\x0e\x16\x28\x9f\xae\x26\xa1\x79\x89\x03\xc8\x08\xac\xda\xb0\xd2\xa9\x9e\x56\x74\x8c\xac\x35\x7a\xa0\x75\x21\x89\xff\x83\xa7\xf8\x08\xa3\xfd\xa3\xd0\xb4\x5f\x7f\xa5\x5f\xab\x20\x9f\x42\x78\x00\x40\xea\x60\xee\xe8\x7b\x26\xe8\x21\x65\x54\xe3\x44\x4b\x1d\x2f\x4d\xac\xce\xcc\xe0\xc3\x71\xdd\x3b\xb3\x39\x6a\xdd\xba\x64\x5a\x92\xbd\xf9\xcd\x45\x00\x99\x82\x1b\xbd\xe4\x27\x2b\x92\x77\x4e\x87\x05\xbc\xa3\xf1\x8a\xbe\x74\xf3\xf2\xb9\x3f\xef\x32\x68\x43\x07\x85\xad\x4e\xe6\xed\x3d\x52\x31\x4c\xbe\xb9\x5d\x9b\x61\xcd\x49\x8d\x77\x27\xce\xa2\xa7\xe9\x79\xd7\x62\x51\x9f\xcc\x6d\x8d\xf6\x30\x77\x85\xa6\xc1\x62\x65\x25\xe6\x27\x5f\xbd\x71\x56\xef\x18\x71\x00\xa9\x83\x3b\x1a\x4f\x2a\x73\x72\x87\x05\xff\xa2\x8f\xe9\xfa\x97\xf5\x1e\x6e\xa5\x2b\x34\x45\x25\xa4\x9f\xb6\x5b\xb8\x72\x47\xe5\xf7\xf5\x46\x85\xfa\xed\xb8\x80\xeb\x81\xd3\x4c\x6e\xf8\x93\x40\xe6\x20\x5a\xba\xdc\x06\xf2\x74\xd9\x3b\x9a\xd7\xab\x70\xde\xf4\x54\x1b\xac\xe2\x7c\x7a\x2d\x8d\x9c\x21\x12\xff\xe8\x15\xbc\xfb\x47\xd0\x7a\x86\xe9\x16\x3c\xa0\x0e\xe5\xa6\x58\x8e\x21\x00\xa6\xd0\xad\x8f\xe5\x19\x22\xd3\x41\x6b\x32\x96\x6b\x88\x26\xa1\xc7\x50\x58\xbe\x21\xee\x33\x2a\xb4\xff\xc0\x92\x42\x80\x32\xe0\x23\xa1\xd8\x26\xa7\x69\x30\x39\x4d\x54\x5c\x77\xf4\xcf\x4d\xb3\xd6\xbc\xe2\xb4\x32\xe8\x3f\xf0\xeb\x6e\x22\xae\x68\x71\x58\x7f\xeb\xeb\xef\x07\xca\x8d\x87\xf7\xf7\xe3\x00\xd2\x08\x0b\x74\x93\x91\x26\xb6\xbd\x1c\x11\x4e\x9a\x2b\x97\x7e\xfb\x8e\x8e\x7e\x94\x36\x6d\x33\xf3\xbc\x14\x29\xd5\xb6\x4f\x66\x9e\x93\xfd\x9c\x13\x0e\x20\x1b\x70\xdf\xaa\xc2\xac\x32\xbb\x2a\x68\xd0\x50\xf1\x50\x52\x72\x26\xbf\x3b\x5b\x3d\xf5\x1e\x55\x51\xd7\x27\x06\x65\xe3\x56\x19\xc1\x07\x6f\xdc\x71\x00\x49\x85\x63\x5a\xc3\xea\x89\x99\xac\x60\x6b\xd2\x7e\x7d\xe1\xd1\x21\x8a\xab\xde\xa1\x73\x7a\xef\x5b\x9b\xd8\x58\x45\x36\x92\xc8\x18\x94\x0e\x09\x49\xfc\x9b\xd9\x44\xa2\x86\x92\x53\x2c\xbb\x09\x80\x46\x34\x5b\x63\x19\x4e\x00\x6c\xa0\x69\x02\xcb\x72\x02\x20\x75\x07\xba\x64\x98\x92\x94\x32\x29\x09\x1f\xd5\xf6\x92\xd5\xc0\xd2\xd1\x66\x42\xae\x6c\xf1\x42\xa0\x99\x96\x8e\xf5\xcd\xd6\xa4\xeb\x0a\x11\x16\x06\x45\xe1\x53\x6d\x8c\xd3\xfe\x8b\xa5\x6c\x67\xb9\xb7\x79\xd4\x14\xcc\xf7\x25\x66\x16\x27\x76\x71\xd1\x4e\xcd\xc6\xcf\xed\x59\x3f\x58\xd5\x0f\x6c\x35\xde\xcb\x2b\x15\x5e\xd5\x35\xee\xb4\x15\xbd\x12\x30\xbf\x9d\x4e\xe1\x90\xe8\x74\xd1\xaf\xfa\xfe\xbb\xf2\xc5\x20\xbb\xd8\x9e\x8d\xbc\xe1\xb9\xeb\xf2\x73\x3b\x3d\x5f\xbd\x58\x29\x53\x61\xe7\x2b\x19\x06\xb3\xdb\x35\x0a\x6e\x19\x55\xed\x92\xb3\xae\x69\x89\xbd\xe0\x4e\x8b\xd8\x38\xee\x38\xe2\x45\x41\x3a\x95\x41\x7e\xad\x85\xe3\xe7\xab\x8c\xf5\x2f\x92\x79\x0f\x25\xfe\xcd\x6c\x82\x7f\x6a\xd0\x63\x37\x2c\xbb\x89\xdb\x12\xa5\xca\x58\x86\x13\x6b\x07\x1a\x14\x58\x96\x13\x2b\x32\xda\x32\x62\x8a\x82\x78\x40\x15\x5a\x91\x31\x65\x41\x02\x00\xad\x4e\x98\xba\x20\xa1\x9c\xa1\x5e\xc2\x52\x06\x09\x80\x74\x6a\xb4\x8b\xc5\x12\x08\x81\x32\x05\xc9\x69\x0a\x67\x1c\x40\x26\xe1\xb6\xf4\xaf\xf6\x82\xc0\xf2\xce\x70\x01\xab\x1e\x4e\xef\x65\xc9\x29\x7d\x7d\xe1\x90\xf9\xc9\x33\x27\x48\x0c\x3f\xc8\x58\xea\xbc\x25\x57\x05\x00\x29\x83\x77\xfe\x4e\x5c\x79\xfb\xaa\xfa\x4e\xcd\xcb\xaa\xd9\x99\x72\xbc\x87\x6f\x54\xe2\x42\x33\x2c\x4d\x12\x4c\x0d\xcc\x06\xe9\xa7\x79\x1d\xe5\x00\x32\x0a\x9f\x70\x65\x27\xce\x33\x97\x1e\xd2\xa3\x9d\xa2\xb5\xa3\xcd\xbc\xf2\x26\xeb\xbc\x9b\xb7\x7d\xa6\xe0\xcb\x98\xc8\xc7\x0d\x8b\x4f\xc4\x33\x2a\x71\x00\x89\x81\xab\xd9\xaf\xc5\x1b\x05\x82\x81\x23\x9c\x32\x43\xc9\x8e\xef\xb4\x24\x1f\x3a\xc6\x31\x75\x68\x02\x99\x64\x7d\x2e\x41\x89\x03\x42\x7f\xc2\x24\xfe\xd1\x6a\xbc\x7b\x26\xd1\xa6\x14\xd3\x6c\x3c\xa0\x0c\xdd\xf7\x58\x86\x13\x00\xa3\xa8\x78\x85\x65\x39\x01\x10\x83\x96\x1b\x4c\x85\x16\x0f\x08\x41\x01\x98\x1a\x2d\x1e\xf0\x0e\x6d\xac\xb1\x54\x5a\x02\xa0\x18\x25\x8e\x58\x32\x2d\x91\x13\xa1\x1b\x01\x53\xa7\xc5\x03\x5e\xa2\x7b\x13\x53\xa9\xc5\x03\x7c\xd1\x37\x60\x69\xb5\x04\x40\xdf\xff\x2e\xdb\x60\x4a\xb6\xca\x7c\x4e\x14\xa4\xdb\xf9\x37\x00\xce\xbf\x0f\x5e\xbe\xb7\x97\x6f\x77\x17\xaa\xec\x9d\xbb\xba\xab\xc5\xdf\xf0\x25\xfd\x07\x11\x26\x41\x43\xdd\xdc\x12\x7a\x7a\x9d\x7e\x9e\x16\x1c\x40\x7a\x60\x1e\x35\xf4\x25\x3f\x41\x4e\xb7\xcf\xfb\x49\xda\x5d\xb9\x04\xd2\xb3\xd7\xdd\x8f\xd2\x9f\xf8\xb3\x2b\xbf\xe2\xdc\x79\xb6\x1c\xf5\xae\xec\xe8\xed\xf0\x83\x4b\x6c\xc9\x83\x8d\xb9\xf4\x4a\xc1\x46\xf1\x57\x87\x29\x8b\xd5\x19\x9f\xfb\x7d\xde\x21\x15\x6e\x8b\x5b\xbd\xc1\xff\x91\xe4\xcf\x46\xea\x76\xbe\x4e\x82\x37\x1a\x85\x1f\xb5\x51\xe1\x1f\x41\xa7\xfb\x29\x05\x01\xf5\xcc\xd1\x3b\xa2\xd4\x2b\x8a\x6d\x92\x7a\xc6\xbf\x58\x1d\xfb\xed\x70\x45\x91\x51\xe2\xdf\xcc\x26\xf8\x27\x00\xcd\x2c\x58\x76\x13\x00\x3d\x28\xcb\xc1\x32\x9c\xb8\xd7\xd0\x1a\x8b\x65\x39\x01\x90\x84\xee\x35\x4c\xd1\x1c\x0f\xc8\x41\x79\x14\x96\x6c\x4e\x00\xac\x52\xa2\xd9\x11\x4b\x3d\x07\x4a\x91\x4e\xff\xdd\xce\x71\x86\x63\x22\x37\x21\xfe\xd3\x82\xcd\xf9\xa0\xfd\x0a\x8f\x5d\x6d\xf5\x3d\x97\xd2\xf6\xd4\x68\xed\xd8\xd9\x68\xa6\xb1\x92\x2c\xa7\x5a\x2e\x3a\xb4\xbd\xdb\xe0\x35\xb6\x8f\x6a\xdb\xf1\xfa\x7e\x6b\x0d\x93\x52\xf6\xb5\x86\xa8\xa1\xb7\xfa\x07\x0b\xb3\x06\x77\x0b\x93\x1d\x0d\x2f\x39\x48\x9e\xc0\xb3\x1d\x13\x0b\x70\x0c\x71\x18\x3d\xaf\x6a\xf9\x20\xad\xc7\x77\x59\xca\xcc\xf7\x04\xbf\xf0\x54\x75\x83\xd1\xa3\x5d\x0d\x74\xcf\x7f\xe7\xcf\x06\x14\xd2\x45\xe2\x00\x12\x0d\x27\x6b\xae\xfe\x18\x36\xdf\xcd\xa0\xa8\x70\xf1\x71\x8d\xa3\x52\x37\x44\x8c\x1a\x05\xb3\xdd\x2e\x04\xdf\xed\x1b\xf8\x6e\xe7\xf9\x99\xe4\x90\xc4\xbf\x99\x4d\xec\x85\xfe\x77\x9f\x15\xc3\x6e\x62\x66\x41\x97\x18\xcb\x70\x02\x60\x01\x0d\x22\x2c\xcb\x09\x80\x68\x34\x61\x63\x1d\x5f\x10\xf7\x3d\x05\xba\xef\xb1\x4e\x31\xb6\x79\x17\x05\xff\xf6\x1a\x97\xc0\xfa\xd2\x05\x92\xcf\x06\xb4\x8f\xef\x89\xfc\x2c\x4d\xed\xb1\x32\x32\xfd\xe6\xd7\xc1\x1f\x20\xd1\x46\x96\xaa\x29\xf3\xd4\xe7\xc3\xdf\x9a\x7c\x1c\x40\xc2\x61\xa9\x9e\x33\x12\xb0\xbb\x9f\xef\x99\xf5\xdc\x79\x67\x89\xdf\x4c\x46\x41\xf5\x33\x2d\x5d\xc4\x80\x63\x5e\x8d\x87\x0d\x3f\xb5\x89\x73\x38\x0e\x20\xf3\xf0\x81\x2d\x55\xcf\x42\xae\x47\x08\x29\xed\x95\xc7\x38\x9a\x01\x96\xf7\xbf\x4c\xe9\xb2\xa6\x44\x1b\x6c\x9e\x28\x59\xcf\x3d\x67\xb0\xba\x6a\x81\x03\x48\x27\xac\x17\x25\xfc\x7c\x96\x7e\xb6\xe3\x75\xac\xb5\x65\x63\x9a\xb8\x70\x31\x2d\x5b\x9d\x7c\x86\x8a\x6a\x5d\x21\xc5\xcc\xc9\xf7\x5b\x31\xfb\x4e\x4b\xfc\x9b\xd9\x04\xff\x94\xa0\xb9\x1d\xcb\x6e\x02\x20\x1c\xe5\x2c\x58\x86\x13\x05\x44\xb4\x67\xc7\xb2\x9c\x00\xe8\x24\x5d\xaa\x23\x7c\x5d\x1f\xeb\xf3\x5b\x40\x79\x6d\x6b\x6b\x2b\x78\x2f\x00\x08\x0e\xde\x97\x3f\x0b\xa2\xb8\x43\xc6\xe2\x2d\x82\x96\x99\xd3\xf4\xba\xa9\x5a\x55\x2c\x8e\xbc\x67\x72\x78\xd7\x70\xf3\x8d\x26\x45\x6a\xaa\x40\x12\x40\xc2\x60\x29\xfd\x6d\x5b\xef\xad\x69\xef\xca\x77\x72\x7c\x71\xca\x5f\x2e\x1d\x48\x08\xd5\xd6\x70\x75\xaf\x60\xb9\xb8\x47\xe1\xaf\x6b\x38\xe3\xe8\x90\x33\x40\x5c\xe1\x25\xbb\xe1\xb0\xf9\xf7\x6f\x1c\x45\xc9\xc2\xfb\xfb\xa9\x72\x7c\xdd\xf5\x71\xbf\x3b\xb2\x84\xaf\xcb\xdf\x0d\xbb\x7a\xd5\x42\x8e\xfd\xc3\x28\x40\x52\xe1\x08\xb2\x32\xbb\xec\xd3\xba\x9f\x42\xea\xa3\x80\x0d\x87\x04\x7b\xf3\xf1\x4f\x03\x8e\x1a\xd9\x3b\xf8\xa2\xd5\x67\x96\x1e\x26\x0f\xee\xce\x00\x48\x16\x6c\x8d\x6d\x57\x2e\xab\x8b\x6a\x4d\x15\x62\xf0\x57\xd9\xf4\x47\x7b\x68\x4a\x79\x19\x35\x87\x43\xfa\xe3\x73\xf5\x17\x02\x82\xd5\x5d\xe1\x6f\x60\x88\x5d\x29\x74\x00\x83\x39\x92\x54\x4c\xbf\x6f\x07\x67\x7d\xdc\xbb\xe3\x6d\xdf\xa6\x8f\xf2\x61\x32\x56\xff\x85\x37\xfc\xd4\xe1\xa1\x00\x20\x95\x70\xef\x9d\x7a\x27\x49\x8e\x51\xd1\xb8\x7f\x6e\xc9\xd2\xfb\x5b\x8f\xc3\xd9\x84\xec\x8f\x91\x29\xae\x4f\x1e\x5a\x38\x1f\xab\xbe\xbd\x6b\x8f\x02\x40\x7e\xc3\x96\xd8\x99\xb6\x0b\x66\xb8\x79\x17\xaf\xd7\x74\x07\x1b\x86\xc5\x17\xf5\xdc\x56\xc8\x6c\xa8\x48\x44\x3c\xd5\x3c\x25\x27\xef\xc8\xeb\xe0\x00\xe2\x0f\x4b\x01\xfa\xd5\xd3\x49\x8e\xce\x1a\xad\x05\x56\xfb\x93\x8c\x71\x45\x26\x8d\xbb\xbd\x2e\x45\xa6\x9e\x8a\xb4\xd4\x1e\x8a\x72\x9f\xd5\xbd\x0a\x0d\xd5\x62\xbe\xd5\x52\xf2\xd0\x59\xd1\xa2\x64\x84\xdb\x4f\xff\xd8\x73\x36\x2e\x45\xb6\x65\x83\x1f\xde\xb6\x4f\x93\x71\x0b\x02\xe7\x34\x00\x40\x32\x60\xd5\x76\x51\x1c\xb4\xc7\x3f\xa9\xdd\xd8\x64\x01\xf7\x2e\xf2\x3a\x24\x17\xc6\x2b\x09\x1f\xcf\x2e\x1e\xe2\x96\xf1\x5d\xe1\xba\x3e\xa2\x03\x90\x66\xd8\x92\x68\xe3\x5a\x41\x1d\xdd\x36\xd3\xcb\x9d\xa6\xe2\xb2\x13\xa1\xab\x0a\xa7\x0f\x8a\xbc\x4d\x5e\x2e\x7d\xf8\xc1\xf1\x1e\x7f\x8f\x58\x1e\x00\x48\x24\x4c\x43\x15\xd2\x8f\xe0\x8c\x8f\x3e\xe4\x8e\x55\xb9\xf4\x78\x70\x5e\x96\x7a\x4f\xe2\x19\xbb\x73\xaf\x1b\xa3\x9d\x83\x99\x7e\xb3\x18\xc7\x9d\x03\xc8\x2c\xcc\x42\x11\xbf\x4a\x19\xb7\x80\x62\x21\xdd\x83\xbd\x54\x24\xa7\xde\x28\xe7\x66\xc6\xfe\x39\xe8\x7d\x5c\x4a\x92\x8a\xee\xbb\x9b\xea\x37\x0f\x67\x80\xc4\xc3\x79\x5c\xe7\x74\x51\x70\x17\x89\x23\xcf\xc1\xd6\xbb\x27\x66\x55\xef\x44\xc5\x27\x76\xc4\xa5\xd7\xd5\xb6\xe4\x29\x5d\x13\xcf\x4c\x08\x69\x01\x48\x22\xfc\x78\xa9\x84\x4f\x9a\xfb\x78\xc6\xe9\xb7\x12\xe9\x9b\x52\x55\x1a\x8e\x0c\xdf\x5a\x4f\x65\xf4\x78\xad\xae\x9f\x98\x22\xef\xa5\x56\x79\x05\x20\xc3\x70\xc6\xb1\xe2\x3e\x58\x63\x65\xe9\x68\xf1\xaa\xb2\xfb\xb0\x4b\xf0\x4e\x97\xe1\x56\xe1\x18\x36\x23\xb3\xbf\x17\xfd\x86\x6b\x03\x8a\xa2\xa2\x9c\x01\xf2\x01\x66\x0e\xfd\x63\x79\x5f\x8a\xe9\xdf\x2f\x3c\x09\x91\x76\x57\xdf\xe7\xf0\x2a\x4c\x55\xb8\xd2\xe0\xb2\x83\x7e\x68\xe6\x4e\xef\xe7\x0d\x1c\xd4\x00\x69\x83\x83\xa6\xb1\x00\x08\xd2\x4c\xbb\x9a\xb5\xe9\x2d\xae\xa6\x09\x5c\xfc\xec\xba\x9c\x42\x5a\xdf\x99\xe1\x94\x90\xbb\x14\x98\xb3\xdf\xba\x16\x20\x5d\x70\x7e\x6a\x9c\x70\xd8\xa0\xb8\xb9\x72\xcb\x60\x44\x5d\x4b\x0d\x84\x57\x66\xe6\xad\x80\x16\x0a\x9d\x30\xbb\xeb\xdc\x2f\x04\x5e\x7e\x30\x80\x86\x7a\xb4\x1f\x70\x3a\xf0\x97\xfb\xdd\xd0\xc1\xc6\x02\xbe\xdb\x56\x02\xc2\xe7\x6f\x71\x79\xd7\x76\x8b\x76\xba\x65\xcd\x49\xe6\x48\xc1\x43\x6f\x2c\x3f\x3e\xc3\x2d\x15\x53\xb5\xe7\xbc\xc2\x7a\x42\xad\x8f\x4f\xe3\x4a\x42\xc6\xd9\xe3\xef\x6a\x6e\x1d\xde\x1b\xbc\xfa\xfb\x4d\x3e\x34\x74\x6d\x5f\xdb\xee\xc3\x12\x40\x7b\x25\x27\xc5\xbc\x90\x44\x9e\x9f\xc7\x5e\xe5\xb2\x19\x93\x99\x82\x91\xd2\xd1\x34\xbf\xfc\xd2\xa7\x00\x20\x73\xb0\xb7\xe3\x06\xc0\xce\x67\x51\x01\x8b\x11\x34\xdd\x47\x3f\x2d\xb4\xb8\xcc\xdd\x9e\x7b\x75\xa0\x5d\x96\xba\x97\x76\x9f\x8d\xcf\xe1\x93\x03\x00\xf9\x0b\xaf\xe5\x89\x93\x96\xd1\xeb\x3a\xc9\x33\xa4\x14\xda\xba\xa7\xa9\x6b\x5f\x5f\x51\x1c\xb5\xf0\x58\xe1\x5c\x2b\x13\x10\x21\xd3\x62\xb9\x38\xed\x0c\x90\x10\xd8\x1f\x4d\x29\x01\xce\xba\x3c\x9d\x7d\x12\x14\x4a\xc7\x9c\xed\x8b\xa7\x34\x24\xd3\x8b\xde\x67\xf2\x5a\xcc\x99\x5e\xba\xe8\x9e\xf3\xda\x14\x20\x65\x70\x6e\x41\xc2\x4a\xf7\xdb\x57\x2f\x1e\x39\x79\x73\x71\x97\x84\xfb\x53\x8d\xfb\xf5\x21\x22\x6d\x05\xdf\x5f\xd3\xc4\x30\x59\xec\x64\x6f\xb9\x00\x90\x99\xff\xf7\xeb\x89\x17\x0e\x1b\xd3\xd9\x48\x44\xb7\x9c\x12\xed\x42\xaa\xf1\xb5\xc4\x18\x85\xfe\x83\x64\xb7\x3f\x3b\x3c\x54\x7a\x45\x36\xbc\x72\xd9\x19\x20\x9f\xe0\x40\xef\xf4\x49\x58\x56\xac\x18\xb6\x32\xb5\xb6\x6f\xa8\x16\xe1\x7b\xb2\xc4\x73\xb8\xf2\x62\xe9\x1e\xb7\x0a\xe3\xb1\xa1\x70\x91\xfc\x35\x80\xb4\xc1\x84\xc2\x66\x81\x7e\xd1\xd3\xf3\x63\x34\x2f\x3b\xa3\x80\xaf\xd6\x09\x9a\x1e\x6f\x7e\x97\x66\xc6\x55\x32\x07\x26\x1c\x6f\xcd\x2c\xa3\x3c\x40\x16\xe0\x9b\x50\x56\x39\xae\xed\x21\x91\xa3\x83\x4a\xa5\x09\x02\x5c\xa3\x4e\xa1\x92\xe7\x0e\x4d\x9e\x8f\xac\x79\x7e\xd9\x50\xd7\x94\xe5\x66\x1c\xfc\x65\x45\xd2\x90\xc1\xc2\xe5\xbf\xf7\xed\x63\x35\xc5\x68\x1b\x0b\xee\xeb\x1f\xfb\x39\x43\xad\xf8\xe1\xee\x05\xad\x7b\xf5\xbd\x27\xb2\x13\x98\x00\x40\x82\xe0\x24\x7a\xcd\x77\xb4\x8e\x6b\x31\xf5\x7b\x6a\x9d\xeb\x2e\xb2\xf5\xee\x57\x23\x65\x1c\x62\x67\xa2\x3f\xf9\x1a\x35\x5f\xd6\xe3\x54\x36\xb6\x07\x48\x13\x9c\x2f\x52\x7e\x9f\x08\xde\xb8\xc0\xa5\xa7\xf3\x29\xce\xdf\xbe\x22\xfe\xa8\xbc\xf2\xa8\x69\x5f\x97\xcf\xaf\x2a\x81\x83\xd2\x54\xaf\x27\x44\x00\x50\xb4\x86\x86\x33\xec\xa6\xea\xd4\xa1\x9a\x51\xf5\x74\xaa\xa8\xa1\xe7\x97\x73\xfd\xcd\xeb\xf6\xa5\x63\x7f\x4c\x6e\x44\xaa\xd6\x4e\xed\xb2\xae\x40\x80\x54\xc3\x31\xa0\x31\xf8\x64\xcc\x30\x2e\xa9\xec\x80\x24\xad\xf4\xf5\xad\xf7\x87\x43\x73\xae\x59\x92\x93\x65\x17\xcf\xa8\x5e\x4a\x25\x57\xb4\x3e\xbd\xdd\x29\xc2\xda\x0a\x7d\x8f\xea\xe5\xf9\x9b\x1e\xc7\x3d\x6f\xb9\xe2\x54\xeb\x86\xb4\x92\x2f\x28\x70\x89\xc6\x1e\x52\xbc\x7d\xa7\x4f\xec\x59\xee\x6e\x78\xb7\x6d\xfc\xa1\xed\x11\x12\xe4\x6a\xfa\xfe\x38\xe1\xe6\xbe\xab\xc3\xae\x05\x66\xcf\xe2\xa8\xb7\xfc\x33\x6d\xfc\x28\xc6\xa6\xaa\x7e\x65\xc3\x17\xc9\x6e\x96\x97\x1d\x12\x7d\x64\xba\x75\x25\x7e\x24\x91\x49\xe5\x66\xef\xed\x0f\x32\xb6\xb7\x32\x9f\x6c\x45\x77\xdf\x9e\xdb\xba\xbb\x09\x37\x23\xd2\x8c\x27\x78\x2e\x99\x1a\xee\xd3\x2a\x1c\x72\x37\x63\xae\x3e\x1c\xef\x95\x92\xfa\x93\x8e\xef\x47\x61\x28\xdb\x3b\xfb\xd3\x86\xd0\xd0\x50\xd9\xa9\x98\xc7\xfb\xf3\xdf\x8f\xcc\xe8\x08\xdb\x1e\xe6\x72\x2e\x10\xf8\x7d\xed\x05\x75\xbd\xda\xfb\x45\x8e\x4a\x96\xca\x97\x93\x38\x80\xc4\xc2\x9e\xa6\xd9\x72\xed\x61\xcc\x37\x18\x78\x51\x35\xa6\xb0\xf7\x98\x72\xd0\xc8\xf3\x23\x1a\x23\x2d\x21\x62\xc9\xcb\xe7\x44\x5d\x6f\x6f\x25\x40\x43\x9d\x77\x0f\xff\x7d\x14\xc5\xef\xe8\xe7\x68\x9a\xfa\x2a\xa4\x35\x53\xed\x5e\xb8\x6a\xda\x43\xb6\xb6\x8a\xd1\xad\xc3\x9a\x3b\xa3\x38\xa1\xa1\xae\xcc\x13\xfe\xe2\x8b\x7e\x23\xb8\x8f\x67\x8f\x17\x9d\x0e\x2f\x09\x93\x56\x98\xe1\x74\x72\x49\x1c\x5e\x09\x0a\xcb\xfb\x4e\x2a\xe1\x0c\x90\x2f\xb0\x80\x28\xec\xc4\x49\xb6\xc2\x2f\xdc\x7c\x6c\xe6\x8c\xc3\x99\x36\xef\xcf\x0e\xe2\x5c\xe5\x3f\x35\x0e\x7c\x0a\xb3\x91\xbe\xfa\xe4\x63\x3d\x29\x40\xbe\xc2\x29\x53\x38\x32\x4d\xc5\xc8\xf3\x0b\x90\xd1\x69\x7f\xa3\xe0\xad\xa5\x16\x19\xb0\x74\x99\xc6\x41\xe8\xe5\xdf\x79\x8b\x5a\xf0\x20\xd1\x1c\x20\xb3\xb0\x96\xf6\xcb\xfa\x94\x8c\x57\xed\x0e\xf6\x4f\xa3\x2d\xe9\x53\x1a\x5e\x52\x83\x61\x67\xd8\x1d\xdc\x15\x54\xfe\x90\xd4\xbe\x9b\xe2\xd5\xb5\x01\x00\xc9\x82\xf9\x87\x20\xeb\x8f\x15\xa7\xb0\x7d\x96\xd9\x86\xe1\xae\x06\x43\xef\xbf\x5f\xbf\x78\xd3\x73\x8c\x4e\xd6\x4c\x60\xe0\xb8\x8f\xc8\x66\xaf\x20\x40\xbe\xc2\x09\x99\xe5\x12\x7d\xa0\xa0\xd0\xa9\xaf\xa6\x21\xa2\xe9\x34\x81\x5a\xfb\x4d\xf8\xd9\xe6\x17\xab\x9a\xde\xdd\x71\xb7\x79\xa9\x7e\xc9\xa3\x0c\x00\x24\x18\x3e\x31\x88\x52\x5b\x95\xf6\xdd\xf0\x33\x8d\x2a\x9f\x54\x20\x1f\x2b\x6b\xcf\xf0\x54\x7f\xf9\xb4\x34\x9a\xcf\x4b\x47\xd3\x76\x25\xf6\xd1\x0a\x40\xde\xc1\xd6\x4b\xb3\x16\xbb\xaa\x1d\x9f\xb8\x36\x95\x2b\x29\xf0\x44\xd1\xce\xaf\x42\xe6\x89\xf6\x03\x0b\xd7\xf8\x0b\xb4\x37\x23\x5b\xde\xa5\xc9\x02\x80\xf8\xc2\xbf\xb6\x15\x1f\x0b\x75\x39\x6c\x4a\xcb\x7e\x48\x49\x45\xbc\x21\x49\x92\x63\xf9\x9e\xd7\x47\xe1\xa3\xf4\xd7\x3c\x38\xbf\x26\xcb\x0d\x9a\x14\x02\x64\x0c\x4e\x29\xb7\x19\x0c\xdd\x32\x3b\x6b\x4d\x53\x1a\xd2\x36\x12\xd4\xcf\x8a\xa7\xb2\xdf\x63\x8c\xbc\x21\x53\xce\xdb\x95\x90\x90\x4e\xdf\xc8\x23\xf1\x8f\x9c\x4c\x91\xe2\xbf\xbb\x23\x68\xd3\x81\xc5\xca\x08\x80\x30\x54\xce\xc0\xa4\x65\x78\x80\x2b\x4a\x48\x31\x89\x19\x1e\x90\x8a\x72\x64\x2c\x6a\x46\x00\x64\xfd\xef\x47\xf0\x98\x0c\x4d\x99\x92\x94\xec\xbf\x8f\xdf\x34\xc1\x69\xbd\xdc\xea\xa7\xf6\xa1\xec\x0b\xf2\x73\xef\x85\xee\x14\x34\xf2\xd1\xd9\x2b\xb8\xb6\xd5\x58\x7d\x8a\x11\xf3\xbd\xb8\xfe\x2a\xa2\x2e\x13\x07\x10\x1f\x98\xa9\x3d\x9a\x8e\xe3\x1c\x4e\x48\x31\x8e\x95\x4c\xa5\xba\xaa\x66\xfe\xe8\xac\xfc\xa3\x13\x75\xa7\x9b\x02\xae\x14\xd5\x38\x3e\x59\x73\x70\xc0\x01\xc4\x0f\x4e\x60\x79\x97\x4f\xbe\x4f\x57\xa7\xe7\x25\xad\xfe\xe1\xdb\x29\xbb\x71\xe2\x8e\xfb\x6a\x14\x33\x95\x32\xfd\xc0\x78\x52\x4a\xe2\x29\xdd\xbb\x38\x80\x8c\xc1\x75\x60\x7e\x52\x69\xfa\xc9\x69\x6f\xf0\xe1\x96\x43\x6e\xa6\xe3\xbb\xb7\x1c\x2a\x42\xb5\x12\x0f\x7e\xaa\x76\xe3\x86\xef\xb2\xef\xf1\x76\xc7\x01\xa4\xe7\xff\xdd\xff\xf3\x62\x79\x95\x1c\x26\x92\xfe\xae\x9f\xb3\x2c\xb5\x44\xee\x91\xa5\x64\x35\x3b\xb9\x03\x05\xcf\x00\xc9\x74\x21\x85\xa2\xf7\x73\x89\x7f\x9b\x26\xc1\x9f\x4d\x68\x5f\x89\x35\x4f\x02\xc0\x07\x8d\x09\xac\x89\x12\x00\x7e\x68\x23\x8a\x35\x53\x02\x60\x0c\x6d\x44\xb1\xa6\x4a\x00\xf4\xa0\x41\x84\x49\xc2\xf1\x80\x4a\xf4\x24\x1f\x8b\x86\x13\x00\xbf\xd1\x49\x63\xf1\x70\x02\xc0\x9f\x01\x95\x3f\x30\xe9\xb8\x32\x05\x1d\xfe\xb7\x9e\x11\x70\xbd\xdf\xe0\xbf\xfb\xc1\xf9\xc4\x51\xe3\x1d\x53\x6c\x09\xd5\x5d\x9e\x7b\x26\x38\xfa\x1f\xaa\x0e\xa5\x59\xd1\xdf\xaf\xdd\xab\x54\xde\xbe\x89\x03\xc8\x27\x98\x96\x0b\xd4\x5c\xb0\xe7\x44\xae\x16\xf2\x5a\xc7\x3f\x39\xef\xa1\x19\x11\x9e\xd2\xcc\xb6\xd2\x9e\x61\x72\xd9\x3f\xee\x92\xd9\x9d\x89\x26\x00\x90\x46\x38\xab\x07\x85\x20\x7c\x5d\xb7\x37\x39\x0f\xfd\x48\x56\xd0\xb4\xd9\xb1\x97\x29\x64\x2b\x73\x87\xf4\xd7\x6c\xf9\x0f\x0f\x42\xd4\x12\x9d\xe3\x00\x32\x00\x97\xa2\x03\xfc\x4a\x61\x15\xfb\xca\xb9\x18\xc8\x5f\x8e\xfd\xb1\x88\x3e\xa8\x0b\x7e\x65\x96\x3e\xbc\x23\x5b\x2a\xa7\x26\xa1\xef\x7f\xff\x88\xc4\xbf\x59\x4d\x70\x4f\x04\x7a\xfc\x8d\x69\x36\x1e\xf0\x09\xd5\x9f\x30\xed\xc6\x03\x1a\xd1\xb3\x48\x2c\xcb\x09\x80\x01\x54\xf6\xc4\xec\x87\xf0\x80\x0c\x14\x80\xd9\x11\xe1\x01\xcd\xe8\x1c\x30\x5b\x22\x3c\x20\x12\x15\xb8\xb1\x9a\x22\x02\x60\x16\xd5\xab\x31\xbb\x22\x3c\x20\x1e\xdd\x9b\x98\x7d\x11\x1e\x90\x88\xbe\x01\xab\x33\x22\x00\x86\x51\x4d\x03\xb3\x35\xc2\x03\x3e\xa0\xd2\x24\x66\x73\x84\x07\xb4\xa1\x9b\x19\xab\x3d\x22\x00\xba\x48\xd1\xef\x17\x60\x75\x49\x40\x49\x99\xf4\xec\x76\x05\x69\x85\x19\xce\x97\xdb\xf9\x0b\x75\x0b\x4f\x0f\x48\x89\xa7\xbc\x18\xfd\x98\xcf\x49\xb7\x50\x6c\xf2\xb4\x92\x6d\x10\x51\xe8\x73\x95\x63\xce\x2d\xc7\x01\x24\x09\xce\xf0\x63\x97\x92\xf8\xd8\x48\x0e\x71\xc5\x5d\xb2\x39\xde\x15\x7b\xd2\x83\x2e\x65\xf5\x96\xb3\xad\x46\x7f\xab\x40\xfa\xf3\x17\x79\xa9\x8f\xb7\x67\x0d\x53\x1c\x8d\x68\xb2\xf4\xa1\x9f\xf2\xaa\xfd\x01\xbd\x43\xe6\x93\x05\xe4\x0e\x09\x9d\x91\x2b\x46\xa3\x22\xf7\xf6\xf6\x94\xe7\x1c\x4f\x17\xdd\x9e\x03\xdc\xd7\x1c\x92\x18\x5b\x79\xb6\xd5\xa5\x31\xf1\x22\x3d\x81\xab\xe1\xc0\xec\x6d\x92\x18\x29\xea\x8b\x8c\xd6\x24\x4f\x13\x22\x87\xd8\x53\x12\xb6\x93\x30\x3c\x5e\x94\x4b\x9b\xd9\x23\x28\x3b\xdd\xbb\x46\xbe\xfd\x6c\xd9\xcd\x5d\xa6\xcb\x37\x36\x54\xd8\xa8\xc3\x8c\x2e\x64\xf2\xef\xfb\xf0\x5c\x5f\xe2\xdf\xa6\x49\x70\x67\x2b\xba\xc2\x58\xf3\x24\x00\x92\xd0\xfc\x8e\x35\x51\x62\x48\xa0\xbc\x05\x6b\xa6\xc4\x15\x46\x69\x08\xd6\x54\x89\x35\xea\x7f\xb7\x8e\xb1\xba\x61\xa0\x4c\x46\xc6\xf2\xdf\xad\xe3\x3e\xb8\x2a\x4b\x5e\xbb\xf6\xcb\x38\x45\x54\xf8\xbe\xf6\x13\x26\xde\xbc\xd3\x1c\xa2\x94\x34\x59\x23\x23\xe7\x5c\x16\x3b\xf3\x9d\x8f\xb2\x05\x9f\xdf\xde\xff\x70\x3e\xd5\x2d\xfb\x5c\xac\x21\x69\x31\x7d\xff\xe1\x0b\xe7\x91\x4e\xd7\xba\xbb\x01\x0c\xe3\x35\x6c\xe3\x4a\x0c\x5d\xf3\x27\x2c\x45\x4e\xc8\xe1\x00\xb2\x01\xa7\xf7\x87\xbf\xf7\x30\x46\x90\xf1\xad\x0a\x76\xad\x8a\x14\xc8\xa4\x24\x4c\x2a\xb5\xcb\xa8\x16\x85\x7f\x7e\xbf\x7f\xb8\x7d\x71\x75\xee\x0b\x0e\x20\x0b\x30\x73\xf4\xe0\x2a\x3f\x95\x80\x5c\x20\x39\xa0\xd2\xbe\xc0\x7d\xcb\x4a\x8d\x5e\x23\x57\x6b\x7c\x7f\x32\x8f\xa1\xc3\xee\xbd\xf4\xba\x73\x38\x89\x7f\x33\x9b\xe0\x9f\x3e\xb4\xc2\x62\xd9\x4d\xcc\x75\x68\x72\xc4\x32\x9c\x00\xd8\x40\x93\x23\x96\xe5\x04\xc0\x02\x19\xba\x64\x98\xaa\x84\x32\xcd\x65\x92\xff\x4e\x18\xea\xe1\x25\xc8\xd4\x28\x10\xcd\x2b\x37\xac\xa8\x9e\xa7\x10\x2a\xac\x94\xde\xf7\x8e\xa4\x88\x9d\x8c\x44\xbd\x6d\xe8\xf4\xf4\xf5\xe4\x41\x5f\xb7\xed\xf1\xf0\xa9\x7c\x33\xd9\x55\xdc\xdd\x87\x5d\xca\xd5\x07\xe9\x0d\xce\xc9\x02\xf5\xb1\xb8\x04\xb2\xfe\x57\x54\x4b\xf3\xb1\x35\x0a\x65\x15\x11\xae\x38\x80\x24\xc3\x44\x70\x84\xf2\xc5\xc3\x63\x01\x24\x8f\x6c\xdc\x6a\x3c\xcf\xf7\x8c\xc6\x1d\xac\xa6\x25\xcd\x94\x4b\x3e\xf2\x95\xf9\xac\x18\xe9\x8f\xc6\x39\x1c\x40\x6a\xe0\x8a\x3f\xeb\x75\xd9\x7c\xf4\xa5\xcc\xa3\xeb\xae\xec\xd7\x0f\xce\x24\x52\x73\xff\x0c\x8d\xef\xd0\x68\x7a\xa3\x9c\x56\xe3\xfe\x52\x8f\xee\xab\xc4\xbf\x99\x4d\xf0\x4f\xfd\xff\x3e\x1c\x83\x61\x37\x11\x80\x9e\xc9\x63\x19\x4e\x00\x24\xa3\xc5\x03\xcb\x72\x02\xa0\x06\xad\xfa\x98\xba\x10\x1e\x30\x87\x56\x1b\x2c\x65\x88\x00\xf8\x8b\x9a\x84\x29\x0d\xe1\x01\x21\xe8\x6d\x45\x4c\x71\x08\x0f\x28\xfb\xdf\x57\x2a\x30\xe4\x21\x02\x60\x06\x25\xd8\x98\xfa\x10\x81\xea\xa0\x55\x1f\x53\x21\x22\x14\x40\x34\x9f\x62\x69\x44\xc4\xad\xc3\x8a\x92\x53\x4c\xa9\x48\x89\x94\xce\x69\x7b\xe7\xe4\xc3\x3b\x61\x4d\x3e\xe7\x77\xef\x61\xb3\xfc\xec\x49\xa9\xa7\x26\x0e\x37\x2c\x9c\x7a\xb4\xf4\xa5\x1b\x73\x18\x5c\x17\xfb\x9a\x5c\x47\x7e\x6c\x27\xaf\x62\xb8\xe5\x32\x39\xf2\x41\x3c\x25\x22\x60\x27\xbd\x6f\xe9\x25\xd5\xe9\x7d\x83\x83\xa3\xe4\xdd\x29\xf3\x73\x0b\x9c\xe3\xc5\xca\x56\xec\x6e\x12\x38\x80\xfc\xbf\xef\x26\x57\x28\xf9\xf9\x4c\x07\xbf\x4d\x1a\x75\x2d\x3b\x1c\x99\xec\x7e\xab\xe8\xbd\xec\xbc\x73\xc3\xab\x94\x03\xce\x31\x11\x3d\x16\x85\xa7\xb6\xa3\x15\x4e\x8e\x81\xf5\x0e\x97\xce\x1f\xdd\x3d\x72\x33\xf2\xb1\xe5\x70\x96\x79\xa7\x02\xcb\x84\x87\x9a\xd5\x4f\xf7\x68\x4d\xfe\x2f\x9b\x9f\x0f\x3e\x95\xf8\x37\xb3\x09\xee\xc9\x47\x37\x02\x96\xdd\x04\x40\x31\xba\xc4\x58\x86\x13\x00\x4e\x68\x3a\xc5\xb2\x9c\xb8\x37\xd1\xec\x88\xa9\xd5\xe1\x01\x41\xe8\x1b\x30\xd5\x3a\x42\x1f\x48\x41\xbc\x5f\x8a\xa9\xd7\xfd\x07\x50\xb4\x46\x8b\x38\x86\x60\x47\x78\x41\x35\xba\x35\xb1\x14\x3b\xe2\x4e\x63\x44\x3b\x7d\x2c\xe1\x0e\x28\xf3\x09\x3a\x91\x6d\xf3\xb4\x25\x98\xe7\x28\xd2\x8c\xec\x13\x30\x5d\x29\xaa\xfa\xd2\x4f\xa6\x7c\xa9\xea\x75\xac\xd6\x5b\x5f\xa3\x2d\xa5\x11\xce\x9a\x28\x1a\x7e\x81\xdc\x1f\x38\x80\x64\xc2\xfa\xe0\x79\xd1\x05\x77\xf5\xae\x5d\x67\x68\x47\xde\x76\x33\xf7\x7c\xfb\xb0\xa1\x79\x8e\x4b\x2c\xdf\x93\xe3\x9d\x42\x68\xad\xea\xa7\xa1\xb2\x6d\x2a\x02\x8b\x39\x59\xcc\x7c\x39\x46\xdc\xfd\x33\x89\x06\x8f\xaa\xde\x57\x28\xdd\xd8\x95\xdd\x35\x5e\xcb\x97\x3a\xe8\x35\x16\xa7\xf3\x93\x4b\x71\xbb\xd3\x77\x82\x79\xdd\x74\x78\x40\x1a\x6b\x20\x9d\x54\xf8\x2f\x3a\xf3\x9d\xbf\x67\xe4\x33\xd6\x4d\xa5\x93\x66\x0e\xdd\x05\x66\xb2\x8c\xe9\x7b\x8a\x7a\x71\x00\xe9\x85\xb5\x28\x8b\xab\x2b\xad\x7d\x75\xed\x9c\xb2\x8a\xa6\x1d\x79\xfe\x0c\xe7\x8a\x7b\xee\x34\x20\xfc\x8d\x3a\xb9\x7d\x66\xeb\xbc\xed\xdd\x75\x12\xff\x36\x4d\x82\x3f\x97\xd0\xcc\x85\x35\x4f\x02\x20\x13\x25\xd6\x58\x13\x25\xf2\x34\xf4\xdb\x08\x58\x33\x25\xee\x03\x94\xd8\x61\x4d\x95\x00\xe8\xa5\x43\x63\x02\x4b\xa1\x05\xca\x64\x7c\xbb\x49\xb7\x63\x62\x1c\x56\x73\x9e\xb4\x36\x5d\x4c\x75\x58\x6e\xd3\x5b\xf8\x3d\x6d\x7f\x3a\xab\x3c\xaa\xa5\x98\xc2\xfe\x00\x4e\xa4\xb3\x74\x85\xac\xf6\x91\x7e\x16\x0e\x20\x38\xf8\x04\x43\x8e\x62\xd7\x54\xda\xdb\x95\xbd\x3c\xa4\xa0\x38\xb7\xb2\x38\xd4\xbb\x3c\xdf\x30\x7a\x1f\x63\xa0\xeb\xf7\x29\xb6\xf9\xf0\x55\x6d\x1c\x40\x3e\xc3\x45\x7f\xf4\x64\x83\xbe\xc3\xb5\x7b\x43\x9a\x51\x6b\x46\xc2\xc7\xab\x96\xbf\xa4\xdd\x35\x62\x91\xdd\x79\x66\xd7\xd2\xd1\x8f\x0f\x75\xaf\xda\xe0\x00\x12\x07\xeb\x93\xcf\xea\x0d\x27\x6b\xb9\x83\xcf\xf7\x9f\xdb\xeb\x14\xe1\x79\xd7\xda\x84\x94\xf2\x54\x78\x42\xc6\x4b\x12\xf3\xba\x1f\x9b\x5f\x2d\x9d\x70\x00\x49\xf9\x7f\x3f\xa2\x3f\x73\xc2\xfa\x51\x7e\xc8\xf1\xb3\x40\x39\x48\xd9\xe1\xd1\x99\x5b\xb3\x26\x57\x57\x9d\x8c\x2a\x9a\xaa\x6f\x72\x7f\x7d\x6e\x7c\x40\xe2\xdf\xa6\x49\xf0\xe7\x38\xaa\x6b\x60\xcd\x93\x28\x21\xa2\x15\x19\x6b\xa2\x04\xc0\x67\x74\xdb\x63\xcd\x94\x00\x88\x43\xfb\x3f\xac\xa9\x12\x00\x29\x94\x68\x3b\x87\x25\xc5\x03\x65\xd2\xd3\x24\x88\x0b\x00\x48\x3c\x2c\x85\x54\xb5\x5e\x75\x2d\x9f\xdf\x74\xb2\xaa\xad\x3b\x9a\xfe\xcc\xa2\x22\xa9\xd6\x82\xb3\xf5\x95\xfb\x88\xe2\x77\x7b\x52\xcb\x02\x9d\xd7\x00\x59\x80\x43\x62\xd7\xcf\xd2\xf9\xd7\x63\x1c\xea\xd2\x9b\x52\x63\x62\xef\x5b\x4f\xcd\xec\x72\x7a\x16\xbe\xaf\x37\x94\x25\xef\xa6\x42\xf2\xfc\x1e\x53\x1c\x40\x7e\xc3\x54\xfc\xad\x66\x71\x8f\xc3\x97\x6f\x1e\x97\xc7\x75\x98\x8b\xc4\xca\xff\x46\x8b\x96\xe9\xbc\x97\x8d\x94\xd4\x5c\x73\xdf\xa8\x92\xa7\x61\xc3\x01\xe4\x1d\x7c\xa2\x21\xe0\xa7\x78\x8e\x3f\x60\xfc\x5a\x51\x4a\x66\x51\x46\x18\xb5\x6c\xf3\x8c\xd1\x8e\xe0\xdc\x9e\x73\x3b\x32\x85\x7e\xb0\xf7\x65\x15\xe1\x00\x32\x0d\x3f\x5f\xa4\xfd\xc7\xc7\x4f\x05\xb4\xb7\x3a\xa8\x14\xdf\x29\xbf\x5a\xe5\x61\x95\xff\x24\x9b\x62\x7e\xb2\x29\x69\x8c\xc5\xdf\x7d\x52\xe0\xb6\xc4\x3f\xce\x92\x20\x09\xa0\xc2\x09\xd6\x3c\x89\x6c\x02\x0d\x09\xac\x89\x12\xc5\x34\x94\xe0\x60\xcd\x94\x00\x78\x87\x5e\x61\xc3\x9a\x2a\x01\x30\x4d\x86\xfe\xb0\x0a\xeb\xc8\x05\x28\x93\x33\x53\x91\x6c\x73\xf7\x2c\x98\x51\xec\x97\x08\x3a\x78\x2d\xeb\xe4\x55\xad\xdd\xee\x93\xf7\xc4\x77\x8c\x7e\x55\x15\x33\x09\xaf\x26\xf3\x5d\x9a\x7a\x56\xcf\xb0\xa7\xf5\xd8\xf6\x56\x80\xd7\x2c\xbc\x69\x2d\x38\x5e\x5d\xed\x6d\xb0\xb0\x8e\x66\xff\x35\x03\x87\xae\x5b\x61\x6c\x0f\xf4\x70\x45\x19\xf3\x0c\xce\xe4\x15\xfd\x2a\x38\x80\xb8\xc1\xdb\xf8\xa2\xaf\x15\x5f\x45\x47\x6b\xc9\x83\x68\x43\xbd\x47\x92\x9d\xcb\x9b\x8d\x8b\xdd\x37\x37\xf4\xdf\x0e\xda\xbc\xfd\x4e\xc1\x64\x12\xbe\xcd\x2a\xe0\xb4\x95\x3b\xa4\xe4\xf9\xfa\x90\x2e\xe5\xfc\x0a\xaf\xe4\x25\x76\xbf\x9d\x3c\xe9\xae\xe7\x99\x6b\xec\x53\x97\x48\xb3\x4e\xa7\x8d\x1f\x59\xc1\x01\x24\x11\x66\x68\x37\x3e\x69\x0d\x1f\x6f\xcc\x17\xbe\x12\x53\x57\x38\xa4\x77\xfe\x59\x9d\x94\x5a\x88\x49\x68\xf5\xd5\x3e\x13\x79\xed\x0b\xc9\xaf\x6d\x01\x40\x3e\xc1\xa5\xcf\x42\xee\x8c\x1d\x39\xff\xfb\x37\x53\x7c\xe6\xf4\xc9\xd7\x26\xa2\x3f\xc6\x5c\x1c\xdf\xb5\x5e\x5e\xf3\xab\x3b\x45\x69\xcc\xdf\xd5\x07\x20\x89\xb0\x7b\xb6\x9e\x92\x56\xdd\xeb\xe3\xd1\xa9\x52\xea\x10\xb0\x91\x5c\x3c\xff\x92\xcb\xe7\x79\x4c\x89\x0d\x77\xdf\xce\xc7\xfd\xd5\xcd\xca\xc4\x1f\x1a\x60\x79\x91\xa8\xe9\xa3\xec\x06\xcb\x8d\xc4\x2c\x84\x06\x04\x96\x1f\x09\x00\x37\x34\xa9\x60\x39\x92\x48\xe9\xfe\x77\xf2\x81\xe5\x49\x82\x30\x86\x92\x46\x4c\x57\x12\x68\x3e\x5a\x5d\xb1\x9c\x49\x7c\x03\xea\x25\xac\x63\x41\x02\x20\x96\x62\x29\x89\xf0\xd7\x8f\x58\xa7\x83\x40\x19\x57\xc1\xf4\xdf\xef\x0b\xc7\xe1\x65\xd6\xd3\x57\xda\xc7\x30\xaf\xfc\x1e\x0c\x2a\x0a\x0a\xcc\xbd\x39\x27\x76\x8f\x3e\xc2\x2e\xf1\xea\x91\x80\x4f\x93\xb6\x11\x3a\xa5\xf6\x38\x80\x0c\xc1\x3c\x7f\x56\xaf\x3a\xc7\xbe\xae\x20\xf2\x10\xd3\x9b\x21\x96\x93\x4f\x3a\x3d\xcd\xab\xe4\x64\x6c\x05\x46\xab\xb3\x32\x84\xc7\xf7\xcc\xf8\xe1\x00\x32\x01\x77\xe0\x63\x51\x20\xf6\x61\xa2\xd0\x62\xd8\xdb\x92\x72\xc7\x1d\xad\x76\xd9\x4a\x71\x5f\xbb\x82\x6c\xf6\xd3\xbd\xff\x72\xc6\xc6\x7e\x71\x01\x07\x90\x42\x58\x78\xab\x7a\x2f\xb4\xbe\x23\x99\x82\x4c\x72\x47\x96\x46\x6a\xc4\x8a\x6b\x73\xde\xd5\x98\x67\x27\xec\xba\xb7\x3c\x1e\xaf\xe8\xc4\xf2\x9d\xc7\x01\xc4\xeb\xff\x1d\xb1\x27\x74\x4d\x5f\xfe\xbc\x67\x75\x9a\x57\x49\xf7\xef\xa8\xaf\xd4\xce\x0c\x53\xb6\x94\xd2\x2f\xe6\xdf\x3d\xc7\x57\x7d\x84\x9a\x68\xb7\x1b\x40\x78\x97\x4d\xb9\xbd\x1d\xac\x55\x6f\x18\x15\x51\xd5\x88\x60\x6d\xa7\x15\xae\x13\x09\xed\xf0\xc9\x90\x76\xde\x08\x0a\xef\xb4\x3b\xee\x74\x04\x00\x24\x00\xce\xbc\xe4\x69\x0d\x94\x25\xe2\xb1\xdc\xdf\x46\xc7\x76\xb1\x51\x69\xfd\xf0\xd0\x4f\xb0\xac\x13\x4f\xd1\xf6\x5f\x79\x75\xc6\x3c\x82\x8c\x12\x20\xcd\xf0\xe3\x8b\x3d\x07\x5f\x44\xbb\xb3\x7e\x20\x5f\xbf\x11\xe1\x7d\xbf\xe8\x6b\x7b\x49\x7a\xdb\xc5\xf3\x5d\xf7\x83\x68\x8f\xef\x15\x2d\xea\xe0\x92\xf8\x37\xaf\x13\x6b\x37\x1a\x0f\x58\x6e\x27\x00\x86\xd0\x36\x05\xcb\xef\x04\xc0\x04\x2a\x21\x60\x39\x9e\x00\x28\x44\xa5\x40\x2c\xcf\x13\x00\x5e\x68\xeb\x8a\xe9\x7a\x42\xbf\x8e\xee\x4b\x4c\xdf\xe3\x01\x01\x68\xb1\xc1\xf2\x3e\x51\xb9\xa2\x41\x75\x25\xac\x83\x72\xa0\x4c\x0a\x48\xff\x93\x02\xdf\xc3\x6d\x41\x85\x72\xe1\xf1\x83\x4b\xef\x2d\xa8\x0f\xbc\xe6\x69\x4a\x19\xe5\x7f\x31\x7a\x98\xaf\xcf\xa0\xf3\xba\xd6\xa7\xf4\x57\x03\x7d\xc6\x1b\x38\x80\xf8\xc1\xbb\xe0\x46\x5f\xf7\x4e\xf6\xd1\xb4\x90\x17\xf6\x47\x7a\x6b\xd9\x87\xed\xff\x2c\x2b\x7e\xc9\x64\xdf\x77\x03\xc9\xee\xb6\x74\xe0\x1d\xb6\xc4\x01\x64\xf1\xff\x5d\x1d\xfb\xc6\x3a\x13\x78\xf1\xec\x20\x1b\xc3\xb3\xcb\xc6\x3d\xb8\x91\xe9\xbf\x5e\xf2\x11\xfa\x37\x67\x72\x5b\x92\x59\x74\x93\x06\x6e\x6c\xe7\x3b\xb8\x0d\x92\xd9\xfb\x92\x3e\x3b\xa0\xf3\x78\x89\xdd\x8d\x23\x48\xc6\x2d\x43\xa5\x91\xd8\x37\xd4\xb9\xde\x07\x45\x58\x99\x52\x74\xb8\x2d\x8d\x25\xfe\xcd\x6c\x82\x7f\xde\xa3\x24\x1f\xcb\x6e\xa2\xb6\x8a\x46\x11\x96\xe1\x04\xc0\x22\xba\xc6\x58\x96\x13\xb3\x3b\xda\xd9\x60\x5e\x55\xc0\x03\xbe\xa0\x1c\x07\xf3\xb2\x02\x1e\xf0\x15\x0d\x6c\xcc\xeb\x0a\x84\x93\x18\xf4\x27\x34\x98\xf7\x15\x08\x35\x10\x6d\x85\x30\x6f\x2c\x10\x4c\x42\x4b\x1a\xe6\x95\x05\x3c\x20\x18\xfd\x39\x1f\xe6\xa5\x05\x02\xed\x42\xe7\x80\x79\x6b\x01\x0f\xf0\x45\x43\x03\xeb\xde\x02\xf1\xa4\x97\x6c\xe9\x25\x1b\x41\x11\xc4\xf8\x8b\x57\xa0\xec\xb8\xb9\xb5\x15\xcc\xeb\x0c\x10\x77\xb8\xe4\xf8\xcf\xf7\xb9\xb2\x2b\xc5\x47\xf0\x4e\x57\xb7\xc7\xb5\x9e\xaf\xd8\x33\x46\xbd\xc3\xd2\x6a\x65\xcb\x5f\x34\x53\x47\x43\xf1\xeb\x5e\x80\xf4\xc2\x37\xc6\x2a\x1f\x99\x83\x7d\x66\x2e\x37\xc7\xe6\x49\xae\x59\x28\xe4\xec\x9f\xe2\xfa\x5d\xff\xfe\xa3\x1d\xd7\xd2\xce\x79\x96\xe8\x1a\x4a\x2a\x80\x8c\xc3\x09\x5e\x92\x93\x7a\x72\x25\x3f\x3a\x73\x4c\x52\x46\xe5\xee\xd9\xc9\xd4\x27\x9d\x17\xb9\x4a\x87\x2d\xc8\xc7\xd4\x29\xda\xbe\x3f\xa1\x6e\x01\x00\x01\xf0\x75\x90\xe9\x27\x3b\xe2\xf2\xc7\xee\x2c\x5d\x34\xbb\x74\x2c\xc1\xd7\x96\x64\xc9\x32\xc6\x5e\x9d\x4c\xf5\xa1\xaf\xea\x8d\x07\x74\xb2\xe9\xcd\x00\xc9\x81\x75\xae\x0d\xdf\x92\x56\x9e\xf2\xb0\xc2\x91\x89\xe5\x34\x75\x5d\xdb\x03\x73\x03\x12\x62\xb4\x59\x8f\x67\x6e\x57\x3f\xbc\x55\xea\xaf\xad\x0d\x0d\x6d\xff\x26\x44\x62\x12\xa4\xdc\x23\x37\xfc\x54\xfb\x8a\x02\xc8\x16\x28\x3b\xef\xa9\x95\xf0\x37\xfb\xfe\x72\xa1\x97\x60\xa1\xf6\x4e\x67\xa0\x78\x0b\xbe\x03\x9a\x9b\xa5\xfc\x85\xeb\xf7\xe3\x93\xe3\x24\x26\x0a\x47\x55\x48\xbc\x63\x1d\x9b\x3c\x9e\x7f\x4d\xa9\xd6\x7d\xed\xf4\xac\x2a\x45\x09\x20\x85\xb0\xd2\x60\xf4\xfc\xe6\x56\x7d\x2f\x2d\x93\xa0\xab\x9c\xb1\x65\xa7\x60\x1c\xa3\x17\xbb\x2d\xfb\xfe\x33\x7c\xaf\x4f\x73\x7c\x30\xd1\x3e\x24\x00\x90\x1e\xd8\x2d\xe1\xb7\x7e\x87\x0a\xee\x3d\xf8\xe4\xb5\xe5\x47\xd3\x1b\x8f\xa7\xea\x2f\x72\x9e\xff\xca\xbe\xdb\x7d\x4c\xfc\x95\xf1\xeb\xd0\xca\x31\x11\x67\x80\xd4\xc1\xe3\x4f\x4e\xd0\xf7\xfc\x71\x21\x0f\x90\xe2\xda\xe5\xff\xfe\xd3\xb9\xc8\x1b\xd3\x6d\x6b\x65\x0d\x77\xd7\x6a\x02\x63\xb2\xca\x8f\xaa\x9a\x03\xa4\x05\x26\xd3\xcb\xaf\xc2\xfd\x32\xdc\xeb\x6d\xb4\x6c\x1a\xdf\xec\x08\xb0\x51\x49\x75\x1b\x3b\xbf\xea\xe5\x52\x9f\x6e\xb7\xbf\x77\xcf\x95\x8d\x36\x80\x6c\xc1\x5e\x1c\xd0\x2b\x55\xbc\x29\xeb\x33\x37\xc0\x57\x97\xa8\x95\xd3\x5f\xf4\x85\xe1\x06\x5d\x32\xfb\xde\x7b\xa6\x3d\xbe\x2f\x4f\xb5\xc6\xf8\xc0\x4f\x06\xf9\xec\xc3\x9f\x7d\xc5\xe4\x4d\xcf\xbf\x88\x2e\x7b\x72\xfd\xd0\xc1\x8b\xcf\xf7\x3c\xd4\x39\xbe\x9f\x1d\xfc\xb8\x04\x6c\x5a\x9d\x01\xf2\x1a\xb6\x24\x78\xf0\xa2\xf4\x4d\x4f\xd7\x5a\x47\x76\x76\x86\xe0\x1f\x52\xed\xde\x0f\x67\x9f\x3d\x4c\x8c\xb9\xf4\x71\xcb\xee\x56\x89\x66\xa0\x09\x40\x3a\xe1\x79\x76\x8d\xdc\xfc\xb9\x21\xee\x71\x5f\x86\x6b\x4e\x47\xce\xb8\xfd\x29\x8e\xb4\x25\x5a\x8c\x97\xd7\x8b\x5b\xd8\x76\xff\xed\xeb\x9e\xe2\x00\xe9\x83\x87\x7f\x0f\x32\x65\xb1\xb8\xad\xdb\x74\x63\xeb\xf9\xac\x7f\xab\x97\xdd\x2f\x96\x3d\x85\x36\xac\xd5\x7e\x9e\xda\xd6\x6f\xee\xe8\x3c\x22\x03\x00\xf1\x86\x13\x7f\x35\x6e\x24\x38\x47\x3d\xf8\xbc\xb3\xde\xb9\x2b\xba\xaf\xdb\x48\x06\x8e\x07\x99\x52\x3d\x99\x3a\x73\x43\xa0\x2a\x2c\xd0\xbe\x51\x10\x20\xad\xf0\x79\x02\x8b\x75\x40\x90\xd8\x95\xa6\x6b\xb9\x05\x52\xd7\xce\xb0\xb8\x8f\x26\x59\xa8\x0f\xcc\x65\xaf\xf9\xb4\x50\xfa\x4c\xe9\xbd\x3f\xf5\x13\x07\x90\x0a\xf8\xf1\x6a\xbb\xd2\xe5\xa3\x9e\x08\xed\xb8\x9c\x33\xc9\xef\xc2\x73\x5b\xf9\x14\x7f\xb3\xba\xbb\x7f\x58\x68\x06\xc3\x7d\x39\xd7\xe5\xa4\x37\x00\x20\x3e\x70\x8f\x31\xbd\xe3\x73\x42\xe9\x2a\xcb\x2d\x97\x71\x53\x83\x7e\xf2\xc1\x8e\x73\xe5\x8a\xd3\xd7\x22\xde\x2e\x66\xf5\xee\xf9\x9c\xcb\x23\xc2\x04\x90\x04\x78\xf8\x9f\xdf\xe6\x2c\xce\xe5\x12\x37\x8f\x75\x7a\x89\x1f\xd7\x68\x4a\xd2\xe7\x4e\x60\xe2\xef\xbd\x83\xbc\x68\x78\x76\xfc\xf8\xdb\x5b\xde\x00\x20\x5e\x70\xd9\x6a\x4f\x9b\xcb\x28\xbd\x9c\xa2\xb4\x6c\xa8\x84\x53\x38\xe6\xd9\xcc\xde\x9e\xfd\x20\xe4\xc8\x5a\xd2\xbc\x74\xff\xf2\xa6\xdf\x96\x04\x40\x16\xe1\x8e\x2a\x42\xdc\xc5\x43\x5d\x65\xfa\x46\xb5\xf5\x73\xd7\x89\x75\x2b\xfd\x77\x3b\xd7\xce\x96\x47\xd4\x9d\x13\x74\xfa\x71\xd9\x26\xd6\x43\x0a\x00\xa4\x16\x76\x3e\xe5\xab\x54\x32\xfe\x92\x2c\xaf\xbf\x0b\x5f\x1c\xac\x16\xc7\x84\x5c\xab\x7d\x5b\x15\x14\x47\x1a\xcc\x1c\xb6\x92\x12\x84\x68\x4d\x01\xb2\x09\x5b\xff\xf2\xe6\x32\x9f\xc7\xae\x74\x3a\xcb\xd5\xde\x70\xb7\xee\x4a\x26\x46\x1a\xfb\xbb\x1e\x26\x7b\x55\xcd\xcf\xe4\xad\x26\xe9\x8f\xac\x38\x03\x45\x4b\x68\xf8\xee\xbf\x2e\xd5\x4b\x94\x92\x2b\x06\xb6\x7f\xad\xbf\x9f\xde\xdd\xbd\xae\x2e\x21\xa8\x35\x9d\xd0\x6f\xe9\x92\x1a\xde\x7d\xe9\xa5\x22\x40\x42\x60\xca\x70\x6b\x20\x76\x37\xeb\x42\xd3\xf3\x42\x1a\xde\xdd\xcf\x6d\xf9\x0d\x15\x38\x7e\x75\x15\x7d\x3b\x9b\xeb\xff\x4d\x2b\xca\xb8\x71\xc8\x15\x20\xd1\xb0\xed\xa6\x41\xca\x97\xb3\xcd\x38\xb9\x3f\x87\xae\xe7\x78\xd3\x4d\x46\x93\x97\x6b\xdf\x79\xa0\x7b\xfc\xc7\xe1\x35\xc5\x33\xa4\x77\xce\x8c\x42\x43\xa9\x02\x6b\x3c\xa4\x9d\x8c\xae\x74\x99\xd3\x19\xb0\xcd\x7d\xd5\x68\x15\x5f\xf7\xa8\xfc\x39\x73\x9d\x77\xff\x14\x9f\xfa\x59\x8d\x67\xce\x00\x71\x83\xe7\x79\x94\x62\x42\x98\xb9\x67\xf4\xce\xf3\x4e\xae\x85\x68\xce\x84\x80\x72\x9b\x17\x7f\xb9\x1f\x86\xd3\x76\xc8\x7b\xdc\x63\x6e\xb6\x15\x07\xc8\x00\xdc\x37\x96\x9a\xdc\xdc\x4a\x3f\x5c\xe0\x53\xf4\xf4\x63\xc8\xb3\xbd\x64\xd2\xd3\xac\xde\x12\x3a\xcc\x12\x74\xf4\xd2\x32\x59\x56\x7f\x2b\x02\x01\xb2\x04\x6f\xd5\x45\x4b\x06\xa9\xc0\xd6\x39\xa9\x23\x2f\xe8\xd3\xcf\x69\xa8\xef\xe1\x1c\xab\xdc\x97\xc8\xcb\x5b\xb0\xf7\x2f\xa7\x8c\xea\x93\x95\x09\x1c\x40\x5a\x60\xc2\xff\xe1\x2c\x55\x38\xaf\xe4\x81\x58\x6d\x1a\xe7\xc5\x2e\xf9\x67\xe7\x0a\x28\x6b\x3a\xf7\xb8\x1c\x12\xb7\xb5\x3d\xf2\xe3\xa0\xbb\xda\x14\x0e\x20\xe5\xb0\xfa\xe6\x7a\xe4\xe2\x15\xf1\xa7\x3e\xd2\xb3\x06\x9a\x27\xe8\x6f\x75\x08\x9f\x62\x51\xb7\xa2\x17\x1a\x75\xfa\x6d\x25\x91\xb5\xc9\x56\xaf\x03\xdf\x35\xb6\xe8\x67\xb2\xd7\xa2\x3c\x2f\x7d\x95\x35\xb2\xfc\x01\xd3\xaa\x0c\xcb\x15\x9b\x17\xdf\x1a\x6d\xf7\x7b\xbb\x70\x1e\x70\x72\xde\xde\x7c\x1b\x70\xe5\x30\xab\xcd\xee\xdd\x7f\x88\xf7\xab\xea\xe6\x31\xe1\xcb\xc2\x1d\x9b\x17\x2a\xef\x8b\x2e\x92\x34\xb7\xac\x9e\x9a\x3d\x92\x77\x78\xca\x00\x20\x5b\xf0\x12\x6d\xd8\x8c\x91\x79\x91\xca\x8e\x1d\x7d\x1f\xae\x5a\x65\xbe\xbf\x36\x5b\x40\xa1\x80\x57\xf2\xca\x1e\x3e\x6d\xe6\xb3\x86\xc5\x45\xeb\xce\x00\x71\x82\x67\xda\x6d\x55\x22\x5a\x6e\x45\x3e\xfe\x6d\xba\xe4\x09\x59\x17\x9d\xfa\xe4\x58\x5a\xbb\xbc\xe7\xe5\xf5\xae\x33\x47\xe6\x3f\x1d\xfe\x61\x02\x90\x18\x78\x73\xa8\x6a\x2e\xee\x10\x9f\x91\xd2\x55\xbb\x7e\xee\xf5\x39\xdc\x20\x8d\x37\xd3\x58\xcc\xdd\x73\x16\xc7\x0f\xba\x91\xce\xee\x4b\x3d\x2c\x0d\x90\x5e\x38\x8f\xa9\x4c\x2b\xb0\xec\x5d\x8c\x66\xd7\xb4\xf6\x3c\x74\xf8\x5d\x01\x69\x25\xcd\xb8\x63\xd0\x7c\x07\x89\x4d\xd0\xda\x2b\xca\x33\x14\x42\x38\x80\xb4\xc3\x8f\x57\xdb\xe9\x41\xc9\xfb\x34\x79\xe5\x62\xc3\x09\x7b\xff\x69\xbe\xe5\x2a\xdf\x93\x95\xb5\x61\xc6\x31\x09\x24\x89\x1f\x9c\xeb\x8c\xe3\x71\x00\x29\x83\x95\x6d\x0e\xad\xc3\xb5\xaf\x3d\xbe\x93\xef\xba\xfa\x76\x88\x29\x44\x6b\x48\x22\xff\xde\xb3\x2a\x9f\xfb\x6a\x7d\xce\xda\xf5\xc8\x5b\xd9\x7c\x67\x80\xb8\xc0\xeb\x14\xbf\x14\x3c\x38\xad\xaa\x7d\xbb\x4d\x96\xeb\x33\xfd\xb9\xa4\x27\x16\xc6\x95\xb8\x20\x01\x86\x7e\x07\x9f\x1f\xb4\xaf\x04\xf8\x69\x00\x12\x03\x9b\x9f\x99\x37\xfe\x77\xe2\x3d\xcb\x70\x36\x77\xc7\x55\x26\x45\xaf\xbd\x51\x42\x27\xdc\x07\xef\x9d\x99\x29\x99\xcd\x11\xf8\x51\x4a\x27\x0d\x90\x51\xb8\x6d\x75\x36\xbb\x99\xc5\x45\x25\xa8\x99\xbb\xd3\x89\x64\xac\x53\xcb\x88\xe1\x5b\x69\x9c\xc6\x5b\xf2\xb8\xea\x6b\xb7\x87\xfc\x6d\x01\xad\x33\x40\x4a\x61\x0e\xa1\xac\x4b\xa3\x98\x28\x74\xd8\x31\xbc\x8c\xfc\xb6\xc4\x0c\xc7\x5e\xf6\xd0\x0b\x8f\xd3\x26\x75\xf7\xab\x16\xed\x5e\xca\x36\x99\x53\x04\x48\x25\xec\x9c\x86\xae\x89\xf6\x79\x19\xd7\x82\x0a\xbe\xe2\x22\x4d\x9c\xca\x24\xe5\x25\x55\xba\x93\xab\x62\xa1\x96\x95\x3c\xc5\x6e\x1b\x47\x29\x00\xd2\x01\x27\x26\xa9\xaa\x58\x52\xeb\x43\x91\xf4\xd4\xbb\x96\xc8\xe2\xa5\xb2\xc2\x24\x57\xa6\x0e\x54\xf5\x94\x7c\x0f\xa7\x17\x1f\x0c\xba\xde\x0a\xd3\x87\x25\xa3\x26\x55\xe1\xaa\xc7\xf7\xd6\x95\x9e\x73\x7d\x72\xbc\xde\x73\x96\xf5\x80\xdd\xca\x64\xd5\xe8\xa6\xd3\xc2\xc0\x3e\x39\x3f\xc1\xed\x16\x0b\x7e\x74\x42\xdb\xcb\xb8\x66\x21\x23\xc5\xe9\xf2\x9b\xf4\xf2\x41\xfe\x89\xe2\xbe\x72\x1e\xb2\x6d\xaf\x1d\x85\x72\x0e\xa5\xf4\x1d\xaa\xd3\x74\x06\x48\x0e\xfc\x7c\x2e\xaa\x6a\x01\x5b\x12\xd9\xfe\x97\x06\x13\x67\x53\x82\xff\xfe\x3e\xca\xb7\xbe\x67\xc0\x4a\xa5\x49\xfe\x4e\x13\xb5\x7c\x56\xea\x49\x80\xfc\x84\x73\x01\x62\x9e\xf3\xf7\xcf\x3a\x49\xce\xad\xe3\xc5\xb8\x4f\xce\x4f\xd4\x33\x5d\xbe\x7f\x51\x3f\xd1\x93\x1e\x21\xfc\x25\xe4\xb9\x5b\xc2\x2a\x40\xa6\xe1\x5c\x30\xc7\xf3\xa6\x7b\xe4\x58\xb9\x6f\xe7\x97\x4c\xdf\x22\x11\x8e\x23\x07\x7b\xc8\x1b\xc7\x58\x32\xa5\xee\x2d\xff\xf2\xb8\xae\x4c\x95\x0b\x80\x22\xfc\x2f\xd6\x67\x3f\x84\x0b\x49\xe6\xef\xab\xfc\x72\xba\x8f\x5c\x88\x49\xff\xa8\xdd\x1c\xbf\x4c\xb8\xe6\xa9\x1f\xca\x1a\x5b\xbb\xc2\x52\x1d\x0d\x01\x92\x04\x2f\x52\xbe\x79\x96\x44\x26\xfd\x25\x93\x03\x76\x87\x48\xaa\xae\xa8\xf8\xba\x04\x4d\xbe\x22\x3b\xe5\xec\xd2\xc8\xef\x7f\x4d\xf7\xc4\x9f\x77\xce\x00\x09\xfb\x7f\xd7\x30\x35\x55\x6a\x3e\x20\xcd\x87\x5a\xcf\xf9\x8b\xd2\xd3\x7e\xd1\xa9\x0b\xd8\x97\x78\xbd\x2a\xf3\x55\x17\x37\x75\xc9\xc7\x13\xfa\xce\x00\xe9\x85\xf7\x9f\x34\xf7\x31\xf2\x18\x1f\x37\x89\xa3\xa5\x1f\x0d\xcc\x02\x69\xde\x6a\x33\x16\x35\xb0\xf7\x7b\xac\x08\x5f\x58\x2b\xe5\xb0\x93\xbf\x0e\x90\x41\xd8\x93\x74\x3d\xbd\xb6\x95\x27\x69\x8e\x4d\x9c\xd7\x0b\xdd\xa5\xcb\x63\x35\x75\x36\xf3\xc3\x8b\x20\x6e\x4e\x95\x3f\xa2\xe7\x56\x0d\xa3\xdb\x71\x00\x09\x82\x1f\x3f\x37\xae\x28\x24\x18\x26\x72\x56\x83\xf5\xfc\x91\xd7\x0f\x52\x32\x1f\x3c\x7d\xb1\x1f\x29\x50\xa1\x78\x2a\x7d\x4e\xa2\x81\xff\x74\x82\xc4\x3f\xb2\x59\x45\x9a\x6d\xde\xec\x8e\x76\xf2\x98\x7c\x16\x0f\xe8\x45\x8f\xb9\x31\x19\x2d\x1e\x30\x8e\xb6\xcd\x98\x94\x16\x0f\x00\x68\xb3\x80\x45\x6a\x09\x80\x1c\xea\xa5\x50\xb2\x7f\xe3\xb6\x40\xa9\xd4\x8f\xe4\x25\x0e\x20\xf3\x30\xbd\xb1\x9e\x9b\x74\xdc\x3c\x45\xf2\xf6\xe7\x6c\x76\xb6\x67\xfa\x86\xc4\x94\xdf\xf0\x4c\xde\xbe\xf0\x5f\x24\x73\xa4\x5d\x8a\x6d\x79\x77\x71\x00\x59\x82\x93\xc8\xd8\x57\x3f\xf2\xc7\x5e\x89\xaa\xa3\xb6\xdd\xef\x9b\x9b\xd7\xe2\x23\x69\x8d\x26\x06\x66\xac\xc4\xd6\xb6\x62\x9a\x1f\x8e\xc8\xa9\xe1\x80\x22\xfc\x0f\xf6\xbf\x77\xed\xdd\x55\x2a\x66\x2f\xed\xcd\x26\x4e\xa9\xe0\x6e\xcb\x52\xb9\x63\x65\x5d\xb5\xbe\x21\x64\xbd\x14\xa7\x6b\x40\x92\xbd\x85\x03\x8a\x77\xe1\x8b\xdd\x27\x8b\xcf\xe4\x50\x06\xe8\xbf\x7f\xf5\x74\xe6\x71\xba\x8c\x9f\x79\x50\x9c\x47\xa5\x9a\x66\x16\xcd\xc3\x2f\xe6\x6c\xc1\x7b\xde\xe1\x00\xe2\x0d\x1f\x22\x1c\x0d\xa5\xfa\x5c\x26\x9a\x71\xf9\x81\x22\x7b\xb5\xd2\x0b\x59\x9b\x1e\x5e\xf3\xb5\x3d\x0f\xff\x2c\x2e\xf5\xce\x19\x71\x2e\x8d\x12\x3f\x4d\x85\x35\x49\x82\x33\xe7\xd1\x9b\x15\x58\xb3\x24\x00\x96\xd0\xcf\x09\x61\xcd\x13\x0f\x50\x34\x23\x8e\xc7\x9a\x28\x61\xfc\x5d\xa2\x41\x58\x13\x25\x18\xe4\xcd\x4c\x7c\x01\x66\xeb\x82\x7f\xc1\x2d\xe2\x0b\x30\x7b\x17\xfc\x0b\x0a\xd1\xf6\x17\xab\x7b\x21\x00\x7a\xd0\x2d\x80\xd9\xbe\xe0\x01\x75\x28\x00\xb3\x81\xc1\x03\x5a\xfe\xf7\x97\x33\x18\x2d\x0c\x01\xb0\xf5\xbf\x4f\x4e\x60\x75\x32\x40\x99\xcf\x89\xe9\xbf\x3b\x4f\x81\x70\x56\xfc\x73\x2c\x5a\x99\xd7\x48\xcc\xbb\xe2\x8d\x1b\xc2\xdb\xac\x3f\xfa\x82\x65\xb0\xa4\x70\xd5\xc9\x86\xfe\xd5\x16\xf5\x11\xb7\xee\x21\x1c\x50\x3c\x06\x0d\xff\x9c\x64\xc3\x5b\xc8\x63\xac\x13\xfd\x83\x33\x2d\xf6\xd1\x57\x93\xb6\x06\x39\xa9\x2a\x51\xa4\x5e\xff\xd7\xe0\x8e\x13\x94\xbd\x03\xdb\xa9\x05\xe6\x01\x66\x31\x2c\x9c\x67\x8b\xa3\x3a\x96\x0f\x15\x5f\x9b\x0d\x98\x8f\xbd\xda\x31\xa1\x13\xdc\xf2\x5c\xdd\x20\x30\x5d\xff\xda\xc7\x66\x51\x1c\x40\xd6\xe1\x3d\xa9\xe3\x2b\x2f\xb8\x35\x5b\x2d\x48\xef\x40\x61\x9a\x7c\x23\xa8\xe9\x80\x51\xdf\x5e\x8b\x23\x36\xc2\x01\x76\x51\x96\x0f\x76\x35\x9b\x49\xfc\x9b\xd5\x04\xf7\x04\xd2\x12\x63\x08\xcb\x6e\x42\x0c\x1d\x23\xfa\x1f\xcb\x6e\x62\x1a\x45\x45\x1a\x2c\xc3\x09\x80\x75\x74\x85\x31\x3b\x49\x3c\xe0\x35\x0a\xc0\xec\x25\xf1\x80\x4e\x34\xe8\x30\xbb\x49\x3c\xa0\x0f\x05\x60\xb6\x93\x84\x9d\x89\xca\x71\x58\x0d\x25\x01\xd0\x8a\x26\x23\xcc\x8e\x12\x0f\xa8\x40\xdf\x80\xd9\x52\xe2\x01\x3e\xe8\x61\x0b\x66\x53\x89\x07\x24\xa0\x00\xcc\xae\x12\x0f\xf0\x42\x25\x45\xcc\xbe\x12\x0f\x58\x44\xe5\x38\xcc\xc6\x12\x0f\xa8\x45\xd7\x01\xab\xb5\x24\x00\x36\xe9\x89\xd1\x8d\xd9\x5c\xe2\xa3\xdb\x92\xf8\x02\xcc\xee\x12\xff\x82\x10\x54\xbe\xc3\xea\x2f\x09\x80\x68\x32\x34\x1d\x61\xb5\x99\x40\x89\xc5\xe9\xbf\xef\xb8\x7e\x80\x19\xe3\x45\x89\xc3\xac\xbb\x53\xa2\x6e\x29\x5f\x70\x7b\x93\x77\xb2\xc6\x54\xb6\x51\x74\xee\xee\x09\xfe\x7b\x53\x9b\xca\x3f\x36\xf2\x7e\x3c\xdb\xce\x91\x30\xdf\xe5\x38\xd3\x10\xfb\xa5\x9d\x36\x65\xe7\x42\x90\x79\x9e\x64\xb4\xa5\x5d\x47\x9e\xc9\xd1\x5d\xa3\x0f\xc7\x29\x8e\x19\xd7\x5b\x08\xa6\x6e\xe7\x00\x58\x59\x5f\xbe\x65\x60\xf4\xd2\x21\xbd\x64\x66\xd7\xa3\xc6\xe9\x2c\xc7\xd6\x5c\xef\x9f\x1a\x3f\x1e\xe5\x50\xe7\x5d\x39\xbc\xc8\x26\x5e\xb6\x3d\x07\x4f\x98\xf0\xce\xb2\xe0\xf4\xd7\xe2\xfd\xb5\xa2\x3b\x68\xaf\x1a\x32\xf3\x9c\xf3\x33\x27\x33\xff\x3d\x14\xd9\xc5\x7d\xa9\x2e\xb8\x54\xe7\x60\xb7\xc4\xbf\x99\x4d\x70\xcf\x07\xf4\x84\x0f\xcb\x6e\x62\x3d\x40\x63\x08\xcb\x70\x62\xc2\x43\xa5\x75\x2c\xcb\x09\x00\x4f\x74\x1f\x60\xf6\xf9\x78\x80\x1b\x0a\xc0\xec\xf4\xf1\x80\x01\x74\xd2\x58\xbd\x3e\x91\x89\xa0\x37\xd5\xb0\x9a\x7d\xa2\x97\x50\x2d\x1e\xab\xdb\x27\x00\xca\xff\xf7\xbf\x6b\x98\x4d\xbf\x12\x93\xde\x7f\x5f\x74\x7b\x05\x87\xe9\x53\x69\xa3\x26\x7b\x81\xeb\x25\x16\x7f\x15\xa8\x37\x06\x8b\xab\x71\xed\xaa\x3a\x9b\x4d\xdd\x46\xcf\xe4\x48\x24\x2c\xde\x6e\xfa\xe3\x00\xf2\x0b\xae\x6a\x51\x5d\xb7\x02\x48\x9b\x0f\x14\x4b\x8b\x6d\xf8\xff\x7d\xc5\x9c\x50\x59\xfb\xeb\xa3\xa1\x86\xd8\xc9\xb7\xb4\xe0\x14\x35\xd3\x8b\x8f\x38\x80\x64\xc1\xcf\x57\x13\x66\x39\xfa\x92\x22\xe1\x37\xc9\xaf\x01\x32\xfa\x1a\x81\xe4\x1e\xd1\x58\xcf\x23\x3b\x9e\x65\x55\x78\x26\x2b\x59\xac\xb1\x67\xe1\x00\x12\x0b\x6b\x0b\x52\x97\x14\xc7\x5c\xdf\x7f\x49\xa5\x72\x8e\x7a\x47\xba\x71\x31\xab\xab\x53\x80\x95\x56\xe0\xf8\x26\x73\x44\xde\x31\xe6\x80\xfd\xd7\x25\xfe\xcd\x6c\x82\x7b\x5e\xa1\x2b\x86\x65\x37\x01\xf0\x0b\xad\x51\x58\x86\x13\x00\x59\xe8\x1b\xb0\x2c\x27\x00\x62\xd1\xdc\x88\xa9\xba\xe0\x01\x1b\x68\x7f\x83\xa5\xbb\x10\x99\x14\xfa\x06\x4c\xe1\x05\x0f\x70\x42\xa3\x0e\x53\x7a\xc1\x03\x62\xd0\x0a\x82\x25\xbe\x10\xc9\xc5\xff\xdc\x8a\xa1\xbe\x10\x00\xed\xe8\x1b\xb0\xe4\x17\x02\xa0\x0c\xa5\x2f\x98\xfa\x0b\x1e\xe0\x82\x5e\xde\xc2\x54\x60\x08\x93\x46\xe7\x80\xa5\xc1\x10\x00\xa3\xe8\x21\x36\xa6\x08\x83\x07\x94\xa2\xad\x2f\xa6\x0c\x83\x07\x54\xa2\x5e\xc2\x12\x62\x08\x80\x0e\x4a\xf4\x00\x18\x4b\x8f\x01\xca\x08\x09\xdf\xe9\xff\x7e\x58\x00\x4b\x15\x37\xd6\xcd\xfe\xdc\x1c\x27\xb9\xbc\x72\x2f\xdb\xb0\xeb\xbb\x91\x93\x6f\x60\x7d\xe4\x8b\x4d\x4d\x16\x0d\xb5\x7b\x73\x81\xdf\xf8\xd2\x70\x00\x29\x82\x05\xa5\xf1\x90\x20\xc4\x24\xf3\xb6\x4b\xfc\x55\xfd\x0c\x11\xfb\xef\x3b\xaf\x3d\x70\x68\x2c\x2c\xbf\xff\x97\xc9\xeb\x82\x8c\xf7\xf9\x2b\xd1\x38\x80\x84\xc3\xcf\x27\xa5\xeb\xb8\x37\x2d\xd2\x6d\xfb\x47\x34\x61\x2a\xfc\xd3\x5b\x4b\xb5\x33\x45\x4e\x9d\x5b\xfc\x6b\xce\x14\x2d\xb4\xee\xb2\x13\xaf\x71\x00\x49\x87\xc7\x37\xd5\xd5\x71\xa9\x7c\xd1\xd1\x69\x4a\x57\x1f\x97\x3d\xf2\xd9\xe0\xf5\x90\x2e\x6f\x84\x8f\x48\x71\x3f\xf9\x8d\x0f\x2f\xaa\xba\x88\x2c\x1b\xcb\x6c\x82\x7f\xea\xd1\x15\xc0\xb2\x9b\x00\x28\x42\x57\x00\xcb\x70\x02\x20\x1c\x7d\x03\x96\xe5\x04\x40\x3a\x0a\xc0\x52\xc4\x88\xcd\x20\x5a\x69\x31\x25\x31\x82\x5a\x81\xca\x1b\x98\xa2\x18\x1e\xf0\x13\x2d\x9c\x98\xb2\x18\x1e\x30\x4d\x45\xa4\x77\x98\xc2\x18\x9e\xde\xf1\x10\x5f\x80\xa5\x8c\x11\x5e\x90\x84\x3a\x09\x53\x1a\xc3\x03\xc2\xd0\xdd\x8f\x29\x8e\x11\x32\x18\x9a\x23\xb1\xe4\x31\x02\x60\x10\xf5\x2a\x96\x3e\x46\x00\x04\xed\x5e\xfa\x43\xf8\x9b\xb0\xea\x92\x3c\xaa\x03\x85\xeb\xcf\x8e\x6f\x84\x91\xac\x46\xb3\x92\xa7\xfe\x4d\xf1\xfd\x7e\xca\x93\xf5\x36\x43\x77\x34\x1b\xaf\xbf\x37\x50\xde\x5a\x23\x7c\xbf\xc8\x1d\xbe\xec\x59\xf3\x7a\x97\x53\xf8\x28\x75\x23\x0b\xaf\x49\x64\x7f\xe6\x58\xee\x31\xb7\xde\x97\x46\xf9\x2f\xf7\x7a\xb9\xd9\x92\x01\xba\x02\x6d\x80\x7c\x86\x87\xcb\x38\xc5\xea\x97\x5d\xa4\x52\x69\xcd\xa0\xb6\x0a\x93\x5d\x28\x78\xfa\xe5\xce\xe4\xa8\x94\x0b\x25\xb2\x67\x50\x96\x34\xd5\x7f\x15\x00\xa4\x08\xae\xcd\x46\x8d\xa1\xda\x27\xbf\xd9\xad\x33\x9d\x79\x9f\xa2\xe1\x9c\xa0\x78\xcb\x24\x41\xe7\x54\xa2\x62\xcc\x3e\x33\x27\xcd\x3d\xeb\x26\xb3\x00\xa9\x82\x1b\xe6\xad\x86\x30\x8e\x07\x4e\x83\x2d\x01\xae\x76\xb4\x0d\x41\x6c\xb6\x26\x7a\x2e\x32\x97\x2b\x5e\xd6\xf0\xca\x96\xb5\x71\x7b\x26\x7d\x82\x86\x52\xdc\x5c\x6e\x35\xb5\x64\xf8\x59\x9a\x8d\xd8\x0b\x50\x67\xf6\x5e\x39\xee\xa4\x7f\x3f\x40\x4d\xfe\x19\xd7\xb5\xa2\x59\x85\x39\x5e\x00\x90\x8c\xff\x77\xf9\xc9\x74\x23\x27\xc9\x53\xa9\x70\xa0\xa5\xe5\xb0\x97\xa5\x68\x9c\x2c\x99\xf9\x7e\x4d\x36\x67\x1e\xfb\x02\x36\x13\x17\x61\x33\x03\x80\x7c\x87\xb9\xef\xeb\xec\x0d\x27\x1a\x99\xe5\x4b\x72\xbd\x0d\xc6\x59\xe6\x35\xfe\x25\x73\x8c\xee\x4e\xd7\xda\x37\xea\x82\xb9\x9a\x94\x3e\xb5\x8d\x3b\x03\x24\x03\x26\x39\xf7\x67\x5d\x8f\x2f\x8c\x88\x49\xae\x14\xc5\x74\x51\x3e\x94\xeb\xc9\xb4\x4a\xf6\x12\xf7\xd8\xe7\x7a\x75\xed\xca\xed\x66\x76\xde\x50\x80\x14\xc3\xd4\xfd\xfd\xb8\x63\x6d\x5c\xeb\x92\x61\x5b\xbf\x5d\xc7\xea\xeb\xcd\x5b\x45\x3c\x9f\xc2\x19\x9e\xbf\xd1\xd7\xcc\xf5\x38\x10\x3f\x38\x4d\x02\x90\x6e\xf8\x40\x3a\x6e\xe3\xae\x77\x9f\x10\x83\xd4\x41\xff\x81\x40\xf7\x64\x89\x13\x1c\x69\x89\xb5\x0c\x7a\xeb\x03\xe7\xac\xab\xbe\x74\xa6\x0c\x7a\x6c\xe7\x21\x58\x8f\x6d\x36\xbe\xed\xa6\x98\x7d\xf8\x2b\x43\x4e\xa2\x6d\x57\x7b\x9c\x82\xd7\x67\x0e\x03\x41\x8f\x28\x06\xcd\xb7\x06\xf5\xeb\xe6\x24\xd1\xd0\x50\xce\x4c\xee\xe1\x7d\x0b\x9c\x6c\x62\x37\xdb\x48\x24\xa8\x2e\x31\xc7\x84\x6c\x2d\x5c\xc7\x3d\x79\x1b\xf2\xe0\xbd\xa1\xf8\x73\x03\x73\x00\x90\x98\xff\xf7\xc3\xea\xf3\x19\x27\x0c\x79\xcd\xae\x91\x1f\xdf\x3b\x73\xdb\x3d\xc2\xbf\xf3\xab\x57\xf2\x9a\x97\xc1\x83\x90\x87\xb3\x3d\xcb\xab\x79\x75\x00\x59\x83\x15\x96\x77\xf4\x2e\x4f\xad\x1d\xdf\x65\xda\xe9\x0a\x52\x1a\x14\x3f\xb3\x49\xf3\x0e\xcd\x2c\x9f\x61\x3c\xf5\x26\x4a\xaa\x2f\xa4\x38\x3e\x04\xe6\x89\xd2\x6d\xeb\xa5\x61\xbf\xba\xbf\x4c\x8c\x3d\xb6\xd6\x7d\xa5\xcf\x28\x69\x47\x45\x3f\x4a\x7f\x63\x85\x91\x43\xc3\xc2\xaa\x49\xcb\x19\x20\x3f\xe0\x58\x1c\x41\x78\xc6\x05\xce\xce\x4f\x0a\xe7\x94\x07\xed\x65\xcc\xfb\xf9\x25\xa5\xe1\x98\xf3\x91\x49\xca\xf8\xd1\xd8\x8c\x03\xe7\x35\xbe\x02\xe4\x27\x7c\x9e\x5b\x68\x11\xe9\x68\x4e\xab\x6d\x7d\x69\x55\xcf\x39\xf6\xbc\x76\xc7\x4f\xb6\xae\xd9\x15\xf6\xd1\x09\x92\x6a\x0a\x69\xf9\xa9\xab\x4b\x00\x99\x81\x15\xc9\xa0\x49\x1b\xf9\xd5\x36\xa1\x38\xa6\x15\x23\xa3\xe2\x03\x5e\x39\xb3\x64\x21\x16\xb3\x6d\x6f\xc2\xc8\x99\x3f\xd8\x51\x2d\x7d\x88\x02\x00\x71\x83\xad\x31\x4f\xa3\xb9\x6f\xa2\x42\x47\x7b\xcc\x5d\x43\xeb\x44\xb5\xab\x15\x23\xc5\x6c\xee\x4b\x4e\xe3\x80\x9e\xba\x5f\x46\x4c\xf1\xaa\xc5\x00\x89\x82\x1f\xaf\xb9\xa1\xac\x3c\xe5\xf5\x20\xaa\x4e\xee\x75\x46\xdc\x43\xde\x7b\x3e\xf6\x23\xf2\x91\x51\x63\x2a\x2e\xa1\xbb\x47\xf6\xd6\x1f\x85\xeb\xe1\x61\x66\x49\xd3\xbd\x55\xc1\x0f\x54\xbb\xbd\x5c\x3a\xba\x90\xa2\xcb\x7e\xbf\x4f\xd4\xaa\x4a\xa5\xb2\x16\x45\xe6\xbf\xe4\x3e\xcc\x82\x03\xc8\x27\xf8\xf4\xd4\xca\xfc\xf5\x0d\xb6\x6a\x4b\x73\x81\x53\x8c\x6e\x9c\xcd\x4a\x14\x8e\x64\x83\xd6\x5d\x07\xc2\x4e\x5d\x1a\x19\xa6\x4b\xeb\x3e\x13\x08\x0d\xb5\x5c\xe0\x6b\x17\xd8\x4d\x52\xca\xb1\x79\xd5\xe1\xf0\x71\x91\x13\x14\xc7\x86\x9a\x7c\x1f\x4d\xbd\xb1\x1f\x32\xf7\x65\xe4\xf0\xda\x00\x00\x69\x82\x45\x66\xa7\xc8\xce\x99\xf4\x04\xa5\xf3\x0a\x77\x8f\xaa\x4c\x32\xdd\x73\x12\xb5\xb0\xca\x09\xae\xcd\x71\x62\x7b\xfd\x35\x77\xe5\xd6\x4d\x3d\x80\xac\xc3\xb1\xe2\xba\x96\xa8\xd6\x62\xad\xfb\x21\xec\xe3\x50\x48\x8c\x4f\x9d\xe9\xee\x04\x99\xa2\xd5\xe0\xfb\x76\x42\x0c\xd6\xff\xc7\xd8\x75\xc7\x63\xf5\x7f\x71\xa4\x84\x86\xc8\x28\x7b\x54\x84\x50\x84\x8c\xb8\x54\x46\x94\x8c\x48\xa5\x24\x94\x9d\x42\x08\xcf\xc7\xcc\x8c\x64\xef\xbd\xa2\x64\xaf\xec\xbd\xf7\xcc\x16\x42\xf6\xac\xfc\x5e\xbe\xcf\xe3\xfe\x6e\x7f\xdd\xfe\xbf\xef\xe7\x9e\x73\xee\xf9\x9c\xf3\x3e\xef\xcf\xe7\xb9\x57\xf5\x26\x8b\xb9\xad\x23\x80\x62\x90\x9b\x8a\xb5\x26\xf6\x79\xd2\xcf\x31\x5a\x3b\xeb\xb1\xe4\x53\x7c\x3b\xec\x5e\x34\xfa\x4b\x85\x0b\xcf\x03\xe3\x37\x3a\x63\x86\xb8\x8a\x14\x00\x94\x8c\x5c\xd2\x5f\xc3\x8e\x2c\x87\x7d\xa9\x50\xbc\xf1\xf3\xd2\x88\x77\x9f\x9a\xed\xcd\xc9\xeb\xe7\xc6\xea\x43\x98\xba\x54\x08\xa8\x87\xae\x2b\x74\x01\xa8\x03\x59\x5c\x3e\xe7\x5d\x35\x58\x7b\xf2\xdb\x75\xa0\x64\x3d\xc2\x89\x5a\x29\xe2\xdc\xcf\x36\x99\x87\xf7\x5d\xd4\xef\x1b\xe9\x5e\x9e\x62\x0e\x44\x9e\x17\x19\x95\xdf\x8c\x77\x0d\xed\x98\x54\xb7\x3d\x9c\xa4\x21\xa1\x33\x17\x9e\x46\xf5\xf8\x1c\x75\x2f\xf8\xac\x1b\xe0\xb6\xd9\x7c\xfd\x19\x72\xdb\xff\x1a\x43\xec\x97\x7c\xe1\xf8\xa3\xbd\xae\xe6\xdb\xb7\x6e\x37\xb9\x2b\x9f\x4b\x2a\x19\xad\x3f\xe9\x99\x2e\xe4\xfc\x27\xad\x78\x18\x00\x28\x1c\xb9\x94\xf9\x6c\x4f\x8d\x29\xb1\xd1\x9b\x1c\xbd\xe3\x9c\xaa\x9e\xd5\x29\x68\x7f\xfc\x7c\xb2\xe0\xa2\xbe\x9e\x57\x6a\xb1\x7e\xca\x03\xc6\x11\x00\xb5\x23\xeb\x50\xc3\xb9\x13\xe4\x8f\x6d\xad\x08\xdc\x2b\x02\x2b\xbb\xbf\xff\x61\xfc\xc4\x71\x46\x74\xba\x2e\xe4\x46\x5b\x4a\x6f\xc5\xa3\xcd\x67\xa4\x00\x48\xea\x22\x2e\xcf\xf9\x3e\xe7\xe5\x40\xbf\xa6\x68\x5f\xee\xc0\x4f\xf3\x93\xe4\x7e\xde\xaf\x9d\x97\xd3\x21\xa3\xe2\x69\xb1\x77\xc6\x08\x06\xb6\xd2\x01\xf4\x1e\x99\x5a\xc9\xbc\x80\xf2\x56\x60\x30\x65\xf6\x79\xaa\xe8\xea\x03\xbe\xa7\xa3\xcb\xd2\x4c\xae\xdf\x6b\xe4\x0d\x32\xa8\xb3\x93\x39\xa8\x40\x82\x01\x50\x0b\x72\x34\x0b\xff\x72\xc1\x9c\x6f\x27\x46\xb2\x50\xfe\xe8\x51\xaf\xf5\x26\x9e\x2b\xfa\xae\x07\xd3\x14\x47\xce\x6a\x9d\x9e\x1d\xf6\x5e\x67\xa0\x45\x5c\x9a\x46\x98\x2e\xb7\x6b\x13\xf7\x58\xd4\xc2\xf3\x7a\xd7\xfb\xd0\x8c\xc4\xdc\x03\x25\x72\x8b\xf3\xc9\xd5\x77\x78\x1a\x2e\x09\x95\xd4\x39\x02\xc8\x15\xb9\x7e\x26\x8e\x99\x54\x65\x91\xce\x0d\xae\x5d\x31\xd1\x5d\x67\xf6\xb1\xb9\x65\x42\x69\xe3\x5a\x6c\x95\xe0\x1e\xcd\xa4\x8c\xdf\xa2\x7c\x0e\x40\xb1\xc8\x30\x6a\x5e\xb5\xd7\xcb\x75\xf3\xac\x3f\x64\x21\x85\x5f\xfa\xa5\x71\xa6\xb0\xae\xf4\xba\x39\x7d\x36\xde\xf3\xbc\x97\x31\x1d\x4e\x04\xa9\x00\xca\x46\x72\x3e\x28\x64\x31\xd5\xad\x3a\x40\xb6\x77\x3c\xab\x4d\x96\xd9\xe4\x45\xd4\xc4\x1f\x9f\x4b\x97\xa6\x29\xd7\x23\x04\x19\x9e\x3c\x08\x7b\xb4\x47\x74\x91\x65\x6b\x97\x5e\xb6\xc3\x96\x50\xd0\xcb\xbb\x83\x8f\x3c\xe5\xd3\x22\xc1\xe0\x83\x43\x69\xcb\x9f\x89\x6f\x4f\x30\x1d\xbe\xd8\x7c\xbe\xeb\x29\xe2\x52\x1f\xcb\xa5\xad\x95\x1f\x2c\xc1\x5e\xd2\x32\x3c\x2f\x44\x4f\x12\x7d\xcd\xe4\x48\xb1\xe3\xba\xeb\x4e\x77\xd1\x34\x49\x6a\x34\xce\xc5\x11\x40\x5e\xc8\x4d\xff\xa3\x49\xb4\xbf\x3d\xe9\x2f\x24\x47\x11\x09\x7b\xe4\x1d\x15\x30\xb5\xd5\xa6\x5e\x3a\xd8\xdf\xa4\x33\xd7\x42\x23\xb0\x19\xa2\xda\x0e\x20\x5f\x64\xa1\x10\x54\x75\x90\x3e\x7c\xfc\xc9\x5b\xd7\x60\x8e\x9b\x32\xa6\x8c\xa1\x17\xb9\xfb\xdf\xd8\xfb\xa7\xfb\x57\x7a\x2e\x0e\x4e\x5f\x30\x5f\x00\xd0\x47\xa4\xc6\xf3\x8c\x23\x50\x60\x39\x7e\xcd\x76\xab\xe1\x9d\x05\xa6\xe9\x90\xe3\x85\x13\x24\x35\xda\xd9\x3d\xee\xd5\x62\x77\xbe\x4c\x1b\xd0\x23\x1f\x66\xfa\xab\x7b\x6f\xef\xaf\x93\xf4\x5f\x97\x7d\xea\xed\xa2\x61\x71\x1d\x8f\xa8\xda\x69\x21\x92\xb8\xea\xca\x11\xe6\x4e\xca\xeb\x3a\x7b\x75\x25\x01\x59\x57\x84\xb6\xdc\x59\xa4\x35\xd5\xfb\x47\xa5\xec\x5f\x42\x6f\x0e\x93\x25\x8e\x2a\x0b\xa7\xdf\x09\x9f\xe1\x38\x24\x6b\x18\xd8\xb8\x46\x04\x00\x14\x82\x4c\xdd\x00\xb2\xda\x30\x9b\xb2\x82\x00\x83\xb5\x61\xce\x45\xca\xaf\xb2\xd1\x57\xaa\x46\x3a\xe5\x63\x1f\xe6\xb0\x19\x3d\x76\x7c\x67\xe0\x04\xa0\x22\x64\x07\xd5\x93\x29\x16\xad\x9c\xc1\x3f\xe8\x1c\x13\xaf\x25\x90\xe9\xee\x98\xbb\x26\xf9\xf6\x83\xec\xab\x6d\x5e\x73\xf9\x20\x7e\xeb\xa1\x26\x00\xa0\x22\xa4\x39\x4a\xa9\x27\x5f\x9f\x69\x7b\xee\x68\x4f\x33\x22\xbd\xae\x36\xdb\xe4\xff\xf2\x0c\x6f\x67\x57\xdd\x18\x49\x76\x49\x8f\x5c\x66\x6f\x23\x80\x06\x91\xc5\x42\xf1\xc8\x8f\xbc\x1f\x42\xcd\xae\xa3\x95\x26\xdf\xff\xcc\x6b\x9f\xbf\xa4\xff\x80\x85\xee\xc8\xfa\x8d\xd2\xf5\x22\xe2\xc0\xf5\xbf\xfe\x6f\xc9\x18\x7a\xe1\x4b\xc0\xb6\xb4\x77\x64\x09\xed\xf4\xfa\x0f\xb9\x1c\xee\x91\x1a\xa5\xcb\x18\x3a\xfe\xfa\x73\x8f\x25\x89\xf0\x5a\xf7\x05\x05\x54\xea\x24\x49\xf6\xdf\xee\x24\x7c\xba\x12\x95\x3c\x61\x01\x19\x30\x00\x95\x3d\x61\x01\xc5\xf0\xf4\x8e\xc6\x9f\x70\x80\x6a\x72\x58\x02\x42\xa5\x51\xd2\x87\xf0\xf0\x98\x1c\x31\x00\xda\x41\x36\x53\xbe\xa7\x97\x1f\x31\x5c\xf4\xb8\x73\xfa\x62\x32\x1f\xd9\x3d\x4f\x9e\x11\x22\xa1\xb9\xa0\xed\x2f\x6e\x5b\x3d\xdf\x4f\x24\x9f\xc8\xbb\x06\x00\x94\x89\x8c\x3e\x1f\xd5\x4b\x52\xd3\xea\x17\x1a\x77\x39\xe2\x8f\x0b\xe6\x2d\x8f\x1c\xfd\x9e\xc4\xda\x75\xd9\xb5\xe5\x48\x4b\x0f\xd5\xb3\xb8\x36\x7d\x00\x35\x20\x53\x67\xf8\x20\xf9\x19\x56\xe5\x1c\x27\x16\x9a\xd1\x09\xfd\xa4\xc1\x5e\xbf\xd7\x65\xe1\xdd\x57\x1c\xbb\x05\xec\xc6\x42\x98\x19\x56\x04\x31\x00\xaa\x47\xd6\xb1\x05\x8a\x84\xd1\xcb\x6e\x6b\x8b\x0c\x89\xce\xf3\x67\x7c\x0c\x4c\xd5\x5e\xda\x6a\x12\x1f\xb9\xd6\xce\xdf\x9b\x7c\x99\x5f\xe8\xea\x08\xef\x3f\x5a\x8d\x0d\xcf\x0e\x2c\xc0\xa3\x9a\x8d\x05\x64\xc2\xe7\xb6\xd1\x0c\xc7\x01\x1a\xe0\x71\x08\xcd\x72\x1c\xa0\x1e\x1e\x1a\x51\x79\x2c\x16\xf0\x05\x36\x09\x8d\xc9\xe2\x00\x03\xb0\x49\xa8\x54\x16\x77\x07\x58\xdc\x40\x25\xb3\x58\x40\x09\x3c\x65\xa2\xd1\x59\x1c\xa0\x0f\xde\xa3\x44\xe3\xb3\x38\x40\xe3\x01\x58\xab\x40\xa5\xb5\xd2\xfe\x78\x12\xff\x1d\x56\x1f\x45\xf6\x09\x4c\x06\x3d\xd7\x48\x7b\xcc\xea\x94\x81\xb7\xb9\x01\xd7\x71\x59\x3d\xe9\xe9\x8d\xf7\x94\x44\x1e\x24\xac\xb1\x27\xbe\x97\x18\x8f\x63\x00\xb4\x8a\x5c\x07\x05\x99\x35\x9e\x78\x7d\x4e\xd4\x46\x1f\x57\x54\xa6\x1d\x4d\x5d\x3b\xee\xc5\xd9\xde\x76\xb8\x28\xf6\xb9\x2c\xfe\x5c\xb3\xdf\xa3\x2e\x0c\x80\x7c\x91\x04\x8a\x39\x84\x4d\x29\xc3\xf3\xae\x52\x68\x59\x0c\xed\x87\x4a\x9f\xaa\x9e\x70\x8a\xd4\x46\xf5\x93\xcc\xb2\x85\xa5\xce\x78\xc7\x2c\xe2\xf7\xec\x41\x96\x73\xf6\x0e\xc2\x7b\xbf\xef\xfa\x64\x0b\xd0\x2a\x5d\x97\x7c\x7a\xd9\x9d\x80\x5e\x78\xf1\xa8\x4a\x8f\x58\xcd\xa2\x00\x66\xd4\xe8\x77\x24\xef\xbf\x99\x8d\x8b\xcf\x28\x3c\xf3\xa2\xd9\x8d\x03\xac\xc2\x2b\x01\xcd\x70\x1c\xc0\x17\xde\xec\x42\xb3\x7c\xdf\x24\x58\xb3\x47\x1d\x2c\xb0\x80\x38\x58\x22\x43\x1b\x2d\xf6\x57\x33\x31\xfc\x87\x48\xb4\x09\x03\x48\x95\x4a\xdc\x76\xc6\x00\xa8\x08\x59\x5c\xe8\x48\x4d\x8b\xa5\xee\xb1\xb0\x4d\x28\x48\xaa\x44\x67\xf1\xbe\x88\xbe\x76\x63\x60\xec\x50\xbc\xe3\x58\xa4\xd6\xf5\x60\xdd\xb7\x61\x7b\xeb\xf9\xaf\x61\x6d\x62\x7d\xad\x8b\x7f\x8d\x4d\x96\x0e\xf4\x78\x1e\x77\x72\x38\x8c\xd9\x0c\x15\xfe\x2e\x76\xa3\xb8\x88\xda\x80\xfa\xd7\xd7\x85\xbd\xb8\x22\xdb\x4d\x05\x93\x66\x28\x9d\x83\x27\xe3\x8d\x64\x53\xd7\x8b\x9b\xca\x86\x19\xf7\x76\x93\x42\xd7\x74\x35\xe8\x74\x36\xc4\x75\x3d\xd8\xa5\x30\x00\x6a\x42\xe6\x44\x73\x84\x5f\x5f\xde\xa9\x0f\xc5\x74\x9e\xba\xcc\x1c\xd6\x37\x9e\x91\xce\xb0\xd7\x6b\x78\xf7\xbf\xb7\xb2\xc2\x67\x96\x34\x76\xdc\xb3\x3f\xf4\xaf\xd7\x38\x47\x08\x1f\xb7\xf6\xad\x09\xe9\xce\x10\xee\x0e\x91\x0c\xce\x79\x36\xaf\x91\x6f\xda\x93\x70\x94\xd5\xec\xcd\xa9\xc1\x64\xe2\x4d\xde\x7f\x73\x13\x17\xce\x22\xb8\x12\xa1\xf9\xb9\x5f\xeb\xe0\x55\x8c\xe6\xe8\x7e\xd2\xc1\x5b\x20\x68\x9e\xe2\x00\x4d\x70\x0e\xa1\xb9\x8a\x03\x84\xc2\xfa\x38\xea\x0c\x89\x05\x0c\xc1\x2d\x19\x75\x8a\xc4\x02\x26\xe0\x85\x83\x3a\x47\x62\x01\x3f\xe1\xbf\x8d\xa2\x0e\x92\x58\x80\x1b\x6c\x12\xda\x28\x89\x03\x44\x9f\x80\xd7\x01\xda\x44\x09\xa4\x88\x69\xfe\x7b\x7f\xc0\x2c\x72\x1d\xf0\x2b\x97\xaa\xdc\x16\x37\xda\x2d\xa5\xea\xa0\x0f\x0f\x1d\x5a\x3f\x26\xd6\x43\x22\xb8\xf2\xc0\x07\xaa\x5a\x78\x8a\xe7\xcf\x2a\x8d\x01\x90\x23\x92\x5f\xd6\x1b\xae\x2a\xea\x6b\x31\x9e\xeb\x0a\x67\xf6\x2a\xad\x4d\x7f\x12\x65\xcf\xca\xaf\xf7\x90\x21\xa8\xc6\x70\x8b\xac\xd8\x6e\x38\x02\x03\x20\x3f\xe4\xba\x91\xbb\xe5\x2a\x56\x12\x28\x8a\x67\x37\xf5\xc5\x9b\x2c\x99\xd1\xa1\x68\x3d\xdb\x35\xcc\x3f\xb3\xbf\x85\x63\x3d\x3e\xd6\xc6\xb2\x1b\x03\xa0\x2a\x24\x47\x1f\x4c\x8d\xb3\xbb\x5e\xaa\xaa\x15\xc1\xd0\x3a\x6d\x5c\xfb\xa4\x99\x58\x96\xa1\x8a\xf9\xe7\xf4\x73\x0b\xc1\x58\x85\xc3\x55\x3f\x14\x31\x00\xf2\x46\xd6\xde\x09\xdd\x47\x67\x97\xc9\xae\x61\x1e\x15\xce\xed\x9e\x6d\xbd\xe6\xa7\x90\xd3\x5e\x47\xce\x52\x94\x24\x3b\x16\xee\x45\x94\xb4\x54\xce\xfb\x6f\x6e\xe2\xc2\x39\x0b\xaf\x03\x34\x3f\x71\x00\x47\x78\xdb\x07\xcd\x51\x1c\xc0\x0f\x5e\x38\x68\x9e\xe2\x00\x55\xb0\x42\x89\xe6\x2a\x0e\xe0\x0d\x57\x6b\x34\xcd\x00\x07\x48\xa1\x82\x4f\xa9\xa1\x4a\x07\x50\x94\xd3\x5e\x7b\x5d\x47\x0a\x02\xad\xcd\xa2\x4a\xcc\x1c\xc7\x62\xdf\xbe\xbe\x32\x1b\x9f\x30\x93\xcd\x1d\xd3\x23\x66\xaa\x40\x75\xb1\x48\xd8\xfe\xd2\xb6\x50\xda\x25\x0c\x80\xc2\x91\x8f\x4c\xaa\xab\x29\x56\x57\xdf\xf4\xc4\xd6\x6f\xe1\x3e\x9f\xd2\xb7\x37\xa2\x28\xbe\x24\x1d\x0a\x0e\xac\xb8\x90\x6e\x98\x38\x66\xf9\x66\x71\x8f\x55\x20\x87\xc8\xae\x04\x96\xee\xb7\xae\x22\x1d\x44\x94\x47\x8b\xc2\x5e\xf0\x6e\x14\x13\x13\x7e\x1e\x2a\x3f\x34\x7f\x28\xf2\x76\x3b\x07\xa3\x45\x24\x00\x90\x37\x52\x86\x7b\xf2\xab\xb7\xdd\x73\x61\xdb\xc0\x4e\xfa\x6e\x9d\xfb\x03\xfc\x13\x0a\x8e\x6a\xb7\x5a\xcf\x9a\x79\x48\x9d\xa1\x58\xfa\x6e\xf2\x5e\x19\x40\x65\x48\x73\xec\x27\x9f\xf1\xb5\x3b\xfe\xfc\xb8\x28\x96\x65\x18\xb4\x2e\xba\xb0\x6d\x33\x3b\x44\xf3\x9a\x26\x59\xec\x92\x80\xdc\xe3\xf5\x0d\x1a\xde\x7f\xf3\x12\x17\xcc\x75\xb8\x93\xa1\xb9\x89\x03\x84\xc3\x8f\x0b\xd5\x4f\x1c\xe3\x82\x6b\x04\xaa\xa3\xb8\x84\x80\x29\x1a\x9a\xab\x38\x40\x19\x6c\x12\xaa\x34\x84\x05\xb4\xc2\x00\x34\x71\x08\x07\xf8\x05\x47\x09\x55\x1d\xc2\x02\x62\xe0\xe2\x8e\xaa\x0f\x61\x01\xc9\xff\x7f\xc1\x26\x8a\x42\x84\x03\x74\x90\xc3\x34\x13\x4d\x28\x02\xd2\x6e\x78\x84\xff\x9d\xf4\x28\x45\x4a\x51\xc9\x16\x0b\x94\x4c\xa5\xb9\xc4\x55\x3e\xb9\x43\x81\x86\xc7\x98\xed\x1f\x68\x7d\x5a\x11\x48\x2f\xac\x11\xf4\xf7\x97\xaf\xb7\x65\xd8\x6b\x08\xc8\x96\x4f\x52\x7e\x97\x86\x27\x4c\x3c\xf1\xb7\x79\xba\xbb\x5e\x45\xa0\x6a\x30\x6b\x69\x68\x07\xf9\x8b\xc8\xfb\xea\x31\x47\xd9\xd2\xf3\xf6\x28\x42\x31\x32\xaf\xc5\x0e\x6c\xfa\xd9\xed\x48\xea\x8c\x5c\xe6\xca\xe3\x48\x7c\xf5\xdc\x71\xe6\x78\xe0\xe9\x68\x71\x4a\xe5\xd5\x1b\xfc\x6e\x10\x6d\xf1\x5e\x98\x90\xa5\xdd\xae\xa4\xf4\xe9\x4e\xe4\xa3\xb9\x3b\xfe\xd7\x36\x9e\x24\xa9\xef\x4a\x45\xf6\xa6\x87\xf5\x13\x10\xad\x5e\xaf\xfe\x61\x2a\xf9\xb5\x8a\xf7\xdf\xcc\xc6\xc5\xa7\x14\xde\x58\x45\xb3\x7b\xbf\xf9\xc1\x0d\x1c\xcd\xf0\xfd\x89\x17\xce\x53\x34\xcb\xf7\x93\x82\x0c\x9e\x78\x51\x05\x3b\xe9\x13\x78\x27\xfe\x9b\x0c\xaa\x90\x21\x8d\xba\xb8\x43\x91\xc2\x94\x63\x5d\xff\xdc\xe8\x8a\xe5\x79\xee\xa3\xef\xa9\x3a\x69\xe9\xb3\x6a\x82\x67\xc5\x9e\xbd\xd9\xf0\xd4\xbb\x86\x01\x92\x9a\xc8\x88\x16\x57\xfc\x6a\xb1\xde\x61\x7a\x7a\xf9\x84\x7b\x9a\xd7\xe4\xc2\xec\xe1\xf6\x1f\xea\x79\xf1\x17\x15\x9c\x86\x6d\x28\x4f\xcb\x94\x61\x00\x94\x80\x1c\x3c\x36\xb7\x93\xeb\x1d\xb9\x9c\xfa\x39\x39\xaf\x3a\xc7\x27\x66\x81\x8f\x56\xb9\x65\x32\xf7\xfa\xfe\x5c\xd7\x31\xd8\x32\x70\x2c\xfb\xb4\x47\xa4\x90\xa4\xb1\x93\x2c\x2f\xc3\xf2\x64\x87\x70\xeb\xd7\xad\x14\xbb\xba\x85\x7b\xc4\x03\xe7\x69\x49\x55\xcd\xf8\x45\x3a\xdb\xb7\xce\xf3\x89\xef\x6b\x14\x68\x56\xef\x77\x8e\x83\xfb\xbb\x6d\x68\x76\x63\x01\x92\x9a\xfb\xf1\x47\xb3\x1b\x77\x83\x04\x78\xf2\x40\x33\x7c\x9f\x35\xc2\x24\x10\x55\x30\xc5\x15\x47\xb8\x5b\xa2\x4a\xa6\x58\x40\x3b\x7c\x80\x0c\x55\x34\xc5\xfa\xac\x0b\xb3\x4c\x14\xd5\x14\x77\x83\xf7\x30\x43\x40\x93\x4d\x71\x80\x96\x43\x70\x92\xa2\xa9\xa7\x40\xea\x88\xe4\x7f\x39\xea\x86\x94\xc4\x64\x6b\x05\x44\x4a\x96\x42\x37\x35\xcd\x7d\xf2\x06\x19\x44\xbb\x27\xa6\xf9\xbe\x94\x2d\x8d\x69\x52\xb4\xdb\x7d\x50\xff\x65\x1c\x88\x01\x50\x0e\x92\xa1\xd9\xea\x36\x6a\x50\xb9\xc7\x5e\x20\x2e\x39\x28\x31\xc2\xf1\x1a\xc3\x25\x75\xf7\x06\xc1\xb7\xe9\x2c\xf7\xa0\xc5\x7c\xcb\xab\x97\xaf\x61\x00\x14\x89\xec\x7f\xfa\x3b\xfa\x05\x79\xf5\xb5\x4f\xcf\x1f\x64\xa9\x9d\x8e\xad\xa0\x70\xb8\xf3\x2d\xe8\x5b\x5f\x7a\xc0\xf1\x3f\x3f\xc9\x66\x49\xec\xf4\x31\x00\x2a\x40\xee\xfe\x4d\xd4\x28\x3f\x4a\x73\x68\x5d\x19\x2e\xc9\xee\x74\x30\x19\xcb\x1a\x8a\xbd\x57\x48\xf5\xf5\x41\xa6\x73\x40\xe8\x0e\xd7\xee\xe6\x09\xde\x7f\x33\x7b\x9f\xf1\xc2\x07\xf2\xd0\xec\xc6\x01\x72\x60\xc6\x85\x66\x38\x0e\x10\x09\x37\x27\x34\xcb\x71\x80\x02\x58\x79\x43\x95\xaf\xb1\x00\x57\xb8\x23\xa3\x0a\xd8\x58\x40\x2c\x9c\xd6\x68\x12\x36\x0e\x90\x0d\xaf\x34\x34\x0d\x1b\x07\xe8\x26\x86\xdf\x0e\x83\x26\x65\x03\xe9\x47\xf8\x65\x4c\xae\x18\x00\xcd\x21\xbb\x87\x08\xc5\xe0\xc9\x5b\x53\x0d\x3f\xbc\x6c\x98\x5b\x8e\x7c\xb2\xea\xda\x2e\x3c\xe2\x58\x67\x2b\x26\x22\xf4\xb4\xea\x91\x8a\xe4\xf6\x8b\x3d\xb6\x8c\x4c\xbb\xc3\x4c\xad\x32\xf7\xb2\xcc\x4a\xc8\x1c\x97\xf8\x73\x6d\x79\x7c\x9f\xd5\x0b\xb5\xaa\x41\x3f\xe9\x8e\x56\x39\x1f\x39\x3e\xa2\x1f\x8d\x01\x50\x00\x32\xad\xed\x1f\xd2\x66\x7a\x9d\x2b\x3b\xc0\x93\x60\x71\x2c\x8b\xbb\xf0\xc2\xea\x50\xf9\xe8\x95\x87\x23\x78\x69\x6b\x53\x3b\xc7\xfe\x64\x49\x63\x80\xe4\x39\xc4\xe5\xc7\xa7\x7b\x85\xe5\x4c\xdc\x23\x94\x18\xd9\x57\x8f\xdd\xb0\xaf\xd3\x04\x06\x04\xea\x3d\x93\x87\x2f\xd0\x6a\x9e\xcc\x7e\x6a\xfb\x64\xaf\x43\x21\xe7\x88\x36\xdf\xeb\xdc\xb9\x0e\x0a\x8e\x33\x8b\x80\x8f\x84\x2a\xcc\x9b\x92\xbf\x77\xa5\xeb\x5c\xda\x20\xf8\xd8\x15\x44\x6b\xa2\x47\x8d\x01\x50\x33\xb2\x54\x67\x64\xf8\x5e\xeb\x1e\xbf\x62\x75\x22\x60\xb5\xa0\xe6\x09\xc5\x8b\x51\xfd\xc0\xe8\x47\xea\x41\xed\x99\xe7\xca\x31\x09\x29\x85\x1e\x7b\xed\x06\x29\x6c\x97\xa9\x08\xbe\xf8\xc5\x0c\x78\x8b\x72\xd6\xf2\xe8\xff\x38\xd6\x7b\xd8\xee\xdc\x9e\xab\x21\xaa\x3d\x3d\x30\x46\xfd\xe3\x5b\x07\x1e\xef\xbf\x45\x11\xf7\xb8\xe6\xe0\xaa\x82\x16\xc6\xfd\x41\x05\x5e\x05\x68\x71\xc4\x01\x02\xa8\xf6\x0b\x23\x5a\x24\x71\x85\xf1\x1c\x2c\xd3\xa1\x44\x72\x9f\x1f\xc0\x73\x0a\x5a\x28\x71\x80\x66\x38\xa7\xd1\x62\xb9\xdf\xee\x61\x6d\x12\x75\xb7\x05\x0b\xf0\x82\xdb\x0d\xea\x7e\x0b\x4e\xe8\x82\xe7\x75\xb4\x1d\x17\x1c\xe0\xe3\xff\x3f\x0f\x86\xb6\xf1\x02\xa4\x99\x0e\xb3\xfd\x57\xdd\x3d\x90\x2d\xff\xd9\xcd\x0f\xf8\x79\xf6\x1f\x13\xd5\xc8\x88\xb4\x74\x6c\x44\x6c\x07\x5f\x5f\x3b\x75\x85\xef\xb4\x40\x08\x44\xde\x44\xd0\x9b\x41\x88\x01\xd0\x30\x92\x64\x9a\x38\xf7\x4b\x13\xf5\x4c\x7b\x1e\x1b\x7b\x5b\xe8\xf3\xfc\x60\x0a\x5b\x6b\x6d\xf4\xb1\x32\xf3\xc8\x9e\x6a\x15\xf2\xc7\xda\x37\xeb\x30\x00\x9a\x41\x56\xf7\xe1\x09\xe2\x3f\x82\x05\x7e\xd4\xee\x1c\xf6\xa5\xcd\x77\x46\xf0\x35\x46\xaa\x1f\x0a\xd5\xa9\xcd\x8f\x8a\xe7\x3f\xd0\x26\x64\x53\xdb\x4b\x0d\xe4\x32\x1e\x5c\xdc\xc5\x3f\xf9\xd2\x9c\xdc\x48\x27\x4c\xc4\xeb\x12\x4b\x33\x8f\x7b\x52\x50\xd4\x3a\xe5\x76\xfd\x77\xf7\xa2\xd7\xbe\xf1\x97\x78\xff\xcd\x6c\x5c\x7c\x3c\xe0\x27\x80\x66\x37\x0e\x30\x0c\xb3\x4c\x34\xc3\x71\x80\x19\xb8\xba\xa3\x59\xbe\xbf\x10\xe0\x95\x83\xba\xf5\x85\x63\x39\x70\x87\x42\xdd\xfb\xc2\x02\x42\xfe\xff\x6e\x4d\xb4\xdd\x2f\x9c\xfa\x06\x27\x36\xea\xf6\x17\x0e\x00\x9b\x84\xb6\x01\x86\x03\x0c\x52\xc0\xef\x14\x44\xdb\x07\x03\xd2\x87\x75\xf0\x98\xfe\xd3\x89\x90\x3a\x4e\xb3\x2b\x55\xdd\xb3\x21\x41\x8b\x88\x4f\x9d\x15\x6d\x71\x4e\xcb\x0f\xde\x2f\x8b\x90\x4d\x68\xff\x90\x4b\xb9\x2c\x7c\x4b\xca\xf2\xf7\x5e\xcf\x41\x1e\x56\x59\xbb\x31\x65\xf8\x65\xdc\x9e\x25\x14\x93\x14\x71\x8a\x8e\xb4\x7f\x5d\xf0\xe2\xa3\x7e\x91\xdb\x7e\xa6\x03\x41\x6c\x32\xe7\xbf\x8f\xee\x4d\x8d\xc8\xbc\x36\xae\x16\x05\x2e\x4c\x2d\xf7\x63\x04\xe6\x3c\x4b\xfb\x49\x56\xdd\x05\x5b\x4c\x98\xe4\xfd\x31\x57\x49\x8e\x49\x93\x39\x5d\x0d\xd8\x5b\xce\xc8\xe1\x49\xd5\x48\x85\x36\x8d\x45\x2f\xdf\x96\xbf\xf9\x0f\x89\x2c\x38\x44\xdc\x29\x62\x7c\xad\x87\x63\xd3\x6b\xf9\xda\x02\x33\x7d\xe6\x7d\x0c\x80\xda\x90\xac\x25\xf2\xa6\xa6\x94\xed\x68\xdd\x60\xe4\xea\xa7\xde\x4e\xaf\xb4\x13\x24\x9a\x5e\x39\x23\xfc\x4f\xbd\x8e\x24\x7f\x04\xde\x8d\x3d\xac\xbc\xff\xe6\xe6\x7e\xf9\x85\x1b\x38\x9a\x9f\xfb\xfd\x18\x3e\x05\x86\xe6\xe8\xfe\x48\x0d\x2f\x04\x34\x4f\xf7\x8b\x1d\x3c\x6e\xa1\xb9\x8a\x03\xb4\x11\xac\x27\xe3\xbe\x93\xe7\x26\x20\x3e\x39\x71\xdc\xfd\xd9\xf4\x35\x37\xbf\xe7\x4b\x81\x43\x11\xbd\x62\x8c\xab\x3f\x7d\xc7\xa4\x98\x6c\x7f\x6f\xdb\x69\x10\x01\x69\xfb\xdd\x5d\xfb\x20\x06\x00\xa0\x8f\xc8\x26\x78\xc9\xfb\x46\x66\xd2\x88\x7d\x23\xa6\x86\x4d\x4d\xee\x6e\xd6\xd1\xbb\xa6\x49\x82\x9c\x13\x5a\x91\xe3\x1e\xaa\x81\x6e\x6d\xb9\xab\x00\x5a\x47\xe6\xc4\x09\x1f\x05\xe3\x0d\xab\x62\xd3\x8b\xca\xd3\x8c\x1d\x77\x27\x31\x16\x1d\x26\xa3\x65\x1d\x11\x9b\xa1\x9d\xc9\x93\x2f\x9b\x96\x63\x1c\x01\x54\x88\xfc\x43\xa9\xd2\x87\x68\xfc\xe6\xc0\x2f\x44\xaf\x3c\xb2\x25\x8f\x8c\x66\x9b\x54\xcb\x4d\x56\x15\x9d\x79\x79\x95\xf6\x87\x55\xea\x93\x07\xa6\x74\x00\xea\x47\x96\x3a\x09\xd1\x51\xc6\xd4\x53\x43\xa9\x43\xa3\xa9\xe6\xad\x4a\xea\x10\x93\x6e\xd8\xad\x98\x7e\x95\x96\x12\xbe\xb2\xb3\xf3\x5d\x42\xeb\x00\x5a\x41\x56\xba\xa0\xd7\x7f\xa8\x39\x76\xb4\x4f\xec\x3e\xab\xb9\xf6\x50\x32\xf6\x30\xef\xcf\x0b\x9b\x93\xd7\x16\x76\x88\x30\x24\x52\xf6\x55\xb1\xa7\x31\x00\x1a\x45\x5a\xf3\xb4\xf9\x54\xed\xef\x43\x27\xe5\x7a\xc9\xec\x67\xcf\x05\xf1\x33\xff\x74\xad\x5c\xbd\xef\xe3\xfc\xa9\xc2\x3e\xf0\xbb\x9d\x7d\xef\x0b\x47\x00\x35\x21\x33\xce\xc8\x3b\xa0\x52\xe3\x6c\xd3\xf9\x13\xa3\x2e\x02\x81\x92\x81\xbe\x9c\xbf\x93\x07\xe8\x6f\xb2\x53\x7e\xbb\x4d\x80\xf1\x30\xd9\x71\x00\x50\x3b\x92\x80\x1c\x2b\x20\xfc\xe1\x2c\x91\x76\xb7\x25\x23\xc9\x58\xa8\x89\x94\xd4\xf1\xc0\x7c\xed\xcc\xd9\xa3\x47\x34\x3b\x88\x17\xc7\x1e\x0e\x59\x00\xa8\x1f\x29\x8a\xa5\x3b\xab\x91\x06\xf8\xbe\x90\x09\x21\xcf\x1c\x5d\x39\xd8\x10\x4d\x3d\xc6\x69\xc8\x2a\x40\xe4\xfd\xde\xb5\x6e\x86\x85\x3f\xee\xa8\x23\x80\xdc\x91\x9b\xaf\xde\xaa\x21\xb1\xbd\x3c\x47\x23\x2e\x4f\xf2\xdc\xce\x3c\x2d\x2d\x3a\xa7\xef\x70\xc8\xfe\x94\x87\xf1\xa2\xe9\x25\x62\x47\x66\x7e\x7c\x00\x79\x21\x63\xa9\x13\xc1\xb1\xa1\x4f\xcd\x10\xef\xeb\x35\xe1\x2d\xf6\x38\xfc\x4f\x8d\xe1\xda\x1c\xef\xd0\x49\x9a\x49\x33\xd3\x33\xd9\x61\x8b\x0a\x00\x5a\x41\x5a\xb3\xee\xfe\x5c\x51\xc3\xbd\x4c\x22\x48\xf5\x46\x45\x0d\xb8\xf6\xb2\xda\x37\x30\x3d\x49\x83\xcb\x39\x3a\x81\x84\xe3\xd1\x76\xea\x2a\x32\x8c\x33\x1f\xef\x26\x90\x0a\x2a\x15\x9a\x68\x1e\x17\xde\xa6\x31\x22\xa8\xbe\xcd\x2c\xff\xac\x87\xa3\x31\xd5\xfc\x9a\xe2\xe3\xfb\x3b\x7b\x53\x1f\x52\x5d\x1c\xae\x79\x33\xf0\x30\xa8\x31\x85\xf8\x8e\xc2\xe3\xdb\x7e\xeb\xae\x4f\x1c\xfd\x83\x3a\xc2\x19\x48\xb3\xe7\xa9\x36\x0b\xa9\x0f\xae\x00\x00\xb5\x23\x93\x6c\xcc\xff\x30\x6b\x87\x8c\xed\x3c\xa1\x62\x86\xfb\xe7\x7b\xfe\x3e\xee\xcf\xf5\x5a\xaf\x65\x36\x0c\xb8\xbe\xd4\x5b\x56\x77\x3c\x7b\x1c\x40\x3f\x91\x59\x30\x24\x24\x5a\x54\x2f\x7a\xb4\xc6\x02\x53\x5d\x50\x96\x67\x59\x17\xf8\xea\x69\x9b\x39\x2d\x77\xc9\xec\x05\xdd\x97\x72\x69\x99\xb4\x7f\x5d\x9a\x63\x71\xf0\x2a\xff\x01\xb9\xca\xdf\x3e\x8f\xf2\x2b\x13\x8c\xde\x5f\x73\x0c\xd7\x16\xb3\xb2\xed\x1b\xe9\xd1\xbf\x64\x1c\xb4\x37\x9c\x20\x19\x74\xba\x82\xe2\xdd\x33\x37\x99\x8d\x6c\xe6\x96\x77\x62\x03\x6e\x0e\x3c\xc4\x6c\x45\x1d\x7d\x11\xc6\xfe\x22\xfa\xcb\x06\xab\xb8\xf1\x3a\x00\x50\x18\x32\xe6\x97\x05\x69\xa5\xd9\x36\x83\x1b\x0e\xd6\x88\x74\xcb\xaf\xbd\xbe\x23\xfb\x94\x26\xa8\xad\xd2\x29\xfc\x45\x8e\x25\x43\xc5\xc0\x08\x23\x80\x32\x91\x8b\x4f\xee\x76\x4d\x2f\x5b\xb3\x03\x33\x51\x7f\x28\x43\xbc\x73\x9f\x9f\xd0\x84\xac\xb0\xa9\x5b\x5c\x7c\x94\x7e\x95\x52\x75\xb7\x4c\x08\x00\x90\x23\x32\x7f\xbd\x73\x3f\x7c\x92\x1a\xd7\x59\xdc\xfc\x5a\x44\xa7\x70\x21\xa9\xff\x1b\xcb\x6e\x22\x5f\xc6\x5b\x8f\x55\xe6\x03\x8d\xb4\x0f\x24\x09\x00\x34\x82\xfc\x79\xa1\xd6\x52\x43\x9b\xf4\x8f\x35\x1e\xa3\xbe\x09\xd3\x2a\x97\xc2\x89\x73\x3a\xd6\x3c\xb6\x3a\x42\x09\xb3\xc7\x49\xbe\xfb\x1a\xe5\x00\x20\x89\xe4\xdb\x5a\x6f\x87\x76\x7b\xea\x87\x88\x4e\xbf\x71\xdb\x3a\xaa\x6a\x53\x71\x92\xe4\x6d\xba\xa6\xe3\x63\xcf\x98\xe4\xb9\x72\xb7\x29\xcd\x5c\x00\x0d\x20\x9f\x92\x9d\xd6\xc6\x85\x7c\x4f\x05\xc1\x3a\xf7\x41\xa5\xc4\xf2\xcd\xd3\xbf\xbf\x10\xaa\x29\xfa\x57\xb6\x11\xfa\x50\x4a\xeb\xbe\x1c\x60\x06\x00\x6a\x44\x1a\x7f\xb9\xdb\x6b\xb9\x6d\x06\x3f\xe3\x03\x91\x83\xda\xe2\xa3\x06\xae\xb3\x3c\x6a\x03\x5c\x31\xdf\x93\x5e\x96\xfa\xd9\xfc\x92\xbc\xd7\x0c\xa0\x3e\xe4\xee\x58\x81\xcb\x8e\x56\x63\xd0\x49\xf5\x5b\x5b\x7f\xd2\x9d\xb4\xad\x3d\x2c\xdc\x5d\xd5\x6f\xbe\xab\x68\x50\x0d\x28\xb1\x7c\x0c\x72\x14\x01\x80\x32\x90\x3a\x90\x94\xf5\x40\x98\xd1\x31\x99\x9b\xb6\xfa\xe0\x42\xfb\xd7\x4f\x3e\xb1\xaa\xb9\x87\x8f\xd7\xd6\x4d\x4a\x40\x24\x03\xfe\x2b\x69\x4b\x00\x2a\x44\x26\x8d\xdf\xe1\x77\xa3\xea\x4e\xfc\xbf\x95\xe4\x5e\xb3\xe6\x47\xe8\xf2\xd8\x2e\x53\xb1\x73\x7f\x3d\xc7\x70\x80\x6a\xbc\x28\x26\x5b\xf0\x09\x00\xd0\x00\x72\x6d\x8b\xb5\x87\xde\xc8\x35\x38\xb9\xf5\xe8\xfe\x88\xfc\xea\xfa\x64\x7c\x92\x14\xcd\x83\x7b\x8f\x7a\x0d\x5b\xd5\x22\x4e\xd9\xca\xa8\xa9\x03\xe8\x3b\x32\x71\x6e\x85\xff\xc9\xeb\x08\x6d\xa1\x70\x16\x4d\x7d\xe2\xde\xa6\xa4\xd9\x32\x3d\x1f\xae\x55\x10\xde\xe1\xf1\x88\xd8\xf6\x82\x02\x55\x3d\xb2\x6a\x94\x55\x49\x42\x89\x5f\x82\xa5\xcf\x54\x84\xba\x6d\x6e\x8b\x17\x6d\xab\x0b\x74\xd9\x89\xd2\xa6\x84\x7e\x68\xa7\x4b\x2c\xd8\x46\x9e\xac\xec\xf3\xd9\xca\x98\x72\x39\xf0\xfd\xdb\x09\x23\xb3\x1d\xed\x9b\xd4\xee\xba\x53\x39\x56\x84\x57\xbc\xf3\xad\xca\x25\xee\x8a\xdf\x43\x5c\x6a\x76\xd8\xe7\x73\x66\x1a\xdf\x99\x5b\xb7\xc5\x99\xe4\xe7\x58\x7d\xad\xc5\xbf\xf8\xbf\x1d\x92\x0e\x94\x1c\xb7\xfb\x95\xd5\x65\xd3\x0b\x00\x14\x8b\x24\xb1\xa7\xe5\x89\x0f\x5e\xbc\x52\xf4\x52\x56\x9c\xdc\x51\x46\x4c\x64\x65\x99\x8d\x3c\x88\x50\x3e\xe5\xe9\x6b\x6b\x72\xe7\xa8\xc1\x98\x36\x00\xfd\x44\x46\x9b\xd3\x8b\x3b\xf1\x4d\x60\xaa\x50\xc1\x2f\xe1\xd1\x83\xd4\xbd\x45\x51\xa5\x2a\xb9\xf1\xc7\xbf\x9e\x67\x7f\x75\xc4\x7d\xac\x4d\x1e\x79\x90\xf5\xfd\xb6\x75\x4f\x6c\xae\xa3\x5b\x1d\xc9\xeb\x90\x17\x7c\x5e\x17\x8f\xe6\xb7\xad\xb5\x89\xca\xc5\xdf\x8d\x69\xb2\x5c\xc1\xb7\x09\x75\x04\x90\x2f\xb2\xe8\xfe\xf0\x6c\xa4\xe5\xa5\xba\x28\x16\x9f\xdd\x1a\x3b\x78\xc0\xa8\x2c\x6f\xbe\xa1\xdd\x62\xc8\x5e\x3b\x52\xe8\x4b\x3d\xf4\x51\xca\x0f\x40\x7e\xc8\xb4\xba\x1b\xca\xe7\x6b\x7e\xe5\xda\x2e\xde\x25\x86\xe6\xc9\xe6\xdf\x23\x5a\x6a\xed\x9c\x4f\xb2\xf8\x3f\x8e\x7e\x7d\xe9\x10\xac\xf7\x8e\x0d\x40\x0d\xc8\x24\x5f\x3b\x4f\xbb\x55\x1c\x75\xef\x6c\xc6\x63\x5d\x0d\xd2\xdb\xce\xcc\xaa\x8b\x27\xb2\x0e\x6a\x3e\x8f\x08\xd9\x79\xee\xf0\x8b\x7d\x58\x07\x00\x28\x0a\x79\x40\xa6\xe5\x67\x49\xee\x59\x8d\xbe\xd3\x89\x5f\x95\x8f\xde\x31\x3f\xe7\x42\x3e\xe0\x9c\x9d\x3b\x49\x62\xfc\xae\x4e\xcb\x52\x40\x6e\xae\x0a\x40\x59\xc8\xcb\xd3\xdb\x0c\xcf\xcf\x92\xac\x1d\x7b\x77\x20\x63\xbc\xd6\x89\xd5\xdc\xce\x1c\x8c\x44\x6a\xd7\xd5\xd5\xcf\x8f\x5c\xb4\xd3\x2f\x10\x43\x1e\x7c\x22\x79\xf1\x92\xf3\xaa\xc0\x78\x9e\xe6\xab\x27\x6d\x3e\x45\xc3\x92\x9b\x13\xa7\x8a\x92\x43\x7f\xcc\x3e\x6b\xb5\x69\x3b\xf7\x49\x0c\x00\x49\xe4\x47\xf9\x18\xd2\x1e\x74\xdc\xd7\x72\xf4\xbd\xa7\x19\x47\x75\xa9\xca\x93\xd9\xc7\x98\xcf\x81\xff\x6d\x75\xb5\xb7\xe3\xf6\x6c\xd6\x5a\xc7\x5d\x00\x7d\x45\xfa\x39\xc4\x72\xfe\x9d\x97\x05\xcb\x47\xdd\x44\xff\xe4\x20\x26\xff\x70\xcd\x0a\xde\xa9\x40\x6e\x1b\xad\x69\x46\x25\xcb\x97\x95\xd6\x06\x00\x40\xb9\xc8\xfc\x0e\xb3\xa3\x08\x5f\xc8\x7a\xfc\xfa\x2c\x75\x6b\xdd\xbd\x1c\x26\x41\x47\x93\x65\x3e\xf3\xae\x82\x03\x4f\xe9\x44\xce\x48\xa8\x60\x88\x00\x54\x87\x5c\x3e\xf3\x23\xf9\x13\x4f\xcd\xe8\x5a\x16\xd4\x1f\xa7\x75\x37\xc5\x45\xd5\x7d\xe9\x36\x3f\x96\xbf\x21\xdc\xf0\x43\x69\x44\xd6\xee\xa5\x3d\xe2\xd2\x9d\xe1\x51\xdf\x1e\x4f\x0a\x9f\x42\xd5\xaf\xa3\x37\x45\xd4\x1f\x9c\x54\x2e\xbd\xbd\xb9\x75\xbf\x78\xa1\xbe\x8b\x58\x33\xa4\x69\x04\xb9\xed\x13\x36\xe5\xc7\xae\xce\x36\x62\xd9\xf2\x51\x7f\x7b\x88\xb6\xc5\xa9\x32\xf0\xb6\x99\xc9\x9b\xc9\x7a\xab\x4e\x65\xd5\x1b\x5a\xb6\x18\x00\x39\x23\x19\xe4\x56\xce\xf4\xf8\x1d\x5a\x35\x92\x04\x5b\xb3\x27\xc3\x2f\x54\x74\x43\xb2\x9d\x32\xba\x75\x69\x9f\xe5\x9a\x06\xae\xb1\xa8\x0e\x37\x39\x02\x28\x10\x79\x66\x6f\x9d\xcc\x9b\x78\xe3\x94\x39\x9f\x39\xc1\xb9\xc9\xe1\xf4\x0b\x5d\xe1\x86\xb1\x87\x0b\xf9\x3d\x32\x92\x46\x68\xbb\x44\x15\xce\x0b\x03\x28\x15\x79\x88\x64\xdd\x3c\xef\x8a\x57\x85\xc9\x6f\x5e\xe3\x83\x4e\xfc\x55\x52\x8a\x4a\xf5\x1e\xea\x6f\xae\xd5\x68\x69\xc9\xcd\x04\x3d\x27\x4e\x3e\x05\xa0\x09\xa4\x35\x8c\x7a\x82\x6a\x76\x8d\x5a\xe3\xca\x09\x13\x96\xde\xd6\x75\x99\x26\x4c\x45\x7e\x9c\xbb\x6f\xee\x15\x4a\x9b\xf2\x6b\xb0\x4e\xca\xf2\xfe\x23\xe3\x92\x64\xfa\x6f\x2e\x85\x27\x0a\x34\xce\x85\x03\xac\xc3\xfc\x14\x95\x74\x61\x01\x85\xf0\xff\x20\x50\x69\x17\x16\xd0\x0f\x0f\x6a\x68\xc4\x0b\x07\x58\x81\x07\x35\x34\xe6\x85\x03\x8c\xc2\x26\xa1\x52\x2f\x2c\xa0\x09\x16\xfa\x50\xc9\x17\x16\xd0\x0e\x4b\x16\x68\xf4\x6b\xdf\x69\x58\x19\x44\xe5\x5f\x58\x80\x3b\x3c\x3b\xa2\x32\x30\x2c\xc0\x0b\x0e\x2b\x1a\x07\xdb\x0f\xeb\x51\x78\x14\x44\xa3\x62\x40\x9a\xd0\x01\xdf\x69\x6f\x14\x1c\x40\x16\xcd\x5b\x45\xaa\x65\x3a\x79\x3c\x1b\x26\x44\xf3\x8a\x7d\xd5\x2b\x3c\xb6\x5a\xec\x1a\xa7\xca\x1d\x20\x46\x76\x6f\xb5\x9e\x7b\x93\x2f\x31\x00\xaa\x44\x8e\x8e\x74\x73\x5e\x65\xb9\x79\x83\x92\x7c\x42\x32\x89\x99\x10\x01\x8b\x1e\x75\x90\xa1\xe0\x45\x7b\x81\xb0\xf6\xf3\xb2\xfd\x7c\xf2\xec\x18\x00\x85\x22\xbb\x09\x6f\xbc\xcb\x98\x32\x93\xff\xbb\x62\xaa\xa9\x1f\x6f\x82\xec\xaa\x1f\x5b\x9a\x75\x9d\x9a\x8b\x79\x79\x80\xfc\x4d\x19\x47\xfa\x55\xfc\xbd\x01\x18\x59\x4e\x84\xd9\xb4\x9a\x4c\x4b\xce\xae\x59\xe1\x35\x1e\xbe\x02\x52\xf2\xee\x5b\x38\x4c\x92\x9d\x95\xdf\x98\x33\xc9\xbe\x32\x56\x2f\x1b\x8c\x01\xd0\x0e\xd2\xfe\x2a\xd1\x8e\xde\xe7\xa1\xd4\xae\xb5\x97\xce\x6b\xd9\xa5\x4b\x5a\x35\x65\x98\x65\xfa\xae\xaa\x77\xe7\x3e\x93\xdc\x4c\x79\x61\xba\xff\x7a\x79\x34\x37\x71\xf1\x1c\x80\xb3\x0e\xcd\x4f\x1c\xa0\x12\x9e\x1d\xd1\x1c\xc5\x01\x42\x61\x11\x05\xcd\x53\x1c\xa0\x08\x5e\x39\x68\xae\xe2\x00\x3b\xff\xff\x80\x19\x1a\xdb\xc6\x02\xc2\xe1\xfd\x5b\x54\xba\x8d\x5b\x39\x70\x7d\x41\x23\xdc\x38\xc0\xcf\x43\xb0\xb2\x86\xc6\xbb\x81\x34\x13\xde\x61\x5e\x27\x0c\x80\xfa\x90\x4d\xac\x59\xd0\x37\x43\x90\xfb\x4a\xde\x92\xad\x70\x62\x6a\x40\x73\xb8\xba\xc8\xa5\x84\x97\x77\x7e\x68\xd4\xcb\x1c\xe9\xe3\x0a\xb0\xba\x8e\x01\xd0\x16\x72\x86\x51\x30\x99\x21\xa3\x17\xe6\x7a\xfb\xda\xe1\xdc\x53\xd3\xf9\xcb\x6a\xda\xf4\xc6\x10\x67\x66\x54\x4c\xc8\xb1\x3a\x39\xd2\xef\x33\xfc\x18\x00\x45\x21\xd3\x68\xa6\x8d\x52\x6e\xc0\xa0\xe9\xf5\xd3\xf0\x69\x93\x97\xdc\xe4\x67\xd8\x88\xee\x49\x13\x48\xac\x37\x34\x77\x90\xb3\xe5\x65\xbe\x3f\x87\x01\xd0\x3c\x92\xf2\x0a\x55\x6f\xd4\xcf\x30\xbe\x11\x9e\x62\xa0\xda\x91\xaa\xd0\x30\x78\xea\xde\x45\x7d\xc1\xa0\x4f\x74\x9d\xd8\x24\xdf\xb0\xf1\x7c\x22\xef\xbf\x99\x8d\x8b\x4f\x1f\x2c\xb7\xa2\xd9\x8d\x03\x6c\xc1\xa5\x08\xcd\x70\x1c\x20\x0a\x4e\x0a\x34\xcb\x71\x80\x79\xf8\x19\xa3\x4e\x3e\x58\x40\x0e\xac\x7a\xa3\x8e\x3e\x58\x40\x18\x5c\xec\x50\x87\x1f\x2c\x20\x13\xee\x83\xa8\xd3\x0f\x16\xe0\xf8\x7f\xa7\xd1\xe6\x1f\x2c\x60\x04\x7e\xc9\x10\xea\x04\xf4\x1f\x40\x12\x7e\x6e\xa8\x23\x10\xae\xbe\xc0\x51\x45\x9d\x81\xb0\x80\x46\xd8\x05\xd4\x29\x08\x97\x4a\xf0\xd9\x0a\xd4\x31\x08\x0b\xc8\x80\x37\xea\x51\x07\x21\x1c\x59\x80\x0b\x12\xea\x24\x84\x73\x1a\x6e\xb4\x68\xb3\x10\x0e\xf0\x9d\x6c\x7d\x06\xff\xdf\x46\x22\x20\x75\x08\x0f\x0f\x00\x20\x29\x84\xfc\x6b\x88\xc7\x93\xd0\x1d\xaa\xca\xde\xb8\x73\x57\x86\x44\x2c\x4e\xc5\xdf\x66\xe2\xa9\xfc\xdc\x2a\xcc\x03\x1d\xfa\x54\xa8\x60\x31\xdd\x01\xa0\x68\x24\x5b\x7b\x64\x9a\xfc\x42\x2d\x32\x89\x35\xd9\xad\x68\xc3\xf8\xa2\x78\x3a\x6b\x96\x93\x3e\x33\x47\xe1\x99\x9a\xa7\x53\xde\x76\x3f\xeb\x64\x00\x80\x72\x90\x64\xf0\xe7\xec\xf6\x4f\x9e\x1a\xaf\x63\x6a\x11\xfc\xcc\xbc\xf2\xf4\xdd\x49\xce\x52\x56\xb7\xc8\x5e\x5e\x4f\x36\xa9\x3c\x25\x65\x77\x47\x19\x40\x7d\xc8\x0e\x98\x53\x9b\x7b\xfe\x72\x2f\x95\x91\x36\x83\x47\xfe\x85\x23\x43\x6f\x39\xe8\xeb\x67\x0e\x2b\xf8\xef\xaa\xd7\xfe\x21\xe8\xf8\x74\xe0\x33\xcf\x3f\x1a\x8d\xcd\x38\xa1\xfd\x58\xa2\x5a\x8d\x8d\x65\x34\xac\x24\xa2\x9a\x8d\x5b\xc7\xf0\xb9\x48\x34\xc3\xf7\x33\x8e\x68\xfd\x07\xfe\xbf\x4d\xa5\x00\xba\xed\xb6\x57\xda\x7d\xff\xfa\xc3\x6a\x64\xbe\x81\xb6\x36\x19\x7e\xeb\xe7\x76\xef\xbe\xe6\x31\xed\x77\x7c\xe6\x0c\x03\x49\x25\x86\x90\xeb\xb5\x5f\x4d\x3e\x21\xbf\x30\x00\xfa\x82\x0c\xff\x9f\xae\x59\x1b\xea\xda\x8a\xe9\x7e\xef\xb7\x6a\x74\x42\xed\xd1\xc6\x54\xa3\x46\x3a\x78\x6f\x87\x63\xee\xac\xb7\x3f\x38\xe2\x7d\x12\x03\xa0\x60\xa4\x58\xa6\xc2\x77\x50\x33\xa8\x42\x4a\x42\xef\x4a\x0c\x6d\x45\xbb\xc1\x9b\x70\x09\x03\xb1\x4b\x62\x5c\xd4\x0d\xd2\x65\x9f\x82\x84\x62\xc7\xf7\xd6\x3d\x52\xa3\x5a\x55\x79\xf2\xe7\x54\xd6\xab\x51\x17\xae\x0f\xcb\x6f\xac\xdc\xa6\xb6\x88\x58\x4d\x2f\x5e\x52\x27\x5e\x57\xb1\x5c\x50\x54\xdd\x92\xe1\xfd\x37\xb3\x71\xd1\xf1\x85\x2b\x35\x9a\xdd\x38\xc0\x17\x38\xfe\x68\x86\xe3\x00\xc1\x30\xcb\x44\xb3\x7c\xbf\xca\x1d\x81\xbb\x31\xaa\x36\x20\xed\xc4\xc4\x84\xfd\x76\x24\xf2\x11\x24\xd3\xc8\x1f\x4a\xd0\xff\xc1\x72\x5f\x9b\x9f\xf6\x98\x49\x4b\xeb\xfa\xaa\x3a\xad\xc1\x26\x8d\xfe\xfb\x44\xff\xc4\x8d\xaf\x49\x09\x18\x00\xc5\x21\x35\x02\xe1\x37\xcb\x35\x67\xf0\xc9\x18\x44\x78\xa3\x69\x45\xbb\x45\x09\xea\x76\x7e\xeb\xe2\x6f\xa4\xda\x5e\xe8\x23\x48\x2d\x5d\xd9\xad\xc7\x00\x68\x16\x39\x82\xf2\x7f\x7d\x50\x1c\x26\x53\xfb\xb9\x58\xd1\x4b\x90\x46\xe8\x96\xd9\x85\xcf\xfc\x9c\x75\x93\xe7\x04\x59\xce\x49\x5d\xbf\x29\xb9\xf0\x0a\x03\xa0\x2a\x64\xf7\xce\x22\xf9\x31\xcc\x4a\x21\x4f\xfe\xe7\xc4\x13\x16\x5b\x5a\x42\xd7\xa8\xc4\x4b\xa3\x5f\x62\xa9\x6d\x5f\x62\xfc\x75\x2f\x7d\x9d\xdc\xdf\xbf\x45\x33\x1b\x17\x9f\x6f\xf0\x13\x40\xb3\x1b\x07\x88\x83\x4b\x28\x9a\xe1\x38\xc0\x2c\x5c\x11\xd1\x2c\xc7\x01\xaa\xe0\x36\x80\xaa\xce\x60\x01\xb1\x30\xcd\x44\xd3\x67\xf6\x29\xda\xff\x3f\x4a\x84\x26\xd3\x00\x69\xcc\xe1\x43\xff\xbd\xde\xb0\x01\x59\x46\x17\x21\xb5\x58\x92\x01\x91\x23\xa4\x82\xe7\xae\x9c\x14\x18\xad\xef\x0a\xc7\x1c\xfd\x39\xb8\x12\x11\x24\xfd\xe2\xf4\x41\x2a\x9a\xbd\x87\x1c\x86\x64\xfa\x45\x14\x14\x92\x39\x7a\x06\xc1\x26\xa5\x0a\x63\xe7\x4f\xde\xdd\x20\x39\xeb\xf6\xcd\xff\x2e\xe7\xf1\xe2\xb4\xdb\x40\x99\x6e\xd8\x15\x03\xa0\x18\x24\x05\x14\x5f\x4e\xe1\xca\xa3\x57\x8f\xcb\x4b\xa4\xb9\xd1\x4f\x23\xef\xc2\xff\x23\xf4\xcd\xe3\x25\x71\x8d\xed\x90\x64\xda\x5f\x35\x1c\x07\x31\x40\xd2\x0a\x71\x39\xfe\x5d\xad\xdb\x6a\x2f\x5e\xf2\x3e\x56\x75\x77\x90\xe3\x9b\xdf\x62\x4e\xee\x3b\x72\x4d\x9e\x5b\xa3\x35\x6a\x11\x0c\xa7\x10\xa8\x61\x00\xf4\x09\x99\x43\x32\xfc\x5d\x39\x0b\xf8\x8f\x74\xd3\xab\x2a\x42\xa5\xd6\x05\x73\x6a\xb6\x37\xae\xb6\x45\xbd\x95\x6c\x4b\xb1\xc3\x87\xcc\x15\x2f\xf3\xfe\x9b\x97\xb8\x70\x36\xc0\x65\x17\xcd\xcd\x7d\x36\x04\x77\x55\x34\x3f\x71\x80\x18\xf8\xdd\x71\x68\x9e\xe2\x3a\x87\xd5\xfe\x0d\xd0\x3c\xc5\xdd\xe0\x13\x9c\x73\xa8\x3a\x1c\xae\xd4\xc1\x13\x38\xaa\x12\x87\x05\xf8\xc1\x77\x40\xd5\xe2\x70\x51\x85\xf9\x16\xaa\x18\x87\xa3\xbd\xf0\xc1\x51\x34\x39\x0e\x07\xc8\xa2\x80\x0f\x78\xa1\xaa\x72\xd2\xf8\x0e\x84\xff\x7d\x06\x3d\x09\xa9\xfb\x91\x76\xb1\xf3\xab\xee\xbe\x3c\x5d\x70\xac\x75\x6c\x3a\x06\xaf\xfb\x5b\xec\x92\x80\x12\x43\x25\xfe\x14\xf8\x4c\x34\x3f\xb2\x6a\x0e\x00\x54\x81\xac\xa5\x55\x9f\x13\x01\x83\x9f\xd1\x79\xb9\x1c\x01\x86\x77\xe5\x05\x90\xd9\xef\x5a\x15\xc3\x4b\x0f\xcd\x66\x66\xa5\x26\xae\xb7\xba\x3c\x04\xd0\x06\xb2\x34\x7e\xb3\xb4\x19\xea\x36\x3d\x49\x1c\x2b\x1b\x18\x35\x4a\x25\x44\x03\xfd\x6a\x7e\xe9\xf4\x29\xe8\xb5\x6f\xa9\x94\x1d\xbe\x62\x93\x2c\x06\x40\x53\x48\xf1\x5c\x34\x2e\xa1\x2b\x8b\x37\x23\x53\x70\x6d\x38\xe2\xc9\x83\x4f\x9d\x16\xad\xda\xde\x67\x42\x2e\x8b\x58\x94\x14\x17\x3f\xa3\x70\x69\xe6\xfd\x47\xab\xb1\xe1\x49\x82\xe3\x89\x6a\x36\x16\x50\x01\xd7\x52\x34\xc3\x71\x80\x0d\xb8\x34\xa2\x59\x8e\x03\x4c\xe1\xef\xaf\x03\x54\x5d\x14\xbb\x0e\x9e\xc0\xc3\x2b\x9a\x30\x8a\xbd\xc1\x57\x38\xe9\x50\x95\x51\x2c\x20\x17\x76\x01\x4d\x1b\xc5\x01\xea\xfe\x7f\xaa\x10\x4d\x22\x05\x52\x34\x87\xff\x7b\xdf\x57\x3d\xf2\x21\x3f\x13\x8a\xee\x89\x15\x3b\x10\x56\x38\x12\x9a\x92\xa0\x48\xb0\xb6\x94\x3b\x25\xf2\xf1\x75\xf8\xcd\x60\xab\xdf\x21\xd7\xe7\x02\xf2\xf7\x68\x3e\x32\x89\x54\x94\xcd\x73\x53\x23\x52\x1b\x8c\x65\x78\x54\xf9\xc8\x02\xc8\x4e\xdd\x4f\xcb\x79\x81\xb1\x26\x1f\x49\xd6\x96\x4f\xcd\xeb\x2e\xc6\x00\x28\x0d\x79\xbc\x8b\x44\x94\x50\x90\x5f\x8e\x8a\x7e\x8e\x3e\xe1\x07\xbb\x76\x8e\xb5\xf8\xeb\x88\x32\x0d\xe6\xa7\xbd\xfd\x9c\x59\x49\x4e\xca\xd5\x7b\xa5\xda\x0b\xb9\x06\xe6\x6d\x25\xf0\xf0\xe9\xf0\x5f\x07\x4a\x56\x34\x87\x9a\xc8\x06\x5a\x5b\xab\x48\xe4\x13\xbf\xca\x57\x8b\xfc\x51\x07\x5e\xd7\x9f\xe7\xfd\x37\xb3\x71\xe1\xa9\x87\x47\x1a\x34\xbb\xf7\x47\x1a\xf8\x01\xa0\x19\x8e\x03\xa4\xc1\x47\x30\xd0\x2c\xdf\x17\xea\x28\xe0\x7f\x59\xa0\x29\xd5\x40\xea\x30\xd3\xbb\xbd\x27\x96\xf2\x97\x42\x7c\xc5\xf6\x9d\x1c\xef\xd3\x02\x12\xaf\x79\x3b\x77\x09\xda\x43\xb6\x76\x64\xec\xea\x5b\x11\xe3\x2c\x49\x1f\xa4\xf2\xd3\xd5\x20\x0c\x90\x44\xee\x26\x3e\xfc\xb6\x4c\x57\xc1\x36\xea\xd3\xe3\xc1\x18\x19\x7c\xd0\x47\xc6\x83\xf9\x12\x97\x83\xc5\x9b\x71\xa9\x09\x1d\x67\xa6\xb7\xf9\x6f\x01\x80\x7c\x90\xbd\x95\x54\xcb\x8b\xc6\x5d\xea\xdc\x93\xad\x84\xd3\x2c\x5e\x16\x8d\x1e\x47\x33\x3d\xa6\x0e\xad\xdf\x2b\x3a\x74\xf5\xb0\x84\x51\xe9\xca\x47\x00\x7d\x40\xaa\x19\x73\x1a\x3b\x22\x11\x4e\x85\x8f\x99\xb4\x97\xae\x52\x7e\x16\x78\xeb\x1c\xbc\x41\xaf\x42\x65\xfa\xfb\xcf\x0b\x9f\xa1\x37\x61\xe3\x1a\x18\x00\x35\x23\xd5\x73\xee\xe9\x9d\x9f\x04\x39\x72\xef\x15\xb2\x75\xf2\x33\xa6\x6e\xaf\xaf\x92\x2c\xd7\x5d\x7f\x16\x33\x78\x86\xe1\xe4\xc9\xb9\x5c\x75\x49\xde\x7f\x73\x12\x17\xcc\x14\xf8\x4b\xae\xa8\x6e\x62\x57\x30\x2c\x1c\xa0\xba\x89\xbd\x81\x0f\xdc\x5b\xd1\x1c\xc5\x01\x3e\xc0\x63\x3a\x9a\xa7\x38\x40\x33\x7c\xd6\x0c\x6d\x23\x02\x07\x70\x86\xf9\x01\xea\x4e\x04\x16\x10\x08\xdf\x01\x75\x2f\x02\x0b\x48\x85\x2b\x2f\xda\x6e\x04\x0e\x30\x41\xb8\x5e\x7a\x12\x8b\x70\x69\x38\xf6\x33\xf3\x19\xeb\xf5\xe3\x37\x7f\x79\xa8\x6c\x39\xd7\x0d\x88\xd2\x05\xbc\xac\xa4\xb3\xd6\x89\x8a\x5f\x62\xdc\x3c\xc1\x0c\xa4\x37\x76\x70\xdf\xb6\xc9\x46\x8e\x5a\x5f\xfa\x58\x22\x64\xcb\x58\x13\x56\x86\x8c\x67\xe2\xf4\x6c\x1b\xfe\xd0\x08\x35\x6e\x52\x29\xfb\xbd\x93\x6c\xaa\x5a\xa4\x8d\x96\x02\x50\x1f\x72\x2c\xe0\xd3\xef\xf7\x60\xca\xc9\x77\x25\x12\x55\x33\x7b\x77\xf3\xc0\x7d\x39\x39\x6f\x86\xa1\x37\x4a\x54\xed\xe4\x05\xc2\x8f\xad\xa3\xf2\x01\x34\x8c\x5c\x33\x5d\xa7\xe3\xde\x9d\x78\x77\xd8\xe2\x8c\xf1\xd7\x0b\xb6\x9e\x9e\xe1\x46\xf5\xc7\x38\xc5\x6c\xc8\x97\x82\xc5\xbb\x56\x25\x17\x35\xd7\x01\x80\x9a\x91\x55\x91\x1d\x3f\x5c\xee\x16\xff\x84\x82\x24\x69\x0c\x97\xe5\x65\xa9\xc6\x76\x69\xed\xd8\xe7\xc5\xe2\x26\xdc\x64\xc9\xec\x86\x33\xdf\x4c\x00\x34\x88\x9c\xfb\x0c\x3c\x69\x8c\xfb\x98\x0e\x2a\x71\x7e\x66\xfd\x5a\x11\x43\x16\xca\xf2\x71\x8b\xe0\xeb\x1c\x77\x33\x61\x6c\xa9\x7e\x5f\x62\xf1\x71\x47\x00\xf5\x21\xe7\x56\x9b\x00\x2f\xb5\x7c\x73\x8b\x97\x41\x84\xf1\x57\xba\x26\x54\x05\x5d\x0b\x13\x2c\xdc\x04\xac\xa3\xc1\xbb\x85\x58\xba\xab\xe9\xee\x00\x5a\x41\x6e\xc1\xb7\xd5\x8b\xa9\x9f\x2e\x3a\x32\x8d\x7f\x4c\x35\x5d\x76\xac\x66\x49\xf0\x6b\xdf\x4f\x47\x4e\x85\x83\xa2\x63\x6f\x99\x69\xc8\xf9\x4f\x01\x68\x03\xa9\x1a\xcc\xb5\xa8\xed\xca\x26\xf3\x9c\x21\x9a\x5c\xd3\xd5\x54\xe9\xde\x2c\x49\x66\xe4\xb6\x51\xae\x66\x5c\x61\xa9\xf6\x90\x78\x69\xf6\x1d\x00\xa8\x12\x79\xe4\x0a\x6f\x2e\x4a\xeb\x42\x62\xc0\x84\xde\x78\x99\xbb\x63\xbf\x51\x12\xdf\x4f\xcd\x7c\xab\x40\xbb\x4e\x3f\xad\x43\x6e\x3a\xf7\x2f\x29\x00\x68\x0d\x59\x20\xf4\x6e\xac\xdc\x1b\x09\xa4\x2c\xe5\xe3\x53\x29\x53\x34\x34\xd3\x88\x7e\xc3\xd7\x4e\xed\xc2\xc6\x3d\x9b\xb6\xeb\x53\xd2\x21\x48\xb7\xd7\xf7\x90\xb1\x3f\x7f\x9b\x8a\x6f\x7c\xa2\xdd\x25\xd9\xc8\x60\x60\x35\xe1\x3a\x85\x9f\x56\x2a\xb9\x96\xac\x90\xef\x11\x36\xed\x47\xae\x21\x67\x14\xf6\xba\x18\xb2\x03\x94\xda\x2f\x27\xfe\x79\xb1\x66\x14\x20\xec\xe1\x78\xed\x1e\x7e\xd6\x11\xf1\xc5\xb5\xa6\xf4\xf1\xd8\x4b\xbf\x54\x5c\xb6\xfb\x9b\x1e\x02\x00\x05\x23\x83\x59\x90\xdd\x15\xcc\x21\x53\xf3\x54\x42\x95\xc6\x29\x1a\x50\x0d\x4c\x1e\x38\x97\xf4\x54\x38\xe5\x79\xf7\x19\x2e\x7c\x76\x23\xe9\xaf\x00\x6a\x43\x7a\x7b\xd0\xe8\x75\x57\x6e\xde\xc7\x34\x25\xc7\xf0\x1f\x97\xe9\xdf\x50\x30\xbc\xa2\x59\x67\x98\x3f\xff\x85\xe9\xca\x83\x45\x4d\xe2\x5a\x4f\xc4\xa5\xed\xe9\x9d\xce\x11\x35\x4a\x89\xf6\x36\x77\x28\xfc\xc4\x13\xf4\x54\x44\xf8\xb3\x4c\x09\xc6\x1e\x75\x8c\x8e\xbe\x77\xed\x3c\x4d\x0d\x00\x14\x85\x8c\xcc\xe5\xa9\x5b\x0e\xdc\xb6\x05\x4e\x84\x94\x1b\xf3\x2f\x47\x28\x8f\xc4\x3a\xce\x08\xb4\x58\x98\x35\xbe\x6c\x0e\xe5\xb8\xc0\x29\x9b\x0e\xa0\x24\x64\xd6\x3c\x7b\xf5\x23\xad\x86\xa6\xa0\xb6\x1d\xb0\x53\x1a\xcc\x67\xc9\x1b\x25\xfb\x4c\x3d\x19\x3d\xa9\x6d\xe5\xfd\xbd\xa0\xa4\xc7\xba\x08\x71\xe9\x38\xc7\xdc\x85\x9b\xc1\xf5\xa2\xb5\x2c\x19\x1f\x28\xb5\xee\x48\xd3\xdd\x0f\x11\xa9\x7b\x38\x72\x61\x77\x2c\x7b\xc0\x84\x58\x8f\x1b\x00\x08\x83\xec\xba\x92\x33\xc9\x3e\xac\x49\x59\x4f\x66\x16\x8c\xd6\x9f\x97\xf2\x1d\x53\x4a\xf5\x1f\x9f\x3a\x70\xc0\xe4\xc2\x83\xc1\xcc\xc1\xf7\x6f\x15\x00\x94\x8e\x9c\x8f\x0c\xdd\x83\x26\xa2\x4a\x3e\xe0\x99\x92\x99\xe6\x77\x3d\x3b\xbb\xbb\xe8\xd9\x24\x74\x54\x7f\x40\x32\xb9\xae\x21\xda\x55\x5c\x5b\x09\x03\x24\xd9\x91\x33\x73\xc4\x2b\xcb\xfe\xa7\xaf\x5f\xfe\x9e\xed\x2b\xe3\xc3\xa7\x36\xe6\x78\xc3\x3e\x41\x20\x2a\x60\xfa\xfc\x7c\x7f\xdb\x35\x92\xb2\x8f\x8e\x40\xf2\x06\x92\x32\xdc\x26\x21\xba\xfe\xc2\xa2\x92\x69\x4b\xc8\xfa\x39\x3e\xb9\xa1\xf3\x97\xa3\xee\xae\x6a\xb5\x81\x29\xac\x3f\x2d\x17\x63\xa6\xae\x00\x28\x1b\x99\x2f\x61\x79\xc5\x4e\x41\x6e\xb7\x1f\xcf\xad\xb4\x8f\xba\x6e\x5a\xc4\x25\x5d\x6e\xf7\x02\x79\xd9\xe5\x0c\xf7\x18\xc7\xbc\x86\x27\x0f\x01\x68\x17\x69\x7b\xac\x0b\xc3\x11\xdd\xb3\x22\x4e\x3c\x98\xd8\xde\x84\x9e\x24\x9d\x07\x12\xde\xa7\x6e\x2b\xcc\xd9\x0f\x7d\x76\xa9\x79\xa6\x7c\x1e\xb9\xaa\x8f\x9c\x97\x67\x8e\x0e\xfd\x7c\xca\x41\xa7\xe8\xfe\xf0\xe3\x33\x32\xa5\x5b\x11\xf1\x2d\x5a\xab\xd1\xde\xc9\xbe\xd3\x8a\x54\x37\xa3\x1c\x01\x14\x81\xec\x6d\x0c\x84\x9e\x64\x3b\x56\xee\xb6\x3e\xb1\xb6\x0b\xb1\xb7\x77\x6f\xd2\x70\x55\xdc\x33\x8f\x9b\x39\xdb\x8c\xd9\xf6\x5b\x7f\x35\x7e\x1a\x40\x19\xc8\xc7\x7f\x7f\xa8\x76\xe9\xbc\x7e\x52\x88\x26\x91\xa5\x99\xdc\x5b\x3f\xd2\xae\x07\xae\x7c\x39\xf9\xd9\x8a\xc1\x42\x3c\x55\x09\x89\x5c\xef\x00\xb4\x88\x3c\xa2\xe0\xf8\x6a\x89\x90\xd1\xf3\xf1\xf3\x52\x35\x97\x09\xf1\xc5\xb7\x17\x43\xa8\x1d\x75\x03\x3b\x5a\x8f\x2f\x5d\xb7\x70\x69\x49\x95\x3b\x87\x01\xd0\x02\x72\x59\x2f\x94\x56\xda\x53\xbc\x2c\x74\x0f\xc1\x80\x33\x87\x4f\x07\xd9\x32\xd8\x96\x12\xaa\xb4\x27\xea\xf4\xcb\x9f\xbb\xc6\x72\xc9\x71\x19\x00\xc8\x1d\x19\x98\x1f\x64\x89\xb9\x3f\x73\x95\x46\xd8\x9b\x2b\xd9\x37\x8d\xdc\xa8\x89\xc5\xc2\x4f\x99\xeb\xdd\x79\xb2\x71\x69\x53\x8b\xc7\x6b\xb3\x0a\x40\x93\xc8\x8a\x2a\xc0\xcc\x3f\x6d\xcc\xde\xc4\xf5\xae\xa9\x85\xfb\xcb\x7b\xbe\xfc\xd0\xf0\x7b\xe5\x6e\xbf\xa0\x6c\x82\x4a\x96\x51\x96\x67\xce\xcd\x00\x40\x99\x48\xf3\x79\x7d\x69\xef\x4c\x7b\x50\x09\x5d\xb3\xa5\x6e\x36\x7b\x46\xc4\xf4\xf4\x77\x47\x82\x1e\xe5\xaf\x91\x3f\x77\x25\x67\xa0\xab\x2e\xf2\x00\x2a\x42\xae\xd2\x66\xd1\x0e\xd5\x8a\xc1\x0b\x9a\xbc\x81\x18\x9d\xb9\x82\x27\x8d\x32\x8e\x7e\x6c\x42\x0c\xc5\xd7\x0f\x9c\x61\xec\x9e\x15\x6d\xb8\x08\x00\x04\x90\xfd\x00\x9f\x2d\xf6\xfb\x68\xde\x87\x1c\xe5\xb4\xbc\xab\x82\xb7\xe4\x4d\xf5\x06\x2a\x14\xe7\xba\x0b\x45\x8c\x86\x02\xee\x32\x65\x38\xb9\x03\x68\x0b\x39\x82\xcf\xf6\xfc\x52\xe1\x2f\xd6\x22\x76\x4d\x55\x2a\x91\x8c\x8d\xe4\x6b\xd3\xc9\xd5\xdd\x29\x37\x9b\x30\x78\x70\xf7\x64\xf5\xaf\xe3\x86\x8e\x00\x9a\x45\xb2\xa2\x50\x9f\xe9\x73\x85\x6b\x78\xeb\x64\x05\x5b\x8b\x3c\xe5\x0c\xec\xb7\x7f\x2b\xd0\x28\xcc\x0e\xb3\x76\xd5\x2e\xad\x3d\x73\x24\xfe\x04\xa0\x65\x64\x2c\xaf\xd3\x5c\x8b\xfc\xe3\xea\x17\xac\xc3\x25\xca\x51\x6b\x49\x82\x2f\xaf\x2a\xee\xe9\xae\x96\x1d\xb5\xd5\x7a\x52\x81\x1a\x5a\xb7\x03\xd0\x32\xb2\x84\x25\x08\xdd\x27\x3f\x32\xdf\x6a\x99\xe5\xcb\xda\x7e\xe9\x7b\xd7\xed\xce\x33\xcd\x1c\xbd\xc9\x1a\xc1\xef\xbb\x88\xec\xf5\x4b\xaa\x6f\x01\x00\x65\xff\xd5\xcd\x12\x9d\xf5\x8b\x98\xee\xf8\xe3\x45\x92\x2d\x70\xf1\x29\xc6\x2d\xd1\xda\x2c\xdc\x6d\x5f\x6b\x13\x97\xbf\x23\x77\x4d\x2e\x51\x08\x40\x15\x48\x0e\x9e\x7c\xaa\x80\xf4\xa2\x72\xa1\x9c\x84\xc6\xa2\x40\xf7\x20\x77\xae\x1a\x65\x85\x67\x41\xd5\xac\x01\xfe\xa9\x78\xce\x19\xf9\x7e\x45\x00\x20\x17\x64\x62\xae\xc7\xc9\x06\x58\x54\xff\x14\x97\x7a\x6d\x5d\x57\x77\xee\xa9\xfd\xa4\x61\x99\x63\x65\x7b\xc4\x58\xd9\xd3\x67\x8f\x03\x37\x98\x5c\x00\x34\x8c\xb4\x66\xe5\xca\xc8\xcd\x32\xfd\xcb\xe9\x34\xfc\xf8\xcb\xdf\x68\x72\x2d\xbd\xf2\x5a\x18\x38\x75\x95\x6d\x68\x38\x09\xc8\xba\xa2\xa6\x87\x10\x97\x5e\xfd\x7e\xc3\xc9\x31\x4c\xe7\x42\x7c\xf2\x74\x55\xe5\x2c\x95\x8a\x75\xfd\x8b\x62\xa5\x43\xf2\x1d\xbf\x44\x5d\x62\x5d\x6d\xda\x14\x90\x8b\x4f\xd3\xe1\x4e\x6b\x74\x69\x44\x0d\x95\xe1\xb1\x85\x54\x39\x22\x9b\x76\x5d\x37\xc6\xb4\x37\x1f\xbe\x9e\x9f\xe4\xaa\x7e\xff\x47\x06\x29\x07\x55\xcd\x5c\xe5\xa4\x90\xc7\x44\x31\x7f\x25\x7d\x93\x5d\xf7\xaa\xe3\x58\x83\xd5\xdd\x1a\x29\x83\x1f\x41\x6a\x61\x67\xac\xe5\x7b\x10\x97\xf6\x6c\xaf\x69\xbc\x25\xcb\x1c\xe8\xb4\x3a\x79\x63\xde\xf8\xfd\x63\x41\xad\x2a\x21\x02\x0f\xbf\x39\x16\xc7\xeb\xee\x1e\x0f\xd9\x3b\x1d\x01\x14\xfa\xd7\x71\x61\xa6\x98\x83\x4f\x85\xc3\x7d\x24\x9d\x82\xac\xbb\xac\xfd\xa8\x6d\x8e\x8b\xde\x37\x92\xfc\xe5\xb6\xa8\xd9\xa7\xf6\xbd\x58\xa6\x0c\x40\x1f\x91\x6c\xd5\x3d\xde\x18\xb2\x7b\x7d\x7a\xd8\x3a\xe4\xab\x9f\x4c\x2f\xff\xf5\x3e\x11\x3e\x87\xa4\xb8\xea\x78\x15\x33\x55\xa9\xa1\x4d\xca\x0d\x00\x55\x20\x9f\xbb\x77\xbd\x6d\x06\x99\xd3\xfa\xab\xda\xc0\xe6\x9c\x5c\x96\x8d\xe4\x2c\x8c\xfe\xec\x4a\xe6\x89\x08\x9d\xa1\x77\xcb\x20\x5a\x42\xc0\x11\x40\xce\xc8\x2c\x14\x6b\x98\x2e\xb0\x52\x8d\x08\x67\xa3\xf9\x29\x63\x78\xe0\x4d\xf8\x73\xcb\x92\x48\x39\x9e\xa7\x43\x26\x4f\x0c\x3f\xbe\x4e\x8c\xa2\x00\x50\x09\xb2\x75\x3d\xe9\xb3\x55\x24\x55\xd6\x5a\xbe\xa8\xac\xa4\x20\x2a\x6a\x62\xc2\xbe\xad\xc8\xf3\x92\x80\x89\xa4\x9e\x72\x1e\xe4\x77\xe3\x9d\x03\xd0\x04\xb2\x60\x38\x3a\x92\x6e\x46\x56\xaa\x6f\x92\xfe\x4a\x61\x1c\xb5\xc8\x2f\x4f\x39\xc2\xcd\xdd\x9d\x52\xba\xfd\xc4\xe8\xcf\x60\xde\xe9\xf9\x74\x0c\x80\xde\x22\x9d\x4d\x7f\xb4\x1e\x4b\xd5\x68\xf4\x8d\x27\x74\xf9\x05\xc5\x65\xeb\x6d\x83\xe2\x59\xb2\x9b\x44\x9f\xf9\x04\x3a\xc2\x84\xcc\xa6\xec\xdf\x01\x00\xb9\x22\xaf\x1f\x3b\x7d\x84\xe7\xc5\x71\x86\x3f\xda\xca\x71\x21\x42\xd7\xdd\x89\xee\x29\xaf\x74\x9a\x5a\xbd\x2a\xef\xab\xbe\x6b\x10\x62\x26\xfe\x11\x40\xa1\xc8\x82\xe1\x9e\x2c\xd2\xcc\xd1\xc0\xee\x52\x6b\xd4\x4a\xc9\x53\x3c\xca\x97\x56\x6f\xf9\xf8\x0a\xbd\x4b\x77\x8f\xa2\x09\x71\x92\xc1\xc4\xfe\x57\x40\x50\x89\xa0\xa4\xc4\x7f\xff\x84\x82\xa5\x6b\x54\x2a\x88\x05\xf4\xc1\x4a\x2b\x2a\x19\xc4\x02\x86\x61\x9e\x8d\xca\x06\xb1\x80\x66\x78\xd8\x44\xe3\x83\x38\xc0\x20\xbc\x7b\x8e\x4a\x08\x71\x3e\xc0\x3b\x02\xa8\x94\x10\x0b\x58\x81\xf7\x3d\x51\x49\x21\x16\xb0\x01\x8b\xbf\xa8\xac\x10\x0b\xa8\x84\xcf\xa7\xa3\xf1\x42\x1c\x60\x0d\x9e\xa8\xd0\x88\x21\x0e\xf0\x15\x7e\x0e\xa8\xcc\x10\x0b\xa8\x83\x95\x26\x54\x6a\x88\x05\x04\xc3\x61\x45\x23\x87\x38\x40\xdb\xff\xff\x23\x8e\xca\x11\xa5\xd9\x68\xf0\xfe\xdb\x06\xa9\x41\xae\xcd\xb4\x4b\x52\x8b\x09\x5a\xb7\x55\x53\xa5\x5f\x9b\x34\xd4\xea\x54\x3b\xe4\xaf\xd5\x13\xbc\x8d\x7d\xf8\x2b\x54\x1f\xdf\x44\xb2\xf7\x16\x06\x40\x71\x48\x42\xd7\x1c\xfa\x5e\x10\xdf\x3c\x9f\xd1\xa4\x9e\x88\xeb\x99\xbc\xf0\x43\xab\xc2\x8b\xd7\xf9\xdc\x87\xa8\xdd\x83\x8e\x3d\x7c\xf7\xa3\xd8\x1a\x03\xa0\x50\x64\x8b\x18\x38\xb9\x40\xef\xb4\x7a\x48\xe7\x8b\x94\xeb\xa6\x1b\x71\x73\xff\xf3\x9b\xac\xe1\x39\x23\x43\xf9\x9a\x16\x15\x93\xaa\xbb\xb1\xd1\x18\x00\xed\xfc\xf5\x3a\x8f\x70\xc6\x21\xe7\x08\x49\x93\xcf\x9a\x86\xd9\x25\xd2\x0a\x1c\x95\xec\x04\x25\x85\x43\x7e\xea\xf1\x44\x36\xda\x9e\x41\xd5\x6e\xbc\xff\x66\x36\x2e\x3e\x35\xff\x7f\xc9\x0b\x8a\xdd\x38\x40\x1c\xac\xa2\xa0\x19\x8e\x03\x84\xc2\x3a\x0d\x9a\xe5\x38\xc0\x0e\x9c\x76\xa8\x2c\x1d\x0b\x88\x82\x01\x68\x3c\x1d\x07\x48\x3a\xb2\xfe\xf1\xc0\x3f\xd2\x75\xe9\xa8\x4f\x12\x2c\x6e\x18\x00\x55\x20\x93\xc2\x13\x3f\x51\x5b\x4b\x9f\xa7\x2a\x93\x2e\x1e\x62\x96\xf4\xe1\xac\xe0\xed\xfb\xf5\x74\x90\x86\x30\xea\x61\xa7\x08\xa9\x59\x05\xd9\xde\xf0\x8f\xd4\x7f\x13\xe3\xd9\x1a\xcf\xee\x0e\x1c\x32\x16\x57\x2b\x77\xd5\x3f\x03\xa4\xb7\xec\xee\x25\x24\x54\x2b\x32\xf0\x7d\x1c\x75\x2d\xb6\x17\xc3\x00\x28\x02\xc9\x7f\x5d\xb2\x79\xf2\x14\x43\xfb\x64\xee\xf3\x3c\xb7\x9a\xbc\xa1\x3e\x1e\x37\xfa\xc7\x54\x9b\x82\xd1\x3f\x2a\x87\x9a\x93\xdc\xe1\xc1\x7b\x0c\x80\x62\xfe\x7a\xf7\xf6\x77\x59\xf7\x71\xde\xd5\x3f\xdb\x55\x15\xb3\xa7\xb4\x13\x9d\xa3\xae\xc8\xfc\x60\x5f\x56\xe0\x5e\xa8\x76\xa6\x8a\x03\x7d\x7c\x18\x00\x75\x22\x0f\x78\xb9\xf4\x7d\x08\xb9\x0c\xf8\x8d\x45\xa9\x95\x6d\xe8\xc2\xba\x3f\x0b\x5d\x8b\x1f\xbd\x13\x50\x4f\xfa\xe1\xee\xd9\xd3\x2a\x6d\xdc\xfd\x18\x00\xb9\x20\x7f\xbf\xe4\xb2\xa3\x67\xee\x4b\xb2\x2f\xb7\x83\xaf\x14\x7c\x7e\x62\xa6\xea\x21\x28\x92\xdc\x2d\x1e\xcf\x77\x3c\x21\x66\x27\x68\xa3\x3e\x03\x03\xa0\xd8\xbf\xfe\xcb\xb9\xe8\x6f\xcd\x11\x7e\x76\x6b\xd4\xc9\xaf\x20\xec\xc3\x79\x9a\x47\x1f\xc7\xeb\x3d\x0e\xe9\x31\x3a\x47\xde\xa2\xe7\x33\x61\xea\xc5\x00\xe8\x33\xb2\xbd\x92\x96\x0e\x5b\x09\xc9\x3d\xf1\x7a\x97\x7e\xb5\xb9\xa6\xb1\x47\x66\xd5\x2e\x53\xa7\xcd\x79\x42\x7e\x53\xd2\x39\x63\x5c\x86\x77\xff\x13\x17\x68\x61\xc7\x3d\xdf\x0a\x38\xa9\xd1\xe2\x8e\x03\x38\xc3\x32\x0a\x5a\xe0\x71\x80\x08\xb8\x81\xa0\x45\x1e\x07\x88\x81\x57\x01\x5a\xe8\x71\x80\x4e\xf8\xcc\x19\x5a\xec\x71\x00\x17\xf8\x0e\x68\xc1\xc7\x01\x62\x61\xc9\x1b\x2d\xfa\x38\xc0\x67\x58\x92\x43\x1d\x5a\xb1\x00\x0c\x5c\x2b\xd0\xc6\x56\x1c\x20\x1d\xde\xee\x42\x1b\x5c\xb1\x00\x49\xf6\xfd\xeb\x51\x27\x57\xec\xf5\x37\x60\x95\x1f\x6d\x74\xc5\x71\x17\xb8\xa3\xa1\x0d\xaf\x38\xc0\x2e\xf1\x7a\x23\xc1\xbf\xcd\xb0\x40\x5a\x9a\x0d\x0f\x72\xc1\x00\x49\x56\xc4\x4a\x20\x7a\xff\x2a\xec\xc8\xc3\x05\xd3\xb5\x33\xda\x4a\x3d\x5c\xdc\xc4\x75\x45\x4f\xea\xe7\x3d\xd7\x7a\xbe\x48\x47\xf7\x81\x23\xa7\x8b\x30\x00\x5a\x42\xd2\x64\xfb\x05\x8f\xb7\x1b\xfe\x07\xde\xf7\x3a\x2c\x14\x01\x43\xa3\x21\xcb\x98\xe0\xa9\x36\xab\x6e\x76\x03\x8d\x1a\x89\xab\xe5\x9c\x4c\x18\x00\xb9\x22\x2b\x51\x60\xb4\xc4\x58\x9e\xf1\x94\xd3\x7d\x36\x21\x97\xe2\xf3\x9c\x55\x42\xbe\xcd\x3b\x35\x79\x1e\x6b\xc1\xdc\xaf\xbf\x14\x2c\xbf\xd9\x6b\x67\xb9\x48\x45\xab\x86\xea\x99\xb1\x85\x1f\x39\xfb\xa9\x8b\x64\x9c\x6b\xf8\x8a\x1c\xe2\x04\xf6\x18\x27\xd6\xd7\x0d\x4b\xe7\x36\xe8\x1a\x7e\x1b\xc5\x62\x00\x14\x80\x1c\x49\xae\xfa\xa5\x17\x19\xdc\x25\xc0\x27\xde\x6a\x9d\x35\xfd\xd2\xfe\xca\x73\x6c\xe6\xb3\xdc\xa7\x58\x69\x33\xc9\x17\x01\xb4\x2e\x5e\x8c\x18\x00\x75\x21\xed\xe1\xd6\x05\x21\xef\x1e\x2d\x11\x2d\x54\x2c\xdf\xcb\x5d\x8e\x48\x61\x7c\x47\xc1\xbe\x4e\xf2\xf5\xe0\x73\x89\xe3\x27\x44\x1f\x8b\x38\xf3\xfc\x5b\x58\x70\xcf\x97\x15\xfe\x8f\x35\x4a\x58\x70\x8f\x6b\x09\x7e\xbe\x68\x71\xc1\x01\x5c\xe1\x4a\x81\x16\x18\x1c\x20\x17\xe6\x75\x68\x91\xc1\x01\x02\x60\xf6\x8b\x16\x1a\x1c\xa0\x0b\x36\x09\x55\x05\xc1\x15\x2f\x58\xf8\x46\xd5\x41\xb0\x80\x0c\xb8\xc1\xa2\x29\x21\x38\xc0\xe2\xff\xbf\xd3\x88\x26\x85\x60\x01\x0b\x70\xc5\x46\xd5\x42\xb0\x00\x77\xb8\x78\xa1\xaa\x21\x58\xc0\x24\x1c\x56\x54\x39\x04\x0b\xc8\x84\x7d\x40\x15\x44\xb0\x80\x22\x98\x9b\xa2\x2a\x22\x58\x00\x80\x07\x23\x34\x4d\x04\x07\xd8\x82\xb7\xd2\x51\x45\x11\x2c\x60\x16\xae\xd8\xa8\xb2\x08\x16\xb0\x0c\x87\x15\x55\x18\xc1\x01\x60\x06\x8f\xaa\x8c\xe0\x2a\x2a\xfc\x1c\x50\xb5\x11\x5c\x33\x87\xfb\x1a\xaa\x38\x82\x6b\x84\x70\xb6\xa2\xc9\x23\xfb\xe3\xe3\xc1\xf5\x59\xfc\x7f\x53\x49\x80\xa4\xea\xde\x80\xe0\x88\xe4\x3a\x33\xa2\xb4\x94\x84\x44\x09\x11\x52\xb4\xd3\x3a\x13\xfe\xe3\x6f\x7e\x68\xce\xf0\x3e\x59\x6a\x08\x75\xf7\xa7\x91\x32\x24\x28\x1f\xc5\x00\xa8\x05\xa9\x0d\xbc\x21\x95\x54\x8c\xa6\x36\xaa\xcb\x5b\x37\x82\x76\x43\x75\xb3\xc5\xa6\x7e\x79\x53\x48\x3c\xff\xaa\xaf\x2c\x17\x94\xed\xb3\x7e\x16\x03\xa0\x1e\x64\x85\x27\xce\x77\x51\xed\xef\xe6\x3f\x68\x38\xfd\x82\xa8\xf3\xdd\xb2\x9f\x29\xc5\x8e\x5d\x2d\xa7\x78\xee\xdd\x85\x8a\xdc\x1e\xd1\x1a\xf3\x3d\x42\x8b\xe4\x76\xc2\x57\xf3\xa7\xc4\x38\x02\x82\x59\x1f\xf3\x51\x68\x71\x9f\x5e\x34\x6c\x77\xbb\x6e\x9c\x58\x22\xd9\x2e\xca\xa9\x17\xf3\xeb\x76\x0e\xef\xbf\x99\x8d\x0b\x8e\x23\x9c\x11\x68\x76\xe3\x00\x2d\xf0\x98\x89\x66\x38\x0e\xd0\x03\xd7\x60\x34\xcb\xf7\xe9\x3b\x09\x7c\x8a\x09\x4d\xaa\x02\x52\x64\x47\xff\x7b\x83\x62\x25\xf2\xdf\x7a\x03\x7f\x22\x8e\xd5\x48\x8c\x0d\x17\xd6\x9c\xb8\x42\xb4\x49\xd1\xcb\xf7\x80\xbe\x46\x46\xf7\xf9\xcb\xca\xfc\xbe\xe1\xef\xad\x71\x7b\x3d\x2d\x1b\xc9\x4e\x19\xfc\x63\xda\xf5\x07\xeb\xc9\x63\xe2\x27\x3c\x9e\x55\xc7\x30\xd7\x1e\xd0\xe2\xb3\x4a\xb8\xb0\x6a\x7e\x3a\xfe\x72\xa3\x7b\x08\x39\x06\x40\x3f\x91\x4f\x80\xdd\x3d\x36\xee\x71\x5b\x41\x69\xa5\xff\x41\x3f\x9e\x31\x3d\xb6\x52\x62\xa0\xfc\xe6\x3c\xb7\x9a\xcb\x20\xe7\xfd\x50\x96\x00\xc5\xbd\xb6\x80\xec\x99\xce\xf7\x2f\x30\x59\x19\x94\x8b\xa8\x6e\xe3\xb5\x90\x69\xb2\x7e\x77\x34\xc7\x4f\xb1\x61\xdb\x2d\x49\x7d\x15\x30\x22\x4e\xa6\xe4\xb3\x57\x51\x91\xdb\x11\x6c\x63\xb4\x2e\xcf\xe5\xdd\xc5\xce\x9e\xf9\x3e\x55\x68\x07\xbe\xc5\x0d\xa5\x9b\x9d\x7e\x14\xf9\x54\x32\x5a\x76\xf0\xb6\x5e\xbb\x00\xef\xbf\xb9\xb9\xaf\x0b\xc0\x67\xba\xd1\xfc\xdc\x5f\xc2\xff\x7f\xb9\x2c\x8a\xa3\x38\xc0\x4f\x98\xcb\xa2\x79\xba\xdf\x34\xe1\x22\x81\xe6\xea\x7e\xc3\x39\x02\xa7\x04\x9a\x24\x09\xa4\x98\xd8\xdd\xf6\x52\x22\x00\x29\x62\x5f\xec\x7d\x3b\xf0\x22\x6e\x7a\xd2\x81\x38\xf6\xcb\x41\xe1\x25\xf5\xbe\x0b\xb7\x24\x34\xe9\xec\x1c\x6e\xd4\x9c\xbe\x7b\xb4\xd7\xa4\x6e\x8f\x2f\x23\x07\x34\x92\x20\x41\x3b\x03\x6e\x6e\x87\x13\x7d\x59\xfa\xce\x56\xf8\x34\x83\x03\x64\x73\xfd\xbc\x2b\x64\x09\x84\x0d\xc5\x96\x8e\xb4\xbf\x30\x00\xfa\x84\x5c\xf4\x5e\x17\xcd\xdf\x1c\x6d\xff\x40\xa8\xd0\x99\xa4\x5e\x3c\x03\xf4\x66\x6d\x67\x49\xec\xcb\x0d\x2b\x6d\x3c\x4f\xc8\xe9\x5f\x2d\xb9\xbd\x47\xaf\x91\x29\xfa\x88\x62\xbc\x7b\x45\xf5\xb5\x8f\x60\xee\x4d\xb2\x77\xac\x77\x39\x2c\xa2\x7e\x9c\x79\x57\x69\xcd\xce\xf3\xb1\xeb\x95\x47\x8e\xda\x31\x0c\x80\x8a\x91\x0a\xdf\x87\x14\x1d\xe6\x40\xc3\xce\x88\xfc\xf6\x72\x03\xf5\x6c\x6b\x8f\xa8\xfe\x68\x73\x79\x31\xf3\x15\x17\x0e\xb7\x30\xb6\xa5\x31\x77\xde\x7f\x73\x73\x9f\x83\xc0\x9d\x09\xcd\xcf\xfd\x59\x02\x9e\x87\xd0\x1c\xc5\x01\x3e\xc1\x55\x02\xcd\xd3\xfd\xe1\x03\xce\x52\x34\x57\x71\x80\xe2\x13\xeb\xa1\x04\xff\x26\x3d\x03\x69\x09\x25\xac\xf2\x93\x8b\x5c\xf6\x87\x5f\x37\x52\xea\x5b\xe4\x91\xe3\x77\x75\xa4\x2b\xa7\x08\x8c\xd1\xbd\xa7\x51\x50\x1a\x7d\xec\x67\xf6\x14\x9c\x1b\x3e\xd6\xdf\x89\x01\x92\x4c\x48\x11\xd7\x82\x56\xc7\xc7\xc3\x46\x80\xde\x9b\xba\x9f\xd6\xf6\x50\x91\xe3\xb4\x85\xc5\xc3\x1f\xb6\x4e\x0a\x47\x77\xe2\xba\xa9\xae\x57\x63\x00\xd4\x8f\x14\x72\x8e\xff\x7c\x23\x72\x7d\xca\x39\x8e\x35\x69\x7e\xbd\xd8\x8b\xe8\xc0\xb5\xb1\xef\x0f\x64\xfa\xc8\x99\x9a\x5d\xe5\xc5\xdf\x90\x47\x65\x00\x00\x95\x23\x53\x48\xfc\xab\xd0\x4d\x2e\x1b\xb2\xb0\x4a\x9a\x2d\x6a\xe9\x75\xd2\x2a\xdd\x9c\x63\x8b\x4f\x1e\xdf\xbc\x4d\x95\x36\xdc\x17\xd9\xc8\x70\x09\x40\x15\xc8\x9f\x1f\x6f\x3c\x31\x29\xf2\x47\xf2\x51\x49\x21\xed\xbd\xcb\xe6\x44\xe6\xa9\x02\x87\xbe\xb9\x8c\x29\x1e\x6f\x5e\x21\x52\xb9\xc2\x49\xe5\xc2\xfb\x6f\x4e\xee\xaf\x48\xca\xfd\x49\x0b\xcd\x4d\x1c\x13\x67\xda\x7f\x5c\xa8\x6e\x62\x6f\xd0\xff\xff\xa3\x91\x68\x7e\x62\x01\xe5\x70\x06\xa1\x79\xba\x4f\x24\xe0\x3b\xa0\x6e\x2d\xe0\x94\x2b\xb8\x31\xa1\x6e\x2e\x60\x01\x1f\xe1\xe3\x1b\x68\xdb\x0b\xfb\x26\xc1\xec\x09\x75\x7f\x01\x27\x54\xc0\xa5\x17\x75\x87\x01\x0b\x28\x81\xa3\x84\xb6\xc7\x80\x03\x4c\xc0\x4c\x1c\x75\x93\x01\x0b\x78\x0b\x3b\x8d\xba\xcb\x80\x1b\xa1\x60\x00\xda\x3e\xc3\xfe\x73\x20\x58\x0f\xa7\xc4\x22\xa2\xed\x1e\x0c\x5e\xab\x99\x54\xbe\x41\x37\xb2\xa2\x48\x7d\x2f\x7f\x85\x81\xe7\x40\xd3\x93\x48\xa3\xa8\x7e\xf6\x74\x5f\x8a\x3b\xcb\x40\x7a\x77\xf8\xe7\x6e\x10\x03\x72\x59\xce\x38\x32\x46\x1d\xa8\x9f\x15\xc7\xbb\x31\xf0\xfb\x0c\xa3\x43\x66\x8c\xf6\xd9\x32\x3e\xcf\x8b\xc3\xaf\xdc\xfe\x44\x4c\x9f\xde\x5b\x66\x7e\xc8\xe6\xfa\xd1\xfb\xf5\x32\x31\x2f\xe3\x35\xe6\x71\x17\xc9\x94\xe4\x9a\xab\x2c\x05\xb1\x8a\x75\x3a\x0c\x74\xa6\x17\x0c\x2a\x0f\xf3\x06\xe5\x03\x68\x1a\xa9\x8c\x25\x35\x64\x87\x89\x8f\xd2\x86\x95\xb3\xe7\x1d\x31\xdb\xed\x11\x9b\xfc\xd1\xfb\xda\xa8\xba\x39\xb6\xf8\xfa\x5c\x8e\x0a\x98\x63\xdb\x2b\x8e\xc8\x79\x3a\xb2\x62\x56\x92\x8b\x82\x3a\xfe\x55\x34\xc9\xe6\xfb\xb2\xdd\xfe\x57\x3c\xb9\x77\x34\xb5\xd9\xf0\xc6\x2e\x25\x0e\x7d\x28\x8c\x6c\xc4\x00\x28\x07\xc9\xfe\x0a\x8c\x2d\xba\xec\x14\x15\xf3\x74\x3b\xb6\xd8\x96\x8d\x99\x36\x8e\xb5\x4b\x18\x78\x8f\xbc\x14\x0e\xa7\xcf\xf6\xf6\xa5\x6e\xad\x46\x5c\xda\xa4\x95\xb6\xfc\xb4\x6c\x52\x76\xfd\x0a\x43\x01\x35\x89\xe9\x08\x67\x8c\x84\x3b\xc9\x29\xee\xda\xd1\x78\x05\x72\xde\xa2\xc9\x1c\x00\x24\xb9\x11\x97\xd3\x6d\xcb\xca\x6e\x2d\x4e\xf9\xd2\xcc\x2a\x45\x29\x55\x44\xc6\x07\xbd\xb2\xe4\x72\x14\xcd\x24\x62\xd3\x24\x48\xf5\x74\x69\xfb\x0d\xa0\x69\x24\x49\xa1\x98\x22\xd9\x90\x0e\x77\x27\xa8\xaa\x7d\x63\x21\x3d\x78\x5d\x4d\xb0\x86\x53\xa2\xfd\x05\xb3\x46\xf0\x1f\x0f\x7a\xce\x7e\xd6\x65\x00\xa0\x5e\xa4\xe1\xce\x89\x4a\xa7\xdc\xbe\x0d\x28\x0d\xb4\xf4\x35\x1f\x8d\xa8\x2f\xb6\xa5\x54\x61\xe2\xef\xbd\x58\x6e\x19\xb5\x61\x6b\xe0\x9a\xb6\x09\xa0\x1d\x64\xb1\xfd\xd2\xb9\xce\xde\xe1\xba\xd1\x29\x92\x1d\x7e\xe5\x5e\x23\x19\xe1\xc4\x89\x3b\x73\x42\xdd\xaf\x85\x24\x1a\x68\xfe\xd0\x69\x57\xed\xee\x35\x79\x64\x83\xd4\x7f\x9e\x72\x5c\x3f\xba\xbb\x37\xe2\xc7\x4d\xb5\x8d\xaa\xfb\x0a\x8f\x52\x97\xee\x6e\x59\xaf\x40\x56\x31\x7a\x0d\x2c\xde\xac\x2e\x8e\x00\x8a\x47\x36\x78\xe3\xc7\xcd\x9f\x17\xcc\xd7\x6d\x2d\x4b\x2f\xd6\x51\xc8\xb5\x49\x10\xdf\xe4\xc8\x32\xde\xee\x96\x7c\x91\x1b\xcd\x7f\x87\x21\xd6\x0b\x40\xb3\xc8\xc7\xa4\xde\xe9\xe7\x99\xc4\xde\x57\xc2\xa8\x25\x5f\xc6\xb8\x40\xbb\xba\x43\xf2\xd0\x5f\x81\xd7\xaa\xda\xd2\x45\x65\x72\x30\x7a\xf6\x2d\x80\xe6\x90\xce\x72\x9b\xab\x76\xf0\x7e\xf0\x00\xad\x2b\x33\x3e\xfa\xcc\x91\x1a\x09\x8f\x8c\x1a\xd8\x0d\x1a\x0e\x9c\x38\xdd\x63\xbc\x74\x6f\x60\x0c\x00\x28\x05\x69\xfd\x24\xcd\x9b\x06\xdf\x6d\x4f\xf5\x05\x41\xa9\xd6\x0e\xba\xfa\xe3\xe5\xa4\x4c\xcf\xfa\x5c\x55\xfb\x6d\x2b\x97\xb7\x95\xd4\xde\x27\x03\xe8\xf3\x5f\xaf\x42\x2a\xe4\x3a\x68\x49\x72\x6f\x2b\xa8\xf2\x7e\xf6\x87\x93\xe6\x8b\x23\xe7\xbb\x1d\xcc\x2e\x05\x9f\xbf\xa2\x66\x3a\x71\xf2\x93\x99\x92\x23\x80\x52\x90\x7b\xec\x5f\xeb\x3d\xc4\x58\x88\xab\x2e\x50\x30\xdd\x9b\x56\x5d\xb5\x5b\x64\xbf\xb3\x18\xd4\x18\x3c\x7c\xe2\xe7\x58\x5e\xa1\xac\x42\x39\x15\x80\x9a\x91\x3f\x7f\xa5\x9c\xc2\x30\xd8\x5d\x4e\x93\xb9\x9f\x78\x6b\xb6\x8b\x8f\x9a\x76\x3e\xe0\xad\x2a\x34\xb8\x99\x32\xbe\xf9\xe8\xd1\x49\x7c\x5b\x00\x4d\x23\xf7\x4e\x1f\xdf\x4e\x8f\xbe\xf4\x6b\x6b\x66\x98\x13\x93\xb0\x08\x6a\x5a\xd3\x52\x64\xa9\x98\x6b\x39\x3e\x84\x5b\xdd\x19\x9b\xe8\x2b\x51\x46\x5c\xca\x1f\x7e\xea\x37\x35\xc9\xd4\x5b\x3d\x5b\xf9\xf2\x23\x5c\xbf\x92\x8f\x76\x33\x7d\xec\x4f\xce\x6f\x3d\xff\x65\xee\xf0\xd8\xd8\xae\x96\x23\x80\x5c\x91\x86\x3b\x98\xf1\xdb\x71\x4a\xf7\xdf\xb3\xec\x5b\xb4\xe4\x6f\x02\xa9\x0b\xcd\xa6\x87\x5f\x38\x51\x11\x89\x1b\xc5\xbc\xe2\xed\xca\xa0\x05\x50\x19\xf2\xd8\x47\xac\x46\xf1\xdc\xe2\xbc\x93\x10\x9f\x98\xf4\x4b\x5b\xcf\x9b\xe7\x78\xf5\x1e\x36\x3e\xa0\xcf\xd6\x69\x11\xd8\xca\xa5\x62\x35\x8d\x00\xd0\x26\x72\x52\xdb\x38\xf7\xc8\x38\x5a\xa1\x48\xc5\x5e\xf9\x87\x5c\x82\xf9\xef\x37\x69\x74\x94\x9f\x2d\x29\xda\xca\x7b\xf9\x45\x83\x9a\x2b\x93\x91\xc7\x78\x62\x24\x66\x7b\x88\x78\xf1\x9d\x9c\xd9\xd7\xcc\x39\x7e\xcd\x46\xac\x1d\x27\x1c\x6f\x6a\x30\x8b\xa6\x8e\x27\x94\xbf\x72\x43\xaf\x0d\x79\xa4\x6c\x5b\xdc\x7b\xc7\x3b\x6c\xec\xb5\xfe\xdb\x84\xa6\x08\xe2\xaf\x84\x74\x79\x13\x02\xdc\x55\xc2\x1d\x2c\xa3\xa1\x1f\x63\xe4\xf6\xd8\x7e\x29\x32\xda\xf8\xab\x37\xdb\xa4\xb9\x74\x5f\xa4\xc6\xfa\x2c\x90\x68\x8d\xdd\xc2\xcb\xd4\x8f\x39\xfb\xc0\xef\x8a\x99\xac\x52\xc3\xf9\xb4\xf9\x72\x47\x00\x79\x20\x33\x97\xfe\xb0\xd9\x85\x79\x0f\x17\x2d\x15\xa3\xd6\x88\x63\x19\x2d\x57\xfb\x8c\xf0\x9b\x56\x9c\x3d\xab\x35\xc4\xa8\x38\x7e\xc7\x6a\xb3\x01\xe8\x1d\xb2\xef\x9f\xba\x7b\x24\x94\xb2\x77\xb3\xe3\xb4\xee\x27\x7a\xb3\xfe\xdd\x05\x1a\x99\xd2\x75\x3a\x1a\x75\xfa\x6f\xa7\xdd\xe9\x39\x44\x75\xed\x00\x34\x82\xcc\xc4\x8f\x76\xe6\x87\x4f\x8e\x7d\x7e\x8d\x5f\xf3\x80\xe9\x8e\x2f\x61\xbc\x63\xaa\xda\x80\xc7\x89\xf6\x93\x15\xab\x72\x4c\x82\xbe\x9b\xec\x7b\xe5\x11\xb9\xbd\x95\xe7\x7b\xeb\x73\x81\xac\x71\x65\xfe\x64\x4c\xbe\xea\xd4\xd5\x27\x1c\x43\x9d\x49\x1c\x8b\x9a\xdc\xab\xf1\x97\x53\xcf\x09\x34\x9b\x02\xa8\x10\xe9\x6c\xc8\x54\xa7\xdd\x00\x23\xe1\x4d\xd2\x4b\xe1\x61\x27\xcb\x2c\xbe\x50\xd2\x87\x68\x35\x9d\x13\xd7\x68\x15\x2d\x96\x69\x8c\xc4\xbf\x0b\x00\x54\x83\xe4\xd5\xd6\x81\xf3\x76\x1e\xc3\x9f\xce\x9a\x10\xb4\x6b\x06\xaf\xf3\x1c\xa3\x7f\x53\x3b\x71\xca\xff\x7d\xba\xd6\x42\x14\x25\x65\x9e\x86\x24\x80\x36\x90\xc5\x7a\xf7\x9e\xf6\x49\x97\x43\xee\x87\xdd\x16\xae\x67\x91\xcf\x2d\xe9\xbd\xfd\xfd\xe4\xfd\xea\x9a\x3c\xa1\xe1\x39\xea\x33\xbf\x18\x84\xcf\x02\x00\x39\x20\xaf\xd7\x5f\xff\x1a\x75\x5c\x3e\x2e\x48\x06\x7f\xb1\x48\x9b\x3d\xf7\x98\xbc\x45\x7a\x1a\xc4\x2b\x51\xda\x51\x53\x46\x62\x73\xf9\xea\x61\x00\x95\x20\x8b\xd2\xb7\x4f\xef\x5a\x26\xdc\xe7\x29\x7a\x2b\x13\xb6\xec\x8a\x5c\x89\xbb\x5f\xe8\x44\x86\x74\x8c\xbf\xbe\x3a\x72\x73\x4d\x26\x80\x96\x04\x00\xa8\x98\xea\xaf\xc1\x4c\xf9\x94\x80\xa0\x06\xa4\xe2\x11\xa9\x11\x70\x80\xf7\x01\x8d\xb9\x46\x91\xc1\xa4\x09\x0f\xc5\x2b\xd9\x51\xf3\xf4\x1b\xbd\x00\x1a\x41\x92\xf6\x64\xc3\xee\xd4\x1b\x4f\xd2\x63\x68\xbe\x69\xda\x94\xd7\x3c\xca\x1a\x5a\x9f\x88\xbf\x6e\x7e\x8d\xaa\x48\x88\x85\x7f\xdc\xcf\x71\xdb\x11\x40\x1f\x91\xc1\xa4\xa4\x1f\x09\xc8\xf1\x68\x68\x64\x60\x1e\x97\x53\x24\x7f\x7a\x51\xb6\x3f\xc0\xc3\xe3\x7a\x95\xd1\x03\x8b\x98\x3b\x77\x57\xa2\xe3\x00\xd4\x87\xac\x61\x99\x21\x7a\x8b\xc3\x29\x93\x3d\x8a\x3d\x16\x97\x2f\xb9\xa4\x1b\xdc\x37\x25\x75\x50\x32\xf0\x11\x01\xad\x1d\x79\xa7\x46\xc2\x5f\x03\xe8\x1b\xf2\xdc\x0f\xbe\x1b\x6b\x03\x71\x76\x2e\x90\xe3\xad\x85\xec\x0e\x76\x87\x65\xc5\x28\x7d\xde\x9a\xd1\xdd\xc4\x13\x9e\x54\xca\x25\x26\x19\x46\x5c\xfa\x7e\xbb\x8c\x4e\xdc\x93\xd2\xef\xcf\x9b\x0b\x81\x59\xab\x23\x7c\x20\x55\x96\x49\x25\x2e\xe6\xf4\x51\xff\x57\x5f\x2a\x68\xd4\xe9\x1c\x01\xe4\x86\x8c\x63\xea\xf9\xe5\xa5\xb8\x5d\x96\x21\x39\x3f\x31\xa3\x21\xc6\x99\xf5\xad\x26\xaf\x34\x52\xe9\x48\xf1\x67\x83\x6a\x1f\xb8\x2e\x1f\x51\x01\xd0\xd0\x5f\x49\x93\xdb\x6c\x21\xa4\x7d\xfa\xc9\x6e\xd5\x9f\x96\x90\xad\x58\x73\xd9\xab\x9d\xc7\x28\x7a\x4e\xb1\x35\x8d\xd8\x0d\x1d\xa8\x53\xe3\x01\xd0\x16\xb2\xf8\x5e\xb2\xb9\xe8\x62\xef\xcd\x97\xc5\x18\x5f\xba\xd3\x92\x74\xf7\x45\xa8\xb0\xa1\xaf\x7f\x80\x6c\xec\x3b\xbd\x40\xe2\x98\xa2\x24\x69\xc4\xa5\x8c\xe6\x21\x96\x04\xeb\xd5\x97\x58\x94\x63\xa2\x4b\xf1\xd7\x42\x9e\x31\x0b\x1c\x55\x1b\x8b\x11\xe3\x5b\xcc\xa8\x56\xe9\xef\x14\x71\x04\xd0\x3c\xb2\xe9\xdd\x5c\xd0\x74\x2e\x8f\x4f\xdd\x72\xe9\x20\xe4\xaa\xb8\xf1\xd6\xaa\x31\x70\xe7\x0a\xb3\x6c\x3b\x19\xef\xf4\x6b\xd7\xf7\x42\x7c\x21\x00\x5a\x42\x52\xf4\x80\xcd\xb4\x96\xcf\xad\xab\x0d\xda\xa2\xd1\x4d\x9d\x87\x94\x07\xd2\x1c\xe6\x6e\xa5\x55\xd1\x5c\x57\x74\x68\x6e\x6d\x21\x2a\xfe\x00\xa0\x0d\xe4\xda\x9b\x61\x5d\x1d\xd1\x8c\xd1\x51\xfd\x3d\x40\xa1\xbf\xbb\x44\x7a\x71\x24\x4d\x40\x84\xc6\x3e\xe7\x0d\xe6\x02\x37\xd9\x32\x29\xdd\x27\x47\x20\x89\x34\xde\xda\xea\x7d\x8a\xe8\x81\x97\x72\x94\x07\xf4\xe9\x23\xf9\x7e\x95\x2d\xe6\x4a\x32\xdf\x72\x7f\x8d\x17\x09\x6d\xb6\xc7\xe2\xaf\xc4\x02\xc8\x09\xb9\x94\xd2\x96\x5b\x92\x73\x22\x2d\x55\x94\x35\xb5\x06\x73\x9c\x3b\x0f\xcc\x29\xa6\x9b\x45\x3d\x97\xcf\x67\xb1\x89\x4c\xde\xf5\x2f\x8f\x03\xd0\xca\x5f\xaf\xa9\x3c\x3d\x39\x9c\x93\x2a\x6c\xd2\x29\x4f\x1d\x91\x55\x6b\x71\x6c\xfb\x0a\x5b\xba\xed\xd9\x5c\x49\x19\x33\xe1\xa3\xd4\xa1\x34\xc1\x00\x48\x22\x3f\xb7\xd6\x77\x7e\x5c\x2b\xde\x46\xc5\x89\x70\xf4\x69\x67\x93\xb8\x66\x4b\xbe\xcb\x52\x03\x74\xab\x02\x8a\x55\xaa\x59\x13\x92\x15\x69\x05\x50\x3b\xb2\x2a\xf5\x10\x7e\xbc\x2e\xb9\x13\x7a\x7c\xe2\x59\x98\xf5\xdd\x1c\xea\xef\xc1\xaa\xa6\x09\x54\x93\x9c\xaa\xd3\xdf\x18\x92\x12\xee\x52\xf9\x3a\x02\x28\x0f\x99\xbb\xf1\x67\x3e\x50\xfb\xf0\x5c\xda\xad\xce\x3f\xbe\xc9\x26\xf9\x34\xf8\xa0\xcf\x8c\xff\x78\xc3\x29\x35\xfb\xce\xe0\x1b\x62\xdf\x29\xa5\x00\x34\xfa\xd7\x0b\x25\x44\x75\x9b\xaa\xee\xbf\xb2\x78\xb4\xee\xd1\x34\xdd\xd0\x5f\x7a\x74\xe5\x2e\x57\x5b\xd0\xe5\x3b\xdf\x9e\x51\xd0\x67\x65\x7f\x53\x06\xd0\x0c\xb2\x83\xdd\x8d\x79\x50\xc9\xda\x73\xeb\xb0\x7f\xfc\xe1\xb8\x9f\xc4\xf6\x0b\x1a\x37\x1f\x7f\x11\x58\xb8\xfa\x0e\x53\x4a\xd5\x7c\x2b\xa8\x04\x0f\x03\xa0\x2c\x64\x9f\xf9\x7e\xfb\xa4\xcf\x87\x9b\xeb\xfc\x3f\xbf\xcf\x96\x13\xd0\x8b\xeb\xd4\x04\x46\xbf\xae\x67\xb2\xbf\x9e\x06\xb6\x7d\x46\xad\xb7\x84\xeb\x09\xfe\x91\x6b\x4a\x1f\x92\xc0\x23\x73\x02\x40\x12\xf9\x66\x20\xb2\xcf\xe9\x53\x8f\x7c\x7e\xdd\xfa\x14\x6f\x1d\x42\xa5\xc0\xd1\xc8\xd9\xd2\xe1\x2f\xf2\xb2\xb7\x46\x9f\xdf\x31\xd7\xa0\x77\x31\x13\x40\x11\xc8\xbd\x67\xe0\xa9\xc7\x4a\x88\xdf\xd8\x1b\xf3\xab\x85\x31\x5d\x3c\x94\x7b\xc1\x78\x62\xf0\x9d\xab\x13\xbf\xb3\xcf\xf4\xd6\x90\xd2\x31\xc3\xbd\x41\x04\xe9\xac\xca\xf4\x92\x29\x81\xd2\x93\x40\x5d\xc2\x21\x23\x05\xa5\x9d\x6f\x53\x03\x37\xe4\x0c\xb4\x5b\x6f\x3d\x1f\xcf\x67\x7b\x48\x7c\xa9\x14\x00\xc8\x1f\x59\x07\x8e\x7f\x57\x5f\x9f\x6c\x1b\xb8\xa9\xae\x47\xb0\x38\x48\xbb\x3d\xa4\x6d\x3b\x1d\xcc\x12\xd1\x54\x7e\xb7\x94\x30\xf9\xea\x24\x0d\x37\x80\xba\xfe\xfa\xb8\xe4\x81\x3b\x33\x71\x36\x91\x8a\x85\x57\x0c\xa0\xa1\x88\xc4\xcf\x06\x2e\xfd\x8a\x25\xa1\xbb\xf6\x67\xf2\x25\x09\x98\x97\x1a\xfe\x60\x00\x94\x81\x4c\x4b\xb3\x7a\x91\x64\xc3\x76\xa7\xd3\x11\x3f\x73\x1f\x99\x7a\xd5\x50\xc9\x3c\xe3\xfa\x7d\x40\x5d\xed\x91\xce\x67\xb9\x5e\x85\x57\xf3\x16\x3c\xff\x18\x14\x49\x87\xbd\x31\x53\x6c\x7f\x96\x40\x8b\x0a\xf6\x7a\x28\x02\x1e\x6f\x50\xc3\x82\x05\x7c\x84\x47\x34\xd4\xb8\x60\x01\xfe\xf0\x36\x00\x5a\x64\x70\x80\x2e\xf8\x6c\x11\x5a\x68\x70\x80\x0c\x58\x6c\x41\x9d\x55\xb0\x00\x3f\xf8\x0e\x68\xd3\x0a\x0e\x30\x0d\x6b\xee\x68\xe3\x0a\x0e\x10\x0b\xef\x72\xa1\xcd\x2b\x38\x40\x0e\x21\xfc\x6f\x28\xd4\xb1\x45\xca\x4d\x82\xc0\x09\x03\xa0\x66\xe4\x2a\x50\x9e\xfc\xdd\xfb\x44\x54\xea\x60\x40\xf0\xdb\x6f\x24\xa2\x37\xcf\xa4\x13\x3d\x6c\x69\x8c\x55\x5e\xa8\xf2\xe5\xa6\xbe\x13\xfe\x9b\x06\x03\xa0\x3c\xe4\x3e\x63\xdb\xc5\x91\x4a\xbd\x81\x39\x6e\xd5\x63\x7a\x72\x54\xda\x67\x67\xe6\x2e\xbb\x09\x77\xdc\x63\x9f\x14\xb8\x7d\xd5\xe4\xee\x55\x12\xdf\xbd\xeb\x91\xad\xdc\x36\xda\xb6\xf0\xa4\xd8\x4e\x3d\x9d\x70\x6f\xe4\xe6\xf7\x36\x17\x8e\x94\x24\x83\x53\x0c\x83\xe3\x4e\x7d\x71\x03\xcf\x33\x30\xa7\x30\x00\xea\x45\x72\xcb\x53\xa1\xf6\x67\xc6\xcc\x4c\x94\x22\x48\x5f\xc7\xcb\x12\x01\xad\x25\x8d\xd7\x8b\x69\xa4\xaa\xfc\x5c\xb9\x8c\xba\xea\x5d\xae\x8e\xbc\xff\x66\x36\x2e\x3c\xcd\x70\x9a\xa2\xd9\x8d\x03\xe4\xc1\x9b\x80\x68\x86\xef\x03\xe0\xbd\x79\x34\xcb\x71\x80\x5e\x78\x6f\x1e\x75\x70\xc4\x2e\x4d\xee\xfd\x1b\xa0\x4e\x8e\xb8\xa4\x83\x45\x5f\xd4\xd1\x11\x67\x11\xac\xcf\xa0\x0d\x8f\x38\xc0\x0e\xac\x9e\xa0\x4d\x8f\x38\xc0\x22\x2c\x3a\xa2\x8e\x8f\x58\x40\x3c\x2c\x9c\xa2\x0e\x90\x58\xc0\x2c\xbc\x70\x50\x47\x48\x2c\x60\x0e\x76\x1a\x75\x86\xc4\x02\x52\x60\x1f\xd0\xa6\x48\x1c\xe0\x33\xbc\xf1\x89\x3a\x46\xe2\xee\x00\x6f\x4b\xa2\x0e\x92\xb8\xec\x86\xef\x80\x36\x4a\xee\xa7\x06\x05\x7c\x8a\x0f\x6d\xa2\x04\xd2\x0e\x04\x78\xe4\x7b\xe5\xc2\x1d\xd9\xa5\xaa\x5f\x5c\x96\xba\xb6\x23\x1e\x7f\xce\xda\xe7\xab\xd7\xd1\x43\x17\x1d\xd4\x56\x98\xef\x48\x26\x13\x7b\xda\x16\x86\x6b\xee\xde\x70\xdf\xb3\x0a\x49\x28\xe4\xd5\x2b\x38\x95\x06\x7f\x84\xd1\x1e\x28\x12\xcd\x08\x4e\x77\x1a\x08\x1c\x79\xe3\x92\x3a\x26\x56\xc8\xf4\x6d\xb0\x72\x71\x65\x00\x03\xa0\x15\x24\x07\xa5\x3f\x7e\x2c\x89\x2f\xae\xd4\xf8\x1d\xd9\x87\x53\xf3\xae\x1c\xa6\xb7\x31\x63\x5b\x2c\xfd\x77\x7d\x8a\xac\x02\xe2\x02\x38\xf3\xd9\xf6\x18\x05\xf2\xfa\xcf\xc7\x23\x28\x3a\x63\xfa\x4e\x08\x37\x29\xe7\xc4\x45\x7c\xa4\xf2\x4e\xeb\x66\x6b\xb2\xc2\x13\xac\x8c\xfd\x75\x41\xe6\x49\x6b\x0c\xef\xbf\x99\x8d\x8b\x8f\x3b\x5c\xe0\xd1\xec\xde\x7f\x02\xb0\x16\x8a\x66\x38\x0e\xb0\x02\xa7\x1d\x9a\xe5\x38\x40\x16\x0c\x40\x9d\xe9\xb1\x00\x57\x38\x8b\x50\xa7\x7a\x2c\xa0\x0c\x3e\xc6\x80\x36\xd7\xe3\x00\x9b\xff\xff\x02\x21\xda\x78\x0f\xa4\x79\x1d\xf0\xff\xdb\x11\x08\x43\x8e\x03\xd9\xe4\xbd\x8d\xe4\x8a\x89\x5f\x7d\x5c\xf2\xf1\xbe\xb8\xf3\xcd\x4f\xdd\xfd\x9a\x21\xd8\x50\x30\xac\x92\xab\x45\xb6\x95\x73\x37\x09\x00\xa8\x0e\xd9\x14\xa4\x58\x3a\x79\x95\x85\xbe\xcb\x0b\x9d\xfb\x93\x7f\x55\x42\x6f\x50\x95\xec\xa8\xd8\x75\x39\x50\xa2\x90\x65\x7a\x62\xde\x32\xce\x0c\x40\xe3\xc8\x24\xf5\x3c\x48\x79\x25\xee\xd7\x84\x23\x69\x14\xf9\xb5\xa2\xfb\xe7\x6c\x24\xd7\x9f\x86\x56\xb7\x35\x29\xd0\xe6\xb7\x3c\x5d\xb9\x49\x59\x81\x01\x50\x27\x92\xb2\x97\x04\x5f\x95\x01\x79\xca\x96\x5a\x79\x4b\xa1\xfe\x8a\x4b\xe4\x7c\xf2\x91\xf7\x82\xc5\x77\x92\xbf\x4d\x29\x1b\xd3\x86\x91\x52\xee\xf1\x1d\x64\x0f\xf4\x1f\xba\x41\x1a\xac\x43\xdd\xf7\x1a\x5f\x36\xef\x4b\x01\x85\x4b\xc0\xe7\x7b\xc2\xf7\x9f\x8b\xdf\x4b\xbd\x75\x9c\x23\x4c\x75\x89\x8a\xf7\x1f\xbd\xc4\x86\x33\x0c\xae\xd7\xa8\x6e\x62\x01\x75\xf0\x56\x32\x9a\xa3\x38\xc0\x38\x9c\xd6\x68\x9e\xe2\x00\x9d\xb0\xda\x8d\xe6\xea\x3e\x1d\x3c\x0c\xd3\x10\x34\x19\x07\x48\x39\x38\x39\xec\x65\xc4\x12\xf2\x91\x29\xc8\x3c\xfb\x21\x7e\xff\xb4\xbe\xd8\x84\x6b\xb5\x70\x0f\x01\xf3\xac\xfb\xdb\x15\x4f\x02\x1d\x8d\xac\x36\xb6\x42\xb5\x04\x9b\x5a\x0c\x80\xe6\x91\x75\xc5\xbe\x6c\xb9\xc0\x3b\x38\x51\xed\x91\xde\x63\x8a\xab\xeb\x9a\x15\xb7\x7b\x3a\x17\x63\x35\x3e\x48\xcb\x34\xf2\x6c\x36\x25\xd5\x1e\xc7\x00\x28\x1b\x49\x43\x2a\x55\x3b\xe4\x3c\x1e\x1f\x61\x0a\xf0\xf3\xc2\x5c\x38\xfb\x94\x32\x8b\x82\x75\xed\xd0\xd6\x6f\x49\x43\x35\xbb\x34\x92\xd1\x8e\x13\x18\x00\x05\x20\x27\xed\xf3\xc4\xb4\x4d\xab\x9a\x7d\x27\x6a\xf3\x38\x9c\xde\xa8\x71\x50\x3c\x36\x60\xb4\x38\x1b\xd1\x37\x79\x07\x4f\xca\x64\xec\xa1\xbe\x30\xef\xbf\x99\x8d\x0b\xcf\x12\xfc\x00\xd0\xec\xc6\x01\xe6\xe1\xba\x82\x66\x38\x0e\x90\x0d\xd3\x10\x34\xcb\x71\x80\x00\xb8\x87\xa3\xe9\x68\x38\x40\x29\xdc\x6c\x50\x85\x34\x2c\xc0\x03\xee\xe1\xa8\x52\x1a\x16\xf0\x0e\x76\x1a\x55\x4c\xc3\x02\x46\xe0\x96\x8c\xaa\xa6\xe1\x08\x3c\x1c\x25\x54\x3d\x0d\x0b\x28\x84\x9d\x46\x15\xd4\xb0\x80\x1a\x78\xa6\x40\x95\xd4\xb0\x80\x0d\x38\x35\x50\x35\x35\x2c\xc0\x01\x06\xa0\xaa\x6a\x58\x40\x09\xe5\xff\x0f\x01\xa0\xc8\x6a\x58\x40\x31\x1c\x25\x34\x61\x6d\xff\x39\xc0\x3b\x51\xa8\xca\x1a\x6e\x18\x84\xc3\x8a\xaa\xad\x61\x01\x7d\x30\xbd\x43\x53\xd7\x70\x80\x6f\x47\xd7\x77\x08\xfe\x4d\x64\x03\xd2\x07\x63\x08\xf1\x5c\x30\x00\x2a\x47\xca\xc5\x2d\xa2\xf3\x33\xbc\xfa\x6c\x0e\x41\xbb\x43\xe3\x4a\x82\x63\x49\xc3\x24\xbe\x1a\xbc\x03\x11\x46\xd4\xac\xa4\x69\x91\xd7\x08\x56\x30\x40\x52\x1b\xf9\x5f\x1f\x09\x06\x06\xab\x07\x1e\xf9\xdc\x9c\xa4\x2e\x45\xd9\x32\x3a\x79\x76\x63\x86\x65\x2f\x9d\xfc\xbc\xff\xac\xef\x16\xfc\x5c\x35\x00\x00\xf2\x43\xfe\x7c\xb8\xcc\xc7\xf2\xbc\x2e\xfe\x56\x8a\x1b\xaf\x06\x14\x3f\x5d\x4e\x26\x9c\x73\x4d\xe5\x4c\xf9\x1c\xea\xf7\xeb\xf7\xaf\x25\x33\xcd\x67\x00\xda\x40\x0a\xfa\xd7\x15\x23\x8c\x83\x52\xbb\xe8\x35\xae\x94\xd2\xd6\x14\xe1\x59\x11\x87\xd5\x5c\xb8\x43\x7a\xe0\x55\xc9\x5b\xa5\xa6\x05\x11\x81\x4f\x18\x00\x15\x20\x3b\x26\x47\x18\x43\xd1\xf5\x99\x27\xd6\xf1\xbf\x56\x34\x88\xcb\x97\x3e\xb0\xeb\x0d\x42\x26\x05\xe5\x9f\x73\xd7\x0f\x25\x3a\xb0\xb7\x04\x63\x00\x94\x8f\xfc\x7d\x42\xba\xa4\x57\x9d\x1f\xbc\xc7\x99\xf3\x1b\x36\xcd\x76\x49\x99\x4e\x73\x25\xe8\x8e\xf1\x05\x3e\x5a\xac\xbf\xac\xfa\x62\xa4\xa6\x07\x03\xa0\x54\xa4\xb8\x61\xcf\xd8\xe8\xf4\x84\x85\x93\x8c\xe0\xe8\x2f\x77\x4d\x37\xc6\xb2\xb6\x00\x75\xcf\x10\xf2\xc8\x72\xbf\xfc\x62\xc9\x4f\xbf\x82\xe2\x78\xff\x2d\x88\xb8\xa7\x55\x0e\x7f\xbb\x0c\x35\x8c\xd8\x99\x48\x7b\x3f\x1d\x50\xc3\x88\x5b\xf8\x70\x2d\x42\x0b\xe4\xfe\xb2\x84\x59\x14\x5a\x24\x71\x80\x02\xb8\x29\xa3\x85\x12\x07\xc8\x87\xef\x80\x16\x4b\x1c\x20\x15\x16\x44\x50\x65\x60\x2c\xc0\x0d\x5e\xf8\xa8\x42\x30\x16\x30\x04\x2f\x4b\x34\x29\x18\x07\xd8\xfa\xbf\xfa\x80\xa6\x08\x03\x29\x42\x09\x9a\xbd\xb6\x3f\x8e\x54\x6e\x57\xd8\x8f\x07\x10\x61\xd2\x5e\x7a\xbd\xd5\xa1\x6a\xb5\xa1\xcf\xcf\xef\x7b\x57\xc9\xbc\xcc\x19\x77\xb6\x3f\x67\xa4\xdd\x44\x9e\x60\x6f\x14\x44\xa6\xe9\x8a\x4e\x83\x4b\xd8\xa1\xd5\x99\xa8\x0e\x7a\xbe\x4b\x46\xc1\xcc\xbc\x62\x09\x8e\x8d\xdf\x32\x9d\xe7\x0f\x36\xea\x89\xc7\xa8\x38\x60\x00\xd4\x83\xd4\xec\x64\xa2\x8a\x0c\x48\x66\xe8\x62\x1c\x05\x56\xde\x77\xc8\xb4\x7c\x32\xb8\x7f\x7e\x41\x7a\x73\xab\x3d\x7a\xb9\xd5\xdb\x4b\x50\x95\x7b\x8f\xc2\xff\xf5\x4e\x06\x62\xaa\xd4\x43\xc6\x07\x32\x49\x1f\x2c\x88\x72\xc4\x35\x8c\xd3\xc7\x26\xf8\xd1\xae\xa5\x8c\x16\x5d\x49\xde\x38\x56\x23\x72\x91\xf7\xdf\xcc\xde\xe7\x5d\x70\x7f\x42\xb3\x7b\x7f\xec\x85\x73\x02\xcd\x70\x1c\xa0\x07\x56\xd5\xd0\x2c\xdf\x1f\x58\xe0\x85\x80\x2a\xc9\xe3\x98\x08\xcc\x4e\x51\x45\x79\x1c\xd7\x81\xb9\x23\x9a\x2c\xbf\xbf\xd4\xc8\xf6\x17\x3f\xaa\x30\x8f\x5d\xfc\xd2\xfb\x37\x40\x55\xe6\xb1\x37\x70\x82\x7b\x32\xaa\x36\x8f\x1b\xd2\xc8\xf7\x2d\x42\x55\xe7\xb1\x16\x3d\xdd\xbf\x01\x9a\x3c\x8f\xbb\x41\x3b\xcc\x74\x50\xf5\x79\x9c\xca\x04\xf7\x3f\x54\x85\x1e\x0b\x18\x85\xef\x80\xa6\xd1\xe3\x00\x33\x70\x26\xa1\x89\xf4\xfb\x83\xe9\x81\xf5\x1e\xdc\x47\x74\x4e\xd0\x09\x47\x32\xef\x78\x30\xcf\x2e\x7d\xf1\x9c\x0d\xcf\xea\xdc\x3e\xd1\x9f\x7c\xd4\xde\x6b\xe9\xe8\x1b\x0c\xf3\x6b\xde\x36\x06\x20\xbd\x6b\xff\x67\x37\x88\x01\x03\xa0\x56\x24\xe9\x87\x4c\x62\xfb\xe4\x56\x1d\x38\x8a\xa9\x62\x3d\xc4\x1e\x5d\xa0\x51\x5c\x96\x76\x72\xa4\xba\xb0\xf3\xe3\xeb\xfb\x6c\x05\xa5\x43\x6b\x8e\x00\x6a\x44\x9e\x07\xe5\xba\x46\xf7\xe3\x80\x70\xc6\x42\xac\xbd\x00\xc9\x98\xdd\x3b\x46\xb3\x0a\x46\x26\x92\xcc\x95\x4b\x96\xb3\x3d\xd7\x32\x32\x64\x7e\x00\x68\x0e\xd9\xa3\x78\xbd\xb7\xb4\x97\xa5\x42\xf3\xae\xe8\xbe\xa7\x70\xbb\x10\x12\x1a\xbd\xc4\x58\x94\xda\xdc\x54\x95\xbb\xe4\x4d\xc0\x46\xa4\xff\x01\x40\x1b\xc8\x5a\xf1\xdb\x00\x64\x93\x7b\xcc\x05\xb2\xfa\x5a\xb3\xf1\x47\x9c\xb5\x13\xbc\x5a\x95\xd6\x96\x9e\x2a\x4f\xa4\x9e\xd0\x53\x68\x6b\x69\x87\x14\x29\xa5\x1f\x12\xe6\x7e\x5d\x18\x75\xce\x57\x6c\x10\xfa\xd3\x75\xe8\x87\xef\xd1\x20\xa2\x63\xf4\x6a\x67\x05\x53\x34\xee\x1f\xcb\x9e\xc1\x00\xa8\x1b\x69\x78\x0e\xe1\x85\xa0\x0c\xc3\xb8\x0f\xd9\x87\x13\xb6\x85\x37\xcb\x42\x5e\x89\x5e\xfb\xfe\x5d\x54\xd7\x51\x5a\x7a\x6a\x6a\x6a\x34\x29\x6c\x8f\x69\x22\x77\x6d\x56\x3d\xed\x8c\x30\x8f\xab\x7e\xb3\x12\x87\x31\x15\x68\xdc\x8e\x85\xee\x06\xe7\xa5\xd8\xf1\xc4\x0e\xe6\xdb\x7e\x63\xb7\x1f\x8d\x01\x00\xca\x44\x06\xb2\x47\xb0\x48\xf1\xce\xd4\xfa\xbd\xed\xaf\x50\x1b\xdb\xb3\xcd\x6b\x61\xb5\x3f\x03\xdf\xad\x70\x2e\x15\x85\xc7\xf9\x7b\x14\x16\xf2\x02\xa8\x15\x59\xe5\xec\xe5\x56\xdc\xd3\x68\x2f\x9d\xc2\x23\xca\xf5\x75\xb6\xfe\xf3\xfc\xc5\x84\x32\x47\xef\xa9\x55\x36\x0e\x16\xad\x6e\xd3\xde\x2f\xbf\x01\x90\x14\x41\x9e\xe1\x08\xc4\xf7\x5b\x51\xf0\x96\xa2\x36\x61\x7d\x1e\x6a\x70\x02\xcf\x92\x3f\xd8\x39\xe7\x7c\x41\x24\x53\xe4\xad\xa5\x6d\x7f\xee\x43\x00\xda\x45\x9e\xe4\x39\x22\x75\x67\x24\x8c\x87\x7d\xc4\x94\x9d\xad\xf8\x54\xb0\xa0\x33\x83\xea\x9c\x08\xe1\x78\xdd\xb5\xb0\xd6\x23\x9e\x37\xc4\x32\x34\x1c\x01\x14\x84\xdc\x14\x1a\xd1\xec\x33\xf4\x73\x72\x7c\xed\xb7\xc6\x3a\x56\xa5\x64\xf9\xbc\xa9\xaf\xac\x35\x48\x6c\xe1\x46\x9e\x81\x4c\xe9\xf0\xa3\x33\xa9\x00\x8a\x42\x5e\xfe\x70\x85\x30\xfd\x40\x6e\xc9\xa1\x95\x77\x76\x6b\xae\xd1\xd1\x5f\x31\x8f\x3c\xe5\x1e\xbd\xfc\xde\x94\x5f\xe0\x3a\x40\x4e\xa2\x50\x0f\xa0\x0c\xe4\xac\xfe\x85\xfd\xf4\xea\xef\x49\x51\x11\xa3\xc5\x3b\x69\xb5\xae\x87\x13\x0b\x1f\x85\xd2\xe7\x75\x52\xb9\x77\xc5\xef\x4c\x73\x79\xf1\x5c\x02\x00\x4a\x44\x5e\xff\xae\x8f\xd8\xf0\x84\x08\x49\x7a\xad\xc5\x6c\xd2\x82\x80\x54\xf1\x76\x6f\x24\xe7\x83\xab\x2e\xba\xd2\x02\x98\xcb\x8a\x64\x04\xa5\x00\xaa\xf8\xeb\x23\xf2\x37\x87\x53\x8f\xb7\xdc\x94\x58\xe2\x60\xde\xe4\xbd\x72\x51\x22\x53\x99\xac\x43\x69\x51\xbb\x40\x2e\x5f\xab\x95\x5d\xc2\xc9\x0d\x00\x28\x12\xa9\x7c\xc4\x77\xd9\x1c\xc9\x5d\xa8\x76\x18\x88\x3e\x12\xc9\xb7\xee\xb7\x6c\x75\x9f\x86\xab\xf0\x75\xce\x05\xbd\x41\xa3\x13\x37\xab\x31\x9f\x00\xb4\x8c\xbc\xbc\x24\xed\xb9\xe1\x53\x88\xdf\x57\xf5\xab\x93\xf3\x4e\x7e\xfa\x9f\x33\x43\x75\x4a\x60\xe9\x1d\xc7\xf7\x1c\x3b\x9f\x60\x5d\x91\x39\x47\x00\xc5\x21\x13\x6d\x64\xd1\x7d\xed\x81\x52\x80\xf5\xd1\xe7\xd6\xef\xa0\xe6\xb0\xe0\x3a\x39\xda\xce\x89\x2d\xb7\x30\x83\xac\x8a\xf3\x5a\x25\x11\xe9\x00\x8a\x43\xa6\xbc\xac\x28\xb9\x46\xcf\xa5\xdd\xdd\xf2\xe9\x2a\xd5\x6f\xc2\xdf\x0d\xcc\x3f\xde\xda\xe8\xe7\xfa\x54\x06\x61\x14\xba\x4f\x5e\x29\xe0\x00\xd0\x06\xd2\x9a\x3f\x4a\xf3\x9f\x68\x8f\xf7\x0c\xbb\x44\xb9\x3a\x8f\x4f\xfa\xe4\x53\x4a\xb3\xa5\x7e\xf4\xcf\x3c\x9c\xc5\x59\xef\xf3\x27\xc2\x25\x03\x71\xe9\xb2\x8e\x95\xb1\xda\x43\xdd\xec\x19\xaf\xc3\x12\x0f\x6d\xad\xed\x98\x3c\x2f\xe8\xee\x5a\x4a\xc7\x98\xbe\xff\xf8\x51\xfc\xa3\xb3\x9b\x23\x80\x5c\x91\x86\x07\xe0\x41\x2f\xee\x8e\x67\x1b\x5a\xba\x76\x17\x3c\x3d\x3b\x29\x90\xec\xe7\x45\xcc\x76\xf5\x8a\x2b\x0f\x8f\x8d\x7a\x0d\xbe\xda\x27\x00\xe5\x23\x73\x4c\xf0\x5a\x5b\xcb\xa7\xbe\x80\x70\x20\x4d\x2f\xc9\x45\x2a\x21\xdb\x5f\x73\xcc\x4d\x45\xfd\x60\x86\xdb\xd6\x0f\xe3\x2e\x87\x4c\x3f\x00\xed\x22\xf7\xca\xf0\xa3\x12\xcc\xce\x1a\x36\x87\xb3\xde\xa6\xbb\x5e\xd4\x1f\x19\x2f\x14\x6b\xb4\xf1\x62\x31\x50\x27\x34\xae\xa5\x36\xd9\x58\x30\x17\x00\x28\x10\x99\x63\x31\xa7\xcd\xbd\xfa\x38\x52\x06\x82\x4c\x2a\xaa\x0c\x5e\x28\x1e\x70\x62\xa7\x7f\xc5\xfd\x71\xb5\xcd\xfe\x94\xf3\x89\x27\x07\x6d\x99\x01\xd4\x86\x0c\xa3\xf1\x2b\xd1\xb3\xd5\x97\x5c\x86\xcf\x9f\x52\xb5\xf4\x61\x08\x49\x97\xd8\xd4\xb9\xb8\x82\x97\xe4\xf0\xe8\x4b\x6c\xbc\xba\x59\xd7\x91\xbd\x8c\x47\x5e\x5f\xa7\x11\xe5\xad\x77\xd4\x8d\x2e\xe6\x5b\xd7\xb1\x63\x4a\x43\x21\x29\x56\xc5\xb3\x67\x7c\xa3\x57\x94\x79\x5d\xfd\x0f\x5d\x8c\x10\x01\x50\x1a\x92\xcb\x2f\x1d\xb5\x90\x11\xf8\x55\x1c\x3a\x9c\x95\x69\x71\x91\xf5\x88\xac\xb8\xf4\xad\x21\xa1\x9b\x74\x59\xbc\x49\x0e\xfe\xea\xad\x4f\xea\x01\x54\x8b\x54\xb3\x64\x17\xdd\x7c\x32\x2e\xa9\x64\x09\x99\xcf\x3c\xf0\x15\x48\x75\xcc\x0b\x39\x73\xe0\x7b\x9a\xf4\x70\x5e\x26\xe3\x9b\xd8\x6e\x3b\xdd\xbd\x94\x44\x66\xfc\x91\x9e\xa6\xf8\xb9\x7c\xb1\xd3\x37\xd6\x23\xed\x6d\xde\x7a\x36\x5d\xaf\xf7\xab\x60\x09\xd8\x7e\x96\xfa\xc6\xdd\x4a\xe5\x3e\xfd\x55\x00\x4d\x23\x63\x19\x70\xd5\x98\x42\x80\x74\xf9\x54\xc7\x65\x6f\xba\x9b\xad\x5a\xca\x0c\x3b\xa2\x3f\xc9\xcc\xce\x1f\xb3\xd7\xf9\x33\xee\x51\x14\x83\x87\x3c\xf8\x3b\xf5\xfd\xeb\x84\x69\xfe\xe7\xef\x3b\xba\xe9\x32\x11\xb1\xb2\x54\x64\xa9\x86\x74\x57\xf9\xc8\x68\x2a\x33\x83\x39\x35\xde\xc7\x02\x20\x89\x7c\x09\x06\x3f\x9f\x93\xe0\x53\xce\x94\x77\xf4\x9c\x4a\xef\xd5\x28\x69\xf8\x2f\x6a\x0a\xcc\xed\x2e\x4c\x75\x93\xbf\xbf\xe5\xf4\x3b\x2a\x4f\x0f\x40\xc3\xc8\x9d\x2b\x11\x2a\xff\x93\x17\x4a\xb4\xfa\xce\x1a\x45\xee\x98\xc7\x1d\x52\xd0\x93\x65\x78\x95\x1a\x56\xb0\xfb\x4e\x6b\x6b\xea\xfc\xea\xf5\x12\x47\x00\xa5\x23\xaf\x2f\x53\xfc\x9c\x6f\xe1\x22\xd0\xb9\xad\x7f\xef\x43\xc8\xef\xe8\xc2\x3b\xb7\xca\xad\x6f\xad\x3c\x4d\xb4\xf3\x28\xd5\x94\x91\x61\xd4\x02\x50\x3e\xb2\x7b\x6c\x70\x0d\x90\xbc\x7f\xbe\x6c\x3d\xa9\x9d\x64\xc5\x2b\xf0\xd9\xf3\x90\xf7\xfd\xaf\x35\x07\xe6\x1b\x95\x9a\x53\xf3\x24\xa0\xce\x6a\x00\x0d\x22\x53\x46\xa1\x7e\x60\x68\x54\x96\x35\xe0\x9d\x55\x92\x59\x0b\x70\xdb\xfa\xa6\x9a\x49\xee\x4d\xa8\xf3\x7c\xee\xc8\x97\x19\x6e\xbe\x9a\x75\xc4\xa5\x78\xaa\x73\xd7\x92\x94\xbb\xa3\xf2\x32\x3e\xad\x9b\xfa\x42\xdf\xc9\x6d\x7a\x79\xce\x88\xf7\x52\x5d\xba\x51\xab\x6a\xbe\xa1\x4d\x0f\x80\xe4\x0b\xe4\x21\xb4\x5a\x3d\xb7\xf0\x40\xdb\x48\xbb\xb4\xd1\x88\xd7\x55\xf8\xe1\xb1\xfc\x1b\xab\xc6\x35\xbb\x5c\x2f\x18\xc2\xbe\xba\xef\xc6\x7e\x06\xd0\x32\x52\xb9\xf2\x12\x2e\x5e\x14\x3e\x1a\xab\x48\xa8\x7f\x31\x8a\x6c\x37\xf1\x93\xf9\xd3\x54\x41\xc3\xf0\x8d\x6e\xf1\x17\x3b\x9b\xaf\x7f\x38\x1f\xd8\x63\x13\x48\x3f\x25\x74\x37\x2f\x68\x96\x5e\xfd\xbe\xe6\xfb\x94\xed\xbe\x0f\x65\xb1\xc6\x73\xca\x3f\x3c\x54\x6f\xce\xeb\xfe\xd8\x59\x28\x0c\x5d\xba\x88\xb8\xf4\xe0\xb9\x77\xa4\xef\x99\x47\xe9\x42\xd3\xe5\x27\xd9\x5d\x5b\x7e\x47\xb9\x8d\x9d\x1b\xfb\xf4\xe3\xe3\xe5\x31\xe7\x72\xfe\x3c\x4b\x08\x00\x08\x20\x8b\xa3\x93\xa5\xf1\x7c\xe1\xc2\xe7\xd3\x99\x01\x12\xbf\xd3\x5e\xdf\x5d\xac\x3e\xdd\x73\xf1\x8b\x13\xd7\x81\x6d\xed\x3f\x55\x3d\x0d\xe7\x74\x01\x94\x8f\xcc\xac\x32\xaa\xcf\xc6\xa3\xdf\x93\x52\x1e\x07\x7f\xc9\x19\xb4\xc8\x71\x9e\xfc\x7c\x35\xf1\xbe\xfd\x55\x92\xb4\x26\x3c\x3d\x93\xdb\xde\x57\x11\x97\x5e\xcc\xac\xb8\x62\x30\x47\xd1\x27\x7b\x28\xe3\xfd\x35\x5f\x16\x3e\xdb\x77\x39\xa2\x65\x35\x37\xf9\x3e\x2d\x87\x35\x96\x2c\x2b\xaa\x20\x2e\x4d\xf7\xc5\x04\x51\x5b\x79\x17\x13\xcc\xa9\x15\x9e\xec\xc8\x7f\xd2\x9b\x12\xf8\xfb\x53\xb4\x50\xa2\xda\xab\xbc\xb5\xa8\x67\x49\xbe\x00\x40\x83\xc8\xc3\x44\xbf\xce\xa4\x73\x1b\xbe\x55\xf9\xfa\x3c\x26\x93\x87\xbc\xc3\x3d\xd3\x23\x32\x72\x67\x28\xb5\xef\xf6\x4b\x1a\x76\xf1\xd6\x86\x60\x0a\x00\xfd\x44\x9e\xb1\xa9\x8c\x74\xb3\xeb\x98\x9b\xec\xf0\x8c\x38\xe2\x71\xc1\x4e\xd4\x79\xb6\x76\x9a\x20\x5b\x41\xe7\x60\x11\x73\xa7\xf0\x83\x69\xbb\xdb\x00\x40\x8e\xc8\xd6\xae\xf5\x68\x29\xb3\x3e\x27\x43\x5d\xe7\x20\xf7\x19\x30\x2b\xb0\xf6\xaa\x7c\xb4\x5e\x59\xe5\xb2\x4d\xef\xed\x31\xc1\x69\xb7\xfe\x44\x00\x95\x20\x7f\xbe\x8d\xdf\xfd\x99\xe7\xa4\x7d\x47\x47\x62\x38\xa9\xec\xa1\x23\x87\x07\xbe\x3e\xda\x6e\x29\xde\xe1\xe8\xa8\x4e\x2f\xe1\xb9\x66\x7b\x1e\x71\xa9\x78\xf9\xb3\xdd\xe0\x37\xbc\x78\x17\x65\xb9\x9a\x28\xb2\xb2\x4e\xba\x7b\x67\xfb\xd9\x3c\x1c\xe4\x5a\x3d\xfd\xc1\xf4\xcf\x21\x63\xe4\x57\xae\x4e\x7a\xf0\x7d\x57\x10\x94\xdd\xc9\xbd\x4c\x7c\x27\xa9\x21\xca\xc1\x37\xb6\xa2\x66\x58\x96\xef\xad\xfe\xd2\x63\xab\x49\xcd\xda\x0a\xbe\x7f\xe3\x67\x00\xc2\xc7\xc3\xfc\x47\xea\xd6\xf9\xfe\x95\xa1\x61\x11\x8d\x24\xfb\x08\x74\x92\x86\x45\xcc\x1d\xdd\x47\xa0\xf1\xb4\x7d\xc4\xc6\xff\x37\xbb\xd0\xf8\x1a\x90\x76\xc3\x23\x60\xda\x9b\x4e\x0b\x90\x4d\x89\xfa\xba\xf8\xc6\x83\x4d\x8f\x55\x3f\x99\xb0\xc0\x67\xac\x52\xfc\xa9\xd6\xf8\x01\xd9\x2e\xc6\xb1\x9f\xbf\x1a\x4b\x97\xf2\x9e\x90\xc4\x00\x28\x12\xf9\xb0\xa2\x78\xcd\xcd\xeb\xec\x4b\x87\x64\x97\xca\x1e\x1d\x56\xeb\xb5\x1b\x22\x0a\xb0\x66\x7c\xe7\xca\x64\x73\xd2\xd2\xdc\x8a\x8c\x4b\x13\x03\xa0\x28\x24\x0f\x8b\xb1\xe9\x26\x0d\xf5\x6f\xf2\x94\xcb\x35\xb9\x77\x6a\x4c\x44\xe1\xd5\x6a\xbc\xb5\x59\x3c\xcf\x01\xc1\x0c\x21\x56\x96\xef\xd1\x37\xf6\xe6\x35\x64\x65\xbf\x71\x29\x4b\xec\xb6\xf5\x6e\x88\xd8\x6c\x18\x75\x13\x0f\x53\x06\xd5\x8a\x7b\x40\x84\xd5\x43\xfe\xf1\xf7\x83\x17\x32\x2a\xaf\xb9\xf3\xfd\x9b\xd9\xfb\x01\x2a\x80\x1f\x02\x9a\xe1\xfb\x88\x48\x82\x7d\x04\x9a\xe9\xfb\x88\x28\xd2\x7d\x04\x9a\xf1\xfb\x88\x66\xf2\x7d\x04\x1a\x6b\xde\x47\x74\xc3\x7e\xa0\xf2\x66\x1c\xa2\xf0\xd8\x3e\x02\x9d\x39\x63\x11\x99\x70\x8a\xa3\x92\xe7\xfd\x45\xf1\xff\x2d\x6c\x54\xfe\xfc\x1f\x42\x52\x64\xff\x16\x68\x0c\x7a\xff\x16\xff\x63\xec\xba\xe3\xb1\x7c\xbf\xbf\x11\x21\x42\xf6\x8a\x84\x8c\x12\x42\x25\xc2\x8d\x50\x91\x32\xd2\x90\x91\x51\xd9\x92\x8c\x8c\xe7\x42\x44\x99\x65\x25\x4a\xc8\x26\xc9\xc8\xc8\x26\x7b\xaf\x90\x12\x92\x95\x59\xf6\xef\x25\x9e\xfb\x7b\x7d\xfe\xf9\xdd\xfd\x7f\xbf\xdd\xe7\x9c\xeb\xba\xce\x79\x9f\xf7\xb9\xdc\xcf\x26\x35\x1e\x81\xcd\xa1\xb7\x11\x11\xc4\x78\x04\x36\x8d\xde\x59\x40\x14\x81\xc9\xa4\x77\x10\x99\x64\x78\x04\x36\x97\xde\x46\xbc\x41\x11\x98\x74\x7a\x07\x51\x41\x83\x47\x60\x13\xea\x9d\xad\x4b\x82\x47\x60\x71\x6a\x3c\x62\x0e\x45\x60\xb3\xea\x6d\x44\x3c\xba\x11\xb1\x89\xf5\x0e\x82\x0e\x8f\xc0\xe2\xd6\x68\x56\x23\x41\xb3\x1a\x16\xc7\x06\x8a\x5c\x44\x34\x64\x5b\x59\xed\x07\xcc\x54\xaa\x79\x5c\xd6\x9f\xfc\xe2\x30\xc3\xf1\x24\xc6\x83\x91\xea\x53\xe1\xd2\xe4\x56\xfd\xc5\x1f\xaf\xd3\xea\x25\x12\x58\x5f\x98\xfd\x89\x03\xc8\x00\x5c\xb1\x58\x68\x47\x0f\x11\x9a\x7d\xd2\xa4\xea\xb8\x28\x2b\x64\x73\xe2\x5b\xa1\x76\xa0\xf3\x20\x71\xe0\xe5\x28\x24\x4d\x55\xae\xa1\x9b\x08\x07\x90\x64\x78\x24\x4f\x7a\xab\x3d\x03\x39\x4a\x53\xf9\x4a\xee\x06\x07\xf5\xae\x30\x3a\x77\xd6\x90\x49\xb9\x72\x77\xe1\x21\x8d\xde\xe5\x4f\xde\xcb\x35\x38\x80\xbc\x85\xcb\x7e\x65\xa7\xe6\x44\xf0\x28\x9f\x64\x88\xf8\x93\x60\x8a\xf5\xd1\xdb\x82\xbe\x63\xa5\xb6\x05\x3d\xf9\xcf\x34\xbc\x17\xfb\x7b\x62\xc7\x44\xff\xcd\x6c\x7c\x80\x7e\xa0\x1b\x16\xcb\x70\x3c\x62\x00\xcd\x06\x58\xa6\xe3\x11\xc9\xbb\xf0\x08\x2c\xe3\xf1\x88\xb7\x84\x78\x04\x76\xa7\xb3\x8d\xf0\x41\x37\x13\x76\xb3\xb3\x8d\x28\x40\xd3\x01\x66\xbf\x83\x4f\x20\xa8\x55\xd8\x1d\xcf\x36\x22\x1c\x8d\x2e\x56\xd3\x83\x47\xb4\xa2\x5b\x1c\xbb\xed\xd9\x49\x52\x28\x02\xbb\xf3\xd9\x46\xa4\x91\xa3\x07\x0f\xab\xf9\xd9\x41\xd4\xa2\x55\x06\xbb\xfd\xd9\x49\x20\x68\x92\xc2\xea\x80\xd0\x9d\x48\x88\xfe\xd6\x0b\x66\x27\xa4\x20\x4f\x44\xe0\x09\x00\x12\x0c\xab\xdd\x9d\x74\xcc\x23\xf6\x0f\x9a\x71\x86\xe2\xe6\x6b\x7d\xce\xe1\x27\x14\xd3\x37\xab\xa8\x64\x5c\x32\x0a\x28\x1c\x9f\x9c\x0e\x08\x8c\x07\xc8\x3a\xcc\xe4\x85\x5c\xdb\x2d\xf6\x34\x20\x4d\xf9\xf3\xb2\xe7\x4e\x08\x9c\xbf\x9a\x1f\x9a\x65\x3d\x62\xd7\xeb\xd0\xd6\x74\x66\x7f\xa5\xbb\xf5\x20\x0e\x20\x5f\xe0\x44\x30\xa8\x6d\xc6\x59\xbd\x87\x8b\x4b\x50\xf6\x38\x1b\x4b\xfa\xfd\x76\x6f\xfe\xd3\x12\xf2\x15\xba\x05\xfe\xba\x02\x27\x4e\x75\xfd\x3a\x84\x03\x48\x2e\xdc\x40\x21\x77\xbb\x9f\x11\x7a\xf4\xbb\x31\xcb\xdb\xeb\xeb\x39\x84\x3a\xc9\xe0\x42\xdd\x7f\x17\x7e\xca\xf6\xe2\x52\x56\x8e\x5a\x0e\x33\x15\xfd\x57\xab\xb7\xc3\x13\x4c\x8f\x0f\x28\x96\xe1\x78\xc4\x3a\xca\x01\xb1\x4c\xc7\x23\xbe\xa0\xdb\x15\xcb\x78\x3c\x22\x17\xbd\x31\x88\xdd\x8e\x6e\x97\x6d\x15\xfc\x2b\xb0\x1a\x52\xd4\xa8\xdd\x78\x04\x76\x4b\xba\x8d\xc8\x40\x11\xd8\x5d\xe9\x4e\x2e\x40\x43\x85\xd5\x98\xe2\x11\xfd\xc4\xe8\x2c\x07\xb3\x41\x55\x24\xe3\x22\xfc\x7b\x95\xb4\x1f\x4e\xfc\xc9\x84\xf4\x72\xa1\xa6\xbc\x21\x53\x7a\xba\x8e\x84\xee\x4a\x06\xbb\xa5\xa3\xc9\xe2\x06\x23\xcb\xa9\x4a\xc7\xa3\x5e\xef\xea\xe6\xc1\x01\xa4\x1d\x7e\x7e\x8f\xdb\x35\xd0\xfc\x35\xf0\x8e\xf7\xd3\xf5\x19\x31\x3b\x1d\xeb\x6b\xaf\x13\x4f\x99\xbf\x4d\x38\xa1\x6e\x60\xbe\xf2\x7a\x46\x70\x01\x07\xe4\x99\xa1\xc7\x29\xbe\x14\x4a\x3f\x57\x01\xea\x95\xf7\xbf\x53\x6b\x2a\x15\x8b\xcf\x38\xa6\xde\xfc\x40\xf2\x4e\x85\xc4\x90\xae\x3b\x68\xea\xa5\x0c\x0e\x20\x61\xf0\xe9\x61\x71\x12\xe6\x0e\xdb\x48\xb8\x36\xf7\xc3\xa7\x4a\x36\x88\x46\x89\xa6\x4b\xf7\x00\xf7\x6f\x5a\x47\xfa\x2e\xed\xc7\x3f\x5b\x5f\x17\x8b\xfe\x9b\xd5\x68\x7c\xd0\x9c\x8f\x65\x37\x1e\xd1\x8e\x5e\xdd\xc2\x32\x1d\xbf\x95\x98\xd1\xd2\x85\x61\x3b\xfe\x15\x61\xe8\xc0\x08\x5b\x25\xd8\x7e\x85\x1d\xfe\x15\x58\x3a\x01\x4a\x83\x18\xf0\x08\x2c\xa5\x00\x8f\xc8\xa7\x42\x29\x0a\xa6\x62\xa0\x28\xc7\x4d\xf3\xf7\x7e\x58\x3b\xdc\x78\xbd\x9e\x7f\x25\xfe\xe8\xe3\x86\xbb\x1b\x2e\x94\xe6\xc1\x94\xe8\x81\x3f\x03\x6b\xca\x9e\x86\x37\x0e\x5d\x8d\x93\xa0\xf5\xea\xe6\xd2\xd8\x2a\xda\xb0\xe6\x21\x50\x67\x67\xdb\x2e\xf8\xfa\xd7\xf4\x45\xc5\x9c\xc5\x60\x1b\x63\x79\xe3\xef\xc5\x34\x6b\xe3\xf5\x82\xc1\x46\xd7\xd6\x6e\xf5\xfc\xc1\x01\xa4\xef\x3f\x89\xf5\x8e\xfb\x1e\x49\x2d\x65\xd1\x80\xf7\x1b\x6f\x44\x08\x9b\x49\x1a\xea\x70\x63\x23\x82\x7d\x0c\x01\xf4\x6b\x8b\x9e\x6e\x01\x75\x38\x80\x64\xc1\x8d\xda\xb0\x96\xec\x4f\xf1\x1f\xbb\xcf\xf9\x2d\x49\xd7\x6f\xc4\xfb\x8e\xae\x85\x5e\x69\x0c\x90\xec\x0f\x76\x68\x95\x5d\xe4\xa4\x7f\x0a\x44\xff\xcd\x6c\x74\x63\xa0\xa5\x1d\xcb\x70\x94\xa2\xa0\x8b\x80\x65\x3a\x1e\xd1\x87\x66\x57\x2c\xe3\xf1\x88\x2c\xb4\x55\xc3\xd6\x6d\xb6\x11\x00\x65\xe1\x58\xd2\x0d\x9a\x96\x08\x97\x1a\x89\xfe\x4d\xc2\x01\x8a\x24\x84\x1a\x5c\x0f\x71\x00\x89\x83\x93\x86\x6a\xf8\xe4\xea\x85\xce\xbd\x91\x2d\xd5\x27\xa4\xf4\x77\xd3\xda\x55\xcb\xb9\x55\x8f\x39\x36\xf9\xfb\x35\x9d\x55\x73\x15\xbc\xbf\x84\x03\x48\x23\xac\x6e\xd2\x79\x11\xe9\xf8\x74\xfc\xba\x7b\x5d\x43\x48\xe1\xd3\x9a\xc1\x85\x76\xc2\x7b\x1e\xef\x28\x1e\x50\x27\x5f\x5b\x2f\x95\x4a\xa2\xd7\xdf\x72\x1c\x1e\xa5\x6c\xbc\x1a\xf1\xaf\xbb\x26\xfe\x92\xe4\x35\xef\x49\xe2\x8b\x76\xa6\x0d\xa3\x77\x69\xf8\xce\x29\x84\xb9\xeb\x79\xaf\x65\x2f\xac\x6e\xe0\x00\x32\x0d\xb3\xe3\x98\xbe\x48\xed\xcb\x05\xdf\xa6\x3f\x4f\x1e\x6d\xe7\x76\xa1\x7f\x6a\xb3\xf1\x65\xaa\x42\xdf\xe5\xf9\x41\x76\xe3\x60\xc7\xe1\x4d\x91\xad\xde\x11\x2e\xba\xd7\x66\x94\xd8\x87\xcd\xdd\xa8\x3a\xcc\x29\x14\xf8\x5f\x48\x13\xfc\x08\x33\xa4\xce\xa4\xa6\x5a\xe3\x3d\x5e\xdc\xef\xff\xfd\xce\x9b\x2d\xde\x00\x6f\x3d\x7f\x8e\xe6\x43\x02\x1e\x7b\xf3\xef\x69\x97\x98\xaa\xb0\x9d\x95\x8c\x13\xcb\xa7\x2b\xca\x5d\x39\x35\x7c\xd7\xe9\xf4\x90\x80\xcb\x41\xd1\x7f\x0b\x0b\x7e\x01\xe2\xd0\x2c\x86\x15\x18\x3c\xa2\x11\xe5\x3d\x58\xa1\x41\x37\x12\xda\x2b\x63\x05\x07\x8f\x98\x46\x19\x38\x56\x78\xd0\x7e\x1c\x2d\xec\x58\x01\x42\xd9\xd8\x1e\xb4\xbe\x61\x4a\x82\x0a\x44\x64\x24\x5b\x49\xe9\x33\xac\xbe\x94\x4a\xa6\xdf\x3b\x78\x5b\xa8\xf7\x76\x20\x1d\xe7\xc0\x7d\x76\xfd\x69\xaa\xac\x25\x21\x45\x83\x60\xee\x6c\xd2\x5f\x45\x09\x1a\xc9\x38\x80\x2c\xc3\x49\x4c\xeb\xcc\xd4\xb9\xfa\x57\x7c\x6c\x81\xe5\x59\x11\x0d\x53\x09\x55\x29\x5e\x56\xfe\x7d\xac\x6f\xd4\xec\x13\x29\x1a\xd9\x43\xda\x14\x70\x00\x79\x0e\x4f\x57\x2e\x20\x7b\x7c\xf7\x6a\xad\xca\xaa\xc6\x1e\x8c\x8a\xe4\x39\x46\x51\x92\xec\xbc\xbc\xea\x7c\xa9\x25\x67\x98\x99\x9c\x3c\x48\xfa\x0b\x0e\x20\x53\x70\xdf\x84\xf0\xa8\xdc\x90\x59\x7b\x38\x49\xc3\x20\x4a\x76\x43\x2c\xe7\x63\x3d\x63\x40\x99\x6c\x5d\xd8\x49\x17\x39\xa3\xe0\x87\xdc\x92\x0c\xa2\xff\x66\x36\x3e\x3e\x9f\x51\x46\x8c\x65\x38\x1e\xb1\x8c\xa6\x31\x2c\xd3\xf1\x88\xe7\x68\x4b\x8d\x65\x3c\x1e\x31\x85\x76\x28\xd8\xba\xec\x4e\x9d\xa6\x45\x7b\x33\x2c\x69\x76\x07\x31\x83\xaa\x5a\xd8\xe2\xec\x36\xc2\x13\xdd\xaf\x58\xfa\x2c\x1e\x51\x42\x84\xfe\xf6\x34\x96\x4e\x0b\x14\x3d\x10\x02\x52\xef\xad\x83\x04\x27\x32\xcb\x7b\xb9\x97\x5e\x69\xde\xe7\xd4\xb5\xe9\x97\x3a\xd2\xa1\x60\xe6\xf7\xaa\x2d\x7c\x42\xd1\xa4\xec\x68\x50\xd5\xef\xa4\xf9\xf1\x38\x1c\x40\xfc\xe0\x44\xa9\x79\xe4\xc7\xaf\xa5\x3b\xed\xea\xd9\x1f\xa9\xae\x9c\xa9\xe1\xa8\xe0\x8c\x7c\xc7\xd4\x9d\xdf\xff\x58\xed\x64\xa1\x4f\x51\xdc\x28\x13\x0e\x20\xb3\x70\xa2\xd1\x40\x26\xf6\xbd\xec\x59\xb7\x6e\xca\x6c\x4e\xea\x31\x92\x51\x5b\xbd\x4b\xf5\xea\xfc\xbb\x36\xa7\xf3\xbb\x1f\xb7\x20\xb3\xdf\xec\x70\x00\xe9\xf8\xcf\xcf\x08\x8a\xdd\x5e\x4e\x08\x64\x49\x8d\xf9\x31\x21\xb3\x6b\x93\xe9\x61\xd1\x09\xdf\xfd\x4d\xa3\xd1\xae\x0d\x91\x51\x9f\xed\x22\xcb\xcc\xb7\x88\x00\x3c\xc5\x92\xa5\x0a\xad\xb6\x74\x56\xe9\xde\xc7\x4e\xce\x78\xb4\xcf\xee\x4e\x77\xe9\x78\xca\xc1\xfd\x3f\xce\x2a\x8b\xe4\xb4\x12\x6b\xfc\xa8\x13\xfd\x37\x37\xd1\x24\x83\xa6\x25\x2c\x47\xf1\x08\x3f\x34\xf5\x61\xb9\x8a\x47\xcc\xa2\x15\x11\xcb\x59\x3c\xa2\x03\xad\xba\x58\xee\xa2\x64\x89\x1c\x25\x4b\x58\xaa\x3c\x50\x24\x3c\xb0\xeb\x2f\x59\xf2\x83\xf3\xd2\xba\x84\x77\xa3\x84\xe6\x7e\x5a\x8b\xae\x47\xab\x7b\x89\x6e\xee\x5d\xb5\xf2\xfa\xc8\xb0\xbb\xd7\x9e\x43\xad\x2f\x3d\xb9\x23\xf9\x3a\x0e\x20\x55\x70\x1b\xb7\xf8\x44\xf8\xf8\xe0\xd0\xb8\x54\x94\x9b\x62\xe4\x60\xab\xe1\x86\xa4\x41\x5c\xb3\x6d\x9d\xb2\xaa\x45\x74\xf0\xf0\xad\x48\x8e\x7a\x1c\x40\x46\xe0\xab\xd6\x67\xf7\x50\x12\xdf\x98\x3a\xdb\x39\xd3\xf9\xb6\x2d\x38\xad\xf5\x6a\xba\xdb\xcd\x4f\xbc\x06\x75\x29\x7c\x3e\x7e\x6f\xc3\xa8\x8f\x39\xe0\x00\x32\x0c\x6f\xd4\xb5\x44\xb3\x0b\x23\x8a\x13\x39\xe2\x47\xf2\x70\x7b\x14\xc6\xc9\x77\xdf\x99\x92\xf3\xb2\xbc\x3c\xd1\x7f\x72\xe6\x95\x1a\x91\xe7\x6f\xd1\x7f\x33\x1b\x5d\x36\x34\x2f\x61\x19\x8e\x47\x54\xa1\xdd\x12\x96\xe9\x78\xc4\x08\x29\x9a\x65\x30\x8c\xc7\x23\x86\xc9\x96\x66\xf6\xed\xf4\xa2\x12\xb2\x0c\x5f\x7c\x45\xe6\x3d\xdd\x22\x2c\x26\xd4\x1a\xf6\x53\xd6\x1f\x3d\xbd\xdf\x7c\xe4\x50\xa7\xc3\xd5\x0c\x19\x2d\x6f\x62\xa0\xb8\xb9\xb1\xb9\x19\xc1\x09\x8f\x2e\x3f\x5b\x2f\x18\xca\x3c\x88\x5f\x9c\x19\x6a\xb0\x7e\xfa\x6e\x8d\xa5\x2f\xd9\x0f\xc7\x2f\x24\xc8\x1e\x7d\xbc\xe6\xd8\x5a\x98\x21\x1c\x7d\x16\x19\x31\xe4\x23\xe7\x21\x9e\xfa\xe1\x79\xe5\xee\xcd\xe2\x8b\x47\x6f\x3e\x24\xea\x8c\xae\x5e\x12\xe1\x74\xd6\x1a\x29\xae\xc6\x01\x64\x10\xe6\x23\x9d\x12\x16\x5e\xdc\xa7\xb8\xc9\xdd\x62\x6d\xae\xd0\x7d\x1e\x79\xfc\x8e\xcf\xcc\x5c\xd3\xc8\x3d\xb5\xdc\xa2\xe6\x21\x5b\xcc\x0d\xc4\x13\x20\x7e\xff\xf9\xf1\xab\xa4\xb5\x54\xc9\xeb\x3e\x49\x49\x8f\x98\x58\xe6\xb2\x42\x2f\x14\x16\x3b\xd5\x90\x8b\x91\xaa\xb7\x5c\xe3\xbb\x60\xf6\x8e\xdc\x0b\x20\x99\xf0\xe6\x51\x5b\xa2\xcf\x13\x56\xfd\xce\x1b\xc0\x98\xfa\x62\x25\xda\x5a\xdd\xae\xba\x30\x37\x57\x97\xea\xbd\x8c\x03\xfd\x9d\x43\x54\x7b\x42\x00\xd2\x0c\x3f\xfe\xad\xe5\x43\x43\x7a\x9b\x57\xa5\x60\xb4\x84\x51\x19\x77\x98\xb4\x78\xeb\xed\x72\x46\x39\x1b\x03\x81\xb6\x3d\x5a\xd1\x2f\x3b\xc2\x3d\x01\xf2\x14\xbe\xa6\xbf\xf7\xd5\xb9\xf9\x65\xe3\x1a\x92\x6f\xba\xcf\xdf\x8c\x79\x3f\xa3\x26\x38\x5c\x92\x43\xe0\x27\x3b\xf4\x63\x1c\x48\xaa\x17\xd2\x28\x01\x24\x11\x76\x76\x99\xa2\xd9\x6d\x6f\x61\xf9\x8d\x3c\x0b\x33\xa3\x8a\xf2\x85\x0f\x3c\xf4\xab\xab\xbf\x8c\x0d\xf9\x9b\x96\xd3\x47\xda\xce\xad\xb2\x02\x64\x00\xb6\xe6\xd0\x63\xf2\xb2\xba\xfc\x3d\x57\x66\x1b\xa5\x62\x64\xbf\xb7\x67\x95\x27\x2e\x1e\x91\x1c\xff\x2a\xf2\x21\xa0\x37\x8d\x6f\xe3\xd4\x2c\x00\x48\x34\x5c\xc1\x65\x7f\xd5\xd2\x33\x0f\x7e\x65\x08\xd3\x0a\x0b\x09\x08\x48\x4a\x77\xcf\xcb\xcb\xaf\x60\xee\xdd\xfd\x2a\x6e\x43\x6c\x2c\x57\x2d\x07\x20\x43\xf0\x41\x5c\x15\x9d\xae\xeb\x15\xef\x8d\x55\x57\x5a\xc8\xba\xc8\xe8\x31\xa2\xe2\x54\x51\x10\x1d\xd4\xd5\x49\x12\x50\x26\xc9\x7e\x21\xbf\x06\x7a\x94\xfa\xe2\xdc\x70\xd7\xd1\x7e\x30\x61\x65\xe4\xdc\x40\xb3\x76\x56\x29\xcc\x78\x96\x59\x37\x49\xce\xef\xa5\xf9\xf1\x24\x29\x76\x1f\xd8\x88\x8d\xbc\xa3\x24\xe7\x02\xdd\xf8\x92\xd7\x1b\x54\x92\xe6\xd2\xf3\x3a\x2e\x48\x9c\x3d\xc2\x5f\xf4\xc2\xc0\xa6\x77\x55\x5c\xd9\x02\x07\x90\x6e\xf8\xf8\xed\x15\x3c\x7f\xd8\x4c\x9b\xff\x35\xfb\xd0\xc6\x2d\xbd\xcb\xcb\x0a\x7d\xec\x93\xce\x2c\x88\x66\xa1\xdf\xcf\xfb\x24\x2a\xd6\xcc\x70\x47\xcd\x36\x5d\x3e\x9d\xd3\xd4\xea\xb2\x42\x70\x36\xe4\xf0\x31\xb7\x37\x08\x05\x81\xe2\xed\x3d\xec\x56\x46\xfe\xf6\xf7\xc6\xd5\x04\x74\x70\x00\x99\x87\xff\xf4\xd0\x6f\x99\xc0\xde\xf7\xd5\xd4\xf7\x2a\x84\x17\x94\x6f\xa9\x6f\xfe\xfe\x7c\x93\x48\xd2\x54\x82\xe4\x68\xbb\xf3\x01\x46\x79\x8e\xe7\xd0\xa3\x79\x0f\xec\xee\x47\x98\x12\x66\xea\x34\x08\xb6\x5c\x09\x94\x6f\x46\x86\xbc\x82\x44\xae\xd5\x12\xbd\x64\xbe\x34\xa9\x53\x7c\x0e\x2e\x54\xaf\x86\xd6\xa2\xfe\xa8\x34\x68\xf5\x2e\xf5\x29\xd7\xdc\x21\xd1\x20\xa1\x76\x6a\xb8\x58\x7d\x5e\x74\x96\xf8\x0c\x7d\xcd\xfd\x8c\x4d\x00\xe4\x75\xa1\xc7\xef\xdf\xe5\x10\x71\x63\x63\x1e\x02\x69\xee\xf1\xe5\xfc\x12\x5a\xc7\x14\xa5\x0c\x1b\x34\x79\xf5\xd5\x4e\x65\x0b\x27\xa8\xea\x44\x00\x64\x04\x66\x49\xe4\xc7\x5a\x8c\x0e\xdf\x5f\xbb\x4c\xc8\x5a\x21\x94\xcb\x17\xc1\x69\x81\x5b\x6b\x1d\xb6\x9e\xdd\x2b\xec\xff\x9e\xd7\x26\xd5\x81\xc5\x13\x20\x9e\xb0\x35\xb1\x3e\xce\x66\x0f\x85\xe2\xa5\xcc\x2b\x45\x74\x3a\xe6\x0e\xaa\x38\x0e\x57\xca\x5d\xb4\xad\x7f\x3c\x69\x27\x7f\x85\x23\xf7\x5a\x14\x40\x82\xe0\x35\x5f\x39\x76\xbf\xf9\xe9\x0c\x83\xf3\xbe\x3f\xdd\xd9\x6d\xae\x55\x6e\x2c\x77\x7a\x55\xbf\x1d\xd6\xd3\xe7\x3d\x4b\x10\x30\xee\xce\x51\x0e\x90\x0e\xb8\x08\x1e\x96\xa1\xbd\xc1\x66\x2e\x43\x77\xea\xee\xd1\xf9\x5e\xcd\xef\xd7\xca\xb4\x2e\xa5\xc7\x8b\xf9\x10\xbc\x1b\x94\xa4\x16\x38\x7c\x8a\x0a\x00\x79\xd8\x78\xc3\x95\xb5\x4c\xc1\x6f\xf4\x86\x9c\x89\x8d\xab\x62\xb9\xa7\x4e\xcd\xb9\x58\x3d\x59\x37\x53\xea\x96\x43\x04\x16\x4c\xdb\x3b\x7d\x00\x12\xf8\x1f\x25\x7d\xff\x63\x0d\x75\xb2\xe8\xe3\x55\xbf\xc3\xf4\x46\x23\xc9\x62\x2e\x56\x4d\xc7\x1b\x94\xa9\x95\x35\x99\x0e\xac\x67\xc6\xee\xdf\x0f\x00\x52\x0a\x97\xfc\x67\xa0\xd8\x98\xd0\x9c\xfd\x93\xbc\x03\xc5\xf8\xb1\x99\xd8\xfd\x09\x22\x0a\x0d\x82\x11\x87\x39\x7b\xde\xe7\x13\x27\x77\xb9\xea\x02\x64\x19\x3e\x3e\x8a\xef\x6c\x39\x16\xbf\x86\x7c\xab\xd4\x0e\x37\x38\x7d\x34\xe8\x21\x17\x49\x4b\x1a\xf5\x65\x36\xfa\x0c\x21\xc5\x5d\x75\xa1\x74\x9a\x00\xc8\x3b\xc0\xa7\xad\xf4\x32\x2d\x6f\xd5\x90\xae\xca\x5b\x42\xc5\x83\x62\xa6\x04\xfb\x3c\x85\x79\xcc\xe4\x0b\x29\x65\x2e\xcf\xcc\xd1\xd4\xd0\x5e\x01\x48\x3f\x7c\xa5\xa7\xb2\x91\x8c\x43\xbd\xfb\x96\xe8\x11\x27\xb1\x75\xb9\xc9\x49\x5a\x7a\xa6\xcf\x36\x87\x8c\xac\x1b\xd3\xa2\x98\xcc\xd9\x46\x8a\xa6\x71\x00\x49\x80\x0f\xe7\xd1\x33\x62\x06\x94\xee\xf4\xa3\x7e\x43\x8d\xbb\x74\x9d\x17\x82\x8c\x7f\xae\xf0\x84\xe9\xff\xf6\xac\x9d\x76\x2c\x0b\x57\x93\xd9\xb5\x95\x5a\xe0\xc6\x8b\xef\x0a\x4f\x13\xd1\x53\xcb\xf8\x5a\x8f\xd4\x6f\x6f\x44\xa4\x4b\x8e\xed\x5b\xda\x75\x95\x97\xb0\xfd\xcf\x0d\xf7\xc6\xb9\xbd\x23\x0f\x00\x12\x09\xd3\x9b\xf6\x57\xbc\x9b\x29\x87\x62\xd8\x86\x68\xea\x6a\xa9\x17\x9d\x3f\x2f\x1c\xa1\x0d\x5b\xef\xb9\x38\xd0\x73\x45\x6d\xf7\xfa\x14\xc1\x73\x80\xe4\xc0\xa1\x77\x7a\x1a\xb9\xa6\xee\x52\x41\xe9\x7c\x7d\x72\x72\xf4\x67\x08\x45\x40\xf7\x72\xfe\x64\x4f\xf7\x6e\x81\x3b\xc9\x14\x91\xc5\xd1\x08\x00\xf2\x70\xe2\xa2\x34\x7c\x62\xca\x5f\x9e\xa9\xea\x11\xf9\xdc\x43\xf4\x59\x91\x73\x8b\xa0\x18\x4b\x5a\x41\x5d\x99\xe2\x44\xc8\xeb\xa5\x1b\x65\xb5\x00\xf1\x87\x93\x74\x59\x6c\x8e\x08\xf1\xf1\xfe\xe8\x0b\x12\x7b\x9f\xcd\xda\xfc\xbc\x76\x8c\x6a\xbf\x6f\x81\x6d\x7a\x4d\xfa\xfe\xf4\xf2\xf2\x3c\x32\x0a\x4f\x80\xb4\xc1\x4a\xb0\x86\x36\xe5\xef\x72\x49\x1f\xf6\xa4\x73\x29\xa1\x3e\xef\x59\xc2\xae\x95\x81\x43\xc7\xf2\x37\xa4\x73\xe3\x83\xbd\x7b\x3c\xdb\x4b\x00\xd2\x0d\xcb\x27\xde\x41\x75\x29\xcb\x6e\x56\x13\xdf\xfc\xc1\xf0\x9e\x50\xff\xe1\xc1\xab\x3c\x6f\x95\x4e\x10\xf8\xb2\xbf\xc1\x5d\x62\x77\x23\x89\x02\xc8\x14\x1c\x1a\xdd\xb4\xa5\xe7\xed\x74\x05\x13\xfa\x45\xeb\x27\xff\x28\x7d\xe6\x33\x39\xf8\x99\x8c\x86\x0f\xd4\x12\xf9\x5d\xe3\xdf\xad\xfd\xa7\x1f\x7a\xf4\x0e\x0b\xf1\x8f\x27\x16\xef\xde\x98\x04\xc9\x58\x8c\x7d\xf2\x4c\xd8\x95\x1f\x60\xb9\xba\xbf\xa6\xba\xfc\xf2\x59\xe3\xc6\x8d\x96\x74\xe8\xd1\x96\x74\x56\x4d\x0d\x2e\xeb\x76\xf3\x82\x0c\x65\xc3\xaf\x4a\x96\x17\xeb\x78\x96\x5b\xd8\xe8\xcf\x8c\xcc\x3f\x63\x8c\x70\x2f\x8d\x85\x1e\x75\xb4\xea\x4a\xc7\xb9\x90\x2b\xb7\xbf\xba\x99\xee\x62\x11\xbd\xe4\x14\x4b\xe9\x10\x15\x7c\x4e\xdc\x76\xec\x5e\x78\x75\x74\x05\x1d\x0e\x20\x8b\xf0\x56\x21\xab\x9c\x1c\x29\x89\xfb\xe2\x96\x9d\xff\x30\x4b\xf3\x56\x8b\xfa\xdb\x9e\xfa\x8f\xd7\x2f\xcd\x4c\x85\x86\xe4\xbe\x60\x10\x29\x83\xbf\x72\x26\xda\x7e\x84\x79\xf8\xae\x0f\x97\x58\xbe\x74\xfb\x9d\x17\x51\x29\x3a\x2f\x6c\x52\x23\xf2\xbe\x3c\x3c\xaf\x67\xb2\x61\xc2\xc5\xdf\x82\x03\x88\x07\xbc\xee\x38\x32\x3b\x66\xb0\x3a\xeb\x65\x67\xb6\xc0\xb3\x67\xf5\xf9\xc4\x71\x92\x61\x76\xbf\x4d\xd6\x1b\xe5\x7f\xee\x1a\x52\xd5\x0b\x44\x78\x02\x24\x15\x5e\xf8\x16\xe2\x5f\x1c\x06\x8f\xad\xd6\x26\x8e\x2e\xf3\x05\xd1\xa7\x9d\x9c\xc8\xb9\x6d\x16\x6d\x9e\x48\xb2\x6b\xfa\x99\xcc\xb8\x0b\x22\x0a\x90\x76\x78\x21\x79\xec\xd7\xd9\x8a\x53\xd9\x89\xbf\x75\x87\xac\xe5\x10\x4c\xef\x9a\x77\x3f\xe4\xe0\x72\xde\x42\x78\x50\x49\xd3\x35\x10\xf9\x6e\x09\x90\x59\x78\x65\x42\x55\x06\x2f\x47\xa8\xde\xcb\x2f\x93\xb8\xf1\xed\x6a\x5e\x63\xe6\x70\xa0\x50\x21\xcd\x80\xcc\x4b\xd5\xeb\x71\x07\xdc\x0e\x59\xbb\x01\x80\xa4\xc3\x0b\x3f\x30\xc5\x58\x5f\x4b\x34\xff\x48\x5c\x38\x14\x47\xd6\x14\xaa\x7e\x16\x57\xe1\x54\x47\xe7\x36\xb9\xac\xdf\xc6\x9a\xe9\x5a\xbe\x0e\x90\x0e\xd8\xd9\xf2\x56\x17\x65\x4a\x84\x52\xec\x24\xb1\xf2\x54\xfa\xa9\x4c\xdf\x70\xce\x16\xd3\xd2\xcb\x44\xe3\xec\xc2\x16\xbd\x8d\x61\x6f\xc2\x00\x40\x00\x7c\xa4\x6b\xb8\x02\x1d\x7a\xd3\x1d\xc8\x8e\xf5\x46\x49\xec\x3e\x47\xb1\x5c\x1f\x75\xf5\xd4\x95\x8f\x4f\xc7\xc9\xd3\xda\x38\xdf\x50\xd7\xd2\x03\xa4\x1e\xb6\x5e\x50\x26\x72\x61\xb1\xa5\xab\xa4\xce\x03\xa9\x7c\xa1\xe0\xfa\xfe\xe3\xfd\x8b\x6b\xf3\x32\xd9\x7e\xb7\xe9\x08\x64\xfc\x4a\x5f\xdd\xc6\xf3\x64\x2c\xf6\x04\x14\x29\xc9\x08\xfe\xca\xd3\x13\xb0\xb2\xe3\x7b\x9c\x3a\x9f\x77\xb4\xb9\xe4\x41\xdb\x49\x69\xb1\x9f\xa9\x5a\x96\x20\xe4\xc8\x66\x72\x99\xff\x0f\x22\x77\x9f\x4b\x6f\xc4\xac\x71\x00\x69\x84\xb3\x23\xf9\xc8\xe7\xaf\xe7\x08\x38\x97\x4c\xe7\xa9\xe4\x73\xa9\x9d\xb9\x7b\x0f\x4e\x1c\x26\x1f\x8e\x38\x92\x12\x7d\x50\xec\x54\x76\x79\x05\x0e\x20\x4d\x70\xe5\x18\xd1\xfd\x28\x1c\x14\x6b\x6e\xa6\xb1\x5f\x21\xc3\x57\xb4\x20\x9a\xab\xe7\xc0\x15\xb1\x93\x45\x26\x4b\x4f\x9d\x7a\x9e\xca\x9d\xa3\xc1\x01\xe4\x21\x1c\xfc\x49\x97\x43\xa7\xee\x46\xb3\x34\xa9\x7d\x38\x82\xbc\x37\xad\xea\x0b\x53\xf1\xe8\x31\x58\xf8\xc3\xa3\x20\xf6\x3c\x3c\xec\xd4\x75\x41\xd1\x7f\x33\x1b\x20\x44\x7f\x19\xe9\x04\xaa\xba\x60\x19\x8e\x47\x34\xa2\xed\x0d\x96\xe9\x78\x44\x13\xda\x42\x61\x19\x8f\x47\x3c\x64\x40\xfb\x5e\x2c\x26\x0b\x14\xb9\x88\xb9\x76\x6d\xf5\xbd\xc5\xf0\xae\xa8\x34\x3d\xb3\xff\xc8\x47\x63\xd1\xfd\x39\xfc\xa7\x7f\x21\x09\x1a\xd6\x3f\x0c\x2f\xde\x6e\xb9\x47\x50\x59\xbd\xfe\x8c\x3e\x4d\x47\x05\x07\x90\x71\x78\xd9\x6a\x87\x47\x0d\x27\x83\x17\x49\x53\x28\x49\xc3\x9e\xf9\xbe\x67\x0a\x71\x8e\x61\xdb\xb5\x2f\x36\x40\x9c\x29\x4f\x75\x62\xb0\x52\x1f\x07\x90\x72\xf8\xd2\x8e\xff\x82\x75\x55\x69\x60\xad\xc1\x60\x22\xe7\xa7\x97\xef\xfe\x70\x84\xfa\x33\x3f\x09\x77\x7d\x7d\xbf\xec\xf6\x71\xff\xe9\xbb\x09\xbc\x5b\x5d\x1d\x5c\x05\xc9\x64\x1a\x39\x42\x9b\xd3\x84\x09\x2e\x89\xf3\x74\x45\x46\xb5\xa5\xfd\xb6\xda\x4d\xde\xcf\xa4\xdb\xf9\xbe\x88\x86\xa5\x78\x71\xab\x7d\x0a\x85\x29\x2d\x55\xe9\x22\x23\xd2\x9a\x7b\x9f\xbc\x58\xea\x89\xe6\x2d\xe7\x84\xf1\x5a\x17\x03\x46\xab\x3f\xdc\x5f\x8a\x8d\xdf\xa8\x9a\x99\xb1\x8a\xfe\x9b\x9b\xf8\x80\x16\xa3\x1d\x26\x96\xa3\x78\xc4\x38\xba\xcc\x58\xae\xe2\x11\xe5\xa8\x20\x82\xe5\x2c\x1e\xd1\x81\xb6\x5c\x58\xee\xe2\x11\xa1\x8c\xa8\xa2\x8d\xd1\xb1\xe0\x11\x83\xa8\xe8\x82\xdd\xb3\x6c\x23\xfc\xd0\xb6\x0e\xbb\x6d\xd9\x46\x64\xa2\x7e\x60\x75\x2e\x78\x44\x33\x8a\xc0\xee\x5d\xb6\x11\x4f\x51\xcf\xb1\xdb\x97\x6d\x44\x22\xea\x39\x66\x07\xb3\x83\x18\x40\xad\xc2\xee\x61\xb6\x11\xd1\xa8\x98\x87\xd5\xc6\xe0\x11\x43\xfb\x50\x2d\x1f\xab\x9d\x01\x8a\x64\x24\x74\x7f\xff\xc5\x32\xfb\x3f\x34\xe5\x5b\xf5\x21\xde\x3d\x95\x7d\x51\xf1\x73\x73\xd5\x32\xe6\x93\x67\x42\x62\x98\x64\x67\x68\x29\x55\xeb\x7c\x5a\x2e\x86\x1c\x75\xc4\x01\xa4\x14\xee\x3f\x5a\x5a\x86\xec\x8e\x7f\xe2\xdf\xd0\xac\xb4\xc8\x2a\xf9\xf6\xf9\x47\x94\xf8\xd7\x19\x16\x96\x8d\x0c\xa5\x45\xb3\xdc\x9a\xab\xe2\x4b\x38\x80\x74\xc1\xf5\x4a\x7f\x4c\x8f\x34\x5a\x9d\xf0\x9a\xa2\x7a\xa1\x5c\x4d\x56\xbe\x61\xc4\x8f\xb0\x34\xb9\xeb\x52\x36\xb1\xeb\x26\x57\x83\xf4\xf9\xbf\xe2\x00\x92\x07\xdb\x73\xbe\x4c\xe7\xb4\xb8\x03\x19\xf7\x31\x93\x0d\xd6\x64\x73\x1f\x7b\xca\xb1\x62\xe6\x77\xbd\xf5\x6f\x37\x02\x0b\x82\xe8\x35\xc2\xc7\x71\x00\xc9\x81\xef\xb7\x72\x28\x1e\xa2\x55\x25\x20\x3a\x7b\xcd\xd7\x70\x35\xfe\xb6\x73\x69\x0c\x1f\x62\xc2\xf6\xb4\x5a\x48\x01\x59\x0c\x6b\x78\x50\xce\x88\x03\xc8\x4b\x58\xe1\xfd\xe0\x34\xae\x1d\xfd\x6e\x86\x9d\xf1\xc2\xf3\x2a\x12\xb5\x7d\x5f\xac\x79\x73\x0e\xad\xf3\xac\x48\xab\x9a\x7e\xe3\x9d\x31\xf2\x79\x2f\xfa\x6f\x61\xc1\x2f\x40\x36\x3a\xe3\xc5\x0a\x0c\x1e\x51\x8a\x8a\x66\x58\xa1\xc1\x23\xba\x50\xfd\x15\x2b\x38\x78\x44\x1e\x6a\x15\x56\x78\xf0\x88\x1c\x74\x8c\x84\x15\x20\x3c\xe2\xe5\xff\x2e\x41\x61\xb5\xc7\x40\xd1\xc3\x83\x80\x62\x8b\x0c\x4c\xc1\xc5\xba\xd9\x3c\x49\x3e\xec\x49\xa0\xca\x5b\x5a\x9b\xd7\xc1\x47\xc8\x9f\x84\x0c\xf3\x48\x55\xdd\xbf\xa6\xf6\xb5\x36\x7e\x50\x61\x6e\x50\x0c\x07\x90\xdf\x30\x03\x2f\xff\xcd\xa4\xa1\xff\x40\xf4\x8f\xc5\x81\x8e\x05\xc3\xe7\x9b\x9c\xe9\x21\x1c\x15\x52\xe4\x57\x5b\x07\xef\x8d\x08\xed\x71\x27\x54\xc6\x01\x24\xf2\x3f\x5b\x03\xa1\xea\x6d\x2e\x3e\x33\x71\xdf\xd9\xd0\x4f\xb1\xfa\x0b\xa0\xe2\xa8\x1f\xea\x31\x6a\xeb\x30\x2a\x2c\xb8\x2b\x7e\xf7\xc9\x5e\x1c\x40\xbc\x61\xaa\xc4\x2b\x4d\xd9\x5b\x71\xf5\xea\x75\x11\xcd\x05\x83\xdd\x5c\x35\xfa\x83\x91\x5f\x8c\xbe\x3d\xbf\x71\x88\xd7\xc9\xd3\x97\x47\x75\xf6\x96\xe8\xbf\x99\x8d\x0f\xd0\x14\x5a\xa8\xb1\x0c\xc7\x23\x7e\xa3\xb9\x12\xcb\x74\x3c\x22\x12\x5d\x36\x2c\xe3\xf1\x08\x6f\xf4\x82\x12\x96\x48\x81\x47\x74\x93\xa1\x9f\x1a\xc1\x12\x2b\x80\x22\xcd\xae\x4a\x82\x2d\xfa\x90\x08\xe7\x8c\x4c\x56\xb9\x86\x3f\xae\xb5\x05\xa2\x89\xdf\x85\x5e\x96\x79\x1a\xf0\x8a\x92\x49\x51\xca\x78\xc4\x7d\x5f\x9e\x4a\xe9\xe9\xaa\x7c\x84\x03\x48\x1f\xfc\xbf\x19\x1f\x66\x0a\x39\x86\x72\x91\x96\x32\xb1\x3b\xc7\x5d\xd7\xfc\x1d\x73\x95\x9b\x81\xea\xb3\xe3\x97\x6f\xab\x82\xf2\xae\xb5\x21\x35\x1c\x40\x9e\xc1\x1b\x23\x98\x9d\xc2\x4c\xca\x43\xf4\xd6\x48\xc8\x8f\xe6\xcf\x9e\x2e\xc4\x47\x23\xe3\xae\xb9\x16\x1d\xe4\xd2\x37\x7f\x40\x27\xc1\x58\xff\x16\x07\xe4\xe1\xdb\xe5\xbf\x4f\x89\xa5\xce\x8f\x68\x1a\x84\xdd\x74\xd9\xf7\xdd\xf2\x77\xd5\x1d\x3e\x9d\x53\x79\x7b\x7a\x6e\x4c\xce\x90\x9f\xcf\x78\x24\x57\x83\x03\x48\x32\xdc\xb5\x8a\x34\x3a\xf9\x09\x79\xe8\xdc\x4b\x58\x91\xb8\x74\x9e\xf1\x74\x5f\xcd\xee\x33\x09\x1e\x4d\x9f\x0b\xae\x09\xaa\x55\x0c\x4d\x50\xe3\x2f\x31\x60\x79\x89\x56\x12\x34\x01\x60\xf9\x89\x47\xf4\xa1\x97\xb1\xb0\x3c\xc5\x23\x9e\xa1\xff\x7a\x88\xe5\xec\x0e\x42\x1e\x9d\xd8\x60\x79\x8b\x7f\x45\x32\x3a\xfd\xc3\x92\xa4\xf0\x88\xf9\xff\x7d\xa0\x04\x4b\x9a\x02\x8a\x34\x34\x04\x2f\xb7\x32\x46\x3d\xbc\x31\x9c\x63\x04\xb2\xca\xef\x5c\x0d\xba\xf0\xac\xf6\x8c\xff\x94\xe8\xea\x67\xa5\xfe\xa4\x7d\x63\xda\x1d\xa4\xf5\x36\xb7\x16\x42\x25\x6d\x71\x00\x01\x70\xd3\x79\x95\x4d\xa5\x53\x9b\xc9\x85\x44\xd4\xf8\xd4\x45\xc1\x82\x53\x01\xf1\x02\xbe\x54\x1d\xbb\xe4\xe3\xe6\x1a\xfd\x93\x77\xfb\xde\x52\xc6\x01\xf9\x8b\x70\xed\xd1\xf9\x54\xaa\x99\xda\x22\xd0\x48\xc0\xda\x7e\x24\xa3\x3a\x96\x29\x77\x3f\x9b\xca\x71\x06\x89\xb4\x67\xac\xf4\x1c\x6e\x7f\x4a\x70\x00\x19\x86\x6b\x95\x49\x95\x90\x74\x9f\x2d\xe3\xcf\x79\x53\xe3\xea\x0a\xb1\x60\x7b\xeb\x7b\xd7\xf9\x33\xba\x8c\x0e\xab\xaa\x39\x9e\x0f\x96\xfc\x94\x25\xfa\x6f\x56\xe3\xe3\x53\x8f\x2e\x33\x96\xdd\x78\x04\x40\x7f\x8c\x02\xcb\x74\xfc\x32\x5f\xc4\xbf\x02\xcb\x76\xfc\x2b\x86\xa9\xd0\x45\xc3\x14\x09\x15\x89\xce\xfc\xfd\xe9\x01\x79\x71\xb8\xa3\x2c\xbe\x57\xb1\xe4\xca\x60\x54\xa6\xd4\x4f\xd6\xf0\xae\x28\x6e\x71\x40\x3d\x7b\x86\xa4\x27\x53\x8f\x72\xd7\x98\x43\x49\x5b\x1c\x0e\x20\x1b\x30\x61\x90\xbc\x3a\xae\x93\x26\x26\x70\x3c\x50\x99\x8e\xff\x35\x2d\xb9\x78\x7c\x8b\xef\xd9\xf8\x4a\x81\xa7\xac\x35\x54\x92\x37\x27\xdb\x43\xb6\x78\x2b\x7c\x9a\xa9\x73\x89\xc3\x41\xc1\x85\xf7\x6c\x1c\x4b\xdd\xd7\x63\x3f\x44\xd8\xcf\x2a\x3f\x14\x04\x97\x7b\x6c\x8c\x34\xbf\x6b\xd8\x3d\x1a\xc5\x01\x64\x12\x26\x00\x77\xde\xb6\x3f\xcb\xf0\x48\xa2\x6b\x27\x4e\xfb\xb4\x78\x0a\xd1\x79\xd6\x1b\xf6\xd8\x25\xa9\xf6\x0d\xee\x8e\x27\x4f\xc4\xbe\xf1\x72\x91\x7f\x33\x1b\x1f\x50\x71\x7c\x40\xb1\xec\xc6\x07\x74\x03\xad\xe6\x58\x96\xa3\x34\x1d\x3d\x9b\x58\xb6\xe3\x11\x93\xe8\x3f\x8c\x63\x2b\xb5\xdb\x6e\xe8\xa2\x8d\x2b\x86\x56\x8b\x7f\xc5\x08\xea\x06\xb6\x5a\xbb\x8d\xf0\x44\xeb\x21\xb6\x60\xbb\x8d\x08\x42\xc7\x4e\x98\x9a\x2d\xbe\x07\x42\xbf\x00\x81\x2d\xdb\x6e\x3b\x8e\xba\x81\x29\xdc\xee\xbc\x22\x10\x45\x60\x4b\xb7\x3b\x8c\x0f\x6d\xfe\x30\xd5\xdb\x1d\xc4\x32\x7a\x01\x12\x5b\xc0\xdd\x76\xc3\x01\x75\x03\x43\xc2\xc5\xbf\xa2\x1f\xe5\x01\x58\x22\x2e\x1e\x91\x80\x76\x27\xd8\x32\xee\x4e\x97\x85\x96\x08\x6c\x25\x77\x87\xcf\xa0\x9d\x35\xa6\x98\x8b\x27\xae\xe8\x87\x05\xb0\xf5\xdc\xed\x50\xa1\x8d\x1c\x96\xa2\x8b\x7f\x85\x3f\x4a\xcb\xb0\x35\xdd\x6d\x44\x1b\xca\xbf\xb1\x65\xdd\x1d\x92\x85\x5e\x2e\xc3\x52\x76\x51\x7a\x49\x8f\xd2\x32\x2c\x85\x17\x28\xc8\x51\x06\x6d\xb1\xb2\x98\xff\xfc\x72\x94\xd2\xeb\x85\x09\x49\x0e\x81\xee\x80\xac\xe0\x6b\x56\xc6\x0a\x74\xab\xe2\xa3\x45\x16\x82\xdd\xbc\x2c\x6d\xb2\x7d\xbc\x6d\xb4\x38\x80\xcc\xc2\x89\xf3\xed\x39\x09\x5b\x06\xfa\xbd\xca\xdf\xc4\x64\x8f\x7e\x95\x16\x0b\xbf\x6f\xee\x72\x36\xe6\xb5\xd5\xaf\xa2\x79\xf7\x93\x87\x86\xeb\xdf\xe3\x00\x52\x0c\x57\x47\x82\x4f\x91\x66\x7b\x9c\xe4\x65\x7e\x34\x2d\x11\xcd\xfa\x0b\x9c\x77\xa8\x72\x5e\xd5\x21\x77\x7c\xf6\x29\x30\x38\xd0\xe5\x65\x2d\x01\x0e\x20\x85\x30\xfd\xce\xe1\x88\xe9\x29\xcb\x2d\xba\xae\xdf\xa8\x6e\xf4\xd5\xc0\x56\x64\x84\xe6\xbe\xfd\x1e\x2f\xed\x37\x8c\x42\x3d\xdd\x2e\x3f\x10\x16\x1c\x40\xfc\xe0\xe2\xee\x5b\xc9\x55\x10\xeb\x74\xdc\xfa\x17\xf7\xa7\x76\xed\x77\x87\xfa\x5e\x52\x0d\x50\x18\xcb\x2d\x96\x5a\x1d\xab\x2b\xe0\x64\x4a\xbd\x24\xfa\x6f\x6e\xe2\xe3\x19\x83\x52\x69\x2c\x47\xf1\x88\x59\xf4\x26\x0d\x96\xab\xa8\x70\x84\xee\x0b\x2c\x67\xf1\x88\x42\xf4\x98\x62\xb9\x8b\x0a\x2e\x14\x4b\x91\x44\xff\x26\xe7\x03\x84\xdf\xd7\x0b\x00\xf9\x63\x50\x54\x03\x94\x16\xe4\x29\xde\x75\x2a\xd1\xe8\x7e\x27\xe5\x94\xdc\x35\x59\x8d\xab\xf9\x34\xfe\xd2\xcc\xa8\x92\xc4\xe0\x63\xab\xe2\x87\x02\x80\x3c\xfb\xcf\xb7\x1f\x53\xf9\x3d\x66\x98\xcf\x6f\x1a\x4a\xa4\xc4\x5d\xb0\x5f\x9a\xce\x21\x78\xff\xe4\xa4\xe3\xf5\x79\x9a\xfa\x63\x4e\x62\xc9\x94\xf4\x38\x80\xcc\xc0\xca\x60\x50\xcb\xef\x50\xd2\xf6\xd9\xea\x19\xb1\x13\x59\x7e\xb2\xb5\x1e\xd5\xbf\x4a\xc4\xb5\x57\x64\xc2\x99\x6b\xa9\xe4\xbc\xa4\xdf\xcc\x6c\x71\x57\x78\x91\x55\x3a\x6d\x18\xcc\x9d\x06\x74\x6d\x2c\xdc\x4a\x67\xff\xd0\x3b\x4c\xb7\x51\x45\x1a\x1d\x2c\x25\xab\x78\xea\xa8\x61\xa1\xff\xf7\x6a\xe2\x3a\xac\x54\x4a\x50\x67\x97\x04\x8e\x6b\x6e\xd8\xff\xa9\x93\x5b\x69\x8c\x35\xe8\xdb\x97\xcf\xce\xe0\x55\xf1\x5a\x33\x97\x98\xf7\x5e\x39\x5f\xa2\xc8\xbf\x7a\xb9\x9d\x2b\x8e\xa1\x7b\x02\xc3\x4f\x94\x78\xa3\x45\x0e\xcb\x53\x3c\x62\x06\xad\x0e\x58\xbe\xa2\xef\x40\x13\x31\x96\xb7\x78\xc4\x3a\xfd\x52\xd4\xce\x9e\xc0\x9a\xdb\x00\xc4\xc3\xe6\xaf\x6c\x0f\x1f\x7d\x97\x97\x2c\x8f\x9d\x44\xcc\x98\x8f\x68\x6b\x32\xeb\xa6\x57\x51\x44\x7a\x66\xf2\xe0\x18\xd4\x0e\xc4\x12\x15\xbe\x9e\x14\xf4\x56\x06\x00\x79\x02\xeb\xad\x6c\xd5\x4e\x3c\x5e\x12\x41\xb7\x95\xf5\xf8\xf3\x67\x3f\x68\x1f\xe8\xe3\x4b\xf9\x6e\x39\x5f\x48\x68\xe5\xad\x6b\xd8\x60\x2d\xb0\x00\x90\x0d\x58\xce\x75\x2b\x3e\xb8\x2b\x87\x80\x4c\xf6\x32\x49\xed\xa6\xd7\xd4\x9e\x7b\x39\xd1\xda\x59\x8c\x4f\xa6\xed\xc2\x1f\x44\x8c\x52\x29\xb8\xb7\x6d\x51\x01\x78\x91\xcf\x49\x0e\x4c\x3b\x6b\x53\x06\x9a\x1b\x33\x79\x29\xb8\xf1\xda\x9f\xa0\x36\x6f\x59\xe7\xbf\x7c\xe2\xb8\x3b\xce\x34\xdb\xc2\xf4\x35\x0e\x20\xe3\x70\x66\xe9\xc8\xfd\x10\x73\xd0\xf4\xb1\xb9\x90\x7c\x61\x97\x17\xf1\x8f\x8f\x9b\x72\x1e\xea\x62\x09\x72\x8e\x9e\x3c\x6a\xfb\xa2\x1b\xa9\xce\x8a\xfe\xa3\x97\x78\x95\x1f\x3d\xf7\xd8\x7e\x6e\x23\x9e\xa0\x72\x23\x96\xab\x28\x4b\x44\xc5\x43\x2c\x67\x51\xb2\x84\x96\x4e\x2c\x77\x51\x51\x1a\xcd\x2d\x58\xc3\x39\x3c\x62\x91\x62\x69\x7d\x67\x1f\x61\x0d\xe9\x80\x22\x3d\x0d\x22\xef\x83\x03\x48\x36\xbc\x93\x84\xf8\x93\xe5\x2c\x63\x1d\xf9\x74\x88\x96\xc6\x32\xee\x48\x54\x78\xc5\x93\xb4\xd9\xb6\x53\x51\x1e\x52\xb8\xc6\x1b\xca\xa9\x60\xb5\x95\x88\xe1\xd6\xfe\x26\x71\x25\xf1\x6c\xc9\x41\xbf\x33\xfd\xfe\x93\xbb\x0f\x6d\xa6\xcf\xdd\x31\x70\xa6\x0a\x6d\xdb\x08\x29\x55\xb3\xbf\x1c\xd1\x4c\x81\x03\x48\x06\xdc\x3d\xc8\x94\x7d\xbf\xc3\x74\xec\xd4\x95\x1e\x71\x4e\xa6\xe7\xc4\x63\x0f\xf6\x12\x79\x14\xea\x4d\x7d\x59\x78\x03\x0e\x7c\x0f\xe4\x3b\xd9\xba\x45\xe0\xe0\x81\xd4\x73\x12\xd7\x99\x38\x1a\x6b\x79\xc5\xe5\x40\x19\xc1\x8f\x5d\x1f\x99\xd3\xc3\x8e\x3c\xae\x9c\x66\xf3\xf7\xd2\xf1\xf8\xa1\x61\xbc\xb1\x15\x58\x38\xdf\x79\xec\xf1\xbf\x45\xe0\xc7\x3d\xa0\xaa\xf0\xe8\x87\x22\xcb\xdb\x1a\x1b\x79\xba\xf1\x41\x05\x2d\x85\x15\xe5\x92\x22\x09\xff\xb8\xcc\xad\xa5\x83\x27\x1b\xba\x0d\x25\x0a\x8b\x85\x34\xec\x16\x45\x84\x9a\xcb\xac\xfd\x72\x26\x0f\x56\xb4\x7e\xc9\x5c\xe4\xde\x95\xd2\x7a\x20\xa2\xbd\xc3\x10\x07\x10\x1c\x2c\x95\xb8\x9b\x3c\x5d\x04\x61\x41\xe6\x5f\x1d\x6f\x92\xb2\x9a\x3a\xf4\x68\xb1\xf4\x36\x32\x0f\x4a\x4a\x85\xea\x70\x5f\x7e\x74\x36\xf2\xa7\xe8\xbf\x85\x11\x95\x27\xd1\xad\x8a\x15\x48\xb4\x0c\xa2\x64\x07\x2b\x94\x78\x44\x06\x4a\x88\xb1\x82\x89\x52\x68\x74\x4c\x86\x15\x4e\x74\x73\xa3\x69\x15\x2b\xa0\xe8\x01\x42\xe7\x27\x58\x21\xc5\x23\x70\xa8\x2e\x83\x35\x50\xc6\x23\x3c\x50\xcf\xb1\x47\xca\xdb\x88\x54\x94\x7c\x62\x4f\x95\xb7\x11\xed\x28\x65\xc0\x1c\x2c\xe3\x69\x09\x9a\x08\xb0\x47\xcb\xdb\x88\x74\x94\x7c\x62\x4e\x97\xf1\x7d\x16\xea\x39\xf6\x7c\x79\x47\xaa\x40\x93\x0d\xd6\x88\x19\x95\x43\xe8\x97\x06\x76\x3e\x6e\x85\x08\x6a\xfa\x67\x59\x44\x1b\x18\x9f\x95\xaf\x3f\xc3\xbb\xbf\x51\xe9\x46\x73\xb2\x59\x3d\x95\x72\xa6\x7b\xc3\xe4\x32\xe7\x8f\x21\xa0\xb8\xb9\x79\x74\x33\x82\xc3\x13\x20\x21\xf0\xe9\x33\x3c\x9f\x29\xe2\x65\x4c\xe7\x08\x46\x1a\xef\xef\x7f\xcc\xff\xbb\xad\x34\x56\x7c\x0f\xb3\xcf\xe1\x19\xc6\x27\x56\x75\x62\x29\x19\x00\x79\x0f\x5f\x0c\xf8\xf8\xb2\x99\xb1\x89\xea\x11\x67\x6f\xa9\x9a\x7a\x52\xc8\x32\xc7\xbe\xa3\xcb\xc2\x6a\xfc\x9b\x3d\xb6\xdd\x9e\x2c\xb6\xb6\x2c\x92\x00\x69\x86\xd5\xa8\x40\xa2\xdd\x45\x85\x54\x67\x77\x1b\x77\x88\x35\xae\xbb\x1c\xb6\x9d\x32\xcb\xd6\xfa\x10\x90\x58\xa3\x15\x42\xc5\x73\xef\xc9\x23\xe0\x09\x10\x4f\x98\xfb\x08\xdb\x96\xbd\x2f\x7f\x28\x3e\x6e\xff\xbe\xb8\x8b\xb3\x39\x8b\x0c\x19\xfb\x9e\xde\x77\x4e\x36\x21\x25\xb1\xb6\x45\x46\xb0\xf0\x36\x40\x86\xe0\xaa\x75\x36\x25\x46\x56\xe8\xb8\x77\xde\x83\x48\x02\xd1\xd7\x57\x76\xaf\x3a\xae\x7b\xb8\x69\x7c\xa1\xb9\x6b\xa0\xf8\xfd\xe3\x6d\x5e\x55\x73\x80\x0c\xc3\x99\xa9\xe9\x07\x62\xf7\xf9\xca\xb1\x17\x65\xf7\xda\x88\x2d\xaf\xd6\xbc\x0f\x5b\x61\xc9\x28\x6c\xde\xf5\xb2\xa0\x68\xa6\x8e\xd6\x93\xde\xd9\x13\x20\x19\x70\x6c\x6e\xd0\xbd\x5a\x0e\x2a\x96\xe9\x5b\x5b\xce\x14\x8a\x96\x6d\x32\x3a\x75\x32\x2a\xd2\x79\x1c\x67\x73\x74\xfd\x6a\xda\xa0\xd0\x5e\x61\x80\x74\xc3\x32\xcb\x98\x87\x82\xe4\xfe\xa4\x35\xae\x3b\x2a\x7b\x94\xf9\xef\xb9\x04\x47\x68\x1d\xff\x79\xf8\x44\xd0\x63\xde\x90\xac\x3b\x24\x27\x06\xcf\x02\x64\x05\xbe\x93\x15\x9f\xc5\x92\x7f\xeb\x6a\x44\x15\x45\x3c\x49\xe4\x6e\x8a\xd1\x4f\xae\x64\x47\x0c\x97\x1f\xa8\x34\x28\xa4\x1c\x76\xbb\x56\x73\x05\xbe\x74\xf2\x72\x81\xda\x2c\x53\x71\xea\x63\xea\xf2\x7a\x45\xc9\x68\x2c\x21\x41\xfe\xa2\xcf\x50\x62\x26\x75\x33\x3b\xe3\xc5\xf6\x61\xbb\x3c\x4f\x80\xc4\xfe\xe7\x37\x84\x13\x12\x27\x64\x25\xbb\xc3\x44\x2e\x58\xbe\x9d\xd1\xe2\x98\x8c\xbb\xf3\xce\xa5\xcc\xf1\xe3\xaa\x10\x8f\xd2\x0f\x3a\xf6\xc7\x3e\x00\xa9\x82\x33\xfc\xfe\x45\x42\xb2\x33\x7d\xd9\xfb\xaa\xa5\x37\x11\x3f\x3d\x41\xe6\x51\x92\xf5\x4b\x14\x95\x2c\x0f\x45\x87\xd4\x08\x46\x0f\xdb\x2a\x00\x64\x1c\xe6\x22\x37\xd3\x43\xc6\x86\x4c\xc6\x77\x4d\x64\x88\x9b\xba\xaf\xf6\xeb\x7f\xd7\x73\x3a\xff\x9e\xb6\xe9\x3c\x29\x01\x9b\xb1\x1a\x63\x3b\xbf\x27\x40\x82\xe1\xe7\x93\xc7\xbf\xd1\x1d\xf8\xc2\x77\x42\xe7\x22\x5f\x21\xaf\x7a\xc6\x9e\x14\x36\x0f\x7b\xa2\xcb\x2a\xfc\x34\xc2\xfa\x6e\x1a\x29\x2e\x99\x00\x79\x0d\x37\x45\x95\x6a\x84\xb1\x16\x41\x95\x7d\x9c\x94\x37\x88\x4a\x39\x7b\xc5\xfd\x92\x52\x5f\x54\x93\x6b\xc4\x3e\x39\x13\x26\x14\xa6\x1b\xf0\x0e\x20\x23\xb0\xf1\x84\x91\xb9\xdd\x0d\xdf\xfd\x12\xde\xe5\x4e\x0a\x05\xf9\xde\x79\x57\x78\xe6\x08\xf7\x40\xfe\x22\x8f\x55\x52\xb8\x45\x36\x91\xba\xa1\x27\x40\xf2\xe0\xf2\xd7\x2b\x84\xbb\x90\x64\x49\x1b\x45\x2e\x21\xde\x2f\xfb\x90\xf2\x55\x65\xd8\x8d\x25\x42\xd3\xda\x77\xb7\x12\x25\xbc\x8b\x5e\x98\x7d\x04\x48\x29\xbc\x83\xf3\xea\x5d\x03\x3d\xb2\x3e\xaf\xe5\x9b\x10\xd3\x30\x98\x34\xb1\x4f\x9a\xbc\x8f\xf7\x38\x7f\x47\xf3\xfb\xbb\xa8\xa7\x29\x64\x5f\x57\x01\xf2\x13\x2e\x4e\xb1\x61\xb1\x57\xbc\xfa\xaa\x7c\xaa\x43\x4e\xbc\x2c\x55\xdf\xa3\xd2\xc6\x51\x98\x67\x28\x68\x9c\xe0\xe0\xa1\xd8\x9d\x79\xf3\xac\xf0\x56\x6a\x87\xcf\x53\x61\xd2\x4f\x4f\x2a\xde\xab\x6e\x6e\xb1\x03\x66\x2b\x12\xa5\x5a\x21\x83\x67\xdf\x9b\x33\x9e\x7c\x97\xf2\x42\xe9\x62\xe1\x87\x35\xf8\x57\x98\x82\x88\xaf\x3c\x19\x4d\x99\x35\xd8\xd0\x73\x8b\x5d\x2e\x52\xe2\xf8\xb4\x2f\xef\xb1\x73\xc0\x83\xa2\x1f\xd6\xeb\x12\x12\x16\x5a\xae\x00\x20\x5e\x30\x05\x6c\xd0\xb5\xd5\xab\x1a\xce\x39\xb1\xff\x13\xeb\x44\x9f\xf5\x12\xd5\xab\x7d\x63\xea\xd2\x52\xcf\x03\xd2\x06\x4a\xa5\x63\x79\x8b\xdc\x00\xf2\x08\xa6\x11\x35\x6a\x93\x64\x07\xa5\xcd\xf3\x22\xbf\xb4\xdb\x26\x13\xf1\xb7\xbc\xf8\xc6\x93\x46\x1a\xa2\xb3\x76\x9c\x5d\x95\xe7\xb6\x37\x6d\x13\x0e\x20\xbe\xb0\xe4\x2f\xde\x30\x7c\x60\xbc\x38\xcd\xd6\x54\x65\xd2\xe2\xa4\xc3\xc0\x45\x5d\xd6\x65\x9e\xb8\xb7\xd2\xb4\x75\xbb\x8c\xd6\x2d\x38\x4d\x85\xa0\x47\x7b\xde\x49\x96\x17\x31\xb0\x73\x49\x88\x9e\x3d\xd1\xd1\x29\xf3\xe1\x5c\xd9\x3d\x19\x25\x1f\xaf\xf4\xa1\xbd\x34\xac\x8f\x08\xa2\xe1\x8f\x2b\x7d\xf6\x12\x0e\xcb\x18\x73\xdc\x60\xde\x14\xbf\xfd\xca\xc1\x2d\x86\x45\xec\x96\x69\x29\xb1\x45\x67\x6a\xec\xad\x93\x82\xf5\x5f\x7b\x71\x00\x29\x82\x6f\xa7\xd8\x45\xf6\xa8\x51\x7c\xa7\xbc\x95\x3d\xd4\xf2\xf3\x02\xc1\x25\x6e\x95\xa6\x69\x2e\x3b\xbd\x87\x6b\xef\x82\xa7\x9d\xc5\x36\x8f\x0b\x02\x80\x3c\x86\x0f\xdd\xe1\x19\x1e\xd3\x4a\xe2\x53\x21\x6e\x54\xdf\x33\x4b\xfd\x8c\x03\x8b\x15\xe6\x82\xef\xe6\x81\x93\xaf\x14\x99\xae\xf4\x52\xce\xf3\x03\xa4\x12\xde\x5c\x1c\x4a\x4e\xe9\xd4\x0c\x23\x31\xd7\xb2\x7a\x56\x4b\x43\x64\x2d\xdf\xfa\xb6\x9d\x68\xe7\x48\x8c\x9a\xd5\x7e\x7b\x52\x47\x6a\x7c\x05\x00\x24\x14\xde\xbb\xc3\xfd\xfe\xf1\x87\x1e\x4e\x2b\x70\xcc\x11\x4a\x53\xef\x3d\x2b\x2b\x98\x62\xf4\xed\xa5\xc4\xd7\xfb\x2b\x49\x9b\x4f\x38\x3f\x09\xdb\x03\x64\x02\x4e\x30\xbf\xf8\xdb\x1c\x64\x02\x5d\xd3\x9f\x49\xbf\x4a\xf0\xa5\xba\x24\x49\x72\x8c\xd1\x99\x7e\xb6\xa7\x99\x66\x4f\x57\x63\x62\xf8\x5b\x19\x1c\x40\xfc\xe1\xa6\x21\xc9\x36\x42\xb8\x70\xd6\xdb\xf0\x9a\xaf\xd8\x1f\x1f\xbf\xb3\x77\x43\x9f\x97\xc8\x03\x8d\x0b\x1a\x8c\xc2\x84\xad\x93\x38\xf3\x54\x00\x90\x60\xf8\x1e\xe7\x45\x8d\xa2\x83\xa2\x42\x51\xdc\xf5\x42\x55\x9d\xcd\xaa\x94\xc1\x76\xcf\x6a\x84\x86\x6f\xf9\x11\x33\x04\x09\x2d\xe8\xf5\xb7\x2b\x01\x64\x05\xde\x02\x4d\xa2\xd5\xfc\xbb\x4f\xe8\xf3\xed\x51\x3f\x6a\xcf\x28\x77\xda\xe2\xc5\x33\x77\xad\x76\xa1\xf6\x56\xc7\x4b\xc9\xef\x70\x95\xc4\x8f\xa0\x47\xdf\xbc\x52\x1c\xb8\xda\x4f\x3a\xb2\xa8\x13\xbf\x3b\x6c\x65\x54\x6e\xa9\x55\xbd\x62\xfa\x82\x36\xc5\xb5\x8b\xce\x59\x57\x7c\x1a\xf3\x3d\x81\xbc\x3c\xf4\xb8\x95\xe4\xa7\x24\xbb\xa1\xaa\xf3\xcb\x0b\xb5\x46\xcf\xb2\xd7\x0a\xce\x5c\xe8\x6b\x72\x98\xef\x64\x48\x98\x1c\xfd\x5e\xc2\x82\xa4\x00\x24\x07\x3e\x45\xb2\xf6\x0d\x97\x43\x81\xb6\x32\xfb\xc5\x0f\x22\x54\x79\xad\x54\xe4\x84\x52\x1c\x65\x1e\xcd\x07\xa2\x2f\x25\xed\x6d\x64\x6f\x8d\x02\x48\x19\x9c\x78\x6b\xaa\xd7\x94\xfb\xb3\xcc\xcb\xb4\x13\xe8\xa6\x8e\x26\xde\x5b\x0c\xb6\x90\xe8\xfa\x46\x92\xe0\x69\x5b\xff\xec\x20\xcf\x01\x3d\xcf\xad\x16\x12\xde\x04\x67\x22\x4c\xa4\x7b\x9a\xc4\xdd\x6a\xd8\x34\x3e\xee\x2d\x75\x91\xc6\x49\x8b\x5e\x0f\xb1\x66\x07\xda\xfb\xa5\xae\x56\xed\x7e\xbb\x0c\x3d\xfa\xb4\xbf\xfc\x4f\x71\x9e\xe5\xe7\x55\xe7\x20\x52\xf5\xb5\xbd\x8c\xdd\x59\x6f\xcb\xdb\xe4\x3c\x3e\x3e\xe5\x3a\xc7\xc1\x72\xfb\x35\xfc\x7b\x5d\x9d\xe7\xcc\x1c\xa8\xdf\xea\x44\x8a\xd4\x77\x65\xa8\xaf\x54\xdf\x4f\xee\x9a\xe5\x94\x90\xb0\x53\x33\x92\x07\x3f\xd2\x0f\xa5\xa5\xe2\x00\x92\x02\x2f\x0e\xff\x5d\xa7\x64\x5c\xf3\x61\x13\xbd\xd8\x32\xfd\xa5\xac\x16\xbf\x78\x6a\x72\xbe\xe6\x96\x82\x97\x8c\xe3\x48\x93\x49\xa6\xf8\x77\x00\x90\x49\x78\x75\x7e\xbb\x3d\xfe\xe3\x19\x28\xec\x14\x91\x75\x62\xf8\xe9\xa9\x0b\x91\x5c\x2b\xf7\x03\xcf\x59\x7e\x31\xb5\x0e\x2c\x8f\x7d\x3d\x58\xe2\x09\x90\x69\x38\x71\xdd\x30\x5c\xe8\x15\x22\xba\xf0\x9b\xd6\xb8\xac\xe1\xb3\xd3\x62\xa8\xc5\xb7\x67\xcc\x42\xa5\xc9\x74\x4a\x33\xb1\x77\xac\x36\xa7\x56\xa0\x47\xa7\xdd\x70\x84\x23\xda\x2a\x31\xda\x03\x4e\x6d\xb6\xcb\x87\xef\xb7\xfa\xe6\xbf\xe6\x3d\x72\xb5\xd6\xee\xa1\x64\xad\xf3\x21\xf3\x46\x00\x90\x12\xb8\xbc\xec\x9f\x25\xff\x2a\xad\x6c\xe2\xe5\x5c\xf7\x2b\x6e\xd2\xe3\x82\xcd\x0b\xfe\x6f\x47\xdc\x7f\x6c\x1c\x4b\xc9\xec\x8b\xb4\xf7\x27\xfb\x09\x90\x4d\xf8\x8c\x9a\x8d\x1c\xad\x6d\x4a\xf3\xca\xb0\x41\x3a\x85\x06\x44\xdd\xbe\xd2\x3d\x3c\xd0\xc7\xe2\xcf\x2d\x63\x72\x46\xe9\xc2\xe1\xaa\x3f\xcb\x9e\x00\x09\x82\xab\xfa\x82\xe0\x2e\x5e\x42\x12\x7b\xf5\x16\xde\x79\x03\x85\x2f\xaa\x6c\xe6\xb3\x24\x7a\xc9\x0f\x09\x42\xad\x8e\xb8\xa9\x32\xb7\x14\x51\x02\xa4\x15\x4e\x44\xd7\x5d\xad\x99\x5e\xee\x16\xc9\x61\x88\x39\xc1\xc1\xee\x62\x6d\x44\xc1\x74\x47\x38\xc3\x2d\x67\xf5\xb4\x64\x60\xc9\x95\x12\x5a\x2d\x80\xf4\xc3\x14\x23\xf6\x1e\x3d\x51\x68\xcf\xa6\x16\x27\x43\x65\x6b\x1a\x6b\xbf\x9b\x71\x78\x6b\x94\xc6\x48\xd9\xfa\x64\x3e\x45\x05\x93\x16\x35\xb1\x27\x40\x1e\xc2\x69\xf4\xe1\xb5\xb1\x8f\xda\x49\x87\x19\x1e\x15\x94\xe5\x5f\x18\xf8\x64\xb0\x51\x7e\xda\xf4\xe0\x09\xff\x0d\x9e\xb8\xa8\x6f\x7b\x95\xbc\xa8\x00\xd2\x0d\xaf\x12\x33\x9b\x27\xb7\x91\x73\x8a\x61\xe2\x45\xa5\xaf\xd9\x0b\x06\xba\x2f\x7b\x7c\x35\x8d\x08\xe9\xf8\x3c\xb5\x34\x8c\x8a\x08\xbd\x93\x00\x32\x03\x6f\x82\xe7\x06\x8d\x03\x4d\xf7\xa7\xbc\x86\xfa\x8a\x39\xad\x8c\x47\x7a\x0e\x5f\x91\xfd\xae\xf3\x43\xa4\xeb\xd7\x07\xaa\x0e\x11\xad\x62\x4e\xd1\x7f\x65\x69\xbb\xfe\x12\xc2\x10\x94\xd2\x63\x13\xb5\x6d\xc4\x7b\x94\x6e\x63\x71\x35\x3c\xa2\x19\x9d\xc1\x61\xb3\xb5\x6d\x84\x27\xaa\xdf\x60\x13\xb6\x6d\xc4\x10\x4a\x85\xb1\x38\x1b\x1e\x31\x8c\xb6\x3f\xd8\xac\x6d\x1b\x91\x81\xc6\x0a\x9b\xb8\x6d\x23\xba\xd1\x29\x13\x16\x77\xc3\x23\x56\xf6\xa1\xbf\x4a\x8e\xc5\xe1\x80\x02\x33\xe1\x4b\xef\xad\x26\x0b\x3e\xc5\xfb\x0c\x38\xdb\x4e\x05\xf6\xd3\xf8\x57\xee\xeb\x88\xce\x66\x60\xed\x5a\x61\xfd\xb3\xf9\x09\x1c\x4c\x2d\xf3\x16\x5d\x1d\x72\x3f\x81\x03\x48\x09\xac\x58\x67\x44\x78\x21\xa7\xa2\x05\xda\x36\x57\x2a\xe8\x9e\x6b\xad\xb8\x91\x89\xd2\xf6\x12\xb2\x1d\x75\xb0\x54\x95\xdf\x38\x78\x26\xf1\x08\x0e\x20\xb9\xf0\xdf\x1f\xdf\x6b\x68\x70\xc4\xd8\x1f\x09\xb0\x48\xb0\x1e\x7e\xbb\x32\x1c\xe4\x78\x3f\x66\x48\xd6\xde\x36\x8b\x06\xc7\x5e\x1e\x39\x61\x83\x03\xf2\xf7\xa1\xc7\xa5\x8e\x5a\xbc\xe0\x36\x54\x38\x1c\xdd\xef\x2c\x60\x60\xf6\xac\x71\x39\x2f\x2f\x52\x0d\xc7\x7e\xc6\x74\xf5\x4a\xb1\xbf\xa0\xb9\x08\x0e\x20\xeb\x70\xa6\x25\x1d\x9c\x46\x1a\x71\x6d\xc7\x3c\x66\x4d\xe7\xd4\xce\xb2\x3d\x9d\x6a\xbd\x6b\x17\xb1\xcf\x6b\xd9\xb8\x8c\x24\x4c\x31\x93\xdb\x5c\xf4\xdf\xbc\xc4\x87\x13\x87\x6e\x3d\x2c\x3f\xf1\x88\x12\x54\xb2\xc6\xf2\x14\x8f\xc8\x45\xbf\x30\x8c\xe5\xec\x0e\x42\xfe\x3e\xfe\x15\x58\xde\xe2\x5f\xb1\x8e\x0e\xed\xb0\x89\xfa\x36\x22\x16\xdd\xdd\xd8\x5c\x7d\x1b\x51\x85\x0a\x08\x58\x74\x1d\x8f\x18\x47\xf5\x34\x6c\xc2\xbe\x8d\x08\x46\x11\xd8\x9c\x7d\x1b\xf1\x1a\x6d\xd5\xb1\x68\x3b\x1e\x31\x82\xfa\x81\x4d\xdc\xb7\x11\x79\x68\xe3\x8d\xcd\xdd\xb7\x11\xa5\xe8\xb6\xc2\xa2\xef\x78\xc4\x4f\x54\x08\xc1\x22\xf0\x78\x44\xe0\x5e\xf4\x86\x31\x26\x91\x57\x24\x23\x02\x44\x5b\xa9\xe0\x25\x7c\xb4\xc3\x46\x29\x0f\x17\x72\xd0\xce\xb3\xcd\xe8\x55\x90\x3b\xf3\x13\x4c\xca\xaa\x88\x24\x12\xbd\x24\x56\xd3\xa3\xa8\x23\x99\xed\xe9\xc4\x01\xa4\x0e\x3e\xda\x32\x54\x81\x6d\xa4\x6d\x57\x6c\x98\xe4\xd9\x95\x98\x58\x94\x0b\x4f\x8b\x35\xeb\x88\x35\x85\x7d\x7b\x63\x4e\x36\x97\xd3\x20\x5c\xb4\x75\x9e\xe0\xbf\xaf\x4a\x65\x7b\x46\x35\xae\x39\x81\x80\x31\x90\xb7\x26\xd2\xf8\xbc\x97\xc3\xe8\x54\x16\xf9\x33\x85\x63\x7a\xde\x3f\xef\xca\x58\x8e\xe3\x00\xd2\x04\x97\xae\x73\xe3\x59\xda\x44\x51\x22\xed\x0d\x63\xf1\xd7\x4d\xe9\x42\x26\xb4\x1e\xb0\x12\x14\x50\x49\xf1\xeb\x86\xf4\x1d\x7e\x9f\xf6\xe1\x20\x0e\x20\xab\xb0\xae\x49\xff\xfa\xe3\xcd\x1e\xc3\x9c\xf5\x9c\xc3\x0e\xaf\xdb\x0a\x6d\xf4\x2f\xf2\xa8\x1d\xbb\xbf\xcb\xef\x71\x1c\xdd\x75\x15\xff\xd9\xa3\x79\xa2\xff\xe6\x26\x3e\xa0\x2f\xd1\x93\x8d\xe5\x28\x1e\x51\x87\x2e\x33\x96\xab\x68\xbe\x41\xdf\x81\xe5\x2c\x1e\xd1\x84\x7e\xe2\x09\xcb\x5d\x3c\x62\x15\xd5\x1f\xb1\x1b\xb6\x6d\x84\x17\xaa\x5e\x61\xf5\x6c\x78\xc4\x23\x54\xb1\xc4\xea\xda\xf0\x08\x5f\x62\x54\xc6\xc6\xea\xde\x80\xe2\x33\x2e\x0f\x32\x1f\x1c\x40\xda\x60\x0e\x5f\xe3\x78\xee\xbb\x77\x46\x21\x60\x16\xfe\x58\xd8\xfa\xa8\xab\x8d\x4f\x6f\x89\xcd\x60\xc2\x44\xad\x23\xaa\x4c\xf5\xf5\xc7\x0a\x5e\x1c\x40\x26\xe1\xbe\x5c\xf8\x53\xa7\xe6\x67\xef\x53\xe1\xd4\xbe\x49\x4c\xd6\xae\x91\x96\x03\x85\x97\x2f\xf8\x81\x9c\x67\x47\x94\x16\x83\x9e\x5f\x96\x28\xdb\xca\x50\x30\xed\xe3\x30\x1e\x2b\x67\xb9\x11\x79\x52\xbb\xe1\x53\x87\xc8\xa5\x26\x8e\x8e\xaf\x52\xa6\xe2\xb2\xa7\x40\xa2\xa3\xfd\xe9\x67\x4b\xb7\x7e\xe1\x00\x92\x0f\x13\xb3\x4c\x0d\x59\x17\x59\xfe\x21\xc5\xe3\xaa\xe7\x56\x38\xdc\x27\x78\x9e\xdc\xa7\x2a\xbb\x4b\xa9\x15\xdc\x15\x46\xf7\xb3\x76\xe3\x7b\x04\x0e\x20\xed\x70\x6f\x66\xe4\xf5\x66\x5c\xf2\xb5\xc3\x2f\x15\x9f\x9e\xc4\xc5\xb1\x7b\x6e\x6d\xf7\x8c\x7b\x77\x91\x0b\x34\x97\x84\xc6\xb8\x67\xdf\x0f\xd0\xc3\x01\xa4\x10\xf6\xf7\xc3\xd3\x07\x34\xc7\x2b\x06\x82\xee\xd2\xce\xed\xbf\x9f\x79\x8b\xa5\xea\xe6\x1f\x4b\x02\xd2\x36\x9d\xb7\xa3\x8e\xb2\x94\xd5\x31\x12\x38\x80\x2c\xc1\x3c\x54\x41\x6f\x63\x21\x27\x6e\x8c\x56\x42\x89\x56\xa6\x59\x84\xdf\xe3\xc7\x8d\x22\xa3\xdc\x77\x17\x38\xec\x64\xdb\xf9\x32\x95\x3d\xe6\x44\xff\x2d\x8c\xf8\x05\x6b\x43\x33\x12\x56\x20\xf1\x88\x49\x34\x4f\x62\x85\x12\xad\x10\xe8\x65\x05\xac\x60\xe2\x11\xf9\xe8\xc6\xc3\x0a\x27\x1e\xd1\x8e\xb2\x32\xac\x80\xe2\x11\x85\xa8\xe7\x58\x21\xc5\x23\x96\xf6\xa0\xf7\x72\xb1\xf4\x06\xa0\x28\x42\x00\xfe\xfe\x33\x7b\x39\xbc\x59\x43\x4f\x26\xb5\x8f\x6b\xd8\xa6\xe7\x8e\x3e\x0e\x99\xe2\x5b\x65\xff\x6a\x10\x6d\x10\xcc\x97\x5a\x72\x4f\xd8\x48\x2a\xb2\xf3\xa9\xe2\xd6\x09\x82\x25\xb0\x12\xf5\x89\x2b\xbc\x42\x61\xa7\x34\xe6\xc0\xcc\x0a\xb5\x26\x13\x28\xd3\x89\xe8\x7d\x54\xf3\x20\x06\x31\xb7\xbd\xc3\x15\x7e\x72\xab\xd0\xc1\x9b\xc3\x13\x57\xd6\xd5\xe3\xfa\x62\x65\xcf\x79\xa3\xb6\xf1\x85\x03\x27\x29\xa2\x7a\x66\x53\x8b\x8f\x59\xe7\x53\x1d\xcd\xb5\xeb\x12\x76\xc6\x01\xa4\x07\x9e\x01\x97\x70\x7f\x28\xa6\x79\x96\xef\x75\xc9\xa1\x22\x74\xc6\x9c\x60\x77\xbc\xc9\xf7\x42\xaa\x17\x2e\x46\xb6\x17\xeb\x9c\x10\x3f\x1a\x12\xd1\x7f\x33\x1b\x1f\xa0\x72\x74\x6b\x60\x19\x8e\xe6\x0b\x94\x0a\x60\x99\x8e\x16\x76\xb4\x29\xc0\x32\x1e\x8f\xe8\x41\x87\xba\x98\xaa\xcf\x0e\xa2\x08\x55\xed\xb1\x75\x9f\x6d\xc4\x63\x94\x9a\x61\x4a\x3f\x3b\x88\x4a\x94\xa0\x60\x8b\x3f\xdb\x88\x50\x94\x04\x61\xe9\x3f\x78\xc4\x04\x7a\x28\x30\x15\xa0\x1d\x84\x3f\x3a\x4e\xc5\xd6\x80\x76\xc8\x1c\x5a\xb9\xb0\x64\x20\xb4\xb9\x21\x5d\xaa\x27\xfa\x37\x39\x08\x28\x90\x50\x90\x79\x03\x80\x14\xc1\x8d\x7e\x75\x70\x0b\xad\x19\xd1\xf2\x93\x6e\xc1\x98\x43\x9f\x0f\xec\x69\xbe\x32\xcc\x9c\x28\x7d\x9c\xd7\x80\x9b\xe0\xa3\xe9\xeb\xf5\x4b\x61\x00\x99\x83\x3b\x71\x3b\x6f\xd6\x9f\xcf\xbe\x94\x0d\xbe\x8a\x92\x30\xb8\x68\x58\x7f\xc5\xff\x53\xec\x9e\x92\x13\xdd\x9f\x65\xc8\x1f\x04\xd7\x8d\xb3\x5f\xc2\x01\x24\xe7\x3f\xbf\xb7\x6f\x1d\x27\x70\x9e\x88\x9a\xff\xa7\xb3\x61\x6c\x50\xf6\xaa\x50\x62\x5a\x7b\x76\x2f\x31\x41\xef\xbb\x91\x55\x6f\x76\x63\xe6\x1b\x5b\x3d\x20\x5c\x21\x64\x02\x6e\x93\x5e\xfe\xca\x53\x5a\xf3\xe3\xfb\xe1\xc3\x22\x5f\x4b\x7b\xa9\x38\x9e\x3a\x9e\xb0\xa1\x07\x6d\xae\xe6\x2c\xa6\x57\xbb\x70\x00\xe9\x82\x9b\x1b\xd7\xeb\x33\x36\x14\x87\x6e\xe9\x4b\x5b\x0d\x95\x4a\x29\x71\x9d\x21\xcf\xb8\x48\x24\xbe\xae\x75\x9e\xd8\xb0\x7b\xb4\x6f\x3a\xc5\x6a\x8b\xb7\xc3\x84\x69\x71\x28\x32\x70\x33\xe3\x42\x72\x91\x49\xfa\xed\x1f\xef\x1b\x27\x26\xe7\x44\x0e\xe5\x48\x2c\x3c\xd6\x76\xb9\xf4\xa4\x26\x67\xbf\xa2\xe8\xbf\x46\x65\x67\x73\xa3\x3d\x32\x56\x60\xf0\x88\x39\x94\x38\x60\x85\x06\x8f\xc8\x41\x3b\x5e\xac\xe0\xa0\x5d\x35\x9a\xf1\xb1\xc2\x83\x47\x74\xfd\xef\xcb\x19\x18\x01\x42\xbb\x21\xf4\x0a\x23\xb6\xae\xb8\xdd\xa2\xc9\xa3\xff\x67\x84\xa9\x2c\xee\x38\x8e\x16\x15\x2c\x71\x11\x8f\x28\x43\x43\x85\x25\x2f\xe2\x11\x33\xfb\xd0\x7b\xc3\x58\x32\x23\x50\xa0\x95\xa3\xd9\xaa\x42\x95\xff\xf9\x75\x49\xe5\xf9\x38\xc5\xf3\xcd\x64\x8b\x57\xc4\xe9\xa6\x45\x35\x8a\x02\x18\x3d\x0a\x59\xdc\x3d\xe9\x7a\xb5\xa8\xfa\xee\x73\x9d\xcc\xc2\x01\x04\xc0\x1b\x56\xc3\xe6\xf1\xf1\x43\xd5\xc1\xd4\x86\xaa\x51\x7b\xbf\x64\x56\xfa\x6a\xbf\x6a\x6a\x5a\x7e\x4e\x65\x56\x82\xbc\x73\x6e\xb2\xd2\x3b\xb1\xd5\x0a\xc1\x1d\x41\x7f\xbf\x8e\xa1\x9f\xa8\xd3\xe5\x2b\x6d\xd7\x56\xab\x13\x7a\xc3\xea\xce\x17\x6a\xfb\x78\xa5\x7e\x3e\x9e\xf8\x56\x74\xfc\x73\xef\xd6\x81\x2b\x80\x29\x50\x02\xaf\xe9\x95\xc1\x5f\x35\x2f\xc8\x6b\x69\x07\x18\xd9\xfa\xc6\x8b\x47\x0a\x83\x05\x83\x1e\x22\x6e\x8f\xf7\xc7\x3d\x24\x7b\x11\x2b\xfa\x6f\x66\xa3\x99\xf5\x7f\x97\x0a\x31\x0c\xc7\x23\x00\xba\x95\xb0\x4c\x47\x5b\xbf\xff\x7d\xa1\x19\xc3\x78\x3c\xa2\x80\x0c\x25\x0f\x58\x8a\x2f\x50\x24\x22\x20\xfe\xfb\x65\xe3\x0c\x38\x8f\xd5\xa9\x75\x2f\x15\xfd\xe8\xfc\xc4\xe2\xa0\x9f\x7f\xc0\xe4\x9d\xe5\xac\x2a\x89\x92\x50\x75\xce\xbd\x0e\x92\xe8\xa0\x25\xed\x27\xf9\x38\x80\xac\xc1\x79\xcc\x39\x80\x70\xb5\x72\x42\xf0\xb8\xbb\xb5\x0f\x81\xd7\x60\xe0\x7b\x81\x73\xcf\xfc\x5c\x94\x06\x03\xc3\x58\x08\x59\x96\x1e\xfc\x4c\xc4\x01\x24\x00\x26\x1b\x2c\xe6\xcd\xa3\x97\x7d\xff\x4c\x8c\xfc\xaa\xb9\x53\xde\xc2\x51\x4f\xb0\x61\xa6\x7d\xae\x42\xda\x3d\xc4\xca\x85\x84\x71\x6e\x8e\x14\x07\x90\x1a\x58\xce\x35\x74\xc7\x95\x13\xaf\xb4\x0e\x0a\x58\x09\x67\x5d\xb6\x2e\x24\x68\xed\xf3\xe0\xaa\x51\x94\x97\x4c\x48\x79\x70\xc4\xcb\x2c\x14\xff\xc9\x23\x2c\xb3\xd1\x0c\x80\x66\x19\x2c\xc3\xf1\x88\x35\xf4\xe8\x60\x99\x8e\x47\x04\xa0\x74\x03\xcb\x78\x3c\xa2\x06\x55\x50\x30\x75\xf7\x1d\x44\x0a\x5a\x10\xb1\x95\xf7\x1d\x46\x8d\x6e\x58\x2c\xf1\x1d\x8f\x98\xfe\xdf\xc7\xff\x31\x45\x78\x45\x32\x2e\xdc\x5f\x26\xea\x0b\x4f\xa8\x84\x68\x8b\x27\x6e\x66\x92\xb7\xbc\xd5\x7c\xc3\xb4\xcc\x1f\xa3\xa4\x76\x61\x88\xf0\xaa\x1f\xff\x77\x85\xaf\x85\xd1\x52\xbe\xe1\x5b\x45\xeb\x29\x2c\xc6\x4f\x4f\x93\xf2\x76\x38\x93\x3a\xa7\x9a\x15\xaa\xdf\xe2\xe1\xe9\x36\x76\xdf\xf4\x8f\xe2\xa6\xe6\xb4\x1e\x7c\x66\xa5\x5e\xcb\x66\xb0\xc5\xb3\xe0\xcd\x3a\x9a\xb4\xb2\xb7\xb2\x21\x83\xd3\xcd\x8c\xfc\x4b\xf2\xbb\x60\xc1\xa3\xda\x37\x68\x22\xe5\x09\x5f\x16\xf0\x1d\x2c\x3d\xe5\xcd\x56\xba\x55\x56\x60\xe6\xca\x5c\x79\xa0\x83\xb0\xfc\x0b\x87\xbb\x56\x4c\x97\x6a\x8a\xab\xab\x16\x6f\x60\x25\xa2\xf1\x51\x37\xe7\x32\xd5\x9d\x9e\x75\xb6\x04\xd1\x7f\x33\x1b\xe5\x95\x28\xbb\xc2\x32\x1c\x8f\x78\x8a\x72\x3e\x2c\xd3\x51\x5e\x89\x6e\x58\x2c\xe3\xd1\x42\x8a\x72\x57\xec\x51\xc8\x8e\x0e\x89\x6e\x3f\xac\x69\x08\x1e\xb1\x89\xfa\x81\x3d\x0f\xd9\x46\x04\xa1\x84\x00\x7b\x24\xb2\x8d\x68\x45\x1b\x3a\xac\xa9\x08\x1e\xd1\x8f\x7a\x8e\x3d\x17\xd9\x46\x3c\xfc\x5f\x74\x31\x47\x23\x3b\x32\x3b\x7a\x8c\xb0\xa6\x23\x68\x25\x25\x5f\x0a\x65\xdc\xe1\x10\x31\xac\x93\x87\x15\xb9\x06\x52\x1e\x48\x29\xd6\xcc\x2e\xf7\xf6\x16\x8b\xf2\xee\xf3\xf2\x8a\xe5\x0c\xb7\x36\x23\xbd\xd1\x4b\x0f\x14\x37\x37\x37\x37\x23\xb8\x3c\x01\xf2\x08\xde\xb7\xe7\xb9\x09\x1e\xa5\x8b\x5c\x57\xe1\x79\xbf\x61\x7d\xe8\x4d\xe0\x47\xf7\xe8\xc8\x0b\xf3\xcb\xe3\x05\x07\xac\x27\xb5\x47\xab\x9f\x05\x01\xe4\x29\x9c\x33\x8b\x1b\x9e\x09\x26\xfd\xce\xa0\x13\xe2\x4d\x57\xc3\x0d\xec\x29\x96\x18\x32\x69\x45\xbc\x2c\xf4\xd9\xbd\xaf\x44\xac\x07\x0b\x17\x02\xe4\x29\x5c\x49\xcb\x72\x6d\x75\xcf\x72\xa8\x2e\x8c\x2f\xa5\xc5\x0b\x9e\x7f\xca\x1f\x34\x17\x64\x72\xf6\x4d\xd9\x11\x92\x14\x24\x78\xa4\x7d\x7f\xf7\x96\x35\x70\x3f\x97\xfa\xf8\xc9\xca\x52\xe3\x9d\x88\xa0\xe6\xb0\x71\xda\xd7\xe1\xb5\xe4\x6d\xb6\x38\x8d\x90\xe0\x13\xc7\x02\xc5\x4e\x1c\x51\x79\x61\x01\x90\xaf\xf0\x2d\x82\x6a\x5c\x3e\x67\x16\x7f\x7e\x4d\xf3\x71\x6b\xaf\x68\xff\xa3\x25\xa4\xdf\x6e\x30\x9a\xd8\xe5\x4f\x1a\x53\x06\xf6\x68\x52\x8d\x17\x01\xe4\x1b\x6c\xcd\xb4\xb5\x67\x66\x9f\xaa\x7b\x41\x4e\xc0\xc7\xc0\x03\x4d\xe3\x46\x88\x90\x57\xf0\xd2\xe7\xf8\xd0\x4a\x71\xda\x09\xb6\x00\x16\x2d\x1c\x40\x66\x61\x9e\x41\xc4\x2d\xd6\xa9\x44\xf2\xb4\xc9\xec\x9d\x0e\xcf\xf7\x13\x67\x8d\x4f\x1a\xde\x88\x92\x6b\x9e\xdb\xf3\xe6\x8c\x91\xdd\xa6\xad\xa9\x90\x27\x90\x67\x85\x1e\x1f\xb9\x9c\xe3\xbe\x68\xdb\x81\x8b\xd9\x37\xe6\xd6\x3d\x9b\x1a\xd7\x9e\x47\x32\x53\x94\x29\x19\xaa\xf0\x70\xce\xeb\xb3\x78\x05\x25\x40\xbc\x60\x6b\x1c\x3e\x7d\xc1\x3d\x9f\x1d\x8a\x37\x1a\xea\x64\x2c\x9d\x69\x1d\xc8\xfd\xbe\xa6\xc9\xa4\x9c\x2c\x97\x76\x90\xc2\xe0\xe4\xe8\xf9\xdb\x00\xe9\x83\x75\x9f\x63\x57\xeb\x3b\x95\x5f\x4c\x89\x6a\xed\x65\x9c\x60\x52\x10\x6a\x79\x9d\x39\x4a\x6f\xa8\xd3\x5f\x44\x67\x30\x8a\x53\x79\xad\x53\x0a\x00\xd2\x0a\x37\x19\xd4\x09\x08\xd9\x59\xd9\x13\xc2\x2f\xf5\xf6\xed\xb1\x4b\xda\x25\xfa\x55\x92\xe9\x91\x1b\x1d\x87\xf7\xf5\xe6\x0f\x12\xb5\xc6\x74\x46\x00\xf9\xbd\xef\x3f\x4d\x83\x53\xe2\xc2\x88\x31\x50\xea\xba\xff\xa9\xba\xca\xea\xb4\xe2\xe5\x9f\xbf\x2b\xbd\x6f\x3e\xa5\x9b\x0f\xaf\xdb\xed\xf8\x71\x10\x07\xe4\x9d\xa1\xc7\xa5\xbf\x1b\x31\xac\x86\x4a\x32\xe6\xb5\x1e\xd9\x5b\x55\x96\xf2\x4d\xfa\xb4\xe5\xe0\x33\x86\xbd\x6d\x3c\x14\x23\xb5\x79\x52\x9a\xc1\x00\x20\x3e\xb0\x08\x6a\xb6\xba\x9e\x78\xad\xc1\xc7\x57\x8a\x5f\x2d\xfe\xed\xc0\x9d\xef\xa4\xf1\x37\xdc\x6d\x4f\x1e\xd9\xa5\xe0\xd8\xea\x9a\x31\xef\xac\x04\x90\x0f\xb0\xb3\x23\x0e\x7a\xcd\x16\x48\x1a\x71\x77\x91\x74\x83\xf5\x2a\xf3\x72\x88\xb3\x1d\xd9\x05\x8a\x18\xc9\xa9\x5e\xae\x77\x51\x6c\x15\x99\x00\x20\x1f\xe0\xfb\x07\x66\x8f\xce\xf4\x94\x2a\x92\xb1\x7f\xa0\x3e\xab\xf7\xdc\x32\xa3\x40\xd7\x61\x70\x1f\xbd\xc5\x86\xb0\xb1\x7e\x17\x13\x8d\x5f\x05\x07\x40\x4a\xe1\x85\x5d\xee\x4a\x09\x7e\x7c\x25\xee\x8f\x83\x23\x69\xe0\xd9\x92\x7b\xa3\x59\x2d\x9a\x2b\xcd\x29\xfc\x8a\xcb\x3f\x47\x7e\xc5\xcd\x7d\x4c\x86\x1e\x4d\x71\x51\xf1\xd2\x0a\x55\xfb\xa4\xac\xcf\xca\x77\xea\x93\xe1\x79\x4d\xc6\xd4\x29\xee\x4e\xb3\x1a\xa9\xa2\xa7\x2d\xf4\xf6\xc3\x89\x9e\x00\xf1\x84\x49\x88\xe6\x9e\xde\xb0\x78\x42\x31\xdd\x7b\xcc\xba\x6a\xf2\x53\x07\x2e\x87\x77\xfe\x39\x73\xd8\x2c\x5e\xaf\xc9\xf9\x9a\xf4\xaf\x27\x8a\x51\x00\x79\x0c\x97\xa5\x7b\xfb\x3c\x95\x32\x08\xae\xe6\x13\x9a\xff\x30\xcb\x25\x73\x9f\xe0\x78\xa8\x67\xbd\xb9\xcc\x12\x21\x1a\x7d\x2b\xea\xf5\x1e\x97\xb7\x00\xf9\x08\x6b\xdb\x41\x1c\xf2\x6c\xac\xb4\xf3\x11\x1b\xcf\x7e\xe7\xa8\x50\x1c\x12\x4c\xff\x72\x90\x2a\x7d\xd3\xec\xe4\x7a\x0b\x5d\xa6\x0e\xcb\xd7\x42\xe8\xd1\x81\x89\xaf\x0c\x4b\x53\x02\xbd\xac\x93\x3a\x15\x67\xaa\x8d\xa8\xef\x1f\x1b\x4a\xd5\xd0\x25\xf8\x51\x79\x35\xed\xf7\x31\x96\x45\xf8\x73\x67\x2f\xd3\x49\xbf\xe6\xb3\x8a\xbd\xcd\x12\x35\x99\x27\x9f\x35\x39\x4e\xc1\xf3\x54\xb5\xfb\x5c\x66\xdd\x83\x6e\x8a\x1e\xd9\xaa\x1e\x0e\x4f\x80\xa4\xc3\xd7\x31\x34\xe8\x08\x55\x7d\xfe\xe0\x2a\x9b\x1c\xed\x79\x7a\x2f\x0c\xba\xb2\xef\x3b\xf7\x7d\xf7\x21\x96\x55\x3a\xa3\x8f\x54\xbc\x96\x96\x12\x00\xc9\x86\x7d\x1c\xda\x78\xc2\xbe\xb0\xb6\xbb\xe1\xf8\xdb\x2f\xd6\xf6\x63\x43\x4a\x5c\xfa\x8e\x82\x15\xe1\xeb\x7c\xaa\x84\x7f\x58\x4f\xfe\x79\xef\x03\x90\x12\xb8\x5d\x64\xb4\xa1\x7e\xcf\x68\x71\x8e\xd4\xbe\xde\xae\x5f\x7d\x8f\x26\xb3\xa5\xbc\xac\x6c\xff\xb1\xb4\xdf\x25\x67\x8d\xf6\x90\xde\x08\x79\x05\x5f\xaf\xf0\x7c\x29\x21\x7b\x51\x7a\xcc\x69\x57\xac\xc1\xef\xa5\x72\xba\xbd\x71\xe1\xf7\x12\xeb\x82\x49\xe4\x67\xdf\x6b\x5e\x3c\x36\x73\x01\xde\x51\x2c\x6f\xc6\x6e\xed\x3d\x35\x67\xa8\xbc\x9b\x3c\x4b\xe0\x13\x59\x69\xdb\xf4\x7c\x4b\x5b\xd9\xec\x49\x5a\xee\xcf\x2e\xfb\x7a\x59\x3d\x01\xf2\x16\xe6\x17\xfd\x01\x97\xc7\x6f\x59\xbe\x9b\x58\x0a\xe9\xab\xfa\x7e\xeb\x75\xaa\x6b\xe2\xb1\xb7\x35\x9a\x3f\x3d\x5b\x78\xdf\xe4\xfe\x7e\x37\x40\x0c\x90\x5a\x78\xc3\x66\x1c\xbd\x75\x6d\xf7\x74\xb2\x0e\xcf\xd7\xb6\x7e\xda\xe7\xdd\x9c\xde\xbc\x33\xf3\x27\x46\x0b\x96\x02\xee\xfd\xb4\xce\xb7\xb9\xf0\x13\x20\x3f\xe1\xfd\xea\xf8\xe2\xb9\xb3\x1f\xcf\x9e\x30\xdc\x9f\x1b\x2c\x0f\x04\xaf\x9d\x4f\x63\x25\x56\x9f\x8b\x64\x2e\x38\x11\x69\xa4\x45\x64\xc7\x64\xe6\x09\x90\x08\x38\x26\x67\x5e\x7d\x25\x91\xbd\x53\xd5\xf5\x4d\xb0\xf8\x98\xb8\xe9\xf7\x13\x25\xf3\x5f\xc9\xf7\x9f\x8e\xbb\x3d\xe2\x71\x29\xe3\x47\x8e\x7a\x04\x40\x62\xe1\xd4\x72\x77\xe2\x44\x27\x7b\x56\xec\xab\xcc\x8b\xa3\x53\x7a\x03\xb5\x6e\x34\xf1\xa4\xce\xb5\x05\xe0\x48\xa4\x0f\xee\x73\x99\x8b\x6d\x3d\x40\x7e\xc2\x7f\x3d\x58\x34\x38\x6c\xb1\xd0\x71\xa2\x52\xd1\x1f\x47\x3f\xcf\xea\xc4\x51\xa3\x71\x37\xfb\xd7\xc2\xdc\xaf\xc1\x1a\xa2\x23\xd6\x4d\x1f\x3c\x81\xbc\x06\xf4\x78\x16\xef\x42\x6c\x89\x5b\xb8\xeb\xb8\x65\xdf\xd0\x5d\x72\xea\xa6\x22\x0e\x63\xe3\x77\x61\xa7\xc7\x3c\x38\x6e\x19\x1b\xa5\x23\x17\x00\xf2\x11\xae\x30\x86\x1b\x03\xd3\x67\x46\xae\x70\x1c\xd2\xbd\x02\x90\xf2\x96\x98\x68\x96\x8e\x36\x7f\xf1\x57\xae\x05\x39\x83\xf7\x1d\x4e\xe5\x8c\x02\xa4\x0b\xce\xe9\x33\xaf\xdd\x6d\x64\x82\x16\xf9\xf2\x1c\x80\xfb\xa5\xf9\x3e\xe7\x1a\xad\x47\xb6\x87\x9b\x2c\x8a\xf5\x47\xc2\x4f\x7d\xc9\xbb\x2d\x0e\x00\x12\x01\x27\x2e\x2b\xbb\x59\x5a\x70\x73\x34\xca\xd8\xe7\x2c\x05\x2f\x99\x8e\x02\x89\xc4\x09\xd2\xc6\xa0\xb9\x8a\x58\x86\x53\x22\x1c\x3d\xe2\xf6\x00\xc9\x85\xe5\xed\xb5\x4b\x8f\xc3\x43\x7b\x17\x79\x6c\xca\xde\x94\x1a\xb5\xcb\xaa\xae\x92\x39\xf7\xfd\x78\xeb\xe1\xe6\x35\x87\xfb\xe1\x44\xfb\x07\xde\x32\xbb\x6e\x50\xd9\x6a\x9b\x98\x89\x9c\x6f\x3e\x65\x47\xd7\x29\x10\x40\xfb\xd2\x24\x90\x30\x70\x39\xfc\xae\xa0\xbf\xf8\x94\xfe\x9a\x12\xf4\x28\x4d\x93\x4b\xa2\x2f\x57\xd0\x12\x8b\xa5\xeb\xe5\xcc\x47\x65\x8d\xcd\xb4\x71\xa1\xb1\x0f\x8d\xe7\x05\x5d\x8d\x9b\x8e\x2b\xe7\xc2\xbf\x44\x2e\x5f\x67\x54\x52\x2f\xf2\x75\xb8\xae\xfa\xd5\xa7\xd6\xfd\x93\xd7\x72\x2c\xf9\xbe\x38\xe3\x9e\x4d\x9f\xbd\xca\x1c\x9b\xf0\xa0\xa6\xce\x13\x20\xb9\xf0\x61\x2b\xf4\xfc\xad\x7a\xc9\x90\x5b\x68\x4c\xbe\x10\x77\x64\x7f\xf5\xb8\x07\x75\xad\x8a\xe8\xc3\xa0\xec\x86\xa6\xf5\x71\x2e\x9a\x8e\x52\x80\x14\xc0\x87\x6d\xd1\x55\x2c\xf2\xf3\x6e\x05\xff\x28\xda\x3f\x32\xaa\x77\x08\xec\xb8\xb2\x9e\x4f\x94\x4f\xf6\xbd\x52\xb8\xdf\xbb\x62\x91\x71\x5a\x1e\x20\xe3\xf0\xd2\x1f\xc8\xf9\x10\x70\xc4\x96\x89\x4b\xfb\x66\xad\xec\x47\x9d\x17\xc3\x07\xfa\x6c\x14\x1f\x89\x08\x3c\x3c\x55\x1b\xf8\xb9\xda\x44\xc8\x00\x7a\x34\xad\xe0\x19\xab\xec\x2d\xab\x9f\x3e\xb3\x61\xc9\xe1\xf2\x37\x42\x73\x64\xcd\xfc\x3f\x47\xb1\x65\x32\xf3\x7a\xc9\xe4\x2a\xed\x12\xd8\x3a\x41\x70\x92\xad\x08\x55\x7e\x15\x6b\x61\x3e\x4f\xdb\xa1\x53\x1a\xfe\x43\xfc\xd9\xa1\x81\x7d\xd2\x79\xbd\x16\xba\x8f\x8d\xcb\xbe\xc4\x3e\x60\x3e\x00\x90\x05\x38\xb5\xc9\xed\xff\xcd\xee\xf9\xa7\x97\x2a\xca\x6f\x6f\xa9\x03\x45\x6b\xeb\x9e\x5d\x6c\xfe\xb6\xe1\x96\x81\x83\x96\xaa\x63\xd1\xa2\xa3\x9f\x01\xb2\x0e\x1b\xde\x74\xaa\xe6\x3a\xa9\xd2\xae\xec\xe0\x62\x6b\x5c\x8b\x54\x73\x8d\xa9\xb3\xde\x5d\xd2\xa1\xbb\xc1\x4d\x1e\x8e\x27\xeb\xbf\xd6\x3f\x00\x00\x09\x84\x4f\x9c\x41\x09\xee\xea\x9b\xec\xda\xac\x3c\x1c\x18\xc8\x26\xfd\xad\xf4\xf5\xc0\x34\x70\x0d\xbc\xf9\xeb\x4b\x8f\x90\xcd\x00\xce\xf5\x3a\x40\x3a\xe1\xc7\xeb\xb9\xeb\x8f\x11\x1b\xb0\x9c\x0f\x3e\xf1\x2a\xfe\x5a\xfe\xf5\x2e\x7a\x23\xd1\xde\xb4\xdf\xe3\x8f\x09\x9a\x7d\x4a\x1e\x92\xdd\x9e\x84\x1e\x9d\x23\xcc\x24\x95\x9a\x67\xdd\xbd\x29\xb3\xf7\xc1\x24\x49\xd9\xb9\xf5\x98\x7b\xee\x07\xfd\x6f\x1c\xcf\x9c\xe5\x16\xc8\x8e\xe3\x7b\xe1\x09\x90\x28\x98\xe3\xec\x8b\x5b\x14\x6e\x32\xb9\xb6\x32\xea\x64\x13\xcc\xab\xea\x9a\x26\x2c\x70\xcf\x58\xec\xc9\xa6\x7e\xd2\x29\xc6\x63\x17\x84\xdf\x3f\x01\xc8\xc4\x7f\x7e\x86\xa1\xe8\xc8\x5e\x19\xe7\xa3\xdf\x43\xce\x5b\xf9\xfb\xf6\xe4\x5e\x94\xbf\xdd\x17\xb7\x5f\xff\xb1\x98\x2a\xd7\x65\x76\x25\xa1\x57\x71\x00\x99\x87\xff\xba\xe1\xdb\xab\xf2\xfe\x8b\x5f\x37\xdb\x38\x4d\xbc\x12\xe4\xfd\x0f\xf2\x99\x2b\xa5\x9e\x6d\x0a\x0c\x27\xd7\x26\x49\x6e\x28\x20\x6f\x82\x6f\xd5\x25\x53\xa6\xf1\xb2\x5c\xde\x13\xf5\x58\x3e\x92\xc5\xdf\x30\xf2\xcd\xed\xc8\xa1\x87\xcc\x4f\x45\x4e\x26\xb7\x94\x34\x30\x46\xde\xc6\x01\x24\x01\x2e\x6d\xd4\x92\xd6\x4b\xf1\x24\x29\x6c\xe9\x15\xb2\x8c\xe5\xe6\xa7\x03\x88\xd3\x56\x08\x6d\xe2\xe6\xe9\x74\xb9\x63\x8a\x7b\xe6\x15\xe4\x01\x40\xea\xe1\xfe\xdd\x41\x2f\xec\x7e\x49\x46\xff\xad\x36\x46\x9e\xae\x22\x11\xf2\x2b\x9a\xb2\x89\x73\xe1\x84\x0d\x86\x5a\x55\x8f\x5d\xca\xea\x0c\xc5\x00\xf2\x0b\xde\xb9\xbf\xb2\xc5\x9a\xbd\xcd\xfa\x95\xac\x6a\xe8\x64\x67\xf7\xee\xbb\x6f\x72\x99\x8e\x78\xa5\x82\x5d\xaf\x88\x41\x5b\x4a\xcb\xe3\xc6\x41\xe8\x51\xd3\x4b\xc7\x37\x2f\x5c\x91\x9a\x5f\x3d\x28\xf3\x9c\xb4\x3f\x34\xa0\x64\xbf\xb8\xba\x7d\x82\xcc\x9a\x6e\xaf\xd3\xfa\xef\x9e\x10\x33\xd1\x7f\xe5\xb6\x64\xdb\x63\x42\x94\xdc\x63\xd3\xdb\x6d\xc4\x53\xb4\xad\xc1\x62\xb8\x28\x02\x15\x5c\xb0\x39\xee\x8e\x55\xa8\xec\x8f\x4d\x73\xb7\x11\x5f\xd1\x3b\x4d\x58\x4c\x17\x8f\xf8\x86\x5a\x85\xc5\x75\xf1\x88\x59\xf4\xf3\x11\xd8\x74\xf7\x2f\x42\x9e\x15\xff\x0a\x6c\xc2\xbb\xfd\x0a\x2f\xd4\x28\x4c\xce\xbb\x83\xe8\x43\xfb\x39\x6c\xd6\xbb\x8d\x68\xa5\xfe\x9f\x24\xfc\xff\x13\x5f\x3c\xe2\x37\xfa\xc3\xe9\x98\xdc\x77\xc7\x71\x67\xb4\xf5\xc5\x24\xbf\xdb\xaf\xf0\x41\x47\xe2\x98\xfc\x77\x07\xf1\x01\x75\x1c\x9b\x01\xef\x20\xd0\x21\x0c\x16\x09\xc6\x23\x4a\x49\xd1\xbb\x5c\x58\x64\x18\x28\xe0\x68\xe4\xbc\xb6\xf6\x15\x3c\x34\x6c\xfc\xf6\x70\xea\xb8\x61\x4f\x67\x90\xe1\xa4\xc2\xd8\xe9\x67\x5e\xdd\x82\xd7\x7a\x6f\x0d\x45\x66\xee\xb2\x1e\x33\x31\xaf\x90\xb1\xd8\x3a\x1d\x30\xf5\x22\xba\x42\x42\x11\x25\x6a\x61\x7c\xeb\xd4\xa4\x09\x6f\xf7\xf5\xa3\xa7\xe2\x54\xa8\x52\x94\x45\x8d\x8f\xda\xd9\xd1\x04\xfa\x2a\x9f\xc1\x01\x64\x12\x4e\x79\xa1\xb5\xfe\x46\x1d\x4a\xea\xc4\x80\xff\x40\xf0\xe6\x9c\xec\x19\xd7\xd2\x8e\x62\x6d\x1c\x25\xe3\x63\x0a\x42\x29\xcf\xf7\x96\xbb\x01\x40\x0a\xe1\x8a\xfa\x91\x77\xd8\xe2\x9e\xa2\xd2\x9b\x02\x8d\xbb\x27\x53\x1d\xfd\x07\x68\x7f\x4e\x32\x7c\x70\x46\x4e\x8f\x11\xdc\x9f\xd6\x2e\xa9\xca\x02\x48\xc9\x7f\x7a\xd2\x26\xe3\x3b\x45\x56\xd7\x35\x84\xa6\xfb\xdd\x4a\x0b\x2d\xbf\x79\x35\x2e\xb3\x7f\x32\x3c\x42\x31\x76\xe7\x62\x4e\xa7\x8f\x5f\xba\xe8\xbf\x79\x89\x1e\x39\x74\xc6\x88\xe5\x27\x9a\x3a\x50\x2d\x08\xd3\xd3\x1d\xc4\x24\x9a\x3a\xb0\x7d\xdd\x46\x14\xa2\x73\x33\x2c\x77\xf1\x88\x12\xf4\x1d\xd8\x2d\xcf\x36\xc2\x13\x15\x2f\xb1\xbb\x9e\x6d\xc4\x63\x54\x0b\xc2\x6a\x7c\xf0\x88\x8f\xff\x13\x16\xb1\x1a\x20\xa0\xc8\xe5\x41\xc0\xbd\xb5\x5b\x43\xe1\x7a\x7b\xb1\xe3\x4a\xc7\x9d\xce\xf4\xdb\x9b\x17\xf2\xc9\x90\xf4\x98\x97\xf1\x1e\x67\xe3\x55\x7f\x7f\x21\x6b\x5a\x6b\x65\xfd\x4a\x0e\xb6\x5e\xd2\x0b\xf7\xd9\x96\x5e\x52\x0f\xba\x1d\xa3\x5b\xaa\x4e\x38\x47\xa7\x29\xd6\xea\xe8\xe2\xde\x90\xbf\x6b\xcb\x4c\x27\x9f\x2b\x21\xbc\x4c\xa8\x95\x80\x03\x48\x08\xcc\x6f\x4b\x02\xda\xbf\x19\xdf\x56\x20\x8c\xe5\x3f\xac\x13\xbc\x94\x24\x7b\xe1\x83\x07\x6e\xf7\xd9\x9a\x0b\xbe\xbd\xa9\xda\x8f\xde\x48\x4e\xe0\x00\x32\x00\x57\xd1\x69\x52\xdd\x70\xb2\x07\xac\xe3\x93\x82\x3a\x54\x65\x15\x8f\x16\x3a\x14\xa6\x66\x93\x0f\x6a\x0e\x32\x95\x2c\xe7\x97\x93\xa5\x8a\x8a\xfe\x9b\xd9\xf8\x00\x85\xa2\x95\x0b\xcb\x70\x3c\xa2\x17\x4d\x95\x58\xa6\xe3\x11\x21\xff\xab\x43\x18\xc6\xe3\x11\x03\xb4\xe8\xb2\x61\x35\xa3\x40\xf1\x00\x01\x97\xc7\xd6\xb2\x35\xc2\xcb\x40\x4e\x55\xf9\xc6\xbc\x62\x9d\x78\xde\x51\x35\xfc\x96\x5a\xb4\xa4\x8f\xbd\xd5\xed\x07\x53\x57\x7c\x8b\x55\x04\x5e\xd5\x6e\x66\x72\xe2\x00\x82\x83\xf5\xdd\xf4\xec\x02\x9f\x7b\xfb\x1b\x90\x27\x44\x0f\xcd\x74\xeb\x8b\x84\xef\x6a\x7f\xb9\x29\xfc\x5c\xc2\x8e\xe6\x5a\xa4\x7d\xab\xac\xcb\x0f\x1c\x40\x96\xe0\x2c\x20\xb0\xbc\x7e\x67\xfa\xcd\xf3\x61\xe2\xdd\xb7\x17\xba\xe3\xac\x96\x2b\x5d\x7f\xaf\x15\x1e\x0c\xb1\xb8\x12\xe2\x7b\xad\xc8\x7b\x90\x1e\x07\x90\x0e\x98\xcd\x4c\xec\xe9\x13\xec\xf7\x8d\x53\x9d\x50\x17\x8d\xd3\x50\xb4\x38\x10\xb8\xa6\x24\x91\xa4\x38\xee\x22\xa2\xfc\x9d\xac\xaa\xcb\x5b\x5d\xf4\xdf\xcc\xc6\x07\xa8\x11\x5d\x04\x2c\xc3\xf1\x08\x1c\xaa\x3f\x62\x99\x8e\x47\x2c\xa1\x27\x1a\xcb\x78\x3c\xa2\x03\x3d\x9f\xd8\x92\xc0\x36\x22\x1d\xcd\x33\xd8\xaa\xc0\x36\x22\x1b\x7d\x07\x96\x30\x80\x66\x26\x72\x74\xbe\x88\x25\x10\x00\x05\x1a\xd2\xbf\x05\xab\x1e\x9e\xe7\x9d\xa1\x4c\xcf\x4e\x6e\xe0\x5b\xdb\x6b\x10\x54\x9c\xd0\x64\x7f\xfc\xdc\xd5\x00\x5c\xab\xec\x86\xfe\x45\xff\x93\xaf\x6d\xa4\x0b\xb7\xd6\xfa\x0b\xdc\x2c\x30\x8d\x7d\x70\xf7\x3a\xf4\xde\x36\xcb\xec\xcd\xe3\x47\x94\x43\xb9\xcf\x0f\x92\xfa\xea\x91\x5c\xf6\x6c\x27\x0f\x53\xbe\xa1\xcf\x2f\x84\x03\x48\x2c\x5c\xe0\x28\x57\x36\x5e\xa7\x4a\xf8\x24\x73\x75\x1e\x6c\x3d\xc0\x76\x7e\x2a\x5c\x90\x4d\x60\xf0\x7d\xc9\xeb\x14\x59\xe7\xb4\xa3\x16\xda\x61\x38\x80\xd4\xc1\xc4\x9b\xb0\x2d\xfa\x6a\x4a\x68\x94\xf0\xca\x67\x81\x66\xb5\x77\x9f\x90\xd8\x35\xcd\xfb\x47\x3f\x3c\x19\x4d\x5b\xba\xea\xc4\xab\xfc\xb5\x4f\xf4\xdf\xcc\xc6\xc7\xa7\x1e\x9d\xf1\x62\x19\x8e\x47\x7c\x41\x49\x03\x96\xe9\x78\x44\x2c\x5a\xb3\xb0\x8c\xc7\x23\xea\x76\xa3\x29\x00\x4b\xab\x01\x8a\x5c\x04\x2f\xff\xa6\x80\x18\xb8\x83\x7c\xc3\xe6\x34\x3c\xf8\xc9\xd9\x47\x68\x9e\x86\xb2\xde\x5f\xf9\xa9\x9b\x83\xcd\x6b\x8e\xb1\x6b\xe6\x1d\x82\x8e\xbf\x1f\x87\xef\x55\xdc\xda\xb0\xb0\x26\x39\xc5\xd7\xe1\xeb\x3a\x5b\xf8\x46\x5b\xc5\x67\xdf\x2b\x26\xc2\x93\x49\x02\x45\x2c\xea\x0c\xf6\xf3\x6a\xdf\x0c\x59\xc3\xaa\x1a\xde\xe3\x00\xb2\x09\x6b\x3c\x51\x27\x09\x6b\xa4\xb8\x52\xbf\x32\xea\x5f\xb9\x30\x11\xaf\xbf\xaf\xcc\x5b\x79\x4e\x4c\xe5\x32\x5b\x11\xb3\x43\xaa\x9a\xf3\xe0\x96\x3d\x8b\x70\xe6\x2e\x67\xd3\xaa\xee\x79\x25\x6c\xe1\x9f\x2d\x77\x87\x5a\x2e\xf8\x27\xf3\xf2\x61\xa9\x5f\x8f\xea\xc2\xb2\xd9\x2c\xf5\x45\x10\xa0\x23\xfa\x6f\x66\xe3\x03\x14\x83\x5e\xe3\xc4\x32\x1c\x3d\x9e\x28\x9f\xc4\x32\x1d\x8f\xd8\x44\xf9\x24\x96\xf1\x78\xc4\x22\x3a\xc3\xc4\x56\xcc\xb6\x11\x6f\xd1\xad\x81\x2d\x9a\x6d\x23\x6a\x51\xab\xb0\x74\x33\x3c\xe2\x27\xba\x61\xb1\x95\xb3\x6d\x44\x04\x3a\xf5\xc4\x16\xcf\x76\xb6\x38\xda\xa6\x60\xe9\x67\xa8\x55\xe8\xfd\x0d\x6c\x09\x6d\xbb\x85\xd0\x40\xc7\xbd\x98\x22\xda\x0e\xff\x41\x5b\x59\x4c\x1d\x6d\x07\xd1\x85\x16\x6b\x6c\x25\x6d\x27\x54\xe8\x6d\x03\x2c\x31\x0d\x8f\xc8\x25\x42\xcf\x36\x96\xa8\x06\x14\x49\x76\x11\xfc\xbd\xf2\x91\x01\x2b\x9a\xaf\xd6\xf3\x10\xc5\xe8\xe6\xa7\x5a\x11\x63\x3f\xc9\xf4\x66\xda\x8e\x77\x1d\xa8\x4c\x96\xa4\x13\x3b\xfd\x65\x4f\x2e\xdd\x8d\x27\x06\x38\x80\x78\xc3\x29\xd9\xba\x22\x6c\x21\x30\x7b\x29\x6d\xd7\x90\x30\x5f\xdb\x82\x79\x44\x8a\x2f\x6d\x5c\x21\xa7\x1f\xc7\x8d\xef\x6a\xea\x6d\x96\x03\x04\x38\x80\xd4\xc0\xcf\x5b\x4d\x55\x1d\x31\xbb\x28\x29\x91\xfa\x4c\xe3\xc8\xc5\xb4\x18\x2b\x65\xcf\xc1\x78\x5d\xe4\xa9\x89\x09\xf5\xc3\x93\xbb\xdc\x37\x1d\xb7\xec\x81\xcf\xf6\x29\x4e\xb1\x6f\xcc\xcc\x34\x5f\x55\x6d\x46\xfb\x7e\xd7\x99\x7d\x52\x26\xd9\x2c\x9e\x98\x3a\xf7\xa6\xe2\x9e\x71\x60\x0a\xa1\xc4\x84\xe8\xbf\x99\x8d\x0f\x50\x06\xba\x97\xb0\x0c\xc7\x23\xbc\xd1\x1d\x8e\x65\x3a\x1e\x51\x83\x22\xb0\x8c\x47\xad\xa2\x45\x2f\x43\x63\x09\x9c\x40\x91\x6b\x17\xcf\x1e\x1f\x1c\x40\xf2\x60\x0d\x70\xd3\xf7\x76\x32\x20\x56\x54\x1d\x65\xf3\xf2\xd3\xfd\x35\x46\xb9\x2f\x97\x72\xa9\xbc\xfe\xcf\x83\xd8\x47\x8c\x69\x31\x2a\x53\x63\x5b\xb5\x05\x66\x71\xf1\x56\xf3\x2e\x6b\x3f\xab\x74\x4b\xb2\x1b\x22\xab\xab\xee\x3a\x8c\xb2\xf8\x7a\x9e\x39\xd0\x6a\xfa\xa9\xb6\x1c\xb7\xe4\xaf\x36\x8e\x03\x48\x12\xac\x2d\x73\x9a\x73\x33\x75\xeb\xc8\x29\xcb\xc6\x1f\xab\x70\x1f\xf1\xf9\xec\xf8\x61\x7f\x92\xb4\x79\xcf\x5c\x46\x42\xad\x9b\x36\x91\xd2\x16\xed\xfd\x0a\x97\x08\xda\xb0\x34\x69\xa5\xa4\xbd\x20\x9b\xd0\x41\xca\xda\x71\x65\x6a\xee\x3b\xdb\xe3\x1e\xfa\x90\xee\x6c\xc5\xb2\xd1\xbd\x8f\xff\xfe\x9b\x72\x2e\xcc\xe2\x40\x25\x4f\x71\x8a\xf0\xa3\xbb\xb2\x47\x5b\xf5\xaf\x0a\x4b\x85\x11\x52\xdb\x1d\x4d\xb2\xbf\x5f\x4c\x29\x93\x69\x4b\xf6\xf5\x22\x17\x0e\x20\x9f\x60\x96\x98\x56\x6d\x68\x98\x17\x24\xf9\xb9\x65\xef\x49\x97\xf7\xc6\xc9\xcb\x56\x3f\xc6\x1e\x0b\xe5\x68\xdc\xf2\x28\x3e\x26\xe8\x38\x6b\xfc\xf7\x73\xa6\xf0\xb6\x0e\xe9\x25\xb2\x58\x68\xb2\x90\x37\x63\x4b\x27\xcb\xf7\x35\x2f\xb1\x61\xe1\xec\xb8\xe6\xfc\xf5\x1d\x5f\xaf\x98\x6c\xbd\xfc\xe0\x03\xd1\x7f\x0b\x23\x7e\xc1\xf2\xd0\x09\x32\x56\x20\xd1\xca\x8e\xf2\x4a\xac\x50\xe2\x11\x49\x68\x86\xc1\x0a\x26\x2a\x4b\xa1\x85\x0b\x2b\x9c\x68\xbe\x40\x39\x1f\x56\x40\xf1\x88\x4f\x28\x77\xc5\x0a\x29\xaa\x19\xd1\xa0\xff\x98\x82\x25\xc9\x03\x45\x1a\x02\x72\x5a\x6f\x1c\x40\x96\xe1\x1c\x20\x90\x12\x2e\x45\x46\x5a\x99\x19\x3d\x64\xfd\xea\xbe\xbe\x18\xeb\x44\xac\x64\xee\xf1\x8b\x69\x69\xdc\x42\xb6\x4a\xb3\x9f\xa2\x79\xb6\xcc\x82\x47\x0f\xbb\x0f\x16\xbc\xa7\x54\x55\xbb\xa9\xd5\xfe\x86\xfe\xa9\x31\xe3\xec\x40\xbc\x06\x73\x0a\x5d\xf6\xec\x4b\x7b\x97\xa8\x14\x06\x47\x3a\x1c\x40\x52\xfe\xf3\x7b\x0e\x8d\xb4\x0f\xf7\x9f\xf9\x1c\x3c\xca\x37\x1c\x6c\xc7\x42\xf6\x23\x7d\x35\x4a\xcf\xf0\xfc\x9a\x6e\xc5\x79\x8d\x47\x19\xc1\x45\xb7\xb6\x38\x01\xac\x6b\x1c\xa2\x99\xbd\x72\xe9\xf6\x88\xda\xaf\x6f\x5c\xc1\x5f\x6d\xbe\x9c\x15\x20\x62\x9d\x5b\x54\x94\x96\x7a\xc2\x72\x33\x7c\x72\x24\x84\x1b\x07\x90\xc9\xff\xd8\xc3\x0b\x32\x7b\x9f\x5a\xc9\x8f\x5d\xd6\x28\x9a\x5e\x7d\x5b\x7d\x27\x24\x9e\x5a\xf3\x17\x5b\x9d\x8d\xbb\x69\xfd\x99\xfe\x9f\x47\x45\xff\xcd\x4d\x7c\x40\x97\x51\x26\x80\xe5\x28\xba\x68\xe8\xf5\x5e\x2c\x57\xf1\x88\x14\x54\x3c\xc1\x72\x16\x65\x4d\x68\xc3\x81\xe5\x2e\x2a\x9e\xa0\x56\x61\x8f\x5e\x76\xb6\x2b\xfa\x0e\xec\xe9\xcb\x36\xa2\x00\xdd\xe0\x58\x03\x18\x3c\x62\xfc\x7f\x4d\x0d\xd6\x20\x06\x28\x92\x11\xc9\xfd\xfd\xb9\xf2\x27\xf0\x76\x3a\x6d\x48\xf9\xe8\xf1\x10\x4d\xbe\x1a\xff\x34\xfb\x04\x43\xe5\x93\x2c\x16\x4e\xa1\x55\x7a\x37\x7d\xc1\x61\x71\xe5\xe7\xe7\x1f\x5d\x05\x48\x20\x9c\x2a\x5d\xb5\xa4\x34\x83\x4a\x45\x1f\x65\x3b\x87\x11\xf1\x04\x78\xd3\x9f\x63\x2a\x39\x69\x53\xdf\x74\xe9\x63\x8c\xe9\xa4\x93\xf3\xd9\xe8\xad\x8a\x02\xb3\xe3\x2b\x15\xc6\xc3\x9e\x63\x76\xea\x07\x2a\xc6\x7d\xa6\xae\x16\xd0\x8f\xf7\x3b\x4d\xf9\x86\xb0\x2e\x10\x13\xdb\xb5\xfd\xa2\x22\xfa\x83\x03\x48\x27\xac\x83\xbc\xf6\xa8\x20\xef\x53\xad\xb7\xd5\xe5\xe5\x0c\x39\x7e\x88\x7a\x96\xc5\xe1\xe1\xf0\x25\x62\x87\xf3\x9c\xf5\x4f\x47\x15\x49\x07\xa8\x45\xff\xd5\xea\xed\xf8\x3c\x41\x77\x06\x96\xe1\x78\x44\x20\x9a\x96\xb0\x4c\x47\x2b\x28\xca\x43\xb1\x8c\xc7\x23\x3a\x51\x72\x85\x3d\x0d\xdb\x61\xc7\x68\x0a\xc7\x1e\x88\x6d\x23\x16\x50\x3f\x30\x67\x62\x3b\x88\x75\x94\xeb\x62\x4f\xc5\x76\x62\x85\x72\x07\xac\xc1\x18\xea\x39\xd5\x52\xc3\x4e\x7a\xc5\x1a\x90\x01\x45\x39\x7e\xa2\xbf\xb7\xe4\x7d\xe0\xc1\xae\xf8\x4d\x93\x3f\x1f\x03\x0d\x26\xc9\x04\x52\xef\xda\xda\xa5\xde\x6c\xbd\xae\x2a\xfe\xfe\x28\x53\x78\x4a\xbd\x75\x8e\xfb\x03\x9f\x61\x80\xc4\xc0\x82\xce\xfe\x18\x69\xb9\x41\xdf\xd6\x40\x39\x0a\x73\x45\x59\x85\x9e\xce\x9c\xf5\x23\x7d\xdc\x95\x5e\x92\x1f\x5b\x66\x8e\x2e\x79\x26\xb9\xe1\x00\xe2\x0b\xeb\x7c\x96\x0d\x51\x9d\x29\xe4\x5f\x84\xa2\x78\x7a\xf5\x54\x26\x64\x1d\x85\x37\x1c\xf6\x91\x48\x1d\x28\x3c\x2f\x93\xf4\xf5\x04\x55\xe8\xc1\xad\xdc\x01\x67\xcb\x14\x75\xbd\xca\xea\x98\xac\xa7\x26\xef\x5f\x9e\x28\x5d\x7f\x6d\x65\x74\xe4\xad\x4c\x73\x37\xf1\x1d\xae\x01\x3b\x27\x7d\xda\x8a\x76\x1c\x40\x3c\xe1\xe3\xc6\xb4\xff\x8e\x86\x7f\xbd\xab\x46\xde\x21\xee\x3f\x17\x3d\x2e\x38\x9e\xf2\xf6\x31\xbf\xf3\x7c\x62\xb8\x31\x56\xf4\x50\x2f\x73\xf6\x49\x1c\x40\x56\x60\x51\x40\x91\x40\xe9\xcf\x43\x3e\x06\x5a\xc5\xdb\xb7\x69\x2a\x5c\x98\xe8\xc5\xb5\x62\xc4\xf2\x70\x16\xac\x7c\x9d\xb7\xd6\xd8\x67\x7b\xed\x45\xff\x35\x2a\x3b\xb3\x04\x94\xa4\x63\x05\x06\xcd\x94\xa8\x60\x84\x15\x1a\x3c\xc2\x17\xd5\x12\xb1\x82\x83\xbe\x03\xcd\xad\x58\xe1\x41\x45\x63\xf4\x5c\x63\x05\x08\x8f\x58\x41\xfb\x4b\xec\x49\xeb\x36\x22\x0a\x25\x0f\xd8\xc3\xd6\x6d\xc4\x04\xea\x39\xd6\xbc\x15\x8f\x98\xa7\x40\xff\x69\x04\x6b\xee\x0a\x14\x89\x08\xb7\xbf\x70\x9e\x04\xcb\x15\xf2\xdc\x13\x4a\x17\x5f\x72\xdc\x4e\xa3\x6b\x8d\x5b\x1b\xcb\x02\x1b\xb5\x51\x4a\x74\xe3\x23\x47\x5f\xca\xd0\x1a\x3f\x98\x52\x4a\xc2\x01\x64\x08\xe6\xa2\x8f\x8b\x19\xb8\xef\x7f\x3b\xfd\x81\x41\x30\x7c\xec\x6b\x54\xc4\x9c\x6e\xf3\xa0\x6d\xde\x6e\x89\xa2\x1c\xb6\x45\xaf\x4d\x77\x87\x93\x9e\x00\x89\x84\x13\xbe\x8f\x62\xf2\xe9\xcf\x41\x8b\x97\x22\x75\xf4\x2a\x0c\xe4\x3f\xba\x88\x5b\xcb\x37\x3d\xcf\x21\xb4\x92\xda\x0b\xac\xe9\xcb\xd7\x6f\x00\xa4\x19\xce\xf7\xce\x52\xea\xc2\xbc\x61\x2e\x69\x4d\xa6\x77\x97\x73\x49\x4f\x7f\xa9\xac\xf7\x3b\x1c\xbd\xa1\xbf\x34\x7a\xd5\x8e\xa7\xde\xc0\x58\x1c\x20\xad\xff\xf9\x4d\xf7\x30\x3f\xc7\x2e\x01\x27\x15\x7b\x92\xf5\xb4\x7d\xa4\xd6\x3d\x74\x0b\xe3\xef\x73\xc1\xfb\x07\x36\x83\xe5\x4b\x1e\xea\x24\xe1\x5b\x29\x03\xee\x1c\xbe\x2c\xf9\x52\x4e\xf1\x0d\xea\x25\x3e\xea\xb4\x04\x02\x05\x34\xb6\x52\x32\xa5\x99\x33\xbb\x14\x44\x19\x1b\x73\x73\x7e\x2a\xe2\x7f\xa6\x14\x2b\x28\x28\x6b\x45\xa5\x10\xac\xb0\xe0\x11\x43\xe8\xa6\xc0\x0e\xcc\x36\x22\x12\x4d\xc4\xd8\xb1\xd9\x46\x34\xa3\x05\x05\x2b\x3c\xe8\xdc\x12\x3d\xa4\x58\x01\x42\x13\x31\x5a\x50\x30\xe7\xf7\x3b\x88\x04\x74\x4e\x83\x3d\xc1\xdf\x51\x14\x51\xea\x87\x35\xc4\xc7\x23\x7e\x31\xa0\x9f\x1d\xc5\x1a\xe6\x03\x05\x0d\xa2\xbf\x1a\xad\x37\x4c\xbe\x1f\x29\x22\x81\xc5\x7f\x4e\x27\x9d\x8a\x09\x09\x29\xe2\x0d\xe7\xfd\x99\x4c\xfd\x6e\xed\xc6\x69\xfd\x5f\x6a\x49\xee\x46\x3c\xc9\x5b\x64\x3d\x0a\x4e\xaf\x15\xd4\xab\x32\x13\x25\xf6\xe4\x49\xb5\x16\x77\x17\xb9\xd2\x39\xed\xcf\x5d\x39\xb8\x3b\xd5\x3a\x73\x54\x9e\xd5\x35\x59\x78\xed\x0e\x0e\x20\xab\xf0\xe9\xb9\xc4\x6c\x12\xff\x3c\xe0\xe1\x13\x02\xf7\xb4\xdf\x36\x6e\x0b\x3c\x1e\x4d\x36\x5f\x68\x53\x65\x7f\x84\xfa\x7e\x3f\x69\x36\xe0\x64\x07\x80\xbc\x08\xf4\x78\x97\x5a\xd7\x29\x50\x21\x67\xcf\xf7\xcb\xc6\x22\x74\x2c\x56\x51\x9e\x51\xac\xfd\xec\xb7\xa0\x66\xb5\xc7\xe9\x6d\x5f\x19\x84\xcd\x01\x12\x00\x17\x87\x56\xaf\x0b\x5a\x47\x93\x0d\xed\x0f\x77\xb2\x55\xa5\x49\xde\x5b\x17\x13\x2a\x38\xeb\x4e\x75\x58\xaa\xaa\xf1\x48\xdc\x0d\xde\x48\x69\xd1\x7f\x73\x12\x15\x03\xd0\xf8\x63\xb9\x89\xa6\x3c\x34\x49\x62\x3a\xba\x83\x58\x45\x7f\x50\x00\xdb\xd7\x6d\xf1\x4a\x04\xff\x0a\x2c\x6f\xf1\xaf\x08\x20\x5c\x8a\xd9\xf9\xac\x9f\xe0\xc8\xfe\xeb\x09\x44\x4b\x37\xf3\x7b\xeb\x2e\x97\x5f\xe7\x72\xd5\xd3\x4d\xdf\xfb\xcb\x82\x31\x85\xaf\xfe\x45\xf0\x7e\x62\xbd\x60\xa0\xb8\xf9\x71\x73\x33\x82\x13\x00\xa4\x14\x96\xca\xf9\x54\xda\xaf\x27\xe3\x58\x8f\x99\x90\x5e\xce\xd5\xf0\x63\xd0\xb0\x39\x79\xe4\xfb\xeb\x98\xd3\x96\x04\x29\x0c\xfe\x42\xda\xab\xbf\x01\xf2\x1d\x5e\xe5\xd7\x36\xea\xc6\xcf\xe7\x72\xa4\xbc\x55\x0b\x15\x1a\x6e\xdd\xbb\x3c\x57\xfe\x6c\x20\xa9\x8a\x46\xed\xe6\xac\x4c\x56\x01\xcb\x25\x04\x07\x90\x6f\x30\x09\xd0\x8e\xe9\x98\xf8\x90\xd7\xfc\x43\x8c\x23\xeb\x34\x07\x97\x84\xaa\x89\x0a\xc7\x14\x2e\xeb\x98\x23\x20\xa2\x9b\x4d\xd3\x95\x75\x07\x00\x09\x80\x65\xa5\xaa\xa0\xb1\x8c\x7e\x4d\x95\x07\x65\x35\x0f\xed\x9e\x31\x9f\x39\x1c\xd6\xaf\x39\x22\x75\xca\x92\xf8\x53\x39\x87\xef\xef\x43\x7b\x19\x00\xb2\x0a\xcb\x01\x79\xcc\xe1\x47\xb4\x52\x7c\x4e\x13\x5f\xbb\x5b\x77\x96\xd3\xaa\xf8\x77\x8e\x5f\x72\xf1\xe1\x0a\xa1\x8b\xf5\xcf\x05\x17\x13\x14\xe1\x0f\x86\xe9\xc5\xe5\xb0\xef\xaa\xff\x33\x12\x68\x3c\x6d\x29\x9a\x56\x1b\xd7\xd3\xcd\x3c\x3d\xb1\x50\xeb\x3f\x74\xba\xd8\x3b\x6f\x45\x68\x00\xbe\x84\xfd\xe3\xa5\x98\x86\xef\xb5\x34\x43\x8d\xeb\x8d\x43\x97\xce\x59\xe7\x7e\xd1\x17\x7e\xa2\x2b\xc4\xe4\xe7\x5b\x58\x54\x3a\x34\xa6\x0b\x00\x92\x09\x13\xaf\xfb\x77\xa9\xe6\x64\x54\x72\x9d\x96\xef\xfd\xe4\x99\x95\xfe\x2a\x98\x76\xf5\x08\x49\x9f\x61\x66\xaa\x3b\xcd\x3b\x7b\x2e\xc1\x50\x49\x80\x2c\xc2\x31\xc9\x9f\xff\xb5\x3b\x06\xe4\x2f\x52\x4f\x5c\xb3\x56\xa6\x2e\xe4\x9e\x4b\x24\xf0\x8d\x66\x01\x56\x9d\x2a\x4a\x17\x4d\x2e\xf5\x4f\x00\x80\x78\xc0\xd3\x95\x93\xbc\x47\xc9\x6a\x35\xc6\xa5\x15\x98\x7e\x2c\x9f\xdd\x94\xfd\xde\xe6\xda\xc5\xc1\xf1\x42\x99\x9f\xe9\xa7\xe7\xa3\xfd\x6e\xef\x07\x01\x92\x00\x4b\x42\x47\xdf\x04\xac\xde\xfd\x3d\x28\x97\xf7\x78\x9f\x6e\xf9\xb2\xc4\x2b\x5e\x87\x5d\x07\x4f\x33\xcc\xe2\xde\xf4\xea\xcf\x1e\x5e\x11\x61\x87\x1e\xfd\x73\xfc\xee\x54\xd9\xf3\xe5\x20\x77\x75\xc9\xb6\x9a\xc9\x3f\x1f\x05\x52\xca\x9f\xff\x6c\x69\xba\x7e\x92\x81\xa8\x34\xdf\xe2\x9c\x00\xf4\x28\x7f\x51\x22\xaf\x17\xd1\x23\x10\x40\xaa\xba\x12\x70\xb0\xe0\xb3\xb9\x9f\xdd\x52\x9d\x82\x4a\xbf\x65\x67\xe0\x12\xcb\x5e\xd7\x0e\x1c\x40\x5e\xc2\x31\x99\xa4\xb6\xd0\x2b\xca\x3c\x65\xba\x7b\xb8\xab\xec\xc6\x83\xab\x8e\xe4\x77\x14\xac\x6b\x5f\xa8\xcd\x9a\xb6\x18\xa4\x89\xd9\xc8\xb1\xe3\x80\xfc\x69\xe8\x71\x8f\xa9\x52\x81\xec\xb7\xa3\x72\x9b\x3a\xa4\xaf\x74\x08\xc8\x57\x7f\x80\x96\x04\xdd\x0b\xe7\x02\x0f\x18\xb8\x75\xc5\x47\x2b\xcd\x7a\x02\x79\x4b\x98\x2b\x2a\x88\xf8\x9c\xdb\xa5\xa4\x7f\x4d\x5b\x96\xca\x7e\xf5\x84\xc3\x4d\xa3\x9b\x85\xf9\x97\xd5\x28\x78\x33\x47\x34\x13\x48\xbb\xc6\x01\xd2\x09\xdf\x7d\x9b\xc5\x9d\x9c\x1a\x3c\x7c\x53\xd6\xd2\x9b\x8b\xed\x95\xfb\xb5\x81\x95\x2f\x97\xa4\xd9\xe4\xda\xbc\xe5\x3a\xda\xb9\x87\x56\x76\xad\x00\x64\x1a\x26\x0e\xa4\x8d\x11\xca\x67\x6c\x1f\x73\x05\x6c\xe8\x58\xdf\x0f\x36\x4d\x26\x90\xdd\x1f\xbd\x2f\x36\x7c\xb9\x85\x92\x2e\xd7\x4d\x19\xa9\x02\x00\x79\x07\x8b\x5e\x73\x53\xe6\xbc\xcd\x42\x34\xe5\x51\xad\x61\x62\xc5\x05\x2c\x55\x3d\xec\x2c\x93\xde\x03\xc6\x57\x33\xfa\xe7\x63\xac\x5d\x26\x26\x00\x32\x02\xaf\x67\xbd\xcc\xc2\x82\x91\x40\xad\xcd\xca\x72\xd3\x25\xe1\xce\xfb\x8f\x7a\x86\xcd\xba\x82\x82\x04\x68\xd6\xca\x44\x95\x2e\x15\xf0\xe4\x43\x8f\x3e\x2b\xaa\x29\x7f\x54\x12\x18\xb3\x30\xc9\x23\x51\xf9\x56\xf4\xb1\xd5\xad\xf3\x7d\x8b\x33\x21\x61\x56\xa2\x3c\x79\x96\x17\x8b\x35\x00\x40\x9a\x61\x79\x8f\x5d\xbd\x5c\xdd\xc5\x8e\xcf\x89\x33\x42\x73\x34\x5d\xd0\x9b\x76\xee\x79\x79\xf5\xc4\x4d\xc3\x68\xa1\x4f\x9f\x71\xfb\x3a\x34\x9f\x03\x64\x00\xb6\x84\xf2\xc3\x89\xa1\xe9\x6e\x76\xf6\xf5\x29\x2d\x87\xd3\x9d\x8e\x2c\x64\x12\xdf\x1d\xe9\xba\x98\x26\x26\x4f\x8a\x89\xe5\x8f\xdf\x39\x0b\x3d\xba\x77\xc6\x0b\xf9\x3c\x5a\x42\xd0\xdf\x6f\x60\xa3\x31\x99\xf8\x3c\x58\xe1\x85\xce\xd1\x0d\x62\xcf\x2e\x81\x5f\x76\x6c\xf7\xf6\x9c\xde\xda\xb4\xf0\x2e\xf4\xb9\x7b\xf0\xc0\x50\x86\xe3\xad\x0a\x37\x5d\x31\xd6\xd7\x8f\xbc\xd3\xb4\x9f\x4b\x51\x98\x65\x18\xff\x19\x4b\x08\x3c\x37\x2b\x49\x09\x90\x34\xf8\xdc\x1b\x8b\xef\xab\x49\x39\x77\x99\xbe\xa8\x6a\x26\xe7\x63\x2d\xf5\xb5\xd4\xe7\x6e\x32\xd9\x07\x95\x65\xd4\x6c\x24\x18\xf7\xb4\x91\xec\xc6\x01\x64\x00\xae\x4e\x9c\xeb\xb3\x01\x82\xc0\xe8\xa6\x4c\x9d\xda\x03\x85\x08\xbe\xe1\x9f\x14\x27\x4d\xd2\x67\xdb\x6d\x8e\xdc\x4d\x71\x39\x58\xec\x5d\x0b\x3d\x1a\xfb\xe4\xde\xdb\x6f\xdc\xb3\x46\x2c\xcb\x71\x84\x1e\x13\x5d\x44\x2f\x92\x97\x2b\x19\x94\x49\x4c\x59\x5b\x99\xe9\x2d\x96\xe4\x9f\x78\x02\xc4\x0b\x5e\x7d\x8d\x80\x03\x92\x32\x23\x67\x89\x6e\x15\xb1\x3e\xcc\x25\x7b\x17\x39\x7a\x3d\x69\x22\x9c\x2c\x5e\xda\xb7\x66\xc0\xb4\x96\xb0\xf1\x07\x40\xd2\xe0\x90\xdb\x3b\x11\x31\x7b\xfe\x7a\x2e\x41\x16\xc3\x2f\x39\x6b\xc5\xaa\x3a\xbe\x61\xb9\xe4\xfd\x65\x4e\xe3\x4b\xf9\xd0\xbe\xee\x1a\x53\x02\x80\x74\xc2\x5d\xd4\xfc\x6b\xd7\xf3\x93\x43\x5e\xba\x6f\xb3\x3f\x4e\x67\x38\x3b\xaa\x1a\x3e\x90\xd5\xf5\x57\x8a\xbe\xf6\x22\xed\xae\xee\x9e\x18\x16\x5b\x00\x10\x4f\xb8\x6c\xbb\x96\x16\x5f\x7d\x65\xe8\x90\x48\x24\xf1\x5e\xfa\x48\xc2\xe9\x50\x6e\xc6\x74\x90\xc0\x50\xa2\xc7\x24\xe6\xd0\xa8\xe6\x51\xac\x0d\x90\x55\xf8\xf1\x9f\x16\x95\x75\xae\xc2\x9c\x86\x24\x89\xa3\x92\xf2\x0b\xe1\x4e\xf4\x46\x79\x2a\xe7\xe9\xdf\x06\x85\x14\x28\x46\x4b\x95\x4c\xc3\x5f\xa7\xbf\x62\xe2\xc8\x45\x23\xb4\xcb\x5e\xe0\x5c\x77\xbb\x91\x88\xe1\x53\x21\xfb\x3f\x01\x86\x09\x74\x85\xca\x35\x3e\x93\xfe\x96\xc7\xec\x3c\x81\xbc\x35\x9c\xe4\xaa\x2c\x8c\x13\x10\x95\xfc\xb6\x80\x60\x22\x46\xcf\x09\x1f\x05\xf0\xbc\x29\xb0\x43\xf4\x89\xf8\xfd\x83\xb7\xe4\x83\x0c\x47\x01\x12\x01\x27\xb9\x33\x0c\xb8\x14\x36\x1d\x76\x4a\x8f\xa7\x9f\x0d\xe2\x8c\x7e\x25\xca\x97\x89\x2d\xb5\xb5\x3f\xd1\xf7\x71\x12\x3e\x94\x77\xbc\xf4\x0d\x40\x52\xe0\x28\x1e\xca\x68\xbb\xfc\xc2\xef\x81\x56\x52\xc5\x3c\x5d\x96\xe6\x89\x4e\xde\x23\x03\x37\x68\xcf\x47\x44\x44\x1d\x13\xe1\xd0\x92\x91\xbb\x05\x13\x8d\xe4\x9f\x7c\xe9\x2d\xf5\xcd\xde\x76\x91\x8d\xec\xbb\x0f\x73\x1a\x7f\xac\xde\x77\x57\xbf\x7d\xf0\xc4\xb3\xb8\xdd\x1a\xcc\xab\xf6\xd0\xa3\x89\x1c\x87\x7b\xf9\x7e\xbd\xd3\xfb\xa0\x1f\x5d\x65\x92\x4b\x49\xd4\xa2\xfd\x65\x84\x44\x3e\xc8\xba\xd2\x23\x48\xe7\xf2\x8d\x66\x26\x00\x90\x31\xb8\x18\xea\x7a\x92\x5e\xfa\xa2\xcc\x7c\x9e\x87\x90\x27\x5f\xa1\x31\xf9\xd3\x3d\xf9\xd2\x61\xdf\x54\x62\xd9\x92\xe7\x63\xaf\xc4\xd5\x04\x66\x01\xb2\x0e\x33\xfa\xab\xeb\xaa\x02\x8d\x63\x14\x25\x53\x7f\x2a\x2e\xd8\x73\x91\x49\x7e\x99\xa4\xb2\x90\x1f\x39\x26\x85\xac\x52\x5f\x4e\x5e\xb3\x47\x3c\x01\xe2\x01\x17\xcf\xfd\xc2\xa7\x39\xe2\x5e\x9f\xa5\xba\xf2\x6d\xd1\xfd\xfc\xe8\x01\x6d\x7e\xda\x9b\x1f\xc4\x0f\xda\x0a\x38\x1c\xab\xeb\x13\x63\x88\xc9\x05\x88\x3f\xfc\x38\xf3\xa5\x5b\xdc\x0c\x89\x4e\x25\x0a\xac\x34\xfe\xf2\x94\xb1\xe2\x05\xbe\x4f\x44\x63\xed\xe5\xd8\x66\xef\x37\x8b\x4d\xe6\x06\x8d\x00\x24\x06\x3e\x42\x1d\x0a\xc5\xaf\xdb\xf7\xdd\xfb\x54\x71\xf9\x75\x7b\xb9\xda\x21\xcd\x39\x62\xfe\x95\xdd\xdd\x0b\x36\x67\x0e\x1e\xca\x8c\xff\x4d\x57\xb9\x55\x9a\x61\x67\x89\x4b\x2e\x6e\x7c\x24\x75\x71\xa3\x2b\x4c\xe5\x7e\x23\x4b\x2e\x9a\xf7\xcd\xe9\x77\x8b\xde\x6c\x6a\x5f\x42\x43\x69\xa6\x89\xf5\x5b\x4f\x20\x0f\xf7\x17\x66\x55\x17\x4e\x97\xab\xea\xe8\xf9\x84\x9c\x36\x1f\x4b\x1d\xc8\x78\xb0\x36\x75\xfe\x9d\x68\x64\xdc\xf5\xf4\x3c\xf5\xbb\x1a\xcf\xc7\x00\x52\x0e\x57\xe6\x62\xe2\xd6\xab\xe2\x7b\x0c\x05\xeb\xb3\x3e\x2d\x72\xcd\xaf\x46\x1c\xe5\x74\xb6\xfe\x99\x72\xc9\x84\x5c\x37\x39\xbc\x45\x27\xf6\x13\x40\xd6\xe1\x63\xb1\x92\x6e\x29\x25\x77\xf3\x89\x61\xd0\x01\x9a\x7d\x06\x5f\x2e\xf7\xbe\xd9\xff\x48\xf2\xc6\x15\x92\x2e\xe2\x73\x52\x73\xd4\x84\x25\xf0\x5d\x56\xf9\x21\x57\x36\xb6\xbc\x85\x39\x9b\x1e\xd9\x8c\x7a\xc7\x9c\x27\x13\xf1\x93\x9f\xe3\x0b\x65\x0a\xa4\x2f\xb1\x8f\xbf\xac\x7f\xf8\xc0\x13\x20\xcf\x60\x3f\xa3\x46\x40\x51\x63\x4e\xc2\xb7\x6f\xab\xcb\x24\x02\x62\x24\x2a\xda\xf1\xaa\x7e\x26\xf2\x84\xea\xa3\xea\xa7\xad\x39\x99\xb3\x1f\x02\x24\x12\xae\x15\xac\xaa\xf5\x6a\x51\x0e\x7f\x3c\xac\x1c\xf7\x11\x5d\x7a\xb3\x19\x3c\x53\xf2\xca\x7c\xf8\x76\x13\x45\x19\x13\x13\xf5\x35\x17\x4d\x6e\x80\x4c\xc0\x8b\x74\x60\xc3\x3c\xaa\xa7\x49\xb6\x53\x98\xea\x11\x8b\xc3\xc9\xdc\x8d\x33\x94\xb4\x87\xfc\x89\x0f\x31\x79\x68\x06\x81\x07\x01\xc6\x87\x45\xff\x95\x66\xd1\x6c\xdf\x1d\x44\x5b\x09\x2c\xa6\x85\x47\x7c\x47\xdb\x2e\x4c\xae\xb5\x83\xf8\x86\x6a\x0a\xd8\x6c\x6b\x1b\x11\x80\xaa\x59\x58\x84\x0b\x8f\x58\xa5\x41\xef\x40\x62\x11\x2f\xa0\xe0\xe1\xe1\xbb\xd5\xae\xa4\xc3\xab\x16\x3a\x9d\x7b\xa8\x21\x6b\x40\x7a\x9e\xa0\x8d\xd5\x74\x82\x7d\x40\xe5\x09\xd1\x5e\x4d\xa2\x4d\xba\xcc\xcd\x4d\x99\x8c\x77\x0f\xf6\xe1\x00\x32\x0c\x67\xed\xe4\x5c\xc3\x47\xb2\x87\x19\x4e\x1c\xe1\xa2\x2a\xb8\x34\x25\xb9\xc4\x71\xf8\x58\x67\xf8\x1d\xe9\x0d\xef\xcf\xeb\x56\x3f\x2b\xb2\xe2\x70\x00\x69\xfa\xcf\xd9\x4d\x2c\x34\x76\x26\xd4\x8e\x6a\x30\x92\x29\x5f\xb1\xfb\x13\xa7\xde\x39\x1d\xf7\xe0\xfa\x9b\xea\x2b\x3f\x46\x3b\x13\xbf\x73\x2d\x00\x80\x7c\x86\xff\xbe\xaf\x6c\xcd\x7e\xa2\x11\xe9\xaa\xc6\x47\xe9\x75\x87\x14\xd5\x1e\x8e\x7f\x2a\x1c\x50\xd4\xad\xfc\x10\x7c\xeb\xa7\x74\x9b\x19\xef\x43\x80\xfc\x81\xc5\xda\x71\x73\xf1\x0f\x8e\xc2\x9b\xd7\xef\x09\xf8\x4c\x5c\xa3\x5c\x6f\xbc\x58\xd4\x33\x22\xfa\x8e\x3d\xef\xec\x6d\x72\x7f\xeb\x23\x24\xa5\xff\xc7\xd8\x75\xc7\x63\xf5\xbe\x7f\x33\x64\xcb\x2c\x15\xa1\x24\xca\x53\x29\xa3\xc1\xa1\x14\x95\x5d\x56\x25\xa5\x94\xb2\x29\xc9\x78\x6e\x7b\x64\xef\xbd\xf7\xde\x3b\xb2\x93\x15\x22\x9b\xac\x10\xa1\xec\xf8\xbd\x7c\x75\x4e\xe7\xf3\xcf\xef\xf4\xff\x79\x3f\xe7\xba\xae\x73\xdf\xd7\x75\xbd\xdf\xd7\xfd\x9c\x83\xfb\x37\x2f\xe1\x70\xa6\xff\x7d\xe5\x1a\x86\x9f\x30\xe2\x2b\xc2\xdf\x31\x3d\xfd\x83\x68\x41\xb8\x35\xb6\xaf\xbb\x88\x3e\xe4\x1e\x58\xee\xc2\x88\x55\x1a\x64\xae\x8d\xd9\x64\x4b\xd1\x93\x10\xfc\x8f\xc6\x2e\xa0\x9f\x5b\x90\x8f\x8a\x32\xdf\xf9\xcf\x14\x86\xe5\x94\xaa\x5a\x7c\xe7\x82\x81\xeb\x95\x93\xd9\xee\xf4\xdf\xcc\xdf\xa4\x9d\x21\x77\x6a\xbb\x85\x07\xd0\x36\xba\x20\x0e\xea\x0c\xbd\xb7\xa6\xbc\x3d\x46\xde\x7a\x4f\xa4\x9c\xd2\xc7\x5b\x5a\xb2\xba\xcb\x88\x3f\x7a\xa5\x98\x89\xe8\x89\x82\xea\x82\xcc\x0e\xe1\x47\xcb\x2e\xdc\xb6\x72\x8c\x5e\x56\xa6\x7b\x54\xf6\xab\x10\x86\x15\xbd\xcd\x20\x76\x89\xa2\xe5\x6c\xe4\x55\xad\x4b\x4d\xd1\x71\xdd\x1a\x7e\x8c\x07\xd0\x04\xba\xf7\xcb\x9e\x88\x7e\x3b\x36\x7c\x2f\x50\xbc\xf7\xce\xad\xd7\xd5\x2a\x56\xc6\xfd\x47\x44\x39\x73\xd4\x2a\x8a\xf6\x28\xc9\x54\x10\x36\xc0\xa7\x0d\xb1\xcc\x86\x03\xb4\x80\x3c\x04\x2c\xc3\x61\xc4\x36\x42\x65\xb1\x4c\x87\x11\x5d\x88\x24\x82\x65\x3c\x8c\x98\x40\xa6\x2f\xd8\x54\x67\x17\x91\x89\xa8\xa9\x98\x6c\xe7\x0f\xe2\x17\x92\x95\xb0\xf9\xce\x2e\xc2\x16\x39\x96\x85\x45\x79\x60\x44\x3c\x2d\xb2\xfc\xb0\xa8\x0f\x90\xb2\x25\x20\x50\xdd\x59\x7e\xf5\xe8\x2a\xb8\x8f\xc6\xb2\x40\xcf\x50\xb4\xd6\xeb\x7d\x48\x94\xa0\xfc\x6c\xbe\xd3\xa7\xda\xc8\x28\x9a\x6a\xa2\x86\x2f\x53\x10\x35\xa9\x1f\x33\x1e\x40\x85\xe8\x0e\xfb\xe0\x7b\x91\xbc\x8d\x1b\xa0\xe2\xc8\x92\x09\xa9\xd8\xdc\xaf\x72\x66\x89\x20\x01\x26\xe9\xb9\xc4\x90\xdb\x27\x5e\x3f\x2a\x1f\x72\xd8\x49\xf9\xe8\x22\x9e\xa7\xf0\x9a\xe5\xbb\xaa\x9f\xe7\xd3\xb6\xbe\x00\x06\xa7\x27\x12\x52\x83\xa9\xab\x3c\xc7\x3f\x1d\x3d\x4e\x58\x4b\x52\x26\xd8\xc5\x85\x07\xd0\x16\x7a\xf9\x3d\x30\xf6\x50\x3e\x7f\xb6\xc4\xd6\xe4\x7a\x40\x9d\x65\x76\x50\xb6\x0c\x4b\x33\x93\x1f\x89\xdf\xf4\xc4\x71\x42\x3a\x9b\x40\x1d\x56\xdc\xbf\x99\x0d\x07\xa8\xfe\xef\x57\x53\x31\x0c\x87\x11\x85\xc8\x43\xc0\x32\x1d\x29\x71\x48\x31\xc1\x32\x1e\x46\x6c\x31\x21\xa3\x3c\x2c\x1a\x0a\xa4\x28\xe8\x08\x38\xec\xf1\x40\xc2\x06\x15\x25\xa3\x93\x6a\x36\x3d\x0a\xd5\x5f\x13\x8c\x3f\x8c\xd9\xdc\xec\x4f\xc9\xfe\x7d\xbd\xc6\xe5\xb3\x4c\xa3\xf2\xa9\xa4\x9b\x97\xc6\x95\x77\x36\x75\x11\x3a\xc9\x48\x32\xa5\xd2\x59\x7e\x29\x18\xff\xf5\x3a\x9f\x3d\xc6\x8c\x86\x56\x33\xef\x2a\x83\xc5\xf2\xa8\xfb\x61\xa6\x9b\xef\x36\xfc\xbe\xba\xe0\x01\xf4\x0d\xdd\xec\x9c\x69\xe3\x6f\xbf\x96\xb3\x57\x8a\x65\xea\xc1\xab\x4b\x77\xf5\xda\x2b\x9c\x3b\x5c\x25\xb4\xea\xb7\x95\x8f\xde\x99\xbd\xfe\x84\x8e\x1f\x0f\xa0\x2a\x74\xb7\x7b\x65\x35\x6e\xf4\x75\xe0\xf3\x8e\xaf\x85\x15\x0f\x3f\x27\x97\xd6\x6c\xf2\x8f\xcc\xf3\x1e\xfd\xcc\xe6\xa2\x47\xed\xc0\x1b\xfa\xd8\x59\xf0\xdf\xcc\xfe\x13\x1f\x09\x1b\x38\xa0\x58\x76\xc3\x01\x2d\x42\xb2\x0c\x96\xe5\x30\xe2\x1b\x72\xde\x06\xcb\x76\x18\x51\x85\x1c\x7b\xc0\x92\x02\x60\x44\x14\xf2\x87\x11\x2c\x35\x00\x76\xfc\x12\x0c\xc0\xd6\x03\x76\x01\x2f\x60\x9b\xb0\x15\x81\x3f\xb9\x12\x99\xfc\x61\x8a\x02\x7f\x10\x73\x48\x51\xc4\x96\x05\x76\x11\xb9\x48\x76\xc5\x52\x06\x60\xc4\xf8\xdf\xcf\x08\x63\x2a\x04\x52\x1c\x04\x74\xf8\x9d\x3c\x36\x84\x5e\x81\x8e\x7b\x18\xdc\x42\x43\xe3\xc3\xef\xdc\x4c\xd1\xec\x0f\xfb\xec\x37\x0d\x69\x10\xfd\x98\xed\x34\xf8\x52\x76\xdd\x67\xb4\x3a\x8d\x03\x0f\xa0\x3a\xf4\x8e\xf0\xd2\xee\xb9\x70\xfd\x58\xdd\x64\x20\x8b\x35\xe1\xf9\x96\x56\xca\x8f\x6e\x14\xc6\x1d\x54\xc1\x84\x5f\x7c\xda\xce\xb3\x86\xd4\x0b\x00\x00\x95\xa3\xfb\x79\xfd\xb3\x7d\x53\xb3\x8f\xaa\xa9\x3d\x08\x88\x2d\x2f\x37\x35\xb2\x66\x5d\x9a\x59\x95\xa7\x77\xa5\x0f\xaf\xc2\xf7\x84\x7b\x92\x06\x03\x68\x19\x5d\xa5\x67\x7a\x67\x39\x6f\x0e\x3b\xdc\x97\x80\xf0\x0c\x07\x36\x1b\xa4\x4f\xde\x70\x23\x49\x6c\xa6\x8f\x37\x91\x67\xce\x67\xbe\x34\x20\x8f\x07\x50\x33\x9a\xfe\x0f\x8d\x2a\x18\x9d\xb5\x76\x4a\x5a\x69\x7c\xe5\x9a\xae\x2d\x75\xc8\x41\x39\x96\x26\x22\xab\xc7\x23\xe8\x0d\xf9\xe0\x58\x00\xe0\xc4\xfd\x9b\x97\x70\x3c\x87\x90\xb5\x8a\xe9\xe7\x1f\x44\x1d\xb2\x83\xb0\x3d\xdd\x45\x94\x23\x13\x30\x2c\x67\x61\xc4\x32\x52\xd9\xb1\xdc\x85\x11\xcd\x88\x48\x8d\x2d\x04\xed\x22\x5a\x11\xcf\xb1\xb4\x20\x18\x31\xf0\xf7\xcb\xc3\x98\x9a\x90\xa4\x2d\xb9\xfc\xce\xd2\x9b\x44\x2b\x43\xd1\x27\x2d\xf3\x2b\xf8\x07\xd8\x78\x7e\xa8\x8f\x8d\xe8\xe9\x7a\xea\xe2\x7a\x46\x74\x07\xf6\xaf\xc9\x04\x79\xa7\x6d\x07\x9c\xcf\xc3\x03\x28\x04\x5d\x12\x97\x9f\x40\xb4\xfc\x32\xe3\xf2\x82\x9b\x3f\x62\xe7\x5c\x18\x48\xc0\x01\x9d\xd4\xb7\xab\x6a\xac\xf3\x8f\xbb\x9e\xc7\x5d\x38\x91\xba\xd3\x35\xa1\x4b\x6e\x0c\x6d\x3a\x47\xae\x24\x47\xc6\x18\x01\xd7\xb4\xbd\x42\xef\x68\xa6\x5d\x72\xaf\x4e\x28\x31\x1d\x89\x7c\x39\x31\x1d\x87\x61\x1b\x1e\x40\x23\x68\xa5\x52\x23\xe1\xdb\xde\x2c\x17\x9f\xd6\x87\x6e\x49\x01\x3d\x82\xbd\x44\x05\x35\x27\xb9\x1d\x3c\xdd\x2e\x3d\xa7\xfd\x52\x42\xc6\xc7\xf4\x11\xf7\x6f\x66\xc3\xf1\x99\x44\x0e\x88\x61\x19\x0e\x23\x42\x90\x82\x88\x65\x3a\xd2\x25\x22\x45\x17\xcb\x78\x18\x31\x82\xf4\x63\xd8\xc2\xdc\x9f\xee\x0a\xf1\x03\x4b\x9b\x83\x11\x69\x88\x1f\x58\xea\x1c\xb2\x96\xa8\x96\x67\x08\xff\x4d\xa5\x03\x90\x16\xe9\xce\x52\xaa\x42\x93\xef\xa1\xa4\x92\x00\xb2\xdb\x9e\xdf\xb2\x09\x2c\x2f\x3f\x63\x39\x94\x67\x41\xd4\xf6\xf0\xc8\x37\xbf\xa5\xe2\xa2\xaf\x0f\x4e\xfb\x28\x1e\xc5\x03\x28\x02\x9d\x66\x0e\x7c\xe9\x7c\xfc\x29\xc6\x5e\xeb\x65\x5a\x58\x52\xd1\xed\x04\x0a\xf7\x88\x56\x7e\xea\xc3\x45\x8b\x66\xda\x09\xbf\x1f\x3f\x68\x27\xc1\x03\xa8\xfa\x3f\xaf\x4b\xe1\xfe\x41\x93\xce\x31\xe8\xfe\x8a\xe7\x84\xa1\xe7\xa0\xcf\x9d\xc0\xc0\x17\xe9\xf1\x95\xc4\x7c\x5e\x63\x09\x23\x49\x55\xfe\x46\x3b\xc9\x1b\xfd\xfb\xbd\xde\x87\x78\x3a\x62\x5a\xaa\x82\x5f\x36\x3e\x17\xca\x1e\x6e\x17\xce\xfd\x59\x78\xcf\xdc\xc1\xc4\xcb\xfb\x56\xd5\x98\x4d\x98\x2f\xee\xdf\xcc\x46\x4a\x28\x42\xed\xb1\x0c\x87\x11\x11\x48\xca\xc0\x32\x1d\x46\x54\x23\x07\x6e\xb0\x8c\x47\xca\x15\x72\x0f\x6c\xa5\x74\x17\x61\x8f\x94\x44\x6c\xb1\xf4\xcf\x52\x42\xd2\x12\xa6\x5e\x0a\x17\x6a\x24\xbd\x62\x2b\xa6\xbb\x08\x3b\xc4\x0f\x2c\xd1\x14\x11\x35\xfe\xfe\xe9\x0a\x4b\x3c\x05\x52\x82\x04\xe2\x3b\x7d\x28\xe4\x89\x6e\x14\xcb\xfa\x69\xe7\x54\x2b\xdf\xd9\x38\x66\xe8\x31\x3e\xf3\xb0\x8f\x9e\x2c\x3a\x65\x63\x97\xc3\x5f\x74\x39\xe2\x49\xea\x45\x49\xbe\x9d\x9b\x4c\xa1\x17\xa0\x1f\x65\x10\xfb\x3c\x25\x01\x53\xce\x63\x13\xee\xe1\xa9\x42\xbc\x88\x16\x75\xe6\x74\x92\x83\x27\x99\x37\x7f\x07\x9d\x69\x68\x3f\x1e\x40\xe9\xe8\x0d\xc1\x2b\xae\x7f\x98\xf6\x3b\xcf\xc8\xd2\xf7\xfa\xef\x0a\xa2\xda\xe7\x68\x39\x7a\x6b\x12\x88\x2f\xf7\xe6\x80\xa8\xbd\x8c\x63\xe3\xb9\x78\x00\xf9\xa2\x7f\xff\x41\xc9\xd0\xea\x98\x90\x87\xaa\x90\xc9\xf2\x04\x2b\xeb\xb3\x3d\xa9\x0f\x7b\x43\x4d\xfc\xfa\x6f\x99\x96\x39\x9e\xe7\xed\xa6\xb7\xc7\xfd\x9b\xd9\x70\x80\x3c\x91\x2e\x11\xcb\x70\x18\x31\x85\x2c\x3f\x2c\xd3\x11\x29\x04\xd9\x14\x58\xc6\xc3\x08\x5f\x1a\xe4\x0b\xde\x98\x1a\xf6\x6e\x9b\x68\x80\xfc\x19\x02\x53\xc5\xde\xbd\x45\x10\x42\x5e\xb1\x84\x6c\x18\x91\xf2\xf7\xd5\xc2\x58\x82\x36\x90\xa2\x23\x21\xf0\xda\x59\x4b\x31\xe8\x1e\x88\x32\xd5\x30\x40\xe0\x08\xaf\x69\x39\x8d\x6a\xa9\xb7\xf4\xb9\xc5\x22\xba\xdb\x7c\xdd\xee\x97\xd6\x0b\xce\x48\xc9\xb7\xbe\x6c\xdc\xe9\x99\xd6\xd0\xcf\x5a\x81\xa8\x5b\x23\xfa\xe8\x71\x45\xad\xc4\x3a\x12\x55\xda\x37\x71\x0d\x0b\xbd\x5b\xb4\x82\xa7\xb6\xe2\x7b\x4f\x16\x11\x16\x46\x28\xe0\x01\xf4\x15\x3d\x72\x8f\xd2\x9f\x70\x6b\x33\x66\x0b\x38\x17\xa9\x19\x22\xa4\xcd\xa6\x35\x71\xfa\xa4\x42\x96\xf0\x60\x19\x45\x04\x4d\x05\x99\x5a\xdc\x21\x3c\x80\x6a\xd1\x75\x5d\x9f\xb9\x9b\x85\x87\xfb\xc7\x01\x53\xea\xa4\xe8\x72\x96\xd4\x95\x27\x0a\xeb\xc1\xac\x86\x4c\x71\x6f\xd2\x1e\x11\x72\xee\xd5\xfa\x8e\xfb\x37\xb3\xe1\x00\xc5\x20\xbd\x0c\x96\xe1\x30\x62\x0d\x59\x4b\x58\xa6\x23\x22\x19\x72\x56\x0a\xcb\x78\x18\x51\xfb\x57\x41\xc0\x1c\x2e\x48\x91\xdb\xee\xbe\x87\x6f\x1c\xdd\x49\x27\x3c\x3c\xdd\x61\xc6\xf4\x83\x2b\xeb\xaa\xf5\x4f\x29\x8a\x03\xa3\x9d\x4a\x41\x9b\xaa\xf3\x89\x44\xf9\x5c\x47\x56\xb3\x45\xaf\x5e\xc1\x03\x68\x09\x2d\x3c\x7a\x8f\x95\xf9\xd7\x8a\x99\x7e\x0b\x7c\xfc\x68\x40\xdf\xad\x66\x21\xac\x8d\x5f\x77\x3d\x46\xb2\x8a\xe2\xae\xcf\xfe\x7d\x43\xbe\xf5\x78\x00\x25\xa2\x15\x81\x97\x23\xc5\x2a\x5d\xdc\xd2\xf2\x2f\xd6\x2f\x7d\x1a\x98\x79\x5e\xc0\x86\x8f\xbd\xe6\x91\xe5\xf8\x4d\x2a\x6d\x75\xa0\x59\xfa\x63\x15\x1e\x40\x2b\xe8\xeb\x3d\x5c\x4e\x73\x1e\x22\xd7\x20\x2f\x59\xb5\x4c\x11\xdc\x2b\xcf\x75\x8f\x4f\x40\xc0\xe4\xe0\x40\x4c\xc0\x3b\xde\xf3\x2f\x25\xb3\x9e\xe3\xfe\xcd\x6c\x84\x9a\x20\x8d\x31\x96\xe1\x30\x62\x09\xa9\x0e\x58\xa6\xc3\x88\x44\x84\x30\x61\x19\x0f\x23\x56\xfe\x7e\x12\x1c\x73\xc4\xf3\xa7\x8d\x43\x14\x57\xac\x29\x0f\x8c\xf8\x8d\x78\x8e\x3d\xe7\xf9\xd3\x62\x21\xa9\x0c\x7b\xd4\xb3\x8b\x70\x43\x10\x58\xd3\x1e\xa4\x23\x40\x9a\x32\xac\x79\x0f\x32\x1e\x40\x3e\x98\x8f\x3d\xf2\xd9\x4d\x97\x88\x68\x84\x3d\xf4\xd9\xbd\xc5\x7b\xa4\x4e\x60\xcd\x7d\x90\xe0\x92\x20\x9d\x22\xd6\xfc\x07\x40\x24\x7e\xff\xfb\x87\x2a\x3a\x99\x05\x74\x33\xfb\x75\xeb\x1f\x37\x7c\x68\xc6\xec\xc5\xf6\x2d\xfc\x4d\xc3\xc9\xb6\xbd\xa2\x2e\x1c\x8b\x2a\xa9\xd7\x3a\xc5\xaf\x1d\x2e\xde\xb9\x1e\x9d\x2c\x5d\x55\x89\x85\x85\xef\xf7\x08\x8c\xe7\x36\x9c\x3f\xcc\xfe\xf8\x9a\x40\x6a\xa9\xf6\x8d\xc3\xa3\x1b\x9a\xce\x37\x7a\xf6\xeb\x76\xb0\xe0\x01\xe4\x8c\x4e\x7e\xf4\x0f\xda\x4b\x2e\x18\x2b\x78\xca\x34\xeb\xe9\x8e\xe8\xad\xe8\x7e\x4d\x2b\x99\x24\xa5\x8e\x04\x37\x8f\xdd\x99\xd6\xa0\xf8\xdf\x07\xd7\x87\xd0\xbf\x7f\xdf\x13\xff\xf1\x17\x6d\xd7\xb2\xcc\x91\xc7\x29\x32\x9c\xcf\x15\x35\xc4\xed\x4b\xad\x07\x1e\x92\xd3\xb7\x8d\x55\x7d\xe4\xa2\x7d\x80\xfb\x37\xb3\xe1\xf0\x34\x21\x89\x0c\xcb\x70\x04\x81\x24\x4b\x2c\xd3\x61\x84\x33\x42\x08\xb0\x8c\x47\x68\x35\x72\x0f\xec\x19\xdc\x2e\xc2\x1f\xd9\x75\xd8\x63\xb8\x5d\x44\x30\x22\xd0\x60\x4d\xe2\x60\xc4\xcc\xde\x65\xf7\x3f\x87\xa6\x88\xc7\x23\x09\xdf\x64\xb0\x1f\xfc\x05\x8d\xf0\x1d\x1b\x28\x3b\x42\x50\x53\x4a\x29\x77\xb3\x94\xab\xf3\xb6\x3e\x9f\x3c\xbb\x85\x1b\x90\x1a\xda\xde\xde\x0e\x3a\x8c\x3e\xa8\xb2\x7e\x8f\xe4\xf3\xa1\x37\x0a\xcf\x9d\x99\xf2\xee\x35\x32\x6f\x92\x9f\x32\xd8\xf6\xfe\x92\xfc\x71\xe5\x8c\x18\xd9\x27\x2b\x23\xf4\x31\x22\xe1\x96\x1c\x9c\xbe\x87\x9c\xfd\x39\x9d\x96\xb2\x03\x7e\x25\x74\x24\x17\x78\xc5\xe4\x7c\xde\x4a\x9e\xae\xe3\xb3\x9e\x31\x27\x78\x6a\x07\x24\xd8\x50\x97\x67\xb9\x75\x6a\xff\x3a\x6a\x46\x3a\x21\xf3\x2e\x39\xfe\x60\x9a\x78\x79\x23\xf1\x27\x25\x57\xa5\xaf\xe9\x84\x37\x95\x54\x0f\xcb\x89\x03\xc8\x07\x4d\x5b\x8f\x1d\xe7\xce\xd9\xe7\xeb\xdf\x32\x3d\x92\x6b\x2b\xeb\xcc\xdb\xc1\x61\x59\x15\x74\xa2\x5d\x07\xf4\x32\x0a\x2b\x9a\x3b\x5c\xdf\x0b\xa0\x19\x34\x2b\xde\xa8\xfe\xa5\x72\xa5\xfd\xcb\xdd\xf4\x53\xf9\x39\x72\x17\x09\xa6\x36\x3c\x55\x13\xcb\x3b\x16\x08\xe5\x73\x97\xd7\x4c\x70\x7d\xe8\xd7\x95\x7d\x57\xd1\xe6\x10\x6b\xb8\x76\x9b\x32\xf6\xf9\xc4\xed\xa6\x38\x19\xe3\x8f\x94\x86\xee\x6f\x3a\x5f\xc7\xbf\xd9\xb7\x51\x19\xc9\x2b\x0a\x00\xd4\x88\xae\x68\x78\xc9\x95\xce\xbb\x7b\xd3\x8c\x86\x92\xe6\x7b\x0f\xd0\x9b\xfe\xf4\x1d\xe7\x49\xd0\xb1\x50\x6a\xeb\x3c\xe7\xeb\x21\x1b\xc0\x5b\x05\xa0\x41\x74\x0f\x2c\x2c\x2c\x28\x2b\x75\xe3\x54\x47\x44\xd0\x13\x3e\x9b\xee\xf9\x2f\x1a\x47\xa0\x84\xdf\x89\x6a\x8c\xad\xc6\xe3\x52\x2d\xbd\xf4\xcf\x51\x97\x06\x37\x31\xef\x67\x96\xc1\x95\x74\x27\xb9\x3b\x29\x3c\xd2\xb4\xe7\xd9\xd6\xa3\x93\xd2\x89\x59\x98\xab\x32\x53\x1a\x16\xed\x7e\xb0\xd3\x0e\xa2\x2d\xa1\x8a\x1e\xcf\xf4\xcb\xe3\xa6\x91\xa4\xb6\x61\x25\xcc\x6e\xb8\x28\x76\x2e\xc7\x7b\xbd\x85\x5a\x50\x03\x70\xbd\x2e\x78\xa0\x1a\xb6\xc3\x5e\xd0\xa6\x68\xde\xa9\x6f\x3d\x9d\xc9\xc7\xb3\x5e\xba\xe4\xb4\x2a\x46\x2c\x21\x27\xd9\x9e\xb2\x44\xa6\xfb\x9c\xc4\x91\xb2\xab\xf8\x20\x35\xfa\xdd\x66\x49\x2c\x95\x4f\xb7\x4f\x0a\x2d\x96\xdf\xab\x55\x6c\xb8\x14\xdb\x49\xd5\xf0\x4c\x8d\x80\x4f\xf5\xd3\x35\x66\xca\xbb\x2f\x8b\x4f\xe9\xa3\x2e\xfd\xf1\xc8\x31\xfc\x8e\xc2\xfb\x0b\x36\xa5\x7b\xd4\xa5\x0b\x71\x6f\x67\x74\x75\x1a\x68\x78\xa3\x56\xcb\x2e\x90\xbd\xf3\xec\x30\x6f\x43\x5d\x2a\xd6\x76\x2a\xc5\x69\x3a\x3a\x29\xd2\x2f\x53\x96\xd1\xd5\xc3\x44\x49\xfa\xbd\xaa\x05\x45\xba\x7a\xf5\x79\xb2\x1b\x6f\x3c\xf6\xa9\x00\x00\x79\xa0\x7b\x3e\x19\x09\xbd\x58\x8e\x0c\xca\xfd\x96\x71\x64\xb6\x13\xf2\x03\x3d\x0a\x1b\x87\x15\xbe\xdb\x51\x8c\x71\xba\xa7\xbe\x23\x15\x34\xb6\x01\x50\x0c\xba\xb6\xc7\xd6\xef\x63\x50\x69\xfc\x11\xa2\x91\xa1\xad\x95\x17\x14\xc7\xaf\x34\xbe\xa4\x3e\xa2\xf6\xc6\xb5\xdd\x8e\xd5\xd8\xd2\xf4\x94\xbe\x1d\x90\x90\x44\x5d\xfe\xa5\x80\xf4\x65\x41\x8b\xaf\x22\xb5\x92\xd1\xca\xe4\x46\xdd\xd3\x0e\xa5\x56\x6d\x4e\xaf\x06\xe2\xe6\x1f\x21\x37\xb8\x9e\x25\x25\x03\x08\x8f\xfe\xf5\xe0\x2e\xd9\x6b\x27\x86\xda\x5a\xcf\xbd\xa4\x55\x4b\xab\x0b\x7d\xa2\xf6\x89\xbe\x44\x50\x35\x56\x3a\xac\xb8\xde\xc5\xbf\x4b\x12\x07\xa0\x41\xf4\x82\xe5\xaa\xd0\x1d\x2e\x77\x7a\xf8\x9a\xa4\x79\x3b\xff\xa5\x0e\xc3\xd3\xab\xb2\x1d\xe9\x64\xda\xb5\x5b\x59\x87\x52\x0a\xf6\xfd\x68\x38\x6d\x07\x20\x27\xf4\x04\xb8\xa7\xa3\xab\xa3\xb7\xc4\xd5\xe2\xfd\x13\x93\x79\xc7\xfe\x12\xa6\xf5\x85\xd2\xbb\xb7\x80\x63\x53\x95\xee\xcb\x9b\xa5\xa2\x2d\x59\x00\xaa\x43\xcf\xed\x2f\x6b\xeb\x33\x6f\x87\xdf\x76\xe4\x1a\x62\xf8\x8a\xff\x5e\xfb\xb9\xa7\x3a\xeb\xbe\xfa\x93\x64\x0d\xe7\x74\x69\xd5\xec\xb3\x32\x83\x00\x1a\x40\xb7\x55\x1c\x14\x8e\x1b\x47\x7a\x9d\x2c\x6e\x9c\x2d\xa8\xeb\x78\x98\x66\xc8\x5b\xc0\x1f\xa6\x36\x21\xc9\xb7\x24\xae\xb6\x66\xa3\xa8\x93\x85\xce\xed\x9a\x1c\xa1\xaf\x6d\x2d\xbe\x5e\xf8\xc0\xad\xde\x29\xf4\x58\x3c\x8f\x9a\xb8\xb9\x62\x4b\x7d\x2b\x21\x6c\x25\xff\xa2\xa1\xc3\x05\x3b\x00\x05\xa1\xb5\xd5\x61\x95\x99\xdb\x49\x9e\xb1\xb7\x8e\x3f\x7e\xb0\x50\xc5\x89\x4b\xad\xd3\xed\x6d\x12\xc1\x1f\x17\x26\xd9\xa2\xda\xfc\xd0\x47\x72\x0d\x40\x39\xe8\x89\xe3\x7d\x91\x57\x0f\x29\xb7\x3e\x5c\xef\xd1\x72\xd6\xb6\xe1\xd1\xe1\xe3\xb9\x53\xe2\x6e\x11\x96\x70\xea\x67\xe1\x87\x0c\xaa\x11\x2f\x41\x00\x7d\x41\x47\xfd\x42\x6e\xd6\xd3\x2c\x9e\x7a\xee\xaf\x35\xbc\xda\x39\xaf\xb7\x3a\x6a\xea\xe5\x49\xa2\x12\x1a\x38\xb3\x84\x7d\xc6\x0f\x09\x4d\x0d\x02\x00\x65\xa2\x97\x8c\xc3\x89\x1e\xef\xb5\x88\xe5\xfe\xce\xc5\x63\x79\xd5\xa9\xaf\x33\x9a\xae\x9e\x1b\xa0\x2c\xf5\x67\xf2\xc4\x9f\xcd\xfe\xac\xcc\xb5\x06\xa0\x5a\xf4\xcf\xa7\x18\x7d\x95\x38\x83\x1f\x24\x96\xaf\xb2\xe4\xff\x4c\xa6\x45\xb1\x44\x68\x3e\xb3\x65\xdd\xd8\xb4\xfe\x3b\xf8\xb2\x9a\xd4\x41\x75\x3b\x00\x45\xa1\x7f\x5e\xfe\x9c\xf6\xc2\x8d\xd2\x94\x98\x52\x9e\xca\x79\x23\x9f\x9b\x2f\xc4\x78\x88\x35\xc3\x3b\xa2\x8e\x84\x3f\x12\x15\x53\xae\x1c\xcb\x02\x50\x0b\xba\xee\x49\xf7\x46\xbc\x69\xa3\x29\x2e\x3c\xc1\x35\x91\x78\x86\xae\x38\x33\x8a\x64\xa9\xb4\x56\xd4\x2c\x63\xfb\x63\x7d\x6c\x30\xc9\xa9\x6b\x00\xda\x42\x8f\xdb\x9e\xed\xed\x64\xae\x17\x0f\x3e\xe5\xab\xe1\x91\xfb\xd9\x02\x2f\xe7\x9f\xb5\x42\xaa\xc3\x74\x8e\x2b\x16\x7c\x30\xd9\xeb\x1c\x1e\x69\x07\x20\x17\xf4\x9a\xb1\xb0\xb9\x3b\xe8\xd2\xb5\xc8\x17\x75\xe4\x28\x67\xe2\x71\x32\xaa\xd7\x23\x57\x32\x1d\x03\x04\x1c\x0a\x1f\x76\x4c\xf9\x76\xb5\xec\x01\x50\x09\xda\x9a\x42\xe5\x07\x4a\x2b\xd7\x6b\x0e\x1e\x8a\xf7\xb4\x54\x29\xd7\xe0\xff\x6e\xe7\x4f\xd5\xf2\x93\x89\xfb\x92\xb6\xbb\x73\x46\x87\xeb\x5b\x00\x95\xa1\x9b\x88\x67\xb6\x6a\xe9\x85\xcb\x4f\xc3\x0d\x07\x8b\xd3\xf8\xb8\x15\x4e\xf1\xd1\x19\x8e\x71\x5b\xeb\xa4\x51\xdc\x53\x2b\xb9\xa8\x3e\xad\x87\x7e\x4a\x5a\x6b\x0e\x79\x44\xc3\x57\x86\xd2\xfb\xdc\x29\xd5\x53\x9f\xd0\xbb\x19\x16\x35\x52\x28\x12\x8c\xd1\xdc\x38\x9e\xe2\x5f\xf8\xd4\x0e\x40\x00\x7d\x5c\xea\x57\xb6\xf9\xf8\x74\x7c\x28\xf7\xad\x7b\x1b\x47\xce\xc6\xba\x9f\x49\xd2\xb0\x31\x53\x93\xbe\x99\x3c\xc9\xae\x71\x41\x89\xde\x82\x1a\x40\xd1\xe8\xc5\xbe\x97\x39\xb6\x70\xba\xcf\xec\x88\xdd\x84\xfe\xa8\xc6\xd1\x7b\x1d\x17\xb3\x86\xe5\xeb\xbe\x1e\x7c\x98\x7d\xc0\xce\xfa\x30\x2d\x75\x11\x80\x66\xd0\x5b\xef\x2e\xdf\x40\xc0\xc3\x39\xdc\x48\xfb\xb1\x4e\x7a\x6a\xc6\xfa\x74\xa8\xea\xf3\xf8\xf7\x73\xf6\xa4\x4e\x56\xd5\x2d\xf6\x16\xab\x97\x51\x97\x52\x44\xd9\x08\xc9\xcb\x0c\xf8\xc4\x74\x55\x0f\xa6\x78\x1e\x75\xaa\x24\x5e\xe3\x8c\xd7\x8a\xde\xc8\xfd\x75\xb6\x04\x94\x4a\xc4\xa1\x2e\xcd\x6c\x20\x51\x9b\x3d\x9c\x25\x39\x93\xb8\xfd\x3a\x67\x73\x81\xeb\xc3\x4f\x8d\x0d\x7c\x3d\x05\x81\x6f\x6d\x0a\x73\x7e\xbd\xa2\x03\x1e\x40\x69\xe8\xec\xac\x13\xb0\xc9\xa7\x3e\xec\xba\xa0\xad\x4b\xf5\x94\x96\x57\x5c\x6c\xed\xfe\x41\x76\x5c\x53\xc7\xde\x08\xa2\x08\x53\x93\x0c\x1a\x5f\x34\x57\x3d\xb0\xc6\x71\x32\x3e\x7d\x85\xc8\x91\xce\x7a\xfb\x66\x47\xe4\x9e\xf2\x55\xb6\x85\x72\xd2\xa6\xb6\x3d\xee\x8c\x89\x76\x54\xdb\x76\x00\xb2\x45\xff\x34\xe1\x5c\xac\xfd\xfc\xed\xec\x62\xcb\xf2\x0b\xd0\x51\x32\xe3\x87\x99\x47\x0c\x26\xb3\x23\x52\x1c\xf4\x07\x6f\x5e\x4e\xf9\x79\xea\x2c\x80\xdc\xd0\x9b\x5f\xa7\x43\x46\xa7\x3a\xe1\x3e\xf9\xaf\x58\xba\xd7\x67\xbd\xb3\x3e\xe7\x15\x75\x5e\x27\xfa\xe0\xb9\xf1\x72\x46\x41\xf7\x36\x6f\x5e\x27\x80\xb6\xd1\x65\x82\xe5\xe8\xd8\xed\x5a\x28\x78\x20\x4c\xf7\xab\xc4\xf5\x8f\x23\x1a\xa4\xa4\xb3\xc5\x1f\xe5\xbb\x45\x27\xf5\x74\x59\xe7\x68\x53\xaf\xd9\x01\xc8\x0f\xfd\xc7\x10\x03\x76\xe2\xdf\x8b\xee\xb2\xd6\xa6\x7d\x5f\x52\x19\x4b\xae\xb9\x9f\x99\x0d\x64\x2b\x94\x7a\x43\xa0\xbb\x6c\x23\xe3\x1b\x62\xbf\x0e\xa0\x78\xf4\xb2\xb2\xb9\xae\x2e\x77\x28\x8b\xae\x2e\xd9\xa0\xec\x43\x9a\xea\xdc\xec\x7d\xda\xb5\x76\x62\x12\xb9\xf1\xac\x27\xcf\x06\x71\x17\x66\xa7\x00\xf4\x05\x2d\x32\x72\xce\x3f\x38\x2b\xf3\xf6\x00\x43\xde\xbb\xb4\x94\x07\x5c\xac\x02\x3a\x0c\x11\xdf\xd9\x45\x9f\x2e\x3c\x0d\x16\x3e\x50\x70\xf9\x24\xfa\x7b\xca\xce\xaf\xbd\xe4\xef\xaa\xf5\x58\xf7\xf4\xb5\x93\xeb\xaf\xfb\x18\x52\x8f\xd9\xeb\xd5\x70\xff\x6a\x51\xfe\x58\x59\x39\xc3\xa1\x80\x4e\x72\x8e\xaa\x7c\x05\x74\xdc\x7e\x79\x09\xf7\xee\xdd\x3c\xbb\xf2\xba\xa5\xe5\x00\xf9\x0b\x5a\x5d\x81\x1f\x86\xd6\xb4\x56\x73\x2c\xe6\x97\x77\x88\xc1\x7f\x5e\xef\x43\xc0\xc9\x9f\x2e\xe8\xb9\xfe\x32\x36\xb6\x7a\x63\xda\xb9\xf5\xe1\xd3\x2d\x8b\x98\x69\x19\x96\x42\xbd\xc1\xb6\xda\xa5\xc8\x56\x74\x95\xfd\xf8\x9c\x32\x93\x02\x7f\xf7\xf4\x35\xe2\xf9\x05\x67\xbd\x94\x13\xca\x59\x04\xc9\x93\xa3\xc5\xe7\x14\xea\x6e\xa5\xfc\xf6\xe8\x82\xff\xf6\x86\xd5\x5a\x01\x29\x71\x72\x3a\xc6\x9d\x65\x95\x88\x8e\x87\x10\x61\xee\xd4\x79\x83\xd8\x21\x76\xee\x55\x63\x89\xf1\xc7\x17\x17\x49\x3b\x3e\xb4\x29\x1d\x22\xab\x1c\x2b\xd9\xa8\xb5\x0a\xd9\x69\xed\xdf\xa2\xb7\x1a\xde\x50\xe3\x74\x9a\x89\x74\x2b\x0b\x7d\x57\x3b\xad\xb3\x60\xdb\x2b\x1e\x23\xcf\x7a\xb6\xad\x52\x92\x77\xde\x4a\x4c\xe6\xf3\x1f\x01\x80\x3e\xa3\x33\x22\x45\x7c\x60\xd4\xe5\x08\x79\xf3\x79\xde\x8b\xcd\x67\xcd\x08\x6e\x09\xef\x0b\xe5\xcd\x1f\x5f\x0d\xda\x98\x0d\xfb\xca\x95\x5f\xff\x14\x40\x5b\xe8\xb5\x65\x2e\xe4\x2d\x51\x73\xf0\x6b\x51\x74\x58\x79\x98\x14\xd9\x9b\xe4\xcb\x16\xf1\x7a\x5b\x2e\xae\x92\x47\x6b\xf8\xa5\x19\x0b\x32\x28\x77\x78\x1f\x7a\xb1\x04\xd3\x16\xdd\x7f\xba\xcf\x5e\x6e\x48\x9d\xd1\xd3\xcb\xe6\xfd\x11\x4b\xc3\x5a\x1b\xfa\x4e\xcb\x74\xd1\xdf\xb7\x33\x9f\x7f\x8c\xa8\xc1\x03\xa8\x12\x3d\x59\xdb\xdb\x61\x7f\x21\xfe\xa7\xdf\x99\x47\x7c\x8a\xab\xd4\xaa\xfb\xe3\x0e\x1c\xad\xb8\x70\xdf\x56\xc6\x3f\xc4\x68\xff\x3b\xd3\x5e\x2f\x5e\xdc\xbf\x45\x05\x40\x1c\xbb\x5c\x1a\x51\x41\x31\xe3\xf2\x07\xf1\x16\xd1\xba\xb0\x23\xb3\x8b\xf8\x8c\xb0\x6f\xac\xe0\xc0\x88\x2d\x44\x13\xc0\x0a\x0f\x8c\xb0\x45\xfe\x4b\x84\x15\x20\x18\x51\x49\x82\xfc\xc1\x0c\xab\x53\x07\x92\xe2\xce\xec\x8e\x78\x00\xbd\x43\x3f\x69\xbd\x8b\xcb\xe4\xdd\x71\x5a\x72\xbf\x5f\x6c\x05\x0f\xa7\xe4\xbe\x51\x6e\x86\x6e\x34\x4e\x8f\xe9\x10\xaf\xfa\x98\x0e\x68\x3f\xfe\x86\x07\x90\x3b\x7a\x90\xf5\x7e\x78\x3a\x6c\x93\x62\xfc\xdb\xf1\xc3\xeb\x9f\x18\x5e\xfe\xf0\x4c\xe8\xeb\x8e\xf4\x36\xd1\x69\x6d\x7e\x17\x99\x79\x63\x54\x37\x09\x0f\x24\xf8\xd0\xdd\x58\x66\xda\x6f\xbd\x5e\x28\xf0\xe8\xe6\x33\x99\xc6\x54\xa7\xd2\x57\xc9\x44\xeb\xac\xe9\xef\x42\x71\x04\x54\x21\xe4\x5a\xe7\x73\xf1\x00\x6a\x41\xaf\x53\xaa\x2b\x2e\xfd\x69\xe3\x43\x2c\x97\x5c\x04\x4e\xec\x23\xb8\x3e\x1c\xe5\x55\x64\x5f\xbb\xca\x6e\xd2\xf4\xeb\x78\x52\xb8\x50\xef\xb9\x1d\xd2\x87\x2e\x0a\x86\xd9\x8f\x7d\xb8\x79\xc4\xdb\x23\x8a\xf6\xbf\x19\xf0\xad\x92\xdb\xe7\x77\xb9\x49\x20\xbe\xfc\xdc\xdd\xc0\x95\x47\xc9\x34\x87\x67\xf0\x00\xf2\x44\xef\x78\x85\xaa\x46\x2e\x21\x2e\xcf\xf4\x00\xbd\x6c\x0a\x12\x85\x3d\xbd\x1b\x26\xa4\x1d\x89\xda\x06\x63\xc9\x53\x39\xfb\x84\xbf\x94\xac\xe1\xfe\x2d\x2a\x70\xf8\xdf\x21\x8f\x18\x2b\x2e\x30\xc2\x9d\x1a\x16\x26\xb0\x42\xf3\x07\x21\xc1\x87\x0c\x37\x31\x62\x03\xdf\xa2\x05\x59\xa9\x58\xd1\x81\x11\x4d\xc8\x60\x0d\x2b\x3e\x30\xc2\x13\xf9\x5f\x10\x36\xe3\xdb\x75\x83\x0d\x11\x97\x31\x39\xdf\xee\x2d\x7c\x10\xa3\xb0\x68\x1f\x8c\x98\xf9\x3b\xd5\xc5\xa4\x7f\x52\xdc\x04\x74\x04\x76\x78\x00\x4d\xa0\x5b\xb5\xd4\xb1\x6e\x7d\x41\xd1\x04\x4e\x07\xdb\x2f\x65\x49\x2a\x9e\xd4\x4d\x0f\x8f\x8a\xdc\x55\xa8\xb0\x3c\xe4\x69\xe4\xa3\x30\xae\x18\xbf\xc3\xbd\xd0\xbb\xa1\xbc\x42\x78\x9f\xb1\x3f\x8e\x8b\xcc\x2a\xe2\x86\x43\x2c\x8b\x8f\xcd\xf2\x8b\x11\x69\xd7\x0e\x03\x12\x3a\x6e\x6e\x12\xfe\xdf\x52\x00\x40\x4d\xe8\xdf\x7f\xc1\x1d\x35\x44\x7d\x59\x68\x53\x84\x34\x41\x9e\xe2\xd2\x99\xc7\xfd\x96\xe1\x49\x71\x1a\x02\x92\xb2\x16\xa2\x66\x36\x19\xcf\x26\x01\xb4\x89\xae\xd9\xcd\x21\x29\xbf\x52\x6c\x47\x73\x06\x55\x4e\xf8\xb7\x9a\xb3\xde\x9c\x16\xbe\x56\xc5\x4c\xa4\x64\x79\xd3\xe7\xa1\xe0\x86\x4d\x54\x0f\xee\xdf\xac\x86\xe3\x33\xf1\x57\xe3\xc2\xb2\xfb\x0f\x22\x17\x11\xde\xb0\x2d\xff\xb3\x94\x90\x7b\x60\x19\x0f\x23\x36\x11\x1d\x0d\x9b\x83\xef\x22\x1a\x11\x91\x12\x8b\x86\xc3\x88\x41\x3a\xe4\xac\x09\x16\x1d\x07\x52\x74\x24\xd7\xfe\xa7\x78\x37\xa0\xf3\xe4\xcf\xfc\x77\xb9\x4f\xa9\xac\xf6\x9d\xa3\xc8\x7c\x54\x3d\x2d\xdd\x70\x62\x78\xa5\x7b\xbb\x7e\x9c\xb0\xe6\xf1\x9c\x8d\x56\x69\xf5\xc2\xce\xd6\x46\x6b\x69\x17\x86\xd2\xc2\xa3\x8e\xcd\x9f\x21\x6b\x64\xef\x6e\xe1\x7c\x47\xbc\xe0\xcd\xb1\x49\xdd\x62\xfa\x50\x45\x7d\x4a\x9d\xa6\xe4\x64\x0d\x00\xd0\x32\xfa\xf7\xe3\xc3\x03\xa0\x7b\x14\x31\x0a\x3a\xb6\x71\x8b\xf7\x49\x72\x5c\x38\xcd\xbe\x72\x67\xbd\x5f\xd5\x1e\x39\xb4\xa9\xec\xf8\xcc\x26\x08\x40\x9b\x68\xbe\x55\x1a\x2f\xfc\xf3\x3d\x9f\xde\x67\xe7\x6a\xa7\xd1\xc4\xdf\xea\x83\xda\x4d\x8c\x02\xc3\x2e\x83\xd3\x19\xb7\x28\x1a\xbb\xbf\xc8\xb4\xe1\x01\x14\x82\xee\x2f\x02\xd9\x45\xb6\x63\xcb\x64\xc2\x7c\x1d\x66\xe8\x88\x32\x7a\xdf\x85\xf4\x1f\xa6\xa9\x1b\x7d\x57\xf6\x38\x88\xfa\xfe\x75\x52\x4b\x80\xfb\x37\x2f\xe1\x78\x36\x20\x79\x0f\xd3\x4f\x38\xef\x21\xc2\x1b\xb6\xa7\xbb\x88\x65\xe4\x1e\x58\xce\x22\x2b\x09\x39\x13\x8a\xe5\x2e\x8c\x08\x41\x1a\x07\x2c\xd5\x05\x46\xa4\x23\x6b\x0f\x4b\x77\x41\xf6\x10\xdd\xf2\x26\xd1\xbf\xe9\x2f\x40\xea\x1a\xb7\x20\xc1\x4e\x8d\x2e\x42\x17\x2d\xa5\x7b\x87\x88\xfd\x89\x4e\xe0\x82\x0d\x6f\x38\x0a\xed\xd5\xea\xee\x21\x9c\x25\x91\xc9\x8f\xfa\x95\x1e\xfb\x28\x5f\xc3\x27\x6c\x76\x27\x59\xa2\xb3\x4c\xc1\x41\x05\xad\x43\x54\x75\x2a\xbf\x5f\x97\xcf\x19\x0a\x73\xd8\x08\x96\x7f\x72\xbc\x1b\x4e\x30\x1d\x6a\xf5\x73\x95\x40\x82\x4f\x03\x00\x28\x0d\xdd\x8d\xc5\x70\x1d\xe7\x54\xe1\x19\xe6\x8e\x67\xbe\xe8\x66\x65\xe8\xa0\xe8\x1d\xe2\x20\xd7\x20\xad\xdf\x41\xde\x71\xc2\xf9\x5a\x13\x9d\x3a\x80\x26\xd0\xbc\x8d\x27\x34\x83\x3b\xae\x30\x95\xe4\xb8\xcf\xbd\xc9\xc1\x52\xaf\xec\xab\x4c\xae\x49\xa4\x06\xf7\x35\x2b\xc7\xbc\x33\x34\x5f\x32\x3b\xe3\x01\x34\x8e\x5e\x7b\xad\x7b\xae\xe8\xc6\x74\x54\xc9\xdf\x3e\xef\x17\xd4\x3b\x34\xf2\xbc\xd3\x75\x48\x98\xe8\xee\x75\x42\x1c\x2d\x59\xf9\x7d\x20\xbd\xbe\xb3\x3a\xd0\x6c\x9c\xed\x3c\x23\x94\x5a\x42\x74\x72\x69\x4c\x97\xda\x92\xef\x71\x53\x72\x7d\x5f\x8a\x67\x5c\x80\x10\x07\xe5\x8c\x48\xac\x87\xff\xad\x1d\x4a\x86\xee\x01\x4c\xa1\xcc\xd2\x23\xb1\xde\x57\x5d\x59\xcd\xcf\xbb\x5e\x24\x23\xf2\x7d\x2c\xc1\xef\x7f\xbd\xff\x07\xa3\x5b\x36\x79\xb4\x80\x96\x2a\xee\xdf\xa2\x08\x3f\xaf\x22\x64\x3c\x81\x19\x47\xb8\x52\x21\x39\x0f\x3b\x92\xbb\x88\x34\x64\xd0\x8f\x15\x4c\x24\x77\x23\x12\x31\x56\x38\x61\xc4\xf8\xdf\xef\x8c\x61\x04\x14\xd9\xa3\xc8\xb4\x12\x2b\xa4\x88\x1f\x0c\x48\x5e\xc5\x12\x0c\x81\x64\x0c\x01\xf7\x0e\xef\x49\x40\xaf\x25\x16\x21\x5f\xe5\xb3\xc4\xd7\x44\xfb\xac\x6b\x45\x3e\x92\x6f\xe5\x38\x58\xc9\x8d\x08\x3b\x11\xb7\x0b\x30\xc7\xd1\x24\x0f\x2b\x31\xee\x30\x36\xf4\xb3\xbe\xa6\xf1\x76\x35\xb8\xfb\xd7\x8d\xa5\x9b\x0d\x92\x69\xb2\xe1\x97\x9e\xcb\x2f\x54\x48\x76\x67\xb8\x86\xaf\x28\x40\xaf\x9f\x0a\x14\xe2\x01\xf4\x1b\x4d\x4c\xba\xf2\x39\xda\x74\x95\xcc\x18\xda\xca\xce\x2a\x46\x39\xd7\xff\x18\x3c\xbd\xb1\xfe\xf5\x2b\x79\x35\x09\xae\x4b\xd6\xe6\xad\xe1\x55\x3c\x80\xa2\xd0\x6f\x53\xb2\x1d\xd2\xbf\x7b\x7d\xbd\x45\xd4\x5e\x2c\xdd\xf4\x8b\xcb\x93\x36\xe1\x58\x96\x1f\x73\x56\x63\xe7\x5e\x11\x96\x15\x38\x15\xbd\x89\xda\xf1\x19\xdd\xaf\x56\x3a\xbe\x60\x97\x5c\x2c\x39\x37\xe5\x71\x3c\xfc\x24\x89\x21\x95\x75\xa3\x22\xee\xd3\xc4\x54\x58\x64\xd8\x46\x4a\x81\x1f\x3d\xfc\x3e\x1b\x2c\x37\xe1\x78\x26\x20\x4f\x19\xcb\x51\x18\x31\x8a\x74\x49\x58\xae\xc2\x88\xdf\x08\xc9\xc0\x72\x16\x46\x44\x21\x6f\x3a\xc2\x72\x17\x59\x17\x4c\xc8\xba\xc0\x54\x87\xa5\x98\x39\x08\xfe\x57\x6f\xfd\xd1\x05\x8e\x2b\x24\x4f\x28\x7a\x7e\x5f\xe3\xe6\x91\xbc\xce\x2f\x3a\x9a\x0a\x1c\x9f\x24\x1c\xee\x85\xf0\x86\x88\xd6\x29\x73\xf8\xdb\x91\x93\xe3\x01\x94\xfd\x1f\x22\x70\x42\x49\xf1\x7c\xa5\xa7\x0b\xeb\xb2\x44\xff\xc7\x88\x90\x37\xe3\x81\x87\x5e\x3f\x1f\xb5\xd4\xbd\x73\xec\xba\xea\x99\xe1\x23\x6f\x01\x80\x92\xd1\xa3\x04\xbf\x63\xb4\x87\x09\x3c\x08\xda\x55\x5f\x13\xbf\x8e\x7c\xf6\x86\x29\x6f\xdf\x5c\xb6\x7d\x54\xf2\x07\x9d\x02\xa6\x27\x39\x81\xac\x27\x00\x94\x86\xe6\xdb\x27\xf6\xac\x5d\x23\xd5\x37\x54\x7a\x70\xea\x74\x3c\x7d\xf4\x2f\xa7\xe9\x05\xfd\x14\x2f\x4e\x71\xdd\xa0\x4b\xaa\xed\xfb\xee\xd3\x93\xe1\x01\x14\xf3\x9f\x01\x79\xf0\xab\xf6\xc0\xf0\x01\x06\x99\x38\xa9\x8c\x93\x7b\xde\x15\x4f\x86\x79\xab\xc9\xa8\x29\x99\x74\x69\x5e\x77\x0c\x0e\xfc\x52\x83\xfb\x37\x2f\xe1\x78\xfa\x23\x95\x0d\xd3\xcf\x3f\x88\x6c\x64\x5d\x60\x7b\xba\x8b\x48\x46\xce\xe3\x61\x39\x8b\x3c\x65\x84\x44\x63\xb9\x0b\x23\x62\x90\xea\x89\x3d\x04\xd8\x45\x78\x20\x39\x09\x6b\x0e\x80\xdc\x83\x09\x61\x58\x98\xa3\x80\x5d\x6a\x22\x89\xf0\x74\xcc\x61\xc0\xee\x2d\xf0\x08\xc3\xc2\x9a\x07\x20\x0d\x28\xf2\x38\xb0\x27\x02\xbb\x08\x27\x64\x8a\x88\x3d\x14\xd8\x45\xd4\x21\xc9\x03\x6b\x2e\x00\x23\x06\x48\x91\x81\x34\xd6\x7c\x00\x48\xd1\x11\x10\x5c\xb3\xc3\x03\x09\x1c\x6a\x99\xab\x74\xe6\x7d\x3e\xa0\x8b\x33\xd9\xbe\xa4\xf1\x49\x54\x52\xf7\x87\x75\xd7\xd3\x8e\x7a\x8b\xc1\xc9\x6e\x92\x61\xef\xca\x20\x2b\x5b\x00\x20\x17\x34\xa1\x69\x4b\x76\x2a\x12\x18\x24\xa9\xf8\x14\x21\xb3\x48\xf6\xe6\xf4\xd6\x63\x27\xe7\xde\x0c\xa6\x75\x5a\x4d\x3a\xff\x7d\xf1\x4f\xbe\x79\x01\xe8\x07\xba\x29\xce\x38\x14\xa4\x33\xf1\x2d\xb7\xfe\x72\xa8\x44\xaa\xf9\xe6\x54\x6d\x66\x34\xf9\x5d\x91\x4d\x5c\xc8\xa4\x9f\x81\xa5\xef\x87\x93\x4e\x3b\x44\x14\x9d\x34\x46\xef\x52\x9f\xcd\x3a\xa9\x65\x69\xf3\x96\x73\xe9\x80\x22\xb9\x9a\x25\xf1\x69\x4f\x7d\xfe\xf6\x55\x91\xaf\x55\x4b\xe5\xc9\x93\xab\x82\xff\x68\xf5\x9f\x75\x81\x83\xe3\x89\x6d\xf6\x6e\x3c\x5d\x10\x2a\x83\x65\x39\x8c\xf8\x81\x34\xb9\x58\xb6\x23\xcc\x1b\x49\x05\xd8\x23\x9a\x5d\x44\x10\x72\x0e\x11\x7b\x4a\xb3\x8b\xc8\x41\xee\x81\x39\xa8\xf9\x83\xf8\x82\xec\x08\xec\x51\xcd\x2e\x22\x13\xd9\xd8\x58\xd3\x1a\x18\x51\xfb\xf7\xbd\xe3\x98\xf3\x9a\x3f\x85\x0b\xb9\x07\xf6\xc8\xe6\x8f\x76\x82\x4c\xfb\xb1\xa6\x36\x88\xca\x87\x34\x7f\xd8\x73\x9b\x3f\xab\x04\xd9\xd9\xd8\xa3\x9b\x5d\x44\xc9\x5f\xab\x30\xa6\x37\x30\xa2\x8c\x10\xd9\xd9\x58\x53\x1c\x20\x29\x4e\xbc\xfb\xde\x40\x74\x63\xf6\xf5\xfe\x47\xe1\x37\x51\x11\x81\x97\xcc\x89\xdf\xd6\x37\x2a\x13\x2e\xdf\x4b\xd5\xbe\x75\x46\x84\xe7\x66\x40\xf8\xbb\x66\x2d\xd1\x06\x00\xa5\xa2\x37\xf6\x55\x6d\xfd\xb2\x71\x7e\xcf\xf7\x14\xa5\xe7\xaf\x2f\xeb\xfd\xf8\xe6\xb9\x37\xd1\xa6\x2e\xc3\x99\x6d\xe5\xf6\xd5\x3b\xa9\x56\x25\x9d\x78\x00\xf5\xa0\x29\x8a\xc5\x33\xd1\x26\xf5\x64\x41\xba\x32\x86\xcc\xcd\x98\x38\xb3\x8e\xfb\x09\xa2\x47\xee\x5c\xb5\xce\x12\x5b\xb2\x63\x4e\x0c\xcb\x91\xd9\xe9\x85\xd0\x14\x88\x86\x5d\x61\x3d\x55\x42\xbd\x8f\x4e\x63\xfc\x7b\x7d\xde\x5b\xa2\x3a\x6e\x2a\xdd\xcd\x41\x49\x9e\x13\x2d\xe4\x51\xbd\xa9\xd1\xf0\xcb\xd0\xb1\xad\xfe\x23\xff\x22\xa9\x12\xcb\x70\x18\x91\x8a\x6c\x6d\x2c\xd3\x61\x44\x0f\xb2\x30\xb0\x8c\x47\xba\x3f\x84\x79\x60\x4f\xd2\x76\x11\x00\xa9\xc0\xd8\xc3\xb4\x5d\x44\x34\xe2\x39\xd6\x3c\x0d\x51\xd5\x18\x90\xd3\x82\x58\x73\x35\x20\x45\xcc\x41\xf8\xbf\x5e\x0e\xa0\x9b\xea\xea\x2f\xa1\xf7\xd7\x03\x6b\x29\x14\x09\x1e\x9f\xf4\xcf\xd8\x93\x1d\xbf\x48\xf9\x59\xde\x63\xf5\x72\x1d\xc3\xf1\x9f\x9e\x5c\x1e\x3b\xa4\x20\x06\x3d\x7b\x76\x90\x3d\x63\xf3\x29\xf3\x65\xf2\x5b\x4d\xa5\xdc\x27\x34\x42\x5a\x34\x92\x12\x9f\xd9\xca\x7d\x74\x0e\x97\x7c\xcd\x31\xe8\x67\x20\xc1\x03\x28\x10\xbd\xf8\xa8\xf0\x51\x9f\x99\x12\x86\xef\x6d\x64\x70\xfc\x6c\x94\xe0\x94\x91\x7e\xe1\x1f\xbf\x1c\xd9\x54\xc7\xc3\xb9\xdf\x52\xf2\xa8\xff\x09\x3c\x80\xfc\xd0\x65\x45\xec\x4e\x2f\xc7\xfc\x22\x31\xf3\xfe\x2f\x4f\x9a\xed\xe5\xc7\x9a\xd3\xb2\x08\xfc\x0d\x6c\xa8\x43\xcf\xed\x3f\x7d\x45\xa6\x97\xee\x13\xee\xdf\xcc\x46\x1e\x02\xd2\x1e\x63\x19\x8e\xb4\x28\x7f\xff\xb0\x82\x61\x3a\x8c\x08\x44\x96\x1f\x96\xf1\x30\xc2\x8f\x14\x11\x43\xb1\x66\x9c\x40\xca\x96\x94\x80\x68\xe7\xb1\x05\xfc\xe7\x8b\x3c\x37\x0b\xe8\xce\x72\x43\x1f\xd9\x54\xc6\x2e\x9c\x5b\x33\x39\xb0\xfd\x3c\xe8\xe0\x89\x69\xbd\x85\x08\x93\x8b\xc4\xb8\x43\x5e\x43\x78\x00\xb9\xa1\x1f\x83\x4a\xb1\xf5\x25\xae\xfd\x52\xa9\xdf\xed\x1e\x44\xed\xff\xa1\xef\x98\xbd\x1d\xa3\xb8\xb9\xef\xa0\xdb\xfb\xaf\x95\x4d\xf1\x81\x4e\xa4\x78\x20\x81\x7e\x19\xcb\x52\xfc\x23\x12\xa1\xe4\xc2\xf4\xb2\xfe\x8f\x02\xc3\xec\x2c\xe7\xdd\xa5\xf7\xbb\x57\x9d\xb9\x1c\xa8\x7b\x84\x92\xf9\x68\xee\xd3\x58\x3c\x80\xbc\xd0\xe6\x24\xfd\x3a\xb1\x72\x36\xbf\xa8\xeb\xfd\xf4\xe7\x8b\xa2\xa3\xb7\xf2\x98\x83\x5f\x5c\x13\x62\x50\xf1\xe4\x74\xe6\x0b\x35\xc4\xe9\xbd\xc4\xfd\x9b\xd5\x70\x7c\x02\x90\xda\x80\x65\x37\x8c\x70\xa3\x83\x1b\x4b\x2c\xd3\xe1\x06\x42\x06\xbe\x05\x96\xed\xf0\x2d\xbc\x10\xa3\xb0\xe6\xcc\x48\x0f\x4e\x8c\xbc\x71\x13\x6b\xde\x0c\xa4\xb8\x39\xe9\x6c\x1d\x77\x6a\x16\x5a\xc3\xf6\x08\x4f\x97\x1b\x2c\xef\xb9\xb9\x57\x83\x84\x8c\x7c\x29\x59\xc9\x59\x65\xf1\x8a\x6b\x7a\xe8\xfb\xbc\xd2\xd6\x57\xc3\xb2\xd6\x73\x78\x00\x39\xfc\xe7\x25\x02\x9c\x97\xa6\x7c\x39\x97\x6c\x54\x6c\xf7\xbf\x25\x75\xd7\xce\xab\x75\x4f\x7a\xb9\x76\xfb\x40\xb2\xea\x31\xbc\x52\xac\x82\x3f\xf3\x4e\xa4\xd0\xbf\x3f\x15\x5f\xb4\xc9\x66\xac\x7e\x63\x3a\x19\xb8\xab\x53\x10\x95\x59\xc6\x9f\x6e\x2f\x93\x98\x1c\x96\x2f\xac\x73\x3e\x76\x46\xc4\x77\xa7\xea\xa2\x9b\xb8\x77\x47\xd3\x0c\x1f\x70\x5b\xca\x43\x74\x6b\x9b\x0e\xb5\x13\xbc\x17\x73\xae\x55\x55\x3b\xc7\x99\x24\x50\xf6\x26\x3e\x9b\x2f\xfc\x8c\x07\x12\x04\xe8\xe4\x12\x94\x05\xf2\x72\xb6\x45\x18\x0e\x39\xfb\xa7\xf3\x3e\x5b\xb6\xb1\x59\x18\xb1\xe1\xe1\x97\x7c\x7e\xa9\x40\xca\xc5\xa8\x92\x09\x0f\xa0\x21\xf4\xa0\x7a\x32\xe7\x95\x72\xe8\xf4\x5e\xaa\xf5\xda\x5a\xfc\x3a\xc3\xbb\x39\x5a\xa2\xfb\x27\xd4\x3d\xfa\x7e\x46\x9a\xf8\x87\x94\x56\xe3\x72\x70\xff\x16\x15\xa4\xfc\x23\x0a\x39\x56\x5c\x60\x84\x03\xd2\xf2\x61\x45\x06\x59\x78\xc8\x3d\xb0\x62\x83\xb4\x31\x8c\xf0\x52\xc5\x0a\x0f\xbc\x54\x09\xe0\x5b\x60\xc5\x07\xbe\xc5\x10\x72\x5a\x13\xfb\xdc\xc2\x9f\xe9\x26\x42\xfe\xb0\x8f\x2e\xfc\x71\x1c\x09\x15\xd6\xe9\x05\x18\xb1\xfd\xf7\x95\xfa\x98\xe7\x17\xfe\xe4\x49\x44\x0e\xc1\x3e\xc2\xb0\x8b\x88\x47\x3c\xc7\x3a\xc5\x80\x74\xc7\xf4\xc8\x5b\xc7\xb1\x4e\x33\x00\x29\x09\x2f\x02\xa2\x9d\x92\xb8\x8c\x96\x2b\x44\x05\x55\x9b\xae\x1f\x49\xf6\x4b\x4e\xa7\x99\x59\x98\x66\x75\x9e\xb7\xa7\xa9\x96\xb9\x30\x79\xcd\xd5\x3d\x88\x5a\xc0\x25\xfd\x30\x1e\x40\x23\x68\x5d\xaa\x69\xa4\x66\x20\xcc\x40\x2e\xcf\xf9\xd4\xf6\xef\x37\x81\x0b\xe2\x4c\x42\x3a\x2a\xa3\x8b\x6f\xd6\x35\xde\xdc\x13\xcf\xce\x6a\x57\xc6\x03\x28\x1d\xbd\x49\xe7\x3f\x8f\x26\xd3\x3d\xcc\x2c\xf7\x10\xe1\xe1\x34\x59\x1a\x49\x27\xf9\xfc\xe1\x51\xc1\x79\x35\xd1\x23\xd3\x33\xee\xab\xf4\x15\x4d\x78\x00\x8d\xa3\x73\xfd\xf2\xdd\xa4\x6b\x97\x2e\xea\xd1\x7e\xae\xb1\x0d\xb2\x3e\xbe\xb4\x45\x7f\xbc\xa7\x25\xa9\xb3\x85\x70\x2a\xa5\x3e\xff\x67\xd4\x51\xd2\x9d\x04\x8b\x1e\x87\x8c\x27\x1d\xe9\x8a\xb8\x58\x1a\xdf\x71\x4b\xf8\x11\xef\xda\x32\xf5\x62\xa4\x82\x03\x17\x6b\x2b\xc7\x6a\xd4\x37\x16\xfd\x11\xd1\x4b\xb8\x7f\x73\x13\x99\x0d\x20\x5a\x05\x96\xa3\x30\x62\x04\x21\x0f\x58\xae\x22\x4a\x3f\xb2\xeb\xb0\x9c\x45\x14\x57\x64\xf1\x61\xb9\x8b\x14\x21\x5a\xe4\x5b\x0b\x58\x67\x57\x80\x94\xf8\x0d\x22\x86\x1d\xca\xdb\x8b\xd6\xee\x4f\x8f\x0a\x09\xb3\xf2\x6e\x43\x4e\x7d\x5e\x07\x16\xef\x33\x7b\xbd\x96\xed\x7e\x68\x40\xf2\x79\xee\x3a\x8e\xfd\x61\x95\x15\x07\x1b\x1e\x40\x55\xe8\x2a\x7a\x45\xe4\xa3\x59\xd1\x69\xc2\x32\xd5\x5c\x52\x52\xb3\x51\x3d\xbf\x72\x56\xc6\xe5\xd5\x8f\xe2\x73\x11\x57\x54\x9f\xf2\x1b\x1c\xa0\xc1\x03\x68\x0e\x2d\xde\x3f\xbf\x9d\xb3\x90\x1a\x51\x28\x49\xc2\xb7\x45\x9d\x9e\xca\xd8\x62\x5c\xc5\x7c\x98\x77\x46\xb4\xfa\x62\xbc\xf6\x98\xcd\x29\xc2\x3c\x3c\x80\x7c\xd1\xe9\xb5\xe7\x04\x49\xd3\x0b\xc9\xa3\xa4\x4c\xfb\x8b\x3f\x51\x28\xbe\xcb\xcf\x14\xea\xd1\xb3\x35\xae\x5b\xac\x75\x51\x61\xff\x55\x94\x1b\x86\x07\xd0\x07\xf4\x42\x5d\x9a\xb9\xe0\xe7\xa0\xd8\xbc\xfe\x34\x85\x9e\x8d\xc8\x3a\x53\x44\x83\x30\x44\xfd\x9a\xcc\xa9\x2b\x67\xf7\x7f\xf9\x1a\xe1\xec\x42\x8c\x07\xd0\x02\x9a\x97\x58\x86\x5c\xed\x28\x89\xab\xb4\xbe\xfb\x96\xde\xa7\xa5\xef\xfe\x05\xd9\x2d\x19\x02\xdb\xc3\xd5\x4b\x61\x91\xab\xda\x44\xd2\x64\x3c\x3b\x8f\x1a\x2d\xdc\x39\x14\x7c\x57\x1b\x75\x94\xd3\x9e\xf9\xd6\xff\x22\xa8\x7b\x85\x20\x4e\xf4\xc4\xf5\x34\xab\x55\xcf\xd7\x9f\x68\x5f\xf0\x32\x94\xf8\xe3\xfe\x2d\x8c\xf0\x03\xeb\x45\x84\x7b\xac\x40\xc2\x88\x2a\xa4\xa4\x63\x85\x12\x46\xcc\x21\xc2\x3d\x56\x30\x61\x84\x2f\x92\x91\xb0\xc2\x09\x23\x3e\x20\xdb\x01\x2b\xa0\x30\x62\x01\x21\x0e\x58\x21\x45\xb6\x1c\x42\x4e\xb0\xce\x59\x21\x62\xf6\x5e\x24\x4f\x62\x9d\xb7\x02\x52\xe4\x84\x54\x1c\x3b\x79\xb2\x02\xdd\x3c\x4c\x93\x55\xfb\xbd\xe5\x96\x4e\xdc\xff\xfe\x49\x42\xe0\x72\x8c\xad\x83\xaf\xed\x1a\xf8\xe9\xaf\x32\xa5\xe0\xe0\x73\x59\x9a\x6d\xcf\x4e\x89\x40\xf3\x50\xc1\x24\xd2\x7b\xb4\x2f\xd2\x8d\x1e\x57\xb2\xf5\x25\x9b\x66\xf0\x93\xfa\x3e\x69\x23\x99\x7e\xa6\x69\xf0\xea\x5b\x73\x5e\xd6\x81\x51\x3c\x80\xe2\xd0\x32\xb3\x43\xdd\xc4\x8b\x32\xba\xd9\x70\x15\x21\x4e\xd3\x0c\xcf\x06\x06\xa2\x57\xad\x3e\x69\x4c\x07\x95\xe5\xbe\x5c\xf1\x12\xba\x51\xf6\x19\x0f\xa0\x0d\xf4\xf6\x4c\xe8\x91\xa3\xcb\x34\x7b\xba\x29\x30\x0e\x49\x90\x49\xe7\x2f\xed\x99\x8f\xe4\xd9\x93\x3e\xf6\xd1\x47\xfb\x94\xb0\xcb\x93\x06\x43\x3c\x80\x92\xd1\x79\x72\xdf\x49\xd5\xd8\xbe\xfa\xda\x78\xda\xc4\x04\xf5\x2e\x8a\x82\x98\x65\x25\xda\x1a\xcf\x73\x22\x45\x55\xb6\x4f\xe9\x2c\x2f\x3d\xea\xc7\xfd\x9b\x9b\x70\x40\x2b\x10\x21\x07\xcb\x51\xa4\x80\x22\xac\x15\xcb\x55\x18\x11\x87\x48\x9b\x58\xce\xc2\x88\x0d\x64\x13\x61\xb9\x8b\x68\xd3\xb4\xcb\x7d\x74\xbb\x90\x53\xea\x26\x71\x21\xb6\x5b\x62\x91\x66\x66\xbd\x9a\x49\xfb\x42\xdf\x19\xca\x47\x1f\x14\x5c\xe0\x36\xad\x6d\xba\x58\xd5\x44\xe3\x0d\xa4\x7e\x6f\x6d\xbf\x0b\x3a\x88\x3e\xf4\xe3\x5b\xa2\x1c\xb1\xf4\xbe\xc3\xad\xb3\x7f\x2d\x2b\x6a\x74\x5b\xc4\xf0\x17\xd9\x6c\xd8\x86\x83\x15\xa1\xb6\x58\xa8\xe1\x63\x0b\xd4\xa5\x27\xc3\xa4\xe7\xd7\xaf\x4c\xe4\x3d\x78\xb4\xd7\x46\xa4\xa2\xd0\x8b\xea\x8e\x93\x2c\xe7\xd9\x77\x91\x1f\x07\xc2\x2f\xdd\x60\xf2\xdb\xb0\x03\x50\x24\xfa\x79\xd9\xbe\x28\xe4\x4e\xe3\xa3\xd2\x5b\xd6\x3d\x41\x64\xf3\xec\x7b\x8d\x31\xff\x4b\x9b\xbe\x92\xab\x2b\x33\x4c\x43\x6b\xdf\x5e\x56\x7c\x07\x50\x1b\x3a\x9b\x32\x78\x71\x7f\x95\xae\x5d\x25\xda\xbf\xf8\xc4\x44\xf2\xbd\x31\x2e\xf9\xde\x8d\x73\x59\xd4\x25\xfa\xc5\x0d\xe6\x16\xd6\xef\xae\x75\x00\xe8\x27\xba\xca\xbe\xd2\xb9\x70\xd7\xea\x52\xfd\xbe\x06\x39\xce\xec\x59\x41\x21\x25\xf9\xbb\x5c\x4e\x87\x86\x94\xb3\xc6\x63\x4b\x86\xab\xac\xb2\x20\x00\xa0\x58\x34\xd1\xde\xf3\x5e\x3e\xec\x2b\xdf\xd2\xd4\xe9\x2c\xd9\x63\x85\x87\xdf\xb5\xee\xf1\x36\xe7\x57\x57\xcd\xdf\x7e\x47\x32\x53\xa1\xfb\x29\x7a\x12\x40\x29\xe8\x4e\x5e\xea\xd5\x9c\x67\xae\x47\x62\x62\xc7\x29\xae\xda\x78\xcd\xe8\x6d\x19\x4e\x91\x25\x12\x97\xf1\x02\x21\xdb\xa0\x41\x49\x21\x5b\x7f\x34\x65\x1e\x6d\x9c\x33\x37\xb9\xda\x17\x53\x9e\x9c\xc2\x3b\x91\xd2\x64\x22\x7a\xf3\x74\x5c\x64\xee\xb7\xeb\x5c\x09\x2a\xc4\x8d\x2e\x3b\xf5\xfe\x37\x5a\xaf\xb1\xa6\x5f\x18\xc5\xdd\xfa\xb0\x90\x65\xc1\x22\xf7\xe1\x6e\x91\x1b\xb7\x7b\x5e\x6b\xb9\xe9\xad\x33\x59\x9b\x8f\x0e\x6c\x71\x43\xb9\x3b\x8d\x17\xfa\xfa\x76\x75\xd9\x13\x52\x17\x7e\x52\x34\xf3\x5e\x3a\xbb\x95\x45\x76\xc8\xf1\x63\x4c\xc8\x03\xb3\x80\xa7\x94\xb9\x23\x83\x75\x2c\x2a\x0c\x78\x00\xd5\xa0\xe3\xae\x47\x34\x18\xd9\x9b\x3b\x11\x74\x6b\xc8\xef\x96\xd7\xc0\xb9\xc8\x48\xe1\xd6\x50\x73\xff\x9f\x1e\x37\x05\xef\xd5\x09\xf3\xdc\x2f\x03\x00\xf2\x45\xcf\x63\x1e\xcb\xbd\x91\x33\x6b\x98\x7b\xd1\x77\x82\xa0\x4b\xcc\xcb\xdf\x27\xfc\xdb\x23\x57\x89\x71\x5a\x7b\xd1\xea\x00\xca\xd7\x2e\x0c\x39\x00\xea\x41\x3f\xa7\x6e\xa6\x6f\x66\xfb\x12\x15\xf8\x83\x28\x08\x86\x18\x74\xc2\x95\x4c\x33\xfb\xdb\x1f\x39\x73\x7b\x7e\xd8\x94\x1e\xf7\xfa\x70\x0a\x5d\xf0\xc2\x0d\x24\xfb\x2c\x2b\x99\x8c\x6b\x39\x98\x6e\xa9\x8a\xd9\x32\x07\xa8\x88\xd6\xeb\xac\x59\x0c\x7f\x01\xca\x5d\xe7\xfc\x45\x71\x76\x40\xe2\x06\xea\xf2\x47\x93\x47\xf6\x8d\x9d\x57\xac\x71\x0e\xb5\x2b\x51\x9f\x14\x51\xd3\x14\x5d\xd7\xe9\x9e\x12\xfd\x11\x5f\x1d\x45\x93\xcd\x73\x40\x10\x40\xa5\x68\x29\x44\x05\x6f\x77\xd1\x81\xfd\xce\xf3\xf0\x46\xe8\xf2\x6d\x57\xf5\xf7\xdf\xf7\x79\x69\x88\x75\xdb\x0f\xc5\x58\x7e\xf6\x75\x76\x65\xfb\x09\xa0\x45\x74\x1b\x67\x3b\x21\xd5\x9f\x79\x47\x65\xc6\x56\x73\x82\x8d\x81\xfa\x72\xc3\xd4\x6c\xc7\xac\x57\x50\x81\x9b\xa4\x0b\x45\xd3\xe1\xf5\x83\x37\xed\x00\x14\x84\xbe\xfe\xe3\xb3\xa9\x49\xd7\x72\xc1\xa2\xe1\xc8\x02\x7b\x45\x5c\x04\xe9\xbd\xbd\x27\x93\x6e\xf7\xdd\xe6\x78\x4d\xd0\x4d\x64\x68\x6e\x61\x0b\xa0\x44\x74\xb6\x0c\x3d\xa0\x7e\xea\x8a\x43\x8d\xaa\xad\xd6\x9d\x6c\xbd\x82\xcd\x76\x81\x9e\x74\x8b\xc7\x7b\x9b\xa6\x98\x82\xbd\xd5\xf4\xd8\x1f\xce\x03\xa8\x1c\x5d\xab\x69\x49\x6b\x1d\x1f\x95\xca\xd6\x7e\xea\x8e\xe6\xfa\x5d\x3c\xf4\x59\xf7\x47\x59\x7e\x96\xf0\x7e\xdc\xe5\x0f\xe6\x1e\xbd\x0d\xd5\xeb\xa8\x4b\x73\xe7\x6d\x38\xcd\x3d\x7a\x8d\x3f\x6c\xf8\x8d\xac\x3e\x23\x74\xcc\x2f\x12\x11\xd5\xbd\x6e\x23\x17\x72\x27\x7a\xa4\x43\x75\x76\xc1\x0e\x40\xe1\xff\xf9\x27\xd0\xc4\xf1\xb3\x9a\x73\xc9\x4f\x13\x1a\x6c\xe4\x7a\x95\x0a\xee\xfe\x30\x78\x4c\xf6\xf2\xd6\x6a\x5e\xf6\xef\x65\xb1\x07\x34\x5e\x3c\x00\x4a\xfc\x8f\x9f\xb7\x33\x8a\xd7\x04\x9f\xdf\xcc\x92\x9e\x96\x50\x7a\x96\xf3\x2a\x06\x1f\xa8\xb2\x98\xc4\x5e\x2b\x5a\x74\x9f\xe1\xfe\xc2\xaa\x28\x80\xe6\xd0\x97\xaf\xfa\x51\xad\x72\x10\xf8\x79\xc8\x57\x1c\xdb\xc7\x76\xc0\x07\xba\xc5\x68\xb0\x6a\x76\xec\x2c\x31\xdb\x48\xb5\xdc\x72\x68\x6e\x0d\x1e\x40\x9b\xe8\xd5\x78\x58\x62\xaf\xe4\x7a\xe6\x7e\x25\x0b\xab\x10\x89\x16\x42\x6f\xf9\x5a\x39\xf1\xd4\x37\x6f\x63\xf2\xf6\x64\x5d\x8a\xfd\x51\x53\x5f\x04\x00\xe4\x87\x0e\xcc\xe0\xdb\xf1\x17\xb2\xe5\xcf\x79\xaf\xb9\x2f\x27\xfd\x2a\x3e\x5e\x42\x31\x74\x9b\x7d\xeb\xe9\x11\x17\xff\xed\xa7\x25\x09\xd1\x94\x87\x00\xb4\x8c\x5e\x62\xee\x39\xfc\x2b\x40\xec\x6d\x85\x8f\x39\xbd\x6d\x93\x7d\x19\x95\x7c\x61\x5f\xb0\x77\x09\xf9\xeb\x91\x8d\x9a\x8f\xef\xef\x15\x9c\xc5\x03\xa8\x0e\x9d\x36\xa8\x43\xb8\x2f\xd4\x9e\x79\xa4\x65\xa8\x4b\xca\xd2\x1d\x74\xc0\xba\xd3\xeb\xe2\x96\x5e\x51\x70\xe1\xb2\xc8\x03\x41\x9a\xe0\xf4\x74\xf4\x99\xf3\x1b\xbd\x8d\xb6\x5c\x1e\xa6\xd5\xd4\x8b\x2f\x13\x2b\x65\x83\x69\x4b\xcc\x4a\xb3\x92\x1f\xf6\x8b\x3a\x5a\x11\x65\x46\x6f\xdc\xc1\x03\xa8\x1e\xfd\x67\x83\xf5\x01\x52\x5a\x23\xcd\xbb\xfa\x62\x8c\xd4\xa6\xfe\x41\x4b\xa4\x1b\x62\xea\xde\x5e\x6e\x76\x45\x4f\x83\xf6\xf4\xf3\x04\xdd\xd4\x41\x1f\x39\xd2\x14\xc8\xc8\x8f\xf9\xfa\x3a\xd2\xd6\xad\xef\xb4\x7b\x91\xb6\x58\x80\xbe\x63\xb7\x31\x3b\xa7\x04\x44\xcf\xa8\xe9\x1b\x2a\x86\xba\x54\x83\x98\xac\xf5\x16\xbd\xaf\x71\xce\x5d\xfb\x9e\xe8\x75\x65\xa9\xba\x11\xfe\x45\x89\xdf\xcf\x7e\x69\x3d\xaf\x2f\xa4\xe2\x25\x30\xc2\x03\x28\xf1\x3f\x5f\xd3\xad\xb3\x7e\xa3\xa7\xae\xcd\x11\x50\x5f\xd1\x2c\x47\xd4\xf0\xe0\x84\xc0\x4b\xb1\x90\x2b\x2f\x38\x82\x5f\xa6\x6d\xda\xcb\x45\xed\x54\xe1\x49\x74\x57\xb0\xaa\x5e\xa0\x7f\x63\x91\x29\xf9\xbc\xdb\xc5\x4f\xb3\x65\x2d\x5f\xf3\xb6\x2d\x9c\x7c\x03\xee\x44\xdf\xdd\x28\x90\x3f\x72\x73\xf5\x02\xea\xd2\x95\x00\x5c\xff\x97\x81\xb3\x8b\x6c\x45\x73\xfc\xd5\x8c\xdc\x3e\x8f\x2e\xd3\x9d\xe6\x91\x8c\xd8\xe2\xf7\x54\x75\xfa\x1c\x62\xfc\x08\x00\x08\x8f\xee\xa7\x07\x02\xe4\xda\xc3\x7c\x3e\x73\xae\xca\x95\x70\x31\xca\xd8\x68\x1c\xcd\x86\x46\xba\x48\xf8\x1a\x92\x2e\x1e\x3c\xf2\x20\xc7\xfa\x19\x80\x5c\xd0\xfd\x80\xf4\xe7\xeb\x24\x47\x32\x1e\xd9\x66\x0c\x48\xe7\x27\x2b\x90\x50\x6e\x7c\x90\x1e\xe0\xca\x65\x0f\xc1\xb5\x0e\x12\xc8\xb8\x76\x2d\x02\x00\xbd\x45\xaf\x73\x6d\xb5\x9b\x19\x05\xe6\x04\xce\x8f\xbf\x7f\x9f\x13\xeb\x70\x7c\x1b\x66\x73\x90\x9a\xa0\xb6\xf7\xd2\x81\xe4\xe6\x0c\xa9\x85\xb0\x36\x00\x75\xa0\xad\x79\xbc\x3a\x2d\x5b\xea\x9f\x61\x1a\xee\x9a\xa1\xe3\xff\x40\x4b\x32\x4a\x50\x4a\xee\xf5\xd5\xe9\x36\xf3\x09\xc5\x1a\xa7\x87\x2c\x73\x00\x40\x3e\xe8\xee\x7b\xaf\xac\x37\xc3\x5d\x91\x1b\x73\xe6\x36\x3a\x91\xdd\xda\x2f\x12\xf6\x24\x4d\xbb\x69\x3e\x3c\x23\xf6\xf6\x9a\x6a\xf6\xc1\x83\x7b\xf7\x00\xa8\x19\x1d\x47\xb6\xe1\xec\xb0\x9c\xd2\xc3\xb6\xea\xa7\x79\xeb\x67\xc5\x2a\x1b\x3d\x8d\x0e\xee\xab\xac\xce\xaa\xb0\x98\xb6\x2f\x5f\xb8\xd2\xf1\x16\x75\xa9\x80\xd2\xa9\xf2\x57\x51\x81\x10\x7d\xb9\x4b\xf7\x53\x16\xc6\x3b\xa2\xf7\x82\x2a\x7e\xd6\xc4\xa9\xf1\xcc\x38\xc9\xc4\x4d\x15\xad\xd8\x01\xc8\x0b\xdd\xa7\xe7\xfc\xb4\xb6\x0b\xf1\x38\x2b\xba\x68\x73\x94\x4c\x5d\x9e\xb5\xb0\xec\xf9\x46\x6a\xb4\x6a\xd0\x2c\xad\xc5\x01\xdc\x7b\xd3\x26\x7a\x00\xd5\xa3\x2f\x3f\x50\x6e\x3c\xcb\x6f\x2f\xd2\xad\xaf\x74\xcd\xba\x49\x2a\xc5\xfe\x19\x5f\xf2\x23\xbb\x2a\xab\x53\xdf\x48\x9e\x72\xe6\x52\x3c\xba\x0f\xa0\x25\xf4\x0e\xc2\x55\x09\x98\x71\xa8\x5e\xfb\x60\x90\x78\x8d\xde\xdf\x91\x2f\x93\xd5\xe8\x93\xeb\xb3\xb4\x91\xcb\x2a\x13\xdb\xd9\x05\xcd\x79\x38\x58\xe0\xc6\xea\x14\x80\x94\x38\x91\xfd\xff\x04\xee\x1e\x74\x21\x2d\x38\x92\xc8\xa5\x68\x4d\x35\xab\xc6\xea\x1c\x62\x1a\x7c\xc5\x27\xba\x56\xba\xf0\xda\x5d\x9e\x7c\x6f\xed\x60\xb9\xf5\x79\xf2\x97\x78\x00\x45\xa1\xf3\x45\x4b\xd3\x29\x45\xca\xcd\xdb\xbf\x0d\xe5\x4d\x9b\x1e\xe4\x14\xab\xf3\xe0\x68\x87\x04\xa5\x4f\x26\x89\x70\xa9\x26\x9d\x20\xab\xf0\xc2\x03\xe8\x1b\x7a\xd5\x3c\xfb\xce\xb1\x66\x16\x4e\x75\xf4\xae\xf9\x00\x5b\xe3\xa4\x3b\x97\x7d\xe2\x8d\x97\x07\xcf\xf0\xdf\x36\x56\x3d\x60\x6e\x30\x47\x55\x85\x07\x50\x2e\x3a\x4f\x4f\x16\x4f\x7c\x2f\x9f\x84\xf2\xbf\x1d\x74\xf9\x3e\x7c\x34\x3e\x71\xa4\x5e\x3f\x53\xe8\xb0\x8d\x86\xba\xd7\xc9\x0e\x8f\x63\x35\xf0\xc7\xcb\xb1\xcc\x06\x90\xf8\xee\x24\x03\x91\x61\xb0\x0c\x87\x11\x51\xc8\x69\x3f\x2c\xd3\x61\xc4\x37\xa4\x27\xc4\x32\x1e\x46\xe4\xee\x59\x6e\x26\xfa\xb7\xae\x0d\x48\x91\xda\x56\xfd\xef\x5c\xdd\xe0\x7f\xbe\x7d\x72\xbf\x8a\x8e\x6b\xa8\xf4\x51\x00\x65\xa8\xb8\x41\xec\x13\x62\xea\xdf\xed\x47\xd9\x4d\xd7\xea\x8d\x25\xab\xa4\x4a\x12\xf5\x9f\xef\x38\x82\xfe\x63\x56\x07\xd3\x58\xcf\xb1\x58\x86\xea\xe7\x12\xa6\xd2\x46\xe5\x9e\xe1\x49\xe4\xcb\xc5\x1e\xb1\x41\xae\x72\xdf\x94\x9b\x46\x7b\xf2\x54\x76\x08\x3d\xba\x8c\x7c\x33\x3a\xd9\x5b\xd2\xd9\x29\xdb\x51\x60\xdc\x45\xb5\x9e\x71\x26\x8c\x61\x30\xca\x2e\x46\x42\x58\xf7\xc5\x78\xa5\x56\xcb\xbd\x5a\x3c\x80\x1c\xd1\x5d\x07\x95\xa9\x21\x6e\x6d\xce\xb4\x71\x3e\x84\x6e\x44\xd1\xbd\x6e\xc2\x68\xff\xfd\xf3\x92\xd2\xf9\x99\xef\xfb\xce\xcb\xec\x7f\xfd\x25\x12\x0f\xa0\x0c\x74\x72\xa0\xeb\x73\x7d\xc9\xd2\x98\x79\x56\x56\xe4\x2a\x39\xb5\xbc\x65\xce\x49\xeb\xb1\xdb\x5a\xaa\xf3\xc7\xf5\x29\xd4\x5b\x4b\xa5\x57\x2a\xf1\x00\x02\xe8\xed\xeb\x10\x5e\x28\x3d\xec\x82\x9f\x91\x7e\x43\xf4\x5b\x61\xb8\x35\x63\x2a\xf6\x3e\xff\xa3\x96\x2f\xdf\xd2\xd7\x3d\x5f\x7f\x6e\xd8\x73\x13\xf7\x6f\x61\x81\x1f\xc0\x20\xa2\x9c\x61\x05\x06\x59\x16\xc8\xe4\x13\x2b\x34\x30\x22\xe0\xef\x37\x88\x31\x82\x03\x23\x1c\x11\xf6\x8c\x15\x1e\x18\x91\x81\x88\x49\x58\x01\x82\x11\x00\xa1\x55\xd8\xfd\xff\x2e\x22\x12\xd9\x10\xd8\x14\x60\x17\xd1\x86\xf8\x81\xc9\x02\xfe\x20\x7e\x22\xf2\x13\x36\x0f\xd8\x45\xc4\x22\x93\x2b\x2c\x2a\x00\x23\x52\x48\x11\x86\x8e\x45\x09\x80\x54\x14\x2f\x81\xed\x0e\x43\x6f\x46\xe7\x26\xa1\x08\x20\xbb\xde\xf2\x6d\x5f\x79\x9a\x4a\xf4\x85\xa7\x5a\x2c\x87\xc3\x8e\x67\x38\x09\x12\x9f\x78\xa7\xf1\x4a\xfb\xc2\xcf\x0e\xb9\x9d\x65\x82\xae\xf5\x91\x4a\x45\x86\xf1\xfb\xb4\x8f\xce\x8c\xc6\x7f\x65\xb0\x93\x60\xb4\xbb\x64\xd4\x73\x30\xb8\xb5\x79\x8b\xf9\x19\xd9\x31\xb7\x96\x9d\xe6\xc7\x13\x5d\xd2\x62\x9e\x9b\x1e\xb0\x7c\xc8\xed\xea\xfb\x23\x3a\x43\xfb\x92\x10\xe9\x92\xdf\xbd\x6a\x3a\xaa\x41\x99\x95\xaa\x01\xdf\xb1\x1b\x0a\x1a\x3b\x0f\x1c\xcd\x99\x62\x59\x1d\x1b\x32\x23\x8e\x08\x0e\xbd\x7d\xff\x28\xe4\x83\x9c\x43\xbb\x99\x68\xd9\xe9\x00\xe2\x02\x6a\x3c\x2f\x63\xa0\xa5\x78\xe1\x0e\x27\x46\x27\x8d\x6b\x11\xfb\xae\x3a\xdd\xca\x7a\xf8\xea\x8e\xf8\xe3\xab\xe1\xcd\x6c\xc7\x07\xa6\x6a\x7b\x2a\x8d\x5b\x4f\xcf\x93\x7a\x48\x50\x0f\xc3\xdf\x77\xc6\x72\x13\x0e\x68\x33\xc2\xb7\xb1\x1c\x45\x36\x11\x72\x18\x00\xcb\x55\x18\xe1\x89\x88\x3d\x58\xce\x22\x5b\x02\x59\x18\x58\xee\xc2\x88\x6d\x24\x19\x60\x51\x3f\x18\xf1\x1b\x99\x76\x63\x91\x3f\x18\xe1\x87\x20\x30\xe9\xdf\x1f\x44\x0d\xb2\xed\xb0\x09\xe0\x2e\xc2\x17\x19\x52\x60\x71\x40\xa4\x3a\xfe\x7d\xa1\x16\x16\x17\x04\x52\x84\x1c\x24\xe4\x3b\xed\xc3\x0a\x7a\x89\x7f\x71\x7e\x94\x75\xad\x7f\x72\x50\x50\xcc\xa7\xc9\x56\x07\x7c\xfd\xb2\xb8\x94\xc5\xfe\x3e\xa8\x36\xef\x1a\xad\x0d\x4b\xbf\x3d\x19\x1e\x40\x21\x68\x11\xca\x38\xdb\x84\x22\xbf\xf4\xc3\x04\x27\x11\xad\x9f\xae\x23\xa1\x55\x90\xd5\xf4\xb6\x72\x99\x69\x68\x11\xb9\x35\x1f\xf9\xcb\x85\x12\x3c\x80\x36\xd0\x4b\x56\x76\xb4\x5a\x24\xeb\xb4\x91\x9f\xde\xa8\xc8\xfc\x3e\x6f\xf2\xb4\x44\x66\xee\xfd\x3f\x1d\x25\x42\x24\xc6\x1f\x3c\x1d\xa5\xea\xe7\xc4\x03\x68\x19\xfd\xfb\x2f\x2c\x42\xf9\xce\xa9\xaf\x89\xa7\x6a\xb2\xba\x48\x95\x57\x30\xff\x36\xcd\xc9\x4b\x4f\xbf\x37\x15\x21\xfb\xe9\x73\x75\x04\x77\x05\xee\xdf\xcc\x86\x03\xb4\x82\x2c\x58\x2c\xc3\x61\x44\x08\x22\x29\x61\x99\x0e\x23\x36\x90\xe5\x87\x65\x3c\x8c\x58\x46\x5e\xd4\x8a\x4d\xc9\xff\x87\x90\xb8\x81\x0c\x8c\x31\x49\xf9\xee\x2d\x4a\x91\x31\x3f\x16\x2f\x87\x11\x8b\x48\xb9\xc3\x66\xe6\xbb\x88\x20\x04\x81\x4d\xce\x77\x11\x89\x7f\x3f\x0d\x86\xc1\xcf\x61\x44\x39\x05\x72\x98\x08\x8b\xa7\x03\x48\x8a\x75\x67\x7d\x7b\xa0\xc5\x97\x0c\x51\xf3\xfe\x43\x6c\xa7\x2a\xe6\xae\xa4\xf9\x90\xcd\xdb\x9f\x1d\x50\xa7\x37\x7d\x44\x2b\x7a\xc3\xd1\x72\x50\xeb\xca\xde\x67\x3b\x29\x7f\x15\xdd\xd7\xdc\x4a\x1c\xfd\x5e\xed\x1b\x3a\x3b\x7d\x56\x0c\x58\xaa\xea\x1d\xf5\x90\x62\x93\x55\x92\xe5\x1e\xb7\x39\x6a\xcd\xdd\x08\x7e\x49\xe2\x01\x54\x89\x6e\xbf\x3b\xe2\x56\x4e\x24\xb5\x6b\x69\xe3\xd8\x1f\x8f\x58\x17\x0d\x7f\xa8\xfc\x58\xf3\xa2\xe2\xd4\xaa\x90\x8d\xee\x51\x91\xae\xfc\x0f\x01\x78\x00\xf5\xa1\xf7\x83\x9f\xe7\xed\x3c\xaa\x30\x4b\x3d\xb6\x53\x7b\xe3\x07\xea\x75\x5f\x85\x88\x66\x13\x9c\x65\x5f\xd5\xb8\x58\x1c\xea\x13\x34\xd6\x72\x0b\xf7\x6f\x66\xc3\xe1\xf1\x40\x52\x06\x96\xe1\x30\x62\x15\xe9\x38\xb0\x4c\x87\x11\x95\x48\x0b\x8e\x65\x3c\x8c\xe8\x43\x76\x04\xb6\x56\xb2\x8b\x08\x47\xac\xc2\x96\x4b\xfe\x2c\x25\x64\xf1\x61\x29\x26\x30\x62\xee\xef\xeb\x35\xb1\x34\x93\x3f\x88\x4d\x24\x85\x63\xab\x26\x7f\xca\x04\x32\xa9\xc0\x12\x4e\x90\x5c\x80\xcc\x4f\xb0\xa4\x13\x18\x51\x47\xb7\x3c\x4d\xf8\x6f\x12\x0a\x90\x14\x27\x90\xb2\x03\x00\xea\x43\x13\x58\xbb\xea\x40\x4a\x1f\xaf\x6f\x0d\x24\x5a\x0f\xdd\x24\xca\xf7\x0d\x8c\x8f\xed\x65\xbe\xe6\x29\x48\x3d\xf4\x99\xfc\xdb\xba\x60\x50\x2b\x80\xb6\xfe\xf3\x6a\xa6\xd3\x63\x02\xb5\x4a\xca\xbe\x1a\xe4\x45\xcd\xdf\x93\x5c\x8c\x68\x24\x67\x55\x6f\xce\xd3\x97\xd4\xe1\x87\x88\x4c\x82\x32\x9a\xf1\x40\xe2\x1e\x5a\x90\xaa\xb1\x6a\xea\xd0\x24\x96\x8c\xa7\x17\x19\xf0\x7d\xab\x7c\x76\x5a\x99\xf9\xc2\x38\xa4\x64\xbd\xf8\xae\x33\x6c\xdd\xd9\x54\x08\x0f\xa0\x01\xb4\xfc\x3a\x4d\xfc\xbc\xb6\x2d\xd8\xf2\xe9\x60\x4d\xcf\x7c\xfd\x1b\x63\x5b\x29\xae\xd2\x19\xfe\x76\x17\xc2\xb3\x53\x3f\x52\xad\xb6\x48\x3c\x70\xff\x6a\xf4\x9f\xb5\x87\x4c\x7e\xb0\xec\x86\x11\x5b\xb4\x70\x36\xc6\x32\x1d\xce\xc6\xf7\xe0\x5b\x60\xd9\x0e\xdf\x62\x00\xe9\x1e\xb0\x44\x2c\x18\x51\x4f\x83\x1c\xa1\xc2\x12\xb3\x80\x24\x44\xf7\xbf\x37\x65\x06\xa2\x7b\xcb\x22\x01\xb6\x81\xb5\x7e\xdb\xe1\x3a\x4e\x2b\x2b\xa9\xeb\xe9\x96\xfd\x04\x95\x1c\x0f\xc6\xc8\x9e\xe9\xaa\xdd\x23\xb4\x0a\x2e\xf4\xc5\x03\xc8\x0b\xdd\xbb\x56\x54\x5c\xe6\xee\x3e\x6a\x14\x21\x92\x73\xcf\xe0\xfe\x7a\xf1\x40\xdc\xfe\x0b\xdd\x1b\x83\x53\x75\x26\x61\xd5\x9b\xa6\x36\x4f\x15\xf0\x00\xea\x40\x37\x0e\x61\x6c\x74\x37\xed\x2d\x93\xcf\x5b\x53\x69\x35\x91\xf9\xe8\xfb\x1c\xd4\xa6\xe5\xaa\x93\x59\x35\x29\x8f\x08\x94\x7e\xe2\xff\x92\x6a\x27\x39\xa1\xed\xe9\xcd\x96\x69\xb1\x72\xc9\xd4\x2e\x9f\x6d\x9c\x64\x5a\x9b\xda\x6c\x38\xcc\xf3\xb1\xcf\x28\xa0\xa2\x72\x6d\x61\x49\x98\xe7\x4c\x3e\xee\xdf\xcc\x86\xe3\x13\x88\x74\x89\x58\x86\xc3\x08\x2f\xa4\x13\xc5\x32\x1d\x46\x74\xfc\x7d\xb5\x2b\x86\xf1\x48\x3a\x66\x5e\x4e\x23\xfe\x37\x5d\x11\x48\x71\xb8\x52\x12\x38\xe1\x01\xd4\x89\x96\x5b\x68\xe8\xdf\xed\xa3\xe0\xea\xbf\xe7\x41\x35\x52\x2d\x36\x55\xc0\x44\xd6\x1b\xdb\xab\x2e\x4c\x5e\x5b\x97\xd9\xb1\xd6\x92\xd8\x74\x7d\xa7\x41\x46\xf7\x4b\xd4\x5f\x92\x5b\xb3\xda\xf7\xd9\xb1\xde\x3a\x1f\xdc\x4e\x98\x8f\xaf\xb4\xa5\xd4\xfc\xac\x64\xaf\x16\x91\xa5\x04\xde\xd3\x8e\x94\xed\xf0\x58\x34\xcf\xa7\x3d\xe2\xc7\x76\xf5\x26\xc9\x27\xf6\x3c\x45\xb9\xb0\xe0\x5c\x88\xbf\xf5\xd2\x58\xf2\x81\xef\xb3\xa6\xc3\xa9\xfb\x39\xbd\x4d\xa0\x9d\x3c\x89\xae\x9f\x7e\x41\x7a\x3a\x0e\x9e\xdc\xed\x67\x7a\x63\xbe\x9a\x2c\x73\x69\x3d\x10\xe3\x01\xae\xec\x0f\x67\xbf\x66\x36\x0f\x69\xff\x8e\x3e\xb3\xc3\x48\xd1\xf5\xf0\x05\x8f\x88\x88\xe5\x21\xc3\xf4\xb3\x4f\x5c\x82\x9f\x48\x39\xde\xa8\x9d\x1e\xbc\x6f\xe4\x47\xb5\xd0\x3e\xa7\x35\x65\xbb\xf6\xe1\x32\x1e\x40\xde\xe8\xeb\xa1\xb4\x93\x5b\x7b\x57\xbd\xfa\x1e\x29\xf7\xe4\x28\x7b\x3c\xe0\x9a\x4a\x23\x69\x34\x8a\xa4\xd8\xd8\xfc\x5a\xd4\x53\x10\xe0\x34\x0f\x00\x54\x88\xd6\x11\x9e\xf0\x4b\xe7\xfe\xfc\x72\x72\xb3\x3a\xb4\xa9\xf6\x76\xf6\xf3\x61\x23\xea\x0d\x05\x2b\x0b\xc7\xd2\xb6\xaa\xca\x9c\x3d\x0b\x57\xd2\x00\xb4\x86\x36\x5f\x64\x94\x82\x60\x48\x33\x82\x5c\xa1\x2c\xe4\xa9\xfe\xa8\x00\xb7\x45\x4b\xaa\xc1\x51\xbe\xd3\xe6\x15\x03\x63\x50\x89\x63\xfc\x5e\xdc\xbf\x45\x1d\x7e\xbe\x9d\x88\x52\x84\x15\x77\x84\xcd\x20\xed\x24\x56\xe4\x11\xd9\x01\x21\xdf\x58\xb1\x47\x0a\x1b\xd2\x04\x60\x45\x1f\x11\x11\x90\x92\x8e\x19\xff\x3f\x08\x6f\x04\x81\xfd\x04\x76\x11\x85\x88\x50\x81\xf5\x10\x60\xc4\x1a\xe2\x07\x96\xc8\x8e\x34\x01\xc8\x0e\xc5\x92\xd9\x61\xc4\x24\x23\xd2\x4f\x62\xca\xed\x92\xe4\x04\x12\x76\x78\x00\x39\xa2\xa7\x62\x66\x5c\x94\x3c\x1a\x69\x84\xd5\x6b\x1f\x70\xaa\xd2\x3c\xa2\x97\x24\xbf\x25\xcc\x54\x3e\x4e\xcf\xea\xfa\xf0\x6b\xcf\x16\xaf\xae\x33\x00\x50\x26\x3a\xef\x49\xd5\x05\x77\x4a\xf5\x12\xfc\x38\x6b\xd6\xfd\xdc\xf8\xf4\xfe\x47\x77\x23\x4a\x69\x98\xd8\x7d\x0c\x05\x05\x85\x9b\x83\xd3\x26\x1f\x00\xa8\x01\xad\xa2\x3f\x3f\x47\x44\x2b\xb3\x0f\xca\x4e\x21\x23\x35\x39\xca\x9b\x5f\x35\x30\xf2\x5a\xfe\xe7\x80\xff\x18\xa7\x3a\x2e\x96\x81\xb8\x68\x12\x0f\xa0\x62\x74\xf5\x2c\x99\xbf\x59\xec\x26\x93\xdd\x74\x4b\xce\xdd\xc3\xc0\xce\xce\xea\x0a\x91\x09\xb4\x41\x99\x27\x34\xef\xa9\x47\xa7\x23\xec\xb1\x85\xfb\x47\xab\x61\x05\x0b\xa1\x0d\xd8\x76\xef\x22\x32\x91\x44\x8c\x65\x3a\x8c\x68\x40\x4e\xa5\x60\x19\x0f\x23\x8a\x91\xf2\x89\x3d\xf2\xd8\x45\xe0\xff\xfe\xfb\x02\x6b\xea\xf1\x07\xe1\x82\x6c\x6d\xec\xb9\xc7\x2e\xe2\x2d\xd2\xb3\x62\x8e\x3e\xe0\x82\x82\x58\x85\x3d\xfc\xd8\x45\xf8\x20\x45\x0b\x6b\xfe\x81\x88\x3a\x7f\x17\x38\xd6\x1c\x04\x48\x8a\x13\xee\xdd\x69\x1c\x52\xd1\x15\x25\xbf\xa8\xfd\xd8\xf8\xa1\xcb\x93\x87\xcb\x3b\xb2\xa4\x02\x44\x48\xb2\x6a\x82\x7e\x3c\x63\xbd\xa8\xcd\x90\x38\x33\xd9\x12\xcd\x53\x88\x07\x90\x03\x5a\x54\xe3\xa1\xf8\xf9\xfb\x90\x1b\xef\xa9\x4b\x4c\x32\x3a\x63\xea\xe9\x9f\xf8\x98\xde\x25\xce\x31\xbc\xba\xc6\x9c\xa6\x92\x80\x9f\x95\xda\xa9\x10\xee\xe8\x0a\x44\x39\x7e\xfe\xbe\xc9\x8c\xff\x84\x13\x65\x73\xb1\x4d\x51\x9c\x88\x49\x45\x80\xee\xc4\x28\x67\xa0\x11\x95\x06\xbf\x92\x19\xe1\x1d\x3c\x90\x38\x80\xba\xfc\x2d\x14\xaa\x6f\x43\xda\x74\xfc\x19\xb3\xc0\xda\x50\x33\xa7\xde\x7c\x99\x8e\xd0\xf7\x97\xd9\xd9\x19\xfd\x74\x35\x2d\xaf\xa3\x18\x71\xff\x66\x35\x1c\x9e\x54\x24\x1f\x63\xd9\x0d\x23\x1c\x10\xce\x8a\x65\x39\x8c\x70\xa7\x87\x1b\x4a\x2c\xe3\xe1\x86\xf2\x00\x7c\x0b\xec\x51\xd4\x9f\x66\x06\xe9\x72\xb1\xa7\x51\x7f\x1a\x4a\x04\x81\x35\x90\x82\x11\x4b\x84\xcb\x8d\x0c\xbb\x90\xef\xa1\x57\x59\x83\xe6\xde\x6f\xd4\x84\x27\x15\xdc\xaa\x79\xa1\x3e\x7d\x74\xae\xe1\x8d\x40\x4e\xc7\x7b\xbb\x34\x6d\x59\x9b\xf4\x49\x20\x35\xb4\x6d\xb3\xf5\x9f\x83\x2f\xbc\xc7\xd9\x75\xec\x8d\xf6\x68\xa9\xd4\x05\x92\x8e\x9f\x73\xa2\xee\xca\x1e\xa4\xd3\x72\xba\xe2\x7a\x8a\x91\x44\x97\xd7\x7c\x02\xfd\x88\xb9\xfa\x64\xce\xee\xa3\x6e\x74\xcb\x0f\xfc\xa2\x3c\xd1\x42\x13\x59\x26\xb6\x1d\x57\x8e\xd3\x32\x97\x4d\xd8\xa0\x7c\xd9\xd7\x5f\x0b\x00\xd4\x8b\x9e\xa8\x45\xe7\x35\xab\xbb\x7c\xcc\x76\x03\x24\x75\x8f\x8e\x37\x89\xa5\xaf\x84\x65\x70\xa6\xe9\x8e\x0e\xbd\x31\x4c\x67\x99\x2b\x62\x3f\x01\xa0\x51\x74\x8b\x51\x76\xf2\x55\x84\x4e\x61\xab\x0c\x8b\x9f\xc9\x8a\x0f\x41\x18\x1f\x25\xed\x89\x0f\x4d\xf9\x2c\x54\x59\x61\xbc\x02\x91\x37\x8f\xcd\xda\x01\x89\xf3\xe8\x53\x8d\x53\x1f\x2a\xaa\x95\x29\xb8\xa8\x35\xa3\x12\x49\xbb\xdb\x7e\xe5\x5f\xf4\x4e\x19\xab\xd2\x54\x7b\x6e\x1e\xae\xb7\x96\xf4\x9e\x0a\x40\x25\xe8\xe5\x5f\x56\x96\x62\xfc\x4d\xd8\x7a\xf6\x2d\x69\xd0\xc5\x87\xc2\x33\x0e\x19\x0f\x9c\x45\xae\xb3\xc6\x6b\x3c\x4b\x15\x3c\xf9\xe4\x6d\x6f\x03\x80\xd6\xd0\x6d\xb6\xf2\xb3\x9f\x6c\x65\x09\x91\xe4\xc2\xe2\xcb\x16\x27\x15\x0f\xea\xad\x99\xff\xf2\x27\xfe\x92\x8e\xd3\x22\xb0\xf2\xa3\x2a\x34\xea\xc4\x03\xa8\x1c\x4d\xbe\xde\xb2\x19\x3a\xf6\x9d\x7e\xbe\x5d\x47\xe9\x1c\xc7\x78\xb1\xf3\x3a\xc3\x68\xd9\x95\x29\x33\xe2\x12\x33\xd1\x83\x11\x07\x1e\x1f\x1d\x01\x00\xea\x40\xeb\x0b\xe7\x58\xaf\xbc\x33\xdd\x7c\x53\x77\x4e\xf7\x1e\xc7\x6a\xb0\x15\x5b\x14\xa1\x5c\xdf\x7b\x35\x1a\xaa\xe2\x15\x7d\x8f\x91\xef\x0d\xaf\x01\xb4\x84\x1e\x2b\xfd\xb4\xb3\xd1\x19\xd9\xb4\x70\x5b\x08\x11\x3b\x4f\x43\x6b\x6d\x3f\x3f\x5b\xef\x67\xfd\x36\x9a\xb5\x51\xc2\xf0\x56\xcd\xc1\x28\x01\x3c\x80\xdc\xd0\x3f\xcf\xbe\x2f\xc7\x49\x86\xf2\xec\x13\x8e\x5f\xc6\xd9\x32\x26\x56\x74\x6e\x60\x32\xb1\xb5\x7d\x99\xce\xef\x62\x8b\x37\x59\x65\x7e\xb9\x1d\x80\xe2\xd0\x54\x53\x94\x79\xbd\x7d\x72\x31\x87\x35\xde\x50\xf9\xf3\x81\xac\x34\x1e\xee\x8d\xa8\x58\xe1\x50\xe2\x9f\x83\x64\xc7\x0f\x58\x92\xb6\x72\x01\x68\xec\x3f\xa7\x07\x7c\x28\x4f\xd7\xf9\x25\x94\xa9\x38\x47\x0b\xf1\x7f\x78\xf8\xfc\xf8\xf5\x5a\xd1\xb7\xcd\x9a\x57\x9d\x2d\x3e\x7e\xbe\x92\xfc\x49\x08\x40\x6b\xe8\x54\x35\x30\xad\xc0\x7d\xc4\xb4\x95\x77\x1f\x27\xd5\xa4\x09\x4b\xe6\xf7\xe4\xbd\xe9\x84\x1a\x26\xba\x57\xb7\x03\x6e\xe6\xb5\x6c\x4a\x71\xa0\x87\xb6\x55\x7a\x71\x0d\xef\xc4\x2d\x32\xe9\x0b\x7b\xc3\xae\xa8\x0e\x9d\xa1\x31\x35\x0a\xde\x38\x17\x7c\x86\xf6\x82\x80\x85\xee\x9b\x73\x00\x40\x71\xe8\xe7\x14\x40\x39\x3a\xf3\x5e\xae\xba\x51\xf1\xa1\xe3\x7a\xf4\x27\x71\x45\x31\xa7\xe4\x1f\xcf\xb2\xce\x9c\x7a\xc0\xa2\xfc\xf2\xdb\x47\xbe\x2d\x00\x15\xa3\xab\xbc\x49\xe0\xe7\x61\x88\xb1\xf0\x6e\xb7\xf6\x89\xf3\x8f\x1f\x4d\x76\xd9\x97\xf3\x94\x49\x7d\xbd\x5a\x11\x53\x31\x73\x25\xb7\x2c\x99\xda\x0e\x48\x58\xa3\x2e\xe7\x77\xd4\x17\x73\x9a\xa1\x0a\x28\xdc\xbc\x90\xcf\xba\x5f\x2b\xb8\x1d\x2f\x48\xf4\xd6\x29\x8c\xe4\xb2\x23\x85\x28\xff\x22\x81\x3c\x80\xb2\xd0\x5d\xac\xa0\x6a\x9f\xed\x65\x01\xbb\xb8\x8e\x0b\x9d\x20\xeb\xd1\xb3\x86\x11\x8f\xa0\xf8\x87\x1b\xaa\xa7\x27\x19\xe9\xf7\xaf\xbd\x22\x09\x05\x50\x0e\xfa\x88\x87\x91\x64\x42\xd1\x6f\x51\xff\x09\x22\xaf\x96\xa2\x63\x8a\x5d\x55\xa4\x6d\x3d\x67\xf7\x88\xdc\x5f\x31\xbc\xb1\xcd\x7d\xee\x87\xe4\x6b\x3b\x00\xf9\xff\xe7\x5f\x12\x3e\x4c\x87\x48\x2d\xf4\xe9\x3a\xcf\xf0\x3c\x52\xf0\x8b\x3b\x5a\x28\x38\x6c\xd1\x73\xf7\x74\x47\xc8\x90\x00\x15\xb1\x8d\x60\x38\x80\xf2\xd0\x6b\xe6\xf4\x26\x91\xe4\x57\xb2\x2c\x87\xda\xa8\x74\x15\xba\x35\x36\xb2\x0b\x5e\xbf\x2b\x5e\x7c\xdf\x3c\x9a\xd9\x4b\xe5\xd8\xa2\xcc\x1c\x0f\xa0\x72\xf4\x43\x3a\xa7\x15\x73\x86\xb6\x7b\xa4\x88\xda\x75\xff\x7b\x5d\xfb\x12\xd0\x59\x2c\x78\x68\x9b\xd2\xd6\xda\x9d\x8c\xe9\x43\x4d\x68\x87\xa3\x1d\x80\x42\xd1\x91\x67\xf2\x7c\x27\xe5\x49\x68\x35\xdd\x75\xd3\x69\xad\xc9\xf1\xc2\x22\x49\xfb\x9c\x45\xec\xec\xdc\x53\xea\x7e\xaf\xcb\x2a\xbe\x87\xee\x03\xa8\x08\xbd\x64\x06\xbe\x55\xf7\x04\x89\xd8\x4f\x84\x18\x0a\xbc\x58\x20\x31\xd5\xd4\x24\xeb\xea\x5a\x97\xf5\x93\x5d\x1a\xc8\x2d\x70\xed\xcb\x33\x04\xd0\x26\xda\xd7\x6b\x99\x61\x12\xd2\xa4\x3f\x9d\x69\x9f\x6a\x4d\x18\x14\x99\x05\xff\x5c\x0c\xcb\xbe\xd8\x5a\x48\xea\xbe\xf4\x5b\x1e\x57\x6f\xf5\xcc\x0e\x40\x79\xe8\xfe\x4a\x36\xb8\xba\xb9\xb4\x88\x8e\xf1\x98\x9c\xc2\xcb\x1a\xb9\x10\x27\xab\x03\x1b\x3c\x5d\x87\xe6\x25\x74\xf9\xc5\x06\x7b\xcc\x6f\x7a\x00\x68\x00\xed\x2c\xaf\x5a\x06\x03\xf3\x16\xbf\xfe\xf2\x6d\xb2\xde\x06\xa9\xf6\xdb\xd2\xe6\xd4\xfa\x69\xb3\xd7\xf8\x2f\xdb\x98\x34\x6c\x07\xb5\x8d\x02\x68\x04\x9d\x9a\xa8\xbd\xd9\x16\xd3\xcd\xd8\x93\x3b\xd6\x42\xf7\xde\x9d\xd1\x11\xbb\xd4\xef\x56\xa3\x38\x72\x44\xe3\xcd\x9d\x54\x8e\x9a\xaf\x93\x85\x76\x00\xf2\x44\x5f\x6f\x90\x65\x1d\x7f\x29\x95\xd3\xd3\xa0\xe5\x26\x95\x0a\xeb\xb9\x59\x8f\x54\xaa\xe8\x7b\x36\x9c\x36\xd9\x36\x14\xac\xc2\x5e\xd3\xf7\x01\x14\x84\xbe\x9c\xdd\xb6\x2c\xcb\x61\x5f\xdb\x97\xe0\x77\x39\x55\x24\x2c\x7e\xe4\x3c\xa5\x26\x61\xd7\x6f\x70\xb8\xb8\xdb\xa6\x7c\xcb\x5c\xb6\x7a\x09\xa0\xc2\xff\xbc\xf2\x89\x2c\x3f\xbf\x3a\xbc\x95\xf5\xa4\xce\xe2\xa5\x07\x8d\xe4\x22\x50\x22\xbf\xae\x82\x6a\xf3\x03\xb2\x49\xdb\x26\xcf\x99\x27\x87\xd0\x61\x19\xd8\xae\xad\x15\x9e\xc2\x11\xa5\x05\x3f\xfc\xe1\xff\x19\x67\x74\xf7\x42\xd4\x75\x47\x21\xdf\x6d\x82\x41\x73\x77\x9e\x8b\xef\x01\x90\x40\x6f\x0f\x97\x4e\xe9\xc3\x84\xf3\xed\x95\x1e\xa3\x35\xa1\x17\xd2\x4c\x5b\xaa\x0c\x8d\x4c\xa6\xb8\x27\x63\x86\xb4\xb2\x8e\x51\xde\x71\xfe\x01\xa0\x60\xf4\x7a\x97\xb3\xb0\x49\x4a\xd9\x5f\x3a\x9e\xd8\xc8\xd4\x53\xc1\xae\x30\x67\xce\xc8\x34\xc3\x52\xbc\x0c\xbe\xb3\xb7\x29\x87\x1a\x3c\x79\x0e\x00\x14\x84\xd6\x22\xf6\x1b\x0d\xdc\xcd\x9b\xb3\x96\x79\x48\xe4\xd4\xd1\x7f\x91\x73\x6b\xb5\xb4\x4a\x38\x88\xe4\x54\x28\xc8\x03\x9a\x27\x9b\x3e\xe5\x01\xa8\x18\xdd\xc2\xc7\x9c\x2f\xac\xb7\xda\xf3\x73\x8d\xec\x5b\x71\xdc\x5a\xb1\x54\xf9\x81\x64\x77\x79\x9d\xc4\xf4\xc9\x1a\x65\x16\xf0\x54\x6f\xaf\x27\x1e\x40\x81\xe8\x24\xe6\x35\x1f\x44\x67\xfd\xb2\x39\xda\x87\x63\x4a\x81\x6a\x84\xf7\x73\xe3\x2d\xa9\x53\xe2\x2b\x66\x46\x2b\xdc\x0c\xba\x6e\x49\x27\x9e\xe0\x01\xf4\x05\xcd\xe1\x1d\xd9\x4e\x4a\x86\x2b\x77\x4e\xf6\xfd\x94\x0a\xdf\xf2\x18\x24\xae\xf2\xb9\xce\xe9\x46\x96\x22\xfd\x23\x97\x6f\x7f\xdc\x0f\xad\x1e\xd4\xa5\x59\x0f\xef\xf1\x9a\xd0\x50\xd4\xe8\x9b\xde\x0d\x8d\x28\x12\x88\xb4\x33\x78\x61\x91\x23\x52\xe2\x6f\xd3\x4d\x51\x69\xf2\x5d\xea\xcd\x4e\x2b\x8b\xde\xda\x1b\xb7\xc2\x14\x5d\xbe\x2b\x6a\x6c\xa8\x11\x17\xa8\x7f\xbc\xff\xe2\xc9\x7b\xad\xf2\x23\x0e\x31\xb6\x4b\xde\xd1\x91\x45\x55\x1a\x06\x78\x00\x55\xa1\x4d\x67\x89\xbd\x48\xc2\xa3\x79\xb2\xe7\x51\xbf\x36\xd5\x7c\xb7\xd7\xdd\xdb\x72\x7d\x81\x17\x5c\x5a\xbd\x4e\x53\x09\xe8\x75\xef\xff\x3e\x08\x00\x34\x81\xde\xdb\xd3\x91\xac\x21\x77\x37\x7e\x1d\xa0\x53\xae\x7c\x9a\x46\x5d\xf7\xab\xf3\x02\x63\x26\xf1\x70\x9f\x7e\x53\x85\x65\xb2\xbc\xd6\x23\x71\x00\x4d\xa1\x97\x7b\xe8\x84\xcb\x0c\x7f\xe0\xb8\x87\x9e\xca\x94\xeb\xc3\x18\xd3\xa2\x8b\x8e\x2b\x0e\xc9\x39\xdd\x79\xf3\x43\x61\xe2\x5b\xbf\xdc\xed\xd0\x4c\x5c\xe9\xa8\x50\x95\xd2\x95\x87\xfd\x7c\xab\x74\x9e\x03\x42\xbc\xce\xb1\x87\xcb\x0b\x22\x1e\xcf\x1d\x79\xd4\x5c\xd4\x24\x66\xf9\x0e\x75\xe9\xcb\x4d\x91\xf9\x52\xb3\x6c\xa7\x9b\xb6\xd1\xdf\xce\xf4\x59\x16\x2a\xe5\xb5\xd7\x04\xf2\x11\xe2\x85\x64\xa5\xf3\x6c\x22\x6c\x20\xf4\xf8\x4a\xff\x6a\x92\x9c\xc7\x2d\xb6\xd1\x29\xda\x43\x73\x22\x97\x96\xa4\x33\xc8\xb2\xfb\x7a\xb9\x32\x03\x0f\x8c\x6a\xa5\xaf\xd3\x5a\xa1\x2e\x2d\x64\x50\x12\xf5\xa6\xf5\xf7\x74\x4f\x37\x37\x6d\xed\xa5\x6e\x8a\x29\xca\x4e\xc0\xe9\x1e\xe2\x72\x97\x48\xd2\x73\x38\xcb\x68\x05\x00\x94\x8d\x9e\x04\x28\x56\xae\xcb\x44\xee\x23\x5a\x0b\xf4\xda\xec\x13\x77\x3d\xfa\xca\x5d\xdf\xa9\xed\x5c\x8a\x9b\xde\x19\x09\x62\xba\x65\x51\xa7\x02\x00\x8d\xa1\x13\x4b\x01\x21\xa7\xe5\x8b\x9e\x10\x9e\x24\xcd\xa6\x83\xae\xe9\x35\xab\x0b\xd4\x21\xb7\x0c\xcf\x42\x57\x85\xe3\xde\x50\x06\x46\xfa\x9c\x82\xdf\x49\x82\xd5\x17\x01\x29\x86\x3f\x1f\xbe\x19\x45\x5b\x63\xe0\x55\xb3\xce\x69\x44\xbd\x2c\xde\xe9\xf1\xa2\xcd\xad\xad\x7d\x8f\xb0\x79\xef\x82\xac\x33\x91\x21\xe9\xe5\x86\x7b\xc6\xf7\xb2\xf0\x00\x2a\x40\x77\xd9\x89\xa7\x26\x0d\xe9\xdc\x1e\x3c\x54\x9b\x2e\xa6\x21\x89\xf1\xff\xc1\x5a\x6b\x6c\x7c\xa3\x94\xf1\xb7\xcb\x55\xef\x98\x33\x65\xbe\x0c\x78\x00\x2d\xa0\x1f\x7c\xea\x1e\xc6\x99\xca\xe4\xa4\xd7\xe7\x46\x66\xf8\x6b\x48\x7f\xbf\xbf\x6d\x24\x74\x63\x29\x91\xd1\xfb\x53\x8a\x18\xbd\xf7\x3c\xd1\x61\x00\xa0\x32\xf4\xf5\x86\x85\x23\xac\xa7\xef\x38\xa7\x5c\x1a\x26\x2a\xb0\x22\x0f\x60\xde\x64\xe6\xee\x77\x9e\xbf\xff\x5d\x37\xfe\x8e\xf8\xf9\x91\x6b\x1b\x00\xfa\x89\xa6\xb5\x6e\x25\xc6\x99\x1e\xe6\xe9\xc7\xea\x14\xd8\x56\x8f\x0a\x50\x28\x9e\xb4\x7c\x75\xa9\xea\x19\x35\x89\x46\xad\xb5\xda\x87\xdb\x4c\xed\xb8\x7f\xf3\x12\x40\xb6\xbb\x87\xf5\x11\xea\x85\xe5\x27\x8c\x28\x40\x54\x15\x4c\x4f\xff\x20\x16\x90\x03\x23\xd8\xbe\xee\x22\xca\x10\x04\x96\xbb\x30\xe2\x27\x15\xf2\x95\x67\xcc\x26\x58\x32\x9a\x90\xc0\x1e\x00\x08\xa0\xfb\xb1\xa2\xa4\xfe\x92\x5f\xf2\x3f\x9f\x24\x72\x5f\x7e\xf9\x25\xf5\x9e\x4b\xf7\x68\x93\xe2\x76\xb2\xfe\xcf\x17\xb6\x4a\x0c\x53\x0e\xd4\x1f\x01\xe4\x8a\x4e\x07\x51\x8f\xae\x7d\x0e\x35\x85\x74\xab\x07\xfc\x36\xd2\xb2\xb3\x7e\x0b\x95\x9c\xfe\x3a\xda\xff\xf8\x12\x97\x27\xf7\xc3\x15\x17\x31\x77\x3c\x80\x4a\xd0\x6a\x5b\x5b\x40\xb7\x59\x5a\x58\xd5\x83\xb4\x6a\x9d\x12\xe3\x17\xe7\x0f\x8d\x4a\x47\xe6\x88\xee\x3f\xf3\x80\xac\x4e\x95\x68\x24\x44\xc6\x0a\x0f\xa0\x56\x74\xc1\x59\xb1\x1e\x0d\x58\x5e\x4e\x90\x20\x1f\xa3\x13\x89\x31\x4c\x31\x88\x79\x57\xfe\xeb\xfb\xf3\x50\x57\x39\x9f\x7c\xda\x81\x69\xfc\x17\x3c\x80\x6c\xff\xf3\xc9\x75\x97\xa0\x31\x69\xdf\x82\x23\x3e\xa1\x35\xbf\x04\x6e\x97\x25\xfa\xff\xf0\xd1\xb9\x52\x66\xd8\xa2\x2b\xd6\x76\x71\x45\x31\x1d\xfe\x37\x34\xb6\x97\xbb\xe1\x04\xc8\xdc\x09\xcb\x51\x18\xe1\x8a\xb0\x22\x2c\x57\x61\x44\x09\x22\x6b\x61\x39\x0b\x23\x5a\x11\xe9\x0c\xcb\x5d\x18\x61\x8b\x4c\xaa\xb0\xa9\xce\x2e\xa2\x17\x99\x22\x61\xb1\x1d\x64\x0b\x91\xc2\x24\x15\x9b\xf0\xfc\x0f\x21\x71\x1e\xb9\x05\x26\xe5\xf9\x13\x2a\x84\x39\x63\xb1\x1e\x18\xb1\x86\xc8\x1d\x98\xbc\xe7\x0f\xa2\x1c\x19\xd1\x61\x33\x9f\x5d\x44\x07\xb2\x48\xb0\xc8\x0f\x8c\x58\x42\xf6\x35\x16\xfd\x81\x11\x6e\xc8\x3d\xb0\x09\xd0\x2e\x22\x0e\x59\x88\xd8\x1c\x68\x17\x31\x86\x1c\xb9\xc2\xa2\x41\x48\x74\xff\xbe\x4d\x01\x93\x0e\x49\x31\x12\x12\xd0\xfd\xef\xeb\xcd\xe8\x74\xa3\x7c\x61\xe8\x1c\x61\x5a\xc2\x1d\xe1\x8f\xd3\xa1\xee\x2e\x1a\x34\x8e\xde\x2f\x0f\x93\xdf\xa3\xcf\x26\xcf\x9b\x20\xb4\xa0\x93\x78\x87\x07\x50\xe7\x7f\xe8\xdf\x92\xe4\x7d\xca\xfe\x31\xc1\xd0\x9b\x06\x8d\xd4\x8c\x1e\xc6\xf2\x82\x2f\x43\x14\x9d\xdc\x24\x5c\xe2\xa1\x51\x2a\x6d\xbe\x7b\x78\x00\xe5\xa0\xfb\x44\x9b\xd3\x71\xa5\xd6\x4b\xad\x44\x99\x0f\xe6\x6b\x89\xe7\x96\xd5\x1c\xe6\xbf\xb6\xb3\x2b\x1c\x77\xa9\x20\x67\x33\x6c\xb1\x09\xfe\x81\x07\xd0\x26\x9a\x7c\x77\x8b\x0a\x85\x9b\x9e\xa7\xb0\x64\xbf\xf2\xd6\x9b\xe4\x8d\xf0\x21\xad\x33\xa5\x79\x8c\x77\xac\x9e\x8d\x48\x6b\x52\x3b\x30\xc4\xec\xc1\xfd\x9b\xd9\x70\x80\xea\xff\x3e\x36\x0c\xc3\x61\x44\x27\xf2\xd8\xb0\x4c\x87\x11\x39\x88\x5e\x8a\x65\x3c\x8c\xd8\x44\xb6\x11\x36\x29\xfd\xb3\x98\x90\x6d\x84\xc5\x4b\x61\x44\x31\x33\x9c\x0d\xb0\xa9\xe9\x6e\x36\xb0\x46\xfe\xdd\x85\x49\x4e\x77\x6f\x91\x85\xa8\xfb\x58\xfc\x14\x09\x15\x32\x4c\xc7\x66\xa8\xbb\x08\x7f\x24\x71\x62\x93\xd4\x5d\x44\x1e\xb2\xb7\xb1\x78\x2a\x92\x71\x10\x05\x11\x9b\xa9\xee\x22\x42\x91\xc7\x81\x4d\x56\x77\x11\x45\xc8\xde\xc6\xe2\xab\xc8\x22\x41\x3c\xc7\x66\xac\x7f\x3c\x47\x44\x75\x6c\xd2\xba\x8b\x18\x40\x3c\xc7\xe2\xad\x30\x62\x04\x29\x7d\xd8\xcc\x75\x17\xe1\x89\x20\xb0\xc9\xeb\x2e\x22\x08\x41\x60\xf1\x57\x18\x51\x48\x87\xe4\x41\x4c\x1e\x2b\x45\x61\x4b\x40\xb2\x93\x07\x1d\xd1\xdd\x38\xb7\xac\x1a\xab\xf2\x6b\x87\x54\xbe\xbd\xce\x67\x68\x75\x6e\xcb\x8d\xac\xb3\xab\xb9\x75\x69\x64\x25\x5d\xaa\xc8\x56\x19\x5c\x26\xc0\x03\xa8\x07\x9d\x07\x1f\xc5\x95\x0c\xe4\x37\x9a\x0a\x6a\xd6\xd9\x0c\xfe\xf6\x5e\xd3\x19\x22\xf0\xb3\xcf\xab\x38\xce\xea\x31\xbc\xad\x9e\xbb\x30\x6b\x82\x07\xd0\x3b\x34\xaf\x3a\xd9\x1f\xdb\x12\x91\xc8\x52\x4e\x23\x4e\xb3\xa6\xe9\x1d\x4f\xdf\x24\xa9\x67\xc7\x6e\xe3\x75\x92\x78\xbd\xcc\x55\x91\x77\xd3\x03\x0f\xa0\x34\xb4\x4a\xa1\x22\x45\xd9\xde\xdc\x64\x94\x6f\x3b\xad\x58\x27\xb9\x57\x42\xac\x72\x46\x96\xc5\x93\xe4\x80\xaf\x17\xf7\xc5\x18\xb5\x0d\x69\x03\xdc\xbf\x99\x0d\x07\xc8\x11\x69\xaf\xb1\x0c\x87\x11\x3d\x48\x1e\xc4\x32\x1d\x46\xbc\x43\x16\x13\x96\xf1\x30\x22\x0d\x79\xef\x37\xb6\x9c\xb0\x9b\xa3\x90\x54\x8b\x29\x28\xfc\xb9\x45\x30\x92\xa3\xb0\x25\x85\x3f\xab\xef\xef\x89\x58\x0c\x55\x01\x49\xb5\x7f\xbf\x95\x8d\xa1\x2b\xc0\x88\x40\x24\xb8\x58\xca\x02\x8c\xf8\x42\x82\x9c\x1e\xc1\x52\x18\x80\x14\x09\xa1\xed\xff\xde\x46\xee\x8b\xe6\x77\xa7\x44\x5f\xf8\xcb\xd4\xab\xf0\xe8\x4d\x70\xa4\x42\x8f\x33\x5e\x96\xf4\xea\x1c\xba\x7b\xc3\xda\x20\x68\x5f\x77\x71\xd6\xf9\xf0\x1a\x3c\x80\x12\xfe\xf3\x67\xc1\xe3\xb3\x0c\xee\xda\xce\x4f\xa7\xd3\xde\x37\xda\xa6\x24\x1b\xb0\xbc\x7f\xa3\x31\x35\x36\x20\x5d\xa0\x77\x20\xc2\x66\x69\x0f\x2f\x00\x90\x03\x5a\xc3\x37\xe2\x8d\x08\xa9\x35\xdb\xb2\xe8\x13\xf5\x14\x2b\xd1\x2b\x09\x8f\xcb\x55\x3a\x5b\xff\xe9\xd7\x79\xd1\xe5\xb7\xac\xcf\x35\xc7\x69\x00\xf4\x1d\xdd\x78\xe8\xa6\x5a\x74\xc9\xd0\x4e\xdd\xc5\x9b\x2c\x7f\x91\x02\x87\x4c\x3e\xcd\xb1\x28\xea\x52\xb2\xbb\x9c\xd9\x5b\xc3\x41\x96\xa2\x56\x82\xfb\x37\xab\xe1\xf8\xf8\x22\x59\x1f\xd3\xee\x3f\x88\x04\xe4\xa9\x61\x5b\xbe\x8b\x70\x40\x5a\x72\x2c\xe3\x61\xc4\xf7\xbf\xc7\xe6\x30\x64\x1e\x18\x81\x47\x2a\x24\xa6\xd0\xf3\x07\x51\x85\xac\x25\x6c\xa9\x67\x17\x31\x81\xc4\x0a\x4b\xed\x81\x11\x53\x0c\xc8\x41\x7d\x2c\xd5\x07\x48\xe1\x8f\x10\x11\x38\xec\x70\x1e\x34\x8f\xac\xaa\x0a\xba\x7c\x8c\x82\xb6\xf4\xb4\x51\xa8\xf1\x51\x8d\x79\x9d\xd3\x09\x81\x84\xfc\x6d\xcd\x2b\xf8\xab\x2e\x29\x85\xe5\x87\xdb\xf1\x00\x6a\x47\x2b\x97\xe2\x37\xd9\x68\x82\x85\x4f\xed\x7f\xa5\x65\xf9\x51\x29\x8f\xf8\x49\xf5\x03\xe1\x33\xa4\xe5\x0d\x0c\x4f\x66\xcd\xa9\x72\xaf\x71\x19\xed\x74\x6a\x68\xde\x19\x7e\x3f\x8a\x3e\xd0\x62\x5c\x7b\x00\x5f\xf6\x51\xbd\x83\x31\xea\xdb\xf0\x69\x2e\x31\x61\xf1\x17\xbd\xdf\x8d\xf3\x08\xf2\x6f\x96\xe0\x01\x14\x89\xe6\xc1\x16\xab\x65\xeb\x42\xe9\x97\x32\x66\x0d\x8d\xf4\x06\x8a\x1e\x34\x1f\x23\xef\x34\x96\x71\xfb\x36\x2e\xa5\x73\xf0\xb1\x1a\xfe\xad\x10\x1e\x40\x3f\xd0\x0a\xe0\x61\x9b\x5f\x8d\xa9\x22\x19\xd5\xf7\x2d\x78\xcd\x8f\x2d\x0e\xed\xad\x9c\x0b\x16\xf8\x71\x92\x91\xfb\x3a\xd1\xa2\xd1\x6d\x4b\x4e\xf8\x94\x27\x96\x9b\x08\x1f\x44\x4a\x1c\x96\xa3\x30\xa2\x1d\x69\x20\xb0\x5c\x45\x3a\x59\xa4\x81\xc0\x72\x16\x46\x44\x22\x4c\x18\xcb\x5d\x18\xf1\x83\x04\x29\xbc\x58\x1a\x1f\x90\x22\x21\x92\xff\xdf\xbf\xdd\x16\xd1\x85\xce\x9c\xff\x6e\xa1\x99\x07\xee\xbc\xb5\x11\x41\xca\x63\x9e\xef\x77\x4a\x9a\x2f\xab\x3c\x89\x3a\xa7\xfa\x2e\xa9\xe9\x8b\x22\x8d\xe6\x34\x1e\x40\x21\xe8\xc2\xbb\xa4\x22\xcc\x7a\xec\x83\xc5\xc3\x26\x0e\x0b\xd5\x78\x9f\xce\xe5\x44\xe6\x62\x1c\x95\xda\x18\xeb\x87\x52\x4a\xa3\xed\x24\xaf\xf3\x3b\xb9\x00\xad\xaf\x1e\xb0\x99\x7b\xf0\xca\xfe\x60\x19\x4b\x9d\xdb\xfb\xa5\x36\xa6\x8e\x63\x2b\x3f\x9f\x3c\xa6\x29\xc8\x3d\xd0\xc0\x7c\x84\xb0\x24\x5e\x63\xa7\xb9\x46\xa7\x49\x5e\xc7\xa3\xf1\x34\x7b\xf4\xce\xbe\xec\xd0\x81\xe8\x5f\x9e\x8b\xd7\x69\xb4\xab\x90\xe6\xfb\xb4\xf6\xe9\x66\xc6\xfe\xb9\x32\x01\x77\xdc\xbf\x99\x0d\x07\x68\x11\xe9\xc9\xb0\x0c\x87\x11\x21\x7f\x07\xc1\x18\xa6\x23\xb9\x0f\xc9\x19\x58\xc6\x23\x74\x82\x0c\x79\x6c\x58\x7a\x2b\x90\xe2\xe0\x20\xe0\xdd\x79\x6c\xf1\x68\xf9\x4f\x65\x28\x76\xe1\x02\x25\x03\x79\x52\xcd\xec\x9d\xe0\x7e\xa3\xb1\x79\xbf\xe9\x6f\x71\x2d\xcf\xc6\x0f\x3d\xd1\x52\xfd\x7a\x67\xee\xfb\x4e\x21\xa5\xfd\xcf\x98\xb1\xa0\xa9\x97\xef\xe0\x0f\xb2\x84\xc3\xca\xaf\xf6\xf1\x8c\xef\x77\xf4\xd8\x63\x16\x2f\xe9\x56\x3e\x4d\x34\x9d\x7c\xcc\xc8\x0c\x0f\xa0\x24\xf4\xfe\x4c\xae\xcc\xbe\x72\xe2\x20\x59\xa0\xe0\xd7\xae\x73\xb5\x57\x17\x65\x8f\x05\xaf\x8a\xe5\x87\x86\x5c\x7c\xb9\x17\x97\x7d\x65\x6b\xf1\x03\x1e\x40\xb9\xe8\xfe\xca\x5f\xb8\x2d\xba\xb9\x36\xfc\xdd\x9b\x3d\xe9\x66\xc6\xb3\x74\xb9\xb2\x31\xdc\x51\x24\xc6\x31\x86\xd5\x61\x7e\xd1\x4e\xc1\x81\x1f\x70\xff\x66\x36\x1c\xa0\x78\xaa\xbf\x02\xc1\xff\x6f\x38\xd2\x36\x20\xb2\x05\x96\xe9\x30\x22\x09\xd9\x6d\x58\xc6\xc3\x88\xdc\xbf\x69\x18\x53\xfb\x96\xa2\x22\x27\xf9\xdf\x9b\x9f\xba\xd0\x61\x12\x6e\x78\xbb\xc8\x21\x44\xa3\x5c\x78\xc1\xf4\xe2\xc6\x52\xfc\xd9\xe7\x34\xe3\xcd\x46\xce\x7b\xfa\xda\x9f\x0a\xbb\x84\x0d\x24\x11\xe1\x01\xe4\x86\x6e\x8b\x9f\xb1\x3d\xe5\x66\x9c\xcc\xe0\x7b\x32\x6f\xa9\x30\xc1\x4b\x3b\x71\xfc\x94\xe4\x1b\x76\x91\x0a\x16\x12\x5f\x99\xdf\x9f\x7e\xa7\x7a\xe1\x01\x94\x8a\xde\xcd\xda\x1c\x0f\x4c\xc2\xf7\xf2\xb4\x46\xbf\xd9\xdf\x6b\x24\x64\xc0\x7c\x3f\xbb\xff\xd8\xb6\xa6\x39\xf5\xd3\x32\x05\xbf\x21\xed\xbb\xdc\x78\x00\xbd\x47\x3f\x66\x55\x07\x57\x92\xd5\xae\x5c\x2b\xb6\x01\x25\x3e\xf6\xdf\xad\x79\xaf\xdc\xd5\x9f\xaa\xa5\x6e\xf4\x1f\x4e\xbd\xf7\x41\x50\xe5\x57\x2d\x1e\x40\x89\xe8\xb2\xc0\xbe\x60\x94\x73\xe1\xe4\x4c\x60\x50\x5c\xe9\x2a\xce\x3f\x4e\xc1\x5b\x49\x6c\xdd\xe6\x09\xc5\x9d\x32\x53\xed\x63\x0b\xd7\x7e\x99\xe3\xfe\xcd\x4d\x38\xa0\x5d\x48\xcb\x8a\xe5\x28\xa2\x03\x21\x8d\x34\x96\xab\x30\x22\x15\xc9\x00\x58\xce\xc2\x88\xf7\xc8\xc2\xc0\x72\x17\x46\x24\x22\xc5\x01\x7b\xc6\xb1\x8b\xc8\x46\xfc\xc0\x1a\x73\x20\xea\x14\xf5\x72\x33\xd3\x2e\xe4\x7c\xcb\x93\x30\x9a\xfd\x2e\xed\x92\x49\x44\xf8\x9a\xb7\x5b\x53\x1f\xf7\xeb\x5f\x7d\xf8\x38\xfd\x45\x71\x4e\xa0\x96\x4e\x99\xf5\x31\x20\x35\xd4\xbd\xbd\xfd\x9f\xc3\x23\x57\x17\xc5\xc3\x1e\x4a\x76\xc5\x14\x4f\x6c\x66\x5d\xa2\x2a\x34\x08\xfc\x52\xa7\x95\x7b\x91\x3f\xd0\x5f\xe2\xdc\xc7\x02\xde\x50\x17\x3b\x00\x65\xa2\xd3\x7c\x9e\xc8\x42\x1b\xaf\x67\xc7\x48\x96\x4f\xf3\x16\x67\x31\x65\xff\x6c\xc4\xd0\xd6\xdb\x17\xa2\x21\x7a\xfd\x38\x09\xdf\x68\x89\x33\x00\xfa\x84\x2e\xcf\x26\x11\xf5\x16\xec\xbd\xf2\x7e\x89\x8c\xd9\xd2\x07\xb2\xa3\xf3\xf4\x23\x07\xc5\x57\xcc\x08\xd2\xd2\x0a\xf9\x0e\x9f\xed\x29\x14\x02\xd0\x0c\xba\x57\x1d\xb0\x0e\x9d\x6d\x6d\x15\xaa\x69\x1c\x5d\xf9\x1a\x74\x3b\x27\xc6\xdf\x12\xaf\x22\x1c\x23\xf2\x81\x5e\xc5\x9b\x87\x50\x58\xcf\xc6\x0e\x40\xde\xe8\xf1\x65\xfd\x40\x78\x85\xe7\xd4\xe7\xdc\x88\x4f\xec\x3c\x76\x4e\xca\x6e\xe1\x62\xfe\xce\x0f\x82\x52\x43\xcf\x8e\x2c\x0e\x30\x73\x33\xaa\x01\x28\x04\xbd\x6b\x7c\x9f\x7f\x0c\x74\x19\x2f\x0a\xf1\xde\xde\x22\xd8\xdf\x92\x72\x93\xb7\x28\xbf\x96\xc3\xf8\x60\x48\xd5\x74\x11\x75\xdf\xb3\x3d\x27\x00\x14\x89\xd6\xbc\xee\xbb\x3e\x74\x79\x21\xac\xf8\xe6\x6d\xc8\x04\xa9\xf0\xe4\x09\xd7\x9f\x90\xb5\xcc\x3c\xff\x19\xfb\x95\xf8\xe1\xb0\x1b\xb2\xcd\xe8\x17\x7e\xec\xab\xfb\x98\x23\x41\x66\x90\x77\x41\xd3\x97\x58\x68\xa0\xa5\x4a\xed\xd8\x61\x05\x96\x3d\xa1\x59\x0c\x1b\xdc\x7b\x3d\xc4\xa5\x98\xed\x00\xe4\x8a\xde\x5f\xf5\x39\x52\x03\x8e\xab\x95\xef\xbf\xc7\x1f\xaa\x51\x64\xfe\x94\xaf\x95\x97\xf2\xeb\x42\x59\x68\x49\x83\x64\xeb\x91\xc5\xef\xca\xd9\x00\x0a\x46\x4f\xea\xe3\x32\xa5\x2e\xcf\x1d\xae\xbe\xc1\x7e\x63\xe1\xda\xc9\xad\xe3\xb8\x81\x2f\x60\xe5\xfe\x41\x0e\xb2\x89\x6e\xfb\xe6\x7d\x3e\x4f\xa6\x00\x54\x8a\xee\xe1\x2d\xf5\xfc\x4f\xf0\xcb\xb4\xfa\xbd\x09\xfa\xd9\x66\xd1\xac\xbf\xdc\xb9\x01\x55\x5d\xbc\xc1\x3a\x71\x0c\x57\x4e\x77\xc5\x6e\x9d\x18\x0f\x20\x7b\x74\x6d\x65\x2d\x60\xdf\xcc\xe0\xdf\x4a\x52\xa1\x4a\x79\xd2\x49\x7d\xfd\xfd\x7e\xcd\x94\x3a\xde\x8c\x0a\x7a\xd7\xfa\x5f\x57\x72\x27\x4b\xaf\xe2\x01\x34\x8f\x0e\xbb\xc0\xe1\x43\x9c\x0e\x0f\x3c\x8c\xf2\x4a\xb6\x2d\x85\xd9\x5b\x0e\x8b\x95\x56\x3a\x55\x05\xd5\xe5\xc8\xda\x9e\x4e\x7d\xba\x2f\xee\xe9\x0e\x85\x44\x17\x25\xf3\xa8\xaf\x77\xd5\xe3\xef\xce\x04\x16\x83\xe7\x8d\x96\xa4\x27\xf6\x1a\x1a\x26\xea\x33\x5b\xd9\x73\xa9\x30\x1f\xee\x38\xb0\x70\x09\x00\xe8\x2d\xba\x69\x24\xd4\x4f\x9b\x19\xfa\x54\xb3\xa2\x3e\xf3\xec\x9c\x95\x52\xf6\x23\xc5\x60\xd7\x0e\xc2\x9b\x6f\xf6\x9e\x5c\x48\x2f\xa5\xfb\x95\xf8\x0a\x40\xbe\xe8\x35\xd9\x93\x14\x7f\xfa\xa7\xee\x79\x51\xf2\x1f\x8a\xba\xea\x45\x33\x69\x83\x5d\x15\xb3\x38\x3e\x5c\x6e\xc8\xda\x15\x83\x04\x19\x25\x39\x00\x24\xd0\x1f\xbc\x0c\xd6\x58\xbd\x9f\xda\x7c\x4c\xfd\x8b\x97\x64\x41\x94\xc9\x00\x84\xcf\x2b\x5d\xf3\x89\x71\xb4\xff\xda\x39\x29\xf7\x4e\xf0\xec\x1d\x00\xe1\xd1\xa9\x73\xf2\xc9\xe5\xbd\x2a\x02\x87\xae\x7e\x3d\x53\xfd\xf9\x4d\x68\x14\xc3\x19\xa1\x05\xe7\xa6\xab\x52\xfd\x7a\xed\x5c\x38\x41\xab\xd4\x0c\x3b\x00\x25\xa0\x9f\x55\x92\xf4\x10\x65\xd3\x97\x33\x12\x4e\x37\xdc\x2a\xb7\xef\x29\x67\xaf\x05\x86\x25\x48\x13\x9f\x8c\xc9\x5b\x7f\xa2\x25\x97\x7d\x3e\x05\x40\x6d\xe8\x25\xbf\xcd\x72\xd3\x63\x33\x33\x26\x56\x36\x48\x87\xa7\x5f\xda\xea\x42\xab\x32\x51\xe9\xe6\x4c\xfe\x8f\x88\x17\x27\xe2\xf4\xb3\x9b\x55\x00\xd4\x8b\x66\x7f\xfd\x99\x05\x22\xaa\xeb\x2a\xde\xde\x9f\x7e\xb4\x74\x2d\xff\x62\x6a\x64\x37\x3e\xa5\xe6\x58\x52\xe7\xc9\x6d\x70\xf2\xd0\x23\x37\xc3\x9d\x1d\x82\x5e\x0a\x0f\xa5\x45\xf4\xaf\xc6\x7c\x93\xb7\xab\xd1\x8a\x96\x53\x4e\xbe\x19\x1f\xac\x77\x48\x2e\xb7\xa5\xa6\xda\xf3\x71\xb8\xda\xc5\xc4\x4c\x00\x85\xa1\xf3\xb8\x10\x97\x78\x4d\x1c\x55\xa0\x48\x6a\xc0\xb3\x32\xfd\x46\xbb\x34\xb7\x33\xb9\x0b\xac\xcd\x47\x5e\x0d\xb3\x10\x30\x6b\xf0\xaf\xb8\x03\xa8\x1f\xfd\xa0\xcc\x0c\x8f\x1b\xa4\x5d\xf7\x8b\x89\xbe\x3c\xc2\xde\x7e\xb2\x8b\xad\x57\x3f\x64\xe5\x15\x65\x3b\x54\x51\xda\x44\xb4\x0d\xd9\xbf\xb2\x03\x50\x00\xfa\xe7\xcb\x0e\xcb\x5d\xb1\xf5\x3a\x0c\xcc\x9b\x8a\xcf\xdf\xf1\xa8\xd3\x7c\x47\x61\xd4\x5c\x40\x66\x33\x20\xa2\xd0\xd7\xd3\x88\x63\x3e\x0a\xa0\x88\xff\x7c\x28\x77\xf0\x73\xab\x99\x40\xea\x72\x7c\x6a\x48\x7a\xd7\x40\xc3\x6f\x36\x19\xa7\xe3\xa6\xf3\x02\x09\x75\xa9\x5f\x66\xf5\x89\x4b\x45\x00\xf4\x11\x5d\x44\x4f\xf9\x58\xba\xb9\x9f\x2a\xee\xd6\x30\x19\xf2\x17\x7f\x44\xbf\x50\xee\xee\x25\xd5\x71\xd5\xb2\x64\xf9\xc7\xf2\xa2\xf2\xec\xea\xe9\x9d\x4e\x1a\x1d\x9b\x20\x51\x89\xef\x17\xd6\xe8\xf8\x84\xee\x46\x7f\x18\xb6\x3c\x5d\x74\x3c\xb7\x3a\x84\x45\x37\x68\x5a\xd4\x64\x3a\x12\xd7\x94\xc4\x8a\xba\x54\x42\xf5\x96\x26\x89\x46\x6c\x29\xbf\xc2\x59\x83\x83\xac\x4d\x5d\x10\xe1\x2d\xc2\xef\xfe\xc4\x6e\xf4\xed\x05\xe5\x9d\xdd\xad\x7b\xed\x00\xd4\x81\x4e\x1d\x5e\xe3\x95\xe9\xeb\x69\xb1\x91\x76\x55\x16\xe7\xfd\x6d\x32\x59\xf6\xef\x69\x60\xeb\xbc\x0a\x1d\xfe\x68\xf7\xa1\xb8\x8e\xb5\xdf\x16\x40\x23\xe8\x45\x30\x0c\x3e\x6e\x95\x9e\x3b\x2d\xf8\xf1\xd3\xcd\x94\x24\x85\x95\xee\x89\xa4\x3d\xdb\xd1\x51\xad\x13\x2f\x38\x5e\x05\x9e\x6e\xdd\x9f\x08\xa0\xef\x68\x47\x1b\x29\xee\x41\xea\x83\x5e\x1e\x7d\x91\x0b\x3f\x29\xd7\x37\x81\xbd\xce\x43\x9a\xfb\x06\x96\xbe\xcf\xaa\xb3\x57\x33\xdf\x45\x15\xe2\x01\xb4\x85\xce\x36\x87\x59\x6f\xba\xf6\xc8\xf6\x48\x73\xf7\x1e\x1e\x72\x14\x8f\x2d\x7a\x4e\x6c\x5f\xf4\x33\xae\x26\xeb\x0c\x5d\xcb\x81\x41\x4f\x5b\x27\x00\x20\x0f\x74\x53\x78\xa9\x24\xc5\xbc\x94\xb2\xc3\x52\x7b\x60\xbe\x20\xd6\xae\x90\x34\xa4\x7e\xc3\xf0\x9a\xb5\x71\x58\xc6\x49\x52\x3e\x9b\xfc\xa0\x45\x00\x15\xa3\xe3\xf8\x5b\xad\xc4\xbd\x54\xb3\x67\xfb\x39\x6f\xd1\x2f\x62\x69\xf6\x67\xf6\xd2\x14\x62\xc3\x60\xe5\x57\x38\xc1\x41\x90\xa8\xe8\x7a\xd8\x0e\x40\x8e\xe8\xa2\xc0\xe6\xe4\x90\x85\x57\x68\xde\xae\x78\x4e\xc4\x34\x2d\x74\x95\xed\xdc\x03\x91\xbc\x2b\xcc\xe4\xc6\x1c\x17\x3a\x0c\xb7\x5a\xc6\x15\x00\xf4\x15\x1d\xcb\x5f\x6f\x39\xb5\x8b\xe3\x57\x23\x8e\x75\x9b\x6b\x26\xd3\xfb\x8a\x4f\xf2\x4a\x2a\xa8\xd9\x72\xf6\x7b\xce\x58\xbc\x7e\x92\x70\x65\x18\x40\xd3\xe8\x1d\x22\xbb\xf7\x76\xc0\x62\x5b\xfe\xa7\xe4\x20\x75\x50\xb0\x77\x46\xe5\x96\xd9\xaf\x7b\x45\x2f\x78\xc7\x0c\xde\x8f\x3f\x78\x7e\xc6\x4d\x11\x7d\x3c\x65\x50\x48\x83\x30\x97\x3a\x87\xeb\x72\x6c\xe8\x9a\x1d\x39\xce\x24\xef\x8d\x0c\x2d\x64\x69\xa6\x40\x2e\xea\x13\x13\x76\x24\x0c\x00\xc8\x15\x7d\xfa\x45\x20\xb0\xca\x30\xce\xba\xa2\x78\x80\xa4\xda\x7f\x66\xf0\xd0\xa8\xd5\xb9\xac\xd9\xd7\x5c\xf9\xdf\x0a\xcd\xa4\xbd\x19\x39\xa4\x44\x00\xd4\x8b\x0e\xe3\x1c\x17\x78\x75\xa4\xec\xd9\xd7\x83\x81\x9f\xad\xdd\x9f\x9b\x79\x38\x5c\xe3\xa6\x39\x1e\xe2\xb1\xe4\x74\xd7\x85\x8a\xe2\x45\x85\x31\xba\xff\x1b\x32\xd4\x4c\x3c\xb3\x34\xf1\x78\x56\xc0\x25\x22\x60\x80\x6d\xeb\xd9\xec\xc8\x70\x92\x21\x75\xf4\x0a\xf1\x54\x0c\xd5\x4a\xb9\x1d\x80\xf0\xe8\x9f\x96\x6a\x7a\x4b\x0d\x32\x5f\xd6\x4a\xaa\x19\x89\x54\x3a\xc4\xaa\x1d\xfc\x50\xfd\x40\x25\x8a\xf7\x04\xee\x4e\xb3\x87\xaf\xdb\x79\x39\x00\xa5\xa2\x59\x7e\xed\x29\xde\xde\x70\x85\x6f\xf3\x1a\x8d\x67\xb4\xee\x5c\x37\xa3\x1a\xbf\xc8\x8a\xfb\x7c\x45\xc1\x6a\xba\xfb\x31\xeb\xe3\xd6\xef\x3c\x00\x9a\x42\x3f\xa0\x0b\xe1\xc2\xda\xb4\xd5\xad\x57\xfc\xfc\x34\xd6\x45\xc7\x6f\x84\xc9\xba\x78\x70\x6b\xe9\x3e\x9d\xf7\xb3\x56\x7e\x72\xc5\x37\x81\xd4\x0e\x40\x4e\xe8\x6d\x2d\xab\x2d\x9e\xf4\x96\xac\xcd\x5c\xc1\xcd\xfe\x48\x45\x4c\x67\x5b\x2a\x4f\x46\xc9\x88\xeb\x89\x4f\x38\xab\x17\xa7\x82\xf7\x46\x69\x00\xc8\x09\x3d\x7b\x1a\x24\x11\x9f\x20\xb8\x22\x48\x5f\x18\x36\xb6\x70\xa3\xc4\x8f\xce\xaf\xc7\xfb\xcd\x4f\xa5\xb6\x96\x44\x83\xed\x20\xfb\x6d\xc6\x4a\x00\xa5\xa0\x93\xcc\xe9\x37\x5c\x91\xf4\xfe\xca\xf3\xcf\xae\x52\x8d\xde\x30\x77\xb9\x1b\xa5\xdb\x54\x1d\x16\xf0\x96\x73\x8c\x4b\xd0\x2b\xbc\x4d\x17\xfd\x21\xca\x24\x35\x1f\x1f\xda\xb1\x73\x9e\xc1\xf3\x52\x7a\x82\xf9\xab\x64\xb4\x8d\x26\x54\x47\x03\x86\xfa\xf6\x3b\x1b\x17\x27\x6f\xe8\xee\xac\x44\xdb\xff\x68\x69\x73\xeb\x07\x3f\x2b\x5d\x79\x6e\x19\xb0\x47\x84\xfc\xce\x35\x20\xd3\x3f\x77\xf6\x79\x8a\x3f\x69\xc2\xe1\xac\xb9\x45\x92\x18\x4d\x00\x15\xa3\xeb\xde\x52\x59\x14\xcb\x80\x91\xba\x71\x42\xd3\x91\x01\xd1\x90\x58\xa5\x46\x8b\x24\x23\x85\x1f\xfc\xa9\xfc\xea\x91\x74\x1d\x6a\xcd\xa5\x00\x6a\x41\xb7\x1b\x4f\xf5\xeb\x33\x0c\x64\xc3\x37\x3a\xef\x9d\xbb\xaf\x2a\xb2\x87\x4a\xfe\x12\xf7\x44\xf8\xe0\x65\xcd\xe4\x7d\xc6\x56\xc4\x21\x13\x78\x3b\x00\x15\xa1\xeb\x18\x27\x4b\x7c\xc5\xc5\x0c\x0e\xf2\x8d\xe0\x02\x92\xa3\x0f\x65\x9b\xc6\xa2\x04\x0b\xb3\x36\xef\x5f\xd8\x53\x9f\xaa\x25\xb9\xb5\xa1\x0e\xa0\x56\x74\xa1\x71\xfa\xf2\xa9\xea\x67\xdb\xd3\x41\x17\x91\x49\xae\x7a\x9f\x49\x99\xaf\x25\x15\x37\x02\xaf\x9c\x14\x70\x57\xd4\x9b\x58\x71\x54\x38\x0f\xa0\x8d\xff\xbc\x35\xe8\x51\xbb\x6d\x88\x7a\xcc\x7d\x83\x7a\xc3\x03\x17\x3e\x2a\xe9\xe6\xcd\x1e\x2b\x54\xe3\xa0\xf8\x3f\xc6\xbe\x3c\x9e\xaa\xef\x7b\xdf\x9c\x24\x43\x64\x48\xa1\x41\x48\x99\x42\xa9\x84\x83\x28\x85\xcc\x43\x32\x16\x45\x34\x18\x93\xb8\xfb\x92\x59\x48\x22\x32\xcf\x22\xf3\x3c\x17\x49\x64\x9e\x65\x9e\x95\x42\xc8\xfc\x7b\xf9\xfc\xbe\x77\x3b\xef\xbf\x4e\xff\x9f\xe7\xde\xb5\xd6\x5e\x7b\xad\xf5\x3c\x7b\xdf\x7b\xc4\xf6\x56\x9f\x74\x7e\x5c\x7e\xff\x38\x3a\x8c\x43\xe5\x93\xf2\xcb\x4b\x9e\x73\x1f\x66\x5b\x94\xbf\x30\xe6\x1a\x18\xb0\x55\x7c\xa8\xb4\xf5\xb9\xbc\xe7\xfd\xb8\xa5\xee\x25\x2f\x00\x10\x5f\xf4\xbe\x98\xb5\x63\x1a\xb8\x75\xc7\x5d\xdd\x68\x26\x82\xef\x0b\x32\x44\xc4\x5c\x74\x3e\x45\xe1\x1c\x7b\x71\x70\x3c\x42\xc3\xeb\x96\xe2\x0c\x90\x25\x74\xf9\x9a\xee\xca\xec\x38\x7c\x35\xf4\x74\x95\xf3\x6d\x69\x7a\xc7\x1c\x4b\x79\x87\x60\x5d\xb3\x3f\xa5\xf7\x9c\x2f\x6f\x97\xae\x9b\x30\xe2\x09\x14\x18\x6b\x36\x05\xb2\x7b\x29\x89\xfe\x77\x81\xa7\x1a\x9d\x2f\x8f\xae\xd8\x59\x6a\x96\x93\x94\xf0\xe4\xaa\x73\xbc\xe4\x63\x19\xb2\xab\x9a\xd3\x56\x0c\x29\x08\x27\x37\x9f\x55\xe9\x3b\xc2\xc6\x8e\x03\xc8\xd4\x7f\x94\x0e\xab\x07\xf1\x75\xdb\x46\x2b\x74\x2a\x08\xef\x5c\xbe\x53\x66\xca\x17\x5b\x51\xcd\x1a\xad\x84\x69\x33\xbd\xfe\xa5\xeb\xe7\x7f\xe1\x00\x52\x83\x7e\x7e\xdd\xa4\x7f\xba\xbf\x35\xe1\x8e\xb4\x1f\x6d\x04\xfe\x79\x6d\xb1\xda\xd8\xf1\xf4\x37\xf4\x07\x33\x33\x96\x73\xbf\x4d\x36\x30\x2d\xe3\x00\xd2\xfc\x9f\x3f\x27\x2d\xfe\x3b\x4d\x19\xb3\x39\x7e\xe7\xb2\xce\x87\x99\x5c\xd1\x51\x4f\x46\x7b\x33\xb9\x03\x80\x16\xff\x40\x83\x6b\x2f\xe7\xfd\x59\xe1\x7f\x33\x1b\xc8\x10\x13\xfd\x7f\x1a\xb2\x7f\x59\xf8\xdf\x2c\x87\x90\x29\x2a\x02\x04\xcb\x78\x08\xa9\x81\x10\x2c\xfb\x21\xa4\x99\x84\x00\xc1\x64\x09\x04\xc8\x07\x08\xc1\x64\x0a\x04\x48\x2b\x19\x01\x82\xc5\x16\x20\x64\x96\x98\x00\xc1\x24\x0c\x04\x48\x20\x29\x01\x82\x49\x1a\x08\x90\xb7\x94\x04\x08\x16\x71\x80\x90\x28\x0a\x78\x7a\x80\xc5\x20\x80\x2c\x19\x11\x19\x25\x1e\x07\x90\x7c\x74\x49\xa2\x0c\xdb\xe7\x3d\xfc\x43\x60\xf6\x09\x4b\xaa\x89\xf7\xb0\xe3\x65\xe3\x0d\x71\x5e\x99\xd8\x82\x28\x19\x52\x39\x6a\x79\xea\x6a\x80\x03\xc8\x0c\xfa\xb6\x5a\x66\x90\xbb\x96\xe0\x09\xce\x06\x93\x7b\x53\x03\xde\x39\x83\xe6\x1a\x49\xa9\x6d\x7a\xef\x82\x1e\x5b\x47\xfc\x75\x56\x1a\xdb\xd8\x19\x05\x42\xd1\xb5\x9a\x8d\x47\x2b\x0b\x97\xe9\xe1\xa3\xb9\x87\xd1\xc8\x5a\xfb\x40\xb4\x0f\x48\xdc\x2b\x78\x34\xc6\xe3\xa1\x4b\x6d\x90\xcf\xc5\x26\x13\x80\xd4\xa2\xf7\x86\xd0\xfd\x13\x8b\x57\x06\xfa\x43\x94\x1f\x93\x52\x51\xd7\xdc\x93\x3b\xd9\xbc\xa5\x51\x1c\xb9\xb5\xaa\x66\x5a\x49\x94\x48\x73\xbe\x5d\xf8\xdf\xac\x86\x01\xca\x87\xcb\x80\x69\x38\x01\x32\x43\x4f\x80\x60\xda\x4e\x80\x84\x32\x11\x20\x58\xf6\x43\x48\x2d\xdc\x1e\x98\x54\x8e\x00\xf1\x66\x24\x40\x30\xe9\x1c\x01\x12\x76\x90\x00\xc1\xa2\x74\x10\x52\xc2\x40\x80\x60\xb1\x3a\x08\x71\xdb\x43\x80\x60\x11\x3b\x08\xf9\x05\xd7\x05\x93\xdb\x11\x20\xef\xa9\x09\x10\x4c\x7a\x47\x80\xf8\xc1\x4a\x87\x49\xf1\x08\x90\x57\x50\xa5\xc5\xa4\x79\xff\x07\x91\xb6\x20\x7c\x09\x16\xd3\x83\x5f\x82\x83\x8b\x8f\x49\xf6\x08\x90\x44\xb8\x92\x98\x84\x0f\x96\x53\x58\xb5\xb0\x48\x1f\x84\xf4\xee\x23\x40\x30\x79\x1f\x2c\x74\x30\x5f\x30\xb9\x1f\x01\x12\x41\x47\x80\x60\xf1\x3f\x08\xe9\x87\x2b\x89\x49\x01\x09\x90\x10\xf8\x2d\x98\x34\x90\x00\x89\xdc\x4b\x80\x60\x51\x41\x08\x69\x38\x40\x80\x60\xb1\xc1\xdd\xa2\xcd\x00\x7f\xf7\x87\x45\x0b\x81\x0c\x27\x0b\x9d\x1b\x0e\x48\xa3\xd9\xd8\xe6\x8d\x97\xb1\x7d\x77\xca\x27\xc5\x4e\xf5\xdd\xdc\x7f\xd9\x11\x49\xb7\x1a\x98\x2e\x72\x7f\xa1\x6f\xd2\xe3\x79\x08\x4f\x5c\xff\x04\x07\x90\x3e\xf4\x74\xb5\xb2\xdc\x69\xcf\xff\x75\x31\xee\xbe\xe7\x49\x89\x14\x3b\xa9\x37\x87\xf2\x0e\x5f\x79\xc7\xac\x16\x4d\x72\x5c\xa9\x91\x48\x36\xb8\x1e\x07\x90\x2e\xf4\x50\xbb\x3a\xfc\x37\xe1\xd5\x6a\x92\xc0\xba\x76\xa1\xfb\x6b\xe2\xe4\xe7\x65\x75\x6f\x71\xd7\xe4\xfa\xf1\xdc\x5f\xfb\xa5\xab\x45\x96\x2e\xe2\x00\x52\x8c\x1e\x0c\xa3\x97\x9e\xe0\xf7\x35\x53\x34\x33\x79\x16\xb8\x88\xeb\x2f\xaf\x6d\x0a\xbf\xf3\xba\x55\xee\xf6\x2b\x54\xfc\x23\x22\x4e\xda\xfc\x58\xe8\xdf\xcc\x86\xfb\x09\x96\x39\x2c\xc3\x61\x44\xfb\x68\x08\x10\x2c\xdb\x21\xa4\x0b\x66\x3a\x96\xf9\x10\x52\x0c\x0b\x10\x26\x3b\x27\x40\xda\x28\x08\x10\x4c\x86\x4e\x80\x0c\xc3\x5d\x8b\xc5\xd2\x21\xe4\x27\xcc\x41\x4c\xa2\x4e\x80\x6c\xc1\x20\x63\x72\x75\x02\xc4\x9f\x96\x00\xc1\xe2\xeb\x10\x52\x04\x6b\x03\x26\x65\x27\x40\x5e\xc0\xe9\x0c\x93\xb6\x13\x20\xa3\x30\xc8\x58\xd4\x7d\xb7\xc7\xef\x83\xff\x0a\x89\xc9\xe1\x65\xcd\xc9\x88\xc8\x5f\xe0\x00\xe2\x81\x26\xd0\x5b\x83\xbd\xdf\x1e\xd8\x27\x04\x5c\xb6\xa3\x63\xaa\x4d\x0c\xb3\xf6\xe7\x3b\x9b\x4c\x15\x93\xf0\xfb\x76\xe0\x07\x4b\x2b\x65\xf7\x1c\x1c\x40\x7c\xd0\x0a\xcd\xc5\x38\x95\xd6\xbe\xa0\x08\x6b\x13\xaf\x36\xb2\xf7\xc7\x8a\xf2\x53\xdf\x6b\x96\x1f\x61\x37\x9f\xaa\x2f\xda\xec\x94\x2a\x78\xb9\xf3\xfc\x67\x34\x25\xa6\xcd\x08\x72\xa9\x1c\xf1\x76\xbe\x9f\xf2\x55\x46\x8e\xf7\x18\x53\xa7\x4b\x91\x1d\xab\x41\x5e\x61\xaa\xc4\xf3\x4d\x06\x51\x0a\xbd\x1d\xbf\xd1\x83\x53\xca\xf9\xe6\x8f\xf9\xb6\x67\x44\x16\x75\x7b\x28\xf7\x12\x9b\x86\xf1\x3d\x5c\xf9\x7a\x30\xb1\x4a\x97\xaa\x8a\xf6\xe2\x57\xf1\x5c\x4e\x1c\x40\xe2\xd0\x73\x9c\x92\xe0\xef\x23\xdc\x53\xbd\xdb\x6f\x7d\xb7\x92\x06\x8e\x7d\x63\x67\x99\x1a\x09\x3d\xac\xe0\x3a\xf2\xd9\xbf\xa0\x8b\xfb\xf3\x62\xd4\x4e\xf7\x44\xcf\x89\x35\xce\xb4\x23\xe4\x94\x0f\x7a\x64\x28\x42\x68\x1b\x07\x5f\x94\xab\x0c\x1b\x24\xcf\xbe\x38\xb0\xfa\x8b\x33\x76\xa1\xbb\xfa\xe9\x1d\xe1\x7f\x0b\x0b\x5c\x01\x0f\x98\x4d\x58\x91\x81\x10\x1f\xb8\x33\xb0\x82\x03\x21\x9f\x61\x0f\xc0\x8a\xcf\x6e\x36\xc1\xde\x8c\x15\x22\x08\x89\x83\x13\x23\x56\x94\x76\x27\x13\x38\xff\x60\x6a\x42\x70\xfc\x83\x45\x0e\x4b\x17\xda\x6d\xe7\xb4\x90\x1e\x60\x09\x44\x40\x26\x80\xee\x7f\x2f\xf7\x2a\x45\x2b\x10\xd1\x0f\x7d\x67\x24\x78\x68\x3b\x81\x80\x6a\x6d\x2a\xbd\x35\xe3\xaf\x7e\x51\xa9\x3e\xfb\x49\x33\xf9\x89\xf6\x54\x5f\xc9\x79\x3f\x1c\x40\xc6\xd0\xad\x60\x95\x3e\x4a\x9f\xfa\xaf\x5f\xba\xd5\x58\xc7\xd1\xdc\xaa\x70\xe6\xbb\xbd\x41\x85\xcb\x53\x48\x98\x4e\x49\xf5\x47\xce\x46\x9b\xbb\x38\x80\x00\xb4\x50\x94\x3a\x93\xe5\x1c\xd7\xab\x39\x12\x53\x58\x55\x22\x70\x71\xb6\xd8\x26\x89\x93\x41\xb9\x98\xf7\x68\xde\x9b\x33\xc7\x6e\x9a\x28\xfc\xc5\x01\xa4\x10\xfd\xfc\x6c\x46\x62\x48\xa4\xe3\x86\x89\xf9\x78\xa5\xa9\x57\xa5\xab\xce\x3e\xdc\xd9\xaa\xe1\xcc\xfb\x92\xf3\x7d\x4d\x69\xbe\x77\x43\x93\x84\xff\xcd\x6c\x18\xa0\x52\x48\xb9\xb0\x2c\x87\x90\x31\xd8\x05\xb0\x8c\x87\x10\x00\x6b\x1a\x96\xfd\x10\x52\x08\x21\x98\x4a\x1d\x1c\x2a\xe1\x8e\xc2\x54\xeb\x08\x90\x34\x72\x02\x04\x4b\xb1\xdb\x55\x02\xa0\x61\x98\xa2\x1d\xdc\xea\x70\x13\x62\x0a\x77\x10\x02\x09\x15\x96\x78\x07\x21\xa9\xfb\xe1\xcb\xa4\xb1\x54\x3c\x20\x5b\x49\x44\xc4\xe0\x8e\x03\xc8\x20\x5a\x0f\xfb\xee\x44\xb7\x64\x54\x74\xf4\xf4\xc4\xa5\x7e\x8a\x09\x4d\xf6\x5b\x6f\xd5\x5f\xea\xe8\xbf\x17\x69\xd3\xa0\xec\xbb\x2b\xc1\x58\x44\x82\x03\xc8\x22\xba\x05\xf0\x98\xe1\x75\x4a\x75\x59\x3b\x0d\xcb\x53\xc2\x7e\x66\xce\x5f\xa8\xe1\x6c\xd3\xd5\xfb\x4c\x7c\xd7\x5d\x8d\x57\x8e\xad\xe3\xea\x01\x1c\x40\xb6\xd1\x73\xd8\xfb\xef\x8d\x4e\x1c\x5b\xd1\xfe\x3f\x0a\x9e\x1e\x57\xca\x30\x97\xba\xe3\x4b\x3b\xf5\xe8\xba\xe6\x7d\xd2\x68\xee\x97\x7d\xcd\x89\x3b\x25\x3a\x01\x2d\x73\xd9\x86\x3f\xed\x24\x37\x5f\x28\x8f\xbe\xd3\x1a\x5a\x4d\xe7\xb8\x64\x6c\x10\xe6\xbe\x77\x61\xcf\x6b\x36\xd3\x87\xeb\x51\xaf\x1d\x2e\xe2\x80\xb4\x22\xba\xc3\xf0\xf9\x1f\xfb\x5c\x45\xde\xfc\x87\xb4\x91\xd8\xfa\xb9\x7e\xec\x74\xf5\x08\x6b\x3d\x83\xc3\x7e\xdd\x7b\xe6\x9d\xd6\xef\x98\x8c\x85\xff\xcd\x4b\x18\xd0\x41\xc8\x38\xb0\x1c\x85\x90\x45\x98\x82\x58\xbe\x42\xc8\x36\xac\x6a\x58\xee\x42\x48\x02\x3c\xdc\xc7\x72\x19\x8e\x94\x8a\x84\x2f\xc1\x14\x6c\x09\x5f\xe2\x0a\xe7\x43\x4c\xd1\x16\x4e\x3b\xb0\xa6\x63\x09\xb7\x10\xf2\x0d\xd6\x1f\x4c\xed\x16\x56\x06\xa8\x78\x61\xea\xb7\x04\x48\x13\x5c\x49\x2c\x0d\x17\x42\xd6\xa9\x21\x47\xc1\x14\x73\x65\x28\x88\xe8\xf0\x38\x80\x78\xa1\x37\xc7\x21\x7f\x7c\x80\xcb\xa9\x96\xa1\x0f\xc9\xf7\x8b\x42\xaa\xfa\xa8\x4e\x3b\xe4\x98\xb2\x2d\x3b\x9a\xbc\x7f\xaa\x6f\xe7\x79\x5d\xd8\x05\x00\xc4\xeb\x3f\xef\xf3\x4b\xa6\x7b\x7a\xe9\xf0\x94\x0b\x8b\xea\x25\xef\x94\xa0\x82\x2d\x3a\xc5\x9a\x43\xe3\xc1\xba\x43\x34\x2c\xfe\xae\xa7\xec\xac\x54\x00\x32\x8b\x3e\xd9\x43\x02\x94\x6f\xa5\x6e\x15\x14\x4d\xe7\x9c\x92\xaf\x1d\xba\x6b\xa5\xc4\xdd\xc5\x53\xc5\x43\x6f\x7d\x21\x96\x81\x3d\xc4\x58\x9e\x75\x27\x50\x68\x73\xc2\xf0\xa2\xd7\x86\x6a\x36\xcf\x2b\x0f\x4d\x1b\x84\x5d\xa3\x8f\x7d\xa9\x5a\x41\xa9\x38\xc3\xb4\xba\x10\x95\xb1\x31\x58\x22\xe7\x2f\xfc\x8f\x56\x13\xe2\xe3\x05\x33\x1d\xd3\x70\x08\x81\x23\x37\x96\xf1\xbb\xba\x23\xe4\xa3\x58\xf6\xef\xa6\x07\x34\x0c\x53\x54\x27\x40\x7c\xe1\x16\xc4\x12\xd6\x21\x64\xe9\xc0\x72\x07\xfd\xff\xc7\xd0\x89\x4a\xa8\x51\x54\xaf\x19\x1d\x39\x6d\xf2\x8d\xd4\x78\x7a\xc6\xdd\xc6\xb5\x7a\x45\xf3\x85\x6c\x83\xa6\xa6\x19\x15\xc2\x12\x01\x64\xb7\xb7\xb7\xb7\x43\x77\xaa\x5b\x2a\x7a\x60\xf5\xd3\x9e\x8b\x3d\xcc\x2d\xe6\xd5\xf4\x83\x6a\xf9\xd8\x93\xa3\x5f\x84\x55\x4a\x5f\x9c\x3a\x36\x7d\x54\x53\xd5\xdf\xe1\xcc\xeb\xf7\xe8\x53\x99\x88\x5a\xca\x37\x7c\xf8\x98\x6c\xd7\xe2\x73\xfe\x2d\x44\x2a\xe6\x89\xb5\x03\xb3\x11\x1d\x37\x13\xcc\x04\xfa\x94\xfd\x8e\x28\xf7\xa3\x1e\x65\xf6\x7c\x28\x2f\x77\x9f\x76\xe4\x54\xa5\x30\xd7\xfe\xf4\xac\x68\x40\x5e\x5d\x9f\xec\xcb\xa7\xe5\x34\xf9\x40\x36\xc5\x63\x1c\xfd\x56\x72\x92\xd1\x31\xc1\xe2\x9b\x47\xae\x94\xcf\xb6\x3c\x7b\x7f\x41\x99\x26\x36\x2c\x73\xbc\x52\x6f\x24\x48\xfc\xa7\x08\x38\xfc\x3d\x65\x00\x0f\x90\xa4\xff\xfc\xbf\xc0\xd3\x4a\xdc\x76\x75\xdd\x4b\x79\xda\x83\x72\x76\xe3\xf9\xed\x8a\x13\x86\x43\x26\x51\x5a\x6d\xbf\xd4\x3c\x7b\xbe\x70\x3a\xf8\x02\xa4\x0a\x9d\xa1\x1e\x27\xc8\x94\x9f\x0a\xdf\xc0\xb3\xaa\x5d\x00\x99\x61\xd6\xb1\x7e\x3d\x71\xf9\xe4\xd6\xc7\x8f\x7c\x76\x9a\x90\x65\xba\xee\xd8\x09\x90\x11\xf4\xe4\xb4\x44\xac\x3d\x10\x56\x77\x30\x5d\x3a\x07\x59\xfc\x61\x6a\x91\xbc\xb7\x57\x1b\x2c\x5f\x3d\x6e\xfc\xa1\xc5\x6d\xc1\x59\xe5\xd5\x30\x0e\x20\xb9\x68\x5d\xf5\xd9\xed\xb0\x5f\x95\x57\x4c\x5e\x52\x9d\x13\x57\x93\xb0\x98\xe9\x3b\x61\x57\xcb\x5f\x16\x3a\xb7\xf7\x3b\xe9\x87\x57\xfe\x48\xe7\x14\x00\x88\x07\x9a\x7f\x94\x9a\xb9\x0a\x8f\xfd\x1d\xaf\xc9\x59\x92\xd1\xea\xd1\x95\xa4\xf4\xad\x8b\xb4\x32\x7b\x9b\x6e\x7e\x7a\xf1\x37\x7d\xaa\xb1\xca\x1b\x80\xb4\xa1\x35\x00\x8f\xf1\x75\x91\x95\x47\x32\xa2\xc7\xa3\x86\x5b\xb9\x26\x23\x67\x70\x25\x4c\x7f\x9b\x05\x5a\x91\x2f\x92\x1b\xca\xbc\x12\xa3\x72\x78\x80\xbc\x45\xdf\x00\xc9\x12\xbf\xd9\x1b\xf3\xbe\xbf\x56\x68\xb5\xd8\xa5\xf7\xe6\xa3\x5f\xd3\x7f\x4d\x85\x6f\xd3\xc9\xd6\x25\x52\xad\xfd\xf0\x52\x68\x24\x03\x48\x15\xfa\x48\xf6\x99\xeb\xf0\xf0\x23\xcb\xe7\x37\x0a\x05\xbd\x7a\xda\x39\xa4\x3f\xfd\xb0\x76\xaa\xe1\x8e\xab\xda\x2a\x96\xbf\xc9\x65\x71\x2c\xea\x14\x40\x5a\xd0\xc6\xd3\xb5\xfc\x51\x99\x74\xde\xcf\x2a\x66\x74\xcf\x35\xdc\xeb\x4e\x70\xf1\x88\xfe\x21\xb6\x23\x7d\x26\xa9\x4d\x15\x47\x8b\xa8\x54\x97\xd1\x17\xd5\x68\x6f\xb0\x4f\x57\x9e\xf2\xbc\xae\xe8\x9f\x64\x6b\x1f\x63\x16\xec\x23\x79\x2f\xd3\x08\xf9\xc8\xf7\x45\x55\xbc\x55\x51\xa0\x08\x7d\xce\x73\xf1\x1a\x62\xb8\x5d\x22\x6c\xfd\xfd\xd8\xf2\x3d\xb2\x86\x62\xf3\xf9\xf5\xc4\x9f\x8c\x07\x2f\x6d\x3c\x6c\x33\x9a\x17\x2a\xb9\x8b\x03\xd2\x92\xa8\xc7\x5d\xd2\x0a\x5b\xcf\x6e\x8a\x1d\xd7\x57\x77\x08\x1c\xff\xda\x28\x1d\x5f\x2a\x66\xfa\xd3\x7b\x38\xb3\x97\x69\x21\xbc\x6b\xac\xe1\x33\xfa\x76\xdd\xfd\x43\xc3\xdc\xad\xc6\xfb\x5b\x78\xdb\x33\x68\x9e\x3a\x6a\xb5\xbd\x17\xae\xcc\xe2\x1b\x33\x68\xa8\x92\x57\x3d\x9e\x73\xdb\x04\x00\xa4\x15\x9d\x2b\xfb\xdb\xec\xaf\x1e\x11\xdb\x73\x55\x6b\x53\x4d\x98\x73\xe6\xef\x57\xf7\x6f\x92\x0f\x15\x4b\xad\x0a\xdd\x57\x0e\xf6\x59\xce\x4d\xd2\x02\x64\x01\x9d\x2b\xc7\x7e\x9e\x06\x27\x28\x63\xdb\xef\x70\xc7\xca\xf2\xc9\x05\x04\x9e\xe2\x65\xf8\xf2\xc0\x48\x66\xe3\xd8\x1e\x27\x4d\xd2\x21\x8a\x09\xd4\xa3\xd5\xed\x7a\xa7\xda\x0e\x93\x70\x3d\xe1\xff\x2a\xb6\x39\xf5\x76\xea\x72\xe2\x2a\xad\x5f\xd8\x17\xc1\x5f\x83\x22\xac\x4f\x93\x6f\xdf\xde\x29\x32\xe8\x85\x11\x27\xeb\xcb\xf8\x23\x3b\x13\x42\x94\x37\x1c\xed\x3a\x30\xc3\xb3\x54\xfe\xc1\x06\xd7\x5b\x3a\x1f\x35\xfa\x55\x39\x9c\x78\xcd\x09\xf5\x68\x65\x7b\x5c\xf7\xe6\xc7\x92\x73\xa1\x9d\x3f\xba\x0a\xea\x54\xb9\xc9\xf2\xb5\x6b\x54\xb5\xd8\xf4\xcf\x5f\xe1\xaa\x51\xc5\xbb\x50\xe0\x81\x34\xfa\xac\xfc\xd6\xf8\x9f\x00\x8d\xca\x9a\x79\xa1\xd1\x05\xa1\xbb\xc6\xb7\x9f\x69\x1c\x3d\x4e\xf3\xf1\xe0\x84\xda\xa6\x75\x6d\x7b\x06\xcb\x25\x61\x80\x54\xa0\x99\x47\xa8\x03\xd7\x9d\x03\x54\xd1\xa7\xa7\x0d\x0a\x90\xa5\xe6\x0c\xcb\x14\xcd\x23\x6f\xb5\x93\xb9\xc9\x57\x02\xb5\x56\xa2\xcf\xcb\x4b\x00\xe4\x13\x3a\x43\xc8\xbd\xdc\x18\x3f\xb0\x70\x33\x95\x20\x5d\x9f\x4b\xef\xad\x1a\x17\xaf\xfc\xf8\x9b\x76\x41\x2f\xba\xa8\xe8\xb2\xf8\xb3\xee\xcd\x23\x3b\x2c\x0d\x4d\x67\xbf\xb0\x9e\x6f\x37\xcd\xdb\xd7\x8b\x23\xc2\xc7\x5d\x2b\xa5\x3f\x9f\x9b\xa3\xd2\xf5\xa5\xe8\x11\xa7\x36\x93\xe7\x10\xa2\x78\xd3\x18\x0f\x90\x68\xf4\x6c\xe8\xfa\xa6\xbd\xeb\x2e\x5d\xf9\xd9\x90\x83\x61\x39\x99\xa7\x0b\xaa\x5f\xcd\xb7\x98\xf0\x0a\xde\x66\xd0\xdd\x16\xf2\xb7\x3d\xc2\x1d\x00\x90\x4c\xf4\x82\xfa\xd4\xdb\x18\xd7\x8c\x6b\x39\x6b\x6a\x7c\xba\xa5\x73\x64\xaa\xfc\xf6\xb4\x86\x10\xbe\x67\x9b\xf3\x91\x25\x59\xd3\x41\xd3\x56\x65\x80\xfc\x40\x77\xa7\x55\xfc\xd6\x8f\x3f\x1a\x69\x59\x26\x8a\x05\xbc\xe5\x8e\x1d\xec\x86\xfc\xe2\x1d\xad\x5f\x39\x93\x93\x18\xe6\x45\x97\xbc\xcb\x3a\x01\x90\x56\x42\xdf\x89\xf5\xf8\xae\x1c\xc7\xb8\x1c\x11\x67\x3d\x9f\x4b\x2e\x28\x49\xfe\xe6\x39\x85\x65\x38\x95\x8f\xcd\xdb\x58\x3b\xe1\x38\x5e\x4b\x2a\x80\xf4\xa1\xd7\x34\x27\x2c\xfd\x70\xdb\xc4\xd9\xc3\x6d\xdf\x91\x94\x63\xe2\x56\x66\x92\x22\x2e\x95\x9b\x0b\xfb\xdd\xb5\xbf\x85\xe8\xe3\x27\xa8\x2e\xa3\x1e\xf5\x8c\x13\x35\x3f\xa6\xd7\x61\xef\x37\x80\xcc\x67\x09\x26\x99\xaf\x27\x0c\xbc\xa4\x9c\xfd\x74\xcd\x3b\xba\x5d\xff\xd1\x5c\xac\x15\xfa\x10\x36\x90\x4a\xca\x8c\x9c\xb3\x98\x44\x29\xfd\x98\x71\xe6\x75\x7d\x5a\x17\x5e\x66\xdc\xf1\xeb\x57\x71\x6d\x71\x33\x6f\x22\xa4\x4f\xe1\x01\xf2\x06\x7d\xc9\x43\x32\x9f\x7c\x8c\x5d\xae\xf1\x09\xd3\xc0\xad\x0b\x53\x67\x1b\xe9\x82\xae\x6a\xae\xd7\x44\xbc\xa5\x99\xdd\x22\xb9\x14\xaa\x4c\x7d\x1f\x20\x63\xe8\x90\x54\x25\x29\x1a\xd0\xa7\x84\x90\xb3\x5e\xd3\x4f\x66\x1d\xff\x33\xfd\x57\xed\x6c\x40\xfd\x0f\xa9\xeb\x4f\xfa\xbe\xb7\x05\x5f\x55\xd9\x00\xc8\x3a\xfa\xcc\xb6\x90\x36\x78\x2a\x59\xbc\x4e\xb0\x0e\x27\x56\x9f\xa0\x9d\xda\x1e\x78\xac\x67\x43\x94\xf2\xe3\x04\x1d\x79\xc8\xd5\xc0\xc2\x0b\x7d\xa8\x47\xf7\x29\xb0\xc4\x49\x3e\xf2\xcf\x5e\xd2\xd1\x9f\xa4\xcc\xe2\xee\xa3\xfe\xab\xab\x7b\xf4\xa7\xd2\x6f\xaa\xd9\x95\x67\x6f\xe3\xb9\x56\xd1\xc7\xfb\x05\x49\xc2\xfb\xae\x75\x57\x25\x08\xe1\x0a\x16\x4b\x55\x83\x98\x57\x34\x37\xdf\x2b\xf5\xaa\x12\xdd\x8a\xe4\xe9\x3c\x91\xf2\x08\x00\xe4\x35\x3a\x4b\xbc\xf6\xdb\xca\x11\xff\x64\x08\x6c\xcd\x7f\xeb\x91\x2c\xaf\x22\x5f\x14\x1a\xae\xf0\x40\xdb\x5a\xb9\x36\x70\x81\xc1\x53\x3d\xf9\x32\x40\x1a\xd1\x84\x40\x40\xb7\xfb\xf2\x42\xc4\x21\xab\x98\xfa\xc6\xda\x31\xda\x4e\xcd\xa6\xdf\x07\x05\x2a\x9a\xee\xc7\xd3\xe8\x2a\x8d\xf7\x7c\x90\x0e\xdc\xf9\x78\xf4\x2d\x0c\x9d\xcd\xc1\xc5\x96\xd3\x6a\xa6\xe6\xda\xad\x34\xeb\x63\xac\xbf\x8e\xab\x44\x7f\xa3\x2f\xbf\xf6\xce\xd9\x7e\x3c\x5c\xeb\xdd\xe7\x77\x00\x79\x8f\x1e\xa9\x2e\x1f\x7d\x41\x7f\x38\x23\x5b\xf0\xe4\x37\xde\xe3\x0c\xa4\xe2\xf7\x94\x8f\xe9\x8f\x17\xb0\xdc\x9c\x5b\x0c\x97\x10\xb3\xce\xd4\xba\x0b\x00\x12\x87\xb6\x5e\x61\xc3\x77\xf2\x79\xdf\x37\xf9\xef\x46\x8f\x68\x4f\x8a\x7f\xd3\x5a\xa6\xe4\x7c\x77\x56\xa4\x8e\x35\x83\xd8\x48\x56\x88\x6a\xc3\x1b\x20\xe5\xe8\x2a\x54\xe6\x5a\x9b\xfb\x24\xd5\x0b\x1f\x51\x35\xdd\xf0\x9a\x6b\xe1\x7e\xe3\x6d\x31\x95\xd2\x7c\xbe\x53\xaf\x9a\xde\x1e\x6a\xff\x48\x8e\x3e\xc1\x4e\x9a\x77\x31\x53\xbd\x79\x32\xea\x61\x4b\x2f\xd9\xfe\x90\xc0\xbe\x27\x60\xdf\x7b\xa6\x76\x03\xf5\x2f\x25\x8e\x25\xf3\x89\xc1\x62\x38\x80\xbc\x40\x7f\xb4\xc4\xa9\xca\xef\x77\x4e\x8f\xd1\xac\x47\xd4\x66\xd9\xdf\xd5\xc6\x9d\xe4\xdc\xa4\x72\xb1\x4b\x99\xbe\xb2\x2e\x3c\xe8\x7e\xfc\xf8\x29\x1c\x40\x5a\xd1\xcf\xf3\x30\x7e\x53\xb3\x14\xb3\xb3\xc9\xbd\xa6\x1d\x55\xc5\xab\x53\x46\xc6\xb3\x68\xa8\x5f\x48\x52\xc2\xc9\xc1\xbf\xaf\x63\xec\x3c\xfa\x45\xd0\xd9\xa5\x03\xed\xfe\xaa\x3d\xe6\x46\x6a\x5c\xe6\xa7\x53\xdc\x74\x85\x38\x1d\xfd\xba\xab\x8b\xfd\xac\x19\x99\x52\xa5\xaa\xcb\x53\x85\xff\x6d\x3a\x01\x32\x24\xff\x47\x3b\xa9\x20\xed\xc4\x1a\x53\x80\x8c\x82\xec\xff\xde\x45\x39\x81\x66\x79\x73\x2b\x07\xf9\x95\x49\xfc\xe8\xc4\x03\x12\xed\x2e\x26\x92\xd4\x6b\xb7\x70\xf0\xdf\xbf\xd9\x2e\xee\xfa\x33\x31\xf7\x85\x7b\xdc\x26\x0e\x20\x49\xe8\x55\x7d\x2f\x39\x54\x49\x7b\xc1\xa8\xfd\xc0\x91\xd4\xf4\x3b\x4e\x94\xe9\x12\x23\xee\xdc\x39\x73\x42\xc9\x9f\x72\x5f\x3a\xc9\x55\x27\xb7\xe1\x00\x32\x84\xee\xcc\x5b\x2d\xca\x9f\x19\xa3\xe5\xdf\x9d\x90\x20\x5f\xc8\x5a\x3a\xb4\xef\x7d\xaa\xc2\xf8\xb3\xa9\x73\x78\xab\x6f\x7f\x55\x1f\x6e\x73\x1e\xc4\x01\x24\x07\xfd\xbc\xd9\x59\x96\x98\x37\x7d\x35\xca\xb1\xcf\x2e\xf6\x92\x76\xc9\xdc\xd4\x67\xb9\x54\x77\xe9\xd1\x17\x4a\x3e\x7b\xcd\x6e\x25\x31\x5f\x16\x1c\x40\x5e\xa1\x27\x85\x96\x0a\x07\x43\xce\x58\x4a\x1d\x6e\xbd\xaf\x89\x34\x73\xa6\xa4\xe1\xc2\x57\x73\xd6\x53\x87\x5b\x86\xf6\xef\xeb\xb6\xe7\xbc\xc1\x23\xfc\x6f\x6e\xc2\x80\x4e\x40\x31\x1b\xcb\x53\x08\x49\x82\x93\x35\x96\xb3\x10\x32\x04\x8f\x2c\xb1\xfc\x85\x90\x1c\x08\xc1\x72\x19\x42\x5e\xed\xca\xcc\x58\x83\x29\x90\x95\x22\x21\xab\x7e\xb1\x43\xbd\xd0\xd1\x8d\x11\x69\xe8\x5c\xb8\x16\x5f\xf1\xd4\x92\x5d\x91\xa5\x69\xad\xdb\xef\x3a\xd9\xcf\xbd\x91\xe5\x2e\x93\x85\x16\xc9\xa5\xef\x6b\xa3\x71\x00\x49\xfe\xcf\x7b\x53\x28\x35\x24\xbb\x47\xcc\x35\xfc\xff\x2c\xef\xb9\x7f\xd7\xca\x88\xab\x4d\xb5\x21\xb9\x94\xdb\xb8\x2a\xb5\x67\xb0\xd2\x30\x40\x00\x07\x90\x0c\x74\xdd\xb4\xbf\x64\xdc\xb1\x14\x41\x25\xb9\xb2\x61\xa0\xe6\xca\x1c\x6c\xe9\xdb\xc1\xf4\xb8\x4c\x51\x9a\xa8\x5d\x43\xac\xf7\x15\x8e\xca\x1c\x07\x10\x77\xf4\x4e\xdb\x1a\x11\xf9\xe8\x58\x28\x90\xe1\x36\xe8\xfe\x46\x51\x69\xc0\x0b\x7f\xac\x8a\xd8\xfa\x3a\x3b\x47\x07\x3e\xed\x4d\x9d\x41\xf9\xff\x64\x6f\x74\xb6\x3a\xd8\x47\x3f\x7a\xba\xff\x9b\xfe\x3d\x9d\xeb\xa1\x9a\xb3\xef\x5d\xdb\x59\x6f\x1b\xf4\xba\x9a\xf8\x6f\x18\x3d\x75\x1c\x3b\xa1\xb9\xd3\x97\xc3\xd0\x65\xbf\x54\xec\xa3\xdd\xea\x13\x85\x73\x72\xcf\xfb\x8f\x05\x7a\xa4\xc5\x5e\x2d\x2c\x5b\x8f\x6b\x0f\x6c\xcb\x96\x9c\x9d\x97\x8b\x1e\x21\x64\x13\x56\x58\xe0\x0a\xac\x43\x1a\x8f\x15\x19\x08\x49\x86\xc7\x09\x58\xc1\x81\x90\x0c\x78\x3a\x89\x15\x1f\x08\x71\x87\x32\x22\x56\x88\x20\xc4\x07\xa6\x39\x56\x94\x20\x24\x8c\x16\x56\x27\x2c\xba\x03\x64\xaa\x38\x89\x77\xaa\xd3\x2f\x74\x4f\xe0\x2b\x3c\x49\xa5\xf2\xe2\x95\xed\xb3\xdb\x75\xae\x81\x51\x53\x4e\xdc\x93\xaf\x0c\x12\xd9\x92\x88\xcf\xec\xd3\x48\xc9\xcc\x7b\x4f\x82\x03\xc8\x27\xf4\xf3\x57\x6b\x2b\x05\x57\x5f\x8b\xd6\x9f\x24\x15\x78\x18\x1a\xdf\x66\x91\x33\xd2\xb4\x6c\xb5\x49\xf2\x44\x99\x2a\x6f\xff\x2a\xb5\xcf\x12\x0e\x20\x9d\xff\xf9\x13\xc4\x97\x16\x31\x8f\xae\x30\x36\x4f\x86\x6a\x9c\x1f\x2d\x37\x92\x95\x43\xcc\xcd\xc9\x47\xa3\x5c\x3e\x51\x7d\xad\xa0\x48\x6c\x56\xc1\x01\x64\x01\x3d\x16\x8e\x5d\x99\xb9\xd5\x1e\xa0\x32\x77\xad\x84\x3c\xc8\xfb\xac\xb6\xc8\xb5\xb1\x5c\xe4\xe8\x21\x41\xfb\x9b\xd6\x23\x51\xb9\xf8\x3d\xe7\x77\xd6\x0f\x7d\x8c\x92\xad\x74\xa2\x57\xd6\x4a\x10\xff\x8a\xf6\x2d\xf7\x2a\xf7\xa2\xdd\xfe\xca\x7e\x2f\x7e\xb7\x74\x6e\x12\xcb\x3f\x0f\x68\xd6\x82\x56\x84\xff\xcd\x4d\x18\xd0\x5f\x50\x4a\xc1\xf2\x14\x42\x3e\x41\x08\x96\xb3\x10\xd2\x09\xcf\xcd\xb0\xfc\x85\x90\x05\xa8\x24\x61\xb9\xbc\x9b\xe8\x50\x97\xc5\xa4\xb6\xb0\xd2\xc2\xc3\x11\x4c\x7a\x4b\x80\x54\x41\x0d\x03\x8b\xe2\x42\xc8\x08\xdc\x1b\x98\x2c\x97\x00\xc9\x85\x82\x31\x26\xd1\x25\x40\x3c\xe0\x71\x12\x16\xd9\x85\x90\x36\x58\x4d\x30\xf9\x2e\x01\xf2\x16\x76\x0d\x4c\xce\x0b\x23\x06\x0b\x10\x16\xef\x85\x90\x16\xe2\xe5\x54\xd2\x7f\x23\xc0\x40\x96\x84\xec\x80\xe1\x4e\xa3\x19\x41\x9f\xac\x74\x4c\x39\xd9\x98\xf3\x31\x31\xcb\x96\x9c\xf9\x79\x3a\x5d\x72\x32\x5d\x7a\x46\xf4\x33\x11\x17\x8e\xa3\xfc\x8e\x6d\xaa\xfc\xda\x36\x00\x48\x02\x9a\xe1\xb4\x2b\x52\xba\xd2\xf9\x5c\x2d\x54\x0f\xd6\xdd\x5b\xfd\x9d\xf3\xb9\x48\xac\xea\x65\xcd\xcc\x0b\xb9\x59\xcf\x6d\x89\x6f\x5d\xfc\xa1\x0d\x90\x25\x74\x1f\x33\x52\xb9\x7f\x57\x22\x4e\xd1\xde\xad\xec\xcc\x0f\x15\xc7\xde\xe7\x49\x8e\x7e\xa2\xb9\xdc\xb7\x2e\x34\x55\x3d\xa8\x1a\xd9\x67\x60\x89\x03\x48\x13\x7a\x62\x3c\xb7\x4f\x39\x98\x41\x97\x8a\xfb\x97\x48\xf5\x6a\x7f\xd9\xdb\xe7\x3e\x9c\x72\xc4\xbd\x01\x36\x0c\xa9\xfe\x02\x7a\xcc\x99\x9b\x26\x3b\xb9\x88\xee\x4b\x73\xab\xbc\x15\x81\xa2\x43\xf1\x67\xa8\x93\xde\x6b\xdf\x7e\xc0\x9d\xfb\x94\xd2\x32\x5c\x23\x4b\xf2\xb2\x4f\x9e\x17\xe5\x77\xc7\x12\x00\x90\x6a\xf4\x94\x93\xc0\x3e\x74\x5a\xe6\xbd\x84\xe0\x33\xf6\x72\xb5\xe9\x8e\xb1\x80\xd6\xe4\xb0\xd8\x4a\x52\x66\x47\x16\x62\x91\xba\x53\x8f\xb7\xae\x01\x64\x10\xad\xfd\x9c\x98\x55\xba\x31\x71\x62\x7f\xc4\x70\x89\x88\xc5\xde\x9c\x62\xf9\xa6\x80\xec\x97\x9d\xb9\x45\xb7\xa5\x05\xac\x5c\x4d\xb9\x9f\x66\xe0\x80\xf4\x31\xb4\x1a\xc2\xda\xd0\xa4\xe4\xd4\xe9\xa0\xb2\xe6\xc8\x74\xab\x96\xcb\xbf\xe5\xe1\xbe\xe6\x37\x19\x2a\xf7\x4a\x72\x3b\xed\xca\x43\x48\x25\x84\xff\x31\xe6\x70\x43\xc0\x43\x17\xcc\xb0\x13\x20\x09\x70\xdb\x61\x85\x1e\x42\x96\x60\x76\x63\x45\x1f\x42\x9a\xa0\x18\x8d\xb9\x00\xb0\x84\xc0\xcd\x8d\xb9\x06\x04\x48\x35\xdc\x43\x58\xeb\x00\x21\x83\xf0\xc7\x79\x58\x6b\x41\x80\x48\x1f\x83\x8a\x37\x96\x30\x04\x64\x29\xe9\x5c\x89\xf0\x00\x48\x0b\xa0\x16\xfd\xb8\x0b\x71\x51\x96\xc0\xbd\x08\xaa\x5b\xd7\x5e\xc9\x19\xf1\xd6\x8a\xf0\x97\x29\x24\x9e\xab\xf8\xb1\x90\xb5\x4c\x97\x97\x5d\x1b\x02\x90\x25\x74\xe7\x33\xfa\xaa\xa5\xe9\xeb\xfa\xe5\x03\xfe\x4d\x59\x41\x30\xee\x4b\xb9\x97\xc2\xfd\x8f\xec\x75\xe7\x1f\xa9\x7b\x22\x35\xd1\x33\xfe\x94\x38\x80\x6c\xa1\x9f\xb7\x48\x0c\xcb\x3a\x3b\x5c\xb0\x3d\xe1\xa5\x6d\xd3\xe3\x44\xe7\x94\x44\xc7\x91\xb2\x26\xf6\x2c\x63\x62\x1f\xcd\x7d\x4f\xe2\xbd\x27\x77\x3a\x0d\x7a\xc7\x95\x25\x56\x66\xae\xd5\x73\xe4\x06\x9a\xd5\xaa\x71\xbc\x8e\x65\x22\x92\xf1\x66\x2f\x20\x11\x3a\x72\xa2\xf8\xe8\x05\x16\x5c\x54\xa7\xd0\x3f\x5a\x4d\x08\x8f\x00\xcc\x27\x0c\xc3\x77\xf3\x09\x76\x31\x2c\xdb\x21\x64\x0b\x42\xb0\xcc\xdf\x6d\xaf\xf0\xef\x1e\xb0\x04\x3a\xe8\x8a\xe4\x72\x1f\xe9\x3f\x0a\x75\xb2\x24\x2a\x7b\x3d\x3d\x76\xfa\x2b\xba\x58\x0a\xf3\xf2\x01\xbc\x77\xc1\x45\x21\x15\x3f\xab\xad\x23\xbe\x42\xa1\x7b\xd2\x5c\x6e\xbc\x60\x2b\xe0\xf1\x15\xb3\x7c\x17\x74\xb8\x76\xa7\xbb\xa0\xd7\xee\x4c\x7b\xb6\xda\xcf\xbf\xb1\xae\x4b\x9e\x42\xa7\x75\x23\xed\x05\x52\x58\x96\xab\x1b\xfb\xd2\x17\x5d\x9e\x30\x69\x7d\xdd\xfe\xfb\x75\x67\x50\x45\x57\x27\x8a\x11\x6b\x01\xf6\xa2\xdb\x66\x32\xb3\x8f\x9e\x4e\xbf\x34\x95\x2d\xd8\x4a\x0a\xfb\x43\xb9\x76\x41\x20\xe9\xed\xd9\x19\xd1\xcf\x3b\x9c\x30\x1d\xcd\x21\xe3\xd2\xdc\xe8\x9e\x3d\xa9\xb9\xb5\xff\x16\x23\x25\x78\xa5\x49\x4c\x7f\x3b\xc8\x97\x63\x9b\xa2\x54\x6b\x2b\xe5\xda\x81\xb6\x41\x1a\x1c\x40\x36\xd0\x53\x5a\x52\x74\xdb\xe4\x87\xd6\xcc\xbe\x9a\xb3\x96\x5e\xa7\x65\xc7\xbe\xc6\x3b\x6a\x66\xf3\x37\x64\x5e\xa6\xfd\x69\xae\x34\x25\x10\xa9\x8b\x07\xc8\x5b\xb4\xba\x66\xfe\xa3\x71\x4d\xe6\xec\xdc\xa1\x27\x85\x67\x3e\xd2\x16\xdb\x1b\x2d\x53\xd3\xe2\x2d\x3c\x32\x1c\xc7\x3a\xe9\x9f\x2f\xfd\x74\xec\x06\x48\x32\xba\x78\x4f\x66\xb1\xdc\x0f\x2f\x38\x42\xf6\x92\x2f\x97\x63\x7f\x91\xe3\x73\xe1\x34\x5d\x1f\x47\xcd\x15\x11\x29\x1b\x41\x9d\xec\x5e\x46\x67\x80\x7c\x44\x3f\xde\xe7\x26\xaf\x1f\xd4\x9f\x1a\x52\xda\x19\x6f\xbe\xfc\xb0\x70\x9f\xf6\xec\x1c\x2e\x6b\x0f\x18\x09\x49\xd8\xee\x3a\xc1\x2d\xbe\x13\xfd\x51\xb4\xb7\xe3\xf4\x7f\x78\x02\xbf\x1e\x9c\xd3\x89\xb8\xfb\xd3\x47\x4d\x25\xfd\x6a\xbf\x67\xe6\x71\xdc\x53\x7f\xc9\xd8\xed\x3d\x47\xce\xc5\xfd\x16\xfe\xb7\x45\xda\x1d\x9d\x60\x75\xc5\x5a\xa7\xdd\xd9\x01\xe6\x29\xd6\x52\xed\x32\x11\x58\xc4\xb0\x56\x0b\x42\xd2\x21\x15\xc6\x5a\x30\x08\xd9\x80\xc3\x26\xe6\x9a\xc1\x09\x05\xce\x41\x98\xeb\x06\x27\x47\x58\xf6\xb1\xd6\x0e\x42\x3e\x42\x08\xd6\xf2\x41\xc8\x28\x74\x1f\x53\x1f\x27\x40\x5a\x61\xd7\xc3\xd2\xc8\x77\x57\x9f\x1a\xfe\xf6\x1e\x4b\x2c\x07\xb2\xc6\x44\x2c\xff\xfb\x0b\x94\x40\x74\x3e\x3e\x3f\xc0\x39\x51\xf4\x3a\xbb\xea\xe5\xf8\xe8\x6c\x99\x9c\x93\x43\x31\x8e\x98\x87\x55\xf9\x22\x8b\x7b\x4c\xb9\x22\x99\x3a\x73\x3f\x0e\x20\xb8\xff\x9c\x95\x08\x29\x0d\xfe\xad\xa2\xd8\x2c\x0f\x47\xc8\x2b\x8f\x30\x3b\x9e\x4b\xf3\xf3\xd7\x12\x3c\x17\x9a\x78\x49\xf8\x7c\xf8\x39\xc6\x6d\x1c\x40\xf2\xd1\xa3\xd6\xf1\xbb\xef\xc8\xed\x8e\x7d\xed\xfc\x63\xb0\x66\x52\xb5\xba\xc2\x70\xb9\x28\xb5\x79\xec\xe3\x79\xa3\x2e\xd2\x2d\xdb\xf6\xa0\x2f\xeb\x38\x80\xac\xa1\x77\xeb\x97\x2b\x39\x7e\xd6\x4e\x77\x0b\x68\x5f\xf4\x71\x7d\x3a\xca\x9b\x3b\x4d\x75\x92\xc5\x6d\xf6\x46\x72\x7f\x79\xd2\x34\x85\xd9\xa2\x3e\x0e\x20\x91\xe8\xd9\x29\x6c\x23\xfd\xba\xb7\x23\xe3\x2d\xfc\x96\xda\x83\x4e\xa1\x34\xb7\x60\xd3\x92\x64\xc7\x60\xab\x1b\x67\x8c\x1e\x1a\x1e\x2a\x3a\x70\x45\xf8\xdf\xdc\x84\x11\x0d\x84\xeb\x86\xe5\x29\x84\xe0\xe0\xe6\xc0\x72\x16\x42\xf2\xe1\x52\x63\xf9\x0b\x21\x6b\x30\xd3\xb1\x5c\x86\x90\x48\x38\xad\x60\x9d\x8c\x40\xc8\x2c\x05\x1c\x24\xb0\x8e\x48\x80\x0c\x27\x11\x3d\x1e\x07\x90\x08\x74\x3d\xac\xba\xf4\xb9\xc2\x8a\x97\xe8\xcf\x9f\x8b\x3f\x89\x4d\xf4\xda\xd8\x1e\x70\x1c\x1f\x5d\xe8\xde\x94\x0a\x5c\x30\xeb\xbb\x7e\x2b\x9d\x09\x00\xc4\x1f\x7d\x95\x6f\x41\xc3\xf1\xc6\x65\x8d\x62\xa1\xf1\x6e\x59\x7e\xdd\xd6\x4b\xc9\x12\xbe\xe1\x37\x4c\x66\xa3\x8c\x58\x0c\x46\x25\x18\x16\x52\x4e\x01\xa4\x0d\x9d\x7e\xb2\x03\xfa\x14\x2e\x24\xa1\xfe\x3f\xe4\x7e\xc6\x7a\xd8\xdf\xa4\xf5\xbf\x19\xed\x93\x4e\xe1\xa8\x34\x5f\x70\x48\xdd\xaf\x8a\xee\xdb\x4e\xa0\xd0\x12\x51\xee\xc1\x15\xf2\x51\x91\xe3\x24\x5d\xe4\x8f\x9c\x71\x8b\xe4\xb4\x0a\xc1\xaa\x27\xf1\xd6\x62\x1a\x54\xeb\xf3\x65\x49\x24\x32\x3a\xc2\xff\x68\x35\x21\x3e\x11\xb0\x12\x60\x1a\x4e\x80\xf8\xc3\x0b\x76\x58\xc6\xef\x52\x35\x98\x51\x58\xf6\xef\xa6\x07\xfc\x5f\x1d\xcc\xb3\x2a\xc2\x24\xa1\x0a\x2f\x7f\x63\x1d\x57\x11\xbe\xa4\x02\xf2\x74\xac\x23\xab\xdd\x09\x67\xf7\x46\x30\xc6\xa9\x15\x84\xc4\xc1\xab\x28\x98\x07\x57\x04\x48\x34\xec\x1c\x98\x87\x57\x04\x48\x26\xdc\x82\x98\x07\x58\x04\xc8\x0f\xf8\x6f\x2a\x98\x87\x58\x84\x18\x2b\x11\xbe\x04\xeb\x1c\x0b\x7e\x49\x1f\xc5\x72\xc3\xff\x95\x74\xac\x03\x2d\x20\x2b\x23\xc5\x49\xb9\xc3\x86\x9b\xd0\x7c\x8f\x8c\x9b\x42\xcf\x5f\x4f\xdc\xe7\xd8\xb7\x59\xd5\x6f\xa2\xc2\x72\x25\xa7\x26\xf3\x41\x98\xe3\xc2\x9e\x3b\x3d\x1e\x0d\x7d\x17\x1c\x70\x00\x19\x47\x0f\x78\x07\x1a\xe8\x0f\xb2\x8a\x2e\x3d\x32\x97\x78\xad\xbc\x31\x7a\xf0\x79\x7a\x47\x04\x4d\x7c\xf4\xb8\x44\xbf\x09\x2b\xab\xdb\xec\x8d\x7c\x1c\x40\x72\xd1\x2d\x63\x42\x6c\x3f\xbd\x85\x23\x6d\x78\xca\xd6\xd5\xf4\x1c\xd2\x88\x4b\x0f\xf4\x8a\x18\xf5\x59\x89\xb9\x7f\xd7\x97\xce\x46\xaa\xe0\x07\x70\x00\x59\x46\x0f\x6c\xbc\xf7\xcc\x03\x85\x5a\x4e\x54\x9f\x50\x4d\x91\xb9\xf0\x2b\xcb\xa7\xad\x89\x1c\xe8\x17\x8a\x85\xf6\xbc\x69\xb8\x7f\x93\xec\xeb\x77\x1c\x90\x36\x44\x1f\xe3\x85\x6f\x2d\x3f\xbd\x77\x6a\xfa\xce\xc6\xef\xf1\xd7\x36\xe4\xcc\x91\x5e\x94\xc7\xc6\x9e\x0b\x0c\x4c\xb8\xb0\x70\xdb\xc5\xaa\xb3\xe3\x00\x32\x80\xae\x20\xaf\xbd\x32\x3b\xbd\x3f\xc6\x3d\xd2\xd7\x6c\xe6\x0d\x10\x49\x8a\x20\x52\x0e\x35\x50\xee\xd6\x97\x1b\x69\x61\x14\xfc\x4d\xe2\x8b\x13\xfe\xb7\xa8\xec\xd2\x42\x28\x13\x61\x05\x06\x42\xc6\xe1\x44\x85\x15\x9b\x5d\xcd\x07\xf6\x19\xac\xf0\x40\xc8\x32\xfc\x7f\x4f\xac\x10\xc1\xf4\x33\x24\x7c\x09\x56\x90\xe0\x97\x0c\xd0\xc3\xf4\xc3\x3a\x24\x05\xb2\x64\xc4\x47\xff\xa7\xba\x96\xa3\xd7\xe3\x98\x5d\xc6\x9e\x36\x0e\x89\xba\xc8\x98\x4e\x75\x2d\x2e\x53\x4e\xaf\x2c\xe0\xbe\x19\xf1\xe2\xec\xec\x9d\xbd\x88\x9e\x19\x0f\x07\x0e\x20\x59\xff\x79\x75\xf3\x1d\xea\xfb\x31\x52\x17\x34\xae\x05\x98\x7a\x74\xcd\xda\x1f\xec\xeb\xf0\x4d\xe2\x92\x68\x1c\xba\x7c\xd2\x2f\x80\x76\xea\xd3\x77\x00\x90\x57\xe8\x53\x02\xf3\x01\xca\xef\xcb\xf3\x43\xac\xa3\xe5\x17\xd6\x88\xee\xdf\xde\xc3\x78\x28\x5e\xf5\xf9\x6a\x25\xf5\x1b\xbd\xc9\x5b\x7f\x2f\x5b\x1a\x01\xe4\x2f\x5a\xc4\xaf\x5d\x48\x3a\x6a\x6c\xb4\xff\x56\xc4\xf9\x11\xb1\xaa\x57\x35\x27\xef\xd6\x9d\xdf\x74\xa8\x7d\xe0\xaf\x40\x2d\xd7\x6a\xd6\xee\x21\x83\x03\x48\x29\xba\x81\xd9\x99\x86\x3c\x75\x52\x3e\xe8\x75\x8b\x5c\x75\x52\x2e\x9c\xa3\x90\x2f\x25\xf9\x58\xc1\x16\xab\x1d\x97\xa1\x6c\x35\xf5\x8b\x8d\xf2\x1d\xf3\xd1\x1d\x49\xf3\x4a\x4e\x01\x5f\xe8\x3a\x3f\x57\xf1\xf8\xc4\x3d\xda\xb9\xe6\x4e\xe1\x4f\xa9\x0f\x65\xbc\x97\xbe\x5d\x8c\x4d\x8c\xe5\xda\xda\x2b\xfc\x6f\x51\x81\x0b\x50\x0e\xdb\x05\x66\x60\x08\x90\x2c\x98\x7e\x98\xb1\x81\x87\x3b\x50\xa6\xc3\x8a\x0f\x84\xfc\x85\x0a\x3e\x56\x88\x20\xa4\x14\x76\x4b\xac\x28\xed\xfa\x02\x5b\x1f\xe6\x99\x3b\x01\xf2\x06\xba\x8f\x79\xee\x4e\x80\x8c\xc1\x8b\x66\x58\x67\xef\xbb\x14\x68\x3f\x7c\xe7\x26\xd6\x21\x3c\x90\xa5\x08\x64\xa1\xf3\xc4\x01\x24\x05\x3d\x0a\x17\xba\x87\x11\x7f\xfc\xde\x94\x78\xa7\xea\x29\x57\x2a\xae\xd5\xca\x9b\x81\xb1\xce\x9f\xfa\x8c\x8f\xea\x50\xb7\xbb\xb5\xaf\x3f\x11\x0e\x20\x8d\xe8\x3a\xeb\x86\x84\x16\x1c\x63\x8b\x52\x36\x93\xa1\xeb\x3c\x53\xb1\x18\xe6\xa9\xfc\x7b\xdf\xb1\x43\x2d\x02\x1d\x5e\x71\xe6\xc7\xbf\xf5\x3f\xc6\x01\xe4\x35\x7a\xe3\xf9\x7f\xf8\x39\x13\xd0\x57\xf0\xb8\x95\x5c\x81\xba\x24\x07\xa7\x5a\xf3\xfb\xb0\xc1\x0f\xda\x4a\xf6\x6f\x9f\xc6\x48\xbe\xcb\x9e\x97\xc2\x01\x69\x35\xf4\xc5\xb4\x7b\xb2\xf1\xc8\x9d\x42\xf3\xb4\x13\xfb\xb8\xa3\x94\x5f\x67\x8b\x5d\x1f\x55\xbe\xe3\xd2\xf8\xb3\x2f\xfc\xf0\xc8\x42\x4b\x74\x29\x0e\x20\xb1\xff\xf9\x33\x15\x3e\x39\xf6\xfc\x77\x72\xea\xaa\xbc\x4c\x57\xc5\xad\xc9\xab\xd6\x3f\x13\xad\x7c\x25\x4b\x57\x17\xd2\x7e\xe5\x2b\x12\xef\x7d\x03\x07\x90\x6e\xf4\x64\xfe\x3c\xff\x89\xf3\xaf\xe2\x87\x09\x4c\x4c\x07\xfb\xca\x8b\xb5\x53\xc6\x56\xd2\x52\x7d\x87\xd7\xf8\x70\xe2\x97\x7f\xdc\xba\xc0\xef\x88\x03\x48\x0f\xda\x5d\xf2\xf8\x3d\x66\x9f\x8f\x08\xff\x1a\x7e\x7c\x66\x0b\x31\x5c\x78\x9f\xb0\x7c\x3f\x4f\x48\x47\x52\x54\x25\x4b\x3b\x43\x3d\x48\x90\x7b\xa7\x38\xa1\xc3\x49\x42\x1a\xe2\xd6\xca\x1d\xbe\xc8\xce\x76\xb3\x60\xe8\xb0\x18\x27\x6d\x00\xf3\x51\x65\x52\xed\x13\x0c\xde\xdf\x74\x23\xd7\x47\x69\x85\xff\x2d\xea\x70\x81\x53\xe0\x40\x80\x15\x78\x08\x69\x84\x45\x1c\x2b\xf6\x10\xf2\x1a\xbe\x20\x02\x2b\xfe\xb0\x88\xab\xc1\x9f\x35\x62\xac\x00\xfc\x92\x58\xb8\x23\xb0\x16\x01\x42\xba\x21\x57\xc0\x5a\x07\x08\xe9\x81\xde\x63\x2d\xc5\x6e\x77\xd9\xbb\x5c\xff\x7f\xdd\x05\xf3\x7a\x8a\x2c\x19\x09\x25\x99\x1b\x1e\x20\x6f\xd0\xc3\x8d\x7b\x5c\xdb\x7a\x37\xf7\x24\x8b\xf3\x2f\xd3\xe8\xed\xee\x9f\x57\x48\xaa\x4e\x45\x9c\x76\x79\x23\xe3\xfb\x9b\x2f\x69\x63\x5f\x14\x31\x40\xe2\xd0\xcd\x82\x86\xeb\x5e\xd3\x71\xd5\x53\xc7\x0e\x8c\x09\xdd\xdc\xd7\x7d\x6f\x9c\xe6\x71\x2b\xdd\xb6\x4a\x7a\x59\x79\x25\x57\xcb\x95\x37\x02\xfb\x00\x32\x87\xce\xa9\x77\xfa\xa4\xbf\x4f\xc8\x69\x64\xc7\x8b\xf3\x52\x64\xd7\xb9\x13\x5b\xf8\xbc\x3f\xb3\xb6\x1c\x1a\x94\xfd\x91\x7c\x2a\xde\xec\x71\xd7\x0e\x03\x40\x37\x17\x05\x89\x81\x66\x11\x8d\x5f\xda\x82\xe6\xfe\x13\xd7\x96\x68\x8e\x0c\xf7\xf8\x66\x73\xaf\xbc\x23\x07\x7c\x11\x1b\x6f\x55\xee\x46\xe2\x00\xb2\x8d\xd6\x35\xb9\x99\xb2\xc3\x83\xd6\x41\x98\xdd\x07\x89\x87\x27\x38\x70\x21\x51\x4e\x3f\x04\x12\x07\xe5\x95\x48\x78\x6e\x6e\x88\x9c\x22\x7a\x82\x03\xd2\x8f\xd0\x57\x07\xff\xb8\x7f\xf3\x10\xa3\x9d\xe4\x52\x6b\x56\x8c\x70\xe3\xa8\xab\xbd\x05\xf8\xbe\xb6\xce\x7d\x71\xfe\xf1\x8d\xba\x56\xe9\x0c\x93\xf0\x3f\xc6\x04\x56\x4a\x38\xda\x60\xc6\x05\x0e\xe3\xb0\x51\x60\xc5\x06\x42\xe6\xe0\x46\xc2\x0a\xcf\x2e\xad\x82\xbd\x05\x2b\x42\x10\xb2\x0d\xa5\x53\xac\x28\xc1\x8d\xf4\x88\xf0\x25\x98\x57\x9d\xe0\x6e\x85\xbc\x02\xf3\xba\x13\xac\x09\xf0\x42\x32\xe6\x8d\x27\xf8\x2d\xf0\x97\x2c\x98\xb7\x9e\x08\x90\xf7\x30\x60\x98\x17\x9f\xe0\x4a\x42\x5f\xb0\x2e\x3f\xed\xce\x22\xd4\xf0\x04\x1e\xeb\x16\x14\x90\x65\x21\xc2\xfd\x6f\x18\x74\x43\x8b\xcd\x17\xd4\x15\xf2\xfa\xc5\x5c\xf3\x45\xd2\xdb\xd8\xb5\x5f\x1e\x9a\x39\x7b\xfc\xd6\x77\xc1\x9f\xb7\x6b\x02\xea\xd8\x1c\xd9\x0f\xc4\x2a\xe2\x80\x34\x33\xea\xf1\xe5\x2b\x2b\x69\x9e\x1a\x0c\x2f\x4a\x2c\x8f\x87\xbc\xfd\xd8\xbf\x70\x75\x0f\x43\x59\x51\xa4\xa9\x5c\xbf\x73\xa6\xd1\xf8\xeb\x7d\x97\x77\xaa\x0e\x7a\x7b\x9f\xe4\xd8\x4b\x2e\x7b\xb1\xe9\xdb\x9d\xb8\x97\x67\x8e\x5e\xaa\xd3\x90\x62\xfc\xac\xc8\x49\xa2\x7a\x6e\xac\xbc\x9b\xc8\xa0\xd8\xe6\x12\x0e\x20\xad\xe8\x13\xf5\x65\x6a\x43\x5e\x36\x8e\x0e\x36\xe1\x85\x25\x8d\x41\xdf\xd1\xe8\xd9\xad\x95\xbe\x4c\xf7\x4f\x11\x07\x63\x83\x59\xf9\x94\xea\x33\x77\xcc\x47\xdf\xb4\x8c\x1f\x68\x93\xb5\xa2\x52\x0e\x39\x22\xc9\x12\x9a\x57\xed\x22\x22\xd9\x97\xf9\xb0\x98\x67\xed\x13\xb7\x42\x94\xd2\x8b\x9c\xc5\x44\xe1\x7f\xf3\x12\x06\xd4\x0d\xbe\xfd\x15\xcb\x53\x98\xb4\xcc\x84\x55\xc3\xf2\x75\xb7\x2e\xc3\x2d\x8b\xe5\xee\xae\xf4\x08\x4f\xd3\xb1\x3c\xde\x75\x05\xb2\x74\xac\x0b\x6f\x10\xf2\x02\xf6\x18\xac\x3b\x6f\xbb\x86\x51\x2f\x6f\xfe\x5f\x06\x62\x5d\x7e\x03\xb2\xf4\x0a\x24\xa4\x1e\x38\x80\xb8\xa3\xe7\xf3\xcc\x7b\x0a\xa5\x55\x9b\x97\x7d\x36\x17\xd9\xde\x91\xbd\x92\xd1\x5a\x4b\x56\x8e\x54\xae\xd1\x4b\xb0\x21\x51\x9f\xfb\xd3\x38\xf3\x10\x07\x90\x7a\xf4\x25\x8d\x42\x96\x12\x96\xb8\xde\xae\xf3\x64\xe6\xb5\x33\xf5\x97\x5b\x5f\xfe\x12\x38\x22\x12\x69\x7d\x7a\xde\xc7\x17\xe8\x39\xd1\xbd\xd7\xc5\x01\x24\x18\xfd\xf9\x86\x1d\x35\x72\xf6\x9f\x82\x29\x25\x16\x1d\x46\xf8\x8a\x24\x54\x68\xac\x64\x27\x2d\x89\x73\xa4\xf4\x97\x24\x58\x1f\x5f\xb4\x20\xc3\x01\x64\x13\xcd\x2f\x6c\xae\xb9\xca\x79\xfb\xda\xef\xf5\xc8\x3a\x3c\x3e\xa7\xeb\xfc\xf6\x96\xcd\x6b\xd2\xf4\x0f\xf3\x1b\x92\x2c\x8d\x3e\xbf\x2d\xb6\x43\x71\x00\xc9\x47\xb7\x8c\x57\xbf\x19\x16\x93\x3a\xf6\x3a\x6f\xe2\xf6\x48\x71\xdc\xd7\xa9\x36\x8c\x12\x3a\xd0\xf9\xf0\xe3\xbe\xe7\x17\x38\xad\xe7\x34\xf7\xb0\xed\xc4\x15\x7d\xb7\x5e\xc3\x74\x9d\xdb\x23\x45\xac\x14\xdf\xfa\xa5\xfa\xb9\xe9\x06\x25\x11\xe7\x47\xe1\x85\x67\x4d\x5b\xb9\x17\x02\xde\x5f\x3b\xc4\x6a\xbc\x33\x63\xa3\xa7\x46\x2a\xae\x3a\x5d\x6e\xeb\x97\xee\x34\x9a\xa7\x65\x4a\xba\xd6\xf7\x19\x9f\x58\xab\x2e\xe1\x50\xe6\x78\xe4\xfa\xf9\xbc\xda\x77\xd6\x4c\xe1\x7f\x0b\xe3\xee\xdd\x20\x38\xc0\x63\x45\x12\x42\xea\xa1\xac\x84\x15\x4c\x08\x09\x86\xdf\x82\x15\x4f\x08\xd9\x84\x64\x04\x2b\xa4\xbb\x32\x2d\x3c\x54\xc6\x8a\xea\x6e\x8e\xc3\xbb\x1c\x58\x81\xdd\xa5\x3c\xf4\xcb\x6b\xff\xf7\x1f\xa6\x3c\xba\x25\x61\xc6\x8b\xdb\x63\x35\x62\xa3\x6f\xfa\x99\x7b\x87\x3a\xba\x64\x5e\x79\x90\x7e\x1e\x79\x70\x3d\x39\xee\x1a\xad\xf4\x36\xe1\xf7\x28\xa8\xf5\x4b\xcf\xd4\xd2\x23\x62\xa8\xde\x4a\xe8\x5f\xb0\x93\x6d\x2d\x68\x93\x9c\x1e\xa8\x12\xb0\x9b\xe4\xfe\x70\x5e\x91\x5c\x49\xbc\xe6\x03\x1e\x20\x00\xad\x88\x66\xec\x49\xfd\x18\xef\xd6\x9a\xca\x74\xd9\x36\xa1\x62\x69\xb0\x86\xa1\x3c\x49\x95\x38\x54\xc2\xbe\x34\x9f\x8d\x57\x5a\xae\xc7\x1d\x20\xe9\xe8\x3b\x6d\x0e\x02\xf4\x1d\xbf\x95\x02\x97\xa6\x33\x84\xb5\x32\xc3\x2a\x7e\xbb\x92\x8b\xd0\xde\xec\x3a\xa1\x7d\x83\xe9\x59\xe0\xe2\x95\x81\xf3\x00\xf9\x8c\x1e\xa0\xfa\x69\xea\x05\x8b\xe7\xe3\x0d\x2f\xea\xf7\xd5\x89\xda\x0e\xd8\x66\xe3\x68\x72\xe4\x64\xd5\x13\x85\x57\x82\x8b\xa4\x7c\xa4\x44\xf0\x00\x89\x41\xdf\x0a\x1e\x7e\x7e\x51\xfa\x55\x0e\xdf\xed\x6d\xb2\xfd\x4f\x25\x22\x23\x6c\x34\x9e\xb8\x32\x5e\x61\x0e\xb4\xf6\x28\x26\x0a\xf5\x79\x3f\xcd\x0b\x90\x42\xf4\xbc\x95\xb4\xfe\xb2\x6b\xf6\x7b\x4c\xb1\x58\x4b\x17\xed\x47\xc3\x02\xa2\x6e\xfe\xfb\x1f\x5a\x87\x99\xb7\xbb\x84\x8e\x7c\xaf\xaa\xa3\x30\x07\x48\x1b\xba\xdc\x5f\x49\xff\xec\x19\xb1\xe8\x51\x77\x6a\x8a\x23\x89\x5f\x36\x49\xbc\x3a\x58\x9f\x58\x92\xc9\x49\x73\xee\xd0\xf8\xcc\xbb\xdf\xd9\xbf\x50\x8f\x2a\xe9\xce\xd6\xdf\xbc\xa5\x28\xf6\x18\xc7\xe0\xf4\x45\x56\x82\xf2\xb5\x8e\x68\xcc\x36\xa7\x9c\x78\x22\xf1\xc9\xc0\x91\x2f\x5d\xaf\x00\x40\xea\xd0\xe7\x14\x8f\xad\x73\x9a\x25\x0b\xec\x4f\x2d\x0c\xd0\xf7\xb1\xb3\xab\xdc\x5a\xbc\x3d\xd1\x3d\xce\x72\xef\xc1\x21\xce\x0a\x8d\xe6\x8c\xdb\xd5\x00\x69\xfd\xcf\x7b\xf2\xc4\x5e\x10\x8d\xe9\x0a\x1c\xf6\xd1\x8b\x64\xfb\x6a\x65\x2e\xf6\x4b\xfd\x17\xdd\x18\xc7\xc1\x17\x40\xd8\x56\x69\x1f\xb1\x5c\x13\x1e\x20\xf8\xff\xbc\x2b\xf5\x46\x6c\xd8\xf0\x2b\x6b\xc3\x4f\x5e\x5c\xe6\xa7\x58\x5c\xd3\xb6\x14\x78\xcf\xb9\x55\xb0\xbc\x7a\xd4\x55\x1a\xb6\xc0\x24\xf6\x0a\x20\x25\xff\xf9\x1f\x4d\x71\x2b\x13\xbb\x5a\x07\x8b\x1f\x87\x42\x9b\x73\xe4\x43\x67\xe5\x0e\x9c\xa8\xce\x5e\x7c\xce\xda\x13\x45\xbc\x4f\xc2\xe8\x71\x09\x40\x16\xd1\x6d\xad\xf4\x9e\x48\x8a\x2b\xe3\xfd\x13\xdf\x96\xe3\x8f\xf0\xeb\xcd\xc7\x91\xe5\xb0\xb5\x86\xa6\x28\xdf\x0a\x73\xb6\xca\xe4\x6e\xd7\xae\x00\x00\x89\x40\xd7\xb8\x13\x4b\x3d\x73\x23\x67\x72\xf7\xc7\x07\xb1\x3e\x78\x77\xaf\xcb\x52\x92\xa8\x78\x30\xe9\x88\x3d\x33\x69\x84\x47\x9d\x87\x7f\xf4\x39\x80\x6c\xa2\x1f\x37\x3e\xc8\xde\xf0\x67\x72\xa4\xfe\xd2\xfa\x60\xec\xa5\xa0\x73\x07\xb7\x7a\x65\xe8\x16\x07\x67\x45\x23\xf5\xf3\x4e\x52\x9e\x53\x2b\x06\x00\xf1\x46\x33\xcb\x00\xda\xd8\x0c\x89\x80\x19\xab\xb3\x14\x0f\x2c\x3e\x93\x3b\x7c\x2a\x0f\x18\xe9\x19\xb8\xdc\xdf\x12\x53\x66\x21\x4f\xfb\x62\x32\x08\x20\x55\xe8\x0a\x5d\x3d\x9f\x4e\x45\xba\x26\xfb\xfe\xb4\x2d\x3f\xef\xdf\xad\x57\x12\x9b\xae\x2b\x6a\x79\xef\xd3\x17\xba\x4c\xb9\xbb\x1e\x05\xbb\x94\x03\x80\x94\xfd\xe7\xb5\xb6\xf5\x75\x94\x83\x21\x6f\x2a\xb9\xcd\x9e\xe1\xee\x56\x1e\x5f\x25\xa6\xb4\x2d\xbb\xc4\x15\xe2\xbd\x54\xbf\xa4\x98\xa0\xc2\x2e\x00\x90\x2a\x74\xe8\x97\xce\x8c\x88\x3f\xcf\xbf\x61\xfc\xc3\x41\xe1\x26\xe5\x7c\x94\xb1\xac\xf4\xfa\x8f\x86\xd9\x71\x7e\x2e\x2d\xe9\xf1\xbf\xad\x79\xb4\x00\x20\xcd\xe8\x14\x2e\x68\x26\xb6\x6b\xb1\x38\xe2\x78\xf5\xf4\x94\x47\x8d\xee\xd0\x8a\xeb\x4f\xe9\xe0\x5c\x43\xab\x63\xc6\x3f\x65\xb5\x92\x6d\x2d\xe5\x01\xd2\x8b\xa6\xc5\x17\xc6\x79\x18\x79\xe6\xd4\xfc\x5f\xb9\x6c\xbc\xf2\x7a\x6d\x73\x98\xfc\x19\x9b\xbd\xc8\x41\x6d\x8b\xb9\x8c\x7d\xfd\x31\xab\xcc\xe5\x38\x80\x54\xa2\xef\xd9\xff\x0a\x79\x41\xdf\x2b\x98\x56\xaa\xf9\x55\x21\x47\x27\x2b\x33\x16\x7f\xc7\xd9\xbd\xf8\xdd\x2b\x27\x7f\xe1\x69\x93\x3d\x2c\x71\xdf\x00\x40\x52\xd0\xe6\x53\xba\xfb\xb7\xc8\x59\x86\xf6\x4d\x3c\x7f\x44\x5e\xb4\xd2\x94\xfd\xd5\xfc\x93\xee\xcd\x03\xda\x4f\x8d\x37\xde\x9e\xd5\x35\xb4\x4b\x06\xc8\x1f\xf4\x04\x55\x72\x47\x73\x24\x6c\x71\x6b\x32\xce\x7f\x53\x9f\x65\x45\x4e\xd5\x72\x35\x5d\x77\x3a\xd0\xf5\x47\x96\xc1\xd1\x1b\x7e\x37\xc2\x79\x00\x40\x82\xd1\xed\x28\xf4\x80\x1e\xab\xc9\xa1\x0c\xfe\x2d\x77\xdb\xe5\xd9\xa2\xbe\xa4\x65\xf1\x43\x1c\x57\xd4\xe8\xdd\x84\x2b\x3e\x2e\x14\x38\x88\x1c\x01\xc8\x04\xba\x7c\x18\xd4\x53\x5b\x99\xd6\x05\xe9\x3f\x97\xbe\xfb\x33\xf4\x00\x77\x81\x57\xd4\xd0\xbd\x95\x84\x6e\xc5\xa4\xbf\xe0\x49\xfe\x97\xae\x9f\xa8\x47\x3f\xd8\x0a\x74\x64\xc7\xde\xeb\xd6\xf5\xec\xd6\xca\x39\x9e\x33\x27\x79\x98\xce\x8e\x83\x52\x86\xad\x44\x83\x31\xfb\x09\xbd\xce\xcd\x9d\x79\x14\x1d\x98\xd4\x83\x62\xf6\xe4\x3a\xc3\x6c\x2e\x2a\x26\xa2\x5b\xde\x23\x22\x17\xb6\xdd\xe6\xbd\x3f\x3d\xd2\xca\x3b\xe9\xc7\xaf\xa9\xf0\x69\x10\xf5\xe8\x75\xbf\x24\xc3\xdb\x2d\xc2\xad\x29\x0f\x19\x56\x16\x1e\xb7\x99\xf8\x7a\x13\x7f\x3f\xbd\x94\xa6\x51\x27\x22\x7e\x5b\xff\x23\xb1\x30\x00\xc8\x0b\x74\x15\xa3\xf7\x28\x31\xc7\xbd\x28\x3c\xfc\xd5\x6c\xfd\x71\x25\x22\xce\xa1\xd5\xed\x5c\xf0\x47\xe4\xb2\x0c\x57\xfb\x8f\xe3\x67\x28\xbf\x1f\x02\x88\x2f\xfa\x71\xe1\x6f\x77\x07\x9e\x13\x93\x5d\xed\x28\x50\x7c\x46\x56\x66\xf3\xd1\xe8\x74\xfd\xf9\xb8\xdb\x75\x02\xbc\x06\xd4\xcb\x09\x9d\x5c\xe8\xdf\x6f\x58\x49\x04\x8c\x39\x97\x11\x1b\x71\xe9\x2e\xfb\x53\x48\xfe\x4d\x08\xbe\x26\x7f\x83\x28\xb3\xcf\xec\x72\x50\x3f\x2b\xce\xf1\xbb\x0e\x0e\x20\x79\xe8\xdc\x05\xa2\x1e\x41\xf3\xac\x9a\x7b\x05\x5b\xb6\x93\x0d\xba\xdc\xa2\x2c\x44\xc4\xd4\x22\x1c\xbb\x9c\x03\xc5\x4e\x87\xb5\xca\xe9\x79\xa0\x1e\x4d\xdb\x7f\x2f\x8c\x26\x4f\xc4\x4b\xf4\x99\x2d\x77\x5c\x63\xc9\x87\xdf\x65\x0f\x99\x34\xcb\x07\xb3\xfb\x9b\x5e\x8f\x34\xcd\xd1\x2f\xa0\x1e\x3d\x32\x2c\x73\xe5\x4b\xd9\xd7\x94\x59\xa5\x76\x3f\x3b\xfc\xb1\x0e\xc7\xf1\xfb\x4c\x66\x9a\x4d\xb7\x24\xbe\x9d\x9d\xac\xf1\x7c\x39\x83\x07\x48\x0a\x3a\xc5\xb9\xda\xa7\x59\x3d\xd6\x3e\x79\x5e\xe3\xc8\x3b\x43\x12\xad\xb1\xa7\x1a\x4c\x44\x73\xb9\x4f\x71\x84\x89\xd6\xfb\x64\x5a\xb6\xcb\x01\xa4\x06\x5d\xec\xb2\x56\x0f\x35\xea\xa6\x9b\xbf\x73\xd2\x74\x06\x67\x7b\xb5\x36\x12\xb3\xf8\x55\xa8\x5f\x92\x3d\x0a\xf1\xd8\x5e\xf2\xa4\x9e\xf1\x00\xc8\x9f\xff\xbc\x25\xc3\xbc\x51\xfc\xfb\x81\x01\xc3\xea\xb7\xcf\x2c\x5f\x1f\xd6\x3d\xba\xf7\xf0\x9d\xe3\xef\x72\x24\xcc\xa6\xe6\xb5\x1b\x13\x98\x49\x7f\x02\x80\x78\xa0\x53\x70\xce\x7e\x8c\x1e\xef\xd4\x52\xe6\xfd\xf8\xd3\x0b\x21\x8d\x29\x9b\x97\xba\x4f\x3c\x9b\xad\x7a\xe6\x9e\x1f\x17\xd0\xe6\xbe\xf9\x61\x0a\x20\xd3\x68\x6b\x72\xd9\x3d\x54\x69\xd5\x15\x97\xa2\x17\x68\x48\x9e\xa6\x28\x67\xbe\x1b\xbb\xf0\x39\x3d\x46\xa5\xc6\x86\x77\xf2\x45\x00\xd5\x96\x13\x1e\x20\xb9\xe8\xd5\x54\xbe\x7e\xee\x56\xdd\xed\xf8\x3d\xcc\x5a\xd4\xc1\xc5\x96\x63\xad\x66\x99\xed\x47\x4f\xca\x35\xc9\xa5\x0a\xfe\x26\x4e\x2d\x07\xc3\x00\x29\x45\x7f\xfc\x3b\x63\xe6\xc5\x2f\xe9\x8c\x32\xb6\xec\x43\x6f\x0e\x46\x0a\xd5\x5c\x49\x0e\xb8\xa8\x70\xba\x6f\xe5\xd6\x9f\x9c\x43\xa4\x91\xb8\x58\x80\xcc\xa0\x6b\x63\x5d\x20\x53\x47\x15\x92\x7d\x62\x52\xae\x3e\xc2\x21\xe9\x4c\xf6\x86\x7c\xef\x4b\xdb\x4a\xc7\x8b\x4a\xac\x41\x97\x48\x43\x62\xd8\x01\x40\x92\xd1\xc5\xae\x69\xbe\x5e\x8e\xde\xe1\xb2\xed\x7b\xbf\x6d\xee\xc7\x6e\xf7\x38\x9f\x58\xd6\x08\x39\xcb\x1b\x8a\xc5\x6c\x1a\xdf\x42\x8e\x51\x48\x02\x24\x1f\xdd\x20\x4f\x3a\x7e\xb0\x48\x5b\xcd\x3b\x9c\x95\x5a\x54\x3b\xbe\x25\xf8\xf5\x58\x21\x2e\xcf\xfd\xd9\x72\x8e\xb2\xd7\xfc\x34\x59\x0e\xdf\x43\x00\xa4\xd1\xef\x57\x36\xdd\xb2\x73\x0c\x70\x53\xe4\x3f\xa9\xd9\x6f\x53\x12\x22\x74\xb5\xff\x14\x5e\xd6\xc0\xdb\xca\x9d\xb3\x6c\xeb\x38\x8e\x45\x24\x04\x20\x23\xe8\x93\x1c\x51\x32\xdc\x71\x83\x00\xe7\xf3\xa6\x15\x21\x6a\x5d\x9b\x5c\x13\xed\x16\x2c\x52\xb4\xc5\x37\x12\x2b\xe7\x65\x88\xee\x8c\x92\x7c\xc3\x03\x24\x07\x2d\xd6\x70\x05\x36\x7c\x1f\xd0\xe3\xed\x96\x55\x74\x63\xe1\xdd\x66\xe7\xa8\xe4\xf9\x25\xbe\xea\x12\xaa\x15\x7e\x62\x42\xb1\x25\xf0\x8e\x27\x40\xaa\xd0\xc5\x82\x94\x4a\xcb\xfe\x90\xa0\x7c\x85\x4f\x5c\x4c\xd5\x52\x01\x55\xfb\xc6\x67\x37\xf7\x3c\x5e\x17\xcb\x2d\x4d\x5a\x7b\xce\x8e\x31\x29\x80\xd4\xa0\xf3\xc0\xa5\xf4\x3a\x65\xe6\xc1\x3f\x45\x2c\x8a\xb7\xb7\x29\x36\x45\x2c\x13\x33\x8c\xc4\x92\xdf\x80\x12\xb6\x8b\xdd\x83\x4c\x66\x96\xd2\x38\x80\x34\xa3\xa7\x81\x29\xef\x2f\x99\xd5\x61\x99\xe1\xf7\xa4\x67\xb7\xf5\xc6\x36\xf6\xdc\x2f\x88\xb1\x35\x2e\xae\xf9\xa4\xdf\x62\x90\xfd\x3b\x5a\xb4\x16\x00\x24\x15\xed\x6d\xe3\x99\x18\x2d\xe1\x85\xdb\xb6\x7c\xa5\x5c\x4e\x35\x96\xe1\xb1\x95\x8f\x9c\xf2\x7c\xce\x7c\xfa\x23\xfc\x96\x75\xcc\x30\x80\x9d\x12\x20\xc3\xe8\x95\x65\xac\xad\xa1\xb4\x5e\xb9\x6d\x60\xfa\x56\x6c\x4d\xcc\x44\x8c\x97\xb7\x5e\x84\x4a\xb4\xa0\x48\x89\x27\xc1\x54\xa8\x45\xb8\x6b\x14\x0f\x10\x37\x74\xda\xb3\xe0\x1b\x83\x84\x1e\xfa\x34\x8a\x5d\xd1\x92\x7f\x1f\x7d\xed\xe7\x4b\x72\x15\xcd\x6f\xaa\x6d\x96\x66\xad\x9a\x8b\x3a\x99\x3e\x3a\x00\x99\x40\x57\x82\xa4\x81\xb7\xc4\x72\x7f\x53\xed\xdc\x49\x0b\x4f\x9c\xd1\x9a\x7f\xf6\xae\x11\x7f\x8d\xfa\xb4\xb7\x9e\x72\xca\xed\x60\x57\x53\xfa\x00\x80\xfc\x45\xa7\xe5\x53\x6d\xfd\x07\xe4\x5f\x2a\x75\x17\x23\x86\xe8\x4a\x8f\x39\xd1\xf4\xde\x15\x4e\x24\xfb\x13\x99\x2c\x94\x19\xdb\xd7\x9e\xb1\xd1\x8e\x7a\xf4\xb3\xf5\x99\x2c\xb6\x18\xa7\xd1\xd4\x67\x29\x75\x14\xca\xc5\xd3\xfe\x5d\x33\x3e\x63\xbe\x43\x06\x7d\xfe\xdd\x12\x1c\x51\xc1\x3f\x00\x40\x7c\xd1\xed\x7a\x26\x5c\xed\xee\x54\xb0\x24\x6f\xba\xd8\x49\x73\xe6\x9b\x33\x2f\xe3\x73\x97\x2b\xc2\xc7\xba\x4d\xfc\xbd\x44\x8f\xb1\x3f\xa8\x3a\x0b\x90\x38\x74\xf1\x78\x59\x22\x53\x77\x84\xf7\x59\xd3\xf5\x43\x4a\x3f\x27\xd7\x0d\xb6\x52\xd3\xe9\x6d\xb9\x1e\x8f\x68\xe8\xed\xf5\xe6\x34\xaa\x89\x2e\x23\x28\x0c\x58\x83\x2c\x90\x95\x22\x62\x71\x75\xc3\x01\x24\x05\xdd\x06\x0e\xcb\xf1\x1a\x72\x66\x6f\xd5\x57\xad\x9e\xf9\x1d\x38\xdd\x5a\xe5\x62\xb1\xac\x4f\xfb\xd4\xec\xf7\x2f\xee\x20\x9a\xab\x0c\xad\x0b\x00\x20\x51\xe8\x38\xce\xac\x13\x3f\x6e\xf0\x3c\x6c\x94\xf0\xc8\x7b\x2e\x35\x28\xbf\xbf\x5a\x77\xc8\xed\x5b\xbb\xeb\x4f\xd3\x9f\x46\xeb\xad\xaa\x47\x62\x01\x52\x8b\x5e\xd5\xd5\x4b\xb9\x77\xc7\xcc\xd9\xb3\x9e\x85\x59\x07\xa8\xc7\x38\x9e\xe1\xb9\xa8\xec\xec\x20\x1b\x63\xf8\xb6\xfc\xfe\xfe\xfd\x2f\x56\x2e\xe3\x00\x52\x87\x4e\x9a\x2c\xd7\xa8\x7d\x01\xc6\x4b\x7f\x5a\x3e\x88\x30\x64\x9c\x76\xd5\x3d\x25\x77\x24\x43\xbe\x1f\x5f\xe9\xed\x23\xf2\xae\x33\xe7\x54\x3b\x0e\x20\x3f\xd0\xfb\xdb\x96\x3c\x9f\x65\x38\xa2\x21\x1c\xc7\xb5\xdd\x76\xfa\x04\xe3\xd7\x32\xa5\xf8\x67\xcf\xd8\x5e\xac\xf5\x2e\x55\x34\x5b\x1c\xa2\x12\x11\xfe\x47\x2f\x65\xc8\xfe\x4f\xc5\x86\xf2\x13\xa6\xa3\x04\x48\x14\x64\xf2\x58\xce\x42\x48\x2d\xa4\x5f\x58\xfe\x42\x48\x1d\x94\x9f\xb0\x5c\x86\x90\x1f\x90\x17\x62\x92\x16\x02\x04\xc0\x1f\xb3\x60\x12\x17\x02\x24\x1d\x9e\x05\x61\x91\x17\x08\xf9\x0c\x15\x4e\x4c\xfe\x42\x80\xc4\x40\x8d\x0f\x93\xc3\x10\x20\x85\x50\xe3\xc3\xe2\x31\x10\xd2\x46\x07\xaf\xef\x60\x12\x1a\x19\x57\xb2\xff\xfd\xf3\x45\x3e\xba\x62\x53\x4d\xb5\xc7\x97\xf3\x72\xf5\xfb\x4c\x5d\xd9\x6e\x7b\xfa\xe9\x98\xd0\x97\xf2\xc0\x90\x46\x89\x18\x6f\x8d\x05\x1b\x1c\x9d\x50\x1b\x00\x88\x27\xba\xdf\x2c\xdb\xdf\x52\xe6\x68\x9a\xe4\xbf\xbd\xc7\x2a\x31\x72\x9b\x53\x7a\xc3\xa0\xcf\xb3\x91\x4d\xe3\x03\xf7\xf9\x25\x06\x6f\x9e\x99\x49\x80\x4c\xa3\x87\x5f\x3e\x95\x0f\xef\xd8\xae\xb9\x7a\xfa\x3e\x94\xb8\xf6\xf9\xe2\xad\xcd\xeb\x7b\x8f\x5c\x1a\x2d\xa8\x56\xf6\xf1\x19\x1a\x19\x54\x17\xce\xc6\x01\x24\x13\xcd\x6b\xd4\x15\xf9\x74\x2b\x59\xbe\x7b\xde\xc8\x2c\xac\x8a\x91\x7d\x40\xab\x73\x48\x3f\xaf\xce\x8a\xe6\x52\x81\x66\xa9\x6f\x57\x29\x8f\x8d\xf0\x3f\x5a\x4d\x88\x4f\x3e\x14\xc0\x31\x0d\x27\x40\x3c\xe1\x2a\x60\x19\x0f\x21\xd3\x50\xe7\xc2\xb2\x1f\x42\x32\xe1\x35\x19\x4c\x62\x09\x37\x14\x84\x60\x91\x4b\x08\x69\x85\x67\xcb\x98\xfc\x92\x00\xc1\xc3\x0d\x85\xc9\x31\x09\x90\x12\x68\x18\x26\xcf\x24\x40\x16\x61\x09\xc2\xa4\x9a\x04\x48\x04\x2c\x41\x98\x74\x93\x00\xd9\x84\x10\x4c\xc6\x49\x80\x78\xc3\x93\x34\x4c\xd6\x49\x80\x54\xc1\xaa\x85\x49\x3c\x09\x90\x32\xe8\x3e\x26\xf9\x84\xdf\x02\xd7\x05\x93\x7f\x12\x20\xcd\xb0\x04\x61\x71\x50\x08\xe9\x85\x99\x8c\x49\x43\x09\x90\x4a\xd8\x80\x30\x99\x28\xec\x59\xd0\x17\x4c\x36\x4a\x80\xfc\x81\x1a\x37\x26\x21\x25\x40\x82\xa1\x98\x87\x45\x4a\x21\x64\x82\x16\xbe\x91\x0c\x8b\x9d\x02\x59\x12\x32\xca\xff\xbd\xc9\xfa\x2f\xba\x9e\x7e\x96\x6c\xeb\x2f\xfe\xea\x2c\xf3\xfd\xc5\xf3\x38\xbf\xa5\x5f\x9c\xf1\xaa\xa3\x5d\x59\x0d\x8f\x32\x4a\x5e\xaf\x44\x9c\x3f\x2d\xe3\xb4\x43\x6a\xd1\x33\xed\xa5\xf1\xda\xdf\x1d\x63\x5d\x9e\x13\x75\xb3\x65\x02\x3d\xb4\x07\x36\xb6\xf8\xc3\x3f\xad\x8d\xcc\x4a\x6c\x2a\x68\xa9\x89\x54\xd7\xe1\x00\xf2\x06\x3d\xfd\xfc\x35\xda\x9f\x33\xa6\x0e\xee\x44\xbe\x1d\x69\x78\x9c\x2e\xa1\xca\x79\x62\x5c\xe3\xed\x46\xdc\x9b\xc4\xc3\xf7\x58\xfb\x9d\x2a\xd3\x70\x00\xf1\x41\xab\xcf\x9e\xb5\xee\xb4\x83\xce\x33\x21\x74\xf4\xe6\x35\x72\x47\xd3\x06\xb2\x84\x5a\x1f\x14\xf6\xf2\x0f\x6c\x66\xaa\x70\xc6\x3e\x08\x0c\x11\xfe\x37\xb3\x61\x84\xfe\xc2\x82\x8a\x65\x39\x84\x94\xc3\x75\xc0\x32\x1e\x42\xde\xc0\x9c\xc2\xb2\x1f\x42\x7c\xa0\xda\x8b\xa5\x13\xec\x1a\x46\x03\x4f\xbb\x30\x05\x03\x59\x57\x62\x4a\xe2\x9d\xd5\x2e\x46\x5f\x61\x90\xbb\xcc\x5a\x48\xef\x9a\x5c\xdf\xbc\xcf\x77\xeb\xde\xfc\xda\x56\x55\x72\xab\xc3\xb9\x90\x77\xa7\x1e\x77\x33\x07\x27\x08\xea\x06\x03\x80\xf8\xa1\x9f\x5f\xe1\xa3\xf5\xfe\x1c\xea\xf5\x38\xc7\x35\x64\xab\xdf\xa6\x30\x8a\xcd\xf8\x58\x9d\x41\x21\xfe\xef\x09\xd1\xe0\x46\x96\xef\x94\x74\x00\xc9\x45\x2f\x76\xb7\xae\x36\xc7\xb2\xbc\x90\x10\x79\xfb\xb0\x7c\xc5\xdc\xdf\xc8\x38\xd9\xaa\xf6\x4e\x35\x5d\xd5\xb8\x1e\xe5\x7a\xe5\xa0\xd0\x7e\x1c\x40\xe6\xd1\xb3\xe8\xc6\x68\xcc\xe8\xf3\x1a\x07\x51\x27\x09\xfd\x9e\x57\xd2\x4f\x4a\xa7\xd9\x35\x64\x29\x06\xf8\xa7\x84\xa6\x4f\xdc\x33\xeb\x53\xdf\xb7\xb3\xc1\xd1\xb3\x68\xbf\xd7\x53\xf1\x7b\xa2\x2e\x96\x9c\xb7\x0f\x3f\x3c\x85\xd3\xe7\xff\x7a\x69\xd6\xf2\xab\xcd\xa8\xfc\xb8\x2b\x73\xc1\x0c\xe5\xd3\x4f\xc2\xff\xe8\x25\x21\xa0\xc5\xf0\x82\x00\xa6\xa3\x04\x88\x1f\x84\x60\x39\x0b\x21\xb9\x30\x39\xb0\xfc\x85\x90\x79\x38\x8b\x62\xb9\xbc\x5b\x09\x61\x55\xc7\x14\x87\x08\x90\x17\x70\x4a\xc4\x12\x88\x20\xc4\x77\x2f\xfc\xcf\x4b\x2c\xa5\x08\xc8\x50\x11\xff\x8f\x0d\x65\xa2\xf7\xf7\xeb\x67\x4a\x53\xf1\xa6\xa9\x7c\xec\x3e\xb3\xce\x89\xa1\x19\xdd\x25\xfe\x0c\x0d\x2d\x69\x66\xb7\x37\xf6\x3a\xbe\x30\x39\xc7\xb8\xf3\x1d\xe1\xe8\x0c\xbc\x1b\x69\x42\x34\x9c\x6b\xe8\xf9\xfa\x0f\x9b\x48\xf4\xcb\xac\xd7\x07\x38\x62\xfb\xb2\x9b\xee\x9c\x56\x2b\xdc\xa2\x14\x0f\x64\x3e\x8f\x03\x48\x1f\x7a\x80\x63\xfc\x7b\x40\xaf\x7b\xdc\xd8\x27\xa0\x69\x84\xbd\x53\xc0\x49\xc3\xa0\xb5\x32\x7f\x7b\xe0\x6c\xd2\xc7\x3d\xe4\x0a\x3c\x0b\x36\x46\x38\x80\x24\xa2\xcf\x7f\xe5\xc4\xfa\x74\xfd\x54\x46\x1e\x87\x8d\x2b\x3e\xa0\xbe\xf8\x59\x97\x8b\xff\x06\x55\x94\xcf\x99\xc9\x7b\x4e\x6c\xfb\x18\xce\x0a\xd9\x0a\xff\x9b\xd9\xbb\x73\x12\xdc\xd6\x58\x96\x43\x48\x38\x4c\x29\x2c\xe3\x21\xa4\x0f\xb6\x3d\x2c\xfb\x21\x24\x11\xfe\x0e\x07\x4b\xb2\x83\x90\x3c\x52\xb8\xd8\x58\xda\x1d\x90\x91\x26\xaa\xfc\x5f\x73\x41\x0b\x1a\x74\x6f\x15\x5b\xce\x9f\xcd\xcb\xff\xd6\xba\x14\xea\x22\x3d\x24\x67\xec\x67\x24\x96\x3d\xdd\x32\x7a\x5e\xfe\xcd\xc6\x63\xa2\xe8\x27\x3b\xad\x15\xdd\x8c\xbc\x8f\x71\x3d\xf9\x9e\x25\xf7\x70\x84\x5f\xd7\x8c\xff\x1c\x59\x81\xeb\x1d\x57\x2b\xa6\x9b\x2b\xc5\xb7\x8f\xd1\x1d\xe6\xdb\x8b\xf4\xe0\x00\x32\x88\xae\x07\x87\x55\x72\x25\x9c\xfe\xde\xdd\x27\x54\x14\xf7\xea\x77\xe4\x1c\xf5\x17\x67\x7b\x84\x56\xe0\xe8\xde\x37\x17\x4f\x48\x9c\xa0\x9b\x6f\xc6\x01\xa4\x14\xbd\xd8\x1e\xdf\xdb\xdf\xf6\x37\xd5\x54\x27\x2c\x94\x3d\xbc\xf0\xd3\x5f\x86\xdb\xf4\xb7\xde\xea\x79\x72\xcf\x67\x19\x72\x9f\x32\x57\x5b\x08\xff\x53\x87\x65\xf6\x6e\x73\x81\xa7\xd2\x58\x96\xef\x8e\x12\xb0\x1f\x61\x19\x0f\x21\x83\x70\x67\x63\xd9\x0f\x21\xa5\x64\xb0\x53\x60\x49\xa9\x40\x56\x98\x4c\x8a\xc8\x1d\x07\xa4\x4f\xa2\x22\xe5\x8c\xdf\xf3\x36\xfe\x85\x6e\xc5\xb4\xcb\xfb\xe2\x54\xad\x54\x63\xce\x93\x06\xb3\x56\xcd\x2f\x4a\xee\x1f\xe7\xc9\x7a\xe7\xed\x49\xb6\xd3\xc0\xd0\x91\x0d\xb8\x16\x58\x41\x9f\x20\xc0\x55\xc4\x19\xe6\x61\xb9\x6c\x41\x66\xad\xf0\x61\xc9\x37\xdc\xcc\xae\x72\x32\x4a\x34\xa4\xe1\xd6\xc1\x9d\x62\xfb\x1f\xa9\x0b\x87\xcb\x63\x79\x71\xe9\x96\xc2\x8d\xc4\xec\xb3\x3a\x8a\xfb\x98\x1e\x4e\xd0\x72\x5d\xf1\x8d\x75\xd9\x4b\x5d\x10\xbf\x2d\xe6\x8c\x03\x48\x0d\x7a\xa5\x7f\x5b\xbd\xf9\x7a\x8b\x87\x33\x6e\x4b\x90\xf5\x0f\xf9\xdb\x97\x5e\xdc\x52\xce\x7c\x1e\x05\xcc\xea\xf7\x73\x7a\x02\x0c\xd8\x16\x77\xb6\xf5\x14\x5a\x15\xb9\x78\x3a\x26\x7c\xd6\xf8\x84\xcf\xa8\xb4\xa1\xf4\xfc\x19\xc7\xa9\x22\x5e\xb5\x60\x73\xd5\x90\x42\x6a\x5b\x92\xc2\x3f\xc6\xb7\x44\x84\xfe\xcd\x4d\x42\x40\xa5\x4f\xc2\xc1\x1c\xc3\xd1\xdd\xfe\x0e\xf7\x1b\x96\xaf\xbb\xed\x08\xa6\x13\x96\xbb\x10\x52\x03\x73\x03\xcb\x63\x08\x99\x82\x24\x03\x53\x35\x87\x49\x0b\x07\x73\x4c\xe5\x1c\x1a\x06\x99\x1c\xa6\x7a\x0e\x47\x66\x38\x65\x63\x0a\xe8\x04\x88\x07\x1c\xd5\xb0\x44\xf4\x5d\xee\x0b\x0d\xc3\xd4\xd1\x61\x03\x87\x7d\x12\x53\x4b\x87\x1b\x10\x7e\x0b\xa6\x9e\x4e\x80\xcc\xc0\x75\xc1\x94\xd4\x09\x90\x64\xb8\xfa\x98\xb2\x3a\x14\x18\xe0\x5b\x52\x31\xa5\x75\x42\xee\xb3\x13\xbe\x04\x4b\x5d\x87\x5f\x32\x02\xc7\x17\x4c\x81\x9d\x00\xc9\x81\x75\x11\x53\x64\x87\x0c\x13\xea\x62\x58\x42\xfb\x6e\x56\xc2\x7c\xc1\xd4\xda\x21\x29\x85\x9b\x12\x53\x6e\x27\x40\x52\xa1\xfb\x58\x92\x3b\x84\x0c\xc3\xc5\xc7\x54\xdd\x09\x10\x37\xb8\x5d\x30\x95\x77\x48\x17\x21\x8d\xc7\x52\xdf\x77\x5b\x1c\x3d\x64\x98\x98\x32\xbc\x2c\xa5\x94\xeb\xff\x18\xa6\x17\xfa\x18\x21\x30\xcf\x37\xeb\x8f\x2b\x12\xac\xae\xf9\x35\x7c\x84\x85\x5a\xbb\x4c\x62\xdb\x37\xd0\x82\x54\x6e\x36\xed\x8b\x0b\xcd\xb4\x25\x0d\x0e\x20\x01\xe8\xd2\xed\x8f\x6b\x1e\x75\x1e\xa0\xda\x0c\x30\x25\x1b\x0a\x8d\x37\xe7\xf3\x36\xf4\x6c\x19\x52\x8e\xb5\xf0\x49\xa4\x7b\x15\x32\x90\xb5\xd3\x1a\xf2\xd0\xad\xa4\x28\x4e\xb4\xdb\x67\xfa\x91\xb7\xfe\x98\x8a\xe8\xa8\x6b\x71\x51\x45\x12\xd9\xf2\x14\x5b\x18\xe7\xaf\xf3\x91\x41\x03\x9c\x0f\x1b\x70\x00\x59\x42\x3f\xcf\x73\x0f\xdc\x51\xf6\xdc\xfe\x11\xdf\x3f\xa3\x10\x9d\x67\x9d\x2d\xe4\x6f\xa0\xc9\x86\x73\xfb\xe3\x27\xb5\xd7\x6e\x90\x9f\xb7\x4b\xf8\xdf\xcc\x86\x11\xf2\x82\xeb\x80\x65\x39\x84\x04\xc0\xd5\xc6\x32\x7e\x77\x16\x83\x69\x88\x65\x3f\x84\x2c\x41\x08\xe6\x81\x08\x1c\xef\xa1\x9a\x84\x75\x28\x02\x21\x71\xe4\xcb\xef\xfe\xef\x72\x50\x66\x59\x39\xbb\xa0\xc6\x73\xb2\x60\x93\x1e\x91\x63\x07\xf9\x66\x1e\x69\x94\x0a\x85\x1c\x6e\xc1\x31\x18\xe8\x1d\x6a\x58\xb1\xdd\x43\xb8\x1c\x04\x00\xe2\x86\x3e\x0a\x6a\xff\x25\xfc\xfb\x84\x64\xe4\xf1\xf1\x22\x50\xe7\xf2\xec\x97\x39\xb9\xb4\x53\x69\xb4\x19\x71\xa9\x0d\xc7\xca\xa5\xbb\xf2\x8b\x46\x00\xf1\x43\x9f\xc2\xd5\xbe\x5e\xb2\x44\xd2\xf0\xef\x27\x84\x86\xae\x45\x39\x54\xf7\xab\x96\x70\xc4\x0d\x75\x04\x1d\x3d\x4d\xc4\x7e\x9c\x4f\x5e\x1c\xfd\x17\x83\xf9\x29\xf5\x54\x92\x57\xdf\xfd\xe8\x6c\xe2\xce\x75\x32\xf0\xa6\x9f\xa2\xee\xc0\xa7\x24\x7c\x8e\xef\xd9\xcf\x1c\x20\x65\x3d\xcb\x8a\x07\xc8\x0b\x74\xae\xbe\xd0\x7e\x27\xe1\x9f\x9e\xd1\x8a\xeb\x0e\x1c\x18\x2d\x33\x3e\xef\xf5\x79\xee\xe9\x6b\x96\xb8\x93\x0e\xcd\xa6\xa2\xef\x22\x9f\xe9\x01\x24\x00\xad\xfe\x2e\x7e\x8b\xf1\x7c\xda\xda\x46\xcb\x3a\x18\x22\x86\x1f\x62\xd4\x2a\xad\x97\xf6\xbd\x7b\x5c\x24\x7f\xe9\xd7\xda\xfa\x07\x1d\xf5\x07\x00\x09\x45\x67\x9e\xce\xd3\xeb\xfc\x3f\xea\x7d\x2b\x06\x48\xb9\xec\x2e\x08\x5d\x25\xb2\x6e\xb6\x48\x09\x55\x90\xfa\xd8\x74\xf9\xe3\x78\x53\x3f\xfe\x03\x00\x48\x24\x9a\x4e\x33\xbc\xca\x24\x9a\xf5\xc6\xdf\x3b\x71\xad\xc6\x58\x9a\x59\xc2\x2e\x5e\xec\xbe\x65\x72\xfc\xec\xc4\xe3\x23\x81\xcc\x97\x0b\x4d\xfa\x01\x32\x83\xa6\x56\x1c\x83\x9c\x4f\xec\xce\xca\xdd\xb7\xa0\x7c\xa9\xf5\xc4\xdb\x87\x7a\xa2\x13\x18\xe0\xb2\x5d\x18\x3b\x5c\x6a\x37\xac\xbc\x8e\xa0\xff\xa7\xef\x40\x18\xef\xe3\x82\x97\xec\xf6\x22\x0f\x85\x8c\xc2\x79\x2a\x58\x0c\x6a\x23\xcb\xef\x30\xf5\xbc\xf6\x66\xad\x75\x63\x6e\xca\xbc\x8a\x03\xc8\x02\x9a\x85\x39\x49\x5e\x8a\xb6\xed\x0f\x5b\x8b\xa4\x3b\xe7\xbc\x28\xd3\x6f\x78\xaf\xa1\x8f\x7a\xbf\xc8\xdf\x79\xb5\x85\x91\x05\x7e\xd2\x03\xba\x38\x80\xfc\x46\x0f\xf2\xac\xbf\xaf\x74\x4a\x0e\x0b\x4a\x7d\x7c\x51\x78\xab\xb7\xfc\xfc\x79\x09\x6e\x83\x75\xf9\x5e\x5e\xdb\xfe\x85\x9e\x2b\x07\xa4\x52\x6f\x00\x80\x78\xa3\x33\x20\x2a\x7d\xa4\x7a\xa8\x6d\x70\xc9\xcb\xac\x82\xfb\xbe\xb7\x99\x9a\xda\x6b\xc3\x30\xdd\xde\xe3\x67\xd9\xef\x99\xed\x17\x78\xed\xa5\x0f\x90\x34\xf4\x09\x38\xb8\x41\xab\x32\x75\x6f\xec\x9d\x55\x9a\xf6\xb3\x99\x83\xb7\x2f\x1c\xb9\xc8\xd6\xc9\x0b\x9e\x39\x83\xfd\x3a\x7f\x57\xbd\xfe\xf7\x2a\xd9\x09\x74\x20\xf7\x73\x9d\xbf\xbc\x49\x67\xdc\xf1\x98\x43\xbc\x28\xf3\x8c\x31\x93\x15\x4d\xa8\xc6\x65\xde\xbe\x53\x9e\x7e\x6c\xcb\x27\x2b\x82\x2d\x01\x40\x12\xd0\x57\x14\xcf\xf4\xf4\xab\x7c\x25\xd6\x6c\xf8\x66\x35\x6f\xd4\x13\xfc\xc6\xa4\x64\xff\x01\x67\x49\xd2\x78\xab\x26\x79\x93\x91\xa6\x29\x0e\x27\x80\x7c\xff\xcf\x2b\x83\xba\x88\x12\x56\x58\x82\xe7\xc5\x33\xc7\x72\x7f\xd7\x7f\x9c\x14\x90\x1d\xbc\xcd\x78\xd4\xbd\x5e\x39\xe8\xb5\xda\xbc\x42\xd9\x1f\xd4\xa3\xc9\x3a\xa6\x21\xfa\x1f\x28\x2a\xf0\x6c\x09\x2e\x56\xe5\x36\x89\x8f\xab\x4c\x7a\x8f\x46\x15\xd2\x5f\x62\xd4\x2e\x0b\xdb\x1f\x1e\x07\x00\x12\x80\x4e\x99\x98\xd4\xa0\xa4\x4c\x86\x54\x8b\x7b\x17\xd8\x2a\xb3\xcf\x86\x0c\xf7\x48\x8e\xcd\x94\xf3\x4d\x99\x9d\xf6\x8f\xfc\x7d\x3f\x8a\x4b\x03\x20\x35\xe8\x75\xba\x2e\x37\x59\xd4\x62\xf0\x26\xf8\xb8\x78\xb7\x29\x37\x73\x65\x95\x55\x53\xf1\x4c\x61\x83\xce\x7a\x9d\xe4\xd4\x87\xb0\x6f\xe3\x5a\x78\x80\xbc\x41\x07\xb2\xe4\xcb\xb6\xe6\xcb\x06\xd5\xb0\xe7\xae\x52\xdf\x3d\x62\xe9\x2c\xe3\xd6\x7e\x46\x35\x4e\xc4\x8f\xe1\x78\xda\xa7\xbd\x3b\xe2\x44\x00\xd2\x88\xd6\x6b\x7c\x2d\xde\x55\x1f\xaa\x0a\xc9\x93\x61\xe0\x6b\xcd\x5f\xa3\xec\xf8\x55\x12\x33\x72\x57\xc6\x49\xe3\xdc\x65\x2a\x9e\x85\x93\x7d\x1e\x00\x19\x43\x5b\xb3\xd9\x32\x86\x3f\x70\xef\xe0\x19\x20\x56\x2b\xfa\xda\x9f\x52\xce\xe4\x33\x8b\xf7\x01\x9f\xfc\x3c\xfe\xb3\xf6\x27\x5b\x81\x4b\x1d\x0e\x20\x9d\x68\x6d\x91\xea\xbe\x7b\xea\xa4\xa9\x89\x90\xf6\x49\x3a\x93\x48\xbf\xd8\x85\xed\x63\xc2\xfd\x1b\x9a\x8b\xa2\x9e\x35\x7d\xf3\x94\xaf\xc6\x0f\xed\x64\x0d\xfa\xa4\xf4\x35\xd1\xf4\x57\x61\xbe\xe6\xb1\x4b\xe2\x0e\xc9\xd3\xf2\x76\x5c\x0f\x1e\xb9\x79\x07\xe3\xf3\x5f\x33\x2e\x80\x8f\x7e\x7f\x5e\xce\x01\x64\x13\xfd\xf1\xf1\xcb\x23\x1b\xee\x87\x43\x2a\xd6\x98\xf2\x94\x6b\xe2\x4a\xa3\xa9\x44\xba\xd5\x0d\x4a\xa6\xa6\x2e\x67\x8d\xd1\xa6\x5d\x55\x34\xdf\xc9\x02\xf4\xcd\xa3\xfc\x74\x86\xe2\x58\xaf\x80\xe7\x6b\x1f\x5d\x7f\x7e\xf9\xb4\xc1\xd7\xd6\x99\xe5\xc6\xa8\x7e\xc3\xed\x2f\xaf\x2e\xcf\x9b\xc7\x55\x16\x00\xa9\x40\xd7\x0e\x0b\x87\x9a\x5f\x0b\x1a\xb3\xba\xc2\x07\x48\x23\x32\x6d\x49\xdb\x5a\x7d\xbf\xf7\x07\xa4\x29\xc6\xd0\x76\xb5\x92\x27\x66\xf5\x49\xe0\x01\x12\x8c\xa6\x34\xab\xfa\x59\x9d\x3d\x07\xdf\x28\xff\xc9\x96\xbc\x29\xd5\x3a\xbd\x18\xcb\xf6\x28\xa5\x80\xc4\x2a\xd4\xc9\xbd\x4d\x7d\xd4\xff\x02\x3b\x40\x22\xd1\x5b\x2a\x76\x2c\xff\x74\xca\x41\xf7\x19\xf2\xc6\x3f\x47\xda\x79\x15\x4f\x5c\x10\x59\x7a\xef\xa2\x61\x1e\xa8\xda\x60\xe7\x48\xa3\x67\xc8\x05\x90\x7a\xf4\x8e\x1a\x2b\x34\xb9\x48\xf2\x65\xed\xb3\xbe\x75\x58\xaa\xb8\xb8\x3f\xd7\x1d\x4d\x81\xd7\x4a\x17\x46\x8e\x7f\x9b\x64\xd0\x6f\x52\xf4\xe8\xc7\x01\x24\x14\xad\x9b\x4c\x3b\x85\xdb\xbc\x3b\x15\xe1\x7b\x3a\x9b\xdb\xab\x43\x82\x77\x95\xca\x72\xe4\x00\x6b\xcc\x1d\x61\xfc\x06\xc3\xf7\xab\xe6\x45\xeb\x78\x80\x84\xfe\xe7\xa2\xe3\x9c\x46\xb7\x7a\x18\xb9\x2c\x5d\x45\xe2\xd6\xd6\x50\x6a\x87\x72\xdb\x6b\x5c\xf4\x90\xaa\xc3\xb8\xdd\xf3\x37\x8e\xc4\xf7\xd2\x00\x12\x8d\x0e\xce\x83\x60\xc7\x78\xe6\xe5\x3a\x61\x0a\xa9\xa0\xc1\xa4\x1b\x65\xeb\x99\xba\xcc\x27\xec\x87\x04\xdd\x1f\x93\x1f\x6d\x11\xc0\xbb\x5d\x03\x48\x33\x7a\x65\x9f\x96\x2c\x76\xac\x4d\x32\xb5\x47\x7c\x7f\x92\x6b\xac\xd5\x7c\xae\x45\x7d\x91\x69\xec\x5c\x3a\x47\xce\xc5\x3d\xdf\x4b\x84\x72\x1a\x50\x8f\x5a\x32\xe2\x9a\x84\xf3\x9e\xae\xb0\x31\x9a\x8a\xec\x3f\xc2\x7a\xb5\x09\x27\x5b\x58\xeb\x61\xae\x77\xba\x2a\xcc\x94\x84\xef\xc4\x1a\x3a\xe2\x82\xea\x2b\xe6\x6f\xd8\xc7\x62\x72\x3e\xbb\x6f\xe7\xe8\x73\x9c\x5b\x6f\xc9\x2b\x08\x7c\x5e\x68\xb1\x55\xb4\xce\x58\x72\x26\x0c\x0f\x10\x57\x74\xba\x8f\xa6\x7d\x7c\x44\xca\x27\xef\x2f\x71\xd3\x22\xcc\xab\x84\x84\x78\x5e\xe4\x26\xc9\x43\xd5\xb4\xd7\x43\x5f\x99\x7c\x2f\x94\x85\x58\x00\xe4\x0d\xba\x1b\xa4\xcb\x8c\x9b\xca\x3d\xdc\xe0\x9e\x49\xf6\xd0\xc3\xf7\xbc\xba\xa9\x11\xc1\x60\xba\xa6\xb9\x11\x4e\x43\xa5\x68\xba\xc4\x91\xab\x0d\x90\x4f\xe8\x15\xd2\x59\x56\x5c\x32\x94\xa7\x61\xb0\xdd\x73\xd7\x71\x35\xcd\xb6\xb4\x84\x4f\xb8\x4f\xf4\x74\x4e\x3f\xf5\x17\x7e\x97\xbe\xc3\x67\x2f\x03\x80\xc4\xa0\xf3\xc5\x54\x74\x3b\x26\xc4\x25\xcf\x3f\x61\xeb\xee\xb4\x74\xdd\x17\x8a\xf2\xd2\xc2\x46\xae\xf9\xd5\xed\x08\x72\xa2\x87\xf1\xea\x72\xcc\x00\xf9\x82\xae\x79\x5d\x63\x12\xd4\x9e\x6a\xdf\xb6\xc7\x9b\xec\xd4\x3d\xa8\xb8\xc7\x84\x75\x0c\x47\xb5\xe9\x12\x6d\x4b\x4d\xe3\xcf\xd4\x2c\x88\x73\xa1\xb7\xf5\xba\xcb\xfb\x7d\x21\xda\x9a\xf9\xca\x39\x72\x52\xb6\x2f\x48\x4b\x49\x97\x12\xb9\x8a\x05\x56\x37\xbb\x3a\x8f\x6e\x90\xcd\x3a\x00\x80\xb8\xa3\x57\xe7\xe6\x83\x19\x46\x9d\x83\x41\xaf\xb4\xed\x7f\x2d\x79\xd1\x12\x9d\x3c\xab\x94\x4f\xf2\x56\x20\xeb\x74\x52\xe4\x17\x95\x81\xd4\xa7\xdb\x00\x19\x47\xa7\x8a\xd6\xc4\xd9\xea\x8d\xaa\x1a\x27\x76\xc9\xa7\x9e\xae\x2d\x43\x12\x2a\x4d\xe9\x94\x6d\xf9\x9b\x29\x1b\x76\xf2\xdd\x9b\xfa\xa3\x3c\xa8\x47\xbd\x6c\xe8\x42\x0c\xb2\x6b\xfe\x2a\xea\xd8\x1e\xeb\x7f\x7f\xbc\xe6\xa1\x28\x77\xc7\x25\x92\x1b\x0c\x8e\xe9\xc7\x19\x48\x2f\x5e\x9b\xc5\x03\x24\x02\x1d\xc3\x9b\x67\x8c\xa4\xe7\x78\x05\xca\x79\xaf\x4b\xfd\x20\xd9\xdf\xd7\xf3\xb2\x55\xf1\x73\xb4\x25\x9f\x17\x5d\x3f\xcf\xa3\xe6\x03\xda\x13\x00\xc9\x45\x5b\x72\xf7\xa9\x5c\xe4\xbd\x9c\xb8\x3d\xa4\x1f\xcf\x77\x49\x9b\x5d\xa4\xeb\xd6\x77\xd8\x1b\xdb\xb4\x3a\x37\xa1\x1c\x34\xda\x94\xb1\x79\x16\x20\xe5\x68\x3f\x13\x0b\xc3\xc6\xc3\xdf\xb4\xdf\x62\x75\xba\x22\x4a\xdf\xc6\x15\x40\x3f\xdf\x67\xcc\xdf\x46\xc2\xbb\x65\x56\xd2\x56\x9c\x76\x37\x0a\x00\xa4\x04\x2d\x82\xdc\xbf\xd9\x7b\x11\x1f\x7d\x03\xb0\x7e\x6a\xf7\x9b\xae\xba\x21\xc0\x76\x1a\xe8\x1d\x11\x1d\x90\x09\x1f\xba\x9a\xa8\xd0\xf5\x2b\x0d\x20\xdf\xd1\x73\x8c\x88\x60\x28\x73\xd3\x51\x86\xa3\x64\x87\x1b\xc7\x8a\xbb\x02\xc8\x9d\xfe\x2e\x26\xf4\x7f\xf4\xfc\xfd\xc0\xe2\xb2\xde\x9d\x94\x07\xd6\xa8\x47\xbf\x52\x70\xd5\x3c\x4a\x2a\xe0\x97\x18\xea\x93\xfe\xd4\x74\x96\xe6\x5e\x46\xdf\x57\x01\x97\xd4\x2b\x14\x79\x6f\xf7\x7f\x9d\xcc\xb8\x8d\x07\x48\x11\xba\xae\x8b\x94\x3f\x68\xf9\x1c\xa1\xd4\xa6\xfa\xf7\xc6\x98\xdb\xd6\x0f\xba\x47\x9c\x9f\x26\x82\x44\xe9\x46\xdb\x1a\xca\x4b\xd4\x40\x94\x1d\x40\x6a\xd1\xbb\x93\xb9\xfe\x57\x86\xd3\x33\xdb\x27\x1d\x76\xbe\xf8\x5f\x6e\x95\x3a\xbe\xad\xe6\x4b\xf3\xd5\xe9\x27\x56\xaf\x6b\x86\xd8\x6c\xc9\x0e\x03\x64\x09\xfd\xb8\xff\x9c\x12\xed\xb9\x8b\x1e\x19\x97\xd5\x2e\x0a\x55\x6f\x6e\xfb\xf6\xde\xbd\x11\x90\x94\xd0\x4f\x15\xdb\xe3\xe3\x20\xf2\x24\x81\x1f\x00\xa4\x0c\xbd\x8f\x0e\xd7\xbb\x52\x89\xde\xe2\xd7\xda\x54\x5e\xd8\xb2\xfa\x71\x60\x4a\xd2\x68\xf1\xc1\x81\x67\x8c\xf1\x74\xce\x6c\x2f\xb6\xe4\x54\x16\x00\x52\x81\xce\x5c\x69\x91\x41\x29\xf7\xd9\x96\xae\x03\x13\x51\x8a\xb2\x09\x2a\x5b\x0a\xbd\xed\xcc\xf1\x69\x07\x82\x72\x96\x6d\xd7\x0d\xcc\xd9\xaa\x70\x00\x69\x41\x27\x81\xca\xdd\x8f\x14\x9c\xcc\xda\x1e\x89\x2b\x9a\xf8\x60\x8d\x1b\x40\xfd\x97\x73\x84\x4e\xd4\x15\x0e\xda\xb9\x88\x90\xb9\x7a\xc4\x59\xf8\x1f\xa7\x4c\x19\xca\xff\x23\x56\x90\xbb\x63\x4d\x9a\x10\xe2\xb7\xfb\x2a\x28\xac\x91\x13\xc8\xd0\x11\x09\xef\x90\xa4\x59\xb4\x0f\xfa\x53\x4b\xa7\x27\xe5\xf4\x3b\x43\xb3\x9b\xd7\xe8\xd9\xaf\x36\xcc\xd5\xb0\x51\x29\xd3\xef\x95\xde\xf4\x4b\x92\xe7\xb2\x6f\xd9\xbf\x43\x77\xd1\xa9\x76\xc7\x41\x39\xa5\x40\x75\x35\x3b\x56\x3d\xf1\xe1\xf8\xaf\xe3\x2b\x0f\x9f\x27\x5b\x73\x7c\x54\xbe\xc5\xf8\x4d\x2a\x83\xbd\x94\x81\x1e\x07\x90\xcf\xe8\x5c\x2b\xff\x70\xab\xe2\xf7\xe3\x74\x73\x39\x1a\x51\xe9\xc7\x66\x8a\xc5\xda\xa6\x22\x55\x3f\x0c\x1c\x2d\x63\xa8\x68\xb4\x0b\x75\xfd\xbb\x70\x00\x79\x87\x9e\x25\xcb\x94\xec\x5d\xcf\xe7\x2f\xdd\xf5\x7f\x6f\xb8\x60\x93\x64\x7a\x74\x96\x47\xa7\xfa\xdc\xeb\xc8\xc6\xc0\xeb\x79\x76\x63\x53\x05\x8c\xc2\xff\x66\x36\x0c\xd0\x2c\x8c\x29\x96\xe5\x10\x52\x05\x05\x34\x2c\xe3\x21\xe4\x33\x54\x04\xb0\xec\x87\x90\x77\x50\xaf\xc7\x9c\xfd\x09\x90\x17\x90\xf0\x61\xce\xff\x04\x48\x00\xbc\x71\x80\xc9\x01\x08\x90\x50\xc8\xde\x30\x69\x00\x01\x12\x09\x0f\x9a\xb0\xa8\x00\x84\xcc\x90\x40\xa1\x18\x8b\x13\x00\x19\x62\x06\x4a\x77\x1c\x40\x12\xd0\x9b\x35\xca\x84\x5a\xb4\xa2\xc2\x0d\x3f\xf4\xba\x89\x31\xfe\x60\xf7\xaf\x27\x6d\x82\x9a\xf1\x83\x7c\x31\x76\x9a\x8f\x0f\x34\x0e\xe5\xe5\xe1\x00\xb2\x86\xae\xa9\x2f\xde\x5c\xce\xfd\xd3\xaa\xa9\x56\x63\xbf\xfe\x46\xf5\xfa\xaf\x64\x12\x97\x9b\x52\xe1\xe3\x6c\x86\xc5\xf3\xc9\xee\x96\x16\x6f\xff\x97\x88\xe8\x4a\x36\xc3\x53\xba\x76\x61\x3a\x71\xed\x03\x3e\xd2\xfb\xc1\x62\x7f\x58\xf1\x3c\xfb\xcc\xa0\xe6\x95\xfd\x3f\x7f\x5c\x68\x39\x73\x28\xd0\x05\x07\x90\x5e\xf4\x46\x3a\x2a\xb7\xa8\x36\x52\xfb\xe8\x30\xdd\x5b\xa5\xaf\xb5\x4c\xf9\x4e\x2f\x1b\x99\x94\xaa\x49\x1f\xf7\x50\xdc\xa8\x57\x06\xf6\x27\x07\x71\x00\x79\x8b\x6e\x09\x89\x5d\xf6\xe1\x27\xab\xb8\xce\x0c\xb7\xce\xeb\xd8\xee\x59\xbc\xfb\x68\xfc\xb6\x56\x91\xe1\x3e\x79\xca\x37\x0c\x96\x47\x1b\xe2\x3b\x84\xff\xcd\x4d\x18\xd0\x04\xb8\x06\x58\x9e\x42\xc8\x1a\x54\x65\xb0\x9c\xdd\xcd\x5a\xa8\x48\x62\xf9\x0b\x21\xbd\x70\x07\x62\xb9\x0c\x21\x6f\xe1\xcd\x22\x2c\xfe\x07\x21\x0b\xf0\x2c\x0b\x93\x02\x12\x20\xbf\xa1\xf2\x87\xc9\x02\x09\x10\x6f\xe8\x0b\x16\x13\x84\x90\x34\x18\x31\x4c\x32\x48\x80\x4c\xc0\xa5\xc4\xe4\x83\x70\xf5\xe1\x8f\xab\xb0\x38\x21\x84\x7c\x67\x84\x02\x1b\x26\x39\x94\x15\x14\x24\x22\xda\xe9\x1d\x1d\xe8\xfb\xab\x9f\x25\x3c\xf7\x86\xe9\x0d\xe1\x73\x25\xf2\x8b\xd7\x53\xda\x33\x81\x03\xad\x5e\x4e\xfc\xc2\x0d\xd2\x0c\x06\xff\xf8\xc0\xde\x51\x1c\x40\xde\xa3\x07\x49\x50\x97\xd4\xb5\x87\xba\x7b\x7e\xce\xf2\xf0\xb7\x6b\x41\x35\x07\xa4\xfd\x06\x66\xc7\xf9\xf8\x1d\x24\xaa\x70\xae\xda\xd7\x8c\xaf\xe1\x00\x82\x43\x6f\xd9\x40\x9e\x90\x76\x7e\xea\x43\x4e\x9e\xdf\xde\xe8\x54\x92\xe1\x43\x93\x24\x55\x99\xd5\x9b\x17\xfb\x79\xb7\x7a\x1b\x89\xce\x1e\xf5\xc7\x01\x04\x8f\x66\x2a\xd7\x63\x25\x35\x06\x78\xe6\x3c\xb2\x74\x92\xcd\xfb\x68\x5c\x95\x3e\x1f\x4e\x91\x70\x39\x46\xfc\x33\x58\xe4\xe6\x37\xc7\xf4\xa0\xb7\xc2\xff\x66\x36\x8c\x50\x07\x3c\x7d\xc0\xb2\x1c\x42\xde\x43\x61\x1c\xcb\x78\x08\xc1\xc1\x5d\x88\x65\x3f\x84\xe0\x61\xe6\x62\xd2\x74\xd8\x08\x60\x55\xc7\xa2\xea\x10\x52\x03\xb7\x14\x26\x5b\x27\x40\xde\xc0\x64\xc7\x64\xec\x04\x48\x23\xd4\xac\xb1\x58\x3b\x84\x8c\x41\xc3\x30\x89\x3b\x01\xd2\x09\xf5\x77\x4c\xee\x0e\xf7\x3a\x5c\x17\x4c\xfe\x4e\x80\x6c\xc2\x6f\xc1\xa4\xf0\x70\xe3\xc2\xeb\x5a\x58\x34\x1e\x42\x2a\xe0\x18\x80\xc9\xe4\x09\x90\x60\x98\x96\x98\x6c\x1e\xf6\x74\x98\x63\x58\x8c\x1e\x42\xea\x61\x75\xc4\x22\xf5\xbb\xc3\x06\xbc\x4f\x80\xc9\xeb\x21\x04\x36\x07\x4c\x6e\x4f\x80\x44\xc3\x88\x61\xf1\x7b\x08\x69\x26\x85\xff\x1f\x89\x45\xf4\x81\x2c\x9d\x2b\x05\xd9\xce\x80\xf2\xfb\xc0\x7f\x8e\x1f\x9e\x95\x9e\x34\x7a\x58\xe6\xe2\x2b\x5e\x57\x91\xc5\x73\xec\xb5\xcc\xf6\x85\xa6\x3d\x06\x03\x24\x66\x11\x5f\xa9\x2a\x6b\x5f\xe3\x00\x52\x82\x56\xdc\x1c\xd4\xaf\xad\x1c\x64\x74\x2f\xf6\x6c\x5f\xd5\xd2\x53\xf8\xd2\x63\xfd\xd4\x79\xfd\xd6\x9e\x99\x42\xd2\x39\xfd\x33\x3f\xd7\x1b\xf4\x76\xd8\x07\x9a\x0c\x95\x84\xf3\x9b\x1f\x98\xf9\x38\x19\xfa\x30\x49\xfc\xf7\x7a\xc9\x51\x0d\x63\x30\x9e\xff\xfe\x49\xf1\x30\xc2\xfa\xfe\xf9\x66\xa4\x39\x0e\x20\x61\xe8\x6a\x7d\x6e\xe1\xe2\x54\x8d\x9f\x5e\xd0\xa8\xab\x6e\x73\xf9\x13\x0d\xb3\x27\x9f\x1e\xdc\xa8\xd7\xf5\xb9\xba\x2f\xe5\x28\xb7\x4d\xa2\x61\x35\x0e\x20\xfe\xe8\x49\x9c\xba\x46\x91\x65\xec\x9e\xe8\x72\xba\xc0\xd1\x68\xb1\xb0\xb1\x04\x9a\xb7\xb2\xd3\x8b\xe3\x9a\x12\xcf\xdd\x5a\xfc\x42\x59\x6f\xf1\x09\xff\x9b\x9b\xbb\xed\x16\xee\x5a\x2c\x4f\x21\xa4\x04\x16\x2d\x2c\x67\x21\xa4\x05\x2e\x35\x96\xbf\x10\x12\x06\xcb\x3c\x96\xcb\x10\xe2\x4f\xb2\x1c\x4e\xf2\x6f\xda\x0e\x90\x71\xf5\x72\xdd\x49\x8e\x49\x74\xab\x7a\xa7\xff\x31\xfa\x97\x7b\xab\xa1\xa7\x7a\x11\x0b\x2e\xb9\x2d\x64\x4b\x42\x34\x5e\x95\x33\xbd\x4a\xaa\x71\xef\x3b\x85\x00\x9e\xff\xbd\x56\x0f\x4d\xa3\x28\x96\x1d\x6f\xbc\xf1\x97\x88\x0c\x6d\xec\xfe\x35\x7e\x76\xc9\x53\x87\xf2\xd9\x5e\x23\xa5\xda\x20\x4e\x9a\x46\xad\x10\x5e\xe6\x26\x1c\x40\xc2\xd1\x12\xe2\xb1\x86\x2b\x2d\x16\xba\x25\xbe\xc4\x19\xdb\xde\x38\xd7\xd7\x7a\x6a\x3a\xf3\x69\xb6\xd9\x32\x31\x1d\x2c\x8a\xad\xa1\x89\xab\x6f\x71\x40\x1a\x9d\x4b\x39\xfd\xb4\xc5\xef\x36\xce\xc8\x9c\x2f\xe3\x15\x45\x4e\xe7\x09\xbc\x1c\x78\x92\x4c\x26\x59\xcb\xa9\xb1\xf1\xf5\x6e\xef\x87\x6b\x3b\x1f\x5f\x81\xce\x8d\x6a\x67\xc6\x9e\xe7\xb5\x6c\xd1\x54\xb9\xb2\xdb\xfc\x2e\x72\x47\x37\xbc\xef\x6a\xb2\x74\x49\xf8\x5d\xda\x10\xb3\xa8\x51\x62\x3e\x2a\xfc\x6f\x5e\xc2\x78\x4e\xc2\x62\x83\xe5\x28\x84\xa4\x42\xca\x85\xe5\x2b\x84\x84\x53\x10\x8e\xa0\xb1\xfc\x25\x40\xa4\x61\x36\x61\x79\xbc\x5b\x9d\x21\xaf\xc3\x54\xf1\x08\x10\x57\xd8\x02\x31\x95\x3c\xd8\x68\x77\x79\x1d\x96\x9a\x47\x80\x7c\x82\xd5\x19\x53\xd0\x23\x40\x62\x60\xdb\xc0\x12\xf5\x20\xe4\x0b\x0d\x9c\x2a\x31\xd5\x3d\xd9\x14\xa2\xff\x3f\x55\x6e\xa1\x15\x06\x9b\x9f\x47\x07\x2b\xb9\x45\xad\x36\x88\xa6\x64\x5c\x5b\xe9\x3d\x1a\x7c\xb2\x17\x6e\xca\x8e\x52\xa4\x16\x53\x07\xef\x2b\x10\x9e\xc2\x01\xa4\x10\x5d\xd7\xf4\xf5\xa2\xd3\x9d\x27\x5c\xea\x2e\x9f\xf8\x4e\x39\xf6\x72\x2a\x8b\xde\x76\x08\x17\xcb\x26\x29\x7b\xf1\x6e\x98\xd3\x37\xee\xb8\xfc\x9d\x96\x81\x26\x6a\x11\xb1\x6c\x1e\xbe\xd6\x1b\x16\x4a\x46\x62\x99\x35\xdc\x85\x2a\xf2\xd2\x4e\xa6\x38\x1b\xea\x0b\xde\xdc\x52\x15\x75\x1a\x97\xf9\x70\x00\x99\x42\xd7\x65\x19\x81\x40\xa7\xfd\x4a\x5d\x5f\xbf\xb7\xcd\xba\x03\xba\xdc\x21\x5a\x27\x9e\x98\xbf\x66\xed\x9a\x8c\x9b\x16\xf8\xab\x49\xa6\xef\x84\xff\xcd\x6c\x18\xa1\x2d\x28\x2f\x60\x59\x0e\x21\x85\xb0\x42\x61\x19\xbf\xdb\x25\xe1\x6a\x63\xd9\x0f\x21\x53\xb0\xda\x62\xea\xac\x04\x88\x3b\x9c\x91\xb0\xb4\x56\x08\x19\x67\x84\x8d\x15\x4b\x74\x05\xb2\x64\x95\xc4\xff\xab\x9d\x15\x68\x55\x8f\xa2\x8d\xd1\x8e\x96\xfa\xf7\x1d\x7d\x1b\x8d\xf1\x8e\x98\x3b\x13\xf7\x34\x89\x6e\x9b\xdc\xba\x19\xbe\x20\xb4\x78\xdc\x96\x5d\xef\x0c\x0e\x20\x43\xe8\x04\xe9\xd3\x10\x32\xb3\xe3\x22\xe7\x30\x3e\xa5\x3b\x6c\x66\x4d\xb3\xf7\x81\x89\xb7\x0b\xf1\xa2\x4c\xa2\xb1\xbf\x5e\xdb\x36\xf1\xfd\x27\x3b\x8c\x0b\xfd\x2b\x3e\xa5\xab\xf1\x82\x2f\x49\x43\x15\xc2\xc2\xec\xee\x52\x73\x5f\x6b\xfe\x9e\xb9\xbc\xcc\xba\xa7\xf0\x4f\x78\xa2\x43\xc6\x87\x7d\x27\x48\x70\x00\x29\x40\x1f\xef\xb4\x5e\xa0\xfc\x6a\xe2\x76\x8f\xea\x53\x03\x37\x83\x7c\xa4\x96\x0e\xcd\xe7\xf4\x9f\x3c\x3a\xa4\xa2\x3d\xb1\x07\x4b\x99\x84\x62\xf2\x70\x00\xc9\x43\x7f\xfe\xe7\x4f\xad\x49\x87\x4f\xb6\x5d\x93\x7f\x32\x11\xb9\x38\x6e\xd6\xab\x9b\xdb\x9e\x8b\x63\x57\x7c\xca\xb9\xd4\xcd\x38\xd3\x7b\xf3\xac\xf0\xbf\xb9\xb9\x5b\x71\x60\xf9\xc0\xf2\x14\x42\x86\x60\x42\x61\x39\xbb\x4b\x4a\xe1\x09\x3d\x96\xbf\x10\x52\x00\xc7\x61\x2c\x97\x21\x24\x0f\x7e\x0b\xa6\xc2\x4e\x80\x44\xc0\x4c\xc7\x54\xd9\x09\x90\x5c\x38\x42\x62\x2a\xed\x04\x48\x39\xcc\x74\x4c\xb1\x1d\x4e\x2f\x70\xa3\x63\x09\xee\xbb\x9c\x9c\x16\xfe\x4a\x0d\x4b\x79\x07\x88\x0a\xe9\x4e\xed\x5c\x43\xa7\xe2\xca\xcc\x8d\x73\x11\xd1\x42\xaf\x0e\x76\x23\x2a\x73\x2a\x7b\xbe\xd4\x5a\x73\xaf\x35\xf1\x8f\x14\x57\x1d\x91\xa9\x79\x55\xb0\xef\xc1\x0e\x77\x44\xa7\x22\xa7\xb4\x8a\xd1\xe5\xd7\xcf\x3c\xaf\x31\x74\x93\xbf\x5c\x26\x99\x12\x94\x3a\xc5\xc2\xcf\xd1\xdd\x90\xd7\x74\xda\x46\xee\xcf\xb3\x6c\x1c\x40\x6a\xd1\x7d\x9f\xf2\x9b\x0c\xf1\xd6\xa1\xc6\x7c\x81\x63\x35\x83\xc6\xba\x8d\xa3\xfa\x35\x8c\xf8\x2f\x93\x7c\x56\x7d\x4e\x74\xb4\xcf\x9c\xdc\x77\x66\xce\x6a\xf4\x18\xb2\xcf\x44\x74\x99\xd1\xd0\xe5\x1e\x93\xab\x64\xd2\x86\x9e\xc9\xde\x7e\xef\x20\xe3\x34\xce\x42\xab\xe0\x43\x07\x74\x02\x7b\x3a\x7b\x84\xff\xcd\xec\x5d\xc5\x0a\x66\x14\x96\xe5\xbb\x5c\x19\x66\x14\x96\xf1\x10\x52\x0b\x5b\x38\x96\xfd\x10\x52\x0d\x69\x1c\xe6\x09\x08\x01\x52\x04\xb9\x32\xe6\x29\x08\x34\x6c\xf7\xc6\x0f\xd6\x49\x08\x01\xb2\x04\x21\x98\x87\x21\x04\x48\x19\xac\x27\x58\x07\x22\xbb\x25\x08\x2a\x56\x58\x67\x22\xbb\x83\x3a\xfd\x72\x2d\xcb\xff\xc7\x5c\x49\xc5\xd9\xd5\x3f\x76\x3f\x9d\xd0\x2d\x9e\xb0\x5a\xe4\x60\x2f\xb9\x59\xa0\x6c\x1a\x91\xd0\x5a\x78\x43\x99\x8c\xa7\x4c\x78\x0f\x90\xdd\x5e\xd9\xde\x0e\xe5\xc0\x03\x24\x08\x7d\x61\x2b\x95\xd5\x7a\x3c\x61\xbc\x8c\x43\x58\xd4\x8d\x23\xa8\xdd\xd1\x43\x8a\x54\x22\xe9\x61\xa3\xed\x34\x33\xf7\x53\x33\x96\x8c\xd5\x34\x80\x64\xa2\x67\x6e\xed\x62\x87\xe3\x21\xf7\x7f\x36\x0f\xda\xdf\xfc\x7e\x23\x8d\x84\x7a\xbd\x67\xbd\xe5\x72\xc1\x76\x5c\xe7\x9d\x57\x47\x25\xbb\x88\x4d\x00\x32\x80\x1e\xb9\xaf\x59\xd4\x71\x79\x5d\x73\x34\x15\x9d\xe7\xa5\xc0\x1f\x94\x18\xfe\x90\xf8\x27\xfb\xc1\xfb\x75\x8d\x67\xf6\xdb\x5c\x87\x18\x55\x53\xf0\x00\xc9\x42\x0b\xc6\xa7\x82\x8d\xe8\x69\x63\xfb\x0f\x19\x74\xad\xd6\x0b\xac\xdd\x21\x75\x30\xdf\x93\x77\x54\xe1\x90\x82\x3b\xaf\x03\xee\x37\x0e\x61\x07\x48\x36\x7a\x6b\xf8\x1a\xfd\xc9\x67\xb9\x7e\x2f\x41\x93\xe1\x70\xa3\xad\x54\x78\x88\xe0\x53\xd1\x2f\x94\x67\x9d\xb5\x7d\x06\x55\x1f\xb8\x56\x32\x5a\x00\xa4\x0b\xad\x85\x59\xfc\xb2\x07\x9d\xa1\x07\x1a\x2f\x7a\x0d\x98\x7c\x35\x08\x5e\xcb\x8e\xda\x20\x3b\xa1\xc0\xf9\xe3\xe3\xac\xa0\xdd\x81\xa2\xb3\x72\x78\x80\x14\xa0\xd9\xa7\x25\x99\x8c\x5c\x48\xa2\xd9\x9f\x96\x4f\xe2\x1f\x2a\x28\x2a\xe4\xc6\x7e\xd4\xa4\x8f\x90\x85\x06\xec\x65\xa9\x64\x99\x62\x2b\x0b\x00\x48\x03\x9a\x00\x58\xb9\xcd\xb4\x3a\xac\xb9\x2b\xfd\x61\x29\x0b\x53\xba\xe2\x41\xae\xfa\x9a\x3f\xa3\xc2\x9d\xe4\xf8\xc6\x21\xbd\xb3\xf5\x65\xa5\xcc\x00\xf9\x85\x56\xf2\x26\x72\x4c\xa5\xeb\xfb\x67\xd9\xce\x93\x3d\x58\x96\xb2\x14\x38\x65\xc4\x63\x9b\x9a\xbc\xec\xae\xf8\xe1\x06\xd1\xb0\xe2\xb2\xcd\x3a\x1e\x20\x6e\xe8\xe7\xff\x32\x19\x3e\x1c\x36\xec\x50\xb4\x50\x98\xc8\x5e\x7e\xd3\xe6\xe5\xa9\xfe\x51\xc6\x26\xbd\xd6\xbf\x99\xd3\x43\xd0\x86\x82\x78\x0e\x20\x2f\xd1\xa1\x8c\xf8\xa9\xe0\xc7\x47\xa7\x60\x31\x60\xf8\xc9\x85\x2a\xdf\x62\xf8\xf7\xc7\x08\x1b\x06\xc9\x52\xfe\x9f\xeb\xb7\x79\x8d\xce\xca\x02\x80\xf4\xa1\x27\xc6\x23\x77\x4b\xde\x2b\x78\xd5\x07\x9c\xe7\x50\x3f\x72\x9e\x66\xdb\x39\x49\x6b\x73\x5c\xf9\xb5\xcb\x5a\x66\xf3\xdd\x22\x46\x87\x8b\x6b\x78\x80\xa4\xa1\x63\x59\xdc\x66\x9e\xf1\xe4\xf4\xa7\xd3\xe7\x82\xb5\xe9\xf8\x24\xf9\x62\xc0\x7d\xb9\x6a\x0e\x1b\x55\x7e\xeb\x8e\x25\x36\xea\xab\x4d\x05\x00\x29\x40\x0f\x8c\xb4\x19\xf1\x36\xf9\x67\x1a\xa3\xe6\xac\xb5\x8e\x8c\x71\xb3\xf1\x07\x7a\x04\xd4\x96\xa5\x36\xe4\x7c\x67\xfe\xda\xd7\xb6\x1e\xfa\x10\x20\x75\x68\x61\xff\x5b\xdd\xc8\x0a\xeb\x85\x38\xba\x5a\x21\x45\x12\x15\x5d\x95\x0a\xff\x74\xde\xa1\xed\x7e\x9a\x16\xa1\x19\xf3\x5c\x7f\x12\xda\xab\x3b\xb1\x41\x5f\x80\xf0\xf4\x1e\xfb\xf4\xfb\x00\xb7\x68\x9d\xec\x7e\x55\x17\x4a\x8d\xd0\x94\x8d\xdc\xa5\xe4\x2f\x4c\x0b\x7b\xba\x4e\x1d\xfc\x79\x23\xa5\x1c\x20\xee\xe8\x8f\x5f\x30\x5f\xec\x25\xed\xec\x19\xde\xc7\xa7\x10\x3f\xb8\xea\xb1\xf7\x13\xd5\xc2\xbe\x8f\xfe\x19\x12\x13\x6b\x8e\xbf\x07\x22\x93\x10\x80\xbc\xfc\xcf\x1b\xba\x2e\x2d\x87\xa8\x0f\x6f\xc4\x06\x71\x55\x05\xdd\x5e\x74\x5d\xeb\x1f\x8c\x3b\xc8\x8e\xa3\xb4\xe7\xfe\xf0\x27\xff\xa2\x74\xd8\x39\xd4\xa3\x75\x91\xdd\xf1\x8f\x15\x6e\x24\xaf\x48\xbc\x06\x6a\x6d\x57\x12\x84\xbe\x58\x37\xde\x38\x20\x5c\xf1\x4d\xd4\xd1\x55\x7b\x62\x69\x14\x00\x69\x47\xd4\xe3\x86\xe7\x2e\xa7\x92\xbe\xd2\xd0\x4b\x8e\x12\x0c\x6f\x22\xc9\x4e\xda\x6e\x97\x8c\xab\x12\xa6\xa8\x74\xae\xf3\xf6\x34\xbf\x93\x4e\x0c\x90\x06\x74\xeb\xa8\xe4\x5f\x8a\x27\x57\x1b\x1e\x5f\x29\x15\x3d\x4e\xff\x2a\x95\x72\x98\xa3\xd4\x8e\x99\xf4\xee\x3d\xa7\xe7\x52\xdf\xa7\xe2\xaa\xd4\xf1\x00\xc1\xa3\xc7\xee\x81\x4b\xbe\x71\xd9\x3d\x34\x0f\x35\xa3\xc9\xa8\x1b\x3a\x1f\x5c\x2c\xd5\x21\xcb\x56\x3f\x1a\xbd\x47\x66\xf2\xe9\x07\x39\xdc\x6c\x01\x40\x5e\xa0\x6b\xc1\x61\xb5\x0f\x5f\x74\x7e\x1d\x1f\x9e\x1c\x5c\x51\xfc\xe6\x78\xb1\xf4\x2e\xdd\xa5\x8a\xf3\xd1\x39\xaf\x70\x09\x39\xc9\xaf\x24\x25\xee\x00\xa4\x13\xfd\x78\x7f\x97\x8a\xb9\x48\xe2\xb3\x63\x6d\x6a\xc4\x8f\x03\x93\xc2\x33\xaf\x0e\x55\x1a\xcb\x5d\xde\x0e\x9a\xd5\x53\xf6\x3e\xa3\x78\x16\x7d\x95\xef\xbb\xf1\xd6\xde\x56\x53\xf9\xc9\xa8\x54\x7a\x13\x1d\xee\x7d\x05\xd7\xa3\xe6\xd9\x97\x44\xed\x6d\xac\x82\xba\x4d\xcf\xd2\xf9\xdd\x07\x00\x09\x47\x47\x3c\x8f\x6d\x4e\x87\x24\x25\xb6\xe4\xa7\x54\x1b\x93\xc8\x88\xf5\xa2\x70\xda\xad\xac\x83\x71\xa3\x41\x21\xa4\x24\xe6\xa6\x8d\xa3\x01\x00\xc9\x42\xaf\x67\xe6\xb6\x68\xb2\xa1\x63\x53\x50\x19\xf1\xf2\xc7\xd5\x74\xae\xa2\xbb\x65\x83\x4b\xac\x1d\x87\xf3\x52\x53\x8b\xbb\xfd\xb6\x5b\x58\x00\x40\xbc\xd0\x57\xc4\xa2\x7c\x55\x94\xb3\xf4\x44\xa3\xda\xd6\xf9\x57\xed\x5e\x18\xaa\x9e\xfb\xa9\x52\xc4\xcc\x96\x57\x25\x57\x70\x85\x82\xdb\xfd\x34\x31\x40\x26\xd0\xc9\x2b\xb9\x2d\x28\x75\xeb\x23\x65\x14\x0b\x2d\xd1\x2a\x31\xf5\x20\x59\x93\x92\x61\x00\x0f\x3f\x8f\xfe\xaf\x2c\xbe\x8f\xe1\xe6\x83\xa7\xf1\x40\x9a\x0f\xf5\xf8\xf3\xc6\x7d\x6a\x37\x12\x1c\x6d\xd2\x52\x69\x1c\xdc\xf4\xcd\x0e\xbd\x57\xfe\x30\x7a\xc2\xfe\xce\x24\x1d\xd7\x21\x64\x53\x48\xbe\x19\x20\xe9\xe8\x45\xfa\xce\x70\x57\x7a\xd0\x51\xbc\xb6\x48\x6d\xe9\xc3\x81\xaf\xaf\x8a\xf6\x73\x3b\x85\xd5\x86\x9d\x9f\x7d\x2a\x96\xc2\xd5\xb7\xaf\xe7\x1e\x40\x96\xd1\xfb\x3a\xb7\x34\x4f\xd1\x4d\x35\xcc\xf8\xf4\x91\x2b\xd9\xca\x54\x64\x3a\xd7\xd4\x05\x5b\x18\xc5\x7c\xe6\x4f\x08\x12\x85\xaa\x07\x54\x26\xe0\x00\xf2\x0e\x3d\x9e\x24\x5d\x8c\x1f\x96\xda\xf2\x79\x68\xe5\xde\xfe\xfe\x95\x2f\x69\xb9\xdd\x63\x6b\xdc\x8b\xc2\x7e\x1b\x69\x4d\xe7\x1f\x3d\x31\x4e\x5f\xf0\x00\x01\xe8\x9a\x2a\x35\x76\xe3\xe3\x19\xe7\x73\x7e\x0a\xac\xea\x1b\x82\xbc\xd5\xbe\xc4\x3f\x7f\xcf\x76\xf8\x49\x6a\x88\x94\xbb\xaf\x30\xce\xad\x28\x01\x24\x08\x1d\x9b\x1f\x6f\x73\x90\x5e\x01\x4f\xf9\x34\x2d\x43\xa3\x39\x6a\xd1\x42\x85\x1b\xee\x5e\x8f\xb4\xd9\xbe\xfd\x6c\xa0\x92\x3f\x94\x73\xf8\x04\x40\x3e\xa3\x37\xea\x3b\xd3\x09\x29\xd6\xfc\xe6\x3d\x83\x57\xee\x5c\x8d\x90\x7e\x63\x76\x7b\x58\xce\xca\x3a\xcf\x45\x80\x91\x48\x8f\xbb\x4f\x2f\xe6\x01\x00\xc8\x07\xf4\xca\xce\x77\x38\x72\x9b\x76\xd0\x2b\xea\x34\xb7\xf2\xd1\x8b\xd2\xef\x57\xcd\x30\x29\xe5\xcf\x90\xb6\xcf\x1e\xec\x54\x19\xea\x9e\x7f\x06\x90\xdf\xe8\x12\xfc\xf7\x8c\x6a\x69\xef\xa6\x48\x6b\xbc\xb4\x46\xc3\x33\xd7\x3f\x83\x06\xd7\x19\x06\x05\x5d\x98\x8a\xf5\x6f\x3e\x6b\x96\x97\x13\x34\xd8\x99\x8e\xd1\xc1\x8c\xb5\x6c\x17\xaf\xd3\xdd\xe2\x70\x4c\x52\xb8\x60\x32\x77\x5b\xcc\xe3\x35\xe9\x75\x1e\x69\x7e\xdf\x57\x52\x1c\xc6\x51\x6b\xc6\xb7\xd1\x52\x64\x7a\xe4\x84\xc4\x34\x57\x7b\x33\xd9\x93\x26\xb3\xfd\x0f\x2d\x4c\x2f\xb9\xb1\x04\x50\x1c\x0d\xfc\x69\xf1\x38\x4d\x82\xf9\x87\x08\xba\x08\x90\x25\x69\xbe\xf5\x8b\xe8\x7c\xa8\xbb\x3c\x91\x6c\x9b\x6e\xcc\x24\x9e\xa5\x46\xd1\x71\xeb\x35\x4d\xc1\xf6\x28\x11\xe9\xe9\x1a\xf4\xe5\x0d\xf7\x0b\x3f\xb9\xee\xb8\xfc\x79\xbe\xe1\x53\x58\x96\x40\x29\x97\x31\x3d\x99\xd6\x50\x93\x34\xc7\xc4\xbf\x8a\xef\x3d\x64\x1a\x0b\x00\xe2\x8d\x6e\x02\xaa\x02\x27\xa3\xb5\x4e\xd8\xb0\xd7\x2f\xd7\x94\x64\x1f\x10\x11\x0a\x61\x3b\xe3\xf9\xf8\xc9\x05\x17\xfa\x0e\x26\x2d\x6e\x5d\x87\x4e\x80\x34\xa1\xc3\xfd\xb5\x9e\xc7\xcf\xfc\x4e\x5c\xbe\x5b\xfe\xb0\xfc\x80\x3a\xf5\x69\xca\xfc\xd6\xb5\x72\xbf\xbf\x8c\x8f\x82\x68\x1e\xed\x3f\x61\x8a\xbe\x5f\xa5\x73\x3c\xb1\xfc\xb2\xb9\xf0\x5e\x95\xe6\xed\x83\xba\x61\x2e\x87\xae\x27\x35\x51\x9e\xed\x23\xff\x53\xee\x64\x99\xae\xf0\xc4\x89\x11\x0f\x90\x0c\x74\x03\xd8\x27\x46\xbe\x68\x5e\x5c\xf3\x76\xee\x4e\x4e\xf0\x93\x02\x33\x97\x15\x66\x85\xfe\x6d\x95\xbc\xf5\x4e\xfb\xbb\xfe\xb6\xd7\x3f\xb5\x01\x24\x0b\x3d\x09\x14\x5d\xd4\x91\x24\x57\x96\xf6\xed\xa4\x22\x53\x9c\xa0\xb5\xdc\xff\xe8\xc5\x49\xcd\x34\xeb\xd4\xdc\x24\x7c\xdf\x8b\x07\x6a\x7b\xcd\x01\x92\x8d\x4e\x2b\xc5\x36\xed\x83\xd1\x44\x2f\x1a\x7e\x90\x00\xd5\xf6\x06\x06\x47\x9a\xcb\xef\x5f\x76\x56\x36\x30\xad\x9b\x38\x9c\x70\xa1\x7c\x29\x08\x00\x92\x86\xbe\xbe\xb5\x7a\x86\x9d\x33\xf2\xd8\xbb\xab\x4b\xb4\x0f\x8a\xc2\xb2\x62\x94\x38\x9d\x18\x38\xdf\x85\xab\xcf\x93\x22\x7d\xc3\xce\x09\x33\x43\x00\xa9\x40\x7f\x7c\x20\xdd\x8d\xf2\x32\x0a\x17\x31\x60\x43\x29\x71\x56\xf9\x8d\x8a\xaa\x81\xf8\xc0\xc6\xc6\xa9\x21\xfe\x27\x6c\x8e\x06\xfb\xc3\x7f\xe0\x01\xf2\x0e\x3d\x09\x08\x38\x6d\xb6\x73\x03\xbe\x97\x1b\x1a\x0d\xd7\xb6\x4c\x0e\x04\xd2\x76\x72\x94\xf6\xdf\x96\x4a\xa8\x5e\xce\x18\x15\x49\xe2\xaa\x06\x48\x1b\xfa\xe3\x99\x27\xf2\xb6\xa6\xdf\xd7\x57\xdf\xc0\xbf\xdc\xce\x33\x37\x4c\x76\x20\x6f\x90\x76\xb0\x66\x4b\x77\x13\x97\x0f\xf1\x76\x7c\xd6\x0f\x90\xef\xe8\xde\xfb\xe3\xff\x31\xf6\xdd\xf1\x58\xbe\xef\xfb\x56\x59\x85\x8c\x28\xc9\xaa\x8c\x34\xec\x51\x8a\x1b\x11\x15\x42\xb2\xa5\xb2\x33\x23\x49\x78\x2e\x5b\x64\x67\x8f\xec\x11\xca\x4c\x14\x45\x92\x95\x15\x22\x7b\x64\x93\xac\xcc\xdf\xcb\xfb\xf7\x7d\x2e\xf7\xe7\xaf\xbb\xff\xaf\xe3\xb9\xcf\xeb\xbc\xc6\x79\x1c\xe7\x79\x3e\xf7\xfd\xfd\x9e\xa2\xc4\xa1\xdb\x85\x0c\xdc\x83\x03\xbe\xcf\x3d\xcf\x92\x24\x2a\x7a\x6b\x1b\x54\x04\xea\x25\xbc\xef\x70\xa3\xf5\x5b\x02\x00\xe9\x43\xef\x5a\x91\x0e\x87\xa4\xdb\x7e\x13\x06\x9e\xd5\x8e\x5e\xc4\xfb\xac\x78\x6f\x38\x64\x3b\x3e\xf7\x7f\x99\x5e\xc2\xcb\xe4\xc1\xc3\xdc\x40\x08\x90\x15\xf4\xcf\xcb\xdc\x38\x96\x4d\x76\x75\xab\xf5\xd4\xea\xfd\x28\xce\xe2\x2b\xad\x7e\x56\x0b\xa1\xb7\x7f\x36\xb4\x86\x8e\xe8\x9b\xf8\x12\x7d\x89\xf7\x00\x48\x00\x7a\x8f\x95\xcc\xe9\x89\x3d\x9e\x58\x7b\x9f\x96\xc3\xab\x63\x98\xa6\x78\xfc\xcf\x29\x91\xbf\x56\x79\x2e\x73\xa2\x63\x6b\x3b\x0c\xae\x53\xd4\x00\xf9\x85\x76\xfd\xf0\xf2\x77\x0b\xbe\xcd\xa8\x5b\x7d\xaf\x39\xaf\xc7\x69\x2c\xee\x94\xfa\xdf\x09\x31\x12\x7d\x44\xe4\xfb\xd6\x47\x73\x9f\xea\x4b\x39\x80\xac\xa1\x87\xdf\xb5\xfa\x23\x2b\x48\x79\x4f\xff\xc4\xf5\xb5\xdf\xd5\x31\x9b\x76\xb2\x74\x6d\x2c\xad\x59\xc7\xa9\xfc\x4c\xde\x18\x11\x9b\x68\xe7\x01\x80\xfc\x44\x67\x1e\x18\xcf\x66\xd3\x59\x94\x17\x34\xf5\xd2\xb3\xde\x64\x38\xdf\xb3\xac\xb4\x91\xde\x56\x7d\x4b\x3a\x52\xec\xf8\x6d\x16\x32\x93\x89\x3f\x00\x59\x45\x6f\xcb\xbb\xf4\xa2\xd5\x6f\x92\xd6\xca\xae\xd0\x28\xe5\x7f\xa1\x93\x0b\xcf\xd9\x4c\x54\x64\x56\xa8\x73\xfc\x72\x60\xcb\xc4\xb4\xf2\x06\x3a\x28\x5d\x29\x13\x39\xa6\xbc\x51\x17\x6c\xed\xd1\xa3\xd5\x22\x77\xd8\xa2\xed\x86\xaa\xd3\x35\xf1\xe3\x36\x23\xcc\xab\x16\xc3\xda\x82\xef\x01\x40\xaa\xd0\x77\xd1\xf9\xe3\x72\x34\xb2\x09\x2b\x06\xdf\x06\x3e\xd2\x68\xe4\x95\x05\x9c\xde\xd2\x11\x6b\x5a\xe9\x62\xe1\x70\x1c\xa2\x76\xfe\xac\x58\x0f\x90\x1e\x74\x73\x45\x03\x75\x5e\xbf\xcc\x44\x7f\x7e\x85\xd4\xd7\xdf\xc2\xbf\x8f\xa6\x4d\x77\x2b\x38\x1a\x6d\xcf\x9e\x20\x2c\x33\xfe\x9e\x9b\xef\xef\xe0\x01\x10\x6f\xf4\xf8\x89\x60\xd3\x44\xff\xf3\xf2\x57\x08\xdf\xce\x6f\x0c\xb0\x66\x0a\x78\x98\xdd\x0d\x66\x8a\x61\x0e\xe7\xdf\x90\xd3\xaf\x3e\x1f\xb1\x09\x90\x3c\x74\x88\x0c\x49\x8f\x5a\xfb\x71\x4c\xdf\x41\x99\x9c\x74\xf9\xd4\xb5\x57\xed\x35\x84\xdf\x46\x1d\x01\x73\xd4\x76\x72\x6c\x62\x30\xb3\x54\x34\x40\xba\xd1\x09\x1f\x1d\x39\xfa\x4a\x8d\xaa\xec\xcf\x57\xe2\x4b\xe9\xe7\x7a\x9e\xb3\x73\xb2\x9f\xa1\xda\x5a\x73\x5b\x6d\xf1\x37\xe8\x28\x8e\x94\x75\x12\xf8\x47\x39\x20\x43\xf3\xff\xa5\x47\x28\xfc\x17\x04\xa6\x24\xc0\x43\x5e\xc3\x04\x35\x96\x2c\x80\x90\x7e\x98\xa0\xc6\x54\x06\x78\xc8\x9b\xbd\xf2\x29\x96\x3a\xc0\x43\x0a\xf6\xea\x87\x18\x0a\x01\x42\xba\x60\x2a\x03\x53\x24\xe0\x21\xa5\xb0\x76\x83\x29\x14\xf0\x90\x46\x28\x3c\xb1\xc4\x02\x84\xcc\xc3\x74\x33\xa6\x5e\xc0\x43\x3c\x21\x04\x53\x33\xe0\x21\x41\xd0\xc9\x58\xba\x01\x42\x7a\x61\x26\x07\x53\x3a\xe0\x21\x39\xd0\xc9\x98\xf2\x01\x3a\x19\x26\xb2\xb0\x24\x04\x84\xd4\xc1\x44\x16\xa6\x8a\x80\x1e\x83\x15\x57\x4c\x25\x81\x87\x78\xc1\xa7\x60\xa9\x89\x3d\x27\x53\xc2\xbe\x44\x4c\x59\x21\xe3\x49\x23\xe5\x89\x03\xc8\x12\xfa\x2e\xfc\xfd\x69\xce\xba\x62\xe0\xa3\xfc\x83\x26\xf1\xc6\x4d\xfd\x43\x9a\x94\xdd\x4e\x14\xc1\x03\xb7\xfd\x9a\x89\x3c\x45\xf8\x7f\xe6\x2d\xe0\x00\xf2\x12\x1d\xa3\x4f\x32\xdf\xda\xf2\xd7\x7d\xc6\x79\xae\x8f\x58\xa2\x3e\x8e\xc6\x21\x33\xf2\xd1\x70\xea\x93\x53\xcc\x7c\xfe\xe4\x17\x4d\x94\x99\x2a\x70\x00\x89\x41\x5f\xcd\xdf\xaf\x14\xb1\x93\x8c\x7b\x54\x7d\x92\xaf\xb1\x7b\xbf\x76\xab\x6c\x36\x59\xce\x3c\xa2\xbb\x81\xc4\x4b\xf9\x6b\xa4\xcb\xef\xae\x27\x38\x80\xa4\xa2\xa9\xe5\x3e\x7b\xe5\xeb\x2c\xa1\x7d\xbf\x17\x3e\x95\x85\x8e\x3a\xf8\x94\xba\x29\x44\x89\x76\x68\x47\x52\x2f\x9d\xd3\xb6\x9b\xa6\xb7\xc3\x7f\xfb\x17\xcb\x6c\xe8\xa0\x25\xb8\x3f\xb0\x2c\x87\x90\x97\xf0\x42\xc1\x32\x1e\x42\x62\x60\x9e\x17\xcb\x7e\x08\x49\x85\x45\x32\x4c\x81\xf7\x7f\x10\xe9\xc7\xf8\x87\x60\x69\xbc\xbd\xcb\x01\x66\xd8\x30\x65\x1e\x1e\xe2\x01\xab\x13\x98\x52\x0f\x0f\xf1\x86\xf7\x3c\x96\xdc\x83\x90\x4e\x52\x98\x80\xc5\xd4\x7d\x32\x34\xb2\xff\xbd\x66\x22\x0a\x2d\x2c\x35\x26\xba\x37\xea\xd8\x65\xcf\x33\x9f\xfb\x15\x6b\x17\x38\xdf\xa6\x53\x97\x62\xf3\xd0\xf5\xa5\xf8\xdb\xe3\xa5\x91\xa1\xb3\x4e\x67\x70\x40\x5a\x03\x35\x9c\xc8\x8c\x7c\xdb\x25\xfe\x46\xff\x96\xe6\xbd\x76\x8e\x3f\x9b\x0a\xd4\x2f\x4c\xfa\x8e\xbf\xcb\xb4\x3d\x74\xf7\x84\x7b\xc0\x97\x43\xbb\x8a\xa8\x11\xcd\xce\x4e\x09\xad\x7e\xb5\xab\xec\xcc\xcc\x8b\x3c\xbf\xe8\x7f\xf2\xa9\xfb\x1b\x13\x05\x86\xcf\x3e\x3f\x97\x1b\xa8\xbc\xab\xd2\x6d\xc5\x38\x70\x00\xf9\x82\xce\x79\x85\xe5\x0b\xfc\xcc\x88\x31\xbd\x4c\x90\xb2\x2c\x1a\xcc\xb6\x56\x39\x24\x53\x3a\xad\xc6\xa4\x33\xa3\xa1\x12\x1e\xf9\x42\x9f\xa3\x54\xe0\xdf\xac\x86\xfe\x89\x22\xc5\xef\x0e\x2c\xcb\xe1\xee\xd0\x80\x7f\x15\xc6\xb0\x7d\x6f\x77\xc0\x8b\x10\xcb\x7c\x08\xf9\x02\xe3\x33\xa6\xfc\xc6\x43\x62\x61\x2e\x19\x53\x82\xc3\xf8\x0c\x2f\x42\x4c\x15\x8e\x87\xf8\xc1\xc6\x3c\x2c\x25\x0e\x21\xe3\xf0\x43\x38\x98\x6a\x1c\xef\xe3\xd3\xf8\x87\x60\x0a\x72\xfc\x43\x72\xe1\x71\xc2\x12\xe5\x10\xb2\x02\x03\x27\x96\x2e\x87\x90\x78\x98\x7c\xc7\x94\xe6\x78\x08\x80\x84\x06\x53\x9e\x43\x3e\xb7\xf7\x97\x7f\x2c\x89\x0e\xf7\x0b\x8c\x82\x98\x2a\x1d\x0f\xc9\x87\x8b\x8f\xa5\xd4\x21\x64\x01\x72\x20\x2c\xb1\x0e\x21\xc5\xe4\xb0\x7e\x8e\xa5\xda\x81\x2c\x19\x09\x19\xd1\xee\x0d\xe4\x89\x26\xd7\x66\xf4\x1f\xa4\xe9\x14\x67\xac\x7b\xed\xbb\x5a\x26\x12\xbb\xe8\xaa\x8d\xf9\x0d\x9b\x4f\xec\x0f\xc9\x8d\x3d\x79\xb0\x22\xeb\xe8\x77\x1c\x40\x6a\xd0\x89\x39\xce\x84\xae\xfc\xe2\xfb\xf7\xf5\xfd\xa4\xfe\xdc\x7a\x7b\xe9\xc5\xaf\x02\x13\x8d\x5b\x66\xfe\xc6\xc6\x77\x39\x89\xa8\x0e\x5b\x2c\x86\xee\xfe\x3e\x7a\xbc\xca\x15\x11\x11\xc7\xd3\x44\xf9\xfe\x5a\x77\xfd\x44\xc6\x73\x43\x18\x92\x9f\x3c\x7f\x50\x38\xab\x79\xc7\x98\xe1\xdd\x63\x3f\x99\x94\xdd\x8b\x17\x1d\x69\x63\xbb\xce\xb8\x78\xd3\x5d\xa7\x9a\x0a\x35\x23\x51\xf9\xd0\xc7\x45\xdc\xf8\x6e\xc5\xeb\xc5\xb7\x50\x9e\xb0\x0e\x8d\x17\x3f\x5b\x2e\x08\xfc\x9b\xd9\x7b\x04\x06\x9e\x5b\x2c\xcb\x21\xa4\x06\x86\x1b\x2c\xe3\xf7\x9e\x02\x21\x58\xf6\xef\x85\x9b\x7d\x70\xe9\xb0\xb2\x28\x40\x96\x82\x8c\xe0\xbf\xb7\x64\xad\xa2\x6f\x6b\x5a\xb5\x1c\xcf\xf1\xf3\xef\x04\xe2\x97\x1f\xdb\x5c\x66\x3c\x3d\x71\x59\xec\x62\x6f\xe9\x97\xc5\x1e\x72\x7f\xe1\xd2\x56\x36\x8f\x60\x1c\x40\x66\xd1\x62\x9a\xeb\x0d\x0b\x6b\xd0\x77\x4b\x4e\x61\x92\x70\xb2\xac\x97\x5e\xaf\x22\xce\x36\xb4\x70\x69\xbb\x6d\x47\x96\x04\x3c\xb0\x1f\xbf\x30\x80\x03\x48\x38\x9a\xc4\xe8\x85\xb9\x8d\x04\xca\xc5\x13\xf4\x64\xe4\x39\xc8\x9e\x5e\x57\x72\x16\xcb\xac\xee\x10\x0d\x62\xcd\xf9\x70\x2d\x5f\xc5\x68\x99\x11\x07\x90\x7a\xf4\xf8\x65\x16\xd6\x72\xd3\xbe\x2c\xb7\xe9\x60\x12\xa3\xd9\xf0\xef\x8e\xb3\xae\x8e\x6d\xad\xcf\xe9\x8f\xbf\x19\x97\xf1\x0a\x18\x75\x4b\x10\xf8\x37\xb3\xa1\x87\x56\xe1\x2d\x8d\x65\x39\x84\xcc\xc2\x4b\x07\xcb\x78\x08\x09\x87\x37\x08\x96\xfd\x10\x52\xbf\x7f\x25\x80\xe4\x1f\xb3\x5a\xb2\x0a\x77\x68\xcf\xfb\xe1\x00\x52\x81\xe6\xab\x93\xbf\x5a\x66\x19\x8f\x3c\x1d\xf8\x12\x53\x34\xfe\xfc\x58\xc9\x90\x79\x13\x8d\x8a\x1d\x30\x57\x1b\x2a\xff\xae\xcd\x9c\xed\xd6\x80\x03\xc8\x77\x74\x6a\xd3\x96\x54\xee\xa1\xcc\x54\x86\x57\xe0\xa9\x6b\x99\x9e\x7d\x33\xa2\x5e\x11\x53\x42\xfb\xaf\xef\xd3\x93\xc8\xc4\xe9\xbd\x96\xfe\x76\x07\x07\x90\x9f\xe8\x53\xc7\x6b\xea\xdc\x26\x71\xff\x76\x24\x13\x9b\x2d\x6d\x6e\x0d\xcb\xc5\xb7\xb4\xb9\x26\xe9\x4a\xd6\xc7\x45\xaa\xb3\x04\xbf\x7c\x98\xa5\xc2\x01\x24\x0b\x4d\x14\x6a\x74\x44\x84\x08\x22\xd7\x14\x66\xcd\xa9\x6b\x88\x0b\x8c\xc2\xb6\x8c\xf5\xd4\x54\xdb\x37\x22\x35\xb6\x93\xb4\x2c\xb3\xaa\x7f\xee\x86\x26\x74\x6a\xe3\x68\xe0\xed\x87\x49\x47\xee\xf2\x10\x69\x52\x0d\x8b\xbc\xf5\x7f\xfd\x94\x8b\xa6\xe4\xf4\x95\xab\x1b\x6f\x86\xab\x70\x1b\x29\x1a\xbb\x5b\x6f\x1e\x9d\x9d\x5b\x79\xa2\x5a\xce\x5f\x96\x25\xab\xe5\x2f\xb9\x9f\x9a\xda\xf5\xd6\x50\x43\xba\x80\xc9\xb3\x1c\xda\x96\x99\xed\x65\x7a\xf2\xcc\x5e\x00\x90\xaf\x68\x7e\xfe\xf5\xcd\xc7\x02\xe7\xa8\xa3\x06\xdb\xed\x02\xa3\x1a\x9f\xc5\x0c\xc4\x54\x48\x48\xdf\xf1\xed\xa8\x9c\x88\x60\x7d\xfe\xf5\x91\x7a\x35\x40\x3a\xd1\x89\xe5\x78\xc6\x10\x84\x8e\xb9\xf2\xa1\xf5\x17\xd6\xce\x86\x7b\x43\x9e\x44\x76\x87\xfb\xaf\x5f\xac\x90\x8d\xb6\x13\xb3\xa5\xf5\xfb\x95\x81\x03\x88\x3f\x9a\x76\xb5\x2c\x5d\xf8\xed\xf9\x43\xdc\x22\x97\x67\xc5\x2f\x67\xd9\xd5\x84\x93\x79\x47\x69\xdb\x89\x4a\xc4\xa6\xd9\x85\xf4\xd3\x7a\xfe\xe4\xee\x74\xd1\xcb\xb5\xbc\x26\x28\xfa\xf8\x73\x1a\xf5\xaf\x6f\x5f\x1a\x68\x0b\x9b\x86\x3c\x07\x47\xbe\xdc\xd0\xbb\x8a\x2b\xa6\x1a\x75\x58\x20\x8b\x3d\x25\xf0\x6f\xab\x0a\x37\x50\x05\xa4\xf3\x58\x0b\x0b\x21\xdf\x61\x6c\xc4\x5a\x5b\x08\xf9\x09\x2f\x25\xac\xe5\x85\x90\x2c\x18\x1b\xb1\x56\x78\x8f\xb2\xc0\xde\x32\xcc\x45\x86\xca\x1d\x86\x53\xcc\x75\xc6\x43\xbe\x42\x35\x83\xb5\xd6\x7b\xe4\x1c\x72\x16\xac\xe5\x86\x10\x7f\x28\x01\xb0\x56\x7c\x6f\xfa\x70\x29\x31\x13\xd6\xf0\x29\x30\x0b\x81\x95\xb4\x86\x90\x6f\x07\xa0\x40\xc6\xca\x5e\x03\x19\x0a\xa9\xff\x62\xc5\x4f\x74\x52\x2c\x85\x0d\x37\x66\xb5\xfc\x33\xfe\xf0\x59\x3f\xcf\x27\xbf\x92\x39\xd3\xba\xa6\x2d\xf5\xfe\xac\x8e\xb8\xdc\x7a\x77\xda\x2b\xbe\x85\x01\x07\x90\x08\xf4\x89\xa2\x13\xc7\x75\xfc\xf0\x4c\xb4\x0f\xb4\x5b\xed\x96\xb4\x38\xef\x52\xbc\xe6\xff\x98\xcb\x75\x8a\x9c\x7a\x52\x5d\x64\x69\x6e\x27\x77\x97\xdc\xa3\x33\xaf\x11\xca\xf5\x74\x62\xc4\x4b\x3f\xce\x17\x4d\xab\xdd\x3d\xfc\x84\x2f\xd9\xe1\x69\xc0\xed\x88\x17\x0b\xb9\x05\x64\xb1\x4c\xa5\x88\x36\x0e\x20\x0d\xe8\x30\xcf\x1b\x4d\x74\xe4\x21\xaf\xf6\xdc\x2c\x89\x56\xa7\xe3\xe3\xaf\xef\x22\x1f\xb1\x87\x5e\x38\xd8\xe9\x71\x55\xdb\x55\xe3\xc1\x66\x51\x9f\xc0\xbf\x99\xbd\xb7\xd7\x61\x17\x02\x96\xe5\x10\x12\x01\xf7\x07\x96\xf1\x7b\x7a\x06\x66\x76\xb0\xec\x87\x90\x06\xa8\xa9\x31\xcb\x08\x78\x48\x1e\xdc\x52\x98\xa5\x04\x28\x35\xe0\xf1\xc0\x2c\x27\xc0\x54\x20\x3c\xea\x98\x15\x05\x98\xa5\x82\x47\x1d\xab\xaa\x00\x21\x95\xf0\x29\x98\x85\x05\xa8\x02\x60\xf6\x10\xb3\xb8\x80\x87\xb4\xc3\xa7\x60\x16\x18\xf0\x90\x3e\xb8\x94\x98\x35\x06\x08\x81\xe4\x02\xab\xce\xb0\x27\x82\xe0\x53\x30\x4b\x0d\x78\x48\x00\xbc\x1d\x30\xcb\x0d\x78\xc8\x2f\xb8\x2e\x98\x25\x07\x3c\x64\x0d\x42\x30\xab\x0e\xf0\x88\xc1\x9d\x8c\x55\x79\xd8\x63\x70\x7b\x7f\x8b\xc0\x2c\x41\xc8\x1e\x24\x20\xf9\xaf\x7b\xb3\x1f\xcd\x29\xab\x6e\x32\xdc\x10\xfd\x79\x61\xe4\xef\xca\xab\x87\x7a\x9a\x7a\x9c\xbd\xb1\x05\x26\x7c\xe9\xa3\xcc\x12\x3d\xd2\x04\x76\x47\x26\x4f\xe0\x00\x92\x8c\x8e\xec\xe1\x36\x21\x77\x85\x1e\xd6\x0c\x47\x66\x09\x1a\xd9\x53\xe6\xaf\x8e\x11\x96\x24\xe6\x31\xed\x70\xc4\xd5\xa6\x9f\x24\x3b\x33\x78\x08\x07\x90\x51\xf4\x3d\xa4\x21\x5d\xc7\xe4\xd4\x62\xdd\x9d\x2a\xb5\x50\xab\xe8\xc5\x73\xbf\x43\xa1\x3d\x4b\xb5\x2b\xf1\x52\x4b\x7e\x6a\x2a\x9d\xbc\xa1\xd1\xee\x82\xa0\x7f\x5f\x70\xb2\x03\x71\xcd\xb7\xf2\xe8\xf3\x27\x7f\xf5\x4b\xd0\x9d\x3b\xa3\xa4\xb5\x4a\x6a\x5e\x95\x46\x37\x7e\x2e\xc3\x5c\x40\xe5\x0c\x0e\x20\x9b\x68\x79\x45\x39\xca\xdf\x9e\x11\x26\x52\xdf\x96\x24\x50\x39\xcd\xaf\x16\xad\x47\x46\x3c\xe7\xf5\xc0\x76\xce\x6f\xf3\xa9\x99\xb7\x6f\x81\xaf\xc0\xbf\x4d\x73\xaf\x4c\x00\xd9\x2a\xd6\x4c\x21\x24\x19\x06\x35\xac\xc9\x42\xc8\x28\x5c\x6a\xac\xf9\xee\x6d\x5b\xf8\x14\xac\x29\x43\xc8\x26\x94\x66\x98\xf5\x26\x3c\xa4\x0a\xaa\x6a\xac\x9a\x13\x84\xf4\xc0\x66\x33\xcc\xb2\x13\x94\x66\x10\x82\x59\x7a\x82\x77\x36\x9c\x0b\x56\xf9\x09\x42\xba\x19\x56\x00\xfd\xff\xc7\x9c\x49\x27\xce\x50\x77\x0a\xd0\xfb\xfd\x70\x71\x48\x82\xaf\xb9\x9a\x34\xb1\xa7\x4e\xeb\xec\x35\x05\x57\x15\xab\xf3\xd1\x7c\x47\x13\x81\xec\xd6\xce\xce\x4e\x14\x2b\x6a\x63\x29\x44\x52\x9c\x1c\x74\xc9\x1a\xac\xe4\xdc\x3a\xf0\xa3\xd9\xc4\x88\x11\xc9\xf0\x9f\x36\x2a\x9f\x18\xde\x88\xf1\xeb\x37\x22\x5f\xf0\x00\xc8\x5b\x34\x01\x50\x70\x4d\xe2\x3f\xb9\xa6\xb8\x15\x81\x78\x72\xad\x84\x25\xbf\xb3\x32\x22\x59\xa3\x23\x8d\x3c\xfa\x64\x78\x39\x98\x42\x95\x32\x18\x20\x3f\xd1\xe7\x8e\x3c\xfa\x8e\xf5\xad\xce\xe4\x3b\x0f\xd9\x8c\xfc\xbd\xf4\xe9\xcb\xca\x14\x2d\xb3\x9f\x77\x8d\x26\x5a\x6b\x48\x30\x89\xb4\xad\x9f\x07\xc8\x28\x5a\x5a\xbe\xcb\x3f\xfd\xae\xee\x91\x43\xd4\x95\x22\x9d\x0a\x1a\x4e\xf9\x86\xd1\xbf\x5d\x55\xfb\xad\x3e\x95\x67\x08\xd5\xa6\xbf\x0c\xb9\x82\x2e\xfe\x71\xbb\xd5\xc7\x9f\x88\xf7\x7a\x19\x30\xae\x6f\x14\xc1\x5a\x97\x42\xb9\x5c\x75\xe8\xee\xd8\x76\x60\x6d\x82\xd1\xe2\xad\x65\x35\x01\x74\xdf\x58\x75\x5d\x4f\x3d\x65\xe6\x27\x59\xf5\x82\x6b\x5a\xc7\xcd\x5f\x7f\x6a\x68\x88\x3f\x1e\x30\xf2\x8c\x11\x09\x6b\xa5\xf4\x18\x3d\x07\x80\xb4\x2e\xba\x53\x5a\xe2\x4f\xf6\xa0\xc1\xe1\xc8\xcf\x89\xa6\x03\xa7\xff\x0e\x30\x09\x0e\x65\xb5\x25\x16\x3c\x95\x59\xf9\x78\xe8\x42\x2d\xaf\xb9\x08\x40\xea\xd0\x9a\x6a\x42\x35\xf8\x92\x17\xe0\xcf\x96\xc2\xd1\x2e\x9f\xd2\x57\x6c\x16\x1d\x51\xec\xe0\x5e\x48\x49\x3c\x22\x7e\x9f\xc0\x6d\x7b\x4d\x04\x00\x24\x15\xdd\x71\x41\xbe\xc0\x3d\xa2\x96\x41\x23\x9f\xcb\x72\xeb\x9a\x72\x55\xce\xcb\x30\xe4\x8c\xc2\x3e\xb9\xeb\x1c\x47\xae\xe4\x12\xad\x7d\xb3\xba\x05\x90\x4c\xb4\x44\xe2\x36\xf9\x48\x78\xc7\xa2\xa1\xfb\x7e\x87\xbf\xaf\x71\xf7\xd7\xe5\xb8\x79\xa9\x23\x8f\xb2\x8f\x39\x78\x0a\x5f\x91\x5f\x7c\xfd\x02\xfd\x79\xe2\x2a\x4a\x37\xe7\xc3\x7c\x8d\x3f\xd6\x45\x79\xe4\x99\x39\xb7\xb2\x1e\x2a\x1d\x3f\x7e\xf9\x98\xed\xcb\xc4\xee\xf2\x73\xcc\x01\x42\x07\x3d\x80\xb4\x1c\x6a\xf8\xd3\xce\x81\xf3\x5b\x61\xed\x15\xe6\x14\xdd\x35\x31\xb5\x7d\xd2\x87\xda\x87\xb7\x5b\x99\x59\x33\xe4\x9d\xee\xd9\x36\x98\x1e\xf6\x07\x88\x17\x5a\x0b\x1e\x2e\x16\x3f\xa8\xf3\xc1\x94\x41\x9f\x98\x30\xef\x77\x2a\x42\xa6\xc5\x57\x21\xb9\xf5\x97\x68\xe5\x21\x52\x7a\xac\x28\x5b\x69\x08\x20\x2d\xe8\xda\x6f\xff\x56\x47\x57\xd5\x49\xf7\xf5\xdb\x4f\x15\xc2\xac\xcb\xf3\xb3\x27\x2b\x6f\x16\xc4\x2a\xa4\x36\x1d\x22\x1b\xb7\x77\x8b\x79\x5a\x0b\x00\x92\x80\x96\x6a\x0c\xec\xb2\xf2\x0a\xab\x4f\x5f\x12\x3f\x7b\x2b\xa2\x1c\x30\xf3\xc1\xe9\x3a\x97\x30\x4d\xe2\x4c\x3e\x53\x1f\x47\xcf\x2d\x91\x8e\xf3\x00\x79\x89\xee\x2f\xb0\x2e\xf5\x9c\x60\x49\xd1\xd9\x57\x79\x29\xc9\xe6\xf2\x28\x27\xe1\x9d\x84\x96\x28\x51\xeb\xd4\xe2\x5f\xfb\xde\x1c\x8d\x11\x70\x7a\x8d\x1a\xfa\xc4\xe1\x69\xfc\xfb\x52\xdc\x87\xcb\xb9\x0e\xd9\xa1\x61\x12\xa7\xce\x3b\x3d\x2e\xd3\x0d\xff\xc5\x38\x93\x49\x67\xa3\xe8\xce\x75\xcb\x03\x48\x9b\xa2\x86\x87\xde\xe9\x2c\x6f\x3b\x4b\x79\xf1\x66\xe3\x05\x2a\x4d\x67\xa4\x3d\xcb\xf8\xf4\x53\x39\xee\xb2\x5b\x5e\x49\xaa\x49\x41\xaa\xce\x11\x00\x09\x43\xd7\xfe\x6b\xb2\xc4\xca\x4d\xf2\x4d\xf6\x21\xf7\x09\xe3\x85\xc2\xd9\x7e\x1a\x27\x7b\x13\x17\xc6\xd5\x13\xdf\xf1\x52\xb0\xa8\x0f\xff\x79\x00\x20\xa3\xe8\xe5\x0c\x9b\xcb\x2d\x5a\xca\xc8\x7e\x3d\xc3\x66\x7d\xe9\x84\xa7\xc0\x2b\x9b\x31\x92\x8f\x7f\x74\xa4\x4f\xca\xf9\x4c\x27\xe7\x67\x2d\x0b\xe2\x00\xd2\x86\x1e\x7f\x2b\xba\xfd\xd2\x11\x69\xdf\x67\x86\x3a\x21\xb7\x59\xef\xdd\x8d\xa1\x6a\x75\x88\x74\x14\x76\x58\x7c\xf3\xe3\xaf\xdf\x92\xeb\x5b\x61\x0f\x80\xe4\xa3\x09\xb7\xcb\x29\xfb\x7c\x5a\xb6\x8f\xc7\x32\x32\x38\x90\xad\xf6\xca\xe6\x23\xca\x1c\xb5\xba\x14\x79\xc6\x61\x47\xc6\xf8\x97\xc2\xf7\xff\x05\xc8\x7b\xb4\xa0\x6e\x39\xe6\x4c\xc1\x1b\x63\x19\x66\x77\x6f\xed\xba\x99\x85\xe0\xb2\x73\x64\xb8\xab\xdb\xa7\x6e\x35\xa5\x37\x85\x7f\x98\x7e\xa6\xd3\x00\xa4\x11\xbd\xd7\x5d\x8f\x2d\x31\x92\x7c\x09\x61\xff\x94\x49\x47\x2d\x4a\x2d\x49\x95\xe4\x78\xc5\xf2\xa0\x4f\x13\x61\xab\x11\xd9\x13\x13\x9d\x24\x26\x0f\x80\xf8\xa2\xcf\xf3\xe5\x21\x7b\xd2\xaf\x22\x87\x64\xe6\xcb\xbe\x06\xf7\xfb\x2a\x35\x19\x9f\xba\xd2\x30\x64\xed\xef\x2b\xef\x5e\xcb\x2d\x2f\x7e\xfe\x03\x40\x92\xd1\xe9\x83\xd3\x36\x3b\xf6\x2c\x37\xf6\x9b\x1c\xac\x70\xf6\x14\xe3\x5e\x4a\x42\xf8\x87\x16\xa9\xe3\x27\xbb\xef\xdf\x39\x44\xdb\xf6\x67\xaa\x0a\x20\x7d\x68\x6b\x80\xd7\xec\x16\xa9\xd8\x20\xdb\x11\xde\x4f\x35\x0a\x3c\xee\x54\xde\xc3\x87\x84\x94\xae\x9b\xe9\x93\x5e\xe5\x6d\x7d\x99\xcf\x8c\x36\x44\x82\x89\xeb\xc6\xbe\xa3\x29\xf9\xa5\x45\x57\x0f\x94\x3d\x89\x34\xe6\x7f\xe5\xc3\x46\x12\x19\x3d\x5b\xa0\x2f\x61\xe6\x3a\x7a\xfb\xbf\xbf\x88\xa0\x6f\x17\x41\xc1\x5b\x46\xa9\xc9\xa3\x7c\x7c\x63\x36\x3a\x17\x0f\x7f\x7a\x63\x6c\x52\x91\x31\xde\x9c\xad\xff\xc7\x91\xc7\xbe\xf0\xef\x59\x4f\x00\x10\x1c\x7a\x99\x7e\x9d\x3a\xae\xf5\x4e\x98\x4b\x28\x82\x5b\x3e\x64\x6d\x5b\xee\xb3\xf0\x76\xf5\x23\xa2\xa1\x0b\xa9\xac\x97\xad\x95\xa6\x57\x43\x6b\x00\xb2\x89\xde\x34\x6d\x95\x43\x14\x53\x9b\xb1\x93\x4e\x81\x3b\x99\x97\x3b\xed\x1e\x9b\xd2\x53\xec\x80\xcc\xd4\x68\x81\x74\x75\xb5\x45\xd3\x69\x16\x74\x0f\x05\x73\xa2\xad\xba\xea\xbe\x93\x5e\x35\x2e\x1c\x9d\x22\x84\x5e\x21\x75\xf2\x0e\x96\xea\xfb\x8b\xbc\xb5\x78\xde\x23\x27\x9d\x25\x51\x43\xbd\x64\xad\xe7\x6e\x26\xcd\xb4\x0d\xc5\xea\xa9\x2d\xa4\xf2\xad\xee\x38\x7f\xbe\x60\x74\xc9\x28\x33\xe7\x71\x98\x33\x1d\xfb\xfd\x16\x1c\x40\xb6\xff\xe7\x7d\xd5\x2e\x3a\xbc\xae\x89\x06\xe5\x2d\xdb\xeb\xa3\x3e\xbd\xfd\x9c\x11\x5a\x2a\x65\x4f\xd9\x1f\xf7\x05\x57\x0d\xf7\xa5\xfe\x39\x6d\x8b\x03\x48\x26\xfa\xee\x7f\x58\x79\xdf\x96\xfd\x7c\x99\xf8\x83\x55\x95\x3b\xf3\x8a\xb3\x8a\x74\x96\xda\x39\xba\xe5\xac\x07\x43\xb5\x5c\x96\xea\x9d\xda\xf4\x50\x43\x9f\x1f\x5d\xb1\x97\xf3\xbc\x71\x50\xdc\x32\x2d\x01\xc7\xc8\xcb\x12\xe8\x4a\x35\xb8\xe2\x5b\x10\x2f\x67\xe2\x1e\x05\xd6\xcf\x53\x01\x80\xf8\xa2\x73\x90\x7f\xd2\xbe\xa6\xbe\x8d\x37\xcc\x10\x8e\x35\x36\xa6\xf6\xe4\x1b\x14\xaa\x6c\x15\xeb\x8d\x7f\x70\xc8\xf4\xf0\x13\x02\x2e\x8b\xcb\x9e\x00\x99\x45\x2f\x8f\x76\xd1\xc3\xb1\xaa\x18\xfa\x5b\xcd\x4f\x75\xe2\x09\xf7\xe9\x77\x16\x39\x36\xf7\x9c\x65\x21\x5b\x31\xfb\x58\x2c\x27\xca\x6f\xcb\xeb\x01\x90\x57\xe8\x30\xd4\xe3\x39\x1f\xb1\x39\x7a\x4e\x9f\x3b\x93\xe5\xed\xc8\x73\xaf\x5f\x95\x3d\x04\x72\x89\x84\xed\xa4\xbf\xec\x64\x8a\x52\x5f\x5e\x09\x01\xc8\x24\x7a\x79\x08\xc3\xdd\xb6\x95\xfc\xee\xfb\xf0\xa8\x07\xe5\xbd\x11\xf7\x96\x55\xff\x56\x66\x4c\xc7\x54\xed\xf5\xeb\xa8\xca\x17\x83\x27\x81\x71\x00\x99\x42\xa7\x75\x9a\x78\xc7\x82\xb4\x8b\xeb\xb5\xcf\x37\x74\xd4\xa4\xf0\xd6\x4c\x79\x8d\xbc\x88\x34\x7b\x3a\xa7\x4e\xad\xef\xf6\x6d\x7d\xa2\xf0\xb6\x07\x40\xbc\xd0\x7e\xf7\x21\x5f\x15\x2b\xab\x11\x99\x3d\x03\xb6\xaa\x8a\x9f\xf3\x9b\x49\x6d\x93\x17\x08\x6f\xdd\xfb\x95\x69\x44\xe0\xd6\x61\x9f\x91\x05\x90\x65\xf4\xcd\xf8\x02\xa1\xbb\xeb\xf4\xe5\x1d\xcb\xe3\x8c\x43\x8f\x68\xbe\x1d\x37\x77\x65\x09\x9d\x7c\xab\xf4\xf5\x88\x6b\x7e\xaa\x7a\xf4\x46\x19\x15\x40\xd6\xff\xa7\x2b\xc6\x5b\xb1\xa8\x45\x61\x27\x71\xc2\xf7\xfb\xd9\xa8\x00\x36\x2e\xfb\xd9\x6f\xf9\x69\x17\xd3\x1e\xcd\xfe\x65\xca\x2a\xab\xac\xd3\xd8\x8d\x47\xe8\xc9\x9a\xf5\xec\xa7\xbf\x46\x69\xec\x22\x5a\x96\xb1\x5d\x6b\xa3\x8e\xd3\xbf\x38\x76\x30\x65\xb4\xda\x85\xca\xe5\xe9\x64\x98\xf9\x95\x69\x80\xac\xa1\xad\x51\x2b\xfd\x90\xcb\xc5\xf9\x2e\xb7\xe2\xcc\x97\x02\xbd\xf8\x1c\xf1\xb0\x02\x96\x83\x56\x03\x15\xaf\xda\xe5\x26\xb2\x5a\x52\xfe\x6b\x93\x2e\x44\x77\x8e\xd2\xf9\xd7\xa7\x83\x0f\x87\x52\x94\x40\x55\x43\x3b\x41\x6b\x57\xf7\x29\xd5\xf0\xa7\x8c\x91\x36\x9f\xa3\x23\x86\x2d\xaf\x56\x6d\x02\xe4\x0f\xfa\x4c\x77\x9f\x8b\x3f\xc3\x58\x54\x8e\x3b\x42\xb2\x60\x71\x56\xf7\xd7\x51\x9c\x06\xf8\xf9\x79\x51\x9f\xfe\xe9\x87\x3a\xbf\x83\x86\x31\xa2\xbb\xc2\x0e\x4d\xa4\x6f\x78\x70\x6f\x48\xff\xfc\x9e\x43\x74\xf8\x44\xe0\xd7\x3b\x26\x05\xe4\xcc\x77\xc1\x95\x47\x14\x7f\xfc\x3d\x2b\x68\xd2\x4a\x16\xb5\x70\x00\xa9\x47\x7b\x27\x94\x75\xf1\xf6\x56\x81\x73\xda\x81\xb2\x43\xe6\x72\x74\x2e\x45\xee\x3d\xe9\x15\x1a\xd2\x0c\x99\x25\xf9\x97\x7e\xbe\xa9\xda\x5e\x45\xf7\x51\xc9\x05\x92\x71\xee\x3c\xd9\x17\x1e\x3b\xee\x56\xc5\xe9\x26\x80\xd0\xda\xce\xa6\xf6\xdf\x0f\xe4\xfa\x2e\x33\xaf\x38\xe1\x5c\xe8\x01\x10\x4f\xf4\x4f\x1b\x3e\x0e\x45\xae\x39\xdb\x31\x74\xcb\x2d\xe6\x0b\x32\xa7\x2b\xac\xf2\x8d\x7e\x3f\xd2\x9a\x10\x96\x77\xcb\x89\x3c\x6c\x8c\x88\x0d\x20\xd3\xe8\xe1\xa6\xc9\xa0\x7f\xbb\x53\xc8\x4e\xd5\xe3\x12\x3b\xdf\x60\xab\x35\x41\x4a\xc0\xa7\xb8\x86\xd2\x9c\x95\x86\x12\x25\xcd\xad\xcf\x7c\x00\x59\x44\x87\xdf\x53\x24\x5f\xbe\x6b\x29\xfa\xaf\xbb\x2a\x09\x74\x8a\x4b\xad\xd5\xbc\x4f\xe1\x79\x79\xae\xfb\xc3\x1d\xf9\xf0\x48\x65\xf2\x1f\xb8\x0d\x7c\x5e\x07\x8b\xd0\x01\x59\xc4\x5d\xea\xbf\xff\x3f\x3e\x43\x9f\xed\xec\x4e\xc7\x4f\xa7\xf2\x05\xed\x6b\xaf\x5f\xdf\x58\x3e\xf4\xf2\x58\x81\x74\xcf\xf9\xc0\x4b\x2e\xb4\xa9\xef\xa8\x33\xf9\x69\x7a\xcd\x71\x00\xa9\x41\x5b\xff\xe4\xcc\xfd\xe9\x1f\x85\xaa\xe7\xda\xe2\xaf\x5b\x35\xb7\xf7\x2c\xaf\xe0\x78\x4f\x3c\x52\xfe\x5e\x73\x8c\x41\xe4\x9e\x9e\xf9\xcd\x61\x1c\x40\x3e\xa3\x13\x3b\x8e\xe7\x79\xce\xf5\xee\x90\x97\xb9\xfa\xb7\x89\xf5\x97\xe6\xe7\xe0\xd4\x2c\xdb\xd9\x6e\x5c\x3c\x1f\x1e\xd5\x5f\xf3\xeb\x17\xe8\xc2\x01\xe9\xab\xa8\xe1\x1d\x05\xfa\xcf\xef\x49\x5c\x1d\x64\x62\xec\x53\xf3\x6f\xf6\x52\x4e\x91\xec\x68\xc9\x9f\x4c\xa8\x1f\x2d\x32\x2e\xf4\x31\xee\x7f\x2f\xf0\x6f\x56\x03\x19\xb6\xff\x4f\x92\x9f\xc1\xbc\x0e\x96\xe1\x10\x52\x03\xd9\x3b\x96\xed\x10\xf2\x19\x7e\x4e\x1e\xcb\x7e\x3c\x44\xfa\x2a\xfe\x21\x98\xc4\x1a\xff\x90\xb7\x70\x2a\x98\xe4\x1a\x0f\xf9\x09\xd5\x1e\x16\xc1\x86\x90\x51\x72\xd8\x92\x80\xc5\xb4\x81\x8c\x14\x1b\x99\x07\x00\x48\x39\x9a\x59\x10\x7b\x09\xbc\x79\x55\x82\xdc\xcc\xd2\xaf\xfd\x74\xe0\xeb\x33\xb1\xeb\xe2\x87\x87\xed\xd8\xaf\xd4\x2e\xce\x7a\x31\x30\x68\xdf\x97\x01\x48\xfd\xff\x08\xdc\x54\x4a\x6f\x35\xbf\x33\xac\x9f\xd8\x4f\x67\xde\x1a\x64\x94\x96\x37\x98\x32\x62\x73\x8f\x1b\x9a\xf2\x45\x6c\xcc\x53\x14\xc2\x71\x00\xc9\x42\x9f\xfb\xa0\x99\x52\x41\xd1\xcb\xc1\x7e\x3f\x4c\x82\x22\x98\xee\xf7\x9a\xfa\xcc\x02\x85\x4d\x86\x23\xed\x97\xe8\xa5\x24\x4a\xd3\x8e\x54\xe1\x00\xf2\x03\x6d\xce\x93\x1b\xc9\xc7\x68\x54\xad\x0d\x14\xd3\x69\x2f\x10\x8c\x9f\x0b\x3e\xfd\x7a\xe1\x79\x98\xf8\x90\xa7\x4d\x24\x5f\x27\xaf\x3f\xb9\x8f\xc0\x3f\x5a\x8d\xf7\x4f\x39\xcc\x3d\x63\x59\x0e\x21\xf5\x50\xdb\x61\x19\x0f\x21\x59\x50\x0d\x63\xd9\x0f\x21\x3f\xf6\x52\xbc\x98\xba\x47\xd6\x83\x80\x80\x60\x77\xe5\x3e\xa1\x8f\xb6\x9e\x63\x60\x51\x00\xfb\x49\x93\x78\x71\x4b\xdc\xd2\x51\x05\x83\x31\xd6\xc3\x85\xc7\xe7\x33\x3a\xbc\xe3\x06\x74\x34\xb2\x63\xaf\x03\xe4\x27\x7a\x25\x54\x88\x3e\x0c\xe4\x71\x2b\x9c\xf6\x74\xb9\x98\xfa\x55\x61\x9e\x65\x35\xa8\x3a\x80\xb6\xdb\x68\xcb\x39\x9e\xb7\xe3\xd7\x58\x50\x2b\x0e\x20\x49\x68\xaa\x24\x7a\x53\x86\x49\xf8\x2c\x47\xef\x4b\xa5\xcf\xbf\x0f\x32\xfe\x6e\x6f\xe0\xc8\x88\x8a\x19\xc0\xe1\x24\x8e\x2b\x5a\xa4\xb1\x7c\x67\xc3\x01\x64\x1d\x4d\x0d\xa4\xf5\x78\xa6\xaf\x51\xf2\x55\xcc\xea\x70\x3e\x6e\x3d\xe2\xce\x64\xfc\xf6\xeb\xf5\x69\x02\xff\xcb\xb1\x6f\x5e\xe7\xba\x77\xb9\x07\x0b\xfc\xa3\xd5\x78\x07\x7d\xda\xfb\xd7\x18\x86\xe5\x7b\xe7\x07\x2e\x03\x96\xf1\x10\x92\x04\x13\x63\x58\xf6\x43\xc8\x3a\x05\xfe\xf6\xc0\x54\xa0\xf8\xdb\x43\x17\xe6\x24\xb0\x44\x28\xfe\x21\x75\xb0\xfe\x83\xa9\x43\xf1\x90\x54\xd8\x4f\x80\xa5\x45\x21\x24\x93\x10\x6e\x42\x2c\x51\x0a\x64\xa4\x88\xb8\x77\xc3\x51\x0a\x9a\x65\x94\x32\x11\x84\xdf\xf6\x65\x44\xe4\x02\xb5\x7c\x3b\x4e\xbe\x69\x6c\x3c\x3e\xf9\x43\xe5\x63\xd8\xf5\x5a\x25\x89\xaa\xbe\xd6\xe8\x7b\x38\x80\x14\xa3\xa3\x63\x5a\x2a\x7f\xf1\x03\xb3\xe5\xea\xa7\x26\x2f\xec\xf3\x37\x5e\x57\xaa\x46\x7d\x8f\x91\x7f\xf0\x59\xdf\xd4\x85\xd4\xb3\x4b\xae\xfe\x32\x0e\x20\x93\xe8\xf1\xc6\x2f\xc9\x62\x90\x6f\x77\x0a\x5f\xbe\x34\x3c\x42\xcb\x78\x2b\xe4\x5a\x5a\xb2\xe0\x03\xe4\x4b\x09\xd7\x7c\xcb\xa5\xab\x7a\xaf\xf3\x71\x00\x69\x42\x53\x3c\x86\x4b\xd2\xd5\xa9\x20\xb7\x2f\xe2\xfa\x85\x79\xe6\x06\x85\x2a\x65\xdb\x54\xf3\xbf\xc4\x47\x82\xee\xe5\x1f\x1a\xe4\x19\xe3\x77\x16\xf8\x37\xb3\xa1\x83\x52\x60\xa2\x1d\xcb\x72\x08\x29\xde\xfb\xd4\x0e\x86\xf1\x10\x32\x09\x21\x58\xf6\x43\x48\x13\x31\x7e\x13\x62\xa6\x07\xf0\x9b\x50\x0e\xff\x10\xcc\x0c\x01\xfe\x21\x5e\x7b\x8d\x78\x58\x59\x02\x3c\xa4\x05\x66\xec\x30\x13\x05\x78\x48\x02\xf4\x31\x56\xb2\x00\x42\x5e\xd2\xae\x34\x11\xfd\x5b\xd6\x00\xc8\x26\x13\x50\x90\x79\xef\x0a\x47\xf4\x6d\xb8\x90\x3a\x7b\x41\x2a\x21\x65\x2d\x2a\xc5\x53\xed\xec\xc2\xf4\xd3\x5a\xb5\x35\x7e\x67\xef\xcd\xd9\x3b\x2f\x3f\x6e\xdc\xd8\x60\x7c\xb3\x7b\x9e\xd0\x71\x8f\xf6\x8b\xeb\xc6\xc1\x6b\xf9\x97\xe7\x6e\xfd\x79\x9e\x14\xa7\x6a\x63\xb9\x32\x49\x55\x11\x49\xc6\xa8\xff\xe1\xa5\x7b\xed\xef\xf7\xba\x38\x80\x44\xa2\xd9\xba\x5f\xb2\x04\x3b\xaf\xb8\xc4\xfb\xf2\x0f\xd3\xa3\x2c\xfa\x9e\xa3\x6a\x1a\xec\x0f\xbf\x48\x2e\xbb\xd0\x0f\x56\x85\x5e\x49\x64\x91\xc1\x01\xa4\x16\x1d\xf7\xc2\xf3\x64\x8f\xab\xd7\xb6\xaa\x2e\x59\xf8\xbc\xfa\x6e\x7f\x57\xf2\x00\xf1\x91\x2c\x65\x2d\xd5\x4e\x3d\xbf\x33\x67\xcd\x84\xaf\x10\xe1\x00\x32\x88\xb6\x87\xc4\xc9\x92\xcb\xf8\x1b\x9d\x6f\xd2\x7d\xbd\xc7\xee\x85\xf5\xa4\x1f\x04\x71\xa3\xf1\x6c\x0a\x63\x51\xab\x12\x44\x36\xca\x45\x91\x38\x80\x00\x34\x6f\xfc\x40\x4f\x74\xa1\x67\x21\x9d\xd0\x37\xe6\x81\x64\xbc\x0c\x51\x39\x21\xdf\xf5\xf4\x9c\x88\xee\x9b\x9f\xe9\xda\xb9\x91\xa2\x0a\x2f\x81\x7f\x73\x0b\x5c\x81\x31\x78\xd5\x62\x79\x66\xef\x7e\x82\x71\x15\xcb\x39\x10\x12\x09\x8b\x23\x58\xfe\x81\x90\x5a\x18\xf0\xb1\x5c\x04\x21\x83\xd0\x30\x2c\x2f\x41\x08\x60\xc0\x1f\x3f\xcc\x34\x14\xfe\xf8\x99\xc2\xea\x3c\x56\x26\x0a\xff\x90\x30\x38\x7b\xac\x6c\xd4\x1e\x1d\x84\xe1\x0c\x2b\x21\x05\x21\x6d\x10\x82\x99\x93\xc2\x43\xf2\xf7\x4a\xed\x58\x79\x29\x3c\xe4\x3d\x5c\x16\xac\xdc\x14\x84\x34\xc2\x10\x88\x99\x9e\xc2\x43\x7c\x61\xc9\x0e\x33\x45\x85\x87\x24\xef\xbd\xb4\x11\x23\x4d\x05\x21\x7d\x74\x2b\xf5\x44\xff\x96\xaf\x02\xb2\x44\x34\x44\x34\x9e\x00\x48\xa3\xc5\x73\xbf\x6c\x93\xb5\xa0\x9a\xc7\xf4\x5b\x15\x96\xb0\x3e\x46\x46\x81\x08\x02\xd5\x89\xf4\xab\x3c\xdc\xa9\x72\xb6\xc6\x2c\x6f\x3d\xe5\x00\xd2\x8b\xce\x43\xec\x30\x69\x49\xd7\x3d\x58\x32\xb8\xd1\x67\x31\xed\x2f\x33\x72\x34\x7f\x99\xf6\xe7\x33\xea\x37\xb4\xb3\xa2\x7c\x47\x4f\x19\xeb\xdc\xc6\x01\x64\x1c\x3d\xbe\x9e\xef\xcb\xfc\xfb\xcb\xd5\xfc\x8b\x99\x7e\x81\x44\xb7\xa6\xa5\xec\x5c\xf7\xb5\x36\x8b\x7d\x53\x92\x69\x95\x9d\x79\xea\x70\x40\x12\x00\xa4\x0b\xcd\xdc\xe8\xd5\x6c\x55\xb2\x9d\x35\x3a\x7a\xd8\xd7\x5a\x19\x81\x18\xe2\x10\x57\xf4\x50\x7a\xc9\x3d\x21\xe2\x53\xac\x28\xb5\xf6\xd8\x38\x40\xfa\xd0\x3f\x4f\x7c\x28\xd4\x71\x42\xba\xe9\xea\xe3\x7d\x55\x07\xce\x66\xed\xa3\xdd\x04\x51\x2f\x26\xb8\xce\xd2\x8b\x3b\x9d\x9b\x1c\xc9\xca\x7c\x87\x03\xc8\x57\x74\x86\xb9\xef\x5c\x00\x0d\x93\x80\x51\xc9\x51\x2b\xb3\xca\x1a\x41\x3b\xb5\xb6\xd0\x5b\xe4\x47\x99\xbb\xc9\xdd\xf2\x94\xcb\xde\x32\xfb\x1e\xe6\xff\x47\xa7\xe0\x0f\x12\xdc\x16\x58\x7e\x81\x0b\xd6\x0b\xf7\x2b\xa6\x6b\xf0\x90\x71\x08\xc1\xf4\x0e\x1e\xd2\xb5\xf7\xad\x20\x0c\x0f\xed\xed\x24\xf8\x14\x2c\x27\x41\xc8\x57\x18\x60\x31\x73\x9f\xf0\xae\x86\x4c\x1a\x33\xfd\x89\x87\xe0\xe0\xa5\x80\x95\x02\x85\x90\x4d\x32\xf8\xce\x5e\xac\x5c\x28\x90\x75\x97\x62\x23\xdb\x25\x93\x3d\xe8\x7d\xf8\xd5\xe0\xe4\x8d\x0a\x96\xf6\x6f\x85\x3b\xde\xbc\x46\xe6\xaa\x5e\x8d\x27\x34\x95\x1d\x2a\x03\x53\x87\xd7\x2e\x3c\xf8\xf8\xb7\x9e\x00\x00\xa4\x07\x5d\x5b\xf8\x2a\xe8\x7b\x14\xf7\xc3\xa7\xf0\x60\x3c\xd3\xdf\xfe\x63\xfc\xf3\x0c\x8c\x72\xf9\x85\x79\x3c\xc7\xf9\x36\x9e\x15\xbc\x0c\x2f\x2b\x00\xc8\xf2\xff\x24\x23\x6b\xbd\xae\x76\x64\xbe\xd6\x78\xf0\xee\x6c\x24\xab\xfb\xa9\xa3\xd3\x2c\x23\x0e\xdf\x6a\x6d\x70\x67\x45\x72\xf3\x8e\xd9\xbb\x85\xe1\x00\x12\x8b\xce\x88\xd5\xed\xac\x7f\x1a\x91\x22\x50\xf7\x90\xca\x3b\x40\xf0\xfd\xd2\x85\x6b\x64\x88\x17\x63\xa8\xcc\xdb\xa4\x7c\x5f\x21\x65\xd7\x95\xeb\xbb\x6c\x07\xfd\xfb\x25\xc3\x29\xba\x63\x6d\xa4\xb4\x61\x37\x7c\x53\x15\x33\x5b\x37\xd6\xc3\x64\x2e\x17\xff\xf9\xfe\xe4\xe1\x5d\x6f\x70\xe4\x60\x0b\x87\xc0\x3f\xce\x12\xef\xd0\x1e\xb8\x9f\x30\x27\x0a\x21\xb0\x97\x02\x6b\xb2\x10\xb2\x0c\x37\x07\xd6\x7c\x21\x24\x16\x76\xad\x63\x4d\x79\x8f\x16\x52\xad\x6c\x10\xfd\x5b\xf6\x1b\xc8\x12\x55\x21\xee\xbb\x84\xed\xd5\xff\xbc\x53\x3f\xc1\x4b\x29\x94\x1d\x17\x5a\x69\x37\x79\x7b\x52\x68\xf4\x05\xff\x1b\xd2\x13\x16\xe7\x4e\xaf\x13\x35\xc6\x6a\x64\x35\xf7\x86\x01\x80\xd4\xa0\xef\xd8\xc9\x0c\xae\x14\x96\x58\x89\x13\xda\x4d\x14\x99\x5e\x4c\xc6\x3e\xb9\xeb\x23\x1d\x93\x24\xb8\xc5\x24\x4e\xdb\x95\x8e\x9d\xe2\x9f\x00\xf9\x85\xfe\x79\x49\x92\xbb\x2c\x46\xb2\x77\x66\x86\x7a\x77\x9e\x70\x11\x32\x5a\xf1\xcf\xb3\xc6\xc4\x1a\x46\x67\x0c\xa5\x09\x4e\x8c\x7b\x49\x8d\xe1\x00\x32\x8c\xe6\x5f\xe3\xe4\x2a\x52\xa2\x12\x22\xc5\x96\xd2\xa5\x6f\xdf\x15\x0a\xc9\x7d\x58\xbb\x95\xe8\x47\x1a\xfe\xd9\xdd\xd4\xea\xe5\x92\xdb\xeb\xaf\x38\x20\x6d\x89\x1a\x7e\xe0\x78\x4a\xce\xf5\x3f\x31\xa4\x7a\x6e\x9b\x0e\x95\x8f\x2e\x07\x5a\x3a\x3e\xf6\x89\x9e\x26\x5e\x9b\x91\x3f\x4c\x53\x4e\x1b\xba\x81\x03\x48\x1e\xfa\x28\x94\x3e\x24\x2a\x52\xea\x20\xdb\xea\xec\x10\x2c\xfb\xcd\xf0\xd3\xb4\xe5\x05\xc5\xfd\xfa\x9a\x6a\x45\xed\x0f\x8c\x3f\xda\x9b\x17\xe5\x71\x00\x79\x86\xde\x7b\x45\x84\x8c\x31\xb3\x16\x23\x47\xbf\x1a\x5d\x15\x2e\x0a\xf5\xa6\xc1\xc9\xe5\x8c\x32\x30\x4f\xb4\xa4\x3f\x3a\x42\x7f\x23\x4b\x0f\xdf\xb1\x88\xe9\x44\xfc\x7a\xbd\xda\x7b\x59\x27\x96\x1f\x61\x1e\x0e\xde\xcb\x58\xbe\x84\x90\x5f\xf0\x29\x58\xee\x84\x90\x61\x4a\x3c\xf1\xc2\x72\x29\x8c\x17\x96\xf8\x87\x60\x39\x15\x3e\x24\x0f\x9e\x3c\x2c\xbf\xee\x25\x2e\xe1\x31\xc2\xaa\xd6\x40\xc8\x36\xbc\xfc\xb1\x0a\x36\x7b\x7a\x9d\x61\x65\xea\xff\xf4\x3a\x66\xe5\x46\x46\x8a\x80\x06\x78\x00\xc4\x03\xad\x8f\xef\x3d\xd9\x39\x9a\xb3\xb9\xe3\xed\xf4\x69\xfe\xc8\xe8\x72\xe2\x59\xe5\x0f\x67\xd4\x85\x08\x77\xee\x66\x30\x98\x1c\xb0\xbc\x95\xac\x01\x90\x64\xf4\x36\x64\x8d\x32\x3b\x98\x5e\xb8\xf0\x6a\xbd\x22\x64\x66\x8e\x5a\xe9\x36\x4b\x75\xf8\x33\x0d\x2d\xae\x30\x86\x9b\xe5\x1e\x33\x13\xbf\x0a\x01\x52\x80\x16\x3d\x71\xa3\x1c\xb1\x4a\x65\x04\xb2\xc4\xdc\x4a\xb8\x77\xde\x8e\x8f\x3e\x9f\x78\x51\x15\x2a\x88\xd3\x7f\xb3\x84\x5c\x92\xa5\xbe\x0f\x70\x00\x79\x8b\x3e\xa3\x3f\xd9\xe8\xc3\xf9\x09\xce\xd9\xd8\xd6\x14\x6e\x26\x4c\xb5\x2f\x89\xd7\x08\xba\x69\x1d\x72\xb1\x9a\x89\x55\x11\x7e\x5f\x56\x6d\x20\xf0\x8f\x46\xe3\xdd\xe3\x01\x3b\xe9\x30\x0d\x87\xf4\x0f\x2e\x35\x96\xf1\x10\x52\x00\x69\x39\x96\xfd\x7b\xb9\x60\x78\x36\x30\x0b\x68\x90\xca\x42\xc3\xb0\x8a\x68\x10\x32\x0b\xf7\x20\x66\x1d\x0d\x9e\x73\x98\x71\xc6\xac\xa5\xc1\x64\x05\x9c\x3e\x56\x3d\x0d\x42\xa6\xe0\xba\x60\x96\xd4\x60\xea\x01\x1e\x0e\xcc\xb2\x1a\x8c\x64\x30\x8f\x80\x59\x5a\x83\xa9\x3c\xe8\x31\xcc\xea\x1a\x54\xb1\x70\xfa\x98\x15\x36\x3c\x64\x0d\x1a\x86\x59\x64\xc3\x43\x0a\x61\x88\xc5\x2a\xb4\x41\xc8\x1f\xb8\xc7\xb0\x6a\x6d\x10\x12\x0f\x45\x3c\x56\xb9\x6d\x2f\x39\xbe\xf7\x06\x4f\xac\xba\x1b\x90\x35\x24\x20\xfc\xef\x1f\x48\x53\xe8\x16\x3c\xd2\xba\x0e\x87\xa0\xfe\xbb\x8b\x34\x25\xb7\xdf\xfb\x78\x7e\xf9\x52\x69\x4c\x21\xd3\x26\x2d\xbc\x48\xb9\xa8\x71\x36\x31\x88\x61\x7c\x77\xf6\xe8\x48\x1b\x4c\x95\x90\x26\xc1\xfe\xac\xd0\xa7\x46\x79\x81\x9d\x39\x29\xa6\x32\xbd\xae\x4c\x5f\x49\x7e\x96\x35\xcb\x81\x35\x00\x24\xe5\xed\xce\x03\x1d\x0a\x1d\x2f\x1e\x67\xe4\x3c\x60\xfa\xbc\x62\xf3\x46\x8d\x68\x93\xc8\xa2\x04\xff\xb8\x9b\x75\x7d\xb0\x74\x73\xc7\xf0\xa3\xd7\x11\xfd\x4e\xbb\xc2\x1a\xcd\x22\xef\x9d\x93\x79\xc1\xac\xa6\x65\x4b\x93\xe9\xc9\x4e\x4c\x64\x37\x20\x98\x69\x17\xba\x20\x16\xf0\x91\x47\xd9\xae\x42\x79\xb6\xd1\x4c\xe0\xdf\xcc\xde\xdb\xec\xb0\x99\x0e\xcb\xf2\xbd\xd5\x86\x09\x08\x2c\xe3\xf7\x96\x0e\xee\x5c\x2c\xfb\xf7\xd2\x09\x90\x1c\x62\x56\x40\xf1\x10\x4f\xf8\x14\xcc\x2a\x28\x1e\x32\x0d\x21\x58\x95\x50\x08\x59\x24\x5a\x69\xa5\xfd\xff\x98\xb5\x98\xd1\xae\x93\x25\x72\x87\x0a\xad\xa4\x45\x9d\x78\x0e\x04\xed\xd8\xdf\x17\x99\x2d\xa1\x67\xa2\x55\x93\xf8\xe5\xef\xe8\xee\x0c\x64\xb7\x77\xdc\x2a\xa3\x58\x00\x40\xde\xa0\x03\x15\xd3\xaf\x5a\x0b\x2e\x71\x83\xa4\x90\xb9\x82\x32\x37\xb2\xad\xa9\xee\xbb\x3b\xe5\xc4\xda\x4e\xa7\x3c\xbb\x0d\x6d\xa4\xfd\xcc\xc6\x01\xf2\x0b\x1d\x06\x15\x9c\x3e\xc7\x28\x2e\x5b\xfd\xbd\xcd\x1f\x3e\x56\x6c\x65\xa1\x70\x84\xf9\x50\x6c\x2b\x99\xef\xbb\x05\x92\x85\x4d\xe2\x29\x1f\x74\xb3\x46\xb0\xf3\x2b\xf2\x0e\x87\x86\xd8\x8f\xbd\xe4\xd7\xba\x0a\xee\x36\x5c\x7e\x5e\x15\xa4\xbd\x8f\x7c\x3d\xc1\x86\xea\x4b\x58\x96\x76\x0b\x0e\x20\xbf\xd1\x31\x2d\xd9\x68\x39\x9a\x6d\x80\xfc\xec\x59\xef\x72\x1b\xf5\xbf\xcf\x54\x45\x7f\x73\x85\x1e\xd0\x8d\x8f\xd3\x9c\xaa\xa8\x16\x3d\x1f\xc9\xe9\x01\x90\x00\x74\xcb\x43\x5f\xc1\xa0\x61\xb8\x88\xe8\xf1\x50\x27\xd6\xf7\x17\x5f\xb7\xba\x9d\x66\x3e\xde\xe4\xdc\xe1\xb8\xc4\x50\xe1\x04\x2e\x4d\x32\x4a\x03\x24\x06\x5d\x9f\x15\xaf\xd3\x2e\x3e\x89\xe0\xac\x8e\xb8\x33\xf5\x9a\x0b\xb8\x3c\x12\xa9\xd4\x7a\xa2\xfd\x59\xf8\x6a\x9c\xa3\xd2\xa1\x2f\x74\x75\x6f\x01\x52\x8d\x3e\x3c\xfb\x1f\x35\x25\x0c\x5c\xa5\xb5\x7e\x14\x28\xdf\xf7\xa0\xd7\xc5\x52\xd6\xe6\xbd\x7c\xf1\x77\xdd\x1e\x9a\x24\xe2\x9e\x3b\x74\xa7\x25\x3c\x00\xe2\x89\xb6\x46\xe2\x8c\xb8\x5d\x56\x86\xad\x62\x70\xe7\xfd\x13\xbe\x19\x0c\x66\xee\xd6\x65\xfa\x69\x54\x3f\x0e\x4f\x53\xd4\x75\x98\x3d\x09\xb5\x03\x48\x2c\xba\x47\xee\x5b\xfc\x13\x66\x01\x99\x0c\xeb\x38\xa5\xaf\x0c\x74\xa7\x6c\x8a\xea\xfe\xf6\xd5\x84\xa4\x8a\x70\x7e\x38\x43\x7f\x81\x62\x39\x45\x1f\x20\x85\xe8\x24\x67\x19\x03\xe7\xcd\xcf\x6b\x0b\x7a\x21\x7c\x17\x6a\xd5\x57\xe3\x84\x06\x13\xdc\x23\xcb\x8c\xbf\xa7\xf1\x1c\x52\x38\xf7\x41\x5b\x7d\x12\x35\x74\x38\x86\x4e\x81\x6a\xdc\xd6\x87\x95\xeb\x90\xbd\xb7\x4b\xb8\x93\x98\x03\xfb\xe9\x9a\xe6\xc7\xcf\xd5\xae\x73\xdd\xbc\x9a\x61\x3b\x00\x00\x12\x8f\xf6\x0b\xe3\x89\x8c\x0c\x0d\x49\xbf\x91\xc9\x11\xc9\xc7\x4a\xcd\x99\x8f\xf8\x0e\x70\x34\xbd\xac\xb8\xb7\x71\x75\x26\x59\x38\xad\xeb\xd4\x4d\x80\x4c\xa3\xd3\xa1\x0d\xa4\x61\x33\x84\xfe\xba\xbd\xe4\xc7\x6f\x98\x2a\x00\xaa\x90\xe4\x99\x62\xb7\x18\xb1\x13\xa6\x82\x6c\x3b\x12\xee\xa3\xfe\xde\x00\x20\x29\xff\xf3\x61\x23\xdd\x4f\xdd\xcd\x8b\x8d\x15\x87\x13\xba\xb6\x8c\x48\xca\x54\xd9\xcb\xd4\x3f\x9e\xfe\x23\x6d\x70\x8a\xc5\xed\xbe\xa4\xc5\x48\x20\x40\xca\xd1\x6d\x4c\xf1\x36\xf6\x33\x92\xb9\x99\x55\x83\x9b\x8e\x7c\xdb\xf9\x82\xae\xde\xfb\x33\x0e\x9f\x09\x96\xbf\x57\x4c\x7a\x6d\x72\x88\xbc\x29\xd6\x03\x20\x05\xe8\x65\xba\x78\x82\xd9\x42\xa2\xb7\xf7\xd0\xcf\xa3\x52\x9a\xe5\x27\x95\xbe\xbe\xa0\x95\x53\xfb\x6d\x17\xee\xd4\x7b\xc6\x23\xd0\x7c\xea\x5a\x3a\x40\x5a\xd1\xc9\xeb\x77\x91\xf2\x53\xcb\xfb\x6d\xc6\x84\x9a\x4b\x25\x34\x57\xe8\xc5\x57\xee\x1a\xae\x95\x7a\x04\x2d\x28\x4d\x4a\x15\x88\x09\x75\x5c\x02\xc8\x16\xfa\x46\xf4\xa6\x4b\xdc\x2a\x94\x77\xec\xa8\x25\xa4\x72\x1b\xcc\x1a\xde\x97\xc0\x91\x46\xd0\xf4\x68\xe7\x83\x6e\xc3\x58\xd1\xb7\x3a\xca\x58\x1c\x40\xfe\xa2\x8b\x2e\xad\x8f\x08\xf8\xe2\xf2\x4d\x58\x44\xd2\x96\xec\x54\x5e\x9e\xb1\x15\x8a\xbb\xde\xc6\x38\x93\x2b\x5a\x99\x40\xfc\x47\x36\x2c\xf7\x3e\x00\xc8\x5b\xf4\x0d\x9a\x53\x31\xf2\xe9\x6a\x9c\x46\x88\xaf\x77\xb3\x64\x0a\x4b\xc2\xab\x33\x2f\x3f\xe3\x18\xd7\xe9\x2a\xc2\x8b\x5e\x2c\x72\xbe\xe0\xbd\x00\x90\x16\x34\x4b\xb4\xbe\xa0\x7a\x3a\xef\xb2\x65\x67\x50\xd3\xdb\xf7\x53\x2f\xac\x2b\x5c\x68\x89\xfd\x34\x22\x58\x0e\x09\x8f\x26\x67\x74\x67\x7a\xf1\x00\x80\x44\xa2\x9d\xc3\x6f\x4f\xe3\x26\x37\xc9\x16\xc1\xa1\xb4\x7a\xb5\xe1\x95\x80\x62\xd0\x77\xc7\xa2\x1a\x1d\x29\xcb\x61\x02\x5f\x19\xf5\x8d\x70\x63\x80\x7c\x46\xcf\xf6\x08\xb3\x79\x20\x6b\xae\xae\xc3\x09\x29\x27\xf7\x71\x2e\x19\x0b\x03\x93\x2f\xf7\x5d\x44\x52\xa9\x39\x4f\x07\xb1\x10\xa4\x47\xc5\xe1\x00\x92\x85\x96\xf9\x72\xb2\xad\x08\x7d\x8a\xd6\x33\x59\xaa\xbe\x8f\x27\xa7\x9b\xfc\xda\x3c\x45\x35\x0b\x1e\xb7\xa6\xbf\xad\x65\xa3\x22\xfe\x13\xbe\x3b\x3e\x11\xad\x14\x33\xfa\x6d\x36\xe9\xe7\x1e\x1d\x6c\xe7\x77\xfa\xb6\xbd\x1e\x56\x97\x2e\xd4\xf8\x6c\x74\xc3\xde\x30\xd6\x4f\xca\xc5\x21\x58\xd7\x1d\x07\x90\x9c\xff\x79\x99\x9c\xf1\xe7\xee\x32\x83\xe1\x86\x1e\x2b\xaf\x0e\xb9\xe9\xbc\x0b\xd9\x1b\xc7\x6e\x54\xfd\x50\xd1\x68\x28\xcb\xf2\xad\xa8\x7c\x20\x8c\x1a\x3a\xb6\xa2\x53\xfd\x52\x33\xa6\xd1\x32\xb2\x99\xce\xb6\xcd\x9c\x86\xe9\xbe\x72\x52\xe7\xf3\x36\xf5\x07\x1c\x35\x65\xbc\xde\x05\x42\x00\x20\xa1\xe8\x50\x4a\xe1\x3c\xa1\x9c\xf5\x4a\x55\x9c\x69\xb2\xa9\x87\x71\x5f\x62\x08\x4b\xac\x44\xc0\xd3\xe8\xb8\xe9\xb1\x1e\x0a\x3a\xfe\xf1\xa0\x06\x80\x34\xfd\xcf\xa7\x20\x23\xbf\x72\x7f\x66\xfc\xa0\x2b\xf5\x8d\x32\x9d\xf4\xc3\xc5\x33\x95\x99\x52\x86\x0f\x76\x28\x0f\x1f\xa2\x67\x88\xb4\xf6\xbb\xea\x09\x00\xe2\x8d\xbe\xca\x34\xc7\xf4\xc5\x38\xd2\xca\x92\x4a\x26\xf4\xb8\xb6\xc2\x8d\x78\xd4\xdf\xc9\x37\x50\xea\x2f\x13\x16\xd7\x46\x7a\x9b\xdf\xa1\xff\x02\x90\x67\x68\xc7\x0c\x55\x5d\x7f\x98\x4a\xc3\x99\xe2\x4d\x75\xab\xd1\x7d\xe3\xd0\x75\x0f\xbf\xda\xcd\x3c\x95\x46\x22\x8f\x6e\x81\x47\x6a\xc9\xb7\xfc\x01\x40\x62\xd0\x3f\xcf\x4e\xf7\xc9\xf3\xe9\x5d\xcf\x25\xf7\xcf\x05\x23\x6f\x7c\xdb\xa5\x1e\xd6\x15\x79\x69\xb3\x34\x8b\xde\xfe\x44\xe1\x0b\x9c\x3a\xa7\x01\xf2\x03\x3d\xdc\xbe\xdc\x24\xd0\xcf\x7f\xba\xe4\xf1\x50\xd7\x52\x2f\xe5\x46\x76\xc2\xe4\xfb\x8f\x34\x2f\x0b\xef\x4e\x3c\x73\xfb\x49\xeb\x18\x34\x8b\x1a\xfa\x2a\xc1\x74\xda\xaa\xe8\x77\xd9\x11\xe9\x6a\x0d\x35\x69\x8a\x57\x19\x07\xe4\x89\x15\x19\x37\xe3\xb6\xdc\x9b\xee\x72\xbd\xae\xff\x8e\xee\x4d\xac\xe3\xa8\x89\x78\x17\x5e\xd7\xa1\xeb\xe8\xc9\xfb\xbd\xd8\x88\x71\x74\xd4\x46\xd4\xfa\xad\xca\x1f\xd1\x1b\x74\x3d\x2f\xaa\xdb\x3c\x00\xd2\x8e\xae\x8a\xcf\x38\x34\x0e\x5f\xc8\x11\xd1\x20\x1a\x48\xbb\xf9\x30\xf9\xf6\x62\x23\xb7\xe1\xdc\xc1\x12\x1e\x56\xd9\xa6\x4f\xba\x57\x96\xbe\x4f\x00\x64\x0e\xbd\xd7\x11\xa2\xca\x78\xc1\xde\x70\x7b\x03\x67\xcf\xc5\x73\x31\x2c\x3b\x47\xd3\xcb\xa4\x58\x7f\xe4\xf6\xdd\xcc\x7e\x72\xdd\x68\x87\xdc\x17\x20\x2b\xe8\x15\x92\x5a\xbf\xf6\x8d\x80\x39\xd2\x84\x9e\x3b\xfd\xed\xd0\x25\xb3\xda\xf8\xaf\x8d\x06\xb4\xaf\xea\x5b\xf5\xb9\x75\x97\xfd\xd5\xd3\xb5\x01\x40\x32\xd0\x7b\x4b\xee\x97\x57\xa6\xb7\x4d\xe8\x95\xd5\xb1\xda\xab\xe5\xf5\x21\xcc\xc1\xe6\x86\x4d\x0d\xee\x61\x46\x52\x24\xc7\x74\x07\x1f\x36\x68\x03\x64\x13\xbd\x5f\x54\xb8\x0a\x29\x66\x0a\xbe\x34\x38\x30\xd4\x65\x78\x56\xdc\x99\x78\x33\xbd\xd5\xdf\x58\xbf\xcf\x71\xb0\x6c\x9f\x77\xb3\xc4\xe3\x3a\x0f\x80\x84\xa0\x33\xbd\xb9\xa4\x87\xc2\x5f\xdd\xee\x92\xe4\x2c\xfc\x26\x78\x5e\x27\x31\x6f\x23\xf1\x15\x6f\x5a\xc4\x64\xe9\x00\xb1\xeb\xb6\x7d\xe9\xb2\x08\x40\x62\xd0\x97\xea\xf9\xdf\xc1\xc1\x14\xca\xc1\x7a\x31\x0a\x07\x48\xea\x2b\xee\x5a\x0a\x3a\x05\x65\x76\x2e\xff\x95\xeb\x72\x91\x6c\x70\x92\x42\xee\x02\xa4\x15\x7d\xae\x89\x78\xcd\xfa\x62\xf6\x79\x50\xbc\x8f\x49\x55\xe1\x73\xd6\x38\xbc\xed\x89\x1c\x78\xa3\x18\x6b\xfc\x4d\x4a\x53\xf7\xf9\xe1\x4d\x11\xd4\xd0\xb3\x2b\x43\x83\xfb\xb7\x55\x67\x23\x9e\xc8\x2d\x73\xb1\x12\x32\x3a\x44\x2f\x5f\xed\xad\xf6\xf1\x48\x57\x9d\xf1\xad\x0c\xfb\x25\x88\x1a\x9a\xf9\x31\xc5\xd6\x75\xb2\x91\x2e\x2e\x22\xed\x80\x70\xd8\xe0\x19\xb3\x1c\xdd\xf4\xd3\xf2\x1f\x2e\x54\x77\xac\x92\x9d\x7f\xa2\x58\x8a\x03\xc8\x1c\x7a\x41\x7f\xea\x8c\xd6\x9d\x18\x6b\xfd\x7d\xb7\xbf\xc9\x3c\xd4\x8b\xe4\x1b\x55\xfb\x91\x13\x77\x59\xe4\x4c\x03\xd6\x8f\x7d\xfe\x7d\x20\xb9\xca\x03\x20\x2f\xd0\x2b\x5a\x91\xea\xfc\xd8\xac\x99\x82\x46\x48\x3d\x6a\xde\xd0\x44\xa4\xa8\xef\x49\x69\x84\x48\x54\xb7\x40\xb6\xe4\xb3\x91\x8b\xa3\xf5\x2f\x00\x52\x84\xf6\xc9\x59\x4b\xc3\xfe\x47\xc3\x51\xb7\x4d\x73\x0e\x78\xfa\x4e\x17\xe4\xb9\xde\xe1\x1e\x7f\xfa\x51\x30\x69\xbf\x5b\xff\x3b\x92\xfb\xcb\x54\x00\xe9\x47\x5b\xc3\xa0\xe9\xdd\xf8\x5e\xe4\xb5\x10\x83\xab\xc5\x9f\x6e\xb9\x37\x16\x2a\xdc\x42\xa7\x65\x6f\xf9\x8b\xa4\xb8\xc9\xcb\x9a\x2f\x45\x38\xa2\x86\xbe\x95\x2b\x5b\x5d\x77\x3a\x3a\x4a\xc1\x65\xd1\x5f\x65\x62\x9a\x7b\x8c\x21\xd9\x56\x8c\x2b\x74\x24\xd4\xca\x7a\x5c\xf1\x68\x5b\xb4\xc0\x3f\x32\x23\x19\xa9\xff\xfb\x4f\x19\x14\x9c\x58\xec\x08\x42\x7e\xed\xfd\xdf\x07\x8b\x26\x01\x59\x22\x36\xee\xff\x3e\x83\x52\x87\xde\xc0\xa6\x5a\x6d\x05\x84\xec\x11\x3c\xb1\xea\x4e\x4c\x6c\x1d\x7f\x07\xee\xae\x2f\x6f\x32\x8d\x5f\xd4\x33\xaa\xf2\x17\xe3\xf7\x4f\x17\xc2\x01\xe4\x07\x9a\xb8\x11\x5e\x16\xd1\xea\xf7\xb7\xb8\xa6\xd5\xb1\x70\x3c\xeb\x14\xc7\xd9\x1c\x9f\x52\xfa\x89\x1d\x1d\xda\x13\xdb\x8f\xbf\xd3\xd8\xcb\xf3\xe0\x00\x52\x8e\x0e\x4d\x48\xc8\x79\xc3\x8d\x4b\x02\xbc\x77\xa8\xeb\x07\xa7\x0c\x14\x5f\x5c\xe2\x8e\x1c\x79\x2f\x35\x48\xdf\xef\xf5\xfb\x95\x6b\xc8\x5a\x12\x0e\x20\x00\x7d\x87\xd9\x5d\x6b\x7b\x2e\xd3\xc5\xa5\xf5\xad\x9f\xaa\xd2\xa2\x33\x5a\x3d\x96\x4d\x63\xdd\x9c\xc8\xa0\x53\xd2\x9a\x5a\xd5\xd3\xf6\xe0\x5b\x1c\x40\x02\xd1\x27\x84\x40\xe1\xc5\xaf\x84\xa8\x26\xb3\xa0\xac\x83\x15\x17\xc7\x68\x55\xcb\x8f\xb2\x72\x4a\x46\x7c\x78\x45\xda\xfa\x90\xf0\x35\x73\x55\x87\xc0\xbf\x4d\x13\x7a\xb4\x0e\x2a\x32\xac\x99\x42\xc8\x0f\x28\xae\xb1\x26\x0b\x21\xe5\x50\x09\x60\xcd\x17\x42\x00\x4c\xd5\x61\x4d\x19\x42\x02\xa1\x84\xc7\xe2\xc4\x10\xf2\x1b\x6a\x58\x4c\x5a\x8c\x87\x04\xc0\x0c\x06\x26\x35\xc6\x43\x62\xe0\xbf\xf4\xb0\xe8\x31\x84\x54\x43\x85\x86\xc9\x90\xf1\x10\x4f\x68\x18\x26\x4b\xc6\x43\x62\x61\x07\x0f\x16\x53\x86\x90\xc2\x03\x50\x8f\x63\x52\x66\x59\x62\x29\x92\xff\x3a\x4a\xe3\xd0\x5c\xb5\xab\x3f\xb2\xf8\x26\x0d\x6b\x6f\x4c\xc5\x77\xc5\x6e\x49\x15\x16\xd7\xb7\x17\x23\x45\x2c\x47\x4f\xd9\xfb\xfc\xa4\xb8\xdc\x96\xb3\x83\x03\x48\x2a\xba\x9c\x67\x42\xb2\x5f\xb3\x48\xf5\x7a\x4f\xb2\x42\x09\xae\xb7\xf1\x35\x49\x33\xf1\x70\x9d\x13\x67\x42\xb5\xdc\x2b\x62\x0f\xde\xce\x56\x11\x1c\x40\x3a\xd1\x92\x22\x7a\xe1\xcf\x4a\xe1\x9d\xb0\x41\xb5\x14\x72\x66\x03\x31\x8e\x60\x53\xb7\xb0\x0e\xc2\xe1\x9b\x16\x3f\x26\xf9\x78\xff\x68\xc7\xb4\xe3\x00\x52\x86\xe6\x6f\xe6\xf3\x2d\x97\x17\xec\x02\xcb\x7a\x55\x3e\xd7\x5f\x08\x7f\x73\x7b\x79\x91\x14\x47\x54\x37\x15\xc5\x44\x74\xc9\xc4\x20\x77\x0c\xff\x3e\x3f\x2c\xb3\xa1\x87\xe2\x60\x4d\x18\xcb\x72\x08\x49\x85\x35\x36\x2c\xe3\x21\xa4\x13\xae\x36\x96\xfd\x10\x52\x06\x95\x32\xa6\x78\xc1\x43\xe2\xe1\xce\xc5\x14\x30\x78\xc8\x34\x6c\x43\xc5\xd4\x30\x78\x48\x0a\x7c\x0a\x96\x8e\xd9\xbb\x51\xa0\x93\x31\xa5\x0c\x1e\x52\x00\x8f\x14\xa6\x9c\xc1\x43\x5a\xe1\xed\x88\x25\x69\x20\x64\x0b\x3a\x19\x53\xd5\xe0\x21\x7f\x61\xd7\x13\xa6\xb0\xc1\x43\xde\xc2\x0b\x15\x53\xdc\xe0\x21\x2d\x30\x8f\x88\xa9\x6f\xf0\x90\x48\xe8\x31\x2c\x8d\x03\x21\x9f\xe1\xf4\xb1\x64\x0e\x84\x64\xc1\xd4\x23\x96\xd2\x81\x90\x44\x18\x1c\xb0\xc4\x0e\x84\xe4\x90\xc2\xce\x43\x4c\xd5\x23\x2b\x45\xe0\x4e\xe6\x81\x03\xc8\x28\x9a\x0a\x1c\x5f\x6e\xd0\x97\x7c\x7a\xa2\xe4\x43\xe4\x69\xdc\xb4\x5d\x90\x44\x60\xaa\x91\x8c\xdd\xa1\x85\x6e\xaf\xeb\xc7\xce\xb0\xaa\x9f\x45\x70\x00\x99\x40\x73\xeb\x25\x49\xd6\x8f\xbc\x92\x46\x9e\xba\x71\xdd\x07\xd2\x1e\xe7\x06\x47\xa5\x6e\xfc\x08\xb8\x5b\x4d\x62\x6a\xd8\xff\xf9\x82\xe0\x65\x7a\x00\x90\x5e\x34\x15\xf8\xc2\xa8\x34\xbb\x74\x33\xd7\x64\xa6\x94\xf7\x83\xd2\x8e\xf2\x0e\x8d\xc9\xf6\x01\x91\x1c\xa2\xe6\xdb\x3f\x5e\x82\x34\xd7\x75\x26\x80\x2c\xa3\x73\x1b\xfb\xd5\xc7\x4b\xc7\xa4\xbc\x7c\x18\x47\x67\x9e\xcc\x9d\x8a\x3a\x9b\x4e\xad\xf7\x64\xf8\x73\xae\x1f\x09\xf3\xf1\x03\x94\x6e\xfa\x12\x02\xff\x66\x35\x74\xd0\x28\x0c\xeb\x98\x86\xe3\x21\x13\x30\x7c\x60\xda\x8e\x87\xf4\xc2\x95\xc3\xb2\x1f\x42\x96\x61\x27\x0f\xa6\xfc\xc4\x43\x42\x61\x4a\x14\x53\x82\xe2\x21\x4d\x70\x2e\x98\x2a\x14\x0f\xf1\x86\xe4\x01\x53\x89\xe2\x21\xcf\xe0\xf4\x31\xc5\x28\x24\x0f\xf0\x29\x58\x82\x74\x8f\xa1\xd1\xc1\x1e\x7d\x2c\x65\x0a\x64\x68\xdd\x09\x76\xb7\x7a\x0b\x3a\xbb\xf9\x38\x70\xb5\xaa\x8a\x56\x93\x2d\xa5\x96\x6d\x4e\x88\xf5\x63\xbd\x9f\xe7\xec\xba\xb4\x75\xcf\xbe\x84\x50\xc3\xa3\x9d\xd1\xfb\x24\x00\x40\x3e\xa1\xf7\x22\x50\xe0\xa9\x3f\xd8\x3e\x81\xd4\xdd\xdb\x70\x1b\x39\x48\xc9\x34\xf3\x41\x12\xe7\xf6\x40\xc3\xe4\xcc\xbb\xeb\x8f\xbd\x32\x8e\xfb\x02\x64\x10\xcd\x00\x6a\x6f\x4a\x4a\x56\xcf\x9d\x6f\xf3\x6b\xf7\xa5\xe9\x7a\xce\xa7\x16\xca\xc7\xd1\x73\xd7\x26\x68\x9a\x66\x59\x59\x3e\xf5\x75\x8e\x2b\x0e\x20\xd9\x68\x52\xbd\x92\x53\x1f\x1f\x1c\xd2\x54\x26\xe5\x5a\x7f\x72\x3d\xd3\x29\x62\xfd\xb8\x4a\xba\xfd\xda\x6c\x3c\x59\x70\xe3\xc3\x5f\x45\x27\xae\x09\xfc\xa3\xd5\xf0\x2a\x84\xca\x03\xd3\x70\x3c\xe4\x13\xdc\x84\x58\xc6\x43\xc8\x20\x0c\x51\x58\xf6\x43\x48\x36\x2d\x6c\x69\xc1\xca\x13\x00\x19\x39\xc2\xff\x3e\x43\x3d\xfc\x3f\xaf\xb4\x37\x7c\xa3\xb1\x49\x15\xf4\x3d\xd8\x89\xf5\xfc\xe5\xdb\xce\xe9\x43\x46\x03\xec\xf2\xe2\x67\xa6\xde\x79\x0c\xa4\x9e\x63\x9f\x53\xc4\x01\xc4\x0b\x9d\xe3\xb8\xa4\x09\xc0\x44\xe2\x66\x8b\xa5\x9e\x8f\x95\x53\xa3\x83\xea\x4e\x7a\x7f\x0f\x61\x71\x97\xf7\x27\x5d\xef\xf0\x98\x56\x7d\xe3\xdd\x13\x8b\x96\x8b\xf6\xed\x63\x1a\x2e\x39\x8f\x32\xc7\xe4\xd9\x36\xd3\x2b\xea\xec\xdf\x4c\x35\x33\x13\x96\x31\xe2\x76\x56\x29\xa7\xeb\x1e\x00\x16\x1c\x40\x32\xd0\xb9\xae\x97\x62\x17\x1e\xee\x9c\x7c\x6f\x41\xf0\xc3\x5a\x03\x79\x74\xc3\xfe\xd7\xcb\x6d\xca\x0f\xcf\xf4\xb4\xa4\x7d\x64\x2c\x8f\x07\x18\x50\xef\x72\x50\xf4\xc6\xb3\x3c\x9e\x2e\x60\x72\x94\xf9\xf4\xc8\x6c\x77\xad\x8a\x67\x80\x6d\xba\xf5\x5b\x42\x2a\xcf\xa0\xac\xe7\x67\xbc\xe6\x09\xcc\xa8\x1b\x04\xfe\x6d\x9a\xd0\xa1\xc3\x70\x0d\xb0\x66\x0a\x21\x5e\x7b\xe7\x0d\x63\xb2\x7b\x97\x1a\x6c\x5e\xc2\x9a\x2f\x84\x64\xc0\xa0\x87\x35\xe5\x3d\xb2\x0e\x77\x2d\x66\x4e\x08\x0f\x69\x87\x86\x61\xe6\x85\xf0\x90\x39\x48\x13\x30\x73\x43\x78\xc8\x0a\xbc\x3a\x31\xd3\x43\x70\xfa\x90\x58\x61\xa5\x88\x20\x64\x13\xde\xe9\x98\x59\x22\x3c\x24\x04\x0a\x42\xcc\x4c\x11\xbc\x6d\x21\x7b\xc5\xca\x16\xed\x91\xc4\xbd\x97\x0b\x63\xa5\x8d\x80\x0c\x09\x81\xff\x7f\xaf\x48\x44\x1f\xc2\x01\xad\x0f\xe6\xda\x16\xb8\x9c\xf2\x22\xeb\xc8\x64\x84\x4e\x38\xc5\x76\xc5\xc5\x79\xe4\xe5\xbc\x10\x62\x7c\xc5\x78\xf8\xf5\x81\xdd\x67\xa0\xb3\x6a\xa5\x01\x0f\x89\x45\x7f\x5f\x30\x5c\x7a\xa5\xbe\x28\x71\xa9\x57\xfe\x42\x02\xc5\x8d\x01\x85\x99\xa7\xa1\x1e\xba\xd7\x0f\x90\x06\x3d\xc7\x01\x64\x16\x4d\x2c\x84\xc4\x3d\xa2\xa3\x6a\xd8\xb8\x04\xcd\xfd\xf9\x62\x7f\xa5\xc4\xfa\xf4\xfd\x26\x7c\x3a\x1f\x45\xd5\xe7\x5a\x34\xa5\xee\x20\x1c\x8a\x03\x48\x23\xfa\x12\x21\x0d\x2e\xba\x54\x70\xe8\x78\xb5\x8a\x93\xe4\x8f\x84\xe9\xea\x9d\xdb\xc5\x4f\xb6\x62\xd7\x18\x4e\x93\x70\x70\xfa\x4d\x91\xcc\x6d\x08\xfc\x9b\xd9\x7b\xc2\x14\x9e\x28\x2c\xcb\xf7\x7c\x0a\x17\x1b\xcb\x78\x08\x99\x85\xa1\x15\xcb\x7e\x08\x69\xdc\x7b\xbb\x25\x56\x16\x0f\xc8\x92\x13\x10\xfc\xf7\x77\x94\x56\xb4\xab\x76\xae\x8d\x8b\xdf\x13\x9f\x88\x54\x0d\x91\x69\xac\x97\xf0\x3f\x1d\x94\xb5\xb8\xa1\xa3\x23\xd2\xe5\x71\xe2\xc1\x45\x27\x77\x19\x49\x1c\x40\xfa\xd1\x4b\x37\x2d\xa6\x3c\x8f\x24\xbf\x26\x9e\x51\xae\x79\xf7\xfe\xfe\xd6\x99\x71\x42\x96\x2f\x55\xba\x9b\x9c\x6d\x09\x6c\x9e\x99\x72\xfa\x6e\x38\x80\xe4\xa2\xb5\xaf\xc4\xeb\xb4\xf5\x1d\xdb\x73\x62\x9f\x7d\x32\xb3\x3e\x11\x68\xe7\xf5\x8e\x0e\x06\x98\x75\x56\x96\x5c\x70\xd7\x94\xbc\x78\x60\x92\x19\x07\x90\xd7\x68\xed\xbb\xfd\x25\x79\xf3\xc5\x25\x45\x1a\xc4\xc0\x83\xe0\x52\xb0\x76\x52\xd9\x12\x0b\xbf\x61\xd9\xc2\xd3\x7d\x7f\x08\x48\x33\xc7\x0e\xb4\x0b\xfc\x9b\xd9\x7b\xeb\x00\xef\x4f\x2c\xcb\x21\xa4\x1f\x2e\x1d\x96\xf1\x10\x92\x0b\xe5\x2f\x96\xfd\x10\xf2\x1a\xca\x5f\xac\x7c\xea\xde\xcd\x06\x2f\x43\xcc\x94\x2a\x1e\xf2\x02\x5e\x86\x98\x69\x55\x3c\xa4\x08\x5e\x20\x58\xa9\xd5\x3d\x8f\x11\xc2\x5e\x45\xac\x1c\x2b\x90\x21\xab\x27\xf1\xde\xe5\x9e\xff\xf3\x2a\x10\xa2\xac\x1e\x79\x1f\xaa\x6b\x87\x2f\xb9\x92\xe6\x46\x2c\x11\x6e\x9b\xc5\xd3\x0e\xbe\x16\x35\x95\xd4\x3b\xa0\x5e\xf5\xe3\xc6\xe5\xdd\x0b\x17\x3d\xfe\xaa\x1e\xa9\x46\xd0\xb5\x46\x75\x42\xfe\x30\xe5\x4e\x5d\xc1\xc4\xb9\xb9\xaf\x67\x27\x5c\xce\x09\x3c\x77\xef\xc3\x85\x76\xc8\xeb\xe1\x00\x32\x8e\x4e\x9c\x53\xdc\x2c\xb0\x66\x0f\xae\x50\xdc\x78\x7e\xc2\x4c\x7c\xf1\xda\xe2\x8f\xab\x0a\x07\x25\x9d\x04\x24\xc2\xbe\xab\x66\xe8\xdc\x35\xac\x01\x00\x09\x40\x47\xfd\x19\x56\xd9\x9d\x1f\x65\xb3\x06\x43\x52\x3f\x98\xd2\x87\x29\x06\x4d\xb9\xcd\x19\xaf\x10\xfa\x23\x3e\x3b\x86\x67\x56\x34\xff\x8a\x03\x64\x0b\x9d\xb2\x6e\x7f\xb9\xff\x64\xcb\xa1\xb0\xe7\xec\x26\x84\xe1\x7f\x9a\x39\xba\x29\x29\x39\x2f\x9d\xac\xad\xe7\xb0\xef\x8e\x15\x1c\x7c\xff\x62\x14\x07\x90\xc2\xff\xc9\xc9\x56\xb0\xb4\x79\xc7\x98\xe6\xb7\x5d\xc9\x8a\x5a\x2e\xab\x22\xa3\x5b\xd4\x4e\x4e\xad\x1c\x61\xf3\x2d\x6c\x5b\x8c\xeb\x0e\xa9\xc2\x01\x64\x09\x3d\xdd\xf2\xb3\x51\xc7\x5b\x7c\x94\x67\xaa\x3a\xc4\xa3\x9d\xce\xab\x12\x79\xa9\x6d\xb1\x2b\x1a\x1c\xb9\xc9\x94\x31\x90\xfb\x62\x3f\x65\x97\xc0\xbf\x79\x71\x8f\xf7\xc3\x8d\x84\xe5\xc8\xbd\x78\x07\x21\x98\xbe\xc4\x43\xc6\xa1\xf8\xc6\x74\x27\x4c\x4d\x42\x52\x81\xe5\xd2\xbd\x74\x05\xdc\xae\x58\x5e\xdd\xcb\x00\x42\xa1\x88\xe5\x58\x08\x59\x22\x5c\x01\xff\xd7\x70\xa1\x6e\xaa\x90\x2b\xd9\xdf\x1a\x76\x46\xc6\xec\x91\x7b\x0e\x49\xd5\xed\xc0\xaf\x96\x32\xc7\xc2\x4e\x0a\xb7\xee\xbf\x2b\x96\xcb\xd5\x00\x64\x77\x2a\xb7\x77\xa2\x8e\xa3\xd6\x8f\xda\x4a\x4a\x3e\x5c\xe7\xd3\xf4\x01\x5f\x0f\xd1\x12\x1b\xce\xab\x2d\x4c\x97\x08\x5e\x66\xe9\x11\xe7\x9e\x75\x9a\x3f\x5a\x39\x6d\x01\x00\xd2\x88\xce\x91\x6b\x68\xdd\x11\x65\xea\xed\x0b\xbe\xc5\x54\xfe\x5d\xd6\xef\xac\x39\xd5\x97\x78\x89\x0f\x56\x94\xd6\x34\x83\x04\x57\xf8\xe5\x07\xf3\x00\xb2\x84\x2e\xb5\xb7\x37\xae\xd1\xd9\x51\xfc\xd5\xf1\x32\x0f\xf1\x6a\x2b\x5a\x55\x52\xbb\x21\xd0\xe0\x73\xd9\xc8\x74\x47\xe5\xc9\x97\xde\xd1\x59\x41\x0f\x80\xe0\xd0\x77\x78\x78\xc8\xe0\x52\xa1\xe1\xc4\xdb\x79\xb9\x97\xc6\xb3\xc1\x1a\x99\x7d\xaf\x38\x6e\x44\xa9\x1f\x3e\x95\xd0\x40\xbd\x13\x53\x5a\xf9\x14\x20\x95\x68\x4a\xeb\x4f\x56\x75\x92\x80\x65\xcb\x27\x44\xdb\xf5\x0f\x03\x59\x03\x3b\x83\x6e\xd0\x03\xf5\xe8\x2c\x31\xb5\x81\x1a\x1e\xee\x52\x57\x33\x80\xac\xa1\xb5\xce\xe1\xbb\x64\x85\x3a\x0b\xf4\xfc\x9e\x1f\x82\x6b\x7a\x79\x2d\x52\x54\x7a\xa6\x6e\xfe\xd9\x12\xe3\xf5\x69\x13\x0f\xcd\x72\xba\xd1\x0e\x00\xf2\x0b\x9d\xbd\x64\x16\xf5\xda\x6c\x0a\x51\x30\xbf\x22\xf6\xfa\x68\x6a\xfd\x87\x07\xa7\xac\xfa\xbc\xa6\x4e\xc9\x81\x00\xe3\xe4\x9b\x74\x43\x76\x27\x00\x32\x8b\x56\x6a\x45\x0f\x89\x2c\xb3\x86\xce\x9e\xe6\xfb\x6b\x4a\x2b\x6a\x97\x59\xf3\x86\x87\x9d\x4e\xaf\xee\x0d\x5d\x19\xf7\xa9\x41\xbb\xa6\x21\x6e\x0f\x80\x64\xa2\x9d\xe3\xa6\x99\xac\x71\xa9\xe4\x00\x17\xc5\x1b\x73\x99\x67\xd5\x55\x76\x1d\xea\x75\x96\xed\x53\xab\x12\x9c\xd3\xa9\x15\xe5\xd9\x12\x23\x00\xa9\x44\xc7\x9f\x99\x70\x3a\x81\x5b\xc5\xf3\xae\x38\xfa\xfc\x40\x0f\xe9\x8b\xfb\xb3\x44\x9a\x57\x02\x7d\x4e\x1f\x26\x71\x22\xf4\xbb\xf7\xc7\xd2\x1e\x20\xeb\x68\xe6\x73\x45\x2b\x97\xbe\x60\xa6\x45\x8c\xd6\xc2\xcb\xcf\x94\x5a\xde\x28\x6d\x54\xb8\xbb\x8c\xa0\x34\x32\xbb\x94\xc0\xb3\x7d\x52\x28\x1b\x35\xb4\x99\x4c\xad\x87\xa3\x5c\x21\xf7\x4a\xcf\x55\xdb\x1a\x3d\xde\x32\x09\xd7\xa9\x40\x9e\x84\xd8\xee\x68\x49\x2b\x2f\x3a\x7b\xdc\x0f\x1c\x40\x96\xd1\x87\xbe\x1b\xa7\x3e\xac\xcc\xff\xd1\xc9\x32\x74\xe3\xc2\x67\xeb\x81\xa2\xf4\x5c\xd9\x02\xc2\x8c\x53\x4f\x0e\x1a\x2b\x04\x58\x08\x09\x22\x00\x20\xe9\x68\x92\x44\x49\x38\x81\x70\x75\x06\x76\x0a\x79\xb9\x27\xf5\x96\xf7\x90\xaf\x1b\x04\xd3\x65\x5b\x58\x9d\xe6\x6d\xfb\x5c\x92\x11\xbd\xa1\x02\x90\x1d\xf4\x26\x20\xd1\xfb\x91\xbd\xb0\xf9\x80\xf4\x93\x92\xf0\xad\xec\x5f\xab\x45\x0c\x3d\x17\x37\x2f\x32\xaf\xbf\x4b\x33\xf0\x6a\x61\x1a\x8f\x6f\x44\x0d\xbd\x63\x45\xc2\xfa\x9d\x91\x6b\xc7\xe2\x68\x8d\x62\x34\x3d\xcd\x19\x3e\xf3\xe0\x89\x58\xb6\x53\xf2\xb9\x1d\xd4\x63\xca\xaa\x8b\x91\xa8\xa1\x67\x5e\x7c\x12\x7a\x7a\x55\xcc\xd4\x89\xc8\xc0\xeb\x40\x59\x79\xba\xf2\xab\x39\x7d\xfd\xc3\xe1\x09\xef\x1f\x75\xf6\x53\xeb\x52\xbc\x45\x37\x35\x58\x7e\x37\x7e\x10\x75\x1f\x67\xe0\x6d\xf3\xec\x08\x73\x84\x29\x4e\x22\xe9\x94\x73\xb6\xe6\x49\xa5\x97\x4d\x39\x51\xeb\x57\x0c\x71\x00\x59\x40\x33\x15\x8d\xb8\x69\x69\x9e\xed\xf3\x1c\x6d\xba\x7e\x71\xdb\x19\x5d\x2d\xfb\xb3\x8d\xdf\xf8\x4f\x34\x16\x7d\x55\x7e\x37\x2e\xd0\x6c\xaa\x85\xae\x38\x2e\x3a\x5c\x98\x0c\x54\x7a\xd9\x48\x39\xf1\x90\xbe\xe2\x3b\xfb\xc1\x21\xee\x0d\x85\x93\x5e\xca\x32\xeb\x7f\xfa\x32\xae\xc8\x5e\x41\x17\xbe\x79\xa8\xef\x7c\x27\x48\xa5\xcb\xa1\x4d\x4c\xbd\xe8\x69\x4b\xa3\x71\x9e\xf9\xd5\xa9\xec\x0d\xab\xc8\xfb\x33\x9d\xab\x3e\xad\x8a\x1e\x40\xfa\x24\x3a\xf0\xdc\x22\x0f\x3a\x63\xc7\x56\x78\x98\xad\x61\x7f\x6c\x25\x4f\xca\x91\x93\x08\xb7\xc1\xc1\x9b\xf1\x72\x84\xcd\xe7\x5d\xcc\x78\x35\x81\xb4\x36\xba\x51\x2e\xa1\xac\x56\x83\x2f\xeb\xe3\x82\x06\xe3\x5f\xfe\x13\x21\xae\xfe\x85\xd4\xa1\xc6\x2e\x9f\x3f\xd8\x25\x5e\xb2\xfc\x7c\xc5\xa5\x10\x20\x21\xe8\x83\xe6\x6d\xfc\x22\x39\x59\x9e\x52\xbe\xe6\xe5\x71\x9d\x17\x15\xd9\xae\xce\xc2\x67\x0d\x2f\xa9\x34\xfa\xb6\xdb\x74\x58\xb8\x13\x0a\xf6\x79\x00\x24\x1e\xbd\x43\x5c\xfd\x8d\x62\x08\x9c\xaa\x9b\x09\x8b\x3c\xe7\xf8\x1f\x56\x5f\x0e\xb8\xad\x23\x70\xf7\x00\x55\x41\xe2\x66\x48\xd9\x89\xc2\x27\x95\x00\xf9\x85\x3e\x39\x3a\x99\xfb\x23\x93\xdf\x5c\x8e\x6b\x56\x2a\xe0\xcc\xdf\xc9\x63\x3f\xfd\x5e\xec\xf6\x56\xa0\xc3\xb3\x60\xff\x02\x6b\x5e\x05\x0e\x67\x80\x4c\xa1\x7f\xfd\xde\xa3\x9f\x24\x13\xc4\x9a\x24\x2f\xfb\x99\xca\xb7\xc6\x98\x68\xcd\x83\x9c\x03\x6c\x84\xfe\x3e\x8e\x95\x16\x1e\x30\x7a\x5a\xea\x09\x00\x92\x86\xbe\xb4\x2e\x2d\xb6\x10\xec\xf3\x7e\xdc\x95\xfe\xb0\x84\xb7\xb7\xda\xec\x98\x93\x46\xa8\x63\x52\x77\x58\x84\xf4\xd9\xf4\xed\x27\x3f\xa8\x3e\x01\xa4\x02\x1d\x92\x47\x2b\x22\x6d\xfd\xed\xe7\x8f\xac\xb3\xde\xf8\xa8\xf5\x71\x8d\x48\xd4\x39\x97\xf7\xef\xa5\x14\xde\x4f\xb3\xf3\xeb\x99\x83\x7e\xd6\xe8\x70\x99\x4d\xe5\xe6\xac\x6c\xd5\x9c\x38\xfb\x35\x54\xdc\xc9\xbd\xc1\x71\x8b\xf5\xfa\xef\x95\x17\x2f\xdb\xab\x33\x9f\x9f\x38\x7b\xaa\x01\x9d\xc7\x91\x90\x62\xab\xe9\x19\x92\xe2\x5d\x48\x62\x19\x71\x4f\xfe\x2a\x2b\x66\xb6\xe2\x99\x37\x73\x2e\x3a\xd9\xf7\x51\xad\x41\xdc\x0d\xd4\x50\x31\x5d\x45\x15\x5b\x9b\xda\x2a\x6a\xc2\xfd\xc5\x7f\xf9\x4a\x4c\x80\xcd\x89\x63\xdf\xd3\xd8\x57\x86\xd8\x5e\x6b\x7a\x28\x65\x3f\xc5\x01\xe9\x63\x68\x62\x3a\xfb\xed\x5e\xbd\xd5\xbd\x63\xc2\x39\x57\xa2\x95\x1e\xdc\xa5\x8b\xbc\x32\xec\xea\x13\x7f\xcd\x32\x82\xb3\x87\x6f\x7f\x93\x67\x33\x7a\x4f\x79\x92\x57\x53\x3e\xec\xba\xa6\x2f\x24\xb1\x13\x93\xc3\xf4\xd7\x35\xa6\xdc\xe7\x71\x1a\xf3\x10\x13\x13\x43\x83\x98\xdb\xcf\xbb\xa8\xa1\x7c\xc3\x9f\x4e\xb7\x65\x8c\x44\x30\x9a\xcd\x71\x2c\x25\x69\xee\xc8\x20\x6a\x7e\x2e\xe1\x3c\x42\xe9\x8d\x75\x85\x5a\xbd\x1c\x33\x1e\x00\x29\x43\x57\x7f\xc1\xe2\x97\xdf\x2e\x5a\x26\x1e\xba\x2a\xf9\x1c\x4f\x06\x1c\xf2\x68\x26\x29\x1b\xb6\x5c\xd2\xdb\xab\xa8\x42\xce\x24\x11\xcb\xdf\x05\x48\x1d\xfa\xf2\x3b\x8b\x73\x7b\xa7\x50\xe6\xbc\x66\x7e\xce\xfb\xc9\xdb\xb3\xd9\xde\x5e\x29\xf2\x8f\x17\x71\xd4\x0e\xec\x45\xd6\x62\x76\x9f\x59\x55\x00\xd2\x8b\xe6\x31\x03\x35\x0b\x9e\x7d\xf7\x99\x07\xae\x99\x85\x9e\x08\x29\x0f\xe9\x52\xa2\x9e\xbb\xfd\xb5\x67\x71\x2d\x9b\x11\x37\xf8\xf4\xd1\x48\x17\x00\x88\x07\xba\xed\x29\xfb\xf6\x53\xfb\xd5\xb9\x42\x0a\x82\x69\x84\xa6\x6a\xec\xf9\xdf\xd3\xde\xc1\xa3\xfc\xb3\xad\xe4\x1e\x8a\x8b\x41\xef\xfe\x4c\x6e\x00\xa4\x19\xbd\xbf\x9b\x2b\xe4\x88\x5c\x05\x2e\x5d\x04\x96\x62\xdc\x39\xc4\xe2\x8f\xf5\x7c\x6d\xd8\xdc\xa9\x46\x94\xdd\x7e\x94\x54\xbf\xcf\x7e\x86\xee\x49\x90\xef\x5d\xa5\x2d\x3c\xa1\x4b\xb9\x53\x10\xf9\xad\xf0\xa2\xf0\xd7\xca\x71\x4a\x7a\x01\xce\xbc\xf9\xf1\x68\x19\x47\x8e\x93\x27\xe4\x01\x40\xa2\xd0\x96\x77\x4f\x16\xd8\x1d\xd6\xd3\x15\xec\x9d\x0e\x6a\x29\x35\x0c\x58\x7a\xb7\xae\x73\x37\xcd\x92\xb0\xb3\x48\x9d\xc3\x99\xd3\x26\xa8\x13\x20\xd5\xe8\xbd\x7d\xfd\x68\xa6\x7a\xee\x79\xf1\x24\x87\x1a\x93\xb5\x76\xdc\x23\xa6\x27\x46\x95\x79\x3c\x52\x86\xc6\xa4\x27\x53\x72\x0a\x08\xaa\x97\x01\x40\xca\xd0\x51\x81\xdd\xf4\xfe\x01\x42\xd1\xaa\x45\x86\xe4\x46\x5c\x18\x5d\x89\xc7\x39\x7e\x0f\xb6\x47\x6e\xb2\x4f\x7f\x92\x87\x17\xfc\x95\x9f\xe2\x03\xc8\x1c\xda\x1a\x19\xc9\x7d\x99\xb9\x52\x3c\x1d\x73\x63\x4c\xa6\xde\x1e\x1e\x97\x0c\x4a\x26\xd3\x6f\x1f\x76\xeb\x3c\x13\x26\xc8\xc4\x28\xd4\x4f\xe0\x01\x90\x26\x74\x14\x11\xac\x9d\xba\xde\x64\x21\xa1\x50\xfc\xf0\x88\xe9\xe1\xca\x55\xa6\x81\x89\x8f\x62\xb3\xfb\x0f\xe7\xc6\xb5\x8f\xe4\x06\x47\x8f\x2b\x00\xe4\x1b\x7a\x55\x7f\x78\xe5\x48\x28\x09\x8b\x6b\x6e\xde\x2f\x3d\x66\x23\x2c\x4e\x36\x40\x69\xb5\xf0\x5c\xc2\x69\x8d\xa8\x4b\xb8\x41\x98\x34\x7e\x3f\x40\x56\xd1\x93\x6d\xba\x30\x4f\x56\x51\xf3\x96\xf3\x77\x2b\xbd\xb9\x0a\xfd\x77\x2f\xf2\xb3\x47\x3c\xb7\x63\x0e\x7d\x7d\x28\x7c\xf4\xc4\x61\x15\x49\xf4\x27\x4b\xd3\x16\xe2\x2e\x5c\x08\xe9\x53\xfa\x13\x7e\xdc\xd7\xd4\xa0\x26\xd7\xfa\x82\x6a\xbe\x86\xee\x40\x7b\xe5\x50\x8b\xcb\x83\xac\x1f\x3d\xf8\xbf\x90\x63\x12\x1a\x59\x6e\xb6\x50\x82\x5d\x9a\xdf\x85\x0e\xf5\xcf\xcf\xc4\x88\xfb\x1c\xd4\xfa\x75\x71\x5c\x62\x9f\xee\x7c\xaf\xe6\x9b\xe4\xfc\x03\x5e\xba\x39\xaf\x98\x34\x6f\x24\xc8\x3a\xcd\xee\xd2\xf6\xb1\xff\x69\x8f\xa9\x78\x65\x5f\x4e\xe3\x42\xa5\xb4\x1c\x4c\x67\x29\x34\x9d\x72\x7f\x23\xc7\xfb\xf2\x23\x77\xc5\xe3\x43\xf1\x13\x1b\x61\x53\x2d\x38\x80\x64\x12\xff\x0f\x95\x70\xbf\xf6\x69\x68\xe9\x45\x22\xdd\x15\x13\x35\x79\x5b\x8a\x6f\x6a\x36\x60\x24\xb7\x7a\x3e\x3d\xb0\x90\x25\xc0\x99\x64\x57\x6c\x66\xa2\xed\xe9\x92\x65\x1e\x37\x8d\x78\x67\xbe\x12\x95\xd1\xb5\x75\x1f\x71\x2d\x10\x6a\xbf\x16\x7f\x38\x94\xba\x6e\xa9\xef\xe9\xea\xe3\x8b\xcf\x70\x00\x59\x45\xef\x77\x3b\x1e\x09\x2d\x17\x75\xe7\x11\xee\xab\x42\x47\x06\x1d\x55\x7c\x4e\xb5\x6d\x9d\xd2\xd9\xae\xfc\x5d\xfc\x44\xee\x45\xd3\x98\xb5\x1f\x0e\x20\x2f\xd1\xeb\x5a\x5d\x9c\x1d\x7b\xe9\x69\x22\xd3\x76\xce\x6d\x6e\xb1\xef\x72\x5a\xfb\xff\xfe\xfe\x30\x71\xc7\xca\xff\x51\xa7\xbc\x19\x93\x15\x09\xfe\xd5\x2c\x58\x6e\x01\x32\xee\xff\xf7\x7f\x49\x58\x9b\xc2\xf2\x0c\x84\x8c\x41\x7a\x8c\xe5\x1c\x08\xc9\x84\xf4\x18\xcb\x3f\x7b\x10\x68\x18\x96\x8b\x20\x64\x15\xd6\x0c\xb1\xbc\x04\x21\x2f\x61\x1a\x06\x93\x20\xe3\x21\x8d\x30\x81\x86\x45\x92\x21\x64\x09\xd6\x72\x31\x79\x32\x1e\x82\x83\x19\x03\x4c\xae\x8c\x87\x54\xc2\x5c\x28\x26\x5f\xc6\x43\xd6\x68\xf7\x96\x12\x83\x32\xe3\x21\xbf\xe0\xba\x60\xd1\x66\x08\x99\x85\x75\x02\x4c\xe6\x0c\x57\x1f\x7a\x0c\x93\x3d\xc3\xe9\xc3\xec\x07\x16\x83\x86\x90\x75\x3a\x98\xa5\xc4\xa2\xd2\x40\x96\x8d\x80\x80\xdb\x03\x07\x90\x78\x34\xe5\x3d\x4f\xb3\xc6\x23\x44\xa5\xfb\x25\xa7\x56\x83\xc1\xea\x60\xc0\x61\x7a\xd9\x57\xea\xed\xbd\x03\x09\x4e\x7d\x4f\xf9\x22\x34\x2f\xfe\xc1\x01\xe4\x1b\x9a\x51\x9f\x38\x42\xc0\x71\x27\x8f\xc3\x90\xd7\x86\x63\xdb\x0c\x48\xf1\x47\x66\x0b\x07\x7a\x8f\x5e\x51\xd2\x24\x3d\x39\x79\xf7\xdc\xc8\x59\x00\x90\x5c\x74\x94\xc8\x19\xbb\xd3\xa4\x77\x7d\xf0\x6c\x17\xbd\x26\xeb\x4a\xe3\xb3\x84\xb3\x02\xcf\x65\x98\xee\x9c\xf7\x1b\xcb\xb2\xbd\xe2\x63\x95\x42\x07\x90\x25\x34\x03\xea\xbf\x54\x35\x19\x71\xfb\xc0\x59\xa2\xbe\xf2\x1f\xac\x6c\x84\xd5\x53\xc7\x12\x29\x13\x06\xcf\x7e\xf8\xda\x20\x79\xfe\xab\xcb\x0a\xfe\x4d\x60\x58\x56\x43\x07\xc5\xc3\x5d\x88\x69\x38\x1e\xf2\x0d\xa6\x1c\x31\x6d\xc7\x43\x72\xe1\xca\x61\xd9\xbf\x77\xa2\x60\x22\x00\x53\xd3\xe0\x21\xcb\x30\xdd\x80\x29\x6b\xf0\x90\x74\x38\x17\x2c\x69\x03\x21\x3b\xfb\x56\x1a\x89\xfe\x4d\xe3\xec\x6e\xa9\x60\x8f\xdd\x88\x16\x8c\xde\x22\x57\x37\xbe\x4d\x5a\x3d\xbd\x72\x92\xd1\x8d\x67\xaa\x38\x70\xc1\xf8\x13\xd5\xc9\xaf\xa7\xa2\xc7\x0c\x76\x72\xbe\x8e\xbd\xd9\x3e\x4c\x89\x03\x48\x36\x9a\xbf\x7d\xae\xbe\x23\xc7\xfc\x62\xf8\xc5\xf5\xb9\x7b\xa5\x44\xa2\xd7\x6a\x5c\x54\xd5\xaa\x86\x03\x5d\xb2\x8e\xcd\xb1\x55\x64\xda\x39\x9c\xdf\x9d\x3a\x5a\xf4\x3c\x48\x7a\x5c\x6b\x46\xff\x5e\x84\xbd\xe9\x48\x9f\x45\xb2\xee\x10\x75\x61\x6f\x07\x1f\x81\xfe\xb9\x96\x5f\xce\xfe\x6a\xfc\x4b\xca\x38\x80\x6c\xa0\x23\x9a\x85\xbb\xcb\x65\x8d\xef\x36\x1b\xa5\xbe\xd9\x89\xa7\xe6\xc4\xf6\xdb\xd8\x5d\x75\x5e\x4e\xe5\x22\x0a\xd6\x5c\xad\x52\x49\x4f\x2c\xc5\x01\x69\x1e\xd4\x70\x8f\x8b\xf7\x0a\x6d\xbc\xf6\xfb\xc4\x19\x9c\xe4\x0b\xf3\xe4\xb3\x9c\xd3\x7e\xee\x9f\x75\xd6\xbb\xc5\xed\x3d\x55\x13\xab\x38\x95\x3b\x0e\x20\xfe\x68\x2a\x31\x1a\xb9\x31\xe3\xfa\x7c\x88\x92\xe2\xd9\xf5\x8b\x47\xd5\xf8\xdb\x3d\x7e\x67\x13\xa9\xfd\x8c\xf3\x28\x62\xc2\x1d\x75\x9c\x7f\x56\x21\xf0\x6f\x5e\x81\x0b\x10\x0c\xd7\x0c\xcb\x31\x10\x92\x0d\x0b\x2f\x58\xbe\xd9\xdb\x4c\x30\x07\x8c\xe5\x1e\x08\xd9\xa0\xc2\xff\x69\x16\xcb\x45\x78\x88\x34\x0f\xfe\x21\x58\x4e\x82\x0f\xf1\xdf\x7b\x97\x14\x96\x6e\x06\x32\x55\x6c\x24\x9e\x38\x80\x84\xa0\xdf\x25\x75\x7b\x96\xfc\xd2\xd4\xd1\xc2\x91\x5b\xfb\x6f\x45\x3d\x42\xbe\xb0\x8c\x2e\x18\x1d\xa1\x08\x2f\x96\xd4\x49\x17\x98\x61\xb4\x92\xa2\xc2\x01\x24\x02\xdd\x89\x7b\xd8\xe2\x6a\x4f\xf8\xa5\xf2\x4c\xb7\x9f\xe5\x37\x48\xd5\x9b\xb9\x9e\x75\x09\x3f\xff\x49\x56\xfa\x28\x78\xc9\xf3\xf9\xc4\xa7\xe8\x78\x1c\x40\xa2\xd1\x84\x9d\x8c\xfe\xb4\xee\x37\xe1\xd6\x5b\xde\x05\x0c\xbf\xea\xe9\xe7\x3f\x4f\xd1\xdc\x18\x79\xaf\x58\x7e\x95\x5a\x57\xe3\xfe\x25\xc3\x6c\x75\x1c\x40\x5a\xd1\xbb\x8f\x2e\xcf\x50\x27\x59\x4c\xfc\xf0\x85\xfd\x25\x99\xe1\x97\xe3\xe8\x5c\xfe\x58\x67\x4a\x3c\x7b\xe2\x64\xcd\xf5\xa6\xd4\xd2\x78\x2c\x44\xe0\xdf\xcc\x86\x0e\x0a\x81\x7f\x03\xc4\xb2\x1c\x42\x22\x60\xc2\x1b\xcb\x78\x08\x89\x86\xa1\x18\xcb\x7e\x08\x69\xa5\x5a\xd9\x22\xfa\xb7\x34\x06\x90\xbd\x4a\xb0\x4f\xda\x67\x77\xb3\xa3\x5d\x1b\x74\x40\xd5\x2d\x86\x3b\xbe\x52\xfb\xcc\xdb\x7a\xa6\x37\x95\xbf\x35\x05\x2d\xcc\xd3\xca\xc3\x42\x2a\x02\x9b\x4b\x85\xce\x2f\xca\xed\xd2\x1d\x34\xb5\x25\xe2\xe7\x2c\x1e\x2c\x54\x97\x37\x4e\x2c\x1a\x6b\x21\x97\x1f\x63\x51\xdc\x6f\xa1\x70\xfe\x2d\x57\x78\xdd\x87\x2f\xbf\x3e\x3f\x8f\xc3\x01\xe4\x0b\x7a\xa9\x2f\x1c\xa4\xfd\xb6\xac\x93\xe9\x39\xe7\xef\x46\x7d\x71\xe9\x16\x91\x05\xbb\xd7\xca\x11\x70\xef\x9a\x6c\x59\x89\x80\xec\xcb\xc0\x68\x1c\x40\x7e\xa0\xc7\x3b\x9d\x88\xf0\x60\xcb\x51\x61\xb8\xab\x7e\x7b\x23\x4a\xf0\xaa\xf3\x0b\x55\xcf\x55\x67\x52\xf7\xd6\xb5\x83\x5c\xa9\x71\x37\xda\x54\x70\x00\x99\x46\xab\x7d\xb2\xb0\xed\xe1\x04\xaa\xe5\x53\xe4\xb9\xea\x46\x15\x3c\xd5\xd1\xb3\xac\x4c\x26\xcd\xab\x64\x5f\x1e\x19\x0b\x16\xeb\x5e\x3c\x44\x8e\x03\xc8\x26\x3a\x2b\x48\x10\x73\x98\x59\x29\xe2\xfa\xcc\xd0\x42\xe6\x22\xc3\x83\xd3\x25\xc9\x84\xef\xed\xbd\xd4\xa4\xf3\xaf\xc6\xb9\x6b\x30\xa7\xd3\x24\xe3\x00\x92\x87\xde\xda\xc9\x5f\x6e\x39\xb1\xed\x7b\xaf\xd4\x4f\xb3\x63\x70\x6d\xa7\x31\x86\x96\x93\xd1\x85\xd3\xd1\xec\xb4\xbc\xf7\xc1\xbf\x87\x3b\x27\x6d\x05\xfe\xcd\x8d\x7b\x37\x0d\x5c\x64\x2c\x4f\xee\xd1\x4d\xc8\x83\xb1\x9c\x09\x21\x5f\xe0\xee\xc3\xf2\x27\x84\xfc\xd8\xdb\xb0\x18\x2e\x85\x90\x69\x48\x6a\xb1\xbc\x0a\x21\x9b\x90\x3b\x62\x39\x16\x42\xf2\xe0\xe1\xc3\xca\xbc\x41\xc8\x02\x39\xbc\xd0\xb0\x52\x70\x40\x96\x48\x9a\xe0\xbf\xcf\x7d\x7a\xfd\x4f\x8a\xc0\x8f\xb4\x52\xbe\xea\xf6\xf0\xc4\x0d\x0f\xb2\xb1\x1e\xc0\x60\x6b\x38\xd4\x3d\xdd\xa5\xb7\x3a\xd6\x49\x47\x69\x4c\x10\xb4\xbe\x4b\x83\xd1\x2d\x6a\x02\x12\xd2\x99\x91\xae\xc4\xb7\x16\x46\xe7\x4f\x6c\x7c\xe1\x17\x66\x0f\x18\xfe\x3b\x1f\x1c\xdb\xb8\xcf\xac\xf4\x4e\xcd\xe0\xd1\xfb\x38\x80\xc4\xa1\x15\x99\xae\x44\xb6\x56\x9f\x35\x6f\xed\x6a\xae\x7c\xfc\xeb\xd9\x44\x57\xef\xad\x68\x4e\xf2\xab\xb1\x43\x6b\x87\x27\xc3\xda\xef\x11\x37\xe0\x80\x34\x3b\x6a\x78\x1d\x65\xce\x64\x96\x8e\x92\xde\xe4\xf5\x91\xb0\x5b\x8e\x32\xac\x54\xc7\xce\xf6\xe7\xd0\xbc\x23\x7b\x18\xff\xca\xe0\xb1\x21\x49\xa3\xc0\xbf\x59\x0d\x1d\xe4\x05\x77\x21\x96\xe1\x7b\xac\x1f\xf6\x26\x60\xd9\x0e\x21\x71\x74\xf8\xe0\x85\x65\x3f\x0c\x5e\xec\x2b\xaf\x88\xff\x2d\x21\x0a\x64\x49\x48\x09\x7d\x77\xef\xb3\x01\x74\x9d\x77\xfe\xcd\xb5\xcd\xe6\x07\x55\x4b\xd7\xd8\xab\xb7\xee\x4a\xcf\x66\x88\xb9\xc7\x89\x3e\xcf\xfd\x40\x1d\xdd\x3c\x24\x23\x2a\x13\x63\xba\x4b\xd0\xd0\xf7\xd9\x03\x49\x9f\xb8\xe6\x6e\xf3\x93\xbf\x89\xae\x87\x8d\x28\x18\x4c\xf0\x64\xff\x61\x33\xa3\x75\x23\xdd\x56\x10\x50\xc8\xf9\xbc\xd9\x85\x03\x88\x0f\x3a\x79\x79\x84\x73\x92\xee\xd3\xb7\x02\xdc\x6a\xfe\x4e\x57\x92\x01\x4b\xf3\x4e\x7d\x6c\x9e\x62\x93\xc1\x0f\x92\xb3\x81\x79\x8f\xb9\x72\x56\x00\x40\x02\xd1\x1b\xa9\xdb\x3b\x6d\x38\xf5\x66\xe3\x12\xc3\x93\x9e\xc9\xf1\x34\xd7\xc7\xd2\x95\xb6\x59\xaf\x1d\x78\xbc\x54\x02\x3f\xa7\xcf\xf4\xf2\xaa\x01\x64\x11\xcd\xe3\x2e\xa5\x7e\xe8\xc9\xa4\x5c\x48\xf6\x1f\xd3\x14\x4d\x62\x59\x7f\x25\xdf\x8f\xc4\x9f\xb3\x19\x0e\xe0\xe9\xcd\xbb\x31\xc9\x40\xf4\x1a\x07\x90\x7e\xf4\x74\x49\x3a\x02\x7f\x27\x70\xb9\x51\xc4\xfe\x79\xa0\x9c\xdc\x67\xb3\xba\xd9\x68\xe0\x5d\xc6\xa5\x09\x26\xd5\x8d\x35\x66\x5e\x68\xee\x5e\x67\x1d\xe8\xc8\x18\xf6\xfd\xbe\x8f\x68\xf3\x7a\x4a\xb2\x69\x65\x7b\xf6\x81\x23\xf5\x2d\xb2\x53\x43\xb3\x97\x99\x36\xbe\x88\xb0\xa4\x71\x2d\x5d\xd9\xc4\x01\xa4\x16\x6d\x4f\x41\xfd\x7a\xb5\xa7\x0b\x75\xae\xe1\x8d\x5a\xdd\x3a\x96\xb1\xa0\xa5\x55\x37\x09\xb3\xf0\x87\x0b\xca\x1b\xdd\xdf\x3c\x24\x2e\xc7\x0b\xfc\x9b\xd7\xe1\x96\x18\x80\x05\x6a\x2c\xc7\xef\xf1\x69\x78\xfd\x61\xfa\x1e\x0f\xf1\x81\xda\x11\xd3\xfd\x78\x48\x20\x3c\x11\x58\x4b\x00\x21\x8b\x7b\x44\x1f\x63\x15\x20\xa4\x1f\x4e\x1f\x6b\x21\x20\xa4\x03\x4a\x67\xac\xb5\x80\x90\x5a\xf8\xa1\x59\xcc\x32\x01\xfe\xdc\x9d\xc4\x23\x30\x4b\x05\x78\x84\x36\x6c\xe8\xc6\xa8\x16\xec\xb1\x28\xe8\x62\xcc\x82\x01\x94\x92\x50\x7e\x61\x16\x0d\x60\xaa\x01\xae\x3d\x66\xe1\x00\x0f\x99\x82\x4f\xc1\xac\x1d\xe0\x21\x69\x30\xf4\x61\xd5\x0f\x20\xa4\x82\x12\xf6\xc8\x60\x15\x12\x80\x2c\x19\x05\xc1\x7f\x6f\xd9\xea\x46\x73\x91\xc4\x93\xa4\xca\x86\xd1\x42\x11\xc8\x61\x2f\x1d\x52\x1f\xba\xbf\xe9\xa3\x6b\xfb\xfb\x2a\x06\x28\x5b\x2c\x13\x0f\xb8\x2b\x84\xec\xd2\xec\x62\xb4\xc8\x2b\x7d\xcf\x41\x7f\x28\x80\x7b\xf6\xba\x91\xc2\xb7\xdf\xe4\x07\xb9\x4a\xe6\xb5\x0b\x6a\xd7\x8c\xc7\xad\x29\x3c\x0b\x05\x95\x8d\xd5\x70\x00\xf1\x43\x73\xa3\x3c\x43\x83\xb2\x13\xdf\xd2\x07\x88\x92\x4c\xc6\x19\x57\xac\xab\xb5\x9d\x53\x0f\x7d\x6a\xa6\x23\xf7\x72\x8c\xc0\xc5\x49\x6e\x65\xef\x4a\x05\x74\x1e\x43\xc1\x8a\xf4\xb4\xc5\xe1\x63\xb9\xaf\xa8\x2e\x97\xdb\x73\x4d\x9e\x10\x6a\x26\x4a\xa8\xed\x1c\xec\x59\x78\x3e\x9a\xec\x48\x9b\x85\xff\x08\x35\x96\xd9\xd0\x43\xdd\x30\xd2\x63\x59\x0e\x21\xc5\x50\x85\x61\x19\x0f\x21\x7e\x90\x82\x60\xd9\xbf\x27\x90\xf6\x41\x3e\x81\x55\xd8\x01\xb2\x87\x48\x08\xfe\xeb\x03\xfe\x8b\xa6\xb5\x46\xe7\xbf\x12\x4e\x8f\xe1\xc4\x3a\x7b\xdc\x6d\xcd\x56\x2f\x2e\x51\xf0\xbe\x99\x1f\x88\x17\x28\x60\xa1\x3f\xf7\x54\xf9\xaa\x4c\x3b\x0e\x20\x59\x68\x5a\x1b\xa3\x15\x7b\x93\xea\x61\xeb\xf9\x0c\xcf\x14\xd6\xd9\x53\x4a\x61\xb2\xb8\x6f\x8b\xe6\xf6\xf1\xd9\x41\xcb\x93\x41\x72\xfa\x0b\xbe\x00\x20\x89\xe8\x1c\x8e\x8e\x05\xf3\xcf\x3a\x81\xa4\x92\x64\x8a\xae\xc3\x37\xd4\x1f\xaf\xb1\x7f\x2d\xeb\xd9\x29\xad\x2c\x6e\x66\x12\x67\x6f\x9d\x8b\xe2\x00\x48\x21\x7a\xe5\xda\xfd\x17\x6b\xaf\x9b\x6c\xa7\xea\x5e\x44\xf2\xc3\x3e\x2f\x59\x6c\x27\xe7\x47\x2a\x66\x96\x17\x37\x64\x8d\x1c\xf5\x4e\xa0\x5f\x16\xf8\x37\xab\xa1\x83\xfe\x42\xf2\x88\x69\x38\x1e\x92\x05\x4f\x10\xa6\xed\x78\x48\x22\xcc\xdf\x60\xd9\x0f\x21\x85\xfb\xe0\xeb\x66\xb1\xea\x6c\x40\x56\x8a\xc0\xf7\x8e\x37\x0e\x20\x4b\x68\x57\x09\x50\x7a\x64\x93\x87\xe7\x32\x2d\x68\x26\xc7\x8c\x28\x4f\x18\x27\xc8\xde\xb4\x21\x64\x5e\x6d\x4e\x6d\x0e\x23\x3b\xd6\xa9\x25\x8f\x03\xc8\x3b\x74\xcb\xce\x66\xc3\xfc\x0e\xe9\x01\x49\x92\xe3\x17\xcf\x3c\xfd\xc9\xc8\x64\x66\x49\x60\xc5\xaa\x15\xf8\x5d\x7f\x61\x9c\x3f\xab\xb9\xfd\xce\x6e\x44\xce\x45\x13\x8a\xe0\x73\x96\x97\x8a\x94\xb8\x13\x7f\x2a\x66\x7b\xf0\xba\x5d\x3f\x7e\x33\xe6\xe6\x42\x7f\x50\x9d\xcc\xe8\x11\xc6\x83\xb7\x3b\x4b\x0f\xe2\x00\xe2\x8d\x3e\xa4\x73\x6f\x87\x6f\x7d\xed\x7b\xcd\x1d\xea\xf0\x6d\xc0\x37\x55\xcf\xf1\xda\x0f\xcb\xa6\xd0\xf6\xb1\x47\x40\x62\x2c\x64\xc1\x66\xcb\x1a\x07\x90\x14\xf4\xce\x9b\x7d\x45\xb9\xff\x18\xc1\x97\x4d\xc7\xe8\xc8\x5f\xaf\xc8\x2f\x08\xa9\xb2\x04\x55\x9e\x8f\x52\x8f\xbf\xe7\xcd\xa3\xe2\x13\x2b\xb6\x2b\xa8\x26\xd1\x4c\xf6\xab\x92\xbe\x8b\xab\xb1\x72\x44\xdc\xa7\x40\xf1\x62\xce\x6b\x89\x83\xd9\xa4\x41\xe9\x4a\x6b\xc7\x06\x08\x88\x66\xec\x2e\xa6\x98\x0a\xfc\x9b\x5b\xf6\x92\x6e\x30\x1b\x88\xe5\x19\x08\x79\x07\xbb\x6f\xb0\x9c\xb3\x97\x0d\x84\xb7\x3e\x96\x7f\x20\xc4\x1b\xde\x03\x58\x2e\x82\x90\x14\xb8\xcd\xb1\xbc\x04\x21\x93\x07\xf1\x91\x15\xab\x70\x0b\x23\xeb\x31\x18\x27\xb0\x0a\xb8\x40\xd6\x9d\x00\xf9\xef\x3d\x3d\x2f\xd0\xe2\x82\x9c\x3c\xb6\xe9\x17\xb8\x71\x53\x84\x39\xd3\x6e\x3a\x20\x6c\x5a\x54\x4b\x82\xb6\x82\xf5\x8c\xe6\x98\xbb\x17\x6d\x70\x3e\x68\xc5\x01\x64\x15\x7d\x79\xf0\x9a\x93\x73\xeb\x15\xad\x73\x2c\x0a\x57\x6d\x31\x0e\xc5\xaa\x3d\x0e\xc8\xe0\xf4\x60\x8f\xea\x72\x69\xb1\xbb\x91\x7b\x7e\xf9\x21\x0e\x20\xdb\x68\xce\x5c\x72\xd2\x41\xe9\x14\xd2\x1d\x53\x43\xb0\xa0\x7d\xa7\x4d\xfc\xb9\xc4\x33\xc7\xc3\xd5\x97\x55\xe6\xc2\x9b\x9b\x94\xf8\x65\x25\x76\x2f\xbf\x0a\x74\xf2\xd0\x5a\x7f\x24\xcd\x37\x73\x32\xf6\xd3\xf5\x73\xa9\xb6\x02\x69\x4d\x6a\x99\x2c\x9a\x4f\x02\xf8\x9b\xac\x09\x57\x2f\xbd\xe7\x7b\xf3\x58\xe0\xdf\xcc\x86\x3e\x7d\xb1\xf7\x85\x5d\x0c\xcb\xf7\xaa\x3c\xf0\xea\xc0\x32\x1e\x42\xb6\x21\xef\xc4\xb2\x7f\x2f\xc4\xef\xe9\x4e\xac\x82\x3a\x90\x25\x24\x24\xfa\xef\xcb\x00\x29\x68\x3e\x5f\xf0\x43\x0e\xe1\xa0\x5e\x3e\xf2\xe7\x87\xed\x32\xbb\xfb\x40\x11\x8e\xbb\x25\x90\xe1\xd9\xa5\xf3\x4f\x46\x0f\xfb\x3e\xad\x0a\x51\x03\x48\x1b\x5a\x5d\xc8\x45\xbf\x3d\x97\x7c\x8c\x41\x58\xfd\xe5\x3e\x49\x25\x8b\x85\x27\x84\x29\x74\xe6\xbf\xd4\x5e\x27\xdf\xe5\x1f\x77\x67\xe5\xda\x08\xc3\x01\xa4\x0a\x4d\xe7\x5f\x88\x75\x18\xc9\x6a\x5d\x5d\x68\xe1\x39\xe2\xa7\xd0\x2d\x35\x49\x7c\x88\xb6\xdc\xf7\x7a\xd1\xa4\x30\xaf\x21\xb3\xa9\x73\x56\x16\x0e\x20\x1f\xd1\x0c\xc2\x24\x65\xa3\x20\xff\x4c\x65\x92\x7d\xdb\xc3\x5e\x97\xdb\x73\xd4\xf1\x16\x41\xa7\x29\xfd\x0b\x89\x37\x1a\x6b\x1e\x77\xdc\xd1\xc8\x16\xf8\x47\xab\xe1\x01\x82\xfc\x17\xcb\x72\x08\x69\x83\xac\x11\xcb\x78\x08\xa9\x82\xc4\x1c\xcb\x7e\x08\xf9\x08\x79\x04\x66\x67\x03\x1e\x52\x06\x21\x98\xdd\x0d\x78\x48\x1d\x2c\x50\x61\x76\x38\xe0\x21\xbd\xb0\x6e\x8a\xd9\xe4\x80\x87\x78\xc0\x8a\x26\x56\xa3\x03\x84\x34\x53\xc0\xff\x39\x61\x76\x3c\xc8\x70\xbb\xd3\xec\x5e\x39\xf3\xe8\x2b\xe7\xe8\x60\x26\xd5\xcd\xc8\x1b\x92\xaa\x9f\xa2\x8e\x66\xdf\x69\x34\x3e\x79\xf7\x62\x88\xb6\xa9\xbd\x85\x3e\x03\xf1\xc7\xdf\xf9\xcb\x9d\x38\x80\x0c\xa3\x4b\x54\x86\xa7\xd8\x77\x98\xf8\x2e\x9a\x12\x06\x53\x85\x1b\x9e\xb1\x1e\x57\x16\xff\xf1\x95\xfb\x6f\x5a\x85\x7d\x87\x92\x80\x6f\x8e\x25\x21\x0e\x20\x61\xff\xd3\x99\x70\x0f\xec\x23\x88\x6c\x5b\x39\x23\x42\x59\x20\xc1\xe1\xc8\x64\x13\x4a\x79\x2a\xc6\xa3\x48\x32\xe5\xb1\x6d\xf2\x48\xe4\xd4\x06\x0e\x48\xa3\x83\xde\x57\xa7\xd8\x87\x19\x96\x84\x81\xa6\x6a\xce\xb1\x67\x79\x64\x3e\xa6\xd7\xa6\x66\xb4\x3f\x3d\x77\xe2\x6a\xb8\xe0\x63\x5e\xe3\x47\x75\x02\xff\x66\x35\xf4\xcf\x3c\xbc\x71\xb0\x0c\x87\x90\x61\x58\x9f\xc2\xb2\x1d\x42\xc2\x60\xbe\x04\xcb\x7e\x18\x2b\x60\x40\xc2\x6c\x3c\xc1\x3f\x24\x0a\x6e\x28\xcc\xe6\x13\x3c\xa4\x1a\xea\x23\xcc\xfe\x13\x78\x38\xe0\xec\xb1\x7a\x50\x20\x64\x0e\x1a\x86\xd9\x86\x82\x87\x34\xc1\x65\xc1\x6c\x45\x81\x95\x46\x78\x04\xb1\xda\x51\xf6\x62\x07\x21\x0c\xc8\x58\x7d\x29\x40\x56\x85\x80\xed\xbf\xd3\xb1\x84\x16\x6e\xfd\xde\xd7\x46\x2c\xe2\x03\x0c\x4f\xb6\x90\x1d\xfd\xe8\x15\x4f\xf2\x68\x7e\xc0\xf0\x61\xf9\xd8\xc8\xc7\xce\x0a\x09\xa2\x13\x39\xc7\x70\x00\x69\x47\x8f\x7f\x2e\x96\x67\xab\x4a\x33\x33\xd0\x29\x38\x40\x65\xd0\x75\x5f\x29\xe9\x44\xd5\xaa\x38\x6b\x62\x1a\xb7\x0a\x3f\x67\x9e\x45\x8b\xe2\xee\x85\x85\x3e\x1d\xdf\x95\xd6\x38\x18\x09\xb3\x05\x62\x0d\xc3\x89\x4f\xd3\xfd\xa5\x5b\xe4\x89\x37\x68\x9e\x1a\x95\x37\x73\xfd\xdd\x30\x39\xcf\x3d\xb4\x4b\x84\xd1\x01\xd9\x95\xea\xd0\x8a\x4e\x90\x8b\x58\x9c\xe1\xa8\x24\xed\x6b\x62\xa1\x74\xa0\xc3\xe8\x21\xca\x35\x2c\x9c\xc4\x2a\xb7\xaa\x9f\x8a\xef\x07\xc1\x32\x7b\x8f\xe3\x41\xe1\x86\x65\x39\x84\xb4\x43\x08\x96\xf1\x7b\x77\x34\x5c\x6d\x2c\xfb\xf7\xe8\x3f\xf9\xca\xf0\xff\x7d\xb9\xd5\x37\xcd\x4c\x9f\xc1\xff\x18\x7f\x8c\x3c\x2b\x57\x41\xca\xb3\x27\x06\x7e\x5b\x36\x1a\xeb\x6f\x4a\xca\x3f\xe9\x86\x6b\x80\x67\xe6\x40\x76\x67\x67\x67\x27\x8a\x0d\x07\x90\x00\x34\xd9\x39\x7a\xc2\x60\xf3\x46\xd6\x48\xc4\xe8\xf1\x1a\x32\x9d\xfc\x15\x7f\xff\xdf\xd9\x71\x3b\xc9\x2a\x17\x7b\xe3\xf4\x62\x63\x06\xe2\x9f\x00\x80\x7c\x45\x87\xcc\x8d\xd3\x4c\x47\x8f\xc6\xca\x9a\x67\x90\x2c\xfb\x16\x04\x91\x09\x19\x49\x6a\xcb\xe8\x5d\x7f\x50\xb1\xea\xf1\xb3\x40\x58\xac\xb5\x03\x20\x7f\xd0\x4b\x41\x21\xe8\xfd\x53\xfb\xfe\x1d\xab\x57\xa4\xe3\xdd\xd7\x8d\x8f\x23\xaf\xed\xbf\x5b\xe8\x1f\x73\x03\x2f\xce\x92\xeb\xd0\xeb\x69\x4b\x79\x00\x24\x1a\x4d\xff\x2b\x1f\x13\x8b\xdf\x58\x5d\x16\x4c\x0d\x18\xe1\xc9\xdf\xb6\xa6\x38\xe4\x3b\xf0\x5b\xbb\x59\xc7\xf7\x38\x45\x46\xe9\x90\x8a\x1c\x0f\x40\x92\xff\xe7\xbd\xae\xfb\xbb\x74\x8d\x1d\xf3\x38\xb4\x63\x57\x35\xb8\xae\x4a\xbc\x98\xeb\xc5\x29\x97\x9a\xc9\xf2\x2f\x6f\x46\xf0\x11\xa6\xf5\xdf\x05\x48\x3f\x7a\xb2\x7f\xbd\xae\x39\x37\x6a\xab\xf2\xef\x97\x70\xfd\x16\x45\xa1\xd6\xc7\x40\x3f\x7e\x65\xf9\xd8\xfb\x7a\x4d\x63\xdb\x1d\x83\x00\xd5\x39\x0f\x80\xbc\x42\xa7\x13\x49\x96\xf9\x8c\xb6\x5f\x78\x4d\x6a\x69\x59\x0b\x51\x0c\xc5\x98\xa7\xd6\x44\x6b\x56\xcf\x1e\xeb\x72\x0c\x17\xfb\xa0\xed\x27\x29\x02\x90\xa1\xff\x79\x21\x24\xf1\xf0\xb3\x63\xa1\x25\x4b\x4e\xb4\xb9\x2c\x09\xaa\x9e\x5e\x3c\x6f\xbf\x53\xdd\xd5\xf9\xa0\xf1\xe7\xcb\x41\xab\x7d\xee\x2c\x46\x00\x99\x45\x4b\x11\x32\xc9\xd3\xd7\xce\x7c\x2b\xd5\xe6\x34\x4e\xe1\xed\xf3\x1a\x66\x77\xa7\x2f\x3c\x52\x72\xc1\x7e\xf6\x9d\xe8\x98\xc1\xcd\x7a\xe6\x65\xf4\x3c\x19\x5f\x93\x5e\xb6\x0b\xd0\x9e\x3e\x1f\x4b\x3c\x1c\xdb\xaa\xdd\xa8\x41\x12\x7b\x96\x5a\x45\x14\x57\xb2\x68\x67\xe7\xe6\x1d\x86\x1a\x5a\x68\xa7\x2d\xf9\xe4\x8e\x77\x46\x7a\x58\xe3\x14\xb2\x31\x25\x62\xb9\x8a\xf8\x64\x06\x26\x10\x73\x13\x3c\xdc\x39\xcf\x44\x67\x08\x00\xe2\xf9\x3f\x9f\xd7\xdb\x9f\x26\x73\x4f\xe0\xca\x65\xef\xe5\xca\x0b\xe3\x3d\xa6\x76\x66\x84\x53\x49\xd9\x6b\xb6\x32\x1f\x5c\x1c\x3c\x45\x34\xe7\xbc\x01\x52\x8c\x66\x70\xce\xcd\xc5\x12\xfd\x07\xfc\x3c\x6c\x5e\xaa\x2f\xbe\x1f\x2a\x7a\xdc\xaf\x32\xc0\x02\xb4\x1e\x8a\x39\x4c\xdf\xba\x7c\xfc\xe3\x91\x3f\xe8\x64\x6f\x7e\x86\xbe\xe6\xd5\x6f\xc9\x71\xbd\x9c\x13\x4b\xf3\x24\x14\x73\xe1\x11\x25\xa3\x9a\x0b\xf3\x3f\xe7\x24\x68\x25\x98\x9e\xdf\x46\x53\x74\xb3\xe7\xc3\xb7\xde\x57\xfc\xfc\x1d\x5f\x15\xf4\xae\x57\x72\xcb\x4a\x61\x46\x74\xe5\xae\xa3\xb7\x28\xf5\x4a\xb0\x64\xb4\x91\x3d\x00\xc8\x47\xb4\x15\x82\x4e\x8f\x0f\x5a\x7d\x3a\xc9\x97\x98\x25\x31\xf0\x5a\xa5\xe7\x1d\x5d\xb2\x4c\x00\x7f\xa5\x1e\x6b\x12\x87\xb6\x4d\x72\x64\x71\x0d\x40\x76\xd0\xbb\xaa\xfd\xcb\x5c\xe8\x6c\x4d\xa7\x5e\x93\x11\x75\x97\xf0\x79\x86\x42\xc3\x65\x93\xbc\x44\x2b\x0b\x16\x26\x2d\x76\x1d\x2d\xdc\xea\x57\x1c\x40\xbc\xd0\x0b\xd9\xe0\x52\x42\x62\xf7\x33\xbf\x87\x70\xe1\x6d\xa7\xc7\xc0\x0d\xa3\x01\xf5\x68\x3a\xd1\x31\xde\xaf\xf5\x27\xfc\x24\x8d\xf6\x2f\xbc\x42\xb7\x4b\x93\x3c\x89\x33\x9b\xcc\x5a\x9e\xd9\x6a\xad\x66\x20\x55\x62\xb0\x28\x36\xf7\x7c\xa6\x91\x17\xe5\xab\x73\xad\xe9\x61\xb6\x45\x16\x6a\xa8\x0b\x7b\x1f\x67\x77\xf9\xa6\x05\xcf\x02\x07\xdf\xa1\xd9\xb2\x5f\x7e\xe5\x64\x37\x1a\xaf\x86\xd1\x6b\x26\x0e\x9c\xb3\xa1\x6b\x0a\x06\x40\x5a\x0a\x35\xbc\xa8\xeb\x73\xd4\x79\x5f\x5c\x85\xd7\x85\x9b\x07\x29\xe2\xef\x97\x1c\x6d\xde\x58\x1f\x78\x4e\x96\xab\x46\x7e\x40\x9d\x30\x5e\xb0\x19\x20\x7f\xd1\x3d\x03\xf3\x37\x85\x4d\x07\xcd\xb8\x82\x5d\x40\x6b\x33\x20\xf1\x7f\xab\xaa\xb0\x21\xad\x5a\x5b\xc1\xbd\x52\xe8\x96\x2a\x90\xe4\xc6\x8d\x1a\x8a\x9b\xe8\xf5\xf0\x61\xaa\x89\xba\x57\xb0\x5a\x53\xb1\x1a\xda\xf9\xe7\xa0\xbd\xe5\x74\xf6\x35\xea\x03\x24\x3d\x63\x0f\xaf\xf9\xf3\x79\x00\xe4\x07\xba\x1f\x4f\xc5\xdb\x46\xec\x69\xc8\xda\xda\x77\x9b\x8e\xce\xd7\x2e\xa9\x4f\xb7\x52\x4e\xfe\xb9\x90\xcc\xc2\xcd\x9b\x9f\x23\x7a\xc3\x39\x7a\x1d\x20\xd3\xe8\x53\xc6\x35\xe8\x64\xe4\xcb\xa3\xe9\x48\x37\x45\x10\x5a\x61\xfa\x5e\xc9\xa3\x70\x88\xab\xbd\xb7\x8b\x23\x12\x29\xf8\x79\x60\xc2\x42\x12\x20\x8b\xe8\x68\x30\x21\xea\x77\x70\x2b\x77\xf1\x93\x15\x6b\x66\x58\x2e\xd9\xab\x36\x67\x72\xa6\x49\xf7\x54\xaf\x03\x89\x57\xe5\x78\x97\x8d\xc2\xb8\x71\x00\xe9\x47\x67\x14\x04\xc2\x27\x1f\x99\xe6\x8f\x49\x64\x3f\x97\xbe\xfc\xee\xe1\xa8\xc8\x38\x77\x71\xcd\xdc\xa9\xac\x96\xd4\xa5\x57\xd4\x6b\x57\x86\x94\x3c\x80\xb4\x32\x6a\xb8\xe7\x5b\x73\x8f\x4e\x4f\xab\xa0\xb6\xe5\xe9\xc3\x86\x14\x0f\x12\x95\x4a\x90\x77\x09\xd7\xd9\x3a\xaa\xb6\x9c\xec\x52\xef\x97\x1e\x01\x48\x3d\xfa\xd7\x15\xf2\x36\x95\xa6\xc4\x3e\x53\xf2\x1e\x63\x92\xb7\x7e\xa9\x77\xf9\x8f\xff\xc4\x35\x45\x13\xb5\xdc\xe5\xe9\xc8\x68\x89\x09\x32\x2d\x80\xcc\xa0\x37\xe2\x03\x9e\x3b\xf1\xc7\xc6\xf7\x1d\x9b\xd0\x9d\xfb\x59\x95\x48\x4f\xec\xc9\xe0\xcd\x90\xad\x50\x7d\x5d\xf4\xcd\xcf\xca\x94\xf7\xf2\x87\x00\x40\xc6\xd0\x93\x6d\x34\x6b\xe9\x6a\x3d\x4d\xe9\x90\xe8\x3e\x2b\x2b\x13\x43\x3e\xf7\xd9\xec\xed\x69\xe7\x87\xca\xaf\x6a\x88\xb7\xbb\x9a\xee\x4b\x15\x03\x64\x03\xbd\x71\x7f\xa7\xd5\x8a\x0d\xdd\x23\xc7\xbd\xe2\x31\x3d\x7d\x9c\xfd\xea\xd1\xf8\x24\x9d\xd3\x53\x0f\x85\xa6\x73\xc4\x28\x47\xd5\xf2\xdd\xe7\x70\x00\x79\x87\xfe\xf9\x73\xe2\x97\xc4\xb5\xca\xde\xa9\x66\x6e\x30\xf5\x86\x7c\x3b\xa6\xf4\xf1\xe8\x96\xc5\xd3\xb8\x1d\xc5\x32\xc6\x0f\x33\x01\xa3\x02\x6b\x1e\x00\x89\x40\x47\xd6\x07\x0e\x72\xb1\xb1\x3b\x5c\xdd\xaf\xdf\x2f\x46\x3a\x6b\x24\x1a\x93\x6d\x97\x94\xf4\x15\x7b\x31\x11\xf7\xc4\x09\xc5\xbe\xe0\x3a\x0c\x90\x28\xf4\x1e\x7b\xbc\xbd\x26\xe8\xb6\x19\x1c\xbb\x24\x55\x1e\xc7\xfe\xfe\x64\xd5\x90\xa9\x7b\x09\xdb\xf6\x8f\x50\x82\x7a\xa9\x1c\x12\xe2\x93\xbf\x01\x52\x84\xb6\xe6\x10\xeb\xcc\x24\xdd\x4f\x83\x13\xc2\xd7\x4e\x18\x0f\xdb\x25\xcc\x4c\xf0\x6d\x54\x08\x5e\x65\xdf\xdc\xfe\xf6\xd6\x67\x8b\x6f\xe0\x22\xba\x07\xcc\xc6\xe1\x88\xae\x6f\x6f\x5c\x57\xb9\x6b\x6b\xaa\xd0\x54\x71\x62\xbd\xa4\xed\xa3\x4a\x7a\xaf\xad\x9b\xc0\xe9\xcc\x9b\x63\x4f\x01\x40\x82\xd0\x5b\xf2\x74\x28\x69\xdd\x48\x0a\xd3\x46\x1c\x31\x7f\xf1\x6c\x95\x6c\xbf\xca\x88\x72\xae\xd4\x6c\x46\x79\x7c\x68\xe7\x5f\xb7\x14\xab\x54\x80\xe4\xa0\x2f\x39\x87\x7e\xea\xc9\x5e\xda\x6c\x45\x3a\x4f\x9b\xa1\xf2\xb9\x8f\xd1\x2c\x7f\xf7\xdd\x2d\xbf\x92\x93\xf2\x6e\x6d\xb6\xde\x38\x42\x38\x05\x00\x24\x11\x7d\xf1\xbf\x32\xd3\x31\x61\xa7\x77\xcd\xf2\x53\xd7\xd1\x35\x20\xf1\xa6\x35\xfc\xeb\xd7\x7b\xe1\xf6\xa5\xee\x14\x4a\x9f\xbc\xa7\x94\xbc\x4a\x00\x59\x43\x5b\x43\xc8\x61\x7b\xfd\xbb\xe4\x5a\xc3\xfb\xa8\xd9\x74\x92\x8b\xed\x0c\x1b\x86\xd6\x2e\xbd\x67\xc8\x4c\xd2\xdb\x82\x42\xcd\x2b\x23\x01\x00\x48\x24\xfa\xe6\xb7\x6d\x25\x22\x70\x6c\x51\xda\xdf\xb6\x53\xc9\x34\x2d\xf3\xb1\x50\x28\x50\xa1\xb8\xcc\x5d\x76\x18\x57\x1a\x70\xe5\x4a\x4f\xf3\x6f\x80\x0c\xa3\xad\x39\x5a\x5f\x4d\xdf\xcd\xd2\xfc\x60\x3c\x00\x71\xb0\x3f\x56\xd8\x1c\x26\xaf\x63\xda\x32\x11\x93\x64\x11\x8f\x58\x36\xdc\x92\x39\xb9\x6b\x3d\x7a\xd7\x7c\xf9\x96\x14\x5f\x03\x4e\x12\x92\xf9\xb5\x1f\x38\x26\x69\x9e\x4c\x2a\xbe\x15\x1c\x61\x30\xa9\x6e\x36\x52\x3a\x47\x40\xf8\xf0\x0f\x40\x92\xd1\x7b\xf8\xd0\xe7\x4b\xeb\x6f\xac\xd2\x16\x02\x88\xa7\x0c\x38\x17\x67\xe2\x3d\x97\x08\xbc\x0b\x36\xf4\x7f\xd2\x08\x13\x1b\xfa\x9f\x3b\xe9\x8c\x1a\x1a\xf0\x09\x91\x6d\x96\x4c\x94\x14\xda\xe6\x4b\x8e\xff\x96\xd4\xbb\x71\x2b\xae\xf3\x88\x59\xa1\xaa\x6f\xd7\x6b\x7b\x11\xa2\xdb\x1c\x00\x20\xe9\x68\x1d\x94\x12\x43\xa9\xd7\x32\x70\x68\xff\xf1\x78\x97\x6f\xae\x45\xdc\x7e\x0e\xe2\x37\x8b\x3c\x02\xf2\xea\x89\xa4\x62\x36\x92\xa4\x79\x92\x00\x52\x80\xd6\xfb\x46\xc2\xaf\x6d\x56\x5d\x24\x34\x8e\xd9\x9b\x37\x5d\x68\x38\x3b\x5f\x1f\xa3\x78\xa1\x66\x69\xf4\xc4\x24\xfd\xda\xb0\xa2\x4e\x57\x2c\x00\x48\x3c\x5a\xef\x33\x96\xf8\x33\x3d\x5a\xcf\xaf\x4a\x30\x96\x1e\xbb\x14\x6e\x69\xde\xf6\xae\x38\xd2\x31\x6e\xf0\xc2\x47\x0d\xe5\xc4\x5f\x16\xf9\xd9\x00\xc9\x40\xfb\x45\x8a\xfd\xca\xd4\xff\x63\xec\xbb\xe3\xb9\xfc\xde\xff\xad\x92\x51\x66\x89\x86\x91\x94\x06\x4a\x44\x65\xdd\x34\x54\x46\x12\x85\x48\x14\x2a\x8a\x6c\x8a\xd7\xb1\x47\xf6\x5e\x59\x89\x64\x64\x64\x67\x95\x15\x21\x2b\x15\xd9\x19\x59\x21\x9b\xdf\xc3\xfb\xf7\xed\xdc\xe7\xf3\xd7\xdd\xff\xf7\xd3\x7d\x5d\xd7\x39\xe7\xba\x9e\xd7\xf3\x3a\xaf\x9b\x42\x77\x81\xf4\x4e\x96\x13\x14\x27\xec\x9c\x92\x72\x84\xee\x6a\xfb\x6a\x54\x04\x0a\x39\x5b\xcb\xeb\x2f\xef\x7f\xef\x04\x30\x2f\x34\x17\xcc\xa9\x47\x4d\x48\xb5\x9e\x3b\xc7\xb9\xef\x4f\xda\xcc\xdb\xe5\xbe\x70\x65\xdd\x3f\x55\xaa\x5d\xbd\xc2\xda\x4c\xce\xee\xe2\x4e\xd6\x00\x7b\x89\x6e\x77\x7e\xa1\x71\xc7\x6d\xf7\xd8\xab\xbe\x9f\x89\x62\x51\xe4\xba\x96\x5f\xc2\xf5\xde\xeb\xb3\xea\xe9\xad\x8a\x07\xbe\x51\x5f\x51\xb1\xce\x07\xd8\x12\xca\x5d\x26\x5c\xb0\x73\x76\x82\xf4\xae\x25\x69\x24\x07\xf5\x38\xdf\x77\xb7\xbe\xcf\x2d\xaa\xe7\x9a\x09\xdf\xf0\xfe\x58\xa0\x79\x5d\xb3\x08\x00\x2c\x10\xfd\xf3\x1e\x2d\x83\xdb\x5f\x66\xac\x9b\x69\xaa\xde\xe6\xe9\x6b\xa6\xcf\x75\x66\x48\x5d\x0a\x17\x50\xa8\x3c\xa6\x35\xf1\x5d\xe0\x9c\xd2\x47\x80\x55\xa2\xb7\xd7\x0f\x2a\x34\x90\xdb\x14\xc8\x5d\xa2\x61\x2e\x8e\xd7\xa4\x1e\xf4\x54\x2e\x14\x6a\x57\xf9\x40\xe5\xb4\xab\x74\x35\xb3\x2e\x9f\x16\xfd\xba\x67\xbd\x58\xb5\x7e\x87\x47\xb2\xf3\x30\xfb\x13\x5e\xec\xd8\x0c\xcf\x56\xc5\xf1\xda\xd2\x4f\xf7\x2f\x3c\xb1\x79\x42\x73\xde\x1f\xcb\x10\xfe\x47\xaa\x28\x47\x4e\xf6\x7f\xbf\x2f\xa4\xfc\x23\xfc\x8f\x74\x11\x62\x6a\xa9\xff\x62\x88\x38\x23\x8e\x99\xa1\xf9\x8b\x21\xe4\x8d\x10\x13\xce\xfc\x17\x43\x48\x1e\x21\x26\x7e\xcb\x5f\x0c\x11\x83\xc4\x31\xdd\x30\x06\x84\x2c\x12\x62\x5e\x6f\xfb\x8b\x21\xa4\x92\x10\xd3\x4b\xf7\x17\x43\xc4\x27\x71\xcc\xf8\xd6\x3f\xa9\x94\xff\xc6\x2c\x81\x9c\xf4\x09\x32\x65\x57\x12\xc0\x92\xd1\xcd\x58\x9c\xbb\x79\x6a\xca\x85\xde\x7d\x49\x4f\xdb\x45\xdc\x2d\xb8\x64\x89\xd2\x22\xe0\x68\xd0\x41\xe3\x72\x3d\xa6\xc2\x0f\xec\x5d\x9e\x1b\x75\x0f\xcd\x90\xd2\xba\x5f\xb8\x4b\x79\x8f\xb0\xc7\x37\x4f\x7d\x50\x2b\x60\xde\xa1\x9e\xf3\xae\xd9\x97\x26\xee\xfe\x57\x36\xf3\x8a\xf1\x9d\x63\xf9\x00\x9b\x44\xe7\x43\xd9\x98\xa6\xae\xeb\xf8\x70\x56\x77\x81\x8f\xc9\x84\xca\x0c\x9d\xca\xda\x07\xcb\xcd\x8a\xda\xd2\xe7\x96\x0d\x84\x68\xc4\xb6\x8e\x91\x00\xd6\x84\xd6\xb1\x93\x11\x62\x0e\xda\x73\x32\x82\x7e\xf1\xd5\xbe\xbb\x9f\x3f\xba\x91\x9f\x5d\xef\x98\x70\xb2\x53\xff\x60\x97\xe1\xb2\xcb\x54\x52\x26\x00\x98\x2b\x6a\x8e\xd0\xd8\xcf\x57\xe1\xf4\xc1\x19\x2b\xe3\x91\x71\x6b\x9e\x1f\x68\xb6\xdf\x88\x56\xdb\xa9\x99\x37\x72\xaa\xd1\x27\xf2\xe8\x67\xe3\x00\x80\xc5\xa1\x8f\x9f\xea\xd3\x92\x56\x16\xd0\xb4\x31\x26\x7d\x64\x4e\xa3\xb1\xe7\xad\xeb\xa8\x8b\x52\x37\xfc\x42\xfd\xf6\xea\x29\x09\x35\x13\x32\x1f\x12\xc0\x12\xd1\x3a\x99\x77\x7a\xaf\x79\x82\x00\x4f\xc9\x91\x90\xd9\x02\xdb\x6d\xda\x51\xe4\xaf\x87\x67\xd4\x43\xd8\x1e\xec\xfa\xd3\xb3\xdd\x58\xdb\x77\x8a\x04\xb0\x76\xf4\xef\x17\xef\xb2\x61\x4c\x67\x51\x6c\x1d\x79\xb3\x95\x9e\x5a\x90\xc2\x2a\x8b\x47\xe4\x5a\x03\x5f\xf7\xf7\xc7\xbd\xfa\x6b\x52\x9e\x75\x6c\xc2\xff\x18\x74\xb8\xc0\xc9\x0c\x7f\x37\x05\x61\xe0\x21\x66\x90\xe2\x2f\x86\x28\xfa\x38\x66\x92\xf1\x2f\x86\x70\x05\x20\xa6\x89\xe5\x2f\x86\x70\x15\x20\xc6\x15\xda\x46\xb4\x14\x38\x26\x0e\x62\x88\x96\x03\xc7\x24\x92\xff\xc5\x10\x2d\x09\x8e\x69\xa7\x80\xb7\x9b\x09\x7b\x2f\x39\x56\x66\x32\x47\x17\x12\xc0\x92\xd0\xe5\xb7\xe7\x03\xfd\xc1\xcb\x6c\x9f\x8a\x52\x95\xa6\x74\xc5\xf9\x3f\x99\x32\xb6\x69\x84\xaf\xdc\x88\x72\xf8\xf0\xd4\xcb\xf7\x6c\xec\x0e\x12\xc0\xbc\xd0\xc3\x67\xcf\x60\xd5\x76\x65\x27\x9b\xdf\x31\x6e\x29\x96\xa6\x2c\x3d\x06\x85\xdb\xcb\x71\xe7\xc4\xbd\x2f\xcb\x3c\x6e\xde\x6d\xba\x47\xa0\x9b\x04\xb0\x09\xb4\x14\xe8\x49\x05\x44\x66\x5c\x25\xf7\x38\xc8\xb3\x3b\x75\xde\xda\xe9\x03\x2d\xf5\x72\xf6\x75\xb7\x44\xe3\x7c\x45\x11\x9a\x82\xf5\x87\x57\x48\x00\x9b\x43\x7b\xfc\x46\x32\xef\x89\x10\xda\x3a\xb2\xf3\x72\xcc\xa1\xbb\x9f\x0e\x0f\x1e\x70\xda\x44\x5f\x6c\x4b\xc6\x75\x67\x69\xa0\xd3\x20\x4a\x6a\x1e\x00\x0c\xa0\x75\x32\xeb\xd6\x71\xe9\xf6\x3f\xe3\x3a\x02\xe3\x77\x9d\x29\x25\xc2\x52\x4f\xfe\x7c\xac\xe4\x9c\xf6\x30\xb1\xa3\x5c\x42\xfe\xf8\x3e\x3e\x66\x80\x0d\xa3\x3f\x37\xea\xa8\x28\xdc\xc5\x70\xa0\xd9\xc8\x9e\xdf\xd6\x60\xe9\x06\xb5\x87\x5b\x53\xa0\xce\x5b\xf6\xd0\x91\x67\xbd\x5b\x6e\x9a\x7d\x49\x63\x11\xfe\xb7\xa8\xe0\x2b\x90\x04\x57\x9a\x28\x32\x38\xc6\x0b\x9e\x10\xa2\xe8\xe0\x98\x09\xaa\xbf\x18\xc2\x08\x41\xcc\x1c\x2c\x6b\x84\x51\x82\x18\x40\xff\x17\x43\x14\x2a\x1c\x33\xbc\xfd\x2f\x86\xb0\xa1\x87\x18\xe7\x1d\x7f\x31\x44\x5d\x3d\x8e\xc9\x65\x85\x33\x20\xa2\xfe\x1e\xc8\xca\x31\x72\x39\x93\x00\xf6\x1e\x1d\x38\x1f\xcc\xd9\x75\xb4\xf5\xf0\x7e\xd3\x2f\x35\xd6\xd1\x9b\xce\xa4\x77\xb3\xdc\x7a\x41\x97\xc6\x6d\x65\xe5\xea\xaf\xc4\x71\x42\x39\xbd\x9d\x04\xb0\xcf\xe8\xe1\xf8\x15\xf3\x43\xf2\xe2\xd9\xb5\xd8\x3b\xbb\x3b\x3b\x97\x1f\xb4\x4c\xcd\xc9\xcf\x57\xe6\x6f\x62\x0b\xff\xd8\x56\xbd\x4d\xa9\x44\xc4\x94\x04\xb0\x45\xb4\x74\x88\x30\xd6\x33\xe4\x67\x16\x9e\xba\x7d\xc1\x7f\x8a\x6d\x5e\x84\x21\x22\x48\xeb\xbe\x93\xe7\xf3\x31\xd9\x2c\x36\x23\x57\xa9\xd2\xaf\x1b\x19\x08\xa5\xa8\x47\xb7\x55\x1e\x26\xdb\xe5\xc2\xe1\xb9\xf8\xf5\xcb\xb1\x32\x09\x43\x16\xb7\x67\xc1\x86\x7d\x9f\xcd\x86\xbb\xf2\x0f\x34\x4f\x04\x3c\x17\xfe\x37\xb3\xf1\x08\xbd\xdf\xf4\x37\xaa\x44\xa6\xe3\x98\xcf\x70\x07\x13\x99\x8f\x63\x16\x61\xee\x25\x72\x01\xc9\xbd\x9b\xe1\x77\x91\x09\x25\x17\x39\x69\x32\xca\x9d\x1b\xb9\x2a\x14\x0d\x97\x7d\x46\xa6\x0f\x93\x3d\x87\x60\xf8\x85\x3d\x86\x4b\xa3\xb2\x26\x1f\x44\xa4\x2a\x77\x76\x4a\x77\x67\xcb\xfb\x6e\x4e\xa9\xd6\xc9\x25\x01\xac\x1e\xed\x5d\x58\x8d\x9e\xea\x5e\x6c\xb0\xa6\xbc\x55\x59\x65\x4c\xea\x5c\xe5\xc9\xe1\x7e\x5a\x2d\x31\x41\xde\x5f\x93\xf0\xa6\xe7\x80\x30\xfd\x4d\x12\xc0\xa6\x50\xe9\xc5\x6c\xa9\x24\xf0\x90\xb9\xfe\x96\x5d\x16\xec\xa9\x7a\x1c\x6e\xaf\x0c\x04\xcf\xcc\x3c\x7e\x4e\x57\x38\x72\xfa\x1c\xcf\x7e\x2f\x1b\x77\x12\xc0\xde\xa2\xad\xd4\x8c\xa8\xa6\x78\x8d\x9d\xea\xfb\x6d\x67\x3a\xef\xdf\x68\x95\x49\xda\xb6\x79\x14\x90\x82\xbc\x7a\xe3\x7f\x3e\x1b\x1e\x12\x3b\x9e\x40\x02\x58\x35\xda\x32\x58\x25\xf5\xf0\x9c\x8c\xdd\x3d\xa1\xae\x9d\x59\x7a\x34\xe6\x89\x54\x5d\xaa\x0c\xc3\xcf\x4d\xaa\x0c\x1f\xcb\xe5\x58\xae\x2a\x2c\xb7\x0b\xff\x9b\x9b\x78\x48\x43\x37\xff\x5d\x06\x22\x57\x71\x4c\x3d\xe4\x79\x44\xee\xe2\x98\x29\xc8\xf3\x88\x5c\xc6\x31\x6f\xb7\xfe\xc5\x10\xb9\x8d\x63\xaa\x99\xfe\x62\x08\x45\x36\x88\x29\x67\xfd\x8b\x21\x52\xda\x70\xcc\x3a\xe4\xe1\x44\x6a\x1b\x8e\x71\xc1\xbf\xa0\x45\xa4\xbb\x6d\x80\xb6\x38\x3a\x01\x80\xe5\xa3\xa5\xcd\xa9\xed\x34\x4d\x8a\x2a\x6d\x40\xef\x6b\x89\x50\xd7\x4f\xfd\x3d\xc6\xc5\xa2\x63\xa4\xc5\xe4\x2e\xfd\xec\xa5\x4c\x7f\xa3\xad\x77\x00\xb6\x82\x4a\x59\xc2\x45\x0f\x47\x0c\x52\x5e\x46\xfb\xeb\xe4\x15\xcb\xde\x2e\x4a\xa1\xa0\x97\xdd\x13\x71\xf6\x39\x85\x4b\x3d\xf7\xb5\xd5\x4c\xd5\xeb\x1b\x9c\xfd\x7f\x3e\x26\x61\x2b\xd3\xd5\xaa\x90\x4c\xc5\xf8\xe4\x25\xb7\xca\x3b\xfb\xa3\xf6\xef\xf5\xaa\x49\x7c\x46\x7b\x2c\x3a\xa8\x34\x46\xec\x6b\xbc\x49\x00\xab\x40\x2b\x39\x35\xe5\xb7\xf4\xa0\xc1\xf2\xc1\xc6\x9c\xb1\x86\x4b\x52\xae\x29\x9f\x3b\x7f\xd1\x56\x30\x47\xb5\x57\x45\x6f\xfb\x80\x09\xfe\x1a\x16\xfe\x47\xab\x61\x84\xf2\x61\xb9\x21\x32\x1d\xc7\xac\xc0\x4e\x85\xc8\x7c\xa4\x53\x81\x44\x89\xc8\x05\x1c\x53\xc1\x00\x57\x8f\x50\x0a\x95\x75\xe4\xa2\xdd\x28\x1d\x3f\x51\x1e\xf3\xe8\x66\xa2\x60\x58\x99\xa4\x59\x57\xbf\xfa\xc9\xd2\x0f\xf2\x06\x6f\xf5\x2b\x52\xf2\xa2\xbc\x04\x79\x9a\xee\xe4\xd8\xcc\x69\xef\x25\x01\x2c\x06\x2d\x35\x0f\x6c\x65\x03\x4f\x37\x50\xb2\xe4\xf1\xb4\xdc\x2a\x51\x4f\xcf\xa3\xe0\xa5\x2c\x8a\xbc\xe8\xda\xee\x40\xce\xef\x56\x18\xfa\xda\x97\x04\xb0\x51\xb4\x8b\xb8\x76\x6e\xea\xae\xf7\xc1\xe1\xd3\x3f\x0a\xc8\xbd\x75\xc5\x07\x7e\xce\xcc\xec\xec\xeb\xfa\xbe\x69\xf1\xed\xad\xed\x42\x60\x4f\x9d\x20\x09\x60\x85\xe8\x6a\xcf\x3d\x20\x9f\x5f\x38\x7e\x46\x23\x79\x7d\x5b\xd9\xa1\x07\x0d\x85\xb1\xe7\xb4\xba\x63\x12\x4b\xb5\x15\x1f\xef\xfb\xf5\x56\xe7\x7c\xa7\xf0\xbf\x99\x8d\x47\xe8\x27\x24\x18\x44\xa6\xe3\x98\x18\x58\x6e\x88\xcc\xc7\x31\xa3\x90\x82\x13\xb9\x80\x63\x0a\xe1\x94\x94\x50\x98\xfe\x8b\x91\x91\xfe\xfb\x1a\x22\x71\x1a\xa9\x6a\xf8\x8f\xb5\x88\x64\x6a\x20\x2b\xcd\xc8\xb3\xb1\x49\x16\x50\x76\xa9\xac\xb1\x7f\x5b\x9a\x30\x85\x07\x57\xbe\x34\x53\xfa\x87\x19\x96\xf4\xaa\xc9\xc7\x8c\xaf\xc9\xa2\x39\xf5\x7e\xbb\x9c\xd0\x90\x30\x21\x01\x2c\x1d\x2d\x50\xb2\xa1\x75\xfa\xd7\xee\xff\x4a\x2a\x9d\x3d\x2c\x90\xbf\xc5\x55\xef\xf9\xba\x1f\xd5\x6e\x0f\xcd\x93\xa3\x8e\xcf\x6b\xc4\x3c\xb8\xbb\x48\x00\x1b\x41\x0b\xa0\xea\xdc\xbe\xc6\x1b\x1d\xbe\xb7\x5d\xd7\x8d\xf9\x59\xbf\xfc\xd8\xfe\xde\x79\x77\x66\x52\x89\x40\x6b\x50\x2d\xab\xce\x3e\x23\xba\x8d\x02\x18\x8d\x4a\x8f\xcf\x19\x34\x8f\xdf\x1b\xf9\x7e\x55\xfd\x01\x45\xdc\x3b\xbb\x37\x25\xf7\xb4\x73\xc5\x36\x4f\xad\x3c\x50\xe3\x7e\xfb\x29\xe3\x48\xde\x80\xf0\xbf\x99\x8d\x47\x68\x01\x32\x3d\x22\xd3\x71\x4c\x3a\x2c\x38\x44\xe6\xe3\x98\x11\x58\xd8\x88\x5c\xc0\x31\xd1\x90\x51\x12\xce\x0c\x20\xa6\x13\x72\x1f\xc2\xc1\x01\xc4\x8c\xc1\x94\x45\x34\x3d\xc0\x31\xbf\x21\xe3\x27\x9a\x20\x20\x22\x0e\xbc\x77\x47\x38\x46\x80\x9b\x5e\xe9\xef\x6b\x08\x47\x09\xf0\x35\x75\x90\xf0\x13\xce\x13\x20\xe6\x17\xac\xb9\x84\x33\x05\xbc\xc5\x87\x21\x20\x1a\x2c\xe0\x98\x65\x58\xa7\x89\x86\x0b\x48\xae\x80\xef\x21\x1c\x30\x40\x4c\x30\xcc\x49\x84\x53\x06\x88\x09\x83\x55\x88\x68\xd4\x80\x63\x72\x18\xe0\x5d\x20\xc2\xa1\x83\x9c\x34\xd9\xe6\xff\x2e\xb1\x79\xa0\xc2\xed\x6f\xe3\x96\xf2\x8a\x99\x9b\xa6\x9f\x95\xfd\xab\xeb\x4e\xb3\xdf\x64\x57\xbc\xd6\x1d\x99\x64\x2d\x73\x61\xf7\x38\x0f\x17\xef\xf6\x7e\x80\x75\xa0\x0c\xf5\x62\xc3\x65\x99\xd3\x6b\xce\xd2\x86\x71\x03\xeb\x46\x9a\x94\x16\x96\x92\x39\x8f\x03\x06\x6e\x0c\x5f\x1b\xdf\xd4\xc4\x53\xf3\xc2\x8c\x04\x64\xd0\xfe\xe5\xfa\xa4\xdf\xe8\xb5\x97\x2a\x47\xf7\xa4\x1b\x35\xea\x07\x89\x2e\x89\x3c\xe6\xf6\xcd\xde\x59\x5a\xed\x7c\x51\x5c\x35\x94\xe5\x42\x01\x09\x60\xbe\xa8\xa8\xfd\xed\x42\x1a\xcd\x1f\xd6\xc5\x48\x6b\xb9\xea\x07\xa1\xda\x8f\xaf\xa4\x5d\x39\x58\xbb\xaa\xca\xea\xc9\x71\xee\xb9\x58\xa3\x97\x6d\xb6\xf0\x3f\x1a\x0d\x03\xe4\x01\xc5\x4e\x22\xcb\x71\x4c\x07\xfc\xf5\x14\x91\xf9\xf8\x39\x81\xed\x0b\x91\x07\xf8\x6b\x7c\xe1\x5e\x24\x9c\xff\xe0\x18\x98\x5e\x08\x87\x40\x10\x93\x0a\xd3\x18\xe1\x20\x08\x62\x9e\xc3\x14\x4b\x38\x0d\xc2\x53\x39\xb4\x8d\x70\x22\x84\xf7\x1b\x90\xd3\x13\x8e\x85\x20\xa6\x0f\xda\x46\x38\x1a\xc2\xfd\x81\xb1\x26\x9a\x0f\x21\x3a\x39\x2b\xbc\x4a\x44\x38\x29\x92\xe3\x22\x73\x64\xdd\xa8\xde\xe9\xdb\xff\xe7\xe2\xdc\x30\xab\x83\xf6\xd2\xa7\x9a\x30\xe9\xe7\x43\x3f\x0c\x15\x9c\x0e\xbd\xbf\x5e\xa3\x51\x39\xbf\x7c\xa2\xe7\xf9\x45\x37\xf3\x75\x12\xc0\x72\xd1\x76\xce\xb0\x61\xb7\x62\x4d\xde\x55\xf1\x87\x6d\xd5\x2c\x3b\xb7\xdb\xe4\x06\xb9\xa8\x88\xe6\xcc\x7e\x3c\xb3\xeb\x67\x1c\x23\x4b\x24\x6f\x25\x09\x60\xd3\xe8\xe9\xaa\x3f\xff\x80\xe7\xe7\x8a\x01\xd7\xd7\x93\xb2\xdf\xd5\x06\x40\x94\x02\x9f\x41\x3f\x65\xa0\xf2\xd4\x4e\x52\xc6\x9c\xcf\xab\xd5\x4c\x12\xc0\x96\xd0\xbf\x2f\xe3\xb3\xfd\x5a\x72\x5d\x40\x9f\xb0\x70\x56\xaf\x82\xcd\xcf\x0f\x0c\xf2\xe5\xa5\x9d\xe2\xdb\x1f\x48\xf0\x33\xd7\xbc\x19\xfd\xc0\x21\xfc\x6f\x66\x23\x95\x18\x56\x6f\x22\xd3\x11\xcd\x05\xb6\x64\x44\xe6\xe3\x98\x69\x78\xbc\x88\x5c\xc0\x31\x4b\xf0\x3d\x84\x73\x3b\x5c\x7b\x83\x2c\x81\x70\x78\x07\x31\x59\xb4\x7f\x31\x84\x03\x3c\x9c\x59\x40\xdb\x88\xa6\x78\x38\xe6\x25\xdc\xc2\x84\x93\x3c\x5c\x17\x84\xa5\x98\x70\x9c\x87\xbf\x07\x96\x3b\xc2\x99\x1e\x1e\x6b\x98\x65\x09\xe7\x7a\x10\x13\x08\xdf\x43\x34\xdc\xc3\x31\x95\x54\xf0\x4b\xf1\x44\x63\x3e\x20\x27\x4d\xce\xf8\xdf\xd7\x0f\x2a\xd1\x1e\xd8\x6b\xe6\xd0\x2a\xc6\x21\x76\xc2\x5e\xea\x2c\xb5\x6f\xc8\xe9\x0f\x3a\x47\xfa\x14\x25\x78\x6f\x37\x39\x9f\xac\x16\x0f\x89\x13\x35\x01\x00\x0b\x41\x5b\x6c\xf1\x95\xe5\xcb\x5b\xd7\xa9\x17\x27\xe6\xca\x7b\x55\xba\x5a\xda\xed\xc3\xa4\x56\x23\x6a\x5c\xae\x27\x72\x0d\x1c\xd0\x51\x4b\xd9\x04\xb0\x9f\x68\x79\x0c\x3f\x9c\xb8\x7d\x8e\xeb\x26\xa7\xef\xdd\x68\x1a\xb3\xa2\x87\xd6\x72\x01\x3f\xed\x42\x23\xa8\x12\x19\x7a\x42\xd9\xf6\xfe\x0e\x48\x27\x01\xac\x15\x35\x87\x8e\xba\x20\x36\x53\xe0\x28\xb8\x34\xbc\x6b\x44\x82\xc2\x71\x5b\xf0\xf3\x3a\xae\xed\x25\xb7\x7e\xb0\xb6\x87\xa8\x06\x33\x2a\x06\x6d\x98\x8f\x4e\xb7\x9f\x5d\x6a\xf0\xf2\xf9\x2a\x63\x4e\x71\xd5\xdb\x3e\xf7\xa7\x5a\xf4\xd3\xc8\x7e\xcd\xa4\x1b\x9d\x54\x97\xba\x17\x77\x5b\x85\xa4\xbb\x0a\xff\xa3\x97\x78\x44\x21\xf7\x24\xf4\x14\x62\x42\x60\x5b\x4e\xe4\x2e\xd2\x0c\xc2\x44\x4f\xe4\x32\x8e\x69\x85\xb6\x11\xb9\x8d\xf8\xc3\xfa\xc7\x97\xe5\xff\x83\x32\xfc\xe8\x53\x8c\xb7\x84\x26\xe6\x0f\x2b\xd4\xde\xaa\x31\x7e\xf8\x16\x3c\xb0\xb7\xae\x73\x7e\x19\xfb\x80\x55\x4b\x57\x6d\x6f\xed\x7f\x97\x08\x7f\x84\x71\x3a\x01\xac\x06\x65\x44\xa1\xea\x29\x0c\x01\xc1\x8f\xf8\x9a\x8f\xce\xfa\x61\x07\x5b\x33\xd2\x3d\x4b\x95\xc8\x12\x22\xc4\xee\x26\xec\xcc\xc9\xaf\xe6\xf5\x05\xd8\x34\x3a\xe6\x97\x39\xbf\x38\x65\x5d\x19\xcc\x78\x71\xbb\x6e\x0a\xe3\xb1\xbd\x2d\x0e\xc5\x7b\x19\x04\x18\xa8\x35\x86\xb7\xdd\xad\x9c\xbf\x79\x50\x13\x60\xeb\xe8\x78\x41\xf4\x6c\x6e\xe8\x23\x06\xc3\x01\xcc\xc3\x34\x44\x71\xf9\x32\x4d\x6b\x2a\x67\xe8\x9a\xcc\x87\x0b\x45\xbf\x0e\x7e\xca\xfe\xc6\xfb\x6b\x23\x43\xa2\x3b\x6a\xd8\x38\xad\x2a\x7b\x61\x6d\x74\x26\xfb\x4e\xb4\x80\xf3\xe2\x4b\x65\x4a\xcb\xfa\xc0\xf8\xc3\xa1\x17\x7f\xb0\x3a\xdd\x30\x62\x8c\x44\xcb\xc7\xc3\x97\xfb\xba\x96\x5d\x7e\xba\x68\x2b\x75\x51\x1d\x9e\xe5\x8f\xd0\x73\xe9\x56\x6e\x1c\x4f\x64\xd8\x94\x66\x7a\xf2\x0c\x9b\xad\x13\xc0\x2a\xff\x67\xd2\x71\x57\x85\x56\x75\x8b\xc3\xd7\x91\xad\x22\x7a\x94\xa7\x24\x0e\x75\x75\x27\x2c\x2f\xe8\x44\xad\xd0\x7a\xea\x9f\xda\xed\x56\x75\x04\x60\x75\x28\x37\x13\xd7\x75\xd8\xac\xc9\xd2\x74\x51\x22\x93\x6e\xbf\xd2\x79\xda\xb6\x3b\x1f\x67\x2e\x7f\x48\xde\xf1\xdb\x3f\x72\xcc\xd5\x63\x78\xeb\x22\xc0\x16\x50\x7d\x83\xda\xf1\xd8\xa9\x2f\x14\x32\xd7\xfb\x7b\x7b\x7b\xe9\x34\x2d\x6a\x77\x7c\x2a\x17\xd7\x7e\xd7\x41\xbd\xac\xbd\xd7\x96\x7e\x80\xf4\x1b\x1d\xd1\xfc\xf2\xe4\x1b\x9d\x9b\x92\x6e\xe5\xe2\xee\xda\xc6\xee\x64\x72\xdc\x94\xed\xd7\x5b\xe1\x22\x92\x6e\x8e\xea\x4f\x3b\xf3\xc8\x69\x00\xb0\x45\x54\x56\x95\xe4\x20\x0b\xdb\x6c\xf9\xab\x95\x82\xaf\x60\x28\x4b\x66\xce\x90\x99\x52\x5a\x74\x80\x91\xcc\xaf\x95\x5d\x81\x4a\x86\x3e\x7c\x37\xc0\x56\xd1\xb2\xb7\xc9\xc9\xad\x33\x7d\x56\x48\x37\xc1\xb4\x73\x7f\x0f\xe3\x68\xf6\x64\xe6\x9c\x3f\x1b\x99\x60\x53\x8b\x93\x9f\xb7\xfd\x54\x5e\x33\x7a\x39\x65\x77\xb2\x65\xf2\x02\x97\x58\x8a\x6a\xb6\x5c\xab\x2a\xe8\x1b\x69\x38\x37\x5a\xb4\xda\x5d\x2c\xe3\x6e\xc9\x79\x93\x19\x44\x90\x80\x0c\x9a\x1d\xa4\x59\x53\x14\xc2\xc6\xaf\xfd\x88\xef\x79\x2b\xd5\xcb\xa8\xe5\xae\xf0\xa7\x7f\x56\xde\x76\xa8\xfb\x08\xc3\x91\xc5\x0a\x11\x4d\x12\xf2\xe8\xa0\xcb\xe1\xc1\x9a\xd4\x23\x69\x4d\x2c\xee\xdc\x15\x63\xc7\x74\xef\x9f\xfa\xc6\xb2\x57\x71\xe8\xf4\x50\xff\xd9\xc7\x43\x22\x8a\x4d\x4e\x40\x46\x17\x79\xdc\x68\xdf\xbb\x7c\xb9\xa3\xf4\x16\xf4\x77\xac\x45\x16\xfb\x17\xee\x3f\x38\xea\x97\x64\x9d\x2a\x85\x85\xad\xdf\x7f\xc8\xda\x5a\x67\x03\xb0\x67\xe8\x52\xe6\x35\xad\x29\x5e\xf0\xce\x5e\x9f\x52\xa2\x4d\x56\xa5\xfc\x16\xb1\x6c\x75\x88\x67\x30\x5a\x5a\x34\x85\x77\x47\x40\x9a\x60\x59\x06\xc0\x7e\xa0\x63\x88\x04\xdf\xae\xce\x2f\xef\xa9\xb1\xd2\x61\x71\xbf\x98\xaf\x86\x25\x5b\x4e\x94\x50\xc7\x4e\x68\xbb\xf4\x44\x19\x0d\x2a\xb6\x94\xbf\x75\x02\x58\x30\xda\xf6\x53\x39\xd9\x7c\x7d\xb1\x8d\xce\xa2\xc3\xc9\x99\x74\xb1\x41\x31\xb0\xe5\xc3\xb6\x95\xe5\xdd\x6e\x7a\x6b\x9b\x2e\x6c\xbe\xe0\xc2\x68\x07\xb0\x1a\xf4\x48\x58\xa4\x44\x4a\xc7\xe5\xfc\xe2\x08\xaf\xca\x64\xed\xa0\xd7\x0f\x78\x63\x14\x94\x4d\x7f\x30\x7c\xf8\xee\x54\xa9\xe2\xe9\xe8\x1b\xd9\x00\x6b\x45\x75\x43\x19\xcb\xc0\x77\x3f\x17\x17\x2c\x75\x6e\xec\x9e\x65\x4a\x37\x95\x10\x57\x59\xcf\x39\xfd\x5b\xc5\x56\xe9\x92\xb9\xec\xc9\xd7\x95\xaf\x00\xc0\x9c\xd0\xe7\xb5\x75\x05\xed\x2c\x13\x0f\x1e\xdd\xe7\x73\xa0\xda\x8e\x01\xa3\xbc\x3a\xef\x46\xf6\xf2\x02\xfd\x71\x5b\x9e\xc1\x4e\xa6\xd0\x0f\xa5\x00\x5b\x41\x85\xb0\xa7\x7b\x2b\x30\xe9\xe8\xf0\x58\x3e\x33\xe3\x97\x92\x49\x47\x87\x24\x4e\xf0\x84\xbe\xb9\x6f\xf9\xb3\xdc\xea\xd2\x38\x59\x97\x54\x2b\x2a\xb7\x0c\x65\x36\x18\x51\xea\x4e\x74\xbf\xcb\x08\x17\xff\x75\x89\xda\x8e\xff\xc6\x23\xea\xae\x2d\xa4\x45\xed\xb3\x97\x66\x77\x9d\x51\x02\x00\x73\x43\xe3\x68\x60\xd1\xf2\xa7\x6b\x93\x9d\x96\xa0\x4e\xce\xbc\xe9\x4f\xbd\x77\xd6\xbe\xc3\xa4\x4e\x0f\xb2\x9b\xfc\xa9\xbe\x71\x6f\x05\x9d\x0e\x02\x6c\x1c\xe5\x6b\xc7\xd9\x4f\x79\xc7\xf6\xeb\xd3\x08\xd7\xc8\x85\x7d\x91\x68\x5b\xfd\xa6\x3b\x27\x7b\x4b\x22\x45\x6f\x50\x8c\xc7\x1f\x24\xa5\x0c\xa3\x21\xbc\x37\xfc\x4a\x93\x3f\x5d\xc4\x81\xe5\xd8\xdb\x9c\x9e\x95\x76\x8b\x51\x41\xcf\xe7\x55\x34\x96\x07\xab\xcd\x22\xcd\xd2\xcf\x5e\x23\x01\xcc\x07\x2d\x0c\xd8\x6a\x9f\x78\xfa\xfd\xb6\xc9\x72\xd3\xe6\x89\x4c\xdd\x91\x2e\xd7\x78\xf9\xfc\x83\xf9\x19\x3b\xf5\x0b\x02\x47\xf6\xfd\xa2\x41\x2f\xc8\x1c\x09\x3f\xb4\xb8\xfd\x13\x96\x7f\xbb\xfe\x3b\x45\x8e\xc1\x31\xde\xea\xa9\x16\x57\x96\x0c\xdb\xd8\x3f\x56\x5c\xca\x9f\x83\x69\x3f\x20\x8f\xfe\x98\x0e\xea\xaf\xd2\x61\x77\x5f\xd3\x1f\x37\xec\x7d\x51\xbf\xa0\xc1\x8c\xb1\x30\xaa\x55\x07\xec\x15\x9f\x0d\xae\x09\xdb\xf7\x12\x79\x74\x8f\xd4\x75\x95\x08\x5d\xce\xa7\x2c\xa7\x38\x04\x24\x85\x66\x38\xdf\xf9\x53\x46\xea\x04\x55\xf1\xbc\x9f\x4f\x0a\x89\x4f\x2a\x43\xaf\x8e\xfe\x5c\x3b\x44\x7f\xd9\x3a\xc1\x3c\xab\xa2\xeb\x0a\xd5\x5c\xd3\xd2\x4b\xdf\x63\x26\xdc\xa2\x81\xdb\xee\x86\xab\xd5\xde\xe8\xb1\x56\xdc\x68\x51\x51\x1a\xcd\xa1\xdd\xf9\xdc\xac\xae\xd9\x32\xe2\xaa\x75\x50\xff\x44\xe1\x51\xeb\xcb\x8c\x53\xcc\x9e\x13\x59\xca\xb7\xbb\x58\xc2\xf3\x3d\xdc\x01\x16\x80\x6e\x8f\x37\xb2\x31\x47\x5e\x8f\xee\x15\x56\x99\x4f\x9e\xbd\x25\xfc\xf2\xcc\x5e\x61\xc6\xf4\xbe\xe6\xdf\x31\x7a\xb9\xbf\xcc\xf2\x1f\x58\xca\x39\x01\x19\x01\xe4\xf1\x8c\x2f\xbe\xef\x58\xaa\xad\xb7\x2d\x51\xaa\x32\xba\xc9\xae\xbf\xe6\x6d\x0e\x59\xff\x15\xd9\xcd\xc8\x1b\x11\xfa\xac\x4d\xe7\x4b\x28\xc0\xb2\xd1\x25\x7f\x1a\xf4\x48\xf6\xec\x9f\x04\x9e\x6e\xf5\x41\x67\xd9\x1a\x19\x69\xd1\x14\xbb\x47\xfd\x35\x79\x14\xe4\x12\x49\x25\xe9\x86\xfc\xe4\x00\xeb\x43\x0b\xfc\x55\xce\xcb\x4d\x74\x95\xfe\x83\xa6\xcb\xd5\x5b\x7b\x56\xe9\xc2\x2c\xcd\x0f\x7c\xf4\x8f\x16\xd3\x39\xd6\xea\xf9\x6c\x5f\xf9\x23\x49\xe4\xd1\xce\x2e\x26\x8f\xd3\x11\x0f\x3a\x83\x37\xd9\xeb\x3e\x34\x94\x9c\x3d\xdb\xfd\xec\x6c\xb7\xf6\x05\x2f\xca\xab\xdb\xd3\x7b\xe9\x65\xd1\xdd\x31\x96\x67\xbe\xce\x41\x3e\x4f\x1b\x3e\xf9\x2e\x70\x64\x66\x8f\x48\xba\xbd\x8b\x95\xc1\xe0\x8a\xa3\x51\x84\x5c\xe5\x8a\x78\x9c\xf7\x46\xa6\x47\x2f\xae\xab\x04\xdf\x4c\x32\x48\x7f\x27\x33\x2e\x99\xab\xf0\xee\xd8\xab\x20\x26\x1e\x0b\xf2\x57\x7c\x1f\x4b\x23\x38\x45\x34\x68\xde\xbf\x7f\x0f\xb0\x0f\xa8\xd1\xdc\x4a\xdb\x18\x98\x2b\x9e\xc8\x3e\xdc\xd9\x6f\x6f\xbf\x25\xe2\xf8\xd3\xc2\xaa\x02\x3f\x59\x13\xbf\xe0\x58\xd1\xcf\xc7\x3b\xea\x14\x00\xf6\x07\xdd\x7b\x37\xbc\x44\xab\x04\xdf\x69\x33\x8f\xf0\x67\x2b\xa5\xc7\xd6\xe5\xbc\xcd\x1c\x7b\x16\xe7\xee\x14\xff\x5c\x37\xe5\x4e\x5f\x6f\x71\x02\x00\x58\x05\x9a\x8f\xad\xa3\x93\x7f\x71\xce\x75\x17\xf7\x63\x5d\x9b\xf6\xee\xae\x90\x34\x54\x3f\xa2\x70\x31\x2a\xee\x4d\x06\x07\x75\xed\x8f\x03\x72\x11\x00\xeb\x40\xd7\x53\xe1\x88\x54\xfc\x01\x79\x79\xb1\xb7\x8f\x05\x25\xf8\xff\x98\x8c\x37\xae\xec\x61\x14\x96\x6a\xa9\x18\x66\x28\xd4\xa1\x7d\x43\x73\x18\x79\xb4\xc9\xf4\xd8\xaf\xfe\x77\x8f\xee\x4f\xda\x70\x4b\x87\x1e\xdf\x5f\x3c\x5a\x32\x21\xb3\x34\xf0\xe4\x58\x6c\xa2\xfe\xde\x0f\x2d\x11\x42\xe8\x64\x95\xd3\xe1\x48\x24\xef\x2b\x9d\x2d\xbd\xcd\xcf\x56\xb8\xd5\x12\xc4\xb4\x24\xf6\x94\xf4\x87\x9d\xe7\x56\xb4\x5e\xb3\xdf\x55\x40\x49\x02\x98\x1f\x1a\x93\x94\xbe\x1e\xf3\xc4\xce\x65\xea\xa8\xb0\xbe\x58\x13\xdb\xa3\xdd\xe6\xa2\x0b\xc5\x5a\x59\x60\xe7\xa0\x40\xbc\x1e\xc3\x9d\x23\x14\x4e\x40\xe6\x26\xf2\xf8\x90\x3e\x85\x49\x5a\x93\xbb\xbe\x59\x41\xc4\x9c\xd9\xe5\x7d\x91\xee\x45\x5d\xcd\xae\x01\xe6\x97\x53\xbf\x55\xf8\xea\x28\xb5\x6b\x01\x6c\x0a\xd5\x6d\x13\xe4\xc3\x85\xad\xfd\xa8\x79\xee\x6b\x0f\x2f\x1c\x4f\xd9\x54\xac\xbd\x12\xaf\xf3\xae\x28\x6e\xe1\x8c\xc5\x30\xeb\xb5\xb4\x26\x59\x80\xcd\xa2\x09\x76\x68\xc8\x33\x62\xc6\xe6\xcf\xb1\xa6\xb1\x92\x48\xbf\x09\x47\x9a\x4a\x4a\xa3\x33\x2f\x8d\x31\xa3\x81\xfc\x8a\x0e\x87\xd4\x73\x47\x9c\x00\x96\x86\x52\x9a\xf7\x59\x95\x62\x03\x43\x42\xb1\x9f\x5e\xf1\x49\x7b\xbc\xe2\x94\x76\x66\x4e\x76\x30\x9d\xb6\xb8\x92\xdd\xd2\x02\x48\xfd\xe7\x78\x01\x36\x80\xee\x71\x93\x86\xdf\x25\xe2\x4c\x92\xa3\xd9\x4d\xcd\x8e\x6f\x25\x22\x66\x8d\x6f\x44\x54\xf2\x66\x6d\x6f\xf2\xe3\x8a\x1c\xd3\xd9\xfc\x3e\x18\x60\x53\x68\x82\x0d\xcb\xe0\xec\x32\x2a\xda\xa7\x5f\xfc\xed\xfa\xbb\xcd\x24\xbe\xd8\x32\x17\xa5\x07\x32\x79\x92\x85\x17\x1c\x73\x4e\x6d\x3b\x98\x69\x25\xfc\x8f\xbc\x4a\x8e\xe2\xff\x48\x5c\x0d\x6c\x27\x08\xc9\x15\xc4\x4c\xc3\x36\x8c\x88\x61\xe1\x98\x75\xd8\x1e\x11\xb1\x2c\x1c\x93\xbb\x15\x2a\x6e\x44\x7c\x0b\x60\x8c\x2e\x1b\x0d\xc8\x4b\x94\x16\x75\x51\x5b\x7e\xe4\xa0\xf8\x32\x99\xb5\xfd\xea\x95\xcd\xd9\xc1\x8f\x82\x4e\x30\x7d\xfd\x82\x79\x9b\x29\x90\xbb\x30\x06\x45\x1f\x11\x24\x01\x6c\x11\x0d\xae\xb9\xff\x00\x4d\x54\xb8\x59\x1a\xcf\xf8\x6e\xa9\xd1\xaf\xd5\xe7\x2a\x93\x1b\x56\x44\x0f\xd0\x0c\x8a\x5e\x7b\x3c\x51\x9f\xc7\x4c\xb7\xd1\x85\xa3\x4c\x80\x2e\x52\xda\xcd\xa7\xa3\x49\xe6\xc5\xb6\x61\x26\x37\x5e\x41\x2d\xff\xe7\x76\xe9\x2b\x1e\x73\xee\xe7\xf7\x66\xcc\xbd\x7d\x38\xe1\x40\x02\xd8\x02\xfa\xf7\xf7\x4e\x87\xbb\xb7\xd4\xf7\x74\x69\x89\xab\x1a\x28\x14\xec\xd1\x13\x37\x39\x3e\x7b\xa8\xad\x32\x5a\x5e\xce\xea\xc0\x55\x77\x79\x32\xe1\x7f\x33\x1b\x0f\xd0\x4b\x38\xf6\x21\x32\x1d\xc7\x2c\x42\xb9\x94\xc8\x7c\x1c\x93\x0e\x17\x8f\xc8\x05\x1c\xb3\x00\xdf\x43\xc8\x7d\x21\xa6\x12\xbe\x87\x90\x00\x43\x4c\x1d\xec\xd5\x89\x58\x30\x62\x1b\x15\x9c\x15\x11\xf2\x61\xd9\x9d\xd2\xff\xfd\x92\x3c\x03\x4d\xab\xa6\xbc\xed\x49\x56\xd1\xa5\x73\xd1\x99\xe2\x2e\x4f\x66\x4e\x3c\x5a\xaa\x3e\x91\x1d\x64\x79\x92\x42\x9a\xf5\x37\x75\x8c\xa4\xb4\x35\x09\x60\x5f\x50\xf2\xaa\x6a\x12\x73\x89\xee\xca\x01\x67\x03\xcd\x5b\xb6\x2f\x9e\x36\x93\xe9\xcb\x8f\x47\xb3\x39\x73\x25\x31\x0c\x8b\xdc\x71\xd8\xd1\xf3\x67\xe3\x80\xa0\x49\xc4\x71\xa0\xcb\xb0\x9b\xc2\x35\x3c\x5d\xd3\x4b\xe8\xa0\xb9\xd8\xef\xdc\x53\x57\x77\x94\xa7\x9d\xe8\xaa\x66\xdc\x5a\xfe\x3e\xea\xf6\xad\x8d\x83\x8b\xb2\xf4\xbd\x1f\x7f\xb4\xfd\xbe\xe3\x79\x2c\xed\xf8\xe1\x43\x3c\xdd\x05\x93\x41\x7b\xb9\x6b\x8b\xf2\x2f\x5f\x30\x9d\x11\x13\xe4\x4d\xaa\xd0\x16\xfe\x37\xb3\xf1\x08\x65\x40\xd5\x84\xc8\x74\x1c\xf3\x05\xf6\xaa\x44\xe6\x23\x69\x01\xa6\x1f\x22\x17\x90\x94\x05\x2f\x34\x10\x36\x27\xf8\xae\x87\x18\xa2\x0e\x05\xc7\xac\x32\x41\x51\x92\xa8\x57\x01\x72\x5b\xb8\x28\xff\xfb\x47\xc4\x61\xe8\xc8\x6f\x26\xda\x7c\x53\x5a\x66\xfa\xcd\xe6\x45\x3d\xb0\xae\x79\x21\x35\xde\x61\xfe\x66\x71\x5f\x6d\x75\x9c\x3c\xdf\xad\x42\xbb\xef\x72\x1b\xce\xa0\xdb\x2a\x8d\x9c\x5c\x27\x57\xa2\x7c\x39\x9e\x5e\x6e\x01\xbb\x1f\x28\x1c\x7e\x2a\xbc\x87\xa3\x37\xfa\xe7\xd8\x1e\xf9\x13\x25\xa7\x9b\x1f\x92\x00\xd6\x80\x92\xdc\xef\x7c\xc3\x03\x74\x9a\x16\x9c\xa7\x3d\xfc\x67\xf7\xbd\x5b\xe2\x91\x5f\x4f\xf0\x2b\x6d\x18\xb2\xd8\x25\x6a\xf1\x29\xf5\xec\x50\xeb\x86\x13\xff\x53\xde\x6d\x99\x42\xa9\x87\x8e\xea\xdf\x65\x5f\x38\x29\x14\xfb\x35\xb1\xdf\xe6\xee\xd0\x85\xe0\x1f\x72\x4f\x6d\x99\x2e\x34\xbc\xa2\xe3\x13\xfe\x37\xb3\xf1\x10\x85\x41\x11\x8f\xc8\x74\x64\xf9\xe0\xd6\x22\x32\x1f\xc7\x34\x40\x51\x92\xc8\x05\x64\xf9\xe0\x2f\x29\x89\x5a\x47\x88\x91\xa1\x86\x2b\x4e\xd4\x43\x02\xb9\x4d\x64\x64\xff\xdd\x34\x88\x43\xbb\xb7\x89\xf5\xd8\x70\xa3\x62\x9f\x53\x06\xbb\xd9\xbb\x1e\x6c\x1d\xbd\xe2\x55\x95\xb5\x60\x29\xbc\x55\xc8\xc9\x4e\x7c\x8b\x02\x9b\x94\x2e\x09\x60\x4d\xa8\xe4\xa0\xc2\xbb\xc9\x8b\xca\xeb\x7d\xad\x82\xcd\x66\x6d\x86\xe4\x3d\xc2\x4b\x6f\x79\xb1\x8c\x78\x65\xdd\x81\xda\x56\x8f\xb3\xcf\xae\x38\x92\x00\x16\x81\xae\xa0\x51\x61\x90\x3f\x59\x5d\x3e\x57\xe6\xc9\x3f\x21\x54\x81\x64\xbe\x7d\x0f\x04\xaf\x7d\x91\x0a\x19\xcb\x10\x5b\xa9\xab\xa7\x8e\xaa\x25\x01\xac\x07\xe5\x8b\x24\xf2\x1e\xce\xf5\x53\x11\x17\x56\x94\xb7\x5b\x18\x4d\x92\x57\x4d\x5e\xd1\xbb\xe3\x72\x94\xc2\x68\x9f\xda\x85\x53\xf7\xde\xa6\xc7\x08\xff\x9b\xd9\x78\x54\xe3\xe0\x84\x83\xc8\x74\x1c\xd3\x04\x05\x29\x22\xf3\x71\x4c\x04\x94\x2c\x89\x5c\xc0\x31\x3d\xf0\x2b\x0a\x84\x2d\x3d\x5c\x71\x5d\x78\xd7\x97\xa8\xad\x87\xaf\x79\x06\xab\x14\x51\x6f\x8f\x63\x7e\xc0\x81\x0d\x61\x7f\x0f\x31\xc1\x30\xd4\x84\x4d\x3e\x7e\xb8\x20\x35\x23\xec\xf4\x21\xa6\x15\x86\x9a\xb0\xdb\x87\x18\x27\x88\x21\x6a\xf9\x71\xcc\x0a\x0b\xbc\x43\x48\xd8\xfc\xcb\x31\x92\x91\xb9\xb9\x90\x00\x56\x81\x12\xa8\xa1\xc6\xcf\x64\x87\x47\xa9\x80\x73\x43\x76\xad\xf6\x63\x1a\x65\x07\xea\xc3\xf4\x4f\xc7\x39\xb3\xab\xbc\x1e\x2d\x1b\x1e\x0b\x13\x27\x01\xac\x19\xe5\xee\xde\x12\xc3\x77\xc5\x9f\xad\xbf\x70\x79\xf5\x2b\x34\x89\x6a\xaa\x7c\xc2\xd7\x5d\x8a\x2e\x91\x4f\x3b\x59\xe6\x51\xbc\x10\xff\x2c\xd9\x46\x67\x8f\x96\xd1\x27\x5f\xad\x3a\xa6\x28\xae\x07\x62\xf9\x49\x9a\x1f\x65\x9f\xbe\xf6\xca\xfe\x90\x6d\x0e\xb4\xa7\xe6\x72\x84\xad\xec\x37\x9d\xd2\xde\x78\x1e\xcd\xef\x2f\x9b\x62\x5e\x7e\x55\xeb\xdc\x2c\xe0\x7b\x7f\xb7\x01\xe9\x45\x9f\xee\x49\x36\x2a\xad\xdb\x3f\xf8\xba\x1f\x9c\xba\xbb\xfd\xf0\xb9\x38\x12\xc0\xc2\x51\xb2\xdf\xc4\xb6\x4a\x1f\x64\x14\x41\xf9\x40\x98\xf6\x49\x69\x26\x36\x4f\x3f\x78\x41\xed\x54\x1e\x7d\xf2\x9e\x9b\x65\x07\x2e\x32\x1c\xee\x15\xfe\x37\x37\xf1\x90\x56\x40\x92\x45\xe4\x2a\x8e\x69\x86\x5b\x84\xc8\x5d\x1c\xe3\x03\xcb\x27\x91\xcb\x08\x06\xd6\x06\x22\xb7\x71\x4c\x38\x3c\x26\x84\x72\x0f\xc4\xb8\x41\x0c\x91\xe6\x83\x63\xc6\x19\xe1\x70\x83\x48\xfd\x01\x72\x7e\x54\x5b\x28\x36\xb6\xe2\x1a\xca\xfd\xc9\x26\xf6\xed\xcc\xaf\x38\x7d\xf2\x91\x13\x9f\xb6\xef\x39\xc3\xab\xd9\x4c\x49\xe4\xd4\xee\x6f\x5a\x03\xfd\x32\x22\x27\xbc\x24\xdb\x49\x00\x2b\x40\xaf\x94\xc5\xa4\x5f\x76\x96\xed\x6f\x89\x61\x97\x49\xcf\x9c\xfb\x54\x5a\xae\xf2\x6b\xb9\xe5\x90\x57\xf4\x6f\x4a\xbe\x77\xae\x9f\x9b\x4e\xdd\x21\x01\x19\x7b\x94\x30\xce\x64\x62\xaf\x4d\xc9\x99\x46\x7c\x0e\x3d\x5f\x29\xff\xa4\x73\xb1\xb7\x36\x20\x51\x78\x99\xc1\x21\xda\xe1\x4a\x01\x0d\xf9\xd3\x8d\xee\x08\xdd\xe9\xec\x7c\x7f\x5a\x28\x7f\x5a\xa7\xf4\x4b\x18\x4c\x6e\x52\x6e\x73\xbf\x9f\x98\xe2\xd8\x98\x29\xed\x2a\x43\x75\x29\xf7\x40\x3f\x43\x3c\x09\x60\x5d\x68\x8b\xdd\xc9\xfc\x38\xfc\x41\x68\x9f\x3c\xc3\x74\x86\x93\x5e\xf1\xa3\xc8\xf6\x4f\xee\xd4\x07\xea\xdf\xdc\x74\xd1\xff\x35\xd2\xe6\xb5\x5f\x5d\xf8\xdf\xbc\xc4\x23\xba\x06\x93\x22\x91\xa7\x38\xa6\x00\x7e\x02\x8b\xc8\x5d\x3c\x5f\xdb\xff\x7d\x0d\x91\xc7\x48\x1b\x09\x37\x3c\x91\xd7\x38\xa6\x0b\xce\x43\x88\xd4\x3e\x64\xc3\xb3\xc2\xfc\x46\xa4\xfb\x01\xb9\x4d\x54\x64\xb1\x1b\x9b\xaa\x00\x95\xfd\x97\x75\xbd\x9f\xbe\x14\xae\xc9\x4e\xff\xfd\x22\x8c\xf5\x66\x6a\x46\xd3\x51\x63\x13\xb5\xfa\x51\x3a\x95\x94\x5f\x6d\x36\x16\x9b\xd4\x48\x00\xeb\x40\x37\x61\x1b\xf3\xae\x15\x97\xc2\x1a\xbd\xde\xdf\x53\xcb\xf7\x75\x82\x18\x02\x33\x3e\xd7\x2d\x5d\xb3\xa9\x36\x2d\x7b\xb7\xb4\x6c\x95\x97\x48\x02\x58\x08\x9a\x7f\x22\x74\xc8\x6b\x37\xbf\xa9\xd4\x7e\xb5\x5c\xc1\x95\xaa\xe2\xfd\xfe\x16\xe5\x96\x54\xf2\xdc\x4f\x1a\x89\x97\x6a\xad\xe8\xbe\xee\x1b\xdc\xa8\xa1\x28\x3b\xc9\x1a\x93\xeb\x78\x77\x8b\x6b\x79\x4b\xff\x3b\x1a\x99\x57\xd9\x99\x26\x15\xba\x9e\x3a\x54\xca\x34\x9d\xeb\x6a\x8e\x57\x3d\xef\x9d\x20\x01\xec\x05\xfa\x3c\xeb\xbc\xfb\xdb\x11\xfb\xc8\xcf\xbd\x9b\x1e\xca\x34\xaf\xd9\xcd\xc5\xb5\xa6\x8f\xff\x52\xbf\x22\xd3\xe6\x2f\x34\x63\x75\x64\xeb\xdf\xfc\x46\xe4\x26\xb2\x43\x60\x73\x47\xe4\x2a\x8e\xe9\x80\x3b\x91\xc8\x5d\x1c\x13\x02\x73\x08\x91\xcb\x08\xdb\x80\xac\x86\xc8\x6d\x1c\xf3\x62\x2b\x24\x98\x44\x7a\x2f\x90\xa3\x20\x27\x63\xda\x20\x98\xee\xe8\xd5\x51\xc6\xe5\x14\x9f\x87\xe6\x19\x0c\x03\xd1\xea\xf5\x96\x4f\x13\xef\x6f\x31\xed\x31\xfb\x56\xe8\xa3\x76\x4c\xf4\xc5\x40\x5d\x93\x0e\x2d\x09\x60\x13\x28\x61\x1c\x5a\x35\xaa\xb8\x48\x27\xb4\xeb\xcd\x8e\xc8\x92\xcf\x66\x07\x8f\xd0\xa7\x2a\xbc\x97\xfa\xf4\xf4\x2d\x67\xb8\x0f\x4b\x87\xe8\x51\x07\x12\xc0\x02\x51\xc2\xf8\xf5\xf7\xad\x5d\x3e\x74\xab\xd2\x89\xf1\xae\x45\xcc\x91\x37\x6e\x9e\xbf\x1c\xa3\xfa\xe7\x5e\xd3\xa7\xa7\x9e\x14\x64\xd8\x78\xa7\x14\x09\x60\xe9\x68\x49\x2e\xb3\xd6\x16\x76\x09\xb3\xa7\x79\x1f\x5b\xfb\xaa\xb2\x7b\x2c\xcc\xea\x74\xae\xb6\xdf\x0b\xf9\x6a\x6e\xab\x4d\x8d\x2f\x8e\x4a\xae\x0b\xff\x9b\xd9\x78\x88\xdc\xe1\xd5\x2c\x22\xd3\x71\xcc\x04\x64\x23\x44\xe6\xe3\x98\x40\x78\x0d\x8e\xc8\x05\x44\x07\x61\x81\x65\x83\x48\x83\x07\x72\x14\x65\x64\xd2\x1b\xcb\x57\x8c\x9e\x58\x96\x68\xfb\x22\xc3\x6f\x9c\x61\x83\xdc\x71\x72\x67\x3b\xfd\xb1\x6b\x5f\x2b\x04\x0e\x1b\x88\x50\xde\x48\x9e\x59\xff\xa8\xe1\x53\xbf\xb1\xaf\xd0\x3c\x2d\x10\xb3\x9c\xb5\xa9\x7b\x5a\xe5\xda\xfc\x8b\xbb\xb7\x02\x0a\xa9\x5f\xea\x5b\xfa\x8f\x3f\x5b\x38\xd9\xb0\x5a\x2f\x25\x6e\xd9\x22\x4d\x02\xd8\x24\x2a\x34\x7c\xd6\xc9\x48\xc8\xa3\x0a\x49\xbd\x42\x75\xfa\xd1\xb3\xcd\xc9\x4d\xb5\x9c\x6b\xae\x15\xba\x66\xaf\x6c\xc9\x54\xb4\xcb\x44\xc8\x31\x00\xb0\x10\x34\xe3\xf0\xab\xeb\x4a\x54\xa5\x19\xad\xf6\xc8\xde\x7b\xb8\x58\xb8\x59\x48\x4d\x43\x32\xbd\xd4\x6d\x46\x7f\x97\xc2\xf7\x9f\x05\x1a\x32\xf5\x00\x7b\x8f\xee\x8e\x29\xae\xb4\x74\xeb\x6b\xb3\xdf\x94\x5e\x0f\x47\x1f\x3b\x3a\x94\x91\xa7\xc6\x22\xb5\xa0\xdd\x6d\x64\x52\x29\x75\xb7\x8b\x54\xb0\x59\xf8\xdf\xbc\xc4\x23\x5a\x0c\x0f\x2b\x91\xa7\xc8\xc1\x83\xb9\x99\xd0\x5b\x88\x99\x84\xda\x04\xa1\xc7\x78\x52\x80\xc9\x87\xc8\x6d\x1c\xf3\x9e\xf5\x4f\xc4\xff\xed\x10\xc2\xd1\x8b\xec\x2d\x72\x2e\x67\x12\x90\x31\x40\x03\x7c\xc2\x72\xde\x21\xcc\xa4\xd3\xba\x7c\x41\x65\x5c\xc5\x4c\x42\x88\x43\x72\x6e\x2a\xbd\xf1\x3a\x5b\xdd\x97\x70\xc5\x02\x1f\x79\x12\xc0\xda\xfe\x87\xb1\x92\x9f\x90\xd2\xac\xbf\x2b\xb5\x44\x19\x90\xdf\xf7\x92\xcc\xd2\xee\x8e\x2b\xfd\xf9\xf5\x9e\x83\xc9\x9b\x6a\x2d\x93\x65\xa9\xd6\x49\x00\xcb\x47\x9f\xd7\x78\x5e\xee\x63\x73\x39\x74\x30\xc7\x95\x9b\xab\x27\x7c\xf8\xee\x03\xaa\x33\xcf\xe2\x57\x58\x98\x73\x6a\x4e\x63\x29\x61\xf6\x56\x00\x60\x25\xe8\x7e\x1a\xe3\x4f\x8d\xcb\x67\xa5\xd7\xeb\x5f\xf2\x0e\x60\xa2\x63\xf5\xb2\xf5\xae\x93\x90\x4b\xc9\x0c\xd7\xf8\x3d\x17\x21\x43\x7f\xe8\x31\xc0\x46\xd0\xed\xc4\xf7\xcd\x77\xd0\x96\x49\xf9\x41\x87\xdc\xa5\x6c\x5a\xd6\x2c\xc3\x76\xd3\xf8\x1b\x6b\xdc\x2f\x1e\x0c\xab\x30\xf1\xf1\x9f\xb6\x4f\x39\xfe\x6f\x5e\xe2\xe5\xde\x00\x72\x55\x02\x47\xf1\x25\x68\x83\x5c\x95\xd0\x59\x88\xc9\x87\x18\x42\x87\x21\xa6\x04\x6e\x29\x22\xaf\x71\xcc\x08\xdc\x52\x84\x83\x36\x88\xf1\x80\x17\xbf\x88\xa6\x6d\x38\x26\x00\x6a\x1f\x84\x23\x37\x18\x6a\x01\xd8\xd1\x11\x8d\xdd\xe0\x6b\xb2\x61\xd9\x24\x9a\xbd\xe1\x98\x3e\x4a\xc8\x92\x88\xa6\x70\x40\x8e\x91\x8b\x8c\x6f\x83\x25\x75\xa3\x5c\xd7\x4d\x32\x87\xf5\xc2\xf4\x91\xe8\xe6\x2e\x65\x1f\x73\xd1\x07\x54\x5a\x97\x73\x12\x5c\x0e\x6c\xce\x29\x51\xf4\x95\x6c\x2a\xf8\x99\x45\x02\xd8\x0c\xca\x7a\xce\x0a\x66\x1b\x57\x3d\xf8\xac\x31\xed\x2b\xb3\xbb\xf9\x4d\x70\x19\xc7\x5d\x1a\x4a\x9a\xdc\xec\x13\x9c\xfe\x54\x63\x82\x4b\xc7\x8f\x91\x00\xe6\x8f\x96\xd8\x85\x60\xc9\xe7\x56\xdf\x0b\x6d\xb9\x5a\x36\x69\x7c\x57\x2e\x9a\xb6\x14\xcd\x2d\xd2\x58\xd9\xd7\x58\xf4\x35\x7e\x42\xda\xf1\x87\x30\x09\x60\x45\x68\x8e\xee\xab\x12\x34\x77\x93\x9a\x64\xc8\x6f\x18\x7a\x3e\xfa\xb6\x3a\x77\x17\x23\xad\xd2\x6e\xd1\x8f\x1a\x7d\xef\xce\x6f\xad\x0d\x35\x8c\xd9\xe8\x51\xd0\x01\xd4\x8a\xfa\x9e\x65\x81\xd3\x54\xb6\x7b\xe2\xd9\x02\x79\xec\x38\x36\x85\xef\x71\xe6\x72\xa1\x0f\xa7\xb9\xf3\x6a\xef\x2f\xe5\x74\x6d\x7e\xe1\x7f\x73\x13\x0f\x69\x37\x24\xb8\x44\xae\xe2\x98\x19\xb8\x74\x44\xee\xe2\x18\x7f\x58\x9a\x89\x5c\xc6\x31\x45\x30\x59\x13\xb9\x8d\x74\x74\xdb\xa0\x3c\x4f\x34\x7d\x05\xb2\xd2\xe0\xbf\x2a\x3b\x81\xee\x90\x4b\x51\x5c\x8e\x55\x01\x33\x32\x09\xbf\xb6\x26\x5e\x90\xec\xf7\x6f\x09\x1c\x36\x8b\xd9\xf9\xc8\xf7\xa9\x27\xe7\xcf\x2c\xb3\x82\x04\x12\xc0\x1a\xd1\x15\xb1\xe9\xa8\x4d\x71\x59\x28\xfd\xd9\x13\x7d\x78\x4f\x69\xb9\x27\x65\xf7\xb9\x5e\xcf\xdc\x0b\xe7\x39\xec\xdc\xc5\x94\x3a\xa5\x86\x98\x48\x00\xab\x45\x77\xc8\x60\x8c\x18\x1b\xc7\x53\x73\xaa\xf4\x3a\xdd\x2c\x06\x7f\xea\xd5\xa0\xbc\xf3\x02\x49\xd6\xd9\xb9\x7b\x86\x9f\x30\x51\x54\x51\x3b\x92\x00\x96\x8c\xaa\x82\x8e\xc2\xa1\x32\xe6\x73\x23\xa7\x5e\xb4\x1f\xdc\x37\xf8\xc6\x56\x64\xda\xf5\xb3\x30\xfd\xe1\x93\xcb\x6f\x17\x07\x46\x1f\x98\x2f\x5c\x17\xfe\x37\xb3\x11\xc2\x03\x57\x9c\xc8\x74\x1c\xd3\x08\xef\xf2\x12\x99\x8f\x63\x6a\xe1\x8a\x13\xb9\x80\x63\x92\x71\x85\x90\x68\x14\x8e\x0f\x7e\xe0\xf7\x38\x08\xe7\xe1\x10\xf3\x01\xee\x2c\xc2\xa1\x38\xc4\xfc\x81\xa4\x8f\x70\x30\x8e\x6b\x2c\x50\xaf\x26\x9a\x8e\x23\x3d\x08\x03\xe4\xf9\x44\x73\x72\x20\xe7\x48\xc6\xfb\xdf\xaf\x9d\x87\x51\x69\xe9\xd5\x38\xa9\xee\xc2\x2f\xf6\x77\x5b\x39\x94\x4e\x54\x06\x1d\xdf\x77\x79\xc2\x91\xcc\xaf\xed\x4c\x6d\xae\x45\x86\x7c\xb7\x7a\x38\x35\x09\x60\x51\x28\xb1\x0c\xcf\xde\x2b\x92\x24\x47\x2f\x14\xa4\xa2\x95\xfa\xd6\x26\x51\xfa\xe0\x6d\xa3\x63\xf5\x99\xb9\x6a\x91\x0d\x14\xa7\x0e\x3f\xf7\x14\x20\x01\x6c\x09\x9d\x8d\x96\xa7\x6a\xdf\xb6\x92\xb7\x9f\xb7\x54\x09\xfc\xf4\xe6\xe6\x25\xc5\x45\x3f\xc5\xca\xbe\x88\x87\x9f\x8e\xcc\x95\x97\xf0\xd0\xb9\xb2\x90\x00\x16\x8e\x12\x01\xf3\xbd\x0b\xb7\x16\x1b\x37\x6b\x47\x75\xd6\x19\x71\x2e\x8f\x1d\x7a\x2c\x69\xf4\xab\x79\x9c\xd6\x3b\x7a\x5e\xdd\x26\x93\x3c\x91\x4b\xf8\xdf\xcc\xc6\x43\x34\x0c\xe5\x21\x22\xd3\x71\x4c\x14\x64\x8b\x44\xe6\xe3\x98\x25\x7c\x46\x4a\xe0\x02\x22\x43\xe1\x73\x00\xa2\xbb\x0b\x40\x8e\x42\x5a\xfa\xbf\x7f\x49\x00\xd0\x70\x35\x1f\x9b\xae\xff\xfc\xe8\x31\x45\x08\xe9\xfb\xf7\xba\x1d\x79\x5c\x56\xa4\x8b\x22\x9b\xbe\xd5\x5e\x1f\x39\x4c\x47\x93\x47\xe3\x96\xb3\x51\x08\x51\x62\x4d\xee\x61\x78\x2c\xe5\xda\xa9\x8b\xb7\x8c\xe8\xaf\x1f\xfa\x73\xb1\xdf\x48\x5c\xb6\x92\x2c\x02\xf4\x5a\x7a\x69\xb8\x60\x7c\x67\xef\x90\x00\xd6\x8a\x2e\x77\xfa\x37\xda\x38\x72\x7e\xd3\x6f\x2f\x7d\x97\x8e\x5a\xfd\xd0\xbc\xd2\x5b\x5d\x9c\xcd\xe8\xf8\xa2\x9e\xe7\x5c\x3b\x6f\x68\x2f\xdd\xd3\x0d\x7e\x82\x0e\x14\xe3\xad\x6e\xe4\xc6\x1e\xea\xc7\xe8\x39\xa4\xa4\x3a\x6a\x6e\xf9\x05\xbd\x1b\xb0\x9f\xe6\x1e\x5f\x63\x37\xb6\xb8\x3e\xa5\xf1\xca\x5c\xf8\xdf\xcc\xc6\x43\x04\x20\xfb\x21\x32\x1d\x29\xfd\xf0\xf4\x11\x99\x8f\x88\xd3\x70\xc9\x89\x5c\x40\x98\x19\x1c\x2a\x12\xdd\x24\xc1\x31\x7e\xf0\xab\xd6\x84\xd7\x49\x20\x63\xba\x09\xe7\x00\x44\x57\x4a\xe0\x6b\xa6\x60\x12\x26\xba\x57\x82\x63\x66\x61\xb2\x27\xbc\x5b\x02\x31\x69\x30\x04\x84\x17\x4c\x20\x66\x00\x52\x02\xa2\x5b\x26\x88\x3f\x2c\x7f\x7a\x76\xfc\x5f\xbf\x53\xc1\xd1\x1c\xf2\xf9\xd2\x11\x5d\x5a\x51\xd5\x5b\xde\xfd\xb2\xc7\x3e\x25\xa7\xa8\xfa\x6b\x86\x58\x34\x47\xd4\x57\x65\xb0\x94\x00\xb9\xf5\xc9\xf5\xf5\x30\x4e\x64\x57\x1e\x52\x5b\xb8\x65\x30\xb8\x9b\x55\x69\x87\x5b\x67\xa7\xa5\x40\x4c\xee\x53\x2f\xce\xe8\x7b\x89\x91\x0a\xbe\x41\x9d\x4f\xf3\xae\x19\x91\x00\x16\x83\xb6\x17\x91\xa3\x57\x6a\xa7\xa7\x6e\xca\x5d\x7e\xea\xcf\xa5\x95\xdd\x17\x59\x6a\x16\xfb\xa5\xf0\xa9\xca\x60\xe1\x53\x9a\xc1\x35\xc6\xd4\x18\x00\xb0\x14\xf4\x94\x98\x1a\xc9\x3d\x4d\x10\x9d\xeb\xb7\xe7\xb1\xc8\x3e\x15\xa1\xc0\xb8\xa5\x31\x28\x63\xf2\xba\xf0\x29\x41\xa7\x54\xbb\x90\x19\x85\xdd\x00\x9b\x40\xc7\xa9\x69\x86\x16\x3f\x5f\x05\x8a\x75\xf2\x48\x1b\xe7\xe4\x3f\x62\xad\xbe\x31\x25\xc1\xe1\x19\x29\x1d\x79\xcd\x7d\xcf\xb5\x0a\xfb\x36\x0a\x00\xb0\x4c\x54\xfb\x88\xcf\xf8\xd8\xad\x97\x44\x3b\xba\xa7\xf5\xbb\xce\xed\xe5\xdb\x42\xb1\xea\xd6\x16\xd1\x8e\xd7\xf7\x72\xda\xdc\xb9\xfc\xa6\x36\x4d\x05\x60\x95\xa8\x04\xcc\xe2\x33\xb9\x74\xeb\xe8\x91\xde\x36\xb3\x8f\xf9\x2b\x7e\x7a\xcc\x0a\xba\x2e\xad\x4b\x56\x2b\x8d\x09\x4f\x4f\x49\x18\x6e\x5f\xb8\xe7\x04\x64\x9e\x20\x8f\x57\x7f\x5b\x70\x9c\x55\x60\xf9\x76\x3a\x37\x90\xf3\x21\x4f\x2c\x39\xbf\xff\xa2\xba\x80\x55\xd3\xd7\x5d\x16\x87\x44\xaa\xce\xca\xd9\x02\x2c\x18\xe5\x24\x9e\x99\xce\x95\xa9\x39\x19\x9e\xdb\x9e\x06\xea\x99\xd0\x90\xc7\xd4\xa8\x44\x38\x50\x85\xe5\xf8\x52\x85\x1e\x1b\x6b\x58\x7f\x4f\x0d\xb0\x4e\x34\xe1\x38\xac\x3c\x54\xd5\xf7\xcc\x0a\x54\x9a\xa5\x5b\x5e\xcf\x3a\xab\x7a\x67\x2d\x7d\xf7\xf1\xf0\xb7\xf7\x9d\x0c\xd7\xbf\xc9\x5d\xce\xeb\xd9\x68\xa4\xd0\xd1\xf4\x3c\xdb\xa7\x19\xf5\x3f\x1f\x67\x05\xeb\xb6\x5d\x1b\xbc\xe6\xf3\xd9\xd8\x35\x48\xd9\xad\x82\x71\x7e\x28\xc8\xc7\x96\x95\x5b\x83\x0f\x9d\x7a\x4f\xc9\xd4\x65\x72\x1c\xb0\x3a\xfb\xfd\xce\xd0\x53\x5f\x35\x7b\xfd\x1d\x87\x66\xf5\x5d\x75\xcc\x2e\xee\x1b\xd0\x51\x2c\xfc\x1e\xea\x04\xb0\x24\x34\x57\x7a\x45\x7d\xa9\xef\x3a\xca\x94\xd2\x1b\xa8\x7f\xce\x5e\x23\x44\xaa\xa8\x53\xe6\x4d\x1f\x5f\x42\x41\xaa\xfc\x37\xc9\x47\x89\xb9\x6c\x00\xfb\x88\x5e\x51\xc4\x6c\xbf\x26\xca\xac\x9c\xf9\xd5\x6b\xc5\xd6\xff\x22\xee\xf0\x09\x5a\x81\xb8\xe3\x87\xcb\x1d\x94\x1b\x96\xa9\x67\x4e\x3a\xcf\x66\x02\x6c\x10\xbd\x8f\xa7\xb8\xfa\xe6\x83\xdc\xb7\xa3\x67\xd5\xa6\x73\x85\x0f\xe8\x7e\xb8\xd1\xcc\x71\xaf\xf0\xe7\x16\x37\x0b\xff\x26\xee\x33\x39\x46\x67\xbc\x9c\x00\x16\x80\x2e\x6a\xa2\xd9\xab\x7b\xf3\x0c\xb5\xfe\x8f\xef\xdd\x5d\xbc\x4f\x11\x51\x2f\xdf\xb9\x45\xa9\x4b\x43\xa1\xf3\x86\xfe\x05\xe9\x76\x77\x43\x51\x80\xbd\x47\xff\xfc\x8b\xee\x98\x67\xf5\xc5\x61\x27\xc4\x57\x2a\x4f\x88\xbb\x48\x6b\x44\xbd\x94\x38\x49\xe9\x85\xcd\x31\x05\x05\xec\x0d\xd1\xaf\xac\x01\x58\x3f\xfa\x78\xbf\xca\xc9\x80\xde\x91\x94\x8a\xab\x5b\xe5\xa5\x3f\x1e\x48\xa1\x2b\x7f\x4e\x36\x68\x12\xd9\x3d\x15\xab\x95\xe9\x3a\xc9\x6e\xb2\xd1\xbb\x0c\xa0\x61\x2f\xf7\xec\x99\xf6\xdf\x5a\x3a\x12\xc2\x59\x7f\x6c\x4c\xe5\xb7\xe1\xec\x85\xb5\x73\xde\xf6\xac\xe2\x37\xd6\x0f\x62\x3c\xad\x3c\x2d\x00\x60\xa5\xe8\x16\x1e\x8c\x7a\x46\xab\x3e\x92\x4f\xfd\xa0\xfe\xd4\x55\x8f\xee\xa6\xc7\xfc\x1a\xd9\xf3\x51\xdd\x46\xe1\xc1\x87\x9f\x74\x2f\x72\xdd\xb7\x02\xd8\x20\xca\x02\xa4\x5c\xc7\xb6\xba\xb0\x0b\x3b\xde\xa8\x5c\x3d\x57\xe2\xc5\xc1\xf2\x4d\x59\xa1\xe1\xd0\x3e\xbf\xd4\x7b\x01\x34\x23\x8e\x4b\x3b\xaf\x38\x01\x19\x1d\xe4\x71\xae\x2d\x39\xed\x7e\xb6\x3e\x2a\x86\x56\x72\xf9\xac\xaa\x2e\xca\xc6\xef\x45\xcd\xcd\xf2\x0d\xb5\xcd\xa6\x8d\x03\x6f\x90\xe9\xb8\x01\x2c\x11\x6d\x8c\x6a\xef\x84\xbf\x75\x2b\xa9\xf5\x61\xf6\x7e\xa1\x70\xe4\x65\xc4\xa9\x8c\xec\x67\x8b\xb4\xef\x23\x19\xde\x5e\x96\xd8\xd9\x62\x1d\xfe\x1a\x60\x5f\xd0\x1a\xe5\x91\xfb\xe8\x5b\x4d\x9e\xf6\x05\x32\xe6\x5f\x7e\xaa\xd3\x7c\xfa\xa9\x0f\x0a\xe9\x84\x77\x3e\x69\x8c\x8a\x72\x24\x6b\x3a\xff\x3c\xc6\x09\x60\xe1\xe8\xe9\x8e\xab\x62\x65\xae\x2f\x30\x7e\x7c\x24\x24\xdb\x61\x67\x54\xc1\x34\x76\x58\x30\x7e\x6f\x63\xcc\x96\xfd\xe5\x75\xcc\x16\x9d\xbb\x7c\x00\x16\x8d\x8a\xd3\x37\xfe\x74\xd5\xb1\xcf\x51\x93\x16\xb3\xf8\xc9\xad\xb3\x86\x0e\xdc\x93\x14\x49\x3d\xf7\x44\xfb\xcc\x4e\xff\x9d\xea\x02\x46\x77\xf6\x00\xac\x1f\xed\x09\x04\x33\x45\x33\xa7\xa3\x34\xee\xdc\x79\xb1\xab\xba\xa3\xb0\xe6\xe3\xea\xbb\x3d\x3e\x01\xef\x6b\x2e\x5a\xd0\xff\xca\xa9\xd0\x39\x7a\x17\x00\xcc\x03\x5d\xd9\xb8\xcf\x65\x63\x45\xbe\xe9\x1a\x31\xf4\x12\xe0\xcc\xae\x4a\xd1\xd7\xb2\x4d\x83\x4f\x48\xe1\xcf\x9d\x1e\x64\x5f\x37\x3c\x7e\x77\x1b\xc0\xea\xd1\xe3\xda\xae\x9b\x6b\xd9\x1b\x7a\x2e\xb3\x7a\xfa\xb1\xa0\xd0\xc1\x91\x0a\x5b\x4f\x8a\x67\xe3\x2b\x52\xe7\xd8\x18\x07\x6e\x36\x07\x5c\x7f\x0c\x00\xe6\xf6\x3f\xdf\x46\xad\x4d\x33\xff\x49\x21\xf2\xb2\x68\xc8\xe4\x23\xd3\xed\x62\x97\x26\xfa\xef\xcf\xbf\xbc\x7a\x17\xc4\x7c\x95\xbb\x3e\x49\x32\x6b\x17\xc0\x56\xd0\x9e\xb7\xeb\x40\x5e\x95\x3b\xab\xc2\x87\xf7\xec\xea\xfc\xba\x09\xdd\x25\x23\x87\x0f\xf8\x1c\x94\x15\x74\x67\xe6\x7f\xcf\xd1\x6d\x5a\xff\xdb\x09\x60\x55\x68\x6e\xfa\x9a\x20\x4a\x41\xca\x33\xe1\xf7\x31\x5d\x63\x14\x7c\xaf\x33\xd0\xb7\xc7\xea\x15\x6f\xa7\xaf\xe5\x2e\xf5\x3e\xd6\x7a\x1f\x87\x42\x80\x7d\x43\x63\x29\x07\x92\x4f\xd8\x25\xd2\xcb\xee\x93\x5e\x94\x62\x6d\xa3\x8c\x95\xdd\x7e\x6e\xbd\x72\xea\xce\xf1\xf2\xfe\x28\x32\xea\xd2\xfb\xf5\x00\xfb\x83\x5a\x13\x1c\xca\x58\x99\xef\x4a\x39\x7f\xd1\x78\x60\x52\x35\xd7\x3a\x37\x2c\xd2\xbb\x4a\x70\x56\xfc\x2c\xf3\x2e\x49\x87\xdd\x21\x25\xed\x4e\x00\x73\x44\x9f\x7f\x68\x42\x7b\xb8\xd0\xf2\xe8\x4a\xf3\x0e\x3b\x9e\x0f\xf6\x9f\x4a\xf6\xa5\x79\x1c\x3c\x5f\x2b\xa5\xb5\xcb\xf1\x81\x82\xe1\x6d\xaf\x1d\x00\x6b\x40\x43\xff\x63\xb4\x7e\x78\x57\xbd\x9e\x4d\x17\x3f\x9f\x98\x04\xed\x78\xc2\x15\xb6\x94\xfc\xeb\x7a\x67\x07\xf6\x32\x05\x28\x54\x7d\x7c\xed\x03\xb0\x4e\xf4\x8c\xec\xf8\x9c\xb7\x64\xe3\xfc\xce\x9e\xd3\x22\x28\xb2\x22\x2f\xdd\xd2\x74\x6b\xc5\xc1\xc8\x6f\x74\x2f\xb6\x46\xfb\x78\x76\x76\x96\xa3\x1f\xe9\x75\xbf\xe7\x78\xa2\x3a\xe7\x40\xef\x90\x6f\xd6\xba\xfe\x4b\xa7\xc5\xdb\xe1\xc6\x3a\x22\xf9\x01\x0c\xf3\xa7\x13\xaa\xea\x97\xf4\x55\x91\x47\xfd\x97\xd2\xbb\xb6\x5f\x39\xcd\x39\xa7\x2e\xa3\x9b\x7e\x5c\x93\xbb\xd6\x38\x82\x9f\x51\x57\x5d\xcf\xb3\x4a\xef\x9a\x11\xc7\x97\x2d\x1b\x27\x15\xdd\x00\xa2\x17\x1e\x39\xd9\x9f\x7f\xad\x70\x26\x24\xf7\x8d\x60\x80\x56\x4d\x49\x4e\x4d\x59\xd5\xc7\xa1\xa5\x92\x03\x0b\x8d\xd9\xed\x7b\x16\x00\x36\x80\x66\xbd\x1f\x3f\x6d\xf7\x6d\x66\x8f\x91\x8e\x63\x9a\xd0\xd0\xe3\xf0\x5d\x57\x23\x7f\x4f\xbe\xd9\x53\x9c\x27\xe3\x62\xca\xd0\x6e\xec\xf5\x20\x00\x58\x30\x1a\x13\x96\x60\xe9\xf1\xe8\x38\xc5\x24\xe9\x7b\x97\x24\xac\x1f\xe9\x9a\xd0\x1c\x99\x77\xf6\xb4\x8e\xf5\x8c\xfc\x61\x3e\x13\xe8\x5b\x2a\x01\xb0\x4c\x74\xfd\x9f\xa8\x3d\x59\xe4\xe8\xec\x4e\x7b\x65\x9f\xbc\x6b\xa9\x80\xef\x6d\xec\x2f\x5e\xcc\x84\xa2\xb3\x46\x62\x42\x5b\xe0\xa2\xb1\x9e\x04\xf2\x68\x60\xc0\xb4\xe6\x90\xa7\x5c\xef\xa9\xaa\x38\x9f\x86\x9b\x32\xca\xdb\x65\x4a\x6b\x69\xfc\xa7\xb6\xff\x78\xd6\xe6\x30\xa8\xef\x95\x08\x00\xd6\x8e\x1e\xeb\xe2\x9b\xd7\x0c\xcb\xfe\x50\x1c\xb0\xea\x88\x30\x3d\xa0\x20\x2d\xb6\xa5\x46\xab\x47\xb6\x78\x50\xeb\xc7\x36\xa7\x9a\xc7\x99\xef\x4f\x01\x6c\x09\x75\xf4\xfe\xc0\x73\xd5\xd3\xf2\x65\x8f\x4e\xee\x8e\xdd\xc5\xdb\x9f\xbd\x6d\x93\x8a\xe8\x16\x4b\xf0\xfc\x72\xde\x27\xa9\xa0\xfe\xa8\xfe\x22\x00\xb0\x66\xb4\x51\xf2\xf6\x54\x9d\x36\xce\x39\x7f\xa0\x6a\xa7\x12\xa5\xa6\xdc\x2e\xed\xf3\x3c\xd4\xc2\xae\x57\xad\xb3\x79\x27\xed\xcc\x3a\x57\x72\xad\x00\x36\x80\xd6\xbd\x02\x7d\xd1\x85\xb6\xad\xf3\xf6\x67\x83\x87\xa5\xbf\x5e\xde\x99\xa2\x9e\xeb\x26\xd9\x26\xf2\x59\x4b\x23\x46\x61\x91\xe3\x0c\x75\xb9\x13\xc0\x02\xd1\xc0\x04\xdd\x67\xfe\x43\x57\xc1\x60\x18\xd3\x97\x7d\x9a\x7c\xf5\xce\x32\x65\xce\x0f\xcd\x9c\x68\x59\x61\x32\xad\x32\x37\xc9\x26\xaa\x11\x80\x7d\x41\xab\xc7\x2b\xf9\x93\xb7\xfd\xfa\x7c\xcd\x97\xb6\x91\x19\x69\x79\xfb\xcf\x75\x33\x51\x9d\x59\xa4\x32\x1a\x4f\xb1\xea\xf3\xdd\xdb\x59\xdd\x06\xb0\x25\xea\xff\xb9\xd0\x70\xaa\xac\xd5\x55\xdb\xfc\xdc\xd3\x35\x4b\xee\x78\x93\x22\x0e\xf1\xd9\xd7\x5b\x4b\xe3\xc7\x0b\x97\xdf\x91\x0e\x85\x9c\x76\x04\x00\xf3\x44\x83\x63\xf0\xf8\x60\x95\xe9\xf6\xfd\x54\xf7\x97\xb6\x68\x2a\xf7\x0a\xfd\xa6\x5c\x0f\x71\xe3\x62\x3a\xe1\xc9\xf7\x91\x5a\xeb\x52\xf7\xe9\x13\x00\xeb\x44\xd5\x5e\x97\x3d\x82\x0e\xbb\x18\x5f\xb6\x92\x94\x31\xad\xad\x19\x2f\xbf\x6b\x9b\xcf\x75\x0e\x63\x07\x5e\x53\x0a\x95\xde\xe3\x9b\xbd\x5d\x8c\xde\xb9\xce\xe1\x7c\x5d\x69\xbf\xa2\xfc\x41\x8d\x41\xab\xd1\x78\x72\x54\xc6\xf3\xb2\x58\xdd\x6e\x49\x56\x9a\xe7\x9c\xe6\x1e\xfe\x85\xbb\x48\x00\xcb\x40\x2d\xa9\x4d\xd5\xba\x2d\x61\x39\x39\xc9\x6e\x7f\xc4\xc1\xb5\x55\x82\x9e\xa2\x8b\xd6\x8f\xdf\x94\x7f\xd4\xc8\x54\xac\x70\x75\x87\x1a\xab\x13\xc0\x5c\x50\x09\x64\xf1\x8f\x7a\x5c\x47\x8e\xa0\xdf\x83\x0a\x66\x56\xe5\xc1\x58\x61\x49\x4a\xbb\x2f\xe7\xfc\xdd\xd6\x5b\xd4\x2e\x5b\xf8\xfd\xd8\x27\x0f\xb0\x6c\x74\x99\x46\xeb\xb2\x5a\x8a\x59\x53\xaa\xce\xbb\x7f\x16\xe2\x07\x67\x8e\xca\xf7\x25\xbc\xb9\xbe\xe3\xdc\x55\x15\xf7\xb2\x6f\x85\xda\x97\x94\x00\x36\x8a\x96\x02\xb5\x34\x41\xdf\xd5\xa7\x57\x8f\xef\xb0\xa6\x78\x33\x7f\xef\x62\x1c\x1b\xab\xbc\x4a\x92\x84\xaa\xb1\x69\xfc\x77\x7e\xd5\xaf\x42\x0b\x00\x60\xa9\x68\xdd\xe3\xc5\x94\xca\x4a\xd9\x3a\x3a\xde\xd1\x33\xed\x20\xbb\x96\xe4\x43\x75\x41\xc3\x2d\x78\x7a\x7d\xed\x51\xa7\xc1\x03\x49\xfd\x2b\x4f\x00\x36\x80\xd6\x82\xde\x9b\x7e\xd4\x46\x55\x16\x21\xb3\x03\x99\xea\x9b\x86\xbf\x2a\xec\x3d\x7f\xf9\x21\xc3\xc2\x03\x6e\xfa\x8b\xab\x66\xb7\xb4\x6e\xc7\x03\x80\xa5\xa1\x9b\xc6\x7e\x21\x50\x6f\xdf\x87\x6d\xfc\xbf\x28\xd3\xb3\xc8\x3f\x64\x64\xed\xb1\x9b\xdc\xc2\xc6\x77\x43\x94\xb7\x21\xef\xb6\xf3\xd2\xf5\x76\x80\x4d\xa2\xa9\xe0\xd8\x17\x27\x76\x8a\x54\x31\xad\x57\xbc\x21\xd7\xd8\x3d\x32\xe2\xc9\x1f\x9f\x0a\x12\xde\x7d\x72\xd7\x90\xc1\x6e\x83\x7c\xef\xad\x4d\x7f\xbf\x12\x48\x44\x97\x81\x1c\xd5\x16\xe9\x4c\x57\x12\xc0\x9e\xa3\x7f\xde\x92\xfa\x45\x38\xa5\xd2\x75\xc6\x9c\xa6\xd2\x49\x92\x8e\x7d\xdc\xce\xdb\x7d\x87\x36\x9b\x34\x0b\xa7\x98\x45\x2b\x66\xd7\xd1\xd4\x92\x00\xf6\x1e\x0d\xce\x87\x2c\x91\x34\x87\x4b\x09\x29\xef\x2f\x8d\xa6\xd6\x53\xbc\xac\x2d\x71\x0e\xb5\x8b\x56\xfc\x48\xd7\x7c\xad\x8d\x8f\xb6\xbf\x24\x80\x04\xb0\x60\x34\xf8\xc1\x2c\xdc\xfb\x16\xef\xbe\x7f\xd3\x7a\xe5\x7b\x5d\xd1\x09\x91\x53\x26\x9f\xca\xd7\x66\x4b\xbe\xca\x7f\xcf\x5e\xed\x67\x1c\xe6\x13\x25\x01\x2c\x04\xb5\x27\x48\xfa\x61\xab\xdc\x43\x0e\x81\xaf\x26\x27\x63\x0a\x0f\x73\xd0\x0d\x1d\x10\xae\x8c\x8a\x92\xa5\x32\x97\xbe\x75\x97\xee\xb3\xd3\x7d\x12\xc0\x3a\xd0\x7c\xdd\x2e\x77\x4a\x62\x7a\xd7\xc0\xf9\x57\xe7\xbe\x33\x7d\x0b\x79\x78\xe3\xfc\xe3\xb7\x35\xf2\x3e\x54\x03\x8b\x1f\x5e\x3c\x6c\xbe\x46\xff\x95\x04\x64\x8e\xa0\xee\x0e\x7a\x7b\x85\xdf\x17\x6e\xdc\xe3\x59\x1b\x5d\x90\xfe\x32\x5c\x78\xc7\xce\xb3\x55\xb7\xe3\x65\x36\x3f\x5b\x91\x3a\xf2\x40\x73\xb7\xf0\xbf\x45\x05\xc8\x51\xfd\xfd\x41\x3b\x14\xc1\x88\x22\x83\x63\xde\x43\xd5\x81\x28\x3a\x38\x26\x18\xb6\xba\x44\x11\xc2\x31\x21\xd0\x36\xa2\x28\xe1\x98\x0e\xf8\x1f\xe6\x88\x42\x05\x31\x32\x47\xfe\xbe\x86\xb0\x05\x83\xaf\x89\x81\xb3\x0e\xc2\x36\x0c\x62\x52\x60\x08\x08\x7b\x31\x88\x99\x80\x77\x43\x09\xfb\x31\x88\xc9\x84\xf7\xa6\x88\x9a\x32\x1c\x53\x09\x6f\xab\x10\x76\x66\x30\x6c\x4f\xfe\xbe\x86\xb0\x3b\xc3\x77\x01\x5c\x51\xa2\x16\x0d\xc7\x74\x42\x61\x85\xa8\x4d\xc3\x31\x6d\xf8\xed\x66\xa2\x86\x0d\xc8\xf1\x92\x6d\xf9\xef\x7f\x41\x07\xa1\x59\x91\x34\xb7\x6d\xea\x6e\x1b\xb3\xd7\xe1\xa5\xc0\x5e\x49\xcd\x3e\xd1\xd9\xe8\x9d\xbe\xb4\xc2\x67\x2f\xf1\xd1\x6c\xbd\xc6\x38\x1e\xa4\x4d\x02\x58\x35\x5a\x32\xac\xcb\x02\x6e\x04\x91\x17\x79\xd9\x9f\xfb\xf2\x68\xbe\x75\xd8\xcb\xb4\xdd\xe4\x75\xdb\x8b\xad\xf5\x99\xeb\xbc\x29\xd5\xfb\xd8\x4d\x48\x00\xf3\x46\x59\xa0\x19\x5d\xa4\x75\x86\xef\x2b\x91\x13\x02\x6d\x95\xdb\x83\xe7\x0a\x7d\xde\x15\x2f\x88\xfe\xbe\x93\x3f\xa9\x62\x71\xee\xc9\x15\xaa\x40\x12\xc0\x9a\xd1\xbf\xef\x5e\xec\x52\x52\x7e\xb0\x6b\x8c\x2a\xa7\xc4\xff\x51\xcc\x99\xdd\x95\xaa\x4a\xdb\xee\x8b\xe6\x78\xd8\x6d\xa7\xd4\xbf\x5d\xb9\x90\x2c\xfc\x6f\x66\xe3\x21\x0a\x82\x62\x0d\x91\xe9\x38\xa6\x1a\x4e\xeb\x88\xcc\xc7\x31\xde\x50\x78\x21\x72\x01\xc7\x34\xc3\xf7\x10\xb6\xcf\x10\x93\x04\x35\x3b\xc2\x1e\x1a\x62\x3e\xc2\xf7\x10\x35\xd2\x38\x66\x10\xaa\xf9\x84\xcd\x34\xc4\x04\xc0\x13\x49\xd8\x51\xe3\x49\x16\xbe\x87\xa8\xad\xc6\x31\xfd\x10\x43\xd8\x5a\x43\xcc\x00\x9c\x00\x10\xb6\xd7\x10\x53\x0a\xb3\x12\x51\x8f\x8d\xc4\x0d\xfe\x0f\x26\xc2\x46\x1b\x66\x18\x9d\xbf\xaf\x21\x6c\xb6\xe1\x6b\x12\xe1\xe0\x84\xa8\xe3\xc6\x31\x5f\xa0\x9e\x48\xd8\x75\x43\x4c\x38\x4c\xe6\x84\xad\x37\xc4\x44\xc3\x4b\x55\x84\xfd\x37\xbe\xa4\xf0\x98\x12\xf6\xe0\x10\xe3\x01\xb7\x01\x61\x23\x0e\x31\xf5\x30\x33\x13\x36\xe3\x10\xe3\x06\x63\x4d\xd4\x91\xe3\x98\x15\x98\x0e\x08\xbb\x72\x88\xa9\x82\x1f\xf3\x23\x6c\xcd\x21\xe6\x1b\x8c\x35\x51\x7f\x8e\x63\xfe\x40\xdb\x08\x7b\x74\x88\x71\x84\x18\xc2\x46\x1d\x62\x1a\xe0\xfa\x10\x75\xeb\x48\x15\x64\x84\x63\x63\xa2\xbe\x1d\xc8\x51\xb8\x93\xfd\x37\x74\x8b\x40\x99\xa6\x11\x2d\xcb\xbb\xc5\xbb\x9b\xa4\x59\xfd\xac\x3f\xed\x25\x39\x78\xae\x78\x69\x7f\xc4\x8a\xb4\x05\xd4\x16\xee\x0d\xfe\x4c\xd1\xde\x60\xa6\x13\x28\xf3\x35\x0a\xd6\x09\x59\xf6\x88\x95\xec\xba\x1c\x75\xa2\x6b\xa0\xa0\x88\xf6\xa2\xa5\x5e\x54\x8b\x5b\x91\x7d\x5e\xf6\x6f\xd5\x7e\x72\x2e\x12\xc0\x26\xff\xe7\x1f\x37\x75\x35\x09\xc5\x7b\xcd\x5f\x96\x66\xdb\x7c\x2b\xa7\x55\x28\xe7\xd2\x65\xb3\xcd\x1a\x22\xbf\xcd\x42\xb9\x0b\x6c\xd8\x54\xbc\x83\x49\x40\xe6\x38\xf2\xb8\xf8\x57\xeb\x5d\x9a\x07\x6d\x24\xf8\x5e\xfa\xde\x33\xe7\xd6\xb7\x08\xd2\xea\x17\x70\x9d\xcb\x7f\x64\xbb\x55\x75\xce\x72\x78\x97\xa3\xf0\xbf\x59\x8d\x47\x28\x02\x26\x25\x22\xcb\x11\x7a\x05\x4f\x31\x91\xf5\x38\x66\x12\x7e\xd5\x8b\xc8\x05\x3c\x91\x1d\x87\x74\x84\x50\x49\x91\x73\xe4\xe6\xfa\xef\xc7\x56\x75\xa8\x42\x76\xe2\x62\xb7\xbc\x69\xbd\xd2\xda\x57\xce\x6b\x14\xfb\xd6\x1a\xd9\x4b\xc8\x65\xc2\x98\xbe\xbc\xde\xc1\x94\x75\xf0\x05\x4d\x79\xa9\xde\x06\xb7\x42\x87\x09\xc6\x23\x53\xdc\x91\x09\xa9\x9c\xdb\x82\xe3\xd3\x2e\x39\xa6\x8c\x15\x57\x6b\x4b\x66\x8c\x76\x58\x36\x71\x3c\x31\xa0\xb5\xd8\xac\xb3\x91\xf5\xd0\xbf\x2f\xf9\x82\xbb\x9c\xc3\xdd\xc4\xfe\xaa\x8f\xf0\x01\xb1\x0f\x2b\x29\x9b\xf7\x2f\x2d\x89\x9c\xa1\xcb\xdb\x27\x66\x2f\xc0\xaa\xfb\x95\x8a\x04\xb0\x29\xb4\xb7\x57\x34\x3e\x16\xa0\xd4\x55\xa2\xd8\x53\x4f\x55\x6e\x79\xe7\x5b\xd0\xb2\x3f\x5d\x55\xd3\xc7\x2f\x59\xb4\xce\x83\x5c\xe6\xed\x76\x97\x85\xff\xcd\x6c\x3c\xaa\x75\x30\x97\x10\x99\x8e\xb0\x49\x48\xc2\x89\xcc\x47\x72\x3d\x7c\x0f\x91\x0b\x38\x66\x0a\x52\x0b\x42\x5d\x0b\x2f\x91\x30\x9f\x12\x8a\x5b\x78\x29\xc6\xbf\x56\x4e\x24\x70\xe1\x31\x80\xb9\x84\x48\xe5\x42\x1a\x84\x4d\xf0\x96\x12\xa1\xde\x25\x47\xce\x4e\x4e\xe6\x42\x02\x58\x24\xaa\x04\x39\x3f\x4c\x9f\x14\x1b\x18\x8f\x13\x24\xbb\x38\x57\x62\xa2\x58\xff\xec\xf5\x26\xe5\x33\x76\xe3\x3b\x6a\x57\x7a\x1a\xee\xbf\xb9\x59\xb6\xc1\x5f\xd0\xdc\x70\xeb\x5d\xd9\x83\x23\x5a\xfd\x63\x93\x09\x2e\x33\x02\xed\x2b\xbf\x4e\x38\x6a\x5d\xe0\xd9\x73\x98\x46\x41\x65\xfb\xdd\x1b\xfe\xa2\xc6\x24\x80\x79\xa1\xdb\xd1\x5f\xab\x2d\x9a\xcb\x76\xdb\x43\xbf\xfc\x09\x2d\xf9\x72\xca\x48\x27\x53\xdb\x19\x9a\xcf\xb7\x07\x6b\xf3\xf6\x0d\xaf\x89\x6f\xbe\xbd\x91\xe0\xd1\xed\xb8\x6a\x7b\xac\xe1\x8e\x48\x58\x0b\x49\xa0\xd5\x58\x93\x85\xec\xfa\x59\x9f\x23\x6b\xde\xdc\x92\x2c\x5c\x9f\x2f\x38\x28\x92\x7e\x76\x6d\x2c\x08\xaa\xc0\x28\x45\x8c\xd9\x39\x1d\x9d\xcb\x78\x26\x02\x3e\x71\x73\x08\x08\x68\xe8\x1c\xec\x14\xbd\x7d\x7e\xe4\x8f\x52\xe6\x0f\xfb\xc1\xad\xee\xc2\xff\xe6\x26\x1e\xd2\x48\xc8\xf0\x88\x5c\x45\x18\x1e\x2c\x51\x44\xee\xe2\x18\x2f\xb8\x7d\x89\x5c\x46\x4a\x21\xdc\xbe\x44\x6e\x23\xdb\x17\x36\x5d\x84\x0a\x27\xc4\xb4\x43\x1a\x45\x28\x73\x42\xcc\x12\xdc\xf2\x84\x52\x27\xde\x1d\xc0\xcb\x15\x44\x7a\x27\x72\xb4\xa0\x3f\x84\x9a\x27\xc4\x04\x42\xda\x41\x28\x7c\xe2\xe9\x05\xee\x03\x42\xf5\x13\x8f\x01\x5c\x1f\x42\x05\x14\x62\x3c\x61\xdc\x88\x64\x50\x84\x42\xd0\xc1\x0b\xde\x44\x82\x28\x90\xa5\xd8\x44\xda\x38\xf5\x99\x68\x0f\x3a\xc2\x37\x9b\xd2\x92\xaf\x30\x79\x1b\xb4\x17\x5c\xe5\x74\xfb\x3d\x2f\xa0\x40\xce\xfc\x63\xa7\xe1\xd8\xc7\xb8\xcd\xaa\x0a\x45\x02\x24\x80\x15\xa3\x45\x48\xaf\xe8\xf3\xa4\xca\x9d\x02\x37\x5d\xe0\xac\xdc\xda\xaa\xa8\xeb\x7b\xa5\xd2\xed\x29\x7d\x45\xcf\xb2\xe0\x70\x32\x6d\x64\xb5\xc4\x46\x8c\xd1\x9b\x6d\x4d\xaa\xa5\x0b\xfb\xef\x1a\x51\x16\x6b\xd4\x67\x7f\xac\xf4\x7a\x16\x18\xb8\xdd\x35\x5d\xe1\xc6\x66\x4e\xb6\x1c\x8b\x78\x31\xbb\x15\x12\xc0\x66\xd0\xf9\x61\x87\xf8\xce\xdc\xc8\x92\x99\x4b\x91\x72\x2e\xf3\x65\x8f\x0e\x4a\xe4\x6d\xfd\x8c\xb1\xe9\x44\xf8\x1c\x4e\x0d\x3a\x32\x26\x69\xb7\xc1\x68\xdc\xd0\xb1\x01\xf7\x0f\xf3\xe5\xe5\xed\x5b\x9f\xe4\xfd\x28\x76\x55\xe0\xdd\x24\xb6\xce\x2d\x55\xf7\x67\x29\x45\x84\xbe\xeb\x75\x85\xd3\xd3\x44\x11\xe1\x7f\x73\x13\x49\xa4\x70\x15\x88\x5c\xc5\x31\xc5\xb0\x68\x11\xb9\x8b\xec\x44\x78\x49\x82\xc8\x65\x1c\x33\x03\xfb\x3a\x22\xb7\x11\x42\x0f\x8b\x09\x91\x02\x8e\x63\x32\x60\x0c\x08\x55\x70\x88\x71\x81\xb7\xe8\x08\xa5\x70\x88\xc9\x86\x27\x98\x50\x0f\x87\x98\x51\x48\xef\x08\x35\x71\x88\x49\x85\xe2\x26\xa1\x30\x8e\x67\x17\xd8\xa4\x11\x8a\xe3\x10\x93\x06\xb3\x0b\x91\x42\x8e\x50\x4f\xf2\x3f\x6d\xff\xf7\x51\xba\x81\x16\x37\x3f\x0e\xbe\xcb\xc9\xb1\x3d\xe2\x01\x54\xce\x36\x8b\x21\xef\x13\xb6\x38\x8f\x67\x97\x1e\x98\x02\x63\x07\xd7\xbd\xbe\x01\xb9\xc9\xe5\xf5\xc9\xb0\x3d\xe8\xcf\x27\x86\xa4\x8c\x84\x5c\x9f\xb8\xc4\xcd\x1b\xcf\x4d\x2b\x35\xaa\xad\x07\x6a\x29\xe6\x53\x5b\x5f\x8c\xd6\xfe\x8d\x91\x2a\xaa\xe3\x9c\x00\x16\x8e\x4a\xe5\xcb\x26\xbf\xa2\x84\x79\x35\x2d\x98\x53\x7f\xf0\x85\xaa\x8a\x6d\xe2\x4d\x7f\xb0\xb7\xf2\x8c\x81\x58\xeb\xbc\xcd\x22\x96\xf2\xb5\x1d\x60\x99\xe8\x69\x24\x3f\x20\x66\xd0\xfa\xae\x77\x62\xc1\x6c\xe7\x21\xc3\xc6\x50\x97\x0a\xd1\xd2\xe7\x0f\x44\x97\x33\x72\xbb\x05\x07\x82\xd2\x2e\x5a\x02\xac\x00\x7d\x7c\x4f\xfb\xd1\x9c\xd4\xaf\x66\x97\x9b\x62\x49\xef\xf9\x59\x54\x03\x0f\x27\xc6\xd0\x51\x73\xfb\xde\xf3\xd9\x11\x4c\x62\xb3\x2e\x4d\x77\x02\xd8\x7b\xb4\xc4\x7f\x9c\x19\x7d\x4d\xa6\xc7\xec\x57\xdd\x35\x46\x3b\x47\xbe\xc5\xd6\x84\x53\x65\xb3\xf0\xd4\xa5\xfb\x59\xaa\xce\xe6\xd1\xea\x64\x32\x00\xab\x47\xa7\x14\x0e\x5b\xa2\xd9\xa3\x76\xe9\x0c\xb8\xf1\x5a\xb3\xa8\x07\x0e\x66\x85\xc4\x50\xf4\xdd\x7e\xf7\xb0\x4b\xec\x87\x6f\x98\x86\x60\x6a\x0a\xc0\x26\x50\x42\x70\xe7\x59\x21\x47\x79\x9b\x05\x5f\xd3\x31\x6d\xe7\xa2\x40\xcf\xcf\x8c\x96\xd6\x29\x67\xae\xfb\x5e\xf0\x1e\x65\xb8\xd7\xf4\x98\x7d\x0b\x00\xd8\x18\xfa\x7c\xa3\xfc\x0d\xaa\x7c\xfe\x1f\xd5\x12\x64\x2a\x66\x05\xba\xcf\x46\x7b\x2f\xb4\xd8\x2a\xc6\x71\x64\x71\xcb\x95\x5d\x14\x0e\x1d\xdf\x06\xb0\x29\xf4\xf1\xdd\xbb\xe8\x22\xcf\x92\x19\xf6\x71\xe8\x1b\xd8\xa6\x87\xb2\x67\xc7\x58\x8c\x2c\x5e\xf1\x3b\x7e\xe3\xf7\xec\xc5\xfc\xaa\xfb\xcd\xd5\x4e\x00\x8b\x44\x9f\xe7\xf8\xca\x55\xc9\xa5\x75\x3f\x60\x87\x32\xcb\x36\x81\xd4\xb3\x0e\x09\x66\x92\x3b\x22\x2f\x39\x34\xda\x1c\x12\x39\xa2\x51\x6a\x64\x05\xb0\xe7\x28\xbd\x32\xa1\xd1\x6d\x8a\x78\x2b\x74\x22\xe3\xd9\x33\x1b\x8a\x89\x9c\xa7\xc9\x71\x1d\x27\x9c\xee\x68\x49\x86\x45\xec\x50\xde\xbf\xae\x7d\x16\x60\x15\x28\xbb\xe2\x37\x6e\x2d\xb4\xdb\xde\x16\x71\x58\x80\xbb\x35\x56\xcd\x3b\xec\x7e\xf8\xde\x6c\x56\x03\xf9\x9b\x47\x96\x13\x87\x0e\x9f\x94\x0e\x05\x00\x8b\xfd\x9f\x7b\x1a\x1f\x0f\xbf\x29\x79\x59\x7a\x96\x93\xed\xda\x00\x8b\xdb\x65\x46\x1b\xe6\x77\xa9\x3e\xa6\x0e\xb4\x8d\xcb\xc6\xaf\x72\x0b\xde\xfe\x06\x58\x05\xba\x6f\x9e\x8d\x1c\x60\x64\x5e\x08\xca\xcd\x56\x54\xf6\x2e\x4d\x70\x72\xbd\x19\x7d\xc4\x88\xca\x2e\xcf\x33\xee\xd0\xda\xb7\xd1\xeb\xb9\x2e\x00\x60\x1e\x28\x99\x2c\x6a\xac\x56\x6c\xdd\xb2\x2d\xc4\xbc\xe5\x80\xd8\xb9\x3b\x2d\x0f\xae\x4f\x5e\x65\x9b\x53\xd4\xa9\xa8\x10\xa1\xd5\xa7\xca\xed\x3c\x09\xb0\x55\xb4\x8f\xf5\xbb\x4f\x3f\x2b\xb0\x27\xf9\xd8\x8e\x1b\x34\x2d\x74\x33\x35\x5f\xe9\xc8\x49\xf2\x76\xdb\x96\x98\x4d\x84\xee\x7c\x10\xb6\xd2\xf0\x24\x01\xac\x06\x7d\x3e\xa9\xe9\x8f\x1c\x47\x47\x93\x78\x77\x7d\xa5\xc6\x63\x8a\xa5\xda\xf3\xe5\x96\x1f\x0f\xcc\x8e\x96\xd2\xcc\x28\x17\x18\xe4\xdb\xca\x39\x01\x2c\xe3\x7f\x3e\xac\xb3\xea\x29\xf0\x0b\xdb\xcd\x71\x4e\x92\x8c\x27\x8e\xd2\xdb\xfa\xed\x53\x72\xcd\x88\x58\x6f\x0b\x5f\xdb\x72\x5f\xda\xb0\x01\x37\x80\xe5\xa0\x1b\x8d\xa6\xe1\x27\x8b\x50\x9f\x58\x28\x4d\xab\xe9\xc4\x33\xa9\x71\x2e\xff\xe3\x17\x12\xc4\xe7\xe9\x5f\x59\x95\xc5\xa5\xc8\xa4\x4e\x8c\x00\xac\x1d\x8d\x65\xe1\x3d\xa5\xb1\xe7\x65\x42\x37\xb7\x1d\x2d\x28\xdf\x2e\xa2\xee\x15\xb1\x6a\x4b\x33\x21\x9e\x6c\x3f\xed\x99\xdc\xe3\x21\x9c\x72\xcb\x09\xc8\xa0\xff\x01\x94\x64\x7f\x29\x69\x5d\xf0\xae\xc1\x32\xdb\xa5\x97\xd7\xcc\x34\x1b\x9c\x6d\xaa\x6e\xeb\xf4\xa8\x9d\xd4\x2e\x95\x51\x12\x37\x99\x59\x01\xd8\x27\x74\x23\x38\x4a\x26\xb1\xd2\x45\x24\x4d\x65\x51\x45\x5f\x35\x48\x98\x18\xbe\x31\x79\xf7\xd3\xe3\xb3\x92\x0f\xe5\x19\x44\xf3\x5b\x7f\x94\xd0\x00\x6c\x0d\x35\xa6\x8d\xa5\xcf\xed\x62\x2e\x8f\x58\xf4\x55\xd3\xf4\x9c\x62\x2b\x8e\x43\xb5\xb3\x53\x66\x37\xef\x57\x3b\x69\x59\x9e\xec\xbe\xec\x5c\x04\x00\xe6\x8b\xce\x39\x0d\xd3\xac\xd7\x3b\x27\x6b\x02\x9d\xf4\xfb\xa6\x3b\xd6\xb6\xbb\xd4\x0d\xdc\x2f\xa9\x72\xcc\x96\x9c\xdb\x2e\x2f\xf9\xc7\xec\xba\x00\xc0\x4a\xd0\x85\x6d\xd6\xb6\x7d\xd2\x2b\xb4\xfb\x6c\xdb\xaa\xab\x88\xdb\xc5\x95\x15\x55\x5f\xbf\x31\xea\x00\x69\xc5\x79\x72\x31\xc6\x2d\xda\xce\x06\x4e\x00\xab\x45\x87\xe9\xa3\x79\x5a\x89\xb7\xe7\x0f\x5d\x95\x53\xba\x77\x2e\x2b\xd6\xc3\xce\x2f\xa3\xb9\x62\x53\x40\x82\xe0\xcd\xb3\xcd\x51\xaf\xcb\x55\xc6\x01\xf6\x0b\x15\x28\xf2\x3d\xd7\x7b\x73\xc4\x1b\x96\x4c\x0c\x3f\x4d\x53\xbb\x71\x37\xea\x5c\x2a\xbc\xb1\xd3\xd5\xcc\xd0\x9c\xec\xd3\x79\xc1\x7a\x83\x4c\x80\x8d\xa3\x3f\x16\x8c\x5a\xb6\x14\xda\x51\xdc\x46\x1d\xaf\xa3\xf2\x6a\xe5\x9a\xc3\x7d\x51\x61\x7f\x81\x8f\x46\x8e\xc1\x4f\x4b\x0b\x07\xfb\x1a\xc6\x69\x49\x00\x5b\x40\x17\xf6\xac\xf3\xb1\xca\xd6\x47\xa3\xa6\x2f\xac\x5e\x6c\x9e\x48\x5f\xbb\xad\xe0\xe2\xe1\x2c\xd6\x7e\x67\x2f\xb0\xe9\x48\x2d\x3b\x50\x55\x88\x66\x56\x5d\x71\xfd\x37\x1d\xa9\x06\xde\xbe\xcd\x52\xe7\x3c\xc5\x8e\x45\xaa\x6d\xed\x6a\x1a\x05\xc2\xe1\x6b\xcf\xa9\x27\x47\xf2\x74\x48\x40\x06\xd5\xfe\xb5\xbe\x63\xd4\xca\xc7\x93\xc4\x29\x1b\xf4\xd6\xe2\xdf\x05\x06\xa4\xe6\x0d\xce\x9a\x7c\x2e\x53\xe5\xa6\x14\x2a\x3e\xb6\x63\x76\x10\x79\x94\x56\xb0\x7b\x6f\xdd\x5e\x1e\xfd\x92\xd7\x77\xeb\x03\x14\x38\xd9\xb6\x5d\xa7\x04\xb5\x7e\x2e\x3b\x6c\x12\xea\x8d\x62\x0e\xf6\xf5\x3b\x01\xcc\x03\x35\xda\xe0\xf2\x7c\x72\x43\x32\xe5\x74\x6f\x8e\xef\x62\xe5\xe5\x0a\x67\x66\x4d\x0e\x86\x94\xfc\x63\x3e\x05\x7a\xc5\x97\x96\x3f\xf4\x72\x01\x2c\xf4\x7f\xfe\x61\xe1\xf8\x01\x87\xa3\x27\x3b\x2e\x80\x95\x2b\xbe\x6a\x66\x89\xed\xb3\xf3\x7d\x42\xac\x17\x72\xa8\xd4\xcb\x53\x44\xe2\xa4\xb3\xeb\x00\xd6\x8f\x3e\x6e\x76\xa6\xf8\xe0\xaa\xdc\x15\x19\xd3\xdd\xa5\x17\x5e\xfe\x19\x5a\xe3\x59\x1b\x63\x3a\x96\xb3\xcf\x40\x4f\xf2\xc1\xbb\x79\x36\x76\xf4\x23\x74\xce\xbb\x96\x76\x37\xe9\x3e\x5f\x4d\x90\x0e\x0f\x98\xfe\xb4\x87\x8a\x9a\x67\xa7\xe1\xe1\xa2\x36\xaf\xe2\xae\xba\x20\xa3\x4a\x21\x41\x74\x3a\x3f\x38\xa7\x7f\x95\xd6\xe6\xde\xeb\x85\xf8\x6f\xbb\xf4\x5d\xd7\x7f\xf2\x14\xff\xa8\x94\xd2\x6d\xed\xdd\x7a\xcb\xb8\xf6\x81\xe6\x3b\x12\xc0\xd6\xd1\xe4\x68\xce\xf6\x5b\x75\xb6\x98\x31\x80\x82\x73\xf6\x8a\x14\xb8\x5c\x4d\x29\xf5\xbc\xe2\x68\xf5\x1d\x7e\x46\x5e\x37\x2a\x15\x7f\x11\x8d\x0d\x82\x81\xd2\xbe\x05\x5a\xef\x13\x1c\xf4\xb1\x32\x55\xd7\x6f\x9d\x0b\x7e\x53\x9f\x31\xa4\x43\xf1\x4a\xf2\xe4\x6c\x5d\xb9\xe7\xe4\xdb\x90\x2f\xc7\x68\x9d\x00\x06\xd0\x6d\x38\x63\xae\x77\xa7\xf3\x9e\x4a\x24\x17\xff\x98\x2c\x59\x0a\x7f\x69\x78\x66\xd9\x82\x8c\xae\xe4\xa9\x7a\x4a\x31\x7d\x8e\x3d\x9f\x7e\x00\x2c\x14\x0d\xf9\x22\x6b\x9a\xa1\x48\xcb\xcb\x72\x41\xbb\xee\xbd\x87\xaa\x72\xb7\xeb\x2b\xe6\xe9\x35\xae\x52\xcd\x3c\x1f\x7a\xd3\xbd\xda\xe3\xdb\x07\xb0\x26\xb4\x8e\x31\xd5\x35\xec\x2f\xcf\xf9\xe0\xba\xcf\xc9\x6e\x57\x3a\x55\x48\xc3\x38\xad\x88\x74\x42\xeb\x07\x2f\x0a\x5b\x86\x5c\x43\x03\x07\x37\x00\xb0\x37\xe8\x99\x3b\x7e\xf8\xfb\x65\xad\x73\xdf\xba\x45\xee\x65\x19\x75\x7c\x35\x76\xa7\x10\xdb\xbf\xd7\x66\xaa\x6d\x75\x27\x6b\x94\x94\xc5\x42\xc5\x75\x80\xad\xa0\xd9\xcb\x36\xfd\x37\x8b\xdf\x3e\xbd\x2d\xa7\xdc\xde\x4f\x0a\xc9\x5f\x50\x36\xed\xb1\xe2\xe5\x37\xeb\xe0\xb9\x77\xdc\xba\xee\xfc\xa6\x13\x0a\x00\xc8\xa8\x21\x8f\x57\x36\xd7\xa7\x9c\x33\x3b\x56\x7f\xe9\x3b\xb3\x22\x4b\xca\x72\x58\x49\xa1\xdb\x29\xc7\xe0\x1f\x96\xd3\xaf\xaa\xef\x38\x1d\x4f\x55\x05\x32\x46\xe8\x4d\x84\xda\x33\x69\x7a\xfb\xf8\xe4\x36\x9f\x62\x60\xbd\xd2\x21\x50\xbf\x5d\xcf\xf7\x46\x32\x4b\x38\x2d\x69\x67\x84\x96\xce\xb6\x33\x56\xc8\xa3\x01\x7b\x79\x7b\x9b\x7f\x0f\xf1\xdc\x78\xe2\x78\xfc\xa0\x70\x74\x2f\xdd\x15\xd6\x9c\x4d\xca\x71\x17\xf5\x69\x9c\x4a\x4f\x2f\x5f\xb3\x75\x02\x58\x19\x5a\x93\xa6\x12\xdd\x7d\xa3\x72\x96\x24\xe2\x39\x79\xea\xec\xe8\x3f\x34\x78\x19\x90\x17\xf5\x07\x97\x24\x0f\xe4\x68\x7d\x6a\xc9\xf9\x6c\x0a\xb0\x9f\xe8\x1a\x95\xf5\xb0\xad\x6c\x8b\xfe\xe9\x3b\x3a\xb5\x53\x23\x6d\xcc\x39\x95\xfa\xd4\xc9\x9c\xf2\xc7\xb2\xac\x77\xbd\xa8\xb9\x32\xbe\xf7\x35\x01\x6c\x1a\x3d\x71\xe5\x61\x43\xfe\xe1\x47\xd9\x0f\xa6\x2d\x4a\xae\xac\xaa\x8d\x67\x30\x6a\xf8\xfb\x7c\xb2\x79\x9c\x2a\x7c\x63\xa9\x9e\xce\x9e\x11\xfd\xff\xec\x29\xd9\x8f\x02\x6e\xd9\x61\x9e\x35\x9d\xda\x51\x12\x87\x43\x1f\xf7\x79\x28\x2a\x33\xa9\xd0\x9c\x1f\x8d\x3f\x79\x53\x7c\xfa\x22\xfa\xf5\x44\xeb\xdd\x59\x73\x99\xba\x79\x87\x8c\xee\x25\x1f\x9f\x2f\xfd\xea\x42\xce\x6a\x12\xf4\x25\xad\x77\xb0\xd9\x41\xaa\x47\x73\xb1\xa7\x01\x79\x34\xfd\x1b\xc7\x9e\x8c\xe5\xb3\xdf\x65\xe4\x24\x62\x93\xcf\x69\xef\x8a\xd1\x71\xfb\xc1\xf4\x48\x2a\xf3\xf4\x66\x2f\xb7\xda\xec\x6b\xb4\x91\x14\xff\xc6\xd1\x80\x6c\x2c\xf9\x7f\x3f\x09\xfa\x80\xa6\xfd\x41\xaf\x9f\x39\x91\x21\xb4\x14\x07\xd4\x39\x63\xa4\x15\x6b\xb2\xaf\x54\x5e\xd5\xd6\x6f\xd4\xcc\xbf\xc0\xc8\xea\xb9\x63\x5e\x68\x37\x09\x60\x59\xe8\x26\x71\xfe\xe3\xe7\x4c\x6f\xd4\x71\x51\x70\xc7\xa7\xb6\xc7\xd8\x0f\xbd\x28\xf3\x3b\xbe\xa3\x9c\x97\x5f\xaf\x30\x0b\xfd\x7a\x9b\x9d\x56\x02\x00\x96\x81\x36\x66\x62\xaf\x97\xdf\x67\x26\xb5\xb7\x5c\xf5\x94\xa0\x2b\x0d\xbb\xbf\xab\x40\xae\xc0\x21\x9c\x71\xe7\x99\xbb\x66\xa7\x6e\x26\xbf\xb1\x0e\x03\xd8\x17\xb4\xef\x4b\x7d\xa9\x85\x19\x3f\x7b\xe9\xd7\xed\x57\xe9\x34\x5a\xb3\x53\x76\xd3\xd1\x88\xc6\x67\x4f\x43\xee\xd2\x18\x0f\xb9\xfc\xfa\xb0\x33\x85\x04\x30\x1f\x74\xd6\x2a\xdf\xc5\x11\x7f\xb6\x68\x33\xc3\xa6\xbb\x87\xce\x3e\x9a\xff\xb3\x3b\x73\x31\x64\x8a\x22\x7c\xaf\xb6\xe1\xc5\xfa\xe8\xc2\x32\xae\x42\xe1\x7f\xf3\x12\xc8\x6d\xf9\xfb\xeb\x19\xa8\xac\x10\x7a\x0a\x31\x59\x90\xf7\x13\x7a\x0b\x31\x19\xb0\x2f\x23\x72\x19\xc7\x7c\x81\xfd\x1f\x91\xdb\x38\xc6\x07\xf6\x17\x84\x9c\x1c\x62\xc2\xa1\x3f\x84\xc4\x1c\x62\x32\x61\xcf\x48\xc4\xce\x71\x4c\x01\xc4\x10\x32\x74\x88\x79\x0f\x15\x0f\x42\x9a\x0e\x31\xf5\xb0\x5f\x22\xe4\xea\x10\x33\x01\x7b\x46\x42\xbe\x0e\x31\x63\x10\x43\x44\xda\x71\xcc\x14\xc4\x10\x12\x77\x88\x89\x84\x18\x42\xf6\x0e\x31\xcf\xe1\xbe\x26\xa4\xf0\x10\x53\x01\x15\x43\x42\x1a\x0f\x31\xb1\x70\x4d\x09\xb9\x3c\xfe\x1e\xb8\xdf\x08\xf9\x3c\xc4\x78\x40\xb5\x8c\x88\xd4\xe3\x98\x55\x38\xe6\x21\x22\xf6\x38\xa6\x06\x62\x08\xc9\x3d\x7e\xb6\xa1\x3f\x84\x0c\x1f\x62\x72\xe0\x1e\x25\xa2\xf9\x38\xa6\x9d\xe9\xef\x38\x89\x90\xeb\xff\xc5\xc8\x9c\x81\x3f\x5c\x24\xe2\xfb\xf0\x35\x9f\xe0\xd6\x21\x24\xfd\x10\xb3\x06\xb7\x01\x21\xf1\x87\x18\x5f\x28\xed\x10\xb1\x7f\x1c\x53\x02\xb7\x01\x61\x07\x00\x31\xb5\x50\x6c\x26\x6c\x03\x20\xe6\x17\x94\x83\x88\x7a\x01\x1c\x33\x0e\xbf\xbe\x41\xd4\x0f\xe0\x98\x85\x4d\x50\x68\x25\xea\x0c\x80\xac\x10\xd7\x2d\x17\x12\xc0\xa2\xd0\xab\xad\xc3\x5a\xe3\x83\xdf\xaf\x3f\x7d\x2c\x7a\xc2\x4f\x6b\xb3\xaf\xc9\xe9\x93\xca\x14\xea\xbd\x8c\x27\xa9\xdc\xef\xde\xa9\xea\xd9\xb9\x76\x8c\x04\xb0\x21\x94\x82\x5a\xbf\x4b\x1c\x8e\x70\x52\xe1\xfd\x6a\x4e\xbd\xc3\xe7\x15\xd7\xcc\xab\xe4\x8b\xbc\x59\xc2\x1e\xde\x17\x7f\x19\x2d\x45\xfe\x6c\x2c\x23\x01\xac\x01\xad\xe7\x7b\x28\xa7\xf9\xb5\xe6\x77\xf2\x1f\x12\x2c\x3b\xac\x30\xb8\xd4\x1d\xbd\xea\xfe\x3c\x68\xa7\xfc\x9f\xb0\x3f\x06\x6a\x1d\xc9\x95\x59\x1b\x69\x1d\xed\xb4\xba\x95\xc1\xbb\x5f\x0f\xee\x09\x8f\x1c\x92\x64\xd9\x86\xfd\x09\x91\x62\x6a\x8b\x98\xd9\xff\x21\xb7\xb9\x7f\x9f\xb4\x66\xc9\xb4\x19\x09\x60\x7d\x28\x1f\xe1\xb4\x10\xf0\xbf\xeb\xde\x30\x11\x11\x3c\x62\x74\x2b\xec\xe9\xdb\x48\x9f\xfe\xf4\xfc\x57\x9a\xe9\x9b\x7f\x7c\x6d\xd5\x7f\x24\xc5\x2c\xfc\x6f\x6e\xe2\x11\x8d\x82\x9f\x30\x20\x72\x15\xc7\x0c\xc1\xc3\x48\xe4\x2e\x8e\x69\x80\x05\x9d\xc8\x65\xa4\x00\xc2\x5d\x45\xe4\x36\x8e\xe9\x83\x33\x64\xa2\x5e\x10\x3f\xf4\xf8\x3f\xd4\x26\x6a\x0a\x81\x9c\x1c\x17\xad\xa3\x2b\x09\xc8\xa0\xcd\x5b\xf3\xad\x8f\x65\x4d\x3e\xca\x6c\x1f\xa7\x2f\xd1\xb8\x5b\xbc\xaf\xe8\x7f\xb5\x70\x9e\x5d\x56\x48\xff\x6b\xe7\x9b\xae\x7c\xb1\x38\x03\x12\xc0\x5c\xd1\x4d\xd2\xd5\xcb\xcb\x87\x8d\x14\x86\xd4\xbb\x85\x5f\xd3\x7d\xac\x76\xe3\x68\xe3\xda\xd5\xd6\x2f\xeb\x1f\x2d\x37\x6f\x35\xfd\x6a\xa4\x3f\x4c\x02\x58\x32\xca\xfa\xd6\x72\xf8\xee\xdc\x79\x28\xf1\x8e\x29\x48\x92\x0b\x38\xd5\xf1\xf0\x97\x1e\xab\x38\x51\x99\xbe\x57\x29\xf0\xce\x15\xe6\xad\xa7\xb2\x49\x00\xcb\x43\x1b\x1b\xef\x31\x95\xdf\xbf\xa9\x4d\xee\xad\xdd\xf8\xce\xf0\xd0\x9a\x7b\xf5\x6a\xdf\x96\x14\xf7\x6f\xa6\x2e\xa5\xad\x6b\xcd\x16\x2a\xab\x0f\x36\x0e\x12\xda\x38\xb1\xf5\x05\xf6\xdf\xa3\x28\x52\xa8\x51\x8f\xf5\x2c\x1e\xa9\xa1\x7c\xb5\xe6\x37\x1e\xec\xf3\x64\x29\x3a\x7d\xb6\x50\x9b\xfd\x92\xd1\xc6\x01\x47\xa7\x15\x91\x6d\xd6\xe3\xf1\x7a\x95\xd7\x05\xcf\xba\x96\x1e\x27\x19\x15\x1b\x0e\x3b\x26\xa5\xe8\x9d\xaf\x91\x5f\xfc\xdc\x2e\x7e\xd7\x91\xea\xf8\xbf\x85\x05\x5f\x00\x98\x09\x88\x22\x83\xaf\xb3\x2b\xdc\x4f\x44\xd1\xc1\x31\xc9\x90\x20\x12\x45\x08\xc7\xe4\xc1\xac\x4b\x14\x25\x24\x4b\x41\x12\x46\x14\x29\x24\x83\x42\xb1\x9f\x50\x68\xc0\x8b\x3c\x3c\x87\x84\x6a\x03\xc4\x84\xc2\x58\x13\x49\x0e\x38\xa6\x9f\x01\x4e\xb5\x89\xc4\x07\x20\xe7\x78\xdc\xf1\xbf\xa9\x76\x00\x7a\x77\xdb\x94\xcf\x8e\x4c\xa5\xfb\x60\x6f\x93\xbc\xf0\x34\x2b\xe6\x10\xac\xf9\x3b\x7d\xfd\xb7\xf6\x61\xb3\x2f\xf6\xa7\x2b\xd8\xb2\x3c\x64\x37\x18\x25\x9a\xa6\xf3\xe3\xfc\x8f\x8f\xb0\xa8\xd4\x9a\x86\x68\x08\x1e\xcd\xd6\x39\x1b\xfc\xec\xea\xab\x65\x39\x46\x3f\xbb\x8c\x83\xcf\x6e\x5c\x6d\x1d\x20\x01\xec\x0d\xda\x76\x65\xfb\xcd\xd8\x37\x5f\x90\xec\xc1\xf8\x77\x4d\xf5\xfe\xb0\x5a\xf7\x6a\x5c\xe5\xfb\xfc\x6a\x4d\xdd\xde\x4b\x55\x7d\x26\x36\x6d\x9d\x04\x30\x2f\x54\xb8\xc8\x61\xf5\x79\xc3\x70\xbe\x74\xd7\xf5\x90\xb3\x8d\xb6\x51\x07\x13\x97\x1d\xb2\x7c\x4e\x87\xe8\x53\xb3\x1d\x9c\x31\x3d\x2f\x53\xa5\x4a\x02\xd8\x2b\x54\x6f\xd3\x21\x6d\xbb\x79\x8e\x96\xf1\x75\x00\xf7\xf6\x36\xa1\xd9\xcf\xa3\xe5\x42\xd8\xf8\x3d\xe1\x93\x3b\x5a\xed\x5f\xfd\x69\x79\x8e\xf9\x09\xff\x9b\x9b\x78\x48\x03\xe0\x25\x06\x22\x57\x11\xce\x0d\x53\x35\x91\xbb\x38\xe6\x0d\xe4\x5a\x44\x2e\xe3\x18\x2f\x38\xab\x22\x72\x1b\xc7\xbc\x62\x81\xf7\x70\x88\x44\x27\x20\xc7\xe8\xfe\xff\x3f\x71\xd5\x8b\x8a\xc9\xbc\xd2\x25\x9a\x3d\x47\x57\x36\x9f\xb4\xcd\x58\x09\xf0\x71\x36\xad\xa3\x6b\xfd\x18\x24\xfe\x72\xf2\x92\x92\x9a\xfa\xcb\xe2\xe1\x39\x12\xc0\xb2\xd1\x2d\x85\xe5\x50\x0c\xbd\x25\xa3\x8c\x75\x63\xb3\xdb\x91\xb6\x3f\xa2\x94\xc1\x7f\xe5\x76\xd5\x95\x12\x63\xb3\x4f\x64\x5f\xa6\x8b\x8d\xd8\x49\x00\x4b\x42\x97\x90\xfe\xe0\xf6\xc9\x8a\xdf\x12\x79\xb7\xaf\xbb\x4c\xdc\x3a\xc8\xfc\x29\x9a\x67\xdb\x4d\xe5\x7d\xa4\xf7\xd7\x7f\xdc\xae\xcf\xba\x26\xd9\x40\x02\xd8\xeb\xff\xf9\xf6\x76\xe3\x90\xa9\x62\x03\x7b\x33\xd5\x87\x46\xe5\xb3\xea\xf5\x69\x93\x07\xb7\x26\x2e\xef\x1f\xad\xfd\xca\x6d\xbc\x6d\x4e\xc8\xe1\x94\xf0\xbf\x99\x8d\x87\xa8\x17\x52\x65\x22\xd3\x71\x4c\x36\xdc\x26\x44\xe6\xe3\x98\x24\xc8\xf9\x88\x5c\xc0\x31\xaf\x61\xc6\x22\x92\x00\x71\xcc\x3a\x6c\xb3\x88\x64\x40\x1c\xe3\x02\xb7\x16\xa1\x14\x08\x31\x00\xf2\x51\x42\x3d\x10\xcf\x72\x30\x33\x12\x8a\x82\x10\xd3\x04\x63\x40\x28\x0c\xe2\xc7\x0b\x56\x07\x42\x75\x10\x62\x56\xe0\x75\x5d\x42\x89\x10\x16\x48\xb5\xbf\x10\x22\x9d\x10\x87\x18\xc1\x03\x49\x24\x18\x02\x39\x4a\x32\x46\xf2\x8d\x03\xd9\x8a\x8e\x30\x42\x6f\x7a\xd1\x9f\x29\xdd\x14\xba\xc7\x5b\x6f\xe6\x90\xd0\x98\xc0\xc8\xc2\xf7\x84\xa3\xf3\x94\x29\x7a\x59\x17\xe2\xaf\xf9\x1f\xce\xdb\x28\x0c\x28\x2b\xe8\xb9\xfc\x89\x6a\x73\xbc\x5d\xdb\x07\xb9\x03\x4a\xd7\xa7\x5a\x14\x12\x6b\x55\x76\xed\xed\x99\xca\xd2\x3c\x47\x9e\x66\xf7\x5a\xb2\x70\xa3\x33\x47\xa9\xaf\xd6\xd1\x8f\x7d\xdb\x33\x62\x9f\x5e\xd2\xd3\x28\xeb\x1a\x39\x13\xa0\xea\xa1\x73\x75\xbf\x42\xa2\x81\x31\x5b\x58\x1a\xfd\xc3\xf9\x71\x12\xc0\x66\x51\x71\x3a\x37\xde\xa1\xb1\xa8\xb6\xc7\x30\xe9\xaa\xe6\x60\x4b\x96\x44\x91\x37\xe5\x6d\x7f\x86\xe2\x67\x7a\x53\xd2\x15\xac\xc3\x37\xf5\xed\x85\xff\xcd\x6c\x7c\x21\x5a\x61\x13\x46\x64\x3a\x52\x0a\x61\x99\x26\x32\x1f\xd1\x23\x20\x8d\x25\x72\x01\xc7\xcc\xc2\xc3\x45\x28\xdf\x42\x4c\x19\xd4\x23\x08\x35\x5c\x88\xf9\x09\x0f\x17\x91\x90\x8b\x63\xa6\x29\xe0\x85\x59\x22\x49\x17\xc8\xc5\x92\xc9\xfc\x77\xe7\x72\x15\xd5\x98\xcd\x46\x53\xbe\x6c\x2b\x36\x8d\x2d\x72\x8f\xde\x69\xa9\xaa\x51\xea\xda\xb2\x29\xad\xf8\x6a\xca\xcf\x23\x0c\xfa\x5b\x78\x8d\x94\x37\x6d\x70\x28\x54\xc2\x96\xbf\x2c\xf0\x2b\x75\x52\x3a\xb5\x21\xc7\x3e\xcc\x5a\x66\x42\x35\x74\xfe\xa8\xc6\x76\x96\x9a\xdb\x1f\xc6\x1a\x85\x72\x03\x55\x5f\x93\x00\x56\x88\x6e\x5d\x73\x86\xe7\xd7\xec\x45\xb3\xaf\xba\x5e\xb0\xa5\x55\xae\xc9\xd0\xd3\xfe\x94\xe2\xdd\x54\x2d\xd3\x2c\xea\xb6\xde\x4d\x19\xf6\x40\x83\x04\x64\x30\x74\x44\xdd\xe4\x24\xf6\x5d\xab\xf5\xde\xa3\x05\x76\xd9\xd7\x03\x97\xcd\x43\x9e\xcd\x6b\x5a\x3d\x9e\xac\x12\xbd\xc3\x6f\x6f\xe3\xe0\xfb\x4d\xf8\xdf\xac\x46\x94\x14\x18\x55\x22\xcb\x11\xd2\x08\x57\x8f\xc8\x7a\x1c\x53\x08\x15\x0e\x22\x17\xf0\xbc\x80\x41\x2e\x47\x24\xb2\x03\xb9\x2d\x4c\xd8\x7f\x5c\xee\x03\x5a\x48\x1b\x1d\xc9\x7e\x0f\x8e\x2e\x99\x9a\xca\xdb\x86\x44\xcf\xb0\x88\x1a\x85\x08\x68\x45\x5b\xa4\x71\xb9\xcb\x05\x1a\x16\x1f\x2e\xa1\x26\x01\xcc\x0d\xcd\x0b\x87\x47\x99\xd9\x57\xac\xf2\x39\x7f\xf2\x58\x64\x73\x3e\x4a\xed\xbb\xd4\x71\x23\xa3\xfd\xab\x17\x77\xf1\xd5\x5d\xbc\x83\x3b\x5a\xf6\x92\x00\x16\x8c\x4e\x14\x4a\x86\xc4\xf5\x34\xef\x09\x06\x67\xd8\x73\xb2\x77\xf8\x5a\xed\x7f\x6e\xb4\xaf\xa9\xf9\x29\xdf\x34\x6d\x79\x4a\x95\xed\x90\xfa\x46\xde\x99\x43\xf3\xc2\xb8\xe0\x88\x39\x97\xdc\xf5\xca\xa3\xe6\x3d\xd7\x26\xcd\x6e\xad\x6f\xa5\xea\x51\x6b\xdb\x19\x63\x36\x77\x28\x25\xa0\x3d\xdd\x83\x92\x04\xb0\x31\x94\x5b\xd6\xba\x3f\x8d\x18\xda\x13\x5e\x75\xda\x66\xfa\x0d\x25\x4b\x8e\x96\x12\xdb\x15\xd3\x2b\x53\xca\x45\xbe\x42\xec\x18\x7b\x69\xb0\x9b\xf0\xbf\xb9\x89\x68\xe2\xb0\xe0\x12\xb9\x8a\x63\xdc\x60\x1e\x21\x72\x17\xc7\x04\xc3\x0b\xf1\x44\x2e\xe3\x98\x39\x98\x47\x88\xdc\x46\x74\x5a\x3a\x78\xbe\x89\x86\x2b\x40\x96\x8a\x7c\xf3\xc6\xf1\x8e\x47\x57\x10\x4b\x62\x48\xad\xa0\x3c\x20\x74\xf2\xba\xa0\x40\xce\x51\x16\xaa\x0a\xfa\x3d\x36\x51\xad\xfc\x69\xa7\x9b\x52\x1e\x37\x91\x02\x4f\x92\x00\x16\x8e\xfe\x16\x5b\xe5\xa7\xdc\x1f\x32\xd7\xb2\x3d\xa7\x6f\x2d\x35\x1c\xe3\xbf\x31\xb8\xdb\xeb\x1a\xd5\x15\xf7\x34\xd9\x5f\x8d\x2a\x87\x2f\x78\x28\x06\x93\x00\xb6\x84\x52\x45\xd6\xa6\xb6\xb2\x51\xf2\x15\xd2\x89\x85\x93\x7c\xdb\x25\xd6\x32\x42\x75\xbb\x92\x6e\x8f\xfb\x31\x2b\xf0\x97\x66\x15\x38\x6b\x0b\x91\x00\xb6\x88\x56\x9a\xc8\x96\x13\xf9\x76\x81\xe6\x2f\x0c\xa6\x24\x0d\x64\x73\x95\xa6\xf5\xf8\x8c\xfc\x0e\x18\x78\x60\x92\x47\x67\xe2\xc5\x43\x1d\xbc\x85\xff\xcd\x6c\x3c\x42\xf1\x70\x25\x88\x4c\x47\xa6\x06\xf0\x6e\x25\x91\xf9\x38\x66\x09\x52\x46\x22\x17\x70\xcc\x22\xfd\x9f\xf5\xff\xfb\xb4\xce\x09\xd9\x44\x9b\xa6\xf4\x17\xc0\xe3\x59\xe8\xa1\x81\xbb\xe5\x7f\x28\x3f\x66\xaa\xc8\x15\xbd\x3e\xa3\x74\xe5\x1e\xcb\xd5\x5d\x43\x4a\xff\xfd\x7b\xcd\xf5\x30\xae\x8d\xba\x86\xa6\xcf\xab\xb7\x22\x72\x58\xac\xa7\x77\x67\x96\xd1\xb1\xdd\x98\xa0\x7b\xcf\x5c\x11\x99\x7b\x2e\x44\x84\x2f\xfc\x5b\xdb\x99\x07\x52\xdd\xe3\x4e\x00\x8b\x40\xd7\xef\x47\x98\x03\x45\xd9\x78\xfa\x67\xc9\x7a\xb5\xdc\x3b\x2b\x2d\x36\x58\x9d\x5e\xc8\x98\x77\xd5\xbd\x83\x62\x9b\x32\x44\x73\x7e\x6a\x00\xec\x27\xfa\xb8\xc0\xa2\xf1\x04\x8b\x51\x7a\xf2\xf9\xb5\x9d\x1f\xab\x54\xf6\x52\x08\x16\xda\xc4\x8d\x7d\xea\x1a\xe4\x7c\xe2\xa8\xb2\x26\x52\x17\x0d\xb0\x35\xb4\x57\xfb\xa4\xfa\x30\xe9\x52\x26\xf3\x47\x86\xcb\x3d\x9e\x47\x0f\xa5\x9a\x50\xfb\x0b\x9c\x8b\xda\x32\x5b\x22\x19\x20\x1b\x1c\xc7\xdf\x36\x0d\x00\x16\x8d\x9e\x6f\x3b\x60\x22\x52\x5a\xf9\xf1\xd0\x50\x8a\xcd\xde\x1a\x8e\x96\x5f\xfb\xe5\xee\x17\x6f\x7e\xd2\xc7\xf0\xf0\x8d\xf9\x4d\xe3\x13\xf4\x00\x60\x71\x68\x7a\x7a\x59\xd6\x75\xca\xfe\xa6\xd2\x2d\x4f\xee\x83\x03\x4f\x58\x18\xe2\x38\x5c\x66\xf6\x5c\x9d\x92\xa8\x5c\x49\xba\xa6\x32\x23\xa0\xc0\xe1\x04\xb0\x42\xb4\xd5\xfc\x11\xbe\xac\x7e\x28\x8e\x6c\xd2\xed\x6a\xfb\x30\x63\x08\x87\xa1\xe8\x27\x31\xe3\xe7\x31\x3b\xd9\x9f\xef\x65\x4a\x59\xfd\x3e\x61\x0f\xb0\x3a\xd4\x7a\x35\x87\x0e\xef\xdd\x56\x3b\x8a\x77\x30\x6e\x96\x7d\x38\xf1\xb0\x2d\x83\x7f\x6f\x59\xfc\xa3\xc1\x05\x93\xa1\x85\x4c\xe5\x6e\x9a\xdb\x00\xfb\x8e\x6e\x6d\x9b\x12\xa5\xbd\x8f\x63\xb5\x1c\x6e\xf2\x5d\x8b\xb9\x78\x5a\xdc\xd2\xad\x21\x53\x26\x6f\x59\x71\xef\x3d\x13\x7a\xdf\x63\x3f\xb4\x62\x49\x00\xcb\x44\xa5\x27\x1f\xbd\x20\x03\x19\xd1\x52\xbf\x98\xb7\x67\x4a\xdf\xe8\xe5\x59\xc8\x46\x3f\x2a\xcf\x39\x71\xeb\xeb\xa7\x6b\x13\x74\x8b\x6c\xc9\x36\x4e\x00\x7b\x89\x9a\x23\x9b\x7a\xfa\xc5\x8d\x10\xfa\x07\xa7\xcf\xb9\xb6\xea\xc9\xa9\xac\x34\xdc\x4e\xe7\x31\x3b\xb1\x39\xf3\x41\xc9\x97\xa1\xb2\xfd\x14\xdd\x00\xab\x43\xe5\x4f\x5d\xa7\x17\xae\x4a\x66\x59\x31\x1c\x9d\x77\x57\x76\x49\xd9\xf5\x6b\xf6\xec\x64\x9a\x4a\xea\xca\xa3\x6d\x70\xcb\x58\x78\x52\x20\x03\xb0\x46\xf4\xaf\x33\x7d\xa8\x7a\xf7\x84\x52\xef\x6b\xe6\x91\xf8\xec\xd2\x13\x97\x4e\x30\x0a\x19\xb0\xc8\xae\xf4\xef\x0e\x0c\x55\x6f\xa7\x2d\x35\x10\xd9\x60\xbf\x68\x8f\x75\xf3\xda\x50\x8c\xf6\x8b\xda\x73\xbf\x3b\x0e\x54\x09\xec\xe3\xff\xe6\xf1\x4d\xbf\xfb\xc5\x3e\x5a\x83\xa0\x52\xd7\xa4\x24\xc6\x6a\x1d\x27\x80\xf9\xa1\x7f\xff\x41\x7e\x53\x74\xf8\xdd\x74\x76\xdd\xd7\x8a\x19\x65\x53\xee\xe9\x4b\x1c\x8d\x8c\x14\x97\x52\xea\x30\x8d\x57\x43\xe3\x8f\x6d\xf6\x00\x6c\x04\xb5\x5e\x4d\x46\xae\xe0\x71\x6d\x5e\xe2\xf3\x91\xa8\xde\xae\x85\x77\x6c\xf2\x9d\x6f\xc3\xb4\x7e\x4a\x27\xcc\x87\x4d\x29\x02\xad\x64\x17\x80\xcd\xa0\x1b\x27\x78\x53\xc3\xf5\x10\x26\xce\xe6\x97\xd1\xa3\xa7\x43\xe9\x72\x25\xc8\x8f\x37\xd4\xb6\xb8\x5f\x90\xec\x95\x0a\x7a\x5d\xc4\x9b\x2f\x85\x6e\x1a\xf1\xc7\x3f\xc5\x39\x18\x35\xc4\xbc\xeb\xf4\x63\x94\xf8\x3b\xf6\x5f\x7b\xd6\x1f\xae\xb0\x9d\xfd\xfc\xc9\x68\xee\x23\x9c\x85\x43\x4e\x00\x4b\x40\x33\xd0\x54\x6a\x8c\x23\xab\x04\xc7\xe2\xc4\xcd\x43\x9e\x4f\x85\xb7\xb5\xb1\x8f\x5f\x7e\x7b\x85\xc2\xd2\x25\x4d\x6d\xfe\xe2\x29\x03\xab\x42\x80\x95\xa3\xbd\x6d\xcf\xb0\xc7\x7d\x81\x28\xa7\xd9\x92\xe2\x8e\x53\x4a\x94\x6a\xee\x60\xfb\xf3\xdd\x87\xbb\x58\xe6\x5d\x65\x77\x5c\xb7\x95\x2a\xa7\x06\xd8\x00\x5a\x91\xa9\xa2\x42\x3e\x0a\xf9\x88\x1e\x68\x35\xb7\x8c\x08\x96\x5f\x8c\xd1\x95\x2e\x79\x20\x2d\x9c\x59\x7d\x55\x77\x35\xf6\x59\xed\x87\x25\xe4\xd1\xac\x4b\x47\x0e\xe5\x8c\x8d\x54\x92\x07\x58\xa6\x14\x50\x1d\x4b\xd1\x39\xd7\x12\xfa\x30\x38\xfc\x92\x6f\xe7\x7c\xd5\x96\x9c\x9e\x02\x00\xb0\xb7\xa8\x25\x72\x58\x7d\xd7\xc7\x21\x4d\x6e\x5a\x1f\xdb\xaf\x19\xaa\x57\xa4\xae\x9c\xcd\x8b\x3a\x62\x78\xae\x4a\x68\xb2\xea\x6b\x85\x17\x43\x1f\xc0\x16\xd0\xa3\x7d\x80\x72\x8f\xa8\x44\xbb\xfc\xc2\x11\x7f\xc9\xac\x7b\xa5\x7b\x58\x17\xdf\x33\x09\x6f\xe7\xb5\xf8\x18\x1f\x70\xbe\x82\xef\xd2\xd9\x39\x00\x30\x12\x5a\x29\xc2\x98\x2c\xa6\x58\x79\x47\x3a\x7f\xab\xad\xb2\x24\xba\x33\xd4\xb8\x78\xd5\xfd\xe4\xb4\x1c\xbb\xb0\x9e\xca\x5e\x38\xc1\xde\xf1\x12\x60\x00\x5d\x7f\x4f\xfa\x98\xe2\xeb\xab\xb4\x6c\x93\x1c\x1d\x4d\x7c\xf9\x9e\x07\x2a\xdb\xfd\xee\xd5\xc5\x6a\x99\xf6\x96\xcc\x0c\xa8\x90\x76\xae\x3b\x01\xec\x19\x3a\xfe\xfe\xe0\xd6\xdc\x21\x2a\x9f\x80\xa5\xfb\x9f\x6c\xb7\x08\x03\x09\xc7\x07\xfc\x17\xac\x4f\x09\xb2\xfe\x1a\xd9\x91\xb8\xb9\x68\x56\x06\x60\xf1\xa8\xb8\x5e\xc1\xdf\xe0\x48\x1d\x78\xe1\xb5\x70\x8c\xea\xa0\xab\xfd\x82\x6c\xba\x86\xc9\x13\x5b\xa1\xb2\x46\xbb\xac\x05\x17\xee\xfb\x16\x1d\x00\x4b\x42\xb7\xd7\x33\xb6\x5c\xfa\xab\xe7\xc5\xd7\xb8\x2a\xcb\x4e\xbe\x9b\x2c\x21\x8d\x9c\x63\x58\xe2\x68\x76\x0b\x90\x8c\xef\x3c\xb9\x63\x3f\xc3\x29\x54\x6f\x2a\x3a\xc9\x1a\x23\x72\x66\xab\x80\x6e\xd2\xbd\xb4\xeb\x8b\x41\x81\x3b\xcc\x34\x3b\x14\x84\xda\xc5\x69\x32\x73\x6e\x57\x65\x6a\x3a\x01\x2c\x18\xdd\x8a\x4a\x82\xd7\x0e\x0b\xd5\x27\xfc\x48\x4e\x9d\x18\xef\xb6\x0e\x8e\xcc\x6d\x0a\x10\x17\x3f\xff\xee\xea\xbd\x78\xb7\xe1\x37\xd9\x0c\xb2\x00\x7b\x81\x26\x6c\xe7\x66\x86\xbc\xc9\x19\xd3\x29\x91\x84\x1b\xbc\x1e\x02\x5a\x2d\x0c\xa7\x85\x72\x7e\xe5\x9c\xad\xf8\xea\x1e\xae\x96\x63\x10\xfa\x1a\x60\xfd\xe8\x7e\xf1\xa1\x06\xe4\xd6\xf5\x63\x37\x6f\x88\x7a\xf2\x54\xf8\xb1\x2e\xfa\xad\x08\xed\x8f\xea\xe6\x2a\x9f\xd7\xcb\xfd\xbc\xe5\x26\x93\x91\x13\xc0\xbc\xd1\xa4\x74\x58\xf5\xf2\xa9\x8c\xac\xcf\xe9\x43\x59\xb4\x5b\x99\x24\x06\x2f\xed\x8f\x56\xf8\x32\x5a\x6b\x62\x53\xc6\x7d\x50\xdd\x4c\xfb\x95\x2a\xc0\xfc\x50\xf9\xd9\xdd\x97\x5e\x62\x52\x2d\xcb\x7e\xc4\x31\xa5\x6c\xb4\xcf\x25\xed\x52\x54\xf7\xb1\x08\x9e\xc9\xb2\xc3\x17\xdb\x97\x2f\x9b\xff\x3a\x02\xb0\x62\xd4\x1a\x11\xdb\x7b\x73\x34\xda\x49\x34\xe4\xd6\xd1\x4f\x4a\x5e\x58\x4f\x9d\x69\xbf\x68\x7e\xb6\x44\xda\x9b\xe9\xe3\xc4\x97\x68\xc6\xfb\x15\x4e\x00\xf3\x42\xd5\xf0\xa6\xd2\x9a\xbe\xfc\xaa\x2e\x0d\x81\x42\x53\x92\xcc\xca\xd2\x56\x9d\x03\x5c\x6c\x69\xf7\x67\x9e\x0f\x15\x9d\xbe\xcb\xfc\xa2\xe5\x15\xc0\x0a\xd1\x1c\x63\x1d\xf4\xea\x77\x5a\x1a\xc3\xa3\x7a\x32\x4b\x7a\x4f\x8e\x52\xd5\x98\xd4\xe3\x85\x57\x7e\x4b\x08\x25\x5c\x29\xaa\xa2\x8f\xb5\xef\x02\xd8\x3a\xaa\xcd\x5f\x64\xbe\x7d\xf8\x5e\xee\xd4\x73\xe6\x2b\x9d\x36\xfc\x34\x4a\x33\xaf\xbf\x5b\xeb\x35\x68\x06\x84\x2e\xe5\xf9\x7d\x25\xeb\xa2\x79\x83\x2a\x56\xbf\x15\xef\xdf\x0d\x28\x65\x12\x74\x0e\x8f\x58\xf3\x54\x17\xda\x71\xaf\xb1\xf6\xa5\x4c\x09\xbb\xe1\xef\x03\x49\x8c\xa9\x0d\x55\x00\x60\x25\xff\xf3\x6f\xa8\x15\x6d\x98\xad\x3c\xe4\x87\x66\x49\xc5\x47\xd8\x97\xa8\xef\xd2\x9d\xbc\xc4\x99\x90\xe1\x74\xfc\x75\xee\x25\xf3\xc4\x13\x46\xd5\x00\x5b\x45\xcf\x92\x9d\x41\x49\x45\xbd\x98\xd4\x00\x43\x85\x98\x4f\xc4\x36\xe9\x76\x85\x5b\xae\x3f\x96\xde\xc8\x7a\x44\x2a\x9f\xaf\xa6\x91\x4d\x53\x03\x40\x06\xad\x4b\xcc\xe4\x5b\x99\x74\x4e\x5d\x77\xba\x7c\x98\x3a\xb8\x59\x4e\xe5\xbd\xf0\x4f\xf6\xe5\x96\x93\xdb\x32\x27\xc7\xd2\x78\xb2\x43\x9d\x8a\x01\xe6\x88\x6e\x99\x93\x54\xad\x23\x0c\x14\x31\xfb\x9c\xa6\x1f\xbe\xad\xe9\x0f\x6d\xac\xe9\xdc\x1a\x78\x6f\xc6\xe8\xae\x00\x2f\x5d\x6b\xcb\x52\xd7\x3e\xf4\xa6\xe4\x41\x16\x0e\xff\x4a\xcd\xc4\xb7\x99\xc9\x57\x75\x4e\x5e\xca\x69\xf4\xe6\xef\x6a\x3c\xc2\xb8\xf7\x67\x65\x6c\x95\xbc\xe9\x31\x09\x27\x80\xd5\xa3\x86\x57\xac\x75\x07\xba\xf0\x6b\x7b\x7b\x7e\xbb\x34\xdb\xf0\x78\x28\xe0\xad\x1d\xcf\x15\x66\xc6\xba\x37\x46\x22\x36\x99\x32\x03\xe6\x59\x00\xeb\x41\x9b\xc1\x38\xe7\xea\xe8\x85\x03\xdc\x53\xf7\x12\x37\x8b\x64\xe9\x37\x88\x28\x5f\x7f\x1c\xf8\xf4\x71\x45\xc8\xf9\x21\xc9\x41\x9f\x67\xb7\x18\x00\x36\x81\x2e\xff\x99\x5f\x36\x14\xa2\xdb\xe2\xfc\xc2\x45\x35\x8a\xe9\x38\x87\x35\x4a\x56\x95\x76\xa6\xe6\x15\xcc\xfb\x66\xd2\x57\x8e\x08\x5c\x9b\x44\x1e\xf5\xe0\x4e\xd8\x79\xbf\xfa\xd3\x33\xe3\x0c\x2d\xf6\xa7\x2f\x30\x01\xef\x1a\xc9\xfb\x0a\x7f\x8e\xd6\x3d\xa9\xfd\xa5\xa3\x20\xeb\x57\x0f\x80\x0c\xfa\x29\x26\x91\xa5\xaf\xec\x14\x0d\x82\x5b\x99\x5c\x04\xbb\xe7\xfa\x8c\x69\x17\xc6\x8a\xb2\xe8\x1f\x32\xb7\x5c\xe0\x21\x4b\x17\xbf\xfc\x93\x0d\x60\xb1\xe8\x72\x9a\x4e\x70\x19\x9f\xac\x88\x57\x77\x6a\x9c\xe3\x75\x10\xa0\x15\x4d\x0b\x38\x71\x10\x04\xce\x4e\x9e\xf0\x37\xe4\xe0\xb7\xf4\x9a\x40\x2f\x8f\x66\x7a\xd4\xa9\x7c\x62\x0b\xbd\x15\xfc\x65\x72\x62\xda\x72\xb8\xaf\x91\xc4\x9f\x10\xb3\x8d\x6b\xf0\x45\xab\xfa\x9b\x56\xc6\x03\x24\x80\xd5\xa3\x21\xd9\x25\xc6\x8a\x8d\xf0\xf2\x8a\xaf\x0b\x1b\xdd\x51\x58\x48\xbc\xfb\x5c\x6b\x21\x92\xf5\xff\x51\xf6\xe5\xe1\x58\x75\xdf\xfb\x8f\x59\xa8\x84\xca\x9c\x90\x8a\x8a\x22\x8a\x88\x83\x92\x90\xc8\x90\xa1\x51\x84\x4c\x65\xaa\x28\xcf\x31\x0f\xc9\x14\x32\x94\x21\x43\x99\xc7\x44\x86\x94\x90\x99\xcc\x64\xca\x3c\x4b\xc8\xf8\xbb\xf4\xf9\xb6\xcf\xee\x8f\xf7\x3a\xfd\xfe\x7b\xdf\xab\x7d\xef\xb3\xd6\xda\xfb\xac\x75\xaf\x7b\x6f\xe7\x21\x4a\xcb\xde\xcf\x78\xff\xba\xec\x53\xe7\x0d\x68\xe8\xbc\xee\xab\x31\x9e\x67\x66\x4e\x6f\x91\x95\xc9\x40\xde\xa6\x2e\x4a\xa1\x5b\xfb\x53\x5f\xfb\x8d\x97\x5b\xfc\xb0\x51\x0d\x68\x5e\x70\x46\x91\x68\x78\x71\xea\x2e\x35\x5d\x63\xb4\x98\x2d\xb9\xfa\x6b\x2c\x91\x60\xbf\xf7\xa9\xce\xb8\xd2\xb6\xbb\x13\x61\xb5\x7b\xe8\x1c\x52\x91\x42\x65\x04\x45\xb2\xe1\xc2\xb5\x3b\x34\x98\x22\x3f\xe2\xe9\x91\xe3\x4a\x15\x87\x16\x2d\x67\x14\x98\x3c\x76\x50\x95\x8b\x88\x21\xb5\x11\x22\xaa\x74\x94\x4d\xb6\x28\xb2\x0c\xf7\x62\xfb\x0e\xa7\x7e\x08\xbe\x98\xc7\x4d\xad\x67\x38\x3e\xd5\x83\x2e\x76\xdf\xb5\x56\xb8\xca\x39\x21\x34\xf0\xce\xbd\x70\xef\xad\xda\x66\x14\x95\x81\x33\xe8\xcf\xa9\x8c\xbc\x39\x86\xf1\xa4\x5f\xfc\xf1\xa7\x34\xc7\x5e\x85\x1e\x11\xf5\x14\xc9\xa2\x59\x58\x3b\xf9\xd9\x79\x5b\x7e\xb0\x90\x29\x8a\xb4\xc2\xaf\x32\xa3\x01\x72\x9d\x7f\x5f\x5d\xd9\xf5\x24\xb5\xd4\x59\x5f\x6f\xb9\x1a\xc3\xb3\xd3\xaf\x62\x7b\xde\x11\x9d\xf2\x2b\x7d\xc6\x17\xfd\x50\x54\x06\x4e\xba\x32\x05\x17\x9d\x4f\x7d\x46\x04\x75\x0f\x7c\xa3\xca\x28\x3a\x74\x7c\x64\xcd\x94\x25\xd1\xc5\x42\xbf\x4e\x7b\x8d\x4c\x3c\x4e\x2c\x19\x45\xea\xe0\xa0\xab\x9c\x62\xec\x5a\xd6\x9c\xae\xde\x56\x75\x8a\x7b\x1f\x5b\x35\xe7\xf9\xa7\xed\x3a\x8a\xb5\xdf\x0f\xf3\x9c\xb9\x58\x43\xfa\xed\xc0\x37\x68\xe8\xe8\xd8\xc6\x4f\xa5\x38\x2a\x12\x0d\x0a\x5d\xbd\x71\xcf\xcc\xd9\xb0\x1b\xe9\x13\x24\xfd\x43\x02\xa1\xbd\x63\x76\x79\x31\xb6\x7b\x84\xff\x8d\x47\xff\xfe\xb9\xaa\xff\xc9\x4a\x40\x8a\xc2\xe5\xd2\x00\x13\x06\x1a\x0a\x5c\x42\x0d\x30\xc3\x00\x83\xcb\xaa\x01\x66\x1d\x68\xb6\xb8\xcc\x1a\x60\x22\xb1\x1f\x7e\xc2\xa1\xd7\x18\x26\x1a\xb4\xc4\xb8\x14\x1b\x60\xf2\xc1\xf1\x06\x2e\xcf\x06\x98\x2f\xc0\x1f\x3c\xb2\x8d\x61\xba\x40\x23\x86\x47\xb8\x31\x4c\x3a\x38\x69\xc3\x25\xdd\x00\x93\x00\x6c\xc3\x65\xde\x98\x3f\x98\xd6\x8d\x43\xbf\x31\x4c\x1d\x78\x0e\x1e\x05\xc7\x30\xab\x40\x1f\xc7\xa5\xe1\x00\xe3\x07\x9e\x83\xcb\xc5\x01\x66\x14\xf8\x83\x47\xc8\x31\xcc\x0f\x5a\x70\x84\x8f\x47\xcd\x51\x59\x8a\x57\x5c\x6e\x44\x14\xe9\x85\xbb\xc0\x67\x79\x03\x9f\xac\x0c\x68\x4a\x0f\xaf\x49\xb1\x53\x37\x72\xd4\xcd\xb3\x31\xa4\x74\x9e\xf8\x22\x56\x95\xbc\xbe\xf8\xc0\xec\x95\x2e\x11\x45\x56\xfe\x52\x24\xc7\xe4\x26\xf5\x4f\x21\x36\xe1\x14\x81\x29\xfc\x72\xda\xae\x6b\x31\x55\xde\x2f\xd1\x16\xc7\x81\xad\x75\xdc\x67\xa6\x3f\x3f\x24\xa2\x88\x07\x9c\x5c\x7e\xed\x34\xbb\xc7\x34\xd0\xd6\x79\x51\x9e\xf1\x84\xaf\xbe\xc9\xde\x5c\x6e\xe4\xae\x90\xf2\x94\xc9\x53\x27\xa2\xd6\x0a\xd9\xef\xf9\x6b\xff\xba\x17\x42\xb6\x44\x1c\x2b\xba\x7d\x5d\xb6\x2b\x85\xef\x80\x04\xb9\xe2\xab\xf8\x81\x34\xa7\xbb\xe7\x65\x50\xd1\x81\x04\xbb\xeb\xe6\xac\x44\x14\xc9\x83\xcb\xf9\x7e\x79\xb5\x42\xc7\xd5\x6f\xa4\xbb\xb8\x14\x8f\x1e\x4e\x88\x8a\x8c\xfb\x9a\x78\x4d\xc8\x57\x30\x6f\xde\x75\xaa\xac\x2c\x8b\xbd\x98\x88\x22\xb3\x30\x33\xae\xdb\xf9\x78\xd5\xf0\x56\xfc\x07\xd4\xae\xf7\xa8\xc2\xed\xaa\xa8\x89\xbb\x94\xeb\xc1\x62\x11\x6a\x8b\xfd\x09\x4a\xb4\x61\x1a\xcc\xc2\xff\x16\x16\x6c\x05\x7a\xc1\xdb\x8b\x17\x1a\x0c\xb3\x02\x24\x4f\xbc\xf0\x60\x18\x0f\x20\xad\xe2\x85\x08\xc3\xd4\x02\x01\x1e\x2f\x4c\x18\x26\x0f\x64\x64\xbc\x50\x61\x98\x59\x70\x99\x14\xb7\xdf\x03\x98\x58\x60\x1b\x6e\xd3\x07\x30\x1f\xc0\xa9\x20\x5e\xe7\x87\x61\xbe\x33\x02\x51\x0f\xb7\x07\x94\x45\x48\x7f\xff\x76\xf1\x00\xbc\xe3\x4d\x88\x99\x2f\x38\x24\xb3\x9f\xb7\x53\xd5\xec\x73\xba\x46\x5a\x60\x5d\xfc\xe2\x65\xf7\x85\xb5\xab\x7b\x54\x27\xaf\xd6\x14\x9f\x50\x21\xa2\xc8\x2f\x98\x68\x58\x4f\x28\xbc\x20\xe7\x63\xdc\x76\x2b\x21\xa6\x8d\x5d\xae\x52\x49\x21\xc5\x25\x40\x57\x40\xc5\x2c\xe3\xe8\x52\x1c\xd1\x8e\x2b\x65\x73\x3c\xcc\x05\xc4\xe7\xa7\xde\xdf\x54\x58\x66\xf1\xb5\x4a\xaf\x52\x2a\xd9\xf5\x9e\xd4\x34\xbe\xff\x3b\xab\x49\x8d\x8f\x01\xad\x50\x9f\x74\xa1\x3d\x11\x45\xbc\xe0\x2e\x43\x7d\xe1\x17\xfd\xad\xd7\x07\x8f\x2e\x6d\x5c\xec\x97\x8c\x1c\x17\x50\x54\xbe\xfb\xd0\x7d\x64\xfd\xad\xc2\x4a\xc7\xd4\x4a\x6c\xc1\x25\xe1\x7f\x33\x1b\xaa\xc1\x98\x00\x8f\x63\x3a\x86\xf9\x05\xea\x29\x9e\xf9\x10\x06\xe4\x37\x3c\x17\x30\x8c\x17\x38\x67\xc4\x6d\xc8\x01\x26\x17\xfb\xee\x0c\x5e\x57\x0e\x30\x4b\xc0\x1f\xdc\xce\x1c\x60\x88\x40\x0c\xc5\x6b\xcf\x31\x0c\x0a\xea\x02\x6e\x8b\x0e\x30\x4f\xc0\xdb\x85\xdb\xa7\x03\x4c\x0c\xb8\x9b\x89\xd7\xac\x63\x98\x78\xec\x8e\x21\x5e\xdb\x8e\xca\xb1\x3a\x91\xfe\x3e\x21\xf1\x87\xbb\x77\xfd\x90\x32\x74\xc6\xa5\xad\x36\x4a\xce\x6c\xe8\xc9\x14\xe7\x4d\x17\xf6\x58\x85\xf0\xc9\x6d\xcb\x7c\x9a\xee\xc3\x83\xd7\x44\x14\x36\x0b\x3d\x3c\x5e\x5c\x34\xdc\x92\x9b\xa4\x8d\x2d\xe1\x3d\x1d\xd3\xdc\x29\xfe\xae\x62\xb2\x63\xed\x29\xb3\x21\x5e\x4b\x24\xa9\x57\x1b\x7d\x23\xb3\x36\xe7\x87\x8b\xc3\x51\x9e\x94\x1b\x46\x5f\x90\x7b\x03\xdf\xea\xa7\xa3\x0e\xcd\x29\x0c\xbf\x3d\xfe\xd8\x66\x7b\xda\x5c\x5b\x91\xbd\x96\x56\x47\x7c\xfa\x66\xe1\x85\x93\xbd\xec\x6e\x2b\xc6\xb7\x1f\xbf\x6f\x0b\x97\x09\xe3\x0e\x4c\x32\x55\x33\xf2\xff\xec\x26\x66\xa3\x3e\x4c\x3e\x30\xdd\x3d\x53\x5f\x46\x46\x44\x65\xac\xa1\xe1\x16\xcb\x95\x92\xf2\x8e\x1c\x87\xe8\x76\xdd\x55\x5c\x5c\x7e\x2c\xfd\x64\xf5\xf0\x60\x2f\xc3\x4d\xba\xdb\xbb\x77\x48\x8b\xf5\x9b\xec\x13\xfe\x37\x2f\xb1\x88\xfa\x03\x36\x88\xe7\x29\xc4\x84\x00\x06\xcf\x5b\xe8\x39\x20\x97\xe2\x79\x0c\x31\x94\x6d\x7f\x8e\xd0\xf0\xdc\x06\x18\x19\xeb\x3f\x8f\xc1\x95\x69\xc0\x63\x9e\x01\x77\x70\xb5\x1a\x80\x89\x03\x25\x08\x4f\xb0\x81\x92\x18\x76\x16\x85\x27\xda\x00\x8c\x0f\x20\xb7\xb8\xca\x0d\x16\x36\x90\x90\xf0\xe4\x1b\x0c\xf3\x1e\xd8\x86\x2b\xe1\x00\x8c\x37\xb8\xb2\x87\xab\xe3\x60\x4d\x01\x20\xaa\x78\x62\x0e\x86\xd9\xa0\x59\x58\x23\xfd\x47\x59\x47\x8e\x8b\xe5\x22\xc1\x9d\x88\x22\x8b\xb0\x78\xd8\x90\xee\xdc\x6e\xa1\x1c\xac\xd3\x44\xb8\xd6\xc1\x7c\xf6\x60\xc0\x51\xfe\x30\xff\x07\x63\x7b\x1c\xce\x66\x57\x59\x66\x52\x76\xdd\x21\xa2\x48\x25\x2c\xaa\x2d\x6e\x99\x18\xd7\x77\x88\x66\x2f\x52\xa1\x3f\x79\x45\xc6\x28\xce\xb7\x63\xfe\xe5\xfc\xfe\x21\x4f\x75\xde\x73\x06\x2a\xbc\xa7\x79\x89\x28\x32\x01\x6b\x9f\x41\x66\x24\x35\x1c\x73\xbe\x45\x96\x02\x8a\x8f\x2a\x34\xcb\xcd\xdc\xf7\xd1\x5a\xa6\x68\x84\xd1\x85\x44\x44\x68\xd9\x70\xbc\x49\xdd\xcc\x5c\x70\x92\xf8\x48\xf3\xf1\x6e\x43\xcc\xc0\xd9\xa4\xb2\x26\x5d\xb5\x4f\x76\x8a\x92\x3c\x54\xd4\x3f\xbb\x18\x82\xd6\xaa\xa2\xb2\xf6\xa4\xbd\xfc\xbc\x59\x21\xe0\x24\xc1\xa3\x78\xa0\xc8\xe4\xec\xae\xa6\xd6\x98\x27\x7e\x45\xaf\xd2\xb5\x17\xeb\xdc\x06\xe5\x2b\x8d\xf4\x8c\x73\x78\x12\xef\x26\x57\x0f\x13\x51\xa4\x19\x96\x3f\x2c\x6a\xc7\x1f\xbc\x67\x34\x0a\xe0\xe1\xde\xfb\x75\xe1\xb9\x8b\x66\xc1\xca\xcf\xb8\x66\xf4\xf9\x7b\x6b\x8e\x8e\xbe\xb7\x9a\x77\x7f\x7f\x24\x0b\xae\xd7\xe9\x85\x03\x9c\xcd\x07\x83\xd2\xc4\x9d\xcc\xa9\xf7\xc8\xe4\xfa\xb5\x9b\xc8\x1e\xad\xa8\x32\xb5\x5a\xe4\xa3\xe9\xef\xd9\xc2\x1f\x21\xfc\x6f\x61\xc4\x96\x6c\x11\xe4\x76\xbc\x50\x62\x98\x4a\xb0\xd5\xf1\xc2\x89\x61\x26\x40\xad\xc2\x0b\x29\x54\x43\x40\x26\xc2\x0b\x2b\x54\xaf\x41\x7d\xc3\x0b\x2d\x86\x69\x06\xb7\x60\xf1\xc2\x0b\xe9\x06\xe0\xd5\xc5\x15\x24\x01\xa6\x10\x3c\x07\x57\x95\x04\x98\x35\xca\x3f\x99\x15\x57\x9a\x04\x99\x15\xb4\xf3\x78\xf2\x24\xf6\x18\xa7\x1d\x0b\xe3\x24\xff\x26\x54\xa2\x88\xe7\xef\x8f\xb7\x75\xc2\xef\x95\x60\xdb\x16\xc5\xaa\xae\x06\x36\x56\xd9\x2a\x9d\x99\xe6\xbc\xc8\x77\xaf\x2c\xcc\x0e\x79\xb1\x85\x6e\xbd\xb1\x24\x72\x7d\xbc\x66\xb3\x33\x1b\x86\xf5\x47\x3b\x24\x65\xf4\x63\xc5\x09\xe9\xfb\x12\x6d\x2f\x15\x87\xc8\x75\xc8\xbc\x4c\x3b\x59\xc8\xf7\xa5\x14\x1c\xf0\x78\xcf\x7b\x4e\x77\x75\x73\x97\xc1\x9d\xd9\x75\xb2\x03\x2e\xef\x3e\x8d\x7a\x19\xdc\xe1\xa4\xa4\x60\xfd\x9e\xa6\x3a\xb1\xb1\xa2\x4e\xf8\xba\xe5\x47\x5f\x56\xd4\xac\x86\xcd\x34\x11\x45\xe6\x60\xde\x6c\x51\xc5\x96\xfa\x68\xad\x4b\x7c\x7d\x6f\x75\x3b\xc5\x8a\x3b\xe7\xd6\x3c\x7b\xc3\xf0\xb6\x27\xa4\x2c\x7e\x53\x06\xa9\xf6\x3a\x19\xc2\xff\x66\x36\x16\xa0\x4e\xb0\x7f\xf1\x4c\x87\x74\x22\x90\x76\xf1\xcc\x87\xde\x2d\x50\xae\xf0\x5c\xc0\x30\x73\x80\x6f\xe2\x8a\xc6\x00\x53\x0d\x30\xb8\xca\x31\xd6\x9d\x82\xae\x11\x4f\x3e\xc6\x30\x53\x0c\xa0\x63\xc2\x15\x92\xe5\x48\x68\x08\x04\x67\x22\x8a\xb4\xc1\xbc\xae\x29\xe6\xda\xc1\xf1\x7d\x4f\x59\x92\xfc\x8b\x9b\x99\xa6\xf7\x37\xf1\xe9\xfa\xbe\xdd\x96\xfe\x8b\x45\xbb\xb5\x64\x23\x33\x58\xa2\x0a\x45\x91\x4c\xb8\x24\x54\x50\x68\xa7\x5e\x79\x2a\x13\xc2\xf9\x92\x73\xdb\x0b\x0a\xa1\xf4\x4a\x39\x57\xd5\x4b\xfc\xaf\x69\x3c\xe6\x46\x4f\x07\x95\x7f\x2b\x40\x91\x4c\x78\x27\xca\x7f\x70\xb2\xa1\x6e\xdd\xf9\x05\xf9\xe2\x95\x2d\xd0\x3d\x27\x7e\xbd\x3e\xee\x6d\xc3\x6d\x36\x73\x95\x98\x7a\x89\xcb\x2b\xfb\x6e\x13\x51\xa4\x1e\xde\xe9\xc2\x9d\x3a\xbe\x4c\xde\x95\x19\xa6\xf7\x1d\x8f\x7d\x52\x70\xcf\xd0\x96\x95\x28\x9b\x8c\x78\x7b\x95\x61\xf9\xd1\x83\x87\xce\x05\xfc\xc2\xff\x68\x35\x88\x50\x1b\x20\x35\xb8\x96\x03\x4c\x26\xc8\xc0\x78\xe6\x43\x18\xb0\x1b\xf1\x5c\xc0\x30\xf5\x5b\xfe\x64\x1f\x5c\x59\x1f\x64\x9f\x4b\x7f\x1e\x83\x27\xed\x63\x8f\x89\xa2\x01\x9b\x04\x4f\xe4\x47\xe5\xb8\xb8\x48\x7f\x6f\x92\x10\x58\x79\x9a\xa0\x7d\x24\xbd\x7f\x6a\x8e\xf2\x66\x0c\x8f\x0e\xe1\xcd\x91\xd4\x07\xbb\xbf\xae\x73\xf9\x34\xbe\xe9\x3a\x7f\x2f\xab\x8b\x97\xef\x1a\x8a\x22\xab\xf0\x2a\x6e\xbd\xe6\x7c\x29\x5a\x93\x2e\x81\xd3\x6c\xe4\xbe\x75\x64\x89\xc1\xc3\x9c\xfa\xd3\x12\xd5\xb1\xb1\x5c\x76\xe4\x05\x56\x34\xd1\x51\x28\xb2\x01\x1f\x0b\xbd\x2e\x13\x3b\xfb\x6e\xf2\xed\x5b\xf9\x21\xcb\x64\x1e\xe6\x9c\x73\x17\x22\x6b\xd4\x44\xe3\x43\xfc\x48\xbb\x58\x8b\x39\x35\xa9\x36\x69\xc6\x5b\xf8\x34\xae\x7e\x47\x58\x0d\xa7\xfe\x62\xbe\x23\x53\xd6\xe7\xb8\xed\xab\x3a\xdc\x07\x5b\x9e\x0a\x9e\x8e\x4c\x91\x37\xa2\xcd\x0d\x0e\x0d\xf8\x73\xcb\x12\xd7\x6a\x10\xa1\x10\x20\x0c\xe1\x5a\x8e\x49\x8d\x20\x65\xe1\x99\x0f\x31\x38\x50\x3b\xf0\x5c\xc0\x30\x6f\x01\x23\xc5\x3b\x71\x81\xd2\x0f\x35\xb8\x58\x8b\x77\xf6\x82\xca\x39\x11\x48\xd0\xdf\x4c\x08\x56\x52\x24\x47\x45\x55\x6b\x33\xca\xee\xde\xb8\xcb\x7e\x94\x1f\xe5\xc8\x41\xe2\xd5\x6f\x7a\x6e\x1f\xe9\x3e\x3a\xd7\xdd\xa6\x56\x7a\x6e\x73\xfc\x32\x7c\xc7\x83\x41\x7a\xca\xb0\x62\x43\xd5\xf6\xb2\x1b\x73\xe3\x97\x4a\x09\xb2\x2b\xdd\xdb\x18\x46\xe3\x77\x7f\x14\x0b\x50\xbe\xcc\x71\xd3\x64\x76\xd3\x28\x78\x47\xa9\xa8\x85\x97\xc6\xb9\x88\x7d\x5b\x1d\x0f\x19\xf4\x61\x4e\xbe\xb2\x7a\x94\x2d\x8f\xff\x76\xe1\x7c\xd0\x35\x9d\x32\xe5\xdc\xdd\x53\x44\x14\xe9\x83\x99\xe2\xaf\x4b\x17\xab\x3b\x48\xcc\x0e\x9b\xdd\xa0\x7a\xa5\x17\x29\xba\x22\x1d\x91\x9b\xfc\x7d\xe1\xec\x1e\xb7\x41\xff\xe0\xd9\x27\x02\x7f\x7e\x66\x12\xcf\x6c\x88\x61\x00\x25\x05\xcf\x74\x0c\xb3\x0c\xd4\x72\x3c\xf3\xa1\xa5\xc0\x3e\x90\x85\xe3\x02\x86\xe9\x03\xcc\x0c\xf7\x24\x0c\x3b\x99\x00\x15\x07\xf7\x38\x0c\x60\xb2\xc1\x73\x70\xcf\xc4\xb0\x18\x30\xfd\xc9\x59\xb8\x07\x63\x20\x67\x01\x31\x09\xf7\x70\x0c\x3c\xa6\x95\xea\xcf\x63\x70\x4f\xc8\xc0\x63\xc4\xc1\xea\xe0\x9c\x92\x41\x67\x0c\xd4\x80\x98\xe1\x9d\x97\xa1\x72\xcc\x04\x42\xc9\xe6\xc6\x6f\x85\x25\xc1\x6f\x07\x62\x25\x0f\x92\x98\xde\x7f\x10\x43\x48\xb8\xc2\xa3\xa3\xc7\xbc\xc3\x7d\xc9\xd6\x93\xc8\x61\x51\x77\x4e\x34\x30\xb4\x87\x87\x88\xca\xc0\xe5\x96\x6c\x9b\xcb\x94\x78\x62\xfa\xd6\xfc\x08\x6f\xed\xea\xa7\xbf\x0e\x8f\xc5\x99\x9e\x12\x3c\xfb\x29\xf6\x47\x59\x69\x6c\xce\x8e\x28\x6e\x22\x2a\x23\x0a\x0d\x5f\x13\x3b\x11\x45\xba\x86\x36\xa5\xbf\xb4\x78\x1c\x56\x5b\x38\x4e\xaa\xf6\x70\x62\x49\xf7\xd6\xec\x8c\x77\xa5\x49\xa8\xad\x5d\x08\x11\x45\x72\xe0\xab\x30\xd2\x5f\x4d\x6f\x6c\xf7\xc9\x63\x57\x65\x93\x92\xe9\x64\x6d\xaf\xb8\x5d\xf2\xc4\x34\x8a\x36\xe0\x60\x61\xd9\xf7\xb6\x1a\x01\xcf\x1d\xc2\xff\x66\x34\xb4\x0e\xe0\x97\x01\xf0\x2c\xc7\xd6\x81\xf6\x0f\x04\xcf\x7a\x0c\x22\xfa\x67\xe9\xf0\x1c\xc0\x2c\xcb\x21\x59\xe8\xf8\xbf\xaf\xa1\x39\xab\x87\xfa\xec\xea\x8e\x3d\x2a\xc5\xde\xe9\xb9\xf8\xb3\x94\xe1\x1d\xaa\xc8\x76\x2f\xd2\x76\x74\x48\x50\x21\x7b\x65\x88\x69\xe5\xf7\x1d\xc2\xe2\xd0\x3d\x28\x8a\x4c\xc0\xed\xa4\xa1\xf7\x1b\xba\xaf\xe5\x29\xaf\x3e\x7c\x98\xe6\xe3\x20\xfb\xf4\xb6\xe0\x51\xf2\xfe\x73\xeb\xad\xad\x4f\xde\x49\xd8\x18\xc6\x9f\x0d\x44\x91\x75\x98\xcb\xe8\xaa\xca\x1d\x17\x09\x33\x3f\xa8\xaa\x4d\x48\x6a\x6f\xc8\xec\x1f\x2f\x57\x0d\x5c\xfb\x91\x71\xa5\x96\x10\xcc\x6c\x22\xa4\x98\x46\x44\x11\x0f\x98\x55\xdf\x23\x2a\x51\x58\x07\x1b\x8e\x0d\x5f\x92\xdb\xef\xdf\x55\x21\xa6\x99\x7c\x4d\x63\xf8\x83\xf5\xa0\xad\x36\xb5\xb1\x6b\x0d\x5b\xdf\x26\x87\x85\xb7\x92\x81\xc0\xb1\x2f\x2e\xd6\xde\xe1\x31\x3e\xdf\x7a\x94\xee\x27\x2e\x69\xf1\xc4\x4b\x4b\x7b\xb6\x0e\x86\xbc\x6d\x72\x56\xea\x7b\xa7\xed\x8c\x22\x91\x30\x15\xe3\x6e\xff\xf5\xa5\xfc\x99\xbd\x78\x1e\x8b\x81\xee\x27\x41\xcd\x94\xca\x73\xe3\x72\xf6\x68\x94\xa1\xa0\xf8\xfd\x99\xf7\xf2\x9f\x2a\x50\x24\x1d\xae\xb2\xdb\xdc\x19\x52\x02\xdf\x50\x29\xd9\xa6\x1d\x3f\x6d\x56\x3e\xea\x99\xbb\x97\x26\x7f\xf0\x10\xbd\x55\x2f\x2f\x6a\x3d\x67\xd3\x70\x00\x45\x3e\xc3\x1c\x3f\xfd\xa8\xe7\xb0\x9e\xb7\xfb\xb1\x2b\xf4\x69\x6a\xcb\x6d\x61\xfa\xcf\xc8\xa4\xf9\x9a\x3a\x2f\x26\x52\x51\xf6\x94\x5f\x10\x7e\x6c\xe9\x8c\x22\x44\x78\x67\x7b\x59\xa7\x9e\xd6\xb9\x91\x7b\xf6\x00\xc7\x89\x2e\xf2\xd5\x91\x5c\xa9\x61\x8d\xac\x1e\x6d\xe4\xd5\x5e\xad\x77\x93\xeb\xd7\x28\x63\x51\xc4\x03\x8e\x7d\xa3\xb2\xa7\xf8\xb7\xa7\xed\xd5\x52\x02\xb5\x06\x46\x62\x3a\x4c\x86\x1c\x94\x9d\x0e\x7a\xaf\x28\xab\x15\x75\xef\x3b\x9a\xd3\x84\xa2\x48\x02\x5c\xf2\xb3\x23\x27\x66\x32\x5d\x04\xcf\x3d\xd5\x4a\x16\xbb\xa7\xc3\x50\x74\x9c\x3a\xb5\x9f\x76\x4f\xdb\xce\x1f\xce\x23\x7d\x68\xc5\xb1\xf7\xce\x28\x52\x0b\xc7\xb2\xfa\xda\xbd\x87\xcc\xb5\xc2\x1d\xed\x44\x1b\xb9\x84\x8d\xe4\x77\xd1\x05\x7e\x4f\xcd\x22\x3e\x3b\xcc\xb2\xb9\xec\xbd\x41\x99\x76\x12\x45\xbe\xc2\xc6\x77\xd2\xf7\xd4\x17\xcc\x66\xf1\x5c\xa8\x9f\x76\x34\x5f\xf0\x8f\x78\x4c\xaf\x53\x75\x87\x7c\x95\xd5\x4e\xcb\x7f\xe3\xe5\xe5\xad\x54\x28\xd2\x0c\x5f\x09\x73\x37\xe2\x89\x4b\xea\x70\xd6\x3b\xdf\xea\xb4\xc5\xcf\x6d\xa6\x8a\x61\x40\xa4\x75\xfb\x5b\x49\x6a\xbd\x1e\x97\xe5\x9b\xb5\x74\x3e\x9b\x79\x12\x1e\xbf\x2d\xe2\x91\xd3\xcf\x87\x77\xc7\x8f\x3e\xf1\xc8\x5e\x4c\x19\x16\x34\x7d\xdd\x7b\xe6\xd8\xa7\xc0\x15\x9e\x4f\xac\x9f\x9b\x5e\x9f\x3c\x8e\xa2\x48\x3a\x1c\x9c\xb3\xeb\x51\x17\x8e\x7e\x0f\x0b\x44\x38\xb7\x53\xb9\x4c\x9d\x6b\xa9\xfc\xe9\x9d\x2d\x99\xa3\x57\x5f\xf1\xdc\xf8\xf4\xf1\xf3\x85\x79\x28\x92\x0b\x17\xdf\xb5\x28\x9f\xee\x85\xfb\x3c\x39\x2c\x36\x97\x7f\x85\x36\x7a\xf8\x6e\xed\xb8\x4a\xbf\xeb\x41\x6d\xba\x3a\xd9\xeb\xa7\xd7\xef\x8d\xaf\xa3\x28\xb2\x00\x2f\x6d\x57\x8a\x42\xc7\xce\x24\x7f\x31\xa1\x18\x76\x9b\xbc\xc3\xeb\x6f\x82\xc7\x4e\x14\x66\x98\x07\xea\x0f\xbc\x5b\xac\xbe\x5c\x13\xb4\x82\x22\x2b\xb0\xf5\x74\x9d\x32\x7d\x2a\x86\xfb\x63\xca\x8a\xce\x88\xb5\x5b\xb0\xce\xca\x1c\xd2\xd5\x93\xab\x18\xf6\x90\x38\x98\x28\x35\xe7\xb2\x6f\x16\x1a\xba\xe7\x8b\x9d\x4a\x4f\xf8\x90\x1d\x07\xe7\xb3\xa3\xa5\x16\x0b\x69\x4c\xae\xca\xdf\xa9\x7f\x86\xe4\x1e\x7f\xb6\xbc\xa4\xf5\xa4\x8d\x0a\x45\x91\xcf\x70\xbe\xd2\x2a\x74\x98\x58\xbb\xae\xa4\x5c\x39\x7d\x96\xb8\x12\xb6\xd5\xf8\xe9\xf9\xc9\x27\x43\xe3\xbb\x4a\x57\x4c\x4e\x7c\xbb\x73\xad\xaf\x0f\x45\xca\xe1\x37\x50\x30\x56\xa1\x94\x74\x0f\x7d\x34\x4f\xf3\xb9\xdc\xf2\xf0\x03\x75\x77\xa6\xd5\xc5\x82\x76\x7a\x73\xd6\x10\xd8\xe8\x2f\x0f\x7f\xde\x49\x44\x91\x78\x58\xef\x52\xe7\xc8\x79\xd0\xbd\xe8\xee\x1c\xaa\x38\x49\xf4\x66\x75\x5e\x91\xec\xd6\xba\x40\xf0\x60\x79\x62\xdc\x43\xc3\x6b\x3c\xd9\xab\x84\xa2\x48\x34\xcc\x32\xd8\xd9\x94\xcf\xcf\x19\x35\x5a\x56\xcc\xeb\x4e\x74\x0b\x91\x7b\x15\xef\xa8\x4f\x39\xe2\x29\xf1\x90\xf1\xfb\xfa\x8d\x01\xbd\xa1\x46\x14\x29\x82\xad\xa7\x1a\x19\xb7\x51\x1b\xe8\x57\x08\xd6\x1e\x9b\x58\xf7\x6f\x51\x8a\x7f\xe7\xba\xcd\x5e\xa7\xeb\xc9\x8e\x5e\xfe\x1d\x3d\xc2\xb1\xef\x36\xd9\x1b\xfc\x06\x8e\xf2\x3d\x64\x49\x76\xa4\xce\xcc\x3a\x45\x9a\x7c\x51\x9c\x2c\xa7\xca\x44\x49\xd7\x9f\xcc\xd0\xf6\xcd\xa7\x88\x39\xc2\xad\xe7\x47\x9c\x51\x24\x18\x26\x61\xee\x4f\x9d\xe7\xce\xe6\xf4\x75\x84\x34\xbf\x1c\xe0\xb3\xf8\xac\x41\xbf\x33\xe1\x6e\x1e\xbf\x5f\xba\xde\xd0\x16\xfa\x66\xaf\x87\x1f\x51\x24\xee\xaf\xe1\x2d\xf1\x5a\xb9\xab\x1f\x72\xaf\x2a\x12\x16\xc9\xcd\x4c\xef\x8d\x86\x39\xe5\x67\x6a\x90\x38\x0f\x14\xfd\xf0\x79\xb9\xed\x44\x08\x8a\x94\xc2\xaf\x08\xa9\xe9\xf4\x9a\xe6\xdd\xec\x31\xc5\xcb\x4a\xc9\xf7\xd2\xb3\xe3\x73\x2e\x9c\xfc\x24\xb8\x27\xe3\xa5\xbb\xbd\x2d\xbb\xae\x25\xb7\x9a\x33\x8a\x64\xc0\xef\xc8\xda\xa3\x42\x3a\xe6\xdd\x41\xc7\x22\xed\x16\xdb\x5f\x4a\x49\xde\x39\x7c\xe4\x40\xa3\xd0\xfe\xc4\xa6\xd7\x8c\x81\xd2\x1a\x83\x26\xd3\x28\xd2\x02\x5f\xb3\xb9\x71\x8d\x56\xd3\xf0\x5a\xfb\xad\x82\x6e\x19\xbb\x6b\x4e\x0a\xbd\xc8\xfe\xa4\xec\x63\x21\xec\xcf\x76\x32\x8b\x7e\x7c\xf8\x38\xf4\x09\x8a\x0c\xc1\x4b\x45\x22\x70\xeb\x87\xba\xdd\x7a\x61\x6a\x1d\x5d\xf5\x07\xfb\x04\xa1\x97\xfb\x8d\x22\x6b\x2d\xa9\x27\x77\x57\xca\x92\x8c\x5f\x8f\xb9\x80\xa2\x48\x1c\x9c\x10\x88\x62\xe1\x02\xec\x0c\x07\x29\xe5\x38\x38\xad\x75\x1b\x54\x93\x38\x1f\x7c\x33\x1d\x20\xe9\x58\xc9\xde\x33\xd3\xe7\x5c\xa4\xf1\x13\x45\xf2\xe0\xa5\xca\xdc\xbd\xef\xcc\x8c\xe9\xa3\x2d\x06\x0b\x4b\xec\x7b\x0f\xf0\x25\xf1\xf3\x1e\x76\x3e\xac\xb8\xeb\x98\xcb\xc9\x58\x7d\x03\xab\x23\xdb\x36\xa7\x87\xf9\x29\x63\xdb\xb4\xf2\xe3\x5d\x92\x45\xb7\x1a\x2a\xe6\x23\x87\x96\xa4\xe6\x26\x73\xec\x33\xaf\x92\xa1\x6b\x3f\x98\xd2\x7a\x4b\xcc\x95\x51\xa4\x16\x4e\xc5\xf6\xdb\x3f\x7c\xb2\x9b\xca\x1d\xea\xf5\x19\x3c\xdf\x62\xf4\xed\x48\x54\xee\xcd\x33\x45\xed\xa7\x7a\x6f\x98\xad\x9c\xc8\xa5\x39\x5e\x43\x44\x91\x37\xf0\x51\xfb\xf7\xf1\x53\x39\x9d\x34\x63\x42\xac\x6a\xa9\x73\xd1\x32\x1b\x71\x1b\x3b\x89\xef\x48\x3f\x15\x1a\xc7\xb3\xf1\xf6\xb5\x3b\x9f\x83\xbf\x01\x78\xe1\x6b\xd9\xc9\x62\xd4\x11\xd1\x7d\x5e\xc3\x9c\x9c\x2c\xa1\x12\x18\x46\xe9\xd4\x97\xf8\xb9\x21\xe8\xaa\x60\xda\xc9\xc1\x17\x3d\xf0\x15\xae\x82\xce\x82\xd7\xd7\x23\x68\xde\xff\x52\xa4\x90\x6d\x54\x22\xe4\x8e\x99\xde\xa6\x9e\x96\xb7\xd4\xe5\x4f\x11\xb3\xb5\x6b\xba\x49\x44\x91\x9f\xb0\x93\xe7\x78\x95\x12\x09\xb9\x8e\x0f\x47\xc2\x1f\x9d\x0b\x3a\x44\x0c\xf6\x38\x7c\x5a\xf9\x86\x70\x7b\xd1\xd1\xc2\xc7\x85\xe6\x97\xb3\xeb\x9c\x51\xc4\x09\x4e\x4b\xfa\x36\xd5\xaf\x4a\x8b\x04\x09\x85\xba\xef\x83\x86\x36\xf4\xb6\xc8\xc8\xdd\x74\x3d\xb7\x75\x8a\x86\xa2\x59\xa6\x76\xec\x67\xa8\x0b\x8a\x0c\xc1\x3b\xc0\x33\xbd\x78\x0d\xf1\xe3\xd6\x1a\x7e\xcb\x6c\x92\x90\xc1\x7e\xbf\x2d\x61\xed\xc4\xae\x13\x3f\x6b\x75\x65\xe7\x22\x5a\x96\x03\x8a\x51\xe4\x17\x9c\xc5\x14\x7e\x1c\x15\xcc\x37\x31\x99\x25\x2d\xb2\xdb\x6a\x37\x2a\xcc\x6f\xf3\xdd\x67\xe2\x3c\x53\x4e\x47\x06\x45\x0a\x4f\x29\x8b\x06\xfc\xe9\x2d\x03\x67\xbd\xac\x04\x6f\xfe\x55\x47\x67\x5b\xd9\x1f\x41\xdd\x5e\xe3\x77\xc3\xb2\x1d\x7d\x73\x34\xbe\xce\x84\xc4\x45\xbc\xc9\x9c\x84\x86\x26\x9e\xf1\xf8\x99\xda\x77\xf0\x76\xe3\xdb\xa4\x5f\x26\xc7\xe9\xcf\x64\x74\x87\x9a\xcf\x54\x72\x25\xdf\x1b\xbf\x79\x6b\x39\xbb\x80\x12\x45\x91\x22\x38\x37\x5e\x3a\x59\x7d\xb3\xb9\x2b\x58\x44\xe0\x55\xe9\xb0\xd9\x5b\xf1\x60\x3a\xe7\xa6\xf9\xad\x4c\x5b\x63\x2a\xd4\x3f\x98\x2c\x6a\x88\xb2\xa2\xc8\x77\x78\xf8\x38\xe3\xb3\x97\xaa\x8b\xfc\x7a\xd2\x27\x9e\x4b\xd9\xa6\xa8\x7c\x55\xbf\x6a\xbc\xe3\xe7\xde\x1a\x39\x8f\xaf\xd5\x14\xfb\x3b\x3c\xc3\xa1\xa1\xde\x8f\x54\x9b\xb7\x27\x8f\x50\xbd\x44\xfb\xd9\xee\x1f\x7c\xd4\xb0\x15\x45\x62\x1d\x44\x4f\xaa\x55\x97\x90\x2c\x5b\xf0\x77\xc9\x40\x43\xab\x38\xc3\x05\x26\x52\xa9\xed\xdc\x7f\x99\x0f\x58\x23\x7d\xae\x75\x96\xfb\x4a\xf6\xb5\x85\x66\x54\x55\x8d\xc5\x24\xfb\x72\x29\x38\xa3\x32\x70\xda\x0a\xbe\xae\x3d\x52\xb4\x74\xc7\xc3\x38\x24\x4b\x7e\xe4\x0a\xb9\x9a\xf2\x2e\x9f\xca\x67\xf1\xfb\x6d\x64\xc3\xd0\x0c\x55\x0f\xc5\x17\x28\x12\x0d\xbf\xc8\x0a\x0b\xdc\x27\x2f\x88\xeb\xaf\xd9\xef\x6d\xf1\x97\x5a\x2d\xdf\xc9\x72\xf9\x5c\xb4\xb0\x19\xe3\xd9\x02\xc6\xd4\xb1\x9d\x5a\x3f\x17\x50\xa4\x10\x76\x71\x9f\xa4\xf5\x40\x8b\x02\x15\x6b\xad\x7b\xef\xb3\x51\xcf\x70\xaf\x3d\x0d\x32\x43\xec\x0d\xae\x0f\x16\x27\x33\x9a\x18\x5e\x3c\x8b\x82\x86\xfe\x50\xbd\x39\xc1\xfb\xe5\xe2\xee\xb7\x57\x27\xa6\x47\xde\xb2\x05\xed\x33\xab\x28\xd2\x0f\xae\x4e\x57\x18\xbb\x68\x73\xb7\x61\x1d\xfe\x25\xdd\x50\x85\x0e\xe7\xe2\x08\x7a\x5b\x22\xe3\x37\x72\x23\xae\x9f\x8a\x3b\x55\x6c\xd8\x4f\x9b\xd0\x07\xf9\x1f\xbf\x4a\xd6\xec\x4e\xbb\x21\xfc\x8f\x14\x4d\x8e\xeb\x8f\x04\x0e\xa4\x69\x3c\x9e\x86\x61\xd6\x81\x68\x83\xc7\xd5\x30\x8c\x07\x90\x10\xf1\xf8\x1a\x86\x19\x06\x1d\x10\x2e\x67\x03\x98\x48\x20\x42\xe1\x12\x37\x80\x49\x07\xfa\x02\x1e\x7b\xc3\x30\x9f\x41\xe3\x88\xcb\xe0\x00\x86\x08\x44\x35\x5c\x1a\x87\xc5\x0d\xac\x0f\x1e\x97\xc3\x30\x09\x40\xfb\xc0\xe5\x73\x00\x53\x0b\x62\x8d\x4b\xea\x00\xe6\x2b\xf0\x07\x8f\xd9\x61\x98\x66\x70\xa5\x00\x97\xdd\x01\xcc\x32\xc0\xe0\x32\x3c\x6c\x4d\x41\xdc\x70\x69\x1e\xc0\xe4\x02\xa1\x02\x97\xea\x01\xcc\x02\xd8\x07\x78\x7c\x0f\xc3\xac\x90\x82\x3f\xd4\xc4\x65\x7e\x72\xdc\x1e\xff\xfb\xe8\x46\x0b\x5c\xf6\xef\x2d\x18\x1f\x7d\x92\x79\xd8\x6c\x41\xd4\x51\xd2\x23\xc5\x34\x5d\xf0\xb6\x5d\x21\x2f\xb9\xff\x0d\xea\x56\x8e\x4c\xc7\xbd\xd6\xd3\x44\x14\x09\x82\xeb\x78\x1e\x95\x97\x0f\xe1\xa2\x3d\xf3\xd6\xde\x67\x9c\xab\x53\x56\xe8\x81\xe8\xbd\xa5\xe5\xf4\x3c\x24\xb6\xfa\x57\x38\x6e\xb2\x5e\xbf\x4d\x44\x91\x26\x58\x89\x2c\x76\x1f\x0b\x3e\xff\x75\x9c\x43\x3d\xa6\x82\x96\xbe\xf0\xec\x48\xc4\xcf\x21\xde\x96\x5f\xe7\x4e\xfc\x32\x7e\xee\x16\x56\xd3\xc5\xb8\xb9\xc9\x60\xae\xab\xda\xd8\x9c\x73\x20\x6b\x87\x79\x5f\xb3\xa1\x16\xd5\xde\xea\x7a\xea\x92\x07\x0d\x6d\x15\x61\x5f\x18\xad\x73\x1e\x58\x7e\x38\x98\x40\x44\x11\x37\x98\x73\xd1\xbf\x6b\xdc\x32\xd2\xe8\xb2\x3d\xaf\xa4\x28\xe2\xeb\xfb\x1d\x93\x61\x2e\xe8\x9e\x46\x45\x3d\x06\xb2\xc9\x71\xc1\xc9\x30\xd5\x0a\xe1\x7f\x73\x13\x0b\x69\x0b\x38\x31\xc4\x73\x15\xc3\x04\x81\x5b\x34\x78\xee\x62\x98\x26\x20\x5f\xe2\xb9\x0c\xbd\x8e\x60\xfb\xe2\xb9\x8d\x61\xdc\x80\xce\x86\xcb\xf5\xb1\x94\x04\xfc\xc1\x23\xfc\x18\xa6\x1c\xa4\x72\x5c\xd2\x0f\x30\xf1\x20\xd6\xb8\xc4\x1f\x60\xa2\x81\x66\x86\xc7\xfe\x31\x4c\x11\xf0\x07\xaf\x03\xc0\x30\x6f\x41\x2a\xc7\xed\x02\x00\x26\x18\xc4\x1a\xb7\x15\x00\x98\x38\x80\xc1\xeb\x07\x30\x4c\x29\x48\xb1\xb8\x3d\x01\xc0\x64\x80\x14\x8b\xdb\x18\x60\xef\x02\xf8\xc3\x60\xdc\xee\x00\x60\x86\xc0\x9a\xe2\x76\x08\x58\x0c\x40\x99\xc1\x6d\x13\x00\x26\x0f\xac\x29\x6e\xab\x80\x3d\x07\x68\xc1\x78\xfd\x02\x54\xce\x00\x0d\xc0\xeb\x19\x30\xcc\x1b\x4c\xfe\xc7\xeb\x1e\x50\x39\x52\xc2\x35\x72\x97\xcd\xc0\xc1\x17\x27\x4c\x3a\x9f\xd7\xee\xaf\x1d\xbd\x68\xf4\xc8\x30\x7d\x26\xd5\xd4\xdb\xf4\x47\xb4\xc5\xcd\xb1\xd1\x9d\x42\x23\xca\x0a\x35\xb6\xf7\x09\x44\x14\x19\x84\x1b\x73\x85\x9f\x52\x21\xd7\xf9\x1e\x0a\xdb\xf3\xd1\x54\x1f\x54\x9b\x98\xa9\xe2\x54\x43\xb7\x53\x28\x9c\x89\x3a\xe3\x2d\xc4\x50\xa3\xfe\x8d\x88\x22\xa3\x70\x6b\x70\x64\x26\x26\xf1\xf6\x93\x0c\xee\xa5\x47\xed\x9f\xe2\xb3\xd4\x3a\x4d\x65\x24\x4f\x9a\x33\xb6\x77\x5c\xb3\x3d\xd0\x94\x17\xbd\xf6\x81\x88\x22\x9e\x70\x5a\x8e\xd0\x95\x89\x57\x1f\x6b\xfc\x10\x96\xbf\xaf\x8e\x64\xc7\x5d\xde\x95\xd4\x83\x35\xaa\xf6\xf5\x9c\xdc\x2f\xf7\xaa\xdf\xce\x29\xa1\x15\xfe\x37\xb3\xa1\x6d\x02\x2e\x0b\xe0\x99\x8e\x61\x06\x41\x8a\xc1\x33\x1f\xc3\x8c\x82\x2d\x8c\xe7\x02\x86\xf1\xc4\xaa\x2a\x5e\x47\x87\xca\x39\x91\x3a\xed\xd8\xac\xaa\x1e\xf0\x72\xd4\x8d\xbd\x7d\xed\x96\x7e\x6f\xa2\x15\x8d\xfe\x9e\x30\x36\x3d\x1e\x4d\x42\x2f\x36\x41\x3b\x26\x10\x7a\x2e\xcf\xbc\xe5\xe1\xe4\x66\x95\x6c\x84\x1b\xc1\xda\xd1\x63\xeb\x03\x44\x57\x8f\xaa\xe7\x11\x97\x4f\xed\xde\xd7\x73\x6a\xa8\xf5\x8a\x80\xde\xd2\xda\x83\x8f\x2d\xa2\xa4\x02\xae\x13\x44\x14\xf1\x85\xb7\xc7\x15\xa7\x1b\x42\xe1\x71\xb6\x91\x33\x1c\xb1\x8d\xbe\xcb\x7b\xb4\xee\x57\xae\x49\x4b\x91\x84\xdf\xa6\xe9\x4c\xc8\x2e\xec\x88\xa4\x21\xa2\x88\x33\x3c\xff\xaa\xb8\x4c\xc3\xa7\xb3\xa7\x96\x9c\x85\xd3\xa4\x02\x4b\xb7\x55\x4e\xd3\xbc\xb8\xe9\xc2\x41\xd0\x97\xe0\xf1\x7c\xf1\xee\x62\xe6\x71\x22\x8a\x54\xc1\xed\xf4\xfe\xaf\x67\x96\x99\xe2\x6b\xec\x43\xb7\x8e\xa4\x04\x89\x6d\x9c\x9d\xb1\x10\xa5\x29\xa0\x8a\x3e\x5c\xe1\xc5\x66\x29\x6c\x69\x7a\x50\xf8\xdf\xdc\x84\xc8\x27\x58\x3a\x3c\x57\x31\x4c\x23\x78\x5b\xf1\xdc\xc5\x30\xbe\x60\x5b\xe1\xb9\x8c\x61\x9c\xc1\x73\xf0\xdc\xc6\x30\x55\x20\x2b\xe0\xf5\xf0\x18\xe6\x27\x78\x0e\x6e\x1f\x0f\x30\x4e\x80\x7c\xe2\x36\xf3\xd8\xab\x05\xb6\x3c\x5e\x47\x8f\x61\x7e\x6d\x07\x19\x0b\xaf\xb7\x47\xe5\x84\xe8\x09\xbf\xaf\x7e\xf7\xc1\x8a\xca\x3d\x52\xdd\x2c\xd6\x37\xbd\x54\xe6\x92\xa4\x4c\x59\x71\xfd\xa6\x4b\xe6\x8c\xb4\x5d\xc7\x73\xa7\x1e\x99\xfd\x90\xb2\x7a\x74\xfa\x23\x11\x45\xfa\x61\xfd\x68\x81\x94\xdd\x34\xf7\xd3\x44\xd4\x6a\xff\xb4\x8b\xa4\x55\x03\xcf\x23\xe9\x73\xef\x95\xda\xf3\x1f\x57\xdc\xd7\xe5\x11\x22\x8b\x19\xd9\x2c\xf5\x30\x51\x4d\xd8\x4e\x65\xc5\x75\xeb\xf4\x61\x23\x93\xf0\x5b\x76\x07\xde\x76\xf4\x74\xb1\xe9\xd2\xda\x3c\xb9\xed\x3b\x3d\x25\x91\x1e\xb2\x75\xd3\x1e\x27\x98\x78\xea\xff\xb2\xaa\xd6\x2e\x9c\x67\x2d\xae\x56\xfb\xf4\x2d\x2d\x38\xea\x42\x19\x77\x94\x96\xb0\x56\x76\x73\x01\xd9\x71\xbd\xa7\x9a\xf1\xc2\xff\x66\x36\x16\xa2\x3e\x70\x3d\x04\xcf\x74\x0c\xd3\x0f\x0a\x1b\x9e\xf9\x10\xc1\x01\x05\x14\xcf\x05\x68\x9b\x6c\x01\x19\x0b\x57\x6f\x91\x53\x45\xa8\x7f\xf7\x01\x9f\x61\xf1\x47\x90\xd5\xc1\xfe\xea\xd5\x57\x27\xdb\x44\x3a\x42\x4e\x89\xbf\x73\x34\x67\x97\x2b\x3c\x3c\xac\x25\x5e\x1e\x55\xcb\xca\x65\xe7\x36\xbb\x19\x00\x78\x39\x46\x8e\x1e\x62\xf4\x21\x67\x56\xbb\x2d\xe8\x36\xba\x93\x87\xb0\xa2\xe0\x34\xd9\x7b\xde\x69\xb7\x7f\xec\xfe\x51\x63\x19\xd2\x85\x74\x22\x8a\xcc\xc3\xd2\x95\xce\xb0\x96\xe0\x0a\x53\xa6\xe9\x2b\xa3\xad\xda\x42\xa7\xc5\x5e\x4f\xb6\xb3\x07\xde\xdb\x95\x71\xcd\x5d\xdb\xed\x07\x6f\x97\x52\xdf\xe6\xbe\xfd\xeb\x0f\x3e\x35\x56\x5e\x97\x9c\xe9\xaf\x3a\x74\xe3\xf3\xe0\x49\xe1\xdb\x0f\xbe\xcb\xbf\x54\xb2\xd4\x99\xe2\x0c\x79\x3f\x5f\xeb\xe7\xf5\x5e\x96\x88\x22\x5d\xf0\xf8\xa9\xee\xe3\x0b\xfe\xa4\xf4\xce\x01\xde\x62\x73\x4a\xbd\x01\x2e\xad\x72\x12\xdf\xb2\xb7\x3d\x88\x1f\x1f\xe9\x32\x09\x9d\xe2\xf9\x93\xb1\xf0\xdc\x84\x38\x30\x68\xe1\xf0\x5c\x85\xb6\x08\x58\x3a\x3c\x77\x31\xcc\x3c\xf6\x0b\xb3\x38\x2e\x43\x6f\x38\xd8\x8a\x78\x6e\x63\x98\x2e\x80\xc1\x55\xd8\x30\xde\x0c\x5a\x52\x3c\x99\x0d\xc3\x7c\xa7\x04\x5b\x11\x4f\x70\x43\xe5\xa8\xe9\x5f\xfd\x6f\x2b\xc2\x4b\xc9\xb3\xc4\x75\xea\x63\x63\x5d\xf3\xb5\xa7\x9d\x57\x2e\xfe\xbc\x18\x3c\xfc\xc8\x71\x89\xae\x8d\xf3\xa9\x78\xf4\xc5\x86\x73\x3d\xac\x57\x36\xc9\x39\x5c\x0c\xef\x7b\x76\x5e\x4d\xdd\xf2\xc5\x79\xad\x71\xa7\x8d\xd4\x2d\x5a\x0d\xd3\x16\x9d\x47\x6f\x23\x8a\xc2\x4f\x2b\xdd\xa0\x23\x34\xaa\xf0\x6d\xa6\x6b\xb8\x65\x6c\xa2\x3e\xa6\x6a\x53\x7b\x6a\xfe\x34\xf9\xb5\x97\x5c\xa4\x1f\xb7\xf4\x5f\x3c\xbf\x2c\xe0\x2f\x36\x7b\x63\x79\x9b\x00\xd5\xe1\x66\x29\x22\x8a\x7c\x81\xe7\x97\x65\x33\xe5\x7b\x68\x20\xdd\x78\x82\x8f\x5c\xe2\x7a\xcc\xae\x27\xa9\xed\xab\x83\x56\x0e\x17\xdb\x06\x2f\x49\xd2\x89\x49\x45\x6f\x6e\xc5\x4a\xf8\xd5\x60\x79\xe7\xd0\x1f\xbf\xc5\xe9\x76\x39\xf3\x43\xf9\x52\x2b\xd1\x15\xcd\x7d\xf3\x5b\x7b\x4e\x7c\xc8\xdd\x72\xb1\xf7\x17\xd1\x61\xe3\xcf\xe5\x3c\x3c\x37\xa1\xad\x08\x96\x0e\xcf\x55\xa8\x7d\x01\x85\x10\xcf\x5d\xa8\xa8\x81\x56\x04\xcf\x65\x0c\xf3\x05\x3c\x07\xcf\x6d\x0c\x53\xb9\x75\xa1\x92\xf4\xdf\x84\x56\x54\x56\x55\x8e\xe0\x82\xa2\x48\x34\x2c\x42\xdc\x7b\xde\x55\xfc\x7a\x5d\x4d\xef\xcb\x57\x2e\xad\xce\x98\x56\x82\x99\x1a\x07\x59\x79\x28\xbd\xd1\xa9\x6b\xcd\x3a\x57\xe4\xb2\x5e\xa1\xc8\x1b\x78\xc1\x19\x32\x6f\x06\x7e\xbd\x51\x77\xa0\xd5\xd4\xcb\x61\x1f\xc3\x20\x99\xcd\xf6\xee\x1b\xd2\x0e\xd1\x53\x66\x05\x0e\x13\x59\x81\xef\x28\x51\x14\x89\x85\xf5\x59\x72\xa5\x86\x46\xc1\x3e\x81\xf2\x25\x29\xf3\xd9\xd5\xdc\x1b\x7b\xd1\x47\xe5\x93\x21\x1c\x17\x8e\x4e\xf4\x7f\x52\x91\xc9\x16\x11\x44\x91\x16\x38\x75\x86\x7e\x6b\x91\x11\x5d\x89\xb5\x10\xb6\x7f\xb1\xa4\x64\xcb\x5f\x9c\xd9\xd7\xe4\x21\x2f\x53\x17\xd0\x11\xab\x57\xfe\x22\x5a\xf0\x12\x11\x45\xc6\x60\x72\x98\x4f\x7a\xb5\xda\xd7\xe7\xc9\xa7\x3d\xab\xe2\x49\x76\x57\xc4\x3b\xe2\x92\x02\xd8\x13\x9c\xf5\x4b\x57\xf5\x09\x27\x78\x62\x29\xcb\x89\xa8\xcc\x71\x68\x38\x75\xf5\x95\xda\x95\x55\x4b\xd5\x5d\x0c\x3c\x57\x4b\xcb\x6b\x25\xfa\x4c\x9c\x9c\x77\x97\xe8\x68\x5c\xe4\xee\xec\x93\xbc\xa0\xdb\x23\xfc\x8f\x31\xc1\x0a\x0c\xe8\x9c\x70\x03\x83\x75\x34\x60\x6b\xe0\x06\x07\x60\x62\x41\xc7\x89\x17\x21\xa8\xe3\x04\x59\x17\x2f\x4a\x18\x66\x8c\xe1\xcf\x7d\x07\xbc\x50\x01\x8c\xcc\xf1\x3f\x10\x5c\xe9\x1e\x40\x80\xee\x80\x2b\xdf\x63\x91\x06\x11\xc0\xd3\xf0\x31\x4c\x21\x25\x60\x62\x78\x6a\x3e\x2a\x77\x92\x40\xf8\xfd\xe1\xbc\x42\xf8\xed\xc8\xda\xc8\x31\x31\xf1\x57\xd2\x53\x0c\x54\xd4\xd8\xdd\x6a\xa1\xac\x4f\x33\xba\xc1\xdf\x5f\xe9\xf9\xe5\x71\x8f\x9f\x79\x70\xb1\x1e\x11\x45\xba\xe1\xf1\xc3\x4a\x2f\xe5\x7f\x16\x6e\xa9\xcb\x7b\xa1\xf5\x51\x87\xcb\x7e\x50\xf0\x62\x9a\xf2\x42\x52\xf7\x2e\xa1\xa4\x26\x52\xa9\x44\x8b\xba\x4d\x7e\x01\x5f\xd2\xef\xd6\x94\xe8\x1b\x24\xaf\x0b\x24\x1a\x76\xf1\x4d\x0e\x0d\x4c\x3b\xab\xbc\x79\xf0\x25\xe1\x97\x59\xc1\x89\x6f\xd5\x42\xc5\x4d\x3c\x44\x14\xa9\x81\xcf\x39\xcb\x5c\x8e\xa8\xfe\x98\xb4\x5b\x46\x17\x96\xd6\x53\x64\xa5\x48\xd4\x8f\x06\x47\x77\x34\x2e\x7d\x89\xe5\x4c\xa5\x31\x6c\xce\xa8\x15\xfe\x37\xb3\xa1\x10\x81\x0d\x8c\x67\x3a\x86\xe9\x06\x18\x3c\xf3\x21\x56\x05\x2e\xc1\xe3\xb9\x80\x61\x6a\x28\xc0\xf2\xe1\x9d\xb0\xa0\x72\x42\x04\x82\xcb\xe6\xf2\xbd\x81\x99\x92\xdc\x46\x26\xf1\x29\xeb\xa5\x91\x2f\xf3\xdf\x1e\xf5\x3d\xf3\x4d\xfa\x14\x94\x98\x77\x69\x2a\xbf\x75\x6f\x83\xc3\x96\x53\x4f\xc3\xca\x88\x28\x12\x00\x97\x1b\xd7\xf1\x2c\x3a\x51\xf1\x88\x65\x3d\x87\x9e\xb3\x1f\xa4\x5e\x30\xed\x16\xa4\x2e\xaf\x3c\xd8\x73\x61\x9e\xb1\xfa\xe4\xfa\x81\x07\xb9\x44\x14\xc9\x86\xc7\x3b\x8a\x64\xf5\x1a\xe6\xb0\x73\x94\x58\x36\x17\x06\xf7\x87\x9b\x0a\xd7\xb7\x04\xd1\x37\x67\x9d\x79\x37\x90\x59\x4f\xdd\xd7\xbb\x59\xfe\x3c\xe0\xd6\xff\xd5\xd1\xd2\x92\x48\x67\x7f\x4a\xe5\x31\x56\x2f\x3b\xb5\x3e\x96\xfe\x1b\xc6\x3f\xc6\xf8\x5d\x99\x98\x2d\x2f\x44\x3d\x9e\xdf\xcf\x22\xfc\x6f\x66\x43\xb9\x04\x30\x1e\x3c\xd3\x31\x4c\x00\x60\x56\x78\xe6\x63\x98\x6c\x80\xc1\x73\x01\xea\x53\x49\x17\x16\xb6\xff\x0f\xf4\xd4\x67\x42\x36\x9d\x42\xe1\x88\x03\x79\xd9\x4d\x75\x4d\x33\x61\xcb\xa4\x7d\x4f\xbc\xcb\x2c\x66\xcf\x5d\xbb\x49\x1f\xa6\x13\xf2\x1e\x95\x5b\xdc\x70\x5c\x09\x65\x47\x51\xe4\x33\x5c\x3d\xde\x1b\xe7\xa5\x2b\x5a\xbb\xf6\xe6\x12\xde\x78\xfb\x65\xea\x87\x7a\x7a\xac\x1f\x1a\xe0\xd3\xba\x2c\xbd\xbb\x5f\x57\x60\x8b\xec\x39\x14\x19\x81\xfb\x94\xe9\x14\xdb\xaf\x57\x29\x54\xb7\x0b\xdb\xfa\xd1\x52\x7f\xd9\x52\x71\x91\xfe\xfe\xa4\x7a\xdb\xac\xf5\x8c\xe8\xa9\xfd\x1a\x29\xc7\x85\x9c\x51\xc4\x0b\x6e\xcd\x9d\x5f\x0b\xa5\xab\xbf\x7e\x77\x2a\xd0\x36\x76\xbe\x89\xb2\xed\x63\x8e\x5d\x65\x6c\x72\x6d\xad\xe8\xde\xc2\xd0\x9f\xaf\x53\xaf\xea\xa3\xc8\x4b\xf8\x73\x18\xf5\x5b\x0f\x0f\x17\x08\x7a\x93\x99\x1a\x1b\x2c\x08\x64\xeb\xab\xa1\x07\x72\xe4\x7a\xa4\x12\x8f\x13\xe8\xa7\x0e\x0f\x32\xbd\x39\x8d\x22\xeb\x30\xd7\x59\x73\x96\xef\xdd\xe6\xc2\x92\x32\x23\x1c\xc0\xdc\xa5\xaf\x79\xe3\xeb\xd7\xc7\xd2\x63\x9d\x8a\xa4\xf2\x16\x7d\xc7\xaa\x8d\x64\x92\xe1\xc3\xeb\x95\xfb\xd7\xbf\x4a\xb3\xc5\x1e\x8c\xa4\xdd\x1f\xe8\x97\xf5\xed\xeb\x6c\xe8\xf3\xad\x12\x63\x96\x81\xca\x8e\x91\x26\x25\x56\x0f\x9c\x51\xe4\x23\x3c\xf5\xa3\xae\x6f\xd3\xb7\x49\x92\xec\x99\xc2\x6d\xd9\xfc\x11\x4e\xdb\x1d\xd7\xd2\xa2\xfa\x0f\x86\x5d\x71\x2c\x11\x96\x21\xdf\xb7\x43\x0d\x45\x6a\xe0\xcb\x5b\xdc\x75\x91\xab\x94\xc5\xbe\x7c\x89\xc4\xa8\xef\xb3\xd6\xfb\xbc\x02\xaf\xf2\xb9\x30\xb6\xc7\x96\x0e\xee\x4a\xa2\x1f\xb8\x64\x56\x87\x22\x8b\xf0\x70\x13\x4a\xc5\x77\xf7\x1f\xf5\x3d\xd7\x96\xcb\x26\x7d\x3c\x2f\xd8\xcd\x1b\x5a\x1e\xeb\xf0\x2e\x24\x94\x5f\xe1\x4e\xc4\xf6\x05\xb9\x7b\x28\x8a\xe4\xc3\x49\xe9\xa0\x4a\x53\xcd\x9c\x52\xeb\xb8\xdc\x91\x73\x6d\x37\x6f\xe9\x28\xf4\x1b\xf8\xa4\x44\x92\x65\x49\x3e\xd8\x29\xd0\xf2\x54\xee\xb0\x25\x8a\x94\xc0\x02\x4a\xde\xa5\xb9\x5b\x46\x27\xbb\xbe\x4f\xa2\xbe\xeb\x02\xfd\x1c\x09\xa4\xd9\x36\x5b\xef\x9c\xe2\x7e\x3e\x5f\x56\x70\xa4\x64\x9d\x4e\x0c\x45\x91\x01\xf8\xa5\x39\xf8\xe5\x73\xe0\xad\x09\x51\x86\x86\xb6\x67\x7e\x8b\x16\xe6\xea\x85\xaf\xaf\xf8\x9b\x31\x5d\x8f\x49\xfc\x49\x69\xbb\x9b\xee\x59\x21\x8a\xcc\xc2\x14\x82\x47\xe1\x7a\xcc\xf1\xba\x60\xd5\x64\xb9\x1e\xf9\x0f\x6b\x37\x4c\x17\x4c\x0e\x84\x8a\xbe\x9d\x78\x63\x19\x64\x44\xcd\xa7\x77\xef\xe4\x26\x7f\x87\x37\x4d\x60\x35\x89\xd1\xb0\x6a\x85\x1f\x85\x98\x8f\xa0\x59\xf6\xd6\x6f\xdf\xfa\x99\x97\x55\xb3\xa8\xc3\x77\xf8\x0c\x4a\x9c\xe3\xfd\xb2\x49\x91\x23\xe0\x77\x3e\x55\xfc\xf1\xa3\x01\xc9\x4a\xf6\x83\x0a\x52\x21\x73\xb9\x26\xf3\xf7\x0a\x27\xbc\xab\xdc\x93\xec\x66\xec\x1a\xc2\x7b\x3b\x14\xae\xa2\xa8\x0c\xcc\x50\x58\xf9\xe8\xf3\xd5\x99\xf7\x2d\xef\x26\x6f\x1c\x7a\x17\xbd\xfa\xc1\xff\x99\xdb\x91\xde\x27\x41\x5c\xe3\x05\x7b\xc3\xce\xff\x18\x13\x43\x91\x69\x58\x4c\x1c\x18\x4b\x39\x4d\xa7\x49\xdd\xc6\x6a\x99\xd9\xeb\x31\xb7\xed\x69\x40\xfb\x96\x0f\xa9\x2b\xfb\x29\xdf\x66\x11\x04\x6d\x77\xe9\xc7\x12\x51\x24\x0a\x26\xf8\x06\x2e\x17\xba\xf6\x1a\xdb\x7a\x37\xce\x1a\xb2\x39\xd4\xd9\x1f\xe4\x3e\x1d\xc8\xda\x55\xb1\xfb\x31\x93\xcc\xf6\x98\xae\x71\x6b\x7e\x78\x17\xd4\x0e\xd0\x5a\xf2\xc8\x3d\x2f\x8d\xc9\x08\x56\xe6\xfc\xea\x96\x45\xaa\xc8\x37\x68\xe7\xfb\x55\xde\x8e\xdc\xbb\x30\x96\xc6\x68\xb3\xc8\xc2\x6f\xc7\x55\xad\x3a\xa1\x63\xc1\xcb\x4b\x87\x06\x0b\x4f\x5f\x76\x0f\x9f\x11\x71\x73\xdd\x77\x26\xc2\x76\x45\x20\x8a\x93\x33\xb7\xfb\x81\x0f\x8a\x22\x71\xf0\x36\xe8\x16\x1e\x38\x1b\x7d\x94\x74\x80\x8c\xcc\xe8\x00\x35\x9f\xa5\x89\x8e\xbf\x3a\x47\x62\x84\xb2\xd5\x3d\x61\x89\xbd\x03\x5b\x94\xbc\x51\xa4\x12\xbe\x40\xd4\xe5\x3a\x64\x6d\xd6\xc5\xc4\xff\xc4\xa2\x81\x61\xb7\xb0\xc8\xe5\x61\xa1\x22\xa7\x5b\xbf\xa2\x9f\xa6\x5c\x0b\xe1\x64\x34\xeb\x39\x09\x0d\xdd\x32\x79\xc3\xa9\x27\x62\x7e\x8d\xa2\xfb\xe5\xe5\x46\x8f\x0a\xbf\xc9\xbb\x1c\x19\x25\x6f\x76\x84\x9f\xe0\xbd\x19\x2f\x1c\x61\xea\x0f\x0d\x65\xfa\x2c\xb2\xff\x23\xe2\xc6\xad\x9e\x78\xe1\x40\x66\xdc\xd4\x87\x13\xbc\x32\xcc\x42\xd2\xa2\xc4\x21\xfa\x8e\x62\x0b\x9b\x0d\x2e\x67\x14\x89\x86\xe3\xad\x66\xab\xe9\x87\xd8\xf1\x7f\x13\x8b\x3f\x64\x66\xe0\xeb\xf4\xeb\x53\x79\xe3\x9e\x89\x3b\xe9\xe5\x74\xc3\x5f\x67\x82\x05\xd7\x24\x51\x24\x0e\x0e\xb7\x9d\xa7\x24\x45\x44\xbe\x08\xb5\xe7\x99\x47\x0c\xc1\xf3\x45\xf9\x21\x11\x2e\x1b\xfa\x2a\xc7\x4a\xee\x1d\xb6\x31\x55\x36\xd1\x79\x81\x22\xcd\x70\xc6\xe8\xcc\x18\x51\xdb\xb5\xeb\x04\xf5\xee\xe7\x41\x4b\x85\xeb\x41\x57\x3a\x25\x24\x8e\xb9\x5d\x12\xb1\x0d\x8c\x8a\xcf\x53\x3b\xab\x05\x7f\x13\xf7\xb9\x91\xfa\x15\x49\xd5\x5f\x1f\xdf\x34\x4e\x48\x3c\x72\xef\xf3\x78\xd5\x91\x9a\x4c\x5e\x59\x3c\xc0\xb5\xeb\xc7\x76\x11\x73\x6a\x2d\x22\x8a\x34\xc1\x44\x3c\xd9\xff\x5e\x9e\x78\x86\x79\xb6\x82\xff\x18\x6f\xd7\xcf\xd5\xb5\x8e\xde\xf6\x6f\x35\x43\x09\x0c\x1d\xba\x51\x89\xb6\x0d\x03\x9b\x29\xc3\xe9\xaf\xcf\xbd\x3f\x7e\xe9\x42\x1a\xe3\x34\x62\x1f\x53\x11\xfe\xa1\x21\xd3\xad\x89\x52\x6f\xb7\xcb\x43\x9f\x5a\x35\x11\xba\xaa\x7c\xd3\x3b\xc3\x28\x82\xc2\x44\xe6\xe9\xae\x1d\xb3\x4c\x57\x9e\x77\xae\x57\xef\xe1\x3f\x7f\x65\x87\xbc\x6d\x39\x55\xe2\xc3\x2b\xd6\x43\x37\x06\x67\x04\xcc\x0e\x4f\x77\xa3\x48\x38\x6c\xcd\xa5\xf6\xbe\x5d\x9c\x0f\x16\x94\xfc\x12\xad\x4e\x9b\xd1\x4e\x3d\x0a\xc9\xd4\x7d\x53\x5c\x7f\x28\xde\xaf\xf1\x3e\xa1\x66\x3c\x09\xbe\x2c\xd1\xec\xdb\xfe\x74\x66\x27\x67\xac\xa2\xba\x9e\x59\xe8\x77\x6d\x21\xf5\x7e\x97\x36\xe9\x23\x97\xe3\xaf\x99\x18\x67\x0c\x7d\xb9\x09\x2f\x4e\xeb\x8b\xec\x71\x25\x34\x48\x40\x50\xeb\x56\xb7\x33\xc3\x54\xb6\x9a\xcd\x7d\x43\xfe\x1c\xee\xae\xb9\x88\x5e\xc1\xe9\x9a\xb4\x07\xd0\xd0\x92\xea\xb9\x9b\x84\xd9\x5b\xe6\xcf\x33\xdf\xc9\xf5\x3f\xab\x76\xb6\xe9\x23\x32\x8d\xfb\x21\xcc\x3e\x47\xd8\xd3\xf9\xf6\xf0\xbe\x45\x51\x99\x33\xd0\x70\x79\xc1\x0f\xcf\x68\x59\x8d\x6d\x84\x18\xd7\x85\x65\x0a\x6f\x27\x44\xb2\xc4\xb0\xde\x7e\xbc\x68\x91\xfc\x2d\x89\xcd\x46\xef\xa4\x10\x8a\xf4\xfd\xf5\x0b\xbf\xcc\x1b\x87\x03\x56\xbb\x77\xa6\x5d\xf8\xa5\x6a\xbe\x5d\x40\x9e\x3c\xba\x37\x2e\xf5\xa2\xea\x03\x7e\x95\xdd\x87\x5b\x8c\x4c\xe0\xa1\x1d\x3a\xba\xf7\x6e\x38\x3c\x51\xb8\x63\x2c\x6c\xa0\x7d\x6a\x2e\xe3\x02\xbf\xaf\x18\x67\xb7\xc0\x0f\x4e\xad\xfc\x27\x3b\x85\xb4\x2b\x50\x14\x09\x84\xb3\xe1\x75\x21\x9a\x94\x8a\x97\xc5\x86\x97\xaf\x26\x44\x49\xec\xa6\x72\x1d\xe7\xf1\xf6\xe0\xf4\xcf\x69\x7b\x58\xca\x24\x29\x17\xb7\x12\x8c\x22\xc9\xf0\x32\x52\x9a\x53\x0a\xb4\xd3\xa6\xa9\xef\x3d\xe7\x57\x3b\x16\xfb\x4e\x25\x38\x7d\xa7\xf9\x2a\xb9\xd3\xfc\x3d\xd2\xc1\x5b\xbc\x7a\x96\xfb\x88\x28\xd2\x0c\x67\x43\x03\x13\xba\x48\x3a\xe9\x6e\x96\xee\xe7\xbb\x78\xbb\xbe\xb3\x3f\x10\x17\x58\x90\x57\xbe\x15\x11\x44\xbe\x18\x94\xd3\x6e\x7e\x34\x0f\xbe\x43\x77\xfa\xec\xe4\xfe\x1e\xa1\xb3\x72\x2d\x2e\x9a\x5a\x6e\xda\x42\xa2\x0d\xaf\x72\xae\xff\x3a\x98\x21\xbd\x61\x38\x12\x93\xe1\xc4\x0c\xc7\x43\xf6\x55\xdb\x7b\x9f\x53\xd7\xad\xf4\x43\xae\xa4\x71\xd8\xde\xd1\xae\x31\x6e\xe6\xea\x54\xa4\xf3\xa4\x72\x2b\xf3\x97\xb4\x4e\x17\xfe\xc7\xf2\x2d\x27\xfd\xa7\x2d\x07\xec\x1e\xaf\x86\x63\x98\x11\x70\xea\x8b\x5b\xc7\x01\xc6\x0b\x68\xcd\xb8\xc5\x1c\x60\x5e\x82\x3f\x6f\xc6\xab\xe8\x18\x66\x9d\x06\x7c\xd3\x00\xaf\xb6\xa3\x72\x24\xd4\x07\x7e\xf7\xe5\xb1\x70\xdd\x30\x3b\xcd\xac\xc7\x6b\xf1\xeb\x8d\x6a\x36\xab\xbc\xd9\xc9\x20\xa5\x30\x5e\x6f\x1a\xd5\xeb\x7b\x39\x4e\x39\x8a\x96\x88\x10\x1c\xdf\xa2\xc8\x1c\xcc\x74\xc5\x19\x15\x59\xe9\x68\x90\xe4\xe4\x94\x2f\x5c\x45\x27\xcc\xe8\x42\x8d\x18\x1f\xc7\xcf\x54\x32\x35\xf0\x3a\x7e\xb0\x3c\x1f\x2d\x42\x44\x11\x1f\x38\xfb\xa6\x0c\x48\x33\xac\xd0\x57\xa4\x15\x0e\xba\x24\x3e\xb8\xdd\xbb\xcb\x99\x4e\x44\x97\x93\x20\xe9\x49\x0c\x2e\x23\x1a\x92\x53\x31\x13\x51\x24\x08\xde\x47\xd5\xa7\xf8\x27\x03\x7b\xed\xae\x89\xfe\x6a\x7c\x13\x6c\xf9\xe4\xcd\xab\xc6\xfe\x24\xd7\x43\xdb\xe7\x1e\x8b\x70\x6c\x5b\x08\xfc\x51\xb3\x99\x9e\xe0\x44\x59\xab\x6e\xac\x10\x6a\xda\xfe\x35\x35\xd4\x74\xbe\xdd\x35\xb4\x72\xcf\x4d\x52\xab\x55\x32\xfb\xf6\xf2\xb6\x83\xb4\x27\x7f\xdd\x53\x15\xfe\x47\x2f\x41\x44\x63\xc1\xa9\x07\x9e\xab\x18\x66\x0e\xb0\x63\x3c\x77\x31\x8c\x0f\x38\xab\xc6\x73\x19\xc3\x04\x81\x4e\x1b\xcf\x6d\x0c\xd3\x04\x84\x28\x5c\x32\x07\x30\x1f\x81\x40\x84\xcb\xe8\x00\xa6\x06\x5c\xf1\xc2\xa5\x75\x00\xb3\x08\x30\xb8\xd4\x0e\x60\xf2\xc1\x39\x3a\x2e\xbf\x03\x98\x12\x70\x8a\x83\xcb\xf1\x00\x66\x00\xdc\xdb\xc0\x23\x7a\x18\x66\x16\xac\x0f\x1e\xd9\xc3\x30\x5d\x20\xbb\xe0\x12\x3e\x80\x89\x00\xbf\x85\x85\xcb\xfa\xfe\x60\x64\xc0\xb6\xc6\x63\x7e\xd8\x63\xa6\xc1\xa1\x14\x1e\xfb\xc3\x30\x51\xd8\x31\x3a\x1e\x0f\x44\xe5\x68\x18\xfe\x27\x85\x14\xc3\x25\x7e\xb1\x30\x85\x96\x5e\x94\xee\x55\x4c\x52\x78\x81\xf5\xd9\x1d\xe4\x79\x9f\x9f\x59\x59\x74\x9e\xb5\xba\x74\x59\x74\x9b\xbe\x97\xd9\x87\xcd\xf1\xb0\xb4\xc1\xfc\xf8\xc0\xc7\xcb\x33\x22\xf3\x29\x9d\xc9\x32\x95\x89\x34\xc4\x0e\xf2\x94\x9e\x6d\xf7\xba\xc3\x6d\xf3\xe4\x25\x38\x6d\x8f\x6b\x10\x51\x24\x09\x2e\x84\xa7\x55\xe5\x56\x7d\x52\x2b\xce\x44\x97\x29\xee\x35\x4f\xd5\xfe\xc9\xa1\xf7\x40\x88\x39\x6c\xcc\xaf\x55\x2e\xda\xd2\xd3\xa3\x7f\x94\x88\x22\x61\x70\xc6\x2b\x38\x4d\x3b\x1d\x7e\xf0\x92\x99\xd2\xa2\xab\x3d\x97\x7e\xa4\x09\x62\x2a\xcf\x54\x5a\x56\xde\x52\x3e\x5d\x70\xe4\x8e\xf6\x59\x2d\xe1\x7f\x33\x1b\x0b\x51\x31\xd0\xe5\xf0\x4c\x87\x30\x40\xd6\xc0\x33\x1f\xc3\x24\x81\x5d\x8f\xe7\x02\x86\x09\x03\x99\x0c\x97\x95\x03\x4c\x34\xf6\x53\x91\x78\xcc\x1c\x60\xe2\xc0\x5b\x8c\x47\xcf\x31\x4c\x25\x39\xa8\x75\x78\x44\x1d\x95\x53\x23\xfc\xef\xbc\x33\x09\xe6\x79\x7a\x7a\xc4\xbb\xdc\x52\x3f\x16\x78\xf8\xe6\xef\x3c\xbf\xab\xb3\xb3\x36\x47\xe5\x33\xb9\x83\x41\x42\xdc\xc5\x9c\xe9\x92\xe6\xa7\xeb\x28\x8a\xb8\xc0\xc5\xa8\x83\x43\x64\x64\x47\x51\x03\xa3\xb1\x4d\x9b\x91\x45\x84\x82\x54\xc0\xa9\x38\x5b\x75\xfa\xa4\x71\x82\xdb\xbd\xa8\xb9\x3c\xb5\x21\x14\xf9\x08\x97\x52\xfb\xbd\xc7\x8f\xd8\x2b\x2c\xfd\x90\x74\x34\x2d\x3a\x30\x44\x9f\x71\xa2\xee\x00\x67\xd9\x89\x0b\xe7\xf4\x1d\xe4\x13\xca\x6e\xe4\x2e\x13\x51\xc4\x13\xbe\x82\xfc\xf6\x7e\x01\xf3\xd0\xa7\x2b\x35\xa6\x61\x1f\xb3\x77\x28\x9f\x91\xa7\x69\xe5\xe6\xb4\xbf\xd8\x90\x53\xa1\x77\xd1\x29\x75\x52\xc6\x93\x88\x22\x45\xf0\xf1\xeb\x63\xbf\x5f\x66\x45\xa1\x2b\xc6\xe1\x73\xa2\x8e\x1b\xf9\xaf\x78\x0e\xd4\xbb\x3a\x04\xb4\xed\x5f\x31\xbb\x7f\xaa\x41\x60\x27\xa3\x89\xf0\x3f\x7a\x89\xed\x10\xf0\x82\xe3\x7a\x0a\x30\x2e\x20\xc7\xe1\xb9\x0b\xd5\x13\x90\x7c\xf0\x5c\xc6\x30\x9e\x40\xbb\xc5\x73\x1b\xc3\x14\x61\x3f\x56\x85\xd7\x9f\xa1\x72\xe4\x04\xea\xbd\x9b\x3b\xa4\x08\x4e\x26\x9f\x55\x42\xbd\x04\xd5\xee\x66\x9d\x31\x4f\x64\xe2\x7f\x48\x9c\x0b\x95\x2c\xbb\xeb\xfc\x45\x6b\x32\x27\xbb\x81\xea\xdb\xad\xe8\xc7\x44\x14\x09\x86\x05\x92\xa5\x86\xdc\x0d\x0f\x61\x47\x1e\xe9\x16\xa3\x75\x63\x4a\x1a\xcd\x55\x1e\x5f\xe3\x95\xc5\xab\xb5\x5e\xc1\xd9\x8f\x5c\xaa\x5e\xdc\x25\xa2\xc8\x30\x2c\x02\xbc\x88\x89\xe9\x16\xab\xdb\xdb\x91\x42\x67\xef\xbd\xca\x5e\xdd\x34\x50\x59\xd3\xa3\x31\xc6\x56\xee\xaf\xde\x99\x26\x52\x19\x7d\x99\x88\x22\x33\xf0\x3d\xf2\xdb\x86\x5a\x5e\xdb\x4c\x02\x02\x1a\x7f\xb5\xb2\x37\xf3\xed\x2f\xb8\x52\x69\x4e\xb9\x20\xdb\xbc\xaa\xb8\xfb\x4c\x2e\xfd\x72\x66\xbf\xf0\xbf\x99\x0d\x85\x08\x24\x12\x3c\xd3\x31\x4c\x30\xa0\x03\x78\xe6\x63\x98\x61\x50\xd6\xf0\x5c\xc0\x30\x33\xe0\xe8\x12\xb7\x5b\xc6\x92\x0f\xd8\xc2\xb8\x2d\x33\x96\x7c\x00\x25\xc2\xeb\x9b\x31\x4c\x33\x15\xf8\x1e\x00\x5e\x07\x8d\xca\xf2\x10\x7e\xff\xea\x52\x3e\x4c\x54\xa5\x1c\xab\xe2\x8c\x9d\x4b\x4a\xee\x68\x93\xb8\xea\xac\x69\x72\xee\xa9\x90\x25\x71\x74\x3b\x40\x53\xe0\xdc\xbc\xc7\xf1\x58\xc5\x9e\x4d\xff\xe1\xc6\x78\x76\xcb\xec\xb5\x05\xb7\x85\x9d\x03\x0c\x57\x58\xae\x24\xc7\xcb\xf3\xff\xf2\x1a\x78\x2f\x5b\x33\xfb\x63\xbd\xe8\x76\x88\x33\xd7\x0b\x22\x8a\xac\xc0\xe3\x5f\x05\x3d\x77\x6a\x51\x99\xbb\xd0\xfc\x25\x6f\x07\xf7\x5a\xec\x11\x09\x03\x2e\x29\x4e\x27\xde\x36\x2f\x62\xce\x43\x36\xb2\x49\x7b\x22\x8a\xbc\x83\x1b\x3c\xad\x74\xfd\x27\x85\x0b\x63\xe8\x91\xf6\x1b\xa7\x4b\xae\x95\x9f\xae\x67\x4c\x64\xb8\x42\x6d\xf0\x73\xff\x51\x65\x54\xe2\x8a\x62\xaf\xf0\xbf\x99\x0d\x11\x33\x10\x55\x3c\xd3\xa1\x15\x07\x0a\x3f\x9e\xf9\x18\x66\x05\x60\xf0\x5c\xc0\x30\xef\x40\x89\xc2\x93\x33\x20\xe2\x0c\xca\x34\xae\xa4\x01\x30\x4e\xe0\x39\xb8\xba\x06\xc0\xa0\xc0\x1f\x3c\x71\x03\xc3\x84\x93\x81\x52\x88\x27\x73\xa0\x72\x0c\x04\x6a\xfa\xcd\xed\x38\x02\xcb\x07\x41\x46\x6e\xca\x7c\xdd\xc5\x9c\xa6\x5b\xeb\x46\xb6\x58\xac\x2b\x51\x1e\xdc\x78\xfb\x79\x74\xf9\xa9\xec\x61\x59\xae\x7d\x07\x84\x82\x89\x28\x32\x01\x2b\x4c\xfb\xca\x98\xe8\x3e\xb7\xd3\x29\xa6\xdf\x16\x75\x37\xda\x33\x45\xc7\x1b\x25\xb5\x9b\xc3\x5e\xd5\xf8\x1d\x57\x7e\x48\x18\xb1\xef\xf5\x66\x6f\x0d\xd7\x2a\xb3\x55\xcd\x23\xe6\x6c\xbc\xa5\x4b\xbb\xef\x77\xf0\x87\x34\xfc\xa4\x34\x77\x34\x7d\xd0\x76\x3f\x68\x58\x97\xe9\x74\xdd\xdc\x50\x0e\x8a\x22\x4f\xe1\x3e\x51\x32\xe9\xf4\x6b\xee\x82\x7d\x83\x47\xcb\x97\xaf\x87\x94\xfb\x3e\xa7\x36\xda\x9f\xff\x64\xef\xa5\xa3\x0d\xeb\xd7\xeb\x5e\x67\x24\x1e\x44\x91\x1a\x78\xb7\x7b\x77\xd6\xee\xa1\x92\xa2\xbf\xdb\x16\xbf\x57\xd6\x4d\x31\xa9\x4f\xf5\x51\x9e\xd2\xd3\xe9\x82\x98\xc0\xab\x0e\x32\xe5\x3d\xa2\xbf\x84\xff\xcd\x4b\xa8\xc9\x07\xad\x08\x9e\xa7\x18\x66\x02\x34\xec\xb8\xde\x62\x02\x04\xb8\x5d\x84\xeb\x31\xc0\x3c\x05\xad\x22\x9e\xdb\x50\x3b\x46\x02\x76\x08\x9e\xba\x85\xca\x12\xb7\x90\xb8\x6e\x12\x2c\x58\x65\x9d\xf1\x0e\xf6\x31\xb4\xa9\x5a\xdc\x49\x43\x79\xfe\x5e\x45\xe0\xd2\x4b\x79\xce\xa4\x39\x87\x43\x1a\x23\x5d\xd5\xd7\x3e\x7d\x89\xe9\x27\xa2\x48\x1f\x5c\x09\x0b\xed\xc4\x4e\x6e\x9f\xb7\x4a\xf0\x3d\xe6\xf3\xf5\x78\x57\x9e\xc8\x27\xe6\xc6\xd6\xd7\x75\x4d\xa2\xb6\x3b\xea\xaa\xd5\x0e\x6f\x38\x13\x51\xe4\xcb\x5f\x8d\xfe\xc4\x41\x47\xd5\xa0\xe2\x4a\x85\x88\x75\xb3\xed\xcc\x3b\xed\x91\x3b\xa8\x71\x73\x71\xc8\x4c\xe8\x93\xc7\xe7\xd3\x6d\xe8\x6e\x12\x51\xa4\x17\x5e\xf1\x1f\xdb\x6d\x2e\xcf\x51\xd2\x14\xfc\xea\xbb\x7b\x29\xd4\xe7\x75\xf8\xa1\x86\x80\xd1\x93\x46\x09\x93\xdc\x3a\x13\xe6\x17\x28\xa6\x23\x36\x6b\x0e\x4c\xf3\xcb\x6d\x6b\xdd\x19\x8e\xcc\x7d\x16\x4d\x0d\xce\xe1\xd8\x75\x68\xc5\xaa\xd5\xdf\x52\x9c\x77\x4f\xe8\xe5\x1e\xf6\xb4\xbb\x96\x21\xfa\xc2\xff\xe6\x26\x44\x3f\x01\x65\xc5\x73\x15\xc3\xf4\x81\xca\x89\xe7\x2e\x86\xf9\x02\x08\x16\x9e\xcb\x18\xa6\x17\xe4\x10\x3c\xb7\xa1\x0a\xbd\x73\x61\x95\xf4\x1f\x45\x4d\x39\xee\x5e\x52\x82\x1b\x8a\x22\x13\x30\xdf\x8d\x61\x50\xdf\xe3\x73\xca\x63\xd8\x2e\x88\xf3\xc3\x5a\xe1\xf4\xf8\xa1\xfb\x1b\xa5\xc9\x69\x09\x5b\x6a\x43\x4f\xf4\x2c\x59\x7a\x91\xa2\xc8\xcc\x5f\x7f\xbf\xf9\x64\x1f\xbb\x7a\xf5\xc5\x8b\xc6\x6f\x1e\xbd\xf8\xd2\x7b\xca\x2f\x27\xc6\xd1\x73\xa9\x20\x8b\xf0\x88\x23\xd3\x7a\xbf\x55\xc2\x16\x22\x8a\x34\xfe\xf5\x83\x00\x1f\xc4\x2e\x84\xdb\xe9\x46\xcb\x7a\x98\xf8\xbd\xb9\xc3\xe7\x36\xa8\x16\x5f\x15\x21\x5e\xef\xca\x9a\xc7\xc8\x74\xc7\x72\x41\x9b\x88\x22\x69\x70\xe3\xe8\x98\x23\x19\xcd\xce\x79\x5f\x51\x4a\xdc\x9f\x36\xc3\xf9\x99\x68\x9f\xcf\xe9\x76\xcd\xf7\x63\xc9\x6f\xf2\x0b\x1c\x2a\xb2\xf4\x55\x88\x28\xf2\x09\x1e\xff\xc8\xbe\xc0\xe0\x59\xfb\xf9\x68\x83\x5f\x3b\xe8\xbe\x57\x28\x2f\xde\xa4\x67\x91\x99\x77\x73\xff\x6e\x64\x5e\xf5\x73\x8b\x2a\x31\x89\x88\x22\xaf\xe1\xf3\x21\x92\x7e\x6d\x73\xc9\x27\x86\x37\xbd\x0b\x8b\x79\xaa\x25\x1e\x1f\x92\xab\xb7\xe5\x77\x5d\x29\x64\x7a\xc2\x50\x6f\x58\xe7\xe2\x27\x49\x44\x91\x48\x78\xfe\x41\xcb\x7b\xa3\x2d\x77\x06\xa2\x66\x47\x9a\x16\xa9\x65\x19\x87\x69\x07\xcf\x67\x32\x15\x9d\x20\x2f\x7e\x6b\xbd\xa4\x14\xff\x76\x54\xf8\x1f\xa3\x88\xe5\x1b\x40\xa3\xf1\x42\x09\x55\x58\xec\x03\x59\x38\xe1\xc4\x30\x8d\xe0\x39\x78\x21\xc5\x30\x69\xa0\x5a\xe2\x85\x15\xc3\x7c\x02\x18\xbc\xd0\x62\x98\xd7\x40\x96\xc1\x0b\x2f\x86\x89\x24\xfb\x23\x97\xe0\xca\xf1\x40\x2e\x39\xf3\xe7\x31\x78\x92\x3c\xf4\xb2\xef\x58\xa8\x22\xfd\x47\x71\x5e\x96\x9a\x4c\xd5\x15\x45\x11\x1f\x38\xc5\xcd\xd3\xd7\x22\xc7\x97\x5f\x88\x88\x35\x52\x8c\xac\x7d\x68\xe4\x98\x1a\x0f\xf0\xf4\x7e\xd7\xab\x54\xfd\xc5\x9b\xcf\x40\xb4\xa3\x0b\x45\x3e\xc3\x19\xee\x96\xee\x2f\xb3\xd9\x9d\x31\xcf\xfc\x6e\x8b\x9e\x5c\xef\x16\xea\x74\x8f\x77\xd9\x3f\x9c\xa1\xa9\x20\x6d\x3a\xcf\x3e\x1a\x75\x3d\x8c\x88\x22\x3d\x30\xe3\xe3\x9f\x9c\x15\x3e\x32\x10\xef\xfb\xa8\x62\xbd\x66\xbc\xb5\x20\x56\xe1\xe0\x73\x62\x6c\x65\x52\xac\xe7\x79\xca\xe5\xc4\x4e\x17\x0b\x22\x8a\xa4\xc3\xe3\x9f\xb6\xeb\xfa\x35\xf1\x74\x9c\x54\x10\xb6\x2d\xe0\x60\x41\x27\x5e\xef\xe1\x35\x3b\x3b\x44\x59\xba\xc4\x2a\xea\x11\xd2\xb0\xe3\x1d\x11\x45\x82\x60\x4a\x51\x10\xf0\xf0\x59\x87\xb2\x5f\xca\xaa\xc3\x28\x27\x22\x74\x41\xf9\x61\xd1\x7b\x15\x02\xc5\xfb\x2d\x5f\xfc\xac\xaa\xe2\xb4\xfb\x46\x36\x73\x1b\xdc\x8d\x87\x04\x08\xd0\x54\x4a\x25\x87\x16\x3d\xf9\x71\x3f\x8c\x94\xee\xa2\xf7\x9e\xad\xf2\x2f\x2e\x45\x4a\x5e\x6a\x44\x6f\xf2\xf4\x77\x6a\x08\xff\x63\x54\x30\x49\x15\x64\x41\xbc\xd0\x40\xf5\x18\x88\x24\x78\xe1\xc1\x30\x3d\x18\xcb\xc3\x09\x11\x86\x49\x07\x18\xbc\x30\x41\x72\x2f\xe0\x24\x78\xa1\x82\xaa\x07\xe8\x87\x70\x0f\x7c\x00\x26\x10\xc4\x00\xef\xd4\x07\xc3\x24\x03\x7f\xf0\x4e\x7e\xa0\x1e\x6a\xfb\x42\x32\xd9\xff\x40\x78\x67\x40\xa8\x1c\x7d\x89\xb4\xa7\x3b\x8a\x22\x05\xf0\x96\x5f\x7a\x30\x41\x7a\x65\x3a\xd7\x7c\xe4\xf2\x1b\xc1\xd6\xae\x59\x39\x9b\xc5\xf6\x77\x1a\x2e\xaa\xa2\x1f\x9b\xae\x64\x27\xce\x64\x9d\x47\x91\x66\x78\xf8\xc7\x13\x29\xfa\xe4\xe2\x04\x72\x7f\xf5\x9f\xa3\x52\x2f\x77\xe8\xbb\x3d\x34\x9c\x47\xf3\xc3\xdd\xf4\x87\x03\x3c\x7d\xd9\xf6\x06\x12\x51\x64\x0c\xde\x91\x71\xb3\xe1\x33\xdc\xac\xf3\x84\x1c\x85\xcc\xef\xe7\x55\x53\xe6\x45\x59\xb8\xaf\xef\x3b\x38\x75\x5a\x61\x8c\x5e\xd9\x42\x7d\xdb\x66\x86\x0f\x80\x33\x3c\xb5\xc0\xd8\xcd\xf0\x87\x44\xb2\x40\x09\x52\x29\xa5\xea\x9d\x5f\xc5\x3b\x9e\x15\xad\xef\x9a\x31\xcd\x3b\xec\xf5\xbe\x4d\x9d\x9d\x96\x88\x22\xcf\x60\x29\xf1\x87\x48\xe2\xfa\xe3\xeb\x53\x64\x4e\x77\xca\xbf\x5f\x37\x37\xb2\x1e\xa8\x8f\xcb\x8b\xb3\x75\xba\xf4\xa8\xa9\x58\x2d\x7d\x63\x42\x8b\x88\x22\xbe\x30\x29\x3e\xba\xb8\x47\x8a\x10\xf8\xc6\x30\x89\xf1\x7c\x19\xe7\x30\xb5\x1d\x69\x41\xad\xe5\x3c\x99\xab\xed\x75\x76\xde\x7e\x17\x19\xfe\x4c\x22\x8a\xac\xc3\xf3\x5f\xf3\x1b\x73\xdd\xc5\x5a\x4e\x18\x18\x98\x58\x56\xea\xb4\xbf\x2b\xe0\x6a\x29\x22\x2a\x54\xfe\xa2\xc4\xe4\xe7\x45\x06\x56\xa7\x8f\x44\x14\xc9\x83\x05\xa8\x84\x72\xad\x43\xec\xfe\x43\x59\xc8\xf6\x32\xf1\xe5\x60\xef\xad\xb3\x2d\x8c\xe7\x49\x38\x2c\x8b\xbf\x1f\x90\xdb\x76\x3c\xfd\xac\x9d\xf0\x3f\x46\x1d\xac\x70\x01\xd8\x49\x78\xa1\x87\x76\x05\xc0\xe0\x85\x1f\xc3\x8c\x81\x5d\x8e\xb7\x04\x18\x26\x00\x54\x1b\xbc\x65\xc0\x30\xcf\x80\x1c\x8a\xb7\x14\x18\xc6\x17\xb0\x75\xbc\xe5\x80\x8e\xf1\xc0\x73\xf0\x96\x04\xc3\xe4\xd1\x01\xb1\x0b\xef\x98\x14\x95\xe3\xe2\x22\x70\x6f\xf6\x80\x1e\x70\x8f\xc6\x54\x2b\x46\x3c\xcb\xdc\x24\x5f\xff\x58\xc6\xfa\x49\xc1\x86\xba\x9f\x1c\xf2\xa1\xab\x2a\xb0\x24\x62\x84\x35\x67\x07\x9f\xb5\x20\x11\x45\x96\xe0\x5b\x52\xba\x46\xaf\xd3\x46\x5a\x13\xb7\xb5\x3d\x3e\xe1\xd6\xea\xdc\x15\x5f\x90\xfa\xd9\xaf\xe3\x42\xac\xe9\xb6\x69\x87\x0b\xb3\xcd\xa5\x5c\x44\x14\x89\x85\x0b\x08\x69\xc5\x89\xd0\xfd\x1c\x74\xd7\x4b\x8a\x5a\x8f\x76\xd2\x15\x53\xee\x3c\x22\x3b\x32\x5d\xfe\xaa\xae\x6e\x5e\x70\x77\xde\x0e\xf6\x85\x4d\xaa\x01\xf7\x98\x57\x55\x48\x3f\x8f\x3f\x1b\x1f\xdb\x2e\x98\xda\x89\x84\x5c\xf6\x4d\x8b\x7c\x51\x51\xbd\x97\x7a\xc4\x53\x51\xf0\x22\xcd\xcc\xe0\xb0\xf0\xbf\x99\x8d\x85\xc8\x03\x34\x5b\x78\xa6\x63\x98\x25\x70\x42\x8c\x67\x3e\x74\x66\x08\x92\x21\x9e\x0b\x10\xc9\xa2\x5a\xf0\x60\xfa\x1f\xc8\x49\x4d\x4e\xb3\x8a\xa6\x6c\xe0\xb6\x6b\x6b\x71\x6c\x79\xd7\xf3\x60\x3f\xf9\xa1\x87\x95\x46\x76\x5a\xcc\x36\xef\x4e\x89\x75\x84\xa3\x72\x1b\x1b\xeb\x1b\xbf\x3f\xc5\xe5\x03\xb7\x68\x47\x7f\x5a\xaa\x95\xbf\x71\x5a\x88\x88\x9a\xd9\xaa\xe7\x71\xfc\xd6\xfb\x9f\x2a\x14\x93\x3e\xe1\x5a\x33\x8f\x8c\x90\xdd\x0c\xb7\x66\x51\x24\x15\xce\x26\xf4\x65\x71\x6e\x69\xe7\x4f\x8e\x70\xf5\x2f\x0c\xd1\x28\x94\x7e\x92\x5d\x76\x2a\xb3\x8d\x3e\x43\x66\x6a\x56\x6b\xb7\xfb\x34\x49\x2d\x7c\xfd\x84\xcf\x29\x49\x4b\x66\xff\x2e\x6a\xea\x16\xa1\x17\x8b\x85\x74\xf7\xbf\x13\x49\x6f\x14\x77\x44\x66\xcc\x22\x1e\xc5\x56\x7c\xef\x50\x14\x99\x85\x99\x4b\xb7\x7a\x50\x40\xc9\x43\xe2\x33\xb7\xf9\x2f\x3a\x99\x36\x8a\x15\x5d\x5d\x5d\x4c\xde\x16\xfe\x23\xe9\x16\x4a\xf1\xf1\x54\x3d\x23\x28\x32\x07\x0f\xbf\xea\x78\xc7\x95\xef\xb0\x30\x23\xe5\x08\xe7\x54\xf5\x37\x0d\x73\xfb\xb4\xae\x4f\xf7\x5e\x04\xd9\x59\x71\x90\x19\x31\x1c\x38\xf0\x1c\x1a\x6a\x3b\xd8\x3a\x1a\xde\xf7\xf6\x1e\xd5\xb3\x59\xe9\xb6\xab\x11\xae\xb5\xed\x63\x69\xdf\x73\xde\x35\x22\x1b\x6c\x36\x09\xa7\x6f\xc2\x1f\x7d\x99\x73\x8b\xd3\x60\xf5\xdd\xeb\xab\xbb\xb1\xd5\xe6\xfd\xdd\x1e\x25\x96\xf5\x0f\xc2\x26\x69\xe2\x9f\xf6\xb7\x93\xb2\x8a\x5d\xbe\x5a\x89\xa2\xc8\x13\x58\x5b\x5d\xd9\xa8\x17\xc9\xa0\xcf\x2e\x37\xe6\xf3\xf2\x4d\xd6\x1b\x4d\x2c\x1a\x73\x54\x0f\x95\x24\x9d\x47\xa9\xcb\xfb\x98\x98\xdf\xeb\xa2\xc8\x4f\x38\x7c\x1d\x06\xd5\x97\x57\xf3\x97\xf3\x94\xc9\x7c\xcf\x6e\xe8\xdc\x13\x24\xd5\x93\xa9\xba\xe6\x1e\x57\xbb\x5e\x35\xeb\xca\x10\xf7\x40\xc0\x19\x45\x9c\xe1\xe4\x2a\xcc\x1d\x5f\xe6\xc9\x9f\x64\xba\x9b\x40\xc5\x9a\xa2\xda\x29\x9d\x44\x6c\x9e\x59\x94\x92\x38\x56\xc9\xa1\x90\xf5\xc8\x26\x20\x0c\x45\x8a\xe1\x7e\xb8\x45\x27\x59\xeb\x5a\x70\xcd\x92\xc2\x89\xbb\xad\xf9\x86\xb1\x51\xfe\x59\x01\xa9\x72\x2a\x9d\x87\xe2\x3d\xf3\x63\x25\xbe\x56\x7e\x41\x91\x6e\xd8\xf8\x0b\x62\xdd\x95\x83\x4b\xcb\xb3\x4a\xdf\x74\xe5\x67\xaf\xcd\xa0\x53\xc6\x13\x43\xef\xd3\x4a\x07\xad\x8a\x02\x44\x1b\xac\xc5\xbb\x37\xa9\x32\x3c\xde\x29\xe4\x64\x54\xea\xe7\xdb\x02\x2a\x02\x43\xa9\x17\x89\x3e\x24\x51\x79\xa3\x89\x8d\xbe\xda\x7b\x7e\x92\x96\x65\xc5\xd1\x88\x7a\xa1\x28\xe2\x02\x97\xce\x92\x9a\x82\x85\x03\xbb\x27\xcb\xb9\xd3\xec\xad\x7a\xc9\x04\x69\x1a\x0e\x8a\x4f\x94\x3a\x24\xb4\xe6\x86\x0e\x98\x8a\xbc\x88\x21\xa0\xc8\x38\xfc\xea\xfa\x2b\x7e\x73\x57\x76\x5c\xd9\x76\x32\x95\x6f\xcf\xd0\x4d\xdb\x40\xf2\x50\xf7\x8e\xd7\x57\xbb\x29\x8f\xad\x67\xd2\x34\xa5\xaf\xdf\x77\x46\x11\x22\x6c\x8e\x86\x98\x22\xad\x94\xb5\xea\xed\x5b\x87\xf9\xd4\x91\xf3\xec\x44\x07\xd6\xd8\x27\x5a\x1b\x12\x3f\xce\x1c\x1b\x53\x2f\x6b\x21\x50\xa2\x88\x0b\xdc\x0a\xbe\x50\x0b\x2c\xf2\x15\x74\xad\xbd\xf0\x60\x28\x32\x28\x75\xa1\x77\xe4\x35\xcd\x89\x9f\x24\x07\xe7\x73\x25\xbd\xde\x9e\xde\x95\xef\x81\x22\x43\xf0\x52\x19\x39\x18\x0d\x74\xb0\xac\x6c\xa3\x68\xf0\xad\xf3\x0c\xd8\x1b\xd5\xaf\xbc\x5d\xfc\xf5\xd2\xc2\x94\xaa\xe4\xc7\xb0\xaa\x7d\x52\x09\x28\x8a\x38\xc3\x9d\xe9\x56\x21\xfe\xd7\x9e\xd7\x92\xc7\x5b\x2d\x86\xda\xfb\x4e\x4d\x25\x48\x5b\x07\xcd\xbc\xd2\x71\x9c\x53\x20\x52\x9b\xb7\x53\x0a\x73\xa0\x48\x23\x9c\x37\x4f\x3c\x1a\x15\xf4\xeb\x77\x79\x9c\x55\x25\x53\xbd\xf4\xf4\xb0\xfe\xf2\x9e\x60\x59\x0a\x7a\xe9\x77\xe4\x35\x5c\x56\x0a\xc5\x16\xea\x28\x8a\x14\xc3\x3b\xa1\xf3\xcb\x27\x87\x1b\x7c\xd6\x2c\x7c\x87\x6c\x63\xfa\xa4\xd8\xb7\x7b\x3e\xbb\x54\xa8\x58\xa7\xbd\x85\xdd\xf7\x84\x0e\xed\xe5\x34\x5d\x14\x99\x84\x43\xdf\xa7\x75\x5d\xd3\xe7\x85\x75\x6c\x8b\xcd\x55\x63\xfb\x79\xcf\xe9\xa1\x43\x72\xa1\xc1\x01\xfb\x72\x7f\xe6\xd3\x9e\x63\xa3\xee\xf4\x86\x86\xa2\xde\x36\xbd\x3b\x2a\xf3\x5e\x24\xf5\x85\x48\x7a\x04\xb0\xb8\x4b\x0d\x0c\x4e\x2b\x1c\x7c\x90\x30\xfc\x6e\x7f\x8d\x12\x4b\x73\x1c\x34\x54\x41\x44\xe2\x22\x35\x15\xa5\xd1\xbe\x0a\x83\xb4\x73\x94\xb7\xaa\xb6\xbd\xed\x29\xd0\xdf\x97\xb3\x6d\xf4\x2e\x55\x8f\xa5\xfc\x4c\x9b\x33\x8a\xa4\xc1\xc9\xbe\x7c\x40\x56\xa8\xe0\x6d\xd2\x5a\x6f\xc2\xd7\xec\x86\xf6\x33\xcc\x2c\xdf\x93\x0d\x09\xfc\x73\x81\xcc\x3d\x01\x45\x6e\x5e\xd7\x4b\x50\xa4\x15\x3e\xd8\xc8\x5b\xea\xcd\xea\xe1\x22\xae\xbe\xff\x78\xb8\xae\xff\xdc\xf7\xc7\xb9\x7b\xcd\x5b\x4e\x24\xcc\xf1\x45\x7f\x88\x88\x2e\xa3\x57\xf1\x43\x91\x61\x78\x76\x09\x34\x34\xe7\xfb\x8b\xef\xee\xed\x41\x4b\xbd\xce\xd7\x7f\xdc\xff\x8a\x46\xbe\x14\x33\xe8\x3a\x76\x5c\xbb\x33\xea\xd5\x34\x93\xcf\x66\xed\x85\xdf\x0e\x16\x9a\xf2\x95\xc2\xe2\xba\x46\xd1\x2a\xae\x01\xe7\x18\xcd\x98\x61\xf2\x7d\xeb\xd4\x87\x6b\x86\x4c\x32\x1c\x57\x2f\x31\x64\x9e\xdd\xec\x74\xe1\xf1\xc2\x9a\xc7\x6f\xd1\xf0\x27\x5a\x5d\xae\x3a\xa5\xca\x92\x34\x68\xde\x30\x7e\x4d\x5d\xfd\x35\x65\xe7\xa5\x89\x81\xb0\xfc\x90\x62\x75\x14\x95\xd1\x82\x86\x1b\xcf\x3f\x72\xee\x0d\xef\xab\xdf\xcb\xaa\xd1\x42\xeb\xe0\x54\x2b\x63\x16\xc1\x3c\x17\x77\x4c\x62\x67\xff\xb9\x13\x3f\xce\x6c\x38\xa1\xc8\x1c\xbc\xdb\x35\xbf\xe4\x6e\x21\x33\x5b\x75\x6a\x09\x3e\xfd\xf4\xd3\xec\xce\x13\x93\xd5\x4a\x93\x17\xfc\x1e\x1f\x1b\xf7\x47\x46\x66\xdf\x5e\xba\x89\xa2\xc8\x73\x98\x97\xe9\x29\xfb\x1d\xfa\x29\x46\xe8\x62\x7f\xa6\xac\x2b\xdd\x94\x4b\x3e\xbd\xff\xb3\x1e\xe1\x5c\xf0\x99\x3b\x35\x9a\x02\x13\x0d\x39\x15\x28\x52\x09\xef\x97\xf8\xcb\x7e\xba\x0c\x01\xfe\xdb\x02\xe5\xf7\xdc\x70\x5a\xbd\xab\x4e\x66\xe6\xea\x76\xc5\x3b\xf5\x3a\x2f\xdf\x86\xf1\x2f\xd2\x2f\x87\x50\x14\xc9\x80\x69\xa8\xee\xea\xfa\x58\x73\xcd\x12\x89\x78\x9e\x12\xdb\x18\xbb\x47\x77\x85\x29\x5a\xd6\x10\xd2\xd6\x99\x2f\xea\xa6\xa1\x2f\x5a\x90\x8f\x22\x4d\x70\xd9\xb8\xf8\x8e\x9b\xdc\x27\x5f\xa8\x4a\x73\xf5\xe2\xa9\x96\x58\xe2\x02\xe9\xb7\x0f\x97\xee\x9c\x3b\x17\x30\x62\x7d\x23\x2f\xfe\x8b\x66\x82\x33\x8a\x94\xc0\xca\xde\x03\x49\x9e\xa4\x5f\x9e\x63\xb4\x1c\xab\x86\xee\xa3\xb9\x9f\x4d\x84\xe9\x19\xf7\x4e\x5e\x39\x1a\x6e\xb6\x56\xc0\xf5\xca\x82\x2a\x06\x45\x2a\xe0\x7b\xab\x31\xfa\x49\xea\xbf\xac\xaf\xbc\xdd\xaa\x54\xfa\xc0\xe7\xbe\x17\x41\xb3\x91\x64\xb5\x6b\x60\x87\xcf\x72\x66\x62\x4f\xc5\x8d\xe6\x3e\x14\x99\x84\x67\x6f\xd9\xed\xe8\x73\xc3\x66\x59\x85\xf1\x4e\x9a\xfa\xb1\xca\xca\xb3\x99\xb3\xbb\x1e\xee\xa1\x3b\x5f\xde\x9d\xf2\x6a\xf6\x9a\xf9\x0e\x7b\x68\x28\xb9\xdc\x5c\xaf\xb4\xa4\x95\xc6\x62\xd3\x2e\xb6\xe3\x24\xdc\x97\xa5\x9f\x97\x97\xdb\x88\x47\x6a\x3d\xfa\xfe\x8b\xa6\x5a\xce\x55\x1f\x45\x11\x5f\x78\x4f\x66\xfb\x0e\x1f\x66\xb6\x6e\x63\xcb\x52\xe8\xb6\x7a\x7c\xfa\x87\xf1\xf5\x2e\x81\xaa\x9c\x45\xfb\x80\x8d\x1d\xfb\xaf\x44\x30\x5f\x09\x41\x91\x08\x38\xc9\x38\x3c\xd9\x6b\x28\x98\xab\xbb\x5f\xb8\xd6\xf4\xb9\x97\x77\xfe\xcd\x12\x92\xe7\x76\xca\x1d\xaf\x49\xbe\xef\xd3\xa2\xac\x90\x2b\xdd\xdc\x93\xaf\xe0\x2c\xc3\xe5\xb0\xff\xf3\x25\xbd\xaa\x70\xda\x39\xbb\x01\x41\x15\x85\x00\x34\x53\x2f\x3c\x39\x2e\xf9\xa8\xf6\x61\xaf\x23\xdd\x39\x7d\x11\x70\x69\x2a\x1f\x9d\x78\xee\x93\xbc\x5d\xaa\xe1\x6c\x56\xdc\x29\x4d\x66\xfe\xfc\x19\xdb\xeb\x9a\x6c\xbc\xe9\xba\x24\x7d\x0d\x51\x86\xb3\x44\x14\x19\x80\x5f\x8f\xdd\x56\xe7\x3c\x47\x35\xfc\xc8\x56\x3c\xba\x77\x32\xb9\xab\x90\xb3\xf8\x97\x3e\x8b\x36\xfa\xf1\xf2\xe7\x82\xf0\xa7\x0f\x9c\xdb\xe6\x9c\x51\x24\x08\x6e\x5c\xac\x03\x8f\x51\x1c\xeb\x7d\xee\x4a\xd9\x66\x76\xf9\x6a\xb5\x21\x8d\xae\x43\xac\x74\x09\xe7\xd9\x04\xb2\xed\x2f\x7e\x90\xbd\x4e\xf1\x41\x91\x04\x78\xc3\xbc\x8d\xed\x25\xb2\xce\x88\xd4\x2f\x78\xdd\xb5\xf1\xa6\xf2\x2a\x0f\x78\x2e\x34\xe9\x1e\x99\x4f\xc5\x79\x8a\xf8\x5a\x8f\xe1\x20\x2d\x8a\x14\xc0\x1b\x66\x77\xd1\xe4\x05\x3d\xa6\x52\x0b\xda\x93\x8b\x0f\x0a\x27\xf5\x58\xc9\x07\xa5\xf8\x69\x4f\x9d\xc9\x5f\x1e\xb4\x0e\x95\xbb\x2d\x9f\x88\xa2\x48\x12\x9c\xdc\xa5\xcf\x3b\x66\x2f\xd8\xec\xd2\xf6\xb6\xf9\xee\x47\x53\xf2\xe0\x64\xa2\x85\xe1\x60\xe8\x5a\xa1\x9d\x79\x48\xe6\xf1\x01\x09\xc1\x48\x14\x29\x81\xb7\x7b\xde\x8f\x2f\x9c\x45\x0c\xe7\x88\xc2\x4d\x26\xf9\xc4\x69\x1a\xae\x63\x1e\x27\x97\x3c\xb2\x6e\x4d\x3d\x57\xbf\x4c\x13\x67\x64\x55\x0e\x0d\x1d\x3e\x24\x9d\x67\x24\xce\x2a\xdc\xe3\x4d\xbd\xac\x50\x7f\xce\xfb\x53\x79\x66\xd7\x59\xe2\xe5\xa6\x99\x8d\x8a\x9c\x69\xa7\x8b\x5f\xa0\xa1\x6e\x94\x5e\xf7\xcb\x8f\x75\xc9\x8c\xec\x5c\x66\x7b\xd7\xc1\x70\x79\x67\x7a\xba\xc6\xf5\xf7\x83\xe7\xf5\x42\x2e\xbd\xdf\x3f\x75\x95\xd3\x19\x95\xd9\x03\x73\xd5\xf7\xf3\x12\x8d\x17\x2c\x14\x0c\xe9\x74\x1c\xde\xc6\xeb\xe9\xd4\xde\x2d\x52\xcc\x97\x60\x57\xf0\xad\x5d\x2d\x8a\x56\xe4\x56\x44\x91\x0c\x78\x93\x9b\x64\x1f\x18\xbf\xb3\x36\x7e\xe8\x8e\x41\xb6\xfe\xd8\x0f\xbe\x06\xa9\xcc\x78\xea\x32\x92\xf4\xc5\x0c\x73\x4e\x67\xfb\xd6\x2e\x2b\x14\x69\x81\x5d\xf4\xf8\x60\xa8\xaf\x29\xbc\x18\x46\x41\xc2\x75\x89\x76\x34\x40\x58\x9a\x68\xe3\x66\x24\x44\x91\x71\x7e\xa3\xf7\x33\x93\x43\xae\xb5\xf0\x3f\x12\x3a\x39\xa7\x3f\x52\x07\x10\xa3\xf1\x58\x1d\x86\x49\x25\x07\x47\x98\xb8\xfc\x4e\x96\x9b\xf4\xf7\x2f\x2a\x64\xc3\x02\xa8\x88\x76\xca\x4d\x74\x6e\xaf\x44\xfc\xe9\xcf\xea\x29\x0a\x9e\xca\x4f\xe4\x22\xab\x25\xa8\x12\x75\x64\xce\x49\x4d\xc4\x58\xa9\x16\x10\x51\xc4\x1f\x2e\xab\x82\x71\x07\xea\x9b\x8a\xcc\x46\xdf\x96\xf6\x3e\x48\x9b\x28\xa0\xd0\x08\x5b\x65\x35\xf3\xae\x51\xed\xa3\xd8\x90\xd3\x2b\xda\x47\x20\xa2\x48\x34\x9c\x56\xcf\xb5\x93\x36\xb7\x59\x97\xc9\x50\xd8\x34\x51\x72\x77\x91\x3b\x88\xb7\xbe\x0c\x95\x1a\xd9\xee\x95\xdc\xf6\x70\xc0\xdb\xfb\x88\x25\x11\x45\x2a\xe0\x24\xef\xf0\xeb\x1e\x5f\xb3\xbf\x66\x80\x01\xe7\xf6\x99\x7a\x77\x92\x54\x23\x79\xa9\xb8\x57\x16\x5e\x0c\x43\x81\x47\x6d\x76\xe7\x52\x29\x09\xff\x9b\xd9\x58\x84\xb2\x81\xb8\x88\x67\x3a\x86\xf1\x07\x02\x2b\x9e\xf9\x18\x26\x1a\x1c\x1c\xe1\xb9\x80\x61\x2a\xc0\xb1\x00\x2e\xd9\x06\x98\x59\x20\x88\xe1\x31\x6e\x0c\x33\x47\x02\xda\x4a\x3c\xee\x8d\xca\x71\x91\x32\xff\xbe\xc0\xe5\x0a\xe7\x51\x96\x00\xea\xf8\x01\x5e\x9d\xb7\x8a\x03\xf5\xa7\xcf\xf7\x0f\x78\x51\x27\xf5\xb1\xe8\xf4\x3e\xda\xbe\x12\x4b\x74\x8d\x5a\x8b\x9f\x24\xa2\x08\x0a\x57\xc7\x6e\x85\x69\x91\x29\x26\x16\xfd\x90\x6d\xef\x2d\x94\x46\x49\x4f\x92\x39\xcb\x9e\x59\x54\xda\xab\xa2\xfd\x84\xa7\xd3\xcb\xf5\x65\x20\x11\x45\xa6\xe1\xf1\x61\xb6\x6a\xdb\x3d\xc9\xb6\xb1\x49\x50\xbe\x92\xf2\x22\x89\xd5\x4b\x28\xe2\xbc\xcf\xb1\xc5\xaa\xf4\x51\xb0\xaa\x96\x49\x4f\x8a\x34\x11\x45\x26\x60\xba\x76\xcd\xc8\xec\x17\x43\xe2\x89\x85\x48\xd2\xe4\x1b\xba\x5e\x2d\xe4\x3a\xe6\x3b\x07\x82\x73\xe7\x93\xbe\xb6\x28\x14\x13\xd8\x0b\xc6\x85\xff\xcd\x6c\x2c\x44\xae\x40\x1f\xc7\x33\x1d\xc3\xa0\xa0\xc3\xc7\x33\x1f\xc3\x4c\x03\x0c\x9e\x0b\x18\x66\x82\x11\x9c\xfb\xe1\xf6\x43\x72\xd4\xa4\x24\xbf\x4f\x86\x27\xe1\xda\xd3\x3f\x9a\x74\x34\x88\xf1\xd6\xc4\x29\xb6\x49\xa9\xc7\x5b\xb4\x25\x34\x44\x7a\xf9\xda\x4e\xdf\x41\x16\x42\x7a\x2b\xcd\x1f\xc6\xad\x10\x51\xa4\x1c\x1e\x2f\x63\xce\x5e\xdb\x7c\x99\x2d\xf1\x86\x70\xe4\xe5\x54\xc9\xfd\xed\x46\x96\xb4\x81\xe9\xf9\x89\x99\xcc\x12\xf5\xaa\x19\x4e\xd9\x32\x9b\x6d\x17\x5c\xab\x1c\xd7\xf5\x2c\x9e\xdc\x1c\x6d\x7d\xf3\xcd\xcf\x95\x9a\x66\xea\x3a\xaf\xee\xee\xf6\x1d\x9d\x4a\x8d\xc5\xe9\x49\x11\x62\x75\xaf\x7d\x50\x24\x12\x2e\x26\x23\x63\x9e\x35\xf5\x46\x93\x0f\x07\xd6\xa8\xad\xb4\x8c\x77\xc6\x92\xf2\xb1\x48\xb3\x84\xe6\xca\xc8\x08\x72\x0f\x27\x31\xb6\xdd\xdf\xf4\x19\x36\xe7\x64\x22\xb7\x01\x69\x47\xac\x40\x69\x49\xc9\x05\xa6\xb8\x8e\xad\xad\x39\x72\xa3\x1d\xab\xca\x62\xbe\x5c\x97\xb4\xe2\x38\x27\xed\x85\xff\xcd\x4b\x2c\xa2\x93\x40\x10\xc0\xf5\x14\x60\xca\x01\x06\xd7\x5b\x80\x79\x02\x34\x2d\x3c\x97\x31\x4c\x24\xb8\x31\x83\xe7\x36\xb4\x43\x80\x6d\xb8\x0d\x30\x66\x1b\x78\x0e\x5e\x17\x8c\x61\x7e\x02\x1d\x0c\xb7\x13\x06\x18\x67\x70\xe9\x0b\xb7\x1d\x06\x98\x62\x90\x18\xf1\x7a\x62\x0c\xd3\x0d\xfc\xc1\xed\x8b\x01\xe6\x35\xc0\xe0\xf6\xc6\x00\xe3\x02\xb4\x4d\xbc\x06\x19\xc3\x8c\x83\xe2\x80\xdb\x24\x03\x0c\x11\xd8\x86\xdb\x29\x63\xb6\x81\x2c\x86\xdb\x2e\x03\xcc\x10\x58\x53\xdc\x96\x19\x5b\x53\x50\x20\x71\xfb\x66\x80\x69\x04\xc2\x1d\x6e\xef\x8c\xed\x03\xb0\x77\xf0\x1a\x68\xe8\xdd\xde\xb9\xd0\x45\xf6\x6f\xad\x34\x2a\x57\xa2\x1a\x45\xe1\x41\x44\x91\x32\x58\xca\x0a\x52\xf8\xf1\x54\x44\x73\x2c\xc7\x7e\x9c\xeb\xe8\x92\x23\x73\xf6\xf8\x0c\xc5\x99\x16\xaf\xa0\x60\x25\xed\x0d\xa9\x33\x9c\x9e\x3d\x9b\xd5\x1e\x2e\x5e\x87\x6f\x3f\xae\xb8\x51\x5d\xb2\xc6\x3c\x7b\x96\xe9\xe4\x06\x87\xe3\x8b\xd7\x49\xa9\xc7\x8f\x73\xac\xf0\xde\x0a\x39\x5e\xa0\x70\x24\x64\x73\xfc\x5f\xcd\x17\x83\xcd\x9d\x58\x36\xda\x9d\x09\x92\xfd\xbb\x8f\xda\x7b\x85\xac\xd3\xfa\xa6\x32\xc6\x7d\x30\xa7\x52\xb4\x8a\x62\x10\x62\x54\x23\xa2\x48\x0a\x6c\x4f\xfd\x4e\x2e\xe5\x5d\xf5\x3c\x8c\xaa\xa4\xe1\x77\xd3\xd8\xb4\x5b\x4c\x63\x8f\x1c\x1d\xcb\xd9\x6f\x48\x5a\x25\xd2\xb5\xbe\x76\x48\x72\x73\x3c\x9c\x2e\xeb\x5f\x3a\x4c\xbd\x16\x90\x62\x09\xed\xbb\x13\x1f\x92\x14\xea\xd8\xaa\xfa\x79\x55\x21\x3a\x8e\x81\x64\x9b\xc6\x16\xd7\xc7\x2e\xe1\x44\x14\xf9\x08\x8b\x13\x33\xe2\x41\x8f\x14\xad\xf6\x50\x95\x36\x7e\x4e\x6a\xe5\x6c\x4e\xf3\x71\x0e\xfa\x6e\x13\x65\xfa\x49\x36\x2b\x11\x2d\x52\xa6\x31\x24\xa2\x48\x04\xdc\x24\x45\x07\xf2\x95\x1a\x96\x0d\xab\xf2\x5d\x11\xf3\xa4\x41\x6b\xbc\xc7\x75\xda\xbc\xc2\x3d\x23\x19\xee\x25\xb7\xa5\x2a\xaa\x79\xe7\xa1\x28\xe2\x02\xfb\x1b\xfb\xfa\x8e\x0b\x53\xee\xd7\x03\x3b\x9f\xdf\x75\xbb\xdf\x20\xad\xeb\xaa\xa0\x93\x11\x6e\xd3\x36\xc1\x7f\xe5\x94\xe9\x60\x87\x5c\x37\x8a\x14\xc0\x3c\x3c\xff\x5a\x91\x66\x4e\x51\xe2\x47\x2b\x3f\x17\xf7\x3d\xc7\x1e\x9d\x6c\x4e\x71\x8a\xec\x6d\x39\xdf\x7b\xca\xc1\xd2\x31\x6a\xe9\x30\x51\xf8\xdf\x56\x09\xdb\x11\x65\x80\x32\xe1\xad\x14\x44\xe7\x40\x9d\xc6\x5b\x2d\x08\x03\x6e\x86\xe0\xad\x18\x86\x49\x01\xb6\xe1\xad\x1a\x84\x01\xd9\x1e\x6f\xe5\x30\xcc\x47\x90\xb5\x70\x57\x0f\x60\x22\x40\x66\xc0\x5d\x41\x2c\x03\x81\x18\xe0\x2d\x23\x86\x29\xd8\x0a\x3e\x55\x83\xa7\x68\xa1\x72\x5b\xa8\xa9\x49\x5d\x37\xcb\x17\xdc\xcd\xd2\x96\x6c\x3f\x96\x5b\xcf\xf5\xd4\xf6\xb8\xf8\x44\x56\x6a\xeb\x9d\x07\x19\x67\xcb\x15\xe9\x76\x4b\xd7\x1b\x50\x66\xcb\x2d\x38\xab\x6f\xa6\x53\x78\x07\x2f\x73\xf0\x64\x04\x71\xb3\x91\x5a\xc4\x28\x0e\x4f\xc4\x97\xd8\x0b\xbc\xb7\x55\x54\xe9\x39\x45\xb1\x48\x72\x76\x61\x3d\xf1\x92\xe2\x66\x37\xf6\xd7\x97\x48\x72\x88\x86\x81\xfd\x65\x62\xcf\x44\x8d\x85\xc3\xd2\x68\xe2\x05\x3c\xbe\x7b\x39\x75\x72\xbd\x91\xba\x53\x7e\xed\x33\x2d\x97\xd2\x66\xda\x81\xbb\x9e\xc7\xdd\x97\x24\x6e\x5c\x1d\xf3\xb9\xd3\x90\xdf\x9b\xa4\x90\x45\xe5\x28\xfc\x81\xfd\xd3\x57\xe2\xe8\xb8\x1b\x8d\x0e\xd7\x91\x42\x16\x22\x8a\xf8\xc2\xf4\x7a\xc0\xf6\x1c\x3d\xa2\x1d\x7e\x5b\x38\x95\xa1\xf2\x8c\x73\xc1\x52\xe5\xcf\x99\x55\x07\x23\x3a\x0e\xb3\x28\x07\x95\x94\x0d\x23\x4b\xe1\x7f\x73\x13\x2a\xee\xa0\x97\xc4\x73\x15\x2a\x38\x60\xb9\xf1\xdc\x85\x7a\x56\xb0\x15\xf1\x5c\x86\x12\x34\x28\x86\x78\x6e\x63\x18\x5f\x50\xd8\x70\x35\x4c\x80\x49\x03\xb6\xe1\x0a\x99\x00\xd3\x0a\xae\x38\xe3\xa9\x99\x18\x66\x18\x3c\x07\x4f\xd1\xc4\x30\xcf\x00\xc1\xc1\x55\x35\x01\x66\x66\xfb\x9f\x2b\x2f\xb8\xd2\xe6\x1f\x8c\x8c\xd6\x9f\xc7\xe0\xca\x9b\x58\xb3\x08\x96\x07\x57\xe2\x04\x98\xe7\x20\x5b\xe2\xea\x9c\x00\x53\x09\x6a\x3b\xae\xd6\x09\x30\x19\xe0\xbc\x17\x4f\xf0\xc4\x30\x4d\xe0\x55\xc0\x15\x3d\x01\xa6\x04\x64\x31\x5c\xe5\x13\x6b\xe6\xc1\x67\x2e\xf0\xe4\x4f\xe8\x55\xa0\x01\x8d\x39\xae\x10\x2a\xe7\x42\x20\x20\x9b\x9d\x5d\x2e\x9c\x39\x6e\x28\xbe\xb0\x3e\x71\x24\xee\xfd\xb3\xd5\x24\x79\x2d\x1e\x6d\xde\x0b\xaa\x6b\xb3\x8c\x21\xc5\xa9\xb9\x43\xa7\x5a\xce\x1f\xfa\x18\x44\x44\x91\x6a\x38\x33\xa9\x88\xb2\x29\x0e\x4f\xeb\xaf\x36\x17\x38\x4d\x85\xbc\xbe\x73\x66\x51\xb5\xcb\x57\xe8\x11\xd5\xe9\xb6\x77\x0c\xdb\x8f\x0e\x1c\x3e\x45\x44\x91\x66\x58\x56\xdc\x47\xf9\xd2\xd3\xfb\x95\xbf\xb6\x22\xa3\x7d\x3b\xb1\x7b\x7f\xa6\xa3\x1c\x99\xc8\x8d\xee\xe6\xa6\x1f\x55\xde\x36\x8e\x39\xf4\x39\x9b\xef\x26\xac\x0f\xe9\x5d\x78\x7d\x34\xd3\xf5\xd2\xa0\x4c\xe1\x59\xd3\xf4\xb9\x6e\x93\x4b\x19\x67\x06\x75\x04\x1e\x2b\x19\x9c\xac\x74\x2a\x59\xc9\x08\x11\xfe\x37\xb3\xb1\x10\xe5\x82\x37\x1f\xcf\x74\x0c\x53\x0d\xb6\x30\x9e\xf9\x18\xa6\x19\x6c\x2d\x3c\x17\xa0\xac\x04\x68\x30\xae\x2c\x8d\x61\x40\x86\xc1\xd3\xa6\xa1\x42\x0c\x62\x80\xa7\x4f\x63\x98\x57\xe4\x60\x6b\xe1\x29\xd5\xa8\x9c\x02\x29\xe9\x6f\xcd\xa7\x00\xbe\xfb\xb5\x24\x4e\xa6\x4c\x10\x7b\xba\x73\xf2\x0a\x95\xca\xad\x81\xd8\xdb\x3a\x2f\xb9\xae\xab\x33\xeb\xad\x97\x6a\x7e\xb0\xd5\x14\xba\x7f\x81\x88\x22\x9d\x7f\xdd\x05\x55\x5d\x2e\x6e\x8a\xb8\xd3\xf5\x66\x51\x39\xe4\xfc\x69\xc7\x5f\xd3\xbd\xf2\x1f\x8f\x70\xbe\x3c\xef\x25\x8f\x92\x9e\x8b\xd2\x60\x22\xa2\x48\x26\x4c\x6b\xdd\xb7\x1f\x4f\xef\xcf\x52\x15\xfa\xca\xae\x24\x5b\xa6\x3f\x76\x42\xe5\x62\x4c\xc1\x3b\xbd\xa9\x01\xc1\xf7\xd9\x4e\xd5\x22\xea\xbc\x44\x14\x69\x83\x79\x21\x4f\xe4\x62\xc2\x92\xec\xb8\xc0\xf5\xfb\xa7\x52\x48\xbe\x19\x79\x6d\xa8\x4c\xd1\xd7\x95\xed\xcb\xcd\xd4\xfc\xb6\x76\x97\xb4\xbe\x44\xf8\xdf\xcc\x86\x78\x07\xb8\x8b\x85\x67\x3a\x86\xe9\x04\x4b\x8e\x67\x3e\x86\xc9\x04\x1c\x0f\xcf\x05\x0c\xd3\x06\xb2\x09\xde\xb9\x01\x86\x19\x00\x85\x08\xf7\xec\x00\x60\x82\x80\x42\x81\x7b\x80\x00\x30\x09\xe0\x55\xc1\x3d\x45\xc0\x62\x0d\xb2\x30\xee\x49\x02\xc0\x24\x81\x0e\x18\xef\x38\x01\xca\xdc\x74\x40\x2b\xc3\x3b\x58\x40\x65\x49\x51\x8f\x4d\x2a\xe9\x03\x37\x2b\xe7\x16\xde\xaf\x14\xf3\x55\xf0\x5a\x93\xb4\x1d\x50\xd9\x77\x8f\xaf\x52\x45\xf3\x66\xea\x1b\xee\x29\xce\x5f\x4f\x90\xc7\x5f\x76\x9b\x11\x51\x24\x1e\x96\xbe\x4a\x8a\x8d\x93\x4c\xf7\x3c\x76\x0b\x31\xe0\x8b\xa8\x5f\x08\xbd\xc2\xd8\x30\xcd\xac\xc8\xba\x0f\x6d\x9c\x2b\xe7\xd7\x36\x9c\x91\x20\xa2\xc8\x22\x7c\x80\x55\x9f\x36\x5f\xa3\x58\x7f\x9f\xe7\x74\xa1\x9f\x4a\xb1\xe0\x92\xe3\xbe\x9a\x69\xfe\xad\x12\xb1\xa6\xb9\xf3\xc2\x0c\x77\xbf\xdb\x66\x12\x51\xa4\x1b\xa6\x9e\x5f\x8b\x24\x95\x47\xa8\x74\xc3\x2d\x8d\xb3\xf2\x1b\x52\x9d\xeb\x98\x69\x75\x7d\xef\x46\xa9\x9f\x38\x4c\x16\xd5\xbe\x78\x9b\x6b\xf3\x2d\x5c\x82\x8f\x25\xd6\xc8\x69\xac\xeb\x35\x4d\x0e\xad\x1d\x18\x2e\xb3\x8a\x6b\x96\x25\x09\xa2\x5d\xf5\x0f\xa1\xf2\x7c\xf3\x6c\x32\x34\x84\x71\x5f\x91\xf0\xbf\xb9\x09\x51\x3c\x50\x0b\xf1\x5c\xc5\x30\xf1\x60\x57\xe1\xb9\x8b\x61\x16\x41\x62\xc4\x73\x19\xd2\x7c\xc0\x8e\xc7\x73\x1b\xc3\x2c\xd1\x2d\x8c\xfd\x5f\x62\xc4\x3b\x4f\x42\x11\x6e\x7a\x67\x22\x8a\xbc\x85\x17\x30\xe2\xba\xf8\xca\x11\xb5\x30\x37\x9a\x53\xcc\x37\xa4\x0b\x6a\x87\xcf\xca\xa9\xe8\xb4\x25\x6d\x51\xd4\x7a\x25\x64\xc0\x7a\x4e\x3d\x79\x33\xf7\xc2\x27\x1a\xe7\x87\x92\x4e\x87\xae\xdd\x6e\xcd\x9d\xdd\xcd\xfb\xc9\x2d\x74\x07\xf7\xe7\xc3\xc1\x1e\x2c\x6b\xf6\x6f\xef\x71\x79\x96\xf4\x71\xb2\xa3\x28\x52\x01\x9f\xc8\x04\x93\xdb\xd7\x98\xa9\xd1\xba\xe7\x5f\xbd\x79\xd7\xd2\x79\xfc\x64\xcb\xd5\xd5\xee\xcf\xd4\xbc\x69\x9c\x64\x61\x41\xed\x37\x7d\xd2\x51\xa4\x17\x1e\xee\x15\xdb\x32\xf3\xfe\x30\x09\xa5\x2b\x7d\xd0\x09\xdd\xb8\xc2\xc2\xea\x0e\xb4\xce\x91\xd4\xe9\x0a\x9f\x42\xb2\xbd\x7b\x58\x6e\x96\xf0\xbf\x59\x8d\xc5\xe7\x2d\x58\x07\x5c\xcb\xb1\x62\x03\xe8\x2c\xae\xf5\x18\x5f\x02\x07\x33\x78\x2e\x60\x98\x5e\xd2\x3f\x14\x18\xf7\x6c\x0f\x50\xe0\x3d\x7f\x1e\x83\x7b\xbe\x87\xd1\x4c\x90\x7c\xf1\x0e\xf9\x30\x4c\x0b\xdd\x02\x17\x89\x06\x61\x9b\xa1\xf1\x1d\x41\x51\x41\x33\x9b\x3b\xd6\xc6\xf7\x8c\x8d\xfe\xfe\x3f\xdd\xff\xa3\xfc\x26\x9c\xf2\xcf\xf2\x90\xab\xd3\xc4\x74\x9e\x81\xe7\xc3\xcc\x6c\x0d\xdf\xcf\x3c\x56\x44\xae\xcc\x21\x39\x05\xf4\x2d\x61\x1b\xee\x44\x84\x60\x42\x42\x90\x26\x10\xa0\x75\x66\x5e\x37\xa9\xbe\x1e\x1b\x6b\x4a\x27\x76\x4a\x51\xdc\x37\xfe\x3c\x51\x60\xee\x4b\xb8\x9a\x93\xaa\x5f\x84\xfd\x57\x6a\x0d\x2f\x3a\x66\x12\x0d\x02\xcd\xff\x1e\x67\x6c\x6e\x6c\x8d\xfd\xd7\x8d\xff\xe1\xc5\xf4\x58\xab\x68\x7b\x5d\xc7\x3e\x2e\x5f\x3b\x7d\xba\xec\xe2\xdb\x1b\x1a\x45\x41\x1c\x34\x49\x45\x27\x7d\xa5\x0c\xef\xd0\x78\x75\x38\x43\xcf\x0a\x97\xc8\xad\x4c\xaf\x2f\xab\xac\x9c\xe2\x25\x69\x3c\x3e\xce\x1a\x7b\x7e\xff\xe7\x05\x71\x16\x2b\xfb\x77\xb5\xf5\x07\x22\x8c\xa2\x59\xc8\xa6\xee\xdc\xb0\xb1\xb6\xbe\x75\xd7\xf0\xce\x7d\xf3\x5b\xd6\xd5\xe4\xff\x86\x43\xe5\x0e\x49\xd1\x25\x3e\x21\xa2\x1a\xa4\x3c\x6f\x8f\x7c\x60\x17\x1d\x20\x94\x0e\x07\x77\x19\xd3\x2a\xcd\x96\x73\x5b\x5c\x63\x21\x1b\x25\xa2\xda\x47\xc9\x72\xdf\xc7\x05\x47\x8a\x8c\x6d\xa5\xce\x3e\xb1\xd7\x23\x3a\x61\x8e\x80\xbe\x42\x5d\xd9\xe5\xfd\x9f\x35\x2b\xd2\xeb\x71\x65\x7c\xeb\x0d\x9f\x3e\xc4\xb1\x91\xdf\x90\xc1\x53\xb2\xbd\xf5\x1e\x6b\x18\xf3\xed\xcd\x19\xcf\x5f\xa0\x54\xf8\xfe\xed\x32\x69\xca\xf8\xa7\xec\x51\x1b\xb7\xc1\xe4\x97\x66\x1f\x59\xc8\x26\x50\x54\x83\x54\x63\xcd\x90\x18\x96\x6c\x78\x75\xd8\xe2\xd3\xfd\xc8\xf8\x9e\x87\x3f\x2e\x9a\xbb\xb1\x90\x8d\x6c\x3e\x0b\xbd\x7c\xbf\x30\xf3\xd6\xe4\xc3\xe3\x24\xef\xf6\x78\x46\x06\xb6\xfa\x4c\x04\xb4\xb6\x3e\xaf\x98\x19\xe0\xbd\x9d\xd4\x65\xd4\x31\xa5\xb0\x95\xfe\xb6\xdd\xf1\x2c\xc5\xca\xf5\xae\xc3\x5d\x52\x6d\x94\xcc\x86\xbf\xad\xbf\x56\x7f\xe6\xb4\x48\xd3\x4b\x15\x2d\x2b\x0f\x9a\x6c\xa9\x6b\x2d\x57\x95\xab\x58\xc8\xc6\x37\xff\xc9\xe0\x04\x05\xbd\x72\x66\xfb\x3b\x9a\x77\xa9\xfe\xb6\xdc\xe7\x7f\x1c\xfb\xfe\xf0\x05\x0b\xd9\xd8\x6f\xc7\xfc\x72\x04\x2e\x14\xec\xb2\xab\x7a\x59\xab\x29\x17\xb1\x1a\x70\xc7\x5f\xf1\x5b\xac\xde\xc3\x73\x54\x39\x39\x47\x0e\x09\x3b\xf6\x5a\x1f\x66\xaa\x4c\x0d\xbb\x73\xef\x7c\xa8\xc7\x85\x67\x9d\x5e\x26\xe6\xcc\x46\x44\x54\x83\x44\x3c\x5e\xa3\xcb\x2a\x7b\xd6\x83\xe9\xa5\xbf\xbd\x47\x89\x6c\x73\xb1\x72\xbb\x00\xb3\xc9\xef\x09\x53\xd1\x2e\xa7\xed\x1f\x7a\xe8\x85\xb2\xbf\xfb\x4d\xba\x6b\xe5\xc7\x67\x34\x57\xd4\xa9\xbd\xd5\x0c\x28\xf7\xdd\x4b\x71\x8b\x9e\xbe\xea\xf5\x07\x62\x6d\xa8\xdd\x3b\xe3\xf7\xfe\xac\x05\xc8\xa9\x97\xcc\x06\x9b\x26\x4e\xef\xd8\x18\xf4\x90\xa5\x13\xdc\xcd\x3b\x2a\xfa\xce\xf2\x43\xe6\x4a\xab\x5f\x12\x0b\xd9\xe4\xef\x19\xfd\x29\xde\x08\xcb\x90\xd7\x13\x39\x94\xbb\x1e\xcf\x2d\x4a\xf9\x0c\x85\x1c\x71\xe8\x57\xfe\x98\xbf\x50\x7a\xc2\xc1\xca\x66\x7d\xaa\xb7\x54\x7c\x27\x0b\x61\xe3\x54\xda\x33\xb6\x7b\xbb\x8e\xb9\x33\x31\x1b\xff\x86\x11\x57\xb4\xa4\xf9\xf6\x4a\x86\x9e\xe9\xcf\x7f\x59\xcf\xab\xa3\x7b\x89\xa7\x24\x7d\xdf\xbd\xae\x8c\x6a\xd5\x19\xa2\x9c\x7b\x4d\x9d\x7c\x9e\x06\xd7\x38\x33\x3d\xc3\xf9\x9d\xbb\x38\x78\xc7\xcc\x1d\x98\x6f\x6d\x7a\x56\xe0\xd3\xc4\x62\xc4\x79\xa4\xb2\xc4\x25\xcd\xed\x5c\x4e\xff\xa5\x98\x1a\x99\x2e\x66\x9d\xbe\xff\xab\xdf\x39\x54\x94\x71\x53\x2d\x63\x37\x2c\xdf\x76\xf8\x9a\xbf\x3c\xc0\xf3\xf1\xa3\x26\x0f\xe9\xc3\x2b\x5f\xc8\x06\x2a\x9e\xe7\x47\xba\x23\x4f\xa1\x1d\xcb\xdd\x8c\x1e\x1e\x93\x7b\x6d\xbc\x26\x22\x71\xf5\x5a\x57\x61\xbd\x62\xdb\x7d\x36\xb5\xab\x47\xab\x4e\x5e\x59\x17\x96\x25\xdb\xab\x26\x2d\x0d\x0d\xde\xc5\xfc\xe0\xaa\x43\xb9\xcc\x52\xb3\x7d\x8e\xd7\xa2\xaf\x63\xa4\xa8\xa7\x00\x6a\x5e\xed\xae\xfa\x55\x27\xbc\x75\xad\xeb\xce\x51\x69\x59\x02\x49\xef\xff\xc7\xab\x07\x0d\xbd\x17\x43\xae\x8f\x56\x0c\x39\x6e\x4b\x36\x2a\x1d\x8b\x63\x77\xcf\x99\x89\x63\x38\xb6\x3e\xa7\x39\xad\x5a\x14\x7e\xc8\xa5\x03\xa6\xb3\xf2\x41\xaa\x6d\xf3\x2f\xe4\x97\x72\x25\xa7\xbd\x5b\xa3\x25\x3f\xb3\xba\x9f\xa3\x6a\xeb\x4c\xe2\xe8\xd2\x4d\xd4\x08\x08\xdd\x80\x3f\x7b\xd5\xfd\x3c\x30\xb3\xa7\xcd\xca\xff\xde\xe5\x39\x05\x71\x89\x06\x84\x51\xb4\x2d\x9c\xd8\xfa\xac\xa1\xb3\x7c\xd0\xdf\xfa\x61\xe5\xf3\x93\x24\xc6\xf0\xf1\xda\xaa\x6e\xab\x66\x42\xb9\x67\xff\x27\x86\x81\x8e\xfc\xb5\xe3\x66\xcf\xc5\x4a\x64\x2e\xd1\xd7\xdc\x77\xa9\x34\xb1\x74\x38\x56\x6d\x2e\xfd\xf3\xfa\xbf\x45\xcd\x1b\x21\x18\x21\x04\x23\xa7\x05\x6d\x3e\x02\x2f\x35\x09\x03\x57\x59\xa5\xdc\xcf\x89\xae\xae\xc1\x42\x31\xc7\x17\x2f\x5b\x72\x68\x37\x66\xf6\x33\x66\x0b\x8f\xf4\x39\x85\xd9\x45\x09\x11\x15\x5d\x9c\xa8\x58\xb9\x08\x04\x02\x29\xd7\xc2\x3b\x8a\x7f\x33\xdd\x85\x82\x84\x85\xa4\xd7\x59\x6e\xe3\x31\x81\x00\x2f\x68\x38\xa3\x58\xbe\xa1\x79\x90\xfc\xd9\x33\xaf\x6e\x72\x07\x97\x66\xd8\xdc\xdf\xff\x79\xb2\x42\x72\x87\x2c\x17\x6b\x68\xf5\x81\xe3\xc5\xd0\xd0\xeb\x3f\xf6\x70\x3c\x8f\x5d\x88\x7b\xe0\xcc\x2b\xf2\xb1\x81\xf2\x91\xb3\x8d\xee\x4d\x03\xc7\x66\xc9\xe9\x75\x23\x03\x83\xc0\xf8\x06\x68\xa8\x81\xc2\xae\x7d\x14\xdc\xed\xb7\x32\x86\xc7\x0b\x4a\x25\xe5\x6b\x97\xe2\xdc\x43\x2e\x39\xd2\xc9\x24\xfe\xdc\xff\xfa\xd1\x85\x32\xf8\xae\xc9\xad\x4f\x4e\x97\x6d\xf7\x57\xbb\x36\x38\xee\x3d\x34\x46\x18\xe7\xe3\xb8\x9b\xd8\xaf\xf3\x3a\x4f\x8b\xc1\x73\xf0\xd3\x48\xda\xda\x1b\x68\xe8\x4b\x95\x4f\xa9\xc2\x1c\x9c\x69\x46\xc4\xc7\xf6\xe3\xa3\x6b\x7c\x0d\x0e\x53\x2a\xfe\xe1\x68\xc4\xf3\x91\xb3\xaf\x1e\x10\xf6\xc1\x5f\xa3\x8b\x4b\x67\xff\x7a\xe1\x53\xef\x86\xc9\x0b\xa6\xdd\x0c\x5d\x61\xb7\xc7\xb7\x97\x0d\xee\x88\xf6\x57\xdb\x6e\x47\xe9\x99\xa9\x72\x46\x04\x1a\xba\xd8\xa4\x66\x31\x85\x7a\x74\x4b\x3f\x7a\x5c\xdd\x72\x5c\xa1\x63\xf0\x80\xc1\x77\x9b\x9c\x70\x43\x93\x28\xde\xaa\xfd\x12\x83\xdf\xa1\xa1\xad\x12\x37\x7c\xb6\x4a\xaa\x99\xd5\x14\x1e\xed\xcd\xea\xb3\xb3\x68\x9b\xdf\x62\x2c\xf8\x61\x61\xea\x95\x70\xe7\xed\x63\x57\x3a\x2d\xa1\xa1\x84\x27\x09\x0b\x27\x67\xb7\x68\x9b\x5d\x57\xef\x6e\x7d\x10\xb3\xcb\x9c\x66\x54\x4d\x38\x87\x34\xa5\xf7\x88\xdd\x2c\x3a\x6c\x5a\x0d\x1f\x02\x3f\x88\xea\x99\x11\x61\x66\xf1\x57\x50\xe4\x21\x76\xff\xa2\xaf\x0d\x58\x79\xf1\x5d\xe8\x55\xa0\x07\xdb\x5a\xbb\x6f\x20\xc9\x63\x68\xe8\x46\x89\x90\x30\x21\xa6\xce\xe5\x92\x8a\xd8\xba\xd1\x33\x1b\x47\x32\x0f\xe1\x85\xba\x37\x3b\xe3\xb4\x44\x04\x7a\x96\x26\x28\xad\xa0\xa1\xf7\xf5\x43\x62\xfb\x36\xce\xb6\x70\xfe\xec\x6e\xf5\x8f\xba\x1a\x25\xf7\x66\x97\xd5\xbe\x97\xba\x7c\xd4\x3c\xdd\xef\x59\x4b\x5e\x6a\x43\x43\x0f\x1a\x9d\x64\x37\x88\x34\x3d\xc3\x69\xd3\x56\xf3\x31\x65\x4d\x33\x48\xf0\xd3\xa7\xbc\x5b\x7a\xaa\xae\x47\x6b\x07\x0f\x5a\x8f\xc1\xbf\xb7\xda\x66\x7b\x35\xc2\x5e\x51\xec\x74\x54\x80\x38\xd9\xcc\x42\x00\x6f\x56\x61\x98\xdd\x87\x3d\xfb\x55\xeb\xa3\x57\xec\x34\xd6\x37\x82\xa0\xa1\x24\xa9\xb6\xe5\x4e\xe3\xfb\x54\x5a\x3e\x34\x7a\x06\x30\xb8\x07\x7e\xf6\x1d\xba\x5b\x9d\x51\x16\x6a\xae\xf6\xe8\x68\x42\x86\x83\xb6\x53\x08\xe3\xbf\x6d\x41\x67\xb9\x8d\x8d\x8d\x0d\xa7\x50\xae\x27\x04\xaa\x36\x7e\xed\x83\x04\x12\xb4\x9f\x8c\x38\x42\xca\x35\xf4\x45\xf4\x7d\x9d\xa8\x74\xa0\xff\x9c\xe2\x4c\xf6\x4e\x5d\xa7\xec\xeb\x9c\x7b\x7f\x74\xb9\x10\x1c\x9e\x59\x69\xdf\xbd\x66\x25\x4f\x64\xa1\x88\x22\xb0\x12\x76\xa7\x6a\x48\x2b\x10\x48\x7f\x7e\x89\x22\x10\x08\x08\x81\x44\x5a\x9a\x20\xfd\x84\xe4\xef\xa9\x16\x39\xc3\xfa\xd7\xe4\x74\x37\xbe\x2e\xc4\x70\xa4\x6d\xbb\xb4\xb4\x8d\x46\xb6\xbc\x51\x41\x45\x95\xe6\x60\xe9\xc3\xd3\xb1\x49\xac\x44\x16\x8a\xe8\xff\x9a\x8a\xf4\xef\xa9\x9e\x28\x9c\xfb\x16\x92\x71\x9c\x95\x42\xa1\x55\xbf\xa3\x28\xe1\x9a\xc8\xfa\xaa\x78\xa6\x21\x9b\x77\xa8\xca\x9d\xbb\x11\x9f\xa3\x2f\x12\x59\x28\x62\xfe\x6b\x2a\xb2\xbf\xa7\x52\xd4\x9e\x45\x50\xde\xf4\x17\x3f\xb9\x6e\x35\x1e\xbf\xb0\x3c\x70\x85\x39\x6e\x4b\xf1\x7c\xeb\x89\x87\xf1\x17\x68\x51\xdb\x9e\xeb\x44\x16\x8a\xd8\xff\x9a\x8a\xfc\xef\xa9\xfc\xa5\x97\x7d\x46\x7d\x3d\x08\x3e\x27\x28\x34\x64\xe5\x2f\x4b\x3c\x63\x8e\x30\xd8\x6e\x50\x67\x4f\x45\xe5\x5d\xf7\xed\x7e\xb9\x14\x91\x85\xe2\xd5\x7f\x4d\x45\xf1\xf7\x54\x8e\xaf\x5d\x0e\x18\x72\x84\xed\xfa\x65\x18\x73\xc0\xdb\x2d\x4a\x7c\x61\x99\xac\x6c\x88\x59\x7e\xd0\xce\x5a\xde\x57\x99\xcb\xc8\x92\xc8\x42\x11\xf7\x5f\x53\x51\xfe\x3d\xd5\xcd\xaf\xab\xde\xe7\x9d\x02\xe2\x12\x7d\x5f\x2a\x3e\xd2\x3c\x78\xec\xbc\xcc\xe4\x3c\x69\xfe\x3e\x93\xd5\xf4\x56\xda\x87\x11\x74\x74\x44\x16\x8a\xf8\xff\x9a\x8a\xea\xef\xa9\xa2\xb4\xd1\x0c\x7d\xa3\xb8\x9d\x5e\xbc\x37\x66\x0c\x3f\x1f\xac\x4f\xe4\x24\x36\x0f\xc8\x36\x79\x65\x34\x53\x09\x76\xa1\x79\x9b\x2b\x98\xf0\x5f\x53\x51\xff\x3d\x55\xeb\x95\x1d\x06\x2e\xee\x6f\x9c\x06\x77\xeb\x97\x15\x25\xd6\xc6\x1b\x6d\x0b\x16\x7c\x11\x4c\x95\x57\xc6\xef\xa6\x2e\xf6\xf8\x33\x1f\x91\x85\x22\xf1\xbf\xa6\xda\xf2\xf7\x54\xd7\x0e\x7a\xbc\xec\x7a\x59\x74\x7e\x98\xd5\xcf\xdd\x33\x6e\xf7\x1d\x8e\x18\xf7\x85\x2e\x85\x43\xa6\xcf\xbb\xab\xbc\xf4\xe2\x2d\x24\x88\x2c\x14\xaf\xff\x6b\x2a\x9a\xbf\xa7\xb2\x16\xe7\x1c\x5d\xb2\xe6\x30\xfc\xf8\x7e\x5a\xa7\xaf\xa5\xf7\x84\xb6\x92\x65\xff\xfb\x36\xaa\xb1\xe8\xcb\x4f\x85\xcc\x2b\xb4\x75\x89\x2c\x14\x6f\xfe\x6b\x2a\xda\xbf\xa7\x1a\x68\xa2\x20\x5e\xe0\x10\x51\x93\xdd\xa6\x35\xb7\xfb\x9a\x4c\x4b\xe4\xaf\x27\x32\x6c\x34\x12\x3b\xf7\xbe\xb0\x64\x72\xa8\x93\xe2\x22\xb2\x50\x24\xfd\xd7\x54\x74\x7f\x4f\x15\xb2\x6e\x49\x7f\x37\xef\x70\x66\x29\xc9\x09\x83\xf6\xab\x91\x8f\xb9\xd8\xb4\x5f\x7c\x8e\x7c\x5c\xc8\x98\x56\x74\x86\xd0\x51\x78\x93\xc8\x42\x91\xfc\x5f\x53\x6d\xfd\x7b\xaa\xfa\x2f\x0e\xa5\x23\x9a\x21\x0b\x4f\x8b\x6e\x84\x52\x3a\x7d\x4d\xd7\x56\x62\xd4\x16\x2a\xec\xcc\xd5\xb7\x88\x76\x9d\x1d\xe0\xd9\x74\x30\xe5\xbf\xa6\xda\xf6\xf7\x54\xfc\xaa\xdf\xd3\x2b\x8b\xa7\x5c\x67\x47\xa2\x7f\x88\x37\xdc\x0e\x7a\xd9\xaa\x70\x8e\xc6\xc0\xa6\xee\x72\xe3\x95\x44\x6f\x07\x0e\x5a\x22\x0b\x45\xea\x7f\x4d\xb5\xfd\xef\xa9\xd4\x3b\x7b\x22\x6b\x94\x1f\x4a\xd0\xdf\xbd\x7e\xd7\xc2\xf7\x44\x62\xe6\xbb\x3c\x85\x0b\x76\x92\x3a\x6c\xa6\xdf\x5f\x5c\xf0\xe6\x97\x26\xb2\x50\xa4\xfd\xd7\x54\xf4\x7f\x4f\xe5\xa0\x46\xfd\xb0\xfd\xf0\x92\x06\x85\x22\xf5\xa9\x9b\x31\x81\xcb\x97\xab\xa5\xa6\x53\xc4\xf8\x85\x2c\xb6\x7e\xbd\x70\xf0\xe3\xe9\x63\x44\x16\x8a\xf4\xff\x9a\x6a\xc7\xdf\x53\xf9\x24\x65\xd1\x30\x1f\xfe\xd8\x22\x62\xf7\xa4\x3c\xa4\xb0\x9f\xb7\xbf\xc7\xbd\xb7\x44\x43\xc3\xe0\xa0\x9a\x64\x7e\x4d\x42\x88\x15\x91\x85\x22\xe3\xbf\xa6\x62\xf8\x7b\x2a\x36\xf7\x9f\x15\xe7\x8f\x1d\x64\xd0\xe6\x52\x0b\x91\x89\xb9\x5f\xc7\xea\x34\xa2\xd4\x28\x34\x79\x9d\x29\xde\xa0\x6b\xe5\xfe\xd5\x5d\x44\x16\x8a\xcc\xff\x9a\x8a\xf1\xef\xa9\x32\x0e\x0f\x7e\xcf\x3a\xfb\x4d\x23\xe4\x6c\x9b\x36\xf3\xff\x63\xec\x4f\xbc\xa9\x7a\xff\xc7\xff\xdf\x36\xec\x63\x26\x4a\xae\x92\x79\xce\x10\x15\x45\xa6\x4c\x91\x0c\x11\x89\x32\xcb\x50\x66\x32\x85\x9d\x59\x2a\x73\x21\x43\x19\xca\x90\x31\x53\xe6\x21\x15\x65\x88\x0c\x45\x86\x0a\xc9\x3c\x15\x0d\x7e\xeb\x7c\xd6\x7a\xaf\xdf\xeb\xec\xb5\xae\xf5\xfc\xfe\x03\x77\xe7\x1c\x7b\x5f\xfb\x71\xed\xb3\xdd\x90\xeb\x33\x30\x75\xd5\x0b\xba\xdf\x2a\x0f\xd8\x06\x4a\x2b\xa6\x12\x01\x72\x18\xa0\xaa\x84\xa5\xf6\x92\xa6\xc6\x29\x6e\x52\xcc\xbf\xe5\x48\xfd\x38\x74\xe3\x05\xfd\x33\x95\x82\x8d\xe1\x3c\xab\x01\xc1\xbb\x9c\x21\x54\x95\x4a\xc6\x81\x21\x57\x31\x40\xf5\x1c\x96\xda\x47\x9a\x12\xa1\xab\x3d\x7a\xd3\xf2\xef\xe8\xbc\x7e\x5d\xd0\x1b\xd7\x5d\xbb\xb1\xaf\x6d\x2a\xe7\x75\xfe\xfc\xd3\x1a\xae\x38\x77\xe7\x1a\x19\x05\x06\xa8\xaa\x60\x29\x36\xd2\x94\xe4\x46\x33\x96\x75\x5d\xff\x6e\xe1\xde\x4c\xe3\x9f\x0a\xa5\x4f\x84\x0e\xde\x37\x4b\x3f\x9a\xe7\x6f\x75\x43\xa7\xe3\x8c\x08\x33\x0f\x06\xa8\xaa\x61\xa9\xfd\xa4\x29\xc6\x96\xe0\xcd\x8a\xaa\xbb\x1c\xc3\x4e\x9b\xb4\xf1\xbd\x19\x43\xb5\x97\x3c\x05\x65\x0f\x58\xe4\x7c\x2a\x67\x4c\x95\x64\x7f\x22\x80\x01\xaa\x1a\x58\x8a\x9d\x9d\xb4\xe5\x99\x5f\x72\xaf\x88\xf7\xa5\x72\x02\x57\x94\xa6\xf9\x93\xb6\x38\xf3\xe4\xe0\x1f\xdf\x75\xc9\x8e\x4f\x87\xa6\xf0\xec\x95\xd6\xa4\xc2\x00\x55\x2d\xb4\x05\x48\x5b\x0b\xe9\x1d\x97\x2e\x0c\xa6\x1e\xb8\xb6\x9f\xd7\x32\x9b\x53\x85\xcb\x9a\xe9\xf7\x6d\xb7\x5b\xfa\xdd\x6a\x25\xbb\x1a\x8f\xee\x17\x32\x63\x80\xaa\x0e\xda\x3a\x40\xda\x32\x4e\x39\xfd\xba\x5b\x0a\x21\x6f\x1a\x2c\x50\x9a\xd1\xc5\xa2\xaa\xc6\x62\x55\x13\x1a\x6e\x0f\x52\xfc\xfa\xd4\xc3\xb0\x77\x8a\x80\x01\xaa\x17\xd0\xd6\x41\xd2\xd6\xc9\xe0\xb4\xe0\x88\x8b\xe7\xed\x26\x9c\x39\x23\x63\x93\x6e\x2c\x7f\x6a\x13\xf6\xfe\xd7\xc7\x9b\x72\xe3\x61\x96\x9e\xec\xc5\xb5\x2b\x18\xa0\xaa\x87\xb6\x38\x48\x5b\x91\x97\x2f\xea\xcf\x3f\x09\x7f\x25\xe2\x5a\x64\xf4\xf7\xdd\xbd\xbd\xa1\x07\x4e\x99\x7c\xaa\xdc\x60\x2e\xfa\x7c\x3b\x88\x4f\x5f\x94\x78\xc8\x37\x40\x5b\x87\x48\x5b\x01\x61\xa7\xd7\x3d\x0e\x4f\x9f\x99\x7e\xfd\xa6\x65\x6e\xa1\xd4\xaa\xfd\x10\xfd\x3d\x07\xe3\xbc\x61\xe3\x18\x7a\x25\xfb\xe3\xf9\x12\x18\xa0\x6a\x84\xb6\x38\x49\x5b\x97\xc9\x6b\xeb\x6e\x0b\x47\xb7\x2a\xfc\xca\x5e\x5a\x15\xaf\x96\x76\x99\xef\x0e\x24\x1b\x5c\x7b\x68\x9f\x6e\x6a\xa5\x98\xd8\x2c\x84\x01\xaa\x26\x68\x8b\x8b\xb4\x65\x97\x71\xbf\x4b\xa3\xf5\x8e\x8f\x9b\xae\x6a\xa1\x80\xda\x5b\x5d\x25\xa6\xc0\xcc\xab\x07\xb7\x7d\x7b\x14\x3d\xc7\x36\x78\xbc\x54\x31\x40\xd5\x0c\x69\x95\xb2\xfe\x7f\x1b\xf8\xff\xff\x83\x19\x3b\x37\xee\xaa\xd0\xb9\x46\x53\x9f\x39\x92\xf2\xa3\x23\xc9\x3e\xfa\x29\xc7\x1e\xf5\x59\x4f\xce\x13\x26\x23\xb9\x87\x3c\x26\x07\x63\xe9\xeb\x4d\x31\x40\xd5\x02\x7d\x23\x3c\xb8\x5f\xfc\xbb\x17\xaa\x6f\xef\xfa\x9e\x1a\xac\xe0\x15\xff\x9e\x62\x34\xfc\xd0\x97\xb5\x9e\xfd\x3b\xb7\x55\xad\xb5\x6a\xe3\x83\xa1\x55\x72\x0c\x50\xb5\x42\x5b\xbc\xa4\xad\xb3\xfb\xbd\xfa\x68\xe8\x86\xff\xfd\x9b\x5b\x68\xfa\xa9\xc1\xb4\xc2\xbd\x26\xda\xe0\x7e\xd2\xc6\xee\xdc\x43\x05\x86\x93\x16\xdc\xc4\xd9\xac\x0d\xda\xe2\x23\x6d\x35\x35\x04\x8e\xb4\x15\x35\xef\x9e\x20\xdc\x4e\x4f\xeb\x7d\x5d\x32\xe0\xc5\x11\x6c\xda\x7a\xd2\x23\xec\x97\xd0\x60\xd0\x8f\x10\x35\x0c\x50\xb5\x43\x5b\xfc\xa4\xad\x62\x53\xb2\x87\x42\xdf\x5e\x7d\xa0\xfd\xd3\x46\x71\x3d\xb2\xe2\xcb\x7e\xba\xaa\x0c\xdf\xb0\xe4\x40\x4f\xd7\xf8\x8f\x2e\xd3\x51\xc4\xd7\xd5\x01\x6d\x09\x90\xb6\x82\x17\xf5\x55\x6e\x08\xd2\xbe\xfd\x39\x1c\xa4\x3d\x7c\x99\x33\x8f\x97\xfb\x11\xc3\x95\x6f\x0e\xfe\x8e\x47\x57\x1f\xaa\x59\x9e\x42\x31\x40\xf5\x12\xda\x12\x24\x6d\xd5\x03\xbd\x0d\x8a\xa2\x21\x96\x35\xf1\x46\x07\x2f\x71\x31\x99\x54\x56\x3b\xeb\x1d\x83\x19\x87\x26\x77\xff\x83\xd5\xed\x42\xc4\xf9\xac\x13\xda\x12\x22\x6d\x35\xc7\x7e\xd9\x34\xb8\x28\xe0\xab\x7d\x55\x3a\xa4\x35\x3f\xbf\xd5\x26\x90\xe2\xc0\x27\xf5\x5b\x74\x68\x5e\xf9\xaf\xba\x45\x4d\x61\x0c\x50\xbd\x82\xb6\x84\x49\x5b\x6f\xe2\xf7\x7b\x8c\x76\x6a\xff\x6e\x35\x8a\x36\xa8\xed\xdd\x7a\x7a\x4e\x56\x7b\x5a\xbc\x41\xa0\x1c\x3c\xf8\x34\x51\xfc\x4c\xe7\x34\x06\xa8\x5e\x43\x5b\x22\xa4\xad\x77\x1a\xa1\x4d\x26\x04\xd7\xbb\x03\x5a\x1f\xa9\xb9\xbb\xf4\x45\x34\x85\xbc\x7c\xe5\x22\xad\xcd\x3f\xdb\x3c\xa9\x90\xba\xee\xc4\x87\x01\xaa\x37\xd0\x96\x28\x69\xab\xba\xf2\x56\xdb\xb9\xaa\xcf\xfc\x02\xee\x97\x5c\xfe\x89\xed\xe1\xb8\x7e\xa9\xa6\x31\xf1\x9b\x8b\x4b\xac\xb3\xf8\x66\x5c\x78\x34\xf1\x75\x75\x41\x5b\x87\x49\x5b\x95\x6f\x37\xad\x19\x5d\x8b\x33\x2b\x6b\xda\x9e\xcd\x7f\xfa\x65\xef\xf1\xfb\x5b\x7b\xd5\xd2\x7e\xa5\x4f\xb7\x2a\x37\x68\x65\xf3\x4f\x62\x80\xaa\x1b\xda\x12\x23\x6d\x0d\xd1\x9c\xdd\x0e\x4f\x2b\x9e\xf7\xde\x1e\x1d\x93\x91\xd7\x25\x97\xbd\x93\x62\x10\xad\xae\xf3\xdb\x6d\xb6\x5d\x5f\xab\x94\x9f\x78\x3e\xbe\x85\xb6\xc4\x49\x5b\xa3\x23\xc2\x42\xdb\x56\xd3\x6e\xc9\x27\xaf\xb2\xa4\x49\x54\x1c\x4b\x90\xe3\xe7\xa3\xfc\x61\x75\xc7\x9e\xc0\xcf\xf8\x52\x54\x85\xb8\x10\xbf\x83\xb6\x24\x70\x17\xae\xf9\xe5\x90\xf8\x5e\x82\x77\x50\x21\x99\x51\xd3\xbf\xb9\xb2\x17\xbf\xcb\x69\xf4\x57\xb9\xa2\x5d\x79\xaf\x0e\x52\xf0\xa4\x29\x61\x80\xaa\x07\xda\x92\x24\x6d\xbd\x52\xf1\x6c\x51\xd7\xbc\x56\x42\xe8\x2d\xe5\xbc\x58\xb7\x7d\x89\xf6\xee\x24\x1d\x12\x68\x74\xd0\x22\x81\xfb\xd5\xf8\x51\x32\x0d\x0c\x50\xf5\x42\x5b\x47\x48\x5b\x61\xbf\x19\x1a\xab\x38\x69\xc8\x92\xae\xf4\x8f\x05\xcc\x4c\xb5\x97\xb3\x77\x6f\x86\xe5\xde\x35\xb8\xe0\x62\x9d\x50\xd5\xfa\x8e\x78\x4c\xf4\x41\x5b\x52\xa4\xad\xa3\x0d\xae\x14\x41\x77\xa6\x18\x2f\x9f\x1e\xcd\x89\x62\xbe\xc3\x9e\x7f\x66\xcf\x0b\xab\xc3\x79\x69\xbb\x4f\xf4\x3f\x9a\xaf\x8e\x11\x67\xd1\x7e\x68\x4b\x9a\xb4\xf5\xe4\xbc\x8c\x93\x42\xcd\x67\x9e\xf4\xb5\xae\x82\x89\xc1\xcf\x42\xda\x41\x26\xde\xac\x11\xcb\x71\x36\x89\x9a\x69\x46\x82\x56\xae\x18\xa0\x7a\x0f\x6d\x1d\x25\x6d\x3d\x8e\xc8\x68\x58\x22\x08\x05\xc7\xf7\x7f\x74\x9d\xfd\xf0\x25\xf8\x52\xcb\xf3\x43\x03\xb6\xb3\xbb\x39\x54\xbd\xc3\x19\xd6\x7f\x89\xe7\xf6\x00\xb4\x75\x0c\xb7\x16\x5e\x29\x51\xcf\x36\x3d\xc0\xc2\x7c\x48\x97\x8c\x4d\x46\x80\x4e\x91\x3e\xde\x75\xd9\x91\xd0\x3a\x1d\x6c\x39\x1e\x36\x2c\x8a\x60\x80\x6a\x10\xda\x3a\x4e\xda\xea\xe2\xac\x4a\x77\x78\xc3\x9c\x4b\x91\x15\x49\x79\x55\x5b\x7e\xcc\x43\x7c\xa3\x6c\xce\x87\xbf\x2b\xe0\x6b\xe8\xa6\xd5\xee\x6d\xe2\xb1\xfa\x01\xda\x92\x21\x6d\xa9\x7e\x30\xf1\x8f\xd5\x7e\x3c\x31\xe1\xb5\xba\x96\xe8\x54\x66\x26\x72\xc6\x82\x4f\xba\xfb\x36\xcb\x93\x47\xa2\x3a\x96\x5f\xcb\x88\x6b\xe1\x10\xb4\x25\x4b\xda\x42\x5f\xd4\xb0\x5f\x0b\xea\x8e\x9d\x97\x64\x4f\xa2\x68\xa8\xcb\x16\xa8\xbb\xac\xac\x6a\xfa\x6e\x64\xfc\xb1\xe0\xd5\x77\x5f\x3d\x89\x1b\x81\x61\x68\xeb\x04\x69\x2b\xb1\x34\xc4\xb9\x7c\x93\x82\xc2\x82\xca\x55\x8e\x3a\xf3\x9d\xe7\x3e\xc7\xe4\xe0\x27\xae\x37\x2b\xb6\xeb\x91\x93\x06\x26\xb3\x97\x31\x40\x35\x02\x6d\x9d\x24\x6d\x45\xe5\xb7\xf5\xb3\x7b\xee\xdb\x18\x2e\x2e\x67\x0a\x49\x59\x25\x5f\x2e\x34\x65\x93\x3d\x29\xa6\xd2\xb8\x64\x42\x97\x6e\xc2\x68\x8b\x01\xaa\x51\x68\x4b\x8e\xb4\xe5\x23\xe4\x94\xb3\x79\xa4\xe1\xc3\xea\xce\x68\x1a\x83\x7e\xc0\xab\x44\xe9\x8e\xde\x99\x67\xcd\x4c\xaf\x95\x5e\xdc\x77\x68\x1c\x73\xc2\x00\xd5\x47\x68\x4b\x9e\xb4\x25\xed\x7e\xc2\xe5\x66\xf2\x5f\x5d\xa6\x49\x1b\x8f\xe6\x65\xc6\x89\x15\xcf\x2d\xca\x35\x75\x81\x95\x5e\x7a\xb5\xd5\xc7\x21\xea\xbc\x18\xa0\xfa\x04\x6d\x9d\x22\x6d\xfd\x9a\xb9\xc9\xc7\x94\x15\x4c\x3e\x3e\xe2\x57\xf0\x2b\x5f\xaf\x5c\x43\x5e\x32\xe2\xd2\x21\x49\x8b\x25\xbb\x45\xbd\xee\xc8\x11\x47\x0c\x50\x8d\x41\x5b\x0a\xa4\xad\xee\xfd\xf5\x35\x5f\x2b\x3a\xd2\x9f\x79\x57\xde\x59\xda\x93\x60\x75\x1f\x49\x76\x65\xd0\x7b\x90\xa7\xc6\x7c\x54\xdc\x4f\xc5\xc8\x10\x03\x54\xe3\xd0\x96\x22\x6e\x4f\xae\xfa\xbe\x60\xca\xa1\x2e\x50\xa3\xf6\xfe\x9a\xe2\xd8\x23\x13\x65\xa7\x12\xd7\xe0\x80\x4c\xda\xc5\xb9\xaa\x00\x86\x22\x5e\xe2\xeb\xfa\x0c\x6d\x29\x91\xb6\xa8\x0a\x99\xf9\xda\x8c\x4e\x5c\x49\x5e\xbd\x1a\x4c\x11\x93\xa6\x7a\x40\x83\x17\xcc\x86\xc7\x9d\x49\x49\xac\xdf\x9a\xa1\x95\xe4\xc2\x00\xd5\xc4\x7f\x0c\x6c\xff\x75\xdb\xf5\x7f\x06\x36\x65\xd2\x1f\x6e\xf2\xbd\x8b\x4c\xe2\x01\x13\x47\xf3\xc7\xc3\x32\xb6\xce\xf4\xfa\x48\xa9\x95\xa2\x7a\xe7\xa5\xca\x5b\x53\xce\x43\xd1\x8b\x33\xc4\x6d\xfc\x24\xf4\x8d\xa8\x90\xb6\x38\xee\x2f\x01\xcb\xa3\x07\x9c\xb4\x8f\xf0\x96\x4b\x2f\x65\xea\xbb\x51\xe4\x3e\xf4\xec\xda\xe4\x95\xa6\xfa\x47\x63\xb2\xb6\x05\x30\x40\x35\x05\x6d\x9d\x26\x6d\xd1\xcc\xbc\x38\x6d\x4a\x90\xba\x2e\x6b\xb4\x9b\xa6\xf5\x20\xc0\xaa\xaa\xef\xc9\xbc\xe6\x59\x6b\xcf\x38\xaf\xfd\x5b\x39\xa3\x87\x88\x1f\xf0\x34\xb4\xa5\x8a\x9b\xd4\x03\x17\xf4\x1f\xdb\x1e\xff\xa4\x37\x71\xe6\x54\x98\xd3\x00\x85\xbf\x7b\xe9\xe9\x60\x7f\xa9\xe2\xb3\x1f\xf4\x19\x34\x56\x0e\x10\xf7\xcc\x5f\xa0\x2d\x35\xd2\x96\x85\x23\xc3\xe0\x23\xe9\xe3\xec\x34\xd5\x9f\x69\xe7\xc4\x9a\xf7\x1e\x59\x3c\x9b\xb8\x7e\xf8\xec\xd9\x85\x0e\xc3\x97\xf2\x34\x9e\x67\x30\x40\xf5\x15\xda\x52\x27\x6d\xc9\x30\x3c\x12\xae\x17\x6d\x6f\xe2\xef\x9b\xbe\x12\x4f\xfb\xa6\xce\x8d\x85\x39\xb0\x35\xe6\x1b\x2d\x73\xbe\x61\xae\xb9\x9a\xc4\x21\x0c\x50\x7d\x83\xb6\x34\x48\x5b\x41\xaa\xeb\x9c\x5f\x6d\x74\x9c\x1f\x4c\x1e\x55\x91\x34\x7e\x26\x73\xd5\x38\xc6\x61\x21\x33\xe2\x35\xad\x64\x9e\x58\x26\xc5\xb8\x35\x06\xa8\x66\xa0\x2d\x4d\xd2\x16\xf5\xca\xbc\x9d\xd0\x6c\x4d\xa3\xdc\x4c\x67\xa4\xfd\xe9\x5d\xa1\xbe\x97\x06\x77\x84\x7a\xab\x8a\xc7\xbd\x2b\x8b\x03\x53\x73\x59\x31\x40\x35\x0b\x6d\x9d\x21\x6d\xe9\xf0\xdd\x1c\xcb\xf2\x19\xcd\x46\x6b\x5d\xd7\xf4\x85\x6f\x65\xe8\xc6\x24\xb1\x1e\x3b\x27\x1a\xf5\xa8\x67\x21\x30\xdb\xdf\xdb\x19\x03\x54\x73\xd0\x96\x16\x69\xcb\x3d\xf8\x5f\x94\x49\x98\x9b\x21\x6b\x62\xf8\x80\xe1\xbd\x74\x65\xfe\x04\xee\x0b\xff\x46\x7e\xde\x5c\xa6\x1c\xf3\xeb\xd8\x1a\x50\xc1\x00\xd5\x77\x68\x4b\x1b\xf7\xd9\xcb\x67\xec\x2f\x1c\xbd\x25\xeb\x97\xdd\x46\x2d\x1d\x15\xe1\x30\x1c\xde\xdd\x1b\x11\x4c\x6e\x57\x7e\xb4\xf0\x2f\x59\xe7\x19\xe2\xee\x6d\x1e\xda\x3a\x4b\xda\x4a\xe1\x2b\x56\x35\x2c\x26\x63\x11\x3b\xc3\x21\xb0\x7a\x54\xef\x70\xe4\xc1\xea\x5a\x91\x13\x4f\x26\xbe\x46\x28\x52\x68\x1f\x61\xb9\x80\x01\xaa\x1f\xd0\x96\x0e\x69\xcb\xf6\xa9\x62\xdd\x7a\x02\x6f\x94\x15\x93\xd0\xbb\xf6\xd0\x2f\x26\x29\xee\x0f\x07\xee\x74\x8c\xeb\x9b\x8a\x2e\x5b\xa4\x6d\x1c\x21\x2e\xc4\x0b\xd0\xd6\x39\xd2\x56\x5a\x20\x43\x5d\xcb\x4e\xb6\x33\xeb\x19\xc5\x30\xc7\x67\x7f\xc3\x1d\xb5\x92\x67\x22\x6d\x83\xcc\x0b\xbe\x78\x54\xee\x09\xf6\x65\xc0\x00\xd5\x22\xb4\xa5\x4b\xda\xba\xe1\xb5\xbe\x34\x25\x98\xcf\x53\xff\x6c\x37\xdb\x70\xaf\x47\xca\xd4\xf8\xb5\x38\xed\x45\x9d\x7f\x1b\xfc\x9d\x0f\x8e\xc5\xd3\x32\x63\x80\x6a\x09\xda\xd2\x23\x6d\x3d\xb5\xcc\xfc\x96\x13\x4e\x2d\x3c\x28\xbc\x5e\xf0\x99\xf6\x68\x7a\x4e\xd8\xa9\xf8\x5d\xb9\xc3\x6f\xb6\x22\xa9\x99\x6a\x9d\xe2\xf6\x62\x80\x6a\x19\xda\xd2\x27\x6d\x6d\x18\xa4\xaa\x2e\x51\xc7\x3f\x36\xd3\xe7\x2d\xbe\xe3\x7e\x3e\x47\xbb\x49\x90\xd3\xbd\xc0\x6d\x63\x84\x0d\x79\xef\x45\xc6\x45\xdc\x24\xae\x40\x5b\x06\xa4\xad\xb8\xa2\xfd\xea\x23\xe2\xaf\x4e\x3f\x6a\xa1\x18\x7c\xfa\x29\xfa\x78\xf7\x4e\xea\xdc\xdf\xea\x36\x1d\xc7\x71\x7f\x97\x2d\xe6\x62\x51\x0c\x50\xad\x42\x5b\xe7\x49\x5b\x94\x74\x17\x15\x39\x7b\xcd\x7f\xd1\xc8\x87\x8d\xed\x24\x75\xfd\x0c\xfb\x78\x73\x62\x8b\x4a\x80\x77\x6c\xce\xb0\x49\x3d\x7b\x94\xb8\xae\xae\x41\x5b\x86\xa4\x2d\xbf\x2e\x4a\x44\x3f\xff\xc8\x61\xd7\xa7\x0b\x5b\x27\x24\xab\x7e\xd0\x8f\x57\xdb\xa4\xe5\x2e\x77\xbd\x6d\x65\x5a\x32\x69\x03\x26\x18\xa0\x5a\x87\xb6\x8c\x48\x5b\x1f\xf4\xc2\x0a\x87\x97\x04\x1b\xce\x25\x20\xa2\xa7\x5e\xf3\xb6\xd8\x87\xc9\xc9\x3b\x0b\xe5\x04\xc9\x2f\xb7\xf6\x4c\x3a\xcb\x13\x3f\xaf\x0d\x68\xeb\x02\x69\xeb\x8f\x6f\xd2\x57\xdd\xe1\x81\x0c\xd3\xf4\x33\x6a\xd2\x93\xbf\x0f\xbe\x75\x3e\xe9\x3d\x9d\xf0\xd5\x31\x80\x23\xed\x9f\xde\x88\x12\x71\xf3\xba\x09\x6d\x19\x93\xb6\x46\x0e\x45\x50\xfd\x08\x5f\x91\x12\x35\x70\x40\x45\xfe\xe4\x38\x06\x3d\xdb\xd1\x7a\x30\xa3\xc2\xac\xc7\x99\xef\xa4\x66\x81\xd8\x61\x80\x6a\x0b\xda\x32\x21\x6d\x5d\x34\xae\x7f\x96\x3d\x1b\x7c\xdb\xfc\x2d\x3b\xf7\xa7\x5b\xba\xab\x85\x6c\xac\x2a\xda\x0f\xe2\xbe\xb0\x74\xeb\x54\x4d\xad\x24\xb2\x60\x80\xea\x27\xb4\x75\x91\xb4\xb5\xee\x2c\x17\xe2\xa6\x58\x1e\x5a\xd5\x5e\x66\x6c\x95\x14\x61\x24\xa1\x38\x28\x62\x78\xbc\x54\x54\x8e\x66\xa9\x61\x2e\x22\x9e\x78\xac\xfe\x82\xb6\x4c\x49\x5b\xfc\x37\xd1\xca\x05\xf2\x40\xcb\x32\x67\x21\xf7\x73\x0c\xf9\xcd\xd1\x81\x37\x47\x8a\xd2\x3b\x63\xc8\xd2\x6e\x68\xce\x77\xae\x32\x61\x80\x6a\x1b\xda\xba\x84\xbb\xa6\x5d\xe4\x7f\x3c\xc8\xab\x49\x97\x17\x4f\xb3\x11\xf1\x34\xf7\x6b\x8a\xd9\xdb\xa3\xfd\x26\x37\x0d\xc8\xdc\xdb\x73\x46\x6f\x74\x13\xaf\x8f\x3b\xd0\x96\x19\x69\xeb\xdf\xbd\x09\x8d\x5d\xed\x2c\x9a\xcf\xce\xab\xc7\xd6\x14\xfc\xb7\x3b\xdb\x38\x59\x2f\x50\x08\x18\x66\x28\xfd\x6c\xb9\x37\x47\x4d\x81\x01\xaa\xdf\xd0\x96\x39\x69\xeb\xef\xd4\xcd\x07\xa7\x67\xa4\xae\x3a\xe4\x4d\xdc\x9d\x13\xbb\x3d\xa1\xe7\x15\x69\xb2\xec\x2c\x9e\x70\x8c\x7d\xab\xcf\xfb\x9a\x8c\x20\x06\xa8\xfe\x40\x5b\x97\x49\x5b\x2b\x0e\x31\x76\x62\x42\x22\xca\xe3\x5c\x61\x58\xbc\x15\x3b\xdd\x17\x97\xcc\x58\xe5\x9b\xf1\xcf\x1e\x06\xaf\x80\xa6\xd1\x18\x61\x0c\x50\xfd\x85\xb6\xae\xe0\xd6\x2f\x8e\xf1\x50\x24\xf8\x8c\xe5\xf9\xf3\x14\xb5\xaf\x54\x09\x0a\x45\xc2\x0f\x8a\x8a\x5f\xa8\x81\xd5\x82\xb3\x8a\x17\x2e\xfe\x25\xbe\xae\x7f\xd0\x96\x05\x69\x6b\x6a\x11\x33\x65\x17\xfb\x61\x97\xfa\xa3\x7e\x9e\xa6\xd1\x74\xf9\x66\x03\x6b\x67\x81\xaa\x58\xa2\xd1\xef\xd7\x41\x77\x90\xbf\xc4\x75\x62\xf7\x3f\x06\xb6\xff\xfa\xf2\xfb\x7f\x06\x36\x4b\xdc\xa2\xee\xf4\xc7\xee\x5b\x26\xeb\x29\x71\xae\x29\xad\x41\x33\xb3\x4f\x41\xf3\x5f\x9f\x97\x95\xfe\x95\x34\x78\xe4\xf5\x4d\x3e\x6e\xfe\x28\x06\x50\x32\xe8\x1b\xb1\x22\x6d\xd5\xb2\xba\x77\x14\x6c\x09\xbe\x61\x29\x7f\x62\xfc\x2b\x44\xd7\xdf\x24\x97\x2b\x7a\xaf\x71\xb2\xc5\x3e\x99\xc1\xb4\x7d\x3f\x17\x18\x31\x80\x22\xd0\x96\x35\x69\x2b\xf4\xe1\x47\x81\x54\xc2\xb3\xb4\x94\x2b\x66\xac\xf6\x45\x3b\xbc\xed\x07\xae\x5f\x52\x68\xf3\x74\x54\x4d\x2e\x79\xa7\x55\x2e\x66\x82\x01\x94\x1c\xda\xb2\xc1\x2d\x52\x3d\x9b\xd5\xc3\x2a\xaf\xac\x72\x45\x7c\x2d\x18\xdf\xff\x3c\xff\xf1\x9c\x4f\x57\x2a\xd7\x54\xe6\xe6\x74\xf0\x45\x3a\x31\x01\x26\x0c\xa0\x14\xd0\x96\x2d\x69\x8b\xf7\xe2\xe5\x35\xdd\x36\x0e\x21\x9a\xf7\xcf\x1d\x93\xab\x02\xc0\x6f\x6a\x17\x1f\x6b\x82\x60\xc1\x6c\xde\x9c\x11\xbd\x17\xaf\x0c\x06\x50\x4a\x68\xcb\x8e\xb4\x55\x74\x9f\xda\xec\x47\x9f\xe3\x99\xb7\xd7\xdd\x7e\x8e\x77\x25\xfe\xa5\xfe\xca\x7e\xd0\xa4\xaf\x7d\xc2\x2c\xd8\x23\xdb\xe9\x11\xd9\x09\x0c\xa0\x54\xd0\x96\x3d\x69\x4b\xf6\xe4\x5d\xba\x43\x6c\xaa\x4a\xdf\xb9\x66\x19\x1f\x85\x50\x56\x8c\xac\xbc\x0e\x1b\x7f\xdf\x7c\xcb\xb6\x6f\x86\x7a\xec\x53\xdb\x69\x0c\xa0\x28\xb4\x75\x95\xb4\xd5\xb9\xd5\xc9\x79\x25\xcc\xc2\xf3\xf0\x9f\xb1\xa8\x43\xa7\x3b\x05\x2e\x69\xcc\xbc\x37\xbd\xd2\x72\xee\x91\x1a\xe0\x7b\x9d\xee\x29\x82\x01\x94\x00\x6d\x39\x90\xb6\x0e\x8d\x9f\x48\x59\x1f\x7d\x70\xa2\x69\xc1\xe8\x5f\xbc\x32\x17\xf6\xa3\x6e\x2c\x7b\x94\x5d\xa7\x47\x40\xcc\x6a\xb2\x9f\x53\x57\x14\x03\x28\x35\xb4\xe5\x48\xda\x8a\xd0\x5c\x19\x6e\xfc\x70\x85\x30\x6e\x74\xb2\x42\xc6\xe2\xa6\x79\x35\xd9\xcd\xb8\xf8\x5f\xfe\x7f\xd6\x3f\xae\xc8\x30\xd4\xde\x15\xc6\x00\x4a\x03\x6d\x39\x91\xb6\x2a\x1a\xde\x77\xeb\xd0\x76\x7c\x3b\xf6\xc2\x67\x6e\x20\xc7\xd1\xd0\xbd\x98\x59\x80\xfc\x29\x87\x58\x43\xc3\x82\xc0\x15\xa7\x3d\x42\x18\x40\x69\xa1\x2d\x67\xd2\x56\x47\xd6\x93\xa4\x4f\x19\xdc\xcf\x34\xd3\xf3\xc2\x7d\x4a\xa4\x4d\xce\x8a\xa8\x6a\x8b\x85\xb1\x89\xfd\xa3\xa8\x5a\xb2\x8b\x08\xe5\xc4\x00\x4a\x07\x6d\x5d\xc3\x2d\x52\x9f\xe3\xde\xf1\xf7\x17\x5d\x9b\x2f\x57\x13\xec\xfb\x44\x1e\x35\x68\xd5\x92\x9c\x7a\x47\x5d\x4b\x77\xea\xd8\x79\x13\x91\x30\x41\x0c\xa0\xf4\xd0\xd6\x75\xd2\x56\x02\x7a\xd7\x5a\x74\x03\x19\x7a\x7c\xd1\xce\xa9\x6f\xa0\x54\x8a\x7f\xde\x91\x7a\x77\x25\xf2\x8c\x65\xfe\x0c\x97\x6e\xad\x99\x39\x06\x50\x06\x68\xcb\x85\xb4\x35\x91\xb4\x3c\xa8\xf6\xf1\xe4\x0b\x73\xb5\x17\xfa\x7d\xd1\x07\x3c\x47\x4f\x85\xd8\x86\x48\x3d\xec\x7a\xd1\x25\xc9\x35\xfd\xd8\x63\x3f\x06\x50\x46\x68\xcb\x95\xb4\x15\xfd\x46\xa8\xb2\xe1\xb1\x40\x5b\xc7\xf1\xdf\x7a\xa1\xc3\xe5\xa6\x8f\xf7\x52\x7d\xe9\xbf\xd0\xb6\xeb\xcf\xda\xa3\xde\x77\x59\x4e\x17\x03\x28\x13\xb4\xe5\x86\xfb\x3d\x86\xb1\x3f\xfb\x65\x53\xa8\xb4\x2a\xde\xfc\x47\x2c\x6e\x3e\xdd\xf9\xb5\xb6\x0d\x5f\x8b\xff\x8f\x84\xe2\x5a\xd0\xce\x60\x7b\x1d\x03\x28\x33\xb4\xe5\x8e\xbb\xc3\x76\x55\xdf\xa2\x66\x28\xe5\x7d\xc2\xbc\x33\xa1\xc7\xcf\xc6\xf6\x54\x34\xb2\x42\xb5\x77\x73\xa7\x45\xb9\x91\x4c\x7f\x87\x5a\x0b\x03\xe8\x1e\x68\xcb\x03\x77\x67\x86\xab\xfe\xd6\xbe\x52\xb3\x62\x8f\x13\x5f\x54\x76\xf4\x66\x79\x4d\x9c\xc8\xbe\xee\xb4\xee\x32\x7e\x38\xe9\xcd\x8e\xa4\x17\x4a\x63\x00\x65\x81\xb6\x3c\x71\xdf\xac\xd6\x13\x18\x39\xcd\xa3\xbd\x72\xc9\x0f\xb4\x2d\x16\x36\x74\xd3\x2f\xb5\x3b\x7b\xce\x96\x2f\x9a\x56\xbe\xf8\xd0\x29\xc3\x42\x81\x01\x94\x15\xda\xf2\x22\x6d\x09\xd0\xbe\xb1\x56\x5d\x33\x92\x13\xbe\x5b\x15\x33\x33\x9c\xfa\x82\xb6\x40\x33\x99\x51\x2e\xb6\xba\x5b\xc5\x8f\x96\xfe\x6a\x30\x03\x06\xd0\xbd\xd0\x96\x37\x69\x2b\x93\xa1\x8a\x60\xa1\x68\xd0\x60\x3a\xc7\x16\x51\xdc\xc6\xa9\xb9\xcd\x21\xed\x3a\xd5\xb0\xd0\xb1\x34\xf1\xbd\xbd\x7b\x28\x9f\xb8\xae\xee\x83\xb6\x7c\x48\x5b\x0e\xf1\x52\x96\x6f\x4b\xfb\x56\x59\x91\x8b\xd3\xdc\x2a\x2c\x83\x67\xb6\xc4\xee\xfd\x19\xd9\x08\x78\xf8\x7e\x32\x99\x35\x56\x5a\x1d\x03\x28\x1b\xb4\x75\x83\xb4\x55\x20\x59\x59\xaf\x31\x66\x17\x66\x91\x9c\xf0\x4d\xa6\x24\x22\xbc\x59\x2a\xf2\xc6\xbd\xad\x89\xfe\x00\xf2\xc6\xfe\x84\xd3\x94\x1e\x18\x40\xf7\x43\x5b\xbe\xa4\xad\x23\x17\x8d\x27\x92\xe5\x3f\x7b\xc8\xdf\x3b\x2a\xe1\xa0\x75\x38\xa0\x2d\x73\xdc\xa4\xfb\x41\x0b\xba\xe7\xc8\x4d\xeb\xe6\x97\xb4\xc4\x75\x95\x1d\xda\xf2\x23\x6d\x9d\xb1\x21\x3f\x13\x4f\xfd\xf2\x75\x17\x8b\xc2\x7b\xee\x03\xfe\xb1\x4c\x47\x3e\xdc\xf8\x63\xc1\xea\xf7\x2a\xd9\x6f\x6e\xb6\xb1\xff\x18\x06\x50\x00\x6d\xf9\x93\xb6\x78\x8a\x6e\x33\xf9\x52\xf1\x7b\xa5\x46\xb9\x84\x86\xe4\x9d\xe2\x5d\x18\x97\x4a\x38\x30\x1f\xcb\xd5\x70\xfe\x8a\x1b\x5d\x8d\xa2\x14\x06\xd0\x03\xd0\x56\x00\x69\xcb\xf9\xe5\x31\xbe\xa9\x5b\xc7\xc9\x0d\x1c\xe3\x46\x3e\x30\xd5\x51\x18\xdd\x8f\xf3\x2d\x7b\x56\xc0\x5a\xc4\x1c\x3d\xce\xf8\x31\xc3\x1a\x03\xe8\x41\x68\x2b\x10\x77\xe7\x2f\xf4\xe7\xbe\xd9\xaf\xbe\x05\x8b\x91\xed\x7b\xbd\x12\x92\x93\xff\x48\xfb\x1c\x6d\xaf\x6e\x77\x5c\x8f\xd1\x22\xb8\x4c\x0a\xb2\x62\x00\xe5\x80\xb6\x6e\x92\xb6\x42\xda\xf7\xe7\x7b\xf2\x7a\x14\x59\x54\x54\xa5\x24\xf4\xd6\x54\x1f\x1a\x1f\x8e\xec\x3c\xcb\x3d\x97\xcf\xa4\xd2\x2d\x40\x7e\xd9\x13\x03\xe8\x21\x68\x2b\x08\x77\x57\xec\xce\x20\xc1\x5a\xf6\xd2\xf2\x9e\x27\xc3\x32\x8b\xbf\xee\x68\x38\xd1\xe4\xca\xdf\x67\xf8\x20\x29\x13\x39\x7b\xf7\x5d\x7c\x2e\x1d\x06\x50\x4e\x68\x2b\x98\xb4\xf5\x31\x0b\xcd\xe6\x79\xa1\x26\x25\xb1\xbf\xb6\x3e\xd3\x5d\x43\xa6\x29\x47\x79\x2e\x9a\x2c\x50\xf1\x50\x66\x54\xe8\xf6\x03\x5f\x3b\x0c\xa0\x5c\xff\x31\xb0\xfd\xd7\x23\x88\xff\x33\xb0\x85\xe0\x76\x23\x5f\x5e\x46\x98\x9d\xe3\xb3\xd9\xda\xbb\x70\x81\x60\xcf\xf8\xe6\xe1\xef\x11\x8b\x9f\xf2\x11\x64\x6e\xb3\x2d\x16\x27\x56\x5a\x8e\x60\x00\xe5\x86\xbe\x11\x0c\xf7\x78\x4b\x73\x2b\x8a\xc4\xf6\xd4\x16\x08\xde\xab\x67\x7d\xb2\x12\x4e\x69\x67\x5b\xfb\xfb\xc0\x15\x1f\x49\x6f\xa9\x93\x17\x6b\x25\x88\xc3\x1f\x0f\xb4\x75\x8b\xb4\xe5\x2d\x98\x11\xc6\x30\xd9\x43\x5e\x7c\x8b\x2f\xf0\x46\x50\x60\x25\x42\x76\xf8\xec\x1f\x03\x25\x4c\xb5\x28\x5c\x25\x6d\x94\xda\x01\x03\x28\x2f\xb4\x15\x4a\xda\xba\x82\xca\xbe\x58\xd9\xe7\x2b\xa2\x23\xa8\xfc\xd9\x6b\x99\x6d\xae\xab\x7c\x9f\x8e\xcd\x5c\x80\xa7\xb0\xcb\xbb\x19\xed\xc6\x08\xe2\xe2\xc9\x07\x6d\x85\xe1\x06\x90\x15\xb6\x4b\x93\x69\xb9\xfc\xda\xab\xdf\x14\xbd\x73\x82\x1c\x9a\x8f\x47\xb6\xde\x77\xbc\xfa\xd8\xa1\x95\x6b\xb7\xdf\x35\x65\x1f\x06\x50\x7e\x68\x2b\x9c\xb4\x35\xfb\x3b\x47\xe3\xe4\xa4\x41\x25\xca\x93\x12\x4c\x21\xdb\x90\x4e\x15\x67\xb1\x47\x32\x47\x2d\xe8\xc9\xfd\x4e\x67\xf3\xb2\x5e\xe2\x30\x23\x00\x6d\x45\xe0\xbe\xfe\x12\x29\xba\xa0\xc3\x13\xff\x92\x26\xb8\xcf\xb4\x4a\x94\xe7\xae\x5a\x6d\xae\x45\x5b\x97\xa4\x67\xf8\x33\x81\xd4\x66\x7a\xf4\x22\x06\x50\x41\x68\x2b\x92\xb4\xe5\xd6\xbd\xf0\xdb\x49\x93\xad\x25\xfc\x54\xfa\x07\xb9\x9c\xd9\xaf\x5e\xc6\x3e\x2b\xa5\x4e\x7b\x43\xfa\xd2\xd4\xbf\x34\xae\xaf\x1c\xc6\x00\x2a\x04\x6d\x45\x91\xb6\x1e\x2d\x9d\x53\xe3\xa2\xf4\xc9\x7f\x3d\xc7\x47\x77\x27\xbb\x96\xba\x70\xa0\x5a\xef\xe4\xe6\x23\x49\x79\x1b\xbe\x01\x36\x34\x57\x1c\x03\xa8\x30\xb4\x15\x8d\x1b\xbc\x3d\xbe\x1d\xec\x3d\xe5\xea\x2d\xe2\xd6\xd3\x26\xd3\xac\x15\x3b\xee\xc5\x23\xcf\xe0\x71\xe9\x6b\x27\xed\x52\x73\xe6\x82\xad\x11\x06\x50\x11\x68\x2b\x86\xb4\xb5\x2f\x29\x6e\x31\xa3\xfc\xc4\x98\x2b\x7f\xa0\x23\x75\xf6\x88\x30\x4b\x66\xdd\xa4\xf5\x64\x70\xb1\x92\x1f\xdf\xe9\xcf\x7c\xb1\x17\x30\x80\x8a\x42\x5b\xb7\x49\x5b\x97\x3e\x89\xfc\xab\x28\x45\xd9\xfe\x2d\x8b\x8e\xb6\x4e\xf3\x68\xec\x79\xd6\x5c\xf0\xb6\x82\xa9\x66\x3e\x4a\x8e\xd5\xac\xd4\x5c\x01\x03\xe8\x61\x68\x2b\x16\xf7\xac\xd2\xb7\x1f\x7f\xbf\x5d\x76\xa6\xb6\xa3\xe2\x8b\xd7\x74\xe7\xfa\x29\xbb\xe0\xbd\xa2\x7e\x2b\x7a\xc0\xba\xa7\x35\xfd\xd0\x97\xe3\x4a\x18\x40\xc5\xa0\xad\x3b\xa4\xad\xdc\x55\x06\x73\x9d\x70\xbb\x7b\x03\xa9\xcc\x4b\x47\xc2\xdc\x2f\xf6\xd2\x79\x96\x2a\x8f\x34\x07\xb1\x4e\x1a\xba\xb9\xfa\xd7\xcb\x63\x00\x15\x87\xb6\xee\x92\xb6\xa4\x16\x4f\xfe\x34\x9e\x11\x33\xa3\x93\x31\xbb\xd0\xc9\x79\x56\x9e\xc5\xf5\x71\xde\x75\xf7\xb3\x83\xac\xfb\x6b\x2e\xfd\x2a\x51\x96\xc5\x00\x2a\x01\x6d\xdd\xc3\xdd\x31\x6a\x1f\x2d\x30\xfc\x4e\x2f\xfb\xbc\x27\x3f\xa9\xe2\xb5\xfa\x7a\xb1\x5d\xd7\x92\xf5\xdf\x38\xa7\x7b\x2f\x76\xb2\x04\x0a\xbe\x10\x37\x76\x92\xd0\x56\x1c\x69\x6b\xd5\xe7\xc2\x9d\x6f\x2f\x18\xfe\x7c\xc8\x45\x95\x44\xef\x26\x3d\x89\x66\x3f\xad\xf0\xbc\x5f\xe9\xeb\xe4\x39\xda\x27\x92\xec\xeb\xc4\xe3\xfe\x08\xb4\x15\x4f\xda\xa2\xf8\xa4\xcd\x59\xc1\x39\x60\xd9\x93\xfa\x9d\xfb\x68\xd4\x9f\x6c\xf7\xe9\x6f\xaf\x1b\xb8\xd4\x5d\xe4\x96\x6f\x8d\xec\x8d\x66\x22\x6e\x54\xa4\xa0\xad\x04\xd2\x96\x4a\x18\x85\x94\xdf\xf1\x33\xba\xa2\x7f\x28\x5e\xfe\x3c\xeb\x64\xaf\xc9\xf4\x90\xed\x44\x45\xdd\xf5\xc4\x7c\xe6\x90\x4e\x06\x49\x33\x0c\xa0\xd2\xd0\x56\x22\x69\xeb\xc0\xbd\xfb\x95\x4e\x93\x19\x8c\x99\x4a\x0c\x26\x74\x22\x07\xd6\x22\xea\xae\x72\xc4\x54\xfa\x98\x18\x52\x9c\xbe\xae\xa6\x3c\x41\x5c\x73\x8e\x42\x5b\x49\xb8\x0b\x2a\x6d\xfd\xc4\x55\xff\x55\xf0\xae\x01\xf9\x8b\x35\x0b\x5c\xb6\x10\x17\x94\x5c\xd5\xa8\x4c\x3e\x34\x5e\xd8\x78\x04\x0c\xbb\x61\x00\x3d\x06\x6d\x25\x93\xb6\xce\x6b\x9d\xe1\x55\x68\xab\xcc\x3b\xb2\x98\xc1\x14\x77\x40\x37\xf2\x78\x42\x48\xb7\xae\xda\x4f\x21\x1d\xf1\x56\x32\xd3\x83\xe1\x67\x31\x80\x1e\x87\xb6\x52\x48\x5b\x4b\xd3\x76\x5d\x15\x7e\xb7\xf3\x32\x4a\xeb\xc8\x62\x2e\x5e\x1d\x72\x5b\xee\x55\x3f\x64\x6f\x39\xb1\xa7\x9a\xb3\x96\xd3\xa9\x86\x03\x03\xa8\x0c\xb4\x75\x1f\xb7\xe9\x41\xe4\x28\xd4\xbc\xd2\x33\xdf\xbc\x93\xb5\x42\x45\x5d\x6e\x8c\xde\xbd\xc1\x6e\x17\x24\xf8\x73\xe4\x8b\xab\x29\xf9\x4b\x1b\xe2\x46\x58\x16\xda\x7a\x80\x1b\x1a\xfa\xaa\x0f\x08\x0b\x7a\x38\x73\xed\xf6\x98\x4c\xff\x2a\xdd\xfe\x1c\xaa\x3d\xbf\xa3\x73\xf4\xf5\xf5\xf9\xcc\xc1\xb2\x7b\x72\x36\x18\x40\x4f\x40\x5b\xa9\xb8\xbb\xae\x4e\xf4\x5b\xb4\x0a\x31\x5f\xea\x8e\xc4\x59\xd9\x89\x07\x6d\xce\x96\x24\x09\x93\x29\xdc\xc8\xd3\x78\xb8\x7d\x49\xec\x34\xb3\x0a\x06\xd0\x93\xd0\x56\x1a\x69\xcb\x45\xd4\xbc\xfc\x72\xce\x82\x35\x9d\x3d\x8b\xdc\xb8\x7d\xd4\x9b\xc7\x17\x83\x8b\xab\xf8\x72\x6d\x94\xba\xc6\x6d\xa7\xd5\x5b\x2d\x31\x80\xca\x41\x5b\xe9\xb8\x8d\x1d\x87\x67\xb3\x66\xf6\xfa\xde\x24\xb2\xc8\xae\x18\xf9\xa5\x53\x86\xdf\x8d\x3f\x70\x3d\x12\xe3\xd9\xb3\xf3\x59\xd9\xd1\x6f\x51\x1f\x03\xa8\x3c\xb4\xf5\x90\xb4\xe5\x2a\xa5\xfb\xb0\x64\xed\xaa\xb0\x85\xcf\x4d\x7b\xc2\xc5\x61\x3f\x3a\xb5\x1e\x09\xfa\xc5\xbf\x31\x34\x43\xdb\x8c\xf9\xc9\x1f\x0c\x30\x80\x9e\x82\xb6\x32\x70\xe7\xa3\xa4\x71\xba\x55\xac\xdd\xd2\x07\xab\x2f\xc1\x2d\x1a\x3f\xfc\xed\xeb\x7e\xaf\x12\xe2\xc6\x66\x22\xab\x4d\xd4\x6e\x9f\x1f\x21\xc3\x00\xaa\x00\x6d\x65\xe2\xe6\x9c\x0d\x63\xc2\xe5\x29\x8b\x3f\x63\x9a\xe4\x85\xe6\xb9\x1a\x3a\xa1\x34\xe9\xf5\x5a\xee\xa6\x3f\xbd\x1f\xea\xaa\x90\x83\x76\x49\x0c\xa0\x8a\xd0\x56\x16\xee\x8e\xe4\x93\x88\x50\x97\xe6\xa6\xa6\xf4\x7c\xc3\x6b\x42\xf4\x3d\x55\x4f\x41\x92\x79\xf4\xfd\xa6\xa0\x0e\xda\x50\x82\x88\x3b\x39\xf1\xb3\x57\xfa\x8f\x81\xed\xbf\xfe\x10\xe4\x7f\x06\xb6\x6c\xd2\x1f\xae\xfd\x60\xf2\xfc\x8a\xf2\xfc\x7d\x5a\xe3\xbf\x0f\x12\xe9\x4f\x64\x1d\x1b\xd5\xd2\xcc\x9e\xe0\xcb\xd5\x1b\x73\x59\xf3\xe0\xaa\x76\xc7\x00\xaa\x0c\x7d\x23\x8f\x48\x5b\x6d\x12\xbe\x3a\x22\xbe\x72\xef\x35\x17\xc4\x84\xea\x42\xe3\x4a\x79\x79\x63\xc4\xe6\xa4\x86\x29\x9c\x2a\x73\x2f\x7f\xef\x0d\x20\x5e\x04\x55\xa0\xad\xc7\xa4\x2d\xe1\x3c\xa9\xb0\x31\xbd\x53\x79\x67\xde\xbf\xcd\xeb\x76\x68\xf0\xe7\x7c\xd4\x2b\x24\xa2\xa4\xd4\x3f\x20\xe1\x99\x94\x73\x74\x88\x38\xb0\x9d\x86\xb6\x72\x70\xc3\x9f\x07\x42\x35\xfc\xa1\xe2\xad\x74\x9f\xf2\x49\x43\x9a\x5c\x76\x4b\x51\x3e\xbe\xa6\x7d\x34\xeb\x99\x6f\xc8\x44\xfb\x78\x4e\xed\xc5\x00\xaa\x0a\x6d\xe5\xe2\x2e\xa8\xef\x8d\x36\xab\xd9\x52\xaa\x18\xf7\x47\x3b\x5f\xbc\xcf\x26\xa9\xea\xcc\xe8\x64\xf9\x99\xc3\x97\xfb\x2a\x21\x3b\xa5\x23\x82\x38\xe0\xaa\x41\x5b\x79\xa4\xad\xbb\x07\x6e\x6b\x5b\xf4\xad\x89\x6c\x98\xda\xce\x7a\xcc\x44\x4e\x7c\x43\x59\x32\x64\x6e\xd1\x5e\x7e\xe9\xef\xb3\xf6\xfb\x62\x9b\x23\x06\x50\x75\x68\x2b\x9f\xb4\xe5\x71\x3b\xef\x49\x44\xda\x3d\xe9\x03\x6f\x9f\xf8\xa5\x2a\x75\x28\x18\xb5\x2b\xb4\x44\xb5\xbe\x60\x5c\xcd\xbd\x4c\xa1\x67\x58\x4e\x3c\x51\x34\xa0\xad\x27\xb8\xe7\x6f\x12\x98\x16\x6b\x7a\x9d\xbd\x73\x41\x5f\x61\xbd\x52\x85\xd6\xef\xbd\x55\xb1\xdf\xd9\x99\x9e\x5f\x8c\x36\x0f\x9a\x0b\x3d\x43\x1c\x70\x35\xa1\xad\xa7\xa4\xad\xd2\x88\x7a\x7b\xb6\x8c\xb5\x68\xf5\x93\x2e\x23\x49\xe7\x16\xbf\x71\x70\xa9\x94\x94\x7a\x95\xc4\x29\x24\xae\xd4\x5c\x13\xf9\x4a\x1c\x66\xce\x40\x5b\x05\xb8\x8b\xa0\xc2\xfd\xe9\xe9\xea\xf8\xac\x91\xc2\x1a\x95\xae\x3f\x39\x26\x3e\x1f\x39\xda\xdb\x5d\x19\xe4\x1e\x33\xc9\xce\xec\xfa\xf2\x13\x77\x5c\x5a\xd0\x56\x21\xee\xa4\xab\xe3\x8a\x21\x53\xf4\x8a\x7d\x74\xcf\x6d\xf2\x0a\xa5\xae\x8c\xe4\x73\x30\xf9\x48\x85\xfe\xf5\x8f\x6f\x92\x8c\x75\x06\x1f\xa8\x31\x80\x6a\x43\x5b\x45\xa4\x2d\xb3\xfb\x77\xee\x28\x32\xf3\xd9\x65\xdd\x13\x68\xfd\x7a\xb8\x6b\xb3\x6c\x67\x28\x29\x89\xb0\xf3\x87\x8d\x43\xbb\xd8\xf3\x58\x84\x1c\x06\xd0\xb3\xd0\x56\x31\x69\x8b\x71\x7d\xaf\x82\x50\x03\xab\xd7\xef\xd5\x83\x2a\xfb\x55\x4f\x6e\x70\x3e\x6e\x38\x96\x73\x28\x5c\xd1\x4f\x79\xb0\x9d\xfc\x95\x1e\x71\xb7\xab\x03\x6d\x3d\x23\x6d\x05\x2f\x83\xc2\x67\x34\x67\x79\xad\x8f\x88\x31\x6a\x4b\xca\x3d\x71\x8a\x4f\xd6\x2c\x3d\xb7\xd4\x92\x45\x27\xc3\xc1\xf3\x2d\x98\xb8\x10\x9f\x83\xb6\x4a\x70\x77\x37\x63\x7c\x2f\xd4\xd9\xd1\xac\x18\xf7\xf7\x77\x04\x27\x2f\x56\xbc\x21\xfc\x63\xac\xfc\xc1\xf9\x52\x23\xbc\xb0\x93\xf5\xed\xcb\x6b\x18\x40\x75\xa1\xad\x52\xd2\x16\xbd\xef\x95\x51\x1d\xce\x33\xec\x85\x0c\xa9\x52\x94\xd2\x82\x1b\x8a\xfb\x42\x29\x37\xb6\xf7\xdb\x9d\xb6\xb5\x20\x17\xf2\xb8\x46\x1c\xb2\xf4\xa0\xad\x32\xdc\x57\x43\x5f\xe4\xc2\x44\xff\x14\x18\xed\x78\xe9\x95\xbf\x69\x14\xbd\x19\x6e\xa1\x2b\xdd\xc8\x65\x15\xd5\xcd\x90\x99\xa4\xfa\xef\xad\x16\x06\x50\x7d\x68\xab\x1c\xf7\x0d\xc1\xd1\x1a\xf6\x8b\x4a\x5f\xdc\x92\x9e\xf5\x6c\x95\x1a\xab\x91\x1f\x8e\x94\xa0\x3b\xfc\x36\xe9\x23\xd9\x9b\xa0\xd9\x4b\x2d\x04\xe2\xe6\xc2\x00\xda\xaa\xc0\x3d\xdf\xf5\x56\xe0\x03\x41\xa8\xbf\x3f\x40\x40\x4a\xcb\xbe\xff\x97\xfa\xbb\x87\x0c\xd1\x1c\x5f\x16\xe9\xbb\x14\x90\x2b\xd1\x95\x03\xc4\xcd\xc5\x79\x68\xab\x92\xb4\x25\xf1\x8e\xb0\x50\x24\x53\xd8\x94\x11\x90\x51\x9c\x11\xdb\x9a\x3f\xf1\xfa\xdd\x27\x9f\xeb\xe1\x63\x52\x21\xe6\x91\xfd\x3d\xdd\xc4\xf5\xcb\x10\xda\x7a\x4e\xda\xba\xae\x76\x36\xd6\xb7\xfa\x8f\xa2\x4a\x58\xac\x5f\xdf\xd3\xfd\x9f\x54\xab\x4f\x2c\xf6\x36\x6d\x8b\x34\xa7\x1e\x97\x6b\xb9\x56\xaf\x8c\x01\xd4\x08\xda\xaa\xc2\x3d\xa2\x40\x79\xf3\x8d\xaf\xa4\xcc\xf3\xeb\x34\xae\x9f\x56\xff\x68\x70\xba\x4a\x68\x4e\x6d\x16\xf8\xb8\x89\xa4\x7e\xe3\x59\x16\x53\x13\xc0\x00\x7a\x01\xda\xaa\x26\x6d\x59\xb3\xb5\xff\xf8\x1d\x1c\x15\x94\x1d\x12\x4b\x9f\xc1\x17\x26\xdb\x99\xfe\x8e\x57\x76\x95\x67\x73\xed\xdd\x38\xcd\x8e\x5c\x95\x09\x06\x50\x63\x68\xab\x86\xb4\x65\x7a\xa3\xf1\xe6\xbc\xe2\xef\x0d\xa6\xd1\xb3\x2f\x63\xef\xc5\x0e\xac\x1c\x52\x4b\x37\xac\x98\x9b\x71\xe1\x09\x5f\x5a\xef\x59\x20\x1e\xf7\x26\xd0\x56\x2d\x69\x2b\x89\xce\x58\xc0\x6a\xcd\x51\x5f\x66\x88\x5d\x2a\xbc\x7b\xa0\xff\x1f\xdd\x5e\xff\x71\x81\xd9\xf0\xbd\x99\xae\x29\xda\x71\x37\x88\x9f\xfd\x45\x68\xab\x8e\xb4\x45\xcb\x5f\x52\xa2\x3c\x7e\x3c\xb3\xa2\xa5\xc6\x89\x3a\xbb\x74\x71\xdf\x6c\xe0\xe3\x26\x87\xe9\x6b\x33\x32\x94\x31\x3c\xa3\xc5\x07\x31\x80\x9a\x42\x5b\x2f\x48\x5b\x3b\xe7\xdc\x7c\x9e\x3a\xc6\xdc\xfb\xe3\x51\x3c\x75\xc0\x4c\xae\x44\xd1\xc6\x20\xac\x6d\x5f\xe1\xc8\x87\xd1\x5e\xea\x99\xd4\x50\xe2\xa6\xe7\x12\xb4\x55\x4f\xda\x9a\x0b\xfe\x4a\x96\xf3\xb4\xc4\xcf\x9d\x91\x3e\xe9\x91\x82\xee\x1f\x9a\xb1\x22\x3e\x02\x5b\xfa\xac\x6f\x99\x03\xbb\x58\x95\xb6\x31\x06\x50\x33\x68\xab\x81\xb4\xf5\xce\x6b\x3b\xf4\xd9\xfb\x58\x43\x91\xd5\x98\xe7\xcc\x8c\x1f\xab\x44\x99\x4a\x79\xcb\x8e\xf9\x26\x3a\x52\xc7\x97\x0e\x7a\xb9\x13\x8f\x7b\x73\x68\xab\x91\xb4\xa5\x5c\x4b\xa1\x98\xe2\x31\xf7\xf7\x41\x17\x55\xdf\x75\xf2\xda\xa3\x8f\xe5\xe3\x24\x56\xaf\x19\x32\x39\xb1\xbb\xf5\x7f\xd0\xfa\x4d\x1c\xbc\x2f\x43\x5b\x4d\xb8\xe1\xef\x3d\x03\xff\x63\xf3\x75\x84\x37\xb1\x7e\x97\x95\x75\x88\xff\xdb\xe4\xa7\x59\x31\xcd\x7e\xb7\x31\x0a\xd1\xb4\xf4\x8c\x6a\x0f\x0c\xa0\x57\xa0\xad\x66\xd2\x96\xde\xfa\x64\xd4\x64\x43\xf5\xea\xad\x4f\xe2\x6d\xc7\xb5\x6e\x78\x5d\xd0\x68\xcc\x4f\x5e\x79\x4e\x76\x6e\xbf\x64\xe7\xf5\x06\x7e\xe2\xe6\xc2\xe2\x3f\x06\xb6\xff\xfa\x73\xdc\xff\x19\xd8\x5a\x48\x7f\xf8\x7d\xd4\x4e\x8b\x4b\x00\x3c\xba\x70\x63\xf5\x6c\xe9\xb7\x6a\xca\x4b\xa9\x0f\xa7\x62\x7a\xaf\x8c\x49\x66\x5b\xdc\x9b\xb9\xf8\x9d\xb8\x4b\xb2\x84\xbe\x91\x56\xd2\xd6\xcd\xbc\x53\x65\x29\x6b\xd5\x08\x73\x0d\xc5\xc5\x8a\xc3\xe4\x9f\x14\x65\xfe\xa6\x50\x7f\xac\xdf\x92\x1f\x27\x93\xfc\xd2\x1b\xb7\x07\x03\xa8\x15\xb4\xd5\x86\x7b\xf6\xa9\xe8\xe3\x4c\xf0\x8c\xea\x93\xbb\xdb\xfc\x0a\xc3\xcf\x0f\xcf\x5e\x13\x4f\x00\xb4\x07\xde\x44\xed\x34\x10\xc8\xf6\x9f\x4e\x24\x1e\x90\xd6\xd0\x56\x3b\xee\x75\x59\xbe\xbd\x95\xc9\x11\x9f\x9c\xd3\x58\x41\x2f\x12\x4d\x93\x3b\x73\x91\x36\x5b\x92\xd2\x6c\x69\xdf\xd9\xd9\xa8\x9c\x2c\x57\xe2\xce\xc6\x06\xda\xea\x20\x6d\xe9\x9e\xef\x3d\xfc\xfc\xa2\xc6\x82\xed\x75\xab\xa8\x73\xcc\x94\x6d\x56\xf4\x4f\xc6\x3b\x7c\xc7\xd5\x9e\x6d\x60\xcf\x4e\xc9\xda\x10\x2f\xf4\xb6\xd0\xd6\x4b\xdc\x9d\xac\xd5\xcb\x8f\xb5\x92\xc2\x6b\x64\x72\x95\x3e\x53\x9f\x5b\xd8\x46\xcb\x26\xac\x58\x67\xbc\xcf\xd7\x99\xaa\xa7\x08\xf7\xfd\x20\xee\x20\xec\xa0\xad\x4e\xd2\xd6\x82\xa0\x87\xe8\xa9\x68\x23\xdb\x37\xd2\xc5\xa1\xe4\x2b\xb9\xc7\xbf\x47\xfa\x91\x37\x9d\xfa\x74\xa5\xd2\xa0\xa2\x7d\x8e\x26\x9b\x06\x03\xa8\x3d\xb4\xf5\x8a\xb4\x75\x2e\x8b\xe6\xd4\xc6\x7a\xcb\x78\x5c\x04\xe1\xc3\xa5\x89\xb9\xfd\xcc\xcf\xb8\x84\xb3\xa3\xed\x67\x4c\xa6\xbe\x2a\xc9\xa3\xde\xc4\x83\xfb\x2a\xb4\xf5\x9a\xb4\xd5\x58\x9a\xf6\xf6\xd2\x9b\x07\x53\xd7\xdc\x0a\xc8\xe2\xcb\x9c\xb4\x5b\x5b\x8e\x14\x3e\x12\x2b\x61\xe5\xbc\x7e\xe2\xe9\xbf\x1b\xe7\x5c\x31\x80\x3a\x40\x5b\x6f\x48\x5b\x8f\x2f\x05\x9c\x66\xc9\x1d\xd9\xb8\x62\xbb\x47\xdf\x6e\x3c\xfd\x71\x5b\xbe\xc6\x9d\x27\xa7\x3a\x42\x9a\xa2\x8f\x7e\x54\x2a\x74\xb7\xc5\x00\xea\x08\x6d\x75\x91\xb6\x14\xaa\xda\xeb\x72\x7a\x42\xe4\xa8\xcf\xbf\x4a\xd0\x0a\xe4\xd4\x73\xf8\x80\x0d\x1e\x5b\x04\x6e\xc1\x6f\xbb\x5a\x12\xa2\x63\x88\x9f\x97\x13\xb4\xd5\x4d\xda\xca\x28\x9e\xd3\xd2\xd0\x2d\x65\x39\x7b\xc1\xfb\xda\xf1\x30\x72\xf1\x5f\xf5\xa1\x32\x43\x85\x17\x4c\xee\xb9\xad\xbf\x5e\x79\xfc\x8a\x15\x03\xa8\x33\xb4\xf5\x16\x77\x3e\xaa\xc7\xda\x78\x6d\xcd\x47\xb4\x9d\x08\x3d\xe8\x21\x96\xd1\x26\x6b\x64\xac\xcc\x7f\xe1\xfc\xe1\xa7\xae\xcc\x06\x3c\x87\x0e\x12\x17\xf5\x6b\xd0\xd6\x3b\xd2\x56\x60\x36\xd5\x44\x21\x78\x99\x27\x8e\x1d\xa6\xc9\xad\x91\xae\xfc\x13\x2e\x96\x5b\xf2\x6a\xd5\x6b\x56\x71\xfa\xf6\xfa\x25\x63\xe2\x66\xec\x3a\xb4\xd5\x83\x6b\x5d\x37\x19\x2a\x53\x7a\x6f\x9a\x60\xda\xa2\xe7\xdb\xa8\xc8\xfc\xfd\x57\xd3\x9e\x9f\x57\xff\xf6\x7d\xfe\x90\xae\x68\x98\x77\x80\x38\x64\xb9\x40\x5b\xbd\xb8\xc1\xa8\x41\xe5\x96\xf5\xba\xd2\x87\xe9\xaa\x50\x1f\x07\xce\x34\xb2\x44\xbf\xd1\xf8\x73\xe7\xee\xb5\x98\x22\x9e\x77\x3a\xf4\xca\x2d\x30\x80\xba\x42\x5b\x7d\xb8\x81\x2d\x2f\x8e\xc0\xe1\x99\xf3\x75\x5b\xe2\xd6\x64\x41\x71\xfe\x1e\xdf\x43\xb7\x7a\x6e\x21\x57\xa4\xee\x1f\xde\xd0\x2a\x7c\x2d\x6c\x8a\x01\xd4\x0d\xda\xea\x27\x6d\x91\xb7\xd8\x0f\xea\x1a\xb9\x70\x9b\xa4\x44\xbe\xbb\xee\x94\x75\xd0\xf2\x17\x0b\xbd\xd5\xd1\x3d\xb7\xa7\x2c\xea\x0e\x07\x3c\xd2\x38\x85\x01\xd4\x1d\xda\x7a\x8f\xdb\x5c\x4c\x39\x53\xd9\x0d\xbc\xa8\xdc\x06\x23\x3e\xba\x12\xb2\x3c\xfa\xd5\xd1\x4a\x9a\x82\xe7\x92\x8c\x4c\x0a\x3b\xef\x15\x98\x10\x37\x63\x1e\xd0\xd6\x00\x69\x6b\x43\xa2\xa1\x38\xb5\xce\x90\x92\x27\x8b\xc9\xf2\xfe\x30\x95\x60\xa2\x83\xeb\x75\x95\x62\x84\xcf\x22\xe7\x73\x80\xa9\x75\xdf\x21\x0c\xa0\x9e\xd0\xd6\x20\xee\x59\x9e\xca\x28\xfe\xef\x6a\x7e\xd6\xe7\xdd\x23\x9d\xf8\xb5\x94\x9d\x67\x59\xed\xfa\xed\xec\xa4\x4a\xfc\x93\x06\x23\x09\xf7\x32\xf6\x63\x00\xf5\x82\xb6\x3e\x90\xb6\xde\x54\x9b\xd5\x95\x52\xa9\xcd\x3e\xb5\x96\xff\xd7\x40\xc6\x23\x49\x71\xc3\xc9\xf1\xe6\x9d\xeb\xa9\x45\x1f\x06\x62\xe8\xca\x5f\x53\x62\x00\xf5\x86\xb6\x86\x48\x5b\x62\x0a\x73\xb4\x16\x32\x9b\xc6\x77\x7b\xe5\x29\xfe\xfc\xd5\x72\xfe\xf3\x82\x82\x10\x95\xa6\xf7\xae\xbe\x6d\xf3\x08\x6f\x9a\xa1\x2e\x06\x50\x1f\x68\x6b\x18\xb7\x41\x37\xec\xb9\xa0\xbe\x7f\xe3\x46\x87\x1a\xff\x83\x54\x3a\x72\x01\x8f\x66\xb3\x7b\xee\x89\xb1\x67\x4c\xde\x7d\x6a\x55\x4a\x5d\xd3\xc0\x00\x7a\x03\xda\x1a\xc1\xdd\x89\x67\x97\x49\xb5\xda\xbc\x17\x1a\xd4\xf6\xd8\xf3\xec\xd7\xf7\xcd\x6f\x99\x55\x22\x2b\x4e\xfb\x4d\xb6\x1e\xa3\xdb\x0d\x69\x0e\x24\x5e\x3b\x7c\xa1\xad\x51\xdc\x57\xee\x87\x62\xdf\xbc\x4c\xf9\xe5\x5f\x39\x36\xd4\xfc\x75\x7a\xc9\x6f\xdb\xab\x8a\x2a\xf4\xae\x8c\x6f\x02\xdd\xcf\xf7\x8f\x76\x8a\x88\x9b\x57\x3f\x68\xeb\x23\x69\x6b\xd2\xc6\x7f\x2c\xa4\x4d\xf1\xc4\x89\xd8\xd8\xae\x5b\xbc\x54\x87\x07\x3d\x37\x19\x5e\xbd\xd6\xcd\x8e\xe4\xdc\x8a\x3c\x12\xf5\x89\x38\x94\xfa\x43\x5b\x9f\x48\x5b\x4a\x15\x9b\xbd\x31\x79\x4f\x5a\xd9\x7a\x3d\x92\xef\x9b\x2a\x2e\xef\xb7\x6d\xbc\x5b\xc4\x11\x3b\xc9\xfd\x64\xec\xf7\xc6\x7b\x17\xe2\xb1\x1a\x00\x6d\x8d\x91\xb6\xfa\xa6\x37\xf3\xe7\xd7\xfc\x8e\xf2\x9d\x68\x7f\xec\x36\xd2\xd6\xa6\x2d\xb4\x2c\x94\xd2\xc0\xfe\xd9\x64\xc0\x2b\xef\xd4\x43\x77\xe2\xf9\x18\x08\x6d\x8d\x93\xb6\xae\x9d\x48\xa0\x13\xdb\x0e\x72\xb5\x4d\x89\xba\xa7\xf5\xe9\x1c\xcf\x57\xc7\x20\x5f\x56\x71\x15\x2e\x95\x0e\x37\x3d\xf1\xd4\xa6\x33\x18\x40\x6f\x42\x5b\x9f\x49\x5b\xf2\xd4\xab\x29\xd2\xa2\x31\x81\xf9\x82\x45\x36\x2f\x7b\xd8\xa5\x03\x99\x58\xcd\xa4\x0e\x8a\xb1\x8a\xd0\xe8\x16\x5f\x5e\x11\x66\xc6\x00\x1a\x04\x6d\x4d\xe0\x5a\x33\xe2\x37\x14\xf8\x2f\x14\x53\x58\x3e\xc8\x38\x90\x36\x10\x93\xf0\xcf\xf9\xd6\xc6\xfd\xbc\x83\x47\x4f\x90\x89\xa9\xc7\x79\x19\x60\x00\x0d\xfe\x8f\x81\xed\xbf\x50\x94\xff\x19\xd8\x26\x49\x7f\xf8\x5f\xd3\x27\x5a\x49\xcc\x6c\xce\x37\x94\xe7\xef\xe7\x24\x1d\x91\xec\x4e\xe2\x69\xb8\x3d\xd8\xb9\xe7\xc3\x77\xb1\x26\x3e\xa5\xbb\xc4\x89\x38\x04\xfa\x46\xa6\x48\x5b\x91\x67\xca\x06\x9e\xf4\x1b\x26\x9c\x62\xf1\x9f\xd2\x41\xb5\x5e\x95\x89\x9c\x9a\xc8\xa3\x53\x33\x0c\x1a\xf7\x68\x3b\x51\xd3\xc6\x83\x01\x14\x83\xb6\xa6\x71\x27\x9d\x8a\xeb\xf1\xbf\x03\xad\xc5\x7b\x96\xc2\x7e\x89\xbe\x5d\x76\xbd\xc3\x9b\x2f\xf7\x22\x8d\x8c\x56\xf9\x30\x75\x21\xfd\xcf\x1b\xc4\x0b\xc4\x2d\x68\xeb\x0b\xee\x2b\x51\xe6\x44\xa9\xd4\xcd\x89\x9e\x97\xeb\xbf\xe4\x4d\x77\xe8\x4f\x6b\xda\xaa\x7a\x15\xd0\xa1\x06\xae\xf7\xb4\xcf\xa9\x7c\xa6\xa6\xc5\x00\x1a\x0a\x6d\x7d\x25\x6d\x85\x2b\x7e\xb9\x9c\xd5\x3f\x7d\xc1\xc2\x38\x3a\xcd\xed\x87\xe9\xfb\xea\x9f\x4c\x1b\x83\xd7\x17\xf7\x07\x0b\xe4\x08\x4b\xa7\x08\x1e\xc0\x00\x1a\x06\x6d\x7d\x23\x6d\x99\x88\x5c\xff\xe2\x73\xe3\xbe\xfc\xfc\xf9\x3c\xc1\x20\x41\xee\xf2\x97\x52\x2a\x97\x2b\xcf\xed\x15\xe6\xe6\x97\xb0\x20\xe3\xa4\x64\xc2\x00\x1a\x0e\x6d\xcd\x90\xb6\xea\x12\xc4\x9a\x2e\x1d\xb4\x3c\x5f\x7c\x8d\xed\x8f\x74\xb8\x80\x95\x42\x87\xe9\xec\x1b\xa3\x3d\x2a\x13\x01\xed\x15\xde\x34\x37\x45\x30\x80\x46\x40\x5b\xb3\xb8\x3b\xa5\xd9\x9d\x81\x98\xb4\xad\xdd\x65\x8e\x1a\xeb\xe5\x7a\xad\xe0\x80\x93\xb2\x9b\x53\xdd\xbc\x52\xaa\xf7\xad\x8f\x9f\xca\x9a\xbd\x8c\x01\x34\x12\xda\x9a\x23\x6d\x19\x55\xb8\x31\xce\x55\xdf\x0a\xa0\x4f\xe5\xfd\xcd\xeb\xfe\x63\x33\x98\xa3\xa6\x71\x3d\xdf\xc1\x62\xc9\xb2\x95\xed\x65\x9e\xca\x61\x0c\xa0\x51\xd0\xd6\x77\xd2\x16\xf7\x0b\xd6\xac\x65\xf3\xe0\xb7\xa6\xb2\x13\x3d\xdd\x4f\xdd\x53\xdd\x27\x17\xfa\xcd\x2c\xbc\xec\x06\xc7\xcb\x1f\xb7\x6c\x60\x2c\x18\x40\xa3\xa1\xad\x79\xd2\xd6\xf3\xa8\x4e\x6a\xa9\x01\x75\x3f\x47\x29\x7b\x2e\x73\x26\xcc\x9b\x25\x77\xbd\xa3\x4d\x23\xab\x79\xea\x59\x42\x52\x80\x40\x97\x18\x06\xd0\x18\x68\xeb\x07\xee\x2e\xe2\x73\x97\xf7\xee\x8b\x9d\x2c\xeb\xcf\x4c\xed\x3c\xfd\x5c\x72\x5e\xe6\x4d\x19\x75\x97\xd1\x8c\x35\xbd\xb0\xaa\xb6\xb7\x5e\xd2\xc6\x00\x7a\x1b\xda\x5a\x20\x6d\xdd\x92\x93\xf7\xf2\xf1\xdb\xa4\x90\xce\x2a\xfb\x7c\x3a\x84\xa7\xcf\x28\xfe\xdb\x76\xcf\xf7\xec\xf7\xf4\xe9\xf3\xc6\x6b\x41\x7d\xc4\x0b\x57\x2c\xb4\xb5\x88\x7b\x2e\x88\x7e\xfa\x30\x87\xde\xfe\xb3\x76\x94\x0f\x13\x25\x64\x66\x92\x0e\x17\x52\xb6\x6c\x7d\xa3\x35\xb8\x9a\xb2\xeb\xf0\xaa\xe6\xa9\x35\x06\xd0\x3b\xd0\xd6\x12\x69\xab\x7b\x20\xff\xe5\xa1\x29\xae\x98\x94\xd8\x2b\xb4\xa6\x0c\xef\x38\x05\x2c\xbe\xd2\xe7\xc7\xfd\x56\x39\xf5\x63\x25\x99\x1f\xcb\x50\xc6\x00\x7a\x17\xda\x5a\xc6\x6d\xc6\x0c\x24\x7c\x3c\x6e\x3e\xfd\x15\xc7\x6d\xb9\x50\x13\xfd\xc4\xec\xd2\xbc\xe4\x43\x86\xc3\xab\x5f\x25\x6d\x5e\x56\xd8\x49\x05\xd9\x60\x00\xbd\x07\x6d\xad\x90\xb6\x14\x3b\xf2\x0b\x1d\x4e\x8b\x70\x6c\x2b\x81\xa3\x25\xef\x54\x02\x6a\x8b\x4d\xaf\x29\xac\xdb\xdf\x54\xb3\x0a\x3e\x7d\x5c\xfe\x34\x1d\x06\xd0\x38\x68\x6b\x15\x37\x34\x94\x6e\x94\x50\x34\x6c\xb2\x46\x7f\x7b\xbe\x14\xb7\xcf\x5c\xe9\x80\x55\xa3\x68\x75\x61\xe3\xdb\x95\x78\x46\xcb\xb7\x5e\x11\x47\x31\x80\xc6\x43\x5b\x6b\xa4\xad\xe4\x31\xed\x8e\x20\xd3\xab\x63\x8e\x72\x8b\xf4\x7f\x0c\x5a\x3c\xfe\x6d\x66\x6b\x1b\x88\xdb\xd8\xea\x5f\x19\x5a\xa7\x11\xed\xb7\xc4\x00\x9a\x00\x6d\xad\x93\xb6\xfa\x7f\xba\x93\x4d\xf1\x88\x3a\x50\x86\x71\x1e\xcc\xdc\xfb\x6f\x1c\x6d\x0c\x7a\x42\xd3\xe2\x61\xa3\x54\x28\xcb\xdf\xdf\x52\x86\x62\x00\x4d\x84\xb6\x36\x48\x5b\x67\x6f\x3b\x4c\x76\xf2\x07\xf6\xb7\xc9\xa4\xf7\x34\xfd\xd1\x0b\x78\xde\xf1\x19\x24\x29\x14\x7e\xca\x61\x59\xc9\xa3\x70\x4c\xb9\x82\x01\x34\x09\xda\xda\x24\x6d\x21\x2c\x9b\xb2\x1f\x53\x55\xe8\xf7\x67\xc9\x3f\xf1\x7d\xe0\x77\x3b\xb5\xbb\xe5\xe6\x6d\x4b\x17\xdf\x85\xce\x1c\x41\xfe\xaf\x72\xea\x18\x40\x93\xa1\xad\x2d\xdc\x5d\xfd\xb0\x6e\x99\xda\x8d\x71\xba\xc7\xe4\x81\xcc\x21\xb7\x10\x7e\xab\xbe\x81\xe4\x87\x47\xf9\x7e\xba\xa9\x46\xf3\x09\x66\x69\x10\xd7\x89\x14\x68\xeb\x27\x69\x6b\x6a\xb9\xb1\xcf\xa8\x71\xcf\xb5\xf8\xc7\x9d\x7b\x9e\x2e\x4c\x5a\x6b\xba\x3b\xdf\x56\x14\x3c\x87\xc5\xf6\xec\x8d\x2a\x11\xe6\x37\xc7\x00\x7a\x1f\xda\xfa\x85\x5b\xbf\xfa\x27\x38\x13\xb8\x9c\x05\x2d\xcf\x53\x88\xda\x0e\x1e\x3a\xfb\x91\x7d\xf6\x2d\x27\x2a\x8f\xba\x62\x4c\x2e\xd5\x93\xf7\x89\x43\xe9\x03\x68\x6b\x9b\xb4\x75\xcf\x95\x7d\x57\x25\xfc\x65\xa2\x80\x7f\xc0\x41\x39\x2e\xfa\xc7\x0e\x91\x8a\x5f\x7e\xa8\x6d\x14\x46\xb9\xf9\x31\xef\x0c\x7f\x21\xfe\x1e\x53\xa1\xad\x1d\xdc\x5d\x31\x19\xc7\xfa\x95\xd2\x9c\xa9\x0e\x5a\xc5\xa8\xfd\x01\xb9\xe7\x2e\x8c\xff\xab\x09\xad\x9c\x09\x9f\xdd\xb7\x73\xe0\xad\xc0\xaa\x03\x06\xd0\x34\x68\xeb\x37\x69\x4b\xee\xa3\xdd\x5d\x9e\xea\x2b\xb5\x17\xfb\xe6\xb6\x0a\x8f\x19\x22\xc9\xdc\xef\xa4\x56\xeb\x4c\x5a\x34\xd9\x8f\x69\xbd\x09\x75\x3b\x86\x01\x34\x1d\xda\xfa\x43\xda\x12\x02\x05\xc3\x7d\x71\x66\x89\x56\xf5\x5a\xbd\x41\x9d\x35\xf3\x7b\x78\x0e\x1d\xf2\x1a\xe6\x9f\x34\x78\x94\xa6\x7a\xa8\xb6\x4b\x09\x03\xe8\x43\x68\xeb\x2f\xee\x59\xb1\x0b\x4d\x51\xde\x67\x57\xc8\x5e\xfa\x1f\x7a\xf0\x5b\xd1\xc9\xfa\x58\xaf\xfa\xe9\xa7\xe7\xfd\x56\x08\xf4\x66\xef\xfa\xc5\x3f\x13\x37\xfb\x19\xd0\xd6\x3f\xd2\x16\xeb\x8e\x8b\xd6\xd0\x82\x47\x72\xd3\xd9\xa9\x5d\x89\x91\x2b\xb1\x8f\x1f\x85\x5e\xbf\x79\x37\xc0\xfb\xca\x70\xdb\x63\xf1\x58\x51\x41\x0c\xa0\x99\xd0\xd6\x2e\x69\x6b\xe4\x17\x85\xf7\x73\xee\x97\x61\x26\x04\x0e\x97\x3f\x4b\x3b\xd1\x66\x17\x58\xda\x69\xa9\x93\x6f\xb3\x54\x9a\x0f\x9d\xad\xf9\x7f\x77\xbc\xb3\x20\xad\x5e\xd6\xff\x6f\x34\xdd\xff\x7f\x60\x03\x08\x4e\x5c\x53\x2c\xff\x58\x15\xb5\xe1\x7b\xd5\x3c\x29\x4e\x3c\x3a\xab\xe1\x64\x4b\xee\xcb\xd7\x64\x9a\xad\xe4\x74\x81\xa5\x07\x75\x29\xd5\x89\x23\x31\x54\x5c\x03\x08\xce\x5c\xab\xcb\xfb\x4a\x98\x1d\xf5\x78\x1a\xc4\x31\x04\xfe\x6a\x3c\x2a\xf1\x36\xc8\xab\x6b\x4f\xb6\x3b\x25\x9f\x83\xf5\xcf\xc5\xa7\x11\xc7\x2c\xa8\xb9\x06\x10\x9c\xba\xb6\x56\xf8\xaa\xfb\xbe\x6a\xee\xf7\x7f\x5c\xb5\x82\xdf\x57\xc4\x3a\xed\x9b\x76\x3e\xeb\x1e\xac\x36\xd2\xd7\x7a\x7c\xb3\x9d\x56\x5c\x1c\x03\x28\x54\x5d\x03\x08\xce\x5d\x93\x23\x58\x16\x9e\xec\xb0\xfc\x3d\xe4\xa7\xf3\x31\xdf\x3e\xff\xac\x15\xea\x79\x6b\xff\x90\x6c\x18\xe1\xef\x29\x8c\x7b\xa4\x46\x08\x03\x28\xd4\x5d\x03\x08\x4e\x5e\xdb\x9c\xe3\xcb\x74\x74\x90\xcf\x62\xa6\x63\x3c\x7f\x8c\x59\x3a\x4a\xca\x56\x36\xf9\xab\x6c\xaa\xba\xca\x53\x4d\x3a\x1b\x19\x13\x77\x0c\xa0\x50\x79\x0d\x20\x38\x7b\x8d\xf9\x2c\x99\x6d\xdb\xa8\x5e\x43\x7b\x20\x4f\xe0\x9e\xe4\xf2\x12\xcf\x4b\xa2\x9b\x4b\x1f\x76\x0e\x3c\x95\x9b\x53\x79\x7b\x97\xcb\x18\x03\x28\xd4\x5e\x03\x08\x4e\x5f\xdb\xa6\x1f\xb8\x63\xfe\xb7\x32\x0b\x2c\x9b\x1e\xca\x30\x04\xe7\x91\x99\x03\xe6\xdd\x3a\x7f\xf7\x9e\x25\xb0\xf5\x29\x86\x75\x11\xaf\x85\x50\x7d\x0d\x20\x38\x7f\xed\x4d\x67\x5c\x1d\xbd\x10\xb9\x9f\x97\x96\x0f\xdf\xe5\xa9\x43\x16\xd2\xd1\xe5\x89\xf2\xaa\x53\x5f\x0a\x57\x43\xab\x34\xab\x5e\xd9\x63\x00\x85\xfa\x6b\x00\xc1\x09\x6c\x33\xe7\x0b\x7e\x2a\x8c\x03\xf6\xfd\x35\x15\xca\x15\x32\xc9\x12\x1a\x37\xc4\x24\x36\x59\xa6\x68\xe7\x53\xba\x15\xc4\x9d\x82\x14\x31\x80\x42\x05\x36\x80\xe0\x0c\x36\x97\xbf\x3d\x77\x59\x68\x2f\x12\x62\x11\xae\x2d\xbb\x39\xdd\xad\x28\xf0\xc7\xba\xae\x2b\xa3\x69\x96\x55\xd4\x9a\x2d\x94\x8d\xf8\x99\x41\x0d\x36\x80\xe0\x14\x36\x71\x7f\xba\x80\xe5\xf7\xcf\x5b\x5b\x85\xd1\xfc\xd9\xe3\x5b\x0f\xc4\xc2\xa3\x55\x55\x63\xc8\x1f\xa9\x53\x87\xdb\x8f\x5f\x09\x76\xc3\x00\x0a\x55\xd8\x00\x82\x73\xd8\x82\xa9\x4b\xd0\x5d\x7a\x0f\x7b\x8e\xdb\x26\xfb\x7e\xa7\xbf\x65\x8f\x9c\xaa\xf0\xa4\xae\x5f\xc8\x6c\x1c\x54\xd6\xd6\x16\xa3\xd0\xc2\x00\x0a\x75\xd8\x00\x82\x93\xd8\x0c\xdf\xca\x75\x39\xa8\x15\x1c\x2a\xfa\x2b\xd2\xf5\x8b\xed\x57\x32\xcb\x94\xed\xd0\xb7\xf2\x87\x37\x5d\x0d\x25\x0d\x8e\xbf\x91\x22\x6e\xe5\xa0\x12\x1b\x40\x70\x16\x5b\x7b\xf7\x58\xfa\xd1\x72\x0e\xc5\xfe\xb3\xcf\xa9\x2a\xe3\xd9\x02\xbe\xcb\x8b\x5d\x5a\xa4\x2b\x14\x73\xbe\x54\x54\x57\x9b\xdf\xe1\x8c\x01\x14\x6a\xb1\x01\x04\xa7\xb1\xbd\x5d\x5c\xbe\xf2\x9e\x57\xaa\x8c\x7b\xd5\x6e\x20\xe4\x6a\xd6\xf1\xd2\x4b\x9d\x36\x99\x71\xcf\xad\xa3\xaf\x6a\x95\x3c\x0f\x3b\x26\x80\x01\x14\xaa\xb1\x01\x04\xe7\xb1\xe5\xf3\xef\xef\x97\x5d\x73\x0b\x0c\xe0\x98\x52\x60\x7d\xf1\xa8\xa5\xd2\xf5\x19\x4f\xcc\xfb\x8b\xdc\xfc\x47\xd5\x22\xbe\xbc\x6e\x27\x1e\xb4\x50\x8f\x0d\x20\x38\x91\x8d\x6e\xcb\x33\x96\xa3\x39\x89\x26\x82\xfb\xb1\x68\xeb\xa1\x0c\xbb\x6d\xc9\x0a\xe7\xb9\xc1\xc7\xdb\xd8\x91\x7b\xd9\xe6\x86\xda\xc4\x2b\x3f\x54\x64\x03\x08\xce\x64\xe3\x2b\x4a\xff\xd9\xbb\x3e\x6b\x67\x36\xed\x45\xb0\xfc\x2d\xe1\xa3\x6f\xc9\x2f\xf9\x6e\xd0\xa8\xec\x0f\x65\x82\x50\xd6\x62\x1c\x3f\x06\x50\xa8\xc9\x06\x10\x9c\xca\xa6\x68\xa1\xfc\xf1\xf8\x99\xd5\x8c\x13\x89\x47\x13\x9e\x17\x86\x7e\x9f\x61\xe8\xae\x76\xdf\xb7\x71\x24\xc6\x76\xf1\x66\xe4\x9f\x50\x0a\x0c\xa0\x50\x95\x0d\x20\x38\x97\xed\x7a\x5c\xa6\xd1\xde\x98\x8d\x9d\xbd\x62\x9c\x8a\x45\xdf\x1e\xc6\x8d\xc9\x7d\x91\x7d\x66\xe6\xaf\x95\x77\x03\xb1\xf2\xdf\xcc\x52\xc1\x00\x0a\x75\xd9\x00\x82\x93\xd9\xec\x29\x0d\xb8\x35\x36\x66\x07\x58\xeb\x14\x94\xf4\x73\x27\x7f\x52\x5c\x79\xbd\xad\x72\xa5\xc3\xff\x50\x56\x51\x20\x0f\xab\x3e\x1b\x06\x50\xa8\xcc\x06\x10\x9c\xcd\x26\x41\xe9\x98\x75\x57\x48\x88\x8e\x9a\x95\xd6\x3c\xc6\xf9\xca\xef\x33\xf4\xba\x21\xa1\xcf\x4f\xfc\x36\x59\x40\xbd\x6f\xcf\x6a\x11\x4f\x27\xa8\xcd\x06\x10\x9c\xce\xd6\xef\xcb\xa3\xff\xb2\x56\x80\x3a\x56\xb8\xcb\x32\xd4\x2f\x03\xdd\x14\xd5\x96\x50\xfc\xf7\xf2\xf1\xac\x7e\xa9\x93\x70\xca\x71\x7a\x0c\xa0\x50\x9d\x0d\x20\x38\x9f\xed\xfe\xa8\xd2\xad\xf3\x9a\x99\x37\xad\x02\x53\x85\x15\x2a\x82\xe9\x94\x05\x54\x32\x72\xcd\xcd\xe8\x74\xfd\x0b\x55\x13\xac\x2f\xed\xc1\x00\x0a\xf5\xd9\x00\x82\x03\xda\x18\x3a\xce\x8a\x8d\xe8\xf5\xbc\xb5\xbc\xa1\xd9\xa9\x6f\x56\x3d\xa0\x6e\x7f\x71\xc5\xf4\xa2\xf8\x75\x9f\x5c\xc1\xd7\x9f\xbd\x08\xc4\x43\x03\x0a\xb4\x01\x04\x27\xb4\x49\xee\x9e\x38\xf7\x2c\xac\xf0\xd8\x81\x25\xcd\x7c\xf5\x5c\x99\xeb\x2f\x2a\x3d\x84\xb3\x35\xb0\x80\xe0\xf1\xab\xc5\xc3\xb1\x19\x54\x18\x40\xa1\x42\x1b\x40\x70\x44\x9b\x8b\xf8\x92\xd9\xd3\x0d\xbd\xc1\x1e\x3b\x9f\xcd\x81\x6d\xe5\xe9\x33\x86\x83\x6c\xeb\x62\x99\xcd\x95\x51\x81\x5f\xc2\xff\x5d\x64\xc5\x00\x0a\x25\xda\x00\x82\x33\xda\xd4\x42\xe6\x64\x6e\x95\x31\x18\x14\x94\x7d\xa2\x31\xba\x4e\xa3\xa6\x41\xad\x51\xa9\x1e\xca\x98\x6e\xcd\x70\x80\x55\xb6\x74\x55\x06\x03\x28\xd4\x68\x03\x08\x0e\x69\xc3\xd8\x25\xb5\xa6\xe5\x6e\x3a\x4a\xd0\x05\x34\xed\xa9\x0b\xdc\xf7\x8f\x4a\x47\x59\x94\xd0\x7e\xd2\xd0\xe6\xf7\xd8\x5f\x43\x39\xe2\x0e\x12\x8a\xb4\x01\x04\xa7\xb4\x61\x29\x8c\xf7\x9b\x5a\xf4\x14\x06\x08\xa7\x78\x4e\xff\xb3\xaa\x1a\x28\xfb\x94\xc5\xa9\x5f\xf1\xeb\x61\xdc\x01\xa9\x7d\xaf\x66\x88\x17\x61\xa8\xd2\x06\x10\x1c\xd3\x66\x9c\x63\xf3\x3c\xdb\xd5\xe8\x84\x51\x9e\x59\xf8\x1d\x97\xf6\x98\x1a\xc7\x72\xc1\x36\x3b\x45\xce\xef\xf4\xf3\x8e\x72\x2f\xd6\xed\x30\x80\x42\x99\x36\x80\xe0\x9c\x36\x2b\xee\xfe\xfc\xeb\x69\xf6\x9b\x7e\x4d\x7f\xbb\x5d\x5e\xfd\xd2\x5f\x31\x74\xaa\xd5\x9a\xf1\x18\x3a\xaf\xc5\xbf\x8b\x69\xd1\x9f\xc3\x00\x0a\x73\xda\xfe\x6f\xa0\xfb\x2f\x40\xf8\x7f\x07\x3a\x1c\xd4\x56\x30\x32\x22\x3e\x5f\x46\x23\x42\xff\x72\xcf\x21\xb9\x60\x4e\xdd\xe2\xd4\xa1\xec\xc8\xec\xbf\x8e\x92\x3f\xc9\xba\xe8\xb3\x1f\x53\x63\x00\x85\x42\x6d\x00\xc1\x49\x6d\xae\x83\x33\x97\x9b\x96\x3b\x05\x19\xa4\xa5\x32\x4a\xae\x58\x6d\xb4\xda\x1e\xde\x77\xf2\x9d\x8e\x55\xdb\x7b\x1b\x3b\xb6\x85\x0d\xe2\xfe\x0e\x2a\xb5\x01\x04\x47\xb5\xd9\x0f\x0a\xca\xda\xb1\x4a\x2c\x30\xaf\xd0\x45\x2f\xc7\xf9\x6f\x53\x0b\xbc\xa6\xe1\x3b\xd7\x7b\xb3\x9f\x9a\x66\x4c\x5c\xbf\x58\x1a\x03\x28\x94\x6a\x03\x08\xce\x6a\x6b\x2b\x39\xc6\xcd\xa0\x5f\xfa\x78\x5c\x5b\xb1\x3a\x5d\xf1\x92\xcf\x25\xf2\xd4\xed\x1a\xb1\x95\x16\x89\x18\xee\x5d\x02\xdf\x61\xe2\x6f\x0c\x6a\xb5\x01\x04\x87\xb5\x69\x46\x8f\xd7\xbc\xb9\x42\x13\x10\xfa\x9b\xd1\xa0\xd3\x9a\x3a\xfa\x71\x68\x60\x79\x14\xf7\xc2\x31\xcc\x7b\x85\xac\x5b\x6a\x51\x17\x03\x28\x14\x6b\x03\x08\x4e\x6b\x1b\x38\xfb\xa9\x99\xbf\xf1\x16\xda\xea\x5a\x3c\x91\x1f\xdb\xde\xc0\xa1\x7b\x5e\xd2\x75\xd7\xcf\xb4\xbc\x63\x6b\xf6\x8a\xda\x77\xe2\x32\x03\xd5\xda\x00\x82\xe3\xda\x02\x76\xf7\x05\x3d\xec\x3f\xba\xfd\x2f\xe7\xa5\x18\x67\x0d\x6f\x66\x60\xe6\x98\x56\xdf\xf7\x15\x1d\x3a\xab\x17\x8f\xd1\xc5\x07\xc4\x49\x07\xca\xb5\x01\x04\xe7\xb5\xf9\x74\x5c\x3c\xa4\x6a\x4b\x19\xf6\xd6\xe3\x63\xed\x13\x65\xb2\x72\xfe\xa7\x14\x4a\xbf\xeb\xce\x2c\xa4\x89\xf5\xcd\x7e\xd9\xd0\xbd\x84\x01\x14\xea\xb5\x01\x04\x07\xb6\xdd\x3c\xf6\xea\x26\x8b\x68\x68\xf4\xd3\xc4\xfa\xaf\x16\x92\x9f\xec\x3c\xf7\xdc\x57\xe4\xf8\x25\x2c\xc8\xce\x61\xc5\x17\x10\xfd\xff\xb6\x66\x50\xb0\x0d\x20\x38\xb1\x6d\x78\x3f\x8b\xa6\xfb\x15\x32\x57\xfe\xec\xd2\xa3\xec\x29\xf5\xe7\xe3\x0f\x18\xbe\x51\xe2\x4a\x57\xdc\xd3\xfd\xbc\x2f\x7d\xfd\x24\x3b\x06\x50\xa8\xd8\x06\x10\x1c\xd9\xc6\x72\xe1\x5d\x6c\x51\x98\x94\xc1\x3a\xb2\xe5\x73\xac\xee\x40\x3e\xe7\x46\xc6\xf4\x4f\x86\xe2\x75\x7b\x82\xd0\xb1\x37\xcb\x6c\x87\x30\x80\x42\xc9\x36\x80\xe0\xcc\xb6\x6f\x8f\x8c\x52\x2d\xd7\x36\xa4\x8a\x02\xfd\x92\x44\xb5\xd6\xae\x16\x68\xd5\x7c\x7c\xe6\xeb\xce\xc4\x4c\x11\x26\xd9\xfe\xab\x8e\xb8\x34\x43\xcd\x36\x80\xe0\xd0\xb6\x12\x09\x67\xaf\x11\x7b\xf3\x73\x13\xe6\x63\xa2\xd3\x9f\x07\x53\x0c\xac\x1d\x57\x73\xee\x85\xa6\x5d\x94\xde\x33\x30\x9d\x79\xf0\x08\x06\x50\x28\xda\x06\x10\x9c\xda\x26\xd1\x37\xee\xae\x9f\xbb\x1c\xb5\xdf\x49\x4c\x92\xa9\xba\x47\x70\xe8\x8e\xbc\x8a\x7c\x41\x6e\x35\x57\xd1\x1f\x73\xa7\xd1\x75\x29\x0c\xa0\x50\xb5\x0d\x20\x38\xb6\xcd\xbc\x60\x8f\x48\xf4\x7a\x64\x77\x03\x99\xc5\xa1\xda\x0a\x3e\xf6\x0f\x57\xb6\x38\x23\x8f\x66\x8d\x5d\x62\xe6\xdb\xa0\x69\x7d\x72\x15\x03\x28\x94\x6d\x03\x08\xce\x6d\x23\x23\xd3\x05\xeb\x41\x0f\x6d\x9f\x6b\x50\xdc\xcd\x27\xf3\x6a\x3a\x7c\x35\x2e\xe4\x39\xa5\x6f\x95\xdd\x31\xbb\x20\x4f\x4d\x8e\xb3\x18\x40\xa1\x6e\x1b\x40\x70\x70\x5b\xc0\xb6\xbc\xf6\x0c\x6b\x00\xd5\xf3\x05\xe1\x6a\x32\xdd\xa2\xfd\xe2\x13\x80\xaa\xe9\xf9\x88\x6d\xf2\x07\x99\x33\xaf\x8e\xa2\xc4\x21\x18\x0a\xb7\x01\x04\x27\xb7\xf5\xbc\x39\xa6\x3e\xd0\xf6\x6f\xf8\xc4\xac\xe2\x83\xd7\xb6\x9c\x8c\xc6\x5c\xb4\x3b\x05\x51\x56\x9f\x23\x7f\x9c\xb1\x2e\xcf\xfc\x7f\xf7\x43\xa1\x72\x1b\x40\x70\x74\x5b\xd1\xaf\x29\xf3\x44\xa5\x82\xe3\x3b\x45\x60\xf8\x0d\xeb\x61\xde\xee\xf1\xa3\xb4\x4f\x6c\x94\x87\xbe\x86\xae\x5d\x51\xda\x55\xb8\x8c\x01\x14\x4a\xb7\x01\x04\x67\xb7\x15\xef\xaf\xea\x66\x7c\x69\x74\xa6\xba\xef\xd6\x66\x5e\xed\x41\xff\x90\x97\x8a\x64\x69\xf9\x85\x5b\x61\x86\x34\xca\x1d\x72\x53\xc4\x81\x0e\x6a\xb7\x01\x04\x87\xb7\x65\xff\x14\xfd\xde\x19\x5b\x61\x38\xd8\xb4\xbb\x64\x15\xb3\x16\xfe\x5e\xbb\xdf\x6c\xaf\x31\xef\xb5\xf9\x92\x79\xa6\x4e\x0d\xe5\x6b\x18\x40\xa1\x78\x1b\x40\x70\x7a\xdb\xfa\xd4\x91\xc5\x61\xbb\x9d\x17\x72\xdc\x3a\x23\xac\xb3\x67\x9a\x25\x8f\x18\xed\xfe\x61\xe9\xa6\x3f\x2b\x73\xdb\xff\x80\x71\x2d\xf1\x95\x41\xf5\x36\x80\xe0\xf8\xb6\xf8\x4e\x16\xf4\x06\x8f\xde\xce\xa7\xa8\xbf\x7b\x9f\x8d\x72\x77\x04\xd6\x8e\xbb\x04\x8b\xaa\x4e\x1f\x79\xe4\x99\xca\x8f\x24\x11\x07\x3a\x28\xdf\x06\x10\x9c\xdf\xe6\x62\x90\x5a\xec\x9e\x4a\xd9\xd3\x2a\xbf\xcd\x35\x62\xb5\x2c\x6d\x73\x22\x56\x0d\x6c\xb4\x8f\xdd\x8b\x37\x2e\x9f\x51\xbc\xa0\x80\x01\x14\xea\xb7\x01\x04\x07\xb8\x4d\x45\xce\x9e\x0c\x26\xcf\x74\xa5\xe0\xc6\x0a\x6d\x4d\x34\xa7\x6f\x9e\xec\x42\x37\x57\xee\x44\xd1\x24\xc8\xda\x3f\xfc\xe8\x7d\x01\x03\x28\x14\x70\x03\x08\x4e\x70\xeb\xff\x37\x90\x17\xe3\x63\x1f\xf8\x4b\xa3\xfa\xab\xcd\x71\x59\x67\xbe\xef\x25\x17\xdf\x38\xcb\x48\x9d\x7c\xfc\x82\x8b\xdf\x23\x0b\x60\x00\x85\x0a\x6e\x00\xc1\x11\x6e\x43\x4b\x67\x94\xde\xc7\xf9\x75\x8b\x3d\xeb\xbe\x47\xd9\x9c\xe6\x97\x30\x64\x7c\xe3\x80\xbd\x40\x14\x43\x0e\xb5\x8c\x16\xda\x45\x9c\xa8\xa1\x84\x1b\x40\x70\x86\xdb\x31\x83\x7d\x45\xe3\x60\xdf\x5f\xe7\xa0\x54\xf2\x2e\x91\xaa\xe1\xdd\xb0\xf4\x99\xbd\xed\x25\x25\x41\xe1\xb1\x77\x2e\x3f\xb5\x20\xc7\x00\x0a\x35\xdc\x00\x82\x43\xdc\x28\xea\xea\x43\x1b\xc5\x39\x0a\x78\xaf\x1f\x9f\xac\x7a\x24\x2d\x33\xf8\x37\xcc\x3c\xd0\x58\x74\x92\x71\x34\xf2\xcf\x33\xda\x0d\x53\x0c\xa0\x50\xc4\x0d\x20\x38\xc5\xed\xd4\xeb\xce\xd7\xbf\x25\x4a\x16\xec\x85\x74\x14\x99\x09\x34\x06\x71\x02\x61\xa3\x8f\xae\x1e\x3c\xba\x12\x56\x74\xe2\x88\x71\xbf\x23\x06\x50\xa8\xe2\x06\x10\x1c\xe3\x26\x78\xe3\x04\x7f\x3a\xe7\x9c\x87\x1f\xc7\x87\xa5\xc8\xac\xb5\xc4\x6e\xb7\x21\x94\xc9\xa2\xce\x72\x63\xe3\xe0\xe6\x4a\xf9\x75\xe2\xa1\x01\x65\xdc\x00\x82\x73\xdc\x9c\xf6\x9f\x3c\xa3\xf1\xa8\xf3\xdb\x1d\xcd\xf2\xa7\xb1\x7b\x76\xaf\x86\x30\x17\x9f\x19\x3f\x33\xf0\xfd\xc5\xab\xe0\x67\x59\x77\x4a\x68\x30\x80\xc2\x1c\xb7\xff\x1b\xe8\xfe\xeb\xdf\x3c\xfc\xef\x40\x87\x83\xdc\x84\xe4\x07\x3b\x6d\x64\x85\x45\x0e\x0c\x0c\x3f\xfc\x68\x7a\xd2\xce\x27\xdb\xf8\x29\x43\x59\x41\x93\x61\x9c\x50\xa2\xd0\xa2\x28\x71\xe3\x0e\x85\xdc\x00\x82\x93\xdc\x24\x18\xf4\xc3\x29\xaa\x68\x96\xda\xd9\x15\xb6\xbb\x17\x4f\xf8\xf9\xfb\xf2\x85\xea\x05\x14\x55\xfc\x0d\xdc\x6f\xb0\xf2\xac\x82\x12\x03\x28\x54\x72\x03\x08\x8e\x72\x43\x4e\x7d\xb5\x2a\x95\x51\xaa\x66\x91\x48\x89\x48\x2e\xa3\x5d\xd6\xde\x33\xb0\xa9\x3e\x9e\x4a\x71\x53\xed\xae\xc9\x22\xbd\xa8\x1e\x06\x50\x28\xe5\x06\x10\x9c\xe5\x36\x5f\x37\xfc\x33\xdd\xed\xc0\x95\x0f\x7a\x4e\x47\x32\x5a\x9f\x0f\x5f\xf6\xef\x5f\x68\xef\xbc\x1e\xb3\xf6\x5a\xec\x6a\x98\xb3\x17\xf1\xfc\x83\x5a\x6e\x00\xc1\x61\x6e\xfa\x74\x52\x06\x47\x7e\x94\xba\xaf\xd7\xef\xb8\xbb\xdd\x72\x7e\xda\xe6\x75\x3f\x7a\xa8\x85\x81\x5d\xfa\xdb\x9b\xf6\xb3\x97\x79\x5d\x31\x80\x42\x31\x37\x80\xe0\x34\x37\x3d\x4b\x4a\x8a\x60\x16\xfa\x34\x85\xea\x74\x95\xcb\x99\x9c\xbe\x9d\xa5\xee\xfb\x92\xec\x82\x0b\xd2\xe6\xb9\x53\xc5\xfd\x7a\x98\x30\x80\x42\x35\x37\x80\xe0\x38\xb7\x91\x29\xc6\x01\xfa\x74\xd7\xd7\xdf\x9e\x6e\x73\xdd\x1f\x92\x3e\xf6\xd8\x84\x20\xe9\xfb\x0e\x1b\x5d\xba\xc7\x72\xae\xe5\x76\x1d\xf1\xaa\x0d\xe5\xdc\x00\x82\xf3\xdc\xf4\xd5\xc7\xc1\x07\x8e\xc6\x5c\xb3\xd8\xa7\x69\x42\x96\xe4\x06\xba\x88\x8d\xd3\x43\xa7\x43\x8f\x7b\x52\x4b\x0a\x55\xe5\x84\x88\x9f\x19\xd4\x73\x03\x08\x0e\x74\x73\x79\x77\x6c\x9b\xe7\xfe\xb3\x18\xfb\x98\xce\x12\xc9\x65\x4b\x86\x42\x9f\x17\xa3\x81\x9c\xaf\xad\xcf\x29\x32\xbe\xb9\x9d\xec\x45\x1c\x9b\xa0\xa0\x1b\x40\x70\xa2\x5b\x62\x4f\x92\xc9\x96\x5b\x59\x28\x63\x71\xe5\xc9\x52\x6c\xf0\xb8\xc2\xac\xc6\x33\x71\xbf\xa6\xb9\x5c\xcb\x04\x4c\x46\x32\x8e\xb8\xd5\x83\x8a\x6e\x00\xc1\x91\x6e\x0c\xba\xe6\x55\x98\xe8\xf6\x60\xf6\xb5\x0c\x84\x56\x7f\xf6\xc5\xd3\xb2\xeb\xf2\xf5\xb1\xaa\xb5\xb4\xba\x27\xed\x8f\xda\x1a\x73\x63\x00\x85\x92\x6e\x00\xc1\x99\x6e\x32\x2f\xde\xd9\xee\xa4\xd0\x73\x00\x2b\x57\x39\xe4\x09\x39\x0f\x79\xea\xf7\x6b\x65\xcd\xcf\x8b\xb7\xf6\x24\xde\x12\x9e\xd0\x15\xc3\x00\x0a\x35\xdd\x00\x82\x43\xdd\xc4\x05\x7c\xbb\xd5\x86\xd3\xaa\xd3\xf8\x54\xb2\x6c\xdc\xee\xf3\xdc\x75\x2b\xf9\xf8\xda\xd4\x1d\x6d\x5f\xdc\xf7\x54\x6c\x3b\x8b\xb8\xd9\x82\xa2\x6e\x00\xc1\xa9\x6e\xde\x07\xf7\x74\xdc\x03\x81\x6a\x95\x96\xc7\xa7\x6b\xab\x83\x9c\xff\x7c\xa5\xe0\xdc\x12\xb2\x94\xff\x65\x52\xee\x54\x55\x17\xa8\x83\x01\x14\xaa\xba\x01\x04\xc7\xba\x91\xf3\x69\xf1\x77\x8d\xdc\x2d\xd7\xb8\x50\x56\xff\xfd\x83\xb1\x52\x52\xa0\xf8\x7b\xc5\x17\xa7\xcf\x1b\x7f\x3e\xf7\xc1\xe4\x04\x23\x0b\x06\x50\x28\xeb\x06\x10\x9c\xeb\x76\x76\x68\x3d\x98\x79\x5f\xb3\x76\xba\x8a\xf4\xd7\xb6\x36\x7a\xcf\x12\x2e\x85\xab\xc3\xb4\x1f\xec\xfc\xde\x0d\xd4\xed\xfb\x38\xc3\x87\x01\x14\xea\xba\x01\x04\x07\xbb\xbd\x79\x74\x25\xbc\xd4\x2f\xc3\x2d\x26\xbd\x68\x66\x82\xd1\x8a\x60\x20\xb6\xf0\xec\x98\xe0\x03\x47\x0e\xda\x3b\x2d\x94\xb3\x91\xc4\xd3\x09\x0a\xbb\x01\x04\x27\xbb\xb5\xdd\x9a\x6c\x32\x56\x20\xac\x44\xa8\xfd\x55\x3e\xa6\x56\x76\xbb\x34\x62\xf0\xd3\x57\xce\xf3\xef\xf5\x35\x78\x47\x47\xaa\x44\x0d\x31\x80\x42\x65\x37\x80\xe0\x68\xb7\x1f\xcd\xee\xe7\x42\xed\x58\xc2\xf7\x1e\xb1\x4f\x17\x4b\x5f\x55\xce\x2f\x57\x4f\x6c\xa0\x2e\x92\x59\x64\x12\x96\xe6\xa4\x2d\xe0\xc4\x00\x0a\xa5\xdd\x00\x82\xb3\xdd\xbe\x2e\x1b\x77\xbd\x3f\x66\x2d\xdb\x91\x12\xa5\xb7\xb3\x33\xb8\x34\x93\xe2\xaf\x1d\xe1\x4d\xa0\x8a\x91\x54\xb4\xa4\x56\xc9\xd4\xc2\x00\x0a\xb5\xdd\x00\x82\xc3\xdd\xf8\xbe\x2f\x17\x1d\x75\xd2\xab\x4d\x22\xa8\xf5\x51\x7c\xf7\x38\x71\xec\xea\xcf\x2c\x94\xa1\xd7\x5f\xde\xbb\xe6\x72\x2f\x4b\xf4\x41\x0c\xa0\x50\xdc\x0d\x20\x38\xdd\xcd\xca\x96\xf5\xc8\x73\xed\xc7\x93\x5f\x3e\x9d\x67\x5c\x1c\xb9\x73\xdc\xb3\xdb\x87\xe5\x6d\xc6\x98\xcf\x81\x78\x91\x25\x17\xa6\x52\x6d\x0c\xa0\x50\xdd\x0d\x20\x38\xde\xed\x9f\x5e\x66\x71\xe3\xce\x16\x9a\x19\xd4\xf1\xde\x53\xf5\xc8\xde\xb7\xea\x5c\x47\x9e\x70\x6f\x4a\x71\x53\xcd\xb9\x26\x0e\xb4\x71\x61\x00\x85\xf2\x6e\x00\xc1\xf9\x6e\xb2\x5b\x0b\x5e\xc2\xfc\x84\xa0\x6f\x6c\xab\xfb\x2f\x35\x8e\xed\xfa\x16\x74\x09\xca\x3f\x8f\x3a\x7b\xe3\xf0\x68\x73\xc3\x88\x13\x71\x1b\x08\xf5\xdd\x00\x82\x03\xde\xe2\x1d\x9a\xb5\x29\xb7\x2f\xe5\x09\xdd\x33\x2d\x39\xa5\x69\xbd\x72\xa1\x32\xa4\xfc\xe8\x74\x50\x2a\x85\x83\x7c\xac\x42\x60\x2e\x71\x6e\x85\x02\x6f\x00\xc1\x09\x6f\xde\xf9\x1c\xb7\x1f\x85\x5d\xcc\xbc\x94\xf3\xcb\x3b\xd8\x83\xed\xe6\x56\xaf\x7b\xa7\x5f\x62\x73\xa0\x6f\xf3\x60\x2b\xf6\x52\x4e\x10\x03\x28\x54\x78\x03\x08\x8e\x78\x13\x27\xd0\xcb\x52\x1f\xd7\xb1\xef\x6f\xd1\xb0\x5c\xf8\x2c\x22\x26\x6e\xcc\x96\xfe\x72\xae\x83\x49\x85\x5a\x2d\xe7\x87\x9b\x0f\x71\x09\x82\x12\x6f\x00\xc1\x19\x6f\x16\x17\x7e\x38\xb9\x68\xd0\xeb\x25\x76\x9d\x6e\x58\xbb\xff\x8e\x31\xfe\xf5\x4a\xd0\x0a\x8f\x49\xc7\xcc\xa8\x83\x5d\x7d\x8a\x1b\x31\x06\x35\xde\x00\x82\x43\xde\x92\x26\x33\x5e\x1e\xe4\x6c\xfc\x68\xce\xdf\x54\x3b\x70\x22\xd9\xd4\xd1\xd1\xce\x10\xf5\x8e\xec\x8e\x6a\x9a\x58\x32\xca\xdc\x52\xc3\x00\x0a\x45\xde\x00\x82\x53\xde\x4e\xce\x7c\x14\x2e\x48\x7b\xa9\x55\xcb\x76\x61\x11\x51\xcc\x49\x7d\x6e\xa5\x54\x21\x74\xca\xc5\x46\xd2\xe6\xbb\xf9\x36\x59\x22\x71\x6c\x82\x2a\x6f\x00\xc1\x31\x6f\x02\x0e\xaa\xdc\x55\x29\x75\x09\x61\x66\x8d\xc1\xc6\x33\x86\x6b\xec\x7d\x26\xf2\x6e\x14\x4a\x03\x9e\x83\x43\x35\x69\x2e\x0e\xc4\x43\x03\xca\xbc\x01\x04\xe7\xbc\x71\x4f\xb8\x24\xed\xde\xa0\x1e\x74\x8f\x78\xaf\x9e\xcd\x17\xec\x5f\xcd\x2e\xf6\xf2\xdb\xd9\x24\xee\xbc\xa7\xce\x67\x8f\x25\x5f\xb6\xc3\x00\x0a\x73\xde\xfe\x6f\xa0\xfb\xaf\x7f\xc6\xf5\xbf\x03\x1d\x0e\x7a\x7b\x1b\x76\x22\x36\xad\x27\xe7\xd8\x18\xe5\x8f\x31\x47\xb7\xf2\xf1\xc2\xce\x06\x93\xc3\x02\xaf\xe8\xed\xb6\x0e\x92\xcd\x1f\xba\x66\x8b\x01\x02\x14\x7a\x03\x08\x4e\x7a\xbb\x6c\xb7\x4c\x29\xa6\x74\x58\xb5\x7f\xa7\xc1\xf1\xd0\x90\xc9\x4c\x54\x8c\x74\x4f\x26\xd7\xcc\x73\xdb\x72\x7e\xb9\x5f\xd8\x21\x2b\x0c\x10\xa0\xd2\x1b\x40\x70\xd4\xdb\x6f\x64\xbd\x3d\xa6\x52\xb5\x3b\x8a\xba\x4a\xab\x14\x39\xcc\xe5\x30\xcf\xb8\x44\xc3\x40\xcb\xcb\x74\x58\xc4\xb9\xec\xef\x28\x01\x03\x04\x28\xf5\x06\x10\x9c\xf5\xe6\x2c\x3b\x3c\xee\xa3\x1c\x26\x70\xee\x51\x92\x96\xaf\xc7\x87\xbb\x7b\x4e\xed\x77\xd3\xb5\xba\x79\xfa\xda\x6f\xf7\x7f\x34\xb2\xac\x12\x18\x20\x40\xad\x37\x80\xe0\xb0\xb7\x41\x96\x1d\x9d\xa0\x6f\x4f\xab\x98\x2e\x92\x4b\x70\xcf\xa9\x15\x3b\x52\x4b\xe5\x9c\x0c\x9d\xe4\x49\x3c\x21\x86\xe9\x4c\x04\x5e\xc3\x00\x01\x8a\xbd\x01\x04\xa7\xbd\xd1\xd6\xfe\xb4\x0e\x8c\x32\xb6\x38\x29\x75\x30\xe9\x99\x1c\xb9\xf8\xf0\xc1\x96\x48\xdb\xe4\x7f\x33\x4c\xac\x57\x74\x6f\x78\xe5\x5b\x62\x80\x00\xd5\xde\x00\x82\xe3\xde\xda\x55\x13\xec\x19\x63\xd9\x8c\xae\x85\xed\x92\x4f\x45\x3e\xb2\xd4\x3d\x63\xf9\xe4\x79\xb0\x8c\xc2\xa2\x9a\xd1\xcb\x9f\xb3\x6d\x28\x06\x08\x50\xee\x0d\x20\x38\xef\x6d\xb4\x4b\xfd\x9e\xfa\xc5\x72\x65\xe9\x24\x83\x3b\x69\xba\x16\xde\xa7\xd7\x0b\x6b\x1f\x36\xb2\x95\x8d\x86\x15\x75\x89\x6d\xba\xee\xc5\x00\x01\xea\xbd\x01\x04\x07\xbe\xe5\xd3\x46\xec\xfb\xa2\x33\xf4\xfc\x6e\xbe\xa6\xfe\x97\xed\xc0\x5e\xea\x6e\x83\x95\xdd\xec\x8c\x92\x94\x05\x61\xfd\x6f\x5a\xb2\x74\x18\x20\x40\xc1\x37\x80\xe0\xc4\x37\x19\xad\xd7\x29\xca\x93\x55\xca\x7f\xdd\x53\x05\x23\xee\x8b\xe8\x59\x59\xb9\xed\x8b\xb8\xf6\xb6\xea\x2c\x46\xbf\x30\x94\xe0\x24\x88\x01\x02\x54\x7c\x03\x08\x8e\x7c\x7b\xc3\x6d\x14\x19\x74\xe6\x57\x4f\x80\x99\x7f\xa3\xa0\xc5\x56\xde\x3f\xc6\xeb\xc6\xdf\xe8\x63\x65\x7b\x8f\x5e\x7b\xce\x29\xbb\x25\x8e\x01\x02\x94\x7c\x03\x08\xce\x7c\xd3\x2f\x0f\x71\x54\xcf\x98\x74\x17\x88\x4a\x98\xc8\xa9\xe2\x9e\xca\x4f\x63\xb4\x1b\x13\xd6\xd9\x6b\x99\x9f\xcc\xb9\xb1\x9f\x9d\xf8\x36\xa1\xe6\x1b\x40\x70\xe8\x5b\x8a\x8b\xc5\xbb\x37\x86\x17\x36\x5d\xe7\x29\x02\xb0\xa5\xc4\xed\x9f\xc7\x13\xbe\xca\x1f\xd9\xb0\x61\xcd\x91\x4c\x95\x92\x3d\x49\x83\x01\x02\x14\x7d\x03\x08\x4e\x7d\x2b\x3e\x85\x44\x3c\x53\x9f\x5d\x1e\x37\x14\xcc\xdf\x7f\xd7\xc0\x60\x4b\xef\xc5\xe1\xd7\x81\xfb\xff\xf5\x74\x68\x58\x8e\x5c\x4a\x20\xbe\x32\xa8\xfa\x06\x10\x1c\xfb\xe6\xf4\x25\xc4\xc1\xa9\xdf\xac\x33\x3b\x43\xe0\x7c\xd6\xb6\xd5\x52\x5a\x7d\x71\x59\xd4\x77\x66\x87\x95\x7f\xc6\x9c\xdc\x3e\x02\x97\x30\x40\x80\xb2\x6f\x00\xc1\xb9\x6f\xa2\x91\xf5\x5f\x5d\x2d\x5f\x2d\x57\xc7\x34\x67\xb6\x8b\xd7\x2f\x4a\x66\xc8\x9b\xbe\x50\x95\xaf\xc9\xb9\x72\x78\x2f\xd9\x36\xfb\x09\x0c\x10\xa0\xee\x1b\x40\x70\xf0\x5b\xd4\x8b\xc6\xde\x9d\xe7\x0f\x4b\x3a\xc8\x07\xbd\x79\x07\xde\x05\x86\x87\xc7\x7e\xba\x7e\x39\xaf\xed\x75\x72\x99\x85\x7c\xdb\x59\x32\x0c\x10\xa0\xf0\x1b\x40\x70\xf2\x5b\xd7\x4e\x6c\x52\x5a\x8d\xc6\xfa\xa9\xef\xd1\x4f\x2e\x3b\xb7\x3c\x49\x26\x73\x69\x30\x63\x53\x76\xf9\x2c\xa6\x79\x77\xcb\x23\xd1\x05\x03\x04\xa8\xfc\x06\x10\x1c\xfd\x26\xf0\x27\xc7\xeb\xd0\x55\xef\xe7\xaf\x25\x9e\xdd\xd8\x95\x4c\x96\x93\x0c\xe0\x7e\x7d\x64\xaf\xe0\x39\xf7\xc9\x85\xae\xde\x58\x53\xe2\x41\x0b\xa5\xdf\x00\x82\xb3\xdf\xf6\xc8\x7e\xd8\x79\xe3\x2d\xf6\x6a\x42\xaa\xe5\xb8\xcd\x1a\xdf\xc4\xcd\x9d\x3c\x86\xf9\x77\x16\x5b\x9d\x5e\x65\x13\x1d\x9c\xb9\xe6\x18\x20\x40\xed\x37\x80\xe0\xf0\xb7\xc1\x54\x49\xcd\xd1\x80\x2f\xf7\xcb\x7c\xad\xed\x68\x93\x15\x9f\x0b\xd8\x56\xab\x52\xa4\xe9\xd3\x76\x7e\xdb\xa7\xd9\xa3\xb3\xe1\x88\x01\x02\x14\x7f\x03\x08\x4e\x7f\xab\x1b\xe8\x5d\xfc\x53\xa2\x2d\xfe\xe6\xd0\x79\x17\xb2\xd5\xf0\x6f\x96\x48\x32\x87\x51\xac\x44\x67\x46\xb8\x4d\x2e\xdb\x56\xb2\x3e\x06\x08\x50\xfd\x0d\x20\x38\xfe\xed\x72\x44\x7c\x77\x7d\x81\x97\x52\xad\xcb\xd5\xcc\xba\xa5\x3d\xc5\x9d\x59\x5d\xda\x16\x89\x31\xca\x85\xfb\x1f\x9c\xdd\x1b\x40\x7f\x1a\x03\x04\x28\xff\x06\x10\x9c\xff\x36\xe2\xf0\x4d\x2d\x52\x3b\x63\x61\xcf\x46\x9a\xf2\x14\x63\xbe\x52\xb5\xef\x1d\xd7\x27\xa5\xed\xab\xd6\xf4\x56\x4c\x95\x94\x42\x86\x18\x20\x40\xfd\x37\x80\xe0\x00\xb8\x56\xc6\x4d\xa9\x65\x33\x75\xfb\x57\x9a\x29\x7b\x87\x6b\x04\x38\xb3\xb8\xad\xe7\x96\xf7\xb5\x59\x2c\xfc\xf2\x45\x3a\x3a\x87\xc4\x30\x40\x80\x02\x70\x00\xc1\x09\x70\x1d\x49\xc1\x08\xc5\xd7\xe2\x5f\xde\x03\x37\x6f\x6f\xf8\x0a\x1d\x95\x2b\x73\x60\xf2\xec\xb6\x4f\xaa\x72\x3a\xbd\x36\x1a\xa4\x27\x80\x01\x02\x54\x80\x03\x08\x8e\x80\x5b\x3f\xfe\x52\x7c\x2d\xb0\xb4\xb9\x3c\xe7\xbd\x46\x7e\x6c\xfd\x0f\x67\x86\x85\x86\xb5\xce\x0f\x36\xb6\x0f\xce\xed\xab\xbb\xfa\xc2\x02\x03\x04\x28\x01\x07\x10\x9c\x01\x77\xfd\xe4\x7c\x97\x56\xfd\xa1\xe0\x83\xd2\xb9\xec\x6f\x15\xb5\xd8\x68\x64\xa2\xbf\xea\xee\x04\xbd\x3e\xb4\x65\xb2\xec\x33\x79\x97\x03\x03\x04\xa8\x01\x07\x10\x1c\x02\x67\x5c\x55\xe6\x2c\xc5\x51\x59\xa1\xc7\x02\xfc\x63\xab\xe6\xdc\xa9\x3e\xbf\x3f\xdf\x75\x42\x2b\x3c\x24\x4d\xce\x78\xf5\x88\x87\x24\x06\x08\x50\x04\x0e\x20\x38\x05\xee\x5a\xfa\x05\x33\xc0\xa5\x70\x21\xf4\x71\xc6\xe9\x8e\x7e\x3d\x25\x63\x7d\x50\x9e\x6c\xf8\x51\x78\xbb\x92\x39\x71\x29\x73\x01\xc1\x00\x01\xaa\xc0\x01\x04\xc7\xc0\x95\x9e\xb7\x65\x62\x99\x38\x9c\xab\xde\x85\x16\xdd\x3b\xb0\xb9\xdb\x9f\x9f\xa9\x70\x17\x64\x25\xcd\x14\xea\x9c\x9b\x0d\xb5\x22\xce\x1a\x50\x06\x0e\x20\x38\x07\x8e\xc6\xf0\x43\xa3\xc8\x05\x65\xe6\xce\x78\xfe\xd3\xfc\x8b\xdb\x95\x0b\xc5\x25\xbb\x49\x8e\xcf\xea\x2f\xe7\x1a\x9b\xd3\x6c\x9f\x3f\x80\x01\x02\xcc\x81\xfb\xbf\x81\xee\xbf\xfe\x65\xea\xff\x0e\x74\x38\x08\xae\xf2\x4c\xd9\xf4\x79\xdb\xb3\x3f\x44\xf7\xa7\x1f\x4d\x6a\xcd\x91\xf8\x21\xee\xa0\x42\x3f\xdc\xf5\x59\x39\x2a\x7e\xe6\x59\xfa\xb0\x0a\x06\x08\x50\x08\x0e\x20\x38\x09\xae\xf7\x34\xb9\x6f\xef\x83\x63\x41\xb6\x14\x4c\xed\x22\x1e\xe9\xd7\xe7\x07\xd6\xce\xec\xdc\xa0\x66\x4c\xfe\x99\xd8\x90\x7e\x31\xd8\x15\x03\x04\xa8\x04\x07\x10\x1c\x05\xd7\x7b\xd9\xf6\xb5\x47\x46\x0d\xab\x9a\x19\x0d\xe1\x81\xd4\xcb\x41\xe1\x04\x32\xb9\x69\xe9\x80\x51\x2f\xc3\x9a\x89\x50\xe6\x73\x26\x18\x20\x40\x29\x38\x80\xe0\x2c\xb8\x69\x8f\xe4\xa5\xab\x74\x3f\x14\x6a\x45\x1f\x76\x4a\xf9\x84\xd4\x24\x76\xa6\xbf\x68\x94\x8d\x96\xa1\x2c\xf7\x5e\xd9\x7a\xe1\x03\x30\x40\x80\x5a\x70\x00\xc1\x61\x70\xc3\xab\x92\xb7\xf2\x94\x86\x64\xba\x1c\xbf\x7e\xf4\x88\x4d\xbb\xc2\x54\xf4\xb8\x44\x2d\x37\x31\x61\x4f\xf7\x7c\xec\xa5\x13\x5b\xc4\xa5\x19\x8a\xc1\x01\x04\xa7\xc1\x89\x5a\x77\xba\x4c\x0a\xcc\x5a\x87\x65\xf6\x88\x32\x09\x71\xdd\x4b\x91\x2a\x2e\x3b\xed\xe2\x97\xb1\x18\x60\x63\xa6\xa4\xd2\xc4\x85\x01\x02\x54\x83\x03\x08\x8e\x83\xa3\x3e\x5f\xb7\xbb\x30\x38\xbe\xb1\xf3\x56\x4c\x21\xc2\x3d\x2a\x79\xab\x2b\xfd\xd5\xf6\x06\x0b\x28\xad\xe3\x64\xb5\x78\x5f\x2f\x85\x01\x02\x94\x83\x03\x08\xce\x83\x1b\xff\x0b\xbe\xc9\x0f\x9c\x96\x79\xf0\xd4\x4b\xd2\xd9\x30\xe9\x48\x50\x95\x09\x99\xaf\xff\xd8\xa1\x77\xbc\x37\x95\x24\x1c\x03\x28\x31\x40\x80\x7a\x70\x00\xc1\x81\x70\xae\x02\xb7\x65\x9b\x2e\xf4\x0c\x8b\x38\xe5\xfc\xe9\x39\x97\x16\x26\xb4\xfc\xc1\x3b\x49\xa7\xf1\x85\x5c\x2d\x9a\xff\x27\xa0\x97\x78\x94\x43\x41\x38\x80\xe0\x44\xb8\x43\xfe\xaa\x9f\x0b\xe8\x0b\xc9\x5b\xcd\xd1\x16\x15\xd3\x15\x9f\xf9\xb6\xfe\xce\xe3\xe1\x1f\x23\xe2\x86\xe2\xa7\xc7\x6f\x7b\xf2\x63\x80\x00\x15\xe1\x00\x82\x23\xe1\x3a\xca\x1a\x33\x87\x04\x76\xcb\x74\x98\xf7\xb5\x48\xf1\x05\xd6\x87\x7c\xd4\x54\xcf\x2d\x58\x14\x26\x94\x5c\xbc\x3e\x72\x30\xe6\x3a\x06\x08\x50\x12\x0e\x20\x38\x13\xce\xbb\x37\x5e\x72\xaf\xc4\x72\x6c\xaf\x6e\xb1\xea\xc7\xb5\x8c\x1a\xde\x1f\x23\x1d\x49\x05\x83\x59\x3a\x6e\x94\x5d\x6e\x01\x72\xfb\x30\x40\x80\x9a\x70\x00\xc1\xa1\x70\xf7\x99\xc3\x78\x78\xda\x5e\x3d\x2d\x3e\x94\xdd\xba\x2b\xd4\x39\x99\xc3\x2d\xf4\x9c\xbf\x94\xd1\xe1\xae\x54\xab\x50\x9e\x4d\x2e\x23\x06\x08\x50\x14\x0e\x20\x38\x15\xae\xc6\x32\xec\xb8\x22\x95\x4d\xff\x6e\xd8\xc9\x1e\xa3\x23\x9f\x3e\xdd\x72\x27\x14\x7e\x9f\xfe\xa0\x1c\xbb\xea\xf0\x31\xdb\xf3\x2b\x05\x06\x08\x50\x15\x0e\x20\x38\x16\xee\xf9\x9e\x51\xcb\x62\x9f\x67\x85\xaf\x8b\x9b\x0f\xd4\xfa\x3a\x7b\x5b\xee\xe9\xbb\xdc\xd0\x79\xfc\xd5\xb9\xfc\x52\xdd\xd5\xdf\x7f\x89\xd7\x46\x28\x0b\x07\x10\x9c\x0b\x77\x54\x03\xe3\x92\xbd\xfb\x52\xc6\x45\x71\xf9\xc8\x64\x79\x98\x4c\x6a\xc7\xb5\xc0\x86\x25\xf3\x7d\x29\x1e\x87\x4b\x82\xae\xcb\x11\x87\x13\xa8\x0b\x07\x10\x1c\x0c\x67\x34\x62\x6f\x60\xc5\xad\x22\x69\xf9\xfb\xa8\xca\xa3\x73\xbc\x43\x4a\x33\x8f\x14\xd8\xa3\xc8\xbc\x8d\x9b\x3e\x73\x77\xa9\x2b\x1e\xc1\x00\x01\x0a\xc3\x01\x04\x27\xc3\xfd\x52\x69\x3c\xd0\x97\xe3\x6c\x46\x58\xfc\x7d\xa5\xe4\xf0\x98\xa9\x59\xf2\xf7\x83\x1d\x67\xed\x3b\xf6\xcf\xff\xda\x7c\x52\x54\x4a\x3c\xd1\xa1\x32\x1c\x40\x70\x34\x9c\x87\xe2\x7a\xd4\xba\xce\x48\xa8\xfa\xe0\xf5\xac\x57\x4c\xae\x59\x0e\x3d\xd7\x99\x62\x27\x93\xda\x30\xa7\x52\xb6\xcb\xc9\xb3\x8a\x18\x20\x40\x69\x38\x80\xe0\x6c\xb8\xcb\x75\x8a\xfe\x9a\xf7\xf6\xf0\xb5\x56\x84\x55\xcf\x31\xbb\xc6\xce\xd8\xf2\x0b\xdc\x9a\xea\xdf\x74\xfd\x1b\xf6\x8b\x39\xb1\xdd\x13\x03\x04\xa8\x0d\x07\x10\x1c\x0e\x17\xf8\xc3\x9a\xcd\x26\xac\xc0\x2f\x2b\xdb\x58\x2c\x36\x2d\x2f\x20\x77\x4e\xa7\xef\xdb\xd2\xe6\x85\xe4\xcf\xca\x3f\xff\xb5\x30\x49\x63\x80\x00\xc5\xe1\x00\x82\xd3\xe1\xd6\xf9\xea\x5a\x94\xef\xe4\x22\x3c\x53\xf6\xd7\x3b\x22\xcc\x1d\x83\x1b\x2d\x69\x6b\xf5\x85\xba\x16\xa4\xb6\xe9\x8e\x05\xf9\x12\xe7\x09\xa8\x0e\x07\x10\x1c\x0f\x67\xa6\xb9\x67\x57\xf5\xf4\xa5\x25\x4b\x96\xc9\x88\x2b\x03\xae\x84\xad\x3f\x86\x47\x2d\x9f\x59\x2b\xcc\x09\x0b\xa8\xef\x7d\xa1\x67\x83\x01\x02\x94\x87\x03\x08\xce\x87\xb3\x38\xaa\xf7\x21\xb6\x77\xd5\xe6\x9f\x74\x84\xed\xd8\x53\xef\x03\x86\x92\xb5\x6b\xba\x97\xa8\xe8\x74\xcf\x5e\x75\x5f\xa9\xa3\x3e\x8e\x01\x02\xd4\x87\x03\x08\x0e\x88\x9b\xba\x23\x62\x6f\xfd\x40\x54\xd5\xaa\xe3\xdf\xd5\xbd\x21\xd6\x69\xe1\x8b\xf4\x52\xd4\x3c\x52\x55\xb7\x7f\x74\xa4\x5d\xcc\xa2\x64\xc1\x00\x01\x0a\xc4\x01\x04\x27\xc4\x31\x04\xa4\xed\x1a\x44\x6c\x0a\xfe\xc9\x77\x12\x9d\xc8\x97\x1d\xb8\x53\xc5\x1f\xfb\x86\x71\xe4\x4b\xed\x5c\x76\x8e\x12\xd8\x65\xc7\x00\x01\x2a\xc4\x01\x04\x47\xc4\x5d\x6a\xa9\x88\x79\xfc\xaf\x74\x5f\x65\x7d\xb7\x10\x55\x78\x62\xab\x7d\xae\x9f\x46\x5e\xfe\x6e\x6f\xc5\xd5\x9e\x39\x26\x64\xc8\x1d\x03\x04\x28\x11\x07\x10\x9c\x11\x57\x9c\x68\x23\xc6\x48\x3b\x42\xa9\xa9\xba\x42\x8b\xd1\x37\x65\xdc\xfb\xd2\xbe\x3b\xf5\x2c\x0d\xa3\x57\x61\xd3\xb4\xae\x9c\x22\x6e\x69\xa0\x46\x1c\x40\x70\x48\xdc\x74\xca\x7e\x3b\x33\x4a\x3f\xca\x94\xb5\xa8\xc8\xc0\xf0\xd7\x45\x9f\x36\xba\x7e\xee\x2e\x8e\xf0\x04\x72\x51\x96\x88\xfe\x68\x23\xae\x1a\x50\x24\x0e\x20\x38\x25\x8e\xf7\x96\x69\xdb\xa9\x8c\x82\x87\x9f\xd2\x75\x9a\x6e\x5b\x9d\xbd\xd2\xec\xbb\xc7\x64\x5f\xf1\x2d\xfb\xc0\x67\x12\xe5\xc1\x4f\xfd\x58\x31\x40\x80\x2a\x71\x00\xc1\x31\x71\x4d\x41\xa9\x4f\x29\x3b\xb8\x9a\x03\x64\x4e\x3e\x0a\xf3\xe7\x43\xb2\xbf\xd6\xd0\x5d\x72\xbd\x34\x6c\xb3\x23\x61\xdc\x73\xfa\x11\xf1\xd0\x80\x32\x71\x00\xc1\x39\x71\xde\xda\xc7\x52\x6f\x6d\xdc\xbe\xc1\xd9\x62\xf7\xe6\x03\x57\x0f\x4d\x6c\xe9\x8f\xf4\x28\x21\xe9\x3f\x3f\x58\x84\x29\x4d\x54\x0f\x58\x63\x80\x00\x73\xe2\xfe\x6f\xa0\xfb\xaf\x7f\x6c\xff\xbf\x03\x1d\x0e\x8a\xfb\x1c\x2c\x2c\x6d\x63\xbe\xa7\xc4\xed\xdf\xb2\xab\x8e\xab\x48\xeb\xeb\xb4\x54\x8e\x2c\xa9\xde\x4f\x7d\xb4\x7d\xae\x02\x06\x36\x1e\x18\x20\x40\xa1\x38\x80\xe0\xa4\xb8\xd6\xb1\xd1\x8f\x9e\xda\xae\xe4\xd5\xea\x27\x79\xa7\x56\x56\x56\x0e\xdf\xc9\x9b\xfe\xc1\xef\x9f\xf4\x27\x36\xac\x8f\x22\xc4\x54\x08\x03\x04\xa8\x14\x07\x10\x1c\x15\xf7\x4c\x98\x8f\x3b\x1c\x79\x2d\xad\x3c\xd5\x38\xe7\x1d\x3d\xb1\x79\x0f\x73\x57\xba\xfc\xc8\xa0\xe4\xfd\xd5\x95\xc7\xa9\xfd\x9f\x35\x30\x40\x80\x52\x71\x00\xc1\x59\x71\x2f\x22\x87\xa3\x39\xb2\x7d\x76\x1c\x85\xd3\x1b\xf5\x0f\x08\x1b\xd6\x58\x6b\xd4\x06\xf2\x7b\x9e\xd8\x01\x9c\xc2\x6b\x05\x5f\x68\x30\x40\x80\x5a\x71\x00\xc1\x61\x71\xae\xd2\xd2\x99\xfb\xac\x3f\x92\xf3\x6a\x8f\xfb\x28\xc9\xa4\x88\x16\x19\xad\x97\x15\x1d\xb8\xe3\x96\x24\xf2\xb4\x21\x5a\x74\x90\xb8\x9a\x42\xb1\x38\x80\xe0\xb4\x38\xed\x0f\xb3\xfc\x0e\xfb\x9d\x9a\xf9\xd0\xaa\x90\x54\x3a\xc6\xd8\xdd\x52\x6d\x0f\x65\xe3\x5f\x6c\x73\x3f\xdd\x67\xdf\x7e\x1e\x14\xc5\x00\x01\xaa\xc5\x01\x04\xc7\xc5\xf9\xdf\x2d\x3f\x6d\x76\x66\xc8\xa7\x24\x81\x89\x96\x17\xd5\x49\xe1\x4a\x0e\x8e\x92\x7a\xff\x45\x26\x70\xd7\x93\xfe\xfa\xe7\x93\xba\x18\x20\x40\xb9\x38\x80\xe0\xbc\xb8\xf7\x79\x52\x96\x26\xac\x7b\xdf\xde\x5d\x7e\xe6\xbc\xdf\xe3\xf7\x50\x7a\xff\x2d\xcf\x19\x2a\x3f\xf3\x74\xf1\x33\x3a\x1c\xef\x1a\x0e\x63\x80\x00\xf5\xe2\x00\x82\x03\xe3\x5c\xd8\x26\x09\xe1\x6c\x7d\x31\x28\x79\x6e\xd2\xa7\x6c\xd6\x3d\x3b\x2a\x2d\x0a\xdf\x97\x41\x83\xd7\x4f\xc9\xe3\x35\xf3\xf3\xda\x18\x20\x40\xc1\x38\x80\xe0\xc4\xb8\x02\xb2\x5d\x3b\xe6\xc7\x56\xf1\xbd\xb6\x63\x99\x99\xd5\x6e\x4c\x6b\x01\xec\x8d\x5f\xae\x89\x4c\x56\xc5\x04\x4f\xb9\x25\xff\x65\xc3\x00\x01\x2a\xc6\x01\x04\x47\xc6\x7d\xab\xeb\x4a\xa1\xfc\x6c\x7e\x5b\x4e\x2b\x69\x56\x3d\xb2\x01\x13\xb0\x9d\x34\xea\x7e\x2a\x69\xb6\xff\x95\x24\x37\xf7\xf9\x87\x5a\x18\x20\x40\xc9\x38\x80\xe0\xcc\xb8\x3f\xc2\xc1\x76\xf7\x58\xed\x44\x8a\xee\xa8\x84\x1f\xfd\x13\xd2\xf4\x7a\xf1\x7c\xdc\xc9\x6e\x25\x54\x02\x0c\xbd\x5b\xd1\x4f\xbe\x8a\x01\x02\xd4\x8c\x03\x08\x0e\x8d\xeb\x8b\xe6\x3b\x76\x7f\xf1\x58\xcc\x03\xd1\x37\xa9\xa5\x99\x5c\x27\x0c\x69\xc9\x1b\x4a\xea\x12\x75\xfc\xa7\x43\xde\x71\x7f\xe7\x39\x81\x01\x02\x14\x8d\x03\x08\x4e\x8d\xdb\xf8\xc7\x3c\xc2\x96\xef\xfe\xe6\x61\xd8\x8f\x87\x57\x17\xe3\x9a\x56\xd8\x68\x27\xf2\x2f\xd3\xf6\xff\xd8\x5d\x6e\x4d\xb4\x92\x25\xce\xfa\x50\x35\x0e\x20\x38\x36\xee\xa7\x6c\xf5\x60\xea\x6d\x16\xe9\xb7\x0f\x9c\xcc\xea\xbf\x8d\x52\xa6\x65\x4e\x5c\x36\xe2\x64\x0a\x17\xf6\x89\x8c\x9f\x0c\x49\x26\x8e\x00\x50\x36\x0e\x20\x38\x37\xae\x28\xe6\xe8\xdd\x72\xf3\xe1\xb7\x9f\xec\xaa\x06\x0e\x8a\x79\x15\x8c\xa9\x5e\x1c\x30\x5a\xbe\x6b\x36\x9e\xe0\xf2\x7c\x5f\x0a\xdf\x39\x0c\x10\xa0\x6e\x1c\x40\x70\x70\x9c\x44\xaf\xdd\xe1\xa0\x03\xff\x0e\x5a\x5a\x9e\x50\xd6\xbf\xdc\x75\x80\x4d\x4a\x52\x46\xa1\x5e\xbe\xcb\xaf\x3b\xee\xef\x22\x4f\x38\x71\x9d\x87\xc2\x71\x00\xc1\xc9\x71\x0f\xad\x6a\x9b\x92\xa8\xdb\x9a\x6b\x72\xae\xfb\x36\xa4\x34\x3f\xb4\xb9\xa3\x7b\x69\x27\x91\xc6\xde\xdc\xab\x5d\xa3\x39\xdf\x5e\x13\x03\x04\xa8\x1c\x07\x10\x1c\x1d\xb7\xa2\xb0\xd0\xe9\xf6\xf9\xc4\x67\x8a\x9e\x1f\xdc\x6b\x77\x2b\x82\xb9\x92\xf4\xf4\x7c\xbc\xc8\xb5\xde\xb0\x26\xd4\xc5\x57\xa4\x9f\xc4\x00\x01\x4a\xc7\x01\x04\x67\xc7\x7d\xd6\xbc\x9d\x6d\xe3\xdd\xfe\xca\xee\xbb\xd7\xa9\xa6\xd4\xec\xa4\x93\x63\x43\x3f\x45\x85\xdb\x25\x0f\x2f\x8e\x07\x57\xbe\x9a\xb3\xc2\x00\x01\x6a\xc7\x01\x04\x87\xc7\x7d\x8d\xef\xef\x38\xc2\xe3\xbf\xf5\x62\x74\x41\xe7\xe9\x94\xca\xfb\x26\xe9\x76\x17\xa6\xd1\x31\xa9\xc9\x4b\x8c\x6b\xc7\x4e\xda\x11\x37\x0e\x50\x3c\x0e\x20\x38\x3d\xce\xd6\xd5\xeb\xd9\x2d\xf1\x97\x03\x4a\xf1\x6f\xaf\x4a\xb3\x7d\x8f\xfc\x39\x13\xd8\xe2\xf2\xd1\xd1\x6d\xf7\x38\x47\x89\x10\x4b\x8f\x1c\x06\x08\x50\x3d\x0e\x20\x38\x3e\x4e\xb8\x38\xc2\xb8\xab\xf6\xb8\x9e\xe9\x9d\x7f\xeb\xa0\x89\xfd\x47\x7f\x88\xe9\x90\x3d\x08\xcc\xbe\xf9\x45\x3c\x28\x58\x45\xca\x0d\x03\x04\x28\x1f\x07\x10\x9c\x1f\x77\xc1\xb7\x90\x22\xec\x43\xfd\x4b\xb3\x12\x5f\x6a\x2f\x0d\x8a\xfe\x83\xc3\xc2\xb2\x41\xf4\x9d\x15\x37\xb5\xee\x30\xdd\x96\x11\x3b\x86\x01\x02\xd4\x8f\x03\x08\x0e\x90\x9b\x90\x5f\xa2\xdd\x9a\xd2\xfb\x4a\x59\x62\x5e\x13\xc2\xc4\xad\x54\xd2\x1d\x17\xcf\xfd\x9a\xf7\xb7\xd0\xe2\xf4\xda\x2d\xc3\x10\x14\x03\x04\x28\x20\x07\x10\x9c\x20\x67\x86\x75\x8a\x38\x2b\xcb\x64\x4e\x5f\x49\xf4\x6b\xba\x11\xf6\x49\xfb\xb6\xb7\x86\xea\xf8\x6d\xe7\x83\x11\x47\x7e\xfe\xbd\x34\xa3\x8c\x01\x02\x54\x90\x03\x08\x8e\x90\x53\xf4\xe5\x73\xb8\x32\x99\x24\x97\x11\x75\x7f\xed\x78\x5c\x8f\x8e\x5c\x59\xfa\x09\xe6\x17\x33\x3f\x0b\xdd\x43\xe4\x2c\x82\xaa\xe4\x31\x40\x80\x12\x72\x00\xc1\x19\x72\x54\x3f\x68\x45\xbf\x2b\x9d\x29\xca\xb2\xba\xe6\xe0\xf2\xd2\x49\x6f\x4c\x82\x17\xc8\x70\x87\x88\x59\x5d\xad\x10\xae\xd5\xd9\xab\x86\x01\x02\xd4\x90\x03\x08\x0e\x91\xe3\xfe\x54\xa9\x77\xf3\x56\x18\xc7\x94\xab\xbb\xd1\xab\xf3\xd4\x96\xf7\xec\x10\x9d\x07\xf1\x97\x0e\xaa\x35\x70\x95\xd7\x49\x6f\x13\xb7\xce\x50\x44\x0e\x20\x38\x45\xce\xd5\xd9\xc5\x7c\x5a\xa2\x31\x5a\xad\x31\x2a\xf7\xb9\x96\xf7\xd6\x0d\x11\xaf\xc0\x52\xaa\x04\xe4\xf7\xe9\x63\x93\x7b\x98\xab\xc9\x31\x40\x80\x2a\x72\x00\xc1\x31\x72\x11\x06\x33\xeb\x3c\x2e\xba\xad\x09\x14\xec\x0c\x34\x81\xc3\x6d\x63\x26\x03\x37\x19\x7f\x36\x84\xf9\x09\x84\xd5\xa9\xcb\x48\x10\xf7\x94\x50\x46\x0e\x20\x38\x47\xee\xf7\xf5\xe9\x06\x1f\xfb\x58\xc3\xb4\x82\xad\x7b\x59\x8a\xfc\x45\xfe\x93\x92\x89\x95\x7f\xca\x8e\xc9\x36\x92\x47\x7e\x91\xa8\x16\xc6\x00\x01\xe6\xc8\xfd\xdf\x40\x87\x94\xf8\xbc\x0a\xf9\x21\xa0\x3b\xd4\xfa\x3e\x3a\x81\x25\x32\xb1\xf3\xee\x8c\xc7\xdb\xf2\x97\x0f\x5c\xce\x07\x49\x3d\x29\x0f\x24\xf9\xca\x15\x07\xc9\x4d\xdc\xb6\xb5\x38\x41\xf8\x2e\x31\xa5\xf4\xd6\x75\x8b\x91\x35\x4a\xf8\x98\x39\xf7\x74\xe5\xf1\xbf\x51\xa6\x11\x8d\x9a\x2d\x9e\xc4\x75\x1e\x0a\xc9\x01\x04\x27\xc9\x29\x3a\x08\x7d\xfb\xc4\x15\xc1\xff\x2b\x70\x94\x8c\x81\x06\x4b\xe3\xa1\x4a\x7d\xee\xf1\x97\x21\x28\x51\x61\xd0\xa2\xef\xaf\xe3\x35\x0c\x10\xa0\x92\x1c\x40\x70\x94\x1c\x59\x2e\x6a\xca\x76\x74\xe9\x73\xe9\x41\x6a\xcd\x9b\xfb\x0a\x7d\xde\xef\xd5\xca\xff\xff\x31\xf7\x97\x51\x55\xad\xed\xff\x3e\x4c\x77\x09\x48\x49\x09\x22\xdd\x48\x4b\x23\x88\xa0\x94\x74\x48\x83\xd2\x48\x28\x48\x97\x28\x02\xd2\xad\x84\x74\x37\x48\x48\x48\x49\x23\x21\xdd\x9d\xd2\x08\x3c\x63\xdf\xf7\xbd\xd6\x97\x3d\x41\xe7\xfe\x3d\x7f\x5e\xec\x31\xf6\xcb\x63\x9c\x8b\x6b\x79\xec\x2b\x3e\xf3\x9a\xe7\x22\x8d\x65\xad\x78\x9c\xa5\xde\x7a\x87\x9e\xe2\xa6\x07\x31\xf2\x6f\x5b\xc9\x11\xc3\x02\x7a\xc9\xc9\xbb\x8e\xf1\x8c\x58\x0d\x55\x11\xd5\xba\x18\xe3\xba\x5a\xf9\xd9\xdd\x9c\x92\xfe\xa9\xba\x6a\xbd\xdb\xcb\x29\x83\x9f\xf0\xfe\xaf\xb3\xf6\x6f\x7b\xc9\x11\xc3\x02\x9a\xc9\xb1\x6b\x78\x33\xc9\x4d\x2f\x0a\x67\xa8\x12\x60\x44\xde\x44\x8b\xd6\x22\x2b\xd6\x22\xd1\x6b\xcb\x25\x73\x85\x45\x7d\x3b\x8b\x2d\xee\x41\x8c\xfc\xdb\x66\x72\xc4\xb0\x80\x6e\x72\xdc\x8c\x8c\x94\x58\x8f\x06\x61\x1a\x1b\x1d\x26\x3f\xa4\x77\x3f\x43\xf2\x9e\x9f\xfa\xc0\xd1\x2e\x8f\xd8\x11\x48\x98\x3b\xe8\xaf\xe1\x41\x8c\xfc\xdb\x6e\x72\xc4\xb0\x80\x76\x72\x37\x63\x8a\x59\x22\x8e\x18\x9e\x26\x69\xf4\x4c\xd0\x50\x2f\x77\x2d\x24\x8c\x0b\xf5\x38\x2c\x07\xa3\x3b\x74\xb7\xc3\xc7\xf2\xc3\x78\x10\x23\xff\xb6\x9d\x1c\x31\x2c\xa0\x9f\xdc\x87\x60\x83\xb8\xef\x4d\x0b\x5a\xfb\x98\xf7\x8d\x91\x9c\x5c\x8b\xf0\xfa\xcb\x5b\x1f\x76\xe3\xfb\x13\xdb\x1d\x72\x62\xfb\x7f\xfd\x6b\xa1\xfd\x6d\x3f\x39\x62\x58\x40\x43\x39\x97\x04\xd1\x62\xfa\xae\x5b\x42\x47\xa9\xe1\x6d\x91\x59\x82\x5a\x8c\x1f\x86\xfd\xd3\x9f\x4b\xee\xc3\xab\x70\xbb\x05\xe2\xb8\xfc\xb5\xd7\xff\x6d\x43\x39\x62\x58\x40\x47\xb9\xbc\x79\xd4\xd0\xd1\xac\xbc\xf1\xa8\x2a\xd5\x18\x51\x55\xac\x38\xc6\x0e\xc4\xef\x74\x37\x3c\xca\x1e\xf9\x77\x37\x2a\x90\xab\xc3\x7b\x10\x23\xff\xb6\xa3\x1c\x31\x2c\xa0\xa5\xdc\xf7\x6b\x02\xa1\xd2\x51\x86\xf1\xf7\x16\xc7\x15\xcf\xd8\xb3\x44\x47\x32\xdb\x8f\x32\xe5\xfb\x90\xd2\x7e\x3d\x59\x50\x31\xcc\xe6\xf4\x20\x46\xfe\x6d\x4b\x39\x62\x58\x40\x4f\x39\xfc\x47\xb5\xf6\x25\xd5\x4a\x12\x5d\x5f\xd8\x39\x0a\x6f\xdf\x9e\x72\x7a\x9f\xf7\xc4\x75\x7f\x8b\x32\x7c\x2f\x2e\x11\x69\x9f\x51\xcd\x83\x18\xf9\xb7\x3d\xe5\x88\x61\x01\x4d\xe5\x5e\x34\x57\x68\x99\x8c\x4b\x51\x9c\x34\x0c\xf2\x4a\xd9\x46\xa4\xe6\xc4\xc6\x3f\x13\xc5\x39\xd8\xd2\x95\x78\x39\x3a\x4c\x89\xca\xe2\x41\x8c\xfc\xdb\xa6\x72\xc4\xb0\x80\xae\x72\x71\x53\xe3\x3a\x8e\xd5\x77\x37\x3d\x89\x5f\xce\xd5\x85\xe7\x60\xf2\x08\x15\x4c\x0e\x2f\xbd\x9e\x7f\x80\x15\x34\x34\x8e\x7a\xcc\xec\x41\x8c\xfc\xdb\xae\x72\xc4\xb0\x80\xb6\x72\x06\x22\xe4\xd4\xef\xd5\x94\x12\xb2\x6a\x51\x49\x3b\x43\x74\xe8\xee\xf2\xce\x66\x51\x2c\x8b\xe4\x98\xca\x0f\x61\x25\x34\xa8\xfd\x75\xd6\xfe\x6d\x5b\x39\x62\x58\x40\x5f\xb9\x9d\x9a\x6f\xf8\x77\x47\x1e\xfb\xe2\x5a\x25\xd4\xfd\x78\x65\x37\xfe\x5a\xb7\xcd\xb3\x99\x73\x2d\x6c\x2b\xc4\x41\xfb\xd5\x1e\x32\xb7\x07\x31\xf2\x6f\xfb\xca\x11\xc3\x02\x1a\xcb\xb5\x7c\x1d\x23\x10\x18\x8e\x72\xd3\x72\xdd\xe5\xc2\xb7\xf6\xc4\x49\x7a\x1e\x77\x44\x7f\xe0\xf2\x26\x97\xcb\xcc\x90\x7e\x32\xeb\xaf\x23\xcd\x6f\x1b\xcb\x11\xc3\x02\x3a\xcb\x09\xb7\x06\xdc\xd9\x46\x18\x78\x13\x9f\x81\x78\xe4\xd7\x2d\xb6\x53\x33\xe4\x63\x48\x69\x6e\x73\x5a\x31\x43\x7d\xb8\xfe\xcb\xf5\xaf\xc3\xd6\x6f\x3b\xcb\x11\xc3\x02\x5a\xcb\x91\x18\x49\xdf\xa2\xda\xb3\xc2\x96\x26\xef\xd6\x5f\x79\x73\x57\xf1\xc7\x7d\x0e\x71\x8a\xf6\x23\x17\xa5\x00\x6b\x7d\x61\xea\xa9\xbf\xd4\xf8\x6d\x6b\x39\x62\x58\x40\x6f\x39\x03\xc3\xcd\xde\xac\xc8\x94\x97\xeb\x99\xcb\xe5\x42\xee\xb7\x6e\x3f\x9c\xd6\x9b\x5c\xf3\x8e\x56\x56\x28\xac\x85\xc5\xf5\x75\x91\xf7\x20\x46\xfe\x6d\x6f\x39\x62\x58\x40\x73\xb9\x2a\x92\xed\x37\x2a\x4a\xe6\x35\x0f\xe9\x57\xc9\xb7\x92\x27\xb9\x71\x12\xd3\x98\xd7\x4d\xef\x6b\xf2\x0d\x84\xd8\x47\xd6\x72\xf0\x78\x10\x23\xff\xb6\xb9\x1c\x31\x2c\xa0\xbb\x9c\x64\x99\x33\x27\xa5\xd1\x68\xe0\xb5\x04\xaa\xda\x1d\x6c\x2f\xf5\x22\xc5\x69\x26\x78\xa2\x7a\x9d\xe5\xbc\x90\xf8\x1f\xed\x84\xe4\x1e\xc4\xc8\xbf\xed\x2e\x47\x0c\x0b\x68\x2f\x27\x57\x7d\x4d\x69\x24\xee\xeb\x87\x07\xe5\xc5\x41\x34\x99\xb8\xa9\x25\xe3\x35\x7e\x13\x24\xef\x31\x51\xc2\x83\x6f\xc8\xf4\x89\x60\x78\x10\x23\xff\xb6\xbd\x1c\x31\x2c\xa0\xbf\x1c\x92\x70\xd7\x4f\xd7\x25\xd6\x9b\x86\x75\xf0\x2d\x95\x1c\xbd\x4f\x37\x44\xc3\xda\x62\x8e\x2b\x3f\x77\x09\xfe\x50\xbc\xd7\x63\x61\xe3\x41\x8c\xfc\xdb\xfe\x72\xc4\xb0\x80\x06\x73\x0e\xdd\x15\x87\xa6\xa8\x42\x96\x41\xaf\x0f\xa2\xc2\x7a\xe6\xc9\x7c\xfd\x71\xc3\x44\x8d\x03\x54\xbc\x8e\x72\x99\x8e\x71\xa8\xfe\xfa\xce\x7e\xdb\x60\x8e\x18\x16\xd0\x61\xce\x05\xdf\xe2\x73\xe5\x91\x85\xf5\x4d\xbf\x2e\xc2\x6b\x1d\x6d\x34\x36\x21\x75\xf3\xa7\x7c\xd8\xb9\xb9\x85\xb9\x6f\x77\xcd\x14\xfe\x3a\x1f\xfd\xb6\xc3\x1c\x31\x2c\xa0\xc5\x9c\x4e\x62\x17\x0a\xbc\x47\xf6\x60\xc4\x16\xb6\x21\xbd\x0b\xd2\x62\x24\xf6\x33\xdc\x01\x24\x69\xac\xa7\x61\x08\x85\xb0\x0e\x52\x7f\xad\x4e\xbf\x6d\x31\x47\x0c\x0b\xe8\x31\x17\x76\xd6\x41\xe8\x4e\x75\x8f\x96\x2b\xf8\x47\x86\xcb\x3c\xc5\x9e\x74\xa1\xdc\x4f\xb9\x26\x7b\x6e\x9f\x63\xc7\xf8\x24\x6a\xc4\xbf\xfe\xb2\xdf\xf6\x98\x23\x86\x05\x34\x99\x73\xb2\x5a\x68\xa3\xcc\x24\x40\xd7\xa5\xc1\x5e\x8a\x2b\xf8\x3c\xf0\xdc\x22\x21\x92\x8c\x78\xea\xbb\x15\xe3\xaa\xdf\x23\x35\xb4\xbf\x0e\x0e\xbf\x6d\x32\x47\x0c\x0b\xe8\x32\x67\xc3\x4d\x4d\xf6\x11\xd1\x5e\x2d\x3c\xc8\x68\xd6\x12\xe7\xeb\xe9\x33\x4b\x2c\x67\x36\x5a\xe3\x0a\x34\x9a\x10\xcd\x74\xc5\x5c\x58\x0f\x62\xe4\xdf\x76\x99\x23\x86\x05\xb4\x99\x73\xd3\x1c\xd8\x62\x0c\x78\x3d\xb6\xbe\x6d\xf3\xae\x2e\x3b\x09\x1f\x6d\x60\x15\xf5\x53\xe5\x6c\x71\xfb\x37\x18\xb3\x86\x40\xb8\xbf\x76\xd4\xbf\x6d\x33\x47\x0c\x0b\xe8\x33\x27\x96\x95\xb8\xe0\x98\x3a\x98\x72\x76\x7a\x2d\x50\x22\xe6\x19\xed\xa6\xb5\x60\x13\xaf\x53\xa8\x56\x9b\x57\x3d\x9a\x46\xfd\x28\x9b\x07\x31\xf2\xef\xfa\xcc\x55\xe0\xfc\x77\x43\xf7\x4b\x73\x50\x25\xad\xf9\xf5\x74\x23\xee\xcc\x8f\xca\x93\x3b\x16\xd1\x3c\x75\xa2\xca\x38\x1d\x2f\xbc\x5b\x9f\x5a\xbb\x70\x7c\xb3\xf4\x88\x62\x1b\x62\x50\xa3\x85\xf9\x2f\xad\x5f\x8c\x99\xea\x3a\x55\x53\x8a\x8c\x13\x7f\x82\x38\x88\x16\x38\xd3\xb2\x64\xa2\x1b\x3f\xd9\xee\x51\x34\xa4\x1d\x40\xcc\x92\x72\x0e\xed\xcd\xec\x52\xe0\x58\x0b\x24\x55\x95\x44\x7e\xd1\x4f\x3d\xe6\x76\x9b\x68\x5c\xce\x2e\xaf\x37\x28\xc9\x26\x25\x69\x4c\xbb\x6d\xec\x1c\x2a\xa5\xa5\x47\x79\x83\x31\xa5\x3b\x24\xbb\x50\xc8\xc5\xde\x5a\x25\xf3\xfa\x8b\x35\x76\x2a\xf5\x06\x74\x04\x17\xff\xf0\x27\x5f\x51\xcf\xa1\x82\x07\xfc\x18\xb7\xbf\x04\xe4\xea\x2b\x14\x4e\xaa\x06\x6e\xaf\xfb\x7a\x7e\xa4\xf1\xd3\x43\x6c\x73\x91\x7e\x08\x5f\xf7\xc1\x46\xf9\x1c\x3a\x6f\x67\x4a\xd4\xdd\xe8\x22\xbc\x5e\xb9\xba\x0b\xbf\xe5\xbc\x28\x83\x57\xca\xad\xf5\x2c\x71\xb4\xbe\x9f\x7b\xb5\x3b\x32\xc9\xf9\x1c\x1a\x9d\xb3\x96\x4d\xe5\x29\x81\x99\xf7\xf5\x27\xf5\xb3\xad\x4a\x54\x0a\x5c\xfb\xac\x01\xcc\xe1\xf6\xaf\x93\x49\x3f\x1d\xb2\x86\x90\xce\xa1\xeb\x26\x4a\xd7\x33\xbe\x55\xe9\xdd\x6d\x15\x1f\x50\xde\xdb\x29\xd7\x66\x64\x4d\x8b\x4b\x3d\x28\x47\x4e\xcd\xd8\x9f\x6a\xa6\x8d\xf9\xff\x0f\xc5\xde\xd0\x6e\x7a\x8c\x17\xba\x45\xe1\xbd\x60\xa9\x74\x7b\x99\xcc\x30\x4a\x40\x95\xba\x9d\x06\xe3\xce\xfa\x11\xcf\xc1\xdd\x80\x0f\xe7\x50\xa4\x80\x1b\x3a\xda\xdc\x02\x91\x41\x39\xaf\xf3\x2c\x53\x84\xab\xbf\x5a\x4c\x7f\x7a\x42\x22\xad\xca\x8f\x6d\xfa\x23\x57\x84\x89\xf6\x1c\x9a\x70\xf4\xd6\x6c\xd8\xbb\xf8\x2b\x8f\xc0\xc9\x63\x0b\xce\xf0\x69\x14\x35\xb7\x7a\xbc\xa3\x17\x04\xcd\x18\xbc\xe3\x4d\x96\x96\xa6\xe7\xd0\xf8\xd3\x1d\x3f\x87\x76\x2f\x7c\xca\x1e\x09\xb4\x77\x78\xa3\x52\x22\x3d\x54\x49\x1d\x5f\x39\x29\x3c\xd6\xca\x35\xe2\x6e\x1c\x75\x9f\x43\x75\x54\xa5\xdb\x7a\x52\x1b\xa9\x24\xd7\x3b\xdb\xc8\x39\xe4\x48\x5a\xe2\xfc\x85\x2a\x0b\xbe\x3d\x89\xea\xd6\x0c\xbd\xab\xfb\xa0\xf0\x1c\x3a\x92\x39\x4e\xad\x3d\x52\x9b\x2b\x29\x72\xd4\xd9\xc3\x49\x22\xb2\x52\x9d\x3c\x30\x65\x3c\x54\xf0\xb2\x42\x14\x27\x3e\x07\x7f\xfc\x1c\xfa\x81\x27\x63\x98\xec\x11\x7f\x48\x0b\x4e\x6a\x4d\x75\xb2\xd8\xe8\xa3\x02\x07\xb7\xf2\x97\x82\xdc\x8f\x5a\xae\xa1\xd6\x38\xad\x9d\xff\xb2\xb4\xed\x45\x25\xe7\xee\xb7\x54\x13\x95\x66\xdf\x23\x95\xb0\xc9\xbf\xe3\x54\xdd\x23\xb3\xc1\xc2\xc0\x85\x8e\x70\x9f\x29\xc6\xe9\xde\x39\x74\x32\x6c\xd7\xff\xfd\x97\x27\x02\x0c\x89\x51\x5d\x0c\x87\x0b\x68\xfc\xfe\xe5\x03\x0b\xc5\xdf\x8e\xb2\xe1\xca\xfc\xd5\x08\xd6\x8d\xce\xa1\x18\x2f\x09\x02\x88\xd6\x9c\x53\xbb\xbf\x29\xc4\x4e\x08\x4e\xb4\x94\x4e\x1d\x2c\x59\xeb\x68\x94\xd9\x09\x2e\xfa\xcc\x4a\xf7\x7c\x3c\x87\xc2\x3d\x36\x4b\xc9\xd8\xab\x46\x69\xa1\xfa\xe0\x30\xa1\xc6\xa2\x1e\x96\xfe\x0e\x9b\xc5\x04\x25\x57\x61\x45\x1d\xe7\x57\xad\x9e\xda\x39\xf4\xc5\x83\xe3\xd9\x79\xab\xc6\x16\xc9\xa8\xbe\x8c\x5a\x5f\x7f\x2c\x37\x3d\xc6\xa9\xce\x6b\x7c\x63\xc5\x06\x4f\x10\x87\x7a\x15\x5c\xcf\xa1\x2c\x9c\x1f\x99\xbe\x70\xa4\xe3\x58\xaa\x72\x59\x0a\x45\xb9\xff\x50\xb7\xe5\x75\xdd\x60\xe9\x9e\x70\x2a\x53\xad\xf1\x10\x79\x42\x7c\x0e\xfd\x88\xff\x9c\x46\x51\x49\xf2\x99\x3e\x26\x2f\xa2\xf2\x62\xf7\xa3\x07\x24\x7b\xb8\xc4\x0f\x8f\x50\x05\x1d\x02\x90\x5d\xee\x7c\x39\xef\xab\x69\xec\xbc\xc6\x63\x2d\xd8\xac\xb3\x4f\x3d\x6a\x6a\x4b\xd1\x82\x30\xe2\x1c\x56\x99\x68\x5f\x9a\xd6\xcc\x10\xae\x2d\x2c\x1f\xad\x9c\x43\x9f\x4d\x4d\xbf\x43\xaf\xa6\x7e\xba\xdd\x49\x74\xad\xaa\x46\x7f\x1f\x9e\x0a\x86\x66\xec\x2e\x9f\x64\x4a\x52\x90\xce\x38\x1f\xab\xc2\x39\x14\xbe\x30\xeb\xcb\x72\x0a\x97\x45\x32\xf7\xbb\x50\xd8\x0c\x72\xa2\x7e\xd2\xbc\xc1\xfb\x13\x70\x4d\x9c\xad\xf7\x3d\x49\xa2\x7c\xe6\xcf\xa1\xb0\x3a\x65\xc1\xc1\x7e\x02\x7e\x44\xb3\x2a\x8d\xbc\xf1\x1f\x75\x24\x86\x91\xfa\x99\x6a\x93\x1a\x03\x7f\x39\x51\xb4\x7d\xe6\x21\x3f\x87\xf6\x35\x1d\xb2\x51\x60\x0c\x64\x09\xbf\xa6\x4f\xbf\x8b\x1b\xf7\x9a\x7d\xb1\x6d\x51\xdc\x5f\x8c\x29\x8c\x5a\x06\xc1\x92\xab\x69\xe4\xfc\x3f\xec\x28\xed\xd6\x27\x29\x87\x72\xae\x0e\x2a\x4e\x82\x60\x83\x43\xec\xc2\xbb\x11\x59\x46\x2d\xfe\x64\x89\xf5\x12\xd2\x48\xb7\x1c\xcf\xa1\xd9\x68\x74\x1a\xe9\x8c\x30\xf9\xc9\xc3\xef\x19\x7c\xa6\x3e\xa0\xba\x30\x30\xa7\x37\x73\x4f\xdd\x8e\x76\xed\xdb\xd5\xb8\x76\xd7\xe6\xfc\x44\xf4\x75\xc5\xd1\x68\x9b\x45\xcf\x7e\x29\xa4\xf5\x17\x47\x8d\xad\x29\x1a\xd6\x6d\xc1\x7a\x79\x4f\x93\xcf\x8f\x1b\xb4\xd1\xfa\xcc\xce\xa1\x53\x6c\xee\x64\x4b\xc5\xc2\x61\xd7\xf6\xf1\xb6\xde\x30\xc9\x7f\xca\x28\xce\x7c\x74\x38\xa2\x50\xb8\x59\xb1\x3c\x3b\xae\x2a\x6c\x70\x0e\x9d\xd3\x7d\xe0\xf1\x94\x87\x97\xf5\x58\xf1\x7a\x3f\x03\xea\x03\x0e\x2f\xf8\x1e\xa3\x0c\xcd\x85\x40\x52\xa9\x84\x07\x2d\x92\xb5\xef\xce\xab\x7d\xdb\x9f\x1f\xc5\x7a\x76\xc0\x2a\x2c\x52\x10\xd7\xf6\xd6\xec\xb4\xf7\x0f\xe3\xd2\x86\x07\xe6\xfa\x21\x7b\xc1\x5f\x29\x0e\x39\xcf\xa1\x71\xe2\x82\x51\x36\x2a\xde\xdf\x8f\x54\x18\x0c\x92\x39\x0e\x22\x05\xec\x52\x7c\x0c\x12\xe0\xd9\x67\x82\x12\x76\xa4\xd9\x28\xf7\xce\xa1\x25\xf0\x35\x5d\xa4\x0a\x5e\x92\x48\x6d\x1f\x2a\xba\x1b\xab\x0f\x42\xe0\x06\x86\xf6\x16\xd6\x16\xe1\x87\xdf\x1c\xd6\x3d\x31\xfb\x79\x0e\x9d\xb1\x54\x71\x45\xac\x1f\xce\x59\xc6\x96\xde\x90\x46\x38\xec\x30\xf7\x5c\xaf\x5a\xec\x5b\x33\xad\x5c\xb0\x35\x34\xda\xf6\x3c\x8f\xd6\xae\x15\x1a\x46\x6b\x5a\xd8\xe0\x7e\x62\x60\x70\x9a\x60\x2a\x5a\x5d\xa7\xa8\x9c\x22\xf8\x98\xe1\xfd\xad\x97\x76\x7e\x4a\xd9\xf7\x1c\x8a\x5c\x18\x22\x90\xaf\x9f\x48\x3f\x38\x8c\xf0\xa6\xf8\x8b\xc8\xfe\x70\x77\x7a\x90\x69\x17\x5c\xad\x33\x35\xe2\x96\x2b\xb5\xd2\xc3\x73\xa8\xda\xed\xc6\xb0\x43\xa4\x5b\xbf\x32\xca\xa7\xc5\x62\x29\x84\x58\x03\x0f\xed\x2c\x15\xee\x6c\x7e\xf6\x52\xc8\xcf\x0b\x56\x75\x3a\x3f\x67\x15\x1e\xbe\x66\x14\x11\x73\x8d\xdf\x6a\x6f\xdd\x3a\xbc\x95\x89\x38\x4e\xaa\xf0\xe2\xac\x95\xf9\xd6\x2f\x87\xed\xa0\xe4\x40\x02\x86\x73\xa8\xaa\x8a\x75\xbb\xa3\xe9\x96\xa3\xe6\x0c\x45\x66\x8e\x7e\x49\x07\x01\x93\x93\xa5\xe6\xb7\x21\xaa\xc2\x9a\x8f\x6c\x96\x21\xa1\xe7\x67\x17\xe2\xb7\x67\xca\x4b\x2c\xf1\x12\xb0\x48\x5c\x79\x0a\x91\x69\x25\x39\x7d\xbb\x2a\x34\xaf\x96\xc6\x85\xcd\xba\xed\x8d\x1f\x67\x7c\x3d\x87\x6a\xb8\xe4\xf0\x99\x70\x24\x3a\x52\x48\x66\x58\x8d\xec\x04\x27\x49\x3e\xf3\xfd\x21\x1b\x20\x26\xf6\xae\x96\x64\xcc\xcf\x9c\x4f\xf2\x1c\x6a\x4f\xbc\x99\xe7\xd3\x29\x84\xb4\xfe\x96\x25\x24\x80\x02\xc9\xe1\x28\xf1\x99\x4a\x9d\x12\xba\x4d\x45\xff\x2e\x66\x5e\xa8\xa9\xe8\x39\x54\x53\x17\xf3\xc6\xf3\x17\x7c\x0e\x15\x42\x83\x01\x19\x4b\x8a\x31\xa9\x2a\x92\x5f\x83\xed\x52\x1b\xc4\x44\x4c\xdf\xcb\x6d\xab\xbe\x3f\x87\x86\xda\x44\x19\x79\x85\x61\xc4\x1e\x31\xba\x1b\xe0\xc5\x70\x11\x51\x27\x7d\xb8\x93\x4f\x45\x3c\x8b\x49\x4f\x3b\x19\x3b\x33\x91\x7f\x0e\x7d\x88\xd0\xfe\xb5\x35\xdf\x8f\x59\x3b\x2e\xaf\x2e\x25\x20\xa6\x8b\x3c\x6c\xaf\x4e\x04\x55\xe6\x1d\xdd\x3c\x0f\x82\x40\xb1\x7d\xd0\x39\xd4\x6b\xee\x2e\x37\xd1\x80\xb6\x2c\x93\x78\xc6\xd4\x97\xf7\x62\x59\x45\x63\xdb\x07\x9a\x34\x46\xa2\xf3\xef\x42\x16\x08\x5b\x5e\x2d\xf8\xc0\xfd\xb3\xcd\x40\xc0\xb9\x9a\x3d\xc3\x32\x1e\x61\xbe\x92\xd7\x9f\xbd\xbd\xf9\x1d\xfe\x63\x49\x02\xdd\xfc\x48\x48\xcf\x66\x3f\x0b\xa6\x0d\x6b\x5b\xda\xad\x0d\xe9\x73\xa8\xc8\x37\xfd\xbd\x2c\x44\x6f\x1f\x67\xaa\xd1\x48\xca\xfa\x7d\xe7\xfd\x7a\x4a\x37\xa9\xec\xa8\x5f\x8c\xd4\x23\xb7\xb8\x8d\x2c\x7b\x45\x44\x30\x30\x3c\x45\x44\xce\xaf\x48\xd7\x4f\xde\xf3\x44\xb3\x59\xb7\x7e\x5d\xff\xfa\xcd\x72\x67\xe1\xf8\x26\x5a\x7a\x9a\x59\x93\xb2\xa2\x7f\x67\x66\xe9\xa2\xc5\xf9\x5d\x49\x77\xac\x5b\x54\x92\xd0\xd2\xf7\xf1\x11\x99\xea\x38\xeb\xef\x52\x31\x06\x7b\x35\x9f\x06\x3b\x1b\x29\x0a\x9b\xb6\x4b\xba\x56\xc5\xfe\x1f\xaa\xee\x22\xfe\xb3\xa1\x79\xc3\xc3\x20\x79\x89\x0a\xbb\xfb\xbe\x11\x55\x16\x11\xf9\xdb\x1f\xce\x8a\x4d\xc0\x2c\xd9\x4a\xae\xd6\x2b\xeb\x39\xf4\x91\xf0\xb5\xf7\x59\x7b\xb1\x63\xb8\xd7\x59\x31\x22\xe9\x01\x31\x42\xd1\x73\x93\xff\x87\x3f\xdc\x53\x12\x46\x04\x06\x06\xe6\x1e\x0c\x9c\x3b\x0c\x0c\x8c\xa7\x88\xc8\x7f\xff\x7b\x23\xee\xfe\x00\x16\xf0\xa9\x9d\xfc\x08\x3f\x7f\x61\xc4\xa8\xf1\xdf\x89\xb0\x7a\xcf\x11\x3c\xbb\x1c\xe7\xd5\xe3\x18\xa3\xa3\x20\xf9\xcd\xa8\x66\x83\xca\xd7\xf3\x0a\x3e\x55\x02\x86\x47\x04\xf8\xb1\x05\xb6\xa5\xba\xcd\x8b\x66\xce\x2b\xed\xf5\xd6\xe4\xa1\x4c\xca\x21\x94\xd1\xd4\x0f\x49\x6b\x8e\xd9\x7f\x8e\x22\x72\xb1\x88\xbf\xb8\x8a\x8f\x75\x57\xbc\xf0\xb1\x82\x1f\xfa\xf5\xec\xe8\x2a\xbb\x2b\x47\x43\x8f\x77\xbf\xab\x5a\xfe\x38\xfc\xb1\xb3\xcc\x64\x88\x6d\xb5\xe5\x77\x23\x78\x2e\x9c\xe9\x4a\x46\xab\x73\xe1\x63\x69\x89\x49\xd5\x07\x11\xfa\x6d\xa8\xbc\x02\x1f\xce\xda\x7c\x9b\x33\x19\xe2\xf1\x9f\xda\xc9\xb3\x56\x6c\x90\x42\xb3\xdd\x14\x70\xbc\x92\xd1\xbe\xb8\xf0\xb1\xba\xc8\xda\x59\x3b\xaf\x94\xf8\x6f\x8f\x87\xb1\x14\xeb\x58\x73\x30\xee\xe5\xcc\x3a\xd3\x5f\xe3\x5c\x40\x1a\xd2\xa7\xff\x29\xad\xf9\xff\xfd\x63\x35\xff\x99\xba\xde\x08\x88\xb0\x5e\x62\x70\x30\x1e\xe7\x3e\x71\xdc\x59\xc4\x4e\x0b\x45\x7c\x6d\x95\xee\x9a\x79\x00\xdd\x74\x7d\xd4\x40\x22\xea\xce\x1a\x92\x60\x3a\xeb\x50\x3e\x12\xfb\x88\xaa\xbb\xea\x3f\xe3\xbc\xc4\xdc\xff\x56\xf7\x61\x15\x49\x7f\xe2\x02\xea\x9e\x45\x6d\xa2\xfe\xac\xd1\xf6\x0c\xb6\x73\x6d\xb5\xd7\xc6\x4c\x27\xd6\x22\x5d\x5d\xcf\x36\xf9\x12\xa4\x2e\x18\xe7\x25\x06\x83\x70\xbe\xee\x62\x54\x47\x72\x9d\x98\x38\xf1\x6b\x8f\x74\x91\xcd\x77\x4a\xcf\xd3\x5d\x5e\x44\x04\xac\xf9\x92\x30\x39\xec\x10\xf5\x49\x22\xb7\x42\xea\x82\x71\x5e\x62\x30\x22\xe7\xeb\x2e\x08\x21\xd5\x62\xe2\xc8\x2f\xc0\x0c\x60\xec\xfc\x7c\x58\x3e\x98\x5d\xb0\xa1\xfc\xf1\x1a\x5e\x91\xe4\x7c\x02\xd6\x46\xbb\x5b\x21\xa4\x2e\x18\xe7\x25\x06\x03\x77\xbe\xae\x66\xd7\x50\xfe\x8e\xf3\x17\x5a\x8f\x4c\x94\xf0\xa0\x9f\x37\x37\x33\x7e\xc4\x7c\x92\x58\xfa\x16\xad\x6c\xf3\xcb\xe1\xdd\x75\x8f\x46\x77\x89\x7f\xc6\xfd\xf5\xef\xe6\xee\xe1\x23\xaa\x2c\x22\x06\x03\x77\x41\x03\xcd\x7f\x36\x8b\x5c\x26\x80\x6c\xe9\xe3\x5b\x05\x2e\x72\x39\x0c\x9d\xef\x84\x94\x02\x22\x7b\xee\xc9\x6e\x64\x7c\x7c\xcf\xcd\xd7\x39\xb8\xc1\x30\x10\x8c\x6f\x0a\x19\x38\x18\x07\x14\x00\x3e\x7a\x88\x32\xad\xac\xb5\x64\xf1\x8e\xef\xb6\xff\xab\xa7\xc6\xf7\x0a\x49\xd3\xd8\x1f\xf5\x51\x49\xec\xa9\x9a\x3c\x52\x8d\x24\x80\xd4\x05\xe3\x80\x02\xf0\xd9\x07\xe3\xef\xf3\xdb\x6d\x5b\x13\x70\xad\x58\x2e\x2e\xb4\x95\x58\xbc\xdd\xd6\x3a\x7e\x56\xa9\xb4\xe3\x84\x7e\xef\xa1\xe6\x08\xa4\x2e\x18\x07\x14\xa0\xe4\x87\x71\xbd\x82\xa7\x5a\xea\xdd\x67\x13\x37\x38\xac\x51\x16\xb4\x75\x63\x46\xb3\xf3\xae\xbd\x84\x19\x62\x8f\xfc\x72\xea\x19\x0c\xa9\x0b\xc6\x01\x05\xb8\xb7\xec\x70\xbf\xa3\x2d\xc6\x71\x66\xeb\x54\x7d\xfd\xad\xbe\xd2\xd0\xfe\x9d\x05\x1f\xe5\x01\x1b\xfb\xc1\x43\xa5\xe8\x65\xaa\x5f\xee\xf7\xfe\x19\xf7\x3f\x01\xfe\xb3\x76\xfc\x41\x01\xb0\x19\xfd\x32\x05\x5c\xab\xdf\x86\x9f\xd0\x79\xaa\x6f\xb6\x6a\x65\xf0\xb4\x65\xe7\x98\x9f\x58\x15\x3a\xc7\xa4\xe2\xbf\xfb\xe9\x6a\x14\x58\xe2\x91\x03\x19\x3a\x18\x07\x54\xe0\x28\xcd\x9d\xc8\x18\xd1\x4d\x09\x83\x71\x82\xad\x89\x22\x20\x68\x3c\xe0\xdd\xb4\x33\xd9\x7d\x34\x74\x6f\x38\xbe\x74\xb7\x06\x0c\x48\x5d\x30\x0e\xa8\x80\x2c\xdf\x30\x19\xa6\x8b\x92\x67\x41\x61\xd3\x0b\x8a\x92\xed\x61\x0f\xbd\xa2\xee\x11\xac\xa2\x91\xb3\x9e\x4f\xa4\x56\xcd\x4f\xc7\xa0\xca\x82\x70\x40\x05\x34\x1f\x5b\x6f\xaa\xf9\xf5\xeb\x74\xe8\x77\x2e\x54\xef\x4f\x47\xac\xd7\xdb\x7d\x0c\x73\x4b\xe8\xc2\x2d\x85\x85\x67\x2d\x88\xdf\x85\xd4\x05\xe3\x80\x0a\xb8\x8d\x32\xe9\x11\x85\x72\x16\x49\xb1\xc3\xb7\x91\x0a\xa5\xa9\xf2\x30\x64\x3a\x7b\xbc\x2c\x41\xca\x9c\x83\x35\xca\x54\xe0\x11\x76\x97\xfa\x67\xdc\xff\x14\xf8\xef\x42\xfe\x07\x07\xc0\x96\xd7\xcb\x1c\x58\x0e\x32\x82\xbd\x66\x99\xf5\x5c\x70\xa3\x8d\xf4\x86\xc7\x9e\x1b\xfc\x0e\x42\xd5\xe0\x09\xe6\xb1\x91\xe8\xba\x30\x95\x2b\x81\x01\x64\xec\x60\x1c\xd0\x81\xc4\x6b\x66\x8b\x33\x65\x5b\x0c\x9b\xcd\x14\xd9\x25\x9a\xe2\x88\x0f\x0b\x1f\xd3\xc9\x31\xff\x8a\xf6\xa5\x5d\x33\x34\x47\x0e\xa5\x87\xd4\x05\xe3\x80\x0e\xcc\x86\xaf\xa0\x57\xe1\x7f\xc7\x66\x7d\x83\x42\xd1\x71\xf4\x95\x1e\x83\x64\xaf\xda\xa8\x9e\x34\x6a\xca\x30\xbb\x71\x4a\xb3\x14\xba\x0e\x80\x71\x40\x07\x5a\x1e\x47\xe4\xd3\x62\x28\xcc\xc0\x0f\x49\xad\x35\x66\xa6\x8d\x93\x59\xde\x1f\x24\xfa\x59\xab\xea\xa0\xd8\xf0\xe4\xf5\xde\xb1\x15\xa4\x2e\x18\x07\x74\xe0\x93\x30\xb3\x1f\x9b\xc5\xa9\x65\xac\x86\x7b\x5d\x1e\xc6\x8b\xfe\xcc\x42\xe5\xac\x38\x49\x12\x38\xa3\x42\xfc\xf8\x16\xd5\x10\x5c\x88\x03\x60\x1c\xc4\x81\xff\xec\xaa\xfe\xe0\x00\xd8\x5e\xe7\x32\x07\x6a\x6d\xc5\x9b\xd7\x8b\xc2\x1a\x5c\xa7\x33\xdb\x9f\xa0\xa1\xd0\x7c\x33\xf1\x80\x1f\xee\x0b\xed\xb8\x36\xcb\xf8\xbc\xf7\x11\x86\x32\x64\xec\x60\x1c\xd0\x81\x43\x81\x70\x7a\x32\xfd\xbb\x46\x76\xc9\x81\x34\xb7\xda\x83\xae\xb1\x2d\xf5\xbc\xb0\x0a\x6f\xd0\x11\x27\x18\xe6\xc5\xa3\x6f\x87\x4e\xd9\x60\x1c\xd0\x81\x87\x73\xbf\x9c\x57\x46\xb1\x84\x7b\xf4\xbd\x99\x9a\xb4\x6c\x11\x30\x78\xb6\x2d\xd5\x91\xe5\xbf\x17\xd5\x48\xf2\x10\x8f\x90\xa9\x43\xf7\x18\x20\x1c\xd0\x01\xea\x12\xee\x55\x71\x6a\xe5\xf9\xce\x88\xeb\x1f\xa2\xfb\xb2\x64\x06\xe1\x85\x6c\x7e\x11\x90\x21\xb1\x12\xad\xcb\x77\x7f\x09\x0b\x81\xd4\x05\xe3\x80\x0e\x28\x3b\x14\x78\xed\xa2\xd6\x9a\x65\xe6\xc5\x68\xe5\x2e\x98\xe3\x21\x1c\x0e\x8c\x08\x3b\x64\xc8\x7b\x6e\xd0\xc5\xdd\xa3\xbe\xd7\x00\x71\x00\x8c\x83\xce\x03\x3a\x7f\x76\x00\x6c\xe3\x79\x99\x03\x2b\x86\xd1\xe8\xc7\x7c\x69\x88\x53\xfb\x8a\xd6\x6b\xa2\x0f\x5f\xbf\xfb\xbe\xb4\x73\x0d\xc6\x3b\x19\x81\x35\xd1\x50\x39\x9c\xa2\x19\x32\x76\x30\x0e\xe8\x00\xcc\x09\xcd\xa9\x66\x35\x01\x85\xef\x98\xf7\xbd\x9e\x29\x32\xde\xd7\x84\xb9\xac\x47\xdc\xec\x1f\xeb\xfd\x36\xd3\x09\xa7\x4b\x6d\x21\x75\xc1\x38\xa0\x03\x85\xe9\xdc\x18\x52\x15\xf8\x70\xed\x0c\xce\x08\x58\x6c\x98\x0a\xcc\x98\x4c\x31\x6b\xca\x2f\xb9\x6a\xd8\xfb\x66\xe7\x5b\xbc\x46\x21\x75\xc1\x38\xa0\x03\x0a\x81\x0d\xef\xf7\xfd\x63\xca\xf5\xf0\x77\xfa\xb9\x65\xf0\x69\x93\x4e\x69\x51\xf5\xd2\x84\x2a\x90\xfb\x8b\x16\x3f\x1d\x8b\x64\x41\xea\x82\x71\x40\x07\x4e\x96\x8a\x3f\x7a\x7c\xdc\xd6\xa1\x1e\xa8\x6f\xa4\xf5\x92\x35\xb6\xc6\xa4\xef\x7e\x8d\xf8\x10\xd6\x76\x45\xe9\xab\xbd\x5c\x5e\x2b\xc4\x01\x30\x0e\x3a\x0f\xbc\xf8\x8d\x03\xda\xff\xec\xe4\xee\x8d\x88\x00\xeb\x25\x01\x07\x03\xf3\xb7\x7f\x2d\xba\x72\x8f\x8e\x53\xe7\xdb\x87\x6d\x7e\x3d\x0d\xaf\x8a\x67\xdf\xac\x9a\x61\x4a\x31\x20\xb6\xde\xa5\xf4\xdf\x92\xef\x4c\xb5\x47\x75\x57\xff\x67\x9c\x97\x04\x8c\xfb\xdf\x2b\x47\xa4\xa2\x29\xdb\x72\x15\xf2\xd8\x17\x52\x11\xe7\x6e\xe8\x34\x76\xa3\xe2\x12\x20\x7d\x9c\xd4\x96\xc5\xe8\xa1\x57\x59\xc4\x7c\x0f\xa9\x0c\xc6\x79\x49\xc0\xa0\xfc\xbd\x72\xa8\xba\x64\x07\xbb\x5b\x2b\x3c\x19\x8e\x94\x41\xcb\x2d\x95\x1f\x62\xa2\xac\x30\xd7\xb1\xaf\x69\x3f\x0f\xc8\x45\xe5\xac\x66\xe4\x83\x54\x06\xe3\xbc\x24\x60\x60\x70\x60\xfe\xbe\x2f\x78\x71\x2b\xe0\xd3\xaf\xed\x5f\x1a\x09\x15\x0d\x65\x81\xa9\x54\x1a\x12\xb1\x2e\xc7\x51\x0f\xa5\x93\x2c\xf7\xbb\xc6\x6a\x30\xdd\x21\xe9\x0b\xd8\xf3\x95\xf3\xe9\x8b\x5f\x38\x01\x91\x30\xc5\x53\xae\xaa\xc6\xe0\x57\x0e\x1a\xe2\xf4\xa4\x51\x5a\x7c\x1d\xa9\xf8\x8b\x4e\x92\x15\xa6\x37\x5e\x36\x6b\x9f\x43\xb9\xb3\x9e\xec\x10\x08\xbb\x04\x89\xdc\xc0\xe8\xbb\x66\x85\x7f\x2a\xd4\x18\xf5\xf6\x2e\x41\x56\xaa\x9c\x9d\x43\x6f\xa0\x63\x84\xfa\xbf\x25\x7d\xd9\x43\xfc\x67\x43\xfb\xbf\xf4\x45\x4c\x1e\x1f\x70\x58\x86\xf5\xb3\xc5\xcc\x8a\x35\x1c\x13\x1c\x4a\xdc\x9c\xe3\x7b\x1d\x03\xd7\x88\xf0\xd5\x34\xc1\xf0\xa3\x16\x43\x8e\xda\x2d\x9c\x46\x98\xab\x88\x5f\xea\x2e\xc4\x2f\x7e\x0c\x94\xb4\x78\x67\x3d\x18\xa8\x5f\x6c\xed\x61\xaa\xb1\xe4\xf8\xa3\x7d\x25\x88\x54\x42\xb5\x23\x7c\xa3\x6d\xec\x4a\x52\x10\xaf\x22\x19\x10\xb9\x18\xbf\x0c\x5d\x5f\xb7\xfc\x60\x2c\x49\xc6\x77\xd7\x00\xcf\xaf\xbb\xc9\x8b\x32\x83\xea\x98\x95\x83\xed\xf4\x15\xb6\xca\x63\xe6\x38\x79\xab\xab\xf8\xd8\xba\x8b\xf1\xcb\xe2\x1b\xef\xf7\x29\xe9\xce\xb6\xa3\xbe\x09\x78\x21\xaa\x33\x58\x0f\x66\x6b\x6c\xa2\x43\x6e\x9b\xc5\x38\xc3\x85\xca\x19\xd8\x1a\x5d\xc9\x68\x2f\xc6\x2f\xe2\x89\xfd\x78\x78\x4e\x45\x9e\x6b\x3e\xdf\x9f\x69\x7b\x3f\x31\x25\xfd\x44\x61\xad\x9a\x18\xd9\xa3\xf7\xad\xc3\x4c\x64\xbf\x4d\xfc\x4a\x46\x7b\x31\x7e\x41\x23\x65\xdd\xa3\x3d\x13\xa6\x26\x2b\xd1\x9b\xc6\x8f\x69\x29\x35\x9f\x10\x0d\x6b\x47\x5b\x17\x24\x99\x65\xc9\x16\x21\x3c\xe6\xbb\xb2\xf8\x05\x4c\xdd\xcb\x96\x5b\xc3\x61\x29\x94\x65\x7b\xe4\xa4\xf4\xac\xe3\x23\x2b\x25\x93\x94\xdd\x31\xce\x89\xe0\x49\xe1\x37\xc2\x43\xdf\x91\xee\x34\x74\xdf\x83\x2c\x33\x60\x1c\x70\xb9\xcd\x8b\xcb\x6c\x7c\x4e\xeb\xad\xcc\xec\x44\xb3\xac\xff\xc9\xdd\xc7\x9a\x42\x20\x43\xdd\x32\x97\x89\xd1\x7e\x61\x40\x66\x46\x5d\x03\x52\x17\x8c\x03\x2e\xb7\x74\x2f\x95\x84\x90\x6b\xc2\xe8\xf6\xe8\xc9\xdb\x43\x0f\xaa\x3f\x1e\xf4\xc3\x29\x6e\x06\x6f\x84\x16\x29\x04\xdb\x3a\x2d\x20\x7e\x84\xd4\x05\xe3\x80\xcb\x2d\x6c\xd3\x38\x3e\xf3\x1b\x49\x96\x72\x2e\x07\x0c\x6f\x0b\xfb\x79\xdb\xbd\xa5\x23\xf1\xac\x05\x7d\x4f\xad\xe8\xec\x75\xd2\xa9\x7a\x48\x5d\x30\xce\x4b\x0c\x06\xe7\x6f\x47\x50\xfd\x16\x4f\xd4\x34\x0d\x6a\x73\x5a\x45\x82\x19\xfe\x07\x47\xbe\x18\x6b\x21\x46\x6a\xb0\xb1\xc9\x92\x83\x94\xaa\x3f\x15\x9e\xba\x4b\xfe\x33\xce\x4b\x0c\x86\xd2\xdd\xc3\xe7\xaf\xf9\xea\x0f\x1b\x2e\xb0\x69\xe4\xd2\xc3\xf7\xd1\x61\x69\x77\xdb\x13\x27\x7c\x4a\xf6\x00\x46\x49\xac\x8f\x6f\xc2\x8d\x6f\x5e\xc7\xcc\x61\x52\x13\x1b\x78\x76\xdc\x4a\x1b\x04\x3d\x7c\x83\x70\x40\x03\xf2\x17\xf1\x78\xbc\xe4\x56\x50\x16\xa6\x4a\x90\x5c\xf0\x4e\x7d\x44\xe7\xa9\xad\xca\xc4\x77\x22\x2a\xe3\xe8\xe4\x7b\x9e\xa6\x9a\x43\xea\x82\x71\x40\x03\x58\xfa\xbe\xd0\xd9\x24\x86\xb0\x13\x9e\xda\xfa\xe1\x59\x21\xcc\x8b\x14\x1a\xd8\x5a\xe4\x66\x29\x44\xdf\x1f\xe9\xe7\x69\xf5\xe2\x81\xd4\x05\xe3\x80\x06\xfc\xe0\xd0\xfd\x61\x8d\x5b\x27\xa1\x14\x5d\xf5\x1d\x0e\xfe\xc1\xdc\x64\x60\xc8\xf0\xc4\x1b\x64\xd1\x71\x86\x6f\x76\x3d\x96\xfe\xdd\x90\xba\x60\x1c\xd0\x00\x1d\x06\xa9\xed\xdd\x9f\x87\xe5\xae\xb9\xcc\xa7\xef\x84\x4d\xaa\xf3\x65\x8f\xb4\xa3\x03\x7e\xd5\xd9\xc7\xdc\x0a\x2c\x25\x7c\xe0\x0c\xc9\x5f\xc0\xb8\xff\x19\xf0\x9f\xc5\xe3\x0f\x0a\x80\x4d\xe9\x97\x29\x20\x15\xca\xc6\xb9\x8e\xcf\x66\x48\x15\x13\xdb\x4c\xf6\x5a\x91\xae\xf1\x0d\xaa\x6e\x61\x59\xeb\x73\x46\x03\xee\xb1\xd7\xb5\x1a\x35\x90\xa1\x83\x71\x40\x05\x50\x13\xc8\x25\xde\xa9\xca\xf9\xcf\x9d\xf1\xe6\x3b\x2d\xf8\x97\x3e\xbd\x59\x29\xc1\x4a\xf6\xeb\x81\x36\x5e\x63\x82\x93\x2e\xae\x24\xa4\x2e\x18\x07\x54\xe0\xb1\x44\x4b\xbd\x31\xbe\x50\xc1\x06\xf6\x6a\xc9\x82\x82\x34\xf3\x62\x51\xc4\xfd\x8e\x63\x35\x3b\x12\x6d\xd4\x5b\x1e\x27\x12\x08\x90\xba\x60\x1c\x50\x81\xdd\x74\xb4\x6c\x5b\x22\x1e\x01\xe3\x37\xb2\xda\xa1\xf4\x69\x6f\x0c\xbf\x5f\x77\xa9\x18\xda\x0f\x21\xcf\xbd\x2f\xd3\xbd\x1f\xe4\x06\xa9\x0b\xc6\x01\x15\xa8\x42\x54\x49\x41\xd1\x67\x18\xd6\xb6\x92\x6c\xaa\x0c\x5c\x82\x95\x19\x08\x76\xd2\x1c\xcc\x8c\x21\x1a\x7a\x67\x96\xb8\x11\xa8\x02\xd9\x73\x83\x71\xff\x53\xe0\xbf\x2b\xf9\x1f\x1c\x00\x5b\x5f\x2f\x73\xa0\x3a\x6f\xb6\x7c\xc7\xae\x5f\x9d\xa6\xc1\x57\x41\x2a\x21\x3d\x0c\x1e\x3f\x09\x4f\x59\x49\x15\xed\xe1\x3c\x59\xf1\x54\xc1\x04\x3f\x64\xec\x60\x1c\xd0\x01\x8a\xbd\x35\xe4\xfc\x6e\x09\xef\xd0\x99\x0e\x7c\x14\x01\xc2\x68\x99\xbc\x1c\x45\x13\xbb\x26\xe5\xbd\xe3\x67\x6f\x45\x5e\xf5\x87\x42\xea\x82\x71\x40\x07\x24\x82\xa9\x90\x7d\x46\xd0\xf5\x5a\x15\xee\x09\xc7\xd9\xbb\x88\x1e\x2e\x62\x4a\x6c\xa2\x29\xfe\x40\x84\x57\x0b\xf7\x3c\x6d\xd9\x83\xd4\x05\xe3\x80\x0e\xdc\xd5\xd9\x1d\xdd\x7c\x26\xfd\xb0\x59\xc6\x91\xc6\xf7\x93\x4c\x0c\xa1\x55\xdd\x81\x7d\xd7\x29\x73\xdf\x43\x94\x9f\x27\xc2\x6a\xcc\x90\xba\x60\x1c\xd0\x01\x5d\x58\xe7\x1e\x78\x44\x8c\xfb\x0a\xb0\x79\xd3\xcd\x81\xc1\x92\x3f\xb8\x05\x49\xec\x24\x37\xec\x42\xb0\x84\x90\xe1\xe7\x7d\x9e\x40\x1c\x00\xe3\x20\x0e\xd4\x81\xe4\x2f\x60\x9b\x9d\xcb\x1c\x50\x36\x10\x19\x1b\x1f\x1b\xa8\xf9\x4a\xf9\xf1\x9d\x97\x8d\x21\x12\x4c\x0b\x42\xa6\x25\x13\xd3\xa9\xf1\xcd\xc9\xcc\x31\xcc\x34\x0e\xc8\xd8\xc1\x38\xa0\x03\xd2\x94\x2a\x42\x74\xf7\xc3\xe9\xc5\x07\x23\x8e\xb4\xdd\xaf\xc5\x2d\x1c\x33\x68\x09\x90\x62\x5b\x62\xd5\xad\x46\xfd\x72\x67\x50\x81\xd4\x05\xe3\x80\x0e\x94\x61\x0f\xf0\xc0\x0a\xa1\x15\x93\xa9\x30\x2a\x67\x4b\x2c\xc9\x9c\xac\x44\x66\x90\x0e\x62\x47\xda\x54\xe7\x14\x78\xd5\xd6\x32\x42\xea\x82\x71\x40\x07\x9e\x0e\x06\x99\x60\xd1\xeb\x7e\x2d\x48\x2c\x64\xef\x7e\x2b\xf3\xd5\xad\x3d\x0b\x89\x8f\x85\x96\xab\xe3\x0d\x61\xa6\x79\x51\x72\x1f\xa4\x2e\x18\x07\x74\x60\xba\x3d\xba\xa5\x3f\x3a\xfd\x53\x91\xbe\x4f\xff\x6b\x01\xf5\x04\x75\xee\x74\xbc\xeb\x91\x6b\x07\x2d\xd1\xa4\xb4\xac\x0c\xc6\x77\x21\x0e\x80\x71\xd0\x79\x00\x24\x7f\x01\xdb\x79\x5e\xe6\x80\x0e\x6f\xe6\x52\x98\x0e\xa1\xd8\xc7\x81\x5f\xc8\xf0\x0b\x61\x35\x5f\x58\x31\x50\xaf\xc7\x71\x21\xc6\x09\x6e\x47\x05\x94\xf9\x9a\x40\xc6\x0e\xc6\x01\x1d\xc0\xd4\xf1\x8b\x2c\x96\x9c\xa4\x5f\x44\x28\x64\xe4\x94\x24\x68\xe2\x6d\xfc\x16\x34\xee\xa4\x30\x37\xc5\xab\x5b\xe7\x83\xe1\x00\xdd\xb8\x81\x71\x40\x07\x7a\xe7\xb2\x39\x37\x9c\x16\xc8\x93\xa6\xfb\x7e\xf0\xef\xbc\x77\x3e\xc8\x9e\x3c\x4c\x55\x6a\xeb\xaf\x2e\xd3\x3f\x76\x73\x0f\x8c\x85\xd4\x05\xe3\x80\x0e\x2c\x8b\x46\x3b\x66\xdc\x24\x43\x34\x3c\x62\x64\xbd\xad\x17\xa1\x11\x5d\xe1\x37\x2f\x56\x9d\x41\x4a\x2c\x6c\xd2\xa4\xe8\x30\x09\x75\x00\x8c\x03\x3a\xb0\x9b\x61\x25\x33\x58\x46\xd3\xca\x69\xf7\x32\x2c\x22\xab\x96\xee\x6b\x24\x33\x51\x93\xe8\x27\x13\x85\x11\x5e\x5d\x4a\xac\x27\xe6\x10\x07\xc0\x38\xe8\x3c\x00\x92\xbf\x80\x9d\xdd\x2f\xcf\x5f\xf6\xe5\x9d\x8c\x5b\xc2\x75\xdf\x2e\x64\x89\x93\x6e\xbf\x28\xd9\xb1\x90\x5f\xf9\x94\x4a\x99\xba\xf0\x79\x26\xf9\xe3\xc1\xc4\x93\x08\x48\x96\x01\xc6\x5d\xcc\x5f\x28\x2a\x12\xe9\x73\x09\xea\x75\xef\xa8\xd9\x57\x56\x99\xa8\xc0\xd4\xf6\x7c\xe0\xa1\xa9\x0d\xb4\x7f\x8f\xf8\x39\xf9\x38\x71\x6e\x1e\x52\x19\x8c\xbb\x98\xbf\x78\x2e\xa2\x25\x77\x6c\x3c\x1a\x97\x7d\xaa\xb7\x67\x99\xba\xc9\xe6\xfb\xfc\x71\xf4\x47\x12\xe6\x18\x81\xa9\xb0\x6c\x22\x2e\xac\x13\x48\x65\x30\xce\x4b\x02\x06\x46\xe4\x6f\x95\x7d\x6f\xae\xe8\x13\x59\xec\x04\x46\x6e\x86\x8d\xb6\xbc\x26\x3b\xc9\xbc\xeb\x70\xbb\xd6\x82\xd1\x87\xe7\x10\x7e\xb9\xd0\x35\xfe\x2d\x34\x7f\x01\xbb\xb4\x7a\x3e\x7f\xc1\x37\xd8\x9a\x4a\xcc\x67\x13\x74\x64\x4c\x32\x44\x6a\x60\x8d\x5f\x12\xfc\x64\x38\x90\x72\x9d\x18\x7e\x70\x8e\x5c\x92\x7e\xc3\xf6\x1c\xda\xef\xfb\xb5\x41\xda\x63\xf7\xfe\xed\xaa\x31\xd4\x6a\xeb\xde\xd8\xfd\x28\x1a\x86\x65\xcf\xdd\x5b\x8f\x2a\x3f\x88\x1e\x20\xb7\xd2\xfc\xdb\xf2\x17\xb0\xa1\x9d\xcb\x5f\x82\x81\xf9\xcb\x4a\xf8\xcf\x79\xb4\xef\x77\x54\x5d\x42\xea\x06\x0b\x2c\xa8\x7c\x07\x92\xa4\x7d\x4d\xcb\xe1\xb2\x1f\x1b\x98\x8d\x9d\x3d\x7c\xe8\x71\x15\xf9\x0b\x8c\x2c\xf0\x8c\x9e\x35\x24\x87\xb8\x20\x51\x71\x96\x4f\x85\xb9\x43\x6b\x62\x5e\x75\x43\x69\x77\x23\xac\xe4\x09\x6a\x52\xa5\x73\xd0\xba\xeb\x6e\xed\x95\xdc\xcc\xb8\x98\xbf\x4c\x37\x57\x46\x63\xb0\x4d\xc0\x8a\x68\xe8\x95\xc1\x8b\x20\xd9\xbb\x13\x67\xee\xb4\x78\x7c\xd5\x40\xb9\xb6\xd4\x50\xd8\x1a\x49\x74\x25\xf7\x50\x94\x2e\x7c\x6c\xb5\x1e\x0c\xfc\xd2\xd9\xf5\x10\x25\x5a\xbd\xcc\xee\x68\x2d\x5e\x2d\x9e\x59\x56\x71\xbe\x1c\xad\xe8\x62\x9f\x92\xb1\x20\xd3\xbb\x57\x32\xda\x8b\xf9\x8b\x76\x2e\x7f\x5e\x35\xfb\x6c\x81\x38\xc2\xbc\x54\xdc\xe9\x94\xfa\x6d\xe7\xb7\xe9\x07\x13\xe5\xfc\xf9\xc2\x6c\x04\xdf\xee\x8d\xe3\x5d\xc9\x68\x5f\x5e\xf8\xd8\x97\xde\xb9\xd4\xaa\x62\xf9\x15\x7e\xd6\x38\x74\x31\x84\x82\x8a\xe4\x0d\x69\x3c\xf8\x5f\xaa\xec\x90\x26\xd6\xc4\x0a\x1c\x3f\xf3\x5f\x59\xfe\x02\xa6\xee\x65\xcb\xed\x2b\x42\xda\x6a\x61\xfc\x81\x6e\xd1\x7b\xfa\xd6\x03\x87\xaf\xb4\x8b\xf0\x58\x59\x83\x5b\x87\xbf\xcb\xf6\xbf\x5a\x8d\xe4\x84\x85\x6e\xb9\xc0\x38\xe0\x72\xab\x3f\x4a\xae\x39\xd0\xb9\x79\x84\xc0\xfa\x2d\xa2\xe5\xde\x35\xd8\xf4\x03\x9a\xbb\x9f\xf5\x29\x90\xd5\x08\x05\x19\x74\x02\x37\x8f\x20\x75\xc1\x38\xe0\x72\x8b\x4b\x85\x5d\x96\x56\x30\x86\x76\xa4\xf9\x41\x8b\xa5\xee\x4e\x85\xc5\x9e\x9f\xee\xdb\x13\x29\x1a\x05\x3e\xb3\xe8\x97\xfb\xd6\xd0\x23\x12\x18\xe7\x25\x06\xe3\x7e\xbe\x2e\xe5\x58\x1b\x01\xb3\x01\x0a\xf5\x54\xa3\xbc\xd1\x4e\x96\xd1\xcb\xb1\xd9\xb1\x1c\x1f\xa5\x8c\x27\x51\x32\xe2\x1e\x7c\xf7\x74\x90\x21\x75\xc1\x38\x2f\x31\xd8\xbf\x7d\x0f\xb0\x36\x54\x9d\xbf\x4c\x5f\x3e\xba\x23\xbb\xa2\xf1\xce\x3f\x1b\x0b\x25\xf9\x5b\x6f\x79\xf6\xfb\xa9\x14\x41\xe1\x88\xb7\xe9\xc4\x3d\x90\xfc\x05\x8c\xf3\x12\x83\x81\x73\xf7\xf0\xf9\x6b\xbe\xfa\xc3\x86\x0b\x6c\x1a\xb9\xcc\x80\xce\x92\xe4\xc7\x8f\x74\x10\x7d\xec\xdc\xc9\x9f\x2a\x2e\x63\xbc\x56\x9b\x7d\xfc\x52\x4c\x0e\xdb\xef\xb5\xac\xa5\x4f\x19\x7e\xfd\x63\xc8\xc8\xc1\x38\xa0\x01\x3b\x72\xd3\x96\x6e\x75\x56\xf1\x6f\x1f\x6b\x1f\xdc\x7e\xba\xf3\x52\x56\x44\x01\xa1\xca\x50\xb3\x7f\x42\xfd\x75\x61\x3a\xef\xd0\x3a\xa4\x2e\x18\x07\x34\x40\x35\xfe\x69\xfa\xac\xf5\x9b\xa7\x71\xb7\xfd\xf4\x70\xa4\x3c\x18\x5c\x0c\xe6\xf4\xca\x64\x49\xd8\x6a\xca\x1b\x94\xb6\x2a\x67\xc6\x21\x75\xc1\x38\xa0\x01\xa3\xdf\x42\x6e\x3e\xf7\x21\xb5\x49\x54\xab\xdb\xf9\xe0\x23\x53\x3a\xb0\xca\x68\x94\x15\x88\x91\x6a\xbd\xe1\xa7\xa7\x5b\xf6\x6e\x0b\x52\x17\x8c\x03\x1a\x20\xed\x4d\x10\xa6\x2e\x82\xe4\x2a\xf1\x45\xe8\x5b\xde\x4c\x99\x36\x8b\x0a\xb7\x7d\x9e\xe4\x93\xe8\x99\xe2\x69\x5b\x2c\x2d\xd8\x43\x48\xfe\x02\xc6\xfd\xcf\x80\xff\x2c\x1e\x7f\x50\x00\x6c\x4a\xbf\xf4\x99\xa7\x47\xca\x44\xb5\xd0\x9b\x8a\xef\x9f\xaa\xc6\xad\x99\x08\x9e\x0c\x7d\x67\x5b\x13\x91\xc9\x60\x81\xad\x44\x17\xe4\xeb\x89\x37\x86\x3e\xf3\x04\xe1\x80\x0a\xd8\x5b\xdb\x6d\x24\xff\xda\x3f\xd1\xbb\x61\x8e\x49\xa1\xd6\xdd\xf6\x74\x53\xc0\x93\x1e\x83\x56\x2a\x65\x8b\xc9\xf8\x49\xa2\x4f\x2f\xa4\x2e\x18\x07\x54\x60\x64\xe2\xd0\xaa\xf5\x1d\x1e\x3b\x5f\xb9\x77\x7e\xc5\x2b\xdb\x9c\x64\xf7\x16\xb6\x87\x7b\x39\xe2\x5f\x8e\xf4\x2c\xa4\x62\x57\x8d\x20\x75\xc1\x38\xa0\x02\x9f\xd8\xdc\xd5\x0f\x68\xc2\xdc\x07\xc3\x43\x63\xcc\xaa\x15\xa9\x57\xf5\xb7\x3a\x87\xd9\x9c\x52\x06\xac\xc2\x18\x13\xdb\x2a\x48\x21\x75\xc1\x38\xa0\x02\x7c\x16\xa1\x52\x9c\x66\x79\xb3\x8f\xe9\x4a\x08\x48\xd4\x53\xfa\xc4\x51\x0f\x61\x75\x7c\xef\x77\x08\xa6\xcf\x0c\x28\x30\x24\xb0\x42\xf6\xdc\x60\xdc\xff\x14\xf8\xef\x4a\xfe\x07\x07\xc0\xd6\xd7\xcb\x1c\x40\x97\x27\x5e\x0e\x2e\x11\xcc\x7f\x2f\x1e\xc2\x5c\xe8\xcf\xee\xe9\xa9\x75\x7d\x85\x26\xa8\x82\x72\xc8\x7d\xa4\x9f\x2e\xca\x4e\x10\x32\x76\x30\x0e\xe8\x40\xa5\x87\xdf\x74\x4a\xf8\xd4\x67\xea\xc4\xa3\x1c\xc5\x4e\xeb\x1b\xaa\x2f\x9a\xca\x99\xf5\xc7\x1f\x20\x31\x9c\x31\xfb\xd2\xa3\x26\x43\xea\x82\x71\x40\x07\x9e\xdb\x1d\x88\x2b\x85\xe1\x05\x95\xff\xf2\xb2\x42\x96\x75\x15\xdc\x56\xcd\xdb\x61\xca\xcc\xad\x79\xa0\xfd\x00\x77\xcc\xad\x51\x0c\x52\x17\x8c\x03\x3a\x90\xa6\x73\xfa\x29\xf4\x94\x7c\x05\x41\xdb\x58\xa4\x55\x40\x39\xf6\xa8\xce\x32\x32\x76\xe9\x11\x79\x47\xe4\xd0\x74\x89\x58\xc3\x03\x48\x5d\x30\x0e\xe8\x80\x87\xd6\xba\xdc\xc0\x70\x15\xd5\x20\xee\x8b\xaf\x26\x45\x3e\xe4\x45\x24\xe3\x41\x4f\x60\xfc\xdb\x59\x56\x47\xb6\xf4\x25\x54\xbf\x41\x1c\x00\xe3\x20\x0e\xfc\x67\x5b\xf5\x07\x07\xc0\x36\x3b\x97\x39\xe0\xdc\x59\x4a\x81\x1c\x1b\x5f\x3e\x30\xa6\x3c\x55\xa2\x64\xf2\x6b\xe9\x48\x88\x69\xc5\xd4\x53\x28\xd5\x9f\x1d\x83\x85\x38\xaf\x13\x32\x76\x30\x0e\xe8\xc0\xfa\xb2\x6b\xce\xf0\xa8\xe8\x8a\x62\x1a\xb1\xb3\x0e\x6b\xf3\xb3\xc3\xd8\x54\x0e\x3f\xe1\x04\x9a\x4a\xbb\x93\x51\x6a\x5e\x3e\xe8\xfc\x02\xc6\x01\x1d\x10\x5e\xbb\xbd\x24\xfc\x66\x68\x6d\x7d\x51\x58\xfa\x89\xad\x68\xcd\xd7\xa7\x82\xe9\x75\x52\xd5\xba\x5c\x2f\xf7\x8a\xe6\x3f\xbc\x87\x2e\xda\x60\x1c\xd0\x01\xea\x37\x4c\x81\x3b\x79\xe5\xa7\xc8\x67\xf4\xd3\x8e\xc1\x38\x2c\x8e\x14\x08\x63\x5e\x2f\xa5\xf1\x5c\x2c\xe0\x8b\xad\x31\xd9\xa1\x59\x01\x18\x07\x74\x40\x96\xa0\xe8\x01\x37\xd5\xf3\xe2\x76\x9d\xb1\xb8\xd1\x81\x62\x19\x8c\x57\x33\xa5\xdb\x11\xdd\xac\xb5\xe9\x9f\x95\x83\x3e\xa3\x91\x40\x1c\x00\xe3\xa0\xf3\x00\x48\xfe\x02\xb6\xf3\xbc\xcc\x81\xb2\xfb\x1a\x2c\x28\x74\xa4\xd5\x9e\x95\x31\x93\x8d\xfd\x37\xef\x5a\x45\xa4\xf1\xaf\xc1\xa5\x3e\x68\xab\x5b\xfa\xa4\x2f\xdd\x1b\x00\xcd\xb4\x40\x38\xa0\x03\x67\x7b\x3c\x07\x73\xcd\xc2\x49\x1f\x92\x0a\xf0\x75\xa7\x16\x55\x25\x92\x6f\x6d\xe5\xa9\x09\xb3\xde\x95\xf4\xba\x17\xae\xfe\xcd\x10\x52\x17\x8c\x03\x3a\xf0\x8b\x79\xd3\x32\xae\x6d\xf2\x1b\x86\x80\x67\x74\x77\x6e\x58\x6a\xc4\x86\xd3\xe2\x99\xe3\x88\x72\x9c\x99\xb3\xa3\xff\x9d\x17\x83\x90\xba\x60\x1c\xd0\x81\x92\x37\x54\xf0\xd5\xe3\x7c\xf8\x48\x1f\x70\x3a\x29\x5f\x69\xd1\xff\x98\x5c\xf5\x3a\x3d\x33\x90\x4b\xc8\x8d\x3d\x55\x8a\xdb\x83\x6e\x07\xc0\x38\xa0\x03\x81\x3f\x31\x94\xb8\x25\x1f\x55\xa4\x45\xfd\x64\x21\x11\xe8\x24\x36\xe0\x11\x65\x7b\xd2\xa1\xc3\xa7\xf4\xee\xa5\x08\xa5\xb0\xd6\x73\x88\x03\x60\x1c\x74\x1e\x78\xf9\xe7\xfc\x05\xec\xec\x7e\x79\xfe\xe2\xb9\xc9\xe0\xfb\xc0\xcf\xb6\x7f\xb4\x7d\x25\x81\x85\xe7\xf5\xf7\x1a\xbe\xd2\xc4\xb4\x58\xfa\x44\x54\x11\xcb\x23\x26\x5f\x24\x51\x68\x96\x01\xc2\x5d\xcc\x5f\x08\xd6\x5e\xf9\xa7\xec\xc2\x36\x8d\x8b\x1d\x95\x6e\x27\xff\x72\xc2\xb5\x8d\xc6\xbb\x53\xe7\xe7\x26\x70\xe0\x70\x3c\xf3\xd6\xf2\x21\xa4\x32\x18\x77\x31\x7f\x91\xd7\x7a\x44\x6a\x50\x23\x97\x3e\x28\x50\xff\x90\xdc\xdc\x25\xcc\x4d\x8b\x2e\xeb\xae\x31\x4b\x0e\xe7\xa1\x9e\x9b\x9d\x5f\xba\x0a\xa4\x32\x18\xe7\x25\x01\x03\x03\x03\x7b\xbe\xf2\x5b\x1d\xf3\xb1\xa6\x91\x0f\x1a\x4e\xee\x2d\x65\xb6\x77\x3c\x3f\x34\x34\x6d\xe2\x45\x9c\xa9\xe3\x31\xf3\xfb\x45\xab\x9e\xdd\xeb\x86\xe6\x2f\x60\x6f\x02\x9f\xcf\x5f\x6a\x75\x82\xb7\xe5\x07\xc9\x86\x29\x8b\xbd\x79\x7e\xbe\x7d\xff\x6e\x1a\x09\x76\xbd\x2b\x77\x8b\xa9\x97\x99\x79\xae\x67\xd7\xf1\xfc\x1b\xce\xc8\x4d\x9d\x8e\x8c\x8a\x52\x0b\x5d\xf8\x0a\x61\xa2\x82\x70\x9b\xf6\x14\x12\xf4\x9e\x0d\x74\x83\x4b\xe1\x39\x7d\x36\x5d\xc4\xd7\xfe\x6d\xf9\x0b\xd8\xd0\xce\xe5\x2f\xdd\xc0\xfc\x45\x65\xb4\xe4\x3e\xef\xa3\xa2\x1b\x71\xb5\xc5\x8d\x03\x3f\xf2\x7f\x25\xab\x51\x99\x5d\x7f\xf1\x29\xfb\xd9\x47\x25\xa1\x4e\xbc\xb0\x47\x57\x91\xbf\x88\x5c\xc8\x5f\xac\x3e\xc4\x2b\xa9\x6a\xe7\x58\x11\x47\x4d\x7d\x26\x9b\x2b\xd8\x12\x15\x7c\x84\x8a\xd2\x62\xeb\xce\x89\xb9\x1c\xa0\x6e\x25\x4b\x70\x25\x57\x33\x2e\xe6\x2f\xa5\xa3\xc6\xdf\xd3\x48\x18\x3b\xcf\x12\x08\xe8\x9d\x43\x0e\x09\x92\x27\x42\xd6\xeb\x4d\x17\xac\x5f\xc1\x77\xf7\x61\x18\x9e\xc2\x5f\xc9\x45\x94\x8b\xf9\x0b\x37\xd7\x37\xa3\xa0\x66\xe7\xd5\xdc\x02\xfb\x10\xb9\xd9\x94\x77\x6e\x93\xf8\x15\xa9\x58\x12\x73\x4d\x6e\x28\x1a\xb0\x70\x1c\x15\x57\x32\xda\x8b\xf9\x4b\x96\x7c\x54\x1c\x97\x91\xea\x6e\x99\xeb\xac\x44\xe4\x5a\xcd\xdb\xe7\xb1\xdb\x70\xc2\x49\x52\xa2\x0f\xc5\xa7\xbe\x51\xbc\x4c\xa5\xbe\x92\xd1\x5e\xcc\x5f\xde\x0c\x3b\x90\xd3\x22\xd1\x38\x32\xc4\x1b\xc9\xaa\x94\xdd\xa2\xce\x27\xc1\xfe\x21\xee\x75\x33\x3c\x2c\x9d\xda\xfe\x3d\x71\x33\xd2\x95\xe5\x2f\x60\xea\x5e\xb6\xdc\x36\x79\x1b\xd9\x18\xe7\xdd\x81\x69\x8c\x40\x1d\x13\x8b\x15\xf8\xb5\x8c\xcb\x40\xe5\xed\xed\x28\xab\x47\xd7\x19\xe3\x36\xd2\x48\x06\x59\x66\xc0\x38\xe0\x72\x5b\xce\x86\x6a\xaf\xdb\xf2\x76\x98\x28\xda\x3d\x2b\x42\x0f\x29\xf5\x48\xd3\xfb\xb0\xd2\x22\x3d\xc6\x8b\x00\xb5\xe4\xec\xb1\xac\x0b\xa4\x2e\x18\x07\x5c\x6e\x09\xdf\xd2\x20\x62\x4d\xd2\x61\x11\x7f\xb6\x2c\xc8\x89\x1f\x78\xe2\xb7\x3b\xe9\xb0\x07\xcf\xc4\x29\xc9\xfe\x4d\x42\xaf\xce\x2f\x1a\x52\x17\x8c\x03\x2e\xb7\xbb\x9f\xc6\x05\x34\x4e\x22\xc9\xcf\x6e\x36\x77\x10\x8d\x62\xad\x6b\xa7\x11\x49\xdc\x5e\x0d\x2c\x65\x6d\x3f\x68\x7a\x42\xb4\xd9\x0f\x7d\xf4\x0d\xc2\x79\x89\xfd\xfd\xea\xe2\xf7\xbc\x25\x3e\x09\xf5\xf8\x23\x26\xf6\xc9\x5b\x73\x66\x0a\x8e\xb4\xba\x58\x1a\xa7\xf6\xc7\x6e\x4d\xe2\xf7\xeb\x1e\x90\x08\x29\x41\xf2\x17\x30\xce\x4b\x8c\x12\xc6\xdd\xc3\xe7\xaf\xf9\xea\x0f\x1b\x2e\xb0\x69\xe4\x32\x03\xb6\xb9\x58\x4c\xf7\x54\xb0\x5e\x10\x04\x68\xac\xa2\x5c\x1f\x60\x79\x21\xe4\x36\xcd\xed\xfc\x75\x58\x8f\xc6\x3f\x9b\xcd\x78\x10\xfa\xe2\x01\x18\x07\x34\x40\x78\xcd\x70\x40\x19\x61\x3b\xbd\x7e\xfe\x21\x1f\x8f\xcb\x0a\x41\xd5\xdb\x5f\x07\x67\x98\xf8\x08\x7a\xbb\xf6\x2e\x34\x05\xde\x31\xff\xb7\x39\xfe\x33\x07\x34\xe0\xa3\xcf\x70\xd6\x6e\xca\xd3\x02\x82\xa8\xb4\x7e\xa5\x7b\x56\x38\xce\x55\x7b\xd8\x4b\x1a\xd8\x1e\xbd\x7b\xae\xe8\xc5\xf6\xef\xbe\x41\xea\x82\x71\x40\x03\x54\xa3\x9a\x70\x4e\x47\x82\x49\xc7\xec\xf4\x66\x7c\x36\xd0\x12\xaf\x67\x91\x57\xc5\x3f\xe3\xf3\x76\x19\x64\x2a\x28\xb0\x74\xba\x05\xcd\x75\x40\x38\xa0\x01\x47\x33\x22\x9f\x6a\x34\xf0\x37\x05\x38\x6f\xfb\x28\xde\xb0\xe7\xe1\x20\x78\xd3\xac\xca\x38\xd5\x07\xb3\x65\x9e\x05\x47\xf9\xfe\x23\x24\x7f\x01\xe3\xfe\x67\xc0\x7f\x16\x8f\x3f\x28\x00\x36\xa5\x5f\xa6\xc0\x61\xc9\xeb\x80\xf0\x47\xb2\x4b\xcf\xcf\x96\x36\xef\xa9\x3b\x7f\x78\x24\x60\x6f\x4a\xf0\x21\x99\x01\x17\x96\x2a\xed\x89\x46\x03\x39\xf4\xfd\x00\x10\x0e\xa8\x00\x75\xe8\x02\xd9\x71\x2a\x81\xe8\xcd\x96\xfc\xf0\x97\x8f\x13\x89\x4f\xac\xc3\xf3\x32\x45\x5e\x3f\x5a\x1d\x74\x61\xa3\xda\x8f\x94\x80\x9e\x63\x40\x38\xa0\x02\x4a\xe4\x0f\x75\x3b\x63\x2b\xd4\xbe\xa8\x57\x6c\xd2\x38\xc8\xb5\x05\xc4\xaf\x3e\x9e\x69\xb0\xbe\x8b\xab\x89\x28\xb5\xfc\x02\xf3\x0c\x52\x17\x8c\x03\x2a\x40\xb5\x55\x80\xe2\x1a\x30\x45\xe7\xbd\xfe\x5a\x15\x63\xde\xb8\x45\x59\x83\x25\x52\xe6\x38\xa4\x33\x83\xb6\x67\x8b\xad\xf1\x9b\x26\xa4\x2e\x18\x07\x54\xc0\xd9\x69\x16\x6d\xd2\x3e\x73\x37\xd9\x6d\x82\xf2\x0c\xc7\x3c\x75\x70\x8b\xf3\x93\x58\xca\x5d\xdf\x18\x9c\x45\xc2\x49\x8f\xa2\x5b\x90\x3d\x37\x18\xf7\x3f\x05\xfe\xbb\x92\xff\xc1\x01\xb0\xf5\xf5\x32\x07\x6e\x24\xb1\x58\xf6\xae\x74\xf4\xe7\x2d\x7f\xfa\x9a\x48\x64\xa8\x22\x70\xa7\x92\xec\x7a\xf5\x44\xa8\x54\x0a\x53\xb6\x11\xad\x15\xf4\x79\x2f\x18\x07\x74\xc0\x42\xce\xf6\x71\x5e\x16\x9b\xfd\x93\x9a\x6d\x85\xa4\x08\xd9\x91\x7c\xca\x63\xb7\x57\x6e\xbe\xe2\x15\x55\x62\xdb\xd6\x67\x37\x52\x20\x75\xc1\x38\xa0\x03\xaf\x7f\x58\xa1\x1b\x60\xda\x97\xab\x1c\x1e\xce\xc2\xa4\x3f\x1f\xcf\xf9\x69\x3b\xad\xa7\x86\x3e\xee\x9a\x8b\x9c\x88\x84\x4e\xef\x03\xa9\x0b\xc6\x01\x1d\xe8\x3d\xdc\x93\xcd\xe9\x96\x1f\xcb\x11\x99\xb6\x9a\xe0\x27\xd7\xe4\xea\xfc\x88\x19\xd1\xaf\x41\x44\x4e\x3f\x40\x84\xba\xb1\xa2\x0d\x7d\x9e\x0e\xc2\x01\x1d\x28\x62\xc0\x53\xfb\x96\xfe\x65\x50\xc4\x0c\xd9\xbb\x40\x22\x03\x56\x6d\xb4\xad\x0b\xbb\xf7\x58\xbe\xe0\xfd\x93\x57\xc9\xf6\x12\x11\x10\x07\xc0\x38\x88\x03\x22\x20\xf9\x0b\xd8\x66\xe7\x32\x07\x26\x45\x69\x36\x7a\x32\x4b\xe7\x9f\x50\x36\x1b\x8c\xbe\x97\x41\xe6\x35\xf9\x22\xfb\x46\xf4\x71\xc1\x4d\xae\xc2\x96\xc5\x1f\x11\x32\x90\xb1\x83\x71\x40\x07\x56\x6e\x06\x63\xc9\x9e\xf2\xe2\xba\x9f\xcc\x7f\xcb\x54\x1f\xaa\xe2\x7a\xf4\xfc\x9e\x9e\x7d\x74\x2d\xeb\x97\xc6\x58\xd8\xc3\x09\xe8\xfd\x3a\x30\x0e\xe8\xc0\xaa\xaa\x90\x2b\x2e\x93\x5b\x95\xfb\x11\x76\x64\x1d\x82\x8f\x74\x50\x7b\x78\xe0\xcb\x25\xda\x5f\xcb\x67\x1b\x27\xc1\x72\x95\xd0\x29\x1b\x8c\x03\x3a\x40\x14\x5d\x1d\xd1\x36\x74\x6f\xeb\x88\xd6\x1b\x5d\xb3\x92\x88\x41\x70\x19\xe5\x25\x6d\xd4\x17\xb9\x65\x11\x9c\x9b\x0f\xef\xcb\x6c\x40\xea\x82\x71\x40\x07\x3c\xbf\xf0\xbe\xa5\xe5\x09\x3b\x36\x95\x27\x68\x1f\x5d\x8e\x0c\xaa\xb3\x3c\x55\x5f\xa4\x77\x30\xde\xd9\xbe\x5d\x11\xdf\x7b\xc3\x01\xe2\x00\x18\x07\x9d\x07\x40\xf2\x17\xb0\x9d\xe7\x65\x0e\xb0\xe2\xb8\x45\x59\xc6\x89\x06\x84\x63\xea\x26\xc0\x0f\xed\x0a\x8f\xa4\x54\x9e\x0e\x4d\xd4\x18\x32\xeb\x7b\x16\x32\x8e\x7c\x7e\x07\x19\x3b\x18\x07\x74\x80\x74\x00\xe1\x31\x97\x49\xda\x7a\x98\x1b\xcb\xb2\x6b\xc3\x1a\x16\x66\xdc\x82\xb6\xa8\x21\x7f\x99\x14\x7b\x4c\x31\x7f\x22\xd3\x34\xa4\x2e\x18\x07\x74\xa0\x60\x1b\xfd\xd9\xab\x22\xd2\x3b\xab\x5b\xad\xe9\xed\x91\xdf\x45\xa7\x8f\x61\xbc\xba\x42\x99\xd2\xa4\x22\xad\x96\xb1\x1b\xe0\xb9\x21\x75\xc1\x38\xa0\x03\xef\xf7\xfb\x75\x86\xa9\x58\x90\x11\x94\x38\xb5\xd2\xa5\xa7\x5b\xaa\xbc\xac\xf9\x46\xb6\x1f\x2f\xa0\x33\x88\x73\x6c\x0a\x4f\x41\x1f\x4c\x82\x71\x40\x07\x04\x96\xd9\x8b\x3c\x29\x1d\x7d\x73\x90\x46\x4c\x60\x86\xb6\xaf\x79\x9b\x74\x7e\x13\x29\x66\x73\xd8\x67\xfd\x18\xb9\x6e\x16\x24\x01\x71\x00\x8c\x83\xce\x03\x20\xf9\x0b\xd8\xd9\xfd\xf2\xfc\x45\x82\x16\xf6\x3b\xaf\x11\x43\x29\x7f\x9f\x5c\x20\x9a\x97\x15\x8e\xaa\xc5\xfb\xf1\xf4\xba\xad\x50\xf2\xcc\xf4\xea\x2f\x8b\x84\x08\x90\x2c\x03\x8c\xbb\x98\xbf\xec\x2f\xb9\x85\xa9\xbc\x40\x29\x35\xa2\xe1\xd4\xee\xb1\x70\x8f\xa5\x34\xa5\x44\x4c\xc6\xbe\xfe\xd0\x48\x2f\x7c\x28\x19\x45\xb9\x1f\x7a\xb3\x06\x84\xbb\x98\xbf\xb4\xf7\xfa\xe2\xea\x90\x8d\xb2\x1a\x2a\xc6\xcd\x1e\x3e\xff\xda\xfd\x94\x7a\xa2\xc1\x56\x86\x37\x9e\x3a\x53\x09\x2f\x15\xbb\x82\x1c\x52\x19\x8c\xfb\x4f\xfe\xf2\x37\xc7\xaa\xca\x4a\x1f\xda\xa7\x97\x16\xfb\xf0\xbe\x5f\x4d\x5e\x50\xc4\xae\x6c\xae\xfd\x70\x77\x18\x26\x0d\xef\xc8\xdd\xcf\xae\x6d\x70\x06\x9a\xbf\x80\xb5\x57\x3b\x9f\xbf\x20\x04\x88\x95\xf5\xd7\x24\x9b\xad\xe6\xa0\x9a\x63\xe0\x9d\x25\xe1\x3a\x99\xc7\xec\x68\xb3\x3e\xdd\x0c\x24\xfb\x52\x83\x50\x78\xfe\x6d\x0c\xdf\x9e\xa9\x17\x43\xd5\xa2\x9f\x7e\x3e\x73\xd6\xcb\xc3\x24\x2c\x19\xac\xd9\x58\x3a\x60\x96\xc4\xfa\xf2\xf1\xf3\x18\x42\xa9\x51\xe8\xbf\x2d\x7f\x01\x1b\xda\xb9\xfc\x05\xe7\x3a\xe0\xb4\xec\x38\x24\x68\x4d\xf6\x9d\x43\x1b\x97\xcc\x85\x05\xf9\xa6\xc0\xca\xc0\x6d\x51\x85\xe7\xbe\x13\xe1\xf8\x11\x9c\xce\xef\x9e\x50\xb4\x5f\x45\xfe\xe2\x7e\x21\x7f\x29\xfa\x29\xda\x97\xb1\x3e\xaa\x66\x47\x09\x17\xfb\x9a\xe9\x3b\x13\xaa\xda\x80\xc4\x48\xdf\x96\x42\x38\x7f\x97\x10\xee\xb0\xfa\xdc\x95\x5c\xcd\xe0\xbd\x10\x0d\x18\x46\x71\xe3\x2d\x65\xc8\xe9\xfa\xc7\xef\x64\x52\x54\x3c\x38\x58\x8a\x3b\xea\x6d\xe0\xda\x27\x90\xf3\x1e\x93\x50\x6f\x3f\x4e\xba\x92\x8b\x28\x17\xf3\x17\x11\xda\x48\xef\xfb\x2f\x1f\x3f\x58\xaa\x6c\x91\x90\x38\x3a\xcd\x5e\x3b\x68\xb2\x21\x0c\x5f\xd3\x29\xaf\x42\x1f\x7c\xd5\x7f\x6b\xff\x4a\x46\xab\x7b\xe1\x63\x79\xe3\x27\x8f\x99\xb9\xc5\x84\xab\x57\x65\xbe\xcd\x87\x37\x23\x86\x94\x1a\xfb\x12\x5d\x4b\x78\x30\x83\xc2\x86\x1c\xf0\xeb\x5b\xc1\x95\x8c\xf6\x62\xfe\xa2\x9b\xcd\xe7\xae\xf5\x4a\x99\x3e\xff\xa1\xa0\xb7\x35\x13\x15\x46\x34\x4c\x13\xef\xba\xbb\x98\xaa\x9c\xb5\xb4\x02\xda\x69\xe3\xd1\x95\xe5\x2f\x60\xea\x5e\xb6\xdc\xde\xf3\x2a\x45\xd5\x45\xba\x5f\xb3\x5c\xcf\xbb\x16\x5d\xab\x91\xbd\xf8\x52\x3b\xac\xe8\x8b\xeb\x33\xab\xac\x53\xf6\xc9\x1f\xf9\xd0\xab\xfc\x60\x1c\x70\xb9\x55\xdd\x69\x52\xa4\x0d\x13\x7a\xaf\xbd\x34\x34\x46\xf6\x02\x36\x9b\x87\x75\xac\x1d\xf6\xac\x16\x51\xb0\xe7\x0e\x0d\x8f\x62\x94\x12\xf4\x34\x0b\xc2\x01\x97\x5b\x0b\x4a\x12\xe1\x80\x3a\x87\xe0\x97\xd4\x9a\xae\xb2\xcd\xee\x9e\xb6\x5f\x54\x45\xda\x7b\xf9\x43\x0e\x42\xf4\x1b\x57\xde\xd5\x2b\x40\xb7\xf3\x20\x1c\x70\xb9\x6d\x83\xb5\xca\x0c\xff\x89\xb1\x1d\xe0\x35\xc3\x5a\x38\xef\x99\xe0\x24\x89\xdb\x77\xf2\x19\x95\xe7\x79\x54\xb8\x03\x91\x12\x29\x74\xdb\x01\xc6\x79\x89\xfd\x3d\x3a\x7f\xea\x39\x9d\x7e\xc3\x64\xde\x05\xad\x60\x57\x7e\xee\x35\xf9\x94\x5c\x04\x31\x9d\x83\x13\x42\x74\xfe\xb8\x9e\x3c\xc7\xf5\x2e\x31\x48\xfe\x02\xc6\xfd\xef\x75\xdf\xbf\xe6\xab\x3f\x6c\xb8\xc0\xa6\x91\xcb\x0c\x98\xcb\x94\x51\x7c\x66\xfd\x44\xea\x73\xd4\x06\x1f\x7a\x60\xc4\x34\xe9\x10\x87\xaa\xf8\x10\xcd\x93\xa7\x73\x9a\xd4\xdd\x8e\x39\xc7\x90\x91\x83\x71\x17\xf2\x17\xff\xb2\xae\x18\xd8\x5f\x2b\x92\x1f\xe3\x8c\xf2\x51\x7c\x6c\x70\xed\x98\x39\x67\x06\x48\xa4\xb6\xe2\xc8\x12\x5e\xc9\x94\x41\x2f\x32\x83\x71\x40\x03\x74\xec\x88\xbc\x03\xec\xd3\x05\x28\xc2\x8e\x9d\xcb\xa5\xf9\x77\x83\xb1\xd7\x7e\x7c\x2d\xa4\xf4\xac\x64\x7c\x9b\xac\xa1\x10\xaf\x08\xbd\x20\x0d\xc2\x01\x0d\x10\x1e\x74\x2a\xe5\x40\x91\x1e\x5c\xdf\x28\x0b\x40\x95\xc3\xfd\x24\xeb\x33\xa9\x86\x8d\x5b\x7c\x84\x46\x4b\xff\x04\x37\xa9\x53\x0e\xfa\xf7\x82\x70\x40\x03\xda\x7c\xf2\x49\x66\x61\xe7\x26\x25\x2c\x1d\xdf\xf0\x7e\x46\xe1\x37\x47\x38\x0c\xcf\xe5\x80\x6b\xc9\xe4\x6d\xb7\x38\xd8\x89\x14\x83\xe4\x2f\x60\x1c\xb4\xff\xcb\x9f\xf3\x17\xb0\x29\xfd\x32\x05\x26\x52\x62\xf2\xc3\xa2\x2a\x3b\x67\x08\x38\xbc\xbf\x4e\xd5\xb1\x30\xfc\x48\xcf\x98\x9b\x8d\x48\x13\x4b\x36\x0f\x2a\x7a\x5f\x9c\x0d\x19\x3a\x18\x07\x54\xa0\x43\x05\xce\x8f\x62\xd3\x88\x64\xe3\xa1\x79\x67\xf5\x8e\xd0\xa3\xad\x30\x93\xc9\x6a\xdf\x65\x2b\xde\xc3\xad\x39\xbe\xf0\xa6\x74\x48\x5d\x30\x0e\xa8\xc0\x7a\xca\x5a\x2b\x72\xf7\x2b\x8a\xb3\x87\x96\x3c\x73\xb0\x77\xef\x6c\xde\x48\x2b\x2f\xce\xb9\x51\x12\x9d\xa9\xeb\xad\x53\xd6\xac\x03\x7d\x9e\x0e\xc2\x01\x15\x08\xa7\xa1\x26\x0f\x6d\x2f\xbb\x79\xdd\x4f\xa5\x63\x84\xe5\x90\x48\x46\xab\xe4\xd5\xde\x2a\x6f\x03\x6b\x15\x9c\x44\x84\x92\xe0\x07\x48\x5d\x30\x0e\xa8\x40\x5c\x83\x59\x88\x52\xc9\x17\x9f\x96\x5d\x2e\x09\x3a\x86\xa4\xd9\xe2\xc5\xa7\x42\xe8\x85\x08\xc5\x61\xd3\x12\x6d\xf8\x24\x66\x16\x90\x3d\x37\x18\x07\xed\xfb\xc0\xfb\xe7\x73\x17\xd8\xfa\x7a\x69\x10\x5f\x5d\x48\x0f\xfb\x60\x4b\x2c\xc2\x1c\x55\x64\xff\xce\x96\x35\x9b\xed\x8b\xee\x90\xec\x0a\x74\xdb\x4e\x4f\xb1\x8e\xa9\xac\x37\xd0\x20\x1e\x84\x03\x3a\xc0\x58\x4e\x38\xec\xf5\x6c\x82\x51\x7a\xcb\xc0\x04\x5f\x47\xe8\xe4\x90\x3a\xf8\x9b\xa4\x7a\xd5\x86\x4c\x4f\xe8\x2b\xd7\x80\x66\x26\x48\x5d\x30\x0e\xe8\xc0\x27\x86\xd7\xe9\xac\xac\x32\x12\xd5\xf8\xb6\xd3\x7c\x6a\xd2\xa5\x92\xdd\xa2\x77\x83\x53\xe2\xb9\x5b\xeb\xd5\xbe\xfe\xb0\x31\xfc\x01\xbd\xab\x04\xc2\x01\x1d\x40\x22\x2f\x70\x5d\x5d\x10\x25\x7c\xaa\x1c\x34\xbb\xc0\xf3\xda\x85\xd7\x60\x61\xb3\xb8\x6c\xa4\x75\x11\x16\x3d\x8b\x9e\xee\xf3\x2c\xa4\x2e\x18\x07\x74\xc0\xc8\x49\xe3\xa8\x5d\x24\xa4\x94\xbc\xb3\x95\x55\xdb\x69\xfe\x83\x51\x80\x00\x1e\x37\x6d\xde\x00\xfc\xe0\x5d\x16\x6f\x96\xc2\x19\x88\x03\x60\x1c\xb4\xef\x03\x48\xfe\x02\xb6\xd9\xb9\xcc\x01\x81\x38\x5f\x3e\x3f\x0e\x77\x2a\x43\x0e\xb8\x0a\xf5\x5e\x57\x69\xdc\x40\xb6\x5a\x98\xa3\xcd\xba\xcc\xeb\x3f\x6b\x09\x0d\x50\x50\x21\x63\x07\xe3\x80\x0e\x94\x50\x3f\x90\x55\xba\xed\x60\x47\xb4\x63\x59\x27\xd6\x72\xbf\xcf\x81\x02\x86\x9a\x24\xa4\x9d\xbb\x37\xcc\xd5\x43\xc5\x13\x7f\x0e\x7a\x97\x00\x84\x03\x3a\x30\xc3\xb5\xf9\xfa\x89\xb4\x91\xf3\x34\xd2\x19\xb1\x80\x18\xcc\x8e\xe0\xea\xe6\xd9\x2d\xbf\x81\xd8\x7b\x5c\xf2\x07\x29\xd4\xd5\xe1\x90\xba\x60\x1c\xd0\x81\x1e\xe5\x23\xd1\x40\xaf\x8d\x9e\x5c\x7a\xa3\x21\xe6\x8f\xf2\x81\xfb\x47\x8c\x06\x9e\xf0\x0b\x96\x9e\xda\x81\x5b\xed\xb4\xbc\xd0\xcd\x0b\x18\x07\x74\x40\x4e\xc7\xc6\xa0\xa9\xdc\x24\x22\xf2\x3a\x49\x11\x6f\xc2\x3a\x53\x6b\x9b\xe3\x6d\x39\xcb\xe6\x83\xb9\x34\xcd\x3d\x3d\xb4\xc4\x37\x10\x07\xc0\x38\xe8\x3c\xa0\x0b\xd2\xff\x05\x64\xe7\x79\x99\x03\x1d\xeb\xe2\x51\x93\x4d\x74\x9f\x39\x64\x6f\xbf\x53\xf0\xdd\x16\x31\xda\x8e\x16\x9e\x0d\xc3\x11\xc7\xc5\x74\x5c\x85\x9b\x98\xe9\x82\xce\xd9\x20\x1c\xd0\x01\xb9\xac\x00\x6d\xa2\x6a\x0c\x3d\x0e\x3d\x7b\xab\xf6\x65\x99\xf9\xd7\x53\x95\xf9\xc3\x6f\x35\xd7\x69\x67\xa4\x2b\x12\x3f\x38\x42\xfb\xca\x80\x71\x17\xee\xbf\x04\xf6\x3f\x1e\x2d\x1e\xd1\xdd\x7a\x87\xd5\xa2\xd3\x02\x2b\xfe\x14\x5f\xa7\xce\xb9\x87\xce\x89\x3e\xb9\x3a\x81\xfa\x1e\xe3\x32\xf4\xfe\x0b\x08\x07\x74\x20\x8e\x43\x1e\xeb\xba\x83\x85\x7c\xad\xc8\xf1\x1d\xd1\xfd\x5a\xf2\x91\xf6\xbd\xcf\x16\xef\xcf\xe0\x1e\x1a\xc9\x15\xd5\x2b\x8d\x40\xdf\x9d\x05\xe3\x80\x0e\x18\x70\xb3\x4b\x05\x1d\xfd\x78\xba\x77\x7f\x7e\x94\xcb\x48\x95\xcf\x51\x8f\x20\xe1\xc3\x3d\x57\xf4\x77\x75\xf2\xef\x71\x65\x34\x52\x20\x0e\x80\x71\xd0\x79\x00\x24\x7f\x01\x3b\xbb\x5f\x9e\xbf\xc0\xf1\xc7\x06\x0e\x61\xb8\x4d\x1b\xf6\xbd\x0a\xba\xa9\x4a\x85\x65\xa8\x39\xd7\x34\xfb\xfa\xd3\xed\x33\x89\xde\x2e\xea\x95\xcd\x97\x90\x2c\x03\x8c\xbb\x98\xbf\xf8\x62\x39\x79\x6f\xb8\xda\xfb\x18\x45\xc0\x2c\x38\xbd\x9b\x5f\x34\xd6\x8a\x8f\x0b\xe2\xb9\x65\x05\xc3\x34\x5f\xd1\x52\x13\x44\x09\xa9\x0c\xc6\x5d\xcc\x5f\x42\xb2\xfc\x15\x30\x47\x15\xd5\xd6\xcd\x62\x34\x0e\xf4\x83\xdb\xa6\x91\x8a\x86\x66\xcc\x4e\x4c\xcd\xde\x69\x9f\x3d\x97\x7c\x79\x1d\x52\x19\x8c\xfb\x4f\xfe\xf2\xb7\x77\xc6\xea\x5a\xe7\x2a\x7d\x4f\x63\x74\xe5\x9f\xee\x74\x4d\x7d\x17\x47\xe8\xea\x61\x1d\x74\x97\x0b\xce\xf4\x79\x5c\x26\xa0\xb2\xf2\xb1\x19\x9a\xbf\x80\xf5\xac\x3f\x9f\xbf\x60\xb6\x4e\xe3\xdd\x20\x47\xd9\xd8\x46\x76\xe6\x77\x93\x76\xc4\x86\xcf\x78\x27\x47\x9c\x49\x6b\xf2\xf2\xc3\x1d\xc5\x40\x89\x86\xf3\xb7\x01\xb0\xd7\xd4\x17\x11\xed\x93\xf4\x96\x4d\x1e\xa1\x49\x86\xc9\xa3\x96\x11\x29\x51\xc8\xfe\x68\xfc\xf9\x6a\x56\xfc\xb9\x01\xfa\x5d\x9d\x7f\x5b\xfe\x02\x36\xb4\xf3\xfd\x5f\x80\xf9\xcb\x04\xad\xce\x77\xe5\xb0\xa4\x30\xf5\x55\xf9\x1f\xd2\xfa\x12\x01\xd2\xeb\xca\x8a\x52\x14\x29\xdf\x46\x57\x9c\x6b\x3c\x87\x48\xae\xe4\xfe\x4b\xdd\x85\xfc\x45\x1f\xbf\x1e\x5d\x57\xd4\x4f\xb3\xae\x48\xfb\xe1\x1e\x8b\xaf\x60\xbf\x69\xae\xa0\xb8\xb4\x40\x86\x1e\xe1\xed\xeb\x89\xc6\x03\xb8\x57\x72\x35\xe3\x62\xfe\x82\x2b\x3e\xd4\x51\xb5\xb0\xdb\x30\x51\xda\x46\x3a\xa5\x71\xea\x56\x68\xd5\xe7\x8d\x9a\x8d\x1d\xd7\xa1\xc7\xa4\xfa\x74\xda\xb5\xf5\x4a\x2e\xa2\x5c\xcc\x5f\xec\xef\xbd\x2f\x2e\xc4\x65\x6c\x24\xc4\x66\x84\x25\x4a\xe0\xb7\xd9\x59\x28\x18\xf1\x54\xec\x25\x2b\x71\x1a\xeb\x10\xd7\x0d\x0d\xbc\x92\xd1\x5e\xcc\x5f\xee\x7d\x5a\xb1\x7d\x76\x74\xf7\xf3\x64\xc8\xca\xa8\x39\x1d\x4f\x51\x47\x89\x2c\x62\x85\xe8\xd3\x58\x25\x18\xd6\x99\x14\x6f\xde\xfb\x57\x32\xda\x8b\xf9\x4b\x2d\x91\x82\x37\x43\xd4\x16\xbe\x32\x51\x63\x35\xc5\x0a\x3b\xe2\x75\x47\x92\x5b\x69\xe8\xfa\xd6\x1f\x1d\x49\x70\xae\xdb\x72\xc5\x5e\x59\xfe\x02\xa6\xee\x65\xcb\x6d\x11\xdf\xa9\xfa\xd1\x77\xe9\xa6\xb5\xe4\x91\xa1\x14\x35\x45\x6a\xda\x7e\x1c\xd9\x3c\x93\xb1\x6b\xe1\x4b\x37\x4e\x86\xa5\xdb\xa0\x47\x24\x30\x0e\xb8\xdc\xea\x0a\xed\x54\xdd\x6d\x21\xe7\x36\xc4\xef\x12\x3f\x5a\x95\x9c\xd0\xc8\xe8\x6b\x97\xbe\x6f\x2b\x25\xfe\x5c\x3b\x5f\xe3\x86\x31\x74\x0b\x03\xc6\x01\x97\x5b\xd7\xd4\xb5\xa6\x84\xe2\xef\x6b\x95\x11\xed\x70\x1a\x4a\x16\x5d\x0f\xfd\x04\x50\xc8\xe8\xb6\x7f\xad\x39\x27\x0d\x62\x38\x0a\x43\x5b\x6f\x82\x71\x17\x1e\x79\x55\xbb\x95\x95\xc1\x30\x95\xc3\xc6\x9c\x58\xbf\x9d\xe5\x5f\xdd\x86\x33\x53\x4d\x71\x6e\x84\x8f\x56\x1c\xab\x90\x52\x2a\x3f\x85\x3e\xf2\x02\xe1\xbc\xc4\x60\x50\xce\xd7\xc5\x51\x5f\x92\xd0\x3b\x48\x77\x1b\x79\x57\xc3\x68\x10\xfb\xe4\xa4\xa9\x4e\xbb\x28\x2e\xd2\xe7\x64\xc3\x48\x30\xaf\xae\xf4\x56\x20\x24\x7f\x01\xe3\xa0\xfd\x5f\xfe\x98\xbf\x80\x4d\x23\x97\xbe\x81\x46\x1c\x8b\xe5\xc4\x8b\x9e\xde\x82\xc6\x5a\x6d\x9c\x25\x8a\xa5\x8f\xa1\xe4\xe2\xea\xc4\x98\x69\xc4\xb7\x5a\xc1\x4d\xd6\x03\xbd\x70\x0c\xc6\x01\x0d\x20\x36\xc9\x2b\x53\xae\x0c\x2f\x6f\xd1\x58\xe6\x5f\x89\xa7\xfe\x70\x83\x10\xcd\xfd\xa1\xc4\x8d\xec\x9e\x81\x2a\x8f\x07\xcf\x4e\x28\x20\x75\xc1\xb8\x0b\xcd\x3f\x82\xc7\x6a\x0c\x84\x70\x90\x9e\xef\xbe\x97\x13\x48\x54\x93\x90\xe9\xe8\x23\xdf\x4e\x37\xee\xab\xe8\x4a\x20\x2e\x2a\x49\x82\x36\x4a\x06\xe3\x80\x06\x24\xb8\x4e\x15\x94\x72\xb6\xc2\x3d\xf2\x14\x69\x8c\xf9\xe6\x5e\x42\xc9\x62\x65\xf6\x23\xc5\x8e\x96\x40\x03\x51\xda\xc8\x1b\x0b\x0e\x52\x17\x8c\x03\x1a\xf0\xd1\x8a\xf3\xce\xad\x6b\x2a\x87\x9d\x3d\x46\x09\xdc\xbd\xe1\xa1\xe6\x77\x02\x7b\x4c\x62\x7d\x5d\x60\xec\x72\x5a\x6f\x4d\xc0\x0e\x40\xf2\x17\x30\x0e\xda\xff\xe5\xcf\xf9\x0b\xd8\x94\x7e\x99\x02\xfd\x67\x8e\x12\xed\x1b\x56\x58\x08\xf7\x47\xd9\xcd\x14\x3e\x2f\x4b\x68\x1b\xf6\xb6\x94\x9b\x3f\xd7\x14\xc4\x5e\xce\xfe\x72\x17\xba\x37\x06\xe3\x80\x0a\x1c\x7b\x07\x05\xbf\xab\x17\xbb\x2b\x10\x8b\x89\x1c\xfa\x28\x32\x48\xb8\xcf\xfb\x9e\x69\x74\x61\xb1\x9a\xcf\x53\x6c\xd6\xdd\x4c\xe8\x65\x35\x30\xee\x42\xef\xd5\x13\xa5\xdb\x99\xbc\xd1\xcd\x7e\x9f\xb7\x18\x68\x0f\x3e\x12\xc4\x8d\x91\x6f\x18\x70\xc1\xca\x7e\x62\x31\x47\xdb\xf9\x99\xc7\x02\xed\xbd\x0a\xc2\x01\x15\xb8\x3e\x7a\x8a\x2a\x37\x50\xa0\xe3\xd9\x90\x1a\x92\xcf\x2c\x21\x7a\x5d\xa6\x59\x9c\x48\xcc\x5e\x9b\x25\x20\x53\x6d\xb8\xd7\x00\x0b\x52\x17\x8c\x03\x2a\x20\xdb\xb7\x81\x29\x8f\x70\xc4\x3e\xbc\xff\x35\x73\xdb\x1d\x0b\x03\x8b\x95\x30\x76\x73\xf5\x16\xc1\xe6\x3e\x9a\x71\x92\x31\xac\x00\xf4\xbd\x03\x10\x0e\xda\xf7\x01\x24\x7f\x01\x5b\x5f\x2f\x73\xe0\xc7\x69\x96\x2f\x6c\x37\x0b\x2f\xcf\xc3\xd6\x10\x26\x32\xf6\xdb\x32\xfe\xde\x44\x2f\xfc\x94\x2d\x9f\x6b\x10\x3c\x90\x48\xa6\x9a\x84\xb6\x3f\x02\xe1\x80\x0e\x9c\xf4\xec\xa6\x5b\x0a\x26\xa0\xb3\xe5\x30\xdf\xd0\xc7\xb1\xa7\x78\xff\xf8\xed\xd7\x1e\x9d\x84\x47\xdf\xc6\xc6\x6c\x4e\xbb\xb7\x9e\x41\xea\x82\x71\x40\x07\x34\x03\x9a\x46\x28\xe9\x3b\xb9\x84\xd9\x6c\xac\x76\x4f\x5e\xa1\x9a\x56\xb3\x70\x3c\x5b\x2b\x30\x4a\xa9\x9f\x37\x71\xd2\xd5\x63\x80\xf6\x4a\x06\xe1\x80\x0e\x54\xa4\x34\x46\x98\xf8\x25\x08\x0a\x3e\xeb\xf5\xf9\xfe\xf4\x98\x7a\xb8\xd6\x35\xda\x7c\x6f\xcc\x3b\x89\xbe\x36\x6f\x23\xfa\x1a\xb4\x9f\x27\x18\x07\x74\xe0\xd1\x7a\xb4\x86\x8a\xe7\xd4\xa9\xdf\xfd\x72\x8f\x3b\x78\xb9\x8e\x75\xec\x91\xcd\xee\xb1\xdf\xf5\x63\x93\x57\x4b\x6f\xab\x65\x0f\x40\x1c\x00\xe3\xa0\x7d\x1f\x40\xf2\x17\xb0\xcd\xce\x65\x0e\xc4\xc7\xca\xcd\x92\xf2\xdb\x6c\x70\xd6\x8a\xb0\x2c\x4e\x37\xd1\x67\xa7\x23\x1b\x62\x45\xe8\x67\x71\x66\x36\x23\xdd\x4e\x0c\xce\x80\x8c\x1d\x8c\x03\x3a\xc0\x19\x52\x8b\x73\x3c\x57\x66\xff\x25\xe5\x53\xdf\x4b\x33\x85\x65\xd4\x90\xd6\x4c\x56\xcc\xaa\x9c\xc9\x1e\xec\xeb\x53\xae\x89\xf9\x90\xba\x60\x1c\xd0\x81\x9e\x69\x33\x51\x71\xab\x47\x48\x39\xd4\x58\x3a\xd6\x33\xe1\xf6\x8c\x81\x69\xb9\xe8\x4e\x15\x2d\xea\x0e\x2f\x52\x42\x1f\x52\x41\x1f\xc6\x80\x71\x40\x07\xb6\x0c\x26\x31\x65\x0d\xb8\x3c\xd4\xb8\x5e\xbf\x18\xcd\xf1\x9a\xce\x43\x73\x96\x7b\xfe\x8c\xa8\x89\x1c\xdd\x6a\xc0\x42\xa7\xe8\x3b\xa4\x2e\x18\x07\x74\xe0\xe9\x69\xf4\xe0\x0d\xb9\xb5\x75\x8e\x24\xf2\xe7\xb0\xbe\xb5\x99\x21\xc6\x4a\x3c\xc6\xaf\xe2\x8f\x3e\xfa\x87\xaa\x2b\x6d\x90\x17\x40\x1c\x00\xe3\xa0\xf3\x00\x48\xfe\x02\xb6\xf3\xbc\xf4\x5d\xd4\xa8\x6d\x2e\xa7\x1b\x28\x0f\xe3\x06\x96\xa7\xe0\x57\x02\x3e\x74\xf1\x47\xbb\x3e\x0f\x64\x91\x0a\x1d\xd2\xbe\x19\x60\xae\xa5\x07\xbd\xab\x04\xc2\x01\x1d\xc8\x34\xc0\x69\x26\x2f\xe0\x57\x95\xbb\x27\x3a\x7b\xa2\xfe\x30\x05\xff\x5a\xc3\x40\x63\x71\xb5\x4b\xfa\x20\x0a\x25\x4a\x02\x11\xf4\xff\x2b\x30\x0e\xe8\x80\xe2\x0d\x43\x47\xc1\x61\x3a\x58\x26\xb4\xa3\xea\x61\x4a\x21\x02\xcd\x01\x95\x3d\x77\x98\x95\xa5\x01\xed\x96\x4c\xdb\xb1\x58\xe8\x03\x44\x30\x0e\xe8\x40\xff\xd6\xcd\x17\xc6\xa1\x65\x02\x0f\x1e\x38\x1d\xc9\x1d\x72\xf5\xae\xa2\x17\x0a\x98\x7e\xcb\x36\x8f\x49\x7f\x78\xd8\xcf\xb0\xc2\x06\x5d\x13\x41\x38\xa0\x03\xf0\x6c\x5e\x13\x28\x45\xef\x1e\x3c\x79\x6a\x61\x64\x17\x2b\x4d\xd7\xb8\x29\x14\x28\xb8\x80\xfb\x65\x08\xc5\xa5\x47\xcb\x74\x0c\xda\x7f\x17\x8c\x83\xce\x03\x20\xf9\x0b\xd8\xd9\xfd\xf2\xfc\xa5\x28\x03\xbb\xd9\xd4\xaa\x3e\x03\xd3\x41\xb8\xa0\x28\xf3\x9d\x3a\x39\x61\xd6\x2c\xf7\xa4\xc4\xc9\x04\x59\x63\x30\xbc\x47\xaa\x32\x24\xcb\x00\xe3\x2e\xe6\x2f\xae\x15\x44\xb2\xb7\x58\x9f\x8b\x6d\x18\xb4\xa5\x76\x63\x71\xd1\x64\xec\x8f\x10\x6b\x75\xb4\x7c\x0a\x72\xe8\xfa\xf8\xb4\x17\x55\x1d\x52\x19\x8c\xbb\x98\xbf\x54\x2b\xe0\xda\xbe\xde\x66\x42\x5a\x97\xdf\x60\xee\x45\x54\x93\xfe\x92\x19\x12\xb0\x31\x8e\xfb\x59\x85\x73\x52\x21\xb1\xe6\x13\x26\xa4\x32\x18\xf7\x9f\xfc\x85\xf2\x7c\x65\x37\xfe\x88\x34\x77\xc1\xf7\x08\x46\xfb\x62\x58\x69\xdd\x72\xc7\x3f\x06\xe3\x96\x5b\xb0\xcd\x86\xad\x8d\xde\x27\x6c\xec\x78\x66\x43\xf3\x17\xb0\x9f\xec\x3b\x9f\xbf\x8c\xf3\xaa\xdc\x1c\xd7\x1a\x3f\x9a\xdc\x47\xf3\x1f\x5e\x7a\x5a\x94\x96\x25\x32\xee\x25\x83\xe6\x23\x62\xd8\x3f\xb4\x31\xc7\x11\x7c\x0e\x35\x5d\x17\xd1\xfe\x1a\xf2\xf9\x23\xa3\x65\x33\x96\x33\x32\x7b\xc2\xe8\xac\xa4\x02\xb5\x25\x72\xbd\x1a\x0b\x81\xfc\xcb\x5b\xd3\x68\xff\xb6\xfc\x05\x6c\x68\xe7\xfb\xbf\x00\xf3\x97\xfb\x65\xaa\x65\x39\x02\x43\x6e\xfd\x1d\x05\x77\xb5\x0c\xe1\x0e\x09\xc8\xd2\x0a\x31\xeb\x82\xf1\x3c\x53\x5f\xbd\xcb\xa9\x7a\x3e\x7e\x15\xf9\x0b\x8c\x1c\xf0\x8c\x9e\xc0\x81\xf1\x72\xf7\xcd\xdc\x2c\x93\x8a\x81\xc5\xae\x01\x07\xa6\x0b\x79\xd9\xdb\xa0\xc5\x97\x8f\x2c\x8a\x7a\x36\x98\x48\x29\xee\x5d\xc9\xd5\x8c\x8b\xf9\x0b\x1e\x61\xa7\xd0\x29\x61\xc1\xe1\xeb\x4f\x8d\xf9\xf5\xf6\x6d\x7d\x49\x84\x82\x8d\x2f\xb9\xed\x9f\x2e\x56\xdd\x6f\x24\x91\x96\xed\xbf\x92\x8b\x28\xca\x17\x3e\x96\xf0\xe6\xea\xba\x61\x43\xe1\xec\xa4\x95\xe8\xc0\xac\xa8\x9e\xde\x03\x85\x15\x76\x89\x0f\x4b\xe6\xa2\x6c\x2b\xed\x94\xe6\x9c\xb3\x57\x32\xda\x8b\xf9\xcb\xfd\x0e\x6e\x39\x52\x94\xda\xfb\xac\x98\x9b\xad\xf9\x6f\x0b\x4b\x83\xd7\x3e\x14\xde\xf8\x59\x3d\x14\xa8\xd6\x7f\x1a\x1e\xd6\x75\x7c\x25\xa3\x75\xbe\xf0\xb1\xa8\x21\xa9\x9f\xb6\x5c\x53\x1e\x75\x9e\x1a\x96\x12\xfa\x1c\x07\x3e\xb1\x47\xd2\xbb\xff\x38\x80\xb3\x56\x20\x90\x20\x43\x8b\xd1\xf6\xca\xf2\x17\x30\x75\x2f\x5b\x6e\xb3\xca\x38\x76\x0c\xbd\x63\x09\x0d\xc4\x4c\xcd\x7f\x14\x6d\x27\xe6\xe5\x24\xe0\xbc\xb5\x7e\x15\x3a\x5d\xd6\x3b\xff\x53\x4b\x58\x14\xb2\xcc\x80\x71\xc0\xe5\xb6\xcc\x5e\xde\xbe\x51\xb2\xaa\xad\xb3\x31\x55\xb0\xfb\x3b\x4a\x61\xfe\x71\x9c\xc3\x66\x3b\x6a\x25\xf5\x01\x31\x2a\xcb\x59\xd0\x04\xf4\x35\x62\x10\x0e\xb8\x7c\x35\xf8\xfb\x9c\x66\x32\x64\x2d\xcd\x2f\x0c\x87\x3a\x87\x46\xe5\x72\xe6\x48\xab\x86\x51\xf1\x21\xe8\x74\x06\x0a\xfe\xd0\x49\xd7\x85\xd4\x05\xe3\x80\xaf\xe5\xde\x6c\x5b\x11\x58\xf3\xac\x8d\x60\x1f\xe2\x7d\xee\x8f\xe4\x73\x42\x9d\xf5\xa6\x30\x28\xa7\x8b\x70\xf2\x50\x23\x09\x2e\xbf\x09\xfa\x56\x0b\x18\x07\xfc\x1e\xc2\x97\xe5\x63\x8e\xee\xf7\xa7\xa1\xf1\xcd\x7e\x7c\x43\xa4\xf3\x34\xa7\xa4\xc8\x53\x5e\x71\x40\x5a\x08\xcf\xfb\xcd\x58\xe0\x31\xf4\xfd\x23\x30\x0e\x72\xff\x25\xf8\x8f\xf9\x0b\xd8\x34\x72\x99\x01\x28\x39\x23\x63\x39\xd7\xe9\x8e\x72\x2b\x03\x4b\x99\x8a\xd5\x6a\x8f\x67\xc6\x49\xa4\x68\xf3\xdb\x5e\x99\x05\x7b\xb8\x5a\xbe\x18\x86\x8c\x1c\x8c\x03\x8e\x5c\xcc\x63\x6c\x64\x3b\xd9\x78\xd6\xd7\x19\x87\x02\xeb\x71\xaf\xee\x71\x7d\x85\x2d\x4c\x19\x7c\xe5\x48\x58\xc3\xd9\xdd\xe9\xf0\x5c\x48\x5d\x30\x0e\x68\x00\x27\xa9\xf9\xc2\xab\x56\xd2\x76\x3b\x0b\xbd\x94\xf2\x51\xff\x5b\xf4\xa2\xd8\xc3\x03\x86\x8c\x6d\xa8\x8f\x3b\x5e\x8c\xd5\xdf\x87\x5e\x38\x06\xe3\x80\x06\xb8\xe1\x20\x39\xee\xd6\xb7\xab\x2c\x5b\xb7\xe7\xd1\xb2\x1b\x77\xe2\x7d\x9f\x0d\x2b\xfb\x52\x48\x68\x2b\xe8\x06\x87\x3a\xb3\x4b\x08\xa9\x0b\xc6\x01\xbf\x07\x03\x46\xc7\x12\xdd\xb7\xbd\x0c\x46\x31\xda\xdf\x16\xf6\xd6\xf1\xda\xb0\xc8\x77\xb2\xf4\x65\xea\x6b\xfb\xd8\x19\xe1\xf1\x33\x6d\x20\xf9\x0b\x18\x07\xb9\xff\xf2\xd7\xe2\xf1\x07\x05\xc0\xa6\xf4\xcb\x14\x58\x6b\xb2\xe2\x0a\xab\xdc\xfa\xee\x9a\x8c\xe4\xa9\xfb\x99\x8b\xcd\x3e\xf3\x15\x37\x27\xa3\x03\x0f\x55\xa0\xbf\x2d\x71\x8f\x2e\x0d\x64\xe8\x60\x1c\x70\xe8\xa9\xd3\x93\x13\x28\xda\x6f\x0d\xea\x5a\x31\x3e\x8e\x69\x30\xdf\x76\xdb\x2a\xcf\x9d\x7e\xcf\xaf\x3b\x5f\x05\xa7\x69\xa5\x91\x32\x03\xa9\x0b\xc6\x01\x15\x10\x5b\x10\x79\x28\xb5\x95\x3d\x18\xaa\x6b\xf5\x1e\x66\xbd\xaf\xff\xf5\xa2\x41\x7e\x65\x59\xe2\x56\xd0\xa7\x9a\x81\xc1\x09\x5a\x68\x08\x0b\xc6\x01\x15\x50\xac\x0e\x76\xc4\xce\x7e\x4d\x7e\x97\x4c\xe1\x4e\x61\x06\x9c\xb9\xb6\xa4\x7e\x93\x86\x40\x79\x7d\xb6\xf0\x0a\x9b\xc7\xe9\x7d\xe8\x7b\x4d\x60\x1c\xf0\x7b\x50\xef\x6d\xfb\xf1\x22\x95\xb0\x63\x62\xc5\xb2\x43\xa0\x78\xc1\xf0\xd3\x37\x84\xcc\xf9\x71\x77\x87\xb3\xcf\x1f\xd1\x4c\xd1\x6f\xad\x40\xf6\xdc\x60\x1c\xf4\x99\x27\x48\xfe\x02\xb6\xbe\x5e\xe6\xc0\x9d\xaa\xd3\x9b\x92\x2f\xbc\x3c\xd7\xde\x3f\xb6\xa1\xff\xe9\xf9\x66\xe3\xf4\x86\x86\xcf\x0b\xa2\xc7\xb2\xd1\x1e\xaf\xdc\x72\x5d\x2a\x20\x63\x07\xe3\x80\x63\xbf\xf6\xe6\xed\x8d\xb2\x03\x81\xf0\x0a\xc3\xa5\x8a\xf2\x53\x0b\x46\xb9\x2f\xdc\xca\xbb\x63\xc9\xb2\x07\x14\x55\xf5\xc2\xf7\x84\x78\x21\x75\xc1\x38\xa0\x03\x16\x02\x67\xed\x85\x42\x0d\xc6\xe9\x98\x7d\x0e\x5b\x59\x0d\xd3\x89\x7b\x79\x88\xd8\x5f\x8d\x3e\x48\x72\xb6\xb6\xf2\x92\x4d\x6f\x43\x2f\x42\x82\x70\x40\x07\x1a\x75\x64\x82\x5d\x5e\xd8\x62\xbb\xa4\x7a\xf0\x49\x1f\x2c\x3e\x3d\x7e\xd9\x82\x4e\x87\xf5\xce\x7c\x38\x58\xb9\xc5\xc8\xda\x9b\x18\x52\x17\x8c\x03\x7e\x0f\x01\x3c\x6f\xea\x86\x7e\xd5\x3b\x4c\x33\x1d\xbc\xf3\x7c\x55\xce\xcd\xb5\xaf\x75\x80\xef\xe0\xf6\x6c\x3a\x88\x79\xa6\x92\x40\xb4\x19\xe2\x00\x18\x07\xbd\xfb\xa0\xfc\x67\x07\xc0\x36\x3b\x97\x39\xa0\xab\x57\xc1\x58\x86\xf6\xad\xf1\x1e\xb3\x85\xf4\x81\x9e\x03\x7b\x1c\x37\x2c\xe2\xd9\xf4\xad\xa1\x65\x84\x67\x36\xfe\xa4\x3c\xf1\xd0\x87\x26\x20\x1c\x70\xec\x2d\xc2\xaf\x1c\x69\x64\x79\xf0\x57\xfd\x88\xdc\xbc\x06\x5e\x64\x4a\x54\xb3\x34\xcd\xcd\xd4\xee\xac\x1b\x31\x76\xef\x8c\x9b\x40\xef\xab\x81\x71\x40\x07\x94\x73\x51\xbc\xa7\xda\x1b\xd8\xd3\x67\x50\x3a\x50\xfd\xc2\xc4\xc3\xec\xe3\x68\x35\xa9\x9b\x60\xde\x3c\xae\x95\xc9\xd1\x7e\xac\x0f\xed\x17\x0c\xc2\x01\x1d\x80\x11\x44\x7a\xda\xf2\xe9\x06\x33\xfa\x0d\xf3\xc3\xcc\x9e\x35\x2b\xed\x66\x7b\xbe\x11\x78\xd5\x2c\x24\xe2\x7b\x62\x77\xe5\xf5\xa1\x7f\x2f\x18\x07\xfc\x1e\xfa\xa7\x50\x99\xde\x55\x26\x39\x9a\x9b\x74\x88\xd9\xec\x11\x6d\xdf\x4e\x99\x1a\x29\xe2\xe2\xe9\x92\x52\x14\xe8\x63\x30\x34\x0b\x84\x38\x00\xc6\x41\xe7\x01\x90\xfc\x05\x6c\xe7\x79\x99\x03\x43\x43\xa4\xe8\x6e\x53\x41\xc3\x51\xa1\xc4\xd6\x56\xb5\xea\xbd\xb1\x2a\xc8\x49\x28\x47\x38\x56\xc3\xca\xcf\x4d\x65\xec\x10\xa1\xef\x0b\x82\x71\xc0\xb1\x8b\x5b\x86\xef\xa6\xb2\x17\xdf\xaf\x9b\xea\x20\xb9\xe9\xb6\xb1\x7f\x3b\x03\x49\xf2\x45\x09\x6d\xad\x3d\x3a\xe3\x26\x8d\xcc\x24\x35\xa4\x2e\x18\x07\x74\xc0\xb0\xfb\x03\x81\xb5\xcd\x4a\xec\x9a\x7a\xa7\xcf\x68\x72\x3e\x8d\x5f\x08\x29\x09\xcf\x2f\x83\xe5\x4a\x49\x6f\x6b\xc2\xcf\x39\xd0\x07\x67\x60\x1c\xd0\x81\x8c\x20\x7e\x9c\x5f\xfa\x7d\x96\xe4\xb6\x53\x4d\xbd\xb5\xbe\x9a\xd6\xa9\x1f\x58\x8c\x95\xd5\x48\x66\x29\x17\xa9\xa8\xe4\x4c\xa1\xef\xb6\x81\x71\xc0\xef\xa1\xb9\x14\x5f\x66\x82\x3e\xc2\x6a\x5b\xba\x9f\x2f\x67\x3e\xd8\xe1\x85\xd8\xdc\xc7\xd0\xe9\xc9\x01\x04\x36\xf8\x24\x57\x8b\xfb\x2e\x10\x07\xc0\x38\xe8\x3c\xe0\xfc\xe7\xfc\x05\xec\xec\x7e\x79\xfe\xb2\x50\xb1\x9d\xf8\x7e\x21\x65\xc1\x5d\x8b\xf9\xc6\xdb\x67\x83\x2a\x4d\x83\x46\x85\xf3\x14\xbf\xc4\x89\xf5\x49\x5b\x43\xd6\x7d\x92\x20\x59\x06\x18\x77\x31\x7f\x69\xab\x6a\x74\x88\xc7\x45\x2e\xb2\x7e\x52\x19\x76\xc3\xec\x91\xb0\xf2\x76\x16\x72\x79\x30\x3b\xa7\xa7\x8e\x18\x63\x9f\xce\x53\x45\x48\x65\x30\xce\x4b\x02\x06\xe7\xef\x95\x13\x89\x8f\xed\xb1\x7c\x44\x6a\xc8\x0c\xb7\xd9\x57\x9f\x57\xd4\x70\x71\x23\x6e\xd1\xfb\x0f\x6b\x93\x89\x35\x85\xbc\x99\xbb\x9d\x0b\xa9\x0c\xc6\x79\x49\xa0\x00\xbe\x8d\x7f\xfc\xfb\x47\x48\x01\x37\x74\xb4\xb9\x05\x22\x83\x72\x5e\xe7\x59\xa6\x08\x57\x7f\xb5\x98\xfe\xf4\x84\x44\x5a\x95\x1f\xdb\xf4\x47\xae\x08\x13\xed\xf9\xfc\xe5\xdd\xa8\x97\x54\xea\x73\x5f\xae\x1f\xcf\xde\x60\x33\xd1\x47\x33\x3a\x7d\xfb\xae\x6e\xe2\x8b\x57\xe3\x6e\x76\x44\x71\x8a\xbf\x5a\x7c\xfe\x5f\x43\xb8\x38\xe4\xeb\xa4\x29\x9a\x5c\x02\x3e\x77\x5b\xd6\xdc\xd3\xa7\x4b\x51\xc3\x58\xf6\x6a\x9f\xa5\xc6\x91\x38\xc3\x36\x29\x0b\xff\x6d\xf9\x0b\xd8\xd0\xce\xf7\x7f\x01\xe6\x2f\xd5\x3c\xa2\x8a\xa8\x35\x09\x9e\xf0\xe8\x59\x2d\xd2\x3f\x12\xe2\x8a\xfc\x68\xec\x14\xee\x67\x87\x4c\xd0\x1c\x39\xf6\x32\x67\x9a\x5d\x45\xfe\x22\x72\x21\x7f\x11\x58\x6d\xfe\x74\xe8\x28\x6f\xb2\xf6\xd3\x21\xd0\xcc\x0f\x09\x27\x23\x22\xaf\x54\xf8\x51\x90\x0f\xca\x78\x42\xf4\x89\x1a\xf1\xe7\x2b\xb9\x9a\x71\x31\x7f\xd1\x51\xee\x4c\xf9\xcc\xfb\x98\x8e\xc3\x4f\xcc\x82\x65\xa5\xc7\x5b\xa4\x29\x00\x2d\x8d\x20\x0f\x43\xe1\xc1\x9c\xb4\x6b\xc7\x2b\x9d\x2b\xb9\x88\x72\x31\x7f\x59\x60\xe8\x67\xdc\xcd\x08\xc2\x94\xcd\xec\x6f\x68\x98\xcf\x7d\xcb\x5f\x2c\x14\xf6\x8c\x5b\xe1\xd5\x1a\xcd\xeb\xee\x91\x78\xb3\xf8\x2b\x19\xed\xc5\xfc\x05\xf5\x4d\xf0\xfe\x9c\xb9\x6b\x1d\xa3\x43\x4e\xc7\xbe\x8c\x70\x25\x2f\x8a\xb5\xb7\x7b\xa7\x30\x0a\x86\x71\xd7\x17\xa5\x36\xf2\x85\x2b\x19\xed\xc5\xfc\xa5\x92\x88\x5a\x65\xb0\xec\x95\x41\x27\x3a\x77\x82\x93\x5c\xab\xda\x1d\x95\x2d\x7d\xe1\xe9\x78\x7a\x13\x31\x63\xdc\x94\xf6\xdc\x9d\x2b\xcb\x5f\xc0\xd4\xbd\x6c\xb9\xf5\xbf\xbf\x03\x5b\x73\x77\x7f\x79\x3f\x71\x9c\x29\xdd\x44\x7e\xce\x9d\x77\xf4\x0e\x93\x75\xee\x91\x94\x03\x2e\x1b\x9d\x77\x5b\x35\x64\x99\x01\xe3\x80\xcb\x8c\xcd\x14\x39\x8c\xb8\x67\x64\x1b\x36\x9c\xba\x5d\xf6\xc8\xe0\xdc\x89\xcf\xbc\xbe\xa8\x04\x0b\x71\xe7\x3c\x41\xbf\xea\xab\x8f\xb0\x90\xba\x60\x1c\x70\xb9\xfd\xc0\x32\x40\xd5\x61\x54\xf7\xe5\x26\x6c\x75\x9a\xe9\xcc\xe4\x11\x65\xf7\x8d\x7e\xcc\xf8\x96\xb1\x1c\x9b\x95\xf8\xc6\x66\x89\x3b\x90\xba\x60\x1c\x70\xb9\x2d\xb2\xaa\x2a\xa0\x4d\x19\x4b\xac\x73\xf5\xdb\x6a\x29\xf7\xa7\x21\x51\x44\xe9\x6d\xdb\x4f\xa3\x35\x56\xb9\xbe\x9a\x07\xc7\x09\x7d\x8c\x02\xc6\x01\x1f\xcf\x78\xd3\x4e\xf3\x2e\x3b\x72\xd6\x16\x61\xac\x17\xb2\xcf\x89\xef\x73\xfe\x48\x10\xdb\x63\x26\x77\xe9\x42\xba\x51\xd4\x7c\x1a\xba\x0f\xc9\x5f\xc0\x38\xc8\xfd\x97\xee\x3f\xe6\x2f\x60\xd3\xc8\x65\x06\x04\x64\x6b\x84\x3f\x27\xac\xc8\x7d\x5b\xa0\x8f\x4b\x5f\x25\x5b\x30\xc5\xe6\x80\x53\xe2\xe1\x6c\x3a\xa3\xbe\x1e\xaf\x8b\xc9\x94\x0a\x19\x39\x18\x07\x34\xe0\x26\x7b\x4d\xc2\x02\xff\x5c\x10\x2f\x8c\xf2\x48\x49\x9e\xb8\x3c\x45\xbc\x61\x13\xff\xb6\xc0\x04\xbe\xd6\xae\x11\xa5\x71\x00\x0e\x34\xd1\x02\xe1\x80\x06\xac\xc7\xc1\xa6\x54\xc3\xb9\x4f\x35\xb5\x86\x1d\x88\x71\x4a\xe3\x7e\xf8\x46\xcf\x7c\x27\x55\x69\xa2\xb4\x69\xfe\x40\x91\x6f\x1c\x7a\xf0\x02\xe3\x80\x06\x10\xbf\xc8\xa9\xb5\x1b\xbe\x2f\x1b\xa3\x76\xaa\x96\x0a\x3f\xee\xa8\xcc\xfc\x66\xdd\xaa\x2e\xa8\x41\x3c\x75\x10\x8d\x61\x63\x16\xfa\xbe\x14\x18\x07\x34\x80\x33\x1e\x23\x3b\xfb\x91\x77\x10\x82\xbe\x57\xf4\x89\xda\x03\x83\x4a\xe3\x03\x4f\x6c\xc5\xc7\xb8\x1e\xe1\xab\x0d\xf4\xbd\xa6\x2f\x21\xf9\x0b\x18\x07\xb9\xff\x22\xf2\xe7\xfc\x05\x6c\x4a\xbf\x4c\x01\xd1\x3a\xcb\xb5\xe4\x26\xa9\x29\x98\xc1\x11\x53\x9b\x50\x7c\xf8\x80\x12\xff\xd9\x97\x52\x94\xb4\x5c\x05\x8f\x17\x58\x57\xbe\x42\x7f\x2a\x1c\x8c\x03\x2a\xd0\xb6\x2f\x95\x8f\xb8\xf4\x13\xa1\xcb\x82\x19\x2b\xf3\xe4\x54\xad\xb3\xdb\x4e\x52\xf3\xd3\xad\xdc\x27\xc1\x9a\xf7\x4a\xbb\xbb\x3f\x41\x5f\xea\x03\xe1\x80\x0a\xd8\x2a\x96\x3b\xff\x3a\x13\xd6\x67\x17\x0a\x29\x72\xb7\x9c\x76\xe6\xf3\xe2\x11\xd4\x9b\xdd\xec\x57\x64\x61\xd3\x9f\x25\x16\x82\xfe\x46\x30\x18\x07\x54\xa0\x06\x27\xc2\x16\x19\xfb\x5a\x48\xcb\x86\xbc\x12\x7d\x6c\x5d\xe0\x33\xa2\x53\x91\x70\x07\x4e\x29\x55\xe9\x99\xe9\x01\xbf\xc5\x44\x48\x5d\x30\x0e\xa8\xc0\xda\xa1\x5e\x2c\x57\xd6\x68\xb2\x82\x5b\xb5\x5e\x1a\xed\x83\x39\xba\x5b\x2e\x8f\xbe\x28\x77\x68\xd9\x45\xb5\xd1\xdf\xe3\x92\x45\x85\xec\xb9\xc1\x38\xe8\x33\x4f\x90\xfc\x05\x6c\x7d\xbd\xcc\x81\x72\x1f\x2d\x55\x22\x62\x69\x74\xd7\xc2\x20\xdd\x8e\x32\xad\xe7\xf0\xbf\xdc\x91\x09\xbf\x53\x4f\x50\x45\x9c\xc0\x79\xf6\x63\x40\xcf\xb2\x60\x1c\xd0\x81\x5f\x21\x2f\x09\x0a\x79\xa7\xee\xfa\xfd\x20\x2d\x12\x42\x0b\x5d\x11\x99\xa9\x71\x89\x96\x39\x51\xc9\x6b\x52\x0e\x3e\xf5\xbb\xde\x03\x7d\x3f\x00\x84\x03\x3a\x10\x95\xc9\xd0\x85\x28\x63\x1d\x75\xfd\xcc\x68\xbd\xeb\x24\x70\x60\x3e\x5a\x73\xa4\x70\xa4\x3d\x51\x9b\x7b\xec\x8b\xdb\xa1\x0a\x2b\xa4\x2e\x18\x07\x74\x80\x77\xee\x53\x0a\xee\x87\x3b\x84\x5c\xb3\x6c\xb7\x55\xce\x50\x8d\xd1\x5c\x16\x4d\x92\xfd\xf0\x3b\x9e\xaf\xd2\x57\xfb\xc9\x54\x4b\x41\xea\x82\x71\x40\x07\xe2\xb6\xcb\x3b\x9e\x37\xb9\x92\xc7\xbe\x6c\x33\xaa\xda\x3c\x41\xd7\x7d\x78\x48\xec\x1b\x54\x71\x86\xf7\x95\xa0\x84\x48\xa5\x24\x07\xfa\x0e\x1a\x08\x07\xbd\xfb\x00\x92\xbf\x80\x6d\x76\x2e\x73\x40\xbd\xad\x17\xd6\xdb\x9b\x40\xf4\x27\x12\x8e\x47\x41\xaa\xa5\xb9\xd2\x99\x3f\x2c\x81\x41\xf5\xad\x5e\x6f\xee\x28\x7b\xb6\x9e\x3a\xc8\xd8\xc1\x38\xa0\x03\x71\x91\x88\xb4\xa4\x7c\xed\xca\xf2\x9a\x8a\x2f\x56\x6c\x02\x31\xea\xac\x48\x24\x8d\xdb\x63\xaa\x8b\x13\x99\xd7\x0a\xb3\x76\xf2\xa0\xef\x72\x80\x70\x40\x07\x28\xa8\x33\xb9\x9f\xe3\x52\xbe\xf6\x32\x62\xc5\x96\xb7\xff\xc4\x5e\x19\x80\xfd\xd1\xdb\xd6\xa1\x63\x43\x47\xfa\x48\xc3\x6c\x9f\x0e\x52\x17\x8c\xbb\xd0\x2b\x39\xae\x6a\xa8\xad\x55\x6a\x39\xa8\x9b\x84\xeb\x6d\x55\x28\xf6\x2d\x66\xa3\x2e\x46\x75\x9d\xe4\x17\x47\xe9\x1c\x6c\x9d\x7e\xd0\x7b\x70\x60\x1c\xd0\x01\xad\x1c\x37\xfd\xfe\x65\xf7\x1f\x6e\x03\x6d\x1f\xc6\x48\xd9\xcd\x5c\x4e\x49\x08\xda\x67\x5d\x29\x39\xe9\xee\x6c\xdc\xbc\xff\x0c\x19\xe2\x00\x18\x07\x9d\x07\x40\xf2\x17\xb0\x9d\xe7\x65\x0e\xd8\x8e\x51\x11\xe9\xa5\xee\x3d\x52\x37\x41\x7f\xe8\x50\x66\x74\xf4\xe1\x99\x8c\xb8\x1a\x2c\xc9\x57\xa5\xee\x8f\xf5\x9d\x35\x64\xd0\x7e\xd9\x60\x1c\xd0\x81\x78\x9a\x68\xe7\x5c\xf3\x7e\x5e\xa5\x98\xcf\x14\x83\x92\x77\x46\xc4\x54\x9c\xca\xaf\xb1\xbf\x3e\xf5\xf7\xfa\xb1\xf8\x60\xd3\xae\x04\x7a\xb7\x0a\x84\x03\x3a\x60\xf2\xf2\xe9\x57\xbe\xaa\x66\x04\x22\xb1\x91\x4a\x02\x01\xde\x3a\x24\x61\xc9\xf8\xdd\x9c\xe5\xfc\xb3\x2e\xf8\x9b\x2e\x43\xf8\x03\x90\xba\x60\xdc\x85\xc7\x31\x89\xbe\x98\x16\xad\xcb\xcf\xae\x55\x9f\xd1\x4d\x90\x2e\xdf\x73\xba\x5f\x42\x7e\x44\x98\xb6\xa7\x09\x33\x04\xd7\x43\x8b\x54\x0e\x7d\x1c\x03\xc2\x01\x1d\xf0\x21\xfb\xd4\x67\x74\xcc\xbd\x5c\xdd\x66\x60\x96\xf1\x30\x0c\xa6\x5b\xae\xb9\xd0\xeb\x6d\x7f\x17\xcb\x99\x34\x3f\x85\xad\x44\x06\xc4\x01\x30\x0e\x3a\x0f\x80\xe4\x2f\x60\x67\xf7\xcb\xf3\x97\x7a\xba\xac\xf1\xda\x95\x96\x8e\xe4\x07\x43\x75\xfe\xdf\x6f\xd3\xde\xa6\x37\xec\x74\x69\x36\x8a\x25\xb4\x2c\x95\x74\x1f\xc9\x0b\x83\x64\x19\x60\xdc\xc5\xfc\x05\xce\xad\x1c\xcf\xcb\xe7\x9e\x2c\xcc\x76\xd7\x35\x33\x76\x42\x37\xb9\x07\x63\x13\x38\xfd\xad\xae\xa3\xc7\x2c\x25\xc9\xa9\x8c\xf9\xd0\x37\x9b\x40\xb8\x8b\xf9\xcb\x0d\xe2\xba\x42\x52\xfb\x1f\x37\xf9\x05\x04\x93\x8b\xb7\xaa\xec\xdf\xfb\x49\x47\xc3\xba\x98\x5c\xd7\xb3\x25\xda\xee\xa8\x8c\x90\x84\x54\x06\xe3\xbc\x24\x28\x01\xdf\xc6\x3f\xfe\xfd\xa3\x84\xa3\xb7\x66\xc3\xde\xc5\x5f\x79\x04\x4e\x1e\x5b\x70\x86\x4f\xa3\xa8\xb9\xd5\xe3\x1d\xbd\x20\x68\xc6\xe0\x1d\x6f\xb2\xb4\x34\x3d\x9f\xbf\xa4\xcb\xde\x7e\x1b\xe3\xa6\xf1\x25\xa6\x6a\xa2\xe3\x2e\x77\x0d\x4d\x08\x75\x44\xd1\xb5\xd4\x20\xe4\x79\xf1\x32\x2b\xd1\xa1\xc5\xf3\x8d\x4e\xf0\x6e\x12\x36\x6c\x3d\x86\x55\x96\x1b\x47\x5b\x76\x0a\xb8\x4b\x47\x57\xc1\x3c\x55\xc3\x7a\xb0\x8d\x64\x1a\xb1\xaa\x99\x3e\x23\xfb\x6f\xc9\x5f\xf6\x11\xff\xd9\xd0\xfe\x2f\x7f\x11\x87\x11\x03\x1e\x97\xc9\x47\x28\xd5\x64\x43\x2a\xf7\xba\x77\xb9\x39\xb6\xd7\x63\x4c\x90\xfc\x28\x2b\x4d\xd8\x27\xf2\x74\x58\x8a\xdf\x67\x32\xf5\x5e\xbb\x8a\x00\xc6\xfd\x42\x00\xf3\x5e\x7c\xeb\x4b\xc0\x11\x03\x7a\x6b\x4f\x2c\xdd\x04\xfc\xcd\x5d\x11\x7c\xff\x9c\xa2\xdd\x89\x38\xe1\x02\xfa\xec\xcd\x13\x6d\xfb\x2b\xb9\x9b\xc1\x77\x21\x1b\xc8\x93\x5d\x2a\xe5\x6e\x68\x37\xb9\x59\x35\x8a\x50\xc2\x8b\xde\x95\x92\x36\x6b\x73\x7a\x0b\xbd\xfc\x3a\xde\xb3\xde\x5a\xc3\x2a\xb6\x2b\xb9\x89\x72\x31\x80\x79\x89\xf4\x76\x76\xc2\x4e\xe5\x04\x3d\x34\x39\x10\x79\x18\x6d\xd3\xb7\x99\xbf\xe5\x73\x0c\x43\x97\x42\x47\x17\x6a\xa5\xc3\xcd\xb6\x2b\x19\xad\xf5\x85\x8f\x4d\x42\xee\x94\x6c\x3a\x5b\xb2\x63\xd9\x7b\xf7\x24\xe5\x09\xf3\xe3\x12\x12\x93\x30\xae\xa3\xbe\x6a\x7b\x24\xaf\xa5\x2a\x3c\xfe\x84\x2b\x19\xed\xc5\x00\x26\xf5\x7a\x17\xde\xf4\xea\x87\x38\x66\xfd\x17\x13\xcb\x36\xcb\xfa\x9c\xef\x68\x16\xe0\x63\xd9\x4d\x88\xbf\x94\x08\xff\x20\x09\x8e\xba\xb2\x00\x06\x4c\xdd\xcb\xd6\x5b\xc5\xe3\xd4\xfe\xb1\xad\xf5\xde\x33\x33\x13\x1c\x84\xc8\x1d\x04\x3d\xaa\x83\x11\x74\xaa\xfd\x07\x8d\xe1\x4d\x7d\x16\xd7\x46\xd4\xa1\xcf\x7c\x41\x38\xe0\x7a\x5b\x51\x37\x8d\xcf\x76\x72\xa7\xab\xe6\x70\x64\xdc\x19\x0f\xe1\xc1\x46\xa4\x24\xc2\x4c\xb6\xb4\x79\xed\xeb\x21\x55\xff\xe2\x7a\x68\x43\x15\x30\x0e\xb8\xde\x2a\x70\xc5\x6f\x28\x08\x93\x73\x09\xf0\x64\x94\xb2\x70\xaa\x97\x85\x55\x58\x74\xb1\xaa\x50\x1e\xd2\x52\x46\x4f\x0a\x4e\x78\x15\x41\xea\x82\x71\xc0\xf5\xf6\x19\xbf\x69\x36\x62\xc3\xd9\x99\x9b\x9e\x45\x91\x19\xb9\xdb\x06\x1f\x6b\xf9\xfc\xed\x20\x21\x09\xb5\x85\xe4\x38\x97\x3b\x16\x6b\x90\xba\x60\x1c\xf0\x77\x0c\x59\xa9\x9a\x6b\xbe\xa4\x4f\xce\x5b\x55\xca\x84\x52\xca\xcb\x33\xe2\xe1\x6d\x47\xb8\x35\xea\x62\xd9\xd3\xd3\x49\x26\xe4\x98\xa2\x41\x8e\xdf\x60\x1c\xf4\xe7\x6f\xc4\xfe\xb8\xe5\x02\x9b\x47\x2e\x53\x80\x03\x33\x96\xb3\xb3\xd5\x8e\x5f\xa2\xbc\x5e\x4b\x72\xa7\x88\x8c\x70\xe4\x18\x2d\xfa\x95\x47\xe0\xcd\x2f\xb9\x8c\xb4\x2e\xcd\x07\x90\xa1\x83\x71\x40\x05\x38\xba\x33\x27\x51\x42\x8e\xca\x72\xf4\x77\x2a\xa6\x1d\xef\x3d\xe2\x9d\x1c\x38\x45\xef\x51\x72\xa2\x5d\xb2\x96\x3e\xb6\x5e\x80\xfe\x52\x11\x18\x07\x54\x40\xdb\xe3\x40\x20\x4a\xcf\xce\xb9\xec\xc6\x67\x8e\x57\xb9\x6e\x68\xd2\x2c\x18\x6e\x21\x36\x03\xc7\x64\x4a\x6b\xb1\x9f\x45\xfa\xa1\x77\xb6\xc0\x38\xa0\x02\xf5\xcc\xbd\x7e\xb5\x36\x4b\x76\x89\x37\x1c\x78\x97\xc3\x48\x4c\xc4\xdd\x7e\xe1\x73\x4d\xbc\xbc\x59\x12\x56\x6f\x03\x2f\x69\x85\x0f\xa9\x0b\xc6\x01\x15\x50\x33\xb8\xfd\x83\xd5\x96\xa0\x75\x44\x39\xe9\x76\x51\x37\x1d\x8d\x98\xc6\x3b\xb5\x52\xbf\x3b\x74\xb2\xf5\x58\x18\x6f\x58\x52\x55\x21\x0a\x80\x71\x10\x05\xdc\xff\x9c\xc0\x80\xcd\xe9\x97\xbe\x86\xc8\x83\xe6\xd5\x66\x6c\x46\xab\xe1\x38\x31\xf9\x2d\xb0\x48\x81\x3b\xe2\x8d\x48\xd2\xa3\x9f\x36\xc2\x05\x5d\x4e\x7d\xc7\x54\xd0\xae\x17\x60\xdc\x85\x9f\xa1\x5f\x78\xc6\xf3\x58\xda\xe4\x3a\x12\x85\xa0\x67\xeb\xfb\xb5\x28\xc4\xf7\xbd\xfc\x7e\x76\xf9\xbf\x3a\xe2\x7d\x9d\xb8\x9a\xee\x96\x42\xea\x82\x71\x40\x05\x92\x78\x2b\x36\xca\xc8\x66\x66\x97\xeb\x16\x45\x02\x72\x4d\x2b\x62\x1f\xbc\x3c\x46\x27\x40\x64\x87\x5d\x78\xa1\x2b\x1a\xe2\xf3\x19\x52\x17\x8c\x03\x2a\xa0\x79\x47\xe7\x55\x68\x51\x54\x32\x03\xe5\x23\xe3\x56\x29\x32\x77\x22\xf3\xef\x3c\x55\x84\x72\x4f\xb5\xa5\xd8\x5b\x76\x42\xdf\x63\x40\xdf\x6a\x01\xe1\x80\x0a\x70\x39\xd2\x5b\x22\x8f\x7d\xe8\x64\x30\x8e\x6c\xe3\x90\x86\x3b\xbe\xd3\x7e\xdf\x43\xb4\xd1\x5c\xe1\x30\xe5\xe8\x13\x57\x8b\xab\x14\x64\xd7\x0d\xc6\x41\x7f\xf5\x82\x0f\xe4\x97\x4f\x40\x16\xd8\xcb\x1c\xa0\x49\xe7\xc2\x45\xc2\xd9\x6c\x5e\x0f\x79\x5d\xa4\xbe\xd8\x57\x7b\x77\x5d\x3b\x3c\xce\xff\x2e\xeb\xae\x31\x7a\xf8\x4d\x84\x3b\xd0\xb4\x0c\x8c\xbb\xf0\xd4\x9f\xb3\xe7\xba\xca\x30\xed\xb0\x47\x1d\xcd\x56\xa4\x49\x62\xf6\x41\xdd\x75\x9c\x26\x0e\x25\xe4\x8f\x3a\xa9\xe5\xe3\x9b\x56\xd0\x93\x17\x18\x07\x74\x20\x11\xc9\xbc\x22\xa9\x16\x3d\x7f\x3b\xcc\x4f\xbb\x38\x67\x5f\xe1\x4e\x46\x09\x4e\x8b\xba\xfe\x2a\xf9\xd4\xf0\xe3\x06\xbb\x24\x77\x48\x5d\x30\xee\x42\x02\x03\x37\x9e\xdf\xb5\x5b\x5d\xc4\x13\x5d\xe9\x4d\xf2\xca\x50\xe0\xcb\x66\x78\xdd\x7d\x63\x26\xa1\x3d\xb7\xf2\xc0\x99\x7d\x7d\x3c\x68\x02\x03\xc2\x01\x1d\x98\x7a\x89\x3e\xbd\x98\xe0\x71\x16\xf6\x0e\x8e\x23\x81\xc7\xf1\x03\x35\x7c\x9a\x54\x9a\xe3\x56\x83\xea\x48\xfc\xcf\xe9\x6a\x1b\xe8\xe9\x1b\x8c\x83\xfe\xfa\x0d\x48\x02\x03\xb6\xdb\xb9\xcc\x81\x6f\x2e\x7b\xdc\xc9\xa4\xce\xf9\xd9\x71\x4c\x70\x61\x83\xed\x4e\x45\xaf\x7f\xe9\x76\x29\x84\x68\x89\xfe\xe2\xd8\xb9\x9d\xe1\x0f\xfd\x79\x41\x30\xee\xc2\xeb\xc8\x9d\x45\x25\x46\x23\xc9\x16\x7c\xc8\xd2\x7e\xbf\xd8\x04\xda\x35\xc2\x6f\x98\x4f\xb3\x0f\x30\x11\xf6\xbd\x4c\x15\x12\xb0\x80\x76\xf6\x05\xe3\x80\x0e\x38\xba\x7c\xa8\x67\x9d\x5a\x8b\xc8\xcf\x95\x96\x7a\x66\xc4\x5b\xb7\x3c\xca\xb4\x7b\xba\x77\xaf\xf7\x3a\x96\x81\x53\xe3\x7e\xcd\x26\xa4\x2e\x18\x07\x74\x20\x27\x8b\xbc\x45\x8b\x7b\xcb\xc9\xad\x0c\x6b\x6d\xd9\x81\xb6\x77\xb7\x3f\xe1\xf0\x6b\xd5\x88\x7f\x82\x3c\x0d\xe9\xcd\x92\x7a\xe8\xcf\x12\x80\x71\x40\x07\x1c\x7e\x3a\xa6\xaf\x8c\x57\xf6\x97\xbb\x90\x2d\x5c\xbf\xcf\xe9\x5e\x98\xad\x03\xb3\x58\xc3\xbf\xc5\x4e\x12\x71\xc3\x9e\x47\xf7\x23\xc4\x01\x30\x0e\x3a\x0f\x58\xff\xd9\x01\xb0\xad\xe7\x65\x0e\x84\x5a\x5b\x3e\xc9\xb6\xd0\xdc\x44\x9d\xcb\x6a\xa4\x2a\xbf\x36\x11\x1f\x42\x6c\xf7\x02\x85\xc3\x45\x95\xd2\x7a\xcf\x3b\x4b\x0e\xfa\x82\x2f\x18\x77\xa1\x21\x9c\x4e\x66\x63\x1a\x5c\xe6\x82\x03\x4b\x95\xe6\xed\xfc\x5b\xa7\xc3\x52\x7d\xe4\x35\x77\x3c\x25\xa7\xdf\x45\x7e\xf8\xd5\xe6\xfe\x0a\xda\x60\x0d\x84\x03\x3a\x10\x99\x9f\x64\xd4\x2e\xf6\x6d\x86\xf6\xde\xe6\x19\x0d\xd7\x84\x50\x45\x54\x5e\xe9\xbc\xf9\x9d\xfb\x6f\x91\xa9\x4e\xf9\x3f\xce\x3d\x87\xd4\x05\xe3\x80\x0e\x24\x0d\x8a\x08\xbb\xb0\xf1\x5b\xca\xf8\x79\xe2\x38\x2e\x07\xa5\x60\xd6\xa8\x8b\x7b\x1c\x9a\x8b\x65\x0f\x77\xeb\x2e\xdf\xf9\xbf\xee\x65\x60\x1c\xd0\x81\x7e\x7c\xbc\x13\x53\xdf\xc8\x26\x6e\x45\x38\x71\x53\xb8\x6c\x56\x24\x57\xaf\x06\xfd\xf4\x21\xca\x97\xcf\x17\x37\x7f\xe5\x29\x15\x41\x6f\x41\x81\x70\xd0\x79\x00\x24\x81\x01\x3b\xbd\x5f\x9e\xc0\x28\xb5\xe1\xd3\xba\x73\x8f\x3d\xd3\xd0\x50\x5b\x7f\x1d\xd2\x7c\x24\x27\x82\xe3\x38\x73\x5b\x29\xfc\xcb\x9c\x88\xe4\x11\xc7\xf2\x0e\x24\xcd\x00\xe3\x2e\x26\x30\x07\x43\x33\x92\x5f\x4e\xb6\x4a\x5e\xb3\xa2\x79\x0a\xa1\xc1\x30\x17\x72\x61\xb5\xc0\x07\xd2\xe7\x95\x3a\xf4\x3e\xda\xd1\xa5\xa8\x80\x54\x06\xe3\x2e\x26\x30\xce\xeb\x5b\x43\x5e\x5c\x74\xaa\xbe\xfd\x74\x12\x8f\x18\x94\xb4\xee\x63\x96\xe1\xb1\xba\x25\x52\xdc\x35\x55\x7c\xef\x85\x97\xa4\x05\xa9\x0c\xc6\x79\x49\xb8\x03\xbe\x8d\x7f\xfc\x0b\x48\xf1\xa7\x3b\x7e\x0e\xed\x5e\xf8\x94\x3d\x12\x68\xef\xf0\x46\xa5\x44\x7a\xa8\x92\x3a\xbe\x72\x52\x78\xac\x95\x6b\xc4\xdd\x38\xea\x3e\x9f\xc0\xac\xb6\x39\xb5\x56\x0c\xb1\x74\x57\x6f\x07\x8d\x0c\xe9\x8c\xd8\x48\x5e\x97\x16\xc2\x50\xc8\x53\xfe\xfa\x34\x3d\xa4\x8a\x21\x3d\xe8\xfc\xff\x93\x6a\xb5\x91\xdd\xb4\xb3\xc3\x48\xd6\x8d\x3f\x72\x88\xfa\x14\x23\x1f\x58\x8c\x2e\xb6\x46\xdb\x86\x17\x28\xd7\x30\x27\x8b\xac\xfc\xdb\x12\x18\xb0\xa1\x9d\x4b\x60\x44\x2e\x24\x30\x7d\xbf\x68\xbc\x79\x5f\xc5\x48\xc6\x3c\x9d\x66\x10\x5e\xab\xbd\xc3\x1f\x1a\x5c\xa3\x2d\x66\x53\x7b\x80\x81\xbd\xa9\xd3\x43\xb8\x78\x15\x09\x4c\xdd\x85\x04\x66\xae\xb3\xe7\xb9\x9d\x9f\xe6\xa2\xe5\xd8\x2d\x98\xb4\x98\x8e\xa9\xaa\x43\xba\xb4\x70\x8b\xe0\x84\xff\x1f\x73\xe7\x1d\xce\xf5\xf7\xff\x7f\x2b\x99\xd9\x7b\x27\x33\x33\x29\x21\xc9\x9e\xd9\x23\xb2\xc9\x08\x59\xd9\x2b\x44\x76\x65\x44\xf6\xcc\x26\x9b\xcc\x22\x23\x7b\xef\x95\x08\x49\xa8\xec\xfc\xae\xcf\xf7\xba\x5e\xcf\x4f\xef\x27\xbf\xce\xe7\x0f\x7f\xbc\xff\xbf\x5d\x8f\x97\x73\xdc\x9f\xe7\x9c\xfb\x39\xe7\xf1\x38\x72\x01\x75\x64\xa2\xc4\x29\x7d\x67\x72\x3b\xe3\xe4\x0e\x0c\xe9\x15\x49\xc5\x97\x09\x1d\x32\xdb\xb8\x7b\xf5\xe3\xac\xca\xbc\xad\x11\xc7\xbb\x6e\x39\x6a\x1f\x8c\xe2\x17\x7e\x3f\xfb\xa4\xd2\x7e\x26\x77\x51\x4e\xee\xc0\xf4\x6c\x95\x04\x9b\x0b\x0f\x16\xf3\xbe\xbe\x8a\xfb\x7b\x3a\x23\x26\x03\xe3\xd1\x93\x87\x56\xc1\x7c\xe7\xca\x30\x64\x13\x43\x3c\x73\xce\xa4\xb5\x27\x77\x60\x52\xfd\x9c\xfc\x95\xc5\xe8\x49\xca\x3a\x42\x66\x28\x56\x2c\xd7\x85\x8a\x15\xce\xb1\x6d\x49\xdd\x49\xbe\xbf\xcd\x3c\x35\x13\x7a\x36\x37\x6f\x4e\xd9\x81\xa1\x1d\x7d\x5c\x20\xb6\x2a\x26\xfa\x39\x3b\x51\xad\x8a\x17\xbd\x70\x8e\xa3\x63\xfa\x36\x07\x5b\xd6\x6a\xb2\xc2\xe3\x6f\x07\xa3\x67\xb6\x03\x03\x92\xee\xa9\x99\xff\xfa\x85\x59\x7d\xc7\x25\x77\x8c\xf7\x53\xa2\xae\x77\xa6\xef\x7e\x5c\x92\x95\xe6\xd4\xaf\x30\x5f\xb2\x52\xb8\x78\x91\xca\x02\x7a\xfa\x07\xc4\xc1\xe7\x5b\x6b\x67\x7d\xfc\x4e\x47\xd9\x98\x2c\x47\x71\x34\x9b\xce\x25\xf4\x7e\xbd\x3c\xab\x14\xd6\x99\x54\x2e\x0d\x13\xa4\x5a\x2a\x7e\xa8\x50\x2a\x88\x83\xcf\xb7\x77\xd0\xf0\x36\xd7\x4b\x39\x1e\x07\xd3\x24\x0c\x1d\x8a\x77\x6d\x27\xd7\x85\x49\xdd\x25\x45\x2b\xa5\x33\x8c\x9b\x92\x2a\x54\xf2\x46\xc4\x05\x71\xf0\x7e\xa0\xfc\x64\xd4\x1c\x3e\x5b\xce\xaa\x1c\x34\xc8\x14\x6e\x3c\xdc\x7a\xa9\xa5\x1b\x75\x89\x54\xaa\x2c\xa5\x83\xe9\x36\x8e\xa4\x27\x3a\x22\x2e\x88\xf3\x17\x43\xfb\x67\xf6\xbb\x08\x3d\xaf\xb7\x9f\xb6\x4d\xdc\x5b\x65\x4a\x1e\x49\x8b\x12\x2d\xb4\xfb\x4e\x4b\xde\x69\x66\x0f\x98\xf7\xae\x7b\x33\xd6\x7d\x80\x2e\x40\x00\x38\xe8\x01\x9c\xbf\xef\xc0\x80\xc6\x91\xd3\x24\x20\x23\xf4\x65\x39\x4d\x61\x92\x09\xd7\xb5\x24\x61\x7a\xc3\x41\x52\xb2\xeb\xf3\xb5\x8b\x23\x1e\xd6\xbf\xc8\x7b\x28\xe2\x89\x8d\xa0\xe4\x6c\x10\x07\x97\xc0\x38\x52\x2c\x15\xd1\x77\x07\xef\x76\x94\x43\x93\xa7\xde\xf5\x4f\x2e\x2b\x28\xa5\xa2\x1c\x3d\x3b\xd0\xb4\x3f\x2c\x57\xeb\xfe\xd8\x81\x88\x0b\xe2\xe0\x12\x70\x9a\xc8\xb2\x8b\x28\xa0\x8a\x34\x6a\xc3\x25\xe1\xfe\xbe\x2c\x7e\xf3\x88\xfb\xd9\xba\x00\x5a\x0a\x85\xdb\xb7\xe7\x2f\xae\xff\x37\x6b\x0e\xc4\xc1\xfb\x41\x6b\x82\x40\xa4\x3d\x57\x6b\xa5\xea\x56\x15\x2d\xc6\x88\xfe\xa2\x72\x50\x51\xa3\x0a\x7f\x51\x03\x9a\x71\x69\x1d\x19\x1f\x0a\x94\x35\x07\xe2\xe0\x12\x60\xf2\xf3\x8c\xd1\xbd\x23\x9b\xd4\xed\x35\xb5\x2c\xbd\x7e\x97\xc3\xa8\xe7\x53\xe1\x0d\xe9\x9b\x4e\x01\xfc\x4b\xe9\xd3\xf9\xd3\x44\x08\x09\x80\x38\x84\x04\x9a\xfe\xbe\x03\x03\x1a\xd3\x4f\x93\xc0\x74\x30\x0e\xd1\xab\xf8\xb7\x9c\x5b\x81\x92\x77\x29\x1e\xd2\xe9\xea\x1f\x93\x75\xdc\xf7\x12\x61\xd8\x08\xce\x6e\x3a\x7c\x20\x0e\x3d\x43\x0e\xe2\xe0\x12\x58\x21\xa4\x5d\x96\xb8\x4f\x75\xff\xce\xbe\x2d\x9b\x88\x57\xcc\x77\x41\xac\x0a\x33\xb9\x81\xe7\xe7\xaf\xb6\x5f\x09\x34\xcc\x7c\xf0\x15\x11\x17\xc4\xc1\x25\x90\x93\xb8\xa5\xfe\xf3\x60\x7f\x8d\x81\x2c\x3d\xfd\x43\xf6\xe5\x46\x17\x0a\x16\x51\x5e\xc9\x1f\x6d\xfa\xa4\x4b\x86\xe9\x0f\x77\xd7\x10\x71\x41\x1c\xbc\x1f\x7e\xbe\xb7\xb6\xed\x28\x89\xfe\x89\xe1\x35\xd1\xfe\xda\xa2\x74\xd5\xb9\x0a\xc3\x74\x3b\xed\x62\xe1\x6f\x8e\x59\x0c\xeb\x50\x5b\x28\xc1\x11\xc4\xc1\x25\xf0\xa3\xeb\x53\xed\x82\x81\x60\x72\x93\xfe\x67\x77\xa7\xcb\x81\x63\x3f\xa6\x5c\x35\x4a\xa8\x04\x4b\xbd\xe7\x5b\x68\x08\x39\xfa\xa1\xbc\x7f\x10\x07\xbd\x7b\x01\xd8\x81\x01\x4d\xb0\xa7\x69\x00\xf9\xba\x3e\x7b\xb5\x27\x3a\x06\xa9\xea\x5a\xc2\x4b\x42\xb7\x10\x63\xac\x5a\x8b\xa9\x52\x8e\x47\xcd\xfa\x79\x6d\x4f\xc6\x94\x9e\x23\xda\x0e\xe2\xe0\x1a\x58\x2c\x21\x24\xbf\x7e\x83\x37\xe0\xee\xbd\x8e\x7a\x36\x96\x65\xb6\x8d\xdd\xa3\x51\xfe\x8f\x8f\x24\xbf\x59\xd9\xc8\x6f\xb6\x99\x40\x97\x21\x41\x1c\x5c\x03\x25\xde\x3c\x45\x68\x47\xa1\xf2\x09\xaf\x74\xac\x71\x94\xb5\x3d\xab\xe2\xb7\xdc\x06\x76\x1d\x37\x34\xf0\x6d\xda\x7e\xef\x19\x41\xf9\x6d\x20\x0e\xde\x0f\x8e\x2a\x2c\xa3\xb9\x94\x4f\x5e\xdd\x14\x62\x11\x33\xa0\x0c\xaa\x0c\x2e\x41\xf9\xd8\x42\xf8\x36\xdc\x63\xff\x86\x84\x4c\x75\x18\x03\x22\x2e\x88\x83\x6b\x40\x2c\xf1\x17\xed\x4b\x7f\x6f\x5b\xc9\x88\xc0\x19\x1e\x7f\x31\x01\xd9\x29\x12\xa1\x82\xf0\x76\x8a\x08\x8a\x04\xf9\x01\x3a\x33\x77\x84\x06\x40\x1c\xf4\xfe\x0d\x60\x07\x06\xb4\xda\x39\x4d\x03\x89\xbe\xd1\x91\x54\xea\x5f\x8c\xa4\x93\xc5\x8d\xd5\x3f\xf1\x24\xf9\xfa\x70\x91\x2c\x3d\x90\x79\x21\x2a\xaa\x10\x60\x47\x5f\xe5\x0a\xdd\x55\x01\x70\x70\x0d\x28\xdd\xbe\xc5\x5c\x1c\x11\xa0\xaa\x39\xc1\x81\x31\x39\xe1\x2d\x98\xc8\xde\x41\x34\x74\xeb\x0b\x31\x96\xdc\x5b\xd4\x76\xda\x6b\x4f\x11\x71\x41\x1c\x5c\x03\xbd\x0f\x47\x5f\x86\x4e\xd0\x34\xba\xca\x39\xf0\x0a\x49\x9e\x7f\xba\xea\x31\x1f\xe1\x84\x81\xbe\x55\x37\x77\xd7\x40\xff\xc7\xf6\x3b\x44\x5c\x10\x07\xef\x87\xfb\x9b\xdc\x63\x12\xc7\x4b\x64\x22\xfa\x3d\x53\x23\x2b\xf7\x73\xfa\x1f\x59\x7c\x7e\x5e\x6c\xdb\x69\x42\xf5\xad\xfe\x9d\xfc\xc5\x3c\x44\x5c\x10\x07\xd7\x00\xf5\xa3\x2c\xca\xbe\xc3\x55\xb2\x30\xd1\xeb\x55\x0b\x4b\x9c\xb6\xdf\xe9\x4d\x06\xb5\x79\x06\x8b\x90\xb5\x68\x09\x38\xee\x88\x4e\x21\x34\x00\xe2\xa0\x71\x00\xb4\x03\x03\x58\x7a\x9e\xa6\x81\x6f\x4b\x34\x5c\x04\x2e\x5f\x74\x29\x6d\x8d\xa9\xc5\x7e\x36\xb8\xa9\xdf\xe2\x5b\xa8\x8a\x63\xeb\x35\xe9\x09\xb8\xb9\xa5\x3d\x04\xbd\x01\x06\xe2\xe0\x1a\xd8\xa5\x9b\xf9\x61\xa0\xdb\x89\x31\x90\x68\x49\xaa\xb8\x3b\x56\x50\xb2\x46\xf5\xf4\xf7\xb9\x80\x99\xa8\x2b\xef\x0e\xae\xaf\xa9\x40\xe3\x00\x88\x83\x6b\xc0\xe3\x38\x99\x7f\xaa\x8d\x05\xe7\x2b\xf9\x9d\x4b\x69\x43\xb1\x41\xec\xed\xcf\x5e\xbb\xac\xef\xd0\x1b\x44\xbe\x5e\x51\xc2\x6e\x7d\x89\x88\x0b\xe2\xe0\xfd\xe0\x89\x2b\xa2\x1a\xc3\xfa\x80\xb0\xa1\x5c\x7b\x3c\xdd\x4b\xff\x3b\x93\x45\xcf\x3d\xef\xe0\x26\x8d\xd1\xa9\x6f\x39\x15\x14\x8c\x50\xce\x14\x88\x83\x6b\x20\x25\x9e\x85\xc1\xe7\x5d\xdb\x85\xcb\x85\xa9\xa2\x69\x98\x2e\xe9\xf4\x13\x96\x5f\x96\x08\x2e\x7e\x11\xfc\x76\x6d\x73\x26\x31\x72\x17\xa1\x01\x10\x07\x8d\x03\x80\x1d\x18\x90\x7b\x3f\x7d\x07\x46\xf0\x59\x51\x09\xa5\xb6\x14\x5e\xe9\xed\x1a\x63\xe9\x77\xeb\x78\x44\x2f\x24\x1c\xe2\xab\x18\x98\x12\x54\x5d\xde\xd8\x1b\x7d\x16\x42\xec\x66\x80\xb8\x93\x3b\x30\xb1\xce\x3c\xef\x04\xa2\x05\x8f\x56\xdd\x9b\x57\x1d\xc9\xf4\x55\xe4\x35\xe5\x0b\xa2\xcb\xbe\x47\x61\xba\xeb\xb9\xfb\x74\x73\x25\x20\x22\x83\xb8\x93\x3b\x30\xcb\x3f\x93\xf8\xa4\x12\x1f\xd2\x56\xf4\x3e\x0c\xba\xb5\xe8\x42\x11\x39\x79\x64\xfa\xe5\x31\x95\x3f\xc1\x56\xd8\x6f\x47\x35\xae\x87\x50\xde\x14\x80\xf3\x97\x40\x42\xf9\x67\xe4\xff\xf9\x0d\x24\x7d\x2d\x99\xce\xfe\xac\x96\x8b\x92\xdf\x7a\x3a\x69\xaf\x28\x52\xb6\x27\x3e\x15\xa9\x7d\xd3\x65\x18\xd7\xa7\x1b\x75\xd3\x40\xbe\xf4\xcf\x1d\x98\x1a\x0a\xf7\xe8\xd5\x7b\x36\x73\x6f\x0f\xaf\xe8\x5e\x91\x2f\xbb\xc5\xdf\xf6\x3c\xf6\x23\x32\xf1\xe8\x3d\x99\xb7\x51\x52\x3f\x5e\x2f\xfc\x81\x62\xb4\xa8\x15\x5f\x1d\xfb\x64\x86\x15\xc0\xd7\xeb\xff\x81\x28\xdf\x5b\xc0\xfa\xa6\x99\xb8\x1f\x59\x30\x6b\xb7\xe8\x5a\xf8\x31\x97\xa8\x28\x16\xd6\xbf\x61\x07\xc6\xf7\xdc\xff\xd6\xb4\x00\x54\xa4\x73\xfe\xb7\xe9\x7c\x9f\x84\x8a\xfb\x9e\xd8\x81\x31\x5c\xbf\x47\x25\xe3\xdb\xf7\x82\x12\x73\xe9\xf7\x79\xe3\xc6\xa0\xc9\x50\x0e\x64\xba\xe3\x70\xaa\xe1\x09\xd1\x57\x81\xf1\x7b\x64\x67\xb1\x03\x83\x74\x07\xfe\xab\x0c\xc8\x93\xe1\xa1\x3c\x95\x4f\xd4\x6f\x7d\xfd\x81\x2b\xaf\x61\xce\x8b\xee\xdb\xef\xeb\xf0\x75\x58\x66\xa3\x44\x9d\xf5\xb7\x5e\xf6\x99\x5c\xcf\x38\xb9\x03\xe3\x36\x5a\x2f\x96\x13\xb1\x23\x5c\xa4\xee\x36\xad\x1c\xe9\x35\xc9\xc2\x6b\x65\xb6\x7c\x8c\x4e\x56\x35\x2a\xa9\x5c\x2e\x97\xb2\x71\x26\x97\x51\x34\x4e\xfc\x6c\x9c\x5b\xaf\x50\x8d\x1b\x0a\x0b\xe3\x55\xdf\x0f\x3d\x92\x9f\x85\xe2\xea\xf4\x2d\x4b\x7b\x27\x1c\xb9\x6a\x73\x7f\xd3\xd0\xe2\x9c\x45\xa1\x1d\x09\xdf\x93\x3b\x30\x97\x6b\x0b\x4d\x96\x3d\xef\x5f\xf3\x7b\x2d\x3b\x54\x56\x27\xc9\x63\x71\xd3\x4f\x70\xf5\x19\x5d\xb9\x92\x2e\x92\x79\x40\xd2\xb6\xc5\x99\x6d\x85\x80\x34\x74\xda\xc4\x87\xc4\x8c\x46\x3c\x41\xbd\xf9\x93\xab\xa0\x5c\xb5\xcb\x7a\x1a\x53\x16\x5d\xf6\x2d\xe5\xe0\x92\xd9\x01\x39\xbb\xf3\x46\x5c\x1e\x74\xa9\x1a\xc4\xc1\x27\xbe\x3d\xc3\xcb\x21\xbd\xdf\x3c\x85\x22\x5b\x04\x28\x36\xbf\x0e\x37\x27\x14\x63\xbf\x7f\xb0\x6e\x1f\xe6\xa7\x8d\xc7\x32\xfa\xf5\x16\x54\x0b\x15\xc4\x9d\x28\x2a\x78\x19\xe5\xda\x1d\x5e\xef\x64\xb1\x4f\x6c\x78\xe5\x6d\xca\xb7\x9f\xda\xb1\xe9\xf5\xa9\xb3\x16\x8c\xa2\x7d\x8a\xc2\x6e\x68\x1a\x80\x16\x55\x00\x0e\xde\x0f\x35\xfa\x28\xcc\x22\xbe\x43\x09\x36\x48\x9a\x9f\xf8\x8a\xcd\xe2\xd0\x18\x1d\x2f\x1c\xbf\x0b\x9d\x0c\xc4\x61\xc5\xe9\x73\x66\x80\xcc\x15\x88\xf3\x17\x13\xfd\x67\x22\x7a\xd2\xe7\x4c\x37\xac\x2b\xb5\x37\xee\x79\x0d\x61\xc9\x19\x1d\xeb\x24\x2d\xd3\x54\xe5\xa9\x9a\x7c\x6b\x78\xfc\x8b\x63\x55\xff\x2b\xc2\x07\x83\x38\xe8\x2d\x9a\xbf\x6f\x85\x80\x3e\xe8\xd3\x24\xd0\x8c\xe3\x91\x3a\x98\x84\xad\x3e\x13\xaf\x67\x99\x54\x3d\xdc\x9a\xcc\xd2\x21\xf8\xe9\x5b\x2d\x8e\xc8\xce\x25\x99\x86\x04\x0b\x4b\x44\xd3\x41\x1c\x5c\x02\x95\x97\x6a\xed\x95\xbf\x25\x4b\xb4\x18\xe9\x50\x90\xed\xc8\x8b\xa8\xde\xeb\x72\x23\x7b\x1e\x9b\x8c\xfc\xee\x75\xe5\xd5\xd0\xfa\x7d\x44\x5c\x10\x07\x97\x80\xd4\xee\x13\xd2\x72\x52\x16\xbe\x84\x87\x6e\x6d\xc4\xd8\xa1\x19\x58\x11\xc1\x89\x94\x69\x2c\xb6\x9b\x94\x47\xef\x5e\x7f\x3b\x40\x42\xc4\x05\x71\xf0\x7e\xb0\x40\xb1\xfc\xba\x60\x3c\xa2\xa5\x8a\x61\x6b\xf2\xf3\xc0\x75\x0b\x4f\x58\x6a\xde\xf2\x51\xa4\x78\x4f\x5c\xcb\xaa\xb6\x62\x07\x74\x2f\x0b\xc4\xc1\x25\x40\x76\x99\xcc\x41\x69\x7e\x4d\xce\x83\x38\x27\xe5\xb2\xb8\xaf\xf3\x5d\xa1\x7b\x8f\x62\xb3\x7d\x15\x76\xd0\xfa\x02\x06\xc8\x25\xd2\x11\x12\x00\x71\x50\x39\x96\x3b\x7f\x95\x00\x68\x70\x3d\x4d\x02\x94\x26\x57\x6f\x3d\xee\xd4\x20\xe4\xed\x48\xc1\x94\xb9\xae\xd7\xaa\x3a\x8a\xdc\x69\x9e\xb7\xa5\x2b\x33\x12\x2f\x74\x6e\x86\xdc\x01\xda\x08\x04\x70\x70\x09\x5c\x40\x3b\xae\x29\xa1\x78\xad\x58\xa3\xe3\x73\x5d\x44\xa5\x54\x70\x26\xe5\x92\xb0\x40\xc7\x03\xbf\x1e\x9d\x95\x16\x4e\xf6\x2e\x68\x43\x14\xc4\xc1\x25\x40\xa5\x54\xa8\x8d\x5d\x41\x10\xb0\x7a\xcf\x43\x72\x7c\x9d\x8d\xf9\x9d\x2c\x07\xb1\xf7\xfe\x05\xa5\x5c\x22\x56\x01\x7d\x36\x57\x68\x74\x01\x71\xf0\x7e\xf0\xe5\x5f\xbc\xcb\x26\xdb\xf2\x20\x39\x6b\xf6\x39\x53\x22\xc5\xb0\xb7\x97\xde\x85\xdd\x37\xc9\xb4\xd8\x38\x39\x3a\x49\x8a\x17\xa0\xe7\x58\x40\x1c\x5c\x02\x16\x53\x6c\x5d\xa9\x49\x26\xfd\x5b\xdc\xc9\xc4\x8a\x93\x62\x59\x91\xc4\x5f\x5e\x6c\x0f\x09\x3e\xcc\x95\xea\x7b\x39\x8f\x2a\x44\x84\x58\xfe\x82\x38\xa8\x0c\x03\x60\x2b\x04\x34\xd3\x9d\xa6\x01\x1c\xdf\x74\xb7\xe9\x47\x7a\xc3\x1b\xbc\xe7\x28\xbe\xd4\xf2\x53\x06\xca\xe6\x2a\x62\x7f\x62\xcd\xb9\xfa\xe4\x23\xf2\x73\x29\x11\xe8\x22\x02\x88\x83\x6b\x80\x8c\xae\xce\xce\x59\x07\x67\x54\xae\xde\x39\xea\xde\x8d\xe8\xee\xa3\xe3\x12\x29\x3b\x15\x42\xef\x50\xbe\xd6\x66\x5e\x63\xf7\x65\x44\x5c\x10\x07\xd7\xc0\x3d\x4e\x94\x46\x5b\xe3\x57\x3f\x78\xb4\xe2\x54\x5d\xdc\x3a\x13\xe2\xc6\x74\xd1\x9c\x1a\xba\xef\x5f\x40\x95\x4e\xa4\xae\xe4\x86\x2e\xcf\x80\x38\x78\x3f\x68\x23\x31\x78\x9c\xdb\x39\x62\xee\xb9\x2c\xa1\x85\xcf\x2b\x5e\xf3\x2b\xf4\xed\xa8\x6b\x84\x9f\x8a\x05\x6d\xf7\x8f\xe1\x7d\x32\x68\x18\x00\x71\x70\x0d\xac\xe1\xf2\x92\x45\x72\xb4\xd9\xb4\x7b\xcd\x2e\xd0\x62\x69\xbf\x91\x93\x62\x7d\x42\xc2\x14\xbc\x44\xd0\xf0\x11\x35\xea\x93\x17\x01\x42\x03\x20\x0e\x2a\xc3\xa0\xf1\x77\x0d\x80\x96\x1d\xa7\x69\x20\xaf\xb6\x0b\x43\x15\x8b\xd0\x75\x00\x45\x7a\x9b\x36\xcc\x1d\xa3\xa1\x78\x23\xf5\xfc\x4b\xa2\xd6\xa4\x4e\xea\xf0\xe5\x89\xb1\x48\xa8\x64\x29\x80\x83\x6b\xc0\xec\x32\xa9\xdd\x0d\x41\x5d\x17\x3e\x4f\xca\x1e\xfd\x7b\x97\x51\xa3\x39\x50\x16\x29\x89\x4b\x70\x0f\xae\x33\x9d\x27\x6e\xb1\x84\xb6\x42\x40\x1c\x5c\x03\xcf\x17\xbe\xf8\xd0\x4c\x07\x0c\x7d\x6b\xdc\x7a\x92\x5b\xdb\xe2\x42\x21\xec\xf6\xf9\x27\x3a\x87\xce\x6c\x5c\xc0\x4d\x2e\x17\x4e\x2c\x44\x5c\x10\x07\xef\x87\x48\xa2\x07\xb5\x1f\xdc\x29\x8c\xdc\x2e\x49\xbd\x59\xae\x08\x9d\x8a\xb7\x6e\xf5\x2c\xc9\x3c\xa6\xac\xe1\x44\xa3\x6f\x61\x1c\x87\x5e\xe8\x03\x71\x70\x0d\xe0\x0c\xe7\x6e\xba\xe9\x70\xa4\x62\x3c\xbc\x5b\xa0\xfb\x92\x47\x5b\xc2\xfe\x37\x17\x63\x71\x02\xef\xad\x03\xcc\x60\x93\x6a\x7a\x34\x84\x06\x40\x1c\x34\x0e\xfc\xff\xb6\x42\x10\xd6\x6c\x32\x6f\x86\x51\x6f\xb2\xb1\x48\x52\x74\xbf\xa7\x9f\x8f\x52\x74\xad\x3e\x63\x64\xfe\xfe\xd8\x1b\xf7\x9a\xdb\xf8\x49\x85\xc4\x33\x7f\x5a\x33\x3f\xfe\x30\xf6\xaf\xe6\xe7\xca\xf3\x8a\x3d\x04\xcd\xc3\xae\xf5\xde\xde\xd9\x61\xca\x5d\x97\x0a\xc8\xed\xc0\xc6\xf1\x34\x0c\xa2\xf8\x03\x7d\xda\xa0\x98\x6a\x49\xcb\x75\xc5\xf9\x85\x0b\xf9\x53\x7b\xe5\xdf\x0d\x76\xa2\x68\xc1\x38\x65\x3a\x71\x95\x68\x46\xd4\x9c\xed\x42\xff\x36\x6b\x06\x6a\xda\x1f\xd6\xac\xe9\x84\x35\x0b\xb5\x70\xb7\xd8\xf3\xc7\xf7\xf4\xde\xac\xa2\x45\x3a\x2f\x2c\x39\x68\x38\xad\xc6\x5a\x83\xa5\xe5\x29\x75\xd9\x5a\x5c\xc3\x2d\xf6\x2c\xac\x99\xe8\x09\x6b\x16\xdd\x1b\x74\xbe\xf8\xfc\x93\x37\x66\x37\x94\xfc\x29\x7c\x78\x09\xf0\x95\x99\x3b\xe5\xb4\xf6\x96\x98\x62\x7a\x09\x77\xfa\x1f\x6c\x9e\xc9\xb9\xed\x49\x6b\xa6\x7c\x8f\xeb\x27\xc7\xb0\x1a\xcd\x3c\xb5\xcf\xb0\x5a\xc3\x7b\xdd\x3b\xb2\xaf\xac\xc9\x8e\x34\xef\x51\x4c\x3f\xd3\x48\x38\xaa\x0c\x3e\x93\x53\xea\x93\xd6\xec\xdd\x95\x29\xee\xd9\x1b\xdc\x9f\xcc\x4a\xf5\x24\xca\x08\x51\x1a\xc3\xbf\xe7\xcd\x48\x2c\x37\x56\x2b\x5e\xca\x78\x66\x3a\x58\x72\x7c\x26\xad\x3d\x69\xcd\x2e\x8d\x7c\xa9\x79\xa9\xab\x11\x19\x14\xc4\xc3\x17\x23\xdf\xae\xd3\x47\x80\x76\x91\xe9\x87\x62\x7e\xed\xae\x38\x5d\x6a\xcf\xf1\x19\x5c\x05\xd0\xfd\xdf\x34\x74\xda\x60\x5c\xf7\x5a\x3a\xc3\x6a\xf6\x56\xc7\xcd\xbe\x99\x12\x12\xe5\x26\x4a\x0d\x5c\x1c\xcd\x8c\x2e\xd4\x0d\xbd\x67\xef\x73\x88\x8b\xb3\xa1\x3c\x5a\x10\x07\x1f\x8c\x99\x87\xad\x0f\xdb\xa8\xbf\x53\x7f\x8d\xeb\x7f\x81\x63\xac\x55\x60\xa6\x98\x50\x87\xcd\xd3\x65\xc0\x44\x64\xf6\xe5\x00\xad\xe7\x15\x22\x2e\x88\x3b\x61\xcd\xfa\x49\xda\x52\x5b\x82\xd9\xb3\xfa\x59\x88\x8f\xf1\xb7\x76\x16\x39\x82\x7a\x38\x82\x77\x1f\x88\xbc\xfa\x44\xd9\x36\x40\x2a\x02\x59\x33\x00\x07\xef\x07\x41\xf3\x6d\xc9\x49\xe5\xbc\x94\x08\x8a\x73\x4b\x6c\xf7\x89\xf7\x07\x86\x9c\x9f\x7c\x48\x15\x5a\x91\x6b\x7a\xf5\x71\xe8\xbe\xd6\x11\x22\x2e\x88\xf3\x17\x43\x42\xf9\xc7\x44\x2f\xfe\xc1\xe4\x01\xbf\x68\x43\x2c\xa7\x24\x7d\xda\xd3\x20\x54\xcb\x09\x99\xd5\xee\xe4\xce\xfb\x34\x5e\x6f\x32\x8a\x22\x3d\xfa\xa1\x4b\xe2\x00\x0e\x7a\xa6\xe2\xef\xd6\x0c\xf4\x41\x9f\x26\x81\x67\x24\xa3\xd9\xc9\x34\x1d\x06\xda\x99\x0b\xb6\x9e\xf2\xd6\x95\x66\x1e\xf6\x19\x53\xd9\x8f\x5f\x24\x39\x3d\x6b\x0a\x73\x64\x86\xd2\x73\x41\x1c\x5c\x02\x99\xcd\x52\xa9\x86\x6f\xb9\xce\x0f\x1e\xfa\xef\x79\x51\x54\xd7\x92\x59\x14\x7e\x78\xf2\x36\x95\x73\xb4\xe0\x65\xeb\x5e\x55\x6c\x32\x22\x2e\x88\x83\x4b\xa0\x6e\x9c\xc3\x6d\xc1\xc8\xc9\x0d\x57\x29\x39\x71\xc1\xa4\x1f\x73\x22\x57\x6e\x5a\x72\xbe\xda\xed\x97\x4d\x22\xe7\x8f\xb4\xc9\x4d\x48\xb2\x00\x0e\xde\x0f\xc9\xd7\xef\x2c\xbf\xdf\xb7\xea\xb3\xe1\xf4\x32\x13\x5f\x5a\x92\x2d\xd2\xbd\xf0\xe1\x42\xb9\x40\xd4\x67\x2b\xac\xb9\x94\xcc\x35\x65\x44\x5c\x10\x07\x97\x00\xb6\xfa\xaa\x00\xb1\x93\xf9\xde\xfd\x56\x13\x71\x5e\x9e\xba\x8e\x35\xf2\x69\xe2\x00\x96\x04\xda\x43\x01\xea\xd4\xbb\x51\x56\xc3\x08\x09\x80\x38\xa8\x52\xc3\xdf\xad\x19\x68\x70\x3d\x4d\x02\xe5\x44\x55\x79\x8b\xbe\x4d\x65\xeb\x59\x23\x97\x1e\x33\x8c\xe1\xad\x64\xbc\x39\x2f\x96\xd8\x33\x79\x29\x6b\xe3\xb9\x72\x6c\x86\x09\xa2\xe9\x20\x0e\x2e\x81\x77\x7b\x14\xe1\x17\xbf\x6b\xf2\x78\x68\x21\x35\xb9\xce\xa3\x3a\x59\xfe\x9a\xda\xbd\x51\xf5\x80\x12\xdd\xe8\xb3\x14\x8a\x63\x3f\x35\x94\x7a\x01\xe0\xe0\x12\x60\xe5\x0c\xa1\x92\x49\xc6\xb5\x24\xbe\x2c\x93\x28\xf3\x20\xc7\x25\x90\xbd\xca\xfa\x46\x4b\xbd\xee\x55\x6f\x82\x60\x82\xac\x12\x48\x02\x20\x0e\xde\x0f\x81\x52\xd1\xb5\x3b\xc7\x56\x07\x68\x58\x05\x3c\xa3\x4a\xaf\x0a\x12\x39\xee\xdc\xb7\xc1\x56\x60\x3b\x5a\xdc\x6d\xcd\x0e\x89\x82\x4e\xe9\x40\x1c\x5c\x02\x52\x33\x5f\x3f\x3d\xe7\x7e\x28\x58\xe4\x9b\xf2\xd9\x72\xf4\xae\x2c\xd1\x35\xdd\x1c\x8e\x87\x3d\x58\x25\x53\xd4\xf7\x1b\x2f\xd9\x42\xf7\x83\x41\x1c\x94\xa1\x0d\xb0\x66\xa0\x99\xee\x34\x0d\xf0\xf1\xa0\x0b\x7c\x3e\x6f\xc9\xa4\x2f\xda\xb7\xfa\x78\x49\xd0\xb3\xc0\xdc\x3d\x39\x9f\x99\x5e\xa4\x22\xf7\x11\xaa\x8a\x0a\xb2\x1b\x54\x80\x16\xc0\xc1\x35\x20\x55\xdb\x6a\xf5\x4b\x37\x3c\xf3\x98\x66\x41\xe5\xd3\xe4\xb6\xf3\xb9\x4f\xfa\x98\x34\xc3\x54\xf1\xd8\x78\x23\x3c\xe6\xd2\x9e\xf6\xd0\x4e\x0a\x80\x83\x6b\x80\x59\x92\xaa\x2a\x43\x38\x63\x7f\x21\x0f\xe9\x27\x91\xe7\xb0\x18\xcd\x8f\x1a\xd6\xa1\x31\x6b\x8d\x14\xef\x17\xc7\x43\x5c\x31\x8f\xa0\x19\x06\xc0\x9d\xa8\x58\xa1\xc1\x32\xd6\xd2\xa1\xae\xe8\x33\x7f\x91\x6e\x6c\x90\x2d\x2d\x2c\xf5\x87\x80\x05\xe7\x07\xf4\x3b\x4c\x8e\x11\xdc\x6e\x12\xd0\xab\x1a\x20\x0e\xae\x01\x1d\xff\x75\xaa\x86\xec\x1f\x93\x85\x91\xba\xc4\xb3\xe8\x15\x71\x22\xf3\x59\x35\x1f\x87\x0d\xad\xec\xa2\x56\xdc\xc9\xd2\x6c\x20\x0d\x80\x38\x28\x43\x1b\x60\xcd\x40\xcb\x8e\xd3\x34\xb0\x6d\x6b\xbc\x17\xf9\xe2\x5a\x59\xf6\x45\x2e\xdc\xc8\x78\xb7\x66\xd9\xe1\xf1\xe9\x9b\xfa\x47\x87\x06\xed\xeb\xf5\x3a\x77\x71\xa0\x3c\x19\x10\x07\xd7\x40\x99\xd1\x4a\xf4\x5b\x13\xe2\xdb\x3f\xda\xd5\x91\xf1\x50\x3c\x28\x36\x1e\xa7\x87\xcb\xb9\xd6\x29\xaf\x04\x68\xaf\xf7\xc8\x93\x1e\x42\x79\x48\x00\xee\x44\xa5\xcc\xa7\xb8\x3f\xec\xaf\x4f\x22\x47\x67\x10\xdb\x1b\x91\xcd\x60\xe5\xab\x92\xeb\x8a\x7c\x7f\xf6\x46\x9a\x7b\xff\x4e\x92\x1c\xcb\x20\x54\x29\x13\xc0\xc1\xfb\xe1\x75\xdf\x42\xc1\x2b\xfe\xf6\x52\x5b\x9b\x92\x80\x47\xdf\x73\x17\x2b\x70\xd3\x35\xde\x9d\x5b\xaf\x97\x98\x14\x28\x6c\xf1\xee\x87\xaa\x15\x80\x38\xb8\x06\xde\xf2\xc7\x14\x3e\x6c\x47\x7d\xf1\x5b\x8e\xd0\xce\xaa\x48\xcd\x6a\xfe\xdc\xad\xbe\xb0\xae\x0f\xd2\x3a\x0a\x61\xcd\x68\x7d\x91\xab\x08\x0d\x80\x38\x68\x1c\x00\x59\xb3\xd4\xeb\xb9\xe3\x34\x4a\x82\xcf\xdb\xf1\xb3\x1a\xea\x33\xc4\xa6\x94\xde\x38\xfb\x54\xbb\x0b\x5f\x53\x6a\x27\xc0\x6c\x70\x5d\x7f\xf5\xa7\x35\x63\xe7\x2c\x71\xc0\x7f\x10\x2d\x5d\xf9\x74\xfe\xfb\x41\xb2\x65\xaf\x78\x06\x7e\x49\xd6\x18\xfd\xaf\xa9\x60\x91\xb2\xdd\x85\x56\x8c\x3f\x2d\xfc\x64\x84\xdb\x5b\xd1\xc4\xe3\x56\x76\x24\xd3\x80\x5c\x99\x7c\xae\x0a\x02\xe4\xbe\x31\x96\xd6\xee\x25\x17\xa4\xd5\x27\xe8\x77\xfe\x6d\xd6\x0c\xd4\xb4\x3f\xac\x19\x92\x38\x7c\xfd\x7e\x23\x3b\x0a\x27\x2d\x94\xd6\xdf\xd6\xa4\x8a\x1b\xe3\x7a\xa0\xd7\xb9\x0c\x5a\x9d\x75\xc6\xdf\xee\xc7\x04\x91\x9f\xa8\xbf\xfa\x96\x9c\x85\x35\xf3\x3d\x61\xcd\x88\x1a\x67\x9b\x6a\x91\xb7\x7d\x72\x3b\xdc\xd4\xbc\xcd\x1e\x99\x5b\xfa\xa1\x9a\xa5\x79\xa7\x92\x68\xa8\x1e\x16\x4b\xd1\xcf\x36\x9e\xc9\xf1\x95\xe0\x49\x8f\x74\x58\xea\x25\xfc\xf8\xde\x71\x43\x27\xc9\xf1\x15\x71\x96\xc5\xfb\x63\x3f\xad\xe6\x68\xcd\x84\xa2\x93\xcc\x62\x48\xfa\xa6\xaf\x9d\xc9\xf1\xd5\x49\x6b\x86\x3d\x15\xd5\x55\xdb\xf2\x52\xc6\x27\xc1\x8d\xc5\xef\xd7\xa2\x86\xc2\xbd\x26\x2d\xff\xb1\xc6\xab\xf6\x5a\xcb\xea\xa3\xc4\x21\x67\x72\x4b\x1b\xc9\xfe\xc4\xcf\xd2\xcb\xa5\xf3\x44\x17\x57\x6a\xb5\x30\x54\x6a\x78\xd2\x88\xf5\x5e\x3e\xb7\xe9\xa6\x45\xaf\x2d\x17\x17\x3d\x46\x3a\x3e\x77\x45\xe6\xcc\xac\x19\x48\x43\xa7\x0d\xc6\xb4\x87\x76\x71\xf1\x2c\x24\xd3\x5c\x14\xc7\x24\x52\x5c\x92\x92\x4b\xe6\x12\x3a\x79\xe7\x51\xdf\xe7\x6e\x39\xdc\xad\xf6\x31\x87\xf2\x56\x41\x1c\x7c\x30\xf6\x16\x11\xcb\xe1\x98\xb3\x24\xf1\xc7\x88\xa0\xa5\x7a\x1c\x6a\x7b\x89\x6f\x43\xab\x6f\xd9\x87\x88\x8c\xda\x77\xaa\xd5\x13\xb5\x00\x11\x17\xc4\x9d\x48\xe1\xce\x57\xbd\xe4\xe2\xe4\xab\x97\x10\x46\x99\xe0\x6a\xf4\x6b\x81\x2a\x5b\xc3\xb0\xe1\x95\x49\xdd\x25\xff\xa7\x3f\x73\xaf\xa5\x41\x3e\x02\xc4\xc1\xfb\x21\xf3\x89\x07\x5e\xd1\x6b\x91\xce\x5f\x74\xab\x3b\x8b\x72\xdf\x05\x7f\xde\x4a\x1c\xc8\xa8\xda\xa5\x8b\x7f\xe4\xdf\xc2\x9b\x7d\x04\xf5\x03\x88\xfb\xcf\xa0\xf9\x67\xdc\x1e\x6b\xf3\x7d\x03\xe6\x1f\x83\x5d\x62\x04\x96\xb4\x5a\xf8\x5d\xad\x46\x7e\x61\x19\x59\x41\xa6\xea\x7c\xab\x74\xa1\x83\xcd\x01\x88\x75\x39\x88\x83\x52\xb8\xc5\xff\x5e\xc1\x1e\xf0\x41\x9f\x26\x01\x2b\x69\xb3\xaf\x63\xd1\x73\x5c\xbb\xfd\xfb\xac\x38\x59\x65\x4b\x17\x3a\xcf\xab\xf0\x2d\x10\x09\x8d\x32\xb3\xac\x63\xa2\x19\xf6\x21\x9a\x0e\xe2\xe0\x12\x68\x39\x12\xc9\xf4\xca\xf5\xe3\xab\xa5\x6c\x1e\x65\x31\x57\x2f\xd2\xd7\xad\x24\xf1\x7f\x4e\xe5\x44\x3d\xcb\x8a\xdb\xfa\xfd\x18\xca\xe2\x07\x71\x70\x09\x08\x74\xf4\x92\x72\x8d\x62\x0b\x8c\xd0\xa8\x11\x37\x74\xaf\x38\xaf\x4b\xe7\x66\xb4\x73\xe4\xa3\x2b\x58\x21\x8f\x54\xf6\x4f\x9e\x83\x72\x2c\x01\x1c\xbc\x1f\x7a\x99\x6f\x4c\xa3\xc5\x5b\x30\xfd\x10\x67\x51\xfb\xf0\x4d\x88\x1e\xfb\x02\xc7\xf1\xf8\x8f\x97\xf4\x6a\xe3\x29\xeb\x83\xac\x3e\xd0\xa3\x0b\x20\x0e\x2e\x81\x7b\x57\x42\xa5\x5f\x2a\xfb\x25\xdf\x65\x71\x25\x38\xe8\x37\xde\xe0\xaa\xdf\xbf\xbe\x26\x67\xdc\x79\x87\xc2\xf4\x71\x68\xa9\x3f\x74\x6a\x06\xe2\xa0\x14\xee\xbf\x5b\x33\xd0\xe0\x7a\x9a\x04\x3a\x37\xe8\x8f\xcf\xdd\x41\x56\x25\xe0\x23\x79\x8f\xb2\xcf\x2a\x1b\x3e\x2e\x26\xc4\xa3\x37\xaf\xde\x40\x16\xae\x33\xcc\xa2\x06\x9d\x14\x80\x38\xb8\x04\x3c\x37\xd5\xde\x49\x79\xea\x2d\x63\x38\x2c\xc4\xb3\x23\x87\x1d\x4e\xe9\x21\x87\x61\xe1\xdf\xb4\xbf\xe4\x11\xfa\x40\xf0\x65\x91\x18\x74\x09\x0b\xc0\x9d\x48\xdb\x33\xb1\xd0\xf2\x37\x3e\xf7\x4e\xda\x1b\x97\x9f\x5b\xd3\x57\xd1\x7d\x9a\xa6\x9d\x5d\x49\xe5\x31\xa3\xc7\x45\x67\xcf\x89\xab\xd0\xe5\x2e\x10\x07\xef\x07\xe1\x9e\xcd\x97\x64\xd6\x45\x52\x03\x1b\xba\xb9\x5f\xad\x63\xb6\x9a\xc5\x17\xc8\x58\x48\xd9\xeb\x36\x03\x38\x0d\x1e\x59\x15\x43\x97\xd1\x40\x1c\x5c\x02\x51\x37\x76\xb9\x7e\x5d\x7d\xfe\x2b\xba\x92\xd5\x05\xe5\xee\x54\x0c\xba\x7b\xd0\xd1\x66\x5b\x23\x8f\x7a\xb0\x71\x74\xf6\x93\xe9\x9f\x88\x25\x19\x88\x83\x52\x37\x05\xff\xbe\x2c\x07\xcd\x74\xa7\x69\x60\x74\x7f\xb8\x61\x58\xae\xf4\x2b\xe6\xb5\x5b\x43\xf3\x5d\x8f\x46\x5b\xef\xf1\x6b\xff\xb4\xc1\x96\x4f\xb9\xb1\xa6\x5d\x58\xdb\x77\x11\xd1\x76\x10\x07\xd7\xc0\xb6\x87\x46\x3f\x6f\xd7\xaf\xb9\xcf\xba\x06\x1a\x33\xca\xae\x87\x2e\xe9\x94\x2f\x3c\x64\x87\xb7\xdc\x0d\xbe\x2e\x3e\x42\x7f\xff\x19\x5a\xee\x03\x38\xb8\x06\x76\x7e\xb6\xf2\xfa\x79\xe7\x57\xd6\xd6\x10\xbd\x22\xf3\xd0\xd3\x43\xa6\xff\x8e\xa6\x95\xbb\x14\xfd\xb6\xcd\xab\x41\xf6\xdb\x06\x2d\x22\x2e\x88\x83\xf7\x03\x69\x42\xd4\x94\xfc\x68\x99\x3f\xad\xdf\xdc\xb0\x1e\x5f\xb8\x62\xd9\x47\xa9\x0c\x1b\x3b\xee\xed\xf3\x05\xbe\xa5\x4c\x5a\x19\xd0\x3d\x12\x10\x77\x62\x26\x08\x8f\x4f\x9d\x8c\xd8\x2b\x88\xda\xdd\x6d\xb5\x92\x13\x2f\xac\xcc\x22\x5e\xe0\xe2\x70\x10\xd1\x58\x16\x40\x93\xa7\xfd\x10\x87\xd0\x00\x88\x83\x52\x37\x01\xd6\x0c\xb4\xec\x38\x4d\x03\x17\x94\x9b\x3b\xc7\xde\xc7\x24\xce\x57\x7e\x32\xfb\xa9\xa2\x50\x2d\x5d\x58\x52\x6d\xdf\xe5\x1f\xc7\x65\x19\x22\x4c\x36\x31\x41\x0e\x9d\x72\x03\x38\xb8\x06\x74\x04\xde\xb4\x4c\xea\xb0\x29\xfd\x7e\xe0\x8a\x7f\xa5\x84\x64\x66\xe8\x88\xc2\xd5\x74\x2e\x89\x10\x7b\x2c\xd7\xf7\x62\xd6\x1b\x48\x5b\x20\x0e\xae\x81\x99\xb5\x76\x8a\xb5\xc4\xea\x10\xd5\x9b\x06\x3d\xa2\x34\x12\x56\x1a\xb2\xf9\xcc\xa5\xfa\x61\xd1\xf1\x14\x58\xd2\x0f\x4b\x62\x3e\x22\xe2\x82\x38\x78\x3f\x2c\xb8\x3d\xfe\x3a\xd3\x67\x14\x47\x77\xb3\xb9\x65\x75\x94\xab\x66\x51\xd7\x5e\x2e\x36\x40\x6a\xff\xd7\xdc\xfb\xaa\x6a\xd4\x66\x66\x44\x5c\x10\x07\xd7\x40\xa2\x81\x6b\x93\xa1\x61\xc3\xb7\xfb\xa1\x37\xbf\xd7\x74\x26\xe4\x4c\xfd\x16\x09\xa6\xb9\x75\xb7\xbf\xe5\x65\xba\x96\xc5\x0d\x83\x20\xa8\x90\x22\x80\x83\xc6\x01\x7b\x80\x35\xd3\x7b\x74\x5b\xf2\xb3\x6c\x7b\x3d\x79\x65\x81\x14\xb5\x84\x7d\x09\xbf\x6b\x7d\xbf\xdc\x06\x17\xfb\x55\x6c\x34\x59\x8e\x57\xae\x52\x7f\x5a\x33\x13\x0d\xc5\xaa\x7e\xbc\x4c\xb4\xc7\xf8\x6c\x89\xad\xa4\x3b\x65\x46\x9c\x58\x43\xc5\x77\x6a\x2c\x33\xce\x7f\x7c\xe0\xcd\x25\xcc\xf5\x07\x2a\x27\x21\x79\x8f\x3c\x99\xf8\x7a\xca\xcc\x17\xa1\x06\x6e\x7d\xf4\x2f\x72\x8c\xfa\x07\xcf\xf8\xb9\xeb\xd0\xf4\x9f\xa9\x1b\x90\xd4\xfd\xdb\xac\x19\xa8\x69\x7f\x58\x33\xd1\x13\xd6\x2c\x97\x34\xf5\xc1\x41\x90\x3b\xcd\x22\x83\xd6\xfe\x1b\x0f\x3f\xe2\x01\xb9\x9c\xd8\x5f\x43\xe5\xf7\xf7\xc8\x55\x66\x8f\xdd\x93\x77\xcf\xc2\x9a\x35\x9d\xb0\x66\x42\x16\x1f\xb5\x9b\x17\x93\xe2\xfb\x83\x62\xd8\x35\x2e\x7e\xb5\x2c\xf4\x5e\xca\x91\xdc\x5c\xf5\x92\xd1\x2f\xfe\xb5\x2d\xf2\x43\xf0\x4c\x8e\xaf\x4e\x5a\x33\x0a\x42\xcb\xa9\xa9\xaf\x38\x9b\x99\x1f\x13\x97\x16\x75\x72\x9c\x90\x79\xce\x59\xbc\x1e\x14\xcd\xec\xce\xde\xb4\xd1\x15\xc0\xc4\x3c\x93\xe3\xab\x93\xd6\xac\x90\x0a\x7b\x5f\xf1\x0d\xa5\xe9\xa0\x85\xd9\x46\xe1\x0c\x15\x45\xe0\xef\xb2\xcb\x8d\x41\x11\x58\x8c\xaa\x19\x54\xca\xd7\x82\xcf\xa6\xbc\xf9\x49\x6b\xd6\x22\x25\x2a\x6e\x19\xf6\xc1\xfd\x00\x2b\x81\x29\xbf\x91\xa4\xd2\x42\x7d\xb9\xbc\x20\x03\xc3\x72\x4a\x62\xf0\x9a\x47\x2b\xd9\x19\x54\x4e\xd3\xfd\xdf\x34\x74\xda\x60\xfc\xcb\xd5\x59\xd7\xa2\x82\xe7\x20\xd0\x73\x58\x7c\x0e\xa9\x35\x1e\x4b\x95\xed\xe5\x70\x01\x57\x04\x4f\xcf\x9b\x24\x69\x1b\xbf\x40\xc4\x20\x04\xe2\xe0\x83\xb1\xbe\x95\x3e\x8e\xc6\x98\xb5\x64\x12\x93\x85\xff\x7b\xc7\x74\xdb\x8b\xcf\x13\x02\xb5\xde\xbe\x7c\xd9\x8a\xf5\x54\xa6\xd6\xca\x01\x7a\x21\x17\xc4\xc1\x07\x63\xea\xe7\xdc\x0f\x5e\x62\x15\x34\x9c\xcb\x2c\x75\x9a\x6c\x3b\x2c\xe1\x95\xb0\xdc\xa2\x3b\xf6\xd3\x7c\x9d\x19\x59\x24\xa7\x9b\xc6\x87\x88\x0b\xe2\xe0\x37\xee\xad\xc6\x32\x2e\xde\x17\x46\xf7\xd2\xdc\x94\xad\x64\x48\xd8\x8e\xa2\xf9\x2a\xd7\xe1\x55\xeb\xd1\x7f\x54\x57\xa8\x9f\xe7\xf0\x00\x2a\x9b\x0e\xe2\x4e\x9c\xc6\x2d\x17\x5b\x7e\x37\xa2\xae\x95\xa9\xb6\xfc\xde\x58\xa1\x26\x42\xcf\x72\xb1\x15\xe9\xe5\xbb\x0b\xe8\x9c\xad\xa8\x53\x2a\x0f\xb9\x11\xeb\x72\x10\x07\xe5\x76\xfe\xdd\x9a\x81\x3e\xe8\xd3\x24\x50\xec\x3c\xfe\x13\x5f\x32\x3d\x14\x57\xc9\x47\xe0\xb5\xb0\xec\x63\x9c\xd0\x6b\xb7\x7e\xf8\xbf\xd0\xec\xa5\x7d\xb2\x90\x23\x8d\x09\xe5\x76\x82\x38\xb8\x04\x8e\x33\x9a\x94\x97\xc7\x97\x78\x73\x7b\x15\x2e\x46\x45\xb0\x4e\xda\x5a\x3f\xb5\x0b\x6c\x13\x11\xc3\x6d\xde\x38\x9a\x15\x40\x52\x40\xc4\x05\x71\x70\x09\xfc\x4a\xaa\x4d\xef\x2e\x54\xd1\x99\x1b\xf2\xf2\xcb\x13\x8d\xd0\xc8\x36\xba\xb2\xd5\xf0\xf4\x71\xf6\xa5\x6a\x4c\x6a\x9c\xfd\xfa\x31\x48\xb2\x00\x0e\x2e\x01\x4a\x36\xcc\x8d\xd9\x97\x64\xd1\x53\x15\xa6\x12\xdd\xf2\x34\x44\x66\xa9\x9b\xf8\x2b\xd8\xaf\xa6\xbc\x04\xa4\x48\x4b\x88\xae\xff\xf7\x56\x1f\x80\x3b\xe1\xfa\x1b\x12\x76\xdf\xe7\xe8\xec\xe8\xe3\x12\xac\x7c\x7f\xfb\x5e\xc1\x48\x9a\x86\x82\x88\x8e\x21\x5c\xa1\x20\x9d\xf5\x19\x32\x6e\x2c\x42\x02\x20\x0e\xca\xed\xfc\xbb\x35\x03\x0d\xae\xa7\x49\x60\x26\xbf\xf7\x60\xe8\x89\xc3\x3a\xbf\xf8\x38\x83\x44\xe7\xb7\x02\x99\x47\x71\x55\xbf\xaf\x05\xbd\x7d\xb0\xbc\xa8\xf7\xb3\xcd\x09\xfa\x57\x81\x38\xb8\x04\xb2\x13\x3b\x7d\x47\x49\xd9\x4b\xd7\xf5\x24\x29\x38\x5e\xf2\x7d\x89\x7d\xc6\x5f\x75\x4d\x44\xce\x26\xbd\xdc\xe6\x47\x2d\xbf\x9d\x24\x22\x2e\x88\x83\x4b\x80\x89\x29\xcb\x88\xd2\x2b\x7d\x9e\xbf\x83\xd6\xab\x92\x25\xfe\x12\xce\x20\x81\x68\x83\x2b\xa5\x0d\x8a\xda\x15\x96\xd9\xc2\x18\xc8\x9d\x83\x38\xb8\x04\x44\xcd\x2e\x7a\xfd\x1c\xbc\x92\x43\x46\x3d\xc3\xa7\xbf\x12\x3b\x33\x83\x21\x57\x79\xe4\x6d\x52\x2f\x38\x51\xcf\x10\x11\x94\xe4\x87\x88\x0b\xe2\xe0\xfd\xdb\x16\xa8\xe6\xce\x84\x26\xcf\x1e\x95\xa4\x78\x07\x69\xd3\x52\x87\x5c\x4e\xe3\xe9\xf5\xcc\x1f\xcf\x72\xea\x47\xaa\xc3\xf8\x5f\xac\x40\x6f\x0a\x01\x38\x28\xa7\x0b\x60\xcd\x40\x33\xdd\x69\x1a\x28\xad\xa5\xb6\x74\x3b\xbf\xd4\xda\x27\xc5\x25\x18\x4f\xc9\x7f\x95\x32\x77\xe1\xc2\xa5\x91\xf8\x7c\x1b\xed\xe3\x86\x66\xf7\x0b\xd0\x09\x04\x88\x83\x6b\x40\x36\x6e\xf0\xa8\x4b\x4b\x13\x97\x3d\x63\x49\x3c\x35\x24\x80\xef\x9e\x53\x41\xec\x45\xa1\xf0\x2d\xcc\x85\x28\xed\xe3\x40\xfd\x9f\x88\xb8\x20\x0e\xae\x01\x85\x9b\x68\x63\x41\xde\x1f\x66\x2e\xca\xc4\x0c\x20\x79\x72\x3e\xdb\x71\x44\xda\xe4\xef\x88\xb1\x4f\x48\x8b\x52\x38\xaa\xa8\x82\x3e\x57\x10\x07\xd7\x80\xc8\x9d\x07\xf9\x35\x98\xdf\x36\x52\x8a\x2f\x54\xf5\x56\xf8\xa9\xf6\xf6\x1e\xc6\x5f\xd3\x5e\xa4\xa2\xbd\x7b\xa0\x89\x31\x62\x0f\x1d\x9e\x83\x38\x78\xff\xf6\x64\xb5\xd5\x49\x1d\xe0\x84\xc5\x19\x32\xba\xef\x91\xe6\xb9\xef\x59\x63\xd6\x4b\xd3\x49\xde\xc7\xbf\x7b\xfc\x78\xf2\x93\xf8\x1c\x64\xcd\x00\x1c\x94\xd3\x05\xb0\x66\xa0\x65\xc7\x69\x1a\xb0\xc4\x98\xe5\x70\x18\xf3\xa8\x0e\xa1\x60\x6f\xc3\x2f\xf9\xa0\xe6\xfc\xcc\x59\x5d\xbc\x62\x72\x8c\x63\x25\x33\xeb\x27\x9e\x8b\x1a\xa2\xed\x20\x0e\xae\x81\x58\xcb\xd6\x2e\x5e\xf1\x45\x16\x11\x93\x14\x51\x0e\xbd\xbe\xfd\x76\x35\x55\xff\xe4\x87\x73\x8b\xe7\xef\x3e\x3e\x57\x59\xa5\x09\xbd\x5f\x09\xe2\xe0\x1a\xf8\xcd\xfb\xa9\xf7\x82\x04\x92\x7f\x08\xbd\xa4\x15\xd3\x91\x32\xa5\x02\x7a\xe0\x93\x5d\x5a\xfd\x04\xcf\xe1\x09\xda\xd8\xe6\x16\xe8\x3d\x3c\x10\x07\xd7\x00\xfe\xc1\x27\x89\x61\xa5\x8f\xb3\x07\x37\x7c\x78\xaf\x3f\xfb\x38\xe4\xa1\x26\x9e\xf1\xfc\xe6\xf2\x8d\xc0\x10\xb2\x43\xa2\xe7\x59\xd0\x6e\x25\x88\x83\xf7\x2f\x33\x86\x4e\xfd\xc2\x77\x2e\x5f\x73\x4e\x41\xdd\xa8\x81\xdc\x34\xdb\x2c\xa3\x15\x3f\x35\xe3\x7c\xa3\x6d\xb3\x79\xfa\x97\x1b\x9f\x10\x1a\x00\x71\xd0\x38\x00\xb2\x66\x73\xd1\x3f\x9f\xbe\x68\x36\x14\x62\x4f\x89\xeb\x65\xdf\x5b\xc6\x12\x7c\x5a\x3d\xb2\x5c\xde\xb5\x5f\x80\x52\xf5\x54\x9b\xf4\x9b\xd9\x9f\xd6\x0c\x15\xc5\x19\x53\x2e\x3e\xdf\xa9\x24\x55\xc7\x8e\xfc\x3c\x65\x9c\x85\xce\xe7\xbd\x46\x71\x53\x32\xf2\x5c\xdb\x2a\xaf\x69\x2d\x8e\x3f\x50\xc5\x67\xb3\xfd\x8f\x3d\x03\xb7\x24\x57\x14\xa8\x7a\xa3\x9e\x54\xe8\xe9\x67\x4e\x90\xef\x3c\x0b\x0f\x7c\xd4\xc9\x7f\x44\x63\x95\xf1\x6f\xb3\x66\xa0\xa6\xfd\x99\x6b\x76\xc2\x9a\x5d\xee\xcb\xf3\xc6\xf9\x70\x87\xa2\xea\xcb\x44\xbb\x9b\xcd\x70\x1e\x3d\xca\xcb\x5e\xdc\xee\x75\xd3\x73\x22\x3f\xb0\xf5\x0a\x94\x7e\x9e\x85\x35\x43\x52\x82\xff\xaa\x38\xf7\xd8\x9c\x69\x10\x51\xeb\x67\x8f\x5d\x43\x72\x1c\x27\xb2\x05\xde\x37\xe8\x1d\x72\x62\x78\xde\x2b\x7e\x21\xc2\x93\x47\x5d\x67\x72\x7c\x75\xd2\x9a\x99\x6c\xea\x56\xb4\xfb\x38\x0c\xf5\xb3\x3c\xe3\x29\xad\xf8\x42\x16\xb1\x75\x3d\xae\x4e\xfd\x8a\x7c\xcb\xfa\x65\x8c\xd4\x6f\x1b\x9a\x67\x72\x7c\xa5\x79\xe2\x67\x25\xc9\xed\x18\x32\x1d\x24\x7b\x2e\x8b\x44\xd1\x50\xc5\x53\x77\xf5\xe6\x9d\x93\xe8\x74\x1f\x2a\x4b\xe2\xd5\x18\x65\x60\xcb\xa0\x39\x93\xd6\x9e\xb4\x66\x94\x62\x97\x36\x5b\x34\x98\x8d\xfd\xd3\x84\x7d\x0e\xc4\x0e\x9a\xa4\x53\xaa\xf1\x06\xdb\x98\xd4\xb5\x30\x62\xdb\xb0\x9a\x2b\x6f\x9f\x99\x35\x03\x69\xe8\xd4\x9a\x2b\xe3\xf7\x5f\x3d\x3d\x87\x7f\xf3\x1e\xf2\x2c\x26\xf3\x0a\x7f\x66\xce\xc5\x37\xb5\xe3\x9f\xef\xd3\xcd\xda\x08\x8a\x8a\x62\xa8\x41\x65\x1e\x41\x1c\x7c\x30\xbe\x93\xf3\xf4\x35\xb9\x3b\x92\x4c\x86\x9a\xf8\x93\x2c\x1e\x92\xb4\x28\xa9\x7b\xf2\x4e\xd6\xcc\xef\x9f\xb4\x48\xa8\x44\xe4\x1c\x3e\x80\xca\xe3\x00\x38\xf8\x60\x7c\xab\x1e\xf3\x2d\x6d\x4a\x43\x9f\x91\x19\x0e\x69\x6a\x84\x43\xcd\xe0\xc5\x2d\x24\xff\x8b\x12\x8c\x71\xd7\x1c\x5f\x08\x15\xea\x43\x89\x51\x20\x0e\x3e\x18\xbf\x42\x7d\xaa\x44\xcc\xec\xd9\x24\x3b\x18\x71\xad\x1b\x49\x3c\x3f\xfe\xd9\x71\x2b\x59\x0f\x5d\xae\xfe\x50\x08\xd1\xcd\x2c\x6a\x77\x44\x5c\x10\xf7\x9f\x41\xf3\xcf\xb8\x5e\xcb\x0f\xc2\xd5\xc3\x88\x07\xd3\x0e\xa3\x44\x50\x32\xad\xbb\x04\x6e\x7f\x3e\xbf\xa0\xa5\x5e\xf1\xd4\xff\x2e\xa5\xdb\xae\x3c\x19\x62\x5d\x0e\xe2\xa0\x5c\xb3\xbf\x5b\x33\xd0\x07\x7d\x9a\x04\x3e\x7d\x27\xbe\x3b\x40\xb8\x4f\x66\xcb\xca\xf2\xea\x93\xee\x82\xdb\x4b\x4f\xd9\xee\x7d\x5f\xdb\x07\xcc\x51\x5f\xae\xdf\x1e\x7c\x3a\x8f\x68\x3a\x88\x3b\x71\x93\x69\xff\x03\xf9\x2b\xe3\xe2\x39\x52\xe5\xab\xaf\x12\xfc\x9f\x35\x5a\x2a\x56\x71\x1c\xdc\x71\xd8\x1f\xcd\x49\x32\x70\x3f\x3c\x82\x2a\x28\x82\x38\xb8\x04\x18\x88\xf5\xf3\xf5\xc9\x5b\xae\xed\x16\xdf\x1e\x64\x61\x51\x68\x1f\xd7\xd2\xc9\xa0\xf9\xbd\xdc\xda\x6e\x29\x70\x81\xc8\x46\x0b\x3a\xe0\x04\x71\x70\x09\x54\x8c\xac\x78\xee\x61\x52\x7b\x48\x10\x50\x6a\x51\x4c\x23\xb7\xa8\xca\x0e\xcb\x74\xbd\xd0\x5d\x65\x3d\x5c\xde\x44\xd7\x53\x8a\x46\xc4\x05\x71\x70\x09\xe0\x9a\x57\x97\x10\x4c\xbf\x2d\x43\x65\x7d\x28\xb1\x38\xb2\xeb\xe8\x7c\x63\x8d\xa6\x56\xb1\xbf\x81\x2e\xf9\xee\x75\x06\xca\xf9\x55\x84\x04\x40\x1c\x94\x6b\xa6\xf4\x57\x09\x80\x06\xd7\xd3\x24\x70\x71\x1d\xeb\xd2\x4e\x1d\x32\x01\x9f\xd5\xfa\xf6\xf5\xd1\xb9\x01\xbd\x23\xfc\x1a\x8a\x91\x1a\xe3\xd0\x41\xcf\x2a\x9b\x7b\xd5\xbd\x88\xa6\x83\x38\xb8\x04\xd8\xc7\x47\x18\xe2\xe2\xb8\xd6\x6f\xd9\xa4\xd1\xe5\x7e\x6c\xe6\x34\x69\xdc\x69\x35\xe1\x78\x9e\xa7\xb8\xb0\xaf\x1e\xb2\x26\x03\x15\xbb\x04\x71\x70\x09\x18\x91\xe2\x9a\x08\x17\xac\x27\x52\x5e\xb8\x66\xc2\x96\x30\xfe\xbe\xee\x81\x32\xc1\xf0\x03\xc1\xde\x71\xe7\x59\xa5\xb6\xad\xba\x06\x44\x5c\x10\x07\x97\xc0\xf6\x5a\x4f\xb7\xff\x24\xd2\x23\xd3\x35\x9d\xf4\xd9\xf8\x79\x51\x2e\xbc\x05\x06\x1d\xfb\xc5\x8c\x2b\x63\x79\xcf\x8b\x7f\x3d\xb0\x82\x4e\x78\x00\x1c\x5c\x02\x05\xf8\xb6\xc8\xac\x16\xb7\xb6\x2f\x59\x93\x13\x08\x33\x86\xaa\xce\x11\x51\x76\x2f\x75\x97\x12\xd7\xcc\x37\x89\xbe\x7c\x3b\x04\x2d\xc9\x40\x1c\x94\x63\x02\xb0\x66\xa0\x99\xee\xd4\x72\x1b\x4e\x2f\xc8\x03\x7d\xf2\xcb\x6f\x88\xb4\xcb\xa9\x45\x7c\xae\x35\x26\xb5\xfe\x11\x55\x56\xfe\xae\xb1\xfe\x03\x9e\x56\x7d\x20\xf4\xf2\x1a\x88\x83\x6b\x80\x52\xd9\xa7\x70\x40\x85\x3a\xe0\xa2\xf9\x03\x4d\xae\x9b\xc3\xbf\x71\xdd\x24\xfd\x53\x48\x02\xed\x96\x4c\x91\x7b\x04\xbf\xf3\x25\x40\x3b\x1e\x00\x0e\xae\x81\x5a\xd5\xe6\xb2\x6c\xba\x6b\x62\x8f\xb8\x5f\xec\x69\x4f\x5c\xa3\x2f\xe5\xe4\xfd\x10\x5b\x23\xe1\x75\x65\xcf\x8f\x71\x70\x28\x0c\x7a\x72\x06\xc4\xc1\x35\xf0\xfe\x06\x79\xd6\x8e\xa6\x15\xc3\xb1\xe1\x96\xb1\x2a\xc1\x61\xc6\x2a\xf6\x8f\x2b\x5b\x2b\x93\xd7\xb4\xda\x65\x05\x95\x4a\x3e\x40\x33\x01\x88\x83\x6b\xc0\x48\x65\xd0\xc3\x6d\xf2\x28\xba\x55\x33\x22\xa7\xc0\xb5\x4f\x97\x59\x6b\x9b\x02\xc3\x3b\x3f\xc2\xb3\xd6\x67\x45\x0e\xdb\xf6\x3a\x42\x03\x20\x0e\xca\x35\xd3\xfc\xbb\x06\x40\xcb\x8e\xd3\x34\x10\x73\xd3\x34\x91\x49\xc0\xa1\xa7\xfb\x69\x9a\x2a\xae\x27\xb3\x09\xff\x02\x4a\x7a\x72\x1e\x72\xfd\xde\x93\xd9\x6d\xc1\xe9\xc1\x30\x44\xdb\x41\x1c\x5c\x03\x41\x1d\xe6\xec\xee\x77\xf2\x6e\xcd\xe9\x27\x15\xb3\x10\xe7\xad\x28\x97\xed\x36\x74\x33\xf4\xbb\xbc\x8d\xf4\xc5\x0d\xd6\x10\x84\xe2\x82\x38\xb8\x06\xda\xf1\x30\x73\x1c\xcf\xbf\xa2\x2b\x76\x68\xac\x33\xc6\x39\x5f\x3d\xcf\xfb\x59\x8d\xe3\x6a\x6b\x17\xbe\x3c\x23\xed\xc6\x4a\x0e\xf4\x5e\x24\x88\x83\x6b\xa0\x54\xd7\x01\x43\x14\x3b\x7a\xb8\x4a\xf9\x1e\x52\x1f\x53\xf2\xf9\x8c\x6b\xa4\xaa\x24\x2d\x8f\xb1\x38\x5e\x3f\xb2\xa8\x64\x89\x81\xca\xee\x80\x38\xb8\x06\x58\x38\xa2\x62\x02\x8c\x35\xeb\xf5\xf8\x0d\xa4\x67\x72\x48\xc2\x22\x3f\x1f\xed\x78\xe5\xa4\x46\x68\x5c\x7d\xb8\x2b\x3b\x1e\xe3\x87\xd0\x00\x88\x83\xc6\x81\xff\x9f\x35\xd3\xfb\xdf\x2c\xd4\xe9\x25\x57\x9e\xd6\x8c\x3c\x96\x7b\x35\x7a\xc5\x0c\xd9\x24\x0a\x5b\x86\xe9\x3c\x2e\xe7\x4b\xcb\x19\x36\xc1\xa3\xdb\xcf\xe4\x9b\xda\xe4\x03\xf2\x10\xe5\x4b\x40\xdc\xc9\x92\x2b\x4c\x92\xfb\xcb\x6d\x4b\xdf\xc7\x6f\x3d\xe7\x0a\x90\xeb\x47\x55\x91\x7b\x1a\x54\x39\x1c\xf7\x79\x77\x34\xbd\xe8\x56\x7c\xe1\xd0\x07\x44\x64\x10\x77\xb2\xe4\xca\x81\xde\xf1\x3b\xf4\x40\xf1\x8c\x41\x63\x62\x7d\xed\xc5\x89\xc6\x02\xaf\xa9\xb0\xdd\xfc\xcf\x04\x04\xbd\x62\x91\xed\xdf\x1e\x12\x21\x22\x83\x38\x7f\x09\x24\xa4\x7f\x6a\xc1\xad\x3c\x43\xfc\x6d\x3c\x8a\xd8\xb2\xf0\x05\x03\xf5\x22\x7e\xbc\x5f\xda\x84\x93\xb2\x66\xf1\x37\xbb\x03\x76\xa5\xbf\xe5\x5d\xf8\x0a\x95\x5c\xc1\x71\x27\x0d\x21\x5f\xf7\xc8\xea\xeb\x52\x49\x98\x15\x9e\x6d\xaf\x9c\xdf\x5d\xb1\xd3\xd7\xa9\x72\x14\xfe\xf2\x64\x51\xa6\x3f\xed\x4f\x1b\x7c\xf0\xfe\xcb\xb6\xd3\x47\x19\x23\x32\xd6\x5e\x1d\x53\x17\xfe\x9b\xc1\xcf\xba\x90\xec\x39\x43\xbb\x77\x31\xc3\x03\x56\x7e\xb2\x2a\xfe\x81\x7e\xe9\xb3\xaa\x2e\x48\x2a\x67\x0f\xb6\x25\xe5\x7c\x1a\xd9\xe3\x43\x1a\x35\x3d\x3f\x11\x82\xf2\x0e\x69\xab\xd5\x69\x24\xc8\xed\xf2\xbf\xcd\x06\x83\x9a\xf6\x67\x5e\xdf\x09\x1b\x3c\x85\xde\xc5\x1f\x2c\x35\x24\x12\x8a\xfe\x88\xa9\x97\x2e\xe3\xdb\x81\x6c\x7b\x10\x4d\xe5\x93\xef\xcd\x6a\x82\x77\x39\x1a\x55\x29\xcf\xc2\x06\x8b\x9e\xb0\xc1\xe3\xa4\x4e\x9e\x63\x1f\x99\x2b\xf9\x59\x2c\x2b\xb6\xac\x74\x3e\x3c\xe0\x08\x30\xd0\x12\x6b\x4a\xbe\x74\x9e\x27\x9d\x0a\xbd\x97\xf7\x4c\x8e\x0a\x4f\xda\x60\x41\xe4\x91\xf4\x9a\xab\x35\x62\xb5\xce\xec\xe9\xcb\x3d\x07\x91\x19\x91\x81\xd8\x13\x99\x89\x3a\x75\xcf\xaa\x32\x9f\xde\xec\xba\x78\x26\x47\x85\x27\x6d\xb0\x1d\x63\x99\x03\x23\xfa\xc1\x0b\x77\xe4\xdc\xb9\x05\x17\x59\x3a\x15\x5a\xcd\x5c\xd2\x24\x73\xda\x08\x36\x76\x53\x0a\x1d\x71\xf3\x33\x69\xed\x49\x1b\xdc\x11\x1f\x22\xa6\xea\x95\xf0\x35\x0c\x77\x61\xf7\xc5\xe5\x6d\x53\x5d\xf1\xf7\xb8\x3f\xbd\xca\xa3\xb3\xef\x58\x58\x2e\x1c\x9f\x6f\x38\x33\x1b\x0c\xd2\xd0\x69\x13\x5f\x8d\x24\x55\x07\xba\x87\xf7\x4c\x01\x37\xee\x5c\xb1\x30\x0b\xf9\x04\x06\x99\xa6\xd1\x30\x9f\xed\xc3\x40\xe6\xe2\x20\x8c\x2d\x68\x4f\x1e\xc4\xc1\x27\x3e\xf5\x67\x36\x8b\x65\x97\x98\xbc\xe3\x47\x6a\x6d\xe8\x2b\xad\x5e\x96\xff\x3e\x66\x1d\x68\x6d\x55\x5b\x54\x6f\x0a\x0e\x5c\x7a\xbb\x04\xdd\xb8\x07\x70\xf0\x89\x8f\x97\xc7\x8e\xa5\x27\x12\x49\xf5\x47\x0c\x13\xcb\x05\xaf\x77\x29\x58\x5c\xe6\xdb\x8d\x37\xcf\xbd\x71\xed\xa8\xdb\x66\x63\x61\x4c\x44\xc4\x05\x71\xf0\x89\x4f\x9f\x1a\x65\x4c\xb1\x13\xe9\xb6\xfa\x6c\xc2\x27\xde\x3c\xdd\x5f\x0c\xb3\xfe\xb2\x55\xd8\xb2\x6e\x8d\x9c\x6f\xc7\x75\x0a\xda\xbb\xa0\x13\x55\x00\xe7\x2f\x86\x84\xfc\x8f\x6b\x28\x8b\xbb\x56\x0c\x4b\x94\x68\x6a\x96\x05\xe1\xc2\x3c\x92\xc5\xc4\x28\xa3\x83\x6e\x5f\x36\x30\x2e\x18\x0d\xfa\x0d\x3c\x98\x36\x46\x78\x20\x10\x07\xe5\xf5\xfd\xdd\x06\x83\x3e\xe8\xd3\x24\x80\x32\x23\x47\x51\x25\x63\x14\xc6\x7b\x58\x56\x87\x5a\xd5\x18\xe8\x8a\x45\xce\xdc\x93\x82\xc7\x86\x33\x94\xc5\xc4\x44\xca\x73\x09\xd1\x74\x10\x07\x97\xc0\xdb\xde\xd7\x32\x6d\x63\xc7\xf9\x6c\x8e\xd2\xaf\xb5\x63\x9d\x05\x12\x35\x3c\x46\x5f\xb7\xe5\x31\x5c\x0e\x15\xcc\x8c\xe1\x11\x85\x1e\x7d\x00\x71\x70\x09\x6c\x88\x2a\x1a\x5c\x48\xb9\x9a\x2e\x6c\xa1\x55\xef\x77\xe7\xfd\xc7\x47\x78\x22\x2a\x4c\x97\xc2\xcc\x7b\xde\x30\x06\x50\xdd\x8a\x81\xaa\xcf\x82\x38\xb8\x04\xac\x1b\xd0\x44\xd2\x18\xb5\xa8\xa7\xec\xdd\x0e\x1f\x49\xef\x78\xca\x95\x07\xfe\xb6\xbd\x2c\xd5\x51\xf7\xe4\x5b\x5f\x72\xdd\x08\x74\x63\x08\xc4\xc1\x25\x20\x85\xad\xf3\xf5\x0d\xe3\x45\x13\x99\x04\xd6\xbd\x37\x6c\x4b\x78\x06\x69\xcc\x16\xe5\xec\xf6\xb9\x6c\x8a\x18\x0f\xc7\x0e\xaf\x7a\x20\x24\x00\xe2\xa0\xbc\xbe\xbf\xdb\x60\xd0\xe0\x7a\x6a\x76\x6f\xa9\xf5\x0d\xfb\x4d\xa2\x2f\xb7\xfb\x9f\xc5\x54\x45\x2a\x35\xe2\x8c\xcf\x98\x39\x90\x70\x45\x25\xbd\x3c\x54\xf0\xd2\x9e\x85\x4e\x12\x41\x1c\x5c\x02\x75\x2a\x87\x3a\x83\x0f\xbd\xf4\x7c\x46\x37\x37\x4a\x27\xe2\x75\x2f\x1a\x0e\x68\xf8\xdc\x71\x89\x1a\x29\xb9\x9d\xdb\x44\x1c\xda\x08\xc5\x05\x70\x70\x09\xb0\xf8\x07\xbe\x9a\xd9\x7d\x1d\xf6\xe9\x1e\xa1\xed\xf0\xb6\xc2\xd5\x94\xce\xf0\xd6\x8f\x03\x38\xaa\xb1\x73\x31\xe7\xca\x7b\xcc\x1c\x11\x71\x41\x1c\x5c\x02\x44\x77\x31\xb2\x8d\xaf\xd3\x4d\x5e\x64\x7c\x45\x28\x84\xe3\xc4\xbc\x53\x14\xf7\x48\x75\xf8\x47\xc5\x92\x05\xaf\x61\x83\xbd\x07\x74\xd9\x15\xc4\xc1\x25\x80\x4a\x6d\x6d\x7b\x5d\x35\x9c\x22\x45\x00\xb7\xdd\xe7\x45\xc7\x57\xc3\xc1\x5f\x6a\x74\xc2\xe7\xe9\xb3\x66\xbc\x19\x34\x25\xf9\xab\x10\xcb\x5f\x10\x07\xe5\xf3\x00\x6c\x30\x68\xa6\x3b\x4d\x03\x3a\x97\x37\x1a\x56\x0f\x27\xce\xf1\x55\x12\xd1\x27\x36\xfb\x60\x4e\x05\x4f\xbe\xb4\xa6\x14\xb1\x6b\x9e\x6a\x76\xa7\xf3\x45\x87\x9e\x01\x03\x71\x70\x0d\xa0\x38\xe2\x57\xf8\xe9\xb4\x2c\x8a\x7f\x63\x08\x9f\x71\xf1\x6d\xe5\xda\xbe\x25\x67\x1b\x75\xc3\xc3\xf7\x1b\x5e\xa1\xad\x8c\xfb\x07\x68\x78\x01\x70\x70\x0d\xb0\xe5\xbe\x35\xe7\x91\x37\x7e\xe4\x38\xa1\xfd\xd5\x0f\x33\xe3\xd2\x8c\xa2\xe0\x56\xda\x80\x5b\xe6\x7b\x2c\x29\x3d\xd9\x16\xa9\x9b\x88\xb8\x20\x0e\xae\x01\x74\x7f\x9f\x87\x37\x09\x9d\x29\xe3\x5a\x76\x77\x26\x29\xc8\x24\x1f\xf1\x97\x94\xda\xd7\xcb\x0d\x9d\xb3\x70\xbd\x1a\xc7\xef\x80\x81\x88\x0b\xe2\xe0\x1a\x68\xe4\xbd\x39\xfc\xeb\xb0\xba\x5c\x82\x12\x87\xc9\xd2\xcc\xf4\x49\x26\xd6\x7e\x4f\x81\x14\x0f\xd9\x55\x1c\xf2\xcd\x62\x5e\x7c\x07\x84\x06\x40\x1c\x94\xd7\x07\xb0\xc1\xa0\x65\xc7\x69\x1a\x38\x57\x9a\x8a\xd3\x27\x3d\x57\x4d\x6d\xcc\x3c\xc6\x6e\xea\x1d\x72\xf5\xeb\x7e\xb0\x6a\x18\xbe\xa0\x65\xc8\xf4\x3b\xe5\x21\x57\x28\x1b\x1f\xc4\xc1\x35\x40\xf4\x1a\x55\x60\x36\x30\x95\xb9\x68\xce\xab\xb8\xdb\x47\xf3\x49\xfe\xa5\x88\xc3\x1c\x1e\x02\x5a\x77\xf5\xee\xec\x31\x81\x6a\x14\xe8\xbb\x02\x70\x27\x2e\x10\x97\x2e\xba\x6d\x4a\xec\x5d\x1a\x5d\x73\x37\x37\x69\x1c\xbc\x12\x5e\x5f\x86\x99\x72\xe7\x55\x8e\x34\xc7\xfc\x81\x6e\x5c\x39\x54\xce\x07\xc4\xc1\x35\x30\x94\xeb\x39\x26\xb2\x68\xf3\x4a\xe1\x5a\x87\x8d\xb0\x0b\x3d\x15\x26\xfe\x93\x2d\x25\xfb\x57\x25\x2a\x6d\x15\xf4\x2d\x56\xe8\x8a\x88\xb8\x20\x0e\xae\x01\x7a\x7a\x15\x13\x2b\x35\x79\xe7\xb5\x73\x85\xdc\xc9\xc9\x8e\x94\x8d\x92\xbb\x36\xc4\xdd\x74\x36\xc2\x9f\x1f\x7e\xb4\x70\x2e\xc0\x46\x68\x00\xc4\x41\xe3\x00\xc0\x06\x83\x2c\xd4\xe9\x36\xb8\x42\x6e\x60\xfc\xd1\x95\x7b\x69\xc3\x2f\xd3\xd4\xbe\x31\x2b\x60\x53\xe4\x32\x8b\xec\x94\xf4\x1c\x9d\x77\x24\x30\x64\x11\x66\x12\x43\x58\x4a\x10\x77\xd2\x06\x67\x90\xea\xdf\x9a\xbf\x96\x5b\x13\x97\xbe\x4c\xe7\x95\x2f\xe1\x21\x7c\x30\x1d\xa6\xf9\x88\xbe\x42\xe9\x0d\xde\x8e\x77\xa2\xf2\x23\x44\x64\x10\x77\xd2\x06\x7f\x43\xcf\xc5\x56\xfc\xb5\x8d\xe7\x97\x5d\xf0\xb0\x94\x38\xaa\xa4\xdb\x83\x0c\xe9\x1c\xd9\xc3\x24\x39\xcb\x1b\x4d\x0c\x97\x72\xbe\x23\x22\x83\xb8\xff\xd8\x60\xfc\x7f\x44\xd6\xc5\xfd\xa2\x39\x75\xe4\xa0\x69\xbf\x2c\xf2\x11\x2b\xe4\x7b\x4c\xda\x40\xb3\x83\x5b\x5a\x23\x97\x93\x6c\x32\x8e\x9d\x4b\xe6\x4d\xc8\x06\xa3\x68\x58\x66\xe6\xfe\xaa\xc7\x68\xbf\x98\xea\x3c\xab\xcd\x75\x37\x3a\x27\x02\x8f\xcb\x1c\xa3\x48\x65\xed\x2e\xfe\x61\xa3\x91\xf6\x9f\x36\xd8\xb4\x92\x2f\x9f\x32\x59\x28\x31\x75\xba\x70\xe0\xc3\x84\xb6\x80\x6d\x33\x13\x36\x51\x6c\x10\x46\xe6\xb7\xc6\xda\xa4\x50\x92\xad\x3f\x50\x6d\x9a\x27\xe3\xb3\x3a\x2c\x01\x94\x86\x81\xee\xc8\x68\xc7\xfa\x25\xad\xa9\x24\x36\x15\x05\x41\xc6\xba\x61\x69\xfd\xac\xcb\x66\xff\x36\x1b\x0c\x6a\xda\x9f\x39\x94\x12\x70\xaf\x74\x44\x27\xce\x48\x59\x20\xcd\x65\x6f\x17\xe3\x59\xb3\xe5\x37\xf9\xea\xed\xaa\x6a\xd8\x3c\xb6\x53\xb2\xd6\x40\x9e\x89\xd0\xc4\x99\x5c\xd4\xf5\x3d\x61\x83\xe7\xbb\x71\xe9\x35\x24\x96\x6c\x46\xc9\x5c\x1b\xde\xa0\x36\xaf\xbd\xfa\xb4\x3d\x4a\x7f\x1c\x58\x80\x55\x93\x13\x81\x6e\x31\xfa\xf0\x4c\x8e\x65\x85\x4e\x18\xc3\x61\x1e\x07\x32\x76\x7c\x7d\x89\x5c\x3a\x4b\xd2\xf4\x12\xf2\xc0\x85\x4c\x9e\x03\x81\xd7\x5f\x24\xdd\x07\x6e\x9a\xf1\x50\xac\x31\x9e\xc9\xb1\xec\x49\x1b\x1c\x86\xf6\xd2\x43\x8c\xce\xdf\x3f\xd5\xe8\x7a\x69\x4f\x4a\x34\xbb\xc6\x1b\xe7\x21\x23\x34\x0c\x92\xec\x4b\xcd\x9e\xae\x42\x24\x73\x67\xd2\x5a\x87\x13\x3f\x7b\xb0\x10\x26\x69\x95\x59\x72\xf8\x75\x4d\xa2\x72\x52\x27\x28\xa8\xbe\xfd\x8a\xfb\xc8\xf0\x8f\xb7\xec\x8b\xc9\xad\x1e\x79\xf2\x67\x50\xcc\x47\xf7\x7f\xd3\xd0\x69\x13\x1f\xae\x92\x2b\x5e\xcc\xe0\x79\xcc\xf4\x24\xcd\x9d\x98\x0e\xfc\xa3\xa1\x99\x08\xbd\xd8\xdb\x8a\x58\x76\x89\x54\x28\xe6\x23\x04\xd0\x55\x17\x10\x07\x9f\xf8\x9e\x13\x2a\x89\x63\x2c\xd9\xa7\x3c\x35\x4f\xd7\xd5\x8c\xb3\xbf\x7f\xe3\x01\x4b\x47\x25\x6b\x88\x79\x8e\xe6\x54\xa9\x3a\xdf\x15\xa8\x58\x02\x88\x83\x4f\x7c\x9f\xd6\xcd\x8e\x9f\x93\xde\xd3\x22\xd9\xe5\x5d\x70\xe1\xee\xbc\xe6\x47\x88\xe6\xe8\x41\x27\x99\xf3\xa5\x6f\xec\x6e\x63\xab\x6b\x1a\x74\x74\x09\xe0\xe0\x13\x9f\x00\xd9\x6b\xf1\xd7\x4c\xec\x19\xa1\x3e\xba\xe6\x79\xbd\x68\xf3\x97\x05\x58\x58\xa2\x36\x19\xd9\x4d\x36\x68\x15\x3c\xe5\x17\xfc\xa1\xc4\x3c\x00\xe7\x2f\x86\x84\xff\x67\x5c\xdf\x0b\xd5\xac\xf1\xb8\x93\x3b\xb7\xbf\x61\xbd\x36\x7e\xcb\xc4\xf8\xb5\xe6\xfe\xb2\x68\x1a\xc7\xa4\x2d\xfd\x5a\x59\xf5\x9e\xf2\x36\xc2\x03\x81\x38\x28\x87\x52\xe2\xaf\x6b\x1f\xd0\x07\x7d\x9a\x04\xb8\xd0\x03\x24\x66\x56\x91\xba\x91\x4d\xbc\xfc\x0a\x1b\xa5\xc3\x3a\x52\x5b\x06\xc2\x6c\x6e\xf4\x6a\x69\xce\x04\xfc\x10\x2a\x86\xba\x14\xc4\xc1\x25\x60\x77\x7d\x90\x91\x97\x58\xd5\xaf\xc7\x75\xba\x4a\xf4\xca\xb1\x86\x6f\xa8\xa4\x51\x73\xb5\xc3\xec\xee\x5d\xa9\xd4\xa1\x47\xe8\xd0\x5b\xa5\x20\x0e\x2e\x81\x9e\x7d\xd1\xc7\x03\x8a\xd1\x89\xf1\x69\xb1\x45\x8a\x36\xcc\x4d\x5f\xaa\x75\x53\x37\xd9\x97\x6a\xc2\x2e\x3c\x17\xef\x9e\x94\x17\x46\xc4\x05\x71\x70\x09\x20\x61\xdc\x7c\xeb\x20\x78\xf4\xde\xda\xbe\xde\x52\x2b\xfa\xf0\x65\x5d\xfb\x11\x32\x6b\x8f\xa1\xaf\xd2\xb0\x2b\xeb\xf3\x54\x7a\xe8\x62\x04\x88\x83\x4b\x80\xf9\x59\x54\xe4\x9e\x90\x45\xa5\xd9\x74\xb4\xf1\x33\x8c\xc7\x89\x18\x06\x0b\x34\x9c\x3f\xec\xdd\x45\x88\x13\x06\xf0\xf1\x34\xbe\x21\x24\x00\xe2\xa0\x1c\xca\xbf\xdb\x60\xd0\xe0\x7a\x9a\x04\xd0\x8b\xf2\x56\x1d\x45\x3f\x4a\x2b\x4c\x7c\xef\x38\x6e\x43\x89\x0c\x66\x35\xda\x74\xbf\xd0\xcb\x63\xbe\x2c\x76\xe3\xf8\xa7\xd0\x36\xb4\xf4\x07\x70\x70\x09\x44\x87\x05\xfe\x28\x0a\x65\xa7\x18\x0e\xbf\xde\xff\xec\x15\x76\x23\xff\x6e\xfb\x55\x2a\xa5\xd6\xa0\xf1\xce\x9a\x92\x6b\x85\xb2\xd0\x23\x09\x20\x0e\x2e\x01\xe5\x10\x83\xac\xa7\x9e\xad\x4c\x76\x44\x44\xfa\xec\x6d\xb3\x87\xcc\x55\xdb\xd9\x03\x57\x1d\x96\x24\x9b\xac\xd0\x4b\x29\xaa\xa1\x0b\x01\x20\x0e\x2e\x01\x5d\x6c\x91\x98\x2c\x9c\x85\xfd\x47\x98\x43\xe7\x4b\xf1\x33\xac\x4c\x68\x59\xb9\xdf\x07\x8d\x5e\x49\x35\xf0\x27\x6a\x61\x71\xf0\x40\xc4\x05\x71\x70\x09\xf8\x73\x5f\xfd\x3d\x2f\xc3\x40\x7d\x60\x4a\x76\xf9\xdb\x02\x9f\x80\x71\x29\x63\x10\x37\x1b\xb7\x27\xdd\xf4\x5b\xe4\xf3\xca\xcc\x23\x88\xe5\x2f\x88\x83\x72\xa7\x84\xfe\x6e\x81\x40\x33\xdd\xa9\x4f\xa0\x2e\xd3\xcf\x75\x0b\x50\x37\x50\x58\x3f\xe3\x55\xf6\x66\x44\xe2\xca\x2b\xed\x38\x32\x10\x66\x5c\xf8\x14\x5b\x61\xb6\xb1\x06\xe5\x8f\x82\xb8\x13\x29\x1b\x0f\x12\x03\x34\xbf\x7a\x94\xba\x94\x11\x9b\xba\x88\xde\x58\x59\x7a\x3c\x7a\xdb\xa7\xf0\x36\x9b\x37\xa7\x97\xa4\x80\x88\xe0\x7f\x53\x36\x00\xdc\x89\xaa\x93\x18\xf8\x1f\xba\xed\x06\xe7\xda\xe6\x66\xbe\xdd\xe8\xf9\x5e\xca\xc4\x27\xa4\xff\x20\x4f\x71\xfe\xe5\xfd\xc9\x6e\xba\xd6\x11\x68\xe3\x12\xc4\xc1\x35\xa0\x4a\xfe\xa0\xee\x87\x29\x4e\x46\xff\x15\x6d\x52\x95\xee\x83\xeb\x18\x15\xbf\x09\xfb\x62\xf5\x7c\x0f\x65\xd4\x34\x0c\xae\x68\x48\x21\xe2\x82\x38\xb8\x06\x42\xd3\x6e\x39\xb9\xed\x3d\x79\xbe\x5c\xd8\xe8\xc4\x6d\xa7\xea\x26\x17\x16\xa8\xd4\x9e\x5e\x9b\x82\xf6\xde\xa4\xff\x5a\x51\xd9\x28\x42\x03\x20\x0e\xca\xa1\x04\xd8\x60\xd0\xb2\xe3\x34\x0d\x50\xaf\x9b\x5e\x9f\x39\x9f\xec\xbd\x3e\xf8\x66\x0b\xa5\x8f\x98\x28\x8a\x43\x29\x2f\x39\xd8\x48\xbf\x20\x7c\x0c\xe9\xe3\x13\xaa\x4c\x28\x0d\x06\xc0\xc1\x35\x20\xf0\x15\x55\x5b\xf9\x16\x6b\x57\x04\x11\x3f\x6a\x65\xe3\xc0\x76\x81\xb7\xaf\x70\x6c\xc2\xd6\x91\xee\x97\xa4\x37\x97\x70\xdf\x42\x8f\x31\x81\x38\xb8\x06\xd0\x24\x46\x5b\x16\xef\xe3\xce\x55\x1d\x4c\xd1\x84\x08\xbe\xe6\x6c\xb3\x5b\xf5\x94\xdf\x59\x5c\x2c\xef\xbb\xf4\xeb\x97\x8b\x23\x3d\x22\x2e\x88\x3b\xa1\x81\x88\xd1\xf1\xde\x9b\x61\x92\xf4\x64\x92\x1d\x6f\x2a\x14\xc7\x8f\x68\x09\xac\x7d\xe4\xa7\x0c\x35\x0a\xf2\xdd\xde\xc8\xfd\x62\x87\x34\x00\xe0\xe0\x1a\x40\x43\x91\x44\xad\xbd\x50\xf0\x3b\x3f\xd7\xbe\x26\x76\xac\x6b\xe9\x7c\x06\x9d\x16\x0f\xe6\x5b\xdb\x0d\x4e\xda\xa4\xb5\xbb\x99\xc2\x08\x0d\x80\x38\x68\x1c\x70\xf8\xbb\x0d\x06\x59\xa8\xd3\x6d\x30\xea\xf7\xa5\x17\x06\xc8\x7e\x16\x1f\xd0\x87\x37\x22\x86\x71\x6a\x07\xaf\x27\x2b\x67\xa1\x54\x72\x52\x25\xb2\x39\xcc\x24\x1f\x22\x23\x2c\x25\x88\x3b\x69\x83\x3f\xde\xc8\x31\xbf\x1f\x5d\xbf\x52\x17\x34\xa7\xb9\xaf\x40\xf2\xd0\x69\x4e\xd7\x70\xcc\x6b\xb6\x6d\x85\x95\xe1\xd3\xa7\xf3\x13\xef\x11\x91\x41\xdc\x49\x1b\xdc\x68\x70\xd4\x15\x72\x2f\x96\x01\xd3\x3a\xfa\xc2\xed\x11\xe7\x72\xce\xfe\xb1\x3e\xa4\x6f\xdb\x42\x11\xa4\x2d\xde\x06\x8a\x52\x04\x88\xc8\x20\xee\x3f\x36\xf8\x9f\xd5\x62\xdd\xa9\x0b\x9f\x2b\x8d\x1d\x68\x33\xf8\x7b\x4b\x6e\xe4\xc8\xb2\x9b\x76\x93\x20\xd9\xb5\x8f\xe7\xbd\xd1\xfe\xed\x51\x79\x95\xca\x1c\xb2\xc1\x6e\xf2\x07\x8b\x4b\x0f\x5b\xda\x25\xe3\x06\x73\x1b\x03\x9f\x5e\xf0\x31\xba\x3c\xdf\x43\x70\x63\xba\xdc\xc4\xf0\xdc\xd8\x80\x8a\xf7\x9f\x36\xb8\xc1\xf0\xf7\xd7\x42\x71\x12\x6f\x6a\xf1\x14\x56\xfd\x77\x38\xc8\x6a\x82\x5f\x56\xea\x18\x16\x54\xf4\x57\x66\x27\x6f\xbd\x29\x5f\xfc\x03\x95\xd7\x1e\xc7\x5f\x56\xe3\xeb\x56\x40\xfb\x25\xef\x33\xe5\x89\xe3\x5e\xe2\xa1\xf2\x38\xd3\x62\x2f\x74\xdb\x8b\x6d\x81\x58\x98\xe7\xdf\x66\x83\x41\x4d\xfb\x33\x5f\xf5\x84\x0d\x6e\x94\xdb\x65\x96\xbb\x78\x3b\xd9\xa8\x8f\x61\xa6\x2c\x34\x84\xe7\x7b\x99\xed\xe2\xca\x42\x78\x5a\x25\x3b\x31\x61\x91\x7e\x6f\xd1\x59\xd8\xe0\xa6\x13\x36\x58\x2f\x28\x67\xf8\xe5\x68\xd1\x63\x1c\x3b\x7d\xeb\x6b\x6e\x13\x9c\xec\xdc\x15\xf6\x85\xc4\x6f\x1c\xf0\x79\x93\x3c\x35\xb6\xf2\x3d\xcf\xe4\x58\xf6\xa4\x0d\x2e\x1b\x65\xdc\xcd\x48\x10\x1d\x25\xfa\x54\xbb\xc2\x6c\x65\x65\xd8\xc5\x4f\x70\x91\xe2\xd1\xf5\x32\x74\xa3\xab\x12\x4c\x93\x29\x67\x72\x3b\xb9\xe9\xa4\x0d\x26\x6e\x21\x1a\xb6\x89\x5e\x65\x79\xeb\xa9\xc2\x78\x5b\xb8\xd1\x95\x5a\x5e\x2d\x3b\x06\x9d\x84\xb2\xce\x0d\x09\x93\xc7\x33\x2c\xea\x4c\x5a\x7b\xd2\x06\x5f\xfa\x7a\xbb\xc2\x7c\x81\xea\xe8\xd6\xc7\x69\x16\x03\x52\x43\x33\xd1\x6b\xc1\x2e\xdc\x5b\x47\x6d\x4a\x8d\x9f\x5d\x63\x6c\x9b\xb9\xce\xcc\x06\x83\x34\x74\xda\xc4\x97\x9d\xcf\x97\xe7\xbf\x91\xd4\x2b\x3e\xec\xe9\xed\x25\x5f\x8d\x55\x94\x69\x87\xd6\xa9\x4c\xf8\x99\x04\xbb\x2c\xa6\x9a\x7e\x0a\xca\x50\x01\x71\xf0\x89\xcf\x8d\x7f\xbc\xe5\x47\xb5\xfc\xfb\xeb\xef\x63\xd6\x28\x57\x7f\xb9\xc9\xce\xbc\x32\x21\xbf\xd9\xdd\xd1\xdb\x35\x18\xbd\xec\x18\xe6\x8c\x88\x0b\xe2\xe0\x13\x5f\x1e\xd2\x10\xe9\xb5\x05\xc3\x98\x64\xf3\xf8\x88\xdb\x22\x7b\x04\xdc\xd6\x6d\x82\x91\xaf\xb1\xf2\x9f\xf3\x68\x98\x28\xf9\xb7\xe9\x40\x25\xc2\x01\x9c\xbf\x18\xc6\x3f\xfe\xde\x09\xf6\x21\x22\x01\x22\x97\xd1\x24\x27\x91\x72\x95\x24\xe3\x20\x9c\xf7\x0e\xf9\x6a\x9e\xab\x3e\x6e\xb7\x87\xcc\x15\x6e\xc7\xe2\x23\xe2\x82\x38\xf8\x9b\xe2\x57\x3e\x48\x2e\x65\x5c\xb8\xfd\x79\xa8\xd7\x0b\x6d\x5c\x80\xbd\x50\xf1\xf3\xa7\x62\xa2\xd8\xdd\xf2\xfc\x24\x4d\x5c\xfc\xd7\x8c\x7c\x08\x0f\x04\xe2\xa0\x7c\xd5\xbf\xdb\x60\xd0\x07\x7d\x9a\x04\x88\x38\xa7\xda\x5d\x94\x97\x23\xbb\x5f\x95\x2f\xb2\x7d\x0e\xf7\xae\x77\x72\x16\x47\x1e\x75\x40\xfd\xf0\x19\xdb\x1c\x85\xea\x00\x3a\x5d\x05\x71\x27\x3c\x50\xba\x00\x4e\xf7\x60\x69\x96\xaa\x10\xba\x9f\x7e\xe7\x12\x72\x2a\x06\xf7\x3e\xae\xd0\x2b\xd3\x6b\xec\x44\x8e\xa3\x28\x41\xd0\x2d\x4b\x10\x07\x97\x00\x7b\xb5\x62\x9f\xdd\x4d\xc7\xba\x78\x01\xc9\x73\x0a\xc5\x12\xfe\x78\x12\x5d\xc1\xae\x0a\xbf\x09\x23\x54\x2c\x7b\xf3\x12\x30\xbe\x40\x37\x6d\x01\x1c\x5c\x02\x09\xbc\x43\x32\x95\x29\xb4\x84\x38\x54\x91\xe7\x15\x96\xfd\x1a\xb6\x08\xa6\x58\x5e\xb8\x3a\x3c\xa9\x2d\x9b\x73\xce\x31\xe2\x81\x92\x94\x40\x1c\x5c\x02\xa5\x6e\xd9\x16\x9d\x3b\xad\x87\x04\xf1\xf7\x6f\x92\x52\xb9\x5b\x26\x6e\x2d\x69\x1d\xeb\x1e\xff\x38\xf4\x1b\xb8\x6c\xeb\xd7\x4f\x89\x90\x00\x88\x83\xf2\x55\xff\x6e\x83\x41\x83\xeb\xa9\xef\x50\xd2\x4b\x28\x32\x72\x17\x7c\x4f\x7c\x49\xe2\x92\xf4\x98\xfa\xc5\xa8\xe6\xad\x10\x73\xe7\xfb\xe8\x91\x4f\xa2\xa9\xd7\x09\xf6\xa1\xc2\xfb\x20\x0e\x2e\x01\x1f\x62\xbb\x0d\xe3\x61\x67\xfc\xb7\xc8\x37\x13\x70\x5f\x7f\xb3\xf4\xfb\xb1\xf5\x99\x42\x32\xaa\x63\xbc\xe6\x38\x6e\xc9\x74\x1d\xba\x14\x0d\xe2\xe0\x12\x58\x08\x79\x9d\x45\x62\x87\x3a\xfb\x80\x87\xb0\x3b\xf9\xa8\x8f\xca\x2a\x24\x79\x4f\xf0\x82\x7c\x13\xe7\xc7\x54\x8b\x14\xdb\x35\xe8\xdd\x4c\x10\x07\x97\xc0\xad\x47\x8b\x53\x18\x37\xb7\xfd\x9a\x65\xfd\x1e\x0f\xd4\x7d\xd1\xf2\xb4\x60\xe4\x3e\xfa\x4d\x6e\x27\x40\x13\x37\x48\x73\x19\x09\xb2\xc1\x20\x0e\x2e\x01\x19\x4a\x97\xe2\x9f\x3b\xc8\xaa\x02\x47\x6b\x23\xb1\x73\x78\xeb\x58\x98\xd7\x58\x0d\xe3\xbd\xc5\x1e\x90\xd2\x28\xae\x65\xb3\x2a\x22\x96\xbf\x20\x0e\xca\x53\x03\xd8\x60\xd0\x4c\x77\x9a\x06\xc8\x1d\x30\x3e\xed\x55\x0b\xcf\xe3\x21\x4b\xbb\x66\x6a\x3c\xcf\xc6\xca\x27\xc1\x4a\x0d\x78\x4f\x1a\x8b\x87\x16\x73\x8c\x7b\x6e\x0e\xd1\x76\x10\x07\xd7\x40\x01\x47\x36\x95\x93\x19\x95\x51\x09\xd6\x01\x63\x12\x3f\xb5\x00\x9d\xf2\x42\xae\x20\xc6\x41\x64\x44\x4a\xaf\xf3\x3a\xa6\x5e\x0b\x22\x2e\x88\x83\x6b\xc0\x86\xdf\x78\xdd\x99\x8c\x26\x40\xf0\xbb\x71\xbd\xb0\xe8\x6d\xed\xaf\x7d\x64\x6f\x96\xbd\xb4\x84\x69\x75\x0c\x2b\x7f\x5f\xe9\x85\x76\xef\x40\x1c\x5c\x03\xd2\xe1\xe6\x6e\xaf\xfd\xe8\xbe\x7c\x2c\xb7\x4e\xc7\xa8\x71\xa6\x95\xa1\x7f\xd2\x79\x70\xbd\xd7\xe0\xa3\x68\x29\xe6\x4a\xec\xb7\x69\x44\x5c\x10\x07\xd7\x00\x37\xa3\x06\xd2\xea\x33\xec\xeb\xb7\xcd\x9c\x66\xb9\x13\x7e\x70\xa8\xa7\x9b\x29\xdc\x6a\xef\x4b\x5e\x62\x0e\xfd\xfe\x59\x7a\xcc\x09\xa1\x01\x10\x07\xe5\xab\x02\x6c\x30\x68\xd9\x71\x9a\x06\x4a\x4c\xee\xa5\x06\xff\x18\x52\x18\xea\x8d\x79\x4a\x7c\xe3\x51\xe5\xf8\x14\x8e\x7f\x93\x90\x65\xc1\x88\xbb\xc1\xf0\x15\x35\x1b\x52\x44\xdb\x41\x1c\x5c\x03\x84\x5e\x26\xac\x06\x4f\x8d\x1e\xea\x1a\x5a\xdc\x23\x4a\x12\x61\x7a\xc7\xb8\x7d\xc1\x59\x33\x4f\x36\x9e\xdc\xbf\x3d\xb3\xc6\x06\xaa\xf6\x0c\xe2\xe0\x1a\x70\x49\x4f\xd2\x61\x6a\xc8\x42\x51\xba\x11\x88\xa9\xfd\xd3\x3e\xdf\x12\x5b\xe8\xd9\xa6\x94\x92\xfe\xfd\x9e\xab\x51\x4d\xe7\x87\x72\x11\x71\x41\x1c\x5c\x03\x25\xe5\x2a\x9c\xea\x43\xa6\x1f\x84\x70\x34\x83\xcf\xd5\xcc\x49\x99\xf9\x69\x0e\x9c\x3f\x9f\x22\x81\x46\x2c\xea\xad\x9c\x7f\xbc\x05\xf5\x03\x80\x83\x6b\xa0\xed\xb0\x4b\xf7\x0e\xea\xdb\x15\x6d\x89\x26\xb9\x0a\x76\x94\x85\x69\xc2\x23\x7d\xac\x30\x35\x9d\x40\x81\x6b\xe7\x1f\x3a\x69\x62\x40\x79\xeb\x00\x0e\x1a\x07\x00\x36\x18\x64\xa1\x4e\xb7\xc1\x26\xf7\x9c\x9f\xf2\xe8\x49\x45\x36\xca\xeb\x57\x77\xb7\xc5\x94\x17\xdf\xb9\x31\xd5\x54\x3f\xfc\xb6\xa5\x24\xd3\x1e\x45\x8f\xb6\x0b\x61\x29\x41\xdc\x49\x1b\xdc\xa8\x4f\xda\x1b\x9f\x41\x71\xe7\x59\xea\x6c\xf0\x88\x52\xc6\x35\xbf\x2e\xff\x25\xaa\xb7\x1c\xf8\x9c\x02\xbc\x4f\x31\xcf\x49\x41\xa7\xc1\x20\xee\xa4\x0d\xe6\x6a\x55\xa4\x96\x68\xc4\xa5\x33\x0f\xaa\xd6\x4b\xdd\xba\xd9\xbf\x59\x6c\xa0\x8e\xdf\x29\xea\x82\xfa\x96\xac\x95\xdf\x71\xbb\x13\x11\x19\xc4\xfd\xc7\x06\xff\xf3\x04\x3f\xd0\x17\xdf\xef\xf1\x97\x8a\x4f\xdd\x11\x6c\x94\xc5\xfc\xe1\x91\x91\x5e\xa5\x33\xbb\x1f\xf8\x0e\xb6\xf4\x56\xbd\xac\x14\xdd\xc2\x21\x1b\xcc\xc5\x97\xc6\xd1\x7c\x25\x07\xdf\x56\xeb\xaa\xad\x48\x9c\xef\xc4\x5d\x07\x01\xef\x0d\xae\xbe\x59\xd7\x2a\xad\x86\xc7\xa2\x86\x14\x7f\xda\xe0\x70\xea\x8c\x20\x83\x68\x41\xcb\x08\x9c\x45\xec\xd7\x35\xb1\xe9\xa2\x3f\x5f\x7f\xba\x7f\x78\xbb\x06\x95\x30\xbc\xc2\x50\xcf\xe0\xe0\x0f\x94\x92\xa6\x34\xab\xab\x26\x3a\x71\x47\x9a\x50\xb4\x03\x65\xce\x6a\x77\xbb\x2e\xaa\x6b\x7d\xee\x55\x3c\x7a\xe1\xbd\xfe\x9d\xf5\x6b\xff\x16\x1b\xfc\xf8\xdc\xff\xd6\xb4\x3f\x73\x83\x4f\xd8\xe0\xf3\xcf\xbf\x8d\xbf\x29\xa3\x2c\xf8\xba\x70\xcf\x5f\x5a\x57\x54\xac\xdf\x71\xdc\x2b\xea\x0a\xde\xfd\x1b\x3e\x81\x55\xee\xd7\xc5\xcf\xa4\xa4\x10\x12\xcf\x09\x8b\xb6\x1e\xe5\xe5\x8e\xa1\xab\xa7\x80\x66\xd6\x1e\x3e\x3c\x54\xc1\xd1\x7a\x9b\xb8\xea\xea\xed\xd7\x1a\xaa\x87\xeb\xc3\xd3\x62\x3c\x3f\xce\xe4\x5c\xf6\xa4\x0f\x0e\xd0\xe9\x5a\xfa\x92\xe4\xff\x5d\x9b\xf8\xcd\x15\x87\x7d\x9d\x8e\xac\xea\xe0\x8e\xb9\xc1\x8c\xa2\x0e\x8e\xa0\xa6\x51\x72\x43\xa6\x33\x69\xad\xd6\xc9\xcb\xd8\x9f\xe3\xb1\xf7\xcc\xf0\xb0\x08\x08\x17\x35\x6c\x93\x79\x4a\x95\x04\x83\x5f\x57\x97\xaa\xb5\x36\x79\x9a\x3c\x8c\x10\xb7\x92\x3d\x93\xd6\x9e\xf4\xc1\x48\xd1\xef\xef\xaa\xa1\x77\x36\x8a\x47\xa4\xb4\x91\xec\xd2\xd7\x47\x28\xdb\x38\x2b\x5b\xe7\xd6\x97\x18\x7d\x71\x47\x1e\x75\x27\x3f\x33\x1f\x0c\x12\xd1\x69\x33\x1f\x31\x79\x3b\x17\x05\x7d\x7b\x54\x03\xa3\x1d\x63\xa6\x8c\xb3\xe6\x37\xa4\xb6\x42\x7d\x05\x53\xf3\xf6\xab\x28\x37\xb6\x76\x73\xa1\x17\xc8\x41\x1c\x7c\xe6\x1b\xdd\x89\x99\x35\x17\x21\xd3\x0d\x1e\x8d\x75\x5b\x62\x6c\x70\x11\xd2\x26\x17\xee\xe6\x67\xe8\x0a\x45\x65\x1a\xe3\x95\x7d\x0c\x1d\x04\x81\xb8\x13\xcf\x8f\x85\xf4\x20\x7f\x2d\xc0\x33\x7e\x5d\xcb\x9a\x4b\x18\xbf\xcc\x63\xa8\x3d\x7d\xab\x97\xee\x12\xe9\x75\xd9\x73\x9c\x6c\x87\xb1\xe1\x88\xb8\x20\x0e\x3e\xf3\xcd\x38\x33\x55\xdd\xf6\xe7\x7a\xe2\xea\xe3\x9b\xb3\x91\x8a\xfa\x58\x8e\xee\xba\x58\xb8\xdc\x76\xc4\xce\x27\x06\x8d\x85\x7b\xb6\x32\x50\xe5\x1a\x00\xe7\x2f\xf6\xcf\x3b\x35\x92\xf5\x8e\x62\xd7\x4a\xce\x6d\xdd\xb3\x26\x5f\xb9\x53\xbf\x28\xc5\x7d\x7d\xe8\x7d\xc9\x44\xfc\x9a\xeb\x87\xef\x4a\xdc\x15\xdc\x29\x08\x13\x04\xe2\xa0\xe4\xe0\xbf\xfb\x60\xd0\x07\x7d\x9a\x04\x32\x69\x22\x15\x4a\x5e\x56\x71\xce\x3b\x53\xba\x92\x91\xf7\x0a\x8f\xf9\x55\xc8\x9b\xa5\xe7\xd2\xda\x54\xed\x9b\xbf\xb8\x4f\x10\x02\x55\x13\x06\x70\x70\x09\xf0\x70\x59\x30\x78\xd7\x45\xb8\x49\x59\x5c\xbb\xe6\xd1\xf5\xa0\x34\x35\xd6\x9c\xdb\x28\x96\x30\x9f\xee\x01\xa3\x36\xd2\x96\x53\x1b\x22\x2e\x88\x83\x4b\xe0\x5c\xd3\xcf\x29\x1a\x2a\x74\x17\x76\x97\x0b\xa9\xbd\x3b\xc2\xc1\xe5\xe7\x86\xa8\xa4\x52\x6f\xb9\xc5\x08\xd6\x19\xbe\xd9\x72\xbb\x07\x5d\xdd\x03\x70\x70\x09\x34\xf2\x30\xc4\x18\x0e\x98\xad\xa6\x1b\xb8\x65\xb2\xbf\x3f\xec\x13\xfa\x6c\x79\x6f\xf5\x3b\x52\x3a\xbf\x04\x37\xfe\x64\xbf\x2d\x24\x2d\x10\x07\x97\x80\xc2\x07\x3e\xcb\x76\x72\x13\xce\xef\x47\xb4\x59\x8c\xc1\x71\x5b\x24\x7e\x3f\xaa\xa7\x1a\x3e\xf5\x07\xed\x31\xd0\xb9\xc8\x5b\xd9\x20\x16\x3f\x20\x0e\xca\x0a\xe4\xf9\xfb\x02\x18\x34\xba\x9e\x9a\x19\x2a\xd7\x5b\x89\x1e\x58\xf2\xbc\x71\xac\x38\xd0\xd2\x05\x03\x7b\x42\xf9\x06\x6a\x24\xff\x23\x63\xda\x40\xc9\xce\xba\xd2\xd8\x37\x50\x66\x28\x80\x83\x6b\x80\x00\x15\xed\x63\xc7\x71\x1b\xed\xd0\xc3\xde\x5b\x55\x1d\x51\x57\xee\xc8\xf8\x3d\x29\x79\x57\x83\x8b\x35\xb8\x58\x68\x90\x45\x06\x3d\xc4\x0e\xe2\xe0\x1a\x50\x2c\x77\xc6\x5a\xde\x90\x0c\x25\x6f\xcf\xf6\x34\x79\x8b\xbe\x23\x22\xed\x16\x4f\xa9\x75\x74\x61\x82\x1a\xc5\xd1\xaa\x20\x11\xca\x0a\x04\x71\x70\x0d\x34\xdd\x08\x19\xf7\x2f\x30\xf9\x45\x5a\x85\x3d\xb0\x33\x21\xa3\xed\xc8\x21\xdd\x43\xb4\x7e\x49\x36\x86\x9a\x96\xc8\x55\x6c\xf6\x3d\x22\x2e\x88\x83\x6b\x40\x7c\x49\x86\xda\xf1\x87\xc7\xa8\x0a\xc7\xeb\x84\xe9\xa5\xdb\x21\xd6\xf2\x3d\x73\x31\x2f\x1f\xfa\xd1\xfb\x52\x71\xe8\x55\x75\x91\x21\x34\x00\xe2\xa0\xac\x40\x80\x11\x06\x4d\x75\xa7\x69\xc0\xd4\xad\xe2\xcb\x15\x1c\xc1\xcb\x0a\x2a\x4d\x3a\x0a\x6e\xad\xa1\x4c\x0f\xf3\x84\xef\xc8\x4b\x06\xab\xe3\xe1\x37\x45\x09\x37\x44\x21\xda\x0e\xe2\xe0\x1a\x68\x3d\x5c\xdc\x28\x9c\xff\x3c\xf1\x1e\x47\x0c\xd5\x28\x5d\x90\xe6\xae\x68\x8a\x3d\xea\x4f\xb6\xcc\xcd\x4f\xd2\xef\x30\x72\xe7\xa0\xeb\xcb\x20\x0e\xae\x81\x88\xad\x3b\x5b\x9d\x5e\xa5\x05\xd6\x78\x59\x93\x4e\x3e\xc6\x75\x57\xa9\x42\x92\x99\xeb\xed\x5b\x98\x47\x22\xe9\x82\x84\x79\xa0\xfa\x6d\x20\x0e\xae\x81\xd7\x4b\x82\xf3\x64\xad\xb1\xef\x5a\x19\x30\x5c\x1d\x77\xae\x66\x37\x4d\x05\xae\xd6\x30\x13\xe6\x3c\x7d\x7f\xbe\x9a\xb0\xe8\x11\x54\x53\x17\xc4\xc1\x35\xa0\x3d\xbf\xe9\xe0\xec\x93\x29\x4a\xef\x95\x36\x4b\x8f\x55\x10\x23\x3c\xc9\xef\xf0\x05\xe7\xa8\x41\xdb\x92\xde\xc5\x0e\x8f\x1a\x1f\xa1\x01\x10\x07\x8d\x03\x5a\x7f\xd7\x00\x68\xdd\x71\x9a\x06\x1a\x9e\x57\x2f\x3b\x30\x55\x28\x24\x68\x6b\x7f\xfa\xd8\x5d\x27\x62\x4f\xa8\xea\x5e\xd2\xa7\xf2\xc2\xa2\x0e\xef\x96\x5e\x9a\x02\x54\xd3\x03\xc4\xc1\x35\x40\x4c\x11\x91\xd1\xd4\x1e\xf4\x62\x3c\x9d\x82\xd2\xb2\x30\xe4\x97\xf8\x62\xea\x9e\x59\x0b\x12\x9f\xce\xef\xa3\x0b\xcb\xab\xc2\x15\xd0\x32\x03\xc0\xc1\x35\x30\x50\x8b\x37\x1a\x66\xdb\xc9\x8b\x1d\x98\x71\x39\x36\xa1\xf1\x48\xa8\xc0\x51\x25\xa0\xeb\x07\xd2\x98\xcf\xe3\xe8\x89\x02\xa3\x7a\x44\x5c\x10\x07\xd7\xc0\xb4\xe8\xcc\xe7\x07\x97\xb6\xde\x3f\xea\x13\x3f\x32\xd0\x78\x82\xdc\xae\x64\x22\xff\xc1\x4c\x37\xc8\xed\x99\x4b\x33\x06\x7b\x1e\x74\x87\x01\xc4\xc1\x35\xf0\xe3\xa6\x42\x51\xb7\x2c\xf1\xac\xf8\x6c\xe2\xfc\x4c\x2b\xe6\x3a\xc6\x07\xcb\x9d\xec\xd6\x58\x2a\x6f\xfa\x2f\xb9\xc9\x0d\xef\x1b\x10\x1a\x00\x71\xd0\x38\x00\x30\xc2\x20\x13\x75\xba\x11\x56\x5b\xbf\x17\x97\x98\x24\x6b\x52\xf5\x4d\x3a\x29\x3c\x81\x03\xd5\x65\x6b\xe8\xdd\xcb\x0d\x7d\x99\xb5\x9b\x1f\x05\x22\x44\x67\xd9\x10\xa6\x12\xc4\x9d\x34\xc2\xbd\xbf\x67\xd5\x3c\xd1\x36\x05\x86\x09\x42\x17\x7e\x08\x87\xc8\x29\x8d\x61\x58\xcb\xdd\x5e\x9a\xb9\x6c\xc8\xc5\x7a\x57\x81\xdf\x12\x11\x19\xc4\x9d\x34\xc2\x5d\xc5\x06\xbb\xb5\x45\xa8\x9d\xfb\xed\xf5\xee\xf7\x31\x7b\xa8\x66\x9d\x8a\xf8\x0c\xef\xca\x14\x1a\xdf\x2a\xda\x71\x71\x62\xb2\x46\x44\x06\x71\xff\x67\x84\xd1\xfe\x71\x86\x9f\x44\x98\xbd\x3e\x3c\x4b\xc4\xb6\xc7\xe7\x7a\xf8\x53\xbf\xca\x07\xf7\xa6\x80\x01\x2d\xde\xf0\x86\xe6\xd6\x8d\x6d\x89\x76\x5a\xc8\x08\xa7\x11\x3b\x31\xa9\xaa\x49\x3e\x30\xc6\x15\x38\xa7\xfe\xa5\x4f\x49\x9e\xf2\x17\x21\xc5\x9d\x7d\x4c\x61\xe7\x90\xf3\x9e\xfc\xcd\xe8\x7f\x1a\xe1\xec\x8d\x37\x22\x12\xd1\x84\xbf\x94\x54\x74\xa5\x30\x8b\x93\x0c\x5e\x8f\xb9\xd2\x5f\xf1\x5a\x78\x31\xd8\x34\x72\xe4\x99\xe3\xf9\xa7\xf3\xca\x65\x9e\xdf\x53\xcc\xf6\x7f\xb7\xed\x14\x76\x11\xed\x33\x37\x52\xb6\x2a\x0d\xc5\xcc\x55\xd9\x2d\xcc\x7d\xbe\x0e\xf2\xbc\x24\xc6\x7f\x9b\x11\x06\x35\xed\xcf\xec\xe0\x13\x46\x18\x43\x4b\x2d\x92\xa1\x9f\x9f\x9d\x8a\xc9\x42\xe6\xf2\x0d\x52\x2c\x6e\x15\x3c\xef\xce\x1a\x6c\xb3\xb7\x64\x05\x11\x2f\xe2\x8a\xea\xcf\xe4\xac\xf2\xa4\x11\xb6\x9e\xbb\x99\x83\x53\x89\xfe\xc9\x6e\x7e\x86\x93\x2d\xf5\xf0\xf1\x73\x74\x23\xfb\xf5\x0b\x8c\x2a\xd6\xf6\x19\xc7\xba\x53\xd6\x79\x67\x72\x32\x7b\xd2\x08\x33\x28\x9b\x91\x1d\xca\x60\xdf\xc0\xe2\xc6\x9c\x36\x0a\xde\x3c\x6f\x58\x7e\x8e\xf4\x0b\x4d\x91\xc2\x57\xc5\xf4\x75\x87\xf5\x3a\x96\x33\x69\xed\x49\x23\xcc\xaf\xa1\xe5\x5e\xb9\x32\xf0\x14\x59\x54\xbc\xde\xba\x99\xa6\x2e\x15\xab\xdc\x69\x87\x8f\x2f\x16\x35\x2b\x58\xab\x50\xd5\x21\xeb\x4c\x5a\x7b\xd2\x08\x7f\xcf\xf2\x08\x4b\xcc\xa9\x96\x20\x22\x1a\x99\xf9\x30\x32\x7e\x51\xf3\xf2\xe8\xca\xad\x94\x82\x78\xe3\x7b\x8e\xc1\x93\x8c\x65\xef\xce\xcc\x08\x83\x44\x74\xda\xcc\x97\x68\x66\x6e\x64\x65\x5e\x36\xe6\x60\x3e\x5d\xf1\xdb\x2e\x5f\x91\xfa\x51\x72\x4a\xad\xb6\x30\x4e\x67\x0a\x61\xaa\x1d\xd3\xad\x6b\x88\x11\x1f\xc4\xc1\x67\xbe\x69\xb3\x89\x5a\x7d\xc7\x94\x23\x99\x15\xeb\x67\xb3\xa2\x4f\xb7\x7b\x24\x76\x71\xed\x57\xd4\x94\x6c\x2c\xaf\xc4\x62\x3e\x10\xba\x0c\xcd\x24\x00\x0e\x3e\xf3\x4d\xb0\x19\xa2\xf5\xa9\xc4\xdf\x4f\x47\x77\x68\xb7\xb8\x18\xe1\xb4\x12\xa9\xc8\xba\xec\x7c\xcf\x5e\x45\xfd\x28\x7c\x4d\x31\x1b\x3a\x10\x06\x71\xf0\x99\x4f\xdb\x4b\xe1\x9b\x73\xfe\xdd\xfb\x33\xad\x1e\x72\xb7\xb0\x86\x3b\xba\xd9\xe8\x67\x46\x3f\x5e\xb2\x0f\x31\x71\x66\xac\x76\x18\x86\x66\x54\x10\x07\xef\x07\xeb\x79\xb9\x99\x68\x62\x76\xb5\xc8\xf0\x60\xdf\xe1\xa0\xdb\x58\x13\x6a\xc7\x6d\xf1\x21\x59\x16\xf7\xb1\xdc\xf5\x89\x24\x06\xa3\x10\x46\x18\xc4\x41\xe9\xc1\x7f\x37\xc2\xa0\x0f\xfa\x34\x09\x04\x2b\x29\xd9\xa6\x78\xc7\x93\xc4\x37\x0f\x28\x12\x77\xc4\x54\x1f\x08\xdc\x29\xe3\x0b\xfa\xf1\x3e\x0c\x75\xbc\xc8\xf5\x23\xa1\x26\xa2\xe9\x20\x0e\xde\xf4\x37\xc4\x38\x6b\x96\xfe\xc9\xf1\x1f\xe4\x56\x74\x6f\x1d\x28\xdb\x64\xf9\xd7\xb2\x5e\x18\x8b\xb4\xe7\xf3\xc9\xf1\x90\x7a\x9b\x0e\x95\xc7\x01\x71\x27\xaa\x56\xea\xf8\xd9\x5d\xac\xc7\x24\x2e\xfe\xfd\xe5\x3d\xc1\xee\x0d\xef\x87\x3f\xd2\x7e\x66\x8c\xd4\x08\xac\x06\x5e\x52\x60\xee\x79\x0a\xa5\x33\x83\x38\xb8\x04\x28\x2f\x15\x04\xba\xda\xe6\xd7\x29\x50\xdd\xb9\x1a\x62\x98\xad\xe5\xa4\xb7\xa4\x20\xe1\xe8\x8e\xe5\xb7\xf4\x7b\x08\x29\xa1\x06\x5a\xb0\x83\x38\x78\x3f\xcc\x32\x7a\x7c\xb7\x2b\x10\x3a\xac\xee\x2b\xac\x30\xef\x35\x32\xf5\x97\xa9\xdc\x3f\xa7\xf6\x60\x31\x8c\x9d\x65\xdd\xd2\x3c\xc2\x0c\xb1\xf8\x01\x71\x50\x5e\x20\xc0\x08\x83\x46\xd7\xd3\x34\x90\x71\x47\x2a\xb2\x33\x06\x79\x52\x74\x91\x70\x5d\xfd\xeb\xc5\xf9\x67\xea\x52\xfc\xf2\x4a\x12\xa9\xce\x95\x1a\xba\xf4\x4b\xfb\xa8\x88\xb6\x83\xb8\x13\x6d\x9f\x11\x73\xa0\xb6\xa4\xca\xfe\xcd\x8c\x7f\x47\xdd\xd1\x94\x9b\xf1\xd7\x9b\x88\x52\x99\xdd\x83\xe0\xbe\x73\x9c\xf6\xbb\x4e\x2c\x88\xb8\x20\x0e\xae\x01\xcf\x9d\x8d\x5e\xf5\xaf\x76\x43\x01\x9f\xf1\x9c\xb4\xb3\x4b\xde\x6d\xcf\xe1\xd5\xf2\x85\xfb\x55\xdf\x0c\xaa\x20\x0b\xd9\x6e\x50\x41\xc4\x05\x71\x70\x0d\xb0\x2c\x8c\xa8\x3b\x9a\x65\xbd\x3f\xe7\xc0\xf9\x15\xa3\x5c\xd6\xe0\x0e\xd2\xa0\xe0\xef\x7a\x6f\xe4\x1b\x6f\xd7\x12\x90\x33\x8d\xa0\xbf\x17\xc4\xc1\xfb\xe1\x66\x7f\x8c\x5a\x6f\xf6\x78\xbf\x51\x4d\xfd\xba\x8f\xdf\xa0\xf1\x16\xc9\x0d\xea\xa2\xa6\xe6\xd9\xe5\x82\x5d\x4c\x66\x6a\x27\xa8\x3c\x0e\x88\x83\xf2\x02\x01\x46\x18\x34\xd5\x9d\xa6\x01\x3d\xfe\xee\x8d\x2a\x2b\xcc\xce\xdf\x1f\x31\x2a\x1d\x78\x08\x2b\x82\x78\xe5\xef\x24\x67\x1f\x59\x7f\x27\x49\xe8\xb9\x39\xfc\xdf\x0b\xcc\x20\x0e\xde\xf6\xdb\xa1\xa4\x3e\x94\x77\x29\x0e\x3c\x2d\x23\x58\x5a\x1f\x16\x48\x16\x6e\x3c\x72\xf4\x29\x7e\x6a\x7d\xf5\x7b\xcf\x06\x7a\x5d\x3b\x05\x22\x2e\x88\x83\x6b\x40\xd2\x47\x73\xef\x60\xb1\xcc\x25\x6a\xc5\x20\xd1\xc9\x3a\xab\x5b\x3f\x74\x58\xc3\x58\xe3\xc5\x93\xeb\xa6\x92\xbc\x97\x91\x96\xa1\xbd\x56\x10\x07\xd7\x40\x66\xc9\xb0\x9a\x41\x43\x28\xfb\x25\xaa\xd7\xa1\x09\x9a\xe2\x74\x75\x7d\x76\xcf\x87\x03\xfb\xcd\x5e\x90\x1c\x57\x24\x18\xb1\xea\x41\x1b\x83\x00\x0e\xde\x0f\x78\xf6\x68\x59\xa3\x3b\xeb\xd5\x39\xab\xc8\x9b\xd1\x85\x1f\x5c\xf7\x5d\x18\x7d\xe9\x46\x14\xb0\x59\x44\xa5\x9e\xb8\x10\xec\x42\x8f\xcb\x80\x38\x68\x1c\x00\x18\x61\xd0\xba\xe3\x34\x0d\xfc\xe4\x2f\x18\xd3\x98\x9a\xaa\xd6\x73\x42\xee\xda\x97\x52\x9c\x97\x1d\x46\xeb\x7c\x6b\x7b\x8d\xbc\x5c\x74\x93\xba\xe0\xbc\x1b\x15\xa2\xed\x20\x0e\xde\xf6\x1c\xfd\x89\xf9\x67\x2f\x1a\xf1\x7f\xe2\xaa\x31\x14\xc9\x54\x9f\x17\x0e\x0b\xdf\xc8\x72\xf5\x3e\xe4\xf9\x30\x1d\xc1\x32\xd5\xb9\x81\x88\x0b\xe2\xe0\x1a\x78\x6c\xfe\xfb\x9d\xf0\x55\xb5\x4c\xad\x4b\x8f\xbe\x0d\xf9\xea\xc7\x60\xa2\x99\x5a\xd7\x8f\xdc\xa6\x88\xae\xb2\x96\xba\x90\xeb\xf6\x0c\x11\x17\xc4\xc1\x35\x80\x5f\x12\xfe\x69\x43\x33\xe5\xc6\xb9\x64\x29\xee\xec\xfa\x2b\x13\x43\xb7\x30\x70\x39\xcf\xa7\x85\xc6\xb3\x34\x6d\x90\x3e\x35\x83\x9e\xac\x06\x71\xf0\x7e\x28\x2f\x2a\xe7\x40\x0e\xfc\xd4\x68\xe8\x1a\xba\xbe\xd1\xc8\xf3\x5c\x95\x67\x62\xb8\x67\xc0\x9e\x5f\xaf\x93\x94\x69\xb8\xc0\x1d\x32\xc2\x20\x0e\x1a\x07\x00\x46\x18\x64\xa2\x4e\x37\xc2\xb2\x8d\x25\xe8\x98\x37\xf6\x3e\xd9\x87\xdb\xae\x70\x48\x7d\xd3\x7c\x3f\xfb\xbc\x77\xed\xc3\xe2\xe3\x14\x2e\xfe\x2c\x31\x37\x85\xa7\x08\x53\x09\xe2\x4e\x1a\x61\x62\xbb\xdc\xbe\x9f\xfb\xb9\x79\xa2\x44\x37\xaa\x6a\xa9\xae\xda\x5f\x8d\x7a\xcf\x7a\xce\x4b\x68\x94\x23\x28\x26\x5a\xd0\x0a\x99\x01\x11\x19\xc4\x9d\x34\xc2\xb6\xfa\x01\xfd\x5a\xb5\x4e\x6d\x54\x3c\x52\x9a\x63\xd3\xfd\x82\xbb\xfc\xf8\x96\x1d\xbf\x1e\x50\x90\xe9\x1c\x47\xb7\x32\x5f\x4c\x43\x44\x06\x71\xff\x67\x84\xff\xa1\xb1\x66\xc1\x16\x74\xeb\xe9\xa0\x07\xd2\xa2\xd3\x4a\xd9\x59\x45\x7a\x3a\xe9\x74\x04\x79\xf2\x19\xa6\x54\xf3\x17\x2c\x94\x18\xf5\x5d\x20\x23\x6c\x91\xb0\xa4\xa3\x71\x0f\x39\xff\x38\xbb\x5f\x5b\x7b\x25\x5e\x18\x49\xfc\xca\xc3\x3c\xac\xe6\xd6\x75\x4b\x34\x82\xe5\xd5\xfd\xb5\x3f\x8d\xb0\x7b\xfd\x56\x91\x6e\x34\x27\xc6\xc5\xd1\xd1\x8d\x6d\xed\x9c\x2f\xbf\x2e\x7f\x7b\x77\xbf\x4c\x50\x4f\x08\xbb\xa9\x8c\x80\xf2\xc2\xc6\x9f\xeb\x92\xb2\x0b\xe6\x3d\x7e\x84\x1e\x38\xee\xce\x3d\x92\xfc\x62\xa8\xae\x9a\x5f\xea\x75\xb1\xe7\x5a\xc4\xe2\x0a\x88\x58\xfa\x0f\xce\xff\xdb\x8c\x30\xa8\x69\x7f\xe6\x07\x4b\xc2\xcd\x92\x26\x83\xa7\xe9\x01\x8d\x96\x92\xf6\x88\x16\xd3\xce\x5a\x43\xe1\xb9\xd9\x47\xcd\xcd\x22\x91\x61\x94\x31\xf7\xab\xc4\x91\x06\x0b\xcf\xe4\xb0\xf2\xa4\x11\x26\xa9\xe0\x9b\xdd\x74\x77\x5d\xc7\x42\x52\x59\xe1\xc0\x7c\x5d\x64\xae\xf2\x15\xfb\xe1\x04\x9b\x30\x8e\x44\xb3\x5d\x4f\x92\xe2\xc4\x99\x1c\xcd\x0a\x9f\xf8\x59\x85\x00\x72\xc9\xe0\xd1\x27\x4c\x5a\x3a\x32\x9e\xf2\xec\x4a\x43\xb1\xf7\xf3\x79\xa8\x68\x4d\x9f\xa3\xf7\x55\x45\xdc\x15\x58\x2d\x3d\x93\xd6\x9e\x34\xc2\x78\x58\x33\x19\xdc\xee\xb8\x2e\x2b\xf9\xcc\x8b\x3a\x07\x5b\x5b\x29\x6a\x46\xf7\x36\xec\x90\x58\x38\x84\xae\x3a\x75\x48\xaf\x24\x9c\x49\x6b\x1d\x4f\xfc\x6c\xa2\xe6\xf5\xb8\xee\x8a\xa1\x0a\x6f\xaf\x8c\xef\xb7\x83\xde\x72\xe7\x39\xf5\xb3\x3c\x5f\xa2\x1d\x11\xd2\xda\xe0\x0a\xfe\xf8\xf3\x0c\x8a\x63\xeb\xfe\x6f\x22\x3a\x6d\xe6\xf3\xfd\xc6\xf9\x73\x80\xb2\xbe\xa2\xd1\xd0\x9c\x92\xa8\x43\x97\x9a\x61\x8c\xab\x8c\x26\x6f\xa4\xcb\x7a\xd8\x64\x70\x80\xf0\x1e\x74\x6f\x0d\xc4\x9d\xb8\x0b\x35\xfa\x6e\x78\x7d\x5c\x38\x97\x84\x5c\x83\x81\x4d\x71\xe8\xd9\x58\x6f\xc4\xa4\xf1\x2f\x75\xcb\x9e\x8f\x05\xc3\xd2\x2b\xaf\x2d\xa0\xbb\x50\x00\x0e\x3e\xf3\x91\xe1\xcd\x07\xf3\xd4\x5e\xc2\x42\x9f\xe4\xb0\x12\xb3\xb8\xc7\xee\x83\xdd\xc9\x12\x10\xd5\x7f\x93\xdf\x94\x2e\xdc\x45\x7b\x16\x7a\xb2\x0f\xc4\xc1\x67\xbe\xd5\x37\xc3\x9b\x7a\xd8\xa2\x39\x21\x4a\x3c\x15\x25\x43\x77\x6c\x7b\x90\x6a\x48\xa2\x9a\xd2\xb6\xa7\xb2\x4a\xae\x89\xb5\xfa\x56\x23\xe2\x82\x38\xf8\xdf\x5b\xf2\xa1\xd3\x9f\x47\x6f\x95\xaf\x0c\x4b\x4c\x3f\x35\x8a\xc3\x40\xaa\xa8\xd7\x83\xfb\x59\xe7\x74\x50\x4f\x16\x57\x81\x6a\x44\x2e\xc2\x08\x83\x38\x28\x41\x58\xf2\xaf\x8b\x1f\xd0\x07\x7d\x9a\x04\x70\x78\x87\x86\x17\x5e\x05\xd8\x18\xd5\xf0\x8c\x0a\x2c\x2c\x1b\xf1\xa0\x6b\xe3\xe9\xde\x69\xb7\xd1\x7d\xf5\x70\x79\x20\x23\x06\xca\xb2\x02\x71\x70\x09\x68\x53\x75\x48\x7f\x28\xff\x55\x9e\xfd\xdd\x5c\x6f\xc2\xcd\xa7\x6e\xf5\x35\xcd\x2e\xe1\xc7\x3c\x2a\xd4\xc2\xb8\x50\x97\x77\x5d\xd0\x89\x0d\x88\x83\x77\xe9\xa2\xc9\x03\x6f\x7a\x0c\x02\xfc\xf0\x98\x4b\xb7\x5f\x3f\x5f\x2a\x4c\x0d\xc8\xd4\x18\x96\xea\xfb\xed\xac\x7d\x71\x2c\x03\xdf\x1c\x32\x6d\x20\x0e\x2e\x81\x1c\xd4\xa6\x7b\x46\xac\x15\xe9\x5c\xa4\x8b\xfc\x42\x07\xa4\x23\x68\x9d\x3b\x4a\xc2\x8e\x7b\x96\x36\x6b\xf4\xec\xbf\x66\x7e\x0f\x41\x8b\x35\x00\x07\xff\x7b\xaf\x44\x24\xaa\xf9\xe9\x7d\x41\x7e\xa9\xa1\x22\x4c\x43\x3d\x98\xe3\xa3\x2e\x53\x5c\x21\x9a\x9a\xf2\xdb\x25\x75\x79\x88\x22\xcd\x1a\xb1\xf8\x01\x71\x50\x66\x20\xc0\x08\x83\x46\xd7\xd3\x34\x70\x7c\x1c\xef\x40\xc9\xf8\xcc\x2d\xe7\xb2\x86\x3b\x86\xf5\x57\xd6\x43\xab\xa2\xb6\x69\x32\xe4\x86\xf7\xaa\x54\x14\xb9\xd1\x12\xd0\x73\x2b\x20\x0e\xae\x01\xb3\x3b\x6a\xc8\x5d\x32\x0f\x58\x32\x72\x7c\xf7\x32\xde\xc6\x84\x24\xa4\x8e\x3d\x3c\xd6\x35\xe3\xdd\x79\xe2\x6d\x1a\x1f\xa8\x09\xdd\x36\x07\x71\xf0\x3e\xed\xd8\xa6\x14\x0d\x24\xf2\x75\x98\xb2\x11\x3b\x36\x1c\x52\x97\xc9\xcc\x2e\x5c\x90\x8a\xe5\x52\x6b\x2f\x29\xd2\x54\xc4\x9a\x73\x42\xc4\x05\x71\x70\x0d\xa0\xc5\x22\xbf\xc1\xb0\xd4\x68\xdf\x33\x6b\xcc\x25\xcd\x20\x48\x15\xd1\x39\xd2\x9f\x0f\xaf\xa3\x6b\x46\x27\xc1\xf6\x7d\x91\x1a\x07\x65\x1c\x02\xb8\x13\xf5\xad\xb7\x47\x68\x2f\xb0\xed\x2b\xe2\x53\xd6\xb6\xca\xb9\x88\xa0\x06\xd6\x34\x9b\x57\xf7\xb6\x85\xfe\xf0\x60\x2c\xfe\x40\x53\x63\x09\xd5\x0a\x06\x70\x50\x66\xa0\xf0\xdf\x35\x00\x9a\xea\x4e\xd3\x00\xc1\x9b\x8f\x1f\xd5\xb5\xaf\x7e\x77\x1d\x88\x0e\x23\x18\x12\xcf\xf4\x33\xfb\x79\x4f\xfa\x40\xf7\xdb\x07\x34\x9b\xdc\x22\xe5\x18\x68\x68\x05\x71\x70\x0d\x4c\xb2\x25\x6a\x2b\xd4\x19\xa1\xb8\x4b\x04\xac\xa1\xe6\xd3\xde\xde\xb3\x36\x77\x7e\xbe\x7b\xdc\x45\x8a\x41\x28\x83\xeb\xcb\x03\xed\x89\x82\x38\x78\x9f\xfa\x2a\x11\x13\x93\xbf\x0b\x70\x34\xd8\x58\x90\xe5\xb9\x1b\xd2\x29\x7b\x6f\x03\x6f\xfa\xc9\xfa\xcf\xb7\xde\xca\x45\xd3\x72\xee\x50\x5c\x10\x77\x62\x43\x2c\xd4\x80\x23\xc9\xe7\x45\x8f\x36\xa7\xc0\x2b\x0b\x89\x44\x79\x7b\x9e\xc5\xc7\x74\x87\xba\xd1\x9a\x91\x46\xfd\x0c\xcb\xae\x50\x99\x7b\x10\x07\xff\x7b\x3d\xe8\x1b\xec\xb7\x94\x42\x62\x5f\x45\x7d\xb4\x4f\xff\xe9\xd8\x3b\xb3\xf3\x7c\x8d\xe5\xa0\xd0\xd0\xdb\xf1\x23\xae\xba\xa3\xc9\x57\x84\x06\x40\x1c\x34\x0e\x00\x8c\x30\x68\xdd\x71\x9a\x06\x9a\x9f\xd8\x3a\xb7\x11\x6b\x85\x84\x12\x3a\x64\xa9\x1e\xd5\x3a\x3d\x47\xab\x67\x74\xbd\xb8\xac\x10\x73\xd5\xd2\xc7\x7a\x97\x12\x3a\x0d\x07\x71\x27\x12\xa5\x90\xbd\xb3\x4a\xbe\x55\x0c\x77\xbc\x3d\xef\x34\x78\x3e\xab\xce\x17\x33\xf0\x5d\x46\xa5\xf2\x1e\x9d\xde\x31\xf3\x4b\x3e\x4c\x11\x28\x51\x0a\xc0\xc1\xfb\x74\xef\x18\xd9\x23\xac\x36\xe1\x1d\x0d\xfe\x47\x89\x5b\xdc\x9b\x3b\x87\xda\x59\xfa\x5c\x9b\x8f\x8a\x43\x4b\xf7\xba\x62\xd7\x68\xa1\xc2\x76\x20\x0e\xae\x81\xae\x82\x14\x1d\xab\xf2\xe9\xca\xbe\xfa\xd5\x81\xa7\x92\x42\x77\x6c\xbe\x29\x11\x08\xc9\x5f\x29\x37\xe2\x7c\x38\xb4\xa0\xe3\xf3\x1b\xca\x96\x07\x70\xf0\xbf\x77\xf5\xc5\xfc\x0b\x8e\x0d\x55\x19\x4d\x4e\x12\x9f\xbd\xf7\xa5\xa3\x54\xa8\xcb\xb6\x07\x7a\xb1\x79\x2c\x47\xf4\x8f\xf8\x53\xa8\x0e\x10\x1a\x00\x71\xd0\x38\xe0\x08\x38\x11\x06\x98\xa8\xd3\x8d\xb0\xe2\x07\xdb\xc9\xe2\x1c\x47\x9c\x64\x72\x4b\x61\xcc\x9f\xa6\xfc\x39\xf7\x2e\x39\x99\x18\xf0\x85\x16\xf6\x1c\x37\xaf\x69\x4a\x5f\x46\x98\x4a\x10\x77\xd2\x08\xdf\x95\xa4\x48\x61\xe5\x78\x4f\xff\x74\xc6\xfd\xaa\x74\x7f\xa4\x6e\x49\xec\x43\x01\xf7\x75\x97\x67\x3f\x3d\x84\x8d\x93\x85\xfc\x9d\x11\x91\x41\xdc\x49\x23\x1c\x5b\x6e\x51\x4b\xad\x49\x1a\x72\x6b\x39\x29\x59\x22\xa4\x50\x3a\x68\x1c\xa5\xda\xd9\x45\xca\xe4\x3c\xeb\xaf\xa8\x08\x8d\xe6\x7e\x44\x64\x10\xf7\x7f\x46\xf8\x1f\x2f\xe3\x7a\xa0\x8f\x85\x44\xcd\x3e\x15\x27\xf8\x99\xe6\xa7\xad\xa9\xa2\xfa\xbc\x15\xcd\xec\x05\xfa\xdd\xb9\xde\x5a\x1d\x95\x6c\x0d\x6d\x3c\xc8\x08\x3f\x98\x5f\x88\xc0\xae\x67\xb4\xda\xea\x21\x27\x78\xdb\x60\xbc\x83\x7a\x11\x89\x69\xfa\xe6\x0d\xc9\xcc\xf4\x48\xfd\x99\x1b\xdc\x2a\x7f\x1a\xe1\x11\xe7\x8b\x19\xcf\x8b\xda\x71\xa2\xac\x06\x25\x79\x0a\x1f\x51\x0f\x98\xe2\x13\x66\x16\xd3\x57\x47\xc5\x9f\x1f\xeb\xb3\x0a\xbd\xf2\x07\x5a\x7f\xae\xa1\xca\x38\xb8\x53\xc0\x85\xbc\x91\x57\x8c\xde\x32\x61\xfb\x22\xf1\x1d\x76\xa4\xcd\x28\x19\xac\x2e\x93\x5b\x0b\xab\x8a\xff\x36\x23\x0c\x6a\xda\x9f\x19\xc2\x27\x8c\xb0\xc1\x3d\x2f\x32\x97\x8c\xa5\x41\xb4\xf1\x56\xf5\x81\x98\xab\x28\x18\x0a\xf5\x15\x97\x7c\x03\xae\x8d\x2a\xbd\xab\x09\xa6\xb9\x5e\x73\x26\x87\x95\x27\x8d\xb0\x71\xaf\xef\xd0\xc1\x1c\xca\x2b\xff\x96\xf6\xe6\xc6\xc7\x55\x17\x9a\x03\xd3\xdc\x46\x19\x16\xa7\x76\x39\x52\x2c\x2a\x46\x98\xce\xe4\x6d\x59\xd1\x93\x46\x98\x4b\xdc\x44\x6e\xb5\xd6\x9f\xd7\x3c\x22\xe0\x77\x23\x36\x72\x93\xab\x24\x77\xec\xf1\x48\x71\xc5\x96\x5f\x83\x91\xcc\x4e\xcd\xd3\x33\x69\xed\x49\x23\x5c\x12\xff\x5c\xed\x2b\xb7\x6f\xd2\x63\xcf\xb5\xf7\xb2\x4f\x86\x31\xbf\x48\x9b\xd6\xe9\x27\xe7\xa7\x67\x66\x6f\x69\xe6\x51\x7e\x6c\x3a\x93\xd6\x9e\x34\xc2\x69\xb7\x22\x0f\x02\xfc\x5a\x94\x2f\x44\xd4\x48\x56\x2c\x5f\x2e\x92\x8b\x3a\x8a\xc8\x17\x89\xfe\xe0\x85\x84\x81\x7c\xc5\xd7\x25\xfc\xcc\x8c\x30\x48\x44\xa7\xcd\x7c\x66\x33\x37\xb5\x52\x2a\x55\x1e\xf9\x35\xff\x6e\xe5\x6a\x8f\xc9\x64\x0b\xc9\x4d\xdd\x23\x74\xc9\xec\x1c\xaa\x36\x7d\x10\xa5\x9e\x0f\xad\x54\x01\x1c\x7c\xe6\xf3\x88\xcf\xd2\x5e\x7d\xc8\x5c\x9a\x49\x63\x93\x89\xc4\xe3\x86\xcc\xbc\x66\xc1\xdb\x55\x75\x58\xbf\xd1\x25\x93\xcf\x7b\xad\x6b\x1d\x11\x17\xc4\xc1\x67\x92\x2c\xbc\xac\x6b\xf8\x5d\x96\x2c\xa5\x56\xc7\xe1\x71\x77\x7a\x3b\x2b\x85\x3d\xd8\x03\x9a\xf2\x57\x6c\x5c\x79\xbf\x4a\x4d\xe0\xc4\x20\xe2\x82\x38\xf8\xcc\x97\xb6\xe8\x53\xa7\xe5\x41\x3e\x26\x50\x95\xac\x31\xc8\x84\xde\x7f\x53\x8a\x69\xe5\xe7\xc0\x9d\xac\xfa\x4e\xb2\x43\x4f\xca\x3d\x28\x55\x1a\xc4\xf9\x8b\x21\xf9\xfe\x19\x37\xa9\x8c\xeb\x52\x61\xf9\xbe\x99\xaf\xe6\x53\x9b\x3a\xdb\xc2\x8f\x41\xa3\x9f\x4a\x9a\xae\x94\xe2\xc6\xab\xea\x61\xb2\x0b\x1d\x16\x21\x8c\x30\x88\x83\x52\x84\xff\x6e\x84\x41\x1f\xf4\xa9\x29\xc2\x4f\x45\xee\xad\x7c\xa8\x64\x33\x21\x56\x78\x73\xb7\x71\xf8\xea\xe6\xa4\x75\x15\x12\x12\xe7\x04\xf6\x53\x86\xf2\x5e\x8c\x9c\x4d\x28\x45\x18\xc0\x9d\x38\x09\x22\x93\xfe\x78\xde\xed\xb8\x5b\xb8\xda\xf4\x33\xe7\xc5\xc1\x22\x7a\x67\x0e\x9e\x7c\xa7\x2b\x17\x2e\x7b\x1b\x16\x4f\xbf\xd0\x2d\x80\x4e\x82\x00\xdc\x09\x23\xec\xe8\x86\x1a\x97\xbe\xfb\x25\xe8\x95\xc3\x77\xac\x57\x35\x09\x57\x0e\x51\x1e\x76\x20\x7f\x25\x18\xf7\xbf\x3c\x3e\x10\x96\x08\x15\x61\x03\x71\x70\x09\xcc\x09\x75\xca\xf4\x84\x8d\x46\x3e\x2e\x6d\x1b\x5d\xf5\x29\xeb\xaf\xde\x23\xd3\xba\xb9\x8f\x3c\x1a\x60\xcf\xd0\xf6\x63\x78\x8d\x12\x11\x17\xc4\xc1\x25\xa0\x46\x49\xd2\x64\x44\xc0\x36\x98\x9e\xa6\xef\x29\x6c\x6a\xbc\xa7\x47\x81\x72\x91\xae\xcc\x57\x0d\xad\xec\xbd\x53\xe0\xde\x02\x11\x62\xf1\x03\xe2\xa0\xdc\x40\x80\x11\x06\x8d\xae\xa7\x69\xc0\xe8\x71\xbd\x00\x6f\xe7\x82\xcb\xf7\xa2\xcd\x97\xa2\x72\xd7\xf0\x16\xb5\xd7\x78\x34\x4c\x37\x06\xf9\x0d\x4d\x84\x82\x3b\x3b\xa1\xdc\x58\x10\x07\xd7\x80\x33\x89\x30\xd3\x00\xbf\xdf\x6d\x0a\x25\x85\x8a\x80\x3c\x89\xdd\x4b\x02\x58\x5c\x9f\x68\x53\x94\x9a\x83\xd5\x4c\x67\x4d\x50\xee\x22\xe2\x82\x38\xb8\x06\x5e\x46\x3d\xdf\xdc\x43\xc3\xfd\xfe\x46\xef\x67\xed\x47\xee\xf6\xe7\xbd\x37\x56\xd9\xad\x87\xb7\xdf\x6b\x7d\xdd\x4f\xf2\xdc\xe7\x80\x2a\x5c\x83\x38\xb8\x06\x16\xd6\x23\xdb\x4c\x2e\x9f\x4f\xd9\x6f\xd3\x42\x56\xad\x53\x56\x68\xa7\x1e\xbd\x38\x3e\xb7\xb4\x38\xe6\x6f\x39\xb0\xff\xee\x32\x36\x94\x7b\x0c\xe0\xe0\x1a\x40\xf5\x5c\x76\x7f\x25\x83\x7f\x57\x7b\xfb\x81\x81\xac\xff\x5d\x0b\x4c\xec\x44\x14\xec\x9f\xcf\x72\xb6\xae\x4b\x1a\xe6\xed\xfd\x7a\x02\x55\x8c\x06\x70\x50\x6e\x20\xc0\x08\x83\xa6\xba\xd3\x34\x90\xc6\xe5\xb3\xa3\x35\x18\xbb\x5d\xe6\xe0\x2b\x19\x12\xbf\xb1\x61\x73\xae\x51\x81\x2b\x95\xb3\xf2\x22\x7f\xf5\x28\xef\xe6\xf5\x4f\xd0\x10\x08\xe0\xe0\x1a\xd0\x60\x5b\x63\xd5\x5d\x7b\xd4\xb0\xfb\x69\xaa\x49\x58\xd0\x60\x7a\x8e\x78\x94\xb0\xac\x68\x0d\xc5\x8a\xe1\x8a\x7c\xc4\x17\xef\x55\x44\x5c\x10\x77\xa2\x5c\xda\x84\x6f\x8f\x2f\x8d\xff\x17\x3a\x5c\x82\x5b\xf6\x9b\xe1\x76\x39\xe6\x2d\xc1\x1e\xbf\x18\xc3\x8d\x7a\x71\x0e\xa6\x12\xfe\x7b\xca\x08\xe2\xe0\x1a\xf8\x4a\x52\xba\xdc\xbe\xa7\xc0\x9c\x22\x54\x85\xcd\x16\xaa\x3c\x36\xce\xea\xb3\x82\x19\x3b\xa2\x4e\xc0\x36\x6b\xbf\xfb\xde\x1f\x2a\x74\x0f\xe2\xe0\x1a\xa8\xc6\x4e\x23\x24\xf5\x1a\xe9\x6b\x16\x52\x60\xbf\x74\xaf\xde\x19\xd9\xcf\x3f\x6e\xd2\x78\x50\xe0\x4d\x6d\x77\x36\xb9\x29\xdf\x35\x84\x06\x40\x1c\x34\x0e\x00\x8c\x30\x68\xdd\x71\xea\xf3\xe6\x49\x51\xe3\x47\x6e\x5d\x8f\x5d\x97\x05\x18\x5a\x08\xe9\x1d\xca\xbb\x3a\x94\xec\x28\x29\xfd\x7b\xec\x55\x99\x49\x25\xf7\xa4\x11\x6d\x07\x71\x70\x0d\xbc\xc6\x76\xfb\x3c\x6f\x9a\xb6\x75\xee\x83\x05\xcf\xc6\x44\x7f\x24\xba\x9d\x5c\x7d\x7c\xc3\xb4\x44\xad\x50\x58\xff\xaf\xdf\xc3\xd0\x0d\x0e\x10\x07\xd7\xc0\xc1\x54\x1c\x0b\x96\xff\xaf\x11\xdf\x22\x6b\xd7\xc7\xe9\x17\xef\x14\x20\xfb\x58\xa7\xd9\x75\x2b\xa4\xd2\xa5\x1f\x54\x52\x2d\xc5\x23\xe2\x82\x38\xb8\x06\xa2\xbf\x72\xcc\x1e\x78\x7e\x79\x3b\x12\xde\x40\x88\x1b\x4a\x70\xbf\x62\x26\x9e\xfc\x6d\xee\xe7\x3e\x7e\x5d\xef\x35\xbe\xc8\x9a\xff\x96\xb7\x00\x70\x70\x0d\x48\xd7\x9b\x0d\x59\x14\xb3\xf8\x63\x0f\xae\xae\xda\x70\xab\xd7\x58\xcf\x73\x88\xf8\xc7\x4d\x5f\xd6\x43\xfd\xbc\x84\x49\xf0\xb1\x1c\xa1\x01\x10\x07\x8d\x03\x00\x23\x0c\x32\x51\xa7\x1b\x61\x7a\xdb\xd8\x4e\xbd\x0b\x4c\x6f\x74\xe9\x3b\x34\x74\xe2\xeb\xaa\x5f\x04\x66\x8f\xa1\x4d\xc6\x6f\xb4\xa4\x70\x8b\xfa\xf0\x70\x4c\x20\x4c\x25\x88\x3b\x69\x84\x05\x03\xf4\x3d\x8d\xad\xec\xc8\x4b\x9e\x2f\x58\x69\x11\x35\x91\x70\x9b\x7a\xf0\xcb\x33\x17\x93\x52\x71\xd3\x1c\x89\xde\xb2\xa1\x45\x44\x06\x71\x27\x8d\x30\x59\x16\x9f\x84\xde\x4a\xba\x18\x1e\x3b\xb7\xd5\x0b\x92\x7c\xf3\x79\xa6\xdf\xec\x17\x70\x42\x2c\x29\xcb\x88\xef\xe6\x7e\x26\x55\x42\x44\x06\x71\xff\x67\x84\xff\xf1\x3f\x4b\xd4\x17\x91\xd1\xa9\xe2\xb0\xdb\x61\xd3\xbd\x30\x91\xf7\xc5\x96\xaf\x04\x2f\x23\x82\x74\x54\x73\xb4\xd8\x24\x7f\xfe\x79\x0b\x07\x64\x84\x51\x4b\xf3\x9b\x57\x33\xaf\xda\x64\x5c\x8b\x88\x42\xce\xa5\x25\x1f\xa2\x2e\x1e\x95\x9d\x45\x69\xe5\xeb\x90\xf5\xa3\x8c\x7b\xb2\xf4\xa7\x11\x8e\x8f\x10\x11\x4d\xc0\xee\x5b\x4f\x25\xbf\x34\x9d\x6d\x70\xab\x45\xbd\x6b\xf0\xc3\x32\xf2\x1e\xf5\x6c\xbc\xe1\xe7\x08\x77\x6a\xaf\x3f\xd0\x19\xc6\x97\x3c\xa6\x0b\x35\xcf\xf6\x47\x29\x3f\x5c\xe8\xf7\xf1\x59\xd2\xff\x5d\xe8\x39\xd7\x74\xa5\xb8\xdb\x92\x44\xfb\xff\x31\xf7\xde\xe1\x58\xbf\xff\xff\xbf\x3d\x33\x32\xcb\xcc\xaa\x08\xc9\xde\x64\x44\x91\x90\x10\xb2\x47\xa2\xcc\x50\x92\xbd\x47\xb6\xec\x4d\x56\xd9\xd9\x7b\x65\x25\xc9\x26\x7b\x16\x12\xb2\xfb\x1d\x9f\x3f\xae\xe7\xbb\xd7\xf3\xf2\xed\x7c\xfd\x8e\xc3\x1f\xaf\xff\x6f\xc7\x83\xf3\x72\xbb\xce\xf3\xbc\x3b\x17\xa7\x4d\xd7\x7f\x2d\x08\x83\x9a\xf6\xe7\x19\x61\xa4\x20\x9c\x27\x25\x98\x42\xf9\x8a\x31\x89\x1d\xf5\x71\x2b\x53\x6f\xac\xc3\xeb\xe4\x25\xdf\xc9\xa7\x86\x63\xcf\xe3\x47\x19\x15\x92\x0b\xd3\x4f\x65\xb1\xf2\x1a\x52\x46\x1b\x3f\x34\x7b\xd8\xed\xb5\x97\x9e\x57\x4a\x55\xcd\xb1\x1f\x6b\xd3\xc0\xae\xf5\x48\x8e\x4b\x49\xa0\xb7\xc8\xda\x46\xb1\x95\xc0\xfc\x54\x96\x66\x91\x83\xb0\x5c\xc5\x43\x2c\x8c\x33\xdb\x51\x4b\xc3\xaf\x24\x50\x50\xbc\x5d\x76\x7e\xd9\x7e\x0b\x23\x13\x5b\x5e\xa1\xa5\x1a\x1f\xd6\x6d\x3a\x3a\x95\xd6\x6a\x22\xfd\x58\x63\x0b\xc5\xb0\x0f\x6c\x6f\x34\x6d\xee\x69\x3f\xa5\x49\xd5\xdf\x21\x5d\xda\x57\xc7\xf2\x9e\xa5\x71\x2b\x15\x22\xd5\x90\xb9\xe4\x7d\x2a\xad\x45\x0e\xc2\xb6\x4f\xdc\x83\xb6\xd2\xfc\x37\x09\xe4\xb1\x03\xe8\x1e\xdd\xf0\xdf\x29\xe1\x1a\xd3\xe9\x39\x37\xf9\x6d\xa4\xb9\x29\x1e\x67\x31\xeb\xd4\x82\x30\x48\xa2\x93\x46\x3e\xe9\xe8\x57\x56\x05\x0b\xde\x38\xca\x96\x94\x81\x09\x4b\x65\xf1\x14\x61\xdf\x82\xdb\xa9\x86\x2a\xb3\xb9\xac\x4a\xd4\x9e\xf6\xcd\x21\x7a\x7c\x10\x07\x1f\xf9\x54\x02\xcf\x28\xa2\xe2\xda\xcf\x68\x92\xc4\x33\x33\x7b\x6d\x09\x26\x33\xd0\xe7\x62\xcf\xfa\x67\xa4\x7f\x0e\x12\x20\x9f\xb5\x84\xde\xe1\x00\x71\xf0\x91\xaf\x5b\x35\x80\xcf\xd5\xc8\x04\xc3\x9b\x63\x52\x84\xa6\x62\x94\x54\xa4\x71\x74\xe1\xa5\x37\x9f\x6d\x5d\xa4\x6d\xb6\x69\x22\x0a\x74\xab\x0f\x88\x83\x1f\xde\x71\x7d\xf2\xb8\x2c\xfd\x3b\x63\xd4\x51\x8b\xea\x73\x94\xda\x03\x72\xa7\x14\x86\x57\x3c\x89\x97\xc7\xf1\x4d\x18\x22\x37\x99\xa4\xa0\xfb\x8d\x41\x1c\x7c\x44\xd5\x27\x6d\x78\xb5\xe5\xcf\x43\xff\x5c\xa7\x5a\x7c\x43\x92\x3c\xfe\xab\xb2\xb4\x22\x15\x01\x8a\x49\x6b\xf8\xf6\xbb\x60\xd3\xbe\x0d\x44\x10\x06\x71\xd0\x19\xe1\xbf\x07\x61\xd0\x17\xfa\x24\x05\x26\xa4\xcc\xbf\xae\xca\xeb\x8d\x35\xb3\x91\x2e\x13\x6e\xab\xa8\x1b\x75\x2e\x8c\x3a\xa6\x7d\x2b\x63\x55\x4e\x1d\x49\xfc\x6e\x09\xbd\x9a\x0a\xe2\x90\x1e\x10\x4e\xc4\xf0\xd1\x7b\x79\xd3\xf6\xfb\x8b\x01\xdb\x47\xa6\x9f\x74\x59\x9f\xe9\xcd\x0f\xb2\x3d\x54\x78\x6b\x6a\xfd\xed\x9c\xd2\x8a\x01\xa2\x2e\x88\x83\x2b\xd0\xc4\x71\xb7\xac\xd4\x6f\x7f\x7d\x7e\x78\xfc\x97\x86\xde\x2a\x8b\x9e\x06\x49\xa3\x23\x03\x21\x4a\xe1\x8f\x52\xe7\x77\x18\x99\xec\x88\xba\x20\x0e\xae\x80\xf1\x6d\xd6\x96\xb1\x9e\x46\x55\x3e\x71\xba\xde\x3d\x95\x90\x14\x8d\x9b\xa2\xb1\x67\x42\xfc\x4b\x3e\xcc\x5c\xc4\xa7\xab\xf5\x87\x56\x84\x41\x1c\x5c\x01\x3e\xfb\xb4\x0d\x1a\xf1\xcf\x21\x01\xbf\x99\x32\x26\xe4\x05\xec\x7f\x56\x1a\x5a\x28\xd8\x33\x5c\xcb\x0f\xea\x39\x4f\xfb\x3d\xfb\x21\x62\xf2\x03\xe2\xa0\xb3\x81\xd7\xfe\x3e\x01\x06\xf5\xae\x27\x39\x10\xe7\x91\xb5\x1a\x6b\x78\x99\x39\x9c\xb6\xc7\xf8\x4b\xf3\xa7\x65\x6d\xab\x3b\xba\x14\xac\xb2\xaf\xc4\xb3\xc6\x68\x13\x56\x6e\x42\x1b\x38\x40\x1c\xdc\x81\xdf\x8a\xcd\xc3\x5e\xa5\xb9\xb5\x86\x44\xb4\xfb\x17\xa3\xbf\x08\xe6\x93\x39\x6d\xd3\xf9\x36\x72\x72\x6f\xf3\x53\xdc\x8f\x59\x79\x0c\xad\x34\x03\x38\xa4\xfb\x82\x6b\x89\xc9\xf8\x6b\x05\x39\x2c\xc7\x6f\xf6\x2e\xe7\xc8\x7d\x4c\xc0\xad\x6e\x71\xff\xea\x32\xb9\xc5\x86\x33\x9d\x26\x1f\x0b\xbd\x72\x05\xe2\xe0\x0e\x34\x1a\xe3\x27\xb6\x0d\x62\x67\xd9\xba\x72\xbe\xd0\xaa\x30\xfd\x84\x62\x2d\xf2\xba\x3d\x8e\xfb\xfa\x8d\x40\xdb\xe8\x5b\xe3\x77\xa1\x2b\xfe\x40\x1c\xdc\x81\x39\x8d\xf1\xb3\x54\xdf\x1d\xc9\xcf\x1c\x1d\xa2\x2d\x1d\x51\x78\x4c\xd1\x16\x36\xd1\xe4\xdf\x35\xf3\xaa\x1e\x5e\x7e\x95\x5a\x18\x8d\x70\x00\xc4\x41\x67\x03\x01\x41\x18\x34\xd4\x9d\xe4\x80\xd4\x9e\x70\x10\x7e\xe9\x20\xb3\xd1\x14\x7d\x7f\x97\xc0\xeb\xe9\x96\x29\x92\xf0\xb9\xe2\xdb\x91\x59\xf7\x36\xf8\x51\x9e\xa5\xad\x21\xda\x0e\xe2\xe0\x0e\x7c\x1c\x5c\x78\x5d\xbf\x35\x91\xcb\xe0\xa5\xfb\xba\xed\xf6\x72\x04\xf7\xb4\x4a\x21\xff\xf2\xd8\x4e\x77\x19\xed\x22\x71\x73\x1d\x2e\xa2\x2e\x88\x83\x3b\x90\x5a\xcc\x7c\x53\x4d\xf6\x07\xa6\xd8\xec\xa8\x75\xff\xfa\x42\xea\xcd\x3b\x96\xd6\xb9\x4d\x24\x09\xb5\x33\xd1\x1e\x24\xf7\x8e\xf9\xa0\xe0\x0e\xe0\xe0\x0e\x5c\x12\xb0\x7c\x8b\x45\x62\xc5\xb1\xa2\xa9\xe0\x48\xdd\xce\xc7\x24\xcf\x97\xd5\x96\x62\x28\xe7\xc6\xcd\x69\xd3\x9a\xfb\xc2\xd4\x07\xda\x1e\x0f\xe0\xe0\x0e\x24\xc4\x27\xf1\x58\x73\x9b\xea\x07\x5b\x12\x7e\xff\x15\x4f\xb8\xd2\xd7\xee\x52\xef\xd5\xf5\xe9\x00\xf3\x6c\xb4\x73\x43\xb0\x73\x06\xc2\x01\x10\x07\xf5\x03\x9a\x7f\x77\x00\x34\xef\x38\xc9\x01\x5f\xb7\xf8\xaf\x71\xde\xe3\x2f\xd2\x59\x05\xce\x3d\x0a\x58\x48\xd6\x58\x33\xf4\x65\xd4\xc0\x36\xe1\x15\xbd\xbb\x59\x5a\x34\x0b\xdd\x1d\x0f\xe2\xe0\x0e\x10\xaf\x59\xf8\x3f\x7e\x73\xf5\xfa\x6d\xe2\x0d\xc2\xf0\x00\xda\xc8\xeb\xc3\x2a\x16\xb3\x2f\xbe\xa6\x6c\x7a\x24\xdc\xae\x76\x7c\x04\x3d\x71\x04\xe2\xe0\x0e\xc8\xcf\x0c\x46\x8d\xfd\x78\xa5\x8e\xbb\x45\x3a\x7c\xbe\x48\x63\x3f\x3a\xb3\xf3\xbe\x26\xcb\x74\x21\xd6\x5c\xb8\x4d\x79\xd1\xa0\x15\xa2\x2e\x88\x83\x3b\x30\x4c\x96\xa4\xee\x5f\xe5\x2f\x70\x14\xf5\x84\x64\x5d\x34\xdb\x6d\x81\x6f\x57\xf3\x57\xf4\xfd\x77\xf5\xbf\x98\xa2\x9e\x17\x0e\x43\x41\x18\xc4\xc1\x1d\xd8\xf9\x78\x9f\x69\x3c\xfa\x2e\x43\x48\x5d\x6b\x75\xcf\xa4\x1e\xe9\x23\xe9\x33\x03\x21\x77\xf9\x67\x93\x5e\x46\x3e\x77\x7f\x5b\x3f\x80\x70\x00\xc4\x41\xfd\x00\x20\x08\x83\x42\xd4\xc9\x41\x58\xc7\x49\xf2\x8a\x84\xa7\x38\x7f\x98\x9c\xdb\xc5\x2f\x9c\x67\xdf\x3d\x29\x4d\x8f\x3e\xf4\x7b\x60\xfa\xa8\xfe\xcd\x27\xb9\x44\xf3\xeb\x88\x50\x09\xe2\x90\x83\x70\xb3\xda\xc4\xa3\x5f\xe6\xfc\x1b\x1b\x4f\xd0\xe8\x34\x69\xec\x65\x1f\x9b\x77\x5a\xa9\x65\xf0\x38\xa7\xbd\x90\xfa\x15\x7e\xee\x7a\x3b\xa2\x32\x88\xf3\x94\x41\xb9\xf0\xcf\xca\x2a\x6c\x67\x8d\xcd\xc4\xa6\x2c\x26\xcf\x7b\x7e\x9c\x2f\xca\x3f\x26\xbf\xf3\xd4\x30\x46\x8f\x29\x42\x5d\x49\xb3\xc6\x39\xf0\xe7\x00\xa2\x32\x88\x43\xfe\x34\xfe\xf5\x0b\xc2\xa8\xba\xef\x43\x43\x7d\x45\x7c\xcf\xcd\xa9\xb7\x08\x26\xa6\xea\xca\x8c\x60\x0d\xb0\xd7\xa7\xb5\x04\x1f\x3a\xd1\x77\xd6\x08\xd0\xfd\x19\x84\x9f\x88\x7c\xa9\x58\xf1\x15\x32\x51\xf2\x1e\x43\x43\xd5\xaa\x70\x25\x66\x28\x6e\xd0\x37\xd2\xfa\xa8\x4b\x1e\x3f\xbe\x81\x33\x8e\xfa\x07\xca\x1b\xc3\x81\xa1\xcc\x3b\x96\x8b\x3b\xc2\x10\x42\xdd\xb4\xc5\xfb\xac\xb4\xc7\x9a\x30\x10\xbb\xc6\x2c\x6e\x75\xbb\xd2\x63\x45\xfd\xbf\x16\x84\x41\x4d\xfb\xf3\x8c\x30\x52\x10\x5e\x5d\x79\xd4\xa9\xf9\x25\x6c\xf7\x63\x6b\x2e\xe6\xab\x47\x96\x16\x47\xeb\xe2\xc7\xfb\x33\xfb\x15\x72\x7a\x78\x95\xce\x6f\x93\x0d\x4f\x65\xb1\x12\x39\x08\x5f\xeb\x62\xdc\xbf\x11\x19\x93\x15\xee\x48\xb9\x52\x6b\x90\x33\x53\x8f\x36\x18\x23\x20\x7a\x3c\xd8\x7e\xd8\xfa\x9c\x3a\x31\xf8\xd6\xa9\x2c\xcd\x22\x07\xe1\x69\x99\xc9\x04\x62\xfe\xdb\xdc\xcf\xde\xec\x9b\x3c\x4c\x91\xe5\x76\x91\x18\xc6\x2d\xbe\x72\x5d\x9d\xbb\x83\xb3\xed\x66\x62\xc5\x69\x3c\x14\x25\x23\x89\x1c\x84\x7f\x94\x2c\xf6\x3f\x08\xe6\x7b\xba\xfe\x5d\x83\xd0\xea\xe9\x30\x05\x15\x75\xef\x6a\x37\xe7\xa4\x9f\xea\x7c\x97\x7d\xa5\x2c\xa7\xe7\xa9\xb4\x16\x39\x08\x3b\x16\xf5\x4f\x28\x62\x7b\xa8\x2e\x3c\xb1\xc6\x7d\xfc\xbb\xf2\x11\xa9\xc5\xe2\xab\xa1\x1c\xc2\x47\xf5\x89\x09\xd4\x98\xdb\xf7\x4f\xe1\x8a\x6c\xed\x7f\x27\xd1\x49\x23\xdf\x0d\x87\x0e\xc2\x5e\x99\x28\x56\xa3\xf2\x8e\xd8\x91\xba\x73\x38\xba\x5b\x7a\xc9\x02\xc9\xf5\xe8\x8f\x33\x7f\x3e\x91\xdd\x40\x87\x6e\x4a\x02\x71\xf0\x91\xef\xf2\xfe\x8d\x18\xb1\x2f\xa4\x64\x0d\x6f\x62\xaf\xf3\xed\x98\x9b\x71\x61\x30\x70\x73\x89\xbf\xb3\xfe\xa0\x42\xe2\xac\x31\x9c\x09\xad\x34\x83\x38\xf8\xc8\x47\x65\xab\xbf\x6d\xe2\x1a\x28\x70\xe7\xba\xcc\x41\x62\xb7\x8c\x9d\xbd\xa9\xc7\x66\x54\x4b\x3c\x79\xfa\x13\x73\x4c\x71\x5d\x93\x4c\x68\xdf\x1a\x80\x83\x8f\x7c\x56\x4c\x6b\x14\x17\x7e\xea\xb9\x5b\x58\xbc\x93\x8b\x58\x70\xc4\xd2\xa5\xdd\x96\x34\x89\xca\x89\x20\xa9\x6c\x10\x13\xe9\x7e\x0e\x3d\x4a\x0a\xe2\x3c\xa5\xfe\x79\xf3\xfe\x37\xc1\x10\xcf\x0a\x1a\x9b\x55\xc5\xa0\x55\xa5\x0f\x02\xfe\x9d\xca\x71\xc5\x09\xde\xc6\x37\x02\x26\x7d\x36\x1a\x29\x62\x23\xa0\xb7\x93\x40\x1c\x74\x46\xf8\xef\x41\x18\xf4\x85\x3e\x49\x81\x9d\x60\x87\xa0\x9b\x0d\x31\x8f\xed\x0f\x5b\xbf\x79\x08\x63\xe9\xec\xd8\x07\x7a\x30\xdc\x30\x25\x88\x7f\xc7\xd3\xc4\x5b\xf3\xf4\x3d\xa2\xe9\x20\x0e\xae\x00\x07\xda\x8d\xdf\xa1\xc4\x7c\x2e\x31\xe1\x52\x5e\x0a\x92\xdf\xf5\xd6\x47\xf8\x2a\x43\x16\xeb\x7a\xa4\x9a\x2e\x30\x09\xd3\xd4\x40\x5b\x17\x41\x1c\xd2\xbb\x91\x99\x1f\x29\xd6\xa4\xf6\xbd\x9f\xcd\x7a\x53\xa2\xd7\x3e\xfb\x3e\xc5\x65\xd1\x6e\xa6\xe6\x7b\xd7\x93\x41\x94\xe9\x0a\x01\x17\xf4\xc8\x0b\x88\x83\x2b\xc0\xb0\x73\xd3\x86\x52\xe6\xcc\x84\x44\x9f\x25\x0d\xc3\xcd\x32\x46\xcb\x2c\xfe\xb0\xc2\xb9\x4f\x54\xe7\x7d\x70\xef\x6b\x1f\xac\x42\x5b\x43\x41\x1c\x5c\x01\xe9\xa1\x9e\x9d\x62\xbb\xa0\xad\x9a\xe5\x86\x33\xd4\x75\xe6\xe4\x94\xad\x6c\xe1\x91\x7e\x81\x3c\x75\xe7\x82\x4d\x94\x63\x97\xe2\xa1\x8b\x92\x00\x1c\x74\x36\x10\x10\x84\x41\xbd\xeb\x49\x0e\x78\x6a\xd2\x17\x64\x59\x6d\x39\x84\x2f\x6d\x8c\xd2\xb2\xde\x74\x0d\xc0\x45\xed\xf0\x6c\xe9\x28\xc2\xd7\xa7\x62\x98\x29\x21\x73\x43\xb4\x1d\xc4\xc1\x1d\xe0\xe4\x7b\xbe\x30\x76\x35\xb6\xf1\xe9\xbd\x14\xc7\xd8\x22\x41\x2a\x0f\x1d\xc1\xc9\x2b\x2c\x75\x2c\x91\x9c\x05\x3f\x73\x54\xfe\xb7\xba\x06\xe2\xe0\x0e\x68\xe9\x2a\x2f\xdf\xbe\xf3\x1e\x3d\x8c\x87\xe3\x7b\x4a\x25\xa6\xda\xc6\xd2\x75\xd7\x07\x46\x13\x17\x08\xec\x28\x0c\x1c\x45\x8b\x94\x11\x75\x41\x1c\xdc\x81\xac\xdf\x36\x9c\xdf\x3a\xf2\x84\x4b\xbe\x3e\x52\x58\x4e\xd2\xf2\xca\x3e\x40\x91\x13\xbb\xf0\xf0\xe1\xa3\x99\x4a\xe5\x1b\x34\xeb\x83\x88\xba\x20\x0e\xee\x00\x7f\x27\x2e\x8b\xbe\x6d\x8b\x22\xda\x8f\x38\xf5\xbe\x27\x5a\x4e\x46\xda\x2d\x64\x03\xeb\x97\xce\x9d\x57\x60\xe4\xaf\x36\xaa\x86\xb6\x46\x83\x38\xe8\x6c\x20\x20\x08\x83\x86\xba\x93\x1c\x88\xa2\xfb\x62\xdb\x36\xf4\x84\x31\xe2\x0e\x9a\xff\x1a\x3b\x5f\x9f\xbc\x00\xbb\xa3\xa1\x7a\xaf\xce\xa5\x37\x7b\x4f\x3f\x8a\x04\x49\x22\xda\x0e\xe2\xe0\x0e\x04\x1f\x64\x5d\x20\x9c\xb9\x2f\xc7\x31\xe7\xd5\x7e\xa7\xc6\x93\xdb\xda\xe9\x8a\x45\x7a\xb0\x18\x56\xb7\xc3\x8a\x4e\xb9\x5f\x1c\xf4\x7d\x05\x71\x70\x07\x5e\xf9\x2e\x5f\x7d\x47\xec\xab\x4d\xad\x4d\x12\xfa\xed\x5a\x9a\x4a\x45\x7e\xb8\x8a\x80\x52\x5c\xbf\x21\xb6\x17\xfd\xb5\x4a\x01\xe8\xfb\x0a\xe2\xe0\x0e\xd4\x0b\x44\xf7\x1b\x17\xaf\xad\xcd\x62\xd8\x35\x1a\x7e\x89\x2a\x29\xf0\xcd\x16\xb8\x50\xab\xea\x37\x32\xdd\xc8\x5a\xb6\xc9\x54\x05\x5d\x9a\x07\xe0\xe0\x0e\x94\x65\x2e\x97\x92\x76\xc4\xf4\x18\xda\x33\x7c\x1e\xe2\x47\x6d\x45\xcb\x14\xfd\x5c\xe0\x38\x96\xff\xd9\xd0\x85\x40\x66\xb5\x70\x06\xe1\x00\x88\x83\xfa\x01\x40\x10\x06\xcd\x3b\x4e\x72\x60\x6a\x72\xf2\x83\x52\x4b\x5e\xdf\x0f\x9c\xae\xdf\xbd\xf1\x6b\xe7\x1b\x99\x67\x9b\x48\xad\xda\xc9\x56\x3e\x74\xd0\xd8\x89\x5c\x09\x82\x76\xc5\x00\x38\xa4\x5d\x01\xca\x0e\x86\x43\x76\xde\x9a\xdc\x92\x1c\xec\x57\x8a\x64\xec\xd9\xd8\x6e\x53\x4f\x7c\xbe\x9c\xc1\x13\x2b\x13\xca\x96\xf0\xa6\x03\xda\x15\x00\xe0\xe0\x0e\x2c\x97\xe3\x3d\xb8\xbd\xb6\x51\x14\xcc\x2f\x9b\x11\xbe\x12\xe6\x50\x23\x98\xa3\x27\x22\xf3\x96\x25\x8b\xc3\xea\xf2\xaf\xc7\x3e\x5d\x88\xba\x20\x0e\xee\xc0\xcd\x0f\x47\x01\x2b\x5c\x71\xdb\x3b\x24\x9d\x1b\x81\x7a\xb9\x6a\xc2\xa9\x67\x5f\xaf\x64\xac\xa4\x56\x0a\xbc\xd4\xfe\x79\x07\x17\x3a\x2a\x02\xe2\xe0\x0e\x98\x88\x79\xe3\x3d\x35\x71\x1a\x26\xa2\xf3\xaf\xb3\xd3\x79\x58\x3f\xd5\xf9\xfe\xcc\xa7\x70\xaa\x10\x95\x8f\x05\x71\x8d\x1b\x87\xf4\x08\x07\x40\x1c\xd4\x0f\x00\x82\x30\x28\x44\x9d\x1c\x84\x35\xa4\x85\x33\x8e\x9d\x05\x2b\xd2\x4d\xde\x5e\x56\x43\xe9\xe8\xa9\x6c\x71\xbb\xf8\x66\xf3\xe9\x40\xa6\xe4\xaa\x26\x29\x77\x4e\x1a\x22\x54\x82\x38\xe4\x20\x3c\x7e\xc8\x72\xa5\xdc\xd9\x66\x43\xc1\xd0\xf3\x9b\xa3\xf9\xb0\xe1\xcb\xd1\x38\xc6\x97\x8f\x6f\x3a\xb5\x6e\x15\xfa\xe6\xa9\xf1\x6e\x21\x2a\x83\x38\xe4\x20\x2c\x4f\xf2\xac\x6f\x8d\x08\x6d\x59\xe9\x90\xd3\x54\x2a\xb6\x58\xce\xbd\x8d\x3d\x11\xc7\x24\x67\xd0\xc6\xd6\xaf\x28\x6a\xe5\x26\x05\xa2\x32\x88\xf3\x94\xc1\x81\x7d\x1a\xff\xfa\x0d\xe1\xcf\xad\x7b\x5c\xf4\x67\x06\xf3\x24\xfc\x59\xdf\x88\x91\x24\xf8\x5f\x5b\xea\x5c\x92\xf6\x93\x62\x8f\x64\xba\x85\xf1\x84\xb7\x75\xec\xcf\x20\xec\xf9\xb4\x45\xb1\xff\x53\x51\x70\x3e\x97\x6e\x17\xfa\x68\xcb\xa4\x5c\x8d\xea\x15\x2b\x7d\xae\x6d\x3b\x85\x25\xd2\x92\x4d\x27\xcc\x3f\xd0\x88\x1b\x1b\xc6\xdd\x44\x78\x24\xdb\x8b\x5a\xb2\x4e\x24\x23\x24\xcb\xfc\x37\x7e\x65\xf0\x28\x64\xce\xef\xa0\x39\x7f\x63\xff\x62\xf6\x5f\x0b\xc2\xa0\xa6\xfd\x79\x46\xf8\x06\x52\x34\xe4\x59\xa8\x39\x6b\x14\xb9\x5e\x8c\x25\x76\x73\xa2\x74\x5d\x38\xb8\xf9\xf8\x63\x8b\xa3\xb1\xbf\x7d\x88\x22\xc9\xbd\xa3\x48\xad\x53\x59\xac\x44\x0e\xc2\xce\xf2\xd4\x51\xaa\x23\x38\xfb\xb2\x32\x54\x25\x22\xab\xb7\xcb\xee\x47\x63\x28\x87\xe9\x12\x7c\x1e\xa5\x50\x1a\xc4\xee\x7f\xe5\x7b\x2a\x4b\xb3\x62\x48\x3f\x76\x4c\x45\x55\x33\x95\xfd\x42\x62\x54\x9a\x28\xcd\x4c\x47\xdc\x80\xa0\x69\x58\xe5\x9d\xfb\x5f\x24\xeb\xcf\x5b\x4c\x87\x26\x13\x3d\x3e\x95\xd6\x22\x07\x61\xfc\x07\xfb\x14\xd7\xda\x0a\xc5\xe3\x0b\x3a\x95\x1f\xc6\x7d\x5a\x7b\x80\x51\x3d\x37\xdc\x25\x56\x6a\x95\x1c\xeb\x80\x36\xe9\xab\x74\x2a\xad\xb5\x47\xfa\xb1\xcf\x05\xbd\x6a\x1d\x4d\x09\xcf\x3c\x3c\x8b\xd7\x2b\xfb\x64\xd9\xf7\x4a\x02\xf5\x3b\xa5\x39\x79\x45\x4b\xb7\x7b\x94\xea\x45\x37\x1e\x9c\x5a\x10\x06\x49\x74\xd2\xc8\xa7\x82\xcb\x36\x19\x74\xc7\x26\xa9\x94\xab\xae\x74\xaf\xb2\xba\x4e\x6b\x2b\xd5\xc3\x73\x66\x60\x86\xac\x7a\x2b\x93\x70\xf1\x52\x2b\xb4\x72\x0b\xe0\x90\xf6\xc5\x56\x6f\x52\x2a\x9e\x63\xec\x28\x95\xc5\x0a\xda\x2e\x73\xfa\x42\xd3\xe1\xa8\xc3\xaa\xcf\x8d\x59\x5a\x9a\xfb\xd5\xae\x8a\x15\x7a\x9c\x18\xc4\xc1\x47\xbe\x2b\x4c\x33\xf9\xd9\x46\xf9\x1b\xee\xf8\x74\xa5\x85\xc7\x0f\xd0\xf7\x75\x8b\x8b\xcc\x69\x6f\xbe\x8b\x10\x6b\x4f\xb7\xd5\x28\xd9\x43\xd4\x05\x71\xf0\x91\xef\xde\x61\x92\x35\x2f\xdb\xf4\x72\xd1\xcd\x8e\xa0\x02\xfc\x54\x1a\x51\xa1\x1a\x52\x01\x9b\xc0\x31\xaa\x97\x03\x31\xe4\x92\x7c\x6f\xa0\x91\x1a\xc0\x79\x4a\xfd\xf3\xca\xc1\x09\x6b\x1b\x83\x9e\xcb\x5c\xec\x05\xb3\x99\xcc\x85\xbb\xca\x52\xcc\x56\xb3\x46\x52\x6f\x33\xf1\xb9\x8a\x64\x5e\xd1\xb1\xcb\x32\x23\x82\x30\x88\x83\xce\x08\xdf\xf8\xeb\xe4\x07\xf4\x85\x3e\x49\x01\x97\x7b\x1f\x13\xbf\x6e\x89\x3e\x18\x32\x6d\x93\xbe\x93\xea\x63\x87\xf5\xa3\xef\x75\x97\x1d\xff\xf0\xa7\xc8\xaf\x1f\xf2\xd7\x76\x8d\x10\x4d\x07\x71\x70\x05\xe6\x3f\xbf\xda\x4c\x89\x1c\x58\x55\xd8\xf3\x88\x9b\xfa\x1d\xde\xf0\x95\x31\xff\xd9\xb4\x0a\x3b\x6e\x45\xc7\xd6\x18\xbb\xde\x22\xb4\xc2\x04\xe2\xe0\x0a\xb0\x90\xc9\x68\x77\xb6\x91\x39\x7d\x47\xcf\xdf\x36\xb2\x6c\x5a\x53\x70\xdd\xfc\x92\xc3\x72\x4d\xd2\xf4\xcb\x0d\xcc\x52\x25\x5c\xe8\x95\x4f\x10\x07\x57\x60\x3f\x28\xc3\x90\xbc\xa5\x26\x55\xf7\x48\x90\x6b\xfa\x81\x71\x1c\x0e\x1b\xdb\xcc\xe3\xda\xe0\xc0\x30\xa7\x0e\xf3\xca\x98\x8f\x50\x68\x03\x71\x70\x05\x24\x31\x53\x03\x5f\xd7\x5d\x68\x71\x58\xfe\x60\xf3\x59\x2c\x3f\x48\x22\xe5\xfc\xb3\x15\x9b\xeb\xf1\x69\x7a\x34\x89\xf2\x77\x19\x4b\x10\x93\x1f\x10\x07\x9d\x0d\x04\x04\x61\x50\xef\x7a\xe2\xb3\x29\xb7\x66\x75\x18\xea\xf2\x04\x4b\x5b\x1c\x84\xad\x7b\x69\x95\x23\x7c\xbe\x57\x8c\x84\x70\xb9\xdf\x4c\x3f\x7e\x2a\x9c\xda\xad\x81\x68\x3b\x88\x83\x3b\xf0\xa8\xdc\xa9\x2d\x2d\xd4\xcb\xe4\x43\xc5\xb7\xc4\x0c\x35\xef\x5e\x9c\x23\x59\xfa\x3d\x61\x85\xae\x72\xb5\xf6\xe4\x5a\x3e\x1c\x68\xa5\x19\xc4\xc1\x1d\xf8\xa8\xcf\x5b\xdc\xaf\x41\xb5\x89\xfa\x2d\xfd\x61\xaf\x5a\x79\xce\x0c\x85\x9a\x4d\x00\x71\xf3\x90\xe9\x43\x97\x54\xe9\x42\x94\xb3\xd0\x2a\x23\x80\x83\x3b\x20\x2c\xac\x51\x4e\x79\x4b\x25\xff\xdc\xc4\x76\x0a\x9d\x0e\x61\x8d\xcb\x13\xad\x1f\x1f\x7d\xb1\x99\x29\x31\x19\xbf\xb9\x61\x6f\x64\x23\xea\x82\x38\xb8\x03\x33\xdb\x93\xef\x0c\xa5\x6b\x8d\x5e\x18\x7e\xd4\x1c\x99\xb9\xce\x65\xa8\x31\x61\x82\x7e\x21\xe5\xfa\xc2\xdd\xfa\x04\x03\xd4\xcc\x50\x84\x03\x20\x0e\x3a\x1b\x28\xf6\x77\x07\x40\x43\xdd\x49\x0e\xbc\x77\x63\x65\x1d\xeb\xd4\x9f\xf5\xd2\x59\x5a\x0e\xaa\xbf\x82\x97\x82\xea\xf4\x7a\x3b\x51\x87\x5a\xcb\xf1\x0e\x3d\x73\xc7\x7d\x68\xa7\x05\x88\x83\x3b\x50\xd8\x18\xc7\x4a\x6d\xe4\xd4\x9e\x9b\x69\x6d\x4a\xac\xf2\x9c\xe4\x7c\x2e\xe5\x28\x5e\xe0\x04\x93\x93\x68\xae\xda\x2f\xb7\x5a\x72\xc8\x2d\x00\x87\x74\x69\x9e\x7c\x50\x42\xb5\x2c\xe9\xa2\xd3\x0e\xf9\x7a\x41\xe6\x90\xf0\x79\xc3\x95\x8c\x91\xe3\x28\x92\x77\x01\x81\x01\xaa\x79\xc4\xd0\x13\x5a\x20\x0e\xee\x40\xdf\x73\x72\x06\xd7\x4c\xc2\x21\xfd\x86\x42\x3d\x6b\xb1\x14\xb3\x5b\x2a\x74\x22\xe7\x89\x47\x18\xf4\xdf\x0f\xb0\x3a\x90\x6b\xfe\x42\xd4\x05\x71\x70\x07\x62\xb9\x6c\x83\xc4\x05\x74\xd3\x7b\xc3\x99\x96\xe5\x67\xb8\x7f\x10\x8c\xcd\x8d\x5f\xcc\x70\x78\x9e\xce\x52\xbb\x3a\x27\xd9\xf0\x11\xe1\x00\x88\x83\xfa\x01\x40\x10\x06\xcd\x3b\x4e\x72\x00\xef\xe8\xce\xf9\xb9\x25\x53\xcd\x98\xcb\xf7\xbc\x08\x5d\x32\x36\x07\x75\xb7\xf2\xf4\xc5\x9e\xb1\x3e\xd8\x6c\x4b\x39\x1b\xbd\x71\x19\xd1\x76\x10\x07\x77\x80\x52\x8b\xd0\x9c\x1b\xdf\x92\xa9\x2f\x47\xc0\x4a\xfa\x8b\xcf\x50\x8e\x7a\xd7\xc8\x6d\xa1\xe9\xe0\xd4\xf3\x05\x18\xc4\xf6\xef\x70\xa0\xab\x3d\x00\x1c\xdc\x01\x95\x0d\x7d\x49\xa1\xae\xc6\x07\x18\x0f\x58\xbb\x34\xeb\xae\x91\xd6\x6b\x57\xee\x26\x94\x78\x52\x30\xb7\xd4\x4e\x6d\x1d\x6d\x41\x37\x9d\x83\x38\xb8\x03\x07\xac\xa9\xd8\xbe\x8a\x6d\x51\xc2\x68\xc5\xd3\x23\x9d\x4d\x16\x7c\x3d\xba\x4c\x26\x45\x2e\x1a\xe7\x58\x5f\x3d\xbf\x30\xaa\xe4\x0e\x6d\xb9\x06\x70\x70\x07\x3c\xcf\x31\xdb\x0f\x77\x34\x9f\x47\x6b\xbd\xc9\x55\x90\xe8\x2b\x5a\x77\xe0\x2e\x21\xe1\x76\x7c\xb3\x79\x43\xcf\xfe\x79\x25\x9e\x0b\xf4\x9a\x38\x80\x83\xfa\x01\xfb\xbf\x07\x61\x50\x88\x3a\x39\x08\x1f\xba\x6f\x84\xe3\x14\xc4\xb8\x1b\x58\x76\xd9\xa8\x7e\xbe\xb6\xb6\x1a\xa3\xc8\x7c\xa1\xe7\x48\x6b\xb1\xc5\xdc\xa0\xbe\xae\xa7\x05\x11\x2a\x41\x1c\x72\x10\x16\x3f\x7a\xb9\x29\x1f\xbd\x3b\xe7\x78\xd0\xfd\x4d\x78\x3c\x6f\x1f\xaf\x3c\x6b\xd4\xe4\x5a\x4c\xb8\xb1\xd4\x7d\xaa\x05\xaa\xea\x6c\x44\x65\x10\x87\x1c\x84\x47\x85\x9d\x88\xc8\xe5\x70\x50\x12\x4d\x7f\x51\x1d\xf5\x44\x17\xcd\xa7\xc8\xe0\x8a\xf3\x32\x89\xa6\x1d\xee\x53\xb2\x1a\xb4\xbe\x44\x54\x06\x71\x9e\x32\x17\x60\x9f\xc6\xbf\x7e\x45\x78\x6a\xfc\xd2\x8f\x2c\x39\x87\x0a\xde\x1e\x46\x1e\x8a\x50\xa3\x3d\xa2\x62\xb1\xe8\x3c\x93\x0e\x3f\xda\xe4\x26\x19\x79\x2c\x66\xc7\x3f\x83\x30\x57\x8d\xee\xd2\x39\x1b\xfb\x3c\x66\x9d\xeb\xab\x97\x35\x0d\xb1\x3f\x91\x64\x9d\x8b\x56\x4a\xf3\xe3\xcd\xfb\x40\x98\x9a\x6b\x43\xfc\x07\x6a\x6e\x3c\x78\xc7\x29\xe2\x6d\x70\x37\xb7\x62\x94\xa7\xc6\x7b\xa6\xde\xfc\xc6\xe3\x7b\xe1\xfa\xd8\xc7\x13\xd2\x02\x3a\xa8\xdd\xc1\xff\xb5\x20\x0c\x6a\xda\x9f\x67\x84\x91\x82\x30\x61\xa2\xf5\x55\x0c\x92\xf7\x43\x7e\x39\x68\x2e\x01\x92\xe1\xb5\x5e\x5c\x1a\xab\xa3\x4e\x3b\xa2\x9f\xb0\xa5\xc2\xa9\x6c\xad\xf2\x4f\x65\xb1\xf2\x84\xad\xd1\x9a\xd2\x58\x2b\x2f\x1d\x6d\x39\x1c\xcf\x6e\x07\xdc\x47\x7d\xcf\x96\xfc\x28\x37\xeb\xa6\x8c\x78\xd7\x7d\x01\x37\x47\xef\xbd\x80\x53\x59\x9a\x45\x0e\xc2\xf1\xec\x36\x53\x0e\x4f\xb8\xc9\x68\x51\x0d\xe9\x1e\x45\x50\x34\x7c\x98\x4b\xb5\xbf\x3a\x81\x96\xbd\x7d\x2e\xe3\x53\x58\x2f\x0e\xfb\xa9\xb4\x16\x39\x08\xa3\x7b\x30\xde\xe5\x47\x4d\x6e\x73\xda\x13\x62\x6d\xbd\xe4\x36\x65\x67\x57\x5a\x22\x8d\xdf\xae\x8f\xcb\x14\x39\xf7\xf3\xf2\xf1\x97\x53\x69\x2d\x72\x10\xf6\x6d\x14\x32\xcb\x7f\x71\x64\xa1\x7d\x26\xcf\xe0\x41\x1a\x53\xf5\xcd\x33\x82\x1c\x9b\xb9\x35\x2f\x87\xb5\x4b\x88\x84\xef\x90\x93\x9f\x5a\x10\x06\x49\x74\xd2\xc8\xe7\xee\xf1\x85\xeb\xba\xb3\xbe\x3a\xdb\xb2\xea\xf8\xc8\x91\x5d\xe4\xfd\x85\xe6\x48\x6d\xe2\x24\x89\x87\xa4\xb1\xce\xb7\x1a\x3b\x43\xa0\x6b\x17\x01\x1c\xd2\x1b\xb2\xa2\x3e\x76\x97\x6f\xc5\x7c\x70\xdb\x6f\xaa\xef\x59\x36\xb9\x88\x3f\xcd\xb3\xa2\xda\xf2\x84\xa4\xd6\x93\x78\xe3\x80\xc5\xdb\x03\x3a\x64\x03\xe0\xe0\x23\xdf\xea\xc4\xb9\x3e\x45\x39\xfb\xeb\xcc\x3e\x2f\x02\x2e\x67\x28\xf3\x7e\x33\xcb\xdb\x99\xcd\x42\xf3\x7f\xbc\xbd\x3d\x5c\xce\xe6\x0c\xbd\x9d\x03\xe2\xe0\x23\x1f\x4b\xe1\xae\xe1\xad\x7c\x82\x33\x18\x63\x95\x45\x11\xd8\x6d\x93\x23\xf5\xc6\xa8\x95\xe7\xaf\x15\xbe\xd0\x73\x9c\x59\xa6\x49\x32\x87\xd2\x15\x80\xf3\x94\x42\x91\xfc\xb3\x2e\x57\x00\xf7\x39\xed\x37\xc9\xfc\xf4\x9d\xf5\xa9\x64\x2d\xec\x33\x95\x57\xf6\x75\xdf\xa1\x1a\xbe\x7f\xb8\xa4\x6e\x70\x37\x24\x98\x0d\x11\x84\x41\x1c\x74\x46\xf8\xef\x41\x18\xf4\x85\x3e\x49\x01\x22\x79\x3d\x2e\x02\xd5\xc5\xbd\x66\x31\x5b\x93\xa3\x8b\x9e\x1d\x94\x29\xbb\x4f\x1c\xdb\x1f\x84\xb7\xb2\xef\xf0\x59\x55\x63\x43\xab\x60\x20\x0e\xae\x00\xf6\x15\x53\x14\x0f\xb6\x87\xe9\x98\xc3\x9b\x99\x1f\xaf\xdc\x0f\x22\xc5\xc8\x22\x1d\xe5\x6f\x38\x7c\xb0\x80\x8b\x13\xc8\xec\xb2\x81\xa8\x0b\xe2\xe0\x0a\x78\x78\xf1\xe1\xf6\x99\x5d\x26\xa1\xd0\x5a\x20\xbb\xa8\xa9\xdc\x9c\xcd\xeb\x19\x7c\x0f\xb3\xb9\xfd\xd5\x7a\x77\xc9\x45\xae\x23\x68\xf5\x12\xc4\xc1\x15\xb8\xea\x6f\x34\x6f\x1d\x9b\x72\x20\xfa\x71\x58\xb9\x23\x94\xb5\x91\x86\x76\x7e\xa4\xbf\xaa\x23\x2d\x81\xea\xd2\x04\xc1\xb3\x21\x36\x44\x5d\x10\x07\x57\xe0\xf3\x9b\x70\xd9\x5c\x12\x0f\x0e\x1c\xf2\xc4\xc7\xfa\xe6\xe1\xbe\x33\x37\x04\xce\xc4\xf2\xac\x0c\x67\xce\xcf\xbf\xa7\x97\xec\xba\x89\x98\xfc\x80\x38\xe8\x6c\x20\x20\x08\x83\x7a\xd7\x93\x1c\x88\x69\x6f\xc3\x13\xd7\x56\xed\xcd\x69\xdc\x37\x94\x24\x66\xbd\x24\xd2\xe3\xee\xdd\xcb\x24\xff\x8e\x99\x5a\x5c\x50\x81\x35\x14\xba\x89\x1b\xc4\xc1\x1d\x18\x5d\xbc\x4f\x75\xfe\x56\xad\xad\x61\xb3\xf6\x32\xc7\xce\xdd\x5f\x68\x8a\x36\x82\xe7\x57\xb7\x5b\x6a\x24\x7f\xfd\x8c\xa5\x23\x20\x82\x2e\x79\x07\x70\x70\x07\x46\x14\x78\xa9\xae\x3b\x24\x49\x7d\xcd\x9d\x2f\xc7\x22\x66\x9d\x9f\xf8\xc9\x7d\xac\x66\xae\xef\x8e\x57\xc1\xfe\x7c\xcf\xb1\xc8\x06\x51\x17\xc4\xc1\x1d\xc8\x3f\x6b\xcc\x75\x41\xa5\x0d\x5d\x81\xfe\x4d\xbc\xfa\xae\x70\xc8\xde\xac\xc6\xca\x8a\x09\x59\x4c\x60\x79\xbb\x7f\x45\x9e\x10\x2f\xa2\x2e\x88\x83\x3b\x20\xeb\x20\x4b\x48\xd8\xe1\x82\x63\xb0\x41\x2b\x94\x56\xc0\xce\x26\xfb\xe9\x3a\x9e\x91\x88\xd7\xcc\x98\x45\x46\xeb\xf8\x62\x90\x27\xc2\x01\x10\x07\x9d\x0d\x04\x04\x61\xd0\x50\x77\x92\x03\xe5\x6c\x1a\x78\xef\xab\x08\x73\x06\xd5\x5f\x09\x7a\xec\xe3\xae\x35\xd9\x8a\x52\xae\x28\x91\xbd\xbb\x8f\xe2\xca\x58\x64\x7f\x1f\xba\x85\x19\xc4\x21\x3d\x9f\xc4\xce\x7a\xd3\x41\x7f\x26\xc0\xe4\xeb\xd1\xb8\x62\x3e\x63\xb9\xdf\x8a\x3f\x96\x71\x46\xf5\xc3\x5e\xcc\x3a\x9b\x8c\xe4\xce\x6f\x88\xba\x20\x0e\xee\x00\x7d\x52\x9d\x99\x38\x9a\xdb\x23\x2f\x66\x4b\xe2\x50\xd6\x6a\x75\x13\xfc\xd1\x28\xfa\xf3\x81\x87\xf7\xde\x06\xbe\xb0\xf8\xdc\x07\xf5\x5b\x20\x0e\xee\xc0\x05\x13\x8c\xe1\xfa\x43\x2a\x5f\x39\xb3\xfb\x39\x9a\x45\x37\x48\x4b\xa2\xd3\x17\xaa\x5c\x0b\x3f\x3f\x6b\xe5\x4a\xc5\x9a\x68\x80\x86\x44\x10\x07\x77\x60\x1d\xef\x9b\x7d\x0f\xc5\x67\xec\xc6\xbb\xf5\xe1\x13\x2c\x07\x68\x3b\xf6\x6e\x79\xee\xa9\x66\xae\x1e\x94\xb9\xd2\x12\xe7\x1c\xa0\x4b\xf3\x40\x1c\xd4\x0f\x00\x82\x30\x68\xde\x71\xe2\x06\x31\x56\x4c\xe3\xf7\x2f\x5f\x73\xdc\x7e\xc9\xf1\x53\x82\x5a\x09\xdd\x34\x73\x34\x32\x43\xcc\x65\xf3\xac\xb2\x83\xa8\x4f\x99\x0f\xb4\x72\x0b\xe2\xe0\x0e\xb4\x6c\xb0\xe3\x8f\x3f\x34\x64\xb0\xd5\xb4\xd6\x66\xeb\xa3\x3e\x0c\xfd\x3c\x27\x9e\xbb\xba\xb7\xce\xad\x95\xdf\x10\xe7\x59\x05\x1d\xbf\x01\x71\x70\x07\xbc\x12\xdb\xdc\xbe\xfd\xd6\x46\xfd\xa9\xe0\xae\xa5\x8e\xbe\x64\xe8\xdf\x41\x69\xdd\x8a\x4e\xbc\x90\xff\x88\x5d\x5b\xea\x33\x86\x10\xa2\x2e\x88\x83\x3b\x40\xfe\x85\x2b\xb0\x3a\x8f\x86\x45\x1c\xd3\x17\x57\xb7\xa2\xe4\xd2\xd7\x35\x1d\xdd\xbc\x1b\xc1\x9b\xd8\x1f\xd0\x6b\x36\x0b\x95\xcf\x21\xea\x82\x38\xb8\x03\xe2\xa4\xdf\x6c\x7f\x91\x84\x13\x19\x9d\x2d\xe6\x2c\xc8\x6a\x61\x70\x7d\x9d\x9f\x15\xa9\x4f\x82\x56\x25\xeb\x1c\x2a\x74\x87\xbd\x06\xe1\x00\x88\x83\xfa\x01\x40\x10\x06\x85\xa8\x93\x83\x70\x56\xa0\x25\x6e\xbd\xce\xf0\xb1\xd7\xef\xc8\x7b\x76\x38\xed\x86\x3b\x45\x0a\x9e\xa5\x25\x2a\x89\xb4\x18\x96\x22\x34\xa2\x95\xd0\x95\x56\x20\x0e\x39\x08\x3f\xb6\xd6\xc6\xc1\x60\x30\x66\xc6\xcd\xaa\x0f\x36\xdb\x1e\x61\xfe\x76\xf8\x3e\x5f\x8a\x6c\xd6\x1d\xc3\xc1\x28\xa0\x05\xc3\x43\x0d\x51\x19\xc4\x21\x07\xe1\x05\x42\xe9\xb7\x57\x1d\x70\x37\xa3\xed\x1c\x86\xfd\xf8\xcd\xa5\xa4\xb4\x79\x03\x44\xcc\xe9\xb2\x6f\x66\xe3\x2e\x0c\x3e\x3e\x66\x42\x54\x06\x71\x9e\x32\x6e\xb0\x4f\xe3\x5f\xbf\x23\x9c\x8f\x77\x59\xeb\xcd\x15\x94\xc2\xf4\x91\x70\x36\xef\xe9\x14\xdc\x17\x6c\x1c\x6f\xda\xf9\xa7\x2f\xc6\xbe\xfc\xbc\xad\x75\x56\xcc\xe6\xcf\x38\x35\xd7\x78\xe8\xc3\x18\xd5\x7b\x60\x7f\x91\x87\xf0\x0d\xa1\xbe\x83\x6a\x87\xf1\x4b\xee\x80\x33\x3c\x1a\xb7\x2f\xce\xeb\xd1\xe6\xcc\xfd\x81\x62\x6d\x7f\x63\x6b\xe3\xf4\x3b\xa2\x6d\x92\x7d\x61\xfb\xbd\x75\x0f\x75\x25\x41\xd7\x33\xea\xc9\xfa\x01\x33\xf9\x4f\xca\x1b\x8d\xf6\xff\xb5\x20\x0c\x6a\xda\x9f\x67\x84\x91\x82\xf0\xc8\xeb\x2f\x98\x86\xbc\x51\x92\x25\xd7\xae\x6f\x3e\xcf\x31\x12\x65\x54\x9d\x94\xcb\xe6\xa7\x9b\xdd\x70\x70\x1e\x11\x7f\x67\xa2\x71\x2a\x8b\x95\xdc\x48\x19\x8d\xa6\x4c\xe4\x46\x16\xca\xab\x84\x6b\x67\xfb\x0c\x44\x82\x35\x6b\xb3\x52\x97\x71\x8c\x5c\x1e\x96\x33\xb6\x04\x36\x88\x31\x4f\xf5\x9d\xca\xd2\x2c\x72\x10\xbe\xa5\xf0\x3a\x37\x43\xae\xef\x42\x45\x34\x9a\xe8\xb9\x17\xa8\xd6\x38\x7e\x35\xdb\x4f\x3c\xdf\x24\xf7\x68\x58\x60\x37\x2c\x30\xf1\x9d\x4a\x6b\xef\x23\xfd\x58\xa6\xe4\xd7\x5d\x12\x98\x1d\x98\xca\xba\xe9\xb9\xd5\x4d\xac\x73\x52\x29\x04\x22\x6b\xe6\x21\x74\xcc\x2c\x21\x0d\x46\x4f\xde\x5c\x3f\x95\xd6\x22\x07\x61\xd6\xaf\xc6\xec\x75\xbf\x6e\x39\x69\x9b\x5a\x1c\xf2\xd0\x13\x72\x94\x0b\x04\x10\x3a\x71\x1d\xea\xcd\xba\x9a\xf4\xff\x52\x2d\x3a\x3c\xb5\x20\x0c\x92\xe8\xa4\x91\xef\xf8\x8d\x17\xd5\xa6\x60\x1d\xfd\x25\xad\x6d\x43\x7a\x6c\x8c\x8e\xc4\x04\xf9\x09\xa6\x1c\x74\x6b\xca\x7c\x52\xbd\x77\x89\xd9\x71\xd0\xbf\xd5\x01\x1c\x7c\xe4\xeb\xa3\xd8\x32\x7d\xe6\x88\x89\xe7\xdf\x52\xce\xee\x73\xa8\xd3\xc6\x89\x7d\xad\xda\x42\x58\x33\xfb\x20\xfc\x7c\xeb\x41\xac\x16\xf4\x88\x2c\x88\x83\x8f\x7c\x1c\x1d\x69\x12\xdf\x3f\xd5\x92\xba\x16\xeb\x4a\xd4\x49\x92\x75\xdc\x32\x1a\x71\x5d\x38\x22\xb8\x6d\xd6\xa8\x23\x4e\xce\x33\x09\xbd\x6d\x01\xe2\xfe\x6f\x24\xf9\xb3\x6e\xc0\x6f\x5e\xf4\x7d\xd5\xbe\x66\xb9\x5e\xfb\x5f\x2c\x4e\xd3\x0c\xfe\xfc\xe4\xc4\x3f\x17\x8a\x1b\x22\x57\x3b\x94\xf4\xc7\xc2\xa0\x65\x51\x10\xe7\x29\x85\xf1\x8f\xba\xb4\xf7\x0a\x0e\xf2\x33\x4c\x27\xb1\x1d\x43\x4d\x0a\x5f\x26\x66\x05\x17\xc4\x7f\x71\xcf\xad\x09\x56\xd7\xe8\xfe\x58\x46\x23\xc2\x8f\x08\xc2\x20\x0e\x3a\x23\xfc\xf7\x20\x0c\xfa\x42\x9f\xf8\x76\x24\x65\x60\x62\xca\xfd\xd0\x09\xd7\xac\xaf\xef\xc5\x7e\xd1\x9c\xe9\xa2\xcb\x99\x1d\x5e\x53\xe7\x5a\xbe\xe8\x9f\xc2\xc8\x83\xdd\x8f\x68\x3a\x88\x83\x2b\xa0\x63\x64\x70\x99\xd5\x30\x20\x79\x9e\x5a\x6e\x4c\xe9\xc1\x57\xd2\x47\x31\x2d\x17\xdf\x16\xbd\xe6\xe2\x1c\xae\xe0\xbe\xa8\x26\x00\x3d\x51\x0d\xe2\xe0\x0a\x44\xcb\xcb\xd4\x34\x29\xca\xe9\xa1\x94\xd5\x17\xc9\xee\x0c\x9d\xff\x30\x63\x28\x83\xaa\xbb\x60\xed\x67\x26\x5d\xbd\xa9\xfd\x1b\xba\x29\x14\xc4\xc1\x15\xb8\xa8\xad\x38\x80\x72\xf6\x3c\xfe\xf7\x69\xeb\x2a\xaa\xd8\xb7\x01\xbf\x27\x0d\x16\xe3\xe6\xca\x7a\x2d\xef\x64\xbe\xb6\xc9\x7b\x00\x29\x00\xe2\xe0\x0a\x88\x17\x86\x60\xbf\x9b\x33\x7a\x37\x54\xc6\x46\x11\xdc\x61\x76\xad\x9e\x32\x9e\xe9\xf9\xc5\xd6\xb9\x23\x96\x5f\x52\xd4\x67\xcc\x76\xa0\xc9\x0f\x80\x83\xce\x06\x72\xff\x7d\x02\x0c\xea\x5d\x4f\x72\xa0\x09\xe7\x11\xb9\x41\x36\x2d\x67\xa8\x59\xc6\x1b\x82\x35\x96\xf9\x98\x5c\x33\x81\x74\xe3\xa6\x02\x1f\x1b\x8a\xb3\x4f\x97\xb1\xa1\x57\xd4\x40\x1c\xdc\x81\x66\xd4\xc0\x7b\x84\x11\xe1\xd3\x58\xa6\x7b\x62\x79\xaf\x9e\xc8\x06\x2f\x16\x11\xf9\xa4\xc9\x57\x59\x9a\x1d\x31\xb5\xcf\xbc\xf1\x47\xd4\x05\x71\x70\x07\xd6\x33\x3b\x33\x23\x15\x8d\x5c\x3b\x02\x2a\x97\xca\xbb\xfa\x25\x7d\x5e\x3d\x17\x0f\xb8\x22\xf6\xc2\xce\xf4\xcc\x34\x13\xdd\x55\x16\x44\x5d\x10\x07\x77\x20\xf2\x2a\x3b\x8f\xa6\xfa\xdb\x9f\x1a\xb4\xc5\xe1\x26\x4f\x63\x7b\x5e\x7c\x08\xb3\xaf\xa5\xe4\x91\x7b\x1c\x6a\x14\xd6\xd4\x7d\x25\x05\xfa\xff\x1d\x80\x83\x3b\x70\x15\xaf\x72\xe7\x35\x7a\xb2\xda\xdc\x76\xea\xc0\x7b\x0e\x9f\xa3\xdd\xdd\x11\xc7\x04\xa1\x9b\x37\x89\x3e\xac\xbc\xc6\x7b\xcb\x29\x80\x70\x00\xc4\x41\x67\x03\x01\x41\x18\x34\xd4\x9d\xe4\x40\xc1\x42\x22\xb1\x99\xc0\xd8\xf4\x17\xf4\x7b\x78\xaf\x15\x6c\x69\x23\x28\x17\x89\x45\xaf\xfe\x0e\x64\x34\x7e\x12\x29\x25\xfd\x0d\x0d\xd1\x76\x10\x07\x77\x80\xfd\x29\x4e\x0b\xd7\xf3\xe7\x6c\x29\xfc\x1f\x05\xa9\x98\x48\x8c\x0e\xf0\x15\x76\xbd\x3a\x2e\x90\xd4\x6b\x63\x7b\xb3\xdb\x36\xbe\x43\xd4\x05\x71\x70\x07\x3c\x05\x2e\x74\x10\x71\xe5\x47\xb8\x66\xa0\x35\xbd\x5c\xcc\x3e\xbb\x62\x7b\xc4\xb6\x96\xbc\x3c\x7b\x69\xd4\x47\xca\x0f\xa5\xb3\x07\xda\xce\x0f\xe0\xe0\x0e\xd8\x5d\xeb\x9a\x12\xe9\x32\x6d\x99\x42\x53\xd0\xc5\xb1\xf2\xaf\x6a\x10\xcf\xd3\xcb\x64\xf0\x68\xe7\x49\x2b\xdf\x79\xc3\xee\x04\x5d\x9b\x01\xe2\xe0\x0e\x10\xdc\x96\x91\xe1\xd3\xb0\x17\x76\x97\x2d\x0a\xa3\x09\x3b\x56\x6d\x6d\x1a\x45\x71\xca\x26\xab\x62\x12\xae\xf2\x7d\x86\xee\x0b\x6d\x8f\x07\x71\x50\x3f\x70\xff\xef\x0e\x80\xe6\x1d\x27\x39\x30\x64\x67\x2f\xce\x18\x8d\x99\xfc\x5a\x81\xc8\x6f\xb8\xb7\x84\xb0\x47\xcd\xed\x72\x1a\x5d\x5a\xf1\x8a\x54\xa6\x66\xe2\x48\x37\x74\xa2\x09\xc4\x21\x3d\x22\xa1\xc2\x55\xb2\x3c\x9b\x41\x32\xa0\x3b\x91\x78\xbe\xbf\x56\xd7\xe9\xac\x97\x34\x79\x6e\xbf\xcc\x07\x2f\x83\x50\xd7\xf7\xe7\xa0\xf7\xc4\x41\x1c\xd2\x5d\x01\xd5\x62\x54\x4e\x4e\xaf\x92\x8c\xcf\x85\xa3\x5c\xaf\xb0\x39\x20\xe9\xf0\x69\x10\x4e\xbe\xf6\xae\x3f\xcd\xac\xa1\x57\xe0\x23\xb4\x91\x0b\xc4\xc1\x1d\x90\x19\x60\x13\x29\xac\x16\xb8\x11\x83\x57\xfa\xa9\x7f\x88\x1f\x8d\x59\x2c\xc3\x9d\x65\x40\xf8\x6e\xf6\xd2\x53\xb1\xa1\xc9\x10\x68\xe3\x19\x88\x83\x3b\x90\x21\xbb\xaf\xc7\x97\xce\x2a\x61\x6f\x56\x2c\xad\xe5\x78\x23\xfc\x85\x74\x4c\x55\x2a\xc9\x24\x53\xd2\xf4\xb7\x6c\x7d\x53\x71\xe8\x4d\x79\x10\x07\xf5\x03\x80\x20\x0c\x0a\x51\x27\x07\xe1\x54\x53\x5d\x03\x22\x0b\x73\x46\xb2\xf6\x39\xbe\x45\x25\x5b\xba\xd1\xc4\xab\xe2\xcf\x5a\xa2\x30\x6e\x95\xdb\xc5\xaf\x96\x97\x38\x21\x42\x25\x88\x3b\x21\x08\xa7\x17\xa1\xf1\x9f\x09\xcb\x4e\xed\xa5\x1c\x71\xf9\xb1\xc3\x77\x61\xcb\xef\x49\x26\xc5\xfb\x07\x18\x23\xc5\x93\x53\xd1\x58\xab\x50\x10\x06\x70\xc8\x41\x38\xda\x74\x20\xca\x01\xad\x88\x57\x20\xb8\x85\xe2\x91\xc2\xf6\xbd\x38\xcc\xdd\x69\xf9\xcc\xa9\xb0\xf7\xbc\x55\x5f\x5a\xb2\x89\xad\xa0\x5b\xa3\x01\x9c\xa7\x0c\x0a\xda\x3f\x2b\xff\xeb\x77\x84\xe5\xda\x56\x1d\x4d\x36\x39\x0d\x9e\x2e\x87\x7d\x38\xe4\xae\xb3\x7d\x88\x47\x78\x51\xb4\x49\xd9\xc3\xac\xe6\x5e\xf3\x03\xbc\xcf\xe6\x7f\x06\x61\x91\xe6\xb7\xab\x12\x75\x6c\x19\xda\xf6\xb5\xc4\x95\xda\x52\xe1\x71\xd8\xe6\x5f\x1c\x9e\xc7\xec\x1a\x07\x07\xe6\xd9\x90\xa0\x19\xff\x81\x3e\xcb\x6b\xca\x99\x8d\x2f\x1b\xdc\x9f\xc3\x1a\x2a\xa4\xc7\x0e\x89\x93\x17\xfb\xea\x87\x2e\x92\x16\xaf\xfd\xce\x99\xa8\xeb\xaa\xe9\x7f\x2d\x08\x83\x9a\xf6\xe7\x19\x61\xa4\x20\xdc\x1d\xee\xa2\xd9\x7d\x49\x4f\x63\xd5\x24\x50\x2a\x80\xe1\x90\x47\xfd\xaa\x9d\x46\xca\x60\xed\xb7\xe8\xb3\x9f\xf0\x23\x4c\x3d\x7e\x9d\xca\x62\x25\x72\x10\x8e\xbe\x54\x7c\xcc\x71\xc0\x71\x5d\x96\xee\x56\xf2\x98\xd3\x7b\xe9\xaf\xf3\x25\xd7\xb7\xf1\xf5\xd1\x48\xc3\xeb\x6a\x27\x44\x94\x30\x4f\x65\x69\x16\x39\x08\x6f\x4d\xd4\x4d\x0c\x44\x48\xbe\xe0\x9f\x98\x5b\x6d\x7f\xf6\x41\xa8\x5c\xd9\x70\x77\x82\x6e\x33\x84\xab\x92\x8b\x08\x73\xe1\xe1\xa9\xdc\x5a\x25\x89\x1c\x84\xcf\x1c\xb1\x2c\x06\x3d\x89\xcb\x76\xec\x68\xbf\x75\xa3\xf1\x10\xd5\xe0\xb7\xe5\x2b\xc1\x1e\xdd\xdd\x75\x0b\xcd\x97\xc5\xdc\x29\x15\xa7\xd2\xda\x13\x56\x84\x45\x6a\x65\xe7\x2d\x65\xcf\xe9\x99\x9b\xe5\xe8\x79\x8e\x4b\x7e\x8d\x11\x4d\x0d\x0a\xf0\xa2\x10\x77\xfc\xe6\xde\x3d\xb3\x35\x75\x6a\x41\x18\x24\xd1\x49\x23\x9f\xcd\x0f\x59\x69\xe9\x54\xc9\x94\xce\xca\x97\x87\xb1\x55\xbf\xa4\xf5\xd0\x8f\x57\xf9\xe7\x44\x92\x68\xbc\xce\x3b\x62\xf7\xe8\x91\x20\x7a\x7c\x10\x07\x1f\xf9\x54\xc7\xf9\x04\xa4\xca\x0e\x78\xf9\x7b\x0a\x1e\x95\x0c\x18\xbe\x7d\x11\xb8\x81\x3f\x9b\x3f\xce\x20\xc4\xe0\xed\xe2\x6e\xe3\x3d\x81\xa8\x0b\xe2\xe0\x23\x5f\x65\x73\xda\xaf\x1e\x75\xd3\xe1\x0b\xbe\xd7\x27\xe7\x6d\x63\x6f\xa5\xdd\x9a\xa2\xd1\x8d\x71\xc4\xf6\x34\x7f\xc7\x6a\x98\x52\x4c\x8f\xa8\x0b\xe2\xe0\x23\xdf\x42\xfc\x3d\xc1\x40\xdb\xd1\xa2\xe7\x9d\x21\xcc\x7b\x0f\x56\xaa\xb7\x37\x86\x53\x59\x98\xb7\xe9\xf1\x82\xbe\xbb\x1e\x46\xef\xd7\x23\xea\x82\x38\x78\x5d\x93\xe0\xca\x42\x54\xb6\x07\x6f\x39\xb4\x7b\x9b\x7c\x50\xd7\xbd\xb2\x94\x6e\xa7\x48\xc5\x5a\x90\x5f\xa4\x95\x37\x1a\x19\xd2\x89\x43\x04\x61\x10\x07\x9d\x11\xfe\x7b\x10\x06\x7d\xa1\x4f\x52\x40\xf0\xf7\x6e\x6b\x7a\xbb\x51\xbe\x14\x41\xde\x40\x01\xde\x65\x9b\xbb\xeb\x0f\x72\xf4\x2e\x0d\x96\x95\xdb\xa2\x75\x74\x69\xe1\x94\x23\x9a\x0e\xe2\xe0\x0a\x6c\x7e\x7d\xeb\x78\xe1\x53\x7c\xe3\x5d\x97\x4f\xe7\xc7\x58\xcd\xad\x49\x07\xa3\x8e\xe8\x52\x54\x1a\x93\xe5\x6a\xde\x6b\xdf\x53\x83\x76\xc7\x83\x38\xb8\x02\x24\xb2\xad\x2e\x63\xcd\x91\x6f\x59\xd6\xcf\x79\x5e\x24\x79\x86\x87\xce\xb2\xeb\xe6\x50\x9c\x5c\x74\xa8\xea\xdf\x41\xdf\xa3\x07\x5d\x1c\x0e\xe2\xe0\x7f\xaa\xb3\x93\xf1\x2f\x73\xf5\xb2\x19\x03\x4d\x84\x28\xc4\xca\x79\x71\x6a\x7d\xdf\x4b\xdf\x36\xb5\x88\xd0\x12\xe2\x71\x29\x77\x51\x7d\x8e\xa8\x0b\xe2\xe0\x75\x5b\xa2\x8f\x88\xc3\xa5\x87\xd6\x7e\x7b\x46\x91\x3c\xd2\x2f\x54\xd5\x5c\x24\x4b\x34\x8c\x72\x72\xf1\x49\x25\x44\xc5\x89\xe2\xc4\x47\x4c\x7e\x40\x1c\x74\x36\x10\x10\x84\x41\xbd\xeb\x89\x67\x84\x31\xe5\xd9\x6b\x31\xe9\xf7\x66\xdf\xbf\xbc\xb4\x86\xca\x4a\x98\x30\xf6\xb6\x5b\x5d\x10\xaf\x44\xa5\x76\x64\xeb\xbd\x6a\x7e\x27\x14\x2a\x00\x1c\xdc\x01\x8b\x0c\xbf\xc8\x87\x3d\x7a\xab\xd7\x0c\x37\x2f\x88\xf1\x75\xfc\xdc\xbf\xdf\xff\xdd\x94\x25\xaa\x9b\xe1\xc2\xad\xae\x35\x12\x73\x68\x85\x15\xc4\xc1\x1d\x88\x34\xfd\xe5\xb1\x74\xb0\x4d\xac\x96\xa8\x7c\x28\x35\x5d\xa1\x3e\xf0\xfc\x4c\xd1\xd3\xb5\x12\xf5\x37\x12\xed\x7c\x65\x55\x3f\xb0\xa0\xc0\x0a\xe0\xe0\x7f\x2b\x3e\xf7\xf9\x98\xb4\xc7\xc1\xf6\xfb\x5f\x26\x47\x78\x43\x5f\x92\x93\x4d\x6e\x14\xcd\x9f\x59\x6b\x21\x8e\x9f\xc3\x31\x7c\xa3\x02\x05\x6c\x10\x07\xaf\x2b\x31\x75\x21\x35\xa7\x44\x69\x0d\xbd\x60\x9d\x51\x97\x89\xfc\x42\x27\x99\xdb\xa5\xf1\x24\x2f\x8e\x17\x4b\x53\x49\x56\xa4\x9f\x14\x11\x0e\x80\x38\xe8\x6c\x20\x20\x08\x83\x86\xba\x93\x1c\xf8\xfa\x9d\xcc\xf8\x99\x6b\xea\x6a\xd9\x5a\xf4\xb5\x70\x8c\xbb\x96\x73\xbf\xc4\x8d\xeb\x99\x07\xc9\xa4\xc2\x16\x1a\x09\x63\xf5\x72\x10\x6d\x07\x71\x70\x07\x34\x88\x22\x73\x16\x55\x55\x97\x79\x76\xc9\x38\x48\x3f\x7b\xbf\x63\xa9\x8c\x57\xad\x7f\x9b\x46\xf1\x34\x95\xa5\x9e\xe1\xc0\x08\xfa\x5b\x81\x38\xb8\x03\x0f\x4d\x66\x52\x67\x6a\x1f\x61\xfb\xf5\x97\xa4\xde\x9b\xcf\xfd\x21\x6a\x14\x35\x34\x54\xcf\x5c\xf7\xf3\xec\xf3\x58\xac\xf4\xad\x43\x44\x5d\x10\x07\xff\x5b\x31\xbf\xe7\x9f\xb3\x6e\x73\x93\xd8\x6d\x28\xff\xfe\xa6\x3b\x8d\x88\x90\x87\xea\xd0\xeb\xe3\xd5\x26\x0a\x1a\x1f\x8f\xfe\xa5\x4a\xe8\x0d\x59\x10\x07\xaf\x8b\xbf\x1e\x5b\x72\xf8\x8c\x72\x30\x81\x17\xe7\x75\xba\xb1\xc3\xfd\x02\x65\xa2\x39\x7b\x9f\x4f\xd8\x1a\x54\x5b\x0f\x5b\x7e\xd0\xcb\x23\x1c\x00\x71\x50\x3f\x00\x08\xc2\xa0\x79\xc7\x49\x0e\x38\x31\x10\xd0\x5c\xda\x48\xa1\x77\xc3\x68\x40\xc5\x5b\xf2\x2f\xfe\x32\x4c\xee\x16\x81\x4e\x22\x2c\x7a\xc9\x9f\xa8\xcb\xff\x00\xba\x80\x0c\xc4\xc1\x1d\xb0\x2f\x7e\x16\x28\xcb\x65\x22\x4e\x7c\xa7\x59\x8a\x3f\xfd\x4e\x52\xe0\xa1\xc2\x68\x40\x37\x96\x73\xba\x44\x67\x50\x61\xf7\x39\x68\xe5\x16\xc4\xc1\x1d\xa0\x33\x13\xb1\xbb\x71\xa1\x5a\xe1\xf8\xaa\x64\x48\xf7\xf8\xf1\x37\x8b\x42\xab\xcb\x6f\x50\x07\x9e\x09\x26\x47\xcd\xf5\xda\x6c\x0f\x21\xea\x82\x38\xf8\xdf\x6a\xf7\x82\x34\x4a\xa8\xd6\x79\xc1\x60\x8b\xd9\xdd\xd1\x1e\xa1\x2b\x39\x85\xa6\x1c\xcc\x81\xd5\x14\xf7\x36\x0e\xab\x8b\xbc\x34\xa1\xf5\x01\x10\x07\xaf\x7b\xe3\x06\x63\xb9\x53\x99\x8b\x03\xad\xc6\x5e\x84\xeb\x52\x42\x78\x2d\x2f\x25\x5a\x91\x03\x9f\x6e\xfd\x38\xbe\x45\x5b\x5e\xed\x5d\x84\x03\x20\x0e\xea\x07\x00\x41\x18\x14\xa2\x4e\x0e\xc2\x03\xe1\xd3\x97\x3f\xe9\x79\xdc\x39\xac\xcf\x39\xac\xf8\xa0\x35\xfe\xe4\x9d\x39\x0f\xef\x24\x9b\x7e\xeb\xbe\x4b\xa1\xfa\x73\x2b\x42\x44\xa8\x04\x71\xc8\x41\x58\x8d\x6d\xd9\x3a\x88\x7d\xf2\x13\xa1\x54\x94\xd7\xbd\x9a\x40\x3c\x7c\xac\xdd\xef\xe9\x23\x9f\x88\x57\x0e\xf2\x72\x53\xf7\xb4\x42\x11\x95\x41\x1c\x72\x10\x4e\xb5\x96\x93\x5c\xe8\xa1\x0a\x90\x9f\x6a\x14\x72\xc3\xe4\x4f\x61\xc0\xd4\xeb\xa7\xd0\x2a\x69\xeb\x66\x21\x0e\xc3\x0f\xd2\xcf\x81\xc2\x3b\x80\xf3\x94\x41\xc1\xf8\x67\xe5\x7f\xfd\x8e\xf0\x34\x97\x1b\xed\x72\xa9\x44\xe4\xd9\x5f\xa4\x3f\x02\xd9\x95\xb3\x72\x4a\x73\xef\xec\x8d\xa9\x14\x6f\x54\xae\xcc\x4d\x6a\x48\x18\xfd\x19\x84\x73\x15\x8b\x7f\x46\x7f\x39\x5b\x10\xc8\xbe\xfb\x09\xed\x48\x4d\x3a\xd4\xfd\x8d\xf6\xdd\x8d\x4a\xad\xc2\x98\x4e\x2a\x8e\x89\xd6\xfd\x3f\x37\x2b\x2e\x07\x3d\x9c\x60\x55\x6b\x26\xff\x25\x9b\x1b\x27\x79\xe9\xce\x05\x05\xae\xde\x40\x82\x44\xcf\x2d\x65\x25\x5a\x71\x82\x67\x4c\xff\xb5\x20\x0c\x6a\xda\x9f\x67\x84\xe5\xe0\x61\xe9\x55\x23\xea\x59\xdc\x4c\x92\xdb\x46\xd8\xda\x36\x21\x65\xb3\x33\x0a\xa3\xf7\x9f\xda\xb8\x74\x1f\x57\x53\xb6\xe8\x69\xe1\x04\xff\xff\xf9\xd5\xff\xdf\x8b\x95\xc8\x41\x58\xec\xba\xca\xdc\xc3\x9e\x37\xeb\x54\x19\xd3\x5f\x39\xba\x13\xea\x84\x2f\x6b\x56\xa6\x8b\x5d\x8b\x12\x7e\x48\x1d\xf8\x69\x56\xc9\xfa\x54\x96\x66\xc5\x91\x7e\x6c\x8a\x3c\xa9\x6a\x33\x15\x5a\x0e\xf1\x8d\x76\xd4\x78\x99\x17\xc5\xf8\x3b\xfd\xc3\xe7\x4d\xe8\x83\xa9\xb4\x50\x95\x19\x6f\x94\x09\x9d\x4a\x6b\x91\x83\xb0\xd6\xd9\xb3\x57\xbc\x8c\xc9\xd0\x9e\x87\x5c\xfd\xed\x28\xab\xd5\x74\x59\xf6\xdd\x2b\x8c\x23\xab\x67\x11\xa5\x6f\x5f\xa5\x56\x28\x3e\x39\x95\xd6\x3e\x45\xfa\xb1\x37\xd8\xba\x3e\x57\x0e\x3f\x61\x55\x53\xd2\xe6\x4e\xa0\x9f\x79\x14\xc0\xd9\xca\xea\xba\x3b\xf3\x56\xad\x53\xa4\xc9\xd5\x95\xef\x14\xd6\xbf\xb5\xff\x9d\x44\x27\x5e\x17\xeb\xfe\x94\x4a\x28\x04\xfd\x89\xf3\xf3\x96\xaf\xe4\x55\x8c\x38\xbe\xbe\x4e\x58\x93\x2f\x2d\xcb\xaa\x7b\x0a\x33\x65\xdd\xe6\x15\xa1\xeb\x62\x01\x1c\x7c\xe4\x4b\x3b\x36\x2e\x94\x79\xab\xfd\x74\xa5\xfc\x57\xb2\x24\x5d\xd8\xe1\xcc\xe2\x6f\x8c\x29\xfd\xf5\x88\x66\xe7\x20\x32\x7b\x63\x1d\x4a\x44\x5d\x10\x07\x1f\xf9\xde\x7f\x1c\x0a\x9d\x61\xc9\x11\xae\xa8\x17\xba\x75\x0f\xcf\xa9\xc4\xf5\x95\xf6\xeb\x64\xb2\x2a\x02\x09\x7a\xe5\x97\x12\xb6\x0c\xd0\x65\x59\x20\x0e\x3e\x42\x25\x39\x14\xf0\x28\x5a\xe7\x1a\x2d\x5c\xe6\x6d\x60\x0b\xe5\xc6\x9a\x43\x7d\x5e\x25\xc4\x85\xd9\x6d\xdb\xf0\xbc\x81\x80\xdd\x70\x14\x51\x17\xc4\x79\x4a\xa1\xa0\xfd\x63\x4c\x99\x2f\x7d\xb6\xda\x11\x43\x30\xbe\xa4\xc1\xbd\x7c\x21\xe9\xec\xf5\x04\x0f\xf3\x10\xda\xa9\x3a\xbc\x7d\x2f\x91\x77\xc4\x4f\x55\x10\x41\x18\xc4\x41\x67\x84\xe5\xfe\x3a\xf9\x01\x7d\xa1\x4f\x52\xc0\x94\x0d\x6d\xd5\x56\x00\xaf\xc7\x95\x38\x78\x5e\x9b\x9f\x73\x05\x67\x20\xb5\xc0\x91\x3a\x62\x9e\x23\xfd\x07\xa5\x07\x93\x41\x28\xa2\xe9\x20\x0e\xae\x80\x23\x6f\xe9\x8b\xeb\xdf\x53\x8a\x63\xca\xbc\x55\xe2\xac\xf4\x71\x6d\xd8\x6f\xca\xcf\x87\xee\x56\xa2\x8d\x79\x38\x8d\x8a\xb4\xae\x22\xea\x82\x38\xb8\x02\x3d\x6a\x0e\x16\x22\xa4\x94\xe6\x44\x8e\x64\xe1\x41\x71\xcb\x07\x8a\x78\xbe\x61\x82\xdd\xb1\xa9\xc1\xf5\x61\xcb\xfa\x7a\xfa\x0d\x88\xba\x20\x0e\xae\xc0\x8f\x27\x82\x49\x53\xb2\x91\x68\x99\x2d\x5b\xc1\xfb\xf8\xd3\x43\xe4\x4c\x0f\x2e\x37\xa6\x95\x35\x7f\x92\x36\xb6\x43\xdd\xaa\x87\xb6\x05\x82\x38\xb8\x02\x0a\x56\x0b\xab\x83\x55\x5d\x2d\xed\xa5\x01\xfa\xba\x92\xca\xa1\xb9\x91\x6d\xac\x1c\x35\xb2\x04\x09\x44\xf8\x9a\xd3\xce\x53\x36\x88\xc9\x0f\x88\x83\xce\x06\x02\x82\x30\xa8\x77\x3d\xc9\x81\x19\x0a\x7d\x8d\xf8\x22\xf2\xa1\xa3\xed\x60\xa5\xed\x62\x8b\x2e\x0d\x85\xd1\x4b\x2a\x25\x6f\x70\x39\x6b\xbf\x8e\xf3\xd6\x4d\x43\x17\x0f\x81\x38\xb8\x03\x0b\xa8\xec\x37\x1e\x54\x55\x92\x24\x6f\x86\xd5\x67\xbf\x39\x97\xc7\x6a\x45\x4e\x60\xb3\x8d\x21\xf1\xc6\xd4\xfa\x69\x61\x10\x9f\x26\xf4\xff\x25\x00\x07\x77\x60\x9b\xaf\x1d\x2b\x8e\x9f\xfd\xc1\x21\x13\x4f\x33\x53\x52\x29\x71\x6f\xee\x6f\x2f\xfc\x5f\xf2\xe3\x23\x37\x09\x70\xa6\xeb\xb0\x7e\x23\xea\x82\x38\xb8\x03\x64\xc4\xb7\x7c\x3f\x72\x63\xf3\xb8\xf5\x4e\xae\xbb\x92\xb7\x7a\x59\xa3\xf7\x1e\x05\x79\x15\x29\x8f\x7f\x2f\x6b\x0f\xda\xb7\x81\x9e\xe6\x02\x71\x70\x07\xfa\xbd\xc3\x3d\xe5\xf5\xce\xf0\xb9\xdd\x61\xd5\x58\x66\x10\x48\xa7\x5d\x6a\x6f\xde\x10\x0e\x1a\xbb\x1b\x24\x61\x3f\xe5\x8c\x2a\x83\x70\x00\xc4\x41\x67\x03\xc5\xff\xee\x00\x68\xa8\x3b\xc9\x01\xa3\xf7\xd9\x6d\x1c\x87\x57\x3f\x8c\x17\xbc\x0e\xc5\x50\xd1\xc6\xc9\x3e\x53\x19\x5a\xee\x7d\xa6\x8c\x99\x2c\xcf\x80\x56\x06\x1d\xba\x34\x0f\xc4\xc1\x1d\x70\x72\xcb\x16\xd1\x8a\xae\x50\xb4\x91\xc3\xcb\x6e\x68\x1a\x5a\xdd\x42\xe3\x1f\x6e\xb6\xb5\xdf\xc7\x5d\xc0\x8f\x92\x5e\x5d\x5a\x80\xc2\x15\x80\x83\x3b\x60\xf1\xf1\x75\x9b\xd1\xc7\xb6\xdc\xcd\x79\x3b\xf1\x84\xdc\x2f\x17\x5d\x54\xbd\xf2\xc6\xce\x3f\x0b\xaa\x1c\x1c\xe5\x15\x42\xad\x87\x2e\x4a\x02\x71\x70\x07\x7c\x14\x9c\xd3\xf8\xbf\x35\x9e\x5b\x28\xad\x7a\x58\x12\xf4\x81\x2d\x85\x51\xee\x0d\x4f\xb4\xc9\x98\xda\xc4\x8e\x77\x0b\xe3\x18\x14\xae\x40\x1c\xdc\x81\xe7\xb7\x1f\x24\x29\x3b\xe5\xb3\x5f\x66\xc7\xf2\xdd\x0a\x3b\x4e\x5b\x10\x49\x40\x6b\x68\x0f\x7d\xff\xa9\xec\xfc\x92\x42\xd6\x06\x26\xc2\x01\x10\x07\xf5\x03\x80\x20\x0c\x9a\x77\x9c\xe4\xc0\xbd\x4f\x2b\x8f\x65\x65\x97\xcd\xf5\x63\x98\x3e\x1f\x10\x3d\x17\xbc\x29\x62\x20\x4a\xd7\xab\x74\xa0\x3b\xe4\xd7\x1f\xff\x94\x05\x1a\xb6\x41\x1c\xdc\x01\x5f\xc1\x0b\x5f\xcb\xbf\xe0\xaf\xa4\x79\x6d\xcd\xc5\xd7\x89\xd0\x6c\x93\x64\x1d\x77\x27\xfd\x7e\xda\xa2\x2e\x68\xa3\x66\x8d\x0a\xed\x36\x00\x71\x70\x07\x9e\x5e\x40\x91\x48\xf8\xc2\x4d\xa3\x21\xb9\xbe\x5c\x67\x90\x7b\xff\xc1\x0f\x35\xfc\x10\x93\x3b\xb3\xb7\x42\xdb\x14\x4d\x02\x89\x46\x10\x75\x41\x1c\xdc\x01\x8e\x90\x9e\x47\x1f\x67\xee\xfe\xfc\x20\x4c\x22\x44\x72\x9c\x45\xd9\xac\x47\x2d\x7e\x4f\xbb\x19\xbf\x44\x3c\x98\xb3\x9b\x7b\xe5\x7f\x17\x3d\x02\x38\xb8\x03\x5d\x6b\x3b\x35\x5b\xd5\x14\xb7\xd6\x82\x9e\x1d\xfb\xc5\xdd\xf6\xd5\xe1\x5e\xa3\x0e\x8c\xe0\xa3\x1d\x71\x6a\xef\xf4\x65\xe0\x82\xb6\xc7\x83\x38\xa8\x1f\x78\xfa\xf7\x20\x0c\x0a\x51\xff\x8f\xad\xd1\x3f\x47\x36\x2b\x6a\x7c\x8b\xce\xa6\x04\xe4\xe4\xd8\x79\x96\xd1\x39\xac\x78\xb0\x46\x28\xcc\x72\x16\xd0\x57\x5f\xff\x7c\x77\x0e\xda\x1a\x0d\xe0\x90\x83\xf0\x64\xd0\x32\xc6\x3d\x6a\xfb\x5b\xd4\x3a\xcf\xad\x57\x99\x98\xd4\x0f\xb2\x07\xcc\x7a\xb7\xbe\x39\xf9\xdc\xe9\x7f\x7c\x3f\x75\x23\x10\x51\x19\xc4\x21\x07\xe1\x5b\xb5\x7c\xfb\xb4\x3d\x81\x4d\x9d\x7a\x9d\xec\x51\x72\x2c\x2f\x2a\x1e\x5c\x50\xca\x7f\x2e\x48\x79\x43\xfe\x7b\xda\x16\x4b\x1c\x1e\xa2\x32\x88\x43\x7e\x98\xe9\x5f\xbf\x23\x3c\xaf\xa7\xe0\xfe\x48\x40\xf0\xea\x81\x2a\xf9\x00\x1b\xae\x02\xb7\x27\xfa\x27\x93\x1c\xed\xc5\x60\x1a\xb9\x24\x85\x0e\xd9\xfa\x90\x3f\x83\xf0\x43\x31\x9e\x8f\x2d\x16\xd3\xae\xf3\xf5\xfc\x1f\xe5\x03\x8f\x8f\xfc\x4a\x08\xd8\x18\x09\xa8\xd6\x5b\xbe\xd7\xf4\x93\x92\xc6\x5c\xfe\xb3\xdf\x08\x51\x55\x4c\xfa\x42\x2b\x9e\x68\x40\xfd\xa3\x76\xc9\x79\x29\x1c\x83\xf0\x4c\xdc\x2b\xb7\x26\x34\x39\x85\x7d\x87\xea\x84\x27\xff\xb5\x20\x0c\x6a\xda\x9f\x67\x84\x91\x82\xf0\xc0\xa3\x85\x3c\xde\x3d\xd7\xf4\x2a\xc5\x78\x37\x06\xe3\xfb\xb5\x28\x9e\xf5\x28\xe7\xe8\x3f\x77\x30\x99\xf2\xdf\x25\xf0\x3d\x58\x3a\x95\xc5\x4a\xe4\x20\xbc\xfd\xf1\x65\xa0\xec\x66\x6d\xf7\x8d\x59\xb4\x4e\xf6\x1b\x22\xbb\x0f\x82\x16\xe6\x63\xec\xdd\x34\x35\xf8\x8e\x38\xdf\x6f\x58\x3e\x3d\x95\xa5\x59\xe4\x20\x6c\x98\x4c\xa8\x25\xa4\xea\x2e\x43\x68\xbe\xc7\xcb\x61\xf5\x35\x24\x51\x8c\xff\x1a\x79\x6e\xfb\x6b\xd6\xbc\xc1\xbb\x3e\x2b\xfe\xe5\xa7\xd2\x5a\xe4\x20\xcc\x4d\xd6\x77\x55\x99\x74\x5e\xb5\x80\xef\xe2\xfd\xa7\x91\x95\x26\x72\xfe\x1e\x2c\x1d\x43\x1f\xd4\xc4\x3e\xbd\x6d\x79\x8c\xad\x72\x0a\x87\x75\x03\x65\x24\x91\x83\x70\x55\x50\xc2\xeb\xee\x9d\x75\xdf\xbe\x7b\x64\xb3\x6f\xe4\x0d\x57\xb6\x38\xd6\xb0\x51\x88\x36\x5d\xe2\xf0\x68\x17\xa9\x6f\x8c\x25\x9d\x5a\x10\x06\x49\x74\xd2\xc8\x87\xda\x85\x45\xf8\xb5\x69\xcb\x28\x59\x4f\x18\x47\x84\x34\x29\xc8\x35\x0f\xb5\xd6\x68\x26\xce\xa3\x57\xbe\x9a\x37\xfe\xfa\x01\xf4\x5e\x08\x88\x43\x4a\x41\xea\xd9\x97\x74\x18\x62\x09\x9e\x9b\x7c\x2b\xdc\x98\x0f\xd8\x23\x2e\xe9\x88\x1f\x5b\x1a\xc7\x63\x7b\x44\xed\xca\x12\x14\xf2\x09\x4a\x41\x00\x0e\x3e\xf2\xbd\xd5\x1b\x72\x61\x23\x3e\x8e\x79\xdb\xee\xdc\x3c\x45\x72\xa6\x7b\xae\xaf\xc2\x6a\x80\x79\x65\x88\xd7\x24\xde\x8f\xce\x6a\x11\x9a\xa5\x80\x38\xf8\xc8\x47\x3a\xc3\x77\xce\x7b\x4d\x30\x08\xef\x8e\xf2\xa5\x52\x8d\x94\xd9\x7b\x72\x13\xf3\x16\x0e\xe2\x85\xb8\xc5\x0f\xee\x63\x75\x68\xee\x23\xea\x82\x38\x4f\xa9\x7f\xbe\xc6\x5e\xbc\xa8\xf2\x82\xaf\x7b\xcd\x3a\xc2\x81\x5c\x38\xe9\x76\x88\xab\x96\x7f\x31\xf5\x1b\x9b\xd9\x77\x07\xc3\xd5\x02\x2f\x77\xa9\x8e\x10\x41\x18\xc4\x41\x67\x84\xff\x1e\x84\x41\x5f\xe8\x93\x14\x48\xac\x16\xd2\x10\xc3\x0c\xe3\xe0\x92\x43\xbd\x2f\x7e\x09\xc7\x76\xf4\x03\xa1\x4b\x5a\xce\x33\x05\xff\xcd\xd7\xf7\x32\xee\x86\x41\x67\x63\x41\x1c\x5c\x81\x43\xae\xf7\x8f\xd4\x0c\xbe\xc6\xa5\x88\xc9\x7f\x65\x45\xb7\xf4\xd5\x45\x31\xca\xba\xf4\xba\xec\x26\x45\xd1\x58\xfb\x36\xf3\x53\x68\x35\x10\xc4\xc1\x15\x70\xad\x98\x73\xbf\x33\x7a\xeb\xc0\xb3\x8f\xe8\x4e\x0b\xda\xea\xdc\xea\x20\xe3\xa5\x63\x83\xf7\xde\x9e\x74\x91\xbc\x9a\x09\xe5\x50\x08\x02\x71\x70\x05\x3e\x0c\xb1\x3f\x9b\xb9\xb2\x2b\xeb\xcf\x4c\x5b\x63\xbf\xa6\x68\xb1\xdb\x46\x98\xfa\x3c\xca\xea\x87\x88\xb4\xd6\x44\x70\x15\x45\x29\xa2\x2e\x88\x83\x2b\x50\xc9\xf5\xe4\x38\x95\x16\x4f\x3c\xc7\x35\x02\x7d\xd3\x78\x82\x40\xe2\xa6\x41\x2a\xde\xee\x81\xb0\x9a\xed\xe2\xdd\x0b\xd1\x9e\x4a\x88\xc9\x0f\x88\x83\xce\x06\x02\x82\x30\xa8\x77\x3d\xc9\x01\xf4\x69\xf3\x18\x31\xbb\x71\x35\xc9\x8c\xd0\x5d\x9b\xcd\xbb\xb8\xb2\x98\x17\xab\x5c\x35\x53\x24\xa9\x97\x0a\xe2\xdd\x7d\xfe\x77\x67\x1e\x88\x83\x3b\xd0\xb1\x86\x4a\x2d\xd4\x22\x24\xaa\x4f\xda\x79\xf8\xd6\xdf\xfe\x2d\x67\xd5\x3b\x75\xc5\xbd\xb4\x0e\x59\x73\x4f\xc5\xd1\x27\x67\xb5\x11\x75\x41\x1c\xdc\x81\x86\x3a\xc3\x20\x36\xc3\xe4\x0b\x71\x47\x13\x98\x72\x73\x6d\xf2\x1f\x1a\xd5\x64\xeb\xaa\x6a\xab\x26\x06\x0c\x55\x52\xed\xbf\x8b\x22\xea\x82\x38\xa4\x5d\x01\xb4\xca\x1d\xfd\x3e\x9d\xa5\xb9\x6a\x65\x36\x1f\xd7\xb4\xfb\xdf\xd3\x2e\x12\x90\x95\x6c\xd1\x92\x69\x49\x5e\x55\x56\x38\x76\x85\x76\x05\x00\x38\xb8\x03\x3b\xb8\xbf\x6f\xe8\x08\x2a\xd4\xa0\x8c\xb0\xad\x5a\x10\xb0\x15\x95\xd9\xbe\x15\xbc\x78\x84\xd2\x89\x5a\xf4\xb1\x8c\x70\x98\xfb\x12\xf4\x6c\x0a\x80\x83\xce\x06\x02\x82\x30\x68\xa8\x3b\xc9\x81\x03\xdc\xc9\x58\x23\xd4\xda\x5d\x1e\x51\xfd\x91\x41\x0a\x94\xcf\x8c\xf6\x1e\x5f\xfd\x48\xb8\x62\x9a\x68\x88\xa4\x5e\x1a\xb8\x55\x42\x17\x04\x01\x38\xb8\x03\x97\x0c\x1c\x45\x75\x29\xe4\x13\x86\xea\x7f\xb7\xaa\xfa\xbf\xeb\x34\x13\x51\xb6\x5f\x66\x08\x91\x70\x7e\x39\xcd\xf3\xa9\x81\x19\xda\x74\x04\xe2\xe0\x0e\x3c\x53\xeb\xb7\x08\xbf\xf8\xa0\xf6\x9e\xf2\xec\x35\x5b\xf4\xeb\xbe\x6b\xad\x5f\xa2\x46\x77\x7a\xc2\x08\xab\x5f\xf4\xfc\xec\x72\x82\x42\x1b\x88\x83\x3b\xa0\xda\x7b\xc4\x21\x86\x69\x5c\x3c\xc1\xba\x49\x8e\x2a\xb2\xbb\x23\xa1\x7c\x73\xaf\x66\x8f\x96\xb8\xbd\xfb\x7a\x4a\xd6\xce\x4a\x06\xb4\x99\x09\xc0\xc1\x1d\xf0\x22\x3a\xe8\xf4\x2d\xbf\xf1\x71\x85\x50\xa1\x61\xa3\x79\x3b\x1f\x9f\x98\xa1\x4f\x50\xab\x0c\x43\x5f\x52\xe2\xe5\x9e\x71\xa4\x24\xc2\x01\x10\x07\xf5\x03\x80\x20\x0c\x9a\x77\x9c\xe4\xc0\xb3\xaf\xdf\x02\x5d\xf5\x14\x98\x54\x1c\xa6\x5e\xdf\xbe\xc8\x5c\xc8\x41\x7d\x5e\xa4\xfd\xa3\x90\xa8\xfd\x4d\xfa\xe2\x19\x13\xa9\x36\xe8\x33\x05\x70\x48\x63\x01\x7a\xe0\x23\x87\xed\xb8\x75\x46\xa3\x4c\xfd\xf3\xa6\x5b\xe5\xdd\x5b\x68\xa8\x1b\x02\x15\x3c\x22\x3a\x09\xe8\xfd\xe6\xdb\x1c\xd0\x58\x00\xe0\xe0\x0e\x08\xbb\xa2\x1c\x09\x06\xdc\x7a\xf0\xdb\x51\x4d\x40\xb0\x88\xbd\x8f\x7b\x77\xea\xed\x6b\x25\xb4\x0f\x05\xef\xfa\xed\x70\xcd\x66\xa0\x69\x06\x88\x43\xda\xc8\xf5\x3e\xea\xc7\x0b\x8f\x79\x35\xee\xef\x4f\xee\x5b\xe9\x46\xf6\x0a\x6e\x8d\x2d\x9f\x5b\x1c\xa0\x7c\xca\x75\x93\xfe\x8c\x9d\xc2\x30\xa2\x2e\x88\x83\x3b\xe0\xa7\x90\x7e\x31\xcc\x37\x23\x30\xe6\x2d\xaf\x76\xf9\x4a\x9c\x87\x46\x5d\x34\xae\xbd\x7e\x9d\x7c\xc7\x43\x95\x88\xa4\x52\x21\x68\x7b\x3c\x88\x83\xfa\x01\x40\x10\x06\x85\xa8\x93\x83\xb0\xd7\x3e\xa7\xb7\x18\x66\x79\xec\x80\xd5\xef\x86\x75\xff\x62\xdd\x7c\x22\x26\x29\xb4\xa0\xe8\xda\x05\x15\x21\xac\xc1\x80\xee\x10\x44\xa8\x04\x71\xc8\x41\x98\x7a\x4d\x92\x7c\xed\xc9\xf5\x22\x15\xff\x8c\xfc\xa4\xa0\xe4\xdf\xa3\x5c\x8f\xd8\x9c\x49\x06\x99\xe6\x2e\xf0\x79\x27\xea\xd9\x41\x77\x3b\x83\x38\xe4\x20\x2c\xb8\xbe\xba\xb1\x5f\x5b\x7a\x26\xb3\x91\x63\xfa\xe0\x05\x57\xeb\x02\xff\x6a\xa6\xde\xe3\xaf\x0a\x4e\x82\xd2\x1a\x4f\x2e\x87\x5a\x23\x2a\x83\x38\x4f\x99\xff\xfb\x24\xff\xac\xfc\xaf\xdf\x11\x7e\x70\xd1\x4f\x18\xc7\x7a\x6e\xd0\x2a\x32\x46\x94\xc4\x96\x79\x6e\xc6\x6b\xd4\xb4\xbc\x59\xc1\xd2\x30\x6c\x27\xb4\x8d\x7e\x8f\xe7\xcf\x20\x1c\x3a\xa7\x35\x44\x18\x70\x80\x19\x1c\xc4\x67\xcf\xb0\xb5\xd2\xd4\x7e\xed\x75\x7c\xcb\x1b\xfa\x14\x43\xe3\x20\x1b\xad\x3a\xce\xf3\x7f\xa0\xd9\xcd\x04\xde\xbc\xda\x87\x9d\x7b\x83\x4b\x56\x3d\x17\x93\xcf\xef\x2f\xa9\x1f\x34\x04\x1f\xe7\x4a\x65\xd8\x88\x39\x5f\xd3\x4d\xff\xaf\x05\x61\x50\xd3\xfe\x3c\x23\x8c\x14\x84\x79\x44\x5e\x9d\xa7\xa9\xa5\xfb\x7c\x41\x51\x8b\xc5\x4f\xaf\x4f\xda\xb9\xde\x2f\x2e\xfa\x4d\xb0\x9c\xf3\x6a\xed\xbd\x2a\xbb\xd2\x9c\x53\x59\xac\xe4\x41\xca\x68\x23\xc7\xbf\x4b\xeb\x87\x5f\x51\x95\xdb\x47\xd0\x7d\xdd\xde\x58\xfd\x66\xff\x3d\x23\x21\x76\x93\xc7\x59\x45\xdd\x84\x97\x5f\x89\xfa\x54\x96\x66\x91\x83\x70\x8f\x42\xf6\x6f\x1d\x2b\xdc\x1f\x12\x4a\x8f\xb4\x0c\x8d\xc5\x6f\x30\xef\x95\xe3\x7d\xe6\x58\x7d\x6c\x30\x40\xde\xca\x93\xd0\x5d\x73\x2a\xad\xd5\x42\xfa\xb1\x38\x4d\x99\x7b\x3d\x3d\xc1\xf9\xb1\x8d\x0a\xc1\xf7\xb8\x85\xbf\xdf\x50\xc6\x35\xe0\xd6\xaa\x37\x7b\x1e\xfd\x59\x82\xec\xfc\xf2\xde\xa9\xb4\x16\x39\x08\xaf\xa4\xb8\x7c\x08\x0e\xec\x7c\x4c\x89\x3b\xcb\x42\x5e\x7d\xc3\x1a\x63\x91\xdf\x61\xdd\xed\x8a\x99\x82\x08\x9f\x9e\xe1\x9d\x68\x8a\x53\x0b\xc2\x20\x89\x4e\x1a\xf9\x36\x53\xef\x49\xd2\xa5\x14\xf6\xb1\x2d\x0c\xf2\xab\x31\x6d\x5a\xb7\x48\x38\xb7\x63\x8c\x13\x97\x7c\xf4\xe8\xf8\xe6\xf7\xc1\xfc\x3b\xb4\x7f\x15\xc0\xc1\x47\xbe\xd2\xb2\xe9\xe7\xcd\x24\xa6\x89\xec\x51\xb1\x07\x87\x79\x66\xb6\xbf\x50\x5f\x14\x29\x62\x2a\xc7\xbd\xac\xef\x1c\x60\xaf\xb0\x43\x47\xd4\x05\x71\x48\xb3\x9f\xf1\xe0\x60\xaa\xea\xd5\xd6\x0a\x34\x82\xf2\x54\x3b\x62\x16\xe1\x03\xc7\x39\x6d\xa9\xeb\x72\x49\xc1\x8f\xa4\x3e\x96\xf8\xf3\x40\x23\x35\x80\x83\xbf\x6b\x40\xc3\x2e\x50\x8a\x99\x1b\x24\x27\xa0\xe1\x53\xed\xa1\xc4\x64\xa1\x73\xfb\x31\xfd\x73\xf7\xa1\x3b\x9f\x5a\xc3\xfa\xe6\x93\x12\xa1\x95\x66\x10\x07\xff\x7c\xa9\x9b\xca\xf9\xd0\x52\x65\x9a\xf3\xcf\x71\x0c\x57\x50\x4a\xf0\x36\x1e\xd5\x87\x28\x8e\x96\xd2\xac\x85\xb9\x0b\x48\xa0\xec\xbb\x23\x82\x30\x88\x83\xce\x08\xff\x3d\x08\x83\xbe\xd0\x27\x29\xa0\x6a\xd4\x2e\xc4\x19\x9c\x19\x74\x89\x5d\xb3\x23\x83\xd9\x85\x6e\x59\x4d\x54\xf3\xe0\x3a\x53\x50\x42\x59\x17\xe1\x77\xa2\x0e\x6f\x68\xe2\x07\xe0\xe0\x0a\xf4\xac\xc5\xe4\x37\xb7\xa8\xe8\x34\x96\xf0\x35\xa4\xf6\xf3\xcf\xc6\xcc\xee\x59\x4b\x9f\x2d\xa1\xc8\x66\x58\x7f\xa7\x19\xf8\x25\x10\x5a\xb9\x05\x70\x48\xab\x00\xb7\xeb\x0b\xb0\xc8\xaf\x35\x90\x10\x3c\xcd\xff\x80\xd1\xca\x2a\x4d\xe3\xfe\x1a\xe7\x3e\xf1\x45\x63\xc5\xcc\xec\x29\x99\x2e\xe8\x76\x67\x10\x07\x57\x80\x63\x4f\x91\x56\x7e\x96\xad\xe7\x4b\x3e\x06\xe7\xe2\xe8\x35\x1b\x6b\x45\x8e\x70\x4b\x9f\xac\x47\xf5\x99\xb3\x82\xba\x38\xcb\xb9\xd0\x2a\x00\x80\x83\x7f\xbe\xe4\x13\x4f\x03\x8e\x30\x89\x8c\x64\x7d\x62\xfc\x0a\x0b\x9b\x77\x03\x9f\x66\x9f\xd1\x26\x98\xbf\xf0\xfa\xcd\x51\xc1\xb9\xd5\xbe\x57\x88\xc9\x0f\x88\x83\xce\x06\xf2\xfc\x7d\x02\x0c\xea\x5d\x4f\x72\xa0\x7f\x97\x44\x59\x07\x55\x97\xee\x01\x5b\x0d\xf7\x76\x5b\x3a\x26\xa9\x0d\x35\x6a\xec\xc8\x3b\x07\xe9\x3d\x1b\xfa\x6b\xd7\xa5\xa0\x00\x08\xe2\xe0\x0e\x18\xcc\x76\xb0\xb8\xd3\x7c\xa5\xb5\xef\xa8\x0e\xc4\x95\x91\x7a\x70\x1b\xf7\x7c\x2f\x5f\xe2\x6f\x5a\xd9\x00\x05\x5b\x56\xdf\x43\xa8\x7b\x01\x71\x70\x07\x1e\xbc\x90\xef\xd7\x71\xa7\x7b\x79\xc0\x61\xfd\x20\xa1\xa3\x5a\x76\xc1\x9e\x90\xd6\x80\xfd\x78\xb7\x21\xc9\x82\x7f\x37\x99\xcc\x1a\x51\x17\xc4\xc1\x1d\xa8\x54\x4e\x8a\xd6\x7c\x32\x7f\x37\x8f\x49\xbe\xe4\xcb\xf5\x2c\x06\x3b\xfe\x39\x9b\xaa\x57\xca\xcb\xae\x67\x44\x3f\x5f\x55\x0e\x87\x6e\x0c\x06\x71\x48\x97\x10\x49\xc7\xb8\xca\xd1\xbb\xec\xe6\x18\xdf\x66\x60\x30\x89\xac\x19\x4b\x3a\x6c\x2b\x3a\xac\x76\x0e\x66\xe1\x89\x71\x7d\x7d\xe4\x06\x6d\x89\x04\x70\xd0\xd9\x40\x40\x10\x06\x0d\x75\x27\x39\xc0\xd0\x3b\x49\xc2\xb5\xf5\xf3\xbe\x3b\xbb\x3b\x1a\xed\x2d\xd7\x44\x47\x03\x0c\x93\x8c\xf9\xf4\x27\xa1\xa6\xd6\xe6\x66\xd4\x79\xac\x88\xb6\x83\x38\xb8\x03\xeb\x17\x02\x78\x7f\x8a\xe7\x62\x77\x39\xd4\x05\xbe\x37\x5c\x75\x55\x76\x2b\x64\xed\xf9\x84\x42\x76\x35\xf8\x8b\x8c\xaa\x16\xdf\x0b\xe8\x3c\x37\x80\x83\x3b\x30\xe9\xfc\xe8\xe9\x4b\x27\xb2\xa9\xe1\xcc\x5b\xc2\x5d\xce\xcd\xcd\x7b\x0a\x02\x0a\xef\x99\xaf\x2f\xd3\xbf\x68\xb3\x3e\x4b\x7f\x85\x13\x51\x17\xc4\x21\xbd\x78\x27\x17\xe9\x7a\x1f\xed\xc6\x55\x43\xf1\xdd\x27\x1c\xdf\x26\x1a\x96\x5b\x5a\x0e\x6f\x3a\xea\x30\x2a\xaa\x69\x9a\x0d\xe2\x52\x40\xe7\x59\x41\x1c\xfc\xf3\xbd\x9a\x77\x6e\xa9\x5c\x87\x3c\xf9\xa6\xcd\xab\xc8\x97\x72\xd8\xac\x4d\xcb\x44\xe9\x01\x17\xdb\x1f\x5a\x1d\xbd\x7f\x1c\x41\xbe\xbc\x08\x9d\x13\x07\x70\x50\x3f\xa0\xf5\x77\x07\x40\xf3\x8e\x13\x6f\x0e\x2f\x53\x8d\x8b\x6f\xea\xd7\x49\xd9\x2b\xdb\xf3\xf0\x90\x1a\x13\x16\x7a\x42\xa2\x6b\x87\xef\x4b\xaa\x7d\x80\x3a\x6d\x66\x03\x6d\x09\x06\x71\x70\x07\xf8\x04\xc5\x6a\x64\x66\x7f\x5d\x70\x3f\x5c\x7d\xc1\xfb\x12\x43\x73\xd2\xbf\xdf\x80\x55\xe1\xa0\xab\xb5\x43\x8d\x51\x5e\xfa\x2a\x74\x9c\x05\xc4\xc1\x1d\xa0\x3e\xec\x7d\xe8\x1d\x3b\x93\x77\x58\x18\x64\xee\x37\xa5\xfb\x6e\xd3\xb8\xae\x7e\xe9\x1b\x0a\xa9\xf2\xbb\x6d\x37\xcf\x40\x96\xfb\x88\xba\x20\x0e\xee\xc0\x51\xf9\x9a\xb9\x9b\x10\x63\x94\x17\x03\x5a\x49\x97\x4a\x7b\xc7\x5d\xc6\xd0\x21\xfa\xdc\xa3\x7a\xf6\x42\x12\x1f\x2a\x12\x5d\xe8\x1f\x83\x20\x0e\xfe\xf9\x9e\xbd\x6a\xa5\x2e\x80\xde\x9e\x79\x55\x4a\x78\xc3\xa6\xe6\x8a\xdb\x95\x51\xd4\x5c\x5d\x3f\x89\x2f\x61\xd3\xb3\x38\x7b\xa8\x41\xd0\xce\x10\x10\x07\xf5\x03\x80\x20\x0c\x0a\x51\x27\x07\xe1\x25\x8f\xec\x81\x33\x62\x36\x96\x81\x8f\x67\x5f\x6d\xeb\xf5\x86\xdf\xb7\xe4\xbb\x7f\xaf\x3e\x4c\x2f\xbb\x96\x92\x15\x6d\xef\x90\x00\x11\x2a\x41\x1c\x72\x10\x76\x15\xad\xf8\xba\x56\xd9\xf9\x33\xf8\xea\xfd\xbb\x5b\x54\x85\xdd\x1e\xbc\xa8\x93\xfe\xa1\x0a\x3c\x99\x87\x8e\xeb\xd2\x92\x82\x2c\x88\xca\x20\x0e\x39\x08\xef\x75\x11\xcc\x79\x8d\x8f\x74\xe6\xb8\x3c\xb8\x1b\xa6\xbf\x62\x5f\xa4\x6e\xb1\xfd\x7a\xbd\x0b\xd5\xca\x22\xe0\x5b\xfc\x4b\x67\x68\xad\x19\xc4\x79\xca\xa0\xa0\xa0\xfe\xf3\x9f\x43\xff\xf6\x1d\xe1\x04\x69\xd1\xd7\x36\xea\x5e\x5f\xf6\xd5\xd9\x8c\xd2\xb9\x77\x63\x44\xec\x32\xbc\x8d\x92\xd0\xaf\xcd\xbe\x4a\xda\x92\xe7\xba\xb0\xf3\x67\x10\x46\x5f\x3e\x7c\x4b\xf5\x1a\x23\x77\xf8\xbc\xd7\x2b\x6f\xc9\xea\x18\x2e\x7f\x32\x8b\x08\x77\x42\x07\xec\xca\x18\x43\x66\x81\x99\x77\x7f\xa0\x35\x73\xaf\xdb\x13\xfa\xbb\xf6\x1a\xe7\x3f\x66\x6a\x06\xd8\x8e\x7b\x5f\xf9\x2d\x71\x15\xf3\x6d\xf8\xec\xa7\xb1\xf6\x12\xf9\x48\xd1\xff\x5a\x10\x06\x35\xed\xcf\x33\xc2\x48\x41\x98\x01\xc5\x39\xce\xf6\xb6\x6c\x1b\x6a\xa9\xf9\x71\xac\x99\xbb\x63\x8e\x50\x4b\x76\x47\xb5\x8c\xa8\xd0\x99\xbd\x3b\xeb\xb4\x09\xa7\xb2\x22\x2c\x89\x1c\x84\xef\xbf\xf6\xaa\xe4\x5a\x31\x78\xbc\x58\x25\x4c\x88\xbf\xbe\xa5\xd3\x14\x45\x79\xb7\xc9\xbd\x08\xb3\x26\xe5\x7c\xff\x83\x86\x9d\xb6\x53\x59\x9a\x45\x0e\xc2\x12\x1d\x8f\xe4\xfd\x4a\xe8\x16\xfa\xbe\x89\xa0\x14\x56\xb2\xa6\x4f\xaf\xc5\xb6\x96\x8d\xb5\x2c\x28\xf5\xa7\xa8\x86\x33\x52\x9c\xce\x89\x68\xe4\x20\xac\x46\x9a\x7c\xe5\xc2\x6d\x61\xc3\x74\xd9\x15\xc5\x26\xc5\xbb\xee\xc7\xeb\x22\x2f\xdb\x28\x51\x34\x45\x65\x2f\xd3\xcf\x37\x14\x62\x9d\x4a\x6b\x91\x83\xb0\x4a\x8c\x8c\x07\xa7\x2f\x9a\x64\x48\xbd\x85\x27\x91\x5b\x48\xdf\x14\xa9\x71\x94\xdf\xee\x60\xd9\x1b\x17\x03\x2c\x8a\x8e\x5e\xe6\x53\x0b\xc2\x20\x89\x4e\x9c\x01\x8f\xed\x89\x15\x95\xcc\x07\x4d\xb2\x73\x4b\x46\x92\xe3\xf4\xb3\x5a\xc7\xe3\x2e\x50\x2e\x7e\x30\x3c\x66\x6d\xb8\xaa\x2e\x86\x02\xcd\x80\x01\x1c\x7c\xe4\x23\x7d\xb0\x99\xbe\xbf\x49\xf4\xf2\x59\xe8\x45\x94\xc3\x2b\x3b\x31\xe1\xe2\x07\x57\x62\xf4\xc9\xd6\x98\xcf\xa7\x12\x72\xae\x39\xfe\x6f\x85\x15\xc0\xc1\x47\x3e\x74\x06\xad\x78\x43\x1f\x27\x71\x4a\x8f\x49\xd1\xa2\xa2\x3d\xdb\x8f\xe2\x12\x35\xc5\x54\x5f\x1a\x68\x77\xae\x2e\x99\x78\xfe\xb0\x85\x96\xae\x00\x1c\x7c\xe4\xe3\x5b\xad\xe3\xc8\xe2\xfa\xf8\xf3\x87\x52\xcc\x54\x50\x50\xf3\x85\xdb\xe5\x17\x23\x2d\xb9\xc7\xad\xba\xb0\x23\x3b\xbf\xd6\xdb\x29\x40\x23\x35\x80\x83\x5f\x3f\xf9\xf5\x5d\x4e\x51\xd9\xdb\x97\xeb\xb4\x78\x57\xa9\xd3\x16\x7e\x9c\x1d\x63\x26\x5c\xa7\xfe\x52\xe2\x9f\xf2\x62\x57\xbc\xac\x22\xaf\x0a\x11\x84\x41\x1c\x74\x46\xf8\xef\x41\x18\xf4\x85\x3e\x49\x81\x8f\xe8\xa5\xf7\x1c\x95\xd3\xa4\xfa\x8e\x27\xc9\xf3\xfb\x39\x7c\xc2\x69\xa3\x18\xf0\xaf\x99\x39\x28\xe2\x57\xd1\x6b\x13\x48\x42\xf7\x8f\x81\x38\xb8\x02\xf8\x97\x51\x6d\x33\xaf\x96\x18\xa7\x85\x9e\x7f\xfc\x93\xdf\xe5\xee\x5b\x89\xf7\xc4\x6d\x54\x74\x9b\xc3\xae\x67\xbe\x98\xe5\x27\x42\xab\x76\x20\x0e\xae\xc0\x5d\xb4\xd1\x77\x6f\x9a\x9e\x4c\x30\x08\x59\x1c\x9d\xef\x22\x62\xf3\x0b\x2e\x65\xc0\x7c\x9a\x78\x24\xe5\x32\x9a\x6e\xd9\xd4\x06\xad\xdc\x82\x38\xb8\x02\xa3\xb1\x72\x47\x32\xe4\x98\x66\xaa\x15\x3c\x4d\xa1\xf9\xd8\xfe\xb3\xfd\x0a\x77\x9e\xe8\xdf\xc2\xe2\x08\xbd\x23\x92\xd7\x79\x0f\x5a\x61\x02\x71\x70\x05\xc6\x02\x18\xc5\xfc\x23\x54\x84\x3a\xd4\x70\x2a\xdb\x5f\x72\xf3\xb4\x1f\x73\x61\xe6\xa1\x88\xb6\xa2\xe7\x34\x6e\xc5\x6d\x29\x93\x23\x26\x3f\x20\x0e\x3a\x1b\x08\x08\xc2\xa0\xde\xf5\x24\x07\xa2\x25\x1f\x29\x2b\xde\xc2\x44\xff\x25\x71\x86\x28\x2a\x80\x95\x23\x75\x06\xb5\xbb\xb9\x71\xfa\x42\xe9\x15\xb5\x35\xaf\x24\x15\xa8\x1b\x00\x71\x70\x07\xee\x0b\xa3\x18\x4d\x3f\x49\xc1\x73\x29\xb0\x8b\x6f\x18\x53\x9e\xd1\xc8\x1f\xe4\x9c\xe6\x5c\xa3\x3b\x36\xe8\xa8\x1b\x3c\x73\x5e\x10\x51\x17\xc4\x21\x9d\x13\x6f\x18\xba\x3b\xa5\xf4\x59\x65\xe3\x59\xff\xdd\x9c\x2d\x4c\x94\x72\xde\xca\xe7\xe7\xe8\xde\x8a\x08\x74\xb1\x6c\xd2\x6e\x2f\x41\x37\x92\x83\x38\xb8\x03\x9e\x03\x11\xd1\x65\x18\x6d\x9f\xdd\x7c\x17\x6e\x25\x04\x5c\x8f\xca\x26\xd4\x49\xde\xef\xf5\xf4\x63\x7d\xd6\xb7\x7a\x87\x13\xa3\x18\x3a\x2b\x0d\xe0\xe0\x0e\xe4\x26\x7c\xf9\xfe\x56\x6f\x13\x95\xb3\x9f\xa2\x24\x5c\x8b\xe3\x7a\x5f\xdc\x59\xd1\x87\xcf\x5f\x4f\xfc\x76\x59\x54\xd2\xce\x21\xea\x43\x38\x00\xe2\xa0\xb3\x81\x80\x20\x0c\x1a\xea\x4e\xbc\x2e\xc2\xc6\xfb\xcb\xf0\x8f\x1b\x34\x6e\x42\x89\xd3\x93\x55\x5d\xc1\x87\x67\x8e\x0a\x55\x27\x30\xb5\xe6\x50\x70\x04\x22\x36\x8d\x06\xa0\xeb\x22\x00\x1c\xdc\x01\xfe\xad\x09\xaf\x33\x34\xf4\x71\xd8\x41\x12\x13\x81\x2b\x8d\x13\x0c\x7e\x71\x1b\x2f\x46\xe4\xf2\xab\xe3\x26\xb1\x4a\x0b\x5f\x40\xab\x76\x20\x0e\xee\x40\x5f\xa6\x0a\xbf\xfd\x76\xe2\xe1\x4f\x61\x43\xeb\x2b\x4f\xd2\x59\x48\xb9\x36\xf2\x2c\xc5\x78\xa3\x8c\xb4\x77\x47\xcf\xd4\xae\x47\x43\xf7\x31\x02\x38\xa4\x20\x4c\xac\x93\xc4\x25\x12\x70\x19\x5b\xe3\x0d\x36\x7a\xfc\x45\xcc\xa4\xc8\x90\xd9\xc8\x21\x37\x59\xeb\x4a\x25\xf7\xde\xa0\xf0\x60\x28\x08\x03\x38\xb8\x03\xbb\xc1\x09\x8e\x65\x96\xde\x42\x5f\x18\xad\x0d\xcb\x0c\x89\xa5\xdc\xef\xd6\x11\x85\x70\xb5\x06\x28\xd5\x70\xea\xe3\xdb\x47\x7e\x46\x38\x00\xe2\xa0\x7e\x00\x10\x84\x41\xf3\x8e\x93\x1c\x88\x57\x21\xfc\x85\x2e\xac\xfa\x2c\xcc\x5a\x2b\x5f\xb9\xb6\x64\x31\x61\xd6\x86\x9f\x83\x7a\x17\xc5\x89\xcf\x47\x2a\x21\x83\xf9\x02\xa2\xed\x20\x0e\xee\x40\xd6\xbb\x17\xc6\xb8\xed\x39\xf8\x9b\xf5\xf6\xaf\x92\x2b\xf6\x4c\xdf\xb1\x50\x2c\xbf\xcf\xc1\x64\xf0\xd4\x7b\xed\x67\xdd\xc1\x01\x3d\x73\x04\xe2\x90\x5e\x53\xbc\x90\x22\x11\x6c\xa4\x88\x6b\x1c\x52\x61\x86\x77\xab\x71\x52\xec\x3b\xce\xdb\xa0\xf3\x96\x01\x5f\xaa\x4b\x5d\x4b\x73\x5f\x9e\x47\xd4\x05\x71\x70\x07\xf2\x0b\x12\x88\xf1\xb8\x23\xaa\xb7\x35\x2d\x7b\x5f\xd3\x3d\xb4\x95\xf2\xed\xcf\x7e\xbb\x95\xf6\xb8\x41\xd0\xb4\xba\x56\x0f\x0d\x3a\x2e\x04\xe2\xe0\x0e\x3c\x3e\x43\x1a\xdf\x4c\xdf\x62\x40\x95\x46\x95\xcc\xa3\x44\xda\xed\x56\xd9\x28\x55\x11\x7d\x59\xcb\x82\xd5\x9f\x4d\x5b\x2e\xdb\x01\xe1\x00\x88\x83\xfa\x01\x40\x10\x06\x85\xa8\x93\x83\xb0\x74\x1a\xa6\x65\xfa\xdc\x64\x3a\xef\x64\x72\x4c\xb2\xb0\x90\xa3\x95\xb5\x99\x90\x4f\xaa\xd3\xc3\x24\xa5\xfa\xe7\xaa\x77\xe2\xd9\x11\xa1\x12\xc4\x21\x07\x61\x3c\x8d\xeb\xeb\x8e\xfb\xaa\x18\x52\x8c\x47\xca\x77\xaf\xe7\x0c\xed\x49\xb2\x95\x69\x8b\x2f\xa7\xb1\x65\x3d\x48\xd4\x33\x8b\xd3\x45\x54\x06\x71\xc8\x41\x98\x53\x25\x72\xf9\xca\xaf\xd6\xc1\xd0\x5e\x0d\x0b\x8b\x71\xf7\x70\xf2\x4b\x69\x3f\x15\xc4\x99\x15\x77\x51\x5f\x34\xb7\x86\x28\xf1\x22\x2a\x83\xb8\xff\x0b\xc2\xff\xbc\xe0\xec\x5f\xbf\x23\x5c\x86\x5e\xf7\x91\x46\xc5\x53\x16\xab\x33\xa5\xb2\xaf\xa5\x76\x37\x0c\x6d\x70\x78\x67\xf1\xfb\x12\xfa\x48\xe0\x5e\x83\xbe\xf9\xcf\x3f\x83\xb0\x46\xdb\x62\x10\xb6\xf9\x6c\x44\x20\xb9\xe4\x32\x0a\x63\x81\x4b\x5c\x3d\xce\xb7\xf6\xd2\x3a\xc9\x4b\x33\x37\x04\x06\x3f\x30\xd9\xff\x81\x26\xf3\xd4\x77\x3c\x66\x1e\x8c\x95\xa1\x54\x28\xe8\x74\xf9\x5a\x23\xc4\x68\x4b\xd5\x6a\x69\x45\x7e\xa5\xde\xa3\x7c\x3b\xbe\x38\xec\xbf\x16\x84\x41\x4d\xfb\xf3\x8c\xb0\x3c\x3c\x2c\xd9\xed\xcb\x59\x5a\xdb\xe2\xb2\x0b\x59\x63\x25\x45\xe8\xf8\xdd\x39\xdf\x1a\x46\xe5\x87\x7f\xad\xaf\xd8\x06\x8b\xe2\xe3\xc6\xf6\xa9\x3c\xe8\xeb\x86\x1c\x84\x45\x1d\x9f\x95\xe7\x5c\xaa\x17\x8c\x09\x90\x65\x7e\xea\x39\xf5\x88\xc8\xc6\x24\x36\x25\x2f\xe6\x0d\x85\x6a\xe0\x87\x1a\xb3\x88\x53\xb9\xb5\x0a\x45\x02\xe9\xc7\x32\x0c\x93\x6a\x4a\xf8\x08\x64\x92\xa0\x36\xa1\xd0\xa7\x53\x86\xbd\x32\xc1\x14\xab\x62\x11\xe8\x75\x31\x22\x6d\x7a\x15\xa1\xb1\x7a\x2a\xad\x45\x0e\xc2\xb3\xee\x64\x99\xf1\x4a\xb7\xbd\x47\xf3\x8d\xed\x17\x31\x47\x4d\x63\x32\x1a\xac\x8f\x5e\xbd\xd3\x9d\xb8\xf1\xd0\x02\x7d\x6a\xe2\xfc\xa9\xb4\xd6\x01\xe9\xc7\x7e\x2b\xee\xaf\xfc\x3c\x1c\x3f\x21\x82\x16\x11\x2d\x18\x60\x92\x76\x26\xf2\xfa\x10\xc5\xb8\xa9\x73\xbd\x30\xa1\x7a\x60\x73\x45\xc8\xa9\x05\x61\x90\x44\x27\x8d\x7c\xec\x4b\xbb\x26\x95\xaa\x42\x03\xfc\x8f\xba\x88\xdc\x3f\x3d\xb5\xd1\x6c\xae\xea\x71\x7a\x11\x26\x79\xce\xfc\xc3\xab\x1a\x85\x45\x28\xad\x80\x38\xa4\xa5\xa0\xb6\x5d\xed\xfa\x17\x4b\x66\xd4\x16\x4c\x8e\x3d\xa5\x09\xb1\xe7\x14\x59\xf1\x19\x1a\x30\x52\x85\xf0\xa4\x75\x1f\xc7\x35\x40\x2b\xb7\x20\x0e\x3e\xf2\x6d\x52\xc8\xab\xdc\x92\x9e\x35\xd0\x6f\x60\x78\x6a\xf6\xa5\x3f\x23\x62\x1c\xcb\x9f\xee\x72\x5f\xbe\xc6\xd5\x51\x03\xf2\x49\x9f\x9b\xd0\x0a\x36\x80\x83\x8f\x7c\xdf\xb9\x69\xce\x8f\x3f\xab\x39\x48\x74\x63\xae\x35\x97\x3b\x6b\x72\xb9\x4f\x32\x98\x84\x93\xe3\x45\xd8\xd1\xd4\x7c\x96\xaf\x98\x0a\xa2\x2e\x88\xf3\x94\x42\x41\xfd\xc7\x32\x80\xe6\xb9\xe0\xdf\x69\x2f\xf7\xb3\xa2\x1a\x0c\xa7\x7f\xbc\x7e\xb8\x2c\xd8\x5e\x84\x22\x33\xe3\x39\xfd\x0a\x5d\xdf\xbc\x1c\xff\x22\x22\x08\x83\x38\xe8\x8c\xb0\xfc\x5f\x27\x3f\xa0\x2f\xf4\x49\x0a\x24\xc4\xb1\xed\xbc\xb6\x1c\x5b\xb9\x66\xad\x74\x91\x2b\x22\x5d\x24\x74\xc0\xf8\x2e\x75\xbf\x85\xfa\x99\x8f\x85\x77\x6e\xfe\x7e\x0b\xad\x04\x81\x38\xb8\x02\xbc\x0e\x6b\x5b\x2a\x3a\xcd\xa1\x3b\x3a\xe2\xb5\xef\xa6\x31\x37\xac\xc3\x9b\xf5\x30\x58\xbc\x8b\xdf\x08\x5f\x3c\xd3\x2e\xf3\xbf\xb3\x76\x20\x0e\xae\xc0\x8b\x8c\xc8\x17\x3d\xdf\x36\xd1\x15\x15\x9f\xfd\x7a\x9a\x25\x7e\x7f\x20\x69\x9c\xb0\xc9\xe8\xc5\x39\x49\x14\xc2\xaa\x29\xd2\x96\x0a\x44\x5d\x10\x07\x57\xe0\xf7\xc6\x6b\x8c\x99\x0b\x04\x6e\xad\x37\xcd\x19\xf3\x49\x3a\x95\x45\x7e\x0a\x64\xcf\x50\xda\xcd\x2b\x32\x7d\xc0\x69\xc4\xd6\x85\xde\x3b\x05\x71\x70\x05\x54\xae\x1a\xce\xd2\xe0\x2d\xa3\xb0\x94\x6f\x8b\x3c\x95\x41\xb9\x22\x45\x2b\x37\xc6\xd4\x90\x5d\x15\x6b\xee\x5d\xf6\x49\xdc\xf7\x01\x62\xf2\x03\xe2\xa0\xb3\x81\x80\x20\x0c\xea\x5d\x4f\x72\x60\xd2\x97\xd9\xcc\xf4\x8c\x8a\xa4\x78\x41\x7e\x82\x15\x81\xf0\xb5\xf8\x5a\x67\x15\xc2\x5b\xc7\x53\x63\x49\x5a\x74\xd6\xae\xd9\xd3\xd0\xea\x1a\x80\x83\x3b\xe0\xbc\x6c\xd8\x3e\x62\xa9\x62\xaf\xf2\x21\xb4\xca\x9f\xa6\xc0\x1a\xff\xb1\xa8\x95\xad\xa4\xd7\xe5\x2c\xdc\x8c\x4f\xb7\xe9\xeb\x7a\x11\x75\x41\x1c\xdc\x81\xf9\xbc\x2a\x06\x4f\x0d\x65\x0b\xf6\x9b\x28\x62\x99\xa4\x2b\x8e\x2c\x64\x65\x02\xc6\x6f\x9e\x1a\x27\xc9\x31\x57\x2d\xb1\x45\x40\xdd\x00\x88\x83\x3b\x70\x5d\x34\xc5\xd7\x6a\xda\x5a\x67\xe7\x6a\xa4\x85\xe3\xc6\x79\xe2\x29\x6f\x4e\x4a\xac\x23\x89\x72\x6a\xc5\xc8\x24\x5f\x63\xc2\xff\x3d\x7f\x0e\xe0\xe0\x0e\xb0\xbd\x90\x2d\x4f\xfc\x9d\x1e\x79\x0e\xbd\xdc\x45\x56\x0b\x6b\x5c\x26\xa8\x92\xe8\xeb\xa2\x4f\xde\x73\x2f\x43\x6d\xa5\x8a\xbb\x8e\x08\x07\x40\x1c\x74\x36\x50\xe2\xef\x0e\x80\x86\xba\x93\x1c\xd0\xc1\x3b\xfa\xc8\xd9\x92\x97\xb6\x8b\xb9\xe7\x36\x1a\x3a\x99\x3a\x1f\x8e\x31\xd1\x12\x6b\xf7\xa5\xe6\x4a\xf3\x25\x5d\xac\x33\x41\xd0\x2d\xef\x00\x0e\xee\x80\xad\xfe\x75\xaa\x94\x56\x37\xe1\xa2\x57\xcd\x11\x61\x52\x35\xe7\x8a\x1c\x7f\x59\x89\x65\x94\x91\x70\x5f\xbb\x3e\xfb\x1a\x93\x1d\xba\x28\x09\xc4\xc1\x1d\x90\x63\x56\xfe\x6e\x40\xc7\xb5\xf1\x4d\xa3\xab\x97\x40\x45\xf2\xea\xef\xf0\xb6\xd1\xa6\xbd\x74\xf1\x2e\x06\x36\xd9\x27\x8f\x68\xa1\x73\xa7\x20\x0e\xee\x40\x9a\xe4\xdc\xd5\xa0\xc4\xe5\x64\x0b\xd2\x56\xbb\x27\x58\xb6\x9e\x59\x3b\xc5\x77\xbc\x0f\x2e\x96\x76\xf2\x9f\xbf\xf3\xbe\x2c\x1e\x17\xba\xde\x02\xc0\xc1\x1d\xb0\xbc\xf0\x5c\xd8\x53\x4a\x74\x02\x37\xaf\x7a\xe1\x58\x77\x9a\xf1\x01\x47\x15\x47\xa3\x93\x41\x9d\x27\x27\xc6\xb2\xec\xcc\xa7\x4e\x84\x03\x20\x0e\xea\x07\x00\x41\x18\x34\xef\x38\xc9\x01\xd6\xf1\x3a\x4a\xab\xca\x37\x2d\xe4\xdc\x5d\x5b\x37\xaf\x9d\x35\x18\x1c\x7d\x72\xdf\xd3\x64\x6d\xc5\x94\x6b\xe1\x43\x7f\x37\x0e\x74\x4f\x02\x88\x83\x3b\xc0\x60\x56\x21\x8f\x42\x92\xab\x4c\x4d\x7f\x34\x13\xc1\xa5\x56\xcc\x28\xe4\x32\xb8\xae\x22\x20\x94\xa1\xf4\xc1\x44\xec\x86\x7d\x23\xb4\xdb\x00\xc0\xc1\x1d\x30\x0c\x2c\x13\xb1\x76\xfa\x31\x13\x42\x6e\x16\xdc\x9f\x37\x20\x31\xd0\x56\xe4\x1d\x67\xa9\xea\xdc\xd4\xf5\x89\xc2\x35\x7e\x07\xea\x07\x40\x1c\xdc\x81\xd2\x41\x2b\x42\x67\x6a\xd6\x30\x09\xef\x00\x5a\xaf\xe3\xdb\xcf\x88\x62\x85\xac\xc2\x8f\xbf\xb2\x5d\x2b\x18\x51\x9a\xd8\x99\x86\x7e\x5f\x10\x07\x77\xa0\xb4\x34\x84\xb6\xfa\xee\x83\x97\x95\x66\xef\x1c\x1c\xf7\x92\xbf\x13\x38\xd8\x10\x05\x7e\xbb\x8e\xa9\x69\x38\x24\x7a\x9b\xfe\x05\x1d\xc2\x01\x10\x07\xf5\x03\x0e\x7f\x0f\xc2\xa0\x10\x75\x72\x10\xe6\x79\xec\xdd\xaf\xa9\xb3\x48\x72\xf6\x80\xf6\x1c\xe6\xf7\x9a\x1b\x18\x0e\x2e\x8b\xd6\x63\x0c\xbe\xc2\xea\xd6\x94\x49\xb8\xe3\x5a\x88\x50\x09\xe2\x90\x83\xb0\x94\xf6\xc2\x62\xe3\x7d\x3a\xdf\xaf\xcb\x43\x4e\xbd\xaa\x05\x4a\x35\x64\x05\xa8\x38\x1e\x12\xfe\x25\x93\x69\xe1\x32\x57\x1d\xa2\x10\x95\x41\x1c\x72\x10\x1e\x1f\xa2\x27\xe2\xfa\x25\x43\xc2\xb8\xc0\x79\xc0\x70\xae\x57\xbd\x96\x6f\xa0\xc9\x24\xbc\xe7\xe1\x54\x4b\xb2\x4d\x7a\x8b\xb1\x1b\xa2\x32\x88\xfb\xbf\x20\xfc\xcf\x7f\x5e\xfc\xeb\x77\x84\x67\x9f\xa8\xbf\xc4\x6c\x1a\x29\x58\x21\x92\x5f\x97\xc7\xd8\xeb\xb1\xf4\x58\xab\x5e\xfa\xfc\xfd\x61\xd5\xa2\xad\xb1\xc9\xa6\xc7\x3f\x82\xf0\x48\x6b\x30\xaf\x24\xb9\xe9\xe4\x0f\xe9\xd9\x95\x8c\x02\x79\x57\x85\x3b\x5d\x92\x0e\x4c\x5b\x8b\x22\x26\xbb\xbd\xe1\xfb\x68\x7f\x6e\x13\xdd\x1a\x59\xf2\x49\x19\x7d\xaf\x8d\x41\xf8\xd8\xa4\xa8\x65\x66\xc9\xb5\x6c\x7c\xa5\xfa\x78\x91\x11\x5f\xb3\xa5\x9f\xfd\xdb\x61\xf8\x7f\x2d\x08\x83\x9a\xf6\xe7\x19\x61\xa4\x20\xfc\xfd\x67\x12\xf6\xdd\x38\xa3\xae\x79\xb3\x80\xa3\x10\x03\x15\xb4\x2b\x3d\xca\x09\x0d\x82\xe9\x34\x1f\x4a\x6a\xfb\xb7\xf8\xaa\x1e\x9c\xca\x62\x25\x72\x10\xee\xbd\x28\x8e\x82\x4f\x41\xe4\xad\x47\x95\x6f\xe5\x72\x97\xdc\x68\x79\x34\x8d\xc7\x5e\xee\xc6\x78\x55\xdb\xef\x9b\xfa\x16\x24\x0b\xa7\xb2\x34\x8b\x1c\x84\xef\x85\xb7\xde\x75\xad\x2f\xb2\x2f\x12\x9c\xaa\x3c\x5f\x75\xbf\xc7\x6c\xc3\x54\xd8\x8f\xfa\x22\x56\xc6\xad\xe6\x73\x11\xf8\xfb\x8d\xa7\xd2\x5a\xe4\x20\x1c\x2f\x16\x24\x79\x21\xdd\x90\x53\xb0\xe1\xb6\xc0\xed\x0f\x59\x56\xe9\x76\x97\x05\x7c\x58\x3d\x06\xdb\x72\xf1\x76\xfb\xcc\xcc\x5f\x9c\x4a\x6b\x91\x83\x70\xb2\x2d\xbe\x83\xbb\xed\x59\x7f\x83\x36\xce\x5c\x96\x31\x07\x63\xec\x24\x46\xce\x1f\xb5\x49\x72\x4c\x84\x03\xd5\x05\xbb\x74\x11\xa7\x16\x84\x41\x12\x9d\x78\x30\x8c\xf0\x4c\xdb\x93\xba\x62\x6a\x7d\x89\x29\x6e\xad\xbe\xdb\x55\x7d\x3c\x6f\xd8\x6e\x71\x8c\x72\x15\x9e\x7b\x48\xc0\xb7\x2f\xb4\x05\x1d\x0c\x03\x70\xf0\x91\x8f\x76\xfd\x55\xe5\xd7\x09\x93\xf8\xe6\x17\x69\x46\x3c\x0e\xd6\xea\x06\x56\x18\x93\xea\x92\xcf\x2e\x8e\x27\x5a\x5c\xfe\xfc\xf5\xf0\x2a\xa2\x2e\x88\x83\x8f\x7c\x8b\x92\xac\xb4\x77\xd1\xf2\x0a\x1a\x28\x0e\xe9\x54\x7f\xb0\x27\x4c\x1a\x69\x51\x73\xde\x2f\x8c\x0d\xe6\x59\x28\xb8\x86\x26\x0e\xbd\x9d\x03\xe2\xe0\x23\xdf\x97\x9f\x69\x3f\x32\x07\xa4\x63\xc7\xdb\x7e\xb3\x12\x92\xef\xe7\x18\xf6\xf8\xa8\x0f\x14\x4e\x28\xf6\xc5\x0c\x31\x29\x57\xb6\x1c\x21\xea\x82\x38\x4f\x29\x14\xe2\x7f\xcc\xaa\x4c\x84\x2c\x0f\x71\xe9\xd1\xa5\xae\xa7\x5d\xe6\x68\xa2\xde\x18\xae\xf9\xbe\xe4\xe7\xce\x77\x20\x22\x34\xf0\x74\x26\xc9\xdb\x0a\x11\x84\x41\x1c\x74\x46\xf8\xef\x41\x18\xf4\x85\x3e\x49\x01\x6e\x45\x0d\xf3\x40\x65\x25\xbb\x2d\xc2\xc0\xfe\xfc\xf1\x31\x3d\x3f\xf1\xc7\xf7\xcb\xce\x50\xeb\x7c\x6e\xf1\x61\x6d\x51\x48\x31\x45\x34\x1d\xc4\xc1\x15\x98\xb8\x66\xa9\xc8\xdd\xae\xdb\xf6\x43\x31\x89\x2f\x7b\xd3\xe5\xd0\x59\x02\xb5\xe1\x52\x08\x61\x8f\x09\x9a\x59\x76\x77\x83\x17\x74\xce\x0a\xc4\xc1\x15\xd8\x73\xf8\x7e\xcb\xe4\xc7\xcc\x2f\x9e\x87\x99\xcf\x5d\xc6\x6a\x2d\xbe\x61\x68\xe2\xef\x6b\x24\xf6\xd2\x59\x9a\x59\x54\x46\x3f\x17\x47\xd4\x05\x71\x70\x05\xe8\x16\x99\xf3\xd9\x56\x0f\x2b\x8e\x76\x18\xa7\x1e\x7c\xe8\x09\x4d\xc7\x56\x2a\xcb\x8c\xf2\xa6\xbc\x48\x57\xd2\x7b\x27\x84\x19\x5a\xb5\x00\x71\x70\x05\x02\x7f\xd5\x39\x65\x87\xa9\xab\x15\x7b\x2a\x94\x9b\x7f\xfa\xd8\xec\xb6\x22\x88\x7a\x8b\xfc\x72\x9b\xd4\x55\xb3\x2d\x8f\x23\x43\x54\xc4\xe4\x07\xc4\x41\x67\x03\x01\x41\x18\xd4\xbb\x9e\xe4\x80\xb9\x45\xba\xc7\x1a\x6b\x49\x84\x01\x1a\x4a\x12\x0d\x2a\x49\x5c\xd5\x23\x2d\x3b\x96\x23\x41\x0c\x22\x7f\x8e\x76\x5f\x3b\x21\xe8\x92\x28\x10\x07\x77\xe0\xe8\x01\x4d\xe3\x60\x8a\xfe\x8e\xd0\x9b\xec\x9b\xc6\xad\x11\x1b\xe7\x85\xf3\x03\x95\xc8\x3a\x79\x2d\x43\x1b\xe5\x54\xbf\xe9\x7e\x84\xb6\x18\x02\x38\xb8\x03\x56\xdd\x9c\xe1\xa5\x1d\x0f\xfb\xdb\x5e\x8f\x0f\x5c\x7a\x7b\x56\x0c\xf3\xad\xc1\x93\xae\x23\x1b\x6a\xfe\x68\x16\xf1\xe9\x42\x55\xe8\x99\x72\x10\x07\x77\x00\xbf\x82\xfc\xec\x44\x9f\x34\x2f\xaa\x89\xf3\x5b\xd1\x8d\xac\x0d\x02\x94\x6c\x0d\x56\x0e\xd1\xb6\x1f\xce\x0f\x73\xa2\xa7\xee\x19\x43\xbb\x18\x00\x1c\xdc\x01\xaa\x73\x79\xcc\x11\x37\x87\x0b\x6c\xaf\x92\x70\x08\x64\xaf\xf2\xf5\xb2\x11\x63\x6e\x66\x70\x79\x12\x30\x26\x63\x0c\x65\xe0\x40\x0e\x80\x38\xe8\x6c\x20\x20\x08\x83\x86\xba\x93\x1c\x88\x78\xdb\x25\x13\xbf\xcd\xc6\x75\x6c\x2a\x20\x90\xf4\x4b\xa0\x86\xc4\x47\x7f\x93\x4d\x13\xfb\x0b\x4b\xb8\x26\x27\xf9\xb8\x38\x74\xa9\x15\x88\x83\x3b\x70\x39\xaf\xc8\xfa\xc7\x82\x8a\x59\xe5\x23\x85\x24\x5f\x85\x41\x6a\xe1\xb2\x8e\x80\x6e\x9f\xa4\x88\x8e\x1f\x3e\xf4\x3a\xf7\xb6\xa0\xb0\x02\xe2\xe0\x0e\x70\xa6\xbe\xba\x69\x73\xce\xc7\xec\x46\x53\x40\x44\x1f\x89\x81\xe4\xed\x0f\x68\x96\x04\xc9\x1e\xf2\x2f\x26\x7e\x28\xe6\xf5\xbc\x26\x44\xd4\x05\x71\x70\x07\x6a\x06\xd3\x95\x9e\xde\x21\x3b\x8f\x4f\x30\xf0\x5e\x16\x6f\xf0\x8c\x8a\xc1\xe7\x67\xcb\x19\x5d\x41\x4d\xa8\xe5\xce\x36\xee\xd7\xa0\xe7\x93\x40\x1c\xdc\x01\x37\x56\xb1\xa1\xe0\xa1\x51\x09\xfa\xc3\xb5\x36\xb1\xae\x7e\x0f\x17\x7d\xde\x77\xc9\xee\xaa\x9e\x5b\x2e\x97\xe9\x83\xf9\xdd\xa1\x4b\xf3\x40\x1c\xd4\x0f\x00\x82\x30\x68\xde\x71\x92\x03\xb1\x44\x5a\x7a\x06\xb5\xca\x3f\x06\xbd\xdb\x79\x0c\xd3\x1e\x2d\xf7\x88\x3b\x79\xa1\xf0\x73\x5c\x26\x73\x71\x52\x12\xb2\x26\x8d\x41\xb4\x1d\xc4\xc1\x1d\x28\x48\x67\xa0\xd0\x40\xd1\x68\x2c\x10\xb4\x30\x65\x08\xb2\xd9\x1d\xa4\x15\x46\xa3\x71\x32\x6f\xd2\x26\x37\x98\x13\xb6\xee\xf1\x42\xd4\x05\x71\x70\x07\x44\x89\x53\x36\x5d\xbd\x8b\xa4\x6e\x48\xd1\xd7\x7f\x17\x29\xee\x95\xc7\x11\xc1\xf1\x3f\xeb\x50\xd9\xba\x56\x26\x2a\xa9\xe7\xf1\x12\x51\x17\xc4\xc1\x1d\x78\xd6\x9d\x63\x59\x5c\xde\x73\x2d\xd3\xfb\xa8\x24\x10\x07\x37\x20\x6d\xa4\x5b\xf8\x9d\x5c\x46\x44\x7b\x76\x65\xda\xbd\xac\x5b\x50\xff\x02\xe2\xe0\x0e\xf8\xac\x0e\xe4\x19\xa3\xc5\x38\x59\x76\x28\x94\x5e\xd5\x26\x74\x1f\x62\x44\x97\x6a\x54\x68\x19\xf6\x78\xb4\x36\xd5\xa1\xbc\xa9\x8b\x70\x00\xc4\x41\xfd\x00\x20\x08\x83\x42\xd4\xc9\x41\xb8\x6d\x89\x9a\x35\xdc\x51\x98\x21\xad\x2b\x43\xf7\xfe\x77\x5e\x91\x52\xc5\x9a\x85\x50\x92\x1f\xb1\xa1\x15\x3c\x32\x83\x92\xbb\x55\x88\x50\x09\xe2\x90\x83\x70\x28\x7d\x68\x54\x28\xe1\xb3\x66\xf9\x15\x69\x5c\x92\x2f\xc5\x76\xe7\x5e\x3c\x28\x95\x89\xa2\x17\xc7\x69\x4f\x6b\x13\x77\xe8\xf9\x8c\xa8\x0c\xe2\x90\x83\x30\x6f\x14\x51\xc6\xd8\x9b\x86\x6a\x1e\x9e\x9b\xb9\x62\x11\x9d\x83\xd5\x1f\xb3\x78\xc8\xab\x3f\xf1\x6b\x7f\xcc\x3c\x5e\x7b\x67\x91\x8d\xa8\x0c\xe2\xfe\x2f\x08\xff\xd3\x85\x7f\xfd\x8e\x70\xfd\xf7\x62\xe3\x58\xed\xc7\x36\x24\x59\x6c\x6c\x4e\x5f\xd9\x4b\xbe\xad\xd1\x57\x4d\x53\xa4\xe6\x78\x75\xf7\x5f\x5a\x98\x56\xf3\xf9\x33\x08\x97\x5d\xea\x96\x14\xb8\xff\xa4\x85\x52\xe1\xf3\xcf\x90\x67\x46\x9d\x28\x33\xef\xe7\x2e\x6f\xf3\xd2\xa9\xdc\xed\x5f\xfc\xf0\x4a\x72\xeb\x0f\x34\x60\x92\xf3\x55\xe7\x97\xa2\x22\x86\x70\xf2\xe7\x28\xa5\x96\x58\xdc\x3f\x8f\x50\xa6\x5b\xbe\xcd\x58\x8e\xa5\xda\x0b\xdd\x74\x8e\xf8\xaf\x05\x61\x50\xd3\xfe\x3c\x23\x8c\x14\x84\x7f\x09\xc7\x1a\x97\xa5\xab\x5b\x96\x93\xd4\xed\x3f\xfb\x42\xa6\x6e\x1f\x16\xd2\x84\xa2\x32\xcb\xa6\x88\xa9\xf3\xb5\xb8\xd4\xec\xc3\xa9\x2c\x56\xf2\x22\x65\x34\x92\x78\xc1\x47\xf8\xc2\xb4\x31\xb5\x42\x01\xe4\x6a\xe6\xc9\x93\x1d\x25\xe7\xe6\x7d\x7d\x36\xb9\xd2\x08\xfc\xaa\x8e\xb0\x98\xb6\x4f\x65\x69\x16\x39\x08\x2b\x28\xf2\x9a\x2e\x19\x61\xed\x98\xb4\x95\x73\x87\x1c\xb1\x4a\x4e\xe0\x6a\x7b\x79\xaf\x3c\xfc\x46\x94\x2b\xc9\x42\x34\xbe\x70\x2a\x5b\xa3\x51\xb4\x91\xef\xe8\x2a\x75\xbe\x3c\xfc\xc3\x22\x4e\xef\xb0\xd2\x20\x41\x27\xcc\x48\xe8\x35\x73\x28\x56\x0a\x49\x8e\x50\x90\xad\xb4\xf7\x77\x21\x9a\x53\x69\x2d\x72\x10\x4e\xd7\x21\x0f\x93\x65\x6c\x0c\xf0\x7e\xd6\xbb\x99\x83\x96\x87\xad\x9e\xc6\x87\x72\x5f\x14\x23\x21\xb1\xc4\xfa\x36\xce\x56\xd5\x29\x3c\xd6\xac\xfd\xef\x24\x3a\x69\xe4\xd3\x26\x9c\xfc\x71\xfb\xc3\x6d\xdf\x34\x9c\xf5\xb6\x54\x2b\xe6\x2e\x69\xca\x48\xbb\xc0\xe8\xcb\x77\xb9\x71\x9d\xf5\xce\x5d\xa5\x29\x42\xf4\xf8\x20\x0e\x3e\xf2\x79\x54\x35\xea\x3a\xc6\xd6\x6a\x67\xae\x4b\x73\x28\x44\xd4\xea\xab\x49\x99\xf1\x09\xd5\x55\x55\x10\x2c\x5d\x76\x52\x6a\x54\x5c\x42\xd4\x05\x71\xf0\x91\xcf\x8e\x85\x2a\xfd\xec\x8d\x3b\x1e\x76\xe3\x5d\xf1\x51\x0f\x33\xf4\x0c\x0b\x0e\xb1\xf8\xce\x58\x5e\xed\x6e\x67\x43\x9d\xac\x93\x28\x41\xd4\x05\x71\xf0\xdf\x57\xfd\x37\x57\x9b\x05\x5e\xc5\xe2\xfb\xee\x4f\x3c\xbf\x84\x1e\xfa\x37\xef\xf3\xb5\x4f\xed\x4e\x1b\xae\xde\xf9\x80\x41\xff\x3b\x10\x5a\x0e\x04\x71\x9e\x52\xff\x3c\x60\xe2\x33\x5d\x28\x6b\x39\x47\x13\x90\x90\x4a\xc5\x45\xca\xfe\xca\x32\xb2\x5d\x43\xdb\xe3\x49\xcc\x6c\xb1\xc2\xcd\xb5\xa8\x59\x36\x34\x44\x10\x06\x71\xd0\x19\xe1\xbf\x07\x61\xd0\x17\xfa\x24\x05\xe6\xad\x7b\xad\x18\xf3\xdf\xaf\x8a\x64\x3a\x0a\x0f\xbf\x28\xdb\xf9\x6a\xf9\x4d\xc3\xb3\x59\x93\x56\xc7\xa2\xf9\xbd\x05\x05\x16\x74\x71\x38\x88\x83\x7f\xa4\xa6\x82\xf4\xe1\xec\xd9\xa3\x51\xd1\xa3\x35\xae\xec\x22\x8d\x04\x41\x1b\x37\xf1\x43\xda\x35\x6e\x66\x2d\x3e\x27\x39\x8b\x3d\x01\xfd\x57\x1d\xc4\xc1\x15\x38\xff\xd2\x22\xb1\x00\x25\x59\xc2\x8c\x96\xe2\xb6\x0e\x26\x56\x94\x5f\x4a\x91\x93\x7b\xea\xb3\x8e\x45\x71\xbe\x2c\x07\x8f\x55\x1d\x44\x5d\x10\x07\xff\x7d\x87\x52\xae\x09\x26\xd5\xd3\x3d\x7a\x4b\x7f\x91\x94\x98\xca\x6e\x9d\xbd\x5b\x1a\x8f\xac\x75\x60\x31\x2e\xdb\x38\x78\xcb\x5b\x4b\x17\x51\x17\xc4\xc1\x15\x18\x8d\x89\x49\x71\xff\xf0\xd0\x71\xaa\x31\x0a\xbb\xef\xf1\x41\x4c\xa4\xf3\x3a\xc9\x02\xda\xd6\x99\xbb\x31\x05\x87\x23\xf8\x54\x1c\x88\xc9\x0f\x88\x83\xce\x06\xf2\xfe\x7d\x02\x0c\xea\x5d\x4f\x72\x20\xfc\x92\xa3\xf8\x1c\xfe\xb2\xc4\xe0\x8d\xc5\x8a\xdc\xe3\xa1\x85\x4d\xf7\xb0\x7b\xbe\x2b\xf8\x97\xef\xfc\xdc\x33\xaf\xd8\x0f\xc7\x47\xb4\x1d\xc4\xc1\x3f\xd3\xc4\x4a\xf1\x12\x1d\xf5\xc7\xc1\xd1\x64\x74\x9e\x86\x97\x22\x0f\x8b\xcd\x86\x8e\xd6\xbb\xc7\xd8\x3f\x68\xe8\x91\xb3\x29\xcd\x43\x6f\xc8\x82\x38\xb8\x03\xd5\xd9\x93\x4c\x22\x6d\xab\x66\x0f\xd1\xa3\x0a\x6d\x02\xac\xb3\x2f\x27\xef\x7e\x7d\x1b\xdb\xa6\x2c\x55\x55\xc8\xe2\xa3\xcf\x54\x86\xa8\x0b\xe2\xe0\xbf\xaf\xca\xd7\x5f\xf1\xe7\xe8\xd6\x8b\x3e\x3e\x97\x31\x74\x68\x2e\x16\x51\x2d\x4f\x7f\x84\x69\xb6\xbe\xb8\x22\xc5\xaa\xb7\xb4\x71\x01\xba\x38\x0e\xc4\xc1\x1d\x40\xa3\x5f\xbd\x86\x22\x52\x79\xeb\x36\x65\x7e\x4d\x6b\xf7\xce\xc5\x01\x2a\xa9\xbc\x86\x7b\x3d\xd1\xcb\xea\x69\x76\x61\x1a\x38\x8d\x08\x07\x40\x1c\x74\x36\x10\x10\x84\x41\x43\xdd\x49\x0e\xc8\x5d\xa3\x22\xa3\x49\xd6\xd9\xa3\x94\xe1\xce\x23\x0e\x21\xeb\xbb\x93\xdb\xaf\xa7\x41\x11\x21\x66\x23\xe4\x65\xfe\xb5\x53\x1f\x07\x5a\x61\x05\x70\x48\xdb\xe3\x23\x7a\x47\xcf\x7c\x76\x4f\x4b\xef\xa6\x21\x8f\x8c\x11\x6e\xf1\x67\x8b\xbf\xc0\xa7\x12\xf1\xd8\x80\x84\x51\x23\x9a\x52\xd4\x1c\xda\x1e\x0f\xe0\x90\xfe\x27\x9a\x8f\x3f\x5d\x14\x57\x4c\x9f\xd5\x80\xd5\x70\x16\x7b\xe9\xe1\xc5\xb2\x83\xdd\x7e\x4c\x4e\x31\x7d\xc9\xd7\x0f\xdb\x15\xf0\xb6\xa1\xff\x89\x02\x38\xf8\xef\x3b\x99\xf1\x33\xe8\x47\x90\x19\xb5\x11\x63\x4e\x4a\x38\x7d\xd6\x23\x39\xb2\xd6\x73\x97\x13\xdf\xd4\xcf\xdb\xf1\xda\xcc\x79\x7e\x69\x81\x76\x47\x00\x38\xb8\x03\x99\x57\xbc\x6b\x22\x6f\x29\xa0\xa4\xb2\xce\xae\xeb\x38\x1e\x2d\xed\x85\x78\xf4\x5c\x56\x54\xfb\x1d\xf4\x3e\xad\xf0\x82\x31\x65\x13\xc2\x01\x10\x07\xf5\x03\xda\x7f\x77\x00\x34\xef\x38\xf1\xff\xe2\xf6\xfe\x98\x24\x9f\xbd\xc7\x72\x0d\xe7\x86\x9b\xae\x2f\xbe\xcb\x39\x78\x2c\xbe\xf9\x8c\x89\xfa\xb2\x88\x52\x24\x59\x49\x12\xb4\x8b\x07\xc4\x21\xbd\x25\x7d\xc6\x4a\xe1\xd7\x1c\xcb\x45\x3f\xa5\x0f\x9b\x89\x7e\x28\x34\xe4\x78\x55\x8e\xae\x3c\xac\x2c\x54\xe1\x4e\x53\xab\x98\xe2\x50\xc0\x06\x71\x48\x77\x05\xf0\x3b\x29\x2e\x0a\xe7\x4a\xdc\x3d\xa0\xf2\x2b\x18\xea\x56\xc3\x2c\x4e\x77\xcf\x23\x70\xae\x90\x20\xd7\xea\xc3\xf3\x4d\x52\x82\xee\x0a\x00\x70\xf0\xdf\xb7\x5c\xeb\x3d\x8a\x2b\x9d\x96\xd8\x37\x1a\x69\x75\x76\x13\x83\xcc\xfe\x74\xea\x0d\xd2\xea\x90\x6f\x87\x1f\xd1\xf2\xdc\xae\x5d\x80\xa6\x45\x20\x0e\xee\x40\xa4\x78\xc7\x46\xc3\x8e\xf5\x81\xbe\x9c\x0e\x2e\x9e\x60\xca\x9d\x42\x1c\xae\xe7\x16\x4c\xaa\x3b\x9d\x38\xb7\x3f\x19\xe3\xc6\x5a\x21\x1c\x00\x71\x50\x3f\x00\x08\xc2\xa0\x10\x75\x72\x10\xa6\x6c\xb9\x22\x8d\xce\xd1\x19\x20\x6d\x34\x94\x3c\xb3\x60\x6a\x70\x8c\x6a\x58\x41\xff\xf0\x16\xdd\xa3\x7c\x22\x6b\xbc\x95\x45\x0f\x44\xa8\x04\x71\x27\xbc\x23\x3c\xff\x5a\x0b\xaf\x94\xd7\xe4\xd9\xd5\x60\xa9\xb2\xd5\xc6\x87\xa4\xc2\x3c\x0e\x21\x64\x73\x49\xee\x3a\xe1\xbb\x5c\x79\x19\xf8\xd0\x3b\xc2\x00\x0e\x39\x08\x27\x72\x79\x14\x79\x1d\x8c\x53\xda\xcc\xe0\xae\x53\xb9\x1c\xdd\x73\xd0\xcf\xba\xb5\xbd\x73\xfb\x6d\xdf\xf6\xdd\x8e\xb8\xb8\x00\x34\x44\x65\x10\xf7\x7f\x41\xf8\x9f\xab\xf8\xff\xfa\x1d\x61\xec\xe2\x30\x91\x42\xc3\x64\xd6\xa1\x11\x8c\xc0\xd2\x46\xc9\x5f\x23\x7d\x6f\x5e\x3d\xfc\x88\x56\xef\xcc\x84\xf9\xe3\x25\xd3\x5d\xa5\x3f\x83\x70\x17\x8a\xde\xae\x33\x7a\xa3\x58\xb4\x1d\x15\x5d\x4d\x6f\xfd\x94\x58\x64\xcb\xd5\xc4\x19\x3f\xae\xba\xf7\x39\xe9\x43\xf4\x17\xd3\xfe\x81\x3e\x96\xf0\xb2\x0f\x95\xbc\x71\xac\xdc\xb3\xfe\xff\x31\xf7\xa6\xe1\x54\x76\xff\xfb\x3f\x65\xcc\x90\x39\xdb\x9c\x79\x1e\x12\x25\x65\x96\x99\x64\x9e\x87\x0c\x85\x48\x64\x28\x33\x21\xf3\x98\x99\xcc\xf3\x1c\x11\x19\x32\x67\x9e\x09\x25\x49\x89\x32\x26\x43\xf8\x1f\x9f\xdf\xf1\xdf\xd7\x97\xbd\x75\xaf\xfb\x81\x07\xf7\xf3\xd7\x71\xee\x6b\x5d\xfb\xdc\x6b\xad\x73\xaf\xf5\x5e\x8b\x5f\xbd\x5a\x0a\xf6\x2a\x89\x49\x62\xf5\x0f\xbf\x61\xc6\xde\xf5\x12\xde\xff\xdc\xa9\xd1\xa0\xa6\x1d\xad\x11\x46\x0a\xc2\x02\xa2\x76\xed\xbf\x74\x28\x3c\x04\xb7\xcc\x47\x1b\xea\xde\xb3\xc0\xae\x4a\x9e\x19\xda\x51\xa7\x1a\x15\x54\x73\x5c\xc4\x20\xe1\x3f\x95\xc5\x4a\xe4\x20\xec\xc3\xdd\x51\x8c\xce\x5b\x8c\x77\x86\x0c\x7f\xf6\x95\xbf\xb2\xf8\xbd\x47\xe3\x4b\xda\x2f\x6b\xd6\x27\x58\x57\x61\x35\x04\xf8\x26\xa7\xb2\x34\x7b\x42\x10\xf6\xad\xa7\x8e\x6e\xc2\x73\xf2\x6c\xf9\xd9\x24\x7c\xe9\x8d\x51\x48\xbc\xa3\x89\xc8\xc0\xcc\xfd\x4a\xbc\x85\xee\xfd\x9a\x3e\x91\x53\x69\x2d\x72\x10\xf6\x2f\x7d\x22\xc0\x8d\x1a\x60\xdf\xc6\x67\x4b\x85\x29\x2d\xc8\x6c\x18\x13\xa5\xf9\xa6\xcd\x2d\x38\x98\x25\xf6\x39\x06\xd9\x0c\xc3\xa9\xb4\x16\x39\x08\xbb\x2e\x1b\x47\x36\x9a\xe7\x34\x7c\xb7\x8d\x75\x68\xad\xc1\xd4\xb9\x2e\x23\x7e\x95\xb4\xb3\xd6\xd3\x69\xf3\xb5\x04\x8e\x09\xec\xf4\xae\x4f\x02\x99\xe8\xa4\x91\xef\x8a\xeb\xf3\x17\xd3\x1f\x58\xd4\xd0\xfa\xf3\x89\x5c\xa7\x93\xe4\x0b\xa5\xd6\x2a\x51\xdd\xdd\x8b\x53\x15\xa2\x83\x85\xd1\xbf\xdd\x84\xf7\xf8\x20\x0e\x71\x24\xd1\x27\x4a\x7e\x1e\x97\x51\x72\xf3\xfc\xad\x03\x0b\xc3\xb7\x55\xe4\xfe\x34\x1a\x51\x67\xe4\x85\xfc\x84\xc6\x03\xd2\x31\xa3\x23\x72\xa1\x7d\x76\x00\x0e\x71\xe4\x53\x70\xaf\x27\xb5\x54\xc2\xad\x60\xda\x09\x93\xcc\x0e\xc9\x25\xac\xd5\xc2\x29\x96\xb1\xa3\xae\x49\xde\xac\xa8\xeb\x7b\x75\x15\xba\x41\x1f\xc4\x21\x3e\x6f\x42\xe8\x63\x43\x9a\x4a\x0d\xa5\xa5\x03\xee\xae\x4e\x86\x59\x46\xcb\xe1\x91\xc2\xf0\x81\xee\x6b\xbb\x23\x16\x5e\x66\xc3\x79\xd0\x8c\x1d\xc4\xf9\x4a\x60\x1d\xd3\xa5\x7f\x63\xe5\x9e\x5a\xc5\xea\x15\xb4\xe7\xad\xeb\xa4\xee\x4d\xc9\x97\x9e\x54\x46\x45\xa0\x2d\x51\xea\xb4\x65\x5c\xe4\x4b\x1c\x02\x0f\xc2\x20\x0e\xaa\x11\xfe\xe7\x20\x0c\xfa\x41\x9f\x64\x81\x12\xb5\x44\xd8\x28\x4d\xde\x38\x8e\xa2\x01\x2b\xdb\x1d\x73\x82\xfa\x1b\x83\x65\x8e\x5f\x83\xb0\x84\x79\xbc\xac\xb8\x09\xcd\xa0\xb2\x6b\x10\x87\xf8\x4a\x5f\xa4\xf6\x55\x5d\xa0\xf8\xce\x6c\x94\x10\x49\xe5\x90\x2c\x4f\xdd\x2f\xd1\x4e\x6c\x51\x11\xc8\x42\xb3\x51\x21\xe9\x5e\xa0\xcd\x0b\xd7\x05\x71\x48\xff\x85\xe4\xf3\xe6\x0a\xe4\x96\x27\x3d\xb9\xe0\x96\x51\xe1\x52\xc2\xe2\xb4\x4c\x70\x75\x70\x4b\x2d\x83\xc3\xc5\x5e\x48\xef\x59\x1f\x64\x01\x10\x87\xf8\xbc\xdc\x05\xf1\x03\x95\xbc\xbf\xf4\xf0\x60\xe3\xdc\x67\xdf\x5e\xc9\xb9\xa4\x41\xfb\x3b\x85\x3d\xc8\x4d\xbb\x47\xc7\xb0\x8f\x3a\xf0\x22\xb4\xc2\x04\xe0\x10\x2d\x60\xd3\x14\x9e\xc8\x2d\xfb\x5c\x54\x82\x7d\xc6\x4e\x44\x28\x45\x31\xfb\x8a\xde\x22\xd1\x85\xef\x23\x0b\x79\xd2\x28\xe3\xf7\xda\xb7\xa0\x2d\x91\x00\x0e\xaa\x0d\x04\x05\x61\x40\xef\x7a\xe2\x81\x69\x3b\x26\xa2\x26\x24\xc6\xc4\xfb\xc3\x79\x53\x0a\x6f\x1b\xbe\xaf\xf0\x16\xad\x59\xa2\xe6\xc3\x84\xbf\xe3\x7e\xbe\x61\x22\xf1\x15\x3a\x30\x0d\xc0\x21\xbe\x53\x7c\xcf\x69\x37\xf7\x36\x49\xc6\x8b\xba\x1d\xde\x43\x25\xef\x89\x8d\x29\x8b\x17\x9f\xc5\x44\x30\x04\xb1\x8b\x8e\x57\x33\x2e\x08\xc3\x75\x41\x1c\xa2\x07\xee\xef\xa6\x97\xec\xe2\xd4\x5a\x71\x9a\x53\x5f\x64\x15\xf1\x1f\x37\xdf\x25\x32\x49\x76\xad\xc4\x70\x7f\xd3\x3c\x47\x12\xca\x04\x1d\x6a\x05\xe2\x10\x9f\x57\x6d\xce\x48\x69\xdf\xbe\x9b\x48\xf0\xe5\x54\x31\x7d\xb7\x1d\x4f\xb2\x4d\xda\xfe\xc3\xba\xd9\x3b\x7e\x23\x81\xfa\x03\xc6\xe6\xe1\x50\xfd\x39\x80\x43\xf4\x80\xc3\x2f\xb4\x7e\x72\x8b\x90\x89\xf3\xde\xbe\x30\x4b\xd1\x84\xfa\xfc\x97\xad\x2f\x95\xeb\x96\x17\xc5\xb4\x0c\xfb\x6f\x4f\xf0\xfb\xc0\x3d\x00\xe2\xa0\xda\x40\x40\x10\x06\x0d\x75\x27\x79\xc0\x99\x94\xcb\x51\x1e\x8d\x1d\xf6\xf4\x7c\xdd\x7b\xd5\xf4\x9d\x3e\xd7\xe4\xb3\x6f\xc7\xd9\xa4\x24\xd1\xef\x7f\xf3\xa3\x71\x6c\xbd\x06\x6f\x3b\x88\x43\x7c\xa7\x2d\x17\xaf\x9b\xe3\x51\xb1\x50\x35\x6a\x87\x6d\xf5\x7b\x18\x54\xb0\x66\x5f\xfb\x39\xfa\xb5\x4f\xa7\xfa\x53\x91\xa7\x7c\xf6\x1f\xe8\xd4\x68\x10\x87\xe8\x01\xf7\x43\x09\x59\x81\xe6\x3c\xfb\x67\xe8\x77\x77\x6a\x9c\xb2\x24\x62\xe6\xc7\x6e\xd3\x3f\x0c\x3d\x7c\xb3\x72\xbb\x71\x48\x32\x41\x16\xae\x0b\xe2\x10\x9f\xd7\xcb\xe0\x36\x6b\x81\x34\x13\xa7\xc3\xbc\xb4\xc8\x0a\x5d\x43\x95\x7c\x64\xcc\xd0\x94\x74\xac\xea\x9b\x1b\x44\x0c\xf9\xae\x94\xd0\x09\xc7\x20\x0e\xd1\x03\x3c\xca\x06\x12\xb4\x77\xa4\x55\x13\x28\x6b\x6f\xde\xaf\x8d\x9a\x38\xc3\x16\xed\x54\xe4\x1c\xfd\x71\x78\x57\x32\xb9\x91\x25\x79\x06\x3a\x2c\x0b\xc0\x41\xfd\x00\x20\x08\x83\xe6\x1d\x27\x79\x80\x46\xf2\x35\xcb\xb7\x4a\xed\x44\x6a\xd5\x5b\xdf\xac\x32\xc8\xa6\x97\xd0\xe3\x26\xec\xf0\x74\x8b\xbf\x4d\xf9\x5e\xac\x20\x8e\x3c\x80\x76\xc5\x00\x38\xc4\x77\x5a\x5b\xad\x2b\xba\x40\x6e\x5f\x4a\xa7\x49\xba\x90\xda\xd6\x1f\x15\x52\xbb\x2e\x14\x4a\x93\xbe\xeb\x5f\xfd\x90\x56\x0a\x3b\x04\x3a\x80\x0c\xc4\x21\x7a\x20\xd9\xad\x50\xf1\x8a\xd7\xf3\x8e\xcf\xc6\x3f\xaf\x2b\xc9\x30\x5b\xf6\xb9\xb9\xee\x70\xf5\x0f\x5b\x13\xc9\x32\x6e\x79\xfb\xd7\x95\x41\x65\x3d\x00\x0e\xf1\x79\x63\x97\x77\x31\x43\x27\x72\x06\x1f\x1c\x4a\x9e\xf3\x1f\x23\x8a\xcb\x9e\xa7\x7b\xb2\x28\xbd\x29\x7a\xcd\x60\x60\xfe\x55\xb1\x2c\xb4\xed\x1e\xc4\x21\x7a\x00\x35\x25\xeb\xbc\xfb\xa7\xfe\xe4\xef\x89\x6e\x04\x2c\xcf\x96\x3d\xb2\xa9\xb5\x25\x56\x7f\x87\xb2\x04\x8d\x37\x61\xde\x27\x73\x22\x81\x7b\x00\xc4\x41\xfd\x00\x20\x08\x83\x42\xd4\xc9\x41\x18\x67\xf3\x1b\x8d\x5f\xa2\x9b\x2d\xe1\x44\x20\x5a\x8b\x04\xcb\x9f\xe2\x41\xdb\x66\x22\x7b\x16\xe1\xb8\xa0\x73\x8d\x52\x31\xf8\x33\xf0\x50\x09\xe2\x90\x83\xb0\xcd\xed\xde\x06\xe3\x77\x61\x1a\xf6\xa8\xca\x1d\xe5\xfb\x71\xab\xc4\x6e\xce\xfe\x1f\x5a\xbf\xaa\xbe\x9c\x7f\xf4\x52\x47\x91\x2d\x10\xae\x0c\xe2\x90\x83\xb0\x4c\xee\x1c\xf5\xd8\xbb\xd1\xb7\xa4\x21\xce\xb4\x6b\x2f\x79\xf7\x2b\x1e\x31\x2b\xc4\x95\x06\x4e\xef\x5f\xb8\x1f\xd1\xfe\xdc\x26\x19\xae\x0c\xe2\xfe\x5f\x10\x3e\x76\xe5\xd5\xbf\xbe\x47\x58\x9b\xb9\x35\x66\x07\x83\xf1\x4f\x7e\xcd\x9c\x44\x12\xad\x08\x4f\xe8\x8e\x83\xad\xaa\xc0\x6a\xbd\xaf\x6a\x59\x69\x84\x96\xcb\xdd\xa3\x41\xf8\x77\xf6\x6e\x00\xde\xe6\xb0\xbd\x1d\x1f\x79\x1d\x0e\xe9\x4d\xd9\x2a\x8d\xe8\x8a\xee\xd9\x85\xa1\x1a\xef\xb0\x07\x3d\xf3\xaf\x3c\x8f\xa0\x05\x5f\x2c\x57\xf1\xc2\x8a\x98\x29\x69\x15\x5e\xe9\xe6\xa9\x7e\xb2\x16\x63\xc6\xf3\x0e\x54\xff\x11\x52\xad\x96\x68\x35\xc5\x13\xfa\x5f\x0b\xc2\xa0\xa6\x1d\xad\x11\x96\x43\x0c\x4b\x5d\x45\x3f\x4c\xe6\xe9\x69\xbf\xaf\xdc\x0b\x10\xa6\xb7\x37\xde\x90\x2c\x66\x79\x2d\xf5\x7c\x57\xc3\xe7\x75\xa3\x37\x45\xf1\xd9\x8b\xa7\xb2\x58\x89\x1c\x84\x1f\x79\x69\x05\x3e\x94\x78\xc7\x6e\x55\xbc\xac\x22\x76\xc7\x7a\x82\x59\x3d\x79\x62\x86\x92\x97\x41\x89\x16\x13\xbf\xbc\x1a\x9d\xe0\x54\x96\x66\x6f\x21\x7d\xac\xe1\x65\xbc\xde\xb5\xd2\x03\x2a\xa5\x54\xa3\xb7\x17\x26\x07\x70\x1f\x67\x90\xdb\x19\xde\xc9\x79\xef\xcf\x23\xb9\x13\x8a\x25\x42\x78\x2a\xad\x45\x0e\xc2\x36\xa1\xab\xd5\xda\x0c\x24\x44\x25\x9c\x4a\x4a\xb7\xf1\x46\x77\xed\xc7\x55\x93\x9c\x9f\xa8\x59\x3c\xbd\x35\xae\x1b\xfd\x33\xea\xca\xa9\xb4\xd6\x19\xe9\x63\x29\xd5\x84\x1f\xd8\x3e\xb8\x63\xf3\x86\xce\x5a\xb4\x90\xe7\x2a\x77\x4e\x8a\xb6\xc4\xab\x5c\x89\xef\x8b\x42\x1e\xb2\xdb\xd4\xb6\xa7\x77\x58\x16\xc8\x44\x27\x8d\x7c\x9f\x88\x0a\x82\x45\xc9\xcf\xd9\x37\x91\x6b\x27\xd9\x29\xac\xdd\xf1\x6f\xde\x56\x9b\x4a\x37\x11\x89\x34\x36\x0d\x57\xd4\xb8\x0c\xcd\xfc\x40\x1c\xe2\x48\x22\x64\x2e\xb1\xde\x71\xf9\x0a\xee\xb3\x68\x93\x0b\x9e\xf9\x5b\x83\x32\x5f\x50\xb1\xe8\xa6\x9f\x4c\x16\x7c\x0a\x0e\x0e\x4b\x1d\xcf\x80\xeb\x82\x38\xc4\x91\x0f\x9f\x37\x2e\xd0\xa0\x80\x75\xde\x90\x7e\x39\xbb\xba\x4a\x39\xa3\xcc\x26\x2a\xaa\xca\xdb\x2e\xe4\xcf\x17\xbe\xfb\xdd\x1a\xdb\xd0\x52\x10\x88\x43\x7c\xde\x6d\x5d\xbc\xdc\xa6\x35\x4e\xc6\xba\xdd\xaa\x89\x60\x6c\xb7\xd4\x1a\xbf\x9d\xc7\x33\x53\x8c\xf8\xf8\x09\x3d\x7d\xcf\x62\x26\xa0\x53\x7d\x40\x1c\xa2\xee\xd0\xdd\xcf\x76\x24\xcd\xe6\x45\x46\x52\x0a\x0f\x53\x5d\xab\xd7\x5a\x5c\x1c\xd6\x0a\xd7\x0c\xb0\xb8\x47\x93\x03\x58\x22\xe8\x68\xe1\x41\x18\xc4\x41\x35\xc2\x72\xff\x38\xf9\x01\xfd\xa0\x4f\xb2\x80\x6d\x67\xbf\x14\x33\xd9\x63\xb6\x57\x14\xa5\x82\x17\x5d\x85\x38\x5c\x7f\x0b\xa7\xfc\x90\xbd\x1c\xdd\xe2\x19\xb1\xb4\xa1\xb7\x0e\xd5\x87\x82\x38\xc4\xa6\xdb\x04\x59\xfa\x6c\x89\x2d\xfe\x92\x7c\x17\x9b\xbf\xd2\xb8\x46\x75\x05\xd5\xee\x2b\x6b\xa9\xde\xb8\x58\x1c\x3b\xca\xc7\x89\x28\x0c\xb8\x2e\x88\x43\xba\x3e\xc9\xe7\x9e\x84\x8e\x5d\xac\xfe\x8c\x9c\x5f\x92\xd6\x72\x61\x25\x17\x77\xcb\xe4\xbd\x4e\x0e\xad\x01\xbe\x96\x77\x0e\xc5\xe9\x9f\xe1\xba\x20\x0e\xf1\x79\xcf\x3c\xef\x51\xfd\x99\x20\x2e\x70\x6b\x59\x91\x9e\xae\xe4\x53\x23\x19\x6d\x2d\xb5\x04\xab\x93\xef\x8a\xc6\xfb\xcb\xd8\xd5\x62\x51\x70\x5d\x10\x87\xa8\x9b\x54\x2d\xe5\x70\xa7\x67\xf0\x2e\x8f\x59\xd3\x1c\x69\xdc\xbb\x92\x78\xf1\x03\xcb\xa5\x1c\xf6\x18\xd9\x6f\x2f\x93\x9d\xd4\xe5\xdf\xc3\x27\x3f\x20\x0e\xaa\x0d\x04\x04\x61\x50\xef\x7a\x92\x07\x76\xbd\xbe\xcb\xbf\xf0\xb8\x72\x89\xe0\xba\x6f\xe3\xfb\xbb\xa9\xc5\x86\xd5\x35\x79\xaf\xe6\x89\x5a\xf8\x23\x9f\x15\xa3\xa1\xf5\xe9\xc2\xdb\x0e\xe2\x90\xea\x43\x9b\xfc\x15\x12\x5c\x7a\x3f\x30\xb2\xbf\xdc\xc5\xd0\x76\x22\xfb\x62\xf7\x76\xf5\x91\xc5\xed\x36\x5c\xd4\xe1\x0d\xc2\x25\x59\x28\x54\x80\x38\xa4\x6e\x80\xe3\x40\x82\xde\xd0\x72\x5d\xa7\x50\xd9\xd0\x24\xfd\xdb\xce\x74\x67\xf6\x20\x51\x00\xbd\x43\x74\x22\x3e\xd6\x28\xc9\xfa\x10\xd4\x0d\x00\x38\xc4\xe7\x7d\x5c\xf0\x9d\x6a\x29\x74\x51\x27\xc4\xab\xf4\xa0\x33\x99\x78\xd7\x65\x39\x80\x22\x70\xdb\xa9\xf2\xce\x8d\x60\x2c\x22\x9a\x15\xe8\xc0\x34\x10\x87\x54\x2b\x9d\xaf\x48\x4f\x12\x28\x29\x7a\x09\xed\xc6\xbc\xb5\x46\xc0\x0a\xee\xf5\x69\x7f\xa7\x9c\xf2\xc4\x0f\x8f\x3c\x03\x98\x7f\x7e\x99\x82\x7b\x00\xc4\x41\xb5\x81\xb7\xfe\xd9\x03\xa0\xa1\xee\x24\x0f\x5c\x6e\x63\x5d\x8b\x60\xd7\xfa\x44\x4f\xc7\x8b\x51\x6e\xae\x50\x33\xce\x87\x25\xcb\xa3\x94\x40\x14\xb8\xf5\x54\xcf\x90\xb8\x19\x3a\x31\x18\xc4\x21\xb6\xbd\xaf\xab\xed\x4a\xc3\x83\xb7\x8c\x79\xe6\xa9\xb8\xbd\xa1\x33\x4f\x9b\x9d\xde\x73\x07\xe7\x87\xf4\x37\x2d\xad\xfa\x6f\x7c\x4d\x84\x86\x02\x10\x87\xe8\x01\xde\x39\x2d\x97\xfe\xb9\xd7\x18\xbe\x87\x21\x6e\x5c\x3e\xab\x16\xd7\x65\x77\xf9\x93\x6d\x84\xb2\x72\x04\x22\xb2\x7a\x45\x92\xa1\x7e\x0b\xc4\x21\x85\xb6\x57\xdc\x92\x8d\xab\x8c\x87\xaf\x2f\x3d\x2e\x8b\xa4\x25\xf9\xa5\xcc\xfb\x64\xa0\x41\xd1\x31\x3c\xc1\xff\x82\xbe\xcd\xb5\x17\xd0\x10\x03\xe2\x10\x75\x79\x89\xac\xc9\xfb\xf7\x47\x6b\x45\x8a\xe3\xbf\xe3\x0e\xcd\x58\x48\x46\xae\x5b\xe4\x7e\xf5\xff\x55\x75\x58\x81\x81\x4e\x75\x11\x3a\x30\x0d\xc4\x41\xfd\x00\x20\x08\x83\xe6\x1d\x27\x79\x20\x33\xa3\xc1\x5b\x58\xbe\x98\x83\xf7\x16\x06\x76\x86\x19\x4c\xbf\x54\xb1\x66\x7d\x00\xdd\x5e\xc3\x71\x7a\x8f\xdf\x62\x32\x50\x12\xde\x76\x10\x87\xd8\xf6\xa2\xa4\x18\xa6\x1f\x21\x9a\x67\xbe\x08\x60\x7f\x20\xf4\x7f\xc3\x26\x66\xa0\xa2\xe3\x38\x0f\x0b\xa0\x0b\xa8\x2f\x28\xc4\x49\x99\x83\x0e\x9f\x02\x70\x88\x1e\x68\x17\xec\x7c\xac\xdf\xe2\xf5\xcb\x61\x61\x77\xb7\x2f\x83\x2f\x80\x87\xd8\xbd\x88\xc5\xb5\x72\xe6\x3c\xc1\x53\xe5\xd5\x07\x2f\xdc\xe1\xba\x20\x0e\xf1\x79\x45\x50\x8c\x82\x74\xee\x7d\x78\xb5\x80\xa5\xb9\x2c\x02\xe3\x26\xc8\x4a\x74\x15\xc3\x42\x35\xd0\x7f\xd4\x7c\x43\x6d\x41\x53\x4f\x14\xae\x0b\xe2\x10\x75\xab\x48\x5b\xd0\x22\x39\x93\x15\xe4\x85\xd2\x1a\x4d\xac\xff\x34\xfc\xaa\x5d\xe6\x24\x8e\x1b\xcc\xbc\x77\x31\x8d\x35\xe1\xe9\x9f\x35\xb8\x07\x40\x1c\xd4\x0f\x38\xff\x73\x10\x06\x85\xa8\x93\x83\x70\xe1\x6d\xad\xe6\x84\x17\x73\x2f\xa6\xc6\xdf\xf9\xa7\xa4\x73\xef\x0a\x7b\x4d\x4d\x50\x9b\xd6\xd1\xf4\x06\x6d\x55\x3a\xa4\x78\xc5\xc0\x43\x25\x88\x43\x0e\xc2\x1e\xa5\xa8\x75\xd6\x0f\x88\xa7\x6e\x4c\xec\x5d\x98\xb4\x2e\xea\xf1\xf7\xe7\xcf\x4c\x63\x8c\x0e\xb5\x9d\xac\x4d\xc1\xc2\x85\xfd\x80\x2b\x83\x38\xe4\x20\xac\x73\x50\x82\xd5\xa4\xb8\x1a\xc6\xc2\x94\x12\x44\x41\xeb\x3c\xd0\x48\xdf\x7a\x0b\x33\xc8\xed\x09\xfa\x59\x2b\x74\x55\x9c\xc2\x0b\x70\x65\x10\xf7\xff\x82\xf0\x31\x8f\xfd\xeb\x7b\x84\x2b\x76\x9e\x71\x88\x49\x78\xa4\xac\x75\x77\xad\xed\x30\x16\xa0\x7f\xa0\x52\x75\x3d\xec\xe2\x62\xfc\xe3\xb4\x1e\x9e\x19\x4a\xc6\x7e\x34\x08\xb3\x6f\x77\xa9\x38\xd3\xc4\xa7\x5f\xe7\xb7\xbc\xfd\xf3\x92\x86\xa9\xf5\xb7\x04\x6f\x3a\x14\xd3\x00\xaa\xbb\xef\xf3\x96\x30\x17\x8f\x56\x87\xba\x5f\x74\x49\xd4\x5e\x6d\x8c\x1b\x53\xb4\x18\x0f\x50\xb4\xce\x69\xea\xe6\x9b\xc6\x4f\x35\xe8\x68\x18\xc5\xd4\x6d\x1d\x32\xbe\xfa\x5f\x0b\xc2\xa0\xa6\x1d\xad\x11\x46\x0a\xc2\xb9\x2b\xa6\x31\x03\xab\x95\xc2\x4c\x2d\xc5\xce\x5a\x72\x2e\x67\x5b\x2b\xcf\xf5\xe0\x51\xfa\x6b\x71\xe9\x25\x39\x5d\xee\xab\x73\x3f\x95\xc5\x4a\xe4\x20\x6c\x97\x37\xf0\x6d\x51\x8a\x3d\xb8\xd2\xb2\xd1\x9e\x1b\x2b\x6e\xd2\x80\x81\xf9\xfc\x92\x5e\xc2\x58\x42\x8a\xea\x27\x8d\xa1\xe0\x67\xa7\xb2\x34\x8b\x1c\x84\xfb\x4a\xd2\xc2\xc6\xd7\xf7\x1b\xd4\x93\x1f\x6d\x7e\xe4\x7d\x40\x27\xcf\xf6\x1d\x47\xff\xe6\x86\xa9\xd5\xad\x9c\xc7\x73\xa4\x7c\xde\xa7\xd2\x5a\xe4\x20\x7c\x97\xe6\x33\xeb\xcf\xd8\x95\x76\xdf\x62\xf5\x0f\x9b\xb7\xae\x1c\x86\x38\x0e\x44\x6c\xde\xcc\xf9\x20\x2a\xbf\x88\x7f\x83\x8e\xaf\xf6\x54\x5a\x8b\x1c\x84\xb7\x03\x2e\xaa\xbf\x90\xe8\x66\xe1\x3e\x94\xda\x42\xcd\x20\xbf\x22\x23\x52\xe9\xe6\x51\x58\x40\x61\x81\xc7\x76\xe7\x8d\x59\xf0\xeb\x53\x0b\xc2\x20\x13\x9d\xb8\x22\xac\xcf\xe9\x95\xb8\xa8\x29\x41\x7b\x26\x3b\x2e\x2b\x2b\x13\x3d\xaf\x49\xf9\x9b\x8c\xe2\xb6\xd9\x93\x8f\x75\x19\xab\x4a\x77\xc6\xa0\x15\x61\x00\x87\xd8\xe3\x4f\xa2\x4b\x8a\x1a\x5d\xf1\xae\xfd\xb4\xe2\x9b\xfc\x05\xc7\x8d\x8f\xe0\x79\xda\xac\xaf\xbc\xad\x53\xf1\x53\xdf\x17\x37\x42\x68\x5c\xe0\xba\x20\x0e\x71\xe4\xe3\x91\x5a\x34\x60\xa2\xdf\xc0\xc7\xbc\x71\x69\xf6\x7e\x5f\x20\x5b\x4a\xb8\xc5\xac\xb5\x8e\xdb\x0a\xa6\x06\x67\x94\xb1\xfc\x04\x33\x5c\x17\xc4\x21\x3e\xaf\x78\xf8\x48\x8b\x61\x5d\x72\x40\x87\x2a\x2a\x8d\x17\x5f\xa3\xeb\xc5\xeb\xef\xd6\x79\x58\xe4\x85\x1a\x1f\x5f\xd2\xba\xfa\x55\x3e\x1f\x3a\x25\x07\xc0\x21\x3e\xaf\x36\x51\x76\xd5\x18\x27\xe7\x88\xc2\xfa\x65\xad\x95\xb7\xd4\x66\x34\x18\xb6\xaf\x29\x8b\xd6\xd0\x74\xf5\x2f\x96\x0c\x2d\x07\x05\xc3\x83\x30\x88\x83\x6a\x84\xff\x39\x08\x83\x7e\xd0\x27\x59\xc0\xc5\x24\xbc\xa9\xdc\x67\xe7\xd2\xc1\xf0\x21\x5a\xd9\x21\x43\x94\x78\x1f\xfe\x78\x46\x0b\x9f\xb6\x55\x73\x49\xac\xba\x6b\x73\x10\xbc\xe9\x20\x0e\xf1\x95\x12\x45\x1e\xb6\xef\xe6\xd9\xbe\xda\x15\x37\x87\x55\xe9\x2f\x50\xac\x76\xab\x5d\x1f\x3c\xe7\xd8\x5c\x28\xcf\xc1\x46\x69\x1a\x4f\x0d\x9d\xec\x0b\xe0\x10\x5f\x29\xdd\x77\xe3\xa7\xc2\xa2\x7c\x41\xca\x75\x8e\x3d\xe3\x49\x7b\xbe\xab\x36\x2a\xde\xfb\x21\x4f\x74\x30\x5b\x4c\x8c\x42\xa2\x2f\xf0\xc1\x75\x41\x1c\xe2\xf3\x36\xc4\x7f\x0b\xa2\x8f\xb5\x1c\xc6\x60\xf8\x36\x3c\x12\xd5\x54\xbd\xb4\xb9\xf9\xfd\x7a\x0c\xd7\xb7\x90\xea\x47\x6c\xc2\x85\xc1\x2d\x70\x5d\x10\x87\x34\x61\x67\x7c\xae\x7c\xa9\x50\x31\xb1\x1a\xb6\x7a\x58\x6f\xa6\x9a\xa7\x7e\x87\x98\x3f\xbb\x34\xf1\x47\x88\x8f\x37\x7b\x6b\xc4\x3a\x74\x7f\x28\x88\x83\x6a\x03\x01\x41\x18\xd4\xbb\x9e\xe4\x01\x3b\x8b\xda\x6c\x66\xd3\x6b\x67\xf3\x44\x9f\x1d\x04\xbc\xc1\xc8\xa9\x7e\x7f\x83\x62\x7f\x33\x5d\xaf\xfd\xee\x56\x2c\xb1\x13\xaa\x25\x54\x73\x0b\xe0\x10\xdf\xa9\xab\x8b\xf2\x7d\xc3\xde\x21\x8c\xc7\xf1\xf1\xd7\xee\x0d\xd1\x66\xa7\x96\xe4\x1d\xf2\x7b\x9a\x72\xa2\x8c\xfd\xc8\x91\xfc\x53\xc3\x04\xd5\xda\x01\x38\xc4\x77\xca\x49\x48\x15\x58\xec\xdf\xf7\xe9\x72\xc3\x48\x43\x4c\x74\x98\x46\x79\x87\x5e\xb6\xa7\x56\xa7\x8b\xf3\x92\xe9\xb4\x99\x12\x5a\x3d\xb4\xd5\x12\xc0\x21\x3e\xaf\x07\xf5\x5b\xca\x42\xd3\x22\xd4\x27\xa8\x4b\xa8\xfe\xdf\x29\xbc\x23\x35\xc5\xd1\x9e\xb0\x52\xbf\x94\x61\xe3\x90\xb9\xf4\x55\x67\x14\xae\x0b\xe2\x10\x9f\x77\xcb\x4d\x55\xe2\x7c\x2c\x8e\x84\x37\xae\x60\x66\x09\x03\x77\xa0\x9d\x01\xeb\x4c\x80\xc4\xde\x86\x3f\x3e\x49\xa4\x87\xd0\x07\x1b\xe8\x1e\x61\x00\x07\xd5\x06\x02\x82\x30\x68\xa8\x3b\xc9\x03\x65\x04\xe9\xda\x64\xc6\xaf\x23\xcd\x85\x6c\x45\xfe\x50\xa3\x39\x74\x96\x4c\xd9\xdc\xe9\x15\xfb\x89\xa3\xc9\xaf\x7b\xd6\xd5\xe5\x0b\xbc\xed\x20\x0e\x69\xbb\xf9\x79\x8c\xc2\xdf\xbf\xeb\x13\x49\x08\xae\x8d\xd5\xc7\x3e\xd8\x48\xff\x0c\x9b\xeb\xc8\x8a\x9e\xc9\x35\x71\x9a\xaf\xf6\xe6\x81\x8e\x75\x00\x71\x88\xef\xf4\x9b\x54\xf7\x8f\x9a\x9b\x6f\x2d\x15\x52\x2e\x7b\x3e\x5b\x64\xa4\x8f\xe3\xf5\xd2\x79\x16\x22\x42\xc3\x42\x76\x61\x24\x93\xdc\x62\x0a\xae\x0b\xe2\x10\x9f\xf7\x35\x75\x5f\xc1\xf3\x1f\x9f\xad\x5b\x31\xc5\x07\x7e\x05\xa4\x30\xf8\x2a\x79\x53\x88\x35\x17\x54\x96\xe0\x11\xe5\xce\xd4\x3a\x40\xe7\x26\x82\x38\xc4\xe7\x75\x66\x4e\x18\x7b\x9d\x55\xe0\xdd\x29\x1d\x7e\xed\x0a\xef\xac\xf6\x1e\x7f\x6f\x67\xd8\x22\xbe\x63\x41\xe2\x6f\x85\xd7\xcd\x23\x11\x70\x0f\x80\x38\xa8\x1f\x00\x04\x61\xd0\xbc\xe3\x24\x0f\xec\xdf\x0a\x7b\x1f\xce\x25\xdc\x33\xed\xc1\x86\x81\x7b\x4e\xec\x16\xed\x3b\x86\x76\xad\x05\x8a\xf2\xda\x05\xa2\xca\x6a\x1c\xc5\x6a\xa8\xa6\x1f\xc0\x21\xfd\x19\x18\x7b\x1b\x75\x21\xe0\x87\xd7\x59\x4e\xbb\xe6\x9b\xc4\x2f\x9c\x18\x27\x74\xde\x77\xa1\x50\x33\x15\x9b\x26\x70\xf2\x33\xb7\x50\x41\xa7\x51\x03\x38\xc4\x77\x4a\x26\x97\xde\xf5\x9e\xda\x3a\xcc\x87\xbb\x97\x44\x73\xc5\xc9\x7a\x47\x65\xbb\x54\x4a\x41\x9e\xe2\x0f\xd7\x23\x09\xe3\x78\x73\xa8\x1f\x00\x71\x88\xcf\xab\xd0\xb0\x32\xcd\x81\x26\xa4\x58\xb1\xd9\x8f\x4d\x57\x43\x61\x5f\xc9\x9c\x22\x52\x29\xa3\x54\x73\xbf\x21\x79\xb9\x93\x9a\x10\x3a\x8d\x1a\xc4\x21\x3e\x6f\xd1\x6d\x5b\x0b\x55\xce\xe8\xce\x68\xff\x8a\xb2\xdd\xf7\x56\x4a\x2e\xa6\x31\xab\x7b\xe5\x6a\xf9\x82\x1f\x6c\x7e\xd0\xcf\x39\x2d\xc3\x3d\x00\xe2\xa0\x7e\x00\x10\x84\x41\x21\xea\xe4\x20\xec\xcc\x11\x43\xfd\x60\x3c\x77\x3d\x39\x6e\xaf\x8f\x97\x96\xf0\x5b\x49\xab\x6c\xd4\xd4\xab\x5f\x01\x18\x06\x33\xdf\x19\x0e\xde\x8a\xc0\x43\x25\x88\x43\x0e\xc2\x1f\x14\xdc\x6b\x1d\x29\x24\x25\xdb\x3d\xf0\x0e\x24\x1c\x82\x74\x47\x9e\xcb\xab\x4c\xf7\xcd\x8f\x60\x7f\x7d\x5e\xff\x75\x49\x7c\x0b\xae\x0c\xe2\x90\x83\xb0\x44\x71\x4e\xe4\x94\xc3\xaf\x2b\x04\xfa\x16\x8b\x67\x32\xe3\x1c\x83\x43\xe4\xfd\xdc\x6f\x9d\xff\xa8\xc8\xf5\x00\x9b\xfa\xec\x18\x0a\x74\x0c\x17\x80\xfb\x7f\x41\xf8\xd8\xdd\xcf\xff\xfa\x1e\x61\x2d\xcd\x07\xdd\xce\x77\xd7\x9c\xf5\x3e\xd3\x16\x14\x9b\x56\xf5\x92\x71\xba\xd8\xea\xf5\x4c\xd0\x57\x34\xa4\xf3\xda\x46\x46\x27\x1e\x0d\xc2\xa9\x21\xce\xa2\x89\x6a\xd2\xa9\xe2\xb3\xab\x77\xd1\x3a\xb8\x54\x5d\xb6\x8b\x3f\xda\x33\x1d\x0a\x9a\x53\xda\x14\x9c\x57\x3c\x2f\x7f\x74\xca\xcb\xec\x59\x2b\x32\x7d\xf9\xbd\x09\xb7\x43\xe6\x4c\xa2\x3c\x23\x2a\x2f\x95\xe7\x1b\x9b\x8a\x59\x2f\xfd\x47\xf4\x59\xd8\x2f\x42\xfe\x6b\x41\x18\xd4\xb4\xa3\x35\xc2\x48\x41\x98\xf2\xf5\x7e\x87\x85\x08\xfa\x9a\xcd\x8c\xf3\x9d\x9b\xbd\x55\x39\x6b\xe4\x97\x08\x86\xf4\x19\x1d\xc5\xc5\x53\x06\xaa\x7e\x15\x3d\x3a\x95\xc5\x4a\x01\xe4\xa5\x59\xbd\x4e\x97\xd4\xe1\xcc\x03\x13\xfa\xd1\xaa\xa7\x0a\xb7\xa7\xd3\xa2\x33\xf7\x2e\x4b\x8c\xbd\x2e\x90\x39\xfc\x72\xf9\x3d\xb6\xfe\xa9\x2c\xcd\x22\x07\xe1\xa1\x77\xb8\xb7\x6c\x48\xf8\x0e\x67\xd8\x26\x2b\xac\x5f\x35\x54\x36\xdb\x52\x85\x79\x2d\x98\x07\x6c\x08\x33\x3c\x7f\x36\x2b\x9b\x7e\x2a\xad\xd5\x47\xfa\xd8\xf8\x02\x2e\x6e\x77\x0c\x17\x5a\xfb\xcf\x15\xf4\x92\x4b\xa3\x1c\x61\x36\xce\x34\x28\x3b\x25\xe1\x6b\x45\x6e\x87\x96\xf8\xb2\xbb\xa7\xd2\x5a\xe4\x20\xec\x7f\xcd\x2f\x3a\x94\xfd\xd3\x70\x82\xa5\xc1\xf8\xc4\x3b\xb7\x77\x22\xe8\x53\xb6\x97\x8d\x47\x1b\x94\xbd\x47\x48\xf7\xd0\x96\x2e\x9f\x5a\x10\x06\x99\xe8\xa4\x91\xaf\x85\xfa\x16\x86\xda\x17\xd2\xb2\x91\x7b\xb1\x6c\x3b\xbb\x5b\xd3\x2f\x69\xd7\xf7\x85\xcc\xb2\xd5\x12\xe4\x87\x8a\x9f\x07\x31\x69\x43\xfb\xd6\x00\x1c\xe2\x48\x32\xb5\x2d\x3e\xa3\x2f\xe8\xc8\xc2\x11\xcb\xe3\x46\xf3\x85\xcb\x3d\x6a\x60\x86\x80\xab\x90\x62\xaf\x4e\x7b\x94\xac\x2b\xe1\x3e\x34\x9b\x00\x71\x88\x23\x49\x18\x85\x11\x21\xd7\x9b\xba\x97\x46\xc9\x55\x5b\xd4\xfe\xe7\x83\xf5\xa4\x3d\xa8\x36\x50\xb9\x1a\xec\xbe\x77\x39\xaa\xd5\x1b\xa9\xc3\x75\x41\x1c\xe2\xf3\x36\x32\xea\x8c\x63\x98\x5c\xc8\xfc\x6a\x69\x98\x7c\xc3\x89\x58\x64\xab\x67\xa1\xf7\x45\xcc\x74\xe4\x63\x57\x87\x12\xf5\xfd\x7d\xa8\xf0\x14\xc4\xf9\x4a\xa0\x78\x1d\xd5\x3d\x7b\xf5\x5b\x8a\xa8\x53\xee\xc3\xbb\x07\xd2\x2a\xc3\x9f\x3d\x9d\x2f\x6b\xde\x57\xeb\x2c\x1b\x7c\x1a\x1a\x65\x59\x20\x47\x28\x7a\x03\x1e\x84\x41\x1c\x54\x23\xfc\xcf\x41\x18\xf4\x83\x3e\xc9\x02\x86\x61\x4f\x64\x24\xd3\x73\x1a\xa8\x92\xd4\x6c\x79\xdc\xf9\x84\x2a\x63\xb0\x24\xbc\xec\x87\xf8\x49\x03\xda\x04\x8a\xcc\x95\xa1\x2d\x86\x20\x0e\x29\x58\x6e\xf4\xf3\xf3\x36\xc9\x3c\x72\xb5\x08\x1a\xd6\xd6\x28\x33\x69\xaa\x4d\x49\x64\x44\x61\xe6\xf1\x5f\x4b\x9c\xfa\x38\xc8\x85\x0e\x05\x4b\x00\x87\x74\x70\x78\x46\xd3\xb0\xad\xf9\xcf\xc0\xce\xa5\x2c\xab\x08\xe6\x65\xdf\xe6\x4b\x6e\xe2\x38\xc2\x6c\x3f\xbb\x5e\x5f\xd7\x14\x5b\xb9\x01\xad\x06\x82\x38\xc4\xe7\x95\x37\xbe\x05\x53\x2b\x27\xaa\x71\xfd\xad\x38\x1c\xad\xf9\xe1\x5b\x00\x9b\xf5\x70\xb5\x9d\xaf\xdb\xd5\x8a\x0d\x3b\x43\xdd\x20\x3d\xb8\x2e\x88\x43\xb4\x80\x13\xe5\x4b\x3b\xba\x5b\x18\x74\x4f\xf5\xf4\xe4\x29\x7c\x7a\x9c\x39\xef\x7c\x6a\xc2\xaf\xb8\xf6\xdd\x77\x2d\xa7\x43\xe5\xb2\x36\x54\x17\x06\xe2\xa0\xda\x40\x81\x7f\x9e\x00\x83\x7a\xd7\x93\x3c\xd0\x2b\xa1\x8e\x92\x84\xe3\x04\x6b\x3f\x17\x43\x86\x86\xba\x7d\xa3\x45\x4b\x5f\xf4\x41\x5d\xeb\x01\x69\x0a\x49\xf3\x7b\xc9\x08\xe8\x1e\x61\x10\x87\xb4\x21\x22\x6a\x02\xf3\xa0\x18\x8d\xf0\xc7\x3a\xc5\xc2\xf7\x57\x38\x15\x4b\x3e\xac\x6a\xc1\x7f\xce\xa8\xe2\xe1\xf9\xbc\x1e\xfd\x63\x7a\x08\xd7\x05\x71\x88\x1e\xb8\x13\x77\x18\x5d\x8d\xc6\x4b\xca\x6b\xf3\x51\x91\x5e\xf8\x26\x27\xbf\xd3\x64\x37\xfe\x56\x54\x1e\x81\x73\xd2\xf8\x77\x03\x4e\xe8\xbb\x02\x71\x88\xcf\x1b\x6c\x49\x94\x6a\x9a\x4f\xb0\x6a\x27\xd9\x8b\x51\xef\xe1\x6f\x50\xd5\xf4\xf0\xa7\x95\x5c\xec\x30\xcd\xde\xe4\x21\xf3\xfe\x42\x3b\x5c\x17\xc4\x21\x7a\x80\x47\x4d\x20\x20\x45\x21\x16\xdf\x3d\xea\xd2\x5e\x2f\x0b\xca\xf4\xeb\x46\x1c\x5f\xe2\xfe\x36\x7e\x96\x51\x59\x53\xff\xd0\x34\x68\x02\x0c\xe2\xa0\xda\x40\x40\x10\x06\x0d\x75\x27\x79\xa0\xfa\x02\x51\x29\x5d\xfc\xd9\x16\xc5\xeb\x39\xe5\x37\x58\x6c\x26\x87\x30\xc5\xbf\xe8\xfb\xaa\xb8\x78\x14\xf9\x44\x6a\xc6\xe2\x3f\x83\xea\x22\x01\x1c\xe2\x3b\xf5\x33\xf8\x50\xea\xd0\x7a\xb6\x4b\xec\x39\xa3\xce\x63\x7a\x9a\x5b\x9c\xa8\x41\x5f\x32\x1e\x88\xd4\x75\xfd\x09\x59\x68\xf3\xf3\x84\x6a\x84\x41\x1c\xa2\x07\x68\xa4\x92\xdf\x19\x44\x98\x58\x0e\xff\xfe\x6d\xee\xc7\x58\x8e\x83\x77\x7d\x5d\x0a\x1b\xc6\x6a\xa8\x9c\x7b\x91\xc1\x65\x7c\xa6\x09\xda\xc6\x0b\xe0\x10\x9f\xb7\xf0\x95\xd0\x56\xdd\xb2\x90\xb3\xf6\x44\xe7\x04\x4c\xdc\x03\x5b\x86\x42\x27\x4b\x87\xa8\x77\x33\xb4\x3c\x61\x61\xc1\xc8\x1b\xaa\x13\x07\x71\x88\x1e\x28\x7b\x21\xc3\xd5\xa8\x20\x2d\x3a\x70\xbe\xe6\x7e\x07\x53\xa9\x1d\xee\x53\x3e\x93\x74\x95\x06\xeb\xd7\x66\x41\x09\x81\x1f\x1f\xbc\x80\x7b\x00\xc4\x41\xfd\x80\x3e\x60\x7b\x3c\x60\xde\x71\x92\x07\x1a\x26\xfd\x55\x4a\x22\xe3\x05\xb9\xee\xdf\xf6\x8a\x8c\x83\xfd\xbe\x6a\x45\x27\x57\x4c\xfb\x7b\x9c\x30\xab\x95\xe9\xcb\x77\x03\x5c\xa8\xcf\x06\x70\x48\x35\xb7\xf9\xd5\x25\x63\x23\x5e\x73\x86\x84\xe5\x76\x49\x91\x61\xf4\x79\x3c\x56\xa4\x8b\xcd\xcd\x6f\x39\x9f\xb1\xf9\x92\x10\x7c\x85\xae\xa4\x02\x71\x88\x1e\xe0\xf2\x73\xc8\x60\x51\x78\x46\x5a\x7e\xd1\xfb\xa2\xc0\xe2\xdd\x0f\x6a\x85\xc4\xb1\xf7\xaf\x2c\x63\x3c\xcd\x77\xe3\x6e\xc9\x13\x96\x81\xeb\x82\x38\xa4\xb3\x3e\x73\x49\xe8\xf0\x4b\x2a\x58\xac\xd5\x63\x1c\x6a\x94\x69\x58\xf6\x72\xd1\x67\xc5\x2b\x74\xa4\xc3\x92\x25\x1d\x53\xd2\xd9\x19\xa0\xb3\x3e\x01\x1c\xa2\x07\xf4\x45\x79\xd3\x30\x0e\x55\x7e\x8b\xfd\xdc\xb0\x7b\x3b\x66\xa3\x6e\x85\xbd\xd1\x35\x99\x26\x62\x55\xf9\x26\xf0\xeb\x92\x32\x0f\xb4\x22\x0c\xe2\xa0\x7e\x00\x10\x84\x41\x21\xea\xe4\x20\x9c\x92\x8e\xcd\x3b\xb9\xe3\x88\x47\xa8\xb3\x73\xd3\x4c\xec\x02\xeb\xdc\xa7\x19\x93\x2f\x2d\x3d\xf6\x77\x57\x97\xeb\xdd\x63\x52\x5d\xa1\x7a\x5b\x00\x87\x1c\x84\x93\xe2\x38\x08\xcd\x78\x13\x2b\x49\x38\x0e\xb2\x64\x98\x77\x95\x32\x6b\xed\x42\xd5\x72\xff\x50\xde\x30\xda\x2d\xb3\xfc\x30\x1c\x04\x57\x06\x71\xc8\x41\xf8\xdb\xe3\x41\xdc\xaa\x6c\x4e\xf7\xf4\x46\xa1\xbe\xad\x24\x0d\x4a\x1d\x53\x09\x73\x9c\xfe\xb7\x3e\x4e\x53\x1f\x2e\xbe\x5b\x7d\x76\x13\xba\xfb\x18\xc0\xfd\xbf\x20\x7c\xec\x3b\xfb\xd7\xf7\x08\xc3\x42\x0e\xd5\x17\xb9\x53\xa4\x50\x31\x2e\x97\xaa\xc6\xe5\x56\x15\x0f\xff\xd2\x64\x72\x5f\xfc\x20\x7a\x6f\xe0\x91\x85\x46\x7e\xfb\xd1\x20\xfc\x8a\xa5\x22\x53\x44\x3e\xbf\x1b\x77\xfc\xbc\xc7\x72\x9b\x5b\x5d\x0a\x4c\x87\x2b\xe3\xf3\x42\x73\xcb\x24\xf7\x78\xbd\x06\x0b\xd7\xd1\x1d\x2a\xde\x1c\x8d\x65\x15\x7a\x9d\xcb\x46\x86\xf6\xe4\x42\x72\xa1\xf8\x78\x37\xf9\x78\xdc\xf1\x8d\x7c\x73\x09\x3d\x04\xc8\x4d\x94\xfe\x6b\x41\x18\xd4\xb4\xa3\x35\xc2\x48\x41\xf8\xe1\x79\x7d\x96\xb6\x4c\xad\x36\x98\xf1\x88\xb6\xdf\x94\x6d\x9a\xb5\x9f\xce\xda\x1a\xae\x67\x8b\xec\x0f\x6e\x65\xe6\xdc\x1b\x93\xa7\xb2\x58\x89\x1c\x84\xab\xb9\xed\x0e\xc8\xe9\x71\x51\x51\xba\xed\xe3\xa5\x5a\x87\xcf\xbc\xa7\x52\x78\x73\xb6\x7c\x69\xd2\xb6\x6c\x71\x4c\x21\xa7\xd5\xe3\x54\x96\x66\x91\x83\xf0\x81\x28\xee\xaa\xaa\x12\x91\xd2\x07\x13\x49\xeb\xf3\xa6\xe7\xad\xb4\x6d\x2c\xca\xe6\xe9\x03\x04\x15\xaf\x9f\x8d\x61\x15\xab\xab\x39\x95\xd6\x22\x07\xe1\x69\xf3\x71\xc5\x12\xd8\x93\xb0\x3f\x4e\x32\x74\xcc\x07\xba\x7e\x43\x97\x82\xcd\x18\x92\x3d\x05\x8a\x2b\x94\x97\x26\x9c\x96\x52\x4f\xa5\xb5\xc8\x41\xb8\xc9\x94\xcd\xee\x16\xa5\x63\x23\xb3\xc9\x58\xd5\xb5\x69\x3c\x92\x3f\x75\x95\x14\x5d\x68\x46\x74\xda\xb6\x19\x8c\x92\xd9\xa6\x5f\x4f\x2d\x08\x83\x4c\x74\xd2\xc8\xf7\x9d\x78\x6e\xba\xb2\xc6\xa3\x0b\xa7\x97\xab\xf1\xe0\x5e\x47\xe1\x9e\x43\xd3\x15\x45\xeb\xef\x1c\x76\x6f\x67\xd0\xd9\x5b\x4a\xbd\xe0\x3d\x3e\x88\x43\x1c\x49\x4c\x0d\x7a\x76\x2d\x07\x32\xfa\xf9\x1d\x7f\x3a\x31\x54\x3c\x88\x6f\x89\x1c\xa5\xdc\x5e\x4e\x90\xa5\x50\x87\x2d\xf9\x7c\xc2\x82\x96\x01\x40\x1c\xe2\xc8\xf7\x47\x4d\xd2\xd8\x6a\xf9\x5c\x6b\xff\x27\xf2\xdc\xec\x8f\xbe\x4c\x77\x7d\x18\x6f\x28\xb4\xda\xfb\x5d\xbf\xe9\xc5\xda\xfb\x25\x28\x13\xae\x0b\xe2\x10\xef\x35\xa0\x43\x7b\x18\xe3\x7c\x3d\x2e\x76\x4e\x9e\x8f\x39\xdd\xdb\xea\x99\x42\xee\xc8\x74\xda\xe1\x6b\x01\x99\x4c\xa7\x8b\x49\x42\xeb\xd0\x21\x5c\x20\xce\x57\xe2\xf8\x25\x74\xe3\xbc\x8e\xe2\xfe\x7e\x77\xf8\x3f\x5d\xfb\xd1\xd2\x95\xa6\xfb\xba\xd7\x27\x1a\xe7\x9d\x8f\xb7\xcc\xe8\x92\xe6\xe8\x43\xe1\x4c\x1f\x78\x10\x06\x71\x50\x8d\xf0\x3f\x07\x61\xd0\x0f\xfa\xc4\x93\x42\xa9\x35\xb5\x1a\x5c\x92\x08\xb7\x2a\x23\x77\x70\x6e\xdd\x3b\xbf\x7b\xc6\xf7\xe9\x4c\xd8\xd0\xf3\xa7\x3b\xf5\x01\x0f\x09\x58\xa1\x13\x83\x41\x1c\xa2\x05\xe6\x5f\x5d\xa6\xc3\x60\x21\xd9\x53\xd9\xd1\xba\x15\x34\xbb\x93\x66\x6c\x57\xf9\x94\x58\xf5\x87\xdb\x22\xc6\x54\x72\xc5\xdd\x86\xbb\x70\x5d\x10\x87\x68\x81\x84\x1b\xbe\xb6\x8d\xea\x0c\x3c\xaf\x02\x7a\xf5\x6e\x28\x6d\xd4\x06\xed\x3d\x2c\x8c\xf5\x65\x4a\x3a\x27\x89\x39\x36\xe5\xbc\x01\x1d\x48\x0e\xe2\x10\x2d\x20\x17\xed\x58\xec\x76\x6d\xa2\x45\xbd\xe0\xd6\x6a\xbd\x49\x35\x6e\x2d\x06\xf3\x39\x3b\xcb\xeb\x3d\x51\x1b\xa9\xf9\x3e\x12\xa6\xd0\x0a\x36\x88\x43\xb4\xc0\xdb\xd5\x72\x41\xb3\xaa\x2c\x86\x26\x69\x8b\xeb\x78\xed\x6f\x1c\x3c\xa4\x4d\xf1\x2d\x59\xf7\x5e\xbe\x96\x12\x6a\xfd\x18\x42\x09\x4d\x7e\x40\x1c\x54\x1b\x08\x08\xc2\xa0\xde\xf5\x24\x0f\x08\xa1\x24\xe9\x8c\x3f\x54\x4a\xaf\xb3\xb3\x53\xd0\x3d\xcb\x4a\x18\x68\x1e\xf7\x0b\xeb\x50\x23\x9e\x75\x2e\x8c\x81\xc5\x25\x16\x0a\xac\x20\x0e\xd1\x03\xab\xa2\xcb\xbd\x85\x78\xa1\x9e\xf7\xb0\x07\x16\x5f\x3c\xae\xcf\xeb\x9d\x53\x31\x1a\xa1\x09\x9c\xa6\x16\xdb\xb9\x30\x34\x1b\x0c\x1d\xc2\x05\xe2\x10\x3d\x10\x23\xf7\xe4\xe1\x02\xbf\x36\x4e\xaa\xb2\x18\x4b\x05\x45\xf2\xbd\x57\xbc\x24\x0a\x59\x4f\x2f\x69\xd8\x28\x97\x67\xdb\xf9\xd3\x43\x7f\xde\x80\x38\x44\x0f\xdc\xee\x59\x1d\xb9\x78\xb8\x71\xbd\xca\x90\xbd\xba\xc3\x63\xf0\x5b\xf0\xa2\xdb\xfe\x99\x2f\x0c\x8c\xfa\x03\x6b\x09\x8a\xbf\xbb\xa1\x7a\x56\x10\x87\xe8\x01\xa9\xdc\x78\xfa\x3c\x45\x2d\xb4\x09\x29\x9c\x6e\x98\xdf\xeb\x61\xb5\xd1\x86\xaf\x92\x68\x9e\x62\xab\x37\xa5\xc8\x36\xc3\x77\xe4\xe1\x1e\x00\x71\x50\x6d\x20\x20\x08\x83\x86\xba\x93\x3c\x60\xbd\xff\x2e\xbf\xe6\x0d\xac\xc0\x76\x95\xb8\x21\x9a\xd1\x80\x92\x25\x4c\xca\x25\xa5\x51\x34\x49\x97\x47\x0a\xef\xb6\xfb\x10\x14\x84\x41\x1c\xd2\x4d\x7a\x19\x7d\xbb\x59\x6d\x5e\xd8\x13\xec\x2e\x52\x1f\xee\x44\x44\x7f\xa7\xd4\x6f\xa5\x65\xdf\x39\x2f\x9b\x3b\x43\x9e\x7d\x81\x05\x3a\x84\x0e\xc4\x21\x7a\x80\x91\xb6\xfc\x43\x0f\xa6\x50\x68\x76\xb5\x16\xb9\x53\xb1\xaf\x56\xea\xa5\xa0\xb3\x61\x3f\x16\xea\xf3\xa8\x7d\xde\xc7\x70\x71\xdd\x80\xeb\x82\x38\x44\x0f\x5c\xfd\xf9\x2a\xa4\x06\xc7\xb5\x26\x64\xa6\x6d\x8e\xbc\x24\x2e\x45\x6c\x70\x5f\xb6\xb0\x54\xbf\x66\x9b\xc1\xce\xe9\x71\x62\xed\x0e\x5c\x17\xc4\x21\x7a\x60\x31\xae\xfc\xf7\x8d\x11\xf6\x64\xac\xe7\x59\x45\xa4\x0b\x1e\x64\x1c\x51\x11\x67\xd3\xa5\x5e\x8e\xa1\x0b\x92\x8d\xec\x5e\x4d\x1a\x82\x7b\x00\xc4\x41\xfd\x00\x20\x08\x83\xe6\x1d\x27\x79\x80\xac\xb6\xde\x5f\x13\x56\xbb\xb4\xe2\xde\x4e\xb8\x7d\xee\x7a\x38\x3b\x67\x6b\x54\x9a\xfe\xcb\x7c\xd4\x87\xdb\x05\xe3\x34\x54\xd0\x49\xff\x20\x0e\xd1\x03\xec\xe4\x28\xb4\xf5\xc9\x84\xc9\x21\x79\xd2\xec\xb8\xd2\xe7\xb9\xce\x2b\x87\xc5\xc6\x4b\xcf\x98\xbd\xa8\xd2\x60\x31\x8a\x1a\x78\x00\xd7\x05\x71\x88\x1e\x88\x8f\x2d\x96\xd6\x0a\x13\xc1\xcf\x0a\xcb\x63\x45\xf5\x43\xfb\x91\x4f\xca\xa3\xad\x57\xff\x71\xde\xd3\x7d\x25\xbd\x5c\x23\x9b\x1e\xae\x0b\xe2\x10\x3d\xf0\xcb\x6c\xcd\x7f\xc4\xa6\x13\xfd\x79\xc3\x95\xdf\xba\x1e\xd4\x59\xee\xc4\x34\xa3\xfb\xc3\x2f\xa4\x7d\x77\xde\xed\x3e\x1e\xb0\x4e\x83\xeb\x82\x38\x44\x0f\xb0\xc4\xc4\x2e\x32\x06\x76\xac\xd7\x88\x5a\x53\x71\xa3\xef\x90\xd9\x30\x31\x8e\xdc\xe1\xbd\xc7\x19\xc2\x96\x38\xb1\x75\x53\x46\x03\xee\x01\x10\x07\xf5\x03\x80\x20\x0c\x0a\x51\x27\x07\xe1\x4f\x84\x5d\xbd\x09\x72\xa2\x37\xbb\xe6\x2b\xcc\x7c\x49\x1e\x3e\xa3\x74\xec\xc1\x10\x67\xff\x91\xf7\xd5\x7b\x7b\x66\x94\x08\x2d\x13\x1e\x2a\x41\x1c\x72\x10\x4e\x61\xf3\x79\x58\x74\xc7\xff\x63\x02\x4f\xe5\xb5\x9f\xad\x9f\x35\x71\x57\x0a\xa5\x5f\x0b\x7f\x0b\xfe\xca\xe4\xbc\x2d\x1e\xd1\x55\x02\x45\x6c\x00\xe7\x2b\xf5\xbf\xf6\x1e\x0b\xc2\x93\xd8\x33\x39\xc3\x05\xf4\x76\x81\x5e\xa8\x94\xb2\x1e\xdc\xbd\x67\xaf\x75\x0c\xa9\xf3\x63\x77\xdb\x33\xa6\x94\x3d\xb8\x48\x09\x05\x61\x00\x87\xfc\x36\xfe\xf5\x3d\xc2\xba\x6e\xc5\x42\x96\x97\xd2\x9c\x69\xa5\xf3\xed\xa6\x36\x23\x32\xa4\xad\xfd\xdf\x2b\x06\x49\x48\x84\x35\x52\xcc\x04\xd8\x08\x49\x1f\x0d\xc2\x81\xc1\xad\x55\xba\x0e\x37\x65\xd3\xc6\x69\xad\xcc\x76\x49\x59\xa6\xde\xeb\xdb\x87\xbe\x9e\x2e\x60\xe1\x6d\xeb\xc5\xbd\xcc\xa0\x76\x34\x88\xa7\x1b\x79\xcf\x06\x9e\x0f\x2f\x8b\xaf\x71\xa0\x6a\x7e\xa5\x2f\x1f\xc4\x67\xc5\xf9\xe9\xaa\x2a\x6f\xcb\x05\x1f\xce\x86\x0e\xdd\xff\x5a\x10\x06\x35\xed\x68\x8d\xb0\x3c\x62\x58\x62\x15\xa4\x65\xa6\xe4\x91\xff\x74\x25\xe9\x5c\xb9\xa3\xde\x2a\xbe\x7f\x9d\x7b\xdb\x6e\x94\xb5\x7e\x67\x11\xb5\xdc\xc2\x9a\x57\xf7\xa9\x2c\x56\x22\x07\xe1\xd9\xe5\x4a\x99\x66\x46\x33\x46\xdd\xf7\x8b\xb1\x29\xbf\xdd\x17\x5f\x6e\x64\xd4\xbf\x8f\xb5\xd6\x11\x20\x79\x3b\x25\xe4\xf9\xed\x54\x76\x64\xa3\xa8\x22\x7d\x2c\x8b\xee\x4b\x9a\x77\xde\xb8\xdf\xda\x47\xee\x69\xe6\x5c\xfc\x11\x2b\xb2\xc6\xda\x13\xa3\x72\x23\xc0\xf4\xf7\x43\x23\x18\xdd\x1c\xed\xa9\xb4\x16\x39\x08\x5b\x94\x76\xe1\x3d\x39\x94\x7b\x4a\xad\x96\xb3\xb3\x96\x8c\x2b\x36\xab\xab\x3f\x83\x7f\xd9\xc9\x56\x7f\xa3\x6e\xa3\x2b\x35\x29\xe7\x54\x5a\xeb\x82\xf4\xb1\x32\x35\xec\x4c\xd7\x2c\x70\xaf\xb1\xb1\x30\xc3\x72\x77\xb7\x46\xec\x77\x5a\xe4\x0b\x7e\x0e\x3c\x10\xbc\xd8\xfb\x04\xd7\x4a\x84\xe5\xd4\x82\x30\xc8\x44\x27\x2e\x07\x3a\x2b\xb8\xa5\x7f\xad\x50\x71\xf2\x33\x9c\x0e\xa2\xb2\xa0\x93\xbe\x70\x20\x20\xd6\xc8\x15\x67\xe9\x6a\x2d\x5e\x23\x45\x09\xdd\x1c\x0f\xe2\x10\x47\xbe\x35\x8d\x72\xb4\xa9\xe0\x37\x3e\x73\x52\x1e\xef\x2a\x72\x4d\x0f\xef\x4e\x3d\x8f\xa8\xbe\x81\xdd\xc9\x8b\xad\x30\x5e\x4c\x44\x19\x06\xd7\x05\x71\x88\x23\x9f\x7a\x83\x05\x75\x75\x80\x45\xa6\xdd\xb9\xe8\xf9\x19\x14\x31\x05\x1b\xaf\xb6\xfd\x02\xf1\xab\x75\xd5\xe1\x73\xb4\x9e\xfa\xc4\x49\x70\x5d\x10\x87\x38\xf2\xe1\x7e\x9a\x28\xdf\x21\xaa\xbe\x38\xe9\x31\xdb\x18\xaa\x6b\xb3\xea\x41\x9a\x48\xee\xfc\xd4\x60\x9f\x27\x77\xaf\x7d\x3d\x5e\x5f\x13\xae\x0b\xe2\x10\xef\x61\x60\x7f\xf3\x1c\x5f\x6c\xb6\x61\x77\x41\x3c\x48\xb7\x63\x3e\x3d\x99\xc3\xbc\xb0\xc9\x6c\xd3\x59\xb9\x2a\x2b\xe2\xd7\xb6\x75\x8a\x30\x3c\x08\x83\x38\xa8\x46\x58\xfe\x1f\x27\x3f\xa0\x1f\xf4\x49\x16\x18\x88\xca\xe7\x91\x15\x33\xbc\x61\x64\xab\xe3\x6b\xf4\x24\xfd\x1a\x25\x2f\xe7\xf0\xb3\x83\x8d\x30\xde\xc9\x1b\xef\xc3\xa6\x7d\x4d\xe0\x4d\x07\x71\x48\x5b\x22\xe7\x7b\x84\x87\x7b\xaf\x5a\xa1\x3e\x54\x9a\xb9\xf6\x55\x11\xbb\xfa\x52\xcb\x0a\x93\xf9\x0d\xac\xd7\x9b\x6c\x11\x8f\x13\xae\x6c\x40\x5b\x22\x01\x1c\xa2\x05\xfa\x1f\x31\x5b\x57\x8d\xbe\x35\xc5\x17\x92\x6d\x12\x18\x77\xb9\x67\x9d\x51\x2a\x8c\x11\xef\x48\xda\xd6\xd8\xda\xde\xb5\x2d\x0f\xd5\x06\x82\x38\x44\x0b\x44\x89\xe8\x65\xce\xeb\xae\x96\x18\x79\x96\xb4\x17\x11\xa7\x5f\x9c\x1f\x08\xd7\xb1\x67\x9b\x40\x19\x37\x39\x6c\x3b\xac\xe4\x20\x81\x4e\x4e\x06\x70\x88\x16\xe0\xf1\x7e\x31\x47\xd1\xb8\xfc\xe0\xcb\xcf\x97\xb4\xb8\x5f\x70\x03\xaf\x0a\xb6\x2d\xbb\xd5\xaf\xda\xa0\xcb\xdf\xdb\x8a\x4d\x57\xb8\x06\xad\x06\x02\x38\xa8\x36\x10\x10\x84\x41\xbd\xeb\x49\x1e\x60\x65\xac\x7c\x6d\x5d\x5e\x40\xc1\xd5\xca\x2d\x94\xf5\x70\xb0\xf8\xbd\x26\xa9\xb1\xb7\x6d\xcb\x85\x6b\x55\xca\xab\x24\x64\x3e\x2b\xf0\xb6\x83\x38\xa4\xa3\x02\xc8\x67\xab\x3d\x14\x89\x73\xd5\xa4\x22\xe4\x8b\xb8\x2a\xb3\x66\x6f\x0a\x61\xf3\x95\xac\x95\xab\x0d\xf4\x3e\x3a\xb3\x89\x05\x1d\xbe\x03\xe2\x10\x3d\x30\xa8\xbb\xc2\x78\x5e\xa1\xd9\x9d\x95\xb8\x3a\xc4\x78\x35\x20\x9e\xc1\x5e\x78\x5a\x47\xd1\x1a\xcb\xc1\x53\x99\x23\x79\x65\x0a\xba\x36\x05\xc4\x21\x7a\x40\x7b\xab\x44\x9b\x6c\xf9\x22\x76\xa3\xdc\x25\x5a\xe1\x08\xfb\x5f\x54\xc3\x1e\xec\xaf\x5e\xf5\x9f\x77\xc3\xcf\xe8\x24\xd0\xf6\x83\x26\xec\x20\x0e\xd1\x03\x9a\x1f\x55\x0f\x55\x9a\x5d\x6e\xa9\x12\x45\x85\x78\xf5\x16\x7e\x4d\x58\x5a\x32\xd4\xa2\x50\x3d\xdc\x1c\x8b\xd7\x7c\x52\x4b\xe4\x04\xf7\x00\x88\x83\x6a\x03\x55\xff\xd9\x03\xa0\xa1\xee\x24\x0f\xe4\x89\x90\x3b\x49\xe3\x1f\xb8\x9b\xce\xe0\x5b\x48\xb8\x08\x9b\x3d\xca\x36\xa5\x8f\x2f\x28\x71\xe1\xc3\x0c\x2b\x5f\x93\x13\x78\x0c\x6f\x3b\x88\x43\xba\x40\x80\xdb\x57\x60\x41\x84\x3b\xf8\x77\xfb\xb8\x71\xe5\x16\x4e\xb0\x6c\x7f\x17\x4f\xc1\xf9\x17\x0c\x05\x39\x99\xd1\x76\x6a\x63\x85\x70\x5d\x10\x87\xe8\x81\x32\x63\x99\x2f\x84\x71\xa5\x6c\x67\x23\x07\xed\x2c\x46\x17\x3f\xbe\xde\xf7\x55\x66\x7b\x6e\x4d\x5f\x16\x5e\x62\xf7\xdd\x15\x43\x03\xda\xca\x0d\xe0\x10\x3d\xe0\x29\xd7\xc7\x96\x99\xa1\xd2\xc3\x12\x44\x69\x80\x6a\x16\x7f\x4b\xd2\xf2\xea\xda\x7b\xad\xe0\xeb\xa4\x76\xb0\x68\xd1\x73\x46\xb3\xd0\x19\x04\x00\x0e\xd1\x03\xd8\x7f\xc6\x43\x18\xd3\x3b\x0c\x13\x5a\x9f\xbc\xbc\x7f\xf5\xa2\xda\xed\x3f\x2b\xf8\x4e\x7d\xda\x83\x53\xb9\x1f\xea\x30\x6e\x24\xa6\xc0\x3d\x00\xe2\xa0\x7e\x00\x10\x84\x41\xf3\x8e\x93\x3c\x70\xc7\xe1\x86\xce\xe1\x88\x60\xaa\x4f\x00\xab\x7a\x8b\x74\xda\xc3\x7a\x7f\xce\xec\x57\xc1\x1f\xf0\x9c\x95\xd7\xd8\xb8\xcb\xd7\xee\x43\x3b\x2d\x00\x1c\xa2\x07\x7a\xa8\x43\x32\xe6\xa4\x09\x2b\xca\x7a\xc2\x07\x54\x68\xfb\x38\x5f\xed\x92\x67\x08\x9f\xbb\xfa\x7b\xf2\xe7\xd3\xd5\xd0\xf7\x06\x76\x70\x5d\x10\x87\x74\x56\x40\x09\xea\x0a\xe3\x39\xbd\x84\x92\x46\x4d\x19\x22\x3a\xd1\x17\x73\x9b\x4a\x7f\xa4\x71\xf9\xf9\x3c\x78\x74\x09\x4c\xf8\xe6\x83\xa1\xb3\x02\x00\x1c\xa2\x07\x30\xb9\xf4\x47\xbf\x9f\xff\xd1\xd3\x6f\xb9\xaa\x4a\x77\xf7\xd2\xe4\x3b\x55\xd5\x4b\xe4\x43\xa8\xaf\x15\x8b\xd1\x97\x16\xaa\x16\xf0\xe0\xba\x20\x0e\xd1\x03\xe9\x2e\x3f\x61\x29\x0f\x6f\xe7\x44\xff\x09\x8c\x26\x4f\x63\x27\xf2\x7b\xcb\xc6\xb1\xf6\x56\x90\xcb\x2b\x6d\xb1\x49\x29\x65\x53\x14\xee\x01\x10\x07\xf5\x03\x2e\xff\x1c\x84\x41\x21\xea\xe4\x20\x9c\xf7\xbb\x99\xd1\x90\x4e\xf5\xb7\x37\x95\x14\x0e\x99\x57\x6b\xbf\x9d\x36\x96\xa6\x29\xe3\x9d\xd7\xd8\x4d\x37\xeb\xe7\xb5\x25\x64\xe1\xa1\x12\xc4\x21\x07\xe1\x8e\x09\x2a\x56\x4d\x13\xf7\x04\x97\xfd\xde\xaa\xdb\x39\x75\x98\xb3\x4c\x97\x88\x26\xfe\xe4\x56\x87\x6b\x5a\xb0\xff\xc1\xa0\x11\x84\x2b\x83\x38\xe4\x20\x1c\x85\x2e\x46\xd4\x51\xc1\x7e\xf5\x7c\x5a\x40\x31\x75\x78\x66\xbf\xf4\x28\xd3\x17\xf2\x4f\x97\x1c\xce\x0c\xf4\xf3\x1e\xcc\x28\x68\xc1\x95\x41\x9c\xaf\x14\x16\xc2\xdb\xf8\xd7\xf7\x08\x3f\x82\xad\x96\x3e\xed\x13\xc1\xf8\x19\xc2\x1d\x19\x44\x8b\xe1\xb4\x9b\x66\xad\xd9\xa4\x86\x63\x5f\x3b\xf2\x0b\xaf\x34\xfa\xae\xf8\xd1\x20\x6c\x1c\xcf\x6d\xe3\x8e\xde\xf2\x66\x20\x7c\x6c\x71\xa3\xb0\xf7\xe2\x3b\xd3\x27\x46\xf8\x17\xfc\xb6\xd5\x36\x93\x49\xb5\x12\x26\x0d\x8f\xa0\xed\xdf\x62\x14\x49\xd9\x76\xa6\x9b\x88\x35\x59\x4d\x23\x92\x53\x50\x94\x3e\x2e\x0b\x97\x65\xdb\xf5\x78\x6c\x5d\xb1\xc0\xb7\x60\xfe\xaf\x05\x61\x50\xd3\x8e\xd6\x08\x23\x05\xe1\x27\x21\x0d\x99\x62\xe2\xb8\x09\xf3\x18\xdf\x97\x4b\x9e\xd9\xd3\x55\x09\xff\xae\x38\x58\x23\xe0\x5e\x64\xd8\xea\xdb\x33\x99\x0b\x3b\x95\xc5\x4a\xe4\x20\x9c\x42\x6e\x5e\x55\x28\xdc\xbd\x0f\xbb\x4c\xf6\xe2\xbd\xb9\x41\x7d\xa0\x91\xd6\xd3\xef\x0d\x94\x5b\xee\xac\x0e\xe5\xda\x9f\xda\xb1\x4f\x65\x69\x16\x39\x08\xeb\x92\xa8\xad\xfc\x22\x73\xe1\xac\xa4\x85\x3d\xa0\x6a\xc6\xfb\x14\x4f\x23\x27\xa4\xa0\x1f\x97\x68\x11\x3a\x67\xf2\xd3\xa1\xb2\xe5\x54\x5a\x8b\x1c\x84\x75\x1f\x19\xf8\x28\x1f\x1c\xc8\xca\x5d\x7b\x89\x92\xd2\xe1\xc8\xc9\x4f\x76\x3d\x0d\x23\xfd\x7d\xce\xc7\x54\xf1\xda\xed\xdf\x72\x9a\xa7\xd2\x5a\xe4\x20\xac\x77\xd6\x9d\x54\xae\x84\x60\x4f\x49\xbc\x72\xbd\x73\x2d\xe0\xa7\x9f\x54\x12\xac\x4d\xda\x75\x3d\x8a\xc2\x6f\xfe\xcd\xa0\xb9\xe0\xa9\x05\x61\x90\x89\x4e\x1a\xf9\x12\x93\xae\xea\x7f\xb5\xf4\x4c\x70\x91\x5f\xda\x48\xba\x95\xbf\xca\x2e\xab\x12\xb1\xa9\x64\x6c\xd5\x91\x09\x7b\x57\x62\xf2\x80\x03\xde\xe3\x83\x38\xc4\x91\x2f\xbc\xc6\xb4\x5e\x71\xb9\xcc\x14\x2b\xe9\x33\xca\xa3\x87\xc9\xf5\x84\x53\xe1\x3e\x41\xd4\xb1\x7e\x8e\xd3\xb3\x56\x0f\xad\xfa\x46\xe0\xba\x20\x0e\x71\xe4\xfb\x85\x3b\x2c\xf4\x6b\xf3\xac\xd7\xa7\xfd\x06\x97\x3e\x9b\x07\xab\x9c\x8f\x3a\xc5\x44\x29\x68\x3d\xed\x26\xe2\xcf\x05\xf8\x5d\x81\xee\xb6\x00\x71\x88\x23\x5f\x47\x02\xdd\x39\xed\x4b\xb3\x83\x58\x37\xc7\x1f\x05\xf2\x24\x86\x85\x59\x94\xd2\x17\x72\x62\xa2\xa6\xf2\xf9\x9c\x09\xaa\x72\xb5\x87\xeb\x82\x38\x5f\x09\x14\xb4\x63\x35\xd8\x9d\x5c\x58\xcf\x29\x9d\xf9\x7d\x31\x29\x3c\x0d\xcc\x77\x57\xc2\xee\xde\x52\x1c\xad\xfd\xfa\x39\x65\xd4\xc5\xbd\x06\x35\x3d\x10\x1e\x84\x41\x1c\x54\x23\xfc\xcf\x41\x18\xf4\x83\x3e\xc9\x02\x29\x05\xba\x94\x37\x6d\x7e\xd9\x72\xe8\x7e\x7d\x9b\x9f\x95\x62\xfc\xec\x6a\x78\x18\x79\xa9\xed\x16\x5b\xdd\x07\x0f\x49\xcc\x72\x73\x78\xd3\x41\x1c\xd2\xe1\x30\x41\x31\xf2\x8e\x5d\x2d\x75\xfc\x94\x5c\x35\x06\xbe\x18\x6b\x8f\x50\xf7\xb0\x37\x6e\x46\x38\x13\xd9\x93\x46\x4a\x06\xd2\x42\x2b\x2b\x20\x0e\xd1\x02\x33\x68\x41\x15\xf6\x8a\x13\x9f\x4c\x0d\x6f\x52\x75\xbb\xdc\x5f\xbf\x39\x27\x43\x89\xc9\x5e\xab\x11\x2e\x58\x54\xc7\xac\x9f\x0f\x4d\x80\x41\x1c\xa2\x05\x34\xef\xe6\xe8\xd4\xb1\x96\x69\x0e\x93\x27\x06\xbc\xf8\x42\x56\x95\x64\x19\x5b\xd9\xaa\x55\xd3\xe4\x5e\x77\x27\xb6\xea\xe2\x4f\xc8\xb2\x20\x0e\xd1\x02\x19\x9b\xea\x87\xb7\x9c\xcd\x4b\x68\x50\x59\xe7\x0e\x44\x7e\x28\x06\x6b\x73\x84\x35\x0e\xfa\xa3\x56\x64\xc9\xd0\x7f\xd2\x17\x7b\x0a\x9f\xfc\x80\x38\xa8\x36\x10\x10\x84\x41\xbd\xeb\x49\x1e\xe0\xd8\xeb\x7e\x68\x13\xb9\x1a\xfb\x29\xbb\x4b\xb4\x58\xcc\xd5\xe4\x5b\x7e\x23\x3e\xe3\xcb\xbe\x46\xb3\xaf\x2f\x65\x09\x39\xfc\x22\xe1\x6d\x07\x71\x88\x1e\x08\xcc\xb8\xc3\xd5\xa4\x3b\xd9\x4b\x6c\xeb\xb6\xf4\xf9\x40\x2e\x5e\x59\x36\x50\x0f\xcb\x53\x56\x5b\xba\x6b\xda\xb2\x9b\xe6\x3e\x54\x73\x08\xe2\x90\x6a\xed\x64\x2d\x1f\x44\x33\xc5\xdb\x9b\x9d\x13\x90\xef\xcd\xbc\xa4\x95\xa3\xc5\x80\xc6\x94\x32\xb8\xf9\x21\x5b\xc2\x65\x65\x23\x10\x0a\x57\x20\x0e\xd1\x03\x24\xcb\x7b\x57\xde\xab\x3c\xa5\xed\xc3\x92\x39\x2b\x7f\x2d\xf4\x83\xbb\x0e\xea\x6f\xaa\xaa\xd0\x66\x72\xf3\x73\x74\xa9\x39\xaf\xa0\xeb\x63\x40\x1c\xa2\x07\x6a\x06\xf2\x86\x67\x1f\xbf\xf9\x7c\x1e\x9d\xc4\xae\xf1\x56\xbe\xa5\xdb\xaf\xd0\x3b\xc2\x6c\x29\xcf\xe7\xe8\x93\xe6\x98\xee\x89\xb3\xc3\x3d\x00\xe2\xa0\xda\x40\x40\x10\x06\x0d\x75\x27\x79\xc0\x40\x81\xc3\x53\xf4\xc9\x58\x60\xdb\xcf\x3f\x24\x53\x13\x84\xc3\xfa\xdd\x42\x75\x12\x64\xdd\xda\x46\x52\x4b\x6a\x0f\xbe\x3f\x82\x56\x03\x41\x1c\xa2\x07\xf8\x8c\xf9\x46\x34\x09\x9d\x4d\xd6\x97\x51\x2e\xa4\x69\xd0\x3d\x33\x53\x30\x4c\xbb\x3d\xd6\x20\xe6\x67\x77\xb7\xe1\xa7\x39\xc6\x30\x5c\x17\xc4\x21\x7a\x20\x57\x2e\x4c\x42\x3a\xd7\xeb\x0d\x91\x5e\xb2\x1b\x5f\x3e\x53\x6e\x7d\xdd\xac\x43\x85\xbd\xc9\x64\xc6\x57\x2b\xa9\x4f\x7f\x5e\x40\xba\x20\x0e\xd1\x03\x49\x02\x89\xbb\x09\xb9\x51\x28\xf7\x59\xe7\xb8\x56\x0f\x38\x31\x9a\x83\x50\x1d\xaf\x05\xdc\x6b\x9e\xe0\xc1\xf7\x7e\x27\x5b\x08\x9d\xa0\x0e\xe2\x10\x3d\xe0\x45\x16\xc2\x5a\xcb\xd9\xb4\x95\x80\x1b\xd7\xd2\x80\xe9\xb4\xae\xb7\xc0\x4e\xc5\x77\x43\x2f\x52\x69\x71\x28\x7a\xd3\xcf\x16\xda\x1a\x0d\xe2\xa0\x7e\x00\x10\x84\x41\xf3\x8e\x93\x3c\x40\xbf\x50\xed\xfc\x50\x12\xe3\xaa\x01\x09\x9d\xe2\x58\xbd\x45\x3c\xcb\xa5\x07\x6c\x7c\x81\x18\xdf\xd2\x45\x42\x98\x76\x18\x9c\xa0\x3b\xe5\x41\x1c\xd2\x1f\x62\x28\x7f\x84\x73\x97\xb2\xbe\x7a\x3a\xa1\xf4\xb9\xf2\xeb\x62\x8d\xdf\x4f\xd5\x3c\x27\xf7\xb9\x16\x0d\x85\xa8\xa4\xc7\x51\x3f\xff\xff\x76\x9c\xfc\x33\x87\xe8\x81\xa5\xbb\x74\x34\xb2\x57\x66\xdd\xc6\xeb\x65\x0f\xcf\xe8\x7e\xe8\x2c\x13\xbf\x9e\x70\x8e\xdc\x55\xd8\x00\x05\x73\x5d\x9d\xe2\x63\x09\x5c\x17\xc4\x21\x7a\xe0\x70\xf1\x36\x06\x69\x38\x61\x46\x42\x65\x5f\x8a\x0a\xb9\xb9\x62\x76\x4b\x67\xb9\x9e\xe0\x95\x67\xd7\x66\x32\x32\x57\x0f\x04\xac\xe0\xba\x20\x0e\xd1\x03\x5f\x63\xd4\x17\x66\x49\xc9\x93\xe4\x4c\x1c\x57\x74\xbf\xec\xdc\xdf\x7b\xaa\xf7\x7b\xa0\x4c\x2f\x79\xea\x47\x47\x39\x11\x77\x0a\x0f\xdc\x03\x20\x0e\xea\x07\x00\x41\x18\x14\xa2\x4e\x0e\xc2\xe2\xa5\xb3\x89\x5d\x26\xa2\xdc\xb1\x8e\xd4\x14\xd5\xf8\x2e\x67\x7e\xb6\x44\x05\x91\x17\xcd\xef\x3d\x67\x35\xde\xaa\x64\x35\x33\x84\x87\x4a\x10\x87\x1c\x84\x0d\x0a\xbe\x5d\x26\xf0\x5c\x61\x5d\x60\x24\xbc\xd7\xc4\x81\xeb\xc7\xc5\x6d\x35\x6b\x5c\x1a\x9b\xf9\xc5\x85\x70\xbd\x75\x94\xa9\x1f\xae\x0c\xe2\x90\x83\xb0\x98\x92\x51\x51\x06\x6a\x80\x3c\x5d\x2a\x6f\x7e\x45\x4f\x2d\xb1\xcc\xd7\x2f\x75\x1c\x7d\x6d\x5e\xad\xbd\x8c\x87\xcf\x97\x13\x19\xe0\xca\x20\xce\x57\x8a\x0e\xe1\x6d\xfc\xeb\x7b\x84\xf5\x8c\xf0\x28\x1d\x5d\x85\x9c\x6a\x45\xc6\x83\xf2\x17\x6f\x27\x66\x6b\x4a\xb7\x47\x38\x64\xb7\x48\x88\xdd\x8d\x52\x5a\xd7\x8a\x3a\x1a\x84\xcd\xae\x7e\xdc\x1d\xac\xeb\xe7\x7a\x70\xab\x70\xc0\xbf\xa8\xe3\xca\xf2\x23\xd8\xd4\x9a\xf1\x9f\xea\xf0\xad\x31\xd8\x9b\xb9\xda\xd1\xa3\x53\x5e\x9b\x05\xee\xcb\xe5\xbd\x31\xa4\xbc\xdf\xea\x8c\x4a\x2f\xb1\x2c\x9b\xf8\x25\x85\x5d\x98\xe4\x78\xe8\xe9\x89\x3d\x52\x38\xb7\xfb\x5f\x0b\xc2\xa0\xa6\x1d\xad\x11\x46\x0a\xc2\x05\x52\x45\x54\xed\xf5\x71\xda\x0d\x28\xd4\xb5\xee\xea\xce\xe9\x0d\x16\x07\xfb\xf8\x35\x65\xbf\xbf\x5b\xd0\x3d\x0a\x1f\x7c\x62\x76\x2a\x8b\x95\x82\x48\x19\x4d\xf3\x56\x0b\xda\xe3\xdb\x8a\x0b\x7a\xc9\x9f\x6c\x3f\x3e\x56\x9a\x9b\x70\xe5\xb1\x71\x7a\x9e\xae\x74\xd7\x6f\x2d\x6b\x4e\xce\xfa\x54\xa2\xa1\x17\x72\x10\xf6\x09\x61\xb1\xee\x7d\x44\xf0\xee\x4a\xcd\x6b\xa7\x91\xdf\x91\xba\x39\x69\xcf\xf8\xef\x06\x3a\x10\xbc\x28\xc6\x7b\x3b\xca\x27\x73\xee\x54\x5a\x6b\x80\xf4\xb1\x4f\xd9\x9d\x93\x53\x1f\xe7\xf9\x08\xa8\xbc\x5a\x5a\x2f\x58\x1d\x2b\x99\xb1\x73\x60\x1c\x71\x4d\x76\xa4\x75\xc9\x11\x93\xf6\x48\x3b\x95\xd6\x22\x07\x61\xfb\xcc\xba\xc6\xc7\x97\x8d\x31\x4a\xe5\x75\x9d\xcd\x7e\x57\x8a\x74\x45\x96\x3a\xdb\xf7\x6a\xda\x05\x1d\x88\xf4\x8b\x7f\x4a\x0e\x3f\xb5\x20\x0c\x32\xd1\x49\x23\xdf\x23\x9a\xbc\x48\xe7\x0f\xcd\x1c\x83\x5f\xff\xf0\xac\xec\xc5\x08\x93\xff\x6a\xb7\x72\x5e\xb8\x4e\x3b\xb2\xb5\x91\x4b\x37\xab\x00\x2d\xad\x80\x38\xa4\x63\x22\xf7\x92\x44\xe6\x2a\x1c\x79\xdc\xab\x5c\x88\x1e\xf5\xc7\xd7\xbc\x7a\xc5\xac\x26\x30\x61\x44\x6c\x79\xa9\x4a\x6c\xed\x0f\x2e\x34\x9b\x00\x71\x88\x23\xdf\x66\xb6\x45\x7b\x3b\x6d\xe5\x33\x1e\xfe\xbd\xab\x03\x4f\xf4\x3f\xbb\xca\x4c\xa5\x9d\x27\xc5\x6a\x59\xed\xde\xcd\x30\xd8\x47\xa5\x81\xeb\x82\x38\xa4\x15\xe1\xcd\x85\x59\xcb\x82\xf3\x9b\x3c\xb4\x44\x94\x91\x41\x0f\xb7\x98\xeb\x71\x3b\x28\x39\x6b\x2b\x35\xdf\x46\xbb\x06\x44\x6a\x65\x41\x2b\xc2\x00\xce\x57\x02\x45\xec\xa8\xae\x52\x1c\x8d\xfd\xeb\x36\xc3\x91\x39\x98\x40\x51\x3b\x3d\xd5\x1f\x75\x36\x92\x62\x81\x18\xcd\xd7\x11\xca\xd2\xde\xa9\x12\x2e\x1f\xe0\x41\x18\xc4\x41\x35\xc2\xff\x1c\x84\x41\x3f\xe8\x93\x2c\x30\x68\x83\x36\xab\x61\xd7\xf1\xae\xfc\x02\x89\xdc\x58\x33\x4d\xfe\x08\x75\x57\x92\x43\x16\xb3\xa5\x9f\x18\x7d\x8a\xfa\x6c\x28\xb4\x12\x0a\xe2\x10\x2d\xb0\xab\x85\xe1\x58\x99\x29\xd3\x59\x2b\x9f\xae\xbf\x19\x52\x37\xc3\xbf\x61\x67\x72\xf9\x42\xba\x7b\x4d\x5e\xbb\xf7\x97\x56\x36\x0a\xe8\x24\x62\x00\x87\xf4\x5f\x88\xf9\x82\x58\xa1\xd6\x7a\xfb\x79\xd7\x16\xcc\xb6\xac\x66\xf5\xde\x26\x14\xaf\xa6\x14\x01\x4b\x7d\x7f\xde\xa4\x7b\x95\x69\xd0\x57\x05\xe2\x10\x2d\x10\x2d\x36\x12\x87\x3b\x20\x68\xfb\x25\x70\x61\x9d\x53\x78\x9d\x34\xd0\xf6\x06\x4d\xf6\xf5\x8f\x76\x3e\xfe\xf2\x81\x1f\xd1\x48\x6a\xe1\xba\x20\x0e\xd1\x02\xe9\x77\x73\xc9\x6a\x87\x3c\x7e\x2d\x7f\x9a\x20\x31\x72\xcc\xf8\xad\x6e\x5a\x99\x6f\xad\xfc\x3e\xd9\xd2\x5b\xaa\x57\xd1\xba\x1c\xda\x1a\x0d\xe2\xa0\xda\x40\xc1\x7f\x9e\x00\x83\x7a\xd7\x93\x3c\xe0\xf5\x08\x2f\x36\x98\x32\x5b\x6e\x91\x32\x64\x4d\xff\x06\xa9\x32\xfd\x67\x9d\xce\x0f\x8c\xf1\x7d\x9a\x8f\x12\x04\x08\x1e\xfc\x81\xee\xf9\x04\x71\x88\x1e\x28\x5f\xfa\xe3\xda\xfd\x6e\x67\x23\x65\xdf\x76\x26\xd1\xca\xf7\xb9\x20\xd6\x74\x57\x7a\xe4\x48\x96\xc1\xb9\x8f\x52\xb3\x98\xfd\xd0\xa9\xd1\x20\x0e\xd1\x03\x1f\xfd\xdc\xf5\xd6\xf0\xa6\x37\xe4\xfc\xd2\x22\xf6\xb1\x85\x2c\x53\x54\x09\x88\x63\x2a\x65\xce\x0a\xd2\x05\xc5\xbe\x53\xf5\x8c\x81\xeb\x82\x38\x44\x0f\xb8\x77\x92\x97\x3b\x9f\x49\x23\xc9\x15\xde\x88\xb0\x1c\xbb\x6c\xf0\x72\x40\xf5\x21\xca\xb9\xdb\x14\xfe\xc3\x1c\x0f\x5e\x05\x11\x43\x57\x89\x81\x38\x44\x0f\x70\xad\x14\x89\x5e\xcb\xc0\x62\xd2\xbc\xad\xf7\x63\x66\x63\x2d\x3c\x66\xdd\x63\x27\xaf\x33\x84\xa2\xad\x47\x34\x0e\xff\x46\xdc\x39\xb8\x07\x40\x1c\x54\x1b\x08\x08\xc2\xa0\xa1\xee\x24\x0f\x60\xa0\x25\xfd\x41\xa7\x61\xd4\xcb\x4e\xc8\xf6\x35\x19\x79\xe5\x22\xac\x62\x14\xc8\xb1\xfd\x54\x63\xab\xc7\x5e\xb0\xbc\x88\xf1\x23\xbc\xed\x20\x0e\xd1\x03\xed\x91\xb7\x51\x47\x96\x5c\xc5\x5f\xfb\x2d\x45\xe1\x57\xe3\xd5\xe9\xdb\x87\xa7\x79\xed\x25\x8f\x8f\x2b\xa8\x88\xb1\xdd\x98\x60\x84\x4e\xf6\x05\x70\x88\x1e\x68\x30\x9d\x37\xd9\xe9\xbd\x60\xf3\xc4\x8c\xe8\xe0\x9d\x4c\xba\xeb\x5b\xd3\xb9\x44\xa5\x54\xe9\x82\x29\xc7\x92\xa5\x6d\x3c\x05\x33\xa8\x9e\x15\xc0\x21\x7a\xa0\xc1\xe6\xa6\x30\x25\xab\x40\x6a\x92\x59\x7f\x9e\xda\xb5\x3f\x3f\x5a\x27\x42\xc9\x09\xfe\xb8\xb3\x37\xdf\x9f\xfa\xc6\x40\x49\x06\x6d\x0e\x02\x71\x88\x1e\x10\x34\xcb\xe7\x6a\xc8\x91\xce\x48\xdb\x4f\x17\x5e\xdb\xa8\xcb\x90\xa7\xbe\xea\x1a\x85\x33\xeb\xf2\xc4\xeb\x56\x7f\x00\x7e\x92\x26\xdc\x03\x20\x0e\xea\x07\x0c\xfe\xd9\x03\xa0\x79\xc7\x89\x95\x52\x65\xfc\x76\xe4\x11\xda\x2d\x15\x2a\x4c\x8c\x2b\xf6\xb1\x92\x8d\x18\x84\x63\xea\xe4\xe7\x3f\xc6\xc5\xa0\x7c\x5d\xea\x3c\x07\x1d\x16\x07\xe2\x10\x3d\xa0\x71\x85\x45\x3b\x52\x65\xc1\xe9\xee\xba\xbd\xc8\xa1\xfe\x32\x0f\x99\xef\x5a\xe0\x90\xd8\x33\xbe\x97\x76\x28\xcc\xe4\xd8\xca\xd0\x49\xff\x20\x0e\xd1\x03\xd1\x75\xe6\xed\x18\x4f\xf2\x9c\xd8\x44\xb0\xf7\xad\x18\x58\x67\xdf\x8b\xe2\x26\x49\x98\x68\xc0\x5a\x7c\x5a\x28\xcd\x16\x5a\xa0\xed\xfc\x20\x0e\xd1\x03\xe7\x0f\xa5\xcc\x84\x5b\x6e\x0b\x11\xba\x0d\xda\x15\x15\x04\x75\xf0\x58\x99\x6d\x04\x90\x97\x5f\xb6\xf2\x5b\x8a\x7a\x32\xe1\x02\x8d\x5d\x20\x0e\xd1\x03\xb8\x7c\x81\x81\x5e\x93\x63\x24\x97\xe6\xc2\x96\x08\xe7\x9c\x3f\x92\x2c\xdd\x9e\x66\x8f\x97\x15\x0a\x4c\x56\xf0\xae\xa6\x20\x1d\x83\x7b\x00\xc4\x41\xfd\x00\x20\x08\x83\x42\xd4\xc9\x41\x78\x80\x71\xfd\x4b\x59\xf0\x4a\x8e\xea\xd5\x1c\x47\xf2\x70\xdb\x81\x2a\x21\xa7\xbc\xc0\x91\xaa\x91\xce\x6b\x92\x65\x09\x13\x5e\xe5\xf0\x50\x09\xe2\x90\x83\x70\x55\x03\x5a\x00\xca\x97\x67\xdb\xb5\x97\x98\xb1\xdd\xda\xcb\x59\x3e\x12\x38\xb1\x3e\x59\x19\x8f\x1b\xe6\x89\x35\x1f\x4f\x55\x6b\x83\x2b\x83\x38\xe4\x20\x5c\xd5\xcc\x8a\x19\x41\x22\x57\x52\xfa\x31\xa8\x6d\xdb\x72\x60\x6b\x98\xa4\xdc\x44\xcb\x9c\xf8\xd0\x94\xc1\xcd\x29\x76\x54\xe8\x03\xa4\x0c\xe0\x7c\xa5\xbc\x10\xde\xc6\xbf\xbe\x47\x38\xda\x3e\xde\xdc\x37\x06\x37\x69\x97\xc3\xeb\x0e\x71\xe2\x65\x72\x86\x8c\x17\x02\x65\xf4\xb0\x79\x3c\x36\x96\xd9\xa4\xcf\x1f\xcb\x8e\x06\x61\xcc\xe8\x5b\xc4\x21\xf9\x55\x9a\x13\x59\x0d\x3b\x6d\xae\xdf\x88\xfc\xbf\x0f\xf8\x37\xea\x56\x36\xe3\x0d\x46\x48\xb2\xdd\xb6\x69\x3b\x82\xbe\xe2\xc4\x1d\x6c\xf5\x30\x95\xda\x7e\xd3\xb9\xfc\x63\x39\x75\xd3\xa7\xbd\x6d\x44\x9c\x2b\xb5\x35\x34\x52\x51\xa1\xe2\x0c\xfe\xa5\xff\x5a\x10\x06\x35\xed\x68\x8d\x30\x52\x10\x3e\x2c\x91\xcc\x53\x28\xfc\x70\xf6\x37\xeb\xc2\x8f\x9b\xeb\x94\xeb\x73\x66\xcd\x36\x57\xf0\x4a\xf6\xe2\x76\x2b\xd4\xfb\xd3\xc8\x6c\x4e\x65\xb1\x12\x39\x08\xbb\x0b\xf0\x29\xe4\x86\xcd\x98\x5e\x4e\xe5\xf8\xe3\x67\x99\x4a\xfc\xa9\xad\xc0\x75\xbe\xc0\xee\xf9\xe5\xe9\xbd\x8f\x22\x54\x37\x95\x4f\x65\x69\x16\x39\x08\xef\xe1\x4b\xc9\x3e\xba\x44\xd0\xba\xfa\x98\x2c\xcb\xd7\xfd\xf6\x66\x14\x63\xff\xda\xb4\x75\xa7\x9b\xda\xe0\x0d\x32\x57\x2e\xfc\xd3\x59\x9a\x45\x0e\xc2\xa3\xb0\x14\x16\x0b\x76\x29\x55\xa5\xf6\xec\x97\x0e\x7b\x6c\xd3\x65\x67\x33\xdf\xcf\xbd\x90\xa1\xbe\xc0\xd9\x84\x1f\x29\x1f\x72\x2a\xfb\xcf\x9b\x90\x83\xf0\xf4\x81\xa7\x48\xf1\x85\x78\x93\x33\xdc\x9d\xc2\x16\xcc\xf6\x3b\xf4\xab\x2b\xd5\xab\x0b\xca\x15\x7b\xb6\xe4\x84\x3e\x0b\x0c\x1f\x4e\x2d\x08\x83\x4c\x74\xd2\xc8\x17\xca\x7f\x79\x43\x5f\xd6\xb0\xa4\x8c\x9d\xd2\x26\xe4\xf6\x12\x55\xc1\x4f\xd3\x6f\x58\x7c\x8a\x46\x9f\xb7\x8d\xc9\x77\x03\xac\xa0\xfb\x73\x41\x1c\xe2\xc8\x27\x90\x2b\x69\xc4\x68\x78\xf5\xf9\x59\xbc\x85\x4a\xad\x1e\x7b\xfa\x86\x2f\xa5\x92\x9e\xa9\xe6\x89\x30\x22\xc9\x43\x29\x0e\x5e\xa8\x90\x13\xc4\x21\x8e\x7c\xe1\x96\xe7\x8b\xa8\x8d\x38\x33\xcf\x8f\x9d\xe5\xc4\x27\x98\xce\x97\x73\x50\xa3\xad\x63\xde\xf0\xa0\x29\x8e\xfe\xbd\x78\xb1\x1d\x3a\xc5\x02\xc4\xf9\x4a\x1c\xbf\x2c\xee\xfa\x57\xd2\xcf\xb0\x0f\x58\xfa\xf8\xe1\x18\x14\x2c\xa2\x8a\x78\xb5\x17\x32\x65\x08\x6e\x3f\xcc\xed\x11\x60\xa4\xba\x4b\x9c\x0c\x9d\xec\x04\xe2\x10\xdf\xef\x0a\x9d\x86\x49\xfa\x17\x6a\x1b\xb3\xa6\xa9\x6b\x71\x07\x7a\x82\x78\x92\x4a\xce\x35\xf5\xf8\xef\x86\xd6\x5f\x2a\xcd\xb4\x6e\x28\xc1\x83\x30\x88\x83\x6a\x84\xff\x39\x08\x83\x7e\xd0\x27\x59\xe0\xa1\x0a\xc9\xe4\xaf\xf7\xe9\x85\x6d\x6d\x62\xaf\xc2\xd8\x7f\x52\x8d\x26\x10\x70\xe8\xcb\xfd\x20\x8d\x75\x46\xc1\xa1\x9d\xd4\x6b\x86\x37\x1d\xc4\x21\xdd\xc9\xba\x21\xc8\xd4\x53\xd2\xd4\xca\x7c\x58\xb5\xf0\x6b\x3c\x83\xf8\xd9\x57\xf6\x9c\x84\xd9\x37\xe9\x7e\x9d\xa5\x9a\x3c\xab\x77\xa0\xf3\xd2\x40\x1c\xa2\x05\x5e\xdd\x67\x7f\x9a\xff\x70\xd5\x9b\x81\x04\xbb\xff\xb9\x47\x00\x17\x07\xa5\xdf\x08\x19\x65\xc4\x22\x99\xc5\x0a\xab\xd8\x30\x11\xb4\x6a\x01\xe2\x10\x2d\x50\xbb\xfa\x01\x15\x65\xf6\x1c\xc9\x67\xca\x27\x28\xea\x9f\x35\x64\xc4\x13\x5f\x4c\xa1\x17\x8d\x71\x97\xd1\x18\xdd\x57\x1a\x25\xff\xbf\x6b\x53\x00\x1c\xe2\xfb\x95\x1e\x09\xce\xda\x39\x0c\x97\xf1\xe6\xb2\x5f\x70\x46\x43\x5d\xcf\xad\xf5\xbf\x58\x22\x46\x9c\xb2\x25\xf1\xf5\x97\x33\x66\x1b\x14\x84\x41\x1c\x54\x1b\x08\x08\xc2\xa0\xde\xf5\x24\x0f\xdc\xc3\x60\xba\xb2\xc4\x82\x11\x41\xd4\x20\xb1\x5e\x65\x47\xde\x9d\xa1\x75\x47\xc7\x70\x2d\x8f\xf9\x25\xe3\xbc\xac\xc1\xe3\x28\xe8\x0e\x65\x10\x87\xe8\x81\x1b\xe9\x99\x74\x78\x35\x16\x02\xde\xa4\xb6\x89\x6c\xdd\x04\x4f\x65\xb0\x19\xde\x72\x9b\x09\xdd\x8e\x4f\xd2\xbc\x33\x63\xac\x8c\x06\xd7\x05\x71\x88\x1e\xd8\x28\x21\xca\x26\xce\x66\x79\xa9\xec\xc5\xe1\x12\x38\x49\xbe\x71\x65\xb0\xab\x5a\x57\x85\x11\x8b\xef\x61\xa8\x17\xcc\xa4\xfa\x3b\x5c\x17\xc4\x21\x7a\xe0\xb0\x51\x16\x7d\xaa\x93\xbb\xba\x34\x09\x87\x6c\x2b\x7a\xfa\x0b\x6f\xea\x13\xaa\x73\xda\xbc\xb1\xb8\xa3\xd2\xc4\x67\xf9\x14\xa1\x23\x13\x40\x1c\xe2\xfb\x25\x1e\x28\x66\x86\x99\x24\xe9\x85\x30\x3a\x89\x12\x0f\x31\x6f\x63\x6e\xe9\xc9\x13\xa8\xf4\xa3\x3d\xec\x88\xed\xd2\xf7\x4d\xeb\x82\x7b\x00\xc4\x41\xb5\x81\x80\x20\x0c\x1a\xea\x4e\xf2\xc0\xb3\x72\x97\x4a\x7e\xdf\xc2\x4b\x9e\x3b\x21\x64\x68\xa3\x51\x41\x9b\x59\x28\x19\x9f\x6c\x2f\xf6\x50\xf0\x97\x48\xfe\xc2\xa2\x53\x86\xb7\x1d\xc4\x21\x7a\x60\x60\xc0\xc8\xb4\x4d\x6a\xdc\x2c\x4b\x20\xf7\xed\x5a\x7a\x1e\x85\xbd\xaf\xc8\xe1\x18\xe6\x52\xe6\x66\xef\x5d\x3a\xa6\xc7\x7a\xd0\x89\xc1\x20\x0e\xd1\x03\x1a\x4b\x53\x7d\x33\x95\x7d\x65\x62\xba\xe3\x18\xa6\x81\x89\xb2\xe8\x66\xfa\xe2\xa2\x2c\x95\xbf\x76\xeb\x8d\xb9\xaf\xa1\x10\x0d\x42\xe1\x0a\xc0\x21\x7a\x40\xda\x2e\x46\xc6\x68\x26\x4a\xcf\xad\x19\xa7\x7c\x47\x4d\x3f\x7f\xd9\xec\x70\x6c\xf0\xfc\xf5\x3f\x36\xca\x6e\x69\x2c\x39\x52\xd0\x9f\x37\x20\x0e\xe9\x5c\xca\x01\x95\x6e\x93\x7e\xc7\xd4\x92\x2e\x27\xbd\x54\xbf\x90\x96\xcc\xa5\x17\x6d\x1f\x5d\xb3\x26\xb3\x5f\x7b\x56\x91\x72\xf9\xf5\xc1\x3d\x00\xe2\xa0\x7e\x00\x10\x84\x41\xf3\x8e\x93\x3c\x10\xf3\x26\xff\xfd\xab\x45\x31\xdd\x06\x5f\x9f\x41\x49\xeb\x36\x8a\x9b\xf1\xcd\x54\xfc\xe4\x0a\x8e\x9b\xcf\xcd\x19\x13\xd8\xfb\xcf\x43\xb5\xf7\x00\x0e\x29\x08\x3b\x3a\x3a\xcc\x09\xb2\xf2\x49\xf4\x3c\x4a\x2a\x59\xca\x26\x94\x1c\x32\xf6\x7e\xf4\x45\xda\x54\x33\x2e\x22\xad\x33\xd4\x2d\x04\xfa\xae\x00\x1c\xa2\x07\x26\xce\x7e\xc1\x5b\xe0\x2c\x71\x29\x1b\x12\xd8\xeb\x14\xc7\xca\xd4\x1d\x2d\x1a\xb2\xb3\xf5\xed\xe5\xa1\xe5\x62\xda\x27\xfe\x0e\xfd\x21\x06\xe2\x10\x3d\x70\xbe\x3b\x60\xbf\xe1\xe2\xad\x79\xfb\x39\x92\xf0\xbe\x83\x38\x6f\xcb\x08\xcd\xcb\x8f\x1e\x26\xaa\x30\x1a\xa9\x08\x90\xb7\x2f\xbc\x86\x82\x30\x80\x43\x7c\xbf\x96\x3e\x9c\x0f\x6c\xc9\x65\x9f\xe0\x30\x5b\xd7\x10\x08\x2c\x0f\xd7\x5e\x3c\x90\xf8\x7a\x05\xed\x31\x1a\x7b\xab\xf0\xb4\xa6\xc7\x15\xb8\x07\x40\x1c\xd4\x0f\x00\x82\x30\x28\x44\x9d\x1c\x84\x97\xa8\x5e\x4e\xb1\xc6\x65\x70\x6f\x6e\xf4\xb6\x7c\x41\x4f\xf7\x38\x78\xed\xcc\x9d\xfb\xda\x35\x07\xcd\xd3\x65\xab\x55\x47\xae\x11\x1e\x2a\x41\x1c\x72\x10\x36\xa6\x4d\x64\xf5\xf4\x99\x5f\xa7\xa3\xec\xff\xfa\xe8\x6a\x4f\x6b\xf3\x22\x2a\x1a\x9d\xee\x4e\x1a\x5e\xfa\xcc\xed\xee\xde\x6c\x02\xb8\x32\x88\x43\x0e\xc2\xfd\xa1\x51\xcd\x0f\x86\xfd\xa6\xe5\x9e\xab\x72\x45\xf7\xfb\x76\x44\x4b\x1d\xfe\xe0\xac\x6b\xf8\xc0\x76\x3e\x36\xb3\x2a\xa2\x80\x0e\xae\x0c\xe2\x7c\xa5\x50\x50\x8f\x2b\xff\xeb\x7b\x84\x95\xd1\xba\xdb\xbb\xca\x02\xb8\x0c\x92\x4b\x9b\xb2\x82\x12\xfb\x69\x62\xb6\x9a\xc4\xb0\xe5\xc3\x58\x17\xae\xa0\x09\xbf\x7c\x14\x7e\x34\x08\x3f\xc3\xae\xcc\x6e\xa6\xa7\x0d\x59\xe8\x2a\x69\xbe\x2b\xc2\xe4\x82\x21\xc1\x29\x76\x47\xed\x60\x51\x6a\x53\x24\x48\xf2\xae\x97\xc2\x11\x34\x01\xad\xa2\x30\x68\x48\xa2\x2d\xcb\x34\xb8\x35\xa0\xfb\xbd\xa8\x5d\xb5\xcf\x8a\xa4\x55\x28\xb1\xfa\x3d\xcd\x99\x95\x5d\x74\x9e\xff\x5a\x10\x06\x35\xed\x68\x8d\xb0\x02\x62\x58\x62\x94\xae\x75\x93\xbc\x2a\x1b\x17\xc1\x8d\xc6\x53\x42\x5e\x88\x2e\x29\x43\x14\xbf\x4a\x34\xdc\x37\x42\xbe\x3c\x3c\xac\x3d\xad\x76\x2a\x8b\x95\xc8\x41\xf8\xe7\xf3\x07\x6c\x2e\x2b\x0b\xd2\x05\xc6\x87\xbb\xf9\x17\x42\x88\x35\x9f\x34\x84\xde\x0d\x0c\x7c\x73\x45\x52\xdc\xb0\xeb\x3b\xe9\xc1\xa9\x2c\xcd\xde\x46\xfa\x58\xab\xb5\x73\xb5\xfc\x18\xb6\x87\x2a\x7a\x21\xc3\x18\xf6\x1f\xad\x0a\x19\x87\x82\x4b\xaa\x6b\xb7\x34\xf1\x2b\xbc\x16\x32\xa8\xeb\x4f\xa5\xb5\xc8\x41\xd8\x9d\x69\xf8\xfa\xc5\x16\x98\xe4\x9c\x98\x8e\x74\xd5\x14\xab\x3b\x59\xbc\x50\x58\xe8\xd9\x44\x4d\xd1\xc4\x15\xb9\x9b\xa8\xa6\x57\x4f\xa5\xb5\xae\x48\x1f\x1b\xf8\x54\xc7\x47\x72\x26\xcf\x52\x30\x7c\xc8\xc1\x11\xb3\xa5\x94\x72\x65\xca\x66\x74\xcc\x4e\x9b\x5b\x43\x54\xa9\xf7\x11\x47\xc4\xa9\x05\x61\x90\x89\x4e\x1a\xf9\x6e\x84\xca\x52\x09\x9a\x5c\x0b\x6d\x4d\x4e\xec\xe7\x33\x1d\x1d\x50\xf9\x4e\x33\xa6\x0a\x23\xb0\x13\x56\x31\xfb\xc6\x79\x6f\xed\x32\x34\x53\x05\x70\x88\x23\x9f\xc4\xc5\xe4\xdf\x78\x3a\x4f\x31\x88\xca\xa8\x98\xea\x2d\x4a\xfa\x6d\xdb\x3f\xc6\x52\x98\x7f\xe1\x27\xd9\x4c\xd0\xad\x2a\xa5\x85\x8e\xf6\x05\x71\x88\x23\x5f\x4a\x42\xc9\x4c\xe6\x92\xad\x17\xcb\xbc\x96\xc2\x8f\xed\x06\x3b\x9f\x12\xbf\x18\xdf\x90\xa7\x6f\x28\x2b\x4c\xe7\x1b\xb9\x18\xaf\x43\xfb\x78\x01\x1c\xe2\xc8\x77\xb7\xd0\xf9\x5c\xa1\xe7\xcc\xef\xda\x8a\xdb\x0c\x5f\xd2\x27\xb7\x23\x89\xbf\x7f\x17\xa2\x08\x79\x18\xf5\xf2\x77\xa8\x59\xf2\x2b\xe8\xe4\x15\x10\xe7\x2b\x41\x77\xec\x3d\xbc\xe1\xb3\xde\x4b\x3c\xa8\xa1\xc0\x3e\x14\xf3\x78\xad\x70\x43\xf4\x3d\xbb\x12\x93\x38\xab\xe2\xe5\xd2\x81\xaf\x2c\x55\x8f\x34\x12\xe1\x41\x18\xc4\x41\x35\xc2\x0a\xff\x38\xf9\x01\xfd\xa0\x4f\xb2\xc0\xf0\x8a\x41\xe7\x7b\xe5\xf2\xce\x07\x81\xfc\xb0\x1e\x43\x61\x0f\x35\x31\xe9\x12\x7a\x37\xbe\x96\x2c\xf9\xfc\x2c\x75\x07\x77\x62\x78\xd3\x41\x1c\xd2\x41\x49\xf6\x1d\xc3\xdc\xe8\x5d\x41\xdf\xe3\x0d\xcf\x4f\x8c\xa6\xcb\x6d\x52\x1d\x5e\xa2\x30\xe2\xc7\x9a\x74\xa8\xc4\x77\x95\x0f\x87\x56\x82\x40\x1c\xd2\xd6\xe8\xdb\x92\xcc\x49\x75\x62\xfe\xc5\xf3\x6d\x86\xc2\xdf\x16\x0b\xc3\x5f\x1b\xe5\x14\x25\x38\xb8\xc4\xdd\xb9\x6c\xba\xf2\x92\xdf\x17\xda\x1a\x0d\xe0\x10\x2d\x50\x38\xce\x9f\x61\x2c\x36\x3d\x5f\xd0\xaf\xf0\xee\xed\xca\xeb\x6a\x67\x3c\x1e\x4c\x11\xa5\xa2\x17\x65\x18\xcd\x8b\xea\xac\xf8\x06\xd0\x69\xb1\x00\x0e\xd1\x02\x05\xd8\xf5\x01\xfe\x6a\xeb\xa8\xf6\xeb\x6a\xf6\x58\x6c\x33\xa1\xdd\x0c\xd6\x28\xc9\x2e\x32\xef\xf8\x7a\x29\xee\xdf\x9e\x7c\xa8\x07\x9f\xfc\x80\x38\xa8\x36\x10\x10\x84\x41\xbd\xeb\x49\x1e\x08\x6c\xd5\x35\x1d\x29\x2f\xf0\xb6\xf2\x7e\x61\x62\x11\xf8\x99\xab\x6a\xc7\x69\x34\x66\x48\xa0\x70\x03\x35\x3b\xec\xc2\x94\x23\xf4\xbf\x15\x88\x43\xf4\x40\x0e\xe1\x4a\x76\xd7\xbb\xab\xec\x15\x1f\x46\x05\x4a\x5e\xa4\x1a\x51\xd6\x6f\xfb\x58\xe6\x60\x63\x27\x5e\xd8\x78\x77\x93\xe2\xff\xb6\xc5\x82\x38\x44\x0f\x58\x28\xeb\x6b\xa7\x6e\xe1\xa1\xee\x68\xb5\x33\x50\x89\x6a\xd4\xdf\x2f\xd6\x70\x61\x12\xc5\x58\x32\x9b\xcc\x79\xee\xb1\x83\x4f\x09\xd7\x05\x71\x88\x1e\xa8\x9a\xa9\x5c\xfb\xb6\x59\x17\xea\x4b\x83\x52\xcf\x23\x4a\xd7\x47\xed\x6b\x85\x23\x12\x82\xf6\x50\x88\x5c\xf8\x5e\xf1\xbd\x87\x75\x70\x5d\x10\x87\xe8\x01\x21\xd4\x41\x6a\x52\x77\x3b\x52\x2f\x1f\x1c\xb2\x16\x52\xb1\xa2\x5e\xba\xdc\x8e\x14\xd7\xd6\xef\xfc\xbd\xa6\xac\x02\x97\x19\x39\xe1\x1e\x00\x71\x50\x6d\xe0\xed\x7f\xf6\x00\x68\xa8\x3b\xf1\x02\x81\x31\x12\xf2\xf7\xb7\x93\x7c\xf4\xa5\xd3\x7e\x31\x71\xb5\x7e\x5b\xb0\xee\x5d\xe5\xdf\xfb\xc0\xfb\x82\x8a\xd6\x37\x9d\xc9\x05\xba\x52\x1e\xc4\x21\x9d\xc6\xfe\xa1\x47\xe6\xed\x44\x63\x77\x8e\xd4\xcd\x73\xfa\x16\x02\x4f\xfb\x3c\xac\x3d\x17\x03\x0b\x74\x51\xde\x9e\x0b\x6f\x95\x29\x83\xee\x90\x05\x71\x88\x1e\xc0\x0c\x17\xbf\xb4\x19\x1c\xa5\x13\x8d\x4e\x27\xa5\xed\xcb\x6b\x40\xbf\x0c\x83\xfd\xfa\x7e\xa5\x41\x82\x5a\xbf\xef\x7d\xcf\x20\xb4\x93\x05\xc4\x21\x7a\x60\xb1\x79\xa1\x27\xe8\x6b\xfc\xeb\x37\xf5\xcc\xdc\xae\xed\x2f\x97\x1f\x17\x6b\x75\xd4\x86\x24\x4b\xc1\x86\xbe\x8d\x75\x4c\x31\x60\xc1\x75\x41\x1c\xa2\x07\xb4\x88\xf7\x3d\x46\x8d\xc4\x3c\x7f\x5f\x79\x8c\x2a\xe0\x46\xb0\x73\x86\x6e\x5a\x16\x4f\xb7\x64\x37\x23\xce\xfc\x7a\xd2\x81\x4a\x20\xdc\x03\x20\x0e\xea\x07\x00\x41\x18\x34\xef\x38\xc9\x03\xba\xeb\x94\x75\x2c\xeb\x34\x05\xbd\x1c\xb8\xb2\x6e\x69\x5f\x6e\x95\xea\x98\xcb\x3d\x5b\x31\xee\x1f\xf4\xbb\x3b\x3a\x93\x44\xf2\x1e\xde\x76\x10\x87\xe8\x01\xa7\x1d\x33\x25\x36\x58\x79\xcf\x0e\x4f\x92\xbb\x3d\xb1\xe0\x5b\xce\x3c\xea\x56\x7d\x76\x1d\xce\x76\xb2\x12\xbc\x3f\x87\x7d\x6a\x70\x5d\x10\x87\xe8\x81\x9e\x70\xc2\x6e\x67\x2a\xbc\xb5\x01\xbc\xbb\x2f\x77\xf9\xca\x83\x69\x02\xe4\xef\xd1\xbe\xd5\x35\xb0\xf8\xfe\xfe\x73\xdd\xc1\x27\x07\xa8\xf6\x18\xc0\x21\x7a\xe0\x03\xee\x19\xca\x8f\x9b\xbf\x9e\x54\xe6\x98\x2b\x10\x7b\x1c\x4c\xa7\x5c\x90\xb9\x47\xdd\x94\x5b\xa8\x49\x6d\x76\xc9\xc7\xe5\x65\x37\x5c\x17\xc4\x21\x7a\x40\x3f\xdd\x17\xa7\xdb\xb1\x13\xbf\xb1\xdf\x93\x78\xf1\x3e\xf5\x5a\xdb\xe2\x4b\xd5\x19\xb4\x0d\x15\x3e\x82\x3f\x0c\x9b\x02\xf7\xf6\xa1\x53\xa3\x01\x1c\xd4\x0f\xb8\xfe\x73\x10\x06\x85\xa8\x93\x83\xf0\x8f\x7a\x7c\x8a\xbb\xbc\x3f\xf3\xc6\xfc\xa2\x66\x0d\xfa\xb9\x89\x83\xeb\x7d\x9f\xe9\x33\xce\xc5\xb5\x6e\x07\xe8\x3f\x59\xa9\x80\x4e\x60\x06\x71\xc8\x41\x38\x26\xbe\xdd\xdd\xe8\x16\xa6\x01\x5d\xa4\x81\xa1\xb8\x82\xd5\x20\xc1\xcd\xb4\x19\xeb\x38\xea\x79\x23\xe2\xf0\x97\x0e\xb7\x5d\x7a\xe0\xca\x20\x0e\x39\x08\x2b\x5f\xff\x52\x21\x5d\x19\xdb\xfc\xc9\xca\xda\x34\xc8\xd8\x0f\x15\xcb\x89\x88\x4d\xfb\x09\x7a\xcf\x2f\x21\x16\xd1\x07\xca\x22\xa4\x70\x65\x10\xe7\x2b\x85\x82\x76\x5c\xf9\x5f\xdf\x23\xec\xfb\xe5\x86\x20\xf9\x98\x81\x22\xa7\x64\xfe\xa7\xe6\x28\x89\xc2\xca\x99\xf5\x6d\x3d\x26\x73\xf1\x85\xb0\xc8\xaf\x17\x3a\xdd\xbf\x1e\x0d\xc2\x5e\xf2\xe7\x93\x87\x82\xbd\x7f\x6c\x9e\xbb\xf1\xd9\xdd\x4f\xe6\x6a\x78\xf2\x1d\xfd\x49\xfd\xfc\xa5\x9f\x1c\xf9\x49\x0c\xeb\xa3\xc5\x47\xd0\x05\x8c\x81\x19\x16\xcc\x1b\xb3\x6c\xdd\x8f\x0f\x65\xbb\x07\x07\x0d\x70\x59\xdc\xed\xf2\x7c\xb7\x25\xbe\xa4\xb7\x10\x49\x62\xf4\xfe\xd7\x82\x30\xa8\x69\x47\x6b\x84\x91\x82\xb0\x07\xca\x99\xba\x79\x3f\x6e\xac\xe8\x9d\xdf\xad\x5d\xb6\x67\x8c\xe3\xb8\x3f\x04\xe8\xa6\xa2\xe3\x87\x92\x7e\x7e\x1c\xbc\x62\x73\x0a\x07\x2a\x05\x4b\x35\x21\x07\x61\xfc\xdf\x1d\xe7\xc9\x7f\xe8\x5c\xcc\x9b\x89\x0b\x38\xac\xe7\xbb\xb1\xff\xeb\xfa\x85\x9e\x5d\xf4\x10\x9b\x57\xea\xd1\xf1\x9a\xd9\xa7\x72\xa1\x90\x18\x72\x10\x26\x8f\x5b\x17\x73\x78\xa7\xc8\xfc\xb1\xdf\xe2\xdd\xdc\x95\x3b\x8f\xee\xa1\x4a\x6d\x8e\x7e\x8b\xcc\x67\xf5\x7f\xdb\x8e\xea\x55\xc3\x73\x2a\xad\x45\x0e\xc2\x3c\x6a\xe4\x03\xab\x2b\x17\x77\x13\x15\xfb\x9b\x2f\x58\xa5\x9a\x95\x19\x38\xa5\x6b\x48\xf6\xcb\x96\x47\x85\xbd\x58\x6d\xbc\xe6\x78\x2a\xad\x45\x0e\xc2\x78\x24\xf9\xb1\x63\x21\x8d\x82\x6f\xe7\xd0\x7e\xdd\xd4\x0a\xa0\xfb\x3d\xf9\xb5\x7a\xbb\xb0\x76\x5b\x40\xf2\xbb\x75\xf4\x85\x9f\x58\xa7\x16\x84\x41\x26\x3a\x69\xe4\xb3\xcd\x71\xcf\x0f\x73\x1c\x1c\xf8\xba\xac\x5b\x58\x89\xe1\x10\x50\x30\xcc\xa9\x4d\x49\x98\x66\x92\x3b\xf0\x9c\xf6\x3b\xf5\x25\xe8\x1e\x12\x10\x87\x38\xf2\xbd\x77\x31\xe2\xb8\x51\x8c\xb1\x40\x70\x3b\xad\x58\xa4\x27\x28\xc7\xf8\x31\x8e\xf4\xb8\xfe\x76\xa5\x14\x7e\x5d\xc0\xf9\x9c\x91\x73\x70\x5d\x10\x87\x58\x64\x83\x1d\xe9\xf8\x99\x33\x80\x70\x26\x52\x84\xa3\x99\x89\x6b\x12\x73\xc8\x01\x5f\x36\xdf\xa4\xe1\x49\x8d\x72\x53\x8c\x0f\xeb\x53\x68\xd9\x02\xc4\x21\xee\x59\x7a\xea\xde\x2a\x51\x22\xd5\x26\xc0\xb8\x2f\x19\x67\xfb\xb2\x67\xbe\x48\x4b\xa1\xa8\x60\xb3\x77\x4c\xa3\x8e\x3f\x8c\x63\xfe\x11\x74\xaa\x0f\x88\x43\x1c\xf9\xe6\xba\x1a\xb9\x96\xae\x3f\x0b\x18\x6a\x16\xd2\x27\x6a\xbb\x7b\xe6\xae\xcb\x7d\xa2\x5b\xbb\x03\x53\x1e\x24\xc4\x41\x37\x61\x72\x29\xf0\x20\x0c\xe2\xa0\x1a\xe1\x7f\x0e\xc2\xa0\x1f\xf4\x49\x16\x60\xa9\xde\x9b\xd2\xd8\x6c\x5c\x9b\x2b\xa5\xaa\x11\x56\xbe\xcc\x42\xbe\x23\xf9\x6e\x4b\x05\xbf\xe4\xd6\x67\xee\x68\xc3\xf2\x8d\x2e\x78\xd3\x41\x1c\xa2\x05\xb0\x67\x44\x51\x3d\x87\xbc\x36\x8b\x4c\xc6\xcf\x0d\xbd\xdf\x28\x72\xf3\xde\x4f\x97\x73\x60\x31\x6d\xe6\xa9\x48\xc7\xcf\x44\x5b\x83\xbe\x2a\x00\x87\x68\x81\x67\x04\x83\x76\x07\x82\x28\x6b\xad\xf4\xbc\x99\x82\x5e\x38\x7c\xbc\x93\x68\x72\xb4\x4d\x35\x8c\x94\x75\x29\x41\x68\xc2\xd2\x51\xd0\xca\x15\x80\x43\xb4\xc0\xf5\x8e\x0b\x41\xda\xf4\xf2\xc5\x7d\x2e\x30\x35\xc5\xbe\x7d\xb3\x42\x6b\xfb\xf0\xcc\x29\x0b\x71\x42\xfb\x87\x2a\xb4\x51\xf5\xe9\xd0\xa6\x00\x00\x87\x68\x01\xe6\x9b\x1d\xe5\xe5\x07\xd3\x2d\xcc\x55\x4f\x7f\x17\x88\xc8\xd4\x5e\xb3\x0b\x97\x9d\xab\xc4\xfd\xb6\xbe\xd8\x7a\x90\x59\xea\x3d\x07\x9f\xfc\x80\x38\xa8\x36\x10\x10\x84\x41\xbd\xeb\x49\x1e\xb8\x60\x4c\xa9\xf6\xba\xab\xa3\x1e\x5d\x28\x61\x80\xe6\xfc\x61\xe2\x50\x79\x98\x36\x43\x35\xbf\x78\x8f\x28\xf1\x57\x13\x61\x5a\x28\x54\x80\x38\x44\x0f\x78\x6e\x4d\x6a\x77\x9c\xe5\xfa\xf4\xc4\xa8\x98\xee\x12\x46\x96\xab\xff\xde\x4e\x7a\x02\x3b\xfe\x66\x79\x94\x96\xaf\x58\x01\x4f\x2a\x74\xf0\x10\x80\x43\xf4\x00\xef\x4c\x9c\x40\x49\x7c\xf6\x94\x16\xc1\x80\x9b\x3a\x81\xab\x0d\x2e\xe1\x9b\x5e\x97\xa8\x3b\x57\xea\xee\x96\x5c\x15\xea\x7f\x05\x5d\xc9\x03\xe2\x10\x3d\x50\x21\xa8\xe9\xb1\x2a\xd0\x9d\xe2\xae\x5d\xde\x5f\x92\xdd\x2e\xbc\x8f\xaa\xf4\x4b\x58\x38\xec\xf5\x05\x9b\x86\xed\x91\xea\xd8\x04\xb8\x2e\x88\x43\xf4\xc0\xcb\x97\xd2\x7b\xc9\x63\x0c\x18\x0c\x79\x02\xfd\x0a\xc1\xda\x2d\xe5\xdf\x77\x22\x48\x16\x5b\x1e\xb5\xbc\x46\x69\xdf\x68\x58\x78\x02\xf7\x00\x88\x83\x6a\x03\x01\x41\x18\x34\xd4\x9d\xe4\x81\xf7\x43\xd5\x07\x52\xaf\xfc\x98\x25\x7f\x54\xe0\x4f\x52\x45\x19\x3a\x57\x57\x2e\x8d\x96\x72\x6d\xff\x1a\xd3\xba\x86\xfe\xe7\x27\x74\x75\x14\x88\x43\xf4\xc0\x85\xf8\xd0\x88\xc5\x9b\xd1\xe1\x17\xee\xe4\xc4\x8f\xbb\xaf\xa5\xdb\x0c\x70\x5b\xe4\x79\xab\xd4\x2e\xef\x31\xe4\xa5\xdd\x75\x84\xea\xae\x41\x1c\x52\xbd\xa5\x18\xce\x87\x3c\x74\x93\x8f\xc2\x37\xbf\x8f\x9a\x4b\x06\x52\xba\xd0\x5c\x68\xc8\x10\x25\x6c\x20\x3b\xa7\x2b\x23\x8a\x32\xb0\x05\xd7\x05\x71\x88\x1e\x20\x7b\x3c\x75\x0f\x87\xba\xad\xfa\xe5\x38\x0e\x15\xe6\x05\xa3\xdb\x51\xbe\xb2\x6f\x0e\xb3\x22\xac\x4b\xd6\x94\x3c\xbe\xa8\x54\x41\xa1\x0d\xc4\x21\x7a\xc0\x19\x95\xdd\x41\xbc\x8f\x64\x57\x34\x72\x5b\x75\xa3\x24\x32\x13\x43\x2d\x51\xf2\x87\xfa\xe0\x03\x2f\xef\xbb\x59\x75\x72\x82\xfd\xd0\x3d\xc2\x00\x0e\xea\x07\x00\x41\x18\x34\xef\x38\xc9\x03\x36\x32\x95\xfd\xd4\xd4\x18\x8e\x02\xed\x67\x75\x09\x5c\xc6\x05\xaf\xd0\xf0\x60\xd6\x11\x63\x4c\xe7\x71\x86\x8d\xa9\xf4\xe5\xe7\xc1\xdb\x0e\xe2\x10\x3d\xd0\x99\x33\xcc\x62\xa5\x54\xc4\x32\xa6\x44\xdf\x86\xae\x70\x10\xee\x2f\xde\x4e\xef\x57\x5b\xfa\xac\xea\x5a\xac\x64\x56\x5b\xf4\x34\x5c\x17\xc4\x21\x7a\xe0\xcd\x56\x20\x77\xcf\xfc\x3a\xfe\xb3\x09\xc1\x0d\xf5\x64\x6a\xfb\x77\xe6\x0d\xb5\x4f\x18\x3e\x2d\xe2\x56\xf6\xd8\x5a\x12\x5d\x9c\x87\xeb\x82\x38\x44\x0f\x44\xdd\xe2\xbf\xd9\xe5\x7a\xf5\x30\xf3\xda\x34\xf7\x9d\xb0\xcf\xa2\xd9\xd2\xee\xf8\x14\x33\xab\xd5\x8c\xf2\x3f\x78\x74\x95\x31\x8c\xa1\x83\x13\x01\x1c\xa2\x07\x88\x74\xb9\x70\x38\xca\xeb\xca\xcd\x2d\x02\x0a\xb7\x0b\x59\x49\x9d\x57\xa7\x2a\x84\x55\xd5\xbf\x96\x3a\xab\x47\xe1\x14\xdf\x4b\x82\x7b\x00\xc4\x41\xfd\xc0\xdf\x82\xf0\xdc\xff\x1f\xce\xcc\x9a\xf0\xf6\x0e\x56\xad\x1a\x35\xef\x5f\xbb\x22\x1d\x66\xab\x6b\x34\x50\x6c\xdd\x9d\x96\xdf\xa6\xfc\x7e\x6e\x38\xe5\x70\x12\xfd\x68\x61\x1e\xac\xb5\x8b\xe2\x7e\x16\x2e\x47\x4f\xac\xe7\xb7\x66\xef\xf8\x2b\x17\x14\x61\x23\xc1\x9f\xb1\x25\xc8\xe8\x5b\x89\xad\x54\xcc\xbc\x8f\xcd\x6a\xc9\xc8\x1f\x1b\xb9\x75\x88\x6f\x8f\xba\x54\x05\xfd\x0e\x73\x4f\x11\x7c\xc6\xe1\x63\xdb\x13\x70\x6b\x44\x37\x69\x7c\x7f\xda\x86\x4f\x4c\x12\x05\x75\xf6\xe8\x9c\xff\xc0\xaa\xc7\x24\x33\xd3\x1a\xf7\xca\x75\xf9\x6b\x61\x39\x0a\xde\x1c\xeb\xef\x92\x6e\x7b\xdd\x8a\x48\x76\x19\xc1\xd2\x08\xc2\x3d\x82\xea\x98\xdf\x5f\x09\x68\xe6\xf9\x36\xe9\x36\xba\xae\xa4\xa4\x4e\xfa\xd1\xaf\x6d\xf4\xb6\x21\xba\xcd\x4d\xa1\xef\xd7\x70\xf3\xf5\x6f\x1d\xdd\xbd\x11\x73\x6b\x62\x33\x55\x7a\xbb\xfa\xc6\x4a\xf0\x78\xfa\x8d\x76\x8a\x00\x39\xcc\x89\xa9\x42\xea\x69\xbd\x3c\x8d\xa8\xf8\x43\xe6\x23\x28\x47\xd4\x93\x27\x93\x01\x98\xc9\xb6\x91\xcc\x45\x2a\x0a\x3d\x6d\x71\x26\x29\x97\xe7\xe7\xae\x7c\xb8\x22\xeb\xd8\x5d\xcc\xc5\x33\x29\x84\x85\x43\x4e\x7f\x74\x89\xf9\x65\xe7\xf0\x4c\xc6\x63\xcb\x00\xd6\x22\xcf\x15\xde\xe2\x02\xf7\xc1\xc2\xcb\x58\xe1\xb5\xf2\x9f\x50\x6e\x4b\x0b\x66\x63\x6e\x88\xfd\x32\xf9\x77\xaf\x2d\x58\x02\xe5\xae\x04\xca\x5d\xaf\x2d\x6d\x66\x14\x46\x2c\x54\x22\x3a\xd4\x6b\x63\x4a\x67\xaa\x87\x92\x63\xff\x68\x53\x97\x06\x26\x6c\x18\x3c\x26\xcd\xad\xaf\xb7\xca\xef\xb8\x22\x86\xb2\x54\x11\x6f\xe1\x85\x49\x41\x87\x82\x82\x72\x86\x6e\xab\x16\xfd\xdf\x3d\xbb\x1f\x3a\x2a\x0c\x75\xd6\x57\xea\xd0\x13\x05\xe5\xe8\x37\x3a\xb6\xdf\x13\x4b\xfd\x13\x36\x6c\x36\x5b\x19\xb0\xd1\xcd\xe2\xc6\x40\x2f\x81\x3f\x68\x51\x2d\xe4\xd7\xfa\xfc\xe1\x92\xb7\xc0\xd1\x97\xae\x22\x6e\x16\xb9\x66\xac\x4c\x33\xad\x66\x7e\xf3\xae\x4b\x59\x37\x7e\x40\x8d\x83\x9c\xb5\xf5\xf0\x55\xdb\xe0\xa0\xb4\xfe\x98\xb1\xa3\x73\xda\xab\x74\x15\x19\xb2\x95\x3a\xca\xf5\xcd\x6d\x98\x37\x83\x98\xc5\xf9\x95\xf1\x2c\xd3\x6f\xb3\x5a\xa5\xd4\xcb\xb5\x76\x2a\x24\x1d\x5d\x5c\xe8\x1a\x09\x7f\x2e\x7e\xf5\x8d\x05\x15\x53\xca\xf3\xec\xa8\x4b\x1e\x23\x1b\x17\xf1\xbb\x12\x5d\xed\x0e\x12\x7f\x65\xfb\x3c\x84\x1d\xfd\xef\xa9\x7a\x41\x1f\xa7\x5f\xb8\x7b\x42\xed\x6d\x3a\x0d\xff\xde\x18\xfd\x10\x8c\x1c\x67\xff\x8d\x59\x1c\xe9\x8a\x8f\x99\x3c\xe6\x85\xa3\x7b\x6c\xdb\xe6\x4a\x96\xc6\xb8\x2f\xab\x5a\x6f\x8b\x65\x11\x2a\x92\xda\xe9\xed\xbd\xd4\x52\xa9\xa6\x89\x0a\xf9\xf5\xe3\xb3\x86\xdc\xc4\xd1\x6f\x11\xf5\xd7\x5d\x71\x1d\xcd\xd6\xab\xfe\xea\x87\x4f\x7e\x30\x09\x63\xad\xa8\xb7\x29\x4a\x7b\xa7\x3f\x09\x75\xad\x37\xec\xc0\xd1\x3b\x82\xce\x97\x11\x07\x16\x0f\xc9\x9e\xf3\xe5\xf9\x4d\xfa\xa2\xa4\x26\x89\xa0\xc2\x4c\xbe\xef\xc9\x27\x3f\xab\x0f\x13\x7e\x96\x36\x76\x47\x73\xda\x99\x0f\xf3\xcb\x4a\x3c\xc3\xf5\xd3\x43\x3d\xea\x57\x6b\x96\xf3\x1f\xd1\x3f\xfe\x29\x38\xb5\xcb\x6f\xcf\xd4\xc4\xd1\xc9\x24\xae\x71\x74\x3f\x01\x47\xfb\x79\xe3\x97\x68\x0e\x53\x09\x84\xa6\x6a\x99\x28\x5a\x53\x65\x35\x97\xcd\x65\xc2\x52\x56\x3a\xa6\x56\xc9\x98\xff\xf8\x1e\x41\xdb\x35\x82\x0f\xf6\xbe\x52\xd7\x7c\x44\x41\xbb\x39\x74\xcf\x12\x55\x32\xf1\x69\x02\xbd\x13\x1a\xd7\xa3\x8b\x9f\x17\xc2\xd6\x43\x8f\xaa\xd6\x2b\x4f\x63\x9c\x0f\xcc\xb7\x0a\xc2\x6c\xe2\x8d\xb6\xce\xdb\xe6\x47\x25\x94\xc2\xae\xbd\x74\x85\x44\xba\xd6\x78\x7f\x8a\x83\xef\xe8\x7f\x85\x1d\xba\x7b\x92\xf4\x14\x17\x31\x1e\x5e\x6a\xc7\x79\x71\xa3\xef\xb0\x81\x39\x22\xe3\x05\x51\xe9\x75\x2a\x9b\x5f\x8b\x09\xe6\x0f\x8f\x86\x41\x11\xc3\x88\x09\xbc\x8c\x9f\xa4\xce\x1f\xa4\x2c\xe5\x42\x5f\x8e\xc4\xef\x0b\xb0\x1a\xda\x90\x73\x49\x31\x0c\x4d\xbe\x0f\x5e\x38\x82\xd6\xf0\xbc\xed\x6a\x30\x99\x7e\xfd\x33\xb8\x4a\x42\xaf\x46\x38\xea\xf0\xe3\x01\xdb\x02\xf3\x03\x61\xd8\x1b\xaf\x41\xeb\x43\xdf\x17\x5e\x71\xc4\xff\xce\x82\xbe\x52\x87\x87\x87\x87\x5e\xf1\x74\xa1\x28\x98\x13\xec\xda\x6c\x28\xa8\x3e\x73\x67\xbd\xbf\x9d\xa1\x4b\x90\xa1\x46\x3f\xfb\x32\x39\x41\x6a\xec\x39\x1f\xfa\xa0\xee\x6a\x0f\xeb\x3d\x0b\xc2\x56\xf5\x33\x42\x94\x8b\x9d\x1f\xd8\xd7\xce\x78\xc3\x30\xbd\x50\x28\x50\x2e\xe4\x56\x8a\xc9\xa2\x9c\xd9\xdc\x32\x46\x41\x41\x91\x40\x41\x15\x13\x43\x11\x0b\x45\x3d\x2e\x75\x41\xcc\xda\xa4\x4e\xf2\x6c\x2d\x6f\x4a\xb7\xad\xf8\x63\x47\xf3\xd7\x2d\xb5\xb2\x94\xfd\x66\x54\x1d\x57\xcf\x6e\x3c\xb8\xc6\xa0\xe7\x0d\xc3\xf4\xfe\x9b\xd4\x99\xe3\x52\x6a\xa1\x32\xb2\x32\x2e\xc3\xfb\x78\x68\x1d\x8e\xf8\x8b\x7a\xd6\xb2\xd8\x28\xb1\xa3\x9d\x19\x24\x24\x32\xeb\xf2\xd4\x46\x2b\x82\xde\x30\x4c\x9f\xbf\x49\x9d\x3d\x2e\x45\xd9\xef\xdb\x32\xbf\xf4\xfb\xd9\x16\xd5\x80\xbb\x53\xe7\x9e\xcd\x6d\xeb\x81\xb6\x17\xa5\x51\x7d\x8e\x3f\xc6\x19\x0c\x9e\xf7\x48\x7b\xc3\x30\x7d\xff\x26\x85\x76\x5c\x4a\x23\x76\x50\x65\x61\x78\x92\xc2\x87\xad\xd7\xbc\xda\xce\xa6\x88\xf4\xb1\x90\xba\xc6\x24\x7a\xf8\x68\xb0\xb6\xb3\x5e\xf3\x55\x7a\x6f\x18\xa6\xdf\xdf\xa4\xd0\x8f\x4b\x91\x37\x28\x06\xf5\x32\xb7\x33\xa8\x25\x7d\x82\x69\x75\x56\x4c\x0b\xbb\x6d\xcb\xf5\x27\x0d\x19\xb5\x19\x3b\x5c\x7b\xb3\x82\x7e\xc9\x1b\x86\xf9\xf4\x6f\x52\x18\xc7\xa5\x78\x38\x9d\x15\xab\x39\xb9\x72\xc7\x0b\xe4\x3b\xae\xc8\xbc\xe5\x9b\xbb\xf3\x31\x2b\xd6\x0c\xaf\xf6\x95\xd5\xb3\x5f\x06\x98\x22\x44\xde\x30\x4c\xff\xbf\x49\x61\x1e\x97\xf2\x6a\x22\xb2\xad\x13\x0f\x3d\xd3\x35\xf2\xa8\x94\x97\xee\xf9\x9c\xdb\xc2\x27\xd4\x0d\x69\xaa\xb4\xb5\x77\xcf\x3f\xbc\xe1\xc1\xb9\xe9\x0d\xc3\x0c\xf8\x9b\x14\xd6\x71\xa9\xac\x9c\x95\xe9\x6a\x57\x73\xa2\x3b\xd5\x69\x1e\xbf\x1b\x9f\xc6\xc7\xdb\x7a\x4f\xaa\x9c\x3f\x5b\xc4\xd3\x85\x37\x4e\xd8\xd8\x80\xed\x0d\xc3\x0c\xfc\x9b\x14\xf6\x71\x29\xa1\x78\x3f\xf5\x7a\xf4\x6d\xf5\x0b\x6e\xc3\x83\xd6\xeb\x46\x1e\xdf\x1b\xe2\xb9\x3e\x1a\x1b\x15\xbb\xc8\xcd\xf3\x91\xa4\xd7\xfe\xef\xa9\x9e\xfd\x4d\xea\xdc\x71\xa9\xab\xf7\xef\x68\x9a\x06\x8a\x0e\x6d\x79\x4b\xf5\x5c\xb7\xcd\x43\x6f\x65\xea\x31\x19\xa9\x23\x64\xe8\x52\x1c\x7a\xf8\xc9\xa8\x47\xc4\x1b\x86\x19\xf4\x37\x29\x9c\xe3\x52\xc9\x3a\x04\x6c\x30\xa9\xaa\xc0\xdb\xe3\xe7\x5c\xbf\xb7\xd0\x8a\x6b\xa9\x4f\x91\x97\x6a\xae\x7e\xa2\x19\x7e\xb5\x35\x5c\x26\xae\xec\x0d\xc3\x0c\xfe\x9b\x14\xee\x71\xa9\x57\x6f\x09\x87\x14\x64\xb8\x96\x75\x26\x77\x42\xca\x94\xad\xb2\x76\x38\x4b\xf6\x44\xfb\x55\x8c\x5e\x3c\x8a\x28\x1a\x14\xac\x74\xf0\x86\x61\x86\xfc\x4d\x0a\xef\xb8\x54\xe5\x74\xf0\x0f\xa6\x5e\xfd\x1c\x13\x8f\xe7\x5b\xe5\x81\x97\x67\x9f\x74\x9e\x8d\x78\x26\x92\x16\x1e\x27\xaf\x4b\x8b\xdd\xa1\x48\xe0\x0d\xc3\x0c\xfd\x9b\x14\xfe\x71\xa9\xfb\xcf\x09\x22\x55\xd9\x2f\xe5\x7d\xda\x4d\x4a\x64\x84\xa5\xa2\xcb\xbd\x50\xfb\xe1\x87\x35\xcf\x7f\xe7\x37\xf5\x14\xa1\x93\x3e\xa3\x37\x0c\x33\xec\x6f\x52\xe7\x8f\x4b\x79\x5e\x10\x94\x33\x54\xdd\xd6\xd1\xf0\x6c\xb5\xff\xc3\xcb\x87\xa9\x14\x42\xe7\x43\xf2\xf4\xb1\x0f\xb9\x8a\xe8\x9c\xd3\xfc\x3c\x9b\x37\x0c\x33\xfc\x6f\x52\x04\xc7\xa5\x5c\xb6\x07\x5c\x6c\x60\x7f\xf6\xd5\x5e\x0e\x9b\x34\x9d\xc9\xd9\xec\x0c\x28\x69\x4f\xd4\xdf\x2d\xd0\x18\x2e\x90\x08\x12\xce\x96\xf3\x86\x61\x46\xfc\x4d\x8a\xf0\xb8\xd4\x1d\xe1\xac\x32\x09\xf9\xa0\x45\xb6\xcd\x78\x32\x81\x9f\xfa\x3b\xd3\x35\xf6\x2f\x0e\xee\x48\x92\xbd\x67\xad\x4a\xf7\xda\x2e\xb0\xf7\x86\x61\x46\xfe\x4d\x8a\xe8\xb8\x94\xa6\xdc\x67\xc1\x3d\xd6\x2b\xbb\x07\x19\x04\x59\x24\x8c\xe1\x46\x92\x43\x57\x18\x3e\x3b\x9d\xf5\xa5\x51\xf0\x13\x25\x6a\xc2\xbf\xe0\x0d\xc3\x8c\xfa\x9b\x14\xf1\x71\xa9\x47\xdc\xd7\xf9\x95\xc4\xb5\x71\xca\xe4\x4a\x19\x67\x4c\x6f\x49\x17\xa9\x0b\xeb\xd8\xdc\xc6\xe1\x0d\x26\x2a\xbf\xfa\xd6\xb7\xe2\x7f\xbd\x68\xf4\xdf\xa4\x48\x8e\x4b\xbd\x5f\xe0\x20\xc1\xac\x17\xb2\xc5\x4e\x7e\xbd\x81\xef\x47\xc9\x3b\xef\x84\x8d\x71\x49\xa7\xd8\x2e\x2e\xb2\x62\x28\x81\xba\xe3\x7f\xbd\x68\xcc\xdf\xa4\x48\x8f\x4b\xa1\x76\xf2\x7e\x89\x5e\x79\x2b\x49\xf2\xb3\xe8\xae\xff\xb2\x54\x1e\x66\x61\xd2\xd5\x52\xd7\x28\x9d\xfb\x37\xc9\x49\x14\x99\xf5\xad\xbd\x61\x98\xb1\x7f\x93\x22\x3b\x2e\xf5\x36\xf9\xb7\x44\x83\x63\x74\x5b\xc8\x4e\x13\xf5\x8f\x79\x5f\x0e\xc2\x8e\xec\xf2\xeb\xdf\xb0\x16\x9b\x1e\x7d\x12\x53\x5e\xaf\xb2\xf1\x86\x61\x3e\xff\x9b\xd4\x85\xe3\x52\x35\xbe\x4b\x4f\x9e\xd7\xf3\x07\x6a\x0f\x68\xbd\x16\xb3\xcd\x53\x3f\x23\xe0\xb9\x3c\xb4\x2b\x52\xc7\x95\x53\xbc\xd6\x95\x4a\xaa\xe9\x0d\xc3\x8c\xfb\x9b\x14\x39\xf9\x71\xad\xa4\xfb\x12\x21\x8c\xd3\x8b\x3a\xeb\x7b\xb8\x5f\xc2\x1e\x57\x3f\x90\xa2\xdc\xb0\xf9\xa5\xb0\xef\x73\xd9\x53\x52\x6a\xde\x51\x55\xd5\x1b\x86\x19\xff\x57\x2d\xd8\x71\x2d\xdf\x51\x14\xe3\x2a\x4f\x77\xb1\xcc\x74\xbf\x05\xc7\xd8\x85\x79\x92\xa4\x0f\xf4\x9a\x0b\xb8\xd9\x41\x19\x71\x17\xcf\x9f\x8d\xe0\xf0\x86\x61\x26\xfc\x55\x8b\xe2\xb8\xd6\x8d\xdf\xdf\x62\x0a\x25\x6b\x94\x3b\x33\xd0\xa7\x17\x9d\x6f\xf4\xb8\x73\x74\xf6\xc7\xe7\xd3\xf6\x90\x65\xdd\xfe\x7e\x13\x9d\x88\xc9\x1b\x86\x99\xf8\x57\x2d\xca\xe3\x5a\x4f\x46\xf8\x93\x7f\xda\xc7\xad\xfc\x49\xf5\x3c\x68\x50\xe5\x33\xfd\xc5\x44\xdc\xa8\x82\xda\x1e\x6d\x9d\x39\xbb\x21\x15\xd1\x62\xe1\x0d\xc3\x4c\xfa\xab\x16\xd5\x71\xad\x85\x3b\xb9\xc3\xc4\x86\x8f\xd9\x6f\x8c\x3c\x3f\xdb\x59\x8b\x71\x81\xef\x9a\x2b\xf6\xb9\xb5\xbb\x93\xa4\xcf\xd6\x22\x1c\xd0\x2a\x78\xbd\x61\x98\xc9\x7f\xd5\xa2\x3e\xae\x65\xd0\x39\x87\x0f\xbb\x71\x86\x52\x1d\xb5\xc6\xea\x55\x56\x70\x95\x7d\x6d\xbf\xf1\x4b\xd7\x57\x5d\xf8\x7c\x26\xd2\x34\x85\x97\xb8\xbc\x61\x98\x29\x7f\xd5\xa2\x39\xae\xf5\xbb\xf7\xd3\x5d\x11\xf3\x73\x5d\x7e\x7b\xbd\x64\x07\xc3\x89\x4f\xb6\x30\x84\xca\xd2\x42\xdb\x42\x31\xaa\x16\xd0\x02\xef\x89\x70\x7b\xc3\x30\x53\xff\xaa\x45\x7b\x5c\xab\xc4\x8d\xbe\x64\x25\xeb\xe3\xdb\xc4\xfd\x4b\x5f\xcc\xde\xa0\x86\x84\x84\xaa\x5c\xa3\x7e\x80\x1a\xfd\xfc\x2d\x57\xb1\x6a\x96\xd1\xff\x46\xe9\xb4\xbf\x68\x95\x12\xff\xbb\x09\xff\xff\x4d\xcc\xc8\xe9\x8e\x7f\xb8\xca\x5b\x86\xaa\xcd\x34\xc3\xc7\x99\xe7\x95\xc8\x0c\xe7\x9e\x3d\x9c\xfb\x76\x8d\xad\x22\x7d\x0e\x96\x66\xf6\x6c\x9c\x1a\x85\x0c\xc3\x1b\x86\xf9\xe2\xaf\x0d\xb9\x78\x5c\x4b\xf4\xfd\xf0\xbb\xb1\x02\xf1\xac\x5b\x46\x5c\x63\x36\xaf\x17\xdd\xee\xf5\x9a\xe7\xca\x3f\xb7\xc5\x89\x94\x9d\x6b\x10\xde\xb3\xf9\x9f\x89\xd2\xff\xaa\x45\x7f\x5c\x6b\x37\x75\x50\xf5\xe1\x47\x8d\x73\xb3\xdf\xb5\x65\xf1\x79\xae\xa8\xf2\x68\xdd\xed\xf6\xe1\xeb\x3e\xef\x54\x74\x40\xd1\x3c\xff\x98\xd3\x1b\x86\x99\xf1\x57\x2d\x86\xe3\x5a\x82\xf1\xab\x5f\xd7\x1d\xe7\x2b\xe4\x59\x0f\x0f\x98\x1f\xf6\xc7\x70\xe5\xfb\x38\x0e\x93\x6a\x61\x09\xf2\xf2\x77\x53\x93\xda\x5a\x7a\xc3\x30\x33\xff\xaa\xc5\x78\x5c\xcb\x9d\x37\x25\xc0\xdb\xae\x9b\xaf\xd3\xe3\x13\xa6\xd4\x2f\x3e\xf7\xb8\xc7\x02\x46\xf4\xf1\xeb\x1f\x3d\x6c\xe8\x2f\x1a\x5c\xcb\x21\xf5\x86\x61\x66\xfd\x55\x8b\xe9\xb8\xd6\xe2\xa5\xc1\x84\xab\xf9\xf6\xa2\xf7\xf6\x3f\x96\x5b\xbc\xee\x76\x34\x7a\xfe\x8a\xd5\x73\x92\x55\xda\x38\xfc\xc5\xe0\x8a\x3c\xba\xa4\x37\x0c\x33\xfb\xaf\x5a\xcc\xc7\xb5\xa6\x93\xa5\x86\x46\x99\x46\x77\x76\x3e\x69\xad\xa1\x88\x87\x95\xb4\xbe\x0d\xeb\x11\xcf\xba\x65\x90\x23\xf4\x59\xf7\xd6\x00\x2d\x89\x37\x0c\x33\xe7\xaf\x5a\x2c\xc7\xb5\xfa\xaf\x09\x30\x45\xcb\x24\xb5\x17\x95\x2d\xbd\xfc\xca\x32\xc1\xf3\x60\x76\x49\x2e\x2c\xa8\x50\x68\x40\x56\xf0\x5b\x5f\x65\x28\xbb\x37\x0c\x33\xf7\xaf\x5a\xac\x08\xd3\x2a\x5a\x2d\x5f\x98\x36\xab\xf9\x63\x53\x4a\x6c\x92\xb5\x5c\x98\xf5\x0f\xe3\x54\x2b\x1e\x87\x94\x00\x9f\x50\xb5\x77\x3e\xbb\x26\xde\x30\xcc\xbc\xbf\x6a\xb1\x1d\xd7\x5a\x5a\xfc\xfc\x46\x3c\x99\x98\x84\x7f\xc7\x31\xdb\x00\xe3\xde\xe3\x8b\xe4\xf5\xdb\x59\x22\xf2\x52\x75\x8d\xab\x4e\x58\xfc\xc9\x74\xde\x30\xcc\xfc\xbf\x6a\xb1\x1f\xd7\x7a\x90\x24\x3a\x1b\xf0\x53\xaa\xe4\x37\x06\x99\x82\x91\x42\x50\x12\xd3\xe7\xe5\xf2\x5d\x36\x33\x5c\x47\xc1\x18\x43\xa7\xb9\x5a\x74\x6f\x18\x66\xc1\x5f\xb5\x38\x8e\x6b\x95\x4b\x64\xa8\x98\x67\xdf\xbe\x9c\x7b\x0e\xef\xe7\x2a\xfa\x45\xb2\x3b\x6f\x70\xf3\xf0\x56\x38\xb0\x56\xb3\x0e\xf9\xee\x52\x95\x32\x7b\xc3\x30\x0b\xff\xaa\xc5\x79\x5c\x2b\x1d\xff\x81\x67\x9f\xf6\xcc\xaf\x7c\x96\x7d\x05\x36\xd1\xee\x87\x5b\xaa\x8a\xd8\x61\xdf\x75\x63\x72\xe9\x0c\x3b\x7e\x2d\x52\x52\x78\xc3\x30\x8b\xfe\xaa\xc5\x75\x5c\xeb\xc5\xb9\xed\xdc\xcb\xd5\x9f\x14\x2c\x9e\x11\xca\x4a\xa6\x74\xe0\x96\x19\xcc\xbe\xd7\x8b\xe1\x78\x0c\x3b\x9b\x7f\xad\x54\x41\xe7\x81\x37\x0c\xb3\xf8\xaf\x5a\xdc\xc7\xb5\x0e\x9c\x50\xb5\xea\x57\x5c\x5b\x44\x1c\xe4\xab\x76\x1e\x12\xbd\x53\x0a\xbd\x85\x9a\x1f\xe1\xc7\x65\x53\xbb\xbf\x74\x35\xfd\xff\x63\xec\xce\xbf\xa9\x7a\xff\xc7\xff\xdb\xc6\x7d\x4a\x32\x56\x97\x44\x42\xa1\x4c\x65\x9e\x67\x2a\x33\x99\x45\x84\xcc\x53\x4a\x14\x76\x64\xae\xc8\x10\x1a\x4c\x65\x48\x99\x92\xc8\x98\x31\x52\x86\x28\x99\x87\xc8\x50\xa6\x64\xca\xf0\x5d\xe7\x87\xf7\xfa\xbe\xce\x5e\xeb\x5a\xcf\xcf\x3f\x70\xef\x0c\x7b\x5f\xfb\x71\xed\x7d\xba\xc9\x23\xae\x13\x05\xd0\x96\x10\x69\xeb\x2a\xc3\xe7\x0f\x53\xe4\x26\x49\x19\x06\x2d\x36\xc5\xaf\x4f\xdf\x9d\xb1\xad\x2d\xe2\x9a\xa6\x14\x0a\x0c\x6a\x08\x55\x10\x6f\x23\xae\x13\x85\xd0\x96\x30\xee\x1c\xb2\x3b\xf6\xad\xcf\x78\x72\xb2\x78\xba\x62\x78\x56\x5a\x9f\xcb\x54\xfa\x03\x79\xa3\xa5\x44\xc4\xf3\x53\x13\x97\xa7\xa2\xdf\x1e\xc1\x00\x4d\x11\xb4\x25\x42\xda\x1a\x23\xa3\xfb\x8c\xa6\x16\x5f\x3d\x92\xdd\x89\xb9\x5a\x33\xd9\x3c\xa0\x66\xf8\x5b\xeb\x20\x21\x14\xce\x12\xe4\xe2\xf2\xda\x8b\x38\xf5\x15\x43\x5b\xa7\x71\x7b\xcb\x92\x56\x91\xcf\xf3\xe1\xac\xeb\x67\xe7\x5a\x8d\x8f\xa9\x9d\xde\xcf\x2d\xc9\xec\x78\xc9\x45\xe5\x7e\xa6\xfe\xfe\x9f\xac\xc9\xe7\x31\x40\x53\x02\x6d\x9d\xc1\xad\x85\xbf\x66\xae\x05\x19\x62\x74\x11\x53\x93\xbe\x86\x76\x94\x75\xbe\x37\xf7\x56\xe6\x89\x51\xc8\x4b\xf7\x1f\x88\x7b\x69\x53\x49\x87\x01\x9a\xd7\xd0\x96\x28\x69\x6b\xfc\x9b\x5c\x72\xc7\x59\xbd\x7b\x39\x97\xdd\x7d\x07\x6b\xfb\x47\x52\xb2\xe5\x12\xfb\xb5\x5d\x85\x8c\x9d\x5d\xbc\xa5\x76\x67\xf6\x63\x80\xa6\x14\xda\x12\x23\x6d\x15\x32\xc7\x4a\x24\xd4\x9c\x8c\xf8\x5c\xfe\xaf\x23\x7d\x96\xda\xd7\x30\xcc\xdb\x18\x35\x3d\xe8\xff\x76\x57\xd3\x78\x39\x47\xcf\x0a\x03\x34\x6f\xa0\x2d\x71\xd2\x56\xa2\x83\x02\xa3\x20\xaa\x59\x23\xf1\x2b\xc5\x51\x79\x27\x74\x65\xf0\x8d\x3b\xd0\xfb\xa3\xff\x53\xfa\x4c\xe5\xd1\xd5\x30\x77\x36\x0c\xd0\x94\x41\x5b\x12\xa4\xad\x5a\xb5\x20\xee\xe6\xa9\x15\xc6\xa7\x16\x7e\x54\x71\xf4\xe7\x5c\xee\x2c\x5c\x39\x44\x35\xaa\xa4\x6f\xb4\x16\x5c\x6f\x78\x95\x8f\x13\x03\x34\x6f\xa1\x2d\x49\xdc\xf8\x6e\xcd\x2d\xe4\xd3\x12\x9b\x79\xb5\x4a\x98\xc9\x5e\x4a\xa6\xef\x4c\x4b\x15\x8b\xb8\x4c\xce\x7d\x96\xb2\xcb\xea\x12\x54\xfc\x96\x18\xa0\x29\x87\xb6\xa4\x48\x5b\x9a\x61\x71\x5f\x8c\xdf\x17\x99\x33\xae\x32\x1e\x3d\xf9\x8d\xe5\xeb\x44\x88\xe2\x47\xc1\x9f\xbd\xbf\x0a\xd6\x3e\x05\x2a\x3a\x65\x13\x2f\xf4\x15\xd0\x96\x34\x69\xeb\xef\x92\x54\x7f\xc8\xb2\xde\xbf\xad\x8f\x47\x72\x79\x92\x14\x5c\x94\xe8\xbe\xcd\x51\x0a\xb3\x13\x8e\xd3\xaa\xd6\x3f\x94\x4e\xb4\xc7\x00\xcd\x3b\x68\x4b\x86\xb4\x85\xa1\x7d\x3b\xad\xad\x47\xbf\xda\xbe\xd4\xf3\xe3\x27\xc8\x76\x1b\x71\x1a\x2a\x45\x7b\xe8\x2b\x98\xef\xe1\x8c\xda\xaa\xd1\x21\x7e\xf6\x95\xd0\x96\x2c\x69\x2b\xef\xab\xa3\xc1\x78\x78\xc1\x43\x51\x63\x81\x3e\xba\xe9\xdb\xec\x82\x9a\x07\x6e\xbb\xfe\x21\xb3\x3a\x77\xd5\x3c\xd7\xf3\xe7\x3f\x46\x0c\xd0\x54\x41\x5b\x72\xb8\x63\xb5\x0f\x69\xea\xca\xa8\xee\xae\x6c\xcb\x7b\x11\x17\xb7\xaf\x4e\xca\xf7\x12\x79\x0a\x35\xf9\xe5\xf2\x2f\xd1\x27\xec\x37\xde\x73\x60\x80\xa6\x1a\xda\x92\x27\x6d\xed\xae\xb4\x84\xde\x62\xbc\x91\xd8\xd4\xae\x1b\xd8\x25\xa8\x30\x26\x60\xb3\x3f\x5d\x76\x20\x56\x89\xca\xe4\x5e\xa3\xcc\xdf\x13\xb4\x18\xa0\xa9\x81\xb6\x14\x48\x5b\xed\x6c\x4e\xcd\x3b\x67\x35\x35\x43\xee\x70\xee\x68\x19\xc5\x73\x1e\x3c\x69\x34\x9b\x3f\xa0\xde\x66\x3f\xf0\x25\xe1\xd4\xa9\x5a\xe2\xfa\x55\xfb\x1f\x03\xdb\x7f\xdd\x76\xfd\x9f\x81\x4d\x91\xf4\x1f\x67\x30\x65\x58\x51\x38\xca\xe6\xad\xd7\x6d\x75\x79\x2d\x64\xff\x33\xe1\xb3\x2b\xc6\xae\xb3\xa8\xff\x34\xcd\xd1\xde\x49\xb9\x74\xe2\x76\xab\x0e\xfa\x46\x94\x48\x5b\x8e\xed\x29\xe3\xde\x29\x57\x29\x6f\xad\xf9\xe4\x1e\x1e\x36\xdf\x61\x36\x0d\xee\x59\xb4\x6c\x2c\x16\xcb\xcd\x66\x36\x28\xfb\x45\xbc\x38\xbf\x87\xb6\x94\x49\x5b\xf1\xa1\xd3\xaa\x93\xe4\x83\x76\xc7\x34\x9e\x84\xae\x1e\x67\xb2\xdc\x73\x58\x87\xb9\x7b\x4f\xce\xde\x01\xa3\xe1\x0f\x21\x76\xbf\x88\x17\xae\x7a\x68\x4b\x05\x37\x11\x17\xd1\xa4\x1c\x8f\x11\xfa\x10\x35\xa4\x1f\xf9\xd8\x7d\x85\x21\x0f\x19\xe7\x31\x77\x29\x3d\xf2\xd1\xff\xd5\xa7\x2a\xc2\x96\x12\x06\x68\x1a\xa0\x2d\x55\xd2\x16\xcf\x95\xf3\xca\xc1\xae\x3f\x92\xee\xd1\x56\xbb\x17\x7f\x53\x4f\xfd\xa7\xc5\x7d\xe4\x83\xf9\x32\xa3\x65\xc8\xac\x93\xe2\xc6\x3b\x6b\x0c\xd0\x34\x42\x5b\x6a\xa4\xad\x9b\xd6\xb4\x9f\xb4\x7f\x84\xb1\x36\x56\xbd\x27\x6b\x16\xc8\xbc\xb6\xc3\x73\x1b\x8d\x1a\xce\x75\x6c\x61\xb5\x36\xfc\x34\xb1\x41\xdc\x8d\x34\x41\x5b\xea\xa4\xad\x27\x15\xf1\xf4\x23\xa6\xd2\x53\x15\x6f\xeb\xc2\x8e\x89\xbe\xd1\x58\xf8\xe4\xda\xb5\x7c\x27\xcf\xf5\x76\x55\xe8\x3f\x96\x19\x76\xe2\xe7\xd5\x0c\x6d\x69\x90\xb6\x2e\x5f\xb3\xf4\xf8\xba\xe2\x11\xe4\x47\x49\x51\xe8\x90\xe4\xa0\x27\x35\x45\x1e\xb8\xb9\x9f\xaa\xd0\x27\x88\x47\xc6\xa1\x64\x54\x0e\x03\x34\x2d\xd0\x96\x26\x69\xeb\xe7\xf4\x28\x4f\x27\x65\x4f\x46\xf3\xc8\x6b\xd3\x13\xea\x9a\x7b\x9f\x9b\x34\x15\x7e\xa3\x12\xea\xca\xb3\xe6\x28\x6b\xe9\xd6\x24\x7e\xf6\x1f\xa0\xad\xb3\xb8\xe1\xaf\xa8\x5b\x5f\x6c\x96\x9b\x21\x6e\x33\x2b\xd3\xd8\xee\xcf\xac\xbd\xe7\xa8\x5d\x00\xe3\x45\x6d\x49\x8b\x4b\x73\x67\xae\x3c\x27\x2e\xc4\xad\xd0\xd6\x39\xd2\xd6\xc5\x06\xd9\x1f\x31\xe7\xf6\x95\x8d\x5b\xa4\xa7\x89\x72\x3f\xee\xdc\x62\x57\xf5\x44\xde\xe8\xbd\xd8\xef\x81\xe4\x34\xd1\xfe\x23\x2e\x06\x6d\xd0\xd6\x79\xd2\x56\xf6\x21\x11\xad\xdc\x4f\xe3\x4c\xbb\x8a\x31\xde\x42\x1e\x71\x84\xe4\x8b\x69\xf7\xa9\x59\x28\xe7\x08\xa5\x3f\xfe\x4d\x91\xd9\x28\x62\x80\xe6\x23\xb4\xa5\x45\xda\x7a\xd1\x21\xe7\xce\x7d\xd4\x47\x46\xb2\x30\x81\xfd\x69\x6a\x54\xab\x6f\xe1\x03\x73\x95\x88\x94\xee\x48\xde\x5d\xe1\x71\x8b\x7c\x33\x0c\xd0\xb4\x43\x5b\xda\xb8\x0b\x97\x78\x9c\xa0\xd3\x3b\x9f\x6b\x11\xfd\x5f\x3b\xae\x68\xdb\x9c\xeb\xf5\x6d\x76\x56\x0b\xbb\x28\x26\x72\x6d\xa8\xba\xcd\x52\x9e\x38\x80\x7c\x82\xb6\x74\x70\xe7\xe3\xb3\x37\x42\xfc\x84\x0c\xc7\x59\x86\xf1\x83\x0d\x5e\x01\x54\x4f\x62\x55\x39\x1f\xa7\xa2\x4f\xc7\x18\x83\x3b\x18\xef\x93\x11\x07\xa3\xcf\xd0\x96\x2e\x69\x4b\x2f\xef\x5f\xb5\xb3\xcd\xab\xa8\xa1\xef\x1b\x26\xa3\x7d\xfa\x12\x76\x3b\xcf\x76\x1f\x15\x6a\x16\x37\x60\x65\xe2\x93\x4a\x49\x07\x31\x40\xd3\x01\x6d\xe9\x91\xb6\x72\xb6\xbd\xcf\xbe\x7d\x56\x91\x5e\x13\xb5\xd2\x45\x99\xf9\x43\x45\x29\x58\xae\x3c\x33\xb0\xa0\xde\x56\xf1\xb3\x5f\x5e\xcf\x15\xe2\xf7\xd8\x09\x6d\xe9\x93\xb6\x2a\xff\xc6\xec\xf7\x1e\xdd\xc7\x5e\x3c\x3d\x14\x48\xa7\x75\x87\x32\x85\x51\xe0\xf0\x0d\x11\xb2\x76\x8e\xb5\x0d\xa7\xae\x9e\x64\x19\x0c\xd0\x74\x41\x5b\x06\xa4\xad\xb8\x1c\x8e\xc5\xbd\x5a\x76\x21\x5e\x5f\xcc\x6b\x75\x99\x6f\x9d\xf3\x0c\x2d\x4a\xaa\x34\xa3\x2a\x57\xe8\xfc\x9e\xf3\x30\xfd\xc6\x49\x0c\xd0\x74\x43\x5b\x86\xa4\xad\xe6\xa1\x84\x7b\xcc\x9a\x73\x79\x55\xc3\xb5\x47\x1c\x0e\xba\xdd\xe2\x39\x21\xd2\x39\x74\x6b\xe6\xa6\x86\x47\x99\xeb\xcd\x0b\x02\xea\x18\xa0\xf9\x02\x6d\x19\x91\xb6\x3e\x49\x3e\x9f\x67\x4d\xfd\x93\x56\x6e\x51\xcb\x6b\xe0\xb6\xfe\x28\xe3\x92\x82\xf4\xe7\xfb\xad\x73\xfa\x87\x46\xe3\x1a\x63\x58\x00\x06\x68\x7a\xa0\xad\x0b\xb8\xa7\x14\x9e\x66\x63\xba\x04\x96\x3b\xc3\xbe\xdc\x3b\x27\x68\xef\xd7\xb4\x1f\xe3\xba\xc0\xaa\xf6\x77\xdf\xb9\xa1\xac\x97\x71\x5b\xe0\x18\x06\x68\x7a\xa1\x2d\x63\xd2\x16\x6f\xe7\x17\xb7\x82\xf6\xe7\xb6\x75\x3f\xbe\x64\xff\xcb\x53\x3f\x2d\x76\x2e\x6b\xcc\x8f\xfb\xa2\xde\x07\xa6\x09\xa5\x8f\xcc\x71\xb6\x18\xa0\xf9\x0a\x6d\x99\x90\xb6\x5c\xad\xb8\xab\x73\x3e\xfe\x95\xba\x7e\xf3\xac\xa7\x8a\xbc\x04\xaf\x2c\xa1\xc2\xa1\xb3\xb1\xc4\x78\xb6\x47\xe5\xa5\x9d\xc2\x26\x71\x8d\xfe\x06\x6d\x99\x92\xb6\x08\x63\x33\x77\x59\x75\xcf\x87\xbc\xbe\xce\xb2\x9b\x54\x25\xf7\x60\xe6\x49\x49\x51\x7b\x12\x8f\xc7\xe3\x23\x5f\x7e\x8c\xd6\x74\x08\x60\x80\xa6\x0f\xda\x32\x23\x6d\xd1\x74\xdc\xbc\xa7\xc8\x6f\xd0\x7e\xf9\xea\x91\xd9\xe1\x8b\x4b\x3d\xb3\x15\xbf\x3e\x3f\xbe\x71\x68\x81\x6c\x57\xb3\x8d\xfd\xf4\x09\xe2\x66\xff\x3b\xb4\x65\x8e\x1b\xb2\x84\xb2\x25\x2f\xb8\x39\xe8\x86\x5c\x98\xa1\x39\x32\x70\x4a\xb0\xfb\xc5\xb5\xed\x87\x2f\xc4\x69\xeb\xdb\x94\x86\xef\x0a\x54\x10\x5f\x57\x3f\xb4\x65\x41\xda\x3a\x51\x1e\xd3\x49\xae\x61\x4f\x9d\xa5\x7d\x5d\x7b\x24\x67\xa0\x2b\x8a\xc7\x26\xf5\xfa\x2c\x75\x4d\x8f\xd6\x3b\x1a\x31\xda\x87\xc4\xf5\x6b\x00\xda\xb2\x24\x6d\xc9\xf7\xd7\x8e\x3e\x1c\x74\x3b\x98\x51\xfc\xa2\xdc\xdf\x63\x0f\x9f\x60\xef\xa3\xb9\x9b\x65\x12\x73\x99\x0a\x27\xc2\xa6\x13\xfa\x0f\x63\x80\x66\x10\xda\xb2\xc2\xdd\xbf\x5d\xe4\x34\x54\x66\x41\xbd\x17\xae\x4f\x46\x0a\x4e\xbe\xb4\x55\xaa\xb5\x3c\x1d\xcd\x30\xa8\x1e\x6d\xd6\x27\x6a\x26\x68\x41\x89\x01\x9a\x21\x68\xeb\x22\x69\x8b\x75\xe4\x9b\x90\x4a\xd2\xe5\x02\x9d\xdf\x69\xe4\x76\xf6\x05\x06\x2e\x9a\x6d\x21\x11\xe2\xf1\x66\x6f\x34\xe3\xa5\x58\xb0\xe7\xc4\x41\x72\x18\xda\xb2\xc6\x6d\xec\x02\x7a\x56\x72\x46\x1c\xf9\x5b\x17\xc2\x58\x24\x4e\x84\xa5\x20\x1c\x85\x71\x82\x45\x7f\x94\x5f\x4e\x16\x67\xe6\xa9\xb6\xe9\x63\x80\x66\xe4\x3f\x06\xb6\xff\x7a\xf8\xfd\x3f\x03\x9b\x0d\xe9\x3f\xae\xb3\x59\xf0\x4e\xc3\x7e\xe1\x4c\xbb\xff\x16\x2d\xe5\xae\x13\x7d\xd1\x5c\xed\x91\x3d\x7d\x46\x8d\xbf\xfa\x10\xe1\x83\x0e\xe1\xd2\x18\xa0\x19\x85\xbe\x91\x4b\xa4\x2d\x77\xbb\x7e\x25\x1a\x05\x19\x86\x8d\x0d\x15\x81\x4a\x8f\xd7\x23\xa9\x82\x11\xe6\xd6\x56\x2d\xfb\x68\x5d\xd3\xbe\x5f\xbf\x4d\x46\x3c\x81\xc7\xa0\x2d\x5b\xd2\xd6\xe9\x7b\x13\x5c\xee\xf4\xce\x2f\x4e\xb7\x6a\xfc\xd2\xa5\xdc\x5e\xd9\x4c\x8b\xe7\x5c\x53\x2b\xf3\x64\x51\xda\x40\x4c\x9e\xc9\x1d\xc7\x00\xcd\x38\xb4\x65\x47\xda\xd2\x3f\xd8\x9f\x32\x26\xf7\xc5\x42\xcf\xf3\xc3\x80\x95\x4a\x77\x1f\x3b\x47\xea\xe2\x56\xf5\x5d\x75\xee\x6b\x69\x7c\x7a\x0f\xae\x13\x77\x36\x13\xd0\xd6\x65\xdc\xed\xe3\x91\xfe\x99\xf4\x1b\x53\x09\xcf\x95\x4e\x6e\xd7\xff\x7a\x76\xbf\xe6\x73\xdf\x85\x9f\xc9\x12\xdd\x8e\x71\x76\x83\x69\xe9\x47\x65\x31\x40\xf3\x03\xda\xb2\x27\x6d\x69\x1f\xec\x3b\x95\x72\x40\x25\x51\x71\x9e\xfb\x4e\x7b\x6b\xff\x60\xbe\x39\xd5\xea\x39\xf3\x26\xe0\xea\x59\x30\xfe\x61\xc8\x86\xb8\x73\x9e\x84\xb6\x1c\x70\x0b\x1e\xe1\x13\xfb\x9f\xef\x7a\x29\x37\xef\xb3\xd1\xaf\x47\xfd\xfb\x33\x42\xd9\xdb\x5f\x1b\x2e\x72\x67\xde\x78\xec\xef\xb1\xbe\xb3\xc4\x13\x78\x0a\xda\x72\x24\x6d\xbd\xba\xc0\xb1\x9d\xef\x7a\x5a\x32\xcb\xdb\x69\xe4\xdf\x7a\x9b\xf5\xf1\xdd\x73\x77\xa9\x4d\xc6\x3b\xec\xc5\x5f\xea\x2b\x84\x5c\x24\x2e\x2c\x3f\xa1\xad\x2b\xa4\xad\xa1\xb7\x7b\xab\x03\x8f\x34\x5f\x9f\x95\xb5\xb6\x11\xf6\x38\x73\xd7\xfa\xc3\xdf\x4c\x65\xd5\x24\xfe\xa0\xd7\xb1\x29\x77\xd4\xf8\x3c\x30\x40\x33\x0d\x6d\x39\x91\xb6\x9c\x9c\x38\x17\xba\xf9\xb6\x84\x07\xce\x7b\x04\xdb\xbc\x39\x8a\xed\x73\x52\x79\x64\xe8\x5d\x1f\x44\xb5\x7d\x9f\x4d\xa7\x9e\xfd\x00\x06\x68\x66\xa0\x2d\x67\xd2\xd6\x57\xba\xba\x60\xe6\xb0\xf8\x67\x79\x81\x8b\xf5\x35\xb2\x5e\x2a\x15\x1f\x38\x57\x87\xb6\xfb\x1b\xc9\xaf\x57\x3e\x66\xd9\xab\x46\x1c\x8c\x66\xa1\x2d\x17\xd2\x96\xc4\xd1\xe8\x97\xa5\x31\x7f\x2c\x57\xa7\x99\x08\xfe\x8b\xf3\x0b\x4f\xaa\x93\x0a\xba\xfa\x46\xc6\xec\xfd\xd6\x14\xdd\x3f\x85\xf1\x61\x80\x66\x0e\xda\x72\xc5\x3d\x14\x97\x99\x1c\x6a\xdb\xa0\x1e\xe1\xb8\x79\xee\x3d\xfd\x3b\xf1\xf5\x1e\xbf\x4e\xe5\x66\xee\xee\xfc\x66\xf5\x4a\xa0\x3e\x60\x45\xbc\xd0\xff\x82\xb6\xdc\x70\x9f\xd7\x52\x9e\xa8\xd9\xa5\xbb\x75\xce\xee\x17\x65\xef\x7e\xc5\x6c\xcb\xad\x8e\x9c\xa8\x1c\x79\x33\xa9\x77\x8d\x96\xf1\x56\x07\xb5\x1d\x06\x68\x7e\x43\x5b\xee\xa4\xad\xf5\x0b\xfb\x9d\x95\x5f\xf4\xa7\xeb\x5c\x8d\xf8\xb7\xce\xc9\x14\x15\xca\x3a\x36\x4c\xf1\x25\x26\xa0\xe7\x9e\x62\x9e\xee\xc8\x16\x71\x98\x99\x87\xb6\x3c\x70\x6b\xce\x40\x4c\x7e\x2b\xe5\xea\xdf\xce\x77\xbd\xf3\xba\xb3\x7f\xb2\x4e\x68\x0a\x0d\xb0\xb3\x3a\x7a\x67\x3c\x4d\x3e\x4e\x26\x3c\xa9\x85\x01\x9a\x05\x68\xcb\x93\xb4\xc5\x7e\xbb\x2e\x32\xef\xf3\x77\x34\x61\x89\x21\xac\xe0\x22\x77\x43\xbe\x50\xd6\xc8\x6b\x8d\xc0\x8f\xf7\x1a\x9f\x77\xb5\x5e\xe0\xbc\x88\x01\x9a\x45\x68\xcb\x8b\xb4\xf5\x41\xe6\x82\x2a\xe5\x19\x1f\xaf\x27\x71\x79\x7d\x2f\xa4\x9c\x9e\x86\x3d\xf8\x7c\xcb\x60\xe1\x22\xe2\xf0\xfa\x28\xd5\xcf\x9d\x2b\x7b\x31\x40\xb3\x04\x6d\x79\x93\xb6\x3e\x26\x89\x5d\xde\xa1\xdb\x6a\xfc\x19\x17\x23\x4c\xb7\x1e\xed\x93\xcf\x62\xd9\xb5\x7f\x2b\xb2\xf7\xac\xd3\xf5\xbf\x29\x57\x55\xdc\x31\x40\xb3\x0c\x6d\xf9\x90\xb6\xbe\xff\xbb\x3a\xaf\xf8\x85\xdf\xa9\x46\x82\xa9\x19\x0d\xf2\x95\xa6\x90\xef\x7d\x61\xdd\x15\xb6\x97\x32\xf0\x56\xcc\x76\x40\x32\xf1\xf8\xfa\x03\x6d\x5d\xc5\x3d\x96\xd3\x74\x7b\x4f\x79\xa5\xc6\x22\xc6\xed\xba\xa0\x5c\xe3\xc0\xa9\xc4\x54\xb2\x6e\x6d\x96\x80\x2b\xd9\x53\x5d\x5e\xe6\xf3\xdc\xc4\x61\x66\x05\xda\xf2\x25\x6d\xa1\xc7\xf3\xf4\x72\x79\x1d\x7a\x44\xd3\xb3\x94\x95\x7a\x8f\xdf\xfa\x2a\x7c\xfa\x73\xb3\x02\xfb\xd9\x4f\x95\xef\x02\x7d\xa9\xed\x89\xc3\xdf\x5f\x68\xeb\x1a\x6e\x03\x35\x1f\x27\xd5\xff\xa0\xf3\xea\xce\xdf\x5f\x23\xce\xc1\x1d\xe9\x42\xbf\x45\xe9\xe2\x24\x0f\x2e\x3e\xdd\x53\xfb\xf9\xb0\x36\x8d\x29\x06\x68\x56\xa1\xad\xeb\xa4\xad\x7d\xf1\xcb\xe7\x7d\x6a\x96\x2e\xbf\xb8\xfb\xca\x61\xa9\x96\x8b\xf5\xba\x3f\xd3\xaf\x0b\xb1\xbe\x16\xd7\x1c\xdd\x03\xbf\xa9\xe9\x11\x37\xc2\x6b\xd0\x96\x1f\x69\x2b\xa1\x34\x54\x29\x6a\x40\x5a\x3a\x89\xb1\x9c\xf6\x5b\xe6\xa2\xf5\x9e\x88\xd6\x55\xc1\xfd\xfa\x5a\x51\x12\x3c\x81\xcd\x46\x96\xb4\x18\xa0\x59\x87\xb6\x6e\x90\xb6\x06\x1c\xb5\x65\x8f\xcc\x33\x94\x5e\x7b\xc4\xae\xa8\x1d\x58\xf2\x83\x2b\x51\x17\xd1\xec\xdb\xf0\x59\x93\x8c\x96\x58\x70\x7b\x4b\x1c\x4a\x37\xa0\x2d\x7f\xd2\xd6\x0d\xb2\xdc\x29\x57\x1e\x7d\xa1\x37\x77\x75\x12\x98\x9e\xaf\x3f\xd7\xbd\xc1\x7a\x20\xe6\x55\x9c\xc0\xc1\x73\x3d\x86\xe1\x29\x0c\x28\x06\x68\x36\xa1\xad\x00\xd2\x56\x6b\xcf\x92\x8b\xa4\x9b\xb7\xe4\x92\xf4\xae\xca\x1e\x45\x0a\x8b\x7f\xe7\xe9\xaa\x06\xfb\x43\x66\xef\x6b\x55\x9d\xa6\x4b\x94\x3c\x85\x01\x9a\x7f\xd0\xd6\x4d\xdc\xcf\x1c\xf4\x68\x6f\x36\x7c\xad\xbf\x19\xff\xd2\xdc\x53\xf1\x6a\x73\x8c\x71\xcf\xf8\x52\x37\x57\xa0\xc1\xdd\x07\xf6\xc3\xbe\x97\xa6\x88\x6b\xf4\x16\xb4\x75\x0b\x77\x43\xc3\xfc\x6f\x8a\x2f\x2d\xc7\x14\x9d\x49\xe3\xb3\x30\xca\x80\x25\x3f\xa4\xc3\xe0\xe5\x5d\x0e\x4c\xd4\xff\x61\x06\x6b\x5b\x18\xf1\xb3\xdf\x86\xb6\x02\x49\x5b\x91\xd7\xa9\x56\xd4\xb5\xda\xa4\xbb\x04\x5e\x2d\xae\x9c\xa0\xb6\x2b\x7c\xfe\xb5\xdb\x22\xf5\xcb\x9b\x6b\x5c\xa1\x15\xdf\x1e\x45\x10\xcf\xc7\x1d\x68\x2b\x88\xb4\x65\xce\x55\x38\x6c\xc3\xe1\x62\x4f\xd0\xa9\x75\xa8\xef\x65\xad\x31\x0d\x9c\x94\xe5\x7a\xaf\xaa\x90\x74\x5a\x7a\xae\x09\x64\x5e\xc1\x00\xcd\xee\x7f\x0c\x6c\xff\xf5\x13\xc4\xff\x19\xd8\x82\x71\xb7\x0a\x25\x9d\x4e\xfc\x9b\x69\xfb\xa3\x62\x90\x28\xf3\x21\xfb\x64\x72\xf0\x9b\x78\x69\xff\xcb\xde\xc3\x22\x83\x76\xb5\xea\xa6\xaa\xac\x18\x40\xc9\xa0\x6f\x04\xc3\x7d\xf1\xd6\x43\xc2\xcb\xf9\x3a\x21\x64\xb4\x41\xe9\xb5\x87\xde\x2d\xa9\x1c\xa1\x4f\xbb\xe7\x98\xd1\xdc\xf6\xf8\x2e\x4b\x0c\xa7\x2e\x1d\x06\x50\x04\xda\xba\x4d\xda\x3a\x5a\xf8\xfd\x02\xff\x97\x84\xf4\x97\x33\x97\xc7\xf8\x3b\x5f\x5e\x49\x8e\x19\xcd\xfb\x78\x2a\xf3\x7b\x5e\x93\xd6\xe1\x94\x19\x07\x13\x0c\xa0\xe4\xd0\x56\x08\x69\xeb\xec\xbf\xa6\x75\xdd\x0b\x4d\x5d\x2d\xaa\xc5\xfa\x94\x01\xc1\x33\xdb\x1c\xcb\x3c\xa7\xc3\x5c\x8e\x68\x1f\xed\x4c\x3c\xb3\x1d\x48\x7c\x5d\x14\xd0\x56\x28\xee\x82\xda\x6b\xab\x44\xbe\x21\xd1\x90\xcc\xfb\x38\xe6\x9d\x5e\x8f\xaa\x95\x03\xa5\xe9\x16\xe7\x05\xad\x46\xd7\x23\x54\x27\x57\x0f\xdb\x61\x00\xa5\x84\xb6\xee\x90\xb6\x7c\x2e\x36\x18\xf8\x94\x67\x33\xbf\x78\xb4\xb1\x98\x42\x16\xb3\xec\x36\x63\x22\xdc\x99\x9e\xc1\x66\xe4\x72\x51\x6a\x6e\xff\x41\x1d\x0c\xa0\x54\xd0\x56\x18\x69\xeb\xa1\xa5\xb2\x5d\x9d\x64\xf0\xb1\xd9\x75\x2e\x15\xda\x06\x10\x11\x22\x70\x29\x25\x9a\xe7\xe5\xdf\x3d\x45\xe7\xe3\xb2\x8e\x55\x9e\xc2\x00\x4a\x0d\x6d\x85\x93\xb6\x62\x9b\xd6\xaf\x5b\xa6\x5e\x4c\x21\x67\x29\xed\x51\xf8\xd4\x55\x2b\x31\x78\xd8\x92\x5c\x27\x5f\x16\x9c\xa2\x3c\xb4\x41\x6f\xeb\x84\x01\x94\x06\xda\x8a\xc0\xed\x46\x24\x29\xe2\xa3\x68\x26\xa3\xcd\x62\x8a\x23\x46\xe8\x3b\x46\xc8\xdf\x08\xd4\xaa\x91\xad\xe9\x59\x0c\x5f\x27\x7c\xfe\x7c\xdc\x03\x03\x28\x0a\x6d\x45\xe2\x86\x65\x2e\xdf\xd9\xcc\x54\x67\xd5\x57\xf1\xf3\x65\x8b\x52\xbc\x1e\x55\x5e\x47\xd7\xfc\x68\xed\x82\x44\x19\xbe\x3f\x35\xfa\x7a\x49\x16\x03\x28\x01\xda\x8a\xc2\x5d\x20\x3e\x71\x30\xce\xea\x7c\x08\x6a\x7a\x23\x9f\x68\xf3\x76\xef\x62\xa4\xf6\x25\xa1\x65\xfa\xf8\x77\x83\x61\x9f\x2e\x64\x86\x54\xb2\x61\x00\xdd\x03\x6d\x45\x93\xb6\xee\x26\x74\xf8\x89\x73\x59\x50\x9a\xbf\xfa\xe6\xdb\x5a\x9a\x31\x77\x7f\x7e\xad\x53\xf4\x70\x88\x04\xed\x27\x6a\xb6\x47\xbe\xf2\x8a\x18\x40\xf7\x42\x5b\x31\xa4\xad\x40\xae\x2f\xf1\x2a\xab\x1d\x45\xf1\xa2\xf3\x22\x35\x13\x74\x76\xdf\x18\x45\x69\xef\xb8\x9a\x2a\xab\xad\x1d\x5e\xf9\xbe\x2c\x60\x8a\x01\x94\x16\xda\xba\x8b\xbb\x75\xcf\xb7\xb0\x9a\xfd\x8e\x26\x98\xf0\xad\xb3\xcb\xaf\x4c\x34\xb3\xa4\x5b\xb9\x76\x55\x51\xb7\x93\x81\xd6\xf6\x21\x83\xc8\x6d\x72\x0c\xa0\xfb\xa0\xad\x7b\xb8\xef\xf1\xe0\xc3\x1f\x42\x61\x13\x27\x85\xe3\x7b\x67\x2e\x9b\xdc\xb0\xc7\x1e\x4e\x2c\xdc\xd3\x3f\x1b\x2b\x79\xa6\x75\xdf\x75\x3f\x9a\xd3\x18\x40\xe9\xa0\xad\xfb\xa4\xad\xfb\x95\xaa\x97\x4a\xf9\x37\x97\xa2\xab\x14\x1c\xfd\xeb\x43\xb7\xda\xe2\x7f\xc9\xb3\x4a\x3d\x2a\x2f\x79\xc7\x62\x9b\x5f\xa8\x41\x3c\xbe\xf6\x43\x5b\xb1\xb8\x3b\x92\x7f\x3c\x3d\x72\xcb\xef\x08\x8f\xbf\x6d\x7c\x19\x2e\xaf\xb8\xf3\xc1\x73\x50\x58\x32\x39\xed\x51\xf7\x39\xeb\x6e\xe7\x5b\xc9\x67\x30\x80\xd2\x43\x5b\x71\xa4\xad\xf0\xa5\x25\xe5\x84\xd7\x6c\xcb\x55\xcb\x49\xbf\x72\x73\x64\x05\x9c\xcc\x6e\xbe\xcb\xfd\xd6\x90\xe3\x35\x7b\xe4\x87\xd5\xe1\xcc\xfd\x18\x40\x19\xa0\xad\x07\xa4\xad\x49\xef\xdb\xc1\x3b\xe1\x53\x69\xff\x5a\x7f\x38\x4b\x9f\x89\xff\x50\xa0\x1f\x9e\x37\x58\xd7\x79\xbc\x4d\xc7\xed\x38\x77\x6d\x36\x03\x06\x50\x46\x68\x2b\x9e\xb4\x35\xa1\x14\x77\xec\x5e\x6b\x74\xb5\x48\x5f\x4a\xfd\x4b\xb2\xfb\x5c\xf9\xd7\xcc\xb4\x29\x7b\x9e\x91\x3b\xc4\xa5\xf1\xbc\xc9\x57\x24\x1e\x13\x4c\xd0\x56\x02\x69\xcb\x40\x29\x53\x91\xbc\xa0\xf5\x5f\x9a\x94\xea\x19\x83\x96\x2a\xe5\x9c\xaa\x35\x2e\xb7\x49\xcc\xf0\x20\x8b\x72\x50\x93\xcb\x63\x23\x0c\xa0\xcc\xd0\x56\x22\x69\xcb\xdf\x9d\x36\xe8\x63\x4d\xd0\x7d\xb2\xcb\x66\xb1\x3f\x65\x65\xd4\x65\xf7\x72\xdb\x3c\x74\x48\xe8\xcf\xe4\xb8\xf2\x2d\xba\xdd\x50\x0a\x03\x28\x0b\xb4\x95\x84\x7b\x5d\x97\x95\xae\x3e\x35\x95\x6e\x79\x77\xf8\x48\xb1\xd8\x23\x69\x9b\x53\xb6\x1f\x45\x0f\x67\x77\x08\x51\x75\x2e\x57\x0d\x5c\x4f\x39\x80\x01\xf4\x00\xb4\xf5\x90\xb4\x95\x6b\xfa\x2d\x58\x8c\x73\x9b\xfe\x4f\x37\x88\xe9\x5a\x8a\xbf\x77\xc3\x4f\xea\x78\x72\xa6\xcc\xe3\x1c\xf4\xf2\x6d\x61\xb3\x50\x1a\x0c\xa0\x07\xa1\xad\x64\xdc\x1d\xb6\x7f\x98\x95\xfe\xe1\xcc\xa1\x00\xbb\xc2\x41\x33\xe1\x3f\xaa\x51\xf4\x03\x87\x22\xd9\x94\xb9\xee\xe5\xcc\x65\x96\x82\x49\x1e\x0c\xa0\x87\xa0\xad\x14\xdc\xc6\xae\x45\x9a\xee\x6e\xde\x52\xca\x6b\x5b\xbd\xe2\x53\xd5\x19\x0f\xd2\xa6\xa4\x29\xaf\x71\x89\xbb\x5c\x51\x2a\x3a\xef\xfd\x63\x4d\x0b\x03\x28\x80\xb6\x52\x49\x5b\xb4\xb3\xbc\xb3\xdb\x02\x2d\x9b\x49\xfd\x2e\x67\xde\x6a\x8e\x37\xee\x6d\x0a\xa1\x59\x39\xfc\x7e\x21\xf8\xf5\xf5\x0d\xda\x3e\x31\xe2\xb5\x83\x15\xda\x7a\x44\xda\xaa\x78\x76\xbb\x77\x4e\xff\x57\xe3\x96\xd1\xd2\x87\xd3\x17\xee\xd2\x44\x0c\xc7\x73\x27\x2d\xb9\x0a\x64\x2d\x6d\xa6\x48\xed\xcd\xa5\xc5\x00\x7a\x18\xda\x7a\x4c\xda\xea\xaa\x34\xd6\x99\x7d\x52\x54\x72\xb6\x2a\x89\xcd\xcf\x35\xfd\xe9\x35\x2e\xcf\x94\x43\x85\x3a\x1f\x92\x1f\xdf\x65\xaa\x57\x51\xe2\xc0\x00\xca\x06\x6d\x3d\x21\x6d\x0d\x4f\x2e\xb0\x2d\x1f\x10\x4d\x58\x79\xbe\xca\xb2\xdb\x78\xb4\xf5\xd5\x61\x7e\xf3\x81\xeb\xa7\x96\xc9\xd4\x8e\x9c\x68\xf6\x56\x3a\x8f\x01\xf4\x08\xb4\xf5\x94\xb4\xf5\x83\x62\xab\xe0\x09\xfb\x56\x50\xc8\x61\x4e\xba\x1b\x31\xee\x0f\x13\x3f\x04\xe7\x76\x72\x4d\x32\x17\xa6\x89\x6a\x1e\x0c\xa9\xb4\xc2\x00\xca\x0e\x6d\xa5\x91\xb6\xea\x38\xc3\xcd\x12\x05\xe9\x32\x6e\x73\x3b\x2b\xa7\x5c\x43\x3f\xb6\x12\xec\x4a\xcb\xc9\x55\xe5\x8e\xa9\xed\x89\xed\x73\x8d\xd6\xc5\x00\xca\xf1\x1f\x03\xdb\x7f\xfd\x47\x90\xff\x19\xd8\xd2\x49\xff\xf1\xde\x9f\x5e\x9d\x6e\x2b\xc3\x6d\x03\xce\x36\x17\xed\xcd\x3d\x9d\x34\x8e\xc7\x48\x5d\x8a\x37\xdb\xe7\x82\x5a\x34\x5e\xae\xc1\x88\x8b\xe7\x51\xe8\x1b\xc9\x20\x6d\x09\x3e\xf1\xf6\x3f\xe0\xab\xf9\x82\xae\x42\xc2\xd7\x9d\x9d\xbe\x2b\xf7\x80\xc3\x61\xca\x84\xfa\x12\xa5\x9c\x9a\x45\xdf\x3b\x41\x07\x31\x80\x72\x42\x5b\x99\xb8\xd7\x85\x5a\xbc\x0a\xff\xc1\x76\x53\x3c\xd7\xd6\xe7\x8d\x63\x7e\xd2\xf3\x56\x51\xd5\xee\x15\x8d\xa6\xed\xb4\x95\xe7\xeb\x21\x72\xc4\x8b\xe0\x31\x68\x2b\x8b\xb4\x95\x6c\x23\xbc\xee\x5a\xab\xba\x91\x5d\x25\x2c\x3b\x94\x7a\x56\x52\xa4\xe5\xd9\xea\x3d\x0d\x29\xe1\xae\xec\x03\xce\x26\x8c\x25\x02\x18\x40\xb9\xa0\xad\x67\xa4\xad\xd4\xde\x7a\x2a\xfb\xea\x0f\xd1\x0a\x84\x74\xd3\x47\x77\x5f\xea\xa7\x4a\xe9\xe8\xef\xab\x00\x13\xfd\x6d\xb2\x83\x1b\x1b\x7b\x38\x31\x80\x72\x43\x5b\xcf\x49\x5b\x26\xe1\x33\x34\x0b\x74\x73\xcf\xf7\x32\xd3\xf4\xef\xcd\xd6\xf4\xb6\x1c\x53\xd3\xfc\x8b\x9c\x49\x2c\x74\x19\x92\x79\x14\xd0\x27\x8c\x01\x94\x07\xda\xca\xc6\x3d\xaa\x8d\xd8\xd3\xf3\x66\x27\x91\x6d\xcd\xcb\xbf\xf4\x86\x8e\x41\xd6\xeb\x1a\xcd\x25\x07\xe9\x38\x8d\x4e\x2d\xdb\x2e\xc2\xd7\x60\xe2\xe0\x7d\x1c\xda\xca\x21\x6d\x79\xfd\xf1\xec\xdd\x64\x68\x90\x5b\x0b\x57\x2e\x4a\x1c\x2b\x57\xe1\x8f\xb9\x16\xa9\xfe\x30\xe5\x93\xcc\x93\x3c\xa0\x72\xa9\x80\x0b\x03\xe8\x09\x68\x2b\x97\xb4\xe5\xdb\xe3\x7e\x35\xaf\xba\xc3\x7e\x6f\xb9\x4f\x9b\x5e\x79\x89\x67\xe9\xc3\xd2\xd5\xa0\x86\x23\x1f\x0e\x50\xd6\xdf\x2f\xf6\x6f\xa7\xc2\x00\xca\x0b\x6d\xe5\x91\xb6\x1c\xd6\x07\x67\x7e\xb0\xd7\x3b\x97\x24\x58\x6d\x78\x8d\x7b\x45\x30\xdf\x3b\x9e\xe7\xbf\x77\x99\x02\x15\xd8\x27\xad\x68\x63\x47\x5c\x58\xf8\xa0\xad\x17\xa4\x2d\xca\x3b\xb7\xaf\xae\xde\x94\xff\xb8\xcb\x5b\x14\xac\xfa\x56\x31\x3e\xdf\x6a\x83\xde\x62\x34\x9e\xb2\xd8\xe1\x38\xef\xf4\x33\x63\x31\x0c\xa0\xfc\xd0\x56\x3e\x6e\xc0\x1d\x68\x3c\x55\x32\xa7\xf8\xfb\x41\xd9\xde\x99\x1f\xf4\x27\x1f\x37\x71\x95\xef\x1f\xcb\xae\x7f\xc4\xd4\xa8\x35\x61\x9b\x29\x41\x5c\x58\x4e\x42\x5b\x2f\x49\x5b\x22\x01\x9f\x15\x8a\x9a\xa7\x27\xf3\x10\xe1\x4e\x57\xbd\x1a\xf1\x02\xfb\xd2\xa0\x07\x92\x54\x71\x97\xbc\xa6\xed\x7b\xf7\x68\x10\x17\xf5\x53\xd0\xd6\x2b\xd2\xd6\x33\x81\xef\x6e\x86\x51\x63\xeb\xed\x2a\xfd\x84\xe6\x73\x8f\xc4\xaf\xfe\xbe\xc1\x79\x75\x61\xbc\x38\x3e\x8f\xb9\xd4\xf6\x77\x13\xf1\xb8\x17\x80\xb6\x0a\x70\x8f\x7d\x43\x08\xbb\x36\x6a\xe7\x0a\xaf\x4e\x78\x25\x2a\x3b\x52\x64\x5f\x65\x33\x49\xea\x53\x69\xec\x42\xc5\x79\x45\xf3\x04\xa7\x84\x30\x80\x0a\x42\x5b\x85\xa4\xad\xd9\x29\x8d\x91\x4b\x67\x4f\xcc\x94\xff\xa4\xc7\x7c\x7f\x0a\x47\xa4\x7c\x6b\xdf\xaa\x50\x3e\xdf\xc3\x7a\x25\x3a\xc6\xc8\xf0\x14\x05\x06\x50\x21\x68\xab\x08\xb7\x19\x33\xdc\xed\x0d\xb3\x0e\x57\xcf\x89\x1d\xc4\x3c\xbb\x9e\x52\x33\x53\x4f\x4b\xe8\xda\xc5\xcb\xfd\x5b\xd8\x93\x1e\xdb\xee\x2d\x8f\x01\x54\x18\xda\x2a\x26\x6d\x71\x2d\x1d\x7f\x23\xe9\x99\x60\xa0\x96\xe6\x33\x97\x59\x24\x40\xb1\xa9\xf2\x38\x79\x29\x71\xe5\x71\x52\x93\x5e\xc3\x97\x67\x36\x94\x18\x40\x45\xa0\xad\x12\xd2\x56\x15\x5f\x39\xbd\x2d\x97\x73\xe0\xab\x15\xde\xf3\x0a\xe5\x7b\x55\xdc\x4d\xc4\xe2\xf6\x1f\x4c\x2d\x14\x64\x16\xf3\xe8\x37\xcf\x39\x8c\x01\xf4\x34\xb4\xf5\x9a\xb4\x25\x6c\x73\xa3\x34\x44\x4e\x8f\xbf\xcc\xaa\x24\xc4\x62\x41\x76\x74\xdf\x5d\xbd\x93\x3b\xd9\xc1\xae\xc5\x3a\x75\x57\x6c\x47\x29\x89\x6b\xce\x19\x68\xab\x14\xf7\x98\xdc\x3b\xb7\xfe\xbd\x69\x46\x41\x5a\x00\xbf\x32\xb7\xf3\x59\x31\xbf\xa8\x29\xa0\x7d\x26\xe9\xde\x58\xfa\x04\x9b\xb6\xfa\xe2\x45\x0c\xa0\xa2\xd0\xd6\x1b\xdc\x4f\x27\xce\xb3\xfc\xfa\x22\xb7\x13\x40\x7b\xc6\xf9\xe4\xef\xde\xfb\x79\x9f\x22\x84\x9b\xd4\xc4\x35\xbc\x57\xb2\x9b\x39\x8f\xb7\xe7\x13\x37\xd5\x62\xd0\x56\x19\x69\x6b\xa1\xf4\xd6\xc9\x31\x42\x7e\x9b\x0a\x53\x8c\xdb\x50\xc1\x1b\x69\x6e\x67\x0f\x5d\xf3\x3d\x64\x45\xfa\x9d\x6e\x6e\x33\x73\xbc\xc4\xcf\x4b\x1c\xda\x7a\x4b\xda\x4a\x97\x3c\x96\x11\xdf\xf1\x72\xe6\x5b\x80\x43\x25\xf9\x8b\xdf\x8d\x1a\x0a\xf1\x56\x47\x85\x7b\xc3\xd3\x6e\xf4\x7d\x8d\xa6\xb6\x33\xc4\x00\x2a\x01\x6d\x95\x93\xb6\x9c\x69\x53\xd6\xa7\xce\x09\x54\x56\xf5\x5a\x2e\x16\xbc\x8b\xae\xcd\x15\x3e\x82\xde\x3c\x2e\x58\x94\x7a\x6f\xf0\xea\xc9\xe1\x4a\x7b\x0c\xa0\x92\xd0\x56\x05\xee\x31\xf9\x52\x62\x34\x39\x6b\x40\x24\x8f\x3c\xa1\x74\xc7\x5d\xec\xc8\xb2\xdb\xcd\x57\x62\xf1\x65\x4b\xd7\x3c\x5a\xc2\x33\xcd\xd8\x89\xc7\xbd\x14\xb4\xf5\x8e\xb4\x15\x36\x40\x53\x67\xf1\x05\x3b\xe0\xa8\xde\xd6\xb6\xf9\x7d\x23\x66\x4d\xf4\x78\x45\x0e\x21\x70\xb5\x27\xde\x0e\xdb\xd4\x1c\x72\xc5\x00\x2a\x0d\x6d\x55\xe2\x86\xe5\x1b\x64\xae\x83\xae\x72\x55\x07\x57\xaa\xc4\x52\xcb\xa4\xe8\x0b\x0f\xc5\x74\x7c\x4c\xb3\x64\x6b\xfa\x37\x7e\x4a\xa1\x43\x8f\x80\x01\x54\x06\xda\xaa\xc2\x3d\x7a\x3c\xee\x55\x5d\xbf\x5e\xa5\xf7\x7d\xae\xf1\x42\xa5\xfc\xdf\xab\xd1\xae\x49\xe5\x4e\xaf\x6b\x78\x6b\xa8\xb7\x42\xa6\x4d\xc7\x89\x9b\x0b\x59\x68\xab\x1a\x77\xac\x36\xd9\x9a\xb6\x9d\x9b\xde\x23\x24\x4a\x36\x1c\x2b\xd9\x58\xb4\xfd\x6d\xbb\xac\x59\x52\x8d\xed\xe5\x03\xc6\xad\x81\xeb\x1d\xc4\xef\x51\x0e\xda\xaa\xc1\xad\x5f\xb3\xef\x8e\x09\xa4\x9f\x4f\x6d\x74\x95\x57\x2b\xbb\xb5\x16\x6a\x63\xf9\xf2\x45\xdc\x68\x91\xda\x03\xaa\x9b\x97\x2a\x0e\xca\x10\x07\x49\x79\x68\xab\x96\xb4\xb5\xf5\x9c\x45\x80\x2c\x84\x77\xdc\xde\xa8\xef\xc0\xe9\x94\x81\x91\x54\xa6\x5b\x05\x19\xf4\xc3\xfc\x06\x63\x02\x26\x2b\x76\x2a\xb6\x18\x40\x15\xfe\x63\x60\xfb\xaf\xff\x8e\xfb\x3f\x03\x5b\x1d\xee\x62\x73\x65\xa2\x90\x56\xe3\x6f\xb8\x71\x79\xb3\x7f\x92\x65\x56\x22\x05\xcf\x9e\x5c\x46\x3f\xe9\xec\x51\xc3\x66\x93\xb6\x8e\x0c\x33\x0c\xa0\x8a\xd0\x37\xf2\x9e\xb4\x75\xdb\x7f\x68\xf4\x67\x92\x2d\xed\xa1\x29\xc7\xe5\xf3\xd6\x52\xd5\xbb\x37\x39\xf3\x5b\xb7\x73\xab\xfd\xe9\xb6\xa3\xbd\x8f\x39\xc8\x61\x00\x55\x82\xb6\xea\x71\x8f\x01\x7a\x1d\x9e\xed\xa9\xeb\xbf\x32\xc0\x76\xb0\x96\xff\xee\xd3\x92\xd0\xa3\x6f\xa5\xad\x79\x9e\xce\x5f\x0b\xfc\x51\xe8\x61\xfe\xde\x18\x03\xa8\x32\xb4\xd5\x40\xda\xba\x4a\xdd\xb0\x62\xa3\x3d\x70\x69\x2c\xad\x7a\x74\xe0\x71\x25\xf9\x95\x32\xd6\x16\x1e\xd1\xb8\x1b\xe1\xa3\x0a\x8f\x2a\x17\xc2\x24\x31\x80\xaa\x40\x5b\x8d\xa4\x2d\xef\x46\x03\xa7\x7b\x86\xbf\xc6\xfb\x92\x43\x45\x3a\x52\xbb\xe8\xb6\x7a\x9d\x23\x7f\x5e\x0d\x4b\x3c\xea\xc7\x35\x75\xcd\x64\x46\x10\x03\xa8\x2a\xb4\xd5\x44\xda\x7a\x7f\xbe\xf8\x85\x93\x64\xe9\x97\xcf\xfe\x37\xa8\x1a\xe6\xab\xc3\xce\x1f\x16\x9d\x3a\xe7\xf8\x41\xa1\xd3\x3f\x52\xb1\xd2\xb1\x9e\xb8\xe0\xa9\x41\x5b\xcd\xa4\x2d\xf2\x94\x97\x5f\x2e\xe9\x52\xb2\xd4\x53\x3f\x52\x36\x95\x68\x4a\xd0\x8e\xbf\xc6\xbd\x27\xb8\x03\x4b\xe0\xbb\x62\x1f\x51\x9e\x43\x9c\xfa\xd5\xa1\xad\x16\xdc\xdd\xcd\xc0\xc1\x3d\xb6\xa1\x91\x13\x43\x25\x48\xdf\xce\xb1\x0b\x5b\x66\x7b\xf4\xa9\x6c\x32\x73\xc8\xc4\xd9\x27\xa5\x7d\xc8\xaf\x79\x60\x00\xd5\x80\xb6\x3e\x90\xb6\x92\xcc\x06\xf3\xec\x87\x36\xe3\x95\x0f\xf7\x5d\x4d\x3f\xeb\xb4\xd3\x6e\x37\x91\xeb\xda\x1e\xe5\xd9\x97\xce\x47\x6b\x1b\xef\xa3\x84\x01\x54\x13\xda\x6a\x25\x6d\xed\x9c\x42\x79\x34\x9c\x4c\x02\x9c\x99\x5c\x1e\xf9\x3d\x31\xc0\x26\x55\x9f\x5c\x56\xd8\x67\x32\xbb\x44\x60\x38\xfc\xf2\x7a\xe0\x39\x0c\xa0\x67\xa1\xad\x36\xdc\xdd\x60\x46\xea\xfb\x4c\xf7\x54\xf6\xcd\xd4\x68\xee\xa7\x3b\xff\x39\xed\xe2\xc2\x53\x9d\x8a\x2f\x7b\x28\xdd\x4f\x6d\x0d\x34\x6c\xa5\xb2\x60\x00\x3d\x07\x6d\x7d\x24\x6d\x69\x20\x23\x25\x5f\x8c\x43\xa2\x8c\x7a\xe3\xf8\x38\x0b\x65\xeb\x6f\x2e\x46\x66\xbf\x54\xbc\xd3\x7b\xf0\x80\xc7\x30\x59\x64\x06\x8a\x01\xf4\x3c\xb4\xd5\x4e\xda\xa2\x57\xde\xc8\x15\xea\x22\xcf\x9a\x18\xa1\x0d\xb6\x3b\xd9\x70\x3b\xdb\xe3\x38\x63\x1e\x55\x36\x59\x39\x5d\xa8\xba\xd6\xfb\xdb\x74\x18\x40\xb5\xa0\xad\x4f\xa4\x2d\xb9\x10\xc7\xa7\xae\x7a\xe3\x41\x31\x9c\xf7\xbd\xfc\xf2\x74\x7e\xc6\x6c\x0e\x81\xde\xda\x2c\x6b\x05\x16\x2e\xcb\xe9\x37\xfb\x88\xe7\xb6\x36\xb4\xf5\x19\xf7\xbb\x20\x5a\x93\xa4\xe7\x2f\x66\x75\x73\x7e\x30\xb7\xeb\x07\xeb\x7f\x17\xa5\x65\x9c\x3e\xd6\x49\xb8\x7d\xd1\xbd\x6e\x2a\x6b\x5c\x44\x05\x03\xa8\x0e\xb4\xd5\x81\xdb\x39\xb3\x5d\x18\xbd\xb7\x46\x1f\xaf\x20\xad\x26\xca\x90\xe6\x96\x7d\x77\xc8\xee\xfa\x37\x31\xe7\x6e\xb2\xe1\x1c\x86\xb9\x7d\x79\xde\x18\x40\x75\xa1\xad\x4e\xd2\x96\x38\xd7\xcd\xaa\x31\x09\xc1\x94\xdc\x63\xaf\x9c\xc7\x6f\x9b\xf7\x3d\x34\xcf\xb4\x48\xf5\x1c\x7d\xee\xd0\x2a\xbf\xb6\x65\xfa\x8c\x1d\x03\xa8\x1e\xb4\xd5\x45\xda\xb2\x74\xea\xef\x78\xd6\x3b\xf3\xa9\xb2\x90\x29\x3c\x59\xb6\x39\xbe\x4d\xe6\x6e\xea\x6f\xa5\x1f\x71\x59\x93\xa3\x88\xd4\xd2\x0a\x71\x98\xd1\x87\xb6\xba\x71\x8f\x90\x2d\xfb\xba\x59\x6e\x70\xb8\xbe\x15\x0a\xed\x2e\xa7\x90\x7e\xe4\x8c\x09\xcc\xf2\x09\x05\x59\x5f\x17\x3d\xb1\xfe\xd3\xe1\x20\x71\x73\x61\x00\x6d\x7d\x21\x6d\x51\x25\x77\x6b\x3d\x8b\x75\xb9\x94\x3d\xe6\x21\x47\x79\x0d\x5b\x79\x8c\x84\xad\xb7\xc5\x3d\x7f\x64\x8d\x66\x12\x7a\xf6\x1a\x18\x60\x00\x35\x84\xb6\x7a\x48\x5b\xe7\x1c\x79\x0e\xd0\x9b\x6e\x8e\x84\x4e\xb9\xfb\x3c\x91\x4f\x1b\x7e\x62\xe8\xa6\x10\x13\xfe\x67\x2a\x45\xcc\x72\x9d\x4a\x4a\x8d\x1a\x03\xa8\x11\xb4\xd5\x4b\xda\x5a\x8a\xbe\x05\xc4\xef\x9b\x8b\xd8\x9a\x3d\x5b\x1d\x10\x7d\x58\xf2\x5b\x26\x76\x20\x9e\xd1\x31\x7d\x97\x25\x72\x35\x23\x76\x59\x1d\x03\xe8\x05\x68\xeb\x2b\x69\xab\xe7\xda\xcd\x1d\xa9\xbf\x61\xeb\x11\x5d\x81\x91\xfd\x29\x8f\x36\xf3\x39\x64\x02\x82\x41\xb6\x34\x05\x62\xfb\x4d\xa2\x4f\x99\xb8\x49\x34\x86\xb6\xbe\x91\xb6\xd6\x14\x3a\xfc\x4f\xd4\x86\x5e\x99\xbe\x70\x32\x47\x68\xda\x55\xc5\xbe\x26\xd7\xdf\x4a\x33\xb8\xfd\xb9\xf3\x03\xeb\x5f\x74\x53\x57\x30\x80\x9a\x40\x5b\x7d\xb8\x47\xdb\xba\xf7\x79\x9f\x55\x1c\x4a\x7d\x62\x1d\xe3\x6e\x94\x51\xaf\xd5\x7d\x34\xdb\x7a\xb5\x5b\x38\x30\xf6\x87\x2d\x75\x5e\x7f\x34\x03\x06\x50\x53\x68\xeb\x3b\xee\x1c\x9a\xe9\xa3\xa8\x4f\x5e\x3e\x76\xbe\x67\x62\xf3\x62\x53\x0d\x9d\xb8\x9c\xc6\x09\xf5\xf4\x78\xc9\xbf\x29\x91\xbd\x75\x87\xad\x89\xc3\x8c\x19\xb4\xd5\x4f\xda\xa2\xbe\x19\x54\xf8\xc0\x7a\x90\x9d\x96\xf9\xe2\xd0\xce\x19\xbe\xe2\x9e\x9c\x21\xe5\xc9\x68\x39\x2f\x1b\x97\x6d\x36\xad\xcf\xaf\x89\xe7\x90\x39\xb4\x35\x80\xfb\xf9\x91\xd2\x7b\xd3\x4d\x01\xdd\xe7\xbb\x1b\xf1\x46\x31\x5c\x19\xb2\xc3\xdc\xef\xf5\x95\xba\x22\xd2\xf3\x6f\x27\x47\xbf\xa8\x9d\x25\xb6\x2c\xa0\xad\x41\xdc\xe3\x68\x89\xe0\x1f\x7b\x8c\x9e\x6f\x3f\x48\xd7\xfe\x7a\x45\x88\x4f\x70\x90\xfa\xc8\x46\xf4\x8f\x38\xea\x4f\x5f\x96\x64\x5f\xeb\x15\x10\x8f\x09\x4b\x68\x6b\x88\xb4\x15\xdd\xa9\x12\x30\x29\x19\x36\xb9\x70\x5e\xc7\xb7\x4a\xfd\xba\x6e\xd6\xbf\xb5\x56\x31\xff\xbe\xda\x35\x8e\x93\xfc\x3f\xdf\xa8\xf1\x61\x00\xb5\x82\xb6\x86\x71\x03\xee\xac\xee\xcf\x16\x85\xcd\xb2\xd8\x6f\x22\x67\xaf\xed\xe1\x4b\xac\x88\x38\xdb\x20\xd1\xee\xdf\x56\xa2\xf4\x6a\x93\xbe\x11\x25\x9e\x8f\x17\xa1\xad\x11\xd2\x56\xa2\xa7\xc3\x97\x03\xaf\xe8\x2c\x72\x8f\x6c\xfd\xc8\xef\x9a\xe2\xfc\x14\xaf\xc6\x9d\x8e\x99\x44\x0c\x3d\x75\x5d\xd2\xa8\x4a\xb1\xc3\x00\x6a\xfd\x1f\x03\xdb\x7f\xa1\x28\xff\x33\xb0\x8d\xe2\x16\x16\x4a\xed\x86\xc7\x4e\x55\x82\x66\xa1\x37\xb2\x41\xe8\x69\x99\x20\xc7\xf7\xec\x6d\x3d\x93\x93\x4a\x75\x39\xec\xc8\xe1\x32\x36\x0c\xa0\x36\xd0\x37\x32\x46\xda\x62\x36\x65\x3f\x7f\x9f\x7a\x61\xda\xf4\x56\x9d\x6a\x67\x70\x47\x96\xe6\x1e\x59\x76\x55\xff\xea\xbb\x37\x91\xa1\x7c\xec\x1c\x99\x3e\x06\xd0\x4b\xd0\xd6\x38\x69\x2b\xf3\xab\x55\xcf\x61\x31\x0d\xd7\xf1\x80\x0e\x59\xdf\x2c\x95\xa9\xe5\x48\xa3\x9d\xa4\xfc\x2c\x8f\x0b\x99\x6a\x46\x93\xd7\x19\x55\x31\x80\xda\x42\x5b\x13\xa4\xad\x77\x77\xae\x93\x91\x33\xda\x39\x8b\x98\xd9\xd0\x7e\xbe\x9f\xbc\xa2\xed\xaa\xbf\x49\x6d\x16\x48\x2e\xff\x8b\xda\x72\x71\xf1\x1f\x71\x67\x63\x07\x6d\xfd\x20\x6d\x6d\x14\xf9\x93\xb5\x9a\x3b\xd0\xb3\x15\x58\x85\x1b\x9f\x94\xc0\xe8\x4d\x7e\xbf\xcb\x1e\xbb\xd7\xe4\xe5\xfd\x04\xb3\x5f\x74\x27\x0e\x92\x97\xa1\xad\x49\xd2\x56\xf1\x1f\xcd\x29\x5d\xa6\xfb\xff\x74\x3b\x3f\x8a\xf8\xfc\xcb\x9e\xd0\xd3\x37\x95\x8f\xb9\xf4\x54\x8b\x8a\x4c\x5a\x24\xf2\xc2\x23\x19\x0c\xa0\xf6\xd0\xd6\x14\x69\xab\x34\xd3\xcd\xa2\x21\x57\xaa\x8a\xd6\x3c\xc1\x64\x65\x41\xa6\xf5\xf7\xc0\xee\xa1\xfa\x0b\x4f\xb6\x18\xd7\xe2\x4e\xe8\xbb\x59\x88\x60\x00\x75\x80\xb6\x7e\x92\xb6\x68\x12\x09\x2a\xce\xe3\x64\xc7\x73\x7c\x79\xea\x3f\x5f\x40\x4f\x78\x0d\x2b\x2e\x44\x9d\x17\x2b\xf6\xc9\x92\x0b\x9b\xae\xf2\x21\xee\x2a\x1d\xa1\xad\x69\xd2\x96\x98\x68\x57\x1b\xfb\x8c\x4f\x40\x59\xc6\x46\xf2\xc4\x3a\xe2\x34\x17\x5c\xc6\x21\x1d\xae\xdb\xaf\x9f\x50\x12\x3f\xfc\xb1\x50\x16\x03\xe8\x15\x68\x6b\x86\xb4\x25\xb0\xd2\xe3\x58\x71\xcb\xd3\x37\xf8\xc4\x19\x29\x54\xdd\xeb\x9c\xf9\xa6\x52\xcf\xe7\xbd\x19\x7e\x94\x45\x97\x19\x02\x57\xd3\x4f\x60\x00\x75\x82\xb6\x66\x71\x27\x70\xa8\x93\x5d\x6d\xb5\x52\xf7\xa7\x47\x29\x2f\xa2\x65\x9e\xa4\x9d\x2e\xbe\x73\xeb\x71\x8b\xf0\xc5\x65\x7f\x32\xba\xc2\x83\x36\x6e\x18\x40\x9d\xa1\xad\x39\xdc\xe3\xe8\xac\x23\xe1\xa5\x7c\xb9\xfe\x8b\xdf\x9f\x39\xe9\x11\xe6\x9d\x93\x2c\xb7\x5f\x71\x8f\xaa\x9f\x3d\xe9\xce\x91\x21\xad\xfc\xc0\x07\x03\xa8\x0b\xb4\xf5\x0b\xb7\x78\xca\x2f\x94\x50\xe9\xb3\x1e\x95\xde\x6f\xc3\x99\x29\x1a\x3f\x9f\x19\x16\x85\x16\x9b\x88\x3c\x94\x5c\xda\xa0\xea\x28\xa7\x27\x0e\x92\xae\xd0\xd6\x6f\xd2\xd6\x9e\xc1\xf0\x93\xe1\xba\x1d\x51\xcd\x2d\xd7\xf6\x9b\xd5\x4c\xba\xfd\x31\x6b\x29\xbb\x9c\x79\x4f\x91\x27\x2a\xae\x37\x87\x77\x41\x0c\x03\xa8\x1b\xb4\x35\x8f\x5b\xa4\x72\x39\x7d\x65\x0a\xd4\x8c\x2e\x19\xba\xa8\x50\x6e\x52\x7d\x1c\x29\x9d\xf7\x66\xdd\x2f\xe9\x9b\x75\x79\x3e\xf6\xeb\xb8\xdf\x29\x0c\xa0\xee\xd0\xd6\x02\xee\xb7\x3c\x0e\xca\x2e\x7d\xb5\x39\x43\x77\x5c\xed\x9d\x97\xdc\x3b\x72\xd3\x6b\xef\x6c\xb3\x54\x1e\xa7\x94\x7d\xdf\xbb\x51\x87\x30\x10\x2f\x10\x1e\xd0\xd6\x22\x69\xeb\xc2\xe7\x07\x32\x9b\x19\x0c\xca\x77\xde\xfc\xfb\x23\xbf\xbf\xf9\xbe\x8d\xf7\xb4\x77\xff\x39\x3a\xae\xaf\x45\xef\x5d\x40\x05\x87\x33\x06\x50\x4f\x68\x6b\x09\xf7\xdb\x14\xfb\xc9\x68\x8b\x03\xb9\x5b\xff\xaa\x3e\xb4\xd3\x3f\x57\x18\x65\x3a\xc2\x1c\xcb\xea\x3a\x73\x79\x21\xeb\x00\xc8\x65\x21\x13\xc7\x00\xea\x05\x6d\x2d\x93\xb6\xd2\xae\x3d\xb6\x75\xdc\xe5\x2d\xda\x0a\xa0\xae\x51\x67\x4d\xb8\x13\xfa\x41\xa7\xaa\x74\xa3\xa4\x96\xa1\x83\x13\x34\x64\xd4\x11\xd7\x09\x6f\x68\xeb\x0f\xae\x25\x6d\x5a\xa0\xa8\x3b\x2a\x6f\x31\xd2\x58\xee\x20\x72\xe9\x75\x9c\x57\xcc\x9b\x4c\x6f\xc3\xc5\x23\x33\x0b\x51\xb3\x53\xf6\xee\x18\x40\x7d\xa0\xad\x15\xd2\xd6\xf9\xd4\xf7\x54\x5b\x67\x65\x02\xdb\x7a\x12\x0d\x8c\x72\xce\x9e\x7f\xf8\x90\x36\xcc\xeb\xd6\xf6\xa5\x53\xe3\x4c\x1c\x1c\xd5\x21\x7b\x31\x80\x5e\x85\xb6\xfe\x92\xb6\x84\xdc\x8b\x76\xfd\xfa\x7f\x38\x73\x16\x0c\x7d\xf5\x17\x60\xaa\x73\x8f\xfc\x52\xf6\x55\x58\xb7\xe3\xf8\x6b\x23\xa9\x90\x2b\x34\x07\x31\x80\xfa\x42\x5b\xab\xa4\xad\xa8\x85\x5d\x72\x0e\xb6\xf7\x79\x07\x5f\xf9\xbb\x85\xf3\xb0\xb1\xb9\x38\xb5\x5a\x86\xbc\x91\x97\x16\x2f\xaf\xc0\x8e\x93\x65\x12\xd7\xe8\x6b\xd0\xd6\x1a\x69\x2b\xa2\x39\xe8\xa2\x2a\x4d\x65\x9a\x56\xc9\x3b\x43\x71\xdf\xa9\xcb\x1f\xb6\x26\x42\x5f\x39\xfa\xd3\x8d\x73\xb2\x36\x72\xde\x10\xd6\xc2\x00\x7a\x1d\xda\x5a\xc7\x0d\x6c\x9c\xbf\x47\x7c\xb8\x7f\xde\x9a\x29\x31\x9f\x7b\x2e\x16\xba\xff\xef\xdc\x57\x86\x4c\xfa\x50\x63\xbb\x62\x83\xe3\x83\x15\xf7\x89\x43\xbc\x1f\xb4\xb5\x41\xda\x52\xf0\x7a\x2c\x7c\x62\xa8\x75\x3c\x66\x6d\x67\x21\x38\xeb\xd5\x1d\x36\xa5\xc4\x28\xbf\xbd\x37\xe6\xaa\x3f\xce\xb7\xc5\x8a\x3c\x73\xc2\x00\x7a\x03\xda\xda\xc4\x6d\x38\x13\xdb\xa3\x69\x3a\xfa\x17\x2e\x30\xaa\x06\x1f\x77\x35\xac\xaa\x9f\x2a\x3c\xef\x39\xc8\xeb\x6f\xa8\xa7\xd2\x43\xa1\x1f\x48\x1c\x66\xfc\xa1\xad\x7f\xb8\x75\x55\xce\x9e\x5f\x3d\x76\x32\x56\x34\xf5\xb9\x9a\xed\xe5\x8c\xcb\xdf\xd2\x2d\xdf\x28\xd2\x19\x5d\x45\x8e\xcb\x4c\x2e\x3d\xfe\x4a\x5c\xbf\x02\xa0\xad\x2d\xdc\x39\xb4\x8f\xf6\xe6\xc9\xf6\x17\x7f\xaa\x0f\xcb\xed\xe7\x17\x37\x8a\x59\x79\x70\x2a\xb3\xed\xdc\x47\xda\xbf\x36\x6a\x4c\x32\xfd\xc2\x82\x18\x40\x6f\x42\x5b\xdb\xa4\xad\x57\xcf\x54\xff\xed\xfe\x3b\xad\xdd\x37\x99\x22\x97\xbd\xb0\xae\xf1\x4f\xe7\xe4\x5d\xad\xe1\xc3\x84\x7a\xe9\x18\x0e\xf1\xd0\x01\x0b\x0c\xa0\xb7\xa0\xad\x1d\xdc\xe3\xfb\x7b\x95\x87\x99\x45\x85\x7c\xa3\xed\xc5\xfe\xcc\x4b\x73\xce\xf5\x23\x92\xf5\xa6\x8f\xc2\x46\x1d\xfd\x4f\x8c\x58\x52\xd6\x12\x8f\x89\x40\x68\x6b\x17\xf7\xd4\x68\x30\xb2\xad\x4b\xdc\x2a\xac\x6a\x78\xbd\xe6\x05\x4f\x42\x44\x27\xcb\xc8\xfc\xaa\x63\x87\xa0\xe0\xdb\x3f\x9c\x0f\xb2\x7f\x0a\x60\x00\x0d\x82\xb4\x3a\x98\xfe\xdf\x68\xba\xff\x7f\x60\x03\x08\x4e\x5c\x93\x78\xf7\xc3\x6d\xc9\x4d\xed\xeb\xab\x1c\x46\x24\xbe\xa4\x27\x1a\xfd\x70\x29\x5f\xeb\x6b\xd5\xea\xc3\x15\x06\x32\xa5\xd0\xeb\xe6\x18\x40\xa1\xe2\x1a\x40\x70\xe6\xda\x1f\x37\xea\x97\xd1\xf9\xb9\xbd\x7f\x1a\x5f\x6a\xeb\x5e\x9f\xf4\x2c\xa0\xb0\x36\x97\x6e\x22\xcf\xad\xf8\x15\xf0\x2f\x3e\x51\x8b\x12\x03\x28\xd4\x5c\x03\x08\x4e\x5d\xfb\xe9\xf1\xee\xae\x09\x85\x7a\x98\xfd\xa7\x4b\x09\x94\x37\x79\x5e\x36\x54\x8a\x9c\x8e\xe0\x1a\x91\xf9\xbc\x14\xa7\xe0\xf4\x6a\x96\x09\x03\x28\x54\x5d\x03\x08\xce\x5d\xd3\x2a\xe0\xae\x3c\x97\xfd\x84\x65\xfb\x9d\x4c\x23\x57\xd2\xf7\x42\x8a\xa4\xbc\x51\xe9\x64\x1b\xee\x6b\xa7\x0a\x4e\x28\x92\x0d\x89\x62\x00\x85\xba\x6b\x00\xc1\xc9\x6b\x21\x83\x87\x08\x37\xcf\xda\x51\x34\x7e\x92\xba\xe7\xa9\x9c\x26\xdd\xa9\xd6\x9d\x7c\x57\xfd\x4e\xdc\xd3\xac\x5c\x9e\x67\x8d\xfb\x88\x57\x55\xa8\xbc\x06\x10\x9c\xbd\x46\xa0\x37\x7b\x22\x99\xbd\x41\x93\xca\x69\x6a\xfc\x72\xba\xea\x94\x39\xad\xf3\xaf\x30\xaa\x45\xb5\xa5\xab\xf7\x0f\xbd\x59\x1a\x3a\x84\x01\x14\x6a\xaf\x01\x04\xa7\xaf\x5d\xd7\x2a\xe6\x69\x49\xab\x16\xf7\xf4\x7b\xb7\x77\x49\x45\x2a\xb4\xf7\x47\xae\x45\xd2\xd0\x0d\xa5\x31\x1b\x36\xe7\x53\x91\x64\xc4\x6f\x13\xaa\xaf\x01\x04\xe7\xaf\xc5\xb4\x34\x1b\xbd\xae\x60\x0a\x24\x7c\xef\x91\xea\x99\x17\x5c\xf7\x9a\x29\xac\x34\x14\xfa\x79\xa8\x43\x85\xbb\xcb\xee\xab\xd8\x79\x0c\xa0\x50\x7f\x0d\x20\x38\x81\x6d\xd3\x5d\xde\x4f\x34\x6f\x97\x36\x77\x88\x46\x89\x8a\xf6\x35\xe8\xa6\xd4\xb9\x78\xdc\xb6\x38\x60\x2b\xb9\xfd\x28\x77\x9d\x97\x03\x06\x50\xa8\xc0\x06\x10\x9c\xc1\xd6\xe2\x3e\xa5\xe6\xd0\xff\xc9\xfb\x3c\xf8\x10\x49\x2b\xae\x3f\xac\x17\xd0\xf1\x14\xfc\xb9\x38\xea\x92\x74\x7f\xc0\x30\xeb\xa5\x02\x06\x50\xa8\xc1\x06\x10\x9c\xc2\xd6\xc9\x1b\xb7\x45\xa3\x71\xfd\xc5\xdd\xb5\xe2\xad\xc0\x16\xba\x72\x9f\x6b\xae\x46\xf6\xb2\x21\x86\xdf\x9d\xff\xf9\x18\x49\x75\x1f\xc0\x00\x0a\x55\xd8\x00\x82\x73\xd8\x4a\x68\x45\x9a\x5f\xbf\xd6\x95\x6a\xea\xc9\x0b\x14\x2f\xab\x8c\x64\x9b\x5f\x3c\x28\xa7\x1e\x51\x36\xf4\x20\xd6\xc3\x82\x61\xdf\x11\x0c\xa0\x50\x87\x0d\x20\x38\x89\x2d\x27\xa4\xe2\xaa\xb9\x7d\xaa\xd2\x22\x6b\x91\xeb\x3a\xaf\x2d\x72\x71\xa1\xd2\xda\xac\xf8\x78\xe5\xc8\x37\xde\x45\x8a\x66\x0d\xe2\xb6\x10\x2a\xb1\x01\x04\x67\xb1\x75\x3e\xfb\x35\xed\x77\x83\xfb\xd4\x81\x94\x6d\xf3\x8f\x51\x5c\x3e\x0f\x07\xdf\x9a\x50\xbd\x50\x89\x9b\xb2\x4d\xff\x55\xd5\xa0\x71\x1c\x03\x28\xd4\x62\x03\x08\x4e\x63\x23\x7f\x11\xf5\x4c\x96\xd9\xe6\x73\x98\xac\xaa\xfa\xb3\x20\xa5\x52\x93\xcc\x32\x19\x6f\x72\xd5\x13\x49\x16\xcc\xda\x87\xf7\x6a\x00\x0c\xa0\x50\x8d\x0d\x20\x38\x8f\xcd\xc3\x41\xf2\x21\x6d\x3c\x5b\x78\x7a\xc1\x8e\xdc\x0a\x66\x3d\x3b\x1c\x5d\x95\xef\xf2\x3e\x62\x7b\xfb\xa6\xd6\x5d\x55\x6e\x76\xe2\x70\x03\xf5\xd8\x00\x82\x13\xd9\x92\x06\x5d\x4f\x6b\xcf\x96\xdf\x72\x08\xf2\x72\x35\xa6\xc9\xa8\x8a\xec\xf4\x61\x9a\x7c\x38\xcb\xe8\xf3\x79\x9a\xf2\xf8\x53\x6f\x2b\x0c\xa0\x50\x91\x0d\x20\x38\x93\x6d\xdd\xde\x85\xef\xa7\x6d\xe6\xa3\x97\x5a\xef\x25\xef\x9d\x66\x7c\xc9\xf2\xbb\xed\xd2\x89\xdd\xf2\x6b\xcd\x8c\x8e\x1a\xb6\xef\x43\x0d\x31\x80\x42\x4d\x36\x80\xe0\x54\x36\xda\xcf\xcd\xce\x27\x5f\xf4\x3c\x39\x5c\xac\x31\x94\x42\xeb\x18\xd0\x93\xd4\xb2\x2e\x1d\x5b\xdb\xaa\x1a\xcc\x3e\xd9\x53\xa8\xcc\x8e\x01\x14\xaa\xb2\x01\x04\xe7\xb2\xdd\x3e\x4c\xc7\x75\x40\xeb\x6b\x68\x18\x2b\x1a\x56\xff\xe4\xb2\xdc\x5a\x62\x54\x64\x49\xcd\x98\x75\xcd\x39\x9b\x7d\x12\x55\xd7\x4e\x62\x00\x85\xba\x6c\x00\xc1\xc9\x6c\x57\xd4\xf8\xcc\x9a\x8e\x65\x1c\xa5\x3c\x67\x6f\xfe\xf1\xa0\x9a\xec\x13\xcb\xbf\x4d\x77\x9c\x44\xe9\x73\xba\x30\xb5\x3c\xd3\x0f\x8a\x18\x40\xa1\x32\x1b\x40\x70\x36\x9b\xf6\xc8\x3b\xfd\x64\x71\x07\x7a\xea\x5b\xab\xf9\xcf\x4b\x4b\x36\x50\xae\x69\x51\x26\xcf\x57\xde\x45\x12\xcb\xac\xa1\xf3\xb6\xc4\xcb\x2c\xd4\x66\x03\x08\x4e\x67\x13\x8e\x50\xe5\xb4\x2e\x34\x78\xb2\x39\x5b\x48\x66\xf4\x96\xc3\x43\xa7\xf0\xcb\x13\xde\xbc\xc6\xd6\xfa\x87\xb7\xbc\x2b\x45\x7b\x8e\x61\x00\x85\xea\x6c\x00\xc1\xf9\x6c\xb9\x3b\xab\x89\xc0\x3e\x6d\x3a\x29\xe4\x88\x78\xe9\xb1\x30\xf7\x21\xdd\x89\x79\x19\xfa\xf8\x9d\x12\xfd\x20\xde\xa0\x93\xc7\x25\x30\x80\x42\x7d\x36\x80\xe0\x80\xb6\x3d\xce\x03\xed\xe7\x69\x27\x05\x3e\x3c\xa4\x49\x9d\xee\x92\x9b\xca\x76\x22\x9f\xc8\x67\x98\xe2\x3d\xf3\xcd\xfc\xb6\x8c\xe5\x0f\x5e\x0c\xa0\x50\xa0\x0d\x20\x38\xa1\xad\xbe\x87\x5f\x75\xa0\x9d\x8c\xfc\xd3\xda\xb9\x17\x8a\xb6\x29\x27\xf7\xd0\x67\x7e\x4e\x37\x27\xe4\x87\x5b\xed\x7b\x94\xd2\xd7\x4a\xbc\x3a\x41\x85\x36\x80\xe0\x88\xb6\xdb\x54\x7f\x34\xb3\x9e\x7a\x39\xcc\xb2\xea\xdc\x7c\xf0\xce\xfc\x5c\xeb\xa7\x3b\x75\x75\x2b\x99\xa6\xd2\xb7\x2c\x63\x2f\x6e\xc7\x6a\x60\x00\x85\x12\x6d\x00\xc1\x19\x6d\xba\x4a\x39\xca\x07\x43\xc8\xbf\xfb\xbf\xef\xe3\x4f\x9d\x9b\x8b\x00\x86\xb7\x3c\x9d\xa4\x39\xb3\x13\xee\xbf\x34\x1a\xbb\x72\x8d\xb8\x38\x42\x8d\x36\x80\xe0\x90\xb6\x17\x4e\x4d\x7b\xcb\xed\x8b\xed\x86\x23\x4f\x3e\x35\xf2\xd1\xca\x13\x94\x7a\xdb\x5c\x4d\xa7\xcc\x75\x34\xf9\xed\x82\x70\xf5\x29\x56\x0c\xa0\x50\xa4\x0d\x20\x38\xa5\xcd\xc3\x29\x5a\xf0\xcf\xa3\x99\x8b\x99\x59\xb3\x8e\x56\xef\x86\x78\x8b\xf4\x67\x12\xe9\xe2\x8f\xec\x6a\x29\x31\x16\xfc\xbb\x30\x2a\x8b\x01\x14\xaa\xb4\x01\x04\xc7\xb4\x6d\x0f\x24\x0b\x99\xbe\x6e\xd5\x95\x39\x12\xbc\xfd\x06\xbd\xdc\x4b\x5b\x6e\x94\xd0\xfd\x99\x87\x92\xde\x92\xf9\xfa\xb5\xa1\x87\xc4\x7d\x1f\x94\x69\x03\x08\xce\x69\xe3\x6e\x71\x68\x4c\xc9\xff\x72\xba\xfd\xf5\xb7\x93\xdf\x45\xad\x0c\x75\x33\x52\xe8\x93\x5e\x54\x29\x3e\xa9\x6a\x58\x8c\x77\xeb\x67\xc6\x00\x0a\x73\xda\xfe\x6f\xa0\xfb\x2f\x40\xf8\x7f\x07\x3a\x1c\xd4\x46\xe1\xfb\x37\xd0\x43\x27\xf6\xf4\xb5\xcb\xe7\xf2\x09\x7e\xac\x97\x62\x09\x69\xae\xd2\x39\xfb\xdf\xad\x1a\x39\x8c\xeb\x55\xbe\x21\x1e\xe5\x50\xa8\x0d\x20\x38\xa9\x8d\x55\xaf\x49\x65\x44\xe7\x25\xfd\x5c\x31\x97\x27\x26\x75\xc1\x26\xeb\x6a\x2c\xff\xe1\xc2\x4e\x57\xc9\x2b\x86\x3f\x5b\xb7\x8d\x88\xfb\x28\xa8\xd4\x06\x10\x1c\xd5\xa6\x9c\x7c\xf8\x84\xaf\x78\xf9\x7a\x06\xaf\xf0\x97\x65\x1d\x1b\x7d\x7f\xcf\x1d\xa9\x72\xfd\xc9\xa4\x86\x93\x9f\x17\x1f\x86\x94\x7b\x61\x00\x85\x52\x6d\x00\xc1\x59\x6d\x6b\xd4\xe7\xb8\x2b\x8e\xe9\xbc\xce\x3b\xf6\x7a\x3a\x8b\x69\xac\x47\xb9\x40\x67\x93\x5a\xfe\x56\x80\xa0\xce\x9b\xc8\x1d\x06\x7b\xe2\x32\x03\xb5\xda\x00\x82\xc3\xda\xd2\x3c\xae\xaa\x50\x7c\x91\xd9\x2d\xb8\xf1\xa9\x9f\xda\x7c\x4e\xe3\xec\xdb\xf5\xe8\x73\x96\x36\xf1\xb7\x3a\x1d\xa7\xe9\x94\x84\x3d\x30\x80\x42\xb1\x36\x80\xe0\xb4\xb6\x17\xc2\x47\x36\x10\x5b\xa5\x95\xbc\x69\xb3\xc5\xa9\xfc\xdb\xbf\x0c\xc8\xaa\xbb\x57\x26\x0e\x50\x5b\x23\x33\xa3\xc3\x82\x46\xba\x18\x40\xa1\x5a\x1b\x40\x70\x5c\x9b\x9b\xc0\xcb\x5d\x4a\x8a\xb7\xe6\xf3\xf5\xbf\x8a\xa9\xe9\x2a\x27\xe5\xa6\x32\xc8\xfc\xed\x99\x43\xd8\xca\x51\x6f\xe3\x84\x7e\x6d\x0c\xa0\x50\xae\x0d\x20\x38\xaf\xad\x74\x8c\x8b\xb0\x93\xb6\xf9\xf3\xd3\x2d\x29\xf3\xed\xb5\x3f\x8f\x4f\x70\x05\x1e\x39\x23\xcc\x30\xb2\x17\x6c\x10\x3c\x7e\xa5\x09\x63\x00\x85\x7a\x6d\x00\xc1\x81\x6d\xcd\xdf\xa6\xcc\xc2\xe8\x97\x0f\xde\x3d\xc6\x20\xdf\xde\x7e\xe1\xb4\xe5\xa2\x46\xf7\x46\xfc\xae\xb0\x6a\x18\xd3\x7d\x50\x77\x50\x1f\x03\x28\x14\x6c\x03\x08\x4e\x6c\x9b\x12\xfd\xf6\x72\xf3\xb9\x1b\xb9\x9c\xf1\x41\x2f\xe1\x70\xf2\x57\xf2\xc2\xf6\xe4\xd5\x1c\x3c\xb7\xbf\x50\xe9\x39\x74\x1b\xd8\x9f\xc6\x00\x0a\x15\xdb\x00\x82\x23\xdb\xa8\xed\xea\xed\x68\xda\x5a\xba\x6e\xa7\x1c\x18\x3a\x15\x2d\xd8\xab\x39\x76\xfc\x8a\xc6\xc0\x46\xa4\x76\xdc\x05\xd3\x95\x08\x3d\xe2\x9a\x05\x25\xdb\x00\x82\x33\xdb\x2c\x9f\x3f\x72\x95\x2d\x58\x55\xa3\x8f\x30\x3e\x6d\x52\x4f\x76\xcb\xca\xd4\x8d\xfa\xf3\xf4\x8d\xdb\x21\x4d\x8a\x4e\xcc\x22\x97\x18\x30\x80\x42\xcd\x36\x80\xe0\xd0\x36\xe7\xe1\x6d\xf0\x78\xaa\x25\xef\x13\xbf\x47\x59\xfc\x24\xf5\xfb\x7b\x86\xbe\xaa\xd9\x49\xa5\xba\x91\xbc\x1f\x3d\xea\x53\x1d\x19\x31\x80\x42\xd1\x36\x80\xe0\xd4\xb6\x29\xbf\x9e\xb5\x84\xcd\x4f\x5f\xea\xaa\xaa\xc4\x67\x77\x5a\x4c\xf9\x44\xaf\x36\x84\xb6\x18\xc4\x29\xd1\x1e\x71\xde\x75\x76\x25\x7e\x66\x50\xb5\x0d\x20\x38\xb6\xed\xf0\xd9\xb1\x09\x81\xb1\xea\xd5\x20\xcd\xf7\xb2\x9e\xa8\x3b\x37\x8b\xe0\x1f\x9a\x05\xa9\x15\xdf\xc3\x2e\x1a\x1a\xfe\x3f\x16\xa9\x30\x80\x42\xd9\x36\x80\xe0\xdc\x36\xbe\xf8\x52\xbe\xc5\x81\x77\x25\xeb\x4d\x0f\x73\x3d\x4f\x53\x0d\x85\xde\x69\x75\x7e\xd2\xe7\xec\x52\x3f\x3e\xcd\xd2\x21\x17\xe1\x88\x01\x14\xea\xb6\x01\x04\x07\xb7\x25\xb2\xa8\x0e\xe6\x8a\x2e\x4f\x8d\x76\xeb\x24\x0f\xbc\xf6\x9c\x71\x4c\x90\xb4\x09\xf8\xd0\x0e\xa4\xec\x69\x52\xaa\xc0\x5d\x17\x0c\xa0\x50\xb8\x0d\x20\x38\xb9\xcd\xf4\x91\xa0\xe9\x59\xf9\xa7\xa1\x7a\x02\x72\xa1\x1c\x4f\x69\x46\xc1\xe9\x11\xdb\x2b\xe9\x7e\x61\xec\x27\xbf\xbb\x7a\x3c\x62\xe5\xc4\x00\x0a\x95\xdb\x00\x82\xa3\xdb\x5e\xdb\x3b\x9c\x7b\xb5\x92\x60\xb9\x28\xd1\xef\x26\x5b\xe2\x72\xc6\xc7\x77\xf8\xfd\x1f\x17\x4a\x83\x55\x3d\x0b\x79\x0b\x3b\x99\x13\x18\x40\xa1\x74\x1b\x40\x70\x76\xdb\xc4\x8d\xdf\x85\x5d\x7e\x62\x6f\xd6\x35\x02\x15\xb7\x24\xf9\x10\x75\x85\xbd\x15\x92\xc5\x52\x47\x1a\xe2\x2e\x33\x3f\xe5\xd5\x24\x4e\xd4\x50\xbb\x0d\x20\x38\xbc\xcd\xab\xeb\xb3\xca\x46\x43\x19\x8b\x5a\xb2\xaa\x1b\x3f\x57\x01\x03\xfa\xb8\x5e\x6f\xd4\xc4\x4c\xd3\xda\xa5\x6e\xd6\xfc\xce\x31\xe2\x2e\x04\x8a\xb7\x01\x04\xa7\xb7\xd1\x45\xec\x4a\x7d\x3d\xf8\xfd\x52\x67\x79\x3e\x97\xf9\xe0\xbe\x63\x0c\xf9\x5a\x81\x3f\x4f\x2f\x04\xe6\xd5\x6a\x3f\xac\xbc\xc7\x27\x87\x01\x14\xaa\xb7\x01\x04\xc7\xb7\x69\x9c\x7f\x6a\x51\x33\xbe\xfc\x20\xfb\xfe\xcc\xbf\x6f\xd9\x2f\xdf\x2e\x6f\xb7\x7d\xe7\x94\x8f\x99\x7a\x58\x18\x27\x33\xe9\xc5\xe8\x86\x01\x14\xca\xb7\x01\x04\xe7\xb7\x1d\x4f\x8c\xb9\xb8\x8f\x4b\x67\x6e\xe7\x06\xb9\x4a\xe6\x95\x1b\x8d\xdd\x49\x0f\xf9\x4d\x35\x18\x74\x15\x6e\x9e\x76\x8f\x18\x05\xc4\xfd\x11\xd4\x6f\x03\x08\x0e\x70\x93\xba\xf9\x60\xfe\x61\xcc\x24\x79\xdc\x74\x4d\xac\x8e\x70\x3d\x87\xdd\x03\xca\x63\x64\xdf\xf9\x09\x04\x0e\x29\x65\x6a\xd3\x65\xe2\x19\x00\x05\xdc\x00\x82\x13\xdc\x1a\x39\x4f\xfd\x38\xf5\x79\xff\x63\x8a\x17\xc6\xa1\xf5\xeb\xe9\x9e\xea\x4d\x4d\x47\x2b\x06\x9a\x09\x77\x62\xd5\x65\x98\xde\xda\x9c\xc5\x00\x0a\x15\xdc\x00\x82\x23\xdc\xae\x34\xf4\x56\xad\x8d\x89\x7e\xfd\xee\x76\x2c\x30\x51\xe9\x5f\xf2\x2b\x86\x2e\x7e\xa7\x0f\x37\xec\xb6\x56\x47\x9e\x6c\x56\xa4\x12\xcf\x00\x28\xe1\x06\x10\x9c\xe1\x26\x57\xef\x7a\xa8\x34\x8e\x59\xb3\xda\x75\x8d\x27\xe1\xb5\xed\x42\xe0\xd6\x8d\xf6\x4f\x2c\x0d\x65\xd3\x57\x99\x8a\xdb\x6f\xf7\x13\xa7\x43\xa8\xe1\x06\x10\x1c\xe2\x66\xb1\xa2\xcd\x7a\x6f\x51\xff\xa2\xe9\xbf\x0e\x84\x99\xfc\x4f\x10\xd3\x0b\x27\xef\xfc\x83\xe5\xd2\x72\x7a\xeb\x5a\x9c\x3a\xfc\xaa\x18\x40\xa1\x88\x1b\x40\x70\x8a\xdb\x81\x62\xc7\x0a\x0a\xd1\x17\x89\xbf\xaf\x94\xe7\x26\xf9\x2a\xf9\x7e\x26\x14\xd9\x1e\x77\x8c\xd9\x8c\x8a\x65\x3e\xd6\x6b\xed\xc3\x81\x01\x14\xaa\xb8\x01\x04\xc7\xb8\x25\x31\x5d\x57\xe9\x92\x88\x0b\x47\xef\xf2\x31\xb7\x75\x8d\x35\x33\x5f\x6f\x9d\x50\x2e\x4a\x14\x28\xa7\xf6\x2d\xaa\xb6\xd2\x20\x6e\x69\xa0\x8c\x1b\x40\x70\x8e\x1b\x1d\x1f\x47\xce\x43\xdb\x7a\xb5\x63\x4e\xd4\x97\x32\xd4\x9e\x69\xd6\xb5\x6c\xb2\x69\xb9\x1c\x92\x64\x4e\x9b\xc8\x9e\xec\x1d\x61\xc1\x00\x0a\x73\xdc\xfe\x6f\xa0\xfb\xaf\x3f\xf3\xf0\xbf\x03\x1d\x0e\x72\xe3\x56\x5a\x33\x13\x3b\xb5\x35\x3b\x13\x90\x45\x35\x6c\x62\xb2\xa8\x00\x02\x3d\xf6\xd1\xf1\x72\xba\x59\xbb\x61\xcf\xa4\x55\x89\x5b\x3d\x28\xe4\x06\x10\x9c\xe4\xa6\xb9\x1a\x18\x48\x78\xa9\x64\xcd\x5d\x7e\x67\x44\x48\x4b\x8b\x29\xb3\x40\x4b\xda\x29\x7d\xb1\x80\x76\x35\xcb\x27\xe2\xcb\xea\x1e\x0c\xa0\x50\xc9\x0d\x20\x38\xca\x6d\x8f\x56\x68\xe0\x4f\x74\x4e\x5d\x52\xa6\xaf\xd2\xd9\x27\xcb\xb8\xa5\x42\xd2\xc7\x0f\x7d\xf0\xb6\xc6\x28\x62\x5f\x6b\x5b\x86\x14\x06\x50\x28\xe5\x06\x10\x9c\xe5\xa6\xcc\x5d\x48\x99\xa2\x24\xb8\x9e\x65\xfb\x6b\xff\x22\x53\x06\xd9\x0a\xcb\xc5\xec\x77\x2d\x37\xb8\x13\x16\x7c\xef\xd2\x16\x30\x5b\x63\x00\x85\x5a\x6e\x00\xc1\x61\x6e\x09\x8a\x97\xd5\xcc\x53\x65\xa8\x91\xb9\xcc\xa8\xb5\x35\xfe\x9a\xab\xf3\x29\x1d\x27\xe5\x8a\x6a\x56\xf5\xf5\x7f\xe9\x10\x6e\xee\xc7\x00\x0a\xc5\xdc\x00\x82\xd3\xdc\x2a\xbf\xbb\x71\x33\x8c\xd3\x05\x15\xf5\x8a\xc6\xfd\x54\x8c\x09\x16\x7b\xdf\x2c\xa1\xad\x4a\xb3\xce\xa1\x10\x29\x53\x5c\x35\xcf\x84\x01\x14\xaa\xb9\x01\x04\xc7\xb9\x2d\x25\xc7\x05\x74\x6e\x34\xf6\x29\x36\xd4\xa7\xdf\x0a\x57\xf0\x2c\x89\x8c\x5c\xdf\xf0\x89\x4f\x79\xfc\xc1\xcd\xe7\x8a\xca\x7d\x35\x0c\xa0\x50\xce\x0d\x20\x38\xcf\x8d\x35\x3e\x3b\xb3\x67\x40\xf1\xa4\xd1\x46\x79\xd5\xcf\x5b\x32\x26\x32\x33\x07\x22\xe5\x4a\x14\x59\xec\xa5\x07\xbf\x79\x1c\xe8\x71\xc7\x00\x0a\xf5\xdc\x00\x82\x03\xdd\x34\xba\x2e\x68\xb2\xbb\x9d\xa3\x1a\xd2\x14\xa2\xbc\x7f\xa9\x22\x94\xe1\xf8\xce\xc4\x4d\x87\x26\xba\xfa\xf2\xf5\x17\xdd\xce\xf4\xc4\xb7\x09\x05\xdd\x00\x82\x13\xdd\x16\x06\xf6\xb3\x87\x86\x7f\x7b\x34\x12\xb9\x7f\xe1\xa0\x8a\x91\xfa\xaf\xc8\xf1\xbc\x93\x4d\x85\x46\x1e\x49\x49\xe1\x64\xbc\x63\x06\x18\x40\xa1\xa2\x1b\x40\x70\xa4\xdb\xdf\xd8\x76\x77\xa5\x1f\x5f\x5f\x99\xf9\x3c\x5e\x76\x5e\x1f\x8a\x9f\xf2\x2c\x2b\xf0\x1b\x12\x39\x5a\x73\x51\xa0\xee\xe3\xdc\xe0\x71\x0c\xa0\x50\xd2\x0d\x20\x38\xd3\x8d\xa2\x8f\x66\x3a\xb6\xc7\xd9\x2e\x8d\xb6\xe0\xf9\xa1\x7b\x6f\x93\x59\xa3\x8e\x90\x57\x29\xf7\xdb\x32\x5b\x07\xec\xa2\x8a\x03\x17\x31\x80\x42\x4d\x37\x80\xe0\x50\x37\x39\xf6\x6b\x96\xeb\xc6\xe7\xf9\x97\xce\xf8\x05\x83\xb7\x4a\x86\x64\x62\x7e\x6f\x98\x9f\xf0\x33\x49\xa9\x04\xf8\x78\x62\xe2\xca\x18\x40\xa1\xa8\x1b\x40\x70\xaa\x5b\x7c\x55\x9b\xe6\x16\xdb\xc6\x2f\xda\x85\xf9\xf3\x37\x7f\x9d\x52\x3f\xfc\xae\xc1\x36\xbc\xdb\xe0\xa0\xe8\x1e\x2b\xc7\x0b\x47\x99\xb4\x30\x80\x42\x55\x37\x80\xe0\x58\x37\x2b\xf5\x6a\x9d\xa5\x20\xd5\xf8\xbd\x49\x02\x37\xee\x14\x0d\x7a\x49\xa9\x6e\x2f\xeb\x5d\x64\xb8\x9d\xa2\x97\x9a\x50\x25\xeb\x2e\x88\x01\x14\xca\xba\x01\x04\xe7\xba\xe5\xcf\x45\xe4\x9f\xa1\xa8\x9b\x57\xfb\xad\x14\x91\x18\x24\xfd\xde\x7b\x80\x32\xcb\x21\x8a\xaf\x83\x49\x8d\xf2\x51\x78\xb6\x2d\xf1\x6d\x42\x5d\x37\x80\xe0\x60\x37\xa7\xd6\xe7\x64\xb4\x5b\x97\xce\x26\x0b\x99\xd6\x85\x8d\x36\x06\xf0\x97\xcf\x9f\xbd\x7a\x24\x66\xd3\xa6\x6e\xe5\x19\xa1\x40\x8c\x38\x51\x43\x61\x37\x80\xe0\x64\xb7\xbc\x37\xbf\xa9\x7c\x27\x73\x6a\x25\x04\x97\xb7\x5a\x6f\x53\xa7\xb9\x96\xb8\x08\xd5\xed\x4b\xd3\x4d\xb2\x3e\x7e\x4d\x64\x8f\x2d\xf1\x74\x82\xca\x6e\x00\xc1\xd1\x6e\xb9\x5f\xa5\x36\xa4\xce\xf2\x84\x3f\xa1\xce\xcd\x7e\x67\xc3\xfd\x46\xc0\x47\x6f\xba\x30\x32\xbb\x9a\xe1\x0c\x9b\x43\xe2\xfe\x71\xe2\x0c\x06\xa5\xdd\x00\x82\xb3\xdd\x26\xfc\x8b\xc9\x8f\x62\x73\x9f\x5e\xba\xb5\x88\xf9\xfc\x3a\x4e\x7e\x6f\x32\xeb\x01\xd7\x62\x9f\x4c\x82\x9b\xbb\x52\x93\xc9\x31\x05\x0c\xa0\x50\xdb\x0d\x20\x38\xdc\x8d\xd9\xce\xfa\xf2\xe9\xe1\x32\x95\xe6\x76\xdd\xcf\x17\x29\x79\x6e\x5b\x8b\xda\x9d\xf0\x4e\xb1\x05\x8b\x45\x1d\x1c\x9b\x59\xb7\xd5\x31\x80\x42\x71\x37\x80\xe0\x74\x37\x3e\xaf\x74\xe3\xaa\xc1\x78\x17\xe3\x03\x32\x99\xa9\x4a\xa9\xdc\xb6\x61\x73\xfb\xf8\x68\x45\x2d\x1e\x93\x25\xca\x6e\xb3\xd4\xf9\x60\x00\x85\xea\x6e\x00\xc1\xf1\x6e\x69\xa3\x62\x31\xdb\x1f\xb2\x62\x84\x3f\x99\x9e\x96\x34\xdb\x7f\xfb\xb2\x01\xbd\x1a\x7b\xa1\x7f\xe6\x36\x2b\x6b\x4c\xb6\xe6\x06\x0f\x06\x50\x28\xef\x06\x10\x9c\xef\x76\xee\xf9\x80\xe5\xfa\x95\xfb\x1a\x01\x67\x8d\xed\xf3\x73\xaf\xc8\x71\xbd\x51\x1a\x7c\x3f\xba\x2c\x9f\x2c\x62\x76\x87\xb2\x20\x85\x1e\x03\x28\xd4\x77\x03\x08\x0e\x78\x63\x4d\xac\xa5\x74\x4d\x2e\xfb\x86\xdd\x1c\x69\x8b\x66\x8a\xfc\xbd\x91\x69\x49\x26\xb1\x68\x3a\x19\x4e\xa5\x6f\xfe\xdb\xbf\xff\x14\x06\x50\x28\xf0\x06\x10\x9c\xf0\x56\x72\xe8\xd1\xd5\xeb\x0d\x6c\x12\x01\xff\x22\xe8\x26\x79\x17\x5c\xee\x0f\xbf\xd7\x62\x0c\x67\xe9\x39\xcd\x57\xd5\x6c\xe5\x68\x4e\xdc\xd4\x43\x85\x37\x80\xe0\x88\xb7\xb4\x87\x15\x2a\xbe\x2b\x7a\x29\x1b\x7b\xad\xe2\xa3\x7a\xd8\x51\xdf\xba\x89\xf3\x81\x2b\x7c\xac\xf3\xdf\x96\x1d\xd8\xb3\x9a\x89\x73\x2b\x94\x78\x03\x08\xce\x78\xe3\xee\x39\xeb\xa5\x23\x17\x9e\x93\x27\x92\x5a\x51\x7d\x65\x20\x57\xa0\x69\xd7\xc8\xe8\xa2\x95\x0f\x7d\x82\xa0\x7e\xe0\xe2\x31\x66\x0c\xa0\x50\xe3\x0d\x20\x38\xe4\xed\x46\x69\x15\x7b\xa7\xbf\xc2\x39\x0a\x91\xd1\x17\xc5\xab\x8e\xae\x5f\xd9\x27\xbe\x1f\x14\x95\xd4\xf6\xbb\xfa\x3d\x5f\xee\x99\x33\x71\xe3\x00\x45\xde\x00\x82\x53\xde\x92\x2e\x85\xe9\xfd\x8b\x12\x78\xeb\x4b\xb6\x99\x13\x90\xc1\x2a\xc1\xa4\xb5\x27\xa5\x62\xaa\x3e\xa0\xec\x5d\x63\xa9\xda\xd2\x2c\x71\x3a\x84\x2a\x6f\x00\xc1\x31\x6f\x57\xc1\xf3\xfb\xfa\x80\x52\x8b\xeb\xea\x6e\xff\xeb\x2a\x26\x9b\xa8\x11\xd1\xb9\xbe\x9d\x8b\xba\x8f\x03\xef\x4a\x91\x89\xcf\x13\x4f\x74\x28\xf3\x06\x10\x9c\xf3\x66\x33\x30\x2b\xf2\x29\x2d\xcb\x8f\x4d\x49\x72\x1f\x1b\x9f\xe3\xf3\xcb\x46\x20\xd1\x48\x6c\xb0\x6b\x33\x58\xc4\xb6\xcd\xe0\x32\xf1\x52\x07\x73\xde\xfe\x6f\xa0\xfb\xaf\x3f\xc6\xf5\xbf\x03\x1d\x0e\x7a\xa3\x56\x0b\x41\x04\x8c\xed\x93\xcf\x98\x96\xf5\xd6\x2e\x1e\x7e\xfc\xad\xce\xdd\x32\x68\x2c\xf8\x5e\x06\xcd\x9d\xee\xee\x71\x66\xe2\xd2\x0c\x85\xde\x00\x82\x93\xde\x4e\xab\xee\xfd\x33\x2f\x4b\x29\x1f\x70\x45\xb8\x8c\x70\xf6\xfc\x4f\x23\x1a\x25\x51\x16\x6f\xdf\xdc\x6b\x65\xac\x57\xd2\x5f\xc4\x8a\x61\x00\x85\x4a\x6f\x00\xc1\x51\x6f\x51\x4a\x6f\x7d\x36\x0b\x40\x37\xbb\x59\x4f\xb0\xaf\xb1\x41\xdd\xd3\x30\x51\xc5\xce\x3e\x0f\xdf\xb3\xe6\x5d\x2d\x91\x1e\x22\xe4\x18\x40\xa1\xd4\x1b\x40\x70\xd6\x9b\xe6\xe7\x1c\xf3\x2f\x0c\x59\x35\x85\xa9\x5e\x1b\xc2\x6a\xb7\xcd\x04\x28\x2f\xde\x2f\x74\xe0\x62\x7a\xb4\xa2\x70\xc1\x42\xf3\xa7\x05\x06\x50\xa8\xf5\x06\x10\x1c\xf6\xd6\x95\xae\xe4\x23\x3e\x93\xb2\x37\x2a\xee\xc1\x61\x57\x15\x59\xb7\x97\xbc\x8b\x77\x6c\xef\x48\xdb\xe8\x95\xed\x53\xf8\xc5\x14\x40\x5c\x66\xa0\xd8\x1b\x40\x70\xda\x1b\xc7\x9d\x2f\x41\x93\xfd\x2d\x8e\xbb\x1b\xe4\x6b\x6f\xef\x0f\x52\x90\x4b\xb6\x88\x64\x3d\x6d\xf4\xf6\xa0\xf0\x28\x26\xec\x2f\xb4\xc3\x00\x0a\xd5\xde\x00\x82\xe3\xde\x7e\x15\x7c\xec\x9c\x99\xb9\x34\x48\xd8\x77\x73\xb8\xf1\x7d\x49\xdf\xb5\xa0\x83\x8e\x07\xa6\x9b\xee\x28\x78\xe9\x59\xed\x5c\x4b\x23\xee\x68\xa1\xdc\x1b\x40\x70\xde\x5b\x51\x5b\x0e\x99\xf1\x3a\xf3\x21\xd1\xd9\xfd\xfb\x31\xef\x3d\x46\x2d\x61\xa2\xcd\x7f\x78\xf9\xf9\x02\x2c\xae\xec\x79\xaa\xc7\xe4\x88\x01\x14\xea\xbd\x01\x04\x07\xbe\xa9\x9a\x15\xa8\xa8\x17\xef\x13\x78\x92\x7e\x5a\xcc\xf0\x81\xe1\x6b\x39\xdd\x27\xc7\x2e\x5d\x3c\x90\x7a\xf0\xa9\x4d\x14\xf9\x39\x75\x51\x0c\xa0\x50\xf0\x0d\x20\x38\xf1\xed\x6b\x71\x23\xeb\xaa\xf6\xc1\x30\xf9\x0b\x67\x4d\x3e\x93\x7d\x1a\x11\xfa\x49\x59\xf2\x85\xd1\xc1\x9f\x9f\x76\xdc\xfe\x94\x7d\x01\x71\x77\x06\x15\xdf\x00\x82\x23\xdf\x74\x5f\x4b\x3e\x4b\xe0\x64\x19\x5c\xfc\x75\x19\x33\x3a\x7a\xe4\x6d\x0a\xc7\x07\x15\x8a\x21\x5b\x55\x3f\xf5\xf9\x90\x1b\x07\x0f\x10\x47\x00\x28\xf9\x06\x10\x9c\xf9\x66\x71\xdd\xa4\xf1\x79\x61\x5a\xf9\xc6\x36\xff\x0c\xc7\x6e\x56\x67\xd3\x29\x0a\x91\x19\x1f\x9e\xa6\xfa\x6f\x6f\x17\x2c\x3c\x57\x28\x30\x80\x42\xcd\x37\x80\xe0\xd0\x37\x2f\xad\xe1\x57\xab\x57\xcf\xb0\x68\x78\xb8\x8c\x82\xeb\xd2\x87\xf6\xdc\x0b\x77\x7b\x5d\x6c\xd2\xca\x37\xc8\xd7\xcf\x6c\xf8\x80\x0c\x03\x28\x14\x7d\x03\x08\x4e\x7d\x4b\xe1\x6a\xad\x0b\xba\x10\x1c\x61\x65\xc8\xe6\x1a\x15\xba\xff\x6f\x8c\x84\xe6\x36\xad\xd7\x59\xe9\x1a\x91\x6a\xb3\x8b\xa5\x52\xc2\x18\x40\xa1\xea\x1b\x40\x70\xec\xdb\x30\x59\xb9\xcf\x83\xfa\x17\x4f\x1b\x38\xb3\x6a\x47\x53\xfe\x36\x9e\xc9\xdd\xf7\xb3\xc6\xb4\x84\x91\xce\xed\x82\xc2\x37\x1e\x26\xe2\x2b\x83\xb2\x6f\x00\xc1\xb9\x6f\x13\x86\x7e\xe7\x6d\xf6\x6a\xbb\xf0\xed\x4b\x9a\xf0\x13\x62\xdb\x56\xa6\x62\x17\x8a\x57\xba\x4d\xfd\x54\x2b\x4c\xb4\xa8\xb6\xf4\x20\x06\x50\xa8\xfb\x06\x10\x1c\xfc\xc6\x66\x14\x30\x2a\x5d\xdd\xa5\x33\x18\x84\xe9\x3d\x1e\x1d\xce\xdf\x31\xe7\x90\x2a\x8c\x92\x7f\x51\x4c\x3d\xbd\x16\x10\xd2\x41\x5c\xcf\xa0\xf0\x1b\x40\x70\xf2\xdb\x23\xf0\x58\xd2\xd3\xc1\x2e\xc3\xae\x77\xa2\x24\x71\x69\xab\xd5\x71\xad\xd2\x64\x0f\x95\x54\xfb\xf7\x03\xa5\xaf\x64\x84\xee\x11\xcf\x00\xa8\xfc\x06\x10\x1c\xfd\x76\x89\xb1\xe2\x8b\x58\x49\xe5\xc3\x8d\xdf\x13\xc1\x56\x52\xae\xa2\x52\x6f\x17\xa3\xd3\x78\xba\x3e\x8e\x5f\xaf\xbb\x1f\x71\x8a\x8f\xb8\xce\x43\xe9\x37\x80\xe0\xec\x37\x42\xc4\xdd\xcd\x07\xf3\x7b\xf8\xbe\x4b\x09\xd2\x2b\x0b\x4d\x55\x2c\xa7\x9a\x8b\x6e\x18\x48\x5b\x6a\x6a\xd8\x3c\x89\x0d\xba\x79\x01\x03\x28\xd4\x7e\x03\x08\x0e\x7f\x5b\x75\xec\xe2\x7d\x35\xe0\xb0\xde\xf5\xd2\x59\x67\x9d\x47\x95\x9c\x3e\x72\x6f\xfc\x81\xba\x03\x37\xc7\xe4\xbe\x73\x67\xd7\xf0\x10\x27\x6a\x28\xfe\x06\x10\x9c\xfe\xb6\x1a\xd3\x6d\xf2\x7d\x3c\x49\x9c\x7d\xc5\xad\x42\x4c\x50\x67\x7b\xf2\x94\x7d\xac\xf8\xa6\xc4\x8d\x3d\x6c\x7d\x2a\x47\x73\x29\x8c\x31\x80\x42\xf5\x37\x80\xe0\xf8\xb7\x44\x83\x85\xb6\xc6\xdb\x95\x25\x4f\x79\x18\x09\x02\xc3\xc6\xe5\x07\x1f\x8a\x9c\x88\xe3\x94\xfc\x56\xfd\x51\x3d\xb8\x49\x90\x8f\xb8\xa7\x84\xf2\x6f\x00\xc1\xf9\x6f\x84\x7c\xd3\xe1\xd1\xc2\x4a\xfe\x07\x64\xce\xa9\xca\x64\xac\x4c\x75\x2d\xb2\x2f\xaa\x7e\xac\x9e\x3c\x76\x77\xf1\x50\xfb\xbc\x0f\x71\x04\x80\xfa\x6f\x00\xc1\x01\x70\xdd\xe5\xaf\xd8\x8e\x94\x5f\xda\xbe\xfe\x97\xd3\xfa\xd4\x2c\x9b\x7b\xbe\x64\xfe\x01\x91\xac\xa1\x2f\xab\xde\x6f\x7d\x44\x2d\xb4\x1c\x30\x80\x42\x01\x38\x80\xe0\x04\x38\xf5\x68\xd6\xb3\x0c\x01\x64\x65\x06\xbf\x23\x55\x5d\x66\xac\x8e\xf0\x53\xb5\x70\x86\x69\xae\x57\xea\xeb\x36\xb6\xf6\x3d\xac\xe5\xc6\x00\x0a\x15\xe0\x00\x82\x23\xe0\xac\x5a\x2b\x3d\x55\xfe\x26\x70\x4a\x72\x8b\x79\x48\x9a\x9c\xb1\x37\x4b\xb8\x73\x66\xde\xa6\x9e\x97\x70\x5d\xcb\xc5\x9b\xcd\x8c\xf8\x99\x41\x09\x38\x80\x04\xe0\xef\x9e\xfb\x4a\xe4\xa4\x30\xed\xcd\x55\x33\xfa\x2b\x13\x5b\x2e\x7a\xf5\x46\x65\xf8\xe1\x85\x09\x79\xc2\xea\xfc\xed\xde\x53\x26\x7c\x18\x40\xa1\x06\x1c\x40\x70\x08\x1c\x85\xf0\x9b\x86\x7b\x4d\xfb\x8d\x8a\x8b\x79\xc2\x23\x35\x0d\x2d\x7a\xdf\x1a\xfc\x7c\x96\xe3\xb4\xe2\x7d\x32\xd4\xc8\x0c\xdd\xf4\xc2\x00\x0a\x45\xe0\x00\x82\x53\xe0\x5c\x2e\x2a\xa6\x7c\x66\xcd\xb0\xb1\x12\xc8\x10\x79\xa5\x95\xad\x13\x21\x4f\x4e\x18\x5b\x40\xf4\x76\xf7\xb4\xa7\xb0\xfe\xe5\xf4\xc6\x00\x0a\x55\xe0\x00\x82\x63\xe0\x4e\xf2\x5c\xdd\x38\xc5\xe0\x55\x1d\x35\xd0\xf5\x97\xe3\x57\x45\xa4\x79\x7e\x6c\x30\x4d\x60\x17\xab\x82\x4a\xcb\x3e\xc7\xd6\xf6\x93\x18\x40\xa1\x0c\x1c\x40\x70\x0e\xdc\x78\x9f\x54\xcc\xe1\x08\xd5\x71\x4b\xb9\xc2\x35\xe1\xbd\x14\x54\x34\xcb\x6d\x1c\x47\xad\x22\x23\xc7\xa9\x8f\x95\xbb\x0e\xb8\x12\x4f\x74\x98\x03\xf7\x7f\x03\xdd\x7f\xfd\xc9\xd4\xff\x1d\xe8\x70\x10\x9c\xcf\x13\x23\xc9\x7c\xaa\x5f\xe5\x1a\x7e\xfb\x33\x05\xae\xdc\x7b\x1b\xa4\xf4\x5a\xdc\x71\x6d\x72\x98\xc3\x9d\x9e\xe3\xd3\xf1\x52\x2b\x0c\x10\xa0\x10\x1c\x40\x70\x12\x5c\x2f\x5a\x73\xc7\x80\x4b\x5f\x49\xd4\x6f\x8e\xe3\xda\xfc\x55\x0b\x7b\x86\xd7\xf1\xc9\xe6\x83\x8e\xdd\x42\x3d\xf7\xd6\x0a\xa4\xd4\x31\x40\x80\x4a\x70\x00\xc1\x51\x70\x8c\x4a\xb9\x1a\xcf\xd6\xbb\x95\x2c\x6c\x6d\x64\x8e\x7a\xce\x9f\x39\x1f\x17\x40\xa8\xbe\xa4\x9d\xc2\xfb\x8f\x81\xcb\xc7\x26\x9c\x16\x03\x04\x28\x05\x07\x10\x9c\x05\x57\x7c\xc7\x77\x54\x81\xb1\x5d\x36\x87\x91\x4d\x3b\x60\xd5\xd0\x73\x30\x35\xd2\x48\x9b\xb1\xcb\x73\xdb\xd6\xf3\x2b\x55\x09\xc2\x81\x01\x02\xd4\x82\x03\x08\x0e\x83\x13\x3d\xed\x7d\xe8\x71\x8d\x8b\xaa\xef\xb5\xb2\xa0\x80\xdc\xe4\x83\x22\x0f\xbb\x1e\x9c\x1c\xd9\x9c\x1e\x36\xbf\xfb\xec\xef\x95\x45\xe2\xdb\x84\x62\x70\x00\xc1\x69\x70\x71\x4c\x18\xfb\xd3\x3a\xfd\x6f\x22\x3f\xf9\x47\x4a\x3b\x7e\xea\xff\x92\x24\x6b\x76\xa1\x58\xde\x48\xa5\x7a\xf3\xe6\xb5\x70\xe1\x59\x0c\x10\xa0\x1a\x1c\x40\x70\x1c\x9c\x74\xcd\x99\x7e\x65\xb3\x57\xc5\x83\xe9\xac\x7d\xfb\xcb\x75\x4d\x72\xcf\xac\xc9\x1b\x47\xbc\xb6\xeb\x12\x39\x25\x56\x13\x4c\x9c\xa8\x09\x50\x0e\x0e\x20\x38\x0f\x2e\x9f\xa9\x41\x54\xf9\xd2\x7b\x6f\xeb\x10\x51\xe3\x13\xa6\x57\x0e\xce\x39\xb8\x96\xdf\xa8\xb0\x1b\x34\xfc\x61\x5a\x32\xf0\x2f\xe2\x14\x06\x08\x50\x0f\x0e\x20\x38\x10\xae\x5f\x80\xda\x18\x9b\x28\xaa\x60\x0d\x93\xeb\xe0\x0d\xbc\xb9\xd2\xda\xa9\x72\xbd\x9b\x42\xad\xf3\x65\x59\xe3\xe4\x9a\x56\x9c\x03\x06\x08\x50\x10\x0e\x20\x38\x11\x6e\x8e\x2f\x48\x22\x70\x99\x99\x82\xaa\x2b\x72\xa2\xdb\x80\xf5\xe1\xde\x35\x6c\x55\xec\x95\xad\xf1\xd7\xa8\x67\xa5\xdb\x21\x62\xce\x18\x20\x40\x45\x38\x80\xe0\x48\xb8\x47\x6c\x67\xbf\x5c\xd9\x8d\xbd\xd7\x63\x6e\x7d\x65\x15\x95\xd1\x74\xea\x78\x5a\x62\xda\x68\xf5\xc4\xdf\x24\xf2\x82\xf2\x59\x4a\x0a\x0c\x10\xa0\x24\x1c\x40\x70\x26\xdc\x44\x36\x9a\xe6\xab\xf4\xb5\xa3\x93\xa1\xfc\x44\x5b\x95\x51\x96\xff\xd3\x1c\x91\x22\xdd\x48\xd6\x69\xce\xa8\xfc\x0f\x97\xa6\xa8\x31\x40\x80\x9a\x70\x00\xc1\xa1\x70\x9a\xdb\xa1\x27\xc2\xa6\xf3\x97\x9e\x39\x70\x21\xef\xd7\x64\xd3\xb3\xe7\xce\xcb\x84\xaa\x7f\x30\x28\x65\xf6\xd7\x18\x38\x5c\x6c\x88\x01\x02\x14\x85\x03\x08\x4e\x85\xab\x88\x8b\x77\x9b\xdc\x19\xac\xfa\x7c\x9a\xb5\x76\xbb\x4b\xb8\x23\xfb\x4d\x74\x8f\x83\x99\x84\xae\xe0\xb1\xa1\x00\xbf\x9b\x96\x72\x18\x20\x40\x55\x38\x80\xdc\xc3\x3f\xda\xa7\xb0\xfa\x59\xd1\x55\x64\xfa\x32\x9d\x73\x30\xe7\xfa\xe3\x8e\xfa\x04\x5f\x3f\xee\x26\xdd\x3b\x5f\x13\xdf\x88\xfe\xb2\xbf\x8c\x01\x02\x94\x85\x03\x08\xce\x85\xb3\x28\x8a\x64\x75\x19\x6b\x60\xdf\x47\xab\x26\x9a\x96\x2e\xf5\xfe\x57\x46\xf3\xb1\x46\x06\xa3\xb9\xd7\xba\xc6\xe7\x1a\x7e\x1a\x78\x63\x80\x00\x75\xe1\x00\x82\x83\xe1\xf4\x4e\x68\x2e\x8f\x99\x87\x65\x94\x0b\x64\xea\x10\x6a\x83\xe4\x73\x99\x39\xa2\x9f\x27\x34\xa6\xb3\xbc\x68\x88\x9a\xbd\xed\x4f\x3c\xce\xa0\x30\x1c\x40\x70\x32\xdc\xe5\x36\xf1\x77\xf6\xcc\xe3\xfc\x72\xca\xe5\xa2\xc2\xea\x06\x45\x67\xaa\xdb\x7b\x1a\x98\x9f\x66\x9f\x1b\x3d\x0a\x5a\x0d\xd9\x44\x31\x40\x80\xca\x70\x00\xc1\xd1\x70\xaa\x87\xf2\x58\x86\x47\xa8\x42\x64\x36\x5a\x5f\x5c\xf5\xa5\xfe\xf3\xfc\xa6\x8b\x64\xd9\xcc\x61\x99\x4b\xf3\x14\x2c\xd7\xb9\xa5\xb9\x30\x40\x80\xd2\x70\x00\xc1\xd9\x70\xf2\x2c\xf7\xdc\x8f\x2c\xa4\x7c\xb6\xa5\x54\x4b\x3a\x6a\xf5\x2b\xc2\xff\xfb\xb8\x04\x4d\x62\xb6\x11\x2d\xcd\xbb\x16\x4f\xde\x1f\xfb\x30\x40\x80\xda\x70\x00\xc1\xe1\x70\x23\x1f\x12\x79\xa7\x36\x25\x7e\x08\xc4\xfd\x54\xf1\xd4\x89\xfc\x66\x13\x1f\x4e\x5f\x10\x68\xdc\xe1\x7c\x66\x6c\x89\xda\x2d\xc2\x06\x03\x04\x28\x0e\x07\x10\x9c\x0e\x67\x60\x32\x13\x43\x56\xbd\xb3\x3a\xc0\xfe\x84\xaf\x33\x49\x93\x4f\x99\xaa\x54\xb8\x2f\xba\xf2\x80\x9b\x7b\xe2\x69\xf2\x7b\xf2\xca\x18\x20\x40\x75\x38\x80\xe0\x78\xb8\xdb\x7f\x33\x6e\x0b\xd7\x33\x2b\xd7\xb2\x38\x3d\xb6\x7e\x53\xe4\x70\xc3\xc8\xa4\xfc\xa4\xd5\x95\x49\x56\x7e\x9a\x13\x2a\x27\x02\x7d\x30\x40\x80\xf2\x70\x00\xc1\xf9\x70\x2f\x1b\xd8\x74\xb4\x6f\xb8\x74\xed\x7a\xc9\x2c\x32\x9e\xb8\x9c\xc4\x16\x88\x88\x52\x86\xbe\x9e\xac\x66\x7e\x40\xe5\x7c\x8c\x4e\x08\x03\x04\xa8\x0f\x07\x10\x1c\x10\xf7\xce\xc7\x59\x95\x2b\x42\x9f\xf6\xcc\xe9\xb2\x0a\xe6\x23\x7f\xb9\x66\xe3\x37\x74\x05\x2f\x9c\x9a\xfb\x5c\xf6\x55\x66\xf0\xd2\x20\xf1\xa0\x85\x02\x71\x00\xc1\x09\x71\xc7\x77\xee\x31\xba\x4e\x24\x64\x47\x29\xe9\xb9\xf2\x0c\x2e\x7f\xce\x1e\xdf\xbd\xbb\x31\x23\xb0\xef\x31\x50\xad\xb0\x3b\x4f\x2f\x80\x01\x02\x54\x88\x03\x08\x8e\x88\x4b\x62\xbf\x9d\x1b\x7a\x61\xea\x57\x2a\x8d\xec\x90\x84\xce\xf0\x2b\x96\x07\xcf\x6b\xe3\x45\xf9\x3d\xc8\xed\x53\xa9\x0d\x0d\x78\xf5\x31\x40\x80\x12\x71\x00\xc1\x19\x71\xbe\x5d\x96\x34\xfb\xf7\x7d\x5d\xa3\xd9\x36\x46\x16\x4b\x47\xa3\x31\x65\xeb\x37\xef\xa3\x5b\xbb\x5e\x53\x88\x97\xa5\x98\xa9\x0a\x63\x80\x00\x35\xe2\x00\x82\x43\xe2\xd4\xb4\x78\x8e\xfc\xcc\xbe\xcf\x05\x3a\xa6\xbd\x9f\x36\xf9\xad\xfa\xcd\x79\x87\x79\x39\xa7\x77\x9e\x90\x76\xec\xa1\xda\xa1\xd1\xc6\x00\x01\x8a\xc4\x01\x04\xa7\xc4\x31\x33\x8f\xdd\x0c\xe4\x92\x2d\x1e\x8f\xa5\x31\xdf\x5b\xca\x9f\x93\xa7\xbc\x18\x2a\xd7\x98\xbe\xe2\xbf\x25\xc0\x4d\x08\x4f\x91\xc5\x00\x01\xaa\xc4\x01\x04\xc7\xc4\x51\xfb\x3d\x3d\x60\x1c\xf6\xd3\x7a\xaf\x31\xcb\x50\x32\x56\x25\xfd\xf1\x97\x32\x65\x21\x9d\x32\xff\x92\xa3\xf9\xb1\x0f\xde\x1f\x8e\x62\x80\x00\x65\xe2\x00\x82\x73\xe2\xfc\xb2\xb8\xb0\x16\xc1\x9c\x2b\xd5\xeb\xee\x62\xe3\x4d\x42\x9a\xfc\xd6\xac\xf5\x80\xbf\x23\x3d\x2a\x3f\xa2\xa2\x6d\x3b\x80\x38\x6b\xc0\x9c\xb8\xff\x1b\xe8\xfe\xeb\x0f\xdb\xff\xef\x40\x87\x83\xe2\xdc\x43\x32\x12\xfc\xfd\x08\xd5\x1c\x6f\x82\x8e\xf2\x7a\xd4\x1c\xeb\xad\x14\xd2\xd1\xd6\x79\xbe\xe9\xd9\x7e\xe7\xd8\xee\x57\xda\x03\x18\x20\x40\xa1\x38\x80\xe0\xa4\xb8\xec\x0f\x69\x27\x68\xdc\x78\xef\xa9\x58\x67\xf9\xa5\xde\x4d\x4b\x79\xa9\xe1\x1a\x63\xb0\x94\xdc\x2d\xb3\xca\xf2\x53\xf3\x89\x98\x04\x06\x08\x50\x29\x0e\x20\x38\x2a\x4e\xf5\x0b\x33\xcf\xf4\xbf\x2f\x11\x97\xfe\x66\x7c\xd6\xbf\xb4\xfb\x38\x67\xcb\xeb\xf5\xb7\x07\xe4\x02\x36\x3b\xc6\xcb\x9e\x8f\xda\x89\x5f\x3f\x94\x8a\x03\x08\xce\x8a\xe3\x33\x46\x9a\xc4\x33\xcd\xc6\x2e\x56\xdc\x3f\x7c\xf8\x8e\x90\x8c\xfd\x8d\xe6\x66\x76\x21\x27\x43\xdb\x1c\xab\xfd\xbf\x42\xec\x3c\x31\x40\x80\x5a\x71\x00\xc1\x61\x71\xc9\x34\x4a\xaa\x83\x5c\x05\x48\xab\x39\x99\x96\xae\xc2\x8c\xf6\xd2\xd3\x7d\x21\xed\xdf\xf3\x04\xc8\xb9\xa2\x44\x69\xe6\xde\xf3\x61\x80\x00\xc5\xe2\x00\x82\xd3\xe2\x06\x99\x7a\xcd\xd2\xe8\x9a\x39\x24\xce\x9d\x31\xe1\x60\xe5\xa2\x11\xc8\xf2\x39\xa4\x2b\xd9\xce\x20\xf8\x39\xaa\x94\x72\x9d\x42\x1c\x03\x04\xa8\x16\x07\x10\x1c\x17\x97\xdf\x1c\x5b\xe7\xfa\xfb\xb7\xe8\xa2\x8e\x32\x5d\x04\x87\xfc\x3a\xdb\x8f\xfb\x1f\xfe\x52\x5d\x29\x7c\x27\x58\xd8\xc5\x5b\xe1\x6f\x87\x01\x02\x94\x8b\x03\x08\xce\x8b\x3b\xba\xbf\x56\xf6\x2f\x5d\x75\xb2\xcd\x95\x94\x47\x7f\xbe\xcc\x6a\xaf\xf5\x98\x9d\xfc\xe2\x53\xb8\xed\x3f\x77\x38\x7a\x62\x72\x41\x0f\x03\x04\xa8\x17\x07\x10\x1c\x18\xa7\xa8\x2b\x3c\xcd\x6a\x78\xe3\x5f\x12\x76\x2f\xfe\x87\x4e\x04\xe7\xba\xc1\xab\xfc\x03\x59\x48\x50\x7b\xdd\xdf\x58\x65\x6f\x11\xe2\xa8\x09\x05\xe3\x00\x82\x13\xe3\xe4\x1f\xb8\x4e\xa8\x39\x30\x7e\xe4\xa2\xed\xa2\xda\xbb\x70\x44\xa6\x81\x73\xb9\x59\xec\x8e\x62\xb1\xbf\xb8\x3a\x93\x87\xe4\x7d\x23\x0c\x10\xa0\x62\x1c\x40\x70\x64\x5c\xff\x03\xea\x94\x6b\x07\x24\x4f\x9e\x7f\xc0\xbc\xa3\xde\x5b\xbc\x77\x43\x89\xe7\x44\x35\xa3\x64\x7e\x61\x61\x60\xa4\x4f\x9d\x94\x0b\x06\x08\x50\x32\x0e\x20\x38\x33\xce\x63\xdf\x83\xf5\x21\x42\xe0\xbd\xdf\xb7\x64\x05\xc4\x59\xeb\x14\xa5\xf5\x8a\x2f\x78\xf7\xbc\xd9\x97\x7f\x5e\xb8\x9e\xe6\xe7\x36\x15\x06\x08\x50\x33\x0e\x20\x38\x34\xae\x88\xbf\x56\xb1\x98\x2d\x34\x90\x32\xed\xec\xbe\x49\x75\x46\xcc\x5f\xe3\x07\x6d\xa2\x95\xdc\xf5\xa7\x12\x37\x4f\x5f\xb4\xa3\x32\xc7\x00\x01\x8a\xc6\x01\x04\xa7\xc6\x3d\x76\xe4\xaa\x59\x66\x08\x24\xcf\xb0\x92\x0f\x14\x41\xf2\x97\xfd\x7e\x02\xc6\x65\xff\xa0\x83\x1c\x5c\x65\x01\x83\xb7\x46\xb8\x31\x40\x80\xaa\x71\x00\xc1\xb1\x71\x0b\x15\x9a\x2f\x73\x04\x57\x9c\x4f\xdc\x5d\x4e\xa7\x6b\xc8\x65\xf9\x29\xfb\xb5\xf0\x7e\x91\xb4\x22\x8d\xe7\x79\x67\x9d\xcc\x28\xe2\x45\x03\xca\xc6\x01\x04\xe7\xc6\x51\xb4\x2d\x9a\xe8\x15\xe9\x1f\x7c\xfe\xcc\x5f\xaa\x61\x75\x57\x1c\xfd\x2d\x97\xb2\xf9\x43\x38\x75\xdc\x32\x4e\x31\x3e\x85\x87\x1d\x03\x04\xa8\x1b\x07\x10\x1c\x1c\x77\xc2\xe5\x3a\xfb\xaf\x12\xbb\x1f\xa1\xfb\xc2\x6b\xcc\xbc\x5e\x9f\x06\x7f\x94\xdf\xc5\xdd\xf1\x76\xf4\x91\x6f\x5e\x91\x18\x38\x4a\x5c\xcf\xa0\x70\x1c\x40\x70\x72\x5c\x71\xbd\x56\x9c\xcf\x2f\x1e\xc1\xc7\x14\x75\x82\xc9\x6c\x73\x82\x3d\x43\xbf\x95\x95\x2f\xd6\x0e\x74\x56\x65\xd3\x2c\xed\x6a\x88\x60\x80\x00\x95\xe3\x00\x82\xa3\xe3\x3c\x75\xd4\x4d\x5f\x33\x81\x68\x43\xda\xa2\xf0\xcb\xf4\xcf\xc0\x92\xde\xc7\x63\x52\xd9\xcc\x2c\x0c\x7c\xdd\x42\x39\x51\x55\xc4\xf5\x0c\x4a\xc7\x01\x04\x67\xc7\xa9\xc7\xd6\xf9\x4e\x86\x5c\x93\x73\x55\xb4\x6f\x74\x08\xae\x8b\x56\x3f\x9f\xae\x58\x71\x4d\x47\x24\xe0\xf2\x67\xcf\x2d\xbd\x45\xe2\x89\x0e\xb5\xe3\x00\x82\xc3\xe3\x9e\x2f\x84\x2c\x7a\xa7\x5f\x46\x9e\x4b\xd2\x2a\x84\x3d\x7f\x5c\x71\xdd\x5b\xfc\x87\x50\xa8\x50\xc7\xdb\x9c\xb1\xfa\x68\x63\x51\x27\x0c\x10\xa0\x78\x1c\x40\x70\x7a\xdc\x07\x6d\x61\x36\xfd\xe0\x18\x67\x83\x48\xfb\x5b\xd7\x5e\x25\x6a\x26\x58\x71\x47\x34\x06\x59\x9d\x1a\x4f\x75\x0f\xb7\x34\xcf\x24\x5e\xce\xa0\x7a\x1c\x40\x70\x7c\xdc\xf5\xdc\x47\x89\xdb\x15\xb3\xae\x37\x8f\xda\x58\x29\x5f\x1e\xe1\x5f\xd0\xb6\xd1\x79\xf7\xeb\xaf\x23\x4f\xc6\xdb\xb7\x0d\x8b\x56\xfc\x18\x20\x40\xf9\x38\x80\xe0\xfc\xb8\x8a\xe7\x6e\x8d\x0a\xb6\x6f\xfd\xb4\x3f\x27\x78\xae\xca\xa5\x16\x27\xe4\xb7\x3c\xaa\x2e\x02\x6d\xc2\xbc\xa1\x0c\xbd\xa3\x9e\x27\x31\x40\x80\xfa\x71\x00\xc1\x01\x72\xb5\x11\x66\x41\x2a\xbb\x4f\x7e\x37\x54\xd5\xc4\x2f\x35\x1d\xda\xe3\xcc\x3e\xc6\x3c\xb9\xe7\xbb\xb4\xdf\xe5\xc7\xd2\xa5\x21\x41\x16\x18\x20\x40\x01\x39\x80\xe0\x04\xb9\xfb\x67\xd5\x07\xdc\x17\x2d\xe7\x0e\xf1\x6d\x45\x37\x07\x09\x31\xfb\x3f\x4b\xaf\x19\x23\xab\x8e\x52\xd9\x23\xb7\xfa\x78\xa3\x4d\x1e\x03\x04\xa8\x20\x07\x10\x1c\x21\xb7\xf2\xbd\x92\xfb\x72\xe4\xd7\x96\xdc\xa7\xf2\x47\xa9\x1b\x3d\xc4\x85\xb8\xac\xa9\xdb\x94\x15\xdf\x0e\xf5\xaf\x4a\x3c\x19\xd4\x45\x31\x40\x80\x12\x72\x00\xc1\x19\x72\xf6\x7b\x6f\xd3\xd3\x9f\xa6\x0c\x6b\x7c\xd4\xf5\x88\x82\xe5\x29\xe3\xe1\xfe\xf9\x31\x2b\x01\x8f\x56\xa3\xee\xf4\x17\x7b\xc7\x17\x35\x30\x40\x80\x1a\x72\x00\xc1\x21\x72\x85\x34\xb7\xcb\x1e\xdf\x09\x21\xcb\x66\x7e\xb5\xed\x9c\x3c\xfd\x63\xff\xf3\xae\x7b\xb6\x9f\x9f\x9d\x9a\x4f\x3e\xfd\xe0\xc5\x26\x23\x3d\x06\x08\x50\x44\x0e\x20\x38\x45\x4e\xbb\xaa\xfb\xb7\x9b\xa1\xca\xbf\x3f\xb1\xf7\x63\x1f\x55\x89\x19\x23\x15\x1f\xf5\xe5\xb2\xd3\xc9\x6e\x45\x89\x53\x0e\x29\xca\x13\xf7\x47\x50\x45\x0e\x20\x38\x46\xae\xc4\x45\xfb\x4f\xe3\xaa\xc1\xf2\x7c\x12\xef\x68\x45\x21\x8d\xa5\xbc\x6a\x1a\x25\x65\xe1\xd0\xc4\xb4\x8b\x49\x29\xdf\xa7\x73\xd2\x18\x20\x40\x19\x39\x80\xe0\x1c\xb9\x98\x8f\x84\x97\x2c\x4c\x49\x5f\x2b\xd2\x18\x3f\x8d\x37\xaa\x06\xbc\x68\x8d\x52\x2d\x5b\x0c\x15\xc9\x48\xb4\xe8\xc8\x1a\x8b\x3c\x85\x01\x02\xcc\x91\xfb\xbf\x81\xae\x5c\xa8\xbe\xb5\xe6\xd2\xe0\xbb\xf9\xe8\x37\xca\x16\xe5\x32\x0f\x76\x47\x76\xf8\xa6\x8e\x7b\xca\x80\xea\xe0\x2e\x97\xdd\x90\xf4\xff\x1d\xe8\x70\x90\x5c\xdf\xe8\xf2\x43\x66\x8f\xf8\x30\xde\xe2\xbd\x45\xd1\xeb\x8b\x1e\x8f\xa5\x85\x12\x1e\x95\xea\x9d\xab\x23\xf8\x67\xb6\xbf\xfa\x71\x06\x03\x04\x28\x24\x07\x10\x9c\x24\x67\x7b\xa9\xc3\x48\x41\x31\xd8\xed\x58\x8f\xc2\x9f\xdb\x21\x0d\xa6\xe5\xa1\xca\x5c\x0d\x9a\xe7\x13\x72\x56\xa6\xee\x64\x6c\xfe\x21\xc6\xa0\x92\x1c\x40\x70\x94\x5c\x4d\x5f\xd4\xef\xd9\x93\x5b\x77\x95\x66\x7f\x53\xd2\x1f\x63\x99\x4e\xef\xea\xcc\x61\x97\x4d\x67\x0f\x6f\x77\xb7\x48\x6c\x6c\xd7\xc4\x00\x01\x4a\xc9\x01\x04\x67\xc9\x69\x2b\x1a\xa4\x3c\x94\xf4\x8a\x5c\xb8\x97\x3f\xd1\xbc\x92\xb5\x77\xe7\x6a\x20\xdb\x43\x8b\xf8\x93\xdb\x67\x2b\xaa\x5a\xaf\x1d\x07\x18\x20\x40\x2d\x39\x80\xe0\x30\xb9\x7f\x02\xcf\xb3\xbe\xe6\x29\x3b\xdf\xf2\x67\x10\x37\xcc\x16\x6b\x49\xee\xfb\x33\x96\x1f\x7b\x35\x80\xa6\xd1\x59\x51\xae\x9c\xd9\x18\x03\x04\x28\x26\x07\x10\x9c\x26\xa7\xd4\xc2\xfe\x52\x3e\x65\xff\x07\x9d\x6e\x8d\x96\x17\x9a\x07\xac\xa7\x62\xbd\xf5\x75\xfa\x3f\x07\x4a\x2a\x3c\x48\xb3\x4c\xfe\x4b\x7c\x65\x50\x4d\x0e\x20\x38\x4e\x8e\x6c\x2f\x65\xf4\x80\xd0\x12\x5d\x2b\x47\xdc\xa3\x09\x1a\xfe\x81\x82\xc8\x89\xfa\xf7\x9f\xe4\x03\xf7\x6f\x3e\xa8\x28\xe7\x34\x34\xc1\x00\x01\xca\xc9\x01\x04\xe7\xc9\xb5\xd1\x4b\x84\xaa\x0f\x34\x6a\x18\x68\xba\x96\x30\xa7\x64\xb0\x7d\x6f\x7b\xe8\x79\xd1\xfc\x21\xcf\x83\x5d\x85\x06\x9f\xb3\xe3\xc7\x31\x40\x80\x7a\x72\x00\xc1\x81\x72\x7c\xb7\xfc\x9b\x3c\x4a\x82\x04\x8c\xee\x86\x11\x9e\xc4\x8f\xba\x28\x96\x88\x1b\xfd\xe8\xe1\xbc\x75\xb2\xd0\x20\x85\xd5\x41\x85\xf8\x36\xa1\xa0\x1c\x40\x70\xa2\x9c\x0f\xbb\x94\x5f\x84\xb3\x8a\xef\x19\x0e\xbd\xf7\xce\xd6\xa7\x0e\xdb\x86\x9a\xcf\x95\x36\xe7\x18\xc5\xbf\x78\x6e\x69\xe1\xa6\x6c\x8f\x01\x02\x54\x94\x03\x08\x8e\x94\x7b\x99\x78\xe1\x7c\xaa\x52\xe9\xdd\x9c\x8c\xbe\xcb\x47\x7f\xcc\x7c\xea\x0d\x2e\x27\xfc\x3e\x11\x32\xcf\xb8\xa0\x6f\x6a\xf2\xde\xe2\x20\x06\x08\x50\x52\x0e\x20\x38\x53\xee\x86\x5f\xd1\x4d\xdf\x2e\xe1\x21\x1d\x7e\xb5\x02\x3f\x8e\x67\x71\x25\x67\x72\x5f\x76\x38\xad\xcc\x6c\x06\x7a\x1b\x72\x07\x33\x12\x5f\x19\xd4\x94\x03\x08\x0e\x95\x3b\x7a\xbf\xdf\xf9\x63\xc5\x49\x95\x38\x89\xd9\x63\x1d\x7d\x53\x7e\x5b\xb9\xeb\xce\x92\x8e\x92\x3e\x54\xda\xcc\x43\xe5\x3b\xb7\x88\xab\x29\x14\x95\x03\x08\x4e\x95\x8b\x0f\xbe\xfe\xd0\xca\xe1\xd1\x99\x4a\x43\xaf\x88\x0b\x15\xb6\x8c\xec\x8f\x7e\xcf\x3f\x33\xb8\xfc\x6e\x8a\xe7\x8c\x66\x48\xb3\x07\xf1\x72\x06\x55\xe5\x00\x82\x63\xe5\x22\xba\xf3\x3c\x68\xe9\xbe\x2a\xfd\x50\x3d\x97\x21\xf2\x49\xf5\x09\xdb\x8f\xbb\x2e\x97\xa4\xfe\x9c\x79\xc7\x32\xf8\xd0\x7f\x35\x5b\x05\x03\x04\x28\x2b\x07\x10\x9c\x2b\x77\xdb\xc5\x94\x4c\xf4\xe1\x49\xfb\xcb\xdd\x0a\x67\x0f\x24\xd6\x0e\xd5\x63\x59\x4b\xcf\x53\xd2\x5f\xec\xd0\x0a\xef\x8b\x11\x39\x6a\x80\x01\x02\xd4\x95\x03\x08\x0e\x96\xf3\x7f\x91\x62\xdf\xcc\x2f\x79\x3a\xd1\x1f\x70\x2e\x75\xb8\x5d\xf8\x96\x2a\x7b\x38\xfc\xb8\x97\xe4\xa1\x60\xef\xdf\x41\xb3\xcb\xc4\x8d\x03\x14\x96\x03\x08\x4e\x96\xfb\x34\x4b\xb7\xa6\xc7\x71\xf2\xb4\x81\x48\xf0\x85\xb2\xa5\x76\xda\xf1\x9a\xa2\x0d\x6b\x91\x24\x9e\xaa\x37\xfb\x55\xbf\xc5\xed\x3b\x87\x01\x02\x54\x96\x03\x08\x8e\x96\xb3\x15\x91\xf3\x34\x49\xd6\x10\x7d\x47\xc9\x7b\x48\x2a\xa4\xcd\x2f\xd7\xf8\xc2\xde\xdb\xc3\xe9\xad\xf5\x9e\xf9\x37\xcf\xb4\xcc\x13\xc7\x73\x28\x2d\x07\x10\x9c\x2d\xf7\x57\x49\xfd\xc7\x5d\x2a\x55\x64\xf2\xc9\xfb\xf6\x9a\xdc\xd1\x9d\x59\xcd\x99\xdd\x76\x79\xad\x9d\x49\x8f\xae\x99\x86\xfd\x81\xde\x18\x20\x40\x6d\x39\x80\xe0\x70\xb9\xbc\x64\x6a\x5f\x55\x37\xc7\x5b\x32\x27\xbc\x63\x58\xdf\x09\xd4\xa7\x88\xed\x38\xe5\x3b\x95\xb6\x32\x84\x77\x9e\xe5\x32\x46\x3d\x30\x40\x80\xe2\x72\x00\xc1\xe9\x72\xa6\xfa\xfb\x8a\x7e\xbb\xcc\x67\xfb\x0d\x0d\xfd\xfb\x10\xc0\x43\x30\x9d\x4a\xf8\xd0\x40\x19\x9c\x7e\xf4\x36\x8b\x0e\xe5\xfb\x1e\x04\x03\x04\xa8\x2e\x07\x10\x1c\x2f\x67\xcb\xb6\xc5\xa2\xb3\xf9\x41\xf2\x4d\x56\x5a\xdc\xfd\xa1\x99\x77\xf7\xdf\x1d\xfa\x73\xfd\xb1\xf8\x57\x46\xd6\x9d\x18\x71\x26\x4f\x25\x0c\x10\xa0\xbc\x1c\x40\x70\xbe\x1c\xda\xf1\x73\xb4\xff\x48\xde\x3c\xd8\xf7\xf1\x83\xb1\x28\xc7\x8d\x07\x3c\x17\x6e\xff\xa6\x28\x1b\x64\x6b\x50\xa1\x8f\xa8\xa0\x15\xc6\x00\x01\xea\xcb\x01\x04\x07\xcc\xb9\x77\xac\x2b\x1c\xbd\x15\xe5\x24\xbe\xa8\xfd\x72\xe9\xf7\x47\x0f\x27\xc1\x5b\xc7\xeb\xdd\x78\x13\xa3\x64\xf7\x5f\xe8\x5c\xbe\xc7\x8a\x01\x02\x14\x98\x03\x08\x4e\x98\x0b\x49\x2d\x1f\x7c\x6a\x44\xa8\xa6\xf5\x5d\x9f\xf4\x0d\xe4\xd2\x74\xd4\xd2\x7a\x62\xf5\xbd\xaa\xa9\x41\xd2\x2b\xfd\x59\x75\x19\x71\x1b\x08\x15\xe6\x00\x82\x23\xe6\x42\xdc\x9f\x49\xd5\xc7\xdf\xd6\xa0\xf4\x0c\x7f\x53\xef\x26\xd5\x39\x89\x3c\x1b\x7e\x32\xd5\xbb\x76\x73\x2f\x99\x52\xd7\x31\xcc\x0c\x03\x04\x28\x31\x07\x10\x9c\x31\x67\x1a\xf5\x75\xe0\x9b\xd7\x2c\xb5\x4e\x86\x7a\xf1\xd8\xfd\x5b\xc1\xfc\x96\x15\x63\xa9\x4c\x26\x1c\xa1\xd2\xd2\x2a\x33\xaa\x43\x94\x18\x20\x40\x8d\x39\x80\xe0\x90\x39\x07\xf3\x01\xc2\xcd\x5d\xdb\xaa\x63\xf9\x13\x97\xb2\xd4\xe2\x8b\xdd\xc1\x3f\x57\x0a\xa6\x93\x1f\x87\xbf\x9c\xe6\x71\xdb\x35\x21\x9e\x4e\x50\x64\x0e\x20\x38\x65\x8e\xe9\x70\xb8\x57\xf1\x0a\xbd\xb7\x59\xe2\x7c\x80\xda\x91\x20\x5f\x1f\xbd\xa7\x3d\x1a\x1c\xdc\x9c\xbf\xbf\x08\x12\x94\x9d\xf9\xaf\x60\x80\x00\x55\xe6\x00\x82\x63\xe6\xa8\xde\x2c\xdf\x7d\x83\x04\x69\xbd\x9f\x62\xb2\x52\x91\x0f\xcc\x79\xaf\x68\xcc\x50\xb4\x14\xcb\x7d\x4c\xea\xd6\xff\xc7\xdc\x5b\x46\x55\xf5\xed\x7d\xdf\x74\x23\xa0\x80\x82\xa4\x74\x77\x2a\x1d\x12\x02\xd2\x48\x97\xa0\x34\x82\xa4\x20\x9d\x12\x02\x8a\x84\x74\xa7\x74\x49\x29\x28\x21\x9d\x8a\x48\x77\xa8\x94\x48\xc8\x33\xae\x73\x9d\xbd\x6f\xce\x82\xdb\xf9\xbf\x9f\xc1\x8b\x33\x86\x2f\x3f\xe3\xb7\xf7\x5c\xfb\xe3\x9c\x73\x7d\x99\xeb\xb7\x0c\x9c\xfd\xe3\xff\xe7\xa6\xfe\xff\xda\x66\x8e\x04\x11\xd2\x67\xce\x02\xaf\x6d\x5d\xf6\x63\x49\x89\xd7\x65\x5d\x35\x2d\xf2\xf7\xaa\x0e\x59\x73\xde\xad\x64\x59\x4f\x4f\xe6\xd5\x57\xc2\xf7\x22\xcc\x7d\x49\x30\xff\x6f\x7d\xe6\xea\xf0\xff\xdd\x18\xb8\xb2\x63\x68\x32\xc3\xc3\x32\x98\xb1\xe8\xe9\x77\xce\xe2\x02\xaf\x81\x42\x5e\x8c\xa8\x3a\x85\x19\x04\x35\x19\xfe\x6c\xf4\x6d\xdf\x57\x9c\xe3\xcc\x3a\x0c\x08\xff\x4b\x93\xd8\x7b\xd9\x71\x49\xde\xbd\x1e\x16\x82\xc1\x37\xe6\x32\x26\xe0\x23\xbd\xc8\x59\x8f\x92\xb6\x52\xa0\x4a\x9c\xb8\xb4\xa5\xfd\xe1\x14\x3a\x73\xfc\xc2\x95\x62\x23\x66\x4f\x36\x08\xdd\x5f\x9a\xf8\x45\xee\x1a\x7d\x1b\x1d\xf6\x7b\xe6\x7a\x63\x99\xe8\xc6\x7b\x92\xf8\x7c\xa7\x50\x41\xd6\xde\xc9\x3c\x91\xa7\x7a\x19\xae\x1e\x22\x7d\x59\xa1\x5f\x26\xa5\xbe\x2b\xb5\xe7\xf5\x65\xbd\x41\x97\x57\x7e\x92\xf8\x58\xe9\x14\xda\xc0\x8f\x77\x39\x03\xed\x45\x29\x83\x94\x77\xa0\xf7\xee\x20\x6f\x6a\x88\x71\xad\xfc\xab\x2b\x56\x33\x08\x4f\x9d\xad\xb1\x70\x96\x4f\xa1\x11\x3c\xa6\x3c\xd8\xc7\xd5\x18\xf8\xa2\xe1\x25\x88\xc1\xcb\x4e\x58\x2e\x62\x3c\x06\xfb\x54\x3f\x3f\x68\x46\xb3\xdb\x4f\x5c\x4b\x39\x85\xfa\x55\xb1\x6f\x14\x6e\x5f\x62\x49\x67\x8a\xf9\x75\x27\x18\x07\xbf\xcd\x54\x47\xf6\xa0\x98\xa6\xc2\x86\x6d\xa9\x5d\xae\x21\x4b\xee\x14\x3a\xe6\x15\x3e\xb3\xdd\x42\x5a\x45\x5e\x6f\x3e\x3f\xb6\x49\xfb\x03\x05\x07\xf1\xcd\x4d\xa5\xea\x10\x8c\xb0\xb0\x58\xda\x1d\x74\xda\x53\xa8\x6e\x58\x6a\xe4\xdb\xa6\xfe\x44\x94\x3e\x7b\x0c\x8f\x7c\xdb\x88\x8a\x1c\x67\x07\x47\xd6\x24\xd3\x54\xe4\x50\x04\xa9\xf2\x10\xcd\x53\xe8\x5d\x0a\x3e\x5a\xa9\xf0\xb2\x17\x93\xb6\xdf\xc9\x06\x50\xf2\x13\x12\xb5\x76\x69\x23\xde\xbb\xfe\x4a\xec\x72\xb9\xbe\x8a\xc6\x8e\x77\x0a\x4d\x5a\x71\xdc\x6a\x49\xd0\x5f\x1e\x51\xe4\x60\xf7\x5b\x62\xe4\x3c\x0c\x65\x45\x4c\x99\xdd\x8a\x11\x4f\xc1\x8d\xb2\xd8\xa9\xde\x3f\x85\xde\xeb\x50\x56\x09\xd4\xbd\xad\x61\x3b\x6f\x90\x2f\x99\xef\xe2\x41\x6d\x42\x80\x89\x51\xa5\x90\xb5\x67\xca\x78\x6f\x50\xf6\xb3\xe7\x29\x74\x58\xc7\x7b\x74\x18\xb9\x90\xf3\x8a\xe4\xcb\x3a\x7a\x24\x0c\x3d\xdf\x05\xc2\xeb\x4f\x3f\x98\x23\xff\x19\x44\xd9\xc8\x60\xe5\xd6\x3a\x85\x62\xe5\xf9\x1f\x2a\x2a\xf0\xe2\x5c\xdd\x8d\x91\xfa\x44\xa9\x38\x94\xa1\x35\x30\xbc\x1f\x7a\x79\x5b\xf6\x47\x7a\x1b\xff\x63\xb1\xda\x53\x28\x9a\xd4\x74\x7e\xa2\x44\x8b\xa4\xf5\xad\xd9\xe3\x13\xe1\x44\x0e\xbf\xa0\x9f\xe9\xb8\xf8\x72\xc6\xaf\xe7\x07\x16\x8a\xd5\x13\xa6\x4e\xa1\x0c\x16\x72\xcc\x12\xc8\x43\x69\xf3\x51\x15\xc7\x1e\x31\xcf\x99\x77\xec\x6a\xef\x18\x2b\x6a\x97\xbf\xa9\xba\xa2\x73\x79\xec\x5f\xa7\x37\x61\x68\x06\x66\x4c\xf4\xf7\xd5\xf5\xcc\xd9\x4d\xf1\x52\xfe\x0c\xd1\x79\x56\x44\xfe\xde\xc8\xe5\xf9\xfd\xb5\x34\xa1\xd2\x4f\xb5\xa3\xa7\x7f\x82\x35\xb9\xb0\x8f\xc5\x19\x49\x52\x04\x89\xfa\xb4\x1f\x30\x72\xac\xa3\x63\x85\xe6\x7c\xb8\x27\x88\xbe\x97\x04\x71\x67\xe0\xbd\x2d\x3b\x85\x0a\xcf\xe5\x7e\x4b\xcc\xae\xbe\x3b\xed\xeb\xf8\x34\x54\x30\x91\x96\x3e\x8e\xc1\xcb\x21\x0c\x73\x8c\x3b\x27\x31\x50\xb2\x31\x72\xf2\x14\x8a\x74\x44\xb4\x93\x7c\x20\x43\x65\xf3\xee\x05\x55\xfc\xb7\xf0\x84\xbe\xcc\x20\x23\x8d\xb7\x7a\xd1\x2e\x8e\x0d\x6e\x84\x7b\x57\x5a\x4f\xa1\xd5\x41\x3f\x08\xbf\xbb\x8d\x79\x71\xa2\xd9\xd7\xd4\x26\x76\x2d\x0c\x2d\x05\x3c\xd6\x21\x79\x19\x7e\x54\xa9\xcd\x16\x1a\x1a\x9b\x71\x0a\xcd\xbe\xa5\x34\xf0\x7e\x6a\xfa\x33\x03\x8a\x2d\x9e\x95\x12\xbe\xd3\x34\xda\x5c\x84\xc3\xf2\x52\x4f\x02\x66\x05\x49\x73\xab\x6a\xe1\x29\x54\xc2\x2d\xfd\x51\xda\x6d\x59\xfe\x51\x0f\x8c\x2d\xc4\xaf\xb4\x89\x87\x5c\xce\x0c\x95\x39\x6d\xda\x0f\xc8\xc9\x62\xc2\x91\xed\x73\x4f\x57\x1d\x8a\xb5\x49\x7d\xe2\xd8\x24\xc0\x73\x23\x34\x24\xd1\x45\xce\x4a\xb0\x26\x14\xd7\x29\x9f\x87\xd5\xc0\x43\x99\xa8\xc1\xe8\xc6\x29\xd4\x7b\x82\xec\x49\xa0\xf2\x83\x1e\xaf\x74\xd3\x9d\x4c\x69\xa5\x92\x4c\x7e\xe7\x6f\x88\x1f\x9c\x1a\x9e\xb0\xff\x2a\x54\x6f\xf9\x3d\x74\x0a\x75\xf6\x71\x8f\x23\x9f\xb6\xbc\xc6\xa8\xd8\x4e\x84\x43\x17\xa6\x37\x7a\x7d\x53\x27\x61\x53\x19\x05\x65\xc5\x65\x5d\x40\x99\xaf\xe8\x14\x8a\x1f\x21\xb5\x9d\x1d\xa6\x9f\x88\xd7\xff\xa1\x84\x58\x83\x67\x5e\x08\x85\x8b\x77\x77\x91\x9a\xba\x65\x6f\xd4\x37\x80\x37\x16\xf7\x14\x4a\x47\xa8\xce\x8b\x82\xe1\xf3\x98\xd3\xb9\x48\x8c\xf8\xb9\xf8\xf6\x32\x95\xe0\x81\xde\x6d\xf6\xd9\x51\xea\x17\xfb\xaf\xb2\x9e\x37\x9c\x42\x8f\xd4\xad\xa3\x28\x54\xed\x3d\x9b\xfc\x62\x8d\x95\x48\xd2\xea\x27\xa4\x9b\xb7\xd2\xb8\x42\x9f\x7e\xb4\xac\x58\x16\x1a\x2b\x76\x39\x85\xda\x61\x93\xb1\x24\xe3\xa1\x16\xb5\x5c\xaf\x5c\xc3\x2b\x47\xbe\xea\xe8\xf2\x3c\x63\x90\xe7\xf1\x1b\x2b\x5b\xe3\xcf\xaa\x5a\xa8\x1b\xa7\xd0\x1d\xc9\x09\x66\xa4\x1c\xa3\x57\x21\xc1\xd5\x26\xd4\x25\x88\xcd\x0d\xc9\xe8\xab\xbd\x03\x36\x64\xf5\x09\xd7\xcc\x75\xef\x08\x89\x9f\x42\xa3\xb6\x3a\xd4\x71\x0d\x50\xc6\x3c\x30\xc5\xdb\x8b\x9b\xc5\x10\xdb\x55\xd7\x05\x31\xef\xaf\xb3\xd6\x0f\x51\xb4\xd8\x07\xd8\x49\x9f\x42\x2f\x91\x8d\x9c\xb8\x18\xfd\x7a\x48\x26\xe4\xfd\xf4\xc3\x92\xbb\x56\xda\xcf\x85\x76\x37\x64\xe1\xe2\xdd\x27\xd7\xe2\x39\x97\x04\xea\x4e\xa1\x98\x27\x46\x64\x0a\x0d\xa9\x75\xbd\xd6\x48\x53\xaf\x16\x3f\x76\xb8\x18\x37\xa2\xa8\x2f\x57\x2b\xe4\x38\x37\x7d\x44\xcd\x6b\x28\x3d\x85\x72\x21\xc6\xc8\x7e\x3f\xe1\xaa\xe3\xb7\x8c\x9a\x7b\x67\xfe\x31\x23\xec\x7b\x4b\xa5\xd8\xec\xc8\x23\x39\x16\x2a\x61\xcd\xd8\x69\xb6\x53\xe8\xa6\xa5\x3a\x51\xfe\xa7\x06\x13\x91\x4e\xa9\x51\x8d\xbd\x9d\x5a\x03\x16\x8e\xdc\xe4\xec\xfd\x5a\xf4\xec\xfc\x5f\x33\x1f\x19\x12\xff\xff\xa1\x84\x56\xbd\x76\x2f\x31\x77\x5e\xed\xa7\xbc\x18\xa6\x49\x30\xb5\x44\x63\xd2\xf5\xb5\x9d\xbf\xb7\xe4\xf6\x5c\xbf\xd7\xeb\xd0\x33\xe6\x14\xaa\x3c\x1d\xdc\x82\x77\x67\x7d\x98\x90\xeb\x67\x4b\xca\x1b\xc6\x60\x74\xc9\x3b\xee\x32\x22\x32\x04\x0b\xe2\x4f\xb3\x32\x3e\x58\xec\x9c\x42\x1f\xc5\x3e\xa5\x33\x31\xf0\xc8\xe5\x91\xd2\x11\x7c\xc0\xc4\xa9\xfd\x1b\x2d\x4a\xcb\x0a\x15\x87\xb3\x26\x7a\x99\x5e\xfc\x0d\x21\xe5\x29\xb4\xaa\xe4\xb7\xb7\xdc\x15\x8b\x6b\xaf\xc3\x2c\xa5\x04\x1e\x4e\x19\xfe\xf0\x9e\xcf\xa4\xe7\x0a\x1e\xdc\xdc\x94\x51\xbb\x23\x66\xe2\x7e\x0a\x95\x9a\x5e\xab\x29\x74\x91\xae\x2d\x62\x90\x66\x5b\x92\xd5\xeb\xf5\x27\x25\xd8\x33\xa1\x7d\x39\x9f\xa6\x7a\x4d\xa5\x3a\x29\x67\xf1\xf4\x0f\xab\xf3\x86\xdc\x9f\xa1\xba\x30\x00\x11\x81\x38\xae\x60\x28\x7a\x2a\x7e\x64\x93\x2d\x4d\xc8\x6e\xe9\x55\x8c\x3e\xc3\x8b\x5c\xf2\xd3\xf3\x6b\x60\x5e\x35\x91\x8e\x4f\x87\x42\x75\xd9\xa7\x8c\x77\x9f\x31\xef\x8a\xf9\xc5\xfd\xbc\xce\x25\xee\xf9\x5a\xaf\x9b\xfa\xd7\x15\x89\x53\xe8\x2b\xc4\x37\x19\x26\x3b\xcd\x97\xd6\x2d\xf3\xf3\x6a\x7c\x3f\x72\x78\xc9\x98\x11\x9b\x5e\x8e\x7b\x5d\x3a\xee\x62\x7c\x53\xa9\xb9\xe9\x14\xaa\x57\x3d\x98\xf4\x49\xaf\x90\xc0\xee\x6b\x8b\x73\x92\x6e\x53\xc9\xe7\x24\x02\x14\xbd\xad\x77\x44\xc8\x5e\x76\x2a\x86\xe8\x59\xa7\x25\x1c\x9b\xe3\x15\x37\x41\x0e\xba\xbc\xd4\x92\x8e\xfe\x7e\xa5\x6b\xb0\x21\x13\x85\x86\x3b\xdd\x1a\x2b\xbd\xfa\x41\x81\x4f\x5b\xd4\x9d\xd3\x55\x05\x6f\x64\xe9\x61\x4b\x6a\xa0\x0c\x36\x70\x89\xf7\x2d\x30\xc5\x38\x0c\x4e\x0c\xe0\xd1\x2d\x21\xfd\xf9\xd2\x47\xa9\x84\x11\x7c\x0a\xd5\x62\x63\xc3\x26\x3f\xf6\xd9\x9f\xa9\xa7\xab\xe8\x57\x1f\xf1\xac\x8d\x4a\xed\x09\xfd\x79\xf2\x98\x3a\x26\x9c\xdc\xc1\xba\x50\x32\x10\xe9\x9f\x6d\x06\xc2\x4e\xd5\x9c\xaa\x12\xb4\xab\xb6\x8b\x50\x97\x6c\xa1\x44\x62\x79\x73\x5d\x61\x84\x3c\x31\x63\x0a\xfb\xf6\xc6\xf1\xc1\x6e\x70\xf7\x47\xea\xd4\x53\x68\x68\x70\xe7\xdb\x1d\xba\x6e\x05\x3d\x27\x0d\x36\xd2\x06\xe9\xb9\xca\x83\x45\xcf\x5d\x21\xac\xc6\x52\xac\xae\x9a\xab\x8c\x22\x22\xe2\xe2\x38\x38\x7e\xe2\xa7\x2f\x83\x21\xd1\x71\x8c\x40\x02\xa7\x43\xe7\x87\xcd\x0f\x9f\xec\x76\x96\x0e\xa9\xb1\xf2\x72\x1f\xb6\x6b\xa8\x85\xf4\x16\x54\x2f\xdb\x66\x9d\x42\xfb\x93\x9e\xbe\xca\x10\x5d\x19\xf9\x36\xa1\xd0\x98\xec\x30\x72\x3b\xd1\x6c\xaf\x29\x67\xac\xb7\x8d\xb2\xbc\x7d\xab\xaa\x6f\x5d\xf2\xff\xa1\xea\x2e\xea\x3f\x1b\x5a\x00\x32\x02\x9a\xbf\x84\x98\x4f\x50\xb8\x84\x86\xb8\xf8\x7f\x7c\x71\xdf\x89\x67\x8b\xd8\x86\x1f\x71\x5a\x07\x77\xd4\x0c\xa8\x2b\x85\x2d\xd7\x19\xee\x2c\x25\x97\x77\xef\xde\x69\xbd\x92\x7a\x5d\x3f\xf6\xff\xe1\x8b\xfb\xc9\x20\x88\x23\x20\x20\xc8\x22\x20\xf9\x20\x20\x20\xf8\x89\x8b\xff\xef\xbf\x70\x29\x1f\x45\x44\xc8\xa7\x1a\x56\x75\x12\x5f\x46\xc7\xcf\x54\xd8\x97\x24\x29\x29\x13\x5c\x75\x62\xfb\xb2\x6d\x22\xde\x6d\x4a\xb9\xb7\x6b\x14\x58\x5f\x94\x78\x01\x9f\x2a\x8d\x20\x20\x0e\xfd\x58\x7b\xdb\x0f\x2a\x86\x4b\x65\x92\xae\x9a\xf4\xb1\x5c\xd2\xf3\x52\x1c\x9d\xda\x83\x3d\xc7\x49\x68\x77\x6b\x24\xd1\x3f\x56\xc7\x15\x5f\xc4\xc7\xfa\xa8\x9d\xf9\xd8\xdb\xaf\x56\xae\x6f\x45\xfe\x79\xe8\xf4\x46\x3b\xac\xb4\x34\x12\xc3\xca\xa2\xaa\x2b\x20\x40\x96\x3b\x9e\x7f\xd9\xf4\x86\xa8\x0a\xf7\x85\x8c\xd6\xf0\xcc\xc7\xb2\x54\x79\x9e\x5c\xdf\xf1\x41\x6a\x46\x78\xa6\x6a\x85\xac\x9f\xc7\xe8\xea\xcf\xe9\xd6\x77\xb5\x50\xea\x28\x75\x43\x42\xcc\x36\xe2\x42\x46\xeb\x7e\xe6\x63\x09\x63\x42\xda\x10\x86\xf1\x6e\x58\x2e\x93\x44\xfe\x61\xae\xcb\x66\x9a\x92\x6a\x6d\x6f\xd5\x7c\xc1\x9d\xbc\x8c\x6c\x46\xb0\x78\x01\x17\x59\xef\x9f\xa9\x1b\x80\x82\x8a\xe8\x2f\x89\x84\xe0\x7b\xea\x13\x1f\xb3\xf1\x31\x4c\xfc\x9c\x0e\x9e\xb0\xd6\xec\xa9\x28\xba\xc6\x27\x29\x6b\x6d\x52\x2d\xc5\x56\xa2\x99\x6a\x6c\x76\x22\xf3\x64\xc3\x47\xfb\x9f\x71\xfe\x92\x3e\xff\x51\x97\x2a\xff\xd2\xec\x4d\x07\x21\xa6\x9b\x16\x38\xae\x6d\xab\xee\x79\x5b\xc4\xc3\x3f\x8a\x43\xdb\x48\x4f\xf8\xbf\xc4\x1b\x86\x33\xf3\xc0\xea\x82\x38\x7f\x49\x04\x94\xd3\x75\xc5\x16\x9c\x8f\xd8\xa2\xdc\x6f\x77\x12\xf6\x6a\x52\x07\x8c\xc6\x9c\xec\x8b\xf7\x18\xde\xad\xf2\xe0\x97\xce\x61\x58\x93\xd3\x0d\x81\xd5\x05\x71\xd0\xef\x9b\x2d\x6d\x8a\xf3\xd5\xb7\x19\xc3\x7e\xfe\xd8\x64\xbc\xf7\x9e\x7d\xba\x3c\x65\x1a\x31\x5b\xdb\x8f\x6f\xd7\x66\x62\x0c\x9a\xde\x3b\xc2\xea\x82\x38\x7f\x49\x04\xf1\xd3\x75\xd1\xa8\x1b\x5f\x2b\x11\x7e\x15\xbb\x2b\xdf\x35\x77\x4f\xdb\x6b\x5f\xe1\x53\x29\xa2\x81\x92\xdb\x65\x03\x41\xef\xb1\x6c\x23\xe2\x77\x3e\xd2\xff\x8c\xf3\x97\x44\xf0\xf1\xf1\x0d\x94\xd0\x10\x97\x44\x40\x3a\xa3\x81\xde\x3f\x9b\x45\xce\x13\x40\x47\x86\x59\xe0\x0b\x0e\xde\xc2\x98\x6c\xb8\xd4\x8f\xcb\x3d\xce\x7b\x8a\x91\x56\x6f\x0f\x6c\x89\x31\x28\x7c\xca\x77\x98\xf9\x17\x60\x03\x07\x71\xd0\x0b\xda\xa3\x23\x9e\x96\xb8\x65\xa6\x2a\x9d\xa9\xc4\x9d\xa5\xc6\x63\x5e\xf0\x95\x83\x89\xc6\x68\x7d\xdf\x8d\x13\x47\x44\x8c\x8f\x40\x0f\x56\x17\xc4\x41\x05\x60\x7a\xf3\x8e\x2b\x6d\xe1\x9a\xe7\x30\x29\xeb\x72\xb7\x0b\x8e\xff\x86\x45\xab\x4c\xa8\x69\x74\x76\x01\x61\x98\x74\x99\xef\x9b\x00\x58\x5d\x10\x07\xfd\xbe\x0f\xd4\x98\x52\xdd\x9c\x74\x53\x1d\x15\xbd\xc8\x1b\x43\xba\xe2\xd8\xb0\x67\x30\x7e\x79\x47\xaa\x9b\xae\x8f\xec\x4f\x13\x0f\xef\xc2\xea\x82\x38\xa8\x00\x46\x93\x37\x89\x2b\x6f\xd6\xd4\x53\x17\xa4\xbe\xb4\x4a\xd0\x60\x9d\x39\xaa\x7e\x88\x37\xf0\xf4\xf9\xbe\xba\x56\x26\x37\xbd\x70\x96\x8f\xec\x3f\xe3\xfe\x2d\xc0\xbf\xd6\x8e\xbf\x28\x00\x9a\xd1\xcf\x53\xa0\x4d\x49\xea\xbb\x39\x63\x4b\x9a\xf8\x3b\x6c\x6a\x97\x96\xc9\xed\x47\x2a\xfe\x97\x3e\xe8\xbf\xf6\x31\x43\xdc\xb6\x0c\x59\xfc\x5c\x0a\x1b\x3a\x88\x83\x5e\xd2\x3c\x3e\x86\x9b\x68\xf7\x37\x2c\x9f\x8d\x75\x09\x30\x21\x35\xab\x3e\x1d\xc1\x7c\x45\xa9\x22\xc5\xec\x24\x41\x66\x66\x23\xf9\x24\x11\x56\x17\xc4\x41\x15\xb8\x61\x5f\x3c\xc7\xd2\xe6\xed\x95\xe3\x63\x75\x6b\x06\xfd\xaa\x8a\x59\xc7\x5e\xa8\x65\xce\x38\x5e\x87\x79\xe1\xf5\x95\x00\x7a\x4d\x58\x5d\x10\x07\xfd\xbe\x55\x46\xe9\x8e\xc3\x13\x5d\x5b\xb5\x1e\xbf\x38\xfa\xa3\x4f\x02\x39\x3a\x7d\x4c\xf1\xd8\x5f\xba\x55\xd9\x24\x5e\x4a\x2f\xef\xcc\x83\xd5\x05\x71\x50\x05\x1c\xef\x58\x0f\x3e\x93\x20\xa7\x92\x3d\x71\xa2\x45\x0a\xa4\xb8\xee\x52\xd5\xec\xf8\x56\xcd\x66\x68\xdc\xa9\x3b\x18\xeb\xe7\xc9\xa0\xcf\xed\x7f\xc6\xfd\x5b\x81\xff\x5d\xc8\xff\xe2\x00\x68\x79\x3d\xcf\x01\x59\x4e\xff\x75\xb1\x17\x5a\x3c\x88\x53\xe9\x7c\x4d\x7c\x97\x56\x97\xbf\xcd\xde\xbd\x12\x49\xff\x5e\xd2\x9a\xe8\xeb\x0b\xf1\x3f\x3a\xb0\xb1\x83\x38\xe8\x35\xe5\x1a\x3f\xb9\x7e\x9f\xb2\x75\x5e\xde\xae\xc1\xdf\xce\x64\xed\xfe\xcc\x98\x66\xee\xac\x1e\xa2\xc0\xa1\x54\xce\xf8\xd8\x8e\xf5\x1a\xac\x2e\x88\x83\x3a\xe0\xf2\x70\xf6\xbd\x23\x6d\xf8\xe4\xcd\xcd\xc1\x5d\x5e\x86\x23\x24\x83\x2a\x89\x61\xe9\xfb\x92\x7f\xee\x51\x0a\x1d\xa1\x7a\xb8\xa9\xc2\xea\x82\x38\xe8\xf7\x6d\x56\x2f\x48\xc6\x34\x93\x28\x3a\x6a\x8a\x33\x1a\x9f\x08\xd7\xd0\x69\xb6\x13\xe0\x5d\xf9\x5d\xb7\x96\x9b\x44\xdb\x3c\x9d\x95\x0a\xab\x0b\xe2\xa0\x0e\xb0\x35\x3f\xbf\xf5\xba\x36\x0f\xc3\x2e\x20\x54\xcd\x2c\xd7\x91\x50\x99\xfc\xf3\x08\xd3\x61\x70\x9a\x81\x93\xc8\x70\xe6\x3d\xf7\x27\x30\x07\x40\x1c\xcc\x81\x7f\xed\xaa\xfe\xe2\x00\x68\xaf\x73\x9e\x03\x7a\x33\x8c\xd5\x62\x0a\x1b\xc2\xd2\x5f\x7e\xda\x87\x93\xb9\x11\x2c\xd9\x29\xdd\xce\x3a\x29\xd4\xa3\xdd\x3c\x69\x17\x4c\x69\x68\x82\x8d\x1d\xc4\x9d\xd9\x0b\x98\x93\x18\xa3\x22\x79\x4f\x6a\x2e\x06\xa8\x3f\x50\xb2\xe5\xb9\x3c\xfc\xdd\x38\xd0\x77\x20\xe9\x4f\xa0\x62\xc8\x8d\x24\xcd\x0a\xf8\x5e\x00\xc0\x41\x1d\xc0\x25\xf5\x6f\x7d\x9a\xf2\x7a\x24\x69\xa6\xee\x99\x27\x13\x35\xde\xf5\xdf\xb2\xcb\x6f\xfb\x51\x24\x78\x8d\xc7\x87\x0c\xcc\x90\xb6\x60\x75\x41\x1c\xf4\xfb\xea\x38\xa0\xf6\x20\xc6\xc7\xbd\x7d\xa2\xe4\x58\x6c\x4e\x2a\x75\xe9\x0f\xff\xb2\x71\x27\xe2\x8f\xb7\x24\x8b\x5f\x15\xbe\xfa\x71\x0d\xc1\x97\x44\x00\x07\x75\x60\xe8\xd9\x3d\x53\xc5\x18\xe5\xe3\xa8\xd1\xc7\xcf\x0b\xd1\x37\xd7\xd9\xdf\xe4\x17\x31\x72\x88\xfc\x28\x2c\xdc\xb0\x5d\x2c\x92\x66\x86\x39\x00\xe2\xe0\xf3\x80\xe1\xdf\x1d\x00\x6d\x3c\xcf\x73\x60\x3b\xb3\x66\xe1\x65\x39\x47\x0c\xfe\xee\xe2\x6a\x8e\x74\xd9\xb4\xf9\xa5\xa4\xcc\xa4\xf0\x2c\x57\xec\x9b\x43\x39\x58\x3f\xc4\xe1\xfb\x41\x10\x07\xbd\xa6\x66\x45\x2a\x2e\x3b\x84\x97\x1e\x98\xd2\x2e\x8b\x1f\xcd\x8e\x29\xb6\x0f\x62\xfd\x71\x1c\x90\x5d\xa9\xae\x27\x91\xe0\xbb\x5b\x6f\x03\xab\x0b\xe2\xa0\x0e\xf0\x70\xf9\x3d\x6f\x3f\x16\xc8\x9a\x8d\xa7\xdd\x99\x3e\x9e\xdb\x0a\xa9\x1d\x64\x7a\x26\xea\x4c\x95\x40\x1a\x33\x81\x1d\xc2\x4c\x00\xab\x0b\xe2\xa0\xdf\x77\x8a\xa5\x7f\x04\x8b\xb4\xd3\x57\x8a\x73\x52\x46\x7b\xb9\x3c\x57\x12\x07\x57\xf3\xa0\xc0\x76\x06\x85\xff\xb6\x5b\x63\x46\x37\xbc\x2e\x88\x83\x3a\x10\x10\xbf\x42\xee\x3b\xd8\xdd\xa2\x68\x13\xef\x18\xed\xa2\x51\xdf\xf7\x4a\x41\x67\xd1\xb4\x94\x47\x07\x01\xdd\x35\x55\xfc\xf6\x1c\xcc\x01\x10\x07\x9f\x07\xdc\xff\x2f\x0e\x18\xfc\xb3\x3b\xf7\x00\x54\x14\x44\x7f\x69\x24\x04\x84\xff\x18\x7d\x7e\x91\x14\x59\xef\xb4\x42\x73\xbf\xf0\xba\x05\x65\xdb\xe6\x3e\x9a\xd0\xc6\x88\xcb\x6e\x76\xad\xc2\xbb\xeb\xb1\x88\xfb\xa5\x41\x3e\xf7\xfe\x19\xe7\x2f\x8d\xe0\xf3\x9f\x95\x65\x67\x87\xe2\x27\x15\x0c\xff\x0c\xeb\xc6\x52\x06\x31\xe0\x06\x1b\x69\x1e\xe5\xfc\xec\x54\x30\x53\x21\xdf\x0d\x75\x6e\xea\xda\x82\x55\x06\x71\xfe\xd2\x08\x48\xff\x59\xb9\xf8\xc3\x2c\x9a\xe9\xa0\x2b\x0a\xa1\x41\x32\x97\xc7\x9a\x7e\x9d\xda\x32\xf3\xa0\x68\xdb\x9c\xa8\x4d\x8a\xfd\xb8\x42\xb9\xb5\x28\xac\x32\x88\xf3\x97\x46\x40\x40\xf0\x39\x5d\xb9\xb1\xd2\xc8\xce\xc2\xd7\xe4\x80\x9c\xce\xc5\xa4\xac\x7d\x56\x48\x31\x85\x36\x5d\x6d\x1e\x21\x18\xe9\x12\xe9\x4b\xcf\x38\x5f\x3d\x1f\x58\xfa\x02\xfa\xfb\xca\xe9\xf4\x85\x7b\xfc\x31\xca\xcf\xf7\x0b\x2d\xab\x84\x3e\x83\x96\x03\x0a\xcb\x1a\x44\xfe\x8c\xf1\x13\xce\x77\x85\x11\x84\xc8\x58\xfa\x42\x09\x4f\xa1\x8a\x61\xcf\x6a\xcb\x25\x3c\x95\x9f\xce\xfd\xb1\x68\x08\xde\x20\xbd\x53\x11\xf9\x4a\x1a\x79\xf4\x13\x42\x79\x9b\x12\x7f\xcb\xcb\xfd\xff\x96\xf4\x65\x0f\xf5\x9f\x0d\xed\xff\xa4\x2f\x92\x77\x09\x21\x37\xcb\xaf\x89\x6b\x2c\xbf\x8c\x9b\x2b\xa9\xc9\x90\x16\xf8\x9e\x88\xf6\x16\x3c\xf8\x62\x4b\x86\x69\x69\x60\x84\x36\xe0\x12\x44\xa9\x80\x76\x11\xf1\x4b\xcb\x99\xf8\x65\xbb\xe8\xfb\xa7\x8d\xa1\x1a\xe6\x43\x79\xf4\x29\x0b\x7f\xfc\x5b\xe5\xcf\x90\x19\xab\x87\xd7\x43\x08\x3c\xa2\x84\xa3\x74\xd6\x37\x2e\x22\x19\x10\x3f\x1b\xbf\xd0\x2c\x34\x76\x44\x4c\x1b\xa1\xcb\x3b\x51\x31\x44\x8c\x32\x08\x5b\xa9\x50\x68\x9d\x68\xa4\x3a\x4f\x55\x3c\x39\x46\x3d\xba\xb4\x78\x11\x1f\xdb\x72\x36\x7e\x49\x55\xe8\x62\xc9\xdf\xd1\x26\x97\xbd\xd2\xa7\xe8\x3b\x98\x69\xf4\xea\xd3\xf7\x4f\x88\x15\x5f\xab\x7f\x26\xd0\x9b\x69\x44\x92\x7b\x5d\xc8\x68\xcf\xc6\x2f\xc2\xcb\xdc\x46\x6f\xa2\xe7\x35\x75\x74\x64\x67\x68\x09\x8c\x99\xe3\x7e\xb3\xa5\x75\x6b\xab\xb5\x2e\x8f\xa7\x6a\xf5\x52\x20\x5d\xcc\x68\xcf\xc6\x2f\x64\x03\x37\x2a\xa4\xb4\xac\xc5\xd2\x7a\xeb\x31\xdd\x5b\xf9\xb0\xb8\x6b\xf1\x73\xee\xc8\xf9\xd0\xbe\xff\x79\xf5\xb2\x99\x34\xc5\xe5\x0b\x8b\x5f\x40\xea\x9e\xb7\xdc\x46\xb9\xcd\xff\x7e\xc7\x32\xfa\x60\x82\xbe\x57\x8d\x89\xc1\xe8\xca\x91\x66\xa1\x54\x1c\x6d\xf3\xd1\x36\x9e\x44\x93\xb8\x95\x02\x35\x6c\x99\x01\x71\xd0\xe5\x2b\x7f\x93\x92\x27\xe6\xa6\x13\x93\xa5\x07\xfb\xe7\xad\xc2\x4e\xed\x99\xcc\xa8\x2f\x25\x2d\x49\x94\xca\x9f\xc5\xc6\x5c\x9e\x6b\x95\xc1\xea\x82\x38\xe8\x72\x9b\xc2\x9f\x61\x9c\x15\x8f\xa4\xdf\xeb\x5c\x51\xfa\xe4\x47\xad\xf1\xa3\x8e\xfb\x87\xa4\x15\xaf\x6e\x8b\x45\xb2\xea\x27\x09\xe7\x5a\xc3\xea\x82\x38\x7f\x49\x04\xc4\xd3\x75\xc9\x57\xdf\x22\x71\x62\x7c\xc6\x73\xc8\x28\xfc\x86\xe0\x4c\xc0\x5a\x30\xae\xb2\x38\x46\xb0\x88\x99\x24\xff\xf9\x6e\xa0\x08\x3a\x26\xac\x2e\x88\xf3\x97\x44\xf9\x8f\xeb\x20\x18\x5e\xf7\x67\xa0\x86\xec\x46\xf0\x92\xf1\x27\xfa\xb7\xe8\x6c\x5f\x39\xec\x83\xdd\x2a\xe2\x76\x52\xa8\x2c\x35\xc4\xa7\x04\xb6\x7c\x64\xfe\x19\xe7\x2f\x89\x80\xe1\xe3\x1b\xf8\x3f\xf3\xd5\x5f\x36\x5c\xa0\x69\xe4\x3c\x03\x1e\x85\x85\x29\x15\xa7\xcb\xf1\x3b\xe0\xab\xbd\xf1\xe8\x21\x18\x59\xec\xba\xcf\xdb\xad\x67\xbc\x62\x6c\x12\x8e\x1c\x32\x1c\x43\x05\x1b\x39\x88\x83\x1a\x60\x29\xb3\x5e\xd3\x18\x8b\xd7\x4a\xc9\x35\x39\x23\x49\x5f\xe3\x38\x11\x69\xd3\xfd\xdc\x57\x1f\xb7\xbf\xf9\xde\x0d\x35\xbd\x81\x5b\xb0\xba\x20\x0e\x6a\x80\x31\xa1\x78\xb8\xac\xef\x5c\x76\x5c\xe8\x8c\x5c\xda\xc8\x32\xbb\x06\x49\xb9\x0c\x8d\x76\x40\x9b\xbc\xbe\x30\x63\x92\x5b\x02\x7c\x63\x04\xe2\xa0\x06\x10\x13\xad\x15\xf8\xb1\xa3\x63\x51\xbd\x6b\x16\x98\x3b\x89\x78\xdc\xa3\xae\x7f\x25\x4e\x77\x46\x11\x95\xc1\x6d\x8f\x6d\x4d\xee\x13\xac\x2e\x88\x83\x1a\x50\x5b\xf5\x9b\xc2\xac\xe0\xf1\x72\x7f\xf2\x6b\x13\x59\xad\x6b\xfc\x98\x57\x8a\x52\x83\x3e\x76\x62\x34\x1f\x0d\x63\x84\x26\x65\xc9\xc2\xf2\x17\x10\xf7\x6f\x03\xfe\xb5\x78\xfc\x45\x01\xd0\x94\x7e\x9e\x02\x6f\x5e\xef\x73\xd9\x61\x8c\xda\xd6\x1f\x51\x4c\x7c\x90\xd9\x2d\xeb\xcf\x20\xa7\x35\xee\x71\xa1\x45\x6d\xbc\x1e\x7b\x39\xde\x9a\x1b\x36\x74\x10\x07\x55\x80\x2c\x1f\xd1\x6a\x01\xcb\xef\xa3\xd7\xee\xa4\x4f\xdb\xad\x87\xa1\x9e\x04\x1b\x1a\x74\x1f\x90\xe8\x11\x8b\x1f\x25\x0f\x96\x93\xd2\xc1\xea\x82\x38\xa8\x02\x23\x6d\x9e\x8a\xd8\xe1\xdc\x13\x95\x41\xa3\xb1\x77\x43\xc3\x07\xfd\x36\x4c\x1c\x42\x33\x33\x59\xd4\xc2\x18\x5e\x07\xac\xf0\xb6\xc2\xea\x82\x38\xa8\x02\x08\xa8\xf5\xb4\x6d\xc9\xb9\x87\x4e\x2a\x28\x97\xf3\x9b\x1d\x51\x51\x85\xd1\xef\x6a\x0c\xbc\x33\xab\x1e\xdd\xff\x4a\x22\x80\xf6\x08\x56\x17\xc4\x41\x15\x98\xe4\xbb\x92\x31\xa1\x19\x3f\xab\xf3\x8a\x67\xc6\xb9\x0c\x99\x5e\xab\xfc\x06\xaa\x8a\xfa\x55\x14\xac\xc1\x5b\xc3\x71\x93\xf3\x14\xb0\x3d\x37\x88\xfb\xb7\x02\xff\xbb\x92\xff\xc5\x01\xd0\xfa\x7a\x9e\x03\x4f\x7f\xe3\xbb\x87\xa0\xe7\x58\x7e\x36\x89\x22\xba\x77\x20\x22\x40\x3d\x22\x3e\xcf\xf6\xdb\x90\xda\x45\xdc\xad\xa9\x59\x2b\xe8\x26\x6c\xec\x20\x0e\xea\xc0\xe7\x83\xa7\xc3\x95\x3c\x18\x94\xc7\x98\x6b\xc1\xeb\x72\x4e\x3d\x5d\x84\xcc\xde\x45\x41\xf5\x8f\xc8\xad\x7a\x25\x9e\x73\xed\xad\xc3\xea\x82\x38\xa8\x03\x39\x2c\xb8\xc5\xbb\x99\x46\x8d\xd5\x15\x36\xef\x90\x47\xfa\xee\xcf\x7f\x6e\x1c\x26\x94\x9b\x20\x70\x5d\xc8\x70\xeb\xdd\xb1\x6a\x84\xd5\x05\x71\x50\x07\x6c\xca\x69\xd9\x3f\x09\x3a\x0c\xb4\xfa\x20\x55\xe9\xf3\x6f\x2b\x1a\x4e\x31\x5b\x8f\x3f\x5c\x13\x7d\x11\x82\xb5\x21\x9f\x91\x4e\x06\xab\x0b\xe2\xa0\x0e\xc4\x8e\xbd\xc3\x08\x66\xf0\x38\xc2\xd5\x5e\xb7\x75\x1c\x5e\xf4\xde\xbd\x3a\xc2\xd1\x96\xea\x91\x14\xe6\x51\x3d\x35\xc4\x9a\x69\x01\x73\x00\xc4\xc1\x1c\x68\x01\xe4\x2f\xa0\xcd\xce\x79\x0e\xe8\x5f\x56\xbc\x2f\x4d\xf6\x58\x7e\x71\x59\x56\x60\x14\xb7\x50\xd5\x93\x1f\x89\xca\xe5\xbb\xa0\x40\xda\xa7\xc1\x9a\x5b\x68\x3b\xf5\xb0\xb1\x83\x38\xa8\x03\xa3\x03\xef\x0b\xe2\x78\x86\x8e\xf2\x5c\x4a\x54\xa4\xf5\x83\x52\x9c\x43\xbc\x7e\x2c\x08\x5c\xfd\x4d\x76\xcf\x61\x89\xd3\x7e\xf9\x10\x56\x17\xc4\x41\x1d\x58\xa4\x7e\x45\x6b\xd8\x2f\xd8\x70\x15\xe5\xfa\xd0\xd6\x56\x09\x97\x3e\x59\x98\x44\xaa\x26\x01\x1d\xc3\x9d\x2f\x96\xd5\x66\x26\x1e\xb0\xba\x20\x0e\xea\xc0\xbd\x61\xaf\xd6\x9e\x72\x13\x22\xd5\x40\x49\x97\x1f\xb6\xaa\xdb\x14\x08\x82\x71\x8a\xe6\x6f\x6d\xfb\x66\x0f\x9c\x7d\x1e\x2d\xbe\x84\xd5\x05\x71\x50\x07\x12\x1d\x6d\x2e\xad\xac\x23\xd5\x95\xd2\xf2\x04\x55\x6f\x31\xa2\xbc\xfd\x35\x66\x72\x97\xf5\xca\x66\xe1\x2e\x55\xee\xbd\x1b\x77\xb2\x60\x0e\x80\x38\xf8\x3c\x00\xc8\x5f\x40\x3b\xcf\xf3\x1c\x08\xf7\xfd\x31\x75\xf5\xb3\xca\x4f\xd9\x59\xcc\xce\x92\x7c\x22\x4e\x16\xc4\xd5\xb6\x0a\xbf\xfe\xf1\x9c\x3f\x5d\x65\x33\x1b\xa6\x62\xb0\xb1\x83\x38\xa8\x03\x2c\xc4\xee\x71\x3f\xee\x66\x51\x79\x04\xb3\xa2\x3c\x57\xf2\xa2\x08\x13\x13\xc6\x47\x70\x53\x52\x95\x0b\x1b\x54\x94\x59\x20\x29\x82\xd5\x05\x71\x50\x07\xac\x73\x6c\x16\x6c\xbe\xd3\xad\x5a\xad\x63\x93\xd6\xad\x3d\x45\x0c\x7f\xfb\x85\x2b\x57\xe4\xcf\xd4\x6e\x28\xa6\xdb\xc8\x67\xf5\x2a\x58\x5d\x10\x07\x75\xc0\x85\xb5\xde\xa0\x45\x1c\xdd\xae\x58\x1c\xd9\x69\x21\x29\xda\x48\x29\xa8\x58\x23\xf7\xb6\x8d\xa8\xfe\x75\x0c\xb6\xa0\xc7\xfa\x94\xf0\x7c\x17\xc0\x41\x1d\x78\xb1\x43\x67\x15\xf3\x78\xf5\x8f\xc8\x57\x96\x44\xbd\xaf\x5f\x5b\x02\x3e\x06\xac\x11\x8d\xa4\xb0\xe7\x45\x16\x8d\x4b\x90\x4a\xf0\xc3\x1c\x00\x71\xf0\x79\x00\x90\xbf\x80\xee\xdd\xcf\xcf\x5f\xf4\x0c\x14\x6f\x48\xd3\xc6\xcb\xa1\xe0\x0f\x31\x0c\xea\xbf\xd0\x0f\x0c\x0b\x92\x2e\x8b\xf5\xe8\xf4\x4c\xa3\xba\x22\x43\xe5\xa1\x03\xcb\x32\x40\xdc\xd9\xfc\xc5\x25\xbc\x04\x71\xd6\xf2\x2b\x05\x36\x81\xe6\xad\xa7\x74\x12\xab\x5f\x8b\xda\xc9\xca\x28\x46\x0c\x4b\x12\x30\x7f\x38\x97\xc5\x52\xc3\x2a\x83\x38\x7f\x69\x04\x94\xff\xac\xfc\x63\xca\xe2\xf5\xe5\xcd\x9a\x99\x27\xf4\x95\x31\x07\xf3\x1c\xea\xe6\x1f\xc6\x2f\x53\x3f\x60\x0f\x53\xd9\xed\xd0\x0c\xbb\x72\x75\x14\x56\x19\xc4\x9d\xbd\x1a\x9d\xd5\x62\xd1\x4a\x36\xa3\xdc\x0b\x19\x53\x3f\xf4\xcc\x7d\x3d\x78\x71\xf6\xa5\xf7\x73\xf4\xdb\x6b\x24\x91\x87\x0b\x6e\x0f\x86\xc2\xf3\x17\xd0\xa1\xd5\xd3\xf9\x0b\xb9\xb6\xeb\xaf\x12\x99\xb7\xef\x71\x19\xfc\x7d\xfd\x75\x36\x6a\x55\x70\x2d\xd5\x09\x95\xd4\x69\x73\xca\xbe\x95\x3f\x23\xe2\x4d\x3f\x85\xd6\xd1\x2a\xf5\x8b\x37\xc9\xd1\x4e\x75\xa0\x30\x6d\x1b\x62\x6c\x07\x64\xff\x40\xf1\xbd\xfb\xca\x31\x7e\xae\xfe\x81\x24\xef\x55\xd4\xff\xb6\xfc\x05\x34\xb4\x53\xf9\x4b\x34\x34\x7f\x61\x33\x9c\xfa\x50\x56\x73\x99\x61\x61\xe6\xfd\x3c\xfd\xd8\xc7\x56\x5f\x83\x3d\x1a\xce\x64\x33\xdd\x8f\xef\xee\xe5\x5e\xe2\x92\xa9\xbc\x88\xfc\x05\xe1\x0e\xf4\x1e\xdd\x67\x03\xd1\xe5\x8a\x5b\x47\xff\x13\x4f\x37\xba\x9f\xc7\x81\xf7\x2b\x0a\xc5\xa6\x62\x62\x97\x16\xf3\x04\xf9\x91\x1b\x6f\xf5\x14\x5c\xc8\xc9\x8c\xb3\xf9\x8b\xc8\x31\xf7\x2b\x5b\xe2\xf9\x77\x3e\x2b\x4f\x78\xb7\x15\x44\xa5\xde\x16\x11\x2f\x5d\x71\x29\x51\x1f\xb5\x1a\xc7\x7a\x27\xb4\xf6\xe4\x42\xce\xa1\xa8\x9f\xf9\xd8\xfb\x4c\x92\x8e\x77\x8f\x92\x6e\x2b\xb7\x65\x7c\xd2\x34\xd4\xd8\xf2\x73\x60\x5e\x17\xde\xba\xf3\xc0\xb7\x38\x76\xf8\xa5\xd1\x1b\xb7\x0b\x19\xed\xd9\xfc\xa5\x02\x19\x95\x80\x76\x4d\x40\x98\xdc\xd8\x03\xfb\x38\x9b\x72\x44\x96\xc4\x41\x7d\x9d\xb8\x3c\xa0\xa1\xae\xb0\xfc\xab\x5a\x8f\xe5\x85\x8c\xd6\xe3\xcc\xc7\x52\x34\x14\x53\x49\xe5\x49\xf2\x20\xdd\x1c\x8d\xa4\xd1\xa8\xc5\x4e\xea\x46\x23\xb1\x47\x59\xe5\xca\xd7\x14\xb3\xe8\x75\xb9\x63\x70\x61\xf9\x0b\x48\xdd\xf3\x96\x5b\x03\x44\x91\xc3\xf6\xf7\xfc\xc7\x23\x03\x5e\xda\xf5\x7e\xb7\x0c\x19\x29\xd0\x4e\xca\x5b\x09\x7d\x78\x82\x2f\x95\xaf\x56\x38\xc3\xff\xe4\x05\xe2\xa0\xcb\x6d\xe1\xa4\x40\xbe\x16\x5f\xde\x36\xcf\x1d\x37\x44\xdc\x5b\x57\x83\x6f\xb7\xcf\xfc\x8a\xb4\x88\x3d\xb9\xf1\xd8\x0c\x65\x98\xd1\xba\x0e\x56\x17\xc4\x41\x97\xdb\xfb\xa1\x53\x6e\xc6\xb3\x16\xb1\xef\x9d\x44\xc2\x7a\x9c\x52\x2c\xc7\x02\x71\x44\xef\xd9\x36\x14\x6c\x37\x3e\xb0\x2e\x63\xe5\xdd\x83\xd5\x05\x71\xd0\xe5\xf6\x67\x9a\x66\x14\xf9\xca\x63\xfe\x4d\xf3\x1a\x3b\xdf\x5f\x31\x3c\xc3\xe2\xf1\x3d\x04\x64\xc4\xc5\x7c\xdd\x4a\x3e\x75\x8b\x65\xec\xb0\xba\x20\xce\x5f\x52\xfc\x3f\xae\x83\x82\xf9\x9a\xea\x87\xf5\xba\xa1\x96\xd8\xfb\x55\x62\xa8\xaf\xe9\xcc\xaf\xb1\x0a\x3e\xea\x42\xd8\x5b\x74\x5d\x92\x66\x5d\x6b\x48\x86\xe5\x2f\x20\xee\x7f\xae\xaf\x8f\x6f\xe0\xff\xcc\x57\x7f\xd9\x70\x81\xa6\x91\xf3\x0c\x18\xc6\x0e\xfa\xc0\xc9\x62\xba\xf9\x80\x52\x0c\x57\xb6\xb4\xbc\x51\x69\x68\x2e\xb3\x71\x2c\xfd\x7d\x9a\xae\x05\x7f\xf4\xdb\x38\xf8\x86\x0b\xc4\x41\x0d\x58\x42\x8a\x6d\x0f\xd5\xfc\xa9\x4a\x7d\x3f\x32\x92\xf8\x39\x21\xd3\xd5\xc7\x56\x2f\xc5\x64\x44\xcd\xee\x52\x24\xb6\x4d\xa2\x11\x85\xc3\xea\x82\x38\xa8\x01\x59\xdf\xb7\x72\xcd\x4d\x09\x83\x57\xf1\x63\xd9\x19\x6e\xfa\x35\xc9\x36\xcf\x68\xfe\x59\x49\x79\xf2\x88\xd8\xbf\x58\x39\xce\x10\x7e\x93\x00\xe2\xa0\x06\x64\xd0\x14\x92\x0e\xe0\x39\xe4\x2a\xe7\x9c\x24\x66\x8d\xf1\x33\xe1\x67\x72\xfe\x7c\x79\x82\xba\xd6\x94\x12\xc4\x9d\x1c\x72\xd4\x0d\xab\x0b\xe2\xa0\x06\x2c\x96\x2d\x70\x45\xf9\x7d\x0d\x95\xf9\x93\xde\x82\xc2\x7d\xdb\x89\x4e\xd3\xe5\x86\x6c\x88\x1b\x43\xa9\x07\x59\xf2\xcc\x46\xc4\x11\x2c\x7f\x01\x71\xff\x36\xe0\x5f\x8b\xc7\x5f\x14\x00\x4d\xe9\xe7\x29\x90\xe9\x4e\xeb\x41\x4c\x29\xd1\x9d\x87\x42\x29\x86\x53\xf9\xb4\x4f\xe4\x55\x2d\x5f\x0e\x9f\xf2\x43\x91\x03\xf3\x22\x1a\xcb\x28\xf8\x11\x28\x10\x07\x55\x60\xda\x2b\x6b\x96\x33\xd2\xb9\xce\x67\xe7\xae\x1f\xe5\xc9\x78\xba\x5b\x9d\x61\x9d\x77\x22\xe5\x84\x9f\xee\xca\xb4\xa5\xdd\xa7\x29\x58\x5d\x10\x07\x55\xa0\x5e\xe0\xca\x50\x1a\xdd\x86\x99\xa3\xde\xa7\x1b\x7a\xbf\x8e\x9f\x16\x85\xc9\xd2\x7f\x1c\xd3\xd7\x91\xed\x70\x6a\x20\xaf\x36\x1d\x80\xd5\x05\x71\x50\x05\x36\xdc\xdd\x6e\x7c\x88\x54\xba\xf1\xe4\xbb\x90\x20\x49\x18\x13\x3f\xce\x1c\x69\x24\xcf\x6f\xd6\xc3\x0a\x13\x4e\x65\xcb\xbb\xbc\xf0\xbf\xfd\x82\x38\xa8\x02\x2a\xee\x9c\x4d\x19\xd3\x57\x44\xd7\x1c\x4a\xcb\x6c\xa6\xed\x03\x9a\x1c\x93\x7f\x5a\x67\xe2\xfe\x7c\x7c\x6b\x14\x99\xc6\x83\x78\x1c\xb6\xe7\x06\x71\xff\x56\xe0\x7f\x57\xf2\xbf\x38\x00\x5a\x5f\xcf\x73\x60\x30\xab\xfb\x95\x47\xc4\xbb\xf9\x07\xfd\x1e\x4c\x4c\x3f\x6c\xaf\x31\xcb\xb3\x3c\x8f\xaf\xdb\x7a\x4c\xd7\x51\x44\xe7\x3a\x17\xde\x0e\x1b\x3b\x88\x83\x3a\xd0\x96\x95\xfc\xae\x5a\x33\xa3\x40\x88\x98\x9f\x4d\x81\xd9\x61\x3f\x0c\x97\xc2\x00\xe3\xa4\x63\xcf\xa3\xde\xd8\xc0\x6f\x79\xeb\x0e\xfc\x6c\x15\x80\x83\x3a\xf0\xbe\x05\x9f\xae\xf6\xab\x02\x79\xf5\xf2\x10\xc7\xa3\x81\x91\x58\x2f\x52\x09\xd7\xba\x5b\x24\xdf\xb9\x88\x03\x53\x71\xe7\x38\xe0\x81\x39\x88\x83\x3a\x10\xdb\xa6\x92\xa5\xda\xcc\x52\xd1\xad\xc0\xfb\x1a\xfb\x32\x22\xc2\xea\xbb\x68\x9b\x58\xda\x05\x3f\x45\x54\xde\xcb\x54\xd9\xae\x19\xb0\xba\x20\x0e\xea\xc0\x40\x0d\xbb\x24\x85\x3d\x09\x77\xab\x0b\xd9\xf1\x3d\xe1\x04\xcc\x18\x6b\xdb\x31\xf7\xcd\x9e\x15\x91\xc7\x6a\x8d\xe6\xde\xab\x0a\x30\x07\x40\x1c\xcc\x81\x7f\x6d\xab\xfe\xe2\x00\x68\xb3\x73\x9e\x03\xfe\x96\xaa\x02\xbc\x35\x0f\xee\x89\xca\x90\xe0\x97\x85\x6a\x16\xb0\x94\xb4\x1b\x5e\xf5\x37\x0f\xe6\x3e\x18\xc8\x4b\x46\x79\x2c\x05\x1b\x3b\x88\x83\x3a\x20\xb1\x23\xf3\x56\x3b\x83\x26\x07\xcb\xba\xcf\xe5\x9d\x38\x0d\x85\x7b\x04\x4b\x4b\xb1\x1c\xde\xd1\x1d\x4b\x1b\x42\xfe\xe0\x07\xf0\xfc\x05\xc4\x41\x1d\x20\x32\x51\x93\xf9\xc8\x5d\x3b\xe5\xd3\x21\x7f\x64\xfa\x4a\x41\x29\x85\x01\x8b\x45\xc9\x79\xf3\x41\x60\xa7\x10\xee\x96\xf0\xd0\x35\x58\x5d\x10\x07\x75\x60\x51\xa8\xe3\xe8\xab\xff\xb3\x2f\x6c\xfd\x45\xfb\xbc\x5d\x29\xf4\xc1\x16\x2e\x85\x87\x5e\xd6\xfe\xde\xc1\x6a\x2c\x7a\x94\x49\x96\xf0\x5c\x07\xc0\x41\x1d\x40\x5b\x97\xf2\x0d\xec\xe0\x20\x74\xf3\xc9\xf3\xdb\x32\x79\xe9\xa0\x43\xff\x46\x08\x59\xe9\x5e\x76\xf3\x77\x6e\x11\x7a\xc4\xef\x4f\x61\x0e\x80\x38\xf8\x3c\x00\xc8\x5f\x40\x3b\xcf\x73\x73\xd8\xdc\x6d\xbf\x24\xca\x28\x92\xd8\x87\x11\x72\xb7\xdf\xed\xd2\xf3\xfa\x6a\x86\x76\xc4\x90\xf0\x14\x11\xbf\x92\xd5\x5b\x22\x51\x84\xe7\xb0\x00\x0e\xea\x80\x3a\xe6\x64\xef\x6f\xc7\x13\xbc\x44\x66\x8a\xea\x9d\x20\xdc\xcf\x74\xdf\x72\x4b\xa5\x22\x1f\xc9\x49\x4e\x3d\x36\x71\x70\xfc\xb1\x0c\xab\x0b\xe2\xa0\x0e\x50\x24\xcb\xf6\x68\xdd\x48\xba\xc1\x5c\xf5\xb8\x2b\x22\x84\x0b\xad\xb4\x93\xa0\x6d\xe3\xf8\xd2\x2f\x87\x64\x6d\x77\x91\xc3\x52\xf8\x31\x5b\x10\x07\x75\xc0\x41\xf7\xe3\x15\x83\x64\x9d\x29\x26\xcf\x3f\xb7\xb7\xb4\x66\xac\x39\x57\x4b\x19\xb3\x97\x73\x0e\x27\x28\x56\x73\x63\x9a\x2c\x67\x60\x75\x41\x1c\xd4\x01\x77\xcc\x1c\xbf\x96\x6e\x3c\x5b\x85\x09\xce\x85\xa3\x22\x44\xe7\x56\x84\x4f\x95\x9f\x94\x98\x49\xc8\xeb\x45\xf6\x47\xc9\x06\xbc\x61\x0e\x80\x38\xf8\x3c\xe0\xf1\xf7\xfc\x05\x74\xef\x7e\x7e\xfe\xa2\x39\x79\x9d\x5e\xd7\x51\x5b\x50\x03\x33\xac\x9b\x3d\x88\x2b\x66\x97\x91\x82\x2f\x44\x87\x23\x20\x92\xda\xb7\x7e\x2b\xa3\xae\x1b\x96\x65\x80\xb8\xb3\xf9\x8b\x28\x86\x8e\x1d\xbb\xd6\x0b\xf4\x3d\xef\x5b\x6a\xc6\xfb\x47\x35\xf8\xf8\xf1\xf6\xa4\x66\x06\x0f\xa8\x37\x66\x6b\xe2\x1f\x7c\xbc\x0c\xab\x0c\xe2\xce\xe6\x2f\x32\x61\x3b\x2b\xfd\x61\x02\xb2\xe2\x6a\x0a\x5a\x58\x28\xad\x12\xbf\xd2\xa6\xf8\xed\x9f\x0d\x70\xd5\xa2\xba\x1c\x2b\xf7\xff\x76\x85\x55\x06\x71\xfe\xd2\x18\x90\xab\xe1\x23\xf4\x4d\x56\x54\x1c\xe5\xaa\x96\x5d\xa5\x4e\x0a\x41\xcd\xcc\xb5\x1e\xec\x81\x34\xd1\xf6\x51\x1a\x67\xa9\xaf\xac\x68\x7d\xd2\xf0\xfc\x05\xf4\x24\xf0\xe9\xfc\x45\x46\xaf\xd0\x83\xe8\x99\xef\x1a\x31\xaf\xc5\xe0\xef\x42\x6b\x57\xd2\x56\xfc\x45\xea\x8f\xfa\x62\x37\x4d\x14\x98\x9e\xa3\x2c\x0c\x9e\xce\x18\x23\xba\x9f\xd8\x2f\xe8\xf1\x2b\x31\xec\xdc\x7b\xba\x74\x30\x57\x82\xa9\x71\x73\x76\x41\xe7\xf3\xb3\x89\x6b\x9b\x54\x39\x9d\x2e\xff\x6d\xf9\x0b\x68\x68\xa7\xf2\x97\x7e\x68\xfe\xa2\x94\x3d\xad\x5b\x51\xa1\xe2\xab\x77\x27\xba\x03\xbd\xf3\x99\x27\x36\xda\x9d\xb8\x72\x5e\xd9\x2f\x76\x21\x0a\xfe\x0e\x4a\x64\xa8\x17\x91\xbf\x88\x9f\xc9\x5f\xea\xa3\xd3\xcb\x07\xac\x1c\x76\x55\x33\x7d\xde\x3d\x52\x6b\x18\xbd\xcf\x98\xd8\xf1\x23\x7e\xce\x64\xf4\x9d\x9b\x26\x87\xcf\x1b\x9c\x0b\x39\x9a\x71\x36\x7f\x79\x4c\xa2\xc8\x86\xc0\x51\x45\x39\xf3\x94\x91\x58\x19\xf3\x53\x21\xd1\x7e\xb8\x7e\xae\x20\x72\xf3\xf8\x77\x0b\x76\x23\x8e\x8d\xea\x0b\x39\x88\x72\x36\x7f\x79\x52\xae\xbd\xb3\x78\xa3\xe0\x6b\x61\xe4\x9e\x7c\xe2\x4e\xd7\xfe\x15\xd1\x5f\xc7\x54\x6f\xc5\x8c\x18\x76\x5a\x1e\xc6\xe0\x33\x0a\x5e\xc8\x68\xcf\xe6\x2f\x6b\xac\x45\xc3\xf5\x77\xdb\x33\xef\xcb\x97\xa7\xd1\x31\x07\xb5\x38\x52\x22\xcc\xfc\xf1\xa6\xf2\x1b\x34\xd3\xb8\xf5\xc8\xb7\xc8\xf4\x42\x46\x7b\x36\x7f\xf9\x51\xa5\x96\xc5\x61\x53\x33\x6e\xad\xc9\x26\x7b\x44\xd3\x5f\x27\xb6\xb9\x39\x92\x46\x8b\x8c\xf8\xdc\xdb\x82\x47\x31\x51\xbb\xf3\xc2\xf2\x17\x90\xba\xe7\x3e\x7d\xd2\xf1\x27\xb0\x19\x15\xcb\x4e\x78\x59\x78\x3e\x2b\x5a\xda\xf5\xe1\x6c\x97\xf7\x13\x82\x81\xf7\x11\xa2\x8b\x78\xfc\xb3\xc5\x5f\xe0\x47\x6d\x01\x1c\x74\xb9\x1d\x69\xb7\x15\x4e\xb8\xaf\x55\x47\x8f\xf0\xe4\x11\xd7\x2a\xc1\xfb\x17\xa3\x59\xeb\xe6\x4f\x14\x6f\x27\x5e\x9e\x5d\xd1\x37\x55\x90\x85\xff\x89\x1a\xc0\x9d\x79\xfc\xc8\x2b\x63\x1b\x2d\x21\xe0\xcd\x90\xaf\x12\xeb\x35\x81\x48\xdd\xe1\xe5\x6d\x9a\xbc\xfa\x41\xa6\x7b\x63\x57\xbd\xc5\x22\xee\xbe\x86\x3f\x7e\x04\xe0\xa0\xcb\xed\xab\x2b\x2d\x55\xb1\x81\x71\xa6\xfa\x48\x29\x2c\x9e\x4d\xfe\x26\xdb\xbf\x47\x1e\xe9\xbe\x90\x9e\x34\x10\xd1\x91\x1e\x28\x31\xd3\x86\xd5\x05\x71\xd0\xef\xcb\x9a\xb6\xfd\xd4\x82\xe3\x50\x94\xcb\xa1\x2a\xbd\x31\xf4\x7e\x99\x2b\x2f\xee\x8c\x5e\x37\x8f\xcd\x58\xe9\x51\x5b\x49\xc8\x34\x3c\x7f\x01\x71\xfe\x92\x18\xff\xca\x5f\xfa\xff\x9a\xbf\x80\xa6\x91\xf3\x0c\xf8\xbd\x70\x90\x27\xf6\x2a\xf8\x37\x4f\xd2\x9b\x50\x2c\x75\x97\xa1\x45\xe1\x38\x6b\x7c\x91\xb9\xae\x84\xd5\xe9\x3b\x4d\x63\x49\xbc\xb0\x91\x83\xb8\x33\x87\xb8\x09\x35\x7d\x77\xf0\x90\x5f\xae\x88\x50\x97\x0a\x39\xad\x65\x8a\xfa\xa4\xbc\x2e\xc2\x94\xc5\x6d\x54\x5f\xc5\x60\xf2\xd5\x8b\x86\x9b\x05\xe0\xa0\x57\x74\x72\xf4\x4f\xe2\x2c\x4d\x6e\x92\x08\xce\xee\x50\x2c\x53\x80\x04\x9e\x23\x86\x72\xd8\xe8\x71\x01\xb9\x14\x72\xa5\x71\x68\x40\x18\xac\x2e\x88\x83\x1a\x30\x7b\x68\xbb\x2c\x49\xa4\x18\xa7\x56\x4f\x2a\xeb\x21\x74\xdc\x27\xad\x91\x7a\x95\x2e\xe6\xa5\x5a\x7a\x27\xee\x70\x05\x5b\x59\x0e\xac\x2e\x88\x3b\x73\x5e\x67\x9f\xe3\x2d\xbb\x68\x65\xc9\x2b\xd5\xa2\xd0\xbb\x42\x7e\x5a\x95\x2f\x0b\xd9\x9b\xc2\x1b\x9b\xf3\x10\x89\x7c\x42\x63\xb4\x59\x60\xf9\x0b\x88\xfb\xb7\x01\xff\x5a\x3c\xfe\xa2\x00\x68\x4a\x3f\xf7\xfc\xcb\x17\x7c\x0b\xe1\xb2\x25\xe4\x42\xdf\x4e\x29\xcd\x27\xf7\x07\x50\x66\x52\xfd\xcd\x46\xbf\x06\xb8\x0a\xdb\x5a\x74\xf4\x3d\x71\x87\x9f\x7f\x01\x70\x50\x05\x54\x23\x3a\x18\x65\xa9\x4f\xf4\x25\x9f\xec\x04\x1d\x29\x73\x3b\x86\x37\x51\x9e\x44\xe5\x6c\xc6\xd8\x8d\xe6\x1d\x85\x47\x4a\xce\xc3\xea\x82\x38\xe8\x25\x45\x8d\x53\x7e\xdb\xfd\x89\xe8\x64\x55\x62\x36\x9b\x61\x27\xe3\x06\x62\x08\x45\xe1\xaf\xad\x7e\x8d\xfa\x51\x1c\x2b\x8f\x69\x77\xf8\xf9\x17\x10\x07\x55\x60\x27\x23\x65\x9c\x73\xd7\x3e\x51\x73\x63\x94\x75\xa0\xd6\xcf\x2d\x9f\x7a\x84\x76\x68\x03\x7f\xfb\x8e\xac\xbe\x75\xdd\x63\xa5\x49\x58\x5d\x10\x07\xfd\xbe\x3a\xbd\x2c\x33\x37\xee\x6b\x44\x4b\x49\x31\xf7\x7c\xb9\x6d\x29\xce\xbc\x78\xff\x0f\x6a\x97\xab\x20\x42\x01\xb7\x96\x47\xd6\x06\x31\x6c\xcf\x0d\xe2\xfe\xad\xc0\xff\xae\xe4\x7f\x71\x00\xb4\xbe\x9e\x7b\xdf\x85\xfb\xcb\xae\xfc\x90\xf2\x0d\x7a\xaa\xe7\x13\x9d\x0f\xc2\x52\x59\x63\x11\xb1\xf8\x8f\x5a\x9b\x58\xfb\x49\xca\x10\x76\xf8\xe1\xb1\x26\x88\x83\x3a\x20\xdc\x3d\x6a\x40\x11\xf9\xed\xa3\x4c\x7e\x15\x49\xbe\x37\x73\xab\x64\xf1\xa6\xa7\x0f\xe2\xf7\x70\x65\xc9\xa9\xef\x47\x93\xee\x3d\xb0\xba\x20\x0e\x7a\x4d\xd5\x53\xe6\x35\xbf\x53\xa0\x6f\x2c\x4e\x99\x85\x3a\x77\xbe\x68\x12\xae\x17\xdc\x30\xbd\xa9\xed\x76\x24\x50\xe9\x2c\x66\xfc\xf5\x2d\xfc\x7e\x0e\xc0\x41\x1d\x90\xbe\xe6\x4c\x5a\xe5\x57\xf3\x96\xcd\xaa\x08\xd5\x78\x64\x3f\x1b\xdd\x72\x75\x51\x44\xf1\xc1\x5d\xfe\x4c\xb5\xfe\xcf\xef\x7f\xc3\xef\x3f\x41\x1c\xf4\xfb\x0a\xff\x38\x64\xa0\x7d\x12\xd4\xab\x7e\xff\xf8\x67\x40\xa4\x88\xe6\x8a\xa8\x30\x87\x1c\xee\x2f\x4c\x01\xe4\xec\xe5\xec\x09\x7f\x46\x98\x03\x20\x0e\xe6\x80\x38\x20\x7f\x01\x6d\x76\xce\x73\xa0\x73\xf0\x53\xe7\x93\x17\x19\x2b\x32\x97\xfc\xbe\x54\xfb\xbe\xa4\x99\xcd\x7b\x35\x4d\x90\x41\xb9\xcc\x31\x57\xf7\xab\x9d\xd0\x14\xfe\xdc\x0d\x88\x83\x3a\xf0\x4e\x57\x3a\x70\xaa\x29\x4d\x33\x41\xc1\x26\x10\x61\x83\x8f\x69\x28\xe6\x6e\xbb\x87\x8b\x09\x63\x92\xb1\xcb\x60\xdb\x71\xe5\x26\xac\x2e\x88\x83\x5e\x53\x7d\x1c\x97\x5e\x9a\x28\x7b\x89\x6c\xf6\xf5\xcc\x17\x06\xb4\x62\x51\x77\x56\x0f\xad\x4d\x52\xef\xd2\xca\xa3\xcd\xbd\xac\xd7\x84\x9f\xaf\x03\x71\x50\x07\x2a\x04\x68\xde\x1b\x3b\xb4\x97\x4e\x53\xa7\xd2\xb0\xd2\x72\xeb\xe6\x84\x6d\x45\x47\xdf\xa1\x36\x63\x61\x8e\xdf\xb7\xbb\x17\x80\x00\xab\x0b\xe2\xa0\xdf\x97\xb3\xcf\x5b\xf4\x1b\x8d\x1c\xc6\xb4\x48\x72\x51\x0e\x7b\x99\x92\xf2\xf7\x46\x1f\x69\xc6\x8e\x3e\xc3\xb0\x10\xec\xaa\x14\x32\x2a\x98\x03\x20\x0e\x3e\x0f\x00\xf2\x17\xd0\xce\xf3\x3c\x07\x24\x50\x88\x89\xa2\xda\x9c\xd3\x87\x8d\x8c\x92\xb7\x4a\x6f\x3f\xe2\xa4\xb4\x48\x51\x63\x15\x7f\xe3\x3a\x39\x9b\x54\xe6\xd3\xce\x06\xcf\xca\x00\x1c\xd4\x81\x02\xaf\x92\xdd\x8c\x4d\xb1\x61\x89\xc0\xce\x12\xe2\xdc\xd9\x66\x33\xed\xeb\x3a\x0e\xb4\x4d\xa4\x2a\xad\x38\xb4\x6f\x32\xc6\xc7\x61\x75\x41\x1c\xf4\x9a\x6a\xe8\xad\x51\x78\xb9\x84\xb2\x5f\x9d\xbf\xa5\x28\xef\xf2\x3b\x2f\x75\x25\x2d\x15\xd7\x65\x4c\x4b\xea\x95\xad\x71\x4b\xf3\x17\x37\x58\x5d\x10\x07\x75\x80\xae\x4f\xef\x7b\x05\x01\x31\x03\xd5\x94\x7b\x58\x3e\xf9\xa5\xe0\xd7\x4e\xbf\xa6\xe9\xe3\x75\xb2\xe6\x3e\x4d\xa9\xce\x7a\x2d\xc0\x73\x58\x10\x07\xfd\xbe\xd9\xa4\x49\x9a\xf4\x03\xfd\x66\x3f\x34\xe9\x78\x59\xaa\x88\x6e\xf6\x61\xdb\x3c\x93\x56\xce\x65\xa5\x60\xb6\x14\x7b\xb9\xa7\x36\x01\x73\x00\xc4\xc1\xe7\x01\x40\xfe\x02\xba\x77\x3f\x3f\x7f\x89\xf6\x47\xa5\x53\xfa\x35\xea\x77\xeb\x84\x60\x93\x8e\xc0\x73\xd2\x71\x5d\xa4\x21\xc0\xdd\xa1\x69\x9f\x40\x96\xc7\x43\x5e\x01\x1d\x96\x65\x80\xb8\xb3\xf9\x8b\xa6\x8e\x81\xcf\x57\x87\xa9\xd4\x80\x7d\xdc\x94\x16\xae\x02\x3c\x5d\x99\x82\xe5\xb2\x67\x25\x78\xa8\xa8\x1a\x82\x44\x65\x68\x09\xf0\x64\x07\xc0\x9d\xcd\x5f\x0a\x0f\xd8\x57\xaf\xfc\x32\xf8\xc2\x19\x5a\xad\x8a\xcd\x30\xdd\x8f\x88\x6d\xf8\x34\x5f\x33\xf2\x06\x36\x56\xad\x9c\x45\xc1\x1e\x01\xac\x32\x88\xf3\x97\xa6\x82\x5c\x0d\xa5\x24\xdc\xad\x6c\xd5\xcb\xcd\xd7\x78\xbe\x08\xf2\xa5\xab\x4d\xd2\x85\xd7\x4f\x7d\x9e\x22\x2f\xfd\xfd\x1e\xe3\x66\x30\x47\xf1\x43\x78\xfe\x02\x6a\xaf\x76\x3a\x7f\x61\x78\xaf\x95\x72\x69\xa1\x6b\x21\x8f\xe3\x73\x8e\x4e\x44\xce\xdd\xb9\x01\x53\xed\xea\x9a\xcb\xe9\x59\xfb\x91\x1b\xd4\x74\x9c\xa7\x9f\xc6\x88\x0f\xbe\x86\xca\xf2\x47\x99\x7e\xd1\xfc\x1d\xf5\x58\xd2\xfe\xc7\xd9\x9b\x4f\x2d\x30\x96\xc3\x06\xca\xcb\x23\xd4\x77\xdb\x0c\x32\xfe\xdb\xf2\x17\xd0\xd0\x4e\xe5\x2f\xf8\x44\x90\xbb\xe5\x7b\xdb\xc2\x97\x5d\xd2\x39\x1b\x58\x32\x55\x7e\x55\x61\xa6\x6d\xaf\x68\x94\xbd\x91\x8b\x3a\x32\x21\xe7\x55\xfa\xa6\xf3\xfa\x9b\xee\x45\xe4\x2f\x3e\x67\xf2\x17\xaa\x69\xf7\x43\xb9\xeb\x07\x04\x3a\xd3\xfc\x1d\xb8\xf6\xd1\xbf\x1c\xa3\xaa\x63\x66\xd6\xee\xac\xef\xdf\x5c\x0a\xd2\xb0\x4c\x74\xbd\x90\xa3\x19\x82\x67\x1b\xa2\x08\x1a\x3d\x1f\xd4\x36\x7b\xda\x2b\xbe\xf0\x96\x89\x3d\x4d\x97\xbf\x2c\x3d\x49\xba\xb6\x36\xf2\xbd\x49\x48\xe4\xeb\x46\xd5\x8b\x39\x88\x72\x36\x7f\x49\x6e\x97\x41\x2e\xbe\x7f\xef\x70\xfa\xa9\xf1\x72\x39\x8d\xa4\x8a\xd4\x73\x67\x31\xed\x64\xdf\x4b\x56\x14\x4f\xe3\x8e\x1e\xe1\x87\x5c\xc8\x68\x8d\xce\x7c\x6c\xbc\xb0\xff\x55\xbc\xd7\x39\xc3\x01\x75\xad\x9d\x3c\x1f\x1b\x49\xd1\xad\xb5\xa5\x13\x27\x82\xfa\x52\x27\x94\xb2\x8e\x31\x02\xd3\x2e\x64\xb4\x67\xf3\x17\xd7\x99\xfa\x2d\xf4\xf6\x25\xdc\x03\x16\xe1\xf5\x12\x2e\xd2\xdd\x86\xae\xc3\xac\x28\x72\xf5\x15\x1a\x89\x30\x1d\x43\xa1\x8d\xd7\x17\x96\xbf\x80\xd4\x3d\x6f\xb9\xed\x41\x45\x43\xf0\x74\x67\xe3\x9a\xc1\x3b\xc6\xbb\x62\xe5\x84\x62\x8d\x79\xb0\x24\xf2\x27\x36\xae\x4f\xa6\x89\x7b\x38\xa8\x1a\x1d\xde\xa5\x03\xc0\x41\x97\xdb\xac\x56\x4a\x9c\x1a\xef\x83\xfb\xfc\x59\xf6\xd3\xe1\x15\x14\x1e\x8e\x8c\xdf\xfa\xe3\x3f\x5f\x8a\xf3\xd6\x47\xfb\x51\xa0\x8e\x6e\x0b\x3f\xa5\x00\xe0\xa0\xcb\x57\x22\x93\xce\x27\xe2\xde\xa6\x7e\xa9\x3f\x9c\xb3\x48\x19\x13\xdf\x85\xba\x47\x78\x7f\x6d\xd6\x31\x75\xfb\x93\xd7\xb4\x7a\xcf\xc3\xb7\x5c\x20\xee\xcc\xd3\x27\xcd\xc1\x54\x3f\x15\x98\x95\x31\x48\xd4\x65\x29\xed\x89\x2c\x7d\x54\xd6\xcc\x0c\x42\xb1\x3d\x9f\xdf\x0f\xf4\xe8\xfb\x52\x06\x7f\x94\x1c\xc4\xf9\x4b\x22\x50\x9d\xae\xbb\xb2\x7b\xed\xfb\x9d\xd0\xf8\x04\x9d\x2d\xbc\xaf\x77\x08\xda\x50\x2d\x86\xb8\xa4\x14\xeb\xcc\xb9\x5b\x48\x1f\x6e\xb5\x79\xde\x48\x87\xe5\x2f\x20\xee\xdf\x8f\xfb\xfe\xcf\x7c\xf5\x97\x0d\x17\x68\x1a\x39\xcf\x80\xe7\x4d\x5f\x82\x11\xfc\x46\x35\x9b\xd2\x91\x0c\x2f\xe3\x5a\x23\x8a\xa8\x09\xb7\x24\x6a\xf4\x19\x8f\xf6\xdd\xe9\xe7\x97\x91\xec\x84\x8d\x1c\xc4\x41\x0d\xc8\x95\x09\xfe\x86\x30\xa3\xc1\x64\xd6\xb3\xa4\xde\x85\xcd\xe1\xa5\xe1\x21\x3b\x7d\xa2\x7f\xeb\xb1\x80\x3d\xe9\x0a\x32\x31\x0e\xfc\x09\x34\x10\x07\x35\x60\xcf\xc3\xb7\x81\x24\xf5\x8d\x82\x91\x3f\x97\x92\x1e\x45\x73\x20\x7b\xf9\xb7\xf1\x9d\xea\xcb\x14\x97\x1d\xf1\x0d\xc5\x82\xc2\x90\x60\x75\x41\x1c\xd4\x00\x13\xc6\x1c\x2e\xec\xa2\x35\xdb\x6f\xd8\x1d\x6f\xa7\xef\x54\x19\x75\x0e\x36\x28\x07\x19\xd5\x54\xae\x0c\xee\xa1\xa1\x7f\x23\x3f\x82\xd5\x05\x71\x50\x03\xa8\x53\x65\xd3\x04\x07\x7b\x3f\x0c\x3e\xf4\x76\x0b\xee\xa1\xc4\xa3\x13\x17\x20\x96\x26\x64\x27\xbc\x61\x3e\x85\x8f\xf7\x2a\x17\x1d\x96\xbf\x80\x38\x78\xff\x97\xbf\xe7\x2f\xa0\x29\xfd\x3c\x05\xc8\x27\x7c\x1f\x4b\x3a\xf5\x74\x3e\x3a\x40\xd7\x2d\x90\x76\x8a\xfc\xa4\x80\x4c\xa8\xef\xad\x12\xff\x73\x89\xbc\xd1\xe6\xaa\x2f\xfc\x50\x19\x88\x83\x2a\x30\x19\x57\xd5\x82\xc0\xfe\xa9\x6e\xcf\x07\x6b\xd7\x94\x67\xcd\x9e\xf4\xb5\xe4\x2f\x42\x8a\x2b\xfa\x05\x64\x21\x64\x22\xaf\xa2\x06\xe1\x51\x19\x80\x83\x2a\xc0\x90\xee\xce\x60\xff\xd9\x8a\xa6\x23\xe7\x4d\x8c\xea\x73\x32\xdb\xd6\x9a\xca\x29\xc4\xcf\x5f\xaa\xf2\x4f\xaa\xb2\x7f\xd3\x3b\x59\xc0\xea\x82\x38\xa8\x02\xc9\x07\x0c\xfa\xd5\x5e\x73\x57\xad\xef\x9d\x5c\x7b\xd8\xfa\xe8\x4e\x6b\xbd\x08\xae\xe3\xcb\xa3\x6d\x59\xb3\x9f\x2f\xd1\xfc\xfc\xe0\x47\xb6\x40\x1c\x54\x81\xbc\xc4\x49\x3f\xea\x83\xcf\x19\xdf\x4e\xbe\x34\x6b\x33\x72\x10\x3c\x30\x08\x96\xc4\xdf\x0b\x95\x2b\x4d\x9d\x97\xc0\xd0\x69\xe9\x86\xed\xb9\x41\x1c\xbc\xef\x83\xe0\xdf\xef\xbb\x40\xeb\xeb\x79\x0e\x90\x6d\x1e\x48\x0d\x15\x4a\x26\xd8\x77\x68\x5a\xaf\xf1\x33\xa8\x20\x68\x71\xf8\xe6\x0e\xe2\x7c\x34\x4f\x95\x68\xd7\x7a\x8a\x38\x0b\x7f\x56\x0c\xc0\x41\x1d\x78\x89\xee\x55\x2a\x83\x58\xb7\x1f\xb5\x9c\xd9\x1b\x43\x68\xad\x50\x70\x78\xcf\x2f\xa9\x46\x6f\xb2\xd4\xb0\xe3\xd6\x83\x90\x57\xac\xb0\xba\x20\xee\x4c\x06\xb7\xff\x0b\x8f\x45\x00\x9b\xd2\x79\x5c\x54\xcc\x9f\x24\xa7\x0c\xf7\x8b\x82\xda\xdb\xa1\x79\x03\x72\x83\x1b\xa5\x23\xc6\x49\xbe\xf0\x0c\x0e\xc0\x9d\xc9\xe0\x90\x98\x75\x5c\x72\xc7\x55\x0d\x29\xb6\xf6\x13\xfc\x30\x3d\x34\x8b\xa2\xe3\x54\x6f\x0c\x2b\x0a\xd2\xe4\xdb\x65\xd9\x78\xc2\xcf\x82\x81\x38\xa8\x03\x8b\xbe\x0a\x7e\xd9\x71\x13\x4a\x3d\xed\x1a\xaf\x03\x32\xd0\x5a\x92\xfd\x0b\x5e\xc8\x2d\x68\x32\xaf\xea\x54\x6c\xc4\xb4\x46\x36\xc2\x1c\x00\x71\xf0\xbe\x0f\x80\xfc\x05\xb4\xd9\x39\xcf\x01\x37\x63\x0d\xdd\xe7\x8a\x22\xd1\x6f\x2b\xf0\x6a\x44\xad\xf3\x30\x05\x3f\x75\x18\x69\x97\xd7\x46\xa6\x62\x91\x7f\x12\x42\xba\x05\x5f\x0a\x40\x1c\xd4\x81\xb9\x3a\x7f\x81\xd2\x65\xef\x47\x87\xd7\xbb\xd1\x5f\xc4\x5d\x99\xcd\x21\xfb\x34\xd6\xed\xd1\xf4\x25\xb8\x5b\xa4\x52\xfa\xba\x22\xbc\xf7\x07\x88\x83\x3a\x70\xd5\x52\xbc\x69\xdf\x4c\xe1\xcb\xd7\x67\x0a\x62\x66\x29\x5e\x58\xf3\x72\x48\xa5\x54\x95\x01\x31\x22\xf2\x55\x84\xf5\x1d\xd4\x44\xb0\xba\x20\x0e\xea\x40\xc0\x75\x7f\x44\xde\x75\x5d\x6a\x43\x77\x24\xe4\xad\x92\x69\xab\xc9\xfb\xd6\xc9\x2c\x53\x9a\xf5\x31\xbf\xbf\x7d\xb0\x2c\x73\x86\x9f\xdb\x03\x71\x50\x07\xc8\x03\x3b\x31\xb8\x9f\x52\xe1\x0a\x28\xf4\x46\x57\xa7\xa7\xc5\x26\xa9\x37\x91\x1b\x48\x10\xb5\xa2\x71\x33\x5d\xdb\xee\x8b\x51\x86\x39\x00\xe2\xe0\xf3\x80\xd1\xdf\x1d\x00\xed\x3c\xcf\x7d\x1c\x99\xb2\xc6\x7f\x09\xaf\xc8\xd3\x9a\xae\x65\x03\xfd\xed\xc6\x93\xbe\x7b\x49\xfa\x35\x6d\xfd\xbe\x68\x86\xa9\x58\x81\x3f\x49\xe1\xe7\x3e\x40\xdc\x99\x2c\x9e\x70\xcd\xcd\x92\x21\xc1\xf9\x70\xcb\xa1\x74\xe9\xf2\x74\x26\xb5\x30\x6f\x01\x5b\x78\xbd\xac\x32\x65\x48\x3c\xc9\x77\x3c\x78\x06\x07\xe2\xa0\x0e\x4c\xf3\x15\xcd\x4f\x6e\x34\xed\x0f\x6a\x8e\x51\x27\x2c\xd2\xd5\x12\xf5\x7d\xd1\x8a\xae\x6c\x46\x57\x2a\x9c\x2a\xb0\x8a\xeb\x2f\x80\x9f\xb1\x04\x70\x50\x07\x4e\xcc\x6e\x15\x3c\xa3\x38\xdc\xa3\xdb\xcd\x32\x35\x5f\x0f\x35\x16\x43\x22\x99\xa4\xb7\xd4\x2d\x1b\x68\xd7\x54\xd0\x95\x7e\x97\x0e\xab\x0b\xe2\xa0\x0e\x94\xa1\x94\xdf\xd0\x64\x26\x24\x64\x15\x51\xf5\x91\xfd\xf9\xe3\x56\xa7\x62\xb7\xc0\xa0\x5e\x3f\xdd\xef\x50\x63\xe5\xa7\x3e\x61\x6e\x30\x07\x40\x1c\x7c\x1e\x00\xe4\x2f\xa0\x7b\xf7\xf3\xf3\x97\x0a\xce\x03\xdb\x1f\x2f\xe5\x5c\xb3\xd0\xcb\x26\x56\x99\x12\xb7\x9a\x95\x9a\x75\x76\xf8\xd9\x92\x95\x1d\x2a\x1f\x1e\xa3\x1e\x0f\xc2\xb2\x0c\x10\x77\x36\x7f\xb9\x5a\x72\xb5\x91\xb1\xe0\xb9\x9a\xa7\xc4\x67\xdf\x86\xae\x0c\xcf\xdd\x21\xab\x52\x5f\xc1\x0e\x73\x62\x9e\x9c\xf6\x96\x01\x64\x0c\x58\x65\x10\x77\x36\x7f\x91\x0c\xe1\xa2\x3e\x3a\x78\x66\xd0\x8a\xfa\xcc\x6e\xd2\x23\x1b\x75\x28\x22\x68\xb1\x73\xf8\x7a\x75\x4b\x65\x1c\xea\xe7\xdf\xd8\xef\x61\x95\x41\x9c\xbf\xb4\x38\xe4\x6a\x60\x24\xe1\xbe\xc4\x89\x7b\x60\x82\xaa\x2d\xd4\x20\x4a\xa2\xf8\x64\xe3\xc5\x83\xd7\x36\xee\xfc\x0c\x1f\x5f\xea\xb8\xa3\x88\xa4\x57\xc3\xf3\x17\x50\xcf\xfa\xd3\xf9\xcb\x1e\x46\x8d\xe5\xf8\x47\x7c\x49\xd5\x93\xb4\x77\x8f\xf3\x08\xc7\x36\x8f\xaa\xef\x44\xd6\x1e\x0a\x3f\xd0\xcf\x8b\x26\xfc\x71\xb8\x79\x7a\xad\x9b\x67\xbf\xcb\x3c\x68\x71\xac\x99\xf1\x07\x87\x8d\x6d\xff\x4b\xce\xca\x9f\x0c\xf4\xdd\xc9\x00\x71\x9a\x9f\x59\x81\x38\xb7\xc3\xfe\xdb\xf2\x17\xd0\xd0\x4e\xf7\x7f\x81\xe6\x2f\xa9\x1f\xec\xc3\x64\x71\xf0\x2a\x90\x77\x9d\xbc\x69\xb3\x89\x8f\x0d\x19\x5c\x26\xd3\x71\x3f\x3c\x23\xcd\xe7\xb8\x7f\x4b\x7e\x27\xe3\x22\xf2\x97\x96\x33\xf9\x8b\x6f\x52\x6b\xde\x52\x48\xd0\x47\xff\x3f\xbc\x6f\x7c\xd9\xd9\x4c\x9b\x5c\x79\xd8\xe5\xa4\xdd\xfa\x73\x7f\xef\x10\xae\x0a\x98\x97\x5c\xc8\xd1\x8c\xb3\xf9\x0b\x61\xc6\xfa\x1e\xe7\x42\x50\x62\x29\xf7\xcf\x0e\x7c\x4a\x47\x43\x1f\x5c\x62\x04\x11\xd3\x1c\x21\xfe\x89\xa8\x1a\x7f\x26\x92\xa4\x0b\x39\x88\x72\x36\x7f\xc1\x2a\x7d\x3d\x1f\xa2\xa3\xd0\x46\x91\xcc\x4e\x1e\x72\x4f\x92\x65\x73\x90\x0f\xbb\xbd\x51\xc6\x87\x58\x56\xcf\xcc\xee\xf5\x96\xcb\x85\x8c\xf6\x6c\xfe\x32\x78\x78\xcf\xef\x15\x8a\x85\x9d\x37\xc3\xd6\x87\x4e\xde\xc7\x5d\xaf\x10\x50\x8b\xab\xa7\x1e\x4c\xb7\x05\xc7\xd4\x62\x86\x38\x84\x5f\xc8\x68\xcf\xe6\x2f\x8f\x44\xef\x2a\x91\x1a\x3d\xd8\xa0\x78\xc4\x9b\x58\x6a\xc2\x1e\xf3\x87\x01\x3d\x26\x21\x4e\x49\xfc\xa7\x2b\xeb\x78\xbd\xfa\xa5\xf6\x0b\xcb\x5f\x40\xea\x9e\xb7\xdc\x3a\x5e\x6f\x7f\xc2\xe2\xa4\x23\x66\xac\x68\xc6\xf5\xe4\xa9\x90\x0b\xae\xda\x6b\x9f\xc3\x81\x0f\x2a\x9d\x89\xa1\x2e\xe3\xc2\xd2\xf0\xc7\xe8\x41\xdc\x99\x36\x86\x88\xad\xb3\x48\xbb\xb8\x4f\x14\x0f\x05\xb1\xfd\x57\x04\xb2\xa8\x47\xdc\xea\x1a\x72\xb8\xc8\x27\x1f\xbb\x67\xa3\x0b\xe8\xaf\xc0\xdb\x18\x02\x38\xe8\x72\x9b\x36\x2a\x44\x7b\x42\xf6\x60\x76\x62\xd8\xe7\x5b\xb4\x96\x48\x7f\x26\x1d\xce\x86\xb4\xd2\x5c\xa3\x5e\xdd\x48\x3e\x57\x3d\x2d\xbc\x55\x05\x88\xf3\x97\x44\x40\x3a\x5d\x17\x97\x74\xcc\x54\xe2\x0f\xcb\xec\xb6\x2a\x85\x27\xab\x02\x3f\xaf\x08\x56\xaa\x4b\x58\x55\x91\x55\x13\x6b\x08\x5d\x55\xb2\x1c\xf5\xff\x69\xe5\xf7\x77\x0e\x7a\x7d\xa5\x96\x48\xae\xcd\x79\x39\xea\x48\xd1\xf6\x62\xdf\x47\x4f\x0e\x92\xb9\x69\xe6\x5b\xf5\x5d\x7a\xa7\x83\xe1\x80\xe6\xa3\x33\x57\x38\x2c\x7f\x01\x71\xf0\xfe\x2f\x7f\xcd\x5f\x40\xd3\xc8\x79\x06\x38\xa7\x09\x93\x2d\x5e\x89\x5f\x50\x6f\x20\xe6\x1a\xff\xe8\xef\x2a\xcd\x3a\x82\xb5\x84\xe4\x25\x3f\x33\xf8\x7c\x9d\x8e\x36\x2a\x02\x36\x72\x10\x07\x35\xc0\xc3\x90\x91\x81\x30\x00\xfb\xfa\xf2\xbb\x68\x66\x61\x5a\x59\xf3\xcb\xf2\x42\x9b\x35\xcb\x3a\x7e\x0b\x4d\xdf\xc2\x74\x1c\x33\xe0\x09\x1c\x88\x3b\xb3\xe1\x62\x10\x69\x88\x8e\x59\xef\x1b\xaf\xb8\xf7\x31\x27\x10\xcf\x42\xfe\x7e\x4f\xb4\x87\x91\xea\x5a\x6e\xf2\x9f\xf8\xf1\x47\x03\xc6\xf0\x0d\x17\x80\x83\x1a\xc0\x60\x58\x45\x13\x8d\x92\x9a\xfa\x5c\xf5\xcb\x43\xfa\x96\xc3\x77\xb1\xb5\x06\x6b\x6c\x13\x98\x46\x47\xd2\x92\x94\x03\x07\x1d\xf0\x07\xbe\x41\x1c\xf4\xfa\xe2\x96\xb8\x1c\xab\x5c\x8e\x9c\x8b\xfa\xf4\x30\xe4\x7a\x25\xab\x89\x78\xf4\xed\xbb\xd6\xa6\x6f\xf1\x31\x68\x7f\xb1\xef\x07\x90\x69\xc2\xf2\x17\x10\x07\xef\xff\xf2\xf7\xfc\x05\x34\xa5\x9f\xa7\xc0\xce\x1d\xc2\x8f\xd6\x66\x0f\x6e\xac\x5c\x72\xf8\x76\xbb\x16\x83\xea\x13\x81\x24\x52\x63\x6c\xaa\xe5\x87\x34\xfb\x8f\xf9\xdb\xee\x85\xf0\x7b\x4e\x00\x07\x55\x80\xa4\x44\xce\xbc\x65\x55\x90\xb1\xd5\x84\x84\xf1\x11\xb9\x1f\x43\x68\xf2\x88\x2c\xce\xf5\xe6\x9d\x18\x5a\x8b\xa3\xaf\xd5\x6d\x46\xb0\xba\x20\x0e\xaa\x80\x8c\x97\x39\xd5\x73\x76\x5d\xfd\xfe\xb2\xa0\xe0\x0f\xe2\x06\xce\xa4\x31\xc9\xf3\x4d\x79\x26\x6e\x1d\x04\x46\x44\x16\xc8\x28\x9e\xb0\xba\x20\x0e\xaa\x40\x23\x23\x17\x4b\x1e\x4d\xe6\x4d\xbe\x7e\xca\xa9\x0c\x99\xc1\xb5\x75\x05\x4d\xa6\x23\x02\xe7\x21\xea\x7d\x35\x9b\x21\xa1\x5b\xf0\x49\x00\xc4\x41\xaf\xef\xb5\x52\xf7\x3c\x32\x24\x6a\x4c\x57\x12\x34\x82\x0c\xdc\x8f\xd3\xec\x0f\x5d\x3d\xb7\x97\xe6\xbc\xb2\x90\x7a\x83\x98\x37\x28\xcc\x61\x7b\x6e\x10\x07\xef\xfb\x00\xc8\x5f\x40\xeb\xeb\x79\x0e\x60\x76\x60\xc7\x75\x1e\xf1\xa5\x4a\x8a\xeb\xd9\xde\x4d\xd0\x1b\x46\x16\x0b\xd8\x6a\x29\x20\xf9\xb6\x2f\x46\xef\xaf\x95\x73\x19\xbe\x10\x80\xb8\x33\xbd\x3f\xcc\xe2\xb5\x51\xbf\x50\x9e\x90\x56\x5e\x43\x95\xd6\xfc\xe9\x4f\xd6\x47\x44\xd6\xba\x30\xf5\xbb\xd0\x43\x20\x21\xb2\x14\x1d\xde\x06\x0a\xc4\x41\x1d\x50\x4e\x9f\x15\xe9\xc2\xc8\xad\x91\x28\xb0\xfe\x61\x98\xf2\x8b\x95\xa8\x9a\x20\xb9\x50\xd8\x2f\x11\xbb\xf3\xa3\x09\xfe\x9e\xb5\x1a\xac\x2e\x88\x83\x3a\x10\xc0\x89\xad\xf5\xe0\x61\x82\x97\xcc\x3d\x9f\x9e\xc8\x7d\x84\x4a\x05\x85\xaf\x3f\x47\x1f\xce\x14\xbb\x0c\x11\x60\x49\xb4\xc4\xc3\xf3\x17\x10\x07\xbd\xbe\x7f\x28\x9e\x4f\xe1\xe9\x7f\x23\x4c\xe8\xc4\x32\x9f\x6f\x37\x36\x18\x78\x13\xc1\x93\x2d\x66\xeb\xea\x4c\xfa\x3e\x97\xb7\x86\xbd\x09\xe6\x00\x88\x83\xf7\x7d\x00\xe4\x2f\xa0\xcd\xce\x79\x0e\x8c\x25\x14\xdc\x97\x4e\x9a\xec\xed\xc1\xbd\x85\xbe\x91\x28\xe0\xf1\x2e\xf5\xfa\xea\x21\xfa\x95\x44\x27\xff\xb4\xc6\x3e\xa1\xf7\xba\xb0\xb1\x83\x38\xa8\x03\x87\x15\x2d\xaf\x3c\x8c\x49\x98\xde\xb3\x63\x14\xa4\x13\x3b\xd3\x2f\x79\x2c\x53\xe7\x08\xd8\xf8\x0c\x6a\x3f\xfc\xbc\x50\x30\xab\x04\xab\x0b\xe2\xa0\x0e\x14\x16\xe5\xb7\x3e\x74\xde\x50\xbe\xaf\x3d\x33\x71\x6c\x7d\x77\x6f\x2d\x58\x25\xd5\xeb\x73\x45\xd5\xcd\x9b\x5e\xbf\x3c\x55\x7f\xc3\x9f\x17\x04\x71\x50\x07\xf0\xd4\xb6\x05\x99\x02\x84\x6b\xdf\xec\x4b\x90\xc9\x1e\xaa\x50\x04\xbd\xcd\x6a\xfe\xf5\xfc\x13\x9e\xdc\x96\xda\xb2\xe5\xc2\x97\x64\x58\x5d\x10\x07\xbd\xbe\x09\xe6\x94\xa8\xed\x7e\x99\xad\xd3\x7b\xdd\xf9\xc2\x4e\x01\x26\x0e\x35\x06\x49\xeb\x2f\xfc\xfa\x96\x05\x0e\x6a\x2e\x71\xf2\x13\xc2\x1c\x00\x71\xf0\x79\x00\x90\xbf\x80\x76\x9e\xe7\xf6\x00\x1a\xeb\x49\x6b\x99\xdd\x78\xb7\x38\x50\x4e\x6b\x8b\x8e\xe4\xfe\x27\x0f\xab\xa7\x11\x45\x8a\x99\x2a\xa7\x6c\x1f\x05\x2f\xf4\x21\xfc\x4c\x11\x80\x3b\xd3\x8b\xfd\xc3\xd3\xb9\xdb\x6c\xc2\x1a\xef\xf7\xfa\x32\xc3\x04\x0d\x17\xdf\x3f\x97\xe2\x62\x4d\xcb\x27\x92\xac\xf9\x18\x1a\x4f\x5d\x06\x3f\xb3\x08\xe2\xa0\x0e\x98\x65\xbe\xb9\x4d\xcb\xaa\xd9\x71\x9d\xa7\xb2\xd8\xe2\x97\x59\x84\x60\x54\xff\xee\xfb\x6b\x76\xdf\x36\x1f\xf6\xf7\x73\xc9\x09\x3f\x87\xf7\xf5\x05\x70\x50\x07\x6a\x11\x09\x33\x37\xe4\x9f\x25\x67\xfa\xb2\xfb\x48\x1d\xd9\x46\xa9\x66\x69\x2a\xe5\x96\x59\x2f\x6c\xa9\x0a\x5a\xf8\xcf\x1c\xc3\xff\xd0\x07\xe2\xa0\xd7\xb7\x56\x5b\xe5\x6b\x81\x3d\x6d\x55\x66\x6a\xb7\xee\xdc\x07\xc1\x06\x02\x16\xca\x01\x2b\x6b\x91\x81\xdf\x66\x64\x33\xfd\xa9\xcf\x7e\xc2\x1c\x00\x71\xf0\x79\x00\x90\xbf\x80\xee\xdd\xcf\xcf\x5f\xd8\x10\xc8\x86\x6e\x85\xf4\x89\x73\x3d\x72\x2f\x9a\x63\x5d\x5a\x36\x43\x91\x17\xa4\xef\xb4\xfb\xb2\x32\xe0\xaf\x2a\xad\x18\x8d\x00\xcb\x32\x40\xdc\xd9\xfc\x85\x5c\x94\x68\xeb\x41\x5c\xff\xe2\x27\x66\xb9\xb6\x5b\xaf\xca\xf4\x1d\xd8\xc4\x78\xae\xdf\x56\xf3\xef\x7f\x70\x3d\x67\x9a\x6a\x5d\x0a\x56\x19\xc4\x9d\xcd\x5f\x2a\xff\xac\x24\x0d\x21\xf0\xa2\x59\xeb\x74\xb9\xfa\x23\xf1\xe8\xbd\xaa\x6c\x44\xff\x58\xc5\xc0\xd4\x98\x65\xe1\x7e\xc9\x8e\x42\x1b\x56\x19\xc4\xf9\x4b\x23\x20\xfe\x67\xe5\x31\xea\x09\x96\xf8\x44\x1c\x55\x24\x76\x0b\xa4\x45\xfb\x92\x5a\xc5\x37\xf6\xdf\x74\xae\x9e\xb8\x6d\xbd\xca\xfb\x81\x52\xdb\xb4\x07\xcf\x5f\x40\x2f\x02\x3c\x9d\xbf\x6c\x1a\x60\xba\x04\x09\xa8\x25\x52\xfe\xae\xb9\x32\x99\x11\x96\x5b\x58\xf6\x32\x4d\x75\x51\x93\x06\xc1\x3c\x63\x23\x2d\xd4\xec\xf4\x2b\xf3\x3c\x29\x30\xb7\xc8\xdc\x30\x99\xac\x1f\xf8\xfa\x58\xbc\xbe\x71\xdf\xcf\xf3\xbd\x38\x7f\x98\x86\x04\xe2\xd5\x2e\x4f\xaa\xac\x30\x8b\xff\xb6\xfc\x05\x34\xb4\xd3\xfd\x5f\xa0\xf9\x0b\x0e\xe3\xf3\xab\x6f\x07\xe2\x73\x57\x78\xae\x37\x1d\xff\x98\xa0\xcc\x6b\x9a\x9e\xd2\xb8\xe5\x84\x8f\x2b\x1a\x3b\xf8\x8d\xdd\x15\xf3\x22\xf2\x17\x04\x25\xe8\x3d\x7a\x06\xaa\x37\x7f\xb8\x66\x09\x9a\x03\x1b\x2d\x39\x5b\xfe\x50\xfd\xb7\xfe\x94\xae\x27\x18\x09\x39\x87\x09\x5a\x04\x8b\x77\xec\x8e\x2f\xe4\x68\xc6\xd9\xfc\x85\x2e\xd2\xe3\x79\x6f\xf4\xf6\xd8\x8b\x44\x04\xa7\x8d\xdb\xb1\x92\x2a\x16\x8e\xe6\xb5\x55\xc1\x08\x9f\x7a\x66\x9f\x88\x8a\xd2\xa6\x5e\xc8\x41\x14\x8d\x33\x1f\xeb\xae\x5d\xcb\x54\xae\xfd\xe1\x64\xff\x8a\x30\xdf\xcc\xf1\x41\x0b\x7b\xa1\x31\x3b\xf3\xfe\xcc\xcb\x16\x8d\x48\xdd\x16\xde\x3f\x74\x17\x32\xda\xb3\xf9\xcb\x65\x8c\xfd\x24\x46\x07\xd1\xd1\x05\x32\x31\x39\x8f\x5c\xd9\xc0\xcb\x94\x6b\x96\x8c\x31\x93\xf4\x98\xf2\xf1\x47\xd5\xde\x0f\xf9\x2f\x64\xb4\x9e\x67\x3e\xd6\x98\x35\xe4\xd2\x3a\x5b\x31\x05\x49\xfa\x1c\x09\xed\xf5\xba\x12\x0e\x1b\xa7\x48\x04\xdc\x46\xa2\x87\x35\xf6\x8d\xbe\xea\xb4\x94\x17\x96\xbf\x80\xd4\x3d\x6f\xb9\x5d\xdf\xf3\x4c\xc5\x5c\x65\x52\xfc\xfc\x36\x56\x90\x29\x41\xcf\xf1\x19\x07\xef\xc0\x76\x1f\xa7\x09\x0f\x11\x11\xb2\xe3\xaf\x2d\xf8\x29\x05\x10\x07\x5d\x6e\x63\xad\xc2\xbd\x4c\xae\x7c\xac\x59\x12\xf0\xe8\xff\x19\xb1\xef\x6d\xaf\x14\xf3\xe1\xe3\xcf\x99\xfd\x5b\x55\x58\x65\xc2\x32\x9f\x1b\xe0\x8f\xd1\x03\x38\xe8\x72\x9b\x47\x90\xc7\x6d\xb0\x22\x78\xa5\x22\xca\x94\x22\x39\xb8\x2b\xcd\x80\xcf\x99\x38\x48\x2f\x53\x3b\x0f\xb7\x8a\xfe\xae\x2a\x66\x1b\x7c\x19\x07\x70\xd0\xe5\x36\x7b\x99\x39\x51\x1c\x8d\xe8\xa6\xf8\x02\xd6\xfa\xe3\x0a\x09\xcd\x92\x55\xda\x90\xe4\x36\x44\x77\x0c\x1a\xa6\xce\x4c\xfd\x30\x7f\x58\x5d\x10\xe7\x2f\x49\xf5\x1f\xd7\xe1\x03\xa2\x46\xe3\x9a\x58\x50\x7e\x0a\xea\xcd\xf2\xb5\xee\x44\xc6\xcb\x2f\xd3\xb7\x31\x7e\xd3\x0c\xbc\x31\x28\x61\x7e\x61\xfc\x28\x1f\x96\xbf\x80\x38\x78\xff\x97\xbf\xe6\x2f\xa0\x69\xe4\x3c\x03\x0a\x16\x75\x0c\x57\xc3\x1b\x43\x6d\x6a\xb3\x09\x6b\x2c\xab\x68\xc3\x38\xc2\x02\xfc\x59\x4d\xb7\x72\xbd\x6e\xaf\x6f\xa6\xfe\xa8\x81\x1f\x0c\x06\x70\x50\x03\x56\x38\xc4\xb9\xda\x94\x94\x5f\xc4\xb2\x98\xad\x33\x65\xa6\xe7\xf6\x7c\xe0\x72\x75\x4c\xd8\x3d\xcc\xd7\xe4\xb0\xa3\x7b\x77\x4b\x14\x56\x17\xc4\x41\x0d\x08\x8f\xd7\x7a\x16\x28\xec\x51\xb1\x3b\x99\x2d\xbb\x90\x62\x93\x59\x37\x74\x4f\x78\x37\xda\xcc\x78\x56\xcb\x63\x2c\xd7\xff\xc4\x00\xde\x20\x10\xc0\x41\x0d\x08\x63\xdb\x7b\xf4\xfb\x01\x52\xa7\x39\x56\x55\x6f\xc4\x25\x09\x4d\xb4\x50\x8b\x95\x9f\xd1\x1c\x53\xde\xed\x01\x4b\x4c\xa9\x8c\xdb\xb0\xba\x20\x0e\x6a\xc0\xba\xf1\xd7\x37\x92\xaa\xad\xa4\x9a\xdd\xd1\x97\x1e\xec\x22\x17\x4f\xea\x47\xf5\xeb\x6e\x76\xcb\x3d\x3f\x2a\xc1\x1a\x42\xc9\x13\x80\xe5\x2f\x20\x0e\xde\xff\x45\xe9\xaf\x7b\x6e\xd0\x94\x7e\x9e\x02\x7f\xc2\xbf\x45\xcb\x64\x9e\x60\x1f\x55\xbd\x47\xbe\x3c\x59\x42\x2e\x4b\xf0\xf6\xa9\xc4\x7c\x7d\xc5\x67\xc3\x5c\xad\x7d\xd6\x17\x73\xb0\xa1\x83\x38\xa8\x02\x37\xcd\x3b\xb8\xdd\x6f\xab\x54\xf0\xa9\xdf\x59\x95\x62\xdd\x27\xaa\x63\xc1\x9d\x2a\x9c\x0d\x15\xf7\x97\x48\x60\x46\x9f\x45\x69\x86\xd5\x05\x71\x50\x05\xb8\x87\x98\xc5\x08\xf7\xb9\x7a\x32\x06\xed\xf6\xf8\x96\x8b\xf2\xae\xf0\x5b\xd0\x78\x3a\x14\xae\x73\xee\x3d\x8d\x1c\x36\xd7\x5c\x85\xd5\x05\x71\x50\x05\xee\xac\x9e\xfc\x1e\x52\xac\x6a\xc8\x28\x5f\x73\x91\x6e\xb3\xa1\x2b\xa4\x55\xcc\x46\x28\xa6\xb2\x78\x1c\x76\xa9\xa6\x4a\xd5\xfe\x09\xac\x2e\x88\x83\x2a\xd0\x69\xc5\xae\x96\x40\xd2\x17\xbf\xd7\xbd\x25\xdb\xbb\xed\x20\xbc\xec\xcc\xa9\x66\xda\x87\x3e\xa2\x13\x1f\xa7\xca\x4a\x3f\x2b\x04\xdb\x73\x83\x38\x78\xdf\x07\x40\xfe\x02\x5a\x5f\xcf\x73\xc0\xa9\x64\xf6\xaa\x08\x99\xd1\x97\xce\xe7\xd3\x2c\xf9\xb8\xb1\xc8\x1f\xf8\xd6\xde\x65\xd1\xab\x3a\xd0\xb8\x45\x46\xc8\xb7\x96\xc0\xe3\x47\x10\x07\x75\xc0\xfb\x64\x9a\x8b\x26\xbc\xb8\x7e\x73\x57\x10\xd7\xd2\xd7\xf7\x53\xb1\xff\xf1\xf0\x6b\x92\xed\x46\x73\x93\x40\xb9\xdd\x58\xb3\x6c\x58\x5d\x10\x07\x75\xe0\xa7\xa2\x6f\x2e\x0b\xdb\x77\xed\xd6\x5e\x43\x13\xb6\xf9\x23\x4b\x1b\x76\xd1\x61\x72\x5f\x46\x37\x6b\x67\x54\x2a\x52\xf2\x71\x01\x78\xc3\x2e\x00\x07\x75\x20\xe4\xb3\x95\x36\x62\xc0\xf7\xbe\x91\x4e\xd9\x95\x22\xd9\xfd\x9b\x83\xa8\xaa\xc4\x3b\xab\x7d\x1e\x2e\xac\x82\x46\x06\x47\xd9\x92\xb0\xba\x20\x0e\xea\x40\xa1\x22\x61\x63\xb9\x7c\x44\xd0\x60\x86\x92\xa7\xf7\x11\xed\x8f\x0a\x1e\xe2\xe5\xe1\x6d\x0a\x33\x01\xe5\x5a\x42\x6c\x5b\xa7\x47\x30\x07\x40\x1c\xbc\xef\x83\xc6\xdf\x1d\x00\x6d\x76\xce\x73\x60\xc2\x44\xce\x7b\x69\x81\xe4\x33\x16\x15\xd3\xa5\x08\x7e\xa2\xa1\xdd\x09\x16\xd6\x1d\x85\xcf\xc7\x9f\x35\x15\x8a\x49\x85\xa3\xe1\xcd\xe0\x40\x1c\xd4\x81\x6a\x0f\x31\xb1\xeb\x9c\x73\x4b\xeb\x32\xba\xeb\x3e\x75\x79\xcd\xae\x34\x98\x9b\x75\x11\x35\x77\xc4\x30\x6e\x78\x50\x74\xef\xc0\x9f\x6f\x04\x71\x50\x07\xdc\x39\xb4\x34\xe9\xd7\xfa\x4b\x6f\xa8\x90\x91\xe9\x97\x66\x2a\x57\x74\xe2\x36\x7e\xca\x53\x22\xc1\xa8\x78\xaa\x76\x75\xe2\x67\x1f\xac\x2e\x88\x83\x3a\x30\xce\x34\xa4\xc9\x72\x35\x3f\x30\xc7\x42\xb4\x50\x40\xf7\x20\x3e\x2d\x54\x32\xd3\x6f\x52\xe2\xb2\xe4\x96\x18\x0a\x49\x6b\x0e\xfc\xfd\x6a\x20\x0e\xea\x40\xce\x27\xef\xdb\xa2\xf7\x9a\xec\x33\x22\x45\xe2\x8e\xb1\x3a\xdb\x55\x38\x04\x27\xa8\x12\x69\x51\x2e\x87\x1b\xc7\x8e\x17\xbf\x4d\x82\x39\x00\xe2\xe0\xf3\x00\x20\x7f\x01\xed\x3c\xcf\x73\x40\x0d\x6b\xe2\x60\xc0\x77\x6a\xe3\xe3\x1e\xb3\x6a\x97\xfc\xd5\x4b\xbd\x4e\x78\x48\xb3\x74\x4f\x34\x3e\x84\xc6\xfa\xdd\x14\x41\x85\xe7\xb0\x20\x0e\xea\x40\x67\xa5\x51\x16\x7b\x54\x00\xbd\x20\xfb\x90\xda\x3d\x1b\x25\xb1\xd0\x58\x95\xfe\x68\xca\xf8\x99\x02\xbe\xef\x46\xbf\xba\xd6\xe0\xef\x97\x04\x71\x50\x07\x86\x12\x2d\x19\x5f\x52\x10\xd5\xe1\x7f\x13\x72\xc0\xac\x2c\xd9\x22\x2d\x60\x37\x68\x35\x4d\x78\xc4\x59\xf2\x65\x35\xbb\xe1\x80\x16\x56\x17\xc4\x41\x1d\x68\xcb\xa9\x7a\x66\x7e\xd3\x5e\xea\x7a\x40\xa5\xeb\x44\x8f\x03\xd6\xa5\x28\x24\xb5\x72\x6e\x0f\xea\x39\x72\x6b\xaa\x52\x9c\xaf\xf0\x6d\x06\x88\x83\x3a\xa0\xbf\x28\xdd\xf5\x4c\xc7\x3f\xe7\xcd\xe3\x67\x43\xe6\x34\xc5\xac\x64\xd2\x1b\x89\xc9\x85\x4b\x7c\x61\x04\xa2\x8f\x1b\xb1\x23\x7b\x60\x0e\x80\x38\xf8\x3c\xe0\xf9\xf7\xfc\x05\x74\xef\x7e\x7e\xfe\x52\xad\x39\xef\x62\x30\x6b\x4f\x97\x6a\x1e\x1d\xa6\x5b\xc1\xdf\xb5\xcf\x2f\x7f\x83\x8f\x42\xcb\x8e\xa9\x73\x99\x6b\x05\x49\xd4\x08\x96\x65\x80\xb8\xb3\xf9\x8b\x67\x73\x55\xc2\x02\x3f\x0a\x32\xf6\xa3\x5e\xd3\x96\x93\xda\xf6\x6b\xd9\x2b\x76\x54\x19\xc1\x62\x32\xf5\xe9\x93\xaa\x35\xa1\xb4\xb0\xca\x20\xee\x6c\xfe\x92\xed\xed\x7a\x29\x79\x2d\x54\x63\x8c\xc5\x25\x7c\x3b\x42\x72\x6d\xcf\x54\x19\xc7\xa5\x57\x31\x38\x9c\x86\xd3\x1f\x45\x81\x13\xfe\x64\x13\x88\x3b\x5b\x99\xca\xcc\x80\x2e\xed\x13\x32\x82\xe8\x27\x2a\xb5\x07\xad\xee\xb3\xd2\xc1\x36\xaa\x02\x1b\xa2\x3d\x05\x42\xa1\xee\x8f\xb0\x3f\x7c\x80\xe7\x2f\xba\x61\xa9\x91\x6f\x9b\xfa\x13\x51\xfa\xec\x31\x3c\xf2\x6d\x23\x2a\x72\x9c\x1d\x1c\x59\x93\x4c\x53\x91\x43\x11\xa4\xca\x43\x34\x4f\xe7\x2f\x6a\x3a\xe2\x1a\xf3\x4d\x51\x4b\x77\x49\x97\x72\x1a\xba\x96\xae\x78\x51\xfb\x69\xe2\x75\x92\x45\xf0\x61\x21\x89\x15\xbc\x8b\x3f\xfd\x12\x9a\xbd\xa7\x3b\x2f\xe9\x3a\x06\x31\x15\xd7\x5f\xdc\x42\xb8\xac\xa8\x1c\xa5\x15\xe1\x7c\x87\x29\x0b\x2f\xc2\xe4\x67\xe1\x0f\xdd\x38\x8d\xff\xb6\xfc\x05\x34\xb4\xd3\xfd\x5f\xa0\xf9\x4b\xe6\x31\xaf\xbe\xbf\x84\x97\x48\x3c\xfb\xaa\xb2\x94\x35\x09\xe1\x3c\x65\x03\x8b\xf4\x98\xe9\xd1\x93\xfe\x07\x72\x72\xdb\x88\x17\xd1\x92\x56\x4a\xfc\x4c\xfe\x22\xce\x3f\x25\xf9\xd5\x57\x57\x22\xd3\xdf\x67\x30\x8f\x1d\xaf\x61\xe6\x15\x92\x9d\xa9\xca\x41\xfc\x48\xd3\x43\xd1\x40\xc7\xce\xb8\x0b\x39\x9a\x71\x36\x7f\x49\x96\xd4\xe8\xe9\xfa\xa6\xf4\x2d\xd0\xf8\x15\x49\x25\xcb\x31\xcd\x75\xff\xb1\x2c\x92\x1e\xfb\xc0\xef\x16\x84\xee\xdc\x57\x47\x2e\x24\xf6\x11\x3f\x9b\xbf\x2c\xe4\xaf\xa3\x9b\x3f\x9e\x78\x98\xfd\x79\xb3\xa5\xc3\x9b\x2a\x62\x6b\xca\x7f\x64\xdc\xad\x5e\x5f\x5c\xd3\x40\x2b\xaa\xdb\xe0\xc3\x85\x8c\xf6\x6c\xfe\x72\x25\xe7\xdb\xed\xa2\xc0\x19\x25\x4a\x22\x0d\x84\xee\x4c\xbf\xfa\x63\x3b\xae\xef\xfc\xf5\x75\x86\x6f\x88\xba\x2c\xfc\x8a\xa7\x1e\x5e\xc8\x68\xcf\xe6\x2f\x02\x97\x08\x86\xf8\x90\xf3\xe4\x83\x8d\xef\xa7\x31\x22\x0b\xea\x11\x7f\x41\xee\x75\x1c\x0d\x2d\x0e\x21\x77\x3d\xd8\x6e\x26\xba\x80\xd8\x47\xef\x9f\xa9\x7b\xde\x72\xbb\xfb\x5d\x48\xca\xe9\xa9\xd8\xc1\x2f\x26\xfa\xde\xb8\xe8\x97\xbf\xe6\x67\x31\x6c\xe2\x9c\x82\xc7\xeb\x09\xae\xdf\xaa\x32\xb4\x81\xbf\x9e\x02\xc4\x9d\x39\x6e\xca\x6c\xcb\xb6\xda\x18\xee\x89\x58\x28\xe3\x18\xbc\x78\x8f\x7b\xc4\xb1\xf6\x49\x44\xf5\xd0\x6d\x6a\xf5\xc7\x94\xb3\xc3\xa8\xf0\x7e\xb6\x20\x0e\xba\xdc\x3e\xff\xa8\x37\xe8\xbf\x22\x67\xf6\xd5\x8c\xee\x8a\x15\x89\x6b\xfa\x35\xd3\x02\x97\xf6\x4a\xef\xfb\xba\x1c\xd1\xfc\x5a\xa5\xf3\x0e\xf0\xa7\x65\x00\x1c\x74\xb9\x2d\x36\xd8\x36\xc8\x8d\x2a\x8d\x30\x0d\x67\x0e\xf2\x1c\xc3\x8e\x33\x7f\xa2\x9b\xd6\xfd\xd0\x9d\x55\xa5\x51\x7a\xbd\x36\x4e\x42\x1e\x56\x17\xc4\x41\xeb\x3e\x70\x12\x13\x51\x32\x0c\xd5\x95\x6e\x17\x53\x3b\xb8\x91\x51\x94\xe6\x1e\xda\xc7\x3f\x41\x2a\x58\x17\x5d\xcf\x3c\x3c\x86\xde\x08\xcb\x5f\x40\x1c\xbc\xff\xcb\x5f\xf3\x17\xd0\x34\x72\x9e\x01\xec\x0d\xad\x91\x9a\xce\x2f\xdb\x56\xfd\xf9\x35\x06\x2a\xbb\xf0\x5a\x91\x7e\xb1\x6c\x06\x76\xef\x0b\xc5\xdc\x4c\x7b\xd5\x26\x05\x6f\x8e\x08\xe2\xce\xbc\xf0\xa0\x83\xf3\x8d\xf6\xb5\xc0\x27\x4a\x9b\x51\x98\x55\xe6\xf6\x23\x0d\x13\x1c\x8e\x93\x5b\x91\x26\xf9\x26\xed\xa3\x34\x8f\xe9\x70\xe1\x2f\x3c\x00\x70\x50\x03\x7e\x73\x3b\x0b\x19\x77\xef\x08\xea\xf7\xdc\x2c\xfe\x46\x65\xbe\xa4\xae\xce\x1f\x2d\xe4\x5e\xa8\x80\xe6\xe2\x91\x8f\x59\x22\x03\xef\xec\x0c\xe2\xa0\xbf\x94\x4d\xc9\x88\xef\xe1\xb5\x41\xa1\x9a\xac\xdb\x76\xd1\xf5\xc1\xf2\x6f\xad\x29\xe9\xf4\x47\x15\xfd\xfe\x64\xa7\x13\x6a\x6c\xf7\xb1\xc0\xea\x82\x38\x68\xdd\xf8\x19\xd4\x46\xfa\x68\x71\x76\x03\x2d\x4d\xda\xa5\x17\x73\x18\xd2\x5d\x11\xbb\x4e\x6f\xf2\xe2\x98\x63\xdd\x3f\xc6\x70\x3e\xc1\x85\xe5\x2f\x20\x0e\xde\xff\xe5\xef\xf9\x0b\x68\x4a\x3f\x4f\x01\x1a\x74\x21\xbe\x60\x39\x86\x6b\xe8\x04\xed\x86\xb1\xc8\xdd\xba\x23\xf8\xa8\x7a\x65\x32\x43\xe1\x39\xd6\xb3\x0e\x07\xc5\xab\xf0\x1e\xa9\x20\xee\x4c\xdf\x87\x70\x1d\xe6\x97\x32\xd5\xfa\x99\x75\x58\x04\x2f\xd0\xf4\xe6\xac\x19\x90\xe3\x1f\xb5\x19\x93\xdd\xd2\xbd\x49\xef\xfe\x7d\x59\x1c\xde\xf7\x01\xc0\x41\x15\x50\xcb\xff\x19\xf6\x3e\xda\x90\xaf\x01\xe9\x38\xa6\x00\x59\x7c\x2c\xf5\x4a\xc8\x87\xb2\x7a\xe4\x6f\x71\x33\x6d\x55\x45\x85\x82\x49\xf0\x7b\x04\x00\x07\xfd\xa9\xfa\x94\x0a\x7d\x1a\xac\xa4\xaa\x91\xa5\x14\x3e\xce\x0d\x3c\x14\x23\x71\xce\x97\xd2\x70\x5e\x79\xf6\xd1\xfe\x9b\x38\x6b\xfb\x18\x3c\x2f\x02\x71\xd0\xba\xfc\x38\xaa\x6e\xdc\x8b\xf2\x49\xd9\x01\xab\x9b\x1f\xfa\x14\xa5\x43\x67\x0d\x89\x29\xea\x34\xb4\x82\x8b\xc7\xfd\xef\xa6\x13\xc1\xcf\x3e\x80\x38\x78\xdf\x07\x40\xfe\x02\x5a\x5f\xcf\x73\x60\x73\xc1\xf7\xcd\xe0\x40\xfd\xe2\x9b\x81\x1b\xfc\x5d\x43\xb3\xc8\x6f\x8a\x33\x4d\xcd\x0f\x23\x73\x19\xc2\x86\xee\xc9\x62\x4d\xd6\xc2\xc6\x0e\xe2\xa0\x0e\x20\x10\xa5\x91\x4d\x76\x73\xe6\xd5\xc6\xd2\x13\xec\xa3\x63\x7d\xa5\xa5\x23\xea\x50\x39\xa6\xaf\x78\x36\x54\xce\x77\xbf\x94\xee\x3b\xac\x2e\x88\x83\x3a\x60\x2f\x27\x4a\x11\x3e\x74\x55\xe6\xcb\xda\xb2\xc9\xf2\x17\xc4\x78\x82\xe5\x4b\x52\x97\x62\xff\xfc\x1c\xf0\x1a\x08\xb5\xbf\x2d\x0d\x7f\x0c\x11\xc4\x41\x7f\xab\x42\x02\x75\x55\xa4\x48\xf7\x2d\x7d\x97\x85\x89\x7b\xd1\xd7\x13\x75\x25\xd6\x48\xcd\x04\xd9\xf3\xb5\xf6\xab\x13\x67\x54\x10\xe1\x0b\x17\x88\x83\xd6\x95\x28\x53\x91\x6f\xa8\x7f\xfc\x7b\xce\x6b\x50\xea\xc4\xb6\xb2\x39\xe5\x26\xa2\xf8\x8e\x11\x56\xd2\x1c\xdf\x5d\xa6\xf7\xdf\x2d\xc4\x60\x0e\x80\x38\x78\xdf\x07\x40\xfe\x02\xda\xec\x9c\xe7\x00\xb1\x15\xc3\xda\xfa\x0e\xf7\x8d\x67\xac\x1c\x56\x56\x64\xe1\xc1\x2f\xeb\xdc\xe6\xaa\x4d\x36\xf7\xe4\xcb\x7a\xb6\xd5\xae\x35\x7d\x80\x3f\x84\x0b\xe0\xa0\x0e\x20\x93\x59\xef\xec\x33\x9b\x3a\x5d\xd5\xd4\x9d\x34\x91\xeb\xab\x5d\x50\xa0\xe0\x5c\xe5\x64\xbf\x2b\xbb\x5d\xa1\xd9\xe0\xd3\xf0\x00\x56\x17\xc4\x41\x1d\x28\x53\x2e\x3a\x1e\xda\xc2\xe2\xee\x32\x0e\x20\xad\xd0\x90\xff\xb5\x6e\xfe\x8a\x34\x82\xfd\xa7\x34\xe5\x0f\x9a\xaf\x13\x09\xb6\x8f\x61\x75\x41\x1c\xf4\xb7\x9a\x8d\xf8\xc4\x67\x31\x28\x76\xd9\x55\xf2\x09\x71\xd9\x5e\xef\xd6\x1e\x67\xc0\xed\x1c\x7d\xf2\x54\x9b\x84\x91\x14\x4d\x27\x21\xf8\x3b\xc8\x41\x1c\xb4\x2e\x99\xca\x97\x96\xd4\xaf\xdb\x5c\xcb\x44\xb9\x05\x7e\x0f\x8b\x2f\xfd\x5c\xee\x79\x51\x53\x99\xbd\xc3\xc2\xa1\x3d\x64\xfa\x98\xfb\x39\xcc\x01\x10\x07\x9f\x07\x00\xf9\x0b\x68\xe7\x79\x9e\x03\xbd\xe2\x28\x6d\xd9\x91\xe9\x42\x8d\x54\x2f\x55\xa5\xb1\x66\x56\x79\x3d\x8e\xee\x11\xb7\x0a\xfa\x51\xea\x8f\x68\x2b\x0f\x5b\xc2\xff\x5f\x81\x38\xa8\x03\x68\x9f\xbe\x88\x1c\xa7\x86\x62\xd1\x89\xb8\x38\xbd\x91\xa3\xee\x8a\xf6\x08\x2b\xa8\x15\xb3\xeb\xd5\x39\x1e\xbf\xa3\x20\x43\x73\x1b\x56\x17\xc4\x41\x1d\xf8\xbe\xc2\xe1\xfe\x7c\xee\xa4\x3c\x25\x7a\xb6\xed\x51\x14\xc5\x2b\x52\x43\x19\xb3\x00\x94\x77\x4c\x6d\xa6\x0e\xf4\x02\x4c\x48\xf0\x3f\x9b\x80\x38\xe8\x6f\xb5\x12\x65\x10\xab\x5f\x9e\x48\xc6\x6f\x7c\xc3\x9e\x45\x5f\xd5\x8e\xd9\x9e\xe9\x58\xb7\xe3\x8d\x14\xe1\xec\xb2\x98\xd5\xe2\xe3\x69\xf8\x9f\x8f\x00\x1c\xb4\x6e\xb2\x2a\xaf\x74\x44\xb6\x49\xd2\x8c\xdb\x55\x7d\x91\xc2\x50\x27\x87\x63\xf6\xd9\xa3\xb6\x31\x36\x1f\xb6\x15\x8e\xbc\x9c\xd6\x5f\x30\x07\x40\x1c\x7c\x1e\x00\xe4\x2f\xa0\x7b\xf7\xf3\xf3\x17\xb9\x9f\x6b\x46\x1e\x34\x78\x01\xe3\x39\xe9\x49\x44\xbb\x7e\xae\x0b\xec\x69\x09\x29\x9a\xb7\x39\x64\xfd\x3f\x51\x3d\x7b\x97\xb4\x0a\xcb\x32\x40\xdc\xd9\xfc\x45\x32\x5c\x80\x3d\x62\xa8\xa3\x22\xce\xe6\x9b\x48\x78\x1c\xb1\x2e\xb2\x20\x6b\xde\xf5\x9b\xbf\xae\xac\x8d\x09\xc8\x59\xdd\x14\x80\x27\x3b\x20\xee\x6c\x4a\xe2\x2d\x33\x64\xee\xad\x7e\x38\xce\x71\x58\x71\x7b\x63\xf2\xb9\x58\x38\xb7\xd8\x40\x95\x8e\xab\x0f\x9d\x22\x4d\xf6\x44\xa8\x80\x18\xac\x32\x88\xf3\x97\x46\xc0\xff\xcf\xca\xc6\x15\x65\x33\x2f\x96\x08\x03\x14\x4e\x6e\x84\x4b\xc9\x61\xcd\x59\x70\x33\x23\x05\x13\xb0\xcb\x5a\x06\x25\xe2\xa3\xe7\x72\x2f\xc2\xf3\x97\xbb\x14\x7c\xb4\x52\xe1\x65\x2f\x26\x6d\xbf\x93\x0d\xa0\xe4\x27\x24\x6a\xed\xd2\x46\xbc\x77\xfd\x95\xd8\xe5\x72\x7d\x15\x8d\x1d\xef\x74\xfe\x52\x1c\x17\x49\xc2\xc3\xf4\x02\x21\x18\xb7\x19\xe9\xa6\x8a\x4d\x2f\xce\x2f\x2f\x66\xe2\x45\xb9\x25\xf3\x9b\xc1\x79\x33\x2e\x38\xa3\xa7\x50\xd1\xd0\x57\xad\xc1\x15\xa6\xa3\x2c\x2b\x87\x5d\x2a\x98\x11\x34\x9c\xaa\x6a\x43\x77\xbf\x53\x10\x7d\x11\x40\x40\x8c\x4a\xf8\xba\xf8\xdf\x92\xbf\xfc\x42\xfd\x67\x43\xfb\x3f\xf9\x8b\x14\x82\xe4\x99\x76\xa9\x74\x6e\x8e\xde\x8f\x78\x97\xfd\x28\x7e\xc7\x1a\x27\x8f\x60\xef\x3e\xca\xc4\x99\xb1\x9f\x67\x1c\x1e\x98\xb9\x9f\x2d\x47\x9f\x77\x11\x01\x8c\xcf\x99\x00\xa6\xec\x85\x6d\x2c\xb6\x15\xad\x2e\xd6\x83\x69\x7b\xec\xa0\x05\x16\x9c\xea\xc1\x6b\x0f\x0b\xa5\x38\x43\xa5\x91\x51\x5e\x5b\xa5\xcc\x5f\xc8\xd9\x0c\xa1\x33\xd9\x40\x2d\x3a\x13\x95\x71\x03\xf6\xe5\xc6\x0a\x0b\xf2\xe9\xae\x4d\x46\x93\x05\x4a\x4b\x5a\x2b\x84\x8d\x6b\x88\xa3\x98\x7f\xe2\x46\x15\x2e\xe4\x24\xca\xd9\x00\xc6\xdc\xa9\xe5\x2b\x69\xe7\x2d\xb6\x9a\xb7\xe6\xaf\x1c\x1c\x43\xbd\x4a\x32\xaf\xf8\x27\xe6\x06\x0f\x1e\xe2\xcc\x11\xa0\xf3\x7a\xb3\x5e\xc8\x68\x1d\xce\x7c\xec\xcd\xe5\xe1\xe5\xb9\xd1\x1a\x04\xa3\xf4\xca\x14\x13\x39\xe6\x6c\x2d\x79\xf6\x14\xeb\xd6\x7c\x5a\xea\xe5\xd0\x6c\xab\xe4\xf7\x46\x17\x32\xda\xb3\x01\xcc\x10\x57\xb8\xb7\xd0\xb7\xd7\xf7\xbc\x7e\x15\x98\x47\x2f\x90\xf4\x86\xe3\xd5\xf3\xdd\xc7\xea\x41\xea\x5f\xab\x89\x56\xb6\x7b\x7d\x01\xef\xbd\xd6\xfb\x67\xea\x9e\xfb\xee\x93\xa8\xe0\x3d\xdb\x37\x38\x4f\x26\xb3\x7b\xf1\xcd\xf1\x3f\x19\x08\x64\x70\xac\x47\xf1\xb4\x28\x54\xeb\x28\xef\x60\xfb\xa3\x99\xc1\xd6\x19\x10\x07\x5d\x6f\xb5\x65\x73\x19\xf3\x04\xb5\x9c\xad\x52\x9c\x39\xaa\x06\x0e\x6e\xb5\x07\x76\xde\x4b\xf4\x52\x22\x89\xf9\xf6\x85\x7b\xf0\x07\xcb\x25\x58\x5d\x10\x07\x5d\x6f\x93\xae\xdf\x0c\x6e\xc9\x31\x22\x21\x7e\xe2\x39\xc7\x57\xbc\xa9\xd0\xa9\xc8\xc4\x4a\xe0\xc6\x71\xd9\xc4\x86\x5e\x6b\x4a\xd7\xdb\x0b\x56\x17\xc4\x41\xd7\xc5\x8d\x71\xee\xcf\x8e\x4f\x19\x7d\xf2\x90\x9b\x83\x06\x87\xe7\xb5\x2b\xa5\x90\x62\x5b\x8e\x39\xc5\xef\x56\x07\xd9\xf5\x49\x95\xc3\xfb\x09\x80\x38\x7f\x49\x04\xfc\xd3\x75\x29\xa9\x0c\x11\xda\x65\xae\x61\xa8\xa5\x95\xfc\x21\x55\xe7\x35\x31\x78\x74\xe3\xc3\xcb\x4f\xb8\xf8\x89\xc9\x25\xbd\x4f\x49\xf9\x3e\xc2\x6e\xbf\x41\x1c\xac\xfd\xc7\xff\x4c\x58\x7f\xd9\x72\x81\xe6\x91\xf3\x14\x68\x09\x65\xf2\xad\xb5\x55\xe3\x58\x1e\xd6\xc0\x92\x7e\x29\x4d\x71\xd3\x7f\x63\xfa\x5d\xa3\x41\xfb\x1e\xb1\xc6\xbb\xab\x27\x8b\xf0\x5e\xc9\x20\xee\x4c\xeb\x4d\x42\xad\x77\x4f\x88\x28\x22\xd0\x23\xf4\x07\xde\xeb\x60\xed\x16\xd7\xdc\x58\x60\x58\x9e\x7c\x84\x3d\xfc\xe3\x3d\xf5\xdd\x67\xc2\xf0\xd6\x9b\x00\x0e\xaa\x80\xed\xe6\xb3\xfe\x80\x27\xc1\xbf\x98\x7c\x0a\x9f\xfa\xe2\xa7\xe3\x97\x60\xbe\xd2\x4a\x09\x8c\x6a\x32\x72\x5d\xbf\x8d\xb7\x6f\x0b\x3f\xa6\x00\xe2\xa0\x0a\x20\x34\x4a\xb8\xf7\x5d\x73\xed\xdf\x77\xb9\xb5\x5a\xdc\x3f\x8e\xc0\x6d\xda\x6a\x64\xac\x17\x19\xc3\x78\x98\x1b\xa5\xcf\x50\x04\x3f\xce\x0e\xe2\xa0\x0a\x3c\x18\x78\xd7\xac\xc4\xad\x2d\x37\x52\x37\xc2\x81\x35\xdc\x21\x1f\x58\xb0\xe2\xb3\x38\x6d\xdd\xfc\xf4\xae\xb2\x35\x12\x27\x89\x24\x4c\x01\x10\x07\xef\x00\xf3\xf7\x04\x06\x34\xa7\x9f\xa7\xc0\x75\xeb\xb0\xdb\xe5\xc8\xf7\x09\x89\x6d\x31\x34\x1a\x7e\x4d\x49\x70\x84\x16\x72\xe7\x7a\xca\xfb\x9a\x8d\x19\xb9\xe9\x2d\x78\xc1\xdb\x40\x81\x38\xa8\x02\x34\x31\x95\x61\xc9\x7d\xd9\xea\x6f\x85\x66\xb4\xde\xbe\xa7\xc1\xc5\x6c\xfb\x2a\xae\xc7\xdc\x63\xf0\x61\x64\x9f\x78\x09\xcf\xe6\x2a\x3c\xd9\x01\x70\x50\x05\x30\x4b\x74\x0d\x7b\x89\x4f\x8c\x9b\x2c\x58\xdf\xa3\xaa\x3f\x8a\xe3\x2b\xd6\xd3\x60\x89\xd7\x52\xcb\x6e\xfe\x36\xf7\xec\x0b\x0b\xfc\x34\x3b\x88\x3b\x73\x87\xf4\xfd\x6d\x1b\x32\xee\x84\xb7\xaa\x0a\x26\x72\x5b\xfd\x4e\x55\x97\xe5\x63\x1d\x5d\xd5\xdf\x78\x9a\x08\x75\x22\x54\x93\xe3\x0c\xf0\x2e\x28\x00\x0e\xaa\x40\xdb\x31\x16\x4e\xd0\xfb\x47\x91\x69\xad\x0c\xef\x9e\xd3\xfa\x37\x91\x0e\x49\x3e\x48\xbe\x7d\xdf\xf1\xa0\x4f\x98\x86\x32\xf9\x28\x08\xb6\xeb\x06\x71\xf0\xce\x0f\x42\x7f\xbf\xf3\x02\x2d\xb0\xe7\x39\xb0\x35\x1c\x4e\xe0\x17\xb0\x40\xed\x1d\xe0\x6f\x92\x3a\xfe\x86\x2d\x79\x3f\x9c\x20\xf2\xc7\x3d\x72\x1c\x26\xe4\xec\xef\x45\xac\x28\xb0\xb1\x83\x38\xa8\x03\xe3\xde\xc7\x8e\xe3\xc9\x9b\x2a\x3a\xbd\x36\xf2\x33\xf7\x13\xf6\x8a\x44\xab\xc9\x3b\xe3\xa9\x62\xd8\xf7\xae\xd5\xbb\x3e\xce\x85\x37\xb6\x06\x71\x50\x07\xfc\x52\x9e\xaf\xca\x33\xef\xe9\x21\xf6\x4d\xc6\xc8\x79\xab\xcb\x7c\xd3\xaf\xe8\xd8\x8b\xce\xcf\x99\xbf\xc4\x19\xfb\x87\xa5\x9e\x04\x56\x17\xc4\x9d\xb9\xf3\x7a\xd6\xf9\xb2\xdf\x64\x47\xa2\xd1\x23\x37\xe9\xc6\x57\xef\xe1\xc0\xc8\xac\xe7\xf7\x17\xe8\x6b\x45\x8f\x04\xed\xa9\xe2\x70\xe0\x2f\xe4\x07\x71\x50\x07\x6a\xf5\xda\x5f\xc5\x04\x62\x1b\x69\x37\x30\xa7\x30\xb8\x2f\x69\x33\xb0\x7c\x53\x24\x6f\x6b\xfe\x14\xad\x44\xde\xfc\x78\xb6\xf1\x3b\xfc\xc9\x03\x00\x07\xef\xfc\x00\x48\x60\x40\xbb\x9d\xf3\x1c\xa8\x93\xa1\x4e\x21\x33\xe9\x33\x9a\x19\x7a\x23\xda\x5c\xeb\x9f\x5f\x81\x2c\x27\xe0\x34\x1e\x7a\xaf\x13\xb9\xdd\xd5\xe8\xaa\x0f\xfc\x54\x11\x88\x83\x3a\xd0\x7f\x6b\x92\xf1\x0f\xf2\x93\x76\x92\xf8\x2b\xad\x87\x14\xca\x4a\xb6\x42\x1c\xc2\x1e\x3c\xf7\xfb\xbc\x3a\xf6\x86\x49\x17\x2b\xe1\x09\x2f\x88\x83\x3a\xa0\xa4\x37\x6d\x54\xd6\x33\x73\x2c\x8a\x23\x17\x97\xd6\x33\x14\x47\xb3\x16\xae\x86\xab\x3b\xc1\xa2\xb6\xce\x59\x84\xd1\x73\x72\x0f\x56\x17\xc4\x41\x1d\x28\x90\x25\xfc\xbc\x21\xc6\xfc\x4c\xba\xf7\x65\x06\x99\x32\xed\xd8\x13\xd9\x24\x51\x9f\x0c\xf6\x11\x9e\x50\xc6\xb7\xbd\x1d\xaf\x77\xe1\x87\x42\x01\x1c\xd4\x01\x2d\x07\x23\x7f\xf7\x09\x6b\x5e\x11\x73\xaa\x2d\x53\xaf\x79\x47\xc2\xf2\x97\x49\x1b\xea\xae\xae\xb4\x14\x2e\x45\x15\xfe\x9e\x1f\x61\x0e\x80\x38\xf8\x3c\xe0\xf0\x77\x07\x40\x5b\xcf\xf3\x1c\x58\xdc\xa0\x0a\xa1\x43\xeb\x4c\xcd\x29\x4e\x7a\x9b\x55\xcd\x31\x6f\x2a\x31\xbd\x27\xe5\xf9\xce\xa3\xe9\x79\xaa\x8a\x38\xb2\x3a\x1e\x6c\xec\x20\x0e\xea\x40\x20\x7e\x5d\xbc\x3d\x9b\xa0\x4c\x7d\x8a\x2b\x59\x0d\xe6\x9f\x2f\x06\x34\xea\x11\xc3\xb9\xc1\x72\xfd\x5a\xea\xbd\x81\x52\x7c\xf0\xae\x3a\x20\x0e\xea\x00\x8a\x28\xf6\xf5\xac\xb0\x4d\x9c\x9b\xbd\x3f\x94\xf5\xcb\x2f\x59\xc7\x1a\xdf\xc6\xb9\x27\xcb\x1a\x85\x6f\x6c\x7e\xa3\x45\x36\xe6\x17\xac\x2e\x88\x83\x3a\xf0\xf2\xf1\x2d\x6f\xf4\xd4\x81\x50\x8c\xad\x82\xd0\xfe\x16\xb2\xec\x8d\x01\x54\x3e\xbe\xaa\xb2\x6b\x18\xea\x39\xc4\x47\x7c\x61\xf0\x9d\x31\x88\x83\x3a\xd0\xe3\xcc\x1a\x81\xfc\xf8\x99\xab\xf2\x91\xd4\x23\x53\x12\xb6\xef\xcf\x9d\x0a\xd8\x7e\x6c\xa9\xd8\xe5\x3d\x78\xd4\xa3\x98\x92\x2f\x0e\x73\x00\xc4\xc1\xe7\x01\x40\x02\x03\xba\x7b\x3f\x3f\x81\xd9\x5e\x93\x79\xd8\xed\xef\x5f\xcc\x7a\x83\x27\xd5\xf7\x95\xc2\xbd\x6f\xde\xb4\x9a\x55\x2f\x4c\x8b\x2a\x27\x62\xd0\xf1\x62\xbc\x3d\x60\x69\x06\x88\x3b\x9b\xc0\x5c\xca\x37\xb4\xee\x34\xc5\x52\xa5\x9f\xf1\x8a\xfe\x61\x1c\x69\xe2\x1b\x6c\xb2\x7a\xeb\x3b\x99\x58\x29\x73\x6c\xa7\x4c\x7b\xec\x15\x58\x65\x10\x77\x36\x81\xf1\xcc\x97\xbb\xcb\xdb\x70\xb7\x35\x3d\x63\x1e\x9f\x3e\x5f\x43\xab\x09\xbf\x85\xce\x2f\xaf\xca\x5c\x88\x9d\x07\xa9\xf6\x0b\xe3\x38\xfc\x6c\x0d\x80\xf3\x97\xfe\x9f\x2b\xf9\x1f\x4f\x26\x57\x1a\xd9\x59\xf8\x9a\x1c\x90\xd3\xb9\x98\x94\xb5\xcf\x0a\x29\xa6\xd0\xa6\xab\xcd\x23\x04\x23\x5d\x22\x7d\xe9\x19\xe7\xab\x07\x4f\x60\x92\x56\x1c\xb7\x5a\x12\xf4\x97\x47\x14\x39\xd8\xfd\x96\x18\x39\x0f\x43\x59\x11\x53\x66\xb7\x62\xc4\x53\x70\xa3\x2c\x76\xaa\xf7\x4f\x27\x30\x36\x51\xb5\x6a\x5a\x0b\xcc\x03\x1b\x6f\x1f\x65\x5e\xbd\x53\xba\x2c\xf2\x7c\x3a\x34\x93\x49\x54\x4b\xe1\xc1\x1b\x5d\xa5\xc9\xa2\x8e\xd3\xa1\x44\x44\xf7\xb7\x5e\x92\x07\x58\x14\x58\x77\x19\x68\x49\x57\xb9\xd1\x1c\xe4\x17\xd8\x25\xe2\xd5\xff\xd4\xab\x30\xb7\x91\x64\xd8\xfc\xb7\x25\x30\xa0\xa1\x9d\x4a\x60\xc4\xcf\x24\x30\x77\xc8\x72\xd2\x9f\x2e\x59\x6a\xce\x5e\x96\x36\x4c\x93\xd0\xc2\xda\x34\xb6\xf8\xfc\x03\xb3\xde\x7d\x0f\xf3\xea\xb1\x92\x6e\x85\xc3\x45\x24\x30\x2d\x67\x12\x98\xc4\x3e\x82\xd6\xdb\xbf\x29\xd4\xf8\xdf\xdd\xaa\x47\x19\x79\xba\xee\xca\xcd\x3d\x6f\x61\x44\xd3\x40\x32\xec\xf4\xce\xea\xc1\xd0\x45\xbc\x78\x49\x5a\xfc\x6c\x02\xc3\xd3\xcf\xd6\x1a\x43\x49\xdc\xc6\x7e\xa0\xe3\x3d\xfd\x85\x32\x4f\x2b\x63\x6e\x6f\x98\xff\x52\xa7\xa0\x55\x02\x8d\xbd\x1f\xcb\xf4\x85\x9c\x45\x39\x9b\xc0\x28\x14\xba\xcf\x18\xdd\x92\xbf\xfd\xa7\x9b\xf4\xca\x65\x7d\xb5\xe4\x46\x7d\xe1\xfe\xae\xbc\xfd\xab\xaf\x42\x08\x83\xea\xcb\x9d\x7d\x2e\x64\xb4\x67\x13\x98\x52\xa3\x02\x14\xc7\xd1\xdf\x84\x1d\x52\x49\x1f\x1e\xdb\xfd\x88\xe7\x9b\x22\x09\x1b\xe8\xb8\xbe\xc3\x41\xfb\xf5\x21\x3d\x2f\x51\xfa\x85\x8c\xf6\x6c\x02\x23\x45\x67\xe6\x61\xf1\x5b\x65\x5a\x7e\xfa\x93\xb9\xe9\x8a\xb9\x3f\x32\xa5\xe5\xf0\x1e\x4a\x58\x44\x1b\x56\x88\xdd\xcc\x97\xc4\xd2\x0b\x4b\x60\x40\xea\x9e\xb7\xde\xae\xbc\x93\xef\xca\xf4\x49\x7a\xd1\x37\x29\xc7\x51\xf8\x2a\xee\x32\xe7\x73\xf3\x6c\x6e\x43\x9e\x9f\x77\xaf\x79\xe9\xc4\x25\xbc\x83\xff\x05\x01\xc4\x41\xd7\x5b\xa6\x9b\xbe\xdd\x6b\x01\xdb\xd9\xbd\x05\x29\xe6\xe9\x5a\xc1\xcc\x4c\x2f\x1e\xe6\x8b\x4e\x35\xfd\x72\xdc\xc3\xea\xb7\xfc\x59\xf0\x0c\x56\x17\xc4\x9d\x79\x8b\x80\x32\x5f\x05\xd3\xbd\xe7\x58\x2d\x3f\x90\x3e\xcf\xbc\x15\xf6\xf0\x6c\x6e\x8b\x94\xb2\x79\x3f\x1e\xac\x71\x5b\xcb\xf6\x92\x11\xbc\xfb\x03\x88\x83\xd6\x25\xa9\xeb\xa2\xbf\x64\x75\x8c\x72\x20\xae\x12\x67\x81\xfc\x1b\xb7\xfb\xd5\x27\xeb\xae\xfb\xc7\xb2\x18\x3e\xa3\x32\x75\xca\xe1\xf0\x93\xb7\x20\xce\x5f\x12\xf1\x3f\xae\x83\xfc\x77\xe6\x65\x5d\x21\xe4\x4b\x5b\xb6\xe9\x8a\x02\xd4\x15\xf2\x76\x4c\x77\xb8\x09\x2b\xcc\xd9\x78\xb2\x66\x47\x2b\x7b\x57\xb6\x60\xb7\xdf\x20\x0e\xd6\x00\x44\xfc\xef\x09\x0c\x68\x1e\x39\x4f\x01\x52\xc2\xf7\x2a\x1e\x0f\x3e\xec\xef\x7c\xa2\x9a\x09\x7e\xd3\x66\x7a\x9b\xbf\xa1\xe2\x65\xe3\x9c\x53\xb0\x97\x82\x9f\xd4\xbe\x66\x20\x6c\xe8\x20\x0e\xaa\x80\x98\xa0\xcd\xf1\x48\x66\x38\x29\xea\xbb\xf2\x6b\xc1\x7f\xe6\xb0\xd7\xf5\x3d\x9b\x3d\xbc\xac\x51\xdd\x78\x1f\x92\xc5\x24\xf5\xa6\xc0\xea\x82\x38\xe8\x4f\xf5\x6d\x04\x35\x8b\x79\x9b\xdc\xd3\x69\xee\x76\x46\xa3\xeb\x88\xeb\xf8\xbe\x7c\xc6\x2e\x5b\xbc\xdb\xcb\x97\xcc\x2d\x02\x6f\x8a\x5d\x61\x75\x41\x1c\xb4\xae\x43\x50\xeb\xbd\x36\x9a\x44\xb6\xd1\x5a\x7b\xe4\xe7\xf2\x3a\xa2\xac\x0e\xbd\x15\x5c\x8e\x13\x73\xdb\x9a\x8c\x45\x68\xe5\x37\xd0\x60\x75\x41\x1c\x54\x01\xa3\x3a\xd3\x05\xd9\x83\x80\xae\xc3\xdc\xab\x36\x36\xd9\x68\xea\x46\x63\xa3\x57\x73\xb3\x71\xda\xd7\x9b\x73\xde\x1c\x5c\x3e\x1e\x83\x29\x00\xe2\xe0\x3d\x60\xfe\x9e\xc0\x80\xe6\xf4\xf3\x14\x98\xbf\x1a\xa4\x46\xba\x5a\x43\xe8\x10\xa5\xdd\xfc\x27\x3f\xe6\x8b\xdf\x7c\x5c\x73\x16\xd1\x2c\xda\x75\x09\x2b\xf1\x59\xd5\x30\xf8\x33\x3d\x20\x0e\xaa\x00\x79\xd0\x9a\xfe\x38\x0b\xc6\x14\xcb\xc3\x8a\xd0\x7e\x6d\x5c\x2d\xc9\xea\x63\x02\xb5\x19\xba\x2c\xe9\x51\x5f\x6c\xb7\x56\x5e\x6b\x78\x6f\x5f\x00\x07\xfd\xa9\xee\x20\x90\xac\x8a\x08\xd0\x2f\x59\x8f\xce\x36\x4a\xfc\x76\x35\x58\x1a\xc8\x1f\xb6\xe4\x1c\x3b\xf9\xc9\x6a\xe5\xe0\xf1\x29\x1e\xfe\x1a\x2c\x10\x07\xad\xab\x18\xaa\x64\x30\x8a\xac\x39\xc3\x17\x41\x53\x56\x18\xa2\x59\x29\x4d\xce\xe8\xa4\xad\xcb\xed\x19\x5f\x38\x8b\xcb\x1e\xab\x86\x03\xab\x0b\xe2\xa0\x0a\x24\xdd\x7e\xfc\xbb\x64\x92\xc2\x7e\xed\xbb\xe7\x8d\xf0\x98\x3f\xcd\x5a\xf6\x48\x86\x2c\xaf\xc5\xf1\x9c\x24\x73\x9f\x77\x12\x6f\xa0\xc1\x76\xdd\x20\x0e\xde\xfb\x01\x90\xc0\x80\x16\xd8\x73\xdf\x3f\x9c\x49\x60\xaf\xe4\xf9\x63\x6e\x5c\xf2\xfb\x1d\xb6\x10\xb2\xfb\x76\x25\xeb\xf5\x09\x85\xaf\xf7\x08\x3f\xc7\x6e\x06\x63\xc4\x73\xc2\xc6\x0e\xe2\xce\x34\x63\x4f\x1b\x52\x97\x62\x96\x49\x4b\xad\xbf\x7a\x33\x71\xa9\x57\x7b\xec\xd9\x3b\xff\x5a\x31\x59\x86\x82\x87\x38\x3b\x07\x2f\xa4\xe0\x2b\x0c\x88\x83\xfe\x56\xb5\xad\xd8\xf7\x53\x0d\x38\x89\xc3\x2a\x49\xc9\xfc\xd7\x8c\xaa\xc7\x93\x0f\xc5\xad\x9b\xeb\x4a\x49\x05\x4f\x7c\x06\xa5\x62\xe1\xbd\x42\x41\x1c\xb4\xae\x44\xb4\xf1\xf5\xf7\xb4\xb6\x6c\x87\x78\x29\x97\x78\xc5\x1e\xd0\xad\xe6\xe3\x1c\xa1\xc7\x7b\x52\xf7\x26\xab\x54\xe3\xd8\xe4\x4b\xc3\xea\x82\x38\xa8\x03\x5d\x54\x12\x95\xc3\xfc\x46\xfa\xcd\xfb\x85\xbd\x9b\x29\x74\xfc\xdc\x89\x2f\x8b\x86\x04\x2d\x62\xbc\x02\x6b\x59\x1f\xe0\x12\x2d\xc2\x1c\x00\x71\xf0\xde\x0f\x80\x04\x06\xb4\xdb\x39\xcf\x81\xd2\x55\x81\x06\xd7\x0e\x9e\x91\x76\xc5\xbd\x2f\xce\x9b\xea\x2f\x2a\xba\xea\x47\xa7\x1d\x7d\x9b\xc5\x02\xed\xa6\x1d\xe5\x27\xe1\xef\xa0\x06\x71\x50\x07\xf8\x84\xc9\x5b\xfe\xf8\x6d\x19\xa3\x9f\xac\x25\x5d\x95\xf7\x0e\x4b\xf8\xf8\x9c\xc3\x74\xd7\x26\xe2\xd6\xdb\x5f\xd6\x18\xcb\xbc\x1d\xb0\xba\x20\xee\x4c\x0f\x18\xdd\x99\x90\xaf\xce\xc9\xd6\x22\xf4\x62\xd8\xf4\xde\x07\x7c\x35\xac\xef\xda\xbe\x11\x94\x9b\x73\x19\xdb\x3d\x2c\x76\x74\x1c\x86\x9f\x57\x02\x70\xd0\xba\x99\xf9\xcd\x3b\xb3\x1c\xfe\xc8\xac\xbd\x07\x07\x4c\xdc\x9d\x09\x2e\x0f\x71\x50\xb6\x7f\x54\x2e\x89\xeb\xff\x8c\x77\x55\x96\x86\x3f\x87\x06\xe2\xa0\x0e\x0c\xdc\xbd\xf2\xff\x31\xf7\xdf\xf1\x58\xbe\x7f\xfc\x3f\x6e\xaf\x14\x12\x65\x93\x99\x15\xb2\xc9\x5e\x11\xca\xc8\x8a\x10\x19\x19\xd9\x33\x19\x21\x5b\x56\xc8\xde\x23\x64\x84\xec\x99\x9d\x3d\x43\x65\x47\x11\xb2\xa5\xdf\xed\xf3\xbd\xdd\xae\xf3\xd7\xeb\xbc\x7c\x3a\x3e\x7f\xf8\xe3\xfd\xff\xfd\xf6\xbc\xae\xe3\xbc\x1e\xd7\xf3\x38\x1e\xe7\x71\x3c\x9f\x87\x75\x8d\xf4\xa3\x32\x2a\x65\x66\xfc\x1d\x01\xec\xc1\x34\x42\x99\xc8\x8f\x9f\xe5\xf4\xa8\x1e\x6b\xcd\xb0\x4c\x5e\x80\xee\xa2\x07\x71\x50\x1e\x00\xbc\x81\x01\x2d\x3d\x4f\xd3\xc0\x0f\x83\x5a\x8b\x3b\x33\xa6\x51\x4f\x85\x7b\xe7\xe5\xdb\xb0\xd3\xa5\x95\xa4\x36\x6f\x72\x77\x38\x99\xac\xf4\x5e\x3d\xe4\x31\xc4\x84\xf6\xa2\x00\x1c\x5c\x03\xd5\x03\x62\x81\x18\xb4\x26\xea\x17\x04\xcd\x84\xc3\xfa\x55\xb2\x74\xd6\x2b\x30\xa2\xd4\xab\x54\x63\x5f\xf8\xf8\x89\x7e\x09\x87\xee\x16\x03\x71\x48\xe7\xa0\xf0\xa4\xc5\x63\x06\x89\x3c\x0a\x5f\x0f\x66\x8c\x1f\xdb\xf2\x3d\x0f\x88\x89\x12\x6c\xf2\xd2\xea\x7f\xd4\x25\xaf\xd9\x79\x1b\xea\x5f\x06\xe2\xe0\x71\x6b\x87\x7f\xf6\xde\xa4\x72\xb9\x49\x78\xeb\xc5\x38\xaf\x5c\x5f\xe0\xed\x9b\x96\x09\x5c\x2d\x59\xf9\x49\xe2\x0f\xbb\x2d\x0e\xc8\xd1\x11\x71\x41\x1c\x5c\x03\x33\x49\xc7\x4f\x71\xff\x38\x92\xdc\x44\xdf\x33\x6d\xd1\x46\x49\x71\x49\x57\xc8\xdb\x90\xc0\x19\xe9\x7c\x17\x2f\x2c\x2b\xdc\x90\x82\xd0\x00\x88\x83\xf2\xc0\xff\xed\x0d\x0c\xe2\xad\x80\x4e\xa7\x8a\xaa\xbf\xae\xbc\x86\xf5\x82\x7e\xbe\x54\xbe\xb3\x3b\x9d\x11\x11\x2e\xce\x3b\xc5\xac\x5d\x63\x16\x9d\x21\xb9\x49\x8f\xbf\xdf\x0a\x0c\xd0\x3d\xdf\x92\x3e\xc4\x0a\x14\x94\xc5\x9a\x7b\x1c\x72\xd1\xa8\x59\x44\xa7\xcd\x8e\xa8\xf2\x0d\xeb\x97\xf2\x8c\x2f\xb2\x5e\x53\x7f\x1f\xe1\x30\x14\x61\x6e\xe2\x53\x22\xa5\xc6\xc5\xe5\x98\xf1\x3a\xdf\xba\xbf\xa9\xdc\xe0\x1f\x33\xd0\x22\xa7\x41\xc4\xf1\x5c\xd4\xd6\x48\x42\x02\x0f\xef\x7f\xe1\xad\x80\x37\xe6\xff\xdb\xd0\x9e\xa3\xa3\x60\xfa\x49\xd2\x78\xfb\x87\x48\x7b\x23\xbd\x15\xe0\xcf\x90\xd9\x0f\x0f\x3e\x9c\x6c\xec\xb8\xa8\x24\xfb\x52\x73\x28\xe2\x20\xee\x40\x0d\x97\xbe\x41\x86\x70\x75\x8f\xe3\x57\xe8\xb3\xb3\x78\x2b\x80\xa2\x82\x54\x2a\xf2\xda\x39\x30\xfe\x76\x5b\xfe\x94\x23\xea\xbb\xd4\xac\x52\x5b\xda\xa3\xd8\x71\xd6\x81\x29\x16\x4c\x3c\x3e\x39\x8a\x1d\xe9\xd1\x33\x39\x32\x80\xfc\x56\x80\xe8\xc3\x14\x99\xc3\xe0\x9a\x8a\x54\x4d\x3c\x81\x63\x57\x3f\x37\xf3\xe2\x04\xc6\xd3\x21\xb5\xbb\xb3\x45\x66\x3f\x77\x6c\x3a\xb4\xcf\xe4\x80\x84\x26\xd2\xc7\x76\xd8\xfa\xf4\xcb\x51\x0e\xaf\x08\x05\x6c\x5f\xcf\xb9\x75\x33\x5e\xfa\x0f\xbf\x31\x45\x17\xe3\xb5\xc5\x94\xad\xdf\x5b\x7e\x06\xca\x67\x32\x5a\xe4\xb7\x02\x16\xa1\x93\x55\x94\x28\xd6\x4c\x27\xfd\x1e\x5e\x7f\x2a\x3b\x32\xa7\x43\xb8\xb0\x28\x6a\xee\xd5\x52\x53\x88\x18\x1b\xca\xbd\xb5\x3d\x33\x7b\x0e\xd2\xd0\x69\xc9\x58\xce\xb7\x4e\x94\xf1\x38\x25\x3f\xf3\xe9\xdc\xa7\xe6\x56\x66\x9e\x95\xaa\x96\x2a\x93\x1b\x1b\x85\x02\x4b\x89\xaa\x96\xcf\x57\xa1\x02\x4b\x10\x87\xb4\x3b\x7e\x33\xa7\xd9\xc5\x3e\x5a\x81\x5a\xe6\xb5\x60\x24\x06\xae\xc6\x0a\x89\x90\xa1\x59\xfb\xd7\x41\x3e\x55\x14\x8d\x4c\x86\x2d\xa8\xc9\x19\x88\x83\x27\xcd\x48\x21\x3f\xeb\x07\xf3\x5d\xc9\x42\x9b\xde\x56\x58\x04\x46\xdf\x4d\xd4\xda\x7e\xcb\x92\x94\xb5\x55\xe1\x1b\xbf\xf6\xd7\xd1\x7d\x86\x88\x0b\xe2\xe0\x71\xf1\x5e\x67\x2f\xcc\x0e\xcf\xbf\x1a\xb8\x54\x8a\x71\x85\xd3\x1a\x45\x20\x80\x67\x5d\x86\xe4\xc9\x35\xd7\x6b\xfc\x24\x71\x8c\x14\xd0\x6b\x76\x10\xe7\x27\x45\xf8\x9f\xe7\x60\x76\x53\xf4\x58\xb8\x07\xa5\xcc\x84\x81\xea\xa0\x93\xea\xa7\x32\x31\x85\x48\xeb\xc2\xf0\xdc\x87\x3a\x8e\x46\x2c\xfc\x0b\x6f\xf8\x10\xde\x0c\xc4\x21\xfa\x43\x78\xff\xdb\x9e\x83\xfe\xd0\xa7\x49\xe0\x55\xfb\xaa\xea\x85\x1b\x0e\x15\x66\x8c\x6f\x03\x4c\xa8\x9e\x8e\xa6\xb3\x2b\xd7\xc5\x0e\x8f\xb3\xd5\x33\x10\xc4\x8e\x66\x46\x43\x57\xc3\x80\x38\xb8\x04\x8c\xcd\xf1\x07\xcd\x84\x5e\xdd\x77\xda\xe0\x62\x99\x62\xd9\xbb\xdc\x24\x94\xc8\xf2\x1a\x45\x5b\xf8\x02\x85\x58\x14\xe3\x87\x6a\xe8\xea\x63\x10\x07\xff\xa9\xa8\x9c\x49\xec\x78\x2f\x6a\x0a\xa3\x0c\x0b\xb6\x11\x0d\x9c\x28\x12\xc6\xfe\xb1\xf6\xc6\x7e\x5f\x16\xb2\xc9\x73\x30\x49\x8d\x09\xdd\xa5\x0a\xe2\xe0\x71\xbf\xad\xce\x51\x75\x84\xad\x7d\x93\xfb\x92\x7d\x85\xd7\x57\x6b\x5b\xc3\xb7\xdb\x35\xcc\x8c\xc1\xf9\x62\xdd\xc0\xf3\xca\xf7\x3d\x07\xd0\x9b\x2a\x00\x07\x97\x40\x5b\x05\xf9\xdb\x93\x69\xbc\xa9\x0c\xab\x6e\x3a\x11\xda\x52\x93\x46\xd5\x01\x52\x8e\xda\xa0\xd1\x60\xce\x1b\xd7\x8e\x09\xc4\xd5\x10\x12\x00\x71\x50\x8b\x10\x95\x7f\x4a\x00\x94\x5c\x4f\x93\x40\x5c\x6c\x6f\x68\xff\x39\x9c\xc7\x45\x8e\xcb\xc7\x2e\xc6\x3e\xb2\xdb\xec\xe9\xab\x38\x3e\xbf\x9e\x60\x16\x15\x86\x77\x1f\xd6\x41\x25\xfc\x20\x0e\x69\x53\xec\x73\xb2\x42\xba\xfd\x57\x3b\xb6\xf2\xaa\x8a\x2f\x2f\xf2\x9d\x87\x48\x0e\xca\xdf\xad\x5b\x4f\x87\xd8\x51\x5a\x99\xed\x93\xf7\x40\x9b\x62\x00\x0e\xe9\x80\x84\x6c\x66\xb7\x53\x9a\x78\x29\x06\x97\x8c\xe9\x4d\x82\xd1\xfd\x8f\x1b\x7f\x4a\x44\x93\x94\x5d\xef\x74\x5f\xed\x4b\x50\x52\x7a\x0e\x1d\x90\x00\x70\xf0\xb8\x29\xd7\x24\x1d\x16\x2a\xa3\x4d\x57\xdf\x6f\x9f\x7f\xb3\x91\xc6\x9c\x2b\x39\xc1\x7e\x94\xd9\x11\x10\xdc\xd3\xb0\x35\x28\xb4\x04\x5d\xd1\x0a\xe2\xe0\x12\xf0\x89\xad\xab\x48\xd5\xf8\x5a\x45\x8d\x19\x70\xf9\xb6\x81\x2d\xaa\xac\x81\x47\x6d\xaf\x26\xee\x7c\xc1\xc3\x0c\xc6\xe7\x8a\xf9\x14\x88\x25\x19\x88\x83\x5a\x03\x00\xec\x39\x68\xa6\x3b\x4d\x03\x5a\xbb\xaf\x70\x6d\x55\x56\x4d\x96\x3c\x22\xd2\x77\xa4\xd5\xfa\x04\xae\x35\xe8\x3f\xa6\x1a\x7f\xc9\x1a\x49\xaa\x31\xe9\x19\x0b\xbd\xf5\x02\x71\x70\x0d\x14\x15\x50\x4c\x58\xcc\xdf\x4f\xbe\xea\x2e\xbd\xef\x60\x48\x94\x72\xa7\xf2\x09\xde\xb3\x9a\x8a\x25\xea\x6f\x0d\xe6\x46\x18\xe4\xd0\x21\x19\x10\x87\xd4\x1e\x22\x7b\x06\x8f\x08\xf5\x2b\xff\xf7\x27\xe2\x37\x54\xb0\x70\x17\xf4\x2f\xae\xb3\x6f\xfd\x0c\x9e\x4a\xed\x76\x63\xff\x6e\xa8\x21\x09\xb5\x87\x00\x70\x48\xe7\xaf\x2e\x72\x8a\x7b\x9d\xb0\x44\x8d\x24\x72\x52\x17\x3b\x7e\x7c\xeb\x47\xd4\x6b\x33\x43\xe0\xf5\x56\x2a\x7a\xf1\x67\x43\xe4\xd3\x5c\xe8\xfc\x15\x80\x83\x6b\x00\x3b\x63\x9b\xc3\x3d\x9f\x81\x14\xcf\x2c\xb3\xd6\x37\x88\x9c\x89\xbd\x43\x24\x39\xfc\x79\x3c\xf9\xdb\xc7\xc2\xb4\x58\xe5\x23\x0b\x08\x0d\x80\x38\xa8\x35\x80\xe6\xbf\x35\x00\x5a\x76\x9c\xa6\x81\x5e\xc1\xfe\x02\x52\x75\x43\x3a\x59\x6b\xf6\xa5\x0d\x69\x86\xc9\x87\x01\x36\xce\xfa\xbc\xe3\x68\xb5\x46\xb4\x0c\x8c\xf9\x43\x50\x39\x11\x88\x83\x6b\x40\x4c\x8a\x0d\x47\x56\xd7\x77\x03\x67\xec\xea\xc1\xcc\x2d\xfa\x00\x06\xa7\xdd\x71\x2e\xfb\x31\x81\x9e\x3f\x64\xc1\x45\x82\xe2\x45\x88\xb8\x20\x0e\xfe\x5b\xcd\x27\x9f\x93\xcb\x1f\x55\xde\xb7\x91\x2a\x0f\xf1\x31\xc4\x0c\x6f\xbf\x6e\xae\xfd\x6a\x6a\x58\x92\xcb\xce\xae\x78\xa8\x59\xc9\x1d\x11\x17\xc4\xc1\xe3\x5e\xc8\x7a\x66\x81\xf2\x3c\xd0\x4c\x8f\x3b\xfb\xd0\x51\x64\xde\xcd\x64\x38\xc6\xbc\xdd\xa8\xd8\x76\x3b\x5a\x96\xf9\xfc\xc6\x11\x74\x56\x0e\xc4\xc1\x35\x20\x89\xc2\xf7\x80\x3f\xd3\x8c\xcf\x2a\xe5\xa3\x73\x74\x47\xfb\xca\x88\x74\xdf\x78\xa4\xf0\x75\xa5\xd9\xc9\xa3\xf1\x6b\x53\x22\x92\x50\x99\x12\x80\x83\xf2\xc0\xff\xcd\x9e\xeb\xff\xbf\x59\xa8\xd3\x37\xc7\xeb\x49\xc6\x7d\x2c\x45\x0c\xe2\x59\x38\x2b\xbc\x6f\x7e\x23\x4b\x1c\x52\xa6\x8c\x7a\xf1\x6b\x5b\xe8\x13\x8e\x4e\xda\x6a\x7b\xa8\x35\x62\xa3\x19\xc4\x21\x6f\x8e\x0b\xa9\xa0\x47\x95\x67\xab\xbe\x96\xaa\xb5\x47\xa1\xf0\xf1\xe2\xa7\x24\x2d\x25\xa8\xaf\xc8\xda\xa4\x45\x35\x44\xe7\x4a\x6e\x4b\x45\x44\x06\x71\xc8\x9b\xe3\xe7\x76\x3e\x35\x9c\x0c\xb5\xbc\x32\x79\x9e\x71\x59\xea\xd7\xa2\x42\xeb\x93\xc1\x01\x2f\x21\xec\xa5\xeb\xd5\xd4\x36\x49\xbe\xb8\x94\x88\xc8\x20\xce\x4f\x06\x05\x05\xe3\x3f\x91\x95\x3f\x1c\x92\xed\x98\x8c\x5f\x3c\x31\x31\xf5\x97\x11\x56\x4e\x43\xab\xd1\xb0\xa7\xbb\x87\xdf\x1c\x16\x2c\xa4\xea\xe3\x76\x3f\x0a\xda\x1c\x1f\xd1\xf6\x1a\x1b\x41\x2f\xe4\x22\x96\x8a\x7b\xcf\x84\x86\xa3\xe7\xb3\x78\x89\xe2\xd9\x07\x13\xf4\x93\x21\x8c\x1f\x19\xec\x3c\xf7\xfe\xb6\xc1\x44\x7d\x81\xe8\x9e\x5a\x6b\xef\xd0\xe4\xde\xa1\x5e\x18\x76\xc5\x92\x96\xbc\x52\x66\xf9\x85\xd8\xd8\x5a\x97\xd7\x86\x4f\xa9\x28\xe0\x2f\x54\xc0\xc8\xbe\x31\xf1\x9a\x98\xda\xd4\xc3\x40\x31\x51\xde\xee\x59\xb4\xeb\xf5\xf6\x3f\xa9\xbe\x17\x4d\xe0\xea\xbe\x5d\x8f\x6d\xef\xff\x5f\xb3\xc1\xa0\xa1\xfd\x65\x83\x9b\x90\x6c\xb0\xb5\x60\x00\xb5\xc8\x73\xaa\x04\xb5\xca\x8e\x04\x0c\xd9\x49\x57\xdd\xf4\x02\x7b\xe7\x73\xe3\x78\x6a\x5f\x94\x37\xef\xb1\xa6\xa9\x9e\x85\x0d\x96\x40\xb2\xc1\xf2\x6f\xfb\xfd\x7b\x98\xc3\x25\xf0\xec\xda\x88\x7f\xcc\x48\x8e\x3e\x3a\x4c\xf2\x0d\xed\x67\xe0\x9e\xf8\x4a\x4d\xeb\x4a\x8e\xf5\xeb\x4c\xf6\x6d\x91\x6d\xb0\xdc\x1b\xa1\xd0\x2c\x31\x4e\xbc\xfc\x82\x5c\xdd\x30\x5b\x5b\xff\x98\xed\xfe\x9c\xd6\xcf\xa3\x36\x0b\x17\x8d\x33\xa9\xdc\xfc\xd8\xce\x64\x97\x1a\xd9\x06\x67\xf1\x1d\x45\xb6\xbb\xba\x3d\xa7\x31\xb4\x9e\xcc\xe7\xa3\x6b\x2b\x5a\x78\x25\xa0\xe5\xab\x9c\x6e\xc0\x5b\x42\x17\x3a\xf0\xe3\x4c\x8a\x31\x9a\x90\x6d\xf0\x7c\x7a\xed\x9a\xb6\x47\x81\x92\x2f\x51\x91\x41\xe0\xe1\x33\x8b\x64\x3d\x95\xcb\x0c\x57\xc8\x67\x33\xc8\xe7\xdc\xd9\x8a\x05\xf9\xce\xcc\x06\x83\x34\x74\xda\xc4\xf7\x6c\xe0\x1b\xa1\x1c\x85\x9b\x41\xd9\x98\x02\xe6\xd4\x0f\x47\x9b\x84\x1b\x47\xea\x3d\xc4\x2e\x63\x77\x8d\x82\x55\xa5\xf9\x79\xbd\x11\x09\x1f\xc4\x21\xf5\xc6\xc2\x1d\x55\x78\xd9\x8c\x33\x4f\xb3\xf1\x6c\x36\xe8\x2e\x69\x95\xd9\x35\xe9\x99\x3a\x31\xec\x8e\x26\xd3\xf2\xf6\x47\x5c\x89\xd0\xbd\x83\x20\x0e\x3e\x41\x8d\x2c\x9a\xb4\x55\x6e\x8b\xe1\xf5\x38\xff\xfe\x76\x13\x67\xf1\xc6\xdd\x3b\xe2\xd8\x91\x1f\x2b\x67\x12\x18\x99\x8a\x83\x49\x63\x3e\x22\xe2\x82\x38\x24\x1b\xbc\x93\x96\x76\xf4\x46\xe3\x25\xe1\x93\x16\xea\x20\x29\x45\x94\xc7\x44\x6f\xfd\x7a\xe9\xf5\x9f\x34\x30\xa8\x7a\x1f\x4a\x09\x43\xa7\xe3\x40\x1c\xfc\xbe\x31\xc5\xd4\x97\x65\x63\x8f\x37\xb3\x2a\x39\x53\xb2\xe4\x74\xfb\xd3\xf3\x55\xa6\x3e\x1d\xdc\xa1\xee\xd8\x9e\xb9\xee\xff\x4d\x5a\x16\x2a\xd3\x07\x71\x88\x32\xfd\xa6\x7f\xdb\x60\xd0\x1f\xfa\x34\x09\xbc\x98\x30\x7c\xee\x74\x73\x43\xbc\x86\xd2\x25\xbc\x4a\xd1\x6f\xe9\x63\x3d\x26\xae\xf3\xe1\xc2\x55\x4f\x0f\x6c\xe1\xa7\x3b\x0f\xa0\x3b\x65\x40\x1c\xd2\xf6\xd4\x45\x29\x8d\x31\x7d\x92\xa3\xc2\x54\x1e\x3b\xe5\xba\x19\xe7\x94\xf3\x47\x32\x44\x74\x6a\xd7\xe2\x99\x0c\x30\xba\x33\xa4\xa9\xa1\xed\x29\x00\x07\xff\xa9\xa6\xcb\x7f\x2d\x93\xcb\x78\xc7\xa3\x9f\xa0\x96\xd8\xbb\xaf\x17\x3a\xbc\xfc\x78\x9e\x92\x5c\xed\x4f\xe7\xc2\x93\x6b\xa1\x28\xef\xcc\x10\x71\x41\x1c\x3c\x6e\x23\xb5\x43\x76\x4b\xc4\xfd\x2f\xf3\x5e\x56\x47\x87\xa1\x7a\xe3\x5a\xf3\x99\xb9\x5c\xe7\x9d\x56\x56\x14\x9f\x5e\x92\xd7\x8b\x81\xae\xb4\x04\x71\x70\x09\x60\x66\x6e\x97\xbb\x11\x70\x93\x4c\xbd\xbd\x73\x05\xbb\x9f\xb0\xbc\x6b\x2c\xf6\x7e\x0a\xa9\xbe\x46\x4c\x74\x85\xb7\xad\x40\x72\x05\x42\x02\x20\x0e\xea\xd4\xf0\x6f\x1b\x0c\x4a\xae\xa7\xd6\x09\xc4\x9b\x63\xf1\xec\x32\x37\x9b\xa1\xa2\x4c\x33\x7a\xb5\xe8\x30\xca\x86\x96\x69\x27\xa6\x52\x33\x4a\xa8\x07\x90\x60\xa7\x18\x41\x75\x02\x00\x0e\x2e\x81\xf3\x95\x4c\x33\x99\xee\x5a\x29\x85\xdf\x7b\x45\x3e\xcf\x1c\x69\x2f\xbc\x5a\x45\x79\x62\x4b\xcf\xe5\x9f\x2b\x52\x2d\x7c\xde\x11\xba\x4d\x02\xc4\xc1\x7f\x2a\x1b\x6c\x7a\xe3\x3e\x17\xa9\xde\xf8\x9c\xdf\x4e\x09\x9e\xb7\x66\xee\xa9\x7e\xfe\x1c\xf7\xd5\x16\xbf\x92\x51\x2c\x35\xc2\x67\x03\x3a\xab\x02\xe2\xe0\x71\x3b\xea\xfd\xae\x1a\x99\x86\xf7\x04\x12\xbf\x2b\xdb\xbb\x81\x15\x6f\x2c\x72\xd5\x7f\xb8\x54\xf8\x42\x19\xfe\xe1\x4b\x7a\xdd\x4a\x6d\x44\x5c\x10\x07\x97\xc0\x47\xb2\x7b\x22\x7a\x4e\x7d\x68\x9e\x83\x6a\xc6\xb8\xd2\x8e\xd1\x92\xaf\x75\x23\xca\xd0\xdc\xbd\x14\x30\x97\x34\xbb\xd3\x8e\xa0\xdb\x01\x41\x1c\x54\xa1\x0d\xb0\xc1\xa0\x99\xee\x34\x0d\x4c\xb6\x6a\x1a\xbb\xa8\x26\xec\x45\xbd\x70\x5f\xa4\x75\x5f\xc8\x34\xb8\x2e\x9b\xc5\x8e\x3b\x3e\x8a\x3f\x4b\x5e\x42\xa2\x3e\x24\x84\x18\x3b\x88\x83\x6b\xe0\x25\xea\x58\x78\x29\x27\x4d\x37\x41\x95\xe6\x03\xb1\x73\x5e\x07\x1b\x53\x21\xcf\x4c\xa9\x0d\x7d\x62\xdf\x3a\xdf\xb0\xb5\xd1\xb2\x84\x5a\xeb\x00\x38\xa4\xdd\xa9\x45\x8a\xef\xaf\x0b\x22\x22\xca\xf5\x68\xca\xf0\x97\x7b\x4d\x02\xfc\xf6\xf9\xb6\xdf\x88\xc6\x5c\x2c\x8d\xdf\x8f\x78\x4a\x01\x35\x82\x01\x71\xf0\xb8\x7a\x21\x77\xae\xde\xef\xc0\xe4\x61\x2c\xe8\x14\x11\x46\x53\x36\x24\x1a\xfe\x36\x72\xd3\xcd\xcd\x33\x64\x24\x45\x65\xfe\x7d\xd7\x1d\x44\x5c\x10\x07\xd7\x40\xfa\x62\x67\xec\x7d\xe5\x10\x49\xf9\x3e\xbc\x36\xea\x16\xf3\xa3\x03\x1d\x93\xa4\x2f\x8a\xd4\xae\x33\x5c\xce\xe7\x82\x74\xe6\xa0\x4e\x99\x20\x0e\xaa\xd0\x06\xd8\x60\xd0\xb2\xe3\x34\x0d\x6c\x33\x74\xe7\x19\x85\x60\x78\x94\x7d\x1a\x79\xf8\xa8\xcf\xe9\xf7\x68\x41\x07\xab\xd1\x64\xe4\x15\x11\x6e\xbb\x6b\x01\x1c\x13\xc5\x88\xb1\x83\x38\xb8\x06\xae\x5e\x2f\x99\xf5\x8b\x77\x7a\xc6\x34\xb9\x3e\x48\x73\x41\x72\x9e\xbc\x66\x79\x62\xc4\x75\x29\x3d\xb8\x6d\xb9\xc2\x62\x24\x13\x7a\xc5\x02\xe2\x90\x5e\x87\x65\x1e\xce\xef\x38\x79\x8c\xb4\x49\x50\xed\x7d\x93\xb9\xf4\x71\xbc\xbe\xb7\xaa\x56\x5c\xc7\x5f\x3a\xf0\xfa\x83\x7d\x85\x2a\x48\xb3\x20\x0e\x1e\x77\xb9\xc1\x75\x71\x25\x4b\x67\x5f\xf5\xd7\xa7\x82\xd9\x92\x71\xfa\x49\x6f\x2d\x8a\x45\xc3\xac\xf7\xe6\x42\x01\xa1\xd3\x74\x26\x50\xc7\x0a\x10\x87\x74\x13\xf5\x49\x82\x7b\xc5\xbe\x9e\xa8\x99\x81\x69\x30\x8a\x16\x6e\x73\x41\x4d\x4a\x6b\xf9\x4f\xac\x02\x14\xbc\x7d\x4c\xef\x1e\xf5\x6c\xa8\x4a\x1f\xc0\x41\x79\x00\x60\x83\x41\x16\xea\x74\x1b\xac\x3e\x98\x37\x39\xcf\xa3\x5b\x6a\xb6\xd0\xd1\xf4\x99\x5a\xbc\xf5\x9d\x5b\x11\x66\x9d\x94\xa3\x61\x88\x45\x14\xfe\xe7\x79\x66\x41\x84\xa5\x04\x71\xc8\x36\xb8\x38\xda\x6f\xc1\xa4\x51\xf7\xc9\x83\x38\x05\x95\x77\x4f\x06\x13\xb8\xf3\xf1\x79\x54\xc9\x68\x1f\x5a\xac\xea\x5a\xb8\x27\xa8\x12\x20\x22\x83\x38\x64\x1b\x8c\x55\x96\x39\x61\xfd\xce\x3c\x97\x32\x62\xe6\x24\xd8\xa7\x5e\x32\x77\xb7\xf2\xbc\x4d\x22\x9a\xe0\x0e\xe5\xfd\xac\x2e\x8c\xba\x59\x44\x64\x10\xf7\x7f\x6c\xf0\x7f\x5f\x5d\x0c\xec\x1c\xb7\xec\x14\x48\x8a\xbd\x63\x5c\x14\x25\xc0\xbf\xfb\x95\xbc\x58\x82\x6f\xd1\xa5\x98\xe8\xcd\x4d\x12\xe6\xdf\x0d\xef\x29\x21\x1b\x8c\x97\xe7\x77\xa4\xa4\xc8\x8b\x7f\x79\x27\x4a\xba\x97\x46\x69\x38\xe3\xde\xe0\xc8\x7e\xd0\xc5\x6d\xb9\x9f\xe9\x6d\xfc\x4e\xe2\xd5\x7f\xdb\x60\x8e\xbe\xb6\x6a\xfc\xa5\x5e\xac\x1b\xba\xcb\x9c\xbe\xd8\x8d\x35\x26\x2b\xd4\x61\xfd\x89\x44\x1c\x84\xf4\x0d\x6f\xf4\x63\xcd\x97\xff\x42\xd1\x63\x9a\x67\xef\x59\x16\x89\xf3\x4b\x5d\x99\xa5\x99\xc0\xd4\x1e\x23\x51\x58\xb4\xb6\xfe\x35\x60\xf1\x1c\xdf\x7b\xa8\x64\x88\xe9\x7f\xcd\x06\x83\x86\xf6\x97\x0d\x46\x91\x86\x7b\xa5\x8f\xab\xba\x45\xd5\x49\x31\xcf\xf5\x36\x1f\x5c\x6b\x66\x7e\x42\x86\x76\x2f\x83\x38\x6e\x22\xaf\xd5\x8d\xcb\x99\xa7\x8c\xef\x6e\xdd\x59\xd8\x60\x6f\x24\x1b\x2c\x32\xfc\x23\x75\x6e\x8b\x31\x4b\xbb\x64\xe3\x7e\x43\x7d\x39\xb1\xc4\xd3\x07\x9a\x18\x1e\x2d\x61\x0f\x5c\xb3\x99\x7c\xd7\x1a\x9a\xce\x64\x5b\x56\x18\xc9\x18\x16\x07\xa0\x87\x78\x6f\x4b\xf5\x7f\x67\x70\x2f\x7c\x2a\x5b\xda\xf6\x99\x3e\xa4\xcb\xf9\x77\xdd\xc9\xd8\x15\x51\x6f\x54\x6c\xaf\xb3\xb8\x13\x55\xc6\x1b\xd9\x06\x8b\xa5\xd0\xb2\xab\x9a\x53\x46\xe9\x1c\xaa\xde\x7b\x2f\xc4\x79\x53\x46\xff\x3d\x27\x5d\xaa\x48\x23\xe9\x15\x97\x49\xd5\x10\x45\xc3\x33\x19\xad\x1d\xd2\xc7\xd2\xbc\x8f\x3c\xd1\xbe\x9c\x6b\x7d\x41\x96\xa6\x2d\x71\x27\x72\xf2\xa7\x81\x8d\xae\xd3\x34\x85\x39\x3e\xee\xab\x89\x0e\xbb\x13\xb1\x33\xb3\xc1\x20\x0d\x9d\x36\xf1\xb1\xa5\x1e\x66\x2c\x34\x0d\xa6\x72\x10\x18\xa4\x11\xfa\x65\x8c\x2a\xdd\x1d\x53\x25\xc6\x2c\x4b\xb5\x68\xb0\x15\x6d\x7a\x9d\x0a\x2d\x80\x41\x1c\x7c\xe2\x8b\xe7\xd8\x33\xbc\xf3\x62\x44\x38\x9a\x8e\x77\x22\xed\xe7\x75\x83\xe3\x0f\x58\xe9\x77\xb0\x3e\xaa\x1e\x64\x7e\xa6\x4f\x13\x58\x5d\x46\xc4\x05\x71\x48\xef\xea\xaf\x09\x29\x28\x88\x18\x04\xb1\xef\xd7\x35\xdb\xd6\xf3\xfd\xfa\x16\xd1\x8c\x32\xfd\x87\x5c\xce\x11\xe7\x40\x21\x90\x50\x39\x11\x7a\x57\x0f\xe0\xe0\x71\x29\xd3\x9e\x67\x87\x90\xe8\x86\xfd\xb4\x46\xb5\x10\x38\xd8\x16\xad\xb3\xab\x37\xba\xf1\x56\x9b\xfe\x3b\xaa\x6e\x8e\x9e\xce\x77\x68\x01\x0c\xe2\xfc\xa4\x50\x70\xfe\xf3\x7d\xbb\x17\xa5\xd2\xcf\x17\xf0\xe8\x39\xfa\xec\x63\x7e\x11\xdd\x1a\x97\x7f\xd3\xf4\xc8\x5e\xc3\x35\x88\x43\xa3\xfe\x9d\xa7\x58\x38\xc2\x03\x81\x38\xa8\x5c\x5e\xfa\xdf\x35\x92\x80\x3f\xf4\x69\x12\xc8\x71\x71\x6c\x5a\xe0\x73\x5a\x30\x12\x34\x70\x63\x9f\xdd\xcd\xc3\x91\xd6\xbc\xd5\x51\x58\x63\xea\x89\xa9\x82\xef\x16\xa6\xd5\x8b\x18\x3a\x88\x43\xea\x54\x66\x6b\x13\xb0\xa6\xfb\x36\x28\x79\x36\xbd\xa1\x14\x4d\xf5\xd2\x55\xdf\x7b\xf4\xbe\xea\x11\x94\x3f\x79\x37\x34\x19\x54\x78\xa1\xb8\x20\x0e\xfe\x53\xa9\x4e\xbd\x17\x8e\xdd\xdb\x7c\x45\x99\x32\x2f\xaa\x48\xd4\xcb\x34\x78\x77\xfa\x80\x37\x9e\x22\xff\x97\x53\xc4\x0f\x25\x07\xfe\x35\x44\x5c\x10\x07\x8f\x3b\xd0\xdc\x4e\x56\x7f\xf4\x9b\xd1\xf9\xe9\xae\x49\x59\x21\xea\x5a\x48\xc3\xb9\x60\xbd\x68\xc9\x97\xa5\x54\x8d\x64\x6d\x43\x3c\x03\x50\x4d\x27\x80\x83\x4b\xe0\x69\x6d\xc0\xb6\x79\xee\xfd\x3c\xa9\xf9\xad\xe6\xb4\x07\xc5\x65\x75\xdd\xc9\xba\xe3\x8e\xb1\x01\x2a\x1f\xc4\x52\xca\xb4\xe7\x44\x10\x12\x00\x71\x50\xb9\xfc\xbf\x6d\x30\x28\xb9\x9e\x26\x81\xaf\x92\x9d\x43\x1b\xa3\x0f\x9d\x5e\x49\xb7\x99\xb6\x30\xd0\xbf\x58\xd3\x1b\x88\xc2\xfc\x4a\xbe\xbc\xdc\x58\xd2\xb2\x7d\xbf\x2f\x08\x31\x74\x10\x87\x74\x61\x84\xdb\x53\x47\x49\x23\x4b\x6e\x6b\xb2\x2d\xfc\x6e\x1d\x5b\x7e\x34\x0b\xde\xa9\x2c\xf4\xfe\x38\x57\x53\xe9\x1d\x63\x86\x78\xe8\xac\x09\x88\x83\xff\x54\x04\x44\xb9\x18\x8b\x58\x0b\xcf\x6f\x68\x57\x6f\xd2\xbf\x6d\x8d\x53\xc1\x7c\xb3\xa7\xf2\xca\x1a\x55\xd4\x62\x44\xb6\x4c\xb3\x19\xfa\xbe\x20\x0e\x1e\x77\x2b\x84\x8f\x1e\x65\x28\x22\xb0\xb7\xf3\x62\xf0\xd5\xad\xa6\xf1\x0f\x55\xfb\x22\xd5\xf1\xe8\x68\x52\xac\x04\x31\x5e\x35\x0b\x90\x05\x02\x71\x70\x09\xc8\x35\xbc\x6d\xf8\x4d\xdb\x69\xbc\xc9\xeb\xd5\xb3\x14\x4c\x8b\xdd\xb4\x33\x36\xb0\xf4\x3e\xe4\x11\x7b\xd9\xa6\xbf\xb4\x4a\x7a\x25\x62\xf9\x0b\xe2\xa0\x32\x59\xe1\x7f\x5b\x20\xd0\x4c\x77\x9a\x06\xd0\xe4\xd7\x2e\xdc\xb4\xcd\x8b\xda\xc3\xbb\x28\x84\xd6\xed\xb6\x38\x2d\x99\xa6\x7b\x57\x8b\x76\xd3\xe0\x6b\xe2\x25\x79\xfe\xed\x37\x88\xb1\x83\x38\xb8\x06\xae\x8b\x68\x45\x8a\x72\xb2\xd8\x59\x7d\x27\xda\x35\x30\x2f\x90\x77\xde\x3b\x11\x8e\x61\xd4\x4b\xcd\xf6\xbd\x9e\xff\x4d\xe0\xe8\x12\x22\x2e\x88\x83\xff\x56\x12\xf5\x4f\x1b\x6b\x54\x5b\x7a\xa6\x2a\x5b\xd3\x96\x65\x39\x8a\xf1\x8a\x4d\x72\x53\xd5\x93\x97\xcb\xde\xa9\xa3\xd7\x77\x46\x1e\x22\xe2\x82\x38\x78\x5c\x47\x2e\xd1\xc7\x83\xec\x18\xfd\x78\x6f\x8e\x3a\x86\xe6\x98\x33\xd2\x86\x49\x19\x6b\x93\x8d\x63\x0f\x92\x9e\x85\xac\xdd\xde\x85\x2e\xec\x04\x71\x70\x0d\xe0\xb9\xdc\xe7\xe5\x75\x2d\x8e\xba\xc3\xcd\x79\xd5\xd5\xc6\x94\x6e\x44\xbf\xf5\x6b\x91\xc3\x50\x83\x7e\x83\xcb\xb7\x9a\x50\x2d\x75\x84\x06\x40\x1c\x54\x26\x0b\xb0\xc1\xa0\x65\xc7\x69\x1a\x78\x44\x1c\xa1\x4d\x41\x92\xe2\xd7\xf6\xb2\xbc\x40\x4d\x84\xb6\x77\x7f\xcf\x60\x68\x80\xb1\x74\x61\xd9\xb5\x24\x0d\x35\x14\xdb\x11\x31\x76\x10\x07\xd7\x40\x9a\x97\x69\x3d\x91\xec\xc0\x16\xc1\xb9\xfd\xc4\x30\x41\x1e\xed\x42\xff\x3f\xd1\x6d\xc3\x0d\x1e\xb6\xb7\xfb\x05\x30\xbc\x5f\x70\x20\xe2\x82\x38\xf8\x6f\xe5\xdf\x25\x74\x4f\x53\x8f\xec\x4a\x07\x2f\x73\x7c\x74\xbd\x9e\xa0\xb2\xe4\x58\x93\xcd\x6e\xe3\x30\x55\x9b\x37\x71\x30\x0f\x5e\x1f\x74\xda\x04\xc0\xc1\xe3\xa6\x56\xc8\x94\x5e\xb2\xba\xe8\xf9\x90\x99\xef\xc1\xc3\xea\x03\x0b\xbf\xdf\xbc\xa1\xda\xe1\xca\x34\x54\x1d\xf9\x8e\xe4\xd2\x0f\xa1\xd5\x00\x88\x83\x6b\x00\xd5\x9f\x48\x56\xbb\xfc\x47\x32\xce\x51\xfa\xe7\x16\x9a\xee\xc0\x77\x79\x7b\xee\xef\xf6\xa6\xb2\x59\xb4\x8f\xfd\xfd\x6f\x45\x60\x22\x34\x00\xe2\xa0\x3c\x60\xf7\x6f\x1b\x0c\xb2\x50\xa7\xdb\xe0\x27\x3c\x59\xe4\x43\x41\x49\xf9\x39\x1e\x24\xda\xef\xe2\xd7\x3d\x0c\xf3\x5b\xf6\x0f\xc4\xfb\x7c\x7d\x06\x27\x54\x8f\xd5\x59\x24\x11\x96\x12\xc4\x21\xdb\xe0\xa3\xc3\x8f\x6d\xe3\x9a\x3c\xaa\x35\x16\x77\x9f\x24\x56\x30\x06\x15\xcd\x15\x1a\xf1\x60\x16\xed\x85\x7d\xe6\xa1\x20\x7e\x14\x00\xd9\x60\x10\x87\x6c\x83\xcb\x16\x69\xb1\xb9\x9c\x9a\xd8\x43\xbd\x13\xcd\xda\x48\x6e\xdd\xb8\x38\x3e\x65\xcf\xdc\x83\x4d\xaa\x94\xaa\xb3\xe6\xc0\x9d\x45\x81\x88\x0c\xe2\xfe\x8f\x0d\xfe\xef\x05\x0f\x99\x63\xdf\x8a\x04\x96\x34\x2a\xc8\x1c\x72\xce\xab\xdc\xee\x7e\xe5\x19\xfd\xb9\xf0\xa6\xa7\xc5\x4e\x02\x3d\x59\xf1\xbd\x2b\x25\xaa\x90\x0d\xc6\x92\xfe\x92\x9f\x28\xd9\x24\xf5\x58\x74\xee\xf7\x1f\xe1\xc4\xeb\xbe\x01\x9b\xe9\xe7\x09\x15\x0c\x93\x17\x06\x17\x8b\xd4\x13\x3e\xff\x6d\x83\x87\x67\x2f\x2e\xb6\xed\x90\x5c\x75\xcb\x4e\x77\xa0\x62\x6a\xfa\xb5\xdf\x8e\x35\xcb\xae\x7b\xc1\xeb\xda\x4c\x1d\xe6\x61\x89\xe2\xdf\xa5\xd2\xb2\xc2\x74\x36\xd1\xb3\x93\xe3\xa6\x4b\x2d\xd9\xae\x84\x15\x36\xbb\xba\x61\xc3\xd6\xec\xb5\x07\xea\x2c\xb8\xf1\xe6\xab\x1e\x83\xff\x6b\x36\x18\x34\xb4\xbf\x6c\xb0\x04\x92\x0d\x0e\x24\x1b\x6a\x1a\xe2\xf1\x59\xc8\x15\x37\x6e\xd0\xbf\xb8\xef\x86\x26\x94\x15\xe8\xe2\x67\x53\x2d\xa2\x23\xee\xa6\xe8\x85\xa1\x7f\x16\x36\xb8\x09\xc9\x06\x63\xbb\xae\x3c\x1f\x20\x8a\x0f\x2d\x4a\x71\x75\xad\x34\xbe\x1f\xc8\x57\x3f\x69\x76\xbc\xa0\xc3\x39\xd7\x2c\x5d\xd8\x9d\xf2\xe7\x4c\x76\x83\x25\x90\x6d\x30\x51\x15\xc1\xb0\x3f\x66\x32\x15\x73\x87\xfb\x74\x9a\xc7\xc7\xe7\xb9\x62\x16\xdc\xd5\x4b\xd7\x7b\xe3\x58\x39\xde\x2c\x87\xbd\xda\x39\x93\x6d\x59\x64\x1b\x2c\xc5\x7e\x49\x04\x43\x24\xf5\x99\x1c\xa7\xa6\x11\xa6\x71\xb4\x5c\xb3\x5f\xf0\xfc\x39\x07\x6a\x9e\x84\x16\x61\x34\x1a\xba\x4f\x7d\x67\x32\x5a\x64\x1b\x2c\xc2\x8a\x6f\xd2\xff\x72\xeb\xa9\x77\x49\x28\xd7\xad\xba\x6a\x7f\xf5\xd4\xa4\x0a\xac\x29\xe2\x32\x37\xbb\x10\xd6\x1f\x3e\x14\xc5\x67\x66\x83\x41\x1a\x3a\x6d\xe2\x5b\x0d\xec\xcc\x2d\x5f\xca\xa8\xca\xa0\xa9\x8a\xb9\xd3\xb3\xe6\x24\x55\xe4\x60\x15\xaf\x57\xfb\xe5\xe9\x0a\xdd\xcb\x6b\xb2\x74\xd3\x88\x84\x0f\xe2\xe0\x13\x5f\xc5\x20\x1d\xf1\xe7\x0a\xf1\xb6\x57\x27\x3f\xea\x70\x8e\x19\xd5\x42\x99\x88\x72\x64\x63\x85\x0b\xe4\x6a\xa8\x38\x7c\x1e\x44\xc7\x22\xe2\x82\x38\xa4\x2d\x3b\x9a\x02\x86\x3a\xd9\xbe\x99\xaa\x96\xdd\xf1\xb8\x6a\xb6\xb1\x4d\x42\xab\x8b\x35\xec\x3b\x81\x0a\x4c\xe3\xaf\x1c\xaf\xfc\x80\xf6\x00\x40\x1c\x52\xf7\x57\x2e\xf2\xfc\x4a\xa9\x36\xee\xd8\x17\x64\x9f\x23\x73\xe5\x62\x75\x6c\xc4\x75\x1e\x9d\x77\xb8\x27\x92\xce\xbb\x90\x42\x94\x03\xdd\xd6\x0c\xe2\xfe\xcf\x04\xf5\x1f\x23\x70\x58\x47\xbe\xab\xcc\x5c\xfb\x48\xe0\xf6\x4d\x59\x87\x37\xf2\x5a\x15\xed\x8d\xb1\x73\x82\x97\x2b\x6b\x44\xe5\xe5\x46\x39\xab\x11\x1e\x08\xc4\x41\x35\xcb\xff\xb6\xc1\xa0\x3f\xf4\x69\x12\x68\x0f\x4c\xae\x9b\x55\x49\x9d\xa9\x97\xe4\x73\xbd\x82\x45\xfb\x8e\xa2\xd7\x22\xb5\xbd\x68\xee\x06\x6f\xa7\xe1\xdb\xc6\x67\x4f\xa0\x46\xd5\x20\x0e\x2e\x01\x4c\xfa\xe5\x94\xe1\xc6\x37\x1d\xa8\xd3\xfb\x83\x5f\x08\xa6\xdc\x09\xe7\x6f\x75\x5f\x89\xbc\x62\x82\x73\xa7\x9c\x7c\x4e\xba\x10\x6a\xc1\x05\xe2\x90\xca\xcb\x7f\xcd\x1d\xa1\xd9\x46\x8d\xc5\xbf\xc4\x21\xe7\x4a\xc4\x74\x0c\x94\x15\x73\xa8\xca\x49\x27\xb1\xac\xfa\x64\x78\xbb\x6b\x2b\x04\x2a\x2f\x07\x70\xf0\xb8\x74\x7e\xec\xb6\x2b\x5a\x43\xb5\x54\x6a\x84\x9d\x39\x37\xeb\x64\x07\xbe\xbc\x25\xd7\xa9\x7c\x16\x9b\x7d\x27\xcf\x23\x4a\xff\x3c\xb4\xc5\x08\xe2\xe0\x12\x70\x63\xfc\x49\x45\xc7\x10\x49\x5c\x50\x66\x77\xde\x55\x98\xec\x47\x2c\x33\xed\xb3\x8a\xf7\x73\x7d\xb1\xac\xd4\x3d\xc4\xfb\x5e\x8c\x08\x09\x80\x38\xa8\x66\x19\x70\x28\x1a\x90\x5c\x4f\x93\x40\x35\x4b\x27\xeb\xaf\x4e\x2e\xb6\x1f\xfe\xad\xba\x31\xcf\x74\x0b\xd7\x22\xcd\xd9\x50\x27\x4c\x74\x27\x87\x9f\x86\x59\xd6\xda\x78\x41\xf5\x64\x00\x0e\x2e\x01\x76\xb6\x1c\x31\x3e\x1e\xfb\x3d\xb5\xca\x97\xae\xd9\xae\x81\xbc\x51\x87\xd6\x57\xef\xdc\xf0\x5d\x43\x7f\x99\x66\xa9\xcd\x61\x00\xbd\x0c\x03\x71\xf0\x9f\xca\x84\x65\xb9\x93\x9b\xfd\x20\x2d\x51\xb6\x42\xe1\x4f\x00\xc1\xd8\x94\xa8\x41\x42\x61\x1b\x73\x24\xc1\x40\x9f\xfc\x60\x87\x31\x74\x26\x04\xc4\xc1\xe3\xb2\x96\xae\x78\x96\x26\xcc\x74\x4f\x25\xeb\x88\x87\x6b\x4f\x25\xdc\xbe\xe9\x76\xd8\x94\x2c\x1f\x95\x3a\x49\xf3\x99\x8e\x6e\x09\x7a\x13\x02\xe2\xe0\x12\xf8\x6a\xcb\x1d\xd1\xbe\x9b\x36\x13\x4c\x74\x4e\x4c\x07\x7d\xe3\xbc\x3e\x89\x5b\x52\x71\x41\xd2\xc8\xe3\xe6\xe1\x80\x76\x81\x66\x6f\xc4\xf2\x17\xc4\x41\xb5\x8a\x00\x1b\x0c\x9a\xe9\x4e\xd3\x00\xee\xf6\x6f\x6b\x5a\x26\xfa\x23\xaf\x76\x54\x27\x81\x4c\xb2\x3b\xd4\xaf\xde\xe2\xa8\xdf\xde\xf3\x16\x8a\x6f\xd4\x0a\xca\xc0\x87\x0e\x98\x82\x38\xb8\x06\x16\x7b\x89\x7f\xcd\x1e\xb7\x3d\x0f\x2c\x90\xab\xfc\x29\xa1\x85\x71\x32\xde\xbf\x75\x4e\x81\xec\x0e\x3f\x45\xbc\x7f\xf3\xdb\x36\xe8\xd5\x02\x88\x43\xda\xb1\xb3\xa6\x21\x64\x68\x8c\xc5\xe9\xc8\x6d\x11\x23\x32\x0b\xa3\x0a\x25\x25\xec\x52\xc6\x6a\xa5\xcc\x4c\x9e\x9f\xb2\xea\x65\x81\xba\x50\x81\x38\x78\xdc\xb6\xde\xfd\xa0\xaa\x0b\x77\x2c\xd7\xc3\x89\x45\x05\xae\xef\xbe\x4c\xec\x67\x6d\x72\xd7\xf2\xa6\x5f\x75\x31\xd1\xd5\x58\xb8\xa9\x88\x88\x0b\xe2\x90\xd2\x00\x77\x3b\x4f\x84\x4e\x8d\x0e\xbb\x07\xae\x59\x49\x3c\xe1\x23\x55\xef\x2b\xab\xe1\x8b\x1f\x0e\x79\x25\x7f\x13\x8a\x2e\xbe\x79\x81\xd0\x00\x88\x83\x6a\x15\x01\x36\x18\xb4\xec\x38\x4d\x03\xdd\x2b\xfb\x42\x43\x02\x95\xf6\xa3\x22\x12\x79\x18\x7d\xcf\x27\x8b\x6e\x4a\xf2\x7a\x57\xef\xd2\xb4\x4f\x4c\x30\x9f\xac\x54\x43\xbb\xb6\x20\x0e\xae\x81\xfb\x1f\xa6\xbf\x60\x6c\x44\x5e\xf7\xe6\x9d\x43\xc1\xcd\x36\x9f\x9c\x19\xd0\xce\xb9\x84\x55\x63\x33\x5c\xbb\xbe\x4b\x8f\x87\x0d\xbd\xb2\x00\x71\xf0\xdf\x0a\x25\x41\x78\x52\xb2\x74\xb8\xb0\xa2\x59\x78\x80\xd8\x9d\xe9\x64\x53\xcb\xbc\x71\xd5\xca\xc7\x89\xa8\x5b\x6e\x8d\xef\x97\x38\xd4\xd9\x0b\xc4\xc1\xe3\x32\x57\xdb\x63\xa0\x0d\xf9\xe5\xf9\x17\x3f\x6a\xfa\x14\xf1\xa1\xc9\x21\x7d\x3d\x4a\xe6\xf6\xf9\x89\xb4\x6a\xee\xf7\xa1\x1f\x93\xa0\x9e\xed\x20\x0e\xae\x81\x00\xa7\x95\x2e\x0d\x41\xaa\xb8\x67\x57\x8c\x42\x0d\xed\xb3\xd3\xd2\xf8\xc6\x37\x2c\x13\x42\xcf\x49\xbc\x2c\x7e\xe1\x53\xb0\x35\x8f\xd0\x00\x88\x83\xf2\x00\xc0\x06\x83\x2c\xd4\xe9\x36\x98\x4f\x55\x20\xfe\x6a\x6c\xed\x89\xdd\x96\x00\x21\x8b\xe3\xfb\x47\xf9\xb6\xce\x0f\x9e\x07\xd4\x8c\x05\xfe\xbe\xf9\x94\xfc\xe8\x33\x3d\xc2\x52\x82\x38\x64\x1b\xac\x2d\x18\x67\xdb\x43\x1c\x15\xf0\xce\xd5\x9d\x69\x77\x59\xdc\xa4\xbe\x99\xf4\x7c\x28\x06\x7d\xc2\x8f\x54\xcb\xef\xc4\xe1\x62\x57\x11\x91\x41\x1c\xb2\x0d\x2e\xaf\x23\xf3\x63\x9e\x9f\x6b\xe9\xba\x6a\x26\xc8\xaf\xa9\x6a\x21\x4b\xf1\x9b\x98\x7d\xae\x6c\x3a\xc0\xb1\xf9\x7e\x8e\x34\x57\x03\x22\x32\x88\xfb\x3f\x36\xf8\xbf\xda\xd5\xdd\xaf\x7c\x1b\x5c\x1f\x6d\xfe\x29\xd7\xd8\xdd\x60\x5f\x6d\x0f\x27\xc5\x4a\xfa\x80\x48\x77\xf4\xca\x8e\xd9\xa5\xd0\x83\x28\x2b\xc8\x06\x33\x3f\x52\x60\x95\x44\x1f\x4e\x5b\x88\x28\xff\xed\x1e\xf5\x92\xf5\x97\x4d\xf5\x6d\x43\x25\xad\xb2\xb7\xef\x88\xb5\x2f\x8e\x1b\x62\xff\x6d\x83\xdd\x66\xed\xa4\x54\x5c\xbd\x16\xff\xc8\x69\xea\x4b\x31\x94\xbc\xa5\x6a\x09\x7f\x99\x2e\xf9\xb3\x59\xd6\x72\x27\xf1\xae\x54\xff\xd0\x5f\xe8\x44\xc6\x80\x9b\x35\x85\x72\x56\xce\xd2\x66\xfb\x84\xbe\x4f\xd9\x93\x50\x4d\x96\xf5\xe3\xc4\x38\xa6\x27\x74\x8d\xb4\x51\x9f\xb4\xff\xd7\x6c\x30\x68\x68\x7f\xd7\x06\x23\xd9\xe0\x1e\xd6\x74\xef\x95\xfa\x7e\x5b\xf6\x11\x9d\x45\x15\x52\xa5\x41\xf3\xf5\xc9\x6c\x5a\x41\xa1\x89\x67\xb9\x76\xd2\xaf\x4c\xb0\x3e\x9f\x85\x0d\x46\x51\x85\x7f\xea\xde\xd0\xc6\xef\x25\xaf\xbe\xca\x2c\xb2\x8d\x5f\x01\xfd\xa5\x8d\xad\x7e\x75\xb4\xd7\xcd\xf6\x3e\x2c\x77\xb0\x29\xbb\xac\x56\xb1\x9e\xc9\xb6\x2c\xb2\x0d\x0e\x09\x96\x69\xc3\x8c\x9f\xd7\xb8\xd7\xe7\x7c\x54\xa6\x59\xe0\xf1\xb5\x0d\x17\x7b\x1b\x83\xe7\x6e\x60\x72\x10\xdf\xee\x2e\x99\xc3\x99\x6c\xcb\xde\x43\xfa\x58\xd3\xaa\xb2\x95\xe1\xa9\xe2\x67\x8e\x7b\x5d\x4e\xd3\x07\x8c\x58\x5e\xe7\xee\xd4\xaf\xb6\x35\x0f\xad\x08\x28\xd3\xc4\x99\x5e\x26\x3c\x93\xd1\x22\xdb\xe0\x5c\x89\x1c\x6d\xec\x2e\x16\xfa\x65\x85\xcf\x4b\x4c\xd3\xd1\x76\x83\x0e\x5e\x9b\x8b\xb3\x53\x45\x22\x41\x68\x31\x69\x29\x76\x5b\x67\x66\x83\x41\x1a\x3a\x6d\xe2\x33\x0b\xbe\xc0\x51\xde\x10\x10\x2a\x59\xe9\xb4\x77\x43\x11\xbd\xc5\x8e\x31\x3f\x75\xfb\x47\x07\x46\x8c\xa1\x7d\xd7\xaf\x56\x6b\x68\x0f\x00\xc4\xc1\x27\x3e\xf7\xc9\xb8\xe6\xc6\x6b\x54\x06\xb2\xdd\xef\x77\x82\x88\x1a\xc3\xb8\x32\x86\x98\x8c\x97\x66\x59\xbe\x1d\x4a\x78\x95\x55\x05\x43\x15\x61\x20\x0e\x3e\x41\x8d\x29\xd7\xbd\xf9\xf6\x73\xd3\xd2\x2b\x79\x60\xb6\x31\xd0\x60\xd8\x59\x32\x49\x89\x62\x73\xf6\x59\x57\x36\x9f\xac\x59\x10\x2e\x74\xa9\x2b\x88\x83\xbf\xa7\x95\x6a\x4a\x23\xa7\xdb\xc9\x9c\x90\xd6\x92\x96\xf3\x8b\x1e\x6f\x3d\x0e\x6a\xb4\xab\x2e\xd8\x7b\xdb\x52\xe5\xb5\xe3\x3b\x47\x0c\x55\x84\x81\x38\x3f\x29\x9c\xff\x3c\x07\x3d\x89\x07\xf8\x2d\x5e\x1c\xfa\x9e\xd4\x69\xe3\x4c\x2f\x04\x30\x3d\x2c\x0e\xf9\x28\xb1\xc9\x1c\x6e\x88\xa1\xd4\xdc\xb0\x38\x17\x84\xf0\x40\x20\x0e\xaa\x0d\xfe\xb7\x0d\x06\xfd\xa1\x4f\x93\xc0\x63\xce\xc0\xe9\x0f\x5f\x5f\x3d\xf3\x1b\x8c\xe3\x1c\x5a\x9c\x63\x5c\x69\x62\x4c\x36\x96\xe9\x7d\xf2\x3b\x81\x46\x4d\xff\xf2\xf3\xdf\x88\xa1\x83\x38\xb8\x04\x82\xb2\x94\x5e\xd9\x7a\xe1\x1f\x72\x26\x51\x62\x7c\x89\xc7\x67\xd1\x3b\x48\x48\x53\xe4\xe0\xd6\xae\x7f\xe0\x87\x5f\x1c\xd8\x33\x83\x88\x0b\xe2\x90\x4e\x43\x32\xe6\x24\xd5\x85\xef\xea\xeb\x56\xbf\xbd\x4c\x9d\x45\x18\xf4\x2a\xb4\x4f\x5f\x7f\xbb\xc4\x7d\x28\x10\xfb\x61\xc0\x79\x1c\x7a\xe8\x34\x24\x80\x83\x4b\xc0\xe4\x85\x49\xb1\x41\xf1\xc4\xb2\xbf\x21\x7b\xad\xf1\xe3\x92\xac\xda\x8a\x5f\x6f\xb8\x3f\x2f\xdd\xc0\x69\xd1\xf8\x64\x99\x2e\x49\x08\x79\x2b\x00\x07\x97\x80\xe8\x08\xaf\x19\xea\xa8\x48\x30\xea\x34\x25\x35\x09\xcf\x62\x90\xb5\xf7\x43\xa3\xda\x3d\x3f\x5f\x73\xd5\xc3\xa1\x87\xf7\x25\xb3\x11\x12\x00\x71\x50\x6d\xb0\xea\x3f\x25\x00\x4a\xae\xa7\x49\xc0\xfb\x53\xfe\xb8\x7f\x5a\x4d\xbd\x48\x79\xbd\x2a\xbd\xb8\x23\xfb\x1b\xea\x19\xdd\xf0\xd0\xc2\x50\xfd\x96\xa6\xde\x2f\xce\xc7\xdd\x88\xa1\x83\x38\xb8\x04\xe6\x78\x72\x06\x2a\xaf\x68\x4c\xb3\x15\x37\xdf\xbb\x26\xd9\xe1\x65\xe3\x8c\x56\xc3\x3f\x66\x16\xd8\x2f\x67\xdc\xad\xff\x40\x05\x6a\x42\x0c\xe2\xe0\x12\x20\x52\xba\x8a\x83\x4b\xba\xaf\x55\x2c\x47\xfa\x8c\x82\x62\xd2\x7d\xe8\x5b\x94\x49\xf1\x1a\xfb\x8a\x5e\xea\xa2\x1b\xef\xd1\x4f\x43\x44\x5c\x10\x07\x97\x40\xd9\xcb\xb2\xf0\xfd\xb0\x93\x0f\x9e\xf3\xac\x66\x68\xc2\xcd\xaf\x06\xaa\x3b\xe2\x78\x51\x2e\xd5\xb6\x3e\xea\xd5\x9a\x11\x97\x86\x9e\x03\x88\x83\x4b\xa0\x4e\x58\xd0\xbf\x8d\x15\x95\x59\x49\x3f\xf6\xdb\xb4\xb2\x56\xae\x9c\x49\x76\xa8\x29\xfa\xc0\xbd\x8d\xf7\xaf\x52\x7f\x0e\x06\x85\x23\x96\xbf\x20\x0e\xaa\x09\x04\xd8\x60\xd0\x4c\x77\x9a\x06\x70\x42\x7e\x7e\x4f\xba\xaa\x11\xde\x2b\x25\x96\x71\xdb\x4f\xf9\x7d\xe5\x8f\xad\x6e\xe3\xc0\xe7\xe6\xbf\x14\x2d\x2e\xc8\xa5\xa5\x41\x56\x05\xc4\xc1\x35\x30\xdd\x3a\x3e\xa3\x41\xfe\xee\x67\x9e\x5a\xe3\xc9\xe2\x61\x2d\xa7\xdf\xf2\x38\xb1\x17\x8e\xc0\xc0\xd3\x63\xe1\xba\xed\xe7\xab\x50\x97\x08\x10\x87\x54\xc7\xed\x3c\x37\xc7\x42\xf3\x53\xfc\x77\x64\xfc\xbe\x3a\xd5\x5d\xbb\xd7\xcc\xe8\x82\xa6\x4d\xdf\x95\x46\x0c\x93\xdc\xea\xb9\x86\xa1\x57\x2c\x20\x0e\xae\x81\x70\x51\xff\xb0\x3e\x7b\xf6\xf9\x4f\xf7\xd6\x7a\x13\x95\xde\x6c\xdc\xf6\xf4\xfb\x98\xc4\x9b\xc4\x1f\x9d\xcd\xf1\x69\x83\xfb\x12\x54\xcb\x01\xe2\xe0\x1a\x68\x4d\x1f\xea\x5b\x8f\x2a\xf9\x21\x5a\x30\x39\x91\x2d\xbf\xfc\xc4\xd8\xc5\xca\xfe\x9b\xf9\xd7\x66\x9c\xfb\xf1\x74\x51\xf4\xd7\x7a\x11\x1a\x00\x71\x50\x6d\xf0\xbd\x7f\x6b\x00\xb4\xec\x38\xf5\x26\xd3\xf4\x85\x4f\x64\xb2\x07\x99\xeb\x86\x62\xdf\x0e\x0e\xd2\xa6\x2f\x88\x34\x87\xd8\x75\x88\x86\xf8\x89\x07\xe4\x7c\xed\xdc\xe0\x41\x8c\x1d\xc4\xc1\x35\x20\x7b\xbd\x70\xdb\x31\xcb\xe0\xe1\x9d\xa6\xec\xeb\x9b\x6b\x25\x6c\x89\xf6\xc3\xe6\x5a\xcf\x4b\x30\x9c\xb6\xec\x2b\xd0\x7f\xa1\x40\xcd\xd3\x41\x1c\x52\x11\xc3\x84\xee\x79\xf3\x8e\xed\xab\x36\x44\xfe\x77\x4d\xf5\x56\x36\xdf\xdd\xa5\x3c\xb0\xd5\xb7\xc5\x7f\x7c\x9f\xa2\xfc\x6e\x5f\x9c\x0a\x54\xc4\x00\xe0\xe0\x1a\xc8\x3d\x11\xce\x72\x27\xdc\x91\x5c\xbe\x24\x42\xf9\x02\x7b\x3f\xf5\xb3\x2e\x3b\xf6\x95\x3f\x01\x05\x26\x65\xa9\xc9\xca\x47\xf4\xdc\x88\xb8\x20\x0e\xae\x81\xdf\xc7\x2d\xc7\xd3\xbe\xae\x85\x1c\x69\xa4\x06\x4a\x73\x57\xe6\x43\x3a\x5f\x70\x56\xa5\x8d\x31\x5f\xbe\x72\x60\x5b\xd4\xf8\xfe\x2e\x42\x03\x20\x0e\xca\x03\x00\x1b\x0c\xb2\x50\xa7\xdb\xe0\xe9\x6b\xe4\xda\xe8\xcb\xba\x93\xcd\x49\x8d\xcc\x9f\x5d\x02\x52\x15\xad\x5b\xf6\xdf\x26\xda\xef\xb0\x60\xae\x47\xa2\xe1\x51\x8f\x22\x2c\x25\x88\x3b\x65\x37\xf8\x5e\x71\xa0\x48\xdd\x12\xe5\x87\x4f\x8d\x43\xc1\xbe\x7b\xbb\x0a\xae\x99\x91\xda\x5b\xc6\x8b\xa4\xbe\x99\x1b\xc5\x09\x2c\x5b\xd0\x6e\x30\x80\x43\xb6\xc1\x94\x56\x69\xad\xb4\x35\xe5\x1f\xd9\xd4\x56\x23\xd4\x1f\x90\x4d\x18\x18\x4d\x06\x34\x6e\xb0\x6e\x94\xa1\x65\x38\xc6\x05\xe3\x04\x20\x22\x83\xb8\xff\x63\x83\xff\xdb\x44\x5d\x77\x58\xab\x87\xae\x2a\x94\x30\xe5\x50\x56\xf1\xe1\x61\x88\x51\x92\x8e\xb7\xfd\x82\x71\xa0\xf0\xf7\xfb\xac\x11\xe5\x56\x6c\x78\x90\x0d\xce\xc0\x8d\x8a\xdc\x58\xfd\x9e\x39\xb7\x2e\x51\xc2\x9f\x21\xb6\xc0\x8e\xca\xff\x31\x7c\x65\x61\x7f\x2d\x4d\xa8\xa4\xb7\x7a\x8c\xe1\x6f\x1b\xac\x5f\xce\x37\x5c\x2c\x12\x18\x47\xd5\x11\x71\x65\x96\x57\xf9\xb2\x9b\x7e\x4a\xee\xb9\x96\x0a\x74\xa6\xd7\x91\x57\xc8\x87\x43\x67\xff\x42\x6d\x3d\xce\x99\xb9\xa4\xe5\xcf\x95\x5c\xb7\x6a\xa5\xcd\xcc\xa5\x6f\xee\x32\x0d\x99\xe1\xb0\x92\x53\x20\xba\xc3\x4c\x57\x74\xaf\xec\x7f\xcd\x06\x83\x86\xf6\x77\x6d\x30\x92\x0d\xd6\xc5\x99\xd4\xbb\x81\x76\xab\x88\xcc\x7b\x41\x9f\x37\xb6\x28\x26\x5f\xe3\x50\x56\x4d\xed\xd3\x4b\xd5\xad\xa9\x6d\xb2\xc0\x0b\x17\xcf\xc2\x06\x4b\x20\xd9\x60\x9f\xf7\x4b\xaa\x87\xe6\x05\xa4\x9f\xad\x66\xc3\x3c\x59\xd4\x9e\xb7\x4b\xcd\x9f\xaf\x70\x43\x13\x6f\xd2\x51\x53\xbc\x8c\x4d\x93\x72\x26\xdb\xb2\xc8\x36\x38\x53\x41\xc1\x7d\x8a\xc7\x10\x97\xcd\xf3\x59\xa9\x58\xf3\x92\x6a\x5f\xb5\x50\xa6\xd2\xb3\xb0\x80\xc8\xbd\x9f\x27\x18\xe7\x1b\x7c\xce\x64\x5b\x16\xd9\x06\xeb\x48\x1a\x99\x7e\xa7\x9d\x0b\xf9\xad\x74\xa1\xee\xb5\x56\x72\x9e\xbd\x81\xd1\x44\x09\xf6\x65\x0b\x11\x5e\xfa\x88\x67\x52\xbe\xbd\x67\x32\x5a\x64\x1b\x1c\xd8\xbe\xd5\x4b\x8b\xa5\x18\x65\xbc\xf6\x55\xb0\x52\x8e\xec\xd2\xfd\x39\xde\xa1\xc4\xfe\x93\xdd\xfb\x9b\xcc\x1a\x9a\xa2\xbf\x66\xce\xcc\x06\x83\x34\x74\xda\xc4\x37\x9a\xe1\x15\xf7\xf3\x66\xd9\xec\xe1\x53\xdb\x29\x9a\x01\x73\x51\xd6\xdb\xdb\x99\xfa\xdb\x81\x84\xa9\xa5\x96\x7d\x9f\x15\x9e\x7d\x42\x24\x7c\x10\x07\x9f\xf8\x2c\xaa\xe9\x4b\x39\x25\x54\x63\xe5\x95\xf9\xb6\xca\xbc\xe3\x2c\x48\x70\x1a\x18\xaf\x55\xb3\x6f\x69\x70\x5f\x53\x51\xba\xf2\xb6\x1d\x11\x17\xc4\x21\xdd\xdd\xab\x7e\xa7\x6a\xa8\xb4\xe4\x55\x97\x70\xd5\x02\xb7\x2f\x31\x6d\xd4\x7a\xb3\xe3\x60\x5b\xe1\xb1\x9d\x17\xea\xc6\xee\xbe\x50\x26\x22\x2e\x88\x83\x4f\x7c\xd7\xa6\x4b\xd8\x2e\x4b\x63\x66\x73\x4a\x14\x67\xd4\x7e\x4f\x95\x26\xfb\x18\xde\x56\x50\x60\x64\x7f\x49\xe5\x67\x48\x61\x32\x1e\x74\x2b\x11\x88\x83\x3f\x87\x9a\xc6\xd6\xc4\x4c\x16\x6e\x52\xfa\x1e\x1c\x5c\xca\xa9\x20\x8a\x27\x83\x46\x3f\x88\x3a\x0c\x0e\xe7\x25\x6a\x65\x38\x45\xd6\xc4\x10\x1e\x08\xc4\x41\xb5\xc1\xff\xb6\xc1\xa0\x3f\xf4\x69\x12\xd0\x5f\x1c\x73\x8b\x6b\xed\xd4\x4c\x53\xee\x10\x15\x78\xef\xff\xdd\xcb\x7b\x54\x23\xe8\x8b\x46\xef\x7c\xf5\xf2\xaa\x8c\xb3\x0c\x2b\x62\xe8\x20\x0e\x3e\xf4\xf1\x0f\x57\x78\xf3\x2f\xe9\xd2\x4c\x69\x73\xfc\xf1\xbe\x26\x50\xf4\x8d\x2e\x72\x89\x89\xf8\x4e\x5c\xf2\xbd\xcd\x88\x77\x3c\xe4\x2f\x11\x71\x41\x1c\x52\x6f\x9c\xed\xc1\xaf\x99\x16\xd8\x83\xf2\xa4\x39\xc9\x5e\x5f\xea\xe5\xdf\xd2\x8f\x49\x77\x53\x52\xfb\x71\x49\xc5\x0d\x27\xe4\x7e\x81\xd6\xbf\x20\x0e\x2e\x81\xe5\xbd\xb0\x15\xa7\x43\x07\x06\x79\x9b\xe8\x83\x9d\xf8\xaa\x83\x2d\xdb\xb8\x67\xcb\x09\xca\x87\x7f\xaa\x94\x8f\x4d\xc3\x6f\x43\xd7\xd3\x81\x38\xf8\x73\xf8\x66\xc0\x10\xdc\x2c\x5d\xaf\xf5\x24\x8a\x3c\x78\x70\x14\xa5\xc6\xe7\x1a\xbf\xe8\x44\xe0\x8b\x31\xf2\xfb\xc2\x75\xda\x47\xe2\xb7\x10\x12\x00\x71\x50\x6d\xf0\xbf\x6d\x30\x28\xb9\x9e\x26\x01\x86\xea\xf8\x40\xdd\xfb\x6c\x36\x71\xc4\x69\x58\xbc\x7a\x21\x22\xc7\x45\x0c\x42\x44\xc3\x17\xf6\xf5\x98\x26\xdf\xba\xc8\x90\xd5\x21\x86\x0e\xe2\xe0\x43\x7f\x68\xce\xac\xa2\xe4\xdc\x41\x91\x6c\x10\xb5\x64\xa4\x4f\xc5\xad\x81\x7d\x2e\xe9\x7d\xd9\xde\x62\xa4\x70\x2e\x83\xc5\x3b\x7f\x68\xb7\x06\xc4\xc1\x25\x90\xeb\xb1\x72\x2f\x55\x36\xf1\xd1\x83\x82\xc6\x67\x76\x6a\xb4\x45\x66\x78\x7f\x22\xa5\x6a\x9a\xb4\xdb\x7e\xec\x65\xc4\x17\xb6\x42\xd9\x05\xc4\xc1\x25\x50\xf9\xae\xa0\x98\xec\xe3\x37\xad\xe8\x5b\x03\x4f\x45\xde\x4f\x6a\xef\x7a\x6e\xe6\x4b\x7e\x43\x7b\x25\xa9\xb0\x89\xe3\xf8\x80\x13\xea\x5c\x0b\xe2\x90\x3a\x79\x9f\x7b\x1e\xf1\x42\xbc\x2c\x74\xb1\x47\x7f\x61\xa7\x61\xf7\xd7\x2d\xbe\xfa\xce\x97\x3f\x5a\x1e\xd5\xa9\xdd\xfd\x70\x8b\x2e\x2f\x12\xb1\xfc\x05\x71\x50\x4d\x20\xc0\x06\x83\x66\xba\xd3\x34\xf0\x2e\x4f\xec\xb0\xa7\x59\x42\x23\x9c\x9f\xe2\x75\x81\x64\xe8\x32\xab\x01\x79\x7e\x34\xf1\xce\x98\xbd\xe5\xfa\xb6\xe7\xaa\x52\x13\x62\xec\x20\x0e\xa9\x45\x40\x0f\x79\x27\x05\x03\x0b\xf5\x08\xf3\xc5\xbd\x7a\xff\xb5\xc6\x0c\xd5\x8e\xb8\xb7\xd2\xc2\x74\xa4\xdf\x42\x0e\x34\xf6\x9f\x43\xf5\x9b\x20\x0e\xa9\x45\xc0\x9d\xc6\x9b\x66\x5a\x62\xdf\x45\xc3\x53\xbd\x84\x33\xa9\x6b\x13\x96\x48\xfb\x6e\xb7\xe5\x4d\x68\xe4\xf9\xa8\xd0\xc4\x5a\xb3\x41\xf6\x1a\xc0\xc1\x35\x30\xc5\xb0\xde\x89\xa5\xf7\x2c\x66\xb1\x23\xc6\xeb\xda\x7b\x92\x25\xd1\x4f\x6a\x1d\x65\x91\x32\x9b\xa2\xe8\xcd\xcd\x25\x9f\x88\xcb\x10\x71\x41\x1c\xd2\xc9\x88\xf6\x71\xe9\x99\x9f\x4e\xb9\x7f\xc6\xa8\x06\xe5\x12\x5a\x5b\x6e\x48\x70\xe5\xac\xfe\xa9\x55\xf9\xd5\x91\xf1\x0a\xef\xeb\xce\x20\x42\x03\x20\x0e\xaa\x0d\x06\xd8\x60\xd0\xb2\xe3\x34\x0d\xe4\x97\x55\x6f\x7e\x8b\x99\xa7\x4e\xbb\x4b\xb7\x18\x3d\x56\xe4\xbd\x67\x7f\x83\xe2\x18\x63\xf7\x70\x4f\x91\xfc\x55\xc1\x9f\x1f\x50\x13\x7f\x10\x07\x1f\x7b\x18\xde\x78\xed\xad\x35\xad\xd7\xd3\x25\x11\x96\x75\x4a\x64\xd6\x8a\xcc\xe8\x77\x7c\xd6\x8c\x39\xef\x3a\x6d\x4c\x4a\x18\x6a\x06\x20\xe2\x82\x38\xb8\x06\x44\x42\xd6\x4e\xf6\xff\x38\x33\xde\xf0\x14\x6f\x7b\xa9\x51\xea\x1e\xeb\x95\x90\x64\xa8\x4a\xf4\x79\x66\xfb\x23\x3f\x5f\xb4\x46\x15\x54\x74\x01\xe0\xe0\x1a\x10\xad\x76\xc8\x5a\xbe\xc2\xac\xb8\x75\x38\x3a\x9e\xfd\x7b\x79\xe0\x5c\xb2\x90\x3c\xad\x08\x66\x13\xcb\x10\xc3\x87\xb8\x67\xf2\x34\x88\xb8\x20\x0e\xa9\x48\x64\x83\x91\x56\x91\xb0\xe8\xf2\x89\x4c\x19\xed\x46\xc4\x17\xad\x5c\xea\x26\xcd\xfd\xe7\x61\xbe\x35\x86\xf9\x35\x1d\x98\x37\xce\x23\x34\x00\xe2\xa0\x3c\x00\xb0\xc1\x20\x0b\x75\xba\x0d\xa6\xf7\xf0\xb0\x75\x67\x1a\xe6\x6d\xd4\x7b\x7d\x89\x89\x45\xf1\x86\x8a\xf2\x71\xac\x02\xd5\x11\xdd\xb4\x20\xa1\xb2\x73\xec\xdc\x35\x84\xa5\x04\x71\xa7\xd4\x06\xff\x49\x5c\x10\x9f\xbe\x88\x13\x35\x8f\x61\x5a\x7e\x5e\x3e\x8e\x30\x2e\xaf\x5f\x4a\x65\x2d\x3f\xcd\x8b\xbf\x40\xa9\xb3\x72\x1c\xaa\x0d\x06\x70\xc8\x36\xd8\xb4\xf9\x43\x2f\x15\x89\xe5\xe5\xcb\x17\x94\x72\x07\x4f\x08\x79\xa6\x36\x51\x63\xef\x86\xd1\xb0\xd9\x87\x0b\x4f\x66\x33\xdf\x95\x45\x44\x06\x71\xff\x9f\x0d\xfe\x8f\x16\x2c\x3c\xe9\xc6\xae\x35\xec\x8b\x05\xc5\x76\x92\x39\x38\xdd\xfe\x1c\xdd\xc7\xd5\x33\x25\xe5\x8b\x3a\x4c\x91\xe2\xcb\x4e\x38\x29\x0b\xd9\xe0\x35\x85\xe0\x8e\xa2\x8c\xd7\xd2\x44\x89\xf7\x19\x3e\xe0\xe4\x3c\x8e\x8c\x16\x9a\xf7\xe6\xf9\x44\xb2\x51\x1c\xc0\x93\x41\x50\x57\xfa\xb7\x0d\xbe\x98\xff\x60\x56\xc9\x54\x3a\x06\xcd\x87\xa3\xe8\x51\x5e\x3e\x15\x6d\x3a\xfa\x3d\x53\x3b\x42\xbb\xda\x5e\xb2\xb9\x10\xe1\x84\xb4\xbf\xd0\xfd\x30\x8f\xeb\x5f\x28\x9e\x86\xa3\x7f\x0b\x4e\xcc\x17\x9e\x4c\xa1\xc5\x35\x5d\x7d\x18\x9e\x52\x77\x93\xbd\x85\x8a\x92\xf2\xd2\xd8\xff\x9a\x0d\x06\x0d\xed\xef\xda\x60\x19\xb8\x57\x62\x55\x61\x64\xc9\xd7\xe5\x10\x70\x3e\xf7\x27\x2b\x46\x57\xc2\xed\xea\x77\xd1\xa9\x8d\xd7\xbf\xb1\x76\xb6\x89\x8d\xd2\x14\x48\xcf\xa4\x53\xb4\x37\x92\x0d\x5e\xb3\xff\x15\x43\xbb\xdf\x3f\x5e\x40\xa5\xf3\x9d\x92\x3a\x59\xf9\xbb\xfb\xe4\xe0\x0f\x0c\x32\x55\x3a\x97\xbb\x55\x3b\x2f\x79\x88\xcf\x64\x5b\x56\x04\xc9\x18\x4e\x86\x06\x26\x5c\xbe\x15\xb1\xd7\x4e\xe6\xa4\x77\xb0\xc6\x36\x82\x93\xfb\xe2\xe6\x0e\x67\xa6\x86\x47\x80\x34\xf1\x6c\x9d\x2e\xe5\x99\x6c\xcb\x22\xdb\xe0\x17\xbf\x3f\x73\x05\xa2\x47\xf0\xa9\xd2\x15\xdc\xc6\xe9\xfd\xf9\x78\x74\xac\xac\xef\xe8\xb5\x0d\x8e\xf4\x2d\xbb\xed\x47\xce\xf3\x9a\x67\x32\x5a\x7b\xa4\x8f\x75\x62\x1d\xf1\xfd\xb1\xe3\x75\xd3\x30\x9b\x5f\x69\x86\x95\x98\x4d\x5a\x38\x2d\x73\xa0\xaa\xb9\xa9\xf6\xb7\xdc\x0f\x85\x18\x22\x8e\x33\xb3\xc1\x20\x0d\x9d\x36\xf1\x4d\xb4\x25\xc4\xb9\x7c\x59\x7a\x96\xa2\x18\xc7\xcd\x98\x55\xfc\x50\xe5\xdb\x1b\x62\xce\x71\x95\xa1\x5e\x21\x2a\x7e\x43\x2b\x56\xe8\x12\x5d\x10\x07\x4f\xf8\xcc\xb6\xe7\x0e\x12\xa6\xd9\x35\xb0\x1b\x1e\xa0\x5d\xb6\x1c\x66\xe3\x2a\x55\xb8\xa6\xe9\xc8\x76\x88\x17\x5a\x4f\x88\xdb\xa5\xb8\x0f\x1d\x2b\x02\x70\xf0\x89\xef\x8a\xb0\x25\x09\xcb\x95\x3f\xc7\xcd\x8c\x3d\x81\xec\x6b\x91\xbf\xb9\x45\x9c\x66\x5a\x49\x09\x2f\xd2\xce\x69\x6a\x60\xa0\xe9\xde\x47\xc4\x05\x71\xf0\x89\x2f\xce\x63\xd3\xb9\xab\x77\xf9\x6a\xd2\xfb\x47\x4e\x8a\x7f\x1a\xda\x05\xa5\xbe\x6e\x7f\xfc\xec\xb9\x16\xba\xb2\x75\xe5\x93\x04\xaf\x35\xd4\x2b\x17\xc0\xc1\xbf\x6f\x4f\x5e\x43\xbe\x50\xf2\xca\x0d\x9d\xec\x74\x35\xcb\xc8\x43\xed\x1e\x8a\xed\xd2\x38\x75\xbe\x95\x25\x85\xbb\xf9\x2b\xfd\x65\x37\x10\x1e\x08\xc4\x41\xb5\xc1\x32\xff\x5c\xfb\x80\xfe\xd0\xa7\xde\xe0\x72\x97\x86\xd3\xa0\x6b\x4e\xe9\xfc\x33\xb9\xb1\xd2\xb0\x2e\x19\x77\xb9\x41\x5b\xc1\x13\x17\x36\x06\xf5\x5d\xff\xf6\x91\xc7\x5d\x88\xa1\x83\x38\xb8\x04\x04\xf1\xa6\x5b\xa5\x2f\x53\x6c\x08\x87\x27\x29\xdd\x2a\xaa\xa7\xfb\x55\x50\x28\x80\x4f\xe1\x3e\x48\x3f\xdd\xef\x95\x7d\xe3\xa6\x13\x22\x2e\x88\x83\x3f\xd2\x90\x6e\x43\xe6\x3f\x9a\x5a\x17\xa5\xa9\xb6\x2f\x9f\x30\x92\xa8\x63\x47\x79\x05\xde\x90\xbc\x6d\xbf\x38\x33\x72\x91\x6b\x50\x08\xb2\xc1\x20\x0e\x2e\x01\xc7\x00\xc5\x47\x8d\x9f\xd4\x18\x31\xb8\xba\x3b\x13\x5c\xfa\x71\xef\xb4\x07\xdf\x9a\xc4\xbc\x9e\x7a\xa1\x4e\x48\xef\x86\xf4\x03\x46\xa8\x28\x10\xc0\x21\x9d\xb4\x25\x59\x36\x1c\xee\x38\x42\xe1\x77\x0a\x5b\xd7\xef\x5f\x5f\xb5\x8b\x65\xa5\x6e\xd9\x4a\x0a\x45\x13\x49\x0b\x14\x78\xcb\xb6\x89\x90\x00\x88\x83\x6a\x83\xff\x6d\x83\x41\xc9\xf5\xd4\x9a\xc0\xfc\xd6\x1f\x29\x5e\xa9\x7b\x44\xd2\xa5\x8b\xee\x0c\x86\x1f\xce\x3f\x16\x5a\xf3\x9b\xff\x5e\xa5\xa1\xf8\x60\x9d\xa0\xd1\x16\xea\x8c\x0a\xe2\x90\x0e\x04\x08\x6e\xe0\xb2\xee\x49\xef\x64\x48\x5f\x10\xea\xc3\xb1\x65\x20\xfa\xae\xf4\x33\xd5\xaf\xc2\x2e\xff\x9c\xc6\xb7\x75\x33\x2f\xa8\x53\x34\x88\x83\x3f\x52\xa7\x96\x2c\xfa\x9b\x1b\x36\xd6\x92\x65\x1f\x2e\xba\x85\x79\xb6\xb3\xf9\x0c\x2c\x97\xce\x47\x28\x3d\xd3\xb3\xb4\x8a\x94\xe4\x63\x41\xc4\x05\x71\x48\x95\xfc\x52\xb4\xeb\x7a\xbe\x74\xe3\xe3\x04\xc3\x51\x56\x19\xf1\xd2\x5f\x13\x32\x9a\xec\x28\xfc\x88\x2a\x4a\xc6\x3e\xb7\xa8\xb0\xbf\x85\x3a\x0f\x00\x38\xf8\xf7\x3d\xcf\x85\xb7\x9c\x9d\xa7\x42\xf3\x45\x58\xfe\x23\xdd\x8b\x2b\x3c\x0c\xbf\x83\xe2\xd8\xf7\xdc\x1f\xfa\x0e\x85\xca\x50\x36\xdd\x91\x45\x2c\x7f\x41\x1c\x54\x13\x28\xf2\x6f\x0b\x04\x9a\xe9\x4e\x6d\x91\x25\xb6\x75\xb3\x61\x25\x4a\x3d\x84\xf9\x0a\xc3\x51\x1a\x6d\xbf\x6c\xe1\xdd\x9b\x76\x01\xbd\x99\x77\xff\xe4\x65\xd7\xfd\xf8\x0c\x5d\xe0\x02\xe2\xe0\x1a\x20\xfe\xb0\xd4\x91\x32\x69\x76\xd1\xcf\xeb\x5e\xbc\xc6\x2b\x3e\x86\x8f\x5f\x46\xb5\xdb\xd1\x9f\xfc\x58\xeb\xba\x6f\xdd\x59\x2a\x71\x15\x11\x17\xc4\xc1\x9f\xe9\x60\xc4\xcc\x2d\xf7\xcb\x15\xbe\xb8\xbb\x55\x18\x61\xf8\x52\xed\x21\x7e\x1c\x9d\x16\x09\x2c\xe1\x0e\x7c\x2d\xcd\xfe\x78\xe9\x50\x6d\x04\x88\x83\x6b\x20\xf6\xbb\x0d\x1d\x4b\xb5\xf1\x68\xfc\x5a\x06\x25\x8d\x2f\x31\xa9\x97\xb9\xfc\x7c\x45\xde\x79\xd5\xad\xaa\xf5\x5f\x54\x0f\x54\x75\x11\x71\x41\x1c\xfc\xfb\x76\xb7\x1a\xfe\x7e\xd7\xdc\x90\x57\xdc\x42\xf2\x67\xeb\x99\x3b\x53\x49\x77\x65\x5b\x98\x73\xf8\xf1\x8a\xec\x09\x73\x55\xf1\x6d\xe8\x50\x34\x88\x83\x6a\x83\x01\x36\x18\xb4\xec\x38\x4d\x03\x95\x5c\xc9\xd3\xc6\xcf\x88\xed\x3b\x59\xfa\x77\xfd\xf3\x4c\x47\x2f\xbd\x1f\xb1\x67\xf4\x5c\x4b\xa2\x3e\x8a\x2e\xfe\x13\x6e\x0a\x5d\xbc\x06\xe2\xe0\x1a\x50\x6d\xb2\x8e\x3e\xa6\x22\x0a\x9d\xb8\xb0\xf5\x82\x38\x50\x61\xf3\x0e\x86\x87\xd2\x84\xf9\xed\xaa\x8e\x9b\x5d\x94\x8b\x2e\x1f\xbf\x43\xed\x1c\x00\x1c\xfc\x99\xd2\x64\xb9\xb1\x9b\xb6\x25\x06\x71\xf9\x90\xb5\x71\xb6\x9b\x08\x2c\xd7\xb6\xf7\xc7\x28\xd7\xbd\xdc\x2e\xcc\x5f\x3d\xc6\xf8\x6d\x87\x88\x0b\xe2\xe0\x1a\x28\x95\xca\xc8\xf5\x13\x27\xf9\x96\x9d\xeb\x3e\x8d\xee\xcf\xdc\xb2\xfa\x4b\x2a\x5b\xf5\xcb\x51\xee\x22\xbd\xd1\x65\xab\x67\xf3\xb7\xa0\x03\x47\x00\x0e\xfe\x7d\xbd\x63\x17\x8d\x30\x1e\x88\x54\xe0\x36\x47\x96\x1b\xb7\x2f\x7c\x3b\x48\x6a\x5d\x7f\xc5\x33\x52\xd0\xf1\x6d\x82\xd9\xb8\x5a\xb4\x0b\xa1\x01\x10\x07\xe5\x01\xfb\x7f\xdb\x60\x90\x85\x3a\xdd\x06\xbb\x85\xf2\x54\xbe\x48\xff\x8c\xb5\x2e\xfa\xfd\x5e\x29\x29\xb5\x4e\x60\xcb\xbb\x3e\x36\x9f\x46\x8f\xbe\xaf\xe4\x91\xf7\x19\x07\x23\x10\x96\x12\xc4\x21\xdb\xe0\x08\x81\xb7\xf9\x54\xfb\xa1\xc1\xb5\xed\x2b\x0e\x28\xe5\x9a\x12\x95\x2f\x38\x62\x3c\xb8\xd7\xaa\x44\x24\x5b\x92\x92\xd8\xf3\x6f\x23\x22\x83\x38\x64\x1b\xdc\xe6\x63\x12\x13\x2b\x78\xbe\xd0\xe8\x09\xd7\xe3\xce\x9d\x28\x0f\x8b\x05\xde\xd9\xa2\xa8\x2c\xf9\xa8\x6f\x8d\x72\xd4\xda\xcb\x45\x88\xc8\x20\xee\xff\xb3\xc1\xb4\x7f\x47\xce\x21\xe9\x60\x19\x60\xe3\xd6\xf5\xc3\xe6\x21\x90\xab\xb9\x63\x9d\xde\x83\xe9\x80\xf5\x78\x40\xee\xc3\x9d\xfe\x07\x12\xc5\xda\x5a\x90\x0d\x16\x9e\xcf\x9d\x4d\xcc\xae\xbc\xf3\xc5\xc7\xee\x59\x90\x60\x22\x03\x53\x0c\xf3\xd3\x27\xc1\xb8\xe3\x3c\x39\x89\xfe\x52\xf5\xe1\x33\x7f\xdb\x60\xb9\x35\x1c\xe7\xdb\xe7\x49\x9e\xb0\xf7\x52\x4d\xe0\x8d\x7a\xb5\xba\xd5\xd9\x86\x8d\x91\xc4\x71\xf1\xc6\xcb\x37\x0f\xcb\x09\x7f\xfd\x0b\x6d\x12\xe4\x19\xfa\x45\xbf\x1c\xcb\xbf\x1e\xc4\xec\x88\x93\xf0\xf4\xab\xa0\x3d\xea\x03\x0f\x15\xfd\x39\x71\xae\x1b\x12\xb8\xf8\xe4\xff\x6b\x36\x18\x34\xb4\xbf\x6b\x83\x91\x6c\x70\x68\x88\x15\x2b\xab\x2c\x91\x44\xcc\x48\x98\xe6\x0f\xb7\xae\x6a\x59\xd1\x3a\x9d\xd6\x80\x60\xad\x95\x81\x30\x74\xc6\x66\x4e\x83\xb3\xb0\xc1\x4d\x48\x36\xf8\x49\xc1\x8d\x1f\x57\xf0\xf3\xbe\x7d\xc8\x2c\xce\x16\x69\x17\xb8\xce\x1a\xf2\x9c\xc7\x83\xb0\x1d\xb5\xc5\x35\x53\xb4\x61\xed\xb1\xe2\x99\x6c\xcb\x22\xdb\xe0\xe3\x6b\xf8\xf7\x31\x5f\x0b\x5c\x1a\x77\x1d\xbb\x5e\xfe\xd8\x93\x0c\x6b\x62\x98\xda\x4a\x73\xbd\x21\x95\xe5\x06\x65\xb2\x1d\xa7\xcc\x99\x6c\xcb\x22\xdb\x60\x52\xff\x37\x8d\x3e\x21\x7b\x4e\x76\x1a\x3a\x18\x77\x0d\x49\xeb\x4b\x6d\x18\x12\x9e\x66\x29\xc8\x72\x6d\x92\xbf\xce\x7d\xa4\x7e\x16\x57\x55\xcb\x48\x20\xdb\xe0\xf1\x17\x39\x4c\x11\xeb\x32\x89\xa4\xfb\x17\x19\xdf\x32\xfc\x66\x0d\x34\x5b\x90\x3d\x11\x36\x41\x13\xd8\xc2\x7e\xf4\x94\x50\xfe\x0c\x3a\x73\xe9\xfd\xbf\x69\xe8\xb4\x89\xaf\xd4\x51\xb2\x3c\x9b\x28\x21\x91\x31\x14\xa3\x45\x62\x87\xe3\x6e\xec\xaa\x1e\xde\xb5\xdf\x58\x33\x97\xb5\xef\x6f\xee\xe2\x8c\xbd\x82\x12\x3e\x80\x83\x4f\x7c\xb1\x46\xe1\xdf\x0f\x99\x69\x94\x75\xe7\x45\x8b\xa4\x05\xa3\x63\x34\x29\x1b\xfa\xb4\x55\x3f\x24\x19\x9e\xcf\x92\x42\x51\xeb\xe7\x87\x16\x13\x00\x0e\x3e\x91\xec\x4b\xba\xa4\xb5\x7e\xd1\x4b\xab\xe3\x5e\xc7\x43\x1b\xd2\xa3\xc5\x16\x14\x08\xdc\xbe\x5b\x91\xe0\x50\x76\x38\x70\x3f\x91\x0c\xea\x8f\x04\xe2\xe0\x13\x5f\xdf\x85\x71\x54\x2d\x4d\xc3\x5b\x2d\x1c\xd1\x69\x1b\x17\xf4\x4d\x16\x46\x51\xe9\x02\x75\xb6\x85\x93\x37\x88\xfc\xf9\xa8\x07\x7d\x11\x71\x41\x9c\x9f\x14\x8a\xc4\xdf\x71\x2d\x73\xe7\x7a\xd0\x2a\x4c\x5b\x22\x3e\x1e\x61\xf8\x27\xb6\xe9\x2d\x5d\xff\x8c\x2b\x6a\xfe\xb2\xc1\x18\x97\xfc\xfe\x52\xce\x95\x8f\x08\x0f\x04\xe2\xa0\xda\xe0\x7f\xdb\x60\xd0\x1f\xfa\x34\x09\x04\xb2\xdc\xde\x37\xbb\x12\x2f\x2e\xa3\xed\x5e\x21\x6b\xb8\x1e\xfa\x81\xfa\x82\xc5\x2b\x29\x91\xfe\xf0\xcf\x25\x7a\x55\x89\x83\x5a\x88\xa1\x83\x38\xb8\x04\x26\xb6\x16\x0b\x1f\x3e\x15\x99\xc3\xb1\xd7\x1d\xe6\x6a\x8f\x64\x89\x55\x09\x16\xbd\x9f\x9a\x20\x71\x63\xd7\x86\xe4\xe5\x9f\xb6\xbb\xd0\x1b\x16\x00\x07\x97\x40\xff\xc8\xbd\xc8\xc6\x4e\x55\x8a\x4e\xff\x94\xaf\xe8\x43\xb7\xb0\x48\xc5\x76\xe2\x93\xce\xab\x44\x4b\x07\xe5\x64\x47\xce\x1d\x1a\x23\xe2\x82\x38\xb8\x04\x02\x58\xa4\x92\x18\x5f\x2b\x5e\xb4\xa0\xfc\xe8\x8b\xaa\xc2\x8c\x22\x1d\x87\x7d\x19\xbd\x97\xf8\xbd\xb2\xe1\x16\x83\x3a\x9f\xd4\x2e\x22\x2e\x88\x83\x4b\x60\x4d\xf5\xdd\x8e\x36\xd5\x1a\xaa\x40\xd3\xc8\xcf\xe8\x2e\x49\x79\xaa\xbb\x1e\xdc\x86\xf7\xab\x3a\xd5\x76\xaf\x6f\x7a\xa8\x07\x74\x23\x24\x00\xe2\xa0\xda\xe0\x7f\xdb\x60\x50\x72\x3d\x4d\x02\x2c\x2b\x3a\x72\xe8\x37\x07\xc2\x64\x97\x85\x39\xb4\x2c\xc9\x7a\x89\x33\x9a\x6c\x5a\x03\x54\xc9\x48\x88\x59\x19\xa2\x7f\x9a\x5f\x47\x0c\x1d\xc4\x21\x65\x01\xcf\x4d\x6f\x6f\xed\xf6\x4c\xd5\x4c\x19\xd9\xad\xa7\x36\x28\x3e\xb6\x25\x52\x41\x12\xba\xf8\xf7\x37\xb2\xf6\x64\x24\xa4\x93\xa1\x2c\x00\xe0\x90\x2c\xd0\x4b\xa1\xc5\x45\x45\x1d\xcc\x66\xfc\xdb\x4e\x0e\xd1\xe9\xcd\x12\xaf\x9b\x9e\xd5\xbb\xa4\xda\xc8\xbb\x99\x6f\xd0\x7d\x2a\x82\x5e\xde\x81\x38\xb8\x04\xc6\x4f\xba\x85\x14\xa6\xd3\x5b\x14\x18\x71\xb9\x3d\x44\x1f\xb8\xb3\x69\x07\xaf\x10\x5f\x52\xfa\x34\x1d\xf9\x0d\xaf\xce\x42\xa7\x00\x3a\xc0\x00\xe0\xe0\x12\x90\x6d\x38\x0a\x89\x7b\xec\xcb\x43\x9a\x7b\xde\x87\xa3\x9f\x75\x9f\x86\xd6\x9a\xb1\x9b\x9c\x59\x5c\xd8\xa2\xed\x7c\xf1\xb0\x50\x14\x62\xf9\x0b\xe2\xa0\x9a\x40\x80\x0d\x06\xcd\x74\xa7\xd6\x46\x74\x38\x33\x91\xe0\xb1\xb1\xa2\x86\x97\xdb\x52\xdc\x26\xe9\x70\xfc\x15\x7c\xd3\x0e\x63\x6c\xe2\xca\xec\x68\x12\x46\xc8\x63\x01\xa8\x36\x02\xc0\xc1\x35\x90\x78\xfc\x62\x4a\xde\x4a\x52\xc5\xea\xc1\x0f\xae\x8f\x57\xd9\xfc\x94\x2f\xf2\xe7\x38\x55\xe1\x45\xa0\xe5\x67\x04\x97\x5f\x7a\x0d\xdd\x14\x0f\xe2\xe0\x1a\xf8\x70\x6e\xdf\x7b\x61\xbd\xff\x75\x92\x24\xd3\xe5\x2f\x89\x3f\x2f\xf7\x0d\xa0\x62\x09\x79\x2e\xf3\xcb\x86\xe7\x60\xc8\x58\xae\x41\x07\xd8\x41\x1c\x5c\x03\x2f\x6b\xf9\xad\x7e\xeb\x94\x9e\xdf\x48\xc8\xb3\x2f\xec\x95\x2b\x1c\x28\x6f\xe4\xe2\x96\xbe\x10\xb8\x65\x55\xcb\x89\xce\x3d\x0f\xed\x06\x83\x38\xb8\x06\xea\x9a\x54\x9f\x06\x50\xdd\xfe\xf1\xec\xa3\x89\x56\x37\xb6\xce\x78\xe0\x9d\x9b\x56\x7c\xd7\x6b\x0d\x2d\x8d\x8d\x3d\x89\x98\xc5\x3d\xa0\x83\xf1\x00\x0e\xaa\x0d\x06\xd8\x60\xd0\xb2\xe3\x34\x0d\xd4\xaf\xb0\x3f\xf4\xc8\x98\x90\x9f\x1b\x1d\xb7\xec\x26\x6e\x59\x2a\x71\x20\x38\x1f\xde\xef\x2f\x9b\xe7\x6f\xbc\x2b\x40\x36\x06\xa5\x56\x10\x07\xd7\xc0\xe6\xcd\x79\x46\xc5\xde\xb1\x94\xf2\xf7\x0f\x7c\x50\x70\xd2\xe2\xc3\x73\x2e\x94\x13\x64\xb7\x52\x33\x88\x35\x5d\x8e\xf1\x76\x81\x4a\xa4\x40\x1c\x5c\x03\x61\x5b\xb7\x73\x24\x28\x71\xae\x16\xd1\x51\xee\x5e\xba\x57\x52\x3a\x43\x4b\x92\x65\x77\xdf\xee\xab\xd0\x9c\xd8\x1c\xe7\x9f\x04\x75\x68\x97\x19\xc0\xc1\x35\xb0\x49\x66\xe8\xb5\xff\x4a\xf5\xe1\xd3\x5b\xd7\xaf\x3e\x9b\x76\x61\x26\xe2\xb4\xb1\x14\x10\x91\xbc\xe0\x67\x9c\x76\x83\x78\xe4\x03\xd4\x2a\x0c\xc4\xc1\x35\xe0\x31\xd9\xe4\x27\x3a\xfb\xd3\x64\xce\x03\xfd\x65\xf7\x9f\xbb\xef\x0f\x3d\x70\x3e\xdf\xd5\x3d\xbe\x13\xe1\x49\xe7\x77\xf1\xde\xbb\x11\x84\x06\x40\x1c\x94\x07\x00\x36\x18\x64\xa1\x4e\xb7\xc1\xc6\x3f\x0d\xd2\x50\x59\xf6\xdd\x7d\x27\xb8\x32\x6e\xaa\x28\x9c\x94\x9a\xd2\xbe\xa8\x6e\x16\xa9\xda\xcd\xc8\xbf\x6d\xac\x6f\xab\x84\xb0\x94\x20\x0e\xd9\x06\xe3\x44\xd4\x0a\x54\x2a\xe6\xf7\xf9\x39\x6b\x46\xbf\x7b\x10\xe3\xeb\x25\xb1\x83\x37\x92\x72\x7d\x36\x24\xb2\x2e\x2d\x05\xb3\x36\x06\x11\x19\xc4\x21\xdb\xe0\xe9\x40\x7b\x7c\x01\xe2\x05\x51\xdc\xc7\xc1\xe9\x1a\x7f\x46\x46\x1b\x9f\x07\x3e\xc4\x2c\x76\x6e\x70\xc7\xf5\xb3\xc5\xfe\x59\xd6\x05\x1d\xe4\x06\x70\xff\x9f\x0d\xfe\x4f\x3d\xf7\xa2\x35\xca\xa5\x3f\x71\xac\xb7\x31\x28\x67\x55\x77\x7d\x39\x2c\x92\x63\x7f\xb5\x73\x9e\xd8\xde\x61\x4a\x22\x59\x96\xaf\xae\xbc\x0a\xd9\x60\xb4\x63\x92\x5f\x49\x87\xb2\xb4\x56\x2d\xb1\xb4\xaf\x66\x43\x12\xfa\x33\x03\x1e\x68\xd4\xe9\x45\x3a\xdb\xd5\xba\x5e\xda\x25\x6e\xfe\xdb\x06\x7b\x16\xf0\xe7\x89\xad\xaa\x9c\x5f\x9b\x46\xc3\x4b\x8e\xa1\x5b\x66\xd7\x7a\x46\xb4\x6b\x77\xdb\x91\x91\xaf\x46\x1a\x4f\x92\xc8\xfd\x2f\x54\xd9\xda\x8f\x65\x44\x84\xe8\xa7\x46\x82\x94\x8a\xaf\x48\xf9\x65\xcd\xdf\x3e\x12\x43\x26\x76\x16\x07\x6a\x57\xcd\xd1\x9b\x54\x51\xfe\x57\x6c\xb0\x0f\xe6\xff\xdb\xd0\xfe\xae\x0d\x46\xb2\xc1\x0b\x46\xa9\xcb\x56\xdb\x55\x4a\x8c\x95\x46\x3f\xe8\x93\x0d\x9a\x3a\x88\x32\xa4\xf2\xbb\x7b\x58\x6c\xf0\x55\x48\x1e\xa7\x3d\x6a\x3e\x93\x9d\x4a\x2e\x24\x8b\xd6\x75\x64\x78\xed\x7a\x2b\x5e\xd9\xf6\xfb\x4c\x06\x23\x81\xb7\x3a\x8c\x72\x69\x61\xce\xbe\x53\x4e\xbf\x64\x43\x72\x4c\xcd\x30\x65\xcf\x64\x5f\x16\xd9\x07\xb3\xd5\x98\xfa\xb8\xd8\xfe\xc6\xd5\xa2\x56\x91\xc6\x62\xcf\x43\xcf\xd0\x41\x77\x31\xea\x28\x5e\x95\x1b\x6b\x2d\x08\xb4\x0d\x3c\x9b\xd1\x6a\x21\x7d\xec\xe6\x09\xa7\x7e\x4a\x88\x40\xfd\x7b\x23\x01\xff\x85\x7a\x1c\xd6\xdf\x95\x17\x6a\x1d\x2c\xdd\x70\x1c\x1d\x33\xbe\xdf\xc2\xc1\x78\x74\x26\xa3\x45\xf6\xc1\xd4\x07\x1e\x17\x9b\x5f\xa5\x90\xd7\xa5\xbc\x15\x6c\x4f\x1c\xcf\x1a\x8c\xe3\xcd\xd3\xb7\xd5\x40\x79\x2d\x23\x54\x3a\x95\xb2\xeb\x7c\x66\x3e\x18\x24\xa2\xd3\x66\x3e\xc1\xba\x46\x1d\xab\xdf\xcc\xa1\x8e\x2f\x3a\x83\x82\x7f\x3a\x51\x69\x31\x91\x3e\x36\xd0\xba\x41\xa9\x80\x4d\x27\x5e\xb7\x97\x67\x0e\xed\xd9\x01\x38\xa4\xed\xe0\x6e\xb7\x64\x7c\xec\x06\x46\xf6\xf0\x67\xf3\xce\x0b\x3a\x0f\x88\xa5\x67\xc3\x72\xd5\x9f\x0f\x3e\xc4\x22\xa6\x78\x1e\x94\x4f\x0b\x6d\x07\x03\x38\xf8\xcc\x77\x9b\xae\xdb\x13\xcb\x84\xca\x83\x36\x72\x20\x4a\xe9\x16\xef\x33\xaf\xfd\xad\xb0\x59\xdc\x9b\xf2\x57\x0e\x7f\x36\x08\xe1\x97\xa3\x22\xe2\x82\x38\x3f\x29\x14\xc2\xff\x9c\x59\xf3\xa6\x65\xfb\x11\xed\x5a\xde\x8a\x65\xe4\x66\x91\xe5\x72\x54\x75\x31\xe5\x51\xf0\x4f\xbd\x4b\xea\xbc\xaf\x9f\xf0\x2c\x52\xb7\x40\xdd\x7c\x00\x9c\x9f\xd4\x7f\xaf\x9d\xe3\x7f\xac\x88\x71\x9d\x25\x62\xcf\x33\xc4\x2a\xb1\x20\x08\x03\xdf\xae\x1d\x6d\xfe\x4b\xe7\x11\x57\xb6\x14\x7e\x69\x3e\xbe\x51\x04\xc2\x04\x81\x38\xa8\x38\xf8\xdf\x3e\x18\xf4\x87\x3e\xb5\x4f\x70\xfa\x57\x9f\x5f\x8b\x09\x1a\xec\xf9\x6c\xa9\x24\xef\x5f\xbc\x08\x44\x99\x09\xa6\xec\x40\xff\x5e\xbd\xd3\x7d\x21\xa5\x39\x0a\xda\xb9\x07\x71\x48\x47\x41\xb9\x0b\x79\xb6\xf9\xf7\xca\x68\xbd\x7e\x5a\x64\x67\xaa\x47\xf9\x15\xb1\xd7\xa0\xc9\x2e\x2a\x15\xaa\x13\x79\xe2\x4b\x8e\x44\x23\xe2\x82\x38\xa4\xcb\xad\xb4\x75\xf1\x4a\x3b\xad\x08\x78\x3a\xb6\x71\x99\x24\x2e\x84\xb1\x84\x68\xa5\x90\x1a\x91\xaa\x08\x60\xbb\xaf\x05\x46\x31\x40\x7d\x47\x41\x1c\x5c\x02\x31\xf2\xa8\x24\x3d\xae\x59\x52\x24\x2d\x53\x54\x57\x6c\x03\x1f\xa7\x05\xe6\x7c\x7a\x3b\x78\x64\x70\x5b\xc9\xe7\x8a\x86\x1b\xa7\x12\x22\x2e\x88\x83\x4b\x80\x85\x37\x36\x96\x09\x15\xad\xf6\xa5\x66\x1d\xed\xc3\xb8\x3f\x72\x3c\x7a\x25\x5a\x2e\x03\x57\xee\x68\xd1\x19\xd7\x3e\xd4\xd4\xec\x47\x2c\x7e\x40\x1c\x54\x15\xc8\xf5\xef\x05\x30\x28\xbb\x9e\xa6\x81\xb7\x2f\xea\x77\x54\xb5\x3b\x3f\xd1\xa3\xd8\x2f\xed\x74\xc5\x5d\x7b\x4f\x51\x61\x56\xd4\x35\xf1\x35\x6c\x9a\x97\xbd\xe2\x29\x3d\x74\x1f\x37\x88\x83\x6b\xe0\xab\x77\x69\xc5\xf1\x45\x27\xed\xd4\x83\xa6\xf3\xd7\x3f\x5c\x9a\x62\x49\x57\xfb\xe4\x65\xc9\x36\x6f\x43\x33\x11\xa1\x26\x6e\x01\xed\xdb\x82\x38\xb8\x06\x8a\xc3\xc2\xf0\x92\xc2\x3d\xe7\xc5\x51\xac\xcb\x66\x1a\x9d\xd4\x94\x8f\x2f\x65\x2e\xe5\xb5\x57\xcb\x7d\x11\xec\x8f\x3d\xc9\x82\x6e\x0e\x06\x71\x70\x0d\xd4\xc7\xe4\x29\x53\x29\xe5\xf0\xed\x78\x1a\xa5\xc9\x88\xc5\x0d\x44\x0b\x71\x1b\x86\x76\xdd\xb6\xbc\xb8\x39\xcc\x45\x4d\xfb\x1a\x3a\xc2\x00\xe2\xe0\x1a\xd8\x24\x25\xa7\x9f\x8f\x09\xff\x6c\xf4\xaa\x6d\xd7\x42\x96\x22\xce\x4a\xdf\xb0\x91\xa0\xe8\x7e\x9b\x3c\xa1\x9b\xb9\x75\xa9\xc9\x53\x84\x06\x40\x1c\x54\x15\x08\x30\xc2\xa0\xa9\xee\x34\x0d\x38\x11\x28\xd7\xe5\xbf\x73\x1c\xf6\x76\xa2\xc0\xbb\x4c\x9d\xd5\x90\xe4\x5b\xbf\x9d\xd9\xf7\x70\x7b\xec\x5e\x14\x97\xaa\x55\xb9\x1c\xb4\xc7\x0e\xe0\xe0\x1a\xa0\x5f\x6f\x88\x1f\x4a\x5f\x7a\xb8\x7a\x85\xf7\x0a\x8e\xdd\x7e\xc1\xfb\x88\x49\x5d\xf4\x78\xe9\xcb\xca\xf3\x97\x46\xae\xd5\x13\x43\xfd\x1c\x40\x1c\xd2\xc9\x20\x89\x13\xad\x60\xe5\x17\x87\x46\x81\xcb\xeb\x21\x92\xe9\x21\x23\x09\xb4\x1a\xcc\xe2\x6f\xd2\x1e\x5d\xa8\xe4\x7e\xdf\x79\xb0\x04\x9d\x0c\x02\x70\x70\x0d\x38\x8c\x77\x91\x4f\x95\x0c\x55\x4b\xdd\xf9\x96\xfb\x20\xf9\x15\x4e\xef\xdc\x76\xf5\x65\x0d\x6a\x83\x0a\xb2\xb7\xda\x5a\x76\x5e\xd0\x45\xea\x20\x0e\xae\x01\x4e\xf9\xeb\xb3\xd5\xa6\xef\xf1\xdb\xfc\xab\xa2\x79\x5f\x5d\x58\xa2\x31\x55\x0f\x32\xcc\xa3\x6e\xcb\x2d\x0a\x74\x1e\xbf\xe0\xf2\x05\xa1\x01\x10\x07\xe5\x01\xad\x7f\x6b\x00\xb4\xee\x38\x4d\x03\x04\x18\xd4\xc7\xf7\x7a\xf2\xb6\x47\x95\x2e\x9a\x3a\xe4\x88\x58\x79\x93\xf7\x71\x3c\x8d\x94\xbc\xc1\x51\x47\xa0\x34\x73\x37\xa6\x12\xea\xc1\x0e\xe0\xe0\x1a\x58\xf9\xdd\x35\xea\x8a\x42\x65\xd4\x9a\xf4\x91\xea\xa9\x58\x03\xad\xff\x11\x55\x97\x9c\x0e\x9e\x4a\x20\x1a\x87\x81\x35\x85\x6c\x36\x22\x2e\x88\x83\x6b\xe0\x79\x14\x06\xce\x85\x3f\x8b\x81\x74\xdd\xc6\xbe\xe7\x8c\x06\x0b\xe4\xf4\x84\x3a\x54\x8a\x37\xd8\x06\x6f\x6a\x9a\x0b\x8e\xd6\x5c\x44\xc4\x05\x71\x70\x0d\xa0\xe9\xa5\x4a\xcf\xa6\xe7\x7f\xa8\x4c\x36\x58\x7e\xcd\xc7\x4f\x51\x60\xe4\x43\x19\xcf\x37\x41\x48\xbb\xd2\x55\x7a\x9e\x62\x16\xd2\x2c\x88\x83\x6b\x60\xbf\x83\x40\x03\xeb\x41\xb0\xf8\xfc\xe0\xa1\x18\x69\x8f\xb9\xb8\xf7\x0e\xcf\x27\x1c\x97\xd4\x93\x73\xad\xd5\x3f\xbd\x8f\xb7\x6d\x10\x1a\x00\x71\x50\x1e\x00\x18\x61\x90\x89\x3a\xdd\x08\x73\xf1\x3b\x60\x18\x9b\xa2\x6b\x1a\x89\x2e\x91\xba\x9c\x14\x2f\xf7\xcd\xfd\xa2\xd9\xd9\xf2\x4c\x5e\x3b\x12\xac\xc1\x77\xc9\x9b\x40\x98\x4a\x10\x87\x6c\x84\x25\x4c\xf4\xc4\xf1\xac\xae\xb4\x8c\xb7\xbd\x8e\x37\xbf\x21\x5e\x33\x22\xf7\xc7\xfd\x81\xe7\x87\xb1\xc1\x59\xed\xdf\x8a\x81\x8f\xc4\x11\x91\x41\x9c\x9f\x0c\x0a\xce\x7f\x23\x3f\xef\xad\x9d\x67\xb0\xf4\xff\xb9\xe7\x28\x6d\x8c\x97\xd0\x4e\x3e\xfa\xb6\xf0\xbe\xe2\x93\xb0\x6b\xb7\x75\xb4\xcc\x72\x52\xe3\x82\x11\x91\x41\x1c\xf2\xd3\xf8\x7f\xbe\x39\xb8\x32\xe0\xe7\xa5\x0d\xd7\xf1\xa7\x5c\x58\xb6\x55\xd5\x89\xdd\x8b\xc3\xcb\xcf\x9d\xb4\xc9\xe2\x42\x8e\x2b\xb4\x38\x82\x82\xa2\x33\xfe\x36\xc2\x13\x8c\x83\x85\x2c\x2f\x3f\xdc\x32\xa0\x19\xb4\x7e\xc4\x2c\xf6\x24\xca\xb3\x92\x58\x4b\x7b\x96\xaa\x9a\x4c\x3b\x63\x8e\x86\x3b\xfb\x2f\xd4\xfd\xe1\x6c\x98\x38\xaa\x0d\x7f\xd2\x21\xfb\x38\xb7\x77\x82\xd2\x47\x57\x0a\xdf\x93\x9a\xb8\x01\xea\x81\x8f\xbf\x44\xaa\x4d\xd5\xff\xd7\x8c\x30\x68\x68\x7f\x57\x07\x23\x19\x61\x27\x31\x8c\x7a\x86\xc0\xc5\x2d\x43\x47\x5b\x25\x36\xae\x48\xf5\xaa\x0a\x33\xef\x51\xdb\x9c\xac\xc3\xa1\x97\x73\x4b\xcc\xe8\x67\xb1\x1f\x2c\x23\x81\x6c\x84\xcd\x19\x5a\xc3\x53\xec\x77\xf4\x83\xa2\x43\x42\xca\xcf\xad\x92\xe2\xa2\xb0\x74\x7a\x92\xcc\x5d\xd5\x7f\x6e\x99\x73\x6e\xae\xee\x0c\x3c\x5a\x88\x4c\xd3\x29\xe7\xa2\xe5\x77\x04\x65\x77\x9a\x73\xd5\xd3\xb4\xc5\xca\x46\x63\x8b\x04\x9f\xdf\x8e\x3d\x0a\x5f\x73\xfd\x4e\xe2\x1e\xfe\xb1\x93\x14\xe5\x4c\x46\x8b\x6c\x84\x55\xeb\x02\xa8\x68\x39\x1e\xe7\x7f\x3a\xa7\xf3\x29\xca\x5c\xee\x31\x7f\x04\x13\xd5\xe4\x0c\x8b\x95\x84\x43\x7a\x45\xf7\x03\xd2\x96\x33\x19\x2d\xb2\x11\x96\xe5\xd6\x9c\xac\x6d\xcc\xd2\x9b\x36\xac\x1c\x2b\x08\x70\x22\xc2\xcb\xe3\x91\x35\x5a\x6c\x24\x56\xb0\x6e\x33\xc5\xaa\xa4\xc0\x3e\x33\x23\x0c\x12\xd1\x69\x33\xdf\xf5\xad\x99\x1e\xd4\x4b\x39\xa4\x2e\x2e\xae\xb6\x57\x06\x92\x08\xb0\x2d\xfd\x14\xad\x67\xb7\x0e\x07\xb4\x70\x2a\xf1\xea\x29\xc6\xa1\x1b\x2d\x00\x1c\x7c\xe6\xdb\x31\xd6\x25\x54\xc8\x73\x39\xdf\x79\xbf\x7d\x14\xa5\xac\x88\xce\xfe\x11\x0f\x4b\x68\x91\xc7\x75\x06\x2a\x47\x07\xc3\xcb\xb8\x62\x88\xb8\x20\x0e\x3e\xf3\x3d\xb5\x92\xb7\xf8\xf4\xb1\x6b\xfd\xe2\x6f\x93\x0f\xd9\x31\x4f\xc3\xac\xca\x6e\x89\xc5\x46\x1c\x62\xa2\x47\x24\x5c\x18\xb2\x36\x81\x4e\xc3\x81\x38\xf8\xcc\x47\x86\xba\x71\xf8\xf9\x89\x36\xbf\x0b\x99\x3b\x3d\x86\x8e\xec\xfe\xc3\xeb\x1c\x29\x37\x43\xcb\x48\xb0\xac\xef\x7c\x97\xdf\x1c\x81\xb6\x98\x40\x9c\x9f\x94\xc4\x7f\x9e\x83\x61\x07\xaa\xf2\xc3\x8f\x94\xbb\xce\x5e\x07\x47\xdf\xb3\x88\xef\xc4\x6a\x7d\x0e\xe5\x7d\x7f\xb1\x98\x2a\x98\xf8\x33\xca\xeb\xe4\x41\x84\x11\x06\x71\x50\x79\xf0\xbf\x8d\x30\xe8\x0f\x7d\x9a\x04\x56\xe4\xaf\x95\x58\xca\x55\xb3\xb7\xb6\xa3\xce\xde\xff\x82\x26\x37\x61\x90\xf7\x7a\xfd\x29\x9f\xc8\x56\x42\x5d\xb6\x74\x87\x8b\x01\xb4\x48\x01\x70\x70\x09\x28\x4b\x38\xdd\x24\xb8\xe6\x39\xfe\xad\xdd\x82\x50\x20\xe4\xe3\x8f\xac\x5b\x59\x13\x04\x32\xb4\x6a\x1d\x53\x8e\x4a\x74\xcc\x0b\xd0\x61\x5b\x10\x07\x97\xc0\x5c\x85\xfa\x0c\x4e\xa3\xb1\x07\xd5\x62\x6f\x0d\x89\xcf\xf9\x79\xe7\x8a\xe6\xee\xda\x0d\x86\x74\xe2\x8a\xda\x7b\x1f\x42\xdf\x40\x2d\x92\x40\x1c\x5c\x02\xa6\x27\xc7\xed\x1f\x94\xd4\x70\x50\x84\x89\x27\x3e\xd1\x30\x10\x25\x95\xd9\xbe\x25\xd0\x79\x8f\xb3\x72\x65\xf7\x32\x43\x8e\xa9\x2b\x22\x2e\x88\x83\x4b\xa0\xa2\xfd\x9e\xac\x8c\xba\xeb\x5c\x52\x59\x3a\x95\xcd\x0d\x4d\x9a\xc3\x9d\x3f\xc6\x41\x85\x5d\xb2\x0e\x3d\xab\x9b\xe1\xab\xea\x63\x88\xc5\x0f\x88\x83\xea\x02\x01\x46\x18\x94\x5d\x4f\xd3\x00\x86\xa9\x66\xfe\xf7\x12\x21\xe3\xb5\x76\x06\x46\x26\xad\xb0\xe4\x2a\x59\x73\x23\xc9\x0e\xfe\x66\xf5\xbb\x04\xf3\x86\x12\xcf\x3b\x10\x63\x07\x71\x48\x0d\xc3\x67\xd5\xb8\x14\x25\xb4\xed\x70\x87\xaf\xbe\x4f\x91\x1a\xdc\x26\x9f\xc5\xa6\xd9\xf4\xa1\xe8\x9f\xe4\xe3\x4b\xfa\xae\xce\x0e\x35\x9f\x03\x71\x70\x0d\x24\x7f\x70\xd0\xda\x5f\xb1\x54\xd9\xfa\x85\x22\x8f\xd1\x69\x49\xe0\xff\x45\x68\x3f\xa9\x79\xf8\x71\x4c\x59\x1d\x1d\x27\xc7\x23\x28\xbd\x80\x38\xb8\x06\x70\x5a\x4b\x8c\x5e\xbf\xd4\x8b\x28\x97\x20\x95\x37\xfb\x72\xf8\x94\x36\x02\x2d\xd6\x97\x69\x85\x51\x48\x9d\xf4\x45\xe2\xc3\x76\xe8\x06\x71\x10\x07\xd7\x80\x4f\xe1\xcc\x9b\xd6\x1b\xa3\xe4\x35\x6a\xb2\xa1\x41\xf5\x73\xe9\x4e\xb8\x4d\xda\x85\xd9\x6d\x53\x9b\x5c\x7b\x3d\xd6\x38\x45\x8e\x08\x0d\x80\x38\xa8\x2e\x10\x60\x84\x41\x53\xdd\xa9\x1d\xc3\x23\x6b\x8b\x86\x2a\x63\x9c\x31\xe4\x0c\x7a\x74\x79\xdf\x15\x7d\x7c\x62\x6f\x42\xc0\xe8\xca\xb0\xc2\xa4\x66\xf8\x81\x94\x66\x14\xea\x18\x0e\xe0\xe0\x1a\x38\xbc\x7a\x59\x34\x28\xe5\x67\xa9\x5c\x34\x9a\xea\xcc\xe1\xf6\x77\xbb\x71\xbc\xf7\x0f\xe5\xbf\x9a\xab\x6f\x4d\x8b\x84\xff\xfa\xff\x6b\x0b\xc4\xc1\x35\x70\xec\x14\x2c\x66\x84\xba\x47\xbd\x65\xc8\x31\x74\xe0\x65\x3a\xa6\x7b\xe7\x43\x7f\x74\xf1\xc7\x8c\x31\x81\x90\xd8\xbc\xec\xd2\x59\x44\x5c\x10\x07\xd7\xc0\x9e\xd9\xe2\x92\xa0\xdb\xac\xcc\xf7\xed\xe8\x96\x80\xfb\x6d\x0d\x0e\x04\x28\xb1\x28\x97\xae\x8a\x95\x5c\x7e\x2c\x45\xc5\xb0\x5e\x8e\x88\x0b\xe2\xe0\x1a\xb8\xdc\x86\xff\x48\xaf\x25\xf5\x52\xdb\xc5\xe8\x51\x4c\x4e\x6e\x3e\x85\xc8\xbc\xe4\x2a\x3a\x62\x47\xdc\x3d\x9f\xe5\xd1\x34\xdd\x08\x84\x06\x40\x1c\x94\x07\x00\x46\x18\xb4\xee\x38\x4d\x03\x47\xb8\xc2\xae\xef\xb5\x5f\x3d\x29\x1d\x5f\x8c\x18\xb5\x2d\xe5\xc4\x90\x79\xae\x70\x13\x5d\x3f\xeb\xb1\xfb\x8d\x6a\xee\xa4\x68\xa8\x3c\x08\xc4\xc1\x35\x50\x1b\xd9\x4a\x8b\x13\x50\x2f\x33\xcd\x52\x12\xfd\x33\x50\x34\xdf\x73\x5c\x21\x6e\x11\x2f\x23\x37\xe0\xc1\xd8\x7b\x01\x99\x36\xa8\xb3\x37\x88\x83\x6b\xa0\x30\x4b\xec\xa0\x2c\xeb\x9c\x20\xb7\x46\x9a\xdf\xfc\xe1\xde\x1d\x53\x7e\x46\xe5\x95\xc4\x39\x43\x33\xa9\x44\xc9\xa8\x83\x1c\xe8\xc4\x09\x88\x83\x6b\x60\x15\x95\x5f\xb6\x68\x67\xc9\xac\xb3\x9a\x5d\xd8\x34\xd2\x8a\x60\x4f\xf9\x0e\xe6\x8b\x10\x8b\xd9\x10\xcf\x61\x66\xfd\x6c\x01\xe8\xdc\x19\x88\x83\x6b\x00\xd3\xcd\x47\xfa\x87\x39\x56\x9e\xa1\x86\xd9\xbd\xb6\x07\xe6\xd9\x42\xd2\xa4\xc4\xeb\x8c\x0e\xfa\x5a\x49\xb3\x4d\xd4\x8a\xb2\x8f\x11\x1a\x00\x71\x50\x1e\xf8\xbf\x19\x61\x84\x39\xcb\x16\x55\x1e\x6c\xfd\xfc\x65\x92\x19\xc3\x9a\xc0\x52\x99\xd0\xe1\x0b\xd6\x7c\xd8\x93\x95\xe5\xbe\x04\xdc\x72\xb2\xc6\xe6\xbb\x85\xff\xd9\xa5\xa4\x2f\x7c\xb1\x4d\x7d\xb3\xee\x8f\x8e\x7c\xc0\x37\x15\xf9\xb5\x0b\xc5\xea\x2b\xd1\x81\x5e\x7d\xd8\x0d\xa3\xeb\x8b\x65\x37\xfe\xbe\xdc\x73\xfa\xda\x4a\xeb\x24\x51\xbb\xab\x7d\x2b\x5a\x9a\xb1\xb9\xe7\x54\x24\x0b\xed\x25\x0e\xf3\xe7\x12\xfc\x2b\xd8\x96\x9e\x2a\x74\x3c\xff\x6b\xe6\x0c\x34\xb4\xbf\x6b\x56\x65\x91\xda\x0a\xc9\xed\x2f\x7d\xd2\x17\xd7\x43\x2b\xf7\x62\xc2\x25\x46\xcd\x2a\xf9\xd3\x7a\xb5\x7d\x9c\x58\x85\xc3\xc9\xd0\x30\x54\xd0\x2f\xf4\x4c\x36\xd0\x90\xcd\x59\x89\x90\x11\x66\x11\x4f\x7c\x6d\x21\xe9\x77\xc6\x0a\x3f\xe6\x1b\x57\xb7\x48\xcd\x32\x58\x39\x5a\x28\xc8\xc2\x03\x5f\xbd\xc6\x2b\x3c\x93\xed\x42\x51\xa4\x8f\xf5\xa5\xf0\xdd\x7b\xca\xd3\x9f\x7c\xf7\xe5\xb7\x62\x5d\x9d\xd8\xc8\x0f\x2a\x4f\x27\x78\xf9\x05\xfc\xad\xc3\x5a\x72\x28\x78\x23\xce\xa6\x73\x32\xb2\x39\x6b\xcb\x45\xc1\x4b\x88\xe9\x7d\x6f\xc4\x2f\x1a\x7d\x37\x5b\xeb\xe4\x3e\x51\x33\x46\xd5\x4b\xb1\xb5\x5c\x9f\x99\xe1\xc4\x35\xc2\x9e\x33\x19\xad\x03\xd2\xc7\xc6\xfa\xd8\xeb\x09\xd0\xf9\xae\x93\xc7\x54\xdc\xbc\x60\xf3\xe0\x92\x29\xf7\x91\xe1\xf5\xc3\x24\xe9\x37\x92\x83\x73\x52\xda\xe2\x44\x67\x66\xce\x40\x22\x3a\x2d\x1b\xab\x48\xc5\xf3\xa0\xcc\x7e\xef\xcc\x25\x48\x66\x99\xdc\x1b\x9b\x7d\x26\xba\x48\x6e\x7b\x78\x8f\x0c\x5f\xb0\xa3\x72\x69\xbb\x09\xea\xd8\x01\xe2\xe0\xd9\xb8\xfb\xca\xeb\xf4\x6f\x0d\x81\x49\x5f\xbe\x67\x71\xa8\xdb\x62\xb5\x39\xb4\x1a\x47\x7d\xa5\x62\xf5\x0b\xb3\xb8\x40\x98\xf3\x95\xfd\x0a\x74\x27\x00\x80\x83\x67\x63\x31\xe1\x7b\xfe\x0c\x0c\x16\x3d\x3e\x8d\x0d\xa2\x2d\x15\x6f\x0b\xe7\x05\x93\x26\x32\xd8\x68\x4e\x6e\xd5\x4e\xa2\xd7\x8b\xfd\x80\xfa\xed\x82\x38\x78\x36\xc6\x8b\x29\x66\x91\xdc\x4f\xa6\x2f\x08\x59\x29\x6c\xb4\x5a\xa8\xd9\x28\xf5\x78\x1e\x6a\x4e\x4c\xc9\xca\xc9\xce\x67\x89\x22\x01\x3d\x07\x10\xe7\x27\xf5\xdf\x06\x78\x87\xc4\xec\x0c\xbb\xf5\x11\xd5\x2f\xe7\x3f\x89\x4b\x91\xf2\xf2\xe4\x1b\x7e\xa3\xfc\x41\x25\xf9\xd1\x38\x84\x71\xa5\x03\x55\x56\x1f\x61\xce\x40\x1c\x54\xb4\x2a\xfb\xcf\x09\x19\xf4\x87\x3e\x4d\x02\x98\x66\x12\xfc\x72\x87\x2c\x61\x9a\xd5\xe9\x85\xbc\x54\xda\x35\x77\xdd\x42\x46\x24\x32\xb3\x9a\xe8\x3e\x2c\xb1\x85\xbe\x2b\x15\x84\x16\xd0\x00\x0e\xe9\x16\xc3\x4b\xaa\x5c\xef\xb0\xa2\xfe\xb8\x47\x62\xdf\x7b\xd8\x80\xcb\xcc\xd3\x71\x9d\x29\x52\x75\xf5\x3e\xd1\xc3\x10\x89\x2e\xaa\x9f\x47\x88\xb8\x20\x0e\x2e\x01\xbb\xf4\xcc\x1d\x36\xfe\x90\x38\xbe\x2d\x3c\x86\x09\x46\xf4\x9b\x2c\xb8\xe6\xa5\xaf\xa6\x2a\x8e\xaf\x59\x11\x68\x5a\x45\x50\x4d\x21\xe2\x82\x38\xb8\x04\xae\x7d\x2e\xb2\x98\xbe\x65\xe2\x53\xe3\x21\xb0\x87\x63\xed\x48\xf9\xfd\x12\xce\xa7\xe4\x4f\xe3\xe6\xbd\xac\x87\x43\x3e\xc7\x66\x50\xff\x4e\x10\x07\x97\x40\xaa\xdd\xad\x77\x84\x44\xe2\xab\x45\xef\x28\x69\xac\x9d\x02\xfa\x1e\x1c\xfd\x5a\xa0\x7b\x4e\x43\xf9\xbc\xdf\xe5\x18\x5d\xee\xa7\x39\x62\x42\x06\x71\x50\xb5\x1a\xc0\x9c\x81\xb2\xeb\x69\x1a\xd0\xcb\x7b\xc4\x3c\x43\x4b\x34\x5e\x3b\xa5\x69\x9e\x50\x35\xc3\xcb\x27\xf8\xc6\xe8\xf1\xc0\xfa\x02\x26\x11\xf3\xed\x69\x8d\x73\xd0\xdb\x7e\x10\x07\xd7\xc0\x93\x9d\x5d\xd7\xe8\xfc\x28\xa5\x2f\x78\x68\xed\x76\xef\xd1\x13\x0e\xe5\x2e\xec\x60\x2d\x29\x5a\x2d\x29\xbd\xe5\x5f\xc3\x59\x86\xaa\x56\x41\x1c\x5c\x03\x1a\xd8\x57\x6f\xce\x50\x3f\x12\xa4\x4b\xed\xf9\xa9\xa6\x16\x5a\x2a\xae\x9d\x95\xf9\xb0\x9c\x47\x94\xd7\x78\x39\x31\x2b\xe8\x36\xd4\x6a\x0d\xc4\xc1\x35\xf0\x85\x42\x41\x2f\xe4\xee\xb4\xbe\x52\x82\x4b\xf4\x87\xfa\xc2\x09\x0c\x8c\x8e\xad\x18\x85\x99\x87\xbc\xaf\xa8\x83\x5c\xc9\x6c\xa1\x9d\x6a\x10\x07\xd7\x80\xdd\x08\xe6\x64\xc2\x0f\x1b\x36\xcc\x10\xfc\x22\x2d\x6b\x1f\xb4\x98\x23\x0a\x27\x03\x72\xb7\x6a\x9b\x7a\x33\xf1\x4f\xc4\x32\xac\x08\x0d\x80\x38\xa8\x5a\x4d\xf4\xdf\x1a\x00\x4d\x75\xa7\x69\x40\xbb\xa6\xe6\x31\xd3\x89\xa3\xc3\x41\xc6\xd0\xad\x2a\x45\xb6\x3e\x75\xcc\x16\xeb\xab\x97\x7f\x57\x16\x96\x38\xca\xbc\x7e\x24\x6d\x8b\x18\x3b\x88\x83\x6b\x80\x84\xeb\xab\xf6\xb6\xfd\xa8\x93\x06\xe6\xe5\x94\xdf\x12\xa6\x5b\xcc\xef\x98\x28\x39\xcd\x47\x1d\xe2\xdb\xf6\xcc\x9e\x75\xa5\x56\x23\xe2\x82\x38\xb8\x06\xe8\x43\xfb\x5e\x5c\xb0\x7e\x94\xf1\x98\x2e\x2f\xae\xaf\x29\xe6\x11\xca\xe5\x5c\xcd\xd7\x62\x7e\x74\xf4\xdd\xab\x9c\x4c\x8c\xae\xad\xd0\xee\x27\x80\x83\x6b\xe0\x5b\x98\x7f\x42\x7e\x8e\x7d\x7f\x4f\x92\xae\x5e\x9b\xce\x2d\x3e\x73\x69\xbd\x26\x41\x3a\xbd\x35\xbd\xde\x6d\x7e\xcc\x63\xea\x28\x44\x5c\x10\x07\xd7\x80\x5a\x07\x1d\x19\xab\x87\x1e\xcd\xfe\x32\xf7\xa3\xe3\xc4\x08\xed\x9a\x41\x42\xae\xc0\xe8\x6d\x17\xab\x62\xfe\x29\xa6\x8d\x34\x5f\x84\x06\x40\x1c\x94\x07\x00\xe6\x0c\xb4\xee\x38\x4d\x03\x94\xbf\x48\xe2\x13\x69\x3d\x1e\xd4\x63\x61\x72\xb9\x7d\x20\xfa\x81\xd7\xe8\xc2\xe2\x17\x81\xb3\x12\xe2\xfc\xb8\x73\x44\x57\x16\xea\xe3\x07\xe2\x90\x8e\x6c\xff\xc9\xa3\xdc\xc8\xad\xfa\x80\x3b\x4c\xa2\xf7\xee\x5a\x5c\xc5\xcf\xd7\x1b\xe1\xc6\xc5\xe7\xfb\xd0\xc2\x5e\x6b\xe0\x8f\xba\x9a\x42\x47\xb6\x01\x1c\x5c\x03\x2f\x1b\x2f\xf9\x7d\x17\xab\xab\xa5\x66\xfb\x80\x3f\x95\xb2\x78\x78\xfb\x78\xc9\x88\xdd\xee\x5e\x3f\x91\xc1\xbc\x65\x2f\x93\x12\x74\x5b\x32\x88\x83\x6b\xc0\xb0\x4f\x46\x08\xff\xbc\xfb\x93\x0f\x77\xad\x1a\xd6\x3f\x92\xed\x4b\x7d\xd0\x13\x5d\x95\x77\x2f\xdc\xb3\xc3\x9d\xfb\x2c\xab\x08\x99\x3e\x10\x07\xd7\x80\x49\xcd\x5b\x09\xe5\xfc\xe1\x89\xa7\xa8\x61\xd3\x8b\xbe\xa4\xa5\x89\x35\xb7\x33\x7a\x1b\xf2\x46\xde\x66\x63\xe3\x19\x08\xd3\x4d\x20\x34\x00\xe2\xa0\x3c\xe0\x00\x30\x67\x92\xae\xe9\xf6\x69\xf2\x72\xfc\x63\xee\x38\x5b\xa8\xd3\x0c\x89\x47\xdc\x8e\xcc\x15\x39\x6d\x5a\xe6\x54\x94\x51\x21\xe8\xb6\xb9\x7f\x9b\x33\xa1\xf0\x71\xc3\xf7\x3e\xa1\x22\x96\xb5\x65\x59\xda\x83\x17\x35\x33\xba\x7b\x7e\xde\x74\x2c\x12\x0e\x6e\x5d\x77\xa8\x37\x43\x29\xf8\xfb\xc5\x88\x34\xc1\x56\x17\xed\x9f\x77\x38\xb7\x9e\x64\x48\x14\xac\x7d\x78\x6a\xa8\x70\xbf\xbd\xe2\x55\x44\xc0\xb6\x24\x8b\x7d\x4c\xa2\xc8\xff\x9a\x39\x03\x0d\xed\xef\x4a\x4a\x24\x73\x26\x8b\xa3\x62\xe0\xfd\xcd\x23\xe0\x79\x4d\x5d\x91\x55\xac\xf5\x05\x01\xcb\x8b\x63\x38\xf8\x41\x39\xee\x38\x7e\x38\xbf\x98\x82\xcf\xa6\xe7\x2b\xb2\x39\x6b\xb7\xc4\xfb\xf2\xf0\x15\x4e\xbb\x33\x65\xc3\x23\x0c\xb9\x63\x42\x9e\x4a\x27\x8b\xa7\x61\xd7\x87\x1c\x6c\x1d\xe7\x5a\x43\x4a\xbc\xce\x64\x0b\x0b\xd9\x9c\x51\x9d\x04\x53\x90\xbd\xe2\x35\x36\xbe\x7c\x85\x28\xaa\x72\xe7\x7c\x0f\x77\xda\x81\xab\x30\x59\x90\x54\x67\xc3\xdd\x1c\xa9\x0e\x9d\x33\x19\x2d\xb2\x39\x13\x6c\x6c\x61\x6c\xa2\xc3\xe8\x7a\xfe\x4b\x86\xee\xbc\x3e\xc6\x81\xaa\xbc\xc9\xc7\x5b\x53\x59\x37\xc7\x8d\xd1\x3b\x31\x6f\xac\x0e\x9e\xc9\x68\x91\xcd\xd9\xc0\x27\x86\x6b\xa3\xaf\xb5\x1e\x08\x1b\xad\xb8\xe4\x75\x08\xe9\x5c\x0f\x8f\x3f\xd7\x20\xe8\x43\x7b\x62\xe8\xb9\xfa\xae\xfd\xb3\xd5\x99\x99\x33\x90\x88\x4e\xcb\xc6\xa4\x7a\xab\x7a\x3a\x1d\xe6\xf4\x2f\xe3\x59\x9e\xe5\xa7\x68\x67\x6b\xe1\xc6\xdb\x8a\x16\xba\x95\x57\x78\x3c\x66\x7a\x34\x13\x0f\xb5\xbc\x03\x71\xf0\x6c\x1c\x99\xab\xae\x76\x39\x55\x82\x0e\x95\x73\xad\xda\xf3\xb3\xda\x65\x1f\x5e\xa7\xb6\x10\x7c\xb6\x0d\x36\xf9\x83\xe8\x50\xfe\x7b\x50\xd6\x04\x71\x48\xf7\x80\xaf\xb0\x32\x6a\xf8\x3c\x42\xe9\x60\x64\x4d\x1c\xb2\x6c\xf8\x42\x14\xb5\xa8\xcb\x16\xa4\xf3\x83\x73\x7b\x6c\x45\xe7\x15\x3f\x74\xde\x11\xc4\xc1\xb3\x71\x5f\x67\x7d\xc8\x9d\xee\xaf\x45\x9f\x9e\xf6\xb8\x29\x5a\x13\x98\x9d\x44\xd3\x4c\x4d\x29\xac\xc7\x2d\xd2\x2c\xa4\x56\x24\x09\x43\xed\x1f\x41\x9c\x9f\xd4\x7f\xeb\xd1\x1f\x6d\x27\x1e\x73\x90\x6f\x55\x5e\x32\x5f\x69\x65\x9d\x79\x53\x3c\xdd\x40\xc8\x5b\xd5\x77\x85\x4c\xa3\xd6\x7a\x5b\x91\x4e\x4b\x04\x61\xce\x40\x1c\x54\x4a\xf9\x6f\x73\x06\xfa\x43\x9f\x26\x81\x6f\x7a\xfd\x5c\x59\x3b\xb1\xd5\x4d\xbc\x02\x28\xf7\xef\x06\x1a\xf7\x38\x84\x4b\xc4\xa4\x54\xb7\x1e\x72\x10\x48\xb1\x17\x7f\x2e\x85\x16\x23\x00\x0e\x2e\x81\x93\x2c\xf5\xf9\x21\x47\x62\x61\xb7\x6f\x39\x59\x2d\x33\x44\x4c\x5e\xac\x93\x71\x7f\xf4\x5e\x4e\xa3\x11\xdc\x79\xfd\x66\xaf\x1d\xaa\xa6\x05\x71\x48\x8b\x32\x6b\xfc\x80\xfe\x89\xe2\xe2\x8e\x95\x99\xb4\xde\x35\x7e\x36\xe7\xc8\x94\x55\x92\x37\x17\xce\x7f\x18\x48\x90\xda\xce\x98\x76\x83\x16\x65\x00\x0e\x2e\x01\x39\xbd\xa9\x5e\x53\xc7\x81\xd2\xda\x08\xc2\xdb\x97\xf3\x86\x50\x6d\xa3\x8a\x73\xcf\x15\x08\x63\xd0\x9e\xa8\x4c\x3f\xc7\xa2\x87\xe2\x82\x38\xb8\x04\xee\x9e\x0b\x3f\x11\x49\xf6\x38\xb1\x17\xe8\x9b\x2c\x38\xae\x0b\x4a\xd2\xda\x6a\x63\x26\x09\xbf\x7d\xc7\x79\x94\x31\xdb\x71\x32\x0c\x31\x21\x83\x38\xa8\x86\x0a\x60\xce\x40\xd9\xf5\x34\x0d\x18\x84\xa7\x0d\x65\xe8\x8f\x11\xa2\xbd\x18\x64\x6e\xde\x14\x50\x66\x52\x61\x13\xd5\x66\xd2\x65\x18\xdc\x66\xde\xd1\x5c\x71\x86\x2e\x80\x00\x71\x70\x0d\xac\xb2\xe8\xb6\x27\x4e\x19\x1c\x14\x7d\x78\xf9\xc5\xfb\xcf\x39\x31\x1b\x1f\xa9\xbc\x84\x38\x1b\xdb\xf5\x27\x68\x43\x96\x4c\x57\xa0\x7a\x37\x10\x07\xd7\x80\x7c\xe2\x4b\xa9\xb7\xe8\x3e\x09\xac\x6a\x65\x5a\x7d\x13\x9a\x37\xb7\x13\x4a\x55\xde\xca\xce\x78\xc5\xcb\xb8\xa3\x77\x96\x3d\x86\xb4\x05\xe2\xe0\x1a\x78\x33\xd4\xfd\x9b\x02\xa7\x84\x39\xef\x19\x55\x91\xdd\x64\xa5\xda\xee\xe3\x7e\xe7\x9e\x02\x4e\x36\xd1\xe5\x60\xe3\xd7\x0e\x27\x43\x88\xb8\x20\x0e\xae\x81\x7d\xd2\x02\x87\xb8\xc1\xd0\x10\x43\x7e\xd7\xd1\x3a\xce\x58\x31\x1b\xff\x7b\xcf\xb3\x7f\x13\x6f\x63\x8f\xcf\xd2\x32\x6e\xaf\x41\xc7\x07\x41\x1c\x54\x43\x05\x30\x67\xa0\xa9\xee\x34\x0d\x64\xfd\x5a\xc4\x65\xff\x58\x1a\x6b\x91\xa4\xde\x74\x8e\xca\xdf\x96\x50\x2c\x23\xf3\xe4\x6a\x0d\xbe\x81\xff\x64\x82\x21\x83\x3d\xb4\x83\x0e\xe2\xe0\x1a\xc0\x60\x7d\xeb\x37\xa6\x36\xfa\x3b\xb7\xc7\x39\x97\x64\xf0\xc9\xf8\xab\xc7\x32\xae\x04\x01\x33\xaf\xe3\xfa\x06\x36\x58\xf5\x1e\x42\xf7\xb7\x82\x38\xb8\x06\xc2\x47\xfa\xdf\x0d\x58\xef\x99\x39\x10\xbb\x24\x25\x2a\xee\xd1\x0c\x73\xf2\x48\xf6\x87\x5d\x73\x98\x6a\xda\x94\x1a\xdf\xd0\xad\x41\xc4\x05\x71\x70\x0d\xb8\xd4\x15\x4d\xdb\x51\x69\x7c\xf4\x4b\x72\x4f\xb8\x92\xc7\xb4\xae\x69\xdf\x63\x55\x6d\x95\x76\x75\x3f\xc7\xc4\x5d\xf6\x92\xd6\x07\x44\x5c\x10\x07\xd7\x40\xdb\xd2\xe4\x3d\xbc\xdc\x67\xaa\x9f\x8a\x09\x7c\x65\x38\x42\xbd\x7a\x32\x04\x7e\xc9\x5b\x7c\x99\xf2\xbf\xaa\xa0\xd2\x75\x59\x1f\x32\xe8\x20\x0e\xca\x03\x00\x73\x06\x5a\x77\x9c\xa6\x81\x32\xaf\x1f\x87\xc7\x6d\x9d\x98\x37\x6e\x91\xfb\xac\xbc\xee\xb0\x12\xae\x4d\x71\xb8\x4a\x96\xbe\x3b\xeb\xee\xf3\xc5\xc3\x83\x1a\xca\x03\x20\x0e\xae\x81\xdf\x3b\x39\x25\xe5\xd4\xf8\xda\xfd\xaf\xef\x16\xcb\x08\x4e\x2b\xf9\x3f\xe2\xc7\x0e\x39\xbc\x45\x30\xa3\x43\x3e\xb4\xcb\x80\xe1\x8f\x88\x0b\xe2\x90\x3a\xeb\x3e\x96\x92\xbf\x4a\x15\x5c\xe2\xbb\x5e\x14\xdd\xf9\xc7\x8b\x5f\xb5\x51\xc7\x9a\xa9\x7a\xcc\x5a\x0d\xf7\x51\x74\xdb\xd5\x8a\x39\xa8\xb3\x2e\x80\x83\x6b\xa0\x95\x9b\x40\x51\xa3\x6c\x82\x48\x2a\x3a\xb6\x25\x8b\xe3\x09\x23\x7f\x35\x99\x19\x57\xdf\xc3\x15\xfc\x62\xca\xb8\xcc\x94\xde\x49\x44\x5c\x10\x07\xd7\x80\x48\x58\xf1\x0b\xe3\x17\xd7\x86\x8e\x6c\xbb\x38\x8d\x5e\xe4\x60\x5d\x9c\x79\xef\xba\xe1\x59\x1c\xcf\x73\x9c\xd7\xa4\xfa\x76\x6e\x03\xea\xac\x0b\xe0\xa0\x3c\x00\x32\x67\xd9\xc3\xd1\x56\xa9\x9e\x76\x0d\x02\x37\xae\x06\xbd\x48\x74\x56\xb0\x14\xac\x0a\x3a\xef\x90\x7f\x83\x5d\xdf\x5d\x85\xa4\xf6\xc1\xd5\xbf\xcd\x59\x18\x4b\xfc\x71\xd3\xae\xd4\xcb\x43\x05\x6b\xf5\x77\x5d\x01\x44\x94\x21\xa8\xe7\xca\x0c\xf4\x7a\x3d\x0d\x4d\x24\xd8\x9a\xab\x70\xfe\xce\xbf\x2f\x2e\x25\x28\x72\x3e\xed\xc7\x4d\x2b\x3a\x08\xe6\xc1\x6a\x35\x59\x67\x1b\x90\xea\xfb\x85\xb6\x51\xb3\x15\xc0\xe6\x76\x30\xfa\xbf\x66\xce\x40\x43\xfb\xbb\xbe\x0f\xc9\x9c\xd1\xf5\x69\x94\x9a\x50\x75\xda\x56\xf0\x71\x51\x5a\xb6\xd7\xaf\x7a\x13\x97\x04\x64\xfd\x7c\x6b\xcd\xbc\x3c\x19\x27\xb8\xc1\x7c\x72\x26\x9b\x3a\xdc\x48\xbe\xc1\x12\x4d\xfb\xa2\xa3\x9f\x57\x50\xc6\x9f\xce\x8e\xae\x55\x94\xa0\x18\xea\xb7\x84\x74\x41\xe2\x5f\x1e\xfc\x09\x77\x95\xbf\x76\xc7\xe7\x4c\xb6\xb0\x90\xcd\xd9\xe2\x71\x9b\xec\x47\x9a\x87\xb7\xc3\x43\x6a\x14\xde\x5f\x62\x37\x1b\x64\x1b\x1d\x19\xa5\xf5\xd9\x33\x6b\x7b\x87\x6a\xf5\xc4\xea\x0c\x3a\xbf\x84\xc8\xa0\x68\x23\x7d\x6c\x71\xbe\x5c\x98\x61\x2a\x6f\x13\xce\x09\x49\x8d\xfe\xe4\x85\x3f\x43\xe7\xeb\x3b\xee\xd3\x91\xa3\xbc\xc2\x14\x3b\x32\xe1\x0e\x3f\x93\x8f\xf5\x46\x36\x67\x63\xdb\x7d\xfb\x71\x55\x51\xdf\xf6\xe4\xe5\x3e\x51\x3e\x20\x62\xe6\xb0\x4a\xd2\x6a\xb3\xb1\xc7\x21\x76\x3f\xd0\x63\x77\xe0\x77\x3c\x33\x73\x06\x12\xd1\x69\xd9\x98\xb9\xc5\x7e\x4d\x9d\xe4\x9d\x48\x77\xc5\x24\x9e\x08\xfb\xcc\x54\xe2\xcb\x1b\x25\x09\xd4\xc7\x58\xd7\x3a\x78\x87\x6f\xa5\xe5\x43\xab\x27\x10\x07\xcf\xc6\x14\xf8\x2a\x9a\x86\xed\xf7\x4a\x0b\x06\xe8\x14\x2a\xc9\x82\x1f\x38\x50\x59\x7b\x0a\xf3\x88\xbe\xa4\x45\xdb\xbc\x14\xc2\xa6\x61\x81\x88\x0b\xe2\xe0\xd9\xf8\x85\xaa\xfe\xef\x3d\x09\xcf\x1b\xdb\xa4\x59\xa8\xc6\x75\x19\xfb\xfe\x53\x23\x8b\x6e\x8d\x3d\xd7\x35\x36\x63\xc4\x03\xc4\xaa\xa1\x9b\x1f\x41\x1c\x3c\x6b\x52\x1e\x51\xed\x98\x11\x94\x8b\xa8\xb4\xb3\xbe\x22\x32\x7d\xcf\x35\xa4\x96\xec\xd2\xcb\xd4\xee\xa3\x22\x43\xd9\x2d\x21\x10\x7a\x01\x7a\x65\x08\xe0\x90\xb6\x24\xee\x96\x63\xb0\x90\x97\x8c\x5c\x5c\xcd\x4e\x2c\x62\xf2\x13\xfd\x2e\x73\xa2\x62\xe8\x6e\x68\x9f\x58\x70\xab\xed\x32\xde\x90\x0d\x74\xf9\x27\x80\x83\xea\xfb\xfe\x6d\xce\x40\x7f\xe8\xd3\x24\x30\x8b\x7a\xf9\x9d\xc5\xce\xc5\x2e\x56\xc2\xc6\xef\x8f\xf2\xaf\x73\x74\x2a\x28\x05\x12\xd1\xd5\x0e\x86\x13\xf7\x1f\xaf\x6b\x1d\x43\xed\x5e\x41\x1c\x5c\x02\xfe\xf6\xb9\x97\x33\xb8\xbb\x75\x1a\xff\x7c\xa9\x6b\x75\x28\xc3\x55\xcd\x5e\xc6\x31\xd5\x8f\xc9\xc2\xb9\xaa\x48\x96\xe5\x11\x71\x80\x88\x0b\xe2\xe0\x12\xd0\x52\x79\xf8\xe0\xc2\xdb\x10\xdd\x51\xc9\xe1\xf9\xcf\xee\x73\x77\xeb\xd1\x47\xd8\xbc\xc4\xd2\xd7\xcf\x7f\x21\xa9\x19\x7c\x3e\x04\x6d\x72\x82\x38\xb8\x04\xe2\x6c\xce\x7b\x38\xec\x92\xdb\xda\xe1\x33\xe4\x30\xd0\x77\x86\xe7\x38\x5e\xb5\x11\x98\xc9\x34\x32\xdd\x7b\xfc\xbe\xd1\xa2\x1f\xba\xf8\x1c\xc4\xc1\x9f\x6f\xab\xd3\x58\x47\xcd\x0d\x7f\xc7\x92\xa7\x71\x4a\xa4\x19\xb6\x0c\x52\xc2\xf1\xc3\xe5\x1c\x77\x7e\x4c\x04\x0d\x6d\x3c\x29\x1a\x68\x83\x6e\xfd\x03\x70\x50\x5d\x0f\xf7\xbf\x17\x65\xa0\xec\x7a\x9a\x06\x54\xaf\x8a\x1c\xd7\x6c\x7e\x1b\x2e\x1e\x72\x4b\x32\x72\x6b\xe4\x9b\x2a\x3b\x77\xb5\x77\x74\x2e\xf3\xb0\x82\xbe\x7d\xd3\x95\x06\x5a\xe4\x80\x38\xa4\xab\x1e\x84\xbd\x1a\xb4\x5c\x32\x1f\x11\x27\x91\xe5\xee\x0e\x3c\x09\x21\xe9\xe9\xd1\xf3\x2c\xd3\x11\x7e\x7c\x5f\x55\x58\x94\xdb\x0d\xba\x46\x01\xc4\xc1\x35\xf0\xfb\x96\x1b\xb6\xf4\x05\x6e\x2d\xb9\x2d\x51\xbc\x2c\x0c\x15\xd4\x8a\xcd\xb4\xad\xaf\xe5\x77\x69\x14\xc5\xd7\x27\x92\xf5\xdd\xa1\x9d\x33\x10\x07\xd7\xc0\x35\x29\x0e\x59\xd3\x2a\xbd\xe8\xc7\xb8\x3c\x84\x92\x3b\x44\x24\x2c\x75\xee\xdc\x27\x41\xe3\x3f\x06\x99\xa6\xeb\xd5\xb4\xcd\xa7\xa1\xdd\x53\x00\x07\x7f\xbe\x92\x22\x1a\x12\xce\x8e\xb2\x9e\x11\x3e\x53\x92\xdd\x64\xba\xf7\x76\xc6\x50\xc9\x9e\xe6\xaa\xbe\x3c\x20\xe9\xd5\x59\x4d\xa3\x25\x46\x68\x00\xc4\x41\x75\x3d\x00\x73\x06\x9a\xea\x4e\xd3\xc0\x3c\xc7\x2e\x59\x27\x93\x6e\xaa\x8f\x68\x00\x1a\x53\xd7\x40\xed\xa3\xd6\x63\x05\xb6\x99\xef\x17\x6a\xd6\x7f\xc4\x2a\xab\xbe\x81\x52\x20\x88\x83\x6b\xe0\x06\xb5\xc3\xa8\x3d\xe7\x55\x1c\x63\x9b\x9e\xcb\x57\xe5\x16\xa2\x1d\xd3\x5f\x1f\x5c\x52\xbe\xb4\x91\xa3\xcd\xd8\x96\xdc\x5f\x56\x84\x88\x0b\xe2\xe0\x1a\x20\x93\x9c\x21\x78\xba\x3f\xf1\x46\xc2\x6a\xc3\xd8\xb2\xef\x48\xb3\xda\x46\xe7\x1e\x0a\xa6\xed\xac\x71\xaf\x34\xc6\xea\x37\xd9\x01\xe8\x24\x3a\x80\x83\x6b\x20\xa5\x78\xe1\x61\xcc\xe1\xc0\x48\xe9\x8d\x67\x81\xae\x98\x6f\xb4\x30\xf9\x2d\xde\xa7\x92\x8d\x10\xd9\x97\x17\xc6\xf1\x28\x94\x42\xa6\x0f\xc4\xc1\x9f\xef\x65\xc2\x4d\x0f\x3f\xf4\x27\x07\x7b\x64\x99\xe8\xef\xad\x4f\xbe\x53\x6a\xe8\x71\xdd\xf1\x2e\xab\x7d\x24\x67\x4e\xa1\xf0\x15\x75\x14\x3a\xd6\x08\xe0\xa0\x3c\xa0\xfd\x6f\x0d\x80\xd6\x1d\xa7\x69\xa0\xfc\x4e\x8f\xab\xc9\xc2\x25\xe2\x1f\x2e\x2c\x22\xe5\xd9\x32\x6d\xf4\xdd\x03\xef\x2a\xee\xa1\xd4\x10\x91\x87\x44\xa9\x8c\xfa\x76\x22\xc6\x0e\xe2\x90\x34\xb0\x7a\x37\xe4\xbc\x91\x5a\xea\xe0\x48\x86\xb6\x50\x5b\x8c\x8d\x2c\x36\x11\x99\x38\x83\x2c\xa7\xf2\x6c\x20\x9d\xe4\x9c\x5a\x2c\xa4\x01\x00\x07\xd7\x80\x6a\xc6\x81\xc6\xbe\xe8\xbe\x4a\xe1\xef\x4e\xee\xc7\xd8\x5d\x12\xf8\xe1\x58\x92\xb8\x7c\x04\xf4\x7e\xe8\x3e\xce\x6f\x8a\x37\xa0\xba\x41\x10\x87\x64\xa4\x63\x87\x50\xb7\xe9\xee\xa2\xab\xb7\xcd\xdc\x6c\xd6\xe0\x6f\x9c\x25\xb6\x71\xe2\xff\xf8\xff\x63\xee\xbd\xe3\xb9\x7c\xdf\xff\x7f\xb3\x88\x22\x42\xd9\xbb\x42\xf6\xde\xc9\xcc\x9e\x95\x4d\x46\x64\x67\x93\xbd\xf7\x0a\x11\xd9\x94\x99\xbd\x93\xad\x8c\x10\x91\x91\x9d\x90\x6c\x22\xf9\xdd\x7e\x7f\x3c\xaf\x4f\xef\xeb\xe9\xd6\xf9\xfd\xc3\x1f\xaf\xff\xef\xb7\x43\xe7\xb3\xc7\x75\x9c\xd7\xe3\x3a\xce\xe3\x38\x51\xc9\xbf\xe1\xc9\xb5\x0e\x87\xd9\x41\xbd\xae\x20\x0e\xfe\xfb\xda\x9a\x7b\xaa\x5f\x9c\xee\xe3\xd9\x27\x3f\x08\x0c\xc1\x98\x1c\xa2\xb0\x7f\x1f\x30\x9f\x44\xb3\x22\xd7\x68\x96\xf7\x46\x61\x0c\xaa\x9c\x81\x38\x28\x0f\x80\xcc\x99\xd7\x04\xb9\x67\xa0\xd2\xa3\xbe\xa7\x99\xc6\x3b\xd9\x92\x8a\x25\xd9\xbc\x8e\xd3\xa8\x9d\x4f\x1a\x3c\x59\xf7\x0b\xd5\x5b\x7e\x0d\xff\x6d\xce\xd6\x59\x85\x26\x3e\xd5\xe6\x17\xce\x11\xe3\xb7\xdc\x5b\x23\xde\xe9\xbc\x43\x60\xda\x84\x73\x2c\xc0\x2a\xdb\xd9\xb9\x40\x21\xc0\xfa\xf7\xf1\xd7\x78\x3a\xef\xe9\xd8\x24\xff\x5b\x2e\x1d\x5f\x1e\x48\xe8\x66\x5f\x23\xda\x10\x15\x32\x22\xf0\xa8\x3d\xd2\x7f\x1f\x5d\xf1\x7e\xfd\xbf\x66\xce\x40\x4b\xfb\xbb\xe7\x0c\xc9\x9c\x11\x06\xe3\x96\x75\xb4\x9c\x37\x2e\x76\x7a\x82\x9e\x62\x13\xa0\xf6\x6c\xbc\xbf\xa4\xa8\x5f\xbf\xfc\xee\x9b\xed\xa8\x88\x91\x34\xd9\x33\x29\xea\x20\x9b\xb3\x5e\x8d\x0a\xff\x20\xab\xea\xe5\xa9\xc6\x4b\xd9\x0d\x23\xaa\xb4\x1d\xb7\xca\x89\xf7\x1c\xb1\x69\x66\x30\xa8\xa6\x74\xb9\xd9\x27\xce\xa4\x84\x85\x6c\xce\xd0\x78\xe6\xf9\x22\x05\x5d\x52\xc6\x5b\xb0\xd4\xe6\xc2\xe4\x7e\xb0\xb9\x30\x6c\x87\x59\x50\xc9\x64\x77\xf1\xd7\x87\x72\x34\xbc\x39\x93\xd5\x22\x9b\xb3\x27\xca\xef\x07\x2a\x51\x15\x8d\x35\xa8\xf8\x7e\x3e\x92\xfe\xd2\xdd\xaa\x5f\x97\x52\x59\xa5\x75\x51\x5e\x75\xf9\xb8\x54\x98\xf7\x4c\x1a\xfb\x5a\x90\xcd\x59\x3d\xad\xa6\xe1\x07\xcd\x72\xb5\x8d\xc2\xf4\xeb\xc9\xb3\xd2\xdb\x89\x3e\x4b\x9d\x83\x17\x28\xe4\x65\xdb\x6e\x26\x79\x65\xda\x53\x9c\x99\x39\x03\x89\xe8\xb4\x6c\x9c\x5b\x12\xa1\xab\x4f\x77\xff\x95\x85\xac\x73\xf3\x02\xf7\xcc\xf0\x4d\x33\xd4\x3b\xe5\x0f\x3e\x63\x89\x5f\x09\xf2\x7c\x3c\x98\xf9\x16\x91\x85\x40\x1c\x3c\x1b\x13\x13\x30\xe5\x2f\x3e\xff\xfd\x70\xe9\x7a\xbc\xe3\x54\x22\x87\xa6\x16\x63\x08\x51\x89\x98\x7b\x6f\x6b\x83\xef\xef\x54\xcc\x2a\x68\xac\x21\x88\x83\x67\xe3\x85\xce\xc2\x9b\xd7\xa4\xbc\xc6\xb4\x32\x15\xf8\xcf\x25\xb6\xf1\x27\x29\x75\xca\x2e\x05\x5b\xdf\x5f\xa3\xd0\xd3\x72\xa5\xe4\x40\x43\xc4\x05\x71\xf0\x6c\x6c\x28\x13\xce\x28\xfa\xee\x3a\x96\x1d\x66\x67\xe3\xbb\xa0\xa2\xc7\x73\xa9\x69\x2c\x3f\xb2\xf1\xe5\x8f\x9d\xae\x84\x60\x13\x6b\x42\x0d\x47\x20\xce\x5f\x82\xfa\x7f\x7e\x07\x75\x11\xf3\x4a\x5f\xb1\x4d\x59\x69\x63\x66\x6d\xbe\x0f\xa8\x74\x55\xdc\xd9\x24\x17\x53\xf0\xbf\x24\xff\xfc\x8a\x1b\x97\x83\xcd\x8d\x30\x67\x20\x0e\xea\x39\xfb\xb7\x39\x03\x3d\xd0\xa7\x49\xa0\xd4\x88\x4d\xc9\xf3\x6a\xcf\x78\x8f\x46\x35\x19\xf3\xe2\xec\x25\x57\xfe\xa0\x8c\x8c\x84\xdd\xee\x8b\x43\x9b\x3a\x52\x72\x6a\x50\x5f\x10\x88\x43\x6a\xb8\xb7\xcc\x37\x7e\xa1\xa9\x98\xf1\xb2\x67\x51\x87\xc4\x51\x4b\xe0\x81\xfa\x82\x41\x70\xf5\x60\xe5\x2e\xef\x0c\x5e\xaa\x62\x3c\x17\xd4\xcb\x06\xe0\xe0\x12\x60\x10\x4c\xda\x7e\xb7\xb8\x20\x89\xff\x9c\x85\x8d\x3d\xcc\x66\xef\x35\xae\xbd\x69\xd5\xf6\xd8\x00\xca\xb9\x9f\x6d\xb7\x9e\xf9\x42\x47\xe5\x40\x1c\x5c\x02\x43\xd3\x23\xcf\x12\x1b\xfb\x6f\xdd\x76\x36\xbd\xba\x5d\x2d\x1d\x42\x41\x1a\xa8\xf2\xac\xa8\x3e\x4a\xd3\xed\x22\x59\x15\xae\x5c\x09\x22\x2e\x88\x83\x4b\x40\x85\x2e\xd5\x52\x44\xb4\xec\xe3\x91\x26\x87\x7d\x76\x35\xbf\x38\x9a\xb0\x34\x2e\x0e\xf1\xb4\x2c\xfb\x43\x03\xd2\xc8\xf3\x54\xc5\x88\x0d\x19\xc4\x41\xbd\x26\x00\x73\x06\xca\xae\xa7\x5e\xc4\x20\xbc\x7e\x0e\x25\x75\xf8\x12\x59\xef\xcc\xdb\xdf\xf7\x7e\x73\xe1\x68\xc8\xd5\x6d\x4f\xb3\x61\xbd\xf4\x6c\x8b\x8b\x51\x21\xbb\x8e\x58\x3b\x88\x83\x6b\x80\x46\x21\x4c\xaa\xc6\xb2\xd6\x89\xf1\x6d\x15\x03\x3d\x8f\x44\x61\xf9\xeb\x40\xdc\xde\xaf\x25\xb9\xbf\x45\xa2\x19\xe4\xe7\x17\xa1\x7b\x53\x40\x1c\x5c\x03\xf4\xaa\x1e\xe2\xc4\x77\x63\x02\x5c\xbf\x05\x46\x24\x68\xd1\x94\xab\x6a\x60\x1b\xa1\x7e\x3a\x2a\x37\x54\xda\x7e\xe7\xc4\xe3\x2e\x84\x88\x0b\xe2\xe0\x1a\xa0\x7c\x59\xee\xd3\xff\xb8\x76\x9f\x2a\x82\x8d\x9b\x81\x47\xdd\xe3\x1d\xb9\x13\xed\xf6\xdd\x4b\xc1\x99\xd8\x2e\xd7\xb2\xdc\xa9\xef\x20\xe2\x82\x38\xb8\x06\x0e\x07\xb8\xf9\xd9\x6f\x38\xa8\x54\x3d\xcc\x78\x35\x55\x4a\x9a\xd3\x10\x69\xeb\xd1\xb4\x5c\x8a\x22\x44\x9b\xe5\xba\x97\xb2\xd3\x80\xd0\x00\x88\x83\x7a\x4d\x00\xe6\x0c\xb4\xd5\x9d\xa6\x01\xc6\x57\xcb\x5f\xc5\x15\x94\xc3\x31\xe3\x9c\x73\x2a\x82\x3d\xf4\xf8\x66\xb3\x86\x3d\x8d\xa8\x50\x57\x8a\x59\x9b\x85\xa9\x6e\x41\xf7\x92\x82\x38\xb8\x06\x8e\xe8\x59\xf6\x37\x0c\xdd\x47\x51\xb2\x7f\xab\xae\x6b\x9b\x15\x34\xe4\x5f\xd0\xe5\x49\x8a\x31\x5e\xfe\x12\x50\x96\x6a\x51\xb9\x08\xf5\x31\x01\x38\xb8\x06\x3e\x96\x3b\x4a\x14\xf9\x55\x64\xb3\x08\x9c\x77\x79\x3b\xa1\x69\x1e\x19\x4b\xa3\x78\x9d\x6f\x1b\x07\x7d\x50\xf7\xd5\x49\x6c\x25\x0b\x22\x2e\x88\x83\x6b\x40\x70\xb2\x79\xde\x69\x77\xc7\xbb\x89\x6b\xca\xbd\x76\xb7\x6e\xc0\x4b\xd9\xd6\x3f\x85\x24\x83\x47\xec\x7e\x73\xd3\xef\xea\xbc\x52\x44\x5c\x10\x07\xd7\x00\xd1\xe4\x72\x51\xa0\x4d\x41\x99\xea\x3e\x0a\x57\xaf\x8f\xd3\x37\xd7\x66\x4f\xef\x04\x3c\x74\xbf\x20\xbd\x15\x1a\xdc\xfa\x9a\x61\x84\x06\x40\x1c\x94\x07\x00\xe6\x0c\xf4\xde\x71\x9a\x06\x4e\x68\x6d\x9f\x1a\x5f\x12\x16\xbb\xa9\x1b\x5a\xdd\xb5\x94\xf0\xcc\xe2\x41\xb4\xfd\xf2\xf6\x75\xae\x94\x78\x1d\xbc\xe0\x9b\xfa\xc9\x88\xb5\x83\x38\xb8\x06\x8a\xd2\x04\x28\x84\x67\x44\xbe\x68\xcf\xa1\x9b\x93\x7d\x70\xff\xc3\x5e\x1b\xf5\x44\x49\x74\xdc\xb7\x64\xe4\xf6\x93\x6b\x2a\xb5\x63\x50\x45\x1a\xc0\xc1\x35\x10\x94\x3c\x65\xfe\x5b\xfa\xb5\x25\x6a\x92\xf2\x71\xd4\x97\x73\x02\x92\x24\x2b\x11\x35\x5d\x2c\xa5\x66\xf7\x5d\xae\x19\x95\xbe\x8e\x46\xc4\x05\x71\x70\x0d\xe8\x89\x04\x70\xb7\x0a\xf1\x66\x12\x58\x85\x1a\x3b\x37\x2b\xf7\x64\x0e\xaa\x31\xe2\x4d\x93\xc9\x36\xd7\xba\xba\xed\x3b\x3f\x56\x43\xc4\x05\x71\x70\x0d\x14\xef\x19\x1a\x2e\xaa\x36\x5c\x43\x7d\x64\x70\x77\xe6\xde\x35\x2f\x89\x74\x9e\x64\x5e\xb6\x74\x03\x43\x5a\x9d\x0b\xa2\xf7\xb6\x6e\x23\x34\x00\xe2\xa0\x3c\x00\x32\x67\x8e\x3e\x6e\x09\x14\x33\xe6\x57\x6f\xc8\x77\x10\xe1\x32\x84\xe9\x8c\x92\xad\xdf\x7f\xbe\xae\x84\x81\xf1\xdd\x79\x8d\x4f\x89\xa7\xe8\x6f\x73\xd6\x39\x4a\x24\xa8\x54\xaf\x9b\x60\xbb\x1f\xc3\xb2\x40\x57\x46\xef\x75\x18\x37\x48\x82\x76\xdb\xda\xf8\xb5\xc1\xd3\x8d\x52\xda\x81\xbf\xd0\x6f\xde\x35\x01\xfa\xd9\xea\x0b\x69\xac\x7c\xc5\xcd\x9e\x6b\x69\xb7\x36\xb9\x53\x45\x96\x2d\x3d\xaa\x38\x12\x31\xd1\xbb\x56\xd1\xfe\x6b\xe6\x0c\xb4\xb4\xbf\x7b\xce\xa4\xe1\x2f\xf0\x04\x1a\x8c\x3b\x9d\xe1\xbe\xc5\xbf\x5d\x87\x82\x47\xca\x35\xb8\x4e\xb4\x3a\x97\xea\x2c\x0a\x78\x72\xd6\x08\x6f\x2c\x1d\x8a\xc7\x9d\x49\x51\x07\xd9\x9c\x95\x24\x3a\x2a\xe2\x72\x52\x53\x16\x6d\x2c\xf8\x51\x66\x1c\x3d\x32\x40\xe3\xd3\x67\xf0\x6c\x7b\x75\xe2\xf4\xdc\xcb\x9e\xac\x83\xf6\x4c\x4a\x58\x22\x48\x7f\xf6\x3c\x63\xcd\x0e\x69\xb8\xd0\xab\x79\xf9\x9f\xb7\x1f\x13\x97\xfe\x4a\x59\x71\xc6\xef\xac\xe8\x55\xfb\xd2\x2f\x7b\x69\xd6\xf4\x53\xc2\x99\xac\x16\xd9\x9c\x15\x0b\xe0\x96\x3c\x17\x88\x6e\x44\x7b\x3e\xf3\xbe\x35\x40\xe2\xe6\xc1\x83\x1c\x53\xab\x8d\x81\xaa\x00\x3c\x3c\x5b\x52\xa6\x0b\x8c\x67\xb2\x5a\x47\xa4\x3f\x2b\x1b\x4e\xd7\xa8\x44\x5e\x4a\xb0\xa8\x75\xc1\xba\xd3\x29\x1d\x25\x89\x2f\xc5\x79\xdd\xe0\x42\x5f\xea\x91\xdc\x49\x96\xfa\xb9\xb4\x33\x33\x67\x20\x11\x9d\x96\x8d\xa5\xbb\xee\xf3\x6b\x84\x12\x0b\x4a\xc9\x75\x30\x77\x7e\xb3\x17\xf2\xb9\x1b\x5a\xd6\xdd\xd0\xab\x45\x9e\x4b\x31\x9d\x92\x80\x07\x5d\x61\x04\xe2\x90\x1a\x0d\xb4\xd0\x1d\xfb\xcd\xef\x2a\x18\x4b\xdb\xcd\x92\x5c\x79\x21\xbc\xbf\x85\x91\x3d\x84\x32\x17\xc9\x87\xa1\xb6\xb8\x10\xf1\x21\x07\x6a\x34\x00\x70\xf0\x6c\x9c\xdc\x80\x27\x5a\x20\xcc\x14\xf7\xd2\xfa\x33\x51\x56\x1a\x2a\x2e\x2b\xe6\xb9\xe4\x3e\x5e\x45\x8c\xa4\x65\x5b\xa1\x94\x73\xe5\xd0\xd5\x48\x20\x0e\x9e\x8d\x9f\xe7\x8e\xd0\xf5\x8a\x6b\x3c\xbc\xe9\xec\x98\x39\xfd\xf6\xe6\x12\x81\x26\x56\xf0\xe6\x9d\x9d\xf4\x1c\xdb\x2e\x6c\xb4\x99\x3f\xd0\x71\x49\x10\xe7\x2f\x81\x82\xfa\x77\xdc\xcf\x25\xc5\x8f\x6e\xcd\x3f\x58\x10\xb8\xb4\xfb\xad\xf5\x9c\x65\x60\x65\x09\x85\x1a\x53\x90\x43\x28\xbe\xa1\x6d\x4c\x59\xe1\x1b\x07\x84\x39\x03\x71\x50\xcf\x99\xf4\xbf\xbf\x98\x03\x1e\xe8\xd3\x24\xf0\x47\x77\x9f\xaf\x4e\xff\xf2\xc9\xb7\xc1\xd4\xa6\x2b\xfa\xcf\x5d\x0f\xde\x47\xa4\x2d\x06\x11\xdb\xb5\xff\x71\xbe\x8a\x32\x25\x3f\x01\x1d\x3f\x04\x70\x70\x09\xe8\x1f\x75\x28\xde\xe1\x7c\xf1\x1a\x5b\xe4\x3b\x85\x1a\xa5\xe5\x42\xbd\x8c\xf1\x83\x99\xaf\xd8\xa2\x3f\xe3\xb4\x3e\xff\x22\x6e\x82\xfc\x2e\x88\x83\x4b\xc0\xf8\x50\xfa\x6b\xd4\x63\xc1\xe2\x0c\x43\x29\x4d\x97\xa3\x3e\x99\x8a\x37\x9f\x0d\x3d\x1d\x17\xc8\x48\xe4\x37\x53\xbd\x74\xe2\x34\x10\x71\x41\x1c\x5c\x02\x55\xdc\x8b\xef\xbf\x92\xfa\x58\xef\xac\x7b\xcf\x4c\xc9\x3e\x90\x97\x5f\xd7\x7c\x24\x6a\x4d\x9a\xbe\x30\x5b\x2a\x4d\xb4\x66\x06\xf5\x45\x80\x38\xb8\x04\x7e\x50\x61\x87\xe4\x2f\xbe\x44\x61\x63\xff\x74\x3c\x21\x37\x9e\xd9\x2e\xc1\xc7\x57\x26\x39\x21\xf4\xea\x7c\x5a\x27\x9a\x5c\xcc\x2a\x62\x43\x06\x71\x50\xaf\x09\xc0\x9c\x81\xb2\xeb\x69\x1a\xf0\x29\x9d\x1d\x26\xa5\x0d\x50\x41\x89\x11\x15\xb7\x9a\x88\x38\x6f\x93\x25\x22\x4a\x76\x71\x0f\x6d\xa4\x6f\x8d\x98\xb1\xa2\x29\x04\xb1\x76\x10\x07\xd7\x80\x25\xc5\x75\x6f\x72\xf7\x17\x49\xec\x15\xf2\x72\x6b\xef\x57\xf1\x45\x3e\x54\x54\xa2\xcd\x14\x9b\xf1\xba\x5c\x7e\xb8\xf3\x48\x0d\x3a\x35\x0d\xe2\xe0\x1a\xf8\xa5\x36\x2d\x4c\xb4\x9a\xfd\x70\xb8\xf9\x83\xa7\xb1\xec\x39\x82\xa0\x39\x5c\xdb\x7d\x37\x16\x9f\xd7\xcd\x8d\x0d\xdb\x56\xe1\x50\xeb\x29\x88\x83\x6b\x20\x87\x41\xbc\x9c\x51\xe6\x1d\x36\xcb\x58\x85\x54\xe8\xc7\x2f\xf9\x13\xda\x05\x1f\xc2\xdc\x31\x83\xe3\xbf\x7d\xc9\xc6\x79\xfc\x7f\x55\x64\x10\x07\xd7\x80\x48\xcd\x6b\xb3\x4b\x69\x9f\xd2\x5f\xfb\x72\xb3\x4b\xcd\x0c\x70\xd9\x7e\x09\x69\xdb\xfe\x9a\x4e\x58\xdc\xc4\x13\x57\xcf\xb4\x5c\x83\xd0\x00\x88\x83\x7a\x4d\x44\xfe\xad\x01\xd0\x56\x77\x9a\x06\x32\x18\xdf\xd3\x14\xfe\xc6\xc7\xb5\xaa\xc2\x88\x7d\xf6\xcb\xf8\x2e\x79\xaf\x9c\xe7\x15\x42\x6d\xbf\xd8\x2f\x27\xd4\xa4\xa5\x17\x39\xa0\x1e\x51\x00\x07\xd7\x40\xc9\x9a\x81\x20\xb1\x38\x27\x7d\x45\xb6\x18\x07\x8f\x7b\xfe\xc7\x69\x13\x09\x36\x42\x97\x97\x0a\x62\xa6\x01\x77\x87\x3f\xce\x48\x40\x53\x4c\x01\x1c\x5c\x03\xf7\x7d\x0e\xb6\x7f\xd3\x5d\x0e\x89\xc3\x18\xa8\x62\x88\xfd\x23\xf9\x66\xe1\xfc\x6f\x47\xa9\x39\x9f\xb4\x6c\xeb\xe4\x93\xcb\xcc\x5e\x50\x8f\x1c\x80\x83\x6b\x60\xf4\x93\x6a\xd1\x98\xdd\x1f\xbc\x03\xf7\xa9\x25\x01\x21\xdc\xf4\xae\x8c\xd2\x1e\xbb\xc8\x4c\xfe\xb1\xa3\x76\xf3\x8f\x9f\x8f\x7b\x11\x71\x41\x1c\x5c\x03\xca\x7b\xbc\x6e\x49\x84\x85\xb9\x59\x2d\xed\x3f\x74\xd6\xc2\x3c\xb7\x23\xe5\x96\x04\xa3\xb7\x74\xbf\x0e\x73\x8c\xe5\xbc\x8a\xb8\x81\xd0\x00\x88\x83\xf2\x00\xc0\x9c\x81\xde\x3b\x4e\xd3\x80\x4d\xd5\x1c\x5d\x19\xce\x0b\x46\x3e\x9c\xef\xc7\x8a\x58\x03\x93\x7a\x2a\x73\xa1\xca\xca\xdc\x25\xe7\x8e\xf0\x64\x72\xdd\x1e\x43\x46\x1a\xc4\xc1\x35\x10\xb1\x74\xfd\xf0\x3a\x2b\x69\x3b\x2f\xdb\x85\x88\xf3\x9b\xea\xf7\x5e\xfa\x32\x78\x58\x8f\x6d\xa8\x11\x93\xdd\x0c\x9c\x26\xa2\x6b\x40\xc4\x05\x71\x70\x0d\x14\x8c\xbf\x9a\x1f\xb8\x91\xa1\xa7\x23\xe4\xf1\x67\x84\x82\xeb\xe1\xcd\x17\xcf\x51\x75\xd8\xd8\x42\x38\xad\x8e\x93\xb4\x28\xf8\xa1\x0f\x75\x20\x0e\xae\x81\xef\xe8\x87\xb1\xfa\x9f\x5c\x0f\x65\xd6\xc5\xbc\x63\x3e\x79\xf3\x2e\xdd\xaa\x79\x7d\xb7\x87\xfc\x52\x1c\xda\x8c\x0a\xb9\xce\x67\xe8\x3e\x66\x10\x07\xd7\x80\xcf\x17\x1c\xb5\xcb\x55\x55\xb1\x4c\xce\x4c\xa4\x0c\x2b\x54\x3d\x6c\x7b\xda\x51\x9c\x56\xbb\x7e\x3a\x3c\xdb\x02\xf1\x3e\x02\xa6\xd0\x4d\x89\x00\x0e\xca\x03\x8e\x00\x73\x86\x1f\x79\x67\x3b\x37\x4c\x37\x05\xef\x63\x67\x09\xb1\x06\xd7\x82\x00\x06\x07\xf7\xee\x12\x0d\x4d\xcb\xde\xa8\x6f\x00\x77\xfc\xc5\xbf\xcd\xd9\xaa\x49\xa4\x89\xb1\xe7\xb3\xef\xd9\x84\x5f\x86\x43\x14\x8f\x3e\x39\x8b\xeb\x11\x3e\x0c\x3c\x48\x1a\x10\x71\x29\x7e\xcf\xb2\x1d\xf2\xf7\x69\x1b\xcc\x24\x71\x1a\x3f\x79\x9a\x26\xca\xb5\xf9\xd0\xe3\x82\x04\xd1\x58\x83\x76\x96\x1f\x74\x97\x7f\x2c\x37\x2f\x1b\x1e\xaa\x0a\xff\xd7\xcc\x19\x68\x69\x7f\xf7\x9c\x21\x99\xb3\xc0\xb0\x3f\x77\x68\x5f\xbc\x0d\xa4\xbb\xe6\x83\x22\x7d\xf5\x28\x48\xaf\xb1\xed\xe4\x80\xe1\xf2\x0e\x8b\xdf\x61\xc1\x53\xd1\x6f\xd6\x67\x52\xd4\x41\x36\x67\xac\x44\x79\x41\xdc\xae\x97\x49\xe3\x2b\x6f\x3f\x11\x8c\x13\xbc\x35\x13\xa8\xd7\xe5\xdd\x83\xa6\xad\x52\x8d\xf3\x93\x30\xa8\x12\xe3\x4c\x4a\x58\xc8\xe6\xcc\xb5\x35\xec\x17\x3d\x7a\xc4\x46\x7b\x8b\x5c\x33\xe6\x41\x39\x01\x81\x8e\x4b\xd6\x7e\x43\x9a\xc8\x6c\x6e\x69\x62\xc0\xea\xf5\x33\x99\x43\xd2\x82\x6c\xce\xee\xfb\xdb\xf3\x6c\x0f\x77\x5d\xd1\x3d\xc6\xdf\x75\xb2\x4b\xb1\x3e\x2f\x9e\x91\x76\xa1\x9e\xa0\xf0\xf3\x73\xe3\x87\x24\x03\x07\x3f\xcf\x64\xb5\xc8\xe6\xac\x2e\x7c\x63\x2f\xe0\x4e\xd9\xe6\xd4\xc8\xda\x22\x1e\x15\xfb\xfd\xd2\x23\x73\x76\x39\x74\xdd\x7e\x79\x45\xda\x27\x47\x79\x6a\x19\x67\x66\xce\x40\x22\x3a\x2d\x1b\x53\x3c\x70\x90\x9b\x18\x28\xdf\x5b\xd0\xc6\x7d\xb6\xc5\x5f\x58\x88\x52\x1a\x6c\x4d\x80\xa1\xf0\x50\x24\x3c\x95\x55\xe0\x5d\x3f\xd4\x1b\x06\xe2\xe0\xd9\x38\xfb\x0d\x3e\xfb\xca\xa5\x47\xe5\x06\xe4\x0e\xe4\x09\x5f\xf1\x3c\x25\x97\x64\x13\x8f\xda\x9c\x67\xdf\xaf\xa4\xbe\x41\x71\xba\xbb\x81\x88\x0b\xe2\xe0\xd9\x58\xe5\xfd\x7a\x3c\xcb\x97\x5d\x82\x67\xf5\x35\xaf\x54\x09\x71\x09\xa9\xd5\xde\x3c\xfb\xb4\x4d\xa5\x97\xae\x2f\x97\xc6\x61\x23\xf4\x07\x11\x17\xc4\xc1\xb3\xf1\x39\x3c\xc3\x7b\xe6\x36\x21\x6f\x35\x53\x7f\xaa\xdf\xd9\xe4\xe5\xf6\x7a\x6f\xdf\xee\x5b\xfc\xd3\xc1\xcc\x9d\xde\xb8\x6a\xe9\x25\x74\x7d\x1f\x88\x83\x1f\x5e\xef\x7a\xf0\x3a\xf1\x43\xa1\xd1\x9a\xe5\xa3\xdf\x0b\x21\xe4\xcf\x73\xdd\x43\x08\x3e\xef\x45\x44\x96\x72\xe9\x0a\xbe\x7c\x7a\x84\x8b\x86\x30\x67\x20\x0e\xea\x39\xfb\xb7\x39\x03\x3d\xd0\xa7\x16\x4f\x7d\xf9\x7f\x1d\xc5\x26\xed\x3e\x6d\xc8\x5c\x48\x30\x23\xf5\x74\xcd\x9a\xa3\x7d\x6a\x77\xf4\xe9\xbd\xef\xba\x88\xd3\x07\x0b\x68\xf2\x1d\x88\x83\x4b\x60\x2f\x5d\x54\xd5\xd7\x3a\xe2\x9d\xe0\xdb\x39\xb2\xe1\x67\x83\xc3\x91\x65\xc6\x78\x4e\x2d\x28\x7e\xa5\x5b\xf5\xc6\x7a\xf2\x6f\xa1\xa3\x67\x20\x0e\x2e\x81\x7e\xec\x09\xe9\x9b\xc9\x6e\xd8\xaa\xf1\xf7\x2f\x64\x73\x88\x63\xd6\x88\xba\x5b\xff\xc9\xe4\x44\x9b\xc2\xaf\x70\x95\x2d\x6a\x86\xfc\x39\x88\x83\x4b\x80\xd7\xe4\xa5\xfe\xc8\xfb\x21\x2d\x21\x8f\x1c\xfc\x8b\x52\x72\xfc\xef\x44\x5f\x71\x63\x7b\x39\xe3\x8c\x1c\x54\xe2\x6a\xbf\xb2\x83\xc6\x95\x83\x38\xb8\x04\xbc\xf5\x0f\x77\x03\x0c\xd4\x37\x29\x6e\x0c\xe2\x34\xfa\x3b\x4a\xa7\x86\xeb\xb3\x4e\x64\x29\x49\x7f\x14\x78\x29\x7d\x47\xfe\xab\x03\x62\x43\x06\x71\x50\xaf\x09\xc0\x9c\x81\xb2\xeb\x69\x1a\x90\xfc\x56\xff\xf1\xd9\xee\xfa\x7a\x5e\x92\xc5\x42\xa0\xf8\xb1\x75\x9d\x9e\x15\x97\x14\x85\xe1\xaf\x8d\xdb\x2d\x6b\xaa\xd3\xee\xd0\x51\x51\x10\x07\xd7\x40\xbe\x93\x29\x67\xe8\xa7\x95\xcb\x21\x2a\x3a\x4b\x7e\x6b\xba\x3b\xc2\x8d\x0a\x6e\x2d\xd9\xad\x84\x6e\x8a\xdc\xa8\xb9\xa5\x09\xdf\x11\x71\x41\x1c\x5c\x03\xab\xdf\x3f\x9a\x17\x90\x1a\x62\x8c\x76\x2b\xbe\xff\xa4\xdc\x56\x22\xb3\xb0\xb8\xd4\x92\x13\x20\xda\x9b\x8d\x9e\xfc\x81\xb2\x00\xea\x0b\x02\x71\x70\x0d\xdc\xf7\x12\x67\x41\x75\xf7\xf0\xb2\x26\x22\xfa\xb8\xa7\xf0\x92\x27\xff\xfe\x27\xd9\xa7\x3c\xfa\xc5\xfa\xbf\x79\x14\xf0\x7a\x36\xa1\x49\xa0\x20\x0e\xae\x81\x00\x8a\xcd\xb5\xe4\x38\xe3\x34\x8d\xdf\x57\x2e\x3c\xc7\xb0\x5c\xbc\xe3\x7b\x85\x79\x64\x4c\x2e\x26\x35\xfb\x97\x7f\x8e\x9f\xce\x73\x84\x06\x40\x1c\xd4\x6b\x02\x30\x67\xa0\xad\xee\x34\x0d\x14\x46\x8c\x60\x6a\x33\xa8\x24\xf4\x7d\xb4\x96\xcb\x2c\x41\x77\x17\xec\x6d\x16\x9d\x9f\x19\x2d\x9a\x46\x15\x7f\x12\xe9\x81\x3f\x0b\x4d\xbe\x03\x70\x70\x0d\x9c\xbc\x8b\x75\xb3\xbf\xf2\x6a\x80\xa9\x09\x2f\x3e\xbf\xec\x92\xd6\xa7\xc8\xc5\x8a\xed\xfa\xf8\xee\x49\x4a\x8b\xd4\x89\x43\x96\x4a\xa8\x1a\x03\xe0\xe0\x1a\x78\x18\xbe\x6a\x3e\x6b\xb6\x5f\x44\x79\x60\xe2\xed\xd3\xc2\x33\xb4\xde\xe8\x82\x12\x1b\x39\x43\xca\xe6\xe8\xba\xb7\x22\x96\x06\x5d\xb7\x09\xe2\xe0\x1a\xf8\xea\x30\x84\xc1\x6f\x46\xb0\x6b\xb7\x1d\xa1\x97\x2d\x25\x90\x4a\xa6\xa0\x29\x66\x4b\x8f\x59\xf0\xd6\x45\x3b\xfd\xd2\x43\xf6\x41\x44\x5c\x10\x07\xd7\xc0\xf2\xfc\x42\x4b\x17\x27\x99\x37\xe9\xb7\x26\x69\xb3\x98\x10\xe2\xce\x4d\x46\xb7\xb1\xf2\xd5\x80\x99\x39\x6c\xf1\x8c\x83\x42\x14\x84\x06\x40\x1c\x94\x07\x00\xe6\x0c\xf4\xde\x71\x9a\x06\x52\x0a\x0e\xaa\xed\x89\xbd\x0e\x3e\x16\x9d\xbf\xfd\xd5\xe0\x6e\xf4\x71\x59\xca\x03\xc3\xea\x57\x02\xd5\xbf\x56\xef\xad\xef\x9b\x41\x07\x53\x40\x1c\x5c\x03\xeb\xa5\x5b\x35\x69\x5f\x3a\x13\xef\x9e\x54\x08\x3f\xfc\x5e\x99\x93\xdd\x39\x83\x35\x22\xc0\xae\x14\x6a\xfd\x95\xc1\xdd\x5d\x34\x18\x11\x17\xc4\x21\xdd\x62\x84\xe5\x33\xc3\x3d\xc0\x67\xb7\x6d\xa3\xcb\xc0\xa9\xa7\xc9\xa5\xd7\xd0\x1d\x2a\xa6\x75\x7b\x6c\xb4\x21\x3e\x70\x0c\x4f\x08\x1a\xde\x0c\xe2\xe0\x1a\xe8\x7a\x6c\xee\x1a\xf4\xba\x7b\x74\x97\x64\x86\xc8\x90\xb5\xc6\x53\x95\xdc\xcd\x27\xea\x7b\x04\xfd\xa7\xaa\x8a\xb7\x4a\x4e\x35\x7d\x88\xb8\x20\x0e\xae\x01\xb1\xa4\xf8\x3e\xcf\x17\x9e\x35\xed\x18\x7d\xc3\xd2\x86\xd3\x34\x49\x55\xdd\xf8\xf7\x5c\x30\x88\xf6\xf0\x02\xbf\xcc\x60\x5f\xed\x44\x68\x00\xc4\x41\x79\x00\x64\xce\x18\xae\xa8\x73\x63\x60\xf9\x38\xb1\x3b\x16\x89\x11\xc7\x8a\x6f\x2f\x53\xf3\x1f\xea\xc8\xb0\xce\x8d\xd2\x3c\x3b\x48\xce\x89\x6d\xf8\xdb\x9c\x0d\xe0\x52\xe7\x62\x25\x67\x88\x5e\xcb\xd4\x68\x7b\xf5\x39\xb0\xef\x96\x88\x3c\xc7\x0c\x36\x5f\xa9\xce\x85\xb0\xcf\xe8\xd8\x2a\x72\x7f\xa1\x97\x98\x53\x1d\x54\xa2\x8a\x72\x7b\xc8\x7f\xeb\xad\x5b\x39\xbc\x1a\xf7\x9b\xb3\x2f\x4a\x89\xbc\x28\x71\xbb\x81\xc4\x3f\xca\x6d\xfc\xbf\x66\xce\x40\x4b\xfb\xbb\xe7\x0c\xc9\x9c\x89\x1d\x15\xa7\x5b\xd9\x2b\xfc\x78\x58\x7b\xf0\x2c\x57\xe1\x1b\xbf\x01\x89\x4c\xa1\xed\x27\x8b\xfe\x9e\xcb\xe1\x96\x1a\x38\xbf\x3c\xce\xa4\xa8\xc3\x89\xe4\x1b\xc2\x84\x3b\x92\x25\x39\x3d\x9a\xa7\xbd\x58\x2a\xfa\x7b\x82\x6f\x84\x0c\x0c\x30\xd8\xb7\x1a\x4f\xa5\xd1\x2b\xdb\x6b\x11\x47\x25\x9e\x49\x09\x0b\xd9\x9c\x85\xb3\x90\x73\x1f\x97\xb2\xd0\xd7\xdd\xd6\xc5\x63\xe6\x3f\x11\xa7\x99\x31\xf9\x75\x93\x41\xe7\x9d\x8b\xc9\x8a\x06\xf5\x0f\x94\xa6\x33\x59\xed\x03\xa4\x3f\x5b\xd3\xb6\x5e\x6e\x5a\xd6\x2a\x1d\xdf\x98\x18\xfc\x78\xad\xb1\xe9\x82\xd7\xd3\x4d\x21\x49\x6c\xe7\x06\x09\x89\x06\x79\xe6\x90\xfd\x33\x59\x2d\xb2\x39\x4b\x44\x37\xe1\xaf\xf9\xb9\xb1\xd4\x1f\xe4\xee\x12\x56\x16\xea\x1e\x65\xe8\x1c\x3b\xc2\xb5\xc9\x86\x65\xf1\x67\x64\x55\xea\xe0\xec\xee\x56\x07\x89\xe8\xb4\x6c\xec\xba\x39\xef\x75\x99\x4f\xa5\xc4\x01\xf7\x7e\x7f\x2d\x11\x4a\x9c\xc4\x5d\xb2\x6a\xd4\x5e\x32\xbd\x73\xd5\x92\x89\xa9\x2e\xbd\xb7\x11\x59\x08\xc4\xc1\xb3\x31\x69\x48\x81\x63\xfa\xa0\xff\x60\xce\xb3\x4b\xba\x0c\x18\xf8\x59\x5c\x4e\xcc\x9d\xd1\x2e\xce\xb7\x83\x59\xef\x2e\x3d\x0d\x68\x83\xba\xcb\x41\x1c\x3c\x1b\x2f\x61\xd6\xda\xf4\x1c\x1b\x0f\xbe\x55\xc9\x1c\xab\x11\xe5\xc7\x0b\x49\xa1\x99\xab\x42\x7b\x9f\x39\x6a\xa8\xb4\x79\x93\x4c\x12\x3a\x2e\x09\xe2\xe0\xb7\x9e\x4e\xb9\xaf\xcb\x56\x4a\x07\x9b\x4f\x7f\x91\x1f\x8b\x9f\xc6\x2e\x77\x89\xb7\xfb\x56\xdb\x2c\xbf\x63\x9d\xe8\x28\xcf\x40\xb5\x4a\x86\x88\x0b\xe2\xfc\x25\x50\xff\xe7\x77\xa8\xbf\x1b\xe2\xb4\x86\xc9\x23\xf6\xa1\x08\x0f\x8b\xc7\x93\xbe\x70\x25\x4b\xf2\x27\x45\x0a\x61\xab\x77\x87\xf7\x17\xce\x4b\x9e\x76\x08\x73\x06\xe2\xa0\x9e\xb3\x7f\x9b\x33\xd0\x03\x7d\x9a\x04\xc4\xfa\x3f\xb5\x08\xfa\x5c\x4d\x75\xa8\x88\xca\xbd\x64\x6d\xa5\x61\x39\x3b\x67\x46\xf6\xb6\xfc\xaa\xc1\xc3\x93\x02\x87\x9f\xfb\xd0\xd1\x10\x10\x07\x97\xc0\xef\x78\x9f\x92\x1c\xfa\xda\xd9\x8f\x6e\x06\x4b\xc1\x19\xc1\xbb\xdb\x1a\x49\x8f\x70\xb4\x30\xdc\x92\xba\x2b\xad\x07\x4c\xb0\x70\x10\x71\x41\x1c\x5c\x02\x8d\xc1\xdf\xe9\x8f\xfb\x44\x51\x67\x3d\x4f\xa4\x55\x54\xf4\x9e\xbd\xc3\xee\xd8\x96\x4f\xfc\xce\xe9\x71\xac\xbf\x58\x94\xe7\x29\x85\x88\x0b\xe2\xe0\x12\x48\xf2\xd9\x7e\xed\x8a\xf9\x67\x6a\x83\xcc\xf7\xc1\x23\x9c\x04\x31\x7e\xf6\xd8\xda\x42\x37\x0a\x55\xba\x71\x12\x23\xf9\x78\x4d\x0f\x44\x5c\x10\x07\x97\x40\x23\xfa\x86\xd1\xbd\xd6\x03\xf9\xfb\x1f\x82\x28\x92\x29\x24\x6d\xbb\x46\xc6\x34\x30\x8b\x9e\xb1\x30\xbd\x31\xdb\x9c\xe6\xab\x0e\x80\x2e\x55\x06\x70\x50\xaf\x09\xe7\xbf\x5f\xca\x40\xd9\xf5\xd4\x02\xba\x60\x90\x9a\xe9\xf1\xbe\xf8\xad\x17\x52\x6b\xfd\xd8\x53\x8a\x3e\xb5\xc5\x37\x7a\x17\xeb\x49\x7c\xd7\xa4\x28\xf7\xeb\xcd\xa0\x09\x98\x20\x0e\xae\x81\x11\x9b\xbb\x07\x8b\x37\x2e\x84\x94\xef\x7d\xed\x65\x13\xe1\x16\x20\x7c\xb4\x7a\xfd\xe8\xb6\xd0\x7d\x3f\xf7\xf1\x95\x77\x37\x26\xb7\x11\x71\x41\x1c\x5c\x03\xb8\x15\x53\x2f\x6b\x5a\xb0\x5b\x6c\xaf\x7d\xff\xf4\xf0\x89\x91\xa5\x03\xfd\x00\x1d\x4a\x43\x55\xdf\xf5\xd4\x85\xfd\xc9\xa0\x69\x2a\x44\x5c\x10\x07\xd7\x40\x48\x65\x84\x32\xe3\x10\xfd\x8f\x35\x3e\x9a\xbe\xd2\xa6\x21\xa6\x63\xeb\x1c\xcd\x98\xc3\x24\x39\x1f\x54\x73\x9f\xdd\xc6\x3b\xd0\x40\x04\x10\x07\xd7\xc0\x63\x1a\xfe\x18\xbb\x91\x3a\x2b\x4a\xd2\xb2\x8b\x47\xf5\xd9\x69\x78\x02\x8b\xc6\xd2\x45\x6c\xda\xaa\x09\xa3\xa3\xa5\x2e\x15\xd0\x28\x7d\x10\x07\xf5\x9a\x00\xcc\x19\x68\xab\x3b\xb5\x72\x86\x62\xb8\x91\x8d\x23\x98\x2b\xb5\xbf\xcc\x7f\x88\x55\xe3\xb3\x12\xf6\x50\x03\xf3\x91\x7b\xf7\xc4\x76\x61\x77\x0e\x07\x2a\x64\xa2\x40\x1c\x52\xe5\xec\x99\x6a\x48\xd9\xf7\xd1\xf1\x6e\xde\x0b\x1a\xf3\x9c\xc1\x59\x6a\xbf\xf4\xac\x7f\xee\x96\xb6\x3a\x65\x2d\x36\xa9\xde\x6b\xa9\x81\x2a\x67\x00\x0e\xe9\x4e\xb9\xaa\xb0\x05\xf9\x31\xef\xd1\x29\x5b\x51\xaf\x7a\x6e\x59\x93\xdb\x63\x49\xba\x86\xb5\x37\xa3\xd8\xde\x7e\x74\xc4\xe8\xda\x82\x3e\x2a\x81\x38\xb8\x06\xec\x8e\x87\x8f\x1f\x6a\xd3\x5f\xaa\x97\x4b\x15\xc9\x94\x93\xc7\xf7\xbf\xd8\x57\x56\xe1\xe2\x89\x26\x6a\x62\xf6\xdc\x24\xf7\xeb\x7d\x68\xc2\x28\x80\x83\x6b\x80\x4b\x65\xcc\x7f\x3d\xfc\x1c\x03\x8e\xc8\x3a\x3f\x8d\x6f\x5c\x64\x34\x9b\xa1\x99\x4e\x4f\xdc\xa1\xbc\x20\x91\xfc\x57\xd1\xd9\xaf\x08\x0d\x80\x38\x28\x0f\x3c\xf8\xb7\x06\x40\xef\x1d\xa7\x69\xa0\x86\x3a\x9f\x60\xc2\x19\xef\xdc\x07\x3d\xec\x8d\x76\xfb\x52\x1a\xb6\xca\x26\x97\xa2\x1d\x81\x1c\x8f\x24\x3e\x91\xfe\x04\x59\x28\x67\x83\x38\xb8\x06\x70\x88\xdb\x2c\xb6\xfb\xa9\x2c\xeb\xfa\x43\x8b\x6e\x66\xb7\x07\xd8\xd4\xcd\xe8\x6f\x1a\xdd\x91\x76\x76\x2f\x8a\x5a\xd1\x0b\x85\x6e\xec\x01\x71\x48\x37\xeb\x2c\x5a\xdc\xb9\x7d\x49\x46\x27\x4a\xa5\x88\x91\xe2\x4a\xf4\x5c\x4e\x8e\xd2\x0c\xda\xb8\x0b\xee\xed\x25\x29\xec\xe9\x22\x3f\x68\xdb\x06\x71\x70\x0d\x7c\xcc\x4d\x1a\x8e\x7e\xac\xdb\x15\x23\x40\xdc\xd5\x9c\x32\xa7\x68\x60\x79\xb5\xab\xe3\xf9\x72\xae\x60\xb8\xe5\x20\x63\xde\x17\x2d\xe8\xc8\x2c\x80\x83\x6b\xe0\xe5\x56\x5a\xfa\xed\x91\xcb\x33\x97\xf7\x76\x53\x57\xfa\xf2\xee\xcf\xb7\x06\x79\x35\x15\x15\xf9\x91\xa5\xd2\x3e\xe2\xf1\x99\x69\x81\x26\xf7\x02\x38\x28\x0f\x80\xcc\xd9\x6f\xf5\xc7\xd1\x94\xaa\xb6\x1e\xcd\x7e\xf1\x86\x8a\xd7\x32\xea\x27\x24\xdf\x6e\x65\x70\x84\x7a\x77\x99\x57\x2c\x0b\x7c\x2e\x76\xfe\xdb\x9c\xc5\x67\x48\x98\xd5\x9c\xa0\xee\x58\xa0\xb6\x3e\xa1\x2e\xf9\x73\xc5\x51\x14\xd3\x04\x63\xca\x68\xe4\xf5\x84\x50\x71\x04\x99\xd3\xdf\x57\x4d\xad\x2d\xca\xe0\x65\x8c\xba\x8c\xeb\x32\xfa\x90\x91\x7b\xba\x08\xa3\x99\x4b\x88\x9a\x1b\xd4\x11\x65\x7b\xcc\x8c\x12\x60\xdd\x7d\xf1\x5f\x33\x67\xa0\xa5\xfd\xdd\x73\x86\x64\xce\x98\x55\xac\x98\x74\xa3\x45\x73\xde\xa2\xf1\xc8\xdd\xb0\xee\x32\xbb\xcb\xb7\xb2\xe0\xca\xf9\x66\xc7\xf3\x5c\x41\x68\xea\x6f\xe2\xaa\x33\x29\xea\x20\x9b\x33\x2e\xc7\xbb\x38\xcd\xc4\xf2\xbc\xbd\x1e\xaf\x85\x4c\x69\xa9\xa7\xeb\xad\x8a\x89\x66\xc7\xff\x10\x1e\x3b\xf7\xdd\x7f\x70\xf9\x1a\xfd\x99\x94\xb0\x90\xcd\x99\x49\x62\x74\x34\xda\x47\xa5\xfd\xd1\xbd\x43\x92\x59\xcf\x4e\x3b\x07\xac\xb0\x11\xc9\x87\xd6\x79\xcb\x61\x95\x37\x89\x4d\xd1\x5e\x9e\xc9\x6a\x91\xcd\x59\x07\x09\x2b\x5f\xc6\x52\xcc\x9a\xc9\xfb\xf1\xac\x1f\x6d\xe8\x42\x38\x56\x6b\x37\xb1\x45\x68\x4b\x9d\x30\xa4\x30\x1a\x92\x34\xa8\xcf\x64\xb5\xc8\xe6\xac\xf3\x60\x69\xd7\x9a\xd5\x84\xa7\xfc\xc6\xbd\x8d\x82\x82\xe0\x9c\xa5\x5d\x53\xb4\x07\xfe\x1a\x8d\x93\x22\xdd\x89\xbf\x42\xde\x95\x9f\x99\x39\x03\x89\xe8\xb4\x6c\xec\x6c\x4c\x5c\x62\xda\x37\xef\x15\x14\x7a\x61\x92\xaa\xe4\x59\xd0\x3d\x63\xe2\x93\xd4\x48\x52\x14\xa5\x88\x29\x92\xef\x9d\xd5\x11\x88\x2c\x04\xe2\xe0\xd9\x38\x7a\x6b\x83\xcd\x48\x4b\x97\xec\xa7\xd4\xba\xfb\x6d\xfc\x41\x31\xc9\x95\x6f\xba\x51\xc4\x77\x7b\x1d\x3e\x48\xd0\x7c\x47\x75\x80\xc6\x1d\x81\x38\x78\x36\xae\xec\xc0\xeb\x1d\xc9\x9e\xf6\xe3\xd1\x7c\xd4\x2e\xe4\xd3\xf6\xe0\xdb\x8d\xd6\x0b\xb8\x6a\xd8\x3d\x14\x9f\x94\x2d\x67\x5f\xdc\xf6\x45\xc4\x05\x71\xf0\x6c\x1c\xe8\x7c\x72\x49\xfd\x17\x01\x46\xf8\xc4\x6b\xa6\x67\x6d\xf4\xb4\x2f\x22\xbb\x95\x34\xca\xdf\xb1\x32\xe0\xf5\x87\xfe\xc4\xc8\x35\x86\xa6\x57\x00\x38\x7f\x09\xfc\xff\x1d\xb8\xc2\x72\x83\x56\xe3\xfe\xb1\xf2\x08\x51\xab\x13\xc7\x89\x56\x98\x56\xe0\x87\xca\x66\x46\xa7\x6a\x6f\x9a\xef\x91\x77\x3e\x4e\x3b\x22\xcc\x19\x88\x83\x7a\xce\xfe\x6d\xce\x40\x0f\xf4\xa9\x77\xbe\x6b\x34\x87\x6b\xd0\xd5\x89\xd6\xcd\x29\x31\x86\x90\xcf\xf2\x14\x2d\x53\x74\x72\x58\x79\xa5\xbf\xd7\x96\x65\x6f\x76\x53\x85\x5e\x9e\x40\x1c\x5c\x02\x1b\xa5\x84\x93\x69\xf3\x2f\xa3\x02\x9d\xec\xae\xe6\xa3\xb1\xa7\x8b\x9b\xdc\xb9\xf0\x61\x87\x97\x22\x8b\xfd\x31\x0d\xed\xc7\x8b\x3a\x88\xb8\x20\x0e\x2e\x81\x52\xf4\xbb\x7e\x9b\x93\x31\x28\x58\xc5\xc2\x07\xd1\xf6\xac\x4d\xb6\xa6\x5f\x59\xc9\xa2\xcc\x5e\xe9\x93\xbe\xdc\x53\x79\x15\x07\x8d\xe6\x06\x71\x70\x09\x94\x5d\xa7\x23\x30\x37\x08\xbc\x81\x81\x73\x4b\xf8\x98\x6e\x3d\x3d\xf2\x44\xa0\x0a\xa3\x55\xbe\x51\x75\xf8\x51\xba\x96\xfe\x21\xd4\x73\x03\xe2\xe0\x12\x58\x7f\x77\x67\x07\x3d\xfe\x5b\xc5\xcf\xb9\x10\x8e\xb6\x0b\x3b\x2b\xa4\x15\xde\x3d\x2a\x0d\x04\x3a\x74\x37\x1c\x77\x15\x84\x7a\xe3\x10\x1b\x32\x88\x83\x7a\x4d\x00\xe6\x0c\x94\x5d\x4f\xd3\x00\x91\xb7\x9f\xe4\x83\x6c\x0a\xab\x2f\xe9\x6a\x6a\x3d\x77\xaf\xbe\x6c\x5b\xd4\xaa\x9f\x6c\xc9\x63\x96\x4f\x63\xa9\xc9\x3e\x6a\x2f\x80\x4e\x21\x03\x38\xa4\xca\x59\xa2\x58\xdc\x24\x2b\x3a\x23\xa1\xbb\xea\x44\x37\x1a\xe1\x78\xc6\xd2\xc7\x0b\xda\x7a\x46\x85\xa6\xf7\xc5\xa4\x97\xfa\x56\x21\xc3\x0b\xe2\xe0\x1a\xc0\xe2\xd2\x4e\xf1\xcf\x08\xad\x1a\xe0\x9a\x7b\x9b\x12\xe5\x65\x2e\xfb\x70\x21\xed\xd6\x98\xaa\x36\x93\xe3\x60\x68\x56\x6b\xc6\x13\x44\x5c\x10\x07\xd7\xc0\x23\xc9\x29\x0d\x6c\x94\x5b\x56\x66\xc5\x57\xc3\x7f\x61\xdd\xaf\x6d\x39\xfe\xed\x93\x50\x89\x6d\x4c\xd2\x9e\x15\x15\xac\x59\xc6\x8d\x88\x0b\xe2\xe0\x1a\x08\x36\xb0\x42\xff\xb3\x16\x64\x37\xf3\xa7\xa4\xfb\x9b\x7d\x5d\x35\xda\x1d\x56\x67\xef\x38\x01\xd7\x2d\xf9\x67\x75\xd9\xb4\x37\x78\x11\x1a\x00\x71\x50\xaf\x09\xc0\x9c\x81\xb6\xba\xd3\x34\x70\x38\xd5\x4c\x6b\x4e\x9a\x82\x56\xe7\xb8\x33\x34\xfc\x20\x9f\xeb\x69\xb4\xae\xeb\x51\x6a\xe1\x6a\x18\x41\x03\x7a\xa0\x6e\x2d\xd4\x6f\x07\xe2\x90\x0e\x51\xd4\x86\x68\xfe\xac\x7c\xce\xde\xf4\xf1\xb2\xcb\xb8\xae\xc2\xbb\x94\x9d\xa4\xb9\x70\x6c\x95\x72\xbc\xc8\x9f\x45\xce\xd2\x16\xd0\xff\x15\x88\x83\x6b\x40\xcc\x43\x5b\x05\xd3\x45\xfb\x4a\x1d\x67\x37\x15\x2f\xe1\x5d\x56\x15\xeb\x82\x42\x85\x9f\x2e\x34\x5e\x9d\xe2\xef\xf6\xc3\x45\xa1\xc3\x19\x20\x0e\xae\x01\x5e\x1f\xb7\x18\x9c\xdd\x7b\xeb\xe7\xc8\xb3\xe7\x59\x5e\x5b\xdf\x40\x65\x25\xaa\x7b\x80\x66\x9b\xf6\x22\x30\x6d\x7c\xe3\x9d\x3d\x35\x54\x41\x07\x70\x70\x0d\x68\x13\x62\x4f\xf9\xbe\xe3\xb8\xf6\xdc\x3e\xd5\x50\xe2\xbc\x56\xd0\x11\x6f\x6e\xcc\xe0\x56\x48\xcb\x88\x3a\xbe\x22\x33\xc5\xa4\x26\x42\x03\x20\x0e\xca\x03\x00\x73\x06\x7a\xef\x38\x75\x5a\xa3\x18\x8a\x44\x4a\xf1\x43\xd7\xfa\xb9\x29\x02\x17\x02\xf4\xc4\xdc\xe3\xde\x6d\xa3\xdd\x00\xf4\xe5\x5f\x54\xf7\x8b\xfe\xb4\xe2\x42\xd3\x1a\x01\x1c\x5c\x03\x62\x32\x3f\x51\x48\x0d\x4d\xdc\x58\x37\xe6\xdb\x26\xae\x7c\xf7\x14\x5a\x7b\xc3\xbc\x13\xbd\x4b\xf5\xe8\xc5\x90\x99\xa1\xd5\x63\x68\xd0\x0e\x88\x83\x6b\xc0\x70\x91\x18\xfb\xf3\xdc\x9d\x9e\x70\xca\xe5\x97\x24\xb5\x86\x84\x7e\xb8\xdf\x57\x6f\xea\x39\x7a\x73\xad\x4f\x51\x64\x4c\xf0\x40\x7d\xc2\x20\x0e\xae\x81\xdb\x76\x3c\x2b\xdd\x1d\xf6\x41\x01\x9d\x0a\x4b\x94\x9a\xf4\xfa\xfc\x5a\xb7\xf2\x03\xd3\x82\x96\xaa\x2f\xec\x7d\x31\xae\x69\x85\xa6\xc1\x82\x38\xb8\x06\x1e\xeb\xd6\x8b\xef\xbd\xd4\xc6\x71\xb5\xf8\xd4\x71\xc9\xde\xf9\xbd\xe0\x2d\x29\x07\x62\xc1\xbc\x7b\x17\xae\x50\xa7\x7c\x7c\x45\x63\x0b\x7d\xa4\x01\x70\x50\x1e\x00\x99\x33\x1b\x1c\x72\xe6\x17\x78\x98\x45\x2d\x64\x95\xab\x78\xe5\xe8\x24\xf6\xce\xb1\x59\x43\x5c\x4e\x65\x96\xd6\x86\xe3\xaa\x5a\x98\x3f\xfe\x36\x67\xdc\xe2\x71\xcf\x5f\x36\x59\xfa\xf9\xf1\x56\x62\x70\xf7\xfd\x88\x5a\xd9\xf4\x78\x2e\xdf\xe1\x49\xfb\xc6\xfb\x46\xe4\xa8\xa3\xc1\xdf\xf7\x9c\x95\x98\xae\x84\x5c\x70\xa3\x5f\x1d\xa5\x53\x59\xdc\xb4\xe1\x24\x9b\xe2\x12\xd3\x24\x3c\xdc\x60\x5f\x97\xb7\x3c\x37\x75\x4d\x66\xf8\xbf\x66\xce\x40\x4b\xfb\xbb\xe7\x4c\x06\xe9\xa0\xdf\x86\x5d\xe1\xb4\x47\xb7\x83\xbc\xca\xe1\xfe\xb9\x30\x91\x2d\xc6\x3c\x25\xa1\x9a\x22\x6b\xc6\x2b\x9a\x3b\x33\xad\x1e\xb4\xcd\x67\x52\xd4\x41\x36\x67\xb9\x0c\x92\x3b\x92\xd6\x86\x79\x0d\x3b\x76\x7f\x24\x32\x62\xee\xf2\x69\x3d\x8b\xf8\x54\xf9\x32\x3c\xf6\x13\xb9\x2a\xaa\x34\x83\xcf\x99\x94\xb0\x44\x91\xfe\xec\x5e\x74\xde\x92\xba\x7b\xb6\xd8\x83\xb0\xa2\x6f\x47\x73\x6b\x1a\xaf\xd3\x2d\x24\x12\xdb\x15\xb5\xea\x65\x8c\x30\x51\x58\xa4\x23\xcf\x64\xb5\xc8\xe6\x8c\x26\x73\x6b\x59\xed\x69\x40\x24\xa6\x60\x33\xbd\x9d\x15\x2f\x51\x4a\x24\x7a\xfb\xe5\xc5\x40\x22\xca\xb1\xa7\x9a\x54\x06\x06\x65\x67\xb2\x5a\x27\xa4\x3f\xbb\xad\xea\x9e\xec\x4b\x3d\x7f\x2e\xbf\x89\xad\x83\xf7\x4f\x15\xfa\x8d\xf7\x62\xd4\x73\x57\xf2\x2e\x9d\xec\x7a\x28\xbd\xae\xb1\x3f\x83\x8b\x03\x74\xfe\xdf\x44\x74\x5a\x36\x6e\x9e\x6e\x1d\x6b\xb1\x7f\xdf\x16\x51\xb9\x61\x7f\x20\x9a\xae\xc6\x4e\x48\x91\x69\x96\x49\x39\x52\xa4\xc4\x7f\x9d\xc2\xb6\xcf\x11\x91\x85\x40\x1c\x3c\x1b\x1f\xd0\xa2\x53\x34\x2a\x54\x0b\x0f\x88\x33\x55\xcc\xbc\xff\x52\x2e\x2c\x11\x9d\x1c\x44\xac\x82\xba\xe7\x23\xed\x22\xfe\xc9\x05\x1a\xfd\x05\xe2\xe0\xd9\x58\xc9\x8b\xb1\xf4\x75\x76\x9d\x67\xfc\x28\x1d\xad\xb1\xab\x51\x62\x3f\xe3\xa0\xbe\x5e\x38\x8b\x09\x7a\xfc\xb7\x5f\x5b\xf9\x04\x50\x83\x14\x88\x83\x67\xe3\xeb\x7f\x68\x2b\xdf\xd4\x99\xbd\x5a\x52\x60\x1b\x2b\x50\x29\xe0\xd4\xba\x76\x97\xac\x55\xaf\xbe\xb3\x75\xf3\xb3\x7d\xde\xde\xd3\x2c\x68\x6a\x25\x80\x83\xff\x0e\xf1\x9d\x9b\x28\x38\xa6\xd7\xb5\xf6\x22\xd6\xaf\x6e\x61\xe9\xf9\xf4\x47\x4e\xb4\xad\xbc\x0b\x55\xbc\x4e\x38\xa9\x40\xed\x15\xc5\x86\x30\x67\x20\x0e\xea\x39\x93\xf9\xe7\x86\x0c\x7a\xa0\x4f\x93\x40\x8c\xf9\x47\x4f\x4e\xd1\x32\xbc\x8b\x12\x01\x17\x34\x5f\xc4\x69\x3c\x5c\x8e\xd6\xb9\xfa\xe6\xcb\xa7\x8f\x99\x32\xf8\x9c\x7c\xb3\xd0\x74\x32\x10\x87\x34\xa1\x8b\xd7\x50\x9c\xfb\xc3\x73\xf4\x08\x8c\x2c\x03\xbd\x8c\xec\xad\xc0\xbc\x8b\xf8\x49\x4b\xed\x98\xba\x7d\x0d\xa6\x28\x6e\xde\xeb\xd0\x84\x2e\x00\x07\x97\x40\x8c\xbe\x4e\x77\x27\x8e\x7c\xb9\x42\xb7\x5f\x73\x98\xa8\xd8\x03\xbe\x7e\x49\x32\xff\x57\x21\xf4\xbb\xf8\x18\xf7\x30\xb8\x2e\x43\x5f\x77\x41\x1c\x5c\x02\x1f\xfa\xfa\x8f\x8c\x0c\xcd\xf9\xda\x02\xef\xbc\xc3\x90\x3a\x20\xb5\x4f\x67\xa7\x0d\xea\x6d\xd1\x0a\x52\x30\x0b\xb8\xc9\x13\x66\x82\x88\x0b\xe2\xe0\xbf\x83\x7b\x5d\xd2\xf3\x16\xcb\xcc\xef\x6b\x1f\x71\x7f\x36\x2a\x52\x3d\xd7\xb8\xf4\x34\x79\x3c\x6a\x60\x7e\xf5\x7b\x7c\xd0\x14\xed\x4b\x52\xc4\x86\x0c\xe2\xa0\x5e\x13\x80\x39\x03\x65\xd7\x53\x0d\xba\x0f\xf1\xfa\xf0\x42\xf1\xcd\xed\x04\x8a\xc1\x90\x65\x45\xfa\xd6\xc7\x3b\x28\xbb\x9e\x44\xbb\xad\xec\x3d\xc2\xee\x49\xa3\xa8\x90\x41\x07\x70\xf0\xb5\xbf\x69\xbb\x73\x79\xf2\xe0\x18\x9f\xa5\x44\xb0\x8f\x2b\xc4\x33\xf0\xb9\x67\x12\x5a\x6e\xd2\x1b\x8f\x6e\xbf\xba\xe9\x42\xe5\x4c\x1f\x44\x5c\x10\x07\xd7\xc0\xe8\xf7\x0d\x5c\x77\x69\x9b\x17\xc1\xfa\xcb\xbb\x7d\x6f\x93\x88\x1e\x2b\x29\x28\x8d\x3d\xa5\x40\x67\x08\xc0\x74\x0f\x68\x0e\x87\x7a\x4d\x40\x1c\x5c\x03\x37\xad\xe2\xd9\x27\xac\x65\x2f\x1b\x5a\xe3\x3e\xe2\xd2\xbd\x3e\x78\xd2\x59\xf8\x66\x88\xe1\x01\xcf\xd8\x5b\x63\x6c\xe9\x99\x1e\x6d\x68\x5a\x23\x80\x83\xff\x0e\x3a\xb8\xa8\xdb\x41\x93\xb4\x9c\x34\xae\xef\x2c\x5f\xbf\x73\x9c\x90\x3e\xa8\xd0\x7d\xbd\x91\xf3\xde\xbb\x26\xed\x49\xce\x4a\xff\x06\x42\x03\x20\x0e\xea\x35\x11\xfd\xb7\x06\x40\x5b\xdd\x69\x1a\x70\x0a\x3f\x67\xc7\xf3\xca\x35\x43\xe1\x4d\xfe\x73\x69\xef\x4f\xef\xcc\x85\xe3\xde\x47\xf7\xac\x48\x4d\x12\x10\xaa\x75\x37\xfb\xa0\x23\xd6\x0e\xe2\xe0\x6b\xbf\xb7\x9a\x8e\xf1\xc1\x7f\x8b\x0f\x6d\x56\x29\x9d\xf3\x8a\xc8\xac\x84\x44\xca\x09\x6e\xf6\xb7\x3d\x4b\x5b\x3d\xdb\xdf\x21\x6d\xd0\x49\x74\x10\x07\xd7\x40\x75\xd4\x5e\xe3\xe5\xcd\xad\xf3\xdf\x1e\xd1\xa1\xf4\x4c\xb2\xb1\xd3\x67\x68\xdf\x30\x14\x91\x11\x74\xc3\x21\x56\x97\x89\xdc\x86\x4e\xa2\x83\x38\xb8\x06\xdc\x6a\x5f\x7e\x6b\x15\x79\x9d\x3f\x5e\x5f\x54\x9d\xbf\xf4\xf9\x45\xd4\xb8\xd6\x67\xb1\x89\x1f\x13\x78\xe7\x35\xbe\x69\xcd\x63\x1b\x20\xe2\x82\x38\xf8\xef\xf0\xc5\xde\x2c\xcd\x7e\xd0\x78\xcc\xe8\xae\x6c\xba\xcb\xd1\x0a\x89\x50\x32\x41\xfa\xcf\xe8\xf7\xb4\x93\xbe\x64\x66\x58\x3b\xf2\x5e\x08\x0d\x80\x38\x28\x0f\x00\xcc\x19\xe8\xbd\xe3\x34\x0d\xb4\x6d\x16\x30\xaa\x69\xe5\x0c\x7d\x24\xb9\x62\x22\xff\x72\x80\xc2\x59\x5e\x2a\xd0\xb9\x80\x9c\x8f\x79\xde\xd3\x88\x99\x83\x02\x6a\x41\x07\x71\xf0\xb5\x07\xf4\x44\x8e\xa9\xea\x8b\x29\x67\xd4\x70\x0a\x0f\x73\xdc\x95\xfc\xaa\xf1\xdb\x1d\x63\xea\x2b\x87\x93\x84\xc0\xf4\x9f\x01\xb1\x1f\x88\xb8\x20\x0e\xae\x81\xd4\x80\x47\xcf\x07\xa4\x84\xef\xb8\x85\x9d\xe3\xe1\xa0\x6e\xf7\x62\xcb\x75\x2e\x5b\x6e\xf7\x67\xd1\x9a\xf7\xad\xaf\xa3\x0c\x82\x3e\xa8\x81\x38\xb8\x06\x4c\x59\xba\x29\x06\xad\x5e\x05\x0c\xf4\xd7\x6f\xc8\x35\x12\xdc\x66\xc1\xc6\xa8\x78\x83\xea\x3b\x59\xd3\x42\xd2\xfd\xa4\xad\x32\x0a\x11\x17\xc4\xc1\x7f\x07\x74\x71\xdf\x81\xa7\x5e\xe8\x4f\xdb\xb3\x2f\xa3\x7b\x28\x58\x2a\x6a\xfa\x31\x5d\x3b\xf0\xa6\xd4\x46\xbb\xdd\x17\x45\x90\x72\x08\x55\xce\x40\x1c\x94\x07\x9c\x00\xe6\x6c\x47\x62\x82\x09\x2d\xcf\x20\x39\x24\xb8\xda\x88\xa6\x04\xf5\x6d\xc3\x8b\xf3\x2b\xfd\x83\x56\xe4\xf5\xcf\xaf\x9a\x68\x2b\x08\x88\xff\x6d\xce\xc4\x2b\x36\xd1\xd4\xf4\x93\x47\x2c\x6f\x72\x14\x91\xe0\xc5\x2e\xdc\xc8\xbc\x17\x6e\xb2\xe1\x3a\x16\xcc\xe1\x51\xf1\xd9\x9e\x98\xeb\x2f\xf4\xb8\x96\x5f\x96\xb8\xd7\xbc\xc4\xf2\x78\x50\x21\x67\xe4\x89\x3d\x41\x18\x3b\x56\xb9\xc2\x91\xc2\xcb\x3c\x4d\xaf\xfb\x7a\x22\x0f\xff\x6b\xe6\x0c\xb4\xb4\xbf\x7b\xce\x90\xcc\x99\x3d\xd9\xaa\xeb\xcf\xf8\x98\x23\x9a\x8f\x25\xc7\xec\xcd\x65\xb7\x39\x50\x77\xa9\x1c\xb5\xd9\xf3\xfa\x59\xba\x88\xdf\xa5\x66\xca\x9c\x49\x51\x07\xd9\x9c\xa5\x13\x96\x51\xab\x44\xcb\xae\xed\x5a\xe5\x92\x8c\x16\x16\x95\xd2\xbd\xa9\x88\x4e\x67\xed\x67\xc5\x96\xf5\xb6\x55\xb5\xb1\x77\x3d\x93\x12\x16\xb2\x39\x23\xc8\xdc\x33\xb7\xb8\x27\x6a\xa3\xb8\x40\x1e\xa4\xfd\xe1\x2b\xf1\xc3\x51\x2b\x47\x65\x37\xbf\x46\xf1\x41\x2e\x09\xe5\x17\xc2\x67\x53\xb0\x43\x36\x67\x8a\xd7\xea\x36\xe3\xf5\xcf\xed\xdf\x4b\x36\x6d\x44\xb3\xe8\x98\x3d\x76\x25\xfa\x76\x38\x6c\xf6\x92\x71\x3d\x13\xef\x05\x27\xf3\xc9\x99\xac\x16\xd9\x9c\x51\x92\x0f\x7a\xc9\xb7\x29\x4b\x1c\x6e\x28\x9a\xc8\x06\x19\xd1\x8d\x95\xc4\x72\xe2\x0e\xba\xf4\xad\x47\x3f\xbd\x96\x60\xb5\xed\x79\x66\xe6\x0c\x24\xa2\x53\x6f\x9f\xe5\x2f\x31\x2b\x21\x4f\xcf\xe5\x68\xf4\x3c\xd0\xcd\x62\xd0\xb7\x9f\x3a\xf0\xff\x7e\xb0\x19\xcd\xd8\x38\x37\x9d\xcd\xf9\x0b\x3a\x7e\x08\xe2\xe0\x59\x28\x76\xff\xed\x9c\x98\x7e\x04\xaf\x01\x66\xd9\xec\xf7\xcc\x31\x82\xc8\xc6\xe8\x80\x2d\xdc\xcb\x47\x71\xc1\xda\x13\xc2\x2c\xb9\x84\x88\xb8\x20\x0e\x9e\x8d\x53\x86\xf0\x71\x3d\xc8\x9b\xfd\x2f\xa8\x5a\x5d\xe1\xba\x4d\x53\x71\x7d\xdc\xa8\xf6\x80\xf6\xfa\x6f\xfb\x80\x7b\xea\x5f\x88\xf8\xa0\x41\x23\x20\x0e\x9e\x8d\x05\x50\xa5\x57\xb6\x38\xcb\xbc\x53\x5d\x3c\x56\x5e\xd1\xb7\x10\x74\x7b\xd6\x5f\x13\x7a\x19\x88\xcf\xed\x77\x4b\xe4\x46\x49\x6f\x1e\x22\x2e\x88\xf3\x97\x40\xc1\xfa\x9f\xcf\xb0\xc3\xca\x1d\x47\x1b\x05\xba\x56\xa6\x36\x96\xb1\xa6\xe1\x74\xba\xd1\x61\x56\xb1\x55\x16\xd2\x22\x71\x3b\x59\xd3\x2e\x05\x0b\x08\x73\x06\xe2\xa0\x9e\xb3\x7f\x9b\x33\xd0\x03\x7d\x9a\x04\x7e\x89\x12\x13\x33\x7e\x4e\xcb\xe9\x1c\x4f\x38\x8a\x1b\xde\xaf\x1c\x42\xcb\x7c\x7e\x53\xdd\x29\x3c\xdc\xa5\x38\x80\xee\x5e\x1f\x34\x36\x18\xc4\xc1\x25\x50\xb8\xce\xf9\x67\xac\xed\xbd\x8a\x93\x05\x51\xb8\xd2\x6d\x93\x62\xaf\x23\x66\xf5\x1f\x7a\x9f\xf2\x6b\x06\xb6\x97\x4e\xc8\x09\x64\xa1\x1e\x16\x00\x07\x97\xc0\x9e\x28\xbe\xa3\x88\x8a\x3f\x4d\xf0\xd6\x3c\x5f\x53\xcc\xe8\x79\x97\xeb\x5a\x19\x3f\x7e\x25\x09\x8a\x70\xea\xb8\x5a\x2e\x26\x41\xbd\x26\x20\x0e\x2e\x01\x0f\xcc\x88\xa5\x1e\x95\x71\x99\x71\xed\x17\xad\xd2\x5d\xde\xed\x5d\x3c\xbd\xf9\x52\x6a\x43\xac\x82\x91\x9e\x2d\xec\x43\xd1\xd0\x00\x13\x10\x07\x97\xc0\xe5\xfc\xcf\x3c\x3f\xc9\xbc\xf4\x77\x3b\xfb\x85\x59\xe5\x72\x0a\xfa\x25\x64\x24\x9a\x2d\xb0\x70\x2c\x2b\x5d\x0a\xf5\xb2\xf1\x86\x10\x1b\x32\x88\x83\x7a\x4d\x00\xe6\x0c\x94\x5d\x4f\xd3\x40\xde\x8f\x57\x74\xb3\x96\x2b\x68\x65\x6e\xfe\x05\xc3\x85\xa5\xcd\xda\x6a\xf9\x61\x97\x48\xc6\x06\xa3\xb7\x0a\x98\x86\x37\xb7\x58\x11\x6b\x07\x71\x70\x0d\xa8\x4e\x7e\x4f\x4b\xbd\x98\xd1\xab\x2b\xc0\x56\x2d\xc4\xe9\xc1\x24\x25\xee\x7a\x72\xa9\xe4\xcf\xb5\x9d\xf2\x73\xc7\xa6\xaf\x42\x33\x10\x71\x41\x1c\x52\xbf\xd1\xce\x03\x01\x9c\xea\x4b\xda\x6f\x6e\xdd\xdf\x4a\x64\x9b\x35\x43\x5b\xc8\xa0\xd2\x20\xd7\xe0\x50\xa8\x52\xe7\xe0\xe8\x28\xa5\x87\xfa\x8d\x00\x1c\x5c\x03\x0a\x1e\xaf\xab\x58\xc5\x53\x2d\x04\x1c\x3d\xec\x5c\x29\x5b\x85\x7c\x42\xb1\x6e\x59\xed\x5a\xb3\x97\xc4\x5c\xfc\xba\x57\xdf\x09\x5d\xc2\x0b\xe2\xe0\x1a\x50\x29\x76\xf8\x29\x88\x9f\x34\x7a\x33\xf2\xfc\x74\xf3\x88\x3d\xd5\x90\x6f\x28\x13\x99\x6b\x52\xe7\x2f\x7b\x94\x34\xe2\xeb\xb9\x90\x41\x07\x71\x50\xaf\x09\xc0\x9c\x81\xb6\xba\xd3\x34\x60\xe2\x4f\x44\x49\xc9\xbd\x68\x6f\xfd\xc0\x95\x80\xfe\xcb\xa2\xea\xc7\xc8\xc2\xc9\x2e\x92\x99\x7c\x06\xed\x87\x6a\xf3\x42\x7e\xce\x88\xb5\x83\x38\xb8\x06\x22\xef\x5a\xe4\xe6\x05\x75\xdd\x59\x7c\xaf\xbc\xea\x51\xa9\x2b\x11\x2c\xb3\xb3\x19\xc5\xc4\xfb\x64\x2d\x59\x9d\xe5\x59\xc0\xf1\x09\x22\x2e\x88\x83\x6b\xc0\x86\x00\xfb\x3a\x0f\x35\xdb\xec\x5e\x3b\xd7\x6f\x4a\x7c\x7f\x31\xcd\x42\x5f\x8b\xf4\xf0\xe8\xbb\xe4\xef\x56\xef\x67\x2a\x4e\xf1\x41\xc3\x2b\x00\x1c\x5c\x03\x31\x5f\x82\xbe\x5c\x0b\x11\x88\x6e\x50\x6c\x76\x8d\x13\xbb\xcc\x37\x75\x65\x66\x5e\x85\x74\xae\x7e\x82\x2e\xec\xd3\x15\x1f\x4f\xa8\xf7\x0e\xc4\xc1\x35\xf0\xa3\x7c\x98\x4e\xf2\x45\xb7\xd4\xea\xa5\xd0\x27\x5c\xe8\x9f\x52\x13\xd7\xc3\x13\x54\xc9\x67\x84\xac\x7f\xd6\x08\xdb\x6b\xbc\x81\xee\xba\x03\x71\x50\x1e\x00\x98\x33\xd0\x7b\xc7\x69\x1a\x78\x16\x5b\x22\xc5\x57\x86\x51\x88\x81\x73\xb7\x71\x4e\xc1\x29\xb7\x60\x82\x93\x7c\xcc\x96\x6b\x23\xb6\x84\xfb\x30\x72\x8e\x0a\x3a\xd6\x0b\xe2\xe0\x1a\x98\xa6\xbc\xf0\x34\xc7\x92\x41\x7c\xd3\x78\x48\xda\x85\xfb\xe4\xe2\xcc\x4a\x55\xbe\x8e\x45\xed\xec\xa8\xd8\x03\x89\x4f\xf8\x07\xd0\xb5\x07\x20\x0e\xae\x81\xcb\x8e\xd9\x4e\x76\x8b\x76\xf9\xb9\x86\x03\x8b\xe2\x03\x43\x1a\xbf\xf6\x9a\x32\xf6\x15\x2c\xc8\x59\x04\x06\xa3\xef\x55\xdb\x40\xd7\x93\x82\x38\xb8\x06\x82\xb1\xa8\x17\x9a\xa4\xe4\x85\x59\xe5\xf3\x37\x07\xd0\x0b\x99\x76\xbe\x50\x5e\x1e\xd4\x4f\x0a\x09\xaf\x60\x0b\x29\x32\x15\x85\x3e\x54\x80\x38\xb8\x06\x14\xce\x19\x6c\xc5\xca\xcd\x53\xd6\x5c\x2d\x92\x9e\x7f\x46\x26\x56\x1c\xfd\xb0\x84\x2a\x2b\xc1\x93\xea\x4b\x67\x81\xbf\xb8\x32\x0f\x42\x03\x20\x0e\xca\x03\x20\x73\x16\xbd\xd5\xad\x7e\x51\x0f\xe3\xb3\x3b\xb6\x78\x47\xf1\x5b\x31\xd4\x0e\xd5\x35\x7e\x6c\xd3\x35\x96\xfa\x61\xca\x16\xdb\x00\x1b\xc9\xbf\xcd\xd9\xcb\x64\x83\xfc\x85\x67\xb1\x35\xed\xc5\x63\x2b\x8f\xda\x23\x83\x86\xf7\x7d\xab\x9e\x0e\x66\x9b\x55\x08\x62\x8c\xde\x22\xd8\x60\xfb\x0b\xf5\xea\x1e\xa0\xd2\xc3\x90\x96\x48\x78\xe6\xf9\x3b\xe2\xca\xb7\x82\xf5\xe9\xef\x0e\x16\xa3\x53\x2e\xc9\x27\xee\xbb\x97\x85\xe6\x26\xfe\x6b\xe6\x0c\xb4\xb4\xbf\x7b\xce\x90\xcc\x99\xb8\x86\xb8\xbf\x25\xe9\x6a\x4e\x64\x12\x8b\xfd\x9e\x37\x5e\x4d\xa7\x14\xab\x64\x9b\xc4\xd5\x0c\x83\xba\x21\x32\x1f\xa5\xd1\xe3\x33\x29\xea\x70\x21\x57\xce\x24\x99\xb6\x7f\x8e\x4b\xf3\xd9\x24\x5d\x76\x1e\x7e\x5b\x12\xf8\x83\xdd\xfa\x2a\x11\x55\x4a\x1e\xc3\x23\x5f\x2b\x86\x73\x33\x67\x33\x24\x12\xd9\x9c\x51\xe8\xdd\xbd\x71\xd7\x4a\x9e\x69\xc4\x43\x30\x8b\xe5\x4a\xeb\xd7\xa5\xbb\x74\x64\x54\xba\xfb\xd8\xb9\xc1\x77\x32\x27\x8a\x94\x4d\xcf\x64\xb5\xda\x48\x7f\xf6\xb6\x1e\xa5\x4d\xd1\xd7\x99\xea\x9a\x0d\xff\x2b\xcd\x5e\xec\x6f\xda\xee\x8b\x91\x61\x7d\x59\x7e\xcb\x51\xc8\xac\x12\xda\xef\x37\x7f\x26\xab\x45\x36\x67\xcb\xb3\x57\xd9\xc6\x74\x84\x03\xa5\x42\x7b\xd6\x04\x3e\xb3\xbd\x16\xc6\x78\xf0\x05\x5f\x3d\x65\x94\xa1\x2d\x6a\x4a\xde\x74\xca\xee\xcc\xcc\x19\x48\x44\xa7\x65\x63\x96\x64\xbe\xbd\xd0\x01\x62\xe9\xca\xa9\xbc\x39\xa2\x67\x68\x07\x5a\x6a\x9d\x9a\x2d\xee\x5c\x4c\xea\xd1\xc6\x07\xc9\x9b\xe5\xea\x88\x2c\x04\xe2\xe0\xd9\x98\x2d\xce\x09\x23\xea\x2b\x3d\xce\x73\x7d\x51\x97\x79\x9b\xf3\xfa\xb6\x4e\x1e\x07\x7d\x8b\xfc\x04\x2d\x2c\x66\xc2\x64\xae\x3d\x2b\x88\xb8\x20\x0e\x9e\x8d\xbd\xb9\xbb\x42\x63\x7b\xaf\x8a\x7b\x5c\xed\xfd\x1c\x56\x7b\xf5\x0f\x13\x0e\x5a\x9e\x5a\x0c\x01\xb7\x89\xa1\x4f\x5e\xf8\x81\x14\x29\x22\x2e\x88\x83\x67\x63\xdb\x0b\x7d\x69\x0c\x2d\x04\xd1\xe5\xd3\x2e\x8b\xf6\x23\xb9\xd9\x99\xf2\x32\xa9\x0a\xa9\x37\xd7\x8c\xdf\x59\x7f\x33\x7a\x40\x02\x95\x63\x40\x9c\xbf\x04\x8a\xcf\xff\x94\x63\x6e\x7d\xbc\x3c\x99\x2e\xd2\x90\x78\x71\x24\x2a\x4c\xf1\x5a\x93\x99\xa7\x09\x2f\xdd\x89\x1c\x4a\xdb\xa1\xf2\x63\xbb\x00\xbc\x7a\x84\x39\x03\x71\x50\xcf\x19\xa0\x72\x06\x78\xa0\x4f\xed\x37\x7a\xfc\x54\x2a\xa0\xf9\xe8\x5c\x2f\x53\x86\xee\x4f\x0e\xb7\xb0\x99\x98\xf6\x73\x8f\x2f\xd7\xe0\xa8\xf9\xe5\x11\x5e\x7f\x4c\x09\x15\x39\x41\x1c\x52\xd1\xf0\xbb\xdd\x5b\x62\xb9\x9a\xed\x85\xd0\x7b\xea\x07\xc7\x39\xa4\xaa\x3a\x58\x7f\xf0\xa4\x0c\xcf\xd3\x15\x27\x08\xe9\xce\xe5\x0a\x22\xe2\x82\x38\xb8\x04\x74\x88\xd4\x65\x06\x09\xba\x99\xcd\xc6\xa2\x24\x6e\x93\x26\xf9\x77\x6d\x19\x65\xff\x8a\xcb\x8a\xad\x9d\x3f\xc1\x26\x99\xd6\x91\x81\xbe\x27\x00\x38\xb8\x04\x3a\x6d\x2f\x7a\x7d\xb3\x7b\xf3\xa3\xbc\x43\x55\x6d\x31\xee\x3d\x1f\xf3\xb8\x6e\x33\xed\xe0\xf2\x57\x15\x14\xee\x0e\x12\xba\x64\x68\x42\x17\x88\x83\x4b\x00\xad\x76\x8c\x34\xee\xb2\xba\xe8\x79\x53\x17\x07\x54\x3a\x0f\x05\x9f\x64\x45\x0d\xbb\xae\x47\x0f\x7e\x45\x53\xec\x37\xfe\xc0\xf8\x80\xd8\x90\x41\x1c\xd4\x6b\xc2\x05\xb8\x84\x1a\x90\x5d\x4f\xd3\x00\x9f\xa8\xe8\x98\x1f\x2e\x5e\x78\xdf\xa2\x7d\xf4\xdd\x38\x73\x3b\x5f\x2d\x02\x46\x3c\x7d\x73\x62\x62\x1f\x33\x86\x0e\x53\x82\x57\x88\xb5\x83\x38\xb8\x06\x92\x4d\x95\x2f\xe7\x90\x59\xc4\x3d\xfa\xb9\xd6\x97\xe9\x6a\x50\x39\xac\x36\x56\x1a\x77\xaf\x49\x70\xf8\x97\x7c\xb2\x1a\xaa\x7d\x22\x22\x2e\x88\x83\x6b\x60\xf3\xa6\xd4\x8b\x6f\x73\xac\x8f\xdb\x2e\x79\xb6\x25\x55\x4f\x3d\xfb\xd0\x10\x6e\x35\x29\x95\x38\x38\x5d\x6c\x15\xa8\x73\xf7\x69\x1c\x22\x2e\x88\x83\x6b\xe0\xad\xa2\x45\x06\x73\xf8\x47\xcc\xb1\x2f\x52\x05\x3a\x52\x6f\xd7\xf9\xc3\x53\x67\xeb\x0c\xda\xb5\x6f\x48\x5b\x59\xee\x65\xe2\x42\xdf\xaa\x40\x1c\x5c\x03\x62\xdd\xf2\x9e\x64\xbb\x2a\x63\xc7\x71\x4c\x6b\xb8\x9b\xf2\xf7\x98\x54\x6d\x45\x89\x08\xe7\x36\x77\x31\xb5\xd4\x1d\x95\x57\x1e\x43\x83\x00\x00\x1c\xd4\x6b\x02\x30\x67\xa0\xad\xee\xd4\x43\x14\x46\xf7\x56\x64\xe4\x99\x24\xf3\xa5\x57\x1f\xf1\x1b\xf0\xd0\x07\x8d\x3c\xda\x1b\xbd\x36\x59\x23\x87\xc5\x18\xa3\x20\x88\xcd\x0e\x1d\xa2\x00\x70\x70\x0d\x4c\xea\x4b\x9b\x66\xd3\xb6\x78\xc9\xbb\x17\x74\x4b\xa2\x8a\xdc\xc5\x08\x55\xb2\x76\x9a\x9b\xcc\xf0\x3f\xd6\x88\x4f\xc8\x26\x0b\x40\xc4\x05\x71\x70\x0d\xa8\x33\xfa\x99\x3a\xa7\xb4\x8e\xd2\x7b\xee\x27\x6d\x49\xd2\x5d\x44\x4b\xc7\x12\xb4\xf8\xd8\x30\x46\x77\xc4\x5b\x67\x98\x98\xc1\x89\x88\x0b\xe2\xe0\x1a\x78\x42\x79\x2f\xa2\x9c\x7d\xd1\xa8\xf7\xe3\xc2\xdb\x61\xac\xce\x1b\x33\x18\x01\x86\xce\x7d\x5d\xe3\x9b\xde\xc4\x66\xf1\xf6\xcc\x18\x88\xb8\x20\x0e\xae\x81\x4b\x89\xbe\x5a\xc5\xbc\xf9\xca\xe5\x71\xdb\xf8\xe7\x1e\x8e\xd2\xad\x5f\x38\xc4\xaf\x24\x53\xbe\xe5\xff\xb5\x98\xd3\xbf\xec\x35\x64\xce\x40\x1c\x94\x07\xb4\xff\xad\x01\xd0\x7b\xc7\x69\x1a\xa0\xce\x64\x3f\x66\xfa\xd0\x24\x7a\xbd\x72\x8c\x56\xea\xfc\x3b\x11\xe3\xe3\x3e\x91\x88\xfb\xf8\x4a\xa1\x46\xf7\x73\x49\xec\x5c\xa1\x91\xf7\x20\x0e\xae\x81\x3a\x1d\xa3\x52\xef\xfe\x6f\x36\xbd\x1f\x87\x73\xac\xdd\xb1\xbb\xc7\xc8\x85\xd3\x6c\xcc\xa9\x2e\x6a\x3f\x16\x2f\xb1\x42\x5b\xda\x41\xc4\x05\x71\x70\x0d\x1c\xa4\x5a\xe4\xe9\xb9\x6a\x88\x3c\xca\xde\x23\x56\x48\x4a\x95\x59\x8c\x6c\x95\x22\x56\xa1\x1e\xa6\x3a\xb4\xc8\xeb\xc3\x56\x90\x87\x0e\xe8\x00\x38\xb8\x06\x76\xda\x06\x6c\x7a\xb3\xd5\xbd\x4b\x45\xa7\x37\x4b\xc5\xc2\x8d\xec\x55\xbb\x0b\x03\x71\x83\xfc\x66\x7b\x4a\xb7\x54\x97\x84\xbb\x10\x71\x41\x1c\x5c\x03\x4f\xf7\xfb\x4d\x4d\x5f\x4e\x65\x49\x15\xd4\x86\xe8\x2e\xd6\x14\x6a\xca\xf7\x7e\xcd\x68\xbb\x27\x70\xdc\xe7\x5d\xe0\x6c\xc2\x08\x5d\xa9\x01\xe2\xa0\x3c\x00\x32\x67\x97\xc8\x47\x4e\x9c\x0d\xf6\x2d\xc8\x05\xbc\xbc\x3b\xbf\xb9\x69\x65\x6c\x2e\x76\xb8\xa2\x0b\x16\xef\x7a\x5e\x4d\x62\xff\xc6\x57\xf7\x3f\x95\xb3\xcf\xe4\xd4\xe7\xaf\x97\x65\x5f\x4b\x27\x18\x4b\xd2\xe8\xc1\x1f\xee\xc6\x0b\xe8\xc7\x56\x21\xc9\x14\x28\x13\xf0\xf6\x93\x71\xf9\x0b\xfd\xfa\xd3\x77\x46\xb6\xbc\x2e\x9e\xcc\xd0\x8d\xa2\x1c\x37\xfc\x06\x13\xa7\x68\x85\x54\xfb\xd7\xab\xba\xc9\x26\xc5\xb9\x22\xba\x44\xff\x35\x73\x06\x5a\xda\xdf\x3d\x67\x48\xe6\x8c\xfa\xe9\x4b\xad\x05\xa7\xce\xcc\xd7\x9d\x93\x91\xae\xc4\x5c\x0f\x5f\x8b\xad\x31\xef\xfe\xfa\xf0\xc1\x4a\xeb\xfb\x45\xc2\x77\x77\xce\xe4\x0a\x2e\x71\x64\x73\xc6\x44\x37\xa6\x4d\xdf\x65\x5c\xb6\xae\x95\xf0\xf9\x9c\x47\x59\xb2\x63\xa6\xeb\x1b\x0b\x2c\x7d\x0f\xe6\x1a\x33\x7c\x87\xae\xb6\xed\x33\x29\x61\x21\x9b\xb3\x08\xac\x37\x46\x4f\x8c\x6f\x15\xf4\x1a\x7e\xd8\xbf\x80\x61\x6a\xce\xe0\x18\xc0\x7a\xb4\x73\x2f\x29\xd9\x96\xbf\xbb\x9a\xd2\x68\xe0\x4c\x56\x8b\x6c\xce\x72\x47\x26\xf0\x05\xd1\xae\xc6\x71\x67\xd5\xb8\x13\xcf\x46\xdf\xd9\xdd\x36\x55\xf5\x7c\x93\x26\x3a\x4b\x7f\x38\xa4\xd8\x3c\xb0\x72\x26\xab\x45\x36\x67\xad\x56\x4a\x31\x7c\x71\x9c\xf4\x4e\x0b\x66\x13\x57\x27\x5f\xd4\xf0\x7c\xc6\x79\xbd\x35\x92\x99\xd3\xb8\x49\xf6\x15\xf3\xb6\x44\xdf\x99\x99\x33\x90\x88\x4e\xcb\xc6\x9a\xdf\x9b\xe3\x9a\x99\xf0\xbe\xbf\x3a\xae\xac\x4f\xf4\xad\x9d\xd7\x15\xcb\xe7\x5b\x71\x9b\x39\x30\x57\x58\xaa\x3c\x7f\x4c\x05\x5d\x72\x05\xe2\xe0\xd9\xb8\xe7\xa5\x29\xf5\x5e\x91\x8e\xf6\xbb\x4c\x94\x51\xd5\xc2\xc2\x51\xf7\x19\xeb\xec\x40\xea\xdf\x28\xf9\xaf\xd5\x45\x7d\x35\xfb\xa1\x46\x03\x10\x87\xd4\x05\x5e\x19\x8d\x1d\xd8\x2e\x1b\xc8\x24\x26\x89\x11\xc9\xbc\x68\x5c\xbe\xd2\xb9\xf0\x6c\x85\xfc\x84\xe4\x83\xec\xaa\xf7\x50\x18\x34\x47\x1d\xc4\x21\x99\xa8\x31\x62\x5e\x4f\x6a\x1d\xb6\x93\x31\x5c\x13\x16\xb3\xa7\xf8\x97\x28\xb4\x8b\xa2\x1c\xd2\xdf\x77\xaa\x68\x4f\x6f\xec\xec\x42\x67\xfb\x40\x9c\xbf\x04\xd6\xff\xfc\x0e\xc6\x47\x3e\x91\xc3\xea\xc6\x62\xfc\x45\x83\xb3\x65\x6b\xa9\x4e\xa6\xbe\xe9\xb5\xb2\x49\x5f\x08\x37\x9c\x3e\x8d\xbd\x15\x3c\xbe\x8c\x30\x67\x20\x0e\xea\x39\xfb\xb7\x39\x03\x3d\xd0\xa7\x5e\x3c\xba\xf0\x40\x79\xe3\x28\xfa\xc7\x3c\x2f\xc1\x89\x14\x11\x6a\x14\xda\x2e\x27\xc5\x30\xed\x5e\x3e\x41\xae\x6a\xfc\xcd\x2a\x73\xe8\xa4\x28\x88\x43\x1a\x06\xb1\xb4\xa3\xcb\xd7\x1a\x61\x17\x93\xc5\xd1\x25\x3c\x32\xc4\x33\x78\x99\x6b\x73\x35\x51\x6a\x43\x59\x08\xb5\x69\x53\x80\xf8\x13\x34\x0c\x02\xc0\x21\x9d\x6c\x5d\x27\x6c\x2c\xd7\xed\x67\xe0\xbc\x45\x87\x9e\xc8\x58\x63\x25\xba\x12\x2b\xe6\xb7\xf1\x04\xcb\xea\x03\xbf\x18\x3e\x15\xbe\x0b\x74\xb2\x15\xc0\xc1\x25\xc0\x30\xb8\x1f\x2b\x24\x62\x93\x4a\x1f\x42\x25\x33\x8a\x1b\x2b\x5f\x32\x5e\xae\xa5\x39\x91\xf6\xa0\xb4\x86\xf5\x79\xf2\x47\x1d\x5b\x44\x5c\x10\x07\x97\x40\xa7\x77\xb9\xd0\x53\x6f\xa9\xe9\xfe\x2b\x1d\x59\xea\x3f\xee\x5c\x42\x39\xff\x21\x4f\x8b\xc3\xd8\x93\x29\x94\x91\xdf\x36\x49\x22\x0d\xb1\x21\x83\x38\xa8\xd7\x04\x60\xce\x40\xd9\xf5\xd4\x34\xc0\xdc\xb1\xfb\xfb\x26\xcf\xc9\x9c\x25\xe9\xb5\xea\x17\x72\xbb\x26\x45\xf3\x2b\xd4\x31\x2c\x73\x12\x1f\x7e\x5a\x36\xb9\xec\x3c\x82\xd2\x00\x80\x83\x6b\xa0\x5f\x9c\xaf\xd2\xcf\xc4\x2b\x1a\x35\xe6\x71\xb7\xe7\x91\xc0\x8d\xe2\x55\x1b\x34\x21\xbb\xd9\x50\xab\x8f\x28\x3f\x64\x2f\xcf\xae\x42\x93\x35\x01\x1c\x5c\x03\x66\x97\x6d\xeb\xbd\xee\x58\xf6\xdc\xab\x0a\x36\x6a\x19\x8b\x12\x93\x7d\x7e\xa1\xf9\x56\xe9\xce\x84\xe0\x46\x50\xfa\x5c\xfd\x0a\x54\xe9\x03\x71\x70\x0d\x90\x08\xbc\xf0\xb2\xa6\xa3\xf7\x41\x3f\x51\xe2\xac\xf8\x3d\x82\x17\xa7\xae\x71\xa3\xfe\x80\xf5\xb9\x2a\x53\x15\x95\x65\x93\x3c\xf4\xc5\x1c\xc4\xc1\x35\xe0\x2e\x86\xe3\xb4\xfc\x79\xae\xde\x99\x93\xa5\xfb\x11\x9e\xff\x25\xfd\x8b\x3c\x51\xeb\xf2\x0b\xa4\xca\x77\xbb\x2a\x07\x8b\xf6\xbb\xa1\xa3\xad\x00\x0e\xea\x35\x01\x98\x33\xd0\x56\x77\x9a\x06\x08\x85\x35\xcd\x7c\x6e\xa8\x7e\x70\x5a\xc6\xb4\x8a\x5d\x74\xe0\xf9\x54\x9b\xbf\xf4\x4a\x47\xe6\x84\x56\x90\xad\x5a\x96\xaa\xd0\x1b\xb1\x76\x10\x07\xd7\x80\xfd\xec\x00\x4b\xeb\x70\xa0\x98\x0b\x61\xd8\xfe\xc5\xd9\xd1\xe7\x49\x7b\x46\x9c\x07\xf1\xbc\x28\x01\xca\x89\x7a\xd7\x66\xe2\x32\x11\x71\x41\x1c\x5c\x03\xaa\x41\x84\x3d\x0f\xc9\x30\x1b\x1b\x53\xd8\xb4\x97\xba\xa7\x9e\xcc\xcb\xa5\x52\x58\xa3\xfd\x98\x6c\x28\x11\x7b\xdc\x65\xde\x07\x0d\x99\x00\x71\x70\x0d\xe0\xa0\x54\x16\xfe\xa9\x7f\x2e\x93\x44\x17\xa1\x3b\xfa\xc9\xb0\x41\xba\xeb\xbe\x85\xd0\x56\xca\x2f\xf3\x78\x27\xee\x71\x56\xec\x56\x68\x78\x05\x80\x83\x6b\x80\xb8\x3d\x34\xa2\x42\x68\xd3\xfe\xf0\x91\x1f\x69\xda\x40\xee\x4c\x1e\xeb\x2f\xed\xf5\x85\xcd\x8e\xdd\x1b\xcb\x9c\xb3\x1f\x22\x20\x0d\x80\x38\x28\x0f\x00\xcc\x19\xe8\xbd\xe3\x34\x0d\xdc\xb1\xfd\xe5\xca\x63\x5e\x67\x73\x32\x5a\x14\xc6\x29\x44\x35\x17\x13\xaa\x11\xbb\x22\x78\x7d\xe5\xf0\xf0\x3c\x1d\xdb\x48\x33\x74\x14\x1d\xc4\xc1\x35\x40\xa5\x52\x8b\x92\x7d\x95\x8d\xf0\x70\x75\xf9\x91\x6d\xae\x88\xf5\xb9\x1a\xf6\x2b\x33\x63\x18\x94\x65\xc4\xcd\x55\xeb\x3d\xba\x96\x88\xb8\x20\x0e\xae\x01\xd2\x93\x3e\xe1\xcb\xd9\xc7\x13\xfa\x4a\xfe\x93\x47\xd1\xef\x54\x8a\xf4\xd9\xc2\x6a\x49\xf1\x45\xd4\x18\x18\xb8\x08\x2f\x60\x4f\x43\x73\xc7\x00\x1c\x5c\x03\xd1\x77\x12\x58\x36\xc8\xcd\x02\x28\xd3\x9b\xee\x4b\x69\xde\x7f\xcb\xc3\xa5\xe1\xb6\x7e\xbe\x6e\xec\x85\xdd\x4b\xed\xfb\x28\x78\xd0\x10\x6b\x10\x07\xd7\x00\xde\xfe\xdb\x69\x0b\xf5\xa6\xca\x6b\xa5\xcc\x2e\x65\xed\xe8\xbc\x4d\xfd\x1a\x29\x31\x0f\xac\xf5\x82\x45\x6e\xd9\x85\x1e\x52\x43\xa3\xf4\x41\x1c\x94\x07\x40\xe6\x0c\xfb\xc4\x80\xfc\x6e\xc3\xcb\xba\xfe\xc7\x68\x5f\x93\x97\xba\xba\x9d\x0d\x9b\x30\xd4\x97\xab\xef\xe6\x39\x36\x77\x61\x16\x34\x94\xfe\x6d\xce\xec\xfd\xa8\x6f\x55\xd1\x6c\x12\xb5\x78\xcb\x6c\x9c\x23\x8d\xd2\xed\x90\xeb\xed\x21\x68\xbd\xaa\x14\x62\xff\x27\x7e\x33\x82\xe9\xdc\xdf\x1f\xdd\x68\xc9\xfb\xd5\xf3\x9a\x08\x88\x31\x3a\x8a\x84\x9b\xb7\x47\x37\xab\x2f\x26\xf4\x95\x84\x5e\xbe\x22\xec\x46\x4e\xa2\xf4\x00\xef\xbf\x66\xce\x40\x4b\xfb\xbb\xe7\x4c\x16\xfe\x02\xdf\xdf\xf0\xce\x82\xab\xda\x7b\x49\x81\x9d\x7e\x3f\xbf\x80\x12\x7d\xa6\xde\x3a\xa6\x5d\x7d\xf3\x79\x90\xd8\x21\xc7\x3d\x87\x71\x81\x33\x29\xea\x20\x9b\xb3\xf3\x37\xf9\x3a\xee\x13\x53\x0f\xdb\x90\x7f\xe6\xf2\xc8\x2e\x1f\x5c\xe9\xa1\x5b\xf8\x65\x9d\x96\x71\xff\x41\x6b\xc1\xaa\xdd\xaa\xd9\x99\x94\xb0\xc4\x90\x67\xda\x5b\x62\x4c\x36\xc8\x4a\x5d\xd4\xd8\xc9\xae\x4c\x7e\xbf\x5e\xd7\x1a\x33\xbd\xa5\xf6\x53\xfd\x36\xf3\xc9\x44\xf0\x9f\x9a\x08\xb1\x33\x59\x2d\xb2\x39\xb3\x7f\x28\xf8\x68\x57\x72\x65\x65\xd4\x2a\x87\x8a\x4b\x82\x02\x6f\x7a\xae\x8a\xed\x16\x2f\xae\xbe\xc9\x10\x21\xca\x51\xd6\xc6\xe2\x99\xac\xd6\x19\xe9\xcf\x6e\x0e\xff\xc8\xdc\xb4\x1e\x46\xb3\x4e\xe7\xe4\x16\xd3\x1a\x1a\x8d\xb5\x67\xf1\x6d\x65\x08\xaa\x5d\x9e\xbc\x35\x44\xb3\x3f\x3d\x7a\x66\xe6\x0c\x24\xa2\xd3\xb2\xf1\x9e\x93\xc4\xc3\xa7\x45\x82\xe3\xb7\x50\x9c\xf6\xe7\xa3\x85\xce\x5b\x4b\x1f\xde\x5c\xb6\x29\xe4\x72\x1f\x9e\xdb\xd4\x7f\x7b\x04\x7d\x7a\x02\x71\xf0\x6c\x7c\x29\x47\x78\xd8\x4b\x41\xa8\xc8\xfa\xfb\x5a\xdb\x95\x87\x99\x56\xe2\xdd\x46\x1c\x5e\x6f\x9c\x18\x3c\xf6\x48\xc9\x16\x5d\x53\xa0\x99\xd4\x20\x0e\xa9\x0b\x7c\x9f\xbc\x37\x73\xda\xef\x06\x2f\x2f\xd1\xec\xaf\x0c\x46\xf7\x19\xbe\x95\xcb\x94\xe1\xe2\x4a\x9c\x7e\x3d\x2a\xb7\x7e\x85\x40\x65\x13\x10\x07\xcf\xc6\x2d\x23\xaa\xe3\x59\xd8\xb6\x9b\xb7\x98\x6d\x83\xd2\x8f\x06\xdf\x17\x64\xd5\x15\xb2\xed\xc9\x1d\x3c\x60\xf8\x81\x4d\x7b\x28\x09\x4d\x02\x00\x71\xfe\x12\xe2\xff\xf3\x3b\xf8\x7b\xd8\x7f\xbc\x2a\xff\xf9\x41\x66\xf3\xc0\xc4\x3d\xec\x04\x2d\xe1\x0d\x21\x85\xb8\x0b\x75\xf4\x0e\xd6\xbe\x57\x67\x7f\x4f\x51\x22\xcc\x19\x88\x83\x7a\xce\x64\xff\x7d\xc7\x15\xe0\x81\x3e\x4d\x02\xaa\xa2\x81\x99\xee\x91\xcf\x52\x27\x9c\x8e\x8f\x71\xaf\xe5\xb4\xdc\xbe\x24\x31\x39\xfa\x27\x3a\xfa\x7a\x2c\x76\x19\x1f\xc1\x9b\x79\xe8\x25\x07\xc0\xc1\x25\xc0\xac\x4f\x98\xff\xce\x48\xa8\xe2\xd6\xb0\x93\x33\x1d\xc1\x57\xb9\xb0\x95\x39\x71\x26\x2e\xba\xd5\xc2\xad\xa5\xb2\xc6\xa0\x4d\x68\xea\x19\x88\x83\x4b\x60\xa2\xef\x89\xd0\xb9\x49\xa9\x21\xd6\x07\xb7\x14\xf8\x67\x89\x9b\xbe\xb7\xf3\xb0\xdb\x05\x16\xc5\x11\xc7\xe2\x9d\x8c\x14\x4b\x62\x22\xe2\x82\x38\xb8\x04\x0e\xa7\x8a\x6c\xc9\x8b\xe4\x1f\x63\x48\x61\x6b\x32\x4f\x0e\x34\x55\x84\xe5\x17\xe5\x7e\xc4\xb0\x5e\xb5\xd5\x98\x76\xb3\xc0\xc9\xfb\xbf\x81\x08\xff\xe6\xe0\x12\x60\x92\xd3\x41\x0f\xb7\x6b\x91\x2c\x4d\xf9\x52\x57\x6c\xa6\xdf\xb3\x6f\x42\x83\x23\x4c\x5c\xe0\x50\x9a\xe8\xc0\x8c\x6d\x64\x93\x88\xd8\x90\x41\x1c\xd4\x6b\x02\x30\x67\xa0\xec\x7a\x9a\x06\x3e\x5b\xbe\xe6\x1d\xd6\xf3\xfc\xa5\x76\xb3\x42\x70\x2f\xfe\x37\x6e\x76\x7c\xd7\xee\xfd\xe6\xe5\xed\x6b\x4d\x13\xd2\xf1\x73\x56\xbf\x10\x6b\x07\x71\x70\x0d\x2c\x15\x8e\x45\x06\x7e\x2f\x4b\x10\x8a\x1b\xe2\xcc\x41\x1d\xc2\x0e\xc5\xa0\xa1\xf0\xf3\x27\x8c\x76\x2e\x6a\x8b\x7a\xa9\xfd\x14\x1a\x30\x00\xe2\x90\xee\xb8\x32\x99\xe0\x5f\xe8\x1c\xcf\x19\x53\xe2\x30\x1a\xbd\xde\x36\xcd\x84\x8a\x9d\xa6\xbe\xc3\x2b\x6c\x4b\x6e\x77\xf1\x20\x1f\xf3\x35\x22\x2e\x88\x83\x6b\xe0\xa4\x58\xff\xd6\xcc\x84\x73\x34\x2a\x0d\x7b\x80\xe0\xda\x27\x61\xea\xcb\xf9\xf9\x34\x04\xe4\x06\xf8\xda\x03\x04\x66\xb5\xa8\x1d\x88\xb8\x20\x0e\xae\x01\x85\x5e\x1d\x5e\xc6\xd4\xcd\x84\xb4\x85\x5d\x02\xa9\x16\xcc\x56\x81\xcf\xdf\xd1\x16\x66\x99\xb1\xf8\x09\xb1\x50\x9e\x3e\x56\x84\xee\x39\x03\x71\x50\xaf\x89\xd8\xbf\x35\x00\xda\xea\x4e\xd3\xc0\x7d\xcc\x1d\xee\xf3\xa1\x64\xa5\x0f\x2a\x55\xa3\xc5\x1c\x4c\xbd\x6b\xd5\x1d\x6c\xfb\xe8\x25\x84\x26\xf5\xb6\x82\x3a\xde\x9d\x87\x06\x82\x80\x38\xa4\xa9\xad\x98\xef\x07\x4c\xd2\x9a\x6d\xd1\x51\x5e\x38\x14\x49\x91\x87\x37\x9d\x63\x29\x55\x34\xb8\xf8\x24\x2e\xcb\x76\xfc\x9d\xca\x5d\x31\x44\x5c\x10\x87\x34\x46\x5d\x26\x25\x64\x34\x8c\x97\xe5\xb6\x7c\x8b\xac\x65\x85\xba\x67\x05\x87\x35\xbf\x41\x0c\xc3\xa7\xc3\xcf\xca\xa8\x8f\xdd\xeb\xa0\xf1\xec\x20\x0e\xae\x81\x85\x23\xc5\x8d\x56\x33\x1c\xcc\x25\x2e\x63\x6e\x26\xe6\xe0\x92\x84\xca\xae\x9d\xbd\x9d\xdb\x9c\x8e\xbc\x03\x54\x57\x96\x8b\xa1\xef\x74\x20\x0e\xae\x01\x5c\x8c\x15\xfd\xb5\x60\x1d\x0d\x63\xa6\xba\x34\xa5\xf2\x2b\x57\x89\xe3\x6b\x59\x86\x84\xbb\xca\x92\xb4\x31\x18\xb9\x2b\x03\x4e\x10\x1a\x00\x71\x50\x1e\x00\x98\x33\xd0\x7b\xc7\x69\x1a\xa8\xbe\xa8\x44\xe9\x12\xe2\xf0\x32\x65\x64\x76\x2b\xb5\x24\xee\xfd\xe4\xd2\x7a\x56\x4b\xfb\x37\xb5\xcf\x6f\x30\xb8\xd4\x0a\x65\xcd\xa1\x3e\x3e\x00\x07\xd7\x00\x16\x05\x1b\xad\x42\xb5\xdd\xc1\xb9\x6c\xbb\xd2\x1a\x0e\xe9\x6f\xe2\x8f\xbe\xdb\xa2\x7a\x27\x95\xe8\x34\x15\x74\xa2\x46\xf6\x40\x53\x15\x41\x1c\x5c\x03\xef\x72\x75\xbc\x66\x43\xb4\x2c\xbb\xeb\x6c\x4d\x0f\x58\x0e\x51\xec\xcd\xce\xd7\x7f\xb8\xca\x17\x93\xd5\x91\xa0\xe2\xb0\x29\x9e\x8e\x88\x0b\xe2\xe0\x1a\x70\xf9\xb4\x46\xf8\x19\x1f\x47\xba\x43\x61\x48\x83\x00\x97\xc1\xb3\x41\xb1\xbb\xb1\x5b\x1e\x9f\x8a\x11\xb7\xf9\x0f\x35\x16\xcf\x16\x22\x2e\x88\x83\x6b\x60\x2a\x5a\x83\x4d\x5a\x51\x0b\xb5\x42\x63\x23\x95\xfc\x72\x94\x0c\xb7\x48\x23\x43\xce\x27\x34\x1b\x69\xaa\x20\xd4\xd2\xfb\x5d\xba\x08\x0d\x80\x38\x28\x0f\x38\x03\xcc\x19\x07\x6a\x9c\xf4\xcf\x13\x8e\x3a\x5e\xf3\xe8\xf9\x56\x93\xae\xac\xb0\x9f\x2d\x95\x62\x73\x23\x0e\xb2\xcc\xd4\x82\x9a\xf1\x33\xb7\xfe\x36\x67\xd5\x0d\x03\x85\x45\x23\x24\x75\x4d\xf2\x3f\x6d\x6a\x13\x14\xaf\x58\xa4\xb3\x37\x25\xfa\x2d\x8c\x6d\xa9\x7c\xf1\x71\x71\xcc\xfc\xdb\x84\xdc\xd4\xfb\x9a\x54\x1d\x41\x20\xfa\x21\x4e\x80\x3b\xa2\x45\x66\x8f\x7f\x58\x69\x41\xf7\x44\x62\xf4\x58\x75\x5f\xfe\x49\xfa\x1c\xff\x7f\xcd\x9c\x81\x96\xf6\x77\xcf\x19\x92\x39\x2b\x69\x16\xbd\x47\xad\x60\x48\xdd\xad\xfb\xab\xd2\x6e\x18\xc7\xcb\xfd\x2e\x3e\xf9\xee\x3e\xb7\xeb\x8f\xe7\x22\xb4\xe7\x89\x4a\xcf\xe4\x0a\xae\x16\x64\x73\xd6\xa1\x1c\x37\x7a\x48\x36\x2f\x68\x8c\xea\x4d\x7f\x12\x18\xcf\xc2\xb1\xed\x43\x34\x38\x30\x3a\x91\x23\x6c\xc1\x13\xf3\x82\xfd\x0c\xda\xa1\xc2\x25\xc5\x91\xcd\x99\x85\x15\x21\x5e\xdc\xf4\x79\xec\xf6\x46\x02\x0a\xdf\xdf\x97\x27\x9c\xf2\x6e\x5f\xbf\xe8\xdb\xd8\xec\x18\x80\x71\xbb\xe7\x6d\xce\xf0\x99\xac\x16\xd9\x9c\x7d\x2d\xee\xbd\x9e\x10\x12\x2a\x4a\xae\xcc\x76\x8d\x48\x98\x59\x8b\x54\xbf\x58\x56\xa1\x62\xd3\x72\xd9\x47\x5f\x63\xcd\xaf\x47\xe2\x4c\x56\x8b\x6c\xce\x4e\x98\xc3\xdc\x03\x2d\x6d\x5d\xaa\xde\xe7\x2b\x0c\x19\xcd\xff\xe1\x57\xdf\x94\x70\x7b\xaa\xb4\x58\x67\xce\xba\x28\xce\x7a\xee\x0c\xa6\xae\xe8\xfc\xbf\x89\xe8\xb4\x6c\xec\xbe\x7f\x20\x4e\x9e\xb8\x9f\x67\x4b\xee\x2c\xd1\x93\xfc\xe8\xc3\x8c\x64\x65\xc3\x64\x60\xc1\xe7\x9a\x68\x5f\x99\xaa\xc8\x3b\x50\xd6\x04\x71\x48\xb7\x4e\x9a\x5f\x70\x4d\xb3\xf1\xf2\x98\x90\x91\x4f\x75\x17\x8c\x89\x22\x55\x17\x97\xf6\xfe\xf5\xc4\xf6\x8f\xb1\x7c\xa2\xe1\x4d\x36\x45\x44\x5c\x10\x07\xcf\xc6\x1d\xd7\x24\xac\xe9\xdd\xa4\x4a\xbe\xf4\x1a\x9d\xff\x54\xeb\x2c\xeb\xfc\x20\xd7\x1b\x2d\x7b\xc1\x60\x88\x62\xa5\xb5\xf5\x0e\x53\x20\x22\x2e\x88\x83\x67\x63\x46\xd5\xed\x8a\xba\xd6\xc7\xe8\x77\x2c\x99\x1e\xfc\x94\xc1\x68\x76\xdb\xc9\x75\xdc\x0d\xd4\x78\x9d\x73\x62\xb1\xff\xad\x9f\xe8\x31\x22\x2e\x88\x83\xff\x7b\xa9\xf7\x9b\x85\xc8\x8c\x0c\xd0\x79\x9f\x1d\x08\xe7\xd0\x90\xdd\xe7\xdd\x16\xbc\x92\xb2\xe0\xa0\xdd\xd8\xee\xd4\xda\x8e\x29\x44\x8d\x30\x67\x20\x0e\xea\x39\xfb\xb7\x39\x03\x3d\xd0\xa7\x49\x60\x72\xc8\x37\xb0\x69\x35\x2d\xe2\xf5\x4e\xd8\xe3\x36\x19\xc7\xa4\xc8\xb4\x96\xbd\x3f\x1b\xa2\xe4\x1f\xc2\x39\xac\xb0\x44\xe9\x35\xa1\x63\x47\x00\x0e\xe9\x58\xa3\x7b\x95\x70\x74\xef\x23\x59\xe5\x7b\x1d\xbd\x11\xdb\x2b\x06\xa5\x14\x4e\x63\xe4\x33\x07\xbb\xb5\xe9\x83\x05\x02\x96\x35\xd0\xb1\x23\x10\x07\xff\x49\xbb\x1e\x8e\x38\x75\xf1\x45\x18\x25\x5f\x33\x24\x22\xbe\xf0\x11\xe3\x56\x70\xeb\xe4\x25\xe9\xbd\x7e\x97\x93\xcd\xef\x47\x4a\xf7\x67\x10\x71\x41\x1c\x5c\x02\x8f\xe7\xd8\x0b\x5c\x49\xe6\x83\x59\xac\x5e\x8a\x6f\x75\xab\xfd\x0e\xd7\xad\xca\x0a\x56\x9e\xce\xe2\xbd\xd6\x57\x53\x34\xa5\x08\xf5\xde\x81\x38\xa4\xbe\x88\x37\xa3\x1b\xaa\x22\x02\x84\xe9\x9e\xc6\x09\xae\x6e\x8b\x8c\x11\x77\x31\x1c\x74\xfa\xd9\x50\xd0\x52\xbb\x3b\xdc\x48\xf3\x47\xa0\x9e\x33\x00\x07\xf5\x9a\x00\xcc\x19\x28\xbb\x9e\xa6\x81\x95\x69\x83\x6f\x7b\x2d\xe4\xb5\x4f\xfb\xbc\x29\x5f\xaa\x1a\xb0\xa0\xbe\x4a\x26\x1b\x5a\xe4\xe3\x2d\x8a\x22\x59\x0e\x7e\x46\x08\x9d\xea\x05\x71\x48\x77\xd1\xeb\xd5\x29\xc7\xd2\xd4\x3d\xb6\x1f\x17\x36\xd1\xbc\x34\x9b\xd2\xab\xdf\x59\xfd\x93\x8d\x38\x36\x9e\xe4\x6a\x90\x6b\xc0\xeb\x66\x68\x0a\x24\x80\x83\xff\xa6\x5f\x25\xd1\xdc\x8c\x5b\x44\xde\x56\xed\xd1\x6c\x0d\xd8\x18\x5a\x5d\x4c\x7a\xe1\xbd\xe8\x63\x23\xda\x37\xae\x57\x57\xab\xbf\xbd\x8c\x88\x0b\xe2\xe0\x1a\x08\xfd\x31\x74\x40\x7f\xfe\x38\x04\xc7\x8e\xcd\xc7\x26\x3d\x87\xfb\x82\x15\x11\x25\x09\x1b\xb5\xc4\xf7\x86\x60\x1f\x26\x82\xc7\xd0\xb1\x2e\x10\x07\xff\xf7\x66\x9c\xdc\x0b\x65\x14\x78\x31\xe7\x16\x94\x93\x44\xc4\x6a\x67\x7b\x9b\x88\xbd\x5d\xbc\xf7\x6a\xd5\x54\x1c\x1e\xdb\x75\x71\xa2\x0a\x84\x06\x40\x1c\xd4\x6b\x02\x30\x67\xa0\xad\xee\x34\x0d\xc4\x7f\x27\xff\x9d\x54\xf5\xd4\x42\xd3\xab\x60\x07\xf3\xe6\xb5\xe1\xb5\x8c\x3b\x14\xbf\xf6\xfc\x34\x97\x58\x25\x68\xa6\x4f\xfc\x7c\xff\xef\x18\xf2\xbf\x39\xa4\x8f\x34\x73\x58\x6f\x2d\x05\x29\x31\x1e\x36\xcc\x3d\xc2\xfc\x1a\xfa\x51\x8a\x34\xc6\x72\x5e\x01\xc7\x47\x70\x18\xdf\x80\x6f\xda\xfb\x32\xf4\x91\x06\xc0\xc1\x7f\xd3\xaa\x2a\x35\x7b\x83\xa7\x0f\xf7\x5d\xce\xaf\x94\x70\x05\xbc\xff\xf3\xfa\xc2\x3d\x8c\xc3\x8a\xdc\x1e\x5f\xb6\xe7\x2b\x07\xcd\xe8\x42\x88\xb8\x20\x0e\xae\x81\xf6\x1a\x99\xf6\x0e\x6f\xa1\x37\x6d\xef\xe2\xb4\x79\x83\x4a\xf0\x5c\x0d\x39\xf5\xbd\x8a\x75\xe6\x86\xda\xbf\xf5\x67\xc5\x6c\x5b\x21\xe2\x82\x38\xf8\xbf\xf7\xc8\xa1\x9b\x27\x28\xf0\xf6\xfc\xa3\x2e\xce\x02\xd6\xbb\x4f\x0b\x89\x66\xad\xd2\x4b\x7d\x87\x66\xa5\x19\x24\x57\x69\x1b\xef\x43\xf7\x9c\x81\x38\x28\x0f\x00\xcc\x19\xe8\xbd\xe3\x34\x0d\x2c\x35\xd2\x9e\x30\xbf\xf1\x0e\x1e\xd8\x54\xdd\x72\x7b\x5e\x32\x9c\xe2\xc4\x89\x65\x2f\xdc\x9c\x2b\x2e\x67\x23\x7b\x34\xf5\x16\xda\x5e\x41\x1c\x5c\x03\x77\x83\x5a\x47\xad\x3c\xd4\xda\x6f\x1f\xdd\xa4\xb8\x74\x73\x8e\xaa\x42\x32\xf9\x69\xe5\xd5\x70\xa7\x85\x1b\xb2\x4f\x39\xd8\x32\xfb\x11\x71\x41\x1c\xfc\x37\xad\xb8\x35\x94\xd6\x7c\xef\x3a\xf6\xe2\x9b\x8d\x6f\xfe\x4a\xcf\x7b\xaa\x2a\x57\x4c\xee\x96\xf7\xec\xb8\x90\x3e\xfc\x6d\x1a\xb4\x09\x99\x33\x10\x07\xd7\x00\x75\xfb\xc4\x3d\xd7\xcf\x59\x03\x1f\xfc\x5b\xec\x4c\xa9\x7f\x3d\xaf\xd6\x7b\xb2\xef\xd2\xa5\xf2\x7b\xfd\xd9\xa0\xf3\x89\xf8\x1a\xf4\xb1\x0a\xc4\x21\x7d\x5b\x16\x3a\x72\xc0\x48\x2a\x89\xa3\x57\xd5\x49\x68\x36\x67\x51\xc2\x09\x0a\x4c\x7d\x9d\xb7\x43\x13\xf0\xfe\x8d\x0f\xb3\x84\xda\x55\xe8\x78\x33\x80\x83\xf2\x00\xc8\x9c\x5d\xb1\xec\xb7\x49\xc4\xde\x49\x3e\x48\x7f\xf6\x89\xee\xb9\xb1\xf9\xb9\x9b\xda\xbe\xd6\x0b\x0f\xbe\xb9\xc6\xea\xf6\x3f\x3d\xf2\x88\xfb\xdb\x9c\x51\x7b\xbc\xbd\x23\x7c\xad\x75\x9d\x0c\xdf\x41\x2c\xea\xf3\xab\x6a\x94\x41\xc3\xe6\x39\xd6\x97\x73\x28\xea\x92\xf8\xfb\x76\xe4\x7f\x1f\x6b\x94\xd8\x7f\xb3\x32\x8d\x16\x67\x82\xea\xdd\xdf\xf7\x58\x4c\x9b\xd1\xe3\x5e\xf9\x82\x68\xd3\xa5\x08\xeb\xb9\xc0\xf3\xb1\x83\xfb\x9f\xfe\x6b\xe6\x0c\xb4\xb4\xbf\x7b\xce\x90\xcc\x59\x3c\xb6\x79\x4b\x23\x66\xe5\x62\x83\x61\x9e\x07\xd1\xcb\xc3\x1b\xeb\x73\xad\x7d\x43\x51\x02\xf9\x66\x7e\xbb\x11\x2a\x4d\x4c\x68\x67\x52\xd4\xe1\x46\xf2\x0d\x5f\xea\x1e\x0b\x05\xaa\xc5\x3b\x0f\xd3\xb9\xca\x98\x8a\x07\x76\x96\xca\xd6\x84\xb8\x05\xd0\xe3\x7e\xa9\x9e\xdf\x95\xf5\x6b\xb8\x78\x26\x25\x2c\x64\x73\xa6\x81\x36\x29\x2a\x4e\xb1\x6a\x91\x3a\xbc\x14\x95\xf7\xa8\xe5\x4a\xc6\x6b\x9b\x7a\x6f\xe5\xa3\x7e\x86\x5b\xb1\x68\x7a\x6d\x42\xe3\x67\xb2\x5a\x1d\xa4\x3f\xdb\x40\x61\xc1\x75\x95\x67\xee\x48\xb7\x56\x83\x55\xee\x2b\xbe\x0c\x3a\x1b\xed\x87\x19\x9e\x9e\xe6\x3f\x87\x78\xf3\x96\x7a\xdb\x67\xe2\x09\x7d\x90\xcd\xd9\x44\x41\x04\x19\xd1\x65\x9c\x5c\x91\x97\x92\x33\x17\x5e\xf2\xcd\x6c\x67\x29\x44\x90\xd6\x4e\xfa\xf5\x8d\x18\x70\x5f\x10\xf5\xfb\x73\x66\xe6\x0c\x24\xa2\xd3\xb2\xf1\x88\xd1\x5a\x1a\xa9\xd8\x89\x19\xff\x93\x21\xb6\xd6\x90\x31\xa5\x21\x81\xea\xfc\x4a\xdf\xdb\x3c\x4b\x75\x6b\x98\x94\x7d\x4f\x22\xa1\xb3\x67\x00\x0e\x9e\x8d\x71\x55\xea\x05\x88\x64\x88\x59\x74\xde\x32\xc7\x0c\xfb\x32\xe2\x9f\x4f\xe8\x7a\x58\xc3\x32\xa0\xae\xaa\x7e\x88\x51\x4b\x7b\x09\x1a\x4d\x0f\xe2\xe0\x1d\xb5\x41\x5e\x0c\x4c\x69\x39\xa1\xe4\xf7\x68\x08\xe7\x3f\x12\xde\xd9\x8f\xf3\x09\xd0\xbd\x33\xc4\x8e\x85\x4d\xd5\x79\x5e\xef\xf6\x48\x02\x22\x2e\x88\x83\x5f\x40\x42\xd7\x89\xd5\x2f\x65\x7a\xb5\x70\x3b\xfe\xd1\x0a\xe9\x47\xdf\x82\xca\x47\x99\xae\x64\xe7\xd2\x16\x3f\x59\x06\xb0\x1d\xb2\xea\xc6\x23\xe2\x82\x38\x7f\x09\xea\xff\x89\x2b\x17\xfc\x59\xdb\x80\xa7\x5f\x33\xf3\x17\xf9\xb3\xd2\x24\xb2\x6c\xdd\xb2\xd7\x13\x39\xc4\xdc\x52\xd4\x1f\x6e\x15\xa0\x62\x9a\x65\x23\xcc\x19\x88\x43\x54\xce\x7c\xfe\x6d\xce\x40\x0f\xf4\x69\x12\xe8\xc9\x79\x69\x33\x79\x32\x43\x5f\x24\xbb\x9f\xf2\x59\x84\x36\xf8\x89\x89\x91\x96\xa3\x0e\xaf\xe2\x50\x3c\x27\x9b\x60\xd4\x86\x0d\x74\x02\x15\xc0\xc1\x25\xd0\xe4\x9b\x8a\x4f\xfc\xd8\x00\x4d\x30\xed\x82\x57\x1a\xf7\xea\x4a\x49\xe1\x4b\xce\xc5\x0b\x7f\x1a\xbf\x5b\x66\xcd\xde\x69\xb7\x2a\x44\xc4\x05\x71\x70\x09\x08\x16\x92\x5f\xfa\x49\x36\x38\x8b\x49\x8d\xa2\xd7\xb1\xd7\xd1\xd7\xdc\xd5\x44\xab\x6c\x27\x85\x79\xaf\x3e\x6f\x3f\xdd\x1c\x05\x7a\x81\x06\x71\x70\x09\xc8\xb1\x2d\xbc\x7e\x7c\x88\xf3\xea\xaa\x86\xe5\xf5\xf7\x8b\xaf\xc2\xb3\x7f\x7d\x90\xc7\x94\xd1\x12\xea\xb5\x7a\xfa\x82\x54\x9b\xa5\x17\x11\x17\xc4\xc1\x25\x70\xd3\xbf\x66\xb9\xda\x67\xe0\x59\x79\xbe\x48\x9e\x40\xd0\xaa\x34\x6e\x64\x3e\x41\xec\xf2\x9b\xb2\xb8\x5c\xe2\x1b\x5f\x51\x8f\x68\x10\x1b\x32\x88\x83\xbe\x96\x72\xff\xfb\xa5\x0c\x94\x5d\x4f\x3d\xd2\x16\x62\x5b\xeb\x26\xc9\xe5\x85\x5f\xb4\xaf\x20\xf3\x2d\xbe\x80\x61\xc8\x20\x56\x8c\xdd\x1c\xbd\x24\x77\xef\x47\x60\x6a\xd0\x0b\xe8\x48\x1b\x80\x83\x6b\x20\x25\x21\xdd\xd8\xb8\x91\xda\x76\x0a\x77\xfc\x44\x8f\x3f\x71\xb2\x07\xfd\x90\x87\x5c\x88\x36\x4b\x48\x50\x54\x2d\x70\x9a\xcc\x13\x9a\xdf\x03\xe0\xe0\x1a\x90\x88\x50\xfc\x40\xc8\xf1\x4e\x91\x59\x39\xd0\x97\xb9\x88\x24\x50\x41\xf0\xc9\xe2\x31\x0e\x51\x4d\x57\x71\x9b\xaf\x19\xf9\xb8\x0a\x22\x2e\x88\x83\x6b\xc0\xff\xcb\x9c\x42\x4a\x6d\x89\x52\x66\x83\x9a\xbd\xb1\x61\x52\xdd\x40\xc2\x82\x1e\x7d\xec\x0f\xa7\x77\xa3\x32\x2d\x3f\xbf\x8d\x70\x20\xe2\x82\x38\xb8\x06\xde\x98\x4a\x31\x49\xb8\xd5\x54\x13\x3b\xaf\x5e\x68\x75\x92\xdb\xcb\xc8\xbd\xd3\x5d\x75\x3f\x7d\xd5\xa0\x23\xa9\x8e\x3d\xf9\x0b\xa4\x01\x10\x07\x55\x4d\x00\xe6\x0c\xb4\xd5\x9d\xa6\x81\xad\x90\x7b\x5d\x29\x77\xf6\x4c\x30\xec\x14\xd3\xa8\x86\x49\x59\xd0\xdb\x58\x8a\xc9\x6c\xaf\xa1\x97\x3e\xcd\x15\x15\x22\xa5\x37\x45\xac\x1d\xc4\x21\x4d\x6b\x6c\x6f\x78\x53\xf3\x2a\xde\x87\x9f\x77\x74\xe6\x96\x8a\x65\x9c\x51\xe2\xf6\xc6\xa7\xf5\xb2\x70\xa1\x03\x49\xfc\xa4\x51\x89\xe7\xd0\xb4\x46\x00\x07\xd7\x00\x8a\xf9\x09\xdf\x43\x9e\x94\xe7\xdb\xfb\xec\xdc\x8f\x3c\x7d\x75\xe7\x51\xeb\x5a\xa7\x9b\x0e\xc4\x0b\xc6\xbe\x87\x29\x28\xf9\xda\x21\xe2\x82\x38\xb8\x06\x4c\x1f\x0e\xc6\x7f\x77\xf1\x9f\xd8\x96\x93\xf2\xf1\xaf\x9c\xc6\x6d\xd3\x91\xf5\xd9\x97\x6c\xb9\x32\xb1\x2e\x4f\x59\x48\x46\x0d\x9d\xf4\x07\x71\x70\x0d\x60\x37\xaa\x07\xe5\x7c\x17\x64\x6f\xfa\x7c\x62\xff\xbb\x85\xc9\x70\xcb\xb2\xc5\x10\x17\x0b\xe7\x32\xb1\x13\x7d\x63\xa6\x66\xd1\x7b\x84\x06\x40\x1c\x94\x07\x74\xfe\xad\x01\xd0\x7b\xc7\xa9\xc7\x9b\xd3\xbc\x85\xc7\x9e\x85\xbe\x79\xf0\xdd\xe4\x31\xc3\x9e\x6d\x7c\xf5\x45\xa1\xf3\xea\x5d\x6c\xcf\x3e\x11\xf2\xcc\x95\x1e\xbb\xea\x41\xc7\x9b\x01\x1c\x5c\x03\x5f\x85\x0c\x3d\x0d\xbe\x61\xe9\xb6\x5b\xf7\x37\xbc\x8b\x7f\x95\xa8\xa3\x19\xa2\xfb\xb3\x9a\x99\xf0\xb1\x83\xfe\x37\xea\xe3\xe1\x20\xe8\x63\x0a\x80\x83\x6b\xa0\x59\xf6\xe3\xbd\xb7\x5f\x30\xad\x7c\x3d\x18\x19\x52\x04\x9a\x64\x8e\xcc\xc2\x7c\x5a\xd2\x79\xb6\xea\x08\x3c\xfb\x86\xae\x71\x5f\x84\xfa\x24\x01\x1c\x5c\x03\xd1\x94\x43\xd8\x61\x4b\x5f\xac\x45\x69\xce\x69\x93\x1f\xd0\x28\xaf\xa8\x3a\x36\x16\xe3\x70\xaa\xa7\xe9\xfd\xa1\xd2\xbf\xc2\x07\xbd\x0e\x80\x38\xb8\x06\x2a\x98\x25\xb1\x53\xbb\xa6\xe5\x7a\x17\x3e\xd5\x51\x9a\xff\x88\x28\xbc\x32\x74\x25\x99\x32\x2e\x8a\xff\x3a\xd3\xfc\xd7\x79\x2f\xe8\x43\x1d\x88\x83\xf2\x00\xc8\x9c\x29\xcd\x04\xb7\xe0\x29\xac\x7d\xba\xc2\xb1\xd9\x92\x5e\x76\x23\xf8\xbc\x84\x82\x9b\x94\x88\xd4\xe5\x45\x71\xef\x9c\xac\x4e\xb3\x9d\xbf\xcd\xd9\x73\x86\xa7\xf9\xaf\x05\x0f\xf8\xf4\xee\xe2\x8e\x9c\x33\x61\x79\x78\xf2\xae\x5b\x79\x97\x1a\x7f\xbf\x88\xf2\x6b\xef\x0f\x1d\x57\xdc\xbf\x50\x59\x11\xb9\xfd\x27\x91\x01\xa1\x5e\x93\x52\x0e\xab\xdb\xb3\x1f\xaf\xd0\xbe\xef\x89\xc1\xa0\xb7\xb5\xe3\x2d\x95\x78\x40\xca\x93\xf1\x5f\x33\x67\xa0\xa5\xfd\xdd\x73\x86\x64\xce\x62\x24\x6f\x6d\xd6\x94\x24\x1f\x48\x4e\xd7\x71\xe9\x57\xf2\xbc\x6b\x19\x4f\x91\x16\x7f\x7d\x34\x2e\x96\x2f\xf8\x26\x39\x77\xaf\xf1\x4c\x8a\x3a\xc8\xe6\xcc\x23\x46\x25\x60\x2a\x44\xb3\x43\xca\x8a\x20\x4b\xf1\x43\xe9\xfa\x2d\x45\x47\xac\x07\xf8\x34\xe6\x5c\x01\xed\x26\xe8\x71\xb8\x82\x67\x52\xc2\x42\x36\x67\x06\x0e\x9d\x59\x98\xae\x3d\xd5\x66\xec\x0c\x6d\x4b\x0d\x8d\xbf\x67\x6e\x6e\x8c\xa3\x35\xaf\xcc\x3a\xed\x7a\xa4\x45\x34\xe5\x4c\x9c\xc9\x6a\x91\xcd\x99\xcd\x1d\xb2\x2f\xda\x91\x4e\xb4\x5c\xfc\xb1\xcc\x63\x16\xbe\x0c\xf1\xd2\x0d\x8a\x1a\x76\x54\x45\x94\x93\x7b\x19\x37\x4c\x5e\xd0\x9e\xc9\x6a\x91\xcd\x99\x1f\xc1\x3a\x45\xe1\x35\xdf\x24\x43\xcc\xb2\xb7\x52\x52\x29\x8e\x84\x82\x5d\x16\xb2\xb6\x79\xa1\xfa\x1f\x4d\x75\xea\x6f\xa6\x10\x9c\x99\x39\x03\x89\xe8\xb4\x6c\x6c\xe1\xf6\xfc\xc4\x10\xef\x83\x05\x05\x4b\xda\x43\xfe\xea\x0d\x4c\xc6\x1b\x23\xef\xa2\x67\x8e\x7b\xa6\x62\x03\xa9\x38\x85\xef\x94\x21\xb2\x10\x88\x43\xba\xd8\x04\xd7\x57\x85\xf0\x73\xb6\xc0\x63\x76\xe2\x0b\x84\xb3\xb8\x09\xaf\x83\x27\x13\x06\x7d\x89\x96\x3b\x3a\xca\x7f\x4b\xf1\x12\x2e\x42\xc7\x0f\x01\x1c\x3c\x1b\x0b\x48\x4b\x36\xeb\x31\x1c\xc4\xd8\x97\x59\x9a\x61\x35\xee\x2f\x35\x3e\xff\xe1\x8d\x65\x44\x97\x43\x9b\xf4\xf3\x8f\xe8\x58\x80\x24\x34\x55\x11\xc0\xc1\xb3\xb1\xce\xf6\x7c\xf8\x8f\x67\xa8\x2c\x8c\x1e\xb7\x63\x3e\x46\x8b\xe5\x3d\x8f\x8c\x11\xd4\x65\x51\xf9\xa4\xa8\x63\x5b\x62\xa5\xbc\x07\x95\x4d\x40\x9c\xbf\x04\x0a\xda\xdf\x71\x9f\x15\xb9\x71\xbf\x57\x67\x45\xa7\xc0\xa9\xbc\xa9\xc1\x2a\xd7\xf1\xf2\x95\xe5\xab\xd5\xfb\x5b\x74\xb6\xb8\xa1\xf4\x17\xb6\xc4\x3e\x20\xcc\x19\x88\x43\x54\xce\x5a\xfe\x6d\xce\x40\x0f\xf4\x69\x12\xe8\x68\x7c\x1f\x87\x39\xaa\x1f\x64\xf1\x0a\x2b\x9b\x6e\xfc\x95\x5e\x6a\x10\x07\x4b\xc6\xbc\x47\x84\x16\x5d\xef\xf5\x4f\x85\x85\x50\x5f\x10\x88\x83\x4b\xc0\xc1\xcc\x96\xb0\xb9\xf7\x72\xda\x2c\x8b\x75\xed\xd1\x70\x9e\xe2\x52\x6f\xa7\xc5\x8b\xcc\xa7\x34\x42\xf6\xac\xaf\x28\xf9\xc6\xa1\x62\x24\x88\x83\x4b\xa0\x54\x2e\x4f\x6a\xdd\xd0\x43\x91\x25\xde\x45\x0d\xe3\x6b\x91\x8c\x69\x6a\xd0\xdb\x90\xed\x5c\x9f\xbc\xa7\x91\xcb\x57\xf9\x24\xa0\x6a\x0c\x88\x83\x4b\xe0\x30\xa9\x79\xba\x3a\xa8\xb8\x30\x04\x2d\x62\xc2\x12\x7b\xf2\x6b\x62\xeb\x93\x02\xf1\x07\x49\x8b\x78\xcd\x26\x7d\xfe\x49\xaf\xa1\xe9\x6f\x20\x0e\x2e\x81\x79\x8a\xb8\x70\x01\x26\x0b\x81\x0f\x9d\x78\xe3\xdd\x13\x7a\x92\xc9\xd5\x21\xd2\x3f\x49\x68\x65\x69\x13\x89\x42\x79\x55\x8f\x12\x10\x1b\x32\x88\x83\xbe\x96\x02\xcc\x19\x28\xbb\x9e\xa6\x81\x82\xfe\x75\xf6\xdf\xe2\x81\x6c\x9a\xd9\x35\x0e\x7b\x7a\xf1\x9b\x3f\xd1\x78\xdf\x3f\x11\xb9\x1a\x7c\xef\xf3\xfa\xc3\xb6\xd7\x64\xd0\x71\x3e\x10\x87\x74\xcf\x19\xde\xb1\x77\x28\xd9\x77\x65\x4f\x94\xe1\xdf\x37\x78\xb7\x5f\xd5\xff\xc8\xc1\x5c\x11\xb6\x6e\x4f\xe8\x9b\xc3\xa8\x62\x8b\x18\x44\xc4\x05\x71\x70\x0d\x04\x4c\xc7\xcf\x8f\x4c\xa3\x06\xca\x7f\xd7\x24\xe9\xe8\x6d\x36\x2d\x9d\xd0\xef\xe8\x3c\xff\x91\xda\x75\x8d\xe8\xbc\x1a\x0d\x2b\x54\xed\x05\x71\x70\x0d\x58\x72\x24\x0a\x97\xa4\x7c\xa5\x77\xa2\x95\xa1\x10\x28\xd5\xba\x5c\xa7\x3f\xa7\xcc\x79\x89\x84\x96\xec\xd1\xd5\xc0\x5f\x52\x0b\x90\x41\x07\x71\x70\x0d\x28\xe7\xdd\x6e\x2f\x71\xce\x1f\x1f\x22\xfa\x42\x91\xdf\x9d\xfa\xb0\xa6\xaf\x34\x6f\xc2\x3b\xb3\x53\xec\x3a\xe7\x78\xf3\xb3\x48\x6a\x84\x06\x40\x1c\x54\x35\x01\x98\x33\xd0\x56\x77\x9a\x06\xd4\x2d\x5f\x48\x07\x2d\xb7\x3e\xa1\x37\xe7\x23\xb9\xd6\x8b\xba\xfc\x90\xb8\xfb\x61\x35\x67\x88\xd6\x5e\x9c\x9b\xba\xbb\x3f\x15\x34\x18\x08\xc4\xc1\x35\x90\xe7\x66\x7b\x5e\xb8\x2c\x6b\x38\xcf\xb9\x30\x8c\xe9\x63\x94\xe8\xd6\x6f\x87\x2c\x9f\x40\x1e\x55\x32\xd4\x3e\xf5\xac\x59\xab\xdf\xd0\x24\x50\x00\x07\xd7\x00\xe1\x23\xc9\x16\xff\x7b\x21\xb2\x05\xc7\xc5\x66\x16\x8b\x28\xfc\x9c\x22\x3b\x7a\x95\x05\xec\x0a\xd8\x87\x57\xa6\x8c\x2f\x65\x42\x83\x7b\x41\x1c\x5c\x03\x6f\x0e\xae\x3e\x9f\x3b\xd4\x89\x2f\x4d\x6d\xc1\x71\xbd\x6f\xd2\xcc\x10\xfc\x21\xca\x9e\x1d\xaf\x72\x80\xe6\xfd\x4e\xe5\xdb\x59\x3a\x44\x5c\x10\x07\xd7\x80\x07\x16\x49\x45\x5e\xcd\x75\x9f\x60\xd3\xb0\x50\xe6\xe6\x64\x1c\x0c\x77\x67\xcb\xd5\x45\x26\x9d\xf9\xc4\xe4\x83\x8c\x77\xde\x4a\x08\x0d\x80\x38\x28\x0f\x00\xcc\x19\xe8\xbd\xe3\x34\x0d\xa8\x70\x29\x31\x7f\xe4\x11\xc7\x65\xee\x3b\x3f\x63\x6a\x77\x93\x9a\xc8\xe5\x07\xe7\x4c\x8e\x80\x03\x63\xd2\x23\x96\x9f\xeb\x7a\x24\x88\xb5\x83\x38\xb8\x06\x86\x3b\x92\xff\xec\xb9\x92\xb3\x6c\x6c\x64\x5e\x3c\xc7\x94\x98\xc4\x97\x90\xd4\x65\xb9\xea\xf5\xfa\x05\x66\x9a\x3e\x81\x63\xe0\x21\x22\x2e\x88\x83\x6b\x40\x91\x81\xe1\x6a\x10\xf9\x9d\x1d\x5d\x49\xdf\x4f\x39\x9b\xe7\x66\xcd\xbd\xf1\xd8\xdf\x28\xa6\x16\x27\x4e\x76\xf6\xd7\x7e\x21\x7e\x8a\x88\x0b\xe2\xe0\x1a\xe8\x2a\xca\x36\x9f\x5b\xb5\x5e\xec\x3b\x28\x1a\xbb\x49\x67\xda\xa4\x42\x73\x4b\xb0\x36\xea\xf6\xb0\xd8\x48\xa0\x20\xd7\x93\x4b\x29\xd0\xe9\x0c\x00\x07\xd7\x80\x25\x07\x89\x5c\x0b\x9b\xe5\xf4\xfb\x0f\x83\x1b\x29\x45\xb1\x24\x5a\x38\x83\x9a\xf5\x78\x56\xf1\x01\x8f\x56\x2b\x4a\x9f\xf5\x16\x22\x34\x00\xe2\xa0\x3c\x00\x32\x67\x0e\xf1\xde\x0c\x46\x7a\xee\xf9\x5c\x77\xee\xf3\x3f\xba\xc9\x7e\xef\xd7\xb9\x68\x2d\x4b\x4c\x5c\xf6\x9a\x98\x65\x46\xf1\xb2\x2b\x54\x7f\x9b\xb3\x96\x07\xa9\x73\xe5\xb3\xfa\x76\x05\x8a\x0c\x7d\xf4\xdf\x4a\x64\xf5\x4e\xaa\x85\x49\xd0\x77\x07\xf4\x3e\xbb\x0b\x8a\x38\x1e\x4e\xff\x85\xbe\x96\x34\x1b\x6d\x16\xfc\x65\x63\x15\x1a\x4b\x8a\x31\x2d\x93\x5a\x5f\x84\x95\xc5\x6b\x91\x8d\x2a\xaf\x3a\xb5\x60\x19\xf4\xed\xc9\x7f\xcd\x9c\x81\x96\xf6\x77\xcf\x99\x1c\xfc\x05\x1e\x9f\xc9\xb4\x42\x10\x75\xb2\x2a\xf8\x55\xb7\x06\xdf\xdb\x5c\x77\xa3\x48\x45\x8b\xb0\xac\xa2\xd4\xa7\x59\x01\x09\x12\xd4\x34\xb5\x67\x52\xd4\x41\x36\x67\x6a\x6d\x0f\x94\x5b\xd8\xbf\x9d\x7f\x62\x73\x8b\x23\xc1\x8d\x79\x57\xb3\x57\x2e\xde\x15\xf5\xe8\x02\xbf\x5b\x5d\x46\xf5\x83\x97\x67\xe2\x09\x51\x54\x90\x8f\x35\x36\xcb\x54\xab\x8d\x3d\xfe\x2e\x6b\xc4\x35\x47\xc8\xe2\x5f\xb6\xd0\xee\xda\x62\x88\x7f\x2c\x7a\xdf\x74\x2c\xed\xce\x9a\xce\xaf\x33\x59\x2d\xb2\x39\x93\xb8\x2d\x78\xf2\xa2\xf8\x49\xe8\x4d\x89\xfa\x5b\xed\xde\xf8\xda\x1a\xf7\x1d\x76\x70\x16\xf1\x45\x83\xed\x9e\x8c\x3e\x91\xf8\xae\x7b\x26\xab\x75\x41\xfa\xb3\xe3\x96\x89\x1a\xb8\x9d\x71\x06\x97\x24\x7e\xde\x8a\xd7\x8d\x5b\x2e\x48\x29\x3c\xb7\xeb\xb8\x39\xa8\x59\xb2\x90\xb8\xdf\x91\xea\x7f\x66\xe6\x0c\x24\xa2\xd3\xb2\xf1\xee\xfd\x0b\x55\x56\xb9\x68\xfe\xe5\xb3\x0e\xe6\x9a\xa6\xc9\xd7\xd8\xa6\x77\x44\x4b\x59\x85\x08\x2a\x13\xb6\xb2\x88\xbe\xa4\x41\xb7\xcf\x82\x38\x78\x36\x3e\x52\x13\x6e\xfa\x2c\xbb\xf9\xee\xa9\x9a\x11\x86\xf7\x6a\xa2\xc2\x6a\x65\x56\x4a\xf4\xe8\x4c\xd5\xf6\x9e\xa7\x35\xef\xae\x6b\x18\x22\x2e\x88\x83\x67\xe3\xb4\x1f\xde\x2c\x54\x57\x49\x46\x24\x4f\xc2\x50\xa6\xbd\x3c\x03\xeb\x39\x30\x77\x5d\xc2\xd9\x7d\x1f\xb3\x32\xdc\xb6\x7b\x14\x01\x35\x32\x81\x38\x78\x36\x8e\x74\x36\x42\x7d\xc5\x62\x1d\x9b\x93\xcc\xd4\x61\x60\xfa\xc3\xd7\xf4\xf2\xf7\x57\x9f\x79\x26\xc7\xb7\x32\x24\x87\x43\xb0\xf6\xaf\x21\xe2\x82\x38\x7f\x09\x14\xea\xbf\xe3\xe6\xf6\xb2\xbd\x48\x76\x5c\xbf\x1a\x5a\xcb\xe6\x29\x28\x72\xf9\x5a\x7b\x80\x54\x8f\x27\xf6\xb9\xcd\xd1\xb4\xab\xf7\xa8\xd5\xd4\x39\x11\xe6\x0c\xc4\x21\xa6\x35\xfe\xff\xa9\xe3\x1f\x1b\x32\xe8\x81\x3e\xf5\x6b\xe9\x4f\xd3\x47\x63\xda\x53\xb7\xf3\xb1\xf5\x44\xdf\x74\x63\x6e\x88\x16\x62\xfb\x66\x9b\x5c\x7b\x88\xfa\x30\x6a\x81\x9e\x81\x16\xea\x09\x01\x71\x70\x09\xac\x37\x4e\xf0\x3e\xa1\x55\x0d\xdf\x34\xde\x2d\x37\x78\x5a\xfb\xd4\xe3\xa5\x9a\x40\xa9\x67\xfd\xce\xbe\x75\xe3\x7b\xee\x80\xda\x4a\x44\x5c\x10\x07\x97\x80\xd4\x0f\x7f\x8d\x36\x02\x92\x40\xfd\xda\x23\x9a\x8e\xb9\x56\xbb\x71\xed\x73\xfc\x69\x38\x68\x81\xb3\xaf\x07\xec\xbe\x05\xa1\x3d\x43\xc4\x05\x71\x70\x09\xb8\x54\x30\xf0\x73\xdc\x5d\x12\xf2\x79\x76\x41\x00\xf5\x4f\x14\x43\xa3\x95\x77\x52\xc1\xc9\xcb\xbe\x43\x22\xe6\x9d\xf9\x37\xa6\xb7\xa1\x3e\x03\x00\x07\x97\x80\xda\xcd\xc9\x2d\x2c\x61\x3d\x3c\x23\xcb\x5d\x8e\x69\xfb\x4b\xe7\xee\x65\x92\x26\x59\x47\x3c\x8b\x7f\x5e\x22\xd2\x2e\xab\xa2\x2a\x83\xd8\x90\x41\x1c\x34\xa1\x0b\x60\xce\x40\xd9\xf5\xd4\x63\x8d\x05\x3b\x3f\x5c\xfa\x6a\x1a\x7e\x09\x4e\x87\xd2\x27\xfc\xd8\x8a\x79\xec\xe7\x40\x5f\xe5\x89\xa2\x25\x91\x71\x7e\xdd\xfb\x85\x2a\x74\xac\x11\xc0\xc1\x35\xd0\xe9\xab\x46\x7f\x30\x7b\xf5\xd5\xef\xee\x9b\x25\x6f\x2c\xdc\x59\x0d\xda\xb2\x1c\x34\xa4\x35\xae\x31\xea\xa7\x47\xc4\x94\x71\x41\xd5\x0d\x10\x07\xd7\x40\x96\x85\xa4\x96\x96\x3c\xde\x63\x0f\xbc\x5b\x51\x1b\x62\xb1\xe5\x13\x99\x77\xdf\x1c\x3f\xdb\x67\xb9\xda\x6d\xf8\x61\x67\x8e\x4e\x0b\x11\x17\xc4\xc1\x35\x40\x7f\x9f\x4e\x52\x6d\xe1\x04\x4b\x87\x9a\x42\x9a\x65\xcd\x86\xb5\x20\x5f\x7b\xa0\x7b\x5e\xea\x3a\x5a\xfb\xa0\x23\x4e\xe0\xed\xeb\x88\xb8\x20\x0e\xae\x01\xd5\x94\xa2\x17\x2c\x23\x07\xb8\x5a\xf5\x9d\xe5\x6b\x63\xaa\x37\xaf\x4f\xed\x30\x7f\x11\xe0\xce\xe7\xb1\xf1\x2b\x51\x4a\xf0\x82\x7a\xce\x40\x1c\x34\xa9\x4f\xe5\xdf\x1a\x00\x6d\x75\xa7\x69\xe0\x84\xb3\xc3\x27\x16\x8f\x75\xeb\x67\xb7\x53\x76\x36\xe1\x45\x53\xf9\xdd\x1b\x7f\x0e\x2e\xd8\xf9\x62\x3e\xdb\x7c\x94\xb7\x63\x08\x5d\x25\x01\xe2\x90\x3e\xd2\x8c\xba\x59\xf3\x9a\xb8\xb6\xbe\x94\xf2\x0c\x78\x2c\x29\x73\x31\xbe\xb7\x13\x55\xad\xaf\xca\x73\xd6\x7f\xdf\x7d\x31\x89\x6b\x1c\xfa\x48\x03\xe0\xe0\x1a\xf8\x4a\x59\xd3\x73\xee\xb5\x3a\xe5\xca\xf8\xc3\x34\xa3\xdd\xd0\x2a\xde\x62\xac\x50\x67\x17\xfb\x66\x3d\x1f\xcf\x8b\x6d\x81\x43\xd0\x20\x23\x10\x07\xd7\x00\xda\xbd\x8a\x37\xbf\x3b\x1a\x8e\xcc\xbf\xab\xd2\xf7\xf6\x28\xad\xf9\x2c\xfe\x9e\xca\xf8\xf0\x74\x4f\xb9\x4b\xb2\xae\xc0\x27\xe4\x2e\x22\x2e\x88\x83\x6b\x40\x39\x55\xa4\xcf\x8d\xcc\x4c\xfb\xb6\xd5\x0d\xb1\x77\x86\x73\x64\xa8\x0e\x2b\x71\x77\xd0\x68\x30\x5e\xf8\xde\x4d\x0c\xe1\x96\x68\x87\x0c\x3a\x80\x83\xf2\x00\xc0\x9c\x81\xde\x3b\x4e\xd3\x40\x88\xae\xa1\xd5\x78\xe1\x0d\x09\x8e\xb5\xd5\x48\xbc\x97\x55\xfc\xa5\x42\x5a\x36\x52\x4d\x72\xcb\xaf\xab\xfc\xcc\xe9\x8d\x47\xa0\x8a\x34\x88\x83\x6b\x80\xdb\x5f\xa5\xf1\x5a\xa5\x63\x4c\xf7\xb6\xf2\x67\xbd\x93\x87\xd7\x88\xc4\x12\x87\xfa\x1d\xc5\xbb\x89\xbc\xc3\x65\x03\xb0\x3a\xa1\x5e\x36\x10\x07\xd7\xc0\x53\x3f\xd9\xcc\x42\x6e\x35\xfd\x38\xb7\x61\xcf\xeb\xda\xca\xcf\x0a\xd7\x83\x47\xf0\x8e\xb7\x46\x74\x37\x2d\x4a\x08\xc6\xb8\xa0\xb9\x63\x20\x0e\xae\x81\x80\x9f\x9f\x68\x08\x4c\x52\x08\xda\x59\xca\xb2\xad\x9e\xb8\x74\xc6\xd4\xf0\xb3\xd5\x4c\x94\x3c\xee\xb8\xc0\x19\xf5\x42\x59\x16\xba\xfe\x15\xc4\xc1\x35\x60\x39\x52\x6a\xfa\xfe\x5a\x82\x5a\xaa\xeb\xbe\x29\xb1\xa7\xbf\xfd\xd6\x17\x0f\xbb\x07\xbc\x66\x33\x52\x16\xbe\xfa\xd5\xce\xa3\x4b\x90\x39\x03\x70\x50\x1e\x70\x01\x98\xb3\xaa\x92\x5f\x5e\xb2\x84\x66\x57\xd3\xc2\xcc\xef\xf0\x59\x7c\xd5\xdf\xf0\x5a\xc8\x66\xe4\x08\x1e\x5a\x5f\x97\x52\x53\x10\x33\x72\xfb\xdb\x9c\x29\x54\x1c\xa4\x07\xfe\x2e\x5a\x8c\xa4\x79\x63\xb5\x71\xcc\x89\xf1\xde\xe3\x27\x8b\xde\xda\xc2\xf2\x75\x8b\x1f\xf4\x78\x44\xa6\x93\x7f\x6b\x39\x63\x3d\x85\xf7\x49\x22\x6e\x5d\xcf\xea\xbe\xe8\x37\xe6\xf6\xf1\x03\x5d\x5a\x03\x4f\xba\x1e\x3c\xca\x82\x34\xb2\x22\xdc\xed\xff\x9a\x39\x03\x2d\xed\xef\x9e\x33\x24\x73\x26\xa8\x6c\x63\x3b\xef\x61\x33\x5e\x30\xe8\xd5\x73\x27\x58\x7b\x15\xb7\xa6\xc7\x79\x89\x1b\x55\x73\xf8\x55\x63\x27\xd5\xaf\xce\xb5\x33\x29\xea\x20\x9b\xb3\x92\x6f\xda\x85\x72\xf4\x95\x9c\x5b\xe7\xf3\x55\xe6\x2b\x7a\xdf\x32\x78\xdb\xfb\xa0\x12\x6a\x75\x9d\x4f\x0f\x2f\xdd\x08\xc3\x33\x38\x93\x12\x16\xb2\x39\x63\x94\x99\xc9\x5b\x7b\xb1\x35\x3f\xb5\x2a\x48\x7c\xed\x15\xfb\x7b\x5b\xe5\xb0\xfe\xe6\xd2\x55\x03\x03\xcb\x45\x03\x01\xcd\x8a\xc0\x33\x59\x2d\xb2\x39\xfb\x38\x99\xf2\x2d\x84\xf6\xff\x63\xee\x2f\xc3\xa2\xdc\xfa\xf7\x7f\x9c\x19\x42\x52\x3a\x86\x12\x50\xa4\xbb\x53\x5a\xba\x41\x42\x14\xe9\x12\x41\x3a\x04\x06\x90\x56\x01\xe9\x14\x01\x01\x91\x06\xe9\x46\x09\x41\x42\x69\x04\x24\x05\xa4\x11\x04\x04\xfe\x87\xff\xdf\x87\xf9\x3a\x83\x73\x5f\xf7\x03\x1f\xdc\xfb\xd1\xde\xfb\x38\x8f\xd7\xcc\x5a\x9c\xf3\xbe\xd6\x79\xad\x7a\x55\x9e\xbc\xb5\x30\x69\x25\x99\x9c\x71\x5b\x86\xb6\xdc\x54\x78\xdf\xd6\x74\x88\x25\x86\x16\x75\xc2\xed\x9f\xb4\xf6\x62\x38\x13\xdf\x4f\x3c\x0a\xf7\x8c\xf2\xc0\xbd\x3e\x0c\xce\xe0\x8a\x1b\xd8\x7a\x60\xfe\x24\x45\xea\xd9\x14\x1e\x11\x6e\x75\xf5\xa2\xdb\xe8\x3f\x0b\x67\x40\x26\xfa\x5b\x35\xb6\xd4\xb4\x71\x9d\x0e\x51\x70\x84\x9a\x6f\xb6\x2b\xb9\xbf\x55\xf2\x7b\xf9\xbd\x32\x91\x2a\x18\x97\xbc\x9f\xb1\x76\xad\x91\x10\xb6\x70\x1f\x48\x87\x58\x8d\x0d\x40\xf1\x0f\xd4\x95\x02\x89\x7b\x65\xac\x04\xaf\xaa\x8c\x91\x78\xf1\xfb\xf1\x64\x97\xcd\x3c\xd9\x9d\x55\xa5\x52\x6e\xc1\xcc\x86\xed\x2e\x07\xd0\x21\x56\x63\xdd\x05\x01\x25\xfc\x21\x21\x05\xe5\xcf\x07\x43\x2f\x68\x1b\x30\xd5\x6d\x33\xfd\x31\x25\x1f\x27\x4b\x4f\x7a\x86\x7c\x68\x3b\x85\x1d\x08\x02\xa4\xbb\x70\x96\x78\x13\x4f\xd2\x0e\xa3\xe2\x4a\xe6\xbd\x14\x2d\x1a\x97\xcb\x19\x6b\x91\xc4\xd7\x63\xc8\x7f\xcd\x54\x5a\x18\x5f\xcb\x92\x4a\x86\x9d\x23\x0d\xa4\x43\xe4\xd2\x9f\x99\x0e\x05\x57\xab\xce\xa5\xba\x7c\xe5\x43\xa7\x27\xbd\x43\x22\x9a\xf2\xf9\x51\x28\xd3\xde\x5e\xfb\xd3\x7c\xea\x5b\x6d\x28\xe7\xe1\x0c\x48\x77\x7e\x5a\xa3\xd4\x7f\x0e\x67\x40\x3f\xe8\xbf\x59\xa0\x66\x3e\xb2\x62\x81\xa3\x9c\xbb\xc3\xa2\x62\x20\x71\x7b\xaf\xfc\x13\x71\x27\x03\x38\x2c\x14\xd4\xbd\x57\xd6\x67\x7e\x4b\xe2\xd9\x79\xd3\x81\x74\x88\x16\x40\x09\xda\xd9\x79\x90\xd8\x9c\x56\x62\x51\x12\x31\xf2\x30\x36\xe1\xb3\x57\x4e\x09\xc7\x84\xe5\xe3\x03\xfa\xd9\x06\xbf\xf7\x54\x35\xb0\x65\x47\x00\x3a\x44\x0b\x30\xec\x9e\x88\xac\x7f\xbc\x81\x76\x89\x9d\xb9\xf5\x96\x92\x8f\x1e\xe5\xa7\x93\x42\x28\x1d\x5e\xcb\xf0\x1d\x0c\xbb\x64\x23\x55\xd8\xc0\x1c\x48\x77\xe1\xca\x3f\x97\x09\x32\x1a\xa7\x27\x1c\x18\x52\x04\x2d\xef\x70\xf9\x94\x29\xc8\x62\xb9\xf8\x17\x4a\xbe\xbf\xd8\x23\xe9\x5d\xbb\x72\x0b\xb6\x9c\x09\x48\x87\xc8\x65\x9e\xd5\x38\xb8\x9f\xc8\xcd\xc7\x25\x7b\x50\xdd\xb7\x55\x77\xff\x7e\x57\x30\xcf\xd8\x07\xf1\x46\xe1\x37\x64\x89\x6f\x85\xa7\x61\xb3\x26\x40\x3a\xd8\x09\x5d\x00\xe1\x0c\xa8\xba\xfe\xcd\x03\x7b\x28\x21\xad\x2a\x81\xd5\x68\xf3\x66\x05\xb5\x32\x62\x79\x37\xa0\x15\xe8\x5b\xa3\xdb\x0b\xeb\xe9\x63\xef\x56\xe5\xf5\xe6\x13\xcf\xdb\x0e\xa4\xbb\x70\x18\x84\xff\x1c\x45\x19\x37\x8e\xc1\xc2\x0b\xca\x10\xb4\x1c\x41\xf3\x3d\xd5\xcb\x74\xec\xf9\x56\x12\x34\xd0\x6f\x93\xc2\x84\xf4\xb0\xe5\x92\x40\xba\x0b\xb3\xa7\x4f\x69\xcd\xe3\xe2\x06\xd2\x26\x02\x4c\x09\x43\xac\xfa\x2e\x1d\x1d\xdd\x38\xec\xf9\x7a\xa4\xe8\x75\x52\x7e\x1a\x19\x4b\xcf\x02\x9b\x3d\x05\xd0\x21\xf6\x83\xc3\xb7\xda\xfb\xed\xf1\x5a\xc4\xb8\x05\x6c\x78\x84\xe5\xf7\xc4\x2f\x77\xd5\x5c\x2f\xce\xe5\x96\x4c\x5c\xd4\x95\xe5\xd2\x7f\x02\x3b\xf6\x1d\x48\x87\xc8\xbd\x46\x5c\x68\x8a\x33\xda\x64\xdc\xad\x49\xfb\x92\xec\xc8\x59\xc2\x40\x82\x80\xff\x28\xea\x47\xae\x32\x7d\xc0\x42\xa6\x78\x80\xc3\xb9\x07\x80\x74\xb0\x93\xfa\x00\xc2\x19\xd0\xa3\xee\x6f\x1e\xf8\x35\xe0\x27\x6b\xd7\xbb\xe3\x10\xed\x37\x3e\x5a\x71\x95\xdc\xcd\x1f\x52\x93\xce\xfd\x41\x8c\x43\xc9\x9c\x33\x25\x37\xd8\x1f\x76\x4b\x09\x90\x0e\xd1\x03\x95\xaa\x24\xfa\x44\xd7\x16\x9e\x4c\x8a\x70\x1e\x65\xc6\xbf\x8b\x4a\x38\x21\xbb\x2c\x20\x60\xb1\xd3\xc3\x04\xcd\xea\x9f\x04\x37\x9f\x73\x81\x74\x88\x1e\x58\x1d\xb5\x92\xfb\x80\x45\xf1\x38\xad\x5c\x8b\x99\xae\x28\x2b\xe0\x19\xa8\x54\x0e\x55\xd2\xae\xab\x14\xf2\x52\xe3\x56\xb1\x11\xec\x50\x18\x20\x1d\x62\x3f\xf0\xa1\x44\x3c\x38\x96\x75\x9b\xef\x39\xb6\x17\x7b\x20\x37\x25\xa6\xf1\xf5\x0b\xa5\x62\x29\x9d\xd6\xb5\xb3\x4a\xa9\xdb\xc7\x2d\x6f\xcf\xb9\x40\x3a\x44\xee\xf5\x0f\x45\x09\x47\xb9\x5a\x9d\xf7\xb8\x0b\xc8\x1d\x4d\xdd\xb7\x97\x56\xa3\x41\xb1\x69\x55\xbc\x73\x8b\xab\x5a\x41\x2f\xe6\x0b\xce\x3d\x00\xa4\x83\xd5\x01\x80\x70\x06\x34\xee\xf8\x9b\x07\xde\x7f\x89\x1d\x9b\x2b\xe9\xb9\x1b\x5b\xf9\x7d\x7a\x97\xea\xe9\xf7\xb5\x87\x03\xfa\x1d\x74\x2a\x37\xa6\x7b\xfb\x79\x55\x08\xf0\x60\x87\x2d\x01\xe9\x2e\x2c\x6b\xac\x96\xa4\xa3\x69\xe7\x9f\x8c\xf0\xc2\x55\xc4\xb5\x35\x15\xd8\x73\xec\x2c\x24\xaf\xc6\xb1\x1c\x68\x8d\x3c\x79\xda\x91\x03\x1b\x0e\x00\xe9\x10\x3d\x40\xaf\xbc\x14\x36\x6d\x62\xd9\x14\x48\x52\xa7\xaa\xc7\x58\x2c\x4c\xc9\xe9\x0e\xe9\x30\xb0\x10\x7e\xf8\xf8\x83\xb9\xf1\x9b\x5b\xb4\xe7\x5c\x20\x1d\x62\x3f\x94\x1a\xe1\x61\x2d\x96\xd9\x5e\x2a\xdd\x90\x7a\xd6\x61\xe0\xec\x52\x8e\x8b\xf3\x43\xdd\xd8\x62\xcd\xf1\x46\x36\x76\x1a\xb6\xe9\xc9\x39\x17\x48\x77\x61\x7f\xb7\xa8\x65\xe4\x03\xe3\xcc\x5e\xf6\xf6\xd6\x50\xb5\x79\x1f\x87\xb3\x86\x0a\x92\x76\x5c\x7d\x83\xf5\x2c\x0b\x48\xd9\x6c\xb2\xd1\xb9\x07\x80\x74\xb0\x3a\x00\x14\xce\x64\x67\xd7\xaa\x0b\xdd\xe5\x6a\xde\x30\xc9\x71\x2c\x2b\x18\x7f\x0c\xa2\x24\xdc\xbf\x77\x2d\x61\xe1\x85\x16\x85\xc6\xdb\xd4\x57\x4b\x7f\x86\xb3\x1b\xc4\xd1\x92\x9a\x68\x5d\x22\x4a\xbf\x6e\x45\xbf\xa9\x70\xa1\x9f\x63\xcc\xba\xd2\xf6\xf1\x15\x73\xb6\x13\xb5\xcb\x18\x85\x68\xc5\x1f\xd2\x11\x5a\xa2\xa9\x65\xf3\x66\x9e\xfc\xc0\x03\x45\x31\x9c\x4e\x72\x1d\x8e\xcb\xbb\x59\xdb\x6c\xb3\x89\x0b\x5f\x15\x69\x2e\x17\x88\xfe\xaf\x85\x33\xa0\xa6\xfd\xb9\xe7\xec\x42\x38\xfb\xc9\xa4\x60\x76\x97\x62\x78\x8b\xf7\x67\xda\xa0\x84\x71\x8c\xd6\xcd\xd1\x69\x19\x46\x05\x3d\x74\x6a\xb4\x3c\xc1\xcd\x03\x46\x83\x7f\x32\xa9\x23\x70\x21\x37\x58\x10\x75\xcd\x6c\x7c\x4f\x51\x32\x75\x36\xf5\xcd\x0f\xca\xaa\x8b\xf0\x06\x43\x07\x2b\x5e\x90\x9e\xb0\x7f\x9c\xde\x73\xe1\x4f\xff\x27\x53\x58\x17\xc3\x59\x7c\x78\x7e\x29\xaa\xdf\xfa\x4c\xe3\xf5\x74\xd6\x09\x1e\x05\xa7\x3c\x19\x81\x3e\xa6\xb4\xd8\x2b\xed\x36\xc1\x1f\xbb\x6d\x3d\xa6\xff\x49\x6b\x6f\x5f\xf8\x58\x85\x8a\x80\x7d\xc5\xa0\x18\x93\x57\x4e\xf2\x7a\x2e\xb3\x87\x2e\xc9\x04\x5f\x0d\x93\x86\x75\xd3\x72\xba\x19\x7e\xe8\x89\x9a\x15\xfe\x93\xd6\x5e\x0c\x67\xbe\x03\xc2\xa2\x5c\x46\xc6\x4a\x59\xa5\xbd\x15\xac\xda\xd9\x06\x83\x56\x57\x68\x76\x51\x1d\x37\x33\xae\x1d\x10\xdc\x94\x95\xda\xff\x67\xe1\x0c\xc8\x44\x7f\xab\xc6\x7e\x95\x0f\x9d\x45\xb2\xa7\x74\xc2\x9d\x57\x49\x1e\xbf\xe6\x4e\xb5\xcb\xd9\x29\xf7\x78\xac\xf1\xbe\x83\x8b\x43\x68\xa7\xfd\x54\xfc\xbc\x0a\x01\xe9\x10\xab\x71\xd0\xbb\x27\x36\x9c\x11\x8b\xb5\x67\xcf\xd9\xbb\x13\x3f\x25\xd7\x51\xe3\xc8\x6f\xab\xc8\x1e\x4d\xe3\x5c\x9d\x79\x61\xf3\xd3\x33\x12\xb6\x79\x03\x40\x87\x58\x8d\xc3\x1a\xdb\xe8\xaa\x9e\x4c\x71\x95\x24\xe1\xa9\x96\x3d\x6d\xed\x0d\xa8\xb6\xd7\xeb\x1a\x2d\x1a\xd0\x0d\x8d\xb0\x74\x7a\x66\x08\x3b\x93\x17\x48\x87\xd8\x0f\x5c\xb8\x35\x3d\xf5\x65\x91\xcb\x59\x9f\x16\xf8\xb4\x49\xb9\xaa\xbd\xcb\x15\xf9\xae\x1d\xe1\xf5\xe5\x7e\xca\xe6\x10\x48\xcb\x85\xdd\xf7\x06\xa4\x0b\x92\x21\x80\x0f\xa9\x8d\x3e\x92\x62\x69\x01\x8c\xe5\xcc\x86\xf6\xe4\x0b\x93\xfb\x76\x5f\x09\xba\xab\xbc\xa2\x2f\xa3\x0f\x6d\x8e\x87\xd1\xb6\x7b\x9c\x87\x33\x20\x1d\x6c\xcf\xd9\x7f\x0e\x67\x40\x3f\xe8\xbf\x59\x80\x4f\xa8\xd3\x21\xdb\x32\x75\x0c\x03\xbf\x9e\x4b\xee\x68\xf9\x98\xdb\x95\x58\x9c\x5e\xce\xf8\x34\xe1\x17\xcd\x6b\xef\x0a\x21\xd8\x8c\x11\x90\x0e\xd1\x02\xa1\x04\xa1\xcd\xf5\x35\xc1\x21\x6a\x0d\xb7\xe5\x2c\x48\x76\x2a\x15\x4c\x31\xe3\x72\x0f\x4b\x69\xcf\x44\xf8\x0b\xd7\x57\x3c\x60\xcb\xa4\x80\x74\x88\x16\xc8\xe6\x5c\x82\x68\xc9\x5e\x1a\xba\xf3\x9a\xd6\x56\x84\xe9\x29\xa7\x8a\xa2\xff\x00\x8a\xa5\x27\x0a\x2b\x49\x37\x3d\xc1\x4c\x3a\x6c\xe9\x0d\x90\x0e\xb1\x1f\xfc\xd5\x67\xad\xbb\xb4\xaf\x31\x9a\x3f\x98\xab\xb7\x77\xac\x4d\xfb\x68\x61\x32\xdb\x25\x6e\x98\x66\x88\x16\x7d\x43\x8c\x59\x04\x7c\xce\x05\xd2\x21\x5a\x00\xa4\x20\xe1\xc9\xe5\x23\x4a\x81\x4a\x57\xac\x0f\x2e\xce\x61\xc1\x8b\xbf\xb1\xb8\xbd\x61\xa7\x73\x29\xda\xb1\xab\x48\x91\x10\x76\x09\x35\x90\x0e\xb6\xd7\x44\xe0\x3f\x0f\xca\x80\xaa\xeb\xdf\x3c\x60\x55\x08\xce\xa5\x32\x34\xed\xd5\x17\x2a\x97\x11\x51\xbd\xd1\x6c\xb4\x10\x04\x5e\x11\x7c\x5d\x2e\x67\x62\x45\x95\xda\x53\x05\xdb\x77\x08\xa4\x43\xf4\xc0\x8f\x5b\xa4\x83\x94\xa8\x4a\x73\x0f\xdd\x9f\xee\xc7\xe0\xa0\x0b\x71\xe0\x26\x0f\xbf\xd3\x0c\x4c\x57\x95\xad\x6a\x91\x89\xf9\xce\x01\x9b\x98\x07\xd0\x21\x7a\x60\x90\x8f\xa6\x4d\x30\x6f\xf5\x67\x4b\x6a\x4c\xc0\x20\xe1\x55\xbd\x27\x43\x38\xb4\xee\x68\x54\x0b\x4f\xba\x57\x38\xf7\xac\xfa\x60\x47\xde\x03\xe9\x10\xfb\x21\x88\xa4\xae\x33\xe3\x93\x5f\xaf\xb0\x7e\x4f\xd4\x8b\x5f\x97\x89\xba\x92\x39\x34\x8f\x16\xac\x2c\x3d\xbc\xf0\xf2\x8e\x9b\x22\x61\x27\x97\x02\xe9\x10\x3d\xe0\x53\x5d\x63\xad\x5c\xe6\x76\x63\x58\x5f\x0a\xa2\xf7\x89\xef\xf8\x52\x0f\x3a\x3a\x3d\x56\xc6\x7d\xe1\xc0\x0f\x24\x94\xdc\x21\xb0\x99\x33\x20\x1d\x6c\xaf\x09\x40\x38\x03\x7a\xd4\xfd\xcd\x03\x21\x24\xb2\x7c\xed\x86\x4f\x9b\xc4\xe8\x09\xb4\x3d\xdf\xa9\x36\xde\xac\x7d\x21\xfe\xfd\xb9\x6f\xf6\x90\x76\x4b\x09\xdb\x01\x18\xb6\x44\x0c\x48\x87\xe8\x81\x83\xd7\x6a\x5e\xcf\x2b\x2c\x27\x97\xb6\xe3\x46\xfa\x95\x06\xe5\x25\xae\x11\x3a\x47\xe9\xf1\x35\x36\xf3\x5e\x23\x0d\xf0\x63\x81\x2d\x41\x05\xd2\x21\x7a\xe0\xd8\xa5\x10\xc5\x72\x98\x41\x75\x0c\x7d\xf8\x72\xbd\xe0\x55\x0f\xb5\xf2\xcd\x50\xb5\x13\xc2\xdb\x04\xd7\x25\x97\x06\xcb\xde\xc2\xae\x7f\x00\xd2\x21\xf6\x43\xe2\xca\xe9\x9d\x90\xf8\xc2\xdc\x2d\xfc\xc0\x9b\xb7\xde\xeb\x9e\x35\x72\xc6\x0e\xb5\x69\x37\xdf\xa6\xbc\xa3\x9a\x11\x83\xc3\x0f\x9b\x35\x01\xd2\x21\x7a\x00\xc5\x68\xa2\xc3\x6d\x7b\x06\x6b\x0b\x24\x13\xa6\x3f\x32\xdb\xcc\xb6\x80\x7e\xeb\xab\xa8\x84\xb6\xab\xa5\xde\xfb\x22\xb3\xc9\xfc\x73\x0f\x00\xe9\x60\x75\xe0\xf6\x7f\xf6\x00\xd0\xb8\xe3\x6f\x1e\xd0\xde\x7e\xe5\x2b\xd8\x31\xe2\x24\x3a\x2b\x15\xb0\xf9\x5a\x20\x27\x59\x74\x10\xd7\xc0\x37\x9e\xf2\x9d\x7e\x2c\x67\xd5\x6a\x01\xec\xc4\x4e\x20\x1d\xa2\x07\x78\xec\x94\x29\x8b\x0f\x55\xf2\xed\x57\x6d\x5e\xb5\xeb\x7e\xc3\x05\x6b\xa6\xb3\xd6\xef\x71\xaf\x2b\xbc\x6b\xc4\xc4\xad\xf9\xc4\x75\xce\x05\xd2\x5d\x98\x41\xcf\xa0\x52\x6b\x93\xdc\xf5\x57\xb6\x08\x34\x05\x31\x51\x49\xc9\x06\xf7\x06\xf9\x9d\x0d\x95\x05\xed\x3e\xb5\xde\x3b\xfb\x02\xbb\x34\x1e\x48\x87\xd8\x0f\x84\x57\x5f\x7e\x88\xd1\x7e\x19\xd5\xb3\x20\x21\x8f\xae\x8b\xbe\xaf\xd6\x79\xcc\xdb\x17\x37\x1e\x46\x70\x85\xd5\x8e\x67\xbb\xad\xfc\x9c\x0b\xa4\x43\xf4\x00\x96\x47\x2e\xfb\xf0\x9c\xf8\xd8\xad\xb4\xeb\xa6\x98\x2a\xaa\x51\x23\xd0\xc0\x61\xe8\xd8\x7d\x7c\x71\x9d\xd4\x46\x19\x51\x7e\x0b\xd8\xbe\x43\x00\x1d\xac\x0e\x00\x85\xb3\x67\x06\xa5\x34\x41\x4c\x6f\x0b\x83\x41\x28\x64\x71\xaf\x3f\x45\xcf\x24\x0e\x6f\x70\xbc\x10\x71\x5c\x4e\x8a\xbd\xcd\x14\x9f\x47\xf3\x67\x38\x7b\x22\x5e\x51\x91\x19\xdd\x73\x3b\xf4\xfe\x21\x89\xaf\xe8\x76\xf8\x97\x58\x3c\xc3\x8f\x26\x66\xf1\x43\x7d\xd5\x97\x99\x9d\xcd\x55\xfe\x90\xaa\xab\xe6\x0e\x8c\x92\xb2\xc8\x31\xe2\xda\x60\xe0\x5d\xf7\xa8\xc3\x2f\x24\xac\xea\xc9\xbb\x22\xcb\xfe\x34\x74\x40\xaf\xb4\x76\xf3\x7f\x2d\x9c\x01\x35\xed\xcf\x3d\x67\x17\xc2\x99\xf5\xda\xad\xad\x34\xb3\xa7\x77\xc0\x5a\x27\x0b\x79\x0f\xab\x38\x30\x8b\xa4\x40\x93\x4c\x3b\x3f\xdd\xdc\x50\x3e\xe0\x88\x97\x3b\xfe\x93\x49\x9d\x8b\xe1\x4c\x83\x1c\x3a\x7a\xd4\xb7\xb4\x71\x4a\x69\xfc\x2e\x6d\x54\x2a\x15\x5a\x77\x7f\xb5\x29\xe3\x34\x63\x4f\x5f\x63\x38\xfb\xcd\xa5\xa4\x7f\x32\x85\x75\x31\x9c\xb9\xd0\xea\xe7\xe8\x0b\xef\xeb\x7f\x8e\x78\x51\x87\x55\x6a\x60\x75\x4d\xbb\xe0\x67\x4d\x9b\x10\x15\x1e\x59\x46\x00\xde\xcf\x88\x8f\xff\xa4\xb5\x17\xc3\xd9\x2b\x53\xc2\x85\x31\x1d\xb5\xf6\x4e\x7d\xac\xf0\xa8\xfa\xf7\x95\xfc\x6e\x5c\xf9\x10\xa3\x0c\xe2\x8e\xb7\xef\x08\xaa\xe4\xba\xfe\xc9\x3c\x61\xcb\xc5\x70\x56\xb7\x0b\xea\x92\x8e\xc1\x08\xc4\xdd\x89\xa9\xfd\xd9\x18\xf8\x00\xdb\x4f\x3a\x62\x0a\x3b\xfe\xcd\x82\x66\x68\x2b\xa8\x4d\xf8\xca\x3f\x0b\x67\x40\x26\xfa\x5b\x35\xf6\xe0\xa3\xc6\x62\xab\xd5\x6f\x38\x42\x75\x3c\x14\x3d\x78\x80\x45\x53\x2b\xf8\x54\xe9\x63\xf9\x77\xc9\x7d\x6b\xa8\x9f\x29\xc5\x27\xd8\x5a\x2e\x00\x1d\x62\x35\x5e\xf4\xe0\xbc\x49\xb8\x7d\xc8\xdd\x3d\xf6\x51\xde\x8a\x73\xc8\x27\x2a\x3c\xd6\xa2\x51\xec\x56\xf6\xed\xf5\x69\xb2\x9b\x59\xe4\xb0\x75\x0c\x40\x3a\xc4\x6a\x5c\xff\xb9\xed\x95\xc6\xbe\x38\xaf\x60\x70\xe3\x48\xe1\xc2\x9b\x19\x11\x0d\x68\xf6\x9a\x59\x33\x95\x0e\xeb\x03\xe3\xf6\x2f\x4a\xb0\x0d\x52\x40\xba\x0b\x4f\x25\xf5\x15\x21\xca\x41\x23\xb4\x98\xe9\x17\xdb\x6f\x9b\x0d\xae\xf5\xe0\xe5\x8a\x5d\xf6\xe8\xd5\xf9\xd0\x9b\xd4\x24\x1e\x33\x7e\x17\xf6\x54\x02\xd0\x05\xc9\xa0\x80\xe0\xc2\x64\x77\xb2\xc8\x25\x75\xbf\xa3\x41\x1c\x35\x1c\xbd\x53\x28\xba\x36\x98\x6c\xb6\x2f\x88\x8a\x17\x5f\xb9\x92\xb3\x4a\x84\x40\xe8\x3c\x9c\x01\xe9\x60\x7b\xce\xfe\x73\x38\x03\xfa\x41\xff\xcd\x02\xb5\x9a\x31\xbb\x54\x25\x38\x1e\xe5\x9f\x72\xbf\xcd\xca\x76\x7e\x65\xdb\xd0\xdf\x76\xaf\x2d\x55\x64\xcb\x28\x9a\xf7\x14\xa1\x76\x3f\x6f\x3a\x90\x0e\xd1\x02\x45\x9f\x34\xc7\xd7\x7b\x0b\xb5\xc7\x30\xc2\x6c\x92\x77\x77\xd2\xe4\xe3\x4d\xa4\xc0\x37\xbf\xef\xcf\x94\xb8\x0c\xa6\x3d\x0f\x62\x3b\xe7\x02\xe9\x10\x2d\x70\x7b\x8e\x17\x7b\x42\x4a\x3e\x8c\x48\x0e\xcc\xd0\x6c\xda\x5a\x1a\x5b\x3b\x6a\x69\xe5\x52\x0e\x15\x56\x4c\xd4\xf5\x0a\x78\x09\x3b\x13\x06\x48\x87\xd8\x0f\x2f\xe7\x7a\xc0\xd9\xef\x22\xb1\x7f\x4c\xbb\x6e\x27\xd1\xc8\xe0\x8d\xcc\xd0\x14\xa3\xe3\x6d\x2e\xf9\xe0\x60\x83\x31\x53\x2d\x61\x07\x98\x00\xe9\x10\x2d\x90\x55\x90\x7e\xc5\xa1\x32\xbd\x2a\xfa\xe7\xbd\xd9\x4f\x62\x4a\xbb\x06\x5f\xfd\x69\x83\xec\x48\x30\x45\x4f\x67\x12\x53\xee\xdd\x2b\x39\x7f\x20\x03\xe9\x60\x7b\x4d\x00\xc2\x19\x50\x75\xfd\x9b\x07\x02\x30\x94\x6c\xee\xf3\x57\x51\x96\xec\x9e\x5a\x2f\x27\xec\x11\x4a\xcd\xa3\x68\xec\xda\x7f\xb3\x42\x9b\xba\x69\x93\xde\x8f\x0f\x3b\x64\x05\x48\x87\xe8\x01\x9a\xac\x26\x6b\xe3\x1b\xb9\x77\x75\xd9\xb2\xde\xd0\x26\xa0\x61\xba\x67\xf5\x64\xdc\xa9\x3e\xda\x9b\x5d\xe9\x70\x44\xc7\x55\x0e\x38\xe7\x02\xe9\x10\x3d\x70\xcf\x7a\x23\x5b\xcb\x17\x07\x25\x14\xaf\xf5\x46\x0e\xaa\xa0\x90\x69\x5f\x7f\xf4\x13\xa7\xf5\x85\x01\x93\x7e\x0e\x7a\x1c\x57\xd8\xc9\x82\x40\xba\x0b\x33\x67\x91\xcc\x1e\x6a\xee\x65\x83\xbf\x24\x6a\x30\xbe\x73\x8d\xe0\xa0\x28\x3c\x99\x11\xcf\x97\x54\x0c\xf1\x37\x30\xcf\x1f\x4f\x82\x5d\x9a\x0d\xa4\x43\xf4\x40\x21\xf9\xf6\x6e\x89\xf3\xf5\x54\xac\x88\x8f\xbd\xca\x25\x3d\xf4\x91\xf9\x6c\x82\x76\x75\x3c\xef\x5e\x5b\x9b\xee\x12\x3a\xd8\x99\x9f\x7b\x00\x48\x07\xdb\x6b\x02\x10\xce\x80\x1e\x75\x7f\xf3\xc0\xc3\x43\x1a\xf2\x1c\x93\xc8\x25\x0d\x13\x94\x2f\x37\xb0\x7d\x9c\xe7\xb1\x36\xa8\xb8\x02\x6e\x85\xf3\x6b\xa1\x61\x13\x0d\xe2\xc1\x06\xa4\x40\x3a\x44\x0f\x60\x33\x9f\x9e\x08\xaf\x72\xe9\xc7\xb7\xf4\x10\xbf\x61\xcc\x0c\xa8\x52\x7e\xe3\xc8\x33\xc5\xfc\xa3\xaa\xa2\x49\x42\xab\x27\x11\x56\x5f\x80\x74\x88\x1e\x18\x7f\xee\x27\x71\xb9\x8e\xd4\xbe\x9b\x82\x51\x7a\xb5\x5d\x05\xc4\x1a\x50\x99\x45\x26\xae\xb0\xbc\x68\xcb\x70\xbf\x82\x40\xfa\xfd\x39\x17\x48\x77\xe1\x32\x6e\x5b\x89\xe7\x2b\x58\x6f\x2b\x8d\xee\x05\x4d\x2c\xd1\x3c\xb9\x24\xbc\xd4\x15\x83\x7d\xd4\x50\x67\x41\xb4\xaa\xbb\x04\x19\x91\x80\x1d\x32\x01\xa0\x43\xf4\x00\x8b\x41\x01\x46\x9e\x8d\x84\xf8\xdd\x9e\x8e\xe8\x3c\x97\xc9\x1b\xdf\x76\xfc\x1f\x7d\x77\xc5\x63\xf2\xa2\xf5\x6f\x67\x79\x09\xf9\x09\x3b\x18\x08\x40\x07\xab\x03\x00\xe1\x0c\x68\xdc\xf1\xd7\x43\x61\xf0\x08\x7b\xaa\xb6\x04\xaa\xa8\x7f\xfa\x61\x2f\xe2\xa6\xe3\x0a\x1a\xbf\xc6\xc7\xb8\x6d\x2f\x8d\xb5\x1d\x36\x10\x2a\xfd\x13\xf6\x72\x02\x48\x87\xe8\x81\x62\x9e\xca\xcd\xf5\xe2\x25\x6e\x3f\x1a\xaf\x15\x6b\x0d\x06\x73\x76\x71\x9b\x1d\x5e\xcb\x0e\xcd\x67\x91\x13\x2f\xbc\xcb\x4c\x61\x37\xf6\x00\xe9\x10\x3d\x20\x90\x12\xaa\xf1\x16\x53\x0e\x74\x4d\x1e\xb3\x77\x42\x79\x95\x90\x52\x10\xdc\x23\x56\x9b\xca\x47\xf0\xa1\x43\x54\x9b\xd5\x12\xb6\xf0\x07\x48\x87\xd8\x0f\xdf\x15\xbd\x40\xd6\xde\x9d\xfa\x77\x8e\xe4\x35\xfa\xab\x3f\xbe\x7d\x27\x9f\x8e\x92\x8a\xcf\x15\x10\x3b\xad\xc8\x22\x22\x15\xe9\x76\xce\x05\xd2\x21\x7a\x80\x66\x07\xb7\x8b\xeb\x4a\x4e\x06\x5d\x67\xb2\x0e\x6d\x65\xa7\x06\xd7\xd7\x37\xfb\x0b\xf6\xa5\x41\xef\xd1\x5c\xb6\x47\x36\x30\x60\x01\x1d\x48\x07\xab\x03\x40\xe1\xcc\xf0\x71\xfe\x5b\x52\x83\x80\x2e\xe5\xb7\x65\xbd\x2f\xdb\xc6\xb1\x34\x6f\x04\xc6\x6d\x53\xf1\x48\xf9\xa4\x1b\x7f\xa0\x3f\x20\x96\xfe\x33\x9c\xa5\x6f\xb7\xd1\x1c\xdf\x1d\xf4\xc2\x53\xd9\x3a\xd5\x96\xb5\x3d\x65\x34\x54\x43\xc7\x77\xdf\x91\x7b\x4d\xf7\xdc\xb7\x38\xea\xe3\xe0\x9f\x2f\xdd\x0e\xee\x7b\x6d\x7d\x13\xd1\x6e\xd2\x53\x7e\x79\x99\x62\xe9\x76\x30\xce\x60\xb9\xac\xca\x5d\xbd\x2f\x39\x92\x67\xd8\xae\xc4\xcf\xff\xd7\xc2\x19\x50\xd3\xfe\xdc\x73\xa6\x8c\x38\x80\x1f\x36\x31\x2f\x24\xdc\xaf\xbb\xb1\xec\x79\xc9\x9e\x9d\x95\x14\x07\x9b\xc2\x14\xf4\xf8\x98\xea\x0e\xdb\xd6\xc2\x48\x01\x81\x20\xfb\x3f\x99\xd4\xb9\x18\xce\x50\x95\x13\x88\x31\x9e\xf7\x7c\x24\x57\x32\x66\xad\xfa\xd9\x32\x85\x21\xeb\xdd\xea\xbb\xc9\xaa\xaa\x62\x14\xdf\x64\x31\x24\xbb\xf2\x4f\xa6\xb0\xb4\x2e\xee\xc2\xba\xd3\xb2\x51\x94\xe2\x23\xf4\xde\xa9\xd2\xfc\x9b\x41\x89\x8a\x1d\xc5\xe2\x7b\xfe\x1f\x1f\xa8\xb8\x3c\x35\xba\xe3\xe5\xac\xd4\xff\x49\x6b\x2f\x86\xb3\xeb\xa1\x8a\x6b\x28\xbe\xfa\x72\x8f\x99\x5f\x81\x34\xf8\x94\x6e\xc5\x17\x29\x77\xb5\x33\x89\xd7\x3f\x48\xdb\x7e\x74\xe3\x90\x9f\xe7\x9f\xb4\xd6\xf3\xe2\x25\xd4\x16\x29\x6e\xc7\xea\xd6\x39\xd2\xea\xd1\xba\x03\xe8\xbb\xb5\xe8\x19\x41\x84\xe0\x9b\x66\x1e\xda\xae\x8f\xe6\x7f\x45\x66\xd4\xfd\xb3\x70\x06\x64\xa2\xbf\x55\x63\xb4\x17\x18\x8e\xae\x5f\x4b\xc7\x70\x30\xb4\x19\x74\xfc\x02\xf3\xd5\x9a\x8d\x84\x54\x18\x6c\x29\xfb\x5e\x05\x36\x71\x78\x64\xc0\x6e\x0a\x06\xd2\x21\x56\x63\x68\xc6\x4f\x82\x75\x8d\x43\xbd\xd3\xfc\xe9\x77\x21\x83\x2a\xa7\xfb\x55\x10\x7f\xe9\x0d\xf5\xf2\xc4\xb9\xfb\x0e\x5f\x3d\xdc\x06\xce\xb9\x40\x3a\xc4\x6a\x3c\xe4\xfb\xdc\x5f\xff\x4b\xbc\xcb\x06\xf4\xd8\x29\xd1\xb3\xe4\x45\x3f\xe1\xe1\xb5\xe6\x81\xed\x5c\x8b\xeb\x74\x3f\xd3\x5f\x62\x6a\x9c\x73\x81\x74\x88\xfd\xb0\x70\xed\xe7\xb0\x0b\x9d\xcf\x93\x6f\x56\xed\xe4\x3b\x1a\x78\xef\xab\xf4\x47\x23\x27\xb9\x28\xaa\x1d\xd1\x0a\x21\x16\xb8\xd5\x53\xe7\x5c\x20\x5d\x90\x0c\x0a\x01\xdc\xd3\x8e\xd8\xe0\x4e\x62\x19\xd6\x26\xa5\x51\x0d\x95\xfb\x80\x97\x92\xf9\x03\xb9\xaf\xc4\x33\x12\x2b\x86\x01\xdd\xa8\x57\x05\x55\x03\xcf\xc3\x19\x90\x0e\xb6\xe7\x4c\xf9\x3f\x3e\x90\x81\x7e\xd0\x7f\xb3\x40\xee\xaa\x7c\x54\xb3\x26\xb3\xb5\xfb\x82\xf1\xf2\x68\x29\xea\x97\x82\x1c\x5d\x36\x3f\x01\x4b\x51\xfd\xc2\xb7\xb2\xf7\x33\x9e\xc0\x06\xd0\x40\x3a\x44\x0b\x3c\xe9\xc3\x35\xb5\x66\x7e\xc9\xfe\x4b\x34\x6b\x33\xb4\xb9\x7a\xef\xf4\x0c\x6b\xed\x9b\xd2\x24\xce\x5b\x93\x43\x2c\x8b\xa7\xf2\x7b\xb0\x6d\x7c\x00\x3a\x44\x0b\x48\x92\x80\xe2\x3a\x92\x35\x86\x2e\x61\x30\xf5\xbf\xeb\x9a\x76\x8d\x96\xd9\x2b\xc6\x69\xf7\x1a\xaf\xbe\xba\x85\x59\xf4\x86\x11\x76\xa9\x2d\x90\x0e\xb1\x1f\xd2\xef\x6e\x84\xbc\x39\x9b\x1d\x67\x3c\x9c\x3b\x96\xa5\x0d\x78\xfe\x2a\xb2\x53\xf6\x31\xea\xb8\xe3\xc2\x33\x4c\x0f\xb7\x21\x4d\xd8\xe0\x14\x48\x87\x68\x01\x47\xf5\xc3\x15\x0e\x6b\xc6\xab\x1c\xee\x15\x63\x22\xc7\x8f\x66\xbb\xd8\x34\xdc\x79\xae\x91\x8b\x4f\x8f\xf8\xf3\x06\xf6\x12\x63\x9f\x3f\x90\x81\x74\xb0\xbd\x26\x00\xe1\x0c\xa8\xba\xfe\x75\x49\x1b\x5b\x18\xf9\x66\x91\xcc\xfd\x57\x79\xd4\x55\xd5\x77\x06\x44\x49\xed\xdb\xcc\x21\xb1\x13\x5a\xd1\x27\x9b\x45\x63\x65\x53\x4b\xb0\x25\x6d\x00\x3a\x44\x0f\x50\xe6\xba\x16\x86\xb1\xe9\xb6\xdf\xd7\xeb\xee\xfa\x70\xf8\x90\x99\x51\xfb\x32\x67\x7e\x96\xd3\x31\xde\xe5\x65\xcb\x8c\xdb\xc9\xb0\xcb\x5c\x81\x74\x88\x1e\xa0\xbd\xd2\x96\x40\xf5\x51\x4b\xed\xa9\x54\x7b\x67\x9b\x15\xd5\xd9\x57\x3f\xef\x29\xca\x4b\xcb\xcb\x61\x9f\x5b\xe3\xb0\xcb\xd6\x60\xb3\xbd\x40\x3a\xc4\x7e\x30\xdc\xba\x26\x78\x57\xc9\x7f\xc9\xa7\xc2\x6c\xc4\x67\x2d\x57\x65\x2f\x22\xe2\x21\xdd\xf0\x03\x4b\x3a\x6f\x2b\xd0\x27\xcb\xdd\xf4\x73\x2e\x90\x0e\xd1\x03\xc1\x85\x13\xb1\x14\x57\x75\xd2\x7c\x2f\x97\x5d\x59\xa5\x8f\x75\xd9\xa1\x16\xfc\x31\xf1\x95\xb3\xf1\x4a\xb7\x0d\x9e\x80\x58\xd4\xc7\x73\x0f\x00\xe9\x60\x7b\x4d\xb4\x00\x96\xb6\x02\x3c\xea\xfe\xe6\x81\x07\x8f\x2b\xf8\x1d\x40\x5a\x35\x47\xc4\x54\xdd\xf5\x3b\x6b\x8c\x3c\x7e\xc1\x26\xb7\xdf\x30\x7b\xe2\xc5\x12\x27\x97\xce\x47\xc2\xda\x0e\xa4\x43\xf4\x00\x15\xe6\x62\x76\x67\x08\x7a\xab\xa8\xf6\xa2\x34\x9e\x01\x23\x2b\xea\xc6\xdb\xc7\x56\xfe\x75\xd3\x06\xbd\x6e\x75\x7b\xfa\x5b\x30\x0f\x00\xe9\x10\x3d\x50\xeb\xa7\x71\x22\x6b\xb6\x83\xdf\x55\x3c\xca\x46\x25\xf0\x50\x73\x63\x19\x33\xe2\x94\x49\x98\xd1\xda\x21\xa8\xc5\xf4\x23\x2e\xec\xc0\x21\x20\x1d\x62\x3f\xa0\x0e\x8a\x90\x31\x34\xfc\xa8\x1b\xfb\x86\xf7\xfc\xab\x67\xbe\x06\x4e\x1b\xee\x47\xae\x83\xc5\x14\x7c\x23\x0f\x6c\x43\x99\x40\xd8\x23\x11\x48\x87\xe8\x81\x04\x22\x9a\x83\xb6\xb8\xda\xc8\x43\xec\xa4\x95\xcc\x92\x77\x09\x11\xad\x6c\x97\x93\x6e\x66\x92\x8a\x92\x3c\xb5\x70\xf0\x0b\xcd\x3c\xf7\x00\x90\x0e\x56\x07\x00\xc2\x19\xd0\xb8\xe3\x6f\x1e\xa8\xbb\xca\xdf\xd1\xa6\xfb\xae\xd3\x7a\x25\xd2\xd7\x69\x2c\x9d\xaa\xc1\xd6\xb9\x7a\xf9\xfb\x6b\x7b\x5e\x8d\x8d\x67\x5a\x5d\x4d\xb7\xcf\xdb\x0e\xa4\x43\xf4\xc0\xa9\x9b\xee\x9b\x4d\x95\x2d\xe3\xda\x9b\xde\xa7\x10\x43\xc6\x66\xc2\x55\x49\xf4\x9f\x33\x27\x1f\x6d\x2a\x73\x99\x56\x9a\x52\x60\x57\x75\x00\xe9\x10\x3d\x70\x47\x4e\xf0\x1a\x91\x8a\xff\x70\xbd\x5c\xc3\x61\x03\x55\xe3\xe2\x2e\xea\x37\x01\x5f\x76\xbc\x75\x5b\x6e\xc2\xc4\xef\xc3\x3f\xfc\xce\xb9\x40\x3a\xc4\x7e\xb8\x73\xd7\xd2\xf0\x8d\xbc\x0d\x47\xd9\x81\x09\xd3\x63\x82\x5e\x9d\xfc\x52\xe3\x04\xb0\xf5\x5a\x61\xab\xec\xac\x94\x6f\x54\x58\x11\x8c\x0b\xa0\x43\xf4\x00\xfb\xf3\xd4\xf8\x55\x5e\xdc\x91\x96\xb8\x7b\x71\x2f\x64\x3c\x34\x7f\x28\x70\x12\xa6\x1d\x35\x96\x75\xb9\xe6\x25\x99\xd2\x85\x4e\x9f\x7b\x00\x48\x07\xab\x03\x9e\x00\xe1\x2c\x09\x54\xfa\xf2\xde\x5e\xf3\xe5\xef\xd6\x05\xf9\xd5\xd0\x4e\xae\x47\xf2\xe6\x64\x66\x44\x71\xe9\x25\x63\xee\xa6\x62\x6a\xcd\x4d\x7f\x86\xb3\x26\xe6\xf0\xc1\xf8\x1f\x4c\xd7\x3c\x75\x57\x2c\x3f\x43\xb1\x12\x5e\x8a\xef\xac\x7a\xa2\x3b\xf6\x77\x32\xf3\x15\xd6\x99\xe6\x2c\xfd\x21\x7d\x9d\x55\x4c\x63\x93\xf6\x44\xaf\xff\xf1\x1b\x6f\xac\x0c\x79\x42\xaa\x67\x1f\xe6\xf1\x97\xd5\xd5\x27\x3d\x0a\xcb\x8a\xaa\x2d\x21\xff\x6b\xe1\x0c\xa8\x69\x7f\xee\x39\xbb\x10\xce\x0a\x8a\x66\x50\x9b\xd4\x5b\xdb\x74\x82\x6f\xa6\xc5\x8b\x86\xc5\x5c\xba\xb3\x70\x95\x42\xcd\x5b\x99\xdb\x8c\xbd\xc1\xf3\xc8\x3d\xed\x9f\x4c\xea\x5c\x0c\x67\xc7\xe8\x73\x92\xf7\x43\xf7\x9e\x3f\x88\xc9\xba\x69\x60\x5a\x62\xa2\xba\x48\x8c\x17\x4d\xcb\x2c\xd2\xe6\x21\x84\x6d\xfd\xec\x0c\xfa\x4f\xa6\xb0\x2e\x86\xb3\xc6\xe6\xd1\x2b\x1b\x67\xe1\x3c\x41\x24\xd6\x84\x3b\xe2\x62\x43\xda\x8b\xac\x20\x68\x87\x28\xfb\x37\x6f\xbe\x2c\xb5\x9b\x64\xff\x64\x35\x65\xcb\xc5\x70\xc6\xa6\x16\xdd\xa3\x4b\x86\x72\x0f\xe5\x5e\xa6\x5b\x30\x4b\xc9\xc9\x08\x8e\x63\xfe\x70\x4b\xd5\xe4\xb3\xc6\xeb\xd2\x3f\x19\x59\xff\xcd\x91\x98\x17\xc3\x59\x8c\x62\x6f\xd3\x60\x41\x47\xc1\x88\x75\x32\x67\x67\x56\x1d\xae\xa6\xcc\xc3\xf6\x0d\x59\x91\x4f\x52\x0d\x7a\x8f\x54\xd0\xb9\x3a\xff\x59\x38\x03\x32\xd1\x5f\x17\x99\x63\x3d\x4a\x30\x6b\x12\x91\x59\x6b\x9c\xaf\x0c\x99\x1c\x8d\xbe\xf6\xc8\xb7\x9c\xc5\xe3\x15\xd7\x5d\x90\x2a\x97\x98\xc5\xd0\x4b\xd8\x22\x73\x00\x1d\x62\x35\xbe\x29\x1a\x47\x2b\x8d\x7d\x49\x84\x7a\xcd\x38\xeb\xa5\xb7\x87\x59\x4c\x7f\x21\x46\x1c\x5d\x14\xcf\xcf\xd5\xbd\xe5\x22\xb6\x25\xd8\x2e\x70\x20\x1d\x62\x35\xee\x34\xea\xac\x79\x3e\x60\x2a\xa7\xd8\x44\x9d\xb0\x8d\x1a\x77\x73\xb0\x8d\x7e\x54\x84\xa5\xd9\x62\x64\xe4\xae\xe1\x2b\x3d\x5e\xd8\xeb\x52\x20\x5d\x90\x0c\x1a\xdc\xf7\xd5\xe2\x7e\x71\x9c\x85\x99\x15\x37\x12\x7d\x53\x6c\x69\xc1\x84\x0a\x7d\xe1\xcb\xa5\x2b\x55\x6f\x39\x75\x24\x43\x8b\xee\xae\x3d\x81\xdd\x3c\x0a\xa4\x43\xdc\x59\x1c\x56\xc7\xe6\x6f\x9e\xc6\xfa\x98\x57\xb8\xfe\x39\xf9\x0f\x1a\x0d\x5d\x4d\x7b\x11\x7d\x4d\x69\x4f\x85\xf1\x50\xaf\x49\x75\xa7\x27\xb0\x99\x33\x00\x1d\x6c\xcf\xd9\x7f\x0e\x67\x40\x3f\xe8\xbf\x9e\x09\x93\xbe\xac\xe4\xbf\x60\x36\xe9\xc6\xc9\x84\xd2\x4b\xbb\x76\x85\x9e\x26\x2a\x8d\x3a\x9f\xcb\x8c\xba\x8f\x69\x50\x8a\x4e\x00\x16\x76\x80\x74\x88\x16\x00\x0f\xde\x02\x57\x07\x9d\x52\xdd\x69\x20\x55\xb5\x20\x11\x92\xac\x63\xc7\x7c\x5c\x3c\x74\x3b\x22\xf9\x30\xa4\x37\x7d\x35\x32\x10\xb6\xb1\x1e\x40\x87\x68\x01\xaa\x04\x5a\x7f\xfe\x8e\xcc\xc5\xb3\x2e\xd0\xb3\x5e\xa3\x6a\x1b\xba\xbd\xbc\x07\x2d\xbe\x53\xa0\xed\x2c\xad\x3a\xae\x18\x7d\x58\xe8\x03\xd2\x21\x5a\x20\x3e\xe3\xca\x68\x43\x84\xce\xc1\x15\xe2\xcc\xab\x07\x02\xf7\x9c\x38\x47\xdb\x62\x0d\x93\xe4\x59\x1d\xdc\x1d\x14\xee\xa1\x76\xf9\x9c\x73\x81\x74\x88\x16\xf8\xd9\xbf\xae\xed\xaf\xa6\x24\x7f\x53\xfc\x27\x03\x44\x4d\x5b\x35\xd7\x52\x83\xf7\x34\xe8\x31\x41\xa4\xc3\x41\xfe\x0a\xd7\x1b\xac\xf3\x07\x32\x90\x0e\xb6\xd7\x04\x20\x9c\x01\x55\xd7\xbf\x79\x80\x6b\x63\xb3\xf7\x8d\xde\xb1\xa4\xa4\xb8\x0b\x31\xf3\x0f\x69\x9b\x59\x0a\x74\x6d\x1d\x86\xea\xc9\xe6\xd8\x82\x19\xfc\x3d\x63\xd8\xc0\x1c\x48\x87\xe8\x81\x52\x09\x35\x9e\xef\x11\xf3\x84\xf4\x71\xa6\x21\x7b\x51\x6f\x22\xbe\xe8\x7e\x27\x51\x14\xfb\xb4\x70\x6c\xba\x12\x95\x7b\xb4\x0b\xbb\xdb\x1d\x48\x87\xe8\x81\x4f\x0e\x50\x6f\xcc\x5b\x83\x2d\x6b\x86\xc1\xfc\xa7\xba\x4b\xf3\x39\x7d\xa6\xd0\xaa\xa7\x6f\xb3\x3a\x0c\x4b\xec\xdc\x6c\xfa\x1a\x60\xa7\xbf\x01\xe8\x10\x3d\xc0\xde\xbe\x7a\xef\xb3\xdb\xb3\x6e\x21\x13\x41\x86\x9e\x7e\x67\xed\xcd\x68\xa1\xd4\x15\x50\x70\x7e\x91\x38\x6f\x1b\xa5\x8e\x20\x6c\x99\x14\x90\x0e\xd1\x03\xe6\xb6\xb7\x0f\xdb\xdf\x5f\x22\xd2\x79\xca\xc7\x73\x6b\x2f\xb1\x87\xf4\xc1\x67\x4b\x41\x51\xae\x4b\x1f\xa4\x8d\x0b\xba\xfc\x72\x5a\xcf\x3d\x00\xa4\x83\xed\x35\x01\x08\x67\x40\x8f\xba\xbf\xee\x3b\x7c\xbf\x49\x2a\x9f\xb2\x10\x69\x34\x19\x06\x8e\x67\xcf\x5d\x4a\xbc\x9e\x2d\x1d\x8c\x5a\x37\x76\xe9\x4b\xee\xeb\x06\x6d\x21\xd8\xfe\x1d\x20\x1d\xa2\x07\x34\xa7\x38\xee\x2a\xb7\x29\xf4\x66\x9c\xbc\xaf\x43\xbd\x86\xa2\x13\x64\xb5\x26\xa8\xb0\xeb\x41\x26\x87\x43\x4a\xfa\x41\xa4\x14\x76\x20\x30\x90\x0e\xd1\x03\x74\xa0\x31\x59\x5d\xbc\x70\xb2\x8f\x12\x41\x71\x76\x02\xd8\x01\x1a\xef\x32\xbb\xe7\x75\x68\xee\x40\xd6\x8b\x71\x7e\x7c\xcb\x9a\x3e\xe7\x02\xe9\x10\x3d\x80\x2b\x36\xfa\x4b\xcb\x08\xf3\xa0\xbf\xb2\xec\xa4\xf6\x87\x7a\x94\x9a\x60\x53\x54\xa1\x45\xdc\xa3\x31\x45\xe1\xab\x3c\x0f\x4d\x60\xb3\x26\x40\x3a\x44\x0f\x50\x25\xac\xea\x2d\x61\x3a\x57\xc5\x3a\x6f\x4d\x59\xf4\xdd\xb0\xa7\x0c\x5d\xed\xc4\xbb\xac\xbf\xba\xd1\xf9\x40\x1b\x02\x5a\xe1\x3c\xf7\x00\x90\x0e\x56\x07\x00\xc2\x19\xd0\xb8\xe3\x6f\x1e\x60\xb2\x65\xd5\x2d\x9c\xb8\x4c\x3b\xf2\xdd\x0c\xc3\xcb\xab\x78\x2b\xd0\xa2\xf8\x55\x87\xb8\x80\x38\xa9\x3e\x77\x33\xa6\xb7\x57\xcf\x79\xdb\x81\x74\x88\x1e\x60\xb6\x50\xa5\x45\xfd\xf4\x45\xa5\x67\xef\x66\xc4\x57\xc5\xba\x66\x1f\x51\xde\x2f\x05\xad\xa9\x06\x54\x0b\xa5\x36\x49\xa4\x63\xb0\x0b\xc3\x81\x74\x88\x1e\xe8\x08\xba\xe2\x21\x31\x90\xf1\x99\x8d\x2a\xc7\xfd\x31\x47\xff\xc7\xda\x01\xad\x5a\x16\x15\x47\xa3\x57\x67\xf7\x4a\x65\x1f\x87\xc3\x56\x3b\x00\xe9\x10\x3d\x90\x56\x4f\x65\xaa\x34\x72\x1d\x35\x1a\x5a\x5e\xc8\x90\x58\xe4\xf8\x8a\xa2\x48\xaf\x34\x23\xb1\x21\x26\xa1\x13\x65\x84\x04\xd7\xfc\x9c\x0b\xa4\x43\xf4\x40\xa6\xa4\xf4\x1a\xe4\xf2\x7e\xf9\x72\x2a\x75\xc0\x27\x81\x3d\x7b\x86\x3b\xfb\xde\x3c\x7d\xeb\x62\x0c\x41\x4d\xe8\xe1\x0a\xae\x3b\xe7\x1e\x00\xd2\xc1\xea\x00\x50\x38\x33\x7e\x3b\x94\xda\x6b\x5c\x48\xe8\x38\xd5\xe2\x9a\x6a\xd4\x54\x3c\x9e\x4a\x88\x66\xbc\xd3\x46\x8a\xfa\xc8\x51\xe3\xce\xa5\x1c\xa9\x3f\xc3\xd9\x40\x02\x86\x62\x47\x2f\x1e\xfa\xbb\x04\x31\x9a\x78\x95\x5f\xf3\xbb\xed\x47\x4d\xd1\xb4\x57\x36\xcd\x9d\x58\x17\x45\xe7\xa9\xef\xff\x21\xbd\x2a\x76\x88\xaa\x84\xbf\x55\xdf\xf6\x49\xc8\x79\x22\xc4\xfa\x8b\x90\xf7\xd7\x1c\x22\x94\x88\x94\x67\xc4\xa5\x33\x3e\x8e\xb4\xd6\xff\x6b\xe1\x0c\xa8\x69\x7f\xee\x39\xbb\x38\x73\xd6\x49\x51\x66\x52\x16\xbb\x53\x7e\x49\x90\xd4\xb3\x8a\x13\x7f\x43\x9a\x4a\x0d\x63\x46\x98\x99\x5a\xed\x4e\x07\x0f\xf7\xa9\xde\x3f\x99\xd4\x11\xbc\x90\x1b\x40\x92\x45\x99\x54\xc6\x65\x4e\x81\x47\x95\x8e\xa5\xe5\xf5\x1a\x14\x8c\x2f\x92\x9f\xbd\xd6\xd2\xbf\x0b\xa9\x55\x0d\x54\xea\x79\xf7\x4f\xa6\xb0\x2e\x86\x33\x3b\x36\xac\x16\x91\x34\xb4\x7a\x51\x0c\xfd\xe1\xc9\x9a\x31\x12\x97\x14\xad\x2e\x7a\x82\x5e\x26\x47\x55\xf0\x24\xdb\x8a\xf5\xbf\xd9\x61\x67\x72\xf1\xe2\x80\x75\xa1\xc2\xb7\x4e\x9a\x74\x9e\xf9\x29\x49\xb4\x24\x3c\x23\xe6\x99\x6b\x0e\x82\x1f\x13\x63\xca\xfa\x18\x72\x4c\x69\xa6\x41\xff\xa4\xb5\x17\xc3\xd9\xab\x13\xf4\x7e\x9e\x62\xd6\x65\xb9\x39\x29\x0d\x87\x28\x9c\xce\x2a\x9a\x5e\x01\x19\x1b\x87\xcf\x82\x6f\xf1\x53\x89\xec\xed\x96\xfe\xdd\xcc\x19\x80\x89\xfe\x56\x8d\x9d\x78\x5b\xe3\x4b\x7d\x1e\xac\x3a\xe2\xd4\x5f\x39\x1b\x65\xc9\x6c\xe4\xa3\xc5\x1c\x24\xd7\x37\x0c\x72\x14\x67\x2d\x9f\x7d\xbc\x7b\x5e\x85\x80\x74\x88\xd5\xb8\x89\xa1\xa9\x33\x49\x9e\x51\x81\x51\xfa\xee\xed\x54\x69\xad\xd8\x61\x9a\x65\xca\xe9\x4a\x70\x87\xb6\xcd\xaa\x0c\x57\xed\x7e\x2d\x6c\x6d\x08\x80\x0e\xb1\x1a\xa7\x11\xe9\x51\x04\x2d\xce\x41\x8e\xbb\xd6\xd3\xd6\xf6\x45\x87\x84\xf8\xf9\x50\x4e\x83\xf7\x7c\x4f\x76\x12\xfc\xc5\x21\xf3\x2b\xb0\xaa\x09\xa0\x43\xac\xc6\x74\xdd\x3a\x01\x77\x24\xe3\xbc\x95\x30\x4a\x5e\xd2\x89\x79\xdc\xec\xa7\x99\xd3\x40\x1b\x90\x0b\xb3\xa1\x49\xa2\x86\xda\xc6\xc3\xaa\x31\x90\xee\x77\xd5\xfc\x93\x2b\x75\xe3\x56\x06\x76\xd3\x72\xec\x67\x79\x86\x7d\x8d\xa0\xe9\xf7\xe6\x98\x6b\x0d\x3e\x9d\x35\xe5\xc3\xc6\x51\x58\xec\x4f\x8a\xe3\xcf\xc3\x19\x90\x0e\xb6\xe7\xec\x3f\x87\x33\xa0\x1f\xf4\xdf\x2c\x30\x57\xd0\x34\x3f\xf8\x69\x7c\xbc\xed\xcc\x55\xc3\x34\xe7\x59\x9d\x48\x79\x1d\x91\x7b\x16\xb5\x08\x98\x51\xc5\x9d\x5e\xf2\xb3\xed\x79\xd3\x81\x74\x17\x8e\x4f\x7e\x0d\xf6\x7e\xe0\x65\x4a\x39\xfe\xdd\xcc\xb8\x56\x69\x02\xa3\x32\x85\xee\x6a\xe9\xfe\xe3\xdc\xe6\x62\xf0\x9c\x3b\xa6\x30\x6c\x76\x03\x48\x87\x68\x01\x4f\xaf\xbe\x24\x32\xd2\x8a\x83\x94\xfc\x79\xcf\xc2\xa9\xee\x70\xed\x4e\x9e\x40\x09\x51\xbd\xc7\xee\x7d\x6d\xc9\x37\x6f\xf7\x0b\x9f\x73\x81\x74\x88\x16\x40\x7f\x33\x32\x57\x6d\xf7\xf1\xae\x16\x93\x8a\x9c\x90\x9a\x79\xa1\xf3\x48\xb4\x7d\x56\x45\xd2\x44\x67\x64\xc3\xcd\x03\xc5\x50\xd8\x85\xa6\x40\x3a\x44\x0b\xf0\x7c\x9c\x88\x85\x70\x94\xbf\xe1\x0e\x2e\x4e\xc2\xbc\xd1\xb6\x9b\x97\x86\xd5\xf9\x75\x2a\x31\x60\xf8\xf1\x54\xaf\xe1\x49\x7e\xce\xf9\x03\x19\x48\x07\xdb\x6b\x22\xf8\x9f\x07\x65\x40\xd5\xf5\xaf\xd7\x29\x2c\xd2\x90\x30\xb2\xbf\x51\x35\xc4\x03\xbd\x9e\xbf\xde\x13\xef\xe7\xae\xa8\xf1\x9a\xc6\x30\x93\x9e\xdb\x6e\xf5\x4d\x0a\x31\x6c\x39\x1f\x90\x0e\xd1\x03\x71\xf7\xfc\x93\xae\x3a\xe5\xd1\x32\x74\x3f\xca\xfd\x44\xd6\xe4\x52\x7c\x3b\xa8\xcb\x32\xea\x57\xfb\xe1\xfb\xcd\xa9\xa0\xf6\x2a\xd8\xdd\x59\x40\x3a\x44\x0f\xb8\x46\x04\x3e\xa4\x1e\xc3\xe5\x96\x39\x7a\x18\xc0\xf7\xa6\x22\x71\xce\x96\x56\xdc\x93\xf7\x29\x23\x54\x47\xef\x86\x91\x7d\x35\xec\xa4\x3e\x20\x1d\xa2\x07\x6e\xcf\xae\x06\x7d\xda\x56\xbb\x63\x5e\x7c\x48\xf9\xe3\x60\x83\x7f\x1b\x6c\x8f\x2d\x5d\xc4\xaf\xdf\xcc\x18\x8a\x5a\x17\x38\x7e\x06\x5b\x32\x0b\xa0\x43\xf4\xc0\xce\x6a\x9b\x89\x97\x5f\x27\xc6\xe1\x33\xf2\x35\x8d\x62\x7e\x74\xb3\x5f\x53\x97\x5b\x5c\x35\x4d\x3e\x4d\xc8\x1d\x62\x4d\xd2\x33\x9c\x7b\x00\x48\x07\xdb\x6b\x02\x10\xce\x80\x1e\x75\x7f\xf3\xc0\x77\x77\x4a\x86\xf7\x09\x01\x01\x27\x01\x87\x53\xf4\xe8\x35\x96\x3d\x2f\x95\x5f\xd8\x3c\xbe\x6d\xf5\x6a\xdc\x56\x7d\x3f\xe8\x08\xb6\x0c\x19\x48\x77\xe1\x25\xcd\x12\x04\x24\x97\x6c\x5b\xd5\x22\x9e\x24\xb7\x99\x8c\xcf\x6c\x52\xa3\x78\x66\x30\x62\x2b\x2a\x5d\x75\xcc\xe6\x19\xb3\xdf\x09\x7b\x49\x03\xa0\x43\xf4\xc0\x77\x8c\x90\x7b\xa9\x7d\xd9\x0f\x85\xec\x6e\xec\x25\xf5\xe6\x90\xe0\x5e\xe6\x79\x46\xed\xe4\x6b\x9f\xea\xa1\x7b\x7b\x6e\x53\x09\xf6\x88\x01\xd2\x21\x7a\x20\xa8\x7c\xbd\xc4\x7c\x11\xfc\x35\xf3\xbd\x73\xf6\x9b\x9a\x11\x4c\x74\xf7\x8c\x1f\x57\x87\x84\x29\x7c\x77\x65\x8f\xb6\xa2\x67\x60\x27\x8c\x02\xe9\x10\x3d\x80\xfe\x74\x24\x9d\xd6\x7f\xa7\x55\xc3\x2b\xa1\x48\x6b\xd6\x56\xa8\xb7\xb6\x6f\xb9\xe1\x25\x94\xe8\x92\x3d\xe8\xd2\xc7\x0c\xbd\xa9\x73\x0f\x00\xe9\x60\x75\xc0\x04\x60\x69\x2b\xc0\xb8\xe3\x6f\x1e\x50\x30\xd2\x78\xc7\x47\xe6\x59\x7b\x3d\x9a\xdd\x3b\xc0\x39\xb4\xc9\x8f\xcb\xdf\x6b\xe7\xca\x81\xae\x14\x15\xce\x73\xff\xf1\x6b\xe1\xe7\x6d\x07\xd2\x21\x7a\x80\x95\x41\xb6\x87\xab\x58\xbc\xd9\x9b\x88\xc7\xff\xd0\xe2\xfd\x16\x43\x9f\x5e\x7f\xdd\x9a\x5a\x9a\x8b\x49\xa2\x76\x79\x40\x3e\x6c\x19\x32\x90\xee\xc2\xf2\xe6\x98\x89\x4a\x93\x74\x83\x1f\xbc\x96\x76\x41\xe3\x4a\xad\x46\xe1\xec\x54\xb9\xe4\xa7\xe8\x18\xfc\xc1\x22\xc3\xb5\xde\xc7\x6f\x60\xcb\x9b\x01\x74\x88\x1e\x40\x55\x22\xaa\xf0\x5c\x16\xfc\x45\x32\x69\x43\x0c\x22\xc6\x26\x5d\x1c\xa2\x2f\x60\x6f\x66\x59\x25\xf7\xa0\xda\x39\x5a\x76\x87\xed\xca\x00\xd2\x21\x7a\x80\x55\xc0\x29\x79\xe3\x32\x1a\xa9\x5d\xf5\x55\x6d\x62\x1b\xb9\x3c\xa2\xed\xee\x56\x0e\xe6\x92\x57\xf3\x4e\x79\x07\x3d\xaa\x13\xee\xe7\x1e\x00\xd2\xc1\xea\x00\x50\x38\x1b\x9d\xe7\x97\xba\x87\x1a\x42\xb4\xdc\x92\x75\xa9\x7d\xa5\x67\xa8\x3e\x1b\xed\x2a\x6f\x96\x3d\x76\xd6\x5b\x9b\xd7\x01\x1d\xcf\x54\xff\x0c\x67\xd7\x39\x47\xb3\x7e\xb2\xce\xf3\x7e\x0f\xea\x26\x5d\x4c\x76\xbd\xaf\x41\x08\xd9\x0b\x74\xc3\x04\x71\xaf\x5c\xf6\x2a\xa8\x53\xb9\xf9\x87\xd4\x25\x13\xc7\x4f\x64\xec\xc9\xc0\xf7\x07\x92\x29\x57\x7a\x29\x6f\x8c\xe9\xc9\x2a\xed\x11\xc8\x38\x73\xb0\x91\x1f\xe7\x9e\xde\x73\xfe\x5f\x0b\x67\x40\x4d\xfb\x73\xcf\xd9\x85\x70\x76\x7b\x83\x41\xe3\x2d\x83\xf6\x5d\xc1\xdb\x18\x04\xa9\x9c\x1a\xe2\x9a\x4b\x97\xcb\x3f\x1a\x37\x07\x16\x2f\xe0\xe7\xfd\xe0\x3b\xfd\xfa\x4f\x26\x75\x2e\x86\x33\xd5\x9d\xe5\xe3\xd6\xe8\x3e\x81\x58\x1a\x1a\x21\x26\x9e\xef\x11\x6f\x56\xbe\x46\x1e\xd1\xc8\xdf\xa9\x9d\x59\xf2\x0a\xa9\xf5\xd4\xfd\x27\x53\x58\x17\xc3\xd9\xd6\xfa\x4d\xc6\xa4\xa4\x2c\x46\x9a\x85\xa2\x99\x17\xf7\x40\x67\x67\x93\x72\xa6\xc1\x8f\x63\xb4\xb0\x94\x1a\x87\x4f\xfb\xcf\x6e\xfe\x93\xd6\x5e\x0c\x67\x0b\xec\x0a\x8a\x5f\xa7\x89\x1a\xca\x5b\x23\x0a\x53\xf1\xd2\x7c\x5a\x18\xa5\x85\xd9\xbe\xd2\x8c\x42\x02\xe3\x8d\x6e\x50\x15\xb7\xfe\x93\xd6\x5e\x0c\x67\xea\x6e\x8f\x84\xdd\xbc\x03\x25\xd8\x46\x0c\x41\xd8\x2b\x41\x2b\xa9\x72\x4b\x57\x46\xed\x9d\xb8\xc5\xb8\x69\xea\xe9\xf4\xb2\xcc\xfe\x59\x38\x03\x32\xd1\xdf\xaa\x71\x57\x81\xde\x40\x6e\xd6\x3b\xfc\xd6\xd4\x9c\xcb\x73\xd7\x1a\xbf\x46\x7a\x4b\xd1\xeb\x78\x3d\xc2\xde\x55\x36\x22\xa8\xe7\xab\x82\xbd\x82\x06\xd2\x21\x56\x63\x54\xb1\x67\x69\x72\xf6\x26\xa4\x1c\x3f\xf6\x71\x16\x89\xc3\xe6\x36\x0b\xfc\x79\x8d\xf8\x23\x63\x62\xb1\x77\x08\xb5\xef\x3f\xd5\x86\x55\x37\x00\x1d\x62\x35\x26\x34\xce\xa5\xc9\x69\x67\xd5\x3f\xf5\xdc\x34\x09\xa5\x55\xef\x23\x14\x7d\x6a\xee\xd0\x0b\xb5\xd3\x77\x53\xbc\x32\x2e\xe7\x01\x7b\xc5\x0f\xa4\x43\xac\xc6\xb6\xba\x8f\x9a\xd8\x68\xc5\x77\x9e\x71\xeb\xec\x7f\x03\x25\x2f\xef\xc4\x3c\x6c\xcb\xb0\xbe\x5a\xf9\xfc\x15\x0b\x85\x98\x40\x3b\x6c\xd3\x0d\x90\x0e\xb1\x1f\xd6\x66\x82\x8f\xb1\xc5\x52\x75\x9d\xd7\xdb\x70\xbe\xf7\x0e\x48\xf3\xca\xbf\xca\xdf\x7c\x2c\x29\xa8\x31\xff\x54\x65\x40\x9e\xbb\xf5\x3c\x9c\x01\xe9\x60\x7b\xce\xfe\x73\x38\x03\xfa\x41\xff\xcd\x02\xca\x77\x49\x9d\x2a\x7e\x94\x0f\x12\x53\xf8\x3f\xc1\xdb\x5a\x9f\xcc\x9d\x1f\xfb\x86\x67\xfc\x33\xf5\x09\x83\x60\xb1\x9a\xaa\x23\x6c\xc6\x08\x48\x87\xd8\x74\xb7\x3e\x33\x6d\x9d\xa9\x6f\xe0\x41\x6a\xec\x82\xce\xa4\x15\x9f\xba\x68\x8c\xf7\x18\x6f\x52\x58\xcf\x72\x8b\x0b\x52\xc1\x0f\x61\x77\x67\x01\xe9\x2e\x84\xb3\x27\xf8\x7d\x06\x35\xed\x22\x58\x41\x3f\xdb\x42\x30\x84\x94\xe2\xa4\xab\x2b\x75\x88\xe3\x46\xf7\x5d\x4e\xa9\x5d\x2c\xa5\x3a\x60\xe1\x0c\x40\x87\x68\x81\x36\x1b\x82\x93\x08\xe9\x03\xa7\xcc\xa7\x6b\x27\x5d\x13\xf3\xda\xf9\xa0\xcb\xf8\x73\xac\x64\x67\x57\x87\x78\x13\x62\x6a\x43\x75\xcf\xb9\x40\x3a\xc4\x7e\x58\x25\x37\xfe\x95\x24\x58\xe4\xd6\xde\xad\xd3\x27\x62\xe0\x5c\xfb\x8d\x5e\xca\x3c\x6b\xc1\x10\xbf\xe4\x68\xb2\x15\x03\x65\x4d\xf1\xfc\x81\x0c\xa4\x83\xed\x35\x01\x08\x67\x40\xd5\xf5\x6f\x1e\x78\xad\xae\x7f\x4d\xf3\x7e\xb9\xaf\x46\x5f\xbd\x3f\xc5\xdb\x0a\xea\x69\xce\x01\x45\xbc\xa3\xe1\x96\x69\x3b\xbe\xfd\xc6\x1c\x26\xd8\x7d\x64\x40\x3a\xc4\xb6\xab\xfb\xa4\xcd\xbe\xbd\x11\x4a\x93\xb2\x28\x80\x32\x9f\x41\xb5\x72\xc8\xaf\xa3\x99\xb5\xf7\x5c\x81\x49\x5f\x75\xef\xa9\x4c\xbb\xd1\x39\x17\x48\x87\xe8\x81\x17\x9f\x16\xde\x07\xa0\x7b\x94\xb1\x38\xd8\x1f\x9c\x9c\x5e\x72\x5c\x0f\xdf\x93\x73\x8e\xa3\xa3\xf3\xbe\xac\x69\x5e\xbf\xcb\x09\xdb\xc3\x02\xa4\x43\xf4\x40\xae\xf8\xfb\xb5\x80\x19\xd5\x9e\x96\xb2\x62\xf2\xef\xaf\x7b\x68\xd3\xd5\x1c\x31\x5d\x9d\xae\x9e\x36\x6e\x88\xdf\x6c\xe8\xf4\x80\x5d\xff\x00\xa4\x43\xec\x07\xa3\x57\x99\x13\xf3\x65\xd2\x04\x8b\x98\x12\x42\xd8\x4f\xd7\xb1\x73\xd0\x3d\xe3\x08\x69\xc7\xcb\x73\x6e\x6f\xa0\xc6\x9e\x89\x3e\x3e\xf7\x00\x90\x0e\xb6\xd7\x04\x20\x9c\x01\x3d\xea\xfe\xe6\x81\xe8\xc3\xa3\x94\xe0\x14\xfb\xf1\x29\xbc\xe7\x2c\x41\x52\x66\x37\x42\xd6\x2a\x7d\x2b\xec\x8a\x0f\x83\x6e\x89\x2a\x98\x8d\xdb\xc1\xfe\x56\x40\xba\x0b\x03\x73\xe2\x68\xba\xaf\xed\x1b\x14\x0d\x73\x95\x66\xf6\xc2\x2f\x50\x87\x02\x14\xaa\x24\x29\x6a\x7c\x56\xdf\x36\xe5\xa8\xbc\x66\x93\x82\x0d\xcc\x01\x74\x88\x1e\x08\xe7\xa9\xb9\x9e\x7d\xd3\x12\xdb\x71\xa3\xa6\x77\x4b\x49\xc0\xa7\x2f\x32\xf2\x46\x8f\xa2\xcf\x87\x2d\x5a\x19\xbf\xe3\x67\x82\xb0\x63\xd4\x81\x74\x88\x1e\xc0\xe0\x76\xe9\x0c\x90\x7c\xb2\x36\x10\x80\xf3\xda\x13\xb5\xed\x2c\x50\x72\x2c\xbe\x08\xa7\x6d\x9b\x3d\x12\x2a\xe2\x28\x48\x0c\x3b\xb8\x17\x48\x87\xd8\x0f\xb1\x4f\x30\xfc\x4c\xa8\x09\x47\x06\x62\x2a\xb4\x6c\xc3\xbc\x67\xde\xe4\xeb\x1f\x0a\xe5\xb0\xe9\x15\xf3\xab\xf9\x33\xbf\x55\xbe\x77\xee\x01\x20\x1d\xac\x0e\x00\x84\x33\xa0\x71\xc7\xdf\x3c\x40\xf3\xed\xc5\x91\x8e\xb9\x97\xc6\xab\xd6\xca\x78\x25\x37\xa6\xdc\x43\x2a\xc9\x63\xd5\x5b\xb5\xec\x43\x9e\x90\xb1\x2b\x04\xd6\xc5\xb0\x3d\xa2\x00\x3a\xc4\xb6\x8f\x63\xf6\x35\xfd\x7a\x6f\xb9\x66\xe0\xa8\x3a\x7a\x2a\xa4\xba\x75\x92\x6e\x64\x6e\xe2\xcb\x56\x6f\x57\x9d\xe9\x48\xd0\x62\x14\x05\xdb\x1f\x08\xa0\x43\xf4\x40\x35\x57\x28\xd9\xe3\x1d\x70\xe9\xaa\xfc\x15\xaf\xc5\x0e\x73\x47\x47\x0f\x9f\x2b\x15\x5c\xe9\xa2\x55\x7c\x34\xb2\xf7\x3d\xd3\xbe\x9e\x73\x81\x74\x88\x1e\xd0\x54\xe2\x09\x0a\x9c\xd2\x2e\xe1\x6b\xa0\x8a\x8e\xf4\x58\x0b\x8e\xdc\xe6\x99\x4e\x73\xc0\xb8\x6e\x7d\x75\xfa\x60\xad\xd9\x53\x11\x36\xdb\x0b\xa0\x43\xec\x07\x32\x12\xbb\x41\xc1\x95\x81\xae\x86\x44\xeb\x99\xbc\x98\x4b\xfc\x5f\x32\xef\x50\x5a\x0e\x80\x5e\x83\xe8\x5d\xd5\xc3\x6e\xd2\x79\x9f\x7b\x00\x48\x07\xab\x03\x80\x33\x67\xc2\x0c\x39\xc6\x38\x32\xba\x68\x43\xf5\x3c\x52\xfd\x8b\x2c\xb1\x4e\x43\x93\x83\xf8\x8c\xcb\xe0\xd3\x89\xfe\x2b\x6a\x98\xa1\x7f\x86\x33\x4b\x06\x0c\xd1\x2b\xd3\x34\x85\xd6\xa4\x2e\xf8\x27\x16\xc6\x55\x9e\xa2\xa7\x4c\xae\x35\x67\x2a\xa9\x0f\xd3\x4d\x89\xcb\x79\xff\x3c\x0a\x42\x47\x0f\x35\x4a\x29\x3a\xdd\x2c\xd7\x62\xb8\x07\xf3\x41\xaa\x8b\x66\x62\x45\x7a\x94\xc8\x64\xad\xe6\x1d\x54\xe6\xc9\x02\xa7\xf7\xff\x6b\xe1\x0c\xa8\x69\x7f\xee\x39\x53\x41\x1c\xc0\x2b\x7f\xd4\xdc\xaf\x8c\x78\xf4\x61\x4d\xfd\xd9\xf4\x8c\x4d\x4c\x44\xbf\x38\x1f\x54\x99\xf9\xd5\x27\x4f\x25\x3b\x3a\x0b\xde\xc2\xe7\xff\x64\x52\xe7\x62\x38\x23\x0f\x74\xe0\xdf\xa0\x8d\x14\x7a\x27\x54\xfd\xe6\xc3\x34\x47\xf4\x01\x7e\x45\xd8\x6c\xbf\x89\xaf\x36\x34\x2c\xaa\xed\x57\x9b\xcd\x3f\x99\xc2\xd2\xbe\xf0\xb1\x3f\x5b\xe3\x62\x1a\xc3\xbb\x2c\x63\x78\xe7\x4e\x47\xf1\xc3\x5e\xb9\x95\x18\xaf\x37\xa2\xa6\xca\xe0\xa3\x5f\xae\xbd\x3b\x71\xcc\xf4\x4f\x5a\x7b\x31\x9c\xa5\xec\x72\x4c\x4e\xf3\xc7\x8f\x9a\x64\x60\xad\xae\xf8\x92\x7d\xad\x7c\x75\xc7\xc4\x2d\xff\x2a\x6b\x67\xc2\xcd\x5b\x4c\xf6\xd9\x16\xff\xa4\xb5\x5e\x17\x3e\x36\x59\x36\x3b\x43\x46\x3a\x2c\x68\x97\xa4\xa8\xc9\x5b\xad\x56\xd4\xb4\x7c\x4a\x3d\x5c\xac\x45\x3a\x63\x95\xc9\xca\xb2\xe3\xfb\xb3\x7f\x16\xce\x80\x4c\xf4\xb7\x6a\x6c\x23\xab\x63\x64\x75\x1a\xa0\x9e\xba\xb9\xb7\xec\x85\x22\x6a\x1d\x4d\xa0\xc2\x1f\x81\x5e\x12\x41\xea\x50\x69\x44\xa8\xf8\x00\x76\x3c\x13\x90\xee\x42\x35\x66\x3f\xa9\x69\xb5\x5f\x62\xc1\xb8\x94\xec\x9f\xf2\x8d\x76\x94\x5e\xcb\xe3\xc1\x4d\xf0\x5d\x72\xb5\x5d\xaf\x5e\xdd\x00\xd7\x8f\xb0\x6a\x0c\xa0\xbb\x70\xfb\x2c\x3e\xa4\x74\x60\x5b\xa3\x44\xed\xd7\x5e\xe2\xb2\x47\xe9\x9a\xee\x37\x9b\xab\xdf\x88\x9e\x47\x84\xf3\x3b\x1f\x15\x35\x07\x57\x9c\x73\x81\x74\x88\xd5\xb8\x01\x07\xe4\x17\xf4\x59\x37\x74\x9e\xd4\xcd\xc2\x36\xaf\x79\x40\xd7\x91\x1a\xe5\xed\x2a\x2e\xc8\xb7\xdd\x9a\xad\xf9\x6b\x11\x6c\x59\x23\x90\x0e\xf1\xfb\xf2\x8c\x04\xe7\x7a\x26\xd5\x3e\x3b\x33\xa5\xd1\xd7\xa5\x39\x64\x1f\x98\xa0\x70\x8d\x99\x75\xb9\xbb\x85\xff\xf9\xfb\xd2\xcb\x9b\x11\xe7\xe1\x0c\x48\x07\xdb\x73\xa6\xf2\x1f\x1f\xc8\x40\x3f\xe8\xbf\x59\xa0\x60\x1e\x82\x96\xe6\x38\x8a\xf7\x76\xb1\x0e\x8d\xf7\xde\x55\x47\xe6\x46\x7e\x4c\x22\x97\x61\xe6\xce\x71\xbe\xad\x6e\xa1\xff\x77\xf1\x2e\x90\x0e\xd1\x02\x11\x2f\xdb\x94\x7b\x06\x27\x51\x0e\x14\x8b\x0e\x93\x0d\x88\xd4\xee\xa6\x8b\xce\x43\xbb\x45\x7e\xf2\x70\xcd\x12\xa4\x68\xb4\xc1\xce\x9a\x01\xd2\x21\x76\x69\x97\x1d\xc6\xad\xd8\xfe\x35\xe5\x77\xda\x01\x94\xea\x93\x03\x8d\xbc\xce\x0d\xe3\x2f\x98\xdd\x6d\x0f\xca\x9d\x2d\x5f\x5f\x27\xe6\x83\xbd\x4f\x00\xd0\x21\x5a\x80\xd1\x04\x2b\x26\x06\xd7\x8a\xe4\xdd\xb5\xe3\x84\xa1\xb2\x5b\xcc\xbc\x7e\x8d\x77\x1d\xe5\x83\x1e\x17\x66\xd5\x3c\xd8\xb3\xf2\x87\x1d\xa3\x0e\xa4\x43\xfc\xbe\xfe\xed\x8a\x8d\xac\xf3\xf8\x5c\x4b\xfd\xd6\x21\x8a\x2f\x29\xcc\xa4\x28\x9f\xd5\x24\xd8\xd9\x4f\x2d\x67\xcf\x09\xab\xa6\x9f\xcc\x9c\x3f\x90\x81\x74\xb0\xbd\x26\x00\xe1\x0c\xa8\xba\xfe\xcd\x03\x84\xf6\xba\x72\x4b\x4e\xf5\xdf\xe9\x3a\xb4\x4d\x3e\x58\xd7\x08\x8a\x94\x1a\x26\xa7\xa2\x8c\x99\x4c\x41\x03\x1e\x71\x25\xbf\x12\x81\xbd\xf3\x00\xd0\x21\x7a\x60\xd7\x7c\xf1\x5d\x20\x5a\x7b\x52\x63\x32\x97\x9e\xa0\xc5\x0f\xc7\xed\x23\xe2\x06\x3a\xd2\x83\xe0\xb6\x54\x2c\xa7\x1b\xe8\x67\x4f\xce\xb9\x40\x3a\xc4\x3e\xe5\x98\x2f\x7c\xf3\x99\x7b\xef\x5b\xa0\x38\xd6\xd7\xb8\xad\x5f\xa5\xbc\xf8\x5b\x5c\xa2\xcb\xe1\x9b\xf1\xe5\xf1\x8e\x4f\x06\x57\x60\x9e\x05\xd2\x21\x7a\xe0\x29\xab\xef\x7b\x27\x61\xf6\xea\x7e\x86\xa9\xfd\xdb\x2f\xc3\xa9\x63\x44\x3f\x4c\xef\x61\xfb\xec\xf2\x5b\x95\x7b\xa1\xaf\x51\xcb\x9f\x73\x81\x74\x88\xdf\x97\x68\xe6\xc9\x95\x1e\x12\x33\x46\xeb\x0c\xae\xaf\x2e\x31\xc7\xdf\x36\xbf\x12\xfb\x94\xdb\xdf\x5e\x8e\xc7\x19\xc7\x77\x17\xf0\x0e\x3c\xf7\x00\x90\x0e\xb6\xd7\x44\xfb\x3f\x7b\x00\xe8\x51\xf7\x37\x0f\x70\xd2\x24\x8f\xc5\xdd\x78\x11\xf2\xf6\x0d\xc3\x99\x1b\x9b\x9d\xb2\xaf\x8e\xec\x8b\x5d\x34\xc6\x94\xf9\xe0\x95\xb7\x1f\x8f\x1e\x5c\x3b\x6f\x3b\x90\x0e\xd1\x03\x15\x2f\x15\xfb\xed\xaa\x4a\x54\x68\xdc\x0f\xc3\x2a\xe9\x9d\x5a\xc7\x2c\x0f\x9b\x7a\xbc\x77\x0a\x16\xda\xeb\x95\xa7\x1e\x4b\xc1\x0e\x04\x06\xd2\x21\xf6\xe9\xce\xa4\x01\xb5\x7a\x89\xe2\x2b\x67\xad\xee\xf2\x63\x5e\x4b\xc5\x0e\xfa\xe9\xd0\x47\xe9\x8f\x65\x47\x44\x03\x68\x82\x69\x44\x5e\xc0\x0e\xaf\x00\xd0\x21\x7a\xa0\x83\xe9\x23\xdd\x5c\x0a\xba\x91\x93\xff\x9d\x86\x57\x93\xfa\x4c\x51\x96\xee\x0a\xf6\x2e\xdf\xac\x63\x72\x75\xf2\x5a\xa3\x58\xcb\x60\x4b\xe5\x00\x74\x17\x96\xe2\x46\xae\x94\x16\xbe\xe6\xc8\x5f\xe5\x47\x69\xb7\x0f\xc9\xed\x27\xbc\xc7\x52\x7a\x7a\xaf\x73\xf0\x6d\xa1\xe5\x54\xb4\x33\x2a\xe6\xb9\x07\x80\x74\xb0\x3a\x00\x10\xce\x80\xc6\x1d\x7f\xbd\xf3\xf2\x0d\xc9\x43\xa5\xbc\x3b\x51\x7e\x83\x8b\xbf\x6e\x48\x28\x3c\x4f\xba\x7c\x6d\x62\xde\xd4\x1c\x3f\x87\x41\xcb\x57\x25\xd0\x02\x76\x12\x2e\x90\x0e\xd1\x03\x86\x46\x6d\xa1\xe8\x67\x4a\x94\x8a\x92\x7c\x44\xd6\x4a\x45\x91\x0c\xe2\x15\xcd\xaa\xd3\xd5\x7b\x73\xee\x84\x97\x07\xa5\xdf\xc1\x2e\xf6\x06\xd2\x5d\x78\x49\xb3\x80\x33\xad\xb0\xd2\x74\x90\x6f\xab\x62\x94\xe7\x4a\x82\x32\xa6\xcd\xd7\xba\x62\x32\xc8\x2f\x96\x7c\xad\x82\x96\x39\x00\x76\x62\x27\x90\x0e\xd1\x03\xac\x57\xf3\x15\x3e\x55\x59\xa0\x2d\x30\x41\xac\x16\x74\x82\x6f\xdb\xde\x17\xef\xa8\xa1\x69\xe0\xb8\xf7\xac\x05\xd5\xa3\x2d\xda\x01\xf6\x42\x01\x40\x87\xf8\x7d\x6d\xf6\x1a\x74\xee\xd8\xfa\xa2\xd3\x46\xf4\xb6\xcc\x6f\x9d\x25\x37\xde\x5c\x1e\xb1\xb5\xf9\x1a\x1a\x98\x22\x31\x52\xc1\xab\x0f\xbb\x56\x05\x48\x07\xab\x03\x5e\x00\xe1\x4c\x9f\x83\x03\x87\xe6\x24\xe0\xe7\xd7\x3a\xc6\x8a\x01\x9d\x61\x9f\x9a\x67\x99\x7d\xe1\xdb\x67\x6e\xf4\xb1\x91\x34\x4e\xf6\x85\x32\x7f\x86\xb3\xaa\x7d\xbd\xeb\xe4\xde\x24\x4c\x71\xe6\xd7\x7c\xa3\xe3\xcb\x5d\x3f\xad\x84\xbe\xc2\xd1\x5e\xf2\x66\xe1\xb1\x38\xeb\xff\xc5\xdb\xf7\xe7\xf2\x4c\x33\x4a\x88\x93\x04\xfa\x57\x67\x06\xed\x8f\x2c\x05\x5b\x52\x2c\xa9\xd7\xea\xdb\x86\x2c\x13\xfc\xb6\x94\x1d\xd2\x4e\x18\x23\xfe\xd7\xc2\x19\x50\xd3\xfe\xdc\x73\x76\x21\x9c\xe9\xe5\x51\xd5\xfc\x3a\x52\xb5\x7a\xd7\x5d\xa8\x77\x85\xec\xa1\x0e\x0d\xad\x57\xd4\x2d\x2c\xed\xa7\x41\x15\x25\xf9\x18\xdd\x4f\x5d\xff\xc9\xa4\xce\xc5\x70\x06\x1d\x6c\xdd\x5e\x2c\x6a\xce\xe7\x21\x1f\xcc\x5d\xfd\xec\x73\x20\x2c\x69\xbe\x56\xac\x73\x3f\xae\x45\xa1\xcc\x78\x44\x68\xf7\x1f\xe4\x86\x48\x39\xa9\x8b\xe1\xec\x4a\xd7\xc6\xdc\xaf\xed\x1e\x72\xc2\xef\xa4\xd2\x14\x5a\xb8\xdb\x4b\x79\xf1\x92\x46\x6d\x39\xda\xb3\x15\xa5\x24\x9b\xd4\xa6\x28\xff\xa4\xb5\x17\xc3\x19\x0f\xf9\x48\x86\x2a\xaf\x52\x01\xd5\x69\x19\x97\x37\x45\x01\x11\x8f\x59\xbd\x2b\xff\xfd\x0d\x9b\xaa\xa2\x09\x74\x35\x6f\x66\xd1\x7f\xd2\xda\x8b\xe1\x2c\x36\x49\x7b\x4f\x99\xbd\x6f\x3f\xe6\x30\x4f\xfc\x53\x0d\x84\xc9\xc1\x55\x5a\x7a\x01\x5d\x5c\x5a\xff\xce\x56\x94\x58\x72\x1b\xc6\x3f\x0b\x67\x40\x26\xfa\x5b\x35\x6e\xe1\x4f\x1d\x59\x54\x60\x2a\xb2\x51\x38\x7e\x55\x03\x1a\x99\xb5\x39\xc8\x0c\x78\xf6\x8b\xc9\xf0\xed\xa7\x27\xb7\x50\xab\xd7\xb1\xcf\xab\x10\x90\x0e\xb1\x1a\xdf\x49\x8c\x11\x18\x7e\xfe\x83\x26\xfb\xf4\x2a\xb6\x6f\x6e\x6f\x91\xcc\xf2\x24\x37\xfa\xb5\x43\x71\xa5\xbb\x8e\x66\x7c\xb8\x53\x28\xb0\x1d\xb5\x00\xba\x20\x19\x14\xb4\x3f\xb9\xd3\xd5\x7c\x25\xf6\xbc\x25\xc4\x6e\x6c\xe2\xa1\x0c\xdf\x4e\xea\x89\x70\x45\xe7\x6b\x5d\xd9\xda\xb4\x96\x8d\xec\xf3\x38\xf6\x5b\xce\xb9\x40\x3a\xc4\xef\x5b\xee\xf1\x70\x7b\xc6\x13\x55\x04\xca\x77\xdb\x5a\x94\x55\xfe\xd9\x15\xc5\xa7\x75\x5f\xe7\x27\x52\x77\xd7\x0a\xf7\x4b\xb6\x62\x60\xf7\xa7\x01\xe9\x10\xab\x31\x1e\x7e\x8e\x8f\x4d\x25\xd1\x89\x3a\x91\x02\xc6\xbb\x66\x36\x57\x89\x05\x03\x76\xcb\x69\xd7\xb6\xb2\x0c\x8d\xda\xe9\xd5\x65\x86\xf3\x70\x06\xa4\x83\xed\x39\xfb\xcf\xe1\x0c\xe8\x07\xfd\x37\x0b\xa4\xb8\xf6\x83\x0c\x8a\x18\x33\x15\xab\xef\x33\xca\x3d\x22\xdd\x4b\x51\x0e\x4a\x71\xaa\xe2\x30\x41\x1d\x8c\x72\x78\xc2\x20\x0c\x7b\xab\x09\xa4\x43\xec\xd2\xcc\xcd\x76\x11\x47\x3d\x5d\x43\x12\xbe\xb1\xc8\x66\x27\x94\xd7\x0c\x49\x3d\xaf\x0f\x1f\x36\x44\xbd\x01\xa1\xe7\x27\x7f\xad\x84\xed\xdd\x00\xd2\x21\x5a\x80\xc4\x33\xd9\xb8\x3e\x78\x4b\x00\x4c\x1b\x65\xdd\xd9\xb1\x2e\x1f\x12\xe0\xb0\x30\xe3\xfa\x43\x9f\xb8\x87\x55\x68\xe7\xf3\xb8\xf3\x39\x17\x48\x87\xf8\x7d\x6f\x7d\xd0\x55\xc1\x73\x35\x3e\x92\xb7\x4a\xad\x29\xd4\xd8\x88\x08\xe5\xa7\xaa\x7e\xb4\xe7\xde\x5e\x9d\xe7\x4b\x53\x81\x5d\x00\x3b\x10\x04\x48\x87\x68\x81\xc7\x1e\x16\xcc\xcf\xae\x7b\x6f\x7e\x3c\x36\x49\xe7\x30\x54\x78\x6c\x59\xd0\x65\xac\x85\x71\xf3\x83\x12\x35\x23\x15\xb1\xac\xf4\xc1\xf9\x03\x19\x48\x07\xdb\x6b\x02\x10\xce\x80\xaa\xeb\x5f\xf7\x9c\x59\x76\xea\x79\x7c\xd6\x2d\xe3\x74\x5c\x0f\x9d\xf0\xc7\x97\xcf\x42\xd5\x47\xa5\x59\xb6\x9c\xb8\x56\x33\xfe\x31\xb9\xa0\x06\x76\xd7\x1d\x90\x0e\xb1\x4f\xa5\x87\xaf\xa3\x6a\xce\xab\xda\x28\x9e\xbe\xe5\x77\x4b\xb5\x17\x77\xb5\x68\x4a\xbf\x57\x4c\x47\xac\x5b\x43\xa0\xdc\xcc\xc5\x08\x5b\x2e\x09\xa4\x43\xf4\x00\xa4\x26\xec\xbd\x03\xf3\xa8\xab\x9d\x7c\xec\xc6\x35\x99\x95\x55\x82\x4e\xb2\x77\x0e\x55\x5e\xb7\xd1\xf2\xf5\x17\x83\x4e\x26\xd4\xcf\xb9\x40\x3a\xc4\xef\x1b\x73\x1b\xef\x1b\x15\xb5\x5f\x55\xb9\xbe\x7d\x06\x29\xa3\x28\x84\x45\x3e\xdf\x63\x81\x4e\xcc\xbe\x64\xed\xd6\xab\xec\x37\xb2\xf7\xcf\xb9\x40\xba\x0b\x03\x73\xfe\x87\x03\xec\x99\x1c\xe3\x43\xa7\x86\x90\xe2\xe9\xa9\xf6\x38\x9f\xec\xd4\x07\x2f\x56\xb0\x5e\xcf\xcf\x56\x70\x76\xcc\x80\x60\x03\x73\x00\x1d\x6c\xaf\x09\x40\x38\x03\x7a\xd4\xfd\xcd\x03\xfa\x6a\x91\xcf\x55\x68\x93\x29\xfc\x2b\x30\xb2\xb4\x2c\xec\xd1\xc1\x4e\x09\xc3\x39\xc5\xef\x2b\x05\x1b\x12\xbd\x59\x85\x8e\x60\xf7\xf0\x03\xe9\x10\xfb\xf4\x1e\x6b\xb8\x5a\xe2\xea\x4d\xeb\x2f\x83\xdf\x4d\x85\x37\x3a\xc7\x30\xb8\xa6\x43\xa3\x94\xf1\x05\x79\xa4\x7a\x7c\xfc\xee\x77\xc1\xee\xb8\x02\xd2\x21\x7a\x60\x29\x14\x63\xf8\xf3\xdd\x51\x9a\x5c\x3b\x07\x5f\x8b\x04\x7c\xd0\xa9\xb6\xfb\xaf\x96\x47\xc7\x0b\xc7\x2a\xba\xfa\x34\xfa\x06\xfe\xe7\x5c\x20\x1d\xe2\xf7\x35\xa7\xdc\x47\xc7\x30\x51\xbf\xf7\x21\xfb\x21\x41\xe3\x9d\x5a\x3b\x5b\xfa\xbd\xa4\xf8\xce\x45\xbe\x36\x14\x9e\xd8\xd1\x01\x57\xd8\xfb\x4a\x20\x1d\xa2\x07\x7c\x73\xea\xeb\x7b\xcb\x43\x44\xf6\x8e\x02\x65\xad\x06\x4b\x03\xfa\x6f\x95\xc7\x3b\x38\x7d\xa6\xd4\xa6\x6c\x5c\xa7\xa9\x1d\x3b\x39\xf7\x00\x90\x0e\x56\x07\x00\xc2\x19\xd0\xb8\xe3\x6f\x1e\xd8\x2e\x6b\xf5\x6b\x17\x6b\x62\x7b\xe2\xb1\xcd\x29\x16\xff\x80\x76\x8d\x99\x48\xb6\xf0\x5a\x44\x58\xe5\xf1\x27\xd4\x47\x59\x3e\xb0\x85\x29\x40\xba\x0b\xd7\x29\x0c\x45\x7f\x61\xb2\x16\xb6\x6a\x49\x65\x6e\x4c\x0c\xbc\xfb\x75\x35\x66\xff\x66\x57\xb9\xba\xbe\xef\xc7\xdb\x77\x5d\xa7\x6e\xc2\x96\xa0\x02\xe9\x10\x3d\x80\xee\xf0\x63\x40\xb8\x34\x9e\xf5\x87\x87\xcc\x57\xd9\x5a\x5f\xbb\xee\xe8\x8c\x35\x73\xb6\x15\x8a\xb4\xa7\x07\xe5\x82\x77\x52\x60\x57\x6a\x00\xe9\x10\xbf\x2f\xad\x25\xcd\x31\x88\xb7\x72\x25\x91\xf2\x15\x05\xd4\xfd\xce\xa5\x19\x4d\xf7\x64\x43\xe7\xc5\xee\xab\x96\x98\x9c\x06\x6d\x76\xb0\xd5\x19\x40\x3a\x44\x0f\x74\xb3\x9b\xd7\x80\xbf\x38\x9a\x77\x95\x32\xe0\x53\xd5\x4e\x47\xdb\xa0\xac\x6d\x1d\x35\x4b\xb0\xb0\xec\x86\x35\xde\xb9\x61\x57\x73\xee\x01\x20\x1d\xac\x0e\x20\x0b\x67\x26\xff\x5d\x88\x0a\x46\x47\x03\x05\xc9\x81\x51\x50\xe0\x5a\x3f\x39\x02\xbd\xb3\xe8\xfc\x2d\xbc\x2e\x77\x3e\xdc\x89\xe4\x44\x7e\xc4\x79\xee\x34\xe6\xb3\x58\x8d\x1b\xe7\x6e\x78\x44\x41\x28\x75\x80\xe1\x7f\xa7\x0b\x92\x43\x09\x80\x27\x5b\x3f\xb2\xbd\xa9\x42\xc9\x90\xd7\x1b\x39\x66\x45\xd1\x99\x69\xd5\x6a\x86\x5e\xb0\x47\xe4\x8a\x89\xc6\xe0\x2e\x9f\x9f\x55\x9c\x79\x4e\x06\xd2\x05\xc9\xa1\x80\xe1\xc9\x1d\xf9\xd4\x76\x09\x4b\x5a\x83\x15\x12\x5e\xd9\x02\xf5\x94\x5a\xa9\x8a\x33\x0c\x66\x0e\xc3\xba\xbe\x5f\xc5\x51\x76\x9b\x2d\xd8\xce\xc9\x40\xba\x20\x39\x14\x14\xf8\x8b\xc3\x6d\x7d\xe9\x47\x58\x9a\x7e\x4a\x86\xc7\x77\x41\x5c\xdc\x54\x67\x9e\xf7\x71\x7f\x98\x90\x09\x04\x7d\xa2\xca\x08\x64\x27\x18\x97\x0f\x30\xfa\xff\x74\x65\x32\xd9\xb5\xf2\xce\x1f\x3a\x17\xcb\x0f\x99\x8e\x45\xbb\xfc\x03\xc9\xa9\x3c\x31\x2a\xb5\xb4\xc5\xc6\x79\x05\x4f\xeb\x4f\x7c\xa1\x06\x3c\xa8\xc5\x81\x53\x01\xf8\xad\x33\x04\xdc\x95\x0b\xd1\xeb\xa1\xb7\xea\x5e\x95\x0d\x77\xf5\x6b\x57\xeb\xc7\x76\x3e\xa5\x47\xb7\x24\x20\xf8\x50\xd0\x0a\xfd\x98\xe4\x51\x6b\xdb\x10\x43\x59\x2f\x23\x9e\xf9\x7f\x68\xa6\x15\x22\x7e\xf2\x82\xd7\x31\x66\x27\x11\xe4\x66\x5c\x69\xd9\x57\x71\x2f\x3d\x5a\xb4\xa9\x31\x47\xcf\x64\xbc\x44\xce\xb9\x7d\xe3\x37\xfa\x6d\x43\x6e\x42\x3a\xff\x2a\x1e\x66\xa5\x30\x7d\x58\x56\xde\x0e\x4a\x60\x4e\xe0\x63\x6a\xf9\x98\xf8\x61\x65\x82\xdb\x74\x65\xd3\xb3\xa9\x9b\xec\x34\x67\x75\x83\x65\x57\x5b\xf0\x47\x5d\x28\x53\xfe\x0f\x7d\xfa\xa0\x27\xe3\xfb\x2d\x0c\xc8\x8a\x7f\xc5\x4c\x78\x53\xd5\x0f\x29\x8c\x13\x94\x21\x17\x9f\x84\xdd\x7b\x31\x2f\x36\x6b\xee\xea\xfd\x46\x17\xcd\xac\x91\x1d\x94\x37\x76\x31\xd1\x0b\x32\x9a\xf3\xaa\xf1\x4e\x38\xeb\x34\x28\xbc\x23\x6a\x80\x04\x47\x25\x7d\xcb\x2c\xfa\x76\x4c\x45\xfd\xc6\x50\x4a\x83\x77\x8f\xf4\xc8\x6f\xb1\xad\x60\xf9\xff\xd0\xa2\xbc\x02\xe8\xb4\xf2\x7a\x0e\xab\x09\x9c\x7d\x15\x1c\xfd\x4c\x66\x57\xcf\xa2\xd3\xbe\x0d\xd6\xe9\xb9\xc4\xfe\xa0\x71\x55\xf3\xfe\x8d\x0e\x34\xf4\x6a\x2c\xb7\x5c\xf7\x11\x00\xd5\x5e\x09\x4f\x7f\x3e\x1a\xf5\x3d\x76\x74\x34\xb9\x6b\x6b\xfe\x9a\x4d\xe1\x94\xf5\xc4\x86\x22\x1e\x81\x8d\x87\x40\x85\x72\xf7\xe9\x14\xc7\x94\xe4\x18\x06\x35\x48\x0f\x05\xd7\xca\xd6\x81\x4b\x90\xeb\xa1\xa5\xc7\xbd\x87\x16\x7f\xfe\x7b\x2a\xe8\xff\xfb\xe0\x6b\xa5\xe5\x0a\xf7\x92\x74\xbd\xd6\x3f\xe5\x1a\x60\x56\x06\x52\x62\xeb\x10\x1f\xec\x04\x56\x3e\xce\x51\xff\xe1\x22\x44\x1b\xb1\x12\x29\x25\x85\xa2\x84\xc2\x4c\x6e\x49\x7f\xf7\x70\x16\x45\x19\x05\x74\xa0\x92\x27\xea\x8c\xf6\xf9\x79\xa0\x01\xe5\xef\xff\xc8\x4e\xf1\x9a\x2e\x95\x47\x41\xf8\x47\x1f\x04\x49\xb0\xab\xe6\x40\xfc\xdf\xe7\xa0\x99\x33\x14\x29\x35\x14\x10\xc1\x4f\xa1\xb1\x38\x56\xad\x08\x14\x14\x14\x35\x14\xb0\xef\xfa\x68\x0e\x9a\x59\x93\x0c\x0a\x0a\xca\xdc\xff\xbd\x2e\x49\x5b\x7f\xc5\x44\x15\xeb\xd9\x55\xcb\x48\x99\x29\xcd\xfc\x85\xc8\x71\x7d\x49\xe4\x61\x93\xb7\xae\xb8\xe0\x6e\xe7\x3c\x04\x07\xe7\xcf\xd0\x5d\x2f\x81\xf5\xd0\x86\xd4\x21\x8d\x6c\x07\x27\x8e\xba\x55\xf8\xd2\x63\xac\xa9\x92\xc6\x18\x73\x54\x0a\xce\x20\xaa\x04\x3d\x56\x14\xb8\x9c\x49\x46\xe1\x7d\xd7\xb7\x53\xfa\xe7\xb0\x67\x55\xc4\xc1\xd3\x47\xe9\x82\xe1\x6c\x81\x8e\xbd\xa1\x9a\x9f\x8d\x52\x47\x4f\xa6\x1c\x78\xa4\x64\x51\x40\xb3\x7f\xe8\x29\x4e\xed\x7a\xef\x65\x67\xdb\xe3\x0a\x89\x2b\x8b\x3e\x7d\xa5\x02\x65\xdb\xe9\x49\xd5\x0e\xd0\x8c\x4e\xf3\xfc\x8c\xa9\x17\x81\xfb\x87\x34\xd0\x85\x97\x6c\xe9\xbe\x92\xd9\x40\x73\x68\xbf\xd8\x09\x19\xa9\x54\x5e\xe0\x9c\x65\x4d\x31\xc4\xb1\xb6\xc8\x71\x7d\xb4\xe5\xcf\x23\x71\xe4\xe3\x34\xc7\xf6\x32\xe4\x7f\xbe\x95\xd8\x8c\x1c\xcd\x92\x78\x4f\x19\xaa\x74\x69\x6c\xb2\x90\x66\xca\x38\x5f\x2f\x36\xe9\xec\xfa\x1f\x52\xd3\xc1\x5e\x19\xc2\xe1\x1b\x0f\x6c\xdb\x1f\x9b\x8b\x95\x9f\x49\x47\x0b\xd2\x16\x6d\xfb\xac\x2d\x1a\x4a\xd0\x59\x8a\xd8\xa9\x82\x45\xb0\x73\x29\x38\xfe\xd0\x53\x3a\xa6\x33\x8c\xb5\xbd\x5f\x35\x8f\xc2\x96\x7f\xab\x83\x45\x40\x6e\x86\x73\xc9\xd4\xbd\x74\x81\x8e\x87\x22\xfb\xd1\xf5\xb7\x93\x52\x3f\xee\xfd\x77\xdd\x16\x29\x83\x62\x29\x83\x62\x19\xb0\x6f\x70\x1d\xe5\x1a\x26\x88\x88\xee\x9d\xd9\xa6\xec\x9d\xfa\xf1\x35\x95\xda\x6d\x29\xfa\x33\x07\xa8\xc1\x71\xdf\x7c\xf3\x7d\x37\xa1\x1f\xd3\x66\x44\x6f\x46\xb1\x1f\x05\x5c\xa2\xa4\x43\x41\x41\x01\xd3\xed\xdf\xfb\xef\x3a\x24\x18\x03\x0c\x0a\x52\x44\x41\xa1\xfb\xff\x5b\x04\x6e\x74\xa1\x19\x46\xba\xcf\xaa\xe3\xb7\x3c\xac\xa5\x62\x69\x32\x1a\x97\x2a\x46\x97\x16\x26\xdd\x2c\xfd\x2d\xc2\xd4\xb1\xad\xd0\xbd\x37\xc0\xe4\xbf\xd3\xfd\xa6\x07\x5c\xa0\x57\x2f\x35\xba\x53\xa0\xe6\x61\x0d\xea\x1f\x2b\x09\x3c\x0f\xf6\x73\x9f\x0b\x50\x52\xb1\x87\x46\x72\xdf\xd3\x74\x9d\xda\xc0\x89\x0a\x10\xf8\xef\x74\xbf\xe9\x28\x68\xbf\xe9\x01\x50\x19\x34\xdf\x5a\xf4\xff\xee\x2f\x16\x8c\x0e\x82\x80\x66\x83\xe4\xce\xfc\x51\x50\xfe\xf4\x31\xb3\xfc\x23\xca\xa2\xde\xd6\x59\x7e\xe1\x7b\xb3\xe9\x03\xd5\xb2\x6f\xbf\x5b\x32\x5b\xff\x5a\xab\xa2\x22\x34\x5a\xd7\x35\x49\x10\xf8\x43\x1a\x37\xc4\xd7\xdd\x49\x40\x60\x6e\xa5\xfa\x46\x77\x70\xf4\xca\xfb\xd9\xb5\xa7\xf3\x6b\x0e\xf4\x9d\xf8\xe1\x46\x27\xd6\xef\x26\xfe\xbc\x6c\x53\xef\x89\x40\x4c\x79\x63\xaa\x83\x3d\xbf\x7c\x16\x65\x40\x5c\xce\xc2\xd5\x22\x3e\x89\x7e\x26\x1d\xe9\x90\x90\x72\xd2\x23\xfe\x8d\x3f\xfb\x25\x83\x97\xd2\x9c\xda\xb0\x40\x6a\xab\xc1\xe0\x2c\x3e\xf8\xf8\xc6\xe4\xf8\x56\x6b\x84\xf1\x87\xd2\x04\xd3\xe5\x89\x7e\x31\xf7\x3f\x17\x50\x96\x7c\xc3\x9b\xcf\x4c\x34\x09\x52\xfb\x99\xc9\x96\x90\x6a\x47\xf6\x79\x20\x52\xb9\x80\xd2\xe1\x46\xd7\xca\x09\x8e\xe4\xab\xef\x7f\x4e\xbb\x97\x05\x1f\x28\xe2\x0a\x1d\xf4\xb5\xd1\xa7\x47\xdb\xa3\x0d\x79\x4a\x0c\xb6\x9b\xe8\xf2\x26\x29\x48\x38\x1c\x6f\x0b\x4c\xff\xd9\xac\x1e\x3f\xac\x2a\xc1\x09\x21\xf7\xd7\xde\xe5\x3f\x98\x3b\x29\x09\xd3\x43\x5e\x70\x5e\x0f\x28\x54\x49\x61\xbc\xf4\x5a\xaa\x60\xd2\xe1\x0f\xe9\xf0\xed\xb5\x47\x11\x74\xe1\x46\x4c\x85\xa1\x87\x93\xd5\x5c\x0f\x27\xb9\x4a\x4e\x3d\x65\x94\x02\x3e\x0a\x43\x7a\xbb\x95\xab\xf9\xfe\x90\x2a\xe4\x98\x06\x89\x0e\x1a\xf6\x2d\xbc\x5a\xfe\xfc\x3a\x3e\x91\x45\x4e\xc8\x82\x7c\x58\x27\xed\x31\xef\x2d\xdb\xd1\x0e\xaa\x6f\x7f\xae\x05\x0f\x10\x97\xc3\x99\xd9\x14\x54\xbb\x32\x7c\xdf\x8e\x25\xb1\x5b\xd3\x56\x6d\x73\xd4\x75\x6e\x5f\xbf\x7a\x46\xbd\xcc\xa7\x94\x16\xf5\xcf\xd5\xbe\x8a\xad\xc1\xc7\x0d\x4f\x8a\x2e\xd1\xca\xe7\x6c\x7a\xcf\xfe\x88\xe1\x2a\x4d\x2c\x14\x5e\xd7\x1a\x7e\x93\x77\xd5\x90\xc8\xfe\xf6\x9f\xe3\xa4\x37\x85\x65\x8c\xed\x89\xeb\xb2\x0f\x15\x5c\x8b\xd3\xea\x9a\xf8\xb3\x42\x82\x34\x5f\x7c\xf8\x18\x47\xf3\xd2\xb9\xe4\x84\xf5\xcf\x83\x8c\x63\x6f\x48\xf5\x6f\xd5\xf6\x81\x2c\x20\xa2\x2a\xd3\x16\xf6\xcc\x0d\xcf\x48\xf3\x1b\x42\xf1\xd3\x16\x27\xd0\xb2\x84\xe4\xd0\x1f\xfc\x39\xad\xab\x84\xfb\x94\x19\xbd\xf3\x4b\x84\x37\x09\xe9\x6d\x69\xfc\xf5\x36\x34\xb2\x59\x45\xb7\x7e\x46\x4f\xdc\x0c\x3f\xfe\x28\xf6\x81\x3f\x83\xd5\xaa\xd8\x34\x76\x89\x06\x26\xc3\x8d\x1d\xb6\xf1\x98\xa3\x29\xdc\xaf\x31\xf1\xad\x26\x22\x1c\xd0\x50\x8f\xc0\x6f\x51\x15\x3c\x01\x89\xc4\xff\x9d\x05\x83\xe4\xce\xce\xce\xce\x02\x92\xe8\x9e\xa0\x5c\x1a\x63\x35\x60\x41\x01\x05\xce\xa1\x42\xbf\x81\xe9\xc2\xc8\x5f\x94\x71\xa8\x5f\x76\x5d\x6d\xee\x4a\x7d\xa6\x65\xc9\xd3\x14\x76\xd4\xd4\x9f\xd3\x12\xc5\x8b\xbd\x84\xad\xbc\x2c\x63\x0e\x85\x80\x66\x51\x28\x51\xc8\x73\x21\x52\x8a\x28\xe0\xbd\xec\xdf\x3f\x79\x19\x14\x90\x94\x14\x8a\xd4\x13\x10\x3c\xaa\x72\xe1\x88\x36\x45\x4b\x94\x8d\x7e\x32\x2d\xc8\x05\xb5\x3c\xea\xee\x07\xad\x48\xef\x19\xb6\x9c\x6b\x16\x64\xbf\x9e\x25\x92\x4a\x40\x21\xa0\xaf\xc8\x50\x60\x78\x54\x9e\x4f\x9b\x1b\xb1\x04\xbd\x54\x9e\x71\x51\x4e\xba\xcb\x9a\x1c\x81\x63\x72\x19\xda\x5e\x0f\xe8\x5a\xe5\xfe\x2f\x52\x8e\x33\x43\x28\x04\x34\x87\x0c\x85\x0a\x8f\x8a\xd7\xb0\xf6\x91\x7a\x64\x65\xa3\x48\xca\x83\x2f\x39\xd1\xea\x44\x20\x93\x12\xcf\x36\x08\x6e\x7a\x46\x4d\x43\x6b\x22\xd5\x7a\x07\x0a\x01\xcd\x23\x43\xa1\xc1\xa3\x1e\xc9\x86\x45\xd7\xe8\x70\x57\xf3\xaf\x8c\xf8\x70\x34\xf0\x61\xbb\xbc\xed\x3b\x6e\x20\x95\x3c\xcb\x76\x70\x16\xeb\x96\xf6\x66\x83\x42\x40\x0b\xc8\x50\xe8\xf0\xa8\x1b\x39\x81\xe9\x39\x8c\x03\xb7\xbe\x8d\x71\x36\xbf\xc1\xdc\xfa\xc5\x2f\x47\xae\xd8\xbc\x6e\xa7\x22\xb1\x90\x44\xf7\x22\xfd\x8b\x10\x14\x02\x5a\x44\x86\xc2\x80\x47\xad\xf5\x72\xee\xcc\x0d\xe7\xd5\x45\xe6\x8c\x14\x3c\x57\x7d\x6e\x92\x38\x8d\xe1\xc0\x2c\x37\xde\xf4\x38\xd1\x30\x8e\xff\x19\x0d\x26\x14\x02\x5a\x42\x86\xba\x04\x8f\x62\xdb\x0e\xa3\x79\x96\xf1\x66\xba\xcd\xef\x40\x9c\xf7\x49\xb8\xe2\xaa\x4e\x0b\x06\xfa\x0d\x75\xdc\x1b\x06\x0e\x75\x6c\x36\x26\x76\x50\x08\x68\x19\x19\x0a\x13\x1e\x65\xd0\x3a\xd4\xde\x51\xdf\xd8\xb8\xf1\xac\x2a\xec\x5b\x8d\x1b\x98\x9a\x85\x9d\xa9\x95\x52\xe8\x59\x7b\xc8\x0f\x86\x7d\xd2\x66\x0c\x28\x04\xf4\x0d\x19\x0a\x0b\x1e\x85\x5f\xf6\xd9\x48\xec\x84\xf3\x40\x93\xda\xa9\x48\x7f\xd4\x1e\x5a\x64\x95\xd4\x3b\x10\x16\x57\xb4\xc7\xa9\xc3\x79\xe9\x1b\x08\x0d\x0a\x01\xad\x20\x43\x61\xc3\xa3\xf6\xc6\xf6\xb4\x27\x52\xd1\x7d\xbb\x6e\x4d\x3f\x0e\x0a\xb2\x4e\xbc\x66\x67\xa0\x50\xe5\xcc\x66\xba\x03\xfa\x29\x2d\xa8\x20\xe8\x08\x85\x80\x56\x91\xa1\x70\xe0\x51\x77\xd8\x9e\x8f\x97\xe3\x04\x25\x69\x68\x79\x08\x1a\xb2\x07\xf6\xf5\x06\xf0\x87\x8d\xdc\x9a\xfa\x18\x8f\xeb\xd9\xac\xd1\x32\xc2\x09\x85\x80\xd6\x90\xa1\x70\xe1\x51\xa3\xc7\x83\xaf\xda\xf8\xd1\xf9\xa9\xbb\x79\x1e\x99\x07\x72\x07\x43\xb8\x0d\xda\x8a\xed\xc3\xd2\x87\xdb\xf5\xee\x7a\xa0\xec\x0b\x42\x21\xa0\xef\xc8\x50\x78\xf0\x28\x7b\x46\xd5\x13\x13\x23\x73\xcd\x24\xe8\x43\x03\xb7\x96\x76\xa2\x03\x6c\xec\xf2\x25\xb6\x5b\x79\xc2\x92\xa3\xbc\x55\x8a\xee\xf2\x50\x08\x68\x1d\x19\xea\x32\x3c\xaa\xd1\x5c\xec\x2b\xab\x4f\x51\x1e\x61\x80\x72\x64\x7c\x1c\x46\x63\xe5\xbb\x57\x71\x04\x8c\xe0\x4f\xc4\x46\xdf\x02\xaa\x28\x2b\x8d\xa0\x10\xd0\x06\x32\x14\x3e\x3c\xea\xaa\x90\x45\xa2\x73\x9e\xf9\x1d\xdd\x01\x56\x5e\x54\x1e\xc5\xd1\x3a\x13\xad\x9b\x38\x21\x66\x6a\x73\x1c\xda\xbb\x2c\xaa\x2f\x54\xa0\x10\xd0\x26\x32\x14\x01\x3c\x8a\x4c\xc6\x73\x50\x98\x24\x21\xf2\x21\xf3\xfc\x91\x51\xa3\xd6\x60\x29\x0a\x5f\xa7\xc7\xcd\x0d\xc5\xc2\x5f\x73\xa8\x27\xd3\x79\x54\x50\x08\x68\x0b\x19\x8a\x10\x1e\xb5\x09\xca\xba\xf5\xf0\xb5\xdc\x29\x97\xed\x63\x01\xfa\xe4\xb7\x29\xba\x31\xea\x9c\x8b\xfb\xba\xd3\xe6\x4e\xaf\x17\x3f\xc5\x49\x89\x42\x21\xa0\x6d\x64\x28\x22\x84\xdf\xe0\x41\x3e\x93\x7b\xb7\x82\x58\xbe\x6b\xd7\xd2\x92\x1f\x89\x9b\x08\xe3\xac\x3b\xd9\x5d\x70\x47\xb8\x9a\xbd\xb2\x3f\xad\xb0\x30\x14\x02\xda\x41\x86\x22\x86\x47\x19\x69\xbf\x34\xc1\xd9\x0c\x0f\x50\xf9\x85\x35\x40\xb7\xe4\xe8\xab\xaa\xbb\x6b\xb9\x94\x97\x41\xd4\x1c\x99\xe9\xd2\x9d\x99\x2e\x09\x85\x80\x76\x91\xa1\x48\x10\xfe\x82\x2f\x7b\x76\x62\x7c\xa6\xc2\x3f\x8d\x76\xb6\xfb\xdc\xb3\xe6\xf0\xce\xd6\x2a\x4b\xed\xef\x61\xc5\x65\x86\x40\x7c\x28\xfb\x7f\x37\x70\x0f\x19\x8a\x14\x1e\xc5\xd7\x4f\x14\xa5\x6c\x36\xb2\x79\x87\xdd\xb9\x81\x4b\xd3\xa2\xfd\xd6\x75\xce\x55\xbc\x81\x6e\x13\x1e\xdf\xa9\x54\xca\x06\x45\x14\x28\x04\xf4\x03\x19\x8a\x0c\x1e\xd5\xea\x35\x94\x28\x85\x36\xd4\x34\x7a\x4a\x2c\xc9\x99\xf9\xde\xce\xdc\xa1\xe4\xdb\xc2\xb0\x72\xb0\x56\x05\x5f\xbb\xb6\xbb\x0c\x37\x14\x02\xda\x47\x86\x22\x87\x47\x41\x2e\xdb\x9b\xe1\x26\xbd\xa7\xc9\xb4\x6f\x66\x70\xca\xfa\x29\x13\xb0\xd5\x58\x73\xb3\x8c\xff\x15\xdd\xf7\x5e\x27\x54\xc5\x64\x6b\x28\x04\x74\x80\x0c\x45\x41\x01\xcf\x52\xe4\x14\x9f\xb9\xcb\x15\xec\x22\x29\x83\x4f\x80\xce\x68\x4d\x96\x5d\x60\x7f\x39\x11\xef\x48\xf6\xcb\x5a\x1f\xeb\xc3\x58\x9a\xdf\x76\xff\x89\x94\x05\x81\x67\x35\xbf\x5e\xdd\x68\x49\x10\x5f\xb8\x24\x84\x6b\xfc\x26\x08\xec\xe5\xc5\x76\xa5\x92\xdb\x91\xa4\x2b\x8c\x0a\x74\x8d\x2e\xb1\x56\x15\x0a\x01\x1d\x22\x65\x51\xc2\xb3\x34\x32\x84\x1d\x06\x23\x06\xb9\xc5\xb5\x8b\x63\x76\xc2\x5f\x71\x1f\x6a\x9d\xcd\xb4\x92\xaf\xb0\xa6\x76\x3a\x3d\x95\x19\xcd\xfc\xfd\x8b\x3e\x42\xca\xa2\x82\x67\x59\x41\x4e\x6f\xeb\x6a\xd3\x79\x5e\x2f\xff\x42\x44\xcb\x10\xfa\xd3\x2f\xf2\x2e\xcb\x93\xf2\xbb\xd2\xa1\x05\x2d\x8a\x41\xc6\xb1\x7c\x50\x08\xe8\x18\x29\x8b\x1a\xc1\x5c\xd1\x75\xec\x27\x41\x5a\xba\xae\xc9\xdf\x19\xa4\x6b\xf4\x15\x3a\x1e\x65\xe9\xf5\x0d\x11\xbd\xa0\xa6\xd5\x97\x9e\x13\x09\xb8\x0d\x85\x80\x7e\x21\x65\xd1\xc0\xb3\x18\xb2\x9b\x1e\xd3\x3d\xc8\x6e\x5a\x89\xb5\x4e\x09\xe3\x33\x9d\x2e\x65\x9c\x51\x98\xb6\xb8\xed\x66\xb6\xa3\x79\xda\x16\xcc\xf2\xfb\x71\x7f\x82\x94\x45\x0b\xcf\x4a\xb2\x92\xbf\xa1\x3f\x6f\x7e\x8a\x5d\x60\xfa\xec\x68\x3b\x90\xab\xdf\x71\x8d\x9f\xb2\xfb\x05\x6a\x35\x8d\x20\x51\x91\xfb\x31\x11\x14\x02\x3a\x45\xca\xba\x02\xcf\xca\x3a\x0c\x92\x73\x92\xc4\x7d\x46\x3a\x46\x43\xc6\xba\xfc\x85\xa9\xea\x9e\x83\x1b\x17\x9b\x85\x91\x0f\x4e\xab\x4b\xd7\xc4\x8d\xbb\x50\x08\xe8\x0c\x09\xab\x84\xf8\xbf\x1b\xf0\xff\xbf\x81\x19\x05\x1d\xfc\x87\xff\xa8\x66\x61\x42\xab\xae\xce\x43\xc5\x61\xae\x2e\x2f\xd5\xa7\x7c\xa8\x74\x98\xe2\x9f\x4f\x00\xcd\x28\x44\xcd\x59\x5a\x18\x77\x86\x42\xc0\x28\x48\x1b\x42\x8f\xd0\xc1\x1f\x5f\x7b\x11\x73\x79\x62\x92\xdf\xc2\xbc\x12\x95\x75\x94\x72\x1d\x35\x97\x4f\xb4\x9a\x0f\xdb\xb3\x9b\x27\x9f\x18\x57\xfd\x26\x14\x02\x06\x21\x65\x31\xc0\xb3\xe4\xde\x5b\xa0\xc9\xdc\xfe\x6c\x6a\xa5\xbd\x18\xcf\x0f\x7d\x1d\x81\x73\xe9\x11\xa9\x82\x67\x02\x21\x84\xf1\x0d\xd7\x52\xee\xe8\x03\x28\x04\x0c\x46\xca\xba\x0a\xcf\xa2\xff\x39\x22\x45\x43\x33\xd3\xc7\x1b\xff\xc1\x55\xf7\x21\x8e\x9e\xf6\xd0\xb8\x57\xf4\xdd\x70\x6f\x2f\xc3\x99\x80\x90\x14\x22\x10\x14\x02\x46\x45\xca\xba\x06\xcf\xba\xb2\xa6\x9b\x88\xee\xfe\x6c\xe7\x17\xc4\x3a\x35\xc1\x73\x88\x68\xef\xa5\xb0\x56\x0a\xf5\x61\x28\xed\x3d\x6f\xfe\x4b\xfb\xcd\x10\x28\x04\x8c\x86\x94\xc5\x08\xcf\xb2\x59\xbb\xbb\xfb\xf9\x79\x43\x22\xb5\xf4\x78\x55\xbf\xa4\x09\x98\x70\x55\x6a\x51\x11\xbb\x9e\xb6\x37\x86\xdf\x90\x9d\x2d\x04\x07\x0a\x01\xa3\x23\x65\x5d\x87\x67\x3d\x2d\x08\x70\x2c\x9f\xb0\x7b\xa9\xc5\xc8\xd4\xd5\xac\xde\x1d\x63\xf4\x78\x42\x06\xaf\xc9\x6c\x7c\x87\x50\xa6\x35\xc6\xd4\x92\x16\x0a\x01\x63\x20\x65\x31\xc1\xb3\xfa\xcb\xe7\x52\x6c\x2c\xb1\x29\xbe\xfd\xe2\x30\x9e\x11\x61\x1b\xc1\x69\x81\xd2\xd8\xae\x53\x2c\x7a\xd9\xea\xe5\xce\x61\xbe\x65\x81\x42\xc0\x97\x90\xb2\x98\xe1\x59\xd2\xfa\xf7\xcc\xf0\x2b\xc6\x28\xd7\x70\x1e\xf9\x69\x11\x61\x5a\x2a\xcc\xf8\xca\x64\x78\xbf\x59\x15\xb0\xf5\x6f\xed\x30\x29\xfe\xed\x09\x4c\xa4\x2c\x16\x78\xd6\x43\x71\x14\x79\xc6\x24\x11\x02\x9f\xfb\xa9\x05\x3f\x43\xd9\x08\x71\xd3\x24\xf6\xea\x14\x54\xd1\x14\x94\x02\x29\xae\xd7\xa1\x9a\x42\x21\x60\x2c\xa4\x2c\x56\x78\xd6\xf0\x7b\xfb\xfb\x7a\x4e\x4e\x6f\x3b\xf9\x0a\xed\xa3\xd5\x85\x85\xf7\xaf\x26\xc9\x65\x7f\x18\xd7\xf7\x8c\x2d\xad\x37\xa9\x7c\xce\x0d\x85\x80\xb1\x91\xb2\xd8\x10\x3c\x41\x8f\x1d\x6a\x61\xc9\x62\xd0\xb1\x8f\xba\x27\x2c\x51\x53\x66\x51\xb6\x40\x6c\x15\x4e\xc2\x55\xbc\x7e\x49\x8e\xfe\x72\x2d\x0f\x14\x02\xc6\x41\xca\x62\x87\x67\xbd\x0b\x4e\xa0\x7d\x8f\x1e\x72\x29\xed\xfb\x5e\x22\x77\x51\xe5\xaa\x11\xdb\xa1\x8b\x3a\xc7\x5d\x96\x54\x5b\x89\x63\xf4\xd2\x22\x07\x28\x04\x8c\x8b\x94\xc5\x01\xcf\xd2\xae\xc7\x8f\x33\xcb\x20\x25\x7a\xdd\xf3\x28\xaa\x29\x0e\x47\xd1\x63\x4f\x21\x2f\xf7\xfd\x97\x29\x97\xe9\xb3\x66\x31\x7b\x88\x12\x14\x02\xc6\x43\xca\xe2\x84\x67\x39\x64\x68\x46\x7a\xf6\x86\x64\x93\x48\x48\x3c\xb6\xa3\xb8\x89\x8b\x99\xd1\x96\xeb\x5f\xc2\x2f\x62\x17\x5d\x49\x08\xe9\xb2\x05\x43\x21\xe0\xcb\x48\x59\x5c\xf0\x2c\x26\x46\xdc\x8e\xc5\x53\x72\x25\xbb\x9e\xf1\x6f\xa8\x8d\x7d\xdf\x1c\xee\xa2\xcc\x6e\xa7\x50\x2d\x48\x82\xe5\x55\x8d\x53\xce\xa4\xa1\x10\x30\x3e\x52\x16\x37\x3c\xcb\x43\x81\x35\x45\x68\xb7\xbf\xc5\x4f\x84\xde\xe0\xd2\x96\xfa\x0f\x34\xef\xd2\xc9\xf1\x28\xee\xa9\xc6\x36\x2a\x71\x3c\xcd\x5f\x32\x50\x08\x98\x00\x29\x8b\x07\x9e\xf5\xb1\xe5\xb3\x73\x2d\x65\x0a\x53\x09\xdf\x40\x9a\x71\xce\x38\x13\x38\x2d\x81\x28\xce\x57\x44\xfa\xb8\xa2\xd3\xe5\xac\xd3\x59\x19\x0a\x01\x13\x22\x65\xf1\x22\xfc\x1d\xb9\x44\xd3\x42\x5b\x51\x6d\x0a\x3f\x45\x77\xff\x72\xd8\x38\x38\xa6\x1f\x7d\xd5\x44\x57\x43\xb2\xe0\x00\x4d\xe5\xba\x0a\xb1\x82\x42\xc0\x44\x48\x59\x7c\xf0\xac\x7b\x78\xcf\x66\x2a\xd6\xb3\x27\xbf\x28\xc5\x14\x2e\xe3\xa3\x05\x97\xcd\x8e\x89\x94\x59\x86\x9b\x72\x33\x0e\xb8\x07\xd4\x70\x9a\x41\x21\x60\x62\xa4\x2c\x7e\x78\x96\xdb\x0b\xf6\x3c\x10\x35\x26\x71\xa9\x91\x1f\xb9\x42\xac\x47\xf0\xed\x27\xed\x54\xec\x02\x2b\x18\x1d\xcf\xbb\x85\xc3\x29\xb3\x09\xa0\x10\x30\x09\x52\x96\x00\x3c\xeb\x68\xf4\xd6\x50\x03\xcb\xd5\xb0\xd6\xc0\xaf\x42\xd2\x6c\x7c\x14\x8d\x8c\x92\xe9\x37\x0d\x77\x38\x63\x19\x1e\x64\xea\x81\x8b\x1c\xa1\x10\x30\x29\x52\x96\x20\x3c\xcb\x14\x4f\xbb\x2b\xbd\x4c\x16\x5f\xf0\xbd\x90\x37\x79\xcc\x9d\x6d\x22\x4f\x9f\x1b\xbf\xae\x61\xc9\x52\x5c\x75\xc4\x99\x37\x6e\xd3\x80\x42\xc0\x64\x48\x59\x42\xf0\x2c\x79\xef\xee\xd7\xed\xee\x94\x18\xbe\xf2\x19\x23\x99\x46\xbc\x6c\x5d\x79\xb6\x3d\x4f\xad\x67\x2d\xdc\x9d\xb6\xa1\xd7\x38\xc5\x29\xa1\x10\x30\x39\x52\x96\x30\x3c\xeb\xfd\x61\xe6\xe7\x2b\x3d\xfd\x37\xb8\xf8\x47\x33\x2b\x0a\x49\x3b\xd9\x53\x24\x75\x89\x7c\x6b\xa2\x04\x6f\x3d\xba\xd4\x18\x64\x8c\x0f\x85\x80\x29\x90\xb2\x44\xe0\x59\xbe\x96\xb4\x76\x93\x50\xf4\x8c\xdd\x6c\x5a\xa5\xe0\xa3\xe7\xbe\x68\xcd\x6c\x9f\x59\xf6\xdc\xe4\xdc\xe7\x15\x2b\xc4\xa6\x54\x0c\xa1\x10\x30\x04\x29\x4b\x14\x9e\xc5\xb9\x52\xa6\x46\xe0\x50\xaf\xf9\xfe\x44\x62\x41\x96\x6b\xa0\x1b\x03\xd7\x2a\x60\xd8\x88\x56\xbf\x75\x28\x07\x87\x89\x9d\x8a\x15\x0a\x01\x53\x22\x65\x89\xc1\xb3\x24\x33\x88\x4a\xd7\x36\x3e\x09\x6e\x92\x47\xdc\x9c\x75\xa5\x94\xf6\x79\x92\xed\x84\x2e\x19\xdb\xd1\xe6\x16\x55\x29\x22\xeb\xf3\xfb\xf7\x48\x85\x94\x25\x8e\x30\x90\xbc\x15\x2f\x45\x82\xb1\xca\x42\x2f\xbc\x8e\xfd\x9c\x81\xaa\xca\xee\x09\x65\x91\x85\x02\x6a\xff\xca\x7b\x55\x50\x4b\x6e\xe8\xef\xe7\x23\x35\x52\x96\x04\x3c\xeb\xbb\x8d\x05\x59\xd5\xb6\xe2\x99\x1d\xd6\x06\x9f\x76\x51\xc5\x8d\xfe\x60\x25\x5e\xec\xcf\xd7\xb9\x5f\x3c\x32\x6d\xbc\xc4\x63\x64\x0c\x85\x80\x69\x90\xb2\x24\xe1\x59\x98\x86\xe2\xb8\x5b\x8f\x9f\xf8\x1d\x9a\xab\x77\xde\xff\x41\x66\x79\x32\xe6\x82\xad\x2f\x66\x7f\x77\xb1\x33\x33\x2c\xa4\x3e\xf0\xf7\xdf\x91\x16\x29\xeb\x06\x3c\x6b\xd1\x15\x0c\xb5\x13\x6a\x3d\x35\x2a\xb5\xe9\xaf\x52\x77\xb4\x9b\xb5\x9d\xa0\x22\xff\x22\x9b\x37\xf6\x5c\xe5\x6d\x61\x69\x13\x03\x14\x02\xbe\x02\x30\x60\x03\x7a\xed\xfa\xc7\x80\x4d\x0a\xfe\xc3\x75\xe9\x97\xbf\xdd\x44\x21\x9e\xe1\xee\xd7\x7c\x66\x7a\xcb\xc3\x05\x73\xdd\xd7\xda\xf2\x99\x7b\xa9\xcd\x52\x5c\x1b\x3b\xed\xd4\x55\x28\x04\x4c\x87\xb4\x21\xd2\xf0\xac\xfa\x9e\xb4\x99\x07\xdc\x2e\x7d\xe6\xef\xa9\x63\x41\x81\x56\x57\x58\x7f\xbc\xc0\x1a\xa8\x6b\xba\x4c\xfe\x9a\xd3\x8d\x62\xd2\x87\x1c\x0a\x01\xd3\x23\x65\xc9\xc0\xb3\x38\x48\x88\x33\xb4\xd1\xc9\x88\x29\xd8\xd8\xb0\x0e\x2a\x17\xfc\xcd\x6c\x5f\x1e\x30\x64\x52\xcb\x7d\x72\xcc\x99\xfe\x06\xf5\xd5\x83\x42\xc0\x0c\x48\x59\xb2\x08\xef\xf8\x58\x9c\xd1\x59\xab\x93\xc8\x27\x42\x6e\x40\x3a\x7a\xe7\xfc\x99\xfc\xef\x68\x5c\x21\xb1\x98\x8a\xca\x1a\xc1\x3e\xd9\xd5\xf8\x3d\x98\xb9\x8a\x94\x25\x07\xcf\xca\x19\xcf\xbc\x1e\x94\xb1\x74\xd8\x7b\x50\xb2\x64\x36\x75\x2f\xef\x26\x17\xaa\x93\xd1\xcb\x2f\x47\xfa\x23\xad\xbf\x66\x5f\x62\xfd\x7e\x70\x5d\x43\xca\x92\x87\x67\x99\x4c\xe0\xf1\xd3\xbe\xb8\xbb\xc6\x22\xb3\x75\xc7\x32\x1c\x57\xe6\x7b\x8b\xa1\xdc\x23\xef\x01\xf5\xe5\x2c\x6a\x43\x7f\xfe\x77\x97\xa1\x10\x30\x23\x52\x96\x02\x3c\x6b\xa3\x7d\x2a\x07\x35\x2b\x49\x78\x81\xab\x5f\x1e\xab\xe0\x88\x28\xa1\x30\x9b\x0d\x35\x92\xc9\xa7\xef\xce\x65\x41\x76\x23\x1d\x3c\x28\x04\x7c\x1d\x29\xeb\x26\x3c\x8b\xe5\x40\x30\x29\x65\xae\xc0\x0f\x5f\xa5\xae\x11\xe3\x8b\xbd\xde\xbb\x7b\xe6\xf7\xed\x34\x2b\xf4\x70\xf0\x2e\x5f\x4d\x7f\x21\x65\x0d\x85\x80\x99\x90\xb2\x14\xe1\x59\xd8\xb3\x44\x50\x56\x56\x9c\x04\xa2\x70\x06\x47\xe9\x1a\x7b\xca\x1c\x22\xce\x87\x8f\x1a\x29\xf7\x05\x3c\x15\x2c\xdb\xc5\xfd\xa9\xa0\x10\x30\x33\x52\x96\x12\x42\x7f\x25\xd8\xbd\x75\x76\xd3\xff\x6a\x54\xf6\x81\xcc\xf9\x3b\xab\x8c\x62\x38\xfe\x7d\x71\xea\x30\x5b\x6a\x81\x0f\x83\x24\x5e\xd6\x44\x50\x08\x98\x05\x29\x4b\x19\x9e\x15\x25\x81\xf7\xc5\xa2\x09\xc7\xd2\xee\xeb\x51\x76\xd5\xa7\xb7\x8f\xfc\x4c\x94\x51\xb1\x4c\xd5\x7e\x4a\x7f\x7c\xba\xc0\x5a\x48\x67\x0b\x85\x80\x59\x91\xb2\x54\xe0\x59\xed\x76\xc5\x4c\x41\xe6\x59\x11\x14\xf5\x93\x6c\x4e\x68\x90\xab\xb8\x32\xf2\x9e\x7a\x20\x89\x6d\x59\x63\xd9\x86\x81\x66\x51\x3a\x28\x04\xcc\x86\x94\xa5\x0a\xcf\x0a\x2e\xe7\x70\xbc\x9e\x7c\x5f\xb0\x83\xc4\x4d\x8f\xd2\x98\x16\x45\xfc\x70\xc5\xe0\x4e\x7f\x58\x2c\xbe\x35\x55\x64\xfb\x2b\x2b\x17\x28\x04\xcc\x8e\x94\xa5\x06\xcf\xf2\xcc\x57\x4d\xbd\x4d\x69\xc2\x53\x9d\x0d\x12\xad\x96\xd1\x85\x26\xde\x79\xc0\x62\x10\xe8\x08\xba\xf2\xb5\xc9\x19\x15\x3f\x8a\x03\x0a\x01\x73\x20\x65\xa9\xc3\xb3\x18\x7d\x0f\xcb\x73\x66\xeb\xdf\xf3\x50\x89\x13\xc8\xed\xf2\xf9\x2e\x8a\x7b\xc7\x65\xb5\x24\xac\x0e\x3b\x4c\x91\xd1\x92\xbc\xe6\x82\x42\xc0\x9c\x48\x59\x1a\xf0\x2c\x9f\xb4\xcf\xea\x89\x86\x12\xf6\x98\x60\xe6\xb0\x54\x0d\x4a\x09\x6b\xbf\xeb\xb5\xd1\x63\xfe\xee\xdc\x7d\x11\xdf\xbd\xc3\xaf\xfc\xae\x13\x5c\x48\x59\x9a\xf0\xac\x00\x32\x52\x43\xc1\xb2\xc7\x59\xea\x7c\x0c\xe4\xdf\x3a\xfc\x88\x59\x88\x24\x87\xb6\xfa\xbf\x60\x62\x4c\xd9\xae\xde\xb9\x3e\xf9\xbb\x4e\x70\x23\x65\x69\x21\xbc\x5b\x43\xa1\xf1\x2a\x7f\x77\xb9\x82\xab\x33\xa6\x35\x23\xa1\xd9\x51\x03\xc3\xd7\xe1\xeb\xc7\x2c\xd2\x2a\xa3\x9d\x96\xb3\x10\x65\x2d\x28\x04\xcc\x83\x94\xa5\x0d\xcf\x42\x99\x55\xc3\x50\x0e\x37\x39\x9a\xe9\x28\x8e\x25\x60\x51\x2e\x43\xc7\x6d\xd5\x71\xdb\x73\x3f\x72\xe8\x2c\x35\xce\xd9\x0c\x41\x87\x42\xc0\xbc\x48\x59\x3a\xf0\xac\xf0\x86\x12\x01\xfe\x18\xb3\x4b\xbe\xe3\x7d\xe2\xb2\xe1\x54\xb7\xa7\x7c\xea\x62\x31\xdf\xbf\x28\x8d\x60\x22\xf2\x9e\x08\x39\xa0\x81\x42\xc0\x7c\x48\x59\xba\x08\xa1\x47\xfb\x7d\x52\xd5\x9c\x54\x0d\xba\xea\x0f\x51\xb5\xca\xd3\x02\xf9\x89\xca\xce\x59\x4d\xc6\xce\x9e\x3e\x0b\xe1\x5b\x4f\x1b\x38\xa1\x10\x30\x3f\x52\x96\x1e\x3c\xab\x63\xb0\x55\x46\xc5\xd4\x71\xe5\xd5\x23\x77\x92\xf7\x11\xd3\x52\xa7\x98\x21\x78\x16\x4f\x12\xb0\xae\xab\x36\xfc\xf4\x1e\x2f\xff\x1d\x7a\x04\x90\xb2\xf4\x11\xde\x5a\x0c\xa7\xca\x5f\x16\xbb\x6f\x8f\xbf\xaf\x53\x37\x58\x87\xc2\xcd\xfe\xb1\xb7\x3e\x24\x45\xaa\xed\x7e\xc9\x1c\x57\x8d\x48\xff\x5d\x28\x04\x2c\x88\x94\x75\x0b\x61\x00\x22\x91\x64\xcd\x7a\x26\x78\x1a\xf2\xad\x62\x28\xfd\x65\xda\x7b\x69\x45\x5a\xac\x04\x11\x96\x29\x5c\xbc\x8e\xf5\x71\xbd\xeb\xbf\xeb\x97\x10\x52\x96\x01\x3c\xcb\x49\xe9\x86\x5f\x3e\xa9\xf0\x8c\x68\x2b\x4e\x05\xb8\x51\xf3\xf8\xa5\x71\x16\x5b\x70\x7c\xc4\xfa\xa5\xdd\xe8\xdb\x39\x04\xdc\xbf\x1f\xce\xc2\x48\x59\x86\xf0\xac\x4f\xa7\xc2\x3f\x35\x3e\x49\x7e\xe7\x97\x2d\x71\x44\x75\xb2\x2e\x25\xe5\xff\xe4\xb6\xeb\x64\x4f\xad\xc6\xf3\xfe\xc7\x9e\x0f\xf7\xef\x7a\x2f\x82\x94\x65\x84\x30\xad\xe3\x2c\xc1\xee\x4d\xe3\x66\xa4\x99\xca\x81\x1f\x73\x35\x43\x73\x8c\xe8\x3d\x95\x0c\xfd\x44\x33\x27\x8e\xc9\x64\x07\x1f\xc9\xef\xdf\xb6\x28\x52\x96\x31\x3c\x2b\x82\x8e\xe2\xca\x81\x63\xb1\xfe\xbd\xaa\xc4\xd2\x5f\x56\x61\x9b\xaa\x41\xa2\x06\x18\xe2\x8d\x33\xab\x7b\x55\xe9\x61\xa3\xdf\x7f\xd7\x42\x31\xa4\xac\xdb\xf0\xac\xe2\x04\x4e\x36\x70\x9f\xba\x34\x8d\xf4\xe9\xfa\x2e\xf3\x8b\xe2\x37\xeb\xd8\x9b\x92\x5e\x76\xa5\x6a\x57\x17\xee\x5f\xed\xdd\x40\x83\x42\xc0\xe2\x48\x59\x26\x08\x6d\xf4\x6c\xef\x73\xc7\xc5\x50\x94\x09\xe4\xb9\x7f\x0c\x6a\x9d\x18\xcb\xde\x32\xce\x69\xae\xd7\x26\x2b\x9e\xdc\x42\xa9\x74\xb0\x83\x42\xc0\x12\x48\x59\x77\x10\x06\xde\x8a\x3e\x59\x58\x7e\xaf\xe3\xdf\xa7\xe9\x53\xbf\x60\x2b\xf6\x2f\x22\xb3\x5f\x50\x51\xd1\x93\x04\x9f\x09\x5b\x5b\x25\xb5\x93\x41\x21\x60\x49\xa4\xac\xbb\xf0\x2c\xcb\xe7\x8e\x8f\xc2\x5f\x58\x6d\xb2\x90\x62\xce\x35\x37\xb8\xb0\xf9\x7a\xf4\x5c\xe6\xdf\x92\x4a\x4f\x76\xdb\x51\x6b\xa4\x41\xbf\x0f\x85\x80\x6f\x00\x0c\xd8\x80\x26\xbf\xff\x18\xb0\x99\xc2\x7f\x78\x3e\x36\xd5\x4c\x2c\xbe\xb3\xd7\x5b\x63\x7c\xe7\xee\x92\x07\xa4\xb5\xc7\x6c\xc7\x98\xf7\x64\xb1\x14\x7e\xd6\xf3\x94\x5e\xcf\xb9\x09\x85\x80\xa5\x90\x36\xe4\x1e\x3c\xab\x22\x24\xe5\x93\x39\x4d\x7f\xfa\x59\xf3\x26\x21\x93\x97\x7e\x7a\x72\xa7\x8c\x34\xc3\x5c\x25\x07\x56\xeb\xc3\x07\x85\x86\xab\xbf\x13\x84\x34\x52\x96\x19\xc2\xeb\xe3\xe7\x7b\x0e\x3f\xc7\x32\xed\x6b\x04\x5a\x3a\x49\x2a\x59\x2f\xfd\x60\xf8\x9e\x34\xf4\x72\xb4\xae\xde\xe4\x63\x88\x48\x37\xc5\x6f\x73\xcb\x20\x65\x99\xc3\xb3\x62\xc5\x55\x79\xf1\x06\xbc\xee\x15\x34\x39\xfc\x8a\x4e\x42\x13\x4d\xdc\xbc\xbb\xdf\xb4\x6d\x3c\x82\xad\xba\xf0\xd1\x22\xc4\xf2\x77\x72\x96\x45\xca\xb2\x80\x67\xad\xfe\x6a\x52\xa1\xbb\x4c\x5f\xce\x44\x2f\xde\x51\x6e\xa8\xbb\xf1\x91\xb8\x72\x90\xe1\xc6\xa7\x69\x09\xa6\xc4\xea\xf2\x63\xba\xdf\x69\x44\x0e\x29\xcb\x12\xa1\x18\x34\x34\xa8\xbc\x30\x94\x11\xbc\x74\x47\x1d\x93\x80\xb6\x3c\xb5\x30\xc2\x9d\xf8\x09\x53\x0b\x3e\xd7\x95\x60\x22\x3e\x2e\xbe\xdf\x85\x45\x1e\x29\xcb\x0a\x9e\xa5\x6f\x34\x45\x8f\x3e\x2a\xa4\x1c\x53\x36\xc6\x9d\x84\xce\x2c\xe9\x4a\x64\xb8\xf3\x9d\x48\x60\xe3\x60\x5b\xec\x51\xc6\x6b\xe9\xdf\x09\x42\x01\x29\xcb\x1a\x9e\x75\x9d\xeb\x67\xbf\x3d\xf4\x73\x21\x65\x61\xdc\x15\xbe\x3e\xfa\xe1\x94\xb9\x95\x56\xdf\x5d\x8e\xd6\x6b\xfe\x56\xb6\xe6\x3c\xa5\x28\x50\x08\xf8\x26\x52\x96\x0d\x42\x12\xf4\xb5\x56\xbe\xac\xde\x20\x9d\xf5\xf5\xa7\xde\xb2\xa3\xe0\x56\xf3\x98\x6e\x67\x6f\x8f\xe9\x51\x32\xe9\x7c\x90\x7c\x00\xe7\xef\x87\xb3\x22\x52\x96\x2d\x3c\xab\xae\x64\xbf\xad\x7f\xfb\xe7\x1c\xe9\x1b\xa9\x8d\x25\x3b\xf5\xf2\xcf\x02\x60\x66\x17\x09\x32\x7b\xb6\xfa\x97\xc1\xaf\x4a\xfb\x7f\xa7\x37\x25\xa4\x2c\x3b\x84\x37\x0d\x9f\x33\x7f\x45\x3f\x7b\x4a\xc6\x56\x40\x3d\xf6\xd1\x20\x21\x60\xf2\xac\x9b\xb2\xae\xdf\xb5\x09\x1d\xe3\x0b\x0e\xd3\x07\x55\x21\x28\x04\xac\x8c\x94\x65\x8f\x30\x5d\xf5\xa1\x1a\x55\x08\xe5\x20\xdd\xb0\x7f\x7b\x8b\x96\xc1\x48\x44\x9c\xd9\xf7\x67\x48\xc0\x2c\x81\x61\xc3\xee\xbd\xcd\xe7\x31\x3c\x50\x08\x58\x05\x29\xcb\x01\x9e\x85\xa5\x34\xf5\x31\x72\x07\x4b\xd5\x36\xd6\xd8\xe0\x57\x4a\xe8\x16\xb9\x7a\x9e\xf0\x88\x7e\xfe\x4f\x76\xee\x0a\x31\x62\xb5\x82\xdf\x83\x52\x55\xa4\xac\xfb\xf0\xac\x37\xc9\xd6\xef\x67\x72\xfb\x72\xef\x49\x82\xdb\xf2\x42\x12\x5b\x88\x48\x99\x1e\x46\x27\x6c\xf8\x58\x9c\xb4\xd8\x9b\x06\x8d\xfd\xf6\xaa\x1a\x52\x96\x23\xc2\xdb\xa7\x5c\x79\xb2\x69\xe2\x8e\xd1\xdb\x83\x44\xe0\x74\x3a\x39\xfd\xb0\xfb\x16\x22\xa5\x56\x63\x66\x38\xa6\xe5\x47\xe5\xaa\x61\x22\x50\x08\x58\x1d\x29\xeb\x01\xc2\x1b\xc9\x46\xfe\x1f\x67\xa2\x79\xd7\x56\x6f\x11\x0d\xe9\xb3\x15\x0b\xc9\x27\xd9\x33\x8b\x89\x29\x1a\xc7\x99\xdb\x34\x39\xdc\x88\x73\x86\x42\xc0\x1a\x48\x59\x4e\xf0\xac\x42\x2d\xb6\x20\x7d\xf1\x10\xde\xba\xd9\x68\xbd\xc6\xd7\xa3\x1d\xd5\x05\x33\x06\x07\x62\xdc\x33\xa3\x50\x9d\x39\x11\xfb\x2d\x75\x28\x04\xac\x89\x94\xe5\x0c\xcf\xca\xd4\x21\x98\x0a\xa0\x31\xda\x53\x13\xce\xe6\xec\x17\x58\xe7\xc1\xb4\x74\x53\x78\x68\x36\x3a\x96\xd7\x1f\x70\xdc\x78\x3d\x8f\x11\x0a\x01\x6b\x21\x65\x3d\x44\x08\xc2\xaf\x8e\xed\x17\xb6\x8c\x98\x21\xd9\x34\xc5\x1a\x52\x9e\xfd\x63\x93\x32\x1a\x64\x8b\xa3\x29\xaf\x7e\x92\x3c\x5f\xcf\x78\x26\x0a\x85\x80\xb5\x91\xb2\x5c\xe0\x59\x02\x97\xb9\x24\x74\x3d\xe5\x56\xdc\x6a\xda\xb5\x7e\x09\xb1\x27\xdc\xed\x5b\xb4\xb3\x99\xf9\x24\x1c\xf1\x66\x0a\x6d\x31\xd4\xe4\xb7\x57\x75\x90\xb2\x5c\x11\x16\x12\xcc\x3d\x5b\x7f\x64\xb5\x70\x7f\xde\xfb\x81\x69\xfd\x7d\x2e\xce\x6d\xd9\x82\x2e\x97\x14\x4f\x42\xc2\x9b\xad\xd6\xc6\x9c\x44\x0f\xa1\x10\xb0\x2e\x52\x96\x1b\xc2\x9b\xbf\x2b\xf9\xe9\x2e\xe3\x72\x33\xb5\xc9\x5f\xe6\xd2\xb1\xf9\x57\x35\x09\x87\xd2\x49\xfb\x8d\xd8\xaf\xac\x0a\x74\x3a\x97\x06\x3f\x80\x42\xc0\x7a\x48\x59\xee\xf0\xac\x59\x2c\xbe\x62\x16\x51\x17\x30\xd3\x10\xbb\x73\xce\xf2\xb5\x06\x6a\xd2\x1d\x5d\xf4\x9d\x0f\x4c\x56\xe8\x02\x55\x54\x0d\x24\xa6\x50\x08\x58\x1f\x29\xcb\x03\x9e\x35\x40\xa0\xbb\xf1\x88\x4e\x29\x8b\xe3\x45\x09\x93\x58\xaa\x77\x88\xfc\xd4\x46\xeb\x50\xf2\xa3\x8c\x5b\xc2\x53\xca\xb6\x14\xbf\x84\xa1\x10\xf0\x2d\xa4\x2c\x4f\x78\x96\xc4\xaa\xdc\x1a\x8f\x2d\x47\x58\x72\xca\x6d\x45\xbb\x53\x5a\xb2\xd8\x95\xf0\x6b\xcb\xe9\x8e\x2c\xfc\xc2\x13\x9a\x89\x9f\x3e\xb2\x40\x21\x60\x03\xa4\x2c\x2f\x78\x16\x46\xca\xb0\x55\xb6\xa8\x87\x5e\xc0\x58\xa1\xb6\xcb\x7d\x42\x70\x4d\x2f\xba\x7d\xb0\x38\xa9\xc0\x57\x59\xe2\x4d\x3b\x26\x3f\x4b\x28\x04\x6c\xf8\xff\x63\xed\xcf\xc3\xa9\x7a\xff\xc6\xff\xdb\xda\xdb\x3c\x8f\x71\x6a\x30\x45\x94\x22\x94\x29\x42\x29\xf3\x2c\x43\x66\x2a\x33\x19\xa3\xc8\x92\x8c\xc9\x54\xc8\x90\x31\x2a\x33\x99\x92\x90\x99\x84\x32\xcf\x89\xc8\x3c\xcb\x94\xfb\xd8\xdf\xeb\xd7\x71\xb3\xae\x6b\x7d\xfb\xfc\xee\xfb\x3a\x8e\xf7\x9f\xe7\xfb\xb9\x6d\xfb\xdc\x6b\xbd\xce\x4d\x0f\xa8\x2d\xcf\xc3\xad\x66\x7e\xde\x22\x8f\xdf\x39\x8e\x4b\x01\x99\xa4\x5f\x8d\x27\x67\x3d\xd2\x5d\x27\x1a\xcc\x86\x2f\x0f\xec\x8e\x6e\xe7\xf1\x86\x50\xc3\x00\xa3\x8f\xda\xba\x7f\xb8\x45\x47\xd8\x50\xea\x4b\xca\x1e\x66\xdb\xd7\xd5\x52\xd3\xa7\x42\x06\x52\x2f\xa6\xf1\x4c\x36\x5f\xe0\x57\xb9\x4c\x02\xfb\x3c\xb5\x85\x01\xe6\x26\x6a\xeb\xc1\xe1\x56\xdb\xb8\x9f\x6b\x44\x5a\x57\xd2\xb6\x48\x72\x5d\xa1\x5e\xe7\x40\xf7\xd7\x0f\x47\xbb\x52\x36\x1b\x57\x85\x1c\x9b\x79\x9d\x54\x71\x7b\xc2\x00\xb5\xe5\x85\x38\x10\x04\x89\xc6\xd5\x8d\xa5\x8c\x3d\xf9\x1c\x6a\xfa\x43\xf7\x19\x63\x32\xdc\x98\xbc\x27\x69\x1d\x78\x2e\xa4\xc0\x89\xbe\x3b\x5f\x0a\x06\x18\x43\xd4\x96\xf7\xe1\xd6\xbe\xfe\x95\x2f\x51\x6a\x03\x9b\xe1\xd7\x7c\x19\xd8\xd4\x23\xf7\xc5\x62\x2d\xf6\xaa\x69\xd5\xca\x38\x1a\x2b\x07\x55\x27\x45\xae\xc0\x00\x63\x84\xda\x7a\x78\xb8\x25\xf2\x23\xac\xab\x6a\xf3\x2a\x8b\xc4\x17\x5b\x5f\xd3\x9d\x1b\x4f\x4d\x59\x52\xd6\x3e\xb7\x1b\x26\x57\xb7\x7f\x5c\x51\xe7\xf9\x8a\x81\x01\xc6\xf8\x1f\x03\xdb\xbf\x7e\x05\xf1\xc0\xc0\xe6\x73\xf8\xc1\x4f\x72\x67\x75\xd6\x19\x1e\xff\x22\x4a\xa7\xbc\x57\x5d\xba\xf8\xe7\xdc\xb1\x08\x4a\xe5\x76\x8d\x30\x53\xea\x46\x92\xba\xc9\x0c\x33\x18\x60\x4c\x50\x9f\x08\x7c\xb8\x45\xa9\xfd\x6c\x8f\x7d\x41\xc2\xeb\x42\xb5\xd6\x8b\xed\x61\xb1\xa9\x8b\x67\x56\xb1\x92\xf5\x2b\xb6\xd4\xf4\x7d\x6f\xd9\xc9\x7d\x6f\xc0\x00\x63\x8a\xda\xf2\x3d\xdc\xda\x5c\x4d\xa6\x2f\x95\xe7\xfc\x7c\xe9\xfb\xe9\x39\x97\x71\xae\x71\xc6\xf2\xc2\x82\x79\xa7\x7e\xae\x6b\xb3\xf3\x9c\x89\x19\x6a\x02\x30\xc0\x98\xa1\xb6\x1e\x21\x2e\x2c\xe1\xab\x4f\x15\xe3\xc8\x5a\xf7\x2c\x3b\x1f\xb3\xbc\x94\xe9\xca\x9b\xaa\x54\x57\x57\xa0\x6d\x5f\x61\x76\x7c\x76\xf2\xdb\x7d\xdc\xc9\xd9\x1c\xb5\xe5\x87\x78\x8e\x2e\x81\xd7\xe8\x05\xc2\x7f\x6e\xcf\xf0\xff\x7e\x0d\x6e\xce\x93\xd6\x73\x6e\x32\x56\xbc\xa3\x3f\xbd\x6b\xf0\x35\xa3\xf9\x25\x6e\xea\xb7\x40\x6d\x3d\x3e\xdc\x6a\x89\x7c\xd8\xf1\x33\xa4\x50\x76\xf7\xb4\xd4\xdb\x6f\x2b\x15\xc1\xde\x0a\x3b\xd5\xfb\x1e\xbb\xf2\x8f\x97\xaf\x26\xb1\x91\xd6\xd9\xc3\x00\x73\x0b\xb5\xe5\x7f\xb8\x15\x12\x57\x46\x98\x33\x29\x19\xb5\xac\x34\x79\xf7\xdb\xd4\xe4\xa7\xb3\xdb\x61\x1c\x22\x17\x6c\x99\xf3\xa3\x94\x68\xa8\x09\xd9\x71\x37\xd4\xdb\xa8\xad\x80\xc3\x2d\x75\x96\x0e\x01\x9f\xcd\xc1\xdf\xbb\xe6\xde\x4a\x3d\x79\x37\x63\x5c\x38\x7e\xa6\xbf\x9f\xd6\xd8\x94\xec\x1e\xb1\x5a\x2b\x2c\x3c\x09\x03\xcc\x1d\xd4\x56\xe0\xe1\x96\xc3\x72\xe5\x23\x2f\x4f\xde\x86\x73\x22\x2f\x80\x2b\xf3\xdb\xb7\xbe\xd8\xca\xa9\x53\x66\x81\x09\xbe\xd7\xa6\x57\x96\xc6\xd6\x95\x61\x80\xb1\x44\x6d\x05\x1d\x6e\x31\x7d\xe6\x18\x1a\x19\x94\xcd\xd8\x99\x58\xf9\x4c\xe5\x6b\x1c\xf0\x73\x2b\x29\xe6\xa3\x72\xcf\xb1\xe8\xf3\x73\x9c\x31\x79\x21\x47\x61\x80\xb1\x42\x6d\x05\x23\x3e\x7d\xe2\xbe\xd3\x72\x5f\xf0\x6d\xf0\x67\x43\x95\x24\x57\xc9\x6d\xbc\xa3\xd4\xad\xd9\xd3\x27\x4f\x81\x82\x2c\xf7\x13\x33\xb5\x0f\xf8\x61\x80\xb1\x46\x6d\x85\x1c\x6e\xfd\x9e\x31\xbd\x5b\xd6\x29\x41\xf2\xf8\x27\x79\x03\x5f\x92\x17\x59\xd3\xbd\x0c\x6d\xae\xb0\x78\x0e\xc5\x4b\xd3\x21\x09\x27\x1d\x71\x07\x15\x1b\xd4\xd6\x93\xc3\x2d\xa1\x4c\xfd\x8b\x31\x9b\x17\xed\xe4\x38\xae\x08\x44\xf8\x18\xc8\xa9\xb0\x4c\xb1\x74\x44\x4e\x89\x58\xe7\x0e\x9b\xf8\x4f\xe4\xe0\x2e\x52\xb6\xa8\xad\xd0\xc3\xad\x00\x33\xe2\x9f\x27\xe8\x6f\xce\x7a\x25\x6e\xc4\xd3\xea\xb3\xd6\x53\xf6\x85\xb9\x3b\x59\x6f\xa9\x52\x0b\x3b\x34\x88\xdf\x94\x64\x81\x01\xc6\x0e\xb5\xf5\xf4\x70\x6b\xdc\x38\x7b\xc8\x32\xb7\x32\x7b\x95\xff\x5a\x50\x5b\x1e\x74\x6f\x39\x54\xc0\x93\xa4\xed\xfc\x1b\xd7\x1f\xb7\xce\x66\x6f\x1b\x9c\x80\x01\xc6\x1e\xb5\x15\x76\xb8\xc5\x6d\x10\xa3\xe7\x4b\xb5\x93\xcf\x1c\xe0\xb5\x5c\x59\x0b\x77\x08\x2c\x7c\x9a\xf5\x5f\xb2\xbe\xbf\x47\x0d\xab\x87\x29\xde\xc4\x9d\x76\x1d\x50\x5b\xe1\x88\x01\xc4\xec\x0a\xf8\xb2\x14\x72\x2c\xb1\x99\xcf\x25\xc2\x0a\x0f\x58\xbb\xc7\x3f\x62\x52\xf7\xa4\x77\x2d\xbd\x2f\x77\xd9\xe8\xb5\x23\x0c\x30\x8e\xa8\xad\x88\xc3\xad\x5d\x49\x3b\xdb\xd4\x32\xff\x9f\x5f\x1b\x95\x8e\x71\x26\x92\x74\x89\x09\xd0\xe3\xc7\xd3\x92\x32\x86\x87\x29\x18\x92\x5e\xb8\x8e\x3b\xf4\xdc\x45\x6d\x45\x1e\x6e\x7d\x28\xae\x70\xd1\xa1\xa2\x76\xfa\xf5\x9c\x27\xea\x2c\xa3\xb9\xe9\xf8\xfa\x93\x58\xcd\xd8\x13\xf3\x8f\x03\x3a\xcf\xe4\x9d\xd8\x93\x87\x01\xc6\x09\xb5\x15\x75\xb8\xf5\x52\xde\xb9\xb7\xbd\xb2\x90\xde\xfd\x5d\xdb\x3d\x7b\xee\x63\xb1\x80\x90\xf9\x69\xec\xee\x0f\x13\xd3\xfa\x28\x05\xbc\x0b\x23\xaa\x30\xc0\x38\xa3\xb6\x9e\x1d\x6e\xc5\xa5\xbc\x6f\xde\x2b\xa8\x94\xb9\x2c\x3a\xc8\xe3\xb2\xe0\x0f\x6c\xb4\x75\xa7\x7b\x3f\x60\xb7\xdb\xfe\x0c\x3f\xb2\xf9\x72\xf4\x02\x0c\x30\x2e\xa8\xad\xe7\x87\x5b\xc2\x9f\xbc\xd7\xcb\x65\x92\xcd\x14\xbf\xfe\x64\x25\x6f\xdc\xb0\x49\x20\xbb\x3b\xe8\xc1\xb9\xfd\xfc\x57\xd2\xc6\x25\x37\xe2\xc7\x72\x30\xc0\xb8\xa2\xb6\xa2\x0f\xb7\x7a\x1c\xdc\x67\x4f\x34\x54\xbd\xe2\x51\xab\x2f\xbf\x58\x5f\xd0\x72\xba\xc8\xed\x97\xef\xd6\xe3\x79\x62\x6b\x7c\x32\xb9\x78\x49\xdc\xe0\xed\x86\xda\x8a\x41\x1c\xec\xdc\xfc\x2a\x26\xf3\xaa\x58\xe5\x5e\x96\xe5\x84\x38\x71\xf1\x61\x85\x55\x34\x7a\xbb\xbf\xd9\xdc\xb6\x8c\x98\xbf\x12\xa5\x86\x3b\xa0\xbb\xa3\xb6\x62\x0f\xb7\xc2\xda\xa6\xce\xca\x73\x1c\xdb\x25\x78\x1f\x54\xf2\x96\x71\xad\xd2\x96\xf4\x9c\x4a\x2c\x93\x88\xfd\xb2\xd0\x3b\xb3\x9a\x8f\x5f\x71\xef\xc7\x7b\xa8\xad\x17\x87\x5b\xd8\xed\x28\x5d\x2f\xd1\x45\x0d\x29\xe5\x57\xca\xfa\x8a\x5f\x0d\x24\xee\x7f\x0d\xe1\xf0\x74\xf2\xf5\x17\xd1\x5b\x9b\x55\xae\x11\x84\x01\xc6\x03\xb5\x15\x87\xb8\x77\x68\x7b\xd2\xcd\x4a\xdc\xab\xca\xd6\xbc\x2a\xaf\xf5\x3a\xdd\x34\x60\xf0\xd4\x99\x67\xd4\x93\x35\x64\x2d\x66\x57\xd3\x73\xbe\x4b\xc2\x00\xe3\x89\xda\x8a\x3f\xdc\xb2\x17\x7e\xb1\x97\x83\x67\xe9\x4c\xe5\xef\x2c\x43\x37\x1b\x58\xf1\x52\x89\xc1\xf5\x8a\x88\xf1\xd7\x4c\x1f\x6f\xff\x59\x82\x24\xdc\xf7\xeb\x3e\x6a\x2b\x01\xf1\xab\x4c\xef\x65\x3c\xd3\x45\x75\xcf\xbe\xd0\xcc\x27\x4c\xba\xe9\x73\x8e\x4d\x61\xae\x27\x25\xbc\x89\xff\x19\xeb\x7d\xeb\xf7\x23\x95\xb8\xf7\xd0\x03\xd4\x56\xe2\xe1\x56\xf1\xbc\xe2\x46\x43\xc3\x9a\x5c\xb1\x77\xd8\xf2\xe5\xdd\xcf\xb2\x65\xaf\x8b\xfe\x64\x7f\x3d\x92\xf1\xb6\xea\xdb\x97\xb4\xa6\x21\x72\x18\x60\xbc\x50\x5b\x2f\x0f\xb7\x5e\x45\x4b\x40\x51\x3c\xb4\x7d\x03\xf4\x75\xfd\xee\x60\x2a\x71\xc3\x7b\x6d\x7f\xc9\xf4\x3e\x53\xac\x81\xe1\x87\xcd\xc5\x04\x53\x18\x60\xbc\x51\x5b\x49\x87\x5b\x2f\x92\xf3\xc6\x8f\x86\xba\x07\x5d\x8d\x6e\x96\xe6\x33\xaa\xbe\x97\xfc\x51\x41\xf1\x51\xf7\xb7\xa4\x59\xe2\xdb\x46\x31\x41\x9f\x70\xd7\xd5\x87\xff\x18\xd8\xfe\xf5\x0f\x41\x0e\x0c\x6c\xc9\x88\x9f\x13\x9b\x04\x5f\x8e\x7c\xd5\x4e\xf3\x3d\xa2\xee\x61\xa3\xb8\x23\x75\x42\xd5\xdb\xeb\x8a\x52\x8a\xb6\xae\x22\xd4\x2e\xd4\x65\x3f\x2c\x60\x80\xf1\x41\x7d\x22\x29\x87\x5b\x4a\xbd\x1b\xce\xdf\x9b\xa9\xd2\xf2\x72\x62\x94\x66\xbe\x68\x2c\x5a\xf7\xdc\x35\xbf\x27\x2a\xea\x57\xfe\xa3\x42\xfd\xc9\x43\x6e\x46\x18\x60\x60\xd4\x56\x2a\xe2\x0d\x7c\xf3\xa7\xb4\xd0\x8e\x8c\x01\x27\xab\xa0\x96\xdd\x29\x1d\xef\x0b\x8f\xf6\x5f\xbc\x33\x61\xd2\x2b\xd7\x55\x65\x28\x66\xe0\xb6\x82\x01\xc6\x17\xb5\x95\x86\xf8\x54\x2c\x9f\xe3\x6e\x8a\xdf\x1f\xbc\xba\xf7\xe6\xe0\x57\xa6\xac\xae\x50\x1c\x85\xb8\x7f\x49\x76\x4b\x27\x49\xf0\xc7\x2d\xa1\x70\x4a\x18\x60\x1e\xa1\xb6\xd2\x0f\xb7\x38\xd8\x8f\x78\xf5\xf3\x0b\x90\x08\x17\xf8\x98\xf5\x1d\x71\xbc\xab\x9b\x51\x7f\x97\xae\xbf\x77\xca\xed\x99\x55\xfb\xef\x67\x3e\x34\x30\xc0\xf8\xa1\xb6\x5e\x21\x4e\x95\x25\x21\x0b\x5b\x7b\x45\x81\x45\xf1\x76\xe4\x1b\x12\xf3\x9b\x55\xaf\xdd\xce\xdf\x55\xd3\x38\x2a\x44\x87\x27\xe0\xfa\x78\x1d\x37\x80\x3c\x46\x6d\x65\x1c\x6e\x75\xde\x28\x2a\x6d\x14\xd6\xf8\x48\xf9\x66\xe7\x64\xf4\x06\xd5\x2d\xa1\x32\xb2\xc6\x36\xb1\x11\xa7\x9d\x0b\x3d\x3a\x03\xaf\x7e\x33\xc0\x00\xe3\x8f\xda\xca\x3c\xdc\xba\xf2\x3c\xb5\xfe\x88\x75\x85\xc0\x05\x4d\x9d\x4f\x75\x33\xbc\x81\xde\x7f\x5e\x1c\x2b\x2f\x63\x67\xfd\x3c\x3e\xc7\xa8\x69\xe7\x82\x1b\x96\x03\x50\x5b\xaf\x11\x37\x9b\xba\x6d\x9f\x56\x9b\xe7\x82\x4b\x4a\x3f\x36\x8c\x39\x1b\x01\xb9\xf9\x26\x61\xf7\xc5\x82\x67\xde\xad\xa5\xc3\x44\x12\xe7\x2d\x61\x80\x09\x44\x6d\xbd\x41\xdc\xe8\x63\x05\x5b\xb6\x42\x92\x29\xfa\x6f\xeb\x3a\x13\x3f\x82\x7f\x06\xd2\x1f\xe9\x88\x61\xdf\x08\xbf\x37\x67\x9d\x2e\xe8\xd6\x87\x3b\x09\x06\xa1\xb6\xde\x22\xf6\x44\xc1\x62\xe5\x7c\xf6\xbb\xe8\xf1\xa7\x1c\xc2\x15\x64\x05\x2a\xf0\xef\x85\xee\x01\x91\x91\x11\xe1\x00\xe6\xec\x19\xee\x5a\xdc\x00\x12\x8c\xda\xca\x42\x7c\xef\x65\xc7\x57\x38\xcc\x03\xc5\x05\xcd\xce\x6e\x4f\x4a\x15\x3b\x57\x11\x9a\x86\x8e\x1e\x8f\x28\xa1\x2a\xc6\xe7\xcf\xdf\x08\x60\x85\x01\x26\x04\xb5\x95\x7d\xb8\x75\xfc\xe8\x70\xeb\xa8\x51\xf5\x85\xd2\xdb\x0f\xcb\x92\x5c\x5d\xcb\x1a\x1e\x8a\x51\x93\x93\xec\x98\x67\xf1\xb1\x4f\xff\x34\x1f\xc7\x0d\xde\x4f\x50\x5b\x39\x88\x1f\x6d\xdb\x8f\xf5\x9d\xa0\xfd\xa4\xce\x0a\xbd\x3b\x47\x9f\xe9\xe8\xfb\xdc\x39\x66\xb9\x56\x53\x8c\x32\xf1\x3e\xa9\x37\x7f\x1b\xbe\x11\x0c\x30\xa1\xa8\xad\xdc\xc3\x2d\xd6\x1b\x9b\x3c\x4b\x3e\xe7\x26\xaf\x1d\x91\x02\x21\xd2\x15\x4f\xc6\x79\x3b\x8b\xbd\x14\x64\x7a\xba\x13\x04\x19\xd7\x5f\xe7\xe0\x86\xd2\xa7\xa8\xad\x3c\xc4\xe1\xe2\xd7\xc8\x15\x19\x4e\x8d\xd7\x66\x91\x8e\x65\x86\x41\x6a\x51\x47\x78\x21\x2a\xa2\x23\xa6\xc9\x41\xaf\xd4\xb7\xc9\xfb\xd8\x71\x17\xf5\x30\xd4\x56\xfe\xe1\xd6\xce\x84\x5f\x2a\xd5\x31\xd7\xe0\x98\x4b\x5f\x32\xe8\x97\xe6\xca\x92\x05\xad\x63\xd3\xc5\xed\x1f\xee\x69\x76\xa4\x16\x76\xed\x68\xc1\x00\x13\x8e\xda\x2a\x38\xdc\x7a\x4c\xf7\x44\x8e\x35\xab\xe7\x14\xd5\x73\x43\xce\x9a\x0c\x3d\x55\x08\x8f\xbe\x5d\x37\x61\x8a\x27\x86\x53\xc9\x92\xc1\xc4\xe2\x14\x0c\x30\x11\xa8\xad\x42\xc4\xc0\x26\x9b\xfa\xbc\xb9\x68\x42\x01\x73\xd6\x92\x76\x9f\xfb\x57\x9a\x39\x86\xe7\xec\x87\x37\xf0\x45\x9e\xb5\x3c\xa8\x31\xba\x88\x0f\x06\x98\x48\xd4\x56\x11\xe2\x77\xb2\xde\xcc\x2a\x77\x4b\x8b\x95\xab\x5c\xd2\xe8\x74\x20\x67\x4c\xbb\x41\x74\xe7\xe4\x9d\x41\xab\x21\xbe\xa2\x5b\x22\x9d\xfe\x25\x97\x61\x80\x89\x42\x6d\xbd\x3b\xdc\x3a\xba\xc6\xfe\xf2\x96\x6d\x0a\xef\xa6\x73\x11\x81\xf9\x4f\x89\xb3\xa3\x23\xe9\x61\xb3\x9c\x26\x2a\xf1\x8f\x27\xb2\x3e\x2d\xbf\xc3\xdd\xb8\x9e\xa1\xb6\x8a\x0f\xb7\x8e\xb1\x55\xde\x8e\x19\x34\x18\x2e\xcd\xc5\x88\x05\x9d\x3a\x27\x1b\xb4\x28\x44\x30\x6d\xb8\x69\x1e\xa2\xa9\x8f\xf1\x5f\xaa\xc5\x83\x01\xe6\x39\x6a\xab\xe4\x70\x8b\x88\x89\xf6\x47\x35\x4d\xfa\xed\x1c\x21\xf0\xe2\x37\xc5\xfc\xd2\x39\xb1\x23\x84\xab\x5d\xf4\x27\xf9\x5e\xbf\xdb\x8a\x8f\x95\xc4\x1d\xf6\xa3\x51\x5b\xa5\x87\x5b\xcb\xd3\x4f\xe9\x39\xc2\x1b\xda\x69\xcb\x4e\x4b\x9d\xdb\xc4\x1b\xe3\x28\xd4\xff\x93\xc0\x66\x2b\xb6\xed\x71\xfc\x47\xa6\x0b\x15\xae\x15\x83\xda\x2a\x3b\xdc\x52\xf4\x48\xf8\x6a\x4e\x6a\xaf\x17\xad\x11\x1a\x46\x2a\xe2\xc6\xfe\x6d\xaa\xfe\x5b\xe5\x1a\xfe\x87\xf1\xae\xe4\x7d\xa7\x5b\x63\xa7\x61\x80\x89\x45\x6d\x95\x1f\x6e\xf1\xad\x7d\xbb\xd3\x4f\x52\x74\xf9\x26\xc3\xab\xc2\x7e\xb6\x6b\x2f\x0b\x4f\xf7\xe3\x83\x75\x03\x3a\xf1\xfd\xd9\xaf\xf8\xc5\xad\x5c\x30\xc0\xbc\x40\x6d\xbd\x3f\xdc\x5a\xf1\x25\x16\x10\xf3\x7d\x7e\xef\x4d\xa2\x22\x75\x67\x5e\xfb\x60\xbf\x45\x0c\x0f\x1d\x6f\xf9\x94\x73\xd6\x6d\xe5\x01\x25\x4d\xdc\x75\x22\x0e\xb5\x55\x81\xb8\x6f\x2f\xae\x18\x05\xae\x6f\xf3\x93\x41\x5e\x69\x1e\x6b\x5f\x26\x25\x82\x35\xb9\x87\x7b\x8e\x28\x02\x55\xe1\x27\xe5\x11\xc1\x36\x30\xc0\xc4\xa3\xb6\x3e\x20\xde\x8f\x74\xf5\x35\x0f\x67\xb8\x7d\x8b\x0b\x9c\x7f\x58\x70\xe6\x88\x1d\x1f\x50\xaa\x59\xef\xe2\x7c\x25\x74\xd6\x68\x8a\x8b\x7b\x55\x11\x06\x98\x04\xd4\x56\x25\xe2\xa7\x20\x49\x6b\x13\x8e\x41\x0c\xf6\x98\x29\xde\xc0\xcf\xb4\xf7\x09\xbe\x54\x10\x63\xaf\x7c\x3f\xed\x16\x3d\x1d\xcd\xef\x4b\x20\x8e\x1b\x96\x13\x51\x5b\x1f\x0f\xb7\x6a\xbe\x2d\xbf\xca\x23\x63\x9d\xa7\x6d\xf6\xb3\x48\xe0\xd2\x92\x7c\xcb\x26\x18\xff\xf0\xf4\x43\x8f\xd1\xa8\x7b\x8a\xbc\x50\xb3\x2c\x0c\x30\x2f\x51\x5b\x55\x87\x5b\x39\x14\x36\x57\xdf\x15\x2c\x8f\x51\x8a\xaf\x4a\x8d\xb5\x29\xd2\x9d\x74\x32\x9a\x92\xbe\x73\x7b\x5e\xf1\xf6\x34\xc5\x99\xf3\x84\x42\x30\xc0\x24\xfd\x63\x60\xfb\xd7\x3f\xc7\x3d\x30\xb0\x55\x1f\x7e\xf0\x12\xcc\x86\xd4\xab\x27\xb3\x22\x2b\x40\xef\x91\xa0\xfa\xe3\xe8\xa8\x65\xa3\xec\x13\x89\xa6\x5b\xcc\x7a\x56\x39\x18\xf5\x97\xb8\x4d\x94\x8c\xfa\x44\x6a\x0e\xb7\xac\xba\x5f\x1f\xdb\xee\xfd\x91\xf5\xc3\xfc\x1d\x3e\xa6\x22\x81\x2d\x56\x37\x86\xe3\x58\x8f\x06\x14\xdd\x61\xed\x99\x7f\xdb\x19\x77\xe2\x4a\x41\x6d\x7d\x3a\xdc\x8a\xed\xfc\xb1\xe0\xeb\x5a\xa9\x9e\xd3\x76\xee\xea\x0c\x97\x54\x45\xe8\xb4\xef\x05\x43\xee\xb9\x47\xcc\x50\x79\xc3\xd6\x43\x46\x65\x18\x60\x52\x51\x5b\xb5\x87\x5b\xcc\xf5\xfa\x71\xd4\xe3\x80\x26\xe8\x97\x09\x13\x8f\xc3\xe7\x08\x8e\x47\x24\x0b\xd1\x6e\x9a\xcd\xc6\x17\xd7\x55\xee\xb2\xd9\x03\x18\x60\xd2\x50\x5b\x75\x87\x5b\x0f\x5c\xbf\x7e\xe5\x98\xd7\x7e\x7b\x25\xf3\xd8\x42\xfc\xf8\xda\x23\xba\xd0\xbb\xe7\x65\x1d\xd2\x55\x30\xaf\x59\x4c\x7a\x92\x4b\xc9\x60\x80\x49\x47\x6d\xd5\x1f\x6e\xa5\x9d\x39\x9f\xf9\x2e\xfb\xf3\x6b\x5b\x9d\x30\x3f\x4e\xc7\xcb\x6f\x8c\x49\x7a\x47\xd9\x2e\x95\x0d\x52\x6c\xcc\x27\x29\x99\x08\x59\xc3\x00\xf3\x0a\xb5\xd5\x70\xb8\x35\xf2\xb0\x8a\xec\x9c\x95\x99\xf0\x3b\x9f\xa1\xbd\x74\x52\x3f\xad\xa5\x77\x24\xfc\x13\xc7\xc8\x82\x28\x1b\x73\x66\x37\x5f\x68\xe2\x06\xa3\x0c\xd4\x56\xe3\xe1\x16\x31\x3e\x79\xe6\x85\x55\xd1\x77\xa3\x73\x43\x90\x3f\x8b\x58\x50\x11\xfe\x51\xa0\x2a\xbe\x74\x59\xce\xeb\xa2\x79\x92\x91\x1e\x3d\x0c\x30\x99\xa8\xad\xa6\xc3\xad\x61\xfa\xdd\x4c\xaa\x98\x93\x3d\xe5\x59\x14\xaf\xea\xe8\x6e\x6b\x07\x9c\x53\x82\x42\xb6\xd4\xbf\x5d\x1f\x77\x58\x59\x03\xb4\xb8\x01\xf7\x35\x6a\xab\xf9\x70\x4b\xb4\x7a\x44\x7f\x92\xa6\x44\xb9\xd5\xc2\xd3\x2c\xd4\x61\x4c\xed\x6e\x8e\xf9\x87\xb2\xd1\xef\x96\x3a\x0f\x9c\xa2\xea\x2f\x30\xe3\x86\xd2\x37\xa8\xad\x96\xc3\xad\xd3\x14\x44\xe2\x62\x19\xd7\xcf\x5d\x10\x7b\xdd\xe0\x7f\x39\xc5\x81\xf9\x3d\x51\x44\xc3\x83\x62\x49\x53\x73\x19\xce\x29\x87\x61\xdc\xb0\xfc\x16\xb5\xd5\x8a\x38\x85\x0b\x9b\x46\x53\xdd\x97\xdd\x5d\xb1\x6d\xd4\xdc\x70\x27\x1a\x4c\x78\x7a\x9f\x69\xea\xac\x15\xc1\x33\xe2\xd9\x91\xd5\xf2\x6c\xdc\xc0\x96\x85\xda\xfa\x7c\xb8\x75\x6a\x69\x32\xae\xe7\xf4\xf3\xb5\x1c\x7c\x29\x0d\x63\xd8\x87\x33\xf6\xe7\x0c\x89\xe8\x2a\xed\xe9\xec\x8c\x49\x7e\x92\x9b\x4a\x0e\x30\xc0\x64\xa3\xb6\xda\x10\x9f\x48\x66\x77\xb4\x94\x85\xf6\xdd\xc5\x3e\xd1\xf1\xf6\xb7\x2b\x4b\x75\x27\xa0\x79\x20\x9f\xf6\xbe\x2a\x45\xc2\xe7\xa6\x94\x2d\xd7\x59\x18\x60\x72\x50\x5b\x5f\x0e\xb7\xe8\x7f\x77\xfd\x2a\x25\x74\x36\x98\x3b\x6a\x23\x34\x13\x1e\x44\xbb\x27\x81\xc9\x52\xa6\xac\xcc\x23\x5a\xb1\x53\x09\xe5\x12\xc3\x1d\xa0\x72\x51\x5b\xed\x87\x5b\xc9\xd7\xbc\x0b\xb1\x89\x1c\x9d\x5c\x45\xde\xde\xc2\xad\x6b\x37\xae\xcf\xab\x24\x51\x47\xe6\xef\x60\x06\xb4\xd8\xcd\x94\x62\xce\xc0\x00\x93\x87\xda\xea\x40\x0c\x7f\xf7\x1a\x2e\x9e\x50\xa0\x0e\xf0\xaf\x4f\x49\xe3\x9f\x95\x50\x56\x37\xb9\x11\x14\xc7\x13\xc6\x4a\xfb\x99\xbd\xe1\xb2\xcd\xfc\x35\x18\x60\xf2\x51\x5b\x9d\x87\x5b\x72\x33\x79\x3c\xda\x30\xe1\xed\x4d\xea\xd3\x50\x9e\x4a\x04\x4d\xf4\x58\x8e\xdd\xbd\x4f\xfd\x7d\x1f\x08\xb3\x69\x27\x55\x64\x71\xdf\xfb\x02\xd4\xd6\x57\xc4\xcd\xe6\xc7\xf7\xda\x19\x03\xed\x09\xc7\xbb\x63\x9f\x6a\x30\xa7\xd6\x56\xd8\xdb\xb5\x8e\x90\xab\xd0\x4c\xd4\x26\x66\x51\x3e\x5c\x71\x84\x01\xa6\x10\xb5\xf5\x0d\xf1\x69\xb0\xf2\xa2\xce\x78\x07\xbd\x66\xc4\x8b\xa0\x53\x0b\x8f\x98\xe7\x46\x9c\x34\x1f\x5b\xaf\x4c\x69\xaf\xf3\xd3\x7c\x63\x2d\x90\x50\x82\x01\xa6\x08\xb5\xd5\x85\x18\xfe\x42\x3c\xce\xbe\x7a\x69\x13\x49\x7f\x87\xe5\xaa\xfa\xf2\xc3\xd1\x33\xe2\xb6\x1d\x0c\x34\xf9\x96\xfa\xf2\x4c\x05\xab\x1d\xaa\x76\x30\xc0\xbc\x43\x6d\x75\x23\x7e\xc7\x68\xfb\x93\xd4\xd1\x93\xef\x59\x5c\x3b\x93\xd2\x67\x2f\xed\x7a\x1e\x7b\xc1\xee\xff\xb0\xaf\x8f\xee\x72\xce\xad\xb7\x8c\xae\x7c\x24\x30\xc0\x14\xa3\xb6\x7a\x0e\xb7\xb6\x4d\xb5\xd8\xe8\xa3\xe4\x8e\x5a\x1a\xbd\xe9\xe7\x6a\x89\x34\xc5\xd6\x77\x75\xed\x59\x3e\x0a\xb2\xb4\x17\x88\x08\xbc\xf2\x1e\x77\x73\x2e\x41\x6d\xf5\x1e\x6e\x45\xec\xf8\x3f\xdf\x58\x37\x6d\x4c\x65\xe7\xbe\xd9\x27\x57\x60\x39\xbc\x34\x37\x34\xde\x66\xd6\xc2\x11\x1b\x4f\xb3\x9a\x40\x8a\x7b\x3f\x96\xa2\xb6\xfa\x10\x07\x15\x63\xdf\xd5\xb2\x7d\xe9\x53\x85\x8f\x8d\x4b\x46\x0a\xce\x4e\x6e\x1e\x6f\xb0\xa0\x56\x15\xfb\x1c\x72\x4a\xe3\x81\x89\x38\x06\xf7\x3a\x96\xa1\xb6\xfa\x0f\xb7\x02\x03\x58\x8b\xa4\xb5\x92\x17\x04\xb4\xc1\x8e\xfb\x46\x08\xc9\x92\xcd\xa3\xfb\xf8\x83\xdf\xcb\x8d\xb8\x8e\xfc\xea\x73\x89\x35\x83\x01\xa6\x1c\xb5\x35\x80\x38\x5c\x4c\xe6\x1f\x17\x59\x89\xa7\x4d\x13\xe5\x23\xc1\xff\x8e\xf1\xd7\xb8\xf7\x7b\xea\xbd\x04\xec\xe6\x7d\xb5\xfc\xc7\xf3\xf9\x3a\xdc\x90\xf5\x1e\xb5\x35\x88\xf8\x29\x88\x1e\x78\xd8\x9d\xdc\x25\x16\x39\x67\x75\xd5\x88\x70\x39\xd5\x55\x4d\x8e\x28\xf1\x01\x91\x3f\xf3\x19\x3d\x01\xdb\xa4\x64\xdc\xfb\xb1\x02\xb5\x35\x84\x18\x66\xa4\x5c\x7c\x06\x6a\x4f\x2d\x4f\xe5\xe4\x49\x06\xaf\x99\x6f\x8c\x84\x4c\x8c\xeb\x24\x29\xa5\x36\xb5\xa8\x73\x8e\x2b\x7e\xc3\xc0\x00\xf3\x01\xb5\x35\x8c\xf8\x44\xd2\xac\x4b\x6c\x82\x30\xa8\x6b\xa1\x96\xa7\xe4\xd9\xa3\x3c\x2a\x4c\xb2\x56\xf4\xf9\x80\x95\xb4\x1b\x82\x51\x4f\x77\x5e\x88\x10\xc0\x00\x53\x89\xda\x1a\x41\xbc\x87\xa8\xcf\x13\x9e\x1b\x09\x6f\xfe\xf8\xe5\x24\xf7\xf9\x47\x52\xc1\x7b\xfb\x5e\x02\x29\x0c\x5d\xb1\x81\x9a\xf4\x23\x61\x1a\x6f\x70\x7b\xf5\x23\x6a\x6b\xf4\x70\x4b\xc6\x00\xff\x52\x5b\xac\xea\x69\xb5\x27\xb3\x0f\x0b\x24\xe7\xc6\x48\x06\x2c\xe4\xfe\x78\x9d\x24\x5f\xd7\x16\x52\x5d\x12\x3c\xa9\x09\x03\x4c\xd5\x3f\x06\xb6\x7f\xa1\x28\x07\x06\xb6\x31\xc4\x27\x6c\x56\x8e\x54\x74\xb4\x2f\x0b\x94\x98\xe4\x0d\xa9\x17\x84\x65\xfb\x96\x30\x6f\x5e\x39\x8f\x79\x12\x25\x7f\x60\x50\xf7\x28\xc3\xdd\x04\xab\x51\x9f\xc8\x77\xc4\xef\x2b\x7d\xbc\x50\xc2\x99\xfc\xee\x8b\xc8\x2c\xad\x56\xb9\x6e\x42\xe8\xfe\x1a\x73\xb2\x56\xf1\xb9\xab\x7b\x5e\x7b\x91\x5f\xd8\x77\x71\x27\xfa\x1a\xd4\xd6\xf8\xe1\x56\x06\xe7\x05\x7f\x2e\x52\x43\x81\x00\x93\x3a\xdf\x1f\x4c\xb5\x2e\x99\xb9\x9a\x32\xbc\x67\x0b\xf1\x95\x47\x4d\xc3\x09\x9c\xd5\xd8\x61\x80\xf9\x84\xda\xfa\x81\xf8\x91\xa8\x72\xdc\xc7\xae\x09\xf5\x11\xda\x67\x5f\xc8\xcb\xf8\xb7\x1f\x26\x17\x72\x84\xd9\xcc\x85\x73\xd4\x76\x9b\xc8\xd4\x7a\xe0\x41\x30\xc0\xd4\xa2\xb6\x26\x0e\xb7\xec\x3e\x99\x59\x76\xc8\xe5\xd8\x90\x2e\x5d\x1c\x83\x1a\x54\x68\x4e\xfb\x26\x75\xcd\x86\x15\x7b\x90\x4e\xb7\x4f\xd0\xd0\x88\xe2\x6e\x5c\x75\xa8\xad\xc9\xc3\xad\xd6\x26\x19\xd6\xcd\xf7\xb1\xaf\x6f\x86\x4a\x0f\x75\x58\xf6\x11\xc8\x75\x7f\x95\xf6\xe9\xa4\xb2\x2b\x92\x5c\x3c\x2f\xfb\x9c\x58\x04\x06\x98\x7a\xd4\xd6\xcf\xc3\xad\x86\x39\x7f\x6e\x88\x2f\xf9\x58\xbc\x4f\x83\x51\x78\xbf\xe0\x1a\x38\xcd\xf3\x8a\xa5\xce\x41\xf3\xd3\x0f\xea\xdc\x2a\xba\x54\x6d\x18\x60\x1a\x50\x5b\x53\x87\x5b\x2e\xaa\xd0\xbb\xbb\x6f\x3f\x57\xed\xc9\xab\x9c\xcc\x55\xca\xee\x58\x1b\xdb\x5d\x0d\xfd\x24\xfb\xb5\x73\xae\x3f\x92\xc9\xd7\xcd\x1c\x06\x98\x46\xd4\xd6\x34\xe2\xf7\xa8\xc2\xc3\x63\x98\x7e\xab\x1d\x7b\x97\x70\xc3\x9e\x78\xf9\xee\xe7\x7e\x21\xdd\xbe\x15\x46\x52\x22\x7d\x05\x76\xfe\xcb\x23\xad\xf8\x30\xc0\x34\xa1\xb6\x7e\x1d\x6e\x61\xce\x39\xde\x28\xe5\x0d\x1f\xb7\xe3\x4e\x31\x90\x17\x98\x3b\xd6\xb5\xb7\x68\xf3\xee\xb6\x6e\xca\x4d\x89\x0d\x31\xae\xcd\x5a\x5c\xab\x19\xb5\x35\x73\xb8\xf5\x63\xe2\x15\x91\x6d\xc9\xd5\x33\x59\x3f\xca\x09\xc6\x26\x17\xd7\x87\x4e\x1b\x6d\x76\x67\x50\xe9\xe4\xc4\x0b\x67\x6e\xdb\x0d\xe0\x86\x99\x16\xd4\xd6\xec\xe1\x96\x3b\xfc\xf8\xab\xfe\x86\xe1\x6c\x22\x8b\x70\x46\x5c\x8e\xb5\x1c\x2c\x73\xbf\xa7\x22\xf4\x58\xeb\x6e\xa4\xa7\xee\x1b\x01\x61\x5a\x18\x60\x5a\x51\x5b\x73\x88\x4f\xc5\x42\x2f\x0f\x5d\xca\xe7\xc2\x8a\xcf\x48\xfa\xa8\xd6\x7e\xc6\x37\xe6\x6c\x5d\x3b\x49\xcf\xf1\xe6\x79\x51\xb5\x0e\xa3\xa7\x22\x6e\xaf\x7e\x46\x6d\xcd\x1f\x6e\xdd\xda\x1b\x96\x23\x21\x76\xd2\x63\xb3\xb8\xf6\xf8\xd2\x25\x6d\xe6\xe1\x98\x37\xa1\x35\x6e\x8d\x6f\x6d\xf1\x2c\x4b\x2f\xe4\xd8\xe1\xf6\x57\x1b\x6a\x6b\xe1\x70\x8b\x66\x6d\xc0\x7c\x80\x4b\xa8\x5e\xec\x6e\x96\x4f\x8a\x89\x4f\xaa\x8c\xf7\xe9\xfa\xfd\x91\xc1\xc8\x02\xfa\x2d\x7e\x05\xce\xdd\x1b\x30\xc0\x7c\x41\x6d\x2d\x22\x3e\x4d\xd1\xde\x81\x0c\xe0\x13\x89\x82\x29\x6e\x64\xeb\x9a\xfb\x8a\xf1\x6b\xa1\x1a\xc7\x4b\xf9\x0b\x5d\xb2\xd3\x5c\x7b\xca\x4b\x71\xaf\x63\x3b\x6a\x6b\xe9\x70\xcb\xe2\x8e\xe2\xf2\xfa\x1e\xdd\x1d\x8e\xd1\x2b\xfc\x73\x27\xef\x64\x49\xd2\x11\x0d\xcb\x1b\xec\x6f\x72\xfb\xba\xbc\x49\x3f\x7f\x04\x77\xb0\xeb\x40\x6d\x2d\x23\x86\x99\xf3\xb4\xe5\x3f\xd3\x32\x19\x77\x1d\xe3\xee\xde\xa0\x32\xdd\xb9\x64\x16\x42\xc3\x7b\x9f\xb0\x87\x6b\xe5\xfa\xc5\xb7\x06\x43\xb8\x6b\x4e\x27\x6a\x6b\xe5\x70\x6b\xf0\xc8\x22\xb3\xeb\x1d\x1e\xeb\xcb\x84\xb7\x8d\x73\xae\x00\x6e\x21\xe0\xf2\xfd\x83\x2d\xcc\x90\xe0\x05\x47\x79\x33\x17\xe2\x6e\xce\x5f\x51\x5b\xab\x87\x5b\x67\x67\x83\xac\xbe\x3b\x6e\x96\x54\xc8\x85\x8e\x6b\x4f\x8c\xbd\x95\x18\xeb\x91\x59\x17\xbb\x55\xdd\x62\xbc\x5b\xe4\x1a\xcc\x86\xbb\x09\x7e\x43\x6d\xad\x1d\x6e\x39\x9d\x56\x5f\x13\x1a\xb6\x1d\x3e\xf6\x87\x22\xf3\xfb\x40\xdc\x13\x0c\x34\x7f\xb6\xfc\x9e\xeb\x13\x83\xd3\x8c\x47\xd6\x3a\x34\xef\xc0\x00\xd3\x85\xda\x5a\x3f\xdc\xfa\x72\xaf\x3d\x71\x7a\x11\x63\xee\x51\x36\xf2\xb1\x9f\x87\x37\xd5\x46\xdb\xd2\x91\xd3\x84\x3a\x6a\x48\xe6\x98\xd1\x73\x2a\x56\x03\x18\x60\xba\x51\x5b\x1b\x87\x5b\x8b\x33\x96\x43\x01\xc4\xe4\x6b\xee\xef\x74\x0c\x38\x6c\xee\x32\x38\x94\x56\xaf\x94\xf3\xa8\x9f\x3c\xf1\xe2\x2a\x5e\x69\xe0\x43\x3d\x18\x60\x7a\x50\x5b\x9b\x87\x5b\x96\xce\x66\x8e\x21\x0d\xbe\xcb\x86\x0d\xeb\x72\x0a\x67\xbf\x8f\x14\x9d\xfd\x5c\x10\x6f\xc3\x7d\xd4\xb6\x64\xe3\xf3\xfc\xc0\x6f\xdc\xfb\xb1\x17\xb5\xf5\x1b\xf1\xa9\xd8\x57\x4a\x0f\xcd\x97\xdc\x67\x26\xdf\xf2\x35\xe4\x51\xe4\x1c\xf7\xdb\x2c\x22\x9a\xca\x15\x7d\x53\xc4\x5c\xb2\x20\xb8\x97\x79\x1d\x06\x98\x3e\xd4\xd6\xd6\xe1\xd6\xe7\x9a\x29\x91\xf7\x6d\x4f\xa7\x08\x89\x9e\xbd\xe8\x0c\x9e\x09\xb8\xe6\x62\xff\x87\xe2\x1e\x6f\xca\x03\xd7\xf4\x62\xe0\x24\x82\x7b\x8e\xfd\xa8\xad\x6d\xc4\x27\x59\xef\x1b\xdd\xb8\x19\xbb\x39\x2f\xe8\x45\x54\xc6\x85\x5d\x58\x9f\x85\xbf\xf2\xbf\x0c\xb4\x54\xa1\x8b\xd6\x8d\x07\xe7\x65\x38\x60\x80\x19\x40\x6d\xed\x20\xae\x85\x3d\xec\x2a\xcc\x4d\x09\xd1\xb4\x57\x4c\x82\x82\xde\x32\x77\x35\x1d\x79\xec\xd8\x68\x28\x92\xd9\x46\x53\x7d\xaa\x51\xb5\x00\x77\x50\x19\x44\x6d\xed\x1e\x6e\x85\x3a\xb8\x4f\xba\x9b\xc7\x55\x6d\x08\x84\xdd\x78\x7f\xe9\xb5\xfe\xce\xd0\xa4\x37\x9c\x76\x4c\xf9\xa3\xda\x28\xd5\xcb\xb8\x40\x27\x18\x60\x86\x50\x5b\x7b\x87\x5b\x04\x4f\x2d\x59\x7b\xea\x4b\xf4\x17\x0d\x2d\xf5\x05\xf1\xb2\xa6\x1d\xae\x30\x7b\x8d\xe8\x8f\x16\x68\x28\x0d\x84\x76\x37\xdb\xe2\xae\x39\xc3\xa8\xad\x3f\x87\x5b\x59\x42\x77\xe3\x2f\xc1\xe4\xc3\xa3\x7c\xad\xe1\x39\x12\x18\x77\x56\x0b\x7b\x1e\x7f\xc5\xfc\xad\x9f\x94\x6f\xdf\xb2\x16\xa4\x49\xc2\x00\x33\x82\xda\xda\x47\x1c\xaa\xf5\x59\x48\x3b\x84\xc7\xdc\xcf\x51\xe9\x91\xbe\xe2\xae\x57\x60\x3c\x17\x9b\x9e\xf1\xa7\xb6\x31\x74\x60\xd3\xeb\xb4\xd4\x0c\xee\x7b\x3f\x8a\xd2\x6a\xa7\xfb\xcf\x68\xba\xff\xef\xc0\x06\x20\x84\xb8\x76\x46\xa4\xae\x33\xc7\x99\x5c\x4b\xf6\xd4\x74\x2b\xc6\x52\x15\xa8\xd7\xef\x78\xed\x75\x4b\xbd\x1f\xbb\xb3\x7b\xf3\xf2\xc5\xd3\x2a\x30\xc0\xa0\x8a\x6b\x00\x42\x98\x6b\xa4\x6a\x1f\xe6\x67\xf4\xa6\xca\xee\x1f\xcd\xff\xb2\xd5\x99\x72\x87\x64\x9b\x9e\xed\x56\xd2\xe7\x88\xeb\xa6\x4c\xc6\x64\x59\x21\x27\x60\x80\x41\x35\xd7\x00\x84\x50\xd7\x60\xef\x88\x97\x14\xb5\xfc\x3c\x53\x2c\xda\x4b\x8a\xae\x25\x85\xc1\x2a\x47\x83\xef\xb5\xe6\x3f\x9d\xaa\xa1\xa9\x9b\xa0\x29\xc1\xbd\x57\x50\xd5\x35\x00\x21\xdc\x35\x9a\xdb\x09\x52\x17\x57\x1c\x29\x8e\x0f\x0f\xf7\x7c\x8c\xdc\x08\x1e\x23\x28\x5b\xb3\x67\x32\x31\xfc\x65\x96\x89\x8d\xbc\x95\x75\x12\x06\x18\x54\x77\x0d\x40\x08\x79\x6d\xa4\x28\xa3\x01\xe3\x20\x69\xee\xcf\x37\x1e\x6d\xde\x66\xd2\x23\xed\x71\x95\xb4\xf2\x08\x20\x9e\xe0\xff\x18\x65\xe9\xd9\x04\x60\x80\x41\x95\xd7\x00\x84\xb0\xd7\xf6\xbe\x8b\xf8\x65\xbb\x77\x44\x50\xc9\x91\xb5\x52\x6a\x7e\x27\x1f\x49\x74\x37\xd7\x0f\x4a\x27\xf2\xa3\xeb\xdb\x1a\x0b\x2d\x93\x85\x01\x06\xd5\x5e\x03\x10\x42\x5f\xf3\x3c\x31\x44\x61\x11\xa9\x4c\xc4\x1d\x0b\xbf\xd4\xcd\xcf\xea\x28\x22\xd2\xa7\xaa\xde\x89\xad\x8b\xe3\x80\x7f\x4e\x08\x9d\x97\x86\x01\x06\x55\x5f\x03\x10\xc2\x5f\xcb\xcb\x54\xca\x11\x8a\xf4\x6f\xd4\x76\xa8\xf5\xb9\xdd\x5e\x6b\x11\xd8\x50\x8d\xb7\x2f\x75\x5f\x2d\x8f\xfd\x39\x49\xea\xb0\xe5\x55\x18\x60\x50\xfd\x35\x00\x21\x04\xb6\xd4\x22\xf9\xc1\x81\x3b\x1f\x3b\xce\x5a\xca\x70\x3d\xd3\x28\x95\xe1\x2d\x50\x34\x63\xea\x3b\x1d\x0c\x05\xf9\xdd\xf6\x7c\xfb\xc3\x10\x06\x18\x54\x81\x0d\x40\x08\x83\x0d\xd6\x8a\xba\x51\xd2\x50\x84\x6f\x47\x50\x37\xcf\xfa\x33\x0f\xd0\xca\x50\x4d\xf9\x86\xe3\xf7\xc5\xc9\x0c\xda\x6d\xd8\x47\x5e\x84\x01\x06\xd5\x60\x03\x10\x42\x61\xb3\x0b\xc1\x32\x5d\x38\x6f\x25\x6b\x7f\xed\x79\x77\x22\x2f\x63\xc0\x2b\xb2\x2d\xe9\x4f\x2b\x98\x9f\xbf\xf4\x5a\xfb\x88\x9c\xd4\x71\xd7\x51\x54\x85\x0d\x40\x08\x87\xcd\x61\xc6\x31\xec\x32\x39\x9f\x69\xfe\x4a\x07\x7d\x8a\xbb\xc2\x90\x27\x4f\xf1\xa7\x17\xcf\xe4\x45\x6f\xb9\x7c\x37\xac\x1f\xda\xc5\xc2\x00\x83\xea\xb0\x01\x08\x21\xb1\x09\x44\x70\x33\xd2\x87\x85\xb5\xb5\xb8\x73\xfd\x9e\xbf\x4f\x35\x1e\x7f\xe3\x7d\x24\xc6\x4b\xb7\x3a\x3d\xad\xd0\x5e\x32\x8e\x92\x0b\x06\x18\x54\x89\x0d\x40\x08\x8b\xed\x26\x3f\x3e\xf3\x80\x8e\xee\xf7\x27\xb6\x32\x96\xd2\x9a\x95\x25\xd7\x9d\x0c\x98\x6e\x79\xb7\xfa\x5d\xcf\x1a\xaa\x6c\x23\xaf\xa5\x86\x01\x06\xd5\x62\x03\x10\x42\x63\xeb\xbc\xd9\x67\x7a\xeb\x5b\xc7\xec\xa4\xf3\xb4\xb0\x9e\x4d\xf0\x97\xbd\x40\x93\xac\xf9\x8f\xad\x02\x8b\x01\x11\xb5\xa9\x49\xb0\x2d\x0c\x30\xa8\x1a\x1b\x80\x10\x1e\x9b\x34\x8d\x51\xc8\x1e\x26\x5b\xbe\x69\xf9\x0c\x9f\x4b\x3c\x27\xd5\x06\x9d\x7a\x64\x9a\x6e\x45\x16\x89\xf2\xe9\xc9\x99\xee\xb6\x63\x30\xc0\xa0\x7a\x6c\x00\x42\x88\x6c\x31\xbe\x7a\xf2\x6d\x1b\xbc\xe2\x51\xea\x2a\x4f\x9c\x54\x88\x1f\xfc\x12\x38\x07\xaf\x37\xc6\xee\xc6\xb0\x5b\x7a\x9c\xfb\x38\x66\x01\x03\x0c\xaa\xc8\x06\x20\x84\xc9\xf6\xbd\x6b\xf6\x06\x5e\xca\x74\x43\x60\xb5\xfa\xc9\x95\xe3\x86\x94\xf4\x36\x53\x4d\xe3\x6f\xec\xc3\xbf\x72\x48\xf5\x74\xb7\xed\x18\xc3\x00\x83\x6a\xb2\x01\x08\xa1\xb2\x8d\x7d\xaa\x33\x0a\xf4\x12\x72\x4a\x60\xbe\xe7\x94\x45\xff\xfc\x5e\x71\xfe\xde\xe3\xb6\x65\x8b\x78\x6f\xba\xd5\x77\x4b\xc9\x7b\x1a\x30\xc0\xa0\xaa\x6c\x00\x42\xb8\x6c\xc2\x64\x0a\xdf\xae\x8f\x11\x30\x6c\xde\x89\x64\xfb\xc4\xc2\xd9\xa0\x7e\xe2\x8e\x88\x99\xcd\xe5\x71\xfa\xb9\x4d\xf1\x38\x67\x32\x6b\x18\x60\x50\x5d\x36\x00\x21\x64\x36\xc5\x5a\x19\xd9\x1d\x3a\xf3\xb7\x4e\x84\x15\x3c\x52\xcc\x74\x04\x74\x47\xdc\x1e\x91\xbc\xe4\xbf\x81\x9d\xc5\x4b\xb9\x5c\xd2\x4a\x05\x03\x0c\xaa\xcc\x06\x20\x84\xcd\xf6\x3c\xf6\xa1\x2c\xcd\x9e\xcb\xda\xd7\x42\x5e\xbf\x45\xa2\xf4\xcf\x52\x62\xb5\xa7\xba\xaa\x53\x1c\xff\xe4\x56\x9c\x55\xe3\xb1\xbc\x05\x03\x0c\xaa\xcd\x06\x20\x84\xce\x56\xd8\xb3\xe8\xc1\xd2\xfa\x68\x5d\x44\x37\xd9\xeb\xe8\x6f\xcd\x67\xbb\x72\xb7\xab\x30\x9f\x1e\xb5\xdf\x8c\xd3\x2d\x70\x30\x14\x10\x80\x01\x06\x55\x67\x03\x10\xc2\x67\xf3\x0a\x8f\xd8\x53\xf6\xa1\xa7\x08\x77\x58\xa5\xf1\xbe\xec\xe8\xbe\x70\x9e\xb5\xda\x91\xd5\x5a\xec\xa7\x8f\xfb\x94\x33\x29\x1f\x25\x0c\x30\xa8\x3e\x1b\x80\x10\x40\x1b\xc5\xc7\xe7\xef\xcb\xec\xf0\xd8\x47\x9b\xcc\x86\x3e\xc6\x9a\x12\x30\x90\x47\xcf\x8b\x5f\x75\x9a\x1c\xe7\xbb\xeb\x25\xe4\x17\x71\x14\x06\x18\x54\xa0\x0d\x40\x08\xa1\x4d\xdf\xf3\x6b\xab\x4c\xcc\xe8\x4d\x13\x51\xf8\x57\x28\xbe\xdf\x80\xe2\x9d\x57\xfa\xbf\xfb\x5b\x3e\x1c\xf1\x78\xc5\xf3\xe8\x7d\x21\x6e\xc4\x44\x15\xda\x00\x84\x20\xda\xa6\x4e\xc5\xcd\xff\x52\xfe\x5e\xf6\xe2\xdd\x96\x7c\x89\x86\xc6\x8c\x35\xc3\x17\x31\xa9\xb5\x00\x83\x3f\x6c\xc7\xbb\x0c\x82\xdb\x15\x61\x80\x41\x25\xda\x00\x84\x30\xda\x2e\x77\xb9\x5f\xdf\x9d\x8f\x38\x11\xd7\x7c\xf2\xf3\xca\x7b\x9a\xac\xf2\x7a\xb6\x91\xb9\xb9\x9a\xb5\x39\xcf\x39\xf5\x35\x9b\x34\x2b\x18\x60\x50\x8d\x36\x00\x21\x90\x36\x93\x10\x61\xef\x1d\x8e\xa3\x7a\x0a\x85\xaf\x8f\xbc\x1e\x11\xff\xd1\xb0\xbd\x62\x4a\x4a\xdd\xa2\x4f\x54\x2b\xfa\xbe\x56\xaa\x51\x0c\x06\x18\x54\xa4\x0d\x40\x08\xa5\xcd\xbb\x5f\xe7\x17\x76\x44\x48\x34\x4d\xb5\x2e\x86\x9d\xcc\x60\x7c\x87\xe2\xd9\x38\xc5\xfb\x69\x39\x6c\x69\x6a\x7b\x71\xc9\x7d\x62\x18\x60\x50\x95\x36\x00\x21\x98\x36\x8e\x33\xc4\x01\xe1\xee\x2c\x5c\x7f\xc8\x5c\x9c\xfb\xbe\x4c\x53\x2e\xf7\xea\x16\xeb\xbf\xff\x79\x8c\xaf\xeb\x84\x50\x27\x36\x0a\x77\x3d\x43\x65\xda\x00\x84\x70\xda\xd6\x39\x76\x77\x6a\x7f\x7e\xb4\x55\x71\x8f\x74\xfd\x43\xa6\xb4\x31\xc9\xdb\xda\x6b\x78\xa7\x58\xe1\x6e\x9f\xdb\x8a\x82\xed\xed\xb3\x30\xc0\xa0\x39\x6d\x7f\x07\xba\x7f\x01\xc2\x07\x07\x3a\x04\xd4\xd6\x41\x21\x84\x61\xfb\xba\x6e\x75\xe2\x62\x0a\x7f\x04\xfe\xef\x82\x9a\x2a\xbc\x50\x95\x72\x02\xe2\xe3\x5d\x44\x5e\xd5\x24\x7f\x4e\xc3\x00\x8b\x0a\xb5\x01\x08\x21\xb5\x8d\x10\x19\xb4\x2c\x11\xf6\x17\x52\xa9\x07\xaa\xfe\x9e\x23\xb0\x6b\xaa\xd8\xa4\x7a\xec\xfa\xac\x06\xab\xff\x36\x67\xe2\x4c\x3c\x37\x0c\xb0\xa8\x52\x1b\x80\x10\x54\x9b\x43\x80\x78\xff\x62\x00\x3b\x7c\xab\xb2\xf8\x9e\x1d\x87\xe5\x62\xdb\x9b\xdb\xaa\x16\x42\x4e\x06\xe7\xec\x56\xab\x0a\x0b\x25\x71\x31\x54\xaa\x0d\x40\x08\xab\xcd\x14\xf6\xff\xc6\x05\xab\xe5\xdf\x8a\x8d\xac\x87\x37\x9e\x79\xde\x3f\x92\xe0\xad\x6d\x93\x43\x41\x4e\xb2\x36\x4c\xe2\x59\xa0\x0b\x03\x2c\xaa\xd5\x06\x20\x04\xd6\xf6\x32\xb2\xaa\xfa\x8f\x7c\x98\x64\xf2\xe3\x0d\x65\xcf\x88\x81\x35\xb6\xb4\xcf\x59\x1e\x7f\x62\x04\x84\xbd\x02\xb5\xcf\xe9\x5a\x73\xc0\x00\x8b\x8a\xb5\x01\x08\xa1\xb5\xbd\x22\x23\x9e\x5d\x39\x13\x50\x10\xf0\xda\x91\x67\x76\xa4\x6a\x91\x58\xf0\xf4\xbd\x26\xb1\x28\x4f\x50\x41\x82\xef\x60\x72\x9a\x04\x06\x58\x54\xad\x0d\x40\x08\xae\x4d\xbc\xa5\x5f\x56\xe2\xb3\xf3\x28\xaf\xfc\x38\x45\x8b\x46\xf2\x77\x36\x7e\x89\xbb\xdc\xa2\x5f\xb8\xe1\x4b\xe1\x7b\x4b\x09\x75\x96\x30\xc0\xa2\x72\x6d\x00\x42\x78\x6d\xd9\xf8\x4a\x90\x6b\xe4\xfc\x49\xd7\xd3\x23\x94\xf9\x6c\x91\xaa\x51\x2c\x37\x02\x75\x6d\x44\x6a\x97\x1c\xcf\xf7\xef\xb2\xae\x33\xc2\x00\x8b\xea\xb5\x01\x08\x01\xb6\x51\xa8\x30\x0c\xd7\x46\xbf\x98\xd8\xb8\x4c\xa8\x4c\xa5\x48\xe8\x93\x74\x34\xfd\x45\xe7\xc0\x26\xdc\x45\x4d\x96\x36\xff\xfd\x39\x1f\x0c\xb0\xa8\x60\x1b\x80\x10\x62\xdb\x98\xf1\x20\xf6\xda\xb6\x77\xcd\xf9\xc0\xbe\x0a\x4a\x9e\xe6\x26\xb3\x2c\xa2\x87\x3a\xf1\x31\xdc\x1d\x6a\x9c\x9f\x3c\x8e\x9a\x4b\xc3\x00\x8b\x2a\xb6\x01\x08\x41\xb6\x59\xbd\xed\xa9\x7b\xe9\x2f\x6b\xa7\xce\x6a\xfd\xd4\x5b\x28\x60\x9f\xaf\xfd\x4a\x74\x55\x9b\x91\xce\x47\xa5\x13\x43\x2f\xa7\xce\xc8\xc0\x00\x8b\x4a\xb6\x01\x08\x61\xb6\xd9\x9f\x8b\xd5\x7e\x63\xfd\x65\xb5\x35\xf6\x51\xb0\xc9\xe9\x05\x6f\x81\x66\xff\xb8\x12\x35\x9a\x26\x93\xd1\x8c\x8f\x3a\x03\x10\x05\x0c\xb0\xa8\x66\x1b\x80\x10\x68\x9b\x4c\xec\x2b\x89\x85\xb1\x42\x65\x4f\x1d\xde\xf2\x10\xc6\xe8\xdc\x41\x6a\x2a\x62\x93\x2c\xa6\xfd\x99\xcb\xc1\x8a\x8c\x18\x42\xdc\x7b\x13\x15\x6d\x03\x10\x42\x6d\x63\x6a\x9c\xd1\x49\x18\xac\xeb\x2c\xdc\x22\x37\xf0\x50\xbd\xcc\x24\x94\x49\x1d\xe8\x27\x60\x39\x3f\xed\x26\xa3\x77\x06\x16\xa4\x82\x01\x16\x55\x6d\x03\x10\x82\x6d\x63\xf9\x49\xb8\x59\x47\x3e\xf6\xe7\x7c\xf5\x19\x23\xa1\x1f\x95\x29\xbb\x2e\x16\xb6\xa9\x67\xa1\x1f\x73\xce\x6e\x6d\x26\x96\x1a\x37\x61\x80\x45\x65\xdb\x00\x84\x70\xdb\x96\x96\x24\x7a\xc8\xd4\x44\xfd\xa2\xa3\x6f\xb6\x6e\xe5\xc3\x47\x44\xf5\x29\x03\x19\x25\x2b\x54\x7f\x9a\x98\xea\x38\x99\x91\xe1\xc1\x00\x8b\xea\xb6\x01\x08\x01\xb7\x65\x94\x3c\x63\x53\xa3\x3a\xee\xde\x03\x6a\x3b\x5b\xf6\xa6\xc4\xbf\x10\x7d\xdd\x69\x10\xff\xf2\x92\x6c\x7e\x1f\x4f\x2d\xe8\x31\xee\x05\x40\x85\xdb\x00\x84\x90\xdb\x4a\x1f\x94\x5b\x52\x28\x6a\xac\x3e\xda\x76\xfb\x55\xbf\xde\xa8\x5b\xc9\x98\x46\xb3\xab\xbc\xf6\x05\x9c\x79\x5d\x81\xb7\xb8\x7d\x0d\x06\x58\x54\xb9\x0d\x40\x08\xba\x4d\xaf\x20\xea\xd7\xc6\x6d\xf5\x8f\xeb\x31\x39\x46\x06\xfe\xe3\x84\xa5\x82\x41\xbd\xd2\x0f\x8a\x30\xce\x2e\xf1\x67\xee\xd9\x68\xe2\xae\x67\xa8\x74\x1b\x80\x10\x76\xdb\xab\x97\xb4\x0a\xe7\x6f\x85\xb0\x32\xf7\x9b\xdf\x20\x7b\xeb\x11\xdc\x45\x49\x20\xf0\xc1\xd9\x45\x46\x9c\x71\x95\xfe\xce\x6d\xf9\x63\x30\xc0\xa2\xda\x6d\x00\x42\xe0\x6d\x31\xfe\xbd\x7b\x27\xae\xff\xa1\x7b\xe6\xdb\x60\xe3\x7d\x86\xfa\xe5\x23\x1d\xaf\x07\xb5\x1b\xea\x41\xe7\x7a\x85\xcb\xaf\x36\x99\x62\x61\x80\x45\xc5\xdb\x00\x84\xd0\xdb\x12\x9c\xef\xbc\xb0\xe1\xa4\x79\xa0\x36\x00\x2c\x96\x22\x9f\xda\x7d\x84\x4a\xd4\xcb\x2f\x18\xd6\x6d\x90\x65\x9c\x08\x0a\x51\x3e\x01\x03\x2c\xaa\xde\x06\x20\x04\xdf\x76\x4e\x9d\xf7\x18\x8f\x50\xd4\xa3\xc2\xb6\x94\x0d\xf8\xa1\x4e\x0c\x45\xb9\x81\x69\xc2\xce\xb5\x02\xd8\xef\x9b\xd8\xf1\x99\x10\x5e\x18\x60\x51\xf9\x36\x00\x21\xfc\xb6\x20\xa5\x4e\xbb\x6b\xe3\x8c\x73\x7b\xb7\x3d\x8a\x55\x29\x1d\xc2\x54\xbe\x0d\x86\xf0\xd9\x39\x33\x7d\xdd\xbd\xb7\xa4\xe2\xc1\xe3\x00\x03\x2c\xaa\xdf\x06\x20\x04\xe0\x26\x3e\xa3\x52\x17\xce\xf6\xc9\x23\xdd\xbb\xe6\x13\x5f\xcb\xd8\x80\x1b\x49\x97\xaa\x98\x39\xd3\x22\xd0\x08\xa1\xfc\xbd\xa1\x8e\xfb\xca\x50\x01\x37\x00\x21\x04\x37\x8d\xad\xe9\xe4\xef\x9e\x02\xd1\x14\xb2\x56\x2c\x85\xcc\x94\x2a\x0b\xb3\xec\xfe\x9f\x9e\xbb\xaf\x7d\x16\x7b\x6e\xf3\x2c\x9f\xd0\x1c\x06\x58\x54\xc1\x0d\x40\x08\xc2\xad\x70\x89\x3d\xeb\x73\x0c\x97\xda\x07\x25\xbb\x9e\xfb\x13\x65\x6d\xa4\xad\xfc\xa5\xef\xdd\xa7\xf4\x02\x36\xda\xe2\xd9\x4c\xe7\xe9\x61\x80\x45\x25\xdc\x00\x84\x30\xdc\xbc\x74\x1a\xa6\xfa\x47\x5b\x25\x03\x6a\x23\x38\x5e\x18\x72\x01\x4c\xf7\x9c\x3b\x19\xd9\x9f\xb4\xef\xb4\xba\x69\x15\x0d\x39\x27\x61\x80\x45\x35\xdc\x00\x84\x40\xdc\xe2\x37\x12\x3b\x92\x59\x05\x72\x9e\xd0\xa6\x6d\x90\xf6\xd8\x71\x37\x44\x30\x0a\x6a\x46\x69\x56\xe3\x93\x61\xd2\xb2\x42\x0b\x0c\x61\x80\x45\x45\xdc\x00\x84\x50\xdc\x9e\x8a\xb1\x50\xb6\x59\xf4\xa8\xf6\x06\xbc\x3a\x21\x7e\xe1\xbc\xad\x83\x56\x86\xea\x38\x46\x31\xe7\x8d\x6e\x36\x56\x36\xff\xda\x45\x18\x60\x51\x15\x37\x00\x21\x18\x37\x9f\x2f\xaf\x0d\xc8\x5c\xfd\xb9\x9f\x5c\xb2\x8c\x67\x8e\x91\x8f\x17\x93\xb8\x5c\x82\x6f\xac\x33\x28\x9c\x33\xbf\xb8\xb9\xfd\x90\x1d\x06\x58\x54\xc6\x0d\x40\x08\xc7\x4d\x51\x41\x5b\xa4\x60\xda\x32\xe8\xa7\xb2\x95\x5b\x87\x04\xe5\xd8\x27\xd2\x10\x57\xa3\x48\x2a\xd5\xeb\x3f\xbc\x5e\x0b\x3f\xde\x61\x80\x01\x16\xcd\x71\xfb\x3b\xd0\xfd\xeb\xcf\x3c\x1c\x1c\xe8\x10\x90\x9b\x25\xa1\xf4\x07\x73\x3d\xbe\xdd\xc6\x39\x39\x8e\xa1\x90\xe2\xbe\x3c\x91\x98\x62\x16\x51\x65\x73\xdd\x5a\xff\x27\xc5\x91\xbb\x3c\x30\xc0\xa2\x42\x6e\x00\x42\x48\x6e\xee\x6c\xf9\x04\x1b\xa4\x0c\xee\x4e\xcf\x14\x76\xae\x2c\x5b\x64\x2d\x2f\xbd\xa0\x4a\x6a\xbf\xf5\x21\x27\x66\x88\xc1\xea\xf7\x27\x7b\x18\x60\x51\x25\x37\x00\x21\x28\x37\x8b\x26\x59\xaa\xb2\xa9\x70\x03\x17\xc7\xa5\xdc\x97\x3f\x09\x3e\xed\xce\x0b\x5c\xfd\x3a\xf3\x5d\x62\xe3\x52\xc0\xb3\x86\x99\x30\x59\x18\x60\x51\x29\x37\x00\x21\x2c\xb7\x0b\x17\xd4\x6a\x2f\xbc\xbe\x43\xb2\xed\xb7\x32\xa8\xbe\x74\x71\x67\xb9\x4b\xe3\xe5\xf2\x57\x47\xfd\x86\x53\x94\x97\xca\x5f\x7d\xb7\x81\x01\x16\xd5\x72\x03\x10\x02\x73\x93\x20\xfd\x43\xad\xa8\xe9\x7d\x46\x41\xfc\x02\xf4\x41\xb8\xee\xb9\x21\x6f\x8d\xc6\x93\x3b\x3e\x24\xf4\xf7\x59\xed\x3e\x1a\x44\xe0\x2e\x80\xa8\x98\x1b\x80\x10\x9a\x1b\xb4\x72\xdb\xbf\xa5\x70\xb9\xdf\x78\xa9\x50\xf9\x51\x10\xa5\x72\x71\x61\xa7\x4e\x08\x8b\xe8\xf9\xd1\x98\xd5\x50\xc0\xf2\xf5\x3a\x0c\xb0\xa8\x9a\x1b\x80\x10\x9c\x5b\x81\xe7\x31\x0c\x6f\xbf\x2a\x1d\x37\xa8\xbc\xb8\xa9\x51\xf2\xe2\xf5\xbc\x55\xda\x2f\x02\xd1\xe3\x45\xfb\x5d\x66\xec\xe3\xaa\x1a\x30\xc0\xa2\x72\x6e\x00\x42\x78\x6e\x44\xcb\x78\x34\xa4\x01\xaf\x56\x4f\x3f\xcb\x51\xf5\x56\xb3\xfb\x12\x6b\xf4\xa8\x72\xc1\xfa\xfe\xf5\x73\x1d\xb7\x4c\xfc\xa6\x54\xae\xc0\x00\x8b\xea\xb9\x01\x08\x01\xba\xc9\xbc\x8a\x1a\x26\x14\x14\x0e\xef\xc4\x46\x7b\x08\x05\xc8\x8a\x5c\xbb\x19\x51\x54\x9d\x7b\xeb\xa9\x19\xe7\xc2\x6f\x99\x3b\xf7\x8f\xc0\x00\x8b\x0a\xba\x01\x08\x21\xba\x85\xd6\x59\x38\xdc\xf2\x7b\xb0\x9e\xfc\x5d\x24\xe8\xe7\x0e\xa7\xb3\xdf\x0d\xed\xcc\xe1\x59\xac\x90\xce\xbb\x88\xed\x95\x23\x95\x0a\x30\xc0\xa2\x8a\x6e\x00\x42\x90\x6e\xac\x45\x6d\x9a\x29\xb0\x9f\x45\x23\xf6\xa7\x90\xcf\x93\xd7\x2d\x5f\x6b\xd6\x4f\x5c\x0d\x8a\xec\x1e\x9f\xbb\x7d\x3e\x8f\xc5\x1e\xf7\x3d\x43\x25\xdd\x00\x84\x30\xdd\x34\x73\xe3\xbc\x7f\xf5\xbb\x24\x69\x6d\xde\xcb\x59\x74\x55\xfb\xde\x63\x97\x77\xce\xda\x7e\x37\x90\x44\x66\xb0\xea\x93\x03\xfd\x6d\x18\x60\x51\x4d\x37\x00\x21\x50\x37\x87\x92\x19\xd7\x6c\xa5\x2b\x9e\x0b\x73\xf1\x1f\xb3\x3d\xe1\x40\xb7\xed\x53\xbf\xcc\x75\x03\x5a\x4d\x9f\x91\xd4\x8c\x8d\x5f\x95\x82\x01\x16\x15\x75\x03\x10\x42\x75\x8b\xf2\xb1\xca\x33\x9b\x8c\x73\x8a\xbe\xa2\x21\xfe\x4e\xc4\x43\x48\xba\xcd\xb3\xf6\xe5\xd5\xc4\xd0\xe5\x44\x65\xb5\x73\xba\x8b\x04\x30\xc0\xa2\xaa\x6e\x00\x42\xb0\x6e\x5c\xe5\x1f\x0d\x73\x1a\x2e\xf3\x68\x0c\x4e\x50\xb1\xee\xa5\xd2\x8b\xd7\xfe\xd2\x65\xe5\x24\x75\xeb\x1c\x3c\x59\xd1\xec\xb7\x85\x1b\x4e\x50\x59\x37\x00\x21\x5c\xb7\xd0\xc8\xab\x26\x7f\x18\x36\x3f\x5c\xa0\x2d\xf5\x7e\x6d\x95\x30\xc7\xce\xd6\x1a\xab\x46\x25\xae\xa5\xb5\xbf\x48\x1b\xa4\xa0\x04\x60\x80\x45\x75\xdd\x00\x84\x80\xdd\x1c\xec\x98\x8f\xf3\xa7\xe4\x95\x06\x68\x5d\xb5\x21\xfb\x19\xfa\xc7\xa9\xa5\x17\xae\xb6\xa8\xe1\x12\x7a\xf7\xf5\x33\x6b\x1d\x87\x35\x0c\xb0\xa8\xb0\x1b\x80\x10\xb2\x1b\xc8\xcb\x35\xe2\x96\xbb\x94\xd1\x34\x44\x5d\x76\xd9\x06\xff\xc9\x26\x89\xf5\xd1\xf3\x52\xbe\x89\xd6\x47\xaf\xd0\x7e\x0e\x04\x64\x30\xc0\xa2\xca\x6e\x00\x42\xd0\x6e\xf5\xb3\x44\xa7\x14\x75\x3f\x7e\x57\xe4\x4b\xfe\x4c\x1e\xda\xd7\x3a\xfb\x24\x49\x29\xbf\xaf\xfa\xe8\x8c\x9a\xc2\x35\x0b\x72\x09\x2d\x18\x60\x51\x69\x37\x00\x21\x6c\xb7\x2f\x44\xd7\xa7\x2e\xc5\x53\x2f\xc8\x46\x90\xeb\xec\x9e\x89\x62\xe6\x8f\x8d\x6c\x98\xc0\xb6\x0c\x26\x7e\xb8\x90\xd4\x7d\xf1\x16\xee\x1d\x80\x6a\xbb\x01\x08\x81\xbb\xfd\x24\xa3\x3c\x1e\xb6\xeb\x9d\xbd\x98\x9a\x93\x38\x4e\xff\x7b\xe1\x8a\x88\xca\x5e\x4c\x3f\xc3\xea\xb5\x8f\x83\xe7\x75\x9a\x9f\x6b\xc3\x00\x8b\x8a\xbb\x01\x08\xa1\xbb\x05\x8e\xc9\x4f\xed\xd4\x69\xb7\xf4\x29\x5c\x3f\x3a\x50\x6d\xf4\x6d\x74\x25\x21\xda\xd3\x7a\x78\xc6\xb9\xd1\x72\x53\x88\x6f\xd5\x09\x06\x58\x54\xdd\x0d\x40\x08\xde\x6d\xd6\x23\xf7\x0b\xc3\xab\x74\x5d\xa7\xf9\x55\x25\x96\x50\xea\x1f\xbe\x57\x26\x32\x92\x85\x72\x09\xc9\x64\xad\x95\xfa\x5e\x19\xdc\x82\x01\x16\x95\x77\x03\x10\xc2\x77\x6b\x7e\xfb\x8a\x98\x05\x1b\x1d\x05\xca\x6f\xba\xc0\x14\x9b\x24\x79\x32\x4c\xae\xfc\x03\x8a\x6e\xa3\xf3\x2e\xf9\xdf\xc7\x43\x8e\xc3\x00\x8b\xea\xbb\x01\x08\x01\xbc\x9d\x94\xc8\xb4\xa4\x7d\x12\x40\xa3\x54\xe3\x4c\xff\x5d\xc6\xc0\x82\x6b\xf3\x62\x5c\xc7\xef\xd3\x91\x3b\x37\x74\x98\x59\xe5\xcc\x04\x60\x80\x45\x05\xde\x00\x84\x10\xde\x4e\x9f\x3f\x8a\x9f\x1a\x5b\x23\x7c\xe5\xbb\x71\xec\xe3\x81\x1c\xcd\x69\x26\x8e\xcb\x5d\x3f\x5a\x14\x5e\x68\xc4\x7c\xfb\xd2\xbd\x20\x06\x03\x2c\xaa\xf0\x06\x20\x04\xf1\xf6\xc3\x90\xfa\xb7\xca\xf3\x45\x42\x37\xdb\x7b\xdf\xf9\x07\x78\x86\x3d\xf0\x0b\x65\xb4\x84\x12\x5d\xa2\x4e\xe4\x12\x44\xff\x39\x8f\x7b\x35\x51\x89\x37\x00\x21\x8c\xb7\xa5\xe3\xdc\x7b\x1f\x06\x5b\x5a\xee\x34\xa9\xb4\x27\x5a\x16\x2b\x0b\xd7\x8f\xa9\xd7\x34\x6f\xb0\x9c\xc6\x06\xce\xde\xe4\x21\xe0\x82\x01\x16\xd5\x78\x03\x10\x02\x79\xab\x0e\xfa\x9c\xc7\xe7\x7f\x73\xf6\xe5\xeb\x80\xd7\x0f\x6a\x26\x9f\x5c\xf2\x94\xad\xd2\xed\xbd\xc5\xcb\x6c\xf2\xe0\xd6\x6d\xcc\x4d\xdc\xa6\x45\x45\xde\x00\x84\x50\xde\xbc\x99\x4c\x86\xe9\x36\x23\x48\x1e\xf0\x36\x1f\xeb\x59\x69\x3a\x91\x98\x7d\xea\x25\xa7\xb4\xb9\xf5\x54\x86\xc4\x9c\xc8\x8d\x7d\xdc\x0b\x80\xaa\xbc\x01\x08\xc1\xbc\xc9\x4c\x2f\x31\xee\xb0\xb8\x8f\x3e\x95\x55\x3a\x3a\xb4\x61\x3a\x3c\x50\x44\xb4\x5a\xf7\x6d\xac\xb9\xec\x95\x59\x25\xc9\x49\x27\x5a\x18\x60\x51\x99\x37\x00\x21\x9c\xb7\xe7\xfc\x3d\x72\xa1\xd1\x7c\xcf\x02\x29\xaa\x78\x13\xe9\xd2\x14\x97\x49\x59\xa2\x4e\x69\x57\x90\x06\x6a\xd8\xf2\x5c\xfc\xe3\x8e\x7b\x07\xa0\x39\x6f\x7f\x07\xba\x7f\xfd\x31\xae\x83\x03\x1d\x02\x7a\x83\xce\xd7\x48\xe8\x43\x1b\xcc\xc9\xf3\xce\x37\x34\x84\xba\x7a\xca\x9b\x9a\x12\xae\x5d\x58\x79\xff\x59\xea\xf9\x4b\x2e\xab\x4d\xdc\xf7\x05\x15\x7a\x03\x10\x42\x7a\xf3\x78\x58\xc6\x2d\x60\x57\x75\xfa\x69\x15\x63\x8a\x4c\xc3\x9c\xe4\x30\xcf\x09\xca\xfe\x1a\x81\xe1\x76\x35\x7f\xef\x7b\x58\x37\xdc\xf1\x18\x55\x7a\x03\x10\x82\x7a\xbb\x7f\x73\x48\xbb\xe5\xfc\x0d\xca\x48\x37\xf5\x0c\x65\xea\xbe\xaf\x9c\xdb\x35\x71\x39\x95\xbf\x5e\x7d\x19\xc1\x6b\xf2\x66\x1d\xbb\x03\x03\x2c\x2a\xf5\x06\x20\x84\xf5\xf6\xab\xe4\x52\x93\x94\xf6\x1f\xbe\x7a\xc7\x86\x0f\x0d\xf4\xe6\xaf\x88\x15\xbf\x17\x09\x44\x75\x50\x56\xf2\x19\x13\x7c\x64\x52\x33\x81\x01\x16\xd5\x7a\x03\x10\x02\x7b\x7b\x97\xc5\xf5\x74\x47\xe5\xe9\xed\xe0\x62\xf2\x41\x43\xd3\xa6\x8b\xf3\xe6\x3a\xd3\xa6\x9d\xec\x1e\x32\xdc\x51\xb3\x57\xcb\x48\x55\x61\x80\x45\xc5\xde\x00\x84\xd0\xde\x2c\x1c\xd5\x6c\x38\x9c\x7e\xef\xaf\xcd\x17\xde\xbb\x60\xc0\x30\x31\x55\x31\x75\x45\x30\x4c\x36\x61\x5d\xff\xd4\x39\xb2\x6c\x4b\xdc\xa4\x83\xaa\xbd\x01\x08\xc1\xbd\x5d\xff\x74\xce\x83\xf6\xbb\xc5\xb1\x60\x3d\x8a\x82\xeb\xc5\x6d\x2b\x8f\xb4\xd3\x27\x72\x05\x47\x68\xe8\xb2\x6f\x48\xa4\x94\x48\x9f\x85\x01\x16\x95\x7b\x03\x10\xc2\x7b\x8b\x7d\xa6\xbd\x48\x4a\x45\x3e\x4c\x6f\x50\xbc\xa5\x6b\x6b\xdb\xc4\x72\x3b\xa7\x37\xc1\xc1\xab\x5d\xf4\xc1\x1d\xfe\xd1\x13\x49\x66\x30\xc0\xa2\x7a\x6f\x00\x42\x80\x6f\x69\x7b\xb6\x25\xf9\x43\xcd\x33\xbc\x1f\x07\xfc\x2d\xa4\xbe\x32\x4d\xd0\xfd\xec\xb7\x77\x8b\x26\x19\xee\x39\x15\x41\x7c\x82\x0c\x77\x35\x45\x05\xdf\x00\x84\x10\xdf\x1e\x54\xd4\x3f\x98\xd4\xc0\x1f\xd6\x74\xff\x90\xa4\x9d\x45\xa0\x22\x63\x5b\x3b\x31\x05\xad\xd1\x5d\xad\xaa\x6b\xa6\xf7\x52\xc7\xc0\x00\x8b\x2a\xbe\x01\x08\x41\xbe\xc1\xac\x46\xe7\xfc\xcd\x99\x19\x56\x73\xba\xd9\x79\xf3\x0b\xeb\xb7\x2a\x74\x5d\x5b\x32\xa9\x83\x73\x3d\xb2\x15\x49\x8c\x69\x70\x2f\x00\x2a\xf9\x06\x20\x84\xf9\xb6\x78\xc7\xb7\xac\xe6\x2c\x39\xd7\x13\x1e\x28\xf4\x84\xec\xb4\xda\xdb\x05\xdd\x46\xc6\x09\xd1\x1a\x92\x93\x02\x32\x6c\xd9\x13\x84\x30\xc0\xa2\x9a\x6f\x00\x42\xa0\x6f\x89\xf8\xe1\x50\xca\x93\xaf\x79\x3b\xe2\x62\x11\x22\x3f\x1e\x75\xa9\x27\xda\x7e\x92\x3b\x39\x39\xc9\xf3\xf4\x6d\x35\xff\xf5\x22\xdc\x51\x0f\x15\x7d\x03\x10\x42\x7d\x93\x5e\x53\xac\x5c\x61\x0e\xfb\x35\x52\xf3\xf4\x11\xfe\xcb\x74\xc2\x08\x0e\x1b\xb7\x46\xac\xa4\xb6\x94\xde\xdc\x3c\xf4\x20\x89\x06\x06\x58\x54\xf5\x0d\x40\x08\xf6\xcd\x37\xf2\x99\x99\x45\xe0\x0d\xee\xd9\xf8\xeb\x43\xaa\x3e\x31\x9f\x27\x3b\x9b\xd4\x4f\x27\x2c\x39\xdc\x8d\x74\xe5\xa2\x12\x49\xc7\xcd\x60\xa8\xec\x1b\x80\x10\xee\xdb\xfd\x57\x11\xb7\xfb\xb9\x3f\x2a\x4f\xfd\x58\xfd\xbd\x17\x59\xc9\xc4\xb4\xd8\x6d\x97\x3a\xc0\xcf\xd1\x74\xbc\x25\xc7\x48\x3c\x9b\x0d\x06\x58\x54\xf7\x0d\x40\x08\xf8\xad\x7a\x72\xc6\x6d\xa0\xaf\xf1\x6d\x06\x6d\x71\xbd\x75\x3f\xbd\xe3\xae\xfc\x2d\xff\x95\xd1\x3f\x75\xdb\x33\x56\x56\xe9\x47\x12\x58\x61\x80\x45\x85\xdf\x00\x84\x90\xdf\x7e\x4b\xcb\x25\xab\xd2\x15\x28\xd9\x66\x0b\x6e\x73\x92\xe7\x57\x38\x14\x0c\xd7\x8c\x9d\xe9\x8c\x3b\x4b\x77\x9a\x7f\xee\x79\x20\x6e\x3c\x47\x95\xdf\x00\x84\xa0\xdf\xc8\xa3\x99\xef\xb4\xeb\x6f\x0c\x2e\x6f\x54\xe5\xa5\xa9\x50\xf1\xc6\x54\xcf\xd8\x73\x5c\x5a\x35\xa4\xf5\x5f\xee\xa5\x96\x61\xc2\x0d\xc1\xa8\xf4\x1b\x80\x10\xf6\xdb\x75\x85\x53\xdc\x94\x8c\xad\xae\x6b\x19\xb5\xbf\xa5\x03\x67\xb7\x2b\x1f\xa6\xbb\xb6\xe7\x85\xc9\x2f\xbb\x59\x8d\x3e\x0a\xbe\x24\x0d\x03\x2c\xaa\xfd\x06\x20\x04\xfe\x96\x47\xe2\xf7\x3b\x7f\x44\x26\x58\x59\x2c\x98\x1f\xc3\x94\xfc\xde\xf2\xda\xdb\x5f\x95\xc3\x64\x9a\x42\xc2\x9e\xe1\x5a\xde\x0a\x4a\x30\xc0\xa2\xe2\x6f\x00\x42\xe8\x6f\x2c\x5d\xae\x98\xab\x65\x0a\x9a\x35\x27\x78\xf1\x63\x73\xdd\x75\x6c\x1c\x48\x3a\x46\x16\xf0\x85\x0b\x05\x2f\xe6\x7e\xe0\xaa\xc2\x1d\x9d\x51\xf5\x37\x00\x21\xf8\x37\x22\xfb\xdf\x7f\x8a\x0c\x99\x1b\xe0\x5f\x86\x65\x65\xa5\xf1\x17\xca\x3e\xea\x1f\x0b\xbd\x76\x3f\xcb\xdf\xee\xf8\x4c\x48\x75\x1c\x25\x0c\xb0\xa8\xfc\x1b\x80\x10\xfe\x5b\x82\x1f\xcb\x55\x33\xa3\xa3\x9a\xc9\xfc\xf8\xb4\xba\xdf\xbe\x6c\x8f\x0e\x8c\xb6\xa5\xf2\x06\xe2\xc3\xbf\xbf\x09\xf6\x98\x27\xb1\xc0\x00\x8b\xea\xbf\x01\x08\x01\xc0\xd5\x7b\xe9\x3f\xd1\x7b\xff\xc4\x65\x78\x45\xf6\xd5\xad\xb1\x40\xee\x54\xf3\x8f\xd1\x7d\xc6\x97\x84\x64\xe4\x2c\xed\xd9\xa6\x14\x71\x57\x0d\x54\x00\x0e\x40\x08\x01\xee\xea\x3b\xe3\x7d\xda\x64\xde\xbc\x32\x93\x74\xbe\xf2\xaa\x9d\x5b\x51\x92\x3e\x4a\x3e\x1b\x72\x9e\xc3\xa3\x8d\x05\x17\x94\x0c\x74\x60\x80\x45\x15\xe0\x00\x84\x20\xe0\x76\x46\xd4\x2d\x62\x54\xc4\x32\x55\xee\x7e\xfa\x56\x48\xb9\x3d\x48\xe7\x70\xed\x73\x35\x66\x04\x1a\x61\x8d\x1e\xda\x96\xe9\xd1\x87\x01\x16\x95\x80\x03\x10\xc2\x80\xb3\xb2\x23\x7c\xd6\x67\xb9\xc5\x43\x98\xf0\xce\x6c\xb3\xa9\xb4\x61\xe6\x5e\x78\x2f\xe6\x47\x6a\xdf\x25\x9a\x8f\xdd\xa3\xa5\xa2\xb8\x7d\x86\x6a\xc0\x01\x08\x81\xc0\xa5\xe1\x57\x59\x18\x60\x36\x4f\xbe\xc4\xc7\xf3\x1f\xfd\xd6\x34\xff\x3d\xeb\x67\xc3\x4d\x8a\xd8\x0c\x5e\x9d\xa9\x13\x74\xdd\x78\xf4\x30\xc0\xa2\x22\x70\x00\x42\x28\x70\xcb\x6b\x6b\xe5\x8d\xf3\xf7\x2b\x72\x76\x1b\xdb\x44\xa7\x2b\x07\x95\x09\x77\x16\x5d\x67\x02\x7f\x73\x37\x0e\xa7\xe8\xb6\x7b\x9d\x82\x01\x16\x55\x81\x03\x10\x82\x81\x2b\xe7\x84\xcd\x55\x95\xc3\xcf\x45\x3b\x2b\xc7\xc9\xa4\xad\x8a\x84\x2f\x58\x32\xf4\xab\x10\x47\x56\x8c\x06\xd5\x18\xfc\xe2\x96\x85\x01\x16\x95\x81\x03\x10\xc2\x81\xb3\x5e\x1f\xc1\x9f\x13\x14\x50\x21\x1c\x55\xc9\x68\x5f\x3b\x99\xfb\xd5\xc7\xba\x63\xee\x87\x5b\x64\x6d\xbc\xad\xb0\x44\x43\xa6\x39\x0c\xb0\x68\x0e\xdc\xdf\x81\xee\x5f\x7f\x32\xf5\xe0\x40\x87\x80\xe0\x3a\x27\x74\x8a\xcc\x9f\xbf\xa9\x6e\x70\xd3\x9b\x6b\xab\x27\x3e\x3a\x17\x56\x6e\x35\xd0\xa1\x7d\x85\xaf\x24\xce\x67\xdf\xa0\x06\x37\xd0\xa1\x42\x70\x00\x42\x48\x70\x39\x19\x7f\xe6\x13\x15\x7b\x5e\xdf\x61\x9d\xd3\x65\x93\x63\x8b\xb9\x5d\xec\x4b\x8e\xcf\xa4\x47\x21\x1a\x6d\x5c\xbe\x9e\xc9\x46\x0e\x03\x2c\xaa\x04\x07\x20\x04\x05\x37\xac\xfa\xc6\x9f\xe4\x38\x57\xfa\x46\x23\x9b\xc9\x06\xfd\x6f\x1a\x9e\x30\x19\x51\xce\x48\x7a\xde\x1f\xa9\xe4\x6d\xf7\x7d\x8e\xca\xc1\x00\x8b\x4a\xc1\x01\x08\x61\xc1\xd9\x67\xc6\xf7\x6a\x69\xf1\xb7\x85\xb5\xea\x04\xe4\x48\x87\x77\xfe\x1e\x35\x10\x17\x93\xbf\x27\x2b\x2d\x4e\x11\x54\x7a\x26\xd1\x14\x06\x58\x54\x0b\x0e\x40\x08\x0c\x4e\xad\x65\x2e\x07\x83\x27\x7f\x24\x03\x34\xf4\xee\xe9\xf6\xf7\x8d\x25\x43\xa5\xef\xb6\xeb\x16\xe4\x8c\xf1\x1d\xed\x49\xcb\xa8\x61\x80\x45\xc5\xe0\x00\x84\xd0\xe0\x86\x43\xa8\x7f\x9d\x88\x6f\x27\xc9\x33\x33\x99\x4e\x14\xf2\xe0\x96\x2c\x55\x71\x89\xcb\x27\x0c\xbe\xa2\x76\xf4\xe8\x4a\x18\x05\xee\xe0\x8e\xaa\xc1\x01\x08\xc1\xc1\x35\x72\xf8\xe4\xdb\xf6\xaf\xfa\xe7\x79\x0c\x13\x7c\xef\xf4\x23\x65\x7a\xee\x13\x1c\x1c\xc8\xb5\x9d\x12\xd3\xab\x7c\x46\x33\xe4\x04\x0c\xb0\xa8\x1c\x1c\x80\x10\x1e\x5c\x16\x91\x5e\xd7\x78\xa2\xcb\xb4\xc5\x49\x25\xc6\xc9\xb6\xd9\xa2\xf8\xcb\x66\x3f\xf3\x7a\xac\x3f\xb4\x9b\xb4\x32\x32\xb6\x58\x28\xc3\x00\x8b\xea\xc1\x01\x08\x01\xc2\x49\x9a\xca\xcb\x7f\x48\x0f\xbe\x8a\xd7\x7d\xce\x3a\xe3\xdd\xfd\x94\x23\x57\x5e\xbc\xa9\x73\xf0\xf3\x69\x56\x61\x93\xd7\x1d\xd3\xc3\xbd\x9a\xa8\x20\x1c\x80\x10\x22\x9c\xde\xf9\x6e\x7b\x09\xae\x73\x74\xe5\x4c\xf4\xd7\xc9\xec\x82\x6e\xbc\x4c\x39\xff\x61\x4d\x96\x37\x66\x83\x35\xd2\xaa\xa7\x83\x96\x14\x06\x58\x54\x11\x0e\x40\x08\x12\xee\x64\xf2\x7c\xd1\x80\x26\x67\xe7\xcf\x99\xe2\xe6\xac\x70\x17\x91\x88\x3c\x49\xce\x87\x0c\x8e\xa4\xcd\x6e\x6b\x53\x93\xf4\xd2\x47\x61\x80\x45\x25\xe1\x00\x84\x30\xe1\x4e\x9c\xba\xc8\x4b\x40\x29\xc7\xc0\x3d\x4a\xfa\xc1\x87\xc9\x41\x19\x9a\x7d\x27\x19\xe6\x9c\xd8\xd3\x6e\x4d\xa5\x2f\xd3\x60\x4c\x02\x03\x2c\xaa\x09\x07\x20\x04\x0a\xe7\x5b\xc1\xc6\xc7\x1b\xc3\xc6\x43\xb0\xa7\xa1\x5a\x7d\xdc\x3b\xb6\xaf\xf9\x52\xff\x30\xcb\xe8\x19\xdb\x5e\x87\xa1\x16\xc5\x2d\x2c\x0c\xb0\xa8\x28\x1c\x80\x10\x2a\x9c\xea\x22\xf3\x13\x12\x6e\x7e\xd5\xa1\x48\x91\xb4\x8e\x9b\xe6\xab\x21\x0f\x32\x62\x24\x61\x8d\x74\x37\x39\x6f\x49\xb5\xca\x7a\x45\x18\x60\x51\x55\x38\x00\x21\x58\xb8\x5b\x7e\x18\x67\xde\x59\x85\x98\x29\xfb\xde\xc8\x5e\x1f\xc5\xcb\x21\x21\x5b\x6e\xd2\xb9\x16\x32\x02\x33\x3a\x52\x31\x16\xdc\xb8\x7d\x86\xca\xc2\x01\x08\xe1\xc2\x55\xc4\x6e\x87\x4f\xdf\xea\xe9\xbd\x3b\x32\x16\xad\xcf\xaf\x37\x91\x99\x67\xb9\xdf\x94\x7b\x89\x44\x92\x7f\xd0\xb4\x49\x41\x11\x82\x01\x16\xd5\x85\x03\x10\x02\x86\x33\xff\x75\x63\xeb\x78\x7d\x5f\x94\xdc\xdb\x73\x0f\x02\x58\x0c\x3f\x8b\xad\x8a\xe9\x4c\x9c\x3d\xd5\xe0\x74\x7c\x3c\x6b\x30\xe5\x21\xee\x6a\x8a\x0a\xc3\x01\x08\x21\xc3\xf1\x94\x58\xed\xe4\x94\x5e\x6e\x7c\x58\xcc\x22\xf1\x20\xb2\xa2\xd8\x6e\xd3\xfe\xf2\x48\xa5\x61\x97\x32\x8d\xf8\x76\x04\x09\x09\x23\x0c\xb0\xa8\x32\x1c\x80\x10\x34\x1c\x66\xea\xc5\xfb\xe1\xd0\x82\xf5\xeb\xb6\xd9\xe1\x35\xd3\x4c\x2d\x81\xaa\x6e\xe3\xe6\x44\xdb\x3a\xda\x12\xbf\xbb\x3f\x66\x08\x89\xc1\x00\x8b\x4a\xc3\x01\x08\x61\xc3\xc9\xe4\x5e\xab\x92\xce\x9f\x70\xe2\x20\xb3\x90\xd3\xd0\xf0\xbb\xff\x45\x2e\xed\xb8\x16\xcf\x9d\x56\x1e\x61\xc2\x30\xc1\x5c\x0a\x7e\x18\x60\x51\x6d\x38\x00\x21\x70\xb8\xa9\xd5\xbb\x13\xad\xe6\x93\xd7\x2f\xb7\xf1\x57\xc1\x52\xf5\xb9\x17\x14\x88\xf6\xaf\xd0\x5d\x5a\xaf\x3e\x36\xbd\xd5\x4f\xb1\x76\x0d\x06\x58\x54\x1c\x0e\x40\x08\x1d\x2e\xc3\xc0\x9a\x75\x9a\x24\x2b\x5e\x86\xd3\xe2\xa4\x28\x6b\xe6\xf2\x63\x6c\x7e\x22\x51\xd7\xaf\x28\xce\x54\xf7\xea\xa6\xeb\xeb\xb8\x89\x1a\x55\x87\x03\x10\x82\x87\xab\x6a\xbd\xd7\x91\xda\xc8\xd6\x49\xe2\xfb\xa1\x9e\xcd\x8f\x3c\x5d\x8b\x40\xf8\x95\x74\xea\xd5\x46\x61\x66\x31\x6b\xb3\x0f\x93\xb8\x93\x1b\x2a\x0f\x07\x20\x84\x0f\xe7\x1e\x7c\xad\xe2\xf8\x8a\xd5\x86\xdf\xd9\xa6\x1a\xdd\x4b\xda\x8e\x29\x09\x57\x6c\x3d\x12\xa2\x7a\xdc\xf6\x9d\xe9\x33\x8e\x49\x5d\x81\x01\x16\xd5\x87\x03\x10\x02\x88\x23\x99\x49\xb1\xb0\x67\x53\xbf\x63\x6e\x92\xfe\xbd\xb4\x79\x54\x5c\x47\x3d\xcf\xdc\x4d\x28\xdd\x82\xd2\xd5\xb3\xb7\x49\x82\x85\x17\x06\x58\x54\x20\x0e\x40\x08\x21\xae\xfe\xcc\x9c\xd2\xa2\x69\xe6\x58\xf2\x43\xb7\x50\x19\x56\x97\x89\x65\x22\xef\xa5\xbb\x57\x43\xb8\x59\x62\x89\xbc\xab\x99\x45\x64\x60\x80\x45\x15\xe2\x00\x84\x20\xe2\xaa\x04\x7a\x29\x2d\x8a\x2f\x89\x48\x3e\x25\xa7\xa1\x7f\x9a\xa0\xcd\x5e\x26\xcb\x2f\xe8\xf4\xde\x93\xe2\x31\x07\xc6\xc3\x20\xea\x22\x0c\xb0\xa8\x44\x1c\x80\x10\x46\x1c\xa1\x6c\x72\xdc\xc9\x54\xb2\xb0\x2a\x2c\x9b\x68\xd9\xd6\x89\xd5\xeb\x85\xbe\x11\x37\x30\x9f\x5d\xec\xfc\x1b\x54\xda\x04\xd7\x70\xd7\x33\x54\x23\x0e\x40\x08\x24\x2e\xbb\xf7\xde\x6d\xbd\xca\xc1\x7e\x88\x69\xb6\xe2\xf4\x7b\xfa\xbb\xfe\xaf\xcb\x36\xab\xc9\xa9\xde\x7b\x0d\x77\xe1\xc7\x9e\x25\xd7\x85\x01\x16\x15\x89\x03\x10\x42\x89\x9b\x56\x7a\x4d\x7f\xf5\x34\xc5\xdd\x76\x6d\xe1\x4c\xa1\x64\x37\x7b\x82\x8b\x5c\x63\x3c\xb9\x1c\x9b\x0c\xd7\x63\xc3\x02\xb6\x0b\x05\x61\x80\x45\x55\xe2\x00\x84\x60\xe2\xf8\x6f\x8a\x77\x8a\x7e\x7b\x56\x6c\x7e\x87\x54\x40\x3e\x63\x55\xc0\x5f\xd1\xf2\x03\x2b\x9f\x41\x8d\xf9\x50\x97\x6b\x3f\xb1\xfc\x0d\x18\x60\x51\x99\x38\x00\x21\x9c\x38\x19\x27\xeb\x7b\x49\xe2\x4d\x25\xb0\xdd\x1f\xf5\xf9\x75\xd1\xe5\xf8\x40\x6b\xae\xe6\xd0\x05\xd5\x38\xbe\x41\x3f\xd6\xab\x9b\xe7\x60\x80\x45\x73\xe2\xfe\x0e\x74\xff\xfa\xc3\xf6\x07\x07\x3a\x04\x14\x27\x47\x5c\x85\xbd\x1d\xc0\x44\x5a\x3e\x5e\x54\x13\x60\xa4\x2f\x40\xfb\x30\x9b\xe2\x85\xac\x65\xa3\x6b\x02\x4d\x22\x23\xfd\x3d\xdc\xc1\x1d\x15\x8a\x03\x10\x42\x8a\x1b\x27\xfe\xb1\x6e\xe1\x7a\xcf\xe7\xc4\x5d\x2f\x41\x27\xd6\x2f\x24\xfd\xb9\xcb\xb1\xa6\x25\x91\x73\x5f\x49\x9e\xba\x0b\x25\xde\x16\x81\x01\x16\x55\x8a\x03\x10\x82\x8a\x53\x86\x3a\x93\x7d\x76\x8d\xed\x7c\x61\x3e\x02\x0e\xbe\x8b\x56\xfa\xde\x5e\x70\xef\xd2\xae\xe7\xa7\x8f\x47\x78\xf1\x26\xb6\x2c\x60\x80\x45\xa5\xe2\x00\x84\xb0\xe2\x9e\x65\xa9\x08\x95\x31\x74\x9f\x0d\x7c\xd1\x6c\x10\x7f\x75\xaa\x82\xcf\xfb\x26\x73\x82\x54\xd0\x60\x1a\x96\xbb\xd4\xcd\x53\x16\x37\xcf\xa3\x5a\x71\x00\x42\x60\x71\xef\x07\xae\xb3\x65\xf7\x8f\x3e\x5b\x90\x58\xa1\x86\x7c\x46\x1f\xdd\xdf\xed\xcf\x89\x54\x48\x1d\xbd\x77\xe1\x97\xf8\x6d\x36\x7d\xdc\x57\x86\x8a\xc5\x01\x08\xa1\xc5\xb9\xae\x97\x14\xdb\xd4\x10\x69\xc6\x5f\x4a\xe8\x68\x9d\xe5\x21\x9c\xcf\x8e\x11\xa3\x23\xdd\x86\x94\xdf\x56\x91\x0a\x3c\x6f\xc1\x1d\xf5\x50\xb5\x38\x00\x21\xb8\x38\x6b\xf7\x33\x13\xe9\x71\xd2\x1a\x49\x7a\x34\x75\x69\x19\x90\x7d\xbe\xe4\xc7\x15\x05\x87\x17\xee\xb5\x8c\x2f\x04\xdd\x38\x26\xf1\x61\x80\x45\xe5\xe2\x00\x84\xf0\xe2\xa6\x1d\x86\xbf\xcc\x2e\x17\xad\xcf\x62\xf8\x26\x0d\x53\x55\x6e\x14\x84\x7d\x5b\xa8\x77\x31\x03\xc6\xba\x7e\xd6\x8c\xfb\x54\x97\x61\x80\x45\xf5\xe2\x00\x84\x00\xe3\xc8\xac\x4e\xd5\x53\x19\x98\xf7\x16\x9e\x69\xaf\x9a\xbe\xe4\xf1\xcc\x7d\x5d\x64\x97\x5f\x87\xe0\xec\x2f\xe5\xfa\x42\xe6\x47\xd6\x64\x30\xc0\xa2\x82\x71\x00\x42\x88\x71\x69\x9e\xfb\x65\x5a\xd2\x81\xea\x94\xf6\x97\x2b\x92\x66\x6c\xb5\x9e\x57\xaa\xd8\xdd\xe7\xea\x76\x17\x58\xf9\x6d\xf0\x75\x59\x1b\x37\xd0\xa1\x8a\x71\x00\x42\x90\x71\x05\xa3\xa4\xf1\xef\xf2\x4b\x4a\xae\x53\xb2\x19\x49\x40\x27\x0d\xd7\x53\x2f\x15\x26\xeb\xad\x45\x1a\x24\xed\xf5\xc7\x3f\xd8\xc1\x6d\x0d\x54\x32\x0e\x40\x08\x33\xee\xa1\xb2\x74\x5f\x1d\x46\x89\xc1\x82\xf3\xa5\x5d\xf8\x03\x9b\x87\xcf\xb2\x5b\xe6\xe3\x52\xdd\x3a\xfe\xc8\xf1\x0f\x7e\x10\xe0\xa4\x83\x01\x16\xd5\x8c\x03\x10\x02\x8d\xb3\x49\xb4\xe8\x3e\x95\xa1\x51\x60\x21\x6e\xa0\xd1\xfa\xb6\x3f\x48\x50\x83\x56\x96\xee\x8a\x18\x61\xba\xf7\x84\x4b\x4b\xe6\xd3\xf3\x30\xc0\xa2\xa2\x71\x00\x42\xa8\x71\x9e\x6f\xc2\x56\x88\x26\x68\xb7\x53\x08\xe1\xeb\x3a\xef\x85\x35\x45\xa9\xa8\xf9\x17\xab\x6a\xdb\x31\x6d\x0b\x67\x7a\x78\x64\x70\x17\x40\x54\x35\x0e\x40\x08\x36\x6e\x0f\xc2\xf3\x67\x71\x3a\x67\xba\x1c\xfc\x50\xe3\x88\x0b\x33\x6f\xcf\xd3\xf7\xe7\xc2\xda\x16\x8c\xa9\x6d\x86\xf8\x97\x3c\x2c\x4c\x60\x80\x45\x65\xe3\x00\x84\x70\xe3\xa6\xa4\x99\x6c\x8e\x28\xb5\x4f\x7d\x48\x1f\x83\xfd\xc5\xb9\x2e\xe5\x8a\x67\x58\x7a\x90\xa6\x4a\x29\x5f\xa0\x25\x16\x08\xc0\xc3\xc5\x50\xdd\x38\x00\x21\xe0\x38\xed\x1e\x81\x5e\x89\x8c\x00\xc5\x90\xeb\xd6\x57\xda\x38\x2f\x50\xe9\x4a\x7e\x33\x8c\xa6\x62\xab\x49\x08\x35\x25\x8e\x20\x59\xc4\x4d\x3a\xa8\x70\x1c\x80\x10\x72\x9c\xe2\x74\xd7\x9b\xd0\x2b\x83\xcf\x74\xae\x36\xc4\x6e\x7b\xb4\xbc\x56\xd9\x9d\xef\xce\x49\x10\x29\xe7\x0c\x59\xc6\xff\xd1\x77\x02\x77\xd8\x42\x95\xe3\x00\x84\xa0\xe3\x66\xd5\x2a\xc7\xf7\x0c\x95\x0c\xa1\x51\x2e\x11\xbc\x1c\x43\x23\xb7\x80\x0b\x66\x2b\x77\x46\xd5\x9e\x06\x99\xea\x35\x8e\x37\x3b\xc1\x00\x8b\x4a\xc7\x01\x08\x61\xc7\x7d\xa5\x68\x67\x39\x63\xf2\x2d\x30\xab\xe5\x97\x75\x79\x9b\x7f\x48\x56\x7c\xdc\xcd\xf0\x4f\xe4\x02\x9e\xfa\x34\x0f\x7e\xfc\xe8\x39\x0d\x03\x2c\xaa\x1d\x07\x20\x04\x1e\xe7\xad\xdc\x53\xb6\x95\x24\x7a\xe9\x2e\x07\xde\x87\x38\xd3\xf7\x3c\x95\x9d\xbc\x60\x5e\x32\x2c\xf9\x18\xde\x92\x42\xf6\xcc\xff\xf9\xf1\x21\x2a\x1e\x07\x20\x84\x1e\x87\xaf\x7b\xf6\xec\xea\xe9\x7d\x47\xb6\xf8\xb3\xe1\xfe\x7f\xce\xd7\x19\x9f\x2c\x2d\x4b\xdd\xda\x97\xbd\x54\x3a\x7e\x77\x29\xd6\xd4\x0c\x06\x58\x54\x3d\x0e\x40\x08\x3e\x4e\xe6\xe6\x99\xdd\x1c\xd3\xe5\x88\x40\xc1\x5c\x2e\xc5\xe8\x28\x0b\xaa\x5c\xcb\x28\x27\x03\x02\x52\xf9\xd1\x8f\x4a\x43\x55\x40\x18\x06\x58\x54\x3e\x0e\x40\x08\x3f\x6e\xe5\x9c\xdb\xbd\xd1\xa1\x23\xd9\x1e\x62\x9a\xc3\xbc\x16\xa1\x9f\x54\xb4\x6a\x4f\xec\xc4\x87\x95\x3d\xe7\x30\x7d\x13\xc3\x6b\xac\x09\x03\x2c\xaa\x1f\x07\x20\x04\x20\xc7\x9d\xb9\xa0\xd5\x77\xe5\x9d\xa9\xd8\x0e\xb7\x0a\x23\x7f\xc7\xcb\x9a\x57\x73\xcb\x1a\x21\xa4\xc6\x1c\xba\xd1\x2e\x1a\x37\x19\x2f\xc1\x00\x8b\x0a\xc8\x01\x08\x21\xc8\x3d\x5e\xbe\x2c\xe1\x79\xfc\x1e\xb0\x94\x5e\x14\x84\xc6\x99\x42\x6b\x62\x3b\x89\x9f\xf2\x74\x85\xb5\x52\x3d\xbd\x2b\xcc\x56\xa6\x0d\x03\x2c\xaa\x20\x07\x20\x04\x21\x67\xc0\xf7\x73\xf9\xd1\xd8\xf7\x2b\x4e\x76\xb7\xae\xe5\x17\xaf\x33\x70\x6c\x7c\x7d\x90\x4d\x2c\xc8\x35\x30\xff\xf8\xb2\xd7\x25\x79\xdc\x91\x06\x95\x90\x03\x10\xc2\x90\xd3\xb9\xc3\x44\xe9\x90\x75\x29\x9d\x86\x83\xc8\xe3\x67\xe3\x64\x56\x0e\xe7\x18\xef\x6a\xb5\xef\xa7\xb9\x20\xa6\xcd\xfc\xe8\x3e\x62\x18\x60\x51\x0d\x39\x00\x21\x10\xb9\x39\xd1\xe4\xe0\xfe\xa2\xf7\x65\x14\x2b\x54\x4b\xf4\x13\xae\xc7\x48\x99\x8d\xaf\xf1\xfe\x5c\x3d\x2d\x20\x6a\x3a\x27\x3f\x44\x86\x7b\x01\x50\x11\x39\x00\x21\x14\xb9\x61\xc2\xb8\x27\x8b\xc7\x7b\x1e\x06\x59\x0d\x28\x48\x80\xb0\xf4\xb0\x37\xb7\xd2\xfd\x55\xd5\x14\x3c\xca\x8f\x2d\x32\x68\x97\x9c\x81\x01\x16\x55\x91\x03\x10\x82\x91\xdb\xff\xe9\x83\x57\xa2\xd2\x28\x33\x40\xf3\x33\x92\xd2\x56\x65\x60\x2d\xd5\xea\xe5\x72\xa7\xed\x33\x3e\x7c\xc5\xce\xca\x7b\x37\x8d\x61\x80\x45\x65\xe4\x00\x84\x70\xe4\x18\x29\x3e\xc9\x0c\xa7\xaf\x88\x31\xd8\x56\xaa\x2f\xf5\x70\x2a\x64\xda\xd5\xda\x2f\x0d\xac\x25\x29\xb9\x8d\xb9\xbe\xc0\x44\xdc\x84\x01\x16\xcd\x91\xfb\x3b\xd0\x7d\x9b\x11\x1f\x21\xcd\x53\x25\x66\xbf\xbc\x72\xa6\x3f\x62\x7b\x88\xfc\x7b\xc4\xf3\x1a\x43\xd1\xb3\x70\x80\xbb\xef\xf4\x93\xa2\xf3\x07\x07\x3a\x04\x24\x37\xc9\x50\x37\x9b\x52\x4a\xf0\x45\x74\xf7\xcc\xb3\x2d\xfd\x58\x89\x23\x92\xe1\x2a\xc2\xf8\xd2\x94\x39\x93\x8d\xb9\xb4\x4e\x43\x4a\x30\xc0\xa2\x42\x72\x00\x42\x48\x72\x67\xab\xab\xc9\x68\x6a\xbe\x94\x67\x59\x24\x1c\x1d\x75\x4b\x26\x90\xbc\x77\xf1\x49\x84\xf5\xc0\x1d\x43\xcd\x1b\x0f\xdf\x9f\x5c\xc6\xcd\xa6\xa8\x92\x1c\x80\x10\x94\x5c\xfd\x7b\x7e\x1b\x4d\xd1\x2e\xfd\xbd\x66\x16\xd5\x15\xf0\x01\x6e\x28\xd0\x08\xd2\xd4\xf0\x8c\x33\xe5\x7e\x58\xc4\x94\xbe\x81\xbb\x66\xa1\x52\x72\x00\x42\x58\x72\x51\x7f\xee\x53\x8e\xb4\xe5\x84\x3c\x07\xbb\x4d\x8a\xbf\x9e\xb8\xe4\x0d\x06\x5b\x47\x9e\x89\x7c\x70\xef\xcd\x52\xb6\x4c\x69\x98\x0e\x0c\xb0\xa8\x96\x1c\x80\x10\x98\x9c\x41\xe6\x47\x61\xb3\xed\xc7\xc5\x2e\x41\xd2\x0f\xdf\x79\xc1\xeb\x7b\xe7\x5a\x39\x8f\xb4\x49\x43\x27\xfd\x02\x1e\x84\x8d\x45\xe0\x86\x60\x54\x4c\x0e\x40\x08\x4d\xce\x7e\x28\xc0\x58\xed\xce\xfe\x2d\x46\x1b\x83\xcd\xe6\xa1\x3d\xb9\x81\x67\x04\x6d\x63\x52\xec\x2f\x57\xed\x88\x3a\x0c\xe8\xfd\x70\xd3\x21\xaa\x26\x07\x20\x04\x27\x37\x26\xca\xec\xf5\x54\x32\x46\xa1\xda\xe5\xf6\xf1\x98\xf2\xba\x30\x6d\xda\x71\xcf\x2d\x7a\x35\x0e\x26\x5d\xbc\x7a\xc7\x9f\x25\xca\x30\xc0\xa2\x72\x72\x00\x42\x78\x72\x60\xcd\x57\x57\xf7\xfb\x4b\xee\x97\xdc\x69\x7e\x89\xaf\xe7\xa6\x8e\x08\x92\x4e\xdf\x31\xd5\x7a\x62\xf5\xb6\xac\x73\x8f\x61\xd2\x11\x06\x58\x54\x4f\x0e\x40\x08\x50\x4e\x1d\xab\x6d\x4a\x91\x49\x57\xb8\x92\x48\xf8\x8b\x3b\x3c\x8b\xb4\xaf\x65\x65\x8d\xdc\xeb\x1d\x49\x7b\xa6\xdc\xdd\x97\xbd\xb4\xb8\xb3\x36\x2a\x28\x07\x20\x84\x28\x77\xfc\x78\xcf\xc7\x73\x03\xf9\x46\xf2\x99\x1d\xaf\xb6\x68\xae\x0f\xf6\xdc\xcf\x73\x6d\x29\x8d\x7b\xa2\x49\xde\x99\xd2\x9d\x7c\x0f\x77\xa3\x45\x15\xe5\x00\x84\x20\xe5\x46\x30\x85\x0e\xab\x77\xbb\xf2\x37\x29\xae\xf1\xff\x56\x79\xe0\x55\xdc\x90\xb7\x42\xf8\x8d\x9e\xd0\xf0\xfd\x11\xa2\x9b\x02\xef\x78\x60\x80\x45\x25\xe5\x00\x84\x30\xe5\x34\x12\x2f\xd4\x3c\xb6\x4f\xad\x9a\xf7\x4b\x99\xff\x42\xee\x7a\xa7\x8e\xf8\x43\xef\xce\xf3\x99\xfc\x8d\xa5\x37\x55\x14\xc7\xf8\xef\xc2\x00\x8b\x6a\xca\x01\x08\x81\xca\x39\xbf\x12\x21\xfe\xbe\xa8\x69\xb2\xaa\x65\x28\x6d\xce\xc9\x9f\xa4\xa2\x7a\xe4\xc4\xf1\x7b\x6a\x7c\xbf\xb2\x62\x41\xa9\x9f\xa7\x15\x0c\xb0\xa8\xa8\x1c\x80\x10\xaa\x9c\x6c\x84\xf0\x13\x57\x96\xac\xb7\xbb\x5d\xf7\x67\x9d\x68\x3d\x4a\x0c\x38\x56\x8d\x95\xaf\xe9\x10\x0f\x72\x9e\xbc\xc6\x2d\xe4\x87\x1b\xcf\x51\x55\x39\x00\x21\x58\xb9\x8d\x0f\x66\xba\xfb\x1f\xa4\x8a\x88\xa5\xdd\x42\x86\x43\xfa\x29\x07\xfe\xbc\xf4\x35\xa0\x13\x39\xb5\x3e\x86\xf7\x29\x32\xcc\x4c\x1f\x06\x58\x54\x56\x0e\x40\x08\x57\x6e\xad\x2b\xec\x0f\x1b\x5e\x5a\xae\xb9\xf6\x93\x9b\xf8\x5b\x97\x79\x9e\x6e\x51\xf7\x67\x29\xf2\xb2\x29\xa4\x47\x52\x24\x24\xd3\xd1\xc3\x00\x8b\xea\xca\x01\x08\x01\xcb\x3d\xb3\x78\x2c\x51\x15\x64\x20\xdb\xa8\x6d\x2a\xd5\xdb\xd4\xe4\xcf\x23\xa5\x61\x67\xf4\xd9\x08\x52\x0b\x7d\x1a\xab\xa8\x55\x2d\x05\x03\x2c\x2a\x2c\x07\x20\x84\x2c\xc7\x60\x83\x99\xd1\xf2\xf9\x72\x81\x8c\x5a\xd4\x94\x3f\x54\x44\x86\x6b\x7d\xfb\x2a\xb5\xea\x84\x9b\xa0\xde\xd6\x63\x79\xb1\x7d\x08\x06\x58\x54\x59\x0e\x40\x08\x5a\xee\x75\x58\xcb\xa4\xf3\x2e\x7e\x1d\xa5\xaf\xfa\xa7\xb9\xe9\x88\xf4\x59\xed\x55\x4a\xb2\xf1\x2d\xf7\x6c\x62\x06\xab\xd5\x2d\x69\xdc\xf5\x0c\x95\x96\x03\x10\xc2\x96\x33\x1e\x68\x58\x71\x96\x30\x68\xcc\x5c\x8b\x79\xfd\x64\xcc\xef\xfb\xb4\x49\xef\x8e\xc2\xe8\xfe\xde\x40\x9d\x52\x1a\x71\x56\xe8\x71\x18\x60\x51\x6d\x39\x00\x21\x70\xb9\x6c\x8b\xb8\xe8\xb8\x79\x7d\xcb\x7b\x29\xdf\xce\x98\x05\x60\x67\x55\x5e\xf8\x84\x32\x3f\xfa\xd0\x7a\xca\xda\x38\xec\xe8\x2a\xaf\x25\x0c\xb0\xa8\xb8\x1c\x80\x10\xba\x9c\xe1\x37\x31\xda\x77\x43\x1e\xf5\x29\x3f\x26\x65\x3e\x2a\x3d\xd5\xe9\x74\xf1\x34\xc9\x31\x8c\x78\xd0\x7b\xf1\xe9\xf3\x11\xb3\x98\x0b\x30\xc0\xa2\xea\x72\x00\x42\xf0\x72\x7d\x77\x68\x87\x9e\x82\x0b\xbd\x46\x54\xcd\xb2\xbe\x19\xbe\xfa\x0d\x8f\x82\x3d\x99\x37\x7b\x17\x05\x8d\xe4\xda\x59\xd9\xf1\xf4\x60\x80\x45\xe5\xe5\x00\x84\xf0\xe5\xce\xbc\x6f\x16\x5c\x79\x7d\xae\xc9\x54\x8c\xdf\xec\x14\x71\xb1\xf5\x05\x4b\xfa\xe2\xdd\x36\xed\x5f\xd6\xd7\xa4\xdf\x76\xb8\xb1\xf0\xc1\x00\x8b\xea\xcb\x01\x08\x01\xcc\xd1\x10\x28\xf6\x91\x7f\x92\xdc\x3e\xe1\x9f\x6b\x23\xb5\xf8\xee\x33\xb1\x99\x6c\x1e\x56\x4a\xd8\x4a\xab\xe9\x8f\x46\xe6\x2a\x1b\x6e\x9e\x40\x05\xe6\x00\x84\x10\xe6\x16\x3d\x7b\xe3\x57\x09\xa3\x4f\xdd\xcd\x39\x85\x99\x08\x30\x66\xd4\x2a\xb6\x3d\xf6\xcd\x50\x5c\xad\x8d\xc0\xa5\x14\x63\x36\x8d\x3b\x06\xa2\x0a\x73\x00\x42\x10\x73\x83\xfe\x6a\x0c\xe7\xae\x4c\x71\x94\x32\x78\x2f\x6f\x50\x90\x5d\xe4\x20\x39\xd1\x54\x31\x7c\x9e\x9b\x35\xa1\xf8\x65\x76\xc3\x45\xdc\x57\x86\x4a\xcc\x01\x08\x61\xcc\x61\x9d\x65\x3b\xec\xdf\x7a\xf7\x0b\xf9\x51\x66\xa7\x3a\x12\xb9\x8a\x81\x37\xfc\x11\x4d\x97\x80\x15\xe7\x9f\xb7\xc1\x1f\x25\x70\xe3\x01\xaa\x31\x07\x20\x04\x32\x37\x16\x55\x75\xd2\x2d\x7f\xc6\xfa\x01\xfe\xa7\x52\xdf\xd2\xac\xdb\xf1\x35\xce\x53\x6a\x05\x45\x62\xa2\xf0\xda\xf1\x30\x1e\x79\x2a\x18\x60\x51\x91\x39\x00\x21\x94\x39\xca\x65\x7a\x91\x38\xd5\xc0\xb3\xfb\x86\xde\x1f\x56\xb1\xd4\x27\x94\x62\xe6\x24\x58\xa3\x54\xaf\xbe\x26\x3a\x6e\xde\xe8\xac\xc0\x0a\x03\x2c\xaa\x32\x07\x20\x04\x33\xa7\x8a\x25\xca\x54\xf1\x8e\xdd\x08\x3c\x9e\x39\xda\xe3\x9a\x3d\xb5\x6c\xc5\x32\x7e\x4c\xc5\xf7\x86\x26\xa5\x70\x5f\xef\xa6\x1e\xee\x4c\x89\xca\xcc\x01\x08\xe1\xcc\x49\xf1\x0d\x2e\x8c\x32\xc0\x97\xa0\x53\xaf\x59\xc3\x1c\x9f\x51\xca\x2e\x6a\x07\x3c\x3d\x7e\xad\x22\xe9\xe7\xc2\x00\x36\x22\x0a\x0b\x03\x2c\x9a\x33\x57\x4e\xfd\x5f\x03\x1d\xb3\x7d\x22\x7b\xdf\xa7\x86\x19\xf3\x27\xa4\xb2\x25\x9a\x24\xd4\x8c\x66\x64\x44\x26\x6e\xf9\x13\xac\xe7\x99\xd2\xbc\xb8\x4a\x06\xe1\x58\xfe\xbe\xd3\xba\xa7\xf0\xfe\x6b\x35\xa3\x89\x11\x33\x05\x6d\x7e\xce\xac\xd5\xb8\x04\xa1\x93\xaf\xfc\xad\x4e\x82\xce\xa7\xc5\xbf\xc0\x06\xe3\xc8\x89\x8a\xa9\xb9\x9a\x03\x4b\x67\x28\xb8\xb6\x8e\xa5\x9c\x34\x49\x65\x78\xa8\xc2\xfe\x21\xc7\x2d\x86\x27\xc5\xe2\x7e\xef\x51\x3a\x57\x30\x2d\x2f\x30\x94\x6a\x73\x60\xe9\xd7\x07\xb6\x37\xba\x75\xed\x2b\xdc\xb2\x9c\xa9\x23\xf4\xca\xb6\xe2\xe5\xe8\x4a\x98\x4f\xce\x16\xd1\xa9\xd6\x8e\x2f\x5c\xfd\x71\xe1\xc0\x52\xbf\xdf\x57\xf3\x3e\x58\x65\xb4\x6f\x46\x1a\x1b\x19\xd3\x93\x97\x28\xad\xd3\xd2\x06\xd0\xbf\x49\x73\x26\xcc\xa4\xf2\x5b\x8b\x10\x38\xb0\x54\xf0\x8b\x5f\xb1\x8e\x88\x3e\x6f\xa0\x62\x68\xe8\x5e\x61\xba\x21\x70\x3c\x99\xd4\xda\xe7\xf4\x8c\x76\xa6\x0d\x26\x88\xc3\xb4\x1c\x58\xda\xcc\x04\x82\xc2\x1d\x0a\xa3\x5a\x95\x43\x3d\xe7\x16\x12\x05\x7e\xab\xc7\xc4\x51\x6a\xa9\xa9\x2e\x9c\xa1\x89\xde\x7f\xdc\x12\x7c\x60\xa9\x65\x55\x28\x8f\xde\xc9\x63\x2b\x85\x7a\x36\x26\x9d\xfa\x84\xdd\xaf\xf4\x8f\x07\x5c\xda\x0c\xd1\x33\xaa\xe0\x5b\x2e\x52\xf2\xd2\x3e\xb0\xf4\x96\x29\xa3\x42\xf3\x4a\x89\x78\xa4\x92\x14\xff\x23\xd9\xfc\x8b\xfa\xa6\xa7\xba\x05\x7a\xdc\x76\x07\xaf\x5d\x6f\x59\xca\xc0\x1e\xac\x0e\xfd\xfc\x09\xd8\x3e\x14\x79\xe1\x77\x89\xd4\x9e\x27\xd2\x63\xf1\xfa\xc3\x81\x97\x30\x11\x41\xb8\xea\xc3\xb5\x75\xfd\xd5\x87\x83\x4b\x4d\x2b\x86\x6e\x9b\xfb\x4d\x9c\xc2\xd8\xe9\xa8\xc6\xca\x0d\x10\xfb\x5d\xf5\xfe\x76\xf1\xfb\xc7\xe1\xde\x4b\x5f\x73\x1d\x2b\x79\x22\x0f\x2c\x95\x49\xa4\xcc\x17\xc8\x96\x9b\xbc\xa0\x74\x5a\xb9\x44\x12\xce\x08\x6c\x12\xdb\x6d\xed\x6e\x21\x22\x6b\x39\xaf\xe0\xa9\x2d\x7e\xe6\xc0\xd2\xa3\x45\x26\x43\x96\x7a\xe3\x2a\x64\xb4\x71\xd5\xa1\xe2\xb2\xae\x11\xd8\xa7\x45\x14\x46\xc5\xf6\xdc\x8a\xd2\xce\x9f\x6a\xda\x7b\x0e\x2c\x6d\x21\x63\x12\xb9\xf2\x46\x79\x32\x87\xea\x28\x3f\xb7\x35\x2b\x81\x77\xf8\x0d\x06\xe7\x7d\xbf\x47\x7f\xae\xa4\xbc\x59\xce\xab\x48\x3b\xb0\x94\x63\xe4\x5a\x63\xda\x06\x27\xb1\x0a\xb9\xc5\x6c\x0b\x50\x28\x1f\xef\x1e\x28\x5b\xbc\xbc\xb1\x7d\xeb\x5b\x4f\x79\xee\xcc\x99\x85\x03\x4b\xeb\xe2\x69\x2b\xf9\x05\xae\xd4\x4e\xb4\xeb\x3f\xc0\xb0\xed\x65\xac\xdd\xd4\xfa\x41\x1e\x9e\x55\xe8\x9f\xe4\x7c\xc4\xc3\xd1\xf8\xd4\x81\xa5\x93\x66\x3b\xc2\xe3\x36\x66\x43\xaf\xcf\x61\x58\xbb\x46\x2d\x07\x53\x0c\x3f\xbf\x72\x7f\x4c\x14\x7c\x75\x67\xfa\xf6\xbe\xde\xf0\x9b\x03\x4b\xd3\x59\xd5\xcd\xea\x5d\x54\x8d\x3c\x49\x06\xb5\x7a\xc9\xbf\x7f\xf1\x39\x1a\x3c\xfd\x63\xf6\x46\x6c\xfc\xcd\x9a\x2e\xdd\x54\xa1\x83\xdf\xd7\x47\x86\xd2\xd3\xcb\xfa\xef\x63\x49\x7e\xac\x7e\x9a\xfa\x23\x1b\xd0\x7a\x2c\xeb\xb6\x90\xac\xb8\xdc\x56\x21\xcf\xf7\x98\x3c\x33\xe7\x03\x4b\x8f\xcf\x7d\x3d\x12\xfe\xa0\xe0\xc7\x55\xd9\x89\x37\xe2\xd2\x9e\xcf\xcc\x6e\x91\x2f\xbb\x32\xa8\xd5\xe8\xf5\xeb\xcb\x78\xd5\x5e\xbb\x74\xf0\x69\xdd\x79\x6c\x4f\x39\x26\x67\xf4\xb0\x72\xcb\x62\x93\xa9\x9c\xc4\xf3\xb3\x7b\x3a\xdc\x2e\x4f\xff\x45\xe6\x8a\xc9\x48\x25\xfd\xc5\x03\x4b\x55\xef\x3d\xc5\x67\xbf\xc5\xf8\x5b\xc8\xf0\x5d\x54\x52\xf5\x9e\x57\x24\xf7\x37\x9e\xd2\xcd\xd8\x5c\xc6\xbb\x64\xb3\x2c\xc9\xc6\xe7\x0f\x2c\x9d\x5a\xbf\x31\x52\x77\x52\xf7\xe6\xe9\x9f\x7d\x0e\xac\x89\xbd\x4b\x1f\x13\x16\x3e\x71\x05\x64\x07\xbf\x9f\xbf\x77\x5d\x2a\x51\xb7\xed\xe0\xd3\x3a\x5e\x6f\x3b\x62\xe1\x73\x3b\xe5\x62\x39\x4d\x22\x89\xd6\xe4\x8f\x76\xb1\x01\xbe\xad\xb7\x7e\xc4\x14\xf2\x67\xa4\x1f\xd4\xcb\x1f\x58\xba\x63\xd1\x29\x79\xe2\xa9\xbf\x4e\x8a\x61\x5e\x32\xf5\xcc\x8d\xe3\x8a\x35\x98\x92\xa4\x9f\xf4\x06\x67\x97\x3a\x39\x26\xa5\x69\xe5\x0e\x2c\x3d\x96\xce\xcc\xcb\xa6\x3b\x51\x4e\xee\x2b\xd7\x92\xa2\x3a\x01\x8c\x68\x0a\x05\x5f\xbe\x35\x93\xf5\x75\xb5\x22\x16\x97\x7f\xe8\x72\x60\x69\x83\x0b\x67\xe3\xb5\x87\x3b\x47\x9f\xbb\x39\x59\xb6\x6d\xcf\x9c\x20\x16\xbf\xbe\x35\x51\x4c\x45\x18\xde\x36\xc5\x73\xa2\x57\xa7\xf5\xc0\xd2\x8f\x4d\xd0\xba\x50\xb8\x71\x2d\x41\x93\x66\xc7\xc8\x05\x5f\x8a\x8a\x5f\xa6\xae\x1f\xb8\x72\xa7\x5c\xb6\x7c\xc7\xe4\x3c\x34\x28\x0e\x2c\xbd\x9e\x22\xe5\x1c\x96\x74\xa7\x20\xd8\x71\xdc\xe9\x61\x48\x43\xd9\xdd\x90\xe6\xae\xa9\xfc\xa3\x31\xe9\xe2\x59\x96\xd8\x3b\x43\x27\x0e\x2c\x0d\x2d\x78\x71\xa1\xa5\x4e\x0a\x08\x09\x8f\xbf\x36\xa8\x48\xe7\xf4\x60\xe9\xb7\x9c\xa3\x7d\x51\x2d\xb2\xfb\xe4\x71\xee\x4b\xe3\x83\xfb\xf5\x6b\xcb\xa9\x3e\xcc\x10\x89\x85\xed\x9d\xb2\xd3\x31\xa9\x32\x11\xee\x47\x84\xe3\x69\x7a\xcb\x4a\xb5\x30\x77\xa7\x3c\xaf\x9a\xba\x1e\x58\x2a\xfa\x2d\x19\xa8\x0d\x50\x4c\xef\xf3\x94\x19\xe5\x58\xd4\xee\xa8\x9b\x99\x83\xf3\x4a\x25\x59\xfc\x9b\x83\xcd\x14\xc7\xff\x8f\x14\xf2\x77\x69\xa6\xc3\xbc\xcf\xb1\x14\x4b\x66\xce\x78\xf2\x56\x11\xf6\x66\x36\x83\x29\xcf\x85\xad\x6c\xdb\x9a\x77\x16\xc3\x31\x8f\x5f\xae\x9c\x3e\x78\x21\x32\xad\x7c\xbf\x56\x30\x9c\xf0\x4b\x12\xd3\x02\x59\x6c\xe5\xaa\xfa\xba\xd6\x95\xd7\x18\x75\x2b\x94\x75\xca\x2e\x88\xf7\xc5\x1f\x58\x2a\xa1\x59\x66\x97\x9f\xab\xd0\x1c\x2d\xf6\xc8\x69\x66\xf2\x9e\xbe\xe3\xd4\xa5\xf4\x0d\x13\x12\xf2\xb3\x0e\x8e\x99\x5c\x66\x6f\x67\x0f\x2c\x65\xda\xc5\xe2\x19\xc8\x09\x45\x46\x4b\x8b\x8e\x26\x2c\x4f\x16\xa7\x4a\xf0\xcb\x6a\xcb\x11\x6f\x2c\xf4\xc6\x34\x69\x24\x52\xe7\x1e\x58\xba\x37\x95\x16\xbd\x5f\x2a\x9e\x38\x15\x5e\x79\xa5\x99\x3b\x6f\x37\xc7\xf3\x1a\x11\xa9\x8e\x97\x30\x20\x38\xf9\x98\xc7\xfd\xdb\xc1\x4b\x86\xa1\x9c\xb8\xd4\xef\xc9\xce\x01\x71\x2f\x2b\xda\x8b\x13\x92\xf1\x5b\x7d\xb0\x5e\xfe\xa9\x01\x86\x70\xce\xab\x59\x30\x66\xa5\xfa\xc0\x52\xb2\xd2\x1b\x6c\xaf\xbb\xc5\xd7\x96\xd4\x24\x88\x34\xf6\x62\x54\x37\x59\x43\xf8\x44\xcb\xb5\xee\xda\x45\xff\xe9\xbf\x5c\xbe\x51\x72\x60\x69\xeb\x8f\x90\x63\x78\xa9\x57\xb9\xdf\x8d\x1e\x71\xd4\x9b\x98\xde\xbd\xab\x68\x93\x71\x5b\x43\xec\x7d\xde\x37\xe9\xed\x34\xf3\xec\x83\xb7\x8d\x99\x4d\x63\xa5\x6a\xdd\xa2\x3f\xb7\x7d\xd4\x07\x8d\x8e\xb0\x8b\xd2\x8d\x1d\x3d\xcd\x60\xcd\x44\x27\xce\x26\x5b\xe0\x9c\xd4\xf1\xe2\xc0\xd2\x35\x67\xad\x04\x9a\x9b\x6f\x9e\xc4\x2f\x4b\xbd\x09\xd8\x2f\x25\x15\x6c\x6b\x61\xb0\xb8\xb8\x9b\x4c\xa0\xde\xad\xb1\x51\x69\x18\x72\x60\xe9\x87\x88\x66\xfc\x5c\xc5\xc5\xdf\xcb\xec\xdc\x2b\x96\xe7\x9d\x5f\xc8\xb2\xbb\xdb\x7f\x39\x2a\x11\x9c\x45\xad\x5e\x72\x36\x98\xfd\xd8\x81\xa5\xdf\x3a\xa4\xbd\x8b\x7d\xe5\x9f\x13\x96\x92\xfb\xb4\x3c\xdb\xd6\x1b\x72\x39\x3d\x62\xce\x1d\x14\x5d\xbb\xb0\xcf\x16\xf9\x2d\x7a\xe6\xc0\xd2\xc4\x27\x6b\x17\x73\x44\xe7\x2d\x7f\xb1\x57\x4d\x05\x3c\xbc\xe4\xd0\x26\xf9\x66\xe3\xb9\xf1\xd1\xc0\x47\xab\x46\xeb\x56\xec\x8b\x9a\x07\x96\x6a\x30\xf2\xfb\xbf\x79\x2d\xa0\x4e\x58\xf1\x5d\xb4\x93\xa8\x4b\x7d\xd9\xfe\x8d\x67\x4a\x2d\x25\xfe\x04\x1c\x6a\xfe\xe4\x89\xcf\xf7\x03\x4b\x17\xee\x68\x32\xbc\xf9\x5c\x61\x2a\xd1\x7c\xa5\x47\x6b\x63\xad\xcc\xf0\x0c\x5f\x66\xc2\xab\xdf\x65\x44\xaf\xde\x6c\x7e\x6f\x3c\x15\xf7\xff\xdb\x52\x7c\x8f\xf7\xca\x79\xbb\x14\x99\x29\x6f\xe1\xa8\xaa\x24\xe9\x23\x7e\xde\xfb\xce\x33\xfa\xf6\xcb\xdf\xec\x1c\x5c\xb4\x17\xc8\xa5\x1e\x63\xfe\xb3\x61\xe0\xe0\xd5\xf5\xb3\xff\x67\x0e\x1e\xdd\x20\x57\x3e\x6f\xdf\x20\xbb\xe0\x96\x7a\x0f\xf3\xe6\x18\x8e\xc9\x7e\x13\x47\x0d\x87\xd0\x1f\x73\x2b\x5a\x07\x96\x5a\xdd\x4d\x4c\xcb\x31\xff\xfa\x36\xb8\xb2\x55\xb2\xbc\xd4\xcf\xfc\xc1\x55\x41\x26\xc5\xbb\x95\x1a\x95\x55\xf7\xf3\x0a\x3a\xc3\xbb\xa4\xa4\xc8\xc9\x7d\xa5\xa4\x0e\xfc\x1f\x46\x0c\x7b\x91\xc2\x2f\xf8\x1d\x9b\x1b\x16\x1a\x3e\xdb\xaf\x4d\xed\xb0\x91\xbe\xce\xb4\xaa\xd7\xd2\x08\xfc\xf2\xb6\x64\xda\x2e\xfd\xc0\xd2\x8e\xf8\x87\xb1\xa9\x92\xbf\xba\x47\x06\x15\x2a\x13\x1c\xbb\xaf\xc7\x99\x6f\x7c\xcc\xe8\xfd\x52\xc7\x52\x58\xbf\x52\xdc\x3e\x27\xf3\xff\xa2\xba\x4e\xf0\x9f\x3d\x35\x3f\x2c\x1e\xe1\x23\xe9\xcb\x3e\xfe\x21\xd2\x5a\x52\x52\x87\xbe\xf0\xaa\xdd\x3d\x17\x9a\xfc\x8d\x1c\x02\x37\xfc\x00\x0b\x49\x1d\x7e\xf3\xb4\xf4\xcf\x89\xc5\xc2\x97\xf9\x96\xc9\xf6\x73\xfb\x9c\x1e\xfd\xbf\xf8\xc2\x7d\x65\xf1\xa4\xf0\xf0\xf0\xae\xe1\x61\x7c\xf0\xf0\xf0\x7c\xa5\xa4\xfe\xeb\xbf\x90\x2b\x3e\x8a\x10\xe2\x51\xaf\xff\x96\xf8\xc1\xd9\x93\xb5\xe3\xe6\xf3\x71\x3c\xe0\x3d\x5e\x9f\xdb\x7e\xcd\x60\xf0\x1f\xc2\xbe\xdf\x27\xb6\xdf\xd0\xbc\xe6\xfa\xf9\xbf\xf0\xa8\x57\xf1\x84\xa5\x90\x0f\x6b\x9f\xb6\x15\x2f\x46\x43\x31\x77\x6b\x6d\xdb\x60\xe7\xc2\x58\x5c\x8f\x72\xa6\xaf\xab\xd2\xd7\x7e\x4b\x71\xba\xc6\xe2\xa1\xea\xd7\xff\x1b\x0f\xeb\xa3\xf1\xdf\x1e\x96\xb6\xbd\xfb\x75\x6b\xd7\xf5\xef\x63\xe6\xbf\x0a\x93\x23\xa9\x65\x6f\x17\xaf\xc6\xe0\x13\x19\xd0\x46\xd1\xb1\xee\x46\x4e\xe6\xea\xff\xaf\x3c\x5b\xa3\xff\xf6\xb0\x62\x86\xeb\x56\xb1\x49\x4b\x35\x51\x59\x2f\xed\x4b\x0b\xa7\xd9\x5d\x1a\x1f\x73\xb7\x3a\x74\xe4\x34\xac\xdf\x70\x7c\x31\x67\xac\xfc\xbf\xf2\x6c\x3d\xfe\xdb\xc3\x36\x6a\xe7\xf7\xc3\x7d\x58\x42\x46\xbe\x14\x47\x92\x3b\x36\xc4\x6d\x3c\x77\x24\xef\x0b\x34\xf3\x1c\x35\xb9\xb0\xff\xd0\xad\x39\xff\xff\xff\x87\xbd\xf9\x9f\x6d\x5d\x3f\x7c\x02\xe8\x91\x0c\x06\x0f\x3e\xf0\x88\x8b\xdb\x6f\x1d\xda\xbb\xdc\x55\x9c\x4c\xff\xac\xf5\x77\xa6\xe3\xa7\x58\x8e\xef\x79\xa5\x04\x1a\xb1\xd8\xe7\x35\x5d\x7e\xce\xec\xee\xa3\xf3\x9f\xad\x7b\x24\xe3\x73\xa8\xcb\x90\xac\x3a\x7d\x4c\x23\xff\x16\xcf\x71\xf0\xfb\xf8\x6d\x76\x81\x8c\x6b\x14\xca\xce\xca\xf0\x67\x99\xd5\xd6\x08\x1d\x6f\x79\x89\xbf\xdd\x7f\xad\x7b\x24\x83\x87\x7f\xb0\xab\xc8\x45\x47\x5e\x2b\xf6\x6e\x3f\xfb\xf8\x0d\x7b\x36\xed\xd6\xf5\x54\xd1\x3a\x53\xcd\x79\xad\x8d\x1b\x64\x73\xec\x82\xd3\xcd\xb3\x7f\xbb\xff\x5a\xf7\x48\x86\xf5\xd0\xd7\x3b\x3e\xfc\xe6\x78\x14\x55\x8c\x82\xec\xce\x2f\xb2\x72\xd9\x76\x9d\x2a\xe2\x90\x66\xa1\xdc\xe0\x86\xda\x97\x81\xbf\x7b\x8e\xd3\xf3\xfc\xed\xfe\x6b\x1d\xb2\x7b\xf2\xa1\x85\x87\x8d\x61\xab\x1e\x91\xfc\xac\xd1\x63\x86\x57\x74\x72\xcd\x09\x4e\x1c\x17\x2b\xa9\x28\xbf\x70\xda\x3d\x3f\x9f\x9b\xeb\x73\xf5\x3f\x5b\x87\xeb\xfa\xc0\x8f\xa5\xb5\xa4\x64\xf0\x30\xff\x6d\x1b\xdc\xfc\xcf\xae\x22\xff\xd3\x06\xa0\x6b\xfb\x41\x6a\x1f\xb5\x40\x84\x1f\x93\x30\x6e\x76\x74\xf4\x8a\x20\x27\x03\x63\x5f\xde\xe3\x53\xe1\x3b\x86\x5e\x53\xf7\x34\xf9\xfe\x3e\xf1\x7f\xad\x43\x6e\x80\x0b\x78\x15\x6c\x44\xec\x46\x4a\x21\x3c\x5a\xe2\x0d\x8e\x67\x02\x94\x1d\xfd\xf7\x9a\xd2\x97\x06\x9f\xd7\x7e\x13\x6c\x61\x0c\x4e\xfd\xdb\xfd\xd7\x3a\xe4\x06\x20\x52\x74\xb9\x64\x41\xb9\x2c\xfe\xb6\x63\xa6\x36\x65\x61\x65\x2c\x50\x98\xe9\x73\xd0\xd7\x16\x91\x9f\xb7\x73\xe9\x85\x6f\xb8\x69\xff\xed\xfe\x6b\x1d\xf2\x85\xa2\x51\x3e\xf7\xe0\xc8\x17\x0f\x19\x96\x5e\x62\x2b\x9e\x5a\x4c\x60\x69\xb7\x74\x77\xa2\xa5\xcd\xfd\xf7\xe1\xe5\xbf\x89\x13\x73\x4a\xff\x76\xff\xb5\x0e\xd9\xf5\xbd\x9b\x21\x9f\xc4\x23\xa6\xde\x67\x6c\x71\xfd\x58\xda\x87\x2c\x4a\xab\x4d\xab\x19\x2e\x15\x60\xff\x91\x62\xec\x59\xff\x3d\x3a\x9f\x6b\xff\xd9\xba\xff\x67\x03\xfc\x9f\x7b\xc7\xff\x65\x0b\xfc\xeb\x8a\xfe\x3f\x6d\x01\x97\xc7\x23\x76\xed\xd1\x54\xbf\x04\x44\x89\xe7\x84\xc7\x5d\xc5\x2c\x8d\x5c\x6a\xf8\x22\xe2\xe5\x94\x7f\xaf\xdc\x2c\x4d\xbe\x4b\xf1\xf7\xa9\xff\x6b\x1d\x72\x0b\x78\x2a\x71\x31\xdb\xae\xe5\x75\xf5\x5e\xfe\xc9\x78\xc4\x4c\xff\xa2\x77\x5f\xd7\x80\xc6\x30\x3b\x53\x54\xa8\x3a\x24\xde\x1d\xc5\xf4\xb7\xfb\xaf\x75\xc8\x2d\xa0\x26\x6f\x20\x5b\x76\xc7\x8f\x23\x98\x23\x2f\xa9\x69\x7b\xe7\xa8\x60\x6f\x48\xad\x9a\xfd\x2f\x51\xca\xcc\x3f\xce\x4f\x43\xe9\x9a\xfe\x76\xff\xb5\x0e\xf9\x52\x79\xa9\xc9\x0c\x32\xa5\x37\xa5\x1e\xf1\xa8\xba\xba\x1b\xfa\x86\x6a\xc1\xaa\x40\xa1\x93\x9b\x25\x4b\xb0\x5d\x36\x29\x06\xbf\x56\xfd\x6f\xf7\x5f\xeb\x90\xdd\x6e\x19\xa7\xe5\x6a\xf3\x3a\xd9\x80\xcd\xb7\x6b\x2d\x86\x05\xed\x86\x52\xe9\x84\x51\x1e\x0c\xaf\xe2\xe4\x1f\x64\x16\x64\x45\x14\xf9\x5c\xff\xcf\xd6\xfd\x3f\x5b\xe0\xbf\x6e\xe4\xff\x97\x3d\xf0\xaf\xdb\xeb\xff\xb4\x07\x3e\x75\xdf\x2a\x2e\x2a\xaf\xd3\x12\x94\xf8\x5a\x7f\x6e\xd3\x7c\xf2\x0d\x54\x64\xf1\x32\xc4\xad\xc3\xb6\x3f\xdc\xe0\xb6\xcf\x9b\xbc\xbf\xcf\xfd\x5f\xeb\x90\x7b\xe0\xe4\x95\x42\x7a\xe5\xf7\x5f\x73\xd8\x8d\xa5\x7c\x55\x1e\x99\xd0\xd5\xb1\xbf\x63\x12\x48\xfc\xa5\xfa\x5b\x3f\x51\x73\xb1\x5e\xe4\xda\xdf\xee\xbf\xd6\x21\xf7\xc0\xfa\x28\x99\xe9\x3c\x7d\x7e\xd3\x67\xe3\x5f\xbd\xe1\x46\x47\x9e\xb7\x17\x4a\x59\x37\x38\x38\xb2\xc4\x35\x07\x8d\x64\xd8\xdc\x9e\xfc\xdb\xfd\xd7\x3a\xe4\x6b\x95\xa1\x34\x51\xf7\x13\x23\xb2\xb0\x49\x68\xcb\xff\x26\xa4\xc3\x2b\x2f\xbe\xd0\x66\x9b\x95\xad\x5e\x86\x72\xc8\xa9\x4a\x5e\x40\xf1\x6f\xf7\x5f\xeb\x90\xdd\x0e\x73\x6a\xd7\x6e\xd5\xc7\x4e\x31\xa1\x96\x49\xe1\x16\x97\xc4\x65\xa9\xaf\xb1\xe9\xb6\x2b\xf4\x64\x55\xd1\x86\x2d\x54\x06\x4f\xfd\xdd\x03\xff\x5a\xf7\x77\x0f\xfc\x9f\xa9\xea\xff\xb2\x07\xfe\x35\xeb\xfc\x4f\x7b\x40\xa4\x89\xce\xf5\x89\xd4\xaf\x37\xcf\x5e\x57\xbd\xde\xd5\x2c\x6e\xe6\x63\x13\xd9\x3d\xf1\xe7\xbe\x73\x44\x99\x30\x78\x7d\x7d\x46\xe3\xef\x73\xff\xd7\x3a\xe4\x1e\xa0\xe2\x98\xe0\x38\xad\x58\x69\x9d\x16\xd0\x28\xdf\x31\x7c\xad\x27\xc0\xfe\xff\xc3\xdc\x79\xc6\x73\xf9\xf6\xff\xdf\xde\x2b\x33\x92\x95\x50\xb6\x50\xf6\xcc\x16\x92\x9d\x59\x46\x44\x44\x21\x7b\x27\x3b\xb3\x90\x9d\xec\x9d\x64\x6f\x42\x64\x64\x44\x46\xf6\x4a\x88\xcc\xfe\x8f\xeb\xf7\xbf\x3e\xe7\xaf\xef\xf9\xf1\xeb\xb8\x6e\xb8\x71\xdd\x7f\x3e\xde\xce\xe3\xd3\xb3\x63\xbc\xce\xe3\x38\xce\x1d\x1a\x25\xfa\xe7\x6f\xd9\x8e\xfc\xc3\x26\xdf\x53\xeb\x22\xea\x82\x38\xb8\x03\xdc\x9e\x13\xd7\x8a\x66\xb1\x84\x74\xe8\xef\x4b\x6f\x5e\x65\xfd\xc8\xf1\xf3\x36\xe6\x9c\x82\x48\xbc\xb0\xd3\x6c\x69\xbf\xbe\xdb\x3d\x44\x5d\x10\x07\xff\xb7\xf2\x92\xd0\xf8\xa5\x79\x9d\xb5\x38\xe8\x23\x5e\xa7\x1a\xd9\xaf\xe0\xdb\xda\x2f\x3e\x76\x45\xd4\xef\x91\xd0\x08\xba\xcb\xff\x26\xd9\x41\xd4\x05\x71\xf0\xba\x13\xe7\x66\x2b\x26\xe4\xcf\x27\x67\xcb\xfb\x10\x39\xdb\x4e\x2c\xb8\x2a\x89\x53\xb4\x30\x52\x08\xb4\xdc\x28\x25\xdb\x5c\xda\x8c\x42\x38\x00\xe2\xa0\x7e\xc0\xe8\xef\x0e\x80\x26\x9e\x27\x39\x80\x1d\x46\x7d\xf5\xa5\x7e\xc2\xb6\xc9\xe2\x77\x7e\x15\x9f\x6b\x6c\xed\x13\xd2\x77\x58\x4d\x5f\xb5\x89\x47\x54\xbf\xbc\xb9\x79\xe9\x11\x34\xbc\x02\x38\xb8\x03\x59\xd8\xb8\x07\x34\xfd\x67\x56\x0e\x2c\x76\x35\x6b\x3a\xad\x54\x9e\xf9\x30\x3f\x98\xef\xa3\x91\x96\xbf\xde\x96\xdb\x78\x85\x5e\x05\x51\x17\xc4\xc1\x1d\xd8\xe0\xf1\xc2\xf3\x57\x0d\x58\x3a\xc0\xa2\x73\xe8\x73\x4a\xcf\x78\xde\xfd\x73\x63\xc1\x39\xaa\x4b\xc0\xec\x2c\x3a\x1a\xe5\xf4\x75\x44\x5d\x10\x07\xff\xb7\x32\x6d\xc5\xb6\xed\x7a\xd4\x52\xb3\x12\xa9\x37\x57\x2d\x79\x65\x90\x91\x49\x77\x57\x6c\xb5\xe9\x0c\x25\x55\xf2\x50\x15\xb5\x8a\x29\xa2\x2e\x88\x83\xd7\x0d\xef\x77\x8e\xde\xb8\xe3\xc7\x2b\xb7\xcd\x6e\x17\xec\xbe\x7d\xe9\x97\x5c\xa3\x22\xc5\x6e\xee\x0b\x35\x2a\x02\x73\x1f\x93\x2e\x53\x84\x03\x20\x0e\xea\x07\x5c\xff\x0f\x07\x0c\xff\xb3\x95\xbb\x3f\x26\x06\xaa\x9f\x2c\x1a\x0a\xca\x3f\x9e\x72\x65\xbb\x23\xcc\xbb\x82\x5b\xe5\xd3\x48\x6a\xf3\xb1\x76\x55\xed\x93\xe3\x0f\x94\x8f\xf0\x9a\xa5\xc7\x48\xde\x1d\xdc\x91\x89\xd4\xf3\xd6\xfb\xcf\x38\x3f\x59\x14\xef\x7f\x56\x1e\xaf\x5e\x77\x6e\xbe\xc1\x75\x96\x63\xc9\x9b\x08\xc7\x7b\x58\xf2\x3b\xc1\x42\xb9\xc2\x67\x93\x3e\x1f\x7e\x6f\x96\xa2\x21\xc5\x9b\x88\xca\x20\xce\x4f\x16\x05\xed\x9f\x95\x87\xf3\xd2\xcd\x14\x1c\xfb\xa8\x75\x5c\x98\xe8\xb9\x35\x25\x76\xbc\xc7\x7a\x97\x6c\x66\x09\x34\x9c\xbf\x52\x98\xe3\x57\xf2\x75\x21\x2a\x83\x38\x3f\x59\x14\x8c\x7f\x56\xfe\x79\x23\xe3\xaa\x93\x46\x6f\xaf\xee\x90\xcc\x3e\xda\xd1\x7d\x67\xf4\x7b\x13\xb6\x1f\x5d\x56\xda\xc3\x1e\x0c\x37\xd9\xef\x4f\x48\x7b\x23\xd2\x17\xd0\xfb\x95\x3f\xd3\x17\xb4\xaa\x04\x92\x28\x21\xe7\xa2\x7e\xef\x59\x53\x1f\x9c\x0d\x77\xa3\x27\x6d\x2f\xde\x90\xa1\x2c\x99\xc5\x4b\x3c\xf9\x38\x9d\xf5\xe7\x0b\x96\x23\xdc\xbb\xab\x9c\x12\x29\x2b\x21\xda\xf1\x0e\x37\x56\x33\x66\xad\xce\x3f\x4e\xe3\x88\xb0\xaf\x89\x7c\xdf\x2e\x49\x65\xd7\xc2\xf6\xdf\x92\xbe\xec\x60\xfe\x67\x4d\xfb\xdf\xf4\x45\x5a\x9d\x1c\xb6\x58\x7e\xd0\x41\xcd\x95\x8e\x9e\xef\x7f\x59\x5f\x94\x6d\xa0\xbc\x3e\x63\x3e\xe5\x9b\x9b\x8d\x7a\xaa\x85\x31\x87\xbb\x40\x7b\x8e\x3f\xd6\x69\xc4\x2f\x0d\x48\xf1\x0b\x39\xc6\xcd\xd5\xa3\x18\x47\x0b\x87\xf6\x02\x53\x79\x1a\xc7\xd1\xe7\x6d\x17\xe4\x98\x18\xc8\x1d\xa9\x28\x46\x35\xe7\xb8\x3b\x4c\x4f\x23\x19\x90\x44\x8e\x5f\x50\x31\xf5\x5e\xf2\x57\x2f\x24\xe2\x0a\x0c\xf9\x98\x1b\x29\xc4\xac\x44\x0e\x6d\x59\x8f\x5b\x15\xcc\xd7\x55\xb0\x5d\x63\x1a\x7a\x74\x1a\x7f\xb6\x01\x39\x7e\xd1\x29\xdc\xd5\x23\x8d\xc0\x7d\x66\x9d\x6e\x28\x4c\xe3\x68\xd1\xb5\x98\x6c\x92\xd1\xa4\x73\x6f\x6e\x4f\x3c\xa9\xb7\xaf\x9c\x6e\xfb\x54\x5a\x8b\x1c\xbf\xf4\xb7\x77\xa7\x56\xf9\x06\xd6\xe5\x4e\x96\x26\xb0\xf4\xa8\x28\x47\x57\xe4\xa8\x67\xa3\xcd\xe2\xa0\x08\x38\xb8\x31\x3a\xe8\x0b\x9f\x4a\x6b\x91\xe3\x17\x9f\x7b\x44\x87\x4e\xfd\xc1\xef\x49\x9a\x3c\x34\x0e\x5c\xf1\x17\x46\x3d\xce\x8e\xf1\xf0\xa0\x48\x2f\x25\x1b\x97\x9e\x6b\xf7\xff\x76\x6a\xf1\x0b\x48\xdd\x13\xa7\xdd\x6d\xa8\xc7\x4e\x02\xd7\xaf\x70\x69\x54\x26\x66\x5c\x1f\x7c\x20\xf0\x2c\x56\x58\xc1\xce\x27\xfa\xfb\xe4\x58\x7a\xd1\x8d\xf4\xa7\xd0\xb4\x1b\xc0\xc1\x87\x5b\x14\x67\x37\x9c\xf7\x22\xa3\xdb\x49\x74\x77\xc8\xf1\x3e\xa9\x7e\xe8\x0b\x3a\x5a\x1c\x95\xc4\x98\xbb\x77\x69\xc5\xf0\xcc\xf4\xde\x6b\x44\x5d\x10\x07\x1f\x6e\x89\xb2\xbe\x0c\x6e\xd0\x60\x16\xda\x30\x7e\x3d\xfc\x84\x6a\x7d\xce\x07\x6b\x43\x2f\xb8\xdf\x96\x56\xb1\xfa\xe5\x7a\xc0\x3c\xfa\x3c\xa2\x2e\x88\x83\x0f\x8b\x46\x97\x09\x6e\x6c\x18\xc9\x0a\xe5\x56\x04\x3c\xc8\x3c\x38\xe3\x27\x15\xeb\xfb\x68\x2c\xdc\xf1\x4d\xb2\xfd\xc7\x1c\x02\xf2\x54\x01\x44\x5d\x10\xe7\x27\x8d\x82\xf6\x67\xdd\x4e\x79\x34\xab\xc4\x17\xee\xd3\x97\x31\xaf\xe0\xdc\x24\xe5\x0e\x7a\x1d\x70\x69\x27\x27\x93\x61\xa9\x78\x7f\xfe\x61\xf5\xb4\x17\x93\xf7\xf5\xff\x8c\xfb\xd7\xbf\x9b\xb7\x4f\xc0\xbf\xfa\xab\xbf\x4c\xb8\x40\xdd\xc8\x49\x06\x64\x7c\xf1\xee\xc1\xda\x4c\x75\xc8\x72\x20\x57\x9b\xd1\x50\x72\x95\x7c\x53\x1c\x2f\xfe\x65\xfe\xc9\x76\x51\x9e\x39\xa5\xf8\xde\x45\x44\xcb\x41\x1c\xdc\x00\xf5\x4b\xd5\x5f\x1e\x1c\x86\xb9\xcf\xaf\xcb\x10\xfe\xaa\xeb\xfd\x5e\x2b\x47\xdf\x42\x8b\x5f\xf9\x56\x62\x49\x7f\xb1\x0f\x53\x98\x06\x5a\x24\x03\x38\xb8\x01\xe6\x9e\x24\xde\x5a\x1e\x7d\x61\xb3\xd4\xc4\x1f\x5e\x72\xf9\xee\x4a\x57\x68\x5e\x52\x48\xe3\x5a\x9c\x10\xbc\xf3\x9c\x07\xb3\xf9\x08\x51\x17\xc4\xc1\x0d\x60\x4d\xb7\x9b\xd3\x8f\xbc\xde\xa7\xd3\x27\xc9\x5b\xb1\xec\x33\x9c\xb1\xc3\x7d\x27\x9d\xdf\xe8\x62\x1f\x26\xfe\xd5\xc2\x20\xd9\xfb\x88\xba\x20\x0e\x6e\xc0\x22\x46\x96\x4b\xb4\xf5\x18\xff\x38\x0f\xab\x64\xba\x76\xb4\xa9\x49\xb5\xc6\x78\xd0\xc5\x9e\xd1\x9a\xaa\xc8\xa3\xb1\xc0\xba\x2e\x44\xfe\x02\xe2\xfe\x6d\xc0\xff\x0c\x1e\x7f\x51\x00\xd4\xa5\x9f\xa4\x80\xe1\x66\x76\xe9\xc4\x5b\xd4\x92\x01\x65\xf7\x17\xc6\xd1\x4d\x68\xef\x98\x2f\xdc\xa4\x6d\x7f\x58\x84\x7d\x6e\xdf\xe2\x21\xc9\x8f\x75\x44\xd3\x41\x1c\x5c\x81\xbb\x6f\x88\x7f\x13\x73\x98\xae\x93\xa7\xc5\xa1\x1c\x8f\xaf\xf4\x6e\xb8\x7e\xbc\x8f\x7f\x87\xe0\x5b\x71\x72\xc0\x63\x66\xae\x4e\x03\x44\x5d\x10\x07\x57\x20\xf9\x0a\x55\x5e\x0d\x43\x70\xb2\xf5\x96\x79\x8d\x5a\xd3\xba\xba\xb7\xe2\x93\x16\x16\x0c\x74\x93\xe1\x60\x9e\xb7\xa2\x09\xf3\x9f\x10\x75\x41\x1c\x5c\x01\x5c\xb5\xd2\x58\xa5\xda\x9f\x4e\xe1\x97\x22\x72\xd4\xb5\xf1\xed\xad\xc9\x2d\x63\xf7\x94\x96\xea\x4d\xc9\xa6\xd8\xf0\x5a\xdb\x54\x11\x75\x41\x1c\x5c\x01\xf5\xac\xb0\x64\x71\x5a\x75\xcf\x40\x91\xde\x2f\xd4\x01\xa9\xcf\xdd\xba\xad\x5d\xfc\x55\x5e\xc4\xdc\x55\x68\x61\xcf\x6c\x88\xb3\x44\xcc\xb9\x41\xdc\xbf\x15\xf8\xff\x23\xf9\x5f\x1c\x00\x8d\xaf\x27\x39\x80\x59\xc1\x2a\xf3\xd1\x62\x13\xc3\xb3\xbf\x60\x5c\xab\xa0\x3e\x49\x69\x4f\xc9\xe7\x1c\x4d\xd4\x3b\x85\xa0\x2f\xb9\x9e\x4f\x06\xa0\x4c\x0b\xc4\xc1\x1d\xa8\x35\xe9\xd7\xd1\xea\xdf\xbf\x28\xe0\x8f\x77\x93\x0a\xcf\x6a\xe0\xe3\x97\xd4\xcd\xcf\x8b\x2a\xb1\x12\xa8\x86\x2a\x0c\x17\x25\xbf\x20\xea\x82\x38\xb8\x03\xba\xe9\xb5\x1f\x52\xbe\x6d\xe1\x3d\xc0\x9e\x93\xc8\xb2\xcd\x18\x4d\x28\x48\xbf\x57\x94\x3b\x28\xe2\x3f\xa7\xcb\xcc\xc6\x6f\xe4\x87\xa8\x0b\xe2\x90\xba\x01\xe5\x30\x32\x93\x3b\x18\x4b\xb9\xae\x9d\xe7\x05\xfd\xb3\x86\x85\xb1\x71\x03\x2b\x66\x3f\x75\xf8\x6a\x18\x55\xb0\x6f\x2c\x63\x41\xdd\x00\x80\x83\x3b\xe0\xf3\x26\xf0\x2c\x96\xf0\x0f\xcb\xd6\x3b\x33\x89\xcf\xe9\x9f\x72\x34\x9d\xeb\x40\x4f\xc6\x40\xcf\x0d\x43\x1b\x4a\x1c\x58\x53\x56\x41\x38\x00\xe2\x10\x0e\x34\x00\xf2\x17\xd0\x64\xe7\x24\x07\xbe\xe9\x7e\x25\x93\xa2\xcb\xce\xa3\xf5\x59\x10\xeb\x27\x50\x3d\xe2\xe1\x60\x13\x4b\x91\x11\xfa\x44\x4b\x26\xa6\x58\xcf\xc2\xd3\x83\x68\x3b\x88\x43\xea\x07\x16\xda\x30\xa4\x0d\xf9\x6b\xf6\xf0\xc6\x66\x6f\x8d\xba\x9d\xed\x94\x25\xfd\x42\x67\x45\x5c\x3c\xea\xfb\x23\xe7\xd7\xc0\xd1\x33\xa8\x1f\x00\x70\x70\x07\x3a\xfd\xb2\x19\x6c\xed\x1e\x44\x48\x6e\x6f\x3f\xdf\x11\xc4\xa5\x8f\xbc\x50\xb0\x19\x25\xcb\x5b\x48\xf3\x59\xc1\xe4\x9b\xf5\x3a\x14\xc5\x83\x38\xa4\x0c\x8e\x84\xea\x7d\x4e\xfa\x6e\xda\xd5\xc1\x2a\x3b\xf1\x8a\xc9\x5a\xe1\xe7\xc3\xdf\x27\x1e\x4c\x7b\xe5\x08\xe9\xd5\x91\x29\x9b\xf9\x40\x19\x1c\x80\x83\x3b\x40\x38\x9b\x72\x41\xe9\x4d\xf2\x63\xc2\x3a\xf7\xbc\x38\x6e\xb9\x2e\x9a\x77\x23\xdb\x98\x05\xf8\xa1\x86\xcb\x2c\xef\x54\xbb\x7d\x5f\x20\x1c\x00\x71\x50\x3f\x00\xc8\x5f\x40\x33\xcf\x93\x1c\xa8\xd3\x19\xe2\x98\xa6\x4d\xaf\x3c\xda\x95\xe3\xf0\x2c\xa4\xea\x37\xbc\xc1\x79\xd3\xe6\x5e\x29\x5b\x65\xac\xde\x6f\x66\x5b\x3d\x2b\x44\xdb\x41\x1c\xdc\x01\x11\x81\xcd\x1e\xe1\x6c\x7d\xb7\x48\x6b\xca\x5b\x3c\xee\xb7\xce\x9a\x66\xb4\x6b\x52\x18\x06\x49\x84\x6a\xa7\x93\xca\x97\x44\x0b\x21\xea\x82\x38\xb8\x03\x04\xca\x24\x9c\x07\xcd\x3d\xc1\x67\x95\x08\x2f\x7d\x7c\x78\xf4\xb8\x97\xe5\x4a\x06\x4b\xd6\x5d\x29\xb7\xca\xfd\xbc\x7e\x53\x6f\x5e\x44\x5d\x10\x07\x77\xc0\x64\x5b\x86\x25\x47\xcf\x0c\x55\xaf\x50\xf7\x45\x58\x6c\x75\x2a\xee\xce\x5d\xb9\x07\xa3\x9a\x87\x58\x43\xc4\xb5\xd7\x1c\xb9\x07\x10\x75\x41\x1c\xdc\x81\xae\xd0\xb7\xc7\x6b\xe2\xe6\xd7\xba\xc9\x50\x56\x51\xda\xa2\xf1\xb0\x3e\xec\xbb\x67\x56\xdc\xd3\xbd\xcc\x8e\x95\xab\x10\x86\xba\x81\x70\x00\xc4\x41\xfd\x00\x20\x7f\x01\xad\xdd\x4f\xce\x5f\xea\x3c\x07\x45\xe6\xf8\x93\xda\xd4\xf3\xc9\x7a\xf3\xc9\x2d\x46\xd9\x33\x8c\x1a\x9d\x9b\x1b\x3a\x78\x44\x2d\xcd\xc4\xd2\xac\x58\x10\x59\x06\x88\x43\xce\x5f\x02\xb7\xbe\xa4\xf3\x24\xb4\xf4\xc6\x58\xbf\xaa\x64\xa6\xde\xb3\xf4\xaa\x34\x18\xe4\xb9\x94\x28\x6e\x18\x20\xc7\xfa\xac\xae\x77\x17\x51\x19\xc4\x21\xe7\x2f\x61\xb7\x22\x55\x7b\x02\x0d\x5d\x2f\xa2\x90\x04\x14\xad\xcc\x11\xcd\x65\x0c\x5a\x70\x9a\x04\xe7\xd5\xed\x4c\x33\x0c\x1a\xbc\x94\x40\x54\x06\x71\x7e\xb2\x28\x24\xff\xac\x6c\xa0\xe5\xca\xfc\xec\xf5\xe1\xe6\xa1\xfe\xab\xaa\xe6\xca\xb0\x2c\x26\x7d\xd9\x44\xf7\x83\x84\x1b\x0a\xe9\x76\xbb\xbd\x13\x75\x84\x50\xfe\x02\xda\xb4\xfa\x67\xfe\x52\xc6\x9b\x65\x1b\x61\x17\x6b\x90\xa6\xe1\x8c\xa2\x16\x94\x1a\xff\x6e\xb9\x81\x49\xf7\x1a\xe9\xe3\x33\x4a\x54\xad\xc3\xe2\xe9\xd9\x7f\xa0\x2f\x5f\x2b\xc7\xe5\x7c\xea\xf5\x33\xf1\x6f\xe9\x6a\x96\xda\xba\xac\x87\x9f\xda\xa4\x21\xe1\xf3\xf5\x2a\x3f\x81\x6a\xc2\x36\xe7\x87\xff\xb6\xfc\x05\xd4\xb4\x3f\xf2\x97\x48\x78\xfe\x32\xf9\xc5\x57\xd0\xd2\x22\xe3\xe1\x93\x86\xcb\x1d\xfc\x3a\xb8\x82\x52\x05\x58\x0c\x23\xef\x7f\x93\xca\xf0\x9b\x55\x13\xd9\xdd\x5b\x3f\x8d\xfc\x05\x45\x05\xbe\x46\x9f\x1e\x2f\xec\x6d\x53\x1f\xc6\x29\xba\x7a\xfe\x6c\x71\x0d\x77\xb5\xc8\xa2\x58\x40\xec\xeb\xc8\x89\x30\x27\x96\x50\x7d\x76\xdb\x2f\xa7\xb2\x33\x03\x39\x7f\x91\xcf\x88\xe2\x2c\x8a\x79\x45\x5a\xe8\xe3\x33\x71\x7d\xe2\xd3\xc3\xd4\xb6\xde\x86\x57\x8d\xf9\xd1\x71\xf1\x02\x87\xb5\x56\x93\x9d\xa7\xb2\x0f\x45\x13\xe9\xcf\xe2\x0a\xf7\x7c\x62\x65\xef\xf4\xd8\x91\x38\xfb\x65\x32\x72\xa4\xdf\xec\xeb\x4e\x47\x53\xc2\x74\xd3\xe6\xa3\x19\x01\xfe\x4e\xaa\xfd\x53\x69\x2d\x72\xfe\x32\x7b\xb7\x9f\xdb\xa9\x48\xb2\xf9\xd5\x78\x39\x76\x4f\x10\xb7\x83\x7e\x03\x87\xe7\x81\xc9\xcf\x2f\x6f\x84\x29\x53\x5b\x50\x5b\xec\x4e\xa5\xb5\x4f\x90\xfe\xec\x6b\x42\x6b\x62\x42\x56\x27\x52\xd6\x73\xac\x95\xd6\xad\x4e\xa3\xaa\x9e\x6a\xb9\xc5\xdb\xb8\x49\xe9\x7e\xc6\x77\xc5\x2a\xb2\x1f\x9c\x5a\xfe\x02\x52\xf7\xa4\xe1\xb6\xbe\x60\x7e\x92\x6c\x71\x64\x23\xf4\xc5\x5b\xbc\xa7\x03\x54\x93\x41\x12\x23\xba\x5d\xf7\x4a\xbf\xfa\xb9\xe1\xc6\x93\xd6\x0c\xe1\x20\x86\x19\x10\x07\x1f\x6e\x31\x75\x1a\xe8\x74\x08\x8c\xfa\x9f\x3d\x4a\x91\xf2\xe8\xfe\x6a\x69\x2a\x25\x18\x26\x73\x95\xd0\x56\xdd\xfa\x5e\xf8\x67\x2e\x21\xe8\x35\x0a\x88\x83\x0f\xb7\x96\xaa\xa9\xfe\xab\xaf\x4d\x29\xc7\xec\x8b\xaf\x15\xb5\xf9\x57\xa2\xbe\xaf\xcf\xe0\x16\x72\xaa\xd4\xd0\x5b\xfd\x36\xea\x52\x0c\xad\x92\x41\x1c\x7c\xb8\xbd\xfd\xf4\xee\x65\x81\x5d\x34\x0c\xb1\x70\xab\xb2\x9b\xd1\xbc\x98\x61\x4d\xcf\x2c\x30\xf9\xbb\x53\x13\x5f\xa8\xbe\x98\xdb\xf9\x00\xbd\x9e\x01\x71\x7e\xd2\x28\x24\x7f\xd6\x8d\xe9\x62\xfc\xa1\xd3\x2f\xf2\x7d\xb6\x79\xa9\x44\xd5\xf2\xba\x15\x6d\xe5\x20\x3a\x99\x1a\xc9\x0d\xc1\xae\x47\x8c\x61\x66\x17\xfc\x11\xf9\x0b\x88\xf3\x93\x46\x61\xf0\xf6\x09\xf8\x57\x7f\xf5\x97\x09\x17\xa8\x1b\x39\xc9\x80\xfb\x5e\x73\xdc\x86\xf9\xfe\x62\xbf\xc2\x9b\x87\xbd\xf8\xa5\xb5\x51\x5a\xb1\xef\x58\xff\xca\x92\x17\x9e\x72\x11\x68\x96\xbc\x98\x87\x68\x39\x88\x83\x1b\x90\x83\x8b\x71\x55\x3c\x3c\xce\x74\xec\xcb\x13\xfd\xbe\x80\xf7\x9b\xa1\xe7\x5a\x1b\xbf\xd8\xbd\xc7\x4d\xf9\xc1\xe6\xf3\x0c\xb3\x03\x32\x00\xc4\xc1\x0d\x60\x2e\xd5\xff\xec\x35\xd2\xc5\xe1\xa0\x2a\x88\xa5\x84\xe9\x9e\x4d\xf4\x58\xe3\x4b\xe5\x93\xea\xde\x2d\x6d\x9a\x44\xeb\x86\x2c\x28\x2c\x00\x71\x70\x03\xde\x99\xc8\xfb\x1d\x0d\xf3\xae\x66\xa9\x9b\xf8\xc9\xe7\xbb\xb4\xe4\x3a\x3c\xcb\xef\xbf\x51\x57\xda\x3c\xdb\xa4\xf9\x6c\x35\x8d\x14\x51\x17\xc4\xc1\x0d\x60\xef\xf0\x54\x46\x0b\xac\x31\x8a\x1b\x97\xb5\x18\x5f\x49\xb8\x4b\xc6\xd3\x91\xde\x29\x84\x8d\xbe\x83\xd3\xa5\xce\xf2\x6a\x2d\x17\x91\xbf\x80\xb8\x7f\x1b\xf0\x3f\x83\xc7\xdf\xb6\x40\x01\xba\xf4\x93\x14\x90\xf2\x42\xc1\x11\x95\xad\xba\xb1\x20\x72\x33\x2f\x51\xa0\xc2\xf9\x23\x69\x80\x55\xd5\x1d\xd1\xdf\x74\x62\x67\x93\xb4\x75\x2b\xd9\x11\x4d\x07\x71\x48\x5b\xa0\x82\x7e\x76\x5b\x4c\x7d\xb0\xce\x6c\x74\x6a\x96\x0b\x59\xff\x41\xb9\x80\xf1\x4b\xf1\xfc\x4d\xc3\x71\xdb\x32\xf6\x82\x95\x02\x45\x68\x0b\x14\x80\x83\x2b\xe0\x7c\x27\x53\xa4\x74\x86\x46\x8f\x69\xda\x33\x85\xe8\xb3\xe8\x72\xf1\xab\x5a\xcf\x96\xda\x26\xa6\x09\x25\x02\x77\x16\x1f\xac\x28\x44\x5d\x10\x07\x57\x80\x0b\x8d\xa8\xcb\xee\x0c\x1a\x93\x3c\xe6\x7c\x6f\x2a\x36\xeb\x13\xce\x55\xae\x91\x72\xa9\x67\xa4\x33\x4a\xec\x1e\xb6\x49\x8d\xd0\x7b\x7a\x10\x07\x57\xc0\xf7\x07\x5b\x59\xab\xc6\xc0\x94\x8b\x96\xc4\xd0\xd8\x85\xe5\xef\x37\x03\x05\x28\x98\x67\x4d\x96\x35\x78\xc9\x2e\x75\xa4\xdc\x7a\x8f\x98\x73\x83\xb8\x7f\x2b\xf0\xff\x47\xf2\xbf\x38\x00\x1a\x5f\x4f\x72\xa0\x41\x21\x54\x77\x3a\x46\xcb\x9b\x48\x8f\x8f\xfe\xfb\xe2\x75\x0c\x1a\xc3\x56\x52\xb6\xe6\x3b\x22\xd6\x51\x68\xf5\xf6\x66\x32\x99\x88\xb6\x83\x38\xb8\x03\x8f\xcb\x7b\xc6\x73\xaf\xda\x89\x16\xca\x6c\xd7\xee\x38\x4c\x0b\x32\xbd\xdd\x56\x4d\x14\xe8\xaa\x29\x1b\xef\x0a\xc9\x19\xc9\xd6\x43\xd4\x05\x71\x70\x07\x82\x14\x34\x7e\xfe\x2c\x09\x26\xbd\xfc\xfb\xe6\x6d\xe5\x21\xe9\xcd\xf1\xed\xd7\x5d\x67\xd0\xb1\xc7\xf3\xfb\xd3\x9e\x76\x50\x4e\x43\x03\x01\x88\x83\x3b\x50\x2e\xe5\x86\xa6\xa4\xd2\x82\xaa\xb1\x71\x71\x6a\xf1\x9a\x2b\x87\xe9\x76\xf1\x7a\xe8\x1a\x9a\x2a\x1d\x65\xe4\x05\x75\xa1\x8d\x33\x88\xba\x20\x0e\xee\xc0\x88\x94\x29\x39\xc3\x7c\xc5\xcf\x1d\xf4\x67\x56\xd5\xa5\x37\x16\xce\x5d\x9c\x8b\x6f\xce\x2c\xcf\xbd\x56\xdd\x6b\xee\x67\x5b\xf8\x01\xe1\x00\x88\x43\x38\xf0\x3f\xd3\xaa\xbf\x38\x00\x9a\xec\x9c\xe4\xc0\x0d\x0a\xb3\xf6\xde\x36\x45\xa2\xba\x5f\x8c\x26\xbb\x49\x47\x4b\x58\xb7\x6f\xd2\xa2\x1e\x30\xce\x32\x96\xfd\xba\xf1\x36\xea\x10\xda\xff\x05\xe2\xe0\x0e\x48\x8b\xf8\xd4\x24\x3f\x9c\xfb\x52\xac\xee\x2f\x31\x34\xa2\x33\x22\x8b\x59\xd8\xa0\xd9\xa9\x48\x7a\x24\x29\x90\x6e\x94\x86\x5e\x8c\xa8\x0b\xe2\xe0\x0e\x2c\xec\x63\xe4\x13\x1b\x3a\xad\x31\x53\xb6\x63\x47\x3f\x5a\xd6\x30\xe0\x9d\x4e\x2f\xe3\x5c\x7d\x34\xe0\xac\xfc\x65\x7f\xc7\x0a\x1a\xba\x40\x1c\xdc\x01\x69\x6f\x2f\x63\xaa\x08\x85\x98\xb3\xab\x3e\xf5\xcb\x06\x5e\xd1\x28\x2c\xcf\xe6\xf5\xe9\x9f\xc6\x90\x95\x36\xa3\xbd\x5a\x49\xb9\x06\x3d\x2f\x80\x83\x3b\x70\x55\x39\xbe\x46\x9f\xc2\x3d\x2a\x78\x1b\xfd\x95\x59\xac\xcd\x50\x19\xf9\x70\x62\xd3\xd7\x85\xbc\x9d\x73\xaf\x56\xa4\xd7\xa3\x1a\x10\x0e\x80\x38\xa8\x1f\x00\xe4\x2f\xa0\x99\xe7\x49\x0e\x4c\xb4\xb9\x18\x5c\x73\xe3\x6d\x30\x30\xd5\xb8\xbe\xb4\x6d\xc5\xb1\x25\x5a\xb5\xd3\x40\x27\xd3\x93\xdb\x72\xf3\x72\xae\xe8\x98\x25\xa2\xed\x20\x0e\xee\xc0\x2b\x51\x95\xa0\x5d\x54\xca\xb8\x14\xbc\xbe\x27\x3f\xaa\xec\x2e\x95\xad\xf2\x0c\x72\xa1\xab\x6b\x04\xbe\x12\x5e\xd1\x14\x1a\x32\x47\xd4\x05\x71\x70\x07\x58\x06\x08\xb8\x1a\xa7\x4c\x64\xf6\x66\xc6\xad\x94\x24\xe7\xdd\x55\xf8\xab\x08\x8e\x9c\xb7\xab\xf7\xbf\x39\x51\x88\x0b\x3b\x40\x2f\xfa\x40\x1c\xdc\x81\xac\x3d\x6d\xd2\x3d\x2f\xe5\x37\xde\x37\x29\x5e\x97\xf0\x94\xc4\x1f\xdc\x93\x25\x18\x58\x48\x1b\x39\x63\x8a\x7f\x54\xc8\x9d\x18\x06\xed\xd7\x01\x70\x70\x07\xe4\xfb\xbd\x14\xce\x16\xf7\xff\x30\x0d\xfc\xd1\xe1\x82\x9f\x17\xbc\x77\xad\x5d\xe6\x0b\xb1\xd8\xd2\x9d\xb0\x80\x04\xe5\xf7\x91\x52\x08\x07\x40\x1c\xd4\x0f\x3c\xf9\x7b\xfe\x02\x5a\xbb\x9f\x9c\xbf\x50\xa5\xa2\x44\xbe\xfb\xf0\x42\xc3\xe5\x33\x3a\x31\x0f\xce\xd1\xf3\xbb\xc9\x45\x87\x91\xcb\x49\x4a\x4f\x47\xeb\xda\x7e\x25\x8c\x1a\x20\xb2\x0c\x10\x87\x9c\xbf\x8c\xd5\xe0\xbf\x8b\x39\x93\x65\xb0\xcb\xa6\x3f\xe3\x88\x56\x2c\xae\xbf\x15\xd1\x1a\x48\xb4\x54\xf0\x4e\x8d\x31\x83\xe8\xb7\x47\x1d\xa2\x32\x88\x43\xce\x5f\x3a\xc9\xd4\xd7\x03\x92\x6d\x37\x31\xcf\xff\xa8\x7a\x83\x86\x1f\xf9\x95\xe0\x6c\xb4\x65\x70\xf7\x70\x29\x8b\x4a\x54\x63\xd3\x8b\x06\x44\x65\x10\xe7\x27\xfb\xaf\x5f\xf2\x1f\x99\x11\xe3\x8a\xd9\x59\xdb\xed\xb0\xf8\x8d\x98\xf1\x8e\xe0\xf3\x47\xb9\x62\x8f\x59\xea\x6d\xd9\x03\xae\xee\xa1\x2f\x97\x7a\x26\x87\x42\xf9\x0b\xe8\x24\xf0\x9f\xf9\x8b\x2d\xc3\xf2\xc7\xbd\x18\xae\x81\x18\x0e\xd3\xda\x67\x66\xfd\x6c\x6e\xb3\x55\x37\x76\x44\x77\x7d\x62\xc8\xd2\xd1\x6b\xd3\x0f\xb2\xfe\x40\x49\xb3\xb0\x46\xf1\x1c\xbe\x0f\xc9\x45\xe9\x3b\xaa\xdd\x31\x0e\xe8\x55\xc5\xf8\x8e\x83\x7b\x97\x6b\x3f\xeb\xf0\x52\xfe\x80\xb3\xc0\x7f\x5b\xfe\x02\x6a\xda\x1f\xf9\x4b\x1f\x3c\x7f\xf1\xbe\x2d\xdb\x57\x24\xb9\x65\xad\x2a\x10\x72\x4c\xb3\xce\x7a\xef\xe0\xfe\x50\x4a\xeb\x31\xab\xf9\x24\xfd\x13\x92\xc4\x90\x82\xeb\xa7\x91\xbf\x48\x22\xe5\x2f\x1c\x4b\x7d\x37\x32\x77\x7a\x2c\xf3\xc2\x12\xbd\x19\x71\xcd\x3d\x17\x64\x77\x6e\x7b\xfb\x76\x7e\xb5\xab\x7e\xf4\x68\xa6\x4d\xf7\xed\xa9\x6c\xcd\x40\xce\x5f\x9e\x2a\xdb\xbc\xc4\x55\xa0\xd6\x5c\xd6\x2d\xa9\x6f\xd6\x60\xc6\xe9\xbc\x98\xb2\x13\xb6\xfd\x42\x37\xd8\xb7\xf3\x01\x81\xc1\xa3\x95\x53\xd9\x88\x82\x9c\xbf\xcc\x27\x6b\xc6\x85\x93\x25\x7f\x5c\xce\x51\x8c\x5e\xb1\x6b\xaa\xe6\x1d\x1d\x0b\xec\x45\x7b\x50\x96\x54\xb4\xe8\xa4\x60\xcf\xf2\xf3\x54\x5a\x8b\x9c\xbf\xfc\xa8\xb8\x53\xce\x77\xf5\x9c\xcc\xc7\x33\x79\x4a\x2e\x93\x1d\xef\xa7\x45\x18\xc2\xd5\x22\x83\x8b\xb6\x76\x69\x54\xf5\x5b\xdd\xb9\x4e\xa5\xb5\xc8\xf9\x8b\x37\xa3\xb5\xe5\x61\x10\xe5\x8e\x95\x59\xa5\xb4\xf2\xfa\xac\x5d\x07\x49\xc7\x2f\x7d\xc2\x7e\xc3\x17\xb8\x59\x58\x5f\x5c\xfa\x2c\x4e\x2d\x7f\x01\xa9\x7b\xd2\x70\x3b\x8c\xb6\xeb\x98\xb4\x1f\x56\x6f\xae\x83\xd2\x62\xac\x68\xb8\x94\x96\xe7\x31\x35\x9a\x46\x8f\x8f\xcd\x91\x46\xb6\x89\xba\x03\x2d\x39\x40\x1c\x7c\xb8\x35\x7f\x50\x9f\x41\xc2\x7b\xf8\x38\x20\x5b\xef\xe5\xd3\xdb\x71\x2b\xee\xd3\x26\x1a\x2b\xef\x0f\x19\xdc\x69\xb2\x6f\x56\xe8\x94\xd3\x42\xbb\x14\x00\x1c\xd2\x2b\xaf\xfc\x6f\x53\x67\x94\xb2\x82\x47\xdf\x2f\x13\xe6\x7f\x9d\xc1\xab\xbd\x78\x86\xa5\x3d\xa4\x7e\xcc\x26\x9d\x1b\x5d\xf7\x0d\x55\x29\xf4\xca\x0b\xc0\xf9\x49\x4b\xfe\xf3\x75\x87\xcc\x6d\x4f\xeb\x9d\xbd\xbe\x2c\x71\xda\xce\xe9\x7e\xa2\xf2\xc3\x52\xfa\xf4\xf9\xe8\xef\xa1\x3a\x85\xb5\xa4\x77\xaa\xb0\x42\xa1\xd7\x1d\x00\xce\x4f\x1a\xf5\x1f\x75\x1b\xe3\x0e\xb1\x29\x69\x25\x1e\xac\xdc\xb9\xb0\x61\x4f\xcf\x3e\x6f\x95\x7d\x5b\xf6\xd2\xe5\xa4\xae\x1a\xd6\x39\x7e\x5a\x0a\xc6\x2e\x44\xfe\x02\xe2\xfc\xa4\x51\xd0\xbc\x7d\x02\xfe\xd5\x5f\xfd\x65\xc2\x05\xea\x46\x4e\x32\xe0\x2e\x8d\x87\x86\x22\x75\xaa\x2b\x71\x76\xff\x98\xab\xb6\xbf\xf8\x4b\x97\xac\xa5\xd5\xdf\x6f\xb1\x4d\x02\x29\xea\xb8\xbb\x52\xcd\xa0\x97\x93\x00\x0e\x6e\x80\x44\xe8\xd0\xa1\xcd\xdd\x7d\xe3\x8d\xe7\x4f\xb8\x44\xb0\xb7\x08\x8b\x67\x1d\xb3\xf3\xe3\x32\x27\xbf\xe1\xe6\xb0\xbc\x0d\x9b\x91\x44\xd4\x05\x71\x70\x03\x96\x77\xed\x23\x16\xfc\x5f\x35\x84\x87\x6c\xa6\x7c\x0f\x08\x7b\xa5\xfb\x81\xdd\xfa\xe5\x22\x1e\x77\x5d\x50\xcb\x91\xf4\x85\x47\x3c\x88\xba\x20\x0e\x6e\x40\xa9\xe5\x85\x81\x81\xf0\xda\xf0\xdf\x4f\x9f\xdb\x3f\xaa\x2a\x1a\xe3\x3a\xf6\xcd\xb0\x35\x8d\xc0\xa2\xc1\x0f\x38\xa0\x58\x7f\x93\x84\xa8\x0b\xe2\xe0\x06\x94\xb9\x3c\xee\xc6\xfe\x9c\xe7\x86\x91\x72\xad\x1e\x6f\xf9\x7c\xc2\x2f\x9a\x1b\xbc\xf4\x55\x97\x25\x37\x9d\xe5\xec\x6d\xca\x3c\xab\x11\xf9\x0b\x88\xfb\xb7\x01\xff\x33\x78\xfc\x45\x01\x50\x97\x7e\x92\x02\xe3\xc3\x8e\x2e\x92\x77\x3e\xcf\xa4\x66\xdc\x36\x93\xc0\xdd\xdd\xb0\x17\x8d\xab\xd7\xc1\x7a\xac\x19\x7f\x36\x9f\xf4\x06\x5d\x40\x0a\xa2\xe9\x20\x0e\x69\xce\xfd\x82\x25\x31\x29\x35\xc4\xef\xce\x67\xd6\x86\xb4\x59\x5c\xc2\x48\x1b\x07\x1d\xd9\x27\x9d\x36\xac\x46\xe7\x9f\x72\x59\x3f\x85\xce\x1f\x81\x38\xb8\x02\x8a\x9b\xa4\xc3\x4c\x66\x1f\x2a\xf4\x7d\x95\x50\x66\x78\x75\xa8\x92\xe5\x5e\xd6\xcf\xbe\xc3\x52\xe0\x25\xc5\x9b\x67\x59\xaa\x77\x41\xd4\x05\x71\x48\x0a\x68\xe6\xe9\xf5\x38\x6c\xec\x7e\x0e\xdd\xd5\x21\xcb\x31\xec\xa9\x1a\xd3\xfd\xd5\xe0\xdb\xbf\x85\x7b\xb1\x6f\xe6\x18\xdb\x15\x5a\x7b\x83\x38\xb8\x02\x24\x5d\x38\x1f\xb3\x5e\xac\x2b\x04\x45\x99\x0a\xe3\xe5\x12\x79\xde\xca\xe3\x59\xa8\x6a\x24\xf5\x26\x37\xe7\xf6\xa1\xe5\x75\x6d\x43\xcc\xb9\x41\xdc\xbf\x15\xf8\xff\x23\xf9\x5f\x1c\x00\x8d\xaf\x27\x39\x10\x3e\x84\xf1\x2d\x87\xa3\xc5\xdd\xfd\xad\xc8\x9e\x0d\x75\x9a\xa3\x44\xd0\xb0\xa1\x96\xf8\xd0\xf9\xa1\x5f\x1c\x32\x36\x75\x6f\x2f\x20\xda\x0e\xe2\xe0\x0e\xb0\x37\xa4\x08\x12\xf8\x88\xe8\x5c\x8d\x37\x96\x73\xc9\xde\x57\x99\x0e\xb8\x73\xbe\xf7\x2c\xf6\xb3\x14\x0a\xfe\x58\x69\xc1\xbb\x78\x88\xba\x20\x0e\x69\x0f\xd4\x6c\xfb\xfd\x9c\x29\xb9\x51\xb9\x7c\xe2\x07\xaf\x5b\xfc\x70\xef\x56\x6b\x29\x5d\x25\xea\xf9\x20\x86\xbe\x66\x71\x65\x80\x80\x1f\xda\x03\x05\xe0\xe0\x0e\x88\x5b\xfc\x3a\x20\xd6\xab\x9d\x8d\x6e\xeb\xe9\x62\xe0\x4c\xee\x32\xb4\x95\x13\x49\x9b\x5b\x58\x95\xef\xfd\x6d\xce\xa1\x19\x0e\x0d\x88\x20\x0e\xee\x00\x56\x69\xc8\x8d\xaf\x68\x1b\xf9\xd1\x92\xbd\xd9\xa5\x17\xf6\xe9\x79\xd6\x12\xc2\xba\xd0\x99\x72\x49\x5f\x5b\xbf\x9f\x9c\x39\x10\x45\x38\x00\xe2\x10\x0e\x48\x02\xf2\x17\xd0\x64\xe7\x24\x07\x3e\x85\xc9\x86\x15\x3d\xa5\xc6\x11\x28\xf7\x9c\x78\xb3\x58\x75\x4c\xee\xc1\x7c\xc1\x28\xe2\x82\x6e\xcf\xb4\x73\x7b\x82\x0f\xad\x21\xa2\xed\x20\x0e\xee\xc0\x6f\xeb\xb3\x89\xef\x62\x84\xa5\x09\x9f\xd3\xce\xbd\xd4\x9b\xe1\x0d\x78\xd6\xf9\xc4\x7e\xe1\xb2\x25\xe1\xcd\xb4\x8d\xd0\x57\xc1\xd0\x19\x11\x10\x07\x77\xe0\xf8\xed\x2b\xa3\x72\xa7\x9b\x09\xa3\x11\xaa\x1f\xfd\x0b\x8f\x0f\x6a\xa7\xb1\x1e\xdc\xd4\x3b\x14\x32\xfd\x91\x57\xa8\x25\x8f\xf9\x0b\x51\x17\xc4\xc1\x1d\x58\x8c\xb1\xc8\xd9\x3f\x54\x70\x53\x9c\xb3\xb5\xfd\xf0\x4d\x3c\xce\x2d\x41\x53\x99\xe7\xca\x18\xd7\xea\xad\xfe\xc8\x0d\xd1\xb4\x1c\x44\x5d\x10\x07\x77\x20\x95\xed\x5e\x8d\xfb\xb0\x43\x8c\xb0\xd6\xb0\xb6\x0a\x85\xef\xeb\xc4\x07\xaa\xca\xe7\xb8\xa2\xbe\xaa\x6d\x51\xef\xdb\xdd\x4c\x76\x45\x38\x00\xe2\xa0\x7e\x00\x90\xbf\x80\x66\x9e\x27\x39\xc0\xac\x78\xac\x83\x13\x80\x27\x7e\x81\x74\xae\xf3\x90\x3b\xe2\xf2\xb5\x1b\x39\x98\xde\x19\x7c\xd9\x0f\x36\x87\xdf\xe3\xce\x0a\x42\xe7\x6e\x40\x1c\xdc\x81\x0b\xe7\x2d\xdb\xde\x4b\x29\xef\x3c\x4f\x4a\xe9\x15\xde\xe8\xca\xac\x62\x1b\xe0\xf7\xd1\x8d\x20\x49\x7b\x4f\xf7\x49\x78\x90\x16\xfa\x7f\x05\xe2\xe0\x0e\xfc\xf2\x0c\xa7\x58\x2d\x2d\x7c\x87\x77\x2f\x2c\xef\x43\xc7\x74\x18\xe7\x6b\x6a\x83\xfa\xdb\x1c\xfb\x52\x57\xc2\xf7\xdc\xfb\xbe\xde\x46\xd4\x05\x71\x70\x07\xe6\x96\x1e\x4b\x7d\x5c\x37\x6e\x77\xbb\xc9\xfd\xa5\x21\x5e\xdf\x92\x89\xef\x4a\xe5\x8f\xf8\x0f\xc5\xbe\xf7\x42\x25\xd1\xa7\xf7\x89\x10\x75\x41\x1c\xdc\x81\xd7\x49\x6e\xb3\x5a\x94\x05\x68\x04\x75\x8d\x2e\x8b\x59\x17\xf3\x1b\xa7\x9a\x19\xa3\x93\x0d\x5b\x66\x9c\x12\x4a\x58\x3b\x99\xfc\x11\x0e\x80\x38\xa8\x1f\x00\xe4\x2f\xa0\xb5\xfb\xc9\xf9\x4b\xe6\x5b\xeb\xaf\x6f\x25\x32\x33\x27\xb4\xed\x1f\xd5\xa4\xe3\xaf\x66\x17\xdd\x8e\x0a\xbe\x61\x46\xc9\x5f\x35\x93\x1c\x6c\x25\x19\x8d\xc8\x32\x40\x1c\x72\xfe\xd2\x58\x39\x3c\x9e\xd9\xce\x96\x53\x5e\xb0\xde\xee\xad\xb5\xf5\xe9\x81\x74\xab\x01\xbf\x76\x7b\x90\xfb\x03\x27\x6a\x63\x7d\xb6\x52\x44\x65\x10\x87\x9c\xbf\xd0\xd9\x06\xca\xe5\x36\x98\xf0\xe0\x4e\x9f\x7f\x1f\x79\xfc\xdb\x46\xaf\xf0\x69\x40\x1a\xad\x0d\x11\xde\xf9\xa1\x68\x7f\x45\x61\x69\x44\x65\x10\xe7\x27\x8b\x82\xf2\xcf\x7f\xb3\x50\xa3\xfb\x13\xad\x5f\x52\xf5\x5d\xbc\x3b\x2a\x1f\x0a\xf8\xa6\x36\xb7\x6e\x90\xc5\xfd\xd6\x23\xe3\x14\x0e\x7a\xa1\xf3\x5b\xae\x0f\xca\x5f\x40\xd7\xab\xfd\x99\xbf\x24\xb3\x93\xe2\xf9\x8a\xb6\xc9\x0b\xb9\xad\xdc\x7e\xae\x3e\x64\x51\x97\x15\x44\x36\xb0\x7d\x4b\xeb\x79\x18\x51\xe8\xfc\xeb\x25\xb3\x3f\xd0\x2d\x49\x0c\x93\xde\x3b\x77\x06\x6a\xda\xee\x2f\x18\xa6\xe5\x1d\xcb\xf8\xda\xfb\xfa\x19\x32\x61\x93\xbf\x58\xb8\xe2\xf0\xd8\x93\xfb\xbf\x2d\x7f\x01\x35\xed\x8f\xfc\x85\x84\x02\xb6\x5a\xbe\x61\xe2\xb2\x4a\x75\xb1\x8c\x9a\x42\xdb\x62\x9a\xb2\x99\x1e\xf5\xfe\x19\x81\x04\x07\x4c\xaf\x1c\x6d\x54\x7d\xce\xdb\xc5\xbd\xd4\xa7\x91\xbf\x78\x23\xe5\x2f\x81\xcd\x67\x96\xe8\x76\x49\x4a\x6b\x85\x62\x55\xda\x58\x23\xef\x14\xd9\x85\xa2\x74\xe4\x47\x6d\xd1\x3d\x52\x4b\x7c\xb1\x37\x4e\x78\x2a\x5b\x33\xae\x21\x45\x03\x5f\xe7\x2f\x13\xb9\x11\x89\x26\x8d\x56\xe1\xf6\xab\x45\xa2\x65\x5e\x3e\x50\x79\xfc\xe6\x69\xdf\x63\x9e\xc4\x4b\x78\xd4\x64\x24\xb6\xa7\xb2\x11\x05\x39\x7f\x49\x14\x43\x29\x7b\x7c\xa7\xd3\x80\x92\xd1\x30\x29\xee\x7e\xc3\x6c\xed\x55\xc9\xa5\x07\xcf\x2d\xaf\x32\xfa\xb8\x8f\x5f\xe6\xe3\x0e\x3a\x95\xd6\x1a\x23\xfd\xd9\x75\xbe\x2c\xa9\xe5\x15\x5a\x77\xca\x8f\x5c\x9c\x17\x0c\x06\x1a\x3a\x7e\xb1\xb1\x66\xe7\xbd\xe5\xb4\x60\x3c\x5b\x37\x93\x6f\x34\x72\x2a\xad\x45\xce\x5f\x32\xdf\x49\x52\x11\x2e\x87\x9c\xf7\xc8\x18\x52\x5f\x5b\x1a\x3d\xd7\x60\xb4\x4e\x97\xc8\xa1\xf4\x91\xcb\xa6\x67\x1c\x5f\xe0\x81\xc2\xa9\xe5\x2f\x20\x75\x4f\x1a\x6e\x2f\x4d\xe9\x79\x35\x78\xbd\xac\x51\x0f\x36\x7a\x27\xb0\xfe\x9a\xaa\x29\x96\x52\x2f\xbf\xb9\x74\xd4\x56\x6b\x52\x9c\xa9\x79\x93\x1a\x31\xcc\x80\x38\xf8\x70\x3b\x71\x9e\x36\x52\x35\x7e\x4a\x9b\xb5\x8c\xa4\x9c\x5d\x64\xd3\x4d\x65\xd9\x86\x39\x80\xe4\x65\x33\xbd\xfc\xf3\xe8\xbe\x0b\x07\x4f\xa0\xd7\x28\x00\x0e\x3e\xdc\x16\xf9\x8b\xdd\x22\xb5\xbc\x46\xb6\xcb\x8d\x69\x7d\x55\x05\x1d\xc5\x2d\xb8\x78\x30\xa0\xaf\xc2\x88\x85\xd0\xbf\x79\x77\x26\x4b\x0d\x51\x17\xc4\x21\xe5\x2f\x06\xbb\x36\x3a\x19\xe2\x7e\x09\x96\x5d\xf6\x85\x1a\x17\xf6\x75\x8d\xbe\x1c\xc4\xdd\x58\x52\xa0\x64\x7d\xf0\xd3\x3f\x69\x8f\x04\xca\x5f\x00\x9c\x9f\x34\xc9\x3f\xea\x6a\x63\x49\x90\x0b\xd8\xf7\x9d\xa7\x1b\xd2\x14\x2c\xac\xef\xde\x20\x56\x29\x3b\xe3\xe2\x8e\x13\xe7\x65\x98\xf6\x7d\xcb\xdc\x29\x15\x91\xbf\x80\xb8\x7f\x1f\xf7\xfd\x57\x7f\xf5\x97\x09\x17\xa8\x1b\x39\xc9\x00\x85\xa9\xfc\x70\xbb\xd0\xd1\xfd\xdc\x74\x37\xeb\x0b\xae\x93\x45\x4b\xa9\xce\xe6\x52\xee\x19\x0b\x33\x02\x4d\xbf\x25\x7a\x48\x64\x11\x2d\x07\x71\x70\x03\xcc\x62\x56\x15\x6f\x90\x7e\x4d\xfc\x3e\xf3\xb6\xd1\xac\xbd\xae\xdf\x83\x9e\xa0\x54\xb1\x09\x23\xa0\x50\xc6\xe2\x73\xeb\x3b\x2e\x68\x62\x04\xe2\xe0\x06\x84\xd1\x19\x1f\xa2\x7f\x48\x27\xfe\xf1\xf2\x52\xa0\xd3\xc4\x47\xfc\x10\x66\xd5\x5d\x91\xc4\xc2\x0f\x04\x12\xab\x7c\xf4\x8c\x52\xd0\xc1\x03\x10\x07\x37\x60\xd5\x20\x7e\x5b\x94\x30\xd5\x92\x92\x38\xb8\x5e\xa5\x4b\xfe\xea\x50\x60\x81\x04\x79\x91\x72\xdc\x93\xbc\x69\x31\x77\x6e\x11\xe8\xa0\x04\x88\x83\x1b\x40\x3b\xff\x29\x42\x9a\xa2\x33\xaf\xe0\x9e\x0d\x45\xd1\xd7\xd4\x97\x52\xee\xbe\x8a\xb7\xd3\xa7\x48\xc3\x8f\x3e\x32\xad\x06\xa1\x6e\x22\xf2\x17\x10\x07\xdd\xff\xf2\xf7\xfc\x05\xd4\xa5\x9f\xd8\x09\x24\x7f\xaf\x1d\x79\x27\x64\x7e\x20\x30\x88\xee\x22\x5a\xfd\x5e\xc7\xe3\x7b\xbe\xe7\xe3\xd5\x89\x2b\x2c\xf8\x0f\x4c\x06\x7f\x73\x42\x9d\x00\x80\x83\x2b\xf0\xc3\x89\x72\x22\xe0\x1b\xdd\x0f\xf5\xc8\xda\x12\x25\xbb\x82\xbd\x45\x81\x48\x0a\x29\x82\xef\x82\xfa\xe8\x25\x51\xb4\x2e\x46\xd0\x1a\x19\xc4\xc1\x15\x50\x8a\xa5\xba\x53\x21\x79\x66\x36\x20\xd7\x21\x3e\x80\xb6\x9e\x5f\x0e\xed\xc9\xd0\xf7\x75\x8a\x03\x6b\x3a\x41\x1c\x6c\xc7\x08\x51\x44\x5d\x10\x07\x57\x20\x24\xc2\x3e\x6c\xb6\x2a\xce\x2b\x5d\x50\xfb\x07\x2e\xbb\x57\xa5\xf6\x15\xc6\x98\xf1\x86\x3c\x9c\xf8\xbc\x5b\x9f\x0c\xef\x9a\x41\xcf\x0b\xe2\xe0\x0a\x3c\xf5\xfd\x9e\xdb\xa9\xd0\x30\xf6\xf6\xba\x1b\x06\x37\xea\xb1\xf7\xae\x8e\x80\x53\x6d\xb6\xff\xe6\x42\x4b\xa5\xd1\x15\x2c\x0f\x33\xc4\x9c\x1b\xc4\x41\xf7\x3e\x5c\xfb\xfb\xba\x0b\x34\xbe\x9e\xb8\xff\x25\x52\x89\xd9\x5c\x58\x56\xce\x29\x8b\x5b\x30\x41\x8e\x2e\x85\x92\x65\x48\x83\x04\x45\x60\xb1\x41\x40\x86\x7e\x20\xd5\x85\x15\xda\xff\x02\xe0\xe0\x0e\x60\x3c\xe9\xc1\xef\x97\x0c\xbd\xcb\x8f\xbe\x97\x28\xa5\x1c\x94\x30\x25\xa5\xd6\xd4\x69\x96\x29\xc7\x70\xbf\xab\xcf\xb3\xde\x2d\x01\x51\x17\xc4\xc1\x1d\xb0\x25\xd1\x66\x92\xa3\x0c\x76\x11\x70\x29\xa5\x18\x7b\x2b\xcb\xa7\x36\x54\xea\xce\x3f\xc0\x97\x6d\x95\x4f\x1c\x98\xc6\xe5\xea\x81\xa8\x0b\xe2\xe0\x0e\x18\xa8\xba\xf3\xe8\x5f\x61\x71\xe0\xaf\x2c\xf6\xb3\xfc\xe4\x4b\x45\x8d\x3f\x2d\xd9\x73\x2c\xa1\xe7\x9c\xee\x7e\xb3\x5a\xf3\x3b\x34\x10\x80\x38\xb8\x03\xd8\x93\x3e\xd9\xda\x07\xc4\x29\xe7\xb6\x83\xab\xb2\xfd\x50\x6a\x9f\xd7\xc8\x15\x9f\xa5\xd4\xb6\xd5\xfa\x14\xcd\x75\xfc\xd0\xab\x07\xe1\x00\x88\x83\xee\x7d\x00\xe4\x2f\xa0\xc9\xce\x49\x0e\xd0\xa8\xf4\xb0\xab\x39\xfd\x7c\x5b\xd9\xfd\xb5\xb0\x69\xb3\x4f\xe9\xfc\x10\x51\x55\xbb\x79\x6d\x63\x92\xd5\xfe\xd7\x8e\x81\x05\xe8\x2a\x30\x10\x07\x77\x60\x52\xe4\xec\x83\x2f\xf6\xde\x4a\x3f\x1a\x2e\x1f\x0c\xaf\x35\x44\x97\xdf\xae\xf5\xb4\x15\x2b\xeb\x15\x0f\xec\x7b\xa3\xfe\x86\x18\xda\x07\x07\xe2\xe0\x0e\xa4\x48\x4f\xef\xf1\x1f\xc8\xec\x67\x4a\x5d\x88\xba\x25\xe9\x80\x6f\xd9\xe4\xf1\x55\x75\x9f\xc1\xf7\x9d\xcb\xf3\x19\xe9\x2e\x54\x68\x8f\x02\x88\x83\x3b\x50\x27\x41\x3d\x32\x41\xb0\xcc\xc8\xfc\x73\xfc\xc6\xf7\xd2\x0f\x11\xc1\x0d\x11\x4f\xd3\xa2\x8f\x97\xcf\x72\xa3\xb0\x3c\xa4\x64\xfc\x0d\x9d\xc1\x01\x70\x70\x07\xce\x56\x9a\x7f\x90\x27\x26\x7e\x55\xec\x3e\xa3\x23\x94\xac\xc8\x85\xc3\x1e\xb9\x54\xfb\x70\x1e\xe5\xcb\xaf\xca\x2e\x54\x23\x31\x2b\x84\x03\x20\x0e\xea\x07\x8c\xff\xee\x00\x68\xe6\x79\x92\x03\x94\x21\xdd\x12\x2b\x97\xb7\x04\x8f\x0d\x17\xb8\x50\xea\xf8\x8b\x31\xd7\xf4\xd2\x1e\x3b\x74\x52\xfb\x46\x19\x68\x08\x74\xdd\x38\x87\x68\x3b\x88\x83\x3b\x50\x41\x97\x1f\xc6\x37\x3d\x7a\x41\xbc\x44\xfe\x59\x10\xaf\x47\x97\xd0\xf7\x66\x8c\xee\x76\x6b\xd7\x8f\xc4\x74\x39\x2e\xbf\x8e\xdb\x10\x75\x41\x1c\xdc\x81\xaf\xb7\x18\xcb\xe3\xfc\x3a\xbe\x0d\xe2\xfb\xf6\xf8\x38\x2b\x84\xba\xb4\xbc\x8d\x4b\xe9\x1d\x4c\xb4\x69\xa2\xfd\xce\xf3\x62\x0b\xda\xc0\x0d\xe2\xe0\x0e\x70\x7e\x4f\x61\x96\xcf\x53\x66\x47\xbd\x72\xfb\xf1\xac\xb6\x0c\xd9\x76\xfa\x78\x28\xb7\xf6\x07\xd6\x3e\xa5\xe8\xb5\xd4\xe8\x0f\x2f\x10\x75\x41\x1c\xdc\x81\x3a\xe9\x7b\x1e\x33\xfd\xbf\x44\x1a\xaa\x98\xe2\xe3\xed\x6f\x2f\x55\xd6\x3e\x92\xbb\x37\xf8\x86\xfd\xf2\xfe\xe1\xfd\x14\x26\x87\x51\x84\x03\x20\x0e\xea\x07\x00\xf9\x0b\x68\xed\x7e\x72\xfe\xe2\x1d\xb3\xe0\x35\x68\xbd\xb5\xed\x89\xfa\x28\x3d\x23\xec\xed\xfa\x12\x76\x6f\x61\x80\x5c\x82\xe3\x85\xb1\x3c\x1a\x15\xe1\x92\x30\x44\x96\x01\xe2\x90\xf3\x97\x9c\xd0\x20\x35\xe3\xe4\x35\xd7\x29\xa7\xd6\x6a\xa2\x37\x9a\xf8\x4a\x33\xd6\xcb\x19\x93\x8e\xee\xa3\x14\x83\x2c\x1c\xb3\xdb\x84\x88\xca\x20\x0e\x39\x7f\xc9\xab\x0a\xfb\x46\x8f\x92\xce\xe4\xe2\xb3\x72\xd7\x22\xeb\x51\x87\x6a\x9b\xdd\x3c\x3e\x81\xde\x55\x0c\x47\xf9\x77\x3c\x9e\x21\x73\x88\xca\x20\xce\x4f\x16\x05\x05\xe3\x1f\x95\xab\x2b\xdf\xde\x78\xf4\xe6\x6d\x79\xc0\xb5\xe7\xab\x19\x0b\x37\x89\xdf\xb7\xd7\xa7\x8a\x8d\xa2\x64\x93\xed\x7b\x07\x39\x7e\x18\xfe\x06\xe5\x2f\xa0\x3b\xeb\xff\xcc\x5f\x7e\x5c\x30\xcc\x55\xdb\xf6\x16\x1a\x35\xe3\x62\x21\xda\x23\xbf\xad\x75\x67\x6a\xcf\x73\x9d\xd5\x4e\x79\xcf\xcf\x92\x51\x48\xc0\xf9\x0f\x94\xd5\x7b\x9d\x76\x42\xb9\x2a\xa4\x27\xcf\x92\x26\xff\x03\x4d\x17\xb1\x2c\xa3\x86\x54\xe1\x53\xe2\xf5\x12\x7d\x3a\x8f\xfd\xb0\xf8\xff\xb6\xfc\x05\xd4\xb4\x3f\xef\x7f\x81\xe7\x2f\x74\xf7\xc8\x64\xfa\x54\x0f\xbb\x5a\x9b\xc2\x48\x5f\xff\x50\xf1\x2f\x76\xac\x89\x60\x3b\x7f\x33\xd3\x45\xed\xc5\xf7\xd4\x3e\x67\xd4\xd3\xc8\x5f\x1a\x90\xf2\x97\x42\x5f\xa3\x46\xa1\x77\x04\x37\xdd\xa8\xcf\xf0\x05\xda\xfc\x20\x50\x2d\xd0\xa7\x75\x72\x70\x97\x58\xbb\x11\xae\x99\xd0\x3a\x56\x71\x2a\x5b\x33\x90\xf3\x97\x2b\xd2\xbc\x83\xea\x7c\xd7\xb1\x8f\xdf\xfa\xec\xdb\x6f\xf0\xf7\xed\x3b\x49\xf2\x8c\xda\x28\xf7\x06\x9a\x7d\x08\x7e\x46\x73\x65\xf0\x54\x36\xa2\x20\xe7\x2f\x7e\xc3\x0f\xe2\x02\x5a\x66\x97\xf9\x63\xd9\xfc\x2f\xdd\xfe\xb6\xde\x29\x33\xaa\x53\x98\x96\x9d\x8b\x93\x22\xf8\x94\x45\x4b\xff\xf8\x54\x5a\x8b\x9c\xbf\x08\x68\x73\x19\x94\xc7\xcf\xd5\x1a\x7a\x7f\x4d\x10\x71\xac\x27\x79\x31\xbc\x75\x29\xce\x8e\xbf\x93\x31\xa4\xe3\xfb\x43\xc1\xc8\xee\x53\x69\x2d\x72\xfe\x42\xe1\x9f\xab\x2d\xff\x15\x5f\xf4\x53\xdb\xfd\xde\xe3\x6a\x0f\xe5\xf3\x3a\x1c\x2b\x4f\xd4\x2d\x48\xa5\xf8\x94\x58\x8b\xf5\xc7\x76\x4e\x2d\x7f\x01\xa9\x7b\xd2\x70\x9b\x6a\x28\x2e\x56\x27\xab\x5f\x7c\x94\xd9\x20\x9c\x92\xeb\x49\x81\x65\xd2\x14\x67\xea\xc9\x42\xaa\x1c\xbc\x4d\x58\x9b\x68\x5e\x80\x18\x66\x40\x1c\x7c\xb8\xfd\x3a\x68\x9c\xe5\xc1\x22\xa2\x3e\x63\x76\xdb\x50\x91\x98\xc0\x26\x72\xb7\xc9\x2e\xe3\x66\xb0\xec\xd7\x2f\x91\xbe\x22\x6a\x52\xd5\xd0\xb0\x08\xe0\xe0\xc3\xed\x11\x5a\x6d\x9e\xf2\xf5\xd2\x00\x5a\x83\x97\xef\xfb\x87\xfa\x96\xf4\x22\x13\x23\x17\x24\x02\xf0\xe9\x72\x1e\x08\xf1\x1e\x12\x43\xaf\xbc\x40\x1c\x7c\xb8\x0d\xbb\x22\xd5\x53\x63\x44\xcd\xe7\x11\x20\x22\x18\x2e\x50\xe4\xee\x91\xaa\x7a\x85\x83\xb3\xef\xae\xae\xf6\xfd\xa7\xbe\x38\xbc\xd0\xf5\x07\x20\xce\x4f\x1a\x05\xf5\x1f\xe7\x9a\x02\x64\x3f\x2f\x3d\xcb\x10\x1d\x92\x91\x41\xed\x7a\xfb\x4d\xae\x3b\x81\x72\xed\x9c\x22\x7f\xe4\xcc\xf0\x19\x8b\x97\xd4\xe5\xa1\x88\xfc\x05\xc4\x41\xf7\xbf\xfc\x35\x7f\x01\x75\x23\x27\x19\xe0\x6d\x6c\xdc\x74\x61\x8b\x76\xf0\xf5\x56\x88\x98\x9e\x52\x0c\xae\x54\xa0\xf3\x7a\x16\xad\x89\x01\x45\xbe\x84\xca\xa3\xfa\xf0\xab\x88\x96\x83\x38\xb8\x01\x58\xd7\xd2\x2f\x6c\x7c\x9d\x6e\xe5\xf4\xd1\x73\x70\x2d\x17\x0a\x7a\x33\x7d\xe4\xcc\x86\x8b\xc6\x38\xf9\xf1\x83\xd2\x64\x59\x6c\x22\xa2\x2e\x88\x83\x1b\x40\xff\xf2\xd5\x45\xa9\x41\x0a\x1b\xde\xb3\x67\x78\x74\xcd\x9d\xe5\xb3\x03\x5b\x86\xba\x97\x56\xf4\x3f\xdc\xd6\xb7\x89\xb2\x18\xc9\x42\xd4\x05\x71\x70\x03\x72\x09\xab\xa8\xbf\xf1\x2d\xff\x88\xae\xe8\x1c\xb9\xbc\x32\x9c\x19\x77\x77\x3e\x8e\x7b\x3a\xc4\xce\xfe\x11\x05\x8a\x86\x3c\x5e\x17\xa2\x2e\x88\x83\x1b\xd0\x46\x9c\x1a\xc3\x35\xad\x9d\xa7\x5e\xb8\x83\x39\x8b\xe5\xa0\xb4\x99\xd0\xd6\x74\x5b\x34\xb4\xda\x6f\x57\xe5\xb5\xdc\x7b\xce\x7e\x44\xfe\x02\xe2\xa0\xfb\x5f\xfe\x9e\xbf\x80\xba\xf4\x93\x14\xd8\x92\xc2\x19\x36\x25\x9c\xbb\xe1\x47\xf8\xb4\x54\x47\x39\xbd\xca\x94\x0c\x57\xa5\x7c\x38\x65\x99\xbc\x28\xc4\x75\x66\x52\x15\x7a\x3f\x0d\xe2\xe0\x0a\x6c\x70\x1f\x58\x8d\x2e\x3e\xc8\x51\xcb\x18\xcb\xcd\x4d\x0f\x55\x3c\x96\xf2\xc3\xc2\xf5\xf0\xbb\x77\x10\x62\x49\x7b\x5c\x60\x35\x09\xdd\x8d\x08\xe0\xe0\x0a\x18\x3a\x87\xc7\xbc\xe3\x8a\xa9\xd9\xc0\x23\xc2\x59\xf5\xd8\xbb\xb9\x86\xfb\x70\xd5\x02\x6f\xf3\x4d\x10\x3b\xde\x56\x57\x4d\x18\xf4\x7e\x1a\xc4\xc1\x15\x88\xbc\x15\x35\xea\x58\xa4\x3e\x59\x14\x72\x7d\xe8\xa8\xe4\x9c\x4d\xdd\x14\xa7\xab\xa7\x75\xad\x30\xbe\xf9\xf5\xbb\x8c\x4e\xcb\xd0\xfe\x17\x10\x07\x57\x60\x8d\xe6\xfb\x1b\xcd\xd8\x1e\x6d\xfd\xd7\x9d\x87\x3c\x68\x57\xc3\x6b\x1d\xbe\xde\x6e\x64\x90\x7a\xc6\x91\xc2\x85\xdf\x32\xca\x74\x1f\x31\xe7\x06\x71\xd0\xbd\x0f\x80\xfc\x05\x34\xbe\x9e\xe4\xc0\x85\x89\xb4\x0f\xc6\xcc\x5a\x78\x94\x69\xb6\xdd\xee\x83\xb7\x17\xb3\x0d\x7d\xdc\x54\x03\xf8\xf6\xaa\xc9\xf3\x42\x3a\x3e\x0a\x13\x43\xef\xa7\x01\x1c\xdc\x81\x6f\xcd\x7b\x12\x0b\xdb\x1d\x85\x4e\x95\xf5\x26\xe7\xa9\xca\xad\x7c\xf5\x06\x4d\xa3\x59\x82\x1a\x28\x9e\x6b\xe4\x1f\xf6\x5c\x32\x82\xee\x14\x01\x70\x70\x07\x22\x2b\xc6\xb7\x5f\x6e\xc6\x05\x9a\x97\x0e\xd6\x86\xda\xb5\x8a\x3f\x6b\x7a\x3f\xca\x5d\xa1\xef\xed\x40\x6b\xf8\xe6\xa6\x3f\xb3\x3c\xf4\x6f\x05\xe0\xe0\x0e\x04\x3d\x20\xd5\x56\xe2\xf9\x9d\xe4\xe4\x1d\xbf\x25\x3a\x76\xe5\x4d\x63\xfb\x53\x0d\x4f\x8f\x56\xdf\x15\xe6\x27\xec\xac\x9f\x64\xea\xa0\x73\x4d\x00\x0e\xee\xc0\xc3\x0d\x26\xfd\x04\x89\xf9\x6c\x1d\xbe\xef\x1c\x1f\xd5\x22\xf0\x3f\x93\x33\xe9\xb8\x39\xd5\x2f\x93\x2d\x92\x53\x2e\x4b\xb0\xe5\x21\x1c\x00\x71\xd0\xbd\x0f\x80\xfc\x05\x34\xd9\x39\xc9\x01\x4e\xd3\xb9\x68\xaa\xc1\xb0\x4b\x02\xad\xb1\x1f\x5b\x14\x89\x75\xa8\xc7\x5b\x7c\xfd\xea\x02\xd4\x99\x55\xdc\xeb\x34\xf3\xe9\xee\x40\x6b\x4e\x00\x87\xb4\x19\x56\x71\xeb\xee\x77\xa7\xe2\x80\xfc\x75\xa7\x38\x7a\xe3\xb3\xbf\x97\x39\x2e\xbe\x09\x3b\x46\xfb\x6d\x1c\xad\x96\x93\x99\x5c\x5a\x0f\x6d\x86\x05\x70\x70\x07\x06\xab\x3c\x3f\x76\x62\xe0\x07\xbc\xe3\x55\x4c\x22\xcd\x95\x69\x0c\xfd\x78\xb9\x7d\x2e\xa4\x5b\x53\x9a\x67\x15\xef\x97\x8a\xe2\x2a\xa2\x2e\x88\x83\x3b\xd0\xfc\x8e\x70\x63\xa4\xb0\xf3\xe5\xbe\xc9\x0e\xfe\x1d\x6f\xb2\x88\x40\x2b\xe7\x35\xbe\x23\xa9\xbd\xba\xfa\x61\xf7\x65\xe7\x1e\x13\x44\x5d\x10\x07\x77\x80\x37\xe5\x7c\xdf\x1e\x2b\xfa\x51\x59\xa5\xfd\x46\x62\x36\x25\xdf\xc2\x93\xf2\x8f\x8a\xe5\x8e\x04\xbb\xb9\xc4\xbd\x17\x52\x0a\x6a\x10\x0e\x80\x38\xa8\x1f\x00\xe4\x2f\xa0\x99\xe7\x49\x0e\xfc\xd4\x7a\x9d\x14\x5c\x13\x82\x35\xed\xde\xbe\x9c\x66\x25\xc0\xf5\xee\xf6\x78\x77\x4d\xcd\x82\x7f\x2d\x03\xe6\x6f\x5d\xa1\xb2\x6e\xe8\x5e\x6b\x00\x07\x77\x60\xee\x61\x54\xb6\x79\xb5\xd2\xc3\xf0\x03\x1c\x9d\xaa\xd2\x88\xb3\x5c\x81\x5d\x3e\xbf\x4a\xc2\x52\xdb\x56\x97\xdc\x30\x43\x65\x33\xa0\xfd\x24\x00\x0e\xee\xc0\x21\xfd\x4b\x8a\x49\xe9\x0d\xe1\xbb\x14\xe7\x8a\x2b\xe4\xb9\xe4\x7f\x2b\xba\x46\xcb\x8a\x2b\x28\xed\xf3\xf4\x19\x2b\xb1\xa7\x50\x22\xea\x82\x38\xb8\x03\x35\xcf\xa4\xd9\xee\x1d\x6d\x34\xc8\x61\x5f\x8d\xc5\x90\x4e\x52\x1b\x72\x2b\x6d\x25\x94\x89\x7e\x69\x73\x8d\xcf\xaf\x96\x5b\x99\x09\x51\x17\xc4\xc1\x1d\xf0\x11\x8d\x2d\x6f\x52\xf8\x20\xb1\x46\x3a\xfd\x6d\x3b\xbb\x92\xeb\x56\x93\xa7\x36\x47\xdc\xa5\x94\xf0\x82\x33\xb3\xf2\x8d\xa6\x4c\xd0\x3d\x50\x00\x0e\xea\x07\x00\xf9\x0b\x68\xed\x7e\x72\xfe\x72\xdc\x1b\xe6\xa5\x7c\xa0\xb2\x26\xab\xb4\x4c\x7a\x95\x97\xad\x1b\xa7\x9f\x31\x3f\xed\x8b\x40\x9a\xb2\xda\xcf\x8c\xc4\x7b\xef\x70\x11\x59\x06\x88\x43\xce\x5f\x84\x6e\xce\x7c\x6c\x2c\xab\x9e\x59\x8a\x3a\xcf\x76\x2e\xeb\xe2\xd7\xab\xf8\x04\xbf\x97\x22\x97\x4b\x09\x8a\x2e\xd0\x35\x08\x45\xb1\x21\x2a\x83\x38\xe4\xfc\x45\xd3\x72\xcc\xd7\x73\xe6\x8b\xd0\xca\x7a\xe5\xba\x7e\x4f\x11\xcd\xbc\x55\xd9\xb8\x9a\x64\x48\x50\xec\x33\x99\xf4\xe2\x5f\x33\x36\x88\xca\x20\xce\x4f\x16\x05\xe5\x9f\x99\x59\x43\xe7\xdc\xfb\xc0\xe3\x97\xc6\xea\xd6\xdb\xbd\xd3\x43\x32\x18\xbd\x9f\xb8\x87\xbd\x55\x23\x73\x03\xb4\x2a\x45\xb4\x57\xd2\xda\xa1\xfc\x05\xf4\x21\xc0\x3f\xf3\x97\xce\xda\xcd\x3c\xec\xb4\xb3\xa6\x0d\xbf\x8d\xcf\x31\x3c\xf9\xd1\x3a\xf7\xce\x32\x50\x7b\x6d\xf4\x29\x8b\x71\x39\xc5\x60\x98\xc1\x9f\xa7\x31\x9e\xc5\x52\x3a\x58\xfb\x71\xe3\xa1\xaa\xf3\x85\x7c\xdd\x22\xbf\x35\x52\xee\x9b\xf5\x4e\xe0\x07\x83\x02\x43\xde\x9d\x73\xb7\x2e\x25\xff\xb7\xe5\x2f\xa0\xa6\xfd\x79\xff\x0b\x3c\x7f\x09\x6b\x53\xf1\x12\x7b\x50\x4b\x2e\x7b\xcd\xe6\x6b\x77\xdc\x88\x69\x93\x6c\xa0\x11\xa7\xce\x23\xaa\xcb\x37\x8e\x45\xe8\x87\x9f\xbd\x3e\x8d\xfc\x05\x45\x15\xbe\x46\x57\x77\x23\xff\x8c\xf5\xe9\xfa\xaf\x52\x92\x14\x6f\xed\xac\x5d\xdb\x26\xf7\x9e\xd0\x4b\x34\x2c\x77\x83\x5d\x9a\xb5\xfb\xd5\xd1\x17\x4f\x65\x6b\x06\x72\xfe\xc2\x94\xb4\x7e\xad\xd3\xaf\xad\x5b\xb5\xd4\x38\xfb\x87\xd3\x52\xd8\x50\x9c\x9f\x13\x83\x57\xf5\x8d\x47\x9f\xb8\xd3\xb5\xc6\x98\xbd\x4f\x65\x23\xca\x2d\xa4\x3f\x8b\xe9\xe0\x7f\xbf\x2b\x87\xe7\xd2\xde\x19\xb4\x24\xfc\xcf\x7d\xda\xeb\x3a\xe1\x07\x0c\xcc\x9a\x8b\x66\x5c\xd4\x96\x4a\xa9\x21\xa7\x72\xfe\xc8\x1b\x39\x7f\xc1\xde\x7d\xcd\x60\x85\xb3\xdf\x8f\x41\x72\xf6\x45\x92\x5d\xc7\x6f\x7b\xaf\xd6\x3e\x57\x2b\x01\x94\x8d\x9f\x72\xb6\xd6\x4e\x66\x3e\xa7\xd2\x5a\x37\xa4\x3f\xdb\xf1\xe2\xb1\xc6\x42\xb2\x7f\x20\xd3\xb0\x1c\x39\xe6\xf6\x0a\x17\xee\xe5\xaa\x4b\xba\xa3\x74\x69\x84\xe1\x6b\xfd\x72\xf3\x26\x4c\xa7\x96\xbf\x80\xd4\x3d\x69\xb8\x35\x5e\x65\xb0\xe6\xf5\x76\x33\xc6\x70\xfd\x55\x32\x1f\x1b\xd7\x1b\x1a\x96\x25\x56\xe5\x93\xcb\x13\x8b\xc2\xb5\x5d\x77\xf7\x07\x74\x8c\x1e\xc4\xc1\x87\xdb\x02\x47\x8c\xcf\xe6\x1b\x54\xb8\xcd\x21\x21\x91\x57\x06\xb2\xde\x09\xb0\xe4\x63\xbe\xae\x22\x72\x1a\x1b\x61\x0e\x94\x7a\xc7\xf1\x01\x51\x17\xc4\xc1\x87\x5b\xe9\x63\x69\xb7\x28\xa1\x1d\x8b\x95\xf9\x8a\xc5\xf5\x7e\xf7\xce\xed\x57\xa4\x51\x41\x56\xe8\xac\x18\x86\x45\x94\x72\xd1\x6d\xef\xa0\xa3\xd9\x00\x0e\x3e\xdc\xfe\xae\xe6\xbc\xaf\xd4\xc5\xb1\x54\xc7\xd5\x1b\xf9\xa4\xc4\x93\x85\x58\x2b\xf4\xa0\x2a\xdd\xd3\xe9\x82\x11\x03\xde\xda\x38\xd1\x2b\x68\x8b\x34\x80\xf3\x93\x46\xc1\xf9\xc7\xf6\x58\x1d\xa2\x47\x7a\x4a\x0d\xf5\x18\xfa\x83\x55\x24\x8d\xe3\xd7\xe9\x8f\x6c\x53\x66\x87\x38\x83\x6a\x0f\x9c\x85\xce\xd0\x04\x0f\x22\xf2\x17\x10\x07\xdd\xff\xf2\xd7\xfc\x05\xd4\x8d\x9c\x64\x40\xc1\xd7\x6a\x25\x5b\x13\x9f\x0f\x53\x41\xe1\x37\x94\x7f\x68\xd4\xa3\x7a\x4e\xdb\xa6\x37\x4a\x53\x56\x06\x4f\x58\x99\xf0\xb8\x42\x9b\x1f\x40\x1c\xdc\x80\x08\xaf\x38\x5f\x02\xde\x62\xcc\x45\x62\x1b\xaa\x45\x5a\x2a\x6d\x97\x70\x56\xce\x12\x1f\x4c\x12\x07\xfb\xf8\x32\xbd\xbb\x9f\x63\x10\x75\x41\x1c\x52\x02\xc7\x19\x9e\x84\x2e\xfb\x39\x21\x5a\x43\xd1\xcb\xe3\xed\x19\xd2\x90\xd1\x98\x9c\x2b\x58\x6f\xdd\x2e\x57\xc7\x5d\xca\xa8\x97\x86\x3e\x50\x02\xe2\xe0\x06\xa0\xae\x1b\x3f\x8e\xd3\xf5\xe3\xc3\xaa\x1f\x61\xef\xf3\x9a\x7a\x78\x91\x58\x3b\x46\xb9\xd0\x2a\x18\x95\xc4\xae\xce\xd1\xbe\xc6\x1a\x51\x17\xc4\xc1\x0d\xf8\xb8\x54\x16\x2f\x39\x99\xfb\x6d\x8e\x5a\x6b\x20\xb1\x24\xf3\x3a\x1e\xcd\x9e\x44\xfd\x40\x6d\x57\xae\x00\x33\xb6\x71\xac\xdc\x65\x44\xfe\x02\xe2\xa0\xfb\x5f\x54\xff\x3a\xe7\x06\x75\xe9\x27\x29\xf0\x32\x30\x59\xbe\x74\xee\x4b\xfd\xc3\xd1\x50\xfe\x79\x3b\x6b\x36\x63\xcb\x06\xb7\xa5\x41\x8b\xad\xf4\x3a\xf2\xd1\xf1\x28\xa3\x32\x44\xd3\x41\x1c\x5c\x81\x41\x0e\xe6\xf6\xcb\xb1\x9d\x46\xc4\xd4\x4b\xb6\x82\xf3\x8b\xd1\x29\x19\xc9\xe9\x5b\x4f\x13\x1f\xac\xa5\x91\xea\x4f\xdc\x53\x85\xee\x30\x04\x71\x70\x05\xf4\x02\x26\xed\x42\x7e\xbc\x66\xda\x64\xae\x22\x43\x4d\x0b\x39\xf3\xe0\xc2\xd5\x7b\x2d\x76\xac\x6f\x37\xc4\x2e\x53\x7c\xdc\xbc\x6b\x8b\xa8\x0b\xe2\xe0\x0a\x7c\x2e\x2d\x71\x7e\x8d\x33\x57\xaa\xe9\x26\x31\x67\x96\xe2\xb8\x87\xf6\xe1\x09\x76\x3c\x83\x98\x62\xdb\xaa\xde\x64\xf0\xad\x60\x3e\x44\x5d\x10\x07\x57\x40\xc8\xba\x41\xa1\x5d\x15\x87\xad\x97\xad\x5a\xbe\x2c\xab\xe5\x6b\xda\x39\xb5\xc6\x2d\xec\x5b\x0d\x72\x62\xd9\x56\xf7\x52\xfb\x5d\x10\x73\x6e\x10\x07\xdd\xfb\x00\xc8\x5f\x40\xe3\xeb\x49\x0e\xc4\xe9\xc8\x24\x9c\x0f\xd0\xba\xfe\xba\x9c\xf4\x4b\xca\x44\x79\x81\x21\x3e\x86\xac\x8a\x64\xf0\x52\x52\xcf\x98\x8a\xf5\x70\x29\x74\x97\x29\x88\x83\x3b\x90\x1e\xd5\xe2\x28\x74\x5e\x95\x92\xf8\x9a\xe6\x59\x6c\x83\xbc\x9e\x0f\xf4\x4c\xf9\x64\x58\xf7\x6e\x25\x5e\x71\xb7\x6a\xde\xca\x27\x47\xd4\x05\x71\x70\x07\x9a\x6f\x4f\xcf\x3f\xab\x3f\x4b\x1b\xf0\x82\x4c\xea\xc7\x03\x52\x8a\xdf\xdc\xe7\xe9\xc3\xcb\x51\x50\xeb\x12\xda\xfa\xee\xa9\x7e\x9b\x80\xd6\xc8\x00\x0e\xee\xc0\xac\x93\xdc\x99\x8a\xb2\xe0\x9c\xe2\xe4\x79\xb3\x0d\xdd\xab\xc7\x32\x7a\x8f\x27\x86\x31\xab\xa5\xa7\x30\xd1\x79\x0e\x9d\xdf\x40\xef\xe9\x41\x1c\xdc\x81\x37\x0b\xf2\x1b\x1f\x34\x8b\x17\x0c\x72\xc7\xc6\xed\xb5\xb3\x4d\x05\x87\xd2\x69\x9f\xf3\x35\x39\xc9\xee\xad\x4c\x28\xe9\x94\xde\x44\x38\x00\xe2\xa0\x7b\x1f\x6e\xfd\xdd\x01\xd0\x64\xe7\x24\x07\x5c\xa8\xf4\x6b\x4c\x7b\x6e\x8e\xac\xd6\xc8\x33\x47\x47\x98\xaa\x9f\x93\xd3\x11\x53\x7b\x65\x2e\x7d\xe5\x48\x4d\x0d\xf7\x31\x47\x20\xa2\xed\x20\x0e\xee\x80\x16\x26\x17\xed\xad\x47\xc7\x6d\xa1\x84\xce\x31\x39\x4e\x58\x41\xca\xe4\x35\x6f\xac\x0a\x6d\x2b\x05\x22\xe6\xd4\x51\x48\x94\x3e\x23\xea\x82\x38\xb8\x03\x69\x31\x87\x8d\x0a\x21\x99\xcb\x32\xe1\xbe\x7d\x2a\xdd\x0c\x67\x2e\xe2\x6d\x7f\xd4\x55\x98\x41\xa9\xc5\x57\xf6\x96\xfd\xf2\xec\x21\xa2\x2e\x88\x83\x3b\xb0\xf4\x7e\x7b\xa7\x63\x77\x5b\xfc\xfa\x97\x72\x9b\x6f\xdd\x21\x12\x05\x1b\x62\x51\x0c\x75\xe7\xc7\x5a\xd3\x2d\x3f\xa1\xeb\x90\x42\x77\x95\x80\x38\xb8\x03\xf2\x85\xa8\x21\xb5\xc5\x83\x0e\xad\x16\xd4\x65\x91\x05\xa6\x9a\x41\x2d\x57\x64\x92\x2c\x56\xf9\x9e\x93\x0a\x12\x4d\xaf\xde\x61\x86\xee\xfe\x00\x70\x50\x3f\x00\xc8\x5f\x40\x33\xcf\x93\x1c\x68\xec\x3e\xca\xe6\x30\xf6\xc3\x96\xaf\x60\x8c\x95\x68\x32\x8e\x11\x7c\xc2\xb7\x5b\xc2\x3d\x40\x93\x30\x60\x2e\x29\x49\x28\x0a\xb5\x1d\xc4\xc1\x1d\xe8\xe2\xd4\x56\xaa\x29\x5a\x29\xcd\x53\xa9\xd5\x74\x88\x40\x6d\x1f\xe8\x98\x6e\x63\xcf\x28\x1c\x0d\x77\xdf\x50\xee\x1c\xa7\xb5\x43\xd4\x05\x71\x48\x7b\x21\xb7\x17\xa4\x2e\x33\xb0\xcb\xd6\xff\xf6\x65\x7c\x8f\x8a\x4a\x65\xa1\xff\x53\x8a\xf3\xba\x59\x09\x35\x15\x63\x5e\x43\x1e\x0d\x74\x5e\x0a\xc4\xc1\x1d\x20\x48\x55\x16\xb2\x11\x1e\xb7\x10\x97\x3a\xca\x70\x6d\x48\xbf\x6c\x7e\x98\x12\x8d\x69\x98\xf2\xa9\xef\xfe\x03\x2f\xfe\x39\x1f\x63\xe8\x5e\x5f\x00\x07\x77\xe0\x78\x4e\x2b\x35\x2d\xea\x7d\x4a\xe1\xfd\x9a\x46\xd3\xf6\xa4\xaa\x4a\xeb\x87\x9e\xce\xd6\x3f\x9d\x16\xae\xd7\x7e\xeb\xf2\xf5\x13\x41\x38\x00\xe2\xa0\x7e\xc0\xed\xef\xf9\x0b\x68\xed\x7e\x72\xfe\x22\x3f\xd4\x4e\x71\x31\x33\xe6\xcc\xa5\xb4\xcf\xbd\x0c\xee\x17\xec\xb2\x1f\x65\x58\x18\x3e\x32\xd4\xd4\x13\x30\xb0\x4b\xe1\xe9\xaf\x47\x64\x19\x20\x0e\x39\x7f\x49\x6c\x16\x78\xfa\x48\x4a\x88\xa5\x5d\x9f\x6f\xc7\x7b\xe0\xa6\xfa\x41\xb1\xc4\xa6\x6e\xa2\x87\x63\x79\xa1\xb4\xec\x26\xaf\x4d\x33\xa2\x32\x88\x43\xce\x5f\x22\xce\x8c\xe6\x47\x1d\x9c\xdd\x73\x4c\xe7\xe3\x18\x52\x0c\x50\xfa\x3a\xca\x43\x34\x4b\x42\xb3\xe0\xaa\x34\xbd\x2b\x53\x32\x3a\x89\xa8\x0c\xe2\xfc\x64\x51\x50\x60\xdf\x43\x13\x8e\xcb\xf6\x16\x7d\x8e\x61\xbe\x2b\x4d\x94\xdd\xa7\x7a\x30\x36\x9c\xb4\xdc\x41\x7c\x6f\xd4\xde\xfc\xf9\xab\xef\xdb\xbe\xf9\x50\xfe\x62\x6e\x4a\xa5\xd4\xb9\xf9\x56\xe4\xb9\x8a\x24\x8f\xdf\xf5\x62\x41\x7d\x53\xd6\x21\xbe\xcf\x8f\x0f\xbf\xc8\xc9\x7f\xd8\x78\x8d\xfe\x8f\xfd\x2f\x79\xc7\x52\xa9\xc7\x5a\xf5\xe4\x11\x9a\x2d\x21\x55\x5a\x0f\x4d\x69\x78\x9b\x6c\xa6\x7e\xec\x95\x6f\x17\xb8\xe2\xf5\x0c\xc8\x07\xff\xb9\x82\xd4\xb5\x88\xbf\x27\x85\xe3\x24\x22\x16\xb9\x54\x19\x3e\xfa\x48\xdf\x62\x0e\x7b\xba\x33\xde\x39\xba\x6a\x8f\xea\xbe\x50\xe1\xbb\xff\xb6\xfc\x05\xd4\xb4\x3f\xef\x7f\x81\xe7\x2f\xf9\x3b\xe1\xfd\x62\x52\xd3\x6e\xe5\x14\x69\xf8\xd4\xf3\x1f\x7c\xd7\x49\x79\xb6\xd9\x2a\x9f\xb8\xa7\xc6\xad\x7c\xa9\xc6\x40\x3f\x8d\x4d\x12\x32\x92\x48\xf9\x0b\x75\x6a\x7b\x39\x8a\x00\x33\x57\xcc\x61\xf7\xa8\x2b\xb6\xcd\xd8\xf3\x12\xbb\x45\x0e\x96\x96\xdf\x34\x36\x39\x06\xf6\x65\x1d\xcc\xa7\xb2\x35\x03\x39\x7f\xa1\x33\x1b\xe2\xd4\xb8\x14\x44\x24\x43\x5d\x1d\x91\x62\x5a\x21\x1d\x29\xbf\x68\x3f\xec\x6b\xa2\x46\xa7\x5a\x40\xbd\xb5\x14\xd2\x71\x2a\x1b\x51\x90\xf3\x97\x98\x70\xee\x78\xd4\x27\x22\x53\x3e\x8c\xbe\x4b\x67\xd4\x94\x53\x6e\xdb\x45\xec\xbb\x34\x5d\x78\x36\xad\xdc\x23\x6e\xc5\x95\xf6\xf8\x54\x5a\x8b\x9c\xbf\xf0\xe1\xc7\x2e\xf3\x61\x7f\x93\x4b\x3d\x5e\x7b\x4d\xe7\x88\xcf\xc3\x70\x7f\x99\x76\x68\xbe\xf0\x96\x9c\xd2\x20\x6e\x1e\x4a\x1d\xcd\xa9\xb4\x16\x39\x7f\x79\x5e\xdd\xa9\x55\x7c\xbe\xb5\xf0\xcb\xc2\x58\x7a\xc9\x39\xe1\x71\xa3\xf1\xdf\x6f\xd8\x5b\x1e\xde\x0f\x18\xc1\x73\xfb\x64\xa9\xfc\xe4\xd4\xf2\x17\x90\xba\x27\x6e\x37\xc5\xe0\xa6\xd1\xff\x50\xf4\xfd\x05\xb3\x7c\x93\xd1\x54\x1b\x91\xd4\x39\x3a\xf6\x62\xf5\xa2\xb2\xd9\x84\xd7\x2f\x5c\x39\x49\x1c\xa1\xed\xa6\x00\x0e\x3e\xdc\x96\xaf\x5a\x65\x35\x33\x0b\x04\x37\x67\xfe\xae\xdd\x8a\x0d\xda\x29\xdb\x7c\x5b\x1a\x40\x22\x8e\xcb\x5a\x1e\xb7\xce\x95\x5e\x02\x9d\x6a\x01\x71\x48\x5b\x8e\x8b\xf4\x75\x5f\xe5\x6a\xcb\xbc\xd6\xb7\x6a\xdc\x78\x77\x51\xa2\x32\xd6\xd7\xf9\x85\x29\xcb\xe6\x8d\x18\x2f\xc1\xac\x65\xb6\x78\x68\xcb\x31\x80\x83\x0f\xb7\xb4\x34\xe9\x9a\xdb\x3f\x04\x9f\x6c\x09\x47\xce\xcc\x86\xd7\x37\xe1\x12\x5d\xc4\x18\x93\xad\x1b\x75\x9e\xef\xee\x40\x77\x92\xc2\x47\xd4\x05\x71\x7e\xd2\x28\xde\x7f\xd6\xe5\xc0\xc3\xd6\xfa\xe6\x24\xf4\xed\xf7\xdb\xee\x73\x3b\xbc\x87\x9d\x46\xdf\x09\x3b\x54\x34\xfc\x0a\x78\xa5\x49\x47\xfc\xfc\xfb\xb3\x11\xf9\x0b\x88\x83\xee\x7f\xf9\x6b\xfe\x02\xea\x46\x4e\xfc\xe8\x68\x50\xea\x1a\x23\xb9\x6c\x18\xd7\xbb\x4a\x7d\xb7\x07\x06\x9f\xa3\xed\xd8\xfa\x74\x8e\x08\x5b\xb6\x3e\x8a\x2b\xbf\xeb\x7f\x3c\x8a\x68\x39\x88\x83\x1b\xd0\x66\xc5\x29\xe4\x10\xf8\x6d\x53\x3b\x3d\x24\x9b\x8a\xb7\x57\xce\x11\xfb\x91\x78\x5d\xe2\x18\xba\xfd\x54\x49\xab\x6e\x35\x79\x10\xa2\x2e\x88\x43\x7a\xf1\x2d\x1e\x48\x4e\x60\xd1\x1d\xd6\x45\x7f\xaf\x7a\x9c\x69\xe9\x38\xbf\xe1\x73\xb3\xe2\x1c\x1d\xf9\x76\xe5\xe4\xd3\xbb\x13\xda\x50\x62\x08\xe2\xe0\x06\x78\xeb\xf5\xaa\x24\xbe\xd5\xbe\x55\xe3\xf6\x2d\xe7\xa2\x44\xea\xef\x4f\x46\x19\x81\x15\xe6\x0e\x0f\x8f\x95\x16\xda\x79\xaa\x33\x7b\xa1\x7d\x40\x00\x0e\x6e\xc0\x3c\x15\x53\xca\x7a\x31\xdf\xc4\xa2\xb7\x53\x7f\x9e\xcf\x8e\xa2\x4a\xf2\x92\x9e\x02\xef\xcf\xce\x09\x1f\x72\x4a\x49\xbc\x6c\x41\x44\xfe\x02\xe2\xa0\xfb\x5f\xfe\x9e\xbf\x80\xba\xf4\x13\xef\xdf\x45\x2d\xff\x9a\x4c\xc2\xa8\xa4\xa5\x6a\x85\xe2\x65\x8e\x52\xbd\x51\xfc\xf6\xd5\xe2\x41\xcc\xb3\x00\xe6\x07\xc9\x36\x3b\x3c\x2d\xd0\xfd\xbb\x00\x0e\xae\x80\xef\x88\x68\xce\x3d\xdc\x7a\xb1\x85\x4e\xf9\xab\x2b\x17\x97\xf6\x68\x0a\xde\x65\x1c\x05\xf7\x66\xd8\xa1\x8e\x9b\xe2\x06\x31\x40\xef\xa7\x41\x1c\x5c\x01\x79\xdb\xec\x07\xa2\xa6\x9e\x3e\x99\xdd\x1c\xea\xef\x2f\xee\x71\x0c\x4d\x53\x34\x3c\xa9\xe2\x26\x5c\xcc\x24\x8b\x0b\x63\x0d\x7d\x80\xa8\x0b\xe2\xe0\x0a\xb4\x9f\xc9\x29\xdd\xc1\xf0\x6a\x95\x71\xf6\x43\x2f\x3e\xc2\x23\xbf\xae\xf4\x6d\x95\x63\x53\x2a\x8f\x70\xeb\x6a\xf8\xa5\xde\x4c\xe8\x5b\x1a\x20\x0e\xae\x40\x67\x44\xb6\x87\xab\xff\x2d\xc7\x4e\x9f\x0f\x97\x8f\x86\xee\xe0\x96\x63\xda\xda\xa6\x55\xa3\x50\x72\x6f\x0a\xcb\x78\xb2\x19\x26\x21\xe6\xdc\x20\x0e\xba\xf7\x01\x90\xbf\x80\xc6\xd7\x93\x1c\x78\x6b\x1d\xc8\xdb\x8e\x3d\xfe\xe6\xab\xf7\x84\x50\xf6\x4b\x03\xab\x8f\xc5\x04\x52\xba\x53\x4a\x24\x81\xb6\xf7\xf7\x16\x78\xc6\x7e\x22\xda\x0e\xe2\xe0\x0e\x74\x32\x91\x94\xf1\x3c\x73\x3d\x63\x9d\xb0\x33\xc3\x73\x0d\xe3\xf9\xb9\xe9\x32\x6d\xf6\xee\xc7\xb1\xed\xf1\xe3\x96\x38\xef\x9d\xa5\xa0\x0b\xbb\x00\x1c\xdc\x01\x21\x51\xc3\xc7\x9f\x8d\xd1\x77\xa7\x26\x4d\x37\x1d\x83\x27\xb0\x0a\xd8\xed\x46\x8e\xcb\x0f\xd0\x99\x3f\xe2\xb7\xa9\x79\x46\xc4\x21\xea\x82\x38\xb8\x03\xc9\xc2\x6b\x2e\xeb\xaa\x06\x85\x62\x2f\xd4\x74\x94\xde\xed\x1c\xe6\x46\x61\xe0\xe7\x99\x50\x6b\x57\x61\xf5\xfb\xa1\x78\x46\x42\xf7\x79\x82\x38\xb8\x03\x45\x75\x0d\xc7\x15\x7a\x5e\x52\xd1\xe1\x3e\x1e\xde\x8d\x7b\x56\x55\xd9\xa3\x7d\x87\xbb\xe8\x3f\xb0\x9f\xb9\x93\xba\xaf\xed\xef\x22\x1c\x00\x71\xd0\xbd\x0f\x80\xfc\x05\x34\xd9\x39\xc9\x81\x67\x1b\xfb\x65\x92\x1a\x76\xf7\xcb\x1a\xf9\x08\xbd\x8f\xfa\x57\x6f\x3f\x7a\x3d\x7d\xed\xd3\xb4\x55\xc4\x84\x9b\x71\x1e\xc7\xff\x7e\xcf\x19\xc4\xc1\x1d\x48\x28\xd7\x29\x7e\xab\xa0\x23\x31\xfe\x8d\x60\x8f\xa2\x85\xf2\xad\x54\x41\x8a\x25\xa7\xd1\x8c\x40\x75\x64\xb0\x5c\x84\x08\x47\x36\xa2\x2e\x88\x83\x3b\x70\x83\x65\xeb\x5c\xd4\xec\x4a\x18\xaf\xbc\x68\x77\x5c\xef\x11\x33\x49\xad\x51\x81\x70\xe9\x98\xf6\x7b\xd1\x9b\x7a\xcf\x8c\x54\xb9\xa0\xfb\x82\x01\x1c\xdc\x01\x25\x13\x1d\x53\xf5\x01\x3b\x6b\xd3\xa5\xb5\xa8\x95\xf7\x79\xc7\x06\x1a\x87\x6c\x3d\x65\xc2\xf3\xea\x5d\x31\x6b\x1b\xf4\x19\xd0\x15\x63\x20\x0e\xee\x40\x98\x66\x3e\x67\x67\x81\xb8\x90\xb7\xc4\x35\xbf\x29\xbc\xd7\x7c\xcf\x52\x87\xd7\x43\xe8\xd4\x71\x59\x7b\xf2\x52\xc9\xa3\x25\xf7\x11\x0e\x80\x38\xa8\x1f\x00\xe4\x2f\xa0\x99\xe7\x49\x0e\x0c\xe9\xcb\x7a\x7a\x6d\x4e\xea\x3e\x44\x8d\x68\xfd\xdd\x16\x3d\x41\xb3\x36\xf9\x83\x57\x0b\x23\x7a\xe2\xf2\xeb\x5b\x9e\x56\x22\xd0\x6f\x0a\xe2\x90\x8e\x23\x53\x6b\xd0\x1d\xae\x27\x46\x28\xe6\x06\x9a\xe8\x58\x32\x17\x39\xe5\x75\x39\x90\x62\x95\xa6\x85\xa9\xa6\xc8\x7b\xfc\x62\x5f\x81\x8e\x23\x03\x38\xb8\x03\xd1\xa4\xf1\x69\x98\xec\x86\xce\x12\xf2\x6b\xf2\x2b\x86\xb9\xd5\xbb\xda\x4e\x7d\xdb\x3b\xb2\x28\x43\x89\x0a\xde\x15\x2a\x83\xd0\x35\xff\x20\x0e\xee\xc0\xd0\x05\x99\x03\xb9\x9c\xf3\x78\x39\x22\x67\x66\xbe\xee\x91\xb1\x26\xc5\xad\x75\x76\xff\xa2\x4d\xfc\x44\x39\x69\xad\xb4\xfa\x00\x03\xfa\x1d\x00\x1c\x52\x3f\xe0\x3f\x43\x55\x8a\x55\xaa\x83\x63\x26\x76\xb8\x68\x71\x65\x94\x38\xc8\x77\x18\x53\xc9\xbe\xba\xe3\xa8\xc9\x81\x21\x63\x5c\x01\xea\x07\x00\x1c\xd4\x0f\x00\xf2\x17\xd0\xda\xfd\xe4\xfc\xe5\x6b\xd1\xc7\x8b\x68\x3d\x6e\xe2\x6c\xbe\x28\xf1\xd3\xd3\x69\x8c\x7e\x65\xa5\x62\x94\x6d\x5d\xb7\x28\x88\xac\xdf\xa8\x60\x32\xaf\x21\xb2\x0c\x10\x87\x9c\xbf\x68\x07\x09\x7e\x2d\xc6\x68\x8f\x8d\xbe\xfd\xdb\xe3\xc8\xaf\xc0\x42\xef\xa6\xfc\x80\xb5\x2a\x71\x44\x7e\x4b\xf0\xd7\xdb\x28\xbf\xd9\x11\x95\x41\x1c\x72\xfe\xe2\xb0\xab\xe4\xba\x46\x2f\x88\x4a\x1a\x9f\xdd\xb5\x5c\xf7\xe9\xea\xb5\xd4\xa2\x05\x0b\x7e\xfa\xcb\x3e\xdb\x8a\xdd\x6d\x14\x09\xe8\x88\xca\x20\xce\x4f\x16\x05\xe5\x9f\xee\xce\xe0\x76\x5c\x91\xff\xec\x37\xb7\x73\x84\x4b\x70\x47\xec\x2e\xb9\x5b\xe5\xd8\x54\xdb\x27\x5b\xeb\xbe\x8e\x2b\x9c\xf5\x1c\x8f\x4a\xa1\xfc\x65\x7c\x7e\x9e\x9a\xb1\xa6\xcc\x03\x63\xf0\x5a\x33\x2f\xb6\x1e\xbd\xc7\xf1\x05\x94\xa4\xd9\x28\xac\x2d\x6f\x96\x3d\xf9\xac\x9a\x7f\xe4\x2f\xd7\xa4\x5f\xe0\x6a\x92\x53\x85\x32\x7c\x9f\x23\xad\x95\xc3\xa8\xfc\x52\x51\xb7\xbf\x5a\x52\x3f\xd0\x73\xa3\xdd\xfe\x8e\x8c\x25\xf1\x1f\x28\x96\x73\x01\xe3\xb1\x58\x67\xfc\x39\xbb\x54\x1f\x05\x5b\xf1\x5a\x9d\xcd\xb0\xde\xe4\x71\x37\x6b\x5b\xee\x51\x21\x07\x1a\x4f\xae\xff\x96\xfc\x65\x17\xf3\x3f\x6b\xda\xff\xe6\x2f\x32\x28\xd2\xf0\xe5\x72\x0a\xee\x6f\x63\x86\xa6\xf9\xeb\x84\x57\x0b\x7a\xbd\xaa\x2e\x85\x0f\x6b\xb5\x66\x12\xdd\x7f\x8a\x92\xeb\x30\x39\x76\x7f\x49\x2a\xe1\x34\x02\x18\x6f\xa4\x00\xe6\xd8\x26\x5b\x66\x96\x82\xfa\x1a\x0e\x3b\xee\x52\xe2\xb9\xea\xa5\xe0\x1c\xc6\x2d\x22\x6f\x15\x16\x51\x1a\x7d\xe7\xa4\xc6\xe0\xb3\xa7\xb2\x37\x43\x08\x29\x1b\xd8\xc7\xcf\x0d\x4c\x27\x64\x8e\xfd\x1c\x5b\x6c\x5a\x79\xeb\xdc\x17\x9a\x90\xaa\xaa\x8b\xcd\x71\xdc\xa6\x11\xe7\xe7\x75\xd2\x17\x29\x4f\x65\x27\x0a\x72\x00\x43\x45\x4a\x69\x1e\x31\x36\x53\xb2\xe6\x5e\xa0\x48\x83\xe9\xe3\x8a\x91\xcc\x3a\xe2\x2a\x2b\xea\x71\x87\xa1\xda\x7d\x45\x3a\xd7\xfe\x54\x5a\x6b\x8f\xf4\x67\xef\x3f\xbe\xc4\xdf\x69\xd1\x8a\x1b\x1b\xb1\xb4\x52\x5c\x46\x4b\x27\xae\xb6\xa6\xf6\xf8\xfc\x8c\x80\x35\xe5\x6e\x2b\xc1\x02\x5a\xd6\xa9\xb4\x16\x39\x80\xe9\xe9\x9c\x23\x6f\x5f\x36\xae\xc6\xee\xd1\x36\x77\xf2\x66\xb7\x6a\xd3\x74\x4f\xc7\x8a\x52\x6c\xd8\x11\x5d\x7a\x3c\x3b\x3e\xff\xeb\xd4\x02\x18\x90\xba\x27\x8d\xb7\x4c\x9c\xf9\x5d\xfd\xea\x93\xd7\x6d\x2f\xb4\x7e\xaa\x3f\x8f\xf7\x90\x88\xf8\x97\x78\x4c\xff\x37\x54\x54\xea\x11\x4d\xaf\xd7\xf4\xd0\x3e\x6e\x10\x87\xf4\xed\x13\xbc\xb3\xb3\xb2\x21\x17\x0c\x89\xaf\x60\xf9\x9f\x17\x9c\x1d\x6f\x7d\x10\x16\x60\x97\x47\x81\x79\x59\xa6\x64\xe8\x38\x66\xf3\x07\xa2\x2e\x88\x83\x8f\xb7\xaf\x9a\xb3\x4a\xbb\xc3\xd9\x31\x22\xed\x65\x31\x97\x83\x8b\x2a\x93\x52\x75\x3e\x9f\x4f\x5f\xdf\x1f\xc7\xfc\x7d\x54\x91\xd5\x0d\x6d\xab\x00\x71\xf0\xe7\x55\x40\xbb\xec\xb1\x50\x92\x8b\x65\x9f\xa0\xd1\x6a\xc6\x5c\x55\x39\xf3\x2b\xcf\x6c\x62\x62\x7a\x6b\x52\x04\x8f\x36\x36\x9f\x07\x7a\xa7\x0e\xe2\xfc\xa4\x71\xfe\x79\x77\x57\xd3\xdc\x70\x99\x5c\xd5\xad\xee\x0b\xf3\x11\x6b\x6b\xaf\x19\xc3\xe2\x7f\x68\xc8\xae\x6b\xd2\xac\x24\xe4\xe9\x4c\x5a\x6d\x35\x20\x96\xdf\x20\x0e\x71\xfd\xc7\xbf\x3a\xac\xbf\x4c\xb9\x40\xfd\xc8\x49\x0a\x0c\x84\x78\xf3\xd8\x1e\x5c\x16\xf4\x29\x9d\x32\x36\x4a\xba\x70\xe8\x52\x81\x7e\x1f\xdf\x75\xd4\x81\x39\xb3\xc8\x3c\x4e\x2a\x13\x52\x00\xc4\xc1\x7f\x52\xdb\xf2\x48\x43\x31\x0a\xcf\xc6\xfa\xc4\xa5\x64\x14\xab\xaa\xba\xd0\x1c\xbb\x29\xc5\x22\xed\x9c\x35\xfb\x9b\x51\xb1\xa6\xe7\xf5\xa1\x2b\x1a\x00\x1c\xd2\x0d\xbc\x85\x04\x6c\xcf\x5f\x37\x2b\x72\xd3\xd6\x4f\xdf\x6f\x31\xaf\xe7\x9f\xb1\xcf\x8a\x53\x17\x58\x69\xa0\xf5\x7f\x10\x7a\x91\x39\x1c\xba\x81\x17\xc0\x21\x5d\x53\xf0\x13\x5f\x64\x60\x2a\xbe\x6f\xe8\xb8\xf5\x4c\x52\x1b\xbd\xa7\x1a\x5e\x44\xfc\xa3\x11\x0d\x73\x4c\x53\xc9\x72\xda\x6f\x0e\xd0\xce\x1a\x10\x07\x57\x20\x83\x7b\x33\x92\x22\xf3\xa5\xb7\x83\xd5\x79\xb3\xa0\xbb\x59\x3b\x77\x17\xef\xd8\x0f\x9f\x61\x59\x78\xa4\x84\x8d\x1f\x8c\xae\x8f\x8f\x50\x00\xc4\x41\x37\xc0\xfc\x3d\x81\x01\xf5\xe9\x27\x29\x40\x2d\x44\xa0\x57\x1d\x36\xc8\x77\x7b\xeb\x49\xca\xa3\xe3\x0d\x66\x37\x3d\x5b\x72\x8b\xa1\xb9\xf0\x5a\x9d\xe5\xfc\xf6\x17\x6f\xa0\xaf\x83\x82\x38\xf8\x4f\x4a\xcb\xad\xfe\x6b\xa6\x62\xd6\x4c\xd5\xcd\xc2\xa1\xbf\xd1\xb1\x73\xe1\x21\xf5\xc3\xb2\x37\xda\x33\x81\x2b\xce\xac\x95\x02\x99\xd0\xce\x1a\x10\x07\x57\x00\xc7\xb6\x62\xb3\xb8\x6b\xf3\xe6\x3d\xe9\xf3\xfc\xb7\xee\x95\xcd\x5d\x36\x5f\xef\x29\x1e\xd3\x2a\x57\xc3\x7b\xa2\x87\x99\xaf\x07\x1d\x9a\x03\x71\xf0\xe7\xc5\x7b\xf6\xec\xf9\x9b\x79\x21\x77\xd1\x79\x0b\xb7\xbe\xbc\xa0\xdf\x55\x11\x9f\xc4\x04\x3b\xfa\x4b\xf0\xee\xa7\x04\xa3\x97\x37\xd9\x20\xea\x82\x38\xb8\x02\x0d\x82\x66\xa1\x26\xab\x89\xbc\xdb\xe6\x1e\x4d\x14\x0b\x4c\xbc\xab\x6d\xe9\xdf\x3a\x9e\x2f\xd5\x58\x96\x6a\xfa\xe1\x90\x61\xe4\x22\x66\xdd\x20\x0e\xba\xf9\x41\xe8\xef\x2b\x2f\xd0\x00\x7b\x92\x03\xf4\x25\x93\xa1\xa1\x0e\x84\x51\xb5\x9f\xe5\xe7\x16\xc9\x3d\x2e\x74\x2b\x92\xbe\x79\xda\xa4\xe9\x9a\x1c\xb9\xac\x25\x56\x19\x03\xed\x56\x02\x71\x48\x6f\xbe\x57\x1e\xb3\x64\x58\xfa\x7b\xf7\x98\xb8\x7f\xf7\x91\x9f\x57\x70\x9d\x6f\x5e\x30\x4f\x63\x0e\x7b\xa5\x1c\xfd\x2c\x47\x59\x81\x19\x7a\xf3\x0d\xe0\xe0\x0e\xcc\xc9\xd4\xb2\xd3\x35\xd0\x77\x6c\xe3\xf0\xe6\xfe\xb6\x89\x29\xcc\x1f\xa9\x13\x13\xf4\x64\x5b\xfe\x78\xc5\xa4\x84\x48\xae\x6f\x03\x3a\xd1\x00\xe0\xe0\xcf\x4b\xfe\xf2\xec\x9c\x02\xa5\x65\x1f\xdb\x25\xf4\xde\x21\x8d\x50\xf7\x49\x1f\x36\x3f\x8e\xb9\xba\xbc\x30\x6a\x32\x35\x73\x8e\xed\x7e\x44\x5d\x10\x07\x77\xc0\xb5\x06\xa3\x82\xf2\x5e\xca\x43\x6d\xff\x75\x96\xbe\xfb\xdc\xbf\x15\xa9\xdc\x58\xa3\x62\x3a\xa5\x65\xa5\x6c\xe3\xb2\xcb\x3d\xf8\x10\x0e\x80\x38\xe8\xe6\x07\x40\x02\x03\x9a\xed\x9c\xe4\x40\x0b\x71\x8c\xc7\xeb\x9b\xd4\xae\x06\xc6\x03\xa2\xba\x16\x37\x7d\xda\x45\x1d\x72\x71\x98\xae\xb1\x33\x4e\xac\x51\xba\xd5\xa1\x42\x27\x85\x40\x1c\xfc\x37\x75\xa0\x4a\x68\xbd\x7b\xfe\x20\x87\x24\x6c\xde\x6c\xa7\xa6\x15\x9d\xeb\xe7\xd5\xf6\xa8\x07\xa5\x47\x37\x9e\x56\x0d\xd2\x5e\x99\xf3\x46\xd4\x05\x71\x70\x07\x96\xee\x09\xdc\x7b\x51\xea\x80\x97\x2b\x8d\x4f\xca\x60\x33\xfd\x64\xce\xdd\x2f\x9b\x68\x5f\xdd\x06\x93\x33\xbf\x37\x2b\x6c\x19\x9a\x65\x80\x38\xf8\xf3\xd6\xc8\xed\x19\x32\xdd\x76\xae\xbc\x60\x70\xec\xb6\xaf\x98\x60\xa5\x7d\xb9\x38\xe7\x3d\x43\xff\x0d\x86\x4d\x6b\x9c\x66\x8d\x0a\x61\xe8\xf4\x09\x80\x83\x3b\x90\x53\xd2\x7d\x06\x2b\xa4\xd7\x9d\x31\x40\x84\x6d\xc4\x0a\xcd\x8f\xba\xdc\x3e\x07\xfd\x7d\x56\x81\xfc\x51\x9b\x76\x6a\xfa\x87\x8f\x08\x07\x40\x1c\xd4\x0f\xd8\xff\xdd\x01\xd0\xd4\xf3\x24\x07\x74\x8a\x63\x84\xb0\x6b\x6b\x22\x35\xa6\x26\x5f\x64\x33\x85\xd2\x5d\x0d\xb4\xed\xa9\xa0\x14\xea\xbb\x7f\xde\xae\x27\x23\x0d\x0f\x4a\x62\x41\x1c\xfc\x37\xf5\xca\x70\xb4\xe2\x0a\x38\x17\xcf\x80\x41\x92\xc9\x6b\xe8\x88\x7b\xf3\x5d\x45\xeb\xed\x09\x6a\x4a\x3c\x21\x12\x94\xee\x47\x25\x63\x88\xba\x20\x0e\xee\xc0\xd6\xcd\x48\x23\x83\x36\x86\x27\x7c\xea\x3c\xdd\x05\xe6\x0f\xee\xbe\x1a\xbf\xff\xc3\xc5\x6b\xec\x9d\x98\x71\xe4\xf6\xad\x42\x0a\xe8\xb4\x18\x88\x83\x3f\xaf\xe3\x3d\x22\xe1\x24\x22\xf6\x23\x0a\xcb\xbd\x95\xdd\x75\xed\x23\x56\xdf\x96\x09\xbb\xf4\x3e\x4d\x1c\x8e\x79\xaa\x03\xf7\xd4\xf7\x88\xba\x20\x0e\xee\x80\x9c\x25\x4a\xe1\xd0\xd8\xf0\xb1\xd7\x60\x89\x83\x5f\xfb\x20\xa7\xa3\x16\xd5\xb5\x7a\xbd\x9e\xf3\x0b\x65\x1d\x6a\x37\xfb\xa7\xed\x11\x0e\x80\x38\xa8\x1f\x00\x24\x30\xa0\xd5\xfb\xc9\x09\xcc\x8b\xa5\x98\x2a\x31\xae\x9e\xdd\xeb\x13\x6c\xd6\xf9\xcb\xbe\xfa\x9a\xfb\xcc\xce\x86\x42\x73\xdb\xfe\xa6\xf7\xfa\x58\xca\xcf\x97\x20\xd2\x0c\x10\x87\x9c\xc0\xb4\xe3\xcd\xe2\x7e\x79\x24\xab\x90\x6f\x51\x20\x7c\x06\x5b\x87\x21\x4d\x0e\xbd\xdf\x5a\xed\x48\xf3\x72\x11\xde\x26\x86\x82\x03\xf4\x9d\x68\x10\x87\x9c\xc0\xa8\x96\x48\x68\x95\xb2\x85\x47\x61\x86\x0f\x8e\x5e\x30\xf7\x9a\xc0\xdc\x67\xbc\xee\x2b\x11\x28\x90\xd9\xfd\xee\x91\xd2\x83\xab\x78\x88\xca\x20\xce\x4f\x16\x05\xe5\x9f\x5f\x0d\xff\x79\x23\xe3\xaa\x93\x46\x6f\xaf\xee\x90\xcc\x3e\xda\xd1\x7d\x67\xf4\x7b\x13\xb6\x1f\x5d\x56\xda\xc3\x1e\x0c\x37\xd9\xef\x4f\x48\x43\x09\x8c\x69\xf5\xb8\xc5\x1d\xff\x59\x56\x34\x5b\x1d\xb5\x04\x85\x31\x1c\x7f\x59\xcf\x01\xc1\xe9\xba\x89\x61\xd1\xfe\x42\xfb\xda\x4b\xcf\xff\x4c\x60\x6e\x59\x39\xd4\xd8\x4f\x38\x61\xda\xe2\x4d\x77\x64\x1a\x5d\x0c\x4d\xcf\xf6\xb5\x6e\x3c\xf2\xfa\x9d\x82\x12\x19\x33\x14\x24\xf2\xe7\xc5\x14\xb3\xbf\xa4\x5e\x35\x58\x32\x69\x37\x5b\x95\xc6\xef\xea\xbb\xc6\xfe\x96\x7c\x9b\x1b\x98\x2f\xbb\x77\xa8\x6a\x15\x68\xe8\x81\x29\xfe\xdf\x96\xc0\x80\x9a\xf6\x47\x02\x23\x89\x94\xc0\x34\xbf\x8c\xab\x6a\xc5\xdf\x21\x2c\x4f\xe4\x65\xd8\x44\x69\xc5\x32\xea\xf5\xc2\xdf\x47\x75\xbb\xde\x73\xa4\x3a\xc7\x86\xa5\xa9\x7a\x1a\x09\x4c\x03\x52\x02\x83\xa6\x76\x63\xb0\x5c\x07\x5f\xd3\x6f\xb2\x7e\x7e\xaf\x9a\x22\x89\x25\x6e\x79\x2f\x4f\xa8\x53\x8c\x34\x5a\x29\x7b\x7f\xb1\x48\xee\x54\x76\x67\x20\x27\x30\x99\x51\x0b\x67\x56\x07\xcf\x1a\xf8\x7a\x62\x7e\x79\x97\x17\x45\xd6\x9d\xf3\xa5\x31\xd7\xbe\x61\x14\xfd\xac\x5a\xd8\xbd\x99\x27\x81\xa7\xb2\x17\x05\x39\x81\xb1\x8f\x38\xb4\x67\x9b\xac\x7f\x2b\x9f\x5e\x2f\xd7\x8e\x5e\xf9\x28\xb7\xd1\xac\x65\xf8\x59\xc3\x26\x67\xcc\x3b\xa7\x83\x04\xed\xba\x53\x69\x2d\x72\x02\x13\x95\xda\x9e\x26\xe5\x25\x7d\xfd\xc0\x40\xd0\xde\xfa\x0c\x91\xfc\x95\x30\x51\xb9\x51\xb2\x86\x42\x54\xa3\x4b\x0e\x99\x77\x75\x06\x4e\xa5\xb5\xc8\x09\x4c\x00\x63\x6b\x79\x78\x09\xdd\x05\xb9\xb3\x8f\x7f\xbc\xe5\xce\x1e\x6b\x17\x68\xb1\xcd\x2b\x17\x4a\xad\xfb\xdc\x56\x82\x9b\xf4\xf4\x14\x82\x1f\x83\xff\x4c\xdd\x93\xc6\x5b\xc6\xe4\x7a\x5a\xc6\x24\x81\x87\xd6\x7b\x53\x12\x07\x9b\x14\x8b\xc1\x3f\x78\x33\xeb\x8c\x94\xc3\xc6\xf4\xe3\x70\x62\xb4\x9e\x34\x21\xc6\x19\x10\x87\x34\x87\xa9\xa5\xc5\xd0\x10\xf2\x96\xd1\x94\xdd\xcb\x16\x34\xe1\x6e\x13\x7d\x3e\x6c\x20\xfb\x2b\xa2\x5e\x49\x65\x1f\xed\xb5\x26\xd6\x20\x34\x87\x01\x70\xf0\xf1\x96\xb2\xfa\x9c\xdb\x2f\x8d\x20\xcf\xb1\x57\x3f\x6e\xfa\x4b\x67\x4e\x64\xb8\xbb\x4f\x95\xbf\xc9\x2f\xb9\x32\xb2\x6c\x9c\xb1\xb2\x08\x9d\xd0\x07\x71\xf0\xe7\x6d\x64\xab\x14\x6d\xa8\x09\x79\x19\x96\x66\xc4\x93\x4b\xc6\x4a\x19\x10\xdc\x2c\x1f\xa8\x91\xb2\x49\xdb\x21\x42\x7f\xde\x4d\x42\x1a\xda\x79\x0b\xe0\x90\x3e\xc5\x5d\x5c\x7f\x71\x5e\x79\xcd\x95\x20\x48\x0f\xab\x63\xb1\xe1\x78\x99\xe5\x93\xc6\x5a\xb4\x25\x6a\x3e\xfb\xab\xfc\x7a\x22\xb9\x10\xc4\xf2\x1b\xc4\x21\x2e\x00\x91\xfc\x7b\x02\x03\xea\x47\x4e\xbc\x83\x57\x44\xde\xeb\x8d\x45\x0e\x07\x9d\x20\xcf\x31\x06\xc3\x68\x72\x63\xea\xb6\xb8\x57\xf8\x99\x2b\x2e\x3d\xce\xfc\x5a\xa3\x6f\x7c\xa1\xf0\x09\xc0\xc1\x9b\xfe\x90\x42\x53\x23\x99\xcc\xe2\xf9\x35\xde\xe1\x46\x49\x94\x5c\xd4\x88\x8e\x9f\xaf\x05\x7d\xe4\x3a\x4a\xde\x0c\x0a\xfb\xeb\xe2\x9e\x47\xd4\x05\x71\x70\x05\x2c\x22\xe4\x93\xec\xb6\x3c\x65\x14\xf4\xcb\x9b\x1f\xa7\x84\xd8\xae\xff\xcc\x22\x0a\x30\xda\x22\xce\xc2\x11\x5d\x55\xfd\x38\x44\x87\xa8\x0b\xe2\xe0\xcf\xfb\xe4\xc2\xa5\x9d\x1d\xea\xcd\x60\x47\x3d\x34\x1b\xe2\xf5\xd2\xc9\x84\x79\x27\xc7\xf9\x73\x5d\x6c\x3d\x13\xc3\xb2\x36\x64\xae\xd0\x29\x34\x10\x07\xaf\x5b\xa9\x79\x4f\x29\x36\x38\xd9\x9c\x9b\xdb\x56\xf6\x99\xd0\x73\x22\x0a\x32\xe6\xbb\xbc\xf2\x2e\x6a\x2f\xce\xee\x3f\xbd\xa0\xbc\x48\x84\x50\x00\xc4\x41\x77\xc0\xfc\x3d\x81\x01\xf5\xe9\x27\x29\xf0\x50\x94\x77\xea\x30\xe7\xaa\xfd\x3c\xca\x76\x23\x2b\xb3\x19\xea\x55\x99\x92\xab\xd7\x0a\xd9\xf8\xd5\x2c\xde\xb8\x92\x58\x0f\x43\xf7\x0d\x82\x38\xa4\xd5\xec\x0f\xb2\xa7\xd3\xa1\xa9\x49\x32\x6e\xdf\x99\x26\x08\xc4\x04\xa8\x56\x82\xf4\xdf\x7e\x66\x32\x97\xee\xd7\x0d\xbf\x42\x24\x09\x85\x5a\x20\x0e\xe9\x18\x5a\xde\x1c\x05\x75\x90\xf3\x35\x99\x20\x8f\x65\x6e\x4e\xe3\x1b\x86\xd8\x1e\xd8\x97\x06\x15\x8c\xa9\x1f\x65\xf8\x45\x3d\x2d\xaf\x80\x8e\xa1\x01\x38\xf8\xf3\x16\xa9\x9e\x3b\x53\x65\xec\x75\xeb\x89\x81\x55\x62\xec\x0f\x49\xcb\x95\xbb\x0f\x99\xda\xaf\x68\xd3\x5d\xd0\xee\x08\xd7\x48\x0c\x08\x46\xd4\x05\x71\xf0\xba\x8a\x81\x29\x52\x16\xcb\x32\x8e\xc4\xef\x88\x57\x4d\x78\xf1\xd7\x09\xa5\x3f\x70\x4d\x0d\xa6\x2f\x0e\xe7\x66\x77\xc4\xed\x16\x18\x20\x66\xdd\x20\x0e\xba\xfb\x01\x90\xc0\x80\x06\xd8\x93\x1c\x60\xdd\x32\xcd\xfd\xec\x85\x6d\xc3\x1c\xfa\xda\x9a\x47\x5d\x9c\x5a\x7e\x79\x6d\x2b\xe3\xbe\x36\x53\x89\xa6\x6d\x87\xa9\x4c\xdb\x38\xa2\xed\x20\x0e\xde\xf6\x55\x07\x42\x81\x80\x91\x5f\x2b\xcd\xae\x71\x17\xa5\xd0\xd1\x88\xd1\x2e\xe4\x53\xea\xf9\xa4\xd8\x5f\x6e\x76\x64\x5c\xa1\x43\x29\x87\xae\xb6\x06\x70\x70\x07\x5a\x5f\xb3\xa9\xbe\x92\xa9\x2b\xe3\x76\x7e\x46\xaa\x80\xa9\x2a\x50\xf5\xc1\xd1\xf4\x5c\x54\xde\x38\x91\xff\xa5\x9d\xf9\xd8\x43\x68\xbf\x12\x88\x43\xfa\x6e\x97\x41\xa9\x26\x03\x9d\x6f\xe6\x80\xb8\x6c\x9c\x09\xaa\x1b\x7b\xf6\xbd\x4f\xfd\x57\xc3\xaf\x5d\xba\x25\x9e\x24\x91\x98\x13\x07\xed\xd9\x01\x71\xf0\xba\x9f\xcb\xae\xae\x69\xd6\x72\x38\x4e\xa6\xe6\xa8\x6b\x2d\xc4\x7e\xf7\x13\xc6\x10\x63\xda\x4f\x5d\xc8\xbd\x3f\x1f\x6f\x1b\x74\x9c\x81\x70\x00\xc4\x41\x77\x3f\x00\x12\x18\xd0\x6c\xe7\x24\x07\xd2\x35\x43\xb0\x2e\x05\xce\xcd\x1c\x9f\x7b\xdf\xa8\xfe\x66\xfc\x33\x86\x77\x73\x84\x0c\x57\xbf\xd4\x37\xf5\xdb\x31\x86\x75\xad\xdb\xd0\x79\x31\x00\x87\x94\xc0\x90\x7e\xfc\xdc\x36\xa7\x3b\x2b\xe1\x8e\xff\xf2\xba\x3c\xbd\x62\x1d\x0e\x76\xb5\xdd\xed\x63\x01\xf9\x08\xa2\x4d\xbf\x0c\x3e\xe8\xdf\x0a\xc4\xc1\x1d\x10\xbc\x55\x91\x64\x85\xa5\x2e\xc4\x72\xbd\x23\x7b\xd4\x91\x08\xe3\xe5\xfb\x67\x9c\x85\x0a\x62\xe7\x8d\x04\xd0\xb0\xad\x0e\x3f\x42\xce\x82\x38\xa4\x6f\x66\x8b\x7d\x6c\x9d\x53\xa0\xff\xce\xb4\x65\xa7\x4b\x3b\x50\x7b\x27\x4d\xbc\xe7\xe9\x4a\x7a\xae\xcb\x25\xfa\x4e\x3e\xb3\x59\xd5\xff\x3d\xe8\x0c\xe0\xe0\x75\x7f\x95\xe2\x4c\x71\xf6\x0d\x8c\x17\x14\xbb\x32\x15\x62\x67\xf7\x71\xea\xe3\x71\x7d\x5e\xb8\x76\xad\xed\x6c\x7c\x49\xf1\x6c\x2e\x3f\xc2\x01\x10\x07\xf5\x03\x80\x04\x06\x34\xf5\x3c\xc9\x01\x32\x76\x97\xfe\x4b\x3b\xdd\x42\xe6\x57\x19\x73\x05\x1d\x18\x1d\x6d\xab\x05\x9f\x10\x8f\xf1\x4e\x3d\x34\xfe\x8c\xeb\xbd\x88\x43\x81\x68\x3b\x88\x43\x7a\x27\x27\x11\xf8\xbd\x6d\x83\x82\x3b\x2b\xc5\xab\x47\xb6\xdc\x2f\xc5\x85\x0c\xbd\x8b\xf8\x3a\x93\xca\xb1\x6c\xdd\x28\x3e\xc3\x36\x74\x1f\x18\x88\x83\x3b\xf0\xe8\x71\x7b\xb8\xce\x50\xcc\x6d\x3b\x5a\x8e\x4c\x8b\x60\xab\x32\x97\x67\x73\xf1\xe8\x2c\xee\x98\xd3\x86\xcd\x37\x0a\xd3\x6d\x21\xb7\x40\x1c\xfc\x79\x59\x85\x1a\xdf\x6f\xe8\xe6\xb1\x16\x53\x19\xef\xa4\xea\x49\xab\x4a\x65\xcb\xdf\x56\x3b\x40\xcd\x58\xa2\x7d\x45\x17\xb4\x32\x9b\x06\xf5\x87\x00\x0e\x5e\x97\xa9\x9b\x16\x4b\x6f\x2e\x61\xb0\x64\xe7\xf0\x99\xf7\xfd\xbc\xb5\x6b\xb9\x3c\x11\xd4\x18\xdf\xb5\xca\x3e\x3d\xbf\x14\xe5\x98\xbd\x80\x70\x00\xc4\x41\xfd\x00\x20\x81\x01\xad\xde\x4f\x4e\x60\x78\x8d\xbf\xe4\x88\x53\xd7\x48\x7c\xaa\xc7\xfb\xe8\xd4\xa1\xfa\xe8\xb3\xd5\x07\xae\x91\x67\x22\xea\xd7\x6f\xa1\x94\x50\xe5\x08\x43\x67\x90\x40\x1c\x72\x02\xf3\xb0\x59\xb3\x73\xa9\xb2\xc2\x29\x96\xdc\xa4\x91\xc8\xd8\xb6\xf2\x1c\x99\x86\x31\xa3\x18\x51\x10\xe5\x9e\x13\x5e\x8d\x45\x41\x28\xa2\x32\x88\x43\x4e\x60\xfc\xe6\xa8\xf0\xf2\x5b\x31\x29\x2e\x5b\x26\x47\x1a\x3d\xb9\xb4\x13\x74\x28\x9c\xb9\x1f\x1e\x55\xa6\x48\x1c\x50\x17\xf5\x9d\x5c\x04\x51\x19\xc4\xfd\x4f\x02\xf3\x8f\x73\x63\x06\x5a\xae\xcc\xcf\x5e\x1f\x6e\x1e\xea\xbf\xaa\x6a\xae\x0c\xcb\x62\xd2\x97\x4d\x74\x3f\x48\xb8\xa1\x90\x6e\xb7\xdb\x3b\x51\x47\x08\x25\x30\xd2\xc9\x44\xc5\x7c\xf9\x0a\x73\x02\x2a\x97\x55\xdf\x8a\xfb\xbc\x7e\xda\x21\x7c\xd8\x35\xf4\x01\x1b\xff\x03\xaf\xd2\x13\x2d\x11\xf6\x3f\x13\x18\x54\xc9\xcb\xa5\xda\x58\x9c\xf2\x5a\x89\x33\xd6\xa8\xb4\x32\x49\x9f\x04\x78\x6f\x6f\x45\x9f\x6d\xec\xb9\xff\x69\xf7\xb1\xa7\xec\x9f\x1f\xfb\x79\x1f\x34\x93\x3f\xa5\xe1\xb5\x46\x40\xc3\x2f\xff\x8b\x55\x47\xde\x27\xce\x43\xe7\x85\x6f\x77\xb0\xa7\xce\x98\xde\x01\x57\x46\x87\xa4\x24\x1e\xde\x7f\x43\x02\xe3\x8d\xf9\x9f\x35\xcd\x1f\x1d\x05\xd3\x4f\x8a\xde\x3b\x20\x44\xc6\x1b\x29\x81\x89\xf7\xd0\xe6\xc9\x5a\x3d\xd6\xe9\xc5\x6b\x24\x18\x11\xa9\xda\x1d\x7b\xa9\xff\x60\xd2\xd7\xe3\x5b\xba\xbc\x9c\x89\x03\xe9\xe1\xde\x69\x24\x30\x28\x37\x90\x56\xe9\x9e\xb5\xe7\xf6\x06\xce\xaf\xaf\xbd\x60\x93\xf5\xa6\x59\x9a\xca\x58\x25\xa1\x9c\x47\x95\xf6\x64\xc3\x64\x97\x52\xeb\x4f\x0b\x3e\x95\xed\x19\xc8\x09\xcc\xbc\x94\x17\xfa\xa0\x2b\xdf\x19\x31\x8b\xd8\x38\x09\xea\x89\xa5\x28\x51\xc2\xf1\x83\xd8\x9b\x25\xf9\x78\x68\xf9\xe8\xdc\x24\xef\x4f\x65\x33\x8a\x16\xd2\x9f\x55\xd9\xf6\xfe\xe6\x18\x76\xaf\xf4\x48\x0c\x8b\xd5\xef\x7c\xcc\x9d\x5b\xe2\x8c\x57\x45\x3e\x79\x4c\xd8\xd1\x27\xaa\x3b\x29\x7e\xf5\x3d\x95\xd6\x22\x27\x30\xe7\xbe\xf5\x3e\xb9\x9b\x38\x6e\xaf\xfd\xa5\xf6\x9c\xe5\xb6\x99\x4f\xba\x71\xae\xc8\x95\xea\xf7\xe1\xe6\x9a\x46\x2d\x47\xd7\x8b\xd7\x4e\x2d\x0a\x01\x39\x74\xd2\xc0\xd7\x49\xce\x4e\x3e\x2e\xe3\x5b\x41\xd7\x52\xb0\x1b\xbe\xb9\xf0\x32\xa3\x35\xba\x6e\x59\xd4\x86\xdd\x5c\xc4\xec\xbe\x6e\x91\xf5\x16\xb4\x59\x1b\xc0\xc1\x3b\xfc\x26\xa2\xea\xa9\x85\xa4\x6a\xf7\x5b\x17\xa3\xee\x70\xca\xfa\x0c\xbf\xab\x28\x43\x35\x60\x10\x9c\x8e\xbf\xe3\x50\x9b\xc7\x4d\x09\x7d\xdc\x02\xc4\xc1\x07\xbe\xd7\x83\x2e\x67\xee\x92\xbc\xe3\xb8\xb8\x3d\x98\x87\x21\x76\x9c\x2a\x51\xfa\xa2\x24\xf2\xaa\xee\xba\xea\x8c\x93\x40\xfd\x36\x31\xb4\xc3\x01\xc4\x21\xed\x9c\xf8\xb0\xc0\x2a\xaf\x60\x9d\xaf\x3c\x91\xe7\xf7\x78\xa3\x58\xca\xda\xf5\xd5\xd8\x6e\x10\x93\x4c\x20\xf7\xf4\xfd\x6b\x46\x2a\x5e\xd0\xce\x09\x00\x07\x7f\xde\xf7\x02\x51\x2b\x85\x2c\x1b\x62\xdf\x5b\x6d\xc4\x08\x04\x27\x62\xcf\x8e\xfe\xa6\xb8\xda\x1a\xcc\x82\x45\x12\xac\xb4\x80\x67\x3d\x83\x58\x07\x83\x38\xc4\x5d\x1c\xde\x7f\x8f\x42\x40\xff\xa1\x4f\x52\x40\x30\xaa\xaf\x22\xa8\x6d\xd7\x9a\xc2\x89\xa6\x60\xae\x21\x52\xad\xd6\xcc\xb7\xae\x83\x24\x94\x27\xb8\x08\xf7\x7c\x4f\xd1\x70\x1f\x34\x9f\x04\x70\xf0\x9f\x94\xae\xa9\xf6\x7d\x13\x0d\xba\x44\xc2\x44\xf0\xe4\x4d\xa5\x4d\x01\x77\x29\xef\xe3\x3d\xd4\xbc\x81\xdf\xb7\x83\x9c\xbf\xf7\x04\x1c\x22\xea\x82\x38\xa4\x75\xb0\x36\xd6\x30\xfd\x4a\x52\xaa\xee\x7b\x2f\x96\x9a\xd6\xfa\xd9\x0d\xca\x5f\x24\x45\xe3\x4c\xe2\xcf\x92\xed\xf6\x7a\x7e\xcb\x40\x1f\xee\x06\x71\xf0\xe7\xe5\x73\xbd\x6e\x1e\x93\xdf\xbf\x45\x50\x67\xb8\xfc\x33\x4f\x37\x39\x9f\xa6\x8a\xa3\xf1\x20\xc9\x21\x21\x61\x77\x26\x4b\x30\x0f\xba\x96\x06\xc4\x21\x7d\xb3\x34\xea\x67\x2f\x11\x0f\x5b\x58\x65\xa0\xac\xfe\x22\xc1\x48\x2e\xcd\xde\x7c\xee\xd9\xa7\x56\xfd\xfa\x39\x5f\x75\xc8\x23\x43\x85\x11\x0a\x80\x38\xe8\x3a\x96\x1b\x7f\xff\x14\x30\xa0\x73\x3d\xf1\x1a\x06\xdf\x47\x91\xbd\x8b\xa2\x1d\xfc\xf4\x39\x8f\x35\x67\x51\x16\x46\x74\xe9\xe3\xeb\xcd\x64\x9a\xbe\x8c\x44\x36\x0d\x3e\x94\xa9\x82\xae\x61\x00\x70\xf0\x9f\x34\x2c\x5b\x07\x4d\x75\x9d\x29\xbe\xf2\x65\x60\x30\x41\xca\x4f\x7f\x3d\x77\x2f\xc9\xdd\xdd\x1f\x15\x96\x79\x2e\xfa\xc2\x8a\x2b\x9f\xa0\x3b\xa6\x01\x1c\xfc\x27\xdd\x70\x70\xe5\x0c\xc4\x56\x9e\x6b\x52\x90\x3d\xff\x3d\xbc\xec\xb0\xc0\x20\x17\x9f\xb3\x30\x42\xd4\x6a\x72\x32\xe7\xe0\x0d\x15\x01\x74\xcd\x2e\x80\x83\x3f\xaf\x67\x67\xff\xee\xa4\xb7\xfe\x93\x5e\x8e\xed\x29\x2b\xd1\x03\x11\x62\xb6\x1d\xd3\x8a\x1b\x7d\xc2\x09\x4a\xd7\x8a\xf0\x78\xd1\xa0\x25\x10\x88\x83\x3f\x6f\x52\x71\xf2\xf4\x16\x71\x94\x6a\xab\x27\xfb\x2b\x32\xc6\xad\x17\xac\x56\xa8\x89\xa1\xaf\x4c\xd0\x6f\x11\xfa\x27\x0e\xb6\xdf\xd5\x44\x4c\x7f\x41\x1c\x74\x0d\x03\x20\x0a\x01\x8d\x74\x27\x39\x30\x7c\xcb\xc5\xb7\x60\xe6\xe0\xac\x7e\xf1\x3d\x71\xfb\xe7\x0b\x21\x3b\xa4\x41\x07\xd2\xfb\x25\xb9\xad\x99\xdb\x15\x15\x77\x3d\xf6\x11\x6d\x07\x71\xf0\xdf\x74\x2a\xab\x7e\x72\x7d\x8c\x17\xf7\xcd\x5d\xaa\xa8\x8c\x2a\x17\x5d\x71\x06\x0a\xc6\xca\x65\x4d\xd9\xf5\xf9\xd4\x25\x6b\xcd\xcf\x50\xc2\x08\xe2\xe0\xbf\xe9\x4a\xf7\x77\x21\xbe\xb4\xb6\x80\xae\xef\xae\x0c\x66\xac\xa3\x0f\x79\x87\xd2\xb8\x2f\xb9\x8a\xaf\x44\x1a\x1b\xe0\x2e\x52\xd1\x44\x20\xea\x82\x38\xf8\xf3\x96\x8c\x4e\x3c\x67\xd2\x6d\xb9\xf4\x85\xdb\xa7\x2d\xc0\xe5\xfd\x78\xba\x01\x8f\x7b\xcb\x8e\x43\xe9\x1e\xbb\x7d\xdf\xdb\x3b\xf9\x3b\x88\xba\x20\x0e\xe9\x08\xdb\x93\x74\x94\x79\x8b\x80\x3a\xcc\x73\x66\x5a\x53\x91\x03\xdb\x84\x5b\x7a\x54\x38\xd8\x9f\xdb\xa8\xd4\x63\x35\x45\xac\x29\x69\xa1\xab\x38\x00\x1c\x74\x0d\x83\xd6\xdf\x1d\x00\x4d\x3b\x4e\x3c\x1b\xfc\x5b\x2a\x2d\xce\xc4\x4e\x70\x43\x5c\x5c\x9f\x03\x63\x6b\x3f\xe1\x31\xb5\x0a\x53\xde\xd1\x1d\x7c\x13\x1f\x0d\x07\x63\xe6\x76\xe8\x45\x03\x80\x83\xff\xa6\xb9\x13\x5e\x1c\xd4\x29\x14\xd4\xd9\x1f\xb0\x1f\xfa\x65\x92\x91\xbc\xbe\xcc\x5e\x1b\xcb\x46\x2f\x6e\xb8\x93\x27\xdc\x76\x55\x0f\xfa\xcc\x11\x88\x43\x3a\x12\xf6\x0a\x37\x20\xf0\xc5\x7e\xd2\x8f\xe5\x8c\x39\xde\xcb\xb1\x43\xa5\xe9\x72\x7b\x53\x46\x07\xe9\x75\x57\x5e\x86\x5d\x0e\xcb\x87\x8e\x6e\x81\x38\xa4\x8d\x13\x9c\x77\x25\xfc\x9c\x88\x65\xd6\x83\xb4\xaa\xe3\x29\x12\x92\x6e\x8a\x77\x61\x7d\xbb\xa4\x5f\x1e\xb8\xe9\x69\xa0\x47\x29\x34\x0d\x6d\x9c\x00\x70\xf0\xe7\xe5\x2a\x75\x35\xee\x2d\xee\x4b\xfc\x19\xf4\xa0\xd1\x3a\xd4\xee\x0e\xc5\xf5\xd6\xca\x11\xc2\xd8\x61\xd2\x11\xe3\xdb\xaa\x86\xed\x8e\x08\x07\x40\x1c\xd4\x0f\xfc\x5f\x51\x88\xe1\x7f\xb6\x84\x3a\x79\x19\x4c\x4b\x54\x2c\x6c\x22\xb1\xf2\x68\xc2\x2f\x57\x6a\x70\xff\x9e\xba\x14\xcf\x4d\xfe\x34\x2c\xda\x6b\x07\x43\x5e\x9c\xaa\x24\x7b\x32\x88\x25\x25\x88\x43\x5e\x06\xff\x1a\xdf\xd6\x2a\x79\xa1\x6a\x9d\x7f\x9f\x6e\xff\xee\xe3\x7c\x15\x81\x7b\x16\xa9\xb7\x5a\xeb\x84\x0b\x2c\x3e\x5d\x1f\x91\xb9\x34\x86\xa8\x0c\xe2\x90\x97\xc1\x9f\xeb\x0a\x71\xa5\xd2\xd5\x42\xb9\xcd\x31\x6b\x18\xe5\x2e\x8c\x4d\xc6\x86\x4a\x4d\x30\xe6\x04\xaa\x0e\x4c\x4b\xb5\x51\xbe\xe9\x43\x54\x06\x71\xff\xb3\x0c\x66\xf8\xc7\x32\x98\x70\x51\x7b\xfc\xe8\xa1\xb6\xc3\x82\x78\x17\xde\xb3\x8d\xd8\xb4\xfe\xc6\x87\xae\x69\xf5\x5c\x4e\x8a\xaf\x08\xec\x9d\x33\xc5\xa0\x65\xf0\xb9\x32\x93\x71\x2b\xbd\x99\x1b\xf8\xa4\x2f\x1b\xc2\x44\xae\x3f\x8a\x42\x0f\x2f\x23\x34\xaa\xb0\x63\x53\x96\x72\x6c\x6a\xec\xfd\xfc\xe7\x32\xf8\x2c\x51\x27\xf1\xe5\xb7\x16\xc3\xfd\x4f\x6f\xac\x2d\x2c\xed\x12\x9e\x69\xb2\xf7\x38\x4a\x7e\xa9\x21\xa8\x42\x42\xa3\x9e\x37\x84\xf2\xe7\x06\x31\x14\xcc\x73\x9b\xf4\x3d\x8b\xeb\xc1\xd3\x42\x2d\x9c\xc6\x6e\xe4\x0d\xb9\xab\x41\x24\x7d\x17\xd1\x25\x6b\x0a\xf8\x3d\x7f\xd0\xff\xb7\x2d\x83\x41\x4d\xfb\x63\x19\xdc\x80\xb4\x0c\x7e\x77\x75\x84\xff\x9c\x17\x91\x41\x29\x7f\x6a\x70\x68\xc7\x67\xb6\x0d\x4a\xf7\x40\x51\x31\x7d\xec\x05\xe1\xb4\xdb\x8f\x7e\x8b\xd7\x9c\xc6\x32\x58\x12\x69\x19\xdc\x71\xdd\x97\x7b\x5f\xe7\xa9\xb1\x9e\x19\xc3\xf5\x33\x6e\x9d\x3f\x7a\x3a\xba\x2e\xf7\x0c\xa5\x11\xc6\xf9\xeb\x44\x4b\x12\x66\x46\x9f\xca\x3b\x72\xe4\x65\x70\xed\xba\x07\x7e\x6a\x52\x1b\x9f\x45\x92\xff\x70\xaf\xc8\xc8\xaa\x62\xd0\xd4\x12\x57\xe9\x48\x49\xd7\x55\x0c\x49\xfc\x56\x2f\xce\x53\xd9\x11\x80\xbc\x0c\x4e\xe6\xcc\x66\x8f\xce\xda\x12\xf4\x64\x16\x91\x92\x32\x53\xba\x18\xf3\x63\xb7\x4d\xf6\x0b\xb1\x38\x49\x2b\xe9\x4d\x93\x84\xb2\xd3\xd9\x11\x80\xbc\x0c\xee\x70\x4e\xeb\xce\x19\x9d\x76\x7a\x45\x59\x10\x96\xf6\x2b\xd2\x5d\xce\xb3\x62\xec\xe6\xf7\xa7\x58\xf8\xb3\x64\x9c\xd9\x33\x71\x1b\xa7\xb6\x0c\x06\x39\x74\xd2\xc0\x77\x9e\x21\x3a\x3d\xdf\xef\x3a\x77\x96\xe8\x25\x27\xd2\x96\x57\x41\x78\x5f\x47\xcb\xb0\x8c\xef\xe9\x69\xf5\x32\xbe\x25\x2e\xc9\xdd\x45\x74\xf8\x20\x0e\x3e\x90\xa4\x90\xbc\x49\x8b\x2f\xce\xbf\x18\xc5\x9b\x47\x6d\xf2\x20\x24\x4d\xe9\x35\x8f\xdf\x41\x68\x3b\xc5\x92\x01\x91\x16\xa1\xff\x24\x03\x74\x79\x05\x80\x83\x0f\x24\x07\x0e\x57\xc3\xf4\x2b\xf1\xd4\x84\x0b\x2f\x8d\x4f\x15\x9a\xaf\xd3\x78\x79\xa8\x2d\x19\x1e\xdf\xdc\x4d\xf5\x7d\xdf\x37\x37\x82\x87\xa8\x0b\xe2\xe0\xcf\xbb\xae\xf6\xc1\x95\x54\xf4\x07\xc5\xa6\x20\xe9\x23\xc2\xec\x80\x7a\x35\xb9\xd4\xf3\xf7\x07\xb3\x62\xf9\xd0\xe8\xcc\xbb\x8f\x2f\xc5\x22\xea\x82\x38\x3f\x69\x14\xc9\x3f\xeb\xda\x0d\xdd\xef\xb7\x70\x48\x37\xd4\xd1\x7f\xda\x77\x65\xb0\x2c\x07\x6b\x65\xf0\xb5\x3c\xd6\xf5\x30\x85\x87\xd3\x83\x3f\xef\x46\xbb\x20\xd6\x40\x20\x0e\x71\x25\x42\xc3\xdf\x97\xc1\xa0\xff\xd0\x27\xbe\x0a\x9c\x42\xe3\xcf\xfb\x26\xfb\xb1\xa0\x53\x5c\xdb\xfb\xb9\x1e\xc5\x61\xce\x6d\x89\x2f\xa6\x64\x63\xcb\xec\x3c\xcc\xd4\xf9\x2a\xd0\x11\x60\x10\x07\xff\x49\xdb\x47\xfc\x64\x6d\x2c\x43\xf6\x79\xa5\x53\xb5\xa2\xb4\x33\x4d\xe9\xb2\x74\x1a\xb3\x17\xdb\x24\x57\xcb\x1a\x5b\x85\x95\x7e\xd2\x40\x57\x0c\x00\x38\xa4\xb9\x04\x1a\xef\x3e\x41\xc8\x88\xb3\x3e\x1d\x0e\x8b\xd7\x34\x87\xa8\xed\x2d\x9c\x8f\x63\x15\xdd\x9d\x12\xcc\x1f\xb2\xcf\xd5\xcb\x09\x22\xea\x82\x38\xf8\xf3\x5a\x89\x6b\xd5\x36\xe0\x44\xef\xf0\xea\xbe\x3c\xf7\xf6\xb2\xe1\x6e\xa3\x97\x14\x77\xac\x4a\xbe\x7c\xae\xe0\x52\x98\x1f\x5e\x10\xb4\x21\x1f\xc4\xc1\x15\x60\x6a\x6b\x3e\x8e\xe7\xbe\x38\x7a\x2b\x6d\x4d\x3c\x94\x8c\x75\xfd\xfd\xd0\x63\x06\x46\x74\x2d\x13\xd7\xb1\x59\x1a\x91\xf5\xd7\xcc\x08\x05\x40\x1c\x74\x2b\xc6\xdf\x97\xc1\xa0\xce\xf5\xc4\xb7\x40\x1b\x94\x11\x18\xed\x4b\x6c\xc4\x1e\xf4\x26\x8b\x9b\x5a\x15\x57\x1f\xa5\xaf\x24\xb6\x15\x57\x13\x3c\xb9\x55\xd9\x2e\xae\x0b\x85\x4b\x20\x0e\x69\x47\x80\x21\x73\x42\x5a\xba\x51\xd5\x43\xde\xb7\x36\x6a\x8f\xed\x4a\xc6\xdc\x8b\x54\xb5\xc3\x5f\x1e\x88\x0e\x4d\xa3\x54\x2a\x3d\x71\x81\x76\x04\x00\x38\xb8\x02\x6b\x07\xc1\xef\xa6\x54\x68\xdd\x8e\x06\xc8\x87\x8b\xdf\xd0\xda\x5a\x07\x9a\x53\x64\xda\x3d\x93\x50\x76\xf4\xb3\xe5\x27\xf6\x80\x6e\xdb\x00\x71\xf0\xe7\x2d\xa3\xd0\x23\x5b\x89\x90\xe6\x4b\xac\xa8\xf4\xb8\x5c\x59\xfe\xde\xd2\x8a\x6f\x4c\x3f\x50\x5d\xc2\xe5\x5c\x6f\x2e\x13\x5e\xde\x4d\x44\x5d\x10\x07\x57\x40\x5a\xf2\x90\xaf\xbb\xc2\xe2\xb3\xf0\x35\xb9\xe7\x76\x8e\x2d\x25\x6b\xd4\x45\xc6\xc2\xd7\xa5\x9b\x70\x1d\x5e\xf9\xbd\x8a\xcb\x0c\x44\x4c\x7f\x41\x1c\x74\x1a\x1e\xb0\x0c\x06\x8d\x74\x27\x2e\x81\x68\xa5\x5e\x3c\x5e\x8f\x9c\xbd\x33\xe2\x80\xf1\xe6\x0a\x7f\xfa\x8b\x67\x26\x0c\x4a\x35\x5c\x68\x32\x12\xc4\xcc\x2c\x3b\xcb\xb8\xd0\x12\x08\xc0\x21\xbd\x61\x3f\x98\x75\x98\xd8\x30\x57\xaf\x74\x9d\xfe\x54\xc1\x58\x50\x5a\x5a\xe9\xb3\xad\x20\x77\x8e\xaa\xf3\xf3\x67\xe2\x57\x2f\x43\xdf\x42\x6f\xd8\x01\x1c\xdc\x01\x1f\x53\x92\x40\xdf\x56\x12\x89\x1b\xea\x6e\xe5\xed\x3a\xf7\xb9\xb0\x7f\x4f\xc5\x6f\xb9\x5d\x77\xdf\x55\x60\xd5\x46\xbb\xf3\x03\x7a\x73\x09\xe2\xe0\xcf\x4b\xf6\x3e\x44\x0a\x97\xe9\x0b\xca\x5c\x5c\x7a\x4e\xcb\x6d\xdc\xdf\x59\xdc\x4f\xad\x3d\xaf\x61\xba\xa4\x51\xfd\x68\x62\xe6\x9f\x85\xf6\x78\x83\x38\xb8\x03\x11\xb2\x59\xfd\x16\xa6\x5e\x7c\x59\x56\xfc\x57\x33\xca\x34\x6c\x72\xcc\x47\x14\x70\x38\x1c\xdf\x15\xae\x70\x7e\x5f\xfc\x30\x3b\x8d\x70\x00\xc4\x41\xa7\xe1\x01\xcb\x60\xd0\xb4\xe3\x24\x07\xda\xbb\x7d\xa8\x6e\x14\xd1\xb9\xbe\xc5\x2a\x12\x1a\x78\x75\x96\xc8\x17\x17\xdf\x58\xf5\xcc\x85\xb4\x55\xb6\x27\xcd\xf7\x67\xbe\xb8\x43\x5d\x36\x80\x83\xff\xa6\x84\x2b\x4a\x99\xf7\x53\xf6\x76\xba\x5e\x3e\xe7\xf6\xe5\xba\x38\xdf\xa4\xcb\x10\x7d\x2b\x50\x94\x9f\x95\x51\xca\x52\x2f\xf4\x2c\xb4\xe3\x08\xc4\xc1\x1d\x18\x9f\x26\x58\x69\xe3\xa4\xfc\xe8\x93\xfd\x8d\x94\xa8\x80\x74\x4d\x80\x93\x58\x0e\x5b\x91\x7c\x42\xda\x40\xe5\xde\x11\xdf\x15\xe8\xd3\x73\x20\x0e\xfe\xbc\x03\x8e\x04\x67\x28\xdb\x30\x6d\xd6\x3f\x72\x59\x7e\x78\x6a\x69\xc2\xd3\xa2\x1c\x34\x6a\x75\x91\xeb\x4a\x14\x7d\x34\x2b\x4e\x37\xb4\x8b\x05\xc4\x21\x0d\x05\xe5\x05\x56\x2d\x13\x3a\x93\x56\x5f\x88\x70\x57\xb1\x44\xa3\xb4\xc8\x2f\xa2\xfa\xb0\xdf\xb0\xd8\x1d\x78\x98\x35\x83\x15\xaa\x06\xbd\x0d\x06\x70\x50\x3f\x00\x58\x06\x83\x96\x50\xff\xc7\x17\x41\xda\xe5\x23\xe9\x99\x27\x98\x39\xa9\x8c\xb8\x88\xff\x1f\x73\x6f\x19\x55\x55\xf7\xbd\x7f\xd3\x20\x48\xb7\x48\xa7\x84\x80\x84\x94\x80\xa4\x88\x48\x4a\x37\x02\x2a\xdd\xdd\x12\xd2\xad\x80\xb4\x20\x02\x0a\xa2\xa0\x48\x4b\x49\x28\xd2\x2d\x48\x2a\x20\x5d\x12\xf2\x8c\xdf\x33\xc6\xd9\x7f\xef\x7d\x18\xf7\xfa\xbe\xe0\xc5\xfd\xfe\x33\xe6\x39\x6b\xaf\xeb\xec\xb9\xae\xb3\xd6\x9c\xcb\x69\x96\xb4\xb2\x98\x44\x98\x51\x6f\x60\xe2\x5e\x90\xe0\x94\x45\xbc\x45\x28\x74\x23\x08\x80\x43\xb6\xc1\xf4\x09\x12\xcc\x94\xc6\xbf\xea\x85\xb8\xdb\x52\xb2\x71\x8d\xbd\xa9\x04\xfc\x09\x47\x74\x1d\x08\xa7\xdc\xbe\x0f\xa3\x05\x17\x27\x20\x22\x83\x38\x64\x1b\xdc\xa9\xa1\x38\x30\xb9\x1d\x34\x16\xd0\x6e\xba\x25\xc8\xca\xf8\x80\x1b\xc5\x63\x26\x4f\x66\xe6\x8f\x2f\x25\xdf\x4e\xd8\x1d\x3f\x4d\x44\x64\x10\xf7\xff\xdb\xe0\x7f\x74\xb1\xf0\xbe\xf8\x32\x41\x75\xe4\x50\x97\x31\xc4\x5f\x7e\xad\x48\x89\xf3\xee\x67\x72\x14\xc7\x4f\xa3\xc5\xaf\x75\xff\xf8\x54\x09\xd2\x58\x43\x36\xb8\x13\x8f\x4a\x44\xf6\x85\xca\xfc\x4b\x42\x1a\x3e\x8e\x07\x0c\x98\xfe\xf1\xda\xe4\x2e\x27\x0f\x43\xfe\xc8\xe6\xbe\xd8\x28\xab\xc9\xff\xdb\x06\x7b\x7c\xfa\x38\x84\x2a\xc5\x5e\x11\x94\x1c\x7e\x9d\xa1\x9e\xc7\x8c\x5f\x30\x45\x44\xbf\xf4\x76\x04\x0a\x4e\xd2\xf4\xf6\x46\xa3\xf0\xdf\x39\xb4\x7a\x0a\x33\x71\x01\x3d\xe1\x93\xd8\x65\x3b\x1e\x85\x9a\xb5\x5c\xcf\x6e\xfb\x55\x72\xc2\x3e\xc9\x0f\xce\x8e\xde\xd5\x86\xe2\xff\x35\x1b\x0c\x1a\xda\x5f\x36\x18\x45\x16\xee\x95\xa8\xa4\xbd\x93\x5f\xf1\x8a\xa2\x30\xaf\xf2\x8f\xa6\x06\x1d\x70\x14\xf2\xe4\x6b\x6d\x18\x87\xf2\xbd\x65\x72\xba\x32\x3e\xfd\x3b\xe4\x2c\x6c\x70\x20\x92\x0d\x4e\xe8\xbc\x12\xa1\x9e\x2f\x96\xdb\x1b\xd2\x4e\xf3\xb4\x38\xad\x67\xb1\xfc\xf5\x83\x55\xfe\x6c\xa1\x64\xad\xf5\xdb\x51\x65\x46\xb3\x67\xb2\x2d\x2b\x86\x64\x0c\x09\x8d\xf6\xe7\x4b\x3e\xd2\xf3\x5f\x5f\xdd\xf4\xdf\x16\x7b\x83\x46\x7b\x2e\x20\x02\xf5\xfe\x4d\xcc\xca\x0b\xab\x6f\xac\x73\x74\xb0\xcf\x64\x5b\x16\xd9\x06\xab\xba\x06\x56\xe7\xae\xa5\xc9\x90\xda\xd6\x38\xe2\x72\xee\xf6\xca\x29\x3e\xba\xa7\xae\x72\x78\x17\x05\xe7\x71\xce\xd0\x9f\xc4\xb3\xe8\x3a\x21\x87\xe2\x84\xf4\xb1\x6e\x9c\xb6\x5f\x83\x92\xee\x48\x3d\xde\x97\x7f\x7e\x98\x6a\x17\xf8\xc6\x70\xa0\xd8\x66\x4e\xec\x05\x17\x41\xa1\xf4\x57\x47\x3a\xdd\x33\xb3\xc1\x20\x0d\x9d\x96\xf8\x82\xd9\xdb\x8f\xd0\xf9\xdf\x7f\x2d\x53\x21\xdd\x37\x7a\x3e\x49\x35\x68\x6d\x8d\xdb\x5a\x95\x5a\xa1\x1d\x3e\x8e\xa6\xd1\xc6\x7b\x09\x6a\xdf\x06\xe0\xe0\x89\x64\x91\x6b\x98\x35\x9f\xdd\x23\xa1\x4b\x17\xf7\x69\xbb\x0b\x03\xe6\xf0\x52\x04\x99\x5f\xbf\xa2\xb2\x7a\xdf\x1e\xcf\xd0\x33\x79\xa8\xd8\x19\xc4\xc1\x13\x9f\xf8\xef\x18\xb5\xdf\xa2\x53\xa5\x39\x5b\xa2\x18\xbb\x7c\x68\x71\xba\xca\xe5\xf7\x93\x84\x5a\x30\xcc\x50\x2f\xb6\xad\x35\xfd\x81\xf6\x97\x40\x1c\xfc\xca\x2a\xc9\x2c\x62\xdf\xac\x5e\x87\x3b\x6e\xf6\xe5\xb8\x1d\xdd\x4a\xd4\xb5\xae\x19\x68\x04\x16\x5a\xb4\x6d\xf8\xb4\xf2\xb4\xdd\xaa\xd0\x41\x7e\x10\x17\x22\xf3\xcf\x6b\xad\x1f\xac\xa8\x69\xc8\x2b\x9c\x9f\xc4\x66\xb6\xdb\xfd\x66\xba\x52\xd3\xa6\xee\x30\xff\x76\x67\x17\xe3\x24\x81\x92\x80\x4f\x14\xb3\x18\xe1\x81\x40\x1c\xd4\x9a\x40\xf6\xdf\x4f\x43\x02\x7e\xd0\xa7\x49\xa0\xfe\x9e\x92\x20\x31\x0f\x99\x44\xf5\x81\x44\x70\xac\x51\x6c\xb4\xe9\xe8\xec\x4b\x26\x05\x2b\xaa\x34\xf9\xd7\xe9\x57\xee\x36\x40\xa7\x97\x41\x1c\x5c\x02\xdb\xdc\x1d\xdc\xb2\x46\xac\x8a\xbf\x1c\x1f\xb9\x27\xfd\x4c\x9c\x11\x6a\x41\xd9\x18\x7b\xf4\xd4\xdd\x94\xd2\x82\xb7\xe2\xd3\xdb\x5b\x88\xb8\x20\x0e\x2e\x01\x65\x16\xf4\x9b\xef\xb5\x15\x0b\x1c\x7c\xf1\x96\x86\x88\xf2\xf0\x2d\x93\x42\xe3\x73\x0d\x1d\x19\xef\x52\xfe\x26\xe7\x7a\x12\x06\xed\x06\x83\x38\xb8\x04\x34\x15\x52\xa6\x78\x74\xb3\x09\xf0\x0f\xda\x2f\x0a\xf6\x07\xad\x3b\xae\xbe\xdc\x61\x20\x17\x48\xc7\x5f\xf8\xb2\x94\x10\xda\x99\x83\x88\x0b\xe2\xe0\x12\x88\xbb\x95\x6b\xb9\xa8\xdd\xbc\x4d\x70\x3e\xdf\x45\xc7\x7e\xd6\x40\x85\xf7\x02\x66\xfe\xc5\x69\xc5\xd8\x32\xee\xcf\x61\x4c\x74\xbb\x08\x09\x80\x38\xa8\x35\xc1\xbf\xdb\x60\xd0\xcb\xf5\x34\x09\x58\x71\x1c\x14\x3c\x93\xfc\xfc\xb2\xef\xcd\x94\x83\x0d\xa7\xb4\x7b\x6d\x99\xab\x6a\xfb\xea\x3b\x94\x1a\x3e\xed\xbb\x2b\x96\x46\x50\x53\x38\x10\x07\x97\x40\xe0\x4c\x23\x51\x87\xc4\x47\x63\x2e\xd2\x9f\x2f\x65\x87\x73\x53\x07\xd8\xf8\x3f\x92\x6f\x24\x2e\x09\x7e\xee\xed\x0c\xa5\x2f\x85\x2e\xc6\x04\x71\x70\x09\x3c\x74\xf8\xfd\x8d\xd3\xcf\xe7\x52\x3f\xeb\xc7\x3c\x7c\x55\xfa\x8c\x5b\x12\x8a\xdf\xca\x7d\x79\xbe\x92\xa9\xe1\x45\x97\xc8\xb6\x42\xff\xdc\x80\x38\xb8\x04\x14\xc4\xa9\xc9\xf2\x6c\x2f\x11\xb7\x5d\x67\x90\xb5\xf9\x2e\xc3\x90\xdf\x9f\x6e\x25\x74\xee\x96\xaa\xf7\xd4\xaf\x73\xec\x13\x95\xd0\x41\x5b\x10\x07\x97\x40\x21\x27\xd1\xc7\x86\x0d\xf2\xb1\x74\xed\xe5\x98\x79\xf3\xc5\xd0\x0f\x16\x47\xe2\xcb\xdb\x1c\x89\xec\x31\x07\x85\x61\xb6\xe3\x55\x88\xe5\x2f\x88\x83\x4a\x92\xc5\xfe\xdd\x02\x81\x32\xdd\x69\x1a\xf8\x8d\x67\xa2\xcc\x93\x1c\x27\x4c\x43\xc0\xcb\xed\xdc\x81\x5a\x31\x21\xaf\x58\x59\x3f\x2c\xe8\xbe\x80\xfd\x7c\xcb\xe7\xce\xd8\x38\x62\xec\x20\x0e\xa9\x4b\xf0\xb6\xd3\x04\xe9\xbc\x2a\x89\x73\xf8\x47\x62\xd2\xab\x04\x5d\xfa\x1b\xc1\xbf\x46\xe3\xde\x89\x0f\x94\x3e\xb9\xf5\xa3\x52\xb5\x03\xea\x12\x0c\xe0\xe0\x1a\xf8\x7c\x7e\x05\x2d\xb0\xd5\xfa\x13\xf3\x7c\xb3\xf4\x33\x6c\x86\x87\x65\x8f\xf6\xbe\x3c\xa3\x79\x21\xa0\x3b\x66\x79\x63\x46\xe1\x57\x24\x22\x2e\x88\x83\x6b\x00\x0f\x5b\xfc\x7d\xee\xd2\x8a\xd6\x02\x91\xe2\x0c\xc5\x0a\xaf\x5a\x94\xfb\xf7\xeb\xb3\xac\x96\x1e\x6c\x94\x56\x19\xc5\x03\x29\xd0\xed\xdb\x20\x0e\xae\x81\xc4\xef\xd6\xd9\xe8\xf7\x02\xdf\x63\x36\xd0\x93\x56\xed\x49\x4b\xb6\x10\xa2\x0e\x47\xcb\x68\xea\x4e\xfb\x3c\xec\x24\x79\xdc\xe4\x8e\xd0\x00\x88\x83\x4a\x92\x01\x36\x18\xb4\xec\x38\x55\x03\x24\x6d\x98\x0a\xf8\xcf\x64\x70\x92\x77\x18\x5f\x0f\x3a\x7f\x10\x35\xda\x30\x1f\xe2\xd5\x8c\x57\xb1\x7a\x35\x74\x8f\xe6\x10\x6a\xfc\x03\xe2\xe0\x1a\x88\xec\x61\xf9\xac\x89\xb1\xa1\x89\xa3\x9c\x75\x6b\x6c\xce\x60\x7a\x21\x67\x6f\xf4\x41\x8d\x49\x0c\xd1\x88\x1a\xfd\xb0\xd8\xd2\x2a\xd4\x74\x12\xc0\xc1\x35\xc0\x55\xc2\xdc\xc4\xb3\xf6\x5d\x92\x67\xf8\x9e\xa5\x31\x63\x39\xf9\x5a\x77\xd0\x3e\x1a\x57\x9c\x75\x44\xd4\x63\x3a\xca\xfb\x32\x50\xc3\x41\x10\x07\xd7\xc0\xa3\x48\x8b\xeb\x44\x5e\xb1\x01\xfe\x6f\xf7\xda\xd9\x71\x56\x3f\x33\x62\xe1\xf6\x7d\x6d\x4d\x7d\x2a\xbf\xd9\x92\x6c\xdc\x97\xa9\x8a\x88\x0b\xe2\xe0\x1a\x30\x66\x90\x60\x1f\x3a\x97\x1b\x2c\x93\xf4\x69\x3b\x49\x6d\x67\xbf\x3a\x5a\xa1\xb8\x72\x5e\xfe\xfd\xe8\xac\x46\x39\xdd\x37\xa9\x5b\x08\x0d\x80\x38\xe8\x3d\xe0\xf4\xef\x36\x18\x64\xa1\x4e\xb7\xc1\x5d\xb1\xc6\xac\x2e\xbf\x16\x3f\x85\xfd\xb0\x34\x70\x16\x68\x94\xdf\x12\x71\x52\x52\xd9\x97\x3e\x87\x89\x17\x9e\xb1\x1a\x34\x99\x83\xb0\x94\x20\x0e\xd9\x06\x47\x87\xc7\x8f\x10\xfc\x7e\xe5\xf1\x2e\xf1\x75\xf9\xb7\xd2\xdf\x89\x12\x28\xe2\x41\x53\xe9\xfc\xe9\x9f\x42\x8f\x57\x22\x30\x0b\x48\x10\x91\x41\x5c\x88\x1c\x0a\xc6\x3f\x23\xb3\xfc\xee\x8c\xcf\xb6\xb1\x7d\x18\x35\x76\xdf\xda\x91\xe0\x6d\xea\x1e\xd1\xaf\xba\x7b\x62\xea\xe8\xc6\xc7\xb4\x87\xe3\x18\xed\x3c\x88\xc8\x20\x0e\xf9\x69\x84\x05\x12\x05\x07\xfd\xa8\x9c\xfd\x1c\x7b\xe9\x42\x99\x50\x4c\x5c\x9c\x5f\xc5\xb7\xfd\x36\x81\xc3\x4d\xa3\x25\xbf\x07\x2a\x5e\x31\x90\x0d\x66\xfe\xa6\xd0\x9e\xbf\xcb\x8a\x73\xfb\xfc\xdd\xe5\x4e\xea\x9b\xd5\x33\x83\x63\xef\xd7\xa4\x76\x0f\x2c\xfb\x87\xaa\x5f\x2d\x71\xad\xfe\x6d\x83\x4b\x9d\xa7\x72\xb1\x4a\x06\x65\x4a\xe3\xb5\x55\x0f\x2f\xbf\x51\x9c\xe7\x38\x44\x6b\xfa\xb9\xe1\x6c\x2d\xba\x58\x6b\x65\x6a\x48\xfa\xf7\x89\x2a\xb3\x77\xb2\x32\xcf\xac\xd4\x0f\xaf\xaa\x7c\xfa\x3a\x8a\x97\x37\x12\xab\xa4\xf6\xe7\x45\x85\x7a\x9f\x9d\x27\x47\xce\x7c\x62\xf0\x7f\xcd\x06\x83\x86\xf6\x97\x0d\x96\x46\xb2\xc1\x4a\x6b\x23\x9c\xad\x85\xd6\x7c\x7f\x54\x64\x37\xe2\xae\x48\x84\x84\xef\x3d\x34\xf3\x40\xc1\x5e\xdc\x65\x69\xb4\xf5\x62\x63\x38\x8b\x3b\x12\x64\x1b\x91\x6c\xf0\x39\x62\xf4\x9e\x99\xf1\x16\xc2\xe8\x88\x5b\x76\x13\xc7\x99\x16\x69\x43\x0e\xdb\x97\xcb\xa4\xe3\xae\x54\x09\xdc\x9c\x65\xbf\x2a\x75\x26\xdb\xb2\xc8\x36\x38\xee\x1e\x63\xb6\x97\xf6\xea\xce\x35\xb2\xe9\x15\x13\xab\x12\x81\xa0\x4f\x3f\xad\x15\x6d\x36\xcb\x63\xda\x94\x7c\x4d\x44\xfb\xcf\xa2\x06\x5f\xae\x11\xd9\x06\xff\xf2\xd8\xf5\xc1\xed\x77\x65\x96\x7b\x5d\x29\x3f\x6c\x7d\xe3\x36\xa3\x1c\x66\xc9\xeb\xd0\xc2\x9e\xf1\x0d\x95\xe9\x23\xcd\x21\x9a\x33\x19\x2d\xb2\x0d\xce\xfe\x3e\x1e\xf8\x24\xf0\x18\x5b\x90\x57\x38\xbf\x1e\x7f\xc4\xeb\xeb\x96\xd3\xed\xef\x1e\x14\x4f\x92\x8e\x6f\xa3\xc7\x16\x6d\x9c\x41\xed\xbf\xc1\xff\xa6\xa1\xd3\x12\xdf\x5b\x77\x9b\x7b\xcf\x3b\x5e\xbe\x25\x79\x6b\xc8\xcd\xd9\xe7\x71\xd9\x33\x25\x62\x6a\x81\x27\xde\xc8\x97\xa4\x13\x53\x37\x6f\xdf\x10\x5a\xa4\x00\x38\x78\xe2\x63\x24\xb7\x2e\x3e\x88\xff\x30\x6e\xa3\xc1\x94\x18\xf3\xfd\x69\x07\xb5\xc7\x87\x3f\x0b\x6f\xe5\x52\x37\x19\xec\x63\x23\x16\x38\xd1\xa0\xba\x73\x00\x87\x74\x45\xe5\xe4\x42\x6b\x84\xa5\xef\xea\xda\x7e\xd3\xba\x15\x53\x9d\x44\x17\x5d\x5b\xb9\x36\x1b\x67\xa1\xfd\xb7\x16\x5e\x69\x36\x55\x4c\xa8\x72\x0b\xc0\xc1\x13\x1f\x01\x49\x6c\xec\x37\xb2\x60\xca\x3e\x82\xa5\xf6\x7b\xdd\x77\x72\xd4\x53\x28\x8c\xd9\x97\xbd\xf4\xa7\xae\xd4\xad\x9d\x2f\x8b\x22\x42\xc4\x05\x71\xf0\x4e\xbb\x84\x7d\x2e\x9d\xa5\x5c\x17\xb1\x25\x72\xb4\xec\x3f\x7b\xd3\x06\x60\x54\x89\x32\xe0\xce\x69\x5e\x3d\x2e\xf8\xca\x4e\x5c\xbb\xfa\x0a\xe1\x81\x40\x1c\x54\x1f\xfe\xef\x36\x18\xf4\x83\x3e\x4d\x02\x82\xdb\xef\xdb\x3e\x98\x8c\xee\x3e\xa8\x78\xd8\x80\x9a\x6a\x28\xf4\x82\x4d\xbe\x9b\xf1\x7d\xac\x9e\x51\xe6\x70\x7d\xd3\x4f\x2e\x48\x02\x20\x0e\x2e\x81\x5f\x3c\x07\x3d\xb5\x6b\xe4\xa1\x7b\x0e\x7b\x3c\x71\x07\x66\x8c\x12\x6f\x9f\xd3\x36\xf5\x8c\xbe\x1b\x56\xfd\xa0\x29\x8a\xdd\xf5\x1a\xda\xb2\x03\x70\x70\x09\x8c\x94\x71\x86\xf7\x5b\xda\x36\x1c\xbf\xdb\xe0\x30\xcf\x1b\x92\xb7\x1d\x0c\x6c\x55\x6c\x56\x7c\xe9\xb4\xdc\xd4\xf7\x98\x34\x11\x0b\x11\x17\xc4\xc1\x25\x50\x72\xfe\xf5\x2d\x3c\x9e\xdc\x2d\xb6\x3b\x0f\x5e\x5a\x15\xcb\x0f\xe6\xd0\xf6\x16\x46\xcc\xe1\xf9\xb0\x2a\x4a\xe9\x0d\x9b\x47\x40\x12\x00\x71\x70\x09\x60\x9a\xf9\xf8\x93\x86\xbe\x4a\xff\xa0\x5a\xc5\xfa\x16\x77\x32\xe6\x73\x57\x98\xa2\xb0\x2e\xc7\x84\xc8\xae\x0e\xde\xc7\xfe\xde\x70\xa8\x45\x00\x80\x83\xea\xc3\xff\xdd\x06\x83\x5e\xae\xa7\x49\x60\x3c\x8f\xb7\xc4\x3a\xcc\x29\x43\xcd\x87\x95\xf3\x88\x78\x9f\xa4\x5d\x4f\x93\xf3\x87\x5e\x98\x4f\xcb\xb5\xe9\xab\x72\x8a\xb4\x51\x88\xa1\x83\x38\xb8\x04\x84\xa5\xe9\x47\x9c\xdf\x2d\xcc\xf8\xfd\x48\xef\x2f\x51\x16\x9e\xbd\x96\xf7\x28\x7d\x94\x3a\xe9\xa3\xcc\x55\x9c\x87\x97\x4f\x2a\x50\xa0\xf3\xf6\x00\x0e\xe9\xa2\x94\x69\xf4\x3f\xdb\xcf\x4a\x9b\xde\xce\x6a\x12\xdf\xd5\x2d\xb1\xd7\x6a\x7b\x8b\x41\xc4\x84\x6e\x96\xae\x6e\xbb\x96\x20\x57\x01\x9d\x5f\x07\x71\x70\x09\xf4\xed\xbd\xad\x28\x9c\xb9\x19\x89\xf9\xa6\x27\x98\x93\x25\x2f\xc9\x44\xa2\x6b\xe8\x9a\x00\x35\xf3\x23\x97\xd1\xeb\x02\x6e\x52\xd0\x01\x5e\x10\x07\x97\x40\x25\x39\x1a\xed\xf1\x65\xa2\xef\xe5\xbf\xd5\xa9\x0e\x14\x5d\xb9\x04\x85\x64\xee\xc6\x13\xbb\x54\xa2\xaf\x8f\xf8\x96\x1b\xf3\x35\x20\x96\xbf\x20\x0e\xaa\x0b\x05\xd8\x60\x50\xa6\x3b\x4d\x03\x0d\xb5\xbd\xa2\x12\xa3\xa9\x57\x55\xb6\x59\x44\x8d\x0f\x94\xfd\x0b\xfc\x6a\x9e\x8e\x2d\x59\xac\xf1\x70\x5b\x93\xb9\x31\xa6\xcc\x23\xc6\x0e\xe2\xe0\x1a\x10\xdb\xe4\x72\x65\xf2\xb1\x73\x51\x4b\x1d\xfe\x96\x59\x5c\x59\xe2\xbb\x76\x72\xa5\xc6\xc0\x24\xe3\x36\x55\x9d\x79\x26\xb3\xb2\x3f\x22\x2e\x88\x83\x6b\xc0\x71\x4f\xe2\x9d\x24\x45\xd8\x9d\x93\xeb\x9f\x67\xe4\xe8\xbd\x98\x8d\x05\x7a\x68\x4f\x0c\x0e\x47\x54\xb0\x8d\x17\x1e\xb6\x18\x43\xb5\x1c\x20\x0e\xae\x81\xaf\xdf\x7e\x45\x97\xeb\x2e\xf4\x56\x46\x5f\x0a\x70\xb4\x98\x4e\xf8\xca\x58\x8c\xaf\x70\xec\xfd\xc0\xd6\x77\xc5\x99\xc1\x83\x83\x12\x11\x17\xc4\xc1\x35\x90\xe2\xa5\xcc\x96\x86\xa3\x78\x14\x3a\x77\x09\x77\xfe\xcf\xd6\xb3\x86\x95\xdb\x65\x7e\x32\x3f\x2b\xe9\x2f\x47\x0f\x73\xcd\x8a\xea\x22\x34\x00\xe2\xa0\xba\x50\x80\x0d\x06\x2d\x3b\x4e\x3d\x15\xc2\x42\x29\x14\x7d\x5f\x9d\xef\x8e\xdb\xb9\xdb\xec\xa3\xf7\xb7\x5a\xae\x6b\x2d\x55\xe6\x95\x18\xb4\x1c\x5b\xb3\xf7\x4e\xba\x68\x43\x3b\xe1\x00\x0e\xa9\xef\x42\xa8\x5a\x21\x5a\x83\x39\x4b\xfb\xb4\x30\xd6\x4c\xff\x39\x5a\xf4\x27\x82\x12\xb4\x95\x49\x45\x34\xbf\xc4\xf6\xb5\x69\xf2\xa1\xee\x6c\x20\x0e\xae\x01\x41\xdd\x03\x8e\x9b\x49\x7c\xfe\x9b\xb2\x63\xc3\xf2\xe7\x5e\x49\x3b\x3d\xbb\x9e\x89\x7f\x32\x12\x8b\x73\xbd\x05\x5f\x75\x91\x1c\x15\x4a\x5d\x00\x0e\xae\x81\xe5\x3e\xf9\x3e\x05\x74\x3b\x7d\x66\x74\x8d\xde\x01\xdb\x2c\x97\x1a\x6a\x21\x3a\x36\xe3\x38\x39\xc3\x4b\x64\x45\xb9\x22\xca\xd0\x3f\xc3\x20\x0e\xae\x81\x25\x76\xbc\xb4\x6d\xfa\x7e\xbb\xaf\x0f\x36\x89\x66\xde\x10\xe6\x5e\xba\x79\x73\xd9\x02\x37\xed\x55\xec\xe4\xbb\x69\xa9\x0a\xc9\x12\x84\x06\x40\x1c\xf4\x1e\x00\xd8\x60\x90\x85\x3a\xdd\x06\x1f\x74\xf2\xb3\xa9\x1e\x92\x90\x37\xe5\x7f\xb8\xb3\xdb\x20\xb4\x89\x6b\x24\x4a\xa5\xb9\xf5\xba\x66\xa5\x3e\x39\xc4\x86\x89\xd5\x05\x61\x29\x41\x1c\xb2\x0d\xce\x2a\x24\x18\x79\xe8\x94\xbb\xaf\xff\x01\xab\x66\xad\xaa\xb0\xee\x3d\x4a\x1e\xa1\xd4\x62\xec\x0f\xbe\x64\x61\x53\xfd\x3b\x77\x30\x11\x91\x41\x1c\xb2\x0d\x0e\xe5\x1d\x96\x1c\x09\x89\x63\xb9\x2c\xf6\x60\x2e\xa1\x6d\x67\x5b\xad\x92\x56\xd3\xf7\xc9\x83\x56\x0b\x83\x74\x54\x2e\x09\x15\x0c\x44\x64\x10\x17\x22\x87\x03\x7b\x1a\x18\x99\x24\x85\xbf\x06\xa7\x48\x2f\xfd\x16\xf0\x3c\xda\x31\x7e\x17\x80\x7f\x4d\xc4\x84\x8e\x70\x70\x4d\x7b\x53\x74\x4b\xee\x13\x1d\x64\x83\x5b\x32\x48\xea\xf8\xae\xc8\x36\xcf\xf5\xe8\xfb\xa2\x31\x1e\x17\x6e\x1b\x68\xcd\x9e\x8f\x2f\xa9\x08\xcb\x76\xa1\xf0\x72\x34\x61\xff\xdb\x06\xd3\x38\x19\x71\xec\x3d\xf9\x7d\x50\x1a\xf3\xfe\xcf\xa2\x89\xc1\xd0\x9d\xfd\x2f\x06\xae\xe8\x47\x3e\xb6\xd4\x25\xcc\xd4\xc9\x35\x87\x7f\x6f\x55\xba\xde\x25\x9f\xbd\x76\x51\xe5\x42\xc4\xbe\xbe\x5a\xea\x72\xcf\x97\x9f\xed\x75\x28\x75\xb4\x01\x89\x2b\xed\x47\x99\xb2\x87\xef\xff\x6b\x36\x18\x34\xb4\xbf\x6b\x83\x91\x6c\x70\x45\xac\x53\x64\xe6\xdd\x22\x0b\x9e\xbb\xaf\xf4\x12\x92\x2f\x6d\x52\xdf\xeb\x16\x38\x27\x90\xb8\x2b\xcd\xcc\x14\xbf\xaf\xf6\x78\xf9\x2c\x6c\x30\x8a\x2a\x52\x45\x32\x65\x40\x57\xa1\x94\xce\x31\xe9\xe8\x6e\x86\x80\xf8\x24\xd7\x84\xd6\x49\xe8\xe0\x8f\x5f\xf7\xd6\x96\x09\xcf\x95\x1c\x4d\xe3\x9e\xc9\xb6\x2c\xb2\x0d\x2e\x5a\xc8\x35\xdc\xaf\xc3\x4b\xfc\x65\xf5\xb6\xe9\x8a\xec\xe5\x49\x3e\x19\x7e\x5f\x0a\x93\x46\x82\x25\xb3\xa5\x3a\x3d\x0e\x3d\x9c\x33\xd9\x96\xd5\x46\xfa\xd8\x1f\x4c\xa8\xd7\x5c\xde\xe0\x79\x95\x0b\xae\x67\xaf\x3f\xfe\x13\x2e\x5f\x8c\x27\xcb\x67\x82\x45\xb1\xa7\xc3\xcb\xe1\xef\x26\x73\x16\x3b\xee\x72\x81\xc8\x36\x98\x50\xc2\x51\x8f\xd2\x62\x68\x31\xa8\x4e\xa1\xc0\x3d\x8e\x6f\x69\x9e\x18\x6d\xee\x95\x3d\x96\x6a\x8e\xc2\x74\x53\x7c\x67\x29\xef\x99\xd9\x60\x90\x86\x4e\x4b\x7c\x04\x6a\x66\xbd\x8a\x02\x95\x7e\x29\x2e\x09\x06\xf9\xd5\x4f\xdf\x96\x57\x6a\xae\x32\x47\x71\xf9\x2b\x3c\x11\xb1\x7c\x45\xf9\x12\xaa\xb0\x02\x71\xf0\xc4\x47\xd9\xae\x40\x28\xe7\x9d\x3d\xbd\x4b\x9c\x31\xfe\x2e\x31\x73\xef\xd2\xd3\xe0\x30\xd9\x30\xa7\x12\x46\x6c\x32\x89\xc3\xab\xf8\x23\x88\xb8\x20\x0e\x9e\xf8\xd8\xeb\x23\x26\x4d\x63\x19\x4b\x06\xeb\x66\x94\x3c\x22\xf0\x2b\x8e\x53\x88\x3e\x8a\x3d\x57\x52\xc3\x1e\xf1\xec\xc9\x38\xf1\x5a\x84\x4e\xf0\x02\x38\x78\xe2\xd3\x62\x5f\x77\xbd\xb7\xbd\x78\xc7\xe9\xb6\xb9\xf1\x84\xd1\x9c\x5b\x36\x5b\xa3\x8b\x84\x91\xb6\x7d\x47\x4f\x8c\x5a\x6c\x74\x38\xb4\x60\x07\x71\x21\x32\xff\x6c\x71\xe9\x78\x65\xd4\x35\xfd\x3a\x1d\xf1\xf7\xec\xad\x03\x94\xa5\xf2\xe9\xe1\xa8\x9f\xeb\x06\xac\x1d\x0b\x87\x97\x2d\x99\xaa\x7a\xb1\x5c\x11\x1e\x08\xc4\x41\xb5\xc1\xff\x6e\x83\x41\x3f\xe8\xd3\x24\x70\x8d\x4e\x11\x97\xf5\x3c\xf1\xf3\x60\xd9\xa7\xa2\xc7\x73\x06\x2f\xbe\x0f\xb9\x6f\x7b\xe1\x36\xd5\x2f\xab\xaa\x95\xcb\x64\x9a\x41\x87\x8c\x41\x1c\x5c\x02\xbe\x76\xb8\x74\x26\x45\x7c\xa1\x11\x7a\xd1\xcc\xa6\x57\x74\xb2\x7a\xf8\x1e\x06\x74\xc9\x9c\x44\xf5\x52\x61\xe3\x45\x0f\x96\x42\x65\xe7\x20\x0e\x2e\x81\x3b\xb5\xd3\xbd\xf3\x8b\xe5\x4a\x7a\x0d\x8f\x6f\xae\xeb\x86\xf1\x7d\x5c\x20\xe4\x48\x9c\xef\xe2\xbc\xae\xe7\x38\x55\x4b\xfd\xd4\x1c\x11\x17\xc4\xc1\x25\xd0\xad\x6a\x6a\xf5\x3c\x95\x61\xb0\xf7\x79\x4f\x6e\xfb\xde\x4d\x19\xc2\xb2\xfc\x17\x98\x03\xd6\x0d\xd8\x5d\xaf\x82\x64\xe3\x23\xa0\x73\xf1\x20\x0e\x2e\x81\x2f\xe6\x81\x09\x33\xcd\x73\x34\x7c\x4f\xe9\xbc\x8f\x82\x3d\xd4\x74\x53\x0b\x0c\x1d\x14\x1c\xe3\x06\x57\xe2\x0f\x6f\x1e\xa0\x40\xe5\xe1\x20\x0e\xaa\x0d\x56\xfd\x57\x09\x80\x5e\xae\xa7\x49\xc0\xe6\x22\x5f\x8e\xc4\xb3\x34\x85\x1b\xde\x06\x04\x56\xd4\x06\x6f\x5a\x5e\xf1\x0a\x10\x15\xf4\xfa\x4c\x46\x76\xfd\xa8\xdd\x7c\x3f\x88\x18\x3a\x88\x43\x2a\x35\xa8\x7b\xa0\x64\x93\x83\xe2\xcf\x81\x66\x80\xc9\xb9\x9e\xb1\x75\x7b\xbb\x27\x23\x7d\xc9\x29\xa3\xba\x25\x49\x7f\xdd\xa4\x37\x02\x2a\x35\x00\x70\x70\x09\x94\xe8\x2e\x3b\x2d\x7e\x52\x2c\x18\x55\x5d\xfc\xf9\xbb\xe1\x5a\x57\x34\x6e\x29\xfe\xaf\x81\x5b\xba\xb5\xb4\x7c\x5c\x15\xb6\xfb\xd0\x9f\x61\x20\x0e\x2e\x01\xec\x2c\x9a\x9a\x2c\xe9\xa4\xc0\x4e\x79\x54\xdc\x9d\x9c\xae\xc2\xb9\xb0\xec\xb7\xac\x0c\xee\xde\xba\x82\x38\xba\x93\xa6\x14\xa4\x88\xb8\x20\x0e\x2e\x81\xd2\xfc\x24\x34\xd4\x23\x3a\xfa\xe2\x19\xa7\xd0\xf0\x78\x59\xf6\xa9\xd1\xaa\x1f\x71\x1b\xf9\x53\xb7\xd6\xcb\xc7\x06\x99\x32\xab\x11\xcb\x5f\x10\x07\xd5\x04\x02\x6c\x30\x28\xd3\x9d\x7a\x28\xc4\x4c\x7f\x78\xc5\xf6\x3a\xb5\xbb\x12\xfa\x8e\x7b\xf9\xec\xf6\xa2\x7d\x79\x88\x5b\x5c\x9c\xff\x37\x1d\x9c\x6a\xd2\x7a\x3c\x09\xe8\x50\x08\x80\x43\xea\xba\x60\x54\xb7\x89\xe6\x33\xf3\xf6\x13\x9e\xe7\x97\x4a\x52\xed\x67\x1c\x6e\x1c\xaf\x8e\xc7\x47\xa7\x56\xc4\x2e\x57\x08\xde\x97\x86\x0e\x98\x82\x38\xb8\x06\xbe\x8e\x93\xf2\xa2\xae\x3e\xe5\x9f\x9d\x78\x38\x8a\xa3\x66\x7f\x3f\xe5\xf1\xbb\x37\xfb\xdd\x18\xf5\xf7\xb1\x2f\xb1\x7e\x3c\x7e\xa5\x0e\xd9\x55\x00\x07\xd7\x00\x0a\xda\xdd\xbe\xdc\xe1\xe6\x58\x27\xc9\xa9\xc6\x1f\x8c\x6d\x3a\x33\x83\x6f\xa5\x88\xf1\x99\x13\x1e\x06\xdc\xfd\x9d\xab\x12\x25\x8d\x88\x0b\xe2\xe0\x1a\xb8\xa3\x4d\xbb\x3a\xa3\x11\xb6\x17\xef\x7a\x53\xf9\xe0\x9a\xd7\xab\x26\x85\xd8\xf5\x44\x2f\xc5\x79\x15\xd4\xf3\x9c\xa1\x6b\x96\x13\x08\x0d\x80\x38\xa8\x36\x58\xfb\xdf\x35\x00\x5a\x76\x9c\xa6\x01\xed\x1e\xec\xa7\x61\x73\x5f\x8f\x39\xf8\x44\x3d\x2f\xbe\x7c\xdc\x9f\xf4\xb1\xa9\xdc\xfb\x88\xbe\x9d\xc1\x34\xcf\x33\x36\xcf\x1e\x6a\x39\x05\xe2\xe0\x1a\x70\x37\x61\x68\xba\x47\xdc\xb0\x89\x52\xff\x8c\xb4\xcd\xc1\xe6\xca\xf8\xf6\x3e\xb9\x9b\xef\xeb\xb8\x66\xc5\xee\x08\x8a\x01\x03\xe8\x54\x08\x88\x83\x6b\xc0\x25\x7b\x5d\x6b\x96\xb6\xe9\xf1\xb4\x4b\x2c\x1b\x41\xf3\x50\xe2\xbd\xcf\xe6\xc7\x6e\x1a\x51\xef\xb6\xd5\x69\xe5\xf7\x55\x4b\x04\xa0\x66\xe2\x00\x0e\xae\x81\x24\xd9\xdc\x65\xea\x4f\x84\xd7\x75\xdc\xcb\x08\x7c\x38\x08\x24\xfe\x6c\x86\x95\x30\xa5\xde\xac\x7a\x35\xe3\x99\x36\x38\x66\x69\x85\x88\x0b\xe2\xe0\x1a\xe8\x08\xcb\x6e\x31\xa5\x91\x7b\x55\x97\xe8\x55\x64\xb4\x4c\x1d\x37\xfb\xb5\xf8\x51\x50\xc0\xc9\xd4\x5b\x6f\xaa\xa7\x7b\x5f\x26\x83\xa0\x2b\x43\x01\x1c\xf4\x1e\x00\xd8\x60\x90\x85\x3a\xdd\x06\x5b\x7b\xa8\xde\x66\x8d\x8a\x29\xa4\x7a\xcb\x52\x9f\xd6\x9a\xf7\xe9\x47\x1a\x21\xe1\x86\x50\xb9\x6c\x1c\x37\xab\x9b\x97\xf4\x78\x39\xc2\x52\x82\x38\x64\x1b\xac\x92\xb9\x7c\x39\x2d\x50\xe2\xe8\xa5\x99\xfa\x94\xe9\xec\x23\xab\x31\xbb\x1b\x98\x23\x56\x2b\xdf\xda\x74\xfd\x7f\x96\x75\x3b\x3e\x87\x5a\x89\x03\x38\x64\x1b\x6c\x52\x10\xc4\x8d\x65\x33\x64\xe5\xb1\xf9\x5c\xef\x7b\x69\x15\x6a\x4d\xe9\x40\x20\x7a\x5d\x66\xc1\xdd\x9f\x8d\xa9\xb5\xc7\xd5\xd0\x77\x06\x71\x21\x72\x44\xb0\xa7\xd1\x24\xd6\x82\x65\x3b\x19\x6e\xa3\x28\x3d\xa9\x5a\x58\xf0\xca\x48\x3f\x8f\x9e\xb8\x58\x39\xff\x2e\xcd\x77\x82\x7b\xaa\xcc\xc6\x1e\x90\x0d\x9e\x37\x3f\xbc\x3a\x63\x63\x3e\x51\x74\x19\x8d\x61\x60\xea\xde\x78\xae\x51\x77\x81\x47\x28\x76\xa4\xdc\xe1\x0f\xab\x13\xbd\xc9\x17\x7f\xdb\xe0\xbe\xf2\xcc\xa5\x6b\xd7\x8d\xa9\xce\x99\xcd\xb4\x9b\x3c\x0c\x46\x77\x1f\xc9\x77\xc0\x26\x11\xbb\x2c\x6d\x74\x64\xd0\x3a\xba\xc5\xfa\x17\x5a\x1e\xd6\xfb\x67\xcb\xf4\x86\x6f\xf4\x5b\xd9\x34\x15\xa3\xdd\x8a\x57\x75\xb2\x8d\xcf\x2d\xb6\x2a\x24\x54\x04\x06\xbd\x54\x6d\x5c\xfe\x6b\x36\x18\x34\xb4\xbf\x6b\x83\x91\x6c\x70\x51\xeb\x75\x9b\xf7\xb8\xf7\xbe\x0e\x9c\xcb\x55\x9f\xc9\x61\x25\x59\xe7\xcd\x16\xef\x0e\xbe\xb1\x8d\x51\xf6\x15\xc7\xd0\x8d\x7e\xfe\x2c\x6c\xb0\x34\x92\x0d\xb6\x16\x99\x9f\x7b\x6f\x61\x7e\xd9\xf9\x90\x34\x42\xaa\x98\xe0\x19\xc9\x3b\xbc\x6e\x1c\x72\x5a\x91\x87\xa6\xd7\x29\xf5\xae\xf1\xa8\x9f\xc9\xb6\x2c\xb2\x0d\xfe\x8c\xf3\xf3\xe7\xe2\x26\xab\x34\xc6\x2e\x96\x16\xab\xb6\xb4\x48\xb5\xe6\xb9\x5a\x81\xc4\xaf\x8d\x9c\xb7\x2c\xf1\xd9\x9b\x87\xce\xe4\xbe\x36\x69\x64\x1b\xbc\xa0\x93\xbe\xa5\x40\xe1\x91\xf8\xce\x67\xc5\xed\x6e\xe5\xfc\x4f\xca\xcb\x56\x13\xa4\x34\x57\x32\xef\xce\x48\x27\xb4\xac\x44\x6d\x9f\xc9\x68\x91\x6d\xf0\x34\xc3\x00\x27\xb6\xf2\xf3\xd7\x37\xeb\x4d\x9e\x36\xdb\x78\x7e\xfd\x12\xcd\x81\x95\xd1\x90\x90\x41\x17\x4e\x63\xf8\xcd\xed\xe1\xbd\x33\xb3\xc1\x20\x0d\x9d\x96\xf8\xb6\xb1\xfb\xf1\x7b\x5b\xc9\xdc\x5a\x25\x66\x9c\xe4\x28\x9c\x7b\x14\xde\xd4\x32\x1e\x76\x4b\x2e\x30\x1c\x87\xb5\x61\xd4\x99\x41\xbb\xb6\x20\x0e\x9e\xf8\x88\x3a\x3b\xda\x25\x66\x0d\xa7\x79\xcd\x3f\x11\x63\xf6\xce\x7d\xea\x08\xb7\xdd\xf8\x24\xa9\x62\x49\x31\x17\x21\xb4\x65\x6b\x04\x1d\x5b\x04\x71\xf0\xc4\x47\xc9\xac\xc8\xa1\x35\xfe\x25\xa7\x80\xc1\x48\xbe\xf0\xdc\x98\x37\x8b\xdc\x5b\xad\xc3\xda\x06\x8a\xfc\xb8\xc3\xae\x93\x09\x45\xe8\x78\x15\x88\x83\x27\x3e\xfe\x00\xb2\x88\x5f\xb9\x25\x04\x0f\x94\x4b\xc6\x04\xa9\xfb\xe2\xd1\xaf\x10\x75\x72\x6c\x77\x27\x7d\xd8\xbc\x93\x41\x37\x23\x04\x25\x54\x10\xf7\x7f\x09\xea\xef\xb8\xf3\xd7\x54\x26\xe4\xc9\xba\x1f\xbe\xc4\xba\xee\x66\x80\x41\x32\x4b\xa2\x70\xf5\x59\xf0\x35\xe7\x41\x72\xef\x0b\x52\x01\x8f\x87\x47\x10\x1e\x08\xc4\x41\xb5\xc1\xff\x6e\x83\x41\x3f\xe8\xd3\x24\x60\x9f\xff\x20\x54\x8c\x03\x87\xff\x69\x88\x20\x2b\x87\x5f\xaf\x3b\x4e\xa1\x22\x6f\xa6\x03\x7b\xb9\x71\xfc\xd6\x8d\x03\x5a\x1f\x68\x3d\x09\xe2\xe0\x12\x90\x75\x7a\x26\x20\x95\x4e\x70\x9e\xf7\x96\x90\x85\xe6\x63\x36\x95\x93\xb9\x20\xfc\xec\xaf\x7e\xde\x36\x9d\x4c\x55\xd7\xd3\xc9\xa1\xe2\x3d\x10\x87\xd4\x75\x8c\x70\x3b\x50\xa2\xee\xc6\x15\xd5\x84\x90\x59\x9b\x9d\x44\x15\x5c\xfb\xae\x07\x43\xd9\xce\x28\xa6\x6f\x8e\x57\xf1\x83\x6e\x40\x7d\x51\x40\x1c\x5c\x02\x18\x52\xde\x97\x9a\x0b\x03\xe2\xcd\xd4\xf5\x66\x71\x71\x2f\xab\xb8\x1c\x9d\xbf\xfd\xc6\xe0\x56\x64\xc7\x88\x86\xf6\xd5\x29\x3f\x36\x44\x5c\x10\x07\x97\x40\x6b\xde\x85\xe0\xb5\x75\x12\x92\x08\x7b\x55\xda\x70\xa9\x49\x0c\x82\x1b\x21\x07\x6c\x6d\xe7\xd5\x38\x44\xee\xb9\x9b\xbe\x6a\xa0\x47\x48\x00\xc4\x41\xb5\xc1\xff\x6e\x83\x41\x2f\xd7\xd3\x24\xb0\x13\xdf\x22\x49\xbc\x22\x1d\x75\x2d\x20\xe0\x51\xa3\x6f\xb3\x87\x65\xf5\xf5\x7c\x05\x3e\xdf\x4a\x47\xd2\x27\x6a\xdd\x5a\xae\xd0\x2d\xc9\x20\x0e\x2e\x01\xb5\xd7\x89\xaf\x5c\x77\x9a\x24\x13\x3f\x27\xec\x49\x3e\x4a\xba\xe2\x1c\x92\xfb\xfb\xf6\x9e\xea\x57\x79\xb7\x1f\x1b\x74\x9f\x64\x9a\x11\x71\x41\x1c\xd2\x61\x48\xcb\xf0\xf3\x9d\xfd\x1f\x14\x3f\x5d\xe9\x6f\x33\x62\x6c\xd1\xb9\x37\x64\x7b\x83\xb4\x03\xbf\xb6\xd6\xff\x32\xd1\x4e\x05\xe1\x2b\xe8\x30\x24\x80\x83\x4b\xc0\x4f\xa0\xf1\x8f\xe0\x03\x59\x87\xaf\x87\xc9\x44\x25\x0b\x91\x1a\x17\xec\x46\x3d\xef\x7c\x3e\x62\x66\xbf\xe2\xae\x88\x82\xb5\x0b\xfd\x29\x08\xe2\xe0\x12\x98\xdd\x88\xa6\xbf\xe1\x25\x5c\xbe\xfa\x64\x22\xd2\xda\x59\x96\xd7\xe7\x8b\x59\xef\xef\x9b\x97\xfa\x64\xe3\xb2\x32\xf0\x25\xcc\xe9\x10\xcb\x5f\x10\x07\xd5\x04\x02\x6c\x30\x28\xd3\x9d\xa6\x01\x54\x43\x91\x48\x99\x1b\x3a\x2f\xd7\xa2\x94\x77\xa9\x34\x8b\xdf\xee\x60\xef\xa1\x5c\xab\xfa\xf5\xf0\x71\x27\xd3\xd6\xb2\x4f\x6d\x3c\x62\xec\x20\x0e\xae\x81\x22\x8c\x5b\xe4\x3f\xd3\x9b\x70\x9f\x7d\x21\x14\xc1\xa4\x92\x7b\x97\xbf\x94\xa9\xf6\xcd\x86\xd3\x97\x9c\x0c\xd3\x62\x99\x9a\x6a\x13\x11\x17\xc4\xc1\x35\xb0\x37\xea\xcd\x80\x47\x64\x30\xef\xeb\x77\x57\x1e\xb3\xda\x91\xe4\x6b\xe3\xce\xdb\x37\x6c\x1f\x7a\xbe\x57\xab\x6e\xfb\xdd\xd2\x49\x42\xc4\x05\x71\x70\x0d\xfc\x62\x7b\x89\x4f\xf5\x64\x60\x33\x24\x64\xe3\xb5\xbe\xe1\x8f\xfb\xa9\x86\x49\x1e\x1c\x18\x1a\xd4\x77\xf8\xaa\x06\x72\x6e\xf6\xbb\x42\x87\x58\x00\x1c\x5c\x03\x06\x8e\x1a\x2f\x44\x89\x6b\x8e\x38\xd5\xf5\xd1\x78\x05\x65\x58\x0c\x45\x03\x1c\x9c\xee\xb2\x11\x8c\x59\xad\x4c\xa6\xea\x29\xdd\x41\x68\x00\xc4\x41\xb5\xc1\x00\x1b\x0c\x5a\x76\x9c\xa6\x81\x3e\xab\x77\x49\x1a\xf7\x34\xfa\x0b\xd7\x59\x47\xc9\xfb\xfb\x0d\xa7\xce\x5d\x5d\xd0\xb6\xad\x1d\x46\x15\xef\xfd\x4e\xe9\x76\x3f\x06\x3a\x0d\x01\xe0\xe0\x1a\xb8\xcc\x16\x72\x31\xed\x1e\xba\xf0\xca\x7c\x5e\x2f\x11\xa6\x96\xe5\xcc\xc3\x5e\x23\x2d\xfb\x4c\x59\x5a\x31\x76\x83\xc6\x6f\x12\x0f\xa1\x76\x0e\x00\x0e\xae\x01\x85\xcf\xce\x81\x21\xf7\xc8\x45\x8d\x7c\xc5\xdd\x6b\xe8\xe5\x2f\xfe\xb4\x52\xd4\x54\xfb\x4e\x1a\x2e\x48\xcd\x6d\xb9\x5b\xb4\x03\xd9\x6b\x10\x07\xd7\xc0\x60\x61\xb6\x77\xd8\x48\xf6\xde\x73\x61\x76\x03\x9a\xa3\x55\xad\xa2\x08\x8c\x48\x34\x8a\x6b\x42\x43\x0c\x6c\x0b\xee\x83\xfd\xd3\x88\xb8\x20\x0e\xae\x01\xb7\xa0\x73\x37\x6c\x87\x6a\x88\x27\x8d\xa9\x06\xbb\x77\xca\x97\x23\x86\x83\x36\x84\xd2\xf5\xac\x0b\x0c\x49\x19\x7b\xee\x8a\xf3\x22\x34\x00\xe2\xa0\xf7\x00\xc0\x06\x83\x2c\xd4\xe9\x36\x58\xf0\x27\xeb\x08\xb3\xdc\x7a\xe8\x0a\x85\x80\xf7\x54\x8b\x06\x97\x51\x6a\x8e\x10\xd1\x8e\xb8\x4a\xf5\xe8\xd5\x8c\x62\x2c\x3c\x7a\x84\xa5\x04\x71\xc8\x36\x78\xa0\x86\x71\x7b\x57\xe9\x27\xca\xd8\x18\xd6\x83\x6d\xa3\x5b\xc4\x69\xd8\xd8\xe7\x25\xc4\x33\xe5\x3a\x7e\xea\xa2\xa0\x5d\xab\x24\x45\x44\x06\x71\xc8\x36\xf8\xca\x27\xd2\x6a\x07\x46\xf7\xb9\xd7\x18\x2d\xee\x26\x24\x7d\x5d\xf8\x32\x98\x78\x35\x4e\x6c\x7c\x42\xaf\x3e\xd1\x3b\xdb\xc5\x26\x22\x22\x83\xb8\x10\x39\x69\xd8\xd3\xf0\xc1\x1a\x89\x4c\x9a\x8a\x90\x25\xde\xc9\x0d\xd6\xd5\x56\xd7\x48\x68\xc5\xb0\x4c\xc4\xd2\x9b\xee\xf9\xa0\xaf\x5e\x78\x47\x97\x10\xb2\xc1\xcf\x18\xd4\xcd\x5b\x5d\x55\x8d\xbd\xcf\x8d\x6b\x0d\x9f\xff\xfe\x25\x90\x26\xf2\xc7\xec\xb2\xf6\x93\x0c\x83\xa6\x01\xdd\x3c\xc1\x7f\xdc\x96\xae\xa2\x27\x3e\x9d\x91\xfa\x3b\x94\xfd\xcb\x83\xce\x80\xfd\x11\x15\xc1\x56\x9c\xbb\x31\x28\x07\xce\xf7\x33\x8d\x02\xa8\x65\xb3\xfe\x3e\x0f\xcb\xf2\x8b\xa9\xa1\xb3\x42\xe2\xca\x64\x06\x86\xd8\xbb\x86\x37\x54\x68\x29\xe2\x6f\x1f\x5e\xbc\xa1\x25\xed\x8e\xa5\xbf\xe6\x21\xda\xfa\x5f\xb3\xc1\xa0\xa1\xfd\x5d\x1b\x2c\x87\xd4\x4e\x98\x2a\xc6\xa5\x6f\xa3\xe0\x31\xfd\x46\x87\x28\x7b\x40\xbe\x17\x9a\x83\x21\x6f\xfe\x67\x81\xe6\x9d\xcc\x79\x32\x0f\xf3\xc2\xe4\xb3\xb0\xc1\x81\x48\x36\xd8\xe4\x6a\x0b\x95\x46\xa0\x6e\xd3\x6e\x63\x71\x89\xf4\xa3\x02\x0a\xbc\xe6\x8e\xcb\xa8\xc3\x36\xb4\x1d\x8f\xef\x78\xf0\xf9\x93\x07\x9c\xc9\xb6\xac\x38\xf2\xa5\x59\x1b\x7b\x9a\xad\xf8\x44\xc9\xb3\x5a\xcd\x7b\xb5\x99\x1c\x9c\x45\xb2\x57\x54\x3e\x85\xb4\xf0\x5f\xe5\x99\x31\x94\xf8\x20\x1a\x74\x26\xdb\xb2\xc8\x36\xb8\xfe\xe1\x33\x79\x53\x42\x3a\x9a\x6c\x33\x9e\x7c\xd6\xef\x6b\xe9\x9c\x05\x74\x2b\x0b\x2b\x9c\x23\x13\xef\xe3\xb2\x5d\x94\x30\x7e\x9e\xc9\x68\x9d\x91\x3e\xf6\x81\x52\xb7\xfc\xf0\x6d\x2c\x74\xce\xbb\xb5\x96\x26\xcb\xe5\xbc\xb9\xb7\xaf\x91\x1c\x9a\x29\x71\x7a\x5c\xbe\x46\x32\x19\x10\xb5\x77\x66\x36\x18\xa4\xa1\xd3\x12\xdf\x1b\xdd\xe0\x32\x13\xcc\xc0\x93\x92\xdc\xad\xd5\xe7\x74\xe4\x24\x1e\xa1\x3a\x94\x19\xcb\x12\xdd\x85\x5b\xeb\x68\x0e\x79\x0a\xff\xaf\x29\x0c\x80\x83\x27\x3e\x1c\x12\x6f\x13\x66\x36\x6b\x22\x6b\x6f\xc9\x3f\xac\x1b\xae\x3a\x57\x0a\x48\xca\x5c\x2d\xf1\x67\x85\x93\x6f\xd4\x15\xb8\x7a\xcb\x21\xe2\x82\x38\x78\xe2\x63\x55\xf6\x78\x18\xf1\xbe\x80\x95\xe2\x4e\xbe\xed\xaf\xee\x93\xad\x70\x1d\x81\xf0\xb8\xe7\xc5\x54\xe3\x37\x9f\x5d\x9b\xce\x78\x7a\x07\x11\x17\xc4\xc1\xff\xa7\x65\x4e\x47\x69\x93\xc6\x61\xec\xc7\xf9\xed\x5b\xe7\x55\x50\x3f\x14\x43\xa1\x12\xa2\xd0\x1c\x7d\x31\xfb\xc0\x9c\x61\x59\xe9\x33\xb4\x6f\x05\xe2\xe0\xcf\x37\x88\x7e\xa7\x2e\x72\x75\x63\x8a\x4f\xd3\xe4\xe5\x1b\x0d\x63\xb1\x35\xe1\x0f\x0a\xd6\xee\x5a\x4d\xb4\x3f\xda\x93\xa6\x9c\xe9\x71\x10\x1e\x08\xc4\x41\xb5\xc1\x72\xff\xba\xf6\x01\xfd\xa0\x4f\x93\x80\x6d\x6b\xcf\x17\xa6\xaa\xac\x34\x75\x61\xd3\xfb\x8f\xe8\x7d\x56\x04\x2e\x56\xab\x7e\x90\xdf\x6f\x91\xcc\x34\x24\xbf\xe2\xf8\x15\xea\x8f\x04\xe2\xe0\x12\x70\x65\x19\x29\x91\xa2\x94\xc4\x8f\x5a\x30\xad\x30\x13\x63\x2e\x92\xc0\x28\x68\xa0\x22\x8e\x32\xb9\xf7\x8b\xaa\x0f\xed\xab\xc6\x12\x22\x2e\x88\x83\x4b\x40\x4b\x76\x38\xed\xbc\xc3\xad\xa1\x52\x2d\xee\x84\x67\xfd\x59\x6d\xd2\x69\x33\xdd\x89\xfc\x09\x7c\xb6\xcf\x0f\x6a\x96\x1d\xdd\xbc\xa0\x8d\x7b\x00\x07\x97\x40\x5d\x1d\x99\x02\x73\x1a\x5e\x8b\x83\x8b\x86\xf4\xa3\xf1\xd0\xd5\x5e\x9c\xb0\x85\x9a\xb9\xcd\x83\x37\xcb\xb4\x54\x7e\x04\xed\x09\x88\xb8\x20\x0e\xfe\x7c\x2f\x70\xce\x7a\x95\x88\x3d\x1d\xa8\x40\x47\xe5\x2d\xb1\x47\xe1\xc5\xba\xb3\x5d\x6d\x27\x53\xd0\x6f\xe7\x10\x1a\x44\xfe\xfc\x3e\x3a\x42\x02\x20\x0e\xaa\x0d\xfe\x77\x1b\x0c\x7a\xb9\x9e\x26\x81\x44\xd3\x60\xe1\x8e\x86\xb0\xad\xc5\x8d\xeb\xd4\x64\x57\xab\xf1\xfd\xf8\x7f\xde\x55\x99\x6d\xa4\x7d\xac\xbb\x14\xad\x15\xdc\x07\x2d\xfd\x41\x1c\x5c\x02\x0d\x06\x16\x0a\x1d\xb8\xba\xad\x3a\xb5\x0d\x93\xeb\xcf\xf5\x8d\xf3\x4a\x3e\x36\x3e\x8a\x66\xb4\x3f\x58\x22\xb6\x6c\x1d\xe5\xb5\x80\x0e\xda\x02\x38\xb8\x04\x48\xbd\x25\xc3\x23\x72\x06\xa6\x3f\x38\xd1\xf2\x14\xbc\x0d\x66\xf7\x28\x65\x91\x92\x5d\xa6\x51\xfe\x12\xb7\x4b\xcf\x70\xcb\x1b\x3a\x14\x0d\xe2\xe0\x12\xa8\x8f\xea\x3a\x09\x13\x1c\xc2\x5f\x5f\x9b\x5b\x34\x20\x0f\xd3\x51\xd9\x34\x77\xd9\x22\xae\x1c\xc8\x1d\x11\x7d\x48\xdd\x78\x6c\x04\xed\x88\x02\x38\xf8\xf3\xe5\x98\xd2\x23\x13\x9c\xca\x95\x54\x55\x46\xa1\xe7\x7a\xf8\xac\xc5\x7d\x86\x9d\xc7\xc4\xfd\xc8\x45\x9b\x5c\x21\x4e\x81\xad\x33\x05\xb1\xfc\x05\x71\x50\x4d\xa0\xf8\xbf\x5b\x20\x50\xa6\x3b\xb5\x3d\xd2\x31\x1f\x5d\x47\x1d\xf1\x3e\xc5\x70\x39\xdb\x6b\x5a\xa5\x31\x7c\xec\xe7\x07\x6e\xcf\xc7\x29\x63\x1a\xe9\xdb\xf5\x27\x8b\xa0\xbb\xe8\x40\x1c\x5c\x03\x39\xb3\x79\xd6\x29\xbb\x92\x3a\xe4\x22\x6d\x68\x8e\xd5\xc3\x1f\x17\x3b\x8f\x0f\x66\x7e\x19\x90\xef\x3c\x38\xe6\xbb\x29\x42\x37\x83\x88\x0b\xe2\xe0\x1a\xc8\x71\xc1\x78\xf9\x3c\xbe\xf9\x7c\xc5\x1b\x6b\x02\xca\x69\x75\x5c\x51\xc2\xd9\x91\x5b\x73\xa3\x9e\xb3\x0e\xd9\x76\x7b\x81\xfe\x2f\xa1\xb8\x00\x0e\xae\x81\xe3\x4d\xff\xd5\xd7\xef\xcd\x3c\x50\xbd\x31\x88\xec\x51\xd8\xf9\x83\x3e\xce\x7f\x2a\xd6\x23\xac\xbb\x96\x8f\xc1\xf8\xad\x79\xa9\x0b\x11\x17\xc4\xc1\x9f\x2f\xfe\xdc\x30\xed\x5d\xf1\x50\x0d\xd5\x3f\x28\x04\xaf\xb3\x32\xa9\x0c\xab\x9e\x76\x77\x1e\xbc\xe9\x4a\x25\x30\x14\xd9\x94\x2c\x3e\x46\x68\x00\xc4\x41\xb5\xc1\x00\x1b\x0c\x5a\x76\x9c\xa6\x81\x50\xf3\xe6\x0e\x62\x1e\x2c\x3b\xbd\xa7\xf6\xef\xf6\x89\x3c\x15\x83\x7a\x9d\x38\x76\x82\x69\x98\x4b\x1c\x14\x49\xf4\x3e\x73\x43\xad\xac\x40\x1c\x5c\x03\x0a\xb7\xdc\x6b\x82\xbe\x7d\xb5\x1a\xa9\xba\x7f\xc7\x2f\xa7\xc5\xcf\xe1\x11\x13\x3b\xd7\x93\xbd\xba\xf2\x59\x16\x92\xe3\x67\x9d\x50\xf7\x6d\x10\x07\xd7\xc0\xb8\xdc\x83\xf2\x49\x0b\x66\x76\xc5\x2f\x9e\xaf\x79\x1f\xcf\x04\x7b\xae\x3a\xed\xc6\xc8\x60\x8a\x5a\x89\x0a\x8c\x3a\x5b\x5e\xc7\x83\x8a\x39\x00\x1c\x5c\x03\x78\x07\x29\xb8\xb3\x8a\x9b\xf7\x32\x7d\x28\x19\xa8\x8e\xbc\x97\x34\x8c\xc8\xbe\x70\xba\x79\x7a\x06\x89\x99\x1d\x26\xbe\x10\x84\x2e\x0f\x03\x71\xf0\xe7\xfb\xdc\x4f\xfe\x8a\x64\x4c\x50\x16\xe6\xd6\x38\xd5\xa7\x55\x5b\xee\x56\x4e\x61\xc2\xe6\xb5\x3b\xf6\x1d\xac\x8d\x91\xdb\x69\x97\x73\x10\x1a\x00\x71\xd0\x7b\xc0\xf9\xdf\x6d\x30\xc8\x42\x9d\x6e\x83\x5d\x1e\xb5\xce\x11\xd8\x2e\x2a\xcc\x2f\x13\x6f\x29\x58\xdd\x56\x22\x4a\x2b\x7c\xdc\xf1\xe3\xe5\x0f\x9e\x95\x8a\x04\x53\x5b\xad\x3c\x84\xa5\x04\x71\xc8\x36\xb8\x63\x08\x9f\xd0\x91\x3f\x55\x31\x19\xf5\xd0\x3b\x9c\x81\x6f\xd7\x35\x6f\xfd\x0a\xed\x5a\x59\xb8\xa9\xc3\xab\xe5\xbe\x89\xe8\x35\x44\x64\x10\x87\x6c\x83\xcb\xeb\x3f\xcd\x66\xde\xd9\x25\x30\x89\x4d\x68\x53\xdc\xd6\x10\xff\x68\xf8\xfb\x87\x37\x5e\x28\x8f\x9c\xc2\x9b\xc9\x4b\xaf\xbc\x62\x11\x91\x41\x5c\x88\x1c\x0a\xea\x3f\x23\x3f\x35\x96\xbc\xa1\xff\x8e\xdb\x71\xef\x92\x01\xc1\x58\xf1\x0f\x7b\x81\x72\xc2\xfc\x58\x8a\x61\xed\xe1\x32\x8b\x92\xef\x09\x2d\xdc\x90\x0d\x0e\x31\xba\xfe\x63\x43\xff\xc3\x93\x73\xb3\x5b\x1f\x17\xff\xc8\x87\x77\x5d\x2c\xb1\x12\x94\x17\xbf\xf1\xbb\xe2\xd2\xf7\xc7\x65\xe6\x2e\x7f\xdb\x60\xda\xa9\xa0\xab\xaa\xa3\x54\x85\x9f\x48\x5c\xde\xdd\xc1\x8e\x39\x47\xae\xd4\xf0\xd9\x39\x2b\x2b\x87\xdb\xb1\x9e\x7b\xe6\x79\x9d\xc7\x5f\x68\x02\x31\x75\x69\x14\x89\x0b\x4d\xc4\x6d\xbc\x2f\x21\x87\x33\x8d\x44\xc9\x4d\x42\x9c\x3d\x2a\x17\xda\x84\x33\x31\x9e\x7e\xe2\xfe\xcf\xd9\x60\xd0\xd0\xfe\xae\x0d\x46\xb2\xc1\x45\xf5\x1d\xd1\x7a\x53\xe7\xd1\xfb\xec\x6e\xa7\x33\xdc\x5f\x77\xf4\xe3\x4b\xb6\xca\x63\xe2\xdc\xc8\xb2\xbb\x98\x97\x61\xc2\x75\x16\x75\xab\xb2\x8d\x48\x36\xd8\xb0\xa4\xb9\x57\x0e\x75\x00\xab\xb3\xa7\xc1\xc5\x32\x94\x5a\x3e\x99\x79\x83\x24\x2f\xc6\x73\xe9\xd0\xd8\xd4\xc2\xfa\x07\x73\xfc\x99\x6c\xcb\x22\xdb\xe0\x6d\xac\x85\x25\x76\xf3\x6b\xd6\xfc\xdd\x51\x0f\x35\xba\xba\x96\x4f\xd0\x4b\x87\x15\x2a\xbc\x38\x5e\x4e\x56\x0f\xc4\x6f\x16\x84\x9e\xc9\xb6\x2c\xb2\x0d\xde\x33\x15\x9c\xdd\xd0\xca\x65\x10\x8b\x79\xfe\xd1\xbb\xce\xf4\x0e\x3e\x41\x4b\x22\x6e\x62\x66\x49\xd6\x89\x20\xbf\xc1\x65\x3d\xa7\x33\x19\x2d\xb2\x0d\xf6\x8a\x0e\xe6\x67\x32\xa3\x13\xc6\x50\xa5\xbf\xef\x66\xea\x61\xca\x97\xd0\xfc\xae\xb8\x01\x73\xf4\xe4\xfd\xbb\x9f\xb7\x71\xdc\xd8\xce\x6e\x37\x18\xa0\xa1\x53\x17\xc0\xeb\xae\xaf\x36\xb0\xd7\xb3\x09\x1d\x50\x37\xf4\xed\x4e\x5e\x56\x2b\x51\x94\x8d\x4b\xf6\xa9\x8e\x6d\x37\x37\x0a\x8f\xcd\x7d\x81\x16\xc0\x00\x0e\xe9\x38\xe4\x05\x4c\x6d\x02\x47\xad\x4b\x4a\x2b\x39\xbe\x6a\x36\x69\x3d\x86\xea\x06\x61\x56\x64\xd7\x87\xaa\xc7\xdc\x6f\xe7\xbd\xb7\x89\x85\x8e\x43\x02\x38\x78\xe2\x4b\xdb\x61\x0d\x4c\x68\x78\xfc\xbd\xbe\x94\x5c\x46\x55\x95\xd2\x72\xbb\x99\x05\xe3\xed\x5d\xa5\x0e\x7d\xca\xab\x22\xed\x2e\x19\xd0\xfe\x12\x88\x83\x27\x3e\x2a\x89\xd9\xea\x4d\x11\xd4\xd8\xbe\x8a\x67\x62\x26\xe8\x45\xbf\x42\x78\x4d\x47\x4f\xfe\x50\x4a\x5d\xa0\x58\xec\xde\x9a\x23\x87\x76\x99\x41\xdc\xff\x25\xa8\xbf\xe3\x5e\x5d\x2e\xff\xed\xc0\x54\xc8\xd1\x83\xba\xe1\xb3\xc5\x6f\xeb\x26\xdd\xaa\x9e\xe7\x58\xeb\xf0\xe0\xea\x9c\xe4\x8a\x35\xed\x07\x15\x84\x07\x02\x71\x50\x6d\xf0\xbf\xdb\x60\xd0\x0f\xfa\x34\x09\x14\xe3\x3e\x97\x5a\x6e\xfe\x2a\xca\x6d\xe0\xcb\x56\xc1\x3e\x2a\x56\x58\x4d\xfa\xa4\xdf\x7d\xe1\x22\x7d\xcb\x5c\x9d\xb7\xcf\x04\xb4\x46\x01\x71\x48\xbd\x71\xec\xde\x4a\x1a\x52\x58\xc6\x3e\x62\x9d\x76\x2c\xa9\xbd\x6d\xf1\x74\xee\xeb\x5b\xfb\xbb\x0a\x87\x51\x92\xdc\x8f\x18\x1f\x17\x67\x40\x65\xe7\x00\x0e\x2e\x01\xeb\x85\xa4\x8b\x7f\x9a\x05\xeb\xe5\x35\xec\x0c\xda\x4c\xb9\x13\xd6\x76\xae\xc4\x18\xa7\x72\xab\xab\xbf\x60\x49\x0e\x70\x70\xa4\x42\xc4\x05\x71\x70\x09\x60\x3e\xc5\x9c\x62\xa6\x4c\x13\x17\x89\xe2\x33\x7b\xab\xd9\x63\x42\xbb\x1e\x97\x20\xf4\x4b\x49\x64\x43\x78\x9d\x52\x02\x3f\x1c\x92\x2c\x88\x83\x4b\x40\xf5\x01\xfa\x47\xbe\x97\x44\x06\xbe\x4a\x82\x1d\x4d\x86\xfa\x0d\xae\xe7\x7c\x16\x94\xcb\xb4\xb3\xa2\x34\x37\xb5\x57\x23\x07\x73\x11\x12\x00\x71\x50\x6d\xf0\xbf\xdb\x60\xd0\xcb\xf5\x34\x09\x48\x10\x13\xca\xb1\x11\x76\x0a\x4b\x79\xc7\xee\x1b\xb5\xb8\xe4\x24\x0f\xc9\xeb\xc5\xcc\xbb\x18\x2a\x46\x1b\x55\xb8\x6e\xfc\x72\x40\x0c\x1d\xc4\xc1\x25\xf0\xc8\x64\xd0\x67\x59\x97\x52\x97\x6c\x50\x36\x28\x92\xd5\xc5\xaf\x6d\x9c\xc1\x5f\xe7\xaa\xe0\x86\x2a\x01\x75\x62\xc5\x48\x24\x54\x6f\x0a\xe2\xe0\x12\xa0\x93\x65\xcd\xc0\xb3\x1e\xaa\x6c\xa6\xea\xe3\x6b\xcb\x8e\x2a\x17\x21\xf3\x62\x90\xd9\x15\xcb\xff\x32\x64\xf6\x48\x9e\x34\x05\x3a\x14\x0d\xe2\xe0\x12\xa8\x55\xb7\x69\x2a\x4e\xb2\xbd\x78\x6b\x53\x48\x3a\xa3\x9c\xa5\xe0\x6a\x2b\x6a\x55\x82\xdc\xd3\x8b\x34\x1e\xc1\x9c\xb2\xab\x13\xd0\xf2\x17\xc4\xc1\x25\x10\xab\xf4\xae\xc4\xe9\x26\x0d\x85\x79\x5a\xef\xad\xd4\x1a\x3a\xa9\xa2\xad\xeb\xeb\xca\x5f\xdf\xa1\x44\xf2\xea\x38\x7e\x8b\xf9\x7c\x1e\xb1\xfc\x05\x71\x50\x4d\x20\xc0\x06\x83\x32\xdd\x69\x1a\x90\x6f\xb6\xb5\xc4\xd9\xc3\xf8\x4d\x62\xc6\x86\xcd\x7a\x8d\xa9\x2c\xe1\x06\x71\x4b\xd1\xea\xa8\xff\xe1\xf9\xcf\xae\x5f\x27\xe2\xe6\x10\x63\x07\x71\x70\x0d\x58\xb7\xb5\x9b\xb6\x7f\x61\x89\xc1\xc6\x64\xde\xc4\xf2\x19\x08\xe5\x7a\xab\x87\x2f\x9e\x9d\xff\xf1\xf5\xee\xf9\x81\x56\xdf\x68\x0e\xe8\xe7\x0a\xe0\x90\x34\x90\xc5\xee\x14\x3d\xdd\xd3\x52\xfb\x08\xcd\xd9\xc1\x50\x56\x87\xe6\x6b\xe7\xaf\xca\x4f\xac\x1c\xbf\x6b\xa8\xab\xe5\xfb\xd6\x52\x21\x0d\x00\x38\x24\x1b\x7c\x14\x27\x7c\x92\x2e\x72\x7c\x29\x4f\x6d\x3e\xfb\x0f\x53\x01\x79\xec\xab\xf2\xae\xd1\xb8\xf6\xc4\x1e\x3a\x8b\x40\xb9\xdd\x62\xc8\x06\x03\x38\xb8\x06\x34\x5b\xca\xd8\x6c\x54\xe4\x55\xe9\x94\xdd\xbb\xb6\x2d\xf0\x27\xa5\xd7\x19\x4e\xbc\xd3\xb5\xaa\x3c\x17\x07\x4c\x0a\xc3\x68\xdf\x23\x34\x00\xe2\xa0\xda\x60\x80\x0d\x06\x2d\x3b\x4e\xd3\xc0\x7b\x32\x9e\x1b\x0c\xcb\x8f\x39\x8a\xc6\x7e\xbc\x5b\xaf\xb6\x9f\xb8\x78\xfd\xbd\xdd\x32\xb9\x05\x31\xc9\x1e\x9a\x6e\x90\x0a\x1f\x74\x18\x18\xc4\xc1\x35\x40\xac\xbd\x2c\x3f\x99\xb8\x63\xf8\x90\x9c\x5e\x9d\xc0\x9b\xce\x9e\xda\xf8\xc5\xa5\x50\x9a\xf1\xc1\x8e\xea\x4d\x63\x67\x49\xd9\x8f\x88\xb8\x20\x0e\xae\x81\xd1\x03\x01\xf5\xaa\x7e\x6d\x37\xd3\x04\x32\xc5\x43\xb6\x88\xf5\x31\x6e\x19\xa9\xb4\xab\x37\x4a\x93\x78\xb8\xa4\xfd\xbe\x5f\x1a\x42\xc4\x05\x71\x70\x0d\xf8\x97\x96\xf5\x7d\xd8\xb1\x18\x0f\xfd\x16\x77\x4f\x75\x41\x65\x6e\xf7\xb2\x8d\x69\xfe\x7c\x5d\x66\x40\xc6\xaf\xf1\xa2\x18\x4c\xa8\x9e\x1d\xc4\xc1\x35\xd0\x8c\xbb\xaa\xfc\x38\x65\xc3\xe1\x5a\x80\xca\xf3\x9c\x3e\x47\xea\xf1\xb2\xe4\x8c\x4e\x01\x9f\x67\xa4\xb8\x0c\x07\xeb\x72\xa5\xe4\x08\x0d\x80\x38\xe8\x3d\x00\xb0\xc1\x20\x0b\x75\xba\x0d\xbe\x13\x43\xec\x44\x9d\x10\xc2\xb7\xdd\x45\xee\x9e\xb6\xb8\x64\x68\x20\x20\xf0\x7d\x34\x54\xac\x58\xa1\xb4\x99\xbb\xfa\xeb\x9d\x0e\x84\xa5\x04\x71\xc8\x36\x78\xa2\x25\xe1\x71\xf9\x83\xe3\x9e\x09\x59\xe3\x42\x7f\x2c\x73\x32\xb4\xa7\x68\xe2\xd7\xcb\xd0\x62\xce\x15\xce\xff\xf8\x12\xbc\x07\xd5\x06\x83\x38\x64\x1b\xfc\xb6\xf9\x04\xb3\xb6\x9f\x81\xe3\xc2\x17\x26\xbf\xc9\xc4\xa7\xda\x5e\xa2\xa8\x22\xad\x76\x75\xf6\x6b\xda\x58\x6c\x49\xd6\x81\x69\x88\xc8\x20\x0e\x39\xb2\xd7\xdb\x7c\xd9\x9a\x34\x34\x99\x45\x09\x02\x13\xad\x57\x42\x84\xbb\xba\x24\xe3\x4a\x96\x69\xd7\x3e\x3f\xdc\x57\x5c\x2d\x26\x58\x81\x6c\x30\xed\x4a\x1f\x45\xbc\xef\xeb\x59\x39\xf9\xb9\x17\xe2\xd7\xbd\x93\xcd\x2d\xcf\x6f\xb8\x91\xab\x35\xe9\x8d\xea\xcb\xf8\x35\x2b\x48\xfc\xa3\x45\x96\xc1\x57\x37\x75\xfc\xc8\xdd\x44\x5a\x43\xf2\x7c\xc5\xf6\x15\xc1\xc9\xe4\xf9\xe4\x05\x91\xd5\xa7\x6f\x87\xb2\xb4\xda\xfc\xfb\xfe\xb6\x9f\x29\x43\x9b\x2f\xa7\x0e\xb5\x8b\x32\x2e\x76\x94\xde\xf2\x7f\x8c\xb6\xd3\x31\xdd\x42\x8c\xcd\xf9\x8c\x94\x50\xb3\xce\x39\xe8\xd2\x7f\xc5\x06\x07\x61\xfe\x6f\x43\xfb\xbb\x36\x18\xc9\x06\x4b\xf3\x31\xb2\x0c\xf6\xe3\x74\x2e\xaf\x68\xcc\x85\xf7\xc9\x9a\xab\x1c\x47\x47\x5a\x7f\xb2\xf2\x5c\xb3\xa6\xcd\x0f\x1f\x23\x3a\x13\x43\x8a\xc2\x87\x64\xd1\x0c\x76\x9e\xf3\x51\xd9\xd9\xe6\x58\xe8\xe8\x64\xf2\xbe\x79\xc2\x19\xac\xf7\xd2\xed\xba\xa7\xfd\xb8\x2f\x7a\xcf\x97\x38\x8c\x5f\xe1\x67\xb2\x2f\x8b\xec\x83\x53\x69\x1b\xe9\xee\x6d\x62\x7d\x4a\xe1\xa0\x60\xc3\xa7\x36\x89\x0c\x46\xb7\xae\xc9\x39\xd9\xb0\x0b\xc2\x72\x5e\x56\xc5\xf2\x3a\x93\x56\xd1\x28\x3a\x48\x1f\x6b\x8b\x72\x21\x4c\xcf\x3e\xf9\xe9\x0b\x42\x9a\xf5\xcb\x3a\x47\x34\x1b\x33\x3b\x46\xf7\xe6\xe8\x4b\xbf\xa7\xd3\x93\xda\x28\x5b\x50\x9e\xc9\x68\x91\x7d\x30\xd3\xc2\xb9\x5b\x0b\xd9\xde\x5d\x8b\xfc\x7b\x5c\x75\xaa\x44\xfd\xab\xb7\x8c\x7e\xf8\xee\x57\x55\x26\xd0\x5e\x0e\xcf\x7c\x43\x61\x78\x66\x3e\x18\x24\xa2\xd3\x32\xdf\x14\x0b\xd6\xc9\x82\xcf\x2c\x2a\x7e\x2c\x69\x21\xa9\x1d\xb7\x6d\x6d\x3f\xfb\x96\x77\xd3\x6b\x4f\xbc\xaf\x0c\x6a\x1f\xd6\x8a\xa0\x8d\x20\x10\x07\xcf\x7c\xb5\x36\x54\x68\x4f\x76\xf2\x58\x0a\xae\x18\xc8\x9a\xab\xda\x14\x37\xb0\x4d\x75\x56\x11\xf0\xae\x37\x74\x5e\x5a\xcf\x48\x57\x83\xae\xde\x03\x71\xf0\xcc\xa7\x17\xb7\x8e\x89\xbf\x17\xb7\x1c\x7e\x8f\x2d\x46\xfa\xfb\x30\x63\xe0\x8f\xf1\x7b\x9e\x05\xee\x37\x8a\x2f\x8f\x55\x51\xce\xed\x43\xd7\xda\x80\x38\x78\xe6\x33\xc4\xf7\x39\x4e\xb3\xd0\x2a\xd4\xbf\x78\x93\x8f\xbd\x80\x7f\xd6\xef\x7e\xf8\x66\x8b\x74\x4a\xbf\xc6\x5b\x0b\xd6\x2f\x42\xc9\x50\x43\x53\x10\x07\x3f\x5f\x95\x98\x30\x90\x1f\xa5\x79\x7e\xbb\x31\xfd\xda\x53\xcd\x91\xbb\x44\x87\xc3\xc9\xbe\x15\x9a\xd9\x62\xfa\xa4\x9d\x6f\xa6\x2e\x16\xa7\x20\x4c\x10\x88\x83\x8a\x83\xff\xdd\x07\x83\x7e\xd0\xa7\x49\xa0\xce\x99\x4f\xa7\xf7\x55\xdc\x15\xf3\xc2\x87\x9f\xe4\xe2\xee\xed\x45\xa5\x56\x97\x7b\x52\xb4\x57\xc9\xe7\x24\x48\x06\xa5\x76\xea\x42\xdb\xa0\x00\x0e\x2e\x81\xb5\xb5\x70\x5f\xfe\x90\x72\x57\xbb\xa0\x38\x25\xfa\xe0\xf5\x14\x0b\xd9\xea\x8a\x23\x45\xd3\x09\xc2\x09\x4c\x06\x8d\x54\xa2\x22\x44\x5c\x10\x07\x97\x00\xe3\x4b\xb4\xe6\x6e\xda\x91\xb9\xcf\x52\xd8\x3f\x08\xaf\xb2\x8f\x45\xe7\xbf\x90\x2b\x48\x76\xb6\x26\xc9\x7e\xca\xeb\x7f\x98\x09\x2d\xd8\x41\x1c\x5c\x02\x44\xd6\xda\x83\x15\x1a\x85\xd3\x2c\xae\x69\x6b\xd7\xc8\x59\x9f\x66\x86\x31\x4d\x7f\xa4\x52\xcf\x9a\xe0\x13\xd6\xbe\xa8\xd9\xf7\x1b\x3a\xc8\x0f\xe0\xe0\x12\x68\xc3\x3c\x50\x2c\xf8\xb3\xb4\xc6\xb7\x3f\x70\xf3\x09\x7b\x76\xdb\x5b\xa5\xae\x56\x07\xa3\x25\xc9\x6e\x8b\x18\xb6\x13\xa1\x8b\xcd\x88\xc5\x0f\x88\x83\xaa\x02\xf9\xfe\x7d\x01\x0c\x7a\xbb\x9e\xa6\x81\xe6\x71\xc1\x89\xd7\xf6\x49\x73\x97\x77\xd5\xc5\x94\x33\xd1\x0f\xb9\xda\xa8\x9e\xb9\x89\x3c\xea\x3f\xcf\xe8\xf9\x61\x2e\x71\x9c\x04\x31\x76\x10\x07\xd7\xc0\x13\x7f\xb6\x5a\x42\xee\x7d\x63\x79\x6a\x2d\xf1\xbb\x64\x9b\xd6\x0c\x7c\xcf\xf7\x7e\x97\x8f\xd0\xf5\x3d\xcf\x19\x08\xc5\x62\x80\x16\xc0\x20\x0e\xae\x01\xde\xdc\x4f\x9a\x98\xf5\x24\x45\x77\xe8\x6b\x3c\xbb\xd2\x31\x8b\x0a\x27\x4c\x46\x6d\xfe\xbc\x4f\x2d\xfa\x56\x7e\x22\x59\xa9\x00\x55\x33\x83\x38\xb8\x06\xc2\x77\x03\x62\x1f\x84\xae\x3a\xca\x2c\x7e\xa0\x4e\xf1\xbd\xb2\x81\x12\x3d\x1b\xaa\xc0\x44\xdc\x68\x9c\xfe\xa9\xe2\xcb\x66\x4e\x23\x22\x2e\x88\x83\x6b\x40\x24\x4d\x3e\xc8\x5b\x82\x61\xdc\x9f\x8f\x32\x41\xb9\xe1\x03\xcf\x77\x62\xa9\xcd\xcd\xf7\xd7\xdf\x05\x5a\x6a\x6c\xe4\xe8\x4b\xdd\x47\x68\x00\xc4\x41\x55\x81\x00\x23\x0c\x4a\x75\xa7\x56\x47\x78\xea\x6f\x96\x63\xff\xa0\xdc\x1d\xb6\x69\x4d\xb1\xeb\x3e\x77\xac\x85\x1f\xb0\xe8\xaa\x2d\x3e\x98\x7d\xf1\xd6\x6f\xa5\x46\x1d\xa8\x3a\x02\xc0\xc1\x35\x80\xe9\xe1\x73\x28\xc4\x27\x10\x5e\xa9\x7e\xee\x10\x65\x9a\xfa\xd1\xdd\xaf\x6b\xec\xa4\x8e\x38\x45\x6f\xad\x2e\x3e\xe9\x38\xf2\x79\x03\xfd\xbf\x04\xe0\xe0\x1a\x58\x25\x65\xa2\x97\xf0\xfb\xfa\xfe\xd7\xad\x3e\x93\xa8\xc9\x0e\x07\x52\x47\xd2\x4b\x7c\xdc\x5c\x32\x49\x8b\x75\x1b\xb1\x6d\xd4\x57\xa1\xbf\x5a\x01\x1c\x5c\x03\x22\x78\x4a\x0f\x3e\x35\xd4\x27\xf1\xab\x16\xa5\x97\x15\x44\xdf\x49\x3c\x47\x14\x4b\xfb\xd2\x73\xe0\xe6\x02\xa6\xa3\x41\x76\x40\x1f\x22\x2e\x88\x83\x6b\x40\xd6\x57\xe2\xe7\x4b\xd1\x3f\xcb\x62\x0f\x02\x05\xbc\xc5\x32\x6e\xd0\x7c\xcf\x2b\xf9\x38\xab\xf3\x91\xd4\xc0\x4f\xb2\xf7\x8e\x8b\x31\x42\x03\x20\x0e\x7a\x0f\xe8\xfc\xbb\x06\x40\xeb\x8e\xd3\x34\xf0\x78\x38\xbc\xf0\xba\x38\xdb\xf7\x94\x5b\x95\x13\xd9\x79\xc9\x85\x22\x55\xbc\x45\xc1\xda\xa2\x68\x06\xb6\xce\x02\xd9\x7a\x68\x4f\x10\x63\x07\x71\x48\xb7\x47\x87\x98\xdc\xe0\x9e\x24\x14\xba\x81\x79\x7f\xeb\x5d\x9f\x32\x21\xab\x9d\x2e\xf1\x79\x49\x8e\x80\x0b\x2e\xf8\xf8\xeb\x55\x0a\xd0\xad\xd4\x20\x0e\xe9\xca\x24\xf5\x27\x79\xdf\xf2\x44\x65\x34\x57\x95\x85\xaa\x6e\xad\x4f\xe1\xf3\xea\xa8\xa8\xae\x2c\xb6\xbb\x7c\x2f\x74\xcb\x7a\xa3\xde\x8d\x88\x0b\xe2\xe0\x1a\x48\x8e\xbe\xe6\xe0\x4c\x6e\xfc\x4e\xf2\x7c\x13\x41\x55\x96\x71\xee\x5c\xd5\xd7\x85\x2e\x1a\x2a\x02\xe3\x9a\x4c\x8b\xab\xad\x9f\xd6\x10\x71\x41\x1c\xd2\x72\xe0\x83\xac\xfd\xd8\xd1\x12\xd1\x8b\xe3\x92\xe8\x43\xad\x6b\xad\xf7\x5e\x56\xbf\xcc\x31\x0e\x08\xba\xf4\x03\x2d\xdf\xd8\xc7\xf7\x3a\xd4\x2f\x1c\xc0\x41\xef\x01\x80\x11\x06\x99\xa8\xd3\x8d\xf0\xf4\xeb\xdf\xd5\x1e\x39\xe3\xca\x56\x77\x6b\x0c\xd9\x1c\x75\x53\x67\xe4\xd6\xa7\x05\x0c\xf4\x5e\xa7\x5c\x97\x59\xd4\x88\xe5\xb1\x40\x98\x4a\x10\x87\x6c\x84\x39\x13\x1e\x7f\xc2\x6b\x5b\xb3\xe0\x32\xd4\xbb\x50\x6b\xbc\x5c\x9e\x3a\x56\xd4\x5a\xfa\x5a\x30\xd3\x78\x60\x6f\xe7\x06\x6a\x06\x1f\x22\x32\x88\x43\xb6\xab\x6f\x4a\x14\x06\x56\x7e\x2e\x7e\xb8\x19\x3a\x2d\x47\xb9\x88\x13\x3b\x38\x16\xf3\xa0\x4d\x89\x5f\xa7\x12\x63\xb9\xb5\x54\x13\x9d\x1f\x11\x19\xc4\x85\xc8\xa1\x10\xfd\x33\xf2\xff\x7c\x73\x70\x8b\x75\xa8\x3d\xc1\xf4\x0d\xe3\x80\xba\xdf\x77\xf7\xa8\xaa\xcf\x79\x77\x7b\x3c\x0b\xea\x51\x22\xfb\x22\x23\x6b\xfa\xad\x8e\x4c\xf8\x6f\x23\x1c\x11\xdb\xd9\xa6\x15\xe7\xf9\xb8\xc4\x37\x0c\x85\x4d\xd3\x71\xeb\x7c\x21\x56\xbd\x5f\x73\x6c\xe5\xee\xa5\x0f\xac\x93\x2c\x58\x68\x7f\xa1\x49\x7f\x7e\x3c\xe6\x10\x15\x8d\x93\x2f\x4d\x5a\x97\xcc\xcc\x11\xb3\xa6\x61\xd1\x91\xc6\xaa\xf6\xfa\x52\x7f\x79\xdc\x91\x9e\x65\xf5\xbf\x66\x84\x41\x43\xfb\xbb\x3a\x18\xc9\x08\xe3\xe7\xbf\xd7\x55\x63\xda\x6a\x22\x60\xcf\x62\x19\xc5\x91\x93\x1d\xd9\xed\x0b\xae\x1b\xc2\x1a\x34\x10\x34\x37\x1a\xd7\x0e\x79\x78\x26\x7b\x95\xc8\x46\x78\xc1\xfc\x04\x67\x7e\xbe\xb4\xa5\xed\xfd\x89\x45\x20\xfe\x51\xb7\x8a\x79\xf0\x7d\x3d\x82\xbc\xfe\x1b\x95\xde\x4e\x0b\x84\x81\x67\xd2\xae\xaa\x11\xd9\x08\x5f\xc0\x12\xfe\x1c\xea\x37\xc8\x92\xbf\x3f\x1d\x32\x39\x7c\xad\x5e\xcb\x6b\x0f\x35\x94\xe4\xe6\x9c\xe1\x9c\x9e\xb0\xcb\xd6\x1c\xde\x99\x8c\x16\xd9\x08\xff\x72\x1e\xf7\xf8\x54\x64\xfb\x71\x95\xa0\x97\x53\x69\x70\xbc\x63\x27\xaa\xcd\x93\x47\x52\xf7\x4f\xf6\x91\xaf\xc2\x2e\x95\x46\xd1\x99\x8c\x16\xd9\x08\xa3\x3a\x67\x5c\x7b\x49\xbf\x13\x31\xc0\x29\x7a\x47\x68\xec\xc6\xdc\xf5\xb7\x3d\xce\xaa\x17\x32\x75\x68\xac\xd4\x54\xd1\xd6\xb5\x7c\xcf\xcc\x08\x83\x44\x74\x5a\xe6\x8b\x4f\x30\xa6\xb3\x22\x14\x5a\x3c\x2e\xee\xdd\x5e\x14\xe7\xb8\xbf\x9f\x93\xda\x11\x59\x68\x54\x53\x1b\xcc\xc4\x7e\xeb\xd7\x4d\xe8\xb6\x14\x10\x07\xcf\x7c\xdf\x8d\x03\x56\x5f\x64\xb7\xe4\x47\x16\x8f\x12\x9b\x8b\x89\xca\x47\x66\x5c\x16\x2b\x6c\xde\xbc\xa9\x68\x5c\x92\xe0\xad\xf2\x0c\x2a\x38\x04\x71\xf0\xcc\x67\xd4\xb9\x43\xd7\xb4\xab\xf5\xa6\xd7\x5c\xc2\x38\xfb\xb3\x3a\x9b\x8b\xb9\x52\xf5\xb8\x0a\x0a\x6d\x24\x85\xed\xfe\x17\x29\x49\x76\x44\x5c\x10\x07\xcf\x7c\x19\xc6\xfd\xa6\xf3\xe4\x96\x2e\x9c\x8d\x8e\x68\x3f\x79\xb6\x70\x36\xfc\x18\x19\xf2\x4d\x02\x44\x78\x84\x1f\xdb\xb2\x34\xcf\x09\x21\xe2\x82\xb8\x10\x19\x14\xa2\xbf\xe3\x0a\xbd\xf8\xf6\x30\xf0\x4f\xba\x96\xab\xd8\xea\x81\x24\x45\xa0\xd5\x61\x54\xd6\x85\x78\xfd\xf7\xa6\x82\x44\x9b\x9d\xfe\x76\x85\xfa\x08\x23\x0c\xe2\xa0\xf2\xe0\x7f\x37\xc2\xa0\x1f\xf4\x69\x12\xb8\xd9\x62\xa8\x21\x29\xaa\xad\xf9\xe7\x71\x21\x81\xff\xc2\xda\x76\xf3\x05\x5c\xcd\x82\x43\xba\x76\xc6\xf0\xe3\x36\x9f\x20\xfb\x44\xc4\xd0\x41\x1c\xd2\x6e\xa0\xe6\x6a\x3b\xc7\xf8\x0e\xe6\x32\x87\xa9\x18\x57\x51\xec\x86\xdc\xa8\xcf\x06\x1e\xd9\x4e\x0d\xaf\xd8\x5a\x32\x46\x69\x2c\xd4\x71\x13\xc4\xc1\x25\x20\xb2\x18\x9f\x61\xa5\x5c\xc5\x65\xb0\x2a\xfb\x54\x84\xde\xde\x33\xf7\xc3\xc1\x70\xb7\xe8\x38\xb9\x56\x8c\x9b\x94\x08\xfa\x21\xd4\x76\x07\xc4\xc1\x25\xa0\x47\xca\xdb\x6f\x39\x4f\x93\x48\x33\x7c\x30\x1c\x60\xb7\x4e\x72\xb9\x5f\xc9\x53\x40\xba\x5a\xdc\x81\x1f\xf5\xe3\x27\x43\x53\x5b\xe8\x3f\x16\x00\x07\x97\x00\x5d\xd1\xc0\x95\x45\xbb\x58\xb4\x6f\x6a\x3a\xa5\x46\xf1\xd6\xb9\xf6\x0f\x82\x3d\xdd\x83\x47\x85\xc3\x06\xc5\x85\x4c\x27\x9e\x0d\x23\x16\x3f\x20\x0e\xaa\x0b\x04\x18\x61\xd0\xdb\xf5\x34\x0d\x94\xeb\xa7\x4c\x70\x4c\x50\x44\x12\x08\x7b\xd8\x32\x4a\x39\x4b\x5d\x61\x9d\x79\x44\x25\x6b\xfe\xc7\xc1\x3c\xf7\x92\x6c\xd4\x4b\xa8\x3d\x0e\x88\x83\x6b\x60\x88\xce\x62\xfd\x12\x76\x31\x55\x53\x23\xa5\xd3\x77\xed\xdd\x82\x0e\xce\x39\xcf\x7c\x57\x6b\x9f\xc9\xe6\x4a\xbb\x2e\x27\x09\xa8\xed\x14\x88\x83\x6b\xe0\x93\xfa\x8a\xe5\x60\x66\x34\x3e\xf7\x4a\x6d\x44\x34\x97\x96\xa9\xa0\xe2\xce\xbe\x82\x16\xc3\x8d\xf5\xdc\x98\x65\x94\x85\x38\x03\x44\x5c\x10\x87\x74\x20\xd2\x2f\xbc\x3b\x29\x6d\xcd\xb0\x9c\xb4\xdb\x4c\x7b\x34\xff\x7d\xd6\x82\xe9\x67\xbb\x24\x0f\x8a\x93\x9f\xe8\xcf\xc4\x42\xe9\x21\x33\x08\xe2\xe0\x1a\xb0\x66\xbe\x6b\x72\x15\x8f\x2d\xb1\xbf\x8f\x13\xe3\x7a\x81\xd5\x4f\x4e\xab\x0c\x85\x41\xa9\xb4\xc8\x3d\x7d\x1e\x36\x2f\x4a\x99\x04\x84\x06\x40\x1c\x54\x17\x08\x30\xc2\xa0\x54\x77\x9a\x06\xb6\x24\x8f\x65\x7f\xfa\x9a\xaf\x8b\x4e\x7a\xdc\xea\x95\x4a\xe9\xd4\xbe\xe0\xad\xaa\x45\xf5\x2e\xc2\xe2\xc7\x95\xe7\x03\x0a\xef\x9c\x11\x63\x07\x71\x70\x0d\xfc\xac\xad\x75\x9a\xab\xc6\x79\x71\x18\xa8\x15\x86\x92\x6a\xfb\x7a\x44\xb7\x0f\x5d\x05\x1d\x8d\xe3\xb7\x5d\xc4\xfd\x1f\xe2\x59\xd0\x2e\x23\x88\x83\x6b\xa0\x03\xcd\xa2\xdb\x58\x34\x46\x85\x8f\x46\x81\x7b\x05\xbd\xb0\x93\xf2\xa7\x99\x53\xa2\xc8\x9c\x68\xa0\xab\x9c\x48\xd8\xfe\x2d\xa8\x61\x22\x88\x83\x6b\x00\xb7\x4e\x94\xd9\xe6\x0b\xc1\x8d\x80\xee\x0f\xdf\xd3\x8d\x3e\x7e\x39\x97\x44\xdf\x8c\x71\x0e\x55\x2e\x5b\x27\xc0\x4e\x7d\x49\x14\xba\x3e\x0f\xc4\xc1\x35\x10\xf0\xb2\xd7\xd2\xf7\x35\x8e\x52\xe2\x58\xed\x94\x0a\x1f\x85\x03\x7b\xf3\x97\xb2\x18\x4c\xab\x86\x52\xfd\x64\xe9\x9f\x84\x1d\x33\x08\x0d\x80\x38\xe8\x3d\x00\x30\xc2\xa0\x75\xc7\xa9\x77\x47\x08\x87\xd5\xe9\xa0\x29\xe0\xa2\x5b\x37\x19\x7d\xa5\xba\x66\xad\xed\xee\xf9\xf2\x89\x3d\x8f\x86\xa5\x55\x8f\x4d\x78\x59\x3b\xf4\xe7\x25\x88\x83\x6b\x40\x27\x21\xdf\x58\xd1\x69\x57\xe3\x72\x8f\xe9\xd8\x53\x65\x54\x8b\x3e\xc6\x19\xac\xd7\x26\xef\x31\x28\x8e\xd6\x17\x50\x86\xdf\x42\xff\x8b\x83\x38\xb8\x06\xce\x33\x48\xd1\x48\x2b\xd5\xf5\x90\xff\xb2\xc6\xe9\x0a\x3b\x76\xfc\x41\x86\xa6\xd8\x40\x56\x5e\x1c\xf1\x84\xa1\x82\x39\x4f\xbd\x05\x11\x17\xc4\xc1\x35\x50\x5c\x30\xb7\x4f\x13\x55\x81\x23\x35\x67\x7e\xdc\xd9\xdd\x30\x3f\x6d\xeb\xfb\x54\x4f\x55\xb7\xf7\x72\xe6\xfd\xd7\xf2\x58\x85\x50\xad\x10\x88\x83\x6b\xe0\xf1\xfd\x4d\xe2\x9e\x17\x9a\x81\x75\xbe\x04\xb4\x4c\xdc\x39\xb1\x22\x25\x2f\xe5\xfc\x2d\x71\x45\xf6\xc7\x98\x2e\x9a\xd0\xbe\x80\xfe\x0c\x01\x71\xd0\x7b\x00\x60\x84\x41\x26\xea\x74\x23\x5c\x58\x53\xe0\x5d\x6f\x96\x8e\xb3\xb7\x6b\x26\x22\x2f\x82\xf6\xfc\x02\xb5\x96\x65\x57\xdd\xf1\xf5\x27\xa9\x0b\x72\x5c\x15\x6f\xec\x11\xa6\x12\xc4\x21\x1b\x61\x25\xff\xb8\x9a\xc3\x48\x92\xdc\x56\xa7\x1b\x4c\x79\x33\x3f\x9c\x63\xeb\xab\x8b\x9e\x1c\xd4\x13\xf2\x17\x91\x96\x99\x2c\x47\x3d\x42\x44\x06\x71\xc8\x46\xb8\x38\x60\xb2\x22\xef\xb5\xa5\xf8\x8a\xf8\x91\x4c\x68\xef\x9b\x68\xad\x8c\xe7\x4d\x2c\xc1\xcc\x02\x4c\x49\x91\xc1\x61\xaf\x27\x9d\x11\x91\x41\x5c\x88\xdc\xff\x3d\xc9\xbf\x23\xff\xcf\x77\x07\xab\x7a\xc6\x62\x30\x59\x52\xee\x0b\x1a\xbd\x4d\xca\x6e\x3c\xf6\x4b\xe4\xe8\xbf\xf4\x6e\xef\xc9\x2b\x4a\x27\xbc\x65\xfa\x1c\x13\xfe\xbf\x8d\x30\xe5\x45\xa5\xe7\x12\x78\xc1\x36\xdc\x61\x66\xbf\x62\x9b\xb5\xf0\x9e\x4b\xeb\xd7\xe1\xd5\x0e\x06\x4c\x36\xd6\xdc\x2d\xe9\x59\x9b\xf8\xdb\x80\xb2\xd0\xdd\x37\x15\x8f\xf1\xea\xce\x5e\x63\x2c\xdb\xda\x1a\x25\x51\xb0\x1d\x92\xac\xe4\x8f\xa6\xf8\x85\x5a\x4e\x72\xf0\x6b\xe7\xbf\x66\x84\x41\x43\xfb\xbb\x3e\x58\x1e\x6e\x96\x04\x2a\xe2\x95\x17\xa8\xb6\xfd\x82\x86\x9d\x74\xa2\x5c\x55\x9b\x9e\x57\xf7\x85\x1a\xbe\xc1\xc9\xed\x89\xe4\xe5\x75\x79\x17\x64\x77\x26\x9b\x95\xc8\x46\x78\x54\x69\xf8\x1d\xc9\x43\x4e\x7c\x9f\xaa\x90\xca\x08\x91\xde\x0d\x05\x87\x56\xcb\x7a\x73\x73\x62\x71\xb9\x9c\x8c\xc5\xfd\xe9\xb2\x33\xd9\x9a\x95\x40\xfa\xd8\x80\xcc\x2f\x6e\xdb\xe2\x14\x83\xd8\x46\x8f\x38\xee\xdb\x7d\x78\x6e\xb9\x4a\xed\x2f\xdf\x85\x4d\x25\xe8\x88\x32\xfe\x84\x6c\x97\xf8\x4c\x46\x8b\x6c\x84\x49\x8c\x25\x93\x05\xd8\x5a\x26\x63\xdf\xcb\xb3\x8d\x7d\x2c\x59\xfe\x44\xe4\x28\xaf\xfd\x7a\x85\x48\xdf\xe8\x80\x1e\x03\x5f\xf2\xc6\x99\x8c\xd6\x05\xe9\x63\x73\xf0\x19\xf8\x3f\x0a\xd6\x27\xc7\x51\x39\xf8\xda\xb5\xbe\x4f\xc6\x1c\x35\x9a\xad\x3b\xf9\x4d\xb4\x21\xc4\x57\x56\x2b\xa0\x5e\x7c\x66\x46\x18\x24\xa2\xd3\x32\x1f\x95\x38\xc3\x1e\xb9\x1c\x7f\xdb\xbc\xd9\xb6\xbf\xe5\x2b\xc3\x08\x29\x5f\x4d\xb1\x92\xe6\x21\x9d\x44\x29\x35\xb7\x8e\x20\x36\xa8\xda\x12\xc4\xc1\x33\x5f\x0c\x47\xe9\x93\xbd\xa7\x23\x0e\x12\xfe\x46\xdf\x76\xde\x3e\x46\xa5\xc6\xb2\x40\x35\x79\xdf\xe7\x84\x46\x6a\xba\x21\xd8\xc6\x47\x8f\x88\x0b\xe2\xe0\x99\x4f\x77\xda\x90\xa5\x07\xdd\xe4\x9a\x9e\xde\xa3\x34\x4a\xe5\xfd\x1f\x43\xf5\xe8\x4f\xfc\xf5\xfb\x3d\x2e\xa4\xc9\xd2\x94\xbd\x08\xb8\x81\x88\x0b\xe2\xe0\x71\x77\xb0\xd0\xba\xc9\x49\x6e\x69\x6e\x12\xa5\x92\x2b\x7a\x36\x8e\xb2\x45\x8f\x4c\xe2\xfa\xac\xf9\xc5\xd9\x95\x09\xd8\x10\x07\xdf\x86\x3a\x05\x01\xb8\x10\x19\xd4\x7f\x3c\x07\x91\x20\xb2\x31\x9e\x4f\x87\x51\x11\x97\x2d\x59\x55\x05\x46\x0b\xd6\x0f\x76\x74\xc9\xd3\xd4\x31\xcf\x5b\x34\x8a\x31\x57\x15\xf8\x05\x1a\xfc\x6f\xbf\xc4\xd3\xe6\xae\xcb\x7e\x42\x9c\xb9\x6f\xd4\x92\x9b\xb5\xa8\xec\x9b\x03\xd3\xb3\xdc\x1f\xcd\x6d\xf4\x1e\x94\x8f\x3e\x37\xf1\x88\x24\x65\xd1\x86\x21\xbe\x33\x88\x43\x72\xb0\x16\xc3\xb2\x11\x41\x8c\xf2\x71\x65\x4f\x8e\xf0\x5f\x2e\xa6\xe8\x5d\xf1\xcc\xd2\x19\x5b\x7b\x5d\x95\xcc\xcc\x95\x93\xf2\xab\x14\x72\xb0\x00\x0e\xfe\x8c\x25\x0e\x5d\x30\x83\xf9\xb9\x44\x27\xc2\xb6\xf5\x9f\xdd\xbe\xf7\xca\x23\xe7\xa4\xc3\xef\xb6\x31\xab\xab\xd4\x1f\xfd\x23\x41\x3c\xe8\xe8\x31\x88\x83\xc7\x6d\xd0\x8d\x10\x29\xb4\x88\xe7\xd1\xab\xee\xfe\x22\xdf\xbd\xa8\xf7\xa8\xbb\xd7\x46\xf9\xca\x6e\x67\xd6\x61\xbb\xd4\x5d\xdb\xc7\x34\x50\x19\x2a\x80\x83\xcf\xdd\xa1\x4a\x4c\xbb\x72\x10\xb7\x26\x6f\x36\x13\x2f\x55\xa1\x7c\x3a\x45\xc0\xcf\x35\x63\x5e\x03\x62\x57\xf3\x8f\xda\xb7\xa9\x63\x4a\x10\x73\x07\x7a\x9d\x9d\x36\x77\x7a\x99\x16\x14\xa6\x61\x2e\x7a\x9f\x2d\x64\x4d\x68\xed\x9d\x8a\xb2\x08\xa9\x5a\x73\xfd\x07\x18\xec\x55\x2e\x74\x07\xdf\xda\x86\x4e\x62\x80\x38\xf8\xdc\x45\xa1\xb0\x4d\xa4\xdf\x8b\x3b\xb6\xff\x66\x63\x2d\x95\x3b\xa6\x23\x43\x7a\x5d\x1c\xdf\x76\x46\x2b\x84\xee\xc3\xf3\xed\x98\x6d\xe8\x1e\x11\x10\x07\x7f\xc6\x7e\x57\x6f\x0e\xd0\xea\x2c\xdd\x19\x08\xf3\xe7\x6f\xef\xec\xab\xa5\xcc\xca\x3b\xa7\xf0\x3b\xe6\xde\xc7\x19\xcf\xd2\xf0\x5a\x63\x27\xa8\x83\x14\x80\x83\xc7\xcd\x57\x9f\x7e\xaa\x4a\x12\x12\x95\xe7\x27\xff\x05\x45\x5b\x69\xec\x5d\x3a\xf7\x64\xc3\xe2\xb6\x74\x13\x9d\xd2\x74\x52\x5d\x33\xe4\x94\x41\x1c\x7c\xee\xa4\x72\xdf\x6e\x5e\x74\x5c\x5b\xe6\x8e\xbb\x10\xa5\xe7\xfd\xfd\xd5\xa8\x11\xea\xcc\x1e\x2b\x87\x10\x83\x83\xf5\xe2\xc9\x0b\x89\x01\xc4\xdc\x81\x72\xc2\x69\x73\x67\x3a\xa2\x9d\x97\x22\xdd\x8a\x6b\x8a\xc3\xce\xc2\xa2\xa2\xed\x6d\x51\x78\x71\xb1\x22\x6e\xc2\x7d\xf4\x41\x16\xb7\xf4\x73\x82\x5a\xc4\x77\x06\x71\xf0\xb9\x1b\x76\x6e\x97\x3b\x29\x49\xe9\x15\x61\xb3\xc4\x59\x10\xa5\xf8\xb4\xb2\x30\xf8\x86\xce\xf3\xe5\x89\xce\xde\x6c\xab\x61\x91\x31\xf4\xa7\x24\x88\x83\x3f\xe3\xfd\xcf\xbf\x6e\xbe\x5d\xfd\x65\xd2\x75\xd3\xe9\x6e\x9b\x4d\x3a\x2f\x07\x31\x55\x3c\xde\xf2\x9d\x21\xd4\x24\xee\x50\xf9\x9e\x8b\x64\x88\xb8\x20\x0e\x1e\xf7\xb6\x3c\x21\xf1\xcd\xc5\xf8\x8a\xc8\x9d\xeb\xf6\x61\x4b\x7f\x08\x7e\x69\x04\xd7\xd5\x1b\xb8\xb2\x92\xf2\x6c\xbc\x4b\xd7\x31\x81\xb6\xf9\x40\x1c\x7c\xee\xbe\xa4\xd0\x24\x68\x1c\x27\x61\x95\x33\x1b\x31\x05\x68\xde\xa4\xc8\x1c\xd2\xb8\x56\x39\x17\x71\xe7\xee\x62\xa8\x74\xe2\x58\x4c\x20\x62\xee\x40\x89\xf5\xb4\xb9\x0b\x44\xef\x32\x7e\x1d\x17\xc6\x63\x1b\xdd\x15\xd0\x38\xb6\xe2\x56\xb9\xa1\xc1\x1a\x3b\xd1\xce\x18\x11\xfa\xe9\x5a\xe7\x37\x72\x48\xc7\x20\x0e\x3e\x77\xf8\x26\xfe\xdc\x81\x6a\x71\x71\x77\xcd\x2d\x96\x7b\xd0\x4b\x65\x6e\x60\x5a\xcf\xe3\x7e\x10\xfe\x93\x44\xe3\xde\xf3\xae\x9e\xa9\x1f\x11\x17\xc4\x21\x6d\x7b\x9f\x34\x8f\x1c\xec\x66\x7b\xd6\x7c\xdc\xf5\x6f\x2d\x37\xb4\xbc\x5e\x5e\xc1\xf0\x8d\x9f\x47\xe5\x58\x35\x67\x43\x8d\xf0\x5d\x26\xb4\xed\x0d\xe0\xe0\x71\x2f\x9b\x9a\x70\x3d\xff\x31\xee\xab\x72\xcc\xb3\x8b\x95\xe1\x19\xa6\x80\x57\xbd\x29\x48\x81\xe9\x12\x82\xa2\x6d\x35\x7a\xa1\x8d\x13\xea\x5c\x05\xe0\xe0\x73\xd7\xe3\xe1\xbe\x90\x71\xeb\xa3\xd0\x1f\x01\x7f\xe1\xed\xdc\x27\xd9\xf4\x24\xfa\x35\xf4\x96\xdd\x8c\xf1\xd7\x28\x86\xe8\xbe\x55\x53\x07\x1a\xfd\x6f\xab\xfb\xd3\x1d\x1a\x87\x4a\xe3\xca\xe4\x83\x39\x6e\x62\x17\x13\x29\x99\x90\xcf\x9e\xc7\x84\x37\x49\xc4\xc6\xe9\x6b\x39\x7e\x7b\x1f\x26\x38\xa7\x43\xdb\x7e\x20\x0e\xd9\xa1\x69\x85\xba\x61\x27\x91\x35\x78\xdc\x10\x5b\xf4\x60\x5f\x7d\x2f\xab\x47\x40\xb4\x59\xcc\x22\xf1\xfc\xe6\x07\xe7\xa8\xa0\x41\x72\x29\x44\x64\x10\x87\xec\xd0\x18\x39\x7d\x1e\x55\x51\xd0\xda\xe0\xe0\x71\x9d\x27\x3e\xc9\x0a\x19\xc3\x36\xdb\x12\x30\xeb\x16\xd9\xe6\xc9\x69\x55\x92\xeb\x83\xce\xec\x82\xb8\x10\x39\x14\x94\x7f\x3e\xeb\xff\xf9\x5a\xdb\xc5\x1d\xed\x6f\x2d\x2c\xba\x06\x9c\x0b\x23\x0e\x0c\x99\xc3\xeb\xf5\x4f\x57\x3f\xb2\x85\x97\x46\x7e\xf8\xe5\xa9\x28\x9d\xa9\xfb\xf9\x1f\x0e\xed\xda\x7b\x02\x5b\x57\xf7\xe9\x2b\x7e\xe7\x45\xcf\x0d\xd5\x61\x1a\x30\xf2\x10\x5f\x95\xa2\x64\x94\x11\xbc\xde\x12\x5c\x24\xf3\x77\xf9\xe0\x87\x17\x89\xb3\x74\xec\x05\xac\x42\x5d\x03\x95\x3e\x8f\x5b\xcb\xc6\x2d\x48\xad\xf9\x27\xe8\x6a\x8e\xf4\x0c\xb9\x55\x7f\x9b\x7c\xfc\xcf\x39\x34\xc0\xd0\xfe\x2e\x5d\x45\x72\x68\xce\xc3\x31\x94\xd8\x1c\xe6\x18\x0b\x34\x8e\xad\x75\xfe\xce\x1c\xde\x83\xb9\xe7\x13\x8c\x18\xbf\xe8\x3c\xf2\xdf\x78\xfb\x40\x55\xe7\x4c\x76\xd1\x90\x1d\x9a\x0e\xe6\x18\xbb\xc6\xf7\xe8\xad\x2b\xbe\x58\x29\xbb\x7a\x3c\x12\x59\xe8\x58\xd9\x7e\x0d\xcd\xc4\x85\x3d\xa5\xaf\xdf\x14\x2a\x9b\x9e\xc9\x9e\x21\xb2\x43\x53\x8d\x9f\x5b\x6b\x8d\x51\x8a\x7a\x73\xec\xb4\x36\xa3\x4f\xf8\xe6\xc5\x9e\xd0\xa8\x60\xc5\x34\xb7\x65\xbd\x72\x51\xbc\x07\xd7\xec\x99\x8c\x16\xd9\xa1\x6d\x97\xcf\xe0\xef\x5e\x91\x59\x23\xc4\xde\xf0\x1f\xda\x0f\x50\x20\xbb\x53\xa4\x45\xf0\x5e\x69\x38\x98\xfc\xc9\xb9\x89\x5c\xf1\x33\xb8\x60\x36\x4a\x4e\x1a\xd9\xa1\x45\x54\x77\x77\x07\x76\x35\x29\x1c\x35\x6c\xbd\x15\xed\x16\x55\x4c\x10\xe2\xf9\x38\x89\x4f\x54\x74\xe5\x85\xd5\x1c\x3a\xf3\x54\xe0\x99\x39\x34\x90\x88\x4e\xcb\x58\x0c\x65\x2c\x89\x8e\xfe\x6f\x75\x36\x96\xf3\x28\x85\x63\x9e\xd2\x5f\xba\xdf\xb1\xc4\x92\xe8\xfc\xf3\x20\xf2\xe2\xb6\x94\xe3\x53\x68\x75\x0b\xe2\xe0\x19\x4b\x29\xc0\xaf\xb1\xed\xe6\x03\x9d\x03\x22\xb6\xc7\x8f\x52\xee\x6d\x45\x36\x29\xe4\x0d\x67\xd2\xe2\xaf\xc9\x7a\x94\x50\x57\x9e\xdb\x41\xc4\x05\x71\xf0\xcc\xe2\xff\x91\xdb\x69\xf3\x80\x45\x3c\x3c\x2a\x87\xff\x75\xfc\x41\x0b\x77\xee\x7d\x03\x82\xb9\x79\xb3\x59\x8e\x61\xcb\xab\xa2\xa8\x41\x50\x55\x09\x80\x83\xc7\xfd\x38\x61\x2e\xc7\x57\xcf\xdd\xd4\x87\x8b\x81\xc5\x9a\xf2\xb1\x30\x29\xa9\xd2\xab\xa4\xb8\xc0\x40\xf8\xf2\xa6\xdc\x5d\x73\x25\x68\x9f\x0a\xc4\x85\xc8\x10\xfd\xf3\x2d\x5a\xf2\x88\x89\xd3\x6b\xf6\x73\x4d\x79\x1c\x1d\x41\xba\xd0\x05\xa3\xeb\x86\x2e\x3f\x5f\x70\x9d\x2f\x7b\xac\x70\x45\x96\x8d\xfa\x10\xb1\xda\x00\xfd\x12\x4f\x9b\x3b\x5d\xfa\x72\xcc\x32\x82\x42\x7d\xaf\x41\x2b\xa2\x54\x67\x6d\xb6\xc1\x55\x6e\x9f\x50\xba\xb4\x0b\x8b\x97\x15\x88\xbd\x96\x06\x72\x21\xb7\x0a\xe0\xe0\x73\x87\xad\x42\x41\xff\x58\x8d\x4b\x28\x67\xee\xfe\x81\xd7\x92\xe1\x91\x2a\xc7\x62\x39\x51\xdc\x88\xa0\x65\xc9\xf4\x0b\x5d\x4e\x76\xa8\x8f\x23\x88\x83\x3f\xe3\x3a\x66\x01\x6f\xb7\x80\x28\x7a\xa9\x9f\xe5\x0f\xfd\x1f\xa5\xfd\x4a\xf8\xe1\x46\xc2\x33\x3c\xaa\x89\x81\x12\x75\x93\x5c\xeb\x8b\x3c\x74\x38\x18\xc0\xc1\xe3\xe6\x12\x4c\xa0\xba\xd1\xf5\x19\xfc\x5c\xca\x90\x46\x79\xc0\x77\x77\xcc\x57\xa1\xa8\xb5\xc2\xd9\xd4\x62\x53\x2f\x3c\xba\xe2\x22\x54\xc5\x06\xe2\xe0\x73\x67\x97\x60\xba\xf4\x69\x23\xe9\x97\x32\x8e\x68\xe1\xf6\xec\x97\xcf\x14\x43\x94\xb1\xb4\x3b\x2b\xfc\x65\xb6\x4d\xcb\x8f\x38\x54\xf8\x11\x73\x07\x7a\x9d\x9d\x36\x77\xf7\xcc\x6b\xdb\x22\x17\xc7\xe9\xc7\x32\xad\xab\x63\x50\xe7\xb5\x87\x06\x5d\x16\xd1\x97\x93\xba\xde\xcf\xd8\x8c\xbf\xdc\x48\x87\x5c\x30\x88\x83\xcf\x5d\x6f\x80\x89\x36\x55\xe1\xc3\x37\x7b\x17\xd5\x6a\x71\x83\xfb\xc7\x2f\x84\xdd\xac\x48\x6d\x6c\x98\xc6\x4b\x0b\xa6\xa2\xb6\x4c\x70\x43\xc4\x05\x71\xf0\x67\x1c\xdd\x5a\xd3\x94\x2d\x26\x82\x65\x5e\x2e\x3c\x5c\x96\x97\xd6\x6f\x59\xf5\xf4\x7d\xd8\x20\x63\x28\xc6\xaa\xec\x8e\xb4\x4b\x59\x24\x22\x2e\x88\x83\xc7\x6d\x89\xee\x1b\xbc\x43\xc0\x44\x7c\x22\x93\x81\xe7\x25\x40\xe5\xaf\x81\xeb\xb7\x65\x78\x62\x24\x90\xef\xca\xd6\xe2\x7e\xf1\x43\x25\x22\x2e\x88\x83\xcf\x5d\x56\xf3\x67\xc5\x9a\x37\x51\x37\x31\x4a\xc4\xd1\x99\x5a\x95\xdb\x8f\x3c\x23\xe4\x2b\xb6\x7b\x6d\x97\xd8\x6d\xf8\xf2\xdb\x5f\x5f\x42\xcc\x1d\x28\x27\x9c\x36\x77\x3d\xa8\x57\x95\xed\x5f\xbc\x90\x26\x88\x49\x13\x4e\x31\x71\x97\x55\x8e\x5c\xf7\x16\xa4\x7e\xce\x98\xfd\x69\xc1\x60\xe5\xa7\x33\xb4\x07\x0f\xe2\xe0\x73\xb7\x19\xc7\xfa\x6d\x73\xd2\xf9\x42\xf4\x93\x58\xae\xd4\x91\x42\xb9\x46\x0b\x7d\xab\xcd\x77\xb3\xe3\x24\xcd\x25\x02\x05\x23\x04\x2b\x88\xb8\x20\x0e\xfe\x8c\x4b\xdb\xd1\x02\x06\x7e\x79\xb5\xdd\x2d\xfc\xdd\xb6\x2a\x21\x9b\xcc\xe7\x4e\xaa\x29\x27\xd7\x26\xfe\xb3\x4f\x27\x98\x54\xbb\xa6\x0a\x11\x17\xc4\xc1\xe3\x92\x11\x14\x3b\x2f\xd8\x93\x90\xeb\xa9\x29\x92\x61\x63\xca\x5d\xb8\xa7\x3b\x48\x70\x55\x5e\x25\xc6\x9e\x56\xcd\x74\x23\xe7\x96\x20\x22\x2e\x88\x83\xcf\x5d\x0a\x5d\xd2\xc1\xec\x7d\xa7\xad\x90\x94\x7b\xfb\x01\xe8\x83\xc4\x0e\xc9\xf9\xcb\x77\xbb\x72\xa4\x7f\x98\x59\x28\x4a\xc5\x04\xab\x22\xe6\x0e\x94\x58\x4f\xed\xd5\x7b\xac\x56\xb5\x38\x2e\x2b\x48\x37\x85\x62\x6a\x87\xc5\x65\x9f\xeb\x79\x8e\x64\x5e\xe8\x7b\xef\x55\x4d\xd3\xbe\x25\xf4\xc7\x90\x0b\x06\x71\xf0\xb9\x4b\xdd\x6e\x8e\xf8\xd9\xf0\xf0\x37\x6a\x17\x9b\x4a\x55\xdd\xc4\x79\xdc\xf8\x8b\x49\x6c\xfc\xba\x8a\x71\xb4\xc7\xca\xb2\x77\x53\xa1\x1b\x61\x41\x1c\xfc\x19\x17\xe8\x09\x61\x76\x64\x30\x28\xfd\xa8\xfc\x7c\x5f\x3d\x50\x4c\xbf\x2b\x64\xfa\x6a\x82\xe5\x72\x4d\x21\xeb\xc8\xf0\x93\x82\x67\x9e\x88\xb8\x20\x0e\x1e\xf7\x86\xaf\x3c\xf1\x2c\xc3\x9c\x47\x84\xab\xfd\xb6\xb9\xa7\xbe\x72\x8b\x5d\x7c\x93\x3e\xee\xb2\xc4\x67\xd3\x5a\xd9\x30\x96\x1d\x68\x4f\x1e\xc4\xc1\xe7\x6e\x46\xeb\xaa\xfe\xea\xcb\x8d\xdf\xb7\xca\x2b\xfc\x27\x23\x39\xe8\x1e\x05\x19\x64\xc7\xee\x70\xd2\x32\x19\xba\xeb\x09\xa8\x4e\x38\x21\x1c\x1a\x68\x75\x7f\xba\x43\x1b\x58\x12\xed\x24\xf2\x79\xa0\xf2\xed\xa5\xe1\x9f\x71\xb2\xa9\xad\x7b\xe8\xfd\xfd\x0d\x72\x16\xcb\x54\x02\xb5\xe7\xaa\x47\xf8\xa4\xa1\x4e\xb8\x00\x0e\xd9\xa1\xfd\x18\xaa\xc5\x5c\x15\xe2\x0d\xc4\x93\x72\xbf\xbd\x67\xe7\x58\x5d\xa4\x2a\x2a\x73\x63\x50\x04\xe3\xdd\xc3\x8b\x68\xbe\xe8\x23\x73\x88\xc8\x20\x0e\xd9\xa1\xb1\x0d\xf5\xf4\xf2\xbc\x11\x68\x24\x57\xc8\xfe\x13\x24\xc2\xfb\xf3\x91\xbb\xfc\x6a\xe8\xf3\x0f\x69\x26\xbd\x77\x4a\x9d\x26\x71\xa1\x7a\x4d\x10\xf7\x7f\x0e\x0d\xe3\x1f\x91\xff\xe7\x1b\x57\x43\x68\x5b\x6d\xbf\xdd\x0d\xb4\xca\x15\xae\x26\xce\x3c\xa7\x35\x3f\xdb\x23\x36\xc6\xfb\xbb\xf8\x21\x0e\xbe\x12\xd7\x75\xdf\x56\xa5\xbf\x1d\x1a\xee\x4c\xb4\xac\xca\x4d\x9a\x84\x6d\xd9\x96\x39\xa1\x51\xcf\xb0\xe1\x13\x35\xe3\x10\x61\xbb\xb2\x77\x8b\xf4\xb5\x0a\xf9\x0a\x7f\x5f\xf7\xd1\x74\x5f\x5c\x8d\x3f\xec\x26\xdd\x4c\x4c\x67\xa5\xb9\x7c\x8a\xd9\x1d\x2a\xd5\x21\xdb\xdd\x4b\x26\x3d\x93\x68\xe6\x1d\x0e\xf8\x34\xff\x35\x87\x06\x1a\xda\xdf\x55\x95\x48\x0e\x2d\x7e\xc0\xf6\xdb\xa2\x70\x00\xf9\xeb\xbb\x3b\x07\x3d\x71\xea\xf2\x35\x37\x31\x55\xeb\x18\x29\x97\x71\xf0\xf2\x7e\x08\xf6\x92\x5c\x3c\x93\xed\x1d\x7e\x24\xf3\x20\x89\xde\x65\xa1\x41\xdb\x2e\x4f\xcd\xcf\x46\xac\x4a\xab\xad\x77\xf8\xde\x61\x23\x84\x91\xcb\x6b\x75\x26\x64\xfb\xa2\x89\xf2\x19\x9c\x73\x8c\x92\x0b\x44\x76\x68\xf4\x59\x36\x72\xf8\xfc\x1e\x95\xfb\x54\x89\xfa\xcf\x2f\xf1\xab\x4f\x7b\x3e\xaf\x59\x43\x95\xcd\x2a\x0c\x51\xfe\xc8\x32\x40\xf2\xfd\x4c\x46\xab\x8b\xf4\xb1\x27\x5e\xe1\xda\x23\xe3\x7f\xde\xb7\x69\x5c\xf1\x51\x9d\xec\x08\x6f\xe7\x62\x9e\x7e\xfe\xc2\xd4\x39\x7e\xff\xc1\xdd\x00\xfb\xde\xb3\xa9\xaa\x44\x76\x68\x3d\x43\x1a\xf9\xfc\xe3\xa6\x7c\x2c\x17\xfe\x18\x59\x6b\x9d\x1b\x31\x18\xb0\x3e\x1f\x80\x33\x91\x35\x55\x63\xa6\x62\x98\x4d\x67\x72\x66\x0e\x0d\x24\xa2\xd3\x32\xd6\xcb\x9d\xa5\x07\xd4\xd9\xa8\xb6\x39\xb2\x4d\x45\xde\xc2\x9b\x01\xfa\xc2\x45\x2c\xfd\x65\xf8\x19\x4a\xde\x21\x19\xac\x71\xa9\xd0\xad\x0d\x20\x0e\x9e\xb1\x12\x88\x6e\xed\x28\xb5\x75\x2c\x7d\x75\x97\xae\x93\x36\xb7\xc7\x10\x6b\x2a\xb0\x7d\x35\x74\x78\x6d\xe3\x7c\xb9\x50\x9e\xfb\x3c\xd4\x06\x13\xc4\xc1\x33\x8b\x2f\x43\xb0\xe1\xd5\x42\xa6\xae\x07\x2b\x37\x6b\x4f\x44\x2f\xa3\x65\xbc\xa8\x08\x28\x57\xa3\xdb\x9d\xd2\x29\xb0\xaa\xca\x22\x82\x32\x21\x88\x83\xc7\xbd\xc5\x70\x48\x19\x70\x44\xdf\xde\xd7\xa0\xc3\xe9\x62\x96\xf5\xca\x78\x2c\xc1\x7c\x8f\xab\xaf\x3a\x93\x7d\x4d\xcf\x58\x63\x23\x0a\x11\x17\xc4\x21\xb9\x9d\x09\x9f\xb2\x85\xa4\xcf\x2e\x1b\xf8\x5f\x18\x99\x26\xfd\x08\xe2\xde\x08\x1c\x79\x0f\x08\x49\xb9\x96\x3d\x2e\x76\xcb\x2c\xc3\x43\xac\x36\x40\xbf\xc4\xd3\xe6\x0e\x3b\xf2\x84\x83\x93\xff\xb6\xc4\x82\x0a\xe5\x8e\xa6\xea\xe7\xf4\x5b\x17\xe8\x06\x43\xdd\x32\x6d\xb7\x51\x63\xc3\x31\xc9\xe3\xa1\x93\x34\x20\x0e\xa9\x25\xe2\xa1\x8a\x54\xc0\x6b\x6a\xf1\x82\x73\x35\xfa\xed\x3a\x8a\x5a\x57\xfc\xc3\x82\x8d\x70\x4f\xd2\xcd\x96\x14\xaa\xe5\xed\xc4\x59\xa0\x96\x88\x00\x0e\xfe\x8c\x7f\xa6\x5f\x16\x61\xfb\x83\xba\xf1\x53\xb6\xc0\x8e\xf3\x72\x68\xac\x74\xd9\x2b\x4c\x06\xcd\x96\x4e\xeb\xfc\x85\x4a\x29\x21\x6a\xa8\xa1\x33\x88\x83\xc7\x75\x7d\xf2\x38\x31\x0d\x1d\x53\x35\x6a\x50\xc7\x6d\x3d\xf9\x7b\x20\xc6\xf5\x3d\xdb\xf1\x2f\x3b\x77\xbd\xdf\x77\xe7\x7c\x93\x7f\x01\x69\x0d\xc4\x21\x5d\x16\x29\x6d\x8b\x2a\x31\xa6\x68\xe2\xd8\xda\xca\xd4\x98\xbf\x2a\x2a\x5f\x3f\xe7\x58\x6f\x31\x71\xb2\xbd\x42\x57\xaf\x10\xdb\xae\x8b\x98\x3b\xd0\xeb\xec\xb4\xb9\xcb\xd5\xd9\xb5\xe5\xbd\xb1\x28\x82\x3d\x43\xd9\x22\x2c\x97\x5b\xa7\x28\xfb\xb1\x30\xe7\xe2\xd7\x5e\x9f\x0a\xf7\x4c\x5b\x1c\x67\xa8\x95\x27\x88\x83\x7f\x67\x6a\xad\x67\x5c\xcb\x99\x25\x53\x22\xd6\xa4\x41\x6e\xf7\x3b\xdf\x96\x5b\x1c\x59\x4b\x2e\x1a\x35\xa6\xbb\x1f\xcd\xd0\x88\x3d\x83\xee\x8e\x02\x71\xf0\x67\xdc\x53\xce\xfa\xd1\xdd\x30\x56\x37\xf1\x1c\xef\x9f\x89\x39\x71\x87\x6f\x9c\x53\x73\x34\x36\x0d\xa1\xd9\xec\xa3\x9d\x26\x44\xdc\x6d\x90\x2b\x01\x70\x48\xab\xfc\x86\x73\xbf\x31\x2d\x97\x7f\x92\x3d\x66\xf7\x3c\x8a\x88\xbc\x30\xd6\x9e\x4d\x29\xea\xc1\xdc\xb4\x71\xe0\xb0\x88\x79\x35\x18\xda\xc3\x07\x71\xf0\xe7\xd0\xd9\xc1\x9d\xe2\x9d\x6d\x6a\x21\x25\xd9\x3b\xb7\x1d\xca\x7d\x74\x68\x32\x6e\x93\x41\xbb\xdd\xc7\xbe\xd9\x53\xf5\xac\x35\xb1\x02\x31\x77\xa0\x9c\x70\xda\xdc\xc9\xbc\xd8\x52\xa2\x2a\x19\x64\x93\x4e\xde\x73\xee\x51\xeb\xe0\xb0\xd5\x3d\x17\x3c\x44\x25\x4c\xde\x4b\x75\x81\x80\xd5\x46\xb8\x07\xf1\x9d\x41\x1c\xfc\x3b\x67\xcd\xd0\x32\xaa\x4b\x86\xcf\x92\x66\x7e\xbc\x44\xb8\x60\x33\xf3\x81\xc0\x3d\xfb\x6b\x7e\x55\x90\x48\xc4\xfa\x18\xc1\xcc\xb3\x31\x44\x5c\x10\x07\x7f\xc6\x38\xd3\x49\x23\x04\x76\xc3\xe5\xfe\xf2\x99\x94\x1e\xc1\x4b\x0a\x2c\x4f\x9b\xbd\xf8\xbe\xfd\x79\x9a\x60\xae\x9c\x98\x58\xda\x96\x8c\x88\x0b\xe2\xe0\x71\xd3\x4f\x4a\xd9\xdb\x3e\xfb\xde\x9c\x72\xb9\x74\xfd\x6a\xf0\x7d\xf4\x1c\x73\x94\xab\x11\x06\x7e\x96\x05\xca\x66\x72\x05\xb3\x24\xd0\x79\x06\x10\x07\x7f\x0e\x24\x9e\x93\xa2\xe7\x2e\x3f\xd1\xb5\x20\x9d\x6a\x88\xb1\x54\x69\x8f\x6a\xfb\x59\xb2\xf5\x5a\x13\x8f\xf1\x8a\x8b\xd1\xb5\xbd\xb4\x06\xc4\xdc\x81\x12\xeb\x69\x73\xe7\x54\xaf\xbb\x9e\x32\xc4\x7d\xa1\x7e\xdb\xbd\xab\x54\x89\xdc\x26\x97\xd8\x2e\x31\xb3\x21\xda\x62\x48\x31\x1f\xef\xd7\xe7\x78\xa8\x8f\x16\x88\x83\x7f\xe7\xec\x7b\x34\xdd\xb7\x69\xda\x6d\xa7\x8c\x55\xd7\x9f\x0a\x77\x62\x39\xef\x24\xdc\x27\x54\x25\xc0\x71\xc9\xe4\x25\xea\xe4\x73\x81\x5a\x09\x83\x38\xa4\xfe\x39\x9d\x8f\x26\x76\x8f\xc5\xbe\x4b\xd7\x1a\x5f\x0d\x7f\x87\xd2\x9e\x13\xc6\xc8\xa1\x6a\x59\x3e\xe6\x2b\x8d\xb7\x3c\x81\x36\x75\x01\xea\x9f\x03\xe0\xe0\x71\x1f\x3d\x8a\x92\x9e\xd0\xfd\x4c\x4c\x11\x39\xff\x82\xba\x76\x59\x49\x97\x98\xea\xd6\xb3\x66\xf5\xac\x02\xf5\x07\xaa\xbd\x33\x5f\xa0\xd2\x51\x10\x07\x7f\x0e\xaf\xbe\x5f\xc0\x9d\x1c\xad\x53\xec\x9b\x1f\xe6\x31\xb9\xca\x77\x30\xab\x9e\x37\xfa\xea\xc9\x0a\x37\x33\x95\xd0\x70\xe4\x78\x7a\x2e\xc2\xa1\x81\x56\xf7\xa7\x3b\xb4\x87\xab\x78\x06\x65\x7a\x11\xef\xb8\x7e\x77\x78\x5b\xb0\x66\x1a\x6b\x6e\x09\x71\x34\x68\xb6\x2b\x4b\x39\x69\xf3\x04\xa6\x1c\x2b\x23\xdc\x0e\x88\x43\x76\x68\x1f\x56\x6e\x27\x91\xe9\xa4\xba\x3e\x25\x88\xde\xc5\x3a\x90\xb8\x17\xe6\xd5\x7e\xc0\x6a\xbc\xd8\xf1\xd2\x8f\xf8\xc8\x7b\xc9\x4a\x1d\x11\x19\xc4\x21\x3b\x34\x7a\x61\x27\x4e\xf4\xf5\x07\x9d\x06\x92\x55\x8c\x21\xf4\xea\x6a\x23\xb7\x63\x79\xd8\x14\xbb\xce\x0b\x2c\xa2\xdb\xb9\xd2\xd1\x2f\x21\x22\x83\xb8\xff\x73\x68\x38\xff\x88\xfc\x3f\x5f\x06\x7a\x78\xb7\x57\x92\x2e\x36\x4c\x27\xd7\xa8\x2c\x87\x68\x49\x9b\x56\xb9\x09\xad\x2a\x7b\x81\xcc\x90\x67\xbd\x97\x79\xfe\x3a\xc9\x8d\xbf\x1d\xda\xca\x2c\xf6\xbe\x66\x37\x2f\xfa\x39\x2d\xce\x6a\xa6\x15\xe6\xfa\x54\x35\x63\xfb\x41\xb7\x0b\x96\xf7\x71\x49\x50\xf5\x8f\x86\x63\xfe\x42\x49\xa5\xf2\x16\x14\x5c\x9b\x09\x5c\xd8\x53\x4b\x50\x46\x76\x93\xe4\x02\x7f\x8f\x95\xe5\x59\x37\xbf\x29\x0b\x0e\x2e\x7f\xb3\x1c\xf9\x5f\x73\x68\xa0\xa1\xfd\x5d\xee\x87\xe4\xd0\xa4\x23\xb4\x7e\xf7\xdf\x20\x8c\xa7\xf9\x5c\x77\xe8\xa4\xb7\xf4\x59\xd7\x8b\xca\xd0\xe4\x0a\x06\xb1\xbb\xf7\xd5\x32\x76\x7e\x39\xb3\x33\xd9\xde\x41\x76\x68\x05\x0f\x0e\x49\xd8\xdf\xf4\xbe\x1c\x20\x8e\x63\xc7\xd0\xba\x99\xf2\xe2\x37\xdb\x60\x83\xbd\xd1\x87\x6f\x65\x32\x1a\xb6\x74\xe7\x7e\x9f\xc9\x66\x16\xb2\x43\xbb\x30\x7a\xc4\xb2\x1d\xa9\xc0\xfa\x24\xcf\xaa\x89\x03\x5b\x90\xd6\x21\x34\x95\x33\xb2\x5c\xff\xb1\xcb\xb2\xc0\xab\x02\xa1\x4a\xcc\x33\x19\x2d\xb2\x43\x73\xce\x48\xb9\xfa\xd1\xc3\x9b\x69\x3e\x39\xcd\x66\x7e\xe0\x18\xc5\x99\x86\xf1\xc3\x98\xe0\x01\xe3\x93\xe7\x82\xe7\x6e\x24\x9f\xaf\x3a\x93\xd1\x22\x3b\x34\x25\x61\xc7\xa0\x84\x5c\xd1\x2e\xd5\xdd\x1f\xd6\xa3\xe1\xb4\x39\x8f\x48\x56\xf5\x7c\xce\xcf\xb7\xd9\xf5\xd1\x2d\x8d\xaf\xe3\x66\x9d\x99\x43\x03\x89\xe8\xb4\x8c\x15\x7b\xd3\x86\x5d\x23\x2b\x58\x9f\x7d\x51\xaf\xfd\xa5\xfc\x77\x9e\x15\x4a\x85\xde\xf5\xe1\xa2\xe2\x2d\xed\xbd\xc9\xd4\xfd\x60\x68\xaf\x0b\xc4\xc1\xdf\xd4\x5d\xae\x13\xe1\x3e\x94\xc7\xd2\x58\x24\xf1\xe1\x04\x56\x92\x3c\xc7\x2c\xc3\xef\x74\x38\xf4\x1f\xb9\xb6\x7f\x36\xbe\xd5\x12\x0d\x35\x3b\x00\x71\xf0\xcc\x82\x4e\xba\x21\x4b\x94\x55\x70\xeb\x26\xdb\x60\xd9\x9f\xb2\xe8\xc1\x4f\xd7\x49\x9c\x29\xf1\xad\x55\x3d\x23\x0f\xc6\x9b\xef\xfd\x81\xca\xfd\x40\x1c\x3c\x6e\x56\xcd\x0e\x91\x4a\xb0\x46\xf6\xbb\x67\xc2\x01\x9f\x58\x0d\x5f\xaa\x8b\x11\xc5\xad\xee\x6f\x44\xa4\xdd\x89\x6c\xac\x98\x16\x80\x0a\xfe\x41\x5c\x88\x0c\x0a\xce\xdf\x71\x0d\x3d\xc2\xe7\x09\x4f\x14\x22\x55\xdf\xae\x39\x9b\xfd\x5a\x9e\x40\xbf\x60\x32\x35\x5b\xb9\xf3\x48\xcc\xd3\x6e\xf6\x76\x61\x6f\x23\x62\xb5\x01\xfa\x25\x9e\x36\x77\x41\x17\xec\xa4\x83\xc8\x3c\x86\x6a\x8e\xd6\xf8\x2c\x8a\x07\x75\x5f\xa4\xad\xf5\x53\x9b\x0b\x3c\x23\xfc\x21\xf2\x23\x19\x9b\x58\x01\xf1\x9d\x41\x1c\x7c\xee\x14\x7d\xf9\x86\x77\xc9\xcc\xaa\xc3\x4b\x42\xbe\x8a\x08\xcc\x2c\x0d\x99\x60\x13\xe2\xf4\xc4\x58\xd7\xab\xce\x48\xaf\xc4\xbf\xee\x44\xc4\x05\x71\xf0\x67\x6c\x30\x20\xb2\xbc\xb6\x54\x5b\xfe\x6c\xda\xd5\x2b\x04\xad\x79\x20\x2a\x72\x9a\x42\x7b\xf9\x92\xdc\xaf\x6b\x3b\x41\x99\x44\x45\x50\xdd\x0f\x88\x83\xc7\xa5\x11\x96\x20\x96\x7d\x7c\xe7\x46\x49\x32\x8f\xf2\xb7\xe1\x1e\xfa\xdf\xdb\x72\x9e\x45\x01\x94\x14\xed\xba\x1b\x55\xe8\xa2\xa4\xd0\x4a\x11\xc4\xc1\xe7\x8e\x39\x55\x49\xfa\x19\x96\xd4\x52\xe9\x05\xb7\x6d\x2b\x2e\xeb\x8a\x4d\x23\x39\x26\xeb\xc5\x09\xc5\xa7\x62\xcc\xf6\x1f\x22\x67\xb1\x11\x73\x07\x7a\x9d\x9d\x36\x77\x2b\x43\xb2\xee\x31\xb5\xb7\x71\xd6\x59\xb0\x2e\x6e\xd9\x6d\x5d\x4b\x56\xc3\xeb\xd1\xb6\x4f\x8b\xbc\x95\xfa\x70\xc1\xc1\xfc\x1c\xf4\x8f\x00\x88\x83\xcf\xdd\x0c\xe7\xc1\x94\xcc\xf3\x86\x61\x3f\x7e\x0f\x42\x7f\xb7\xb6\x24\x8b\x5a\x4c\x76\x72\xdd\xcb\x57\xb8\x1b\xe3\x71\x84\x09\x76\xb6\x10\x71\x41\x1c\xd2\x33\x16\xb4\xfc\x43\xb7\xe8\xe7\xb5\x49\x1e\x2a\xe3\x17\x84\x3f\x65\xed\x97\x41\xe5\xba\x7a\xf5\xca\xfd\x07\x69\xe9\x81\x55\xbe\x2a\xd0\x33\x06\x70\xf0\xb8\xc3\xae\xc7\x4a\x7e\x84\x6d\x3a\xe4\xcd\x51\x8f\xd9\xb3\x37\x29\x64\x1d\x6f\x98\xbe\x5a\x9d\x25\x23\x1c\x2d\xa5\x7a\xb0\x41\x00\xed\xcd\x81\x38\xf8\xdc\x39\x10\x16\x5d\x30\x4f\x8d\xe4\x32\x7f\x27\xc6\x76\xef\x8e\x7c\xae\xd0\x95\xa3\x6b\x3d\x07\xd1\x8e\x09\xe3\x8b\x46\x18\xe6\x59\x3e\x88\xb9\x03\xe5\x84\xd3\xe6\xee\x5d\x9d\x88\x4c\x38\x71\x25\x59\x28\x45\x80\xb7\xd1\xf1\x5d\x11\x29\xce\x22\xb3\x6a\x32\xb7\x47\xf8\x64\xca\x4a\xfc\xfd\xd7\xa1\xeb\x68\x41\x1c\x7c\xee\xba\xb7\x79\x88\x7b\x25\xae\xa7\x7e\x4c\x11\xc2\xab\x67\xf6\xf7\xba\xfd\x1e\x93\xe8\x47\x6a\x72\x57\x20\xbe\x69\xc8\x83\x97\x2b\x4a\x88\xb8\x20\x0e\xfe\x8c\x9d\x42\xea\x13\xe5\x8b\xe6\x79\x3d\x75\x6c\x55\xeb\xec\x35\x6e\xed\xd9\xba\xcb\xa6\x0c\x71\xa6\x31\x5f\xde\x12\xed\xb6\xd3\xf4\x85\x5c\x09\x80\x83\xc7\xb5\xc7\xf2\xf7\xa1\xf9\x62\x27\x55\x1b\x62\xa6\xee\x28\xb6\x7c\xe8\x42\xf6\x70\x42\x3b\x8d\xeb\x2e\xcb\xc0\x37\xec\x64\xc2\xd6\x14\xa8\x51\x0e\x80\x83\xcf\xdd\x43\xab\x4a\x6d\x81\x80\x6f\x01\xbc\xcc\x66\xef\xbb\x9e\x8e\xfa\xe4\x26\x53\x7d\xeb\xf0\xfa\x23\x21\xa1\x68\x66\xd2\xe6\x5d\x23\x8a\x98\x3b\x50\x62\x3d\x6d\xee\xa4\x86\x0f\x1a\x7d\x0f\xca\xe8\x62\xfa\x63\xda\xa5\xf9\x7f\x5a\x07\x54\xd6\x14\x7e\x35\xf3\x1b\x40\xf3\x6e\x4a\x92\xc6\x9e\xab\x46\x7c\x67\x10\x87\xd4\xdc\x67\x6a\xc4\x81\xc8\x7b\x6e\x54\x0c\x5b\x7b\x8d\x85\x8e\x5d\x42\x2e\x9d\xba\x0b\x6b\xf4\xc5\x9b\x77\xea\x2f\xdc\xe5\xe2\x6f\x3d\x82\x9a\xfb\x00\x38\xf8\x33\x96\xc3\xc8\x94\xb5\xc4\x16\xf6\xef\xfe\x96\xd8\x1c\xb2\xb1\x8e\x2d\x3e\xe8\x5e\xa8\x8c\x25\x71\xf0\xe5\xc9\x5b\xb4\x8f\x19\x6e\xc7\x88\xb8\x20\x0e\x1e\x97\xcd\x85\x41\x98\x7b\x85\xe6\x95\x67\x1d\x6e\xaa\xc7\x3e\xe9\xcb\xc5\x1f\x6a\xb1\x97\xd8\x85\x19\xd9\x6c\x44\x6e\x04\xb4\x33\x8e\x22\xe2\x82\x38\xf8\xdc\x75\x71\xdf\x09\xa4\x8c\x76\x76\x7a\xf9\xeb\x60\xf2\xe8\xb0\xe2\xfe\x6f\x05\x7c\x5e\x1e\xd2\xba\x55\xe3\x6f\x99\x96\x9e\x25\x5b\x65\x08\x87\x06\x5a\xdd\x9f\xee\xd0\xfa\x06\x89\xaa\xbf\x66\x57\x4d\xa0\xa8\x3a\x33\x2a\x0c\x56\x86\xb7\x3a\xfe\x96\x88\xca\x9e\x75\x6d\x74\xca\x3a\x48\x2f\xa1\xc0\x42\xb8\x1d\x10\x87\xec\xd0\x64\x55\x68\xc4\x36\xf6\xb7\x1f\x91\xd0\x2f\x87\x2d\x57\xd3\xa1\x1c\x74\xf1\xd5\x46\x37\x04\x30\x6c\xb6\x47\x11\xe1\x33\x24\x32\x23\x22\x83\x38\x64\x87\x16\x83\x47\xd6\xd2\x58\xe6\x58\x33\xe3\x5c\x55\xac\x9a\x59\x32\x30\xba\x7c\xd3\xed\xf3\x1a\x49\x35\x69\xb4\xd1\x43\xf7\x09\xac\xeb\x88\xc8\x20\xee\xff\x1c\xda\x3f\xbb\xc9\xfe\xcf\xf7\x54\x5e\x7c\x76\x81\x9b\x51\x77\xae\xfa\x7c\xf0\x8d\xce\x5c\xd5\x39\x6a\x63\xe2\x0a\x81\xac\x62\x73\xf9\x60\xb7\xfb\x38\xe2\x4a\x01\xae\x7f\x3b\xb4\x27\x2c\x79\x9c\x82\x1f\xb4\x4a\xdb\xee\x95\xb5\x56\x62\xd5\xf6\xbd\x16\xc6\x7a\x35\xf7\x2a\x03\x67\x43\x7a\x50\x45\x46\x39\xe9\xef\x0e\x20\xbe\x0a\x5c\x6c\xc2\x66\x5f\x1f\x3e\xe1\x11\xc4\x54\x19\x28\x68\x1a\x33\x55\xbf\x3c\xbe\x1e\x39\x26\x57\xd4\xa3\x9e\x3e\xb5\xa4\xf7\x5f\x73\x68\xa0\xa1\xfd\x5d\x87\xa6\x00\x5f\xc5\xd7\xe5\x4a\x92\x27\xd2\xd3\xf8\xa8\x59\x90\x8e\x32\xcc\xfd\x5e\xc9\xb1\xfe\xba\x1d\xf6\xe8\xa0\xa9\xe5\x48\xf7\x97\xa4\x7f\xd1\x99\x9c\xfb\x0b\x44\x76\x68\x8b\x59\x8b\xf8\x5a\x17\xda\x4b\x8b\x15\x95\x77\x9e\xb0\x1f\xad\x76\xcf\xde\xc4\x4e\x57\x2b\x2f\xde\x72\x8f\x97\x57\x4b\xfb\x76\x36\x17\x55\x5e\x43\xfa\x58\x76\x42\xce\x9f\xa8\x9b\x96\x98\x03\xea\x35\xd8\x3f\x23\x6a\xee\xe9\xf4\xd1\x3a\x26\x5a\x8e\x0f\x2f\xde\x23\x0c\xe4\x7a\x8e\xf6\xe0\x4c\x46\x8b\xec\xd0\x3e\x9a\x1c\x1a\x73\x6f\xd4\x86\xcb\x6b\x9d\xe7\xaf\xc0\x78\xae\x17\x8b\xfa\xf5\xfd\x63\xcf\xfb\x64\x95\x0c\x54\xee\x36\x43\xc2\x39\x67\x32\x5a\x57\xa4\x8f\xe5\x62\x73\xd0\x0d\xf1\xa2\x27\x11\x76\x72\xcb\xb2\xf8\x80\xc3\xcd\xfd\x96\xd9\x99\x5f\xe8\x30\x8b\xe7\x75\x72\x22\xca\x85\x20\x8a\x33\x73\x68\x20\x11\x9d\x96\xb1\x06\x57\xe8\x27\xf9\xe4\xc5\x3f\xfe\x18\x24\xf8\xbd\x46\xc6\x43\xa7\x38\xaf\xe6\x5e\xef\x23\x74\x35\xe2\x87\x45\x63\x44\xf8\xbb\x7c\xc4\x9b\x1a\xc4\xc1\x33\x56\xd5\x5a\x8a\x1a\x83\x8a\x35\x15\xc1\x0b\xf4\xbd\xcd\x8b\x55\xad\x8f\xbc\xd1\x86\xa4\x96\xa7\xab\xbc\x2f\x3e\xa8\xb1\x4d\x66\x82\xfa\xb2\x83\x38\x78\x66\x79\x92\xa4\x90\xbc\x5f\x35\x9c\x7e\x35\xa5\x75\x4d\x89\x2e\x50\xd8\x27\xfe\x5a\xfb\xb7\xc6\x16\xef\x0b\x73\x13\x27\x15\x9f\x69\x3e\x43\xad\x0e\x01\x1c\x3c\xee\x00\xd1\x22\x1d\x39\x45\xf1\x86\x64\x74\xae\xe0\x90\xc6\x46\xe9\xa1\x02\x23\x0e\x16\x87\x99\xc7\x4d\x3b\x33\xe9\x95\x3b\x16\x8f\x11\x71\x41\x5c\x88\x0c\x4a\xe0\xdf\x71\xdb\x1e\x39\xdc\x52\x8d\xf9\x44\x5c\xca\xa8\x39\x61\x76\x2d\xcf\x39\xe2\x62\xb6\xa9\xbc\x3f\x73\xf9\x92\x17\x4e\x1e\x73\x9b\xc2\x0e\x62\xb5\x01\xfa\x25\x9e\xfa\x5f\xbe\xe6\xb3\xb6\x7e\x6c\xe3\x6a\x36\x6b\xe3\xea\xb8\xfa\x25\x09\xd5\x35\xe6\xe0\xeb\x95\x72\xb7\x38\x77\x26\xb7\x37\x98\xd9\xb0\xa0\xff\xf2\x01\x1c\x7c\xee\xd4\x6d\xe7\x64\xc4\x5f\xbd\xa8\x7f\x77\xc4\xa7\x32\xef\x2a\x8d\x31\x15\xb3\xf7\x21\x87\x92\xa6\x8d\x9a\x62\x2f\xb8\xe8\x17\x35\xd4\xa1\x05\xc4\xc1\x9f\x31\xd3\x73\x8f\x14\xb5\xed\x70\xdc\xda\xb8\xe0\x62\x9f\x41\x87\xab\x85\xaf\xcb\xcb\x6a\xc7\x76\x95\xf3\x1a\x3a\x6b\x83\x4f\xaa\xff\x20\xe2\x82\x38\x78\xdc\x63\x0a\x2b\x2a\x16\x09\x0b\xde\x04\x3d\x01\xda\x12\xa5\x8f\x36\x0c\xba\xb4\xc1\x82\xfe\xf8\x91\x21\xaf\xe7\xa9\xdb\x44\x16\xa0\xce\x0c\x20\x0e\x3e\x77\xd3\xe5\x2f\xa3\x6a\x8c\xe6\xc9\x66\x86\xd7\xea\x3c\xd9\x8a\xf6\x65\x6f\xda\x73\x16\x0e\xbf\x17\xa9\xc8\x42\xcd\xab\x38\xd1\x15\x46\xcc\x1d\xe8\x75\x76\x6a\x0b\x40\x94\xc9\x3c\x9b\x28\xc5\xda\xa8\xfb\x66\x41\x62\xac\xb5\xfd\x5f\xad\x50\xea\xa5\xc2\xff\x90\x18\x75\x09\x04\x65\x7b\x45\x11\x42\x2d\x00\x01\x1c\x7c\xee\x9c\x02\x82\xc3\xcb\xf8\x06\x0f\xd0\xb8\x98\xf5\xce\x91\xaa\x61\x99\x4b\x1e\x91\xc9\xe6\x66\x33\x59\x30\x37\xd5\xbc\x52\xa8\x84\x1c\x1a\x88\x83\x3f\xe3\x73\xc4\x24\x1f\xea\xfc\xa8\x13\x5c\x98\x52\x1c\xe3\x12\x35\x4c\xd6\xb5\x30\xc2\xf4\xcd\xa4\x37\x26\x4f\x34\x9e\x36\xee\x2b\x40\x4e\x0a\xc4\xc1\xe3\x26\x60\x6d\xda\x31\x7a\xbe\x44\xdf\xc3\xec\x98\x98\x2b\x95\x3d\x59\xcb\xdd\xa6\x20\x6c\xd8\x93\xf9\x96\xed\xd9\xf2\xe4\x93\xea\x04\xb4\xd7\x0e\xe0\xe0\x73\xb7\x58\x5b\x6a\x60\xfc\x49\xcb\x4a\x66\x90\x90\x8a\x9a\xc4\x66\xe3\x51\xa4\x81\xd7\xb9\xd5\xc9\xc0\x90\x96\xa2\xfc\x10\x0f\xa2\xd7\x88\xb9\x03\xe5\x84\xd3\xe6\xae\xcd\x2c\xba\xfa\xde\x5d\x4c\x3f\xc3\xe4\xe3\xdc\x37\x7e\x5d\xfa\x32\xd3\xd9\x72\x57\x94\x4e\x9e\x55\xef\xd0\x0d\x25\xe0\x46\x3a\x22\xbe\x33\x88\x83\xcf\xdd\xae\x26\x01\xce\xfa\x55\xeb\x07\x2a\x56\x54\x26\xd3\xd9\x31\x65\xb4\xa6\xd4\x7e\x17\x9e\x60\x36\x45\xfa\x53\x5f\xe5\x74\x8c\x83\x7e\xcf\x20\x0e\xe9\x77\xd7\x44\xa6\x7e\x43\x78\xb8\xfe\xd6\x6d\x5e\x4e\x56\xdc\x2c\x5b\x9d\x98\xeb\xe2\x0e\x37\xa9\x6f\xcb\x0c\x2b\xba\xf0\x1b\x99\x43\xf7\xa4\x80\x38\x24\x87\xb6\xfa\xe4\xf7\x0d\x1a\x21\x41\x7c\x4d\xab\x5e\xef\xe1\xe5\x8d\xc4\x59\xd5\x4e\x4a\xfd\x09\x02\x22\x34\x36\xdc\xa5\xbb\x54\x9a\x90\x43\x03\x70\xf0\xb9\x13\x78\x76\xe0\xf7\x39\x98\xf3\x4a\xc9\x77\xaf\xca\x3f\xc1\x82\x24\xad\xb3\x42\x51\xf1\xe7\x6d\x65\x6d\x8c\xbb\xaa\x82\x4e\xfe\xb0\x21\xe6\x0e\x94\x58\x4f\x9b\x3b\xe7\x9e\x7b\xb4\x2d\xa1\x78\xbf\xff\x3f\xe6\xde\x32\xaa\x8a\x2e\xec\xff\x27\xa4\x41\x5a\x3a\x05\x04\x14\x69\x90\xee\x0e\x91\x06\xe9\x4e\x01\x29\x49\x05\x44\xa5\x14\xa4\x14\xa4\x3b\x44\x10\x69\x44\xba\x1b\x04\x69\x10\xe9\x6e\x10\x90\xff\x7a\x9e\xb5\xce\x3c\xde\x73\x58\xff\xb9\xd7\xfa\xf1\xe2\x7e\xff\x59\xd7\x99\x7d\xbe\x33\x73\xed\xef\xec\xbd\xaf\xeb\x63\x58\x13\x8e\x23\xbb\xfd\x91\x70\x5c\xad\x55\xa5\xa4\xe7\xf3\x85\x32\x86\x8e\xcd\x91\x26\x60\x3d\x11\x8a\x03\x6b\x57\x70\x4f\xba\xf6\x31\x97\x6c\xd1\xad\x26\x83\xd7\xe4\x82\xf3\x84\x38\x96\xcf\x11\xa2\x0e\x9a\x28\xa7\xa5\x58\x6a\x1d\x1e\xdf\x06\x2a\x04\x41\x71\x70\x6b\x68\x1d\xb4\x7a\x27\x52\xce\x9e\x1a\x44\x2c\x47\xe7\x16\xe5\xaa\x18\xdc\xbf\x32\xc7\x54\x03\xd7\xd1\x88\x24\xe2\xe6\x0c\xeb\x81\x86\xcf\x50\x1c\x38\x6e\xf0\x83\xee\xd5\xf0\x0e\x75\x76\xfc\xac\xbb\x9f\x36\x0b\xaf\xab\x0d\xcc\x2a\xfb\x19\x9d\xdd\x17\x46\x77\x78\xaa\x53\x2c\xe5\x05\xe4\x7d\x28\x0e\xac\x5d\xd5\xe9\x93\xdc\xc6\x6b\xf3\xd9\x54\x0a\x35\x79\x6d\x52\x1a\x64\x3b\x61\x6e\x49\x3d\xe2\x26\x5c\xae\x18\x89\x52\xca\x53\xc3\x8b\x30\x87\x06\x35\xbb\xbf\xdc\xa1\x35\x6b\xa7\x4c\xbc\x34\xa4\x94\x22\x9d\x5d\xd4\xdb\x0f\x9d\xae\x4d\x6e\x36\xfe\xe6\xde\xd8\x4e\x2e\x69\xf2\xa6\xef\x67\xc4\x0f\x56\x98\xdb\x81\xe2\xe0\x1d\x9a\xf8\xcd\x95\x91\x92\x8f\x77\x0a\x77\x96\xe3\x82\x58\xd9\xbc\xe5\x0d\xe5\x6b\x22\x48\x71\xc8\x7b\xc3\x98\xde\x07\x17\xb0\x71\x32\xc1\x22\x43\x71\xf0\x0e\x4d\x84\xc3\x9b\x39\x29\xf8\xf5\xf3\xe1\x92\x16\x4e\xaf\xb7\x6b\x98\xd2\xf4\x82\xfd\xa5\xd1\xc8\x9f\xb3\x99\x90\x11\x6b\xdd\x34\xfd\x61\x91\xa1\xb8\xff\x71\x68\xff\xbc\xe7\xfe\x75\x0b\xc5\x56\x37\xc6\x36\xd9\xa7\xa7\x14\xb1\x1e\x8f\x6d\x7a\x7e\xaf\x52\xa3\x0b\xc9\x9d\xfc\x2a\xc3\x45\x8d\xec\x59\x62\xa1\x1e\xd5\xe9\xfa\xdb\xa1\xa5\x3b\xbb\x45\xa5\x2a\xde\x1a\xf1\xf8\xa9\x13\xf9\xdd\x82\xf7\xb6\xe0\x67\x6f\xe2\xf3\x22\xa3\x79\x64\x82\x77\x99\xd4\x07\x06\xdd\x7f\xa1\xe1\xc8\x68\xd2\xfb\x4c\xb5\xa6\xba\x8f\x57\x8f\xdd\x7f\xb9\x5b\x3e\x9d\xa7\x40\x2c\xd9\xa8\x3f\x39\xed\xc0\x91\x9c\x8d\xb7\x91\xf9\xaf\x39\x34\xa8\xa1\xfd\x7d\x0e\x0d\xce\xa1\x59\x54\x3d\x22\xe2\xd2\x42\x38\x2c\x76\xfe\x25\x6d\xe8\x2b\xbf\x67\x20\xc2\xd6\xdb\xb8\x8a\x42\x86\x7d\xc1\x33\xf6\x40\x6d\x85\xf4\x4a\x96\x77\xe0\x1d\xda\xa1\x48\xd9\x39\x71\x27\xed\xac\xac\x49\x6e\xbc\xcf\x86\x5b\x76\x1f\x2b\x93\x49\xbe\x65\x1e\x15\x3f\x5e\x45\xa4\xaa\x5f\xe6\xf0\x95\x2c\x66\xc1\x3b\xb4\xc1\x62\x8a\xaf\xdd\xe7\x96\x8f\xc4\x6f\x8e\x57\x33\x13\xb5\x37\xdf\x08\x96\x39\x21\x59\xb7\xa5\x60\x22\x6e\x40\x88\xcf\x4b\xce\xbb\x92\xd1\xc2\x3b\x34\x31\x45\x24\x64\x85\x01\xd9\x17\xd9\x81\x83\x1a\xfb\xf5\x0c\xab\xa8\xb2\x4c\x1d\x95\xcf\xbe\x26\xe4\xba\x52\x4d\x7b\x68\xbd\x0a\xbc\x92\xd1\xc2\x3b\x34\xcf\xe2\xd2\xbe\xdf\xce\xb2\x29\xfa\xa1\x77\xf8\x50\x42\x9d\x63\xaa\xe3\x5b\x55\x9e\x14\x13\xdc\xfa\xde\x29\x7f\x58\xfb\x84\x48\xe1\xca\x1c\x1a\xd4\x4d\x74\x59\xc6\xca\x72\xa8\x24\xe8\x69\xa7\xb1\x9f\xa6\x64\xd4\xad\x31\xe1\x9a\xe4\x60\x4a\x3b\xa4\x61\x95\xa0\x57\xd4\xce\xd9\xcf\xe8\x73\x46\x06\xf6\xb9\x43\x70\xe0\x8c\xf5\xfb\xdb\x32\xbd\x9f\x79\x36\x22\x51\x6d\xa6\xcb\xcd\xe6\x31\x69\x07\x0c\xb7\x04\x2f\x47\xea\x9d\x9e\xc2\x13\xb4\x53\x09\x5d\xa0\x37\x23\x14\x07\xce\x2c\x2c\xa3\x2a\x6a\x7c\xb8\x0f\x17\xaf\xe7\xc4\x7d\xab\xfc\x56\x4d\x77\x2a\x71\x8a\xd8\xf1\x52\xc0\x81\xb5\x62\xbd\xec\xbb\x52\x9c\x04\x2c\x2e\x14\x07\xfe\xf6\xf7\xb9\x8e\xef\x85\xdd\x6a\x14\xb2\xa9\xac\xf2\x02\x4e\xda\x3e\xed\xb9\x42\x3c\xda\x6c\xf6\xeb\xd6\x43\x4a\xb1\xbe\x7e\xa6\xe1\x1c\x58\x5c\x28\x2e\x48\xf2\x9f\x3b\x11\x84\xe7\x98\xf6\x09\x9b\xd9\x0b\xb4\x16\x17\x37\x5a\x3b\x8e\x15\xee\xf8\xa8\xfc\x60\xa5\xaf\xa0\x74\xa6\xc3\x61\x6f\x8f\xb3\xb9\x06\x9b\x6d\x40\x3d\x89\x97\x69\x77\x61\xd8\xe9\x8b\xd8\x5f\x66\xb4\x4b\x62\x66\x7a\x7d\x0a\xc1\xf7\x57\xfb\xd6\x92\x4c\x5d\x35\x61\xc8\xcb\x8d\x14\xf9\xf3\x26\x3e\xd8\x35\x43\x71\x60\xed\xee\x18\xa7\xb4\x53\xbf\xb9\x58\xe9\xf3\x99\x30\xdd\x3b\x0d\x66\x99\x13\x5e\x2c\xce\x68\xc5\x3a\x42\x29\x77\x35\xd1\xc7\x38\x02\x0a\x72\x43\x71\x60\xed\xae\xab\x6d\xb1\xcf\x51\x04\x87\xf2\x1e\x8d\xfb\xa3\x05\xd0\xa0\x68\x2c\x5a\x4d\x4a\x32\xcd\x21\x3b\xbb\x67\xac\xd7\x4c\x28\xa5\xc3\xe2\x42\x71\x60\xed\xa4\x26\x0b\x7d\x52\xf5\x25\xd0\x23\x72\x36\xef\x06\xf2\x37\x89\x7c\x25\x7c\xc3\x7d\xc3\x8c\xb7\x0f\x67\xc5\x0b\x7f\x70\xad\xa5\x1f\x16\x17\x8a\x03\x6b\xa7\x56\x83\x68\x82\x38\xd2\xc0\xd7\x16\x86\xd7\x84\xa0\xad\xf4\x3a\x2c\x80\xc3\xcf\xb9\x72\xea\x19\xb7\xc8\xb6\x5f\x3f\xe1\xb0\x37\x4c\x3b\xa8\xd7\xd9\xa5\xd5\x26\x6e\x0e\x54\xfb\xd7\x1b\xe5\x05\x27\xff\x6a\x78\x69\xfd\x2a\x5a\x2f\x7d\xb0\x82\x35\x70\x5e\x94\xed\x83\x25\x81\xfa\xbb\x4c\xc0\x49\x41\x71\x60\xed\xdc\xfb\xe5\xf9\x3d\xa2\x63\x02\x9e\x44\x8b\x19\xfb\x1d\x72\x3b\xa0\x92\x6a\xcf\x90\x64\xb7\x1e\xf1\x8c\x85\x47\x8c\x4c\x56\x0d\xc0\xe2\x42\x71\x60\xed\xbc\x09\xf8\xfd\x38\xf1\x6b\x95\xbb\xfc\x94\x9e\xbf\x91\xa9\xb0\x9c\x7f\xfd\xe2\x17\x9f\x71\xd8\xb5\xee\x5f\x98\x58\x66\xad\x13\x11\xb0\xb8\x50\x1c\xdc\x37\xf7\xa7\x05\x55\xa2\x0e\x48\x1a\xd4\x4f\x68\xee\xe8\xe7\xfb\x76\x8c\x73\x5b\xbd\x40\x56\x6c\xa9\x2b\x56\x72\xe4\x1d\x10\xee\xdf\x06\xd6\xda\x21\x38\xb0\x76\x3f\xf7\x48\xfe\xf8\x95\x7f\x6e\x73\x50\x5c\x34\xec\x52\xca\xf7\x24\xa3\x7d\x89\x30\xa8\xd7\x14\xf9\xb4\x45\x19\xb1\x0a\x1b\x33\x15\xa6\x1d\x54\x4e\xb8\x74\x67\x38\x09\xfb\x83\x78\x4e\xd1\x79\xc7\x3a\x64\x7b\xa1\x1b\xbd\xd6\xf3\xad\xfa\xb2\xed\xb3\x4d\x87\xd6\x1d\x76\xca\x3f\x7f\x35\x33\x01\x3b\xc3\x21\x38\xb0\x76\x79\x22\x3f\x55\x87\x4e\x7c\x4d\x9f\xab\x08\x93\x04\x96\x77\xde\x40\xb4\x70\x11\x0e\x64\xbc\xaf\xba\xe4\x8a\x13\xb7\x3f\xba\x26\x08\x8b\x0b\xc5\x81\xb5\xd3\x94\xdd\x34\xb7\x0a\x19\xba\xb5\xbb\x80\xb7\x45\x23\xca\x15\xd4\xd7\xeb\xc3\x59\x12\xe5\x85\x40\xab\x28\xc6\x34\x4b\xcc\x82\x0d\x8b\x0b\xc5\x81\xb5\x73\x47\x98\xae\x9e\xbb\xb5\x6f\x2b\x2e\xba\xb9\x56\xd2\xe9\x48\xcc\xda\xd3\xe4\x94\x8b\xe4\x1e\x86\x32\x13\x34\xac\x11\xf9\x5b\x11\xb8\xd7\x20\x38\xb0\x76\xe1\x06\x8f\xeb\xe2\x87\x8d\xa9\x83\x75\x6f\xac\xb9\x7d\x1c\x2d\x8d\xe5\x47\x78\x4b\xa6\xa4\x88\x46\x64\x7c\x57\xee\x8e\xf5\x96\x3d\x4c\x3b\xa8\xc4\x7a\x99\x76\x65\xdc\x2d\xac\x38\x79\x47\x56\x75\x78\x3c\x93\x31\x23\x84\xbe\xc6\x86\xe6\x2e\xe8\xac\xdf\xc3\x9a\x9b\x9c\x97\x36\x34\x3b\xa8\x60\xd7\x0c\xc5\x81\xb5\x63\x9a\xea\x08\xe1\x22\x09\x22\x7c\x54\xc0\xc8\x64\x80\x61\x25\x9e\xb4\x38\xa2\x33\xa9\x19\x7c\x3c\x8e\x7d\x8a\x98\xa9\xa9\x62\x0e\xac\x49\x41\x70\x60\xed\x94\x9e\x7b\x64\x2d\x53\x7e\x95\x28\xf7\x30\xe3\x89\x43\x66\xa4\x3e\xf2\xaf\x4c\x70\x51\x69\x4f\x29\x59\x66\x7c\xf6\xfd\x7a\x08\xf0\xdc\x41\x71\x60\xed\x52\x3b\x96\xab\xed\x45\x94\xd8\x59\x99\x2f\xb0\xd2\xce\xa2\x5c\x97\xc5\xf4\xee\xad\xa1\x86\x7d\x6a\x0f\x93\x3e\x79\x2d\x7b\x03\xd8\xa9\x0b\xc5\x81\xb5\xd3\xfa\x64\xd6\x26\xc4\xe5\xb5\xef\x48\xd2\x4a\xe7\xe1\x4b\xfe\x40\x75\x95\x13\x5d\x79\x2a\x50\xe3\x47\x8c\xc6\x67\x6e\x99\x6f\x98\x30\x87\x06\x35\xbb\xbf\xdc\xa1\xd1\x67\x72\x48\x72\xd4\xa9\xa7\x5f\x1b\x8f\x89\x2a\xb8\xa1\xc5\x2b\xe6\x1f\x30\xe8\x85\xf9\xe4\x3c\x83\x43\xf4\xf7\x5d\xc5\x4d\xa0\x9e\x07\x14\x07\xef\xd0\xd6\x86\x75\xbb\x03\xf6\x63\xbb\x72\x51\x43\x5b\x36\x49\xe9\xb2\xce\xd7\xfd\x7a\x7d\x84\x4c\x9c\xa7\xab\x43\xf7\xd1\xb5\xdf\xca\xc0\x22\x43\x71\xf0\x0e\xcd\x38\x94\x47\x39\xc5\x68\x24\xda\xcc\xbd\xee\x28\xab\xca\x24\xbc\x04\x41\x44\x04\x5f\x06\xbf\xde\x82\x92\xe8\xdd\x26\x7f\x89\x26\x2c\x32\x14\xf7\x3f\x0e\xed\x9f\x75\x3d\xff\x75\x77\xbf\xba\x76\xc4\x03\x9e\x48\xe3\x26\x94\x76\x8d\xfe\x69\xde\x40\x9c\x9a\x15\x53\xf7\x5a\xa6\xa2\x25\xb7\x93\xc0\x59\x79\x2f\x75\x9c\xbf\x1d\x5a\xfd\x2b\xa5\x82\x75\x26\x14\xe2\xe1\xe4\x83\x97\x58\x68\xa5\x5a\x98\x04\xb1\xac\x42\x89\x5c\x48\x5b\x9b\x16\x1a\x45\xd3\xaa\x0f\xff\x42\x77\x3e\xee\xb1\x31\x7b\x99\xea\x6e\x0b\xe7\xac\x5c\x7c\x3d\x45\xcb\xcc\xbc\xe3\x84\xb2\xb4\x35\xf4\x9e\xf5\xc3\xc3\xa5\xd5\xdd\xa2\xff\x9a\x43\x83\x1a\xda\xdf\xe7\xd0\xe0\x1c\xda\xf0\x51\x9f\x6b\xe5\xcd\x61\xd6\x90\x63\xf1\x15\xec\x52\x49\x04\x6c\x92\x24\x63\x17\xe5\x6d\xbe\x2e\x43\x32\x93\x8e\x24\x9c\xe2\x2b\x59\xde\xe1\x82\x33\x0f\x8a\x91\xa6\x85\x4a\x6c\x51\x88\x33\xee\x35\x84\x8f\x8c\x96\x4e\xdc\xcf\x32\xca\xd2\xd0\x49\xb8\xed\x6f\x5e\x9b\xed\x39\xd4\x43\xbc\x92\xc5\x2c\x78\x87\xc6\x87\x43\x9e\xc0\xa5\x41\x22\x7c\xc4\xeb\x4f\x8a\x80\x1c\xc9\x68\x69\xc2\x63\x24\xd7\xd3\xd1\x9b\xc7\x46\xf9\x7e\xe3\x23\xd5\xd5\x2c\xdd\xe9\xc1\xf7\x32\xa4\xab\x5c\x4b\x1e\x0a\x71\xdf\x58\x1d\x5a\xb7\xc8\x34\xe6\x5a\x9c\x3b\x69\x77\xbf\xa9\x7b\xb6\x99\xcf\x63\x7e\x20\x68\x20\x71\x25\xa3\x85\x77\x68\xa9\xa2\xe3\xdf\xac\x9c\x1f\xaa\xcf\x25\xd2\x04\x9e\x94\x23\x68\x1e\x68\xcf\x4a\xe9\x66\xdd\xb8\xd0\xef\x4d\x23\x58\x8e\x88\x32\xba\x32\x87\x06\x75\x13\x5d\x96\xb1\x6e\x62\x77\x3c\xfc\x3a\x5b\x7e\x6d\xf8\xfd\x1b\x16\x15\x0c\x93\x47\x5a\x95\x0a\xb1\x08\x16\xac\x99\x9f\xb9\xde\xdc\xd6\xee\xac\x03\x6a\x2e\x42\x71\x70\x6b\x68\x0d\xa1\x89\xce\x99\x5f\x24\xef\x8f\x5b\xdc\x45\xbd\xd8\x37\xfd\x53\xda\xaf\xe4\xe7\x29\xb2\xdf\xa7\x11\xd2\xea\xca\x5f\x0c\x7c\xa3\x83\xe2\xc0\x19\xab\x4c\x29\xda\x40\x57\x53\xef\xd5\x54\x97\x41\x6e\x92\x33\x8a\xd0\x3e\x43\x61\x6e\xba\xfd\xa3\xef\xe9\x51\x8b\x0e\xc9\x3c\xad\x40\x77\x3f\x28\x0e\x9c\xb1\x5e\x5a\xf0\x3f\xf6\x16\x52\x61\x59\xbe\x9e\xa0\xd0\xf1\xd5\x58\x71\x81\x00\x9b\xf3\x22\x96\x14\x39\x5c\x60\xc0\x10\x89\x69\xd6\x08\x16\x17\x8a\x0b\x92\x14\xff\xc7\xff\xa0\x1f\x79\x6f\x4a\x9b\xe2\x89\x40\x63\xdf\x9a\x36\xdb\x07\x2a\x03\x6e\xd1\x27\x8d\x3e\x71\xcf\xfb\x11\x5e\x78\xd4\x64\xb2\x1c\x5c\x87\xcd\x36\xa0\x9e\xc4\xcb\xb4\xb3\x64\xf1\x55\x5a\xee\x25\x9f\x30\xf4\xe5\x78\x71\xf8\x66\xda\xb5\x77\x53\x4e\x23\x95\xab\x36\xd6\x4e\xe3\x1e\x52\xfd\xf6\x9e\x18\xec\x9a\xa1\x38\xb0\x76\xfe\xc3\x68\x35\xe7\x4d\x5f\x8b\xbe\xe1\xdf\xca\x57\x48\x4b\x98\xe1\xc9\x67\xf1\x68\xce\xfb\xf9\xc5\x4c\x71\xb3\x96\xc4\x76\xf0\x13\x50\x8d\x05\x82\x03\x6b\x17\xd9\x27\x10\xf3\x5a\x5c\xa9\x9c\xc0\x70\x23\x5d\x9c\xec\xf0\xd3\x2b\xf9\x43\xa1\xc1\xc5\x27\x2b\x6d\x6d\xea\xbd\x66\xc1\xe3\xaf\x60\x71\xa1\x38\xb0\x76\xd4\x56\xe7\xa1\x22\x7b\xf4\x7b\x6f\xb7\x65\x02\x4a\xea\x0d\xe8\x9d\x7f\xd4\xa5\xf6\xf7\x52\x29\x62\x51\x27\x19\x3e\x18\x4d\x02\x76\x4f\x42\x71\x60\xed\x92\x07\xab\x0d\x5f\x45\x4b\xd1\xac\x05\xa1\x2d\x95\x07\x70\x27\xf1\x53\x59\x0d\x29\x20\x63\x63\xda\x3c\x88\x30\x70\x67\x10\x07\x76\xca\x41\xbd\xce\x2e\xd3\x8e\xa4\xa9\x0b\xe3\x3b\xda\x1f\x7d\x44\x43\xb4\x4f\x23\xc4\x37\xc5\xf0\x7d\x86\x34\x30\x7e\x58\xdd\x8d\xa3\xc6\x55\x1a\x98\xa3\x00\x5a\xf5\x43\x71\x60\xed\xc2\x6f\x5c\x13\xc3\xbf\x13\xb1\x17\x8e\xdc\xd6\xcc\xc9\x4d\xe7\x28\x28\xe4\xa9\x2a\x67\x84\xe0\xf5\x65\xf7\x65\xd7\xd7\x70\xd5\xcf\x40\x45\x0f\x08\x0e\xac\x9d\x38\x8a\x44\x59\x0d\xa2\xb1\x17\x2a\xba\xfc\x62\x67\xf6\x4f\x94\xd2\x3d\x3a\x8c\xf9\x62\x0c\xce\x0f\xf4\x2c\xb5\xa1\xe6\x99\xa6\xb0\xb8\x50\x1c\x58\xbb\x47\x8e\x5f\xd6\x03\x8f\x15\xac\x4c\x4b\xad\x8b\x95\x2a\xb4\x26\x57\x6c\xfb\xfc\x1c\xba\xde\x70\x4e\x65\x08\xf9\xff\xf6\x39\x7a\x0e\xac\xc3\x40\x70\x60\xed\xe4\x1f\x2a\xab\x51\x12\xb0\x4e\xbe\xaa\x21\x79\xa9\x24\x7a\xe3\x9a\x03\x4b\xe9\x7e\x3e\xe6\x45\xb9\x34\xa3\x7d\xf2\xed\xd7\x1c\x6a\x30\xed\xa0\x72\xc2\x65\xda\x09\xd8\x06\xa1\x58\x14\x9d\x94\x94\x24\x65\x69\xf3\x7a\x0a\xbf\x79\xae\x11\xa2\x90\x8e\xf9\x2d\xcb\x8b\x29\xb6\xfd\xa3\xd2\xc9\x57\xd8\x35\x43\x71\x60\xed\x94\xc8\x50\xde\x47\xe7\xbd\xc2\x95\x93\x64\x90\xb7\x4d\x95\xa7\x3f\x67\xca\x7b\x4a\x76\xd7\xd3\xe7\x13\xfe\x5d\xb7\xc8\xc6\x42\x20\x2e\x14\x07\xd6\x2e\x5f\xda\xca\xca\x76\xe8\xf3\xdb\x44\xb4\x93\x4a\xe3\x7a\x9e\xc3\x0b\x66\xb7\xaf\x18\xf5\x0e\x86\xdf\x17\x05\x45\x1d\x0d\x7e\x03\xfb\x0e\xa0\x38\xb0\x76\x65\x26\x0b\x66\x7e\x36\x4a\xaf\x56\x98\xa5\x1e\x0d\xdb\xe8\xd7\xdc\xbf\x91\x75\xff\x37\x8b\xfc\xb9\x00\x51\xfd\x52\x44\xa7\x35\x50\x87\x13\x8a\x03\x6b\xa7\xf3\xf8\xf1\xb7\xf2\xa0\x07\xf8\xc7\xf8\x8e\xae\x58\xe1\xf8\x43\x49\x5a\x3b\xcd\xf8\x6d\x34\xb4\xb6\x87\x8f\xdc\xf9\xbf\x98\x2f\x00\xb5\x1c\x21\x12\xeb\x65\xda\xfd\x91\x23\xaf\x4e\x2f\xa1\xf5\x0d\xa0\xd8\x7a\x2a\x3e\xd2\x57\x11\x4d\x1e\x92\x28\xba\x33\xb8\x58\xf8\x40\x5b\x10\x79\x6c\x06\x58\xeb\x82\xe2\xc0\xda\xd5\x15\xe6\xfa\xa0\xdf\xdd\x3b\x47\x16\x4a\x1b\x78\x10\xfc\x30\x9d\x61\x1e\xbb\x2a\x39\x88\xae\xbd\x18\x51\x7e\x69\xa6\x37\x11\xa8\x34\x05\xc5\xc1\x9d\x21\x1c\x1d\xd3\x15\xd4\xb1\x3e\xcc\xaf\xed\x68\xcd\x9b\xa1\x89\x78\x60\x85\x62\x69\xc2\x51\x4a\xd2\xfe\xa4\xe3\xe5\xfd\x1b\xde\xc0\x3d\x01\xc5\x81\xb5\x63\xb9\xfd\x79\xd8\x49\x48\x20\x82\x9c\xa1\x5d\xba\x14\xeb\x30\x05\x95\x04\xb7\x6b\x5d\x33\x2b\xfe\x31\x5e\x10\x41\x2e\x05\x0b\x70\xfe\x1c\x8a\x03\x6b\xe7\x90\xf4\x34\xaa\xc0\xf3\x1a\xd7\x69\x08\xcd\x87\x8e\x44\x8c\xf1\xfa\x68\xf4\xaf\x6d\xdb\x7e\x0f\xe3\xfc\x0d\x6c\x4b\x45\x32\xfa\x61\x0e\x0d\x6a\x76\x7f\xb9\x43\x0b\xff\xa3\x2e\xea\x70\xaf\x6e\x30\x76\xb5\xd0\xc3\x98\xa9\x56\xa4\xf9\x5e\x65\x30\xc1\x8c\x73\x07\xdd\x84\x7a\x42\xe3\xd3\xcd\x1a\x98\xdb\x81\xe2\xe0\x1d\xda\x78\xaf\x75\xe4\xac\x56\xfd\x58\xa9\x68\xe3\x96\x1f\xd9\xa7\x67\xf1\x5b\x59\x88\xcc\xdd\x73\xda\xf8\xcd\x0e\x5c\x73\xef\xc6\xb5\x60\x91\xa1\x38\x78\x87\xf6\xe6\x5a\x6e\xbe\x02\x1a\x3f\xed\x7d\x5a\xd6\xe7\xae\x34\xa6\x23\xf3\x24\x1f\x06\x38\xc9\xca\x7f\x54\xcd\xa4\x4a\x75\x86\x11\x19\xc1\x22\x43\x71\xff\xeb\xd0\xfe\xa1\xe1\xbf\x6e\x3b\x27\x97\x26\xee\xfa\x26\xc5\xba\x24\xd4\xf9\xe7\xe3\xa7\x61\xad\x95\x2e\x61\x1d\xc3\x4b\xc5\x14\xf1\x99\x42\x05\x36\xc8\xd6\x93\xd4\xa1\xff\x30\x94\x4a\xa3\x27\xed\x47\x95\x37\xf1\x3d\x9f\xce\x7d\x8f\xa1\xd2\xbc\x8f\x35\x8a\xb8\x7c\x3f\x3c\xab\x56\xfe\xde\xdd\xf0\x92\xd9\xbf\xd0\x12\xb5\xb1\xf1\x40\xae\x94\xbd\x35\x9a\x99\x2d\x19\xdd\x4c\x32\xae\xa7\x5e\xf9\x5c\xba\xb8\xf1\x96\x75\xe8\x02\xe8\x5b\x8b\xbf\xff\x6b\x0e\x0d\x6a\x68\x7f\x9f\x43\x83\x73\x68\xf6\xda\x3a\x71\x6d\x69\xda\xe5\xec\x63\x8a\x4d\xde\x7e\xd5\xe5\x39\x19\x55\xef\x7b\xbb\xb2\x26\x06\x9e\xb0\xd5\xb8\xe4\x72\xb5\x5c\xc9\xf2\x0e\xbc\x43\x0b\xf6\x0e\x5f\xce\xda\x51\x31\x74\x9e\x9e\x98\xf7\xf4\xd1\xfd\x16\x92\x2e\x2b\x90\x8a\xf8\xcb\xf3\x77\xf6\xd9\xd2\xea\x8f\xa7\xa8\x57\xb2\x98\x05\xef\xd0\xc6\x31\x1b\x75\x9f\x72\x9a\x86\x1e\x73\x4a\x08\xf3\xa3\xa9\xe9\xae\x95\x55\xcd\x96\x53\x70\x26\x2e\x38\xe8\xe8\xc4\xe9\xeb\x3b\x5f\xc9\x68\xe1\x1d\x5a\xff\x1b\x5c\x5a\x8a\x03\x6e\x1f\xac\xef\x58\x52\xba\xcf\x3f\x94\x4f\xa4\x13\x86\x3b\x21\x15\xc5\xaa\xbd\x31\xdc\xbf\x61\x2c\x79\x25\x95\x2b\xeb\xe1\x1d\x5a\xa0\x5f\x50\x57\x99\xfd\xde\xc7\xac\x36\xab\x5e\x1f\xd4\x6d\x03\x03\xb7\x57\x95\x92\x15\xf9\x83\x59\x43\x22\x59\xd2\x41\xc9\x87\x57\xe6\xd0\xa0\x6e\xa2\x4b\xcf\x32\x4d\x3f\x40\x48\x0b\x69\x9c\x78\xee\xdb\x17\x41\x5e\x55\x26\x97\xc4\xe6\x36\xb1\x27\x89\x39\x1a\xb4\x7e\x07\xa7\xe7\x5a\x35\x70\x5e\x0c\x8a\x03\x67\xac\xfe\x72\x29\x8f\x0b\x44\x4c\x5b\xea\xa1\x1c\x1f\xa4\xeb\xd2\xaa\xe3\xf2\x82\xe6\xfb\x54\xe3\xd7\xd4\xd2\xdc\xaa\x7a\x32\xb5\x81\x8a\x1e\x50\x1c\x38\x63\x2d\x08\x14\x98\x74\x47\x8f\x4c\x2a\xe6\x3b\xf8\x12\x6c\xfc\x51\x23\xee\x38\xf9\x54\x23\xd7\xd8\x63\x91\xcf\x17\x8c\xae\xee\x05\x54\x8e\x86\xe2\xc0\x19\x6b\xc5\x0c\x21\x73\xd9\x7e\xe0\x25\x73\xd2\x1f\x13\xea\x24\x69\xb6\x87\xc1\xb6\x8c\x07\x94\xa2\x3b\xb5\x89\xfe\x82\x79\x95\xa2\x5a\x40\x15\x0b\x08\x0e\x7c\xbd\xf3\x4f\xca\x6b\xed\xde\xe9\xce\xbb\x7c\xba\x9b\x87\xc7\xfc\x82\xfa\xd9\x9a\xd7\xc6\x87\x4c\x4b\xa5\xdb\xeb\x4f\xf3\x98\x59\x89\x33\x61\xb3\x0d\xa8\x27\xf1\x32\xed\xb0\x10\x2e\x08\x29\xed\xa7\x79\x32\x34\x29\x82\x84\x27\x76\xf3\x6d\x2b\x54\xb8\xfb\xa3\x84\xc5\xc9\xf9\x86\x13\xb3\x4e\xea\x3e\xc2\xae\x19\x8a\x03\x6b\x37\x7f\xf6\x31\xfa\xd6\x02\x35\x4e\x7e\xa0\x2c\x09\xf6\x35\x81\xf7\x83\xf3\x73\xe9\xe8\xc1\x7b\x51\x82\x27\x2a\x1d\x98\x78\xec\x40\xe5\x68\x28\x0e\xfc\x5f\x94\x1b\x46\x11\x48\x9e\xee\xbc\x7f\x17\x39\xc8\x29\x4b\xb7\xd6\x4d\x2a\x11\xbe\xc4\xbf\x57\x50\x6f\x2d\xa6\x81\xf8\xe6\xd4\x1a\x38\xab\x01\xc5\x81\xb5\x23\xdc\x78\x35\x14\x22\x74\xf1\x1c\xab\x4c\x97\x56\x2f\xd5\x4f\xae\x07\x4d\xd4\xcb\x81\x08\x4f\x50\x36\xdb\x41\x34\xd6\x98\xfa\x08\x16\x17\x8a\x03\x5f\x2f\xed\x54\xf9\x3c\x75\x5a\x6c\x94\x91\x86\x60\x18\x45\xff\x4e\xf8\x96\x55\x16\x75\x26\xd5\xfb\xbc\xd0\x87\x1b\xa3\xd3\xd5\xcc\xda\x30\xed\xa0\x5e\x67\x97\x69\xf7\x32\xd8\x3b\x3f\x92\x76\x9a\xa5\xc8\x4c\x47\x79\x17\x81\x36\x38\xdb\x3a\x49\xe3\xa1\x3f\x9e\xfd\xe3\xd5\x7d\x6b\x25\x5f\x0a\x71\xe0\x8b\x00\x04\x07\xd6\x4e\xaf\x83\xfa\x0e\xe2\x6b\x43\x09\xfb\xcc\xad\x29\x74\x03\x47\x82\x2e\xca\x39\xa5\xd3\xe4\x96\x24\xb9\xec\xe7\x2e\xc7\xd2\x27\xc0\x3d\x01\xc5\x81\xff\x8b\xf7\x23\x91\xa9\x9c\x94\x0c\xcc\xfb\x1b\x37\xf0\x38\xb2\x57\x57\xa6\x25\x85\x7a\x91\x2a\x06\x88\x1a\xc4\xbc\xde\x72\x64\x3e\x02\x66\xa0\x50\x1c\x58\x3b\x72\x62\xfe\xda\x4f\x45\x41\x49\x93\x7a\xc6\x16\xa7\x5c\x49\x0e\xec\x31\x99\xd7\xef\xdd\x69\xc6\x26\x2c\xf6\x34\x41\x93\xa6\x01\x9a\xe9\x43\x71\xe0\xeb\x45\x8b\x8b\xe6\xb7\x0a\x41\xb4\xc2\xd5\xd5\x62\x9c\x5b\x26\x6b\xb3\xd7\x55\x97\x79\x8b\xed\xd3\x1d\xac\x61\x4c\xcb\x22\xe8\x8e\x0d\xd3\x0e\x2a\x27\x5c\xa6\x5d\x8d\xff\x9b\x2f\xfe\xd9\xd1\xb1\x05\x28\xf7\x95\x2d\x02\x07\xdf\x47\xa1\x4e\x1b\xb0\x44\x09\xf6\x6c\xfb\xe7\xa2\x3a\x06\x16\xaf\xc1\xae\x19\x8a\x03\x6b\x27\x15\x88\x96\x94\x9b\x23\xbf\xcb\xc7\xdf\xd3\xfa\x82\xa9\x3c\xc4\xe8\xa3\x49\x9b\x6a\x45\x72\xd9\x54\xfd\x6a\xd6\x9e\xb6\x4c\x01\xb0\x16\x0c\xc1\x81\xff\x8b\xf5\xee\xd6\x70\x81\xe5\x7c\x82\x05\xd2\xee\xfb\x2d\xe8\x77\x7c\x10\x2d\xcc\xd9\x5d\x8f\x29\x48\xda\xd7\xb5\x92\xab\x6f\xd8\x7b\x02\x67\x1e\x21\x38\xb0\x76\x7d\x2f\x31\xf3\x0c\xa7\xc4\xee\x08\xae\x8e\xc9\xa0\xa3\xa2\x9f\xb2\x61\x29\xba\xa4\x07\x4f\x37\x71\x2c\xba\x0a\x59\x06\x0a\xde\x04\xaa\xc7\x40\x70\xe0\xeb\xbd\x90\x1a\x1c\xa8\xc6\xed\x5a\xfe\x9a\x96\x5f\xbf\x54\x1f\x88\x64\x2a\xa5\xa1\x81\x62\x2a\xda\x9a\x5e\x5f\x10\x7a\xbb\xd0\xc8\x12\xa6\x1d\x54\x62\xbd\x4c\x3b\x96\x51\xdf\x1b\xaa\x31\x8e\xc1\xef\x51\x47\xf2\x76\x2a\xb1\x55\x05\x6e\x22\x11\x3f\xab\xf9\xb3\xe3\x1a\xe4\x8a\x45\xbc\x17\xd8\xf7\x7f\x7b\x30\xfe\xff\x39\xb0\x76\x6a\x49\x63\x63\x02\x41\xbf\x86\xde\xc6\xa9\x95\x0a\x11\x7c\xfe\x19\x19\xf9\xd6\x4c\x45\xc4\xfa\xb1\x89\x30\xe3\x1b\xe9\x55\x49\x60\x4d\x1c\x8a\x83\xfb\x32\xf2\xf5\x5b\xfc\x6c\xd6\x07\x5c\x9f\xb5\xd2\x8f\xdb\x3c\x53\x5a\x17\xf5\xef\x2f\xba\xd7\x66\x50\x98\x82\xba\x7c\xcf\xca\x1a\xed\x80\x2f\x23\x10\x1c\x58\xbb\xdc\x99\xbb\xb3\xf9\x56\xe3\x9b\x96\xe6\x9c\xc3\x5e\x35\xf1\x98\x12\x8a\x3a\x87\xbf\x66\x9b\x50\x58\x34\xaa\x27\x9d\x6d\xfb\x01\xe7\x07\xc5\x81\xaf\x57\x44\x5a\x6f\xb4\xb7\xdf\x28\xbc\x56\x5c\x30\xfc\x86\xed\xdb\x09\x94\x0f\x96\x64\x0f\x3a\xb9\xd2\x5f\x11\xee\xc8\x0b\x37\x90\xb1\xc2\x1c\x1a\xd4\xec\xfe\x72\x87\xa6\x78\xd3\x68\xed\xd1\x3d\xf3\xb1\xee\xc0\xad\xe9\x97\xb4\x9e\x76\x9d\x2f\x0d\xf1\xee\x08\x47\x96\xfc\xde\xe3\xe8\xee\x23\x66\x20\x83\xb9\x1d\x28\x0e\xde\xa1\xf5\x0b\x08\x8f\xaa\xce\xb9\xcb\xd6\xb3\xc5\xfc\x6a\x72\xd5\x90\x10\x54\x35\xfd\xec\x44\xa2\xef\x86\x69\x10\xd4\xf4\x88\xa5\x74\x13\x16\x19\x8a\x83\x77\x68\x06\x5a\x56\x5b\xd5\x24\x1c\x64\xbe\xe8\x2a\x3c\x49\x1f\x22\x7b\xdd\x74\x8c\x36\xce\x1e\xb4\x38\xcb\xf2\x85\xde\xb2\x45\xe7\x20\x86\x45\x86\xe2\xfe\xd7\xa1\xd1\xfe\x63\x5f\xc3\xbf\xed\x87\x16\x51\xf2\x9e\xb7\xb3\x59\x9c\x8c\x87\xff\x67\xae\x41\x4d\x26\xa3\x17\xcd\x98\xcd\x3a\xc1\xfb\xfa\x7b\x67\xe1\xc1\x45\xc9\xc6\x19\x7f\x3b\x34\xb3\xfd\xde\x6b\x99\x2a\xfd\x91\x9f\x29\x9d\xcb\x5f\x3f\xe7\x79\xf3\x91\x55\x23\xeb\x36\x96\xb5\x1d\xaf\x1e\x7e\xe0\x01\xc7\x45\xc2\x5f\xe8\xa2\xd2\x70\xf2\x88\x4a\x0e\x63\x4f\xe7\x07\xe6\x3d\xcc\xa7\xfc\x9b\x21\x1f\xc9\x02\x5c\x6b\xc7\x62\x2f\xcc\x22\x55\x44\x84\xff\x73\xe7\xd0\xa0\x86\xf6\xf7\x39\x34\x39\xf0\x2c\x9e\xca\xe7\x9c\x23\x5e\x25\x76\x9d\x50\x24\xf5\x8f\xbe\x2c\x42\x52\xfd\x0f\x0c\x01\x91\x32\xff\x80\x1b\xbe\x31\x0a\xc7\x4f\xc3\x4f\xaf\x64\x79\x07\xde\xa1\xdd\x98\x7c\x57\x75\xb7\xa9\x53\x79\x8c\x8f\xe2\x03\x0b\x32\xd5\x45\x53\xc9\xec\xe2\x43\x85\x9f\x0f\xef\xe7\xd3\x9d\x12\x79\x78\xe1\x5d\xc9\x62\x96\x28\xbc\x55\x72\x1d\xb1\xeb\x55\xc8\x7e\x90\x88\x5c\x7b\x3c\x21\x3e\xf4\xd0\x1d\x3b\x12\x33\x67\xbf\xb4\x53\xa2\x22\x4b\xa3\xe1\x6b\xdc\xde\x95\x8c\x16\xde\xa1\x49\x98\x90\x29\xa1\xe9\xba\xb8\x7f\x59\x75\x0d\xfa\x88\x15\xa1\x7f\x6d\x47\x2e\x31\x9b\x66\x23\xa9\x6e\xad\xda\xeb\xb6\xd6\xe7\x88\x2b\x19\xad\x3b\xdc\xcf\x6a\x7c\x18\xb4\x36\xd6\x1d\x4f\x91\xa6\x0a\x4e\x18\x9a\x11\x10\xc5\x4d\x40\x19\x9f\x4b\x38\xff\xb2\x7d\x4c\x4a\xab\x4c\xa7\xe7\x72\x65\x0e\x0d\xea\x26\xba\x2c\x63\xe9\x47\x34\xbb\xc5\xfa\x38\x55\x7f\xf3\xad\x78\xc1\x80\x19\x41\xe6\x8f\xbb\xff\xfb\xc0\xd4\x69\xcd\x46\x6c\x77\xaf\x0b\x63\x05\xe8\x8b\x02\xc5\x81\x33\x56\x3c\x16\x7a\x5c\x6c\x9b\x25\x0d\x57\xe0\x6f\x76\xad\x6e\x2f\xb4\x9c\xa9\xee\x59\x81\xa8\x7c\x22\x1a\x3e\x49\xc4\xe2\x0f\xcf\x81\xba\x64\x50\x1c\x38\x03\x70\x39\xee\x2f\x91\xf4\xbd\xa4\xac\x6d\xc4\x15\xa4\xf2\xf9\xd6\xc2\xcb\xaa\xc8\xfc\xf6\x54\x76\xf5\x60\xbb\x4f\x46\x3d\x00\x11\x68\xe0\x0d\xc5\x81\x33\x56\xe6\xad\xd3\x34\x62\xb1\xb7\x94\x33\x83\xb7\x87\xce\x33\x55\x16\x09\xd5\x24\x71\x9f\x1e\x48\x09\x6e\xfb\x5a\xca\x6f\xf5\x9f\xbd\x81\xc5\x85\xe2\x82\x24\x11\xc4\xff\x8e\xcb\x8f\xca\x4f\x9d\x92\xca\x4e\xdf\x31\x58\xa1\xa4\x66\xb9\xad\x46\xc9\xfb\x3a\xc3\xa2\x86\x73\x7f\x7f\xb5\xe5\x76\x49\xfd\x3e\xd0\x0f\x0d\xea\x49\xbc\x4c\x3b\xcc\x9b\x38\x4c\x28\x5f\x51\xd1\xee\xcd\x56\x08\x63\xff\x38\x90\x61\x67\x19\xdf\xbe\x96\x78\x9a\xda\x75\xa0\x65\x5b\x15\xa0\x09\xd4\xe3\x82\xe2\xc0\xda\x0d\xf1\xa8\x28\x6d\xb5\x37\x7e\x76\x14\x8b\xf7\x1f\x93\x41\x31\x6a\xb3\xff\xee\x13\x57\x5a\x39\xb6\xcd\xef\x63\x99\x22\x96\xd0\x0e\x8b\x0b\xc5\x81\xb5\xd3\x3f\xbc\x3e\x4d\xeb\xc1\x1f\xcb\xee\x8e\x9a\x30\x46\xe7\xed\xe3\x58\x28\xec\x8f\x17\x5b\x88\x42\xe3\x6b\x6f\x98\x58\x26\x46\x09\xdc\x6b\x10\x1c\x58\xbb\xfe\x6f\x8e\xac\xf9\x5c\x9b\x1e\x1a\xd4\x4e\xbf\x6b\x2b\x1f\x6f\x94\x74\x67\x96\x44\xcb\x3e\xb4\x63\xfd\x9c\x2e\x9c\xd3\xe6\xc1\x0e\x7c\x0d\x80\xe0\xc0\xda\x85\x6c\x78\x7e\xa9\xbc\x43\xf9\xfa\xbb\x51\xe5\xbb\x1e\x29\xa7\xce\xba\xe8\xa8\x3c\x61\x99\x92\x78\x45\x2e\x1f\xd9\x7b\x4f\x37\xdb\x81\x59\x3e\xc4\xeb\xec\x32\xed\x08\x5d\x2c\x56\x72\x43\x93\x36\x1e\x49\x5c\x2f\x20\xc6\x08\x1b\xe7\xa2\xc5\x3b\x0a\x4e\xfe\x5d\xd3\x4c\xc9\x5e\xfb\x21\xde\x04\xe8\x87\x06\xc5\x81\xb5\x63\xc3\x7a\xaa\x44\x11\xf4\xbe\xa1\x11\x9b\x88\xe2\xac\xe5\x19\x09\x87\x5d\xb8\x04\x33\xcb\x7c\x5e\x8a\x24\x19\x6a\xcc\xaa\x2b\x70\xfe\x13\x8a\x03\x6b\x67\xf3\x33\x81\xf8\xb1\xd7\x87\xef\x77\x31\x9d\x34\x35\xed\x2d\x29\x33\xd8\x97\xcf\xa5\x83\xac\x08\x3e\x34\x21\x12\x06\x32\xe1\x03\xee\x01\x8a\x03\x6b\xc7\xb0\x38\x10\x31\x12\xbd\xf1\x3c\xef\xfd\xac\xa2\xba\x3e\xc3\xd7\xc3\xda\x07\xeb\x9c\xaf\x22\xb3\xc9\xed\xdd\x79\x7e\x1b\x05\x03\x35\x2d\xa1\x38\xb0\x76\x66\x0f\x37\x0f\xa3\x0c\x51\xea\xec\x59\x98\x6f\x08\xef\x91\x4c\x37\xa8\xf0\x2d\xac\x54\xd7\xcf\x5c\x7f\x95\xbb\x42\x35\xc1\xdc\x09\xd3\x0e\x2a\x27\x5c\xa6\xdd\x43\x4f\xab\xc0\x69\x91\xa4\xcf\x51\xc4\x82\x09\x95\x78\xf3\xcf\x33\xde\xc8\x8e\xf1\xc4\x30\xa6\xb5\x62\xb5\xdc\xf5\x7d\x76\x83\x1a\xa8\x78\x03\xc1\x81\xb5\xf3\x2d\x0c\x61\xfc\xf1\x2a\xa4\x9f\x34\xb8\xf9\x1d\xf7\x7a\x46\x1b\xde\x4d\x06\x8c\x87\x24\x13\xfd\x94\xd7\xb5\xfd\x79\x3e\xa8\x01\xfd\x02\xa1\x38\xb0\x76\xae\x7b\xee\xe1\x77\x96\x77\xb5\xd4\x79\xb5\x6b\xcc\x7b\x1e\x4b\x7f\xaf\x27\xf5\x26\x58\xc7\xdd\x2c\x15\xf0\x70\x0d\x65\xf9\x02\x9c\x79\x84\xe2\xc0\xda\x35\xe5\xe2\xc4\xa4\xe1\x50\xea\x0c\xfc\x5c\x75\x0d\x46\x61\xea\xc9\x3d\xb1\x3e\x62\x2b\x6d\x7d\xac\x4c\x8d\x52\x3a\xcd\x88\x9f\x02\x8b\x0b\xc5\x81\xb5\x6b\x44\x64\x8a\x1e\x53\xe9\xec\x29\x26\x8c\xdc\x3b\xf2\x90\xfe\x21\xe9\xc5\x83\xf7\xe6\xf3\x77\x29\x02\x95\x65\x4f\x0d\xa3\x7e\xa0\x53\x02\x54\x62\xbd\x4c\xbb\x6f\xfc\x0b\x74\xed\xac\x5b\x4f\xee\xbd\xc8\x4d\x2c\x36\xbf\x17\x8b\x6d\xf5\x64\x80\xfa\x03\xfe\x30\xaf\x14\x73\xd3\x2f\x17\xaf\x4a\xd8\x35\x43\x71\x60\xed\x6a\x6e\xba\x7e\xa6\x52\x35\xa0\x4a\x94\xf5\xb8\xa1\xf4\x51\xb0\xbd\xe2\xd5\x02\xfb\x0e\x3a\xc3\xec\x2d\x8f\x8f\x34\xd3\x9c\xae\xc0\x4e\x52\x28\x0e\xac\xdd\x5a\x8b\x82\x6a\x25\x5d\x7f\x15\x7b\xc5\x6b\xdc\x22\x7c\xf5\x6a\x95\x1b\x21\x5b\x2b\x8b\x87\xcc\x6f\x49\x92\x51\x94\x9e\x71\x03\x3b\x5f\xa1\x38\xb0\x76\x67\x77\x4c\x6c\xcb\xad\x3f\xa7\x11\xdd\x5a\x62\xfe\x10\xaa\x99\x49\xf0\x9b\xfd\x3b\x09\xd3\x98\x6a\xb0\x45\xc9\x24\xd9\x94\x61\x1e\x2c\x2e\x14\x07\xd6\xce\x92\x0c\x93\x93\xe8\xdb\x51\x45\x61\x33\x75\xe6\x23\x83\x4f\xd1\x26\x38\xac\xc6\x0b\x91\x0c\x4a\xec\xa4\x1a\x39\xe7\xc9\x22\xe1\x30\x87\x06\x35\xbb\xbf\xdc\xa1\x59\x70\x34\x3f\xfe\x36\x47\x72\x8b\x8f\x41\xe7\x0e\x9b\xe8\xa4\xd7\xb1\x9c\xee\xea\x93\x6d\xdd\xbe\xba\x1b\x4a\x2d\x06\x2c\x6a\x58\x30\xb7\x03\xc5\xc1\x3b\x34\xe1\x67\x53\x44\xf5\xdd\xbb\x6f\x09\x6f\x4b\x6d\x5a\x98\x1d\x35\x0e\xcc\x17\x49\x27\xfd\x89\x43\x09\x1f\xb7\xdd\xa2\xa0\x3e\xb5\x81\x45\x86\xe2\xe0\x1d\x9a\xc9\xc3\x28\x89\xce\xec\x7a\xd7\x0c\xc7\xf4\xc4\x2d\xc7\xe4\xea\xd9\x6a\x3d\xbd\xcc\x9b\x04\xf1\x6f\x43\x10\xea\x7a\xce\x23\x8b\x60\x91\xa1\xb8\xff\x75\x68\xff\x38\xf3\xf7\xaf\xfb\xa1\x0d\x76\xde\xfa\x81\x34\x89\x61\xe1\x60\x5d\xc9\x1a\x9f\x2e\x19\xe5\x79\x83\x3f\x11\x7f\xb4\xb2\x42\x13\xc9\x65\xc9\x5b\xda\xd4\xfd\x6f\x87\xa6\xc1\x8a\xde\x36\xe3\xc1\xd6\x84\xec\x21\xe6\x45\x8c\x74\x8f\x82\x64\x4b\x95\x08\xf7\x42\x6a\x65\xfb\xee\x8e\x65\x64\xe4\x93\xda\xbf\xd0\xfb\x2d\x2e\x92\x56\x91\xa3\x76\x3b\xa7\xc5\x51\xbf\x19\x50\x8e\x48\x6b\x4d\xd7\xe3\xda\xc4\xdc\xb1\x10\x13\x10\x39\x4d\xd9\x96\xfe\x6b\x0e\x0d\x6a\x68\x7f\x9f\x43\x83\x73\x68\xe3\x58\x58\x02\xf4\x6d\x78\xad\x4f\xc6\x25\x5e\x9a\x06\x19\xe1\x7d\xfa\xc3\x90\x5d\x7a\x77\x97\x28\xf4\xa2\x65\x4e\x51\x92\xb1\xfd\x4a\x96\x77\xe0\x1d\x9a\xdb\xf1\xb0\x31\xbf\xa4\xc7\x6d\xe1\xb1\x10\xc2\xc6\xa0\xb3\xd9\xa9\x1a\x1e\xc5\x5d\x8a\x7b\xf1\x6f\x5d\xec\x4b\xe9\xa4\x27\x99\xae\x64\x31\x0b\xde\xa1\x8d\x79\xed\x75\x1b\x9c\x68\x0c\xcc\xbd\x8e\xf6\x7b\x58\x76\xd8\xfd\x70\xb0\x34\x84\xa0\x6c\x04\xeb\x44\x9c\x74\x65\x82\x5a\xaa\xea\x4a\x46\x0b\xef\xd0\x16\x7f\x58\x14\x93\x5e\x1c\x46\x77\xdf\xcb\x77\xe1\x7f\x18\xc7\x72\xb3\x51\xa4\x9f\xcb\x8e\xce\xab\x63\xa8\xe3\xa0\xe6\x17\x4f\xf7\x95\x8c\x16\xde\xa1\x75\x7c\x7c\x97\x37\xdf\x5e\x44\xd6\xca\xf8\x87\xc0\xc7\xe2\xc9\xf4\xf6\x24\x06\x5f\x5a\xe8\xa9\xa6\x45\x89\x82\x5b\xfb\x53\x3e\xdd\x2b\x73\x68\x50\x37\xd1\x65\x19\x8b\x9c\x0c\xc1\xac\x67\xbb\xda\xc5\x69\x34\x94\xbc\x1c\xfb\xbd\xcb\x42\x7a\xe1\x00\x66\x23\xba\x2f\x16\x1b\x4e\x40\x87\xe7\x28\xd0\x11\x13\x8a\x03\x67\xac\x93\xe5\x00\x53\xac\x02\x86\x64\x9e\xc7\xbf\x31\x6f\x37\x45\x89\x67\x74\x29\x66\xae\x2b\x3c\xc5\x7a\xa2\x30\xb1\x54\x7d\xef\x16\x50\x5f\x0f\x8a\x83\xab\x4b\x86\x2f\xde\xf8\xf5\xd8\x97\xed\x44\xf9\x67\x99\x68\xe3\xf1\x51\x65\x7d\x4c\x50\xaa\x1e\x93\x7b\xa9\x78\x4a\x57\x0f\xda\x46\x2a\x50\x09\x01\x82\x0b\x92\x44\xc0\xfb\xc7\x49\x6f\xcb\xc3\x82\xc9\x8c\xef\x5e\x82\xe8\x5a\x93\x8b\x7f\xd4\x6f\x9a\x89\x7c\xce\x48\xc0\xda\x53\x99\x73\x66\x10\xdd\x8a\xd1\x4c\x00\x4e\x7a\x43\x70\x41\x92\xa0\x9e\x25\x82\xfa\x87\xd2\xfd\xab\xd1\xbf\x32\x2f\xd4\xee\x69\xde\xbc\xdb\xb1\x36\x53\x40\x15\xc7\xbc\x53\x42\xbd\x40\xbf\x8c\x93\xee\x0b\x9b\x6d\x40\x3d\x89\x97\xd6\x03\xa4\xf8\x10\x7f\x7e\x5d\x6a\xf6\x56\x79\xa0\x79\x02\x9e\x94\xa9\x1a\x16\xc7\x5d\x26\x43\x26\x8f\x90\xeb\xce\x02\x0c\xcf\x6b\xc8\x80\x6f\xe3\x10\x1c\xdc\x6c\x23\xd6\x5b\x8e\xc6\xb4\x3b\x9f\x95\x3d\x6d\xea\x28\x82\xbe\xc6\x3d\x8a\x9c\x84\x9c\x03\x3d\x4c\x59\xa4\x95\xd7\x64\x8a\x0b\x58\x2f\x81\xe2\xe0\xce\x10\x1e\x59\x3b\x19\x7d\x1d\x4d\x29\x34\xfe\xf0\x3c\x80\xfd\xc5\x5b\x32\x01\x59\xfb\x32\xad\xa9\x57\x89\x41\xb1\x86\x13\xd8\x2e\x98\xc0\xf7\x6b\x08\x0e\xac\xdd\x3b\x11\x8b\xa2\x78\xff\x9d\x44\xc9\xf7\x3f\xeb\x86\xc8\x96\xd3\xd9\x3f\xcf\x49\xc6\x3a\x07\xe1\x29\x22\x16\x72\xda\x30\x7e\x02\xbe\x32\x40\x71\x60\xed\xc2\x9e\x31\x59\xfb\x7f\xc0\xe4\xa4\xc7\xc5\xab\x97\x9f\xda\x53\xef\x34\x99\x2a\xfd\x96\x7e\x97\x3b\x44\x41\x8e\xda\x44\x11\x8f\x0b\xe8\x36\x0e\xf1\x3a\xbb\x4c\xbb\xdf\x3d\x59\x12\x63\x5f\xe3\xd6\x0d\x7e\xf3\xad\x7c\x8d\x0d\x60\x1b\xfd\xbe\x95\xf7\x11\xef\x0b\x59\xf2\x5c\x8b\x99\x85\xff\x3d\x60\x8d\x19\x8a\x83\xeb\x7a\xcc\x3b\xab\xb0\x26\x1e\x7a\xc1\x2c\x7a\x9f\xe9\x98\x7d\xcd\xf6\x0d\x6f\x74\x95\x4a\xeb\xc6\x94\xb4\x54\xd3\xeb\xf7\x1c\x4e\x40\x35\x16\x28\x0e\xac\x1d\x4d\xcc\x20\x6a\xc1\xbb\x72\x46\xa5\xc8\xeb\x01\x5c\x72\x64\x26\x7b\x21\x89\xc6\x4e\x02\xb4\x92\x3f\x2c\x1c\x6c\x55\x7f\x13\x01\x9d\xb0\xa1\x38\xb0\x76\x44\xfe\x3a\x18\x0e\x64\x24\x47\xba\xcc\x09\x4a\x0f\x29\xbf\x8e\xdd\xea\x3c\xaf\xa3\xb3\x8b\x6e\x0a\x20\x92\x64\x25\x67\x96\x00\xd6\xc4\xa1\x38\xb0\x76\x45\x8f\x19\xa6\x75\x04\x27\x37\x82\x5f\x50\x26\xcd\x2d\x73\x2f\x3a\x7e\xfa\xae\x9c\x42\x39\xad\x3b\x47\x13\x4a\x18\xcc\x53\x0f\x9c\x21\x84\xca\x09\x97\x69\xf7\xfe\xeb\x1b\x66\xef\xdc\xfb\x2c\x38\xe6\x3a\xf7\x0e\x48\x0c\x0b\x19\x67\x74\x14\x9e\xab\xcf\x44\xe1\x71\x1f\xe5\x63\xb7\xb0\x02\x5f\x04\xa0\x38\xb8\x0a\x3d\xd4\xae\x2a\x27\x9a\x1f\x2b\xf4\x57\x14\x7e\x30\xed\xbe\x0b\xf3\x3a\xa0\x18\xbf\x50\xef\xfd\x8d\x41\x89\xd0\x66\x63\xb1\x41\x0b\x54\xe8\x81\xe0\xc0\xda\x19\xd7\x3c\x15\x57\xec\xfa\x56\xd9\x4d\xcf\xd1\x2d\xec\x72\xcb\x3d\x7c\x16\x7b\x37\x2a\x8d\xeb\xc1\x6a\xcc\x50\x39\x91\xd3\x35\xe0\xf9\x80\xe2\xc0\xda\x5d\xa3\xc0\x91\x91\xc6\xef\x78\x62\x22\x36\xae\xf9\xe5\x46\xf6\x4a\xc1\x8c\x44\x12\xb1\xb0\x90\xd9\xfb\x61\x26\xa7\x91\xe5\x8e\x06\x58\x5c\x28\x0e\xac\x5d\xfa\xf5\xa2\x24\xcd\xe7\x47\x1f\x6a\x43\x78\x0e\x3a\x71\x73\xa5\xee\xdb\x2f\xdc\xde\x15\xdd\x09\xb8\x10\x34\xbe\xe6\x43\x2c\xad\x0e\xd3\x0e\x2a\xb1\x5e\xa6\x9d\x6d\xfb\x54\x8e\x61\xe0\x37\xbe\xfa\x07\x3f\x78\xe6\x2e\x76\x25\x6d\x09\xa8\xba\x5b\xa2\x37\x3d\x7f\xfe\x44\xbd\x91\x35\x57\x08\xdc\xc7\x50\x1c\x58\xbb\xa4\x71\x94\x22\x6b\x12\x71\xa4\x4e\xc5\x2a\x8b\x4a\x19\xdb\xcf\xf1\x99\xae\x25\x45\x2c\x51\x86\x46\x5b\x96\x2f\x46\x15\x13\x27\x60\x71\xa1\x38\xb0\x76\x26\xa5\x7c\x5f\x30\xee\xaa\xec\xe6\x05\x28\xa7\x6e\x4e\x68\x55\x35\xde\x4b\x3b\xa6\x79\xf2\x94\x6c\x4a\x53\x90\x93\x4e\x23\x01\xd8\x1f\x00\xc5\x81\xb5\x73\x9a\x9b\xad\x5e\x14\x7b\x9d\x25\xa2\x12\xdc\x4c\x86\x21\xf3\x4d\x04\x77\xca\xc8\x79\xcd\xfe\xc4\xd4\xe0\x8c\x34\xcf\xff\xf8\x05\x2c\x2e\x14\x07\xd6\x4e\x51\x8e\x0e\x53\x91\x2f\xb4\xe6\x56\x12\xe6\x79\x9c\x91\xfb\x8f\xc1\x8e\x3b\x6e\x62\x61\xa5\x8b\x1a\x37\x4f\xf0\x51\xf6\x10\x80\x5a\x8e\x50\xb3\xfb\xcb\x1d\xda\x0b\x2c\x93\xc3\x28\x0c\x3c\xd4\x67\x6d\xe6\xa4\x6c\x62\x53\xcb\xce\xe1\x3d\xf6\xa9\xdc\xfb\xc2\x86\x62\xe1\x86\xae\x12\xf1\xbc\x30\xb7\x03\xc5\xc1\x3b\xb4\x50\x1a\xd5\xe1\x64\x09\x0c\x23\xaa\xa8\xea\xaa\x8e\x9c\x38\xb6\xda\x28\x0a\xe7\x49\x92\xa9\x9e\x29\xae\x07\x88\x51\xca\x01\xaf\x60\x91\xa1\xb8\x20\x69\x04\xf4\x7f\x46\xf6\xd0\x77\xa2\x0d\xce\x53\x09\x0f\x65\xf1\x6f\x9c\xe5\x48\x20\x64\xe5\xf0\x47\xbe\xf6\x4e\x9e\x4c\xce\x55\x49\x34\x0d\x8d\x18\xd8\x3f\x09\xc5\xc1\xff\x1b\xff\xba\x1f\x9a\xc0\x50\x2a\x99\xda\x38\xce\xf2\x05\x4b\xa5\xd1\x47\x8b\xa6\xd3\x07\x66\xe6\x64\x9c\xca\xe5\x05\x1c\x47\x13\x1d\x38\x54\x84\x68\x7f\x3b\x34\x6e\x7b\xc1\xc6\x0b\x5a\x09\x52\xe5\x36\x94\x08\x72\xff\x70\xcb\xb8\x41\x69\xfb\xb5\xea\x5e\xc2\x70\x54\x34\xab\xee\x21\xf5\x7f\x9c\x0a\xfc\x5c\x8e\x75\x5f\x3b\x7b\x2e\x49\xf8\x1b\x6e\x55\x8a\x2e\x51\x6a\xd5\x52\x88\xcf\x23\x95\x17\xca\x66\xe9\xaf\xf3\x08\xc6\xaa\xfe\x6b\x0e\x0d\x6a\x68\x7f\x9f\x43\x83\x73\x68\xd6\x5f\x9c\xdb\xa5\xd0\x7e\x75\x97\x6e\x3d\xf9\x94\xb2\x15\xff\xf8\xf4\xc5\x4c\xb7\xfc\x5a\x4e\x01\xd1\xc1\x49\x87\x4b\x7b\xc0\xe2\x95\x2c\xef\x70\xc3\x99\x07\xf3\x31\x4c\x5e\xbc\x2f\xa1\xc6\x89\x86\xe4\x49\xce\xa4\x8a\x6d\x1e\x69\x96\x55\x34\xa9\x7d\xbd\xe2\x7d\xb2\x94\x7d\x18\xec\x57\xb3\x98\x05\xef\xd0\x6a\x1c\xc2\x4f\x67\xf4\x17\x33\x94\x9b\x82\x4a\x42\x44\x4f\xc7\xa6\xba\x95\xa5\xb4\x0d\x32\x0b\x56\x74\x56\xce\xee\xca\x1f\xd2\x5d\xc9\x68\xf5\xe1\x7e\xb6\x81\xf1\xeb\x26\x86\x43\xe9\x23\xfe\xc3\x9a\x74\xb2\xc0\x4f\xd9\x88\x2a\xd6\xa4\x79\xf2\x01\xdd\x27\x3e\x04\xc8\x41\xa5\xfe\x3f\xae\x64\xb4\xf0\x0e\x6d\x5e\x90\xd8\x7c\xfe\x59\x61\xa6\xc3\xdd\x1d\x04\x91\x8f\xdb\x96\x2d\x47\xb5\x12\x4a\xd7\x43\x4d\xd5\x05\x9b\x1f\xd7\xd1\x08\x5c\x5d\x3f\x34\xa8\x9b\xe8\xb2\x8c\x75\xde\x98\xb0\xc8\xff\x7c\xcc\x40\x7d\x8a\x42\xe9\x64\x91\x89\x0d\x19\xfb\xe0\x1c\xc1\x46\x28\x98\xb1\x90\x36\xe4\x4d\x7d\x3f\x30\xdb\x80\xe2\xc0\x19\xab\xa5\xa1\x4c\xbe\x8f\x60\xb1\xe4\x8b\xbc\x4c\x4b\x06\x2a\x29\xf9\x83\x28\x44\xe2\x03\x77\xa7\xbb\x5a\xc9\x6f\x4c\xf0\x9d\x9f\x01\xf5\xce\xa0\x38\xb8\x9a\x8b\xfb\x03\x85\xca\x1d\xea\x39\xaa\x6d\x4c\xab\xce\xdd\xd7\xb9\x05\x0b\x70\x03\x71\x68\x26\xbb\xf8\x7e\xf6\x1a\x34\xe5\xfd\x44\x01\x6a\x2e\x42\x70\xe0\x8c\xd5\xa1\xe1\xcb\xdc\x8c\x21\xc7\x31\x71\x7f\xb0\x8c\x20\xd7\xf1\xc3\x98\xb2\x22\x9b\x8d\x35\xca\x91\x97\xe3\x78\xce\xba\xae\xc2\x53\x58\x5c\x28\x2e\x48\xf2\x9f\x15\x71\x71\xfd\x7b\xa3\x68\x77\x32\xea\xed\xf5\x32\x49\x79\x94\x5d\xc9\x36\x9c\xae\xf3\xec\x93\x74\x48\x8b\x08\x4e\x15\x93\xbc\x74\x7b\x08\x9b\x6d\x40\x3d\x89\x97\x69\x97\xa3\xa9\x5d\x59\x8c\x3a\x3a\x8e\xe9\x84\x97\xab\xad\xdd\x7b\x8f\x7b\x3b\xc8\xe6\xe7\xa9\x92\xd8\x1f\x0f\xc3\x1b\xd5\x9f\x52\x80\x6f\xf9\x50\x1c\x5c\xf7\xd5\x63\xb3\xeb\xdb\xaf\x3d\x56\x7b\x4e\x5e\x30\xb2\xe1\xca\x7a\x51\xbe\x10\xf7\xcc\xe4\xea\xdf\xaa\x9a\xca\x3b\x30\xec\x2a\x03\x4e\xa7\x43\x71\x60\xed\x9c\x6e\x77\x39\x29\x4b\xb4\x60\x6c\x4d\x68\x3c\x8b\xf6\xe9\x2d\x8a\x0c\x76\x3b\x4f\xe3\x3c\x47\x97\xa7\xaf\xbb\x88\x94\x42\x03\xce\xfa\x41\x71\x60\xed\x4e\xfb\x7d\x06\x74\xd6\xb3\x87\x31\xd5\x05\x8f\x44\x22\x1e\x3c\xb3\x1d\x44\x1d\xa6\x37\x78\xf4\x9d\x99\x5a\xeb\xe7\x7c\xcc\x1b\x60\x96\x0f\xc5\x81\xb5\xcb\xf5\xfc\x1a\x94\x4c\xdf\xcd\x61\xd1\x33\x9e\xed\x2f\x4f\x87\x68\x5f\xcb\xe7\x5a\x34\x43\xee\xbd\x1f\x4c\xd9\x2f\x5a\x74\x1f\xd8\x29\x07\xf5\x3a\xbb\x4c\x3b\x1a\xe5\x05\x9e\x31\x9b\x03\xcd\x92\xd9\xb7\x67\x53\x39\xa4\x61\x0e\x3e\xd7\xd7\x85\xca\x8c\x45\x71\x8d\x99\xdf\x0a\x49\xf6\x19\x00\x8e\x07\x82\x03\x6b\x97\x86\xe9\xd9\x19\x8f\xf8\xa5\xce\x54\xeb\x4b\x90\x45\xa3\x0b\x6a\x7c\x01\x1a\x5d\x28\x9d\x57\x5d\x93\x02\x19\xae\x59\xfc\x5d\xe0\x4c\x1e\x14\x07\xd6\xee\x50\x33\xfa\xdb\x47\x4a\xed\x63\x66\x7f\x85\x75\xfb\x5b\x6b\xb2\x18\xf8\x9c\x16\x24\x2d\x7e\x36\x5e\x13\xea\x54\xdb\x22\xaa\x5f\x80\x3a\x83\x10\x1c\x58\x3b\xad\xa3\x24\x6b\x94\x62\xc5\xeb\xcb\x9f\x5e\x23\x30\xad\xd2\xd8\xce\xcb\xd4\xbe\x7f\x34\x95\x78\xfd\xf0\xda\xdb\x13\xec\x80\xcf\x40\x07\x7a\x28\x0e\xac\x9d\xb2\x42\x37\xd6\xfb\x23\x35\xd9\x27\xf4\x7c\x45\x27\x12\x81\x28\xd7\xbf\x4b\x45\x79\x6d\x09\xbc\x99\x08\x57\xa9\x17\x6b\xe1\x07\x3a\x25\x40\xe5\x84\xcb\xb4\x73\x27\xbc\xd1\xdd\x9f\x16\x3c\x18\x64\x62\xf7\xd1\x82\x91\x2f\x30\x84\xbd\x60\x3c\x4f\x22\x27\xb5\x60\x0f\xa1\xc5\xdf\xc5\xc1\x02\xa8\x90\x01\xc1\xc1\xed\x72\x7c\x36\x77\x66\x1c\xaf\xf3\x59\x9a\x3a\xe9\xa9\x83\x49\xd0\xa7\xf3\xcf\xe6\xbe\xe3\x42\xdc\xe9\x0d\x13\xf9\x76\xa9\xfd\x33\x17\xc0\x2e\x47\x08\x0e\xae\x53\x42\xef\xee\xf7\xf6\x84\x4c\x77\x92\x01\x9a\x96\xc9\xbd\xfc\xc4\x84\xdd\x49\xd9\xdc\x4a\xf2\xc5\x16\xdc\x8e\xe3\xb9\x67\xdd\x40\xdf\x44\x28\x0e\xac\xdd\x4f\xd2\x08\x49\x1b\x95\x4c\x2d\xd3\xd8\xfc\x16\x52\xbf\x18\x36\xc3\x5b\x1f\xda\xb0\x70\xa3\xc2\x11\xef\x97\x99\x7f\xbd\x7d\xf7\x14\x16\x17\x8a\x03\x6b\x97\xee\x2b\x4f\x4f\xb6\xb7\x32\x66\xc0\x20\xdd\xb7\xaf\x1f\xd1\xe7\x9a\xcc\xe1\x78\xc7\x27\xee\x37\xbf\x81\x45\xc5\x86\x31\x95\x18\x4c\x3b\xa8\xc4\x7a\x99\x76\xf2\x0b\xf2\xc7\x72\x77\x11\xb7\x99\x8e\xfa\x6d\x7b\x1d\x9f\x76\x9a\x57\xba\xae\xe4\x61\xff\x12\xb4\x61\x21\x2d\x66\x75\xc6\x06\xaa\xcc\x43\x71\x60\xed\x5c\x5f\xaf\x6f\x21\x5b\x0d\xd5\x7e\xb3\xee\x0d\xce\x34\x9c\x79\xec\x6a\x21\x83\xd7\xb8\xc7\x5e\x35\xaa\x7a\x0d\xf1\x75\x58\x9c\x00\xb0\x4e\x09\xc1\xc1\xe5\xbb\x1f\xdb\xf7\xe3\xcc\x6e\x19\x90\x84\x30\x57\x0f\x95\x68\x9f\x1a\xac\xe9\x99\xc6\x6c\x33\xb2\x06\x29\x8b\xf7\xd0\x20\x63\xe7\x02\xf9\x0e\x82\x03\x6b\x67\x82\x32\xc3\x8f\xcd\x8e\xfe\xd4\xe7\x67\x69\xd2\xde\x7b\xbd\xc5\xdf\x78\xec\xee\x52\x1f\xa3\x4d\x6c\xbb\x25\x53\x4f\x69\x16\x9e\x01\xce\x0f\x82\x03\x6b\xe7\x71\xf6\xbc\x96\x75\x37\x5d\xfa\x6d\x6e\x6c\xe4\xe3\xc4\x8e\x27\x65\xed\x9c\x7c\xf8\x5a\xc2\x3d\x5a\x8b\x41\xd9\xaa\xb7\x78\x93\x61\x0e\x0d\x6a\x76\x7f\xb9\x43\x23\xfe\x95\xae\xd9\x32\xbf\x2f\x9b\x79\x91\xaa\xbf\x98\x34\xc2\x6f\xd6\x7c\x66\x24\xae\x9e\x72\x7b\xf6\xf3\xe0\xfb\xb9\x3d\xb7\x61\x98\xdb\x81\xe2\xe0\x1d\x9a\x5e\xc6\xba\x81\x83\xdc\x6f\xdf\xad\x9e\xc0\x3e\x6b\x21\x3f\xcf\xed\x26\xf9\x39\x16\xcb\x37\x3c\x8e\xe5\xa8\xca\x2b\xc9\x82\xb3\xb0\xc8\x50\x1c\xbc\x43\x4b\xe5\x3c\xd8\xf0\xd0\xc0\x6a\xc7\xe1\x8d\x0b\xcc\x6b\xd4\x43\xbf\xdf\xef\x84\xde\x71\xb7\xe7\x4b\x6e\xad\x1b\x6f\x42\xa5\xa3\x35\x2c\x32\x14\x17\x24\x7d\x0d\xf4\x6f\xfc\xeb\x7e\x68\x39\x4e\x1b\xcf\x28\xd3\x6c\xc8\x19\x13\xb1\xbb\xee\xd1\x77\xd0\x19\x2c\x79\x6f\x9e\x14\x3a\x34\x7c\xb1\x98\x8a\x0f\x4e\xde\x65\xfd\xdb\xa1\xf5\x17\x4f\xaa\x3c\xa0\xdf\xd6\x77\x66\xd2\x31\x73\x73\x5b\xc4\xa7\x57\x1e\x1f\x5d\xd1\x8e\x36\xbd\xf7\xa8\xb7\x3c\xeb\xce\xfd\x47\x7f\xef\x3b\x5a\x6b\x5c\x4f\x5a\xa8\xc2\x11\x7e\xda\x2a\xdd\xf3\xf5\x93\x6c\xad\x07\x4a\xc1\xb7\x99\x3b\xce\xb2\x17\x8a\x17\x33\x0a\x04\x63\xff\x35\x87\x06\x35\xb4\xbf\xcf\xa1\xc1\x39\xb4\x4f\xcf\xfb\xda\x18\xac\x15\x53\x50\x10\x1d\x06\x27\xf6\x43\x16\x9a\x50\x4a\x3e\xa8\x7d\xe7\x79\xb9\x76\x8f\x9a\xfa\x4d\x91\x74\xe7\x95\x2c\xef\xc0\x3b\x34\x97\xa6\x19\xb5\xd2\xee\x05\xbe\xfd\xa1\x89\xc7\xbc\x0d\xd8\xe6\x5c\xbb\xa6\x21\x38\x2a\xa3\x8f\x6c\xcf\xda\xd7\x0c\x72\xcd\x07\xaf\x64\x31\x0b\xde\xa1\xd9\x5e\x0b\xe5\x54\xd9\x6d\xf0\x51\x97\x43\xa0\xd4\x50\x91\xd9\x90\xb7\x78\xd7\x85\xf3\xeb\xe1\xd3\x8e\xd2\xef\x2e\xbb\x63\x15\xcc\x57\x32\x5a\x78\x87\x86\xa4\xa3\xbc\xef\x76\xd1\x65\xa4\xe0\x46\x92\x15\x98\x5b\x16\xfe\x87\x47\xbd\x9a\xb6\xf0\x4f\x4d\x46\xec\xfa\xa9\x7d\x9a\x0d\xd2\x95\x8c\x16\xde\xa1\x11\xe2\x34\xcd\x60\x04\x3b\xa0\xd2\xea\xb4\x96\x1a\x05\x70\x94\x04\x86\x77\xdd\xe3\x9e\x8b\x74\x70\xca\xa3\x71\xab\x8c\x11\xb9\x82\x82\x99\x0f\xff\xdd\x4d\x74\x59\xc6\xea\xef\x98\x0d\xcc\xaa\x5d\xef\x64\x7c\x9e\xf7\xf0\xfd\x7a\xab\x8a\x5b\x56\x18\x1e\xc7\x4a\xff\x1f\xdb\xeb\x9a\xe8\xaf\x3e\xbd\x91\x01\x76\x88\x41\x70\xe0\x8c\xe5\x99\xce\xd1\x70\x1e\x26\x60\xfd\x48\x1c\x17\x79\x79\xd3\x26\x7a\x66\x60\x5a\x3f\xf2\x49\xe4\xce\xf4\x6c\x3b\x1e\x09\xcd\x6b\x4b\x58\x5c\x28\x0e\xee\x6c\x90\xdd\x38\x0d\xb2\x9d\x74\x41\x82\xb5\xdf\x75\xc7\x0b\x12\x43\x6b\x62\x63\xc1\xc0\x3f\x49\x24\x35\x34\x03\x0b\xe8\x54\x42\xc0\x2c\x06\x8a\x03\x67\xac\xbb\x32\xa7\x0a\xcf\x0a\x3d\x2b\x56\xde\xe8\x95\x4f\xbe\xd2\x93\x7f\x98\x55\x3e\xd5\xf7\x7b\x93\x25\xfe\xd3\x50\xdf\xef\x81\xb9\x44\x58\x5c\x28\x2e\x48\xf2\x9f\xf5\x96\xbe\x54\x4b\x91\x3b\x62\x95\x4d\x8a\xb4\xb2\xd4\x6e\x06\x8f\xac\x35\xa5\x7f\xe5\xd2\xc8\xc2\x8f\xe8\xc7\x92\x92\x8f\x7b\x36\xc7\x0d\x9b\x6d\x40\x3d\x89\x97\x69\xd7\x3c\x2c\xc4\x60\xed\x5c\xf9\x7e\x60\xe8\x87\xca\x0d\x3c\x7c\xf3\xb0\x5b\x58\x7b\x41\xa2\xe5\xf3\x38\x98\x48\x82\xb5\x6c\xb2\x2c\xb0\x6b\x86\xe2\xc0\xda\x99\x3d\x44\xde\x52\x77\x7c\x49\xd7\x80\x47\x81\x23\xfd\x9d\x51\xed\x03\xa7\x98\x46\xbd\x60\x02\x4a\xbe\xca\xb4\xc1\xe7\x88\xa3\x68\x58\x5c\x28\x0e\xae\xa6\xdc\x67\x0c\x4d\x8e\x57\x9b\xaa\xf4\xdc\x55\xf8\xee\x87\x36\x37\x76\xb7\xb4\xa4\xd9\x9a\xa7\xb3\x8d\x32\x7f\x88\xc6\xe1\xb0\x03\x67\x40\xa0\x38\xb0\x76\x2b\x31\x95\xfd\xc4\x22\x39\xac\xb4\x8d\xe7\x76\x2f\x94\x7a\xde\xf5\xe7\x2a\xbf\xd5\xd9\xfc\x73\xd0\x1d\x98\x1a\x95\x67\xa1\xe1\x03\x9c\x21\x84\xe0\xc0\xda\xc9\x73\xd9\x2b\xc5\xb2\xa9\x32\x38\xd4\xe3\x53\x7b\xfe\xa1\x6d\xa1\xc3\xdc\x39\x0d\xdc\xfe\x2a\x5e\x32\xdb\xdd\xc1\x55\x79\x03\x11\xa6\x1d\xd4\xeb\xec\x32\xed\x74\x74\xe2\x3f\x31\xd0\xa8\x7b\x7c\xe8\x7f\x11\x8c\x20\xff\xb8\xa7\xab\x18\x97\xe3\x88\xf2\xfc\x62\x54\xff\x2c\x73\x47\xd9\x5f\x13\x76\xcd\x50\x1c\x58\xbb\x86\xfe\xc7\xf5\xcc\xf6\x62\x9d\x1f\x3f\xbd\xf6\x7d\x6e\x29\x2c\xf1\x42\x4e\x67\xa8\x89\xcc\xd8\x2b\x77\xfe\x41\xfe\xf0\x23\x55\xa0\xa2\x07\x14\x07\xd7\x9d\xd8\x7b\xf2\xdd\xa4\x79\x8d\x7b\x57\xe9\xf6\xc7\x81\xdb\xb9\xc9\x71\xac\x12\x7f\xa4\xa4\x11\x70\x97\x1f\xa4\x55\x99\x06\x5a\x8a\xc2\xe2\x42\x71\x60\xed\xdc\x18\x2c\xea\xb1\xac\x04\xfb\x03\x12\x6d\x08\x43\x82\x33\x98\xdd\x7a\xee\xb8\xe3\x4c\x31\xcd\x89\x3f\xe5\x50\xb9\x3f\xb2\x9f\x0f\x8b\x0b\xc5\x81\xb5\x5b\xc3\x7a\xea\xe1\x39\x3e\x6d\xf6\x43\xcf\xad\x87\xa4\x98\x91\xf2\x25\x49\x5d\x2d\x29\xfe\x59\xa7\x5d\x27\x07\xe7\x60\x8e\x73\x3a\x4c\x3b\xa8\x9c\x70\x99\x76\x6d\x6e\xec\x8a\x31\xd7\x44\x8a\x38\x1c\x55\x32\xcb\x5b\x5e\x9d\x58\xd3\xa0\x0a\xbf\x6e\x1b\xfe\x96\x6c\xf3\xcd\x9c\x91\x79\x65\x15\x76\xcd\x50\x1c\xdc\x2c\xff\x48\x26\xb6\xf2\x71\x37\xa1\x27\x1a\x47\x36\x85\xa3\x17\x4b\x01\xf5\x73\xc1\x5b\x11\x54\x0f\xb2\x54\x45\x58\xbf\xcb\xbd\x00\x6a\x9d\x42\x71\x60\xed\x9c\xe7\x43\x48\x6e\x65\x8f\x0a\xc4\x58\x0f\x90\x23\x34\x66\x71\x09\x08\xad\x54\x48\x74\x45\xa7\x37\xba\x12\x8d\xc7\x30\x6c\x03\xeb\xb5\x50\x1c\x58\xbb\xa7\xc7\x8a\x94\xaa\xa5\x49\x54\xf5\x99\xf4\x1e\xd2\x1e\x72\xd5\x56\xbf\x0d\xee\x22\xf8\x7c\xf9\x8a\x2c\xf1\x56\xde\x74\xd4\xd0\x05\x16\x17\x8a\x03\x6b\x47\x27\x7b\x93\x6e\x77\xfc\x87\xf0\xc9\x81\xa5\x5c\xb9\x5f\x8d\xd5\xa9\x6d\x58\xae\x5c\xa4\x6f\xe0\x44\x3e\x5f\x3d\x05\x16\x3a\x06\x4c\x3b\xa8\xc4\x7a\x99\x76\x53\x72\x6a\x3a\x5e\x1b\xcb\x13\x4d\x56\x45\xdf\x06\xd0\x83\xa7\x57\x29\xe2\xd3\x49\x62\x69\x23\x96\x37\xa4\xb0\xad\x12\x1f\x1c\xc2\xae\x19\x8a\x03\x6b\x47\x81\x84\x7a\x78\xfd\xb4\x5e\xad\x2b\x45\xf1\xc4\xd5\xc3\x2f\x64\x73\x32\xeb\x8c\xcd\x9a\x41\xa8\xdf\x78\x00\x33\x80\x86\x09\xa8\x27\x0b\xc5\x81\xb5\x43\x52\xc7\x12\x14\xae\x90\x19\xb2\xee\x42\x7b\x4e\xa0\xf5\x53\x09\x4f\x2a\x61\xa3\x6f\x74\x5b\x4b\xba\x9f\x77\xe4\xf0\xda\x79\x24\x2c\x2e\x14\x07\xd6\x4e\x59\x5a\x8d\xc4\xf6\x95\x77\xff\x05\x73\x13\x69\x6a\x30\x57\x43\xdb\xfb\x04\x96\xa6\xe8\x87\x87\xae\x92\xf2\xdd\x92\xc9\xc9\xc0\x5a\x3b\x14\x07\xd6\x4e\xe4\x66\x9d\x61\xea\xab\x6c\xbf\x60\x5a\xe7\xd0\x02\x8a\x70\xec\x3f\x0a\xe1\xa2\x61\xaf\xf0\x92\xa2\x28\x1e\x8c\xd7\xdc\x6a\x1c\x83\x39\x34\xa8\xd9\xfd\xe5\x0e\xad\xe4\x57\x8f\x98\x77\xff\x8d\xaf\x29\xc3\x79\x84\x39\x33\xbf\x11\xc7\xce\x1f\x22\xfd\x6c\xec\x1a\xbf\x8b\xd5\x20\x57\xae\x5b\x19\x00\x73\x3b\x50\x1c\xbc\x43\xc3\x0f\xa6\x09\xb3\xa2\x47\xfb\x86\x69\xbe\x22\x40\xab\x7a\xaf\x4c\xc5\xa1\x19\x5d\xb9\xb0\xf8\x27\xf3\x69\xd4\x4e\x77\xb1\x40\x02\x2c\x32\x14\x07\xef\xd0\x1a\xe4\xe7\xa2\x87\xe4\x1f\xd4\x28\x90\xfa\x88\x66\xe5\xba\x72\x77\x37\x7c\x27\x76\x1e\xc8\xa9\x43\x7b\xd0\x2a\x9b\x75\x7b\xf5\x23\x2c\x32\x14\x17\x24\x8d\x07\xfa\x37\xfe\x75\x3f\xb4\x0e\xd3\xaf\xd5\xfb\x25\x53\x1f\x56\x44\x91\x3a\x11\x2d\x4e\x8a\xee\x07\xba\x37\x57\x35\x18\x7d\x57\xac\x1c\x90\xd9\x14\xfa\x91\xf8\xb7\x43\x7b\x68\x97\xc3\x96\xa9\x46\xe7\x8b\x73\x67\xe7\xdc\x92\xb1\xcd\xee\xa0\x85\xe0\xfb\x57\x8c\xd2\x30\x56\xa5\x46\xb7\x0d\x9a\xc8\xf8\xbf\xd0\xd7\x67\xd9\x8f\x77\x1f\xa0\xf9\xbe\x17\x6a\x54\x31\x4c\xb8\x97\x83\x41\xbb\x67\x7c\x70\x87\xb3\xcf\x25\xcc\xde\xdf\xac\xc9\x87\xfd\xbf\xe6\xd0\xa0\x86\xf6\xf7\x39\x34\x79\xf0\x2c\xfe\x11\xe6\xdb\x7b\x7c\x42\xa8\x0d\xfe\x06\x7f\x1e\xef\x05\xa1\xfd\x2c\x6d\x74\xb9\xc3\x9c\xc3\x37\xc5\xfa\xfb\xc1\xe6\x4c\xc3\xfb\x27\x57\xb2\xbc\x03\xef\xd0\x88\xa6\xdf\xad\x6e\xae\xa7\x93\x5c\x2b\x43\xf6\x1b\x9f\xc7\x60\x23\xe1\xcf\x19\x8b\x1a\x98\x7b\x37\xb0\x23\x2e\xca\x14\x6b\x44\x73\x25\x8b\x59\x62\x70\x3f\x2b\x95\x48\x96\x3f\x9d\xbe\x67\xec\x78\xaa\x84\xf0\x9a\xd6\x72\x2c\x84\xab\xea\x43\xe1\xd3\x90\x9f\x4b\x64\x24\x2d\xa8\xa9\x02\xae\x57\x32\x5a\x78\x87\x16\xb3\x75\x2c\x89\xed\x5b\x33\xbb\x82\xab\xab\xfd\x02\xe1\xa2\x94\x6f\x81\xe9\x89\x21\xae\x5d\x45\xe7\xd9\x27\x03\x8a\xda\xd8\x2b\xb1\xc1\x08\x1e\x70\x3f\x3b\x87\x32\x91\xd1\xc5\x2d\x22\x1e\x92\xfb\xf9\xa6\xf5\xa8\x52\xab\xfb\x9f\xa4\xc0\xfe\xa6\xa3\xba\xd9\xbc\x91\x66\xac\x78\x13\x95\x2b\x73\x68\x50\x37\xd1\x65\x19\x6b\xa3\x8a\xfa\xa3\xfb\x4c\xb9\x90\xe1\xde\xaf\x57\x2f\x93\x28\x0a\x8e\x9a\xcf\xa3\x14\x6b\xbe\xfd\x51\xfa\x82\xd9\x67\xa6\x73\x00\x54\x6c\x87\xe2\xc0\x19\x4b\xb4\xf5\xda\x08\xe6\xc7\x4d\x56\x1b\x1e\x41\x7d\x0e\x61\xa4\x9e\x17\xbc\x9b\x21\x11\x49\x18\x49\x31\xdd\x02\x8d\x58\xac\x69\xc0\xb9\x2e\x28\x0e\x9c\xb1\x04\xc5\x86\x98\xb8\x16\x3d\x7b\x3e\x9c\xe6\xab\xd8\xe5\x0d\xe6\x35\xf9\xff\xde\x69\xc2\x39\xec\x4c\xe4\xdd\x11\xb0\xe2\xbc\xa5\x07\x8b\x0b\xc5\x81\x33\x96\x62\xb3\x0e\x42\x70\xe2\xbb\x3b\x51\x69\x7a\x88\xaf\x66\x7d\xe5\xc9\x8d\xdf\x0e\x07\xa7\xd8\x23\xd7\xa9\xd0\x45\x60\x63\xcd\x9f\xc0\xe2\x42\x71\x41\x92\xff\x3c\xcd\xcb\x1a\x41\x95\x99\xdd\xbc\x6b\x61\x69\x42\xae\xcc\xae\x9e\xe3\xfd\xb2\xc0\x87\x74\xec\xe5\x53\x56\x04\xa1\x3b\x02\xc5\x24\xac\x9f\x61\xb3\x0d\xa8\x27\xf1\x32\xed\x78\x8b\x9a\x45\x85\x96\xe8\x25\x8f\xef\x05\xdf\x2a\xa2\x4e\x41\xfe\x8c\x74\x81\x57\x6a\xf9\x60\x85\x54\x1c\x25\x9b\xf6\x4b\x30\x70\xbe\x04\x8a\x03\x6b\xf7\xbd\x3c\x9a\x06\xbb\x51\xac\xd9\x8b\xde\x36\xd4\xf9\xd8\x4e\x7b\x1f\xd7\xbc\x8c\xf7\x78\x83\xad\x48\x0a\xe7\x3d\xe7\xfd\x65\x60\x36\x0e\xc5\x81\xb5\xeb\x7d\xdb\x22\x65\xa1\x49\xbf\x6a\x1d\x80\x4c\xd1\x57\x27\x2a\x86\xe2\x79\xda\x12\xe4\xf4\x22\x38\x3c\xdf\xd5\x8b\x63\xe4\x0f\x50\x47\x0d\x8a\x03\x6b\x97\x29\xd5\x98\xb1\xc2\x2a\xd5\xd8\xd8\xe0\x73\xf7\x57\x52\xd9\xad\xcc\xee\x62\xa2\xf2\x8a\x0e\xca\x2d\x26\x0b\x81\x42\xbe\x39\xa0\x73\x2e\x14\x07\xd6\x6e\x39\x97\xff\x2b\x63\x76\xf3\x4e\x9d\x50\x55\xa4\x27\x4b\xf2\xba\xfd\x9e\x7a\x42\x4c\x67\xdc\xed\x5e\x4b\xd5\x51\xe5\x0e\xe9\x62\x98\x76\x50\xaf\xb3\xcb\xb4\xcb\x96\x2b\x8e\xc5\xe7\xad\x95\x3b\x18\xad\x69\x0b\x2e\x3d\xbd\x3d\x70\x7c\x14\x26\xc8\xc9\xa6\xb1\x82\x7f\x4b\xb4\x5e\xaf\x6a\x1d\x76\xcd\x50\x1c\x58\x3b\x01\x04\x53\xaf\x5d\xc2\xef\x34\x8a\x5f\x67\xab\x62\x2e\xb8\xc3\xdc\xfe\xf8\x95\x78\x93\xd0\x09\x59\xe7\xd9\x6a\xa4\x3b\x65\xdc\x00\xea\x0c\x42\x70\x60\xed\x7c\x9c\xef\xa2\xb1\xaa\x95\xf3\xe2\xc9\x7f\xec\xaf\xbf\x57\xde\xb8\xce\xf1\x4c\xed\x23\x9b\xec\x4c\xcc\x39\xda\x3b\xdd\xd8\x61\xa0\x57\x17\x14\x07\xd6\x6e\xd0\x37\x33\x8e\xd3\x6a\x32\x13\xe5\x5a\xe1\x19\xe6\xae\xfe\xb1\x13\xa7\x97\xc9\x1b\xc1\xc2\xd7\xd9\x9e\x9c\x15\x15\xb7\x77\x80\xb5\x6b\x28\x0e\xac\x9d\x8f\x51\xd6\x57\xa5\x5f\x06\x7d\x01\xa7\xf6\x69\xc6\x48\x36\x4e\xd2\x6e\x6d\x5c\x69\xc4\x78\xdc\xfa\x3b\x86\x76\x02\x18\x02\xeb\x30\xed\xa0\x72\xc2\x65\xda\x2d\x0e\xab\xfe\x6c\xe6\x4f\x95\x2c\x99\xe9\x51\xd2\x53\x13\xfd\x31\x30\xf7\xc1\xf1\x9b\xe1\x37\x76\x1d\x7d\x1a\x4e\xf7\xe4\xb9\x1d\xd8\x35\x43\x71\x60\xed\x30\x85\xf8\xa4\x0d\x27\x78\x65\x2d\x98\xea\xea\xb6\x5e\xaa\xdd\xba\xdb\x39\x51\x47\x9d\xf9\x8d\x7e\xe2\x37\xab\x3b\x69\x51\x28\x30\x6b\x86\xe2\xc0\xda\xf1\xb6\x27\xdc\x1d\x27\x7f\xdf\xc3\xdb\x90\x63\xe8\x33\x75\x36\xd2\xff\x33\xe1\x54\x72\xd4\x66\x8e\xea\x27\x29\x2d\x97\xb9\x0c\xb0\x4e\x09\xc5\xc1\xad\xa1\xb9\x88\x38\x6e\xab\x1f\x61\x08\x7d\x35\x50\x94\x1a\xf3\x71\x8d\x60\x51\xc0\x3a\x29\x31\xb9\x1e\xce\x17\x20\xa2\x6a\xaa\x7d\x06\xac\xa1\x41\x70\x60\xed\xf6\x8e\xb1\xd4\x0f\xac\x10\x15\x26\x74\xee\x05\x94\x85\x08\x9f\x0b\x9c\xff\xf0\x58\x1f\x72\xad\xa9\xb9\xfd\x56\x95\x6d\x98\x11\x0f\xa6\x1d\x54\x62\xbd\xb4\xca\x0b\x51\xa8\xb7\x3c\x5a\x24\x8d\xa5\x88\xc2\x79\xd6\xec\x3b\xc5\x0d\x97\x17\xe5\x7e\x9a\x01\x95\x6f\x43\xe2\x2c\xc2\x0a\x85\x80\xbe\x97\x50\x1c\x58\xbb\x1d\x62\xd6\x7b\x9b\x91\xdf\x3c\x4d\xa4\xfb\x76\xf6\xf1\x95\x25\x06\xf6\xc4\xe9\x18\xbb\x13\xde\x8f\xc4\x96\xc9\xf5\x08\x22\x03\x3b\xc3\xa1\x38\xb0\x76\x0f\xea\x32\x06\x2b\xe6\xf1\xb1\x70\xe8\x6b\xd7\x0f\x45\xc3\xd7\xc5\x2d\x4e\x28\x75\x5f\x88\x2e\x8e\x2f\xb2\xf0\x4a\xf4\x45\x0a\x03\x3b\x5f\x21\x38\xb0\x76\xcc\xee\xec\xd4\x26\xd9\xe1\xd6\xf9\x21\x67\x56\xf9\x58\x36\xf7\xa8\x33\xfa\xf9\x86\x86\x48\xf9\x34\x31\xfa\x03\x1e\x45\xec\xda\xc2\xe2\x42\x71\x60\xed\x66\x68\xc9\x27\x70\x6f\x4a\xc8\x47\xe8\x65\xca\x55\xc8\x7e\x3c\x0d\x64\xd5\x79\x39\xf5\x5c\x9e\x3a\x8c\x5b\x60\xe8\xcb\x4b\x14\x34\x98\x43\x83\x9a\xdd\x5f\xee\xd0\x6e\x12\x5e\xff\x91\xa1\x4d\x68\x37\x77\x41\x34\x36\xd3\xa4\x99\xa5\x7b\x84\x1a\xf0\xee\x77\x85\x0b\x42\x22\x91\x9b\xf2\x56\xea\x3a\xcc\xed\x40\x71\xf0\x0e\xcd\x66\x21\x8a\x1f\x59\x6c\x80\xd6\xe5\xc1\xc2\x70\x28\xfe\x12\x03\x5d\x26\x62\xf4\xcf\xd7\x0f\x28\xfd\x97\x7a\xae\x1b\xf6\x94\xa2\xc0\x22\x43\x71\xf0\x0e\x0d\xf9\x97\xd1\x6a\xa9\x75\x0a\xf1\x1f\x49\x8e\xa1\x98\xe8\x55\x8d\xf7\xd1\x56\x17\xb3\x9c\xfd\x1e\xe6\xc4\x1d\x09\x5b\x6e\xfb\xc0\x35\x43\x71\x41\xd2\xe2\xa0\x7f\xe3\x5f\xf7\x43\x13\xd1\xa8\x74\x2c\x2e\x52\xec\x88\x13\x0c\x7a\xbc\xba\xf0\x44\xdf\x79\x49\x38\xf3\xd0\x04\x03\x9b\xcd\xc9\x39\x87\xc9\x2c\x7f\xed\x6f\x87\x56\xf6\xdc\xe1\x96\xee\x8d\x87\x6b\xba\x49\x27\x22\x88\x41\xde\x0d\x36\xf8\xbe\x0e\x9b\xfb\x64\xf9\xf5\x66\xaa\x71\x3f\xd4\xaf\x49\xff\xfd\xc5\xf5\x59\xd6\x5e\xf1\x57\x51\xef\x76\x6f\x19\xde\x8a\x84\x95\x05\xfa\x00\xbb\x52\x49\x32\x02\x7c\x25\x14\x74\xb4\xf8\x9b\x3a\x9b\xff\x35\x87\x06\x35\xb4\xbf\xcf\xa1\xc1\x39\xb4\xf7\x54\xc5\x8d\x99\x8c\x6b\x3c\x7e\x27\x5f\x6b\xc5\x32\x28\xa2\xef\x09\xe9\x9c\xc9\x10\x70\x09\x3b\x0a\xe0\x4d\x4f\xff\x10\x1e\xba\x92\xe5\x1d\x78\x87\x46\x37\xdd\x4a\x19\x49\x58\x71\xf2\x92\xb1\x4b\x26\x9b\x62\xaa\x78\xa4\x5a\x89\x4b\x96\xdf\x53\x84\x33\x97\x8d\x42\xd9\xee\xb5\xd4\x95\x2c\x66\xc1\x3b\x34\x36\xe6\xde\x83\xcc\x0e\x33\x1c\xa3\xee\xbe\x6d\x7b\x15\xbb\x8c\x6a\x2b\xf4\x41\x83\x23\xf3\x72\x7a\x37\x97\xd6\x64\xed\xb2\x2b\xa9\x5c\x59\x0f\xef\xd0\x64\x10\xb2\x31\x23\x4a\x08\x69\xdc\x9c\x44\xbd\x92\xd7\xfc\x8a\x5f\x29\x75\x67\x90\xca\x2c\x6e\xa0\x0c\xba\x0b\xda\xaa\x23\x5c\x4d\xc1\x4c\x78\x87\x16\xdc\x45\x58\xe8\x1a\xf3\x2d\xf6\x95\xae\x6d\x80\x68\x3f\xdb\x2d\x6e\xb6\xf4\x8f\x3d\xcd\x34\xdb\x2c\xb7\xd7\x52\xd7\xa8\x69\xeb\xae\xcc\xa1\x41\xdd\x44\x97\x9e\x9c\xde\xbd\xa1\xd0\xaa\x86\xf5\x5e\x4e\x40\x50\xe8\x51\xb5\xeb\x3c\x6f\xe5\x6d\xed\x92\xf6\xc1\x8c\x7d\xcc\xba\xf7\x05\xde\x2f\x81\xb3\x4c\x50\x1c\x38\x63\x99\x0f\x49\xa3\xdf\x7e\x62\xbe\x12\x3b\x3f\x45\x44\xd3\xeb\xe5\x42\xc0\xfd\x5d\x00\xd9\x07\x9b\xbb\x57\x80\xe4\xa2\x95\x16\x61\x19\x16\x17\x8a\x03\x67\xac\x59\xa2\xfe\x0e\x11\xf2\xe3\xe4\xe0\x19\x3c\x5a\xf4\x1d\xc3\x06\x93\xa5\xe6\x44\x6a\x67\x7e\xf4\x5b\x36\xb1\x7f\x86\xd5\xed\x33\x61\x71\xa1\x38\x70\x66\x19\x42\x1d\x58\x12\x74\xe6\x77\x99\x57\x65\xba\x53\x47\xd7\xea\x78\xbe\xef\x35\xcf\xe0\x69\x91\x35\x48\xfa\x43\x7d\x86\xe7\x25\xb0\xeb\x0c\x8a\x03\xff\xbf\xe3\x7c\xe6\x9e\x32\x01\xf1\xfd\x01\x85\x94\x2e\x7a\x87\xcc\x82\xa2\x6d\xca\xa6\x23\xac\x1e\x71\x2c\xf2\xe1\xf6\xa6\xf8\x19\x3b\xb0\xd9\x06\xd4\x93\x78\x99\x76\x46\xdf\x19\x3e\x3e\xc7\x12\xbe\x33\x42\xc2\xf5\x48\xe4\x76\xfe\xde\x04\xdb\xe1\x58\x16\xbd\x02\x56\x8f\x95\xde\x0a\xe2\x0f\x3e\xa0\x52\x39\x14\x07\xd6\xce\x89\x92\xbb\x0b\xb9\xea\x5a\xc1\x6f\x11\xc4\x18\xec\x57\xd2\xab\x44\x3b\xe3\xe2\x01\x8a\x75\xc2\x19\x89\x22\xd3\x9f\xde\x3c\x03\x6a\x2e\x42\x71\x60\xed\x36\x8e\x65\x36\x79\x1f\xb1\x4b\xeb\x3a\xc6\xdf\x13\xb4\x65\xf9\xe4\x9e\x69\x7e\xd3\x50\x27\x66\x87\x27\x96\xe2\xcc\xed\xc9\x23\x59\xe0\x6b\x00\x04\x07\xd6\xce\x78\x9e\x34\xac\x64\xba\x0b\x91\x5f\xc7\xf1\x8c\x65\x1d\xb1\xeb\x2e\xc2\x53\xca\x8b\x3a\xea\x0e\xaf\x39\xe7\xc9\x97\xbe\xce\xc0\x9a\x1f\x14\x07\xfe\x7f\x91\x39\xa2\x09\x2a\x0a\xb9\x38\xec\x9b\x4a\xf7\xe9\xd7\x86\xa9\x7e\x39\xa8\xb9\xea\x63\xbb\xfd\x6c\x16\x2d\x26\xb4\x47\x9f\x07\x2a\x16\x40\xbd\xce\x2e\xd3\x2e\x2f\x74\x91\x27\xe2\xe5\xcb\xf8\xc6\x52\x6d\xd7\x6d\x8e\x9e\x6b\xdc\xfd\xf5\xf4\xf9\x6b\xc8\x66\xbd\x3d\x28\x2f\x2a\xae\x11\xed\xc3\xae\x19\x8a\x03\x6b\x27\xa8\x4d\xa4\xe2\x38\x1f\x7f\xe0\x70\xac\xfb\xce\xfc\x0f\x2b\xa2\x7c\x54\x30\x06\xf9\xad\xbd\x3d\x5d\x72\x4d\x9d\xed\xb4\x71\xc0\xb5\x43\x71\x70\xbd\xec\xc4\x36\xc8\xf4\x91\x3e\x8e\x4a\x1e\x06\xec\x63\xf8\x33\x85\xd0\x04\x90\x3b\x6f\x2a\xb9\xdc\x67\xe4\x7b\x36\xd5\xfa\x26\x13\x58\xa7\x84\xe2\xc0\xda\x6d\x3d\x3c\x13\x71\x69\xa8\xcf\x3c\xe6\x33\xb1\xd6\xe9\x41\xf2\x96\xcb\xf9\x8e\xee\xd8\x8d\x8a\x4c\xe9\xaa\x59\x30\x60\x12\x0c\x9c\xff\x84\xe2\xc0\xff\xaf\xe6\x06\x89\x46\xab\x7e\x62\x5a\xec\xe4\xdb\xaf\x98\x69\x2a\x52\x29\xbf\x49\xf8\xab\x64\xe2\x62\x11\xc9\x26\xb8\x1d\x71\x2c\xec\x60\xda\x41\xe5\x84\xcb\xb4\x1b\x1e\xa6\x52\x7a\x7f\x8a\xf5\x9a\xfa\xbe\xff\xed\xd0\xbb\x79\x5a\x46\x01\x95\xa5\x94\x87\xb1\xd1\x21\xdd\xf7\x77\x53\x37\xb7\x81\x8a\x1e\x50\x1c\x58\xbb\xcf\x42\x74\x9e\x98\x35\x76\xa4\xb7\x37\x08\x86\xbe\x74\x5a\xef\x46\x24\xf9\x62\xbf\xcd\xfb\x95\x6f\xd6\x19\x3f\x8e\x8d\x23\x07\xcc\x9a\xa1\x38\xb0\x76\x9f\x4d\x12\xaa\x87\x8a\xad\x37\x09\x2b\xbc\x31\x52\x1b\xc2\x42\x5a\xe8\x09\xe5\x9e\xb9\xd1\x04\xa2\x2e\xf0\x87\x51\xdf\xb6\x61\x03\xe2\x42\x70\x60\xed\x52\x9c\xcc\x6e\xe0\x14\x48\x4b\x49\x13\xc9\x6e\x9c\x3d\xc9\x6c\x29\x28\xe6\xd9\x76\xb7\x9d\xab\x3d\xc9\xc2\x23\x18\xff\x56\x46\x0e\x8b\x0b\xc5\x81\xff\x5f\xef\x52\x24\x9b\xed\xe3\x95\xb0\x27\x6d\xfb\x39\x0e\x8d\x01\x65\xab\x9c\xaa\xf4\xa8\xb1\x62\x43\x44\xb4\x23\x21\x86\xbf\x96\x3b\x80\xfa\xb7\x10\x89\xf5\xd2\x4e\x09\x11\x79\x5f\x25\x9c\x52\x43\xe3\x77\x06\x0f\x96\x44\x8a\x03\x1d\x15\x0c\x22\xba\x91\xf2\x75\xc4\x8d\x27\xfb\xce\x90\x06\xde\x03\x5f\x30\x20\x38\xb0\x76\x99\x39\xc7\x56\x3c\xea\xd1\x84\x25\x6b\x37\x4a\x66\x89\x0a\xa9\x92\x26\x97\xf8\x36\xce\x77\xa3\x4b\xdf\xa7\x78\xeb\x15\xe8\xa5\x01\x5f\x89\x20\x38\xb0\x76\x6a\x34\x09\x21\xa9\x23\x0e\x86\x7e\x38\x12\x3a\x4b\x69\x71\x13\x0a\xe4\xdc\x67\xf4\x7b\x5c\x74\x8a\x58\x64\xf5\xc2\x7c\xa9\xca\x40\x8d\x48\x08\x0e\xac\xdd\x6a\x61\xd5\xcd\xa2\xcc\xa4\xca\xad\x83\xa2\xb0\xd9\x82\x3b\x21\x8b\x9a\x6e\xb2\x6f\x22\xdf\xa9\x20\x5b\xcc\xd3\xa1\x1c\xfc\x01\x7a\xfa\x41\x71\xe0\xff\xf7\xc3\xad\xa2\x3b\xf4\xcd\xe8\x2c\x7d\x3b\xf7\x5d\xb7\x7a\xd4\xdb\x6e\x3b\x28\xdb\x2b\xbe\xad\x52\x61\xce\x90\x0b\xa0\x11\xe1\x77\x81\x39\x34\xa8\xd9\xfd\xe5\x0e\x4d\xb5\xb1\x5c\x7b\x75\x57\xdf\x1c\x71\x74\xf3\xe8\x9d\x85\xed\xda\x93\x20\x77\xaf\x60\xae\xe8\x2f\x29\x14\x71\x89\x6b\x15\x31\x53\x30\xb7\x03\xc5\xc1\x3b\xb4\xdc\xa5\xa9\xc0\x8e\x9b\x3b\x0a\xa5\x6c\x16\xef\xf8\xb6\x89\x07\xbb\xbe\xec\x9d\x1d\x7d\xbc\x87\x30\x53\x88\x96\x1f\xc8\x3d\x62\x0c\x8b\x0c\xc5\xc1\x3b\xb4\x3a\x2c\x3a\xba\x3f\x5f\x70\x6b\x68\x4c\x11\xc7\x35\x1f\xa7\x3b\x65\xc9\xbf\xc0\x1b\x24\xd3\x1e\x7f\xb3\x18\x95\xab\x6c\x59\x50\x06\x8b\x0c\xc5\x05\x49\x23\x20\xfe\x33\xf2\xbf\xee\x87\x46\x7a\x86\x8c\x60\x20\xcf\xf3\x36\x4e\x42\x60\xe6\xc3\xce\x42\x59\xba\x08\x87\x8c\x96\x3c\xfa\xe1\xe6\x68\x7c\xbb\x7a\x12\x5e\xd1\xdf\x0e\x4d\x81\x7b\xaf\x98\xa1\xfa\x66\x21\xff\x43\x3b\x0a\x85\x91\xd6\xe5\x83\xd7\x17\x48\xd2\x16\x43\x26\xb1\x54\x95\x29\x48\x48\xe7\x19\x7f\xa1\x27\x99\x2f\xf0\xe8\x07\xa3\x5a\x30\x5e\xcc\x49\x44\xc7\xa9\x62\xc7\x1c\x7b\xa7\x54\x60\x04\x6b\xaf\xdb\x09\xc9\x46\x87\x37\xf3\xfc\xd7\x1c\x1a\xd4\xd0\xfe\x3e\x87\x06\xe7\xd0\xca\x65\xb8\x0a\x92\xef\x87\xd7\x93\x15\xa0\x7c\x6e\x1f\xfa\x16\xa9\xf2\xf6\xb9\xed\xf3\x37\x3d\x69\x5e\x03\x1d\x0d\xcb\x53\x8a\x5a\x57\xb2\xbc\xc3\x03\x67\x1e\xd6\xe8\xa4\xe3\x8f\xc2\x7c\xc6\xa5\x83\x96\xdf\xa4\xcb\x90\x60\xfa\xce\xdf\xcc\x58\xbe\x9b\x31\x4d\xc3\xe0\xa1\xc8\x66\xe8\x75\x05\x45\x2c\xc2\xa4\x9f\xc1\x3b\xb4\x9b\x4d\xd9\x53\xdb\xd5\x5e\xfa\xe4\x43\x66\x4a\x5e\x31\xe4\x44\x73\x56\x2e\x54\x54\x4f\x03\x88\xd3\xea\x99\xb9\x5f\xd7\xf7\x5d\xc9\x1a\x1a\xc2\x43\xb8\x9f\x1d\x99\xb2\x31\xb7\x4b\x48\x49\x62\x10\x6c\x39\x30\xfb\x99\x6d\xd0\xe6\xa2\xcd\x8c\x3b\x95\x87\xd6\x37\x4e\xec\xad\x24\x91\x8e\x75\x25\xa3\x85\x77\x68\x0e\x1d\x47\x5c\x49\x78\x4f\xd3\xe5\xed\x25\x9c\xb6\x22\x11\x90\xab\x32\x96\x69\xdd\xf3\xd2\x66\x8e\x33\x79\x56\x3e\x37\x1c\xff\xba\x32\x87\x06\x75\x13\x5d\x96\xb1\xae\xf1\x8d\x16\xd8\xe0\xc9\xb2\xe9\x7f\xf6\x8e\x50\xe2\xd6\x3f\xbc\xd3\xfa\x71\x56\x9a\xfa\x05\x49\xd5\x7e\x85\x73\xe9\xa6\x03\x17\x70\xda\x1b\x82\x03\x67\x2c\x93\xd1\xf7\x8a\x93\x71\xfd\x0a\xbf\x49\x7f\x5b\x3a\x8a\x4b\x1a\x1e\xf5\x6c\xa2\x0d\xf3\x93\x2d\x6e\x09\x6b\x99\xd8\xab\x20\xd7\x03\xfb\xdc\x21\x38\x70\xc6\x22\x35\xd1\x3f\x54\xf8\x10\xa8\xf9\x91\x4a\x3f\xbb\xfd\x75\x38\x1e\xc1\x91\xa3\x67\x94\x79\xe6\xc9\x1f\x4b\x42\x37\x27\x66\x0b\x60\xa6\x08\xc5\x81\x33\x56\x92\x54\x8f\xf4\xed\x6d\x07\xd7\x5b\x5b\x0b\x5f\xea\x5e\x88\x37\x45\x9b\x9a\x16\x1b\x92\xa0\xd7\x20\x3a\x98\xdc\x19\xa6\xcd\x00\xea\x17\x42\x71\x41\x92\x78\xff\xac\x98\x42\xa4\xb3\xbb\xee\x44\xf9\x32\x74\x83\xb4\x23\x22\x7a\xed\x13\x31\xe6\x92\x30\xe7\x4f\xda\xad\x2f\x5c\x81\x16\x8b\xbc\xec\xfa\xb0\xd9\x06\xd4\x93\x78\x99\x76\x0c\xd8\x63\x92\xc7\xea\x36\x18\xcb\xd7\xd9\x89\xdd\x5d\xa2\xe6\x0f\xd2\x3a\x33\xc6\x7b\xc5\xc9\xec\xc7\x9e\xbe\x70\xd6\xb1\xc0\x00\xea\xe0\x41\x70\x60\xed\xee\x53\x4d\x90\x93\xbe\x1b\x6b\x93\x2b\x1c\x4a\x29\x0d\x0a\x4c\x7e\xab\xcf\xc6\x3a\x52\x1b\xf2\x74\xe5\xfb\x90\xc6\x53\xb6\x68\xe0\x6c\x22\x14\x07\xd6\x6e\x64\xe8\x75\x08\x97\x74\x59\xb0\x9c\xc8\x3b\x2c\x9d\xc6\x6c\xc3\xaa\xc4\xf9\x7d\xdb\x69\x99\x0f\x13\xfe\x0a\xd6\xca\x08\x0e\x40\x2f\x3b\x28\x0e\xac\x5d\x83\x71\x35\x71\xa6\xc1\x06\x2f\x96\x7b\x0b\x5e\x5d\x8a\xcf\xd6\x8f\x25\x87\x22\x4c\x57\xbc\x92\x45\xef\x2f\x69\x9d\x06\x6d\x8e\xc0\xce\x3e\x08\x0e\xac\x5d\x5c\x27\x5b\xdf\x9b\xdf\x24\xce\xc5\x37\x94\x03\x85\x8b\xd6\xda\x23\xed\x99\xd4\x07\x0c\xf7\xbc\xba\xba\x02\x11\x5d\xdc\xf5\x16\x61\xda\x41\xbd\xce\x2e\xd3\xee\x50\xf6\x06\x92\x3d\x95\x38\x3e\xea\x79\xe0\x78\x2a\x63\x0b\x6a\x40\xef\xfe\xb7\xea\xc0\x04\x79\x1b\x4d\xd4\xfa\x47\x2b\x48\x40\x95\x79\x28\x0e\xae\x53\x42\xe9\x5e\x80\xba\x12\x95\x1c\xf3\x0c\xc7\xe7\x88\xe5\xc7\x0c\x8e\x1e\x5a\xd3\xaf\xaa\x89\x86\x87\x6b\x75\xfd\x36\x94\xce\x80\x5a\xa7\x50\x1c\x58\x3b\x92\xc7\x44\x73\xfb\xdf\x57\x5b\x98\xc7\x1c\x97\x74\xdb\x9e\x76\xf9\x10\x8f\x3a\x0c\x70\xa4\xea\xc9\x32\xbc\x7d\xae\xfc\x45\x09\xb8\x5e\x28\x0e\xac\x9d\xe2\x27\x69\x09\x42\xd7\xd0\xac\x6a\xf7\x53\x66\xb6\x38\xb1\x35\x8d\x3f\xd7\xce\x90\x46\xdd\x89\x57\x5e\x92\x0e\x74\x3c\xe2\xfb\x09\xac\x5d\x43\x70\x60\xed\xb0\x07\x4f\x8a\x9d\x89\x9e\xd4\x5a\xd9\x71\x13\x65\xec\xf4\xa3\x6e\x13\x6c\xd9\x68\xdd\x70\xd6\x69\x15\x93\xf6\x76\x3e\x61\x38\x80\x69\x07\x95\x13\x2e\xd3\x6e\x50\xf1\x55\x7c\x6b\xe7\xaf\xc5\x20\x13\xc1\xc1\x26\xcb\x5a\xf4\x07\xfa\x4b\x36\x26\xe3\xcd\x7c\xf6\xad\x41\xd9\x5b\x7b\xf3\xb5\xc0\xba\x1f\x04\x07\xd7\x6d\x5c\x59\xa9\x9d\xaa\xa8\xb0\x5f\xe7\x93\x07\x4e\x2e\xcb\x0d\x41\x53\x51\xa5\xac\x93\x6b\xba\x03\x9e\xea\x4f\xef\xd8\x06\x39\xfc\x5f\xb7\x71\x08\x0e\xac\x9d\xe7\xf4\x4e\xe6\x7d\x85\xc8\x10\xb7\xad\xc2\x5f\x83\xf9\xad\x19\xa5\x0b\x8f\xea\x11\x8a\xe4\xc3\x83\xe4\x04\x63\x3e\x09\x50\xd9\x00\x3b\xce\x21\x38\xb0\x76\x09\x7d\xf2\x9c\xbe\x59\x11\xfb\xe8\x5a\x19\x1c\x1c\x66\xf7\xf3\x6a\x82\x32\xcf\x23\xc5\x93\x0f\x71\x32\x2a\x3e\x3b\x12\x7e\x02\x76\xc8\x43\x71\x60\xed\xe4\xae\x35\x14\x3f\x24\xca\x9e\x2c\x1f\xc1\x5a\xde\xe6\xf2\x6a\x17\x95\xee\x5f\xed\x6b\xa2\x2f\x13\x22\xa2\x33\xe5\x9d\xe5\xbc\x0b\xd3\x0e\x2a\xb1\x5e\xa6\xdd\x84\xf1\xad\x19\xf1\xa6\x88\x2c\x75\x1a\x36\x65\x2f\x9e\x66\x24\x2a\xc1\x49\x8a\xd3\x01\x05\x8d\xd7\x06\xe5\x0c\xad\x0c\x7b\x40\xed\x50\x28\x0e\xac\xdd\x8b\x69\x24\x73\x49\x6f\x9a\x77\xe2\x08\x0e\xcd\x01\x92\x95\x6e\x32\xcc\xd7\x3d\x7b\x66\xe8\xa4\x56\xfc\xf9\x46\xb2\xdc\x47\x39\x60\x71\xa1\x38\xb8\x77\xe6\x01\x9d\x1f\xb7\x61\x38\x69\x6a\xbf\xcd\xaa\xb1\xb8\x36\xf2\xfc\xfe\x4e\x4f\x73\xdc\xed\xba\x95\x8f\x76\x62\x9e\xb4\x11\x40\x5c\x28\x0e\xac\x9d\xd6\x9b\x61\x63\x89\x44\x03\x8b\xf0\xd2\xf3\xaa\x83\x2f\x21\xf6\x04\xf3\xb9\x2a\xcd\x0f\xc2\x65\x22\xf1\x15\x2b\x9f\xb9\x5b\x02\xe7\xd0\xa0\x38\xb0\x76\x1c\x3c\xd2\xd5\x18\xe7\xaa\xcb\xed\xf3\x13\x82\x8e\x21\xee\x66\x35\x8f\xf1\x52\x7c\x9f\x6d\x49\xe6\x37\x92\xdf\xac\x43\x3f\x70\x84\x39\x34\xa8\xd9\xfd\xe5\x0e\xed\x15\x29\x26\xba\x79\x57\xcb\x33\x81\xe7\xf4\x21\x13\x54\x5c\x5f\xea\xdf\xf2\x51\x2d\xa6\x53\x98\xed\xf9\x7d\xd6\x2b\x22\x4a\xd5\x81\xb9\x1d\x28\x0e\xde\xa1\xc9\x5d\x50\x84\x36\x8c\xb3\x31\x9e\x5f\x67\x95\x08\x2f\xf2\xa0\x5a\xec\xda\x7b\xc1\xc0\xe5\xa0\x65\x5a\x41\xd8\x6d\xe7\xb4\xd9\x0b\x8b\x0c\xc5\xc1\x3b\xb4\xd1\x79\xaa\x95\x85\x94\x64\x75\x0f\x85\x31\x3a\xb6\x6f\x15\xa7\x1d\x9f\xbb\x72\x94\x6f\xb1\x31\xc6\x5c\x43\xc0\x10\x40\x8f\x8b\x87\x45\x86\xe2\xe0\xab\x44\xfe\xeb\x7e\x68\xe7\x4b\x19\x71\x17\x15\x42\x49\x4b\x91\x5f\xa5\x3a\x98\x3f\x9d\x7d\xf4\x96\x45\xc3\xd4\xf1\xe3\x27\x43\x61\x08\x66\xf1\x1c\xba\xfd\xb7\x43\xa3\x95\x62\x40\xd7\x9c\x79\x1d\x2f\x7a\x1a\x49\x3c\xb2\x69\x27\x8c\xf6\x2b\xcf\xe4\x41\x85\x85\xbe\x6e\xd7\xb3\xbd\xc7\xbb\xae\x04\x7f\xa1\x85\xb7\x0d\x71\xfc\x3c\xfd\xfd\x29\x37\xd3\x0a\x6d\x4d\x79\x32\xa9\x9a\x6b\x91\xb8\xd7\xf5\xb0\xfb\xc5\x22\xda\x07\x10\x49\x6d\xff\x6b\x0e\x0d\x6a\x68\x7f\x9f\x43\x83\x73\x68\x41\x2e\xc3\x66\xf6\xa1\xf3\x36\x3e\x1f\xea\xa3\x99\xbc\x56\xdf\xe5\x8b\x17\xb2\x78\xe8\x57\xaa\x6d\xfe\xdc\xef\x70\xd2\x78\xdc\x75\x25\xcb\x3b\xf0\x0e\x8d\xc6\x6b\x52\xcb\xb2\x51\x2a\xaf\xa1\x40\x52\xce\xf6\xad\x87\x52\x35\xc5\xa8\x0b\x1b\xee\xcb\x70\x94\x9c\xc3\x99\xb1\x04\xb5\xdf\x57\xb2\x98\x05\xef\xd0\x24\x55\xca\x66\x5f\xe2\x7a\xb8\xda\xe2\xce\xc8\x95\xf6\x78\x4f\x37\xb8\x76\x2b\xe0\xbe\xad\xf8\x6e\xd7\x48\x9b\xd3\x53\x88\x69\x76\x25\xa3\x85\x77\x68\xb3\x72\xda\x86\xd4\x8f\xc2\x3c\x7e\xdb\x61\xf3\x5f\x47\xd5\x3a\x1d\x7b\x1d\x32\xa3\x96\xea\x17\x6c\x2d\xa3\xac\x4f\x18\xc0\x8c\x79\x25\xa3\x85\x77\x68\xd5\x01\x82\x07\xa3\xf2\x34\x23\xa8\xcc\x86\xdf\x30\x47\x31\x70\x89\x71\x17\xb2\xef\x98\xaa\x3f\x94\x4c\xe5\xd2\x8f\xb3\xfb\xc7\xd9\xcb\xff\x37\x87\x06\x75\x13\x5d\x96\xb1\x7a\x4d\x12\xd0\xbd\xf9\xef\xcf\xcb\x4a\x25\xbd\xdc\x7b\x2e\x4b\xa0\x58\x1a\x53\xba\xc9\x70\x47\xae\xf8\x11\x73\xe6\x93\x09\x5f\x20\x03\x40\x71\xe0\x8c\x65\x97\x35\xb8\x14\xdc\x90\xf0\xc5\xb7\xad\xd4\x48\xef\xf1\xc8\x6d\x2c\x4d\x8f\xd1\x8c\x34\x2a\xde\xe1\x7c\xa2\x64\x73\x3c\x5f\x29\x58\x5c\x28\x0e\x9c\xb1\x66\x8e\x5c\x57\xb5\x27\xdf\xa5\x95\x91\x77\x0c\xef\xc8\x7a\x73\x3d\x32\xaf\xf3\xcd\xdb\xe7\x7f\x78\xb0\x9b\x8b\x68\x80\x8f\x6b\x0c\x8b\x0b\xc5\x81\x33\x96\x5d\xb3\xcf\xf8\x84\xc8\x77\x85\xd1\xac\x74\xf7\xd8\x17\xcb\x0f\x62\xcb\x8b\xec\x07\x9f\x6a\xac\x2a\xbd\xd5\xed\x53\x36\x45\x02\xba\xba\x42\x71\x41\x92\x08\x88\x7f\xc7\x0d\xc8\xaa\xb0\x66\x27\x9f\xb9\xd8\xc0\x78\xbb\xc0\x60\x23\xc1\x22\x9a\x82\xd9\x3f\x3f\x78\xae\x5c\x4f\xf2\xbd\xd2\x89\x5a\x37\x03\x36\xdb\x80\x7a\x12\x2f\xd3\xee\xe4\x07\xea\xc7\x00\x46\x8f\x54\x7c\x51\xa3\x6f\x4f\x5e\xa2\x71\xd1\x9a\x8f\x62\x79\x3b\x62\xf4\x90\xbf\x7c\xcc\x6e\xe0\xe9\x02\x54\x00\x80\xe2\xc0\xda\x59\x28\x3b\x0f\x62\xe3\x56\xd8\x90\xc7\xe7\x18\x4f\x30\x5c\x9b\x4f\x55\x16\xa3\x40\x3f\x51\xf7\x10\x97\x59\xb8\xbb\xf5\xe3\x06\xd0\xab\x0b\x8a\x83\xab\x14\xa2\x97\x69\x65\xd6\x79\x31\x62\xa5\x27\x8f\xba\x51\x3e\xb4\xa6\xef\xc2\xfe\xc9\x95\x26\x7a\x20\x6f\xf1\x82\x5b\x36\xb0\x2f\x0a\x58\x9b\x83\xe0\xc0\xda\x7d\xb9\x15\x95\x62\xfd\xcb\xd7\x78\xde\xcc\xc5\x77\xae\xb6\xb3\xc0\x7d\x5c\xc0\x5c\x5a\x28\x47\x3e\x32\x71\x31\x3d\xc0\xae\x47\x05\x16\x17\x8a\x03\x6b\x47\xd3\xb2\xe6\x56\xe7\xd4\xf0\xf0\x64\xfa\x94\x23\x8c\x68\xbe\x9a\x8f\x77\x2e\xf2\xbb\xc2\x02\x21\x8d\x37\x93\xbb\x7b\x4e\x6e\x15\x4c\x3b\xa8\xd7\xd9\xa5\xb5\x1c\xe7\x78\xfb\xc5\x50\xd1\x6b\x9b\x9e\x45\xe5\x3d\x16\x43\x21\x33\x43\xe5\x32\x5a\x7b\x55\x66\x90\x32\xe2\xa3\x34\xd1\xcd\x3a\x03\xd4\x72\x84\xe0\xc0\xda\x95\x7c\xd3\xd5\x7a\xc4\x7f\x63\x7e\x86\xe0\xc4\xba\x28\xc2\xe8\x8c\x50\x24\x30\x9f\x85\x9f\x59\x23\xb5\x5e\x47\xda\xfd\x7d\x45\x1d\x2c\x2e\x14\x07\xd6\xee\x91\xc0\x8c\xd0\x2f\x9f\x07\xb1\x71\xac\x29\xfb\x36\x64\x0c\xaf\x50\x22\x1b\xde\xfe\x7c\x1e\xc9\x3f\xd2\xa5\x9a\xcf\x51\xcb\x0f\x9c\x9b\x83\xe2\xc0\xda\xf9\xe1\x0e\x65\x9a\xde\x1d\xb8\xff\x7a\x92\x36\xb3\x0c\xe3\x05\x85\x33\x9b\xf1\x6d\x9a\x9b\x8c\xf4\xa9\xba\xf6\x4a\xa6\xb6\x99\x40\x17\x73\x28\x0e\xac\x1d\x87\x73\x71\xa9\x39\x57\x6a\xda\x70\x1a\x4d\xce\x54\x95\xe3\x47\x5b\x11\xb9\x0f\xfd\xc4\x55\x5c\xf9\x91\x71\xbf\x91\xcd\x66\x29\x60\xda\x41\xe5\x84\xcb\xb4\xc3\xce\x43\xf2\xb5\x5f\x39\xf5\x6d\xf8\xf4\xa6\x9e\x07\xb9\x32\x40\xcf\xa3\x69\x3b\x71\xbf\x1c\xb5\xff\xf8\x96\xe1\xc1\xaf\x57\x65\xb0\x6b\x86\xe2\xc0\xda\xad\x37\xa3\x25\xb8\xfd\x9e\xf2\xe5\x28\x4d\x1b\x5e\x5d\x2c\xa5\x3e\xbc\x98\xec\xb9\xe6\x1d\x76\xf6\xbd\x43\xff\x73\xcc\xc4\x26\x70\x16\x16\x8a\x03\x6b\xc7\x2c\xae\x27\xea\x20\xce\xf2\x03\xc7\x98\xf4\x9c\x87\x59\xcf\x29\x5c\x01\xbd\x42\xcf\xf6\xb3\x87\x93\xeb\x1a\xc9\x67\xfc\x7b\xea\xc0\x8e\x36\x08\x0e\xac\x5d\x4f\x07\x0f\x8b\xd1\xc3\x57\x8e\x9f\x7a\xc8\x08\x77\xc9\x57\xa2\x04\xee\x98\xc4\xad\xb4\xf8\x1a\xac\x0e\x6f\xb0\xde\x1e\xdb\x97\x83\xc5\x85\xe2\xc0\xda\x71\x9e\x08\x54\xc7\xc8\xe3\xf1\xef\x47\xdc\xe7\xe1\xd8\x59\x7f\x3d\x61\xa2\x66\x83\xb1\xd8\x68\x97\xa2\xec\x2f\xd1\xeb\x3c\xcf\x08\xd3\x0e\x2a\xb1\x5e\xa6\xdd\xed\xaa\x0b\x99\xb4\xf2\xdb\x9e\x84\x15\x18\x45\x58\x04\x55\x79\x93\xa2\x6e\x86\x82\x6e\xd3\x72\x22\x68\xe7\x98\xde\x29\x6f\x80\x5a\x8e\x50\x1c\xdc\xae\xfe\xf4\xe7\x19\x3f\x2b\x14\xf4\xcb\xad\xe9\x0c\x22\xb5\x14\x7f\x4c\x72\x46\x13\xb8\x46\x0a\xef\x76\x95\x1b\x90\x3e\x4f\x9d\xbd\x05\xec\xea\x87\xe0\xc0\xda\x7d\xdf\x6f\xb6\xed\xc7\x5b\xc3\x1c\x7a\x1b\x74\xa4\x15\x75\xe4\xd2\x35\x14\xab\x9f\xc1\xa9\x6d\x8b\xa8\x53\x80\xcb\x69\x62\xa3\x0f\xec\x38\x87\xe0\xc0\xda\xc9\x63\x95\xb6\xbf\xba\xc9\xa0\x7e\x6d\x7a\x99\x3a\xb7\x20\x77\x9b\xfa\x50\x60\x92\xff\x64\x05\x81\xd5\x25\x26\x61\x84\x4b\x6c\x11\xa8\x98\x02\xc1\x81\xb5\xb3\x16\xae\xb4\x64\x5e\xe0\x33\xe3\x53\xfb\x4c\x76\xff\xa5\x2d\xe1\x8e\x38\xf1\xaf\xd8\x03\xcc\x53\xe3\xe4\x7d\xab\xf6\xb9\xdd\x02\x98\x43\x83\x9a\xdd\x5f\xee\xd0\x94\x88\x66\xb6\x0b\xb2\x33\x92\x77\x32\xbf\xfa\x2e\xd1\x37\xc8\xb8\x4f\xba\xe2\x8a\x4a\x22\xd3\x1a\xef\x2c\x37\x59\x1b\x76\x4c\xc0\xdc\x0e\x14\x07\xef\xd0\x0a\xf9\xe2\x63\x1e\xd1\x2c\xf1\xe6\x3d\xe0\x56\x3d\xfb\xa4\x75\x2a\xcb\xd8\x9c\x1a\x92\x61\x87\xe2\x6d\xf4\xc8\x86\x98\xba\x77\x0b\x16\x19\x8a\x83\x77\x68\x27\x3f\xd6\xa2\xf7\xd2\xe5\x08\xc5\xd7\x45\x5b\x23\xb9\x28\x23\xb1\x7f\xbd\xb8\x11\x99\x4f\xe6\x28\x57\x9a\xe8\xac\xba\xfb\x22\x14\x16\x19\x8a\x0b\x92\x46\xc0\xfb\x67\xe4\x7f\xdd\x0f\xcd\x50\x5e\x48\xfc\x78\x61\x60\x5c\xc8\xcf\x96\x80\xef\x97\x68\xe2\xc9\x8f\x00\xbd\xe2\x5b\xe3\xc4\x91\x8c\xd2\x05\x01\x48\xbb\xf5\x7f\x3b\xb4\x71\xf9\x50\x26\x01\xce\x73\x61\x9a\x9c\xa4\xed\x01\xe6\x94\x47\x9e\x38\xaa\xdd\x2d\x69\x02\xcb\xc2\xf2\x76\xbc\x48\xa5\x52\x13\x7f\xa1\x15\x8a\x59\x8f\x9e\xa7\xb5\xc6\xf0\xf1\xa0\xda\x92\xa2\xe0\xfc\x14\x08\x19\x3c\xb1\x14\x8d\xad\xe6\x1c\x12\xea\x88\x54\x2a\xde\xfd\xaf\x39\x34\xa8\xa1\xfd\x7d\x0e\x4d\x01\x3c\x8b\xbf\x3e\xbb\x50\x53\x53\xbb\x11\xab\x34\x54\xe3\x4b\x1f\xef\x1f\x96\xa9\x3b\x46\x3d\x41\xde\x66\x52\x7f\x51\x56\xf9\x0c\xed\xd5\xc4\x95\x2c\xef\xc0\x3b\x34\xed\x87\x13\x37\x9f\x05\xb1\x8a\x3a\x56\x45\x62\x0e\x2e\x54\xb6\x0e\xdd\xac\x72\xff\x79\xfa\xbb\x1f\x77\xc8\xeb\xf6\x76\x9b\x2e\xdf\x95\x2c\x66\xa9\xc1\xfd\x2c\xa6\x42\x21\xe3\x8f\x10\xd6\x59\xa3\xcd\x56\xa1\x2e\xdb\x56\x7b\xce\x39\xab\x8e\x5d\xbd\x2e\x24\xbe\x0f\x61\x4b\x54\xb6\xee\x5f\xaf\x64\xb4\xf0\x0e\x6d\xe0\xb5\xb0\xcc\xf3\x7d\x8a\xb1\xf4\x02\x12\x64\x71\xce\x27\x98\xc9\xfa\xc4\x7e\xfd\xb3\x07\xcf\x17\x92\x4d\x68\x3b\x7e\xb2\x97\x5e\xc9\x68\x3d\xe1\x7e\xb6\x90\x90\xe7\xe7\x07\x2d\x07\xd2\x83\x00\x2b\x7d\xfc\x98\xf3\x67\x76\xdf\x11\x85\xec\xce\x04\x1c\x0a\xd8\x24\x57\xad\x16\xb5\x42\xaf\xcc\xa1\x41\xdd\x44\x97\x65\x2c\x4d\x53\x7e\x75\xcf\x55\x9b\xe4\xf6\xc2\x76\x2a\xb4\x5c\x3d\x72\x72\xb4\x2a\xfd\x40\xb9\x1f\x96\x13\xe3\xb7\xc3\xc3\x67\xdc\x80\x7a\x80\x50\x1c\x38\x63\x19\xa7\x2d\xbe\xe4\xbe\xd9\xcf\x36\xef\xef\x44\x49\x85\x91\xe2\x81\xb6\xe1\xb4\xcd\x59\x82\x6a\xbb\xbc\x4c\xb2\x4c\x79\xc3\xfb\x18\xd8\x79\x06\xc1\x81\x33\xd6\x1f\x5a\x7e\x6d\xef\x31\xee\xd0\x97\xd8\x34\xa2\x79\xeb\xa8\xdf\x0a\x6b\x49\x1f\x1e\xd8\x8b\x32\xba\xeb\x3f\x53\xb5\xd8\x89\x92\x86\xc5\x85\xe2\xc0\x19\xcb\xe2\xba\xa5\x0d\x7f\x36\x35\xcf\xf5\x05\x5f\x42\x5a\x73\x01\x41\x47\xa5\xdb\xe7\x6c\x13\x04\xd4\xbf\x10\x31\xd0\x7c\xda\x63\x9c\x00\x57\x02\xc1\x81\xf7\xfb\xdb\x1c\xde\xfb\x48\x22\xa4\x3b\xd1\x6b\x54\x4b\x66\xb2\x4f\x47\xb1\x57\xbd\x7b\x93\x70\xaf\xea\xc5\x3c\x65\x06\x5d\xfc\x4d\x75\x5a\xd8\x6c\x03\xea\x49\xbc\x4c\x3b\x1c\xbf\x40\xe5\xdb\x6a\x3c\xfa\x1c\xf7\x6c\x68\xee\x45\x89\xfa\xda\x3b\x1d\xb4\x06\xef\xc4\x12\x34\xbe\x3d\xfe\xa6\x56\xe3\x0d\xac\x7f\x42\x71\x60\xed\x50\x78\xf3\x0b\xb4\x14\x48\xb1\xf0\xe2\xaa\x3d\x12\xb3\x9e\xe1\x0a\x4e\x52\x8d\x53\xae\x8a\x9d\x2a\x67\xff\x10\x08\xed\x6b\x07\x5c\x3b\x14\x07\x37\xcb\x3f\x71\xbe\xfb\xba\x22\x08\x85\x16\xef\xf9\xc8\x37\xc2\x42\xff\x75\x24\x7a\xdb\xe1\x57\xe6\x05\x7d\xf2\xc6\x0a\xf6\x86\x79\xc0\x1a\x1a\x14\x07\xd6\xee\x0f\xe5\xbd\x29\x7f\x8d\x69\x4f\x99\xe3\xcd\x05\x6d\x8f\x35\x85\x04\x1a\x6f\xeb\x2f\x17\xdb\x5c\x6d\xf7\x07\x19\x87\xa8\xad\xfe\xef\x9e\x80\xe0\xc0\xda\x25\xde\x3d\xfd\x50\x44\x9c\xe6\xa3\xc9\x3c\x37\x66\x87\x72\x9d\x80\x8b\xe9\x97\x15\x47\x91\xa7\x0f\x7f\x66\x07\x16\x9a\x7d\x58\x03\x4c\x3b\xa8\xd7\xd9\x65\xda\x25\x0d\xaa\x04\x50\x73\xc6\x6d\x49\x26\xb9\x0a\x96\x4d\x87\xc8\x98\xf3\xca\x66\x9f\xc7\x14\x1f\xe8\x4e\x64\xb3\xb5\xd3\x7e\x01\xaa\x68\x43\x71\x60\xed\x1e\x4f\x11\xd0\x9c\xec\x53\xa7\x8a\xb8\x7d\x38\x41\xcc\x40\x89\xec\x17\x21\x64\x6c\xa1\xa4\x9d\x08\xe1\xed\x3b\xca\x58\x5b\x03\xce\xe4\x41\x71\x60\xed\x98\x1c\x95\xb5\xda\x6e\x9e\x4e\x91\x0c\x71\xa1\x75\x61\x29\x9f\x89\xd0\xdf\x35\x75\x16\xe6\xb7\x4d\xa3\x3a\x9c\xf3\xac\x9f\x05\x5c\x09\x14\x07\xd6\xee\x59\xe4\xbe\x92\x89\x6e\xba\xe4\xf4\x38\xc6\xb5\xcc\xfe\xcc\xf2\xb7\xc9\x5c\x59\xd8\x82\xad\x6d\x5c\x44\x0a\x1e\xc5\x05\xcb\x8a\xb0\xb8\x50\x1c\x58\x3b\xde\x35\x2c\xbc\x41\x94\x5f\x77\x24\xcf\xe9\x37\x28\x9e\xb0\x3f\xbf\xf6\x79\x52\x3a\xb1\xb1\x21\xfd\x89\x58\x52\xa7\x55\x2d\x81\x21\x4c\x3b\xa8\x9c\x70\x99\x76\xbe\xe2\xa3\x32\x6e\x44\x9a\xa9\x2f\xd8\x8f\x27\xd6\x35\x4a\xa2\x1f\x5a\x7d\x98\xa0\xdf\x17\x0d\xbb\xc9\x17\x3c\xed\xa2\xa7\xb9\x00\xbb\x66\x28\x0e\xae\x0f\xe1\x5e\x92\xa1\x89\xa9\x13\x21\x15\xad\xbb\x80\xda\xf5\x24\x4d\xff\x88\xdf\x0f\xc6\x74\xca\xde\x92\x36\x12\x7f\x3d\x8c\x4e\x77\x07\x76\x5a\x43\x70\x60\xed\x34\xa4\xa3\x2a\x7f\x53\xbe\x79\x56\xfe\xec\x6c\x87\x7f\x42\x0f\xcd\xf8\x59\x65\xe3\xb9\xda\xb0\xfb\x44\x26\x7b\x36\x0f\x12\xbf\x08\x2c\x2e\x14\x07\xd6\xae\xaf\x46\xc6\x40\x93\xf6\xf3\x46\xc1\x51\x8e\x27\x9d\x13\x9f\x26\xa5\xa7\xfa\xd2\x7d\xf1\xde\x89\xeb\x52\xaa\x29\x83\x5c\x6d\xc0\x4e\x39\x28\x0e\xac\xdd\x6b\x09\x54\x4b\xb2\xa9\xb5\x1f\x79\x6d\x5e\x73\xd3\x95\x35\xd4\x28\x44\xe6\xc4\xd7\x1e\x69\xbe\x13\xe6\xe4\x18\x7a\x7c\xa4\x17\x0d\xd3\x0e\x2a\xb1\x5e\xa6\x9d\xf4\x35\x59\x06\x6f\x0d\xab\xa5\xe3\xf1\xb6\x92\x13\xc4\xa9\x2d\xc1\x99\x44\x8d\x5f\x4d\x43\x46\x3b\xaf\x0e\x34\x03\xf9\xf7\x91\x60\xd7\x0c\xc5\x81\xb5\x5b\x8a\x45\xcd\xcc\xc0\xc5\x50\xa3\xa3\x0b\x53\x6d\xab\x79\x2b\xda\x31\x65\x32\x69\x7e\xdb\xdd\x90\x18\x6d\xcd\xc0\x47\x28\x0f\xe8\xde\x0d\xc5\xc1\x75\x28\xf1\x77\x7a\x93\x3a\xae\x12\x32\x9d\x6a\x71\xe8\x15\x73\xbf\xb2\x82\x3b\x74\xe6\x86\x93\xf3\x62\x6d\x83\x69\xfd\x71\xcf\xeb\x46\x58\x5c\x28\x0e\xac\x5d\x1d\x97\xfd\x9c\x5d\xa8\xe7\xa7\x71\x52\x4c\x5c\xf1\x98\xa0\x1f\xa5\xbf\xd1\xb8\x1c\x57\x44\x0f\xb2\x3c\x31\xd8\xb0\xb8\xee\x01\x3b\x75\xa1\x38\xb0\x76\x68\xe4\x94\x2f\xdc\x23\x82\xde\x3f\x73\x9a\xf7\x39\xcc\x3f\x2d\xee\xe4\xda\x15\x45\x6a\x56\xaa\xc3\xe3\x5c\xd3\xfd\x23\xa1\xe6\x00\x73\x68\x50\xb3\xfb\xcb\x1d\x1a\x99\x59\x84\x2b\xba\x2e\x46\xb0\x5b\x67\xee\x64\x71\x9c\xfc\xc5\x43\x2e\xcf\x76\x06\xd9\xc8\x31\xef\x9c\x24\xf7\xd6\x7b\xcf\x7e\xc1\xdc\x0e\x14\x07\xef\xd0\xec\xbe\xd5\x2e\x66\xcb\x1c\x19\x2d\x2d\x2e\xbd\xe1\x37\x36\xff\xc6\x9b\x4f\xab\xe9\x51\xfa\xe0\xf6\xa6\x5f\xe0\x74\x52\xfe\xbd\x36\x58\x64\x28\x0e\xde\xa1\x0d\xfe\x30\x61\x5c\xec\xcf\xf5\xd3\x2b\xe9\x2b\xd0\x9a\xa8\x3c\x7a\x1f\x72\xcf\x7e\xa3\x6e\x9a\xd1\x5b\x79\x11\xd9\x92\xaf\x81\x1f\x16\x19\x8a\x0b\x92\xfe\x9f\xb9\xdf\x3f\xd6\x6d\xff\x6d\x3f\x34\xac\x0a\x6d\xba\xdc\xef\x42\xfb\xdb\x6a\x22\x68\xea\xe7\xf1\xf7\x8f\x68\xc3\xd8\x05\xaa\x34\x5d\x1c\xe3\xfe\x8c\x89\x55\x1d\x96\xff\x3d\x05\x8d\xfc\xf3\x95\x7c\x86\x81\xc2\xe0\xfc\xf8\xa3\xab\x63\xde\x23\x13\x1c\xdf\x37\x6a\x7e\x1d\x78\xda\xdc\x77\x98\xb2\x8f\x3d\xf4\xff\x76\x46\x0d\x1b\xde\xe4\xbd\x25\xf9\x16\x83\x53\xbd\xb2\x44\x1b\xa8\x58\x6c\xba\x1a\x04\x66\x48\xfa\xf7\x05\xa3\x25\xd3\x0d\xe7\x5a\x4d\xfe\x6b\x0e\x0d\x6a\x68\x7f\x9f\x43\x83\x73\x68\x76\xf4\x0f\xe2\x13\xde\x3f\xbb\x66\x14\xd0\x5d\xa1\x94\xdb\xd2\x34\xaa\xb0\x8a\x5e\x75\xdf\xd9\x8f\xf3\xd5\x88\xf3\x14\xee\x97\xc4\x2b\x59\xde\x81\x77\x68\x15\x2a\x0f\x6f\x7d\x50\x61\x40\x0e\xfb\xf2\xec\xc7\x45\x18\x2e\x17\x41\x46\x0e\x81\xdf\xbe\xee\x20\x2f\xcb\xc9\x11\xaf\xe0\x80\xc2\x95\x2c\x66\xc1\x3b\xb4\x69\x3e\xd7\x89\xbe\x89\xbb\x09\xed\x84\xdd\x41\x59\x7f\x6e\x62\xbc\xc2\x65\xa5\xf4\xf9\x56\xff\x32\x97\x06\x6b\x02\x69\x76\x9d\xea\x4a\x46\x0b\xef\xd0\x4a\xab\x50\x47\xf9\xf3\x77\xb7\xe4\xca\xdb\xbe\xd3\x71\xfe\xea\xba\xbe\xa6\x2e\x9f\xbb\x16\x7c\x7e\xff\x96\xa8\xa2\xad\x8a\xe8\x95\xf4\x16\x10\x87\x77\x68\xbf\x9c\x2a\x4e\x6a\x51\xc8\xb4\x2b\xe8\xda\x4b\xde\xb9\xdb\xaa\x85\xe5\xb1\xe7\x4e\x7c\x79\xd7\x94\x9e\x89\x26\x27\xeb\xa2\x91\x7c\x65\x0e\x0d\xea\x26\xba\x34\x63\xb5\xf9\x8f\x3c\x28\xa9\xea\xf7\x79\x14\xe4\x78\x3e\xd6\x35\xa9\x3c\x96\xf6\x24\xc3\xa4\xbd\x68\xf7\x5d\x05\x3b\x91\xa8\x24\xd0\x59\x1a\x8a\x83\x3b\x53\xe1\x66\x9c\xfd\x2c\xae\x8e\x42\xcd\xfe\xb9\x0b\x7b\xa3\x31\x11\x86\x44\xae\xa3\xd6\xd6\x7a\x32\x5b\xdf\x80\xfc\xd8\x9f\x48\xa0\x83\x27\x14\x07\xce\x58\xe3\xb5\x17\x8f\xd1\x28\xc8\xb8\x69\xd3\x70\x95\xad\x90\xf9\x3e\xb7\x26\xe3\x15\x11\x9b\x76\x3d\x18\xf1\x67\x5d\x92\x42\x2b\xdc\x82\xc5\x85\xe2\xc0\x9d\x36\x63\x17\xd9\xb7\x72\x52\x5b\x02\x36\x46\xb7\x3e\xe7\xfa\x97\x91\x5b\x5e\x74\x78\x49\x39\xaa\x8b\x9a\xe3\xeb\xdb\xcc\x3e\x91\x15\x83\xc5\x85\xe2\x82\x24\x11\xff\xf1\x3f\xc4\x53\x8c\xab\xd3\xf5\x32\x46\xe5\x58\x20\xb6\xc9\xec\x2d\xb0\xbf\xc4\xd1\xb2\x5f\xe4\x4d\xa2\x3e\xf2\x3b\x96\xf4\x4e\x55\x05\xaa\x7e\x43\x3d\x89\x97\x69\x77\x36\xfa\xe7\xb9\x56\xc9\xfd\x42\xee\x16\x39\x2c\x96\x95\xbd\xf1\x04\x26\x5f\x5d\xd7\x2a\x61\x52\xc6\x8a\x53\x0d\x86\xfd\xc3\x21\xd8\x35\x43\x71\x60\xed\x02\x85\x98\xae\x1f\x98\xf3\xf5\x76\x65\x48\x16\x31\x47\x6a\xd4\x7d\x88\x27\xc1\x1e\xc9\x0e\xf4\x8b\x2b\x1a\x35\xda\xf9\xfe\x04\xa8\x29\x07\xc5\x81\xb5\x5b\x08\x34\x7d\x7d\xdd\xed\x2c\x6f\x52\x4c\x73\x23\x70\x6d\x15\x7f\x81\x7a\x46\x7d\xf8\xc4\xeb\xc1\xee\xe4\x42\x9a\xd2\x3b\x14\x60\x06\x0a\xc5\x81\xb5\x13\x36\x69\x67\x70\x7e\x85\xaa\x9a\xe0\x8f\x55\x38\xdc\xb6\x47\xf3\xaa\x6b\xbc\xfe\xa3\x8f\xbc\x17\xa6\x1b\x6f\xe4\xf5\x6a\x0b\xa0\xea\x37\x14\x07\xd6\xce\x5b\x97\xc0\x2b\xc3\x12\x53\x34\xbd\x7d\x78\x23\x9d\xd5\x4f\xe7\xad\xf0\x74\xe7\xc6\xa8\xfb\x32\x9f\xec\xd6\x8f\x87\x4b\x2e\xd2\x30\xed\xa0\x5e\x67\x97\x69\x97\xd5\xe2\x65\x44\x79\x9d\xdd\x9e\x81\x43\xea\x65\x8c\x90\x5e\x16\xb1\x9f\xb1\x86\x70\x83\x57\x43\x0d\xa5\x6d\x22\xa2\x60\x0c\x50\x01\x00\x8a\x03\x6b\x27\xb6\x31\x16\x58\xf6\x9d\x70\xd7\x4d\xaa\xa3\x5a\xe7\x65\x3b\x63\x0b\x09\xeb\xfe\x4a\xfc\x23\x05\x7e\xe3\x9c\x95\x49\x01\x5f\xa0\xda\x04\x14\x07\xd6\xce\x82\x27\xe8\x4b\x81\xa2\xce\xfa\xef\xb7\x8b\x9f\x51\x4e\xbd\x6b\xc7\x74\xe2\xad\x2e\x6e\xe4\x34\x86\x44\x49\x63\x89\x21\x0e\x06\x01\x5f\x30\x20\x38\xb0\x76\x6a\xbd\xda\x24\xd6\x29\x87\xb6\x7c\xbd\xf5\x89\x14\x8d\xc5\x8d\xe3\xa4\x98\xe4\x9e\xf2\xcd\x88\xdf\xb1\xda\x9e\xcf\xb7\x9a\x08\x01\xe7\x6c\x20\x38\xb0\x76\x4f\x76\xd1\xdc\x8b\x5d\x57\x2d\xbb\x07\xa6\x0e\x62\x05\x03\x18\x42\xf5\xe5\x15\xdf\xb4\x8e\x87\xbb\xc6\x1c\x1b\x15\x95\x15\xbe\x82\x69\x07\x95\x13\x2e\xd3\xce\xee\xf1\x84\xda\xf5\x37\x1e\x8f\xc8\x8e\x76\xd3\x8c\x8a\x7a\x64\x92\xa2\x9f\x6c\x1b\xa0\x9e\xdc\xcf\x2c\x8d\xcd\x94\x8d\x13\x07\xce\xce\x41\x71\x60\xed\x6e\xd9\x8c\xca\x28\x52\xad\xf8\xfd\x21\x62\xdf\x34\xe4\x25\xbe\x4e\xd8\x65\x8f\xa8\x44\x6f\xd1\x71\x9f\xde\xfb\xf4\xda\xc0\x11\x02\x2c\x2e\x14\x07\xd6\x6e\x7a\xee\x49\xa4\xac\x60\xea\xae\xbe\x2c\xea\x12\x52\x9a\xb9\xd8\xa7\x77\x5e\x3d\x56\x1e\xaf\x7d\xeb\xa8\xdd\x05\xeb\x93\xf4\x48\x61\x71\xa1\x38\xb0\x76\xc7\x5a\x12\x0f\x65\x27\x88\x5e\xb9\x8a\x3d\xc5\x91\xfd\xb4\x40\x9e\x22\x1d\x75\x5a\x3b\x90\x55\xf8\xbe\xea\xac\xb7\x8e\xb6\xc4\x0f\x16\x17\x8a\x03\x6b\x17\xa8\xad\xad\x6b\x5d\x2b\xed\xf2\x3b\xfa\x7d\x82\x6d\xe8\xc5\x07\xce\xb7\xf2\x18\xce\x08\x7a\xeb\x06\xed\x83\x8b\xe3\x29\xa2\xda\x30\xed\xa0\x12\xeb\x65\xda\x11\x8c\x90\x60\x78\x05\xde\xa2\x90\x64\x63\x76\x1e\x62\x96\xd5\x89\x78\x9a\x41\xc1\x4d\x7c\x14\x75\xa3\xa3\xf2\xd9\x8a\x29\x29\x70\xde\x18\x8a\x03\x6b\x57\x75\x78\xb1\xce\x98\x37\x37\x58\xd1\x6b\x50\xe7\xf4\xa6\x2f\xdd\x58\x55\xc6\xb0\x52\x0d\xa9\x30\xbe\x0a\x7d\x69\xc3\x2c\x11\xd8\x83\x01\xc5\x81\xb5\xbb\xf1\x8a\x5a\x25\x57\x9a\x5b\xbd\xda\xd7\x79\xce\x41\x93\x6b\x52\x86\x0a\x7f\x83\x8e\xad\xaa\x73\x92\x31\x28\xb3\x62\x26\x04\x19\x16\x17\x8a\x03\x6b\xa7\xdc\xe1\x29\xc5\xa7\xe9\x82\xa4\x4d\x97\x91\xed\xeb\xfe\x85\x39\x13\xb5\x2a\x23\xf0\xc9\xfd\x93\x96\x37\x5a\x6b\x8b\x28\x6a\x40\x4d\x4b\x28\x0e\xac\x1d\xcf\xd7\x1a\xbb\x2a\x2c\x27\xe7\xc0\xa4\xb2\xf4\x5b\x59\x5f\x9f\xa0\xd5\xbd\x96\xb0\xc2\x3f\xbd\xa5\x1f\x61\x23\xed\xe9\xae\x96\x0f\x73\x68\x50\xb3\xfb\xcb\x1d\x1a\xd2\x17\x56\x94\x12\xaa\xa2\xc6\xdb\xee\x17\x5d\x5c\xaf\xa7\x26\xf4\x76\xb5\x22\x3a\x83\xab\x8b\x8b\x3d\x5f\x4b\xaa\xf1\x97\x5c\x83\xb9\x1d\x28\x0e\xde\xa1\xf9\xa8\x79\x3e\xc3\x4c\x19\xfc\xff\x98\x7b\xcb\xa8\xaa\x9e\xf7\xef\x1f\x91\x92\x14\x10\xa4\x5b\x4a\xe9\x0e\x01\x91\x90\x96\xee\x4e\x05\x91\x2e\x45\x29\x41\x91\x96\x10\x10\x05\x24\xa4\x1b\x41\x04\x14\x94\x94\x92\x94\x0e\x09\x01\xe9\x06\xe1\xbf\xbe\xbf\xff\x7d\xf6\xf2\xb3\x0f\xf7\x6f\x3e\xf7\x5a\x3c\xf8\x3e\x7f\xad\xeb\xcc\xec\xf7\x9c\x7d\xcd\x7b\xcf\xcc\x35\xb6\xc6\x94\xbc\xd7\x45\x07\x9e\x32\x5a\xef\x8b\x8d\x64\xbb\x60\x1e\xfa\x12\x09\x1b\xa0\x7d\xe8\xe0\x41\x44\x06\x71\xc8\x0e\x6d\x9e\x86\xc0\xfc\xe1\xbb\x31\x6e\x2a\x13\x1e\x92\xa8\x4b\x9f\x3f\x33\x1d\x26\x2e\x10\xd0\x6c\x56\x7f\x97\xda\xa0\x76\xd4\x7b\x27\x86\x88\x0c\xe2\x02\x65\x50\x50\xfe\xf9\xac\xff\xf5\x7d\x68\xed\x33\xcf\xa9\x50\xd2\x65\x58\xcb\x27\x48\x9d\xf4\x7f\x2e\x1c\x39\x2b\xd9\x67\xd9\x68\x88\x7e\x28\xea\xbd\x71\xf0\xd6\x32\xdf\xfe\x6f\x87\x16\x7c\xe1\xae\x68\x0d\xb7\x57\xe1\x2c\x73\xcb\xcd\x34\xf1\x3e\xcf\xe4\xb0\x83\x1e\x4c\xd5\x77\xfd\x96\xc2\xc1\x93\x73\xf7\xf0\xff\xae\x59\xa8\xf7\xa3\x7f\xd9\xdb\x30\x43\x48\x2c\x37\x56\xbc\x21\xb4\xc8\xaa\x05\x53\xd4\x33\xa9\x3c\xfd\x17\x73\x26\x01\x6a\x48\x40\xec\xe3\xff\x36\x87\x06\xea\xda\xdf\xe7\xd0\x90\x1c\xda\xdc\x3b\xfb\x07\x93\x82\xf9\x58\x5d\x14\x44\x94\x8e\x49\x94\x4a\x09\x89\xc7\x06\x64\xb5\xe7\x38\xc8\x6a\x9d\xf0\x19\xed\x9a\x9e\x9c\xc9\xf2\x8e\x00\x92\x79\xd8\xe2\xb7\x5d\x8c\xcb\x1a\x5c\x0b\x40\xd3\x2a\xc9\xb6\xdb\x53\x99\xe2\x93\x20\xfc\xe6\x25\xcf\xe4\x4f\x4f\xd0\x4e\x3e\x96\x99\x76\x26\x8b\x59\xc8\x0e\xed\x28\x62\xe1\xfa\x14\xe5\xfa\x28\xcd\xc1\xcf\x1d\xea\x06\xbd\x7e\x1e\x45\xfd\xdb\x4f\x33\xdf\x4a\xf1\xea\xe2\x25\x4c\x2f\x2a\xdf\x39\x93\xde\x1a\x21\xfd\x6c\xe0\x17\xf9\xd1\xb7\x44\x04\xc1\xba\x34\xc4\xf5\x64\xfe\x3c\x07\x26\x86\x73\x4f\x27\xcb\x7a\x76\x2a\xf6\x38\xad\x64\x2f\x54\xe6\x9f\x49\x6f\x91\x1d\xda\x13\xdc\x7b\x1d\xac\xc6\xa4\xb6\x0c\x5b\xdf\xc2\x46\x92\xf6\x85\x49\xa4\x32\xa5\x2c\xbb\x6c\x87\x74\x32\xe6\x13\x0f\xbe\xf4\x12\x9c\x99\x43\x03\x0d\xa2\xd3\x32\x56\x4c\xcd\x6a\x62\xca\xbd\x88\x44\xe1\xaf\x61\xf8\x8d\x2f\xf9\x0e\xf8\x1b\x4d\x44\x71\x6b\x9d\x38\xfb\x93\x57\x30\x74\x5c\xd0\xa1\x7d\xf9\x20\x0e\x9e\xb1\x3c\xc6\x64\xaf\x13\x84\x2f\x1c\x50\xef\x34\x5d\x2d\x89\x9e\xc9\xcb\xcc\x44\xa1\x7c\x64\x1a\x53\x5d\xcc\xba\xf2\xe8\x0b\x8e\xb8\x36\x22\x2e\x88\x83\x67\xac\x93\xf0\x3a\xc3\x34\xbc\xe1\xa4\x2b\xaa\x71\x57\x9a\x38\xfc\x0c\x63\xbe\x29\x2f\x50\xe8\xf8\x3f\x57\x08\x35\x76\xcc\x8a\xe7\x85\xee\x22\x02\x71\xf0\x8c\xe5\x6b\x5a\x14\x20\xf6\xfa\x09\xd5\xe0\x7e\xd5\xa3\x8b\xd1\x5e\x8f\xb2\x2a\xc3\x99\x2d\x30\x62\x1d\x3b\xa3\x13\xbe\x3a\x28\x11\x40\xb7\xc5\x82\xb8\x40\x69\xac\x7f\xee\x42\xb7\x26\xeb\xf3\x4f\xb2\x2e\x8b\xd9\xde\xfa\xe8\x33\xcd\x55\xa1\x7d\x7e\x10\x35\x99\x2b\xff\x5c\x82\x6e\xf9\xd6\x8b\x63\x16\x68\x96\x0f\xfa\x27\x9e\xa6\xdd\xab\x1c\x41\xa1\xab\xf8\xd7\x94\x85\xe6\x0c\xe7\xfe\xc4\xf3\x1b\x14\xdd\xaa\xe7\x8a\x0d\x7d\x5a\xa9\xf6\x72\xd7\x90\xb0\x33\x47\x01\xd1\x66\x10\x07\xd7\xae\xa2\xa3\xe5\x1a\x43\xff\x67\x6a\x77\xf5\x0f\x56\x6f\x9f\x9b\x97\x24\x56\xb2\xfe\xa9\x4b\x3c\xa8\x54\x13\x0f\x6b\x1d\xaa\x94\x85\x6e\x31\x07\x71\x48\x0e\xed\xf2\x56\xdb\x67\x4e\x8d\x37\x43\x57\x36\x03\x4f\xca\x23\xc3\x18\x24\x36\x12\x24\x56\xd7\xe7\x9d\x13\x94\xd2\x2c\xfb\x9f\x43\xf5\x32\x41\x1c\x5c\xbb\x8c\x35\x2b\x8c\x60\x9f\x24\x9f\xef\x83\x78\x69\x35\x0f\x46\x72\xab\x36\x06\x39\x73\xbf\x76\x31\xf0\xf9\xbb\xe9\x0d\x7c\xd0\xfd\x06\x9d\xd2\x07\x70\x70\xed\xec\x79\x7a\xce\x8f\x89\x47\x92\x3a\xd9\xcc\x37\x2d\x5f\x91\xfd\xc3\xf6\xe8\xbe\x62\x41\xfb\xea\x74\x92\x04\xbe\x95\x5f\xf8\x8f\x0c\x84\x76\xa0\xd7\xd9\xa9\x5f\x46\x28\xe8\xb0\x23\xdc\xf8\xd1\x9d\x71\xf6\x5b\x8f\xcf\x57\x0b\x54\x50\xee\x8d\x8c\xe6\x1c\x7d\x8b\xef\x19\xe4\xbc\x88\x19\xc8\x07\x7d\x19\x01\x70\x70\xed\x0a\x4a\xb9\xf6\x2a\xfe\xa4\x6e\x8b\x9f\x48\x10\xc9\x97\xbf\x2e\x26\x5c\x26\x93\xd0\x99\x17\x72\xc6\x7e\x71\xd5\x39\xb8\x95\xba\x19\x11\x17\xc4\xc1\xb5\x5b\x2b\x54\x56\x90\xab\xd6\xf2\x65\xcb\x94\x7d\xec\xeb\xa3\xbf\x73\x62\xf0\x2d\x92\xd7\xe3\x65\x06\xf7\xd6\xc8\xf0\xf5\xed\x20\xc8\xb5\x83\x38\xa4\x59\xbe\x79\xd5\x77\x4c\x56\xb3\xef\xb7\xc3\xb4\xaf\x91\xce\x7c\xb5\x6c\xb9\xbf\x88\x95\x9b\xf9\x3b\x7d\x4b\x30\x6f\x25\x7c\x9c\xa8\x00\x9a\xe5\x03\x38\xb8\x76\xab\xe3\xb8\x6a\x65\xe3\xdb\x78\x9f\x94\x07\xac\x9b\xe4\xd1\x6c\x1d\x7c\x6f\x26\x99\x0f\x13\x93\xa6\xf8\x52\x78\xd6\x2b\x94\x8f\x22\xb4\x03\xe5\x84\xd3\xb4\xab\x5e\x89\xe1\x9e\x8e\xe1\x60\xd2\xc3\x9e\x4f\xa5\x1a\xb9\x9c\x41\x37\xc5\xe6\xc8\x3f\xb0\x60\x74\xc8\x93\x99\xa7\x38\xf7\x05\xba\x1b\x0e\xc4\x21\xdd\x14\xbf\xd1\xc0\x6c\x4a\x3a\xce\x32\xef\x9d\xf8\xfc\x11\x35\x9f\xf5\x05\x63\x0c\x05\xc1\xd4\xa8\x29\xfb\xd7\x4d\xd2\x9a\x5a\x9c\xf8\x50\x9d\x41\x00\x07\xd7\x0e\x93\xfc\xf5\xdb\xe2\xe3\x94\xda\x6d\x89\xaf\xe8\xce\x8c\x7c\xda\xf3\x83\x2d\xd6\xbb\x45\x12\xdb\x28\xb8\xce\x92\x59\x98\xad\x50\x7d\x4f\x10\x07\xd7\x2e\xaf\x0e\xcf\x96\x6f\x50\x76\xc8\xfc\xcf\x84\xde\xe2\xae\xc9\x8a\x22\x26\x13\xa1\x7a\x78\x2f\x6f\x8f\x32\xca\x27\x49\xe1\x66\x68\x37\x34\x88\x83\x6b\xa7\xab\x87\xea\x27\x96\xf5\x6a\x9d\x5c\xa9\x34\xff\xf6\xce\xa3\x97\x38\x76\x8f\x3e\xb0\x3e\x7d\x81\xe6\xfa\x85\x81\x29\x6d\xe8\xc2\x37\xa8\x52\x08\x20\xb1\x9e\xa6\x1d\x55\x5c\x75\x1c\x8a\x9a\x70\xfd\x3d\x03\xd4\x7a\xd3\xf3\xe5\x1e\xf9\x21\x77\xf6\xfd\xc6\xc4\xf6\x03\xaa\xc8\x6f\xb0\x89\x6c\x97\x21\xda\x0c\xe2\xe0\xda\x25\x2b\x72\x59\x0c\x98\xde\xe9\xef\x6e\x12\x8c\xa7\x29\xa0\xfd\xe8\xc5\xe9\x75\x25\xb8\x5e\xe7\x07\x87\x49\x80\xe4\x4f\xaf\x32\xa8\x42\x0f\x88\x83\x6b\xb7\x9d\xe2\xa3\xc2\x74\x4c\x36\x30\xcb\x8e\xe7\x42\xd8\xfe\xc1\x51\xeb\x2d\xd5\x5d\xb4\x5f\xbf\x47\xd2\xad\xa2\xab\xca\x2e\x62\xa3\x21\xe2\x82\x38\xb8\x76\x86\x0d\x24\x6e\xe2\xd8\x45\xb6\xe8\x14\x73\x0e\xf8\x51\x58\x24\x71\x2f\xef\x2b\xb0\xd1\xbc\x16\x7d\xe1\xc5\x7a\xe7\xf6\x0c\x31\x35\x22\x2e\x88\x83\x6b\x37\xc6\x67\xea\xb1\xb9\x42\xba\x63\xed\x27\x3a\x68\x84\x8f\x42\x3e\xe4\xe9\x65\x98\x19\xba\x31\x7c\x52\xef\x14\x5f\x40\x22\x37\x80\x70\x68\xa0\xd9\xfd\xe9\x0e\xed\xc4\x97\xa3\xcb\xd6\x59\x3c\xc8\x61\xab\x24\xb4\x40\x6d\xbb\x3f\xe4\x83\x8f\x81\xe0\xcd\x74\xec\xc4\x42\x3d\xbd\x5f\xe2\xf2\x85\x08\xb7\x03\xe2\x90\x1d\x9a\xc4\x84\xd9\x88\xc0\x52\xbc\x13\xed\xe3\x51\x52\xd1\x1f\x14\x69\xd6\x24\xc7\xfd\x07\x8d\x42\xaa\xca\xf1\xb9\x94\x1f\xf7\xc5\xfb\x11\x91\x41\x1c\xb2\x43\xdb\x3a\x0e\x35\xe8\x60\x9d\x93\xc4\x16\x0e\xea\xde\x9c\xd2\xbd\x58\xf1\x91\xfe\x28\x30\x09\x2b\x91\xf9\xfd\x3d\xbb\xaf\xeb\xfc\xd0\x39\x34\x10\xf7\x1f\x87\xf6\xcf\xb1\xfc\xaf\xef\x43\x5b\xdc\x35\x55\xfe\xa4\x57\x76\x6c\xe3\xa7\x3e\x62\x42\xca\x20\x42\x3c\x49\xc9\x4e\x72\x97\x8c\x58\x8c\x5e\xb6\xc4\xf5\x4d\x77\xe2\xdf\x0e\x2d\x34\x04\xc5\xfa\x68\x18\xbf\x2e\xab\x76\x41\x4b\x78\x42\x99\x57\x1a\xd7\x71\xd1\x33\x50\xa3\xba\xd7\x36\x93\xc0\xe8\xed\xea\xdf\x13\x5b\x19\xb5\x01\x23\x5f\x22\x43\xc3\xdd\x7a\xf6\x4b\x95\xe8\xf8\xdf\xb6\x42\x2f\x1d\xab\xd6\xad\x34\xa2\x37\x17\xd7\xde\x17\x21\x7c\xfd\xdf\xe6\xd0\x40\x5d\xfb\xfb\x1c\x1a\x92\x43\xbb\xbc\x2e\xec\x6e\xf8\x33\xc0\xce\xda\xd3\xc1\x8a\x95\x1c\xbd\x3f\x24\x95\xa9\x5a\x7a\x46\x77\x31\x91\x83\x2e\x90\x5b\xc7\x22\xfb\x4c\x96\x77\x90\x1d\x9a\x26\x8d\x15\x83\x2e\x9e\xf0\x3e\x7e\x45\x40\xb0\x25\x2f\xc3\xd4\xca\xb2\x42\xb4\x8a\x7a\x04\x61\x7d\xfe\x7b\x3f\xfa\xab\x17\x1b\xce\x64\x31\x0b\xd9\xa1\xb1\xf3\x7c\x7a\xe0\x6c\xb8\xaa\x8d\xcd\xcc\x99\x45\xf2\x6c\x67\x53\x7a\x29\x33\x2c\x6e\x9a\x4c\xa5\x83\xb4\xaf\x21\xe9\x23\xdb\x8f\x33\xe9\x2d\xb2\x43\xe3\xfa\x95\x60\xcc\xcd\x1e\xc8\xf5\xfe\xd6\x35\x9a\x5c\x8b\x2b\x01\xf4\xd9\x3f\xc4\xf4\x29\x66\xb1\xc6\x0f\xd2\x99\x2e\xe8\x0b\xdf\x3d\x93\xde\x22\x3b\xb4\x38\x4a\x5f\xee\x35\xad\x9c\xf9\xe6\x75\x0b\x17\x15\xc6\x65\x92\x32\xd3\xe0\x78\x86\x83\x0e\x25\x27\xbc\xa7\x53\x29\xdc\x06\xb9\x67\xe6\xd0\x40\x83\xe8\xd4\x59\x3e\x87\x32\xee\x52\xfe\xcd\x1d\xfa\x7c\xb1\xed\x4f\xef\xf0\xa8\x64\xd2\x8c\xa7\x1f\x94\x39\xbc\x62\x98\x9d\xff\xae\x35\xde\xf5\x1e\x9a\xe5\x03\x38\x78\xc6\xfa\x7e\x25\x67\xb0\x9f\xe7\x8b\x4b\x63\x37\x59\xdd\x5d\x12\xc2\xee\xb9\xfd\x2c\xd6\x78\x77\x3a\xff\x37\x83\xe2\xfa\xa3\xef\xce\x97\x40\xa7\xe9\x01\x1c\x3c\x63\x79\x99\x4c\xaa\xa7\x3f\x1c\xb9\xff\xbe\xbd\x70\xa6\x64\xfd\x93\x4e\xa2\x4d\x9e\x01\xc5\xad\x69\x4e\x6f\x3e\xb6\x3a\x82\xe9\x56\x3d\x44\x5c\x10\x07\xcf\x58\xde\x97\x8d\x14\xf2\x33\xa9\xdf\xba\x1a\x7c\x3e\x59\x8e\xf7\xa8\xd1\xfd\xb1\xb4\x81\x66\x66\x50\xfb\xc0\xd7\xc8\x3e\x40\xb4\x09\xaa\xad\x07\xe2\xe0\xcf\x01\x87\xe6\x53\x6d\xf8\x93\x27\xc9\xf2\x14\x5f\xa9\x30\x7e\xf7\x4a\x3f\x9a\xd5\xca\xe2\x62\xbb\x36\xe1\x6e\xfb\xf8\x92\xee\xc8\x03\x68\xb6\x01\xfa\x27\x9e\xa6\xdd\xa4\x12\x05\x4f\x80\xd3\xb5\xf4\x0c\x97\x4e\xb5\xf2\x41\x13\x8a\x80\xc4\xa4\xbc\x8e\xbd\x73\x5a\xef\xb0\x8f\xbc\x53\x6e\xd4\xaf\x41\x75\x2d\x01\x1c\xbc\xcd\xaf\x92\x08\xc3\xe5\x8a\xbf\x8a\xb6\xa2\xd3\xb4\x95\x4d\xed\x04\x86\x36\x6e\xe4\xb1\xcb\x78\x51\x46\x74\xea\xdc\xca\x67\x1e\x84\x76\x2f\x81\x38\xb8\x76\x1e\x57\xe7\xdf\xf8\xe3\x3a\xb5\xfd\x34\xc5\x33\x13\x96\xd7\x7d\x66\xf4\x43\x3d\xfb\x30\xe0\x01\x85\xc5\x50\x55\xdf\x14\x96\xb6\x05\xe4\xda\x01\x1c\x5c\xbb\x67\xa9\xdd\x93\x9c\x41\xc4\x6c\x59\x19\xd5\x4f\xd5\x43\x06\x4d\x22\x4d\x84\xbf\x4f\xa5\xe9\xbd\xb2\xf9\x19\xc5\x5a\x35\xe4\xfc\x0a\x11\x17\xc4\x21\x9d\x2d\x49\xb5\x8d\x29\xc7\xba\xf2\x75\xfe\xe3\xf4\x58\xab\xde\xf4\xfd\x71\xba\x0b\x81\x7b\x04\xe2\xb3\x85\x9e\xe5\x9f\xdc\x6e\x28\x74\x20\xb4\x03\xbd\xce\x4e\xd3\x2e\x78\x29\x8e\x1a\x1d\xff\xda\x6f\xc1\xad\x47\xd3\xe6\x7a\x16\x76\xe1\x97\xda\x85\xed\x98\x28\xb0\x1e\x0f\x77\x3c\x5a\xc3\x66\x5f\x82\x2a\x0b\x00\x38\x78\x9b\x8b\x7f\xc5\x6e\x65\x71\xf9\xd7\x28\x8f\x25\xd3\xa2\x05\xac\xea\x1b\x10\x98\x1b\x8f\x6a\x94\xcf\xa1\x55\x76\x49\xba\x4e\x59\x42\x55\xfc\x41\x1c\x5c\xbb\x8e\x6c\xb7\x77\x29\x05\xc5\x0a\xdc\xaa\xf9\x52\xa1\x61\x25\xc3\x3f\x5e\x2e\xd2\xd7\xa9\xbc\xc7\x1b\x11\x11\xf3\xba\x37\x2e\xa8\x09\x9d\x39\x02\x70\x70\xed\xc2\x36\x51\x0e\x98\x65\xad\x59\x18\x30\x19\xd3\xec\xbe\xf8\x85\xbc\xa0\x36\xc0\xc1\x79\xd0\x2c\xd4\x2e\xcb\xe3\x81\xf7\xc8\x7f\x03\x11\x17\xc4\xc1\x9f\x43\xcf\x67\xd3\xc2\xa3\x1b\xfb\x6a\x89\xb7\x69\xf2\xea\x08\xaf\x51\x37\xdb\x6e\xf5\x50\x9f\xf4\xfc\x22\xda\xb8\xf5\xd6\xed\xd1\x03\x68\x97\x23\x28\x27\x9c\xa6\x1d\xaf\xd4\x8b\x41\xac\x20\x3e\x3d\x1f\xb4\x3e\x53\x22\x6d\xc5\xd2\x17\xf3\x37\xf5\xf9\x50\x1a\xc9\xdb\xdc\xfb\xd1\x43\x0a\x7e\xdd\x45\xb4\x19\xc4\xc1\xdb\x4c\xe0\x79\x7e\xe6\xa7\xe4\xec\x8b\x5b\x7d\x69\x61\xda\xe4\x75\xe4\x22\x54\x47\xbf\x95\xfd\xbb\x2e\x35\x77\xac\xd3\xa1\x0c\xaf\xff\x46\xc4\x05\x71\x70\xed\x64\x02\xf2\x95\xbb\xdd\x8e\x69\x03\xaa\x4c\xe8\x47\xa9\xdd\x87\xc4\xc2\xa2\x22\xfb\xd7\x84\x2a\x33\x30\x0d\x5b\xb3\x3d\xc9\x32\xa1\xaf\x01\x00\x0e\xae\x9d\xa2\x94\x73\x7c\x44\xd0\x53\x3e\x81\x2b\xe7\xc2\x17\x0b\x6a\xea\x92\x8c\x12\x94\xac\x2d\x59\xc2\x6b\x2b\x44\x9e\x5a\xad\x34\xe2\x40\x55\x5e\x00\x1c\xfc\x39\xf8\xd9\xcb\x85\x3d\xac\x63\xa3\xcf\x55\xe4\xbd\xf0\x53\xfa\x53\xe0\x96\x71\xfa\x85\xa8\x0b\x28\x03\xcd\x9e\xbe\x77\x69\x3b\x38\x6e\x22\xb4\x03\x25\xd6\xd3\xb4\xcb\x68\x9d\x51\xfd\xed\xd0\x9c\x28\x2c\xfe\x59\x75\x2c\x68\xdf\xa0\x47\x4c\x95\x10\xe3\xf1\x8c\x20\xb6\x1d\xa7\x89\xb5\x82\x15\x74\x66\x15\xc4\xc1\xdb\x6c\x93\x6d\xbe\xbe\xa8\xdf\x71\xd2\xbb\x4a\xba\x41\x6b\xcd\x44\xce\x56\x7c\xbb\x29\x69\x46\xce\xee\xc3\xb8\xec\x5c\x96\x33\x36\x54\xbb\x18\xc4\xc1\xb5\x93\x58\x12\x88\x5c\x97\x43\x55\xbd\xff\xc8\xf7\x3c\x06\x2a\x7e\xaf\x4a\xc6\x18\x3b\x5a\xe9\x00\x59\x79\x4a\xd0\x8b\x86\x24\xee\x3c\xe8\x7c\x1b\x80\x83\x6b\x27\x18\x18\xc0\x8d\x4b\x97\x27\x81\xaf\xc3\x59\x1c\xbb\x80\x5a\xf5\xd1\xc2\x73\xcd\xa4\x35\x2f\x23\xf7\x48\x4d\x3d\xa7\x67\x07\x7a\x67\x82\x38\xf8\x73\x10\x60\xe0\x17\xe1\xd8\xa5\xbe\xfe\x80\xed\x72\x7b\xe8\xa0\x8e\xbd\xc8\xf7\xb2\x59\xe6\x73\xed\xd5\xa5\x06\x1b\x2c\xc4\xf7\x96\xd9\x10\x0e\x0d\x34\xbb\xff\xbf\x9c\x43\x63\x67\x12\x36\xdd\x66\xbe\x11\xdd\xca\xeb\xa5\xa9\x95\x18\x47\xa4\xd7\x98\xf1\x87\x1c\x8d\x30\x21\x8c\xda\x96\x32\xee\xc2\x11\x74\x0e\x0d\xc0\x21\x3b\xb4\x16\xcb\x40\x5b\x61\x87\xb1\x99\x12\x95\xa7\x1a\x8e\x07\x5f\xf0\x62\xee\x6e\x28\x2a\x57\xc9\xda\xb2\x65\x35\x96\x4f\x64\x17\xbf\x46\x44\x06\x71\xc8\x0e\x4d\x8c\x72\x36\xba\x22\x94\xc3\x0f\xe7\x32\x8d\x5c\x81\x44\x9a\xc6\x09\x76\x57\x23\x26\x85\x49\x9d\xeb\x86\xb0\x75\x5b\xc5\xa1\x0a\x22\x32\x88\xfb\x8f\x43\xfb\xa7\x1b\xfe\xd7\xf7\xa1\x6d\xb9\x6a\xbd\x22\x34\xcc\x09\x4b\x5e\x97\xca\x09\x39\x79\x8f\xcd\xd7\xd1\x46\x62\x25\x78\x94\x8a\xae\xde\xaf\xb1\x53\x6b\xfc\xfc\x6f\x87\x46\x32\xe5\x14\x89\x19\x45\x38\x66\x60\x9e\x7f\x3f\x08\x83\xb2\x2f\x2c\x20\xd8\xe5\xd1\x4d\x4d\x4e\x2c\xee\xeb\x99\xfb\x86\xf4\x6e\x7f\xef\x03\xb9\x81\x46\x1e\x27\xf8\x38\x72\xba\xc9\x50\xaf\x99\x70\x67\xbd\x50\xbe\x47\xe8\x66\x44\xc2\x63\xa6\x49\x3e\x9a\x77\x8a\x94\x01\xff\x6d\x0e\x0d\xd4\xb5\xbf\xcf\xa1\x29\xc2\x67\xf1\xca\xd7\x5f\x0d\x99\x2b\x72\xc5\x7a\x8b\xe0\xc7\xa0\x46\x6d\xb1\x60\xfc\x42\x21\xb4\x5e\xb4\x4e\x79\xcf\x7e\x42\xef\xa5\x3d\x74\x26\xd5\xf6\xfd\x90\x1d\x9a\xee\xc7\x85\xdd\x9a\xe6\x9b\xef\xab\x2e\x78\x3f\x68\xe9\x9e\xd3\x50\x3d\x39\x6a\x58\x79\xd6\xdb\x9f\x31\x22\x20\x33\x90\x98\x10\x74\x26\x8b\x59\xea\xc8\xc6\x30\x73\xf6\x44\x45\x44\x6c\x48\x9c\xa4\x2b\xeb\x72\xad\x39\xab\x07\x26\x65\xf7\xaa\xfd\x1c\xd6\xb9\x9d\xf9\xf0\xfb\x1f\x6e\xf9\x9e\x49\x6f\x91\x1d\x1a\x69\xc8\xc1\x1a\xbd\x7a\x71\xf9\xb5\x3f\x73\x0e\x85\x3e\xeb\x9f\xbf\xea\x7f\x8a\x49\xaa\x1d\x37\x6e\x21\x19\x68\x9b\x75\xd3\x15\x3a\x93\xde\x7a\x21\xfd\x2c\x95\xfe\xa4\xf2\xdd\xa2\xca\x3c\xfb\xda\x31\x8d\xf4\x1b\xd6\x28\x19\xdf\x2d\x24\x2d\x4d\xce\x75\x3c\x2b\x22\xe4\x90\x9a\xae\xb8\x7e\x66\x0e\x0d\x34\x88\x4e\xcb\x58\xeb\x9b\xd8\xb5\x06\xba\x38\x64\x68\xfd\x0c\x2c\x55\xfb\xd6\xcd\x6c\xb3\x61\x8b\xf9\x41\xfd\x58\x5a\x8b\x64\x78\x54\x47\x46\xd0\xfa\x03\x88\x83\xbf\xa9\xf5\x86\x42\xa3\x9d\x08\xa6\xf2\xb2\x95\xdd\x42\x3f\x4d\x5d\x32\xfb\x18\x50\x9a\xde\xbd\xa5\x57\xf2\xfb\xc1\x7c\xbf\xe0\xf2\x0e\x54\x15\x02\xc4\xc1\x33\x56\xa8\xc7\xa8\x8e\x1d\xb9\xdd\x73\xaa\x42\x1b\x6a\x34\xfe\x66\x55\x95\x14\x33\x8e\x49\x26\x33\x0f\x05\xed\xf7\x2f\xef\x19\x9b\x7d\x45\xc4\x05\x71\xf0\x8c\x35\x2d\x37\x83\xcf\xce\x31\x28\xec\x63\x98\xbb\x5a\xf2\x7c\x7d\x41\x38\xbe\xe2\xd5\xc3\x37\x17\x30\xc4\x38\x1d\x8b\x8a\x73\xcd\xa1\x4a\x08\x20\x2e\x50\x1a\x05\xeb\xef\xb8\x13\x34\x31\x23\xeb\x06\x9d\x2d\x42\xb3\x6b\x63\xa9\xc4\x29\xf4\xdc\xb4\xef\xaf\xd6\x6b\x6f\xc7\xd7\xb4\x67\x14\x1e\x0e\x1a\x3d\x47\xcc\x36\x40\xff\xc4\xd3\xb4\xdb\x1d\x99\x95\xd9\xc7\x98\x46\xb7\xca\x9d\x0e\xf1\x23\xe2\xc0\x0a\x24\x5f\x5d\xdb\x42\x27\x75\x4f\xd8\xa6\x0e\xb9\x36\xed\x04\x7d\xcb\x07\x71\x70\xed\x36\x9d\x2c\x2b\x92\xdf\xdc\xb4\x31\xee\x4d\x4b\x53\xa8\x74\xb6\x39\x2c\xfb\x6e\x1f\x63\x7d\x05\xe5\xed\xf3\xc1\xac\x85\x37\xee\x83\x88\xb8\x20\x0e\xae\x5d\x1d\x6d\x61\xbd\xb1\x7c\xbd\x86\xb2\x7e\x65\xc2\x0e\xed\xad\x88\xe7\x79\x1d\x93\x2f\x16\xfe\xbc\x96\x08\xab\xa6\xa4\xf7\xbc\xec\x06\x9d\x7d\x00\x70\x70\xed\x6e\x36\xb4\x7f\x73\xfd\x53\xc6\xe3\x8c\x63\x4a\xa4\xaa\x76\xd7\x6a\xaa\x8c\xa5\xad\xb5\xd8\x98\xa6\xe4\x8e\xf5\xee\x4f\xab\x19\x68\x27\x10\x88\x83\x6b\x97\x96\x57\x74\xae\xd0\x6c\xb9\xe8\xe2\xd7\xad\x80\x62\x9e\xb4\xe4\xd2\x71\x7a\x95\xbb\x24\x79\x69\x5d\x1f\x7f\x7a\xa0\x94\xb8\x64\x43\xee\x1a\xf0\x3a\x3b\x4d\xbb\x8f\xe4\xf2\x4f\x6b\x2f\x62\xdd\x30\x8a\x57\x9f\x1d\xd4\x4c\xb8\x39\x8a\xf5\x04\x9d\x53\xe9\xb7\xc7\xb9\xb0\x9c\x2f\xdb\xe5\x32\xba\x88\x36\x83\x38\xb8\x76\xa9\xd7\xec\x5a\xed\x45\x8e\x2f\x4f\xed\x7a\xde\x8d\xef\xa5\x77\xd1\x74\x79\x46\xed\x33\xc2\xef\xe2\xfb\xb3\xd1\x9f\x83\x45\x1a\xba\xdf\x10\xc4\xc1\xb5\x5b\x34\x58\x24\x24\x6d\x39\x9a\xa3\x58\x8c\x79\x56\xad\xb9\xbc\x10\x50\xe0\xda\x57\x5a\xb6\xf5\x26\x20\x61\x9f\x52\xcb\xe2\x1d\x54\xd1\x03\xc4\xc1\xb5\x5b\x1d\xbd\x80\x4a\x7c\x78\xbb\xf5\x4b\xe4\xc9\xf4\xa4\x4d\x96\xc7\x80\xa5\x12\x21\x11\x65\xcd\x9c\xc2\x6e\xfb\x37\x77\xca\xeb\x50\xe5\x06\x10\x07\xd7\xce\x51\xa6\xc8\x82\x0d\xd3\x3e\x75\x39\x28\xda\xa0\x4e\xbd\x45\x60\x4f\x46\x46\x55\x94\xc1\xca\x8c\x38\x68\x23\x83\x5e\x3e\x5c\x15\xa1\x1d\x28\x27\x9c\x5a\xff\xd6\xb8\x55\xfa\x61\x36\x87\x6a\x60\xf6\x83\x17\xed\xce\xd2\xbf\x26\x30\x97\x1e\xda\xbc\xae\x23\x3f\x79\xb2\xf6\xc1\x17\x05\x8d\x18\xd1\x66\x10\x87\xf4\x45\xc0\x3a\x62\xe1\x43\xfa\xf5\x5c\x19\x55\x14\x49\x13\x0d\xee\x14\xf2\x5b\x25\xc5\x89\xd3\xca\x44\xf1\xd9\xb4\x4d\x51\x4a\xf3\x50\xf5\x06\x10\x07\xd7\x4e\x77\x78\xcb\x54\x62\xef\x38\x85\x0f\x27\xca\x24\xbc\xf5\xd1\x53\x6f\x69\x9f\x4c\xe9\x3d\xd9\xf7\x04\x27\xb7\x46\xd4\xab\x9f\xe7\x23\xe2\x82\x38\xb8\x76\x4a\x5a\x2b\x56\x81\x12\xb7\xc5\x49\x29\x4f\xd8\x23\x2e\x86\x9d\x13\x68\xb3\x34\x36\x09\xa2\xec\xe9\xec\xbb\xfb\x7d\xda\xfd\x3a\x74\xd6\x18\xc4\xc1\xb5\xbb\x38\xb1\x16\x92\xf5\xab\xb7\x12\x2f\xa5\x4b\xfe\x83\xfa\xcb\xbb\x74\x94\xa4\x0f\x55\xaf\x16\xae\x36\x39\x2b\x71\x88\x77\x4b\xee\x23\xb4\x03\x25\xd6\x53\x1d\x1a\x9d\xe0\x07\xd6\xde\x7c\x8e\x4c\xaa\x0e\xf1\xab\xbf\xa7\xcb\xe2\xf9\xb6\x27\x63\x37\xcb\xf0\xd9\xaf\xb6\xcd\xd0\xdf\xe3\x82\x9c\x14\x88\x43\xaa\xb6\x4f\xca\x24\xba\x65\x7c\x28\x78\x68\x1c\xc7\xb3\xc0\xb7\xfc\xe6\x2b\xb3\x41\x75\xef\xf9\xb0\x1c\xc6\x79\xa3\x3f\x8f\x2b\x95\x21\x17\x0c\xe2\xe0\xda\xb5\x1f\x15\xbc\xfd\xdd\x55\x7b\x5b\xd0\x40\x3f\x32\x35\x9a\xf2\x0e\x95\x17\x49\x72\xc3\x9a\x0a\x39\x25\x67\xf0\xa5\xb6\x75\xf7\xb7\x88\xb8\x20\x0e\xae\x5d\x39\xaa\x5a\x2e\x43\x2b\xe1\xca\xfe\x47\xed\xf1\x2b\x02\xfa\x03\xdb\xf5\x04\x5d\x2e\xc3\xfc\x2f\x93\xa3\x0f\xe5\x71\x55\x07\xa0\x77\x3c\x88\x83\x6b\x77\xa8\x1b\x41\xa2\x92\xad\x44\x65\x53\x9e\x96\xdf\x2f\x77\x9c\x74\x92\x10\x8c\x65\x43\x5a\xef\xec\xf5\xf0\x9d\xcb\x61\xce\x7e\x30\xc2\xa1\x81\x66\xf7\xa7\x3b\x34\x26\xcf\x93\x61\xd9\xf5\x76\x2d\xbc\x8e\x7e\xe5\x5b\x43\x7b\xa9\xc2\x87\x8f\xe7\x15\x6b\xac\x6b\x27\x38\x65\x33\x5c\x06\xda\x2f\x20\xdc\x0e\x88\x43\x76\x68\x83\xe4\x6b\x0c\x04\x14\x51\xc3\x72\x19\x8b\x4e\x68\xd8\x26\xaf\x6a\xa3\x17\x1d\xb0\x6e\xdc\xc1\x95\x15\x17\xc9\x12\x4f\x20\xdc\x81\x2a\x2e\x02\x38\x64\x87\xc6\x53\xe0\xbf\x67\xa1\x19\x66\xde\x40\x71\xde\xae\x8a\x45\x34\x6b\x67\xf9\x30\xd0\xf5\xb8\xe3\x62\xf9\x85\xef\x9f\x93\x6f\x47\x70\x21\x22\x83\xb8\xff\x38\x34\xba\x7f\x7e\x49\xfd\xb7\xf7\xa1\x7d\x8c\x6e\x45\x2b\x54\x5a\xdd\x5b\x67\x60\xdd\xb0\xe3\x71\x4d\x94\x65\xf0\x74\xec\xa4\xbc\x1e\x9a\x77\x51\xbd\x92\x23\x94\x81\xea\x6f\x87\xc6\x89\xf1\x8a\x5a\x24\xed\x8b\xd4\xd4\x89\xa4\x40\x7a\xff\xf0\x6f\xb7\x38\xa5\xa7\x14\xb9\xda\x5c\xd7\xbe\xe2\xb3\x08\x4c\x0c\x3e\xfd\x0b\xd5\xfe\xd4\xea\xd5\xc5\x86\x9b\xd0\x37\xd7\x74\x82\x19\x2b\xa7\x5a\xbb\x87\x5f\xd0\x81\xda\xa7\xb2\x6c\x18\x91\xa6\x6d\x75\x22\xf8\xdf\xe6\xd0\x40\x5d\xfb\xfb\x1c\x1a\x92\x43\xdb\xab\x2a\xf8\xf3\xd4\xf3\x65\xb7\xc4\xce\x4b\xd7\x54\xff\x12\x9f\xb1\xb0\x89\x86\x11\x7d\x4e\xcc\xfa\x85\x75\x91\xb4\x7b\x82\x9a\x67\xb2\xbc\x83\xec\xd0\x4c\x4c\x3a\x1f\xde\xef\x7e\xc5\x71\x83\x77\x7a\x45\x77\x40\xbc\x9f\x05\xcd\xcb\x23\x33\x72\xaa\x50\xdf\xb0\xa5\xd1\xdc\x3d\x73\xee\x4c\x16\xb3\x90\x1d\x9a\xb5\x55\xfc\x1d\xbc\xaf\x5b\xc6\xd7\x46\x15\x8d\x57\x2f\xf8\x0c\xa1\x66\xf8\xb1\xd5\x27\x1e\x61\x06\x47\x58\x49\xf8\x91\x34\x67\x9d\x49\x6f\x91\x1d\xda\x13\xd1\x88\x17\x9a\xef\x85\xbc\x0a\xb9\xdb\x12\x2e\xe0\x0f\x4d\x65\x0a\x78\x0a\xb8\x46\x4e\x4c\x48\xbd\x8d\x5a\xb9\xd6\xd1\x5a\x73\x26\xbd\x45\x76\x68\x47\x68\x0c\x09\x4c\x1a\xbf\x85\x92\x2a\x0c\x92\x97\xb9\x9f\x1a\x4e\x36\x46\x27\xfb\x77\xf4\x9a\x92\x3c\xbb\x85\x29\x8b\xfe\x32\xf3\xcc\x1c\x1a\x68\x10\x9d\x96\xb1\xf2\x12\xbe\xa9\x5b\x89\xe8\x87\xd1\x63\x53\x68\xb7\x09\x70\x10\xb0\x24\x79\x3c\x53\x23\x75\xe6\xd1\x63\xc8\x49\x76\xfa\x93\x07\x55\x9b\x00\x71\xf0\x8c\xa5\xa5\xe5\xe8\x13\xe6\x60\xea\x68\x1d\xb6\x93\xff\xf6\x9d\xe6\xcd\x1e\xa1\xc2\xec\x9e\x80\x56\x67\xa7\x09\xf2\x8b\x26\x01\x98\x95\x50\x05\x12\x00\x07\xcf\x58\x0f\x4d\x71\x71\x9e\xe7\x06\x7b\xa1\x9e\xb8\x16\x8b\x07\x6e\x4a\x29\x0f\x79\xe5\x8c\x72\xbc\x0a\xa3\xe1\x4d\x1f\xcc\xb9\x91\x96\x0d\x9d\xd2\x07\x70\xf0\x8c\xc5\x42\xc3\xf1\xb4\x3d\x22\x0c\x35\x46\x88\x29\xa4\x64\x94\x77\xb5\xc3\xc2\x4c\xa1\xa9\xd1\x50\xe2\xd7\xfd\x0a\x2b\x0a\x6f\x5e\xa8\xbd\x20\x2e\x50\x1a\xc5\xef\xef\xb8\x28\x33\x81\xb4\x69\x38\x5f\xb3\x08\xf6\x69\x26\x09\xa2\x17\xe8\x0e\x5d\xfc\xe7\x27\x59\xd5\xe9\x9c\x1a\xcb\x4a\xcf\x3f\x34\x81\xbe\xe5\x83\xfe\x89\xa7\x69\x27\x15\x7d\x72\x8e\x6d\x92\x83\xb7\x5e\xe4\x25\xe9\xa6\xa8\x94\xef\xec\x8d\x9b\x5b\x95\x51\xaa\x34\x7a\x32\xec\xea\x57\x69\x3d\xc2\x10\x6d\x06\x71\x70\xed\x82\x72\x3a\x57\xea\x69\xe5\xc4\x46\xdc\x1f\x37\xdc\x4f\x10\x4d\x75\x55\x60\xdd\xe6\x54\x55\x3e\x1f\x6b\xd1\x6f\x2d\xee\x2e\x08\xd5\x88\x04\x71\x70\xed\x8a\xc3\x6d\xa3\x5a\x62\x73\x25\x8a\x3a\x97\x6d\x30\x9a\xa9\x46\x07\x96\x5f\xd3\x54\xea\x4d\xbc\x89\x56\x6e\xed\x9b\x69\x09\xa7\x85\xd6\x77\x00\x1c\x5c\x3b\xfb\x9b\x02\x02\x3e\xe8\xfb\x8e\x0c\x34\x46\x19\x46\x6d\xc3\x1f\x8d\x38\x33\xe4\x65\x49\xa3\x38\xbe\xf4\x3a\xb2\xf8\xa3\xb7\x41\xae\x04\xc4\xc1\xb5\xcb\xca\x8b\xf4\xe9\xb7\x19\xee\x0e\xfb\xa3\x37\xaa\xc1\xa2\x23\x56\xb0\x11\x18\xc4\x92\x2d\xad\x22\xe9\x2b\x5e\xde\x9a\x30\x94\x8c\xd0\x0e\xf4\x3a\x3b\x4d\xbb\x12\xc3\x39\x83\x0f\x92\x41\x32\xf4\x9d\xfb\x1f\x6c\x42\x2e\xca\x35\x5c\x72\x57\x56\x4e\x15\x5a\x6b\xb7\x98\xe6\x7e\x11\xd7\xbb\x08\xd5\x5c\x04\x70\x48\x75\x38\x5f\x56\xd1\xa7\x71\x72\x36\x37\xaa\xcb\x30\x65\x14\xa8\xaf\x1a\x65\x6d\x55\xc6\x7e\xa0\xd8\x95\x9f\xe2\xa8\xe8\x4b\xa9\x85\xce\x7f\x82\x38\xb8\x76\x26\x43\xe9\xa2\x9c\x84\x8a\xb5\x3e\x57\x7b\xd8\x7f\x28\xf3\x17\x48\x0f\x79\xe7\x08\x7a\x0d\x27\x86\x9b\xc5\x34\xc9\x15\xc4\x9e\x20\xe2\x82\x38\xb8\x76\xdc\xe2\x5d\x18\x0d\x6a\xde\xdb\x4c\x91\x54\xaf\x94\x6f\x0b\xf1\x0c\x8c\xce\x91\x64\x1b\xd3\x25\x3d\x0e\xad\x1b\x9e\xcb\x52\x82\x6e\xac\x06\x71\x70\xed\xde\x3b\xe7\x89\x6f\x6c\x92\x5d\xa5\x2d\xd0\x37\x5d\xbb\x64\x9f\x72\x45\xea\x59\xb0\x1f\xff\x74\xdb\xd3\x43\x5a\xe2\xfd\x9c\x6b\x41\xd0\x4e\x39\x40\x4e\x38\x4d\xbb\xd6\x82\xb9\xd4\xc7\x5d\x6c\x98\x89\x72\x28\x94\x27\x29\xa3\xcf\x34\x6d\x4d\xbe\x5a\x2e\xa4\x39\x60\xb9\xb9\x19\x04\xdf\x9c\x3d\x40\xb4\x19\xc4\xc1\xb5\x8b\xde\x0c\xc6\xb3\x40\x91\xca\xad\x58\xbe\xef\xeb\x31\x7d\xcc\xa8\x46\xc3\x95\xc8\x4d\x12\x7e\x4f\xad\x8f\x45\xd3\xe6\xe9\x2e\x74\xe3\x07\x88\x83\x6b\xb7\x6e\xb9\x85\xf6\xd6\x2e\x69\x63\xf2\xf0\x57\xc8\xeb\xc5\x69\x93\x95\xc9\x6f\xd2\x13\xd7\xc5\x67\xf9\x71\xde\x3c\xa3\xef\x7c\x00\xad\x75\x81\x38\xb8\x76\xb4\x6c\x57\x36\xbf\xbc\x5b\x4d\x4b\x4e\xb0\xbf\x43\xfe\xf0\xab\xd5\x4a\x38\x95\x1b\xf7\xef\x07\x22\x6a\x09\x12\x4e\x0f\x58\x5f\x7f\x47\xc4\x05\x71\x70\xed\xdc\xef\xb2\x1b\x7a\xd6\xcc\x06\x9c\x2b\xcd\xaa\x7e\xb3\xe7\x92\x90\x5e\x16\x9a\x7a\x45\x2b\xbf\x18\xcf\x98\x0d\x15\x07\x9f\x7d\x17\xda\x5d\x0c\x48\xac\xa7\x69\xc7\x35\xf9\xcc\x80\x4c\x95\x65\xef\x5e\x5f\x00\xe3\xcc\x96\xe3\xc9\x5d\x7d\xef\x41\xbf\x1f\xe2\x42\x4f\xb7\xe7\xc4\x23\x47\xbd\x9a\x10\x6d\x06\x71\x70\xed\x5c\xa9\x88\xb9\xa6\x3c\x48\x37\x8d\x32\x3e\xfb\x52\xd7\xa1\x7e\x18\x97\xd4\x2c\x08\xdd\xa3\x2c\x37\xfa\x9c\xac\x1d\x30\xe3\x07\xed\x72\x04\x71\x70\xed\xe8\x87\x2a\x5c\x07\x4d\xc6\xb0\x9b\x68\xd8\x16\xf4\x8c\xe6\xae\x0a\xfe\x94\x58\xdb\x4e\x8d\x5e\xde\x9b\x1d\x9c\x69\xc6\x90\x70\x41\xc4\x05\x71\x70\xed\x3e\xd5\xe2\x8e\xd2\x26\x5d\xec\x95\x0f\xc1\x6d\xd7\x8d\x6d\x76\x19\x55\x57\xdb\x2c\xfb\xf3\xf5\xa7\xb3\x5c\x27\x76\xc3\x35\xf6\x01\x44\x5c\x10\x07\xd7\xce\xbc\x02\xcb\xf6\xea\x71\x4e\x6c\x32\x21\x4f\xe7\xd7\x1f\xc3\xd7\x09\xe2\x1b\xc4\x13\xdc\x08\xd0\x7a\x89\x62\x9e\x52\x6e\xb4\xf6\x20\x1c\x1a\x68\x76\x7f\xba\x43\x3b\xb0\x6b\x08\x5c\xbe\x4b\xf4\x80\xb0\x84\x5a\x2e\xbb\x04\x1d\xa5\x0f\xdb\x38\xc1\xa5\xac\x34\x23\xdb\x66\xef\x91\x88\xb8\x2f\x06\xc2\xed\x80\x38\x64\x87\x56\x36\xe0\x3f\xdd\x14\x32\xdd\xba\x54\x54\x1c\x19\x65\x67\x18\x26\x4d\xe0\xe8\x46\xf5\xba\x28\x4b\xd3\x41\x6f\xd8\x68\xfc\x10\xaa\x12\x09\xe2\x90\x1d\xda\xbb\xcb\xf9\xa4\xf8\x13\x96\x18\xf6\x41\x03\x8a\xe1\x58\x93\x69\xd1\xb2\x86\x7f\xb2\x7e\x66\x5a\x07\x1e\x6c\x54\x29\xb8\xc6\x58\x41\x37\xad\x01\xb8\xff\x38\xb4\x7f\x8e\xb9\x7f\x7d\x1f\x5a\x6f\xf7\x8d\x47\x15\x01\x0a\x71\x18\xef\x71\xfd\xda\x62\x0f\xf4\x47\xdd\xd8\xc7\x2d\x59\x9f\xc5\x37\xae\x9c\xd0\xc7\xf4\xc6\x2f\xfe\xed\xd0\xb2\xe9\x02\xf7\x0c\xa6\x64\xbe\x4f\xd8\xa3\x5d\x24\xd1\x9f\xee\xa1\x40\x93\xb3\x5a\xfa\x92\xc9\x4a\x35\x59\x5d\xb0\x31\x7e\x6d\xf8\x2f\xd4\x74\xc3\xc8\x4b\x70\x24\x6b\xbc\x5d\xb1\x6f\xb1\x68\x77\x49\x4f\x6c\x63\x91\xa3\x92\xe5\xf9\xcf\xa5\x2f\xd5\x6d\x6b\x4e\xf4\x02\xff\x6d\x0e\x0d\xd4\xb5\xbf\xcf\xa1\x21\x39\xb4\xbe\xb7\x29\x5c\xbc\x3b\xe5\xcf\x9b\x15\x92\xa3\x5a\x55\x88\xab\xdd\x14\x7d\x78\x7c\xcf\xc9\x5d\x7c\xc1\xb1\xff\x96\xac\x6c\xd8\xe7\x4c\x96\x77\x04\x91\xcc\x43\x76\xd6\x7e\x25\xa7\xd6\xcd\xf5\xf8\x31\x39\x34\x09\x2a\xc9\xe6\x3b\x16\x99\x59\xed\x71\x66\x11\x1e\x9f\x3c\xda\xb0\x12\x1f\x8e\x9f\xc9\x62\x16\xb2\x43\x93\x12\xf2\x7f\x73\x21\xb8\x44\xab\xbc\xa6\xe0\x37\xc1\x9e\x86\xe6\xc9\xa6\xbf\xda\xba\xb5\x30\xe6\x82\xbd\xd3\x7e\xa7\x6d\xbd\xd2\x99\xf4\xd6\x18\xe9\x67\xbb\x5d\x33\x0a\x0e\xdc\x29\x0c\x17\x5d\xd3\xaa\xbc\x9e\xf5\x4d\xe6\x95\x67\x7c\x51\x92\xda\x93\x49\x99\x8e\x5f\x0e\x16\x1a\x28\x3a\x93\xde\x22\x3b\xb4\x2c\xa9\xc8\x58\x0c\x3d\x09\x8d\xe8\x58\x66\xfc\xd5\x41\xac\x84\x1a\xf9\x31\x9c\xf4\x5d\xe3\xab\x7b\x1c\xfc\x85\x75\x45\x2d\x2e\x67\xe6\xd0\x40\x83\xe8\xb4\x8c\x15\xe4\xd6\x6e\xaa\x44\x69\xe8\x62\x8e\x81\xd1\xb3\x33\xba\x6e\x70\xcf\xbc\xc9\xb1\xed\xe9\x0e\x97\x48\x7e\xb5\x77\x43\xa6\x05\x74\xf7\x15\x88\x43\xda\x29\xe7\xe8\xf7\xa4\x00\x27\x81\x74\xe1\x9d\x26\xdb\x11\xe5\xf3\xa0\x5c\xcf\x96\xe1\xc7\x7a\x73\x8e\x31\x97\x46\xf1\x18\xba\x8a\x09\xa1\x9d\x72\x00\x0e\x9e\xb1\xda\x66\xbc\xe6\x66\xc9\xfb\x6b\x7f\xa4\x2e\xd5\x04\x3c\x55\x38\xf1\xd4\x7c\x86\x7d\x35\x31\xeb\x9b\xef\xd5\x0d\x35\xe6\x5d\x27\x7d\x44\x5c\x10\x07\xcf\x2c\x8b\x7b\x96\xad\xa6\xa5\x63\xce\x6a\xcd\x7c\xc6\xdd\x95\xd8\x5e\xf7\x2d\x0e\xd8\x72\x1a\xb7\xae\xa4\x7e\x77\x8f\x19\x52\x38\xff\x06\x5a\x23\x00\x70\x81\xd2\x68\xff\x78\x0e\xfa\xdd\x49\xe7\x7f\xd4\xbc\x9b\x08\x24\x6e\x5a\x0e\xc1\x6d\x98\x7d\x85\xe1\x3b\xb1\x6b\xd0\x60\xda\x42\xb7\x78\x8d\x42\xc8\x47\x16\x31\xdb\x00\xfd\x13\x4f\xd3\x2e\xc0\x0a\x53\x6c\x24\x85\xfa\x4f\xbf\xfa\xcc\xe2\xd2\xe1\x4d\xbe\xe2\xe5\x70\xf4\xf4\xfb\xf2\x6f\x09\x82\x08\xc5\x58\x6a\x77\xa0\xdb\x57\x41\x1c\x5c\x3b\x86\xda\xcb\x21\xb3\x6f\x3e\xb2\x94\x1c\x58\x1c\x09\x2a\x97\xf3\x31\x76\xb7\x7e\xde\xe8\x5b\x19\xd0\x8e\x21\x2d\xe9\x68\x9f\x80\xea\x87\x81\x38\xb8\x76\x7b\x51\x2a\xe6\x27\xa9\x4c\x32\x0e\x6f\xe7\x47\xeb\x1c\xd5\x85\x9e\xf4\xae\x5d\x37\x13\xf0\x68\xeb\x1b\xf7\x59\x72\x7c\x25\xf6\x10\x3a\x73\x04\xe0\xe0\xda\x19\xf2\x63\x36\xa3\x33\x6a\xa3\x18\x38\x06\x93\x5e\xb9\x9b\x2d\xfc\xf8\xeb\xb5\x77\xdf\x04\xd4\x48\x08\xa7\xd3\xe4\xfc\x6e\x76\x41\xf7\x32\x81\x38\xb8\x76\xc4\x0a\x35\x49\x35\x87\xe9\x0e\x4a\x0a\xdb\x13\xf7\xa4\xf6\xeb\x3a\x1b\x24\x30\xa3\xe2\x74\x24\x38\xaa\x84\x4e\xb4\x5e\x77\x31\x21\xb4\x03\xbd\xce\x4e\xd3\xee\x76\xfc\x5e\x81\x49\x49\x35\x5e\xdd\x1c\x46\x25\x69\xf9\x2d\xe3\x8d\x9f\xed\xac\xbe\x8a\xc5\x14\x97\xcd\x78\xad\xbb\xfb\x3e\xe0\x41\x15\x32\x00\x1c\xd2\x2d\x17\x6b\xae\x3f\x96\x28\x1b\x42\x4d\x96\xbd\x4b\x92\x43\xef\xe1\x4f\x7f\x1a\x42\x53\x4e\xff\x4c\x93\xd7\xbf\x39\x86\xfe\x6b\x17\x3a\x2f\x06\xe2\xe0\xda\xe1\xea\x2d\x78\x46\x5f\x2e\xd4\xd1\xfc\xce\x42\x83\x1f\x5c\xb5\xde\xb3\x61\x6a\x4b\x4c\x4a\xdf\xee\x5f\xf5\x6a\x65\x52\x20\xcf\x0c\x11\x17\xc4\xc1\xb5\xab\x78\xe5\x1e\x11\x9f\x4f\xc3\xb2\x5c\xcd\xaf\x12\xd4\xa5\x32\x16\x8a\xe7\xf6\x98\x69\x9e\xec\x35\x5b\x97\x33\xd3\xa0\x37\x09\xb4\x46\x00\xe2\xe0\xda\x2d\xb2\x17\xfb\x67\x19\x13\x8a\x5a\x14\xfa\x2b\x06\xc5\x44\x0e\x35\xb6\x09\xf7\x4c\xf9\x60\x0d\x8b\x5b\x13\x29\x34\x76\x89\x45\x20\xb4\x03\xe5\x84\xd3\xb4\xbb\x76\xed\x96\xb7\x6a\x68\xd8\x05\xb6\x94\xcb\x7a\xe3\x71\x7f\x96\xdf\x1b\x5e\xf9\x40\x22\x6a\x4c\x76\x70\x74\x7e\x8f\x89\x02\x0b\xaa\x07\x08\xe2\xe0\xda\xe9\xef\xa0\x5e\x0f\xfc\x25\x90\xf5\xe9\x40\x5c\x55\x98\x22\x38\x63\xd1\xbf\x16\x7f\x87\xba\x35\xcf\xff\x40\xfb\xbc\xeb\x05\xde\x23\x44\x5c\x10\x07\xd7\x8e\xa4\x73\x50\x4a\xff\x9c\x81\x72\xae\x13\x05\xe3\xe0\xa6\x27\xf7\x55\x9a\xd2\xb1\x81\x35\x7e\xbc\xa8\x72\xec\xc9\x07\xfc\x13\xd0\xbb\x18\xc4\xc1\xb5\xbb\x4d\xe4\x65\xf0\x9d\xe3\xcd\xeb\xa4\xfe\x69\xb1\x96\x05\x67\x0f\x1d\xae\x82\xec\x47\x9e\xdd\xeb\x18\x17\xf8\xbd\x5b\xad\x2f\x41\x95\x4d\x40\x1c\x5c\x3b\x15\x07\xca\x92\x73\x2a\x96\x3f\xc7\xdf\x0b\x37\xbb\x48\x4e\x53\x9b\x5a\xd3\x49\xed\x63\x29\x11\xec\x3b\x32\xbc\x08\x49\xc8\xf1\x44\x68\x07\x4a\xac\xa7\x69\xd7\xd5\x69\xfa\x7a\x63\xf4\x73\x5f\xaa\x5c\x26\xe7\x5b\x86\x5d\x9c\xc9\x82\x5f\xdf\x62\x03\x7f\x66\xc4\x88\xa8\x55\x26\xf3\x7a\xb4\x41\xf5\x27\x01\x1c\x52\xa5\x90\x8b\xd6\x5a\x4d\x98\xb7\xbd\x6f\xe2\x16\xe9\xac\xb1\x7e\x41\x93\xbf\x31\xca\x39\x3b\x83\x5d\x1e\xbd\x69\xdd\x28\x6d\xb7\x02\x7d\xe1\x03\x71\x48\xf7\x10\xe6\xbc\x24\xbe\x14\x61\x1e\xf0\x41\x5c\x3b\xe3\x47\xae\xf2\xfe\x97\xa9\xb7\x22\xfe\xc6\x65\x95\x7d\xb6\x6b\x7d\x7a\xdf\x47\xa0\xf3\xdc\x20\x0e\xae\xdd\x46\x33\x5f\xa4\x8c\x88\xed\xf5\xc6\x7d\x12\x2e\xbf\x2b\x6a\xe7\x5d\x31\xfc\x3d\xa3\x83\x02\x6e\xa1\xa6\xde\xc4\x7e\x1b\xea\x06\xed\x3b\x00\x71\x70\xed\x1c\x74\x25\xf3\x25\xfc\x1f\x71\x44\xf3\x85\xde\xa5\x97\x3b\xd6\xec\xa2\xf0\x31\x53\x2b\x77\xa3\xa4\x94\x9d\xc9\xbd\x24\x11\x4f\x8c\x70\x68\xa0\xd9\xfd\xe9\x0e\x4d\xaa\xb6\x4c\xb9\xc1\xbf\xb9\xce\x5d\x20\x04\x5f\xd0\x23\x21\x61\x7b\x52\x6c\x28\xeb\x92\x12\x55\xe2\x4b\x45\xef\x87\x58\xf3\x58\x08\xb7\x03\xe2\x90\x1d\xda\x88\x4b\x6f\x2c\xc9\x73\xb1\x8b\x1f\xc3\x25\x39\x9a\xab\xf3\x39\xd3\x0b\x38\x8d\xbd\x4a\x1d\x47\x7f\x08\xd5\xfd\xea\x9a\x40\x79\x8f\x88\x0c\xe2\x90\x1d\x1a\xba\x4a\xe1\x6e\xed\xe4\x8a\x94\x3e\x3d\x63\xc6\x90\x62\x97\x9c\xd5\x07\xb6\xe8\x1c\x0a\xa3\x77\x93\x9f\x99\xd9\x9b\x2c\xf3\xf5\x10\x91\x41\xdc\x7f\x1c\x1a\x0a\xea\x3f\xf2\xde\xbf\xbd\x0f\x2d\x25\x6c\x4b\xb0\x40\xe4\xb7\xdd\x2f\x86\xfa\xf9\x90\xc7\xe2\xf7\x3b\x24\x72\x76\xe2\x4c\x29\x9f\x06\x6e\x9a\x6c\xdf\x61\x58\xd5\xfc\xdb\xa1\x4d\x6b\xb4\x5b\x63\x36\x75\xb3\x44\x7e\x79\x2e\xa6\xe1\xc8\xe6\xfb\xd2\x3f\xe6\x6d\xe5\x84\xe5\x10\xba\x6f\x68\xa8\xcf\xd7\x3d\xee\xbf\x50\xe6\x4f\x68\xd7\x52\x63\x36\xb3\xb8\x86\x79\x52\x24\x72\x29\x54\x36\xd1\xb5\xfe\xb4\x48\xe7\x5c\xc4\x4c\x1b\x4c\xb2\x79\xf9\x71\xe1\xbf\xcd\xa1\x81\xba\xf6\xf7\x39\x34\x24\x87\x26\x2f\x1d\x12\x28\xa8\xdf\xc8\x34\x12\xfb\xb4\x10\x25\x76\xfb\x39\x09\x05\xa1\xf5\x79\x03\x1e\x3f\xbe\x93\x75\x85\xcc\x3e\x2d\x9e\x33\x59\xde\x41\x76\x68\x3a\x17\xf4\x17\xfb\x51\xe6\x77\x27\x0e\x48\x44\x0e\x2e\x65\x7b\xd4\x47\x97\xda\x09\x86\xed\x66\x28\x26\x5d\x1b\x0e\x68\x71\x3e\x93\x1b\xab\x3f\x21\x3b\xb4\xa9\xab\x31\x84\xd5\xbe\x6a\x3f\x6e\x36\x31\x15\xdc\xbe\xc2\xf8\x18\x25\x38\x0d\xb3\x33\x40\xd1\x2f\x92\x3f\xba\xd1\xd1\x4d\xd2\xe4\x4c\x7a\x8b\xec\xd0\x9e\xbd\x51\xc4\xaf\x6e\x62\x39\x57\x3d\x71\x59\x33\x17\x5b\x9f\xdd\xe6\xe0\x4f\x3f\x75\x4c\x8d\x0b\xeb\x35\x56\x11\xd5\x94\x57\x7e\x67\xd2\x5b\x64\x87\xe6\xec\xc8\x96\x99\xd3\x70\xc8\x1b\xf5\x6a\x21\x56\xe0\xdd\x73\xda\x9a\x8b\x1c\xdd\xd8\x97\x08\x2c\x5e\x1b\xfb\x70\x97\xd8\x61\x7d\x3f\x33\x87\x06\x1a\x44\xa7\x65\x2c\x5a\xf7\x85\x9a\xa0\xdb\x8d\x0f\x99\xb4\xdc\x44\x3d\x4e\xe2\x8b\x5e\x3b\xa4\x16\xe3\xac\x7c\x6f\x20\xcb\xc3\xdd\xc2\xc6\x29\x57\x85\xbe\x83\x02\x38\x78\xc6\x6a\x30\x0d\x21\xd2\x7b\xd7\x73\xa2\x7c\xaf\x4f\xa3\x58\x1b\x2d\xf3\x5c\x9d\xee\x03\x45\x3b\x52\xba\x75\xcc\xe4\x41\x0a\xaa\xd4\xcb\x88\xb8\x20\x0e\x9e\xb1\xdc\x59\xf1\x77\x89\xce\xef\xfb\x0f\x0e\x95\xf9\xf0\x25\x09\xd3\xe0\x98\x61\x44\xc4\x7f\x31\x89\x5e\xbd\xdb\x24\x52\xe5\xdb\x03\xcd\x8e\x40\x1c\x3c\x63\xcd\xbf\xa0\xc0\x7f\x84\x77\x87\xca\x85\xc8\xa8\x85\x41\x2c\x5a\x6d\xa5\x32\xb3\xde\x74\x56\xb4\x5c\x51\x48\x84\x80\x24\x8e\xef\x16\x54\x2d\x19\xc0\x05\x4a\x4b\xfd\xf3\x5c\xd0\x15\xf9\x22\x86\xc8\xaa\xf7\xc9\xb2\xaf\xca\xed\xa2\x24\xa5\x8f\x8c\x67\x58\x46\x70\xcb\x28\x93\xde\xe2\x46\x96\xb3\x8f\x41\xb3\x7c\xd0\x3f\xf1\x34\xed\xee\x3d\x21\xcf\x1e\x63\xc3\xde\xbc\x1d\x2d\x3b\xad\xdf\xae\x57\x5f\x65\x7a\xf7\xc0\x31\x1c\xbf\xfd\x47\x0c\x8f\xca\xdd\x97\xf8\x50\x95\x17\x10\x87\x74\x96\xe9\xc0\xf3\x88\x55\xb0\x4e\xca\x71\x39\x94\x2a\x80\xa8\x34\x99\xd6\x06\xed\xf9\xaa\xe8\x0d\x42\xd5\x1f\x9f\x53\x9d\x09\x66\x20\xd7\x0e\xe2\x90\xd6\xd0\xe6\xba\xb8\x2d\xfa\xfa\x45\xe9\x64\x48\x1a\xbf\x3a\xf9\x3e\xd0\x92\x2e\xbf\xcd\xb9\x34\x70\xc5\xb4\xe1\x49\x10\x6e\x8f\x27\x54\xc5\x02\xc4\xc1\xb5\xeb\xfa\xa9\xca\x18\xd5\x30\x65\xd6\x54\x52\xba\xdd\x18\xfc\x20\xf8\x04\xd5\x31\xc1\x21\x2f\xfb\xba\xf9\x77\x86\x09\x7d\xbe\x29\x22\x68\xd6\x05\xe0\xe0\xda\x7d\xf8\x99\x9f\x75\xf4\xf5\xdb\x13\xbd\x31\x22\xd7\x60\xe5\x1f\x9e\xdd\xec\xa9\x7b\xcc\xfa\xbf\xf7\x6e\x76\x4d\x98\xf9\x0a\xa1\xd3\x20\xb4\x03\xbd\xce\x4e\xbd\x29\xe1\x5a\xd7\x23\x0b\xaa\x9b\x1a\x2e\xb5\xc9\xa3\x11\x69\x8e\x89\xa1\xa3\x01\xd8\xea\x7a\x4d\xb1\xf7\x71\x54\x4b\x24\x5f\xa6\x41\x3b\x54\x41\x1c\x5c\xbb\xe7\x43\x3f\x8d\x8f\x97\xe7\xe5\x59\xef\xd5\x7d\xcd\x67\x6e\x0f\x88\xdd\xef\x31\x94\xf3\x58\xf6\xba\xa4\x7a\x23\xfc\xc4\x1d\x13\xba\x3d\x03\xc4\xc1\xb5\xab\xef\xae\x97\xf0\x11\x37\x7f\x6f\x16\x2d\xa6\x8e\xce\x1e\x12\x12\x4f\x5e\x86\x11\xc6\x24\x1b\x3b\xb5\xee\x52\x9e\xc4\xac\x02\xcd\x40\x41\x1c\x5c\xbb\xe7\x12\xf9\xa3\x77\x2c\x99\x35\xf8\x62\xef\x10\x0d\x3b\xbe\x93\x3c\xe4\xf9\x96\x21\xec\x1f\xf7\x27\x0f\xcf\xf7\xd6\x49\x75\x0f\x34\xcb\x07\x71\x70\xed\x52\xad\x6c\xee\xe6\xd7\x7f\x19\x25\xdb\x98\x31\x3d\x44\x49\x7d\xe1\x12\xeb\xb1\xa2\x98\x5e\x3d\xad\x39\x15\xc6\xcc\xbf\xda\x05\xdd\x65\x07\xca\x09\xa7\x69\xd7\xcc\x34\xa8\x48\xa2\xaf\x8f\xfa\x89\x68\x00\xfd\x9e\xf0\xb9\x72\x99\x73\xb8\x8b\x93\x23\x15\xaf\x4c\xa6\xe8\x8e\xd4\xf5\x2b\xa1\x3b\x19\x41\x1c\x5c\xbb\x25\x52\xa2\x13\x36\xb7\x88\xf5\x74\x41\x6b\xf6\xaf\x94\xf9\x68\x3e\x19\xaa\xf6\x8b\x86\xd7\xb9\x3d\x9d\xa9\xd3\x95\x1d\xf5\xa1\xda\xac\x20\x0e\x69\x97\xe3\x51\x31\xc5\xa4\x93\x13\x87\x2b\xaa\x98\x80\x5c\xbc\x17\xcd\x7d\xfb\xc4\x89\x8a\x23\x6a\x7f\xbc\x02\x5b\x2f\xcf\x99\xdd\x67\xd0\x2e\x47\x00\x07\xd7\x8e\x93\x71\xf7\x3c\x4d\x46\xeb\x6a\xc7\xdb\x4d\xa6\x71\xb3\xd4\x55\x4d\xf7\xca\x25\xf1\xa8\x2b\x2a\xba\x0e\xa4\xb6\xc9\x6d\xf2\xef\x10\x71\x41\x1c\x5c\x3b\x2f\x45\xb6\x0d\x8f\x48\x55\xc6\x64\x5d\x05\x65\x95\xd1\x22\xc3\xc3\x6e\xdc\x78\x5d\xd4\xec\x8a\x80\xc0\xe6\x77\x83\xab\x87\x6a\x08\xed\x40\x89\xf5\x34\xed\xa4\xd5\xbe\xdc\xe8\x7a\x47\xf1\xb9\x07\x65\xf2\x10\xb5\xc7\x98\xb8\x6b\x79\xd9\x55\xca\x7b\x9d\x38\xe4\x70\xac\x8a\x46\x5c\x4b\x09\xd1\x66\x10\x07\xd7\x6e\xb4\xe2\xa0\xe3\xce\x94\x9c\xf5\xe7\x24\x2b\x57\xd1\x37\xd4\x61\x8c\x26\xdb\x1e\x73\x34\xc7\xde\x0f\x47\x66\xbd\x34\x85\x14\xa1\xbd\x1d\x20\x0e\xae\x5d\x99\xb1\x6f\xe7\x37\x5c\xeb\xfb\x75\x72\xb6\x2c\xa3\x55\x18\xce\x6e\xa1\x79\xf3\x56\x46\x3e\x0c\xbc\x38\xc5\x99\x25\x44\x53\xd0\xad\x1c\x20\x0e\xae\xdd\x26\x7f\xf1\xe2\xa6\x4a\xd7\x25\x6c\xb2\x31\xb3\x99\xfb\x6a\x98\x6f\x99\x3d\x8f\x0c\xa5\x58\xba\x8e\x8e\xa5\xc8\x36\x3a\x93\xa1\xbb\xf7\x40\x1c\x5c\xbb\x1b\x63\xed\xe7\xb2\x1c\xa9\x27\x49\xa9\x7c\x7b\x7e\x0c\x77\xae\x86\xb5\x49\xf0\x90\xb5\xba\xbd\x09\x76\x31\xc7\x6f\xe6\x93\x87\x6e\xac\x06\xcd\xee\x4f\x77\x68\xba\xfe\x1a\x56\x4f\x0f\x22\xe5\xb1\x09\xf8\x83\x22\xaf\x84\xac\x53\x19\x5d\xe7\xcd\x4e\x70\x3b\xea\x1e\xd2\x11\x72\xf2\x63\x55\x44\xb8\x1d\x10\x77\xca\x39\xb4\xa4\x0b\xd4\xa8\x51\x41\x4c\x65\xe7\xbd\xab\x69\x29\x55\xa3\xcd\x99\xdf\x9f\xdf\x4c\xa1\x8e\x7b\x56\xab\x89\xdf\xfe\xc6\xff\x18\x3a\x87\x06\xe0\x90\x1d\x5a\x62\x54\x60\x10\x15\xea\x4f\x22\x29\x46\xdd\x6f\xb9\x37\xa7\x19\xe3\x32\x97\x9e\xf4\xb8\xb9\x74\xdc\x91\x54\xd8\x92\x7d\xb5\xef\x8d\x88\x0c\xe2\xfe\xc7\xa1\xfd\x63\x47\xe9\xbf\xbe\x0f\x4d\xe3\x32\x77\x70\xce\x3b\x5e\x75\x8c\x9a\x29\x91\x1e\xcc\x3e\xf5\x75\xc7\x1c\x9f\xb4\x46\x7c\xb4\x9f\xfe\xe1\x96\x61\x61\x7e\x53\x7f\x3b\xb4\x73\x4a\x9a\xaf\xda\xa8\xfc\xd8\x7f\xdb\xe4\xf6\xa1\xbb\x06\x7d\xf6\xaf\x6e\x10\xfc\x93\xea\x5c\xe5\x37\xc5\x21\x1c\xfe\x44\x2f\xe0\x2f\x14\x7f\xf9\xf2\x76\xdf\x72\x9d\x29\x63\xf8\xbb\x97\x06\xca\x6f\xaa\x1b\xb1\x26\x5a\x72\x7b\x59\x3b\x9d\x42\x94\xe2\x5e\xbc\x2f\xf3\xfb\x6f\x73\x68\xa0\xae\xfd\x7d\x0e\x4d\x09\x3e\x8b\xdf\x64\xfc\xd6\x21\x25\xdd\x82\x76\x60\x91\xd5\x6c\xc7\x2a\x7e\xce\x6e\x89\x9c\x8e\xa5\xaf\x72\x4c\x83\xcb\xc4\x92\x7c\xe9\x20\xf8\x4c\x96\x77\x90\x1d\x1a\xd7\xa2\xa4\x9d\xff\x25\x17\xb2\x2b\x92\x3f\xbb\xe6\x2f\xb2\x0f\x46\x7a\xce\x63\x1b\x0e\xa6\xfb\x5e\x44\x53\x9f\xa4\x0b\x40\x3d\x93\xcd\x95\x28\x1a\x48\x3f\xcb\x22\x3a\x97\xad\xa9\xc1\xba\x9d\x6d\xb4\x64\x5f\x19\x12\x48\x20\x9f\x3d\xa7\x6f\x43\x92\xac\x54\x79\xd5\x23\x59\xce\x5b\x56\xe6\x4c\x7a\x8b\xec\xd0\xae\xcb\x4a\x2a\xc5\x8b\x52\x79\xdc\x0c\x68\xa0\xbd\x6d\xf6\x7d\xe5\xcf\xee\xe3\x88\x39\x3e\x82\x4f\xfb\x42\x9c\x2e\x39\xcd\xea\x79\x67\xd2\x5b\x6f\xa4\x9f\xbd\x29\x5d\x67\x8f\x73\x18\xb1\xe3\x8a\x66\x2e\x3d\x67\x81\x61\x43\x13\x31\xef\xf1\x73\x34\x26\xc0\x8b\xf1\x93\x09\x3e\x97\xe2\xd9\xdd\x58\x0d\x1a\x44\xa7\x65\xac\xb0\xd0\x1e\x8a\xf0\x80\x71\x56\x4a\xd9\xd4\x6d\xa6\x4f\xd7\xe9\x88\x0f\x45\x83\x63\x0e\x4d\x16\x9a\x0b\xfd\xe5\x5e\x04\x75\x79\x43\x27\xf5\x01\x1c\x3c\x63\x71\x69\x50\xec\x67\x9e\xf7\x18\xcd\xee\xb1\xbd\x39\x58\x5f\xfa\x58\x8f\x64\xe0\xd6\xc5\xa4\x9e\x6e\xdd\x58\xbe\x82\x60\x0b\xc3\x18\x68\x37\x09\x80\x83\x67\xac\xaf\x2d\x2b\xd1\x47\x42\x13\x5b\x24\x34\x1b\xb7\xe6\x0f\xe7\x70\xb7\x71\x43\x15\xc4\x3b\x0b\x52\x28\xe2\x77\x5e\x48\x85\x4e\xbc\x46\xc4\x05\x71\xf0\x8c\xf5\xb8\x30\xcc\xe1\x0b\x4d\xd1\x78\x05\xe5\x31\xbe\xfd\x04\x3e\xa7\x88\xa7\xdd\x42\x9d\xb5\x08\x25\x9a\xa4\x04\xd1\xac\xbd\x20\x74\xeb\x00\x88\x83\xb7\x17\x15\xb3\x95\xd9\x72\x46\x18\x75\xe6\xed\xb7\xcd\xcd\xda\xf7\xb6\xe8\x0f\x59\x86\x95\x76\xde\xe4\x63\x0e\x56\x62\x61\xac\x91\x7e\x84\x2a\x16\x00\xfe\x89\xa7\x69\x27\x32\x1a\xbe\x50\xda\x13\x83\x1e\x98\xb5\xfc\x8d\xa0\x53\xf6\x1c\x16\x1a\xc1\x0d\x1d\x61\x86\x12\x0d\x1a\x5f\x34\x96\x59\x53\x68\x87\x2a\x88\x83\x6b\xa7\xaa\x42\x8d\x5b\xc3\xbb\xe1\xc7\xb3\xd0\x6b\xbe\x37\x1a\x92\x50\x15\xe9\xd7\x2d\xac\x90\x42\x50\x1a\x9f\xe7\xa4\x77\xf1\x3d\x74\x3a\x1d\xc4\xc1\x9f\x85\x3e\x8e\x6b\x34\xda\xcc\x0f\x91\x6a\x1c\xdc\x42\xab\x93\x61\x2b\x9b\x71\x4d\x3f\x47\x5c\xae\x72\x1c\xa5\x61\xb3\x57\xdc\x7f\xa0\xef\xd7\x20\x0e\xae\x5d\x43\x58\x21\x1a\x33\xfa\xfb\x97\x9f\x4b\x69\xf1\xbc\xb3\xcc\x7b\x3f\xed\x0b\x11\x39\x9e\x8f\x0f\x27\x29\xfd\x29\xcc\x21\x8c\x92\x0a\x7d\x0d\x00\x70\x48\x77\xef\x31\x67\x88\xd6\xcf\xe8\x3c\x7a\x7e\x2c\x6a\x3e\x10\x4f\x4f\xab\x2b\x8e\x7e\xfe\xa0\xb7\xe3\xca\x63\x37\x87\xf0\x6d\xde\xc7\x51\x08\xed\x40\xaf\xb3\xd3\xb4\x5b\xd8\x8f\xc8\xe6\xba\x66\xac\x77\xbf\xe6\xb6\xaa\x76\xd0\x9d\x57\x5d\xad\xde\x31\xb3\x0d\x57\x19\xda\x7f\xe6\x38\x59\x13\x97\x41\x75\xfb\x40\x1c\x5c\xbb\x04\xfc\xc4\x9a\x5f\x6e\x2e\x3f\x32\x2d\xac\x2e\x0a\x05\xe0\x8b\x87\x29\x94\x4a\x2e\xda\xfb\xa3\x15\xe5\x64\xec\x8b\xca\xfe\x81\xee\x17\x03\x71\x48\x75\x38\x49\x9c\xb8\xf0\x18\x27\x7a\xa4\x9b\x17\x33\x71\x2c\xf3\xfc\x46\x8f\xed\xb5\x48\x62\xd6\xc4\x98\xeb\xee\x57\x74\x2b\x3f\x80\x76\x23\x82\x38\xb8\x76\xa5\xd2\xfe\x37\xfb\x3e\xd1\x30\x6e\xe8\x48\x9f\x84\xd6\xa3\x96\xc7\xc8\x25\xc8\x98\x12\xb9\x26\xe2\x75\x8e\x0e\xad\xda\x89\x42\xf5\x00\x41\x1c\xbc\xbd\x84\x32\x8f\x64\xc3\x6d\x93\x05\x3e\xcb\xb9\xc7\x3d\x2b\x66\x54\xda\x89\x62\x22\x27\x2d\x1d\x76\x1b\xa4\x29\x57\x8b\xc8\xf3\xd3\x46\x68\x07\xca\x09\xa7\x69\x47\xa2\x61\x1c\xa6\xea\xf2\x89\xaf\x90\x7c\xe5\x9b\xe5\x13\xd9\xba\xdf\x35\xbd\xdd\x25\xe7\xeb\x57\xee\x13\x72\x33\x7d\xbc\x4a\x0a\xd5\x03\x04\x71\x70\xed\x22\xff\x84\x4a\xf0\x92\x28\xff\xc0\x27\x22\xd3\x1c\x72\x7d\x1c\x33\xbe\x33\x6f\x71\xc9\xd7\xff\x17\x87\xa3\x14\x63\x4e\x32\x17\x34\x1b\x07\x71\xf0\x67\x91\x1a\x89\x75\x44\x9f\x61\x21\xb8\xf6\x59\x5d\xea\xf7\xb0\x7f\xba\x08\xad\x37\x26\x9e\x81\xd4\x9e\x41\x73\xb2\xbc\xa1\x93\x03\x09\x74\x36\x11\xc0\xc1\xb5\x43\x4f\xdc\x4b\x3e\x48\x1d\x23\xf6\xe8\xd3\x79\xd5\xa4\xf4\x0a\x73\x6d\x55\x45\x24\xe0\x65\x62\x92\xab\xf9\x31\x9a\xf4\xf9\xd8\x29\x44\x5c\x10\x07\x6f\x6f\x2e\xc6\x63\x66\x45\x0f\x5a\xdd\x54\x63\xaa\x4d\x8d\x72\x22\xc7\x00\x5b\x8e\x10\x9f\x5f\xaf\x08\x04\xdf\x74\x69\xd7\x1f\xf4\xd5\x23\xb4\x03\x25\xd6\x53\xf7\x1d\xd0\xe1\x50\xf1\x3a\x2d\xf8\x3c\xe9\x2d\x88\x70\x3a\x60\x37\xb9\x5b\x55\xd2\xcf\x89\x8a\xe2\x50\x30\xb9\xfd\xd0\x2e\x7f\xc0\x12\xda\x77\x00\xe0\xe0\xda\x99\x28\x5e\x67\x58\x4f\x72\x5c\xc2\xc7\x4d\xfc\x98\x82\xb5\x3e\xf2\xfa\x8b\x97\x1d\x4e\x21\x53\x69\x76\x12\xfe\xbb\xe7\xaa\xa9\x21\xd0\x2e\x60\x00\x07\x7f\x16\x29\xf1\xf6\x91\x35\x45\x19\xc1\x0e\x11\xf2\x26\x64\xfd\x61\x2b\xd3\x1f\x94\x54\x23\x76\xaf\xc8\x75\x54\xe1\x91\xa4\x28\x91\xf5\x21\xe2\x82\x38\xb8\x76\xfb\x6f\x96\x2d\x86\xf1\x75\xa6\xb7\x94\x3c\xa2\x9e\x5b\x5b\x3c\xa8\x6f\xb0\x8e\x26\xd5\x4a\xcf\x9c\x41\x9f\x22\x2d\x8e\x73\x81\x6a\xa8\x82\x38\x78\x7b\x47\xb2\xa5\x28\xf4\xee\x8e\xe2\x5c\xea\x0b\x7e\x72\x31\xec\xc9\xd3\x0b\xa9\x72\xf5\xe7\x38\x85\xbe\xbc\xdb\xf2\xbe\x8d\xc7\x6c\x75\x82\x70\x68\xa0\xd9\xfd\xe9\x0e\xad\xbf\x9b\xe0\x89\xc3\x1c\xdb\x33\xa6\xef\x12\xd2\x96\x0d\xec\x3b\xfb\x6d\x32\x95\x36\xea\xdd\x01\xd3\x7d\x2a\x04\xa4\x98\x56\x43\x08\xb7\x03\xe2\x4e\x71\x68\x09\x16\x62\x83\x07\xdb\xe3\xe4\x06\x11\xe1\xbf\x07\x3f\xaa\x33\x6d\xda\x64\x70\x35\xb4\x6d\x7e\xd0\x5e\x42\x39\xb4\xaf\xc4\x83\x1c\x1a\x80\x43\x76\x68\xcc\xdb\xee\xaf\xa3\xa9\xe3\xf6\x24\x64\x89\xe6\x44\x68\x42\x05\x0f\xfa\x58\x02\x54\x0a\xa3\xa4\xd4\x74\x98\x9f\x6d\x0f\xf9\x36\x20\x22\x83\xb8\xff\x71\x68\xff\xb8\xd3\xee\x5f\xdf\x87\x86\xe6\xfd\x41\xa5\xe8\x08\x2f\x3b\x2d\xd7\xff\x45\xfd\x9b\x1b\xa4\x41\x8f\x4e\x5c\x17\x0d\x1c\xd7\x7b\xef\xdd\x77\xd3\x5e\xc1\x95\xfa\xc7\x2e\xc7\xa8\xaf\xb4\x42\x22\x7b\x12\x45\xc7\xb4\x21\x83\x4f\x38\x86\x77\xda\x8c\x1c\x04\x76\xc3\x54\x88\xdb\xf7\x27\x45\x84\x2b\x89\xff\x42\xf5\xe4\x93\x72\x57\x5b\x7a\x2e\x3b\xf9\x88\x25\x2b\xf4\xf8\xd8\x0d\xf8\x92\x10\x7b\x89\x3a\x69\x5a\xa4\x94\x53\xfd\x50\xbf\x31\xff\xdf\xe6\xd0\x40\x5d\xfb\xfb\x1c\x1a\x92\x43\xfb\x70\x5e\xa8\xc5\x9f\x75\x4e\x27\x02\x57\x93\x76\x35\xc6\x6c\x5c\xf3\x32\x4f\xe4\xcb\x22\x54\x95\x09\x54\x22\xf7\xdc\xf6\xc1\xb3\xb9\x21\x0c\xd9\xa1\x89\x16\xe9\x33\xaf\xe5\x6f\xff\x52\x99\xf2\xff\xf4\x76\xce\x99\x99\xbd\xb7\xa8\xb1\xd7\xec\x8a\x53\x70\xae\x81\x99\xa1\x40\x97\xfb\x99\x2c\x66\x21\x3b\x34\xfc\xf5\x27\x8a\xcc\x12\xef\x2e\x89\xb5\xb8\xb6\x1e\x77\x57\x28\x8e\xe1\x7d\x76\x1e\x70\x78\x99\xf8\xba\xb8\x4a\x9f\xa5\xdf\xf2\xfc\x99\xf4\x16\xd9\xa1\xad\x52\xa9\x3f\x08\xe6\xd8\x5c\xdb\xaa\x66\xd6\x96\x9c\x5d\x14\x1d\x0d\x2b\xce\x27\x0e\x67\xcc\xe6\xc5\xb8\xcb\xa6\xf2\x5b\x4a\xf4\x4c\x7a\x8b\xec\xd0\x26\xaa\xb1\x94\x8e\x8d\x19\x8a\x85\x03\xaf\x8e\x34\xa4\xdb\x17\x91\x2b\x5a\xec\x1b\x6c\x0c\xf5\x3c\x09\x7f\x59\x50\x79\xd2\xc1\x78\x66\x0e\x0d\x34\x88\x4e\xcb\x58\xde\x05\x6d\xbe\x07\xf7\x43\x6a\x3e\x39\x37\xdc\x6f\x5b\x2d\x6e\xbc\xc5\x21\xa6\xb4\xba\x32\xfc\xd6\x2d\x63\xd1\x3a\xda\xac\x49\x1a\xaa\x61\x08\xe0\xe0\x19\x8b\x8f\x4c\x8c\x6a\xf8\xc0\x35\x59\x68\x22\x27\xc3\xc1\x96\x49\xab\xeb\xc7\xaa\x95\x40\xdf\x89\xe7\x31\x7f\xd2\x87\xa2\x86\x43\x47\x44\x5c\x10\x07\xcf\x00\x63\xce\x6b\x19\x19\xa4\x4e\x15\x22\xdd\x8a\x02\xfb\xb4\x8f\x1a\xd9\x8b\xd3\x1e\xea\x8e\x85\xad\x8b\x38\x93\xde\xf0\xc9\x27\x80\xbe\xdb\x82\xb8\x40\xe9\x7f\x9e\xba\xdd\xd4\x5b\x26\x97\xe9\x6f\x92\xd1\x2e\xf0\xcc\xb8\xe2\xf5\x3b\x30\xc9\xcc\x68\x6d\x40\xc6\x1c\xb3\x54\x07\x1f\xb3\x5c\xb6\x0d\xba\xdb\x07\xc4\xc1\x9f\xef\x33\x23\xe2\xde\x1b\x32\x25\x8f\x8b\x8f\x9e\xde\xb3\xb3\xf2\xba\xe8\x61\x49\x32\x71\xf0\x45\xb9\x7f\xcd\x6a\xa1\x3c\xb4\x97\x3e\xca\x4f\xee\xdf\x71\x81\xd2\x28\xa8\x7e\xfe\x4f\xfe\xe7\xd5\x21\x8d\x82\x8a\x34\x10\x0c\xff\xdd\x1f\xfa\xb4\x21\xb0\xe8\xc5\x2a\x2c\xa5\x9e\x33\xf5\x2c\x6c\xf4\xbd\x27\xff\xa0\xb0\xaa\x8a\x9a\xb8\x57\x00\x3f\x99\x99\x9e\x5b\xa7\x12\xad\x0d\xb4\xf9\x10\xc4\xc1\x87\xc0\xca\x06\x8a\xf9\x71\x07\x8f\x2b\xee\x05\x69\x8c\x3f\xe6\x5a\xf1\x6b\x4b\xea\x23\x3a\x8d\x03\x26\x7e\xd5\x3a\xf2\x83\xfb\x2d\x9e\x88\xb8\x20\x0e\x3e\x04\x4a\x9b\x67\x3d\x36\xf4\xb1\x84\xc9\x5f\xd1\xe0\x1c\xa5\x5c\xd8\x51\xfd\x13\x77\x68\xc1\xff\x86\x5b\xe6\x89\x83\x6b\x08\x39\x3d\x64\x4c\x41\x1c\x7c\x08\x50\xa1\x4a\x55\x53\x6d\x3b\x59\x79\x9b\xe4\xb3\x91\x5d\xe5\xe9\xe2\x94\xb8\x2e\xe0\x12\x79\x80\x2b\xd3\xfc\xe4\xc4\x31\x38\x1e\x2a\x40\x0d\xe2\xe0\xcf\xf7\x4d\x40\x3c\x1d\xad\x62\xd3\x1c\x3e\x5a\x52\x36\xb7\xaf\xa5\x9f\xe2\xfd\x5a\xae\x79\x7e\xe7\x60\xef\x11\x49\x21\xad\x51\xc6\x4e\x3f\xf9\x7f\xc7\xfd\x9f\x21\xf0\xff\xbf\xc7\xff\x97\x31\x00\x7a\xbb\x9e\x36\x06\xb4\xe9\x7e\xb6\xa4\x6e\xdc\x09\xaf\xdd\xb0\xa4\xbb\xee\x80\xdd\x36\x73\x6d\x2e\xdc\x61\x97\x9f\xd6\xc7\x67\x22\x6b\xfc\x7c\x05\xb4\xcc\x02\xe2\x90\x0a\x97\x04\x7c\xa6\x4e\x91\x51\x78\xad\xf3\x61\x7c\xa3\x36\xf2\xcd\x9e\xc0\x75\xb9\x56\xd4\x44\x7e\x61\x0f\x2a\xc2\xd7\xdf\xc2\xd1\x6d\x20\x73\x00\xe0\xe0\x63\xc0\x93\x85\xb3\xe4\x5b\xd4\xaf\x87\x83\x9d\xee\x54\x9a\x5b\xb1\x2f\x8d\xef\xb3\x09\x3e\x2e\x25\xda\x79\xc4\x64\xce\x18\x78\x67\x6f\x14\x11\x17\xc4\xc1\xc7\x00\xe7\x24\x73\x83\xf5\x34\x79\x62\x92\xa8\xa2\xf0\xc6\x0f\xc6\x00\x7e\x6a\x97\x87\xab\xfb\x5b\xfa\x8b\x8f\xee\x2e\x61\xaa\xc8\x3a\x43\xcb\x42\x00\x0e\xfe\x7c\x75\xab\xe6\x22\x5b\xc4\xfb\xfc\x99\xd3\xe7\x65\x12\x59\x8a\xbf\x0b\x8e\x65\x2d\x3d\x2f\xa3\x69\x7b\x93\x76\xf8\x59\xb4\x3e\x2a\x12\x31\x06\x40\x1c\x62\x0c\xfc\x4f\x52\xfd\x5f\xc6\x00\x28\xd5\x9d\x36\x06\xac\xee\xe9\xa4\x11\x75\xe4\xa5\x8f\x6b\x3f\xd1\xbc\x2b\x4d\xe0\xd7\x73\x2b\xb6\xc3\xf4\x67\x63\x4d\x00\x1a\x9d\x2e\xee\x2f\x7d\x72\xe8\x08\x23\x80\x83\x8f\x01\x34\xd4\x1b\xe6\x81\x96\x32\x15\x0c\x45\x9d\x07\xdd\xf2\x36\x6c\x37\xe9\x5f\xbf\x11\xdc\x31\xf8\x58\xbe\x37\xcf\x5e\xc5\x7c\x1d\xfa\x08\x08\xe2\xe0\x63\xe0\xb1\x88\x00\x83\xf2\xc7\xd7\xfa\xee\x84\x4b\x33\x81\xf7\x89\x4a\x78\x9a\xcc\x4a\xff\xe8\xd4\xf1\x84\x7e\x9d\x09\x3c\x17\xa4\x00\x2d\xeb\x82\x38\xf8\x18\x90\x25\x3c\x62\x7e\xb6\xc4\x69\xfa\x30\xc3\x80\x47\xcf\xd0\x6d\x73\x16\xed\xd8\xaf\x84\x0b\xaf\x6c\x48\xa8\x47\x5f\x80\x4d\xa3\x07\x11\x17\xc4\xc1\x9f\xef\x17\x2a\xdd\xf7\xe9\xaf\x3f\xf7\x07\xe5\xd2\x3d\x90\x1f\xb5\x20\x77\xde\x27\xe3\x3c\x27\x74\x9b\x7b\x97\xb7\x49\xb9\xe5\xed\xb8\x35\x62\x0c\x80\x38\xe8\x3d\x60\xfc\xbf\x8f\x01\xd0\xbc\xe3\xd4\xd2\xce\x3f\xe2\x66\x1a\xbc\x98\x1f\x5d\xc4\xf5\xb0\x43\x95\x0d\xd2\x76\x27\x27\xa8\xc9\x79\x4d\xdb\xf2\xe1\x8e\x09\x53\xf3\x06\x39\xb4\x71\x1e\xc4\xc1\xc7\x40\xb8\x40\x0a\xd3\xe2\xce\x36\x4e\xa6\xb9\x21\x9d\xba\xb7\x48\xd4\x6f\x5f\xa3\xee\xb2\xeb\xe4\x46\x49\x76\x9f\x39\xb8\xd4\x3c\x36\x11\x71\x41\x1c\x7c\x0c\x60\xc7\xb2\x97\xaa\x7f\xa1\xa6\x7a\xf0\x32\x3b\x32\x84\xf5\x72\x17\x6e\xe7\x12\x61\x99\xae\x71\xb8\xa6\x19\x46\xa9\xa3\x20\x2f\xf4\x81\x07\xc4\xc1\xc7\x40\xb4\xab\xd2\x3a\xc6\xc7\xd4\x1f\x78\x7a\xfc\x94\x4f\xa5\x35\x2a\x09\xde\x31\xb7\x27\x1f\x2d\x7a\xde\xb2\x9f\x8c\xf5\x6f\xe8\x80\x4a\xcc\x82\x38\xa4\x31\x30\xd5\x67\xab\xd8\x23\xad\xdb\x42\xb3\x52\xb3\x9e\x4e\xf8\xfb\xe0\xdb\x6d\x59\xdd\x8b\xfe\x64\x71\x1f\x7a\x0d\xd3\xe6\x93\x62\xa1\x31\x00\xe0\xa0\xf7\x80\xf7\xff\x65\x0c\x18\xff\x3b\x13\x75\xba\x11\x96\x96\xb9\x16\xee\x9a\xc7\x90\xfb\x5b\x57\xef\x73\x72\x27\xeb\xd2\x88\x25\x41\x75\x80\xb7\x5c\x28\x76\x05\x09\x0d\xb1\xe8\xed\xf3\x08\x53\x09\xe2\x90\x8d\x70\x62\xec\x93\x83\xf1\x5f\xde\xb6\xea\x7a\x32\x7f\x04\x67\x49\x94\x78\x1f\xe0\xf5\x95\xb6\x29\x1d\xfa\x06\x58\xf5\x33\x13\xde\xfe\x02\x2d\x28\x02\xb8\x40\x19\x14\xd4\x7f\x46\xde\x94\x8c\x5b\x33\x28\xc2\x23\x8c\xb8\xa2\x4d\x5b\x26\x49\x76\x68\x34\x89\xc2\xfa\xc7\xf9\x9e\x8b\x1e\x37\xdd\x01\xad\x87\xbc\x20\x22\x32\x88\x0b\x94\x41\x39\x87\xf2\xff\x56\x32\x93\xf3\xff\x7c\x9c\xb4\x7e\x7e\x9d\xac\x03\x63\x6a\x24\x8a\xa4\xbc\x78\x59\xfb\x33\x63\xba\x8a\xe1\xd4\x22\xd3\x90\x88\xf0\xd7\x2a\x91\x07\x6a\x5c\x81\x28\x28\x81\x37\x50\xfc\xfc\x7c\xff\x7f\xfc\x25\xf7\xe3\xc2\xbc\x31\xba\x30\x62\xfa\x3a\x65\x9a\x16\xb5\x9a\xb8\x6b\x43\xd2\xca\x4c\x23\x78\x06\xf1\x2d\xe7\xb9\x4a\x3b\x2f\xfe\xbd\x5a\x09\x0a\xfd\xff\x80\xfe\x7f\x01\x00\x00\xff\xff\xe8\x12\xf5\x3e\x4b\x5a\x21\x00") func fixtures_assetsCarButterflynetCarBytes() ([]byte, error) { return bindataRead( @@ -100,7 +91,7 @@ func fixtures_assetsCarButterflynetCar() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/car/butterflynet.car", size: 2185801, mode: os.FileMode(420), modTime: time.Unix(1641974193, 0)} + info := bindataFileInfo{name: "fixtures/_assets/car/butterflynet.car", size: 2185803, mode: os.FileMode(420), modTime: time.Unix(1644061871, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -120,7 +111,7 @@ func fixtures_assetsCarCalibnetCar() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/car/calibnet.car", size: 1101076, mode: os.FileMode(420), modTime: time.Unix(1626679099, 0)} + info := bindataFileInfo{name: "fixtures/_assets/car/calibnet.car", size: 1101076, mode: os.FileMode(420), modTime: time.Unix(1624848219, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -140,7 +131,7 @@ func fixtures_assetsCarForcenetCar() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/car/forcenet.car", size: 1050831, mode: os.FileMode(420), modTime: time.Unix(1636011044, 0)} + info := bindataFileInfo{name: "fixtures/_assets/car/forcenet.car", size: 1050831, mode: os.FileMode(420), modTime: time.Unix(1636425432, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -160,7 +151,7 @@ func fixtures_assetsCarInteropnetCar() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/car/interopnet.car", size: 1000900, mode: os.FileMode(420), modTime: time.Unix(1626679099, 0)} + info := bindataFileInfo{name: "fixtures/_assets/car/interopnet.car", size: 1000900, mode: os.FileMode(420), modTime: time.Unix(1624848219, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -180,7 +171,7 @@ func fixtures_assetsCarMainnetCar() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/car/mainnet.car", size: 1104195, mode: os.FileMode(420), modTime: time.Unix(1624501759, 0)} + info := bindataFileInfo{name: "fixtures/_assets/car/mainnet.car", size: 1104195, mode: os.FileMode(420), modTime: time.Unix(1642754418, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -200,12 +191,12 @@ func fixtures_assetsCarNerpanetCar() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/car/nerpanet.car", size: 2637671, mode: os.FileMode(420), modTime: time.Unix(1633763138, 0)} + info := bindataFileInfo{name: "fixtures/_assets/car/nerpanet.car", size: 2637671, mode: os.FileMode(420), modTime: time.Unix(1617015079, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _fixtures_assetsProofParamsParametersJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x9a\x49\x6f\x23\x49\x92\x85\xef\xf5\x2b\x12\x79\x6e\x0d\x7c\x37\xb7\xbe\x91\x94\x48\x82\x1b\xc4\x9d\xe2\xa5\xe1\xe6\x6e\x2e\x2e\xc5\x35\x48\x8a\xe2\xa0\xff\xfb\x40\xd5\x68\x0c\x30\x0a\x66\x77\xa1\x33\xab\x72\x6e\x82\x80\x40\x04\xbf\x78\x6e\xcf\xec\x59\xfc\xf7\x2f\x5f\xbe\x7c\xbd\x28\xff\xc0\x9b\xfd\xe9\xfd\xa1\xe0\x78\xda\x1d\x1f\xce\xfb\x14\x4e\xfc\xb0\xe1\xe3\xfa\x57\x3e\x1d\x99\x1f\xf6\xbb\x82\x97\x69\xb7\xfd\xdb\x22\x14\x0b\x3e\x3e\xf8\x07\xf1\x20\x1e\x9c\xcc\xc1\x61\xd6\x9e\x30\x46\x00\x49\x41\x01\x39\x10\x52\x19\x90\x86\x0c\x07\x80\x4c\x1c\x58\x58\xd6\x1f\x7f\x7a\x8b\xd1\x04\xa3\x09\x74\xd0\x22\xfe\xd7\x3e\x1c\xc3\xa6\xf8\xfa\xd7\x2f\x1f\xcf\xf1\xe5\xcb\xd7\xb8\x4c\x5f\xff\xfa\xe5\x6b\x7f\x13\xec\xb4\xe3\x02\x0d\x0f\x2f\xaf\x78\x1e\xf7\x2b\x73\xfd\xd4\x1c\x2a\xef\xa8\xe8\x15\x8b\x00\xbb\x4a\xa3\x68\x55\x1f\x8d\xaf\x1e\xd4\xe1\xeb\x5f\xfe\x71\x71\x5a\xbe\x72\x71\xfa\xb8\x3e\xea\x90\x80\xc8\x1a\x34\x20\xc8\xab\x90\xac\xe2\x24\x40\x04\x26\x32\xd9\xfc\xf3\x8a\x7f\xfc\xdc\xbf\x15\xcb\x1b\x7f\xfd\xeb\x17\xab\x9d\x07\x81\x52\xfd\xf2\xe5\xcb\xdf\xff\xf2\xe7\x82\xb9\xac\x4b\xa0\x8c\x03\x64\x6c\x9d\x5a\xdd\xe2\xd0\x6a\xe9\x42\xcf\x67\x6b\x37\x7d\xaf\x9b\x6b\xab\xf3\xe4\xeb\xcb\xc3\x4b\xb1\x9e\x37\x5e\xd7\xbe\x51\x7b\xbc\x7c\x86\x82\x68\xa2\x25\x48\xc6\x8a\x18\x30\x05\x6d\x7c\x44\x29\x9c\xc7\xac\x52\x84\xfc\xc3\xa1\xa0\x92\x5e\xa0\x45\x96\x28\x7d\x52\x4e\x5b\x41\x9e\x5d\xcc\xac\x24\x10\xa5\x24\x82\x4a\x3e\xb1\x95\x4c\x1c\x95\x43\x01\x9e\xb4\x33\x04\xd2\x86\xe4\xf4\x7d\xb5\xf4\x97\x23\x73\xa8\x36\x76\xe9\x38\xe9\x3d\xbd\x4e\x46\x8f\xb3\x6b\xb5\xf7\x98\x9e\x29\x3c\xfa\xca\x2b\x0c\xaf\x7a\x3e\x3a\xc8\x5b\x73\x06\x38\xfc\x0c\xc6\x06\x4e\x49\xc5\xac\xd9\x46\x11\xa4\x75\x4a\x27\xeb\x82\x24\xa3\xa5\x14\x21\x95\x83\xf1\xda\x7b\x27\xfc\x4f\x80\xa5\x54\x2b\x29\xee\xdb\xe3\xfe\xa5\xd9\xf5\x83\xfa\x60\xd2\xa6\xb5\x7c\x6f\xe6\xa7\x43\x37\x56\x6f\x8b\x53\x7d\xda\x1e\xec\x71\xd8\x7b\xda\x4c\x0f\x1a\x96\x9f\x91\x04\x4a\x5e\x7c\xdc\xca\x9a\xa4\x51\x06\xd0\x26\x33\xa5\x10\x45\x52\xec\x3c\xfc\x60\x24\x99\x90\x05\x5a\x62\x4a\x09\xc0\x4a\x19\x3f\x1e\x86\xd0\x01\x99\xe4\x81\x82\x27\x1f\xac\xb2\x9c\x42\x10\x2c\x9d\x4d\xac\x34\x05\x63\x8d\x95\x42\xa2\xb9\xaf\x94\x97\xae\x6b\xbe\xc2\x66\xb5\xb9\x54\xf4\xbc\x39\x2a\x0e\xeb\xa2\x90\x79\x9d\xde\x1f\x57\x67\x9b\x1e\x37\x9d\x65\x75\xde\x68\xd9\xfd\x0d\xdf\xf1\x33\x16\x2d\x65\x46\x15\x34\x83\x15\xda\x45\x4e\x42\x92\x8c\x42\x28\x9b\x65\x0e\x22\x96\x63\x51\xc2\xfc\x0c\x4c\x4a\x65\x12\xfa\xc5\xa8\xd3\xd1\xdb\x68\xd3\x9b\x7b\xab\x5c\xc2\x72\xd7\x1a\x56\x73\x92\xab\x45\xff\x58\x51\x3b\x77\x8e\xf5\x0c\x33\x9e\x80\x79\xfe\xcc\x83\x43\x0a\x09\xc1\x1b\x74\xe8\x51\x24\x2d\xb2\x02\x83\x20\x7c\x04\x04\x90\x3f\x8a\xc7\x07\x11\x4d\x90\x8d\x09\xa8\x9d\x62\x8d\xde\x6a\x87\xe6\xb7\x82\x4f\x11\x8d\x50\x8a\xa5\xf4\x4a\x4a\x36\x98\x93\x03\x95\xac\x22\x8e\x32\x52\x4e\x16\x31\x49\x7f\x5f\x23\xdc\x3b\x3c\x5e\x8a\xcb\x7b\xd8\x98\xcb\xe1\xad\xb6\x2e\x4e\x74\x7d\x25\x1c\xc2\x60\xfe\x34\xe6\xea\xe3\xb1\x75\xa9\x4e\xdb\x71\x5f\x6f\x1f\x5d\x49\x35\xd1\x8a\xac\xf6\x5e\x73\x32\x19\xd0\x44\xc2\x24\x12\x59\xaf\x93\x48\xd9\x62\x39\x13\x6d\xb4\x45\xd0\x5e\xbb\x9f\x01\x4d\x79\x45\xe9\x4c\x8f\x6e\xb3\xeb\x8c\x9f\x87\xb1\x35\x7f\xdb\x55\xe3\x7a\x7a\xa8\x70\x6b\x7d\xac\x3e\x57\x5a\xcf\xbd\xce\xcd\x6f\xa6\x95\x3c\x4a\x9b\x59\xf3\x33\x16\xe3\x10\x05\x93\xa4\x6c\xa5\xc5\xa8\xd1\x04\x29\xb4\xc0\xac\x1c\x46\x49\xee\x87\x63\x51\x0f\x52\x28\x96\xc6\x98\x00\x8c\x01\x81\x29\x4b\xd6\xc9\x79\x6b\xd3\x87\x49\xb3\x73\x51\x48\xc9\xc1\xb9\x8c\xda\x25\x24\x15\xad\xf0\xd9\x43\x56\xd9\xeb\x00\xf7\x15\x93\xfa\xc5\x12\xcf\xf5\xc5\xb5\x8d\xb1\xf1\x76\x6e\x9b\x63\xf3\xfc\xd6\xee\xef\x9a\xeb\x9b\x3b\xef\x5f\x46\xb5\x9b\x19\xa7\xce\xf2\x5d\x5e\x2a\xaa\x04\x8d\x52\x3a\x3a\x9d\x28\xa1\x49\x2c\xad\xf6\x42\xb8\x20\x4d\xd6\x20\x01\x59\x97\xa3\x71\x1e\x24\x1a\x70\xa0\xdd\x4f\x80\xa6\x54\x31\xcf\xcb\x63\x7d\x86\x6f\x33\xc4\x65\xb7\x51\x71\xb7\xfa\x8b\xaa\x5d\xe2\x31\xc5\xc7\xf5\x0a\xf4\xcc\x74\x9f\xdd\x63\x27\x9d\x2f\x7b\x5a\x97\x14\xdb\xc8\x1a\xc9\x49\x93\xc0\xfb\xa4\x03\x67\xe5\x28\x44\x49\xca\x5b\x25\x13\xde\x69\xe2\xee\x61\xd9\x1f\x77\xbb\xfc\xb0\xcb\x0f\xc5\x3e\x44\x3e\x2d\x37\xfc\x90\xc3\xaf\xbf\x52\x88\xeb\x7f\x5d\x7b\x85\x04\x91\x48\x66\x8d\x86\xb4\x4d\x88\x56\x59\xa5\x94\x67\xd6\x16\x25\x1a\x92\x5a\x22\x26\x65\x51\x7b\x61\x8d\x4c\xd1\x2a\xcc\x24\x04\xa2\x40\x47\xe2\xbe\x72\x26\xd7\x55\x7d\xf0\xbe\xd8\xbc\xf7\xc3\xfc\xe9\x54\x5b\xc0\x76\xad\x02\x45\xe8\x2c\xea\xeb\xdb\x62\x3b\x98\x99\x63\x6c\x1e\x6a\xb5\xfd\x72\x3d\xf8\x8c\x08\x9c\x14\x84\xd9\x2b\xca\xd1\x7b\x23\x2c\x41\xf0\x5a\x91\xb3\x32\xb2\xca\x77\x0e\xd5\xa7\xfa\xfb\xe7\xb2\x29\x95\x4e\x1c\xda\xd6\xbc\xf0\x33\x3d\x4a\xa7\xf5\x53\x75\xdf\xac\xa4\xf1\xcb\x2a\xf5\x1e\x0f\xb1\x03\x79\xda\xaf\x9f\xfa\x37\x87\x9b\xfd\xf6\xac\x66\x9f\xb9\x88\x0f\xa7\xf4\x1f\xb7\xd0\x8e\x30\x59\xb6\xd2\x72\x44\x20\x1f\x09\x50\xdd\xe9\xe8\xbe\x33\x97\x98\xc9\x64\x09\x9e\x88\x40\xc6\xac\x38\xe6\x98\x8c\x0a\x31\x46\xb6\xd6\x93\x02\x89\x18\xc8\x64\xb2\x18\x09\x7c\x56\xc6\xeb\x8f\xa6\x8f\xf3\xc7\x11\xbb\xaf\x99\xf1\x72\x70\x05\x79\xbe\xe6\xcd\xf8\xc9\x4f\x74\x13\x8b\x69\xa5\xa8\xcc\x76\x5d\xef\xdb\x03\xc3\x3b\x59\x7d\xbf\x5c\x62\xbd\xc7\xa3\x4e\x89\x66\x64\x80\x64\x02\x46\x1f\xac\x50\xc1\x20\x70\x42\x15\xac\xd1\xce\x85\xac\xf5\xef\x1a\x03\xfe\x5c\x40\xa5\xc2\xc9\x35\x4e\x69\x55\xdf\x4f\x4f\xe1\x72\xcb\x4f\xb7\xf9\xbe\x95\x6f\xc3\xb0\x6a\xf4\xde\x72\xc7\x0c\x56\xf5\xd9\xb4\x72\xa9\xe0\x68\xb8\x1d\x4d\x4a\x4a\x71\x0a\x8c\x60\x13\x9b\x2c\xa4\xcc\x52\xc8\x6c\x83\xca\xde\x25\x99\x42\xa0\xf0\x87\xc1\xd1\x1c\x84\x35\xca\x47\x4c\x52\xfe\x36\xa2\x69\xab\x30\x26\xd6\x2a\x27\x2d\x42\xa0\x64\x45\x86\xa4\x22\x6a\x67\x21\xca\xa4\x9d\x15\x14\x83\x66\xcf\x01\xf9\xbe\x7a\xe2\x70\x74\x78\x8c\xf5\x49\xa7\xd1\x98\xbc\xdc\xe4\x76\xb5\x18\xcf\xa1\xea\xf2\xba\x7d\xaa\x9e\x37\x45\x67\xfc\x76\x35\xdb\xf5\x42\xa9\xd1\xad\x64\x56\xf2\x2a\x7a\x2f\x9c\x23\x46\xe7\x89\xac\x15\xe1\x63\x84\x15\x39\xbb\xa8\x8c\xbc\xe3\x55\xdf\xf7\x64\xfd\xc7\x6c\x4a\x85\x33\x1c\xd5\x66\x75\xb5\xdc\x37\x2a\x3a\xbb\xcd\x79\xb2\x73\xeb\x66\x54\xe3\xc1\xf0\xea\x9e\x6f\xf3\x6b\x63\x7c\x38\xc3\xf9\x7d\x1d\x9a\xb6\x3d\xfe\xcc\x25\xe7\x04\xf8\x61\x54\x1f\x86\xa5\x00\x25\x06\xb6\x94\x54\x42\xc3\x21\xde\x6b\x6f\xbe\x2f\x17\x2b\x22\x68\xe7\x13\x07\xb4\xa8\x39\x09\xf4\xc8\x20\x10\x4c\x52\x5e\x28\xc3\x39\x60\x92\xd6\x25\xeb\x2d\x01\x73\x90\xc4\x4a\x91\x62\xb0\x3a\x6b\x2d\xbf\x51\x71\x70\x58\xbd\xb5\x7a\xc7\xb8\x1a\xd4\x1f\x97\xf5\x68\x1a\xb1\xb2\x3f\xa4\xca\xbe\xe7\x6e\x38\x83\xee\x7e\x7c\x74\x6e\xd3\x52\xeb\x4a\xab\x64\x4a\x00\x21\x24\x48\x8e\x19\xb4\x36\xfc\xe1\x06\x46\x43\x44\x2d\x1c\xb8\x90\xbd\xfa\xf7\x87\xc9\x3f\x17\x4f\xa9\x6c\x68\x33\xee\x06\x3d\x22\x9a\xea\x99\x5d\xd7\x17\x4f\xd7\xc2\x4d\x5f\x6b\xa6\xcd\xd3\x91\xf4\x2f\xcb\x4b\x98\x6c\x66\x8f\xeb\xaa\xab\xf4\x1a\x25\x68\x90\x3f\x0e\x51\xb6\x2e\xa7\x60\x14\x80\xd1\xac\xad\xb0\x9a\x53\x48\x3e\xdf\x19\x28\xbf\x3f\x1a\x85\xc6\x80\x4d\x64\x95\x86\xa0\xd8\xeb\xa8\xd9\xaa\x9c\x5c\x54\x24\xb4\xb7\x18\xa4\xd7\x32\x19\xcb\x49\xf8\x68\xb2\xb6\x89\x32\x06\x2f\xb4\x74\x36\x7c\xc3\xab\x52\xef\xa9\xa3\x06\xa7\x43\xc7\xaa\x46\xbf\x77\x5e\xf9\xf3\xcd\x6d\x26\x2b\x3b\xd7\xa6\x37\xd9\x52\x68\xc9\xf7\xee\xfb\x42\xee\x66\xa7\xea\xb5\xa4\x05\x34\x68\x10\x89\xc0\x05\x01\x4e\x79\x6f\x3c\xba\x8c\xce\x6b\x23\x74\xb6\xf6\xff\x0b\x9e\xf2\x34\x6f\x39\x79\xa9\xf5\xc7\xaf\x47\xf7\x22\xf5\x7e\x5e\x3f\xfa\x10\xa7\xfb\x61\xd7\x5c\x2f\xa3\xd9\x38\xc5\x4b\x63\x73\x7d\x3f\x37\xa9\xbd\x28\x62\x49\x14\x61\x92\xc9\xcc\x21\x26\x0c\x94\x7f\xab\x3c\xc8\x59\x12\x99\xe4\x73\x12\xe2\x0f\x42\x03\x09\x34\x92\x8f\xd9\x89\x2c\x49\x80\x40\x66\x26\x66\x00\x2d\x58\x21\x38\xaf\xad\x55\x6c\xc8\x61\x0c\xe4\xd0\x1b\x8e\x42\x79\xeb\x9c\x8e\x16\xfc\x37\x6a\xce\xe4\xb5\x56\xb4\xea\x83\x59\xbb\x73\x3e\x8f\x17\x23\x1d\xba\x2f\x6f\xed\x49\xa3\x57\xc1\xe3\x23\x0f\xdc\x63\xed\x58\x40\xac\xb0\x3f\x2e\xab\xa3\x32\x9f\x02\x6d\xd1\x18\xa1\x0d\x66\xf6\xd9\x06\x21\x1d\x83\x45\x8f\xa8\x09\xee\x4c\xe1\x3f\xc0\xc8\xff\x63\x40\xe5\x5d\x4e\x45\xcb\x4c\xb5\xe9\x6e\x35\xdc\x2c\x86\x8d\xcb\x25\x5f\x37\xd7\xf0\x52\xdb\x77\x77\xb3\x67\xb4\xb7\xa7\x3e\x16\x9d\x4b\xb5\xd1\xec\x85\xde\x67\x38\x94\x54\x4c\x4e\x65\x67\xa3\x0c\xe4\x4d\x96\x18\x83\x02\x46\x20\x88\xa0\xef\xc4\x36\xdf\x19\xce\x6f\x78\x34\x40\xe2\xe4\xac\x8b\x2e\x5b\x65\xb2\x74\xd2\x83\x13\x94\x33\x1b\x16\x41\x46\x2b\x93\x0d\x20\xa2\xb1\x1f\xe0\x52\x60\x1f\x14\x58\x6b\x41\x6b\x4e\xdf\xda\x1f\x8c\x37\x39\xb6\x4e\x6e\xbf\xbb\x6d\xfd\x36\x1d\x64\x6b\x52\xbd\x75\x06\xab\x41\x2b\x35\xbb\xa3\xe7\x64\xf2\x2e\xf8\xe5\x9b\x2d\x56\xd5\xf9\x67\x40\x2a\x66\x83\x4c\xca\x65\x99\x99\xd1\x44\xff\xf1\x2a\x82\x46\x91\x12\x99\xe8\x7f\x5f\x58\xf1\xe7\x22\x2a\xd5\xcf\x00\x97\xd8\xee\xe8\xcb\x62\x51\x39\x8c\xaa\x8d\x95\xa4\xe7\xe7\x1a\x74\x2e\xeb\xfd\xe9\x7a\x6c\xe2\xe0\x72\x6d\x5d\x3b\x3d\x79\xb9\x14\xd5\xa7\x92\xf1\x2a\x7b\x8e\xd6\x28\xe3\xad\x75\x3e\x07\x6d\x9c\x8f\xc2\x39\xc6\xcc\xc9\x2b\xfa\x03\xf1\x58\x8b\x6c\xbd\xcc\x42\x29\x22\xc3\x86\xa3\x63\x90\xc8\xd6\x69\xca\x82\x85\x72\x21\xb9\xc4\x46\xb1\x75\x51\x7a\x90\x26\xa8\xe8\x50\x91\x24\xef\x13\x7c\xa3\x4f\x4e\xa7\x78\xdb\xc3\xde\xbc\x1d\xe9\x71\x97\x37\xcd\xd4\x58\x2c\x97\xd7\x2d\x2e\x8f\x95\xd8\x03\xd8\x4c\xb0\xf2\xd4\x9c\x57\xc3\xe8\x24\x4b\x02\xf4\xe4\x4d\x06\x0c\xd2\x65\x36\x82\x91\x95\x0d\xda\xb1\x92\x02\x88\x24\x85\x3b\xe5\xf9\xe7\x44\x54\xaa\xa0\x79\xed\x72\x6d\xc7\xf6\x33\xc2\xe5\xb1\xb2\xf6\xbd\x6b\x81\x03\x99\xa7\xa7\xc3\x7e\xd5\x3f\x56\x16\x8b\x3c\x7b\xde\xd5\x96\x72\xbb\x7e\xdc\xd5\x4b\xda\xe5\x28\x14\x1a\xed\xc0\xa7\x24\x25\xb2\x43\x86\xfc\x51\x8a\x94\x60\xef\xe5\xef\x0c\x49\xff\x03\x3c\xea\x41\x39\x05\x6c\x84\x70\xe4\x20\x23\x46\xce\x88\x22\x8a\x60\x20\x59\xa3\x5c\x24\x08\x24\x82\x08\xc9\xfa\x1c\xa5\x70\xd2\x1a\xa0\xac\x92\xf2\x24\x30\x71\xfe\x46\x8e\x5c\xe9\x99\xcb\xb9\xd2\x5b\xcc\x8a\xba\xbf\x3e\xab\xce\xd5\xae\x54\xc7\xbd\x77\x87\x69\xf7\xda\xb9\xed\xe3\xe5\x50\x6b\x8d\x16\x83\x46\x5b\x96\x8c\xa2\xda\x4b\x41\x00\x5e\x84\xf8\x61\x14\x48\x4a\x05\x06\x91\x65\x46\x13\x91\xee\xb4\x86\xdf\x3d\xfe\xfa\x2e\x88\x4a\x15\x34\x9d\xf8\xe3\x61\xde\xb9\x16\x72\xd7\xef\xe1\xea\xda\x9b\x6e\xb6\x23\xf9\x92\x5e\x3b\x6f\xb5\x58\xc4\x0b\x9a\x49\x65\x70\x5c\x34\xb3\x1c\x41\x49\xcc\x8e\x49\x51\x96\xde\x42\x48\xd1\x62\x30\x59\xf8\x1c\xb3\x0a\x39\x04\x94\xee\x4e\x0d\xfa\x21\x78\xc8\x29\x81\xde\x29\x4c\x02\xd0\x38\x46\xa1\xbc\x54\xc0\x20\x14\x5a\x4e\x88\x2e\xb3\xe6\xa4\x2c\x89\x8c\xd9\x7b\x26\x27\x3f\x70\x91\xd1\xde\x06\xfd\x0d\x17\x9b\xac\x8f\xb3\x28\x87\x9d\xb8\x7f\x8d\xe7\xd4\xb6\x2d\x65\x9b\x4d\xd4\xfd\xcb\x00\x4f\xbd\x62\xb2\x98\x8c\x5e\x9a\x1b\x3b\x7e\xdf\xcc\x2a\xb7\x12\x17\x93\x20\x02\xca\x90\x2c\x05\x56\x8a\x83\x93\x59\x71\x00\xe7\x9c\x16\x5a\xdd\x99\xbb\x7e\x4e\x44\xe5\xb3\x57\xee\xaf\x9e\x1f\xe1\x69\x7f\x5b\x2d\xa6\x8d\xcd\x65\x5a\x29\xde\x7b\x6a\x53\x99\x9b\xe7\xf8\xb2\x28\xb2\x3e\xaf\xce\x8b\x31\xd6\x86\xe7\xea\xe6\x33\x1e\x97\x34\x78\x94\xc6\x67\x72\xc6\xb9\x24\x80\x59\xb2\x32\xc9\x29\xfc\xe8\xed\x7f\x1f\x9e\xe2\x14\xe2\x9a\xd3\xff\x62\x3a\xf2\xfe\xd7\x65\x0c\xa7\xe5\x6e\xfb\xaf\xbb\xc4\x62\x11\x94\x75\xff\xfc\x9f\xd0\x2a\x69\xa9\x7d\x52\xca\x0a\xc7\x51\x08\xaf\x38\x81\x22\x95\x22\x05\xe9\x53\x96\xde\x00\xa0\x30\xac\x2d\x85\xcc\xec\x15\x69\x40\x4d\xc2\x79\xad\xbe\x51\x92\xa6\x91\xbb\xaf\xdb\xe9\x4b\x67\xb7\xef\x9e\xbb\xa6\xb2\x6b\x74\x2f\x8d\xa7\x70\x86\x53\x8f\xed\xb8\xed\xf5\xac\xbe\x6a\xda\x09\x56\x25\x2c\x4a\xd2\x31\x6d\x32\x49\xad\x3d\xc7\x1c\xb2\xc8\x16\x95\x75\x59\x8b\x94\xd8\xa0\xf3\x77\xa2\xc3\x4f\x21\xc7\x4f\x85\xaa\x7c\x2b\xba\x09\x8b\x7d\xbd\x56\x9c\xba\xe3\x43\x73\xa9\x0e\x8d\xd3\x64\xf7\xb8\x1d\x1c\x8b\xd9\x62\x99\xbc\x3b\x14\xf9\xb2\x7b\xaf\x8d\xda\xad\x43\xf3\x58\xe2\xfd\x51\x86\xc4\x88\x0a\x43\x62\x09\xc2\x2b\xed\xb3\xb4\x56\x1b\x2d\x8c\x09\xff\xee\x96\xf8\x7b\x62\x72\x14\x28\x1b\x17\x59\x1b\x13\xd8\xa0\x4d\xd6\x7a\x06\x00\x11\xac\xb7\xa4\xb4\x57\xc9\x9a\xac\x94\x0d\xd9\x73\x12\x1a\x81\x3c\x31\x44\x9d\x63\x32\xa0\xbe\xb1\x50\xaf\xee\x47\x27\xe8\x4c\x7b\x95\xe9\x51\xb6\x66\xa3\xc5\xc4\x4e\xae\x33\x78\x2b\xfa\xf5\x4e\x92\xcf\xcd\x63\xe3\x65\x42\xc7\xb1\x7c\x9a\xaf\x6a\x25\x67\x30\x02\x58\x04\x26\x94\x81\x50\xbb\x28\x23\x67\x13\xb3\x44\xa6\x20\xe9\x4e\x9c\x58\x3e\x89\xfc\x54\xbc\xca\x1d\x6f\xb9\xdb\xae\x0f\x4d\x55\x75\xa3\xd9\xf2\x72\xab\x0e\xfb\x3c\x7c\xaf\x5e\x77\xab\xb0\xac\xd4\xe9\xb6\x58\x9d\xde\x5e\x06\xc7\xfc\x96\xfc\xb6\x64\x83\x2a\x9c\x95\x80\x29\x48\xcc\xc4\x56\x5a\x2b\x40\x39\x70\x00\x59\x28\xaf\x34\xff\x59\xac\x38\x26\xe7\xb5\x33\xde\x4a\x15\x48\x82\xb3\x39\x04\x15\x6c\x96\x86\x02\x19\x9f\x1d\x38\x76\x5a\x1b\x07\x59\x84\xe0\x43\x48\x86\xac\x4d\x91\x84\xb3\x8a\xe8\xbe\xb6\x9e\x67\x95\xe7\xe7\x73\xff\x74\xee\xdf\x60\x7e\xd3\xdd\x66\xb7\xd2\x7d\x3a\x15\x2f\x6f\x87\xae\xdc\x61\x53\xc6\xe2\xb9\xc3\xcb\xee\xb8\xff\x36\x2f\xe3\x85\xec\xa4\x62\xc3\x4c\x10\x04\x13\x5a\x07\x18\xbc\x37\xc2\x64\x74\xf7\x3e\xd6\x28\x4b\x48\x7e\x2a\x5a\xa5\xca\x7a\xa9\x9d\x97\xfb\xfa\xfb\x65\x32\x95\x8d\xdd\x2a\x75\x8f\xab\xb6\x6c\x6d\xbb\x3b\x9a\x9d\x46\xe6\x36\xa8\xcd\x0b\x59\x6b\x5c\x57\xcb\x5b\x81\x25\x9b\x56\x72\x1e\x88\x09\x43\xa2\x84\x29\x10\x2b\x67\x03\xb0\x76\x4a\x78\xa9\xf9\xce\xa6\xf5\xfb\x92\xf2\x9f\x48\x79\x15\xb4\x85\xa4\xb2\x8a\xc1\xcb\x14\x9d\x24\x32\x36\x9b\x00\x4e\x79\x01\x81\x13\xb3\x24\x11\xac\xce\xc9\x45\xc3\x00\x64\x5c\x10\x92\x32\x67\xf0\xea\x1b\x4b\x57\xde\xbe\xee\xbb\xce\x9b\x59\xa7\x9f\x1b\x1e\xac\x19\xed\x76\xdb\xe2\xf6\xfa\xf4\xaa\xa8\xcf\x95\xc6\x38\x6c\xed\x79\x36\x6a\x8e\xfb\xb7\x56\x49\xcd\x0a\xda\x7b\x01\x2a\x58\xe9\x63\x36\x8e\x29\x39\x27\xb3\x8d\xd1\x38\x14\xe2\xce\x8e\xe8\xde\xec\xf2\x53\x11\x2b\xcf\x9a\x50\x3f\x75\x8f\x95\xc7\x59\xa5\xed\x6a\xef\xcb\x61\x7e\xf2\xd7\xab\xb1\x79\xdd\xcd\x03\x7d\xbe\xb5\x9f\x9e\x6b\x97\x79\x4d\x6e\xd5\xfa\x46\x25\xa7\x30\x02\x99\x10\xa2\x8c\x46\xe4\x44\xc0\xe4\x15\x45\x6d\x2d\x19\x19\x52\xba\xd3\x33\xfc\x08\x5a\xea\xff\xd0\x42\x97\x25\x99\x20\x4c\xb4\xd1\x4a\x36\x60\x91\x28\x2b\x65\x88\xa2\xe2\x6c\x83\x51\x11\xa4\x10\x59\x7e\xf4\x15\x4e\x83\x54\x3a\x4b\x17\xbc\xb1\x29\x65\xfa\x86\x27\x0e\xe1\x9d\xdd\x60\xa9\xba\xb9\x7e\xab\xad\xe3\xb8\x05\xf5\xbe\xbb\x5d\x1f\xdb\xe7\x96\x6b\xb9\xaa\x5f\xdb\xe7\x1e\xbc\xdd\x86\x03\x2c\x4a\x96\xd7\xd2\x0b\x99\x7d\x70\x1f\xaf\x4a\x50\x64\x12\x22\x46\x05\x5a\x1a\x22\x1b\x7f\xef\xe7\x20\x3f\x15\xb1\x52\x7d\xf1\x62\xb8\xa9\xb9\xea\xe2\xf8\x3a\x98\x87\xf5\xf3\xe3\x29\x28\x7e\xdb\x35\x71\xbb\x2b\x7a\xb7\xb4\xaa\x1d\xfa\x83\x59\xd1\xab\xf7\xc6\xeb\x4e\x49\x96\x19\x3c\x7a\x6f\x94\x55\x51\x98\xa8\xd0\x27\x41\x3a\x7a\x49\x39\x79\x6f\xa4\xfb\xf7\xbe\x12\xf9\xe5\xef\xbf\xfc\x4f\x00\x00\x00\xff\xff\x2f\x4a\x9a\x61\x09\x2d\x00\x00") +var _fixtures_assetsProofParamsParametersJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x9a\x49\x6f\x62\x4b\xf6\xed\xe7\xf7\x53\xa4\x72\xfc\xf7\x53\xf4\x7b\xef\x9a\x01\xa6\x11\x06\x44\x0f\xf6\xa4\x14\xcd\x0e\xd3\x5c\xda\x03\x18\xf3\x54\xdf\xfd\xc9\xb7\x54\x7a\x52\xf9\x90\xf5\xbf\xaa\xcc\xbc\x39\xb3\x2c\x1d\x01\xbf\xb3\x62\xed\x15\x2b\xe2\xff\xfe\xf6\xe5\xcb\xd7\x8b\xc2\x07\xde\xec\x4f\xef\x0f\x05\xc7\xd3\xee\xf8\x70\xde\x27\x7f\xe2\x87\x0d\x1f\xd7\xbf\xf3\xe9\xc8\xfc\xb0\xdf\x15\xbc\x4c\xbb\xed\xdf\x17\xbe\x58\xf0\xf1\x01\x1f\xc4\x83\x78\x70\x32\x7b\x47\x59\x63\xa0\x18\x01\x64\xf0\x0a\x82\x03\x21\x95\x01\x69\x82\x61\x0f\x90\x03\x7b\x16\x96\xf5\xc7\x9f\x68\x29\x1a\x6f\x74\x00\xed\xb5\x88\xff\x67\xef\x8f\x7e\x53\x7c\xfd\xdb\x97\x8f\xef\xf1\xe5\xcb\xd7\xb8\x4c\x5f\xff\xf6\xe5\xeb\x60\xe3\xed\xac\xe3\x7c\x18\x1d\x9e\x5f\xe9\x3c\x19\x54\x5e\x74\xbd\x35\x52\xe8\x42\xd1\x2b\x16\x1e\x76\x95\x66\xd1\xae\x3e\x1a\xac\x1e\xd4\xe1\xeb\xff\xfc\xf3\xe1\xb4\x7c\xe5\xe2\xf4\xf1\x7c\xd4\x3e\x41\x08\xd6\x90\x01\x11\x50\xf9\x64\x15\x27\x01\xc2\x73\x08\x26\x9b\x7f\x3d\xf1\xcf\x9f\xfb\xf7\x62\x79\xe3\xaf\x7f\xfb\x62\xb5\x43\x10\x24\xd5\x6f\x5f\xbe\xfc\xe3\x7f\xfe\x5a\x30\x97\x75\x09\x94\x89\x87\x4c\xed\x53\xbb\x5b\x1c\xda\x6d\x5d\xe8\x97\xf9\xda\xcd\xde\x1b\xe6\xda\xee\xd4\xb1\xb1\x3c\x3c\x17\xeb\x97\xe6\xeb\x1a\x9b\xb5\xc7\xcb\x67\x28\x44\x26\xda\x00\xc9\x58\x11\x3d\x25\xaf\x0d\x46\x92\xc2\x21\x65\x95\x22\xe4\x1f\x0e\x85\x94\x44\x41\x96\x58\x92\xc4\xa4\x9c\xb6\x22\x20\xbb\x98\x59\x49\x08\x21\x25\xe1\x55\xc2\xc4\x56\x72\xe0\xa8\x1c\x09\xc0\xa0\x9d\x09\x20\xad\x4f\x4e\xdf\x57\xcb\x60\x39\x36\x87\x6a\x73\x97\x8e\xd3\x5e\xfd\x75\x3a\x7e\x9c\x5f\xab\xbd\xc7\xd4\x0f\xfe\x11\x2b\xaf\x30\xba\xea\x97\xf1\x41\xde\x5a\x73\xa0\xd1\x67\x30\xd6\x73\x4a\x2a\x66\xcd\x36\x0a\x2f\xad\x53\x3a\x59\xe7\x65\x30\x5a\x4a\xe1\x53\x39\x18\xd4\x88\x4e\xe0\x2f\x80\xa5\x54\x2b\x29\xee\x9f\x26\x83\x4b\xab\x8b\xc3\xc6\x70\xfa\x14\xd6\xf2\xbd\x95\xeb\x87\x6e\xac\xde\x16\xa7\xc6\xec\x69\xb8\xa7\x51\xaf\xbe\x99\x1d\x34\x2c\x3f\x23\xf1\x21\xa1\xf8\xf8\x28\x6b\x92\x26\xe9\x41\x9b\xcc\x21\xf9\x28\x92\x62\x87\xf0\x83\x91\xe4\x40\x2c\xc8\x06\x0e\x29\x01\x58\x29\xe3\xc7\x97\x09\xe4\x20\x98\x84\x10\x3c\x06\xf4\x56\x59\x4e\xde\x0b\x96\xce\x26\x56\x3a\x78\x63\x8d\x95\x42\x92\xb9\xaf\x94\xe7\xae\x6b\xbd\xc2\x66\xb5\xb9\x54\xf4\x4b\x6b\x5c\x1c\xd6\x45\x21\xf3\x3a\xbd\x3f\xae\xce\x36\x3d\x6e\x3a\xcb\xea\x4b\xb3\x6d\xf7\x37\x7a\xa7\xcf\x58\xb4\x94\x99\x94\xd7\x0c\x56\x68\x17\x39\x09\x19\x64\x14\x42\xd9\x2c\xb3\x17\xb1\x1c\x8b\x12\xe6\x57\x60\x52\x2a\x13\x3f\x28\xc6\x9d\x8e\xde\x46\x9b\xde\xdc\x5b\xe5\xe2\x97\xbb\xf6\xa8\x9a\x93\x5c\x2d\x06\xc7\x8a\xda\xb9\x73\x6c\x64\x98\xf3\x14\x4c\xff\x33\x0f\xf6\xc9\x27\x02\x34\xe4\x08\x49\x24\x2d\xb2\x02\x43\x20\x30\x02\x01\xc8\x1f\xc5\xe3\x83\x88\x0e\x90\x8d\xf1\xa4\x9d\x62\x4d\x68\xb5\x23\xf3\x87\xe1\x87\x48\x46\x28\xc5\x52\xa2\x92\x92\x0d\xe5\xe4\x40\x25\xab\x02\x47\x19\x43\x4e\x96\x28\x49\xbc\xaf\x91\x5e\x3f\x82\x5d\xd6\x73\xf4\x8b\xda\x5b\xef\x29\x1d\xb6\xb3\xce\xe9\xba\x5d\x15\xfb\x49\xb3\x39\x34\xcb\x22\xae\x96\x37\xfd\xd6\xd7\xc3\x53\x89\x9b\xc8\xa0\x63\x4e\xe0\xa4\x27\x27\xad\xd1\x99\x38\x28\xd0\x6c\xb4\xf5\xc2\x79\x55\xce\x44\x1b\x6d\x09\x34\x6a\xf7\x2b\xa0\x29\x77\x94\x46\x63\xc2\xf2\x35\xde\xa8\xdb\x6d\x45\xf7\x3c\x43\xbf\x9b\x1a\x7c\x33\x71\x7d\x89\xf5\xe1\xea\x04\xfd\xf5\x7b\x1a\x54\xba\xb9\xd6\x2b\x59\x3a\xde\x91\x91\x84\x1a\xac\x01\x0d\x39\x31\xa2\x48\x8a\x22\x08\x32\x24\xec\x0f\xc7\xa2\x1e\xa4\x50\x2c\x8d\x31\x1e\x98\x3c\x01\x87\x2c\x59\x27\x87\xd6\xa6\x8f\x21\xcd\xce\x45\x21\x25\x7b\xe7\x32\x69\x97\x28\xa8\x68\x05\x66\x84\xac\x32\x6a\x0f\xf7\x15\x33\xa9\xba\xeb\x78\xba\xba\x55\x07\xcd\xf3\x63\x8f\xdf\xdb\xdd\xe3\xb1\x2d\xc3\xfb\xda\xe2\x65\xd1\xdf\x20\x3f\xab\xce\x85\xf6\xaf\x6f\x7e\xbb\x2f\x51\x8c\xd7\xa4\x18\x02\x58\xca\x41\x22\x7f\x58\x0b\x58\x4b\xc1\x72\x64\x94\xae\x1c\x8d\x43\x90\x64\xc0\x81\x76\xbf\x00\x9a\x72\xc5\x00\x99\xf6\xe9\x1d\xd6\xca\xcd\xdb\x58\x7f\x35\xbd\xc7\xfa\xba\x70\x76\xb0\xc6\xa6\x69\x4e\x73\x73\xfd\x76\xb8\xbc\x6f\x2e\xd8\xaa\xbc\x7e\xc6\x82\x82\xb5\x73\x29\xab\x2c\x85\x94\x64\x75\x54\x49\xc8\x08\x01\x22\x31\x23\xff\xf7\x58\xfe\xc5\xe2\xaf\x34\x9b\xfc\x64\x4e\xbb\x6d\x7d\xcc\xfb\x8e\x6b\x98\xf5\x63\x23\xb5\x75\x3e\x82\xca\xb7\xe1\x6c\x37\xec\x67\x3d\x6f\x76\x17\x53\x3d\xec\xcc\x65\x89\xd9\x04\x47\x84\x3a\xd8\x04\x9e\xc0\x2b\x91\x8d\x0e\x3a\xd9\x9c\x95\x37\x9c\xc4\x9d\xa0\xfb\x67\x56\xd5\x4f\x64\x54\xaa\xa1\xe7\xda\xf8\xb9\x3d\xe8\x9f\xf1\xed\xf5\x54\x55\xc7\xee\x0b\xb4\xda\x35\xda\x3e\x5e\x31\xca\x7c\x7b\x1e\xf6\x53\x6d\xb2\xac\x1f\x9f\xcc\xc1\xfa\xb2\xa5\x15\x85\x05\x34\x59\x0b\x23\x15\x65\x30\xd1\x4a\x34\x92\x44\x94\x1c\x01\x7f\x1e\x9f\x1f\x69\x3f\x3d\xef\x07\xf3\xbc\x51\xbd\x0b\xf7\x54\x2b\x43\x68\xeb\x73\xda\x0e\xaa\x6a\xe0\xcd\x66\xd7\x8d\x93\x5d\xfb\xb9\x3d\x72\xbb\x59\xc7\xbd\x95\x64\x3d\x97\x4c\x26\xc7\x2a\x38\x23\xbd\x4b\xe0\xa5\x47\x76\x29\x4a\x69\x6d\x44\xff\xf3\xd6\xd9\x8f\xf2\xa1\xf9\x3b\xbf\xd2\x22\x74\xe1\x4a\xa9\x79\x9e\x9c\x2b\x23\x87\xbb\xdb\x62\xd9\xa8\xf3\xcd\x4c\xd6\xfd\xf1\xeb\xdb\xe8\xb1\x36\x7d\x7e\x6a\x55\x4b\xf8\x20\xe3\x47\xf6\x52\xd1\x3a\xfe\x58\x69\x46\x24\x91\x58\x6a\xab\x85\xf5\x10\xee\x68\xe8\x1e\x9f\xfd\x71\xb7\xcb\x0f\xbb\xfc\x50\xec\x7d\xe4\xd3\x72\xc3\x0f\xd9\xff\xfe\x7b\xf0\x71\xfd\x9f\x33\xa0\x90\x20\x52\x90\x59\x93\x09\xda\x26\x22\xab\xac\x52\x0a\x99\xb5\x25\x49\x26\x48\x2d\x89\x92\xb2\xa4\x51\x58\x23\x53\xb4\x8a\x72\x10\x82\x48\x90\x0b\xe2\xbe\x84\xa6\xd7\x55\x63\xf8\xbe\xd8\xbc\x0f\xfc\x4b\xfd\x54\x5b\xc0\x76\xad\x7c\x88\xd0\x59\x34\xd6\xb7\xc5\x76\x38\x37\xc7\xd8\x3a\xd4\x6a\xfb\xe5\x7a\xf8\x19\x11\x38\x29\x02\x65\x54\x21\x47\x44\x23\x6c\x00\x8f\x5a\x05\x67\x65\x64\x95\xef\x4c\xb0\x4f\x39\xf0\xaf\x65\x53\x2a\x9d\x38\xb2\xed\x97\x02\xe7\x7a\x9c\x4e\xeb\x7a\x75\xdf\xaa\xa4\xc9\xf3\x2a\xf5\x1e\x0f\xb1\x03\x79\x36\x68\x9c\x06\x37\x47\x9b\xfd\xf6\xac\xe6\x9f\xb9\x88\x8f\xc4\x8e\x1f\x1f\xa1\x5d\xa0\x64\xd9\x4a\xcb\x91\x20\x60\x0c\x40\xea\xce\xce\xf2\x3b\x73\x89\x39\x98\x2c\x01\x43\x08\x20\x63\x56\x1c\x73\x4c\x46\xf9\x18\x23\x5b\x8b\x41\x81\x24\xf2\xc1\xe4\x60\x29\x06\xc0\xac\x0c\xea\x8f\xcd\x27\xe7\x8f\x25\xf6\x8d\xd4\xb3\x1c\x5e\x41\x9e\xaf\x79\x33\xa9\xe3\x54\xb7\xa8\x98\x55\x8a\xca\x7c\xd7\x45\x7c\x1a\x1a\xde\xc9\xea\xfb\xe5\x12\x1b\x3d\x1e\x77\x4a\x34\x23\x3d\x24\xe3\x29\xa2\xb7\x42\x79\x43\xc0\x89\x94\xb7\x46\x3b\xe7\xb3\xd6\x7f\xaa\x8e\xf8\x6b\x01\x95\x0a\x27\xd7\x38\xa5\x55\x63\x3f\x3b\xf9\xcb\x2d\xd7\x6f\x2f\xfb\x76\xbe\x8d\xfc\xaa\xd9\x7b\xcb\x1d\x33\x5c\x35\xe6\xb3\xca\xa5\x42\xe3\xd1\x76\x3c\xfd\x0c\xc7\x24\xcf\x04\x36\xb1\xc9\x42\xca\x8f\x00\x94\xad\x57\x19\x5d\x92\xc9\xfb\x70\xc7\x93\x7f\x00\x1c\xcd\x5e\x58\xa3\x30\x52\x92\xf2\x8f\xaa\x48\x5b\x45\x31\xb1\x56\x39\x69\xe1\x7d\x48\x56\x64\x48\x2a\x92\x76\x16\xa2\x4c\xda\x59\x11\xa2\xd7\x8c\xec\x89\xef\xab\x27\x8e\xc6\x87\xc7\xd8\x98\x76\x9a\xcd\xe9\xf3\x4d\x6e\x57\x8b\xc9\x0b\x54\x5d\x5e\x3f\x9d\xaa\xe7\x4d\xd1\x99\xbc\x5d\xcd\x76\xbd\x50\x6a\x7c\x2b\x09\x3e\xa8\x22\xa2\x70\x2e\x30\x39\x0c\xc1\x5a\xe1\x85\x65\x2d\x72\x76\x51\x19\xa9\x7f\xc6\xca\xfa\xaf\xd9\x94\x0a\x67\x34\xae\xcd\x1b\x6a\xb9\x6f\x56\x74\x76\x9b\xf3\x74\xe7\xd6\xad\xa8\x26\xc3\xd1\xd5\xf5\x6f\x2f\xd7\xe6\xe4\x70\x86\xf3\xfb\xda\xb7\xec\xd3\xe4\x33\x97\x9c\x13\x10\x20\x26\x27\x4d\x52\x40\x92\x3c\xdb\x90\x54\x22\xc3\x3e\x86\x9f\xe2\xc4\x56\x44\xd0\x0e\x13\x7b\xb2\xa4\x39\x09\x42\x62\x10\x04\x26\x29\x14\xca\x70\xf6\x94\xa4\x75\xc9\xa2\x0d\xc0\xec\x65\x60\xa5\x82\x62\xb0\x3a\x6b\x2d\xbf\xe1\x38\x34\xaa\xde\xda\xbd\x63\x5c\x0d\x1b\x8f\xcb\x46\x34\xcd\x58\xd9\x1f\x52\x65\xdf\x73\x37\x9a\x43\x77\x3f\x39\x3a\xb7\x69\xab\x75\xa5\x5d\xd2\x56\x80\x10\x12\x24\xc7\x0c\x5a\x1b\xfe\x98\x06\x46\x43\x24\x2d\x1c\x38\x9f\xf1\xce\xce\xbc\xac\xd4\xfa\x6b\xf1\x94\xca\x26\x6c\x26\x5d\xaf\xc7\x21\xcc\xf4\xdc\xae\x1b\x8b\xfa\xb5\x70\xb3\xd7\x9a\x79\xe2\xd9\x58\xe2\xf3\xf2\xe2\xa7\x9b\xf9\xe3\xba\xea\x2a\xbd\x66\x09\x1a\xe2\x8f\x45\x94\xad\xcb\xc9\x1b\x05\x60\x34\x6b\x2b\xac\xe6\xe4\x13\xe6\x3b\xc5\xd6\xf7\x47\xa3\xc8\x18\xb0\x29\x58\xa5\xc1\x2b\x46\x1d\x35\x5b\x95\x93\x8b\x2a\x08\x8d\x96\xbc\x44\x2d\x93\xb1\x9c\x04\x46\x93\xb5\x4d\x21\x93\x47\xa1\xa5\xb3\xfe\x1b\xb3\x2a\xf5\xea\x1d\x35\x3c\x1d\x3a\x56\x35\x07\xbd\xf3\x0a\xcf\x37\xb7\x99\xae\xec\x8b\x36\xbd\xe9\x36\xf8\xb6\x7c\xef\xbe\x2f\xe4\x6e\x7e\xaa\x5e\x4b\xce\x13\x0c\x19\xa2\x10\xc0\x79\x01\x4e\x21\x1a\x24\x97\xc9\xa1\x36\x42\x67\x7b\xa7\xbc\xf8\xf5\xf0\x94\x9f\x2a\x2c\xa7\xcf\xb5\xc1\xe4\xf5\xe8\x9e\xa5\xde\xbf\x34\x8e\xe8\xe3\x6c\x3f\xea\x9a\xeb\x65\x3c\x9f\xa4\x78\x69\x6e\xae\xef\xe7\x56\x78\x5a\x14\xb1\xa4\xd7\x31\xc9\x64\x66\x1f\x13\xf9\x90\xff\x70\x1e\xe2\x2c\x43\x30\x09\x73\x12\xe2\x27\xa1\x81\x04\x9a\x02\xc6\xec\x44\x96\x41\x80\x20\x66\x0e\xcc\x00\x5a\xb0\x22\x70\xa8\xad\x55\x6c\x82\xa3\xe8\x83\x23\x34\x1c\x85\x42\xeb\x9c\x8e\x16\xf0\x1b\x9e\x33\x7d\xad\x15\xed\xc6\x70\xfe\xd4\x39\x9f\x27\x8b\xb1\xf6\xdd\xe7\xb7\xa7\x69\xb3\x57\xa1\xe3\x23\x0f\xdd\x63\xed\x58\x40\xac\x30\x1e\x97\xd5\x71\xd9\x9c\x02\x6d\xc9\x18\xa1\x0d\x65\xc6\x6c\xbd\x90\x8e\xc1\x12\x12\xe9\x00\xf4\xd3\x06\xf9\x7f\x0d\xa8\x3c\xe5\x54\xb4\xcc\xa1\x36\xdb\xad\x46\x9b\xc5\xa8\x79\xb9\xe4\xeb\xe6\xea\x9f\x6b\xfb\xee\x6e\xde\x27\x7b\xab\x0f\xa8\xe8\x5c\xaa\xcd\x56\xcf\x97\x74\x82\x21\xa9\x98\x9c\xca\xce\x46\xe9\x03\x9a\x2c\x29\x7a\x05\x4c\x10\x20\x82\xbe\x53\x1f\x7f\x67\x38\x7f\xe0\xd1\x00\x89\x93\xb3\x2e\xba\x6c\x95\xc9\xd2\x49\x04\x27\x42\xce\x6c\x58\x78\x19\xad\x4c\xd6\x83\x88\xc6\x7e\x80\x4b\x9e\xd1\x2b\xb0\xd6\x82\xd6\x9c\xbe\x75\x8e\x39\xd9\xe4\xd8\x3e\xb9\xfd\xee\xb6\xc5\x6d\x3a\xc8\xf6\xb4\x7a\xeb\x0c\x57\xc3\x76\x6a\x75\xc7\xfd\x64\xf2\xce\xe3\xf2\xcd\x16\xab\xea\xcb\x67\x40\x2a\x66\x43\x1c\x94\xcb\x32\x33\x93\x89\xf8\xf1\x2a\xbc\x26\x91\x52\x30\xf1\x4f\xd6\x17\x7f\x2d\xa2\x52\xfd\x0c\x69\x49\x4f\x1d\x7d\x59\x2c\x2a\x87\x71\xb5\xb9\x92\xa1\xdf\xaf\x41\xe7\xb2\xde\x9f\xae\xc7\x16\x0d\x2f\xd7\xf6\xb5\xd3\x93\x97\x4b\x51\xad\x97\x6c\xaf\x32\x72\xb4\x46\x19\xb4\xd6\x61\xf6\xda\x38\x8c\xc2\x39\xa6\xcc\x09\x55\xf8\x89\x78\xac\x25\xb6\x28\xb3\x50\x2a\x04\xc3\x86\xa3\x63\x90\xc4\xd6\xe9\x90\x05\x0b\xe5\x7c\x72\x89\x8d\x62\xeb\xa2\x44\x90\xc6\xab\xe8\x48\x05\x19\x10\x13\x7c\x23\x27\xa7\x53\xbc\xed\x61\x6f\xde\x8e\xe1\x71\x97\x37\xad\xd4\x5c\x2c\x97\xd7\x2d\x2d\x8f\x95\xd8\x03\xd8\x4c\xa9\x52\x6f\xbd\x54\xfd\xf8\x24\x4b\x0e\xf2\x12\x9a\x0c\xe4\xa5\xcb\x6c\x04\x13\x2b\xeb\xb5\x63\x25\x05\x84\x20\x83\xbf\x63\xcf\xbf\x26\xa2\x52\x05\xbd\xd4\x2e\xd7\xa7\xf8\xd4\x27\xb8\x3c\x56\xd6\xd8\xbb\x16\x34\x94\x79\x76\x3a\xec\x57\x83\x63\x65\xb1\xc8\xf3\xfe\xae\xb6\x94\xdb\xf5\xe3\xae\x51\x12\x97\xa3\x50\x64\xb4\x03\x4c\x49\x4a\x62\x47\x0c\xf9\xc3\x8a\x94\x60\x44\x79\xc7\x9e\x7f\x00\x1e\xf5\xa0\x9c\x02\x36\x42\xb8\xe0\x20\x13\x45\xce\x44\x22\x0a\x6f\x20\x59\xa3\x5c\x0c\xe0\x83\xf0\xc2\x27\x8b\x39\x4a\xe1\xa4\x35\x10\xb2\x4a\x0a\x83\xa0\xc4\xf9\xbe\x82\xb8\xd2\x33\x97\x73\xa5\xb7\x98\x17\x0d\xbc\xf6\x55\xe7\x6a\x57\xaa\xe3\xde\xbb\xa3\xb4\x7b\xed\xdc\xf6\xf1\x72\xa8\xb5\xc7\x8b\x61\xf3\x49\x96\x6c\x45\x35\x4a\x11\x00\x50\xf8\xf8\x31\x28\x28\x28\xe5\x19\x44\x96\x99\x4c\xa4\x70\x27\x1a\x7e\xf7\xfa\xeb\xbb\x20\x2a\x55\xd0\x6c\x8a\xc7\xc3\x4b\xe7\x5a\xc8\xdd\xa0\x47\xab\x6b\x6f\xb6\xd9\x8e\xe5\x73\x7a\xed\xbc\xd5\x62\x11\x2f\x64\xa6\x95\xe1\x71\xd1\xca\x72\x0c\x25\x97\x07\x28\xa9\x90\x25\x5a\xf0\x29\x5a\xf2\x26\x0b\xcc\x31\x2b\x9f\xbd\x27\xe9\xee\x78\xd0\x0f\xc1\x13\x9c\x12\x84\x4e\x51\x12\x40\xc6\x31\x09\x85\x52\x01\x83\x50\x64\x39\x11\xb9\xcc\x9a\x93\xb2\x41\x64\xca\x88\x1c\x9c\xfc\xc0\x15\x8c\x46\xeb\xf5\x37\xa6\xd8\x74\x7d\x9c\x47\x39\xea\xc4\xfd\x6b\x3c\xa7\x27\xdb\x56\xb6\xd5\x22\x3d\xb8\x0c\xe9\xd4\x2b\xa6\x8b\xe9\xf8\xb9\xb5\xb1\x93\xf7\xcd\xbc\x72\x2b\x99\x62\x12\x84\x27\xe9\x93\x0d\x9e\x95\x62\xef\x64\x56\xec\xc1\x39\xa7\x85\x56\x77\xf6\x5d\xbf\x26\xa2\xf2\xbd\x57\x1e\xac\xfa\x8f\x50\xdf\xdf\x56\x8b\x59\x73\x73\x99\x55\x8a\xf7\x9e\xda\x54\x5e\x4c\x3f\x3e\x2f\x8a\xac\xcf\xab\xf3\x62\x42\xb5\xd1\xb9\xba\xf9\x8c\xc7\x25\x0d\x48\xd2\x60\x0e\xce\x38\x97\x04\x30\x4b\x56\x26\x39\x45\x1f\xd9\xfe\xcf\xe1\x29\x4e\x3e\xae\x39\xfd\x7f\x4c\x47\xde\xff\xbe\x8c\xfe\xb4\xfc\x4f\xfd\xfb\x47\x4a\x2c\x16\x5e\x59\xf7\xaf\xff\x09\xad\x92\x96\x1a\x93\x52\x56\x38\x8e\x42\xa0\xe2\x04\x2a\xa8\x14\x83\x97\x98\xb2\x44\x03\x40\xc2\xb0\xb6\xc1\x67\x66\x54\x41\x03\xe9\x20\x1c\x6a\xf5\x0d\x4b\x9a\x45\xee\xbe\x6e\x67\xcf\x9d\xdd\xbe\x7b\xee\x9a\xca\xae\xd9\xbd\x34\xeb\xfe\x0c\xa7\x1e\xdb\xc9\x13\xea\x79\x63\xd5\xb2\x53\xaa\x4a\x58\x94\xb4\x63\xda\xe4\x20\xb5\x46\x8e\xd9\x67\x91\x2d\x29\xeb\xb2\x16\x29\xb1\x21\x87\x77\xaa\xc3\x4f\x25\xc7\x2f\x85\xaa\xfc\x76\xc6\xc6\x2f\xf6\x8d\x5a\x71\xea\x4e\x0e\xad\xa5\x3a\x34\x4f\xd3\xdd\xe3\x76\x78\x2c\xe6\x8b\x65\x42\x77\x28\xf2\x65\xf7\x5e\x1b\x3f\xb5\x0f\xad\x63\xc9\xec\x8f\xd2\x27\x26\x52\xe4\x13\x4b\x10\xa8\x34\x66\x69\xad\x36\x5a\x18\xe3\xff\xb7\xb7\x55\xbe\x27\x26\x17\x7c\xc8\xc6\x45\xd6\xc6\x78\x36\x64\x93\xb5\xc8\x00\x20\xbc\x45\x1b\x94\x46\x95\xac\xc9\x4a\x59\x9f\x91\x93\xd0\x04\x01\x03\x43\xd4\x39\x26\x03\xea\x1b\x17\x7b\xaa\xfb\xf1\x09\x3a\xb3\x5e\x65\x76\x94\xed\xf9\x78\x31\xb5\xd3\xeb\x1c\xde\x8a\x41\xa3\x93\x64\xbf\x75\x6c\x3e\x4f\xc3\x71\x22\xeb\x2f\xab\x5a\xc9\x1a\x8c\x00\x96\x80\x03\x49\x1f\x48\xbb\x28\x23\x67\x13\xb3\x24\x0e\x5e\x86\x3b\x75\x62\xf9\x4e\xe4\x97\xe2\x55\x3e\xf1\x96\xbb\xed\xfa\xd0\x52\x55\x37\x9e\x2f\x2f\xb7\xea\x68\xc0\xa3\xf7\xea\x75\xb7\xf2\xcb\x4a\x23\xdc\x16\xab\xd3\xdb\xf3\xf0\x98\xdf\x12\x6e\x5b\x25\xa9\xdb\x59\x09\x94\xbc\xa4\x1c\xd8\x4a\x6b\x05\x28\x07\x0e\x20\x0b\x85\x4a\xdf\x39\x97\xff\xf1\xac\x38\x26\x87\xda\x19\xb4\x52\xf9\x20\xc1\xd9\xec\xbd\xf2\x36\x4b\x13\x7c\x30\x98\x1d\x38\x76\x5a\x1b\x07\x59\x78\x8f\xde\x27\x13\xac\x4d\x31\x08\x67\x55\x08\xf7\xb5\xd5\x9f\x57\xfa\xfd\xf3\xe0\x74\x1e\xdc\xe0\xe5\xa6\xbb\xad\x6e\xa5\x5b\x3f\x15\xcf\x6f\x87\xae\xdc\x51\x4b\xc6\xa2\xdf\xe1\x65\x77\x32\x78\x7b\x29\xe3\x45\xec\xa4\x62\xc3\x1c\xc0\x0b\x0e\x64\x1d\x90\x47\x34\xc2\x64\x72\xf7\x2e\x8d\x95\x35\x24\xbf\x14\xad\x3b\xa7\xf5\xe7\xe5\xbe\xf1\x7e\x99\xce\x64\x73\xb7\x4a\xdd\xe3\xea\x49\xb6\xb7\xdd\x5d\x98\x9f\xc6\xe6\x36\xac\xbd\x14\xb2\xd6\xbc\xae\x96\xb7\x82\x4a\xae\xd7\x05\x87\x10\x38\x90\x4f\x21\x51\xf2\x81\x95\xb3\x1e\x58\x3b\x25\x50\x6a\xbe\x73\x9b\xe1\xfb\x92\xc2\x4f\xa4\x50\x79\x6d\x21\xa9\xac\xa2\x47\x99\xa2\x93\x21\x18\x9b\x8d\x07\xa7\x50\x80\xe7\xc4\x2c\x83\xf0\x56\xe7\xe4\xa2\x61\x80\x60\x9c\x17\x32\x64\xce\x80\xea\x1b\x87\xae\xbc\x7d\xdd\x77\x1d\x9a\x79\x67\x90\x9b\x08\xd6\x8c\x77\xbb\x6d\x71\x7b\xad\xbf\xaa\x30\xe0\x4a\x73\xe2\xb7\xf6\x3c\x1f\xb7\x26\x83\x5b\xbb\xc4\xb3\xbc\x46\x14\xa0\xbc\x95\x18\xb3\x71\x1c\x92\x73\x32\xdb\x18\x8d\x23\x21\xee\x9c\x11\xdd\xdb\xbb\xfc\x52\xc4\xca\xbb\x26\xd2\xf5\xee\xb1\xf2\x38\xaf\x3c\xb9\xda\xfb\x72\x94\xeb\x78\xbd\x1a\x9b\xd7\xdd\x3c\xd4\xe7\xdb\x53\xbd\x5f\xbb\xbc\xd4\xe4\x56\xad\x6f\xa1\x64\x15\x46\x08\xc6\xfb\x28\xa3\x11\x39\x05\xe0\x80\x2a\x44\x6d\x6d\x30\xd2\xa7\x74\x27\x33\xfc\x08\x5a\xea\xdf\x68\x91\xcb\x32\x18\x2f\x4c\xb4\xd1\x4a\x36\x60\x29\x84\xac\x94\x09\x21\x2a\xce\xd6\x1b\x15\x41\x0a\x91\xe5\x47\xae\x70\x1a\xa4\xd2\x59\x3a\x8f\xc6\xa6\x94\xc3\x37\x66\xe2\x08\xde\xd9\x0d\x97\xaa\x9b\x1b\xb7\xda\x3a\x4e\xda\xd0\x18\xb8\xdb\xf5\xf1\xe9\xdc\x76\x6d\x57\xc5\xb5\xed\xf7\xe0\xed\x36\x1a\x52\x51\x72\x78\x2d\x51\xc8\x8c\xde\x7d\xbc\x2a\x11\x22\x07\x21\x62\x54\xa0\xa5\x09\xc1\x46\xbe\x33\x13\xbf\x7f\x2e\xfd\x01\xc4\x4a\xf5\xc5\x8b\xd1\xa6\xe6\xaa\x8b\xe3\xeb\xf0\xc5\xaf\xfb\x8f\x27\xaf\xf8\x6d\xd7\xa2\xed\xae\xe8\xdd\xd2\xaa\x76\x18\x0c\xe7\x45\xaf\xd1\x9b\xac\x3b\x25\x5d\xa6\x47\x42\x34\xca\xaa\x28\x4c\x54\x84\x49\x04\x1d\x51\x86\x9c\x10\x8d\x74\x77\xbc\xeb\xdf\x68\xfd\xf6\x8f\xdf\xfe\x5f\x00\x00\x00\xff\xff\xa8\x11\xeb\x38\x91\x31\x00\x00") func fixtures_assetsProofParamsParametersJsonBytes() ([]byte, error) { return bindataRead( @@ -220,7 +211,7 @@ func fixtures_assetsProofParamsParametersJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/proof-params/parameters.json", size: 11529, mode: os.FileMode(420), modTime: time.Unix(1641968724, 0)} + info := bindataFileInfo{name: "fixtures/_assets/proof-params/parameters.json", size: 12689, mode: os.FileMode(420), modTime: time.Unix(1644062078, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -240,7 +231,7 @@ func fixtures_assetsProofParamsSrsInnerProductJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/proof-params/srs-inner-product.json", size: 176, mode: os.FileMode(420), modTime: time.Unix(1626679099, 0)} + info := bindataFileInfo{name: "fixtures/_assets/proof-params/srs-inner-product.json", size: 176, mode: os.FileMode(420), modTime: time.Unix(1624848219, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -260,7 +251,7 @@ func fixtures_assetsArchDiagramMonopic() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/arch-diagram.monopic", size: 4340, mode: os.FileMode(420), modTime: time.Unix(1624501759, 0)} + info := bindataFileInfo{name: "fixtures/_assets/arch-diagram.monopic", size: 4340, mode: os.FileMode(420), modTime: time.Unix(1612507520, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/fixtures/networks/butterfly.go b/fixtures/networks/butterfly.go index 82dc385038..a3308669e8 100644 --- a/fixtures/networks/butterfly.go +++ b/fixtures/networks/butterfly.go @@ -12,8 +12,8 @@ func ButterflySnapNet() *NetworkConf { return &NetworkConf{ Bootstrap: config.BootstrapConfig{ Addresses: []string{ - "/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWBdRCBLUeKvoy22u5DcXs61adFn31v8WWCZgmBjDCjbsC", - "/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWDUQJBA18njjXnG9RtLxoN3muvdU7PEy55QorUEsdAqdy", + "/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWFHDtFx7CVTy4xoCDutVo1cScvSnQjDeaM8UzwVS1qwkh", + "/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWKt8cwpkiumkT8x32c3YFxsPRwhV5J8hCYPn9mhUmcAXt", }, MinPeerThreshold: 0, Period: "30s", @@ -46,7 +46,7 @@ func ButterflySnapNet() *NetworkConf { UpgradeTurboHeight: -15, UpgradeHyperdriveHeight: -16, UpgradeChocolateHeight: -17, - UpgradeOhSnapHeight: 30262, + UpgradeOhSnapHeight: 240, BreezeGasTampingDuration: 120, UpgradeClausHeight: -11, diff --git a/fixtures/networks/calibration.go b/fixtures/networks/calibration.go index 55a067780c..7be676927b 100644 --- a/fixtures/networks/calibration.go +++ b/fixtures/networks/calibration.go @@ -55,7 +55,7 @@ func Calibration() *NetworkConf { BreezeGasTampingDuration: 120, UpgradeClausHeight: 270, UpgradeChocolateHeight: 312746, - UpgradeOhSnapHeight: 99999999, + UpgradeOhSnapHeight: 682006, // 2022-02-10T19:23:00Z }, DrandSchedule: map[abi.ChainEpoch]config.DrandEnum{0: 1}, AddressNetwork: address.Testnet, diff --git a/pkg/constants/version.go b/pkg/constants/version.go index a7e7304e79..57bf31f934 100644 --- a/pkg/constants/version.go +++ b/pkg/constants/version.go @@ -7,7 +7,7 @@ import ( ) // BuildVersion is the local build version, set by build system -const BuildVersion = "1.2.0-rc4" +const BuildVersion = "1.2.0-rc5" // software version func UserVersion() string { From a8d98c07202c9b68c99b3a99526ea091c1f93d0f Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Wed, 9 Feb 2022 09:29:09 +0800 Subject: [PATCH 141/167] refactor: generate document for api (#4749) --- Makefile | 9 +- venus-devtool/api-docs-gen/cmd/docgen.go | 141 - venus-devtool/api-gen/doc_gen.go | 190 + .../docgen.go => api-gen/example.go} | 227 +- venus-devtool/api-gen/main.go | 1 + .../v0/method.md} | 4782 ++++++++------- .../v1/method.md} | 5154 +++++++++-------- venus-shared/api/messager/method.md | 1338 +++++ venus-shared/api/wallet/method.md | 1049 ++++ 9 files changed, 7599 insertions(+), 5292 deletions(-) delete mode 100644 venus-devtool/api-docs-gen/cmd/docgen.go create mode 100644 venus-devtool/api-gen/doc_gen.go rename venus-devtool/{api-docs-gen/docgen.go => api-gen/example.go} (53%) rename venus-shared/api/{v0-api-document.md => chain/v0/method.md} (90%) rename venus-shared/api/{v1-api-document.md => chain/v1/method.md} (88%) create mode 100644 venus-shared/api/messager/method.md create mode 100644 venus-shared/api/wallet/method.md diff --git a/Makefile b/Makefile index e01350ec01..ceafa7ed00 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ clean: rm -rf ./extern/filecoin-ffi rm -rf ./extern/test-vectors -gen-all: cborgen gogen inline-gen api-gen api-docs-gen +gen-all: cborgen gogen inline-gen api-gen gen-asset: go-bindata -pkg=asset -o ./fixtures/asset/asset.go ./fixtures/_assets/car/ ./fixtures/_assets/proof-params/ ./fixtures/_assets/arch-diagram.monopic @@ -50,12 +50,7 @@ test-venus-shared: api-gen: cd ./venus-devtool/ && go run ./api-gen/ proxy cd ./venus-devtool/ && go run ./api-gen/ client - -v0APIDoc = ../venus-shared/api/v0-api-document.md -v1APIDoc = ../venus-shared/api/v1-api-document.md -api-docs-gen: - cd ./venus-devtool/ && go run ./api-docs-gen/cmd ../venus-shared/api/chain/v0/fullnode.go FullNode v0 ../venus-shared/api/chain/v0 $(v0APIDoc) - cd ./venus-devtool/ && go run ./api-docs-gen/cmd ../venus-shared/api/chain/v1/fullnode.go FullNode v1 ../venus-shared/api/chain/v1 $(v1APIDoc) + cd ./venus-devtool/ && go run ./api-gen/ doc compatible-all: compatible-api compatible-actor diff --git a/venus-devtool/api-docs-gen/cmd/docgen.go b/venus-devtool/api-docs-gen/cmd/docgen.go deleted file mode 100644 index 68ea1b7a57..0000000000 --- a/venus-devtool/api-docs-gen/cmd/docgen.go +++ /dev/null @@ -1,141 +0,0 @@ -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "os" - "reflect" - "sort" - "strings" - - "github.com/filecoin-project/go-address" - docgen "github.com/filecoin-project/venus/venus-devtool/api-docs-gen" - "github.com/filecoin-project/venus/venus-shared/types" -) - -func main() { - comments, groupComments := docgen.ParseApiASTInfo(os.Args[1], os.Args[2], os.Args[3], os.Args[4]) - - groups := make(map[string]*docgen.MethodGroup) - - _, t, permStruct := docgen.GetAPIType(os.Args[2], os.Args[3]) - - for i := 0; i < t.NumMethod(); i++ { - m := t.Method(i) - - groupName := docgen.MethodGroupFromName(m.Name) - - g, ok := groups[groupName] - if !ok { - g = new(docgen.MethodGroup) - g.Header = groupComments[groupName] - g.GroupName = groupName - groups[groupName] = g - } - var args []interface{} - ft := m.Func.Type() - for j := 2; j < ft.NumIn(); j++ { - inp := ft.In(j) - args = append(args, docgen.ExampleValue(m.Name, inp, nil)) - } - - v, err := json.MarshalIndent(args, "", " ") - if err != nil { - panic(err) - } - - outv := docgen.ExampleValue(m.Name, ft.Out(0), nil) - if outv == nil { - _, _ = fmt.Fprintf(os.Stderr, "ExampleValue for %s get nil\n", ft.Out(0).String()) - continue - } - // json: unsupported type: map[address.Address]*types.Actor, so use map[string]*types.Actor instead - if actors, ok := outv.(map[address.Address]*types.Actor); ok { - newActors := make(map[string]*types.Actor, len(actors)) - for addr, a := range actors { - newActors[addr.String()] = a - } - outv = newActors - } - - ov, err := json.MarshalIndent(outv, "", " ") - if err != nil { - panic(err) - } - - g.Methods = append(g.Methods, &docgen.Method{ - Name: m.Name, - Comment: comments[m.Name], - InputExample: string(v), - ResponseExample: string(ov), - }) - } - - var groupslice []*docgen.MethodGroup - for _, g := range groups { - groupslice = append(groupslice, g) - } - - sort.Slice(groupslice, func(i, j int) bool { - return groupslice[i].GroupName < groupslice[j].GroupName - }) - - buf := &bytes.Buffer{} - fmt.Fprint(buf, "# Groups\n") - - for _, g := range groupslice { - fmt.Fprintf(buf, "* [%s](#%s)\n", g.GroupName, g.GroupName) - for _, method := range g.Methods { - fmt.Fprintf(buf, " * [%s](#%s)\n", method.Name, method.Name) - } - } - - for _, g := range groupslice { - g := g - fmt.Fprintf(buf, "## %s\n", g.GroupName) - fmt.Fprintf(buf, "%s\n\n", g.Header) - - sort.Slice(g.Methods, func(i, j int) bool { - return g.Methods[i].Name < g.Methods[j].Name - }) - - for _, m := range g.Methods { - fmt.Fprintf(buf, "### %s\n", m.Name) - fmt.Fprintf(buf, "%s\n\n", m.Comment) - - var meth reflect.StructField - var ok bool - for _, ps := range permStruct { - meth, ok = ps.FieldByName(m.Name) - if ok { - break - } - } - if !ok { - panic("no perms for method: " + m.Name) - } - - perms := meth.Tag.Get("perm") - - fmt.Fprintf(buf, "Perms: %s\n\n", perms) - - if strings.Count(m.InputExample, "\n") > 0 { - fmt.Fprintf(buf, "Inputs:\n```json\n%s\n```\n\n", m.InputExample) - } else { - fmt.Fprintf(buf, "Inputs: `%s`\n\n", m.InputExample) - } - - if strings.Count(m.ResponseExample, "\n") > 0 { - fmt.Fprintf(buf, "Response:\n```json\n%s\n```\n\n", m.ResponseExample) - } else { - fmt.Fprintf(buf, "Response: `%s`\n\n", m.ResponseExample) - } - } - } - - if err := ioutil.WriteFile(os.Args[5], buf.Bytes(), 0644); err != nil { - panic(err) - } -} diff --git a/venus-devtool/api-gen/doc_gen.go b/venus-devtool/api-gen/doc_gen.go new file mode 100644 index 0000000000..d2155e8f44 --- /dev/null +++ b/venus-devtool/api-gen/doc_gen.go @@ -0,0 +1,190 @@ +package main + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "go/ast" + "os" + "path/filepath" + "reflect" + "sort" + "strings" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/venus/venus-devtool/util" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/urfave/cli/v2" +) + +var ctxElem = reflect.TypeOf((*context.Context)(nil)).Elem() + +var docGenCmd = &cli.Command{ + Name: "doc", + Action: func(cctx *cli.Context) error { + for _, t := range apiTargets { + if err := genDocForAPI(t); err != nil { + return err + } + } + + return nil + }, +} + +type MethodGroup struct { + GroupName string + Methods []*Method +} + +type Method struct { + Name string + Comment string + Perm string + InputExample string + ResponseExample string +} + +func genDocForAPI(t util.APIMeta) error { + opt := t.ParseOpt + opt.ResolveImports = true + ifaceMetas, astMeta, err := util.ParseInterfaceMetas(opt) + if err != nil { + return err + } + + groups := make([]MethodGroup, 0, len(ifaceMetas)) + for _, im := range ifaceMetas { + mg := MethodGroup{GroupName: simpleGroupName(im.Name), Methods: make([]*Method, 0, len(im.Defined))} + for _, mm := range im.Defined { + method, ok := t.Type.MethodByName(mm.Name) + if !ok { + fmt.Println("not found method: ", mm.Name) + continue + } + in, out, err := fillExampleValue(method) + if err != nil { + return err + } + + m := &Method{ + Comment: getComment(mm.Comments), + Name: mm.Name, + InputExample: string(in), + ResponseExample: string(out), + Perm: util.GetAPIMethodPerm(mm), + } + mg.Methods = append(mg.Methods, m) + } + if len(mg.Methods) == 0 { + continue + } + groups = append(groups, mg) + } + + return writeAPIInfo(astMeta, groups) +} + +func simpleGroupName(groupName string) string { + // `IBlockStore` ==> `BlockStore` + // `IJwtAuthAPI` ==> `JwtAuth` + if len(groupName) > 0 && groupName[0] == 'I' { + groupName = groupName[1:] + } + groupName = strings.Replace(groupName, "API", "", 1) + + return groupName +} + +func fillExampleValue(m reflect.Method) ([]byte, []byte, error) { + ft := m.Type + + in := make([]interface{}, 0, ft.NumIn()) + for i := 0; i < ft.NumIn(); i++ { + if ft.In(i).Implements(ctxElem) { + continue + } + inp := ft.In(i) + in = append(in, ExampleValue(m.Name, inp, nil)) + } + + inVal, err := json.MarshalIndent(in, "", " ") + if err != nil { + return nil, nil, err + } + + out := ExampleValue(m.Name, ft.Out(0), nil) + if out == nil { + return nil, nil, fmt.Errorf("ExampleValue for %s get nil\n", ft.Out(0).String()) + } + // json: unsupported type: map[address.Address]*types.Actor, so return {} + if _, ok := out.(map[address.Address]*types.Actor); ok { + return inVal, []byte{'{', '}'}, nil + } + + outVal, err := json.MarshalIndent(out, "", " ") + if err != nil { + return nil, nil, err + } + + return inVal, outVal, nil +} + +func getComment(comments []*ast.CommentGroup) string { + // skip permission comment + if len(comments) == 1 { + return "" + } + cmt := "" + for _, c := range comments[0].List { + cmt += strings.TrimSpace(strings.Replace(c.Text, "//", "", 1)) + "\n" + } + + return cmt +} + +func writeAPIInfo(astMeta *util.ASTMeta, groups []MethodGroup) error { + buf := &bytes.Buffer{} + fmt.Fprint(buf, "# Groups\n\n") + + sort.Slice(groups, func(i, j int) bool { + return groups[i].GroupName < groups[j].GroupName + }) + for _, g := range groups { + sort.Slice(g.Methods, func(i, j int) bool { + return g.Methods[i].Name < g.Methods[j].Name + }) + + fmt.Fprintf(buf, "* [%s](#%s)\n", g.GroupName, g.GroupName) + for _, method := range g.Methods { + fmt.Fprintf(buf, " * [%s](#%s)\n", method.Name, method.Name) + } + } + + fmt.Fprintf(buf, "\n") + for _, g := range groups { + fmt.Fprintf(buf, "## %s\n\n", g.GroupName) + + for _, m := range g.Methods { + fmt.Fprintf(buf, "### %s\n", m.Name) + fmt.Fprintf(buf, "%s\n\n", m.Comment) + + fmt.Fprintf(buf, "Perms: %s\n\n", m.Perm) + + if strings.Count(m.InputExample, "\n") > 0 { + fmt.Fprintf(buf, "Inputs:\n```json\n%s\n```\n\n", m.InputExample) + } else { + fmt.Fprintf(buf, "Inputs: `%s`\n\n", m.InputExample) + } + + if strings.Count(m.ResponseExample, "\n") > 0 { + fmt.Fprintf(buf, "Response:\n```json\n%s\n```\n\n", m.ResponseExample) + } else { + fmt.Fprintf(buf, "Response: `%s`\n\n", m.ResponseExample) + } + } + } + + return os.WriteFile(filepath.Join(astMeta.Location, "method.md"), buf.Bytes(), 0644) +} diff --git a/venus-devtool/api-docs-gen/docgen.go b/venus-devtool/api-gen/example.go similarity index 53% rename from venus-devtool/api-docs-gen/docgen.go rename to venus-devtool/api-gen/example.go index 698a188b0e..07d05641e1 100644 --- a/venus-devtool/api-docs-gen/docgen.go +++ b/venus-devtool/api-gen/example.go @@ -1,21 +1,11 @@ -package docgen +package main import ( "fmt" - "go/ast" - "go/parser" - "go/token" "os" - "path/filepath" "reflect" "strings" "time" - "unicode" - - network2 "github.com/filecoin-project/go-state-types/network" - v0 "github.com/filecoin-project/venus/venus-shared/api/chain/v0" - v1 "github.com/filecoin-project/venus/venus-shared/api/chain/v1" - "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" @@ -25,7 +15,11 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/exitcode" + "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/venus-shared/api" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/venus/venus-shared/types/messager" + "github.com/filecoin-project/venus/venus-shared/types/wallet" "github.com/ipfs/go-cid" "github.com/ipfs/go-graphsync" textselector "github.com/ipld/go-ipld-selector-text-lite" @@ -41,6 +35,7 @@ var ExampleValues = map[reflect.Type]interface{}{ reflect.TypeOf(auth.Permission("")): auth.Permission("write"), reflect.TypeOf(""): "string value", reflect.TypeOf(uint64(42)): uint64(42), + reflect.TypeOf(uint(42)): uint(42), reflect.TypeOf(byte(7)): byte(7), reflect.TypeOf([]byte{}): []byte("byte array"), } @@ -79,7 +74,7 @@ func init() { } addExample(pid) addExample(&pid) - addExample(network2.Version14) + addExample(constants.NewestNetworkVersion) textSelExample := textselector.Expression("Links/21/Hash/Links/42/Hash") clientEvent := retrievalmarket.ClientEventDealAccepted addExample(bitfield.NewFromSet([]uint64{5})) @@ -180,71 +175,47 @@ func init() { 123: "can't acquire read lock", }) addExample([]abi.SectorNumber{123, 124}) - // addExample(apitypes.OpenRPCDocument{ - // "openrpc": "1.2.6", - // "info": map[string]interface{}{ - // "title": "Lotus RPC API", - // "version": "1.2.1/generated=2020-11-22T08:22:42-06:00", - // }, - // "methods": []interface{}{}}, - // ) addExample(types.CheckStatusCode(0)) addExample(map[string]interface{}{"abc": 123}) -} -func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []reflect.Type) { - - switch pkg { - case "v1": // latest - switch name { - case "FullNode": - i = &v1.FullNodeStruct{} - t = reflect.TypeOf(new(struct{ v1.FullNode })).Elem() - permStruct = append(permStruct, reflect.TypeOf(v1.IBlockStoreStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v1.IBeaconStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v1.IChainStruct{}.IAccountStruct.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v1.IChainStruct{}.IActorStruct.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v1.IChainStruct{}.IBeaconStruct.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v1.IChainStruct{}.IMinerStateStruct.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v1.IChainStruct{}.IChainInfoStruct.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v1.IMarketStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v1.IMiningStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v1.IMessagePoolStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v1.IMultiSigStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v1.INetworkStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v1.IPaychanStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v1.ISyncerStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v1.IWalletStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v1.IJwtAuthAPIStruct{}.Internal)) - default: - panic("unknown type") - } - case "v0": - switch name { - case "FullNode": - i = &v0.FullNodeStruct{} - t = reflect.TypeOf(new(struct{ v0.FullNode })).Elem() - permStruct = append(permStruct, reflect.TypeOf(v0.IBlockStoreStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v0.IBeaconStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v0.IChainStruct{}.IAccountStruct.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v0.IChainStruct{}.IActorStruct.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v0.IChainStruct{}.IBeaconStruct.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v0.IChainStruct{}.IMinerStateStruct.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v0.IChainStruct{}.IChainInfoStruct.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v0.IMarketStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v0.IMiningStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v0.IMessagePoolStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v0.IMultiSigStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v0.INetworkStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v0.IPaychanStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v0.ISyncerStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v0.IWalletStruct{}.Internal)) - permStruct = append(permStruct, reflect.TypeOf(v0.IJwtAuthAPIStruct{}.Internal)) - default: - panic("unknown type") - } + // messager + uuid, err := types.ParseUUID("e26f1e5c-47f7-4561-a11d-18fab6e748af") + if err != nil { + panic(err) } - return + i64 := int64(10000) + addExample(uuid) + addExample(messager.OnChainMsg) + addExample(messager.AddressStateAlive) + addExample(&i64) + addExample(ExampleValue("init", reflect.TypeOf(&messager.Address{}), nil).(*messager.Address)) + addExample(&messager.Node{ + ID: uuid, + Name: "venus", + URL: "/ip4/127.0.0.1/tcp/3453", + Token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBbGxvdyI6WyJyZWFkIiwid3JpdGUiLCJzaWduIiwiYWRtaW4iXX0._eHBJJAiBzQmfcbD_vVmtTrkgyJQ-LOgGOiHfb8rU1I", + Type: messager.LightNode, + }) + addExample(&messager.Message{ + ID: uuid.String(), + UnsignedCid: &c, + SignedCid: &c, + Message: ExampleValue("init", reflect.TypeOf(types.Message{}), nil).(types.Message), + Signature: ExampleValue("init", reflect.TypeOf(&crypto.Signature{}), nil).(*crypto.Signature), + Height: 100, + Confidence: 10, + Receipt: ExampleValue("init", reflect.TypeOf(&types.MessageReceipt{}), nil).(*types.MessageReceipt), + TipSetKey: tsk, + Meta: ExampleValue("init", reflect.TypeOf(&messager.SendSpec{}), nil).(*messager.SendSpec), + WalletName: "test", + FromUser: "test", + State: messager.UnFillMsg, + }) + addExample(ExampleValue("init", reflect.TypeOf(&messager.SendSpec{}), nil).(*messager.SendSpec)) + addExample(messager.QuickSendParamsCodecJSON) + + // wallet + addExample(wallet.MEChainMsg) } func ExampleValue(method string, t, parent reflect.Type) interface{} { @@ -302,113 +273,3 @@ func exampleStruct(method string, t, parent reflect.Type) interface{} { return ns.Interface() } - -type Visitor struct { - Root string - Methods map[string]ast.Node -} - -func (v *Visitor) Visit(node ast.Node) ast.Visitor { - st, ok := node.(*ast.TypeSpec) - if !ok { - return v - } - - if st.Name.Name != v.Root { - return nil - } - - iface := st.Type.(*ast.InterfaceType) - for _, m := range iface.Methods.List { - if len(m.Names) > 0 { - v.Methods[m.Names[0].Name] = m - } - } - - return v -} - -const NoComment = "There are not yet any comments for this method." - -func ParseApiASTInfo(apiFile, iface, pkg, dir string) (comments map[string]string, groupDocs map[string]string) { - fset := token.NewFileSet() - apiDir, err := filepath.Abs(dir) - if err != nil { - fmt.Println("./api filepath absolute error: ", err) - return - } - apiFile, err = filepath.Abs(apiFile) - if err != nil { - fmt.Println("filepath absolute error: ", err, "file:", apiFile) - return - } - pkgs, err := parser.ParseDir(fset, apiDir, nil, parser.AllErrors|parser.ParseComments) - if err != nil { - fmt.Println("parse error: ", err) - return - } - - ap := pkgs[pkg] - - f := ap.Files[apiFile] - - cmap := ast.NewCommentMap(fset, f, f.Comments) - - v := &Visitor{iface, make(map[string]ast.Node)} - ast.Walk(v, ap) - - comments = make(map[string]string) - groupDocs = make(map[string]string) - for mn, node := range v.Methods { - filteredComments := cmap.Filter(node).Comments() - if len(filteredComments) == 0 { - comments[mn] = NoComment - } else { - for _, c := range filteredComments { - if strings.HasPrefix(c.Text(), "MethodGroup:") { - parts := strings.Split(c.Text(), "\n") - groupName := strings.TrimSpace(parts[0][12:]) - comment := strings.Join(parts[1:], "\n") - groupDocs[groupName] = comment - - break - } - } - - l := len(filteredComments) - 1 - if len(filteredComments) > 1 { - l = len(filteredComments) - 2 - } - last := filteredComments[l].Text() - if !strings.HasPrefix(last, "MethodGroup:") { - comments[mn] = last - } else { - comments[mn] = NoComment - } - } - } - return comments, groupDocs -} - -type MethodGroup struct { - GroupName string - Header string - Methods []*Method -} - -type Method struct { - Comment string - Name string - InputExample string - ResponseExample string -} - -func MethodGroupFromName(mn string) string { - i := strings.IndexFunc(mn[1:], func(r rune) bool { - return unicode.IsUpper(r) - }) - if i < 0 { - return "" - } - return mn[:i+1] -} diff --git a/venus-devtool/api-gen/main.go b/venus-devtool/api-gen/main.go index fef0eea243..f00762f459 100644 --- a/venus-devtool/api-gen/main.go +++ b/venus-devtool/api-gen/main.go @@ -16,6 +16,7 @@ func main() { Commands: []*cli.Command{ proxyCmd, clientCmd, + docGenCmd, }, } diff --git a/venus-shared/api/v0-api-document.md b/venus-shared/api/chain/v0/method.md similarity index 90% rename from venus-shared/api/v0-api-document.md rename to venus-shared/api/chain/v0/method.md index 0ac610966f..4748198da6 100644 --- a/venus-shared/api/v0-api-document.md +++ b/venus-shared/api/chain/v0/method.md @@ -1,16 +1,19 @@ # Groups -* [](#) - * [Concurrent](#Concurrent) - * [Verify](#Verify) - * [Version](#Version) -* [Auth](#Auth) - * [AuthNew](#AuthNew) + +* [Account](#Account) + * [StateAccountKey](#StateAccountKey) +* [Actor](#Actor) + * [ListActor](#ListActor) + * [StateGetActor](#StateGetActor) * [Beacon](#Beacon) * [BeaconGetEntry](#BeaconGetEntry) -* [Block](#Block) - * [BlockTime](#BlockTime) -* [Chain](#Chain) +* [BlockStore](#BlockStore) * [ChainDeleteObj](#ChainDeleteObj) + * [ChainHasObj](#ChainHasObj) + * [ChainReadObj](#ChainReadObj) + * [ChainStatObj](#ChainStatObj) +* [ChainInfo](#ChainInfo) + * [BlockTime](#BlockTime) * [ChainExport](#ChainExport) * [ChainGetBlock](#ChainGetBlock) * [ChainGetBlockMessages](#ChainGetBlockMessages) @@ -24,38 +27,38 @@ * [ChainGetReceipts](#ChainGetReceipts) * [ChainGetTipSet](#ChainGetTipSet) * [ChainGetTipSetByHeight](#ChainGetTipSetByHeight) - * [ChainHasObj](#ChainHasObj) * [ChainHead](#ChainHead) * [ChainList](#ChainList) * [ChainNotify](#ChainNotify) - * [ChainReadObj](#ChainReadObj) * [ChainSetHead](#ChainSetHead) - * [ChainStatObj](#ChainStatObj) - * [ChainSyncHandleNewTipSet](#ChainSyncHandleNewTipSet) - * [ChainTipSetWeight](#ChainTipSetWeight) -* [Gas](#Gas) - * [GasBatchEstimateMessageGas](#GasBatchEstimateMessageGas) - * [GasEstimateFeeCap](#GasEstimateFeeCap) - * [GasEstimateGasLimit](#GasEstimateGasLimit) - * [GasEstimateGasPremium](#GasEstimateGasPremium) - * [GasEstimateMessageGas](#GasEstimateMessageGas) -* [Get](#Get) * [GetActor](#GetActor) * [GetEntry](#GetEntry) * [GetFullBlock](#GetFullBlock) * [GetParentStateRootActor](#GetParentStateRootActor) -* [Has](#Has) - * [HasPassword](#HasPassword) -* [List](#List) - * [ListActor](#ListActor) -* [Lock](#Lock) - * [LockWallet](#LockWallet) -* [Message](#Message) * [MessageWait](#MessageWait) -* [Miner](#Miner) - * [MinerCreateBlock](#MinerCreateBlock) - * [MinerGetBaseInfo](#MinerGetBaseInfo) -* [Mpool](#Mpool) + * [ProtocolParameters](#ProtocolParameters) + * [ResolveToKeyAddr](#ResolveToKeyAddr) + * [StateGetReceipt](#StateGetReceipt) + * [StateNetworkName](#StateNetworkName) + * [StateNetworkVersion](#StateNetworkVersion) + * [StateSearchMsg](#StateSearchMsg) + * [StateSearchMsgLimited](#StateSearchMsgLimited) + * [StateVerifiedRegistryRootKey](#StateVerifiedRegistryRootKey) + * [StateVerifierStatus](#StateVerifierStatus) + * [StateWaitMsg](#StateWaitMsg) + * [StateWaitMsgLimited](#StateWaitMsgLimited) + * [VerifyEntry](#VerifyEntry) +* [JwtAuth](#JwtAuth) + * [AuthNew](#AuthNew) + * [Verify](#Verify) +* [Market](#Market) + * [StateMarketParticipants](#StateMarketParticipants) +* [MessagePool](#MessagePool) + * [GasBatchEstimateMessageGas](#GasBatchEstimateMessageGas) + * [GasEstimateFeeCap](#GasEstimateFeeCap) + * [GasEstimateGasLimit](#GasEstimateGasLimit) + * [GasEstimateGasPremium](#GasEstimateGasPremium) + * [GasEstimateMessageGas](#GasEstimateMessageGas) * [MpoolBatchPush](#MpoolBatchPush) * [MpoolBatchPushMessage](#MpoolBatchPushMessage) * [MpoolBatchPushUntrusted](#MpoolBatchPushUntrusted) @@ -73,7 +76,41 @@ * [MpoolSelects](#MpoolSelects) * [MpoolSetConfig](#MpoolSetConfig) * [MpoolSub](#MpoolSub) -* [Msig](#Msig) +* [MinerState](#MinerState) + * [StateCirculatingSupply](#StateCirculatingSupply) + * [StateDealProviderCollateralBounds](#StateDealProviderCollateralBounds) + * [StateListActors](#StateListActors) + * [StateListMiners](#StateListMiners) + * [StateLookupID](#StateLookupID) + * [StateMarketBalance](#StateMarketBalance) + * [StateMarketDeals](#StateMarketDeals) + * [StateMarketStorageDeal](#StateMarketStorageDeal) + * [StateMinerActiveSectors](#StateMinerActiveSectors) + * [StateMinerAvailableBalance](#StateMinerAvailableBalance) + * [StateMinerDeadlines](#StateMinerDeadlines) + * [StateMinerFaults](#StateMinerFaults) + * [StateMinerInfo](#StateMinerInfo) + * [StateMinerInitialPledgeCollateral](#StateMinerInitialPledgeCollateral) + * [StateMinerPartitions](#StateMinerPartitions) + * [StateMinerPower](#StateMinerPower) + * [StateMinerPreCommitDepositForPower](#StateMinerPreCommitDepositForPower) + * [StateMinerProvingDeadline](#StateMinerProvingDeadline) + * [StateMinerRecoveries](#StateMinerRecoveries) + * [StateMinerSectorAllocated](#StateMinerSectorAllocated) + * [StateMinerSectorCount](#StateMinerSectorCount) + * [StateMinerSectorSize](#StateMinerSectorSize) + * [StateMinerSectors](#StateMinerSectors) + * [StateMinerWorkerAddress](#StateMinerWorkerAddress) + * [StateSectorExpiration](#StateSectorExpiration) + * [StateSectorGetInfo](#StateSectorGetInfo) + * [StateSectorPartition](#StateSectorPartition) + * [StateSectorPreCommitInfo](#StateSectorPreCommitInfo) + * [StateVMCirculatingSupplyInternal](#StateVMCirculatingSupplyInternal) + * [StateVerifiedClientStatus](#StateVerifiedClientStatus) +* [Mining](#Mining) + * [MinerCreateBlock](#MinerCreateBlock) + * [MinerGetBaseInfo](#MinerGetBaseInfo) +* [MultiSig](#MultiSig) * [MsigAddApprove](#MsigAddApprove) * [MsigAddCancel](#MsigAddCancel) * [MsigAddPropose](#MsigAddPropose) @@ -88,9 +125,8 @@ * [MsigSwapApprove](#MsigSwapApprove) * [MsigSwapCancel](#MsigSwapCancel) * [MsigSwapPropose](#MsigSwapPropose) -* [Net](#Net) - * [NetAddrsListen](#NetAddrsListen) * [Network](#Network) + * [NetAddrsListen](#NetAddrsListen) * [NetworkConnect](#NetworkConnect) * [NetworkFindPeer](#NetworkFindPeer) * [NetworkFindProvidersAsync](#NetworkFindProvidersAsync) @@ -99,7 +135,8 @@ * [NetworkGetPeerAddresses](#NetworkGetPeerAddresses) * [NetworkGetPeerID](#NetworkGetPeerID) * [NetworkPeers](#NetworkPeers) -* [Paych](#Paych) + * [Version](#Version) +* [Paychan](#Paychan) * [PaychAllocateLane](#PaychAllocateLane) * [PaychAvailableFunds](#PaychAvailableFunds) * [PaychAvailableFundsByFromTo](#PaychAvailableFundsByFromTo) @@ -116,67 +153,20 @@ * [PaychVoucherCreate](#PaychVoucherCreate) * [PaychVoucherList](#PaychVoucherList) * [PaychVoucherSubmit](#PaychVoucherSubmit) -* [Protocol](#Protocol) - * [ProtocolParameters](#ProtocolParameters) -* [Resolve](#Resolve) - * [ResolveToKeyAddr](#ResolveToKeyAddr) -* [Set](#Set) +* [Syncer](#Syncer) + * [ChainSyncHandleNewTipSet](#ChainSyncHandleNewTipSet) + * [ChainTipSetWeight](#ChainTipSetWeight) + * [Concurrent](#Concurrent) * [SetConcurrent](#SetConcurrent) - * [SetPassword](#SetPassword) -* [State](#State) - * [StateAccountKey](#StateAccountKey) * [StateCall](#StateCall) - * [StateCirculatingSupply](#StateCirculatingSupply) - * [StateDealProviderCollateralBounds](#StateDealProviderCollateralBounds) - * [StateGetActor](#StateGetActor) - * [StateGetReceipt](#StateGetReceipt) - * [StateListActors](#StateListActors) - * [StateListMiners](#StateListMiners) - * [StateLookupID](#StateLookupID) - * [StateMarketBalance](#StateMarketBalance) - * [StateMarketDeals](#StateMarketDeals) - * [StateMarketParticipants](#StateMarketParticipants) - * [StateMarketStorageDeal](#StateMarketStorageDeal) - * [StateMinerActiveSectors](#StateMinerActiveSectors) - * [StateMinerAvailableBalance](#StateMinerAvailableBalance) - * [StateMinerDeadlines](#StateMinerDeadlines) - * [StateMinerFaults](#StateMinerFaults) - * [StateMinerInfo](#StateMinerInfo) - * [StateMinerInitialPledgeCollateral](#StateMinerInitialPledgeCollateral) - * [StateMinerPartitions](#StateMinerPartitions) - * [StateMinerPower](#StateMinerPower) - * [StateMinerPreCommitDepositForPower](#StateMinerPreCommitDepositForPower) - * [StateMinerProvingDeadline](#StateMinerProvingDeadline) - * [StateMinerRecoveries](#StateMinerRecoveries) - * [StateMinerSectorAllocated](#StateMinerSectorAllocated) - * [StateMinerSectorCount](#StateMinerSectorCount) - * [StateMinerSectorSize](#StateMinerSectorSize) - * [StateMinerSectors](#StateMinerSectors) - * [StateMinerWorkerAddress](#StateMinerWorkerAddress) - * [StateNetworkName](#StateNetworkName) - * [StateNetworkVersion](#StateNetworkVersion) - * [StateSearchMsg](#StateSearchMsg) - * [StateSearchMsgLimited](#StateSearchMsgLimited) - * [StateSectorExpiration](#StateSectorExpiration) - * [StateSectorGetInfo](#StateSectorGetInfo) - * [StateSectorPartition](#StateSectorPartition) - * [StateSectorPreCommitInfo](#StateSectorPreCommitInfo) - * [StateVMCirculatingSupplyInternal](#StateVMCirculatingSupplyInternal) - * [StateVerifiedClientStatus](#StateVerifiedClientStatus) - * [StateVerifiedRegistryRootKey](#StateVerifiedRegistryRootKey) - * [StateVerifierStatus](#StateVerifierStatus) - * [StateWaitMsg](#StateWaitMsg) - * [StateWaitMsgLimited](#StateWaitMsgLimited) -* [Sync](#Sync) * [SyncState](#SyncState) * [SyncSubmitBlock](#SyncSubmitBlock) -* [Syncer](#Syncer) * [SyncerTracker](#SyncerTracker) -* [Un](#Un) - * [UnLockWallet](#UnLockWallet) -* [Verify](#Verify) - * [VerifyEntry](#VerifyEntry) * [Wallet](#Wallet) + * [HasPassword](#HasPassword) + * [LockWallet](#LockWallet) + * [SetPassword](#SetPassword) + * [UnLockWallet](#UnLockWallet) * [WalletAddresses](#WalletAddresses) * [WalletBalance](#WalletBalance) * [WalletDefaultAddress](#WalletDefaultAddress) @@ -188,19 +178,10 @@ * [WalletSign](#WalletSign) * [WalletSignMessage](#WalletSignMessage) * [WalletState](#WalletState) -## - - -### Concurrent - - -Perms: read - -Inputs: `null` -Response: `9` +## Account -### Verify +### StateAccountKey Perms: read @@ -208,55 +189,67 @@ Perms: read Inputs: ```json [ - "string value", - "string value" -] -``` - -Response: -```json -[ - "string value" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -### Version +Response: `"f01234"` +## Actor -Perms: read +### ListActor -Inputs: `null` -Response: -```json -{ - "Version": "string value", - "APIVersion": 131584 -} -``` +Perms: read -## Auth +Inputs: `[]` +Response: `{}` -### AuthNew +### StateGetActor -Perms: admin +Perms: read Inputs: ```json [ + "f01234", [ - "string value" + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } ] ] ``` -Response: `"Ynl0ZSBhcnJheQ=="` +Response: +```json +{ + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Head": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Nonce": 42, + "Balance": "0" +} +``` ## Beacon - ### BeaconGetEntry @@ -277,25 +270,28 @@ Response: } ``` -## Block - - -### BlockTime - +## BlockStore -Perms: read +### ChainDeleteObj -Inputs: `null` -Response: `60000000000` +Perms: admin -## Chain +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` +Response: `{}` -### ChainDeleteObj +### ChainHasObj -Perms: admin +Perms: read Inputs: ```json @@ -306,9 +302,9 @@ Inputs: ] ``` -Response: `{}` +Response: `true` -### ChainExport +### ChainReadObj Perms: read @@ -316,22 +312,15 @@ Perms: read Inputs: ```json [ - 10101, - true, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } ] ``` Response: `"Ynl0ZSBhcnJheQ=="` -### ChainGetBlock +### ChainStatObj Perms: read @@ -339,6 +328,9 @@ Perms: read Inputs: ```json [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } @@ -348,16 +340,72 @@ Inputs: Response: ```json { - "Miner": "t01234", - "Ticket": { - "VRFProof": "Bw==" - }, - "ElectionProof": { - "WinCount": 9, - "VRFProof": "Bw==" - }, - "BeaconEntries": [ - { + "Size": 42, + "Links": 42 +} +``` + +## ChainInfo + +### BlockTime + + +Perms: read + +Inputs: `[]` + +Response: `60000000000` + +### ChainExport + + +Perms: read + +Inputs: +```json +[ + 10101, + true, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"Ynl0ZSBhcnJheQ=="` + +### ChainGetBlock + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Miner": "f01234", + "Ticket": { + "VRFProof": "Bw==" + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Bw==" + }, + "BeaconEntries": [ + { "Round": 42, "Data": "Ynl0ZSBhcnJheQ==" } @@ -421,8 +469,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -439,8 +487,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -487,8 +535,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -530,8 +578,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -570,8 +618,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -780,28 +828,12 @@ Response: } ``` -### ChainHasObj - - -Perms: read - -Inputs: -```json -[ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } -] -``` - -Response: `true` - ### ChainHead Perms: read -Inputs: `null` +Inputs: `[]` Response: ```json @@ -851,7 +883,7 @@ Response: Perms: read -Inputs: `null` +Inputs: `[]` Response: ```json @@ -867,22 +899,6 @@ Response: ] ``` -### ChainReadObj - - -Perms: read - -Inputs: -```json -[ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } -] -``` - -Response: `"Ynl0ZSBhcnJheQ=="` - ### ChainSetHead @@ -904,7 +920,7 @@ Inputs: Response: `{}` -### ChainStatObj +### GetActor Perms: read @@ -912,46 +928,46 @@ Perms: read Inputs: ```json [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "f01234" ] ``` Response: ```json { - "Size": 42, - "Links": 42 + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Head": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Nonce": 42, + "Balance": "0" } ``` -### ChainSyncHandleNewTipSet +### GetEntry -Perms: write +Perms: read Inputs: ```json [ - { - "Source": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Sender": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Head": { - "Cids": null, - "Blocks": null, - "Height": 0 - } - } + 10101, + 42 ] ``` -Response: `{}` +Response: +```json +{ + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" +} +``` -### ChainTipSetWeight +### GetFullBlock Perms: read @@ -959,39 +975,90 @@ Perms: read Inputs: ```json [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } ] ``` -Response: `"0"` - -## Gas - - -### GasBatchEstimateMessageGas - - -Perms: read - -Inputs: +Response: ```json -[ - [ +{ + "Header": { + "Miner": "f01234", + "Ticket": { + "VRFProof": "Bw==" + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Bw==" + }, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" + }, + "BLSMessages": [ { - "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + } + ], + "SECPMessages": [ + { + "Message": { "CID": { "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -1000,49 +1067,50 @@ Inputs: "Method": 1, "Params": "Ynl0ZSBhcnJheQ==" }, - "Spec": { - "MaxFee": "0", - "GasOverEstimation": 12.3 + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" } } - ], - 42, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } ] -] +} ``` -Response: +### GetParentStateRootActor + + +Perms: read + +Inputs: ```json [ { - "Msg": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "Err": "string value" - } + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "f01234" ] ``` -### GasEstimateFeeCap +Response: +```json +{ + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Head": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Nonce": 42, + "Balance": "0" +} +``` + +### MessageWait Perms: read @@ -1051,12 +1119,28 @@ Inputs: ```json [ { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 10101, + 10101 +] +``` + +Response: +```json +{ + "TS": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Message": { "CID": { "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -1065,57 +1149,85 @@ Inputs: "Method": 1, "Params": "Ynl0ZSBhcnJheQ==" }, - 9, - [ - { + "Block": { + "Miner": "f01234", + "Ticket": { + "VRFProof": "Bw==" + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Bw==" + }, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] -] + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + } +} ``` -Response: `"0"` - -### GasEstimateGasLimit +### ProtocolParameters Perms: read -Inputs: +Inputs: `[]` + +Response: ```json -[ - { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, +{ + "Network": "string value", + "BlockTime": 60000000000, + "SupportedSectors": [ { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + "Size": 34359738368, + "MaxPieceSize": 1024 } ] -] +} ``` -Response: `9` - -### GasEstimateGasPremium +### ResolveToKeyAddr Perms: read @@ -1123,23 +1235,18 @@ Perms: read Inputs: ```json [ - 42, - "t01234", - 9, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + { + "Cids": null, + "Blocks": null, + "Height": 0 + } ] ``` -Response: `"0"` +Response: `"f01234"` -### GasEstimateMessageGas +### StateGetReceipt Perms: read @@ -1148,23 +1255,7 @@ Inputs: ```json [ { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - { - "MaxFee": "0", - "GasOverEstimation": 12.3 + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, [ { @@ -1180,26 +1271,22 @@ Inputs: Response: ```json { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 } ``` -## Get +### StateNetworkName -### GetActor +Perms: read + +Inputs: `[]` + +Response: `"mainnet"` + +### StateNetworkVersion Perms: read @@ -1207,25 +1294,20 @@ Perms: read Inputs: ```json [ - "t01234" + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -Response: -```json -{ - "Code": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Head": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Nonce": 42, - "Balance": "0" -} -``` +Response: `15` -### GetEntry +### StateSearchMsg Perms: read @@ -1233,20 +1315,37 @@ Perms: read Inputs: ```json [ - 10101, - 42 + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } ] ``` Response: ```json { - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "ReturnDec": {}, + "TipSet": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 } ``` -### GetFullBlock +### StateSearchMsgLimited Perms: read @@ -1256,109 +1355,79 @@ Inputs: [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + }, + 10101 ] ``` Response: ```json { - "Header": { - "Miner": "t01234", - "Ticket": { - "VRFProof": "Bw==" - }, - "ElectionProof": { - "WinCount": 9, - "VRFProof": "Bw==" - }, - "BeaconEntries": [ - { - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" - } - ], - "WinPoStProof": [ - { - "PoStProof": 8, - "ProofBytes": "Ynl0ZSBhcnJheQ==" - } - ], - "Parents": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ], - "ParentWeight": "0", - "Height": 10101, - "ParentStateRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "ParentMessageReceipts": { + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "ReturnDec": {}, + "TipSet": [ + { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Messages": { + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 +} +``` + +### StateVerifiedRegistryRootKey + + +Perms: read + +Inputs: +```json +[ + [ + { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "BLSAggregate": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "Timestamp": 42, - "BlockSig": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "ForkSignaling": 42, - "ParentBaseFee": "0" - }, - "BLSMessages": [ { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } - ], - "SECPMessages": [ + ] +] +``` + +Response: `"f01234"` + +### StateVerifierStatus + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ { - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - } + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } ] -} +] ``` -### GetParentStateRootActor +Response: `"0"` + +### StateWaitMsg Perms: read @@ -1367,82 +1436,117 @@ Inputs: ```json [ { - "Cids": null, - "Blocks": null, - "Height": 0 + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "t01234" + 42 ] ``` Response: ```json { - "Code": { + "Message": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Head": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 }, - "Nonce": 42, - "Balance": "0" + "ReturnDec": {}, + "TipSet": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 } ``` -## Has - - -### HasPassword - - -Perms: admin - -Inputs: `null` - -Response: `true` - -## List - - -### ListActor +### StateWaitMsgLimited Perms: read -Inputs: `null` +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 42, + 10101 +] +``` Response: ```json { - "t01234": { - "Code": { + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "ReturnDec": {}, + "TipSet": [ + { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Head": { + { "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - }, - "Nonce": 10, - "Balance": "100" - } + } + ], + "Height": 10101 } ``` -## Lock +### VerifyEntry -### LockWallet +Perms: read +Inputs: +```json +[ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + }, + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + }, + 10101 +] +``` -Perms: admin +Response: `true` -Inputs: `null` +## JwtAuth -Response: `{}` +### AuthNew -## Message +Perms: admin -### MessageWait +Inputs: +```json +[ + [ + "string value" + ] +] +``` + +Response: `"Ynl0ZSBhcnJheQ=="` + +### Verify Perms: read @@ -1450,232 +1554,216 @@ Perms: read Inputs: ```json [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - 10101, - 10101 + "string value", + "string value" ] ``` Response: ```json -{ - "TS": { - "Cids": null, - "Blocks": null, - "Height": 0 - }, - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "Block": { - "Miner": "t01234", - "Ticket": { - "VRFProof": "Bw==" - }, - "ElectionProof": { - "WinCount": 9, - "VRFProof": "Bw==" - }, - "BeaconEntries": [ - { - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" - } - ], - "WinPoStProof": [ - { - "PoStProof": 8, - "ProofBytes": "Ynl0ZSBhcnJheQ==" - } - ], - "Parents": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ], - "ParentWeight": "0", - "Height": 10101, - "ParentStateRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "ParentMessageReceipts": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Messages": { +[ + "string value" +] +``` + +## Market + +### StateMarketParticipants + + +Perms: read + +Inputs: +```json +[ + [ + { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "BLSAggregate": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "Timestamp": 42, - "BlockSig": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "ForkSignaling": 42, - "ParentBaseFee": "0" - }, - "Receipt": { - "ExitCode": 0, - "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9 + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "t026363": { + "Escrow": "0", + "Locked": "0" } } ``` -## Miner - +## MessagePool -### MinerCreateBlock +### GasBatchEstimateMessageGas -Perms: write +Perms: read Inputs: ```json [ - { - "Miner": "t01234", - "Parents": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ], - "Ticket": { - "VRFProof": "Bw==" - }, - "Eproof": { - "WinCount": 9, - "VRFProof": "Bw==" - }, - "BeaconValues": [ - { - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" - } - ], - "Messages": [ - { - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - }, + [ + { + "Msg": { "CID": { "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - } - } - ], - "Epoch": 10101, - "Timestamp": 42, - "WinningPoStProof": [ - { - "PoStProof": 8, - "ProofBytes": "Ynl0ZSBhcnJheQ==" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Spec": { + "MaxFee": "0", + "GasOverEstimation": 12.3 } - ] - } + } + ], + 42, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json -{ - "Header": { - "Miner": "t01234", - "Ticket": { - "VRFProof": "Bw==" - }, - "ElectionProof": { - "WinCount": 9, - "VRFProof": "Bw==" - }, - "BeaconEntries": [ - { - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" - } - ], - "WinPoStProof": [ - { - "PoStProof": 8, - "ProofBytes": "Ynl0ZSBhcnJheQ==" - } - ], - "Parents": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ], - "ParentWeight": "0", - "Height": 10101, - "ParentStateRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +[ + { + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" }, - "ParentMessageReceipts": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "Err": "string value" + } +] +``` + +### GasEstimateFeeCap + + +Perms: read + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, - "Messages": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + 9, + [ + { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "BLSAggregate": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "Timestamp": 42, - "BlockSig": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### GasEstimateGasLimit + + +Perms: read + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, - "ForkSignaling": 42, - "ParentBaseFee": "0" + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" }, - "BlsMessages": [ + [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } - ], - "SecpkMessages": [ + ] +] +``` + +Response: `9` + +### GasEstimateGasPremium + + +Perms: read + +Inputs: +```json +[ + 42, + "f01234", + 9, + [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } ] -} +] ``` -### MinerGetBaseInfo +Response: `"0"` + +### GasEstimateMessageGas Perms: read @@ -1683,8 +1771,25 @@ Perms: read Inputs: ```json [ - "t01234", - 10101, + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + { + "MaxFee": "0", + "GasOverEstimation": 12.3 + }, [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -1699,37 +1804,22 @@ Inputs: Response: ```json { - "MinerPower": "0", - "NetworkPower": "0", - "Sectors": [ - { - "SealProof": 8, - "SectorNumber": 9, - "SectorKey": null, - "SealedCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - } - ], - "WorkerKey": "t01234", - "SectorSize": 34359738368, - "PrevBeaconEntry": { - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, - "BeaconEntries": [ - { - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" - } - ], - "EligibleForMining": true + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" } ``` -## Mpool - - ### MpoolBatchPush @@ -1745,8 +1835,8 @@ Inputs: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -1790,8 +1880,8 @@ Inputs: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -1817,8 +1907,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -1853,8 +1943,8 @@ Inputs: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -1906,7 +1996,7 @@ Perms: admin Inputs: ```json [ - "t01234" + "f01234" ] ``` @@ -1917,13 +2007,13 @@ Response: `{}` Perms: read -Inputs: `null` +Inputs: `[]` Response: ```json { "PriorityAddrs": [ - "t01234" + "f01234" ], "SizeLimitHigh": 123, "SizeLimitLow": 123, @@ -1941,7 +2031,7 @@ Perms: read Inputs: ```json [ - "t01234" + "f01234" ] ``` @@ -1975,8 +2065,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2004,7 +2094,7 @@ Perms: admin Inputs: ```json [ - "t01234" + "f01234" ] ``` @@ -2024,8 +2114,8 @@ Inputs: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2061,8 +2151,8 @@ Inputs: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2102,8 +2192,8 @@ Inputs: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2127,8 +2217,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2161,8 +2251,8 @@ Inputs: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2218,8 +2308,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2271,8 +2361,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2303,7 +2393,7 @@ Inputs: [ { "PriorityAddrs": [ - "t01234" + "f01234" ], "SizeLimitHigh": 123, "SizeLimitLow": 123, @@ -2321,7 +2411,7 @@ Response: `{}` Perms: read -Inputs: `null` +Inputs: `[]` Response: ```json @@ -2333,8 +2423,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2354,198 +2444,9 @@ Response: } ``` -## Msig - - -### MsigAddApprove - - -Perms: sign - -Inputs: -```json -[ - "t01234", - "t01234", - 42, - "t01234", - "t01234", - true -] -``` - -Response: -```json -{ - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" -} -``` - -### MsigAddCancel - - -Perms: sign - -Inputs: -```json -[ - "t01234", - "t01234", - 42, - "t01234", - true -] -``` - -Response: -```json -{ - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" -} -``` - -### MsigAddPropose - - -Perms: sign - -Inputs: -```json -[ - "t01234", - "t01234", - "t01234", - true -] -``` - -Response: -```json -{ - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" -} -``` - -### MsigApprove - - -Perms: sign - -Inputs: -```json -[ - "t01234", - 42, - "t01234" -] -``` - -Response: -```json -{ - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" -} -``` - -### MsigApproveTxnHash - - -Perms: sign - -Inputs: -```json -[ - "t01234", - 42, - "t01234", - "t01234", - "0", - "t01234", - 42, - "Ynl0ZSBhcnJheQ==" -] -``` - -Response: -```json -{ - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" -} -``` - -### MsigCancel - - -Perms: sign - -Inputs: -```json -[ - "t01234", - 42, - "t01234" -] -``` - -Response: -```json -{ - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" -} -``` - -### MsigCancelTxnHash - - -Perms: sign - -Inputs: -```json -[ - "t01234", - 42, - "t01234", - "0", - "t01234", - 42, - "Ynl0ZSBhcnJheQ==" -] -``` - -Response: -```json -{ - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" -} -``` - -### MsigCreate - - -Perms: sign - -Inputs: -```json -[ - 42, - [ - "t01234" - ], - 10101, - "0", - "t01234", - "0" -] -``` - -Response: -```json -{ - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" -} -``` +## MinerState -### MsigGetVested +### StateCirculatingSupply Perms: read @@ -2553,15 +2454,6 @@ Perms: read Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ], [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -2573,147 +2465,112 @@ Inputs: ] ``` -Response: `"0"` - -### MsigPropose - - -Perms: sign - -Inputs: -```json -[ - "t01234", - "t01234", - "0", - "t01234", - 42, - "Ynl0ZSBhcnJheQ==" -] -``` - -Response: -```json -{ - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" -} -``` - -### MsigRemoveSigner - - -Perms: sign - -Inputs: -```json -[ - "t01234", - "t01234", - "t01234", - true -] -``` - -Response: -```json -{ - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" -} -``` +Response: `"0"` -### MsigSwapApprove +### StateDealProviderCollateralBounds -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "t01234", - 42, - "t01234", - "t01234", - "t01234" + 1032, + true, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "Min": "0", + "Max": "0" } ``` -### MsigSwapCancel +### StateListActors -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "t01234", - 42, - "t01234", - "t01234" + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json -{ - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" -} +[ + "f01234" +] ``` -### MsigSwapPropose +### StateListMiners -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "t01234", - "t01234", - "t01234" + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json -{ - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" -} +[ + "f01234" +] ``` -## Net - - -### NetAddrsListen +### StateLookupID Perms: read -Inputs: `null` - -Response: +Inputs: ```json -{ - "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [ - "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } ] -} +] ``` -## Network - +Response: `"f01234"` -### NetworkConnect +### StateMarketBalance Perms: read @@ -2721,8 +2578,14 @@ Perms: read Inputs: ```json [ + "f01234", [ - "string value" + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } ] ] ``` @@ -2730,12 +2593,12 @@ Inputs: Response: ```json { - "PeerID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Err": {} + "Escrow": "0", + "Locked": "0" } ``` -### NetworkFindPeer +### StateMarketDeals Perms: read @@ -2743,21 +2606,46 @@ Perms: read Inputs: ```json [ - "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json { - "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [ - "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" - ] + "t026363": { + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "State": { + "SectorStartEpoch": 10101, + "LastUpdatedEpoch": 10101, + "SlashEpoch": 10101 + } + } } ``` -### NetworkFindProvidersAsync +### StateMarketStorageDeal Perms: read @@ -2765,41 +2653,45 @@ Perms: read Inputs: ```json [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - 123 -] -``` - -Response: -```json -{ - "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [ - "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + 5432, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } ] -} +] ``` -### NetworkGetBandwidthStats - - -Perms: admin - -Inputs: `null` - Response: ```json { - "TotalIn": 9, - "TotalOut": 9, - "RateIn": 12.3, - "RateOut": 12.3 + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "State": { + "SectorStartEpoch": 10101, + "LastUpdatedEpoch": 10101, + "SlashEpoch": 10101 + } } ``` -### NetworkGetClosestPeers +### StateMinerActiveSectors Perms: read @@ -2807,237 +2699,268 @@ Perms: read Inputs: ```json [ - "string value" -] -``` - -Response: -```json -[ - "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -### NetworkGetPeerAddresses - - -Perms: admin - -Inputs: `null` - Response: ```json [ - "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" -] -``` - -### NetworkGetPeerID - - -Perms: admin - -Inputs: `null` - -Response: `"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"` - -### NetworkPeers - - -Perms: read - -Inputs: -```json -[ - true, - true, - true -] -``` - -Response: -```json -{ - "Peers": [ - { - "Addr": "string value", - "Peer": "string value", - "Latency": "string value", - "Muxer": "string value", - "Streams": [ - { - "Protocol": "string value" - } - ] - } - ] -} + { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null + } +] ``` -## Paych - - -### PaychAllocateLane +### StateMinerAvailableBalance -Perms: sign +Perms: read Inputs: ```json [ - "t01234" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -Response: `42` +Response: `"0"` -### PaychAvailableFunds +### StateMinerDeadlines -Perms: sign +Perms: read Inputs: ```json [ - "t01234" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json -{ - "Channel": "\u003cempty\u003e", - "From": "t01234", - "To": "t01234", - "ConfirmedAmt": "0", - "PendingAmt": "0", - "PendingWaitSentinel": null, - "QueuedAmt": "0", - "VoucherReedeemedAmt": "0" -} +[ + { + "PostSubmissions": [ + 5, + 1 + ], + "DisputableProofCount": 42 + } +] ``` -### PaychAvailableFundsByFromTo +### StateMinerFaults -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "t01234" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json -{ - "Channel": "\u003cempty\u003e", - "From": "t01234", - "To": "t01234", - "ConfirmedAmt": "0", - "PendingAmt": "0", - "PendingWaitSentinel": null, - "QueuedAmt": "0", - "VoucherReedeemedAmt": "0" -} +[ + 5, + 1 +] ``` -### PaychCollect +### StateMinerInfo -Perms: sign +Perms: read Inputs: ```json [ - "t01234" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "Owner": "f01234", + "Worker": "f01234", + "NewWorker": "f01234", + "ControlAddresses": [ + "f01234" + ], + "WorkerChangeEpoch": 10101, + "PeerId": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Multiaddrs": [ + "Ynl0ZSBhcnJheQ==" + ], + "WindowPoStProofType": 8, + "SectorSize": 34359738368, + "WindowPoStPartitionSectors": 42, + "ConsensusFaultElapsed": 10101 } ``` -### PaychGet +### StateMinerInitialPledgeCollateral -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "t01234", - "0" + "f01234", + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SealRandEpoch": 10101, + "DealIDs": [ + 5432 + ], + "Expiration": 10101, + "ReplaceCapacity": true, + "ReplaceSectorDeadline": 42, + "ReplaceSectorPartition": 42, + "ReplaceSectorNumber": 9 + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -Response: -```json -{ - "Channel": "t01234", - "WaitSentinel": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } -} -``` +Response: `"0"` -### PaychGetWaitReady +### StateMinerPartitions -Perms: sign +Perms: read Inputs: ```json [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "f01234", + 42, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -Response: `"t01234"` - -### PaychList - - -Perms: read - -Inputs: `null` - Response: ```json [ - "t01234" + { + "AllSectors": [ + 5, + 1 + ], + "FaultySectors": [ + 5, + 1 + ], + "RecoveringSectors": [ + 5, + 1 + ], + "LiveSectors": [ + 5, + 1 + ], + "ActiveSectors": [ + 5, + 1 + ] + } ] ``` -### PaychNewPayment +### StateMinerPower -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "t01234", + "f01234", [ { - "Amount": "0", - "TimeLockMin": 10101, - "TimeLockMax": 10101, - "MinSettle": 10101, - "Extra": { - "Actor": "t01234", - "Method": 1, - "Data": "Ynl0ZSBhcnJheQ==" - } + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } ] ] @@ -3046,60 +2969,95 @@ Inputs: Response: ```json { - "Channel": "t01234", - "WaitSentinel": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "MinerPower": { + "RawBytePower": "0", + "QualityAdjPower": "0" }, - "Vouchers": [ - { - "ChannelAddr": "t01234", - "TimeLockMin": 10101, - "TimeLockMax": 10101, - "SecretPreimage": "Ynl0ZSBhcnJheQ==", - "Extra": { - "Actor": "t01234", - "Method": 1, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "Lane": 42, - "Nonce": 42, - "Amount": "0", - "MinSettleHeight": 10101, - "Merges": [ - { - "Lane": 42, - "Nonce": 42 - } - ], - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - } + "TotalPower": { + "RawBytePower": "0", + "QualityAdjPower": "0" + }, + "HasMinPower": true +} +``` + +### StateMinerPreCommitDepositForPower + + +Perms: read + +Inputs: +```json +[ + "f01234", + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SealRandEpoch": 10101, + "DealIDs": [ + 5432 + ], + "Expiration": 10101, + "ReplaceCapacity": true, + "ReplaceSectorDeadline": 42, + "ReplaceSectorPartition": 42, + "ReplaceSectorNumber": 9 + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } ] -} +] ``` -### PaychSettle +Response: `"0"` +### StateMinerProvingDeadline -Perms: sign + +Perms: read Inputs: ```json [ - "t01234" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "CurrentEpoch": 10101, + "PeriodStart": 10101, + "Index": 42, + "Open": 10101, + "Close": 10101, + "Challenge": 10101, + "FaultCutoff": 10101, + "WPoStPeriodDeadlines": 42, + "WPoStProvingPeriod": 10101, + "WPoStChallengeWindow": 10101, + "WPoStChallengeLookback": 10101, + "FaultDeclarationCutoff": 10101 } ``` -### PaychStatus +### StateMinerRecoveries Perms: read @@ -3107,60 +3065,50 @@ Perms: read Inputs: ```json [ - "t01234" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json -{ - "ControlAddr": "t01234", - "Direction": 1 -} +[ + 5, + 1 +] ``` -### PaychVoucherAdd +### StateMinerSectorAllocated -Perms: write +Perms: read Inputs: ```json [ - "t01234", - { - "ChannelAddr": "t01234", - "TimeLockMin": 10101, - "TimeLockMax": 10101, - "SecretPreimage": "Ynl0ZSBhcnJheQ==", - "Extra": { - "Actor": "t01234", - "Method": 1, - "Data": "Ynl0ZSBhcnJheQ==" + "f01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Lane": 42, - "Nonce": 42, - "Amount": "0", - "MinSettleHeight": 10101, - "Merges": [ - { - "Lane": 42, - "Nonce": 42 - } - ], - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } - }, - "Ynl0ZSBhcnJheQ==", - "0" + ] ] ``` -Response: `"0"` +Response: `true` -### PaychVoucherCheckSpendable +### StateMinerSectorCount Perms: read @@ -3168,40 +3116,28 @@ Perms: read Inputs: ```json [ - "t01234", - { - "ChannelAddr": "t01234", - "TimeLockMin": 10101, - "TimeLockMax": 10101, - "SecretPreimage": "Ynl0ZSBhcnJheQ==", - "Extra": { - "Actor": "t01234", - "Method": 1, - "Data": "Ynl0ZSBhcnJheQ==" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Lane": 42, - "Nonce": 42, - "Amount": "0", - "MinSettleHeight": 10101, - "Merges": [ - { - "Lane": 42, - "Nonce": 42 - } - ], - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } - }, - "Ynl0ZSBhcnJheQ==", - "Ynl0ZSBhcnJheQ==" + ] ] ``` -Response: `true` +Response: +```json +{ + "Live": 42, + "Active": 42, + "Faulty": 42 +} +``` -### PaychVoucherCheckValid +### StateMinerSectorSize Perms: read @@ -3209,200 +3145,162 @@ Perms: read Inputs: ```json [ - "t01234", - { - "ChannelAddr": "t01234", - "TimeLockMin": 10101, - "TimeLockMax": 10101, - "SecretPreimage": "Ynl0ZSBhcnJheQ==", - "Extra": { - "Actor": "t01234", - "Method": 1, - "Data": "Ynl0ZSBhcnJheQ==" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Lane": 42, - "Nonce": 42, - "Amount": "0", - "MinSettleHeight": 10101, - "Merges": [ - { - "Lane": 42, - "Nonce": 42 - } - ], - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } - } + ] ] ``` -Response: `{}` +Response: `34359738368` -### PaychVoucherCreate +### StateMinerSectors -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "0", - 42 + "f01234", + [ + 0 + ], + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json -{ - "Voucher": { - "ChannelAddr": "t01234", - "TimeLockMin": 10101, - "TimeLockMax": 10101, - "SecretPreimage": "Ynl0ZSBhcnJheQ==", - "Extra": { - "Actor": "t01234", - "Method": 1, - "Data": "Ynl0ZSBhcnJheQ==" +[ + { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Lane": 42, - "Nonce": 42, - "Amount": "0", - "MinSettleHeight": 10101, - "Merges": [ - { - "Lane": 42, - "Nonce": 42 - } + "DealIDs": [ + 5432 ], - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - } - }, - "Shortfall": "0" -} + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null + } +] ``` -### PaychVoucherList +### StateMinerWorkerAddress -Perms: write +Perms: read Inputs: ```json [ - "t01234" -] -``` - -Response: -```json -[ - { - "ChannelAddr": "t01234", - "TimeLockMin": 10101, - "TimeLockMax": 10101, - "SecretPreimage": "Ynl0ZSBhcnJheQ==", - "Extra": { - "Actor": "t01234", - "Method": 1, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "Lane": 42, - "Nonce": 42, - "Amount": "0", - "MinSettleHeight": 10101, - "Merges": [ - { - "Lane": 42, - "Nonce": 42 - } - ], - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } - } + ] ] ``` -### PaychVoucherSubmit +Response: `"f01234"` +### StateSectorExpiration -Perms: sign + +Perms: read Inputs: ```json [ - "t01234", - { - "ChannelAddr": "t01234", - "TimeLockMin": 10101, - "TimeLockMax": 10101, - "SecretPreimage": "Ynl0ZSBhcnJheQ==", - "Extra": { - "Actor": "t01234", - "Method": 1, - "Data": "Ynl0ZSBhcnJheQ==" + "f01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Lane": 42, - "Nonce": 42, - "Amount": "0", - "MinSettleHeight": 10101, - "Merges": [ - { - "Lane": 42, - "Nonce": 42 - } - ], - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } - }, - "Ynl0ZSBhcnJheQ==", - "Ynl0ZSBhcnJheQ==" + ] ] ``` Response: ```json { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "OnTime": 10101, + "Early": 10101 } ``` -## Protocol - - -### ProtocolParameters +### StateSectorGetInfo Perms: read -Inputs: `null` - -Response: +Inputs: ```json -{ - "Network": "string value", - "BlockTime": 60000000000, - "SupportedSectors": [ +[ + "f01234", + 9, + [ { - "Size": 34359738368, - "MaxPieceSize": 1024 + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } ] -} +] ``` -## Resolve - +Response: +```json +{ + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null +} +``` -### ResolveToKeyAddr +### StateSectorPartition Perms: read @@ -3410,52 +3308,75 @@ Perms: read Inputs: ```json [ - "t01234", - { - "Cids": null, - "Blocks": null, - "Height": 0 - } + "f01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -Response: `"t01234"` - -## Set - - -### SetConcurrent - - -Perms: admin - -Inputs: +Response: ```json -[ - 9 -] +{ + "Deadline": 42, + "Partition": 42 +} ``` -Response: `{}` - -### SetPassword +### StateSectorPreCommitInfo -Perms: admin +Perms: read Inputs: ```json [ - "Ynl0ZSBhcnJheQ==" + "f01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -Response: `{}` - -## State - +Response: +```json +{ + "Info": { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SealRandEpoch": 10101, + "DealIDs": [ + 5432 + ], + "Expiration": 10101, + "ReplaceCapacity": true, + "ReplaceSectorDeadline": 42, + "ReplaceSectorPartition": 42, + "ReplaceSectorNumber": 9 + }, + "PreCommitDeposit": "0", + "PreCommitEpoch": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0" +} +``` -### StateAccountKey +### StateVMCirculatingSupplyInternal Perms: read @@ -3463,7 +3384,6 @@ Perms: read Inputs: ```json [ - "t01234", [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -3475,9 +3395,19 @@ Inputs: ] ``` -Response: `"t01234"` +Response: +```json +{ + "FilVested": "0", + "FilMined": "0", + "FilBurnt": "0", + "FilLocked": "0", + "FilCirculating": "0", + "FilReserveDisbursed": "0" +} +``` -### StateCall +### StateVerifiedClientStatus Perms: read @@ -3485,21 +3415,7 @@ Perms: read Inputs: ```json [ - { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, + "f01234", [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -3511,96 +3427,50 @@ Inputs: ] ``` -Response: +Response: `"0"` + +## Mining + +### MinerCreateBlock + + +Perms: write + +Inputs: ```json -{ - "MsgCid": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Msg": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "MsgRct": { - "ExitCode": 0, - "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9 - }, - "GasCost": { - "Message": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "GasUsed": "0", - "BaseFeeBurn": "0", - "OverEstimationBurn": "0", - "MinerPenalty": "0", - "MinerTip": "0", - "Refund": "0", - "TotalCost": "0" - }, - "ExecutionTrace": { - "Msg": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" +[ + { + "Miner": "f01234", + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Ticket": { + "VRFProof": "Bw==" }, - "MsgRct": { - "ExitCode": 0, - "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9 + "Eproof": { + "WinCount": 9, + "VRFProof": "Bw==" }, - "Error": "string value", - "Duration": 60000000000, - "GasCharges": [ + "BeaconValues": [ { - "Name": "string value", - "loc": [ - { - "File": "string value", - "Line": 123, - "Function": "string value" - } - ], - "tg": 9, - "cg": 9, - "sg": 9, - "vtg": 9, - "vcg": 9, - "vsg": 9, - "tt": 60000000000, - "ex": {} + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" } ], - "Subcalls": [ + "Messages": [ { - "Msg": { + "Message": { "CID": { "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -3609,43 +3479,93 @@ Response: "Method": 1, "Params": "Ynl0ZSBhcnJheQ==" }, - "MsgRct": { - "ExitCode": 0, - "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9 + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" }, - "Error": "string value", - "Duration": 60000000000, - "GasCharges": [ - { - "Name": "string value", - "loc": [ - { - "File": "string value", - "Line": 123, - "Function": "string value" - } - ], - "tg": 9, - "cg": 9, - "sg": 9, - "vtg": 9, - "vcg": 9, - "vsg": 9, - "tt": 60000000000, - "ex": {} - } - ], - "Subcalls": null + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], + "Epoch": 10101, + "Timestamp": 42, + "WinningPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" } ] + } +] +``` + +Response: +```json +{ + "Header": { + "Miner": "f01234", + "Ticket": { + "VRFProof": "Bw==" + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Bw==" + }, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" }, - "Error": "string value", - "Duration": 60000000000 + "BlsMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "SecpkMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] } ``` -### StateCirculatingSupply +### MinerGetBaseInfo Perms: read @@ -3653,6 +3573,8 @@ Perms: read Inputs: ```json [ + "f01234", + 10101, [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -3664,205 +3586,234 @@ Inputs: ] ``` -Response: `"0"` +Response: +```json +{ + "MinerPower": "0", + "NetworkPower": "0", + "Sectors": [ + { + "SealProof": 8, + "SectorNumber": 9, + "SectorKey": null, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ], + "WorkerKey": "f01234", + "SectorSize": 34359738368, + "PrevBeaconEntry": { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "EligibleForMining": true +} +``` -### StateDealProviderCollateralBounds +## MultiSig + +### MsigAddApprove -Perms: read +Perms: sign Inputs: ```json [ - 1032, - true, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + 42, + "f01234", + "f01234", + true ] ``` Response: ```json { - "Min": "0", - "Max": "0" + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } ``` -### StateGetActor +### MsigAddCancel -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + 42, + "f01234", + true ] ``` Response: ```json { - "Code": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Head": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Nonce": 42, - "Balance": "0" + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } ``` -### StateGetReceipt +### MsigAddPropose -Perms: read +Perms: sign Inputs: ```json [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + "f01234", + true ] ``` Response: ```json { - "ExitCode": 0, - "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9 + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigApprove + + +Perms: sign + +Inputs: +```json +[ + "f01234", + 42, + "f01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } ``` -### StateListActors +### MsigApproveTxnHash -Perms: read +Perms: sign Inputs: ```json [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + 42, + "f01234", + "f01234", + "0", + "f01234", + 42, + "Ynl0ZSBhcnJheQ==" ] ``` Response: ```json -[ - "t01234" -] +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} ``` -### StateListMiners +### MsigCancel -Perms: read +Perms: sign Inputs: ```json [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + 42, + "f01234" ] ``` Response: ```json -[ - "t01234" -] +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} ``` -### StateLookupID +### MsigCancelTxnHash +MsigCancel cancels a previously-proposed multisig message +It takes the following params: , , , , +, , -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + 42, + "f01234", + "0", + "f01234", + 42, + "Ynl0ZSBhcnJheQ==" ] ``` -Response: `"t01234"` +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` -### StateMarketBalance +### MsigCreate +MsigCreate creates a multisig wallet +It takes the following params: , , +, , -Perms: read +Perms: sign Inputs: ```json [ - "t01234", + 42, [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234" + ], + 10101, + "0", + "f01234", + "0" ] ``` Response: ```json { - "Escrow": "0", - "Locked": "0" + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } ``` -### StateMarketDeals +### MsigGetVested Perms: read @@ -3870,6 +3821,15 @@ Perms: read Inputs: ```json [ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -3881,209 +3841,143 @@ Inputs: ] ``` -Response: -```json -{ - "t026363": { - "Proposal": { - "PieceCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceSize": 1032, - "VerifiedDeal": true, - "Client": "t01234", - "Provider": "t01234", - "Label": "string value", - "StartEpoch": 10101, - "EndEpoch": 10101, - "StoragePricePerEpoch": "0", - "ProviderCollateral": "0", - "ClientCollateral": "0" - }, - "State": { - "SectorStartEpoch": 10101, - "LastUpdatedEpoch": 10101, - "SlashEpoch": 10101 - } - } -} -``` +Response: `"0"` -### StateMarketParticipants +### MsigPropose -Perms: read +Perms: sign Inputs: ```json [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + "0", + "f01234", + 42, + "Ynl0ZSBhcnJheQ==" ] ``` Response: ```json { - "t026363": { - "Escrow": "0", - "Locked": "0" - } + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } ``` -### StateMarketStorageDeal +### MsigRemoveSigner -Perms: read +Perms: sign Inputs: ```json [ - 5432, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + "f01234", + true ] ``` Response: ```json { - "Proposal": { - "PieceCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceSize": 1032, - "VerifiedDeal": true, - "Client": "t01234", - "Provider": "t01234", - "Label": "string value", - "StartEpoch": 10101, - "EndEpoch": 10101, - "StoragePricePerEpoch": "0", - "ProviderCollateral": "0", - "ClientCollateral": "0" - }, - "State": { - "SectorStartEpoch": 10101, - "LastUpdatedEpoch": 10101, - "SlashEpoch": 10101 - } + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } ``` -### StateMinerActiveSectors +### MsigSwapApprove -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + 42, + "f01234", + "f01234", + "f01234" ] ``` Response: ```json -[ - { - "SectorNumber": 9, - "SealProof": 8, - "SealedCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "DealIDs": [ - 5432 - ], - "Activation": 10101, - "Expiration": 10101, - "DealWeight": "0", - "VerifiedDealWeight": "0", - "InitialPledge": "0", - "ExpectedDayReward": "0", - "ExpectedStoragePledge": "0", - "SectorKeyCID": null - } -] +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} ``` -### StateMinerAvailableBalance +### MsigSwapCancel -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + 42, + "f01234", + "f01234" ] ``` -Response: `"0"` +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` -### StateMinerDeadlines +### MsigSwapPropose -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + "f01234", + "f01234" ] ``` Response: ```json -[ - { - "PostSubmissions": [ - 5, - 1 - ], - "DisputableProofCount": 42 - } -] +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +## Network + +### NetAddrsListen + + +Perms: read + +Inputs: `[]` + +Response: +```json +{ + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] +} ``` -### StateMinerFaults +### NetworkConnect Perms: read @@ -4091,27 +3985,21 @@ Perms: read Inputs: ```json [ - "t01234", [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } + "string value" ] ] ``` Response: ```json -[ - 5, - 1 -] +{ + "PeerID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Err": {} +} ``` -### StateMinerInfo +### NetworkFindPeer Perms: read @@ -4119,40 +4007,21 @@ Perms: read Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" ] ``` Response: ```json { - "Owner": "t01234", - "Worker": "t01234", - "NewWorker": "t01234", - "ControlAddresses": [ - "t01234" - ], - "WorkerChangeEpoch": 10101, - "PeerId": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Multiaddrs": [ - "Ynl0ZSBhcnJheQ==" - ], - "WindowPoStProofType": 8, - "SectorSize": 34359738368, - "WindowPoStPartitionSectors": 42, - "ConsensusFaultElapsed": 10101 + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` -### StateMinerInitialPledgeCollateral +### NetworkFindProvidersAsync Perms: read @@ -4160,86 +4029,41 @@ Perms: read Inputs: ```json [ - "t01234", { - "SealProof": 8, - "SectorNumber": 9, - "SealedCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "SealRandEpoch": 10101, - "DealIDs": [ - 5432 - ], - "Expiration": 10101, - "ReplaceCapacity": true, - "ReplaceSectorDeadline": 42, - "ReplaceSectorPartition": 42, - "ReplaceSectorNumber": 9 + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + 123 ] ``` -Response: `"0"` +Response: +```json +{ + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] +} +``` -### StateMinerPartitions +### NetworkGetBandwidthStats -Perms: read +Perms: admin -Inputs: -```json -[ - "t01234", - 42, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] -] -``` +Inputs: `[]` Response: ```json -[ - { - "AllSectors": [ - 5, - 1 - ], - "FaultySectors": [ - 5, - 1 - ], - "RecoveringSectors": [ - 5, - 1 - ], - "LiveSectors": [ - 5, - 1 - ], - "ActiveSectors": [ - 5, - 1 - ] - } -] +{ + "TotalIn": 9, + "TotalOut": 9, + "RateIn": 12.3, + "RateOut": 12.3 +} ``` -### StateMinerPower +### NetworkGetClosestPeers Perms: read @@ -4247,72 +4071,41 @@ Perms: read Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "string value" ] ``` Response: ```json -{ - "MinerPower": { - "RawBytePower": "0", - "QualityAdjPower": "0" - }, - "TotalPower": { - "RawBytePower": "0", - "QualityAdjPower": "0" - }, - "HasMinPower": true -} +[ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" +] ``` -### StateMinerPreCommitDepositForPower +### NetworkGetPeerAddresses -Perms: read +Perms: admin -Inputs: +Inputs: `[]` + +Response: ```json [ - "t01234", - { - "SealProof": 8, - "SectorNumber": 9, - "SealedCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "SealRandEpoch": 10101, - "DealIDs": [ - 5432 - ], - "Expiration": 10101, - "ReplaceCapacity": true, - "ReplaceSectorDeadline": 42, - "ReplaceSectorPartition": 42, - "ReplaceSectorNumber": 9 - }, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" ] ``` -Response: `"0"` +### NetworkGetPeerID -### StateMinerProvingDeadline + +Perms: admin + +Inputs: `[]` + +Response: `"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"` + +### NetworkPeers Perms: read @@ -4320,276 +4113,299 @@ Perms: read Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, + true, + true, + true +] +``` + +Response: +```json +{ + "Peers": [ { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + "Addr": "string value", + "Peer": "string value", + "Latency": "string value", + "Muxer": "string value", + "Streams": [ + { + "Protocol": "string value" + } + ] } ] -] +} ``` +### Version + + +Perms: read + +Inputs: `[]` + Response: ```json { - "CurrentEpoch": 10101, - "PeriodStart": 10101, - "Index": 42, - "Open": 10101, - "Close": 10101, - "Challenge": 10101, - "FaultCutoff": 10101, - "WPoStPeriodDeadlines": 42, - "WPoStProvingPeriod": 10101, - "WPoStChallengeWindow": 10101, - "WPoStChallengeLookback": 10101, - "FaultDeclarationCutoff": 10101 + "Version": "string value", + "APIVersion": 131584 } ``` -### StateMinerRecoveries +## Paychan + +### PaychAllocateLane +PaychAllocateLane Allocate late creates a lane within a payment channel so that calls to +CreatePaymentVoucher will automatically make vouchers only for the difference in total -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234" ] ``` -Response: -```json -[ - 5, - 1 -] -``` +Response: `42` -### StateMinerSectorAllocated +### PaychAvailableFunds +PaychAvailableFunds get the status of an outbound payment channel +@pch: payment channel address -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - 9, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234" ] ``` -Response: `true` +Response: +```json +{ + "Channel": "\u003cempty\u003e", + "From": "f01234", + "To": "f01234", + "ConfirmedAmt": "0", + "PendingAmt": "0", + "PendingWaitSentinel": null, + "QueuedAmt": "0", + "VoucherReedeemedAmt": "0" +} +``` -### StateMinerSectorCount +### PaychAvailableFundsByFromTo +PaychAvailableFundsByFromTo get the status of an outbound payment channel +@from: the payment channel sender +@to: he payment channel recipient -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234" ] ``` Response: ```json { - "Live": 42, - "Active": 42, - "Faulty": 42 + "Channel": "\u003cempty\u003e", + "From": "f01234", + "To": "f01234", + "ConfirmedAmt": "0", + "PendingAmt": "0", + "PendingWaitSentinel": null, + "QueuedAmt": "0", + "VoucherReedeemedAmt": "0" } ``` -### StateMinerSectorSize +### PaychCollect +PaychCollect update payment channel status to collect +Collect sends the value of submitted vouchers to the channel recipient (the provider), +and refunds the remaining channel balance to the channel creator (the client). +@pch: payment channel address -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234" ] ``` -Response: `34359738368` +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` -### StateMinerSectors +### PaychGet +PaychGet creates a payment channel to a provider with a amount of FIL +@from: the payment channel sender +@to: the payment channel recipient +@amt: the deposits funds in the payment channel -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - 0 - ], - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + "0" ] ``` Response: ```json -[ - { - "SectorNumber": 9, - "SealProof": 8, - "SealedCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "DealIDs": [ - 5432 - ], - "Activation": 10101, - "Expiration": 10101, - "DealWeight": "0", - "VerifiedDealWeight": "0", - "InitialPledge": "0", - "ExpectedDayReward": "0", - "ExpectedStoragePledge": "0", - "SectorKeyCID": null +{ + "Channel": "f01234", + "WaitSentinel": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } -] +} ``` -### StateMinerWorkerAddress +### PaychGetWaitReady +PaychGetWaitReady waits until the create channel / add funds message with the sentinel +@sentinel: given message CID arrives. +@ch: the returned channel address can safely be used against the Manager methods. -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } ] ``` -Response: `"t01234"` +Response: `"f01234"` -### StateNetworkName +### PaychList +PaychList list the addresses of all channels that have been created Perms: read -Inputs: `null` +Inputs: `[]` -Response: `"mainnet"` +Response: +```json +[ + "f01234" +] +``` -### StateNetworkVersion +### PaychNewPayment +PaychNewPayment aggregate vouchers into a new lane +@from: the payment channel sender +@to: the payment channel recipient +@vouchers: the outstanding (non-redeemed) vouchers -Perms: read +Perms: sign Inputs: ```json [ + "f01234", + "f01234", [ { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + "Amount": "0", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "MinSettle": 10101, + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + } } ] ] ``` -Response: `14` +Response: +```json +{ + "Channel": "f01234", + "WaitSentinel": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Vouchers": [ + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } + ] +} +``` -### StateSearchMsg +### PaychSettle +PaychSettle update payment channel status to settle +After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain +@pch: payment channel address -Perms: read +Perms: sign Inputs: ```json [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "f01234" ] ``` Response: ```json { - "Message": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Receipt": { - "ExitCode": 0, - "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9 - }, - "ReturnDec": {}, - "TipSet": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ], - "Height": 10101 + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } ``` -### StateSearchMsgLimited +### PaychStatus +PaychStatus get the payment channel status +@pch: payment channel address Perms: read @@ -4597,67 +4413,66 @@ Perms: read Inputs: ```json [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - 10101 + "f01234" ] ``` Response: ```json { - "Message": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Receipt": { - "ExitCode": 0, - "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9 - }, - "ReturnDec": {}, - "TipSet": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ], - "Height": 10101 + "ControlAddr": "f01234", + "Direction": 1 } ``` -### StateSectorExpiration +### PaychVoucherAdd +PaychVoucherAdd adds a voucher for an inbound channel. +If the channel is not in the store, fetches the channel from state (and checks that +the channel To address is owned by the wallet). -Perms: read +Perms: write Inputs: ```json [ - "t01234", - 9, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "f01234", + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" } - ] + }, + "Ynl0ZSBhcnJheQ==", + "0" ] ``` -Response: -```json -{ - "OnTime": 10101, - "Early": 10101 -} -``` +Response: `"0"` -### StateSectorGetInfo +### PaychVoucherCheckSpendable +PaychVoucherCheckSpendable checks if the given voucher is currently spendable +@pch: payment channel address +@sv: voucher Perms: read @@ -4665,42 +4480,45 @@ Perms: read Inputs: ```json [ - "t01234", - 9, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "f01234", + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" } - ] + }, + "Ynl0ZSBhcnJheQ==", + "Ynl0ZSBhcnJheQ==" ] ``` -Response: -```json -{ - "SectorNumber": 9, - "SealProof": 8, - "SealedCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "DealIDs": [ - 5432 - ], - "Activation": 10101, - "Expiration": 10101, - "DealWeight": "0", - "VerifiedDealWeight": "0", - "InitialPledge": "0", - "ExpectedDayReward": "0", - "ExpectedStoragePledge": "0", - "SectorKeyCID": null -} -``` +Response: `true` -### StateSectorPartition +### PaychVoucherCheckValid +PaychVoucherCheckValid checks if the given voucher is valid (is or could become spendable at some point). +If the channel is not in the store, fetches the channel from state (and checks that +the channel To address is owned by the wallet). +@pch: payment channel address +@sv: voucher Perms: read @@ -4708,149 +4526,209 @@ Perms: read Inputs: ```json [ - "t01234", - 9, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "f01234", + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" } - ] + } ] ``` -Response: -```json -{ - "Deadline": 42, - "Partition": 42 -} -``` +Response: `{}` -### StateSectorPreCommitInfo +### PaychVoucherCreate +PaychVoucherCreate creates a new signed voucher on the given payment channel +with the given lane and amount. The value passed in is exactly the value +that will be used to create the voucher, so if previous vouchers exist, the +actual additional value of this voucher will only be the difference between +the two. +If there are insufficient funds in the channel to create the voucher, +returns a nil voucher and the shortfall. -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - 9, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "0", + 42 ] ``` Response: ```json { - "Info": { - "SealProof": 8, - "SectorNumber": 9, - "SealedCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "Voucher": { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" }, - "SealRandEpoch": 10101, - "DealIDs": [ - 5432 + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } ], - "Expiration": 10101, - "ReplaceCapacity": true, - "ReplaceSectorDeadline": 42, - "ReplaceSectorPartition": 42, - "ReplaceSectorNumber": 9 + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } }, - "PreCommitDeposit": "0", - "PreCommitEpoch": 10101, - "DealWeight": "0", - "VerifiedDealWeight": "0" + "Shortfall": "0" } ``` -### StateVMCirculatingSupplyInternal +### PaychVoucherList +PaychVoucherList list vouchers in payment channel +@pch: payment channel address -Perms: read +Perms: write Inputs: ```json [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234" ] ``` Response: ```json -{ - "FilVested": "0", - "FilMined": "0", - "FilBurnt": "0", - "FilLocked": "0", - "FilCirculating": "0", - "FilReserveDisbursed": "0" -} +[ + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } +] ``` -### StateVerifiedClientStatus +### PaychVoucherSubmit +PaychVoucherSubmit Submit voucher to chain to update payment channel state +@pch: payment channel address +@sv: voucher in payment channel -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "f01234", + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" } - ] + }, + "Ynl0ZSBhcnJheQ==", + "Ynl0ZSBhcnJheQ==" ] ``` -Response: `"0"` +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +## Syncer -### StateVerifiedRegistryRootKey +### ChainSyncHandleNewTipSet -Perms: read +Perms: write Inputs: ```json [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + { + "Source": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Sender": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Head": { + "Cids": null, + "Blocks": null, + "Height": 0 } - ] + } ] ``` -Response: `"t01234"` +Response: `{}` -### StateVerifierStatus +### ChainTipSetWeight Perms: read @@ -4858,7 +4736,6 @@ Perms: read Inputs: ```json [ - "t01234", [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -4872,46 +4749,30 @@ Inputs: Response: `"0"` -### StateWaitMsg +### Concurrent Perms: read +Inputs: `[]` + +Response: `9` + +### SetConcurrent + + +Perms: admin + Inputs: ```json [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - 42 + 9 ] ``` -Response: -```json -{ - "Message": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Receipt": { - "ExitCode": 0, - "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9 - }, - "ReturnDec": {}, - "TipSet": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ], - "Height": 10101 -} -``` +Response: `{}` -### StateWaitMsgLimited +### StateCall Perms: read @@ -4920,46 +4781,171 @@ Inputs: ```json [ { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" }, - 42, - 10101 + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json { - "Message": { + "MsgCid": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Receipt": { + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "MsgRct": { "ExitCode": 0, "Return": "Ynl0ZSBhcnJheQ==", "GasUsed": 9 }, - "ReturnDec": {}, - "TipSet": [ - { + "GasCost": { + "Message": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ], - "Height": 10101 + "GasUsed": "0", + "BaseFeeBurn": "0", + "OverEstimationBurn": "0", + "MinerPenalty": "0", + "MinerTip": "0", + "Refund": "0", + "TotalCost": "0" + }, + "ExecutionTrace": { + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": [ + { + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": null + } + ] + }, + "Error": "string value", + "Duration": 60000000000 } ``` -## Sync - - ### SyncState Perms: read -Inputs: `null` +Inputs: `[]` Response: ```json @@ -4998,7 +4984,7 @@ Inputs: [ { "Header": { - "Miner": "t01234", + "Miner": "f01234", "Ticket": { "VRFProof": "Bw==" }, @@ -5062,15 +5048,12 @@ Inputs: Response: `{}` -## Syncer - - ### SyncerTracker Perms: read -Inputs: `null` +Inputs: `[]` Response: ```json @@ -5128,10 +5111,27 @@ Response: } ``` -## Un +## Wallet +### HasPassword -### UnLockWallet + +Perms: admin + +Inputs: `[]` + +Response: `true` + +### LockWallet + + +Perms: admin + +Inputs: `[]` + +Response: `{}` + +### SetPassword Perms: admin @@ -5145,41 +5145,31 @@ Inputs: Response: `{}` -## Verify - - -### VerifyEntry +### UnLockWallet -Perms: read +Perms: admin Inputs: ```json [ - { - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" - }, - 10101 + "Ynl0ZSBhcnJheQ==" ] ``` -Response: `true` - -## Wallet - +Response: `{}` ### WalletAddresses Perms: admin -Inputs: `null` +Inputs: `[]` Response: ```json [ - "t01234" + "f01234" ] ``` @@ -5191,7 +5181,7 @@ Perms: read Inputs: ```json [ - "t01234" + "f01234" ] ``` @@ -5202,9 +5192,9 @@ Response: `"0"` Perms: write -Inputs: `null` +Inputs: `[]` -Response: `"t01234"` +Response: `"f01234"` ### WalletExport @@ -5214,7 +5204,7 @@ Perms: admin Inputs: ```json [ - "t01234", + "f01234", "string value" ] ``` @@ -5235,7 +5225,7 @@ Perms: write Inputs: ```json [ - "t01234" + "f01234" ] ``` @@ -5256,7 +5246,7 @@ Inputs: ] ``` -Response: `"t01234"` +Response: `"f01234"` ### WalletNewAddress @@ -5270,7 +5260,7 @@ Inputs: ] ``` -Response: `"t01234"` +Response: `"f01234"` ### WalletSetDefault @@ -5280,7 +5270,7 @@ Perms: write Inputs: ```json [ - "t01234" + "f01234" ] ``` @@ -5294,7 +5284,7 @@ Perms: sign Inputs: ```json [ - "t01234", + "f01234", "Ynl0ZSBhcnJheQ==", { "Type": "message", @@ -5319,14 +5309,14 @@ Perms: sign Inputs: ```json [ - "t01234", + "f01234", { "CID": { "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -5346,8 +5336,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -5371,7 +5361,7 @@ Response: Perms: admin -Inputs: `null` +Inputs: `[]` Response: `123` diff --git a/venus-shared/api/v1-api-document.md b/venus-shared/api/chain/v1/method.md similarity index 88% rename from venus-shared/api/v1-api-document.md rename to venus-shared/api/chain/v1/method.md index bed3048ee5..b1f2b314f3 100644 --- a/venus-shared/api/v1-api-document.md +++ b/venus-shared/api/chain/v1/method.md @@ -1,16 +1,19 @@ # Groups -* [](#) - * [Concurrent](#Concurrent) - * [Verify](#Verify) - * [Version](#Version) -* [Auth](#Auth) - * [AuthNew](#AuthNew) + +* [Account](#Account) + * [StateAccountKey](#StateAccountKey) +* [Actor](#Actor) + * [ListActor](#ListActor) + * [StateGetActor](#StateGetActor) * [Beacon](#Beacon) * [BeaconGetEntry](#BeaconGetEntry) -* [Block](#Block) - * [BlockTime](#BlockTime) -* [Chain](#Chain) +* [BlockStore](#BlockStore) * [ChainDeleteObj](#ChainDeleteObj) + * [ChainHasObj](#ChainHasObj) + * [ChainReadObj](#ChainReadObj) + * [ChainStatObj](#ChainStatObj) +* [ChainInfo](#ChainInfo) + * [BlockTime](#BlockTime) * [ChainExport](#ChainExport) * [ChainGetBlock](#ChainGetBlock) * [ChainGetBlockMessages](#ChainGetBlockMessages) @@ -25,38 +28,37 @@ * [ChainGetTipSet](#ChainGetTipSet) * [ChainGetTipSetAfterHeight](#ChainGetTipSetAfterHeight) * [ChainGetTipSetByHeight](#ChainGetTipSetByHeight) - * [ChainHasObj](#ChainHasObj) * [ChainHead](#ChainHead) * [ChainList](#ChainList) * [ChainNotify](#ChainNotify) - * [ChainReadObj](#ChainReadObj) * [ChainSetHead](#ChainSetHead) - * [ChainStatObj](#ChainStatObj) - * [ChainSyncHandleNewTipSet](#ChainSyncHandleNewTipSet) - * [ChainTipSetWeight](#ChainTipSetWeight) -* [Gas](#Gas) - * [GasBatchEstimateMessageGas](#GasBatchEstimateMessageGas) - * [GasEstimateFeeCap](#GasEstimateFeeCap) - * [GasEstimateGasLimit](#GasEstimateGasLimit) - * [GasEstimateGasPremium](#GasEstimateGasPremium) - * [GasEstimateMessageGas](#GasEstimateMessageGas) -* [Get](#Get) * [GetActor](#GetActor) * [GetEntry](#GetEntry) * [GetFullBlock](#GetFullBlock) * [GetParentStateRootActor](#GetParentStateRootActor) -* [Has](#Has) - * [HasPassword](#HasPassword) -* [List](#List) - * [ListActor](#ListActor) -* [Lock](#Lock) - * [LockWallet](#LockWallet) -* [Message](#Message) * [MessageWait](#MessageWait) -* [Miner](#Miner) - * [MinerCreateBlock](#MinerCreateBlock) - * [MinerGetBaseInfo](#MinerGetBaseInfo) -* [Mpool](#Mpool) + * [ProtocolParameters](#ProtocolParameters) + * [ResolveToKeyAddr](#ResolveToKeyAddr) + * [StateGetRandomnessFromBeacon](#StateGetRandomnessFromBeacon) + * [StateGetRandomnessFromTickets](#StateGetRandomnessFromTickets) + * [StateNetworkName](#StateNetworkName) + * [StateNetworkVersion](#StateNetworkVersion) + * [StateSearchMsg](#StateSearchMsg) + * [StateVerifiedRegistryRootKey](#StateVerifiedRegistryRootKey) + * [StateVerifierStatus](#StateVerifierStatus) + * [StateWaitMsg](#StateWaitMsg) + * [VerifyEntry](#VerifyEntry) +* [JwtAuth](#JwtAuth) + * [AuthNew](#AuthNew) + * [Verify](#Verify) +* [Market](#Market) + * [StateMarketParticipants](#StateMarketParticipants) +* [MessagePool](#MessagePool) + * [GasBatchEstimateMessageGas](#GasBatchEstimateMessageGas) + * [GasEstimateFeeCap](#GasEstimateFeeCap) + * [GasEstimateGasLimit](#GasEstimateGasLimit) + * [GasEstimateGasPremium](#GasEstimateGasPremium) + * [GasEstimateMessageGas](#GasEstimateMessageGas) * [MpoolBatchPush](#MpoolBatchPush) * [MpoolBatchPushMessage](#MpoolBatchPushMessage) * [MpoolBatchPushUntrusted](#MpoolBatchPushUntrusted) @@ -77,7 +79,41 @@ * [MpoolSelects](#MpoolSelects) * [MpoolSetConfig](#MpoolSetConfig) * [MpoolSub](#MpoolSub) -* [Msig](#Msig) +* [MinerState](#MinerState) + * [StateCirculatingSupply](#StateCirculatingSupply) + * [StateDealProviderCollateralBounds](#StateDealProviderCollateralBounds) + * [StateListActors](#StateListActors) + * [StateListMiners](#StateListMiners) + * [StateLookupID](#StateLookupID) + * [StateMarketBalance](#StateMarketBalance) + * [StateMarketDeals](#StateMarketDeals) + * [StateMarketStorageDeal](#StateMarketStorageDeal) + * [StateMinerActiveSectors](#StateMinerActiveSectors) + * [StateMinerAvailableBalance](#StateMinerAvailableBalance) + * [StateMinerDeadlines](#StateMinerDeadlines) + * [StateMinerFaults](#StateMinerFaults) + * [StateMinerInfo](#StateMinerInfo) + * [StateMinerInitialPledgeCollateral](#StateMinerInitialPledgeCollateral) + * [StateMinerPartitions](#StateMinerPartitions) + * [StateMinerPower](#StateMinerPower) + * [StateMinerPreCommitDepositForPower](#StateMinerPreCommitDepositForPower) + * [StateMinerProvingDeadline](#StateMinerProvingDeadline) + * [StateMinerRecoveries](#StateMinerRecoveries) + * [StateMinerSectorAllocated](#StateMinerSectorAllocated) + * [StateMinerSectorCount](#StateMinerSectorCount) + * [StateMinerSectorSize](#StateMinerSectorSize) + * [StateMinerSectors](#StateMinerSectors) + * [StateMinerWorkerAddress](#StateMinerWorkerAddress) + * [StateSectorExpiration](#StateSectorExpiration) + * [StateSectorGetInfo](#StateSectorGetInfo) + * [StateSectorPartition](#StateSectorPartition) + * [StateSectorPreCommitInfo](#StateSectorPreCommitInfo) + * [StateVMCirculatingSupplyInternal](#StateVMCirculatingSupplyInternal) + * [StateVerifiedClientStatus](#StateVerifiedClientStatus) +* [Mining](#Mining) + * [MinerCreateBlock](#MinerCreateBlock) + * [MinerGetBaseInfo](#MinerGetBaseInfo) +* [MultiSig](#MultiSig) * [MsigAddApprove](#MsigAddApprove) * [MsigAddCancel](#MsigAddCancel) * [MsigAddPropose](#MsigAddPropose) @@ -92,9 +128,8 @@ * [MsigSwapApprove](#MsigSwapApprove) * [MsigSwapCancel](#MsigSwapCancel) * [MsigSwapPropose](#MsigSwapPropose) -* [Net](#Net) - * [NetAddrsListen](#NetAddrsListen) * [Network](#Network) + * [NetAddrsListen](#NetAddrsListen) * [NetworkConnect](#NetworkConnect) * [NetworkFindPeer](#NetworkFindPeer) * [NetworkFindProvidersAsync](#NetworkFindProvidersAsync) @@ -103,7 +138,8 @@ * [NetworkGetPeerAddresses](#NetworkGetPeerAddresses) * [NetworkGetPeerID](#NetworkGetPeerID) * [NetworkPeers](#NetworkPeers) -* [Paych](#Paych) + * [Version](#Version) +* [Paychan](#Paychan) * [PaychAllocateLane](#PaychAllocateLane) * [PaychAvailableFunds](#PaychAvailableFunds) * [PaychAvailableFundsByFromTo](#PaychAvailableFundsByFromTo) @@ -120,66 +156,20 @@ * [PaychVoucherCreate](#PaychVoucherCreate) * [PaychVoucherList](#PaychVoucherList) * [PaychVoucherSubmit](#PaychVoucherSubmit) -* [Protocol](#Protocol) - * [ProtocolParameters](#ProtocolParameters) -* [Resolve](#Resolve) - * [ResolveToKeyAddr](#ResolveToKeyAddr) -* [Set](#Set) +* [Syncer](#Syncer) + * [ChainSyncHandleNewTipSet](#ChainSyncHandleNewTipSet) + * [ChainTipSetWeight](#ChainTipSetWeight) + * [Concurrent](#Concurrent) * [SetConcurrent](#SetConcurrent) - * [SetPassword](#SetPassword) -* [State](#State) - * [StateAccountKey](#StateAccountKey) * [StateCall](#StateCall) - * [StateCirculatingSupply](#StateCirculatingSupply) - * [StateDealProviderCollateralBounds](#StateDealProviderCollateralBounds) - * [StateGetActor](#StateGetActor) - * [StateGetRandomnessFromBeacon](#StateGetRandomnessFromBeacon) - * [StateGetRandomnessFromTickets](#StateGetRandomnessFromTickets) - * [StateListActors](#StateListActors) - * [StateListMiners](#StateListMiners) - * [StateLookupID](#StateLookupID) - * [StateMarketBalance](#StateMarketBalance) - * [StateMarketDeals](#StateMarketDeals) - * [StateMarketParticipants](#StateMarketParticipants) - * [StateMarketStorageDeal](#StateMarketStorageDeal) - * [StateMinerActiveSectors](#StateMinerActiveSectors) - * [StateMinerAvailableBalance](#StateMinerAvailableBalance) - * [StateMinerDeadlines](#StateMinerDeadlines) - * [StateMinerFaults](#StateMinerFaults) - * [StateMinerInfo](#StateMinerInfo) - * [StateMinerInitialPledgeCollateral](#StateMinerInitialPledgeCollateral) - * [StateMinerPartitions](#StateMinerPartitions) - * [StateMinerPower](#StateMinerPower) - * [StateMinerPreCommitDepositForPower](#StateMinerPreCommitDepositForPower) - * [StateMinerProvingDeadline](#StateMinerProvingDeadline) - * [StateMinerRecoveries](#StateMinerRecoveries) - * [StateMinerSectorAllocated](#StateMinerSectorAllocated) - * [StateMinerSectorCount](#StateMinerSectorCount) - * [StateMinerSectorSize](#StateMinerSectorSize) - * [StateMinerSectors](#StateMinerSectors) - * [StateMinerWorkerAddress](#StateMinerWorkerAddress) - * [StateNetworkName](#StateNetworkName) - * [StateNetworkVersion](#StateNetworkVersion) - * [StateSearchMsg](#StateSearchMsg) - * [StateSectorExpiration](#StateSectorExpiration) - * [StateSectorGetInfo](#StateSectorGetInfo) - * [StateSectorPartition](#StateSectorPartition) - * [StateSectorPreCommitInfo](#StateSectorPreCommitInfo) - * [StateVMCirculatingSupplyInternal](#StateVMCirculatingSupplyInternal) - * [StateVerifiedClientStatus](#StateVerifiedClientStatus) - * [StateVerifiedRegistryRootKey](#StateVerifiedRegistryRootKey) - * [StateVerifierStatus](#StateVerifierStatus) - * [StateWaitMsg](#StateWaitMsg) -* [Sync](#Sync) * [SyncState](#SyncState) * [SyncSubmitBlock](#SyncSubmitBlock) -* [Syncer](#Syncer) * [SyncerTracker](#SyncerTracker) -* [Un](#Un) - * [UnLockWallet](#UnLockWallet) -* [Verify](#Verify) - * [VerifyEntry](#VerifyEntry) * [Wallet](#Wallet) + * [HasPassword](#HasPassword) + * [LockWallet](#LockWallet) + * [SetPassword](#SetPassword) + * [UnLockWallet](#UnLockWallet) * [WalletAddresses](#WalletAddresses) * [WalletBalance](#WalletBalance) * [WalletDefaultAddress](#WalletDefaultAddress) @@ -191,19 +181,10 @@ * [WalletSign](#WalletSign) * [WalletSignMessage](#WalletSignMessage) * [WalletState](#WalletState) -## - - -### Concurrent - - -Perms: read - -Inputs: `null` -Response: `9` +## Account -### Verify +### StateAccountKey Perms: read @@ -211,55 +192,67 @@ Perms: read Inputs: ```json [ - "string value", - "string value" -] -``` - -Response: -```json -[ - "string value" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -### Version +Response: `"f01234"` +## Actor -Perms: read +### ListActor -Inputs: `null` -Response: -```json -{ - "Version": "string value", - "APIVersion": 131584 -} -``` +Perms: read -## Auth +Inputs: `[]` +Response: `{}` -### AuthNew +### StateGetActor -Perms: admin +Perms: read Inputs: ```json [ + "f01234", [ - "string value" + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } ] ] ``` -Response: `"Ynl0ZSBhcnJheQ=="` +Response: +```json +{ + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Head": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Nonce": 42, + "Balance": "0" +} +``` ## Beacon - ### BeaconGetEntry @@ -280,25 +273,28 @@ Response: } ``` -## Block - - -### BlockTime - +## BlockStore -Perms: read +### ChainDeleteObj -Inputs: `null` -Response: `60000000000` +Perms: admin -## Chain +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` +Response: `{}` -### ChainDeleteObj +### ChainHasObj -Perms: admin +Perms: read Inputs: ```json @@ -309,9 +305,9 @@ Inputs: ] ``` -Response: `{}` +Response: `true` -### ChainExport +### ChainReadObj Perms: read @@ -319,22 +315,15 @@ Perms: read Inputs: ```json [ - 10101, - true, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } ] ``` Response: `"Ynl0ZSBhcnJheQ=="` -### ChainGetBlock +### ChainStatObj Perms: read @@ -342,6 +331,9 @@ Perms: read Inputs: ```json [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } @@ -351,18 +343,74 @@ Inputs: Response: ```json { - "Miner": "t01234", - "Ticket": { - "VRFProof": "Bw==" - }, - "ElectionProof": { - "WinCount": 9, - "VRFProof": "Bw==" - }, - "BeaconEntries": [ - { - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" + "Size": 42, + "Links": 42 +} +``` + +## ChainInfo + +### BlockTime + + +Perms: read + +Inputs: `[]` + +Response: `60000000000` + +### ChainExport + + +Perms: read + +Inputs: +```json +[ + 10101, + true, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"Ynl0ZSBhcnJheQ=="` + +### ChainGetBlock + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Miner": "f01234", + "Ticket": { + "VRFProof": "Bw==" + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Bw==" + }, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" } ], "WinPoStProof": [ @@ -424,8 +472,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -442,8 +490,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -490,8 +538,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -533,8 +581,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -573,8 +621,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -812,28 +860,12 @@ Response: } ``` -### ChainHasObj - - -Perms: read - -Inputs: -```json -[ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } -] -``` - -Response: `true` - ### ChainHead Perms: read -Inputs: `null` +Inputs: `[]` Response: ```json @@ -883,7 +915,7 @@ Response: Perms: read -Inputs: `null` +Inputs: `[]` Response: ```json @@ -899,22 +931,6 @@ Response: ] ``` -### ChainReadObj - - -Perms: read - -Inputs: -```json -[ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } -] -``` - -Response: `"Ynl0ZSBhcnJheQ=="` - ### ChainSetHead @@ -936,7 +952,7 @@ Inputs: Response: `{}` -### ChainStatObj +### GetActor Perms: read @@ -944,46 +960,46 @@ Perms: read Inputs: ```json [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "f01234" ] ``` Response: ```json { - "Size": 42, - "Links": 42 + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Head": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Nonce": 42, + "Balance": "0" } ``` -### ChainSyncHandleNewTipSet +### GetEntry -Perms: write +Perms: read Inputs: ```json [ - { - "Source": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Sender": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Head": { - "Cids": null, - "Blocks": null, - "Height": 0 - } - } + 10101, + 42 ] ``` -Response: `{}` +Response: +```json +{ + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" +} +``` -### ChainTipSetWeight +### GetFullBlock Perms: read @@ -991,39 +1007,90 @@ Perms: read Inputs: ```json [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } ] ``` -Response: `"0"` - -## Gas - - -### GasBatchEstimateMessageGas - - -Perms: read - -Inputs: +Response: ```json -[ - [ +{ + "Header": { + "Miner": "f01234", + "Ticket": { + "VRFProof": "Bw==" + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Bw==" + }, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" + }, + "BLSMessages": [ { - "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + } + ], + "SECPMessages": [ + { + "Message": { "CID": { "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -1032,49 +1099,50 @@ Inputs: "Method": 1, "Params": "Ynl0ZSBhcnJheQ==" }, - "Spec": { - "MaxFee": "0", - "GasOverEstimation": 12.3 + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" } } - ], - 42, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } ] -] +} ``` -Response: -```json -[ - { - "Msg": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "Err": "string value" - } +### GetParentStateRootActor + + +Perms: read + +Inputs: +```json +[ + { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "f01234" ] ``` -### GasEstimateFeeCap +Response: +```json +{ + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Head": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Nonce": 42, + "Balance": "0" +} +``` + +### MessageWait Perms: read @@ -1083,12 +1151,28 @@ Inputs: ```json [ { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 10101, + 10101 +] +``` + +Response: +```json +{ + "TS": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Message": { "CID": { "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -1097,21 +1181,104 @@ Inputs: "Method": 1, "Params": "Ynl0ZSBhcnJheQ==" }, - 9, - [ - { + "Block": { + "Miner": "f01234", + "Ticket": { + "VRFProof": "Bw==" + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Bw==" + }, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + } +} +``` + +### ProtocolParameters + + +Perms: read + +Inputs: `[]` + +Response: +```json +{ + "Network": "string value", + "BlockTime": 60000000000, + "SupportedSectors": [ { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + "Size": 34359738368, + "MaxPieceSize": 1024 } ] +} +``` + +### ResolveToKeyAddr + + +Perms: read + +Inputs: +```json +[ + "f01234", + { + "Cids": null, + "Blocks": null, + "Height": 0 + } ] ``` -Response: `"0"` +Response: `"f01234"` -### GasEstimateGasLimit +### StateGetRandomnessFromBeacon Perms: read @@ -1119,21 +1286,9 @@ Perms: read Inputs: ```json [ - { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, + 2, + 10101, + "Ynl0ZSBhcnJheQ==", [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -1145,9 +1300,9 @@ Inputs: ] ``` -Response: `9` +Response: `"Bw=="` -### GasEstimateGasPremium +### StateGetRandomnessFromTickets Perms: read @@ -1155,9 +1310,9 @@ Perms: read Inputs: ```json [ - 42, - "t01234", - 9, + 2, + 10101, + "Ynl0ZSBhcnJheQ==", [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -1169,9 +1324,18 @@ Inputs: ] ``` -Response: `"0"` +Response: `"Bw=="` -### GasEstimateMessageGas +### StateNetworkName + + +Perms: read + +Inputs: `[]` + +Response: `"mainnet"` + +### StateNetworkVersion Perms: read @@ -1179,25 +1343,6 @@ Perms: read Inputs: ```json [ - { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - { - "MaxFee": "0", - "GasOverEstimation": 12.3 - }, [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -1209,29 +1354,25 @@ Inputs: ] ``` -Response: -```json -{ - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" -} -``` +Response: `15` -## Get +### StateSearchMsg +StateSearchMsg looks back up to limit epochs in the chain for a message, and returns its receipt and the tipset where it was executed +NOTE: If a replacing message is found on chain, this method will return +a MsgLookup for the replacing message - the MsgLookup.Message will be a different +CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the +result of the execution of the replacing message. -### GetActor +If the caller wants to ensure that exactly the requested message was executed, +they must check that MsgLookup.Message is equal to the provided 'cid', or set the +`allowReplaced` parameter to false. Without this check, and with `allowReplaced` +set to true, both the requested and original message may appear as +successfully executed on-chain, which may look like a double-spend. + +A replacing message is a message with a different CID, any of Gas values, and +different signature, but with all other parameters matching (source/destination, +nonce, params, etc.) Perms: read @@ -1239,25 +1380,47 @@ Perms: read Inputs: ```json [ - "t01234" + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 10101, + true ] ``` Response: ```json { - "Code": { + "Message": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Head": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 }, - "Nonce": 42, - "Balance": "0" + "ReturnDec": {}, + "TipSet": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 } ``` -### GetEntry +### StateVerifiedRegistryRootKey Perms: read @@ -1265,20 +1428,20 @@ Perms: read Inputs: ```json [ - 10101, - 42 + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -Response: -```json -{ - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" -} -``` +Response: `"f01234"` -### GetFullBlock +### StateVerifierStatus Perms: read @@ -1286,111 +1449,39 @@ Perms: read Inputs: ```json [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } -] -``` - -Response: -```json -{ - "Header": { - "Miner": "t01234", - "Ticket": { - "VRFProof": "Bw==" - }, - "ElectionProof": { - "WinCount": 9, - "VRFProof": "Bw==" - }, - "BeaconEntries": [ - { - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" - } - ], - "WinPoStProof": [ - { - "PoStProof": 8, - "ProofBytes": "Ynl0ZSBhcnJheQ==" - } - ], - "Parents": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ], - "ParentWeight": "0", - "Height": 10101, - "ParentStateRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "ParentMessageReceipts": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Messages": { + "f01234", + [ + { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "BLSAggregate": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "Timestamp": 42, - "BlockSig": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "ForkSignaling": 42, - "ParentBaseFee": "0" - }, - "BLSMessages": [ - { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - } - ], - "SECPMessages": [ { - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - } + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } ] -} +] ``` -### GetParentStateRootActor +Response: `"0"` + +### StateWaitMsg +StateWaitMsg looks back up to limit epochs in the chain for a message. +If not found, it blocks until the message arrives on chain, and gets to the +indicated confidence depth. + +NOTE: If a replacing message is found on chain, this method will return +a MsgLookup for the replacing message - the MsgLookup.Message will be a different +CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the +result of the execution of the replacing message. + +If the caller wants to ensure that exactly the requested message was executed, +they must check that MsgLookup.Message is equal to the provided 'cid', or set the +`allowReplaced` parameter to false. Without this check, and with `allowReplaced` +set to true, both the requested and original message may appear as +successfully executed on-chain, which may look like a double-spend. + +A replacing message is a message with a different CID, any of Gas values, and +different signature, but with all other parameters matching (source/destination, +nonce, params, etc.) Perms: read @@ -1399,82 +1490,101 @@ Inputs: ```json [ { - "Cids": null, - "Blocks": null, - "Height": 0 + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "t01234" + 42, + 10101, + true ] ``` Response: ```json { - "Code": { + "Message": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Head": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 }, - "Nonce": 42, - "Balance": "0" + "ReturnDec": {}, + "TipSet": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 } ``` -## Has - - -### HasPassword +### VerifyEntry -Perms: admin +Perms: read -Inputs: `null` +Inputs: +```json +[ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + }, + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + }, + 10101 +] +``` Response: `true` -## List - - -### ListActor +## JwtAuth +### AuthNew -Perms: read -Inputs: `null` +Perms: admin -Response: +Inputs: ```json -{ - "t01234": { - "Code": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Head": { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - }, - "Nonce": 10, - "Balance": "100" - } -} +[ + [ + "string value" + ] +] ``` -## Lock - - -### LockWallet +Response: `"Ynl0ZSBhcnJheQ=="` +### Verify -Perms: admin -Inputs: `null` +Perms: read -Response: `{}` +Inputs: +```json +[ + "string value", + "string value" +] +``` -## Message +Response: +```json +[ + "string value" +] +``` +## Market -### MessageWait +### StateMarketParticipants Perms: read @@ -1482,232 +1592,134 @@ Perms: read Inputs: ```json [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - 10101, - 10101 + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json { - "TS": { - "Cids": null, - "Blocks": null, - "Height": 0 - }, - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "Block": { - "Miner": "t01234", - "Ticket": { - "VRFProof": "Bw==" - }, - "ElectionProof": { - "WinCount": 9, - "VRFProof": "Bw==" - }, - "BeaconEntries": [ - { - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" - } - ], - "WinPoStProof": [ - { - "PoStProof": 8, - "ProofBytes": "Ynl0ZSBhcnJheQ==" - } - ], - "Parents": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ], - "ParentWeight": "0", - "Height": 10101, - "ParentStateRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "ParentMessageReceipts": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Messages": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "BLSAggregate": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "Timestamp": 42, - "BlockSig": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "ForkSignaling": 42, - "ParentBaseFee": "0" - }, - "Receipt": { - "ExitCode": 0, - "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9 + "t026363": { + "Escrow": "0", + "Locked": "0" } } ``` -## Miner - +## MessagePool -### MinerCreateBlock +### GasBatchEstimateMessageGas -Perms: write +Perms: read Inputs: ```json [ - { - "Miner": "t01234", - "Parents": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ], - "Ticket": { - "VRFProof": "Bw==" - }, - "Eproof": { - "WinCount": 9, - "VRFProof": "Bw==" - }, - "BeaconValues": [ - { - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" - } - ], - "Messages": [ - { - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - }, + [ + { + "Msg": { "CID": { "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - } - } - ], - "Epoch": 10101, - "Timestamp": 42, - "WinningPoStProof": [ - { - "PoStProof": 8, - "ProofBytes": "Ynl0ZSBhcnJheQ==" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Spec": { + "MaxFee": "0", + "GasOverEstimation": 12.3 } - ] - } + } + ], + 42, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json -{ - "Header": { - "Miner": "t01234", - "Ticket": { - "VRFProof": "Bw==" - }, - "ElectionProof": { - "WinCount": 9, - "VRFProof": "Bw==" - }, - "BeaconEntries": [ - { - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" - } - ], - "WinPoStProof": [ - { - "PoStProof": 8, - "ProofBytes": "Ynl0ZSBhcnJheQ==" - } - ], - "Parents": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ], - "ParentWeight": "0", - "Height": 10101, - "ParentStateRoot": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "ParentMessageReceipts": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Messages": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "BLSAggregate": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" +[ + { + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" }, - "Timestamp": 42, - "BlockSig": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" + "Err": "string value" + } +] +``` + +### GasEstimateFeeCap + + +Perms: read + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, - "ForkSignaling": 42, - "ParentBaseFee": "0" + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" }, - "BlsMessages": [ + 9, + [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } - ], - "SecpkMessages": [ + }, { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } ] -} +] ``` -### MinerGetBaseInfo +Response: `"0"` + +### GasEstimateGasLimit Perms: read @@ -1715,8 +1727,21 @@ Perms: read Inputs: ```json [ - "t01234", - 10101, + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -1728,39 +1753,88 @@ Inputs: ] ``` -Response: +Response: `9` + +### GasEstimateGasPremium + + +Perms: read + +Inputs: ```json -{ - "MinerPower": "0", - "NetworkPower": "0", - "Sectors": [ - { - "SealProof": 8, - "SectorNumber": 9, - "SectorKey": null, - "SealedCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } +[ + 42, + "f01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } - ], - "WorkerKey": "t01234", - "SectorSize": 34359738368, - "PrevBeaconEntry": { - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" + ] +] +``` + +Response: `"0"` + +### GasEstimateMessageGas + + +Perms: read + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": [ + { + "MaxFee": "0", + "GasOverEstimation": 12.3 + }, + [ { - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } - ], - "EligibleForMining": true -} + ] +] ``` -## Mpool - +Response: +```json +{ + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" +} +``` ### MpoolBatchPush @@ -1777,8 +1851,8 @@ Inputs: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -1822,8 +1896,8 @@ Inputs: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -1849,8 +1923,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -1885,8 +1959,8 @@ Inputs: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -1917,6 +1991,7 @@ Response: ``` ### MpoolCheckMessages +MpoolCheckMessages performs logical checks on a batch of messages Perms: read @@ -1931,8 +2006,8 @@ Inputs: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -1967,6 +2042,7 @@ Response: ``` ### MpoolCheckPendingMessages +MpoolCheckPendingMessages performs logical checks for all pending messages from a given address Perms: read @@ -1974,7 +2050,7 @@ Perms: read Inputs: ```json [ - "t01234" + "f01234" ] ``` @@ -1998,6 +2074,7 @@ Response: ``` ### MpoolCheckReplaceMessages +MpoolCheckReplaceMessages performs logical checks on pending messages with replacement Perms: read @@ -2011,8 +2088,8 @@ Inputs: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2066,7 +2143,7 @@ Perms: admin Inputs: ```json [ - "t01234" + "f01234" ] ``` @@ -2077,13 +2154,13 @@ Response: `{}` Perms: read -Inputs: `null` +Inputs: `[]` Response: ```json { "PriorityAddrs": [ - "t01234" + "f01234" ], "SizeLimitHigh": 123, "SizeLimitLow": 123, @@ -2101,7 +2178,7 @@ Perms: read Inputs: ```json [ - "t01234" + "f01234" ] ``` @@ -2135,8 +2212,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2164,7 +2241,7 @@ Perms: write Inputs: ```json [ - "t01234" + "f01234" ] ``` @@ -2184,8 +2261,8 @@ Inputs: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2221,8 +2298,8 @@ Inputs: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2262,8 +2339,8 @@ Inputs: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2287,8 +2364,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2321,8 +2398,8 @@ Inputs: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2378,8 +2455,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2431,8 +2508,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2463,7 +2540,7 @@ Inputs: [ { "PriorityAddrs": [ - "t01234" + "f01234" ], "SizeLimitHigh": 123, "SizeLimitLow": 123, @@ -2481,7 +2558,7 @@ Response: `{}` Perms: read -Inputs: `null` +Inputs: `[]` Response: ```json @@ -2493,8 +2570,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -2514,318 +2591,254 @@ Response: } ``` -## Msig +## MinerState - -### MsigAddApprove +### StateCirculatingSupply -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "t01234", - 42, - "t01234", - "t01234", - true + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -Response: -```json -{ - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "ValidNonce": true -} -``` +Response: `"0"` -### MsigAddCancel +### StateDealProviderCollateralBounds -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "t01234", - 42, - "t01234", - true + 1032, + true, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json { - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "ValidNonce": true + "Min": "0", + "Max": "0" } ``` -### MsigAddPropose +### StateListActors -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "t01234", - "t01234", - true + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json -{ - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "ValidNonce": true -} +[ + "f01234" +] ``` -### MsigApprove +### StateListMiners -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - 42, - "t01234" + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json -{ - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "ValidNonce": true -} +[ + "f01234" +] ``` -### MsigApproveTxnHash +### StateLookupID -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - 42, - "t01234", - "t01234", - "0", - "t01234", - 42, - "Ynl0ZSBhcnJheQ==" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -Response: -```json -{ - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "ValidNonce": true -} -``` +Response: `"f01234"` -### MsigCancel +### StateMarketBalance -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - 42, - "t01234" -] -``` - -Response: -```json -{ - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "ValidNonce": true + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Escrow": "0", + "Locked": "0" } ``` -### MsigCancelTxnHash +### StateMarketDeals -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - 42, - "t01234", - "0", - "t01234", - 42, - "Ynl0ZSBhcnJheQ==" + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json { - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + "t026363": { + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "ValidNonce": true + "State": { + "SectorStartEpoch": 10101, + "LastUpdatedEpoch": 10101, + "SlashEpoch": 10101 + } + } } ``` -### MsigCreate +### StateMarketStorageDeal -Perms: sign +Perms: read Inputs: ```json [ - 42, + 5432, [ - "t01234" - ], - 10101, - "0", - "t01234", - "0" + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json { - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" }, - "ValidNonce": true + "State": { + "SectorStartEpoch": 10101, + "LastUpdatedEpoch": 10101, + "SlashEpoch": 10101 + } } ``` -### MsigGetVested +### StateMinerActiveSectors Perms: read @@ -2833,7 +2846,7 @@ Perms: read Inputs: ```json [ - "t01234", + "f01234", [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -2841,7 +2854,43 @@ Inputs: { "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } - ], + ] +] +``` + +Response: +```json +[ + { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null + } +] +``` + +### StateMinerAvailableBalance + + +Perms: read + +Inputs: +```json +[ + "f01234", [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -2855,220 +2904,147 @@ Inputs: Response: `"0"` -### MsigPropose +### StateMinerDeadlines -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "t01234", - "0", - "t01234", - 42, - "Ynl0ZSBhcnJheQ==" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json -{ - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "ValidNonce": true -} +[ + { + "PostSubmissions": [ + 5, + 1 + ], + "DisputableProofCount": 42 + } +] ``` -### MsigRemoveSigner +### StateMinerFaults -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "t01234", - "t01234", - true + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json -{ - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "ValidNonce": true -} +[ + 5, + 1 +] ``` -### MsigSwapApprove +### StateMinerInfo -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "t01234", - 42, - "t01234", - "t01234", - "t01234" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json { - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "ValidNonce": true + "Owner": "f01234", + "Worker": "f01234", + "NewWorker": "f01234", + "ControlAddresses": [ + "f01234" + ], + "WorkerChangeEpoch": 10101, + "PeerId": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Multiaddrs": [ + "Ynl0ZSBhcnJheQ==" + ], + "WindowPoStProofType": 8, + "SectorSize": 34359738368, + "WindowPoStPartitionSectors": 42, + "ConsensusFaultElapsed": 10101 } ``` -### MsigSwapCancel +### StateMinerInitialPledgeCollateral -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "t01234", - 42, - "t01234", - "t01234" -] -``` - -Response: -```json -{ - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + "f01234", + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" + "SealRandEpoch": 10101, + "DealIDs": [ + 5432 + ], + "Expiration": 10101, + "ReplaceCapacity": true, + "ReplaceSectorDeadline": 42, + "ReplaceSectorPartition": 42, + "ReplaceSectorNumber": 9 }, - "ValidNonce": true -} -``` - -### MsigSwapPropose - - -Perms: sign - -Inputs: -```json -[ - "t01234", - "t01234", - "t01234", - "t01234" -] -``` - -Response: -```json -{ - "Message": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "ValidNonce": true -} -``` - -## Net - - -### NetAddrsListen - - -Perms: read - -Inputs: `null` - -Response: -```json -{ - "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [ - "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } ] -} +] ``` -## Network - +Response: `"0"` -### NetworkConnect +### StateMinerPartitions Perms: read @@ -3076,21 +3052,48 @@ Perms: read Inputs: ```json [ + "f01234", + 42, [ - "string value" + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } ] ] ``` Response: ```json -{ - "PeerID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Err": {} -} +[ + { + "AllSectors": [ + 5, + 1 + ], + "FaultySectors": [ + 5, + 1 + ], + "RecoveringSectors": [ + 5, + 1 + ], + "LiveSectors": [ + 5, + 1 + ], + "ActiveSectors": [ + 5, + 1 + ] + } +] ``` -### NetworkFindPeer +### StateMinerPower Perms: read @@ -3098,21 +3101,34 @@ Perms: read Inputs: ```json [ - "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json { - "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [ - "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" - ] + "MinerPower": { + "RawBytePower": "0", + "QualityAdjPower": "0" + }, + "TotalPower": { + "RawBytePower": "0", + "QualityAdjPower": "0" + }, + "HasMinPower": true } ``` -### NetworkFindProvidersAsync +### StateMinerPreCommitDepositForPower Perms: read @@ -3120,41 +3136,75 @@ Perms: read Inputs: ```json [ + "f01234", { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SealRandEpoch": 10101, + "DealIDs": [ + 5432 + ], + "Expiration": 10101, + "ReplaceCapacity": true, + "ReplaceSectorDeadline": 42, + "ReplaceSectorPartition": 42, + "ReplaceSectorNumber": 9 }, - 123 + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -Response: -```json -{ - "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [ - "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" - ] -} -``` +Response: `"0"` -### NetworkGetBandwidthStats +### StateMinerProvingDeadline -Perms: admin +Perms: read -Inputs: `null` +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` Response: ```json { - "TotalIn": 9, - "TotalOut": 9, - "RateIn": 12.3, - "RateOut": 12.3 + "CurrentEpoch": 10101, + "PeriodStart": 10101, + "Index": 42, + "Open": 10101, + "Close": 10101, + "Challenge": 10101, + "FaultCutoff": 10101, + "WPoStPeriodDeadlines": 42, + "WPoStProvingPeriod": 10101, + "WPoStChallengeWindow": 10101, + "WPoStChallengeLookback": 10101, + "FaultDeclarationCutoff": 10101 } ``` -### NetworkGetClosestPeers +### StateMinerRecoveries Perms: read @@ -3162,41 +3212,50 @@ Perms: read Inputs: ```json [ - "string value" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json [ - "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + 5, + 1 ] ``` -### NetworkGetPeerAddresses +### StateMinerSectorAllocated -Perms: admin - -Inputs: `null` +Perms: read -Response: +Inputs: ```json [ - "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + "f01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -### NetworkGetPeerID - - -Perms: admin - -Inputs: `null` - -Response: `"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"` +Response: `true` -### NetworkPeers +### StateMinerSectorCount Perms: read @@ -3204,195 +3263,235 @@ Perms: read Inputs: ```json [ - true, - true, - true + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json { - "Peers": [ - { - "Addr": "string value", - "Peer": "string value", - "Latency": "string value", - "Muxer": "string value", - "Streams": [ - { - "Protocol": "string value" - } - ] - } - ] + "Live": 42, + "Active": 42, + "Faulty": 42 } ``` -## Paych - - -### PaychAllocateLane +### StateMinerSectorSize -Perms: sign +Perms: read Inputs: ```json [ - "t01234" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -Response: `42` +Response: `34359738368` -### PaychAvailableFunds +### StateMinerSectors -Perms: sign +Perms: read Inputs: ```json [ - "t01234" + "f01234", + [ + 0 + ], + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json -{ - "Channel": "\u003cempty\u003e", - "From": "t01234", - "To": "t01234", - "ConfirmedAmt": "0", - "PendingAmt": "0", - "PendingWaitSentinel": null, - "QueuedAmt": "0", - "VoucherReedeemedAmt": "0" -} +[ + { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null + } +] ``` -### PaychAvailableFundsByFromTo +### StateMinerWorkerAddress -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "t01234" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -Response: -```json -{ - "Channel": "\u003cempty\u003e", - "From": "t01234", - "To": "t01234", - "ConfirmedAmt": "0", - "PendingAmt": "0", - "PendingWaitSentinel": null, - "QueuedAmt": "0", - "VoucherReedeemedAmt": "0" -} -``` +Response: `"f01234"` -### PaychCollect +### StateSectorExpiration -Perms: sign +Perms: read Inputs: ```json [ - "t01234" + "f01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "OnTime": 10101, + "Early": 10101 } ``` -### PaychGet +### StateSectorGetInfo -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "t01234", - "0" + "f01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json { - "Channel": "t01234", - "WaitSentinel": { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null } ``` -### PaychGetWaitReady +### StateSectorPartition -Perms: sign +Perms: read Inputs: ```json [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - } + "f01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -Response: `"t01234"` - -### PaychList - - -Perms: read - -Inputs: `null` - Response: ```json -[ - "t01234" -] +{ + "Deadline": 42, + "Partition": 42 +} ``` -### PaychNewPayment +### StateSectorPreCommitInfo -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "t01234", + "f01234", + 9, [ { - "Amount": "0", - "TimeLockMin": 10101, - "TimeLockMax": 10101, - "MinSettle": 10101, - "Extra": { - "Actor": "t01234", - "Method": 1, - "Data": "Ynl0ZSBhcnJheQ==" - } + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } ] ] @@ -3401,60 +3500,61 @@ Inputs: Response: ```json { - "Channel": "t01234", - "WaitSentinel": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "Info": { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SealRandEpoch": 10101, + "DealIDs": [ + 5432 + ], + "Expiration": 10101, + "ReplaceCapacity": true, + "ReplaceSectorDeadline": 42, + "ReplaceSectorPartition": 42, + "ReplaceSectorNumber": 9 }, - "Vouchers": [ - { - "ChannelAddr": "t01234", - "TimeLockMin": 10101, - "TimeLockMax": 10101, - "SecretPreimage": "Ynl0ZSBhcnJheQ==", - "Extra": { - "Actor": "t01234", - "Method": 1, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "Lane": 42, - "Nonce": 42, - "Amount": "0", - "MinSettleHeight": 10101, - "Merges": [ - { - "Lane": 42, - "Nonce": 42 - } - ], - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - } - } - ] + "PreCommitDeposit": "0", + "PreCommitEpoch": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0" } ``` -### PaychSettle +### StateVMCirculatingSupplyInternal -Perms: sign +Perms: read Inputs: ```json [ - "t01234" + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "FilVested": "0", + "FilMined": "0", + "FilBurnt": "0", + "FilLocked": "0", + "FilCirculating": "0", + "FilReserveDisbursed": "0" } ``` -### PaychStatus +### StateVerifiedClientStatus Perms: read @@ -3462,19 +3562,23 @@ Perms: read Inputs: ```json [ - "t01234" + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` -Response: -```json -{ - "ControlAddr": "t01234", - "Direction": 1 -} -``` +Response: `"0"` -### PaychVoucherAdd +## Mining + +### MinerCreateBlock Perms: write @@ -3482,709 +3586,498 @@ Perms: write Inputs: ```json [ - "t01234", { - "ChannelAddr": "t01234", - "TimeLockMin": 10101, - "TimeLockMax": 10101, - "SecretPreimage": "Ynl0ZSBhcnJheQ==", - "Extra": { - "Actor": "t01234", - "Method": 1, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "Lane": 42, - "Nonce": 42, - "Amount": "0", - "MinSettleHeight": 10101, - "Merges": [ + "Miner": "f01234", + "Parents": [ { - "Lane": 42, - "Nonce": 42 + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } ], - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - } - }, - "Ynl0ZSBhcnJheQ==", - "0" -] -``` - -Response: `"0"` - -### PaychVoucherCheckSpendable - - -Perms: read - -Inputs: -```json -[ - "t01234", - { - "ChannelAddr": "t01234", - "TimeLockMin": 10101, - "TimeLockMax": 10101, - "SecretPreimage": "Ynl0ZSBhcnJheQ==", - "Extra": { - "Actor": "t01234", - "Method": 1, - "Data": "Ynl0ZSBhcnJheQ==" + "Ticket": { + "VRFProof": "Bw==" }, - "Lane": 42, - "Nonce": 42, - "Amount": "0", - "MinSettleHeight": 10101, - "Merges": [ + "Eproof": { + "WinCount": 9, + "VRFProof": "Bw==" + }, + "BeaconValues": [ { - "Lane": 42, - "Nonce": 42 + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" } ], - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - } - }, - "Ynl0ZSBhcnJheQ==", - "Ynl0ZSBhcnJheQ==" + "Messages": [ + { + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], + "Epoch": 10101, + "Timestamp": 42, + "WinningPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ] + } ] ``` -Response: `true` - -### PaychVoucherCheckValid - - -Perms: read - -Inputs: +Response: ```json -[ - "t01234", - { - "ChannelAddr": "t01234", - "TimeLockMin": 10101, - "TimeLockMax": 10101, - "SecretPreimage": "Ynl0ZSBhcnJheQ==", - "Extra": { - "Actor": "t01234", - "Method": 1, - "Data": "Ynl0ZSBhcnJheQ==" +{ + "Header": { + "Miner": "f01234", + "Ticket": { + "VRFProof": "Bw==" }, - "Lane": 42, - "Nonce": 42, - "Amount": "0", - "MinSettleHeight": 10101, - "Merges": [ + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Bw==" + }, + "BeaconEntries": [ { - "Lane": 42, - "Nonce": 42 + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" } ], - "Signature": { + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" + }, + "BlsMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } - } -] + ], + "SecpkMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] +} ``` -Response: `{}` - -### PaychVoucherCreate +### MinerGetBaseInfo -Perms: sign +Perms: read Inputs: ```json [ - "t01234", - "0", - 42 + "f01234", + 10101, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json -{ - "Voucher": { - "ChannelAddr": "t01234", - "TimeLockMin": 10101, - "TimeLockMax": 10101, - "SecretPreimage": "Ynl0ZSBhcnJheQ==", - "Extra": { - "Actor": "t01234", - "Method": 1, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "Lane": 42, - "Nonce": 42, - "Amount": "0", - "MinSettleHeight": 10101, - "Merges": [ - { - "Lane": 42, - "Nonce": 42 - } - ], - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - } - }, - "Shortfall": "0" -} -``` - -### PaychVoucherList - - -Perms: write - -Inputs: -```json -[ - "t01234" -] -``` - -Response: -```json -[ - { - "ChannelAddr": "t01234", - "TimeLockMin": 10101, - "TimeLockMax": 10101, - "SecretPreimage": "Ynl0ZSBhcnJheQ==", - "Extra": { - "Actor": "t01234", - "Method": 1, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "Lane": 42, - "Nonce": 42, - "Amount": "0", - "MinSettleHeight": 10101, - "Merges": [ - { - "Lane": 42, - "Nonce": 42 - } - ], - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - } - } -] -``` - -### PaychVoucherSubmit - - -Perms: sign - -Inputs: -```json -[ - "t01234", - { - "ChannelAddr": "t01234", - "TimeLockMin": 10101, - "TimeLockMax": 10101, - "SecretPreimage": "Ynl0ZSBhcnJheQ==", - "Extra": { - "Actor": "t01234", - "Method": 1, - "Data": "Ynl0ZSBhcnJheQ==" - }, - "Lane": 42, - "Nonce": 42, - "Amount": "0", - "MinSettleHeight": 10101, - "Merges": [ - { - "Lane": 42, - "Nonce": 42 - } - ], - "Signature": { - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" - } - }, - "Ynl0ZSBhcnJheQ==", - "Ynl0ZSBhcnJheQ==" -] -``` - -Response: -```json -{ - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" -} -``` - -## Protocol - - -### ProtocolParameters - - -Perms: read - -Inputs: `null` - -Response: -```json -{ - "Network": "string value", - "BlockTime": 60000000000, - "SupportedSectors": [ - { - "Size": 34359738368, - "MaxPieceSize": 1024 - } - ] -} -``` - -## Resolve - - -### ResolveToKeyAddr - - -Perms: read - -Inputs: -```json -[ - "t01234", - { - "Cids": null, - "Blocks": null, - "Height": 0 - } -] -``` - -Response: `"t01234"` - -## Set - - -### SetConcurrent - - -Perms: admin - -Inputs: -```json -[ - 9 -] -``` - -Response: `{}` - -### SetPassword - - -Perms: admin - -Inputs: -```json -[ - "Ynl0ZSBhcnJheQ==" -] -``` - -Response: `{}` - -## State - - -### StateAccountKey - - -Perms: read - -Inputs: -```json -[ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] -] -``` - -Response: `"t01234"` - -### StateCall - - -Perms: read - -Inputs: -```json -[ - { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] -] -``` - -Response: -```json -{ - "MsgCid": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Msg": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "MsgRct": { - "ExitCode": 0, - "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9 - }, - "GasCost": { - "Message": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "GasUsed": "0", - "BaseFeeBurn": "0", - "OverEstimationBurn": "0", - "MinerPenalty": "0", - "MinerTip": "0", - "Refund": "0", - "TotalCost": "0" - }, - "ExecutionTrace": { - "Msg": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "MsgRct": { - "ExitCode": 0, - "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9 - }, - "Error": "string value", - "Duration": 60000000000, - "GasCharges": [ - { - "Name": "string value", - "loc": [ - { - "File": "string value", - "Line": 123, - "Function": "string value" - } - ], - "tg": 9, - "cg": 9, - "sg": 9, - "vtg": 9, - "vcg": 9, - "vsg": 9, - "tt": 60000000000, - "ex": {} - } - ], - "Subcalls": [ - { - "Msg": { - "CID": { - "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" - }, - "Version": 42, - "To": "t01234", - "From": "t01234", - "Nonce": 42, - "Value": "0", - "GasLimit": 9, - "GasFeeCap": "0", - "GasPremium": "0", - "Method": 1, - "Params": "Ynl0ZSBhcnJheQ==" - }, - "MsgRct": { - "ExitCode": 0, - "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9 - }, - "Error": "string value", - "Duration": 60000000000, - "GasCharges": [ - { - "Name": "string value", - "loc": [ - { - "File": "string value", - "Line": 123, - "Function": "string value" - } - ], - "tg": 9, - "cg": 9, - "sg": 9, - "vtg": 9, - "vcg": 9, - "vsg": 9, - "tt": 60000000000, - "ex": {} - } - ], - "Subcalls": null +{ + "MinerPower": "0", + "NetworkPower": "0", + "Sectors": [ + { + "SealProof": 8, + "SectorNumber": 9, + "SectorKey": null, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } - ] + } + ], + "WorkerKey": "f01234", + "SectorSize": 34359738368, + "PrevBeaconEntry": { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" }, - "Error": "string value", - "Duration": 60000000000 + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "EligibleForMining": true } ``` -### StateCirculatingSupply +## MultiSig + +### MsigAddApprove -Perms: read +Perms: sign Inputs: ```json [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + 42, + "f01234", + "f01234", + true ] ``` -Response: `"0"` +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` -### StateDealProviderCollateralBounds +### MsigAddCancel -Perms: read +Perms: sign Inputs: ```json [ - 1032, - true, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + 42, + "f01234", + true ] ``` Response: ```json { - "Min": "0", - "Max": "0" + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true } ``` -### StateGetActor +### MsigAddPropose -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + "f01234", + true ] ``` Response: ```json { - "Code": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "Head": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" }, - "Nonce": 42, - "Balance": "0" + "ValidNonce": true } ``` -### StateGetRandomnessFromBeacon +### MsigApprove -Perms: read +Perms: sign Inputs: ```json [ - 2, - 10101, - "Ynl0ZSBhcnJheQ==", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + 42, + "f01234" ] ``` -Response: `"Bw=="` +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` -### StateGetRandomnessFromTickets +### MsigApproveTxnHash -Perms: read +Perms: sign Inputs: ```json [ - 2, - 10101, - "Ynl0ZSBhcnJheQ==", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + 42, + "f01234", + "f01234", + "0", + "f01234", + 42, + "Ynl0ZSBhcnJheQ==" ] ``` -Response: `"Bw=="` +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` -### StateListActors +### MsigCancel -Perms: read +Perms: sign Inputs: ```json [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + 42, + "f01234" ] ``` Response: ```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` + +### MsigCancelTxnHash +MsigCancel cancels a previously-proposed multisig message +It takes the following params: , , , , +, , + + +Perms: sign + +Inputs: +```json [ - "t01234" + "f01234", + 42, + "f01234", + "0", + "f01234", + 42, + "Ynl0ZSBhcnJheQ==" ] ``` -### StateListMiners +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` + +### MsigCreate -Perms: read +Perms: sign Inputs: ```json [ + 42, [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234" + ], + 10101, + "0", + "f01234", + "0" ] ``` Response: ```json -[ - "t01234" -] +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} ``` -### StateLookupID +### MsigGetVested Perms: read @@ -4192,7 +4085,7 @@ Perms: read Inputs: ```json [ - "t01234", + "f01234", [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -4200,21 +4093,7 @@ Inputs: { "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" } - ] -] -``` - -Response: `"t01234"` - -### StateMarketBalance - - -Perms: read - -Inputs: -```json -[ - "t01234", + ], [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -4226,236 +4105,218 @@ Inputs: ] ``` -Response: -```json -{ - "Escrow": "0", - "Locked": "0" -} -``` +Response: `"0"` -### StateMarketDeals +### MsigPropose -Perms: read +Perms: sign Inputs: ```json [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + "0", + "f01234", + 42, + "Ynl0ZSBhcnJheQ==" ] ``` Response: ```json { - "t026363": { - "Proposal": { - "PieceCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "PieceSize": 1032, - "VerifiedDeal": true, - "Client": "t01234", - "Provider": "t01234", - "Label": "string value", - "StartEpoch": 10101, - "EndEpoch": 10101, - "StoragePricePerEpoch": "0", - "ProviderCollateral": "0", - "ClientCollateral": "0" + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, - "State": { - "SectorStartEpoch": 10101, - "LastUpdatedEpoch": 10101, - "SlashEpoch": 10101 - } - } + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true } ``` -### StateMarketParticipants +### MsigRemoveSigner -Perms: read +Perms: sign Inputs: ```json [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + "f01234", + true ] ``` Response: ```json { - "t026363": { - "Escrow": "0", - "Locked": "0" - } + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true } ``` -### StateMarketStorageDeal +### MsigSwapApprove -Perms: read +Perms: sign Inputs: ```json [ - 5432, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + 42, + "f01234", + "f01234", + "f01234" ] ``` Response: ```json { - "Proposal": { - "PieceCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, - "PieceSize": 1032, - "VerifiedDeal": true, - "Client": "t01234", - "Provider": "t01234", - "Label": "string value", - "StartEpoch": 10101, - "EndEpoch": 10101, - "StoragePricePerEpoch": "0", - "ProviderCollateral": "0", - "ClientCollateral": "0" + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" }, - "State": { - "SectorStartEpoch": 10101, - "LastUpdatedEpoch": 10101, - "SlashEpoch": 10101 - } + "ValidNonce": true } ``` -### StateMinerActiveSectors +### MsigSwapCancel -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + 42, + "f01234", + "f01234" ] ``` Response: ```json -[ - { - "SectorNumber": 9, - "SealProof": 8, - "SealedCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, - "DealIDs": [ - 5432 - ], - "Activation": 10101, - "Expiration": 10101, - "DealWeight": "0", - "VerifiedDealWeight": "0", - "InitialPledge": "0", - "ExpectedDayReward": "0", - "ExpectedStoragePledge": "0", - "SectorKeyCID": null - } -] + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} ``` -### StateMinerAvailableBalance +### MsigSwapPropose -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + "f01234", + "f01234" ] ``` -Response: `"0"` +Response: +```json +{ + "Message": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "ValidNonce": true +} +``` + +## Network -### StateMinerDeadlines +### NetAddrsListen Perms: read -Inputs: -```json -[ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] -] -``` +Inputs: `[]` Response: ```json -[ - { - "PostSubmissions": [ - 5, - 1 - ], - "DisputableProofCount": 42 - } -] +{ + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] +} ``` -### StateMinerFaults +### NetworkConnect Perms: read @@ -4463,27 +4324,21 @@ Perms: read Inputs: ```json [ - "t01234", [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } + "string value" ] ] ``` Response: ```json -[ - 5, - 1 -] +{ + "PeerID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Err": {} +} ``` -### StateMinerInfo +### NetworkFindPeer Perms: read @@ -4491,40 +4346,21 @@ Perms: read Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" ] ``` Response: ```json { - "Owner": "t01234", - "Worker": "t01234", - "NewWorker": "t01234", - "ControlAddresses": [ - "t01234" - ], - "WorkerChangeEpoch": 10101, - "PeerId": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Multiaddrs": [ - "Ynl0ZSBhcnJheQ==" - ], - "WindowPoStProofType": 8, - "SectorSize": 34359738368, - "WindowPoStPartitionSectors": 42, - "ConsensusFaultElapsed": 10101 + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` -### StateMinerInitialPledgeCollateral +### NetworkFindProvidersAsync Perms: read @@ -4532,86 +4368,41 @@ Perms: read Inputs: ```json [ - "t01234", { - "SealProof": 8, - "SectorNumber": 9, - "SealedCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "SealRandEpoch": 10101, - "DealIDs": [ - 5432 - ], - "Expiration": 10101, - "ReplaceCapacity": true, - "ReplaceSectorDeadline": 42, - "ReplaceSectorPartition": 42, - "ReplaceSectorNumber": 9 + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + 123 ] ``` -Response: `"0"` +Response: +```json +{ + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] +} +``` -### StateMinerPartitions +### NetworkGetBandwidthStats -Perms: read +Perms: admin -Inputs: -```json -[ - "t01234", - 42, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] -] -``` +Inputs: `[]` Response: ```json -[ - { - "AllSectors": [ - 5, - 1 - ], - "FaultySectors": [ - 5, - 1 - ], - "RecoveringSectors": [ - 5, - 1 - ], - "LiveSectors": [ - 5, - 1 - ], - "ActiveSectors": [ - 5, - 1 - ] - } -] +{ + "TotalIn": 9, + "TotalOut": 9, + "RateIn": 12.3, + "RateOut": 12.3 +} ``` -### StateMinerPower +### NetworkGetClosestPeers Perms: read @@ -4619,72 +4410,41 @@ Perms: read Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "string value" ] ``` Response: ```json -{ - "MinerPower": { - "RawBytePower": "0", - "QualityAdjPower": "0" - }, - "TotalPower": { - "RawBytePower": "0", - "QualityAdjPower": "0" - }, - "HasMinPower": true -} +[ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" +] ``` -### StateMinerPreCommitDepositForPower +### NetworkGetPeerAddresses -Perms: read +Perms: admin -Inputs: +Inputs: `[]` + +Response: ```json [ - "t01234", - { - "SealProof": 8, - "SectorNumber": 9, - "SealedCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "SealRandEpoch": 10101, - "DealIDs": [ - 5432 - ], - "Expiration": 10101, - "ReplaceCapacity": true, - "ReplaceSectorDeadline": 42, - "ReplaceSectorPartition": 42, - "ReplaceSectorNumber": 9 - }, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" ] ``` -Response: `"0"` +### NetworkGetPeerID -### StateMinerProvingDeadline + +Perms: admin + +Inputs: `[]` + +Response: `"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"` + +### NetworkPeers Perms: read @@ -4692,286 +4452,299 @@ Perms: read Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, + true, + true, + true +] +``` + +Response: +```json +{ + "Peers": [ { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + "Addr": "string value", + "Peer": "string value", + "Latency": "string value", + "Muxer": "string value", + "Streams": [ + { + "Protocol": "string value" + } + ] } ] -] +} ``` +### Version + + +Perms: read + +Inputs: `[]` + Response: ```json { - "CurrentEpoch": 10101, - "PeriodStart": 10101, - "Index": 42, - "Open": 10101, - "Close": 10101, - "Challenge": 10101, - "FaultCutoff": 10101, - "WPoStPeriodDeadlines": 42, - "WPoStProvingPeriod": 10101, - "WPoStChallengeWindow": 10101, - "WPoStChallengeLookback": 10101, - "FaultDeclarationCutoff": 10101 + "Version": "string value", + "APIVersion": 131584 } ``` -### StateMinerRecoveries +## Paychan + +### PaychAllocateLane +PaychAllocateLane Allocate late creates a lane within a payment channel so that calls to +CreatePaymentVoucher will automatically make vouchers only for the difference in total -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234" ] ``` -Response: -```json -[ - 5, - 1 -] -``` +Response: `42` -### StateMinerSectorAllocated +### PaychAvailableFunds +PaychAvailableFunds get the status of an outbound payment channel +@pch: payment channel address -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - 9, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234" ] ``` -Response: `true` +Response: +```json +{ + "Channel": "\u003cempty\u003e", + "From": "f01234", + "To": "f01234", + "ConfirmedAmt": "0", + "PendingAmt": "0", + "PendingWaitSentinel": null, + "QueuedAmt": "0", + "VoucherReedeemedAmt": "0" +} +``` -### StateMinerSectorCount +### PaychAvailableFundsByFromTo +PaychAvailableFundsByFromTo get the status of an outbound payment channel +@from: the payment channel sender +@to: he payment channel recipient -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234" ] ``` Response: ```json { - "Live": 42, - "Active": 42, - "Faulty": 42 + "Channel": "\u003cempty\u003e", + "From": "f01234", + "To": "f01234", + "ConfirmedAmt": "0", + "PendingAmt": "0", + "PendingWaitSentinel": null, + "QueuedAmt": "0", + "VoucherReedeemedAmt": "0" } ``` -### StateMinerSectorSize +### PaychCollect +PaychCollect update payment channel status to collect +Collect sends the value of submitted vouchers to the channel recipient (the provider), +and refunds the remaining channel balance to the channel creator (the client). +@pch: payment channel address -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234" ] ``` -Response: `34359738368` +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` -### StateMinerSectors +### PaychGet +PaychGet creates a payment channel to a provider with a amount of FIL +@from: the payment channel sender +@to: the payment channel recipient +@amt: the deposits funds in the payment channel -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - 0 - ], - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234", + "f01234", + "0" ] ``` Response: ```json -[ - { - "SectorNumber": 9, - "SealProof": 8, - "SealedCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - "DealIDs": [ - 5432 - ], - "Activation": 10101, - "Expiration": 10101, - "DealWeight": "0", - "VerifiedDealWeight": "0", - "InitialPledge": "0", - "ExpectedDayReward": "0", - "ExpectedStoragePledge": "0", - "SectorKeyCID": null +{ + "Channel": "f01234", + "WaitSentinel": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } -] +} ``` -### StateMinerWorkerAddress +### PaychGetWaitReady +PaychGetWaitReady waits until the create channel / add funds message with the sentinel +@sentinel: given message CID arrives. +@ch: the returned channel address can safely be used against the Manager methods. -Perms: read +Perms: sign Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } ] ``` -Response: `"t01234"` +Response: `"f01234"` -### StateNetworkName +### PaychList +PaychList list the addresses of all channels that have been created Perms: read -Inputs: `null` - -Response: `"mainnet"` - -### StateNetworkVersion - - -Perms: read +Inputs: `[]` -Inputs: +Response: ```json [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234" ] ``` -Response: `14` - -### StateSearchMsg +### PaychNewPayment +PaychNewPayment aggregate vouchers into a new lane +@from: the payment channel sender +@to: the payment channel recipient +@vouchers: the outstanding (non-redeemed) vouchers -Perms: read +Perms: sign Inputs: ```json [ + "f01234", + "f01234", [ { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + "Amount": "0", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "MinSettle": 10101, + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + } } - ], - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - 10101, - true + ] ] ``` Response: ```json { - "Message": { + "Channel": "f01234", + "WaitSentinel": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Receipt": { - "ExitCode": 0, - "Return": "Ynl0ZSBhcnJheQ==", - "GasUsed": 9 - }, - "ReturnDec": {}, - "TipSet": [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, + "Vouchers": [ { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } } - ], - "Height": 10101 + ] +} +``` + +### PaychSettle +PaychSettle update payment channel status to settle +After a settlement period (currently 12 hours) either party to the payment channel can call collect on chain +@pch: payment channel address + + +Perms: sign + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } ``` -### StateSectorExpiration +### PaychStatus +PaychStatus get the payment channel status +@pch: payment channel address Perms: read @@ -4979,71 +4752,112 @@ Perms: read Inputs: ```json [ - "t01234", - 9, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234" ] ``` Response: ```json { - "OnTime": 10101, - "Early": 10101 + "ControlAddr": "f01234", + "Direction": 1 } ``` -### StateSectorGetInfo +### PaychVoucherAdd +PaychVoucherAdd adds a voucher for an inbound channel. +If the channel is not in the store, fetches the channel from state (and checks that +the channel To address is owned by the wallet). -Perms: read +Perms: write Inputs: ```json [ - "t01234", - 9, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "f01234", + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" } - ] + }, + "Ynl0ZSBhcnJheQ==", + "0" ] ``` -Response: +Response: `"0"` + +### PaychVoucherCheckSpendable +PaychVoucherCheckSpendable checks if the given voucher is currently spendable +@pch: payment channel address +@sv: voucher + + +Perms: read + +Inputs: ```json -{ - "SectorNumber": 9, - "SealProof": 8, - "SealedCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +[ + "f01234", + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } }, - "DealIDs": [ - 5432 - ], - "Activation": 10101, - "Expiration": 10101, - "DealWeight": "0", - "VerifiedDealWeight": "0", - "InitialPledge": "0", - "ExpectedDayReward": "0", - "ExpectedStoragePledge": "0", - "SectorKeyCID": null -} + "Ynl0ZSBhcnJheQ==", + "Ynl0ZSBhcnJheQ==" +] ``` -### StateSectorPartition +Response: `true` + +### PaychVoucherCheckValid +PaychVoucherCheckValid checks if the given voucher is valid (is or could become spendable at some point). +If the channel is not in the store, fetches the channel from state (and checks that +the channel To address is owned by the wallet). +@pch: payment channel address +@sv: voucher Perms: read @@ -5051,128 +4865,209 @@ Perms: read Inputs: ```json [ - "t01234", - 9, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "f01234", + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" } - ] + } +] +``` + +Response: `{}` + +### PaychVoucherCreate +PaychVoucherCreate creates a new signed voucher on the given payment channel +with the given lane and amount. The value passed in is exactly the value +that will be used to create the voucher, so if previous vouchers exist, the +actual additional value of this voucher will only be the difference between +the two. +If there are insufficient funds in the channel to create the voucher, +returns a nil voucher and the shortfall. + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "0", + 42 ] ``` Response: ```json { - "Deadline": 42, - "Partition": 42 + "Voucher": { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + }, + "Shortfall": "0" } ``` -### StateSectorPreCommitInfo +### PaychVoucherList +PaychVoucherList list vouchers in payment channel +@pch: payment channel address -Perms: read +Perms: write Inputs: ```json [ - "t01234", - 9, - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + "f01234" ] ``` Response: ```json -{ - "Info": { - "SealProof": 8, - "SectorNumber": 9, - "SealedCID": { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +[ + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" }, - "SealRandEpoch": 10101, - "DealIDs": [ - 5432 + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } ], - "Expiration": 10101, - "ReplaceCapacity": true, - "ReplaceSectorDeadline": 42, - "ReplaceSectorPartition": 42, - "ReplaceSectorNumber": 9 - }, - "PreCommitDeposit": "0", - "PreCommitEpoch": 10101, - "DealWeight": "0", - "VerifiedDealWeight": "0" -} + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } +] ``` -### StateVMCirculatingSupplyInternal +### PaychVoucherSubmit +PaychVoucherSubmit Submit voucher to chain to update payment channel state +@pch: payment channel address +@sv: voucher in payment channel -Perms: read +Perms: sign Inputs: ```json [ - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "f01234", + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" } - ] + }, + "Ynl0ZSBhcnJheQ==", + "Ynl0ZSBhcnJheQ==" ] ``` Response: ```json { - "FilVested": "0", - "FilMined": "0", - "FilBurnt": "0", - "FilLocked": "0", - "FilCirculating": "0", - "FilReserveDisbursed": "0" + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } ``` -### StateVerifiedClientStatus +## Syncer +### ChainSyncHandleNewTipSet -Perms: read + +Perms: write Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + { + "Source": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Sender": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Head": { + "Cids": null, + "Blocks": null, + "Height": 0 } - ] + } ] ``` -Response: `"0"` +Response: `{}` -### StateVerifiedRegistryRootKey +### ChainTipSetWeight Perms: read @@ -5191,31 +5086,32 @@ Inputs: ] ``` -Response: `"t01234"` +Response: `"0"` -### StateVerifierStatus +### Concurrent Perms: read +Inputs: `[]` + +Response: `9` + +### SetConcurrent + + +Perms: admin + Inputs: ```json [ - "t01234", - [ - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ] + 9 ] ``` -Response: `"0"` +Response: `{}` -### StateWaitMsg +### StateCall Perms: read @@ -5224,47 +5120,171 @@ Inputs: ```json [ { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" }, - 42, - 10101, - true + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] ] ``` Response: ```json { - "Message": { + "MsgCid": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Receipt": { + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "MsgRct": { "ExitCode": 0, "Return": "Ynl0ZSBhcnJheQ==", "GasUsed": 9 }, - "ReturnDec": {}, - "TipSet": [ - { + "GasCost": { + "Message": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - { - "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" - } - ], - "Height": 10101 + "GasUsed": "0", + "BaseFeeBurn": "0", + "OverEstimationBurn": "0", + "MinerPenalty": "0", + "MinerTip": "0", + "Refund": "0", + "TotalCost": "0" + }, + "ExecutionTrace": { + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": [ + { + "Msg": { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": null + } + ] + }, + "Error": "string value", + "Duration": 60000000000 } ``` -## Sync - - ### SyncState Perms: read -Inputs: `null` +Inputs: `[]` Response: ```json @@ -5303,7 +5323,7 @@ Inputs: [ { "Header": { - "Miner": "t01234", + "Miner": "f01234", "Ticket": { "VRFProof": "Bw==" }, @@ -5367,15 +5387,12 @@ Inputs: Response: `{}` -## Syncer - - ### SyncerTracker Perms: read -Inputs: `null` +Inputs: `[]` Response: ```json @@ -5433,10 +5450,27 @@ Response: } ``` -## Un +## Wallet +### HasPassword -### UnLockWallet + +Perms: admin + +Inputs: `[]` + +Response: `true` + +### LockWallet + + +Perms: admin + +Inputs: `[]` + +Response: `{}` + +### SetPassword Perms: admin @@ -5450,41 +5484,31 @@ Inputs: Response: `{}` -## Verify - - -### VerifyEntry +### UnLockWallet -Perms: read +Perms: admin Inputs: ```json [ - { - "Round": 42, - "Data": "Ynl0ZSBhcnJheQ==" - }, - 10101 + "Ynl0ZSBhcnJheQ==" ] ``` -Response: `true` - -## Wallet - +Response: `{}` ### WalletAddresses Perms: admin -Inputs: `null` +Inputs: `[]` Response: ```json [ - "t01234" + "f01234" ] ``` @@ -5496,7 +5520,7 @@ Perms: read Inputs: ```json [ - "t01234" + "f01234" ] ``` @@ -5507,9 +5531,9 @@ Response: `"0"` Perms: write -Inputs: `null` +Inputs: `[]` -Response: `"t01234"` +Response: `"f01234"` ### WalletExport @@ -5519,7 +5543,7 @@ Perms: admin Inputs: ```json [ - "t01234", + "f01234", "string value" ] ``` @@ -5540,7 +5564,7 @@ Perms: write Inputs: ```json [ - "t01234" + "f01234" ] ``` @@ -5561,7 +5585,7 @@ Inputs: ] ``` -Response: `"t01234"` +Response: `"f01234"` ### WalletNewAddress @@ -5575,7 +5599,7 @@ Inputs: ] ``` -Response: `"t01234"` +Response: `"f01234"` ### WalletSetDefault @@ -5585,7 +5609,7 @@ Perms: write Inputs: ```json [ - "t01234" + "f01234" ] ``` @@ -5599,7 +5623,7 @@ Perms: sign Inputs: ```json [ - "t01234", + "f01234", "Ynl0ZSBhcnJheQ==", { "Type": "message", @@ -5624,14 +5648,14 @@ Perms: sign Inputs: ```json [ - "t01234", + "f01234", { "CID": { "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -5651,8 +5675,8 @@ Response: "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" }, "Version": 42, - "To": "t01234", - "From": "t01234", + "To": "f01234", + "From": "f01234", "Nonce": 42, "Value": "0", "GasLimit": 9, @@ -5676,7 +5700,7 @@ Response: Perms: admin -Inputs: `null` +Inputs: `[]` Response: `123` diff --git a/venus-shared/api/messager/method.md b/venus-shared/api/messager/method.md new file mode 100644 index 0000000000..eed5197e81 --- /dev/null +++ b/venus-shared/api/messager/method.md @@ -0,0 +1,1338 @@ +# Groups + +* [Messager](#Messager) + * [ActiveAddress](#ActiveAddress) + * [ClearUnFillMessage](#ClearUnFillMessage) + * [DeleteAddress](#DeleteAddress) + * [DeleteNode](#DeleteNode) + * [ForbiddenAddress](#ForbiddenAddress) + * [ForcePushMessage](#ForcePushMessage) + * [ForcePushMessageWithId](#ForcePushMessageWithId) + * [GetAddress](#GetAddress) + * [GetMessageByFromAndNonce](#GetMessageByFromAndNonce) + * [GetMessageBySignedCid](#GetMessageBySignedCid) + * [GetMessageByUid](#GetMessageByUid) + * [GetMessageByUnsignedCid](#GetMessageByUnsignedCid) + * [GetNode](#GetNode) + * [GetSharedParams](#GetSharedParams) + * [HasAddress](#HasAddress) + * [HasMessageByUid](#HasMessageByUid) + * [HasNode](#HasNode) + * [ListAddress](#ListAddress) + * [ListBlockedMessage](#ListBlockedMessage) + * [ListFailedMessage](#ListFailedMessage) + * [ListMessage](#ListMessage) + * [ListMessageByAddress](#ListMessageByAddress) + * [ListMessageByFromState](#ListMessageByFromState) + * [ListNode](#ListNode) + * [MarkBadMessage](#MarkBadMessage) + * [PushMessage](#PushMessage) + * [PushMessageWithId](#PushMessageWithId) + * [RecoverFailedMsg](#RecoverFailedMsg) + * [RefreshSharedParams](#RefreshSharedParams) + * [ReplaceMessage](#ReplaceMessage) + * [RepublishMessage](#RepublishMessage) + * [SaveNode](#SaveNode) + * [Send](#Send) + * [SetFeeParams](#SetFeeParams) + * [SetLogLevel](#SetLogLevel) + * [SetSelectMsgNum](#SetSelectMsgNum) + * [SetSharedParams](#SetSharedParams) + * [UpdateAllFilledMessage](#UpdateAllFilledMessage) + * [UpdateFilledMessageByID](#UpdateFilledMessageByID) + * [UpdateMessageStateByID](#UpdateMessageStateByID) + * [UpdateNonce](#UpdateNonce) + * [WaitMessage](#WaitMessage) + * [WalletHas](#WalletHas) + +## Messager + +### ActiveAddress + + +Perms: admin + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `{}` + +### ClearUnFillMessage + + +Perms: admin + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `123` + +### DeleteAddress + + +Perms: admin + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `{}` + +### DeleteNode + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +### ForbiddenAddress + + +Perms: admin + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `{}` + +### ForcePushMessage + + +Perms: admin + +Inputs: +```json +[ + "string value", + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + { + "expireEpoch": 10101, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0" + } +] +``` + +Response: `"string value"` + +### ForcePushMessageWithId + + +Perms: write + +Inputs: +```json +[ + "string value", + "string value", + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + { + "expireEpoch": 10101, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0" + } +] +``` + +Response: `"string value"` + +### GetAddress + + +Perms: admin + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +{ + "id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "addr": "f01234", + "nonce": 42, + "weight": 9, + "selMsgNum": 42, + "state": 1, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0", + "isDeleted": 123, + "createAt": "0001-01-01T00:00:00Z", + "updateAt": "0001-01-01T00:00:00Z" +} +``` + +### GetMessageByFromAndNonce + + +Perms: read + +Inputs: +```json +[ + "f01234", + 42 +] +``` + +Response: +```json +{ + "ID": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "UnsignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Height": 100, + "Confidence": 10, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "TipSetKey": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Meta": { + "expireEpoch": 10101, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0" + }, + "WalletName": "test", + "FromUser": "test", + "State": 1, + "CreatedAt": "0001-01-01T00:00:00Z", + "UpdatedAt": "0001-01-01T00:00:00Z" +} +``` + +### GetMessageBySignedCid + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "ID": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "UnsignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Height": 100, + "Confidence": 10, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "TipSetKey": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Meta": { + "expireEpoch": 10101, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0" + }, + "WalletName": "test", + "FromUser": "test", + "State": 1, + "CreatedAt": "0001-01-01T00:00:00Z", + "UpdatedAt": "0001-01-01T00:00:00Z" +} +``` + +### GetMessageByUid + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "ID": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "UnsignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Height": 100, + "Confidence": 10, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "TipSetKey": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Meta": { + "expireEpoch": 10101, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0" + }, + "WalletName": "test", + "FromUser": "test", + "State": 1, + "CreatedAt": "0001-01-01T00:00:00Z", + "UpdatedAt": "0001-01-01T00:00:00Z" +} +``` + +### GetMessageByUnsignedCid + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "ID": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "UnsignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Height": 100, + "Confidence": 10, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "TipSetKey": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Meta": { + "expireEpoch": 10101, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0" + }, + "WalletName": "test", + "FromUser": "test", + "State": 1, + "CreatedAt": "0001-01-01T00:00:00Z", + "UpdatedAt": "0001-01-01T00:00:00Z" +} +``` + +### GetNode + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "ID": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Name": "venus", + "URL": "/ip4/127.0.0.1/tcp/3453", + "Token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBbGxvdyI6WyJyZWFkIiwid3JpdGUiLCJzaWduIiwiYWRtaW4iXX0._eHBJJAiBzQmfcbD_vVmtTrkgyJQ-LOgGOiHfb8rU1I", + "Type": 2 +} +``` + +### GetSharedParams + + +Perms: admin + +Inputs: `[]` + +Response: +```json +{ + "id": 42, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0", + "selMsgNum": 42 +} +``` + +### HasAddress + + +Perms: read + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `true` + +### HasMessageByUid + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: `true` + +### HasNode + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `true` + +### ListAddress + + +Perms: admin + +Inputs: `[]` + +Response: +```json +[ + { + "id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "addr": "f01234", + "nonce": 42, + "weight": 9, + "selMsgNum": 42, + "state": 1, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0", + "isDeleted": 123, + "createAt": "0001-01-01T00:00:00Z", + "updateAt": "0001-01-01T00:00:00Z" + } +] +``` + +### ListBlockedMessage + + +Perms: admin + +Inputs: +```json +[ + "f01234", + 60000000000 +] +``` + +Response: +```json +[ + { + "ID": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "UnsignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Height": 100, + "Confidence": 10, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "TipSetKey": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Meta": { + "expireEpoch": 10101, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0" + }, + "WalletName": "test", + "FromUser": "test", + "State": 1, + "CreatedAt": "0001-01-01T00:00:00Z", + "UpdatedAt": "0001-01-01T00:00:00Z" + } +] +``` + +### ListFailedMessage + + +Perms: admin + +Inputs: `[]` + +Response: +```json +[ + { + "ID": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "UnsignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Height": 100, + "Confidence": 10, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "TipSetKey": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Meta": { + "expireEpoch": 10101, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0" + }, + "WalletName": "test", + "FromUser": "test", + "State": 1, + "CreatedAt": "0001-01-01T00:00:00Z", + "UpdatedAt": "0001-01-01T00:00:00Z" + } +] +``` + +### ListMessage + + +Perms: admin + +Inputs: `[]` + +Response: +```json +[ + { + "ID": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "UnsignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Height": 100, + "Confidence": 10, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "TipSetKey": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Meta": { + "expireEpoch": 10101, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0" + }, + "WalletName": "test", + "FromUser": "test", + "State": 1, + "CreatedAt": "0001-01-01T00:00:00Z", + "UpdatedAt": "0001-01-01T00:00:00Z" + } +] +``` + +### ListMessageByAddress + + +Perms: admin + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +[ + { + "ID": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "UnsignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Height": 100, + "Confidence": 10, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "TipSetKey": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Meta": { + "expireEpoch": 10101, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0" + }, + "WalletName": "test", + "FromUser": "test", + "State": 1, + "CreatedAt": "0001-01-01T00:00:00Z", + "UpdatedAt": "0001-01-01T00:00:00Z" + } +] +``` + +### ListMessageByFromState + + +Perms: admin + +Inputs: +```json +[ + "f01234", + 3, + true, + 123, + 123 +] +``` + +Response: +```json +[ + { + "ID": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "UnsignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Height": 100, + "Confidence": 10, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "TipSetKey": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Meta": { + "expireEpoch": 10101, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0" + }, + "WalletName": "test", + "FromUser": "test", + "State": 1, + "CreatedAt": "0001-01-01T00:00:00Z", + "UpdatedAt": "0001-01-01T00:00:00Z" + } +] +``` + +### ListNode + + +Perms: admin + +Inputs: `[]` + +Response: +```json +[ + { + "ID": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Name": "venus", + "URL": "/ip4/127.0.0.1/tcp/3453", + "Token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBbGxvdyI6WyJyZWFkIiwid3JpdGUiLCJzaWduIiwiYWRtaW4iXX0._eHBJJAiBzQmfcbD_vVmtTrkgyJQ-LOgGOiHfb8rU1I", + "Type": 2 + } +] +``` + +### MarkBadMessage + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +### PushMessage + + +Perms: write + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + { + "expireEpoch": 10101, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0" + } +] +``` + +Response: `"string value"` + +### PushMessageWithId + + +Perms: write + +Inputs: +```json +[ + "string value", + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + { + "expireEpoch": 10101, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0" + } +] +``` + +Response: `"string value"` + +### RecoverFailedMsg + + +Perms: admin + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +[ + "string value" +] +``` + +### RefreshSharedParams + + +Perms: admin + +Inputs: `[]` + +Response: `{}` + +### ReplaceMessage + + +Perms: admin + +Inputs: +```json +[ + "string value", + true, + "string value", + 9, + "string value", + "string value" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### RepublishMessage + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +### SaveNode + + +Perms: admin + +Inputs: +```json +[ + { + "ID": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Name": "venus", + "URL": "/ip4/127.0.0.1/tcp/3453", + "Token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBbGxvdyI6WyJyZWFkIiwid3JpdGUiLCJzaWduIiwiYWRtaW4iXX0._eHBJJAiBzQmfcbD_vVmtTrkgyJQ-LOgGOiHfb8rU1I", + "Type": 2 + } +] +``` + +Response: `{}` + +### Send + + +Perms: admin + +Inputs: +```json +[ + { + "To": "f01234", + "From": "f01234", + "Val": "0", + "Account": "string value", + "GasPremium": "0", + "GasFeeCap": "0", + "GasLimit": 10000, + "Method": 1, + "Params": "string value", + "ParamsType": "json" + } +] +``` + +Response: `"string value"` + +### SetFeeParams + + +Perms: admin + +Inputs: +```json +[ + "f01234", + 12.3, + "string value", + "string value" +] +``` + +Response: `{}` + +### SetLogLevel + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +### SetSelectMsgNum + + +Perms: admin + +Inputs: +```json +[ + "f01234", + 42 +] +``` + +Response: `{}` + +### SetSharedParams + + +Perms: admin + +Inputs: +```json +[ + { + "id": 42, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0", + "selMsgNum": 42 + } +] +``` + +Response: `{}` + +### UpdateAllFilledMessage + + +Perms: admin + +Inputs: `[]` + +Response: `123` + +### UpdateFilledMessageByID + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `"string value"` + +### UpdateMessageStateByID + + +Perms: admin + +Inputs: +```json +[ + "string value", + 3 +] +``` + +Response: `{}` + +### UpdateNonce + + +Perms: admin + +Inputs: +```json +[ + "f01234", + 42 +] +``` + +Response: `{}` + +### WaitMessage + + +Perms: read + +Inputs: +```json +[ + "string value", + 42 +] +``` + +Response: +```json +{ + "ID": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "UnsignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SignedCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Height": 100, + "Confidence": 10, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "TipSetKey": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Meta": { + "expireEpoch": 10101, + "gasOverEstimation": 12.3, + "maxFee": "0", + "maxFeeCap": "0" + }, + "WalletName": "test", + "FromUser": "test", + "State": 1, + "CreatedAt": "0001-01-01T00:00:00Z", + "UpdatedAt": "0001-01-01T00:00:00Z" +} +``` + +### WalletHas + + +Perms: read + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `true` + diff --git a/venus-shared/api/wallet/method.md b/venus-shared/api/wallet/method.md new file mode 100644 index 0000000000..614744517e --- /dev/null +++ b/venus-shared/api/wallet/method.md @@ -0,0 +1,1049 @@ +# Groups + +* [Common](#Common) + * [AuthNew](#AuthNew) + * [AuthVerify](#AuthVerify) + * [LogList](#LogList) + * [LogSetLevel](#LogSetLevel) + * [Version](#Version) +* [Strategy](#Strategy) + * [AddMethodIntoKeyBind](#AddMethodIntoKeyBind) + * [AddMsgTypeIntoKeyBind](#AddMsgTypeIntoKeyBind) + * [GetGroupByName](#GetGroupByName) + * [GetKeyBindByName](#GetKeyBindByName) + * [GetKeyBinds](#GetKeyBinds) + * [GetMethodTemplateByName](#GetMethodTemplateByName) + * [GetMsgTypeTemplate](#GetMsgTypeTemplate) + * [GetWalletTokenInfo](#GetWalletTokenInfo) + * [GetWalletTokensByGroup](#GetWalletTokensByGroup) + * [ListGroups](#ListGroups) + * [ListKeyBinds](#ListKeyBinds) + * [ListMethodTemplates](#ListMethodTemplates) + * [ListMsgTypeTemplates](#ListMsgTypeTemplates) + * [NewGroup](#NewGroup) + * [NewKeyBindCustom](#NewKeyBindCustom) + * [NewKeyBindFromTemplate](#NewKeyBindFromTemplate) + * [NewMethodTemplate](#NewMethodTemplate) + * [NewMsgTypeTemplate](#NewMsgTypeTemplate) + * [NewStToken](#NewStToken) + * [RemoveGroup](#RemoveGroup) + * [RemoveKeyBind](#RemoveKeyBind) + * [RemoveKeyBindByAddress](#RemoveKeyBindByAddress) + * [RemoveMethodFromKeyBind](#RemoveMethodFromKeyBind) + * [RemoveMethodTemplate](#RemoveMethodTemplate) + * [RemoveMsgTypeFromKeyBind](#RemoveMsgTypeFromKeyBind) + * [RemoveMsgTypeTemplate](#RemoveMsgTypeTemplate) + * [RemoveStToken](#RemoveStToken) +* [StrategyVerify](#StrategyVerify) + * [ContainWallet](#ContainWallet) + * [ScopeWallet](#ScopeWallet) + * [Verify](#Verify) +* [Wallet](#Wallet) + * [WalletDelete](#WalletDelete) + * [WalletExport](#WalletExport) + * [WalletHas](#WalletHas) + * [WalletImport](#WalletImport) + * [WalletList](#WalletList) + * [WalletNew](#WalletNew) + * [WalletSign](#WalletSign) +* [WalletEvent](#WalletEvent) + * [AddNewAddress](#AddNewAddress) + * [AddSupportAccount](#AddSupportAccount) +* [WalletLock](#WalletLock) + * [Lock](#Lock) + * [LockState](#LockState) + * [SetPassword](#SetPassword) + * [Unlock](#Unlock) + * [VerifyPassword](#VerifyPassword) + +## Common + +### AuthNew + + +Perms: admin + +Inputs: +```json +[ + [ + "string value" + ] +] +``` + +Response: `"Ynl0ZSBhcnJheQ=="` + +### AuthVerify +Auth + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +[ + "string value" +] +``` + +### LogList + + +Perms: read + +Inputs: `[]` + +Response: +```json +[ + "string value" +] +``` + +### LogSetLevel + + +Perms: write + +Inputs: +```json +[ + "string value", + "string value" +] +``` + +Response: `{}` + +### Version +Version provides information about API provider + + +Perms: read + +Inputs: `[]` + +Response: +```json +{ + "Version": "string value", + "APIVersion": 131584 +} +``` + +## Strategy + +### AddMethodIntoKeyBind +AddMethodIntoKeyBind append methods into keyBind + + +Perms: admin + +Inputs: +```json +[ + "string value", + [ + "string value" + ] +] +``` + +Response: +```json +{ + "BindID": 42, + "Name": "string value", + "Address": "string value", + "MetaTypes": 2, + "Methods": [ + "string value" + ] +} +``` + +### AddMsgTypeIntoKeyBind +AddMsgTypeIntoKeyBind append msgTypes into keyBind + + +Perms: admin + +Inputs: +```json +[ + "string value", + [ + 123 + ] +] +``` + +Response: +```json +{ + "BindID": 42, + "Name": "string value", + "Address": "string value", + "MetaTypes": 2, + "Methods": [ + "string value" + ] +} +``` + +### GetGroupByName +GetGroupByName get a group by name + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "GroupID": 42, + "Name": "string value", + "KeyBinds": [ + { + "BindID": 42, + "Name": "string value", + "Address": "string value", + "MetaTypes": 2, + "Methods": [ + "string value" + ] + } + ] +} +``` + +### GetKeyBindByName +GetKeyBindByName get a keyBind by name + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "BindID": 42, + "Name": "string value", + "Address": "string value", + "MetaTypes": 2, + "Methods": [ + "string value" + ] +} +``` + +### GetKeyBinds +GetKeyBinds list keyBinds by address + + +Perms: admin + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +[ + { + "BindID": 42, + "Name": "string value", + "Address": "string value", + "MetaTypes": 2, + "Methods": [ + "string value" + ] + } +] +``` + +### GetMethodTemplateByName +GetMethodTemplateByName get a method template by name + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "MTId": 42, + "Name": "string value", + "Methods": [ + "string value" + ] +} +``` + +### GetMsgTypeTemplate +GetMsgTypeTemplate get a msgType template by name + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "MTTId": 42, + "Name": "string value", + "MetaTypes": 2 +} +``` + +### GetWalletTokenInfo +GetWalletTokenInfo get group details by token + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "Token": "string value", + "GroupID": 42, + "Name": "string value", + "KeyBinds": [ + { + "BindID": 42, + "Name": "string value", + "Address": "string value", + "MetaTypes": 2, + "Methods": [ + "string value" + ] + } + ] +} +``` + +### GetWalletTokensByGroup +GetWalletTokensByGroup list strategy tokens under the group + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +[ + "string value" +] +``` + +### ListGroups +ListGroups list groups' simple information + + +Perms: admin + +Inputs: +```json +[ + 123, + 123 +] +``` + +Response: +```json +[ + { + "GroupID": 42, + "Name": "string value", + "KeyBinds": [ + { + "BindID": 42, + "Name": "string value", + "Address": "string value", + "MetaTypes": 2, + "Methods": [ + "string value" + ] + } + ] + } +] +``` + +### ListKeyBinds +ListKeyBinds list keyBinds' details + + +Perms: admin + +Inputs: +```json +[ + 123, + 123 +] +``` + +Response: +```json +[ + { + "BindID": 42, + "Name": "string value", + "Address": "string value", + "MetaTypes": 2, + "Methods": [ + "string value" + ] + } +] +``` + +### ListMethodTemplates +ListMethodTemplates list method templates' details + + +Perms: admin + +Inputs: +```json +[ + 123, + 123 +] +``` + +Response: +```json +[ + { + "MTId": 42, + "Name": "string value", + "Methods": [ + "string value" + ] + } +] +``` + +### ListMsgTypeTemplates +ListMsgTypeTemplates list msgType templates' details + + +Perms: admin + +Inputs: +```json +[ + 123, + 123 +] +``` + +Response: +```json +[ + { + "MTTId": 42, + "Name": "string value", + "MetaTypes": 2 + } +] +``` + +### NewGroup +NewGroup create a group to group multiple keyBinds together + + +Perms: admin + +Inputs: +```json +[ + "string value", + [ + "string value" + ] +] +``` + +Response: `{}` + +### NewKeyBindCustom +NewKeyBindCustom create a keyBind with custom msyTypes and methods + + +Perms: admin + +Inputs: +```json +[ + "string value", + "f01234", + [ + 123 + ], + [ + "string value" + ] +] +``` + +Response: `{}` + +### NewKeyBindFromTemplate +NewKeyBindFromTemplate create a keyBind form msgType template and method template + + +Perms: admin + +Inputs: +```json +[ + "string value", + "f01234", + "string value", + "string value" +] +``` + +Response: `{}` + +### NewMethodTemplate +NewMethodTemplate create a method template + + +Perms: admin + +Inputs: +```json +[ + "string value", + [ + "string value" + ] +] +``` + +Response: `{}` + +### NewMsgTypeTemplate +NewMsgTypeTemplate create a msgType template + + +Perms: admin + +Inputs: +```json +[ + "string value", + [ + 123 + ] +] +``` + +Response: `{}` + +### NewStToken +NewStToken generate a random token from group + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `"string value"` + +### RemoveGroup +RemoveGroup delete group by name + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +### RemoveKeyBind +RemoveKeyBind delete keyBind by name + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +### RemoveKeyBindByAddress +RemoveKeyBindByAddress delete some keyBinds by address + + +Perms: admin + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `9` + +### RemoveMethodFromKeyBind +RemoveMethodFromKeyBind remove methods from keyBind + + +Perms: admin + +Inputs: +```json +[ + "string value", + [ + "string value" + ] +] +``` + +Response: +```json +{ + "BindID": 42, + "Name": "string value", + "Address": "string value", + "MetaTypes": 2, + "Methods": [ + "string value" + ] +} +``` + +### RemoveMethodTemplate +RemoveMethodTemplate delete method template by name + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +### RemoveMsgTypeFromKeyBind +RemoveMsgTypeFromKeyBind remove msgTypes form keyBind + + +Perms: admin + +Inputs: +```json +[ + "string value", + [ + 123 + ] +] +``` + +Response: +```json +{ + "BindID": 42, + "Name": "string value", + "Address": "string value", + "MetaTypes": 2, + "Methods": [ + "string value" + ] +} +``` + +### RemoveMsgTypeTemplate +RemoveMsgTypeTemplate delete msgType template by name + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +### RemoveStToken +RemoveStToken delete strategy token + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +## StrategyVerify + +### ContainWallet +ContainWallet Check if it is visible to the wallet + + +Perms: admin + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `true` + +### ScopeWallet +ScopeWallet get the wallet scope + + +Perms: admin + +Inputs: `[]` + +Response: +```json +{ + "Root": true, + "Addresses": [ + "f01234" + ] +} +``` + +### Verify +Verify verify the address strategy permissions + + +Perms: admin + +Inputs: +```json +[ + "f01234", + "message", + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + } +] +``` + +Response: `{}` + +## Wallet + +### WalletDelete + + +Perms: admin + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `{}` + +### WalletExport + + +Perms: admin + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +{ + "Type": "bls", + "PrivateKey": "Ynl0ZSBhcnJheQ==" +} +``` + +### WalletHas + + +Perms: read + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `true` + +### WalletImport + + +Perms: admin + +Inputs: +```json +[ + { + "Type": "bls", + "PrivateKey": "Ynl0ZSBhcnJheQ==" + } +] +``` + +Response: `"f01234"` + +### WalletList + + +Perms: read + +Inputs: `[]` + +Response: +```json +[ + "f01234" +] +``` + +### WalletNew + + +Perms: admin + +Inputs: +```json +[ + "bls" +] +``` + +Response: `"f01234"` + +### WalletSign + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "Ynl0ZSBhcnJheQ==", + { + "Type": "message", + "Extra": "Ynl0ZSBhcnJheQ==" + } +] +``` + +Response: +```json +{ + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" +} +``` + +## WalletEvent + +### AddNewAddress + + +Perms: admin + +Inputs: +```json +[ + [ + "f01234" + ] +] +``` + +Response: `{}` + +### AddSupportAccount + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +## WalletLock + +### Lock +lock the wallet and disable IWallet logic + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +### LockState +show lock state + + +Perms: admin + +Inputs: `[]` + +Response: `true` + +### SetPassword +SetPassword do it first after program setup + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +### Unlock +unlock the wallet and enable IWallet logic + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +### VerifyPassword +VerifyPassword verify that the passwords are consistent + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + From a52156c641d80c399b74340e5bafed894882a177 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Wed, 9 Feb 2022 15:16:38 +0800 Subject: [PATCH 142/167] remove unrelated parmas (#4753) --- fixtures/_assets/proof-params/parameters.json | 20 ------------------- fixtures/asset/asset.go | 6 +++--- 2 files changed, 3 insertions(+), 23 deletions(-) diff --git a/fixtures/_assets/proof-params/parameters.json b/fixtures/_assets/proof-params/parameters.json index e67e640b86..88bb0bfa34 100644 --- a/fixtures/_assets/proof-params/parameters.json +++ b/fixtures/_assets/proof-params/parameters.json @@ -49,26 +49,6 @@ "digest": "80e366df2f1011953c2d01c7b7c9ee8e", "sector_size": 68719476736 }, - "v28-empty-sector-update-poseidon-merkletree-poseidon_hasher-8-8-0-3b7f44a9362e3985369454947bc94022e118211e49fd672d52bec1cbfd599d18.params": { - "cid": "QmfK4tonETepL6F4kDFdJ3fr72fzRWoRPf3XGMhV3RLX1S", - "digest": "b69983b5d7a97a20f43b3d5ff2a4ed04", - "sector_size": 34359738368 - }, - "v28-empty-sector-update-poseidon-merkletree-poseidon_hasher-8-8-0-3b7f44a9362e3985369454947bc94022e118211e49fd672d52bec1cbfd599d18.vk": { - "cid": "QmYCTYJQPu8wgtB2rMZ7HJC9nDx8c1fzYRPdCUiErK4q5a", - "digest": "1ac05784f304129f74c5184190c1ec78", - "sector_size": 34359738368 - }, - "v28-empty-sector-update-poseidon-merkletree-poseidon_hasher-8-8-2-102e1444a7e9a97ebf1e3d6855dcc77e66c011ea66f936d9b2c508f87f2f83a7.params": { - "cid": "QmNaaQXfm2NveN2Hf7bJ3udnQB2Qa4moMcUoJYJS6oWL6w", - "digest": "a6d4f96e2b641a6d7a1a8e6dc1155c8a", - "sector_size": 68719476736 - }, - "v28-empty-sector-update-poseidon-merkletree-poseidon_hasher-8-8-2-102e1444a7e9a97ebf1e3d6855dcc77e66c011ea66f936d9b2c508f87f2f83a7.vk": { - "cid": "QmXyeg9hbM7x9dGuUuAS68ozhiFEez4UkPTgwSDCVYKHBw", - "digest": "8e8fb9e2c56eb5d740d0de135305a7b8", - "sector_size": 68719476736 - }, "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0170db1f394b35d995252228ee359194b13199d259380541dc529fb0099096b0.params": { "cid": "QmVxjFRyhmyQaZEtCh7nk2abc7LhFkzhnRX4rcHqCCpikR", "digest": "7610b9f82bfc88405b7a832b651ce2f6", diff --git a/fixtures/asset/asset.go b/fixtures/asset/asset.go index 29768e4447..30073645cd 100644 --- a/fixtures/asset/asset.go +++ b/fixtures/asset/asset.go @@ -91,7 +91,7 @@ func fixtures_assetsCarButterflynetCar() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/car/butterflynet.car", size: 2185803, mode: os.FileMode(420), modTime: time.Unix(1644061871, 0)} + info := bindataFileInfo{name: "fixtures/_assets/car/butterflynet.car", size: 2185803, mode: os.FileMode(420), modTime: time.Unix(1644387858, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -196,7 +196,7 @@ func fixtures_assetsCarNerpanetCar() (*asset, error) { return a, nil } -var _fixtures_assetsProofParamsParametersJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x9a\x49\x6f\x62\x4b\xf6\xed\xe7\xf7\x53\xa4\x72\xfc\xf7\x53\xf4\x7b\xef\x9a\x01\xa6\x11\x06\x44\x0f\xf6\xa4\x14\xcd\x0e\xd3\x5c\xda\x03\x18\xf3\x54\xdf\xfd\xc9\xb7\x54\x7a\x52\xf9\x90\xf5\xbf\xaa\xcc\xbc\x39\xb3\x2c\x1d\x01\xbf\xb3\x62\xed\x15\x2b\xe2\xff\xfe\xf6\xe5\xcb\xd7\x8b\xc2\x07\xde\xec\x4f\xef\x0f\x05\xc7\xd3\xee\xf8\x70\xde\x27\x7f\xe2\x87\x0d\x1f\xd7\xbf\xf3\xe9\xc8\xfc\xb0\xdf\x15\xbc\x4c\xbb\xed\xdf\x17\xbe\x58\xf0\xf1\x01\x1f\xc4\x83\x78\x70\x32\x7b\x47\x59\x63\xa0\x18\x01\x64\xf0\x0a\x82\x03\x21\x95\x01\x69\x82\x61\x0f\x90\x03\x7b\x16\x96\xf5\xc7\x9f\x68\x29\x1a\x6f\x74\x00\xed\xb5\x88\xff\x67\xef\x8f\x7e\x53\x7c\xfd\xdb\x97\x8f\xef\xf1\xe5\xcb\xd7\xb8\x4c\x5f\xff\xf6\xe5\xeb\x60\xe3\xed\xac\xe3\x7c\x18\x1d\x9e\x5f\xe9\x3c\x19\x54\x5e\x74\xbd\x35\x52\xe8\x42\xd1\x2b\x16\x1e\x76\x95\x66\xd1\xae\x3e\x1a\xac\x1e\xd4\xe1\xeb\xff\xfc\xf3\xe1\xb4\x7c\xe5\xe2\xf4\xf1\x7c\xd4\x3e\x41\x08\xd6\x90\x01\x11\x50\xf9\x64\x15\x27\x01\xc2\x73\x08\x26\x9b\x7f\x3d\xf1\xcf\x9f\xfb\xf7\x62\x79\xe3\xaf\x7f\xfb\x62\xb5\x43\x10\x24\xd5\x6f\x5f\xbe\xfc\xe3\x7f\xfe\x5a\x30\x97\x75\x09\x94\x89\x87\x4c\xed\x53\xbb\x5b\x1c\xda\x6d\x5d\xe8\x97\xf9\xda\xcd\xde\x1b\xe6\xda\xee\xd4\xb1\xb1\x3c\x3c\x17\xeb\x97\xe6\xeb\x1a\x9b\xb5\xc7\xcb\x67\x28\x44\x26\xda\x00\xc9\x58\x11\x3d\x25\xaf\x0d\x46\x92\xc2\x21\x65\x95\x22\xe4\x1f\x0e\x85\x94\x44\x41\x96\x58\x92\xc4\xa4\x9c\xb6\x22\x20\xbb\x98\x59\x49\x08\x21\x25\xe1\x55\xc2\xc4\x56\x72\xe0\xa8\x1c\x09\xc0\xa0\x9d\x09\x20\xad\x4f\x4e\xdf\x57\xcb\x60\x39\x36\x87\x6a\x73\x97\x8e\xd3\x5e\xfd\x75\x3a\x7e\x9c\x5f\xab\xbd\xc7\xd4\x0f\xfe\x11\x2b\xaf\x30\xba\xea\x97\xf1\x41\xde\x5a\x73\xa0\xd1\x67\x30\xd6\x73\x4a\x2a\x66\xcd\x36\x0a\x2f\xad\x53\x3a\x59\xe7\x65\x30\x5a\x4a\xe1\x53\x39\x18\xd4\x88\x4e\xe0\x2f\x80\xa5\x54\x2b\x29\xee\x9f\x26\x83\x4b\xab\x8b\xc3\xc6\x70\xfa\x14\xd6\xf2\xbd\x95\xeb\x87\x6e\xac\xde\x16\xa7\xc6\xec\x69\xb8\xa7\x51\xaf\xbe\x99\x1d\x34\x2c\x3f\x23\xf1\x21\xa1\xf8\xf8\x28\x6b\x92\x26\xe9\x41\x9b\xcc\x21\xf9\x28\x92\x62\x87\xf0\x83\x91\xe4\x40\x2c\xc8\x06\x0e\x29\x01\x58\x29\xe3\xc7\x97\x09\xe4\x20\x98\x84\x10\x3c\x06\xf4\x56\x59\x4e\xde\x0b\x96\xce\x26\x56\x3a\x78\x63\x8d\x95\x42\x92\xb9\xaf\x94\xe7\xae\x6b\xbd\xc2\x66\xb5\xb9\x54\xf4\x4b\x6b\x5c\x1c\xd6\x45\x21\xf3\x3a\xbd\x3f\xae\xce\x36\x3d\x6e\x3a\xcb\xea\x4b\xb3\x6d\xf7\x37\x7a\xa7\xcf\x58\xb4\x94\x99\x94\xd7\x0c\x56\x68\x17\x39\x09\x19\x64\x14\x42\xd9\x2c\xb3\x17\xb1\x1c\x8b\x12\xe6\x57\x60\x52\x2a\x13\x3f\x28\xc6\x9d\x8e\xde\x46\x9b\xde\xdc\x5b\xe5\xe2\x97\xbb\xf6\xa8\x9a\x93\x5c\x2d\x06\xc7\x8a\xda\xb9\x73\x6c\x64\x98\xf3\x14\x4c\xff\x33\x0f\xf6\xc9\x27\x02\x34\xe4\x08\x49\x24\x2d\xb2\x02\x43\x20\x30\x02\x01\xc8\x1f\xc5\xe3\x83\x88\x0e\x90\x8d\xf1\xa4\x9d\x62\x4d\x68\xb5\x23\xf3\x87\xe1\x87\x48\x46\x28\xc5\x52\xa2\x92\x92\x0d\xe5\xe4\x40\x25\xab\x02\x47\x19\x43\x4e\x96\x28\x49\xbc\xaf\x91\x5e\x3f\x82\x5d\xd6\x73\xf4\x8b\xda\x5b\xef\x29\x1d\xb6\xb3\xce\xe9\xba\x5d\x15\xfb\x49\xb3\x39\x34\xcb\x22\xae\x96\x37\xfd\xd6\xd7\xc3\x53\x89\x9b\xc8\xa0\x63\x4e\xe0\xa4\x27\x27\xad\xd1\x99\x38\x28\xd0\x6c\xb4\xf5\xc2\x79\x55\xce\x44\x1b\x6d\x09\x34\x6a\xf7\x2b\xa0\x29\x77\x94\x46\x63\xc2\xf2\x35\xde\xa8\xdb\x6d\x45\xf7\x3c\x43\xbf\x9b\x1a\x7c\x33\x71\x7d\x89\xf5\xe1\xea\x04\xfd\xf5\x7b\x1a\x54\xba\xb9\xd6\x2b\x59\x3a\xde\x91\x91\x84\x1a\xac\x01\x0d\x39\x31\xa2\x48\x8a\x22\x08\x32\x24\xec\x0f\xc7\xa2\x1e\xa4\x50\x2c\x8d\x31\x1e\x98\x3c\x01\x87\x2c\x59\x27\x87\xd6\xa6\x8f\x21\xcd\xce\x45\x21\x25\x7b\xe7\x32\x69\x97\x28\xa8\x68\x05\x66\x84\xac\x32\x6a\x0f\xf7\x15\x33\xa9\xba\xeb\x78\xba\xba\x55\x07\xcd\xf3\x63\x8f\xdf\xdb\xdd\xe3\xb1\x2d\xc3\xfb\xda\xe2\x65\xd1\xdf\x20\x3f\xab\xce\x85\xf6\xaf\x6f\x7e\xbb\x2f\x51\x8c\xd7\xa4\x18\x02\x58\xca\x41\x22\x7f\x58\x0b\x58\x4b\xc1\x72\x64\x94\xae\x1c\x8d\x43\x90\x64\xc0\x81\x76\xbf\x00\x9a\x72\xc5\x00\x99\xf6\xe9\x1d\xd6\xca\xcd\xdb\x58\x7f\x35\xbd\xc7\xfa\xba\x70\x76\xb0\xc6\xa6\x69\x4e\x73\x73\xfd\x76\xb8\xbc\x6f\x2e\xd8\xaa\xbc\x7e\xc6\x82\x82\xb5\x73\x29\xab\x2c\x85\x94\x64\x75\x54\x49\xc8\x08\x01\x22\x31\x23\xff\xf7\x58\xfe\xc5\xe2\xaf\x34\x9b\xfc\x64\x4e\xbb\x6d\x7d\xcc\xfb\x8e\x6b\x98\xf5\x63\x23\xb5\x75\x3e\x82\xca\xb7\xe1\x6c\x37\xec\x67\x3d\x6f\x76\x17\x53\x3d\xec\xcc\x65\x89\xd9\x04\x47\x84\x3a\xd8\x04\x9e\xc0\x2b\x91\x8d\x0e\x3a\xd9\x9c\x95\x37\x9c\xc4\x9d\xa0\xfb\x67\x56\xd5\x4f\x64\x54\xaa\xa1\xe7\xda\xf8\xb9\x3d\xe8\x9f\xf1\xed\xf5\x54\x55\xc7\xee\x0b\xb4\xda\x35\xda\x3e\x5e\x31\xca\x7c\x7b\x1e\xf6\x53\x6d\xb2\xac\x1f\x9f\xcc\xc1\xfa\xb2\xa5\x15\x85\x05\x34\x59\x0b\x23\x15\x65\x30\xd1\x4a\x34\x92\x44\x94\x1c\x01\x7f\x1e\x9f\x1f\x69\x3f\x3d\xef\x07\xf3\xbc\x51\xbd\x0b\xf7\x54\x2b\x43\x68\xeb\x73\xda\x0e\xaa\x6a\xe0\xcd\x66\xd7\x8d\x93\x5d\xfb\xb9\x3d\x72\xbb\x59\xc7\xbd\x95\x64\x3d\x97\x4c\x26\xc7\x2a\x38\x23\xbd\x4b\xe0\xa5\x47\x76\x29\x4a\x69\x6d\x44\xff\xf3\xd6\xd9\x8f\xf2\xa1\xf9\x3b\xbf\xd2\x22\x74\xe1\x4a\xa9\x79\x9e\x9c\x2b\x23\x87\xbb\xdb\x62\xd9\xa8\xf3\xcd\x4c\xd6\xfd\xf1\xeb\xdb\xe8\xb1\x36\x7d\x7e\x6a\x55\x4b\xf8\x20\xe3\x47\xf6\x52\xd1\x3a\xfe\x58\x69\x46\x24\x91\x58\x6a\xab\x85\xf5\x10\xee\x68\xe8\x1e\x9f\xfd\x71\xb7\xcb\x0f\xbb\xfc\x50\xec\x7d\xe4\xd3\x72\xc3\x0f\xd9\xff\xfe\x7b\xf0\x71\xfd\x9f\x33\xa0\x90\x20\x52\x90\x59\x93\x09\xda\x26\x22\xab\xac\x52\x0a\x99\xb5\x25\x49\x26\x48\x2d\x89\x92\xb2\xa4\x51\x58\x23\x53\xb4\x8a\x72\x10\x82\x48\x90\x0b\xe2\xbe\x84\xa6\xd7\x55\x63\xf8\xbe\xd8\xbc\x0f\xfc\x4b\xfd\x54\x5b\xc0\x76\xad\x7c\x88\xd0\x59\x34\xd6\xb7\xc5\x76\x38\x37\xc7\xd8\x3a\xd4\x6a\xfb\xe5\x7a\xf8\x19\x11\x38\x29\x02\x65\x54\x21\x47\x44\x23\x6c\x00\x8f\x5a\x05\x67\x65\x64\x95\xef\x4c\xb0\x4f\x39\xf0\xaf\x65\x53\x2a\x9d\x38\xb2\xed\x97\x02\xe7\x7a\x9c\x4e\xeb\x7a\x75\xdf\xaa\xa4\xc9\xf3\x2a\xf5\x1e\x0f\xb1\x03\x79\x36\x68\x9c\x06\x37\x47\x9b\xfd\xf6\xac\xe6\x9f\xb9\x88\x8f\xc4\x8e\x1f\x1f\xa1\x5d\xa0\x64\xd9\x4a\xcb\x91\x20\x60\x0c\x40\xea\xce\xce\xf2\x3b\x73\x89\x39\x98\x2c\x01\x43\x08\x20\x63\x56\x1c\x73\x4c\x46\xf9\x18\x23\x5b\x8b\x41\x81\x24\xf2\xc1\xe4\x60\x29\x06\xc0\xac\x0c\xea\x8f\xcd\x27\xe7\x8f\x25\xf6\x8d\xd4\xb3\x1c\x5e\x41\x9e\xaf\x79\x33\xa9\xe3\x54\xb7\xa8\x98\x55\x8a\xca\x7c\xd7\x45\x7c\x1a\x1a\xde\xc9\xea\xfb\xe5\x12\x1b\x3d\x1e\x77\x4a\x34\x23\x3d\x24\xe3\x29\xa2\xb7\x42\x79\x43\xc0\x89\x94\xb7\x46\x3b\xe7\xb3\xd6\x7f\xaa\x8e\xf8\x6b\x01\x95\x0a\x27\xd7\x38\xa5\x55\x63\x3f\x3b\xf9\xcb\x2d\xd7\x6f\x2f\xfb\x76\xbe\x8d\xfc\xaa\xd9\x7b\xcb\x1d\x33\x5c\x35\xe6\xb3\xca\xa5\x42\xe3\xd1\x76\x3c\xfd\x0c\xc7\x24\xcf\x04\x36\xb1\xc9\x42\xca\x8f\x00\x94\xad\x57\x19\x5d\x92\xc9\xfb\x70\xc7\x93\x7f\x00\x1c\xcd\x5e\x58\xa3\x30\x52\x92\xf2\x8f\xaa\x48\x5b\x45\x31\xb1\x56\x39\x69\xe1\x7d\x48\x56\x64\x48\x2a\x92\x76\x16\xa2\x4c\xda\x59\x11\xa2\xd7\x8c\xec\x89\xef\xab\x27\x8e\xc6\x87\xc7\xd8\x98\x76\x9a\xcd\xe9\xf3\x4d\x6e\x57\x8b\xc9\x0b\x54\x5d\x5e\x3f\x9d\xaa\xe7\x4d\xd1\x99\xbc\x5d\xcd\x76\xbd\x50\x6a\x7c\x2b\x09\x3e\xa8\x22\xa2\x70\x2e\x30\x39\x0c\xc1\x5a\xe1\x85\x65\x2d\x72\x76\x51\x19\xa9\x7f\xc6\xca\xfa\xaf\xd9\x94\x0a\x67\x34\xae\xcd\x1b\x6a\xb9\x6f\x56\x74\x76\x9b\xf3\x74\xe7\xd6\xad\xa8\x26\xc3\xd1\xd5\xf5\x6f\x2f\xd7\xe6\xe4\x70\x86\xf3\xfb\xda\xb7\xec\xd3\xe4\x33\x97\x9c\x13\x10\x20\x26\x27\x4d\x52\x40\x92\x3c\xdb\x90\x54\x22\xc3\x3e\x86\x9f\xe2\xc4\x56\x44\xd0\x0e\x13\x7b\xb2\xa4\x39\x09\x42\x62\x10\x04\x26\x29\x14\xca\x70\xf6\x94\xa4\x75\xc9\xa2\x0d\xc0\xec\x65\x60\xa5\x82\x62\xb0\x3a\x6b\x2d\xbf\xe1\x38\x34\xaa\xde\xda\xbd\x63\x5c\x0d\x1b\x8f\xcb\x46\x34\xcd\x58\xd9\x1f\x52\x65\xdf\x73\x37\x9a\x43\x77\x3f\x39\x3a\xb7\x69\xab\x75\xa5\x5d\xd2\x56\x80\x10\x12\x24\xc7\x0c\x5a\x1b\xfe\x98\x06\x46\x43\x24\x2d\x1c\x38\x9f\xf1\xce\xce\xbc\xac\xd4\xfa\x6b\xf1\x94\xca\x26\x6c\x26\x5d\xaf\xc7\x21\xcc\xf4\xdc\xae\x1b\x8b\xfa\xb5\x70\xb3\xd7\x9a\x79\xe2\xd9\x58\xe2\xf3\xf2\xe2\xa7\x9b\xf9\xe3\xba\xea\x2a\xbd\x66\x09\x1a\xe2\x8f\x45\x94\xad\xcb\xc9\x1b\x05\x60\x34\x6b\x2b\xac\xe6\xe4\x13\xe6\x3b\xc5\xd6\xf7\x47\xa3\xc8\x18\xb0\x29\x58\xa5\xc1\x2b\x46\x1d\x35\x5b\x95\x93\x8b\x2a\x08\x8d\x96\xbc\x44\x2d\x93\xb1\x9c\x04\x46\x93\xb5\x4d\x21\x93\x47\xa1\xa5\xb3\xfe\x1b\xb3\x2a\xf5\xea\x1d\x35\x3c\x1d\x3a\x56\x35\x07\xbd\xf3\x0a\xcf\x37\xb7\x99\xae\xec\x8b\x36\xbd\xe9\x36\xf8\xb6\x7c\xef\xbe\x2f\xe4\x6e\x7e\xaa\x5e\x4b\xce\x13\x0c\x19\xa2\x10\xc0\x79\x01\x4e\x21\x1a\x24\x97\xc9\xa1\x36\x42\x67\x7b\xa7\xbc\xf8\xf5\xf0\x94\x9f\x2a\x2c\xa7\xcf\xb5\xc1\xe4\xf5\xe8\x9e\xa5\xde\xbf\x34\x8e\xe8\xe3\x6c\x3f\xea\x9a\xeb\x65\x3c\x9f\xa4\x78\x69\x6e\xae\xef\xe7\x56\x78\x5a\x14\xb1\xa4\xd7\x31\xc9\x64\x66\x1f\x13\xf9\x90\xff\x70\x1e\xe2\x2c\x43\x30\x09\x73\x12\xe2\x27\xa1\x81\x04\x9a\x02\xc6\xec\x44\x96\x41\x80\x20\x66\x0e\xcc\x00\x5a\xb0\x22\x70\xa8\xad\x55\x6c\x82\xa3\xe8\x83\x23\x34\x1c\x85\x42\xeb\x9c\x8e\x16\xf0\x1b\x9e\x33\x7d\xad\x15\xed\xc6\x70\xfe\xd4\x39\x9f\x27\x8b\xb1\xf6\xdd\xe7\xb7\xa7\x69\xb3\x57\xa1\xe3\x23\x0f\xdd\x63\xed\x58\x40\xac\x30\x1e\x97\xd5\x71\xd9\x9c\x02\x6d\xc9\x18\xa1\x0d\x65\xc6\x6c\xbd\x90\x8e\xc1\x12\x12\xe9\x00\xf4\xd3\x06\xf9\x7f\x0d\xa8\x3c\xe5\x54\xb4\xcc\xa1\x36\xdb\xad\x46\x9b\xc5\xa8\x79\xb9\xe4\xeb\xe6\xea\x9f\x6b\xfb\xee\x6e\xde\x27\x7b\xab\x0f\xa8\xe8\x5c\xaa\xcd\x56\xcf\x97\x74\x82\x21\xa9\x98\x9c\xca\xce\x46\xe9\x03\x9a\x2c\x29\x7a\x05\x4c\x10\x20\x82\xbe\x53\x1f\x7f\x67\x38\x7f\xe0\xd1\x00\x89\x93\xb3\x2e\xba\x6c\x95\xc9\xd2\x49\x04\x27\x42\xce\x6c\x58\x78\x19\xad\x4c\xd6\x83\x88\xc6\x7e\x80\x4b\x9e\xd1\x2b\xb0\xd6\x82\xd6\x9c\xbe\x75\x8e\x39\xd9\xe4\xd8\x3e\xb9\xfd\xee\xb6\xc5\x6d\x3a\xc8\xf6\xb4\x7a\xeb\x0c\x57\xc3\x76\x6a\x75\xc7\xfd\x64\xf2\xce\xe3\xf2\xcd\x16\xab\xea\xcb\x67\x40\x2a\x66\x43\x1c\x94\xcb\x32\x33\x93\x89\xf8\xf1\x2a\xbc\x26\x91\x52\x30\xf1\x4f\xd6\x17\x7f\x2d\xa2\x52\xfd\x0c\x69\x49\x4f\x1d\x7d\x59\x2c\x2a\x87\x71\xb5\xb9\x92\xa1\xdf\xaf\x41\xe7\xb2\xde\x9f\xae\xc7\x16\x0d\x2f\xd7\xf6\xb5\xd3\x93\x97\x4b\x51\xad\x97\x6c\xaf\x32\x72\xb4\x46\x19\xb4\xd6\x61\xf6\xda\x38\x8c\xc2\x39\xa6\xcc\x09\x55\xf8\x89\x78\xac\x25\xb6\x28\xb3\x50\x2a\x04\xc3\x86\xa3\x63\x90\xc4\xd6\xe9\x90\x05\x0b\xe5\x7c\x72\x89\x8d\x62\xeb\xa2\x44\x90\xc6\xab\xe8\x48\x05\x19\x10\x13\x7c\x23\x27\xa7\x53\xbc\xed\x61\x6f\xde\x8e\xe1\x71\x97\x37\xad\xd4\x5c\x2c\x97\xd7\x2d\x2d\x8f\x95\xd8\x03\xd8\x4c\xa9\x52\x6f\xbd\x54\xfd\xf8\x24\x4b\x0e\xf2\x12\x9a\x0c\xe4\xa5\xcb\x6c\x04\x13\x2b\xeb\xb5\x63\x25\x05\x84\x20\x83\xbf\x63\xcf\xbf\x26\xa2\x52\x05\xbd\xd4\x2e\xd7\xa7\xf8\xd4\x27\xb8\x3c\x56\xd6\xd8\xbb\x16\x34\x94\x79\x76\x3a\xec\x57\x83\x63\x65\xb1\xc8\xf3\xfe\xae\xb6\x94\xdb\xf5\xe3\xae\x51\x12\x97\xa3\x50\x64\xb4\x03\x4c\x49\x4a\x62\x47\x0c\xf9\xc3\x8a\x94\x60\x44\x79\xc7\x9e\x7f\x00\x1e\xf5\xa0\x9c\x02\x36\x42\xb8\xe0\x20\x13\x45\xce\x44\x22\x0a\x6f\x20\x59\xa3\x5c\x0c\xe0\x83\xf0\xc2\x27\x8b\x39\x4a\xe1\xa4\x35\x10\xb2\x4a\x0a\x83\xa0\xc4\xf9\xbe\x82\xb8\xd2\x33\x97\x73\xa5\xb7\x98\x17\x0d\xbc\xf6\x55\xe7\x6a\x57\xaa\xe3\xde\xbb\xa3\xb4\x7b\xed\xdc\xf6\xf1\x72\xa8\xb5\xc7\x8b\x61\xf3\x49\x96\x6c\x45\x35\x4a\x11\x00\x50\xf8\xf8\x31\x28\x28\x28\xe5\x19\x44\x96\x99\x4c\xa4\x70\x27\x1a\x7e\xf7\xfa\xeb\xbb\x20\x2a\x55\xd0\x6c\x8a\xc7\xc3\x4b\xe7\x5a\xc8\xdd\xa0\x47\xab\x6b\x6f\xb6\xd9\x8e\xe5\x73\x7a\xed\xbc\xd5\x62\x11\x2f\x64\xa6\x95\xe1\x71\xd1\xca\x72\x0c\x25\x97\x07\x28\xa9\x90\x25\x5a\xf0\x29\x5a\xf2\x26\x0b\xcc\x31\x2b\x9f\xbd\x27\xe9\xee\x78\xd0\x0f\xc1\x13\x9c\x12\x84\x4e\x51\x12\x40\xc6\x31\x09\x85\x52\x01\x83\x50\x64\x39\x11\xb9\xcc\x9a\x93\xb2\x41\x64\xca\x88\x1c\x9c\xfc\xc0\x15\x8c\x46\xeb\xf5\x37\xa6\xd8\x74\x7d\x9c\x47\x39\xea\xc4\xfd\x6b\x3c\xa7\x27\xdb\x56\xb6\xd5\x22\x3d\xb8\x0c\xe9\xd4\x2b\xa6\x8b\xe9\xf8\xb9\xb5\xb1\x93\xf7\xcd\xbc\x72\x2b\x99\x62\x12\x84\x27\xe9\x93\x0d\x9e\x95\x62\xef\x64\x56\xec\xc1\x39\xa7\x85\x56\x77\xf6\x5d\xbf\x26\xa2\xf2\xbd\x57\x1e\xac\xfa\x8f\x50\xdf\xdf\x56\x8b\x59\x73\x73\x99\x55\x8a\xf7\x9e\xda\x54\x5e\x4c\x3f\x3e\x2f\x8a\xac\xcf\xab\xf3\x62\x42\xb5\xd1\xb9\xba\xf9\x8c\xc7\x25\x0d\x48\xd2\x60\x0e\xce\x38\x97\x04\x30\x4b\x56\x26\x39\x45\x1f\xd9\xfe\xcf\xe1\x29\x4e\x3e\xae\x39\xfd\x7f\x4c\x47\xde\xff\xbe\x8c\xfe\xb4\xfc\x4f\xfd\xfb\x47\x4a\x2c\x16\x5e\x59\xf7\xaf\xff\x09\xad\x92\x96\x1a\x93\x52\x56\x38\x8e\x42\xa0\xe2\x04\x2a\xa8\x14\x83\x97\x98\xb2\x44\x03\x40\xc2\xb0\xb6\xc1\x67\x66\x54\x41\x03\xe9\x20\x1c\x6a\xf5\x0d\x4b\x9a\x45\xee\xbe\x6e\x67\xcf\x9d\xdd\xbe\x7b\xee\x9a\xca\xae\xd9\xbd\x34\xeb\xfe\x0c\xa7\x1e\xdb\xc9\x13\xea\x79\x63\xd5\xb2\x53\xaa\x4a\x58\x94\xb4\x63\xda\xe4\x20\xb5\x46\x8e\xd9\x67\x91\x2d\x29\xeb\xb2\x16\x29\xb1\x21\x87\x77\xaa\xc3\x4f\x25\xc7\x2f\x85\xaa\xfc\x76\xc6\xc6\x2f\xf6\x8d\x5a\x71\xea\x4e\x0e\xad\xa5\x3a\x34\x4f\xd3\xdd\xe3\x76\x78\x2c\xe6\x8b\x65\x42\x77\x28\xf2\x65\xf7\x5e\x1b\x3f\xb5\x0f\xad\x63\xc9\xec\x8f\xd2\x27\x26\x52\xe4\x13\x4b\x10\xa8\x34\x66\x69\xad\x36\x5a\x18\xe3\xff\xb7\xb7\x55\xbe\x27\x26\x17\x7c\xc8\xc6\x45\xd6\xc6\x78\x36\x64\x93\xb5\xc8\x00\x20\xbc\x45\x1b\x94\x46\x95\xac\xc9\x4a\x59\x9f\x91\x93\xd0\x04\x01\x03\x43\xd4\x39\x26\x03\xea\x1b\x17\x7b\xaa\xfb\xf1\x09\x3a\xb3\x5e\x65\x76\x94\xed\xf9\x78\x31\xb5\xd3\xeb\x1c\xde\x8a\x41\xa3\x93\x64\xbf\x75\x6c\x3e\x4f\xc3\x71\x22\xeb\x2f\xab\x5a\xc9\x1a\x8c\x00\x96\x80\x03\x49\x1f\x48\xbb\x28\x23\x67\x13\xb3\x24\x0e\x5e\x86\x3b\x75\x62\xf9\x4e\xe4\x97\xe2\x55\x3e\xf1\x96\xbb\xed\xfa\xd0\x52\x55\x37\x9e\x2f\x2f\xb7\xea\x68\xc0\xa3\xf7\xea\x75\xb7\xf2\xcb\x4a\x23\xdc\x16\xab\xd3\xdb\xf3\xf0\x98\xdf\x12\x6e\x5b\x25\xa9\xdb\x59\x09\x94\xbc\xa4\x1c\xd8\x4a\x6b\x05\x28\x07\x0e\x20\x0b\x85\x4a\xdf\x39\x97\xff\xf1\xac\x38\x26\x87\xda\x19\xb4\x52\xf9\x20\xc1\xd9\xec\xbd\xf2\x36\x4b\x13\x7c\x30\x98\x1d\x38\x76\x5a\x1b\x07\x59\x78\x8f\xde\x27\x13\xac\x4d\x31\x08\x67\x55\x08\xf7\xb5\xd5\x9f\x57\xfa\xfd\xf3\xe0\x74\x1e\xdc\xe0\xe5\xa6\xbb\xad\x6e\xa5\x5b\x3f\x15\xcf\x6f\x87\xae\xdc\x51\x4b\xc6\xa2\xdf\xe1\x65\x77\x32\x78\x7b\x29\xe3\x45\xec\xa4\x62\xc3\x1c\xc0\x0b\x0e\x64\x1d\x90\x47\x34\xc2\x64\x72\xf7\x2e\x8d\x95\x35\x24\xbf\x14\xad\x3b\xa7\xf5\xe7\xe5\xbe\xf1\x7e\x99\xce\x64\x73\xb7\x4a\xdd\xe3\xea\x49\xb6\xb7\xdd\x5d\x98\x9f\xc6\xe6\x36\xac\xbd\x14\xb2\xd6\xbc\xae\x96\xb7\x82\x4a\xae\xd7\x05\x87\x10\x38\x90\x4f\x21\x51\xf2\x81\x95\xb3\x1e\x58\x3b\x25\x50\x6a\xbe\x73\x9b\xe1\xfb\x92\xc2\x4f\xa4\x50\x79\x6d\x21\xa9\xac\xa2\x47\x99\xa2\x93\x21\x18\x9b\x8d\x07\xa7\x50\x80\xe7\xc4\x2c\x83\xf0\x56\xe7\xe4\xa2\x61\x80\x60\x9c\x17\x32\x64\xce\x80\xea\x1b\x87\xae\xbc\x7d\xdd\x77\x1d\x9a\x79\x67\x90\x9b\x08\xd6\x8c\x77\xbb\x6d\x71\x7b\xad\xbf\xaa\x30\xe0\x4a\x73\xe2\xb7\xf6\x3c\x1f\xb7\x26\x83\x5b\xbb\xc4\xb3\xbc\x46\x14\xa0\xbc\x95\x18\xb3\x71\x1c\x92\x73\x32\xdb\x18\x8d\x23\x21\xee\x9c\x11\xdd\xdb\xbb\xfc\x52\xc4\xca\xbb\x26\xd2\xf5\xee\xb1\xf2\x38\xaf\x3c\xb9\xda\xfb\x72\x94\xeb\x78\xbd\x1a\x9b\xd7\xdd\x3c\xd4\xe7\xdb\x53\xbd\x5f\xbb\xbc\xd4\xe4\x56\xad\x6f\xa1\x64\x15\x46\x08\xc6\xfb\x28\xa3\x11\x39\x05\xe0\x80\x2a\x44\x6d\x6d\x30\xd2\xa7\x74\x27\x33\xfc\x08\x5a\xea\xdf\x68\x91\xcb\x32\x18\x2f\x4c\xb4\xd1\x4a\x36\x60\x29\x84\xac\x94\x09\x21\x2a\xce\xd6\x1b\x15\x41\x0a\x91\xe5\x47\xae\x70\x1a\xa4\xd2\x59\x3a\x8f\xc6\xa6\x94\xc3\x37\x66\xe2\x08\xde\xd9\x0d\x97\xaa\x9b\x1b\xb7\xda\x3a\x4e\xda\xd0\x18\xb8\xdb\xf5\xf1\xe9\xdc\x76\x6d\x57\xc5\xb5\xed\xf7\xe0\xed\x36\x1a\x52\x51\x72\x78\x2d\x51\xc8\x8c\xde\x7d\xbc\x2a\x11\x22\x07\x21\x62\x54\xa0\xa5\x09\xc1\x46\xbe\x33\x13\xbf\x7f\x2e\xfd\x01\xc4\x4a\xf5\xc5\x8b\xd1\xa6\xe6\xaa\x8b\xe3\xeb\xf0\xc5\xaf\xfb\x8f\x27\xaf\xf8\x6d\xd7\xa2\xed\xae\xe8\xdd\xd2\xaa\x76\x18\x0c\xe7\x45\xaf\xd1\x9b\xac\x3b\x25\x5d\xa6\x47\x42\x34\xca\xaa\x28\x4c\x54\x84\x49\x04\x1d\x51\x86\x9c\x10\x8d\x74\x77\xbc\xeb\xdf\x68\xfd\xf6\x8f\xdf\xfe\x5f\x00\x00\x00\xff\xff\xa8\x11\xeb\x38\x91\x31\x00\x00") +var _fixtures_assetsProofParamsParametersJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x9a\x59\x6f\x22\x59\xd2\xfe\xef\xfb\x53\x94\xea\x7a\xfc\xd7\xd9\x23\xa2\xef\x00\xb3\x08\x03\x32\x98\xcd\xbe\x19\x9d\x25\x8e\x59\x9a\x35\x01\x03\x7f\xcd\x77\x7f\x45\x8f\x46\xaf\x34\x4e\x6a\xde\xd6\x54\x75\xd7\x9d\x65\x29\x95\xc9\x2f\x9f\xf3\x44\x3c\x11\xf9\xff\x7f\xf9\xf2\xe5\xeb\x49\xe1\x03\xaf\xb6\x87\xcb\x43\xc1\xf1\xb0\xd9\x3f\x1c\xb7\xc9\x1f\xf8\x61\xc5\xfb\xe5\x6f\x7c\xd8\x33\x3f\x6c\x37\x05\xcf\xd3\x66\xfd\xf7\x99\x2f\x66\xbc\x7f\xc0\x07\xf1\x20\x1e\x9c\xcc\xde\x51\xd6\x18\x28\x46\x00\x19\xbc\x82\xe0\x40\x48\x65\x40\x9a\x60\xd8\x03\xe4\xc0\x9e\x85\x65\x7d\xfb\x13\x2d\x45\xe3\x8d\x0e\xa0\xbd\x16\xf1\xff\x6d\xfd\xde\xaf\x8a\xaf\xbf\x7e\xb9\x3d\xc7\x97\x2f\x5f\xe3\x3c\x7d\xfd\xf5\xcb\xd7\xfe\xca\xdb\x49\xc7\xf9\xf0\xb2\x7b\x7d\xa7\xe3\xa8\x5f\x79\xd3\xf5\xd6\x8b\x42\x17\x8a\x5e\x31\xf3\xb0\xa9\x34\x8b\x76\xf5\xd1\x60\x75\xa7\x76\x5f\xff\xf6\xcf\x8b\xd3\xfc\x9d\x8b\xc3\xed\xfa\xa8\x7d\x82\x10\xac\x21\x03\x22\xa0\xf2\xc9\x2a\x4e\x02\x84\xe7\x10\x4c\x36\xff\xba\xe2\x9f\x3f\xf7\xef\xc5\xfc\xca\x5f\x7f\xfd\x62\xb5\x43\x10\x24\xd5\x2f\x5f\xbe\xfc\xe3\x6f\x7f\x2d\x98\xd3\xb2\x04\xca\xc8\x43\xa6\xf6\xa1\xdd\x2d\x76\xed\xb6\x2e\xf4\xdb\x74\xe9\x26\x97\x86\x39\xb7\x3b\x75\x6c\xcc\x77\xaf\xc5\xf2\xad\xf9\xbe\xc4\x66\xed\xf1\xf4\x19\x0a\x91\x89\x36\x40\x32\x56\x44\x4f\xc9\x6b\x83\x91\xa4\x70\x48\x59\xa5\x08\xf9\x87\x43\x21\x25\x51\x90\x25\x96\x24\x31\x29\xa7\xad\x08\xc8\x2e\x66\x56\x12\x42\x48\x49\x78\x95\x30\xb1\x95\x1c\x38\x2a\x47\x02\x30\x68\x67\x02\x48\xeb\x93\xd3\xf7\xd5\xd2\x9f\x0f\xcd\xae\xda\xdc\xa4\xfd\xb8\x57\x7f\x1f\x0f\x1f\xa7\xe7\x6a\xef\x31\x3d\x07\xff\x88\x95\x77\x78\x39\xeb\xb7\xe1\x4e\x5e\x5b\x53\xa0\x97\xcf\x60\xac\xe7\x94\x54\xcc\x9a\x6d\x14\x5e\x5a\xa7\x74\xb2\xce\xcb\x60\xb4\x94\xc2\xa7\x72\x30\xa8\x11\x9d\xc0\x9f\x00\x4b\xa9\x56\x52\xdc\x3e\x8d\xfa\xa7\x56\x17\x07\x8d\xc1\xf8\x29\x2c\xe5\xa5\x95\xeb\xbb\x6e\xac\x5e\x67\x87\xc6\xe4\x69\xb0\xa5\x97\x5e\x7d\x35\xd9\x69\x98\x7f\x46\xe2\x43\x42\x71\xbb\x95\x35\x49\x93\xf4\xa0\x4d\xe6\x90\x7c\x14\x49\xb1\x43\xf8\xc1\x48\x72\x20\x16\x64\x03\x87\x94\x00\xac\x94\xf1\xf6\x30\x81\x1c\x04\x93\x10\x82\xc7\x80\xde\x2a\xcb\xc9\x7b\xc1\xd2\xd9\xc4\x4a\x07\x6f\xac\xb1\x52\x48\x32\xf7\x95\xf2\xda\x75\xad\x77\x58\x2d\x56\xa7\x8a\x7e\x6b\x0d\x8b\xdd\xb2\x28\x64\x5e\xa6\xcb\xe3\xe2\x68\xd3\xe3\xaa\x33\xaf\xbe\x35\xdb\x76\x7b\xa5\x0b\x7d\xc6\xa2\xa5\xcc\xa4\xbc\x66\xb0\x42\xbb\xc8\x49\xc8\x20\xa3\x10\xca\x66\x99\xbd\x88\xe5\x58\x94\x30\x3f\x03\x93\x52\x99\xf8\x7e\x31\xec\x74\xf4\x3a\xda\xf4\xe1\x3e\x2a\x27\x3f\xdf\xb4\x5f\xaa\x39\xc9\xc5\xac\xbf\xaf\xa8\x8d\x3b\xc6\x46\x86\x29\x8f\xc1\x3c\x7f\xe6\xc1\x3e\xf9\x44\x80\x86\x1c\x21\x89\xa4\x45\x56\x60\x08\x04\x46\x20\x00\xf9\xa3\x78\xdc\x88\xe8\x00\xd9\x18\x4f\xda\x29\xd6\x84\x56\x3b\x32\xbf\x1b\x7e\x88\x64\x84\x52\x2c\x25\x2a\x29\xd9\x50\x4e\x0e\x54\xb2\x2a\x70\x94\x31\xe4\x64\x89\x92\xc4\xfb\x1a\xe9\x3d\x47\xb0\xf3\x7a\x8e\x7e\x56\xfb\xe8\x3d\xa5\xdd\x7a\xd2\x39\x9c\xd7\x8b\x62\x3b\x6a\x36\x07\x66\x5e\xc4\xc5\xfc\xaa\x3f\x9e\xf5\xe0\x50\xe2\x26\x32\xe8\x98\x13\x38\xe9\xc9\x49\x6b\x74\x26\x0e\x0a\x34\x1b\x6d\xbd\x70\x5e\x95\x33\xd1\x46\x5b\x02\x8d\xda\xfd\x0c\x68\xca\x1d\xa5\xd1\x18\xb1\x7c\x8f\x57\xea\x76\x5b\xd1\xbd\x4e\xd0\x6f\xc6\x06\x3f\x4c\x5c\x9e\x62\x7d\xb0\x38\xc0\xf3\xf2\x92\xfa\x95\x6e\xae\xf5\x4a\x8e\x8e\x77\x64\x24\xa1\x06\x6b\x40\x43\x4e\x8c\x28\x92\xa2\x08\x82\x0c\x09\xfb\xc3\xb1\xa8\x07\x29\x14\x4b\x63\x8c\x07\x26\x4f\xc0\x21\x4b\xd6\xc9\xa1\xb5\xe9\x56\xa4\xd9\xb9\x28\xa4\x64\xef\x5c\x26\xed\x12\x05\x15\xad\xc0\x8c\x90\x55\x46\xed\xe1\xbe\x62\x46\x55\x77\x1e\x8e\x17\xd7\x6a\xbf\x79\x7c\xec\xf1\xa5\xdd\xdd\xef\xdb\x32\x5c\x96\x16\x4f\xb3\xe7\x15\xf2\xab\xea\x9c\x68\xfb\xfe\xe1\xd7\xdb\x12\xc5\x78\x4d\x8a\x21\x80\xa5\x1c\x24\xf2\xcd\x5a\xc0\x5a\x0a\x96\x23\xa3\x74\xe5\x68\x1c\x82\x24\x03\x0e\xb4\xfb\x09\xd0\x94\x2b\x06\xc8\xb4\x0f\x17\x58\x2a\x37\x6d\x63\xfd\xdd\xf4\x1e\xeb\xcb\xc2\xd9\xfe\x12\x9b\xa6\x39\xce\xcd\xe5\xc7\xee\x74\x59\x9d\xb0\x55\x79\xff\x8c\x05\x05\x6b\xe7\x52\x56\x59\x0a\x29\xc9\xea\xa8\x92\x90\x11\x02\x44\x62\x46\xfe\x63\x58\xb6\xfb\xcd\x26\x3f\x6c\xf2\x43\xb1\xf5\x91\x0f\xf3\x15\x3f\x64\xff\xdb\x6f\xc1\xc7\xe5\x7f\xf6\x5e\x21\x41\xa4\x20\xb3\x26\x13\xb4\x4d\x44\x56\x59\xa5\x14\x32\x6b\x4b\x92\x4c\x90\x5a\x12\x25\x65\x49\xa3\xb0\x46\xa6\x68\x15\xe5\x20\x04\x91\x20\x17\xc4\x7d\xe5\x8c\xcf\x8b\xc6\xe0\x32\x5b\x5d\xfa\xfe\xad\x7e\xa8\xcd\x60\xbd\x54\x3e\x44\xe8\xcc\x1a\xcb\xeb\x6c\x3d\x98\x9a\x7d\x6c\xed\x6a\xb5\xed\x7c\x39\xf8\x8c\x08\x9c\x14\x81\x32\xaa\x90\x23\xa2\x11\x36\x80\x47\xad\x82\xb3\x32\xb2\xca\x77\x94\xf3\xc9\x7f\xff\x5a\x36\xa5\xd2\x89\x2f\xb6\xfd\x56\xe0\x54\x0f\xd3\x61\x59\xaf\x6e\x5b\x95\x34\x7a\x5d\xa4\xde\xe3\x2e\x76\x20\x4f\xfa\x8d\x43\xff\xea\x68\xb5\x5d\x1f\xd5\xf4\x33\x17\x71\xab\x94\x78\xbb\x85\x76\x81\x92\x65\x2b\x2d\x47\x82\x80\x31\x00\xa9\x3b\x1d\xdd\x77\xe6\x12\x73\x30\x59\x02\x86\x10\x40\xc6\xac\x38\xe6\x98\x8c\xf2\x31\x46\xb6\x16\x83\x02\x49\xe4\x83\xc9\xc1\x52\x0c\x80\x59\x19\xd4\xb7\xa6\x8f\xf3\xed\x88\x7d\xc3\x6d\xe6\x83\x33\xc8\xe3\x39\xaf\x46\x75\x1c\xeb\x16\x15\x93\x4a\x51\x99\x6e\xba\x88\x4f\x03\xc3\x1b\x59\xbd\x9c\x4e\xb1\xd1\xe3\x61\xa7\x44\x33\xd2\x43\x32\x9e\x22\x7a\x2b\x94\x37\x04\x9c\x48\x79\x6b\xb4\x73\x3e\x6b\xfd\x87\x62\xc0\x5f\x0b\xa8\x54\x38\xb9\xc6\x29\x2d\x1a\xdb\xc9\xc1\x9f\xae\xb9\x7e\x7d\xdb\xb6\xf3\xf5\xc5\x2f\x9a\xbd\x8f\xdc\x31\x83\x45\x63\x3a\xa9\x9c\x2a\x34\x7c\x59\x0f\xc7\x9f\xe1\x98\xe4\x99\xc0\x26\x36\x59\x48\x79\x33\x9e\x6c\xbd\xca\xe8\x92\x4c\xde\x07\xff\xa7\xc1\xd1\xec\x85\x35\x0a\x23\x25\x29\x7f\x8f\x68\xda\x2a\x8a\x89\xb5\xca\x49\x0b\xef\x43\xb2\x22\x43\x52\x91\xb4\xb3\x10\x65\xd2\xce\x8a\x10\xbd\x66\x64\x4f\x7c\x5f\x3d\xf1\x65\xb8\x7b\x8c\x8d\x71\xa7\xd9\x1c\xbf\x5e\xe5\x7a\x31\x1b\xbd\x41\xd5\xe5\xe5\xd3\xa1\x7a\x5c\x15\x9d\xd1\xc7\xd9\xac\x97\x33\xa5\x86\xd7\x92\xee\x06\x55\x44\x14\xce\x05\x26\x87\x21\x58\x2b\xfc\x2d\xc2\x8a\x9c\x5d\x54\x46\xea\x3f\xe3\x64\xfd\xd7\x6c\x4a\x85\xf3\x32\xac\x4d\x1b\x6a\xbe\x6d\x56\x74\x76\xab\xe3\x78\xe3\x96\xad\xa8\x46\x83\x97\xb3\x7b\xbe\xbe\x9d\x9b\xa3\xdd\x11\x8e\x97\xa5\x6f\xd9\xa7\xd1\x67\x2e\x39\x27\x20\x40\x4c\x4e\x9a\xa4\x80\x24\x79\xb6\x21\xa9\x44\x86\x7d\x0c\x7f\x8a\x13\x5b\x11\x41\x3b\x4c\xec\xc9\x92\xe6\x24\x08\x89\x41\x10\x98\xa4\x50\x28\xc3\xd9\x53\x92\xd6\x25\x8b\x36\x00\xb3\x97\x81\x95\x0a\x8a\xc1\xea\xac\xb5\xfc\x86\xe3\xd0\x4b\xf5\xda\xee\xed\xe3\x62\xd0\x78\x9c\x37\xa2\x69\xc6\xca\x76\x97\x2a\xdb\x9e\xbb\xd2\x14\xba\xdb\xd1\xde\xb9\x55\x5b\x2d\x2b\xed\x92\x94\x00\x42\x48\x90\x1c\x33\x68\x6d\xf8\x56\x0d\x8c\x86\x48\x5a\x38\x70\x3e\xe3\x9d\x8e\xb8\x2c\x4c\xfe\xb5\x78\x4a\x65\x13\x56\xa3\xae\xd7\xc3\x10\x26\x7a\x6a\x97\x8d\x59\xfd\x5c\xb8\xc9\x7b\xcd\x3c\xf1\x64\x28\xf1\x75\x7e\xf2\xe3\xd5\xf4\x71\x59\x75\x95\x5e\xb3\x04\x0d\xf1\xed\x10\x65\xeb\x72\xf2\x46\x01\x18\xcd\xda\x0a\xab\x39\xf9\x84\xf9\x4e\xa0\xfc\xfe\x68\x14\x19\x03\x36\x05\xab\x34\x78\xc5\xa8\xa3\x66\xab\x72\x72\x51\x05\xa1\xd1\x92\x97\xa8\x65\x32\x96\x93\xc0\x68\xb2\xb6\x29\x64\xf2\x28\xb4\x74\xd6\x7f\xa3\x56\xa5\x5e\xbd\xa3\x06\x87\x5d\xc7\xaa\x66\xbf\x77\x5c\xe0\xf1\xea\x56\xe3\x85\x7d\xd3\xa6\x37\x5e\x07\xdf\x96\x97\xee\x65\x26\x37\xd3\x43\xf5\x5c\x32\xc7\x33\x64\x88\x42\x00\xe7\x05\x38\x85\x68\x90\x5c\x26\x87\xda\x08\x9d\xed\x9d\xd0\xf0\xf3\xe1\x29\x9f\xe6\xcd\xc7\xaf\xb5\xfe\xe8\x7d\xef\x5e\xa5\xde\xbe\x35\xf6\xe8\xe3\x64\xfb\xd2\x35\xe7\xd3\x70\x3a\x4a\xf1\xd4\x5c\x9d\x2f\xc7\x56\x78\x9a\x15\xb1\x24\x4f\x99\x64\x32\xb3\x8f\x89\x7c\xc8\xbf\x3b\x0f\x71\x96\x21\x98\x84\x39\x09\xf1\x27\xa1\x81\x04\x9a\x02\xc6\xec\x44\x96\x41\x80\x20\x66\x0e\xcc\x00\x5a\xb0\x22\x70\xa8\xad\x55\x6c\x82\xa3\xe8\x83\x23\x34\x1c\x85\x42\xeb\x9c\x8e\x16\xf0\x1b\x9e\x33\x7e\xaf\x15\xed\xc6\x60\xfa\xd4\x39\x1e\x47\xb3\xa1\xf6\xdd\xd7\x8f\xa7\x71\xb3\x57\xa1\xfd\x23\x0f\xdc\x63\x6d\x5f\x40\xac\x30\xee\xe7\xd5\x61\x59\x9d\x02\x6d\xc9\x18\xa1\x0d\x65\xc6\x6c\xbd\x90\x8e\xc1\x12\x12\xe9\x00\xf4\xa7\x15\xf2\xff\x1a\x50\x79\x97\x53\xd1\x32\x87\xda\x64\xb3\x78\x59\xcd\x5e\x9a\xa7\x53\x3e\xaf\xce\xfe\xb5\xb6\xed\x6e\xa6\xcf\x64\xaf\xf5\x3e\x15\x9d\x53\xb5\xd9\xea\xf9\x92\x2c\x1e\x92\x8a\xc9\xa9\xec\x6c\x94\x3e\xa0\xc9\x92\xa2\x57\xc0\x74\xcb\x56\xa0\xef\x8c\x6d\xbe\x33\x9c\xdf\xf1\x68\x80\xc4\xc9\x59\x17\x5d\xb6\xca\x64\xe9\x24\x82\x13\x21\x67\x36\x2c\xbc\x8c\x56\x26\xeb\x41\x44\x63\x6f\xe0\x92\x67\xf4\x0a\xac\xb5\xa0\x35\xa7\x6f\xed\x0f\x46\xab\x1c\xdb\x07\xb7\xdd\x5c\xd7\xb8\x4e\x3b\xd9\x1e\x57\xaf\x9d\xc1\x62\xd0\x4e\xad\xee\xf0\x39\x99\xbc\xf1\x38\xff\xb0\xc5\xa2\xfa\xf6\x19\x90\x8a\xd9\x10\x07\xe5\xb2\xcc\xcc\x64\x22\xde\x5e\x85\xd7\x24\x52\x0a\x26\xe2\x1f\x1b\x56\xfc\xb5\x88\x4a\xf5\x33\xa0\x39\x3d\x75\xf4\x69\x36\xab\xec\x86\xd5\xe6\x42\x86\xe7\xe7\x1a\x74\x4e\xcb\xed\xe1\xbc\x6f\xd1\xe0\x74\x6e\x9f\x3b\x3d\x79\x3a\x15\xd5\x7a\x49\xbc\xca\xc8\xd1\x1a\x65\xd0\x5a\x87\xd9\x6b\xe3\x30\x0a\xe7\x98\x32\x27\x54\xe1\x4f\xc4\x63\x2d\xb1\x45\x99\x85\x52\x21\x18\x36\x1c\x1d\x83\x24\xb6\x4e\x87\x2c\x58\x28\xe7\x93\x4b\x6c\x14\x5b\x17\x25\x82\x34\x5e\x45\x47\x2a\xc8\x80\x98\xe0\x1b\x7d\x72\x3a\xc4\xeb\x16\xb6\xe6\x63\x1f\x1e\x37\x79\xd5\x4a\xcd\xd9\x7c\x7e\x5e\xd3\x7c\x5f\x89\x3d\x80\xd5\x98\x2a\xf5\xd6\x5b\xd5\x0f\x0f\xb2\x64\x80\x9e\xd0\x64\x20\x2f\x5d\x66\x23\x98\x58\x59\xaf\x1d\x2b\x29\x20\x04\x19\xfc\x1d\x7b\xfe\x39\x11\x95\x2a\xe8\xad\x76\x3a\x3f\xc5\xa7\x67\x82\xd3\x63\x65\x89\xbd\x73\x41\x03\x99\x27\x87\xdd\x76\xd1\xdf\x57\x66\xb3\x3c\x7d\xde\xd4\xe6\x72\xbd\x7c\xdc\x34\x4a\xda\xe5\x28\x14\x19\xed\x00\x53\x92\x92\xd8\x11\x43\xbe\x59\x91\x12\x8c\x28\xef\xd8\xf3\x0f\xc0\xa3\x1e\x94\x53\xc0\x46\x08\x17\x1c\x64\xa2\xc8\x99\x48\x44\xe1\x0d\x24\x6b\x94\x8b\x01\x7c\x10\x5e\xf8\x64\x31\x47\x29\x9c\xb4\x06\x42\x56\x49\x61\x10\x94\x38\xdf\x57\x10\x57\x7a\xe6\x74\xac\xf4\x66\xd3\xa2\x81\xe7\x67\xd5\x39\xdb\x85\xea\xb8\x4b\xf7\x25\x6d\xde\x3b\xd7\x6d\x3c\xed\x6a\xed\xe1\x6c\xd0\x7c\x92\x25\x51\x54\xa3\x14\x01\x00\x85\x8f\xb7\x42\x41\x41\x29\xcf\x20\xb2\xcc\x64\x22\x85\x3b\xad\xe1\x77\x1f\x7f\x7d\x17\x44\xa5\x0a\x9a\x8c\x71\xbf\x7b\xeb\x9c\x0b\xb9\xe9\xf7\x68\x71\xee\x4d\x56\xeb\xa1\x7c\x4d\xef\x9d\x8f\x5a\x2c\xe2\x89\xcc\xb8\x32\xd8\xcf\x5a\x59\x0e\xa1\x64\x69\x47\x49\x85\x2c\xd1\x82\x4f\xd1\x92\x37\x59\x60\x8e\x59\xf9\xec\x3d\x49\x77\xc7\x83\x7e\x08\x9e\xe0\x94\x20\x74\x8a\x92\x00\x32\x8e\x49\x28\x94\x0a\x18\x84\x22\xcb\x89\xc8\x65\xd6\x9c\x94\x0d\x22\x53\x46\xe4\xe0\xe4\x0d\x57\x30\x1a\xad\xd7\xdf\xa8\x62\xe3\xe5\x7e\x1a\xe5\x4b\x27\x6e\xdf\xe3\x31\x3d\xd9\xb6\xb2\xad\x16\xe9\xfe\x69\x40\x87\x5e\x31\x9e\x8d\x87\xaf\xad\x95\x1d\x5d\x56\xd3\xca\xb5\xa4\x8a\x49\x10\x9e\xa4\x4f\x36\x78\x56\x8a\xbd\x93\x59\xb1\x07\xe7\x9c\x16\x5a\xdd\xc9\x5d\x3f\x27\xa2\xf2\xec\x95\xfb\x8b\xe7\x47\xa8\x6f\xaf\x8b\xd9\xa4\xb9\x3a\x4d\x2a\xc5\xa5\xa7\x56\x95\x37\xf3\x1c\x5f\x67\x45\xd6\xc7\xc5\x71\x36\xa2\xda\xcb\xb1\xba\xfa\x8c\xc7\x25\x0d\x48\xd2\x60\x0e\xce\x38\x97\x04\x30\x4b\x56\x26\x39\x45\xb7\xde\xfe\x8f\xe1\x29\x0e\x3e\x2e\x39\xfd\x2f\xa6\x3d\x6f\x7f\x9b\x47\x7f\x98\x6f\xd6\xff\xb9\x4b\x2c\x66\x5e\x59\xf7\xaf\xff\x09\xad\x92\x96\x1a\x93\x52\x56\x38\x8e\x42\xa0\xe2\x04\x2a\xa8\x14\x83\x97\x98\xb2\x44\x03\x40\xc2\xb0\xb6\xc1\x67\x66\x54\x41\x03\xe9\x20\x1c\x6a\xf5\x0d\x4b\x9a\x44\xee\xbe\xaf\x27\xaf\x9d\xcd\xb6\x7b\xec\x9a\xca\xa6\xd9\x3d\x35\xeb\xfe\x08\x87\x1e\xdb\xd1\x13\xea\x69\x63\xd1\xb2\x63\xaa\x4a\x98\x95\x4c\xc7\xb4\xc9\x41\x6a\x8d\x1c\xb3\xcf\x22\x5b\x52\xd6\x65\x2d\x52\x62\x43\x0e\xef\x8c\x0e\x3f\x0d\x39\x7e\x2a\x54\xe5\x5b\xd1\x95\x9f\x6d\x1b\xb5\xe2\xd0\x1d\xed\x5a\x73\xb5\x6b\x1e\xc6\x9b\xc7\xf5\x60\x5f\x4c\x67\xf3\x84\x6e\x57\xe4\xd3\xe6\x52\x1b\x3e\xb5\x77\xad\x7d\x49\xed\x8f\xd2\x27\x26\x52\xe4\x13\x4b\x10\xa8\x34\x66\x69\xad\x36\x5a\x18\xe3\xff\xaf\x5b\xe2\xef\x89\xc9\x05\x1f\xb2\x71\x91\xb5\x31\x9e\x0d\xd9\x64\x2d\x32\x00\x08\x6f\xd1\x06\xa5\x51\x25\x6b\xb2\x52\xd6\x67\xe4\x24\x34\x41\xc0\xc0\x10\x75\x8e\xc9\x80\xfa\xc6\x42\xbd\xba\x1d\x1e\xa0\x33\xe9\x55\x26\x7b\xd9\x9e\x0e\x67\x63\x3b\x3e\x4f\xe1\xa3\xe8\x37\x3a\x49\x3e\xb7\xf6\xcd\xd7\x71\xd8\x8f\x64\xfd\x6d\x51\x2b\x39\x83\x11\xc0\x12\x70\x20\xe9\x03\x69\x17\x65\xe4\x6c\x62\x96\xc4\xc1\xcb\x70\x67\x9c\x58\x9e\x44\x7e\x2a\x5e\xe5\x15\x6f\xbe\x59\x2f\x77\x2d\x55\x75\xc3\xe9\xfc\x74\xad\xbe\xf4\xf9\xe5\x52\x3d\x6f\x16\x7e\x5e\x69\x84\xeb\x6c\x71\xf8\x78\x1d\xec\xf3\x47\xc2\x75\xab\xa4\xeb\x76\x56\x02\x25\x2f\x29\x07\xb6\xd2\x5a\x01\xca\x81\x03\xc8\x42\xa1\xd2\x77\xf6\x61\x3f\x9e\x15\xc7\xe4\x50\x3b\x83\x56\x2a\x1f\x24\x38\x9b\xbd\x57\xde\x66\x69\x82\x0f\x06\xb3\x03\xc7\x4e\x6b\xe3\x20\x0b\xef\xd1\xfb\x64\x82\xb5\x29\x06\xe1\xac\x0a\xe1\xbe\xb6\x9e\xa7\x95\xe7\xe7\x63\xff\x70\xec\x5f\xe1\xed\xaa\xbb\xad\x6e\xa5\x5b\x3f\x14\xaf\x1f\xbb\xae\xdc\x50\x4b\xc6\xe2\xb9\xc3\xf3\xee\xa8\xff\xf1\x56\xc6\x8b\xd8\x49\xc5\x86\x39\x80\x17\x1c\xc8\x3a\x20\x8f\x68\x84\xc9\xe4\xee\x7d\xac\x51\x36\x21\xf9\xa9\x68\x95\x2a\xeb\xb5\x76\x9c\x6f\x1b\x97\xd3\x78\x22\x9b\x9b\x45\xea\xee\x17\x4f\xb2\xbd\xee\x6e\xc2\xf4\x30\x34\xd7\x41\xed\xad\x90\xb5\xe6\x79\x31\xbf\x16\x54\xf2\x59\x4b\x70\x08\x81\x03\xf9\x14\x12\x25\x1f\x58\x39\xeb\x81\xb5\x53\x02\xa5\xe6\x3b\x9f\xcb\x7d\x5f\x52\xf8\x89\x14\x2a\xaf\x2d\x24\x95\x55\xf4\x28\x53\x74\x32\x04\x63\xb3\xf1\xe0\x14\x0a\xf0\x9c\x98\x65\x10\xde\xea\x9c\x5c\x34\x0c\x10\x8c\xf3\x42\x86\xcc\x19\x50\x7d\x63\xe9\xca\xeb\xf7\x6d\xd7\xa1\x99\x76\xfa\xb9\x89\x60\xcd\x70\xb3\x59\x17\xd7\xf7\xfa\xbb\x0a\x7d\xae\x34\x47\x7e\x6d\x8f\xd3\x61\x6b\xd4\xbf\xb6\x4b\x3c\xcb\x6b\x44\x01\xca\x5b\x89\x31\x1b\xc7\x21\x39\x27\xb3\x8d\xd1\x38\x12\xe2\xce\x8e\xe8\x5e\x76\xf9\xa9\x88\x95\xcf\x9a\x48\xd7\xbb\xfb\xca\xe3\xb4\xf2\xe4\x6a\x97\xf9\x4b\xae\xe3\xf9\x6c\x6c\x5e\x76\xf3\x40\x1f\xaf\x4f\xf5\xe7\xda\xe9\xad\x26\xd7\x6a\x79\x0d\x25\xa7\x30\x42\x30\xde\x47\x19\x8d\xc8\x29\x00\x07\x54\x21\x6a\x6b\x83\x91\x3e\xa5\x3b\x3d\xc3\x8f\xa0\xa5\xfe\x8d\x16\xb9\x2c\x83\xf1\xc2\x44\x1b\xad\x64\x03\x96\x42\xc8\x4a\x99\x10\xa2\xe2\x6c\xbd\x51\x11\xa4\x10\x59\xde\xfa\x0a\xa7\x41\x2a\x9d\xa5\xf3\x68\x6c\x4a\x39\x7c\xa3\x26\xbe\xc0\x85\xdd\x60\xae\xba\xb9\x71\xad\x2d\xe3\xa8\x0d\x8d\xbe\xbb\x9e\x1f\x9f\x8e\x6d\xd7\x76\x55\x5c\xda\xe7\x1e\x7c\x5c\x5f\x06\x54\x94\x2c\xaf\x25\x0a\x99\xd1\xbb\xdb\xab\x12\x21\x72\x10\x22\x46\x05\x5a\x9a\x10\x6c\xe4\x3b\x35\xf1\xfb\xf7\xa5\x3f\x80\x58\xa9\xbe\x78\xf6\xb2\xaa\xb9\xea\x6c\xff\x3e\x78\xf3\xcb\xe7\xc7\x83\x57\xfc\xb1\x69\xd1\x7a\x53\xf4\xae\x69\x51\xdb\xf5\x07\xd3\xa2\xd7\xe8\x8d\x96\x9d\x92\x59\xa6\x47\x42\x34\xca\xaa\x28\x4c\x54\x84\x49\x04\x1d\x51\x86\x9c\x10\x8d\x74\x77\xbc\xeb\xdf\x68\xfd\xf2\x8f\x5f\xfe\x27\x00\x00\xff\xff\xb7\xbc\xf3\x39\x09\x2d\x00\x00") func fixtures_assetsProofParamsParametersJsonBytes() ([]byte, error) { return bindataRead( @@ -211,7 +211,7 @@ func fixtures_assetsProofParamsParametersJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "fixtures/_assets/proof-params/parameters.json", size: 12689, mode: os.FileMode(420), modTime: time.Unix(1644062078, 0)} + info := bindataFileInfo{name: "fixtures/_assets/proof-params/parameters.json", size: 11529, mode: os.FileMode(420), modTime: time.Unix(1644387998, 0)} a := &asset{bytes: bytes, info: info} return a, nil } From e7b0678804ab63eb8341bafa3f03e7d99cc814b3 Mon Sep 17 00:00:00 2001 From: hunjixin <1084400399@qq.com> Date: Fri, 7 Jan 2022 15:37:21 +0800 Subject: [PATCH 143/167] fix json marshal/unmarshal for FIL type --- venus-shared/internal/bigint_fil.go | 22 ++++++++++++ venus-shared/types/bigint_fil_test.go | 48 +++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/venus-shared/internal/bigint_fil.go b/venus-shared/internal/bigint_fil.go index efb11948c4..6936d8516d 100644 --- a/venus-shared/internal/bigint_fil.go +++ b/venus-shared/internal/bigint_fil.go @@ -2,6 +2,7 @@ package internal import ( "encoding" + "encoding/json" "fmt" "math/big" "strings" @@ -91,6 +92,24 @@ func (f FIL) UnmarshalText(text []byte) error { return nil } +func (f FIL) MarshalJSON() ([]byte, error) { + return []byte("\"" + f.String() + "\""), nil +} + +func (f *FIL) UnmarshalJSON(by []byte) error { + p, err := ParseFIL(strings.Trim(string(by), "\"")) + if err != nil { + return err + } + if f.Int != nil { + f.Int.Set(p.Int) + } else { + f.Int = p.Int + } + + return nil +} + func ParseFIL(s string) (FIL, error) { suffix := strings.TrimLeft(s, "-.1234567890") s = s[:len(s)-len(suffix)] @@ -145,3 +164,6 @@ func FromFil(i uint64) BigInt { var _ encoding.TextMarshaler = (*FIL)(nil) var _ encoding.TextUnmarshaler = (*FIL)(nil) + +var _ json.Marshaler = (*FIL)(nil) +var _ json.Unmarshaler = (*FIL)(nil) diff --git a/venus-shared/types/bigint_fil_test.go b/venus-shared/types/bigint_fil_test.go index 947f20d53b..5b8c4c835f 100644 --- a/venus-shared/types/bigint_fil_test.go +++ b/venus-shared/types/bigint_fil_test.go @@ -1,6 +1,9 @@ package types import ( + "encoding/json" + "fmt" + "math/big" "strings" "testing" @@ -189,3 +192,48 @@ func TestFilShort(t *testing.T) { }) } } + +func TestMarshal(t *testing.T) { + tf.UnitTest(t) + type A struct { + Fil FIL + } + var a = A{ + Fil: FIL{Int: big.NewInt(1000000)}, + } + + aBytes, err := json.Marshal(a) + require.NoError(t, err) + + require.Equal(t, aBytes, []byte("{\"Fil\":\"0.000000000001 FIL\"}")) + fmt.Println(string(aBytes)) +} + +func TestUnMarshal(t *testing.T) { + type A struct { + Fil FIL + } + bigFIl, _ := big.NewInt(0).SetString("100000000000000000000", 10) + for _, s := range []struct { + fil string + expect FIL + }{ + { + fil: "{\"Fil\":\"0.000000000001 FIL\"}", + expect: FIL{Int: big.NewInt(1000000)}, + }, + { + fil: "{\"Fil\":\"1 FIL\"}", + expect: FIL{Int: big.NewInt(1000000000000000000)}, + }, + { + fil: "{\"Fil\":\"100 FIL\"}", + expect: FIL{Int: bigFIl}, + }, + } { + a := A{} + err := json.Unmarshal([]byte(s.fil), &a) + require.NoError(t, err) + require.Equal(t, a.Fil.String(), s.expect.String()) + } +} From 71c52bbba9c58489bd664097190b9ba07aa674a0 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Thu, 10 Feb 2022 15:33:18 +0800 Subject: [PATCH 144/167] fix: venus-shared: Change the type of HeadChange.Type (#4755) * Change the type of HeadChange.Type --- app/submodule/chain/chaininfo_api.go | 4 ++-- cmd/dispute.go | 7 +++---- pkg/chain/store.go | 18 +++++------------- pkg/chain/store_test.go | 21 +++++++++++---------- pkg/chain/waiter.go | 6 +++--- pkg/events/events_test.go | 10 +++++----- pkg/events/observer.go | 5 ++--- venus-devtool/api-gen/example.go | 1 + venus-shared/api/chain/v0/method.md | 4 ++-- venus-shared/api/chain/v1/method.md | 4 ++-- venus-shared/types/api_types.go | 20 +++++++++++++++----- 11 files changed, 51 insertions(+), 49 deletions(-) diff --git a/app/submodule/chain/chaininfo_api.go b/app/submodule/chain/chaininfo_api.go index 8218296b67..3ca4cfeee4 100644 --- a/app/submodule/chain/chaininfo_api.go +++ b/app/submodule/chain/chaininfo_api.go @@ -599,10 +599,10 @@ func (cia *chainInfoAPI) ChainGetPath(ctx context.Context, from types.TipSetKey, path := make([]*types.HeadChange, len(revert)+len(apply)) for i, r := range revert { - path[i] = &types.HeadChange{Type: chain.HCRevert, Val: r} + path[i] = &types.HeadChange{Type: types.HCRevert, Val: r} } for j, i := 0, len(apply)-1; i >= 0; j, i = j+1, i-1 { - path[j+len(revert)] = &types.HeadChange{Type: chain.HCApply, Val: apply[i]} + path[j+len(revert)] = &types.HeadChange{Type: types.HCApply, Val: apply[i]} } return path, nil } diff --git a/cmd/dispute.go b/cmd/dispute.go index 7cead51c26..8292917e9e 100644 --- a/cmd/dispute.go +++ b/cmd/dispute.go @@ -19,7 +19,6 @@ import ( logging "github.com/ipfs/go-log/v2" "github.com/filecoin-project/venus/app/node" - chainpkg "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/venus-shared/actors" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" "github.com/filecoin-project/venus/venus-shared/types" @@ -179,7 +178,7 @@ var disputerStartCmd = &cmds.Command{ return xerrors.Errorf("Notify first entry should have been one item") } - if head[0].Type != chainpkg.HCCurrent { + if head[0].Type != types.HCCurrent { return xerrors.Errorf("expected current head on Notify stream (got %s)", head[0].Type) } @@ -280,14 +279,14 @@ var disputerStartCmd = &cmds.Command{ for _, val := range notif { switch val.Type { - case chainpkg.HCApply: + case types.HCApply: for ; lastEpoch <= val.Val.Height(); lastEpoch++ { err := applyTsk(val.Val.Key()) if err != nil { return err } } - case chainpkg.HCRevert: + case types.HCRevert: // do nothing default: return xerrors.Errorf("unexpected head change type %s", val.Type) diff --git a/pkg/chain/store.go b/pkg/chain/store.go index 24e3f50ce3..966af3d154 100644 --- a/pkg/chain/store.go +++ b/pkg/chain/store.go @@ -49,14 +49,6 @@ import ( "github.com/filecoin-project/venus/venus-shared/types" ) -// HeadChangeTopic is the topic used to publish new heads. -const ( - HeadChangeTopic = "headchange" - HCRevert = "revert" - HCApply = "apply" - HCCurrent = "current" -) - // ErrNoMethod is returned by Get when there is no method signature (eg, transfer). var ErrNoMethod = errors.New("no method") @@ -616,20 +608,20 @@ func (store *Store) reorgWorker(ctx context.Context) chan reorg { notif := make([]*types.HeadChange, len(rev)+len(app)) for i, revert := range rev { notif[i] = &types.HeadChange{ - Type: HCRevert, + Type: types.HCRevert, Val: revert, } } for i, apply := range app { notif[i+len(rev)] = &types.HeadChange{ - Type: HCApply, + Type: types.HCApply, Val: apply, } } // Publish an event that we have a new head. - store.headEvents.Pub(notif, HeadChangeTopic) + store.headEvents.Pub(notif, types.HeadChangeTopic) return nil } @@ -687,13 +679,13 @@ func (store *Store) reorgWorker(ctx context.Context) chan reorg { // Then event in the message may be HCApply and HCRevert. func (store *Store) SubHeadChanges(ctx context.Context) chan []*types.HeadChange { store.mu.RLock() - subCh := store.headEvents.Sub(HeadChangeTopic) + subCh := store.headEvents.Sub(types.HeadChangeTopic) head := store.head store.mu.RUnlock() out := make(chan []*types.HeadChange, 16) out <- []*types.HeadChange{{ - Type: HCCurrent, + Type: types.HCCurrent, Val: head, }} diff --git a/pkg/chain/store_test.go b/pkg/chain/store_test.go index 57ce92f061..5fad0befdb 100644 --- a/pkg/chain/store_test.go +++ b/pkg/chain/store_test.go @@ -160,7 +160,7 @@ func TestRevertChange(t *testing.T) { ch := cs.SubHeadChanges(ctx) currentA := <-ch - test.Equal(t, currentA[0].Type, chain.HCCurrent) + test.Equal(t, currentA[0].Type, types.HCCurrent) test.Equal(t, currentA[0].Val, link3) err = cs.SetHead(ctx, link6) @@ -171,18 +171,18 @@ func TestRevertChange(t *testing.T) { //maybe link3, if link3 fetch next headChanges = <-ch } - test.Equal(t, headChanges[0].Type, chain.HCRevert) + test.Equal(t, headChanges[0].Type, types.HCRevert) test.Equal(t, headChanges[0].Val, link3) - test.Equal(t, headChanges[1].Type, chain.HCRevert) + test.Equal(t, headChanges[1].Type, types.HCRevert) test.Equal(t, headChanges[1].Val, link2) - test.Equal(t, headChanges[2].Type, chain.HCRevert) + test.Equal(t, headChanges[2].Type, types.HCRevert) test.Equal(t, headChanges[2].Val, link1) - test.Equal(t, headChanges[3].Type, chain.HCApply) + test.Equal(t, headChanges[3].Type, types.HCApply) test.Equal(t, headChanges[3].Val, link4) - test.Equal(t, headChanges[4].Type, chain.HCApply) + test.Equal(t, headChanges[4].Type, types.HCApply) test.Equal(t, headChanges[4].Val, link5) - test.Equal(t, headChanges[5].Type, chain.HCApply) + test.Equal(t, headChanges[5].Type, types.HCApply) test.Equal(t, headChanges[5].Val, link6) } @@ -269,11 +269,11 @@ func TestHeadEvents(t *testing.T) { chB := chainStore.SubHeadChanges(ctx) // HCurrent currentA := <-chA - test.Equal(t, currentA[0].Type, chain.HCCurrent) + test.Equal(t, currentA[0].Type, types.HCCurrent) test.Equal(t, currentA[0].Val, genTS) currentB := <-chB - test.Equal(t, currentB[0].Type, chain.HCCurrent) + test.Equal(t, currentB[0].Type, types.HCCurrent) test.Equal(t, currentB[0].Val, genTS) defer ctx.Done() @@ -286,7 +286,8 @@ func TestHeadEvents(t *testing.T) { assertSetHead(t, chainStore, link1) assertSetHead(t, chainStore, genTS) heads := []*types.TipSet{genTS, link1, link2, link3, link4, link4, link3, link2, link1, genTS} - types := []string{"apply", "apply", "apply", "apply", "apply", "revert", "revert", "revert", "revert"} + types := []types.HeadChangeType{types.HCApply, types.HCApply, types.HCApply, types.HCApply, types.HCApply, types.HCRevert, + types.HCRevert, types.HCRevert, types.HCRevert} // Heads arrive in the expected order for i := 0; i < 9; i++ { headA := <-chA diff --git a/pkg/chain/waiter.go b/pkg/chain/waiter.go index 028b20fc57..ee22b50748 100644 --- a/pkg/chain/waiter.go +++ b/pkg/chain/waiter.go @@ -180,7 +180,7 @@ func (w *Waiter) waitForMessage(ctx context.Context, ch <-chan []*types.HeadChan return nil, false, fmt.Errorf("SubHeadChanges first entry should have been one item") } - if current[0].Type != HCCurrent { + if current[0].Type != types.HCCurrent { return nil, false, fmt.Errorf("expected current head on SHC stream (got %s)", current[0].Type) } @@ -220,7 +220,7 @@ func (w *Waiter) waitForMessage(ctx context.Context, ch <-chan []*types.HeadChan } for _, val := range notif { switch val.Type { - case HCRevert: + case types.HCRevert: if val.Val.Equals(candidateTS) { candidateTS = nil candidateRcp = nil @@ -228,7 +228,7 @@ func (w *Waiter) waitForMessage(ctx context.Context, ch <-chan []*types.HeadChan if backSearchWait != nil { reverts[val.Val.Key().String()] = true } - case HCApply: + case types.HCApply: if candidateTS != nil && val.Val.Height() >= candidateTS.Height()+abi.ChainEpoch(confidence) { return candidateRcp, true, nil } diff --git a/pkg/events/events_test.go b/pkg/events/events_test.go index 4b270a747b..ba86dbd288 100644 --- a/pkg/events/events_test.go +++ b/pkg/events/events_test.go @@ -135,10 +135,10 @@ func (fcs *fakeCS) ChainGetPath(ctx context.Context, from, to types.TipSetKey) ( path := make([]*types.HeadChange, len(revert)+len(apply)) for i, r := range revert { - path[i] = &types.HeadChange{Type: chain.HCRevert, Val: r} + path[i] = &types.HeadChange{Type: types.HCRevert, Val: r} } for j, i := 0, len(apply)-1; i >= 0; j, i = j+1, i-1 { - path[j+len(revert)] = &types.HeadChange{Type: chain.HCApply, Val: apply[i]} + path[j+len(revert)] = &types.HeadChange{Type: types.HCApply, Val: apply[i]} } return path, nil } @@ -241,7 +241,7 @@ func (fcs *fakeCS) ChainNotify(ctx context.Context) (<-chan []*types.HeadChange, panic(err) } - out <- []*types.HeadChange{{Type: chain.HCCurrent, Val: best}} + out <- []*types.HeadChange{{Type: types.HCCurrent, Val: best}} fcs.subCh = out close(fcs.waitSub) @@ -310,13 +310,13 @@ func (fcs *fakeCS) sub(rev, app []*types.TipSet) { for i, r := range rev { notif[i] = &types.HeadChange{ - Type: chain.HCRevert, + Type: types.HCRevert, Val: r, } } for i, r := range app { notif[i+len(rev)] = &types.HeadChange{ - Type: chain.HCApply, + Type: types.HCApply, Val: r, } } diff --git a/pkg/events/observer.go b/pkg/events/observer.go index eae73c68c6..eb61601502 100644 --- a/pkg/events/observer.go +++ b/pkg/events/observer.go @@ -11,7 +11,6 @@ import ( "go.opencensus.io/trace" "golang.org/x/xerrors" - "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/constants" ) @@ -113,9 +112,9 @@ func (o *observer) applyChanges(ctx context.Context, changes []*types.HeadChange var rev, app []*types.TipSet for _, changes := range changes { switch changes.Type { - case chain.HCRevert: + case types.HCRevert: rev = append(rev, changes.Val) - case chain.HCApply: + case types.HCApply: app = append(app, changes.Val) default: log.Errorf("unexpected head change notification type: '%s'", changes.Type) diff --git a/venus-devtool/api-gen/example.go b/venus-devtool/api-gen/example.go index 07d05641e1..00b385a686 100644 --- a/venus-devtool/api-gen/example.go +++ b/venus-devtool/api-gen/example.go @@ -177,6 +177,7 @@ func init() { addExample([]abi.SectorNumber{123, 124}) addExample(types.CheckStatusCode(0)) addExample(map[string]interface{}{"abc": 123}) + addExample(types.HCApply) // messager uuid, err := types.ParseUUID("e26f1e5c-47f7-4561-a11d-18fab6e748af") diff --git a/venus-shared/api/chain/v0/method.md b/venus-shared/api/chain/v0/method.md index 4748198da6..ff9d1602e7 100644 --- a/venus-shared/api/chain/v0/method.md +++ b/venus-shared/api/chain/v0/method.md @@ -688,7 +688,7 @@ Response: ```json [ { - "Type": "string value", + "Type": "apply", "Val": { "Cids": null, "Blocks": null, @@ -889,7 +889,7 @@ Response: ```json [ { - "Type": "string value", + "Type": "apply", "Val": { "Cids": null, "Blocks": null, diff --git a/venus-shared/api/chain/v1/method.md b/venus-shared/api/chain/v1/method.md index b1f2b314f3..6272214a25 100644 --- a/venus-shared/api/chain/v1/method.md +++ b/venus-shared/api/chain/v1/method.md @@ -691,7 +691,7 @@ Response: ```json [ { - "Type": "string value", + "Type": "apply", "Val": { "Cids": null, "Blocks": null, @@ -921,7 +921,7 @@ Response: ```json [ { - "Type": "string value", + "Type": "apply", "Val": { "Cids": null, "Blocks": null, diff --git a/venus-shared/types/api_types.go b/venus-shared/types/api_types.go index d7640eee6f..ccf307fdc9 100644 --- a/venus-shared/types/api_types.go +++ b/venus-shared/types/api_types.go @@ -16,16 +16,26 @@ import ( "github.com/filecoin-project/venus/venus-shared/api" ) -type ObjStat struct { - Size uint64 - Links uint64 -} +type HeadChangeType string + +// HeadChangeTopic is the topic used to publish new heads. +const HeadChangeTopic = "headchange" +const ( + HCRevert HeadChangeType = "revert" + HCApply HeadChangeType = "apply" + HCCurrent HeadChangeType = "current" +) type HeadChange struct { - Type string + Type HeadChangeType Val *TipSet } +type ObjStat struct { + Size uint64 + Links uint64 +} + // ChainMessage is an on-chain message with its block and receipt. type ChainMessage struct { //nolint TS *TipSet From 34178423dfb3ae62cd4ff541c87f503da6ecb126 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Fri, 11 Feb 2022 15:10:19 +0800 Subject: [PATCH 145/167] feat: venus-shared: Expose RPC client options (#4756) * Expose RPC client options --- venus-devtool/api-gen/client.go | 4 +- venus-shared/api/chain/v0/client_gen.go | 4 +- venus-shared/api/chain/v1/client_gen.go | 4 +- venus-shared/api/client/client.go | 31 --------------- venus-shared/api/client/client_test.go | 53 ------------------------- venus-shared/api/messager/client_gen.go | 4 +- venus-shared/api/proxy_util_test.go | 4 -- venus-shared/api/wallet/client_gen.go | 4 +- 8 files changed, 10 insertions(+), 98 deletions(-) delete mode 100644 venus-shared/api/client/client.go delete mode 100644 venus-shared/api/client/client_test.go diff --git a/venus-devtool/api-gen/client.go b/venus-devtool/api-gen/client.go index b200213772..88a2207dde 100644 --- a/venus-devtool/api-gen/client.go +++ b/venus-devtool/api-gen/client.go @@ -38,14 +38,14 @@ import ( ) // New{{ .APIName }}RPC creates a new httpparse jsonrpc remotecli. -func New{{ .APIName }}RPC(ctx context.Context, addr string, requestHeader http.Header) ({{ .APIName }}, jsonrpc.ClientCloser, error) { +func New{{ .APIName }}RPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) ({{ .APIName }}, jsonrpc.ClientCloser, error) { if requestHeader == nil { requestHeader = http.Header{} } requestHeader.Set(api.VenusAPINamespaceHeader, "{{ .APINs }}") var res {{ .APIStruct }} - closer, err := jsonrpc.NewMergeClient(ctx, addr, "{{ .MethNs }}", api.GetInternalStructs(&res), requestHeader) + closer, err := jsonrpc.NewMergeClient(ctx, addr, "{{ .MethNs }}", api.GetInternalStructs(&res), requestHeader, opts...) return &res, closer, err } diff --git a/venus-shared/api/chain/v0/client_gen.go b/venus-shared/api/chain/v0/client_gen.go index bbb39e63f8..a7215fcb4c 100644 --- a/venus-shared/api/chain/v0/client_gen.go +++ b/venus-shared/api/chain/v0/client_gen.go @@ -11,14 +11,14 @@ import ( ) // NewFullNodeRPC creates a new httpparse jsonrpc remotecli. -func NewFullNodeRPC(ctx context.Context, addr string, requestHeader http.Header) (FullNode, jsonrpc.ClientCloser, error) { +func NewFullNodeRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (FullNode, jsonrpc.ClientCloser, error) { if requestHeader == nil { requestHeader = http.Header{} } requestHeader.Set(api.VenusAPINamespaceHeader, "v0.FullNode") var res FullNodeStruct - closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&res), requestHeader) + closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&res), requestHeader, opts...) return &res, closer, err } diff --git a/venus-shared/api/chain/v1/client_gen.go b/venus-shared/api/chain/v1/client_gen.go index 1813606a5f..285364777e 100644 --- a/venus-shared/api/chain/v1/client_gen.go +++ b/venus-shared/api/chain/v1/client_gen.go @@ -11,14 +11,14 @@ import ( ) // NewFullNodeRPC creates a new httpparse jsonrpc remotecli. -func NewFullNodeRPC(ctx context.Context, addr string, requestHeader http.Header) (FullNode, jsonrpc.ClientCloser, error) { +func NewFullNodeRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (FullNode, jsonrpc.ClientCloser, error) { if requestHeader == nil { requestHeader = http.Header{} } requestHeader.Set(api.VenusAPINamespaceHeader, "v1.FullNode") var res FullNodeStruct - closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&res), requestHeader) + closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&res), requestHeader, opts...) return &res, closer, err } diff --git a/venus-shared/api/client/client.go b/venus-shared/api/client/client.go deleted file mode 100644 index 93328500fd..0000000000 --- a/venus-shared/api/client/client.go +++ /dev/null @@ -1,31 +0,0 @@ -package client - -import ( - "context" - "net/http" - - "github.com/filecoin-project/go-jsonrpc" - "github.com/filecoin-project/venus/venus-shared/api" - v0 "github.com/filecoin-project/venus/venus-shared/api/chain/v0" - v1 "github.com/filecoin-project/venus/venus-shared/api/chain/v1" -) - -func NewFullRPCV0(ctx context.Context, addr string, header http.Header) (v0.FullNode, jsonrpc.ClientCloser, error) { - var full v0.FullNodeStruct - closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&full), - header) - return &full, closer, err -} - -func NewFullRPCV1(ctx context.Context, addr string, header http.Header) (v1.FullNode, jsonrpc.ClientCloser, error) { - var full v1.FullNodeStruct - closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&full), - header) - return &full, closer, err -} - -func NewWalletRPC(ctx context.Context, addr string, header http.Header) (v1.IWallet, jsonrpc.ClientCloser, error) { - var wallet v1.IWalletStruct - closer, err := jsonrpc.NewClient(ctx, addr, "Filecoin", &wallet.Internal, header) - return &wallet, closer, err -} diff --git a/venus-shared/api/client/client_test.go b/venus-shared/api/client/client_test.go deleted file mode 100644 index 579c47998a..0000000000 --- a/venus-shared/api/client/client_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package client - -import ( - "context" - "net/http" - "testing" - - "github.com/stretchr/testify/assert" - - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" -) - -func TestAPIClient(t *testing.T) { - t.SkipNow() - tf.UnitTest(t) - token := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBbGxvdyI6WyJyZWFkIiwid3JpdGUiLCJzaWduIiwiYWRtaW4iXX0.J9r8fhNJpf1bD4G4_tqT9UR81S5CNJHS6fD86rqxfpQ" - addr := "ws://127.0.0.1:3453/rpc/v0" - - ctx := context.Background() - header := http.Header{} - header.Add("Authorization", "Bearer "+token) - - v0cli, v0close, err := NewFullRPCV0(ctx, addr, header) - assert.Nil(t, err) - defer v0close() - - v1cli, v1close, err := NewFullRPCV1(ctx, addr, header) - assert.Nil(t, err) - defer v1close() - - head, err := v0cli.ChainHead(context.Background()) - assert.Nil(t, err) - head2, err := v1cli.ChainHead(context.Background()) - assert.Nil(t, err) - assert.Equal(t, head, head2) - - v0version, err := v0cli.Version(context.Background()) - assert.Nil(t, err) - t.Log(v0version) - - v1version, err := v1cli.Version(context.Background()) - assert.Nil(t, err) - t.Log(v1version) - - wcli, wclose, err := NewWalletRPC(ctx, addr, header) - if err != nil { - t.Fatal(err) - } - defer wclose() - - addrs := wcli.WalletAddresses(context.Background()) - t.Log(addrs) -} diff --git a/venus-shared/api/messager/client_gen.go b/venus-shared/api/messager/client_gen.go index 837950b80d..d98757bb18 100644 --- a/venus-shared/api/messager/client_gen.go +++ b/venus-shared/api/messager/client_gen.go @@ -11,14 +11,14 @@ import ( ) // NewIMessagerRPC creates a new httpparse jsonrpc remotecli. -func NewIMessagerRPC(ctx context.Context, addr string, requestHeader http.Header) (IMessager, jsonrpc.ClientCloser, error) { +func NewIMessagerRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (IMessager, jsonrpc.ClientCloser, error) { if requestHeader == nil { requestHeader = http.Header{} } requestHeader.Set(api.VenusAPINamespaceHeader, "messager.IMessager") var res IMessagerStruct - closer, err := jsonrpc.NewMergeClient(ctx, addr, "Message", api.GetInternalStructs(&res), requestHeader) + closer, err := jsonrpc.NewMergeClient(ctx, addr, "Message", api.GetInternalStructs(&res), requestHeader, opts...) return &res, closer, err } diff --git a/venus-shared/api/proxy_util_test.go b/venus-shared/api/proxy_util_test.go index a57d44ff21..945fe58f1c 100644 --- a/venus-shared/api/proxy_util_test.go +++ b/venus-shared/api/proxy_util_test.go @@ -29,10 +29,6 @@ type StrC struct { } } -type StrD struct { - StrA -} - func TestGetInternalStructs(t *testing.T) { tf.UnitTest(t) var proxy StrA diff --git a/venus-shared/api/wallet/client_gen.go b/venus-shared/api/wallet/client_gen.go index cc8f767295..95e0cff4c4 100644 --- a/venus-shared/api/wallet/client_gen.go +++ b/venus-shared/api/wallet/client_gen.go @@ -11,14 +11,14 @@ import ( ) // NewIFullAPIRPC creates a new httpparse jsonrpc remotecli. -func NewIFullAPIRPC(ctx context.Context, addr string, requestHeader http.Header) (IFullAPI, jsonrpc.ClientCloser, error) { +func NewIFullAPIRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (IFullAPI, jsonrpc.ClientCloser, error) { if requestHeader == nil { requestHeader = http.Header{} } requestHeader.Set(api.VenusAPINamespaceHeader, "wallet.IFullAPI") var res IFullAPIStruct - closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&res), requestHeader) + closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&res), requestHeader, opts...) return &res, closer, err } From 94e15a357143fe8120a1141d25b69e14de9e80a5 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Fri, 11 Feb 2022 15:12:08 +0800 Subject: [PATCH 146/167] migrate v7 version config (#4761) --- pkg/migration/migrate.go | 42 ++++++++++++++++++++++++++++++++++++++++ pkg/repo/fsrepo.go | 2 +- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/pkg/migration/migrate.go b/pkg/migration/migrate.go index 312b81b358..ee25a4a8b5 100644 --- a/pkg/migration/migrate.go +++ b/pkg/migration/migrate.go @@ -25,6 +25,7 @@ var versionMap = []versionInfo{ {version: 4, upgrade: Version4Upgrade}, {version: 5, upgrade: Version5Upgrade}, {version: 6, upgrade: Version6Upgrade}, + {version: 7, upgrade: Version7Upgrade}, } // TryToMigrate used to migrate data(db,config,file,etc) in local repo @@ -188,3 +189,44 @@ func Version6Upgrade(repoPath string) (err error) { return repo.WriteVersion(repoPath, 6) } + +//Version7Upgrade +func Version7Upgrade(repoPath string) (err error) { + var fsrRepo repo.Repo + if fsrRepo, err = repo.OpenFSRepo(repoPath, 6); err != nil { + return + } + cfg := fsrRepo.Config() + switch cfg.NetworkParams.NetworkType { + case constants.NetworkMainnet: + cfg.NetworkParams.GenesisNetworkVersion = network.Version0 + cfg.NetworkParams.ForkUpgradeParam.UpgradeOhSnapHeight = 999999999999 + case constants.Network2k: + cfg.NetworkParams.GenesisNetworkVersion = network.Version0 + cfg.NetworkParams.ForkUpgradeParam.UpgradeOhSnapHeight = -18 + case constants.NetworkCalibnet: + cfg.NetworkParams.GenesisNetworkVersion = network.Version0 + cfg.NetworkParams.ForkUpgradeParam.UpgradeOhSnapHeight = 682006 + case constants.NetworkButterfly: + cfg.NetworkParams.GenesisNetworkVersion = network.Version14 + cfg.NetworkParams.ForkUpgradeParam.UpgradeOhSnapHeight = 240 + case constants.NetworkForce: + cfg.NetworkParams.GenesisNetworkVersion = network.Version0 + cfg.NetworkParams.ForkUpgradeParam.UpgradeOhSnapHeight = -18 + case constants.NetworkInterop: + cfg.NetworkParams.GenesisNetworkVersion = network.Version0 + cfg.NetworkParams.ForkUpgradeParam.UpgradeOhSnapHeight = -18 + default: + return fsrRepo.Close() + } + + if err = fsrRepo.ReplaceConfig(cfg); err != nil { + return + } + + if err = fsrRepo.Close(); err != nil { + return + } + + return repo.WriteVersion(repoPath, 7) +} diff --git a/pkg/repo/fsrepo.go b/pkg/repo/fsrepo.go index d1759a6a19..7c5dda0246 100644 --- a/pkg/repo/fsrepo.go +++ b/pkg/repo/fsrepo.go @@ -26,7 +26,7 @@ import ( ) // Version is the version of repo schema that this code understands. -const LatestVersion uint = 6 +const LatestVersion uint = 7 const ( // apiFile is the filename containing the filecoin node's api address. From 7ba45e0d25adeeacf8aefc0cfb875dec5208990e Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Fri, 11 Feb 2022 17:07:59 +0800 Subject: [PATCH 147/167] chore: dep: update ffi & go.mod (#4762) * update ffi & go.mod --- extern/filecoin-ffi | 2 +- go.mod | 36 ++++---- go.sum | 193 ++++++++++++++++++++++++++++++++++--------- venus-devtool/go.sum | 8 +- 4 files changed, 173 insertions(+), 66 deletions(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index f66026bd3d..5ec5d805c0 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit f66026bd3d165e009b11172c82b44204197a7666 +Subproject commit 5ec5d805c01ea85224f6448dd6c6fa0a2a73c028 diff --git a/go.mod b/go.mod index d836ff58d6..9c150c4a94 100644 --- a/go.mod +++ b/go.mod @@ -20,19 +20,19 @@ require ( github.com/docker/go-units v0.4.0 github.com/drand/drand v1.3.0 github.com/drand/kyber v1.1.7 - github.com/fatih/color v1.10.0 + github.com/fatih/color v1.13.0 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f - github.com/filecoin-project/go-address v0.0.5 + github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349 // indirect github.com/filecoin-project/go-bitfield v0.2.4 - github.com/filecoin-project/go-cbor-util v0.0.0-20201016124514-d0bbec7bfcc4 + github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-commp-utils v0.1.3 - github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 + github.com/filecoin-project/go-crypto v0.0.1 github.com/filecoin-project/go-data-transfer v1.12.1 - github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a + github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543 - github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 + github.com/filecoin-project/go-paramfetch v0.0.4 github.com/filecoin-project/go-state-types v0.1.3 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 @@ -41,15 +41,14 @@ require ( github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 - github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 + github.com/filecoin-project/specs-storage v0.2.0 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578 github.com/fxamacker/cbor/v2 v2.4.0 - github.com/gbrlsnchs/jwt/v3 v3.0.0 + github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/go-errors/errors v1.0.1 - github.com/go-kit/kit v0.10.0 + github.com/go-kit/kit v0.12.0 github.com/golang/mock v1.6.0 - github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf // indirect github.com/golangci/golangci-lint v1.39.0 github.com/google/flatbuffers v2.0.0+incompatible // indirect github.com/google/go-github v17.0.0+incompatible @@ -76,7 +75,7 @@ require ( github.com/ipfs/go-ipfs-ds-help v1.1.0 github.com/ipfs/go-ipfs-exchange-interface v0.1.0 github.com/ipfs/go-ipfs-exchange-offline v0.1.1 - github.com/ipfs/go-ipfs-files v0.0.8 + github.com/ipfs/go-ipfs-files v0.0.9 github.com/ipfs/go-ipfs-routing v0.2.1 github.com/ipfs/go-ipld-cbor v0.0.6 github.com/ipfs/go-ipld-format v0.2.0 @@ -84,7 +83,7 @@ require ( github.com/ipfs/go-log/v2 v2.4.0 github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-path v0.0.7 - github.com/ipfs/go-unixfs v0.2.4 + github.com/ipfs/go-unixfs v0.2.6 github.com/ipfs/iptb v1.4.0 github.com/ipld/go-car v0.3.3 github.com/jbenet/goprocess v0.1.4 @@ -99,9 +98,8 @@ require ( github.com/libp2p/go-libp2p-yamux v0.7.0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 - github.com/mitchellh/mapstructure v1.4.1 // indirect github.com/morikuni/aec v1.0.0 // indirect - github.com/multiformats/go-multiaddr v0.4.0 + github.com/multiformats/go-multiaddr v0.4.1 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multihash v0.1.0 github.com/opencontainers/go-digest v1.0.0 // indirect @@ -116,20 +114,20 @@ require ( github.com/spf13/afero v1.2.2 // indirect github.com/spf13/cast v1.3.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a + github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e github.com/stretchr/objx v0.2.0 // indirect github.com/stretchr/testify v1.7.0 - github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2 + github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 github.com/whyrusleeping/go-logging v0.0.1 github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1 github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325 github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 // indirect go.opencensus.io v0.23.0 - go.uber.org/zap v1.19.0 - golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e + go.uber.org/zap v1.19.1 + golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 + golang.org/x/sys v0.0.0-20211209171907-798191bca915 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 gopkg.in/cheggaaa/pb.v1 v1.0.28 gorm.io/driver/mysql v1.1.1 diff --git a/go.sum b/go.sum index 57d560e646..d63f59c558 100644 --- a/go.sum +++ b/go.sum @@ -59,12 +59,15 @@ github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee h1:8doiS7ib3zi6/K172oDhSKU0dJ/miJramo9NITOMyZQ= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4uFNYOGG2cJpmFJ04E6SD1NLELPYZB57/7AY= +github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kubuxu/go-os-helper v0.0.1 h1:EJiD2VUQyh5A9hWJLmc6iWg6yIcJ7jpBcwC8GMGXfDk= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= @@ -92,6 +95,7 @@ github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBA github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ahmetb/go-linq/v3 v3.2.0 h1:BEuMfp+b59io8g5wYzNoFe9pWPalRklhlhbiU3hYZDE= github.com/ahmetb/go-linq/v3 v3.2.0/go.mod h1:haQ3JfOeWK8HpVxMtHHEMPVgBKiYyQ+f1/kLZh/cj9U= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -109,7 +113,9 @@ github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/ashanbrown/forbidigo v1.1.0 h1:SJOPJyqsrVL3CvR0veFZFmIM0fXS/Kvyikqvfphd0Z4= @@ -126,7 +132,11 @@ github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpi github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.32.11/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= @@ -170,12 +180,15 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtE github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charithe/durationcheck v0.0.6 h1:Tsy7EppNow2pDC0jN7Hsmcb6mHd71ZbI1vFissRBtc0= github.com/charithe/durationcheck v0.0.6/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= @@ -184,6 +197,9 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -207,8 +223,9 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.1.0 h1:kq/SbG2BCKLkDKkjQf5OWwKWUKj1lgs3lFI4PxnR5lg= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosiner/argv v0.1.0/go.mod h1:EusR6TucWKX+zFgtdUsKT2Cvg45K5rtpCcWz4hK06d8= @@ -294,6 +311,7 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -302,13 +320,16 @@ github.com/esimonov/ifshort v1.0.2/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= -github.com/filecoin-project/go-address v0.0.5 h1:SSaFT/5aLfPXycUlFyemoHYhRgdyXClXCyDdNJKPlDM= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= +github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349 h1:pIuR0dnMD0i+as8wNnjjHyQrnhP5O5bmba/lmgQeRgU= github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349/go.mod h1:vgmwKBkx+ca5OIeEvstiQgzAZnb7R6QaqE1oEDSqa6g= @@ -322,19 +343,21 @@ github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQj github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-cbor-util v0.0.0-20201016124514-d0bbec7bfcc4 h1:YmE80qPn5K0txSqxnRNiCRAWyXI1LTO//I4c4H0QwbM= -github.com/filecoin-project/go-cbor-util v0.0.0-20201016124514-d0bbec7bfcc4/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= +github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= +github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-commp-utils v0.1.3 h1:rTxbkNXZU7FLgdkBk8RsQIEOuPONHykEoX3xGk41Fkw= github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9ANQrY3fDFoXdqyX04J+dWpK30= -github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= +github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.12.1 h1:gAznAZKySVs2FS6T/vDq7R3f0DewLnxeROe0oOE6bZU= github.com/filecoin-project/go-data-transfer v1.12.1/go.mod h1:j3HL645YiQFxcM+q7uPlGApILSqeweDABNgZQP7pDYU= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= -github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= +github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= +github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -345,8 +368,8 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBw github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543 h1:aMJGfgqe1QDhAVwxRg5fjCRF533xHidiKsugk7Vvzug= github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543/go.mod h1:mjrHv1cDGJWDlGmC0eDc1E5VJr8DmL9XMUcaFwiuKg8= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= -github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 h1:+nripp+UI/rhl01w9Gs4V0XDGaVPYPMGU/D/gNVLue0= -github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-paramfetch v0.0.4 h1:H+Me8EL8T5+79z/KHYQQcT8NVOzYVqXIi7nhb48tdm8= +github.com/filecoin-project/go-paramfetch v0.0.4/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= @@ -381,8 +404,8 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/g github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsGGCE+NumpF6aiBoU/2X5W4= github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= -github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= -github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= +github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= +github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578 h1:RpiHYKzuEnWoPhp2HO7sVC8QY78TZIpO4dhbp0g/g+A= @@ -390,9 +413,11 @@ github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578/go.m github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= @@ -405,8 +430,9 @@ github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/fzipp/gocyclo v0.3.1 h1:A9UeX3HJSXTBzvHzhqoYVuE0eAhe+aM8XBCCwsPMZOc= github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= -github.com/gbrlsnchs/jwt/v3 v3.0.0 h1:gtPjdT3gAbBLjVckJsgNf+a46sqrCBfRebg2r/NysIo= github.com/gbrlsnchs/jwt/v3 v3.0.0/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= +github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= +github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/getkin/kin-openapi v0.13.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s+pcEVXFuAjw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -426,14 +452,17 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -github.com/go-kit/log v0.1.0 h1:DGJh0Sm43HbOeYDNnVZFl8BvcYVvjD5bqYJvp0REbwQ= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.1 h1:DX7uPQ4WgAWfoh+NGGlbJQswnYIVvz0SRlLS3rPZQDA= github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -462,7 +491,6 @@ github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -486,12 +514,14 @@ github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYw github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo= github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968 h1:s+PDl6lozQ+dEUtUtQnO7+A2iPG3sK1pI4liU+jxn90= github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY= github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -508,6 +538,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/gogo/status v1.0.3/go.mod h1:SavQ51ycCLnc7dGyJxp8YAmudx8xqiVrRf+6IXRsugc= github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -549,8 +581,8 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf h1:gFVkHXmVAhEbxZVDln5V9GKrLaluNoFHDbrZwAWZgws= -github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= @@ -685,18 +717,27 @@ github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4n github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e/go.mod h1:I8h3MITA53gN9OnWGCgaMa0JWVRdXthWw4M3CPM54OY= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -711,8 +752,11 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+gRZDtmTJkAs= github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c h1:aY2hhxLhjEAbfXOx2nRJxCXezC6CO2V/yN+OCr1srtk= github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= @@ -720,6 +764,7 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= @@ -732,6 +777,7 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/influxdata/influxdb-client-go/v2 v2.2.2 h1:O0CGIuIwQafvAxttAJ/VqMKfbWWn2Mt8rbOmaM2Zj4w= github.com/influxdata/influxdb-client-go/v2 v2.2.2/go.mod h1:fa/d1lAdUHxuc1jedx30ZfNG573oQTQmUni3N6pcW+0= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab h1:+Jov61TTljdzTKBecQizmUWJ6IIoVgzjukKppVr5TgI= @@ -830,8 +876,9 @@ github.com/ipfs/go-ipfs-exchange-offline v0.1.1 h1:mEiXWdbMN6C7vtDG21Fphx8TGCbZP github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-files v0.0.8 h1:8o0oFJkJ8UkO/ABl8T6ac6tKF3+NIpj67aAB6ZpusRg= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= +github.com/ipfs/go-ipfs-files v0.0.9 h1:OFyOfmuVDu9c5YtjSDORmwXzE6fmZikzZpzsnNkgFEg= +github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= @@ -893,8 +940,9 @@ github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68 github.com/ipfs/go-peertaskqueue v0.7.1 h1:7PLjon3RZwRQMgOTvYccZ+mjzkmds/7YzSWKFlBAypE= github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= -github.com/ipfs/go-unixfs v0.2.4 h1:6NwppOXefWIyysZ4LR/qUBPvXd5//8J3jiMdvpbw6Lo= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= +github.com/ipfs/go-unixfs v0.2.6 h1:gq3U3T2vh8x6tXhfo3uSO3n+2z4yW0tYtNgVP/3sIyA= +github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= @@ -963,8 +1011,9 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -976,6 +1025,7 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/julz/importas v0.0.0-20210228071311-d0bf5cb4e1db h1:ZmwBthGFMVAieuVpLzuedUH9l4pY/0iFG16DN9dS38o= github.com/julz/importas v0.0.0-20210228071311-d0bf5cb4e1db/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3/go.mod h1:BYpt4ufZiIGv2nXn4gMxnfKV306n3mWXgNu/d2TqdTU= github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= @@ -993,8 +1043,10 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.7 h1:0hzRabrMN4tSTvMfnL3SCv1ZGeAP23ynzodBgaHeMeg= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -1400,8 +1452,10 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -1440,6 +1494,7 @@ github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyex github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= @@ -1455,6 +1510,8 @@ github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdn github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= @@ -1463,6 +1520,7 @@ github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -1473,8 +1531,8 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo= +github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mmcloughlin/avo v0.0.0-20201105074841-5d2f697d268f/go.mod h1:6aKT4zZIrpGqB3RpFU14ByCSSyKY6LfJz4J/JJChHfI= @@ -1482,8 +1540,9 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/moricho/tparallel v0.2.1 h1:95FytivzT6rYzdJLdtfn6m1bfFJylOJK41+lgv/EHf4= github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= @@ -1512,8 +1571,9 @@ github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI= github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= -github.com/multiformats/go-multiaddr v0.4.0 h1:hL/K4ZJhJ5PTw3nwylq9lGU5yArzcAroZmex1ghSEkQ= github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= +github.com/multiformats/go-multiaddr v0.4.1 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= +github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= @@ -1566,10 +1626,16 @@ github.com/nakabonne/nestif v0.3.0 h1:+yOViDGhg8ygGrmII72nV9B/zGxY188TYpfolntsaP github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= +github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= @@ -1638,8 +1704,10 @@ github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTm github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= @@ -1648,6 +1716,7 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v0.0.0-20170317030525-88609521dc4b/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= @@ -1671,12 +1740,14 @@ github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXx github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f h1:xAw10KgJqG5NJDfmRqJ05Z0IFblKumjtMeyiOLxj3+4= github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= @@ -1859,8 +1930,10 @@ github.com/ssgreg/nlreturn/v2 v2.1.0 h1:6/s4Rc49L6Uo6RLjhWZGBpWWjfzk2yrf1nIW8m4w github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a h1:AhmOdSHeswKHBjhsLs/7+1voOxT+LLrSk/Nxvk35fug= +github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e h1:mOtuXaRAbVZsxAHVdPR3IjfmN8T1h2iczJLynhLybf8= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= @@ -1898,6 +1971,7 @@ github.com/tomarrell/wrapcheck v1.0.0/go.mod h1:Bd3i1FaEKe3XmcPoHhNQ+HM0S8P6eIXo github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= github.com/tommy-muehle/go-mnd/v2 v2.3.1 h1:a1S4+4HSXDJMgeODJH/t0EEKxcVla6Tasw+Zx9JJMog= github.com/tommy-muehle/go-mnd/v2 v2.3.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.0/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.23.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= @@ -1959,8 +2033,10 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200810223238-211df3b9e24c/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2 h1:bsUlNhdmbtlfdLVXAVfuvKQ01RnWAM09TVrJkI7NZs4= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 h1:TEv7MId88TyIqIUL4hbf9otOookIolMxlEbN0ro671Y= +github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= @@ -2014,6 +2090,10 @@ go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -2050,8 +2130,9 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -2065,9 +2146,11 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= @@ -2094,6 +2177,7 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2101,6 +2185,7 @@ golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2109,12 +2194,18 @@ golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e h1:VvfwVmMH40bpMeizC9/K7ipM5Qjucuu16RWfneFPyhQ= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA= +golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= @@ -2126,6 +2217,7 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5 h1:FR+oGxGfbQu1d+jglI3rCkjAjUnhRSZcUxr+DqlDLNo= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -2138,8 +2230,8 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -2215,8 +2307,10 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2253,6 +2347,7 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2278,6 +2373,7 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190902133755-9109b7679e13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2327,6 +2423,7 @@ golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2336,8 +2433,9 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= +golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -2354,8 +2452,9 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2365,6 +2464,7 @@ golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -2381,6 +2481,7 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2453,13 +2554,19 @@ golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= @@ -2533,8 +2640,10 @@ google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 h1:PDIOdWxZ8eRizhKa1AAvY53xsvLB1cWorMjslvY3VA8= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 h1:ysnBoUyeL/H6RCvNRhWHjKoDEmguI+mPU+qHgK8qv/w= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2563,6 +2672,7 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -2662,6 +2772,7 @@ rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index 84de1abfde..2889ea17a6 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -345,7 +345,6 @@ github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQj github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-cbor-util v0.0.0-20201016124514-d0bbec7bfcc4/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-commp-utils v0.1.3 h1:rTxbkNXZU7FLgdkBk8RsQIEOuPONHykEoX3xGk41Fkw= @@ -380,6 +379,7 @@ github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.m github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-paramfetch v0.0.4/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= @@ -419,8 +419,9 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/g github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsGGCE+NumpF6aiBoU/2X5W4= github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= -github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= +github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= +github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578/go.mod h1:/cbLZYvQhinVFUG4TP2Uy1o7LtF+guT21qZIMTmKk0g= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -583,7 +584,6 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= @@ -1549,7 +1549,6 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= @@ -2446,7 +2445,6 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= From 9b3b33aa55dcdc6ee1086331061251e5d6e995e8 Mon Sep 17 00:00:00 2001 From: Tiance <40375298+diwufeiwen@users.noreply.github.com> Date: Tue, 15 Feb 2022 16:36:33 +0800 Subject: [PATCH 148/167] pick venus-gateway def & api (#4769) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 一页素书 <2931107265@qq.com> --- venus-devtool/api-gen/common.go | 11 ++++++ venus-devtool/api-gen/example.go | 3 ++ venus-shared/api/gateway/api.go | 12 +++++++ venus-shared/api/gateway/client_gen.go | 24 +++++++++++++ venus-shared/api/gateway/method.md | 49 ++++++++++++++++++++++++++ venus-shared/api/gateway/proxy_gen.go | 22 ++++++++++++ venus-shared/types/gateway/event.go | 27 ++++++++++++++ venus-shared/types/gateway/request.go | 29 +++++++++++++++ 8 files changed, 177 insertions(+) create mode 100644 venus-shared/api/gateway/api.go create mode 100644 venus-shared/api/gateway/client_gen.go create mode 100644 venus-shared/api/gateway/method.md create mode 100644 venus-shared/api/gateway/proxy_gen.go create mode 100644 venus-shared/types/gateway/event.go create mode 100644 venus-shared/types/gateway/request.go diff --git a/venus-devtool/api-gen/common.go b/venus-devtool/api-gen/common.go index aa68f1395f..17ff60ee27 100644 --- a/venus-devtool/api-gen/common.go +++ b/venus-devtool/api-gen/common.go @@ -9,6 +9,7 @@ import ( "reflect" "github.com/filecoin-project/venus/venus-devtool/util" + "github.com/filecoin-project/venus/venus-shared/api/gateway" "github.com/filecoin-project/venus/venus-shared/api/messager" "github.com/filecoin-project/venus/venus-shared/api/wallet" ) @@ -29,6 +30,16 @@ func init() { MethodNamespace: "Message", }, }, + util.APIMeta{ + Type: reflect.TypeOf((*gateway.IProofEventAPI)(nil)).Elem(), + ParseOpt: util.InterfaceParseOption{ + ImportPath: "github.com/filecoin-project/venus/venus-shared/api/gateway", + IncludeAll: true, + }, + RPCMeta: util.RPCMeta{ + MethodNamespace: "Gateway", + }, + }, util.APIMeta{ Type: reflect.TypeOf((*wallet.IFullAPI)(nil)).Elem(), ParseOpt: util.InterfaceParseOption{ diff --git a/venus-devtool/api-gen/example.go b/venus-devtool/api-gen/example.go index 00b385a686..6a69cf1787 100644 --- a/venus-devtool/api-gen/example.go +++ b/venus-devtool/api-gen/example.go @@ -267,6 +267,9 @@ func exampleStruct(method string, t, parent reflect.Type) interface{} { if f.Type == parent { continue } + if f.Type.Kind() == reflect.Chan { + continue + } if strings.Title(f.Name) == f.Name { ns.Elem().Field(i).Set(reflect.ValueOf(ExampleValue(method, f.Type, t))) } diff --git a/venus-shared/api/gateway/api.go b/venus-shared/api/gateway/api.go new file mode 100644 index 0000000000..efb5f9ff41 --- /dev/null +++ b/venus-shared/api/gateway/api.go @@ -0,0 +1,12 @@ +package gateway + +import ( + "context" + + "github.com/filecoin-project/venus/venus-shared/types/gateway" +) + +type IProofEventAPI interface { + ResponseProofEvent(ctx context.Context, resp *gateway.ResponseEvent) error //perm:write + ListenProofEvent(ctx context.Context, policy *gateway.ProofRegisterPolicy) (<-chan *gateway.RequestEvent, error) //perm:write +} diff --git a/venus-shared/api/gateway/client_gen.go b/venus-shared/api/gateway/client_gen.go new file mode 100644 index 0000000000..ad98a81b3b --- /dev/null +++ b/venus-shared/api/gateway/client_gen.go @@ -0,0 +1,24 @@ +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package gateway + +import ( + "context" + "net/http" + + "github.com/filecoin-project/go-jsonrpc" + + "github.com/filecoin-project/venus/venus-shared/api" +) + +// NewIProofEventAPIRPC creates a new httpparse jsonrpc remotecli. +func NewIProofEventAPIRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (IProofEventAPI, jsonrpc.ClientCloser, error) { + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, "gateway.IProofEventAPI") + + var res IProofEventAPIStruct + closer, err := jsonrpc.NewMergeClient(ctx, addr, "Gateway", api.GetInternalStructs(&res), requestHeader, opts...) + + return &res, closer, err +} diff --git a/venus-shared/api/gateway/method.md b/venus-shared/api/gateway/method.md new file mode 100644 index 0000000000..b0429b5312 --- /dev/null +++ b/venus-shared/api/gateway/method.md @@ -0,0 +1,49 @@ +# Groups + +* [ProofEvent](#ProofEvent) + * [ListenProofEvent](#ListenProofEvent) + * [ResponseProofEvent](#ResponseProofEvent) + +## ProofEvent + +### ListenProofEvent + + +Perms: write + +Inputs: +```json +[ + { + "MinerAddress": "f01234" + } +] +``` + +Response: +```json +{ + "Id": "07070707-0707-0707-0707-070707070707", + "Method": "string value", + "Payload": "Ynl0ZSBhcnJheQ==" +} +``` + +### ResponseProofEvent + + +Perms: write + +Inputs: +```json +[ + { + "Id": "07070707-0707-0707-0707-070707070707", + "Payload": "Ynl0ZSBhcnJheQ==", + "Error": "string value" + } +] +``` + +Response: `{}` + diff --git a/venus-shared/api/gateway/proxy_gen.go b/venus-shared/api/gateway/proxy_gen.go new file mode 100644 index 0000000000..c7f0f85f3b --- /dev/null +++ b/venus-shared/api/gateway/proxy_gen.go @@ -0,0 +1,22 @@ +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package gateway + +import ( + "context" + + "github.com/filecoin-project/venus/venus-shared/types/gateway" +) + +type IProofEventAPIStruct struct { + Internal struct { + ListenProofEvent func(ctx context.Context, policy *gateway.ProofRegisterPolicy) (<-chan *gateway.RequestEvent, error) `perm:"write"` + ResponseProofEvent func(ctx context.Context, resp *gateway.ResponseEvent) error `perm:"write"` + } +} + +func (s *IProofEventAPIStruct) ListenProofEvent(p0 context.Context, p1 *gateway.ProofRegisterPolicy) (<-chan *gateway.RequestEvent, error) { + return s.Internal.ListenProofEvent(p0, p1) +} +func (s *IProofEventAPIStruct) ResponseProofEvent(p0 context.Context, p1 *gateway.ResponseEvent) error { + return s.Internal.ResponseProofEvent(p0, p1) +} diff --git a/venus-shared/types/gateway/event.go b/venus-shared/types/gateway/event.go new file mode 100644 index 0000000000..f0f5b01b38 --- /dev/null +++ b/venus-shared/types/gateway/event.go @@ -0,0 +1,27 @@ +package gateway + +import ( + "time" + + "github.com/google/uuid" + + "github.com/filecoin-project/go-address" +) + +type ProofRegisterPolicy struct { + MinerAddress address.Address +} + +type RequestEvent struct { + Id uuid.UUID // nolint + Method string + Payload []byte + CreateTime time.Time `json:"-"` + Result chan *ResponseEvent `json:"-"` +} + +type ResponseEvent struct { + Id uuid.UUID // nolint + Payload []byte + Error string +} diff --git a/venus-shared/types/gateway/request.go b/venus-shared/types/gateway/request.go new file mode 100644 index 0000000000..98fd0ef30d --- /dev/null +++ b/venus-shared/types/gateway/request.go @@ -0,0 +1,29 @@ +package gateway + +import ( + "github.com/google/uuid" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" + + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + sharedTypes "github.com/filecoin-project/venus/venus-shared/types" +) + +type ComputeProofRequest struct { + SectorInfos []builtin.ExtendedSectorInfo + Rand abi.PoStRandomness + Height abi.ChainEpoch + NWVersion network.Version +} + +type ConnectedCompleted struct { + ChannelId uuid.UUID // nolint +} + +type WalletSignRequest struct { + Signer address.Address + ToSign []byte + Meta sharedTypes.MsgMeta +} From 2bc87f436f87d39acb90cb6085086c08f32b6e6d Mon Sep 17 00:00:00 2001 From: Caesar Wang Date: Wed, 16 Feb 2022 11:23:35 +0800 Subject: [PATCH 149/167] feat: extend api & types from venus-gateway (#4770) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: extend api & types from venus-gateway * CI: fix apt install failed Co-authored-by: 一页素书 <2931107265@qq.com> --- .github/workflows/baisc_checks.yml | 2 +- go.mod | 2 +- go.sum | 4 +- venus-devtool/api-gen/common.go | 16 +- venus-devtool/api-gen/doc_gen.go | 2 +- venus-devtool/api-gen/example.go | 43 +- venus-devtool/go.mod | 1 + venus-devtool/go.sum | 2 + venus-shared/api/gateway/v1/api.go | 7 + venus-shared/api/gateway/v1/client_gen.go | 24 + venus-shared/api/gateway/v1/market_event.go | 22 + venus-shared/api/gateway/v1/method.md | 472 ++++++++++++++++++ venus-shared/api/gateway/v1/proof_event.go | 21 + venus-shared/api/gateway/v1/proxy_gen.go | 118 +++++ venus-shared/api/gateway/v1/wallet_event.go | 24 + venus-shared/types/gateway/common.go | 39 ++ venus-shared/types/gateway/event.go | 27 - venus-shared/types/gateway/market_event.go | 39 ++ .../gateway/{request.go => proof_event.go} | 22 +- venus-shared/types/gateway/wallet_event.go | 25 + 20 files changed, 850 insertions(+), 62 deletions(-) create mode 100644 venus-shared/api/gateway/v1/api.go create mode 100644 venus-shared/api/gateway/v1/client_gen.go create mode 100644 venus-shared/api/gateway/v1/market_event.go create mode 100644 venus-shared/api/gateway/v1/method.md create mode 100644 venus-shared/api/gateway/v1/proof_event.go create mode 100644 venus-shared/api/gateway/v1/proxy_gen.go create mode 100644 venus-shared/api/gateway/v1/wallet_event.go create mode 100644 venus-shared/types/gateway/common.go delete mode 100644 venus-shared/types/gateway/event.go create mode 100644 venus-shared/types/gateway/market_event.go rename venus-shared/types/gateway/{request.go => proof_event.go} (61%) create mode 100644 venus-shared/types/gateway/wallet_event.go diff --git a/.github/workflows/baisc_checks.yml b/.github/workflows/baisc_checks.yml index 7c25ad1405..452e7fc76f 100644 --- a/.github/workflows/baisc_checks.yml +++ b/.github/workflows/baisc_checks.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest steps: - name: dependencies - run: sudo apt install mesa-opencl-icd ocl-icd-opencl-dev gcc git bzr jq pkg-config curl clang build-essential hwloc libhwloc-dev wget -y + run: sudo apt update & sudo apt upgrade & sudo apt install --reinstall mesa-opencl-icd ocl-icd-opencl-dev gcc git bzr jq pkg-config curl clang build-essential hwloc libhwloc-dev wget -y - uses: actions/checkout@v2 with: diff --git a/go.mod b/go.mod index 9c150c4a94..99d5b1ed79 100644 --- a/go.mod +++ b/go.mod @@ -59,7 +59,7 @@ require ( github.com/hashicorp/golang-lru v0.5.4 github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c github.com/ipfs-force-community/metrics v1.0.1-0.20211022060227-11142a08b729 - github.com/ipfs-force-community/venus-common-utils v0.0.0-20210714054928-2042a9040759 + github.com/ipfs-force-community/venus-common-utils v0.0.0-20210924063144-1d3a5b30de87 github.com/ipfs/go-bitswap v0.5.1 github.com/ipfs/go-block-format v0.0.3 github.com/ipfs/go-blockservice v0.2.1 diff --git a/go.sum b/go.sum index d63f59c558..53be14e623 100644 --- a/go.sum +++ b/go.sum @@ -787,8 +787,8 @@ github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc/ github.com/ipfs-force-community/metrics v1.0.0/go.mod h1:mn40SioMuKtjmRumHFy/fJ26Pn028XuDjUJE9dorjyw= github.com/ipfs-force-community/metrics v1.0.1-0.20211022060227-11142a08b729 h1:elS3KmzAMVrcZpmP2RMEjs9Zlwh6LfhJTfYQdj4TREs= github.com/ipfs-force-community/metrics v1.0.1-0.20211022060227-11142a08b729/go.mod h1:mn40SioMuKtjmRumHFy/fJ26Pn028XuDjUJE9dorjyw= -github.com/ipfs-force-community/venus-common-utils v0.0.0-20210714054928-2042a9040759 h1:dI1FSoq0C85B1Y+G2ZYrhf5TeIkumzmtz4tjakoqSxU= -github.com/ipfs-force-community/venus-common-utils v0.0.0-20210714054928-2042a9040759/go.mod h1:AWIt7L1UiUeIzqQdjQ/quZcVcCdnr6GXabGLBgEIMzU= +github.com/ipfs-force-community/venus-common-utils v0.0.0-20210924063144-1d3a5b30de87 h1:1PTFrWfxN5b8y1Cnw403PZ9Gy5RLHN4FXmUM4nTt9Yg= +github.com/ipfs-force-community/venus-common-utils v0.0.0-20210924063144-1d3a5b30de87/go.mod h1:RTVEOzM+hkpqmcEWpyLDkx1oGO5r9ZWCgYxG/CsXzJQ= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= diff --git a/venus-devtool/api-gen/common.go b/venus-devtool/api-gen/common.go index 17ff60ee27..4dc1025e71 100644 --- a/venus-devtool/api-gen/common.go +++ b/venus-devtool/api-gen/common.go @@ -9,7 +9,7 @@ import ( "reflect" "github.com/filecoin-project/venus/venus-devtool/util" - "github.com/filecoin-project/venus/venus-shared/api/gateway" + gatewayv1 "github.com/filecoin-project/venus/venus-shared/api/gateway/v1" "github.com/filecoin-project/venus/venus-shared/api/messager" "github.com/filecoin-project/venus/venus-shared/api/wallet" ) @@ -31,21 +31,21 @@ func init() { }, }, util.APIMeta{ - Type: reflect.TypeOf((*gateway.IProofEventAPI)(nil)).Elem(), + Type: reflect.TypeOf((*wallet.IFullAPI)(nil)).Elem(), ParseOpt: util.InterfaceParseOption{ - ImportPath: "github.com/filecoin-project/venus/venus-shared/api/gateway", + ImportPath: "github.com/filecoin-project/venus/venus-shared/api/wallet", IncludeAll: true, }, - RPCMeta: util.RPCMeta{ - MethodNamespace: "Gateway", - }, }, util.APIMeta{ - Type: reflect.TypeOf((*wallet.IFullAPI)(nil)).Elem(), + Type: reflect.TypeOf((*gatewayv1.IGateway)(nil)).Elem(), ParseOpt: util.InterfaceParseOption{ - ImportPath: "github.com/filecoin-project/venus/venus-shared/api/wallet", + ImportPath: "github.com/filecoin-project/venus/venus-shared/api/gateway/v1", IncludeAll: true, }, + RPCMeta: util.RPCMeta{ + MethodNamespace: "Gateway", + }, }, ) } diff --git a/venus-devtool/api-gen/doc_gen.go b/venus-devtool/api-gen/doc_gen.go index d2155e8f44..52cca5867f 100644 --- a/venus-devtool/api-gen/doc_gen.go +++ b/venus-devtool/api-gen/doc_gen.go @@ -116,7 +116,7 @@ func fillExampleValue(m reflect.Method) ([]byte, []byte, error) { out := ExampleValue(m.Name, ft.Out(0), nil) if out == nil { - return nil, nil, fmt.Errorf("ExampleValue for %s get nil\n", ft.Out(0).String()) + return nil, nil, fmt.Errorf("ExampleValue for %s get nil", ft.Out(0).String()) } // json: unsupported type: map[address.Address]*types.Actor, so return {} if _, ok := out.(map[address.Address]*types.Actor); ok { diff --git a/venus-devtool/api-gen/example.go b/venus-devtool/api-gen/example.go index 6a69cf1787..1d536bd09c 100644 --- a/venus-devtool/api-gen/example.go +++ b/venus-devtool/api-gen/example.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "go/token" "os" "reflect" "strings" @@ -15,11 +16,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/exitcode" - "github.com/filecoin-project/venus/pkg/constants" - "github.com/filecoin-project/venus/venus-shared/api" - "github.com/filecoin-project/venus/venus-shared/types" - "github.com/filecoin-project/venus/venus-shared/types/messager" - "github.com/filecoin-project/venus/venus-shared/types/wallet" + commontypes "github.com/ipfs-force-community/venus-common-utils/types" "github.com/ipfs/go-cid" "github.com/ipfs/go-graphsync" textselector "github.com/ipld/go-ipld-selector-text-lite" @@ -29,6 +26,12 @@ import ( "github.com/libp2p/go-libp2p-core/protocol" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/multiformats/go-multiaddr" + + "github.com/filecoin-project/venus/pkg/constants" + "github.com/filecoin-project/venus/venus-shared/api" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/venus/venus-shared/types/messager" + "github.com/filecoin-project/venus/venus-shared/types/wallet" ) var ExampleValues = map[reflect.Type]interface{}{ @@ -217,6 +220,9 @@ func init() { // wallet addExample(wallet.MEChainMsg) + + // used in gateway + addExample(commontypes.PaddedByteIndex(10)) } func ExampleValue(method string, t, parent reflect.Type) interface{} { @@ -264,12 +270,10 @@ func exampleStruct(method string, t, parent reflect.Type) interface{} { ns := reflect.New(t) for i := 0; i < t.NumField(); i++ { f := t.Field(i) - if f.Type == parent { - continue - } - if f.Type.Kind() == reflect.Chan { + if shouldIgnoreField(f, parent) { continue } + if strings.Title(f.Name) == f.Name { ns.Elem().Field(i).Set(reflect.ValueOf(ExampleValue(method, f.Type, t))) } @@ -277,3 +281,24 @@ func exampleStruct(method string, t, parent reflect.Type) interface{} { return ns.Interface() } + +func shouldIgnoreField(f reflect.StructField, parentType reflect.Type) bool { + if f.Type == parentType { + return true + } + + if len(f.Name) == 0 { + return true + } + + if !token.IsExported(f.Name) { + return true + } + + jtag := f.Tag.Get("json") + if len(jtag) == 0 { + return false + } + + return strings.Split(jtag, ",")[0] == "-" +} diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index 5dc015c249..c0c647c514 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -12,6 +12,7 @@ require ( github.com/filecoin-project/go-state-types v0.1.3 github.com/filecoin-project/lotus v1.13.3-0.20220112013034-7559e4311ea0 github.com/filecoin-project/venus v0.0.0-00010101000000-000000000000 + github.com/ipfs-force-community/venus-common-utils v0.0.0-20210924063144-1d3a5b30de87 // indirect github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-graphsync v0.11.5 github.com/ipfs/go-ipfs-http-client v0.1.0 // indirect diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index 2889ea17a6..24db508dc0 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -771,6 +771,8 @@ github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc/ github.com/ipfs-force-community/metrics v1.0.0/go.mod h1:mn40SioMuKtjmRumHFy/fJ26Pn028XuDjUJE9dorjyw= github.com/ipfs-force-community/metrics v1.0.1-0.20211022060227-11142a08b729/go.mod h1:mn40SioMuKtjmRumHFy/fJ26Pn028XuDjUJE9dorjyw= github.com/ipfs-force-community/venus-common-utils v0.0.0-20210714054928-2042a9040759/go.mod h1:AWIt7L1UiUeIzqQdjQ/quZcVcCdnr6GXabGLBgEIMzU= +github.com/ipfs-force-community/venus-common-utils v0.0.0-20210924063144-1d3a5b30de87 h1:1PTFrWfxN5b8y1Cnw403PZ9Gy5RLHN4FXmUM4nTt9Yg= +github.com/ipfs-force-community/venus-common-utils v0.0.0-20210924063144-1d3a5b30de87/go.mod h1:RTVEOzM+hkpqmcEWpyLDkx1oGO5r9ZWCgYxG/CsXzJQ= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= diff --git a/venus-shared/api/gateway/v1/api.go b/venus-shared/api/gateway/v1/api.go new file mode 100644 index 0000000000..537ed77210 --- /dev/null +++ b/venus-shared/api/gateway/v1/api.go @@ -0,0 +1,7 @@ +package gateway + +type IGateway interface { + IProofEvent + IWalletEvent + IMarketEvent +} diff --git a/venus-shared/api/gateway/v1/client_gen.go b/venus-shared/api/gateway/v1/client_gen.go new file mode 100644 index 0000000000..52f1c0e791 --- /dev/null +++ b/venus-shared/api/gateway/v1/client_gen.go @@ -0,0 +1,24 @@ +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package gateway + +import ( + "context" + "net/http" + + "github.com/filecoin-project/go-jsonrpc" + + "github.com/filecoin-project/venus/venus-shared/api" +) + +// NewIGatewayRPC creates a new httpparse jsonrpc remotecli. +func NewIGatewayRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (IGateway, jsonrpc.ClientCloser, error) { + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, "gateway.IGateway") + + var res IGatewayStruct + closer, err := jsonrpc.NewMergeClient(ctx, addr, "Gateway", api.GetInternalStructs(&res), requestHeader, opts...) + + return &res, closer, err +} diff --git a/venus-shared/api/gateway/v1/market_event.go b/venus-shared/api/gateway/v1/market_event.go new file mode 100644 index 0000000000..8702bc4019 --- /dev/null +++ b/venus-shared/api/gateway/v1/market_event.go @@ -0,0 +1,22 @@ +package gateway + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/specs-storage/storage" + types2 "github.com/ipfs-force-community/venus-common-utils/types" + "github.com/ipfs/go-cid" + + gtypes "github.com/filecoin-project/venus/venus-shared/types/gateway" +) + +type IMarketEvent interface { + ListMarketConnectionsState(ctx context.Context) ([]gtypes.MarketConnectionState, error) //perm:admin + IsUnsealed(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types2.PaddedByteIndex, size abi.PaddedPieceSize) (bool, error) //perm:admin + SectorsUnsealPiece(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types2.PaddedByteIndex, size abi.PaddedPieceSize, dest string) error //perm:admin + + ResponseMarketEvent(ctx context.Context, resp *gtypes.ResponseEvent) error //perm:read + ListenMarketEvent(ctx context.Context, policy *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) //perm:read +} diff --git a/venus-shared/api/gateway/v1/method.md b/venus-shared/api/gateway/v1/method.md new file mode 100644 index 0000000000..b05476055a --- /dev/null +++ b/venus-shared/api/gateway/v1/method.md @@ -0,0 +1,472 @@ +# Groups + +* [MarketEvent](#MarketEvent) + * [IsUnsealed](#IsUnsealed) + * [ListMarketConnectionsState](#ListMarketConnectionsState) + * [ListenMarketEvent](#ListenMarketEvent) + * [ResponseMarketEvent](#ResponseMarketEvent) + * [SectorsUnsealPiece](#SectorsUnsealPiece) +* [ProofEvent](#ProofEvent) + * [ComputeProof](#ComputeProof) + * [ListConnectedMiners](#ListConnectedMiners) + * [ListMinerConnection](#ListMinerConnection) + * [ListenProofEvent](#ListenProofEvent) + * [ResponseProofEvent](#ResponseProofEvent) +* [WalletEvent](#WalletEvent) + * [AddNewAddress](#AddNewAddress) + * [ListWalletInfo](#ListWalletInfo) + * [ListWalletInfoByWallet](#ListWalletInfoByWallet) + * [ListenWalletEvent](#ListenWalletEvent) + * [RemoveAddress](#RemoveAddress) + * [ResponseWalletEvent](#ResponseWalletEvent) + * [SupportNewAccount](#SupportNewAccount) + * [WalletHas](#WalletHas) + * [WalletSign](#WalletSign) + +## MarketEvent + +### IsUnsealed + + +Perms: admin + +Inputs: +```json +[ + "f01234", + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "ID": { + "Miner": 1000, + "Number": 9 + }, + "ProofType": 8 + }, + 10, + 1032 +] +``` + +Response: `true` + +### ListMarketConnectionsState + + +Perms: admin + +Inputs: `[]` + +Response: +```json +[ + { + "Addr": "f01234", + "Conn": { + "Connections": [ + { + "Addrs": [ + "f01234" + ], + "ChannelId": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Ip": "string value", + "RequestCount": 123, + "CreateTime": "0001-01-01T00:00:00Z" + } + ], + "ConnectionCount": 123 + } + } +] +``` + +### ListenMarketEvent + + +Perms: read + +Inputs: +```json +[ + { + "Miner": "f01234" + } +] +``` + +Response: +```json +{ + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Method": "string value", + "Payload": "Ynl0ZSBhcnJheQ==" +} +``` + +### ResponseMarketEvent + + +Perms: read + +Inputs: +```json +[ + { + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Payload": "Ynl0ZSBhcnJheQ==", + "Error": "string value" + } +] +``` + +Response: `{}` + +### SectorsUnsealPiece + + +Perms: admin + +Inputs: +```json +[ + "f01234", + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "ID": { + "Miner": 1000, + "Number": 9 + }, + "ProofType": 8 + }, + 10, + 1032, + "string value" +] +``` + +Response: `{}` + +## ProofEvent + +### ComputeProof + + +Perms: admin + +Inputs: +```json +[ + "f01234", + [ + { + "SealProof": 8, + "SectorNumber": 9, + "SectorKey": null, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ], + "Bw==", + 10101, + 15 +] +``` + +Response: +```json +[ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } +] +``` + +### ListConnectedMiners + + +Perms: admin + +Inputs: `[]` + +Response: +```json +[ + "f01234" +] +``` + +### ListMinerConnection + + +Perms: admin + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +{ + "Connections": [ + { + "Addrs": [ + "f01234" + ], + "ChannelId": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Ip": "string value", + "RequestCount": 123, + "CreateTime": "0001-01-01T00:00:00Z" + } + ], + "ConnectionCount": 123 +} +``` + +### ListenProofEvent + + +Perms: read + +Inputs: +```json +[ + { + "MinerAddress": "f01234" + } +] +``` + +Response: +```json +{ + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Method": "string value", + "Payload": "Ynl0ZSBhcnJheQ==" +} +``` + +### ResponseProofEvent + + +Perms: read + +Inputs: +```json +[ + { + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Payload": "Ynl0ZSBhcnJheQ==", + "Error": "string value" + } +] +``` + +Response: `{}` + +## WalletEvent + +### AddNewAddress + + +Perms: read + +Inputs: +```json +[ + "e26f1e5c-47f7-4561-a11d-18fab6e748af", + [ + "f01234" + ] +] +``` + +Response: `{}` + +### ListWalletInfo + + +Perms: admin + +Inputs: `[]` + +Response: +```json +[ + { + "Account": "string value", + "SupportAccounts": [ + "string value" + ], + "ConnectStates": [ + { + "Addrs": [ + "f01234" + ], + "ChannelId": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Ip": "string value", + "RequestCount": 123, + "CreateTime": "0001-01-01T00:00:00Z" + } + ] + } +] +``` + +### ListWalletInfoByWallet + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "Account": "string value", + "SupportAccounts": [ + "string value" + ], + "ConnectStates": [ + { + "Addrs": [ + "f01234" + ], + "ChannelId": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Ip": "string value", + "RequestCount": 123, + "CreateTime": "0001-01-01T00:00:00Z" + } + ] +} +``` + +### ListenWalletEvent + + +Perms: read + +Inputs: +```json +[ + { + "SupportAccounts": [ + "string value" + ], + "SignBytes": "Ynl0ZSBhcnJheQ==" + } +] +``` + +Response: +```json +{ + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Method": "string value", + "Payload": "Ynl0ZSBhcnJheQ==" +} +``` + +### RemoveAddress + + +Perms: read + +Inputs: +```json +[ + "e26f1e5c-47f7-4561-a11d-18fab6e748af", + [ + "f01234" + ] +] +``` + +Response: `{}` + +### ResponseWalletEvent + + +Perms: read + +Inputs: +```json +[ + { + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Payload": "Ynl0ZSBhcnJheQ==", + "Error": "string value" + } +] +``` + +Response: `{}` + +### SupportNewAccount + + +Perms: read + +Inputs: +```json +[ + "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "string value" +] +``` + +Response: `{}` + +### WalletHas + + +Perms: admin + +Inputs: +```json +[ + "string value", + "f01234" +] +``` + +Response: `true` + +### WalletSign + + +Perms: admin + +Inputs: +```json +[ + "string value", + "f01234", + "Ynl0ZSBhcnJheQ==", + { + "Type": "message", + "Extra": "Ynl0ZSBhcnJheQ==" + } +] +``` + +Response: +```json +{ + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" +} +``` + diff --git a/venus-shared/api/gateway/v1/proof_event.go b/venus-shared/api/gateway/v1/proof_event.go new file mode 100644 index 0000000000..8c823f1111 --- /dev/null +++ b/venus-shared/api/gateway/v1/proof_event.go @@ -0,0 +1,21 @@ +package gateway + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" + + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + gtypes "github.com/filecoin-project/venus/venus-shared/types/gateway" +) + +type IProofEvent interface { + ListConnectedMiners(ctx context.Context) ([]address.Address, error) //perm:admin + ListMinerConnection(ctx context.Context, addr address.Address) (*gtypes.MinerState, error) //perm:admin + ComputeProof(ctx context.Context, miner address.Address, sectorInfos []builtin.ExtendedSectorInfo, rand abi.PoStRandomness, height abi.ChainEpoch, nwVersion network.Version) ([]builtin.PoStProof, error) //perm:admin + + ResponseProofEvent(ctx context.Context, resp *gtypes.ResponseEvent) error //perm:read + ListenProofEvent(ctx context.Context, policy *gtypes.ProofRegisterPolicy) (<-chan *gtypes.RequestEvent, error) //perm:read +} diff --git a/venus-shared/api/gateway/v1/proxy_gen.go b/venus-shared/api/gateway/v1/proxy_gen.go new file mode 100644 index 0000000000..dff12e8f82 --- /dev/null +++ b/venus-shared/api/gateway/v1/proxy_gen.go @@ -0,0 +1,118 @@ +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package gateway + +import ( + "context" + + address "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/specs-storage/storage" + types2 "github.com/ipfs-force-community/venus-common-utils/types" + cid "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/types" + gtypes "github.com/filecoin-project/venus/venus-shared/types/gateway" +) + +type IProofEventStruct struct { + Internal struct { + ComputeProof func(ctx context.Context, miner address.Address, sectorInfos []builtin.ExtendedSectorInfo, rand abi.PoStRandomness, height abi.ChainEpoch, nwVersion network.Version) ([]builtin.PoStProof, error) `perm:"admin"` + ListConnectedMiners func(ctx context.Context) ([]address.Address, error) `perm:"admin"` + ListMinerConnection func(ctx context.Context, addr address.Address) (*gtypes.MinerState, error) `perm:"admin"` + ListenProofEvent func(ctx context.Context, policy *gtypes.ProofRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` + ResponseProofEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` + } +} + +func (s *IProofEventStruct) ComputeProof(p0 context.Context, p1 address.Address, p2 []builtin.ExtendedSectorInfo, p3 abi.PoStRandomness, p4 abi.ChainEpoch, p5 network.Version) ([]builtin.PoStProof, error) { + return s.Internal.ComputeProof(p0, p1, p2, p3, p4, p5) +} +func (s *IProofEventStruct) ListConnectedMiners(p0 context.Context) ([]address.Address, error) { + return s.Internal.ListConnectedMiners(p0) +} +func (s *IProofEventStruct) ListMinerConnection(p0 context.Context, p1 address.Address) (*gtypes.MinerState, error) { + return s.Internal.ListMinerConnection(p0, p1) +} +func (s *IProofEventStruct) ListenProofEvent(p0 context.Context, p1 *gtypes.ProofRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { + return s.Internal.ListenProofEvent(p0, p1) +} +func (s *IProofEventStruct) ResponseProofEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { + return s.Internal.ResponseProofEvent(p0, p1) +} + +type IWalletEventStruct struct { + Internal struct { + AddNewAddress func(ctx context.Context, channelID types.UUID, newAddrs []address.Address) error `perm:"read"` + ListWalletInfo func(ctx context.Context) ([]*gtypes.WalletDetail, error) `perm:"admin"` + ListWalletInfoByWallet func(ctx context.Context, wallet string) (*gtypes.WalletDetail, error) `perm:"admin"` + ListenWalletEvent func(ctx context.Context, policy *gtypes.WalletRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` + RemoveAddress func(ctx context.Context, channelID types.UUID, newAddrs []address.Address) error `perm:"read"` + ResponseWalletEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` + SupportNewAccount func(ctx context.Context, channelID types.UUID, account string) error `perm:"read"` + WalletHas func(ctx context.Context, supportAccount string, addr address.Address) (bool, error) `perm:"admin"` + WalletSign func(ctx context.Context, account string, addr address.Address, toSign []byte, meta types.MsgMeta) (*crypto.Signature, error) `perm:"admin"` + } +} + +func (s *IWalletEventStruct) AddNewAddress(p0 context.Context, p1 types.UUID, p2 []address.Address) error { + return s.Internal.AddNewAddress(p0, p1, p2) +} +func (s *IWalletEventStruct) ListWalletInfo(p0 context.Context) ([]*gtypes.WalletDetail, error) { + return s.Internal.ListWalletInfo(p0) +} +func (s *IWalletEventStruct) ListWalletInfoByWallet(p0 context.Context, p1 string) (*gtypes.WalletDetail, error) { + return s.Internal.ListWalletInfoByWallet(p0, p1) +} +func (s *IWalletEventStruct) ListenWalletEvent(p0 context.Context, p1 *gtypes.WalletRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { + return s.Internal.ListenWalletEvent(p0, p1) +} +func (s *IWalletEventStruct) RemoveAddress(p0 context.Context, p1 types.UUID, p2 []address.Address) error { + return s.Internal.RemoveAddress(p0, p1, p2) +} +func (s *IWalletEventStruct) ResponseWalletEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { + return s.Internal.ResponseWalletEvent(p0, p1) +} +func (s *IWalletEventStruct) SupportNewAccount(p0 context.Context, p1 types.UUID, p2 string) error { + return s.Internal.SupportNewAccount(p0, p1, p2) +} +func (s *IWalletEventStruct) WalletHas(p0 context.Context, p1 string, p2 address.Address) (bool, error) { + return s.Internal.WalletHas(p0, p1, p2) +} +func (s *IWalletEventStruct) WalletSign(p0 context.Context, p1 string, p2 address.Address, p3 []byte, p4 types.MsgMeta) (*crypto.Signature, error) { + return s.Internal.WalletSign(p0, p1, p2, p3, p4) +} + +type IMarketEventStruct struct { + Internal struct { + IsUnsealed func(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types2.PaddedByteIndex, size abi.PaddedPieceSize) (bool, error) `perm:"admin"` + ListMarketConnectionsState func(ctx context.Context) ([]gtypes.MarketConnectionState, error) `perm:"admin"` + ListenMarketEvent func(ctx context.Context, policy *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` + ResponseMarketEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` + SectorsUnsealPiece func(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types2.PaddedByteIndex, size abi.PaddedPieceSize, dest string) error `perm:"admin"` + } +} + +func (s *IMarketEventStruct) IsUnsealed(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 storage.SectorRef, p4 types2.PaddedByteIndex, p5 abi.PaddedPieceSize) (bool, error) { + return s.Internal.IsUnsealed(p0, p1, p2, p3, p4, p5) +} +func (s *IMarketEventStruct) ListMarketConnectionsState(p0 context.Context) ([]gtypes.MarketConnectionState, error) { + return s.Internal.ListMarketConnectionsState(p0) +} +func (s *IMarketEventStruct) ListenMarketEvent(p0 context.Context, p1 *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { + return s.Internal.ListenMarketEvent(p0, p1) +} +func (s *IMarketEventStruct) ResponseMarketEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { + return s.Internal.ResponseMarketEvent(p0, p1) +} +func (s *IMarketEventStruct) SectorsUnsealPiece(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 storage.SectorRef, p4 types2.PaddedByteIndex, p5 abi.PaddedPieceSize, p6 string) error { + return s.Internal.SectorsUnsealPiece(p0, p1, p2, p3, p4, p5, p6) +} + +type IGatewayStruct struct { + IProofEventStruct + IWalletEventStruct + IMarketEventStruct +} diff --git a/venus-shared/api/gateway/v1/wallet_event.go b/venus-shared/api/gateway/v1/wallet_event.go new file mode 100644 index 0000000000..90279d5319 --- /dev/null +++ b/venus-shared/api/gateway/v1/wallet_event.go @@ -0,0 +1,24 @@ +package gateway + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/crypto" + + "github.com/filecoin-project/venus/venus-shared/types" + gtypes "github.com/filecoin-project/venus/venus-shared/types/gateway" +) + +type IWalletEvent interface { + ListWalletInfo(ctx context.Context) ([]*gtypes.WalletDetail, error) //perm:admin + ListWalletInfoByWallet(ctx context.Context, wallet string) (*gtypes.WalletDetail, error) //perm:admin + WalletHas(ctx context.Context, supportAccount string, addr address.Address) (bool, error) //perm:admin + WalletSign(ctx context.Context, account string, addr address.Address, toSign []byte, meta types.MsgMeta) (*crypto.Signature, error) //perm:admin + + ResponseWalletEvent(ctx context.Context, resp *gtypes.ResponseEvent) error //perm:read + ListenWalletEvent(ctx context.Context, policy *gtypes.WalletRegisterPolicy) (<-chan *gtypes.RequestEvent, error) //perm:read + SupportNewAccount(ctx context.Context, channelID types.UUID, account string) error //perm:read + AddNewAddress(ctx context.Context, channelID types.UUID, newAddrs []address.Address) error //perm:read + RemoveAddress(ctx context.Context, channelID types.UUID, newAddrs []address.Address) error //perm:read +} diff --git a/venus-shared/types/gateway/common.go b/venus-shared/types/gateway/common.go new file mode 100644 index 0000000000..b7a8bc3a18 --- /dev/null +++ b/venus-shared/types/gateway/common.go @@ -0,0 +1,39 @@ +package gateway + +import ( + "time" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/venus/venus-shared/types" +) + +type RequestEvent struct { + ID types.UUID `json:"Id"` + Method string + Payload []byte + CreateTime time.Time `json:"-"` + Result chan *ResponseEvent `json:"-"` +} + +type ResponseEvent struct { + ID types.UUID `json:"Id"` + Payload []byte + Error string +} + +type ConnectionStates struct { + Connections []*ConnectState + ConnectionCount int +} + +type ConnectState struct { + Addrs []address.Address + ChannelID types.UUID `json:"ChannelId"` + IP string `json:"Ip"` + RequestCount int + CreateTime time.Time +} + +type ConnectedCompleted struct { + ChannelId types.UUID // nolint +} diff --git a/venus-shared/types/gateway/event.go b/venus-shared/types/gateway/event.go deleted file mode 100644 index f0f5b01b38..0000000000 --- a/venus-shared/types/gateway/event.go +++ /dev/null @@ -1,27 +0,0 @@ -package gateway - -import ( - "time" - - "github.com/google/uuid" - - "github.com/filecoin-project/go-address" -) - -type ProofRegisterPolicy struct { - MinerAddress address.Address -} - -type RequestEvent struct { - Id uuid.UUID // nolint - Method string - Payload []byte - CreateTime time.Time `json:"-"` - Result chan *ResponseEvent `json:"-"` -} - -type ResponseEvent struct { - Id uuid.UUID // nolint - Payload []byte - Error string -} diff --git a/venus-shared/types/gateway/market_event.go b/venus-shared/types/gateway/market_event.go new file mode 100644 index 0000000000..a176081f81 --- /dev/null +++ b/venus-shared/types/gateway/market_event.go @@ -0,0 +1,39 @@ +package gateway + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/specs-storage/storage" + types2 "github.com/ipfs-force-community/venus-common-utils/types" + "github.com/ipfs/go-cid" +) + +type MarketRegisterPolicy struct { + Miner address.Address +} + +type IsUnsealRequest struct { + PieceCid cid.Cid + Sector storage.SectorRef + Offset types2.PaddedByteIndex + Size abi.PaddedPieceSize +} + +type IsUnsealResponse struct { +} + +type UnsealRequest struct { + PieceCid cid.Cid + Sector storage.SectorRef + Offset types2.PaddedByteIndex + Size abi.PaddedPieceSize + Dest string +} + +type UnsealResponse struct { +} + +type MarketConnectionState struct { + Addr address.Address + Conn ConnectionStates +} diff --git a/venus-shared/types/gateway/request.go b/venus-shared/types/gateway/proof_event.go similarity index 61% rename from venus-shared/types/gateway/request.go rename to venus-shared/types/gateway/proof_event.go index 98fd0ef30d..f148294485 100644 --- a/venus-shared/types/gateway/request.go +++ b/venus-shared/types/gateway/proof_event.go @@ -1,29 +1,25 @@ package gateway import ( - "github.com/google/uuid" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/venus-shared/actors/builtin" - sharedTypes "github.com/filecoin-project/venus/venus-shared/types" ) +type MinerState struct { + Connections []*ConnectState + ConnectionCount int +} + +type ProofRegisterPolicy struct { + MinerAddress address.Address +} + type ComputeProofRequest struct { SectorInfos []builtin.ExtendedSectorInfo Rand abi.PoStRandomness Height abi.ChainEpoch NWVersion network.Version } - -type ConnectedCompleted struct { - ChannelId uuid.UUID // nolint -} - -type WalletSignRequest struct { - Signer address.Address - ToSign []byte - Meta sharedTypes.MsgMeta -} diff --git a/venus-shared/types/gateway/wallet_event.go b/venus-shared/types/gateway/wallet_event.go new file mode 100644 index 0000000000..510abaf4da --- /dev/null +++ b/venus-shared/types/gateway/wallet_event.go @@ -0,0 +1,25 @@ +package gateway + +import ( + "github.com/filecoin-project/go-address" + + "github.com/filecoin-project/venus/venus-shared/types" +) + +type WalletDetail struct { + Account string + SupportAccounts []string + ConnectStates []ConnectState +} + +type WalletRegisterPolicy struct { + SupportAccounts []string + // a slice byte provide by wallet, using to verify address is really exist + SignBytes []byte +} + +type WalletSignRequest struct { + Signer address.Address + ToSign []byte + Meta types.MsgMeta +} From a05e936c124a186c8ced4c441d04a211a3969dc0 Mon Sep 17 00:00:00 2001 From: Caesar Wang Date: Thu, 17 Feb 2022 10:06:57 +0800 Subject: [PATCH 150/167] feat: venus-shared: introduce apis & types from venus-market (#4776) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: introduce apis & types from venus-market * opt: remove unused mod Co-authored-by: 一页素书 <2931107265@qq.com> --- go.mod | 1 + go.sum | 47 +- venus-devtool/api-gen/common.go | 22 + venus-devtool/api-gen/example.go | 12 + venus-devtool/cborgen/main.go | 13 + venus-shared/TODO.md | 5 + venus-shared/api/market/api.go | 149 ++ venus-shared/api/market/client/api.go | 90 + venus-shared/api/market/client/client_gen.go | 24 + venus-shared/api/market/client/method.md | 1247 ++++++++++++ venus-shared/api/market/client/proxy_gen.go | 171 ++ venus-shared/api/market/client_gen.go | 24 + venus-shared/api/market/method.md | 1674 +++++++++++++++++ venus-shared/api/market/proxy_gen.go | 301 +++ venus-shared/types/market/assigner_type.go | 49 + venus-shared/types/market/cbor_gen.go | 1590 ++++++++++++++++ venus-shared/types/market/client/data.go | 98 + venus-shared/types/market/client/deal.go | 49 + venus-shared/types/market/client/query.go | 42 + .../types/market/client/retrieval_order.go | 30 + .../types/market/client/retriveval_info.go | 32 + venus-shared/types/market/common.go | 24 + venus-shared/types/market/dagstore.go | 32 + venus-shared/types/market/data_transfer.go | 55 + venus-shared/types/market/exported.go | 10 + .../types/market/funded_address_state.go | 18 + venus-shared/types/market/miner_deal.go | 71 + venus-shared/types/market/paych.go | 159 ++ venus-shared/types/market/retrieval_ask.go | 14 + venus-shared/types/market/retrieval_deal.go | 47 + venus-shared/types/market/storage.go | 116 ++ 31 files changed, 6214 insertions(+), 2 deletions(-) create mode 100644 venus-shared/api/market/api.go create mode 100644 venus-shared/api/market/client/api.go create mode 100644 venus-shared/api/market/client/client_gen.go create mode 100644 venus-shared/api/market/client/method.md create mode 100644 venus-shared/api/market/client/proxy_gen.go create mode 100644 venus-shared/api/market/client_gen.go create mode 100644 venus-shared/api/market/method.md create mode 100644 venus-shared/api/market/proxy_gen.go create mode 100644 venus-shared/types/market/assigner_type.go create mode 100644 venus-shared/types/market/cbor_gen.go create mode 100644 venus-shared/types/market/client/data.go create mode 100644 venus-shared/types/market/client/deal.go create mode 100644 venus-shared/types/market/client/query.go create mode 100644 venus-shared/types/market/client/retrieval_order.go create mode 100644 venus-shared/types/market/client/retriveval_info.go create mode 100644 venus-shared/types/market/common.go create mode 100644 venus-shared/types/market/dagstore.go create mode 100644 venus-shared/types/market/data_transfer.go create mode 100644 venus-shared/types/market/exported.go create mode 100644 venus-shared/types/market/funded_address_state.go create mode 100644 venus-shared/types/market/miner_deal.go create mode 100644 venus-shared/types/market/paych.go create mode 100644 venus-shared/types/market/retrieval_ask.go create mode 100644 venus-shared/types/market/retrieval_deal.go create mode 100644 venus-shared/types/market/storage.go diff --git a/go.mod b/go.mod index 99d5b1ed79..5031039c0e 100644 --- a/go.mod +++ b/go.mod @@ -30,6 +30,7 @@ require ( github.com/filecoin-project/go-crypto v0.0.1 github.com/filecoin-project/go-data-transfer v1.12.1 github.com/filecoin-project/go-fil-commcid v0.1.0 + github.com/filecoin-project/go-fil-markets v1.14.1 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543 github.com/filecoin-project/go-paramfetch v0.0.4 diff --git a/go.sum b/go.sum index 53be14e623..9aab9065cc 100644 --- a/go.sum +++ b/go.sum @@ -47,6 +47,7 @@ contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0 contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= @@ -326,6 +327,8 @@ github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2 h1:dWh+o7gzavw1JUlsTqBj2/87r1Z6fbPZuZS43UiIW60= +github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -350,6 +353,7 @@ github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9AN github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= github.com/filecoin-project/go-data-transfer v1.12.1 h1:gAznAZKySVs2FS6T/vDq7R3f0DewLnxeROe0oOE6bZU= github.com/filecoin-project/go-data-transfer v1.12.1/go.mod h1:j3HL645YiQFxcM+q7uPlGApILSqeweDABNgZQP7pDYU= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= @@ -358,6 +362,10 @@ github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= +github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= +github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= +github.com/filecoin-project/go-fil-markets v1.14.1 h1:Bx+TSbkAN8K97Hpjgu+MpeRFbXIKH/fNpNp1ZGAEH3I= +github.com/filecoin-project/go-fil-markets v1.14.1/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -368,12 +376,15 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBw github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543 h1:aMJGfgqe1QDhAVwxRg5fjCRF533xHidiKsugk7Vvzug= github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543/go.mod h1:mjrHv1cDGJWDlGmC0eDc1E5VJr8DmL9XMUcaFwiuKg8= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= +github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1 h1:0BogtftbcgyBx4lP2JWM00ZK7/pXmgnrDqKp9aLTgVs= +github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-paramfetch v0.0.4 h1:H+Me8EL8T5+79z/KHYQQcT8NVOzYVqXIi7nhb48tdm8= github.com/filecoin-project/go-paramfetch v0.0.4/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.3 h1:rzIJyQo5HO2ptc8Jcu8P0qTutnI7NWwTle54eAHoNO0= @@ -463,6 +474,7 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.1 h1:DX7uPQ4WgAWfoh+NGGlbJQswnYIVvz0SRlLS3rPZQDA= github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -816,6 +828,8 @@ github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqg github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= +github.com/ipfs/go-cidutil v0.0.2 h1:CNOboQf1t7Qp0nuNh8QMmhJs0+Q//bRL1axtCnIB1Yo= +github.com/ipfs/go-cidutil v0.0.2/go.mod h1:ewllrvrxG6AMYStla3GD7Cqn+XYSLqjK0vc+086tB6s= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= @@ -844,13 +858,17 @@ github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZ github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= +github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= +github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= +github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= +github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= @@ -948,18 +966,24 @@ github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZ github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= +github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= +github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d h1:yrjb9jdAj3Lkxgp8af5G3g4Yv4PwWac3+sikmJVF0fA= +github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= +github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G/JsQ= github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= @@ -1048,6 +1072,7 @@ github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8 github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1594,8 +1619,9 @@ github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= -github.com/multiformats/go-multicodec v0.3.0 h1:tstDwfIjiHbnIjeM5Lp+pMrSeN+LCMsEwOrkPmWm03A= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -1717,6 +1743,8 @@ github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzI github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= +github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= +github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v0.0.0-20170317030525-88609521dc4b/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= @@ -1821,6 +1849,8 @@ github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEA github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= @@ -2021,6 +2051,8 @@ github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5 h1:EYxr08r8x6r/5 github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5/go.mod h1:c98fKi5B9u8OsKGiWHLRKus6ToQ1Tubeow44ECO1uxY= github.com/weaveworks/promrus v1.2.0 h1:jOLf6pe6/vss4qGHjXmGz4oDJQA+AOCqEL3FvvZGz7M= github.com/weaveworks/promrus v1.2.0/go.mod h1:SaE82+OJ91yqjrE1rsvBWVzNZKcHYFtMUyS1+Ogs/KA= +github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= +github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= @@ -2113,6 +2145,7 @@ go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= @@ -2197,7 +2230,9 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -2208,6 +2243,7 @@ golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -2215,8 +2251,11 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5 h1:FR+oGxGfbQu1d+jglI3rCkjAjUnhRSZcUxr+DqlDLNo= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= +golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= +golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 h1:Jp57DBw4K7mimZNA3F9f7CndVcUt4kJjmyJf2rzJHoI= +golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -2234,10 +2273,12 @@ golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -2429,6 +2470,7 @@ golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2502,6 +2544,7 @@ golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= diff --git a/venus-devtool/api-gen/common.go b/venus-devtool/api-gen/common.go index 4dc1025e71..04efaafc15 100644 --- a/venus-devtool/api-gen/common.go +++ b/venus-devtool/api-gen/common.go @@ -10,6 +10,8 @@ import ( "github.com/filecoin-project/venus/venus-devtool/util" gatewayv1 "github.com/filecoin-project/venus/venus-shared/api/gateway/v1" + "github.com/filecoin-project/venus/venus-shared/api/market" + market_client "github.com/filecoin-project/venus/venus-shared/api/market/client" "github.com/filecoin-project/venus/venus-shared/api/messager" "github.com/filecoin-project/venus/venus-shared/api/wallet" ) @@ -47,6 +49,26 @@ func init() { MethodNamespace: "Gateway", }, }, + util.APIMeta{ + Type: reflect.TypeOf((*market.IMarket)(nil)).Elem(), + ParseOpt: util.InterfaceParseOption{ + ImportPath: "github.com/filecoin-project/venus/venus-shared/api/market", + IncludeAll: true, + }, + RPCMeta: util.RPCMeta{ + MethodNamespace: "VENUS_MARKET", + }, + }, + util.APIMeta{ + Type: reflect.TypeOf((*market_client.IMarketClient)(nil)).Elem(), + ParseOpt: util.InterfaceParseOption{ + ImportPath: "github.com/filecoin-project/venus/venus-shared/api/market/client", + IncludeAll: true, + }, + RPCMeta: util.RPCMeta{ + MethodNamespace: "VENUS_MARKET_CLIENT", + }, + }, ) } diff --git a/venus-devtool/api-gen/example.go b/venus-devtool/api-gen/example.go index 1d536bd09c..5ed138870f 100644 --- a/venus-devtool/api-gen/example.go +++ b/venus-devtool/api-gen/example.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" + "github.com/filecoin-project/go-fil-markets/filestore" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-state-types/abi" @@ -30,6 +31,7 @@ import ( "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/venus-shared/api" "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/venus/venus-shared/types/market/client" "github.com/filecoin-project/venus/venus-shared/types/messager" "github.com/filecoin-project/venus/venus-shared/types/wallet" ) @@ -223,6 +225,15 @@ func init() { // used in gateway addExample(commontypes.PaddedByteIndex(10)) + + // used in market + addExample(filestore.Path("/some/path")) + + clientDataSelector := client.DataSelector("/ipld/a/b/c") + addExample(clientDataSelector) + addExample(&clientDataSelector) + + addExample(client.ImportID(1234)) } func ExampleValue(method string, t, parent reflect.Type) interface{} { @@ -255,6 +266,7 @@ func ExampleValue(method string, t, parent reflect.Type) interface{} { // ExampleValues[t] = es return es } + case reflect.Interface: if t.Implements(reflect.TypeOf((*error)(nil)).Elem()) { return fmt.Errorf("empty error") diff --git a/venus-devtool/cborgen/main.go b/venus-devtool/cborgen/main.go index ddbf6e6334..f307f50ecb 100644 --- a/venus-devtool/cborgen/main.go +++ b/venus-devtool/cborgen/main.go @@ -7,6 +7,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/libp2p/exchange" "github.com/filecoin-project/venus/venus-shared/libp2p/hello" "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/venus/venus-shared/types/market" gen "github.com/whyrusleeping/cbor-gen" ) @@ -59,6 +60,18 @@ func main() { types.Message{}, }, }, + { + dir: "../venus-shared/types/market", + types: []interface{}{ + market.FundedAddressState{}, + market.MsgInfo{}, + market.ChannelInfo{}, + market.VoucherInfo{}, + market.MinerDeal{}, + market.RetrievalAsk{}, + market.ProviderDealState{}, + }, + }, } for _, target := range targets { diff --git a/venus-shared/TODO.md b/venus-shared/TODO.md index 932bed20ba..5cce174343 100644 --- a/venus-shared/TODO.md +++ b/venus-shared/TODO.md @@ -1 +1,6 @@ - [ ] tests in actors +- [ ] venus-market + - [ ] 类型考虑再细分到不同的命名空间下 + - [ ] 对于 `venus-messager`、`venus-gateway` 的部分接口转发需要考虑更优雅的方式 + +- [ ] venus-devtool 中的 `lotus` 需要保持更新 diff --git a/venus-shared/api/market/api.go b/venus-shared/api/market/api.go new file mode 100644 index 0000000000..5dfe87f22e --- /dev/null +++ b/venus-shared/api/market/api.go @@ -0,0 +1,149 @@ +package market + +import ( + "context" + "time" + + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + + "github.com/filecoin-project/go-address" + datatransfer "github.com/filecoin-project/go-data-transfer" + "github.com/filecoin-project/go-fil-markets/piecestore" + "github.com/filecoin-project/go-fil-markets/retrievalmarket" + "github.com/filecoin-project/go-fil-markets/storagemarket" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" + + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/venus/venus-shared/types/gateway" + "github.com/filecoin-project/venus/venus-shared/types/market" +) + +type IMarket interface { + ActorList(context.Context) ([]market.User, error) //perm:read + ActorExist(ctx context.Context, addr address.Address) (bool, error) //perm:read + ActorSectorSize(context.Context, address.Address) (abi.SectorSize, error) //perm:read + + MarketImportDealData(ctx context.Context, propcid cid.Cid, path string) error //perm:write + MarketListDeals(ctx context.Context, addrs []address.Address) ([]types.MarketDeal, error) //perm:read + MarketListRetrievalDeals(ctx context.Context, mAddr address.Address) ([]market.ProviderDealState, error) //perm:read + MarketGetDealUpdates(ctx context.Context) (<-chan storagemarket.MinerDeal, error) //perm:read + MarketListIncompleteDeals(ctx context.Context, mAddr address.Address) ([]storagemarket.MinerDeal, error) //perm:read + MarketSetAsk(ctx context.Context, mAddr address.Address, price types.BigInt, verifiedPrice types.BigInt, duration abi.ChainEpoch, minPieceSize abi.PaddedPieceSize, maxPieceSize abi.PaddedPieceSize) error //perm:admin + MarketGetAsk(ctx context.Context, mAddr address.Address) (*storagemarket.SignedStorageAsk, error) //perm:read + MarketListAsk(ctx context.Context) ([]*storagemarket.SignedStorageAsk, error) //perm:read + MarketSetRetrievalAsk(ctx context.Context, mAddr address.Address, rask *retrievalmarket.Ask) error //perm:admin + MarketGetRetrievalAsk(ctx context.Context, mAddr address.Address) (*retrievalmarket.Ask, error) //perm:read + MarketListRetrievalAsk(ctx context.Context) ([]*market.RetrievalAsk, error) //perm:read + MarketListDataTransfers(ctx context.Context) ([]market.DataTransferChannel, error) //perm:write + MarketDataTransferUpdates(ctx context.Context) (<-chan market.DataTransferChannel, error) //perm:write + // MarketRestartDataTransfer attempts to restart a data transfer with the given transfer ID and other peer + MarketRestartDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error //perm:write + // MarketCancelDataTransfer cancels a data transfer with the given transfer ID and other peer + MarketCancelDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error //perm:write + MarketPendingDeals(ctx context.Context) ([]market.PendingDealInfo, error) //perm:write + MarketPublishPendingDeals(ctx context.Context) error //perm:admin + + PiecesListPieces(ctx context.Context) ([]cid.Cid, error) //perm:read + PiecesListCidInfos(ctx context.Context) ([]cid.Cid, error) //perm:read + PiecesGetPieceInfo(ctx context.Context, pieceCid cid.Cid) (*piecestore.PieceInfo, error) //perm:read + PiecesGetCIDInfo(ctx context.Context, payloadCid cid.Cid) (*piecestore.CIDInfo, error) //perm:read + + DealsImportData(ctx context.Context, dealPropCid cid.Cid, file string) error //perm:admin + DealsConsiderOnlineStorageDeals(context.Context) (bool, error) //perm:admin + DealsSetConsiderOnlineStorageDeals(context.Context, bool) error //perm:admin + DealsConsiderOnlineRetrievalDeals(context.Context) (bool, error) //perm:admin + DealsSetConsiderOnlineRetrievalDeals(context.Context, bool) error //perm:admin + DealsPieceCidBlocklist(context.Context) ([]cid.Cid, error) //perm:admin + DealsSetPieceCidBlocklist(context.Context, []cid.Cid) error //perm:admin + DealsConsiderOfflineStorageDeals(context.Context) (bool, error) //perm:admin + DealsSetConsiderOfflineStorageDeals(context.Context, bool) error //perm:admin + DealsConsiderOfflineRetrievalDeals(context.Context) (bool, error) //perm:admin + DealsSetConsiderOfflineRetrievalDeals(context.Context, bool) error //perm:admin + DealsConsiderVerifiedStorageDeals(context.Context) (bool, error) //perm:admin + DealsSetConsiderVerifiedStorageDeals(context.Context, bool) error //perm:admin + DealsConsiderUnverifiedStorageDeals(context.Context) (bool, error) //perm:admin + DealsSetConsiderUnverifiedStorageDeals(context.Context, bool) error //perm:admin + // SectorGetSealDelay gets the time that a newly-created sector + // waits for more deals before it starts sealing + SectorGetSealDelay(context.Context) (time.Duration, error) //perm:read + // SectorSetExpectedSealDuration sets the expected time for a sector to seal + SectorSetExpectedSealDuration(context.Context, time.Duration) error //perm:write + + //messager + MessagerWaitMessage(ctx context.Context, mid cid.Cid) (*types.MsgLookup, error) //perm:read + MessagerPushMessage(ctx context.Context, msg *types.Message, meta *types.MessageSendSpec) (cid.Cid, error) //perm:write + MessagerGetMessage(ctx context.Context, mid cid.Cid) (*types.Message, error) //perm:read + + MarketAddBalance(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) //perm:sign + MarketGetReserved(ctx context.Context, addr address.Address) (types.BigInt, error) //perm:sign + MarketReserveFunds(ctx context.Context, wallet address.Address, addr address.Address, amt types.BigInt) (cid.Cid, error) //perm:sign + MarketReleaseFunds(ctx context.Context, addr address.Address, amt types.BigInt) error //perm:sign + MarketWithdraw(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) //perm:sign + + NetAddrsListen(context.Context) (peer.AddrInfo, error) //perm:read + ID(context.Context) (peer.ID, error) //perm:read + + // DagstoreListShards returns information about all shards known to the + // DAG store. Only available on nodes running the markets subsystem. + DagstoreListShards(ctx context.Context) ([]market.DagstoreShardInfo, error) //perm:read + + // DagstoreInitializeShard initializes an uninitialized shard. + // + // Initialization consists of fetching the shard's data (deal payload) from + // the storage subsystem, generating an index, and persisting the index + // to facilitate later retrievals, and/or to publish to external sources. + // + // This operation is intended to complement the initial migration. The + // migration registers a shard for every unique piece CID, with lazy + // initialization. Thus, shards are not initialized immediately to avoid + // IO activity competing with proving. Instead, shard are initialized + // when first accessed. This method forces the initialization of a shard by + // accessing it and immediately releasing it. This is useful to warm up the + // cache to facilitate subsequent retrievals, and to generate the indexes + // to publish them externally. + // + // This operation fails if the shard is not in ShardStateNew state. + // It blocks until initialization finishes. + DagstoreInitializeShard(ctx context.Context, key string) error //perm:write + + // DagstoreRecoverShard attempts to recover a failed shard. + // + // This operation fails if the shard is not in ShardStateErrored state. + // It blocks until recovery finishes. If recovery failed, it returns the + // error. + DagstoreRecoverShard(ctx context.Context, key string) error //perm:write + + // DagstoreInitializeAll initializes all uninitialized shards in bulk, + // according to the policy passed in the parameters. + // + // It is recommended to set a maximum concurrency to avoid extreme + // IO pressure if the storage subsystem has a large amount of deals. + // + // It returns a stream of events to report progress. + DagstoreInitializeAll(ctx context.Context, params market.DagstoreInitializeAllParams) (<-chan market.DagstoreInitializeAllEvent, error) //perm:write + + // DagstoreGC runs garbage collection on the DAG store. + DagstoreGC(ctx context.Context) ([]market.DagstoreShardResult, error) //perm:admin + + MarkDealsAsPacking(ctx context.Context, miner address.Address, deals []abi.DealID) error //perm:write + UpdateDealOnPacking(ctx context.Context, miner address.Address, dealID abi.DealID, sectorid abi.SectorNumber, offset abi.PaddedPieceSize) error //perm:write + UpdateDealStatus(ctx context.Context, miner address.Address, dealID abi.DealID, pieceStatus string) error //perm:write + GetDeals(ctx context.Context, miner address.Address, pageIndex, pageSize int) ([]*market.DealInfo, error) //perm:read + AssignUnPackedDeals(ctx context.Context, miner address.Address, ssize abi.SectorSize, spec *market.GetDealSpec) ([]*market.DealInfoIncludePath, error) //perm:write + GetUnPackedDeals(ctx context.Context, miner address.Address, spec *market.GetDealSpec) ([]*market.DealInfoIncludePath, error) //perm:read + UpdateStorageDealStatus(ctx context.Context, dealProposalCid cid.Cid, state storagemarket.StorageDealStatus) error //perm:write + //market event + ResponseMarketEvent(ctx context.Context, resp *gateway.ResponseEvent) error //perm:read + ListenMarketEvent(ctx context.Context, policy *gateway.MarketRegisterPolicy) (<-chan *gateway.RequestEvent, error) //perm:read + + // Paych + PaychVoucherList(ctx context.Context, pch address.Address) ([]*paych.SignedVoucher, error) //perm:read + + //piece storage + GetReadUrl(context.Context, string) (string, error) //perm:read + GetWriteUrl(ctx context.Context, resource string) (string, error) //perm:read + + ImportV1Data(ctx context.Context, src string) error //perm:write +} diff --git a/venus-shared/api/market/client/api.go b/venus-shared/api/market/client/api.go new file mode 100644 index 0000000000..42593296d3 --- /dev/null +++ b/venus-shared/api/market/client/api.go @@ -0,0 +1,90 @@ +package client + +import ( + "context" + + "github.com/filecoin-project/go-address" + datatransfer "github.com/filecoin-project/go-data-transfer" + "github.com/filecoin-project/go-fil-markets/retrievalmarket" + "github.com/filecoin-project/go-fil-markets/storagemarket" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/venus/venus-shared/types/market" + "github.com/filecoin-project/venus/venus-shared/types/market/client" +) + +type IMarketClient interface { + // ClientImport imports file under the specified path into filestore. + ClientImport(ctx context.Context, ref client.FileRef) (*client.ImportRes, error) //perm:admin + // ClientRemoveImport removes file import + ClientRemoveImport(ctx context.Context, importID client.ImportID) error //perm:admin + // ClientStartDeal proposes a deal with a miner. + ClientStartDeal(ctx context.Context, params *client.StartDealParams) (*cid.Cid, error) //perm:admin + // ClientStatelessDeal fire-and-forget-proposes an offline deal to a miner without subsequent tracking. + ClientStatelessDeal(ctx context.Context, params *client.StartDealParams) (*cid.Cid, error) //perm:write + // ClientGetDealInfo returns the latest information about a given deal. + ClientGetDealInfo(context.Context, cid.Cid) (*client.DealInfo, error) //perm:read + // ClientListDeals returns information about the deals made by the local client. + ClientListDeals(ctx context.Context) ([]client.DealInfo, error) //perm:write + // ClientGetDealUpdates returns the status of updated deals + ClientGetDealUpdates(ctx context.Context) (<-chan client.DealInfo, error) //perm:write + // ClientGetDealStatus returns status given a code + ClientGetDealStatus(ctx context.Context, statusCode uint64) (string, error) //perm:read + // ClientHasLocal indicates whether a certain CID is locally stored. + ClientHasLocal(ctx context.Context, root cid.Cid) (bool, error) //perm:write + // ClientFindData identifies peers that have a certain file, and returns QueryOffers (one per peer). + ClientFindData(ctx context.Context, root cid.Cid, piece *cid.Cid) ([]client.QueryOffer, error) //perm:read + // ClientMinerQueryOffer returns a QueryOffer for the specific miner and file. + ClientMinerQueryOffer(ctx context.Context, miner address.Address, root cid.Cid, piece *cid.Cid) (client.QueryOffer, error) //perm:read + // ClientRetrieve initiates the retrieval of a file, as specified in the order. + ClientRetrieve(ctx context.Context, params client.RetrievalOrder) (*client.RestrievalRes, error) //perm:admin + // ClientRetrieveWait waits for retrieval to be complete + ClientRetrieveWait(ctx context.Context, deal retrievalmarket.DealID) error //perm:admin + // ClientExport exports a file stored in the local filestore to a system file + ClientExport(ctx context.Context, exportRef client.ExportRef, fileRef client.FileRef) error //perm:admin + ClientListRetrievals(ctx context.Context) ([]client.RetrievalInfo, error) //perm:write + // ClientGetRetrievalUpdates returns status of updated retrieval deals + ClientGetRetrievalUpdates(ctx context.Context) (<-chan client.RetrievalInfo, error) //perm:write + // ClientQueryAsk returns a signed StorageAsk from the specified miner. + ClientQueryAsk(ctx context.Context, p peer.ID, miner address.Address) (*storagemarket.StorageAsk, error) //perm:read + // ClientCalcCommP calculates the CommP and data size of the specified CID + ClientDealPieceCID(ctx context.Context, root cid.Cid) (client.DataCIDSize, error) //perm:read + // ClientCalcCommP calculates the CommP for a specified file + ClientCalcCommP(ctx context.Context, inpath string) (*client.CommPRet, error) //perm:write + // ClientGenCar generates a CAR file for the specified file. + ClientGenCar(ctx context.Context, ref client.FileRef, outpath string) error //perm:write + // ClientDealSize calculates real deal data size + ClientDealSize(ctx context.Context, root cid.Cid) (client.DataSize, error) //perm:read + // ClientListTransfers returns the status of all ongoing transfers of data + ClientListDataTransfers(ctx context.Context) ([]market.DataTransferChannel, error) //perm:write + ClientDataTransferUpdates(ctx context.Context) (<-chan market.DataTransferChannel, error) //perm:write + // ClientRestartDataTransfer attempts to restart a data transfer with the given transfer ID and other peer + ClientRestartDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error //perm:write + // ClientCancelDataTransfer cancels a data transfer with the given transfer ID and other peer + ClientCancelDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error //perm:write + // ClientRetrieveTryRestartInsufficientFunds attempts to restart stalled retrievals on a given payment channel + // which are stuck due to insufficient funds + ClientRetrieveTryRestartInsufficientFunds(ctx context.Context, paymentChannel address.Address) error //perm:write + + // ClientCancelRetrievalDeal cancels an ongoing retrieval deal based on DealID + ClientCancelRetrievalDeal(ctx context.Context, dealid retrievalmarket.DealID) error //perm:write + + // ClientUnimport removes references to the specified file from filestore + //ClientUnimport(path string) + + // ClientListImports lists imported files and their root CIDs + ClientListImports(ctx context.Context) ([]client.Import, error) //perm:write + DefaultAddress(ctx context.Context) (address.Address, error) //perm:read + + MarketAddBalance(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) //perm:write + MarketGetReserved(ctx context.Context, addr address.Address) (types.BigInt, error) //perm:read + MarketReserveFunds(ctx context.Context, wallet address.Address, addr address.Address, amt types.BigInt) (cid.Cid, error) //perm:write + MarketReleaseFunds(ctx context.Context, addr address.Address, amt types.BigInt) error //perm:write + MarketWithdraw(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) //perm:write + + MessagerWaitMessage(ctx context.Context, mid cid.Cid) (*types.MsgLookup, error) //perm:read + MessagerPushMessage(ctx context.Context, msg *types.Message, meta *types.MessageSendSpec) (cid.Cid, error) //perm:write + MessagerGetMessage(ctx context.Context, mid cid.Cid) (*types.Message, error) //perm:read +} diff --git a/venus-shared/api/market/client/client_gen.go b/venus-shared/api/market/client/client_gen.go new file mode 100644 index 0000000000..828b63fd4e --- /dev/null +++ b/venus-shared/api/market/client/client_gen.go @@ -0,0 +1,24 @@ +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package client + +import ( + "context" + "net/http" + + "github.com/filecoin-project/go-jsonrpc" + + "github.com/filecoin-project/venus/venus-shared/api" +) + +// NewIMarketClientRPC creates a new httpparse jsonrpc remotecli. +func NewIMarketClientRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (IMarketClient, jsonrpc.ClientCloser, error) { + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, "client.IMarketClient") + + var res IMarketClientStruct + closer, err := jsonrpc.NewMergeClient(ctx, addr, "VENUS_MARKET_CLIENT", api.GetInternalStructs(&res), requestHeader, opts...) + + return &res, closer, err +} diff --git a/venus-shared/api/market/client/method.md b/venus-shared/api/market/client/method.md new file mode 100644 index 0000000000..2c875b635e --- /dev/null +++ b/venus-shared/api/market/client/method.md @@ -0,0 +1,1247 @@ +# Groups + +* [MarketClient](#MarketClient) + * [ClientCalcCommP](#ClientCalcCommP) + * [ClientCancelDataTransfer](#ClientCancelDataTransfer) + * [ClientCancelRetrievalDeal](#ClientCancelRetrievalDeal) + * [ClientDataTransferUpdates](#ClientDataTransferUpdates) + * [ClientDealPieceCID](#ClientDealPieceCID) + * [ClientDealSize](#ClientDealSize) + * [ClientExport](#ClientExport) + * [ClientFindData](#ClientFindData) + * [ClientGenCar](#ClientGenCar) + * [ClientGetDealInfo](#ClientGetDealInfo) + * [ClientGetDealStatus](#ClientGetDealStatus) + * [ClientGetDealUpdates](#ClientGetDealUpdates) + * [ClientGetRetrievalUpdates](#ClientGetRetrievalUpdates) + * [ClientHasLocal](#ClientHasLocal) + * [ClientImport](#ClientImport) + * [ClientListDataTransfers](#ClientListDataTransfers) + * [ClientListDeals](#ClientListDeals) + * [ClientListImports](#ClientListImports) + * [ClientListRetrievals](#ClientListRetrievals) + * [ClientMinerQueryOffer](#ClientMinerQueryOffer) + * [ClientQueryAsk](#ClientQueryAsk) + * [ClientRemoveImport](#ClientRemoveImport) + * [ClientRestartDataTransfer](#ClientRestartDataTransfer) + * [ClientRetrieve](#ClientRetrieve) + * [ClientRetrieveTryRestartInsufficientFunds](#ClientRetrieveTryRestartInsufficientFunds) + * [ClientRetrieveWait](#ClientRetrieveWait) + * [ClientStartDeal](#ClientStartDeal) + * [ClientStatelessDeal](#ClientStatelessDeal) + * [DefaultAddress](#DefaultAddress) + * [MarketAddBalance](#MarketAddBalance) + * [MarketGetReserved](#MarketGetReserved) + * [MarketReleaseFunds](#MarketReleaseFunds) + * [MarketReserveFunds](#MarketReserveFunds) + * [MarketWithdraw](#MarketWithdraw) + * [MessagerGetMessage](#MessagerGetMessage) + * [MessagerPushMessage](#MessagerPushMessage) + * [MessagerWaitMessage](#MessagerWaitMessage) + +## MarketClient + +### ClientCalcCommP +ClientCalcCommP calculates the CommP for a specified file + + +Perms: write + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Size": 1024 +} +``` + +### ClientCancelDataTransfer +ClientCancelDataTransfer cancels a data transfer with the given transfer ID and other peer + + +Perms: write + +Inputs: +```json +[ + 3, + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + true +] +``` + +Response: `{}` + +### ClientCancelRetrievalDeal +ClientCancelRetrievalDeal cancels an ongoing retrieval deal based on DealID + + +Perms: write + +Inputs: +```json +[ + 5 +] +``` + +Response: `{}` + +### ClientDataTransferUpdates + + +Perms: write + +Inputs: `[]` + +Response: +```json +{ + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } +} +``` + +### ClientDealPieceCID +ClientCalcCommP calculates the CommP and data size of the specified CID + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "PayloadSize": 9, + "PieceSize": 1032, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +} +``` + +### ClientDealSize +ClientDealSize calculates real deal data size + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "PayloadSize": 9, + "PieceSize": 1032 +} +``` + +### ClientExport +ClientExport exports a file stored in the local filestore to a system file + + +Perms: admin + +Inputs: +```json +[ + { + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DAGs": [ + { + "DataSelector": "/ipld/a/b/c", + "ExportMerkleProof": true + } + ], + "FromLocalCAR": "string value", + "DealID": 5 + }, + { + "Path": "string value", + "IsCAR": true + } +] +``` + +Response: `{}` + +### ClientFindData +ClientFindData identifies peers that have a certain file, and returns QueryOffers (one per peer). + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + null +] +``` + +Response: +```json +[ + { + "Err": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Piece": null, + "Size": 42, + "MinPrice": "0", + "UnsealPrice": "0", + "PricePerByte": "0", + "PaymentInterval": 42, + "PaymentIntervalIncrease": 42, + "Miner": "f01234", + "MinerPeer": { + "Address": "f01234", + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "PieceCID": null + } + } +] +``` + +### ClientGenCar +ClientGenCar generates a CAR file for the specified file. + + +Perms: write + +Inputs: +```json +[ + { + "Path": "string value", + "IsCAR": true + }, + "string value" +] +``` + +Response: `{}` + +### ClientGetDealInfo +ClientGetDealInfo returns the latest information about a given deal. + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "ProposalCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "State": 42, + "Message": "string value", + "DealStages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "ExpectedDuration": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + }, + "Provider": "f01234", + "DataRef": { + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceCid": null, + "PieceSize": 1024, + "RawBlockSize": 42 + }, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Size": 42, + "PricePerEpoch": "0", + "Duration": 42, + "DealID": 5432, + "CreationTime": "0001-01-01T00:00:00Z", + "Verified": true, + "TransferChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "DataTransfer": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + } +} +``` + +### ClientGetDealStatus +ClientGetDealStatus returns status given a code + + +Perms: read + +Inputs: +```json +[ + 42 +] +``` + +Response: `"string value"` + +### ClientGetDealUpdates +ClientGetDealUpdates returns the status of updated deals + + +Perms: write + +Inputs: `[]` + +Response: +```json +{ + "ProposalCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "State": 42, + "Message": "string value", + "DealStages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "ExpectedDuration": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + }, + "Provider": "f01234", + "DataRef": { + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceCid": null, + "PieceSize": 1024, + "RawBlockSize": 42 + }, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Size": 42, + "PricePerEpoch": "0", + "Duration": 42, + "DealID": 5432, + "CreationTime": "0001-01-01T00:00:00Z", + "Verified": true, + "TransferChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "DataTransfer": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + } +} +``` + +### ClientGetRetrievalUpdates +ClientGetRetrievalUpdates returns status of updated retrieval deals + + +Perms: write + +Inputs: `[]` + +Response: +```json +{ + "PayloadCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ID": 5, + "PieceCID": null, + "PricePerByte": "0", + "UnsealPrice": "0", + "Status": 0, + "Message": "string value", + "Provider": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "BytesReceived": 42, + "BytesPaidFor": 42, + "TotalPaid": "0", + "TransferChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "DataTransfer": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + }, + "Event": 5 +} +``` + +### ClientHasLocal +ClientHasLocal indicates whether a certain CID is locally stored. + + +Perms: write + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `true` + +### ClientImport +ClientImport imports file under the specified path into filestore. + + +Perms: admin + +Inputs: +```json +[ + { + "Path": "string value", + "IsCAR": true + } +] +``` + +Response: +```json +{ + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ImportID": 1234 +} +``` + +### ClientListDataTransfers +ClientListTransfers returns the status of all ongoing transfers of data + + +Perms: write + +Inputs: `[]` + +Response: +```json +[ + { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + } +] +``` + +### ClientListDeals +ClientListDeals returns information about the deals made by the local client. + + +Perms: write + +Inputs: `[]` + +Response: +```json +[ + { + "ProposalCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "State": 42, + "Message": "string value", + "DealStages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "ExpectedDuration": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + }, + "Provider": "f01234", + "DataRef": { + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceCid": null, + "PieceSize": 1024, + "RawBlockSize": 42 + }, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Size": 42, + "PricePerEpoch": "0", + "Duration": 42, + "DealID": 5432, + "CreationTime": "0001-01-01T00:00:00Z", + "Verified": true, + "TransferChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "DataTransfer": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + } + } +] +``` + +### ClientListImports +ClientUnimport removes references to the specified file from filestore +ClientUnimport(path string) + + +Perms: write + +Inputs: `[]` + +Response: +```json +[ + { + "Key": 1234, + "Err": "string value", + "Root": null, + "Source": "string value", + "FilePath": "string value", + "CARPath": "string value" + } +] +``` + +### ClientListRetrievals + + +Perms: write + +Inputs: `[]` + +Response: +```json +[ + { + "PayloadCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ID": 5, + "PieceCID": null, + "PricePerByte": "0", + "UnsealPrice": "0", + "Status": 0, + "Message": "string value", + "Provider": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "BytesReceived": 42, + "BytesPaidFor": 42, + "TotalPaid": "0", + "TransferChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "DataTransfer": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + }, + "Event": 5 + } +] +``` + +### ClientMinerQueryOffer +ClientMinerQueryOffer returns a QueryOffer for the specific miner and file. + + +Perms: read + +Inputs: +```json +[ + "f01234", + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + null +] +``` + +Response: +```json +{ + "Err": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Piece": null, + "Size": 42, + "MinPrice": "0", + "UnsealPrice": "0", + "PricePerByte": "0", + "PaymentInterval": 42, + "PaymentIntervalIncrease": 42, + "Miner": "f01234", + "MinerPeer": { + "Address": "f01234", + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "PieceCID": null + } +} +``` + +### ClientQueryAsk +ClientQueryAsk returns a signed StorageAsk from the specified miner. + + +Perms: read + +Inputs: +```json +[ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "f01234" +] +``` + +Response: +```json +{ + "Price": "0", + "VerifiedPrice": "0", + "MinPieceSize": 1032, + "MaxPieceSize": 1032, + "Miner": "f01234", + "Timestamp": 10101, + "Expiry": 10101, + "SeqNo": 42 +} +``` + +### ClientRemoveImport +ClientRemoveImport removes file import + + +Perms: admin + +Inputs: +```json +[ + 1234 +] +``` + +Response: `{}` + +### ClientRestartDataTransfer +ClientRestartDataTransfer attempts to restart a data transfer with the given transfer ID and other peer + + +Perms: write + +Inputs: +```json +[ + 3, + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + true +] +``` + +Response: `{}` + +### ClientRetrieve +ClientRetrieve initiates the retrieval of a file, as specified in the order. + + +Perms: admin + +Inputs: +```json +[ + { + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Piece": null, + "DataSelector": "/ipld/a/b/c", + "Size": 42, + "Total": "0", + "UnsealPrice": "0", + "PaymentInterval": 42, + "PaymentIntervalIncrease": 42, + "Client": "f01234", + "Miner": "f01234", + "MinerPeer": { + "Address": "f01234", + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "PieceCID": null + } + } +] +``` + +Response: +```json +{ + "DealID": 5 +} +``` + +### ClientRetrieveTryRestartInsufficientFunds +ClientRetrieveTryRestartInsufficientFunds attempts to restart stalled retrievals on a given payment channel +which are stuck due to insufficient funds + + +Perms: write + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `{}` + +### ClientRetrieveWait +ClientRetrieveWait waits for retrieval to be complete + + +Perms: admin + +Inputs: +```json +[ + 5 +] +``` + +Response: `{}` + +### ClientStartDeal +ClientStartDeal proposes a deal with a miner. + + +Perms: admin + +Inputs: +```json +[ + { + "Data": { + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceCid": null, + "PieceSize": 1024, + "RawBlockSize": 42 + }, + "Wallet": "f01234", + "Miner": "f01234", + "EpochPrice": "0", + "MinBlocksDuration": 42, + "ProviderCollateral": "0", + "DealStartEpoch": 10101, + "FastRetrieval": true, + "VerifiedDeal": true + } +] +``` + +Response: `null` + +### ClientStatelessDeal +ClientStatelessDeal fire-and-forget-proposes an offline deal to a miner without subsequent tracking. + + +Perms: write + +Inputs: +```json +[ + { + "Data": { + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceCid": null, + "PieceSize": 1024, + "RawBlockSize": 42 + }, + "Wallet": "f01234", + "Miner": "f01234", + "EpochPrice": "0", + "MinBlocksDuration": 42, + "ProviderCollateral": "0", + "DealStartEpoch": 10101, + "FastRetrieval": true, + "VerifiedDeal": true + } +] +``` + +Response: `null` + +### DefaultAddress + + +Perms: read + +Inputs: `[]` + +Response: `"f01234"` + +### MarketAddBalance + + +Perms: write + +Inputs: +```json +[ + "f01234", + "f01234", + "0" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MarketGetReserved + + +Perms: read + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `"0"` + +### MarketReleaseFunds + + +Perms: write + +Inputs: +```json +[ + "f01234", + "0" +] +``` + +Response: `{}` + +### MarketReserveFunds + + +Perms: write + +Inputs: +```json +[ + "f01234", + "f01234", + "0" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MarketWithdraw + + +Perms: write + +Inputs: +```json +[ + "f01234", + "f01234", + "0" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MessagerGetMessage + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" +} +``` + +### MessagerPushMessage + + +Perms: write + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + { + "MaxFee": "0", + "GasOverEstimation": 12.3 + } +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MessagerWaitMessage + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "ReturnDec": {}, + "TipSet": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 +} +``` + diff --git a/venus-shared/api/market/client/proxy_gen.go b/venus-shared/api/market/client/proxy_gen.go new file mode 100644 index 0000000000..13e462516f --- /dev/null +++ b/venus-shared/api/market/client/proxy_gen.go @@ -0,0 +1,171 @@ +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package client + +import ( + "context" + + address "github.com/filecoin-project/go-address" + datatransfer "github.com/filecoin-project/go-data-transfer" + "github.com/filecoin-project/go-fil-markets/retrievalmarket" + "github.com/filecoin-project/go-fil-markets/storagemarket" + cid "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/venus/venus-shared/types/market" + "github.com/filecoin-project/venus/venus-shared/types/market/client" +) + +type IMarketClientStruct struct { + Internal struct { + ClientCalcCommP func(ctx context.Context, inpath string) (*client.CommPRet, error) `perm:"write"` + ClientCancelDataTransfer func(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error `perm:"write"` + ClientCancelRetrievalDeal func(ctx context.Context, dealid retrievalmarket.DealID) error `perm:"write"` + ClientDataTransferUpdates func(ctx context.Context) (<-chan market.DataTransferChannel, error) `perm:"write"` + ClientDealPieceCID func(ctx context.Context, root cid.Cid) (client.DataCIDSize, error) `perm:"read"` + ClientDealSize func(ctx context.Context, root cid.Cid) (client.DataSize, error) `perm:"read"` + ClientExport func(ctx context.Context, exportRef client.ExportRef, fileRef client.FileRef) error `perm:"admin"` + ClientFindData func(ctx context.Context, root cid.Cid, piece *cid.Cid) ([]client.QueryOffer, error) `perm:"read"` + ClientGenCar func(ctx context.Context, ref client.FileRef, outpath string) error `perm:"write"` + ClientGetDealInfo func(context.Context, cid.Cid) (*client.DealInfo, error) `perm:"read"` + ClientGetDealStatus func(ctx context.Context, statusCode uint64) (string, error) `perm:"read"` + ClientGetDealUpdates func(ctx context.Context) (<-chan client.DealInfo, error) `perm:"write"` + ClientGetRetrievalUpdates func(ctx context.Context) (<-chan client.RetrievalInfo, error) `perm:"write"` + ClientHasLocal func(ctx context.Context, root cid.Cid) (bool, error) `perm:"write"` + ClientImport func(ctx context.Context, ref client.FileRef) (*client.ImportRes, error) `perm:"admin"` + ClientListDataTransfers func(ctx context.Context) ([]market.DataTransferChannel, error) `perm:"write"` + ClientListDeals func(ctx context.Context) ([]client.DealInfo, error) `perm:"write"` + ClientListImports func(ctx context.Context) ([]client.Import, error) `perm:"write"` + ClientListRetrievals func(ctx context.Context) ([]client.RetrievalInfo, error) `perm:"write"` + ClientMinerQueryOffer func(ctx context.Context, miner address.Address, root cid.Cid, piece *cid.Cid) (client.QueryOffer, error) `perm:"read"` + ClientQueryAsk func(ctx context.Context, p peer.ID, miner address.Address) (*storagemarket.StorageAsk, error) `perm:"read"` + ClientRemoveImport func(ctx context.Context, importID client.ImportID) error `perm:"admin"` + ClientRestartDataTransfer func(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error `perm:"write"` + ClientRetrieve func(ctx context.Context, params client.RetrievalOrder) (*client.RestrievalRes, error) `perm:"admin"` + ClientRetrieveTryRestartInsufficientFunds func(ctx context.Context, paymentChannel address.Address) error `perm:"write"` + ClientRetrieveWait func(ctx context.Context, deal retrievalmarket.DealID) error `perm:"admin"` + ClientStartDeal func(ctx context.Context, params *client.StartDealParams) (*cid.Cid, error) `perm:"admin"` + ClientStatelessDeal func(ctx context.Context, params *client.StartDealParams) (*cid.Cid, error) `perm:"write"` + DefaultAddress func(ctx context.Context) (address.Address, error) `perm:"read"` + MarketAddBalance func(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) `perm:"write"` + MarketGetReserved func(ctx context.Context, addr address.Address) (types.BigInt, error) `perm:"read"` + MarketReleaseFunds func(ctx context.Context, addr address.Address, amt types.BigInt) error `perm:"write"` + MarketReserveFunds func(ctx context.Context, wallet address.Address, addr address.Address, amt types.BigInt) (cid.Cid, error) `perm:"write"` + MarketWithdraw func(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) `perm:"write"` + MessagerGetMessage func(ctx context.Context, mid cid.Cid) (*types.Message, error) `perm:"read"` + MessagerPushMessage func(ctx context.Context, msg *types.Message, meta *types.MessageSendSpec) (cid.Cid, error) `perm:"write"` + MessagerWaitMessage func(ctx context.Context, mid cid.Cid) (*types.MsgLookup, error) `perm:"read"` + } +} + +func (s *IMarketClientStruct) ClientCalcCommP(p0 context.Context, p1 string) (*client.CommPRet, error) { + return s.Internal.ClientCalcCommP(p0, p1) +} +func (s *IMarketClientStruct) ClientCancelDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error { + return s.Internal.ClientCancelDataTransfer(p0, p1, p2, p3) +} +func (s *IMarketClientStruct) ClientCancelRetrievalDeal(p0 context.Context, p1 retrievalmarket.DealID) error { + return s.Internal.ClientCancelRetrievalDeal(p0, p1) +} +func (s *IMarketClientStruct) ClientDataTransferUpdates(p0 context.Context) (<-chan market.DataTransferChannel, error) { + return s.Internal.ClientDataTransferUpdates(p0) +} +func (s *IMarketClientStruct) ClientDealPieceCID(p0 context.Context, p1 cid.Cid) (client.DataCIDSize, error) { + return s.Internal.ClientDealPieceCID(p0, p1) +} +func (s *IMarketClientStruct) ClientDealSize(p0 context.Context, p1 cid.Cid) (client.DataSize, error) { + return s.Internal.ClientDealSize(p0, p1) +} +func (s *IMarketClientStruct) ClientExport(p0 context.Context, p1 client.ExportRef, p2 client.FileRef) error { + return s.Internal.ClientExport(p0, p1, p2) +} +func (s *IMarketClientStruct) ClientFindData(p0 context.Context, p1 cid.Cid, p2 *cid.Cid) ([]client.QueryOffer, error) { + return s.Internal.ClientFindData(p0, p1, p2) +} +func (s *IMarketClientStruct) ClientGenCar(p0 context.Context, p1 client.FileRef, p2 string) error { + return s.Internal.ClientGenCar(p0, p1, p2) +} +func (s *IMarketClientStruct) ClientGetDealInfo(p0 context.Context, p1 cid.Cid) (*client.DealInfo, error) { + return s.Internal.ClientGetDealInfo(p0, p1) +} +func (s *IMarketClientStruct) ClientGetDealStatus(p0 context.Context, p1 uint64) (string, error) { + return s.Internal.ClientGetDealStatus(p0, p1) +} +func (s *IMarketClientStruct) ClientGetDealUpdates(p0 context.Context) (<-chan client.DealInfo, error) { + return s.Internal.ClientGetDealUpdates(p0) +} +func (s *IMarketClientStruct) ClientGetRetrievalUpdates(p0 context.Context) (<-chan client.RetrievalInfo, error) { + return s.Internal.ClientGetRetrievalUpdates(p0) +} +func (s *IMarketClientStruct) ClientHasLocal(p0 context.Context, p1 cid.Cid) (bool, error) { + return s.Internal.ClientHasLocal(p0, p1) +} +func (s *IMarketClientStruct) ClientImport(p0 context.Context, p1 client.FileRef) (*client.ImportRes, error) { + return s.Internal.ClientImport(p0, p1) +} +func (s *IMarketClientStruct) ClientListDataTransfers(p0 context.Context) ([]market.DataTransferChannel, error) { + return s.Internal.ClientListDataTransfers(p0) +} +func (s *IMarketClientStruct) ClientListDeals(p0 context.Context) ([]client.DealInfo, error) { + return s.Internal.ClientListDeals(p0) +} +func (s *IMarketClientStruct) ClientListImports(p0 context.Context) ([]client.Import, error) { + return s.Internal.ClientListImports(p0) +} +func (s *IMarketClientStruct) ClientListRetrievals(p0 context.Context) ([]client.RetrievalInfo, error) { + return s.Internal.ClientListRetrievals(p0) +} +func (s *IMarketClientStruct) ClientMinerQueryOffer(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 *cid.Cid) (client.QueryOffer, error) { + return s.Internal.ClientMinerQueryOffer(p0, p1, p2, p3) +} +func (s *IMarketClientStruct) ClientQueryAsk(p0 context.Context, p1 peer.ID, p2 address.Address) (*storagemarket.StorageAsk, error) { + return s.Internal.ClientQueryAsk(p0, p1, p2) +} +func (s *IMarketClientStruct) ClientRemoveImport(p0 context.Context, p1 client.ImportID) error { + return s.Internal.ClientRemoveImport(p0, p1) +} +func (s *IMarketClientStruct) ClientRestartDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error { + return s.Internal.ClientRestartDataTransfer(p0, p1, p2, p3) +} +func (s *IMarketClientStruct) ClientRetrieve(p0 context.Context, p1 client.RetrievalOrder) (*client.RestrievalRes, error) { + return s.Internal.ClientRetrieve(p0, p1) +} +func (s *IMarketClientStruct) ClientRetrieveTryRestartInsufficientFunds(p0 context.Context, p1 address.Address) error { + return s.Internal.ClientRetrieveTryRestartInsufficientFunds(p0, p1) +} +func (s *IMarketClientStruct) ClientRetrieveWait(p0 context.Context, p1 retrievalmarket.DealID) error { + return s.Internal.ClientRetrieveWait(p0, p1) +} +func (s *IMarketClientStruct) ClientStartDeal(p0 context.Context, p1 *client.StartDealParams) (*cid.Cid, error) { + return s.Internal.ClientStartDeal(p0, p1) +} +func (s *IMarketClientStruct) ClientStatelessDeal(p0 context.Context, p1 *client.StartDealParams) (*cid.Cid, error) { + return s.Internal.ClientStatelessDeal(p0, p1) +} +func (s *IMarketClientStruct) DefaultAddress(p0 context.Context) (address.Address, error) { + return s.Internal.DefaultAddress(p0) +} +func (s *IMarketClientStruct) MarketAddBalance(p0 context.Context, p1, p2 address.Address, p3 types.BigInt) (cid.Cid, error) { + return s.Internal.MarketAddBalance(p0, p1, p2, p3) +} +func (s *IMarketClientStruct) MarketGetReserved(p0 context.Context, p1 address.Address) (types.BigInt, error) { + return s.Internal.MarketGetReserved(p0, p1) +} +func (s *IMarketClientStruct) MarketReleaseFunds(p0 context.Context, p1 address.Address, p2 types.BigInt) error { + return s.Internal.MarketReleaseFunds(p0, p1, p2) +} +func (s *IMarketClientStruct) MarketReserveFunds(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) { + return s.Internal.MarketReserveFunds(p0, p1, p2, p3) +} +func (s *IMarketClientStruct) MarketWithdraw(p0 context.Context, p1, p2 address.Address, p3 types.BigInt) (cid.Cid, error) { + return s.Internal.MarketWithdraw(p0, p1, p2, p3) +} +func (s *IMarketClientStruct) MessagerGetMessage(p0 context.Context, p1 cid.Cid) (*types.Message, error) { + return s.Internal.MessagerGetMessage(p0, p1) +} +func (s *IMarketClientStruct) MessagerPushMessage(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (cid.Cid, error) { + return s.Internal.MessagerPushMessage(p0, p1, p2) +} +func (s *IMarketClientStruct) MessagerWaitMessage(p0 context.Context, p1 cid.Cid) (*types.MsgLookup, error) { + return s.Internal.MessagerWaitMessage(p0, p1) +} diff --git a/venus-shared/api/market/client_gen.go b/venus-shared/api/market/client_gen.go new file mode 100644 index 0000000000..0f920fa979 --- /dev/null +++ b/venus-shared/api/market/client_gen.go @@ -0,0 +1,24 @@ +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package market + +import ( + "context" + "net/http" + + "github.com/filecoin-project/go-jsonrpc" + + "github.com/filecoin-project/venus/venus-shared/api" +) + +// NewIMarketRPC creates a new httpparse jsonrpc remotecli. +func NewIMarketRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (IMarket, jsonrpc.ClientCloser, error) { + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, "market.IMarket") + + var res IMarketStruct + closer, err := jsonrpc.NewMergeClient(ctx, addr, "VENUS_MARKET", api.GetInternalStructs(&res), requestHeader, opts...) + + return &res, closer, err +} diff --git a/venus-shared/api/market/method.md b/venus-shared/api/market/method.md new file mode 100644 index 0000000000..2b2aea2da8 --- /dev/null +++ b/venus-shared/api/market/method.md @@ -0,0 +1,1674 @@ +# Groups + +* [Market](#Market) + * [ActorExist](#ActorExist) + * [ActorList](#ActorList) + * [ActorSectorSize](#ActorSectorSize) + * [AssignUnPackedDeals](#AssignUnPackedDeals) + * [DagstoreGC](#DagstoreGC) + * [DagstoreInitializeAll](#DagstoreInitializeAll) + * [DagstoreInitializeShard](#DagstoreInitializeShard) + * [DagstoreListShards](#DagstoreListShards) + * [DagstoreRecoverShard](#DagstoreRecoverShard) + * [DealsConsiderOfflineRetrievalDeals](#DealsConsiderOfflineRetrievalDeals) + * [DealsConsiderOfflineStorageDeals](#DealsConsiderOfflineStorageDeals) + * [DealsConsiderOnlineRetrievalDeals](#DealsConsiderOnlineRetrievalDeals) + * [DealsConsiderOnlineStorageDeals](#DealsConsiderOnlineStorageDeals) + * [DealsConsiderUnverifiedStorageDeals](#DealsConsiderUnverifiedStorageDeals) + * [DealsConsiderVerifiedStorageDeals](#DealsConsiderVerifiedStorageDeals) + * [DealsImportData](#DealsImportData) + * [DealsPieceCidBlocklist](#DealsPieceCidBlocklist) + * [DealsSetConsiderOfflineRetrievalDeals](#DealsSetConsiderOfflineRetrievalDeals) + * [DealsSetConsiderOfflineStorageDeals](#DealsSetConsiderOfflineStorageDeals) + * [DealsSetConsiderOnlineRetrievalDeals](#DealsSetConsiderOnlineRetrievalDeals) + * [DealsSetConsiderOnlineStorageDeals](#DealsSetConsiderOnlineStorageDeals) + * [DealsSetConsiderUnverifiedStorageDeals](#DealsSetConsiderUnverifiedStorageDeals) + * [DealsSetConsiderVerifiedStorageDeals](#DealsSetConsiderVerifiedStorageDeals) + * [DealsSetPieceCidBlocklist](#DealsSetPieceCidBlocklist) + * [GetDeals](#GetDeals) + * [GetReadUrl](#GetReadUrl) + * [GetUnPackedDeals](#GetUnPackedDeals) + * [GetWriteUrl](#GetWriteUrl) + * [ID](#ID) + * [ImportV1Data](#ImportV1Data) + * [ListenMarketEvent](#ListenMarketEvent) + * [MarkDealsAsPacking](#MarkDealsAsPacking) + * [MarketAddBalance](#MarketAddBalance) + * [MarketCancelDataTransfer](#MarketCancelDataTransfer) + * [MarketDataTransferUpdates](#MarketDataTransferUpdates) + * [MarketGetAsk](#MarketGetAsk) + * [MarketGetDealUpdates](#MarketGetDealUpdates) + * [MarketGetReserved](#MarketGetReserved) + * [MarketGetRetrievalAsk](#MarketGetRetrievalAsk) + * [MarketImportDealData](#MarketImportDealData) + * [MarketListAsk](#MarketListAsk) + * [MarketListDataTransfers](#MarketListDataTransfers) + * [MarketListDeals](#MarketListDeals) + * [MarketListIncompleteDeals](#MarketListIncompleteDeals) + * [MarketListRetrievalAsk](#MarketListRetrievalAsk) + * [MarketListRetrievalDeals](#MarketListRetrievalDeals) + * [MarketPendingDeals](#MarketPendingDeals) + * [MarketPublishPendingDeals](#MarketPublishPendingDeals) + * [MarketReleaseFunds](#MarketReleaseFunds) + * [MarketReserveFunds](#MarketReserveFunds) + * [MarketRestartDataTransfer](#MarketRestartDataTransfer) + * [MarketSetAsk](#MarketSetAsk) + * [MarketSetRetrievalAsk](#MarketSetRetrievalAsk) + * [MarketWithdraw](#MarketWithdraw) + * [MessagerGetMessage](#MessagerGetMessage) + * [MessagerPushMessage](#MessagerPushMessage) + * [MessagerWaitMessage](#MessagerWaitMessage) + * [NetAddrsListen](#NetAddrsListen) + * [PaychVoucherList](#PaychVoucherList) + * [PiecesGetCIDInfo](#PiecesGetCIDInfo) + * [PiecesGetPieceInfo](#PiecesGetPieceInfo) + * [PiecesListCidInfos](#PiecesListCidInfos) + * [PiecesListPieces](#PiecesListPieces) + * [ResponseMarketEvent](#ResponseMarketEvent) + * [SectorGetSealDelay](#SectorGetSealDelay) + * [SectorSetExpectedSealDuration](#SectorSetExpectedSealDuration) + * [UpdateDealOnPacking](#UpdateDealOnPacking) + * [UpdateDealStatus](#UpdateDealStatus) + * [UpdateStorageDealStatus](#UpdateStorageDealStatus) + +## Market + +### ActorExist + + +Perms: read + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `true` + +### ActorList + + +Perms: read + +Inputs: `[]` + +Response: +```json +[ + { + "Addr": "f01234", + "Account": "string value" + } +] +``` + +### ActorSectorSize + + +Perms: read + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `34359738368` + +### AssignUnPackedDeals + + +Perms: write + +Inputs: +```json +[ + "f01234", + 34359738368, + { + "MaxPiece": 123, + "MaxPieceSize": 42 + } +] +``` + +Response: +```json +[ + { + "Offset": 1032, + "Length": 1032, + "PayloadSize": 1024, + "DealID": 5432, + "TotalStorageFee": "0", + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0", + "FastRetrieval": true, + "PublishCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } +] +``` + +### DagstoreGC +DagstoreGC runs garbage collection on the DAG store. + + +Perms: admin + +Inputs: `[]` + +Response: +```json +[ + { + "Key": "string value", + "Success": true, + "Error": "string value" + } +] +``` + +### DagstoreInitializeAll +DagstoreInitializeAll initializes all uninitialized shards in bulk, +according to the policy passed in the parameters. + +It is recommended to set a maximum concurrency to avoid extreme +IO pressure if the storage subsystem has a large amount of deals. + +It returns a stream of events to report progress. + + +Perms: write + +Inputs: +```json +[ + { + "MaxConcurrency": 123, + "IncludeSealed": true + } +] +``` + +Response: +```json +{ + "Key": "string value", + "Event": "string value", + "Success": true, + "Error": "string value", + "Total": 123, + "Current": 123 +} +``` + +### DagstoreInitializeShard +DagstoreInitializeShard initializes an uninitialized shard. + +Initialization consists of fetching the shard's data (deal payload) from +the storage subsystem, generating an index, and persisting the index +to facilitate later retrievals, and/or to publish to external sources. + +This operation is intended to complement the initial migration. The +migration registers a shard for every unique piece CID, with lazy +initialization. Thus, shards are not initialized immediately to avoid +IO activity competing with proving. Instead, shard are initialized +when first accessed. This method forces the initialization of a shard by +accessing it and immediately releasing it. This is useful to warm up the +cache to facilitate subsequent retrievals, and to generate the indexes +to publish them externally. + +This operation fails if the shard is not in ShardStateNew state. +It blocks until initialization finishes. + + +Perms: write + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +### DagstoreListShards +DagstoreListShards returns information about all shards known to the +DAG store. Only available on nodes running the markets subsystem. + + +Perms: read + +Inputs: `[]` + +Response: +```json +[ + { + "Key": "string value", + "State": "string value", + "Error": "string value" + } +] +``` + +### DagstoreRecoverShard +DagstoreRecoverShard attempts to recover a failed shard. + +This operation fails if the shard is not in ShardStateErrored state. +It blocks until recovery finishes. If recovery failed, it returns the +error. + + +Perms: write + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +### DealsConsiderOfflineRetrievalDeals + + +Perms: admin + +Inputs: `[]` + +Response: `true` + +### DealsConsiderOfflineStorageDeals + + +Perms: admin + +Inputs: `[]` + +Response: `true` + +### DealsConsiderOnlineRetrievalDeals + + +Perms: admin + +Inputs: `[]` + +Response: `true` + +### DealsConsiderOnlineStorageDeals + + +Perms: admin + +Inputs: `[]` + +Response: `true` + +### DealsConsiderUnverifiedStorageDeals + + +Perms: admin + +Inputs: `[]` + +Response: `true` + +### DealsConsiderVerifiedStorageDeals + + +Perms: admin + +Inputs: `[]` + +Response: `true` + +### DealsImportData + + +Perms: admin + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "string value" +] +``` + +Response: `{}` + +### DealsPieceCidBlocklist + + +Perms: admin + +Inputs: `[]` + +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +### DealsSetConsiderOfflineRetrievalDeals + + +Perms: admin + +Inputs: +```json +[ + true +] +``` + +Response: `{}` + +### DealsSetConsiderOfflineStorageDeals + + +Perms: admin + +Inputs: +```json +[ + true +] +``` + +Response: `{}` + +### DealsSetConsiderOnlineRetrievalDeals + + +Perms: admin + +Inputs: +```json +[ + true +] +``` + +Response: `{}` + +### DealsSetConsiderOnlineStorageDeals + + +Perms: admin + +Inputs: +```json +[ + true +] +``` + +Response: `{}` + +### DealsSetConsiderUnverifiedStorageDeals + + +Perms: admin + +Inputs: +```json +[ + true +] +``` + +Response: `{}` + +### DealsSetConsiderVerifiedStorageDeals + + +Perms: admin + +Inputs: +```json +[ + true +] +``` + +Response: `{}` + +### DealsSetPieceCidBlocklist + + +Perms: admin + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] +] +``` + +Response: `{}` + +### GetDeals + + +Perms: read + +Inputs: +```json +[ + "f01234", + 123, + 123 +] +``` + +Response: +```json +[ + { + "DealID": 5432, + "SectorID": 9, + "Offset": 1032, + "Length": 1032, + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "ClientSignature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PublishCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "FastRetrieval": true, + "Status": "string value" + } +] +``` + +### GetReadUrl +piece storage + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: `"string value"` + +### GetUnPackedDeals + + +Perms: read + +Inputs: +```json +[ + "f01234", + { + "MaxPiece": 123, + "MaxPieceSize": 42 + } +] +``` + +Response: +```json +[ + { + "Offset": 1032, + "Length": 1032, + "PayloadSize": 1024, + "DealID": 5432, + "TotalStorageFee": "0", + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0", + "FastRetrieval": true, + "PublishCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } +] +``` + +### GetWriteUrl + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: `"string value"` + +### ID + + +Perms: read + +Inputs: `[]` + +Response: `"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"` + +### ImportV1Data + + +Perms: write + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +### ListenMarketEvent + + +Perms: read + +Inputs: +```json +[ + { + "Miner": "f01234" + } +] +``` + +Response: +```json +{ + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Method": "string value", + "Payload": "Ynl0ZSBhcnJheQ==" +} +``` + +### MarkDealsAsPacking + + +Perms: write + +Inputs: +```json +[ + "f01234", + [ + 5432 + ] +] +``` + +Response: `{}` + +### MarketAddBalance + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234", + "0" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MarketCancelDataTransfer +MarketCancelDataTransfer cancels a data transfer with the given transfer ID and other peer + + +Perms: write + +Inputs: +```json +[ + 3, + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + true +] +``` + +Response: `{}` + +### MarketDataTransferUpdates + + +Perms: write + +Inputs: `[]` + +Response: +```json +{ + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } +} +``` + +### MarketGetAsk + + +Perms: read + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +{ + "Ask": { + "Price": "0", + "VerifiedPrice": "0", + "MinPieceSize": 1032, + "MaxPieceSize": 1032, + "Miner": "f01234", + "Timestamp": 10101, + "Expiry": 10101, + "SeqNo": 42 + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } +} +``` + +### MarketGetDealUpdates + + +Perms: read + +Inputs: `[]` + +Response: +```json +{ + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "ClientSignature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ProposalCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "AddFundsCid": null, + "PublishCid": null, + "Miner": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Client": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "State": 42, + "PiecePath": "/some/path", + "MetadataPath": "/some/path", + "SlashEpoch": 10101, + "FastRetrieval": true, + "Message": "string value", + "FundsReserved": "0", + "Ref": { + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceCid": null, + "PieceSize": 1024, + "RawBlockSize": 42 + }, + "AvailableForRetrieval": true, + "DealID": 5432, + "CreationTime": "0001-01-01T00:00:00Z", + "TransferChannelId": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "SectorNumber": 9, + "InboundCAR": "string value" +} +``` + +### MarketGetReserved + + +Perms: sign + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `"0"` + +### MarketGetRetrievalAsk + + +Perms: read + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +{ + "PricePerByte": "0", + "UnsealPrice": "0", + "PaymentInterval": 42, + "PaymentIntervalIncrease": 42 +} +``` + +### MarketImportDealData + + +Perms: write + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "string value" +] +``` + +Response: `{}` + +### MarketListAsk + + +Perms: read + +Inputs: `[]` + +Response: +```json +[ + { + "Ask": { + "Price": "0", + "VerifiedPrice": "0", + "MinPieceSize": 1032, + "MaxPieceSize": 1032, + "Miner": "f01234", + "Timestamp": 10101, + "Expiry": 10101, + "SeqNo": 42 + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } +] +``` + +### MarketListDataTransfers + + +Perms: write + +Inputs: `[]` + +Response: +```json +[ + { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + } +] +``` + +### MarketListDeals + + +Perms: read + +Inputs: +```json +[ + [ + "f01234" + ] +] +``` + +Response: +```json +[ + { + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "State": { + "SectorStartEpoch": 10101, + "LastUpdatedEpoch": 10101, + "SlashEpoch": 10101 + } + } +] +``` + +### MarketListIncompleteDeals + + +Perms: read + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +[ + { + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "ClientSignature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ProposalCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "AddFundsCid": null, + "PublishCid": null, + "Miner": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Client": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "State": 42, + "PiecePath": "/some/path", + "MetadataPath": "/some/path", + "SlashEpoch": 10101, + "FastRetrieval": true, + "Message": "string value", + "FundsReserved": "0", + "Ref": { + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceCid": null, + "PieceSize": 1024, + "RawBlockSize": 42 + }, + "AvailableForRetrieval": true, + "DealID": 5432, + "CreationTime": "0001-01-01T00:00:00Z", + "TransferChannelId": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "SectorNumber": 9, + "InboundCAR": "string value" + } +] +``` + +### MarketListRetrievalAsk + + +Perms: read + +Inputs: `[]` + +Response: +```json +[ + { + "Miner": "f01234", + "PricePerByte": "0", + "UnsealPrice": "0", + "PaymentInterval": 42, + "PaymentIntervalIncrease": 42 + } +] +``` + +### MarketListRetrievalDeals + + +Perms: read + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +[ + { + "PayloadCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ID": 5, + "Selector": { + "Raw": "Ynl0ZSBhcnJheQ==" + }, + "PieceCID": null, + "PricePerByte": "0", + "PaymentInterval": 42, + "PaymentIntervalIncrease": 42, + "UnsealPrice": "0", + "StoreID": 42, + "SelStorageProposalCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "Status": 0, + "Receiver": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "TotalSent": 42, + "FundsReceived": "0", + "Message": "string value", + "CurrentInterval": 42, + "LegacyProtocol": true + } +] +``` + +### MarketPendingDeals + + +Perms: write + +Inputs: `[]` + +Response: +```json +[ + { + "Deals": [ + { + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "ClientSignature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } + ], + "PublishPeriodStart": "0001-01-01T00:00:00Z", + "PublishPeriod": 60000000000 + } +] +``` + +### MarketPublishPendingDeals + + +Perms: admin + +Inputs: `[]` + +Response: `{}` + +### MarketReleaseFunds + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "0" +] +``` + +Response: `{}` + +### MarketReserveFunds + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234", + "0" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MarketRestartDataTransfer +MarketRestartDataTransfer attempts to restart a data transfer with the given transfer ID and other peer + + +Perms: write + +Inputs: +```json +[ + 3, + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + true +] +``` + +Response: `{}` + +### MarketSetAsk + + +Perms: admin + +Inputs: +```json +[ + "f01234", + "0", + "0", + 10101, + 1032, + 1032 +] +``` + +Response: `{}` + +### MarketSetRetrievalAsk + + +Perms: admin + +Inputs: +```json +[ + "f01234", + { + "PricePerByte": "0", + "UnsealPrice": "0", + "PaymentInterval": 42, + "PaymentIntervalIncrease": 42 + } +] +``` + +Response: `{}` + +### MarketWithdraw + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234", + "0" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MessagerGetMessage + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" +} +``` + +### MessagerPushMessage + + +Perms: write + +Inputs: +```json +[ + { + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + }, + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==" + }, + { + "MaxFee": "0", + "GasOverEstimation": 12.3 + } +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MessagerWaitMessage +messager + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "ReturnDec": {}, + "TipSet": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 +} +``` + +### NetAddrsListen + + +Perms: read + +Inputs: `[]` + +Response: +```json +{ + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] +} +``` + +### PaychVoucherList +Paych + + +Perms: read + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +[ + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } +] +``` + +### PiecesGetCIDInfo + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "CID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceBlockLocations": [ + { + "RelOffset": 42, + "BlockSize": 42, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ] +} +``` + +### PiecesGetPieceInfo + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Deals": [ + { + "DealID": 5432, + "SectorID": 9, + "Offset": 1032, + "Length": 1032 + } + ] +} +``` + +### PiecesListCidInfos + + +Perms: read + +Inputs: `[]` + +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +### PiecesListPieces + + +Perms: read + +Inputs: `[]` + +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +### ResponseMarketEvent +market event + + +Perms: read + +Inputs: +```json +[ + { + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Payload": "Ynl0ZSBhcnJheQ==", + "Error": "string value" + } +] +``` + +Response: `{}` + +### SectorGetSealDelay +SectorGetSealDelay gets the time that a newly-created sector +waits for more deals before it starts sealing + + +Perms: read + +Inputs: `[]` + +Response: `60000000000` + +### SectorSetExpectedSealDuration +SectorSetExpectedSealDuration sets the expected time for a sector to seal + + +Perms: write + +Inputs: +```json +[ + 60000000000 +] +``` + +Response: `{}` + +### UpdateDealOnPacking + + +Perms: write + +Inputs: +```json +[ + "f01234", + 5432, + 9, + 1032 +] +``` + +Response: `{}` + +### UpdateDealStatus + + +Perms: write + +Inputs: +```json +[ + "f01234", + 5432, + "string value" +] +``` + +Response: `{}` + +### UpdateStorageDealStatus + + +Perms: write + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 42 +] +``` + +Response: `{}` + diff --git a/venus-shared/api/market/proxy_gen.go b/venus-shared/api/market/proxy_gen.go new file mode 100644 index 0000000000..44d303ae81 --- /dev/null +++ b/venus-shared/api/market/proxy_gen.go @@ -0,0 +1,301 @@ +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package market + +import ( + "context" + "time" + + address "github.com/filecoin-project/go-address" + datatransfer "github.com/filecoin-project/go-data-transfer" + "github.com/filecoin-project/go-fil-markets/piecestore" + "github.com/filecoin-project/go-fil-markets/retrievalmarket" + "github.com/filecoin-project/go-fil-markets/storagemarket" + "github.com/filecoin-project/go-state-types/abi" + cid "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/venus/venus-shared/types/gateway" + "github.com/filecoin-project/venus/venus-shared/types/market" +) + +type IMarketStruct struct { + Internal struct { + ActorExist func(ctx context.Context, addr address.Address) (bool, error) `perm:"read"` + ActorList func(context.Context) ([]market.User, error) `perm:"read"` + ActorSectorSize func(context.Context, address.Address) (abi.SectorSize, error) `perm:"read"` + AssignUnPackedDeals func(ctx context.Context, miner address.Address, ssize abi.SectorSize, spec *market.GetDealSpec) ([]*market.DealInfoIncludePath, error) `perm:"write"` + DagstoreGC func(ctx context.Context) ([]market.DagstoreShardResult, error) `perm:"admin"` + DagstoreInitializeAll func(ctx context.Context, params market.DagstoreInitializeAllParams) (<-chan market.DagstoreInitializeAllEvent, error) `perm:"write"` + DagstoreInitializeShard func(ctx context.Context, key string) error `perm:"write"` + DagstoreListShards func(ctx context.Context) ([]market.DagstoreShardInfo, error) `perm:"read"` + DagstoreRecoverShard func(ctx context.Context, key string) error `perm:"write"` + DealsConsiderOfflineRetrievalDeals func(context.Context) (bool, error) `perm:"admin"` + DealsConsiderOfflineStorageDeals func(context.Context) (bool, error) `perm:"admin"` + DealsConsiderOnlineRetrievalDeals func(context.Context) (bool, error) `perm:"admin"` + DealsConsiderOnlineStorageDeals func(context.Context) (bool, error) `perm:"admin"` + DealsConsiderUnverifiedStorageDeals func(context.Context) (bool, error) `perm:"admin"` + DealsConsiderVerifiedStorageDeals func(context.Context) (bool, error) `perm:"admin"` + DealsImportData func(ctx context.Context, dealPropCid cid.Cid, file string) error `perm:"admin"` + DealsPieceCidBlocklist func(context.Context) ([]cid.Cid, error) `perm:"admin"` + DealsSetConsiderOfflineRetrievalDeals func(context.Context, bool) error `perm:"admin"` + DealsSetConsiderOfflineStorageDeals func(context.Context, bool) error `perm:"admin"` + DealsSetConsiderOnlineRetrievalDeals func(context.Context, bool) error `perm:"admin"` + DealsSetConsiderOnlineStorageDeals func(context.Context, bool) error `perm:"admin"` + DealsSetConsiderUnverifiedStorageDeals func(context.Context, bool) error `perm:"admin"` + DealsSetConsiderVerifiedStorageDeals func(context.Context, bool) error `perm:"admin"` + DealsSetPieceCidBlocklist func(context.Context, []cid.Cid) error `perm:"admin"` + GetDeals func(ctx context.Context, miner address.Address, pageIndex, pageSize int) ([]*market.DealInfo, error) `perm:"read"` + GetReadUrl func(context.Context, string) (string, error) `perm:"read"` + GetUnPackedDeals func(ctx context.Context, miner address.Address, spec *market.GetDealSpec) ([]*market.DealInfoIncludePath, error) `perm:"read"` + GetWriteUrl func(ctx context.Context, resource string) (string, error) `perm:"read"` + ID func(context.Context) (peer.ID, error) `perm:"read"` + ImportV1Data func(ctx context.Context, src string) error `perm:"write"` + ListenMarketEvent func(ctx context.Context, policy *gateway.MarketRegisterPolicy) (<-chan *gateway.RequestEvent, error) `perm:"read"` + MarkDealsAsPacking func(ctx context.Context, miner address.Address, deals []abi.DealID) error `perm:"write"` + MarketAddBalance func(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) `perm:"sign"` + MarketCancelDataTransfer func(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error `perm:"write"` + MarketDataTransferUpdates func(ctx context.Context) (<-chan market.DataTransferChannel, error) `perm:"write"` + MarketGetAsk func(ctx context.Context, mAddr address.Address) (*storagemarket.SignedStorageAsk, error) `perm:"read"` + MarketGetDealUpdates func(ctx context.Context) (<-chan storagemarket.MinerDeal, error) `perm:"read"` + MarketGetReserved func(ctx context.Context, addr address.Address) (types.BigInt, error) `perm:"sign"` + MarketGetRetrievalAsk func(ctx context.Context, mAddr address.Address) (*retrievalmarket.Ask, error) `perm:"read"` + MarketImportDealData func(ctx context.Context, propcid cid.Cid, path string) error `perm:"write"` + MarketListAsk func(ctx context.Context) ([]*storagemarket.SignedStorageAsk, error) `perm:"read"` + MarketListDataTransfers func(ctx context.Context) ([]market.DataTransferChannel, error) `perm:"write"` + MarketListDeals func(ctx context.Context, addrs []address.Address) ([]types.MarketDeal, error) `perm:"read"` + MarketListIncompleteDeals func(ctx context.Context, mAddr address.Address) ([]storagemarket.MinerDeal, error) `perm:"read"` + MarketListRetrievalAsk func(ctx context.Context) ([]*market.RetrievalAsk, error) `perm:"read"` + MarketListRetrievalDeals func(ctx context.Context, mAddr address.Address) ([]market.ProviderDealState, error) `perm:"read"` + MarketPendingDeals func(ctx context.Context) ([]market.PendingDealInfo, error) `perm:"write"` + MarketPublishPendingDeals func(ctx context.Context) error `perm:"admin"` + MarketReleaseFunds func(ctx context.Context, addr address.Address, amt types.BigInt) error `perm:"sign"` + MarketReserveFunds func(ctx context.Context, wallet address.Address, addr address.Address, amt types.BigInt) (cid.Cid, error) `perm:"sign"` + MarketRestartDataTransfer func(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error `perm:"write"` + MarketSetAsk func(ctx context.Context, mAddr address.Address, price types.BigInt, verifiedPrice types.BigInt, duration abi.ChainEpoch, minPieceSize abi.PaddedPieceSize, maxPieceSize abi.PaddedPieceSize) error `perm:"admin"` + MarketSetRetrievalAsk func(ctx context.Context, mAddr address.Address, rask *retrievalmarket.Ask) error `perm:"admin"` + MarketWithdraw func(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) `perm:"sign"` + MessagerGetMessage func(ctx context.Context, mid cid.Cid) (*types.Message, error) `perm:"read"` + MessagerPushMessage func(ctx context.Context, msg *types.Message, meta *types.MessageSendSpec) (cid.Cid, error) `perm:"write"` + MessagerWaitMessage func(ctx context.Context, mid cid.Cid) (*types.MsgLookup, error) `perm:"read"` + NetAddrsListen func(context.Context) (peer.AddrInfo, error) `perm:"read"` + PaychVoucherList func(ctx context.Context, pch address.Address) ([]*paych.SignedVoucher, error) `perm:"read"` + PiecesGetCIDInfo func(ctx context.Context, payloadCid cid.Cid) (*piecestore.CIDInfo, error) `perm:"read"` + PiecesGetPieceInfo func(ctx context.Context, pieceCid cid.Cid) (*piecestore.PieceInfo, error) `perm:"read"` + PiecesListCidInfos func(ctx context.Context) ([]cid.Cid, error) `perm:"read"` + PiecesListPieces func(ctx context.Context) ([]cid.Cid, error) `perm:"read"` + ResponseMarketEvent func(ctx context.Context, resp *gateway.ResponseEvent) error `perm:"read"` + SectorGetSealDelay func(context.Context) (time.Duration, error) `perm:"read"` + SectorSetExpectedSealDuration func(context.Context, time.Duration) error `perm:"write"` + UpdateDealOnPacking func(ctx context.Context, miner address.Address, dealID abi.DealID, sectorid abi.SectorNumber, offset abi.PaddedPieceSize) error `perm:"write"` + UpdateDealStatus func(ctx context.Context, miner address.Address, dealID abi.DealID, pieceStatus string) error `perm:"write"` + UpdateStorageDealStatus func(ctx context.Context, dealProposalCid cid.Cid, state storagemarket.StorageDealStatus) error `perm:"write"` + } +} + +func (s *IMarketStruct) ActorExist(p0 context.Context, p1 address.Address) (bool, error) { + return s.Internal.ActorExist(p0, p1) +} +func (s *IMarketStruct) ActorList(p0 context.Context) ([]market.User, error) { + return s.Internal.ActorList(p0) +} +func (s *IMarketStruct) ActorSectorSize(p0 context.Context, p1 address.Address) (abi.SectorSize, error) { + return s.Internal.ActorSectorSize(p0, p1) +} +func (s *IMarketStruct) AssignUnPackedDeals(p0 context.Context, p1 address.Address, p2 abi.SectorSize, p3 *market.GetDealSpec) ([]*market.DealInfoIncludePath, error) { + return s.Internal.AssignUnPackedDeals(p0, p1, p2, p3) +} +func (s *IMarketStruct) DagstoreGC(p0 context.Context) ([]market.DagstoreShardResult, error) { + return s.Internal.DagstoreGC(p0) +} +func (s *IMarketStruct) DagstoreInitializeAll(p0 context.Context, p1 market.DagstoreInitializeAllParams) (<-chan market.DagstoreInitializeAllEvent, error) { + return s.Internal.DagstoreInitializeAll(p0, p1) +} +func (s *IMarketStruct) DagstoreInitializeShard(p0 context.Context, p1 string) error { + return s.Internal.DagstoreInitializeShard(p0, p1) +} +func (s *IMarketStruct) DagstoreListShards(p0 context.Context) ([]market.DagstoreShardInfo, error) { + return s.Internal.DagstoreListShards(p0) +} +func (s *IMarketStruct) DagstoreRecoverShard(p0 context.Context, p1 string) error { + return s.Internal.DagstoreRecoverShard(p0, p1) +} +func (s *IMarketStruct) DealsConsiderOfflineRetrievalDeals(p0 context.Context) (bool, error) { + return s.Internal.DealsConsiderOfflineRetrievalDeals(p0) +} +func (s *IMarketStruct) DealsConsiderOfflineStorageDeals(p0 context.Context) (bool, error) { + return s.Internal.DealsConsiderOfflineStorageDeals(p0) +} +func (s *IMarketStruct) DealsConsiderOnlineRetrievalDeals(p0 context.Context) (bool, error) { + return s.Internal.DealsConsiderOnlineRetrievalDeals(p0) +} +func (s *IMarketStruct) DealsConsiderOnlineStorageDeals(p0 context.Context) (bool, error) { + return s.Internal.DealsConsiderOnlineStorageDeals(p0) +} +func (s *IMarketStruct) DealsConsiderUnverifiedStorageDeals(p0 context.Context) (bool, error) { + return s.Internal.DealsConsiderUnverifiedStorageDeals(p0) +} +func (s *IMarketStruct) DealsConsiderVerifiedStorageDeals(p0 context.Context) (bool, error) { + return s.Internal.DealsConsiderVerifiedStorageDeals(p0) +} +func (s *IMarketStruct) DealsImportData(p0 context.Context, p1 cid.Cid, p2 string) error { + return s.Internal.DealsImportData(p0, p1, p2) +} +func (s *IMarketStruct) DealsPieceCidBlocklist(p0 context.Context) ([]cid.Cid, error) { + return s.Internal.DealsPieceCidBlocklist(p0) +} +func (s *IMarketStruct) DealsSetConsiderOfflineRetrievalDeals(p0 context.Context, p1 bool) error { + return s.Internal.DealsSetConsiderOfflineRetrievalDeals(p0, p1) +} +func (s *IMarketStruct) DealsSetConsiderOfflineStorageDeals(p0 context.Context, p1 bool) error { + return s.Internal.DealsSetConsiderOfflineStorageDeals(p0, p1) +} +func (s *IMarketStruct) DealsSetConsiderOnlineRetrievalDeals(p0 context.Context, p1 bool) error { + return s.Internal.DealsSetConsiderOnlineRetrievalDeals(p0, p1) +} +func (s *IMarketStruct) DealsSetConsiderOnlineStorageDeals(p0 context.Context, p1 bool) error { + return s.Internal.DealsSetConsiderOnlineStorageDeals(p0, p1) +} +func (s *IMarketStruct) DealsSetConsiderUnverifiedStorageDeals(p0 context.Context, p1 bool) error { + return s.Internal.DealsSetConsiderUnverifiedStorageDeals(p0, p1) +} +func (s *IMarketStruct) DealsSetConsiderVerifiedStorageDeals(p0 context.Context, p1 bool) error { + return s.Internal.DealsSetConsiderVerifiedStorageDeals(p0, p1) +} +func (s *IMarketStruct) DealsSetPieceCidBlocklist(p0 context.Context, p1 []cid.Cid) error { + return s.Internal.DealsSetPieceCidBlocklist(p0, p1) +} +func (s *IMarketStruct) GetDeals(p0 context.Context, p1 address.Address, p2, p3 int) ([]*market.DealInfo, error) { + return s.Internal.GetDeals(p0, p1, p2, p3) +} +func (s *IMarketStruct) GetReadUrl(p0 context.Context, p1 string) (string, error) { + return s.Internal.GetReadUrl(p0, p1) +} +func (s *IMarketStruct) GetUnPackedDeals(p0 context.Context, p1 address.Address, p2 *market.GetDealSpec) ([]*market.DealInfoIncludePath, error) { + return s.Internal.GetUnPackedDeals(p0, p1, p2) +} +func (s *IMarketStruct) GetWriteUrl(p0 context.Context, p1 string) (string, error) { + return s.Internal.GetWriteUrl(p0, p1) +} +func (s *IMarketStruct) ID(p0 context.Context) (peer.ID, error) { return s.Internal.ID(p0) } +func (s *IMarketStruct) ImportV1Data(p0 context.Context, p1 string) error { + return s.Internal.ImportV1Data(p0, p1) +} +func (s *IMarketStruct) ListenMarketEvent(p0 context.Context, p1 *gateway.MarketRegisterPolicy) (<-chan *gateway.RequestEvent, error) { + return s.Internal.ListenMarketEvent(p0, p1) +} +func (s *IMarketStruct) MarkDealsAsPacking(p0 context.Context, p1 address.Address, p2 []abi.DealID) error { + return s.Internal.MarkDealsAsPacking(p0, p1, p2) +} +func (s *IMarketStruct) MarketAddBalance(p0 context.Context, p1, p2 address.Address, p3 types.BigInt) (cid.Cid, error) { + return s.Internal.MarketAddBalance(p0, p1, p2, p3) +} +func (s *IMarketStruct) MarketCancelDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error { + return s.Internal.MarketCancelDataTransfer(p0, p1, p2, p3) +} +func (s *IMarketStruct) MarketDataTransferUpdates(p0 context.Context) (<-chan market.DataTransferChannel, error) { + return s.Internal.MarketDataTransferUpdates(p0) +} +func (s *IMarketStruct) MarketGetAsk(p0 context.Context, p1 address.Address) (*storagemarket.SignedStorageAsk, error) { + return s.Internal.MarketGetAsk(p0, p1) +} +func (s *IMarketStruct) MarketGetDealUpdates(p0 context.Context) (<-chan storagemarket.MinerDeal, error) { + return s.Internal.MarketGetDealUpdates(p0) +} +func (s *IMarketStruct) MarketGetReserved(p0 context.Context, p1 address.Address) (types.BigInt, error) { + return s.Internal.MarketGetReserved(p0, p1) +} +func (s *IMarketStruct) MarketGetRetrievalAsk(p0 context.Context, p1 address.Address) (*retrievalmarket.Ask, error) { + return s.Internal.MarketGetRetrievalAsk(p0, p1) +} +func (s *IMarketStruct) MarketImportDealData(p0 context.Context, p1 cid.Cid, p2 string) error { + return s.Internal.MarketImportDealData(p0, p1, p2) +} +func (s *IMarketStruct) MarketListAsk(p0 context.Context) ([]*storagemarket.SignedStorageAsk, error) { + return s.Internal.MarketListAsk(p0) +} +func (s *IMarketStruct) MarketListDataTransfers(p0 context.Context) ([]market.DataTransferChannel, error) { + return s.Internal.MarketListDataTransfers(p0) +} +func (s *IMarketStruct) MarketListDeals(p0 context.Context, p1 []address.Address) ([]types.MarketDeal, error) { + return s.Internal.MarketListDeals(p0, p1) +} +func (s *IMarketStruct) MarketListIncompleteDeals(p0 context.Context, p1 address.Address) ([]storagemarket.MinerDeal, error) { + return s.Internal.MarketListIncompleteDeals(p0, p1) +} +func (s *IMarketStruct) MarketListRetrievalAsk(p0 context.Context) ([]*market.RetrievalAsk, error) { + return s.Internal.MarketListRetrievalAsk(p0) +} +func (s *IMarketStruct) MarketListRetrievalDeals(p0 context.Context, p1 address.Address) ([]market.ProviderDealState, error) { + return s.Internal.MarketListRetrievalDeals(p0, p1) +} +func (s *IMarketStruct) MarketPendingDeals(p0 context.Context) ([]market.PendingDealInfo, error) { + return s.Internal.MarketPendingDeals(p0) +} +func (s *IMarketStruct) MarketPublishPendingDeals(p0 context.Context) error { + return s.Internal.MarketPublishPendingDeals(p0) +} +func (s *IMarketStruct) MarketReleaseFunds(p0 context.Context, p1 address.Address, p2 types.BigInt) error { + return s.Internal.MarketReleaseFunds(p0, p1, p2) +} +func (s *IMarketStruct) MarketReserveFunds(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) { + return s.Internal.MarketReserveFunds(p0, p1, p2, p3) +} +func (s *IMarketStruct) MarketRestartDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error { + return s.Internal.MarketRestartDataTransfer(p0, p1, p2, p3) +} +func (s *IMarketStruct) MarketSetAsk(p0 context.Context, p1 address.Address, p2 types.BigInt, p3 types.BigInt, p4 abi.ChainEpoch, p5 abi.PaddedPieceSize, p6 abi.PaddedPieceSize) error { + return s.Internal.MarketSetAsk(p0, p1, p2, p3, p4, p5, p6) +} +func (s *IMarketStruct) MarketSetRetrievalAsk(p0 context.Context, p1 address.Address, p2 *retrievalmarket.Ask) error { + return s.Internal.MarketSetRetrievalAsk(p0, p1, p2) +} +func (s *IMarketStruct) MarketWithdraw(p0 context.Context, p1, p2 address.Address, p3 types.BigInt) (cid.Cid, error) { + return s.Internal.MarketWithdraw(p0, p1, p2, p3) +} +func (s *IMarketStruct) MessagerGetMessage(p0 context.Context, p1 cid.Cid) (*types.Message, error) { + return s.Internal.MessagerGetMessage(p0, p1) +} +func (s *IMarketStruct) MessagerPushMessage(p0 context.Context, p1 *types.Message, p2 *types.MessageSendSpec) (cid.Cid, error) { + return s.Internal.MessagerPushMessage(p0, p1, p2) +} +func (s *IMarketStruct) MessagerWaitMessage(p0 context.Context, p1 cid.Cid) (*types.MsgLookup, error) { + return s.Internal.MessagerWaitMessage(p0, p1) +} +func (s *IMarketStruct) NetAddrsListen(p0 context.Context) (peer.AddrInfo, error) { + return s.Internal.NetAddrsListen(p0) +} +func (s *IMarketStruct) PaychVoucherList(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) { + return s.Internal.PaychVoucherList(p0, p1) +} +func (s *IMarketStruct) PiecesGetCIDInfo(p0 context.Context, p1 cid.Cid) (*piecestore.CIDInfo, error) { + return s.Internal.PiecesGetCIDInfo(p0, p1) +} +func (s *IMarketStruct) PiecesGetPieceInfo(p0 context.Context, p1 cid.Cid) (*piecestore.PieceInfo, error) { + return s.Internal.PiecesGetPieceInfo(p0, p1) +} +func (s *IMarketStruct) PiecesListCidInfos(p0 context.Context) ([]cid.Cid, error) { + return s.Internal.PiecesListCidInfos(p0) +} +func (s *IMarketStruct) PiecesListPieces(p0 context.Context) ([]cid.Cid, error) { + return s.Internal.PiecesListPieces(p0) +} +func (s *IMarketStruct) ResponseMarketEvent(p0 context.Context, p1 *gateway.ResponseEvent) error { + return s.Internal.ResponseMarketEvent(p0, p1) +} +func (s *IMarketStruct) SectorGetSealDelay(p0 context.Context) (time.Duration, error) { + return s.Internal.SectorGetSealDelay(p0) +} +func (s *IMarketStruct) SectorSetExpectedSealDuration(p0 context.Context, p1 time.Duration) error { + return s.Internal.SectorSetExpectedSealDuration(p0, p1) +} +func (s *IMarketStruct) UpdateDealOnPacking(p0 context.Context, p1 address.Address, p2 abi.DealID, p3 abi.SectorNumber, p4 abi.PaddedPieceSize) error { + return s.Internal.UpdateDealOnPacking(p0, p1, p2, p3, p4) +} +func (s *IMarketStruct) UpdateDealStatus(p0 context.Context, p1 address.Address, p2 abi.DealID, p3 string) error { + return s.Internal.UpdateDealStatus(p0, p1, p2, p3) +} +func (s *IMarketStruct) UpdateStorageDealStatus(p0 context.Context, p1 cid.Cid, p2 storagemarket.StorageDealStatus) error { + return s.Internal.UpdateStorageDealStatus(p0, p1, p2) +} diff --git a/venus-shared/types/market/assigner_type.go b/venus-shared/types/market/assigner_type.go new file mode 100644 index 0000000000..aa2fd60e88 --- /dev/null +++ b/venus-shared/types/market/assigner_type.go @@ -0,0 +1,49 @@ +package market + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-fil-markets/piecestore" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" +) + +const ( + Undefine = "Undefine" + Assigned = "Assigned" + Packing = "Packing" + Proving = "Proving" +) + +type DealInfo struct { + piecestore.DealInfo + market.ClientDealProposal + + TransferType string + Root cid.Cid + PublishCid cid.Cid + FastRetrieval bool + Status string +} + +type GetDealSpec struct { + MaxPiece int + MaxPieceSize uint64 +} + +type DealInfoIncludePath struct { + Offset abi.PaddedPieceSize + Length abi.PaddedPieceSize + PayloadSize abi.UnpaddedPieceSize + DealID abi.DealID + TotalStorageFee abi.TokenAmount + market.DealProposal + FastRetrieval bool + PublishCid cid.Cid +} + +type PieceInfo struct { + PieceCID cid.Cid + Deals []*DealInfo +} diff --git a/venus-shared/types/market/cbor_gen.go b/venus-shared/types/market/cbor_gen.go new file mode 100644 index 0000000000..5b38c57b57 --- /dev/null +++ b/venus-shared/types/market/cbor_gen.go @@ -0,0 +1,1590 @@ +// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. + +package market + +import ( + "fmt" + "io" + "math" + "sort" + + address "github.com/filecoin-project/go-address" + datatransfer "github.com/filecoin-project/go-data-transfer" + filestore "github.com/filecoin-project/go-fil-markets/filestore" + retrievalmarket "github.com/filecoin-project/go-fil-markets/retrievalmarket" + storagemarket "github.com/filecoin-project/go-fil-markets/storagemarket" + abi "github.com/filecoin-project/go-state-types/abi" + paych "github.com/filecoin-project/specs-actors/actors/builtin/paych" + cid "github.com/ipfs/go-cid" + peer "github.com/libp2p/go-libp2p-core/peer" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" +) + +var _ = xerrors.Errorf +var _ = cid.Undef +var _ = math.E +var _ = sort.Sort + +var lengthBufFundedAddressState = []byte{131} + +func (t *FundedAddressState) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufFundedAddressState); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Addr (address.Address) (struct) + if err := t.Addr.MarshalCBOR(w); err != nil { + return err + } + + // t.AmtReserved (big.Int) (struct) + if err := t.AmtReserved.MarshalCBOR(w); err != nil { + return err + } + + // t.MsgCid (cid.Cid) (struct) + + if t.MsgCid == nil { + if _, err := w.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCidBuf(scratch, w, *t.MsgCid); err != nil { + return xerrors.Errorf("failed to write cid field t.MsgCid: %w", err) + } + } + + return nil +} + +func (t *FundedAddressState) UnmarshalCBOR(r io.Reader) error { + *t = FundedAddressState{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 3 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Addr (address.Address) (struct) + + { + + if err := t.Addr.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Addr: %w", err) + } + + } + // t.AmtReserved (big.Int) (struct) + + { + + if err := t.AmtReserved.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.AmtReserved: %w", err) + } + + } + // t.MsgCid (cid.Cid) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.MsgCid: %w", err) + } + + t.MsgCid = &c + } + + } + return nil +} + +var lengthBufMsgInfo = []byte{132} + +func (t *MsgInfo) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufMsgInfo); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.ChannelID (string) (string) + if len(t.ChannelID) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.ChannelID was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.ChannelID))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.ChannelID)); err != nil { + return err + } + + // t.MsgCid (cid.Cid) (struct) + + if err := cbg.WriteCidBuf(scratch, w, t.MsgCid); err != nil { + return xerrors.Errorf("failed to write cid field t.MsgCid: %w", err) + } + + // t.Received (bool) (bool) + if err := cbg.WriteBool(w, t.Received); err != nil { + return err + } + + // t.Err (string) (string) + if len(t.Err) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.Err was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.Err))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.Err)); err != nil { + return err + } + return nil +} + +func (t *MsgInfo) UnmarshalCBOR(r io.Reader) error { + *t = MsgInfo{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 4 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.ChannelID (string) (string) + + { + sval, err := cbg.ReadStringBuf(br, scratch) + if err != nil { + return err + } + + t.ChannelID = string(sval) + } + // t.MsgCid (cid.Cid) (struct) + + { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.MsgCid: %w", err) + } + + t.MsgCid = c + + } + // t.Received (bool) (bool) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajOther { + return fmt.Errorf("booleans must be major type 7") + } + switch extra { + case 20: + t.Received = false + case 21: + t.Received = true + default: + return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) + } + // t.Err (string) (string) + + { + sval, err := cbg.ReadStringBuf(br, scratch) + if err != nil { + return err + } + + t.Err = string(sval) + } + return nil +} + +var lengthBufChannelInfo = []byte{140} + +func (t *ChannelInfo) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufChannelInfo); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.ChannelID (string) (string) + if len(t.ChannelID) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.ChannelID was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.ChannelID))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.ChannelID)); err != nil { + return err + } + + // t.Channel (address.Address) (struct) + if err := t.Channel.MarshalCBOR(w); err != nil { + return err + } + + // t.Control (address.Address) (struct) + if err := t.Control.MarshalCBOR(w); err != nil { + return err + } + + // t.Target (address.Address) (struct) + if err := t.Target.MarshalCBOR(w); err != nil { + return err + } + + // t.Direction (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Direction)); err != nil { + return err + } + + // t.Vouchers ([]*market.VoucherInfo) (slice) + if len(t.Vouchers) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Vouchers was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Vouchers))); err != nil { + return err + } + for _, v := range t.Vouchers { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + + // t.NextLane (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.NextLane)); err != nil { + return err + } + + // t.Amount (big.Int) (struct) + if err := t.Amount.MarshalCBOR(w); err != nil { + return err + } + + // t.PendingAmount (big.Int) (struct) + if err := t.PendingAmount.MarshalCBOR(w); err != nil { + return err + } + + // t.CreateMsg (cid.Cid) (struct) + + if t.CreateMsg == nil { + if _, err := w.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCidBuf(scratch, w, *t.CreateMsg); err != nil { + return xerrors.Errorf("failed to write cid field t.CreateMsg: %w", err) + } + } + + // t.AddFundsMsg (cid.Cid) (struct) + + if t.AddFundsMsg == nil { + if _, err := w.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCidBuf(scratch, w, *t.AddFundsMsg); err != nil { + return xerrors.Errorf("failed to write cid field t.AddFundsMsg: %w", err) + } + } + + // t.Settling (bool) (bool) + if err := cbg.WriteBool(w, t.Settling); err != nil { + return err + } + return nil +} + +func (t *ChannelInfo) UnmarshalCBOR(r io.Reader) error { + *t = ChannelInfo{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 12 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.ChannelID (string) (string) + + { + sval, err := cbg.ReadStringBuf(br, scratch) + if err != nil { + return err + } + + t.ChannelID = string(sval) + } + // t.Channel (address.Address) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + t.Channel = new(address.Address) + if err := t.Channel.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Channel pointer: %w", err) + } + } + + } + // t.Control (address.Address) (struct) + + { + + if err := t.Control.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Control: %w", err) + } + + } + // t.Target (address.Address) (struct) + + { + + if err := t.Target.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Target: %w", err) + } + + } + // t.Direction (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Direction = uint64(extra) + + } + // t.Vouchers ([]*market.VoucherInfo) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Vouchers: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Vouchers = make([]*VoucherInfo, extra) + } + + for i := 0; i < int(extra); i++ { + + var v VoucherInfo + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.Vouchers[i] = &v + } + + // t.NextLane (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.NextLane = uint64(extra) + + } + // t.Amount (big.Int) (struct) + + { + + if err := t.Amount.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Amount: %w", err) + } + + } + // t.PendingAmount (big.Int) (struct) + + { + + if err := t.PendingAmount.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.PendingAmount: %w", err) + } + + } + // t.CreateMsg (cid.Cid) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.CreateMsg: %w", err) + } + + t.CreateMsg = &c + } + + } + // t.AddFundsMsg (cid.Cid) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.AddFundsMsg: %w", err) + } + + t.AddFundsMsg = &c + } + + } + // t.Settling (bool) (bool) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajOther { + return fmt.Errorf("booleans must be major type 7") + } + switch extra { + case 20: + t.Settling = false + case 21: + t.Settling = true + default: + return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) + } + return nil +} + +var lengthBufVoucherInfo = []byte{131} + +func (t *VoucherInfo) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufVoucherInfo); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Voucher (paych.SignedVoucher) (struct) + if err := t.Voucher.MarshalCBOR(w); err != nil { + return err + } + + // t.Proof ([]uint8) (slice) + if len(t.Proof) > cbg.ByteArrayMaxLen { + return xerrors.Errorf("Byte array in field t.Proof was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.Proof))); err != nil { + return err + } + + if _, err := w.Write(t.Proof[:]); err != nil { + return err + } + + // t.Submitted (bool) (bool) + if err := cbg.WriteBool(w, t.Submitted); err != nil { + return err + } + return nil +} + +func (t *VoucherInfo) UnmarshalCBOR(r io.Reader) error { + *t = VoucherInfo{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 3 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Voucher (paych.SignedVoucher) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + t.Voucher = new(paych.SignedVoucher) + if err := t.Voucher.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Voucher pointer: %w", err) + } + } + + } + // t.Proof ([]uint8) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.ByteArrayMaxLen { + return fmt.Errorf("t.Proof: byte array too large (%d)", extra) + } + if maj != cbg.MajByteString { + return fmt.Errorf("expected byte array") + } + + if extra > 0 { + t.Proof = make([]uint8, extra) + } + + if _, err := io.ReadFull(br, t.Proof[:]); err != nil { + return err + } + // t.Submitted (bool) (bool) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajOther { + return fmt.Errorf("booleans must be major type 7") + } + switch extra { + case 20: + t.Submitted = false + case 21: + t.Submitted = true + default: + return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) + } + return nil +} + +var lengthBufMinerDeal = []byte{151} + +func (t *MinerDeal) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufMinerDeal); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.ClientDealProposal (market.ClientDealProposal) (struct) + if err := t.ClientDealProposal.MarshalCBOR(w); err != nil { + return err + } + + // t.ProposalCid (cid.Cid) (struct) + + if err := cbg.WriteCidBuf(scratch, w, t.ProposalCid); err != nil { + return xerrors.Errorf("failed to write cid field t.ProposalCid: %w", err) + } + + // t.AddFundsCid (cid.Cid) (struct) + + if t.AddFundsCid == nil { + if _, err := w.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCidBuf(scratch, w, *t.AddFundsCid); err != nil { + return xerrors.Errorf("failed to write cid field t.AddFundsCid: %w", err) + } + } + + // t.PublishCid (cid.Cid) (struct) + + if t.PublishCid == nil { + if _, err := w.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCidBuf(scratch, w, *t.PublishCid); err != nil { + return xerrors.Errorf("failed to write cid field t.PublishCid: %w", err) + } + } + + // t.Miner (peer.ID) (string) + if len(t.Miner) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.Miner was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.Miner))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.Miner)); err != nil { + return err + } + + // t.Client (peer.ID) (string) + if len(t.Client) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.Client was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.Client))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.Client)); err != nil { + return err + } + + // t.State (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.State)); err != nil { + return err + } + + // t.PiecePath (filestore.Path) (string) + if len(t.PiecePath) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.PiecePath was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.PiecePath))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.PiecePath)); err != nil { + return err + } + + // t.PayloadSize (abi.UnpaddedPieceSize) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.PayloadSize)); err != nil { + return err + } + + // t.MetadataPath (filestore.Path) (string) + if len(t.MetadataPath) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.MetadataPath was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.MetadataPath))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.MetadataPath)); err != nil { + return err + } + + // t.SlashEpoch (abi.ChainEpoch) (int64) + if t.SlashEpoch >= 0 { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.SlashEpoch)); err != nil { + return err + } + } else { + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.SlashEpoch-1)); err != nil { + return err + } + } + + // t.FastRetrieval (bool) (bool) + if err := cbg.WriteBool(w, t.FastRetrieval); err != nil { + return err + } + + // t.Message (string) (string) + if len(t.Message) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.Message was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.Message))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.Message)); err != nil { + return err + } + + // t.FundsReserved (big.Int) (struct) + if err := t.FundsReserved.MarshalCBOR(w); err != nil { + return err + } + + // t.Ref (storagemarket.DataRef) (struct) + if err := t.Ref.MarshalCBOR(w); err != nil { + return err + } + + // t.AvailableForRetrieval (bool) (bool) + if err := cbg.WriteBool(w, t.AvailableForRetrieval); err != nil { + return err + } + + // t.DealID (abi.DealID) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.DealID)); err != nil { + return err + } + + // t.CreationTime (typegen.CborTime) (struct) + if err := t.CreationTime.MarshalCBOR(w); err != nil { + return err + } + + // t.TransferChannelID (datatransfer.ChannelID) (struct) + if err := t.TransferChannelID.MarshalCBOR(w); err != nil { + return err + } + + // t.SectorNumber (abi.SectorNumber) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.SectorNumber)); err != nil { + return err + } + + // t.Offset (abi.PaddedPieceSize) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Offset)); err != nil { + return err + } + + // t.PieceStatus (string) (string) + if len(t.PieceStatus) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.PieceStatus was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.PieceStatus))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.PieceStatus)); err != nil { + return err + } + + // t.InboundCAR (string) (string) + if len(t.InboundCAR) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.InboundCAR was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.InboundCAR))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.InboundCAR)); err != nil { + return err + } + return nil +} + +func (t *MinerDeal) UnmarshalCBOR(r io.Reader) error { + *t = MinerDeal{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 23 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.ClientDealProposal (market.ClientDealProposal) (struct) + + { + + if err := t.ClientDealProposal.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.ClientDealProposal: %w", err) + } + + } + // t.ProposalCid (cid.Cid) (struct) + + { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.ProposalCid: %w", err) + } + + t.ProposalCid = c + + } + // t.AddFundsCid (cid.Cid) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.AddFundsCid: %w", err) + } + + t.AddFundsCid = &c + } + + } + // t.PublishCid (cid.Cid) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.PublishCid: %w", err) + } + + t.PublishCid = &c + } + + } + // t.Miner (peer.ID) (string) + + { + sval, err := cbg.ReadStringBuf(br, scratch) + if err != nil { + return err + } + + t.Miner = peer.ID(sval) + } + // t.Client (peer.ID) (string) + + { + sval, err := cbg.ReadStringBuf(br, scratch) + if err != nil { + return err + } + + t.Client = peer.ID(sval) + } + // t.State (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.State = uint64(extra) + + } + // t.PiecePath (filestore.Path) (string) + + { + sval, err := cbg.ReadStringBuf(br, scratch) + if err != nil { + return err + } + + t.PiecePath = filestore.Path(sval) + } + // t.PayloadSize (abi.UnpaddedPieceSize) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.PayloadSize = abi.UnpaddedPieceSize(extra) + + } + // t.MetadataPath (filestore.Path) (string) + + { + sval, err := cbg.ReadStringBuf(br, scratch) + if err != nil { + return err + } + + t.MetadataPath = filestore.Path(sval) + } + // t.SlashEpoch (abi.ChainEpoch) (int64) + { + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + var extraI int64 + if err != nil { + return err + } + switch maj { + case cbg.MajUnsignedInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 positive overflow") + } + case cbg.MajNegativeInt: + extraI = int64(extra) + if extraI < 0 { + return fmt.Errorf("int64 negative oveflow") + } + extraI = -1 - extraI + default: + return fmt.Errorf("wrong type for int64 field: %d", maj) + } + + t.SlashEpoch = abi.ChainEpoch(extraI) + } + // t.FastRetrieval (bool) (bool) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajOther { + return fmt.Errorf("booleans must be major type 7") + } + switch extra { + case 20: + t.FastRetrieval = false + case 21: + t.FastRetrieval = true + default: + return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) + } + // t.Message (string) (string) + + { + sval, err := cbg.ReadStringBuf(br, scratch) + if err != nil { + return err + } + + t.Message = string(sval) + } + // t.FundsReserved (big.Int) (struct) + + { + + if err := t.FundsReserved.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.FundsReserved: %w", err) + } + + } + // t.Ref (storagemarket.DataRef) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + t.Ref = new(storagemarket.DataRef) + if err := t.Ref.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Ref pointer: %w", err) + } + } + + } + // t.AvailableForRetrieval (bool) (bool) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajOther { + return fmt.Errorf("booleans must be major type 7") + } + switch extra { + case 20: + t.AvailableForRetrieval = false + case 21: + t.AvailableForRetrieval = true + default: + return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) + } + // t.DealID (abi.DealID) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.DealID = abi.DealID(extra) + + } + // t.CreationTime (typegen.CborTime) (struct) + + { + + if err := t.CreationTime.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.CreationTime: %w", err) + } + + } + // t.TransferChannelID (datatransfer.ChannelID) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + t.TransferChannelID = new(datatransfer.ChannelID) + if err := t.TransferChannelID.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.TransferChannelID pointer: %w", err) + } + } + + } + // t.SectorNumber (abi.SectorNumber) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.SectorNumber = abi.SectorNumber(extra) + + } + // t.Offset (abi.PaddedPieceSize) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Offset = abi.PaddedPieceSize(extra) + + } + // t.PieceStatus (string) (string) + + { + sval, err := cbg.ReadStringBuf(br, scratch) + if err != nil { + return err + } + + t.PieceStatus = string(sval) + } + // t.InboundCAR (string) (string) + + { + sval, err := cbg.ReadStringBuf(br, scratch) + if err != nil { + return err + } + + t.InboundCAR = string(sval) + } + return nil +} + +var lengthBufRetrievalAsk = []byte{133} + +func (t *RetrievalAsk) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufRetrievalAsk); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Miner (address.Address) (struct) + if err := t.Miner.MarshalCBOR(w); err != nil { + return err + } + + // t.PricePerByte (big.Int) (struct) + if err := t.PricePerByte.MarshalCBOR(w); err != nil { + return err + } + + // t.UnsealPrice (big.Int) (struct) + if err := t.UnsealPrice.MarshalCBOR(w); err != nil { + return err + } + + // t.PaymentInterval (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.PaymentInterval)); err != nil { + return err + } + + // t.PaymentIntervalIncrease (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.PaymentIntervalIncrease)); err != nil { + return err + } + + return nil +} + +func (t *RetrievalAsk) UnmarshalCBOR(r io.Reader) error { + *t = RetrievalAsk{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 5 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Miner (address.Address) (struct) + + { + + if err := t.Miner.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Miner: %w", err) + } + + } + // t.PricePerByte (big.Int) (struct) + + { + + if err := t.PricePerByte.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.PricePerByte: %w", err) + } + + } + // t.UnsealPrice (big.Int) (struct) + + { + + if err := t.UnsealPrice.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.UnsealPrice: %w", err) + } + + } + // t.PaymentInterval (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.PaymentInterval = uint64(extra) + + } + // t.PaymentIntervalIncrease (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.PaymentIntervalIncrease = uint64(extra) + + } + return nil +} + +var lengthBufProviderDealState = []byte{139} + +func (t *ProviderDealState) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufProviderDealState); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.DealProposal (retrievalmarket.DealProposal) (struct) + if err := t.DealProposal.MarshalCBOR(w); err != nil { + return err + } + + // t.StoreID (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.StoreID)); err != nil { + return err + } + + // t.SelStorageProposalCid (cid.Cid) (struct) + + if err := cbg.WriteCidBuf(scratch, w, t.SelStorageProposalCid); err != nil { + return xerrors.Errorf("failed to write cid field t.SelStorageProposalCid: %w", err) + } + + // t.ChannelID (datatransfer.ChannelID) (struct) + if err := t.ChannelID.MarshalCBOR(w); err != nil { + return err + } + + // t.Status (retrievalmarket.DealStatus) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Status)); err != nil { + return err + } + + // t.Receiver (peer.ID) (string) + if len(t.Receiver) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.Receiver was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.Receiver))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.Receiver)); err != nil { + return err + } + + // t.TotalSent (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.TotalSent)); err != nil { + return err + } + + // t.FundsReceived (big.Int) (struct) + if err := t.FundsReceived.MarshalCBOR(w); err != nil { + return err + } + + // t.Message (string) (string) + if len(t.Message) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.Message was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.Message))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.Message)); err != nil { + return err + } + + // t.CurrentInterval (uint64) (uint64) + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.CurrentInterval)); err != nil { + return err + } + + // t.LegacyProtocol (bool) (bool) + if err := cbg.WriteBool(w, t.LegacyProtocol); err != nil { + return err + } + return nil +} + +func (t *ProviderDealState) UnmarshalCBOR(r io.Reader) error { + *t = ProviderDealState{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 11 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.DealProposal (retrievalmarket.DealProposal) (struct) + + { + + if err := t.DealProposal.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.DealProposal: %w", err) + } + + } + // t.StoreID (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.StoreID = uint64(extra) + + } + // t.SelStorageProposalCid (cid.Cid) (struct) + + { + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.SelStorageProposalCid: %w", err) + } + + t.SelStorageProposalCid = c + + } + // t.ChannelID (datatransfer.ChannelID) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + t.ChannelID = new(datatransfer.ChannelID) + if err := t.ChannelID.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.ChannelID pointer: %w", err) + } + } + + } + // t.Status (retrievalmarket.DealStatus) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.Status = retrievalmarket.DealStatus(extra) + + } + // t.Receiver (peer.ID) (string) + + { + sval, err := cbg.ReadStringBuf(br, scratch) + if err != nil { + return err + } + + t.Receiver = peer.ID(sval) + } + // t.TotalSent (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.TotalSent = uint64(extra) + + } + // t.FundsReceived (big.Int) (struct) + + { + + if err := t.FundsReceived.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.FundsReceived: %w", err) + } + + } + // t.Message (string) (string) + + { + sval, err := cbg.ReadStringBuf(br, scratch) + if err != nil { + return err + } + + t.Message = string(sval) + } + // t.CurrentInterval (uint64) (uint64) + + { + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.CurrentInterval = uint64(extra) + + } + // t.LegacyProtocol (bool) (bool) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajOther { + return fmt.Errorf("booleans must be major type 7") + } + switch extra { + case 20: + t.LegacyProtocol = false + case 21: + t.LegacyProtocol = true + default: + return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) + } + return nil +} diff --git a/venus-shared/types/market/client/data.go b/venus-shared/types/market/client/data.go new file mode 100644 index 0000000000..10a66da0df --- /dev/null +++ b/venus-shared/types/market/client/data.go @@ -0,0 +1,98 @@ +package client + +import ( + "fmt" + + "github.com/filecoin-project/go-fil-markets/retrievalmarket" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + "github.com/ipfs/go-datastore" +) + +// DataSelector specifies ipld selector string +// - if the string starts with '{', it's interpreted as json selector string +// see https://ipld.io/specs/selectors/ and https://ipld.io/specs/selectors/fixtures/selector-fixtures-1/ +// - otherwise the string is interpreted as ipld-selector-text-lite (simple ipld path) +// see https://github.com/ipld/go-ipld-selector-text-lite +type DataSelector string + +type FileRef struct { + Path string + IsCAR bool +} + +type ImportID uint64 + +func (id ImportID) DsKey() datastore.Key { + return datastore.NewKey(fmt.Sprintf("%d", id)) +} + +type ImportRes struct { + Root cid.Cid + ImportID ImportID +} + +type Import struct { + Key ImportID + Err string + + Root *cid.Cid + + // Source is the provenance of the import, e.g. "import", "unknown", else. + // Currently useless but may be used in the future. + Source string + + // FilePath is the path of the original file. It is important that the file + // is retained at this path, because it will be referenced during + // the transfer (when we do the UnixFS chunking, we don't duplicate the + // leaves, but rather point to chunks of the original data through + // positional references). + FilePath string + + // CARPath is the path of the CAR file containing the DAG for this import. + CARPath string +} + +type ExportRef struct { + Root cid.Cid + + // DAGs array specifies a list of DAGs to export + // - If exporting into unixfs files, only one DAG is supported, DataSelector is only used to find the targeted root node + // - If exporting into a car file + // - When exactly one text-path DataSelector is specified exports the subgraph and its full merkle-path from the original root + // - Otherwise ( multiple paths and/or JSON selector specs) determines each individual subroot and exports the subtrees as a multi-root car + // - When not specified defaults to a single DAG: + // - Data - the entire DAG: `{"R":{"l":{"none":{}},":>":{"a":{">":{"@":{}}}}}}` + DAGs []DagSpec + + FromLocalCAR string // if specified, get data from a local CARv2 file. + DealID retrievalmarket.DealID +} + +type DagSpec struct { + // DataSelector matches data to be retrieved + // - when using textselector, the path specifies subtree + // - the matched graph must have a single root + DataSelector *DataSelector + + // ExportMerkleProof is applicable only when exporting to a CAR file via a path textselector + // When true, in addition to the selection target, the resulting CAR will contain every block along the + // path back to, and including the original root + // When false the resulting CAR contains only the blocks of the target subdag + ExportMerkleProof bool +} + +type CommPRet struct { + Root cid.Cid + Size abi.UnpaddedPieceSize +} + +type DataSize struct { + PayloadSize int64 + PieceSize abi.PaddedPieceSize +} +type DataCIDSize struct { + PayloadSize int64 + PieceSize abi.PaddedPieceSize + PieceCID cid.Cid +} diff --git a/venus-shared/types/market/client/deal.go b/venus-shared/types/market/client/deal.go new file mode 100644 index 0000000000..b85663caf9 --- /dev/null +++ b/venus-shared/types/market/client/deal.go @@ -0,0 +1,49 @@ +package client + +import ( + "time" + + "github.com/filecoin-project/go-address" + datatransfer "github.com/filecoin-project/go-data-transfer" + "github.com/filecoin-project/go-fil-markets/storagemarket" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/filecoin-project/venus/venus-shared/types/market" +) + +type StartDealParams struct { + Data *storagemarket.DataRef + Wallet address.Address + Miner address.Address + EpochPrice types.BigInt + MinBlocksDuration uint64 + ProviderCollateral types.BigInt + DealStartEpoch abi.ChainEpoch + FastRetrieval bool + VerifiedDeal bool +} + +type DealInfo struct { + ProposalCid cid.Cid + State storagemarket.StorageDealStatus + Message string // more information about deal state, particularly errors + DealStages *storagemarket.DealStages + Provider address.Address + + DataRef *storagemarket.DataRef + PieceCID cid.Cid + Size uint64 + + PricePerEpoch types.BigInt + Duration uint64 + + DealID abi.DealID + + CreationTime time.Time + Verified bool + + TransferChannelID *datatransfer.ChannelID + DataTransfer *market.DataTransferChannel +} diff --git a/venus-shared/types/market/client/query.go b/venus-shared/types/market/client/query.go new file mode 100644 index 0000000000..3351d07b9a --- /dev/null +++ b/venus-shared/types/market/client/query.go @@ -0,0 +1,42 @@ +package client + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-fil-markets/retrievalmarket" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/types" +) + +type QueryOffer struct { + Err string + + Root cid.Cid + Piece *cid.Cid + + Size uint64 + MinPrice types.BigInt + UnsealPrice types.BigInt + PricePerByte abi.TokenAmount + PaymentInterval uint64 + PaymentIntervalIncrease uint64 + Miner address.Address + MinerPeer retrievalmarket.RetrievalPeer +} + +func (o *QueryOffer) Order(client address.Address) RetrievalOrder { + return RetrievalOrder{ + Root: o.Root, + Piece: o.Piece, + Size: o.Size, + Total: o.MinPrice, + UnsealPrice: o.UnsealPrice, + PaymentInterval: o.PaymentInterval, + PaymentIntervalIncrease: o.PaymentIntervalIncrease, + Client: client, + + Miner: o.Miner, + MinerPeer: &o.MinerPeer, + } +} diff --git a/venus-shared/types/market/client/retrieval_order.go b/venus-shared/types/market/client/retrieval_order.go new file mode 100644 index 0000000000..d447e444e0 --- /dev/null +++ b/venus-shared/types/market/client/retrieval_order.go @@ -0,0 +1,30 @@ +package client + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-fil-markets/retrievalmarket" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/types" +) + +type RetrievalOrder struct { + // TODO: make this less unixfs specific + Root cid.Cid + Piece *cid.Cid + DataSelector *DataSelector + + Size uint64 + Total types.BigInt + + UnsealPrice types.BigInt + PaymentInterval uint64 + PaymentIntervalIncrease uint64 + Client address.Address + Miner address.Address + MinerPeer *retrievalmarket.RetrievalPeer +} + +type RestrievalRes struct { + DealID retrievalmarket.DealID +} diff --git a/venus-shared/types/market/client/retriveval_info.go b/venus-shared/types/market/client/retriveval_info.go new file mode 100644 index 0000000000..4eff05d42a --- /dev/null +++ b/venus-shared/types/market/client/retriveval_info.go @@ -0,0 +1,32 @@ +package client + +import ( + datatransfer "github.com/filecoin-project/go-data-transfer" + "github.com/filecoin-project/go-fil-markets/retrievalmarket" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + + "github.com/filecoin-project/venus/venus-shared/types/market" +) + +type RetrievalInfo struct { + PayloadCID cid.Cid + ID retrievalmarket.DealID + PieceCID *cid.Cid + PricePerByte abi.TokenAmount + UnsealPrice abi.TokenAmount + + Status retrievalmarket.DealStatus + Message string // more information about deal state, particularly errors + Provider peer.ID + BytesReceived uint64 + BytesPaidFor uint64 + TotalPaid abi.TokenAmount + + TransferChannelID *datatransfer.ChannelID + DataTransfer *market.DataTransferChannel + + // optional event if part of ClientGetRetrievalUpdates + Event *retrievalmarket.ClientEvent +} diff --git a/venus-shared/types/market/common.go b/venus-shared/types/market/common.go new file mode 100644 index 0000000000..7b23e6b121 --- /dev/null +++ b/venus-shared/types/market/common.go @@ -0,0 +1,24 @@ +package market + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/venus/venus-shared/types" +) + +type SignInfo struct { + Data interface{} + Type types.MsgType + Addr address.Address +} + +type User struct { + Addr address.Address + Account string +} + +type MarketBalance struct { //nolint:golint + Escrow big.Int + Locked big.Int +} diff --git a/venus-shared/types/market/dagstore.go b/venus-shared/types/market/dagstore.go new file mode 100644 index 0000000000..f0166e3059 --- /dev/null +++ b/venus-shared/types/market/dagstore.go @@ -0,0 +1,32 @@ +package market + +// DagstoreShardInfo is the serialized form of dagstore.DagstoreShardInfo that +// we expose through JSON-RPC to avoid clients having to depend on the +// dagstore lib. +type DagstoreShardInfo struct { + Key string + State string + Error string +} + +// DagstoreShardResult enumerates results per shard. +type DagstoreShardResult struct { + Key string + Success bool + Error string +} + +type DagstoreInitializeAllParams struct { + MaxConcurrency int + IncludeSealed bool +} + +// DagstoreInitializeAllEvent represents an initialization event. +type DagstoreInitializeAllEvent struct { + Key string + Event string // "start", "end" + Success bool + Error string + Total int + Current int +} diff --git a/venus-shared/types/market/data_transfer.go b/venus-shared/types/market/data_transfer.go new file mode 100644 index 0000000000..c5e98b98f5 --- /dev/null +++ b/venus-shared/types/market/data_transfer.go @@ -0,0 +1,55 @@ +package market + +import ( + "encoding/json" + "fmt" + + datatransfer "github.com/filecoin-project/go-data-transfer" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" +) + +type DataTransferChannel struct { + TransferID datatransfer.TransferID + Status datatransfer.Status + BaseCID cid.Cid + IsInitiator bool + IsSender bool + Voucher string + Message string + OtherPeer peer.ID + Transferred uint64 + Stages *datatransfer.ChannelStages +} + +// NewDataTransferChannel constructs an API DataTransferChannel type from full channel state snapshot and a host id +func NewDataTransferChannel(hostID peer.ID, channelState datatransfer.ChannelState) DataTransferChannel { + channel := DataTransferChannel{ + TransferID: channelState.TransferID(), + Status: channelState.Status(), + BaseCID: channelState.BaseCID(), + IsSender: channelState.Sender() == hostID, + Message: channelState.Message(), + } + stringer, ok := channelState.Voucher().(fmt.Stringer) + if ok { + channel.Voucher = stringer.String() + } else { + voucherJSON, err := json.Marshal(channelState.Voucher()) + if err != nil { + channel.Voucher = fmt.Errorf("Voucher Serialization: %w", err).Error() //nolint:stylecheck + } else { + channel.Voucher = string(voucherJSON) + } + } + if channel.IsSender { + channel.IsInitiator = !channelState.IsPull() + channel.Transferred = channelState.Sent() + channel.OtherPeer = channelState.Recipient() + } else { + channel.IsInitiator = channelState.IsPull() + channel.Transferred = channelState.Received() + channel.OtherPeer = channelState.Sender() + } + return channel +} diff --git a/venus-shared/types/market/exported.go b/venus-shared/types/market/exported.go new file mode 100644 index 0000000000..252b1cd4ec --- /dev/null +++ b/venus-shared/types/market/exported.go @@ -0,0 +1,10 @@ +package market + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" +) + +type SectorSize = abi.SectorSize +type MinerAddress = address.Address +type MinerID = abi.ActorID diff --git a/venus-shared/types/market/funded_address_state.go b/venus-shared/types/market/funded_address_state.go new file mode 100644 index 0000000000..530a0ca1c9 --- /dev/null +++ b/venus-shared/types/market/funded_address_state.go @@ -0,0 +1,18 @@ +package market + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" +) + +// FundedAddressState keeps track of the state of an address with funds in the +// datastore +type FundedAddressState struct { + Addr address.Address + // AmtReserved is the amount that must be kept in the address (cannot be + // withdrawn) + AmtReserved abi.TokenAmount + // MsgCid is the cid of an in-progress on-chain message + MsgCid *cid.Cid +} diff --git a/venus-shared/types/market/miner_deal.go b/venus-shared/types/market/miner_deal.go new file mode 100644 index 0000000000..dffdef8d49 --- /dev/null +++ b/venus-shared/types/market/miner_deal.go @@ -0,0 +1,71 @@ +package market + +import ( + datatransfer "github.com/filecoin-project/go-data-transfer" + "github.com/filecoin-project/go-fil-markets/filestore" + "github.com/filecoin-project/go-fil-markets/storagemarket" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" +) + +type MinerDeal struct { + market.ClientDealProposal + ProposalCid cid.Cid + AddFundsCid *cid.Cid + PublishCid *cid.Cid + Miner peer.ID + Client peer.ID + State storagemarket.StorageDealStatus + PiecePath filestore.Path + PayloadSize abi.UnpaddedPieceSize + MetadataPath filestore.Path + SlashEpoch abi.ChainEpoch + FastRetrieval bool + Message string + FundsReserved abi.TokenAmount + Ref *storagemarket.DataRef + AvailableForRetrieval bool + + DealID abi.DealID + CreationTime cbg.CborTime + + TransferChannelID *datatransfer.ChannelID `json:"TransferChannelId"` + SectorNumber abi.SectorNumber + + Offset abi.PaddedPieceSize + PieceStatus string + + InboundCAR string +} + +func (deal *MinerDeal) FilMarketMinerDeal() *storagemarket.MinerDeal { + return &storagemarket.MinerDeal{ + ClientDealProposal: deal.ClientDealProposal, + ProposalCid: deal.ProposalCid, + AddFundsCid: deal.AddFundsCid, + PublishCid: deal.PublishCid, + Miner: deal.Miner, + Client: deal.Client, + State: deal.State, + PiecePath: deal.PiecePath, + MetadataPath: deal.MetadataPath, + SlashEpoch: deal.SlashEpoch, + FastRetrieval: deal.FastRetrieval, + Message: deal.Message, + FundsReserved: deal.FundsReserved, + Ref: deal.Ref, + AvailableForRetrieval: deal.AvailableForRetrieval, + + DealID: deal.DealID, + CreationTime: deal.CreationTime, + + TransferChannelId: deal.TransferChannelID, + SectorNumber: deal.SectorNumber, + + InboundCAR: deal.InboundCAR, + } +} diff --git a/venus-shared/types/market/paych.go b/venus-shared/types/market/paych.go new file mode 100644 index 0000000000..9147448fa6 --- /dev/null +++ b/venus-shared/types/market/paych.go @@ -0,0 +1,159 @@ +package market + +import ( + "database/sql/driver" + "encoding/json" + "fmt" + + "github.com/filecoin-project/go-address" + cborutil "github.com/filecoin-project/go-cbor-util" + "github.com/filecoin-project/go-state-types/big" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/builtin/paych" +) + +type VoucherInfo struct { + Voucher *paych.SignedVoucher + Proof []byte // ignored + Submitted bool +} + +type VoucherInfos []*VoucherInfo + +func (info *VoucherInfos) Scan(value interface{}) error { + data, ok := value.([]byte) + if !ok { + return fmt.Errorf("value must be []byte") + } + return json.Unmarshal(data, info) +} + +func (info VoucherInfos) Value() (driver.Value, error) { + return json.Marshal(info) +} + +// ChannelInfo keeps track of information about a channel +type ChannelInfo struct { + // ChannelID is a uuid set at channel creation + ChannelID string + // Channel address - may be nil if the channel hasn't been created yet + Channel *address.Address + // Control is the address of the local node + Control address.Address + // Target is the address of the remote node (on the other end of the channel) + Target address.Address + // Direction indicates if the channel is inbound (Control is the "to" address) + // or outbound (Control is the "from" address) + Direction uint64 + // Vouchers is a list of all vouchers sent on the channel + Vouchers []*VoucherInfo + // NextLane is the number of the next lane that should be used when the + // client requests a new lane (eg to create a voucher for a new deal) + NextLane uint64 + // Amount added to the channel. + // Note: This amount is only used by GetPaych to keep track of how much + // has locally been added to the channel. It should reflect the channel's + // Balance on chain as long as all operations occur on the same datastore. + Amount big.Int + // PendingAmount is the amount that we're awaiting confirmation of + PendingAmount big.Int + // CreateMsg is the CID of a pending create message (while waiting for confirmation) + CreateMsg *cid.Cid + // AddFundsMsg is the CID of a pending add funds message (while waiting for confirmation) + AddFundsMsg *cid.Cid + // Settling indicates whether the channel has entered into the settling state + Settling bool +} + +func (ci *ChannelInfo) From() address.Address { + if ci.Direction == DirOutbound { + return ci.Control + } + return ci.Target +} + +func (ci *ChannelInfo) To() address.Address { + if ci.Direction == DirOutbound { + return ci.Target + } + return ci.Control +} + +// infoForVoucher gets the VoucherInfo for the given voucher. +// returns nil if the channel doesn't have the voucher. +func (ci *ChannelInfo) InfoForVoucher(sv *paych.SignedVoucher) (*VoucherInfo, error) { + for _, v := range ci.Vouchers { + eq, err := cborutil.Equals(sv, v.Voucher) + if err != nil { + return nil, err + } + if eq { + return v, nil + } + } + return nil, nil +} + +func (ci *ChannelInfo) HasVoucher(sv *paych.SignedVoucher) (bool, error) { + vi, err := ci.InfoForVoucher(sv) + return vi != nil, err +} + +// markVoucherSubmitted marks the voucher, and any vouchers of lower nonce +// in the same lane, as being submitted. +// Note: This method doesn't write anything to the store. +func (ci *ChannelInfo) MarkVoucherSubmitted(sv *paych.SignedVoucher) error { + vi, err := ci.InfoForVoucher(sv) + if err != nil { + return err + } + if vi == nil { + return fmt.Errorf("cannot submit voucher that has not been added to channel") + } + + // Mark the voucher as submitted + vi.Submitted = true + + // Mark lower-nonce vouchers in the same lane as submitted (lower-nonce + // vouchers are superseded by the submitted voucher) + for _, vi := range ci.Vouchers { + if vi.Voucher.Lane == sv.Lane && vi.Voucher.Nonce < sv.Nonce { + vi.Submitted = true + } + } + + return nil +} + +// wasVoucherSubmitted returns true if the voucher has been submitted +func (ci *ChannelInfo) WasVoucherSubmitted(sv *paych.SignedVoucher) (bool, error) { + vi, err := ci.InfoForVoucher(sv) + if err != nil { + return false, err + } + if vi == nil { + return false, fmt.Errorf("cannot submit voucher that has not been added to channel") + } + return vi.Submitted, nil +} + +// MsgInfo stores information about a create channel / add funds message +// that has been sent +type MsgInfo struct { + // ChannelID links the message to a channel + ChannelID string + // MsgCid is the CID of the message + MsgCid cid.Cid + // Received indicates whether a response has been received + Received bool + // Err is the error received in the response + Err string +} + +const ( + DirInbound = 1 + DirOutbound = 2 +) + +var ErrChannelNotFound = fmt.Errorf("channel not found") diff --git a/venus-shared/types/market/retrieval_ask.go b/venus-shared/types/market/retrieval_ask.go new file mode 100644 index 0000000000..aa755f8b14 --- /dev/null +++ b/venus-shared/types/market/retrieval_ask.go @@ -0,0 +1,14 @@ +package market + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" +) + +type RetrievalAsk struct { + Miner address.Address + PricePerByte abi.TokenAmount + UnsealPrice abi.TokenAmount + PaymentInterval uint64 + PaymentIntervalIncrease uint64 +} diff --git a/venus-shared/types/market/retrieval_deal.go b/venus-shared/types/market/retrieval_deal.go new file mode 100644 index 0000000000..23fbd8cba0 --- /dev/null +++ b/venus-shared/types/market/retrieval_deal.go @@ -0,0 +1,47 @@ +package market + +import ( + datatransfer "github.com/filecoin-project/go-data-transfer" + "github.com/filecoin-project/go-fil-markets/retrievalmarket" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" +) + +// ProviderDealState is the current state of a deal from the point of view +// of a retrieval provider +type ProviderDealState struct { + retrievalmarket.DealProposal + StoreID uint64 + SelStorageProposalCid cid.Cid + ChannelID *datatransfer.ChannelID + Status retrievalmarket.DealStatus + Receiver peer.ID + TotalSent uint64 + FundsReceived abi.TokenAmount + Message string + CurrentInterval uint64 + LegacyProtocol bool +} + +func (deal *ProviderDealState) TotalPaidFor() uint64 { + totalPaidFor := uint64(0) + if !deal.PricePerByte.IsZero() { + totalPaidFor = big.Div(big.Max(big.Sub(deal.FundsReceived, deal.UnsealPrice), big.Zero()), deal.PricePerByte).Uint64() + } + return totalPaidFor +} + +func (deal *ProviderDealState) IntervalLowerBound() uint64 { + return deal.Params.IntervalLowerBound(deal.CurrentInterval) +} + +func (deal *ProviderDealState) NextInterval() uint64 { + return deal.Params.NextInterval(deal.CurrentInterval) +} + +// Identifier provides a unique id for this provider deal +func (deal ProviderDealState) Identifier() retrievalmarket.ProviderDealIdentifier { + return retrievalmarket.ProviderDealIdentifier{Receiver: deal.Receiver, DealID: deal.ID} +} diff --git a/venus-shared/types/market/storage.go b/venus-shared/types/market/storage.go new file mode 100644 index 0000000000..b706a3d6c9 --- /dev/null +++ b/venus-shared/types/market/storage.go @@ -0,0 +1,116 @@ +package market + +import ( + "time" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" +) + +//todo move to sealer + +// PendingDealInfo has info about pending deals and when they are due to be +// published +type PendingDealInfo struct { + Deals []market.ClientDealProposal + PublishPeriodStart time.Time + PublishPeriod time.Duration +} + +type SectorOffset struct { + Sector abi.SectorNumber + Offset abi.PaddedPieceSize +} + +// DealInfo is a tuple of deal identity and its schedule +type PieceDealInfo struct { + PublishCid *cid.Cid + DealID abi.DealID + DealProposal *market.DealProposal + DealSchedule DealSchedule + KeepUnsealed bool +} + +// DealSchedule communicates the time interval of a piecestorage deal. The deal must +// appear in a sealed (proven) sector no later than StartEpoch, otherwise it +// is invalid. +type DealSchedule struct { + StartEpoch abi.ChainEpoch + EndEpoch abi.ChainEpoch +} + +type SectorState string + +type SealTicket struct { + Value abi.SealRandomness + Epoch abi.ChainEpoch +} + +type SealSeed struct { + Value abi.InteractiveSealRandomness + Epoch abi.ChainEpoch +} + +type SectorLog struct { + Kind string + Timestamp uint64 + + Trace string + + Message string +} + +type SectorInfo struct { + SectorID abi.SectorNumber + State SectorState + CommD *cid.Cid + CommR *cid.Cid + Proof []byte + Deals []abi.DealID + Ticket SealTicket + Seed SealSeed + PreCommitMsg *cid.Cid + CommitMsg *cid.Cid + Retries uint64 + ToUpgrade bool + + LastErr string + + Log []SectorLog + + // On Chain Info + SealProof abi.RegisteredSealProof // The seal proof type implies the PoSt proof/s + Activation abi.ChainEpoch // Epoch during which the sector proof was accepted + Expiration abi.ChainEpoch // Epoch during which the sector expires + DealWeight abi.DealWeight // Integral of active deals over sector lifetime + VerifiedDealWeight abi.DealWeight // Integral of active verified deals over sector lifetime + InitialPledge abi.TokenAmount // Pledge collected to commit this sector + // Expiration Info + OnTime abi.ChainEpoch + // non-zero if sector is faulty, epoch at which it will be permanently + // removed if it doesn't recover + Early abi.ChainEpoch +} + +type SealedRef struct { + SectorID abi.SectorNumber + Offset abi.PaddedPieceSize + Size abi.UnpaddedPieceSize +} + +type SealedRefs struct { + Refs []SealedRef +} + +type AddrUse int + +const ( + PreCommitAddr AddrUse = iota + CommitAddr + DealPublishAddr + PoStAddr + + TerminateSectorsAddr +) From ebc5d82f3d1755a9447fc81640d07d1e5d767e01 Mon Sep 17 00:00:00 2001 From: Caesar Wang Date: Thu, 17 Feb 2022 14:21:46 +0800 Subject: [PATCH 151/167] feat: remove previous api def for gateway: with proof event related methods only (#4779) --- venus-shared/api/gateway/api.go | 12 ------- venus-shared/api/gateway/client_gen.go | 24 ------------- venus-shared/api/gateway/method.md | 49 -------------------------- venus-shared/api/gateway/proxy_gen.go | 22 ------------ 4 files changed, 107 deletions(-) delete mode 100644 venus-shared/api/gateway/api.go delete mode 100644 venus-shared/api/gateway/client_gen.go delete mode 100644 venus-shared/api/gateway/method.md delete mode 100644 venus-shared/api/gateway/proxy_gen.go diff --git a/venus-shared/api/gateway/api.go b/venus-shared/api/gateway/api.go deleted file mode 100644 index efb5f9ff41..0000000000 --- a/venus-shared/api/gateway/api.go +++ /dev/null @@ -1,12 +0,0 @@ -package gateway - -import ( - "context" - - "github.com/filecoin-project/venus/venus-shared/types/gateway" -) - -type IProofEventAPI interface { - ResponseProofEvent(ctx context.Context, resp *gateway.ResponseEvent) error //perm:write - ListenProofEvent(ctx context.Context, policy *gateway.ProofRegisterPolicy) (<-chan *gateway.RequestEvent, error) //perm:write -} diff --git a/venus-shared/api/gateway/client_gen.go b/venus-shared/api/gateway/client_gen.go deleted file mode 100644 index ad98a81b3b..0000000000 --- a/venus-shared/api/gateway/client_gen.go +++ /dev/null @@ -1,24 +0,0 @@ -// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. -package gateway - -import ( - "context" - "net/http" - - "github.com/filecoin-project/go-jsonrpc" - - "github.com/filecoin-project/venus/venus-shared/api" -) - -// NewIProofEventAPIRPC creates a new httpparse jsonrpc remotecli. -func NewIProofEventAPIRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (IProofEventAPI, jsonrpc.ClientCloser, error) { - if requestHeader == nil { - requestHeader = http.Header{} - } - requestHeader.Set(api.VenusAPINamespaceHeader, "gateway.IProofEventAPI") - - var res IProofEventAPIStruct - closer, err := jsonrpc.NewMergeClient(ctx, addr, "Gateway", api.GetInternalStructs(&res), requestHeader, opts...) - - return &res, closer, err -} diff --git a/venus-shared/api/gateway/method.md b/venus-shared/api/gateway/method.md deleted file mode 100644 index b0429b5312..0000000000 --- a/venus-shared/api/gateway/method.md +++ /dev/null @@ -1,49 +0,0 @@ -# Groups - -* [ProofEvent](#ProofEvent) - * [ListenProofEvent](#ListenProofEvent) - * [ResponseProofEvent](#ResponseProofEvent) - -## ProofEvent - -### ListenProofEvent - - -Perms: write - -Inputs: -```json -[ - { - "MinerAddress": "f01234" - } -] -``` - -Response: -```json -{ - "Id": "07070707-0707-0707-0707-070707070707", - "Method": "string value", - "Payload": "Ynl0ZSBhcnJheQ==" -} -``` - -### ResponseProofEvent - - -Perms: write - -Inputs: -```json -[ - { - "Id": "07070707-0707-0707-0707-070707070707", - "Payload": "Ynl0ZSBhcnJheQ==", - "Error": "string value" - } -] -``` - -Response: `{}` - diff --git a/venus-shared/api/gateway/proxy_gen.go b/venus-shared/api/gateway/proxy_gen.go deleted file mode 100644 index c7f0f85f3b..0000000000 --- a/venus-shared/api/gateway/proxy_gen.go +++ /dev/null @@ -1,22 +0,0 @@ -// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. -package gateway - -import ( - "context" - - "github.com/filecoin-project/venus/venus-shared/types/gateway" -) - -type IProofEventAPIStruct struct { - Internal struct { - ListenProofEvent func(ctx context.Context, policy *gateway.ProofRegisterPolicy) (<-chan *gateway.RequestEvent, error) `perm:"write"` - ResponseProofEvent func(ctx context.Context, resp *gateway.ResponseEvent) error `perm:"write"` - } -} - -func (s *IProofEventAPIStruct) ListenProofEvent(p0 context.Context, p1 *gateway.ProofRegisterPolicy) (<-chan *gateway.RequestEvent, error) { - return s.Internal.ListenProofEvent(p0, p1) -} -func (s *IProofEventAPIStruct) ResponseProofEvent(p0 context.Context, p1 *gateway.ResponseEvent) error { - return s.Internal.ResponseProofEvent(p0, p1) -} From 631849ced806aa20ff245487bd12c7175db87ec5 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Thu, 17 Feb 2022 14:44:09 +0800 Subject: [PATCH 152/167] type: venus-shared: add pad byte index (#4777) * type: venus-shared: add pad byte index --- venus-devtool/api-gen/example.go | 3 +-- venus-shared/api/gateway/v1/market_event.go | 11 +++++------ venus-shared/api/gateway/v1/proxy_gen.go | 15 +++++++------- venus-shared/types/gateway/market_event.go | 6 +++--- venus-shared/types/padded_byte.go | 22 +++++++++++++++++++++ 5 files changed, 38 insertions(+), 19 deletions(-) create mode 100644 venus-shared/types/padded_byte.go diff --git a/venus-devtool/api-gen/example.go b/venus-devtool/api-gen/example.go index 5ed138870f..8f318cf217 100644 --- a/venus-devtool/api-gen/example.go +++ b/venus-devtool/api-gen/example.go @@ -17,7 +17,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/exitcode" - commontypes "github.com/ipfs-force-community/venus-common-utils/types" "github.com/ipfs/go-cid" "github.com/ipfs/go-graphsync" textselector "github.com/ipld/go-ipld-selector-text-lite" @@ -224,7 +223,7 @@ func init() { addExample(wallet.MEChainMsg) // used in gateway - addExample(commontypes.PaddedByteIndex(10)) + addExample(types.PaddedByteIndex(10)) // used in market addExample(filestore.Path("/some/path")) diff --git a/venus-shared/api/gateway/v1/market_event.go b/venus-shared/api/gateway/v1/market_event.go index 8702bc4019..42db2d2872 100644 --- a/venus-shared/api/gateway/v1/market_event.go +++ b/venus-shared/api/gateway/v1/market_event.go @@ -6,16 +6,15 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/specs-storage/storage" - types2 "github.com/ipfs-force-community/venus-common-utils/types" - "github.com/ipfs/go-cid" - + "github.com/filecoin-project/venus/venus-shared/types" gtypes "github.com/filecoin-project/venus/venus-shared/types/gateway" + "github.com/ipfs/go-cid" ) type IMarketEvent interface { - ListMarketConnectionsState(ctx context.Context) ([]gtypes.MarketConnectionState, error) //perm:admin - IsUnsealed(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types2.PaddedByteIndex, size abi.PaddedPieceSize) (bool, error) //perm:admin - SectorsUnsealPiece(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types2.PaddedByteIndex, size abi.PaddedPieceSize, dest string) error //perm:admin + ListMarketConnectionsState(ctx context.Context) ([]gtypes.MarketConnectionState, error) //perm:admin + IsUnsealed(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types.PaddedByteIndex, size abi.PaddedPieceSize) (bool, error) //perm:admin + SectorsUnsealPiece(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types.PaddedByteIndex, size abi.PaddedPieceSize, dest string) error //perm:admin ResponseMarketEvent(ctx context.Context, resp *gtypes.ResponseEvent) error //perm:read ListenMarketEvent(ctx context.Context, policy *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) //perm:read diff --git a/venus-shared/api/gateway/v1/proxy_gen.go b/venus-shared/api/gateway/v1/proxy_gen.go index dff12e8f82..5445131e12 100644 --- a/venus-shared/api/gateway/v1/proxy_gen.go +++ b/venus-shared/api/gateway/v1/proxy_gen.go @@ -9,7 +9,6 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-storage/storage" - types2 "github.com/ipfs-force-community/venus-common-utils/types" cid "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/venus-shared/actors/builtin" @@ -87,15 +86,15 @@ func (s *IWalletEventStruct) WalletSign(p0 context.Context, p1 string, p2 addres type IMarketEventStruct struct { Internal struct { - IsUnsealed func(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types2.PaddedByteIndex, size abi.PaddedPieceSize) (bool, error) `perm:"admin"` - ListMarketConnectionsState func(ctx context.Context) ([]gtypes.MarketConnectionState, error) `perm:"admin"` - ListenMarketEvent func(ctx context.Context, policy *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` - ResponseMarketEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` - SectorsUnsealPiece func(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types2.PaddedByteIndex, size abi.PaddedPieceSize, dest string) error `perm:"admin"` + IsUnsealed func(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types.PaddedByteIndex, size abi.PaddedPieceSize) (bool, error) `perm:"admin"` + ListMarketConnectionsState func(ctx context.Context) ([]gtypes.MarketConnectionState, error) `perm:"admin"` + ListenMarketEvent func(ctx context.Context, policy *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` + ResponseMarketEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` + SectorsUnsealPiece func(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types.PaddedByteIndex, size abi.PaddedPieceSize, dest string) error `perm:"admin"` } } -func (s *IMarketEventStruct) IsUnsealed(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 storage.SectorRef, p4 types2.PaddedByteIndex, p5 abi.PaddedPieceSize) (bool, error) { +func (s *IMarketEventStruct) IsUnsealed(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 storage.SectorRef, p4 types.PaddedByteIndex, p5 abi.PaddedPieceSize) (bool, error) { return s.Internal.IsUnsealed(p0, p1, p2, p3, p4, p5) } func (s *IMarketEventStruct) ListMarketConnectionsState(p0 context.Context) ([]gtypes.MarketConnectionState, error) { @@ -107,7 +106,7 @@ func (s *IMarketEventStruct) ListenMarketEvent(p0 context.Context, p1 *gtypes.Ma func (s *IMarketEventStruct) ResponseMarketEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { return s.Internal.ResponseMarketEvent(p0, p1) } -func (s *IMarketEventStruct) SectorsUnsealPiece(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 storage.SectorRef, p4 types2.PaddedByteIndex, p5 abi.PaddedPieceSize, p6 string) error { +func (s *IMarketEventStruct) SectorsUnsealPiece(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 storage.SectorRef, p4 types.PaddedByteIndex, p5 abi.PaddedPieceSize, p6 string) error { return s.Internal.SectorsUnsealPiece(p0, p1, p2, p3, p4, p5, p6) } diff --git a/venus-shared/types/gateway/market_event.go b/venus-shared/types/gateway/market_event.go index a176081f81..465d1e3e7b 100644 --- a/venus-shared/types/gateway/market_event.go +++ b/venus-shared/types/gateway/market_event.go @@ -4,7 +4,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/specs-storage/storage" - types2 "github.com/ipfs-force-community/venus-common-utils/types" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/ipfs/go-cid" ) @@ -15,7 +15,7 @@ type MarketRegisterPolicy struct { type IsUnsealRequest struct { PieceCid cid.Cid Sector storage.SectorRef - Offset types2.PaddedByteIndex + Offset types.PaddedByteIndex Size abi.PaddedPieceSize } @@ -25,7 +25,7 @@ type IsUnsealResponse struct { type UnsealRequest struct { PieceCid cid.Cid Sector storage.SectorRef - Offset types2.PaddedByteIndex + Offset types.PaddedByteIndex Size abi.PaddedPieceSize Dest string } diff --git a/venus-shared/types/padded_byte.go b/venus-shared/types/padded_byte.go new file mode 100644 index 0000000000..92c1fcdad9 --- /dev/null +++ b/venus-shared/types/padded_byte.go @@ -0,0 +1,22 @@ +package types + +import ( + "github.com/filecoin-project/go-state-types/abi" + "golang.org/x/xerrors" +) + +type UnpaddedByteIndex uint64 + +func (i UnpaddedByteIndex) Padded() PaddedByteIndex { + return PaddedByteIndex(abi.UnpaddedPieceSize(i).Padded()) +} + +func (i UnpaddedByteIndex) Valid() error { + if i%127 != 0 { + return xerrors.Errorf("unpadded byte index must be a multiple of 127") + } + + return nil +} + +type PaddedByteIndex uint64 From a1df3e59a16c6d21c45a39d6a5b9ea9c9d111b26 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Thu, 17 Feb 2022 21:16:30 +0800 Subject: [PATCH 153/167] add v0 api for gateway (#4780) --- venus-devtool/api-gen/common.go | 11 + venus-shared/api/gateway/v0/api.go | 7 + venus-shared/api/gateway/v0/client_gen.go | 24 + venus-shared/api/gateway/v0/market_event.go | 21 + venus-shared/api/gateway/v0/method.md | 469 ++++++++++++++++++++ venus-shared/api/gateway/v0/proof_event.go | 19 + venus-shared/api/gateway/v0/proxy_gen.go | 116 +++++ venus-shared/api/gateway/v0/wallet_event.go | 24 + 8 files changed, 691 insertions(+) create mode 100644 venus-shared/api/gateway/v0/api.go create mode 100644 venus-shared/api/gateway/v0/client_gen.go create mode 100644 venus-shared/api/gateway/v0/market_event.go create mode 100644 venus-shared/api/gateway/v0/method.md create mode 100644 venus-shared/api/gateway/v0/proof_event.go create mode 100644 venus-shared/api/gateway/v0/proxy_gen.go create mode 100644 venus-shared/api/gateway/v0/wallet_event.go diff --git a/venus-devtool/api-gen/common.go b/venus-devtool/api-gen/common.go index 04efaafc15..bdd9d092b3 100644 --- a/venus-devtool/api-gen/common.go +++ b/venus-devtool/api-gen/common.go @@ -9,6 +9,7 @@ import ( "reflect" "github.com/filecoin-project/venus/venus-devtool/util" + gatewayv0 "github.com/filecoin-project/venus/venus-shared/api/gateway/v0" gatewayv1 "github.com/filecoin-project/venus/venus-shared/api/gateway/v1" "github.com/filecoin-project/venus/venus-shared/api/market" market_client "github.com/filecoin-project/venus/venus-shared/api/market/client" @@ -49,6 +50,16 @@ func init() { MethodNamespace: "Gateway", }, }, + util.APIMeta{ + Type: reflect.TypeOf((*gatewayv0.IGateway)(nil)).Elem(), + ParseOpt: util.InterfaceParseOption{ + ImportPath: "github.com/filecoin-project/venus/venus-shared/api/gateway/v0", + IncludeAll: true, + }, + RPCMeta: util.RPCMeta{ + MethodNamespace: "Gateway", + }, + }, util.APIMeta{ Type: reflect.TypeOf((*market.IMarket)(nil)).Elem(), ParseOpt: util.InterfaceParseOption{ diff --git a/venus-shared/api/gateway/v0/api.go b/venus-shared/api/gateway/v0/api.go new file mode 100644 index 0000000000..a7d52eafd1 --- /dev/null +++ b/venus-shared/api/gateway/v0/api.go @@ -0,0 +1,7 @@ +package v0 + +type IGateway interface { + IProofEvent + IWalletEvent + IMarketEvent +} diff --git a/venus-shared/api/gateway/v0/client_gen.go b/venus-shared/api/gateway/v0/client_gen.go new file mode 100644 index 0000000000..dfcc22dfa1 --- /dev/null +++ b/venus-shared/api/gateway/v0/client_gen.go @@ -0,0 +1,24 @@ +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package v0 + +import ( + "context" + "net/http" + + "github.com/filecoin-project/go-jsonrpc" + + "github.com/filecoin-project/venus/venus-shared/api" +) + +// NewIGatewayRPC creates a new httpparse jsonrpc remotecli. +func NewIGatewayRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (IGateway, jsonrpc.ClientCloser, error) { + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, "v0.IGateway") + + var res IGatewayStruct + closer, err := jsonrpc.NewMergeClient(ctx, addr, "Gateway", api.GetInternalStructs(&res), requestHeader, opts...) + + return &res, closer, err +} diff --git a/venus-shared/api/gateway/v0/market_event.go b/venus-shared/api/gateway/v0/market_event.go new file mode 100644 index 0000000000..a45a475d77 --- /dev/null +++ b/venus-shared/api/gateway/v0/market_event.go @@ -0,0 +1,21 @@ +package v0 + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/specs-storage/storage" + "github.com/filecoin-project/venus/venus-shared/types" + gtypes "github.com/filecoin-project/venus/venus-shared/types/gateway" + "github.com/ipfs/go-cid" +) + +type IMarketEvent interface { + ListMarketConnectionsState(ctx context.Context) ([]gtypes.MarketConnectionState, error) //perm:admin + IsUnsealed(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types.PaddedByteIndex, size abi.PaddedPieceSize) (bool, error) //perm:admin + SectorsUnsealPiece(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types.PaddedByteIndex, size abi.PaddedPieceSize, dest string) error //perm:admin + + ResponseMarketEvent(ctx context.Context, resp *gtypes.ResponseEvent) error //perm:read + ListenMarketEvent(ctx context.Context, policy *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) //perm:read +} diff --git a/venus-shared/api/gateway/v0/method.md b/venus-shared/api/gateway/v0/method.md new file mode 100644 index 0000000000..49fc9e65e2 --- /dev/null +++ b/venus-shared/api/gateway/v0/method.md @@ -0,0 +1,469 @@ +# Groups + +* [MarketEvent](#MarketEvent) + * [IsUnsealed](#IsUnsealed) + * [ListMarketConnectionsState](#ListMarketConnectionsState) + * [ListenMarketEvent](#ListenMarketEvent) + * [ResponseMarketEvent](#ResponseMarketEvent) + * [SectorsUnsealPiece](#SectorsUnsealPiece) +* [ProofEvent](#ProofEvent) + * [ComputeProof](#ComputeProof) + * [ListConnectedMiners](#ListConnectedMiners) + * [ListMinerConnection](#ListMinerConnection) + * [ListenProofEvent](#ListenProofEvent) + * [ResponseProofEvent](#ResponseProofEvent) +* [WalletEvent](#WalletEvent) + * [AddNewAddress](#AddNewAddress) + * [ListWalletInfo](#ListWalletInfo) + * [ListWalletInfoByWallet](#ListWalletInfoByWallet) + * [ListenWalletEvent](#ListenWalletEvent) + * [RemoveAddress](#RemoveAddress) + * [ResponseWalletEvent](#ResponseWalletEvent) + * [SupportNewAccount](#SupportNewAccount) + * [WalletHas](#WalletHas) + * [WalletSign](#WalletSign) + +## MarketEvent + +### IsUnsealed + + +Perms: admin + +Inputs: +```json +[ + "f01234", + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "ID": { + "Miner": 1000, + "Number": 9 + }, + "ProofType": 8 + }, + 10, + 1032 +] +``` + +Response: `true` + +### ListMarketConnectionsState + + +Perms: admin + +Inputs: `[]` + +Response: +```json +[ + { + "Addr": "f01234", + "Conn": { + "Connections": [ + { + "Addrs": [ + "f01234" + ], + "ChannelId": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Ip": "string value", + "RequestCount": 123, + "CreateTime": "0001-01-01T00:00:00Z" + } + ], + "ConnectionCount": 123 + } + } +] +``` + +### ListenMarketEvent + + +Perms: read + +Inputs: +```json +[ + { + "Miner": "f01234" + } +] +``` + +Response: +```json +{ + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Method": "string value", + "Payload": "Ynl0ZSBhcnJheQ==" +} +``` + +### ResponseMarketEvent + + +Perms: read + +Inputs: +```json +[ + { + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Payload": "Ynl0ZSBhcnJheQ==", + "Error": "string value" + } +] +``` + +Response: `{}` + +### SectorsUnsealPiece + + +Perms: admin + +Inputs: +```json +[ + "f01234", + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "ID": { + "Miner": 1000, + "Number": 9 + }, + "ProofType": 8 + }, + 10, + 1032, + "string value" +] +``` + +Response: `{}` + +## ProofEvent + +### ComputeProof + + +Perms: admin + +Inputs: +```json +[ + "f01234", + [ + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ], + "Bw==" +] +``` + +Response: +```json +[ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } +] +``` + +### ListConnectedMiners + + +Perms: admin + +Inputs: `[]` + +Response: +```json +[ + "f01234" +] +``` + +### ListMinerConnection + + +Perms: admin + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +{ + "Connections": [ + { + "Addrs": [ + "f01234" + ], + "ChannelId": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Ip": "string value", + "RequestCount": 123, + "CreateTime": "0001-01-01T00:00:00Z" + } + ], + "ConnectionCount": 123 +} +``` + +### ListenProofEvent + + +Perms: read + +Inputs: +```json +[ + { + "MinerAddress": "f01234" + } +] +``` + +Response: +```json +{ + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Method": "string value", + "Payload": "Ynl0ZSBhcnJheQ==" +} +``` + +### ResponseProofEvent + + +Perms: read + +Inputs: +```json +[ + { + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Payload": "Ynl0ZSBhcnJheQ==", + "Error": "string value" + } +] +``` + +Response: `{}` + +## WalletEvent + +### AddNewAddress + + +Perms: read + +Inputs: +```json +[ + "e26f1e5c-47f7-4561-a11d-18fab6e748af", + [ + "f01234" + ] +] +``` + +Response: `{}` + +### ListWalletInfo + + +Perms: admin + +Inputs: `[]` + +Response: +```json +[ + { + "Account": "string value", + "SupportAccounts": [ + "string value" + ], + "ConnectStates": [ + { + "Addrs": [ + "f01234" + ], + "ChannelId": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Ip": "string value", + "RequestCount": 123, + "CreateTime": "0001-01-01T00:00:00Z" + } + ] + } +] +``` + +### ListWalletInfoByWallet + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "Account": "string value", + "SupportAccounts": [ + "string value" + ], + "ConnectStates": [ + { + "Addrs": [ + "f01234" + ], + "ChannelId": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Ip": "string value", + "RequestCount": 123, + "CreateTime": "0001-01-01T00:00:00Z" + } + ] +} +``` + +### ListenWalletEvent + + +Perms: read + +Inputs: +```json +[ + { + "SupportAccounts": [ + "string value" + ], + "SignBytes": "Ynl0ZSBhcnJheQ==" + } +] +``` + +Response: +```json +{ + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Method": "string value", + "Payload": "Ynl0ZSBhcnJheQ==" +} +``` + +### RemoveAddress + + +Perms: read + +Inputs: +```json +[ + "e26f1e5c-47f7-4561-a11d-18fab6e748af", + [ + "f01234" + ] +] +``` + +Response: `{}` + +### ResponseWalletEvent + + +Perms: read + +Inputs: +```json +[ + { + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Payload": "Ynl0ZSBhcnJheQ==", + "Error": "string value" + } +] +``` + +Response: `{}` + +### SupportNewAccount + + +Perms: read + +Inputs: +```json +[ + "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "string value" +] +``` + +Response: `{}` + +### WalletHas + + +Perms: admin + +Inputs: +```json +[ + "string value", + "f01234" +] +``` + +Response: `true` + +### WalletSign + + +Perms: admin + +Inputs: +```json +[ + "string value", + "f01234", + "Ynl0ZSBhcnJheQ==", + { + "Type": "message", + "Extra": "Ynl0ZSBhcnJheQ==" + } +] +``` + +Response: +```json +{ + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" +} +``` + diff --git a/venus-shared/api/gateway/v0/proof_event.go b/venus-shared/api/gateway/v0/proof_event.go new file mode 100644 index 0000000000..6b116cb1cf --- /dev/null +++ b/venus-shared/api/gateway/v0/proof_event.go @@ -0,0 +1,19 @@ +package v0 + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + gtypes "github.com/filecoin-project/venus/venus-shared/types/gateway" +) + +type IProofEvent interface { + ListConnectedMiners(ctx context.Context) ([]address.Address, error) //perm:admin + ListMinerConnection(ctx context.Context, addr address.Address) (*gtypes.MinerState, error) //perm:admin + ComputeProof(ctx context.Context, miner address.Address, sectorInfos []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) //perm:admin + + ResponseProofEvent(ctx context.Context, resp *gtypes.ResponseEvent) error //perm:read + ListenProofEvent(ctx context.Context, policy *gtypes.ProofRegisterPolicy) (<-chan *gtypes.RequestEvent, error) //perm:read +} diff --git a/venus-shared/api/gateway/v0/proxy_gen.go b/venus-shared/api/gateway/v0/proxy_gen.go new file mode 100644 index 0000000000..ffcc1bc4b5 --- /dev/null +++ b/venus-shared/api/gateway/v0/proxy_gen.go @@ -0,0 +1,116 @@ +// Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. +package v0 + +import ( + "context" + + address "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/specs-storage/storage" + cid "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + "github.com/filecoin-project/venus/venus-shared/types" + gtypes "github.com/filecoin-project/venus/venus-shared/types/gateway" +) + +type IProofEventStruct struct { + Internal struct { + ComputeProof func(ctx context.Context, miner address.Address, sectorInfos []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) `perm:"admin"` + ListConnectedMiners func(ctx context.Context) ([]address.Address, error) `perm:"admin"` + ListMinerConnection func(ctx context.Context, addr address.Address) (*gtypes.MinerState, error) `perm:"admin"` + ListenProofEvent func(ctx context.Context, policy *gtypes.ProofRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` + ResponseProofEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` + } +} + +func (s *IProofEventStruct) ComputeProof(p0 context.Context, p1 address.Address, p2 []builtin.SectorInfo, p3 abi.PoStRandomness) ([]builtin.PoStProof, error) { + return s.Internal.ComputeProof(p0, p1, p2, p3) +} +func (s *IProofEventStruct) ListConnectedMiners(p0 context.Context) ([]address.Address, error) { + return s.Internal.ListConnectedMiners(p0) +} +func (s *IProofEventStruct) ListMinerConnection(p0 context.Context, p1 address.Address) (*gtypes.MinerState, error) { + return s.Internal.ListMinerConnection(p0, p1) +} +func (s *IProofEventStruct) ListenProofEvent(p0 context.Context, p1 *gtypes.ProofRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { + return s.Internal.ListenProofEvent(p0, p1) +} +func (s *IProofEventStruct) ResponseProofEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { + return s.Internal.ResponseProofEvent(p0, p1) +} + +type IWalletEventStruct struct { + Internal struct { + AddNewAddress func(ctx context.Context, channelID types.UUID, newAddrs []address.Address) error `perm:"read"` + ListWalletInfo func(ctx context.Context) ([]*gtypes.WalletDetail, error) `perm:"admin"` + ListWalletInfoByWallet func(ctx context.Context, wallet string) (*gtypes.WalletDetail, error) `perm:"admin"` + ListenWalletEvent func(ctx context.Context, policy *gtypes.WalletRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` + RemoveAddress func(ctx context.Context, channelID types.UUID, newAddrs []address.Address) error `perm:"read"` + ResponseWalletEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` + SupportNewAccount func(ctx context.Context, channelID types.UUID, account string) error `perm:"read"` + WalletHas func(ctx context.Context, supportAccount string, addr address.Address) (bool, error) `perm:"admin"` + WalletSign func(ctx context.Context, account string, addr address.Address, toSign []byte, meta types.MsgMeta) (*crypto.Signature, error) `perm:"admin"` + } +} + +func (s *IWalletEventStruct) AddNewAddress(p0 context.Context, p1 types.UUID, p2 []address.Address) error { + return s.Internal.AddNewAddress(p0, p1, p2) +} +func (s *IWalletEventStruct) ListWalletInfo(p0 context.Context) ([]*gtypes.WalletDetail, error) { + return s.Internal.ListWalletInfo(p0) +} +func (s *IWalletEventStruct) ListWalletInfoByWallet(p0 context.Context, p1 string) (*gtypes.WalletDetail, error) { + return s.Internal.ListWalletInfoByWallet(p0, p1) +} +func (s *IWalletEventStruct) ListenWalletEvent(p0 context.Context, p1 *gtypes.WalletRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { + return s.Internal.ListenWalletEvent(p0, p1) +} +func (s *IWalletEventStruct) RemoveAddress(p0 context.Context, p1 types.UUID, p2 []address.Address) error { + return s.Internal.RemoveAddress(p0, p1, p2) +} +func (s *IWalletEventStruct) ResponseWalletEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { + return s.Internal.ResponseWalletEvent(p0, p1) +} +func (s *IWalletEventStruct) SupportNewAccount(p0 context.Context, p1 types.UUID, p2 string) error { + return s.Internal.SupportNewAccount(p0, p1, p2) +} +func (s *IWalletEventStruct) WalletHas(p0 context.Context, p1 string, p2 address.Address) (bool, error) { + return s.Internal.WalletHas(p0, p1, p2) +} +func (s *IWalletEventStruct) WalletSign(p0 context.Context, p1 string, p2 address.Address, p3 []byte, p4 types.MsgMeta) (*crypto.Signature, error) { + return s.Internal.WalletSign(p0, p1, p2, p3, p4) +} + +type IMarketEventStruct struct { + Internal struct { + IsUnsealed func(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types.PaddedByteIndex, size abi.PaddedPieceSize) (bool, error) `perm:"admin"` + ListMarketConnectionsState func(ctx context.Context) ([]gtypes.MarketConnectionState, error) `perm:"admin"` + ListenMarketEvent func(ctx context.Context, policy *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` + ResponseMarketEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` + SectorsUnsealPiece func(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types.PaddedByteIndex, size abi.PaddedPieceSize, dest string) error `perm:"admin"` + } +} + +func (s *IMarketEventStruct) IsUnsealed(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 storage.SectorRef, p4 types.PaddedByteIndex, p5 abi.PaddedPieceSize) (bool, error) { + return s.Internal.IsUnsealed(p0, p1, p2, p3, p4, p5) +} +func (s *IMarketEventStruct) ListMarketConnectionsState(p0 context.Context) ([]gtypes.MarketConnectionState, error) { + return s.Internal.ListMarketConnectionsState(p0) +} +func (s *IMarketEventStruct) ListenMarketEvent(p0 context.Context, p1 *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { + return s.Internal.ListenMarketEvent(p0, p1) +} +func (s *IMarketEventStruct) ResponseMarketEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { + return s.Internal.ResponseMarketEvent(p0, p1) +} +func (s *IMarketEventStruct) SectorsUnsealPiece(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 storage.SectorRef, p4 types.PaddedByteIndex, p5 abi.PaddedPieceSize, p6 string) error { + return s.Internal.SectorsUnsealPiece(p0, p1, p2, p3, p4, p5, p6) +} + +type IGatewayStruct struct { + IProofEventStruct + IWalletEventStruct + IMarketEventStruct +} diff --git a/venus-shared/api/gateway/v0/wallet_event.go b/venus-shared/api/gateway/v0/wallet_event.go new file mode 100644 index 0000000000..bced2e2a9e --- /dev/null +++ b/venus-shared/api/gateway/v0/wallet_event.go @@ -0,0 +1,24 @@ +package v0 + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/crypto" + + "github.com/filecoin-project/venus/venus-shared/types" + gtypes "github.com/filecoin-project/venus/venus-shared/types/gateway" +) + +type IWalletEvent interface { + ListWalletInfo(ctx context.Context) ([]*gtypes.WalletDetail, error) //perm:admin + ListWalletInfoByWallet(ctx context.Context, wallet string) (*gtypes.WalletDetail, error) //perm:admin + WalletHas(ctx context.Context, supportAccount string, addr address.Address) (bool, error) //perm:admin + WalletSign(ctx context.Context, account string, addr address.Address, toSign []byte, meta types.MsgMeta) (*crypto.Signature, error) //perm:admin + + ResponseWalletEvent(ctx context.Context, resp *gtypes.ResponseEvent) error //perm:read + ListenWalletEvent(ctx context.Context, policy *gtypes.WalletRegisterPolicy) (<-chan *gtypes.RequestEvent, error) //perm:read + SupportNewAccount(ctx context.Context, channelID types.UUID, account string) error //perm:read + AddNewAddress(ctx context.Context, channelID types.UUID, newAddrs []address.Address) error //perm:read + RemoveAddress(ctx context.Context, channelID types.UUID, newAddrs []address.Address) error //perm:read +} From 500180b71009016a5063273f40bd8bb4d46ad3bb Mon Sep 17 00:00:00 2001 From: Caesar Wang Date: Fri, 18 Feb 2022 10:14:50 +0800 Subject: [PATCH 154/167] feat: venus-shared: api version / namespaces & helper func for rpc endpoint (#4782) * feat: helper for formating endpoint with given addr & ver * feat: add Version for api-gen * feat: re-generate api clients with ver & nss * refactor: rename v0 to gateway so that we could have a better api namespace --- venus-devtool/api-gen/client.go | 25 ++++-- venus-devtool/api-gen/common.go | 8 ++ venus-devtool/util/api_meta.go | 7 ++ venus-shared/api/chain/v0/client_gen.go | 14 ++- venus-shared/api/chain/v1/client_gen.go | 14 ++- venus-shared/api/endpoint.go | 28 ++++++ venus-shared/api/endpoint_test.go | 95 ++++++++++++++++++++ venus-shared/api/gateway/v0/api.go | 2 +- venus-shared/api/gateway/v0/client_gen.go | 16 +++- venus-shared/api/gateway/v0/market_event.go | 2 +- venus-shared/api/gateway/v0/proof_event.go | 2 +- venus-shared/api/gateway/v0/proxy_gen.go | 2 +- venus-shared/api/gateway/v0/wallet_event.go | 2 +- venus-shared/api/gateway/v1/client_gen.go | 14 ++- venus-shared/api/market/client/client_gen.go | 14 ++- venus-shared/api/market/client_gen.go | 14 ++- venus-shared/api/messager/client_gen.go | 14 ++- venus-shared/api/wallet/client_gen.go | 14 ++- 18 files changed, 258 insertions(+), 29 deletions(-) create mode 100644 venus-shared/api/endpoint.go create mode 100644 venus-shared/api/endpoint_test.go diff --git a/venus-devtool/api-gen/client.go b/venus-devtool/api-gen/client.go index 88a2207dde..a141d66528 100644 --- a/venus-devtool/api-gen/client.go +++ b/venus-devtool/api-gen/client.go @@ -30,6 +30,7 @@ package {{ .PkgName }} import ( "context" + "fmt" "net/http" "github.com/filecoin-project/go-jsonrpc" @@ -37,15 +38,24 @@ import ( "github.com/filecoin-project/venus/venus-shared/api" ) +const MajorVersion = {{ .MajorVersion }} +const APINamespace = "{{ .APINs }}" +const MethodNamespace = "{{ .MethNs }}" + // New{{ .APIName }}RPC creates a new httpparse jsonrpc remotecli. func New{{ .APIName }}RPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) ({{ .APIName }}, jsonrpc.ClientCloser, error) { + endpoint, err := api.Endpoint(addr, MajorVersion) + if err != nil { + return nil, nil, fmt.Errorf("invalid addr %s: %w", addr, err) + } + if requestHeader == nil { requestHeader = http.Header{} } - requestHeader.Set(api.VenusAPINamespaceHeader, "{{ .APINs }}") + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) var res {{ .APIStruct }} - closer, err := jsonrpc.NewMergeClient(ctx, addr, "{{ .MethNs }}", api.GetInternalStructs(&res), requestHeader, opts...) + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) return &res, closer, err } @@ -88,11 +98,12 @@ func genClientForAPI(t util.APIMeta) error { var buf bytes.Buffer err = tmpl.Execute(&buf, map[string]interface{}{ - "PkgName": apiIface.Pkg.Name, - "APIName": apiName, - "APIStruct": structName(apiName), - "APINs": ns, - "MethNs": methNs, + "PkgName": apiIface.Pkg.Name, + "APIName": apiName, + "APIStruct": structName(apiName), + "APINs": ns, + "MethNs": methNs, + "MajorVersion": t.RPCMeta.Version, }) if err != nil { return fmt.Errorf("exec template: %w", err) diff --git a/venus-devtool/api-gen/common.go b/venus-devtool/api-gen/common.go index bdd9d092b3..9e72e1003c 100644 --- a/venus-devtool/api-gen/common.go +++ b/venus-devtool/api-gen/common.go @@ -30,6 +30,7 @@ func init() { IncludeAll: true, }, RPCMeta: util.RPCMeta{ + Version: 0, MethodNamespace: "Message", }, }, @@ -39,6 +40,9 @@ func init() { ImportPath: "github.com/filecoin-project/venus/venus-shared/api/wallet", IncludeAll: true, }, + RPCMeta: util.RPCMeta{ + Version: 0, + }, }, util.APIMeta{ Type: reflect.TypeOf((*gatewayv1.IGateway)(nil)).Elem(), @@ -47,6 +51,7 @@ func init() { IncludeAll: true, }, RPCMeta: util.RPCMeta{ + Version: 1, MethodNamespace: "Gateway", }, }, @@ -57,6 +62,7 @@ func init() { IncludeAll: true, }, RPCMeta: util.RPCMeta{ + Version: 0, MethodNamespace: "Gateway", }, }, @@ -67,6 +73,7 @@ func init() { IncludeAll: true, }, RPCMeta: util.RPCMeta{ + Version: 0, MethodNamespace: "VENUS_MARKET", }, }, @@ -77,6 +84,7 @@ func init() { IncludeAll: true, }, RPCMeta: util.RPCMeta{ + Version: 0, MethodNamespace: "VENUS_MARKET_CLIENT", }, }, diff --git a/venus-devtool/util/api_meta.go b/venus-devtool/util/api_meta.go index ea29649708..bcee1e55d4 100644 --- a/venus-devtool/util/api_meta.go +++ b/venus-devtool/util/api_meta.go @@ -31,6 +31,9 @@ var ChainAPIPairs = []struct { ImportPath: "github.com/filecoin-project/venus/venus-shared/api/chain/v0", IncludeAll: true, }, + RPCMeta: RPCMeta{ + Version: 0, + }, }, }, { @@ -48,6 +51,9 @@ var ChainAPIPairs = []struct { ImportPath: "github.com/filecoin-project/venus/venus-shared/api/chain/v1", IncludeAll: true, }, + RPCMeta: RPCMeta{ + Version: 1, + }, }, }, } @@ -55,6 +61,7 @@ var ChainAPIPairs = []struct { var LatestChainAPIPair = ChainAPIPairs[len(ChainAPIPairs)-1] type RPCMeta struct { + Version uint32 Namespace string MethodNamespace string } diff --git a/venus-shared/api/chain/v0/client_gen.go b/venus-shared/api/chain/v0/client_gen.go index a7215fcb4c..33e8a5f59d 100644 --- a/venus-shared/api/chain/v0/client_gen.go +++ b/venus-shared/api/chain/v0/client_gen.go @@ -3,6 +3,7 @@ package v0 import ( "context" + "fmt" "net/http" "github.com/filecoin-project/go-jsonrpc" @@ -10,15 +11,24 @@ import ( "github.com/filecoin-project/venus/venus-shared/api" ) +const MajorVersion = 0 +const APINamespace = "v0.FullNode" +const MethodNamespace = "Filecoin" + // NewFullNodeRPC creates a new httpparse jsonrpc remotecli. func NewFullNodeRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (FullNode, jsonrpc.ClientCloser, error) { + endpoint, err := api.Endpoint(addr, MajorVersion) + if err != nil { + return nil, nil, fmt.Errorf("invalid addr %s: %w", addr, err) + } + if requestHeader == nil { requestHeader = http.Header{} } - requestHeader.Set(api.VenusAPINamespaceHeader, "v0.FullNode") + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) var res FullNodeStruct - closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&res), requestHeader, opts...) + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) return &res, closer, err } diff --git a/venus-shared/api/chain/v1/client_gen.go b/venus-shared/api/chain/v1/client_gen.go index 285364777e..11ef9fa0a7 100644 --- a/venus-shared/api/chain/v1/client_gen.go +++ b/venus-shared/api/chain/v1/client_gen.go @@ -3,6 +3,7 @@ package v1 import ( "context" + "fmt" "net/http" "github.com/filecoin-project/go-jsonrpc" @@ -10,15 +11,24 @@ import ( "github.com/filecoin-project/venus/venus-shared/api" ) +const MajorVersion = 1 +const APINamespace = "v1.FullNode" +const MethodNamespace = "Filecoin" + // NewFullNodeRPC creates a new httpparse jsonrpc remotecli. func NewFullNodeRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (FullNode, jsonrpc.ClientCloser, error) { + endpoint, err := api.Endpoint(addr, MajorVersion) + if err != nil { + return nil, nil, fmt.Errorf("invalid addr %s: %w", addr, err) + } + if requestHeader == nil { requestHeader = http.Header{} } - requestHeader.Set(api.VenusAPINamespaceHeader, "v1.FullNode") + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) var res FullNodeStruct - closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&res), requestHeader, opts...) + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) return &res, closer, err } diff --git a/venus-shared/api/endpoint.go b/venus-shared/api/endpoint.go new file mode 100644 index 0000000000..58f705b0ab --- /dev/null +++ b/venus-shared/api/endpoint.go @@ -0,0 +1,28 @@ +package api + +import ( + "fmt" + "net/url" +) + +func Endpoint(raw string, ver uint32) (string, error) { + u, err := url.Parse(raw) + if err != nil { + return "", fmt.Errorf("invalid url: %w", err) + } + + if u.Scheme == "" { + return "", fmt.Errorf("scheme is required") + } + + if u.Host == "" { + return "", fmt.Errorf("host is required") + } + + // raw url contains more than just scheme://host(:prot) + if u.Path != "" && u.Path != "/" { + return raw, nil + } + + return fmt.Sprintf("%s://%s/rpc/v%d", u.Scheme, u.Host, ver), nil +} diff --git a/venus-shared/api/endpoint_test.go b/venus-shared/api/endpoint_test.go new file mode 100644 index 0000000000..6ca1ffbdb8 --- /dev/null +++ b/venus-shared/api/endpoint_test.go @@ -0,0 +1,95 @@ +package api + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestParseHost(t *testing.T) { + + cases := []struct { + raw string + ver uint32 + expected string + }{ + // valid + { + raw: "http://api.venus.io:1234", + ver: 1, + expected: "http://api.venus.io:1234/rpc/v1", + }, + { + raw: "http://api.venus.io:1234/", + ver: 1, + expected: "http://api.venus.io:1234/rpc/v1", + }, + { + raw: "http://api.venus.io:1234/rpc", + ver: 1, + expected: "http://api.venus.io:1234/rpc", + }, + + { + raw: "http://api.venus.io:1234/rpc/v0", + ver: 1, + expected: "http://api.venus.io:1234/rpc/v0", + }, + + // invalid: no scheme + { + raw: "://api.venus.io:1234", + ver: 1, + expected: "", + }, + { + raw: "://api.venus.io:1234/", + ver: 1, + expected: "", + }, + { + raw: "://api.venus.io:1234/rpc", + ver: 1, + expected: "", + }, + { + raw: "://api.venus.io:1234/rpc/v0", + ver: 1, + expected: "", + }, + + // invalid: no scheme 2 + { + raw: "api.venus.io:1234", + ver: 1, + expected: "", + }, + { + raw: "api.venus.io:1234/", + ver: 1, + expected: "", + }, + { + raw: "api.venus.io:1234/rpc", + ver: 1, + expected: "", + }, + { + raw: "api.venus.io:1234/rpc/v0", + ver: 1, + expected: "", + }, + } + + for i := range cases { + c := cases[i] + got, err := Endpoint(c.raw, c.ver) + if c.expected == "" { + require.Errorf(t, err, "%s is expected to be invalid, got %s", c.raw, got) + continue + } + + require.NoErrorf(t, err, "%s is expected to be valid", c.raw) + require.Equal(t, c.expected, got, "converted endpoint") + } +} diff --git a/venus-shared/api/gateway/v0/api.go b/venus-shared/api/gateway/v0/api.go index a7d52eafd1..537ed77210 100644 --- a/venus-shared/api/gateway/v0/api.go +++ b/venus-shared/api/gateway/v0/api.go @@ -1,4 +1,4 @@ -package v0 +package gateway type IGateway interface { IProofEvent diff --git a/venus-shared/api/gateway/v0/client_gen.go b/venus-shared/api/gateway/v0/client_gen.go index dfcc22dfa1..f12c406f31 100644 --- a/venus-shared/api/gateway/v0/client_gen.go +++ b/venus-shared/api/gateway/v0/client_gen.go @@ -1,8 +1,9 @@ // Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. -package v0 +package gateway import ( "context" + "fmt" "net/http" "github.com/filecoin-project/go-jsonrpc" @@ -10,15 +11,24 @@ import ( "github.com/filecoin-project/venus/venus-shared/api" ) +const MajorVersion = 0 +const APINamespace = "gateway.IGateway" +const MethodNamespace = "Gateway" + // NewIGatewayRPC creates a new httpparse jsonrpc remotecli. func NewIGatewayRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (IGateway, jsonrpc.ClientCloser, error) { + endpoint, err := api.Endpoint(addr, MajorVersion) + if err != nil { + return nil, nil, fmt.Errorf("invalid addr %s: %w", addr, err) + } + if requestHeader == nil { requestHeader = http.Header{} } - requestHeader.Set(api.VenusAPINamespaceHeader, "v0.IGateway") + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) var res IGatewayStruct - closer, err := jsonrpc.NewMergeClient(ctx, addr, "Gateway", api.GetInternalStructs(&res), requestHeader, opts...) + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) return &res, closer, err } diff --git a/venus-shared/api/gateway/v0/market_event.go b/venus-shared/api/gateway/v0/market_event.go index a45a475d77..42db2d2872 100644 --- a/venus-shared/api/gateway/v0/market_event.go +++ b/venus-shared/api/gateway/v0/market_event.go @@ -1,4 +1,4 @@ -package v0 +package gateway import ( "context" diff --git a/venus-shared/api/gateway/v0/proof_event.go b/venus-shared/api/gateway/v0/proof_event.go index 6b116cb1cf..1af746846a 100644 --- a/venus-shared/api/gateway/v0/proof_event.go +++ b/venus-shared/api/gateway/v0/proof_event.go @@ -1,4 +1,4 @@ -package v0 +package gateway import ( "context" diff --git a/venus-shared/api/gateway/v0/proxy_gen.go b/venus-shared/api/gateway/v0/proxy_gen.go index ffcc1bc4b5..39020b4b04 100644 --- a/venus-shared/api/gateway/v0/proxy_gen.go +++ b/venus-shared/api/gateway/v0/proxy_gen.go @@ -1,5 +1,5 @@ // Code generated by github.com/filecoin-project/venus/venus-devtool/api-gen. DO NOT EDIT. -package v0 +package gateway import ( "context" diff --git a/venus-shared/api/gateway/v0/wallet_event.go b/venus-shared/api/gateway/v0/wallet_event.go index bced2e2a9e..90279d5319 100644 --- a/venus-shared/api/gateway/v0/wallet_event.go +++ b/venus-shared/api/gateway/v0/wallet_event.go @@ -1,4 +1,4 @@ -package v0 +package gateway import ( "context" diff --git a/venus-shared/api/gateway/v1/client_gen.go b/venus-shared/api/gateway/v1/client_gen.go index 52f1c0e791..2d665133bb 100644 --- a/venus-shared/api/gateway/v1/client_gen.go +++ b/venus-shared/api/gateway/v1/client_gen.go @@ -3,6 +3,7 @@ package gateway import ( "context" + "fmt" "net/http" "github.com/filecoin-project/go-jsonrpc" @@ -10,15 +11,24 @@ import ( "github.com/filecoin-project/venus/venus-shared/api" ) +const MajorVersion = 1 +const APINamespace = "gateway.IGateway" +const MethodNamespace = "Gateway" + // NewIGatewayRPC creates a new httpparse jsonrpc remotecli. func NewIGatewayRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (IGateway, jsonrpc.ClientCloser, error) { + endpoint, err := api.Endpoint(addr, MajorVersion) + if err != nil { + return nil, nil, fmt.Errorf("invalid addr %s: %w", addr, err) + } + if requestHeader == nil { requestHeader = http.Header{} } - requestHeader.Set(api.VenusAPINamespaceHeader, "gateway.IGateway") + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) var res IGatewayStruct - closer, err := jsonrpc.NewMergeClient(ctx, addr, "Gateway", api.GetInternalStructs(&res), requestHeader, opts...) + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) return &res, closer, err } diff --git a/venus-shared/api/market/client/client_gen.go b/venus-shared/api/market/client/client_gen.go index 828b63fd4e..abf56fc3ea 100644 --- a/venus-shared/api/market/client/client_gen.go +++ b/venus-shared/api/market/client/client_gen.go @@ -3,6 +3,7 @@ package client import ( "context" + "fmt" "net/http" "github.com/filecoin-project/go-jsonrpc" @@ -10,15 +11,24 @@ import ( "github.com/filecoin-project/venus/venus-shared/api" ) +const MajorVersion = 0 +const APINamespace = "client.IMarketClient" +const MethodNamespace = "VENUS_MARKET_CLIENT" + // NewIMarketClientRPC creates a new httpparse jsonrpc remotecli. func NewIMarketClientRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (IMarketClient, jsonrpc.ClientCloser, error) { + endpoint, err := api.Endpoint(addr, MajorVersion) + if err != nil { + return nil, nil, fmt.Errorf("invalid addr %s: %w", addr, err) + } + if requestHeader == nil { requestHeader = http.Header{} } - requestHeader.Set(api.VenusAPINamespaceHeader, "client.IMarketClient") + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) var res IMarketClientStruct - closer, err := jsonrpc.NewMergeClient(ctx, addr, "VENUS_MARKET_CLIENT", api.GetInternalStructs(&res), requestHeader, opts...) + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) return &res, closer, err } diff --git a/venus-shared/api/market/client_gen.go b/venus-shared/api/market/client_gen.go index 0f920fa979..ae5cd1d49a 100644 --- a/venus-shared/api/market/client_gen.go +++ b/venus-shared/api/market/client_gen.go @@ -3,6 +3,7 @@ package market import ( "context" + "fmt" "net/http" "github.com/filecoin-project/go-jsonrpc" @@ -10,15 +11,24 @@ import ( "github.com/filecoin-project/venus/venus-shared/api" ) +const MajorVersion = 0 +const APINamespace = "market.IMarket" +const MethodNamespace = "VENUS_MARKET" + // NewIMarketRPC creates a new httpparse jsonrpc remotecli. func NewIMarketRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (IMarket, jsonrpc.ClientCloser, error) { + endpoint, err := api.Endpoint(addr, MajorVersion) + if err != nil { + return nil, nil, fmt.Errorf("invalid addr %s: %w", addr, err) + } + if requestHeader == nil { requestHeader = http.Header{} } - requestHeader.Set(api.VenusAPINamespaceHeader, "market.IMarket") + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) var res IMarketStruct - closer, err := jsonrpc.NewMergeClient(ctx, addr, "VENUS_MARKET", api.GetInternalStructs(&res), requestHeader, opts...) + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) return &res, closer, err } diff --git a/venus-shared/api/messager/client_gen.go b/venus-shared/api/messager/client_gen.go index d98757bb18..75aeee9f78 100644 --- a/venus-shared/api/messager/client_gen.go +++ b/venus-shared/api/messager/client_gen.go @@ -3,6 +3,7 @@ package messager import ( "context" + "fmt" "net/http" "github.com/filecoin-project/go-jsonrpc" @@ -10,15 +11,24 @@ import ( "github.com/filecoin-project/venus/venus-shared/api" ) +const MajorVersion = 0 +const APINamespace = "messager.IMessager" +const MethodNamespace = "Message" + // NewIMessagerRPC creates a new httpparse jsonrpc remotecli. func NewIMessagerRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (IMessager, jsonrpc.ClientCloser, error) { + endpoint, err := api.Endpoint(addr, MajorVersion) + if err != nil { + return nil, nil, fmt.Errorf("invalid addr %s: %w", addr, err) + } + if requestHeader == nil { requestHeader = http.Header{} } - requestHeader.Set(api.VenusAPINamespaceHeader, "messager.IMessager") + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) var res IMessagerStruct - closer, err := jsonrpc.NewMergeClient(ctx, addr, "Message", api.GetInternalStructs(&res), requestHeader, opts...) + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) return &res, closer, err } diff --git a/venus-shared/api/wallet/client_gen.go b/venus-shared/api/wallet/client_gen.go index 95e0cff4c4..29f1c49810 100644 --- a/venus-shared/api/wallet/client_gen.go +++ b/venus-shared/api/wallet/client_gen.go @@ -3,6 +3,7 @@ package wallet import ( "context" + "fmt" "net/http" "github.com/filecoin-project/go-jsonrpc" @@ -10,15 +11,24 @@ import ( "github.com/filecoin-project/venus/venus-shared/api" ) +const MajorVersion = 0 +const APINamespace = "wallet.IFullAPI" +const MethodNamespace = "Filecoin" + // NewIFullAPIRPC creates a new httpparse jsonrpc remotecli. func NewIFullAPIRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (IFullAPI, jsonrpc.ClientCloser, error) { + endpoint, err := api.Endpoint(addr, MajorVersion) + if err != nil { + return nil, nil, fmt.Errorf("invalid addr %s: %w", addr, err) + } + if requestHeader == nil { requestHeader = http.Header{} } - requestHeader.Set(api.VenusAPINamespaceHeader, "wallet.IFullAPI") + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) var res IFullAPIStruct - closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", api.GetInternalStructs(&res), requestHeader, opts...) + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) return &res, closer, err } From a3ca359cb8c338cead08b72a22a46ae5b6eb4cba Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Fri, 18 Feb 2022 10:54:15 +0800 Subject: [PATCH 155/167] feat: config: migrate maxfee (#4783) * migrate maxfee --- pkg/migration/migrate.go | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/pkg/migration/migrate.go b/pkg/migration/migrate.go index ee25a4a8b5..e9ce96b898 100644 --- a/pkg/migration/migrate.go +++ b/pkg/migration/migrate.go @@ -1,14 +1,19 @@ package migration import ( + "encoding/json" + "fmt" + "io/ioutil" + "math" + "path/filepath" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/fixtures/networks" "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/pkg/repo" + "github.com/filecoin-project/venus/venus-shared/types" logging "github.com/ipfs/go-log/v2" - - "math" ) var migrateLog = logging.Logger("data_migrate") @@ -220,6 +225,27 @@ func Version7Upgrade(repoPath string) (err error) { return fsrRepo.Close() } + // In order to migrate maxfee + type MpoolCfg struct { + MaxFee float64 `json:"maxFee"` + } + type tempCfg struct { + Mpool *MpoolCfg `json:"mpool"` + } + data, err := ioutil.ReadFile(filepath.Join(repoPath, "config.json")) + if err != nil { + migrateLog.Errorf("open config file failed: %v", err) + } else { + // If maxFee value is String(10 FIL), unmarshal failure is expected + // If maxFee value is Number(10000000000000000000), need convert to FIL(10 FIL) + tmpCfg := tempCfg{} + if err := json.Unmarshal(data, &tmpCfg); err == nil { + maxFee := types.MustParseFIL(fmt.Sprintf("%fattofil", tmpCfg.Mpool.MaxFee)) + cfg.Mpool.MaxFee = maxFee + migrateLog.Info("convert mpool.maxFee from %v to %s", tmpCfg.Mpool.MaxFee, maxFee.String()) + } + } + if err = fsrRepo.ReplaceConfig(cfg); err != nil { return } From 4f3a93904bcc41a16de458edbbf52dbf042e2e91 Mon Sep 17 00:00:00 2001 From: Mike <41407352+hunjixin@users.noreply.github.com> Date: Fri, 18 Feb 2022 13:58:26 +0800 Subject: [PATCH 156/167] Feat/remove replace for ipfscmds (#4773) * remove replace for ipfs cmds library * reinit peer key if not found --- app/node/config.go | 27 +++++++++++++++++-- app/node/init.go | 40 +++++++--------------------- app/node/node.go | 2 +- app/node/test/node.go | 7 ----- cmd/commands_test.go | 2 -- cmd/daemon.go | 52 +----------------------------------- cmd/main.go | 61 +++---------------------------------------- go.mod | 6 ++--- go.sum | 13 +++++---- venus-devtool/go.mod | 1 - venus-devtool/go.sum | 7 ++--- 11 files changed, 51 insertions(+), 167 deletions(-) diff --git a/app/node/config.go b/app/node/config.go index da93a37c98..2c1108dd03 100644 --- a/app/node/config.go +++ b/app/node/config.go @@ -11,7 +11,7 @@ import ( // OptionsFromRepo takes a repo and returns options that configure a node // to use the given repo. func OptionsFromRepo(r repo.Repo) ([]BuilderOpt, error) { - sk, err := privKeyFromKeystore(r) + sk, err := loadPrivKeyFromKeystore(r) if err != nil { return nil, err } @@ -33,9 +33,12 @@ func OptionsFromRepo(r repo.Repo) ([]BuilderOpt, error) { return append(cfgopts, dsopt), nil } -func privKeyFromKeystore(r repo.Repo) (ci.PrivKey, error) { +func loadPrivKeyFromKeystore(r repo.Repo) (ci.PrivKey, error) { data, err := r.Keystore().Get("self") if err != nil { + if err.Error() == "no key by the given name was found" { + return createPeerKey(r.Keystore()) + } return nil, errors.Wrap(err, "failed to get key from keystore") } sk, err := ci.UnmarshalPrivateKey(data) @@ -44,3 +47,23 @@ func privKeyFromKeystore(r repo.Repo) (ci.PrivKey, error) { } return sk, nil } + +/*func initPeerKey(store fskeystore.Keystore, pk acrypto.PrivKey) error { + var err error + if pk == nil { + pk, _, err = acrypto.GenerateKeyPair(acrypto.RSA, defaultPeerKeyBits) + if err != nil { + return errors.Wrap(err, "failed to create peer key") + } + } + + kbytes, err := acrypto.MarshalPrivateKey(pk) + if err != nil { + return err + } + + if err := store.Put("self", kbytes); err != nil { + return errors.Wrap(err, "failed to store private key") + } + return nil +}*/ diff --git a/app/node/init.go b/app/node/init.go index e3b40d970a..aaddc544ec 100644 --- a/app/node/init.go +++ b/app/node/init.go @@ -18,30 +18,12 @@ const defaultPeerKeyBits = 2048 // initCfg contains configuration for initializing a node's repo. type initCfg struct { - peerKey acrypto.PrivKey - defaultKey *crypto.KeyInfo initImports []*crypto.KeyInfo } // InitOpt is an option for initialization of a node's repo. type InitOpt func(*initCfg) -// PeerKeyOpt sets the private key for a node's 'self' libp2p identity. -// If unspecified, initialization will create a new one. -func PeerKeyOpt(k acrypto.PrivKey) InitOpt { - return func(opts *initCfg) { - opts.peerKey = k - } -} - -// DefaultKeyOpt sets the private key for the wallet's default account. -// If unspecified, initialization will create a new one. -func DefaultKeyOpt(ki *crypto.KeyInfo) InitOpt { - return func(opts *initCfg) { - opts.defaultKey = ki - } -} - // ImportKeyOpt imports the provided key during initialization. func ImportKeyOpt(ki *crypto.KeyInfo) InitOpt { return func(opts *initCfg) { @@ -66,33 +48,31 @@ func Init(ctx context.Context, r repo.Repo, gen genesis.InitFunc, opts ...InitOp return errors.Wrap(err, "Could not Init Node") } - if err := initPeerKey(r.Keystore(), cfg.peerKey); err != nil { - return err + _, err = createPeerKey(r.Keystore()) + if err != nil { + return errors.Wrap(err, "Could not Create P2p key") } if err = r.ReplaceConfig(r.Config()); err != nil { return errors.Wrap(err, "failed to write config") } - return nil } -func initPeerKey(store fskeystore.Keystore, pk acrypto.PrivKey) error { +func createPeerKey(store fskeystore.Keystore) (acrypto.PrivKey, error) { var err error - if pk == nil { - pk, _, err = acrypto.GenerateKeyPair(acrypto.RSA, defaultPeerKeyBits) - if err != nil { - return errors.Wrap(err, "failed to create peer key") - } + pk, _, err := acrypto.GenerateKeyPair(acrypto.RSA, defaultPeerKeyBits) + if err != nil { + return nil, errors.Wrap(err, "failed to create peer key") } kbytes, err := acrypto.MarshalPrivateKey(pk) if err != nil { - return err + return nil, err } if err := store.Put("self", kbytes); err != nil { - return errors.Wrap(err, "failed to store private key") + return nil, errors.Wrap(err, "failed to store private key") } - return nil + return pk, nil } diff --git a/app/node/node.go b/app/node/node.go index 97a8dc7153..a5f5a5c0d7 100644 --- a/app/node/node.go +++ b/app/node/node.go @@ -334,7 +334,7 @@ func (node *Node) runRestfulAPI(ctx context.Context, handler *http.ServeMux, roo cfg.SetAllowedOrigins(apiConfig.AccessControlAllowOrigin...) cfg.SetAllowedMethods(apiConfig.AccessControlAllowMethods...) cfg.SetAllowCredentials(apiConfig.AccessControlAllowCredentials) - cfg.AppendAllowHeaders("Authorization") + cfg.AddAllowedHeaders("Authorization") handler.Handle(APIPrefix+"/", cmdhttp.NewHandler(servenv, rootCmdDaemon, cfg)) return nil diff --git a/app/node/test/node.go b/app/node/test/node.go index 57150a206d..17f24de1a8 100644 --- a/app/node/test/node.go +++ b/app/node/test/node.go @@ -106,13 +106,6 @@ func (cs *ChainSeed) Addr(t *testing.T, key int) address.Address { return a } -// MinerInitOpt is a node init option that imports the key for the miner's owner -func (cs *ChainSeed) MinerInitOpt(which int) node.InitOpt { - kwhich := cs.info.Miners[which].Owner - kinfo := cs.info.Keys[kwhich] - return node.ImportKeyOpt(kinfo) -} - // KeyInitOpt is a node init option that imports one of the chain seed's // keys to a node's wallet func (cs *ChainSeed) KeyInitOpt(which int) node.InitOpt { diff --git a/cmd/commands_test.go b/cmd/commands_test.go index d6f7a54963..714d81e544 100644 --- a/cmd/commands_test.go +++ b/cmd/commands_test.go @@ -25,6 +25,4 @@ func buildWithMiner(t *testing.T, builder *test.NodeBuilder) { // bundle together common init options for node test state cs := test.FixtureChainSeed(t) builder.WithGenesisInit(cs.GenesisInitFunc) - //builder.WithConfig(cs.MinerConfigOpt(0)) - builder.WithInitOpt(cs.MinerInitOpt(0)) } diff --git a/cmd/daemon.go b/cmd/daemon.go index def0e9435e..d947162fea 100644 --- a/cmd/daemon.go +++ b/cmd/daemon.go @@ -1,10 +1,8 @@ package cmd import ( - "encoding/json" "fmt" "github.com/filecoin-project/venus/fixtures/networks" - "io/ioutil" "os" "github.com/filecoin-project/venus/pkg/constants" @@ -17,7 +15,6 @@ import ( cmds "github.com/ipfs/go-ipfs-cmds" logging "github.com/ipfs/go-log/v2" - "github.com/libp2p/go-libp2p-core/crypto" _ "net/http/pprof" // nolint: golint "github.com/filecoin-project/venus/app/node" @@ -52,8 +49,6 @@ var daemonCmd = &cmds.Command{ cmds.BoolOption(IsRelay, "advertise and allow venus network traffic to be relayed through this node"), cmds.StringOption(ImportSnapshot, "import chain state from a given chain export file or url"), cmds.StringOption(GenesisFile, "path of file or HTTP(S) URL containing archive of genesis block DAG data"), - cmds.StringOption(PeerKeyFile, "path of file containing key to use for new node's libp2p identity"), - cmds.StringOption(WalletKeyFile, "path of file containing keys to import into the wallet on initialization"), cmds.StringOption(Network, "when set, populates config with network specific parameters, eg. mainnet,2k,cali,interop,butterfly").WithDefault("mainnet"), cmds.StringOption(Password, "set wallet password"), }, @@ -156,20 +151,12 @@ func initRun(req *cmds.Request) error { cfg.API.VenusAuthURL = authServiceURL } - peerKeyFile, _ := req.Options[PeerKeyFile].(string) - walletKeyFile, _ := req.Options[WalletKeyFile].(string) - - initOpts, err := getNodeInitOpts(peerKeyFile, walletKeyFile) - if err != nil { - return err - } - if err := rep.ReplaceConfig(cfg); err != nil { log.Errorf("Error replacing config %s", err) return err } - if err := node.Init(req.Context, rep, genesisFunc, initOpts...); err != nil { + if err := node.Init(req.Context, rep, genesisFunc); err != nil { log.Errorf("Error initializing node %s", err) return err } @@ -293,40 +280,3 @@ func getRepo(req *cmds.Request) (repo.Repo, error) { } return repo.OpenFSRepo(repoDir, repo.LatestVersion) } - -func getNodeInitOpts(peerKeyFile string, walletKeyFile string) ([]node.InitOpt, error) { - var initOpts []node.InitOpt - if peerKeyFile != "" { - data, err := ioutil.ReadFile(peerKeyFile) - if err != nil { - return nil, err - } - peerKey, err := crypto.UnmarshalPrivateKey(data) - if err != nil { - return nil, err - } - initOpts = append(initOpts, node.PeerKeyOpt(peerKey)) - } - - if walletKeyFile != "" { - f, err := os.Open(walletKeyFile) - if err != nil { - return nil, err - } - - var wir *WalletSerializeResult - if err := json.NewDecoder(f).Decode(&wir); err != nil { - return nil, err - } - - if len(wir.KeyInfo) > 0 { - initOpts = append(initOpts, node.DefaultKeyOpt(wir.KeyInfo[0])) - } - - for _, k := range wir.KeyInfo[1:] { - initOpts = append(initOpts, node.ImportKeyOpt(k)) - } - } - - return initOpts, nil -} diff --git a/cmd/main.go b/cmd/main.go index cd8cb8bdbf..adb7252429 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -4,10 +4,10 @@ import ( "context" "encoding/json" "fmt" + fbig "github.com/filecoin-project/go-state-types/big" "io" "os" - - fbig "github.com/filecoin-project/go-state-types/big" + "strings" cmds "github.com/ipfs/go-ipfs-cmds" "github.com/ipfs/go-ipfs-cmds/cli" @@ -59,18 +59,6 @@ const ( // NAT mapping. SwarmPublicRelayAddress = "swarmrelaypublic" - // PropagationDelay is the duration the miner will wait for blocks to arrive before attempting to mine a new one - //PropagationDelay = "prop-delay" - - // PeerKeyFile is the path of file containing key to use for new nodes libp2p identity - PeerKeyFile = "peerkeyfile" - - // WalletKeyFile is the path of file containing wallet keys that may be imported on initialization - WalletKeyFile = "wallet-keyfile" - - // MinerActorAddress when set, sets the daemons's miner address to the provided address - //MinerActorAddress = "miner-actor-address" - // GenesisFile is the path of file containing archive of genesis block DAG data GenesisFile = "genesisfile" @@ -240,7 +228,7 @@ func (e *executor) Execute(req *cmds.Request, re cmds.ResponseEmitter, env cmds. return e.exec.Execute(req, re, env) } - client := cmdhttp.NewClient(e.api, e.token, cmdhttp.ClientWithAPIPrefix(node.APIPrefix)) + client := cmdhttp.NewClient(e.api, cmdhttp.ClientWithAPIPrefix(node.APIPrefix), cmdhttp.ClientWithHeader("Authorization", "Bearer "+e.token)) return client.Execute(req, re, env) } @@ -293,7 +281,6 @@ func getAPIInfo(req *cmds.Request) (*APIInfo, error) { if apiAddress, ok := req.Options[OptionAPI].(string); ok && apiAddress != "" { rawAddr = apiAddress } - // we will read the api file if no other option is given. if len(rawAddr) == 0 { rpcAPI, err := repo.APIAddrFromRepoPath(repoDir) @@ -303,6 +290,7 @@ func getAPIInfo(req *cmds.Request) (*APIInfo, error) { rawAddr = rpcAPI //NOTICE command only use api } + rawAddr = strings.Trim(rawAddr, " \n\t") maddr, err := ma.NewMultiaddr(rawAddr) if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("unable to convert API endpoint address %s to a multiaddr", rawAddr)) @@ -334,47 +322,6 @@ func getAPIInfo(req *cmds.Request) (*APIInfo, error) { }, nil } -// nolint -func getAPIAddress(req *cmds.Request) (string, error) { - var rawAddr string - var err error - // second highest precedence is env vars. - if envapi := os.Getenv("VENUS_API"); envapi != "" { - rawAddr = envapi - } - - // first highest precedence is cmd flag. - if apiAddress, ok := req.Options[OptionAPI].(string); ok && apiAddress != "" { - rawAddr = apiAddress - } - - // we will read the api file if no other option is given. - if len(rawAddr) == 0 { - repoDir, _ := req.Options[OptionRepoDir].(string) - repoDir, err = paths.GetRepoPath(repoDir) - if err != nil { - return "", err - } - rpcAPI, err := repo.APIAddrFromRepoPath(repoDir) - if err != nil { - return "", errors.Wrap(err, "can't find API endpoint address in environment, command-line, or local repo (is the daemon running?)") - } - rawAddr = rpcAPI //NOTICE command only use api - } - - maddr, err := ma.NewMultiaddr(rawAddr) - if err != nil { - return "", errors.Wrap(err, fmt.Sprintf("unable to convert API endpoint address %s to a multiaddr", rawAddr)) - } - - _, host, err := manet.DialArgs(maddr) - if err != nil { - return "", errors.Wrap(err, fmt.Sprintf("unable to dial API endpoint address %s", maddr)) - } - - return host, nil -} - func requiresDaemon(req *cmds.Request) bool { for cmd := range rootSubcmdsLocal { if len(req.Path) > 0 && req.Path[0] == cmd { diff --git a/go.mod b/go.mod index 5031039c0e..07556bb8cc 100644 --- a/go.mod +++ b/go.mod @@ -44,7 +44,7 @@ require ( github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 github.com/filecoin-project/specs-storage v0.2.0 github.com/filecoin-project/test-vectors/schema v0.0.5 - github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578 + github.com/filecoin-project/venus-auth v1.3.2-0.20220216020521-0dc6dfccd444 github.com/fxamacker/cbor/v2 v2.4.0 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/go-errors/errors v1.0.1 @@ -72,7 +72,7 @@ require ( github.com/ipfs/go-ipfs-blockstore v1.1.2 github.com/ipfs/go-ipfs-chunker v0.0.5 github.com/ipfs/go-ipfs-cmdkit v0.0.1 - github.com/ipfs/go-ipfs-cmds v0.5.0 + github.com/ipfs/go-ipfs-cmds v0.6.1-0.20220212012746-40b8fddb899f github.com/ipfs/go-ipfs-ds-help v1.1.0 github.com/ipfs/go-ipfs-exchange-interface v0.1.0 github.com/ipfs/go-ipfs-exchange-offline v0.1.1 @@ -140,6 +140,4 @@ replace ( github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi github.com/filecoin-project/go-jsonrpc => github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc github.com/filecoin-project/test-vectors => ./extern/test-vectors - github.com/golangci/golangci-lint => github.com/golangci/golangci-lint v1.39.0 - github.com/ipfs/go-ipfs-cmds => github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab ) diff --git a/go.sum b/go.sum index 9aab9065cc..f87ffa70dc 100644 --- a/go.sum +++ b/go.sum @@ -419,8 +419,8 @@ github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZ github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= -github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578 h1:RpiHYKzuEnWoPhp2HO7sVC8QY78TZIpO4dhbp0g/g+A= -github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578/go.mod h1:/cbLZYvQhinVFUG4TP2Uy1o7LtF+guT21qZIMTmKk0g= +github.com/filecoin-project/venus-auth v1.3.2-0.20220216020521-0dc6dfccd444 h1:3rvPIIVB5X39Is9rdDhzP0eEqRCEa2ADAj+/CFPbSa8= +github.com/filecoin-project/venus-auth v1.3.2-0.20220216020521-0dc6dfccd444/go.mod h1:KDW3vz4rQY1ZTZdp4jVyXASWrB1DRc9x2mPGJwqqBXI= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= @@ -448,8 +448,8 @@ github.com/getkin/kin-openapi v0.13.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU= +github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= @@ -487,7 +487,6 @@ github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8c github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= @@ -792,8 +791,6 @@ github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab h1:+Jov61TTljdzTKBecQizmUWJ6IIoVgzjukKppVr5TgI= -github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc h1:L4JH2Ltl/Embq4qYezs3RsIYW1BB/fB9TfUkk42FOzU= github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/ipfs-force-community/metrics v1.0.0/go.mod h1:mn40SioMuKtjmRumHFy/fJ26Pn028XuDjUJE9dorjyw= @@ -878,6 +875,8 @@ github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7Na github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= github.com/ipfs/go-ipfs-cmdkit v0.0.1 h1:X6YXEAjUljTzevE6DPUKXSqcgf+4FXzcn5B957F5MXo= github.com/ipfs/go-ipfs-cmdkit v0.0.1/go.mod h1:9FtbMdUabcSqv/G4/8WCxSLxkZxn/aZEFrxxqnVcRbg= +github.com/ipfs/go-ipfs-cmds v0.6.1-0.20220212012746-40b8fddb899f h1:CxAhvEnX+9OVd2HI5Hpph3JpEs0tbB8oU1r4e1GguRk= +github.com/ipfs/go-ipfs-cmds v0.6.1-0.20220212012746-40b8fddb899f/go.mod h1:y0bflH6m4g6ary4HniYt98UqbrVnRxmRarzeMdLIUn0= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index c0c647c514..5dc015c249 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -12,7 +12,6 @@ require ( github.com/filecoin-project/go-state-types v0.1.3 github.com/filecoin-project/lotus v1.13.3-0.20220112013034-7559e4311ea0 github.com/filecoin-project/venus v0.0.0-00010101000000-000000000000 - github.com/ipfs-force-community/venus-common-utils v0.0.0-20210924063144-1d3a5b30de87 // indirect github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-graphsync v0.11.5 github.com/ipfs/go-ipfs-http-client v0.1.0 // indirect diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index 24db508dc0..62446bdc7d 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -423,7 +423,7 @@ github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/g github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= -github.com/filecoin-project/venus-auth v1.3.1-0.20210809053831-012d55d5f578/go.mod h1:/cbLZYvQhinVFUG4TP2Uy1o7LtF+guT21qZIMTmKk0g= +github.com/filecoin-project/venus-auth v1.3.2-0.20220216020521-0dc6dfccd444/go.mod h1:KDW3vz4rQY1ZTZdp4jVyXASWrB1DRc9x2mPGJwqqBXI= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -450,7 +450,7 @@ github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6o github.com/getkin/kin-openapi v0.13.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s+pcEVXFuAjw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= @@ -495,7 +495,6 @@ github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72P github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= @@ -770,8 +769,6 @@ github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/ipfs-force-community/metrics v1.0.0/go.mod h1:mn40SioMuKtjmRumHFy/fJ26Pn028XuDjUJE9dorjyw= github.com/ipfs-force-community/metrics v1.0.1-0.20211022060227-11142a08b729/go.mod h1:mn40SioMuKtjmRumHFy/fJ26Pn028XuDjUJE9dorjyw= -github.com/ipfs-force-community/venus-common-utils v0.0.0-20210714054928-2042a9040759/go.mod h1:AWIt7L1UiUeIzqQdjQ/quZcVcCdnr6GXabGLBgEIMzU= -github.com/ipfs-force-community/venus-common-utils v0.0.0-20210924063144-1d3a5b30de87 h1:1PTFrWfxN5b8y1Cnw403PZ9Gy5RLHN4FXmUM4nTt9Yg= github.com/ipfs-force-community/venus-common-utils v0.0.0-20210924063144-1d3a5b30de87/go.mod h1:RTVEOzM+hkpqmcEWpyLDkx1oGO5r9ZWCgYxG/CsXzJQ= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= From 1515aa68f61520a2b7ef475d272ec2d27280b5aa Mon Sep 17 00:00:00 2001 From: Mike <41407352+hunjixin@users.noreply.github.com> Date: Fri, 18 Feb 2022 14:51:30 +0800 Subject: [PATCH 157/167] fix security dependency (#4784) * fix security dependency --- go.mod | 20 +- go.sum | 658 +++++++++++++++++- .../filecoin/docker/dockerfilecoin.go | 5 +- venus-devtool/go.sum | 607 +++++++++++++++- 4 files changed, 1227 insertions(+), 63 deletions(-) diff --git a/go.mod b/go.mod index 07556bb8cc..60ed82c136 100644 --- a/go.mod +++ b/go.mod @@ -5,18 +5,16 @@ go 1.16 require ( contrib.go.opencensus.io/exporter/jaeger v0.2.1 contrib.go.opencensus.io/exporter/prometheus v0.4.0 - github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee - github.com/Microsoft/go-winio v0.4.14 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d github.com/ahmetb/go-linq/v3 v3.2.0 github.com/awnumar/memguard v0.22.2 github.com/bluele/gcache v0.0.0-20190518031135-bc40bd653833 + github.com/containerd/containerd v1.6.0 // indirect github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e github.com/dgraph-io/badger/v2 v2.2007.3 - github.com/docker/distribution v2.7.1+incompatible // indirect - github.com/docker/docker v0.7.3-0.20190315170154-87d593639c77 - github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/distribution v2.8.0+incompatible // indirect + github.com/docker/docker v20.10.12+incompatible github.com/docker/go-units v0.4.0 github.com/drand/drand v1.3.0 github.com/drand/kyber v1.1.7 @@ -99,24 +97,19 @@ require ( github.com/libp2p/go-libp2p-yamux v0.7.0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 - github.com/morikuni/aec v1.0.0 // indirect + github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect github.com/multiformats/go-multiaddr v0.4.1 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multihash v0.1.0 - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.1 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible github.com/pborman/uuid v1.2.0 - github.com/pelletier/go-toml v1.6.0 // indirect github.com/pkg/errors v0.9.1 github.com/pmezard/go-difflib v1.0.0 github.com/prometheus/client_golang v1.11.0 github.com/raulk/clock v1.1.0 - github.com/spf13/afero v1.2.2 // indirect github.com/spf13/cast v1.3.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e - github.com/stretchr/objx v0.2.0 // indirect github.com/stretchr/testify v1.7.0 github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 github.com/whyrusleeping/go-logging v0.0.1 @@ -126,14 +119,15 @@ require ( go.opencensus.io v0.23.0 go.uber.org/zap v1.19.1 golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 - golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c + golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20211209171907-798191bca915 + golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 gopkg.in/cheggaaa/pb.v1 v1.0.28 gorm.io/driver/mysql v1.1.1 gorm.io/gorm v1.21.12 gotest.tools v2.2.0+incompatible + gotest.tools/v3 v3.1.0 // indirect ) replace ( diff --git a/go.sum b/go.sum index f87ffa70dc..0f6c4e143c 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ 4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a h1:wFEQiK85fRsEVF0CRrPAos5LoAryUsIX1kPW/WrIqFw= 4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -19,6 +21,11 @@ cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZ cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -52,11 +59,28 @@ dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBr dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -78,12 +102,40 @@ github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3Q github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= +github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= +github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us= github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= @@ -102,6 +154,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= @@ -119,6 +173,7 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/ashanbrown/forbidigo v1.1.0 h1:SJOPJyqsrVL3CvR0veFZFmIM0fXS/Kvyikqvfphd0Z4= github.com/ashanbrown/forbidigo v1.1.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= github.com/ashanbrown/makezero v0.0.0-20210308000810-4155955488a0 h1:27owMIbvO33XL56BKWPy+SCU69I9wPwPXuMf5mAbVGU= @@ -128,6 +183,7 @@ github.com/awnumar/memcall v0.0.0-20191004114545-73db50fd9f80/go.mod h1:S911igBP github.com/awnumar/memguard v0.22.2 h1:tMxcq1WamhG13gigK8Yaj9i/CHNUO3fFlpS9ABBQAxw= github.com/awnumar/memguard v0.22.2/go.mod h1:33OwJBHC+T4eEfFcDrQb78TMlBMBvcOPCXWU9xE34gM= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -143,6 +199,7 @@ github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiU github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -150,15 +207,21 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bep/debounce v1.2.0 h1:wXds8Kq8qRfwAOpAxHrJDbCXgC5aHSzgQb/0gKsHQqo= github.com/bep/debounce v1.2.0/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bkielbasa/cyclop v1.2.0 h1:7Jmnh0yL2DjKfw28p86YTd/B4lRGcNuu12sKE35sM7A= github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bluele/gcache v0.0.0-20190518031135-bc40bd653833 h1:yCfXxYaelOyqnia8F/Yng47qhmfC9nKTRIbYRrRueq4= github.com/bluele/gcache v0.0.0-20190518031135-bc40bd653833/go.mod h1:8c4/i2VlovMO2gBnHGQPN5EJw+H0lx1u/5p+cgsXtCk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bombsimon/wsl/v3 v3.2.0 h1:x3QUbwW7tPGcCNridvqmhSRthZMTALnkg5/1J+vaUas= github.com/bombsimon/wsl/v3 v3.2.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= @@ -179,12 +242,20 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -192,38 +263,157 @@ github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cb github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charithe/durationcheck v0.0.6 h1:Tsy7EppNow2pDC0jN7Hsmcb6mHd71ZbI1vFissRBtc0= github.com/charithe/durationcheck v0.0.6/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327 h1:7grrpcfCtbZLsjtB0DgMuzs1umsJmpzaHMZ6cO6iAWw= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= +github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4= +github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= +github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= +github.com/containerd/containerd v1.6.0 h1:CLa12ZcV0d2ZTRKq1ssioeJpTnPJBMyndpEKA+UtzJg= +github.com/containerd/containerd v1.6.0/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -239,9 +429,16 @@ github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuv github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= github.com/daixiang0/gci v0.2.8 h1:1mrIGMBQsBu0P7j7m1M8Lb+ZeZxsZL+jyGX4YoMJJpg= github.com/daixiang0/gci v0.2.8/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -257,6 +454,7 @@ github.com/deepmap/oapi-codegen v1.3.13 h1:9HKGCsdJqE4dnrQ8VerFS0/1ZOJPmAhN+g8xg github.com/deepmap/oapi-codegen v1.3.13/go.mod h1:WAmG5dWY8/PYHt4vKxlt90NsbHMAOCiteYKZMiIRfOo= github.com/denis-tingajkin/go-header v0.4.2 h1:jEeSF4sdv8/3cT/WY8AgDHUoItNSoEZ7qg9dX7pc218= github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e h1:lj77EKYUpYXTd8CD/+QMIf8b6OIOTsfEBSXiAzuEHTU= github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e/go.mod h1:3ZQK6DMPSz/QZ73jlWxBtUhNA8xZx7LzUFSq/OfP8vk= github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= @@ -273,19 +471,34 @@ github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70d github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.4-0.20210122082011-bb5d392ed82d h1:eQYOG6A4td1tht0NdJB9Ls6DsXRGb2Ft6X9REU/MbbE= github.com/dgraph-io/ristretto v0.0.4-0.20210122082011-bb5d392ed82d/go.mod h1:tv2ec8nA7vRpSYX7/MbP52ihrUMXIHit54CQMq8npXQ= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190315170154-87d593639c77 h1:jRmfPRYK6rNVHTzLc2Fr8mqRprfTrwKUOCM4Kope1HE= -github.com/docker/docker v0.7.3-0.20190315170154-87d593639c77/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/distribution v2.8.0+incompatible h1:l9EaZDICImO1ngI+uTifW+ZYvvz7fKISBAKpg+MbWbY= +github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.12+incompatible h1:CEeNmFM0QZIsJCZKMkZx0ZcahTiewkrgiwfYD+dfl1U= +github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= github.com/drand/drand v1.3.0 h1:k/w/PtHzmlU6OmfoAqgirWyrJ4FZH8ESlJrsKF20UkM= github.com/drand/drand v1.3.0/go.mod h1:D6kAVlxufq1gi71YCGfzN455JrXF4Q272ZJEG975fzo= @@ -306,18 +519,25 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elastic/gosigar v0.12.0 h1:AsdhYCJlTudhfOYQyFNgx+fIVTfrDO0V1ST0vHgiapU= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/esimonov/ifshort v1.0.2 h1:K5s1W2fGfkoWXsFlxBNqT6J0ZCncPaKrGM5qe0bni68= github.com/esimonov/ifshort v1.0.2/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= @@ -327,6 +547,7 @@ github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2 h1:dWh+o7gzavw1JUlsTqBj2/87r1Z6fbPZuZS43UiIW60= github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= @@ -425,6 +646,8 @@ github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= @@ -436,15 +659,19 @@ github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/fzipp/gocyclo v0.3.1 h1:A9UeX3HJSXTBzvHzhqoYVuE0eAhe+aM8XBCCwsPMZOc= github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/gbrlsnchs/jwt/v3 v3.0.0/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/getkin/kin-openapi v0.13.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s+pcEVXFuAjw= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= @@ -461,6 +688,7 @@ github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= @@ -474,13 +702,31 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.1 h1:DX7uPQ4WgAWfoh+NGGlbJQswnYIVvz0SRlLS3rPZQDA= github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.0 h1:j4LrlVXgrbIWO83mmQUnK0Hi+YnbD+vzrE1z/EphbFE= +github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= @@ -528,20 +774,26 @@ github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzz github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968 h1:s+PDl6lozQ+dEUtUtQnO7+A2iPG3sK1pI4liU+jxn90= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY= github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0 h1:zgVt4UpGxcqVOw97aRGxT4svlcmdK35fynLNctY32zI= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -568,6 +820,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -617,6 +870,7 @@ github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSW github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= github.com/google/flatbuffers v1.12.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= @@ -635,17 +889,21 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= github.com/google/go-dap v0.2.0/go.mod h1:5q8aYQFnHOAZEMP+6vmq25HKYAEwE+LF5yh7JKrrhSQ= github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -654,6 +912,10 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -667,6 +929,9 @@ github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/gookit/color v1.3.8/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -677,8 +942,10 @@ github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254 h1:Nb2aRlC github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= @@ -706,8 +973,9 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmg github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2 h1:FlFbCRLd5Jr4iYXZufAvgWN6Ao0JrI5chLINnUXDDr0= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= @@ -732,8 +1000,10 @@ github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/ github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= @@ -742,6 +1012,7 @@ github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39 github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= @@ -781,8 +1052,13 @@ github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb-client-go/v2 v2.2.2 h1:O0CGIuIwQafvAxttAJ/VqMKfbWWn2Mt8rbOmaM2Zj4w= @@ -791,6 +1067,7 @@ github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc h1:L4JH2Ltl/Embq4qYezs3RsIYW1BB/fB9TfUkk42FOzU= github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/ipfs-force-community/metrics v1.0.0/go.mod h1:mn40SioMuKtjmRumHFy/fJ26Pn028XuDjUJE9dorjyw= @@ -985,6 +1262,8 @@ github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1 github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= @@ -1014,15 +1293,20 @@ github.com/jinzhu/now v1.1.2 h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI= github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.0 h1:J2SLSdy7HgElq8ekSl2Mxh6vrRNFxqbXGenYH2I02Vs= github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= @@ -1066,7 +1350,9 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= @@ -1089,6 +1375,7 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -1437,6 +1724,7 @@ github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDY github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= @@ -1452,10 +1740,16 @@ github.com/magefile/mage v1.11.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXq github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/maratori/testpackage v1.0.1 h1:QtJ5ZjqapShm0w5DosRjg0PRlSdAdlx+W6cCKoALdbQ= github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= @@ -1497,11 +1791,16 @@ github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwgOdMUQePUo= github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc= @@ -1543,6 +1842,7 @@ github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1 github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= @@ -1557,9 +1857,22 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo= github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mmcloughlin/avo v0.0.0-20201105074841-5d2f697d268f/go.mod h1:6aKT4zZIrpGqB3RpFU14ByCSSyKY6LfJz4J/JJChHfI= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -1580,6 +1893,7 @@ github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjW github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= 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/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= @@ -1643,10 +1957,13 @@ github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXS github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nakabonne/nestif v0.3.0 h1:+yOViDGhg8ygGrmII72nV9B/zGxY188TYpfolntsaPw= github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= @@ -1664,6 +1981,7 @@ github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -1685,33 +2003,66 @@ github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXW github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= -github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU= +github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= +github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5 h1:q37d91F6BO4Jp1UqWiun0dUFYaqv6WsKTLTCaWv+8LY= +github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df h1:vdYtBU6zvL7v+Tr+0xFM/qhahw/EvY8DMMunZHKH6eE= github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= @@ -1738,8 +2089,9 @@ github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTK github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= -github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= @@ -1751,6 +2103,7 @@ github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7 github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -1768,11 +2121,14 @@ github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f h1:xAw10KgJ github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= @@ -1782,6 +2138,7 @@ github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66Id github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1789,11 +2146,13 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= @@ -1804,11 +2163,15 @@ github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -1860,10 +2223,17 @@ github.com/ryancurrah/gomodguard v1.2.0/go.mod h1:rNqbC4TOIdUDcVMSIpNNAzTbzXAZa6 github.com/ryanrolds/sqlclosecheck v0.3.0 h1:AZx+Bixh8zdUBxUA1NxbxVAS78vTPq4rCb8OUZI9xFw= github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sanposhiho/wastedassign v0.2.0 h1:0vycy8D/Ky55U5ub8oJFqyDv9M4ICM/wte9sAp2/7Mc= github.com/sanposhiho/wastedassign v0.2.0/go.mod h1:LGpq5Hsv74QaqM47WtIsRSF/ik9kqk07kchgv66tLVE= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/securego/gosec/v2 v2.7.0 h1:mOhJv5w6UyNLpSssQOQCc7eGkKLuicAxvf66Ey/X4xk= github.com/securego/gosec/v2 v2.7.0/go.mod h1:xNbGArrGUspJLuz3LS5XCY1EBW/0vABAl/LWfSklmiM= github.com/sercand/kuberesolver v2.1.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= @@ -1899,6 +2269,8 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= github.com/siebenmann/go-kstat v0.0.0-20160321171754-d34789b79745/go.mod h1:G81aIFAMS9ECrwBYR9YxhlPjWgrItd+Kje78O6+uqm8= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -1917,6 +2289,7 @@ github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIK github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/sonatard/noctx v0.0.1 h1:VC1Qhl6Oxx9vvWo3UDgrGXYCeKCe3Wbw7qAWL6FrmTY= github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= @@ -1938,36 +2311,45 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.0-20170417170307-b6cb39589372/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v0.0.0-20170417173400-9e4c21054fa1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= github.com/ssgreg/nlreturn/v2 v2.1.0 h1:6/s4Rc49L6Uo6RLjhWZGBpWWjfzk2yrf1nIW8m4wgVA= github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e h1:mOtuXaRAbVZsxAHVdPR3IjfmN8T1h2iczJLynhLybf8= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -1978,8 +2360,12 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b h1:HxLVTlqcHhFAz3nWUcuvpH7WuOMv8LQoCWmruLfFH2U= github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= github.com/tetafro/godot v1.4.4 h1:VAtLEoAMmopIzHVWVBrztjVWDeYm1OD/DKqhqXR4828= @@ -1995,12 +2381,14 @@ github.com/tklauser/numcpus v0.2.1/go.mod h1:9aU+wOc6WjUIZEwWMP62PL/41d65P+iks1g github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tomarrell/wrapcheck v1.0.0 h1:e/6yv/rH08TZFvkYpaAMrgGbaQHVFdzaPPv4a5EIu+o= github.com/tomarrell/wrapcheck v1.0.0/go.mod h1:Bd3i1FaEKe3XmcPoHhNQ+HM0S8P6eIXoQIoGj/ndJkU= github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= github.com/tommy-muehle/go-mnd/v2 v2.3.1 h1:a1S4+4HSXDJMgeODJH/t0EEKxcVla6Tasw+Zx9JJMog= github.com/tommy-muehle/go-mnd/v2 v2.3.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/twitchyliquid64/golang-asm v0.15.0/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.23.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= @@ -2009,6 +2397,7 @@ github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMW github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go v1.2.4 h1:cTciPbZ/VSOzCLKclmssnfQ/jyoVyOcJ3aoJyUV1Urc= github.com/ugorji/go v1.2.4/go.mod h1:EuaSCk8iZMdIspsu6HXH7X2UGKw1ezO4wCfGszGmmo4= @@ -2020,6 +2409,7 @@ github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iL github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg= github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= @@ -2039,6 +2429,14 @@ github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= github.com/warpfork/go-testmark v0.3.0 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= @@ -2087,9 +2485,14 @@ github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325 h1:++Zf4xQ7Yr github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325/go.mod h1:g7ckxrjiFh8mi1AY7ox23PZD0g6QU/TxW3U3unX7I3A= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb h1:/7/dQyiKnxAOj9L69FhST7uMe17U015XPzX7cy+5ykM= github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb/go.mod h1:pbNsDSxn1ICiNn9Ct4ZGNrwzfkkwYbx/lw8VuyutFIg= @@ -2107,6 +2510,9 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= @@ -2117,15 +2523,22 @@ go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= +go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= +go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -2138,20 +2551,33 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= +go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= +go.opentelemetry.io/otel/sdk v1.3.0 h1:3278edCoH89MEJ0Ky8WQXVmDQv3FX4ZJ3Pp+9fJreAI= +go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= +go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= +go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= go.starlark.net v0.0.0-20190702223751-32f345186213/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -2163,8 +2589,9 @@ go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -2190,8 +2617,10 @@ golang.org/x/arch v0.0.0-20190927153633-4e8777c89be4/go.mod h1:flIaEI6LNU6xOCD5P golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -2224,6 +2653,7 @@ golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= @@ -2233,6 +2663,7 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2269,6 +2700,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -2308,6 +2740,7 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -2316,6 +2749,7 @@ golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -2336,9 +2770,12 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -2346,11 +2783,15 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ= +golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f h1:hEYJvxw1lSnWIl8X9ofsYMklzaDs90JI2az5YMd4fPM= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2358,8 +2799,15 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c h1:pkQiBZBvdos9qq4wBAHqlzuZHEXo07pqV06ef90u1WI= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f h1:Qmd2pbz05z7z6lm0DrgQVVPuBm92jqujBKMHMOlOQEw= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2401,34 +2849,45 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190902133755-9109b7679e13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191025090151-53bf42e6b339/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2446,45 +2905,74 @@ golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= -golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b h1:9zKuko04nR4gjZ4+DNjHqRlAJqbJETHwiNKDqTfOjfE= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= @@ -2494,12 +2982,15 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2519,8 +3010,11 @@ golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2563,8 +3057,10 @@ golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -2581,19 +3077,25 @@ golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201011145850-ed2f50202694/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201105001634-bc3cf281b174/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -2609,6 +3111,7 @@ gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJ gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= @@ -2629,8 +3132,13 @@ google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0 h1:yfrXXP61wVuLb0vBcG6qaOoIoqYEzOQS8jum51jkv2w= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0 h1:4sAyIHT6ZohtAQDoxws+ez7bROYmUlOVvsUscYCDTqA= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2639,8 +3147,10 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -2653,6 +3163,7 @@ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= @@ -2663,6 +3174,7 @@ google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -2677,15 +3189,31 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 h1:ysnBoUyeL/H6RCvNRhWHjKoDEmguI+mPU+qHgK8qv/w= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa h1:I0YcKz0I7OAhddo7ya8kMnvprhcWM045PmkBdMO9zN0= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2713,10 +3241,16 @@ google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM= +google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2731,8 +3265,10 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2744,10 +3280,15 @@ gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= @@ -2765,6 +3306,7 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.1.1 h1:yr1bpyqiwuSPJ4aGGUX9nu46RHXlF8RASQVb1QQNcvo= @@ -2774,6 +3316,10 @@ gorm.io/gorm v1.21.12 h1:3fQM0Eiz7jcJEhPggHEpoYnsGZqynMzverL77DV40RM= gorm.io/gorm v1.21.12/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +gotest.tools/v3 v3.1.0 h1:rVV8Tcg/8jHUkPUorwjaMTtemIMVXfIPKiOqnhEhakk= +gotest.tools/v3 v3.1.0/go.mod h1:fHy7eyTmJFO5bQbUsEGQ1v4m2J3Jz9eWL54TP2/ZuYQ= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2785,6 +3331,49 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= +k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= +k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= +k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= +k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= +k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= +k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= @@ -2813,6 +3402,13 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/tools/iptb-plugins/filecoin/docker/dockerfilecoin.go b/tools/iptb-plugins/filecoin/docker/dockerfilecoin.go index 6283ff28d9..6137903ff6 100644 --- a/tools/iptb-plugins/filecoin/docker/dockerfilecoin.go +++ b/tools/iptb-plugins/filecoin/docker/dockerfilecoin.go @@ -190,8 +190,7 @@ func (l *Dockerfilecoin) Init(ctx context.Context, args ...string) (testbedi.Out fmt.Sprintf("%s%s:%s", l.VolumePrefix, l.Dir(), "/data/filecoin"), }, }, - &network.NetworkingConfig{}, - "") + &network.NetworkingConfig{}, nil, "") if err != nil { return nil, err } @@ -281,7 +280,7 @@ func (l *Dockerfilecoin) Start(ctx context.Context, wait bool, args ...string) ( Binds: []string{fmt.Sprintf("%s%s:%s", l.VolumePrefix, l.Dir(), "/data/filecoin")}, }, &network.NetworkingConfig{}, - "") + nil, "") if err != nil { return nil, err } diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index 62446bdc7d..243ea44734 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -1,4 +1,6 @@ 4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -18,6 +20,11 @@ cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZ cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -50,10 +57,27 @@ dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBr dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= @@ -79,11 +103,37 @@ github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF0 github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= +github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= @@ -106,6 +156,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= @@ -122,11 +174,13 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/ashanbrown/forbidigo v1.1.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= github.com/ashanbrown/makezero v0.0.0-20210308000810-4155955488a0/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= github.com/awnumar/memcall v0.0.0-20191004114545-73db50fd9f80/go.mod h1:S911igBPR9CThzd/hYQQmTc9SWNu3ZHIlCGaWsWsoJo= github.com/awnumar/memguard v0.22.2/go.mod h1:33OwJBHC+T4eEfFcDrQb78TMlBMBvcOPCXWU9xE34gM= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -143,6 +197,7 @@ github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiU github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.2.0 h1:9Re3G2TWxkE06LdMWMpcY6KV81GLXMGiYpPYUPkFAws= github.com/benbjohnson/clock v1.2.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -150,12 +205,18 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bep/debounce v1.2.0 h1:wXds8Kq8qRfwAOpAxHrJDbCXgC5aHSzgQb/0gKsHQqo= github.com/bep/debounce v1.2.0/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bluele/gcache v0.0.0-20190518031135-bc40bd653833/go.mod h1:8c4/i2VlovMO2gBnHGQPN5EJw+H0lx1u/5p+cgsXtCk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bombsimon/wsl/v3 v3.2.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= @@ -177,51 +238,177 @@ github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/buger/goterm v1.0.3/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charithe/durationcheck v0.0.6/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.2.0 h1:Fv93L3KKckEcEHR3oApXVzyBTDA8WAm6VXhPE00N3f8= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.7.0 h1:1k/q3ATgxSXRdrmPfH8d7YK0GfqVsEKZAX9dQZvs56k= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= -github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327 h1:7grrpcfCtbZLsjtB0DgMuzs1umsJmpzaHMZ6cO6iAWw= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= +github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4= +github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= +github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= +github.com/containerd/containerd v1.6.0/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -238,9 +425,16 @@ github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuv github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY= github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= github.com/daixiang0/gci v0.2.8/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= @@ -255,6 +449,7 @@ github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6Uh github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/deepmap/oapi-codegen v1.3.13/go.mod h1:WAmG5dWY8/PYHt4vKxlt90NsbHMAOCiteYKZMiIRfOo= github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e h1:lj77EKYUpYXTd8CD/+QMIf8b6OIOTsfEBSXiAzuEHTU= github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e/go.mod h1:3ZQK6DMPSz/QZ73jlWxBtUhNA8xZx7LzUFSq/OfP8vk= github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= @@ -271,16 +466,31 @@ github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KP github.com/dgraph-io/ristretto v0.0.4-0.20210122082011-bb5d392ed82d/go.mod h1:tv2ec8nA7vRpSYX7/MbP52ihrUMXIHit54CQMq8npXQ= github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190315170154-87d593639c77/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= github.com/drand/drand v1.3.0/go.mod h1:D6kAVlxufq1gi71YCGfzN455JrXF4Q272ZJEG975fzo= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= @@ -303,19 +513,26 @@ github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6 github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elastic/gosigar v0.14.1 h1:T0aQ7n/n2ZA9W7DmAnj60v+qzqKERdBgJBO1CG2W6rc= github.com/elastic/gosigar v0.14.1/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/esimonov/ifshort v1.0.2/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= github.com/etclabscore/go-jsonschema-walk v0.0.6/go.mod h1:VdfDY72AFAiUhy0ZXEaWSpveGjMT5JcDIm903NGqFwQ= github.com/etclabscore/go-openrpc-reflect v0.0.36/go.mod h1:0404Ky3igAasAOpyj1eESjstTyneBAIk5PgJFbK4s5E= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A= github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -325,6 +542,7 @@ github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGE github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= github.com/filecoin-project/dagstore v0.4.4 h1:luolWahhzp3ulRsapGKE7raoLE3n2cFkQUJjPyqUmF4= github.com/filecoin-project/dagstore v0.4.4/go.mod h1:7BlOvaTJrFJ1Qemt5jHlLJ4VhDIuSIzGS0IwO/0AXPA= @@ -427,6 +645,8 @@ github.com/filecoin-project/venus-auth v1.3.2-0.20220216020521-0dc6dfccd444/go.m github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= @@ -438,16 +658,20 @@ github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/gbrlsnchs/jwt/v3 v3.0.0/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= github.com/getkin/kin-openapi v0.13.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s+pcEVXFuAjw= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= @@ -460,6 +684,7 @@ github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= @@ -472,26 +697,38 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.1 h1:DX7uPQ4WgAWfoh+NGGlbJQswnYIVvz0SRlLS3rPZQDA= github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.0 h1:j4LrlVXgrbIWO83mmQUnK0Hi+YnbD+vzrE1z/EphbFE= +github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/spec v0.19.7/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/spec v0.19.11/go.mod h1:vqK/dIdLGCosfvYsQV3WfC7N3TiZSnGY2RZKoFK7X28= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.8/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72POcgHMAgSY= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= @@ -520,18 +757,24 @@ github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2 github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968 h1:s+PDl6lozQ+dEUtUtQnO7+A2iPG3sK1pI4liU+jxn90= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -559,6 +802,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -598,6 +842,7 @@ github.com/golangci/revgrep v0.0.0-20210208091834-cd28932614b5/go.mod h1:LK+zW4M github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= github.com/google/flatbuffers v1.12.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= @@ -615,15 +860,19 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= github.com/google/go-dap v0.2.0/go.mod h1:5q8aYQFnHOAZEMP+6vmq25HKYAEwE+LF5yh7JKrrhSQ= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -632,6 +881,10 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -645,6 +898,9 @@ github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/gookit/color v1.3.8/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -654,8 +910,10 @@ github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1: github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= @@ -680,6 +938,7 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= @@ -701,8 +960,10 @@ github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/ github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= @@ -711,6 +972,7 @@ github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39 github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= @@ -751,18 +1013,24 @@ github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3 github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/iancoleman/orderedmap v0.1.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo= github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 h1:9tcYMdi+7Rb1y0E9Del1DRHui7Ne3za5lLw6CjMJv/M= github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1CF7AqnKZK+UCytLcY3G+UKo0ByXX/3xfdNyqQ= github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k= github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb-client-go/v2 v2.2.2/go.mod h1:fa/d1lAdUHxuc1jedx30ZfNG573oQTQmUni3N6pcW+0= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab h1:+Jov61TTljdzTKBecQizmUWJ6IIoVgzjukKppVr5TgI= github.com/ipfs-force-community/go-ipfs-cmds v0.6.1-0.20210521090123-4587df7fa0ab/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= github.com/ipfs-force-community/go-jsonrpc v0.1.4-0.20210731021807-68e5207079bc h1:L4JH2Ltl/Embq4qYezs3RsIYW1BB/fB9TfUkk42FOzU= @@ -977,6 +1245,8 @@ github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5d github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= @@ -1002,11 +1272,14 @@ github.com/jingyugao/rowserrcheck v0.0.0-20210315055705-d907ca737bb1/go.mod h1:T github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -1053,7 +1326,9 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= @@ -1076,6 +1351,7 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -1431,6 +1707,7 @@ github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDY github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= @@ -1447,13 +1724,16 @@ github.com/magefile/mage v1.11.0 h1:C/55Ywp9BpgVVclD3lRnSYCwXTYxmSppIgLeDYlNuls= github.com/magefile/mage v1.11.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= @@ -1494,11 +1774,16 @@ github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc= github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= @@ -1536,6 +1821,7 @@ github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1 github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= @@ -1549,9 +1835,21 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mmcloughlin/avo v0.0.0-20201105074841-5d2f697d268f/go.mod h1:6aKT4zZIrpGqB3RpFU14ByCSSyKY6LfJz4J/JJChHfI= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -1568,6 +1866,7 @@ github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjW github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= 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/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-base32 v0.0.4 h1:+qMh4a2f37b4xTNs6mqitDinryCI+tfO2dRVMN9mjSE= github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= @@ -1621,10 +1920,13 @@ github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+ github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= @@ -1640,6 +1942,7 @@ github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1t github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM= @@ -1660,31 +1963,64 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333/go.mod h1:Ag6rSXkHIckQmjFBCweJEEt1mrTPBv8b9W4aU/NQWfI= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= +github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= @@ -1707,7 +2043,8 @@ github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144T github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= @@ -1718,6 +2055,7 @@ github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7 github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -1734,6 +2072,8 @@ github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXx github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= @@ -1750,6 +2090,7 @@ github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66Id github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1757,6 +2098,7 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= @@ -1774,14 +2116,17 @@ github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -1830,9 +2175,16 @@ github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0 github.com/ryancurrah/gomodguard v1.2.0/go.mod h1:rNqbC4TOIdUDcVMSIpNNAzTbzXAZa6W5lnUepvuMMgQ= github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sanposhiho/wastedassign v0.2.0/go.mod h1:LGpq5Hsv74QaqM47WtIsRSF/ik9kqk07kchgv66tLVE= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/securego/gosec/v2 v2.7.0/go.mod h1:xNbGArrGUspJLuz3LS5XCY1EBW/0vABAl/LWfSklmiM= github.com/sercand/kuberesolver v2.1.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= github.com/sercand/kuberesolver v2.4.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= @@ -1867,6 +2219,8 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= github.com/siebenmann/go-kstat v0.0.0-20160321171754-d34789b79745/go.mod h1:G81aIFAMS9ECrwBYR9YxhlPjWgrItd+Kje78O6+uqm8= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -1885,6 +2239,7 @@ github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIK github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a/go.mod h1:LeFCbQYJ3KJlPs/FvPz2dy1tkpxyeNESVyCNNzRXFR0= @@ -1902,30 +2257,39 @@ github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTd github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.0-20170417170307-b6cb39589372/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v0.0.0-20170417173400-9e4c21054fa1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -1936,9 +2300,13 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= github.com/tetafro/godot v1.4.4/go.mod h1:FVDd4JuKliW3UgjswZfJfHq4vAx0bD/Jd5brJjGeaz4= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= @@ -1953,16 +2321,19 @@ github.com/tklauser/numcpus v0.2.1/go.mod h1:9aU+wOc6WjUIZEwWMP62PL/41d65P+iks1g github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tomarrell/wrapcheck v1.0.0/go.mod h1:Bd3i1FaEKe3XmcPoHhNQ+HM0S8P6eIXoQIoGj/ndJkU= github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= github.com/tommy-muehle/go-mnd/v2 v2.3.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/twitchyliquid64/golang-asm v0.15.0/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.23.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go v1.2.4/go.mod h1:EuaSCk8iZMdIspsu6HXH7X2UGKw1ezO4wCfGszGmmo4= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -1970,6 +2341,7 @@ github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLY github.com/ugorji/go/codec v1.2.4/go.mod h1:bWBu1+kIRWcF8uMklKaJrR6fTWQOwAlrIzX22pHwryA= github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= @@ -1990,6 +2362,14 @@ github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= github.com/warpfork/go-testmark v0.3.0 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= @@ -2038,9 +2418,14 @@ github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go. github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325/go.mod h1:g7ckxrjiFh8mi1AY7ox23PZD0g6QU/TxW3U3unX7I3A= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb h1:/7/dQyiKnxAOj9L69FhST7uMe17U015XPzX7cy+5ykM= github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb/go.mod h1:pbNsDSxn1ICiNn9Ct4ZGNrwzfkkwYbx/lw8VuyutFIg= @@ -2059,6 +2444,9 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.12.1/go.mod h1:KatxXrVDzgWwbssUWsF5+cOJHXPvzQ09YSlzGNuhOEo= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= @@ -2070,13 +2458,20 @@ go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYr go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= +go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= +go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -2090,26 +2485,39 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.22.6-0.20201102222123-380f4078db9f/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= go.opentelemetry.io/otel/bridge/opencensus v0.25.0/go.mod h1:dkZDdaNwLlIutxK2Kc2m3jwW2M1ISaNf8/rOYVwuVHs= go.opentelemetry.io/otel/exporters/jaeger v1.2.0/go.mod h1:KJLFbEMKTNPIfOxcg/WikIozEoKcPgJRz3Ce1vLlM8E= +go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= go.opentelemetry.io/otel/internal/metric v0.25.0/go.mod h1:Nhuw26QSX7d6n4duoqAFi5KOQR4AuzyMcl5eXOgwxtc= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk2s/F1Ju+TEEm8= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= +go.opentelemetry.io/otel/sdk v1.3.0 h1:3278edCoH89MEJ0Ky8WQXVmDQv3FX4ZJ3Pp+9fJreAI= +go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= +go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HMUYRvxXXCCnQCg2+ovdt2z8Pk= +go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/sdk/metric v0.25.0/go.mod h1:G4xzj4LvC6xDDSsVXpvRVclQCbofGGg4ZU2VKKtDRfg= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= go.starlark.net v0.0.0-20190702223751-32f345186213/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -2123,8 +2531,9 @@ go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -2150,8 +2559,10 @@ golang.org/x/arch v0.0.0-20190927153633-4e8777c89be4/go.mod h1:flIaEI6LNU6xOCD5P golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -2185,6 +2596,7 @@ golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= @@ -2194,6 +2606,7 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b h1:QAqMVf3pSa6eeTsuklijukjXBlj7Es2QQplab+/RbQ4= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -2231,6 +2644,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -2270,6 +2684,7 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -2278,6 +2693,7 @@ golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -2298,10 +2714,13 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201022231255-08b38378de70/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -2309,13 +2728,17 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f h1:hEYJvxw1lSnWIl8X9ofsYMklzaDs90JI2az5YMd4fPM= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2323,7 +2746,14 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2365,15 +2795,21 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190902133755-9109b7679e13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2384,6 +2820,7 @@ golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191025090151-53bf42e6b339/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2391,11 +2828,13 @@ golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2413,47 +2852,76 @@ golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -2462,11 +2930,14 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2486,8 +2957,11 @@ golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2531,8 +3005,10 @@ golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -2549,19 +3025,25 @@ golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201011145850-ed2f50202694/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201105001634-bc3cf281b174/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -2578,6 +3060,7 @@ gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJ gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= @@ -2599,6 +3082,11 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2608,6 +3096,8 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -2620,6 +3110,7 @@ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= @@ -2630,6 +3121,7 @@ google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -2644,14 +3136,30 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2679,10 +3187,16 @@ google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM= +google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2697,8 +3211,10 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2709,9 +3225,14 @@ gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= @@ -2729,6 +3250,7 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.1.1/go.mod h1:KdrTanmfLPPyAOeYGyG+UpDys7/7eeWT1zCq+oekYnU= @@ -2736,6 +3258,9 @@ gorm.io/gorm v1.21.9/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= gorm.io/gorm v1.21.12/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +gotest.tools/v3 v3.1.0/go.mod h1:fHy7eyTmJFO5bQbUsEGQ1v4m2J3Jz9eWL54TP2/ZuYQ= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2748,6 +3273,49 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= +k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= +k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= +k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= +k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= +k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= +k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= @@ -2773,6 +3341,13 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= From 81ff96a3855e90a5434ed650b10f57906c6e6279 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Fri, 18 Feb 2022 15:58:04 +0800 Subject: [PATCH 158/167] build v1.2.0-rc6 (#4785) * tweak v15 migration params * venus-devtool: upgrade lotus to v1.14.0 * set ohSnap mainnet upgrade epoch * update version to v1.2.0-rc6 * upgrade venus-auth --- fixtures/networks/integrationtestnet.go | 2 +- fixtures/networks/mainnet.go | 2 +- go.mod | 2 +- go.sum | 10 +- pkg/config/config.go | 2 +- pkg/constants/version.go | 2 +- pkg/fork/fork.go | 9 +- pkg/migration/migrate.go | 2 +- venus-devtool/go.mod | 15 ++- venus-devtool/go.sum | 104 ++++++++++++------ .../compatible-checks/api-checksum.txt | 6 + venus-shared/compatible-checks/api-diff.txt | 6 + 12 files changed, 101 insertions(+), 61 deletions(-) diff --git a/fixtures/networks/integrationtestnet.go b/fixtures/networks/integrationtestnet.go index b36a643c26..cc94294c7c 100644 --- a/fixtures/networks/integrationtestnet.go +++ b/fixtures/networks/integrationtestnet.go @@ -36,7 +36,7 @@ func IntegrationNet() *NetworkConf { UpgradeTurboHeight: 712320, UpgradeHyperdriveHeight: 892800, UpgradeChocolateHeight: 1231620, - UpgradeOhSnapHeight: 999999999999, + UpgradeOhSnapHeight: 1594680, BreezeGasTampingDuration: 120, UpgradeClausHeight: 343200, diff --git a/fixtures/networks/mainnet.go b/fixtures/networks/mainnet.go index 7187664d92..8dc1b4c3a1 100644 --- a/fixtures/networks/mainnet.go +++ b/fixtures/networks/mainnet.go @@ -57,7 +57,7 @@ func Mainnet() *NetworkConf { UpgradeTurboHeight: 712320, // 2021-04-29T06:00:00Z UpgradeHyperdriveHeight: 892800, // 2021-06-30T22:00:00Z UpgradeChocolateHeight: 1231620, - UpgradeOhSnapHeight: 999999999999, + UpgradeOhSnapHeight: 1594680, // 2022-03-02T15:00:00Z BreezeGasTampingDuration: 120, UpgradeClausHeight: 343200, // 2020-12-22T02:00:00Z diff --git a/go.mod b/go.mod index 60ed82c136..908356cd59 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 github.com/filecoin-project/specs-storage v0.2.0 github.com/filecoin-project/test-vectors/schema v0.0.5 - github.com/filecoin-project/venus-auth v1.3.2-0.20220216020521-0dc6dfccd444 + github.com/filecoin-project/venus-auth v1.3.2 github.com/fxamacker/cbor/v2 v2.4.0 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/go-errors/errors v1.0.1 diff --git a/go.sum b/go.sum index 0f6c4e143c..84dae97a3c 100644 --- a/go.sum +++ b/go.sum @@ -640,8 +640,8 @@ github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZ github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= -github.com/filecoin-project/venus-auth v1.3.2-0.20220216020521-0dc6dfccd444 h1:3rvPIIVB5X39Is9rdDhzP0eEqRCEa2ADAj+/CFPbSa8= -github.com/filecoin-project/venus-auth v1.3.2-0.20220216020521-0dc6dfccd444/go.mod h1:KDW3vz4rQY1ZTZdp4jVyXASWrB1DRc9x2mPGJwqqBXI= +github.com/filecoin-project/venus-auth v1.3.2 h1:MDiXZAKB8cj1f1se8xzVH7eukHxL1NvMO2vmC2xwUl4= +github.com/filecoin-project/venus-auth v1.3.2/go.mod h1:m5Jog2GYxztwP7w3m/iJdv/V1/bTcAVU9rm/CbhxRQU= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= @@ -2398,13 +2398,11 @@ github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeND github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.2.4 h1:cTciPbZ/VSOzCLKclmssnfQ/jyoVyOcJ3aoJyUV1Urc= -github.com/ugorji/go v1.2.4/go.mod h1:EuaSCk8iZMdIspsu6HXH7X2UGKw1ezO4wCfGszGmmo4= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.4 h1:C5VurWRRCKjuENsbM6GYVw8W++WVW9rSxoACKIvxzz8= -github.com/ugorji/go/codec v1.2.4/go.mod h1:bWBu1+kIRWcF8uMklKaJrR6fTWQOwAlrIzX22pHwryA= github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg= diff --git a/pkg/config/config.go b/pkg/config/config.go index 5fe4bf0865..56f35f8f41 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -310,7 +310,7 @@ var DefaultForkUpgradeParam = &ForkUpgradeConfig{ UpgradeTurboHeight: 712320, UpgradeHyperdriveHeight: 892800, UpgradeChocolateHeight: 1231620, - UpgradeOhSnapHeight: 999999999999, + UpgradeOhSnapHeight: 1594680, } func newDefaultNetworkParamsConfig() *NetworkParamsConfig { diff --git a/pkg/constants/version.go b/pkg/constants/version.go index 57bf31f934..eb03812925 100644 --- a/pkg/constants/version.go +++ b/pkg/constants/version.go @@ -7,7 +7,7 @@ import ( ) // BuildVersion is the local build version, set by build system -const BuildVersion = "1.2.0-rc5" +const BuildVersion = "1.2.0-rc6" // software version func UserVersion() string { diff --git a/pkg/fork/fork.go b/pkg/fork/fork.go index b3186322d5..e508252760 100644 --- a/pkg/fork/fork.go +++ b/pkg/fork/fork.go @@ -271,13 +271,8 @@ func DefaultUpgradeSchedule(cf *ChainFork, upgradeHeight *config.ForkUpgradeConf Migration: cf.UpgradeActorsV7, PreMigrations: []PreMigration{{ PreMigration: cf.PreUpgradeActorsV7, - StartWithin: 120, + StartWithin: 180, DontStartWithin: 60, - StopWithin: 35, - }, { - PreMigration: cf.PreUpgradeActorsV7, - StartWithin: 30, - DontStartWithin: 15, StopWithin: 5, }}, Expensive: true, @@ -1952,7 +1947,7 @@ func (c *ChainFork) upgradeActorsV7Common( ts *types.TipSet, config nv15.Config, ) (cid.Cid, error) { - writeStore := blockstoreutil.NewAutobatch(ctx, c.bs, units.GiB) + writeStore := blockstoreutil.NewAutobatch(ctx, c.bs, units.GiB/4) // TODO: pretty sure we'd achieve nothing by doing this, confirm in review //buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), writeStore) store := chain.ActorStore(ctx, writeStore) diff --git a/pkg/migration/migrate.go b/pkg/migration/migrate.go index e9ce96b898..63744fb3f6 100644 --- a/pkg/migration/migrate.go +++ b/pkg/migration/migrate.go @@ -205,7 +205,7 @@ func Version7Upgrade(repoPath string) (err error) { switch cfg.NetworkParams.NetworkType { case constants.NetworkMainnet: cfg.NetworkParams.GenesisNetworkVersion = network.Version0 - cfg.NetworkParams.ForkUpgradeParam.UpgradeOhSnapHeight = 999999999999 + cfg.NetworkParams.ForkUpgradeParam.UpgradeOhSnapHeight = 1594680 case constants.Network2k: cfg.NetworkParams.GenesisNetworkVersion = network.Version0 cfg.NetworkParams.ForkUpgradeParam.UpgradeOhSnapHeight = -18 diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index 5dc015c249..3089305baf 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -5,20 +5,19 @@ go 1.16 require ( github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 - github.com/filecoin-project/go-data-transfer v1.12.1 - github.com/filecoin-project/go-ds-versioning v0.1.0 // indirect - github.com/filecoin-project/go-fil-markets v1.14.1 + github.com/filecoin-project/go-data-transfer v1.14.0 + github.com/filecoin-project/go-fil-markets v1.19.0 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-state-types v0.1.3 - github.com/filecoin-project/lotus v1.13.3-0.20220112013034-7559e4311ea0 + github.com/filecoin-project/lotus v1.14.0 github.com/filecoin-project/venus v0.0.0-00010101000000-000000000000 github.com/ipfs/go-cid v0.1.0 - github.com/ipfs/go-graphsync v0.11.5 + github.com/ipfs/go-graphsync v0.12.0 github.com/ipfs/go-ipfs-http-client v0.1.0 // indirect github.com/ipld/go-ipld-selector-text-lite v0.0.1 - github.com/libp2p/go-libp2p-core v0.13.0 - github.com/libp2p/go-libp2p-pubsub v0.6.0 - github.com/multiformats/go-multiaddr v0.4.1 + github.com/libp2p/go-libp2p-core v0.14.0 + github.com/libp2p/go-libp2p-pubsub v0.6.1 + github.com/multiformats/go-multiaddr v0.5.0 github.com/urfave/cli/v2 v2.3.0 github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 ) diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index 243ea44734..44828b8f19 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -156,6 +156,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a h1:E/8AP5dFtMhl5KPJz66Kt9G0n+7Sn41Fy1wv9/jHOrc= +github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= @@ -571,19 +573,21 @@ github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= -github.com/filecoin-project/go-data-transfer v1.12.1 h1:gAznAZKySVs2FS6T/vDq7R3f0DewLnxeROe0oOE6bZU= github.com/filecoin-project/go-data-transfer v1.12.1/go.mod h1:j3HL645YiQFxcM+q7uPlGApILSqeweDABNgZQP7pDYU= +github.com/filecoin-project/go-data-transfer v1.14.0 h1:4pnfJk8FYtqcdAg+QRGzaz57seUC/Tz+HJgPuGB7zdg= +github.com/filecoin-project/go-data-transfer v1.14.0/go.mod h1:wNJKhaLLYBJDM3VFvgvYi4iUjPa69pz/1Q5Q4HzX2wE= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= -github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= -github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= +github.com/filecoin-project/go-ds-versioning v0.1.1 h1:JiyBqaQlwC+UM0WhcBtVEeT3XrX59mQhT8U3p7nu86o= +github.com/filecoin-project/go-ds-versioning v0.1.1/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.14.1 h1:Bx+TSbkAN8K97Hpjgu+MpeRFbXIKH/fNpNp1ZGAEH3I= github.com/filecoin-project/go-fil-markets v1.14.1/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.19.0 h1:kap2q2wTM6tfkVO5gMA5DD9GUeTvkDhMfhjCtEwMDM8= +github.com/filecoin-project/go-fil-markets v1.19.0/go.mod h1:qsb3apmo4RSJYCEq40QxVdU7UZospN6nFJLOBHuaIbc= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -596,7 +600,6 @@ github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.m github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-paramfetch v0.0.4/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= @@ -614,8 +617,8 @@ github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZO github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/lotus v1.13.3-0.20220112013034-7559e4311ea0 h1:++7ma8Z4DNpC6QDWwGHuaqcDEFIYMo7CPXtaSzeeTNE= -github.com/filecoin-project/lotus v1.13.3-0.20220112013034-7559e4311ea0/go.mod h1:MUgwmFOQQ4isBZzNIvUWXf9tyPNeiRbn6ELJYQq0oYc= +github.com/filecoin-project/lotus v1.14.0 h1:tsqnUF4g8Zc3OVT+vTiMx0eC4KcYc1K5a/1An/O1KoU= +github.com/filecoin-project/lotus v1.14.0/go.mod h1:mAhLy4VNPWQumHpAXoQO+Y+956AoE1XCMCias8dHotk= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -637,11 +640,10 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/g github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsGGCE+NumpF6aiBoU/2X5W4= github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= -github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= -github.com/filecoin-project/venus-auth v1.3.2-0.20220216020521-0dc6dfccd444/go.mod h1:KDW3vz4rQY1ZTZdp4jVyXASWrB1DRc9x2mPGJwqqBXI= +github.com/filecoin-project/venus-auth v1.3.2/go.mod h1:m5Jog2GYxztwP7w3m/iJdv/V1/bTcAVU9rm/CbhxRQU= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -1041,6 +1043,8 @@ github.com/ipfs-force-community/venus-common-utils v0.0.0-20210924063144-1d3a5b3 github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= +github.com/ipfs/go-bitfield v1.0.0 h1:y/XHm2GEmD9wKngheWNNCNL0pzrWXZwCdQGv1ikXknQ= +github.com/ipfs/go-bitfield v1.0.0/go.mod h1:N/UiujQy+K+ceU1EF5EkVd1TNqevLrCQMIcAEPrdtus= github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= @@ -1104,8 +1108,9 @@ github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vc github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= -github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= +github.com/ipfs/go-graphsync v0.12.0 h1:QCsVHVzb9FTkcm3NEa8GjXnUeGit1L9s08HcSVQ4m/g= +github.com/ipfs/go-graphsync v0.12.0/go.mod h1:nASYWYETgsnMbQ3+DirNImOHQ8TY0a5AhAqyOY55tUg= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= @@ -1188,8 +1193,9 @@ github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGf github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= -github.com/ipfs/go-log/v2 v2.4.0 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= +github.com/ipfs/go-log/v2 v2.5.0 h1:+MhAooFd9XZNvR0i9FriKW6HB0ql7HNXUuflWtc0dd4= +github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= @@ -1209,8 +1215,11 @@ github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68 github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= -github.com/ipfs/go-unixfs v0.2.6 h1:gq3U3T2vh8x6tXhfo3uSO3n+2z4yW0tYtNgVP/3sIyA= github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= +github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8= +github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= +github.com/ipfs/go-unixfsnode v1.2.0 h1:tHHBJftsJyHGa8bS62PpkYNqHy/Sug3c/vxxC8NaGQY= +github.com/ipfs/go-unixfsnode v1.2.0/go.mod h1:mQEgLjxkV/1mohkC4p7taRRBYPBeXu97SA3YaerT2q0= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= github.com/ipfs/interface-go-ipfs-core v0.4.0 h1:+mUiamyHIwedqP8ZgbCIwpy40oX7QcXUbo4CZOeJVJg= @@ -1237,8 +1246,9 @@ github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHt github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= -github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G/JsQ= github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.4 h1:bqhmume8+nbNsX4/+J6eohktfZHAI8GKrF3rQ0xgOyc= +github.com/ipld/go-ipld-prime v0.14.4/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= @@ -1370,7 +1380,6 @@ github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= -github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= github.com/libp2p/go-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= @@ -1404,8 +1413,10 @@ github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qD github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= -github.com/libp2p/go-libp2p v0.17.0 h1:8l4GV401OSd4dFRyHDtIT/mEzdh/aQGoFC8xshYgm5M= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= +github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= +github.com/libp2p/go-libp2p v0.18.0-rc4 h1:OUsSbeu7q+Ck/bV9wHDxFzb08ORqBupHhpCmRBhWrJ8= +github.com/libp2p/go-libp2p v0.18.0-rc4/go.mod h1:wzmsk1ioOq9FGQys2BN5BIw4nugP6+R+CyW3JbPEbbs= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1417,7 +1428,6 @@ github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRk github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= -github.com/libp2p/go-libp2p-autonat v0.7.0 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= github.com/libp2p/go-libp2p-autonat v0.7.0/go.mod h1:uPvPn6J7cN+LCfFwW5tpOYvAz5NvPTc4iBamTV/WDMg= github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= @@ -1434,10 +1444,12 @@ github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8 github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= +github.com/libp2p/go-libp2p-circuit v0.6.0/go.mod h1:kB8hY+zCpMeScyvFrKrGicRdid6vNXbunKE4rXATZ0M= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= -github.com/libp2p/go-libp2p-connmgr v0.3.0 h1:yerFXrYa0oxpuVsLlndwm/bLulouHYDcvFrY/4H4fx8= github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= +github.com/libp2p/go-libp2p-connmgr v0.3.1 h1:alEy2fpGKFu+7ZhQF4GF0dvKLyVHeLtIfS/KziwoiZw= +github.com/libp2p/go-libp2p-connmgr v0.3.1/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= @@ -1471,8 +1483,9 @@ github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmk github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= -github.com/libp2p/go-libp2p-core v0.13.0 h1:IFG/s8dN6JN2OTrXX9eq2wNU/Zlz2KLdwZUp5FplgXI= github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.14.0 h1:0kYSgiK/D7Eo28GTuRXo5YHsWwAisVpFCqCVPUd/vJs= +github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsbrhG7q6pGrHtBg8= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -1506,6 +1519,7 @@ github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= +github.com/libp2p/go-libp2p-mplex v0.5.0/go.mod h1:eLImPJLkj3iG5t5lq68w3Vm5NAQ5BcKwrrb2VmOYb3M= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= @@ -1540,21 +1554,27 @@ github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYc github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= -github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= +github.com/libp2p/go-libp2p-pubsub v0.6.1 h1:wycbV+f4rreCoVY61Do6g/BUk0RIrbNRcYVbn+QkjGk= +github.com/libp2p/go-libp2p-pubsub v0.6.1/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= -github.com/libp2p/go-libp2p-quic-transport v0.15.2 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= +github.com/libp2p/go-libp2p-quic-transport v0.16.0/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ= +github.com/libp2p/go-libp2p-quic-transport v0.16.1 h1:N/XqYXHurphPLDfXYhll8NyqzdZYQqAF4GIr7+SmLV8= +github.com/libp2p/go-libp2p-quic-transport v0.16.1/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0= github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= +github.com/libp2p/go-libp2p-resource-manager v0.1.0/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= +github.com/libp2p/go-libp2p-resource-manager v0.1.3/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= +github.com/libp2p/go-libp2p-resource-manager v0.1.4/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw= @@ -1573,8 +1593,10 @@ github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJeg github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= -github.com/libp2p/go-libp2p-swarm v0.9.0 h1:LdWjHDVjPMYt3NCG2EHcQiIP8XzA8BHhHz8ZLAYol2Y= github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= +github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA= +github.com/libp2p/go-libp2p-swarm v0.10.1 h1:lXW3pgGt+BVmkzcFX61erX7l6Lt+WAamNhwa2Kf3eJM= +github.com/libp2p/go-libp2p-swarm v0.10.1/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1586,8 +1608,9 @@ github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehts github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= -github.com/libp2p/go-libp2p-testing v0.6.0 h1:tV/wz6mS1VoAYA/5DGTiyzw9TJ+eXMCMvzU5VPLJSgg= github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= +github.com/libp2p/go-libp2p-testing v0.7.0 h1:9bfyhNINizxuLrKsenzGaZalXRXIaAEmx1BP/PzF1gM= +github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= @@ -1602,8 +1625,10 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIW github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= -github.com/libp2p/go-libp2p-transport-upgrader v0.6.0 h1:GfMCU+2aGGEm1zW3UcOz6wYSn8tXQalFfVfcww99i5A= github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo= +github.com/libp2p/go-libp2p-transport-upgrader v0.7.0/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= +github.com/libp2p/go-libp2p-transport-upgrader v0.7.1 h1:MSMe+tUfxpC9GArTz7a4G5zQKQgGh00Vio87d3j3xIg= +github.com/libp2p/go-libp2p-transport-upgrader v0.7.1/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= @@ -1617,12 +1642,14 @@ github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelN github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= -github.com/libp2p/go-libp2p-yamux v0.7.0 h1:bVXHbTj/XH4uBBsPrg26BlDABk5WYRlssY73P0SjhPc= github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= +github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8= +github.com/libp2p/go-libp2p-yamux v0.8.1/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= +github.com/libp2p/go-libp2p-yamux v0.8.2 h1:6GKWntresp0TFxMP/oSoH96nV8XKJRdynXsdp43dn0Y= +github.com/libp2p/go-libp2p-yamux v0.8.2/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= -github.com/libp2p/go-maddr-filter v0.1.0 h1:4ACqZKw8AqiuJfwFGq1CYDFugfXTOos+qQ3DETkhtCE= github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= github.com/libp2p/go-mplex v0.0.4/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= @@ -1631,6 +1658,7 @@ github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3 github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= +github.com/libp2p/go-mplex v0.4.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= @@ -1645,8 +1673,9 @@ github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= -github.com/libp2p/go-netroute v0.1.6 h1:ruPJStbYyXVYGQ81uzEDzuvbYRLKRrLvTYd33yomC38= github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= +github.com/libp2p/go-netroute v0.2.0 h1:0FpsbsvuSnAhXFnCY0VLFbJOzaK0VnP0r1QT/o4nWRE= +github.com/libp2p/go-netroute v0.2.0/go.mod h1:Vio7LTzZ+6hoT4CMZi5/6CpY3Snzh2vgZhWgxMNwlQI= github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= @@ -1665,14 +1694,14 @@ github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7 github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-sockaddr v0.1.1 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqXJyFvB0mR4A04sQ= github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw= github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= -github.com/libp2p/go-stream-muxer-multistream v0.3.0 h1:TqnSHPJEIqDEO7h1wZZ0p3DXdvDSiLHQidKKUGZtiOY= github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= +github.com/libp2p/go-stream-muxer-multistream v0.4.0 h1:HsM/9OdtqnIzjVXcxTXjmqKrj3gJ8kacaOJwJS1ipaY= +github.com/libp2p/go-stream-muxer-multistream v0.4.0/go.mod h1:nb+dGViZleRP4XcyHuZSVrJCBl55nRBOMmiSL/dyziw= github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o= github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= @@ -1680,8 +1709,9 @@ github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcr github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= -github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= +github.com/libp2p/go-tcp-transport v0.5.0 h1:3ZPW8HAuyRAuFzyabE0hSrCXKKSWzROnZZX7DtcIatY= +github.com/libp2p/go-tcp-transport v0.5.0/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= @@ -1691,6 +1721,7 @@ github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzl github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= +github.com/libp2p/go-ws-transport v0.6.0/go.mod h1:dXqtI9e2JV9FtF1NOtWVZSKXh5zXvnuwPXfj8GPBbYU= github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= @@ -1702,8 +1733,10 @@ github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= +github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= +github.com/libp2p/go-yamux/v3 v3.0.2 h1:LW0q5+A1Wy0npEsPJP9wmare2NH4ohNluN5EWVwv2mE= +github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= @@ -1713,8 +1746,9 @@ github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdf github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= -github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= +github.com/lucas-clemente/quic-go v0.25.0 h1:K+X9Gvd7JXsOHtU0N2icZ2Nw3rx82uBej3mP4CLgibc= +github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= @@ -1745,6 +1779,8 @@ github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZE github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= github.com/marten-seemann/qtls-go1-17 v0.1.0 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1 h1:EnzzN9fPUkUck/1CuY1FlzBaIYMoiBsdwTNmNGkwUUM= +github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= @@ -1898,8 +1934,9 @@ github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77 github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= +github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c h1:VyANTtZ0wsx0IAZnCZhfMmAmfUyzJq/5JQi2hHOtKS0= +github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -2041,6 +2078,7 @@ github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIw github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= @@ -2335,10 +2373,8 @@ github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeND github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.2.4/go.mod h1:EuaSCk8iZMdIspsu6HXH7X2UGKw1ezO4wCfGszGmmo4= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.4/go.mod h1:bWBu1+kIRWcF8uMklKaJrR6fTWQOwAlrIzX22pHwryA= github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= diff --git a/venus-shared/compatible-checks/api-checksum.txt b/venus-shared/compatible-checks/api-checksum.txt index 7ce0948a9d..a8ced4081c 100644 --- a/venus-shared/compatible-checks/api-checksum.txt +++ b/venus-shared/compatible-checks/api-checksum.txt @@ -111,9 +111,12 @@ v0api.FullNode: NetConnectedness: In=2, Out=2, CheckSum=e489a3544ead801c9121171bdf1f3971 NetDisconnect: In=2, Out=1, CheckSum=814e6b52918db98c4883832a38cd222b NetFindPeer: In=2, Out=2, CheckSum=2ffcd1ed349f87c3cc0e2bb1ee2d68c6 + NetLimit: In=2, Out=2, CheckSum=9a35d6e94508e633a1cc5c5dc3f983eb NetPeerInfo: In=2, Out=2, CheckSum=1c030faf779524a321fe8cec305b9f25 NetPeers: In=1, Out=2, CheckSum=487043eee4cf0ea002d7a6d0a7ff793b NetPubsubScores: In=1, Out=2, CheckSum=66c7a1061de3d6e11d39ce90692aa885 + NetSetLimit: In=3, Out=1, CheckSum=f591c226feead6f0c1d9442a2320cd1e + NetStat: In=2, Out=2, CheckSum=82ea34376644e023a4314cde3fb1e4fc PaychAllocateLane: In=2, Out=2, CheckSum=2f0992ed1f0be8ff9bee0c3f0a39e1e1 PaychAvailableFunds: In=2, Out=2, CheckSum=f40942f65ce181601e7bc49e6378a89c PaychAvailableFundsByFromTo: In=3, Out=2, CheckSum=829ff29d78db755f3c13ab3259adb32b @@ -325,9 +328,12 @@ api.FullNode: NetConnectedness: In=2, Out=2, CheckSum=e489a3544ead801c9121171bdf1f3971 NetDisconnect: In=2, Out=1, CheckSum=814e6b52918db98c4883832a38cd222b NetFindPeer: In=2, Out=2, CheckSum=2ffcd1ed349f87c3cc0e2bb1ee2d68c6 + NetLimit: In=2, Out=2, CheckSum=9a35d6e94508e633a1cc5c5dc3f983eb NetPeerInfo: In=2, Out=2, CheckSum=1c030faf779524a321fe8cec305b9f25 NetPeers: In=1, Out=2, CheckSum=487043eee4cf0ea002d7a6d0a7ff793b NetPubsubScores: In=1, Out=2, CheckSum=66c7a1061de3d6e11d39ce90692aa885 + NetSetLimit: In=3, Out=1, CheckSum=f591c226feead6f0c1d9442a2320cd1e + NetStat: In=2, Out=2, CheckSum=82ea34376644e023a4314cde3fb1e4fc NodeStatus: In=2, Out=2, CheckSum=b46530b68171c85301db86c1b7c19824 PaychAllocateLane: In=2, Out=2, CheckSum=2f0992ed1f0be8ff9bee0c3f0a39e1e1 PaychAvailableFunds: In=2, Out=2, CheckSum=f40942f65ce181601e7bc49e6378a89c diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt index 65ccda5a44..0074d956fd 100644 --- a/venus-shared/compatible-checks/api-diff.txt +++ b/venus-shared/compatible-checks/api-diff.txt @@ -96,9 +96,12 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v0.FullNode <> github.c - NetConnectedness - NetDisconnect - NetFindPeer + - NetLimit - NetPeerInfo - NetPeers - NetPubsubScores + - NetSetLimit + - NetStat + NetworkConnect + NetworkFindPeer + NetworkFindProvidersAsync @@ -287,9 +290,12 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c - NetConnectedness - NetDisconnect - NetFindPeer + - NetLimit - NetPeerInfo - NetPeers - NetPubsubScores + - NetSetLimit + - NetStat + NetworkConnect + NetworkFindPeer + NetworkFindProvidersAsync From 50e20c4679b9217bc65f58e96260d95ee08c9ce8 Mon Sep 17 00:00:00 2001 From: Caesar Wang Date: Fri, 18 Feb 2022 18:29:03 +0800 Subject: [PATCH 159/167] fix: use DealProposal inside specs-actors (#4786) --- venus-shared/types/market/assigner_type.go | 3 ++- venus-shared/types/market/storage.go | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/venus-shared/types/market/assigner_type.go b/venus-shared/types/market/assigner_type.go index aa2fd60e88..54af7a4d3a 100644 --- a/venus-shared/types/market/assigner_type.go +++ b/venus-shared/types/market/assigner_type.go @@ -5,6 +5,7 @@ import ( "github.com/filecoin-project/go-fil-markets/piecestore" "github.com/filecoin-project/go-state-types/abi" + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" ) @@ -38,7 +39,7 @@ type DealInfoIncludePath struct { PayloadSize abi.UnpaddedPieceSize DealID abi.DealID TotalStorageFee abi.TokenAmount - market.DealProposal + market7.DealProposal FastRetrieval bool PublishCid cid.Cid } diff --git a/venus-shared/types/market/storage.go b/venus-shared/types/market/storage.go index b706a3d6c9..153aea09bc 100644 --- a/venus-shared/types/market/storage.go +++ b/venus-shared/types/market/storage.go @@ -4,6 +4,7 @@ import ( "time" "github.com/filecoin-project/go-state-types/abi" + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" "github.com/ipfs/go-cid" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" @@ -28,7 +29,7 @@ type SectorOffset struct { type PieceDealInfo struct { PublishCid *cid.Cid DealID abi.DealID - DealProposal *market.DealProposal + DealProposal *market7.DealProposal DealSchedule DealSchedule KeepUnsealed bool } From 8c1341e7801c38904c993d8e9f31d83c70b5449f Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Mon, 21 Feb 2022 09:57:30 +0800 Subject: [PATCH 160/167] fix comment (#4787) --- fixtures/networks/mainnet.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fixtures/networks/mainnet.go b/fixtures/networks/mainnet.go index 8dc1b4c3a1..0201dcc418 100644 --- a/fixtures/networks/mainnet.go +++ b/fixtures/networks/mainnet.go @@ -57,7 +57,7 @@ func Mainnet() *NetworkConf { UpgradeTurboHeight: 712320, // 2021-04-29T06:00:00Z UpgradeHyperdriveHeight: 892800, // 2021-06-30T22:00:00Z UpgradeChocolateHeight: 1231620, - UpgradeOhSnapHeight: 1594680, // 2022-03-02T15:00:00Z + UpgradeOhSnapHeight: 1594680, // 2022-03-01T15:00:00Z BreezeGasTampingDuration: 120, UpgradeClausHeight: 343200, // 2020-12-22T02:00:00Z From ef8733a595eb6e841c83e71a2b2c429ceb963784 Mon Sep 17 00:00:00 2001 From: zl Date: Mon, 21 Feb 2022 10:18:25 +0800 Subject: [PATCH 161/167] split-gateway-interfaces-by-role (#4788) --- venus-shared/api/gateway/v0/market_event.go | 7 + venus-shared/api/gateway/v0/method.md | 193 ++++++++++---------- venus-shared/api/gateway/v0/proof_event.go | 7 + venus-shared/api/gateway/v0/proxy_gen.go | 107 +++++++---- venus-shared/api/gateway/v0/wallet_event.go | 8 + venus-shared/api/gateway/v1/market_event.go | 7 + venus-shared/api/gateway/v1/method.md | 193 ++++++++++---------- venus-shared/api/gateway/v1/proof_event.go | 7 + venus-shared/api/gateway/v1/proxy_gen.go | 107 +++++++---- venus-shared/api/gateway/v1/wallet_event.go | 7 + 10 files changed, 385 insertions(+), 258 deletions(-) diff --git a/venus-shared/api/gateway/v0/market_event.go b/venus-shared/api/gateway/v0/market_event.go index 42db2d2872..dfb4c2f1ec 100644 --- a/venus-shared/api/gateway/v0/market_event.go +++ b/venus-shared/api/gateway/v0/market_event.go @@ -12,10 +12,17 @@ import ( ) type IMarketEvent interface { + IMarketClient + IMarketServiceProvider +} + +type IMarketClient interface { ListMarketConnectionsState(ctx context.Context) ([]gtypes.MarketConnectionState, error) //perm:admin IsUnsealed(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types.PaddedByteIndex, size abi.PaddedPieceSize) (bool, error) //perm:admin SectorsUnsealPiece(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types.PaddedByteIndex, size abi.PaddedPieceSize, dest string) error //perm:admin +} +type IMarketServiceProvider interface { ResponseMarketEvent(ctx context.Context, resp *gtypes.ResponseEvent) error //perm:read ListenMarketEvent(ctx context.Context, policy *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) //perm:read } diff --git a/venus-shared/api/gateway/v0/method.md b/venus-shared/api/gateway/v0/method.md index 49fc9e65e2..ac748dc7bf 100644 --- a/venus-shared/api/gateway/v0/method.md +++ b/venus-shared/api/gateway/v0/method.md @@ -1,29 +1,32 @@ # Groups -* [MarketEvent](#MarketEvent) +* [MarketClient](#MarketClient) * [IsUnsealed](#IsUnsealed) * [ListMarketConnectionsState](#ListMarketConnectionsState) + * [SectorsUnsealPiece](#SectorsUnsealPiece) +* [MarketServiceProvider](#MarketServiceProvider) * [ListenMarketEvent](#ListenMarketEvent) * [ResponseMarketEvent](#ResponseMarketEvent) - * [SectorsUnsealPiece](#SectorsUnsealPiece) -* [ProofEvent](#ProofEvent) +* [ProofClient](#ProofClient) * [ComputeProof](#ComputeProof) * [ListConnectedMiners](#ListConnectedMiners) * [ListMinerConnection](#ListMinerConnection) +* [ProofServiceProvider](#ProofServiceProvider) * [ListenProofEvent](#ListenProofEvent) * [ResponseProofEvent](#ResponseProofEvent) -* [WalletEvent](#WalletEvent) - * [AddNewAddress](#AddNewAddress) +* [WalletClient](#WalletClient) * [ListWalletInfo](#ListWalletInfo) * [ListWalletInfoByWallet](#ListWalletInfoByWallet) + * [WalletHas](#WalletHas) + * [WalletSign](#WalletSign) +* [WalletServiceProvider](#WalletServiceProvider) + * [AddNewAddress](#AddNewAddress) * [ListenWalletEvent](#ListenWalletEvent) * [RemoveAddress](#RemoveAddress) * [ResponseWalletEvent](#ResponseWalletEvent) * [SupportNewAccount](#SupportNewAccount) - * [WalletHas](#WalletHas) - * [WalletSign](#WalletSign) -## MarketEvent +## MarketClient ### IsUnsealed @@ -81,6 +84,35 @@ Response: ] ``` +### SectorsUnsealPiece + + +Perms: admin + +Inputs: +```json +[ + "f01234", + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "ID": { + "Miner": 1000, + "Number": 9 + }, + "ProofType": 8 + }, + 10, + 1032, + "string value" +] +``` + +Response: `{}` + +## MarketServiceProvider + ### ListenMarketEvent @@ -122,34 +154,7 @@ Inputs: Response: `{}` -### SectorsUnsealPiece - - -Perms: admin - -Inputs: -```json -[ - "f01234", - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "ID": { - "Miner": 1000, - "Number": 9 - }, - "ProofType": 8 - }, - 10, - 1032, - "string value" -] -``` - -Response: `{}` - -## ProofEvent +## ProofClient ### ComputeProof @@ -227,6 +232,8 @@ Response: } ``` +## ProofServiceProvider + ### ListenProofEvent @@ -268,24 +275,7 @@ Inputs: Response: `{}` -## WalletEvent - -### AddNewAddress - - -Perms: read - -Inputs: -```json -[ - "e26f1e5c-47f7-4561-a11d-18fab6e748af", - [ - "f01234" - ] -] -``` - -Response: `{}` +## WalletClient ### ListWalletInfo @@ -350,19 +340,35 @@ Response: } ``` -### ListenWalletEvent +### WalletHas -Perms: read +Perms: admin Inputs: ```json [ + "string value", + "f01234" +] +``` + +Response: `true` + +### WalletSign + + +Perms: admin + +Inputs: +```json +[ + "string value", + "f01234", + "Ynl0ZSBhcnJheQ==", { - "SupportAccounts": [ - "string value" - ], - "SignBytes": "Ynl0ZSBhcnJheQ==" + "Type": "message", + "Extra": "Ynl0ZSBhcnJheQ==" } ] ``` @@ -370,13 +376,14 @@ Inputs: Response: ```json { - "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", - "Method": "string value", - "Payload": "Ynl0ZSBhcnJheQ==" + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" } ``` -### RemoveAddress +## WalletServiceProvider + +### AddNewAddress Perms: read @@ -393,7 +400,7 @@ Inputs: Response: `{}` -### ResponseWalletEvent +### ListenWalletEvent Perms: read @@ -402,16 +409,24 @@ Inputs: ```json [ { - "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", - "Payload": "Ynl0ZSBhcnJheQ==", - "Error": "string value" + "SupportAccounts": [ + "string value" + ], + "SignBytes": "Ynl0ZSBhcnJheQ==" } ] ``` -Response: `{}` +Response: +```json +{ + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Method": "string value", + "Payload": "Ynl0ZSBhcnJheQ==" +} +``` -### SupportNewAccount +### RemoveAddress Perms: read @@ -420,50 +435,44 @@ Inputs: ```json [ "e26f1e5c-47f7-4561-a11d-18fab6e748af", - "string value" + [ + "f01234" + ] ] ``` Response: `{}` -### WalletHas +### ResponseWalletEvent -Perms: admin +Perms: read Inputs: ```json [ - "string value", - "f01234" + { + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Payload": "Ynl0ZSBhcnJheQ==", + "Error": "string value" + } ] ``` -Response: `true` +Response: `{}` -### WalletSign +### SupportNewAccount -Perms: admin +Perms: read Inputs: ```json [ - "string value", - "f01234", - "Ynl0ZSBhcnJheQ==", - { - "Type": "message", - "Extra": "Ynl0ZSBhcnJheQ==" - } + "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "string value" ] ``` -Response: -```json -{ - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" -} -``` +Response: `{}` diff --git a/venus-shared/api/gateway/v0/proof_event.go b/venus-shared/api/gateway/v0/proof_event.go index 1af746846a..c0a952ef38 100644 --- a/venus-shared/api/gateway/v0/proof_event.go +++ b/venus-shared/api/gateway/v0/proof_event.go @@ -10,10 +10,17 @@ import ( ) type IProofEvent interface { + IProofClient + IProofServiceProvider +} + +type IProofClient interface { ListConnectedMiners(ctx context.Context) ([]address.Address, error) //perm:admin ListMinerConnection(ctx context.Context, addr address.Address) (*gtypes.MinerState, error) //perm:admin ComputeProof(ctx context.Context, miner address.Address, sectorInfos []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) //perm:admin +} +type IProofServiceProvider interface { ResponseProofEvent(ctx context.Context, resp *gtypes.ResponseEvent) error //perm:read ListenProofEvent(ctx context.Context, policy *gtypes.ProofRegisterPolicy) (<-chan *gtypes.RequestEvent, error) //perm:read } diff --git a/venus-shared/api/gateway/v0/proxy_gen.go b/venus-shared/api/gateway/v0/proxy_gen.go index 39020b4b04..66c1f2b775 100644 --- a/venus-shared/api/gateway/v0/proxy_gen.go +++ b/venus-shared/api/gateway/v0/proxy_gen.go @@ -15,98 +15,131 @@ import ( gtypes "github.com/filecoin-project/venus/venus-shared/types/gateway" ) -type IProofEventStruct struct { +type IProofClientStruct struct { Internal struct { ComputeProof func(ctx context.Context, miner address.Address, sectorInfos []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) `perm:"admin"` ListConnectedMiners func(ctx context.Context) ([]address.Address, error) `perm:"admin"` ListMinerConnection func(ctx context.Context, addr address.Address) (*gtypes.MinerState, error) `perm:"admin"` - ListenProofEvent func(ctx context.Context, policy *gtypes.ProofRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` - ResponseProofEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` } } -func (s *IProofEventStruct) ComputeProof(p0 context.Context, p1 address.Address, p2 []builtin.SectorInfo, p3 abi.PoStRandomness) ([]builtin.PoStProof, error) { +func (s *IProofClientStruct) ComputeProof(p0 context.Context, p1 address.Address, p2 []builtin.SectorInfo, p3 abi.PoStRandomness) ([]builtin.PoStProof, error) { return s.Internal.ComputeProof(p0, p1, p2, p3) } -func (s *IProofEventStruct) ListConnectedMiners(p0 context.Context) ([]address.Address, error) { +func (s *IProofClientStruct) ListConnectedMiners(p0 context.Context) ([]address.Address, error) { return s.Internal.ListConnectedMiners(p0) } -func (s *IProofEventStruct) ListMinerConnection(p0 context.Context, p1 address.Address) (*gtypes.MinerState, error) { +func (s *IProofClientStruct) ListMinerConnection(p0 context.Context, p1 address.Address) (*gtypes.MinerState, error) { return s.Internal.ListMinerConnection(p0, p1) } -func (s *IProofEventStruct) ListenProofEvent(p0 context.Context, p1 *gtypes.ProofRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { + +type IProofServiceProviderStruct struct { + Internal struct { + ListenProofEvent func(ctx context.Context, policy *gtypes.ProofRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` + ResponseProofEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` + } +} + +func (s *IProofServiceProviderStruct) ListenProofEvent(p0 context.Context, p1 *gtypes.ProofRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { return s.Internal.ListenProofEvent(p0, p1) } -func (s *IProofEventStruct) ResponseProofEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { +func (s *IProofServiceProviderStruct) ResponseProofEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { return s.Internal.ResponseProofEvent(p0, p1) } -type IWalletEventStruct struct { +type IProofEventStruct struct { + IProofClientStruct + IProofServiceProviderStruct +} + +type IWalletClientStruct struct { Internal struct { - AddNewAddress func(ctx context.Context, channelID types.UUID, newAddrs []address.Address) error `perm:"read"` ListWalletInfo func(ctx context.Context) ([]*gtypes.WalletDetail, error) `perm:"admin"` ListWalletInfoByWallet func(ctx context.Context, wallet string) (*gtypes.WalletDetail, error) `perm:"admin"` - ListenWalletEvent func(ctx context.Context, policy *gtypes.WalletRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` - RemoveAddress func(ctx context.Context, channelID types.UUID, newAddrs []address.Address) error `perm:"read"` - ResponseWalletEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` - SupportNewAccount func(ctx context.Context, channelID types.UUID, account string) error `perm:"read"` WalletHas func(ctx context.Context, supportAccount string, addr address.Address) (bool, error) `perm:"admin"` WalletSign func(ctx context.Context, account string, addr address.Address, toSign []byte, meta types.MsgMeta) (*crypto.Signature, error) `perm:"admin"` } } -func (s *IWalletEventStruct) AddNewAddress(p0 context.Context, p1 types.UUID, p2 []address.Address) error { - return s.Internal.AddNewAddress(p0, p1, p2) -} -func (s *IWalletEventStruct) ListWalletInfo(p0 context.Context) ([]*gtypes.WalletDetail, error) { +func (s *IWalletClientStruct) ListWalletInfo(p0 context.Context) ([]*gtypes.WalletDetail, error) { return s.Internal.ListWalletInfo(p0) } -func (s *IWalletEventStruct) ListWalletInfoByWallet(p0 context.Context, p1 string) (*gtypes.WalletDetail, error) { +func (s *IWalletClientStruct) ListWalletInfoByWallet(p0 context.Context, p1 string) (*gtypes.WalletDetail, error) { return s.Internal.ListWalletInfoByWallet(p0, p1) } -func (s *IWalletEventStruct) ListenWalletEvent(p0 context.Context, p1 *gtypes.WalletRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { +func (s *IWalletClientStruct) WalletHas(p0 context.Context, p1 string, p2 address.Address) (bool, error) { + return s.Internal.WalletHas(p0, p1, p2) +} +func (s *IWalletClientStruct) WalletSign(p0 context.Context, p1 string, p2 address.Address, p3 []byte, p4 types.MsgMeta) (*crypto.Signature, error) { + return s.Internal.WalletSign(p0, p1, p2, p3, p4) +} + +type IWalletServiceProviderStruct struct { + Internal struct { + AddNewAddress func(ctx context.Context, channelID types.UUID, newAddrs []address.Address) error `perm:"read"` + ListenWalletEvent func(ctx context.Context, policy *gtypes.WalletRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` + RemoveAddress func(ctx context.Context, channelID types.UUID, newAddrs []address.Address) error `perm:"read"` + ResponseWalletEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` + SupportNewAccount func(ctx context.Context, channelID types.UUID, account string) error `perm:"read"` + } +} + +func (s *IWalletServiceProviderStruct) AddNewAddress(p0 context.Context, p1 types.UUID, p2 []address.Address) error { + return s.Internal.AddNewAddress(p0, p1, p2) +} +func (s *IWalletServiceProviderStruct) ListenWalletEvent(p0 context.Context, p1 *gtypes.WalletRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { return s.Internal.ListenWalletEvent(p0, p1) } -func (s *IWalletEventStruct) RemoveAddress(p0 context.Context, p1 types.UUID, p2 []address.Address) error { +func (s *IWalletServiceProviderStruct) RemoveAddress(p0 context.Context, p1 types.UUID, p2 []address.Address) error { return s.Internal.RemoveAddress(p0, p1, p2) } -func (s *IWalletEventStruct) ResponseWalletEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { +func (s *IWalletServiceProviderStruct) ResponseWalletEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { return s.Internal.ResponseWalletEvent(p0, p1) } -func (s *IWalletEventStruct) SupportNewAccount(p0 context.Context, p1 types.UUID, p2 string) error { +func (s *IWalletServiceProviderStruct) SupportNewAccount(p0 context.Context, p1 types.UUID, p2 string) error { return s.Internal.SupportNewAccount(p0, p1, p2) } -func (s *IWalletEventStruct) WalletHas(p0 context.Context, p1 string, p2 address.Address) (bool, error) { - return s.Internal.WalletHas(p0, p1, p2) -} -func (s *IWalletEventStruct) WalletSign(p0 context.Context, p1 string, p2 address.Address, p3 []byte, p4 types.MsgMeta) (*crypto.Signature, error) { - return s.Internal.WalletSign(p0, p1, p2, p3, p4) + +type IWalletEventStruct struct { + IWalletClientStruct + IWalletServiceProviderStruct } -type IMarketEventStruct struct { +type IMarketClientStruct struct { Internal struct { IsUnsealed func(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types.PaddedByteIndex, size abi.PaddedPieceSize) (bool, error) `perm:"admin"` ListMarketConnectionsState func(ctx context.Context) ([]gtypes.MarketConnectionState, error) `perm:"admin"` - ListenMarketEvent func(ctx context.Context, policy *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` - ResponseMarketEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` SectorsUnsealPiece func(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types.PaddedByteIndex, size abi.PaddedPieceSize, dest string) error `perm:"admin"` } } -func (s *IMarketEventStruct) IsUnsealed(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 storage.SectorRef, p4 types.PaddedByteIndex, p5 abi.PaddedPieceSize) (bool, error) { +func (s *IMarketClientStruct) IsUnsealed(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 storage.SectorRef, p4 types.PaddedByteIndex, p5 abi.PaddedPieceSize) (bool, error) { return s.Internal.IsUnsealed(p0, p1, p2, p3, p4, p5) } -func (s *IMarketEventStruct) ListMarketConnectionsState(p0 context.Context) ([]gtypes.MarketConnectionState, error) { +func (s *IMarketClientStruct) ListMarketConnectionsState(p0 context.Context) ([]gtypes.MarketConnectionState, error) { return s.Internal.ListMarketConnectionsState(p0) } -func (s *IMarketEventStruct) ListenMarketEvent(p0 context.Context, p1 *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { +func (s *IMarketClientStruct) SectorsUnsealPiece(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 storage.SectorRef, p4 types.PaddedByteIndex, p5 abi.PaddedPieceSize, p6 string) error { + return s.Internal.SectorsUnsealPiece(p0, p1, p2, p3, p4, p5, p6) +} + +type IMarketServiceProviderStruct struct { + Internal struct { + ListenMarketEvent func(ctx context.Context, policy *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` + ResponseMarketEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` + } +} + +func (s *IMarketServiceProviderStruct) ListenMarketEvent(p0 context.Context, p1 *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { return s.Internal.ListenMarketEvent(p0, p1) } -func (s *IMarketEventStruct) ResponseMarketEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { +func (s *IMarketServiceProviderStruct) ResponseMarketEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { return s.Internal.ResponseMarketEvent(p0, p1) } -func (s *IMarketEventStruct) SectorsUnsealPiece(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 storage.SectorRef, p4 types.PaddedByteIndex, p5 abi.PaddedPieceSize, p6 string) error { - return s.Internal.SectorsUnsealPiece(p0, p1, p2, p3, p4, p5, p6) + +type IMarketEventStruct struct { + IMarketClientStruct + IMarketServiceProviderStruct } type IGatewayStruct struct { diff --git a/venus-shared/api/gateway/v0/wallet_event.go b/venus-shared/api/gateway/v0/wallet_event.go index 90279d5319..de32a7a696 100644 --- a/venus-shared/api/gateway/v0/wallet_event.go +++ b/venus-shared/api/gateway/v0/wallet_event.go @@ -11,11 +11,19 @@ import ( ) type IWalletEvent interface { + IWalletClient + IWalletServiceProvider +} + +type IWalletClient interface { ListWalletInfo(ctx context.Context) ([]*gtypes.WalletDetail, error) //perm:admin ListWalletInfoByWallet(ctx context.Context, wallet string) (*gtypes.WalletDetail, error) //perm:admin WalletHas(ctx context.Context, supportAccount string, addr address.Address) (bool, error) //perm:admin WalletSign(ctx context.Context, account string, addr address.Address, toSign []byte, meta types.MsgMeta) (*crypto.Signature, error) //perm:admin +} + +type IWalletServiceProvider interface { ResponseWalletEvent(ctx context.Context, resp *gtypes.ResponseEvent) error //perm:read ListenWalletEvent(ctx context.Context, policy *gtypes.WalletRegisterPolicy) (<-chan *gtypes.RequestEvent, error) //perm:read SupportNewAccount(ctx context.Context, channelID types.UUID, account string) error //perm:read diff --git a/venus-shared/api/gateway/v1/market_event.go b/venus-shared/api/gateway/v1/market_event.go index 42db2d2872..dfb4c2f1ec 100644 --- a/venus-shared/api/gateway/v1/market_event.go +++ b/venus-shared/api/gateway/v1/market_event.go @@ -12,10 +12,17 @@ import ( ) type IMarketEvent interface { + IMarketClient + IMarketServiceProvider +} + +type IMarketClient interface { ListMarketConnectionsState(ctx context.Context) ([]gtypes.MarketConnectionState, error) //perm:admin IsUnsealed(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types.PaddedByteIndex, size abi.PaddedPieceSize) (bool, error) //perm:admin SectorsUnsealPiece(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types.PaddedByteIndex, size abi.PaddedPieceSize, dest string) error //perm:admin +} +type IMarketServiceProvider interface { ResponseMarketEvent(ctx context.Context, resp *gtypes.ResponseEvent) error //perm:read ListenMarketEvent(ctx context.Context, policy *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) //perm:read } diff --git a/venus-shared/api/gateway/v1/method.md b/venus-shared/api/gateway/v1/method.md index b05476055a..abf125f4a5 100644 --- a/venus-shared/api/gateway/v1/method.md +++ b/venus-shared/api/gateway/v1/method.md @@ -1,29 +1,32 @@ # Groups -* [MarketEvent](#MarketEvent) +* [MarketClient](#MarketClient) * [IsUnsealed](#IsUnsealed) * [ListMarketConnectionsState](#ListMarketConnectionsState) + * [SectorsUnsealPiece](#SectorsUnsealPiece) +* [MarketServiceProvider](#MarketServiceProvider) * [ListenMarketEvent](#ListenMarketEvent) * [ResponseMarketEvent](#ResponseMarketEvent) - * [SectorsUnsealPiece](#SectorsUnsealPiece) -* [ProofEvent](#ProofEvent) +* [ProofClient](#ProofClient) * [ComputeProof](#ComputeProof) * [ListConnectedMiners](#ListConnectedMiners) * [ListMinerConnection](#ListMinerConnection) +* [ProofServiceProvider](#ProofServiceProvider) * [ListenProofEvent](#ListenProofEvent) * [ResponseProofEvent](#ResponseProofEvent) -* [WalletEvent](#WalletEvent) - * [AddNewAddress](#AddNewAddress) +* [WalletClient](#WalletClient) * [ListWalletInfo](#ListWalletInfo) * [ListWalletInfoByWallet](#ListWalletInfoByWallet) + * [WalletHas](#WalletHas) + * [WalletSign](#WalletSign) +* [WalletServiceProvider](#WalletServiceProvider) + * [AddNewAddress](#AddNewAddress) * [ListenWalletEvent](#ListenWalletEvent) * [RemoveAddress](#RemoveAddress) * [ResponseWalletEvent](#ResponseWalletEvent) * [SupportNewAccount](#SupportNewAccount) - * [WalletHas](#WalletHas) - * [WalletSign](#WalletSign) -## MarketEvent +## MarketClient ### IsUnsealed @@ -81,6 +84,35 @@ Response: ] ``` +### SectorsUnsealPiece + + +Perms: admin + +Inputs: +```json +[ + "f01234", + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "ID": { + "Miner": 1000, + "Number": 9 + }, + "ProofType": 8 + }, + 10, + 1032, + "string value" +] +``` + +Response: `{}` + +## MarketServiceProvider + ### ListenMarketEvent @@ -122,34 +154,7 @@ Inputs: Response: `{}` -### SectorsUnsealPiece - - -Perms: admin - -Inputs: -```json -[ - "f01234", - { - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" - }, - { - "ID": { - "Miner": 1000, - "Number": 9 - }, - "ProofType": 8 - }, - 10, - 1032, - "string value" -] -``` - -Response: `{}` - -## ProofEvent +## ProofClient ### ComputeProof @@ -230,6 +235,8 @@ Response: } ``` +## ProofServiceProvider + ### ListenProofEvent @@ -271,24 +278,7 @@ Inputs: Response: `{}` -## WalletEvent - -### AddNewAddress - - -Perms: read - -Inputs: -```json -[ - "e26f1e5c-47f7-4561-a11d-18fab6e748af", - [ - "f01234" - ] -] -``` - -Response: `{}` +## WalletClient ### ListWalletInfo @@ -353,19 +343,35 @@ Response: } ``` -### ListenWalletEvent +### WalletHas -Perms: read +Perms: admin Inputs: ```json [ + "string value", + "f01234" +] +``` + +Response: `true` + +### WalletSign + + +Perms: admin + +Inputs: +```json +[ + "string value", + "f01234", + "Ynl0ZSBhcnJheQ==", { - "SupportAccounts": [ - "string value" - ], - "SignBytes": "Ynl0ZSBhcnJheQ==" + "Type": "message", + "Extra": "Ynl0ZSBhcnJheQ==" } ] ``` @@ -373,13 +379,14 @@ Inputs: Response: ```json { - "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", - "Method": "string value", - "Payload": "Ynl0ZSBhcnJheQ==" + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" } ``` -### RemoveAddress +## WalletServiceProvider + +### AddNewAddress Perms: read @@ -396,7 +403,7 @@ Inputs: Response: `{}` -### ResponseWalletEvent +### ListenWalletEvent Perms: read @@ -405,16 +412,24 @@ Inputs: ```json [ { - "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", - "Payload": "Ynl0ZSBhcnJheQ==", - "Error": "string value" + "SupportAccounts": [ + "string value" + ], + "SignBytes": "Ynl0ZSBhcnJheQ==" } ] ``` -Response: `{}` +Response: +```json +{ + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Method": "string value", + "Payload": "Ynl0ZSBhcnJheQ==" +} +``` -### SupportNewAccount +### RemoveAddress Perms: read @@ -423,50 +438,44 @@ Inputs: ```json [ "e26f1e5c-47f7-4561-a11d-18fab6e748af", - "string value" + [ + "f01234" + ] ] ``` Response: `{}` -### WalletHas +### ResponseWalletEvent -Perms: admin +Perms: read Inputs: ```json [ - "string value", - "f01234" + { + "Id": "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "Payload": "Ynl0ZSBhcnJheQ==", + "Error": "string value" + } ] ``` -Response: `true` +Response: `{}` -### WalletSign +### SupportNewAccount -Perms: admin +Perms: read Inputs: ```json [ - "string value", - "f01234", - "Ynl0ZSBhcnJheQ==", - { - "Type": "message", - "Extra": "Ynl0ZSBhcnJheQ==" - } + "e26f1e5c-47f7-4561-a11d-18fab6e748af", + "string value" ] ``` -Response: -```json -{ - "Type": 2, - "Data": "Ynl0ZSBhcnJheQ==" -} -``` +Response: `{}` diff --git a/venus-shared/api/gateway/v1/proof_event.go b/venus-shared/api/gateway/v1/proof_event.go index 8c823f1111..012276e5d1 100644 --- a/venus-shared/api/gateway/v1/proof_event.go +++ b/venus-shared/api/gateway/v1/proof_event.go @@ -12,10 +12,17 @@ import ( ) type IProofEvent interface { + IProofClient + IProofServiceProvider +} + +type IProofClient interface { ListConnectedMiners(ctx context.Context) ([]address.Address, error) //perm:admin ListMinerConnection(ctx context.Context, addr address.Address) (*gtypes.MinerState, error) //perm:admin ComputeProof(ctx context.Context, miner address.Address, sectorInfos []builtin.ExtendedSectorInfo, rand abi.PoStRandomness, height abi.ChainEpoch, nwVersion network.Version) ([]builtin.PoStProof, error) //perm:admin +} +type IProofServiceProvider interface { ResponseProofEvent(ctx context.Context, resp *gtypes.ResponseEvent) error //perm:read ListenProofEvent(ctx context.Context, policy *gtypes.ProofRegisterPolicy) (<-chan *gtypes.RequestEvent, error) //perm:read } diff --git a/venus-shared/api/gateway/v1/proxy_gen.go b/venus-shared/api/gateway/v1/proxy_gen.go index 5445131e12..bcd76395f6 100644 --- a/venus-shared/api/gateway/v1/proxy_gen.go +++ b/venus-shared/api/gateway/v1/proxy_gen.go @@ -16,98 +16,131 @@ import ( gtypes "github.com/filecoin-project/venus/venus-shared/types/gateway" ) -type IProofEventStruct struct { +type IProofClientStruct struct { Internal struct { ComputeProof func(ctx context.Context, miner address.Address, sectorInfos []builtin.ExtendedSectorInfo, rand abi.PoStRandomness, height abi.ChainEpoch, nwVersion network.Version) ([]builtin.PoStProof, error) `perm:"admin"` ListConnectedMiners func(ctx context.Context) ([]address.Address, error) `perm:"admin"` ListMinerConnection func(ctx context.Context, addr address.Address) (*gtypes.MinerState, error) `perm:"admin"` - ListenProofEvent func(ctx context.Context, policy *gtypes.ProofRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` - ResponseProofEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` } } -func (s *IProofEventStruct) ComputeProof(p0 context.Context, p1 address.Address, p2 []builtin.ExtendedSectorInfo, p3 abi.PoStRandomness, p4 abi.ChainEpoch, p5 network.Version) ([]builtin.PoStProof, error) { +func (s *IProofClientStruct) ComputeProof(p0 context.Context, p1 address.Address, p2 []builtin.ExtendedSectorInfo, p3 abi.PoStRandomness, p4 abi.ChainEpoch, p5 network.Version) ([]builtin.PoStProof, error) { return s.Internal.ComputeProof(p0, p1, p2, p3, p4, p5) } -func (s *IProofEventStruct) ListConnectedMiners(p0 context.Context) ([]address.Address, error) { +func (s *IProofClientStruct) ListConnectedMiners(p0 context.Context) ([]address.Address, error) { return s.Internal.ListConnectedMiners(p0) } -func (s *IProofEventStruct) ListMinerConnection(p0 context.Context, p1 address.Address) (*gtypes.MinerState, error) { +func (s *IProofClientStruct) ListMinerConnection(p0 context.Context, p1 address.Address) (*gtypes.MinerState, error) { return s.Internal.ListMinerConnection(p0, p1) } -func (s *IProofEventStruct) ListenProofEvent(p0 context.Context, p1 *gtypes.ProofRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { + +type IProofServiceProviderStruct struct { + Internal struct { + ListenProofEvent func(ctx context.Context, policy *gtypes.ProofRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` + ResponseProofEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` + } +} + +func (s *IProofServiceProviderStruct) ListenProofEvent(p0 context.Context, p1 *gtypes.ProofRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { return s.Internal.ListenProofEvent(p0, p1) } -func (s *IProofEventStruct) ResponseProofEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { +func (s *IProofServiceProviderStruct) ResponseProofEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { return s.Internal.ResponseProofEvent(p0, p1) } -type IWalletEventStruct struct { +type IProofEventStruct struct { + IProofClientStruct + IProofServiceProviderStruct +} + +type IWalletClientStruct struct { Internal struct { - AddNewAddress func(ctx context.Context, channelID types.UUID, newAddrs []address.Address) error `perm:"read"` ListWalletInfo func(ctx context.Context) ([]*gtypes.WalletDetail, error) `perm:"admin"` ListWalletInfoByWallet func(ctx context.Context, wallet string) (*gtypes.WalletDetail, error) `perm:"admin"` - ListenWalletEvent func(ctx context.Context, policy *gtypes.WalletRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` - RemoveAddress func(ctx context.Context, channelID types.UUID, newAddrs []address.Address) error `perm:"read"` - ResponseWalletEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` - SupportNewAccount func(ctx context.Context, channelID types.UUID, account string) error `perm:"read"` WalletHas func(ctx context.Context, supportAccount string, addr address.Address) (bool, error) `perm:"admin"` WalletSign func(ctx context.Context, account string, addr address.Address, toSign []byte, meta types.MsgMeta) (*crypto.Signature, error) `perm:"admin"` } } -func (s *IWalletEventStruct) AddNewAddress(p0 context.Context, p1 types.UUID, p2 []address.Address) error { - return s.Internal.AddNewAddress(p0, p1, p2) -} -func (s *IWalletEventStruct) ListWalletInfo(p0 context.Context) ([]*gtypes.WalletDetail, error) { +func (s *IWalletClientStruct) ListWalletInfo(p0 context.Context) ([]*gtypes.WalletDetail, error) { return s.Internal.ListWalletInfo(p0) } -func (s *IWalletEventStruct) ListWalletInfoByWallet(p0 context.Context, p1 string) (*gtypes.WalletDetail, error) { +func (s *IWalletClientStruct) ListWalletInfoByWallet(p0 context.Context, p1 string) (*gtypes.WalletDetail, error) { return s.Internal.ListWalletInfoByWallet(p0, p1) } -func (s *IWalletEventStruct) ListenWalletEvent(p0 context.Context, p1 *gtypes.WalletRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { +func (s *IWalletClientStruct) WalletHas(p0 context.Context, p1 string, p2 address.Address) (bool, error) { + return s.Internal.WalletHas(p0, p1, p2) +} +func (s *IWalletClientStruct) WalletSign(p0 context.Context, p1 string, p2 address.Address, p3 []byte, p4 types.MsgMeta) (*crypto.Signature, error) { + return s.Internal.WalletSign(p0, p1, p2, p3, p4) +} + +type IWalletServiceProviderStruct struct { + Internal struct { + AddNewAddress func(ctx context.Context, channelID types.UUID, newAddrs []address.Address) error `perm:"read"` + ListenWalletEvent func(ctx context.Context, policy *gtypes.WalletRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` + RemoveAddress func(ctx context.Context, channelID types.UUID, newAddrs []address.Address) error `perm:"read"` + ResponseWalletEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` + SupportNewAccount func(ctx context.Context, channelID types.UUID, account string) error `perm:"read"` + } +} + +func (s *IWalletServiceProviderStruct) AddNewAddress(p0 context.Context, p1 types.UUID, p2 []address.Address) error { + return s.Internal.AddNewAddress(p0, p1, p2) +} +func (s *IWalletServiceProviderStruct) ListenWalletEvent(p0 context.Context, p1 *gtypes.WalletRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { return s.Internal.ListenWalletEvent(p0, p1) } -func (s *IWalletEventStruct) RemoveAddress(p0 context.Context, p1 types.UUID, p2 []address.Address) error { +func (s *IWalletServiceProviderStruct) RemoveAddress(p0 context.Context, p1 types.UUID, p2 []address.Address) error { return s.Internal.RemoveAddress(p0, p1, p2) } -func (s *IWalletEventStruct) ResponseWalletEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { +func (s *IWalletServiceProviderStruct) ResponseWalletEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { return s.Internal.ResponseWalletEvent(p0, p1) } -func (s *IWalletEventStruct) SupportNewAccount(p0 context.Context, p1 types.UUID, p2 string) error { +func (s *IWalletServiceProviderStruct) SupportNewAccount(p0 context.Context, p1 types.UUID, p2 string) error { return s.Internal.SupportNewAccount(p0, p1, p2) } -func (s *IWalletEventStruct) WalletHas(p0 context.Context, p1 string, p2 address.Address) (bool, error) { - return s.Internal.WalletHas(p0, p1, p2) -} -func (s *IWalletEventStruct) WalletSign(p0 context.Context, p1 string, p2 address.Address, p3 []byte, p4 types.MsgMeta) (*crypto.Signature, error) { - return s.Internal.WalletSign(p0, p1, p2, p3, p4) + +type IWalletEventStruct struct { + IWalletClientStruct + IWalletServiceProviderStruct } -type IMarketEventStruct struct { +type IMarketClientStruct struct { Internal struct { IsUnsealed func(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types.PaddedByteIndex, size abi.PaddedPieceSize) (bool, error) `perm:"admin"` ListMarketConnectionsState func(ctx context.Context) ([]gtypes.MarketConnectionState, error) `perm:"admin"` - ListenMarketEvent func(ctx context.Context, policy *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` - ResponseMarketEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` SectorsUnsealPiece func(ctx context.Context, miner address.Address, pieceCid cid.Cid, sector storage.SectorRef, offset types.PaddedByteIndex, size abi.PaddedPieceSize, dest string) error `perm:"admin"` } } -func (s *IMarketEventStruct) IsUnsealed(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 storage.SectorRef, p4 types.PaddedByteIndex, p5 abi.PaddedPieceSize) (bool, error) { +func (s *IMarketClientStruct) IsUnsealed(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 storage.SectorRef, p4 types.PaddedByteIndex, p5 abi.PaddedPieceSize) (bool, error) { return s.Internal.IsUnsealed(p0, p1, p2, p3, p4, p5) } -func (s *IMarketEventStruct) ListMarketConnectionsState(p0 context.Context) ([]gtypes.MarketConnectionState, error) { +func (s *IMarketClientStruct) ListMarketConnectionsState(p0 context.Context) ([]gtypes.MarketConnectionState, error) { return s.Internal.ListMarketConnectionsState(p0) } -func (s *IMarketEventStruct) ListenMarketEvent(p0 context.Context, p1 *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { +func (s *IMarketClientStruct) SectorsUnsealPiece(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 storage.SectorRef, p4 types.PaddedByteIndex, p5 abi.PaddedPieceSize, p6 string) error { + return s.Internal.SectorsUnsealPiece(p0, p1, p2, p3, p4, p5, p6) +} + +type IMarketServiceProviderStruct struct { + Internal struct { + ListenMarketEvent func(ctx context.Context, policy *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) `perm:"read"` + ResponseMarketEvent func(ctx context.Context, resp *gtypes.ResponseEvent) error `perm:"read"` + } +} + +func (s *IMarketServiceProviderStruct) ListenMarketEvent(p0 context.Context, p1 *gtypes.MarketRegisterPolicy) (<-chan *gtypes.RequestEvent, error) { return s.Internal.ListenMarketEvent(p0, p1) } -func (s *IMarketEventStruct) ResponseMarketEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { +func (s *IMarketServiceProviderStruct) ResponseMarketEvent(p0 context.Context, p1 *gtypes.ResponseEvent) error { return s.Internal.ResponseMarketEvent(p0, p1) } -func (s *IMarketEventStruct) SectorsUnsealPiece(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 storage.SectorRef, p4 types.PaddedByteIndex, p5 abi.PaddedPieceSize, p6 string) error { - return s.Internal.SectorsUnsealPiece(p0, p1, p2, p3, p4, p5, p6) + +type IMarketEventStruct struct { + IMarketClientStruct + IMarketServiceProviderStruct } type IGatewayStruct struct { diff --git a/venus-shared/api/gateway/v1/wallet_event.go b/venus-shared/api/gateway/v1/wallet_event.go index 90279d5319..602ff5b2e0 100644 --- a/venus-shared/api/gateway/v1/wallet_event.go +++ b/venus-shared/api/gateway/v1/wallet_event.go @@ -11,11 +11,18 @@ import ( ) type IWalletEvent interface { + IWalletClient + IWalletServiceProvider +} + +type IWalletClient interface { ListWalletInfo(ctx context.Context) ([]*gtypes.WalletDetail, error) //perm:admin ListWalletInfoByWallet(ctx context.Context, wallet string) (*gtypes.WalletDetail, error) //perm:admin WalletHas(ctx context.Context, supportAccount string, addr address.Address) (bool, error) //perm:admin WalletSign(ctx context.Context, account string, addr address.Address, toSign []byte, meta types.MsgMeta) (*crypto.Signature, error) //perm:admin +} +type IWalletServiceProvider interface { ResponseWalletEvent(ctx context.Context, resp *gtypes.ResponseEvent) error //perm:read ListenWalletEvent(ctx context.Context, policy *gtypes.WalletRegisterPolicy) (<-chan *gtypes.RequestEvent, error) //perm:read SupportNewAccount(ctx context.Context, channelID types.UUID, account string) error //perm:read From d4d38654e179f02b7bdd2291d06c8df869f0d390 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Mon, 21 Feb 2022 17:41:50 +0800 Subject: [PATCH 162/167] remove unused api version info (#4795) --- venus-shared/api/version.go | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/venus-shared/api/version.go b/venus-shared/api/version.go index ff1f525d0a..63857528a5 100644 --- a/venus-shared/api/version.go +++ b/venus-shared/api/version.go @@ -2,8 +2,6 @@ package api import ( "fmt" - - "golang.org/x/xerrors" ) type Version uint32 @@ -27,38 +25,10 @@ func (ve Version) EqMajorMinor(v2 Version) bool { return ve&minorMask == v2&minorMask } -type NodeType int - -const ( - NodeUnknown NodeType = iota - - NodeFull - NodeMiner - NodeWorker -) - -var RunningNodeType NodeType - -func VersionForType(nodeType NodeType) (Version, error) { - switch nodeType { - case NodeFull: - return FullAPIVersion1, nil - case NodeMiner: - return MinerAPIVersion0, nil - case NodeWorker: - return WorkerAPIVersion0, nil - default: - return Version(0), xerrors.Errorf("unknown node type %d", nodeType) - } -} - // semver versions of the rpc api exposed var ( FullAPIVersion0 = NewVer(1, 5, 0) FullAPIVersion1 = NewVer(2, 2, 0) - - MinerAPIVersion0 = NewVer(1, 2, 0) - WorkerAPIVersion0 = NewVer(1, 5, 0) ) //nolint:varcheck,deadcode From bd9851d4e2902717239d32e9f765242e14640438 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Mon, 21 Feb 2022 20:09:14 +0800 Subject: [PATCH 163/167] update version to v1.2.0 (#4796) --- pkg/constants/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/constants/version.go b/pkg/constants/version.go index eb03812925..d6398fb735 100644 --- a/pkg/constants/version.go +++ b/pkg/constants/version.go @@ -7,7 +7,7 @@ import ( ) // BuildVersion is the local build version, set by build system -const BuildVersion = "1.2.0-rc6" +const BuildVersion = "1.2.0" // software version func UserVersion() string { From cd3547081793ae87207e7907eac3994f89026959 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Wed, 23 Feb 2022 18:30:05 +0800 Subject: [PATCH 164/167] update git workflow (#4799) --- .github/workflows/tag-workflow.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/.github/workflows/tag-workflow.yml b/.github/workflows/tag-workflow.yml index 21fbc12284..5b3021d940 100644 --- a/.github/workflows/tag-workflow.yml +++ b/.github/workflows/tag-workflow.yml @@ -26,11 +26,11 @@ jobs: run: | export commit=$(git rev-parse HEAD) export short=$(git rev-parse --short HEAD) - export github_tag=${GITHUB_REF##*/} + export github_tag=${{github.ref_name}} + export tag=$github_tag + export branch=$github_tag export git_message=$(git rev-list --format=%s --max-count=1 HEAD | tail +2) export repo_name=${GITHUB_REPOSITORY##*/} - export branch=$(git symbolic-ref --short -q HEAD) - export tag=$(git describe --tags $(git rev-list --tags --max-count=1)) export artifact_name=${repo_name}_$(git rev-parse --short HEAD).tar.gz export pub_method=pushTest export job_url=$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID @@ -40,12 +40,7 @@ jobs: if [[ "${{github.ref_type}}" == "tag" ]] && [[ "${{github.event_name}}" == "create" ]] && [[ "$github_tag" =~ $rx ]]; then export pub_method=pushRelease fi - if [[ "$branch" == "" ]]; then - export branch=$github_tag - fi - if [[ "$tag" == "" ]]; then - export tag=$github_tag - fi + if [[ "${{secrets.OSS_KEY_ID}}" != "" && \ "${{secrets.OSS_KEY_SECRET}}" != "" && \ "${{secrets.OSS_ENDPOINT}}" != "" && \ @@ -117,6 +112,7 @@ jobs: id: release uses: ncipollo/release-action@v1 if: ${{ steps.vars.outputs.pub_method=='pushRelease' }} + continue-on-error: true with: artifacts: ${{steps.vars.outputs.artifact_name}} tag: ${{ steps.vars.outputs.github_tag }} @@ -151,12 +147,12 @@ jobs: echo '::set-output name=oss_signed_url::$(signed_url)' - name: upload artifacts - if: ${{ steps.vars.outputs.pub_method == 'pushTest' && steps.uploadftp.outcome != 'success' && steps.cposs.outcome != 'success' }} + if: ${{ steps.vars.outputs.pub_method == 'pushRelease' }} continue-on-error: true uses: actions/upload-artifact@v2 with: name: ${{steps.vars.outputs.artifact_name}} - path: ./${{steps.vars.outputs.artifact_name}} + path: ./release if-no-files-found: error - name: push god-eye From c7983507adfcf793abb755c66b1fae421a2e09d2 Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Thu, 24 Feb 2022 22:42:33 +0800 Subject: [PATCH 165/167] sync: fix inconsistent circ supply at the same epoch (#4802) * Fix inconsistent circ supply at the same epoch --- pkg/vm/vmcontext/vmcontext.go | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/pkg/vm/vmcontext/vmcontext.go b/pkg/vm/vmcontext/vmcontext.go index 1d542506ee..d2e59cae07 100644 --- a/pkg/vm/vmcontext/vmcontext.go +++ b/pkg/vm/vmcontext/vmcontext.go @@ -68,9 +68,7 @@ func (vm *VM) ApplyImplicitMessage(msg types.ChainMsg) (*Ret, error) { Method: unsignedMsg.Method, Params: unsignedMsg.Params, } - if err := vm.SetCurrentEpoch(vm.vmOption.Epoch); err != nil { - return nil, xerrors.Errorf("error advancing vm an epoch: %w", err) - } + return vm.applyImplicitMessage(imsg) } @@ -125,8 +123,8 @@ func NewVM(ctx context.Context, actorImpls ActorImplLookup, vmOption VmOption) ( State: st, vmOption: vmOption, baseCircSupply: baseCirc, - // loaded during execution - // currentEpoch: .., + pricelist: vmOption.GasPriceSchedule.PricelistByEpoch(vmOption.Epoch), + currentEpoch: vmOption.Epoch, }, nil } @@ -155,9 +153,6 @@ func (vm *VM) ApplyGenesisMessage(from address.Address, to address.Address, meth Params: params, } - if err := vm.SetCurrentEpoch(0); err != nil { - return nil, xerrors.Errorf("error advancing vm an epoch: %w", err) - } ret, err := vm.applyImplicitMessage(imsg) if err != nil { return ret, err @@ -432,9 +427,6 @@ func (vm *VM) ApplyMessage(msg types.ChainMsg) (*Ret, error) { // applyMessage applies the message To the current stateView. func (vm *VM) applyMessage(msg *types.Message, onChainMsgSize int) (*Ret, error) { - if err := vm.SetCurrentEpoch(vm.vmOption.Epoch); err != nil { - return nil, xerrors.Errorf("error advancing vm an epoch: %w", err) - } // This Method does not actually execute the message itself, // but rather deals with the pre/post processing of a message. // (see: `invocationContext.invoke()` for the dispatch and execution) From c69627bedf857d602755036016a39294912c765c Mon Sep 17 00:00:00 2001 From: tom <69969590+simlecode@users.noreply.github.com> Date: Thu, 24 Feb 2022 22:45:05 +0800 Subject: [PATCH 166/167] bump version to v1.2.1 (#4803) --- pkg/constants/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/constants/version.go b/pkg/constants/version.go index d6398fb735..fd58c72fc9 100644 --- a/pkg/constants/version.go +++ b/pkg/constants/version.go @@ -7,7 +7,7 @@ import ( ) // BuildVersion is the local build version, set by build system -const BuildVersion = "1.2.0" +const BuildVersion = "1.2.1" // software version func UserVersion() string { From ed9c00da1a1039e3c981b52d49d6a4ea1da908cd Mon Sep 17 00:00:00 2001 From: Caesar Wang Date: Fri, 25 Feb 2022 14:39:19 +0800 Subject: [PATCH 167/167] Feat/dtynn/introduce dial args (#4804) * feat: introduce APIInfo from venus-common-utils/apiinfo * feat: update template for client gen, re-gen for all shared apis --- venus-devtool/api-gen/client.go | 20 +++ venus-shared/api/api_info.go | 140 +++++++++++++++++++ venus-shared/api/api_info_protocol.go | 50 +++++++ venus-shared/api/api_info_test.go | 90 ++++++++++++ venus-shared/api/chain/v0/client_gen.go | 20 +++ venus-shared/api/chain/v1/client_gen.go | 20 +++ venus-shared/api/gateway/v0/client_gen.go | 20 +++ venus-shared/api/gateway/v1/client_gen.go | 20 +++ venus-shared/api/market/client/client_gen.go | 20 +++ venus-shared/api/market/client_gen.go | 20 +++ venus-shared/api/messager/client_gen.go | 20 +++ venus-shared/api/request_header.go | 1 + venus-shared/api/wallet/client_gen.go | 20 +++ 13 files changed, 461 insertions(+) create mode 100644 venus-shared/api/api_info.go create mode 100644 venus-shared/api/api_info_protocol.go create mode 100644 venus-shared/api/api_info_test.go diff --git a/venus-devtool/api-gen/client.go b/venus-devtool/api-gen/client.go index a141d66528..f1d9b7d86a 100644 --- a/venus-devtool/api-gen/client.go +++ b/venus-devtool/api-gen/client.go @@ -59,6 +59,26 @@ func New{{ .APIName }}RPC(ctx context.Context, addr string, requestHeader http.H return &res, closer, err } + +// Dial{{ .APIName }}RPC is a more convinient way of building client, as it resolves any format (url, multiaddr) of addr string. +func Dial{{ .APIName }}RPC(ctx context.Context, addr string, token string, requestHeader http.Header, opts ...jsonrpc.Option) ({{ .APIName }}, jsonrpc.ClientCloser, error) { + ainfo := api.NewAPIInfo(addr, token) + endpoint, err := ainfo.DialArgs(api.VerString(MajorVersion)) + if err != nil { + return nil, nil, fmt.Errorf("get dial args: %w", err) + } + + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) + ainfo.SetAuthHeader(requestHeader) + + var res {{ .APIStruct }} + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) + + return &res, closer, err +} ` func genClientForAPI(t util.APIMeta) error { diff --git a/venus-shared/api/api_info.go b/venus-shared/api/api_info.go new file mode 100644 index 0000000000..eb50975231 --- /dev/null +++ b/venus-shared/api/api_info.go @@ -0,0 +1,140 @@ +package api + +import ( + "fmt" + "net/http" + "net/url" + "regexp" + "strings" + + multiaddr "github.com/multiformats/go-multiaddr" + manet "github.com/multiformats/go-multiaddr/net" +) + +var ( + infoWithToken = regexp.MustCompile("^[a-zA-Z0-9\\-_]+?\\.[a-zA-Z0-9\\-_]+?\\.([a-zA-Z0-9\\-_]+)?:.+$") // nolint:gosimple +) + +func VerString(ver uint32) string { + return fmt.Sprintf("v%d", ver) +} + +type APIInfo struct { // nolint + Addr string + Token []byte +} + +func NewAPIInfo(addr, token string) APIInfo { + return APIInfo{ + Addr: addr, + Token: []byte(token), + } +} + +func ParseApiInfo(s string) APIInfo { + var tok []byte + if infoWithToken.Match([]byte(s)) { + sp := strings.SplitN(s, ":", 2) + tok = []byte(sp[0]) + s = sp[1] + } + + return APIInfo{ + Addr: s, + Token: tok, + } +} + +//DialArgs parser libp2p address to http/ws protocol, the version argument can be override by address in version +func (a APIInfo) DialArgs(version string) (string, error) { + return DialArgs(a.Addr, version) +} + +func (a APIInfo) Host() (string, error) { + ma, err := multiaddr.NewMultiaddr(a.Addr) + if err == nil { + _, addr, err := manet.DialArgs(ma) + if err != nil { + return "", err + } + + return addr, nil + } + + spec, err := url.Parse(a.Addr) + if err != nil { + return "", err + } + return spec.Host, nil +} + +func (a APIInfo) AuthHeader() http.Header { + if len(a.Token) != 0 { + headers := http.Header{} + a.SetAuthHeader(headers) + return headers + } + + return nil +} + +func (a APIInfo) SetAuthHeader(h http.Header) { + if len(a.Token) != 0 { + h.Add(AuthorizationHeader, "Bearer "+string(a.Token)) + } +} + +func DialArgs(addr, version string) (string, error) { + ma, err := multiaddr.NewMultiaddr(addr) + if err == nil { + _, addr, err := manet.DialArgs(ma) + if err != nil { + return "", fmt.Errorf("parser libp2p url fail %w", err) + } + + //override version + val, err := ma.ValueForProtocol(ProtoVersion) + if err == nil { + version = val + } else if err != multiaddr.ErrProtocolNotFound { + return "", err + } + + _, err = ma.ValueForProtocol(multiaddr.P_WSS) + if err == nil { + return "wss://" + addr + "/rpc/" + version, nil + } else if err != multiaddr.ErrProtocolNotFound { + return "", err + } + + _, err = ma.ValueForProtocol(multiaddr.P_HTTPS) + if err == nil { + return "https://" + addr + "/rpc/" + version, nil + } else if err != multiaddr.ErrProtocolNotFound { + return "", err + } + + _, err = ma.ValueForProtocol(multiaddr.P_WS) + if err == nil { + return "ws://" + addr + "/rpc/" + version, nil + } else if err != multiaddr.ErrProtocolNotFound { + return "", err + } + + _, err = ma.ValueForProtocol(multiaddr.P_HTTP) + if err == nil { + return "http://" + addr + "/rpc/" + version, nil + } else if err != multiaddr.ErrProtocolNotFound { + return "", err + } + + return "ws://" + addr + "/rpc/" + version, nil + } + + _, err = url.Parse(addr) + if err != nil { + return "", fmt.Errorf("parser address fail %w", err) + } + + return strings.TrimRight(addr, "/") + "/rpc/" + version, nil +} diff --git a/venus-shared/api/api_info_protocol.go b/venus-shared/api/api_info_protocol.go new file mode 100644 index 0000000000..59c71e50f4 --- /dev/null +++ b/venus-shared/api/api_info_protocol.go @@ -0,0 +1,50 @@ +package api + +import ( + "fmt" + "strconv" + "strings" + + "github.com/multiformats/go-multiaddr" +) + +const ProtoVersion = multiaddr.P_WSS + 1 + +func init() { + err := multiaddr.AddProtocol(multiaddr.Protocol{ + Name: "version", + Code: ProtoVersion, + VCode: multiaddr.CodeToVarint(ProtoVersion), + Size: multiaddr.LengthPrefixedVarSize, + Transcoder: multiaddr.NewTranscoderFromFunctions(func(s string) ([]byte, error) { + if !strings.HasPrefix(s, "v") { + return nil, fmt.Errorf("version must start with version prefix v") + } + if len(s) < 2 { + return nil, fmt.Errorf("must give a specify version such as v0") + } + _, err := strconv.Atoi(s[1:]) + if err != nil { + return nil, fmt.Errorf("version part must be number") + } + return []byte(s), nil + }, func(bytes []byte) (string, error) { + vStr := string(bytes) + if !strings.HasPrefix(vStr, "v") { + return "", fmt.Errorf("version must start with version prefix v") + } + if len(vStr) < 2 { + return "", fmt.Errorf("must give a specify version such as v0") + } + _, err := strconv.Atoi(vStr[1:]) + if err != nil { + return "", fmt.Errorf("version part must be number") + } + return vStr, nil + }, nil), + }) + + if err != nil { + panic(fmt.Errorf("add `version` protocol into multiaddr: %w", err)) + } +} diff --git a/venus-shared/api/api_info_test.go b/venus-shared/api/api_info_test.go new file mode 100644 index 0000000000..42e6454405 --- /dev/null +++ b/venus-shared/api/api_info_test.go @@ -0,0 +1,90 @@ +package api + +import ( + "fmt" + "testing" +) + +func TestAPIInfo_DialArgs(t *testing.T) { + tests := []struct { + name string + addr string + want string + wantErr bool + }{ + { + "common", + "http://192.168.5.61:3453", + "http://192.168.5.61:3453/rpc/v0", + false, + }, + { + "wss", + "/ip4/192.168.5.61/tcp/3453/wss", + "wss://192.168.5.61:3453/rpc/v0", + false, + }, + { + "ws", + "/ip4/192.168.5.61/tcp/3453/ws", + "ws://192.168.5.61:3453/rpc/v0", + false, + }, + { + "http", + "/ip4/192.168.5.61/tcp/34531/http", + "http://192.168.5.61:34531/rpc/v0", + false, + }, + { + "https", + "/ip4/192.168.5.61/tcp/34531/https", + "https://192.168.5.61:34531/rpc/v0", + false, + }, + { + "default to ws ", + "/ip4/192.168.5.61/tcp/34532", + "ws://192.168.5.61:34532/rpc/v0", + false, + }, + + { + "version", + "/ip4/192.168.5.61/tcp/34532/version/v1", + "ws://192.168.5.61:34532/rpc/v1", + false, + }, + { + "version", + "/ip4/192.168.5.61/tcp/34532/version/v0", + "ws://192.168.5.61:34532/rpc/v0", + false, + }, + { + "error version", + "/ip4/192.168.5.61/tcp/34532/version/1v", + "/ip4/192.168.5.61/tcp/34532/version/1v/rpc/v0", + false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.name == "error version" { + fmt.Println() + } + a := APIInfo{ + Addr: tt.addr, + } + + got, err := a.DialArgs("v0") + if (err != nil) != tt.wantErr { + t.Errorf("DialArgs() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("DialArgs() got = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/venus-shared/api/chain/v0/client_gen.go b/venus-shared/api/chain/v0/client_gen.go index 33e8a5f59d..f70af75488 100644 --- a/venus-shared/api/chain/v0/client_gen.go +++ b/venus-shared/api/chain/v0/client_gen.go @@ -32,3 +32,23 @@ func NewFullNodeRPC(ctx context.Context, addr string, requestHeader http.Header, return &res, closer, err } + +// DialFullNodeRPC is a more convinient way of building client, as it resolves any format (url, multiaddr) of addr string. +func DialFullNodeRPC(ctx context.Context, addr string, token string, requestHeader http.Header, opts ...jsonrpc.Option) (FullNode, jsonrpc.ClientCloser, error) { + ainfo := api.NewAPIInfo(addr, token) + endpoint, err := ainfo.DialArgs(api.VerString(MajorVersion)) + if err != nil { + return nil, nil, fmt.Errorf("get dial args: %w", err) + } + + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) + ainfo.SetAuthHeader(requestHeader) + + var res FullNodeStruct + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) + + return &res, closer, err +} diff --git a/venus-shared/api/chain/v1/client_gen.go b/venus-shared/api/chain/v1/client_gen.go index 11ef9fa0a7..9bb8428fb6 100644 --- a/venus-shared/api/chain/v1/client_gen.go +++ b/venus-shared/api/chain/v1/client_gen.go @@ -32,3 +32,23 @@ func NewFullNodeRPC(ctx context.Context, addr string, requestHeader http.Header, return &res, closer, err } + +// DialFullNodeRPC is a more convinient way of building client, as it resolves any format (url, multiaddr) of addr string. +func DialFullNodeRPC(ctx context.Context, addr string, token string, requestHeader http.Header, opts ...jsonrpc.Option) (FullNode, jsonrpc.ClientCloser, error) { + ainfo := api.NewAPIInfo(addr, token) + endpoint, err := ainfo.DialArgs(api.VerString(MajorVersion)) + if err != nil { + return nil, nil, fmt.Errorf("get dial args: %w", err) + } + + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) + ainfo.SetAuthHeader(requestHeader) + + var res FullNodeStruct + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) + + return &res, closer, err +} diff --git a/venus-shared/api/gateway/v0/client_gen.go b/venus-shared/api/gateway/v0/client_gen.go index f12c406f31..19b8c80707 100644 --- a/venus-shared/api/gateway/v0/client_gen.go +++ b/venus-shared/api/gateway/v0/client_gen.go @@ -32,3 +32,23 @@ func NewIGatewayRPC(ctx context.Context, addr string, requestHeader http.Header, return &res, closer, err } + +// DialIGatewayRPC is a more convinient way of building client, as it resolves any format (url, multiaddr) of addr string. +func DialIGatewayRPC(ctx context.Context, addr string, token string, requestHeader http.Header, opts ...jsonrpc.Option) (IGateway, jsonrpc.ClientCloser, error) { + ainfo := api.NewAPIInfo(addr, token) + endpoint, err := ainfo.DialArgs(api.VerString(MajorVersion)) + if err != nil { + return nil, nil, fmt.Errorf("get dial args: %w", err) + } + + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) + ainfo.SetAuthHeader(requestHeader) + + var res IGatewayStruct + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) + + return &res, closer, err +} diff --git a/venus-shared/api/gateway/v1/client_gen.go b/venus-shared/api/gateway/v1/client_gen.go index 2d665133bb..4ea10610a6 100644 --- a/venus-shared/api/gateway/v1/client_gen.go +++ b/venus-shared/api/gateway/v1/client_gen.go @@ -32,3 +32,23 @@ func NewIGatewayRPC(ctx context.Context, addr string, requestHeader http.Header, return &res, closer, err } + +// DialIGatewayRPC is a more convinient way of building client, as it resolves any format (url, multiaddr) of addr string. +func DialIGatewayRPC(ctx context.Context, addr string, token string, requestHeader http.Header, opts ...jsonrpc.Option) (IGateway, jsonrpc.ClientCloser, error) { + ainfo := api.NewAPIInfo(addr, token) + endpoint, err := ainfo.DialArgs(api.VerString(MajorVersion)) + if err != nil { + return nil, nil, fmt.Errorf("get dial args: %w", err) + } + + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) + ainfo.SetAuthHeader(requestHeader) + + var res IGatewayStruct + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) + + return &res, closer, err +} diff --git a/venus-shared/api/market/client/client_gen.go b/venus-shared/api/market/client/client_gen.go index abf56fc3ea..58b8b06eb3 100644 --- a/venus-shared/api/market/client/client_gen.go +++ b/venus-shared/api/market/client/client_gen.go @@ -32,3 +32,23 @@ func NewIMarketClientRPC(ctx context.Context, addr string, requestHeader http.He return &res, closer, err } + +// DialIMarketClientRPC is a more convinient way of building client, as it resolves any format (url, multiaddr) of addr string. +func DialIMarketClientRPC(ctx context.Context, addr string, token string, requestHeader http.Header, opts ...jsonrpc.Option) (IMarketClient, jsonrpc.ClientCloser, error) { + ainfo := api.NewAPIInfo(addr, token) + endpoint, err := ainfo.DialArgs(api.VerString(MajorVersion)) + if err != nil { + return nil, nil, fmt.Errorf("get dial args: %w", err) + } + + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) + ainfo.SetAuthHeader(requestHeader) + + var res IMarketClientStruct + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) + + return &res, closer, err +} diff --git a/venus-shared/api/market/client_gen.go b/venus-shared/api/market/client_gen.go index ae5cd1d49a..b60e3bc954 100644 --- a/venus-shared/api/market/client_gen.go +++ b/venus-shared/api/market/client_gen.go @@ -32,3 +32,23 @@ func NewIMarketRPC(ctx context.Context, addr string, requestHeader http.Header, return &res, closer, err } + +// DialIMarketRPC is a more convinient way of building client, as it resolves any format (url, multiaddr) of addr string. +func DialIMarketRPC(ctx context.Context, addr string, token string, requestHeader http.Header, opts ...jsonrpc.Option) (IMarket, jsonrpc.ClientCloser, error) { + ainfo := api.NewAPIInfo(addr, token) + endpoint, err := ainfo.DialArgs(api.VerString(MajorVersion)) + if err != nil { + return nil, nil, fmt.Errorf("get dial args: %w", err) + } + + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) + ainfo.SetAuthHeader(requestHeader) + + var res IMarketStruct + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) + + return &res, closer, err +} diff --git a/venus-shared/api/messager/client_gen.go b/venus-shared/api/messager/client_gen.go index 75aeee9f78..f569dcd201 100644 --- a/venus-shared/api/messager/client_gen.go +++ b/venus-shared/api/messager/client_gen.go @@ -32,3 +32,23 @@ func NewIMessagerRPC(ctx context.Context, addr string, requestHeader http.Header return &res, closer, err } + +// DialIMessagerRPC is a more convinient way of building client, as it resolves any format (url, multiaddr) of addr string. +func DialIMessagerRPC(ctx context.Context, addr string, token string, requestHeader http.Header, opts ...jsonrpc.Option) (IMessager, jsonrpc.ClientCloser, error) { + ainfo := api.NewAPIInfo(addr, token) + endpoint, err := ainfo.DialArgs(api.VerString(MajorVersion)) + if err != nil { + return nil, nil, fmt.Errorf("get dial args: %w", err) + } + + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) + ainfo.SetAuthHeader(requestHeader) + + var res IMessagerStruct + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) + + return &res, closer, err +} diff --git a/venus-shared/api/request_header.go b/venus-shared/api/request_header.go index 8906a56788..992639bc4f 100644 --- a/venus-shared/api/request_header.go +++ b/venus-shared/api/request_header.go @@ -1,3 +1,4 @@ package api const VenusAPINamespaceHeader = "X-VENUS-API-NAMESPACE" +const AuthorizationHeader = "Authorization" diff --git a/venus-shared/api/wallet/client_gen.go b/venus-shared/api/wallet/client_gen.go index 29f1c49810..654b49e79f 100644 --- a/venus-shared/api/wallet/client_gen.go +++ b/venus-shared/api/wallet/client_gen.go @@ -32,3 +32,23 @@ func NewIFullAPIRPC(ctx context.Context, addr string, requestHeader http.Header, return &res, closer, err } + +// DialIFullAPIRPC is a more convinient way of building client, as it resolves any format (url, multiaddr) of addr string. +func DialIFullAPIRPC(ctx context.Context, addr string, token string, requestHeader http.Header, opts ...jsonrpc.Option) (IFullAPI, jsonrpc.ClientCloser, error) { + ainfo := api.NewAPIInfo(addr, token) + endpoint, err := ainfo.DialArgs(api.VerString(MajorVersion)) + if err != nil { + return nil, nil, fmt.Errorf("get dial args: %w", err) + } + + if requestHeader == nil { + requestHeader = http.Header{} + } + requestHeader.Set(api.VenusAPINamespaceHeader, APINamespace) + ainfo.SetAuthHeader(requestHeader) + + var res IFullAPIStruct + closer, err := jsonrpc.NewMergeClient(ctx, endpoint, MethodNamespace, api.GetInternalStructs(&res), requestHeader, opts...) + + return &res, closer, err +}